ZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThiNzNmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0XzEuMC4wLioKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMjExYWYuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcyMDdiZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIFJ1bnRpbWUKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjVlNTI4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmFzc2VtYmx5LmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMi4zLjEucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YTJiZjUuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnBhdGNoPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4MWZiMi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9idWlsZG5vdGVzX29yZy5lY2xpcHNlLmpwdC5wYXRjaC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTE1ZjQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2J1aWxkbm90ZXNfb3JnLmVjbGlwc2UuanB0LnBhdGNoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IWRvY3R5cGUgaHRtbCBwdWJsaWMgIi0vL3czYy8vZHRkIGh0bWwgNC4wIHRyYW5zaXRpb25hbC8vZW4iPgotPGh0bWw+Ci0KLTxoZWFkPgotICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci0gICA8bWV0YSBuYW1lPSJCdWlsZCIgY29udGVudD0iQnVpbGQiPgotICAgPHRpdGxlPkphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgMS4wLjIgUGF0Y2hlczwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08aDE+SlRQIDIuMC4yIFBhdGNoZXM8L2gxPgotCi08aDI+RmVhdHVyZSBQYXRjaGVkOiBvcmcuZWNsaXBzZS5qcHQucGF0Y2g8L2gyPgotPGgzPlBsdWdpbihzKSByZXBsYWNlZDo8L2gzPgotPHVsPjxsaT5vcmcuZWNsaXBzZS5qcHQuZ2VuPC9saT48L3VsPgotPHA+QnVnIDxhIGhyZWY9J2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy8yMjAyOTcnPjIyMDI5NzwvYT4uIEVudGl0eSBnZW5lcmF0aW9uIGNyZWF0ZXMgRW1iZWRkYWJsZXMgd2l0aCBjb21waWxlIGVycm9ycyBpbiBzb21lIGNhc2VzLjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQucGF0Y2gvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ1N2VhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUphdmEgUGVyc2lzdGVuY2UgVG9vbHMgKEpUUCkgUGF0Y2hlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVwKLVBhdGNoKHMpIGZvciBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSBUb29scy4gXG5cCi1TZWUgYnVnIDIyMDI5NyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3MvMjIwMjk3KSBFbnRpdHkgZ2VuZXJhdGlvbiBjcmVhdGVzIEVtYmVkZGFibGVzIHdpdGggY29tcGlsZSBlcnJvcnMgaW4gc29tZSBjYXNlcyBcblwKLQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYtMDggT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotSnVuZSAwNiwgMjAwN1xuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLSAgICAtIENvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgKENEREwpIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5zdW4uY29tL2NkZGwvY2RkbC5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmFlOTJiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5wYXRjaCIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMi5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3BhdGNoZXMvIj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSJXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUGF0Y2hlcyIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvcGF0Y2hlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMi52MjAwODAyMTQwMTAwLTc3LTdfQ1lRQ0QyQ2FMWUNIQ0QiIHBhdGNoPSJ0cnVlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5wYXRjaC9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnBhdGNoL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyYWJmNy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0IGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxZDQ1My4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnNkazwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIwMDkzOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9lcGwtdjEwLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGIxZmFiLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBTREsKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDE0LCAyMDEwXG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1cblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAotXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAotXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGRjNzRmLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5zZGsvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjIuMy4xLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnNkay9saWNlbnNlLmh0bWwgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE4NGNhMy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuc2RrL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgotPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgMTQsIDIwMTA8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+Ci0KLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgotCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLQotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCi0gICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+Ci0KLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KLQotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTQ0NjkzLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdC50ZXN0c18xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0ODk5Yy4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2FjYjY1Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MDUgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI2MDI5Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgcHJvamVjdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4OTRhZjkuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmFzc2VtYmx5LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQudGVzdHMuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjMuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMjgyZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD5VbnVzZWQgUHJvamVjdDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdCBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2OWMyZi4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdDwvbmFtZT4KLQk8Y29tbWVudD5VbnVzZWQgUHJvamVjdDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMmFiZjcuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSouYmluLmRpc3QuemlwCi1idWlsZC54bWwKLWZlYXR1cmVzCi1wbHVnaW5zCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MDEzNzIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9hc3NlbWJseS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmFzc2VtYmx5LmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2IxMTcuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIHByb2plY3QgU0RLCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvYXNzZW1ibHkvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5hc3NlbWJseS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRiYzNhLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdF9zZGsuYXNzZW1ibHkuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIyLjMuMS5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IldlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZSBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDAxYTIuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS5qcHRfMS4wLjAuKgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Ly5wcm9qZWN0IGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MWIwNGMuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQ8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWZiZWRkLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjMuMS5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaSBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4YTMyNS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5tYXBwaW5ncyBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRhMTg2Li4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29sc1xuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2NmYjBlLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5wbmcsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbCBiL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZjEzM2YuLjAwMDAwMDAKLS0tIGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQiPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdCIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGIiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRiLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5nZW4iIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2Fzc2VtYmx5L3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0L2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nIGIvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY4ZmFjMS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXNzZW1ibHkvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQvcGx1Z2luLnByb3BlcnRpZXMgYi9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjMDU1YS4uMDAwMDAwMAotLS0gYS9hc3NlbWJseS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGIxMDZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTBkMTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpICAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwYWFkMi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBDb21tb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIENvbW1vbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTE5YmJmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUiIHZlcnNpb249IjEuMS4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzNTg2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIENvbW1vbiBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzZTJlYi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNzlmMi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzgzOWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjMyNGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgQ29tbW9uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2YmExZi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIENvbW1vbiBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNzlmMi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGUxMTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjczMzU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjMxN2FlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjViNTFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uIFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEVjbGlwc2VMaW5rIENvbW1vbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDQ5YjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLy5wcm9qZWN0IGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkYWQwMy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg4NmJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkMzIwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmMxODA1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBjMzMyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNlMmViLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEwNjc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODM5Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2ZmYzZi4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBDb21tb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBjMzMyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDEwNjc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODNhNy4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI5YzFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGVmMjI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIEpVbml0IFRlc3RzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi0jIFRPUkVWSUVXIC0gdXBkYXRlU2l0ZU5hbWUKLXVwZGF0ZVNpdGVOYW1lPVdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgQ29tbW9uIEpVbml0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZDU2MTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZTExNC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YjQ1NzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiZTJlYTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NzgxNjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIC0gQ29tbW9uCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvY29tbW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzMzA5NC4uMDAwMDAwMAotLS0gYS9jb21tb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb25fc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLmN2c2lnbm9yZSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLnByb2plY3QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzk0MDExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTcwODcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaHRtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0LmluaSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwN2Q0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9hYm91dC5tYXBwaW5ncyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTgyN2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb25cblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyMGUzYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvY29tcG9uZW50LnhtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQzN2VjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nIj4KLTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjRlZWEwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLmNsYXNzcGF0aCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRmYjM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLmN2c2lnbm9yZSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnByb2plY3QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MTNhMTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRjZGFkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jRnJpIEFwciAwMSAxNzoxNDozNSBFRFQgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIyNmRmMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBkZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy41LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiCi1EYWxpLUNvbW1lbnQ6IFdlIGZyaWVuZCAndXRpbGl0eScgdG8gYWxsIG5vbi1FY2xpcHNlTGluaywgbm9uLXRlc3QgYnVuZGxlcwotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5nZW47eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSxvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSxvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSxvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSxvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdAotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvYWJvdXQuaHRtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OWM2ZmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGE0YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUxJQlJBUllfVkFMSURBVE9SUz1MaWJyYXJ5IFZhbGlkYXRvcnMKLVJFU09VUkNFX0xPQ0FUT1JTPVJlc291cmNlIExvY2F0b3JzCi0KLUpBUl9DT05URU5UID0gSkFSIENvbnRlbnQKLUpBVkFfUEFDS0FHRV9JTkZPX0NPTlRFTlQgPSBwYWNrYWdlLWluZm8uamF2YQotCi1OT19PUF9MSUJSQVJZX1BST1ZJREVSX1dBUk5JTkcgPSBMaWJyYXJ5IGNvbmZpZ3VyYXRpb24gaXMgZGlzYWJsZWQuIFRoZSB1c2VyIG1heSBuZWVkIHRvIGNvbmZpZ3VyZSBmdXJ0aGVyIGNsYXNzcGF0aCBjaGFuZ2VzIGxhdGVyLgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3BsdWdpbi54bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlNGY3ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPCEtLQotCUNvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0JVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0JdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLQlhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCQotCUNvbnRyaWJ1dG9yczoKLQkJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0gCi08cGx1Z2luPgotCi0JPCEtLSAqKioqKiBleHRlbnNpb24gcG9pbnRzICoqKioqIC0tPgotCQotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJyYXJ5VmFsaWRhdG9ycyIKLQkJbmFtZT0iJUxJQlJBUllfVkFMSURBVE9SUyIKLQkJc2NoZW1hPSJzY2hlbWEvbGlicmFyeVZhbGlkYXRvcnMuZXhzZCIvPgotCQotCQotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZUxvY2F0b3JzIgotCQluYW1lPSIlUkVTT1VSQ0VfTE9DQVRPUlMiCi0JCXNjaGVtYT0ic2NoZW1hL3Jlc291cmNlTG9jYXRvcnMuZXhzZCIvPgotCi0KLQk8IS0tICoqKioqIEVjbGlwc2UgY29yZSBleHRlbnNpb25zICoqKioqIC0tPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUuY29udGVudFR5cGVzIj4KLQkKLQkJPCEtLSBKQVIgY29udGVudCB0eXBlIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmNvbnRlbnQuamFyIgotCQkJbmFtZT0iJUpBUl9DT05URU5UIgotCQkJZmlsZS1leHRlbnNpb25zPSJqYXIsIHppcCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LkJpbmFyeVNpZ25hdHVyZURlc2NyaWJlciI+Ci0JCQkJPHBhcmFtZXRlciBuYW1lPSJzaWduYXR1cmUiIHZhbHVlPSI1MCA0QiAwMyAwNCIvPgotCQkJPC9kZXNjcmliZXI+Ci0JCTwvY29udGVudC10eXBlPgotCQkKLSAgCQk8IS0tIHBhY2thZ2UtaW5mby5qYXZhIGNvbnRlbnQgdHlwZSAoZm9yIHBhY2thZ2UgYW5ub3RhdGlvbnMpIC0tPgotCQk8Y29udGVudC10eXBlCi0gICAgICAgCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmNvbnRlbnQuamF2YVBhY2thZ2VJbmZvIgotICAgICAgICAJbmFtZT0iJUpBVkFfUEFDS0FHRV9JTkZPX0NPTlRFTlQiCi0gICAgICAgIAliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFTb3VyY2UiCi0gICAgICAgCSAJZmlsZS1uYW1lcz0icGFja2FnZS1pbmZvLmphdmEiCi0gICAgICAgIAlwcmlvcml0eT0ibm9ybWFsIj4KLSAgCQk8L2NvbnRlbnQtdHlwZT4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KLQkJCi0JCTxmYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLlJlc291cmNlQWRhcHRlckZhY3RvcnkiCi0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLklSZXNvdXJjZVBhcnQiLz4KLQkJPC9mYWN0b3J5PgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotCQkKLQkJPHByb3BlcnR5VGVzdGVyCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnByb3BlcnR5VGVzdGVyLmxpYnJhcnlQcm92aWRlciIKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSUxpYnJhcnlQcm92aWRlciIKLQkJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIgotCQkJcHJvcGVydGllcz0iaWQsIGV4dGVuZHNJZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlicHJvdi5MaWJyYXJ5UHJvdmlkZXJQcm9wZXJ0eVRlc3RlciIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2VMb2NhdG9ycyI+Ci0JCQotCQk8cmVzb3VyY2VMb2NhdG9yCi0JCQlpZD0ic2ltcGxlSmF2YVJlc291cmNlTG9jYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuU2ltcGxlSmF2YVJlc291cmNlTG9jYXRvciIKLQkJCXByaW9yaXR5PSJsb3dlc3QiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9InByb2plY3QiPgotCQkJCQk8dGVzdCAKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJdmFsdWU9ImphdmEiIAotCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Jlc291cmNlTG9jYXRvcj4KLQkJCi0JCTxyZXNvdXJjZUxvY2F0b3IKLQkJCWlkPSJtb2R1bGVSZXNvdXJjZUxvY2F0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLk1vZHVsZVJlc291cmNlTG9jYXRvciIKLQkJCXByaW9yaXR5PSJsb3dlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icHJvamVjdCI+Ci0JCQkJCTx0ZXN0IAotCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByb2plY3ROYXR1cmUiIAotCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5Nb2R1bGVDb3JlTmF0dXJlIiAKLQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZXNvdXJjZUxvY2F0b3I+Ci0JCQotCQk8cmVzb3VyY2VMb2NhdG9yCi0JCQlpZD0id2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5XZWJNb2R1bGVSZXNvdXJjZUxvY2F0b3IiCi0JCQlwcmlvcml0eT0ibG93Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJwcm9qZWN0Ij4KLQkJCQkJPHRlc3QgCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAKLQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZXNvdXJjZUxvY2F0b3I+Ci0JCQotCQk8cmVzb3VyY2VMb2NhdG9yCi0JCQlpZD0icGx1Z2luUmVzb3VyY2VMb2NhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5QbHVnaW5SZXNvdXJjZUxvY2F0b3IiCi0JCQlwcmlvcml0eT0ibm9ybWFsIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJwcm9qZWN0Ij4KLQkJCQkJPHRlc3QgCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvamVjdE5hdHVyZSIgCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZSIgCi0JCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcmVzb3VyY2VMb2NhdG9yPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicmFyeVByb3ZpZGVycyI+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0ianB0LW5vLW9wLWxpYnJhcnktcHJvdmlkZXIiIAotCQkJZXh0ZW5kcz0ibm8tb3AtbGlicmFyeS1wcm92aWRlciIKLQkJCWFic3RyYWN0PSJ0cnVlIj4KLQkJCTxwYXJhbSBuYW1lPSJ3YXJuaW5nIiB2YWx1ZT0iJU5PX09QX0xJQlJBUllfUFJPVklERVJfV0FSTklORyIvPgotCQk8L3Byb3ZpZGVyPgotCQotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl9jb3JlLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NzQ2MDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1EQUxJX0VWRU5UX0hBTkRMRVJfVEhSRUFEX05BTUU9RGFsaSBFdmVudCBIYW5kbGVyCi1HRU5FUkFUSU9OX0NSRUFUSU5HX0xBVU5DSF9DT05GSUdfVEFTSz1DcmVhdGluZyBsYXVuY2ggY29uZmlndXJhdGlvbgotR0VORVJBVElPTl9TQVZJTkdfTEFVTkNIX0NPTkZJR19UQVNLPVNhdmluZyBsYXVuY2ggY29uZmlndXJhdGlvbgotR0VORVJBVElPTl9MQVVOQ0hJTkdfQ09ORklHX1RBU0s9TGF1bmNoaW5nIGNvbmZpZ3VyYXRpb24KLVJFR0lTVFJZX01JU1NJTkdfQVRUUklCVVRFPU1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlICcnezB9JycgZm9yIGVsZW1lbnQgJyd7MX0nJyBpbiBleHRlbnNpb24gJyd7MX0nJyBmcm9tIHBsdWctaW4gJyd7Mn0nJy4KLVJFR0lTVFJZX0lOVkFMSURfVkFMVUU9SW52YWxpZCB2YWx1ZSAnJ3swfScnIGZvciAnJ3sxfScnIGluIGV4dGVuc2lvbiAnJ3syfScnIGZyb20gcGx1Zy1pbiAnJ3szfScnLgotUkVHSVNUUllfRFVQTElDQVRFPUFuIGV4dGVuc2lvbiBvZiAnJ3swfScnIHdpdGggdGhlICcnezF9JycgdmFsdWUgb2YgJyd7Mn0nJyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi1SRUdJU1RSWV9GQUlMRURfQ0xBU1NfTE9BRD1VbmFibGUgdG8gbG9hZCB0aGUgY2xhc3MgJyd7MH0nJyBkZWNsYXJlZCBmb3IgdGhlIGV4dGVuc2lvbiBwb2ludCAnJ3sxfScnIGluIHRoZSBwbHVnLWluICcnezJ9JycuCi1SRUdJU1RSWV9GQUlMRURfSU5URVJGQUNFX0FTU0lHTk1FTlQ9VW5hYmxlIHRvIGFzc2lnbiB0aGUgY2xhc3MgJyd7MH0nJyBkZWNsYXJlZCBmb3IgdGhlIGV4dGVuc2lvbiBwb2ludCAnJ3sxfScnIGluIHRoZSBwbHVnLWluICcnezJ9JycgdG8gdGhlIGludGVyZmFjZSAnJ3szfScnLgotUkVHSVNUUllfRkFJTEVEX0lOU1RBTlRJQVRJT049VW5hYmxlIHRvIGluc3RhbnRpYXRlIHRoZSBjbGFzcyAnJ3swfScnIGRlY2xhcmVkIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50ICcnezF9JycgaW4gdGhlIHBsdWctaW4gJyd7Mn0nJy4KLVVTRVJfTElCUkFSWV9WQUxJREFUT1JfX0NMQVNTX05PVF9GT1VORD1UaGUgY2xhc3MgJyd7MH0nJyBpcyByZXF1aXJlZCB0byBiZSBpbiB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzLgotVkFMSURBVEVfQ09OVEFJTkVSX05PVF9TUEVDSUZJRUQ9UGFyZW50IGZvbGRlciBtdXN0IGJlIHNwZWNpZmllZAotVkFMSURBVEVfRklMRV9OQU1FX05PVF9TUEVDSUZJRUQ9RmlsZSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkCi1WQUxJREFURV9GSUxFX0FMUkVBRFlfRVhJU1RTPUZpbGUgYWxyZWFkeSBleGlzdApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zY2hlbWEvbGlicmFyeVZhbGlkYXRvcnMuZXhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zY2hlbWEvbGlicmFyeVZhbGlkYXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJkYWNiYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc2NoZW1hL2xpYnJhcnlWYWxpZGF0b3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIgaWQ9ImxpYnJhcnlWYWxpZGF0b3JzIiBuYW1lPSJMaWJyYXJ5IFZhbGlkYXRvcnMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVXNlZCB0byBwcm92aWRlIGN1c3RvbSBsaWJyYXJ5IHZhbGlkYXRpb24gdG8gSlBUIHByb2plY3QgY29uZmlndXJhdGlvbi4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJsaWJyYXJ5VmFsaWRhdG9yIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibGlicmFyeVZhbGlkYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBsaWJyYXJ5IHZhbGlkYXRvci4gIFNlZSAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3ImbHQ7L3NhbXAmZ3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGxpYnJhcnkgdmFsaWRhdG9ycy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW5hYmxlbWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNsYXJlZCBsaWJyYXJ5IHZhbGlkYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yJmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qcHQuY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBKUFQgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDticiZndDsKLSZsdDtwJmd0OwotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIHRoZSBpbmNsdWRlZCBnZW5lcmljIGxpYnJhcnkgdmFsaWRhdG9yLCB3aGljaCBpcyB1c2VkIGZvciB1c2VyIGxpYnJhcnkgdmFsaWRhdGlvbiBmb3IgcHJvamVjdHMgb2YgdGhlIGdlbmVyaWMgSlBBIHBsYXRmb3JtIGdyb3VwLgotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbgotICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzJnF1b3Q7Jmd0OwotICAgJmx0O2xpYnJhcnlWYWxpZGF0b3IKLSAgICAgIGlkPSZxdW90O2dlbmVyaWNVc2VyTGlicmFyeVZhbGlkYXRvciZxdW90OwotICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwubGlidmFsLkdlbmVyaWNKcGFVc2VyTGlicmFyeVZhbGlkYXRvciZxdW90OyZndDsKLSAgICAgICZsdDtlbmFibGVtZW50Jmd0OwotICAgICAgICAgJmx0O3dpdGggdmFyaWFibGU9JnF1b3Q7bGlicmFyeVByb3ZpZGVyJnF1b3Q7Jmd0OwotICAgICAgICAgICAgJmx0O3Rlc3QgcHJvcGVydHk9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvcmUuZXh0ZW5kc0lkJnF1b3Q7IHZhbHVlPSZxdW90O2pwYS11c2VyLWxpYnJhcnktcHJvdmlkZXImcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy93aXRoJmd0OwotICAgICAgJmx0Oy9lbmFibGVtZW50Jmd0OwotICAgJmx0Oy9saWJyYXJ5VmFsaWRhdG9yJmd0OwotJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7cCZndDsKLVRoZSBlbmFibGVtZW50IHZhcmlhYmxlcyBpbmNsdWRlOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0OyZxdW90O2xpYnJhcnlQcm92aWRlciZxdW90OyB3aGljaCBnaXZlcyB0aGUgY3VycmVudCBJTGlicmFyeVByb3ZpZGVyLiZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7JnF1b3Q7Y29uZmlnJnF1b3Q7IHdoaWNoIGdpdmVzIHRoZSBjdXJyZW50IEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi1hbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIAotQ29udHJpYnV0b3JzOgotT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NjaGVtYS9yZXNvdXJjZUxvY2F0b3JzLmV4c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc2NoZW1hL3Jlc291cmNlTG9jYXRvcnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhZjU5Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc2NoZW1hL3Jlc291cmNlTG9jYXRvcnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiBpZD0icmVzb3VyY2VMb2NhdG9ycyIgbmFtZT0iUmVzb3VyY2UgTG9jYXRvcnMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVXNlZCB0byBwcm92aWRlIGN1c3RvbSAobm9uLWphdmEpIHJlc291cmNlIGxvY2F0aW9uIGxvZ2ljIHRvIEpQVCBwcm9qZWN0cy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGluY2x1ZGUgc2NoZW1hTG9jYXRpb249InNjaGVtYTovL29yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMvc2NoZW1hL2V4cHJlc3Npb25MYW5ndWFnZS5leHNkIi8+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJyZXNvdXJjZUxvY2F0b3IiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icmVzb3VyY2VMb2NhdG9yIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIHJlc291cmNlIGxvY2F0b3IuICBTZWUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciZsdDsvc2FtcCZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcmVzb3VyY2UgbG9jYXRvcnMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImVuYWJsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZGVjbGFyZWQgcmVzb3VyY2UgbG9jYXRvci4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByaW9yaXR5Ij4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJbmRpY2F0ZXMgdGhlIHJlbGF0aXZlIHByaW9yaXR5IG9mIHRoaXMgZXh0ZW5zaW9uIHRvIG90aGVyIGV4dGVuc2lvbnMuIFVzZWQgYnkgdGhlIHJlc291cmNlIGxvY2F0b3IgbWFuYWdlciB0byBkZXRlcm1pbmUgd2hpY2ggZXh0ZW5zaW9uIHNob3VsZCBiZSB1c2VkIGluIHRoZSBjYXNlIHRoYXQgbXVsdGlwbGUgZXh0ZW5zaW9ucyBhcHBseSB0byBhIGdpdmVuIHByb2plY3QuIERlZmF1bHRzIHRvICZxdW90O25vcm1hbCZxdW90Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDxzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgPHJlc3RyaWN0aW9uIGJhc2U9InN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9Imxvd2VzdCI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsb3dlciI+Ci0gICAgICAgICAgICAgICAgICA8L2VudW1lcmF0aW9uPgotICAgICAgICAgICAgICAgICAgPGVudW1lcmF0aW9uIHZhbHVlPSJsb3ciPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0ibm9ybWFsIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImhpZ2giPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDxlbnVtZXJhdGlvbiB2YWx1ZT0iaGlnaGVyIj4KLSAgICAgICAgICAgICAgICAgIDwvZW51bWVyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8ZW51bWVyYXRpb24gdmFsdWU9ImhpZ2hlc3QiPgotICAgICAgICAgICAgICAgICAgPC9lbnVtZXJhdGlvbj4KLSAgICAgICAgICAgICAgIDwvcmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICA8L3NpbXBsZVR5cGU+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIEpQVCAzLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2JyJmd0OwotJmx0O3AmZ3Q7Ci1UaGUgZm9sbG93aW5nIGV4YW1wbGUgaXMgdGhlIGluY2x1ZGVkIHNpbXBsZSBqYXZhIHJlc291cmNlIGxvY2F0b3IsIHdoaWNoIGlzIHVzZWQgZm9yIHNpbXBsZSBqYXZhIHByb2plY3RzLiAgSXQgaXMgb2YgJnF1b3Q7bG93ZXN0JnF1b3Q7IHByaW9yaXR5LCBzaW5jZSBhbGwgSlBUIHByb2plY3RzIHdpbGwgYXQgdGhlaXIgcm9vdHMgYmUgc2ltcGxlIGphdmEgcHJvamVjdHMuCi0mbHQ7cCZndDsKLSZsdDtwcmUmZ3Q7Ci0mbHQ7ZXh0ZW5zaW9uICAKLSBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2VMb2NhdG9ycyZxdW90OyZndDsKLSAmbHQ7cmVzb3VyY2VMb2NhdG9yCi0gIGlkPSZxdW90O3NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3ImcXVvdDsKLSAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLlNpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3ImcXVvdDsKLSAgcHJpb3JpdHk9JnF1b3Q7bG93ZXN0JnF1b3Q7Ci0gICZsdDtlbmFibGVtZW50Jmd0OwotICAgJmx0O3dpdGggdmFyaWFibGU9JnF1b3Q7cHJvamVjdCZxdW90OyZndDsKLSAgICAmbHQ7dGVzdCBwcm9wZXJ0eT0mcXVvdDtvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQmcXVvdDsgdmFsdWU9JnF1b3Q7amF2YSZxdW90OyBmb3JjZVBsdWdpbkFjdGl2YXRpb249JnF1b3Q7dHJ1ZSZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L3dpdGgmZ3Q7Ci0gICZsdDsvZW5hYmxlbWVudCZndDsKLSAmbHQ7L3Jlc291cmNlTG9jYXRvciZndDsKLSZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3AmZ3Q7Ci1UaGUgY29udHJpYnV0ZWQgcmVzb3VyY2UgbG9jYXRvciBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS5qcHQuY285bW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvciZsdDsvY29kZSZndDsuCi0mbHQ7cCZndDsKLVRoZSBlbmFibGVtZW50IHZhcmlhYmxlcyBpbmNsdWRlOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0OyZxdW90O3Byb2plY3QmcXVvdDsgd2hpY2ggZ2l2ZXMgdGhlIGN1cnJlbnQgSVByb2plY3QuJmx0Oy9saSZndDsKLSZsdDsvdWwmZ3Q7Ci0mbHQ7L3AmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0O1RoZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUgcGx1Zy1pbiBwcm92aWRlcyB0aGUgZm9sbG93aW5nIHJlc291cmNlIGxvY2F0b3JzOgotJmx0O3VsJmd0OwotJmx0O2xpJmd0O3NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3ImbHQ7L2xpJmd0OwotJmx0O2xpJmd0O21vZHVsZVJlc291cmNlTG9jYXRvciZsdDsvbGkmZ3Q7Ci0mbHQ7bGkmZ3Q7d2ViTW9kdWxlUmVzb3VyY2VMb2NhdG9yJmx0Oy9saSZndDsKLSZsdDtsaSZndDtwbHVnaW5SZXNvdXJjZUxvY2F0b3ImbHQ7L2xpJmd0OwotJmx0Oy91bCZndDsKLSZsdDsvcCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi1hbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIAotQ29udHJpYnV0b3JzOgotT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvQW5ub3RhdGlvblByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9Bbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MTMyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9Bbm5vdGF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLQotLyoqCi0gKiBUaGlzIGlzIHVzZWQgdG8gcHJvdmlkZSBhbm5vdGF0aW9ucyBhbmQgbmVzdGFibGUgYW5ub3RhdGlvbnMuIEFuIGV4Y2VwdGlvbiB3aWxsCi0gKiBiZSB0aHJvd24gb24gYW4gYXR0ZW1wdCB0byBidWlsZCBhbiBhbm5vdGF0aW9uIHRoYXQgZG9lcyBub3QgZXhpc3QuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uUHJvdmlkZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYW5ub3RhdGlvbnMuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRBbm5vdGF0aW9uTmFtZXMoKTsKLQotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWVzKCk7Ci0KLQlJdGVyYWJsZTxTdHJpbmc+IGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWVzKCk7Ci0KLQlTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCi0JU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQotCVN0cmluZyBnZXROZXN0YWJsZUVsZW1lbnROYW1lKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgbmFtZSBpcyB1bnN1cHBvcnRlZC4KLQkgKiBAc2VlICNnZXRBbm5vdGF0aW9uTmFtZXMoKQotCSAqLwotCUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5lc3RhYmxlIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGluZGV4LgotCSAqIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgdW5zdXBwb3J0ZWQuCi0JICogQHNlZSAjZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZXMoKQotCSAqLwotCU5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQnVpbGQgYW4gYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBKRFQgYW5ub3RhdGlvbi4KLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGlzIHVuc3VwcG9ydGVkLgotCSAqIEBzZWUgI2dldEFubm90YXRpb25OYW1lcygpCi0JICovCi0JQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pOwotCi0JLyoqCi0JICogQnVpbGQgYSBuZXN0YWJsZSBhbm5vdGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEpEVCBhbm5vdGF0aW9uIGFuZCBpbmRleC4KLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGlzIHVuc3VwcG9ydGVkLgotCSAqIEBzZWUgI2dldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWVzKCkKLQkgKi8KLQlOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uLCBpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQnVpbGQgYSBudWxsIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBpcyB1bnN1cHBvcnRlZC4KLQkgKiBAc2VlICNnZXRBbm5vdGF0aW9uTmFtZXMoKQotCSAqLwotCUFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0dlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0dlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlZTczOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9HZW5lcmljQW5ub3RhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqIERlbGVnYXRlIHRvIGFubm90YXRpb24gZGVmaW5pdGlvbiBwcm92aWRlcnMuCi0gKiBUaGUgcGxhdGZvcm0gZmFjdG9yeSB3aWxsIGJ1aWxkIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbiBwcm92aWRlciwKLSAqIHBhc3NpbmcgaW4gdGhlIGFwcHJvcHJpYXRlIGFycmF5IG9mIGFubm90YXRpb24gZGVmaW5pdGlvbiBwcm92aWRlcnMgbmVjZXNzYXJ5Ci0gKiB0byBidWlsZCB0aGUgYW5ub3RhdGlvbnMgZm9yIHRoZSBwbGF0Zm9ybSAodmVuZG9yIGFuZC9vciB2ZXJzaW9uKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEdlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEFubm90YXRpb25Qcm92aWRlcgotewotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0KLQlwcml2YXRlIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uczsKLQkKLQlwdWJsaWMgR2VuZXJpY0Fubm90YXRpb25Qcm92aWRlcihBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGFubm90YXRpb25EZWZpbml0aW9ucywgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25zID0gYW5ub3RhdGlvbkRlZmluaXRpb25zOwotCQl0aGlzLm5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zID0gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8QW5ub3RhdGlvbkRlZmluaXRpb24+KHRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25zKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uIGdldEFubm90YXRpb25EZWZpbml0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uIDogdGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLQkJCWlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEFubm90YXRpb25EZWZpbml0aW9uLCBTdHJpbmc+KGdldEFubm90YXRpb25EZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB7Ci0JCQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiwgU3RyaW5nPihnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24sIFN0cmluZz4oZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uKSB7Ci0JCQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uLmdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKS5idWlsZEFubm90YXRpb24ocGFyZW50LCBlbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25EZWZpbml0aW9uKGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKSkuYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKSkuYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbiwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSkuYnVpbGROdWxsQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24+KHRoaXMubmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMpOwotCX0KLQotCXByb3RlY3RlZCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IHRoaXMubmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMpIHsKLQkJCWlmIChhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKS5idWlsZEFubm90YXRpb24ocGFyZW50LCBlbGVtZW50LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNvbnRhaW5lcihjb250YWluZXJBbm5vdGF0aW9uTmFtZSkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSkuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlRWxlbWVudE5hbWUoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSkuZ2V0RWxlbWVudE5hbWUoKTsJCQotCX0KLQotCXByaXZhdGUgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uRm9yQ29udGFpbmVyKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCWlmIChuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkuZXF1YWxzKGNvbnRhaW5lckFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0lSZXNvdXJjZVBhcnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0lSZXNvdXJjZVBhcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVlNmE0Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9JUmVzb3VyY2VQYXJ0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBkZXNjcmliZWQgYXMgYmVpbmcgcGFydCBvZiBhbiB7QGxpbmsgSVJlc291cmNlfQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVJlc291cmNlUGFydAotewotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2Ugb2Ygd2hpY2ggdGhpcyBvYmplY3QgaXMgYSBwYXJ0Ci0JICovCi0JSVJlc291cmNlIGdldFJlc291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRDb21tb25Db3JlUGx1Z2luLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRDb21tb25Db3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmM5OTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0Q29tbW9uQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJ2YWwuTGlicmFyeVZhbGlkYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLlJlc291cmNlTG9jYXRvck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpwdENvbW1vbkNvcmVQbHVnaW4KLQlleHRlbmRzIFBsdWdpbgotewotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgY29uc3RhbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgdGhlIGpwdCBjb21tb24gY29yZSBzdXBwb3J0Ci0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEXyA9IFBMVUdJTl9JRCArICcuJzsKLQotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgSmF2YSBzb3VyY2UgY29kZSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVZBX1NPVVJDRV9DT05URU5UX1RZUEUgPSBnZXRDb250ZW50VHlwZShKYXZhQ29yZS5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBKYXZhIHNvdXJjZSBjb2RlIGZpbGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcHRSZXNvdXJjZVR5cGUgSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRSA9IG5ldyBKcHRSZXNvdXJjZVR5cGUoSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKTsKLQkKLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIGZvciBKYXZhIGFyY2hpdmVzIChKQVJzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVJfQ09OVEVOVF9UWVBFID0gZ2V0SnB0Q29udGVudFR5cGUoImphciIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIEphdmEgYXJjaGl2ZXMgKEpBUnMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEpBUl9SRVNPVVJDRV9UWVBFID0gbmV3IEpwdFJlc291cmNlVHlwZShKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpOwotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgcGFja2FnZS1pbmZvIEphdmEgY29kZSBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFID0gZ2V0SnB0Q29udGVudFR5cGUoImphdmFQYWNrYWdlSW5mbyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgcGFja2FnZS1pbmZvIEphdmEgY29kZSBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIEpBVkFfU09VUkNFX1BBQ0tBR0VfSU5GT19SRVNPVVJDRV9UWVBFID0gbmV3IEpwdFJlc291cmNlVHlwZShKQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKTsKLQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUFRfQ09OVEVOVF9QUkVGSVggPSBQTFVHSU5fSURfICsgImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQVF9DT05URU5UX1BSRUZJWF8gPSBKUFRfQ09OVEVOVF9QUkVGSVggKyAnLic7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldEpwdENvbnRlbnRUeXBlKFN0cmluZyBqcHRDb250ZW50VHlwZSkgewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGUoSlBUX0NPTlRFTlRfUFJFRklYXyArIGpwdENvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gUmVzb3VyY2VMb2NhdG9yTWFuYWdlci5pbnN0YW5jZSgpLmdldFJlc291cmNlTG9jYXRvcihwcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJUmVzb3VyY2VMb2NhdG9yIHJlc291cmNlTG9jYXRvciA9IGdldFJlc291cmNlTG9jYXRvcihwcm9qZWN0KTsKLQkJaWYgKHJlc291cmNlTG9jYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJUGF0aCBzb3VyY2VQYXRoID0gcmVzb3VyY2VMb2NhdG9yLmdldFJlc291cmNlUGF0aChwcm9qZWN0LCBydW50aW1lUGF0aCk7Ci0JCWlmIChzb3VyY2VQYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHNvdXJjZVBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8TGlicmFyeVZhbGlkYXRvcj4gZ2V0TGlicmFyeVZhbGlkYXRvcnMoCi0JCQlKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQlyZXR1cm4gTGlicmFyeVZhbGlkYXRvck1hbmFnZXIuaW5zdGFuY2UoKS5nZXRMaWJyYXJ5VmFsaWRhdG9ycyhjb25maWcpOwotCX0KLQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEpwdENvbW1vbkNvcmVQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBqcHQgY29tbW9uIGNvcmUgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdENvbW1vbkNvcmVQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhtc2csIG51bGwpOwotICAgIH0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZywgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgdGhyb3dhYmxlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpwdENvbW1vbkNvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCQkKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNmMjJjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdFJlc291cmNlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlOwotCi0vKioKLSAqIExpc3RlbmVycyBhcmUgbm90aWZpZWQgd2hlbmV2ZXIgYW55dGhpbmcgaW4gdGhlIEpQVCByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnB0UmVzb3VyY2VNb2RlbCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgb2YgdGhlIG1vZGVsLiAgVGhpcyBtYXkgcG90ZW50aWFsbHkgY2hhbmdlLgotCSAqIFJldHVybiBudWxsIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB0aGUgY29udGVudCB0eXBlIG9yIHZlcnNpb24gaXMgbnVsbC4KLQkgKi8KLQlKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCk7Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBtb2RlbCByZXN1bHQgaW4gZXZlbnRzLgotCSAqIEluIHBhcnRpY3VsYXIsIHRoZSBKUEEgcHJvamVjdCBwZXJmb3JtcyBhbiAidXBkYXRlIiB3aGVuZXZlciBhIHJlc291cmNlCi0JICogbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQl2b2lkIGFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQHNlZSAjYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcikKLQkgKi8KLQl2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdFJlc291cmNlTW9kZWxMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGQwZDNmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdFJlc291cmNlTW9kZWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGUgbGlzdGVuZXIgaXMgbm90aWZpZWQgd2hlbmV2ZXIgYW55dGhpbmcgaW4gdGhlIEpQQSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyCi0JZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0Jdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZChKcHRSZXNvdXJjZU1vZGVsIGpwYVJlc291cmNlTW9kZWwpOwotCQotCXZvaWQgcmVzb3VyY2VNb2RlbFJldmVydGVkKEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCk7Ci0JCi0Jdm9pZCByZXNvdXJjZU1vZGVsVW5sb2FkZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL0pwdFJlc291cmNlVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjM1NWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvSnB0UmVzb3VyY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgZmlsZSBjb250ZW50IHR5cGUgYW5kIHZlcnNpb24gZm9yIEpQQSByZXNvdXJjZXMuCi0gKiBUaGlzIGlzIGEgdmFsdWUgb2JqZWN0IHRoYXQgZGVmaW5lcyBhbiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSBtZXRob2QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGNsYXNzIEpwdFJlc291cmNlVHlwZQotewotCXByaXZhdGUgZmluYWwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmVyc2lvbjsKLQotCi0JLyoqCi0JICogVmVyc2lvbiB1c2VkIHdoZW4gdmVyc2lvbiBjYW4gbm90IGJlIGRldGVybWluZWQgb3Igd2hlbiB0aGVyZSBpcyBubwotCSAqIHNlbnNlIG9mIHZlcnNpb24gKGUuZy4gSmF2YSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ERVRFUk1JTkVEX1ZFUlNJT04gPSAiPHVuZGV0ZXJtaW5lZD4iOyAvLyROT04tTkxTLTEkCi0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCXRoaXMoY29udGVudFR5cGUsIFVOREVURVJNSU5FRF9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiY29udGVudCB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMudmVyc2lvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAob2JqID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgob2JqID09IG51bGwpIHx8IChvYmouZ2V0Q2xhc3MoKSAhPSB0aGlzLmdldENsYXNzKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSnB0UmVzb3VyY2VUeXBlIG90aGVyID0gKEpwdFJlc291cmNlVHlwZSkgb2JqOwotCQlyZXR1cm4gdGhpcy5jb250ZW50VHlwZS5lcXVhbHMob3RoZXIuY29udGVudFR5cGUpICYmIHRoaXMudmVyc2lvbi5lcXVhbHMob3RoZXIudmVyc2lvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCBoYXNoID0gMTc7Ci0JCWhhc2ggPSBoYXNoICogcHJpbWUgKyB0aGlzLmNvbnRlbnRUeXBlLmhhc2hDb2RlKCk7Ci0JCWhhc2ggPSBoYXNoICogcHJpbWUgKyB0aGlzLnZlcnNpb24uaGFzaENvZGUoKTsKLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJc2IuYXBwZW5kKCIoY29udGVudCA9ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmNvbnRlbnRUeXBlKTsKLQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCgidmVyc2lvbiA9ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLnZlcnNpb24pOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9KcHRDb21tb25Db3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk2MmM2MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9KcHRDb21tb25Db3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIGNvbW1vbiBjb3JlLgotICovCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uQ29yZU1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERBTElfRVZFTlRfSEFORExFUl9USFJFQURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHRU5FUkFUSU9OX0NSRUFUSU5HX0xBVU5DSF9DT05GSUdfVEFTSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHRU5FUkFUSU9OX1NBVklOR19MQVVOQ0hfQ09ORklHX1RBU0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR0VORVJBVElPTl9MQVVOQ0hJTkdfQ09ORklHX1RBU0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVHSVNUUllfTUlTU0lOR19BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVHSVNUUllfSU5WQUxJRF9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9EVVBMSUNBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVHSVNUUllfRkFJTEVEX0NMQVNTX0xPQUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVHSVNUUllfRkFJTEVEX0lOVEVSRkFDRV9BU1NJR05NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0ZBSUxFRF9JTlNUQU5USUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRVJfTElCUkFSWV9WQUxJREFUT1JfX0NMQVNTX05PVF9GT1VORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9DT05UQUlORVJfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9GSUxFX05BTUVfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9GSUxFX0FMUkVBRFlfRVhJU1RTOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfY29tbW9uX2NvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29tbW9uQ29yZU1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9SZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9SZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTRlMDYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSVJlc291cmNlUGFydDsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGJ1aWxkIGFkYXB0ZXJzIGZvciBjb252ZXJ0aW5nIEVjbGlwc2UgcmVzb3VyY2VzIHRvIERhbGkKLSAqIHJlc291cmNlIHBhcnRzLgotICogPHA+Ci0gKiBTZWUgPGNvZGU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIHBsdWdpbi54bWw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7IElSZXNvdXJjZVBhcnQuY2xhc3MgfTsKLQotCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gQURBUFRFUl9MSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKSBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJUmVzb3VyY2UpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBDbGFzcyA8Pz5hZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSVJlc291cmNlUGFydC5jbGFzcykgewotCQkJcmV0dXJuIG5ldyBJUmVzb3VyY2VQYXJ0KCkgewotCQkJCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCQkJCXJldHVybiByZXNvdXJjZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2dlbi9BYnN0cmFjdEpwdEdlbmVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvZ2VuL0Fic3RyYWN0SnB0R2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjM1MmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvZ2VuL0Fic3RyYWN0SnB0R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5nZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLkRlYnVnUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaENvbmZpZ3VyYXRpb25Xb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklMYXVuY2hNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuSUxhdW5jaGVzTGlzdGVuZXIyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklSdW50aW1lQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLkpwdENvbW1vbkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwdEdlbmVyYXRvcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTlNfRElSID0gInBsdWdpbnMvIjsJICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElWTUluc3RhbGwganJlOwotCXByb3RlY3RlZCBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGxhdW5jaENvbmZpZzsKLQlwcml2YXRlIElMYXVuY2ggbGF1bmNoOwotCQotCXByb3RlY3RlZCBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwcm9qZWN0TG9jYXRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1ZyA9IGZhbHNlOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0SnB0R2VuZXJhdG9yKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmphdmFQcm9qZWN0ID0gamF2YVByb2plY3Q7Ci0JCXRoaXMucHJvamVjdExvY2F0aW9uID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE1haW5UeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExhdW5jaENvbmZpZ05hbWUoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9vdHN0cmFwSmFyUHJlZml4KCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQm9vdHN0cmFwIEpBUiBub3Qgc3BlY2lmaWVkLiIpOyAgIC8vJE5PTi1OTFMtMSQ7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdDxTdHJpbmc+IGJ1aWxkQ2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0cnkgewotCQkJdGhpcy5qcmUgPSB0aGlzLmdldFByb2plY3RKUkUoKTsKLQkJCWlmICh0aGlzLmpyZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSAiQ291bGQgbm90IGlkZW50aWZ5IHRoZSBWTS4iOyAvLyROT04tTkxTLTEkCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7Ci0JCQl9Ci0JCQl0aGlzLmxhdW5jaENvbmZpZyA9IHRoaXMuYnVpbGRMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCX0gCi0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMTApOwotCQl0aGlzLnByZUdlbmVyYXRlKHNtLm5ld0NoaWxkKDIpKTsKLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc20uc3ViVGFzayhKcHRDb21tb25Db3JlTWVzc2FnZXMuR0VORVJBVElPTl9DUkVBVElOR19MQVVOQ0hfQ09ORklHX1RBU0spOwotCQl0aGlzLmluaXRpYWxpemVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCXNtLndvcmtlZCgxKTsKLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQl0aGlzLmFkZExhdW5jaExpc3RlbmVyKCk7Ci0JCXNtLndvcmtlZCgxKTsKLQotCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhdW5jaCA9IHRoaXMuc2F2ZUFuZExhdW5jaENvbmZpZyhzbS5uZXdDaGlsZCg2KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplTGF1bmNoQ29uZmlndXJhdGlvbigpIHsKLQkJdGhpcy5zcGVjaWZ5SlJFKCk7Ci0JCQotCQl0aGlzLnNwZWNpZnlQcm9qZWN0KCk7IAotCQl0aGlzLnNwZWNpZnlNYWluVHlwZSgpOwkKLQkJCi0JCXRoaXMuc3BlY2lmeVByb2dyYW1Bcmd1bWVudHMoKTsKLQkJdGhpcy5zcGVjaWZ5V29ya2luZ0RpcigpOyAKLQotCQl0aGlzLnNwZWNpZnlDbGFzc3BhdGhQcm9wZXJ0aWVzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRMYXVuY2hMaXN0ZW5lcigpIHsKLQotCQl0aGlzLmdldExhdW5jaE1hbmFnZXIoKS5hZGRMYXVuY2hMaXN0ZW5lcih0aGlzLmJ1aWxkTGF1bmNoTGlzdGVuZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHByZUdlbmVyYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcG9zdEdlbmVyYXRlKCkgewotCQl0cnkgewotCQkJaWYoICEgdGhpcy5pc0RlYnVnKSB7Ci0JCQkJdGhpcy5yZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQljYXRjaChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoZXNMaXN0ZW5lcjIgYnVpbGRMYXVuY2hMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJTGF1bmNoZXNMaXN0ZW5lcjIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzVGVybWluYXRlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGF1bmNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUxhdW5jaCBsYXVuY2ggPSBsYXVuY2hlc1tpXTsKLQkJCQkJaWYgKGxhdW5jaC5lcXVhbHMoQWJzdHJhY3RKcHRHZW5lcmF0b3IudGhpcy5nZXRMYXVuY2goKSkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQWJzdHJhY3RKcHRHZW5lcmF0b3IudGhpcy5wb3N0R2VuZXJhdGUoKTsKLQkJCQkJCQlBYnN0cmFjdEpwdEdlbmVyYXRvci50aGlzLmxhdW5jaCA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQlBYnN0cmFjdEpwdEdlbmVyYXRvci50aGlzLmdldExhdW5jaE1hbmFnZXIoKS5yZW1vdmVMYXVuY2hMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGF1bmNoZXNBZGRlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzQ2hhbmdlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxhdW5jaGVzUmVtb3ZlZChJTGF1bmNoW10gbGF1bmNoZXMpIHsKLQkJCQkvLyBub3QgaW50ZXJlc3RlZCB0byB0aGlzIGV2ZW50Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBTZXR0aW5nIExhdW5jaCBDb25maWd1cmF0aW9uICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5SlJFKCkgewotCQlTdHJpbmcganJlTmFtZSA9IHRoaXMuanJlLmdldE5hbWUoKTsgCi0JCVN0cmluZyB2bUlkID0gdGhpcy5qcmUuZ2V0Vk1JbnN0YWxsVHlwZSgpLmdldElkKCk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9KUkVfQ09OVEFJTkVSX1BBVEgsIGpyZU5hbWUpOwotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfSlJFX0NPTlRBSU5FUl9QQVRILCB2bUlkKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNwZWNpZnlQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSB0aGlzLmdldFByb2plY3QoKS5nZXROYW1lKCk7Ci0JCXRoaXMubGF1bmNoQ29uZmlnLnNldEF0dHJpYnV0ZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuQVRUUl9QUk9KRUNUX05BTUUsIHByb2plY3ROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3BlY2lmeU1haW5UeXBlKCkgewotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfTUFJTl9UWVBFX05BTUUsIHRoaXMuZ2V0TWFpblR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3BlY2lmeUNsYXNzcGF0aFByb3BlcnRpZXMoKSAgewotCQlMaXN0PFN0cmluZz4gY2xhc3NwYXRoOwotCQl0cnkgewotCQkJY2xhc3NwYXRoID0gdGhpcy5idWlsZENsYXNzcGF0aCgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cmVkIGdlbmVyYXRpbmcgYSBtZW1lbnRvIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfQ0xBU1NQQVRILCBjbGFzc3BhdGgpOwotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfREVGQVVMVF9DTEFTU1BBVEgsIGZhbHNlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENsYXNzcGF0aEVudHJ5ICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRTeXN0ZW1MaWJyYXJ5Q2xhc3NwYXRoRW50cnkoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJSVBhdGggc3lzdGVtTGlic1BhdGggPSBuZXcgUGF0aChKYXZhUnVudGltZS5KUkVfQ09OVEFJTkVSKTsKLQkJcmV0dXJuIEphdmFSdW50aW1lLm5ld1J1bnRpbWVDb250YWluZXJDbGFzc3BhdGhFbnRyeShzeXN0ZW1MaWJzUGF0aCwgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5TVEFOREFSRF9DTEFTU0VTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElSdW50aW1lQ2xhc3NwYXRoRW50cnkgZ2V0RGVmYXVsdFByb2plY3RDbGFzc3BhdGhFbnRyeSgpIHsKLQotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IHByb2plY3RFbnRyeSA9IEphdmFSdW50aW1lLm5ld0RlZmF1bHRQcm9qZWN0Q2xhc3NwYXRoRW50cnkodGhpcy5qYXZhUHJvamVjdCk7Ci0JCXByb2plY3RFbnRyeS5zZXRDbGFzc3BhdGhQcm9wZXJ0eShJUnVudGltZUNsYXNzcGF0aEVudHJ5LlVTRVJfQ0xBU1NFUyk7Ci0JCQotCQlyZXR1cm4gcHJvamVjdEVudHJ5OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRBcmNoaXZlQ2xhc3NwYXRoRW50cnkoSVBhdGggYXJjaGl2ZVBhdGgpIHsKLQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBhcmNoaXZlRW50cnkgPSBKYXZhUnVudGltZS5uZXdBcmNoaXZlUnVudGltZUNsYXNzcGF0aEVudHJ5KGFyY2hpdmVQYXRoKTsKLQkJYXJjaGl2ZUVudHJ5LnNldENsYXNzcGF0aFByb3BlcnR5KElSdW50aW1lQ2xhc3NwYXRoRW50cnkuVVNFUl9DTEFTU0VTKTsKLQkJCi0JCXJldHVybiBhcmNoaXZlRW50cnk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBMYXVuY2hDb25maWcgKioqKioqKioqKgotCQotCXByaXZhdGUgSUxhdW5jaCBzYXZlQW5kTGF1bmNoQ29uZmlnKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDEwKTsKLQkJSUxhdW5jaENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG51bGw7Ci0JCUlMYXVuY2ggcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNtLnN1YlRhc2soSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLkdFTkVSQVRJT05fU0FWSU5HX0xBVU5DSF9DT05GSUdfVEFTSyk7Ci0JCQljb25maWd1cmF0aW9uID0gdGhpcy5sYXVuY2hDb25maWcuZG9TYXZlKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gc2F2ZUV4Y2VwdGlvbikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBzYXZlIExhdW5jaENvbmZpZyIsIHNhdmVFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc20ud29ya2VkKDEpOwotCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQl0cnkgewotCQkJc20uc3ViVGFzayhKcHRDb21tb25Db3JlTWVzc2FnZXMuR0VORVJBVElPTl9MQVVOQ0hJTkdfQ09ORklHX1RBU0spOwotCQkJcmVzdWx0ID0gY29uZmlndXJhdGlvbi5sYXVuY2goSUxhdW5jaE1hbmFnZXIuUlVOX01PREUsIHNtLm5ld0NoaWxkKDkpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBsYXVuY2hFeGNlcHRpb24pIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJBbiBlcnJvciBvY2N1cmVkIGR1cmluZyBsYXVuY2giLCBsYXVuY2hFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE1haW4gYXJndW1lbnRzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmREZWJ1Z0FyZ3VtZW50KFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAodGhpcy5pc0RlYnVnKSB7Ci0JCQlzYi5hcHBlbmQoIiAtZGVidWciKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBRdWVyaWVzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSUxhdW5jaCBnZXRMYXVuY2goKSB7Ci0JCXJldHVybiB0aGlzLmxhdW5jaDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElMYXVuY2hNYW5hZ2VyIGdldExhdW5jaE1hbmFnZXIoKSB7Ci0JCXJldHVybiBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TGF1bmNoTWFuYWdlcigpOwotCX0KLQkKLQlwcml2YXRlIElWTUluc3RhbGwgZ2V0UHJvamVjdEpSRSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEphdmFSdW50aW1lLmdldFZNSW5zdGFsbCh0aGlzLmphdmFQcm9qZWN0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFV0aWxpdGllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRCb290c3RyYXBKYXJDbGFzc3BhdGhFbnRyeSgpIHsKLQkJcmV0dXJuIGdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeSh0aGlzLmJ1aWxkQm9vdHN0cmFwSmFyUGF0aCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggYnVpbGRCb290c3RyYXBKYXJQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5maW5kR2VuSmFyU3RhcnRpbmdXaXRoKHRoaXMuZ2V0Qm9vdHN0cmFwSmFyUHJlZml4KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVBhdGggZmluZEdlbkphclN0YXJ0aW5nV2l0aChTdHJpbmcgZ2VuSmFyTmFtZSkgewotCQl0cnkgewotCQkJRmlsZSBqYXJJbnN0YWxsRGlyID0gdGhpcy5nZXRCdW5kbGVQYXJlbnREaXIoSnB0Q29tbW9uQ29yZVBsdWdpbi5QTFVHSU5fSUQpOwotCi0JCQlMaXN0PEZpbGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RmlsZT4oKTsKLQkJCXRoaXMuZmluZEZpbGVTdGFydGluZ1dpdGgoZ2VuSmFyTmFtZSwgamFySW5zdGFsbERpciwgcmVzdWx0KTsKLQkJCWlmIChyZXN1bHQuaXNFbXB0eSgpKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kOiAiICsgZ2VuSmFyTmFtZSArICIjLiMuI3YjIyMuamFyIGluOiAiICsgamFySW5zdGFsbERpcik7ICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlGaWxlIGdlbkphckZpbGUgPSByZXN1bHQuZ2V0KDApOwotCQkJU3RyaW5nIGdlbkphclBhdGggPSBnZW5KYXJGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCXJldHVybiBuZXcgUGF0aChnZW5KYXJQYXRoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIEZpbGUgZ2V0QnVuZGxlUGFyZW50RGlyKFN0cmluZyBidW5kbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQotCQlpZiAoUGxhdGZvcm0uaW5EZXZlbG9wbWVudE1vZGUoKSkgewotCQkJTG9jYXRpb24gZWNsaXBzZUhvbWVMb2MgPSBQbGF0Zm9ybS5nZXRJbnN0YWxsTG9jYXRpb24oKTsKLQkJCVN0cmluZyBlY2xpcHNlSG9tZSA9IGVjbGlwc2VIb21lTG9jLmdldFVSTCgpLmdldFBhdGgoKTsKLQkJCWlmICggISBlY2xpcHNlSG9tZS5lbmRzV2l0aChQTFVHSU5TX0RJUikpIHsKLQkJCQllY2xpcHNlSG9tZSArPSBQTFVHSU5TX0RJUjsKLQkJCX0KLQkJCXJldHVybiBuZXcgRmlsZShlY2xpcHNlSG9tZSk7Ci0JCX0KLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShidW5kbGVOYW1lKTsKLQkJcmV0dXJuIEZpbGVMb2NhdG9yLmdldEJ1bmRsZUZpbGUoYnVuZGxlKS5nZXRQYXJlbnRGaWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJTGF1bmNoQ29uZmlndXJhdGlvbldvcmtpbmdDb3B5IGJ1aWxkTGF1bmNoQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5yZW1vdmVMYXVuY2hDb25maWd1cmF0aW9uKCk7Ci0KLQkJSUxhdW5jaE1hbmFnZXIgbWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gbWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfSkFWQV9BUFBMSUNBVElPTik7Ci0KLQkJcmV0dXJuIHR5cGUubmV3SW5zdGFuY2UobnVsbCwgdGhpcy5nZXRMYXVuY2hDb25maWdOYW1lKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlTGF1bmNoQ29uZmlndXJhdGlvbigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlJTGF1bmNoTWFuYWdlciBtYW5hZ2VyID0gdGhpcy5nZXRMYXVuY2hNYW5hZ2VyKCk7Ci0JCUlMYXVuY2hDb25maWd1cmF0aW9uVHlwZSB0eXBlID0gbWFuYWdlci5nZXRMYXVuY2hDb25maWd1cmF0aW9uVHlwZShJSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHMuSURfSkFWQV9BUFBMSUNBVElPTik7Ci0JCi0JCUlMYXVuY2hDb25maWd1cmF0aW9uW10gY29uZmlndXJhdGlvbnMgPSBtYW5hZ2VyLmdldExhdW5jaENvbmZpZ3VyYXRpb25zKHR5cGUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlMYXVuY2hDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uc1tpXTsKLQkJCWlmIChjb25maWd1cmF0aW9uLmdldE5hbWUoKS5lcXVhbHModGhpcy5nZXRMYXVuY2hDb25maWdOYW1lKCkpKSB7Ci0JCQkJY29uZmlndXJhdGlvbi5kZWxldGUoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaW5kRmlsZVN0YXJ0aW5nV2l0aChTdHJpbmcgZmlsZU5hbWUsIEZpbGUgZGlyZWN0b3J5LCBMaXN0PD8gc3VwZXIgRmlsZT4gbGlzdCkgewotCQlpZihkaXJlY3RvcnkubGlzdEZpbGVzKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeSk7ICAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZvciAoRmlsZSBmaWxlIDogZGlyZWN0b3J5Lmxpc3RGaWxlcygpKSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aChmaWxlTmFtZSkpIHsKLQkJCQlsaXN0LmFkZChmaWxlKTsKLQkJCX0KLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQl0aGlzLmZpbmRGaWxlU3RhcnRpbmdXaXRoKGZpbGVOYW1lLCBmaWxlLCBsaXN0KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3BlY2lmeVdvcmtpbmdEaXIoKSB7Ci0JCUZpbGUgd29ya2luZ0RpciA9IG5ldyBQYXRoKHRoaXMucHJvamVjdExvY2F0aW9uKS50b0ZpbGUoKTsKLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1dPUktJTkdfRElSRUNUT1JZLCB3b3JraW5nRGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGlzRGVidWcpIHsKLQkJdGhpcy5pc0RlYnVnID0gaXNEZWJ1ZzsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0pwdE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkxYzczYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0pwdE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnB0T3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWV4dGVuZHMgV3RwT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWltcGxlbWVudHMgSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyB7Ci0JCi0JcHJvdGVjdGVkIEpwdE9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCWZvciAoTGlicmFyeVZhbGlkYXRvciBsaWJyYXJ5VmFsaWRhdG9yIDogSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRMaWJyYXJ5VmFsaWRhdG9ycyh0aGlzKSkgewotCQkJc3RhdHVzID0gbGlicmFyeVZhbGlkYXRvci52YWxpZGF0ZSh0aGlzKTsKLQkJCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0pwdFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0pwdFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGY1MmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KcHRVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcHRVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlleHRlbmRzIFd0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWltcGxlbWVudHMgSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyB7Ci0JCi0JcHJvdGVjdGVkIEpwdFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIElTdGF0dXMgdmFsaWRhdGUoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGUoKTsKLQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQkJZm9yIChMaWJyYXJ5VmFsaWRhdG9yIGxpYnJhcnlWYWxpZGF0b3IgOiBKcHRDb21tb25Db3JlUGx1Z2luLmdldExpYnJhcnlWYWxpZGF0b3JzKHRoaXMpKSB7Ci0JCQlzdGF0dXMgPSBsaWJyYXJ5VmFsaWRhdG9yLnZhbGlkYXRlKHRoaXMpOwotCQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvTGlicmFyeVByb3ZpZGVyUHJvcGVydHlUZXN0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnByb3YvTGlicmFyeVByb3ZpZGVyUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiYjU2OS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJwcm92L0xpYnJhcnlQcm92aWRlclByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJwcm92OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklMaWJyYXJ5UHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5UHJvdmlkZXJQcm9wZXJ0eVRlc3RlcgotCQlleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQkKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAoISAocHJvcGVydHkuZXF1YWxzKCJpZCIpIHx8IHByb3BlcnR5LmVxdWFscygiZXh0ZW5kc0lkIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXx8ICEgKHJlY2VpdmVyIGluc3RhbmNlb2YgSUxpYnJhcnlQcm92aWRlcikgCi0JCQkJfHwgISAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykpIHsgCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUlMaWJyYXJ5UHJvdmlkZXIgbGlicmFyeVByb3ZpZGVyID0gKElMaWJyYXJ5UHJvdmlkZXIpIHJlY2VpdmVyOwotCQkKLQkJaWYgKHByb3BlcnR5LmVxdWFscygiaWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbGlicmFyeVByb3ZpZGVyLmdldElkKCkuZXF1YWxzKGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5LmVxdWFscygiZXh0ZW5kc0lkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKGxpYnJhcnlQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJaWYgKGxpYnJhcnlQcm92aWRlci5nZXRJZCgpLmVxdWFscyhleHBlY3RlZFZhbHVlKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQkJbGlicmFyeVByb3ZpZGVyID0gbGlicmFyeVByb3ZpZGVyLmdldEJhc2VQcm92aWRlcigpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJWYWxVdGlsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGliVmFsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGFmYjBjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJWYWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtKYXZhUGx1Z2luLlBMVUdJTl9JRDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5KcHRDb21tb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotCi1wdWJsaWMgY2xhc3MgTGliVmFsVXRpbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlKEl0ZXJhYmxlPElQYXRoPiBsaWJyYXJ5UGF0aHMsIFNldDxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJU2V0PFN0cmluZz4gY2xhc3NGaWxlTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCU1hcDxTdHJpbmcsU3RyaW5nPiBjbGFzc0ZpbGVOYW1lVG9DbGFzc05hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBjbGFzc05hbWVzKSB7Ci0JCQlTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCQljbGFzc0ZpbGVOYW1lcy5hZGQoY2xhc3NGaWxlTmFtZSk7Ci0JCQljbGFzc0ZpbGVOYW1lVG9DbGFzc05hbWUucHV0KGNsYXNzRmlsZU5hbWUsIGNsYXNzTmFtZSk7Ci0JCX0KLQkJCi0JCWZpbmFsIE1hcDxTdHJpbmcsSW50ZWdlcj4gY2xhc3NBcHBlYXJhbmNlQ291bnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEludGVnZXI+KCk7Ci0JCQotCQlmb3IgKFN0cmluZyBjbGFzc0ZpbGVOYW1lIDogY2xhc3NGaWxlTmFtZXMpIHsKLQkJCWNsYXNzQXBwZWFyYW5jZUNvdW50cy5wdXQoY2xhc3NGaWxlTmFtZSwgMCk7Ci0JCX0KLQkJCi0JCWZvciAoSVBhdGggbGlicmFyeVBhdGggOiBsaWJyYXJ5UGF0aHMpIHsKLQkJCWZpbmFsIEZpbGUgZmlsZSA9IGxpYnJhcnlQYXRoLnRvRmlsZSgpOwotCQkJCi0JCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCVppcEZpbGUgemlwID0gbnVsbDsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQl6aXAgPSBuZXcgWmlwRmlsZShmaWxlKTsKLQkJCQkJCi0JCQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBpdHIgPSB6aXAuZW50cmllcygpOyBpdHIuaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCQkJZmluYWwgWmlwRW50cnkgemlwRW50cnkgPSBpdHIubmV4dEVsZW1lbnQoKTsKLQkJCQkJCWZpbmFsIFN0cmluZyBuYW1lID0gemlwRW50cnkuZ2V0TmFtZSgpOwotCQkJCQkJCi0JCQkJCQlJbnRlZ2VyIGNvdW50ID0gY2xhc3NBcHBlYXJhbmNlQ291bnRzLmdldChuYW1lKTsKLQkJCQkJCQotCQkJCQkJaWYgKGNvdW50ICE9IG51bGwpIHsKLQkJCQkJCQljbGFzc0FwcGVhcmFuY2VDb3VudHMucHV0KG5hbWUsIGNvdW50ICsgMSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHt9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmICh6aXAgIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQl6aXAuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsSW50ZWdlcj4gZW50cnkgOiBjbGFzc0FwcGVhcmFuY2VDb3VudHMuZW50cnlTZXQoKSkgewotCQkJZmluYWwgaW50IGNvdW50ID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQotCQkJaWYgKGNvdW50ID09IDApIHsKLQkJCQlmaW5hbCBTdHJpbmcgY2xhc3NGaWxlTmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJCWZpbmFsIFN0cmluZyBjbGFzc05hbWUgPSBjbGFzc0ZpbGVOYW1lVG9DbGFzc05hbWUuZ2V0KGNsYXNzRmlsZU5hbWUpOwotCQkJCWZpbmFsIFN0cmluZyBtZXNzYWdlID0gCi0JCQkJCQlOTFMuYmluZChKcHRDb21tb25Db3JlTWVzc2FnZXMuVVNFUl9MSUJSQVJZX1ZBTElEQVRPUl9fQ0xBU1NfTk9UX0ZPVU5ELCBjbGFzc05hbWUpOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yQ29uZmlnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGlicmFyeVZhbGlkYXRvckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2E4NGFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RGcmFtZXdvcmtKYXZhUGx1Z2luLmxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXZhbHVhdGlvblJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRVhQUl9WQVIgPSAiY29uZmlnIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1BST1ZJREVSX0VYUFJfVkFSID0gImxpYnJhcnlQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJpdmF0ZSBFeHByZXNzaW9uIGVuYWJsZW1lbnRDb25kaXRpb247Ci0JCi0JCi0JTGlicmFyeVZhbGlkYXRvckNvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCXZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIHRoaXMucGx1Z2luSWQ7Ci0JfQotCQotCXZvaWQgc2V0UGx1Z2luSWQoU3RyaW5nIHBsdWdpbklkKSB7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzTmFtZTsKLQl9Ci0JCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQl9Ci0JCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RW5hYmxlbWVudENvbmRpdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZW5hYmxlbWVudENvbmRpdGlvbjsKLQl9Ci0JCi0Jdm9pZCBzZXRFbmFibGVtZW50Q29uZGl0aW9uKEV4cHJlc3Npb24gZW5hYmxlbWVudENvbmRpdGlvbikgewotCQl0aGlzLmVuYWJsZW1lbnRDb25kaXRpb24gPSBlbmFibGVtZW50Q29uZGl0aW9uOwotCX0KLQkKLQlwdWJsaWMgTGlicmFyeVZhbGlkYXRvciBnZXRMaWJyYXJ5VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gWFBvaW50VG9vbHMuaW5zdGFudGlhdGUoCi0JCQkJdGhpcy5wbHVnaW5JZCwgTGlicmFyeVZhbGlkYXRvck1hbmFnZXIuUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgCi0JCQkJdGhpcy5jbGFzc05hbWUsIExpYnJhcnlWYWxpZGF0b3IuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJRXZhbHVhdGlvbkNvbnRleHQgZXZhbENvbnRleHQgPSBuZXcgRXZhbHVhdGlvbkNvbnRleHQobnVsbCwgY29uZmlnKTsKLQkJZXZhbENvbnRleHQuc2V0QWxsb3dQbHVnaW5BY3RpdmF0aW9uKHRydWUpOwotCQlldmFsQ29udGV4dC5hZGRWYXJpYWJsZShDT05GSUdfRVhQUl9WQVIsIGNvbmZpZyk7Ci0JCWV2YWxDb250ZXh0LmFkZFZhcmlhYmxlKExJQlJBUllfUFJPVklERVJfRVhQUl9WQVIsIGNvbmZpZy5nZXRMaWJyYXJ5UHJvdmlkZXIoKSk7Ci0JCQotCQlpZiAodGhpcy5lbmFibGVtZW50Q29uZGl0aW9uICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJRXZhbHVhdGlvblJlc3VsdCBldmFsUmVzdWx0ID0gdGhpcy5lbmFibGVtZW50Q29uZGl0aW9uLmV2YWx1YXRlKGV2YWxDb250ZXh0KTsKLQkJCQkKLQkJCQlpZiAoZXZhbFJlc3VsdCA9PSBFdmFsdWF0aW9uUmVzdWx0LkZBTFNFKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJbG9nKGUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9saWJ2YWwvTGlicmFyeVZhbGlkYXRvck1hbmFnZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTdjMmViLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHMuWFBvaW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5LZXllZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotcHVibGljIGNsYXNzIExpYnJhcnlWYWxpZGF0b3JNYW5hZ2VyIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAibGlicmFyeVZhbGlkYXRvcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCA9IEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lEXyArIEVYVEVOU0lPTl9QT0lOVF9JRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX1ZBTElEQVRPUl9FTEVNRU5UID0gImxpYnJhcnlWYWxpZGF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCVVRFID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX0FUVFJJQlVURSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVNRU5UX0VMRU1FTlQgPSAiZW5hYmxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBMaWJyYXJ5VmFsaWRhdG9yTWFuYWdlciBJTlNUQU5DRSA9IG5ldyBMaWJyYXJ5VmFsaWRhdG9yTWFuYWdlcigpOwotCQotCQotCXB1YmxpYyBzdGF0aWMgTGlicmFyeVZhbGlkYXRvck1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBLZXllZFNldDxTdHJpbmcsIExpYnJhcnlWYWxpZGF0b3JDb25maWc+IGxpYnJhcnlWYWxpZGF0b3JDb25maWdzOwotCQotCQotCXByaXZhdGUgTGlicmFyeVZhbGlkYXRvck1hbmFnZXIoKSB7Ci0JCXRoaXMubGlicmFyeVZhbGlkYXRvckNvbmZpZ3MgPSBuZXcgS2V5ZWRTZXQ8U3RyaW5nLCBMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnPigpOwotCQlyZWFkRXh0ZW5zaW9ucygpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBMaWJyYXJ5VmFsaWRhdG9yfXMgCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPExpYnJhcnlWYWxpZGF0b3I+IGdldExpYnJhcnlWYWxpZGF0b3JzKGZpbmFsIEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8TGlicmFyeVZhbGlkYXRvcj4oCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TGlicmFyeVZhbGlkYXRvckNvbmZpZywgTGlicmFyeVZhbGlkYXRvcj4oCi0JCQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8TGlicmFyeVZhbGlkYXRvckNvbmZpZz4oCi0JCQkJCQkJCXRoaXMubGlicmFyeVZhbGlkYXRvckNvbmZpZ3MuZ2V0SXRlbVNldCgpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KExpYnJhcnlWYWxpZGF0b3JDb25maWcgbykgewotCQkJCQkJCQlyZXR1cm4gby5pc0VuYWJsZWRGb3IoY29uZmlnKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTGlicmFyeVZhbGlkYXRvciB0cmFuc2Zvcm0oTGlicmFyeVZhbGlkYXRvckNvbmZpZyBvKSB7Ci0JCQkJCQlyZXR1cm4gby5nZXRMaWJyYXJ5VmFsaWRhdG9yKCk7Ci0JCQkJCX0KLQkJCQl9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChMaWJyYXJ5VmFsaWRhdG9yIG8pIHsKLQkJCQlyZXR1cm4gbyAhPSBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbnMoKSB7Ci0JCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQotCQlmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgeHBvaW50IAotCQkJCT0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQotCQlpZiAoeHBvaW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJZmluYWwgTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IGNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiB4cG9pbnQuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0gICAgICAgIAlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0gICAgICAgIAkJY29uZmlncy5hZGQoZWxlbWVudCk7Ci0gICAgICAgIAl9Ci0JCX0KLQkJCi0JCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBjb25maWdzKSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKExJQlJBUllfVkFMSURBVE9SX0VMRU1FTlQpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZEV4dGVuc2lvbihlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJZmluYWwgTGlicmFyeVZhbGlkYXRvckNvbmZpZyBsdkNvbmZpZyA9IG5ldyBMaWJyYXJ5VmFsaWRhdG9yQ29uZmlnKCk7Ci0JCQkKLQkJCS8vIHBsdWctaW4gaWQKLQkJCWx2Q29uZmlnLnNldFBsdWdpbklkKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCQkJCi0JCQkvLyByZXNvdXJjZSBsb2NhdG9yIGlkCi0JCQlsdkNvbmZpZy5zZXRJZChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgSURfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCWlmICh0aGlzLmxpYnJhcnlWYWxpZGF0b3JDb25maWdzLmNvbnRhaW5zS2V5KGx2Q29uZmlnLmdldElkKCkpKSB7Ci0JCQkJbG9nRHVwbGljYXRlRXh0ZW5zaW9uKFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQsIElEX0FUVFJJQlVURSwgbHZDb25maWcuZ2V0SWQoKSk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQkvLyByZXNvdXJjZSBsb2NhdG9yIGNsYXNzIG5hbWUKLQkJCWx2Q29uZmlnLnNldENsYXNzTmFtZShmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgQ0xBU1NfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCS8vIGVuYWJsZW1lbnQKLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkIDogZWxlbWVudC5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJU3RyaW5nIGNoaWxkTmFtZSA9IGNoaWxkLmdldE5hbWUoKTsKLQkJCQlpZiAoY2hpbGROYW1lLmVxdWFscyhFTkFCTEVNRU5UX0VMRU1FTlQpKSB7Ci0JCQkJCUV4cHJlc3Npb24gZXhwcjsKLQkJCQkJdHJ5IHsKLQkJCQkJCWV4cHIgPSBFeHByZXNzaW9uQ29udmVydGVyLmdldERlZmF1bHQoKS5wZXJmb3JtKGNoaWxkKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlsb2coZSk7Ci0JCQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQkJCX0KLQkJCQkJbHZDb25maWcuc2V0RW5hYmxlbWVudENvbmRpdGlvbihleHByKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXRoaXMubGlicmFyeVZhbGlkYXRvckNvbmZpZ3MuYWRkSXRlbShsdkNvbmZpZy5nZXRJZCgpLCBsdkNvbmZpZyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE1ZTk4MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5KcHRDb21tb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5BYnN0cmFjdERhdGFNb2RlbFByb3ZpZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3REYXRhTW9kZWxQcm92aWRlcgotCWltcGxlbWVudHMgSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotewotCXByb3RlY3RlZCBBYnN0cmFjdEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlTZXQ8U3RyaW5nPiBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQUk9KRUNUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ09OVEFJTkVSX1BBVEgpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChGSUxFX05BTUUpOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRBSU5FUl9QQVRIKSkgewotCQkJSUNvbnRhaW5lciBzb3VyY2VMb2NhdGlvbiA9IGdldERlZmF1bHRDb250YWluZXIoKTsKLQkJCWlmIChzb3VyY2VMb2NhdGlvbiAhPSBudWxsICYmIHNvdXJjZUxvY2F0aW9uLmV4aXN0cygpKSB7Ci0JCQkJcmV0dXJuIHNvdXJjZUxvY2F0aW9uLmdldEZ1bGxQYXRoKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGSUxFX05BTUUpKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdEZpbGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVOYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05UQUlORVJfUEFUSCkKLQkJCQl8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJTEVfTkFNRSkpIHsKLQkJCXN0YXR1cyA9IHZhbGlkYXRlQ29udGFpbmVyUGF0aEFuZEZpbGVOYW1lKCk7Ci0JCX0KLQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUNvbnRhaW5lclBhdGhBbmRGaWxlTmFtZSgpIHsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQkvLyB2ZXJpZmllcyBjb250YWluZXIgaGFzIGJlZW4gc3BlY2lmaWVkLCBidXQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5IGluIG1vc3QgY2FzZXMuCi0JCQkvLyB0aGVyZSBpcyBhbG1vc3QgYWx3YXlzIGEgZGVmYXVsdCwgYW5kIHRoZSBuZXcgZmlsZSB3aXphcmQgZG9lcyB0aGlzIHZhbGlkYXRpb24gYXMgd2VsbC4KLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lELCAKLQkJCQlKcHRDb21tb25Db3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OVEFJTkVSX05PVF9TUEVDSUZJRUQpOwotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KEZJTEVfTkFNRSk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGZpbGVOYW1lKSkgewotCQkJLy8gdmVyaWZpZXMgZmlsZSBuYW1lIGhhcyBiZWVuIHNwZWNpZmllZCwgYnV0IHNob3VsZCBiZSB1bm5lY2Vzc2FyeSBpbiBtb3N0IGNhc2VzLgotCQkJLy8gdGhlcmUgaXMgYWxtb3N0IGFsd2F5cyBhIGRlZmF1bHQsIGFuZCB0aGUgbmV3IGZpbGUgd2l6YXJkIGRvZXMgdGhpcyB2YWxpZGF0aW9uIGFzIHdlbGwuCi0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb21tb25Db3JlTWVzc2FnZXMuVkFMSURBVEVfRklMRV9OQU1FX05PVF9TUEVDSUZJRUQpOwotCQl9Ci0JCWlmIChjb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpLmV4aXN0cygpKSB7Ci0JCQkvLyB2ZXJpZmllcyBmaWxlIGRvZXMgbm90IGV4aXN0LCBidXQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5IGluIG1vc3QgY2FzZXMuCi0JCQkvLyB0aGUgbmV3IGZpbGUgd2l6YXJkIGRvZXMgdGhpcyB2YWxpZGF0aW9uIGFzIHdlbGwuCi0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb21tb25Db3JlTWVzc2FnZXMuVkFMSURBVEVfRklMRV9BTFJFQURZX0VYSVNUUyk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0Q29udGFpbmVyUGF0aCgpIHsKLQkJcmV0dXJuIChJUGF0aCkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgewotCQlJUGF0aCBjb250YWluZXJQYXRoID0gZ2V0Q29udGFpbmVyUGF0aCgpOwotCQlpZiAoY29udGFpbmVyUGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsgCi0JCX0KLQkJcmV0dXJuIFBsYXRmb3JtVG9vbHMuZ2V0Q29udGFpbmVyKGNvbnRhaW5lclBhdGgpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdChnZXRDb250YWluZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJcmV0dXJuIChjb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogY29udGFpbmVyLmdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiZXN0IGd1ZXNzIHNvdXJjZSBsb2NhdGlvbiBmb3IgdGhlIGZvciB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXREZWZhdWx0Q29udGFpbmVyKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IocHJvamVjdCkuZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24ocHJvamVjdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2MzVjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQkvKioKLQkgKiBPcHRpb25hbCwgdHlwZSB7QGxpbmsgSVByb2plY3R9LCBnaXZlcyBhIGNsdWUgYXMgdG8gdGhlIGRlZmF1bHQgY29udGFpbmVyIHBhdGgKLQkgKi8KLQlTdHJpbmcgUFJPSkVDVCA9ICJKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSB7QGxpbmsgSVBhdGh9LCBpZGVudGlmaWVzIHRoZSBmdWxsIHBhdGggdG8gdGhlIGNvbnRhaW5lciBpbiB3aGljaCAKLQkgKiB0aGUgZmlsZSBzaG91bGQgYmUgY3JlYXRlZAotCSAqLwotCVN0cmluZyBDT05UQUlORVJfUEFUSCA9ICJKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRIIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUge0BsaW5rIFN0cmluZ30sIGlkZW50aWZpZXMgdGhlIGZpbGUgbmFtZQotCSAqLwotCVN0cmluZyBGSUxFX05BTUUgPSAiSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9Nb2R1bGVSZXNvdXJjZUxvY2F0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL01vZHVsZVJlc291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDQwODFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL01vZHVsZVJlc291cmNlTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBNb2R1bGVSZXNvdXJjZUxvY2F0b3IKLQkJZXh0ZW5kcyBTaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yIHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvbGRlciByZXByZXNlbnRpbmcgdGhlICJNRVRBLUlORiIgcnVudGltZSBsb2NhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJQ29udGFpbmVyIGdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCXJldHVybiBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZvbGRlcihNRVRBX0lORl9QQVRIKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCXJldHVybiBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldEZpbGUocnVudGltZVBhdGgpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVBhdGggZ2V0UnVudGltZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCUlGaWxlIGZpbGUgPSBQbGF0Zm9ybVRvb2xzLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUlWaXJ0dWFsRm9sZGVyIHJvb3QgPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpOwotCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBmaW5kVmlydHVhbEZpbGUocm9vdCwgZmlsZSk7Ci0JCWlmICh2RmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdkZpbGUuZ2V0UnVudGltZVBhdGgoKS5tYWtlUmVsYXRpdmUoKTsKLQkJfQotCQkvLyBjb3VsZG4ndCBmaW5kIGl0LiAgdHJ5IHRoZSBzdXBlci1jYXNlCi0JCXJldHVybiBzdXBlci5nZXRSdW50aW1lUGF0aChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotCX0KLQkKLQlwcml2YXRlIElWaXJ0dWFsRmlsZSBmaW5kVmlydHVhbEZpbGUoSVZpcnR1YWxGb2xkZXIgdkZvbGRlciwgSUZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJZm9yIChJVmlydHVhbFJlc291cmNlIHZSZXNvdXJjZSA6IHZGb2xkZXIubWVtYmVycygpKSB7Ci0JCQkJaWYgKHZSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCUlWaXJ0dWFsRmlsZSB2RmlsZSA9IChJVmlydHVhbEZpbGUpIHZSZXNvdXJjZTsKLQkJCQkJaWYgKGZpbGUuZXF1YWxzKHZGaWxlLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpKSkgewotCQkJCQkJcmV0dXJuIHZGaWxlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHZSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GT0xERVIpIHsKLQkJCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gZmluZFZpcnR1YWxGaWxlKChJVmlydHVhbEZvbGRlcikgdlJlc291cmNlLCBmaWxlKTsKLQkJCQkJaWYgKHZGaWxlICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiB2RmlsZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUGx1Z2luUmVzb3VyY2VMb2NhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9QbHVnaW5SZXNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjZDNmZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9QbHVnaW5SZXNvdXJjZUxvY2F0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZGUuY29yZS5wcm9qZWN0LklCdW5kbGVQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmNvcmUucHJvamVjdC5JQnVuZGxlUHJvamVjdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBQbHVnaW5SZXNvdXJjZUxvY2F0b3IKLQkJZXh0ZW5kcyBTaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yIHsKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUNvbnRhaW5lciBnZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJQ29udGFpbmVyIHJvb3QgPSBnZXRCdW5kbGVSb290KHByb2plY3QpOwotCQkJcmV0dXJuIHJvb3QuZ2V0Rm9sZGVyKE1FVEFfSU5GX1BBVEgpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBmYWxsIHRocm91Z2gKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFJlc291cmNlTG9jYXRpb24ocHJvamVjdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJdHJ5IHsKLQkJCUlDb250YWluZXIgcm9vdCA9IGdldEJ1bmRsZVJvb3QocHJvamVjdCk7Ci0JCQlJUGF0aCByZXNvdXJjZVBhdGggPSByb290LmdldEZ1bGxQYXRoKCkuYXBwZW5kKHJ1bnRpbWVQYXRoKTsKLQkJCWlmIChwcm9qZWN0LmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VQYXRoOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBmYWxsIHRocm91Z2gKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGNlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0UmVzb3VyY2VQYXRoKHByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJlc291cmNlUGF0aCkgewotCQlJRmlsZSBmaWxlID0gUGxhdGZvcm1Ub29scy5nZXRGaWxlKHJlc291cmNlUGF0aCk7Ci0JCXRyeSB7Ci0JCQlJQ29udGFpbmVyIHJvb3QgPSBnZXRCdW5kbGVSb290KHByb2plY3QpOwotCQkJaWYgKHJvb3QuY29udGFpbnMoZmlsZSkpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VQYXRoLm1ha2VSZWxhdGl2ZVRvKHJvb3QuZ2V0RnVsbFBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRSdW50aW1lUGF0aChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXRCdW5kbGVSb290KElQcm9qZWN0IHByb2plY3QpIAotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJSUJ1bmRsZVByb2plY3RTZXJ2aWNlIHNlcnZpY2UgPSBnZXRCdW5kbGVQcm9qZWN0U2VydmljZSgpOwotCQlJQnVuZGxlUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gc2VydmljZS5nZXREZXNjcmlwdGlvbihwcm9qZWN0KTsKLQkJSVBhdGggcGF0aCA9IGRlc2NyaXB0aW9uLmdldEJ1bmRsZVJvb3QoKTsKLQkJcmV0dXJuIChwYXRoID09IG51bGwpID8gcHJvamVjdCA6IHByb2plY3QuZ2V0Rm9sZGVyKHBhdGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUJ1bmRsZVByb2plY3RTZXJ2aWNlIGdldEJ1bmRsZVByb2plY3RTZXJ2aWNlKCkgewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBKcHRDb21tb25Db3JlUGx1Z2luLmluc3RhbmNlKCkuZ2V0QnVuZGxlKCkuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlTZXJ2aWNlUmVmZXJlbmNlPElCdW5kbGVQcm9qZWN0U2VydmljZT4gcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElCdW5kbGVQcm9qZWN0U2VydmljZS5jbGFzcyk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUJ1bmRsZVByb2plY3RTZXJ2aWNlIHNlcnZpY2UgPSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JDb25maWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1Jlc291cmNlTG9jYXRvckNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmExYjE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1Jlc291cmNlTG9jYXRvckNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmludGVybmFsLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrSmF2YVBsdWdpbi5sb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FdmFsdWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VMb2NhdG9yQ29uZmlnIAotCQlpbXBsZW1lbnRzIENvbXBhcmFibGU8UmVzb3VyY2VMb2NhdG9yQ29uZmlnPiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9FTkFCTEVNRU5UX1ZBUklBQkxFID0gInByb2plY3QiOyAgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKLQlwcml2YXRlIFByaW9yaXR5IHByaW9yaXR5OwotCXByaXZhdGUgRXhwcmVzc2lvbiBlbmFibGVtZW50Q29uZGl0aW9uOwotCQotCQotCVJlc291cmNlTG9jYXRvckNvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuaWQ7Ci0JfQotCQotCXZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpIHsKLQkJcmV0dXJuIHRoaXMucGx1Z2luSWQ7Ci0JfQotCQotCXZvaWQgc2V0UGx1Z2luSWQoU3RyaW5nIHBsdWdpbklkKSB7Ci0JCXRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzTmFtZTsKLQl9Ci0JCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQl9Ci0JCi0JcHVibGljIFByaW9yaXR5IGdldFByaW9yaXR5KCkgewotCQlyZXR1cm4gdGhpcy5wcmlvcml0eTsKLQl9Ci0JCi0Jdm9pZCBzZXRQcmlvcml0eShQcmlvcml0eSBwcmlvcml0eSkgewotCQl0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7Ci0JfQotCQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEVuYWJsZW1lbnRDb25kaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVuYWJsZW1lbnRDb25kaXRpb247Ci0JfQotCQotCXZvaWQgc2V0RW5hYmxlbWVudENvbmRpdGlvbihFeHByZXNzaW9uIGVuYWJsZW1lbnRDb25kaXRpb24pIHsKLQkJdGhpcy5lbmFibGVtZW50Q29uZGl0aW9uID0gZW5hYmxlbWVudENvbmRpdGlvbjsKLQl9Ci0JCi0JcHVibGljIFJlc291cmNlTG9jYXRvciBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7Ci0JCXJldHVybiBYUG9pbnRUb29scy5pbnN0YW50aWF0ZSgKLQkJCQl0aGlzLnBsdWdpbklkLCBSZXNvdXJjZUxvY2F0b3JNYW5hZ2VyLlFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQsIAotCQkJCXRoaXMuY2xhc3NOYW1lLCBSZXNvdXJjZUxvY2F0b3IuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRGb3IoSVByb2plY3QgcHJvamVjdCkgewotCQlFdmFsdWF0aW9uQ29udGV4dCBldmFsQ29udGV4dCA9IG5ldyBFdmFsdWF0aW9uQ29udGV4dChudWxsLCBwcm9qZWN0KTsKLQkJZXZhbENvbnRleHQuc2V0QWxsb3dQbHVnaW5BY3RpdmF0aW9uKHRydWUpOwotCQlldmFsQ29udGV4dC5hZGRWYXJpYWJsZShQUk9KRUNUX0VOQUJMRU1FTlRfVkFSSUFCTEUsIHByb2plY3QpOwotCQkKLQkJaWYgKHRoaXMuZW5hYmxlbWVudENvbmRpdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUV2YWx1YXRpb25SZXN1bHQgZXZhbFJlc3VsdCA9IHRoaXMuZW5hYmxlbWVudENvbmRpdGlvbi5ldmFsdWF0ZShldmFsQ29udGV4dCk7Ci0JCQkJCi0JCQkJaWYgKGV2YWxSZXN1bHQgPT0gRXZhbHVhdGlvblJlc3VsdC5GQUxTRSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWxvZyhlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKFJlc291cmNlTG9jYXRvckNvbmZpZyBvdGhlcikgewotCQlyZXR1cm4gUHJpb3JpdHkuY29tcGFyZSh0aGlzLnByaW9yaXR5LCBvdGhlci5wcmlvcml0eSk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgZW51bSBQcmlvcml0eSB7Ci0JCQotCQkvKiBUaGUgbG93ZXN0IHByaW9yaXR5IGZvciBhIHJlc291cmNlIGxvY2F0b3IgKi8KLQkJTE9XRVNUKDYsICJsb3dlc3QiKSwgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyogVGhlIHNlY29uZCBsb3dlc3QgcHJpb3JpdHkgZm9yIGEgcmVzb3VyY2UgbG9jYXRvciAqLwotCQlMT1dFUig1LCAibG93ZXIiKSwgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyogVGhlIHRoaXJkIGxvd2VzdCBwcmlvcml0eSBmb3IgYSByZXNvdXJjZSBsb2NhdG9yICovCi0JCUxPVyg0LCAibG93IiksIC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qIFRoZSBkZWZhdWx0IHByaW9yaXR5IGZvciBhIHJlc291cmNlIGxvY2F0b3IgKi8KLQkJTk9STUFMKDMsICJub3JtYWwiKSwgLy8kTk9OLU5MUy0xJAotCQkKLQkJLyogVGhlIHRoaXJkIGhpZ2hlc3QgcHJpb3JpdHkgZm9yIGEgcmVzb3VyY2UgbG9jYXRvciAqLwotCQlISUdIKDIsICJoaWdoIiksIC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qIFRoZSBzZWNvbmQgaGlnaGVzdCBwcmlvcml0eSBmb3IgYSByZXNvdXJjZSBsb2NhdG9yICovCi0JCUhJR0hFUigxLCAiaGlnaGVyIiksIC8vJE5PTi1OTFMtMSQKLQkJCi0JCS8qIFRoZSBoaWdoZXN0IHByaW9yaXR5IGZvciBhIHJlc291cmNlIGxvY2F0b3IgKi8KLQkJSElHSEVTVCgwLCAiaGlnaGVzdCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkKLQkJcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZShQcmlvcml0eSBwcmlvcml0eTEsIFByaW9yaXR5IHByaW9yaXR5MikgewotCQkJcmV0dXJuIHByaW9yaXR5MS52YWx1ZS5jb21wYXJlVG8ocHJpb3JpdHkyLnZhbHVlKTsKLQkJfQotCQkKLQkJcHVibGljIHN0YXRpYyBQcmlvcml0eSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKLQkJCWlmIChsaXRlcmFsID09IG51bGwpIHsKLQkJCQlyZXR1cm4gTk9STUFMOwotCQkJfQotCQkJZm9yIChQcmlvcml0eSBwcmlvcml0eSA6IHZhbHVlcygpKSB7Ci0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChsaXRlcmFsLCBwcmlvcml0eS5saXRlcmFsKSkgewotCQkJCQlyZXR1cm4gcHJpb3JpdHk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCQotCQlwcml2YXRlIEludGVnZXIgdmFsdWU7Ci0JCXByaXZhdGUgU3RyaW5nIGxpdGVyYWw7Ci0JCQotCQkKLQkJcHJpdmF0ZSBQcmlvcml0eShpbnQgdmFsdWUsIFN0cmluZyBsaXRlcmFsKSB7Ci0JCQl0aGlzLnZhbHVlID0gSW50ZWdlci52YWx1ZU9mKHZhbHVlKTsKLQkJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLmxpdGVyYWw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JNYW5hZ2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9SZXNvdXJjZUxvY2F0b3JNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZmI5ZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLmZpbmRSZXF1aXJlZEF0dHJpYnV0ZTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHMubG9nOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy5sb2dEdXBsaWNhdGVFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLmxvZ0ludmFsaWRWYWx1ZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yQ29uZmlnLlByaW9yaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLlhQb2ludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5LZXllZFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotcHVibGljIGNsYXNzIFJlc291cmNlTG9jYXRvck1hbmFnZXIgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJyZXNvdXJjZUxvY2F0b3JzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQgPSBKcHRDb21tb25Db3JlUGx1Z2luLlBMVUdJTl9JRF8gKyBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfTE9DQVRPUl9FTEVNRU5UID0gInJlc291cmNlTG9jYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJVVEUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX0FUVFJJQlVURSA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkFCTEVNRU5UX0VMRU1FTlQgPSAiZW5hYmxlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUxvY2F0b3JNYW5hZ2VyIElOU1RBTkNFID0gbmV3IFJlc291cmNlTG9jYXRvck1hbmFnZXIoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIFJlc291cmNlTG9jYXRvck1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBLZXllZFNldDxTdHJpbmcsIFJlc291cmNlTG9jYXRvckNvbmZpZz4gcmVzb3VyY2VMb2NhdG9yQ29uZmlnczsKLQkKLQkKLQlwcml2YXRlIFJlc291cmNlTG9jYXRvck1hbmFnZXIoKSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdG9yQ29uZmlncyA9IG5ldyBLZXllZFNldDxTdHJpbmcsIFJlc291cmNlTG9jYXRvckNvbmZpZz4oKTsKLQkJcmVhZEV4dGVuc2lvbnMoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgUmVzb3VyY2VMb2NhdG9yfSBvZiBoaWdoZXN0IHByaW9yaXR5IHRoYXQgaXMgYWNjZXB0YWJsZQotCSAqIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUxvY2F0b3IgZ2V0UmVzb3VyY2VMb2NhdG9yKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSXRlcmF0b3I8UmVzb3VyY2VMb2NhdG9yPiBzdHJlYW0gPSBuZXcgRmlsdGVyaW5nSXRlcmFibGU8UmVzb3VyY2VMb2NhdG9yPigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxSZXNvdXJjZUxvY2F0b3JDb25maWcsIFJlc291cmNlTG9jYXRvcj4oCi0JCQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8UmVzb3VyY2VMb2NhdG9yQ29uZmlnPigKLQkJCQkJCQkJbmV3IFRyZWVTZXQ8UmVzb3VyY2VMb2NhdG9yQ29uZmlnPih0aGlzLnJlc291cmNlTG9jYXRvckNvbmZpZ3MuZ2V0SXRlbVNldCgpKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChSZXNvdXJjZUxvY2F0b3JDb25maWcgbykgewotCQkJCQkJCQlyZXR1cm4gby5pc0VuYWJsZWRGb3IocHJvamVjdCk7Ci0JCQkJCQkJfQotCQkJCQkJfSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFJlc291cmNlTG9jYXRvciB0cmFuc2Zvcm0oUmVzb3VyY2VMb2NhdG9yQ29uZmlnIG8pIHsKLQkJCQkJCXJldHVybiBvLmdldFJlc291cmNlTG9jYXRvcigpOwotCQkJCQl9Ci0JCQkJfSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoUmVzb3VyY2VMb2NhdG9yIG8pIHsKLQkJCQlyZXR1cm4gbyAhPSBudWxsOwotCQkJfQotCQl9Lml0ZXJhdG9yKCk7Ci0JCXJldHVybiAoc3RyZWFtLmhhc05leHQoKSkgPyBzdHJlYW0ubmV4dCgpIDogbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRFeHRlbnNpb25zKCkgewotCQlmaW5hbCBJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQkKLQkJZmluYWwgSUV4dGVuc2lvblBvaW50IHhwb2ludCAKLQkJCQk9IHJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQpOwotCQkKLQkJaWYgKHhwb2ludCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCWZpbmFsIExpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBjb25maWdzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JCQotCQlmb3IgKElFeHRlbnNpb24gZXh0ZW5zaW9uIDogeHBvaW50LmdldEV4dGVuc2lvbnMoKSkgewotICAgICAgICAJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSkgewotICAgICAgICAJCWNvbmZpZ3MuYWRkKGVsZW1lbnQpOwotICAgICAgICAJfQotCQl9Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogY29uZmlncykgewotCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhSRVNPVVJDRV9MT0NBVE9SX0VMRU1FTlQpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZEV4dGVuc2lvbihlbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJZmluYWwgUmVzb3VyY2VMb2NhdG9yQ29uZmlnIHJsQ29uZmlnID0gbmV3IFJlc291cmNlTG9jYXRvckNvbmZpZygpOwotCQkJCi0JCQkvLyBwbHVnLWluIGlkCi0JCQlybENvbmZpZy5zZXRQbHVnaW5JZChlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLQkJCQotCQkJLy8gcmVzb3VyY2UgbG9jYXRvciBpZAotCQkJcmxDb25maWcuc2V0SWQoZmluZFJlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnQsIElEX0FUVFJJQlVURSkpOwotCQkJCi0JCQlpZiAodGhpcy5yZXNvdXJjZUxvY2F0b3JDb25maWdzLmNvbnRhaW5zS2V5KHJsQ29uZmlnLmdldElkKCkpKSB7Ci0JCQkJbG9nRHVwbGljYXRlRXh0ZW5zaW9uKFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQsIElEX0FUVFJJQlVURSwgcmxDb25maWcuZ2V0SWQoKSk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQkvLyByZXNvdXJjZSBsb2NhdG9yIGNsYXNzIG5hbWUKLQkJCXJsQ29uZmlnLnNldENsYXNzTmFtZShmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgQ0xBU1NfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCS8vIHByaW9yaXR5Ci0JCQlTdHJpbmcgcHJpb3JpdHlTdHJpbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShQUklPUklUWV9BVFRSSUJVVEUpLnRyaW0oKTsKLQkJCVByaW9yaXR5IHByaW9yaXR5ID0gUHJpb3JpdHkuZ2V0KHByaW9yaXR5U3RyaW5nKTsKLQkJCWlmIChwcmlvcml0eSA9PSBudWxsKSB7Ci0JCQkJbG9nSW52YWxpZFZhbHVlKGVsZW1lbnQsIFBSSU9SSVRZX0FUVFJJQlVURSwgcHJpb3JpdHlTdHJpbmcpOwotCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJsQ29uZmlnLnNldFByaW9yaXR5KHByaW9yaXR5KTsKLQkJCQotCQkJLy8gZW5hYmxlbWVudAotCQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGQgOiBlbGVtZW50LmdldENoaWxkcmVuKCkpIHsKLQkJCQlTdHJpbmcgY2hpbGROYW1lID0gY2hpbGQuZ2V0TmFtZSgpOwotCQkJCWlmIChjaGlsZE5hbWUuZXF1YWxzKEVOQUJMRU1FTlRfRUxFTUVOVCkpIHsKLQkJCQkJRXhwcmVzc2lvbiBleHByOwotCQkJCQl0cnkgewotCQkJCQkJZXhwciA9IEV4cHJlc3Npb25Db252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLnBlcmZvcm0oY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWxvZyhlKTsKLQkJCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCQkJfQotCQkJCQlybENvbmZpZy5zZXRFbmFibGVtZW50Q29uZGl0aW9uKGV4cHIpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdGhpcy5yZXNvdXJjZUxvY2F0b3JDb25maWdzLmFkZEl0ZW0ocmxDb25maWcuZ2V0SWQoKSwgcmxDb25maWcpOwotCQl9Ci0JCWNhdGNoIChYUG9pbnRFeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlIGFuZCBjb250aW51ZS4gVGhlIHByb2JsZW0gaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZCB0byB0aGUgdXNlcgotCQkJLy8gaW4gdGhlIGxvZy4KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1NpbXBsZUphdmFSZXNvdXJjZUxvY2F0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1MGYwOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9TaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLkoyRUVDb25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVKYXZhUmVzb3VyY2VMb2NhdG9yIAotCQlpbXBsZW1lbnRzIFJlc291cmNlTG9jYXRvciB7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJUGF0aCBNRVRBX0lORl9QQVRIID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5NRVRBX0lORik7Ci0JCi0JLyoqCi0JICogU2ltcGx5IGVuc3VyZSB0aGUgY29udGFpbmVyIGlzIGVpdGhlcjoKLQkgKiAtIG9uIHRoZSBqYXZhIHByb2plY3QgY2xhc3NwYXRoCi0JICogICBvcgotCSAqIC0gaW4gdGhlIG5vbi1qYXZhIHJlc291cmNlcywgYnV0IG5vdCBpbiB0aGUgcHJvamVjdCBvdXRwdXQgbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QsIElDb250YWluZXIgY29udGFpbmVyKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoamF2YVByb2plY3QuaXNPbkNsYXNzcGF0aChjb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQl0cnkgewotCQkJSVBhdGggb3V0cHV0TG9jYXRpb24gPSBqYXZhUHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQkJaWYgKGNvbnRhaW5lci5lcXVhbHMocHJvamVjdCkgJiYgb3V0cHV0TG9jYXRpb24uaXNQcmVmaXhPZihjb250YWluZXIuZ2V0RnVsbFBhdGgoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWZvciAoT2JqZWN0IHJlc291cmNlIDogamF2YVByb2plY3QuZ2V0Tm9uSmF2YVJlc291cmNlcygpKSB7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSByZXNvdXJjZTsKLQkJCQkJaWYgKChmb2xkZXIuZXF1YWxzKGNvbnRhaW5lcikgfHwgZm9sZGVyLmNvbnRhaW5zKGNvbnRhaW5lcikpCi0JCQkJCQkJJiYgISBvdXRwdXRMb2NhdGlvbi5pc1ByZWZpeE9mKGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGptZSk7Ci0JCQkvLyBvbmx5IGhhcHBlbnMgaWYgdGhlIGphdmEgcHJvamVjdCBkb2Vzbid0IGV4aXN0LiAgZmFsbCB0aHJvdWdoLgotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIAotCSAqIC0gdGhlIGZpcnN0IHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAoc291cmNlIGZvbGRlcikgTUVUQS1JTkYgZm9sZGVyIGlmIGl0IGV4aXN0cywgCi0JICogICAgb3IgCi0JICogLSB0aGUgcHJvamVjdCByb290ZWQgTUVUQS1JTkYgZm9sZGVyIGlmIGl0IGV4aXN0cwotCSAqICAgIG9yIAotCSAqIC0gdGhlIG5vbi1leGlzdGVudCBNRVRBLUlORiBmb2xkZXIgaW4gdGhlIGZpcnN0IHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAoc291cmNlIGZvbGRlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRhaW5lciBnZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGdldEphdmFQcm9qZWN0KHByb2plY3QpOwotCQlJQ29udGFpbmVyIGRlZmF1bHRMb2NhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgOiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKSB7Ci0JCQkJaWYgKHJvb3QuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0JCQkJCUlDb250YWluZXIgcm9vdENvbnRhaW5lciA9IChJQ29udGFpbmVyKSByb290LmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQlJRm9sZGVyIG1ldGFJbmZGb2xkZXIgPSByb290Q29udGFpbmVyLmdldEZvbGRlcihNRVRBX0lORl9QQVRIKTsKLQkJCQkJaWYgKG1ldGFJbmZGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJCXJldHVybiBtZXRhSW5mRm9sZGVyOwotCQkJCQl9Ci0JCQkJCWlmIChkZWZhdWx0TG9jYXRpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gaG9sZCBvbiB0byB0aGlzIGluIGNhc2UgdGhlIE1FVEEtSU5GIGZvbGRlciBjYW4ndCBiZSBmb3VuZAotCQkJCQkJZGVmYXVsdExvY2F0aW9uID0gbWV0YUluZkZvbGRlcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCUlGb2xkZXIgbWV0YUluZkZvbGRlciA9IHByb2plY3QuZ2V0Rm9sZGVyKE1FVEFfSU5GX1BBVEgpOwotCQkJaWYgKG1ldGFJbmZGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gbWV0YUluZkZvbGRlcjsKLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJLy8gb25seSBoYXBwZW5zIGlmIHRoZSBqYXZhIHByb2plY3QgZG9lc24ndCBleGlzdCBvciB0aGVyZSBpcyBzb21lIHByb2JsZW0gd2l0aCB0aGUgCi0JCQkvLyBqYXZhIHJlc291cmNlcy4gIGZhbGwgdGhyb3VnaC4KLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGptZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBkZWZhdWx0TG9jYXRpb247Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0JCUlQYXRoIGZpcnN0UmVzb3VyY2VQYXRoID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpIHsKLQkJCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJSUNvbnRhaW5lciByb290Q29udGFpbmVyID0gKElDb250YWluZXIpIHJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJCUlQYXRoIHJlc291cmNlUGF0aCA9IHJvb3RDb250YWluZXIuZ2V0RnVsbFBhdGgoKS5hcHBlbmQocnVudGltZVBhdGgpOwotCQkJCQlpZiAoZmlyc3RSZXNvdXJjZVBhdGggPT0gbnVsbCkgewotCQkJCQkJZmlyc3RSZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7Ci0JCQkJCX0KLQkJCQkJSUZpbGUgZmlsZSA9IHByb2plY3QuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCXJldHVybiBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGptZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmlyc3RSZXNvdXJjZVBhdGg7Ci0JfQotCQotCXB1YmxpYyBJUGF0aCBnZXRSdW50aW1lUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gZ2V0SmF2YVByb2plY3QocHJvamVjdCk7Ci0JCUlGaWxlIGZpbGUgPSBQbGF0Zm9ybVRvb2xzLmdldEZpbGUocmVzb3VyY2VQYXRoKTsKLQkJdHJ5IHsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpIHsKLQkJCQlpZiAocm9vdC5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJSUNvbnRhaW5lciByb290Q29udGFpbmVyID0gKElDb250YWluZXIpIHJvb3QuZ2V0VW5kZXJseWluZ1Jlc291cmNlKCk7Ci0JCQkJCWlmIChyb290Q29udGFpbmVyLmNvbnRhaW5zKGZpbGUpKSB7Ci0JCQkJCQlyZXR1cm4gcmVzb3VyY2VQYXRoLm1ha2VSZWxhdGl2ZVRvKHJvb3RDb250YWluZXIuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coam1lKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VQYXRoLm1ha2VSZWxhdGl2ZVRvKHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7Ci0JfQotCQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9XZWJNb2R1bGVSZXNvdXJjZUxvY2F0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1dlYk1vZHVsZVJlc291cmNlTG9jYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZmZmU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL1dlYk1vZHVsZVJlc291cmNlTG9jYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBXZWJNb2R1bGVSZXNvdXJjZUxvY2F0b3IKLQlleHRlbmRzIE1vZHVsZVJlc291cmNlTG9jYXRvcnsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElQYXRoIFdFQl9JTkZfQ0xBU1NFU19QQVRIID0gbmV3IFBhdGgoSjJFRUNvbnN0YW50cy5XRUJfSU5GX0NMQVNTRVMpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9sZGVyIHJlcHJlc2VudGluZyB0aGUgIldFQi1JTkYvY2xhc3Nlcy9NRVRBLUlORiIgbG9jYXRpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUNvbnRhaW5lciBnZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQlyZXR1cm4gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRGb2xkZXIoV0VCX0lORl9DTEFTU0VTX1BBVEguYXBwZW5kKE1FVEFfSU5GX1BBVEgpKS5nZXRVbmRlcmx5aW5nRm9sZGVyKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbCByZXNvdXJjZSBwYXRoIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gcnVudGltZSBsb2NhdGlvbiBhcHBlbmRlZAotCSAqIHRvIHRoZSAiV0VCLUlORi9jbGFzc2VzIiBsb2NhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJUGF0aCBnZXRSZXNvdXJjZVBhdGgoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlc291cmNlUGF0aChwcm9qZWN0LCBXRUJfSU5GX0NMQVNTRVNfUEFUSC5hcHBlbmQocnVudGltZVBhdGgpKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElQYXRoIGdldFJ1bnRpbWVQYXRoKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJlc291cmNlUGF0aCkgewotCQlJUGF0aCBydW50aW1lUGF0aCA9IHN1cGVyLmdldFJ1bnRpbWVQYXRoKHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0JCWlmIChXRUJfSU5GX0NMQVNTRVNfUEFUSC5pc1ByZWZpeE9mKHJ1bnRpbWVQYXRoKSkgewotCQkJcmV0dXJuIHJ1bnRpbWVQYXRoLm1ha2VSZWxhdGl2ZVRvKFdFQl9JTkZfQ0xBU1NFU19QQVRIKTsKLQkJfQotCQlyZXR1cm4gcnVudGltZVBhdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YWFkMzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5Bc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIEphdmEgcmVzb3VyY2UgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlc291cmNlTm9kZSBwYXJlbnQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHBhcmVudCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChKYXZhUmVzb3VyY2VOb2RlIHApIHsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMucmVxdWlyZXNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmZvcmJpZHNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIG11c3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc1BhcmVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZm9yYmlkc1BhcmVudCgpIHsKLQkJcmV0dXJuICEgdGhpcy5yZXF1aXJlc1BhcmVudCgpOyAgLy8gYXNzdW1lICdwYXJlbnQnIGlzIG5vdCBvcHRpb25hbAotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2Ugc3VwcG9ydCBjYWxsYmFjayBob29rICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBc3BlY3RDaGFuZ2VTdXBwb3J0Lkxpc3RlbmVyIGJ1aWxkQ2hhbmdlU3VwcG9ydExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFzcGVjdENoYW5nZVN1cHBvcnQuTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhc3BlY3RDaGFuZ2VkKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCQkJQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlLnRoaXMuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBpZ25vcmUgdGhlIGFzcGVjdCBuYW1lLCB3ZSBub3RpZnkgbGlzdGVuZXJzIG9mICpldmVyeSogY2hhbmdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJdGhpcy5nZXRSb290KCkucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUNvbXBpbGF0aW9uVW5pdCNnZXRSb290KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290I2dldFJvb3QoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVR5cGVDYWNoZSNnZXRSb290KCkKLQkgKi8KLQlwdWJsaWMgUm9vdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0Um9vdCgpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSb290KCkuZ2V0RmlsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSb290KCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhN2U3YjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBTaW1wbGlmeSBudWxsIGFubm90YXRpb24gY2xhc3NlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVsbEFubm90YXRpb248QSBleHRlbmRzIEFubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKLQlpbXBsZW1lbnRzIEFubm90YXRpb24KLXsKLQotCXByb3RlY3RlZCBOdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gZ2V0QXN0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwaW5nQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld0Fubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBDYXN0IHRoZSBhbm5vdGF0aW9uJ3MgcGFyZW50IHRvIGEKLQkgKiBwZXJzaXN0ZW50IG1lbWJlci4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBnZXRBbm5vdGF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQpIHRoaXMucGFyZW50OwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2Q6IEFkZCB0aGUgdHlwZSBvciBhdHRyaWJ1dGUncyBhbm5vdGF0aW9uCi0JICogYW5kIHJldHVybiBpdC4KLQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgYW5ub3RhdGlvbidzIHBhcmVudCBtdXN0IGJlIGEgcGVyc2lzdGVudCBtZW1iZXIKLQkgKiAodHlwZSBvciBhdHRyaWJ1dGUpLgotCSAqLwotCXByb3RlY3RlZCBBIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFkZEFubm90YXRpb25fKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEEgYWRkQW5ub3RhdGlvbl8oKSB7Ci0JCXJldHVybiAoQSkgdGhpcy5nZXRBbm5vdGF0ZWRFbGVtZW50KCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFic3RyYWN0VHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QWJzdHJhY3RUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTk0NDYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QWJzdHJhY3RUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSBwZXJzaXN0ZW50IHR5cGUKLSAqLwotYWJzdHJhY3QgY2xhc3MgQmluYXJ5QWJzdHJhY3RUeXBlCi0JZXh0ZW5kcyBCaW5hcnlNZW1iZXIKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZQotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBxdWFsaWZpZWROYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7Ci0KLQlwcml2YXRlIFN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZTsKLQotCXByaXZhdGUgYm9vbGVhbiBtZW1iZXJUeXBlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQmluYXJ5QWJzdHJhY3RUeXBlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJVHlwZSB0eXBlKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmV3IFR5cGVBZGFwdGVyKHR5cGUpKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQkJdGhpcy5xdWFsaWZpZWROYW1lID0gdGhpcy5idWlsZFF1YWxpZmllZE5hbWUoKTsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHRoaXMuYnVpbGRQYWNrYWdlTmFtZSgpOwotCQl0aGlzLmRlY2xhcmluZ1R5cGVOYW1lID0gdGhpcy5idWlsZERlY2xhcmluZ1R5cGVOYW1lKCk7Ci0JCXRoaXMubWVtYmVyVHlwZSA9IHRoaXMuYnVpbGRNZW1iZXJUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWUodGhpcy5idWlsZE5hbWUoKSk7Ci0JCXRoaXMuc2V0UXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZSgpKTsKLQkJdGhpcy5zZXRQYWNrYWdlTmFtZSh0aGlzLmJ1aWxkUGFja2FnZU5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVjbGFyaW5nVHlwZU5hbWUodGhpcy5idWlsZERlY2xhcmluZ1R5cGVOYW1lKCkpOwotCQl0aGlzLnNldE1lbWJlclR5cGUodGhpcy5idWlsZE1lbWJlclR5cGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKiBxdWFsaWZpZWQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVhbGlmaWVkTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UXVhbGlmaWVkTmFtZShTdHJpbmcgcXVhbGlmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5xdWFsaWZpZWROYW1lOwotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSBxdWFsaWZpZWROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVBTElGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgcXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNZW1iZXIoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsgIC8vIG5vIHBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkIGhlcmUKLQl9Ci0KLQkvLyAqKioqKiBwYWNrYWdlCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wYWNrYWdlTmFtZTsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFDS0FHRV9OQU1FX1BST1BFUlRZLCBvbGQsIHBhY2thZ2VOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNZW1iZXIoKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSwgdGhpcy5wYWNrYWdlTmFtZSk7Ci0JfQotCi0JLy8gKioqKiogc291cmNlIGZvbGRlcgotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyKSB7Ci0JCXJldHVybiBnZXRTb3VyY2VGb2xkZXIoKS5lcXVhbHMoc291cmNlRm9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcigpIHsKLQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50Um9vdCkgdGhpcy5nZXRNZW1iZXIoKS5nZXRBbmNlc3RvcihJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQl9Ci0KLQkvLyAqKioqKiBkZWNsYXJpbmcgdHlwZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVjbGFyaW5nVHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlY2xhcmluZ1R5cGVOYW1lKFN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWNsYXJpbmdUeXBlTmFtZTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9IGRlY2xhcmluZ1R5cGVOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVDTEFSSU5HX1RZUEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBkZWNsYXJpbmdUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWNsYXJpbmdUeXBlTmFtZSgpIHsKLQkJSVR5cGUgZGVjbGFyaW5nVHlwZSA9IHRoaXMuZ2V0TWVtYmVyKCkuZ2V0RGVjbGFyaW5nVHlwZSgpOwotCQlyZXR1cm4gKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCkgPyBudWxsIDogZGVjbGFyaW5nVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsgIC8vIG5vIHBhcmFtZXRlcnMgYXJlIGluY2x1ZGVkIGhlcmUKLQl9Ci0KLQotCS8vICoqKioqIG1lbWJlcgotCXB1YmxpYyBib29sZWFuIGlzTWVtYmVyVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMubWVtYmVyVHlwZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWVtYmVyVHlwZShib29sZWFuIG1lbWJlclR5cGUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLm1lbWJlclR5cGU7Ci0JCXRoaXMubWVtYmVyVHlwZSA9IG1lbWJlclR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNRU1CRVJfVFlQRV9QUk9QRVJUWSwgb2xkLCBtZW1iZXJUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRNZW1iZXJUeXBlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuaXNNZW1iZXIoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVR5cGUgZ2V0TWVtYmVyKCkgewotCQlyZXR1cm4gKElUeXBlKSBzdXBlci5nZXRNZW1iZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4gZ2V0RW51bXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VUeXBlPiBnZXRBbGxUeXBlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPiBnZXRBbGxFbnVtcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJVHlwZSBhZGFwdGVyICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBUeXBlQWRhcHRlcgotCQkJaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgSVR5cGUgdHlwZTsKLQkJCi0JCVR5cGVBZGFwdGVyKElUeXBlIHR5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl9Ci0JCQotCQlwdWJsaWMgSVR5cGUgZ2V0RWxlbWVudCgpIHsKLQkJCXJldHVybiB0aGlzLnR5cGU7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4odGhpcy50eXBlLmdldFR5cGVQYXJhbWV0ZXJzKCkpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhqbWUpOwotCQkJfQotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQkKLQkJcHVibGljIElBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCXJldHVybiB0aGlzLnR5cGUuZ2V0QW5ub3RhdGlvbnMoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFubm90YXRlZEVsZW1lbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFubm90YXRlZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzMzVjOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBbm5vdGF0ZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSBhbm5vdGF0ZWQgZWxlbWVudAotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlBbm5vdGF0ZWRFbGVtZW50Ci0JZXh0ZW5kcyBCaW5hcnlOb2RlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50Ci17Ci0JLyoqIEpEVCBhbm5vdGF0ZWQgZWxlbWVudCBhZGFwdGVyICovCi0JZmluYWwgQWRhcHRlciBhZGFwdGVyOwotCi0JLyoqIGFubm90YXRpb25zICovCi0JZmluYWwgVmVjdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zID0gbmV3IFZlY3RvcjxBbm5vdGF0aW9uPigpOwotCQotCS8qKgotCSAqIEFubm90YXRpb24gY29udGFpbmVycyBrZXllZCBvbiBuZXN0YWJsZSBhbm5vdGF0aW9uIG5hbWUuCi0JICogVGhpcyBpcyB1c2VkIHRvIHN0b3JlIGFubm90YXRpb25zIHRoYXQgY2FuIGJlIGJvdGggc3RhbmRhbG9uZSBhbmQgbmVzdGVkCi0JICogYW5kIGFyZSBtb3ZlZCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHRoZSAyLgotCSAqLwotCWZpbmFsIE1hcDxTdHJpbmcsIEFubm90YXRpb25Db250YWluZXI+IGFubm90YXRpb25Db250YWluZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uQ29udGFpbmVyPigpOwotCi0JLyoqCi0JICogdGhlc2UgYXJlIGJ1aWx0IGFzIG5lZWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb24+IG51bGxBbm5vdGF0aW9uc0NhY2hlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBbm5vdGF0aW9uPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQmluYXJ5QW5ub3RhdGVkRWxlbWVudChKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFubm90YXRpb25zKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVBbm5vdGF0aW9ucygpIHsKLQkJZm9yIChJQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogdGhpcy5nZXRKZHRBbm5vdGF0aW9ucygpKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQW5ub3RhdGlvbihJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBqZHRBbm5vdGF0aW9uTmFtZSA9IGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLQkJaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWQoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQl0aGlzLmFubm90YXRpb25zLmFkZCh0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkQW5ub3RhdGlvbih0aGlzLCBqZHRBbm5vdGF0aW9uKSk7Ci0JCX0KLQkJaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWROZXN0YWJsZShqZHRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Db250YWluZXIoKTsKLQkJCWNvbnRhaW5lci5pbml0aWFsaXplRnJvbU5lc3RhYmxlQW5ub3RhdGlvbihqZHRBbm5vdGF0aW9uKTsKLQkJCXRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMucHV0KGpkdEFubm90YXRpb25OYW1lLCBjb250YWluZXIpOwotCQl9Ci0JCWlmICh0aGlzLmFubm90YXRpb25Jc1ZhbGlkQ29udGFpbmVyKGpkdEFubm90YXRpb25OYW1lKSkgewotCQkJU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUgPSB0aGlzLmdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoamR0QW5ub3RhdGlvbk5hbWUpOwotCQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvbkNvbnRhaW5lcigpOwotCQkJY29udGFpbmVyLmluaXRpYWxpemVGcm9tQ29udGFpbmVyQW5ub3RhdGlvbihqZHRBbm5vdGF0aW9uKTsKLQkJCXRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMucHV0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIGNvbnRhaW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYW5ub3RhdGlvbklzVmFsaWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRWYWxpZEFubm90YXRpb25OYW1lcygpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFubm90YXRpb25Jc1ZhbGlkQ29udGFpbmVyKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0VmFsaWRDb250YWluZXJBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhbm5vdGF0aW9uSXNWYWxpZE5lc3RhYmxlKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0VmFsaWROZXN0YWJsZUFubm90YXRpb25OYW1lcygpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZEFubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKCk7Ci0JfQotCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZENvbnRhaW5lckFubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWVzKCk7Ci0JfQotCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZE5lc3RhYmxlQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lcygpOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb25Qcm92aWRlcigpLmdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUFubm90YXRpb25zKCk7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVBbm5vdGF0aW9ucygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEFubm90YXRpb24+KHRoaXMuYW5ub3RhdGlvbnMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QW5ub3RhdGlvbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9ucy5zaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+KHRoaXMuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTGlzdHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+PiBnZXROZXN0YWJsZUFubm90YXRpb25MaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEFubm90YXRpb25Db250YWluZXIsIEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4+KHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMudmFsdWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gdHJhbnNmb3JtKEFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyKSB7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdEFubm90YXRpb25OYW1lZCh0aGlzLmdldEFubm90YXRpb25zKCksIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXROb25OdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8gYW5ub3RhdGlvbiA6IHRoaXMuZ2V0TnVsbEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIEFubm90YXRpb24gZ2V0TnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubnVsbEFubm90YXRpb25zQ2FjaGUuZ2V0KGFubm90YXRpb25OYW1lKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJYW5ub3RhdGlvbiA9IHRoaXMuYnVpbGROdWxsQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCQl0aGlzLm51bGxBbm5vdGF0aW9uc0NhY2hlLnB1dChhbm5vdGF0aW9uTmFtZSwgYW5ub3RhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZE51bGxBbm5vdGF0aW9uKHRoaXMsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG5lc3RhYmxlIGFubm90YXRpb25zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucyhTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gY29udGFpbmVyICE9IG51bGwgPyBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKSA6IEVtcHR5TGlzdEl0ZXJhYmxlLjxOZXN0YWJsZUFubm90YXRpb24+IGluc3RhbmNlKCk7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldEFubm90YXRpb25zU2l6ZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyAwIDogY29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IG51bGwgOiBjb250YWluZXIubmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KTsKLQl9Ci0KLQkvLyAqKioqKiBxdWVyaWVzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldEFsbEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEFubm90YXRpb24+KAotCQkJCWdldEFubm90YXRpb25zKCksCi0JCQkJZ2V0Q29udGFpbmVyT3JOZXN0YWJsZUFubm90YXRpb25zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8QW5ub3RhdGlvbj4gZ2V0Q29udGFpbmVyT3JOZXN0YWJsZUFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QW5ub3RhdGlvbkNvbnRhaW5lciwgQW5ub3RhdGlvbj4odGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy52YWx1ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiB0cmFuc2Zvcm0oQW5ub3RhdGlvbkNvbnRhaW5lciBvKSB7Ci0JCQkJcmV0dXJuIChvLmdldENvbnRhaW5lckFubm90YXRpb24oKSAhPSBudWxsKSA/IG8uZ2V0Q29udGFpbmVyQW5ub3RhdGlvbigpIDogQ29sbGVjdGlvblRvb2xzLmdldChvLmdldE5lc3RlZEFubm90YXRpb25zKCksIDApOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRlZCgpIHsKLQkJcmV0dXJuICEgKHRoaXMuYW5ub3RhdGlvbnMuaXNFbXB0eSgpICYmIHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRlZFdpdGgoSXRlcmFibGU8U3RyaW5nPiBhbm5vdGF0aW9uTmFtZXMpIHsKLQkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiB0aGlzLmdldEFubm90YXRpb25zKCkpIHsKLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWVzLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiB0aGlzLmdldE5lc3RhYmxlQW5ub3RhdGlvbnMoKSkgewotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhbm5vdGF0aW9uTmFtZXMsIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JSUphdmFFbGVtZW50IGdldEFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0RWxlbWVudCgpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbiBzZWxlY3RBbm5vdGF0aW9uTmFtZWQoSXRlcmFibGU8QW5ub3RhdGlvbj4gYW5ub3RhdGlvbkxpc3QsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25MaXN0KSB7Ci0JCQlpZiAoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElBbm5vdGF0aW9uW10gZ2V0SmR0QW5ub3RhdGlvbnMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFubm90YXRpb25zKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIEVNUFRZX0pEVF9BTk5PVEFUSU9OX0FSUkFZOwotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElBbm5vdGF0aW9uW10gRU1QVFlfSkRUX0FOTk9UQVRJT05fQVJSQVkgPSBuZXcgSUFubm90YXRpb25bMF07Ci0KLQotCS8vICoqKioqKioqKiogSUphdmFFbGVtZW50IGFkYXB0ZXIgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIEFkYXB0ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgSkRUIGVsZW1lbnQgKElQYWNrYWdlRnJhZ21lbnQsIElUeXBlLCBJRmllbGQsIElNZXRob2QpLgotCQkgKi8KLQkJSUphdmFFbGVtZW50IGdldEVsZW1lbnQoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCdzIEpEVCBhbm5vdGF0aW9ucy4KLQkJICovCi0JCUlBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1bnN1cHBvcnRlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50TWVtYmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKGludCBpbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWVtYmVyVmFsdWVQYWlyW10gRU1QVFlfTUVNQkVSX1ZBTFVFX1BBSVJfQVJSQVkgPSBuZXcgSU1lbWJlclZhbHVlUGFpclswXTsKLQkKLQkKLQljbGFzcyBBbm5vdGF0aW9uQ29udGFpbmVyIHsKLQkJCi0JCXByaXZhdGUgQW5ub3RhdGlvbiBjb250YWluZXJBbm5vdGF0aW9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBWZWN0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBuZXN0ZWRBbm5vdGF0aW9ucyA9IG5ldyBWZWN0b3I8TmVzdGFibGVBbm5vdGF0aW9uPigpOwotCQkKLQkJcHJvdGVjdGVkIEFubm90YXRpb25Db250YWluZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9CQkKLQkJCi0JCQotCQkvLyAqKioqKiBpbml0IGZyb20gY29udGFpbmVyICoqKioqCi0JCQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbUNvbnRhaW5lckFubm90YXRpb24oSUFubm90YXRpb24gamR0Q29udGFpbmVyQW5ub3RhdGlvbikgewotCQkJdGhpcy5jb250YWluZXJBbm5vdGF0aW9uID0gCi0JCQkJCUJpbmFyeUFubm90YXRlZEVsZW1lbnQudGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZEFubm90YXRpb24oCi0JCQkJCQkJQmluYXJ5QW5ub3RhdGVkRWxlbWVudC50aGlzLCBqZHRDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJCWluaXRpYWxpemVOZXN0ZWRBbm5vdGF0aW9ucyhqZHRDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU5lc3RlZEFubm90YXRpb25zKElBbm5vdGF0aW9uIGpkdENvbnRhaW5lckFubm90YXRpb24pIHsKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKElNZW1iZXJWYWx1ZVBhaXIgdmFsdWVQYWlyIDogdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZVBhaXJzKGpkdENvbnRhaW5lckFubm90YXRpb24pKSB7Ci0JCQkJSUFubm90YXRpb24gamR0TmVzdGVkQW5ub3RhdGlvbiA9IChJQW5ub3RhdGlvbikgdmFsdWVQYWlyLmdldFZhbHVlKCk7Ci0JCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5hZGQoCi0JCQkJCQlCaW5hcnlBbm5vdGF0ZWRFbGVtZW50LnRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYnVpbGRBbm5vdGF0aW9uKAotCQkJCQkJCQlCaW5hcnlBbm5vdGF0ZWRFbGVtZW50LnRoaXMsIGpkdE5lc3RlZEFubm90YXRpb24sIGluZGV4KyspKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSBJTWVtYmVyVmFsdWVQYWlyW10gZ2V0SmR0TWVtYmVyVmFsdWVQYWlycyhJQW5ub3RhdGlvbiBqZHRDb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBqZHRDb250YWluZXJBbm5vdGF0aW9uLmdldE1lbWJlclZhbHVlUGFpcnMoKTsKLQkJCX0gCi0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJCXJldHVybiBFTVBUWV9NRU1CRVJfVkFMVUVfUEFJUl9BUlJBWTsKLQkJCX0KLQkJfQotCQkKLQkJCi0JCS8vICoqKioqIGluaXQgZnJvbSBuZXN0YWJsZSAqKioqKgotCQkKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21OZXN0YWJsZUFubm90YXRpb24oSUFubm90YXRpb24gamR0TmVzdGFibGVBbm5vdGF0aW9uKSB7Ci0JCQl0aGlzLm5lc3RlZEFubm90YXRpb25zLmFkZCgKLQkJCQkJQmluYXJ5QW5ub3RhdGVkRWxlbWVudC50aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkQW5ub3RhdGlvbigKLQkJCQkJCQlCaW5hcnlBbm5vdGF0ZWRFbGVtZW50LnRoaXMsIGpkdE5lc3RhYmxlQW5ub3RhdGlvbiwgMCkpOwotCQl9Ci0JCQotCQkKLQkJLy8gKioqKiogcXVlcmllcyAqKioqKgotCQkKLQkJcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5lckFubm90YXRpb247Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPiBnZXROZXN0ZWRBbm5vdGF0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4odGhpcy5uZXN0ZWRBbm5vdGF0aW9ucyk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBpbnQgZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmVzdGVkQW5ub3RhdGlvbnMuc2l6ZSgpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25zLmdldChpbmRleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYWY2MDQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLQotLyoqCi0gKiBKQVIgYW5ub3RhdGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5Tm9kZQotCWltcGxlbWVudHMgQW5ub3RhdGlvbgotewotCWZpbmFsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb247Ci0KLQlwcm90ZWN0ZWQgQmluYXJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpkdEFubm90YXRpb24gPSBqZHRBbm5vdGF0aW9uOwotCX0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlcyBvZiB0aGUgSkRUIGFubm90YXRpb24ncyBtZW1iZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGdldEpkdE1lbWJlclZhbHVlcyhTdHJpbmcgbWVtYmVyTmFtZSkgewotCQlPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUobWVtYmVyTmFtZSk7Ci0JCXJldHVybiAodmFsdWVzICE9IG51bGwpID8gdmFsdWVzIDogRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgSkRUIGFubm90YXRpb24ncyBtZW1iZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRKZHRNZW1iZXJWYWx1ZShTdHJpbmcgbWVtYmVyTmFtZSkgewotCQlJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlUGFpcihtZW1iZXJOYW1lKTsKLQkJcmV0dXJuIChwYWlyID09IG51bGwpID8gbnVsbCA6IHBhaXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEVCBhbm5vdGF0aW9uJ3MgbWVtYmVyLXZhbHVlIHBhaXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBJTWVtYmVyVmFsdWVQYWlyIGdldEpkdE1lbWJlclZhbHVlUGFpcihTdHJpbmcgbWVtYmVyTmFtZSkgewotCQlmb3IgKElNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVQYWlycygpKSB7Ci0JCQlpZiAocGFpci5nZXRNZW1iZXJOYW1lKCkuZXF1YWxzKG1lbWJlck5hbWUpKSB7Ci0JCQkJcmV0dXJuIHBhaXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJTWVtYmVyVmFsdWVQYWlyW10gZ2V0SmR0TWVtYmVyVmFsdWVQYWlycygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmpkdEFubm90YXRpb24uZ2V0TWVtYmVyVmFsdWVQYWlycygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFTVBUWV9NRU1CRVJfVkFMVUVfUEFJUl9BUlJBWTsKLQkJfQotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJTWVtYmVyVmFsdWVQYWlyW10gRU1QVFlfTUVNQkVSX1ZBTFVFX1BBSVJfQVJSQVkgPSBuZXcgSU1lbWJlclZhbHVlUGFpclswXTsKLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBc3RBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQlwdWJsaWMgdm9pZCBuZXdBbm5vdGF0aW9uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiN2YzZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KQotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlBdHRyaWJ1dGUKLQlleHRlbmRzIEJpbmFyeU1lbWJlcgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlQXR0cmlidXRlCi17Ci0JcHJpdmF0ZSBpbnQgbW9kaWZpZXJzOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlOwotCi0JcHJpdmF0ZSBib29sZWFuIHR5cGVJc0VudW07Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHlwZUlzQXJyYXk7Ci0JCi0JcHJpdmF0ZSBpbnQgdHlwZUFycmF5RGltZW5zaW9uYWxpdHk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHR5cGVTdXBlcmNsYXNzTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZUludGVyZmFjZU5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHR5cGVUeXBlQXJndW1lbnROYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCi0KLQlwcm90ZWN0ZWQgQmluYXJ5QXR0cmlidXRlKEphdmFSZXNvdXJjZVR5cGUgcGFyZW50LCBBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBhZGFwdGVyKTsKLQkJdGhpcy5tb2RpZmllcnMgPSB0aGlzLmJ1aWxkTW9kaWZpZXJzKCk7Ci0JCQotCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmUoKTsKLQkJSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gZ2V0QWRhcHRlcigpLmdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0JCXRoaXMudHlwZU5hbWUgPSBidWlsZFR5cGVOYW1lKHR5cGVTaWduYXR1cmUsIHR5cGVQYXJhbWV0ZXJzKTsKLQkJdGhpcy50eXBlSXNBcnJheSA9IGJ1aWxkVHlwZUlzQXJyYXkodHlwZVNpZ25hdHVyZSk7Ci0JCXRoaXMudHlwZUFycmF5RGltZW5zaW9uYWxpdHkgPSBidWlsZFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KHR5cGVTaWduYXR1cmUpOwotCQl0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lID0gYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycyk7Ci0JCXRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzLmFkZEFsbChidWlsZFR5cGVUeXBlQXJndW1lbnROYW1lcyh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycykpOwotCQkKLQkJSVR5cGUgdHlwZSA9IGdldFR5cGUoKTsKLQkJLy8gaWYgdGhlIHR5cGUgaXMgYW4gYXJyYXksIHRoZW4gdGhlIGZvbGxvd2luZyB3aWxsIGJlIGZhbHNlIG9yIGVtcHR5Ci0JCXRoaXMudHlwZUlzSW50ZXJmYWNlID0gdGhpcy5idWlsZFR5cGVJc0ludGVyZmFjZSh0eXBlKTsKLQkJdGhpcy50eXBlSXNFbnVtID0gdGhpcy5idWlsZFR5cGVJc0VudW0odHlwZSk7Ci0JCXRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcy5hZGRBbGwodGhpcy5idWlsZFR5cGVTdXBlcmNsYXNzTmFtZXModHlwZSkpOwotCQl0aGlzLnR5cGVJbnRlcmZhY2VOYW1lcy5hZGRBbGwodGhpcy5idWlsZFR5cGVJbnRlcmZhY2VOYW1lcyh0eXBlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0TW9kaWZpZXJzKHRoaXMuYnVpbGRNb2RpZmllcnMoKSk7Ci0JCQotCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSA9IGdldFR5cGVTaWduYXR1cmUoKTsKLQkJSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzID0gZ2V0QWRhcHRlcigpLmdldFR5cGVQYXJhbWV0ZXJzKCk7Ci0JCXNldFR5cGVOYW1lKGJ1aWxkVHlwZU5hbWUodHlwZVNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpKTsKLQkJc2V0VHlwZUlzQXJyYXkoYnVpbGRUeXBlSXNBcnJheSh0eXBlU2lnbmF0dXJlKSk7Ci0JCXNldFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KGJ1aWxkVHlwZUFycmF5RGltZW5zaW9uYWxpdHkodHlwZVNpZ25hdHVyZSkpOwotCQlzZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZShidWlsZFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKHR5cGVTaWduYXR1cmUsIHR5cGVQYXJhbWV0ZXJzKSk7Ci0JCXNldFR5cGVUeXBlQXJndW1lbnROYW1lcyhidWlsZFR5cGVUeXBlQXJndW1lbnROYW1lcyh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycykpOwotCQkKLQkJSVR5cGUgdHlwZSA9IHRoaXMuZ2V0VHlwZSgpOyAgLy8gaWYgdGhlIHR5cGUgaXMgYW4gYXJyYXksIHRoZW4gdGhlIGZvbGxvd2luZyB3aWxsIGJlIGZhbHNlIG9yIGVtcHR5Ci0JCXRoaXMuc2V0VHlwZUlzSW50ZXJmYWNlKHRoaXMuYnVpbGRUeXBlSXNJbnRlcmZhY2UodHlwZSkpOwotCQl0aGlzLnNldFR5cGVJc0VudW0odGhpcy5idWlsZFR5cGVJc0VudW0odHlwZSkpOwotCQl0aGlzLnNldFR5cGVTdXBlcmNsYXNzTmFtZXModGhpcy5idWlsZFR5cGVTdXBlcmNsYXNzTmFtZXModHlwZSkpOwotCQl0aGlzLnNldFR5cGVJbnRlcmZhY2VOYW1lcyh0aGlzLmJ1aWxkVHlwZUludGVyZmFjZU5hbWVzKHR5cGUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeVBlcnNpc3RlbnRNZW1iZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXByaXZhdGUgQWRhcHRlciBnZXRBZGFwdGVyKCkgewotCQlyZXR1cm4gKEFkYXB0ZXIpIHRoaXMuYWRhcHRlcjsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VUeXBlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VUeXBlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlcigpLmdldEF0dHJpYnV0ZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNTdWJUeXBlT2YoU3RyaW5nIHRuKSB7Ci0JCXJldHVybiAoKHRoaXMudHlwZU5hbWUgIT0gbnVsbCkgJiYgdGhpcy50eXBlTmFtZS5lcXVhbHModG4pKQotCQkJCXx8IHRoaXMudHlwZUludGVyZmFjZU5hbWVzLmNvbnRhaW5zKHRuKQotCQkJCXx8IHRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcy5jb250YWlucyh0bik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzVmFyaWFibGVQcmltaXRpdmUoKSB7Ci0JCXJldHVybiAodGhpcy50eXBlTmFtZSAhPSBudWxsKSAmJiBDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZSh0aGlzLnR5cGVOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKiBtb2RpZmllcnMKLQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZpZXJzOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNb2RpZmllcnMoaW50IG1vZGlmaWVycykgewotCQlpbnQgb2xkID0gdGhpcy5tb2RpZmllcnM7Ci0JCXRoaXMubW9kaWZpZXJzID0gbW9kaWZpZXJzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTU9ESUZJRVJTX1BST1BFUlRZLCBvbGQsIG1vZGlmaWVycyk7Ci0JfQotCi0JLyoqCi0JICogemVybyBzZWVtcyBsaWtlIGEgcmVhc29uYWJsZSBkZWZhdWx0Li4uCi0JICovCi0JcHJpdmF0ZSBpbnQgYnVpbGRNb2RpZmllcnMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRNZW1iZXIoKS5nZXRGbGFncygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLy8gKioqKiogdHlwZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVOYW1lKFN0cmluZyB0eXBlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlTmFtZTsKLQkJdGhpcy50eXBlTmFtZSA9IHR5cGVOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlTmFtZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUodHlwZVNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpOwotCX0KLQotCS8vICoqKioqIHR5cGUgaXMgaW50ZXJmYWNlCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNJbnRlcmZhY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVJc0ludGVyZmFjZShib29sZWFuIHR5cGVJc0ludGVyZmFjZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMudHlwZUlzSW50ZXJmYWNlOwotCQl0aGlzLnR5cGVJc0ludGVyZmFjZSA9IHR5cGVJc0ludGVyZmFjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfSVNfSU5URVJGQUNFX1BST1BFUlRZLCBvbGQsIHR5cGVJc0ludGVyZmFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzSW50ZXJmYWNlKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAodHlwZSAhPSBudWxsKSAmJiB0eXBlLmlzSW50ZXJmYWNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKiogdHlwZSBpcyBlbnVtCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzRW51bSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzRW51bTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHlwZUlzRW51bShib29sZWFuIHR5cGVJc0VudW0pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnR5cGVJc0VudW07Ci0JCXRoaXMudHlwZUlzRW51bSA9IHR5cGVJc0VudW07Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0lTX0VOVU1fUFJPUEVSVFksIG9sZCwgdHlwZUlzRW51bSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzRW51bShJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkgJiYgdHlwZS5pc0VudW0oKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiB0eXBlIGlzIGFycmF5Ci0JcHVibGljIGJvb2xlYW4gdHlwZUlzQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0FycmF5OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlSXNBcnJheShib29sZWFuIHR5cGVJc0FycmF5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy50eXBlSXNBcnJheTsKLQkJdGhpcy50eXBlSXNBcnJheSA9IHR5cGVJc0FycmF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9JU19BUlJBWV9QUk9QRVJUWSwgb2xkLCB0eXBlSXNBcnJheSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzQXJyYXkoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlSXNBcnJheSh0eXBlU2lnbmF0dXJlKTsKLQl9Ci0JCi0JLy8gKioqKiogdHlwZSBhcnJheSBkaW1lbnNpb25hbGl0eQotCXB1YmxpYyBpbnQgZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoaW50IHR5cGVBcnJheURpbWVuc2lvbmFsaXR5KSB7Ci0JCWludCBvbGQgPSB0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5OwotCQl0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5ID0gdHlwZUFycmF5RGltZW5zaW9uYWxpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9BUlJBWV9ESU1FTlNJT05BTElUWV9QUk9QRVJUWSwgb2xkLCB0eXBlQXJyYXlEaW1lbnNpb25hbGl0eSk7Ci0JfQotCQotCXByaXZhdGUgaW50IGJ1aWxkVHlwZUFycmF5RGltZW5zaW9uYWxpdHkoU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlQXJyYXlEaW1lbnNpb25hbGl0eSh0eXBlU2lnbmF0dXJlKTsKLSAJfQotCQotCS8vICoqKioqIHR5cGUgYXJyYXkgY29tcG9uZW50IHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoU3RyaW5nIHR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lOwotCQl0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lID0gdHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9BUlJBWV9DT01QT05FTlRfVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIHR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZShTdHJpbmcgdHlwZVNpZ25hdHVyZSwgSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7Ci0JCWludCBhcnJheURpbWVuc2lvbmFsaXR5ID0gY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVBcnJheURpbWVuc2lvbmFsaXR5KHR5cGVTaWduYXR1cmUpOwotCQlyZXR1cm4gKGFycmF5RGltZW5zaW9uYWxpdHkgPT0gMCkgPyBudWxsIDogY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKHR5cGVTaWduYXR1cmUsIHR5cGVQYXJhbWV0ZXJzKTsKLSAJfQotCi0JLy8gKioqKiogdHlwZSBzdXBlcmNsYXNzIGhpZXJhcmNoeQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlU3VwZXJjbGFzc05hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHlwZVN1cGVyY2xhc3NOYW1lc0NvbnRhaW5zKFN0cmluZyBzdXBlcmNsYXNzTmFtZSkgewotCQlyZXR1cm4gdGhpcy50eXBlU3VwZXJjbGFzc05hbWVzLmNvbnRhaW5zKHN1cGVyY2xhc3NOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHlwZVN1cGVyY2xhc3NOYW1lcyhMaXN0PFN0cmluZz4gdHlwZVN1cGVyY2xhc3NOYW1lcykgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0eXBlU3VwZXJjbGFzc05hbWVzLCB0aGlzLnR5cGVTdXBlcmNsYXNzTmFtZXMsIFRZUEVfU1VQRVJDTEFTU19OQU1FU19MSVNUKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFR5cGVTdXBlcmNsYXNzTmFtZXMoSVR5cGUgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQotCQlBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0eXBlID0gdGhpcy5maW5kU3VwZXJjbGFzcyh0eXBlKTsKLQkJd2hpbGUgKHR5cGUgIT0gbnVsbCkgewotCQkJbmFtZXMuYWRkKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpOyAgLy8gbm8gcGFyYW1ldGVycyBhcmUgaW5jbHVkZWQgaGVyZQotCQkJdHlwZSA9IHRoaXMuZmluZFN1cGVyY2xhc3ModHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8vICoqKioqIHR5cGUgaW50ZXJmYWNlIGhpZXJhcmNoeQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVJbnRlcmZhY2VOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KHRoaXMudHlwZUludGVyZmFjZU5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSW50ZXJmYWNlTmFtZXNDb250YWlucyhTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotCQlyZXR1cm4gdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuY29udGFpbnMoaW50ZXJmYWNlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVJbnRlcmZhY2VOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gdHlwZUludGVyZmFjZU5hbWVzKSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKHR5cGVJbnRlcmZhY2VOYW1lcywgdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMsIFRZUEVfSU5URVJGQUNFX05BTUVTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkVHlwZUludGVyZmFjZU5hbWVzKElUeXBlIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7Ci0JCX0KLQotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCXdoaWxlICh0eXBlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkSW50ZXJmYWNlTmFtZXNUbyh0eXBlLCBuYW1lcyk7Ci0JCQl0eXBlID0gdGhpcy5maW5kU3VwZXJjbGFzcyh0eXBlKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEludGVyZmFjZU5hbWVzVG8oSVR5cGUgdHlwZSwgSGFzaFNldDxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoU3RyaW5nIGludGVyZmFjZVNpZ25hdHVyZSA6IHRoaXMuZ2V0U3VwZXJJbnRlcmZhY2VUeXBlU2lnbmF0dXJlcyh0eXBlKSkgewotCQkJU3RyaW5nIGludGVyZmFjZU5hbWUgPSBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUoaW50ZXJmYWNlU2lnbmF0dXJlKTsKLQkJCW5hbWVzLmFkZChpbnRlcmZhY2VOYW1lKTsKLQkJCUlUeXBlIGludGVyZmFjZVR5cGUgPSB0aGlzLmZpbmRUeXBlKGludGVyZmFjZU5hbWUpOwotCQkJaWYgKGludGVyZmFjZVR5cGUgIT0gbnVsbCkgewotCQkJCXRoaXMuYWRkSW50ZXJmYWNlTmFtZXNUbyhpbnRlcmZhY2VUeXBlLCBuYW1lcyk7ICAvLyByZWN1cnNlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiB0eXBlIHR5cGUgYXJndW1lbnQgbmFtZXMKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlVHlwZUFyZ3VtZW50TmFtZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZVR5cGVBcmd1bWVudE5hbWVzLmdldChpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFR5cGVUeXBlQXJndW1lbnROYW1lcyhMaXN0PFN0cmluZz4gdHlwZVR5cGVBcmd1bWVudE5hbWVzKSB7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0KHR5cGVUeXBlQXJndW1lbnROYW1lcywgdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMsIFRZUEVfVFlQRV9BUkdVTUVOVF9OQU1FU19MSVNUKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoU3RyaW5nIHR5cGVTaWduYXR1cmUsIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewotCQlpbnQgYXJyYXlEaW1lbnNpb25hbGl0eSA9IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlQXJyYXlEaW1lbnNpb25hbGl0eSh0eXBlU2lnbmF0dXJlKTsKLQkJcmV0dXJuIChhcnJheURpbWVuc2lvbmFsaXR5ICE9IDApID8gQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSA6IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlVHlwZUFyZ3VtZW50TmFtZXModHlwZVNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlcigpLmdldFR5cGVTaWduYXR1cmUoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSVR5cGUgZmluZFN1cGVyY2xhc3MoSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gdGhpcy5maW5kVHlwZUJ5U2lnbmF0dXJlKHRoaXMuZ2V0U3VwZXJjbGFzc1NpZ25hdHVyZSh0eXBlKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3VwZXJjbGFzc1NpZ25hdHVyZShJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZS5nZXRTdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRTdXBlckludGVyZmFjZVR5cGVTaWduYXR1cmVzKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlLmdldFN1cGVySW50ZXJmYWNlVHlwZVNpZ25hdHVyZXMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZSBmaW5kVHlwZUJ5U2lnbmF0dXJlKFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Ci0JCXJldHVybiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmZpbmRUeXBlKGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZV8odHlwZVNpZ25hdHVyZSkpOwotCX0KLQotCXByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnR5cGVOYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZmluZFR5cGUodGhpcy50eXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZSBmaW5kVHlwZShTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdCBhbiBJRmllbGQgb3IgSU1ldGhvZC4KLQkgKi8KLQlpbnRlcmZhY2UgQWRhcHRlcgotCQkJZXh0ZW5kcyBCaW5hcnlNZW1iZXIuQWRhcHRlciB7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBmaWVsZCBvciBnZXR0ZXIgbWV0aG9kJ3MgImF0dHJpYnV0ZSIgbmFtZQotCQkgKiAoZS5nLiBmaWVsZCAiZm9vIiAtPiAiZm9vIjsgbWV0aG9kICJnZXRGb28iIC0+ICJmb28iKS4KLQkJICovCi0JCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyB0eXBlIHNpZ25hdHVyZS4KLQkJICovCi0JCVN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDbGFzc0ZpbGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNsYXNzRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzRkMDA5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNsYXNzRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudDsKLQotLyoqCi0gKiBiaW5hcnkgY2xhc3MgZmlsZQotICovCi1maW5hbCBjbGFzcyBCaW5hcnlDbGFzc0ZpbGUKLQlleHRlbmRzIEJpbmFyeU5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUNsYXNzRmlsZQotewotCS8qKiBKRFQgY2xhc3MgZmlsZSAqLwotCXByaXZhdGUgZmluYWwgSUNsYXNzRmlsZSBjbGFzc0ZpbGU7Ci0KLQkvKiogY2xhc3MgZmlsZSdzIHR5cGUgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgSkRUIHR5cGUgZ2V0cyBwYXNzZWQgaW4gYmVjYXVzZSB0aGUgcGFja2FnZSBmcmFnbWVudCBpbnNwZWN0cyBpdAotCSAqIGJlZm9yZWhhbmQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgZXhpc3RzIGFuZCBpcyByZWxldmFudC4KLQkgKi8KLQlCaW5hcnlDbGFzc0ZpbGUoSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50IHBhcmVudCwgSUNsYXNzRmlsZSBjbGFzc0ZpbGUsIElUeXBlIGpkdFR5cGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jbGFzc0ZpbGUgPSBjbGFzc0ZpbGU7Ci0JCXRoaXMudHlwZSA9IHRoaXMuYnVpbGRUeXBlKGpkdFR5cGUpOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGJ1aWxkVHlwZShJVHlwZSBqZHRUeXBlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoamR0VHlwZS5pc0VudW0oKSkgewotCQkJCXJldHVybiBuZXcgQmluYXJ5RW51bSh0aGlzLCBqZHRUeXBlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCXJldHVybiBuZXcgQmluYXJ5VHlwZSh0aGlzLCBqZHRUeXBlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNsYXNzRmlsZS5nZXRFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlQ2xhc3NGaWxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQkvLyBUT0RPCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLS8vCQl0eXBlKHRoaXMuY2xhc3NGaWxlLmdldFR5cGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnVtLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTUyNGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLQotLyoqCi0gKiBiaW5hcnkgZW51bQotICovCi1maW5hbCBjbGFzcyBCaW5hcnlFbnVtCi0JZXh0ZW5kcyBCaW5hcnlBYnN0cmFjdFR5cGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUVudW0KLXsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IGVudW1Db25zdGFudHM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCUJpbmFyeUVudW0oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElUeXBlIHR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCB0eXBlKTsKLQkJdGhpcy5lbnVtQ29uc3RhbnRzID0gdGhpcy5idWlsZEVudW1Db25zdGFudHMoKTsKLQl9Ci0KLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kLkVOVU07Ci0JfQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlRW51bUNvbnN0YW50cygpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW51bUNvbnN0YW50cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JCi0JCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VFbnVtIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCi0KLQkvLyAqKioqKioqKioqIGVudW0gY29uc3RhbnRzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IGdldEVudW1Db25zdGFudHMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlRW51bUNvbnN0YW50Pih0aGlzLmVudW1Db25zdGFudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbnVtQ29uc3RhbnQoSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudHMpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGVudW1Db25zdGFudHMsIHRoaXMuZW51bUNvbnN0YW50cywgRU5VTVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZ2V0RW51bUNvbnN0YW50KFN0cmluZyBlbnVtQ29uc3RhbnROYW1lLCBpbnQgb2NjdXJyZW5jZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQgOiB0aGlzLmdldEVudW1Db25zdGFudHMoKSkgewotCQkJaWYgKGVudW1Db25zdGFudC5pc0ZvcihlbnVtQ29uc3RhbnROYW1lLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiBlbnVtQ29uc3RhbnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudW1Db25zdGFudHMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IHJlbW92ZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24ocmVtb3ZlLCB0aGlzLmVudW1Db25zdGFudHMsIEVOVU1TX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4gYnVpbGRFbnVtQ29uc3RhbnRzKCkgewotCQlJdGVyYWJsZTxJRmllbGQ+IGpkdEVudW1Db25zdGFudHMgPSB0aGlzLmdldEVudW1Db25zdGFudHModGhpcy5nZXRNZW1iZXIoKSk7Ci0JCVZlY3RvcjxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IHJlc3VsdCA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PihDb2xsZWN0aW9uVG9vbHMuc2l6ZShqZHRFbnVtQ29uc3RhbnRzKSk7Ci0JCWZvciAoSUZpZWxkIGpkdEVudW1Db25zdGFudCA6IGpkdEVudW1Db25zdGFudHMpIHsKLQkJCXJlc3VsdC5hZGQodGhpcy5idWlsZEVudW1Db25zdGFudChqZHRFbnVtQ29uc3RhbnQpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SUZpZWxkPiBnZXRFbnVtQ29uc3RhbnRzKElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJRmllbGQ+KENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmdldEZpZWxkcyh0eXBlKSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElGaWVsZCBqZHRGaWVsZCkgewotCQkJCXJldHVybiBpc0VudW1Db25zdGFudChqZHRGaWVsZCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJRmllbGRbXSBnZXRGaWVsZHMoSVR5cGUgdHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHR5cGUuZ2V0RmllbGRzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIEVNUFRZX0ZJRUxEX0FSUkFZOwotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGaWVsZFtdIEVNUFRZX0ZJRUxEX0FSUkFZID0gbmV3IElGaWVsZFswXTsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0VudW1Db25zdGFudChJRmllbGQgZmllbGQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZC5pc0VudW1Db25zdGFudCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGJ1aWxkRW51bUNvbnN0YW50KElGaWVsZCBqZHRFbnVtQ29uc3RhbnQpIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFbnVtQ29uc3RhbnQodGhpcywgamR0RW51bUNvbnN0YW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnVtQ29uc3RhbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudW1Db25zdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUwYzI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudW1Db25zdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLQotLyoqCi0gKiBKYXZhIGJpbmFyeSBlbnVtIGNvbnN0YW50LCBJRmllbGQgdGhhdCByZXR1cm5zIHRydWUgdG8gaXNFbnVtQ29uc3RhbnQKLSAqLwotZmluYWwgY2xhc3MgQmluYXJ5RW51bUNvbnN0YW50Ci0JCWV4dGVuZHMgQmluYXJ5TWVtYmVyCi0JCWltcGxlbWVudHMgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHsKLQkKLQkKLQkKLQlCaW5hcnlFbnVtQ29uc3RhbnQoSmF2YVJlc291cmNlRW51bSBwYXJlbnQsIElGaWVsZCBlbnVtQ29uc3RhbnQpewotCQlzdXBlcihwYXJlbnQsIG5ldyBFbnVtQ29uc3RhbnRBZGFwdGVyKGVudW1Db25zdGFudCkpOwotCX0KLQotCUBPdmVycmlkZQotCUlGaWVsZCBnZXRNZW1iZXIoKSB7Ci0JCXJldHVybiAoSUZpZWxkKSBzdXBlci5nZXRNZW1iZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKiBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGltcGxlbWVudGF0aW9uICoqKioqKioqCi0JCi0JcHVibGljIEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEtpbmQuRU5VTV9DT05TVEFOVDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGltcGxlbWVudGF0aW9uICoqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNZW1iZXIoKS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIElGaWVsZCBhZGFwdGVyICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBFbnVtQ29uc3RhbnRBZGFwdGVyIAotCQkJaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkJCi0JCXByaXZhdGUgZmluYWwgSUZpZWxkIGVudW1Db25zdGFudDsKLQkJCi0JCUVudW1Db25zdGFudEFkYXB0ZXIoSUZpZWxkIGVudW1Db25zdGFudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50OwotCQl9Ci0JCQotCQlwdWJsaWMgSUZpZWxkIGdldEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnVtQ29uc3RhbnQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4odGhpcy5lbnVtQ29uc3RhbnQuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldFR5cGVQYXJhbWV0ZXJzKCkpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhqbWUpOwotCQkJfQotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQkKLQkJcHVibGljIElBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCXJldHVybiB0aGlzLmVudW1Db25zdGFudC5nZXRBbm5vdGF0aW9ucygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RmllbGQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMjA3MTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RmllbGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci0KLS8qKgotICogYmluYXJ5IGZpZWxkCi0gKi8KLWZpbmFsIGNsYXNzIEJpbmFyeUZpZWxkCi0JZXh0ZW5kcyBCaW5hcnlBdHRyaWJ1dGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUZpZWxkCi17Ci0KLQlCaW5hcnlGaWVsZChKYXZhUmVzb3VyY2VUeXBlIHBhcmVudCwgSUZpZWxkIGZpZWxkKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmV3IEZpZWxkQWRhcHRlcihmaWVsZCkpOwotCX0KLQotCQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioKLQkKLQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS2luZC5GSUVMRDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIElGaWVsZCBhZGFwdGVyCi0JICovCi0Jc3RhdGljIGNsYXNzIEZpZWxkQWRhcHRlcgotCQkJaW1wbGVtZW50cyBCaW5hcnlBdHRyaWJ1dGUuQWRhcHRlciB7Ci0JCQotCQlmaW5hbCBJRmllbGQgZmllbGQ7Ci0JCQotCQlGaWVsZEFkYXB0ZXIoSUZpZWxkIGZpZWxkKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5maWVsZCA9IGZpZWxkOwotCQl9Ci0JCQotCQlwdWJsaWMgSUZpZWxkIGdldEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWVsZDsKLQkJfQotCQkKLQkJcHVibGljIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiBnZXRUeXBlUGFyYW1ldGVycygpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPih0aGlzLmZpZWxkLmdldERlY2xhcmluZ1R5cGUoKS5nZXRUeXBlUGFyYW1ldGVycygpKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coam1lKTsKLQkJCX0KLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJQW5ub3RhdGlvbltdIGdldEFubm90YXRpb25zKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gdGhpcy5maWVsZC5nZXRBbm5vdGF0aW9ucygpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5maWVsZC5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVTaWduYXR1cmUoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCXJldHVybiB0aGlzLmZpZWxkLmdldFR5cGVTaWduYXR1cmUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1lbWJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTg4NTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVQYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSBwZXJzaXN0ZW50IG1lbWJlcgotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlNZW1iZXIKLQlleHRlbmRzIEJpbmFyeUFubm90YXRlZEVsZW1lbnQKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU1lbWJlcgotewotCi0JcHJpdmF0ZSBib29sZWFuIGZpbmFsXzsgIC8vICdmaW5hbCcgaXMgYSByZXNlcnZlZCB3b3JkCi0JcHJpdmF0ZSBib29sZWFuIHRyYW5zaWVudF87ICAvLyAndHJhbnNpZW50JyBpcyBhIHJlc2VydmVkIHdvcmQKLQlwcml2YXRlIGJvb2xlYW4gcHVibGljXzsgIC8vICdwdWJsaWMnIGlzIGEgcmVzZXJ2ZWQgd29yZAotCXByaXZhdGUgYm9vbGVhbiBzdGF0aWNfOyAgLy8gJ3N0YXRpYycgaXMgYSByZXNlcnZlZCB3b3JkCi0JYm9vbGVhbiBwcm90ZWN0ZWRfOyAvLyAncHJvdGVjdGVkJyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEJpbmFyeU1lbWJlcihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgYWRhcHRlcik7Ci0JCXRoaXMuZmluYWxfID0gdGhpcy5idWlsZEZpbmFsKCk7Ci0JCXRoaXMudHJhbnNpZW50XyA9IHRoaXMuYnVpbGRUcmFuc2llbnQoKTsKLQkJdGhpcy5wdWJsaWNfID0gdGhpcy5idWlsZFB1YmxpYygpOwotCQl0aGlzLnN0YXRpY18gPSB0aGlzLmJ1aWxkU3RhdGljKCk7Ci0JCXRoaXMucHJvdGVjdGVkXyA9IHRoaXMuYnVpbGRQcm90ZWN0ZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGaW5hbCh0aGlzLmJ1aWxkRmluYWwoKSk7Ci0JCXRoaXMuc2V0VHJhbnNpZW50KHRoaXMuYnVpbGRUcmFuc2llbnQoKSk7Ci0JCXRoaXMuc2V0UHVibGljKHRoaXMuYnVpbGRQdWJsaWMoKSk7Ci0JCXRoaXMuc2V0U3RhdGljKHRoaXMuYnVpbGRTdGF0aWMoKSk7Ci0JCXRoaXMuc2V0UHJvdGVjdGVkKHRoaXMuYnVpbGRQcm90ZWN0ZWQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbXBsZSBzdGF0ZSAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmaW5hbAotCXB1YmxpYyBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJldHVybiB0aGlzLmZpbmFsXzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RmluYWwoYm9vbGVhbiBmaW5hbF8pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmZpbmFsXzsKLQkJdGhpcy5maW5hbF8gPSBmaW5hbF87Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGSU5BTF9QUk9QRVJUWSwgb2xkLCBmaW5hbF8pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZEZpbmFsKCkgewotCQl0cnkgewotCQkJcmV0dXJuIEZsYWdzLmlzRmluYWwodGhpcy5nZXRNZW1iZXIoKS5nZXRGbGFncygpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiB0cmFuc2llbnQKLQlwdWJsaWMgYm9vbGVhbiBpc1RyYW5zaWVudCgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNpZW50XzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VHJhbnNpZW50KGJvb2xlYW4gdHJhbnNpZW50XykgewotCQlib29sZWFuIG9sZCA9IHRoaXMudHJhbnNpZW50XzsKLQkJdGhpcy50cmFuc2llbnRfID0gdHJhbnNpZW50XzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TSUVOVF9QUk9QRVJUWSwgb2xkLCB0cmFuc2llbnRfKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRUcmFuc2llbnQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmxhZ3MuaXNUcmFuc2llbnQodGhpcy5nZXRNZW1iZXIoKS5nZXRGbGFncygpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiBwdWJsaWMKLQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljXzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHVibGljKGJvb2xlYW4gcHVibGljXykgewotCQlib29sZWFuIG9sZCA9IHRoaXMucHVibGljXzsKLQkJdGhpcy5wdWJsaWNfID0gcHVibGljXzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBVQkxJQ19QUk9QRVJUWSwgb2xkLCBwdWJsaWNfKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRQdWJsaWMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmxhZ3MuaXNQdWJsaWModGhpcy5nZXRNZW1iZXIoKS5nZXRGbGFncygpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiBzdGF0aWMKLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRpYygpIHsKLQkJcmV0dXJuIHRoaXMuc3RhdGljXzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3RhdGljKGJvb2xlYW4gc3RhdGljXykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3RhdGljXzsKLQkJdGhpcy5zdGF0aWNfID0gc3RhdGljXzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUQVRJQ19QUk9QRVJUWSwgb2xkLCBzdGF0aWNfKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRTdGF0aWMoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmxhZ3MuaXNTdGF0aWModGhpcy5nZXRNZW1iZXIoKS5nZXRGbGFncygpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiBwcm90ZWN0ZWQKLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvdGVjdGVkXzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJvdGVjdGVkKGJvb2xlYW4gcHJvdGVjdGVkXykgewotCQlib29sZWFuIG9sZCA9IHRoaXMucHJvdGVjdGVkXzsKLQkJdGhpcy5wcm90ZWN0ZWRfID0gcHJvdGVjdGVkXzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1RFQ1RFRF9QUk9QRVJUWSwgb2xkLCBwcm90ZWN0ZWRfKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRQcm90ZWN0ZWQoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmxhZ3MuaXNQcm90ZWN0ZWQodGhpcy5nZXRNZW1iZXIoKS5nZXRGbGFncygpKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JSU1lbWJlciBnZXRNZW1iZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKS5nZXRFbGVtZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGdldEFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoQWRhcHRlcikgdGhpcy5hZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFN0cmlwIG9mZiB0aGUgdHlwZSBzaWduYXR1cmUncyBwYXJhbWV0ZXJzIGlmIHByZXNlbnQuCi0JICogQ29udmVydCB0byBhIHJlYWRhYmxlIHN0cmluZy4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZShTdHJpbmcgdHlwZVNpZ25hdHVyZSkgewotCQlyZXR1cm4gY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lKHR5cGVTaWduYXR1cmUsIEVtcHR5SXRlcmFibGUuPElUeXBlUGFyYW1ldGVyPmluc3RhbmNlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBTdHJpcCBvZmYgdGhlIHR5cGUgc2lnbmF0dXJlJ3MgcGFyYW1ldGVycyBpZiBwcmVzZW50LgotCSAqIENvbnZlcnQgdG8gYSByZWFkYWJsZSBzdHJpbmcuCi0JICovCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUoU3RyaW5nIHR5cGVTaWduYXR1cmUsIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewotCQlyZXR1cm4gKHR5cGVTaWduYXR1cmUgPT0gbnVsbCkgPyBudWxsIDogY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lXyh0eXBlU2lnbmF0dXJlLCB0eXBlUGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIG5vIG51bGwgY2hlY2sKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZV8oU3RyaW5nIHR5cGVTaWduYXR1cmUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlTmFtZSh0eXBlU2lnbmF0dXJlLCBFbXB0eUl0ZXJhYmxlLjxJVHlwZVBhcmFtZXRlcj5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogbm8gbnVsbCBjaGVjawotCSAqLwotCXN0YXRpYyBTdHJpbmcgY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lXyhTdHJpbmcgdHlwZVNpZ25hdHVyZSwgSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+IHR5cGVQYXJhbWV0ZXJzKSB7Ci0JCVN0cmluZyBlcmFzdXJlU2lnbmF0dXJlID0gU2lnbmF0dXJlLmdldFR5cGVFcmFzdXJlKHR5cGVTaWduYXR1cmUpOwotCQlpZiAoU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKGVyYXN1cmVTaWduYXR1cmUpID09IFNpZ25hdHVyZS5UWVBFX1ZBUklBQkxFX1NJR05BVFVSRSkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdHlwZVBhcmFtZXRlck5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcoZXJhc3VyZVNpZ25hdHVyZSk7Ci0JCQkJZm9yIChJVHlwZVBhcmFtZXRlciB0eXBlUGFyYW1ldGVyIDogdHlwZVBhcmFtZXRlcnMpIHsKLQkJCQkJaWYgKHR5cGVQYXJhbWV0ZXJOYW1lLmVxdWFscyh0eXBlUGFyYW1ldGVyLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQkJCQlTdHJpbmdbXSBib3VuZHMgPSAodHlwZVBhcmFtZXRlciA9PSBudWxsKSA/IG5ldyBTdHJpbmdbMF0gOiB0eXBlUGFyYW1ldGVyLmdldEJvdW5kc1NpZ25hdHVyZXMoKTsKLQkJCQkJCWlmIChib3VuZHMubGVuZ3RoID4gMCkgewotCQkJCQkJCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWVfKGJvdW5kc1swXSwgdHlwZVBhcmFtZXRlcnMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhqbWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChlcmFzdXJlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCWludCBkaW0gPSBTaWduYXR1cmUuZ2V0QXJyYXlDb3VudChlcmFzdXJlU2lnbmF0dXJlKTsKLQkJCVN0cmluZyBhcnJheVR5cGVOYW1lID0gY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lKFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShlcmFzdXJlU2lnbmF0dXJlKSwgdHlwZVBhcmFtZXRlcnMpOwotCQkJcmV0dXJuIFNpZ25hdHVyZS50b1N0cmluZyhTaWduYXR1cmUuY3JlYXRlQXJyYXlTaWduYXR1cmUoU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoYXJyYXlUeXBlTmFtZSwgdHJ1ZSksIGRpbSkpOwotCQl9Ci0JCWVsc2UgaWYgKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChlcmFzdXJlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuV0lMRENBUkRfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCS8vIGlmIHNpZ25hdHVyZSBpcyA/ICh3aWxkY2FyZCkgb3IgPyBzdXBlciBYIChib3R0b20gYm91bmRlZCksIHJldHVybiB0b3AgYm91bmQsIHdoaWNoIGlzIE9iamVjdAotCQkJaWYgKFN0cmluZy52YWx1ZU9mKFNpZ25hdHVyZS5DX1NUQVIpLmVxdWFscyhlcmFzdXJlU2lnbmF0dXJlKSB8fCBlcmFzdXJlU2lnbmF0dXJlLnN0YXJ0c1dpdGgoU3RyaW5nLnZhbHVlT2YoU2lnbmF0dXJlLkNfU1VQRVIpKSkgewotCQkJCXJldHVybiAiamF2YS5sYW5nLk9iamVjdCI7Ci0JCQl9Ci0JCQkvLyBlbHNlIHJldHVybiB0b3AgYm91bmQKLQkJCWVsc2UgewotCQkJCXJldHVybiBTaWduYXR1cmUudG9TdHJpbmcoZXJhc3VyZVNpZ25hdHVyZS5zdWJzdHJpbmcoMSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTaWduYXR1cmUudG9TdHJpbmcoZXJhc3VyZVNpZ25hdHVyZSk7Ci0JfQotCQotCXN0YXRpYyBib29sZWFuIGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlSXNBcnJheShTdHJpbmcgdHlwZVNpZ25hdHVyZSkgewotCQlyZXR1cm4gKHR5cGVTaWduYXR1cmUgPT0gbnVsbCkgPyBmYWxzZSA6IFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZCh0eXBlU2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkU7Ci0JfQotCQotCXN0YXRpYyBpbnQgY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVBcnJheURpbWVuc2lvbmFsaXR5KFN0cmluZyB0eXBlU2lnbmF0dXJlKSB7Ci0JCXJldHVybiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSA/IDAgOiBTaWduYXR1cmUuZ2V0QXJyYXlDb3VudCh0eXBlU2lnbmF0dXJlKTsKLQl9Ci0JCi0Jc3RhdGljIFN0cmluZyBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoU3RyaW5nIHR5cGVTaWduYXR1cmUsIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewotCQlyZXR1cm4gKHR5cGVTaWduYXR1cmUgPT0gbnVsbCkgPyBudWxsIDogY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lKFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZSh0eXBlU2lnbmF0dXJlKSwgdHlwZVBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiB0aGVzZSB0eXBlcyBjYW4gYmUgYXJyYXlzIChlLmcuICJqYXZhLmxhbmcuU3RyaW5nW10iKTsKLQkgKiBidXQgdGhleSB3b24ndCBoYXZlIGFueSBmdXJ0aGVyIG5lc3RlZCBnZW5lcmljIHR5cGUgYXJndW1lbnRzCi0JICogKGUuZy4gImphdmEudXRpbC5Db2xsZWN0aW9uPGphdmEubGFuZy5TdHJpbmc+IikKLQkgKi8KLQlzdGF0aWMgTGlzdDxTdHJpbmc+IGNvbnZlcnRUeXBlU2lnbmF0dXJlVG9UeXBlVHlwZUFyZ3VtZW50TmFtZXMoU3RyaW5nIHR5cGVTaWduYXR1cmUsIEl0ZXJhYmxlPElUeXBlUGFyYW1ldGVyPiB0eXBlUGFyYW1ldGVycykgewotCQlpZiAodHlwZVNpZ25hdHVyZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJCi0JCVN0cmluZ1tdIHR5cGVBcmd1bWVudFNpZ25hdHVyZXMgPSBTaWduYXR1cmUuZ2V0VHlwZUFyZ3VtZW50cyh0eXBlU2lnbmF0dXJlKTsKLQkJaWYgKHR5cGVBcmd1bWVudFNpZ25hdHVyZXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQkKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odHlwZUFyZ3VtZW50U2lnbmF0dXJlcy5sZW5ndGgpOwotCQlmb3IgKFN0cmluZyB0eXBlQXJndW1lbnRTaWduYXR1cmUgOiB0eXBlQXJndW1lbnRTaWduYXR1cmVzKSB7Ci0JCQluYW1lcy5hZGQoY29udmVydFR5cGVTaWduYXR1cmVUb1R5cGVOYW1lKHR5cGVBcmd1bWVudFNpZ25hdHVyZSwgdHlwZVBhcmFtZXRlcnMpKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljT3JQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBpc1B1YmxpYygpIHx8IGlzUHJvdGVjdGVkKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogSU1lbWJlciBhZGFwdGVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBBZGFwdGVyIGV4dGVuZHMgQmluYXJ5QW5ub3RhdGVkRWxlbWVudC5BZGFwdGVyIHsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgYWRhcHRlcidzIEpEVCBtZW1iZXIgKElUeXBlLCBJRmllbGQsIElNZXRob2QpLgotCQkgKi8KLQkJSU1lbWJlciBnZXRFbGVtZW50KCk7Ci0JCQotCQlJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdW5zdXBwb3J0ZWQgSmF2YVJlc291cmNlTWVtYmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uIHNldFByaW1hcnlBbm5vdGF0aW9uKFN0cmluZyBwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIEl0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoU3RyaW5nIG1lbWJlck5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1ldGhvZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWV0aG9kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMDM0YTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUxvY2FsVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIGJpbmFyeSBtZXRob2QKLSAqLwotZmluYWwgY2xhc3MgQmluYXJ5TWV0aG9kCi0JCWV4dGVuZHMgQmluYXJ5QXR0cmlidXRlCi0JCWltcGxlbWVudHMgSmF2YVJlc291cmNlTWV0aG9kIHsKLQkKLQlwcml2YXRlIGJvb2xlYW4gY29uc3RydWN0b3I7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkKLQkKLQlCaW5hcnlNZXRob2QoSmF2YVJlc291cmNlVHlwZSBwYXJlbnQsIElNZXRob2QgbWV0aG9kKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmV3IE1ldGhvZEFkYXB0ZXIobWV0aG9kKSk7Ci0JfQotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQuTUVUSE9EOwotCX0KLQkKLQkvLyAqKioqKiBvdmVycmlkZXMgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldENvbnN0cnVjdG9yKHRoaXMuYnVpbGRDb25zdHJ1Y3RvcigpKTsKLQotCQl0aGlzLnNldFBhcmFtZXRlclR5cGVOYW1lcyh0aGlzLmJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlJTWV0aG9kIGdldE1lbWJlcigpIHsKLQkJcmV0dXJuIChJTWV0aG9kKSBzdXBlci5nZXRNZW1iZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWV0aG9kIG5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiBnZXRNZW1iZXIoKS5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwYXJhbWV0ZXIgdHlwZSBuYW1lcyAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRQYXJhbWV0ZXJUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclR5cGVOYW1lKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQYXJhbWV0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLnNpemUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoSUxvY2FsVmFyaWFibGUgcGFyYW1ldGVyIDogdGhpcy5nZXRQYXJhbWV0ZXJzKHRoaXMuZ2V0TWVtYmVyKCkpKSB7Ci0JCQluYW1lcy5hZGQocGFyYW1ldGVyLmdldEVsZW1lbnROYW1lKCkpOy8vVE9ETyBpcyB0aGlzIHJpZ2h0PwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JcHJpdmF0ZSBJTG9jYWxWYXJpYWJsZVtdIGdldFBhcmFtZXRlcnMoSU1ldGhvZCBqZHRNZXRob2QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBqZHRNZXRob2QuZ2V0UGFyYW1ldGVycygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRQYXJhbWV0ZXJUeXBlTmFtZXMoTGlzdDxTdHJpbmc+IHBhcmFtZXRlclR5cGVOYW1lcykgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdChwYXJhbWV0ZXJUeXBlTmFtZXMsIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLCBQQVJBTUVURVJfVFlQRV9OQU1FU19MSVNUKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29uc3RydWN0b3IgKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgewotCQlyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvcjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldENvbnN0cnVjdG9yKGJvb2xlYW4gaXNDb25zdHJ1Y3RvcikgewotCQlib29sZWFuIG9sZCA9IHRoaXMuY29uc3RydWN0b3I7Ci0JCXRoaXMuY29uc3RydWN0b3IgPSBpc0NvbnN0cnVjdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OU1RSVUNUT1JfUFJPUEVSVFksIG9sZCwgaXNDb25zdHJ1Y3Rvcik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBidWlsZENvbnN0cnVjdG9yKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0TWVtYmVyKCkuaXNDb25zdHJ1Y3RvcigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogSU1ldGhvZCBhZGFwdGVyCi0JICovCi0Jc3RhdGljIGNsYXNzIE1ldGhvZEFkYXB0ZXIKLQkJCWltcGxlbWVudHMgQmluYXJ5QXR0cmlidXRlLkFkYXB0ZXIgewotCQkKLQkJZmluYWwgSU1ldGhvZCBtZXRob2Q7Ci0JCXN0YXRpYyBmaW5hbCBJTWV0aG9kW10gRU1QVFlfTUVUSE9EX0FSUkFZID0gbmV3IElNZXRob2RbMF07Ci0JCQotCQlNZXRob2RBZGFwdGVyKElNZXRob2QgbWV0aG9kKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tZXRob2QgPSBtZXRob2Q7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJTWV0aG9kIGdldEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2Q7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxJVHlwZVBhcmFtZXRlcj4gZ2V0VHlwZVBhcmFtZXRlcnMoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+KAotCQkJCQkJbmV3IEFycmF5SXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+KHRoaXMubWV0aG9kLmdldFR5cGVQYXJhbWV0ZXJzKCkpLAotCQkJCQkJbmV3IEFycmF5SXRlcmFibGU8SVR5cGVQYXJhbWV0ZXI+KHRoaXMubWV0aG9kLmdldERlY2xhcmluZ1R5cGUoKS5nZXRUeXBlUGFyYW1ldGVycygpKSk7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGptZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgSUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQkJcmV0dXJuIHRoaXMubWV0aG9kLmdldEFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBOYW1lVG9vbHMuY29udmVydEdldHRlclNldHRlck1ldGhvZE5hbWVUb1Byb3BlcnR5TmFtZSh0aGlzLm1ldGhvZC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlU2lnbmF0dXJlKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gdGhpcy5tZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRBbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzYjNmOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLQotLyoqCi0gKiBVc2VkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGhhdmUgbm8gYmVoYXZpb3IsIGp1c3QgYSBuYW1lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlOYW1lZEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLXsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGFubm90YXRpb25OYW1lOwotCi0JcHVibGljIEJpbmFyeU5hbWVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uTmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOb2RlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYjBhZDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQmluYXJ5IGNvbnZlbmllbmNlIG1ldGhvZHMKLSAqLwotLy8gVE9ETyBob3BlZnVsbHkgdGhpcyBjbGFzcyBjYW4gZ28gYXdheSB3aXRoIHNvbWUgc29ydCBvZiByZWZhY3RvcmluZyBvZiB0aGUKLS8vIHNvdXJjZSBhbmQgYmluYXJ5IGhpZXJhcmNoaWVzLi4uCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5Tm9kZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEJpbmFyeU5vZGUoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIG51bGw7ICAvLyBvbmx5IEJpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3QgaGFzIGEgZmlsZS4uLgotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJLy8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UGFja2FnZUZyYWdtZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQYWNrYWdlRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MGQyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQYWNrYWdlRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ2xhc3NGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLQotLyoqCi0gKiBiaW5hcnkgcGFja2FnZSBmcmFnbWVudAotICovCi1maW5hbCBjbGFzcyBCaW5hcnlQYWNrYWdlRnJhZ21lbnQKLQlleHRlbmRzIEJpbmFyeU5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudAotewotCS8qKiBKRFQgcGFja2FnZSBmcmFnbWVudCAqLwotCXByaXZhdGUgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQ7Ci0KLQkvKioKLQkgKiBjbGFzcyBmaWxlcyBpbiB0aGUgcGFja2FnZSBmcmFnbWVudDsKLQkgKiB3ZSBvbmx5IGhvbGQgY2xhc3MgZmlsZXMvdHlwZXMgdGhhdCBhcmUgYWN0dWFsbHkgYW5ub3RhdGVkOwotCSAqIGlmIHRoZSB1bmFubm90YXRlZCB0eXBlcyBhcmUgbmVlZGVkIChlLmcuIGZvciBvcm0ueG1sIG9yIGFuCi0JICogaW5oZXJpdGFuY2UgdHJlZSkgdGhleSBjYW4gYmUgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoIGFzIG5lZWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZUNsYXNzRmlsZT4gY2xhc3NGaWxlcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlQ2xhc3NGaWxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlCaW5hcnlQYWNrYWdlRnJhZ21lbnQoSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBwYXJlbnQsIElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50OwotCQl0aGlzLmNsYXNzRmlsZXMuYWRkQWxsKHRoaXMuYnVpbGRDbGFzc0ZpbGVzKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VDbGFzc0ZpbGU+IGJ1aWxkQ2xhc3NGaWxlcygpIHsKLQkJSUphdmFFbGVtZW50W10gY2hpbGRyZW4gPSB0aGlzLmdldEpEVENoaWxkcmVuKCk7Ci0JCUFycmF5TGlzdDxKYXZhUmVzb3VyY2VDbGFzc0ZpbGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8SmF2YVJlc291cmNlQ2xhc3NGaWxlPihjaGlsZHJlbi5sZW5ndGgpOwotCQlmb3IgKElKYXZhRWxlbWVudCBjaGlsZCA6IGNoaWxkcmVuKSB7Ci0JCQlJQ2xhc3NGaWxlIGpkdENsYXNzRmlsZSA9IChJQ2xhc3NGaWxlKSBjaGlsZDsKLQkJCUlUeXBlIGpkdFR5cGUgPSBqZHRDbGFzc0ZpbGUuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGVJc1JlbGV2YW50KGpkdFR5cGUpKSB7Ci0JCQkJSmF2YVJlc291cmNlQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IG5ldyBCaW5hcnlDbGFzc0ZpbGUodGhpcywgamR0Q2xhc3NGaWxlLCBqZHRUeXBlKTsKLQkJCQlpZiAoY2xhc3NGaWxlLmdldFR5cGUoKS5pc0Fubm90YXRlZCgpKSB7ICAvLyB3ZSBvbmx5IGhvbGQgYW5ub3RhdGVkIHR5cGVzCi0JCQkJCXJlc3VsdC5hZGQoY2xhc3NGaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvL3dlIHdpbGwgbGltaXQgdG8gY2xhc3NlcywgaW50ZXJmYWNlcywgYW5kIGVudW1zLiBBbm5vdGF0aW9uIHR5cGVzIHdpbGwgYmUgaWdub3JlZC4KLQlzdGF0aWMgYm9vbGVhbiB0eXBlSXNSZWxldmFudChJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHR5cGUgIT0gbnVsbCkKLQkJCQkJJiYgdHlwZS5leGlzdHMoKQotCQkJCQkmJiAodHlwZS5pc0NsYXNzKCkgfHwgdHlwZS5pc0ludGVyZmFjZSgpfHwgdHlwZS5pc0VudW0oKSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIEphclJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUNsYXNzRmlsZXMoKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNsYXNzRmlsZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhUmVzb3VyY2VDbGFzc0ZpbGU+IGdldENsYXNzRmlsZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNsYXNzRmlsZT4odGhpcy5jbGFzc0ZpbGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENsYXNzRmlsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc0ZpbGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEphdmFSZXNvdXJjZUNsYXNzRmlsZSwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPih0aGlzLmdldENsYXNzRmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHRyYW5zZm9ybShKYXZhUmVzb3VyY2VDbGFzc0ZpbGUgY2xhc3NGaWxlKSB7Ci0JCQkJcmV0dXJuIGNsYXNzRmlsZS5nZXRUeXBlKCk7ICAvLyB3ZSBvbmx5IGhvbGQgYW5ub3RhdGVkIHR5cGVzCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnRbXSBnZXRKRFRDaGlsZHJlbigpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudC5nZXRDaGlsZHJlbigpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFTVBUWV9KQVZBX0VMRU1FTlRfQVJSQVk7Ci0JCX0KLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJSmF2YUVsZW1lbnRbXSBFTVBUWV9KQVZBX0VMRU1FTlRfQVJSQVkgPSBuZXcgSUphdmFFbGVtZW50WzBdOwotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5wYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyODY1ZjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UGFja2FnZUZyYWdtZW50Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogYmluYXJ5IHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5UGFja2FnZUZyYWdtZW50Um9vdAotCWV4dGVuZHMgUm9vdEJpbmFyeU5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QKLXsKLQkvKiogSkRUIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAqLwotCXByaXZhdGUgZmluYWwgSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdDsKLQotCS8qKiBwYWNrYWdlIGZyYWdtZW50cyBpbiB0aGUgSkFSICovCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiBwYWNrYWdlRnJhZ21lbnRzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBCaW5hcnlQYWNrYWdlRnJhZ21lbnRSb290KElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QsIEFubm90YXRpb25Qcm92aWRlciBhbm5vdGF0aW9uUHJvdmlkZXIpIHsKLQkJc3VwZXIobnVsbCwgYW5ub3RhdGlvblByb3ZpZGVyKTsgIC8vIHRoZSBwYWNrYWdlIGZyYWdtZW50IHJvb3QgaXMgdGhlIHJvb3Qgb2YgaXRzIHN1Yi10cmVlCi0JCXRoaXMucGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3Q7Ci0JCXRoaXMucGFja2FnZUZyYWdtZW50cy5hZGRBbGwodGhpcy5idWlsZFBhY2thZ2VGcmFnbWVudHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudD4gYnVpbGRQYWNrYWdlRnJhZ21lbnRzKCkgewotCQlJSmF2YUVsZW1lbnRbXSBqZHRDaGlsZHJlbiA9IHRoaXMuZ2V0SkRUQ2hpbGRyZW4oKTsKLQkJQXJyYXlMaXN0PEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ+KGpkdENoaWxkcmVuLmxlbmd0aCk7Ci0JCWZvciAoSUphdmFFbGVtZW50IGNoaWxkIDogamR0Q2hpbGRyZW4pIHsKLQkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeVBhY2thZ2VGcmFnbWVudCh0aGlzLCAoSVBhY2thZ2VGcmFnbWVudCkgY2hpbGQpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiAoSUZpbGUpIHRoaXMucGFja2FnZUZyYWdtZW50Um9vdC5nZXRSZXNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlUGFja2FnZUZyYWdtZW50cygpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlUGFja2FnZUZyYWdtZW50cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZU5vZGUuUm9vdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOQjogd2UgaG9sZCBvbmx5IGFubm90YXRlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5wZXJzaXN0ZWRUeXBlc0xpc3RzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPj4gcGVyc2lzdGVkVHlwZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudCwgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPj4odGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gdHJhbnNmb3JtKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudCBmcmFnbWVudCkgewotCQkJCXJldHVybiBmcmFnbWVudC5nZXRUeXBlcygpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQ+IGdldFBhY2thZ2VGcmFnbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Pih0aGlzLnBhY2thZ2VGcmFnbWVudHMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UGFja2FnZUZyYWdtZW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnBhY2thZ2VGcmFnbWVudHMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByaXZhdGUgSUphdmFFbGVtZW50W10gZ2V0SkRUQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBKRFRUb29scy5nZXRDaGlsZHJlbih0aGlzLnBhY2thZ2VGcmFnbWVudFJvb3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWJjNzQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci0KLS8qKgotICogYmluYXJ5IHR5cGUKLSAqLwotZmluYWwgY2xhc3MgQmluYXJ5VHlwZQotCWV4dGVuZHMgQmluYXJ5QWJzdHJhY3RUeXBlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VUeXBlCi17Ci0JcHJpdmF0ZSBTdHJpbmcgc3VwZXJjbGFzc1F1YWxpZmllZE5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gYWJzdHJhY3RfOyAgLy8gJ2Fic3RyYWN0JyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNOb0FyZ0NvbnN0cnVjdG9yOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yOwotCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlRmllbGQ+IGZpZWxkczsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZU1ldGhvZD4gbWV0aG9kczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JQmluYXJ5VHlwZShKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSVR5cGUgdHlwZSkgewotCQlzdXBlcihwYXJlbnQsIHR5cGUpOwotCQl0aGlzLnN1cGVyY2xhc3NRdWFsaWZpZWROYW1lID0gdGhpcy5idWlsZFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCk7Ci0JCXRoaXMuYWJzdHJhY3RfID0gdGhpcy5idWlsZEFic3RyYWN0KCk7Ci0JCXRoaXMuaGFzTm9BcmdDb25zdHJ1Y3RvciA9IHRoaXMuYnVpbGRIYXNOb0FyZ0NvbnN0cnVjdG9yKCk7Ci0JCXRoaXMuaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IgPSB0aGlzLmJ1aWxkSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoKTsKLQkJdGhpcy5maWVsZHMgPSB0aGlzLmJ1aWxkRmllbGRzKCk7Ci0JCXRoaXMubWV0aG9kcyA9IHRoaXMuYnVpbGRNZXRob2RzKCk7Ci0JfQotCi0JcHVibGljIEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZC5UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSk7Ci0JCXRoaXMuc2V0QWJzdHJhY3QodGhpcy5idWlsZEFic3RyYWN0KCkpOwotCQl0aGlzLnNldEhhc05vQXJnQ29uc3RydWN0b3IodGhpcy5idWlsZEhhc05vQXJnQ29uc3RydWN0b3IoKSk7Ci0JCXRoaXMuc2V0SGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IodGhpcy5idWlsZEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKCkpOwotCQl0aGlzLnVwZGF0ZUZpZWxkcygpOwotCQl0aGlzLnVwZGF0ZU1ldGhvZHMoKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUZpZWxkcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVNZXRob2RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkKLQkKLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVR5cGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogc3VwZXJjbGFzcyBxdWFsaWZpZWQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnN1cGVyY2xhc3NRdWFsaWZpZWROYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZShTdHJpbmcgc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWU7Ci0JCXRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUgPSBzdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNVUEVSQ0xBU1NfUVVBTElGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiBjb252ZXJ0VHlwZVNpZ25hdHVyZVRvVHlwZU5hbWUodGhpcy5nZXRTdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTdXBlcmNsYXNzVHlwZVNpZ25hdHVyZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldE1lbWJlcigpLmdldFN1cGVyY2xhc3NUeXBlU2lnbmF0dXJlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqIGFic3RyYWN0Ci0JcHVibGljIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKLQkJcmV0dXJuIHRoaXMuYWJzdHJhY3RfOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRBYnN0cmFjdChib29sZWFuIGFic3RyYWN0XykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuYWJzdHJhY3RfOwotCQl0aGlzLmFic3RyYWN0XyA9IGFic3RyYWN0XzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEFCU1RSQUNUX1BST1BFUlRZLCBvbGQsIGFic3RyYWN0Xyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkQWJzdHJhY3QoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRmxhZ3MuaXNBYnN0cmFjdCh0aGlzLmdldE1lbWJlcigpLmdldEZsYWdzKCkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8vICoqKioqIG5vLWFyZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBib29sZWFuIGhhc05vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05vQXJnQ29uc3RydWN0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEhhc05vQXJnQ29uc3RydWN0b3IoYm9vbGVhbiBoYXNOb0FyZ0NvbnN0cnVjdG9yKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5oYXNOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmhhc05vQXJnQ29uc3RydWN0b3IgPSBoYXNOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fQVJHX0NPTlNUUlVDVE9SX1BST1BFUlRZLCBvbGQsIGhhc05vQXJnQ29uc3RydWN0b3IpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZEhhc05vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmZpbmROb0FyZ0NvbnN0cnVjdG9yKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElNZXRob2QgZmluZE5vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCXRyeSB7Ci0JCQlmb3IgKElNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZW1iZXIoKS5nZXRNZXRob2RzKCkpIHsKLQkJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogcHJpdmF0ZSBuby1hcmcgY29uc3RydWN0b3IKLQlwdWJsaWMgYm9vbGVhbiBoYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIHRoaXMuaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKGJvb2xlYW4gaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yID0gaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUl9QUk9QRVJUWSwgb2xkLCBoYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3Rvcik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCUlNZXRob2QgbWV0aG9kID0gdGhpcy5maW5kTm9BcmdDb25zdHJ1Y3RvcigpOwotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZCAhPSBudWxsICYmIEZsYWdzLmlzUHJpdmF0ZShtZXRob2QuZ2V0RmxhZ3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIHB1YmxpYy9wcm90ZWN0ZWQgbm8tYXJnIGNvbnN0cnVjdG9yICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaGFzUHVibGljT3JQcm90ZWN0ZWROb0FyZ0NvbnN0cnVjdG9yKCkgewotCQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGNvbnN0cnVjdG9ycyA9IGdldENvbnN0cnVjdG9ycygpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLnNpemUoY29uc3RydWN0b3JzKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJaWYgKGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBNb2RpZmllci5pc1B1YmxpYyhjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSkKLQkJCQkJCXx8IE1vZGlmaWVyLmlzUHJvdGVjdGVkKGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc1B1YmxpY05vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCUl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gY29uc3RydWN0b3JzID0gZ2V0Q29uc3RydWN0b3JzKCk7Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuc2l6ZShjb25zdHJ1Y3RvcnMpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7Ci0JCQlpZiAoY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyc1NpemUoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIE1vZGlmaWVyLmlzUHVibGljKGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0Q29uc3RydWN0b3JzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4oZ2V0TWV0aG9kcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VNZXRob2QgbykgewotCQkJCXJldHVybiBvLmlzQ29uc3RydWN0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRGaWVsZHMoKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlRmllbGQgZmllbGQgOiB0aGlzLmdldEZpZWxkcygpKSB7Ci0JCQlpZiAoZmllbGQuaXNBbm5vdGF0ZWQoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRNZXRob2RzKCkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJVHlwZSBnZXRNZW1iZXIoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRNZW1iZXIoKTsKLQl9Ci0KLQkvLyBUd28gbW9yZSByZXF1aXJlbWVudHMgZm9yIGEgdmFsaWQgZXF1YWxzKCkgbWV0aG9kOgotCS8vIDEuIEl0IHNob3VsZCBiZSBwdWJsaWMgCi0JLy8gMi4gVGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSBib29sZWFuCi0JLy8gQm90aCByZXF1aXJlbWVudHMgYXJlIHZhbGlkYXRlZCBieSB0aGUgY29tcGlsZXIgc28gdGhleSBhcmUgZXhjbHVkZWQgaGVyZQotCXB1YmxpYyBib29sZWFuIGhhc0VxdWFsc01ldGhvZCgpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldE1ldGhvZE5hbWUoKSwgImVxdWFscyIpCi0JCQkJCSYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDEKLQkJCQkJJiYgU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlTmFtZSgwKSwgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gVHdvIG1vcmUgcmVxdWlyZW1lbnRzIGZvciBhIHZhbGlkIGhhc2hDb2RlKCkgbWV0aG9kOgotCS8vIDEuIEl0IHNob3VsZCBiZSBwdWJsaWMgCi0JLy8gMi4gVGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSBpbnQKLQkvLyBCb3RoIHJlcXVpcmVtZW50cyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBjb21waWxlciBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlCi0JcHVibGljIGJvb2xlYW4gaGFzSGFzaENvZGVNZXRob2QoKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG1ldGhvZC5nZXRNZXRob2ROYW1lKCksICJoYXNoQ29kZSIpCi0JCQkJCSYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZU1ldGhvZCBnZXRNZXRob2QoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChtZXRob2QuZ2V0TWV0aG9kTmFtZSgpLCBwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGZpZWxkcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+IGdldEZpZWxkcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4odGhpcy5maWVsZHMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkRmllbGQoSmF2YVJlc291cmNlRmllbGQgZmllbGQpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGZpZWxkLCB0aGlzLmZpZWxkcywgRklFTERTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRmllbGQgZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCBmaWVsZCA6IHRoaXMuZ2V0RmllbGRzKCkpIHsKLQkJCWlmIChmaWVsZC5pc0ZvcihmaWVsZE5hbWUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIGZpZWxkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVGaWVsZHMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VGaWVsZD4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMuZmllbGRzLCBGSUVMRFNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8SmF2YVJlc291cmNlRmllbGQ+IGJ1aWxkRmllbGRzKCkgewotCQlJRmllbGRbXSBqZHRGaWVsZHMgPSB0aGlzLmdldEZpZWxkcyh0aGlzLmdldE1lbWJlcigpKTsKLQkJVmVjdG9yPEphdmFSZXNvdXJjZUZpZWxkPiByZXN1bHQgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZUZpZWxkPihqZHRGaWVsZHMubGVuZ3RoKTsKLQkJZm9yIChJRmllbGQgamR0RmllbGQgOiBqZHRGaWVsZHMpIHsKLQkJCXJlc3VsdC5hZGQodGhpcy5idWlsZEZpZWxkKGpkdEZpZWxkKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElGaWVsZFtdIGdldEZpZWxkcyhJVHlwZSB0eXBlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZS5nZXRGaWVsZHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gRU1QVFlfRklFTERfQVJSQVk7Ci0JCX0KLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUZpZWxkW10gRU1QVFlfRklFTERfQVJSQVkgPSBuZXcgSUZpZWxkWzBdOwotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VGaWVsZCBidWlsZEZpZWxkKElGaWVsZCBqZHRGaWVsZCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeUZpZWxkKHRoaXMsIGpkdEZpZWxkKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRNZXRob2RzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4odGhpcy5tZXRob2RzKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZU1ldGhvZCBnZXRNZXRob2QoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChtZXRob2QuaXNGb3Ioc2lnbmF0dXJlLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihtZXRob2QsIHRoaXMubWV0aG9kcywgTUVUSE9EU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWV0aG9kcyhDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMubWV0aG9kcywgTUVUSE9EU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxKYXZhUmVzb3VyY2VNZXRob2Q+IGJ1aWxkTWV0aG9kcygpIHsKLQkJSU1ldGhvZFtdIGpkdE1ldGhvZHMgPSB0aGlzLmdldE1ldGhvZHModGhpcy5nZXRNZW1iZXIoKSk7Ci0JCVZlY3RvcjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc3VsdCA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlTWV0aG9kPihqZHRNZXRob2RzLmxlbmd0aCk7Ci0JCWZvciAoSU1ldGhvZCBqZHRNZXRob2QgOiBqZHRNZXRob2RzKSB7Ci0JCQlyZXN1bHQuYWRkKHRoaXMuYnVpbGRNZXRob2QoamR0TWV0aG9kKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElNZXRob2RbXSBnZXRNZXRob2RzKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0eXBlLmdldE1ldGhvZHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gRU1QVFlfTUVUSE9EX0FSUkFZOwotCQl9Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElNZXRob2RbXSBFTVBUWV9NRVRIT0RfQVJSQVkgPSBuZXcgSU1ldGhvZFswXTsKLQotCXByaXZhdGUgSmF2YVJlc291cmNlTWV0aG9kIGJ1aWxkTWV0aG9kKElNZXRob2QgamR0TWV0aG9kKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TWV0aG9kKHRoaXMsIGpkdE1ldGhvZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUeXBlQ2FjaGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVR5cGVDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGM1Njg0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVR5cGVDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGVDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLS8qKgotICogY2FjaGUgdXNlZCB0byBob2xkIGJpbmFyeSAiZXh0ZXJuYWwiIEphdmEgcmVzb3VyY2UgdHlwZXMKLSAqICh0eXBpY2FsbHkgZGVyaXZlZCBmcm9tIEpBUnMgb24gdGhlIHByb2plY3QncyBidWlsZCBwYXRoKQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VHlwZUNhY2hlCi0JZXh0ZW5kcyBSb290QmluYXJ5Tm9kZQotCWltcGxlbWVudHMgSmF2YVJlc291cmNlVHlwZUNhY2hlCi17Ci0JLyoqIHBvcHVsYXRlZCBvbi1kZW1hbmQgKi8KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxFbnRyeT4gZW50cmllcyA9IG5ldyBWZWN0b3I8RW50cnk+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBCaW5hcnlUeXBlQ2FjaGUoQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcikgewotCQlzdXBlcihudWxsLCBhbm5vdGF0aW9uUHJvdmlkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxFbnRyeSwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPih0aGlzLmdldEVudHJpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHRyYW5zZm9ybShFbnRyeSBlbnRyeSkgewotCQkJCXJldHVybiBlbnRyeS50eXBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RW50cnk+IGdldEVudHJpZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8RW50cnk+KHRoaXMuZW50cmllcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRUeXBlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVudHJpZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkVHlwZShJVHlwZSBqZHRUeXBlKSB7Ci0JCUVudHJ5IGVudHJ5ID0gdGhpcy5idWlsZEVudHJ5KGpkdFR5cGUpOwotCQl0aGlzLmVudHJpZXMuYWRkKGVudHJ5KTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFRZUEVTX0NPTExFQ1RJT04sIGVudHJ5LnR5cGUpOwotCQlyZXR1cm4gZW50cnkudHlwZTsKLQl9Ci0KLQlwcml2YXRlIEVudHJ5IGJ1aWxkRW50cnkoSVR5cGUgamR0VHlwZSkgewotCQlyZXR1cm4gbmV3IEVudHJ5KHRoaXMuYnVpbGRUeXBlKGpkdFR5cGUpLCBqZHRUeXBlLmdldFJlc291cmNlKCkpOwotCX0KLQotCS8vaWdub3JlIGFubm90YXRpb25zCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYnVpbGRUeXBlKElUeXBlIGpkdFR5cGUpIHsKLQkJdHJ5IHsKLQkJCWlmIChqZHRUeXBlLmlzQ2xhc3MoKSB8fCBqZHRUeXBlLmlzSW50ZXJmYWNlKCkpIHsKLQkJCQlyZXR1cm4gbmV3IEJpbmFyeVR5cGUodGhpcywgamR0VHlwZSk7Ci0JCQl9Ci0JCQlpZiAoamR0VHlwZS5pc0VudW0oKSkgewotCQkJCXJldHVybiBuZXcgQmluYXJ5RW51bSh0aGlzLCBqZHRUeXBlKTsKLQkJCX0KLQkJfQotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlVHlwZXMoSUZpbGUgamFyRmlsZSkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCWZvciAoRW50cnkgZW50cnkgOiB0aGlzLmdldEVudHJpZXMoKSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZW50cnkucmVzb3VyY2U7Ci0JCQlpZiAoKHJlc291cmNlICE9IG51bGwpICYmIHJlc291cmNlLmVxdWFscyhqYXJGaWxlKSkgewotCQkJCXRoaXMucmVtb3ZlRW50cnkoZW50cnkpOwotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudHJ5KEVudHJ5IGVudHJ5KSB7Ci0JCXRoaXMuZW50cmllcy5yZW1vdmUoZW50cnkpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUWVBFU19DT0xMRUNUSU9OLCBlbnRyeS50eXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIElnbm9yZSBjaGFuZ2VzIHRvIHRoaXMgY29sbGVjdGlvbi4gQWRkcyBjYW4gYmUgaWdub3JlZCBzaW5jZSB0aGV5IGFyZSB0cmlnZ2VyZWQKLQkgKiBieSByZXF1ZXN0cyB0aGF0IHdpbGwsIHRoZW1zZWx2ZXMsIHRyaWdnZXIgdXBkYXRlcyAodHlwaWNhbGx5IGR1cmluZyB0aGUKLQkgKiB1cGRhdGUgb2YgYW4gb2JqZWN0IHRoYXQgY2FsbHMgYSBzZXR0ZXIgd2l0aCB0aGUgbmV3bHktY3JlYXRlZCByZXNvdXJjZQotCSAqIHR5cGUpLiBEZWxldGVzIHdpbGwgYmUgYWNjb21wYW5pZWQgYnkgbWFudWFsIHVwZGF0ZXMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAoKGFzcGVjdE5hbWUgIT0gbnVsbCkgJiYgISBhc3BlY3ROYW1lLmVxdWFscyhUWVBFU19DT0xMRUNUSU9OKSkgewotCQkJc3VwZXIuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZW50cmllcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhY2hlIGVudHJ5ICoqKioqKioqKioKLQotCS8qKgotCSAqIEFzc29jaWF0ZSBhIHR5cGUgd2l0aCBpdHMgcmVzb3VyY2UuCi0JICogVGhpcyB3aWxsIGJlIGEgSkFSIGluIHRoZSBjYXNlIG9mIGEgdHlwZSBsb2FkZWQgZnJvbSBhIEpBUiB0aGF0IGlzIGluCi0JICogdGhlIEVjbGlwc2Ugd29ya3NwYWNlLiBUaGUgcmVzb3VyY2Ugd2lsbCBiZSBudWxsIGZvciBhIHR5cGUgbG9hZGVkCi0JICogZnJvbSBhIEpBUiBvciBjbGFzcyBkaXJlY3Rvcnkgb3V0c2lkZSBvZiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXN0YXRpYyBjbGFzcyBFbnRyeSB7Ci0JCWZpbmFsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlOwotCQlmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2U7Ci0KLQkJRW50cnkoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHR5cGUsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudHlwZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvUm9vdEJpbmFyeU5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L1Jvb3RCaW5hcnlOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmNmNjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvUm9vdEJpbmFyeU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotCi0vKioKLSAqIEpBUiBhbmQgZXh0ZXJuYWwgdHlwZXMKLSAqLwotYWJzdHJhY3QgY2xhc3MgUm9vdEJpbmFyeU5vZGUKLQlleHRlbmRzIEJpbmFyeU5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU5vZGUuUm9vdAotewotCS8qKiBwbHVnZ2FibGUgYW5ub3RhdGlvbiBwcm92aWRlciAqLwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKLQotCS8qKiBsaXN0ZW5lcnMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcj4oSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCQotCVJvb3RCaW5hcnlOb2RlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYW5ub3RhdGlvblByb3ZpZGVyID0gYW5ub3RhdGlvblByb3ZpZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUm9vdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvblByb3ZpZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKSB7Ci0JCWZvciAoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcHRSZXNvdXJjZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX1JFU09VUkNFX1RZUEU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQWJzdHJhY3RUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBYnN0cmFjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMzYjMwOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBYnN0cmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSW50UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSB0eXBlCi0gKi8KLWFic3RyYWN0IGNsYXNzIFNvdXJjZUFic3RyYWN0VHlwZTxBIGV4dGVuZHMgQWJzdHJhY3RUeXBlPgotCWV4dGVuZHMgU291cmNlTWVtYmVyPEE+Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUKLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmaWVkTmFtZTsKLQotCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOwotCi0JcHJpdmF0ZSBTdHJpbmcgZGVjbGFyaW5nVHlwZU5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWVtYmVyVHlwZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFNvdXJjZUFic3RyYWN0VHlwZShKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBBIHR5cGUpIHsKLQkJc3VwZXIoamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGJpbmRpbmcpOwotCQl0aGlzLnF1YWxpZmllZE5hbWUgPSB0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZShiaW5kaW5nKTsKLQkJdGhpcy5wYWNrYWdlTmFtZSA9IHRoaXMuYnVpbGRQYWNrYWdlTmFtZShiaW5kaW5nKTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9IHRoaXMuYnVpbGREZWNsYXJpbmdUeXBlTmFtZShiaW5kaW5nKTsKLQkJdGhpcy5tZW1iZXJUeXBlID0gdGhpcy5idWlsZE1lbWJlclR5cGUoYmluZGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZShiaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1BhY2thZ2VOYW1lKHRoaXMuYnVpbGRQYWNrYWdlTmFtZShiaW5kaW5nKSk7Ci0JCXRoaXMuc3luY0RlY2xhcmluZ1R5cGVOYW1lKHRoaXMuYnVpbGREZWNsYXJpbmdUeXBlTmFtZShiaW5kaW5nKSk7Ci0JCXRoaXMuc3luY01lbWJlclR5cGUodGhpcy5idWlsZE1lbWJlclR5cGUoYmluZGluZykpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBiaW5kaW5nLmdldE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKiBxdWFsaWZpZWQgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVhbGlmaWVkTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1F1YWxpZmllZE5hbWUoU3RyaW5nIGFzdFF1YWxpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5xdWFsaWZpZWROYW1lID0gYXN0UXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVQUxJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIGFzdFF1YWxpZmllZE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkTmFtZShJVHlwZUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogYmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JLy8gKioqKiogcGFja2FnZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQYWNrYWdlTmFtZShTdHJpbmcgYXN0UGFja2FnZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFja2FnZU5hbWU7Ci0JCXRoaXMucGFja2FnZU5hbWUgPSBhc3RQYWNrYWdlTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBBQ0tBR0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3RQYWNrYWdlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRQYWNrYWdlTmFtZShJVHlwZUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogYmluZGluZy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8vICoqKioqIHBhY2thZ2UKLQlwdWJsaWMgYm9vbGVhbiBpc0luKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwocGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCksIHRoaXMucGFja2FnZU5hbWUpOwotCX0KLQotCS8vICoqKioqIHNvdXJjZSBmb2xkZXIKLQlwdWJsaWMgYm9vbGVhbiBpc0luKElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlcikgewotCQlyZXR1cm4gZ2V0U291cmNlRm9sZGVyKCkuZXF1YWxzKHNvdXJjZUZvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRTb3VyY2VGb2xkZXIoKSB7Ci0JCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpIHRoaXMuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkuZ2V0Q29tcGlsYXRpb25Vbml0KCkuZ2V0QW5jZXN0b3IoSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JfQotCi0JLy8gKioqKiogZGVjbGFyaW5nIHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyaW5nVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlY2xhcmluZ1R5cGVOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRGVjbGFyaW5nVHlwZU5hbWUoU3RyaW5nIGFzdERlY2xhcmluZ1R5cGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlY2xhcmluZ1R5cGVOYW1lOwotCQl0aGlzLmRlY2xhcmluZ1R5cGVOYW1lID0gYXN0RGVjbGFyaW5nVHlwZU5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUNMQVJJTkdfVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIGFzdERlY2xhcmluZ1R5cGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlY2xhcmluZ1R5cGVOYW1lKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCWlmIChiaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUeXBlQmluZGluZyBkZWNsYXJpbmdDbGFzcyA9IGJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJcmV0dXJuIChkZWNsYXJpbmdDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBkZWNsYXJpbmdDbGFzcy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JLy8gKioqKiogbWVtYmVyIHR5cGUKLQlwdWJsaWMgYm9vbGVhbiBpc01lbWJlclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1lbWJlclR5cGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNNZW1iZXJUeXBlKGJvb2xlYW4gbWVtYmVyVHlwZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMubWVtYmVyVHlwZTsKLQkJdGhpcy5tZW1iZXJUeXBlID0gbWVtYmVyVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1FTUJFUl9UWVBFX1BST1BFUlRZLCBvbGQsIG1lbWJlclR5cGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZE1lbWJlclR5cGUoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiBiaW5kaW5nLmlzTWVtYmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvdW50ZXJNYXAgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb3VudGVyTWFwIHsKLQkJcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPE9iamVjdCwgU2ltcGxlSW50UmVmZXJlbmNlPiBjb3VudGVyczsKLQotCQlwcm90ZWN0ZWQgQ291bnRlck1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb3VudGVycyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgU2ltcGxlSW50UmVmZXJlbmNlPihpbml0aWFsQ2FwYWNpdHkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW5jcmVtZW50ZWQgY291bnQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJaW50IGluY3JlbWVudChPYmplY3QgbykgewotCQkJU2ltcGxlSW50UmVmZXJlbmNlIGNvdW50ZXIgPSB0aGlzLmNvdW50ZXJzLmdldChvKTsKLQkJCWlmIChjb3VudGVyID09IG51bGwpIHsKLQkJCQljb3VudGVyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQkJCXRoaXMuY291bnRlcnMucHV0KG8sIGNvdW50ZXIpOwotCQkJfQotCQkJY291bnRlci5pbmNyZW1lbnQoKTsKLQkJCXJldHVybiBjb3VudGVyLmdldFZhbHVlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFubm90YXRlZEVsZW1lbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFubm90YXRlZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzOGE5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBbm5vdGF0ZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIGFubm90YXRlZCBlbGVtZW50IChhbm5vdGF0aW9ucykKLSAqLwotYWJzdHJhY3QgY2xhc3MgU291cmNlQW5ub3RhdGVkRWxlbWVudDxBIGV4dGVuZHMgQW5ub3RhdGVkRWxlbWVudD4KLQlleHRlbmRzIFNvdXJjZU5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQKLXsKLQlmaW5hbCBBIGFubm90YXRlZEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBhbm5vdGF0aW9uczsgbm8gZHVwbGljYXRlcyAoamF2YSBjb21waWxlciBoYXMgYW4gZXJyb3IgZm9yIGR1cGxpY2F0ZXMpCi0JICovCi0JZmluYWwgVmVjdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zID0gbmV3IFZlY3RvcjxBbm5vdGF0aW9uPigpOwotCi0JLyoqCi0JICogQW5ub3RhdGlvbiBjb250YWluZXJzIGtleWVkIG9uIG5lc3RhYmxlIGFubm90YXRpb24gbmFtZS4KLQkgKiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgYW5ub3RhdGlvbnMgdGhhdCBjYW4gYmUgYm90aCBzdGFuZGFsb25lIGFuZCBuZXN0ZWQKLQkgKiBhbmQgYXJlIG1vdmVkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gdGhlIDIuCi0JICovCi0JZmluYWwgTWFwPFN0cmluZywgQW5ub3RhdGlvbkNvbnRhaW5lcj4gYW5ub3RhdGlvbkNvbnRhaW5lcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb25Db250YWluZXI+KCk7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlTb3VyY2VBbm5vdGF0ZWRFbGVtZW50KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBIGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUFTVE5vZGUgbm9kZSA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCW5vZGUuYWNjZXB0KHRoaXMuYnVpbGRJbml0aWFsQW5ub3RhdGlvblZpc2l0b3Iobm9kZSkpOwotCX0KLQotCXByaXZhdGUgQVNUVmlzaXRvciBidWlsZEluaXRpYWxBbm5vdGF0aW9uVmlzaXRvcihBU1ROb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG5ldyBJbml0aWFsQW5ub3RhdGlvblZpc2l0b3Iobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGZyb20ge0BsaW5rIEluaXRpYWxBbm5vdGF0aW9uVmlzaXRvcn0KLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgYWRkSW5pdGlhbEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSkgewotCQlTdHJpbmcgamR0QW5ub3RhdGlvbk5hbWUgPSBBU1RUb29scy5yZXNvbHZlQW5ub3RhdGlvbihub2RlKTsKLQkJaWYgKGpkdEFubm90YXRpb25OYW1lICE9IG51bGwpIHsKLQkJCWlmKHRoaXMuYW5ub3RhdGlvbklzVmFsaWRDb250YWluZXIoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUgPSB0aGlzLmdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoamR0QW5ub3RhdGlvbk5hbWUpOwotCQkJCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IEFubm90YXRpb25Db250YWluZXIobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCQkJY29udGFpbmVyLmluaXRpYWxpemUobm9kZSk7Ci0JCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWQoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJaWYgKHRoaXMuc2VsZWN0QW5ub3RhdGlvbk5hbWVkKHRoaXMuYW5ub3RhdGlvbnMsIGpkdEFubm90YXRpb25OYW1lKSA9PSBudWxsKSB7IC8vIGlnbm9yZSBkdXBsaWNhdGVzCi0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uKGpkdEFubm90YXRpb25OYW1lKTsKLQkJCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKChDb21waWxhdGlvblVuaXQpIG5vZGUuZ2V0Um9vdCgpKTsKLQkJCQkJdGhpcy5hbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZih0aGlzLmFubm90YXRpb25Jc1ZhbGlkTmVzdGFibGUoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgQW5ub3RhdGlvbkNvbnRhaW5lcihqZHRBbm5vdGF0aW9uTmFtZSk7Ci0JCQkJY29udGFpbmVyLmluaXRpYWxpemVOZXN0YWJsZUFubm90YXRpb24obm9kZSk7Ci0JCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQoamR0QW5ub3RhdGlvbk5hbWUsIGNvbnRhaW5lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jQW5ub3RhdGlvbnModGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFubm90YXRpb25zICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxBbm5vdGF0aW9uPih0aGlzLmFubm90YXRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFubm90YXRpb25zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbnMuc2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldE5lc3RhYmxlQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlQW5ub3RhdGlvbkxpc3RzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPj4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBbm5vdGF0aW9uQ29udGFpbmVyLCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+Pih0aGlzLmFubm90YXRpb25Db250YWluZXJzLnZhbHVlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IHRyYW5zZm9ybShBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQkJCXJldHVybiBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNWYWxpZENvbnRhaW5lcihhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQoZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShhbm5vdGF0aW9uTmFtZSkpOwotCQkJcmV0dXJuIGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6IGNvbnRhaW5lci5nZXRDb250YWluZXJBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2VsZWN0QW5ub3RhdGlvbk5hbWVkKHRoaXMuZ2V0QW5ub3RhdGlvbnMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldE5vbk51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24oYW5ub3RhdGlvbk5hbWUpOwotCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5idWlsZE51bGxBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIGNvbnRhaW5lciAhPSBudWxsID8gY29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zKCkgOiBFbXB0eUxpc3RJdGVyYWJsZS48TmVzdGFibGVBbm5vdGF0aW9uPiBpbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QW5ub3RhdGlvbnNTaXplKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBjb250YWluZXIgPT0gbnVsbCA/IDAgOiBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGludCBpbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJcmV0dXJuIGNvbnRhaW5lciA9PSBudWxsID8gbnVsbCA6IGNvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldENvbnRhaW5lckFubm90YXRpb24oU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQoZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShjb250YWluZXJBbm5vdGF0aW9uTmFtZSkpOwotCQlyZXR1cm4gY29udGFpbmVyID09IG51bGwgPyBudWxsIDogY29udGFpbmVyLmdldENvbnRhaW5lckFubm90YXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZShjb250YWluZXJBbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmVzdGFibGVFbGVtZW50TmFtZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVFbGVtZW50TmFtZShuZXN0YWJsZUFubm90YXRpb25OYW1lKTsJCQotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uKGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5hbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24ubmV3QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQlBbm5vdGF0aW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMuZ2V0KG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCWNvbnRhaW5lciA9IG5ldyBBbm5vdGF0aW9uQ29udGFpbmVyKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyKTsKLQkJfQotCQlyZXR1cm4gY29udGFpbmVyLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSkgewotCQl0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKS5tb3ZlTmVzdGVkQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVBbm5vdGF0aW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQl0aGlzLmFubm90YXRpb25zLnJlbW92ZShhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCWNvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQkJaWYgKGNvbnRhaW5lci5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMucmVtb3ZlKG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW5ub3RhdGlvbklzVmFsaWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRWYWxpZEFubm90YXRpb25OYW1lcygpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW5ub3RhdGlvbklzVmFsaWRDb250YWluZXIoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRWYWxpZENvbnRhaW5lckFubm90YXRpb25OYW1lcygpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYW5ub3RhdGlvbklzVmFsaWROZXN0YWJsZShTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFZhbGlkTmVzdGFibGVBbm5vdGF0aW9uTmFtZXMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsaWRBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmdldEFubm90YXRpb25OYW1lcygpOwotCX0KLQotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsaWRDb250YWluZXJBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmdldENvbnRhaW5lckFubm90YXRpb25OYW1lcygpOwotCX0KLQotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsaWROZXN0YWJsZUFubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZXMoKTsKLQl9Ci0KLQlBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYnVpbGRBbm5vdGF0aW9uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCUFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuYnVpbGROdWxsQW5ub3RhdGlvbih0aGlzLCBhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkTmVzdGFibGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25Qcm92aWRlcigpLmJ1aWxkQW5ub3RhdGlvbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGFubm90YXRpb25OYW1lLCBpbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNBbm5vdGF0aW9ucyhBU1ROb2RlIG5vZGUpIHsKLQkJSGFzaFNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8QW5ub3RhdGlvbj4odGhpcy5hbm5vdGF0aW9ucyk7Ci0KLQkJSGFzaFNldDxBbm5vdGF0aW9uQ29udGFpbmVyPiBjb250YWluZXJzVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxBbm5vdGF0aW9uQ29udGFpbmVyPih0aGlzLmFubm90YXRpb25Db250YWluZXJzLnZhbHVlcygpKTsKLQkJbm9kZS5hY2NlcHQodGhpcy5idWlsZFN5bmNocm9uaXplQW5ub3RhdGlvblZpc2l0b3Iobm9kZSwgYW5ub3RhdGlvbnNUb1JlbW92ZSwgY29udGFpbmVyc1RvUmVtb3ZlKSk7Ci0KLQkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihhbm5vdGF0aW9uLCB0aGlzLmFubm90YXRpb25zLCBBTk5PVEFUSU9OU19DT0xMRUNUSU9OKTsKLQkJfQotCi0JCWZvciAoQW5ub3RhdGlvbkNvbnRhaW5lciBhbm5vdGF0aW9uQ29udGFpbmVyIDogY29udGFpbmVyc1RvUmVtb3ZlKSB7Ci0JCQl0aGlzLmFubm90YXRpb25Db250YWluZXJzLnJlbW92ZShhbm5vdGF0aW9uQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25OYW1lKCkpOwotCQkJZmlyZUl0ZW1zUmVtb3ZlZChORVNUQUJMRV9BTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihhbm5vdGF0aW9uQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zKCkpKTsKLQkJfQotCi0JCUl0ZXJhdG9yPFN0cmluZz4ga2V5cyA9IHRoaXMuYW5ub3RhdGlvbkNvbnRhaW5lcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCi0JCXdoaWxlIChrZXlzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0ga2V5cy5uZXh0KCk7Ci0JCQlpZiAodGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5nZXQoYW5ub3RhdGlvbk5hbWUpLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpID09IDApIHsKLQkJCQlrZXlzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBU1RWaXNpdG9yIGJ1aWxkU3luY2hyb25pemVBbm5vdGF0aW9uVmlzaXRvcihBU1ROb2RlIG5vZGUsIFNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlLCBTZXQ8QW5ub3RhdGlvbkNvbnRhaW5lcj4gY29udGFpbmVyc1RvUmVtb3ZlKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVBbm5vdGF0aW9uVmlzaXRvcihub2RlLCBhbm5vdGF0aW9uc1RvUmVtb3ZlLCBjb250YWluZXJzVG9SZW1vdmUpOwotCX0KLQotCS8qKgotCSAqIGNhbGxlZCBmcm9tIHtAbGluayBTeW5jaHJvbml6ZUFubm90YXRpb25WaXNpdG9yfQotCSAqLwotCS8qIHByaXZhdGUgKi8gdm9pZCBhZGRPclN5bmNBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUsIFNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlLCBTZXQ8QW5ub3RhdGlvbkNvbnRhaW5lcj4gY29udGFpbmVyc1RvUmVtb3ZlKSB7Ci0JCVN0cmluZyBqZHRBbm5vdGF0aW9uTmFtZSA9IEFTVFRvb2xzLnJlc29sdmVBbm5vdGF0aW9uKG5vZGUpOwotCQlpZiAoamR0QW5ub3RhdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWRDb250YWluZXIoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJdGhpcy5hZGRPclN5bmNDb250YWluZXJBbm5vdGF0aW9uXyhub2RlLCBqZHRBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyc1RvUmVtb3ZlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuYW5ub3RhdGlvbklzVmFsaWQoamR0QW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJdGhpcy5hZGRPclN5bmNBbm5vdGF0aW9uXyhub2RlLCBqZHRBbm5vdGF0aW9uTmFtZSwgYW5ub3RhdGlvbnNUb1JlbW92ZSk7Ci0JCQl9Ci0JCQllbHNlIGlmKHRoaXMuYW5ub3RhdGlvbklzVmFsaWROZXN0YWJsZShqZHRBbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQl0aGlzLmFkZE9yU3luY05lc3RhYmxlQW5ub3RhdGlvbl8obm9kZSwgamR0QW5ub3RhdGlvbk5hbWUsIGNvbnRhaW5lcnNUb1JlbW92ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBqZHRBbm5vdGF0aW9uTmFtZSBpcyB2YWxpZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRPclN5bmNBbm5vdGF0aW9uXyhvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlLCBTdHJpbmcgamR0QW5ub3RhdGlvbk5hbWUsIFNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuc2VsZWN0QW5ub3RhdGlvbk5hbWVkKGFubm90YXRpb25zVG9SZW1vdmUsIGpkdEFubm90YXRpb25OYW1lKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJYW5ub3RhdGlvbi5zeW5jaHJvbml6ZVdpdGgoKENvbXBpbGF0aW9uVW5pdCkgbm9kZS5nZXRSb290KCkpOwotCQkJYW5ub3RhdGlvbnNUb1JlbW92ZS5yZW1vdmUoYW5ub3RhdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlhbm5vdGF0aW9uID0gdGhpcy5idWlsZEFubm90YXRpb24oamR0QW5ub3RhdGlvbk5hbWUpOwotCQkJYW5ub3RhdGlvbi5pbml0aWFsaXplKChDb21waWxhdGlvblVuaXQpIG5vZGUuZ2V0Um9vdCgpKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihhbm5vdGF0aW9uLCB0aGlzLmFubm90YXRpb25zLCBBTk5PVEFUSU9OU19DT0xMRUNUSU9OKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGpkdEFubm90YXRpb25OYW1lIGlzIHZhbGlkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE9yU3luY05lc3RhYmxlQW5ub3RhdGlvbl8ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIFNldDxBbm5vdGF0aW9uQ29udGFpbmVyPiBjb250YWluZXJzVG9SZW1vdmUpIHsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQljb250YWluZXIuc3luY2hyb25pemVOZXN0YWJsZUFubm90YXRpb24obm9kZSk7Ci0JCQljb250YWluZXJzVG9SZW1vdmUucmVtb3ZlKGNvbnRhaW5lcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljb250YWluZXIgPSBuZXcgQW5ub3RhdGlvbkNvbnRhaW5lcihuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJCWNvbnRhaW5lci5pbml0aWFsaXplTmVzdGFibGVBbm5vdGF0aW9uKG5vZGUpOwotCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChORVNUQUJMRV9BTk5PVEFUSU9OU19DT0xMRUNUSU9OLCBjb250YWluZXIubmVzdGVkQW5ub3RhdGlvbkF0KDApKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IG5vZGUgaXMgdmFsaWQgY29udGFpbmVyIGFubm90YXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkT3JTeW5jQ29udGFpbmVyQW5ub3RhdGlvbl8ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lLCBTZXQ8QW5ub3RhdGlvbkNvbnRhaW5lcj4gY29udGFpbmVyc1RvUmVtb3ZlKSB7Ci0JCVN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lID0gdGhpcy5nZXROZXN0YWJsZUFubm90YXRpb25OYW1lKGNvbnRhaW5lckFubm90YXRpb25OYW1lKTsKLQkJQW5ub3RhdGlvbkNvbnRhaW5lciBjb250YWluZXIgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLmdldChuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQljb250YWluZXIgPSBuZXcgQW5ub3RhdGlvbkNvbnRhaW5lcihuZXN0YWJsZUFubm90YXRpb25OYW1lKTsKLQkJCWNvbnRhaW5lci5pbml0aWFsaXplKG5vZGUpOwotCQkJdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5wdXQobmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgY29udGFpbmVyKTsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTkVTVEFCTEVfQU5OT1RBVElPTlNfQ09MTEVDVElPTiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zKCkpKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbnRhaW5lci5zeW5jaHJvbml6ZShub2RlKTsKLQkJCWNvbnRhaW5lcnNUb1JlbW92ZS5yZW1vdmUoY29udGFpbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8QW5ub3RhdGlvbj4gZ2V0QWxsQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QW5ub3RhdGlvbj4oCi0JCQkJZ2V0QW5ub3RhdGlvbnMoKSwKLQkJCQlnZXRDb250YWluZXJPck5lc3RhYmxlQW5ub3RhdGlvbnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxBbm5vdGF0aW9uPiBnZXRDb250YWluZXJPck5lc3RhYmxlQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBbm5vdGF0aW9uQ29udGFpbmVyLCBBbm5vdGF0aW9uPih0aGlzLmFubm90YXRpb25Db250YWluZXJzLnZhbHVlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBbm5vdGF0aW9uIHRyYW5zZm9ybShBbm5vdGF0aW9uQ29udGFpbmVyIG8pIHsKLQkJCQlyZXR1cm4gKG8uZ2V0Q29udGFpbmVyQW5ub3RhdGlvbigpICE9IG51bGwpID8gby5nZXRDb250YWluZXJBbm5vdGF0aW9uKCkgOiBDb2xsZWN0aW9uVG9vbHMuZ2V0KG8uZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKSwgMCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkKCkgewotCQlyZXR1cm4gISAodGhpcy5hbm5vdGF0aW9ucy5pc0VtcHR5KCkgJiYgdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVycy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkV2l0aChJdGVyYWJsZTxTdHJpbmc+IGFubm90YXRpb25OYW1lcykgewotCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IHRoaXMuZ2V0QW5ub3RhdGlvbnMoKSkgewotCQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhbm5vdGF0aW9uTmFtZXMsIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IHRoaXMuZ2V0TmVzdGFibGVBbm5vdGF0aW9ucygpKSB7Ci0JCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb25OYW1lcywgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQW5ub3RhdGlvbiBjb250YWluZXJBbm5vdGF0aW9uID0gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5nZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZShuZXN0YWJsZUFubm90YXRpb25OYW1lKSk7Ci0JCWlmIChjb250YWluZXJBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBjb250YWluZXJBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCQlBbm5vdGF0aW9uIG5lc3RhYmxlQW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oMCwgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCXJldHVybiBuZXN0YWJsZUFubm90YXRpb24gPT0gbnVsbCA/IG51bGwgOiBuZXN0YWJsZUFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIHNlbGVjdEFubm90YXRpb25OYW1lZChJdGVyYWJsZTxBbm5vdGF0aW9uPiBsaXN0LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBsaXN0KSB7Ci0JCQlpZiAoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLmVxdWFscyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShBU1ROb2RlIGFzdE5vZGUpIHsKLQkJcmV0dXJuIChhc3ROb2RlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGFzdE5vZGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBU1QgdmlzaXRvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogYW5ub3RhdGlvbiB2aXNpdG9yCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uVmlzaXRvcgotCQkJZXh0ZW5kcyBBU1RWaXNpdG9yCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgQVNUTm9kZSBub2RlOwotCi0KLQkJcHJvdGVjdGVkIEFubm90YXRpb25WaXNpdG9yKEFTVE5vZGUgbm9kZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQlyZXR1cm4gdGhpcy52aXNpdF8obm9kZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTm9ybWFsQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQlyZXR1cm4gdGhpcy52aXNpdF8obm9kZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoTWFya2VyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQlyZXR1cm4gdGhpcy52aXNpdF8obm9kZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpdF8ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSkgewotCQkJLy8gaWdub3JlIGFubm90YXRpb25zIGZvciBjaGlsZCBtZW1iZXJzLCBvbmx5IHRoaXMgbWVtYmVyCi0JCQlpZiAobm9kZS5nZXRQYXJlbnQoKSA9PSB0aGlzLm5vZGUpIHsKLQkJCQl0aGlzLnZpc2l0Q2hpbGRBbm5vdGF0aW9uKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmlzaXRDaGlsZEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gbm9kZSk7Ci0JfQotCi0KLQkvKioKLQkgKiBpbml0aWFsIGFubm90YXRpb24gdmlzaXRvcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBJbml0aWFsQW5ub3RhdGlvblZpc2l0b3IKLQkJCWV4dGVuZHMgQW5ub3RhdGlvblZpc2l0b3IKLQl7Ci0JCXByb3RlY3RlZCBJbml0aWFsQW5ub3RhdGlvblZpc2l0b3IoQVNUTm9kZSBub2RlKSB7Ci0JCQlzdXBlcihub2RlKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2aXNpdENoaWxkQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBub2RlKSB7Ci0JCQlTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuYWRkSW5pdGlhbEFubm90YXRpb24obm9kZSk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIGFubm90YXRpb24gdmlzaXRvcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTeW5jaHJvbml6ZUFubm90YXRpb25WaXNpdG9yCi0JCQlleHRlbmRzIEFubm90YXRpb25WaXNpdG9yCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgU2V0PEFubm90YXRpb24+IGFubm90YXRpb25zVG9SZW1vdmU7Ci0JCXByb3RlY3RlZCBmaW5hbCBTZXQ8QW5ub3RhdGlvbkNvbnRhaW5lcj4gY29udGFpbmVyc1RvUmVtb3ZlOwotCi0JCXByb3RlY3RlZCBTeW5jaHJvbml6ZUFubm90YXRpb25WaXNpdG9yKEFTVE5vZGUgbm9kZSwgU2V0PEFubm90YXRpb24+IGFubm90YXRpb25zVG9SZW1vdmUsIFNldDxBbm5vdGF0aW9uQ29udGFpbmVyPiBjb250YWluZXJzVG9SZW1vdmUpIHsKLQkJCXN1cGVyKG5vZGUpOwotCQkJdGhpcy5hbm5vdGF0aW9uc1RvUmVtb3ZlID0gYW5ub3RhdGlvbnNUb1JlbW92ZTsKLQkJCXRoaXMuY29udGFpbmVyc1RvUmVtb3ZlID0gY29udGFpbmVyc1RvUmVtb3ZlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGRBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIG5vZGUpIHsKLQkJCVNvdXJjZUFubm90YXRlZEVsZW1lbnQudGhpcy5hZGRPclN5bmNBbm5vdGF0aW9uKG5vZGUsIHRoaXMuYW5ub3RhdGlvbnNUb1JlbW92ZSwgdGhpcy5jb250YWluZXJzVG9SZW1vdmUpOwotCQl9Ci0JfQotCi0KLQljbGFzcyBBbm5vdGF0aW9uQ29udGFpbmVyIGV4dGVuZHMgU291cmNlTm9kZS5Bbm5vdGF0aW9uQ29udGFpbmVyPE5lc3RhYmxlQW5ub3RhdGlvbj4KLQl7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWU7Ci0KLQkJcHJpdmF0ZSBBbm5vdGF0aW9uIGNvbnRhaW5lckFubm90YXRpb247Ci0JCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uQ29udGFpbmVyKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uZXN0YWJsZUFubm90YXRpb25OYW1lID0gbmVzdGFibGVBbm5vdGF0aW9uTmFtZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdENvbnRhaW5lckFubm90YXRpb24pIHsKLQkJCXN1cGVyLmluaXRpYWxpemUoYXN0Q29udGFpbmVyQW5ub3RhdGlvbik7Ci0JCQl0aGlzLmNvbnRhaW5lckFubm90YXRpb24gPSB0aGlzLmJ1aWxkQ29udGFpbmVyQW5ub3RhdGlvbihBU1RUb29scy5yZXNvbHZlQW5ub3RhdGlvbihhc3RDb250YWluZXJBbm5vdGF0aW9uKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBidWlsZENvbnRhaW5lckFubm90YXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJCXJldHVybiBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZEFubm90YXRpb24oU291cmNlQW5ub3RhdGVkRWxlbWVudC50aGlzLCBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuYW5ub3RhdGVkRWxlbWVudCwgbmFtZSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRDb250YWluZXJBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuY29udGFpbmVyQW5ub3RhdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RDb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCQlzdXBlci5zeW5jaHJvbml6ZShhc3RDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgbmFtZSBvZiB0aGUgbmVzdGVkIGFubm90YXRpb25zCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuZ2V0TmVzdGFibGVFbGVtZW50TmFtZSh0aGlzLm5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmVzdGVkIGFubm90YXRpb24gbmFtZQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXN0YWJsZUFubm90YXRpb25OYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIG5ldyBuZXN0ZWQgYW5ub3RhdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXgKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuYnVpbGROZXN0YWJsZUFubm90YXRpb24odGhpcy5uZXN0YWJsZUFubm90YXRpb25OYW1lLCBpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTmVzdGFibGVBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIHN0YW5kYWxvbmVOZXN0YWJsZUFubm90YXRpb24pIHsKLQkJCU5lc3RhYmxlQW5ub3RhdGlvbiBuZXN0ZWRBbm5vdGF0aW9uID0gdGhpcy5idWlsZE5lc3RlZEFubm90YXRpb24oMCk7Ci0JCQl0aGlzLm5lc3RlZEFubm90YXRpb25zLmFkZChuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJCW5lc3RlZEFubm90YXRpb24uaW5pdGlhbGl6ZSgoQ29tcGlsYXRpb25Vbml0KSBzdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9uLmdldFJvb3QoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU5lc3RhYmxlQW5ub3RhdGlvbihvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBzdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9uKSB7Ci0JCQlpZiAodGhpcy5nZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSA+IDEpIHsKLQkJCQkvL2lnbm9yZSB0aGUgbmV3IHN0YW5kYWxvbmUgYW5ub3RhdGlvbiBhcyBhIGNvbnRhaW5lciBhbm5vdGF0aW9uIGFscmVhZHkgZXhpc3RzCi0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpID09IDEpIHsKLQkJCQl0aGlzLmNvbnRhaW5lckFubm90YXRpb24gPSBudWxsOwotCQkJCXRoaXMubmVzdGVkQW5ub3RhdGlvbkF0KDApLnN5bmNocm9uaXplV2l0aCgoQ29tcGlsYXRpb25Vbml0KSBzdGFuZGFsb25lTmVzdGFibGVBbm5vdGF0aW9uLmdldFJvb3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBhZGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJaWYgKGdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpID09IDEgJiYgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbigpID09IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRhaW5lckFubm90YXRpb24gPSBidWlsZENvbnRhaW5lckFubm90YXRpb24oZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSkpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gcmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCWlmIChnZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKSA9PSAyKSB7Ci0JCQkJdGhpcy5jb250YWluZXJBbm5vdGF0aW9uID0gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbUFkZGVkKGludCBpbmRleCwgTmVzdGFibGVBbm5vdGF0aW9uIG5lc3RlZEFubm90YXRpb24pIHsKLQkJCVNvdXJjZUFubm90YXRlZEVsZW1lbnQudGhpcy5maXJlSXRlbUFkZGVkKE5FU1RBQkxFX0FOTk9UQVRJT05TX0NPTExFQ1RJT04sIG5lc3RlZEFubm90YXRpb24pOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoaW50IGluZGV4LCBMaXN0PE5lc3RhYmxlQW5ub3RhdGlvbj4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCQlTb3VyY2VBbm5vdGF0ZWRFbGVtZW50LnRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChORVNUQUJMRV9BTk5PVEFUSU9OU19DT0xMRUNUSU9OLCByZW1vdmVkSXRlbXMpOwkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQW5ub3RhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzdmNDdlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotCi0vKioKLSAqIHNvbWUgY29tbW9uIHN0YXRlIGFuZCBiZWhhdmlvciBmb3IgSmF2YSBzb3VyY2UgYW5ub3RhdGlvbnM7Ci0gKiBhbmQgbG90cyBvZiBjb252ZW5pZW5jZSBtZXRob2RzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VOb2RlCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudDsKLQotCS8vIFRPRE8gLSBtYWtlICdmaW5hbCcgaWYgd2Ugc3RhcnQgdXNpbmcgY29tYmluYXRpb24gYW5ub3RhdGlvbiBhZGFwdGVycyg/KQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCS8vIFRPRE8gLSBtYWtlICdmaW5hbCcgaWYgd2Ugc3RhcnQgdXNpbmcgY29tYmluYXRpb24gYW5ub3RhdGlvbiBhZGFwdGVycyg/KQotCXByb3RlY3RlZCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcjsKLQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHN0cmFpZ2h0IG1lbWJlciBhbm5vdGF0aW9uCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGRhYSwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBkYWEpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIGFubm90YXRpb24gKHR5cGljYWxseSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hbm5vdGF0ZWRFbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5kYWEgPSBkYWE7Ci0JCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIgPSBhbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVJlc291cmNlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBc3RBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3QW5ub3RhdGlvbigpIHsKLQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKHRoaXMuZGFhLCBlbGVtZW50TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKHRoaXMuZGFhLCBlbGVtZW50TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvck51bWJlcnModGhpcy5kYWEsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJFbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCS8qKgotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBhbm5vdGF0aW9uLgotCSAqIElmIHRoZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gdGhlIEFTVCBpcyBudWxsIGZvciB2aXJ0dWFsIEphdmEgYXR0cmlidXRlcwotCQkvLyBUT0RPIHJlbW92ZSB0aGUgQVNUIG51bGwgY2hlY2sgb25jZSB3ZSBzdGFydCBzdG9yaW5nIHRleHQgcmFuZ2VzCi0JCS8vIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXR1cm4gKGFzdFJvb3QgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXRUZXh0UmFuZ2UodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIGFubm90YXRpb24ncyB0ZXh0IHJhbmdlIGluc3RlYWQuCi0JICovCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRFbGVtZW50VGV4dFJhbmdlKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPD8+IGVsZW1lbnRBZGFwdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuZ2V0QW5ub3RhdGlvbkVsZW1lbnRUZXh0UmFuZ2UoZWxlbWVudEFkYXB0ZXIsIGFzdFJvb3QpLCBhc3RSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIElmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0ZXh0IHJhbmdlIGlzIG51bGwKLQkgKiByZXR1cm4gdGhlIG1lbWJlcidzIHRleHQgcmFuZ2UgaW5zdGVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEVsZW1lbnRUZXh0UmFuZ2UoVGV4dFJhbmdlIGVsZW1lbnRUZXh0UmFuZ2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAoZWxlbWVudFRleHRSYW5nZSAhPSBudWxsKSA/IGVsZW1lbnRUZXh0UmFuZ2UgOiB0aGlzLmdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGV4aXN0cyBhbmQKLQkgKiB0b3VjaGVzIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlbGVtZW50VG91Y2hlcyhEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBlbGVtZW50QWRhcHRlciwgaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudGV4dFJhbmdlVG91Y2hlcyh0aGlzLmdldEFubm90YXRpb25FbGVtZW50VGV4dFJhbmdlKGVsZW1lbnRBZGFwdGVyLCBhc3RSb290KSwgcG9zKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZSBpcyBub3QKLQkgKiBudWxsIChtZWFuaW5nIHRoZSBjb3JyZXNwb25kaW5nIEFTVCBub2RlIGV4aXN0cykgYW5kIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXh0UmFuZ2VUb3VjaGVzKFRleHRSYW5nZSB0ZXh0UmFuZ2UsIGludCBwb3MpIHsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgJiYgdGV4dFJhbmdlLnRvdWNoZXMocG9zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogSWYgdGhlIGVsZW1lbnQgaXMgbWlzc2luZywgcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uRWxlbWVudFRleHRSYW5nZShEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBhZGFwdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb25FbGVtZW50RXhwcmVzc2lvbihhZGFwdGVyLCBhc3RSb290KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgQVNUIERPTSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGdldEFubm90YXRpb25FbGVtZW50RXhwcmVzc2lvbihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjw/PiBhZGFwdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gYWRhcHRlci5nZXRFeHByZXNzaW9uKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyBpbmRleGVkIHN1YnZhbHVlCi0JICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvbkVsZW1lbnRTdWJ2YWx1ZVRleHRSYW5nZShJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gYWRhcHRlciwgaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyB0aGUgQVNUIGlzIG51bGwgZm9yIHZpcnR1YWwgSmF2YSBhdHRyaWJ1dGVzCi0JCS8vIFRPRE8gcmVtb3ZlIHRoZSBBU1QgbnVsbCBjaGVjayBvbmNlIHdlIHN0YXJ0IHN0b3JpbmcgdGV4dCByYW5nZXMKLQkJLy8gaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJldHVybiAoYXN0Um9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb25FbGVtZW50U3VidmFsdWVFeHByZXNzaW9uKGFkYXB0ZXIsIGluZGV4LCBhc3RSb290KSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbGVtZW50J3MgaW5kZXhlZCBzdWJ2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBnZXRBbm5vdGF0aW9uRWxlbWVudFN1YnZhbHVlRXhwcmVzc2lvbihJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Pz4gYWRhcHRlciwgaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gYWRhcHRlci5nZXRTdWJ2YWx1ZUV4cHJlc3Npb24oaW5kZXgsIHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEFTVCBub2RlLgotCSAqIElmIHRoZSBBU1Qgbm9kZSBpcyBudWxsLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFRleHRSYW5nZShBU1ROb2RlIGFzdE5vZGUpIHsKLQkJcmV0dXJuIChhc3ROb2RlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGFzdE5vZGUpOwotCX0KLQotCQotCS8vKioqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIE5lc3RhYmxlQW5ub3RhdGlvbiBpbnRlcmZhY2UKLQkgKiBmb3Igc3ViY2xhc3NlcwotCSAqLwotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQl0aGlzLmdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0KLQlwcml2YXRlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOwotCX0KLQkKLQkvKioKLQkgKiBBIGNvbnRhaW5lciBmb3IgbmVzdGVkIGFubm90YXRpb25zLiBUaGUgb3duZXIgb2YgdGhlIEFubm90YXRpb25Db250YWluZXIKLQkgKiBuZWVkcyB0byBjYWxsIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0KSBvbiBpdC4KLQkgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBuZXN0YWJsZSBhbm5vdGF0aW9ucwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uQ29udGFpbmVyPFQgZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24+IGV4dGVuZHMgU291cmNlTm9kZS5Bbm5vdGF0aW9uQ29udGFpbmVyPFQ+Ci0JewotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkNvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhbm5vdGF0aW9ucyBwcm9wZXJ0eSBuYW1lIGZvciBmaXJpbmcgcHJvcGVydHkgY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBbm5vdGF0aW9uc1Byb3BlcnR5TmFtZSgpOwotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbUFkZGVkKGludCBpbmRleCwgVCBhZGRlZEl0ZW0pIHsKLQkJCVNvdXJjZUFubm90YXRpb24udGhpcy5maXJlSXRlbUFkZGVkKHRoaXMuZ2V0QW5ub3RhdGlvbnNQcm9wZXJ0eU5hbWUoKSwgaW5kZXgsIGFkZGVkSXRlbSk7CQkJCi0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkKGludCBpbmRleCwgamF2YS51dGlsLkxpc3Q8VD4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCQlTb3VyY2VBbm5vdGF0aW9uLnRoaXMuZmlyZUl0ZW1zUmVtb3ZlZCh0aGlzLmdldEFubm90YXRpb25zUHJvcGVydHlOYW1lKCksIGluZGV4LCByZW1vdmVkSXRlbXMpOwkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRjYmE0NC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIGF0dHJpYnV0ZSAoZmllbGQgb3IgbWV0aG9kKQotICovCi1hYnN0cmFjdCBjbGFzcyBTb3VyY2VBdHRyaWJ1dGU8QSBleHRlbmRzIEF0dHJpYnV0ZT4KLQlleHRlbmRzIFNvdXJjZU1lbWJlcjxBPgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlQXR0cmlidXRlCi17Ci0JcHJpdmF0ZSBpbnQgbW9kaWZpZXJzOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlOwotCi0JcHJpdmF0ZSBib29sZWFuIHR5cGVJc0VudW07Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHlwZUlzQXJyYXk7Ci0JCi0JcHJpdmF0ZSBpbnQgdHlwZUFycmF5RGltZW5zaW9uYWxpdHk7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHR5cGVTdXBlcmNsYXNzTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdHlwZUludGVyZmFjZU5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHR5cGVUeXBlQXJndW1lbnROYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCi0KLQlwcm90ZWN0ZWQgU291cmNlQXR0cmlidXRlKEphdmFSZXNvdXJjZVR5cGUgcGFyZW50LCBBIGF0dHJpYnV0ZSl7Ci0JCXN1cGVyKHBhcmVudCwgYXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMuZ2V0VHlwZUJpbmRpbmcoYXN0Um9vdCk7IC8vYnVpbGQgb25jZSwgbWlub3IgcGVyZm9ybWFuY2UgdHdlYWsgZm9yIG1ham9yIGJlbmVmaXQKLQkJdGhpcy5tb2RpZmllcnMgPSB0aGlzLmJ1aWxkTW9kaWZpZXJzKGFzdFJvb3QpOwotCQl0aGlzLnR5cGVOYW1lID0gdGhpcy5idWlsZFR5cGVOYW1lKHR5cGVCaW5kaW5nKTsKLQkJdGhpcy50eXBlSXNJbnRlcmZhY2UgPSB0aGlzLmJ1aWxkVHlwZUlzSW50ZXJmYWNlKHR5cGVCaW5kaW5nKTsKLQkJdGhpcy50eXBlSXNFbnVtID0gdGhpcy5idWlsZFR5cGVJc0VudW0odHlwZUJpbmRpbmcpOwotCQl0aGlzLnR5cGVJc0FycmF5ID0gdGhpcy5idWlsZFR5cGVJc0FycmF5KHR5cGVCaW5kaW5nKTsKLQkJdGhpcy50eXBlQXJyYXlEaW1lbnNpb25hbGl0eSA9IGJ1aWxkVHlwZUFycmF5RGltZW5zaW9uYWxpdHkodHlwZUJpbmRpbmcpOwotCQl0aGlzLnR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lID0gYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSh0eXBlQmluZGluZyk7Ci0JCXRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcy5hZGRBbGwodGhpcy5idWlsZFR5cGVTdXBlcmNsYXNzTmFtZXModHlwZUJpbmRpbmcpKTsKLQkJdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXModHlwZUJpbmRpbmcpKTsKLQkJdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuYWRkQWxsKHRoaXMuYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXModHlwZUJpbmRpbmcpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyhhc3RSb290KTsvL2J1aWxkIG9uY2UsIG1pbm9yIHBlcmZvcm1hbmNlIHR3ZWFrIGZvciBtYWpvciBiZW5lZml0Ci0JCXRoaXMuc3luY1R5cGVOYW1lKHRoaXMuYnVpbGRUeXBlTmFtZSh0eXBlQmluZGluZykpOwotCQlzeW5jVHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoYnVpbGRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSh0eXBlQmluZGluZykpOwotCQl0aGlzLnN5bmNUeXBlU3VwZXJjbGFzc05hbWVzKHRoaXMuYnVpbGRUeXBlU3VwZXJjbGFzc05hbWVzKHR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVJbnRlcmZhY2VOYW1lcyh0aGlzLmJ1aWxkVHlwZUludGVyZmFjZU5hbWVzKHR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVUeXBlQXJndW1lbnROYW1lcyh0aGlzLmJ1aWxkVHlwZVR5cGVBcmd1bWVudE5hbWVzKHR5cGVCaW5kaW5nKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gdGhpcy5nZXRUeXBlQmluZGluZyhhc3RSb290KTsvL2J1aWxkIG9uY2UsIG1pbm9yIHBlcmZvcm1hbmNlIHR3ZWFrIGZvciBtYWpvciBiZW5lZml0Ci0JCXRoaXMuc3luY01vZGlmaWVycyh0aGlzLmJ1aWxkTW9kaWZpZXJzKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jVHlwZU5hbWUodGhpcy5idWlsZFR5cGVOYW1lKHR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVJc0ludGVyZmFjZSh0aGlzLmJ1aWxkVHlwZUlzSW50ZXJmYWNlKHR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVJc0VudW0odGhpcy5idWlsZFR5cGVJc0VudW0odHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZUlzQXJyYXkodGhpcy5idWlsZFR5cGVJc0FycmF5KHR5cGVCaW5kaW5nKSk7Ci0JCXN5bmNUeXBlQXJyYXlEaW1lbnNpb25hbGl0eShidWlsZFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KHR5cGVCaW5kaW5nKSk7Ci0JCXN5bmNUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZShidWlsZFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKHR5cGVCaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1R5cGVTdXBlcmNsYXNzTmFtZXModGhpcy5idWlsZFR5cGVTdXBlcmNsYXNzTmFtZXModHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZUludGVyZmFjZU5hbWVzKHRoaXMuYnVpbGRUeXBlSW50ZXJmYWNlTmFtZXModHlwZUJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZVR5cGVBcmd1bWVudE5hbWVzKHRoaXMuYnVpbGRUeXBlVHlwZUFyZ3VtZW50TmFtZXModHlwZUJpbmRpbmcpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQXR0cmlidXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEF0dHJpYnV0ZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNTdWJUeXBlT2YoU3RyaW5nIHRuKSB7Ci0JCWlmICh0aGlzLnR5cGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy50eXBlTmFtZS5lcXVhbHModG4pCi0JCQkJfHwgdGhpcy50eXBlSW50ZXJmYWNlTmFtZXMuY29udGFpbnModG4pCi0JCQkJfHwgdGhpcy50eXBlU3VwZXJjbGFzc05hbWVzLmNvbnRhaW5zKHRuKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnR5cGVOYW1lICE9IG51bGwpICYmIENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKHRoaXMudHlwZU5hbWUpOwotCX0KLQotCXByaXZhdGUgSVR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0VHlwZUJpbmRpbmcoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKiBtb2RpZmllcnMKLQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZpZXJzOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTW9kaWZpZXJzKGludCBhc3RNb2RpZmllcnMpIHsKLQkJaW50IG9sZCA9IHRoaXMubW9kaWZpZXJzOwotCQl0aGlzLm1vZGlmaWVycyA9IGFzdE1vZGlmaWVyczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1PRElGSUVSU19QUk9QRVJUWSwgb2xkLCBhc3RNb2RpZmllcnMpOwotCX0KLQotCS8qKgotCSAqIHplcm8gc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgZGVmYXVsdC4uLgotCSAqLwotCXByaXZhdGUgaW50IGJ1aWxkTW9kaWZpZXJzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0QmluZGluZyhhc3RSb290KTsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gMCA6IGJpbmRpbmcuZ2V0TW9kaWZpZXJzKCk7Ci0JfQotCi0JLy8gKioqKiogdHlwZSBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlTmFtZShTdHJpbmcgYXN0VHlwZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZU5hbWU7Ci0JCXRoaXMudHlwZU5hbWUgPSBhc3RUeXBlTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogdGhpcyBjYW4gYmUgYW4gYXJyYXkgKGUuZy4gImphdmEubGFuZy5TdHJpbmdbXSIpOwotCSAqIGJ1dCBubyBnZW5lcmljIHR5cGUgYXJndW1lbnRzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlTmFtZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldEVyYXN1cmUoKTsKLQkJU3RyaW5nIHRiTmFtZSA9IHR5cGVCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJcmV0dXJuICh0Yk5hbWUubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogdGJOYW1lOwotCX0KLQotCS8vICoqKioqIHR5cGUgaXMgaW50ZXJmYWNlCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzSW50ZXJmYWNlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlSXNJbnRlcmZhY2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlSXNJbnRlcmZhY2UoYm9vbGVhbiBhc3RUeXBlSXNJbnRlcmZhY2UpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnR5cGVJc0ludGVyZmFjZTsKLQkJdGhpcy50eXBlSXNJbnRlcmZhY2UgPSBhc3RUeXBlSXNJbnRlcmZhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0lTX0lOVEVSRkFDRV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlSXNJbnRlcmZhY2UpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFR5cGVJc0ludGVyZmFjZShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJcmV0dXJuICh0eXBlQmluZGluZyAhPSBudWxsKSAmJiAoICEgdHlwZUJpbmRpbmcuaXNBcnJheSgpKSAmJiB0eXBlQmluZGluZy5pc0ludGVyZmFjZSgpOwotCX0KLQotCS8vICoqKioqIHR5cGUgaXMgZW51bQotCXB1YmxpYyBib29sZWFuIHR5cGVJc0VudW0oKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVJc0VudW07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlSXNFbnVtKGJvb2xlYW4gYXN0VHlwZUlzRW51bSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMudHlwZUlzRW51bTsKLQkJdGhpcy50eXBlSXNFbnVtID0gYXN0VHlwZUlzRW51bTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfSVNfRU5VTV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlSXNFbnVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRUeXBlSXNFbnVtKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlyZXR1cm4gKHR5cGVCaW5kaW5nICE9IG51bGwpICYmICggISB0eXBlQmluZGluZy5pc0FycmF5KCkpICYmIHR5cGVCaW5kaW5nLmlzRW51bSgpOwotCX0KLQotCS8vICoqKioqIHR5cGUgaXMgYXJyYXkKLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNBcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUlzQXJyYXk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlSXNBcnJheShib29sZWFuIGFzdFR5cGVJc0FycmF5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy50eXBlSXNBcnJheTsKLQkJdGhpcy50eXBlSXNBcnJheSA9IGFzdFR5cGVJc0FycmF5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9JU19BUlJBWV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlSXNBcnJheSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkVHlwZUlzQXJyYXkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCXJldHVybiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgJiYgdHlwZUJpbmRpbmcuaXNBcnJheSgpOwotCX0KLQkKLQkvLyAqKioqKiB0eXBlIGFycmF5IGRpbWVuc2lvbmFsaXR5Ci0JcHVibGljIGludCBnZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUFycmF5RGltZW5zaW9uYWxpdHk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZUFycmF5RGltZW5zaW9uYWxpdHkoaW50IGFzdFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KSB7Ci0JCWludCBvbGQgPSB0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5OwotCQl0aGlzLnR5cGVBcnJheURpbWVuc2lvbmFsaXR5ID0gYXN0VHlwZUFycmF5RGltZW5zaW9uYWxpdHk7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9BUlJBWV9ESU1FTlNJT05BTElUWV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSk7Ci0JfQotCQotCXByaXZhdGUgaW50IGJ1aWxkVHlwZUFycmF5RGltZW5zaW9uYWxpdHkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nKSB7Ci0JCXJldHVybiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgPyAwIDogdHlwZUJpbmRpbmcuZ2V0RGltZW5zaW9ucygpOwotCX0KLQkKLQkvLyAqKioqKiB0eXBlIGFycmF5IGNvbXBvbmVudCB0eXBlIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy50eXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZShTdHJpbmcgYXN0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWU7Ci0JCXRoaXMudHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUgPSBhc3RUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFX0FSUkFZX0NPTVBPTkVOVF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgYXN0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCB8fCAhIHR5cGVCaW5kaW5nLmlzQXJyYXkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vIHRoZSBjb21wb25lbnQgdHlwZSBvZiBTdHJpbmdbXVtdIGlzIGFjdHVhbGx5IFN0cmluZ1tdLCB3aGVyZWFzIHdlIHdhbnQgU3RyaW5nCi0JCXdoaWxlICh0eXBlQmluZGluZy5pc0FycmF5KCkpIHsKLQkJCXR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmcuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQkJCi0JCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvLyBhIHR5cGUgdmFyaWFibGUgaXMgd2hhdCBpcyBkZWNsYXJlZCBieSBhIGdlbmVyaWMgdHlwZTsKLQkJLy8gZS5nLiAiRSIgaXMgYSB0eXBlIHZhcmlhYmxlIGRlY2xhcmVkIGJ5IHRoZSBnZW5lcmljIHR5cGUgIkNvbGxlY3Rpb24iIGluCi0JCS8vICAgICBwdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb248RT4KLQkJaWYgKHR5cGVCaW5kaW5nLmlzVHlwZVZhcmlhYmxlKCkpIHsKLQkJCS8vIGUuZy4gIkUgZXh0ZW5kcyBOdW1iZXIiIGhhcyBhbiBlcmFzdXJlIG9mICJOdW1iZXIiCi0JCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldEVyYXN1cmUoKTsKLQkJfQotCQlTdHJpbmcgdGJOYW1lID0gdHlwZUJpbmRpbmcuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQlyZXR1cm4gKHRiTmFtZS5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiB0Yk5hbWU7Ci0JfQotCi0JLy8gKioqKiogdHlwZSBzdXBlcmNsYXNzIGhpZXJhcmNoeQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlU3VwZXJjbGFzc05hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlU3VwZXJjbGFzc05hbWVzKExpc3Q8U3RyaW5nPiBhc3RUeXBlU3VwZXJjbGFzc05hbWVzKSB7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0KGFzdFR5cGVTdXBlcmNsYXNzTmFtZXMsIHRoaXMudHlwZVN1cGVyY2xhc3NOYW1lcywgVFlQRV9TVVBFUkNMQVNTX05BTUVTX0xJU1QpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHlwZVN1cGVyY2xhc3NOYW1lcyhJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQlBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl0eXBlQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKLQkJd2hpbGUgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKLQkJCW5hbWVzLmFkZCh0eXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJdHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCS8vICoqKioqIHR5cGUgaW50ZXJmYWNlIGhpZXJhcmNoeQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVJbnRlcmZhY2VOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KHRoaXMudHlwZUludGVyZmFjZU5hbWVzKTsKLQl9Ci0KLS8vCXByaXZhdGUgYm9vbGVhbiB0eXBlSW50ZXJmYWNlTmFtZXNDb250YWlucyhTdHJpbmcgaW50ZXJmYWNlTmFtZSkgewotLy8JCXJldHVybiB0aGlzLnR5cGVJbnRlcmZhY2VOYW1lcy5jb250YWlucyhpbnRlcmZhY2VOYW1lKTsKLS8vCX0KLS8vCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlSW50ZXJmYWNlTmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IGFzdFR5cGVJbnRlcmZhY2VOYW1lcykgewotCQl0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihhc3RUeXBlSW50ZXJmYWNlTmFtZXMsIHRoaXMudHlwZUludGVyZmFjZU5hbWVzLCBUWVBFX0lOVEVSRkFDRV9OQU1FU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFR5cGVJbnRlcmZhY2VOYW1lcyhJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcpIHsKLQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOwotCQl9Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJd2hpbGUgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkSW50ZXJmYWNlTmFtZXNUbyh0eXBlQmluZGluZywgbmFtZXMpOwotCQkJdHlwZUJpbmRpbmcgPSB0eXBlQmluZGluZy5nZXRTdXBlcmNsYXNzKCk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJbnRlcmZhY2VOYW1lc1RvKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgSGFzaFNldDxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoSVR5cGVCaW5kaW5nIGludGVyZmFjZUJpbmRpbmcgOiB0eXBlQmluZGluZy5nZXRJbnRlcmZhY2VzKCkpIHsKLQkJCW5hbWVzLmFkZChpbnRlcmZhY2VCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQl0aGlzLmFkZEludGVyZmFjZU5hbWVzVG8oaW50ZXJmYWNlQmluZGluZywgbmFtZXMpOyAgLy8gcmVjdXJzZQotCQl9Ci0JfQotCi0JLy8gKioqKiogdHlwZSB0eXBlIGFyZ3VtZW50IG5hbWVzCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVUeXBlQXJndW1lbnROYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy50eXBlVHlwZUFyZ3VtZW50TmFtZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcy5nZXQoaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZVR5cGVBcmd1bWVudE5hbWVzKExpc3Q8U3RyaW5nPiBhc3RUeXBlVHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QoYXN0VHlwZVR5cGVBcmd1bWVudE5hbWVzLCB0aGlzLnR5cGVUeXBlQXJndW1lbnROYW1lcywgVFlQRV9UWVBFX0FSR1VNRU5UX05BTUVTX0xJU1QpOwotCX0KLQotCS8qKgotCSAqIHRoZXNlIHR5cGVzIGNhbiBiZSBhcnJheXMgKGUuZy4gImphdmEubGFuZy5TdHJpbmdbXSIpOwotCSAqIGJ1dCB0aGV5IHdvbid0IGhhdmUgYW55IGZ1cnRoZXIgbmVzdGVkIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLQkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb248amF2YS5sYW5nLlN0cmluZz4iKQotCSAqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkVHlwZVR5cGVBcmd1bWVudE5hbWVzKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQlpZiAodHlwZUJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJSVR5cGVCaW5kaW5nW10gdHlwZUFyZ3VtZW50cyA9IHR5cGVCaW5kaW5nLmdldFR5cGVBcmd1bWVudHMoKTsKLQkJaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCi0JCUFycmF5TGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHR5cGVBcmd1bWVudHMubGVuZ3RoKTsKLQkJZm9yIChJVHlwZUJpbmRpbmcgdHlwZUFyZ3VtZW50IDogdHlwZUFyZ3VtZW50cykgewotCQkJaWYgKHR5cGVBcmd1bWVudCA9PSBudWxsKSB7Ci0JCQkJbmFtZXMuYWRkKG51bGwpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBlLmcuICI/IGV4dGVuZHMgTnVtYmVyIiBoYXMgYW4gZXJhc3VyZSBvZiAiTnVtYmVyIgotCQkJCUlUeXBlQmluZGluZyBlcmFzdXJlID0gdHlwZUFyZ3VtZW50LmdldEVyYXN1cmUoKTsKLQkJCQluYW1lcy5hZGQoZXJhc3VyZS5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VDb21waWxhdGlvblVuaXQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M0M2U4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLQotLyoqCi0gKiBKYXZhIGNvbXBpbGF0aW9uIHVuaXQgKHNvdXJjZSBmaWxlKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlQ29tcGlsYXRpb25Vbml0Ci0JZXh0ZW5kcyBTb3VyY2VOb2RlCi0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQKLXsKLQkvKiogSkRUIGNvbXBpbGF0aW9uIHVuaXQgKi8KLQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKLQotCS8qKiBwbHVnZ2FibGUgYW5ub3RhdGlvbiBwcm92aWRlciAqLwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKLQotCS8qKiBpbXByb3ZlZCBhbm5vdGF0aW9uIGZvcm1hdHRpbmcgKi8KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCi0JLyoqIHBsdWdnYWJsZSBleGVjdXRvciB0aGF0IGFsbG93cyB0aGUgZG9jdW1lbnQgdG8gYmUgbW9kaWZpZWQgb24gYW5vdGhlciB0aHJlYWQgKi8KLQlwcml2YXRlIGZpbmFsIENvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKLQotCS8qKiBsaXN0ZW5lcnMgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RlbmVyTGlzdDxKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTb3VyY2VDb21waWxhdGlvblVuaXQoCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUFubm90YXRpb25Qcm92aWRlciBhbm5vdGF0aW9uUHJvdmlkZXIsIAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIobnVsbCk7ICAvLyB0aGUgSlBBIGNvbXBpbGF0aW9uIHVuaXQgaXMgdGhlIHJvb3Qgb2YgaXRzIHN1Yi10cmVlCi0JCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gY29tcGlsYXRpb25Vbml0OwotCQl0aGlzLmFubm90YXRpb25Qcm92aWRlciA9IGFubm90YXRpb25Qcm92aWRlcjsKLQkJdGhpcy5hbm5vdGF0aW9uRWRpdEZvcm1hdHRlciA9IGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8SnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyPihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbmV2ZXIgY2FsbGVkPwotCX0KLQotCXZvaWQgb3BlbkNvbXBpbGF0aW9uVW5pdCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuY29tcGlsYXRpb25Vbml0Lm9wZW4obnVsbCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZG8gbm90aGluZyAtIHdlIGp1c3Qgd29uJ3QgaGF2ZSBhIHByaW1hcnkgdHlwZSBpbiB0aGlzIGNhc2UKLQkJfQotCX0KLQotCXZvaWQgY2xvc2VDb21waWxhdGlvblVuaXQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5jbG9zZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGhtbW0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIChJRmlsZSkgdGhpcy5jb21waWxhdGlvblVuaXQuZ2V0UmVzb3VyY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25Qcm92aWRlcjsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZU5vZGUuUm9vdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCByZXNvdXJjZU1vZGVsQ2hhbmdlZCgpIHsKLQkJZm9yIChKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLnJlc291cmNlTW9kZWxDaGFuZ2VkKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbXBpbGF0aW9uVW5pdDsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEV4ZWN1dG9yIGdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkgewotCQlyZXR1cm4gdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkgIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCkgewotCQlyZXR1cm4gQVNUVG9vbHMuYnVpbGRBU1RSb290KHRoaXMuY29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhUmVzb3VyY2VNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY2hhbmdlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhKYXZhU291cmNlKCkgewotCQl0aGlzLnN5bmNocm9uaXplV2l0aCh0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JU3RyaW5nIGdldENvbXBpbGF0aW9uVW5pdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUphdmFFeHRlbnNpb24odGhpcy5jb21waWxhdGlvblVuaXQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlSmF2YUV4dGVuc2lvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJaW50IGluZGV4ID0gZmlsZU5hbWUubGFzdEluZGV4T2YoIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIChpbmRleCA9PSAtMSkgPyBmaWxlTmFtZSA6IGZpbGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRDb21waWxhdGlvblVuaXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGM2YjQ0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVJbnRSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgdHlwZQotICovCi1maW5hbCBjbGFzcyBTb3VyY2VFbnVtCi0JZXh0ZW5kcyBTb3VyY2VBYnN0cmFjdFR5cGU8RW51bT4KLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUVudW0KLXsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4gZW51bUNvbnN0YW50czsKLQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBidWlsZCB0b3AtbGV2ZWwgdHlwZQotCSAqLwotCXN0YXRpYyBKYXZhUmVzb3VyY2VFbnVtIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwKLQkJCUVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFbnVtIF9lbnVtID0gbmV3IEpEVEVudW0oCi0JCQllbnVtRGVjbGFyYXRpb24sCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlRW51bSBqcmUgPSBuZXcgU291cmNlRW51bShqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsIF9lbnVtKTsKLQkJanJlLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBqcmU7Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgbmVzdGVkIHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEphdmFSZXNvdXJjZUVudW0gbmV3SW5zdGFuY2UoCi0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRW51bSBfZW51bSA9IG5ldyBKRFRFbnVtKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJZW51bURlY2xhcmF0aW9uLAotCQkJCW9jY3VycmVuY2UsCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlRW51bSBqcmUgPSBuZXcgU291cmNlRW51bShqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsIF9lbnVtKTsKLQkJanJlLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBqcmU7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VFbnVtKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsIEVudW0gX2VudW0pIHsKLQkJc3VwZXIoamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBfZW51bSk7Ci0JCXRoaXMuZW51bUNvbnN0YW50cyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplRW51bUNvbnN0YW50cyhhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0VudW1Db25zdGFudHMoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUFubm90YXRlZEVsZW1lbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQotCQlmb3IgKEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQgOiB0aGlzLmdldEVudW1Db25zdGFudHMoKSkgewotCQkJZW51bUNvbnN0YW50LnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLkVOVU07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZW51bSBjb25zdGFudHMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUVudW1Db25zdGFudD4gZ2V0RW51bUNvbnN0YW50cygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+KHRoaXMuZW51bUNvbnN0YW50cyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVudW1Db25zdGFudChKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50KSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihlbnVtQ29uc3RhbnQsIHRoaXMuZW51bUNvbnN0YW50cywgRU5VTV9DT05TVEFOVFNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZ2V0RW51bUNvbnN0YW50KFN0cmluZyBmaWVsZE5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudCA6IHRoaXMuZ2V0RW51bUNvbnN0YW50cygpKSB7Ci0JCQlpZiAoZW51bUNvbnN0YW50LmlzRm9yKGZpZWxkTmFtZSwgb2NjdXJyZW5jZSkpIHsKLQkJCQlyZXR1cm4gZW51bUNvbnN0YW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnVtQ29uc3RhbnRzKENvbGxlY3Rpb248SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiByZW1vdmUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZSwgdGhpcy5lbnVtQ29uc3RhbnRzLCBFTlVNX0NPTlNUQU5UU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUVudW1Db25zdGFudHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRW51bUNvbnN0YW50RGVjbGFyYXRpb25bXSBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbnMgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0RW51bUNvbnN0YW50cyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKGVudW1Db25zdGFudERlY2xhcmF0aW9ucy5sZW5ndGgpOwotCQlmb3IgKEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uIDogZW51bUNvbnN0YW50RGVjbGFyYXRpb25zKSB7Ci0JCQlTdHJpbmcgY29uc3RhbnROYW1lID0gZW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQoY29uc3RhbnROYW1lKTsKLQkJCXRoaXMuZW51bUNvbnN0YW50cy5hZGQodGhpcy5idWlsZEVudW1Db25zdGFudChjb25zdGFudE5hbWUsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRW51bUNvbnN0YW50cyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlFbnVtQ29uc3RhbnREZWNsYXJhdGlvbltdIGVudW1Db25zdGFudERlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRFbnVtQ29uc3RhbnRzKGFzdFJvb3QpOwotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAoZW51bUNvbnN0YW50RGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCUhhc2hTZXQ8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiBlbnVtQ29uc3RhbnRzVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+KHRoaXMuZW51bUNvbnN0YW50cyk7Ci0JCWZvciAoRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50RGVjbGFyYXRpb24gOiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbnMpIHsKLQkJCVN0cmluZyBjb25zdGFudE5hbWUgPSBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChjb25zdGFudE5hbWUpOwotCi0JCQlKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50ID0gdGhpcy5nZXRFbnVtQ29uc3RhbnQoY29uc3RhbnROYW1lLCBvY2N1cnJlbmNlKTsKLQkJCWlmIChlbnVtQ29uc3RhbnQgPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkRW51bUNvbnN0YW50KHRoaXMuYnVpbGRFbnVtQ29uc3RhbnQoY29uc3RhbnROYW1lLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCQl9IGVsc2UgewotCQkJCWVudW1Db25zdGFudHNUb1JlbW92ZS5yZW1vdmUoZW51bUNvbnN0YW50KTsKLQkJCQllbnVtQ29uc3RhbnQuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JCXRoaXMucmVtb3ZlRW51bUNvbnN0YW50cyhlbnVtQ29uc3RhbnRzVG9SZW1vdmUpOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGJ1aWxkRW51bUNvbnN0YW50KFN0cmluZyBmaWVsZE5hbWUsIGludCBvY2N1cnJlbmNlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gU291cmNlRW51bUNvbnN0YW50Lm5ld0luc3RhbmNlKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZmllbGROYW1lLCBvY2N1cnJlbmNlLCB0aGlzLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLCBhc3RSb290KTsKLQl9Ci0KLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VUeXBlPiBnZXRUeXBlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZT4gZ2V0QWxsVHlwZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUVudW0+IGdldEVudW1zKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPiBnZXRBbGxFbnVtcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4odGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDb3VudGVyTWFwICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvdW50ZXJNYXAgewotCQlwcml2YXRlIGZpbmFsIEhhc2hNYXA8T2JqZWN0LCBTaW1wbGVJbnRSZWZlcmVuY2U+IGNvdW50ZXJzOwotCi0JCXByb3RlY3RlZCBDb3VudGVyTWFwKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvdW50ZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBTaW1wbGVJbnRSZWZlcmVuY2U+KGluaXRpYWxDYXBhY2l0eSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbmNyZW1lbnRlZCBjb3VudCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JCSAqLwotCQlpbnQgaW5jcmVtZW50KE9iamVjdCBvKSB7Ci0JCQlTaW1wbGVJbnRSZWZlcmVuY2UgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KG8pOwotCQkJaWYgKGNvdW50ZXIgPT0gbnVsbCkgewotCQkJCWNvdW50ZXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCQkJdGhpcy5jb3VudGVycy5wdXQobywgY291bnRlcik7Ci0JCQl9Ci0JCQljb3VudGVyLmluY3JlbWVudCgpOwotCQkJcmV0dXJuIGNvdW50ZXIuZ2V0VmFsdWUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bUNvbnN0YW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5YTA4Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnVtQ29uc3RhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FbnVtQ29uc3RhbnQ7Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgZW51bSBjb25zdGFudAotICovCi1maW5hbCBjbGFzcyBTb3VyY2VFbnVtQ29uc3RhbnQKLQlleHRlbmRzIFNvdXJjZU1lbWJlcjxFbnVtQ29uc3RhbnQ+Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQKLXsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBlbnVtIGNvbnN0YW50Ci0JICovCi0Jc3RhdGljIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBuZXdJbnN0YW5jZSgKLQkJCUphdmFSZXNvdXJjZUVudW0gcGFyZW50LAotCQkJRW51bSBkZWNsYXJpbmdFbnVtLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJRW51bUNvbnN0YW50IGVudW1Db25zdGFudCA9IG5ldyBKRFRFbnVtQ29uc3RhbnQoCi0JCQkJZGVjbGFyaW5nRW51bSwKLQkJCQluYW1lLAotCQkJCW9jY3VycmVuY2UsCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGpyZWMgPSBuZXcgU291cmNlRW51bUNvbnN0YW50KHBhcmVudCwgZW51bUNvbnN0YW50KTsKLQkJanJlYy5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJlYzsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBTb3VyY2VFbnVtQ29uc3RhbnQoSmF2YVJlc291cmNlRW51bSBwYXJlbnQsIEVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQpewotCQlzdXBlcihwYXJlbnQsIGVudW1Db25zdGFudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLkVOVU1fQ09OU1RBTlQ7Ci0JfQotCQotCQotCS8vICoqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGltcGxlbWVudGF0aW9uICoqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldE5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VGaWVsZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2MjMxYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVEZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5GaWVsZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBmaWVsZAotICovCi1maW5hbCBjbGFzcyBTb3VyY2VGaWVsZAotCWV4dGVuZHMgU291cmNlQXR0cmlidXRlPEZpZWxkQXR0cmlidXRlPgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlRmllbGQKLXsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBmaWVsZCBhdHRyaWJ1dGUKLQkgKi8KLQlzdGF0aWMgSmF2YVJlc291cmNlRmllbGQgbmV3SW5zdGFuY2UoCi0JCQlKYXZhUmVzb3VyY2VUeXBlIHBhcmVudCwKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCUZpZWxkQXR0cmlidXRlIGZpZWxkID0gbmV3IEpEVEZpZWxkQXR0cmlidXRlKAotCQkJCWRlY2xhcmluZ1R5cGUsCi0JCQkJbmFtZSwKLQkJCQlvY2N1cnJlbmNlLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRDb21waWxhdGlvblVuaXQoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIGpycGEgPSBuZXcgU291cmNlRmllbGQocGFyZW50LCBmaWVsZCk7Ci0JCWpycGEuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJcmV0dXJuIGpycGE7Ci0JfQotCQotCQotCXByaXZhdGUgU291cmNlRmllbGQoSmF2YVJlc291cmNlVHlwZSBwYXJlbnQsIEZpZWxkQXR0cmlidXRlIGZpZWxkKXsKLQkJc3VwZXIocGFyZW50LCBmaWVsZCk7Ci0JfQotCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLkZJRUxEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1lbWJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlY2ZlZjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBtZW1iZXIgKGFubm90YXRpb25zLCAicGVyc2lzdGFibGUiKQotICovCi1hYnN0cmFjdCBjbGFzcyBTb3VyY2VNZW1iZXI8TSBleHRlbmRzIE1lbWJlcj4KLQlleHRlbmRzIFNvdXJjZUFubm90YXRlZEVsZW1lbnQ8TT4KLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU1lbWJlcgotewotCi0JYm9vbGVhbiBmaW5hbF87ICAvLyAnZmluYWwnIGlzIGEgcmVzZXJ2ZWQgd29yZAotCi0JYm9vbGVhbiB0cmFuc2llbnRfOyAgLy8gJ3RyYW5zaWVudCcgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQlib29sZWFuIHB1YmxpY187ICAvLyAncHVibGljJyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCWJvb2xlYW4gc3RhdGljXzsgIC8vICdzdGF0aWMnIGlzIGEgcmVzZXJ2ZWQgd29yZAotCi0JYm9vbGVhbiBwcm90ZWN0ZWRfOyAvLyAncHJvdGVjdGVkJyBpcyBhIHJlc2VydmVkIHdvcmQKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCVNvdXJjZU1lbWJlcihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgTSBtZW1iZXIpIHsKLQkJc3VwZXIocGFyZW50LCBtZW1iZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJSUJpbmRpbmcgYmluZGluZyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQl0aGlzLmZpbmFsXyA9IHRoaXMuYnVpbGRGaW5hbChiaW5kaW5nKTsKLQkJdGhpcy50cmFuc2llbnRfID0gdGhpcy5idWlsZFRyYW5zaWVudChiaW5kaW5nKTsKLQkJdGhpcy5wdWJsaWNfID0gdGhpcy5idWlsZFB1YmxpYyhiaW5kaW5nKTsKLQkJdGhpcy5zdGF0aWNfID0gdGhpcy5idWlsZFN0YXRpYyhiaW5kaW5nKTsKLQkJdGhpcy5wcm90ZWN0ZWRfID0gdGhpcy5idWlsZFByb3RlY3RlZChiaW5kaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQlJQmluZGluZyBiaW5kaW5nID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0ZpbmFsKHRoaXMuYnVpbGRGaW5hbChiaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1RyYW5zaWVudCh0aGlzLmJ1aWxkVHJhbnNpZW50KGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jUHVibGljKHRoaXMuYnVpbGRQdWJsaWMoYmluZGluZykpOwotCQl0aGlzLnN5bmNTdGF0aWModGhpcy5idWlsZFN0YXRpYyhiaW5kaW5nKSk7Ci0JCXRoaXMuc3luY1Byb3RlY3RlZCh0aGlzLmJ1aWxkUHJvdGVjdGVkKGJpbmRpbmcpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gc2V0UHJpbWFyeUFubm90YXRpb24oU3RyaW5nIHByaW1hcnlBbm5vdGF0aW9uTmFtZSwgSXRlcmFibGU8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGFubm90YXRpb25OYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGFubm90YXRpb25OYW1lcywgc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcyk7Ci0JCWlmIChwcmltYXJ5QW5ub3RhdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJYW5ub3RhdGlvbk5hbWVzLmFkZChwcmltYXJ5QW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JCWZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogdGhpcy5nZXRBbm5vdGF0aW9ucygpKSB7Ci0JCQlpZiAoICEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb25OYW1lcywgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSkgewotCQkJCXRoaXMuYW5ub3RhdGlvbnMucmVtb3ZlKGFubm90YXRpb24pOwotCQkJCWFubm90YXRpb24ucmVtb3ZlQW5ub3RhdGlvbigpOwotCQkJfQotCQl9Ci0JCUl0ZXJhdG9yPEFubm90YXRpb25Db250YWluZXI+IGNvbnRhaW5lcnMgPSB0aGlzLmFubm90YXRpb25Db250YWluZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWZvciAoOyBjb250YWluZXJzLmhhc05leHQoKTspIHsKLQkJCUFubm90YXRpb25Db250YWluZXIgY29udGFpbmVyID0gY29udGFpbmVycy5uZXh0KCk7Ci0JCQlpZiAoY29udGFpbmVyLmdldENvbnRhaW5lckFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJaWYgKCAhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhbm5vdGF0aW9uTmFtZXMsIGNvbnRhaW5lci5nZXRDb250YWluZXJBbm5vdGF0aW9uKCkuZ2V0QW5ub3RhdGlvbk5hbWUoKSkpIHsKLQkJCQkJY29udGFpbmVycy5yZW1vdmUoKTsKLQkJCQkJY29udGFpbmVyLmdldENvbnRhaW5lckFubm90YXRpb24oKS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy9BdCB0aGlzIHBvaW50IHRoZSBvbmx5IHRoaW5nIHJlbWFpbmluZyB3b3VsZCBiZSBhIHN0YW5kYWxvbmUgIm5lc3RhYmxlIiBhbm5vdGF0aW9uCi0JCQkJU3RyaW5nIG5lc3RlZEFubm90YXRpb05hbWUgPSBjb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKTsKLQkJCQlpZiAoICEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb25OYW1lcywgbmVzdGVkQW5ub3RhdGlvTmFtZSkpIHsKLQkJCQkJY29udGFpbmVycy5yZW1vdmUoKTsKLQkJCQkJY29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zKCkuaXRlcmF0b3IoKS5uZXh0KCkucmVtb3ZlQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUFubm90YXRpb24gbmV3UHJpbWFyeUFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24ocHJpbWFyeUFubm90YXRpb25OYW1lKTsKLQkJaWYgKChwcmltYXJ5QW5ub3RhdGlvbk5hbWUgIT0gbnVsbCkgJiYgKG5ld1ByaW1hcnlBbm5vdGF0aW9uID09IG51bGwpKSB7Ci0JCQluZXdQcmltYXJ5QW5ub3RhdGlvbiA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uKHByaW1hcnlBbm5vdGF0aW9uTmFtZSk7Ci0JCQl0aGlzLmFubm90YXRpb25zLmFkZChuZXdQcmltYXJ5QW5ub3RhdGlvbik7Ci0JCQluZXdQcmltYXJ5QW5ub3RhdGlvbi5uZXdBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5ld1ByaW1hcnlBbm5vdGF0aW9uOwotCX0KLQotCi0JLy8gKioqKiogZmluYWwKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlyZXR1cm4gdGhpcy5maW5hbF87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGaW5hbChib29sZWFuIGFzdEZpbmFsKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5maW5hbF87Ci0JCXRoaXMuZmluYWxfID0gYXN0RmluYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGSU5BTF9QUk9QRVJUWSwgb2xkLCBhc3RGaW5hbCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkRmluYWwoSUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IE1vZGlmaWVyLmlzRmluYWwoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogdHJhbnNpZW50Ci0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudF87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNUcmFuc2llbnQoYm9vbGVhbiBhc3RUcmFuc2llbnQpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnRyYW5zaWVudF87Ci0JCXRoaXMudHJhbnNpZW50XyA9IGFzdFRyYW5zaWVudDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRSQU5TSUVOVF9QUk9QRVJUWSwgb2xkLCBhc3RUcmFuc2llbnQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFRyYW5zaWVudChJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogTW9kaWZpZXIuaXNUcmFuc2llbnQoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogcHVibGljCi0JcHVibGljIGJvb2xlYW4gaXNQdWJsaWMoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY187Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQdWJsaWMoYm9vbGVhbiBhc3RQdWJsaWMpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnB1YmxpY187Ci0JCXRoaXMucHVibGljXyA9IGFzdFB1YmxpYzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBVQkxJQ19QUk9QRVJUWSwgb2xkLCBhc3RQdWJsaWMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFB1YmxpYyhJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogTW9kaWZpZXIuaXNQdWJsaWMoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCi0JLy8gKioqKiogc3RhdGljCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRpY187Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNTdGF0aWMoYm9vbGVhbiBhc3RTdGF0aWMpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnN0YXRpY187Ci0JCXRoaXMuc3RhdGljXyA9IGFzdFN0YXRpYzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUQVRJQ19QUk9QRVJUWSwgb2xkLCBhc3RTdGF0aWMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZFN0YXRpYyhJQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogTW9kaWZpZXIuaXNTdGF0aWMoYmluZGluZy5nZXRNb2RpZmllcnMoKSk7Ci0JfQotCQotCS8vICoqKioqIHByb3RlY3RlZAotCXB1YmxpYyBib29sZWFuIGlzUHJvdGVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5wcm90ZWN0ZWRfOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUHJvdGVjdGVkKGJvb2xlYW4gYXN0UHJvdGVjdGVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5wcm90ZWN0ZWRfOwotCQl0aGlzLnByb3RlY3RlZF8gPSBhc3RQcm90ZWN0ZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9URUNURURfUFJPUEVSVFksIG9sZCwgYXN0UHJvdGVjdGVkKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRQcm90ZWN0ZWQoSUJpbmRpbmcgYmluZGluZykgewotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IE1vZGlmaWVyLmlzUHJvdGVjdGVkKGJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGVkRWxlbWVudC5tYXRjaGVzKG1lbWJlck5hbWUsIG9jY3VycmVuY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljT3JQcm90ZWN0ZWQoKSB7Ci0JCXJldHVybiBpc1B1YmxpYygpIHx8IGlzUHJvdGVjdGVkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNZXRob2QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWNkYTYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVE1ldGhvZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1ldGhvZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIG1ldGhvZAotICovCi1maW5hbCBjbGFzcyBTb3VyY2VNZXRob2QKLQkJZXh0ZW5kcyBTb3VyY2VBdHRyaWJ1dGU8TWV0aG9kQXR0cmlidXRlPgotCQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZU1ldGhvZCB7Ci0JCi0JYm9vbGVhbiBjb25zdHJ1Y3RvcjsKLQkKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHBhcmFtZXRlclR5cGVOYW1lcyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQotCQotCS8qKgotCSAqIGNvbnN0cnVjdCBtZXRob2QKLQkgKi8KLQlzdGF0aWMgSmF2YVJlc291cmNlTWV0aG9kIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlVHlwZSBwYXJlbnQsCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2QgPSBKRFRNZXRob2RBdHRyaWJ1dGUubmV3SW5zdGFuY2UoCi0JCQkJZGVjbGFyaW5nVHlwZSwKLQkJCQlzaWduYXR1cmUsCi0JCQkJb2NjdXJyZW5jZSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0Q29tcGlsYXRpb25Vbml0KCksCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCksCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QganJtID0gbmV3IFNvdXJjZU1ldGhvZChwYXJlbnQsIG1ldGhvZCk7Ci0JCWpybS5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJtOwotCX0KLQkKLQkKLQlwcml2YXRlIFNvdXJjZU1ldGhvZChKYXZhUmVzb3VyY2VUeXBlIHBhcmVudCwgTWV0aG9kQXR0cmlidXRlIG1ldGhvZCl7Ci0JCXN1cGVyKHBhcmVudCwgbWV0aG9kKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXRoaXMuY29uc3RydWN0b3IgPSB0aGlzLmJ1aWxkQ29uc3RydWN0b3IoYmluZGluZyk7Ci0JCXRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLmFkZEFsbCh0aGlzLmJ1aWxkUGFyYW1ldGVyVHlwZU5hbWVzKGJpbmRpbmcpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLk1FVEhPRDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJSU1ldGhvZEJpbmRpbmcgYmluZGluZyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNDb25zdHJ1Y3Rvcih0aGlzLmJ1aWxkQ29uc3RydWN0b3IoYmluZGluZykpOwotCQl0aGlzLnN5bmNQYXJhbWV0ZXJUeXBlTmFtZXModGhpcy5idWlsZFBhcmFtZXRlclR5cGVOYW1lcyhiaW5kaW5nKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TWV0aG9kTmFtZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWV0aG9kIG5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TmFtZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwYXJhbWV0ZXIgdHlwZSBuYW1lcyAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRQYXJhbWV0ZXJUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclR5cGVOYW1lKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5wYXJhbWV0ZXJUeXBlTmFtZXMuZ2V0KGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQYXJhbWV0ZXJzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLnNpemUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNQYXJhbWV0ZXJUeXBlTmFtZXMoTGlzdDxTdHJpbmc+IGFzdFBhcmFtZXRlclR5cGVOYW1lcykgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdChhc3RQYXJhbWV0ZXJUeXBlTmFtZXMsIHRoaXMucGFyYW1ldGVyVHlwZU5hbWVzLCBQQVJBTUVURVJfVFlQRV9OQU1FU19MSVNUKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQlpZiAobWV0aG9kQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChJVHlwZUJpbmRpbmcgcGFyYW1ldGVyVHlwZSA6IG1ldGhvZEJpbmRpbmcuZ2V0UGFyYW1ldGVyVHlwZXMoKSkgewotCQkJaWYgKHBhcmFtZXRlclR5cGUuaXNUeXBlVmFyaWFibGUoKSkgewotCQkJCS8vIGUuZy4gIkUgZXh0ZW5kcyBOdW1iZXIiIGhhcyBhbiBlcmFzdXJlIG9mICJOdW1iZXIiCi0JCQkJcGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlclR5cGUuZ2V0RXJhc3VyZSgpOwotCQkJfQotCQkJU3RyaW5nIHB0TmFtZSA9IHBhcmFtZXRlclR5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJbmFtZXMuYWRkKHB0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb25zdHJ1Y3RvciAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnN0cnVjdG9yOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY0NvbnN0cnVjdG9yKGJvb2xlYW4gYXN0Q29uc3RydWN0b3IpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmNvbnN0cnVjdG9yOwotCQl0aGlzLmNvbnN0cnVjdG9yID0gYXN0Q29uc3RydWN0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05TVFJVQ1RPUl9QUk9QRVJUWSwgb2xkLCBhc3RDb25zdHJ1Y3Rvcik7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBidWlsZENvbnN0cnVjdG9yKElNZXRob2RCaW5kaW5nIG1ldGhvZEJpbmRpbmcpIHsKLQkJcmV0dXJuIG1ldGhvZEJpbmRpbmcgPT0gbnVsbCA/IGZhbHNlIDogbWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0ZWRFbGVtZW50Lm1hdGNoZXMoc2lnbmF0dXJlLCBvY2N1cnJlbmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZEFubm90YXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzIyNWJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci0KLS8qKgotICogVXNlZCBmb3IgYW5ub3RhdGlvbnMgdGhhdCBoYXZlIG5vIGJlaGF2aW9yLCBqdXN0IGEgbmFtZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlTmFtZWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7Ci0KLQlwdWJsaWMgU291cmNlTmFtZWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGFubm90YXRpb25OYW1lKSk7Ci0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm90aGluZwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9ub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTm9kZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJmZmJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQWJzdHJhY3RKYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLQotCi0vKioKLSAqIFNvdXJjZSBjb252ZW5pZW5jZSBtZXRob2RzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VOb2RlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU5vZGUKLXsKLQotCXB1YmxpYyBTb3VyY2VOb2RlKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KSB0aGlzLmdldFJvb3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkuYnVpbGRBU1RSb290KCk7Ci0JfQotCi0JLyoqCi0JICogQSBjb250YWluZXIgZm9yIG5lc3RlZCBhbm5vdGF0aW9ucy4gVGhlIG93bmVyIG9mIHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyCi0JICogbmVlZHMgdG8gY2FsbCBpbml0aWFsaXplKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uKSBvbiBpdC4KLQkgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSByZXNvdXJjZSBuZXN0YWJsZSBhbm5vdGF0aW9ucwotCSAqLwotCWFic3RyYWN0IGNsYXNzIEFubm90YXRpb25Db250YWluZXI8VCBleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbj4KLQl7Ci0JCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8VD4gbmVzdGVkQW5ub3RhdGlvbnMgPSBuZXcgVmVjdG9yPFQ+KCk7Ci0KLQkJcHJvdGVjdGVkIEFubm90YXRpb25Db250YWluZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZWxlbWVudCBuYW1lIG9mIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbnMKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbiBuYW1lCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIG5ldyBuZXN0ZWQgYW5ub3RhdGlvbiBhdCB0aGUgZ2l2ZW4gaW5kZXgKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBUIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpOwotCi0JCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpcmVJdGVtQWRkZWQoaW50IGluZGV4LCBUIG5lc3RlZEFubm90YXRpb24pOwotCi0JCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpcmVJdGVtc1JlbW92ZWQoaW50IGluZGV4LCBMaXN0PFQ+IHJlbW92ZWRJdGVtcyk7Ci0KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RDb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCQkvLyBpZ25vcmUgdGhlIG5lc3RlZCBBU1QgYW5ub3RhdGlvbnMgdGhlbXNlbHZlcwotCQkJLy8gKG1heWJlIHNvbWVkYXkgd2UgY2FuIHVzZSB0aGVtIGR1cmluZyBpbml0aWFsaXphdGlvbi4uLikKLQkJCWludCBzaXplID0gdGhpcy5nZXROZXN0ZWRBc3RBbm5vdGF0aW9ucyhhc3RDb250YWluZXJBbm5vdGF0aW9uKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJCVQgbmVzdGVkQW5ub3RhdGlvbiA9IHRoaXMuYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGkpOwotCQkJCXRoaXMubmVzdGVkQW5ub3RhdGlvbnMuYWRkKGksIG5lc3RlZEFubm90YXRpb24pOwotCQkJCW5lc3RlZEFubm90YXRpb24uaW5pdGlhbGl6ZSgoQ29tcGlsYXRpb25Vbml0KSBhc3RDb250YWluZXJBbm5vdGF0aW9uLmdldFJvb3QoKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU3luY2hyb25pemUgdGhlIHJlc291cmNlIG1vZGVsIGFubm90YXRpb25zIHdpdGggdGhvc2UgaW4gdGhlIHNwZWNpZmllZCBBU1QuCi0JCSAqIFRyaWdnZXIgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RDb250YWluZXJBbm5vdGF0aW9uKSB7Ci0JCQlBcnJheUxpc3Q8b3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24+IGFzdEFubm90YXRpb25zID0gdGhpcy5nZXROZXN0ZWRBc3RBbm5vdGF0aW9ucyhhc3RDb250YWluZXJBbm5vdGF0aW9uKTsKLQkJCUl0ZXJhdG9yPG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RBbm5vdGF0aW9uU3RyZWFtID0gYXN0QW5ub3RhdGlvbnMuaXRlcmF0b3IoKTsKLQotCQkJZm9yIChUIG5lc3RlZEFubm90YXRpb24gOiB0aGlzLmdldE5lc3RlZEFubm90YXRpb25zKCkpIHsKLQkJCQlpZiAoYXN0QW5ub3RhdGlvblN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQkJLy8gbWF0Y2hpbmcgQVNUIGFubm90YXRpb24gaXMgcHJlc2VudCAtIHN5bmNocm9uaXplIHRoZSBuZXN0ZWQgYW5ub3RhdGlvbgotCQkJCQlhc3RBbm5vdGF0aW9uU3RyZWFtLm5leHQoKTsgIC8vIG1heWJlIHNvbWVkYXkgd2UgY2FuIHBhc3MgdGhpcyB0byB0aGUgdXBkYXRlCi0JCQkJCW5lc3RlZEFubm90YXRpb24uc3luY2hyb25pemVXaXRoKChDb21waWxhdGlvblVuaXQpIGFzdENvbnRhaW5lckFubm90YXRpb24uZ2V0Um9vdCgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBubyBtb3JlIEFTVCBhbm5vdGF0aW9ucyAtIHJlbW92ZSB0aGUgcmVtYWluaW5nIG5lc3RlZCBhbm5vdGF0aW9ucyBhbmQgZXhpdAotCQkJCQl0aGlzLnN5bmNSZW1vdmVOZXN0ZWRBbm5vdGF0aW9ucyhhc3RBbm5vdGF0aW9ucy5zaXplKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBhZGQgbmVzdGVkIGFubm90YXRpb25zIGZvciBhbnkgcmVtYWluaW5nIEFTVCBhbm5vdGF0aW9ucwotCQkJd2hpbGUgKGFzdEFubm90YXRpb25TdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5zeW5jQWRkTmVzdGVkQW5ub3RhdGlvbihhc3RBbm5vdGF0aW9uU3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFQ+IGdldE5lc3RlZEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8VD4odGhpcy5uZXN0ZWRBbm5vdGF0aW9ucyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25zLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBUIG5lc3RlZEFubm90YXRpb25BdChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25zLmdldChpbmRleCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBhZGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJLy8gYWRkIGEgbmV3IGFubm90YXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4uLgotCQkJaW50IHNvdXJjZUluZGV4ID0gdGhpcy5nZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKTsKLQkJCVQgbmVzdGVkQW5ub3RhdGlvbiA9IHRoaXMuYnVpbGROZXN0ZWRBbm5vdGF0aW9uKHNvdXJjZUluZGV4KTsKLQkJCXRoaXMubmVzdGVkQW5ub3RhdGlvbnMuYWRkKHNvdXJjZUluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJCW5lc3RlZEFubm90YXRpb24ubmV3QW5ub3RhdGlvbigpOwotCQkJbmVzdGVkQW5ub3RhdGlvbi5pbml0aWFsaXplKG5lc3RlZEFubm90YXRpb24uZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkuYnVpbGRBU1RSb290KCkpOwotCQkJLy8gLi4udGhlbiBtb3ZlIGl0IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkJCXRoaXMubW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJCXJldHVybiBuZXN0ZWRBbm5vdGF0aW9uOwotCQl9Ci0KLQkJcHVibGljIFQgbW92ZU5lc3RlZEFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCWlmICh0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleCkgewotCQkJCXJldHVybiB0aGlzLm1vdmVOZXN0ZWRBbm5vdGF0aW9uXyh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgVCByZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJVCBuZXN0ZWRBbm5vdGF0aW9uID0gdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5yZW1vdmUoaW5kZXgpOwotCQkJbmVzdGVkQW5ub3RhdGlvbi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCQl0aGlzLnN5bmNBc3RBbm5vdGF0aW9uc0FmdGVyUmVtb3ZlKGluZGV4KTsKLQkJCXJldHVybiBuZXN0ZWRBbm5vdGF0aW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSBUIG1vdmVOZXN0ZWRBbm5vdGF0aW9uXyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJVCBuZXN0ZWRBbm5vdGF0aW9uID0gQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5uZXN0ZWRBbm5vdGF0aW9ucywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KS5nZXQodGFyZ2V0SW5kZXgpOwotCQkJdGhpcy5zeW5jQXN0QW5ub3RhdGlvbnNBZnRlck1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBuZXN0ZWRBbm5vdGF0aW9uKTsKLQkJCXJldHVybiBuZXN0ZWRBbm5vdGF0aW9uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIGxpc3Qgb2YgdGhlIG5lc3RlZCBBU1QgYW5ub3RhdGlvbnMuCi0JCSAqLwotCQlwcml2YXRlIEFycmF5TGlzdDxvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbj4gZ2V0TmVzdGVkQXN0QW5ub3RhdGlvbnMob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0Q29udGFpbmVyQW5ub3RhdGlvbikgewotCQkJQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPigpOwotCQkJaWYgKGFzdENvbnRhaW5lckFubm90YXRpb24gPT0gbnVsbCB8fCBhc3RDb250YWluZXJBbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKSB7Ci0JCQkJLy8gbm8gbmVzdGVkIGFubm90YXRpb25zCi0JCQl9Ci0JCQllbHNlIGlmIChhc3RDb250YWluZXJBbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQkJaWYgKHRoaXMuZ2V0RWxlbWVudE5hbWUoKS5lcXVhbHMoInZhbHVlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlFeHByZXNzaW9uIGV4ID0gKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhc3RDb250YWluZXJBbm5vdGF0aW9uKS5nZXRWYWx1ZSgpOwotCQkJCQl0aGlzLmFkZEFzdEFubm90YXRpb25zVG8oZXgsIHJlc3VsdCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm8gbmVzdGVkIGFubm90YXRpb25zCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXN0Q29udGFpbmVyQW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5nZXRNZW1iZXJWYWx1ZVBhaXIoKE5vcm1hbEFubm90YXRpb24pIGFzdENvbnRhaW5lckFubm90YXRpb24pOwotCQkJCWlmIChwYWlyID09IG51bGwpIHsKLQkJCQkJLy8gbm8gbmVzdGVkIGFubm90YXRpb25zCi0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5hZGRBc3RBbm5vdGF0aW9uc1RvKHBhaXIuZ2V0VmFsdWUoKSwgcmVzdWx0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB3aGF0ZXZlciBhbm5vdGF0aW9ucyBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIHRvCi0JCSAqIHRoZSBzcGVjaWZpZWQgbGlzdC4gRG8gbm90IGFkZCBudWxsIHRvIHRoZSBsaXN0IGZvciBhbnkgbm9uLWFubm90YXRpb24gZXhwcmVzc2lvbi4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBhZGRBc3RBbm5vdGF0aW9uc1RvKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgQXJyYXlMaXN0PG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uPiBhc3RBbm5vdGF0aW9ucykgewotCQkJaWYgKGV4cHJlc3Npb24gPT0gbnVsbCkgewotCQkJCS8vZG8gbm90IGFkZCBudWxsIHRvIHRoZSBsaXN0LCBub3Qgc3VyZSBob3cgd2Ugd291bGQgZ2V0IGhlcmUuLi4KLQkJCX0KLQkJCWVsc2UgaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQkJdGhpcy5hZGRBc3RBbm5vdGF0aW9uc1RvKChBcnJheUluaXRpYWxpemVyKSBleHByZXNzaW9uLCBhc3RBbm5vdGF0aW9ucyk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RBbm5vdGF0aW9uID0gdGhpcy5nZXRBc3RBbm5vdGF0aW9uXyhleHByZXNzaW9uKTsKLQkJCQlpZiAoYXN0QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWFzdEFubm90YXRpb25zLmFkZChhc3RBbm5vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQXN0QW5ub3RhdGlvbnNUbyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIsIEFycmF5TGlzdDxvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbj4gYXN0QW5ub3RhdGlvbnMpIHsKLQkJCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKGFycmF5SW5pdGlhbGl6ZXIpOwotCQkJZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gOiBleHByZXNzaW9ucykgewotCQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdEFubm90YXRpb24gPSBnZXRBc3RBbm5vdGF0aW9uKGV4cHJlc3Npb24pOwotCQkJCWlmIChhc3RBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJYXN0QW5ub3RhdGlvbnMuYWRkKGFzdEFubm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJCXJldHVybiBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGFuIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHJldHVybiBpdDsKLQkJICogb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCQkgKi8KLQkJcHJpdmF0ZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBc3RBbm5vdGF0aW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJLy8gbm90IHN1cmUgaG93IHRoZSBleHByZXNzaW9uIGNvdWxkIGJlIG51bGwuLi4KLQkJCXJldHVybiAoZXhwcmVzc2lvbiA9PSBudWxsKSA/IG51bGwgOiBnZXRBc3RBbm5vdGF0aW9uXyhleHByZXNzaW9uKTsKLQkJfQotCi0JCS8qKgotCQkgKiBwcmUtY29uZGl0aW9uOiBleHByZXNzaW9uIGlzIG5vdCBudWxsCi0JCSAqLwotCQlwcml2YXRlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGdldEFzdEFubm90YXRpb25fKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJc3dpdGNoIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIEFTVE5vZGUuTk9STUFMX0FOTk9UQVRJT046Ci0JCQkJY2FzZSBBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTjoKLQkJCQljYXNlIEFTVE5vZGUuTUFSS0VSX0FOTk9UQVRJT046Ci0JCQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGFzdEFubm90YXRpb24gPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24pIGV4cHJlc3Npb247Ci0JCQkJCWlmICh0aGlzLmdldFF1YWxpZmllZE5hbWUoYXN0QW5ub3RhdGlvbikuZXF1YWxzKHRoaXMuZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSkpIHsKLQkJCQkJCXJldHVybiBhc3RBbm5vdGF0aW9uOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZShvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBhc3RBbm5vdGF0aW9uKSB7Ci0JCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhc3RBbm5vdGF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQkJaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcmVzb2x2ZWROYW1lID0gdHlwZUJpbmRpbmcuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcmVzb2x2ZWROYW1lOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBhc3RBbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCX0KLQotCQlwcml2YXRlIE1lbWJlclZhbHVlUGFpciBnZXRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gcGFpcnMgPSB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKTsKLQkJCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiBwYWlycykgewotCQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gcGFpcjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwcm90ZWN0ZWQgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyhOb3JtYWxBbm5vdGF0aW9uIG5hKSB7Ci0JCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQW4gYW5ub3RhdGlvbiB3YXMgbW92ZWQgd2l0aGluIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBjb250YWluZXIgZnJvbQotCQkgKiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkJICogU3luY2hyb25pemUgdGhlIEFTVCBhbm5vdGF0aW9ucyB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBhbm5vdGF0aW9uIGNvbnRhaW5lciwKLQkJICogc3RhcnRpbmcgd2l0aCB0aGUgbG93ZXIgaW5kZXggdG8gcHJldmVudCBvdmVybGFwLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHN5bmNBc3RBbm5vdGF0aW9uc0FmdGVyTW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgVCBuZXN0ZWRBbm5vdGF0aW9uKSB7Ci0JCQkvLyBtb3ZlIHRoZSBKYXZhIGFubm90YXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4uLgotCQkJbmVzdGVkQW5ub3RhdGlvbi5tb3ZlQW5ub3RhdGlvbih0aGlzLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCS8vIC4uLnRoZW4gc2hpZnQgdGhlIG90aGVyIEFTVCBhbm5vdGF0aW9ucyBvdmVyIG9uZSBzbG90Li4uCi0JCQlpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA8IHRhcmdldEluZGV4OyBpKyspIHsKLQkJCQkJdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5nZXQoaSkubW92ZUFubm90YXRpb24oaSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGkgPiB0YXJnZXRJbmRleDsgaS0tICkgewotCQkJCQl0aGlzLm5lc3RlZEFubm90YXRpb25zLmdldChpKS5tb3ZlQW5ub3RhdGlvbihpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyAuLi50aGVuIG1vdmUgdGhlIEFTVCBhbm5vdGF0aW9uIHRvIHRoZSBub3cgZW1wdHkgc2xvdCBhdCB0aGUgdGFyZ2V0IGluZGV4Ci0JCQluZXN0ZWRBbm5vdGF0aW9uLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4KTsKLQkJfQotCi0JCS8qKgotCQkgKiBBbiBhbm5vdGF0aW9uIHdhcyByZW1vdmVkIGZyb20gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGNvbnRhaW5lciBhdCB0aGUKLQkJICogc3BlY2lmaWVkIGluZGV4LgotCQkgKiBTeW5jaHJvbml6ZSB0aGUgQVNUIGFubm90YXRpb25zIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGFubm90YXRpb24gY29udGFpbmVyLAotCQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHByZXZlbnQgb3ZlcmxhcC4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBzeW5jQXN0QW5ub3RhdGlvbnNBZnRlclJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCWZvciAoaW50IGkgPSBpbmRleDsgaSA8IHRoaXMuZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7IGkrKykgewotCQkJCS8vIHRoZSBpbmRpY2VzIGFyZSB0aGUgc2FtZSBiZWNhdXNlIHRoZSBtb2RlbCBhbm5vdGF0aW9ucyBhcmUKLQkJCQkvLyBhbHJlYWR5IGluIHRoZSBwcm9wZXIgbG9jYXRpb25zIC0gaXQncyB0aGUgQVNUIGFubm90YXRpb25zIHRoYXQKLQkJCQkvLyBuZWVkIHRvIGJlIG1vdmVkIHRvIHRoZSBtYXRjaGluZyBsb2NhdGlvbgotCQkJCXRoaXMubmVzdGVkQW5ub3RhdGlvbnMuZ2V0KGkpLm1vdmVBbm5vdGF0aW9uKGkpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc3luY0FkZE5lc3RlZEFubm90YXRpb24ob3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb24gYXN0QW5ub3RhdGlvbikgewotCQkJaW50IGluZGV4ID0gdGhpcy5nZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKTsKLQkJCVQgbmVzdGVkQW5ub3RhdGlvbiA9IHRoaXMuYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQkJCW5lc3RlZEFubm90YXRpb24uaW5pdGlhbGl6ZSgoQ29tcGlsYXRpb25Vbml0KSBhc3RBbm5vdGF0aW9uLmdldFJvb3QoKSk7Ci0JCQl0aGlzLm5lc3RlZEFubm90YXRpb25zLmFkZChpbmRleCwgbmVzdGVkQW5ub3RhdGlvbik7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoaW5kZXgsIG5lc3RlZEFubm90YXRpb24pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgc3luY1JlbW92ZU5lc3RlZEFubm90YXRpb25zKGludCBpbmRleCkgewotCQkJTGlzdDxUPiBzdWJMaXN0ID0gdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5zdWJMaXN0KGluZGV4LCB0aGlzLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCUxpc3Q8VD4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxUPihzdWJMaXN0KTsKLQkJCXN1Ykxpc3QuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9ucy5pc0VtcHR5KCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmVzdGVkQW5ub3RhdGlvbnMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGFja2FnZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzNkNTA0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0LCBJbmMuCi0gICogRGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZSBieSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAqCi0gICogQ29udHJpYnV0b3I6Ci0gICogICAgIFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JUGFja2FnZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkUGFja2FnZTsKLQotLyoqCi0gKiBAYXV0aG9yIERtaXRyeSBHZXJhc2tvdgotICogU291cmNlIHBhY2thZ2UtaW5mby5qYXZhCi0gKgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlUGFja2FnZQotCWV4dGVuZHMgU291cmNlQW5ub3RhdGVkRWxlbWVudDxBbm5vdGF0ZWRQYWNrYWdlPgotCWltcGxlbWVudHMgSmF2YVJlc291cmNlUGFja2FnZQotewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIGNvbnN0cnVjdCBwYWNrYWdlIGluZm8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFSZXNvdXJjZVBhY2thZ2UgbmV3SW5zdGFuY2UoCi0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgcGFyZW50LAotCQkJUGFja2FnZURlY2xhcmF0aW9uIGRlY2xhcmluZ1BhY2thZ2UsCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBbm5vdGF0ZWRQYWNrYWdlIHBhY2sgPSBuZXcgSkRUUGFja2FnZSgKLQkJCQlkZWNsYXJpbmdQYWNrYWdlLAotCQkJCXBhcmVudC5nZXRDb21waWxhdGlvblVuaXQoKSwgCi0JCQkJcGFyZW50LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCksCi0JCQkJcGFyZW50LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIGpycHAgPSBuZXcgU291cmNlUGFja2FnZShwYXJlbnQsIHBhY2spOwotCQlqcnBwLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBqcnBwOwotCX0JCi0KLQlwcml2YXRlIFNvdXJjZVBhY2thZ2UoCi0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgcGFyZW50LAotCQkJQW5ub3RhdGVkUGFja2FnZSBwYWNrKXsKLQkJc3VwZXIocGFyZW50LCBwYWNrKTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLlBBQ0tBR0U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZVBhY2thZ2VJbmZvIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KGFzdE5hbWUsIHRoaXMubmFtZSkpewotCQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQkJfQkJCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUlQYWNrYWdlQmluZGluZyBiaW5kaW5nID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IG51bGwgOiBiaW5kaW5nLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjaGFuZ2VzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYTMwMmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBSZWQgSGF0LCBJbmMuCi0gICogRGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZSBieSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAqCi0gICogQ29udHJpYnV0b3I6Ci0gICogICAgIFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotCi0vKioKLSAqIEBhdXRob3IgRG1pdHJ5IEdlcmFza292Ci0gKiBTb3VyY2UgcGFja2FnZS1pbmZvLmphdmEKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdAotCWV4dGVuZHMgU291cmNlQ29tcGlsYXRpb25Vbml0Ci0JaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdCB7Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZV87CQotCi0JcHVibGljIFNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0KAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKGNvbXBpbGF0aW9uVW5pdCwgYW5ub3RhdGlvblByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlciwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpOyAgLy8gdGhlIEpQQSBjb21waWxhdGlvbiB1bml0IGlzIHRoZSByb290IG9mIGl0cyBzdWItdHJlZQotCQl0aGlzLnBhY2thZ2VfID0gdGhpcy5idWlsZFBhY2thZ2UoKTsKLQl9Ci0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlUGFja2FnZSBidWlsZFBhY2thZ2UoKSB7Ci0JCXRoaXMub3BlbkNvbXBpbGF0aW9uVW5pdCgpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KCk7Ci0JCXRoaXMuY2xvc2VDb21waWxhdGlvblVuaXQoKTsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQYWNrYWdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRQcmltYXJ5VHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcHRSZXNvdXJjZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjaGFuZ2VzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNQYWNrYWdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKCkgewotCQkvL25vLW9wCi0JfQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlLWluZm8gKioqKioqKioqKgotCi0JcHVibGljIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZV87Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VQYWNrYWdlIGJ1aWxkUGFja2FnZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBhY2thZ2UoYXN0Um9vdCwgdGhpcy5nZXRQYWNrYWdlRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUGFja2FnZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlQYWNrYWdlRGVjbGFyYXRpb24gcGQgPSB0aGlzLmdldFBhY2thZ2VEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJaWYgKHBkID09IG51bGwpIHsKLQkJCXRoaXMuc3luY1BhY2thZ2VfKG51bGwpOwotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMucGFja2FnZV8gPT0gbnVsbCkgewotCQkJCXRoaXMuc3luY1BhY2thZ2VfKHRoaXMuYnVpbGRQYWNrYWdlKGFzdFJvb3QsIHBkKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucGFja2FnZV8uc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQYWNrYWdlRGVjbGFyYXRpb24gZ2V0UGFja2FnZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LmdldFBhY2thZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1BhY2thZ2VfKEphdmFSZXNvdXJjZVBhY2thZ2UgYXN0UGFja2FnZSkgewotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIG9sZCA9IHRoaXMucGFja2FnZV87Ci0JCXRoaXMucGFja2FnZV8gPSBhc3RQYWNrYWdlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFDS0FHRSwgb2xkLCBhc3RQYWNrYWdlKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZVBhY2thZ2UgYnVpbGRQYWNrYWdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBQYWNrYWdlRGVjbGFyYXRpb24gcGFja2FnZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBTb3VyY2VQYWNrYWdlLm5ld0luc3RhbmNlKHRoaXMsIHBhY2thZ2VEZWNsYXJhdGlvbiwgYXN0Um9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzY5ZTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Nb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJlZUl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIHR5cGUgKHR5cGUgb3IgaW50ZXJmYWNlKQotICovCi1maW5hbCBjbGFzcyBTb3VyY2VUeXBlCi0JZXh0ZW5kcyBTb3VyY2VBYnN0cmFjdFR5cGU8VHlwZT4KLQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZVR5cGUKLXsKLQotCXByaXZhdGUgU3RyaW5nIHN1cGVyY2xhc3NRdWFsaWZpZWROYW1lOwotCi0JcHJpdmF0ZSBib29sZWFuIGFic3RyYWN0XzsgIC8vICdhYnN0cmFjdCcgaXMgYSByZXNlcnZlZCB3b3JkCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTm9BcmdDb25zdHJ1Y3RvcjsKLQotCXByaXZhdGUgYm9vbGVhbiBoYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcjsKLQotCXByaXZhdGUgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZVR5cGU+IHR5cGVzOwotCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlRW51bT4gZW51bXM7Ci0KLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VGaWVsZD4gZmllbGRzOwotCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8SmF2YVJlc291cmNlTWV0aG9kPiBtZXRob2RzOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBidWlsZCB0b3AtbGV2ZWwgdHlwZQotCSAqLwotCXN0YXRpYyBKYXZhUmVzb3VyY2VUeXBlIG5ld0luc3RhbmNlKAotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwKLQkJCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24sCi0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUeXBlIHR5cGUgPSBuZXcgSkRUVHlwZSgKLQkJCQl0eXBlRGVjbGFyYXRpb24sCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldENvbXBpbGF0aW9uVW5pdCgpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpLAotCQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpKTsKLQkJSmF2YVJlc291cmNlVHlwZSBqcnB0ID0gbmV3IFNvdXJjZVR5cGUoamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKLQkJanJwdC5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlyZXR1cm4ganJwdDsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBuZXN0ZWQgdHlwZQotCSAqLwotCXByaXZhdGUgc3RhdGljIEphdmFSZXNvdXJjZVR5cGUgbmV3SW5zdGFuY2UoCi0JCQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZSB0eXBlID0gbmV3IEpEVFR5cGUoCi0JCQkJZGVjbGFyaW5nVHlwZSwKLQkJCQl0eXBlRGVjbGFyYXRpb24sCi0JCQkJb2NjdXJyZW5jZSwKLQkJCQlqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuZ2V0Q29tcGlsYXRpb25Vbml0KCksCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCksCi0JCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIGpycHQgPSBuZXcgU291cmNlVHlwZShqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsIHR5cGUpOwotCQlqcnB0LmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXJldHVybiBqcnB0OwotCX0KLQotCXByaXZhdGUgU291cmNlVHlwZShKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBUeXBlIHR5cGUpIHsKLQkJc3VwZXIoamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCB0eXBlKTsKLQkJdGhpcy50eXBlcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlVHlwZT4oKTsKLQkJdGhpcy5lbnVtcyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlRW51bT4oKTsKLQkJdGhpcy5maWVsZHMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZUZpZWxkPigpOwotCQl0aGlzLm1ldGhvZHMgPSBuZXcgVmVjdG9yPEphdmFSZXNvdXJjZU1ldGhvZD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCUlUeXBlQmluZGluZyBiaW5kaW5nID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXRoaXMuc3VwZXJjbGFzc1F1YWxpZmllZE5hbWUgPSB0aGlzLmJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoYmluZGluZyk7Ci0JCXRoaXMuYWJzdHJhY3RfID0gdGhpcy5idWlsZEFic3RyYWN0KGJpbmRpbmcpOwotCQl0aGlzLmhhc05vQXJnQ29uc3RydWN0b3IgPSB0aGlzLmJ1aWxkSGFzTm9BcmdDb25zdHJ1Y3RvcihiaW5kaW5nKTsKLQkJdGhpcy5oYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvciA9IHRoaXMuYnVpbGRIYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcihiaW5kaW5nKTsKLQkJdGhpcy5pbml0aWFsaXplVHlwZXMoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudW1zKGFzdFJvb3QpOwotCQl0aGlzLmluaXRpYWxpemVGaWVsZHMoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZU1ldGhvZHMoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQlJVHlwZUJpbmRpbmcgYmluZGluZyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoYmluZGluZykpOwotCQl0aGlzLnN5bmNBYnN0cmFjdCh0aGlzLmJ1aWxkQWJzdHJhY3QoYmluZGluZykpOwotCQl0aGlzLnN5bmNIYXNOb0FyZ0NvbnN0cnVjdG9yKHRoaXMuYnVpbGRIYXNOb0FyZ0NvbnN0cnVjdG9yKGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IodGhpcy5idWlsZEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKGJpbmRpbmcpKTsKLQkJdGhpcy5zeW5jVHlwZXMoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0VudW1zKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNGaWVsZHMoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY01ldGhvZHMoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUFubm90YXRlZEVsZW1lbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQotCQl0aGlzLnN5bmNTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSh0aGlzLmJ1aWxkU3VwZXJjbGFzc1F1YWxpZmllZE5hbWUodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEJpbmRpbmcoYXN0Um9vdCkpKTsKLQotCQlmb3IgKEphdmFSZXNvdXJjZUZpZWxkIGZpZWxkIDogdGhpcy5nZXRGaWVsZHMoKSkgewotCQkJZmllbGQucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCQl9Ci0KLQkJLy8gYSBuZXcgdHlwZSBjYW4gdHJpZ2dlciBhIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZSB0byBiZSBhIHJlc29sdmVkLAotCQkvLyBmdWxseS1xdWFsaWZpZWQgbmFtZSwgc28gd2UgbmVlZCB0byByZWJ1aWxkIG91ciBsaXN0IG9mIG1ldGhvZHM6Ci0JCS8vICAgICAic2V0Rm9vKEZvbykiIGlzIG5vdCB0aGUgc2FtZSBhcyAic2V0Rm9vKGNvbS5iYXIuRm9vKSIKLQkJLy8gYW5kLCB2aWNlLXZlcnNhLCBhIHJlbW92ZWQgdHlwZSBjYW4gInVucmVzb2x2ZSIgYSBwYXJhbWV0ZXIgdHlwZQotCQl0aGlzLnN5bmNNZXRob2RzKGFzdFJvb3QpOwotCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7Ci0JCQltZXRob2QucmVzb2x2ZVR5cGVzKGFzdFJvb3QpOwotCQl9Ci0JCWZvciAoSmF2YVJlc291cmNlVHlwZSB0eXBlIDogdGhpcy5nZXRUeXBlcygpKSB7Ci0JCQl0eXBlLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQkJfQotCQlmb3IgKEphdmFSZXNvdXJjZUVudW0gZW51bV8gOiB0aGlzLmdldEVudW1zKCkpIHsKLQkJCWVudW1fLnJlc29sdmVUeXBlcyhhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKiogSmF2YVJlc291cmNlVHlwZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKgotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBLaW5kLlRZUEU7Ci0JfQotCQotCS8vICoqKioqIHN1cGVyY2xhc3MgcXVhbGlmaWVkIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1N1cGVyY2xhc3NRdWFsaWZpZWROYW1lKFN0cmluZyBhc3RTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZTsKLQkJdGhpcy5zdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSA9IGFzdFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1VQRVJDTEFTU19RVUFMSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3RTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZShJVHlwZUJpbmRpbmcgYmluZGluZykgewotCQlpZiAoYmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVHlwZUJpbmRpbmcgc3VwZXJjbGFzcyA9IGJpbmRpbmcuZ2V0U3VwZXJjbGFzcygpOwotCQlyZXR1cm4gKHN1cGVyY2xhc3MgPT0gbnVsbCkgPyBudWxsIDogc3VwZXJjbGFzcy5nZXRUeXBlRGVjbGFyYXRpb24oKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCi0JLy8gKioqKiogYWJzdHJhY3QKLQlwdWJsaWMgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gdGhpcy5hYnN0cmFjdF87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNBYnN0cmFjdChib29sZWFuIGFzdEFic3RyYWN0KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5hYnN0cmFjdF87Ci0JCXRoaXMuYWJzdHJhY3RfID0gYXN0QWJzdHJhY3Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBQlNUUkFDVF9QUk9QRVJUWSwgb2xkLCBhc3RBYnN0cmFjdCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGJ1aWxkQWJzdHJhY3QoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJcmV0dXJuIChiaW5kaW5nID09IG51bGwpID8gZmFsc2UgOiBNb2RpZmllci5pc0Fic3RyYWN0KGJpbmRpbmcuZ2V0TW9kaWZpZXJzKCkpOwotCX0KLQotCS8vICoqKioqIG5vLWFyZyBjb25zdHJ1Y3RvcgotCXB1YmxpYyBib29sZWFuIGhhc05vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmhhc05vQXJnQ29uc3RydWN0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNIYXNOb0FyZ0NvbnN0cnVjdG9yKGJvb2xlYW4gaGFzTm9BcmdDb25zdHJ1Y3RvcikgewotCQlib29sZWFuIG9sZCA9IHRoaXMuaGFzTm9BcmdDb25zdHJ1Y3RvcjsKLQkJdGhpcy5oYXNOb0FyZ0NvbnN0cnVjdG9yID0gaGFzTm9BcmdDb25zdHJ1Y3RvcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PX0FSR19DT05TVFJVQ1RPUl9QUk9QRVJUWSwgb2xkLCBoYXNOb0FyZ0NvbnN0cnVjdG9yKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYnVpbGRIYXNOb0FyZ0NvbnN0cnVjdG9yKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogdHlwZUhhc05vQXJnQ29uc3RydWN0b3IoYmluZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIHR5cGVIYXNOb0FyZ0NvbnN0cnVjdG9yKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiBmaW5kTm9BcmdDb25zdHJ1Y3RvcihiaW5kaW5nKSAhPSBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIElNZXRob2RCaW5kaW5nIGZpbmROb0FyZ0NvbnN0cnVjdG9yKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCWZvciAoSU1ldGhvZEJpbmRpbmcgbWV0aG9kIDogYmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCQkJcmV0dXJuIG1ldGhvZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogcHJpdmF0ZSBuby1hcmcgY29uc3RydWN0b3IKLQlwdWJsaWMgYm9vbGVhbiBoYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcigpIHsKLQkJcmV0dXJuIHRoaXMuaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNIYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3Rvcihib29sZWFuIGFzdEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5oYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcjsKLQkJdGhpcy5oYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvciA9IGFzdEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJJVkFURV9OT19BUkdfQ09OU1RSVUNUT1JfUFJPUEVSVFksIG9sZCwgYXN0SGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBidWlsZEhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKElUeXBlQmluZGluZyBiaW5kaW5nKSB7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogdHlwZUhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKGJpbmRpbmcpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB0eXBlSGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoSVR5cGVCaW5kaW5nIGJpbmRpbmcpIHsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kID0gZmluZE5vQXJnQ29uc3RydWN0b3IoYmluZGluZyk7Ci0JCXJldHVybiAobWV0aG9kICE9IG51bGwpICYmIE1vZGlmaWVyLmlzUHJpdmF0ZShtZXRob2QuZ2V0TW9kaWZpZXJzKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwdWJsaWMvcHJvdGVjdGVkIG5vLWFyZyBjb25zdHJ1Y3RvciAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGhhc1B1YmxpY09yUHJvdGVjdGVkTm9BcmdDb25zdHJ1Y3RvcigpIHsKLQkJSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBjb25zdHJ1Y3RvcnMgPSBnZXRDb25zdHJ1Y3RvcnMoKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5zaXplKGNvbnN0cnVjdG9ycykgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKLQkJCWlmIChjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gTW9kaWZpZXIuaXNQdWJsaWMoY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCkpCi0JCQkJCQl8fCBNb2RpZmllci5pc1Byb3RlY3RlZChjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNQdWJsaWNOb0FyZ0NvbnN0cnVjdG9yKCkgewotCQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGNvbnN0cnVjdG9ycyA9IGdldENvbnN0cnVjdG9ycygpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLnNpemUoY29uc3RydWN0b3JzKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBjb25zdHJ1Y3RvciA6IGNvbnN0cnVjdG9ycykgewotCQkJaWYgKGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBNb2RpZmllci5pc1B1YmxpYyhjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGdldENvbnN0cnVjdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+KGdldE1ldGhvZHMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlTWV0aG9kIG8pIHsKLQkJCQlyZXR1cm4gby5pc0NvbnN0cnVjdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiB0eXBlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZT4gZ2V0VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZT4odGhpcy50eXBlcyk7ICAvLyByZWFkLW9ubHkKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZT4gZ2V0QWxsVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+KHRoaXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBKYXZhUmVzb3VyY2VUeXBlPiBjaGlsZHJlbihKYXZhUmVzb3VyY2VUeXBlIHR5cGUpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXRUeXBlcygpLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VUeXBlIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lLCBpbnQgb2NjdXJyZW5jZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZVR5cGUgdHlwZSA6IHRoaXMuZ2V0VHlwZXMoKSkgewotCQkJaWYgKHR5cGUuaXNGb3IodHlwZU5hbWUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFR5cGUoSmF2YVJlc291cmNlVHlwZSB0eXBlKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbih0eXBlLCB0aGlzLnR5cGVzLCBUWVBFU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVHlwZXMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VUeXBlPiByZW1vdmUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHJlbW92ZSwgdGhpcy50eXBlcywgVFlQRVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUeXBlRGVjbGFyYXRpb25bXSB0eXBlRGVjbGFyYXRpb25zID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldFR5cGVzKGFzdFJvb3QpOwotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAodHlwZURlY2xhcmF0aW9ucy5sZW5ndGgpOwotCQlmb3IgKFR5cGVEZWNsYXJhdGlvbiB0ZCA6IHR5cGVEZWNsYXJhdGlvbnMpIHsKLQkJCVN0cmluZyB0ZE5hbWUgPSB0ZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudCh0ZE5hbWUpOwotCQkJdGhpcy50eXBlcy5hZGQodGhpcy5idWlsZFR5cGUodGQsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRUeXBlcyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKHR5cGVEZWNsYXJhdGlvbnMubGVuZ3RoKTsKLQkJSGFzaFNldDxKYXZhUmVzb3VyY2VUeXBlPiB0eXBlc1RvUmVtb3ZlID0gbmV3IEhhc2hTZXQ8SmF2YVJlc291cmNlVHlwZT4odGhpcy50eXBlcyk7Ci0JCWZvciAoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA6IHR5cGVEZWNsYXJhdGlvbnMpIHsKLQkJCVN0cmluZyB0ZE5hbWUgPSB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQodGROYW1lKTsKLQotCQkJSmF2YVJlc291cmNlVHlwZSB0eXBlID0gdGhpcy5nZXRUeXBlKHRkTmFtZSwgb2NjdXJyZW5jZSk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5hZGRUeXBlKHRoaXMuYnVpbGRUeXBlKHR5cGVEZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0eXBlc1RvUmVtb3ZlLnJlbW92ZSh0eXBlKTsKLQkJCQl0eXBlLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlbW92ZVR5cGVzKHR5cGVzVG9SZW1vdmUpOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlVHlwZSBidWlsZFR5cGUoVHlwZURlY2xhcmF0aW9uIG5lc3RlZFR5cGVEZWNsYXJhdGlvbiwgaW50IG9jY3VycmVuY2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZSh0aGlzLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIG5lc3RlZFR5cGVEZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVudW1zICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPiBnZXRFbnVtcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPih0aGlzLmVudW1zKTsgIC8vIHJlYWQtb25seQotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VFbnVtPiBnZXRBbGxFbnVtcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW51bXMoKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUVudW0gZ2V0RW51bShTdHJpbmcgZW51bU5hbWUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlRW51bSBlbnVtXyA6IHRoaXMuZ2V0RW51bXMoKSkgewotCQkJaWYgKGVudW1fLmlzRm9yKGVudW1OYW1lLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiBlbnVtXzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW51bShKYXZhUmVzb3VyY2VFbnVtIGVudW1fKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihlbnVtXywgdGhpcy5lbnVtcywgRU5VTVNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudW1zKENvbGxlY3Rpb248SmF2YVJlc291cmNlRW51bT4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMuZW51bXMsIEVOVU1TX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW51bXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRW51bURlY2xhcmF0aW9uW10gZW51bURlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRFbnVtcyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKGVudW1EZWNsYXJhdGlvbnMubGVuZ3RoKTsKLQkJZm9yIChFbnVtRGVjbGFyYXRpb24gZWQgOiBlbnVtRGVjbGFyYXRpb25zKSB7Ci0JCQlTdHJpbmcgdGROYW1lID0gZWQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQodGROYW1lKTsKLQkJCXRoaXMuZW51bXMuYWRkKHRoaXMuYnVpbGRFbnVtKGVkLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0VudW1zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVudW1EZWNsYXJhdGlvbltdIGVudW1EZWNsYXJhdGlvbnMgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0RW51bXMoYXN0Um9vdCk7Ci0JCUNvdW50ZXJNYXAgY291bnRlcnMgPSBuZXcgQ291bnRlck1hcChlbnVtRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCUhhc2hTZXQ8SmF2YVJlc291cmNlRW51bT4gZW51bXNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0PEphdmFSZXNvdXJjZUVudW0+KHRoaXMuZW51bXMpOwotCQlmb3IgKEVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24gOiBlbnVtRGVjbGFyYXRpb25zKSB7Ci0JCQlTdHJpbmcgdGROYW1lID0gZW51bURlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCWludCBvY2N1cnJlbmNlID0gY291bnRlcnMuaW5jcmVtZW50KHRkTmFtZSk7Ci0KLQkJCUphdmFSZXNvdXJjZUVudW0gZW51bV8gPSB0aGlzLmdldEVudW0odGROYW1lLCBvY2N1cnJlbmNlKTsKLQkJCWlmIChlbnVtXyA9PSBudWxsKSB7Ci0JCQkJdGhpcy5hZGRFbnVtKHRoaXMuYnVpbGRFbnVtKGVudW1EZWNsYXJhdGlvbiwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJfSBlbHNlIHsKLQkJCQllbnVtc1RvUmVtb3ZlLnJlbW92ZShlbnVtXyk7Ci0JCQkJZW51bV8uc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JCXRoaXMucmVtb3ZlRW51bXMoZW51bXNUb1JlbW92ZSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VFbnVtIGJ1aWxkRW51bShFbnVtRGVjbGFyYXRpb24gbmVzdGVkRW51bURlY2xhcmF0aW9uLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIFNvdXJjZUVudW0ubmV3SW5zdGFuY2UodGhpcy5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKSwgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBuZXN0ZWRFbnVtRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWVsZHMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPiBnZXRGaWVsZHMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+KHRoaXMuZmllbGRzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmllbGQoSmF2YVJlc291cmNlRmllbGQgZmllbGQpIHsKLQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGZpZWxkLCB0aGlzLmZpZWxkcywgRklFTERTX0NPTExFQ1RJT04pOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRmllbGQgZ2V0RmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCBmaWVsZCA6IHRoaXMuZ2V0RmllbGRzKCkpIHsKLQkJCWlmIChmaWVsZC5pc0ZvcihmaWVsZE5hbWUsIG9jY3VycmVuY2UpKSB7Ci0JCQkJcmV0dXJuIGZpZWxkOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVGaWVsZHMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VGaWVsZD4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMuZmllbGRzLCBGSUVMRFNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGaWVsZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRmllbGREZWNsYXJhdGlvbltdIGZpZWxkRGVjbGFyYXRpb25zID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldEZpZWxkcyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKGZpZWxkRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCWZvciAoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uIDogZmllbGREZWNsYXJhdGlvbnMpIHsKLQkJCWZvciAoVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50IDogZnJhZ21lbnRzKGZpZWxkRGVjbGFyYXRpb24pKSB7Ci0JCQkJU3RyaW5nIGZpZWxkTmFtZSA9IGZyYWdtZW50LmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChmaWVsZE5hbWUpOwotCQkJCXRoaXMuZmllbGRzLmFkZCh0aGlzLmJ1aWxkRmllbGQoZmllbGROYW1lLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0ZpZWxkcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlGaWVsZERlY2xhcmF0aW9uW10gZmllbGREZWNsYXJhdGlvbnMgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0RmllbGRzKGFzdFJvb3QpOwotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAoZmllbGREZWNsYXJhdGlvbnMubGVuZ3RoKTsKLQkJSGFzaFNldDxKYXZhUmVzb3VyY2VGaWVsZD4gZmllbGRzVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VGaWVsZD4odGhpcy5maWVsZHMpOwotCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA6IGZpZWxkRGVjbGFyYXRpb25zKSB7Ci0JCQlmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA6IGZyYWdtZW50cyhmaWVsZERlY2xhcmF0aW9uKSkgewotCQkJCVN0cmluZyBmaWVsZE5hbWUgPSBmcmFnbWVudC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQoZmllbGROYW1lKTsKLQotCQkJCUphdmFSZXNvdXJjZUZpZWxkIGZpZWxkID0gdGhpcy5nZXRGaWVsZChmaWVsZE5hbWUsIG9jY3VycmVuY2UpOwotCQkJCWlmIChmaWVsZCA9PSBudWxsKSB7Ci0JCQkJCXRoaXMuYWRkRmllbGQodGhpcy5idWlsZEZpZWxkKGZpZWxkTmFtZSwgb2NjdXJyZW5jZSwgYXN0Um9vdCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpZWxkc1RvUmVtb3ZlLnJlbW92ZShmaWVsZCk7Ci0JCQkJCWZpZWxkLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdGhpcy5yZW1vdmVGaWVsZHMoZmllbGRzVG9SZW1vdmUpOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlRmllbGQgYnVpbGRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBpbnQgb2NjdXJyZW5jZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIFNvdXJjZUZpZWxkLm5ld0luc3RhbmNlKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZmllbGROYW1lLCBvY2N1cnJlbmNlLCB0aGlzLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLCBhc3RSb290KTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyhGaWVsZERlY2xhcmF0aW9uIGZkKSB7Ci0JCXJldHVybiBmZC5mcmFnbWVudHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRNZXRob2RzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4odGhpcy5tZXRob2RzKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZU1ldGhvZCBnZXRNZXRob2QoTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChtZXRob2QuaXNGb3Ioc2lnbmF0dXJlLCBvY2N1cnJlbmNlKSkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihtZXRob2QsIHRoaXMubWV0aG9kcywgTUVUSE9EU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWV0aG9kcyhDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVtb3ZlKSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmUsIHRoaXMubWV0aG9kcywgTUVUSE9EU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJTWV0aG9kRGVjbGFyYXRpb25bXSBtZXRob2REZWNsYXJhdGlvbnMgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TWV0aG9kcyhhc3RSb290KTsKLQkJQ291bnRlck1hcCBjb3VudGVycyA9IG5ldyBDb3VudGVyTWFwKG1ldGhvZERlY2xhcmF0aW9ucy5sZW5ndGgpOwotCQlmb3IgKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uIDogbWV0aG9kRGVjbGFyYXRpb25zKSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlID0gQVNUVG9vbHMuYnVpbGRNZXRob2RTaWduYXR1cmUobWV0aG9kRGVjbGFyYXRpb24pOwotCQkJaW50IG9jY3VycmVuY2UgPSBjb3VudGVycy5pbmNyZW1lbnQoc2lnbmF0dXJlKTsKLQkJCXRoaXMubWV0aG9kcy5hZGQodGhpcy5idWlsZE1ldGhvZChzaWduYXR1cmUsIG9jY3VycmVuY2UsIGFzdFJvb3QpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTWV0aG9kcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlNZXRob2REZWNsYXJhdGlvbltdIG1ldGhvZERlY2xhcmF0aW9ucyA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNZXRob2RzKGFzdFJvb3QpOwotCQlDb3VudGVyTWFwIGNvdW50ZXJzID0gbmV3IENvdW50ZXJNYXAobWV0aG9kRGVjbGFyYXRpb25zLmxlbmd0aCk7Ci0JCUhhc2hTZXQ8SmF2YVJlc291cmNlTWV0aG9kPiBtZXRob2RzVG9SZW1vdmUgPSBuZXcgSGFzaFNldDxKYXZhUmVzb3VyY2VNZXRob2Q+KHRoaXMubWV0aG9kcyk7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiBtZXRob2REZWNsYXJhdGlvbnMpIHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUgPSBBU1RUb29scy5idWlsZE1ldGhvZFNpZ25hdHVyZShtZXRob2REZWNsYXJhdGlvbik7Ci0JCQlpbnQgb2NjdXJyZW5jZSA9IGNvdW50ZXJzLmluY3JlbWVudChzaWduYXR1cmUpOwotCi0JCQlKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kID0gdGhpcy5nZXRNZXRob2Qoc2lnbmF0dXJlLCBvY2N1cnJlbmNlKTsKLQkJCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkTWV0aG9kKHRoaXMuYnVpbGRNZXRob2Qoc2lnbmF0dXJlLCBvY2N1cnJlbmNlLCBhc3RSb290KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1ldGhvZHNUb1JlbW92ZS5yZW1vdmUobWV0aG9kKTsKLQkJCQltZXRob2Quc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JCXRoaXMucmVtb3ZlTWV0aG9kcyhtZXRob2RzVG9SZW1vdmUpOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlTWV0aG9kIGJ1aWxkTWV0aG9kKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsIGludCBvY2N1cnJlbmNlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gU291cmNlTWV0aG9kLm5ld0luc3RhbmNlKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgc2lnbmF0dXJlLCBvY2N1cnJlbmNlLCB0aGlzLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLCBhc3RSb290KTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGhhc0FueUFubm90YXRlZEZpZWxkcygpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCBmaWVsZCA6IHRoaXMuZ2V0RmllbGRzKCkpIHsKLQkJCWlmIChmaWVsZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0FueUFubm90YXRlZE1ldGhvZHMoKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmlzQW5ub3RhdGVkKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vIFR3byBtb3JlIHJlcXVpcmVtZW50cyBmb3IgYSB2YWxpZCBlcXVhbHMoKSBtZXRob2Q6Ci0JLy8gMS4gSXQgc2hvdWxkIGJlIHB1YmxpYyAKLQkvLyAyLiBUaGUgcmV0dXJuIHR5cGUgc2hvdWxkIGJlIGJvb2xlYW4KLQkvLyBCb3RoIHJlcXVpcmVtZW50cyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBjb21waWxlciBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlCi0JcHVibGljIGJvb2xlYW4gaGFzRXF1YWxzTWV0aG9kKCkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiB0aGlzLmdldE1ldGhvZHMoKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChtZXRob2QuZ2V0TWV0aG9kTmFtZSgpLCAiZXF1YWxzIikKLQkJCQkJJiYgbWV0aG9kLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMQotCQkJCQkmJiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldFBhcmFtZXRlclR5cGVOYW1lKDApLCBPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy8gVHdvIG1vcmUgcmVxdWlyZW1lbnRzIGZvciBhIHZhbGlkIGhhc2hDb2RlKCkgbWV0aG9kOgotCS8vIDEuIEl0IHNob3VsZCBiZSBwdWJsaWMgCi0JLy8gMi4gVGhlIHJldHVybiB0eXBlIHNob3VsZCBiZSBpbnQKLQkvLyBCb3RoIHJlcXVpcmVtZW50cyBhcmUgdmFsaWRhdGVkIGJ5IHRoZSBjb21waWxlciBzbyB0aGV5IGFyZSBleGNsdWRlZCBoZXJlCi0JcHVibGljIGJvb2xlYW4gaGFzSGFzaENvZGVNZXRob2QoKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHRoaXMuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG1ldGhvZC5nZXRNZXRob2ROYW1lKCksICJoYXNoQ29kZSIpCi0JCQkJCSYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0TWV0aG9kKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogdGhpcy5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobWV0aG9kLmdldE1ldGhvZE5hbWUoKSwgcHJvcGVydHlOYW1lKSkgewotCQkJCXJldHVybiBtZXRob2Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVHlwZUNvbXBpbGF0aW9uVW5pdC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVHlwZUNvbXBpbGF0aW9uVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzFmNzZlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVR5cGVDb21waWxhdGlvblVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci0KLS8qKgotICogSmF2YSBjb21waWxhdGlvbiB1bml0IChzb3VyY2UgZmlsZSkKLSAqIG5vbiBwYWNrYWdlLWluZm8uamF2YSBmaWxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0Ci0JZXh0ZW5kcyBTb3VyY2VDb21waWxhdGlvblVuaXQKLXsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IHR5cGUgb2YgdGhlIEFTVCBjb21waWxhdGlvbiB1bml0LiBXZSBhcmUgbm90IGdvaW5nIHRvIGhhbmRsZQotCSAqIG11bHRpcGxlIHR5cGVzIGRlZmluZWQgaW4gYSBzaW5nbGUgY29tcGlsYXRpb24gdW5pdC4gRW50aXRpZXMgbXVzdCBoYXZlCi0JICogYSBwdWJsaWMvcHJvdGVjdGVkIG5vLWFyZyBjb25zdHJ1Y3RvciwgYW5kIHRoZXJlIGlzIG5vIHdheSB0byBhY2Nlc3MKLQkgKiB0aGUgY29uc3RydWN0b3IgaW4gYSBwYWNrYWdlIGNsYXNzICh3aGljaCBpcyB3aGF0IGFsbCB0b3AtbGV2ZWwsCi0JICogbm9uLXByaW1hcnkgY2xhc3NlcyBtdXN0IGJlKS4KLQkgKi8KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBwcmltYXJ5VHlwZTsJCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0KAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyLCAKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyLAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKGNvbXBpbGF0aW9uVW5pdCwgYW5ub3RhdGlvblByb3ZpZGVyLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlciwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpOyAgLy8gdGhlIGNvbXBpbGF0aW9uIHVuaXQgaXMgdGhlIHJvb3Qgb2YgaXRzIHN1Yi10cmVlCi0JCXRoaXMucHJpbWFyeVR5cGUgPSB0aGlzLmJ1aWxkUHJpbWFyeVR5cGUoKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBidWlsZFByaW1hcnlUeXBlKCkgewotCQl0aGlzLm9wZW5Db21waWxhdGlvblVuaXQoKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdCgpOwotCQl0aGlzLmNsb3NlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUHJpbWFyeVR5cGUoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFSZXNvdXJjZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ByaW1hcnlUeXBlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VOb2RlLlJvb3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogTkI6IHJldHVybiAqYWxsKiB0aGUgdHlwZXMgc2luY2Ugd2UgYnVpbGQgdGhlbSBhbGwKLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRUeXBlcygpIHsKLQkJcmV0dXJuICh0aGlzLnByaW1hcnlUeXBlID09IG51bGwpID8KLQkJCQlFbXB0eUl0ZXJhYmxlLjxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+aW5zdGFuY2UoKSA6Ci0JCQkJbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5wcmltYXJ5VHlwZS5nZXRBbGxUeXBlcygpLCB0aGlzLnByaW1hcnlUeXBlLmdldEFsbEVudW1zKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEpwYVJlc291cmNlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVR5cGVzKCkgewotCQlpZiAodGhpcy5wcmltYXJ5VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnByaW1hcnlUeXBlLnJlc29sdmVUeXBlcyh0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0UHJpbWFyeVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlUeXBlOwotCX0KLQotCXByaXZhdGUgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGJ1aWxkUHJpbWFyeVR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldFByaW1hcnlUeXBlT3JFbnVtRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCXJldHVybiAodGQgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFByaW1hcnlUeXBlKGFzdFJvb3QsIHRkKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBzeW5jUHJpbWFyeVR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldFByaW1hcnlUeXBlT3JFbnVtRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCWlmICh0ZCA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNQcmltYXJ5VHlwZV8obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5wcmltYXJ5VHlwZSA9PSBudWxsIHx8ICghdHlwZU1hdGNoZXNBU1ROb2RlVHlwZSh0aGlzLnByaW1hcnlUeXBlLCB0ZCkpKSB7Ci0JCQkJdGhpcy5zeW5jUHJpbWFyeVR5cGVfKHRoaXMuYnVpbGRQcmltYXJ5VHlwZShhc3RSb290LCB0ZCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnByaW1hcnlUeXBlLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE11c3QgYmUgbm9uLW51bGwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFuZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiB0eXBlTWF0Y2hlc0FTVE5vZGVUeXBlKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlLCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhc3RUeXBlKSB7Ci0JCXJldHVybiB0eXBlLmdldEtpbmQoKS5nZXRBc3ROb2RlVHlwZSgpID09IGFzdFR5cGUuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ByaW1hcnlUeXBlXyhKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYXN0VHlwZSkgewotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgb2xkID0gdGhpcy5wcmltYXJ5VHlwZTsKLQkJdGhpcy5wcmltYXJ5VHlwZSA9IGFzdFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUWVBFU19DT0xMRUNUSU9OLCBvbGQsIGFzdFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBidWlsZFByaW1hcnlUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTikgewotCQkJcmV0dXJuIFNvdXJjZVR5cGUubmV3SW5zdGFuY2UodGhpcywgKFR5cGVEZWNsYXJhdGlvbikgdHlwZURlY2xhcmF0aW9uLCBhc3RSb290KTsKLQkJfQotCQllbHNlIGlmICh0eXBlRGVjbGFyYXRpb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT04pIHsKLQkJCXJldHVybiBTb3VyY2VFbnVtLm5ld0luc3RhbmNlKHRoaXMsIChFbnVtRGVjbGFyYXRpb24pIHR5cGVEZWNsYXJhdGlvbiwgYXN0Um9vdCk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIGkuZS4gdGhlIHR5cGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb21waWxhdGlvbiB1bml0OwotCSAqIHJldHVybiB0aGUgZmlyc3QgY2xhc3MsIGludGVyZmFjZSBvciBlbnVtIChpZ25vcmUgYW5ub3RhdGlvbnMpIHdpdGgKLQkgKiB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb21waWxhdGlvbiB1bml0IChmaWxlKTsKLQkgKiBOQjogdGhpcyB0eXBlIGNvdWxkIGJlIGluIGVycm9yIGlmIHRoZXJlIGlzIGFuIGFubm90YXRpb24KLQkgKiB3aXRoIHRoZSBzYW1lIG5hbWUgcHJlY2VkaW5nIGl0IGluIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICogCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIHBhcnNlciBkaWQgbm90IHJlc29sdmUgdGhlIHR5cGUgZGVjbGFyYXRpb24ncyBiaW5kaW5nLgotCSAqIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBwcm9qZWN0IEpSRSBpcyByZW1vdmVkIChidWcgMjI1MzMyKS4KLQkgKi8KLQlwcml2YXRlIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldFByaW1hcnlUeXBlT3JFbnVtRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHByaW1hcnlUeXBlTmFtZSA9IHRoaXMuZ2V0UHJpbWFyeVR5cGVOYW1lKCk7Ci0JCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYXRkIDogdGhpcy50eXBlcyhhc3RSb290KSkgewotCQkJaWYgKHRoaXMubm9kZUlzUHJpbWFyeVR5cGVPckVudW1EZWNsYXJhdGlvbihhdGQsIHByaW1hcnlUeXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4gKGF0ZC5yZXNvbHZlQmluZGluZygpID09IG51bGwpID8gbnVsbCA6IGF0ZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9kZUlzUHJpbWFyeVR5cGVPckVudW1EZWNsYXJhdGlvbihBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBhdGQsIFN0cmluZyBwcmltYXJ5VHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubm9kZUlzVHlwZU9yRW51bURlY2xhcmF0aW9uKGF0ZCkgJiYgCi0JCQkJKGF0ZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHByaW1hcnlUeXBlTmFtZSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSXNUeXBlT3JFbnVtRGVjbGFyYXRpb24oQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gYXRkKSB7Ci0JCXJldHVybiBhdGQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04gfHwKLQkJCQlhdGQuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkVOVU1fREVDTEFSQVRJT047Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJpbWFyeVR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb21waWxhdGlvblVuaXROYW1lKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFzdFJvb3QudHlwZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0NhbGxiYWNrSm9iU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTRjZGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9DYWxsYmFja0pvYlN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JU2NoZWR1bGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIGpvYiBzeW5jaHJvbml6ZXIgdG8gbm90aWZ5IGxpc3RlbmVycwotICogd2hlbiBhIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiIGlzIGNvbXBsZXRlOyBpLmUuIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzLAotICogZm9yIHRoZSBtb21lbnQsIGhhbmRsZWQgZXZlcnkgInN5bmNocm9uaXplIiByZXF1ZXN0IGFuZCBxdWllc2NlZC4KLSAqIFRoaXMgbm90aWZpY2F0aW9uIGlzIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWVkIHRvIG9jY3VyIHdpdGggPGVtPmV2ZXJ5PC9lbT4KLSAqIHN5bmNocm9uaXphdGlvbiAiY3ljbGUiOwotICogc2luY2Ugb3RoZXIsIHVucmVsYXRlZCwgc3luY2hyb25pemF0aW9ucyBjYW4gYmUgdHJpZ2dlcmVkIGNvbmN1cnJlbnRseTsKLSAqIHByZXZlbnRpbmcgdGhlIHN5bmNocm9uaXphdGlvbiBmcm9tIHF1aWVzY2luZy4KLSAqLwotcHVibGljIGNsYXNzIENhbGxiYWNrSm9iU3luY2hyb25pemVyCi0JZXh0ZW5kcyBKb2JTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIENhbGxiYWNrU3luY2hyb25pemVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIENhbGxiYWNrSm9iU3luY2hyb25pemVyKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoam9iTmFtZSwgY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgam9iIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBqb2IgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQXNzaWduIHRoZSBnZW5lcmF0ZWQgRWNsaXBzZSBqb2IgdGhlCi0JICogc3BlY2lmaWVkIG5hbWUgYW5kIHNjaGVkdWxpbmcgcnVsZS4KLQkgKi8KLQlwdWJsaWMgQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXIoU3RyaW5nIGpvYk5hbWUsIEpvYkNvbW1hbmQgY29tbWFuZCwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCXN1cGVyKGpvYk5hbWUsIGNvbW1hbmQsIHNjaGVkdWxpbmdSdWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGpvYiB0aGF0IHdpbGwgbGV0IHVzIGtub3cgd2hlbiB0aGUgc3luY2hyb25pemF0aW9uIGhhcwotCSAqIHF1aWVzY2VkLgotCSAqLwotCUBPdmVycmlkZQotCVN5bmNocm9uaXphdGlvbkpvYiBidWlsZEpvYihTdHJpbmcgam9iTmFtZSwgSm9iQ29tbWFuZCBjb21tYW5kLCBJU2NoZWR1bGluZ1J1bGUgc2NoZWR1bGluZ1J1bGUpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja1N5bmNocm9uaXphdGlvbkpvYihqb2JOYW1lLCBjb21tYW5kLCBzY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhbGxiYWNrU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKCkgewotCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXphdGlvbiBqb2IgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHtAbGluayBKb2JTeW5jaHJvbml6ZXIuU3luY2hyb25pemF0aW9uSm9ifQotCSAqIHRvIG5vdGlmeSB0aGUgc3luY2hyb25pemVyIHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgcXVpZXNjZWQKLQkgKiAoaS5lLiB0aGUgY29tbWFuZCBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIGFuZCB0aGVyZSBhcmUgbm8gZnVydGhlcgotCSAqIHJlcXVlc3RzIGZvciBzeW5jaHJvbml6YXRpb24pLgotCSAqIEJlY2F1c2Ugc3luY2hyb25pemF0aW9uIG9jY3VycyBkdXJpbmcgdGhlIGpvYidzIGV4ZWN1dGlvbiwKLQkgKiBubyBvdGhlciB0aHJlYWQgd2lsbCBiZSBhYmxlIHRvCi0JICogaW5pdGlhdGUgYW5vdGhlciBzeW5jaHJvbml6YXRpb24gdW50aWwgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyBoYXZlIGJlZW4KLQkgKiBub3RpZmllZC4gTm90ZSBhbHNvLCB0aGUgc3luY2hyb25pemVyJ3MgbGlzdGVuZXJzIGNhbiwgdGhlbXNlbHZlcywKLQkgKiB0cmlnZ2VyIGFub3RoZXIgc3luY2hyb25pemF0aW9uIChieSBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGNhbGxpbmcKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9KTsKLQkgKiBidXQgdGhpcyBzeW5jaHJvbml6YXRpb24gd2lsbCBub3Qgb2NjdXIgdW50aWwgPGVtPmFmdGVyPC9lbT4gYWxsIHRoZQotCSAqIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQuCi0JICovCi0JY2xhc3MgQ2FsbGJhY2tTeW5jaHJvbml6YXRpb25Kb2IKLQkJZXh0ZW5kcyBTeW5jaHJvbml6YXRpb25Kb2IKLQl7Ci0JCS8qKgotCQkgKiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGpvYiBoYXMgYmVlbiBzY2hlZHVsZWQgdG8gcnVuLgotCQkgKiBXZSBuZWVkIHRoaXMgYmVjYXVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iIEpvYn0KLQkJICogaGFzIG5vIHB1YmxpYyBBUEkgZm9yIGRpc2NvdmVyaW5nIHdoZXRoZXIgYSBqb2IgaXMgInNjaGVkdWxlZCIuCi0JCSAqLwotCQkvLyB1c2UgJ3ZvbGF0aWxlJyBiZWNhdXNlIHN5bmNocm9uaXphdGlvbiBpc24ndCByZWFsbHkgcmVxdWlyZWQKLQkJcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHNjaGVkdWxlZDsKLQotCi0JCUNhbGxiYWNrU3luY2hyb25pemF0aW9uSm9iKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQkJc3VwZXIoam9iTmFtZSwgY29tbWFuZCwgc2NoZWR1bGluZ1J1bGUpOwotCQkJdGhpcy5zY2hlZHVsZWQgPSBmYWxzZTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB3ZSBhcmUgYWxsb3dpbmcgdGhlIGpvYiB0byBiZSBzY2hlZHVsZWQgKGkuZS4ge0BsaW5rICNzdGFydCgpfQotCQkgKiB3YXMgY2FsbGVkKSwgc2V0IHRoZSAic2NoZWR1bGVkIiBmbGFnLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQlpZiAodGhpcy5zaG91bGRTY2hlZHVsZSkgewotCQkJCXRoaXMuc2NoZWR1bGVkID0gdHJ1ZTsKLQkJCX0KLQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgdGhlICJzY2hlZHVsZWQiIGZsYWc7IHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbjsgYW5kLAotCQkgKiBpZiB0aGUgInNjaGVkdWxlZCIgZmxhZyBpcyBzdGlsbCBjbGVhciAoaS5lLiB0aGVyZSBoYXZlIGJlZW4gbm8KLQkJICogZnVydGhlciBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9KSwgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdGhpcy5zY2hlZHVsZWQgPSBmYWxzZTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIucnVuKG1vbml0b3IpOwotCQkJLy8gaG1tbSAtIHdlIHdpbGwgbm90aWZ5IGxpc3RlbmVycyBldmVuIHdoZW4gd2Ugb3VyIGpvYiBpcyAic3RvcHBlZCI7Ci0JCQkvLyB0aGF0IHNlZW1zIG9rLi4uICB+Ymp2Ci0JCQlpZiAoICEgdGhpcy5zY2hlZHVsZWQpIHsKLQkJCQlDYWxsYmFja0pvYlN5bmNocm9uaXplci50aGlzLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXZvaWQgc3RvcCgpIHsKLQkJCXRoaXMuc2NoZWR1bGVkID0gZmFsc2U7Ci0JCQlzdXBlci5zdG9wKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9JQ1VTdHJpbmdDb2xsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9JQ1VTdHJpbmdDb2xsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTVmYTQzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSUNVU3RyaW5nQ29sbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRoaXMgY29sbGF0b3Igc2ltcGx5IHdyYXBzIGFuIElDVTRKIGNvbGxhdG9yIGFuZCBpbXBsZW1lbnRzIGEKLSAqIHtAbGluayBTdHJpbmd9IHtAbGluayBDb21wYXJhdG9yfSAoaW5zdGVhZCBvZiBhbiB7QGxpbmsgT2JqZWN0fQotICoge0BsaW5rIENvbXBhcmF0b3J9LCB3aGljaCBpcyB3aGF0IHtAbGluayBDb2xsYXRvcn0gZG9lcywgbWltaWNraW5nIHRoZQotICogSkRLKD8pKS4KLSAqIAotICogQHNlZSBDb2xsYXRvcgotICovCi1wdWJsaWMgY2xhc3MgSUNVU3RyaW5nQ29sbGF0b3IKLQlpbXBsZW1lbnRzIENvbXBhcmF0b3I8U3RyaW5nPgotewotCXByaXZhdGUgZmluYWwgQ29sbGF0b3IgY29sbGF0b3I7Ci0KLQotCS8qKgotCSAqIFdyYXAgdGhlIGRlZmF1bHQgY29sbGF0b3IuCi0JICogQHNlZSBDb2xsYXRvciNnZXRJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIElDVVN0cmluZ0NvbGxhdG9yKCkgewotCQl0aGlzKENvbGxhdG9yLmdldEluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIGNvbGxhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KLQkgKiBAc2VlIENvbGxhdG9yI2dldEluc3RhbmNlKExvY2FsZSkKLQkgKi8KLQlwdWJsaWMgSUNVU3RyaW5nQ29sbGF0b3IoTG9jYWxlIGxvY2FsZSkgewotCQl0aGlzKENvbGxhdG9yLmdldEluc3RhbmNlKGxvY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsYXRvci4KLQkgKi8KLQlwdWJsaWMgSUNVU3RyaW5nQ29sbGF0b3IoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsYXRvciA9IGNvbGxhdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShzdHJpbmcxLCBzdHJpbmcyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbGxhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pEVFRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pEVFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZTIxMjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9KRFRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFyZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5DbGFzc05hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggSkRUIGNvcmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEVFRvb2xzIHsKLQotCS8qKgotCSAqIFdyYXAgY2hlY2tlZCBleGNlcHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHBhY2thZ2VGcmFnbWVudFJvb3RJc1NvdXJjZUZvbGRlcihJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290SXNTb3VyY2VGb2xkZXJfKHBmcik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gcGFja2FnZUZyYWdtZW50Um9vdElzU291cmNlRm9sZGVyXyhJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gcGZyLmV4aXN0cygpICYmIChwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIGNoZWNrZWQgZXhjZXB0aW9uIGFuZCBjaGVjayBmb3Igb3V0IG9mIHN5bmMgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUphdmFFbGVtZW50W10gZ2V0Q2hpbGRyZW4oSVBhcmVudCBwYXJlbnQpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwYXJlbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZ25vcmUgRk5GRSAtIHdoaWNoIGNhbiBoYXBwZW4gd2hlbiB0aGUgd29ya3NwYWNlIGlzIG91dCBvZiBzeW5jIHdpdGggTy9TIGZpbGUgc3lzdGVtCi0JCQlpZiAoICEgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBGaWxlTm90Rm91bmRFeGNlcHRpb24pKSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQkJcmV0dXJuIEVNUFRZX0pBVkFfRUxFTUVOVF9BUlJBWTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElKYXZhRWxlbWVudFtdIEVNUFRZX0pBVkFfRUxFTUVOVF9BUlJBWSA9IG5ldyBJSmF2YUVsZW1lbnRbMF07Ci0KLQkvKioKLQkgKiBDbGltYiB0aGUgc3BlY2lmaWVkIHR5cGUncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgbG9va2luZyBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJc1N1YlR5cGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgcG90ZW50aWFsU3ViVHlwZSwgU3RyaW5nIHBvdGVudGlhbFN1cGVyVHlwZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHR5cGVJc1N1YlR5cGUoamF2YVByb2plY3QsIGphdmFQcm9qZWN0LmZpbmRUeXBlKHBvdGVudGlhbFN1YlR5cGUpLCBqYXZhUHJvamVjdC5maW5kVHlwZShwb3RlbnRpYWxTdXBlclR5cGUpKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHR5cGVJc1N1YlR5cGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJVHlwZSBwb3RlbnRpYWxTdWJUeXBlLCBTdHJpbmcgcG90ZW50aWFsU3VwZXJUeXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHR5cGVJc1N1YlR5cGUoamF2YVByb2plY3QsIHBvdGVudGlhbFN1YlR5cGUsIGphdmFQcm9qZWN0LmZpbmRUeXBlKHBvdGVudGlhbFN1cGVyVHlwZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElUeXBlIHBvdGVudGlhbFN1YlR5cGUsIElUeXBlIHBvdGVudGlhbFN1cGVyVHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICgocG90ZW50aWFsU3ViVHlwZSA9PSBudWxsKSB8fCAocG90ZW50aWFsU3VwZXJUeXBlID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCS8vIHNob3J0IGN1dCBpZiB0eXBlcyBhcmUgdGhlIHNhbWUKLQkJaWYgKHBvdGVudGlhbFN1YlR5cGUuZXF1YWxzKHBvdGVudGlhbFN1cGVyVHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQkvLyBzaG9ydCBjdXQgaWYgcG90ZW50aWFsIHN1cGVydHlwZSBpcyBqYXZhLmxhbmcuT2JqZWN0Ci0JCWlmIChqYXZhUHJvamVjdC5maW5kVHlwZShPYmplY3QuY2xhc3MuZ2V0TmFtZSgpKS5lcXVhbHMocG90ZW50aWFsU3VwZXJUeXBlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCVN0cmluZyBwb3RlbnRpYWxTdXBlclR5cGVOYW1lID0gcG90ZW50aWFsU3VwZXJUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkKLQkJZm9yIChTdHJpbmcgc3VwZXJUeXBlTmFtZSA6IGdldFJlc29sdmVkU3VwZXJUeXBlTmFtZXMocG90ZW50aWFsU3ViVHlwZSkpIHsKLQkJCWlmIChzdXBlclR5cGVOYW1lLmVxdWFscyhwb3RlbnRpYWxTdXBlclR5cGVOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJCi0JCQkvLyByZWN1cnNlIGludG8gc3VwZXIgdHlwZQotCQkJaWYgKHR5cGVJc1N1YlR5cGUoamF2YVByb2plY3QsIGphdmFQcm9qZWN0LmZpbmRUeXBlKHN1cGVyVHlwZU5hbWUpLCBwb3RlbnRpYWxTdXBlclR5cGUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSdzIHN1cGVydHlwZXMgKGNsYXNzIGFuZCBpbnRlcmZhY2VzKS4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlLCBmb3Igd2hhdGV2ZXIgcmVhc29uLCB7IEBsaW5rIElUeXBlI2dldFN1cGVySW50ZXJmYWNlTmFtZXMoKX0KLQkgKiB7QGxpbmsgSVR5cGUjZ2V0U3VwZXJjbGFzc05hbWUoKX0gcmV0dXJuIHVucXVhbGlmaWVkIG5hbWVzIHdoZW4gdGhlIHR5cGUgaXMgZnJvbSBKYXZhIHNvdXJjZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlc29sdmVkU3VwZXJUeXBlTmFtZXMoSVR5cGUgdHlwZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gbm9uUmVzb2x2ZWRTdXBlclR5cGVOYW1lcyA9IGdldE5vblJlc29sdmVkU3VwZXJUeXBlTmFtZXModHlwZSk7Ci0JCWlmICh0eXBlLmlzQmluYXJ5KCkpIHsKLQkJCS8vIGlmIHR5cGUgaXMgYmluYXJ5LCB0aGUgdHlwZXMgYXJlIGFscmVhZHkgcmVzb2x2ZWQKLQkJCXJldHVybiBub25SZXNvbHZlZFN1cGVyVHlwZU5hbWVzOwotCQl9Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHJlc29sdmVkU3VwZXJUeXBlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgc3VwZXJUeXBlTmFtZSA6IG5vblJlc29sdmVkU3VwZXJUeXBlTmFtZXMpIHsKLQkJCXJlc29sdmVkU3VwZXJUeXBlTmFtZXMuYWRkKHJlc29sdmVUeXBlKHR5cGUsIHN1cGVyVHlwZU5hbWUpKTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZWRTdXBlclR5cGVOYW1lczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAocG90ZW50aWFsbHkpIG5vbi1yZXNvbHZlZCBuYW1lcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUncyBzdXBlcnR5cGVzIChjbGFzcyBhbmQgaW50ZXJmYWNlcykuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSwgZm9yIHdoYXRldmVyIHJlYXNvbiwgeyBAbGluayBJVHlwZSNnZXRTdXBlckludGVyZmFjZU5hbWVzKCl9IGFuZAotCSAqIHtAbGluayBJVHlwZSNnZXRTdXBlcmNsYXNzTmFtZSgpfSByZXR1cm4gdW5xdWFsaWZpZWQgbmFtZXMgd2hlbiB0aGUgdHlwZSBpcyBmcm9tIEphdmEgc291cmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Tm9uUmVzb2x2ZWRTdXBlclR5cGVOYW1lcyhJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFN0cmluZz4odHlwZS5nZXRTdXBlcmNsYXNzTmFtZSgpKSwKLQkJCQkJCQlOb3ROdWxsRmlsdGVyLjxTdHJpbmc+aW5zdGFuY2UoKSksCi0JCQkJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4odHlwZS5nZXRTdXBlckludGVyZmFjZU5hbWVzKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGdyYWIgdGhlIGZpcnN0IGNhbmRpZGF0ZSB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZXNvbHZlVHlwZShJVHlwZSB0eXBlLCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nW11bXSByZXNvbHZlZENsYXNzTmFtZXMgPSB0eXBlLnJlc29sdmVUeXBlKGNsYXNzTmFtZSk7Ci0JCWlmIChyZXNvbHZlZENsYXNzTmFtZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHBrZyA9IHJlc29sdmVkQ2xhc3NOYW1lc1swXVswXTsKLQkJU3RyaW5nIGNscyA9IHJlc29sdmVkQ2xhc3NOYW1lc1swXVsxXTsKLQkJLy8gY2hlY2sgZm9yIGRlZmF1bHQgcGFja2FnZQotCQlyZXR1cm4gKHBrZy5sZW5ndGgoKSA9PSAwKSA/IGNscyA6IChwa2cgKyAnLicgKyBjbHMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVR5cGUgZmluZFR5cGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gamF2YVByb2plY3QuZmluZFR5cGUoZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25Db3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGdldEphdmFTb3VyY2VGb2xkZXJzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PigKLQkJCQlnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhqYXZhUHJvamVjdCksCi0JCQkJU09VUkNFX1BBQ0tBR0VfRlJBR01FTlRfUk9PVF9GSUxURVIKLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmlsdGVyPElQYWNrYWdlRnJhZ21lbnRSb290PiBTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUiA9Ci0JCW5ldyBGaWx0ZXI8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgewotCQkJCXJldHVybiBwYWNrYWdlRnJhZ21lbnRSb290SXNTb3VyY2VGb2xkZXIocGZyKTsKLQkJCX0KLQkJfTsKLQotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRQYWNrYWdlRnJhZ21lbnRSb290cyhJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290c18oamF2YVByb2plY3QpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0UGFja2FnZUZyYWdtZW50Um9vdHNfKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4oamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzICJiYXNpYyIuCi0JICogQHBhcmFtIGZ1bGx5UXVhbGlmaWVkTmFtZSBtYXkgaW5jbHVkZSBhcnJheSBicmFja2V0cyBidXQgbm90IGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzQmFzaWMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBTdHJpbmcgZnVsbHlRdWFsaWZpZWROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdHlwZUlzQmFzaWMoamF2YVByb2plY3QsIGphdmFQcm9qZWN0LmZpbmRUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSkpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHlwZUlzQmFzaWMoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJVHlwZSB0eXBlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCi0JCWlmIChmdWxseVF1YWxpZmllZE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaW50IGFycmF5RGVwdGggPSBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbihmdWxseVF1YWxpZmllZE5hbWUpOwotCQlpZiAoYXJyYXlEZXB0aCA+IDEpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBhcmUgbm90IHN1cHBvcnRlZAotCQl9Ci0KLQkJaWYgKGFycmF5RGVwdGggPT0gMSkgewotCQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oZnVsbHlRdWFsaWZpZWROYW1lLCAxKTsKLQkJCXJldHVybiBlbGVtZW50VHlwZUlzVmFsaWRGb3JCYXNpY0FycmF5KGVsZW1lbnRUeXBlTmFtZSk7Ci0JCX0KLQotCQkvLyBhcnJheURlcHRoID09IDAKLQkJaWYgKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGZ1bGx5UXVhbGlmaWVkTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYW55IHByaW1pdGl2ZSBidXQgJ3ZvaWQnCi0JCX0KLQkJaWYgKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihmdWxseVF1YWxpZmllZE5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGFueSBwcmltaXRpdmUgd3JhcHBlciBidXQgJ2phdmEubGFuZy5Wb2lkJwotCQl9Ci0JCWlmICh0eXBlSXNPdGhlclZhbGlkQmFzaWNUeXBlKGZ1bGx5UXVhbGlmaWVkTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlSXNTdWJUeXBlKGphdmFQcm9qZWN0LCB0eXBlLCBTRVJJQUxJWkFCTEVfQ0xBU1NfTkFNRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICh0eXBlLmlzRW51bSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUklBTElaQUJMRV9DTEFTU19OQU1FID0gamF2YS5pby5TZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGlzIGEgdmFsaWQgZWxlbWVudCB0eXBlIGZvcgotCSAqIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5IHRoYXQgY2FuIGRlZmF1bHQgdG8gYSBiYXNpYyBtYXBwaW5nOjx1bD4KLQkgKiA8bGk+PGNvZGU+Ynl0ZTwvY29kZT4KLQkgKiA8bGk+PGNvZGU+amF2YS5sYW5nLkJ5dGU8L2NvZGU+Ci0JICogPGxpPjxjb2RlPmNoYXI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPmphdmEubGFuZy5DaGFyYWN0ZXI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudFR5cGVJc1ZhbGlkRm9yQmFzaWNBcnJheShTdHJpbmcgZWxlbWVudFR5cGVOYW1lKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmNvbnRhaW5zKFZBTElEX0JBU0lDX0FSUkFZX0VMRU1FTlRfVFlQRV9OQU1FUywgZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9CQVNJQ19BUlJBWV9FTEVNRU5UX1RZUEVfTkFNRVMgPSB7Ci0JCWJ5dGUuY2xhc3MuZ2V0TmFtZSgpLAotCQljaGFyLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLkJ5dGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzLmdldE5hbWUoKQotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHR5cGUgaXMgYW1vbmcgdGhlIHZhcmlvdXMgIm90aGVyIiB0eXBlcwotCSAqIHRoYXQgY2FuIGRlZmF1bHQgdG8gYSBiYXNpYyBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0eXBlSXNPdGhlclZhbGlkQmFzaWNUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyhPVEhFUl9WQUxJRF9CQVNJQ19UWVBFX05BTUVTLCB0eXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gT1RIRVJfVkFMSURfQkFTSUNfVFlQRV9OQU1FUyA9IHsKLQkJamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubWF0aC5CaWdJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnV0aWwuRGF0ZS5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEudXRpbC5DYWxlbmRhci5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEuc3FsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLnNxbC5UaW1lLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLmdldE5hbWUoKSwKLQl9OwotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc0hhc1B1YmxpY1plcm9BcmdDb25zdHJ1Y3RvcihJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGphdmFQcm9qZWN0ICE9IG51bGwgJiYgY2xhc3NOYW1lICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaGFzRGVmaW5lZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCQlJVHlwZSB0eXBlID0gZmluZFR5cGUoamF2YVByb2plY3QsIGNsYXNzTmFtZSk7Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJTWV0aG9kIG1ldGhvZCA6IHR5cGUuZ2V0TWV0aG9kcygpKSB7Ci0JCQkJCQlpZiAobWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJCQkJCWlmICgobWV0aG9kLmdldE51bWJlck9mUGFyYW1ldGVycygpID09IDApICYmIChGbGFncy5pc1B1YmxpYyhtZXRob2QuZ2V0RmxhZ3MoKSkpKSB7Ci0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQloYXNEZWZpbmVkQ29uc3RydWN0b3IgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vV2hlbiB0aGVyZSdzIG5vIGRlZmluZWQgY29uc3RydWN0b3IsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIGluIHBsYWNlLgotCQkJCQlpZiAoIWhhc0RlZmluZWRDb25zdHJ1Y3RvcikgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Kb2JDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pvYkNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0NmJiNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L0pvYkNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLS8qKgotICogU2ltcGxlIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBHT0YgQ29tbWFuZCBkZXNpZ24gcGF0dGVybiBpbiBhbgotICogRWNsaXBzZSBqb2IuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvYkNvbW1hbmQgewotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgY29tbWFuZC4gVGhlIHNlbWFudGljcyBvZiB0aGUgY29tbWFuZAotCSAqIGlzIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyLgotCSAqIFRoZSBjb21tYW5kIHNob3VsZCBjaGVjaywgYXMgYXBwcm9wcmlhdGUsIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwcm9ncmVzcwotCSAqIG1vbml0b3IgaXMge0BsaW5rIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpICJjYW5jZWxlZCJ9OyBpZiBpdCBpcywKLQkgKiB0aGUgY29tbWFuZCBzaG91bGQgdGhyb3cgYW4KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9ufS4KLQkgKiBAc2VlIElQcm9ncmVzc01vbml0b3IjaXNDYW5jZWxlZCgpCi0JICovCi0JSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGpvYiBjb21tYW5kIGludGVyZmFjZSB0aGF0IHdpbGwgZG8KLQkgKiBub3RoaW5nIHdoZW4gZXhlY3V0ZWQuCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbCBpbXBsZW1lbnRzIEpvYkNvbW1hbmQsIFNlcmlhbGl6YWJsZSB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSm9iQ29tbWFuZCBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgSm9iQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIGFyZzApIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKb2JDb21tYW5kLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgam9iIGNvbW1hbmQgaW50ZXJmYWNlIHRoYXQgd2lsbCB0aHJvdyBhbgotCSAqIGV4Y2VwdGlvbiB3aGVuIGV4ZWN1dGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIERpc2FibGVkIGltcGxlbWVudHMgSm9iQ29tbWFuZCwgU2VyaWFsaXphYmxlIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBKb2JDb21tYW5kIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCXB1YmxpYyBzdGF0aWMgSm9iQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgYXJnMCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkpvYkNvbW1hbmQuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Kb2JTeW5jaHJvbml6ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvSm9iU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjAyODMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9Kb2JTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotCi0vKioKLSAqIFRoaXMgc3luY2hyb25pemVyIHdpbGwgcGVyZm9ybSBzeW5jaHJvbml6YXRpb25zIGluIGFuIEVjbGlwc2Ugam9iIG9uIGEKLSAqIHNlcGFyYXRlIHRocmVhZCwgYWxsb3dpbmcgY2FsbHMgdG8ge0BsaW5rIFN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfQotICogdG8gcmV0dXJuIGltbWVkaWF0ZWx5LgotICogPHA+Ci0gKiBJZiBuZWNlc3NhcnksIHRoZSBjbGllbnQtc3VwcGxpZWQgam9iIGNvbW1hbmQgc2hvdWxkIGhhbmRsZSBhbnkKLSAqIGV4Y2VwdGlvbnMgYXBwcm9wcmlhdGVseS4gQWx0aG91Z2gsIHRoZSBkZWZhdWx0IGV4Y2VwdGlvbi1oYW5kbGluZyBwcm92aWRlZAotICogYnkgdGhlIEVjbGlwc2UgSm9iIEZyYW1ld29yayBpcyBwcm9iYWJseSBhZGVxdWF0ZSBpbiBtb3N0IGNhc2VzOjx1bD4KLSAqIDxsaT5BbiB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9ufQotICogICAgIHJlc3VsdHMgaW4gYSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1cyNDQU5DRUxfU1RBVFVTIENBTkNFTF9TVEFUVVN9LgotICogPGxpPkFueSBub24te0BsaW5rIFRocmVhZERlYXRofSB7QGxpbmsgVGhyb3dhYmxlfQotICogICAgIHJlc3VsdHMgaW4gYSB7QGxpbmsgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjRVJST1IgRVJST1J9Ci0gKiAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzIElTdGF0dXN9Ci0gKiA8L3VsPgotICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLmpvYnMuV29ya2VyI3J1bigpCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2JTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIFN5bmNocm9uaXplcgotewotCS8qKgotCSAqIFRoZSBzeW5jaHJvbml6YXRpb24gaXMgcGVyZm9ybWVkIGJ5IHRoaXMgam9iLiBUaGUgc2FtZSBqb2IgaXMgdXNlZAotCSAqIGZvciBldmVyeSBzdGFydC9zdG9wIGN5Y2xlIChzaW5jZSBhIGpvYiBjYW4gYmUgcmUtc3RhcnRlZCkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTeW5jaHJvbml6YXRpb25Kb2Igam9iOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBqb2Igc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGpvYiBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIGdlbmVyYXRlZCBFY2xpcHNlIGpvYiB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgSm9iU3luY2hyb25pemVyKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcyhqb2JOYW1lLCBjb21tYW5kLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBqb2Igc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkIGpvYiBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIGdlbmVyYXRlZCBFY2xpcHNlIGpvYiB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZSBhbmQgc2NoZWR1bGluZyBydWxlLgotCSAqLwotCXB1YmxpYyBKb2JTeW5jaHJvbml6ZXIoU3RyaW5nIGpvYk5hbWUsIEpvYkNvbW1hbmQgY29tbWFuZCwgSVNjaGVkdWxpbmdSdWxlIHNjaGVkdWxpbmdSdWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuam9iID0gdGhpcy5idWlsZEpvYihqb2JOYW1lLCBjb21tYW5kLCBzY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0JU3luY2hyb25pemF0aW9uSm9iIGJ1aWxkSm9iKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9uaXphdGlvbkpvYihqb2JOYW1lLCBjb21tYW5kLCBzY2hlZHVsaW5nUnVsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgam9iIHRvIGJlIHNjaGVkdWxlZCwgYnV0IHBvc3Rwb25lIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24KLQkgKiB1bnRpbCByZXF1ZXN0ZWQsIHZpYSB7QGxpbmsgI3N5bmNocm9uaXplKCl9LgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmpvYi5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqICJTY2hlZHVsZSIgdGhlIGpvYi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJdGhpcy5qb2Iuc3luY2hyb25pemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBXYWl0IGZvciB0aGUgY3VycmVudCBqb2IgZXhlY3V0aW9uIHRvIGNvbXBsZXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCXRoaXMuam9iLnN0b3AoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmpvYik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXphdGlvbiBqb2IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgam9iIHRoYXQgZ2V0cyBzY2hlZHVsZWQgYnkgdGhlIGpvYiBzeW5jaHJvbml6ZXIuCi0JICogV2hlbiB0aGUgam9iIGlzIHJ1biBpdCBleGVjdXRlcyB0aGUgY2xpZW50LXN1cHBsaWVkIGpvYiBjb21tYW5kLgotCSAqLwotCXN0YXRpYyBjbGFzcyBTeW5jaHJvbml6YXRpb25Kb2IgZXh0ZW5kcyBKb2IgewotCQkvKioKLQkJICogVGhlIGNsaWVudC1zdXBwbGllZCBqb2IgY29tbWFuZCB0aGF0IGV4ZWN1dGVzIGV2ZXJ5IHRpbWUgdGhlIGpvYgotCQkgKiBydW5zLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBKb2JDb21tYW5kIGNvbW1hbmQ7Ci0KLQkJLyoqCi0JCSAqIFdoZW4gdGhpcyBmbGFnIGlzIHNldCB0byBmYWxzZSwgdGhlIGpvYiBkb2VzIG5vdCBzdG9wIGltbWVkaWF0ZWx5OwotCQkgKiBidXQgaXQgd2lsbCBub3QgYmUgc2NoZWR1bGVkIHRvIHJ1biBhZ2Fpbi4KLQkJICovCi0JCS8vIHVzZSAndm9sYXRpbGUnIGJlY2F1c2Ugc3luY2hyb25pemF0aW9uIGlzbid0IHJlYWxseSByZXF1aXJlZAotCQl2b2xhdGlsZSBib29sZWFuIHNob3VsZFNjaGVkdWxlOwotCi0KLQkJU3luY2hyb25pemF0aW9uSm9iKFN0cmluZyBqb2JOYW1lLCBKb2JDb21tYW5kIGNvbW1hbmQsIElTY2hlZHVsaW5nUnVsZSBzY2hlZHVsaW5nUnVsZSkgewotCQkJc3VwZXIoam9iTmFtZSk7Ci0JCQlpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmNvbW1hbmQgPSBjb21tYW5kOwotCQkJdGhpcy5zaG91bGRTY2hlZHVsZSA9IGZhbHNlOwotCQkJdGhpcy5zZXRSdWxlKHNjaGVkdWxpbmdSdWxlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBKdXN0IHNldCB0aGUgInNob3VsZCBzY2hlZHVsZSIgZmxhZyBzbyB0aGUgam9iIDxlbT5jYW48L2VtPiBiZQotCQkgKiBzY2hlZHVsZWQ7IGJ1dCBkb24ndCBhY3R1YWxseSBzY2hlZHVsZSBpdC4KLQkJICovCi0JCXZvaWQgc3RhcnQoKSB7Ci0JCQlpZiAodGhpcy5zaG91bGRTY2hlZHVsZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBTeW5jaHJvbml6ZXIgd2FzIG5vdCBzdG9wcGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLnNob3VsZFNjaGVkdWxlID0gdHJ1ZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW1wbHkgcmUtc2NoZWR1bGUgdGhlIGpvYiwgYWxsb3dpbmcgdGhlIGN1cnJlbnQgZXhlY3V0aW9uCi0JCSAqIHRvIHJ1biB0byBjb21wbGV0aW9uIChpLmUuIGRvIG5vdCB0cnkgdG8gY2FuY2VsIGl0IHByZW1hdHVyZWx5KS4KLQkJICogVGhpcyBzaG91bGQgbWluaW1pemUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgam9iIGlzIHJlLWV4ZWN1dGVkCi0JCSAqIChyZWN1cnNpdmVseSBhbmQgb3RoZXJ3aXNlKS4KLQkJICovCi0JCXZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLnNjaGVkdWxlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb21tYW5kIHdpbGwgYmUgcmVhc29uYWJseQotCQkgKiBoYW5kbGVkIGJ5IHRoZSBKb2IgRnJhbWV3b3JrLgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5Xb3JrZXIjcnVuKCkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21tYW5kLmV4ZWN1dGUobW9uaXRvcik7Ci0JCX0KLQotCQkvKioKLQkJICogUHJldmVudCB0aGUgam9iIGZyb20gcnVubmluZyBhZ2FpbiBhbmQgd2FpdCBmb3IgdGhlIGN1cnJlbnQKLQkJICogZXhlY3V0aW9uLCBpZiB0aGVyZSBpcyBhbnksIHRvIGVuZCBiZWZvcmUgcmV0dXJuaW5nLgotCQkgKi8KLQkJdm9pZCBzdG9wKCkgewotCQkJaWYgKCAhIHRoaXMuc2hvdWxkU2NoZWR1bGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgU3luY2hyb25pemVyIHdhcyBub3Qgc3RhcnRlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gdGhpcyB3aWxsIHByZXZlbnQgdGhlIGpvYiBmcm9tIGJlaW5nIHNjaGVkdWxlZCB0byBydW4gYWdhaW4KLQkJCXRoaXMuc2hvdWxkU2NoZWR1bGUgPSBmYWxzZTsKLQkJCS8vIHRoaXMgd2lsbCBjYW5jZWwgdGhlIGpvYiBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuIHNjaGVkdWxlZCwgYnV0IGlzIGN1cnJlbnRseSBXQUlUSU5HCi0JCQl0aGlzLmNhbmNlbCgpOwotCQkJdHJ5IHsKLQkJCQkvLyBpZiB0aGUgam9iIGlzIGN1cnJlbnRseSBSVU5OSU5HLCB3YWl0IHVudGlsIGl0IGlzIGRvbmUgYmVmb3JlIHJldHVybmluZwotCQkJCXRoaXMuam9pbigpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkICNzdG9wKCkgd2FzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgdG8KLQkJCQkvLyBqb2luIHRoZSBzeW5jaHJvbml6YXRpb24gam9iIC0gaWdub3JlOwotCQkJCS8vICdzaG91bGRTY2hlZHVsZScgaXMgc3RpbGwgc2V0IHRvICdmYWxzZScsIHNvIHRoZSBqb2IgbG9vcCB3aWxsIHN0aWxsIHN0b3AgLSB3ZQotCQkJCS8vIGp1c3Qgd29uJ3Qgd2FpdCBhcm91bmQgZm9yIGl0Li4uCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhpcyBpcyBwYXJ0IG9mIHRoZSBub3JtYWwge0BsaW5rIEpvYn0gYmVoYXZpb3IuIEJ5IGRlZmF1bHQsIGl0IGlzCi0JCSAqIG5vdCB1c2VkIChpLmUuIGl0IGFsd2F5cyByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+KS4KLQkJICogV2UgaW1wbGVtZW50IGl0IGhlcmUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkU2NoZWR1bGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zaG91bGRTY2hlZHVsZTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1BsYXRmb3JtVG9vbHMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvUGxhdGZvcm1Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDE4M2E5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvUGxhdGZvcm1Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gb2YgdXRpbGl0aWVzIGZvciBkZWFsaW5nIHdpdGggdGhlIEVjbGlwc2UgcGxhdGZvcm0gQVBJLgotICovCi1wdWJsaWMgY2xhc3MgUGxhdGZvcm1Ub29scyB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSUNvbnRhaW5lcn0gd2l0aCB0aGUgd29ya3NwYWNlIHJlbGF0aXZlICJmdWxsIiBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29udGFpbmVyIGdldENvbnRhaW5lcihJUGF0aCBmdWxsQ29udGFpbmVyUGF0aCkgewotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJLy8gY2hhbmdlZCB0byBoYW5kbGUgbm9uLXdvcmtzcGFjZSBwcm9qZWN0cwotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBmdWxsQ29udGFpbmVyUGF0aC5zZWdtZW50KDApLnRvU3RyaW5nKCk7Ci0JCUlQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGggPSBmdWxsQ29udGFpbmVyUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcm9vdC5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKHByb2plY3RSZWxhdGl2ZVBhdGguaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gcHJvamVjdDsKLQkJfQotCQlyZXR1cm4gcHJvamVjdC5nZXRGb2xkZXIocHJvamVjdFJlbGF0aXZlUGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIElGaWxlfSB3aXRoIHRoZSB3b3Jrc3BhY2UgcmVsYXRpdmUgImZ1bGwiIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGUoSVBhdGggZnVsbEZpbGVQYXRoKSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyBjaGFuZ2VkIHRvIGhhbmRsZSBub24td29ya3NwYWNlIHByb2plY3RzCi0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGZ1bGxGaWxlUGF0aC5zZWdtZW50KDApLnRvU3RyaW5nKCk7Ci0JCUlQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGggPSBmdWxsRmlsZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCXJldHVybiBwcm9qZWN0LmdldEZpbGUocHJvamVjdFJlbGF0aXZlUGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGZpbGUncyBjb250ZW50IHR5cGUsCi0JICogdXNpbmcgdGhlIEVjbGlwc2UgcGxhdGZvcm0ncyBjb250ZW50IHR5cGUgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZShJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IGZpbGUuZ2V0TmFtZSgpOwotCQlJbnB1dFN0cmVhbSBmaWxlQ29udGVudHMgPSBudWxsOwotCQl0cnkgewotCQkJZmlsZUNvbnRlbnRzID0gZmlsZS5nZXRDb250ZW50cygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBzZWVtcyBsaWtlIHdlIGNhbiBpZ25vcmUgYW55IGV4Y2VwdGlvbiB0aGF0IG1pZ2h0IG9jY3VyIGhlcmU7Ci0JCQkvLyBlLmcuIHdlIGdldCBhIEZORkUgaWYgdGhlIHdvcmtzcGFjZSBpcyBvdXQgb2Ygc3luY2ggd2l0aCB0aGUgTy9TIGZpbGUgc3lzdGVtCi0JCQkvLyBKcHRDb3JlUGx1Z2luLmxvZyhleCk7Ci0KLQkJCS8vIGxvb2sgZm9yIGNvbnRlbnQgdHlwZSBiYXNlZCBvbiB0aGUgZmlsZSBuYW1lIG9ubHkoPykKLQkJCXJldHVybiBmaW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOwotCQl9Ci0KLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWNvbnRlbnRUeXBlID0gZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlmaWxlQ29udGVudHMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZmluZENvbnRlbnRUeXBlRm9yKElucHV0U3RyZWFtIGZpbGVDb250ZW50cywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGZpbGVDb250ZW50cywgZmlsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZSBmaW5kQ29udGVudFR5cGVGb3IoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBnZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZU5hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb250ZW50VHlwZU1hbmFnZXIgZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JfQotCi0JcHJpdmF0ZSBQbGF0Zm9ybVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvU2ltcGxlU2NoZWR1bGluZ1J1bGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvU2ltcGxlU2NoZWR1bGluZ1J1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkOGEyNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVNjaGVkdWxpbmdSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIGpvYiBzY2hlZHVsaW5nIHJ1bGUgdGhhdCBjb25mbGljdHMgb25seSB3aXRoIGl0c2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZVNjaGVkdWxpbmdSdWxlCi0JaW1wbGVtZW50cyBJU2NoZWR1bGluZ1J1bGUKLXsKLQlwdWJsaWMgU2ltcGxlU2NoZWR1bGluZ1J1bGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSVNjaGVkdWxpbmdSdWxlIHJ1bGUpIHsKLQkJcmV0dXJuIHJ1bGUgPT0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbmZsaWN0aW5nKElTY2hlZHVsaW5nUnVsZSBydWxlKSB7Ci0JCXJldHVybiBydWxlID09IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9TaW1wbGVUZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NGUzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1NpbXBsZVRleHRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LkFic3RyYWN0VGV4dFJhbmdlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZgotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZSBUZXh0UmFuZ2V9LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVGV4dFJhbmdlCi0JZXh0ZW5kcyBBYnN0cmFjdFRleHRSYW5nZQotewotCXByaXZhdGUgZmluYWwgaW50IG9mZnNldDsKLQlwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgbGluZU51bWJlcjsKLQotCi0JcHVibGljIFNpbXBsZVRleHRSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgbGluZU51bWJlcikgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0JfQotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJcmV0dXJuIHRoaXMubGluZU51bWJlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1hQb2ludFRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L1hQb2ludFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDJmYjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9YUG9pbnRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuSnB0Q29tbW9uQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBVdGlsaXRpZXMgZm9yIGV4dGVuc2lvbiBwb2ludCBtYW5hZ2VtZW50LCB2YWxpZGF0aW9uLCBldGMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYUG9pbnRUb29scyB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmluZFJlcXVpcmVkQXR0cmlidXRlKAotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotCQkJdGhyb3dzIFhQb2ludEV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgdmFsID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7Ci0JCWlmICh2YWwgPT0gbnVsbCkgewotCQkJbG9nTWlzc2luZ0F0dHJpYnV0ZShjb25maWdFbGVtZW50LCBhdHRyaWJ1dGVOYW1lKTsKLQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gdmFsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIDxUPiBUIGluc3RhbnRpYXRlKFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGV4dGVuc2lvblBvaW50LCBTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczxUPiBpbnRlcmZhemUpIHsKLQkJQ2xhc3M8VD4gY2xhenogPSBsb2FkQ2xhc3MocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50LCBjbGFzc05hbWUsIGludGVyZmF6ZSk7Ci0JCXJldHVybiAoY2xhenogPT0gbnVsbCkgPyBudWxsIDogaW5zdGFudGlhdGUocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50LCBjbGF6eik7Ci0gICAgfQotCQotCS8qKgotCSAqIEluc3RhbnRpYXRlIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBpbnN0YW50aWF0ZShTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCwgQ2xhc3M8VD4gY2xhenopIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWxvZ0ZhaWxlZEluc3RhbnRpYXRpb24oZXgsIHBsdWdpbklkLCBleHRlbnNpb25Qb2ludCwgY2xhenouZ2V0TmFtZSgpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCQotCSAqIExvYWQgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgY2FzdCBpdCB0byB0aGUgc3BlY2lmaWVkIGludGVyZmFjZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8VD4gQ2xhc3M8VD4gbG9hZENsYXNzKFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIGV4dGVuc2lvblBvaW50LCBTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczxUPiBpbnRlcmZhemUpIHsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0KLQkJQ2xhc3M8Pz4gY2xheno7Ci0JCXRyeSB7Ci0JCQljbGF6eiA9IGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2dGYWlsZWRDbGFzc0xvYWQoZXgsIHBsdWdpbklkLCBleHRlbnNpb25Qb2ludCwgY2xhc3NOYW1lKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlpZiAoaW50ZXJmYXplLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUNsYXNzPFQ+IGNsYXp6VCA9IChDbGFzczxUPikgY2xheno7Ci0JCQlyZXR1cm4gY2xhenpUOwotCQl9Ci0JCQotCQlsb2dGYWlsZWRJbnRlcmZhY2VBc3NpZ25tZW50KHBsdWdpbklkLCBleHRlbnNpb25Qb2ludCwgY2xhc3NOYW1lLCBpbnRlcmZhemUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dEdXBsaWNhdGVFeHRlbnNpb24oU3RyaW5nIGV4dGVuc2lvblBvaW50LCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlsb2coSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlJFR0lTVFJZX0RVUExJQ0FURSwgZXh0ZW5zaW9uUG9pbnQsIG5vZGVOYW1lLCB2YWx1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dNaXNzaW5nQXR0cmlidXRlKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlsb2coSnB0Q29tbW9uQ29yZU1lc3NhZ2VzLlJFR0lTVFJZX01JU1NJTkdfQVRUUklCVVRFLAotCQkJCWF0dHJpYnV0ZU5hbWUsCi0JCQkJY29uZmlnRWxlbWVudC5nZXROYW1lKCksCi0JCQkJY29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQljb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0ludmFsaWRWYWx1ZSgKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50LCBTdHJpbmcgbm9kZU5hbWUsIFN0cmluZyBpbnZhbGlkVmFsdWUpIHsKLQkJCi0JCWxvZyhKcHRDb21tb25Db3JlTWVzc2FnZXMuUkVHSVNUUllfSU5WQUxJRF9WQUxVRSwKLQkJCQlpbnZhbGlkVmFsdWUsCi0JCQkJbm9kZU5hbWUsCi0JCQkJY29uZmlnRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXRFeHRlbnNpb25Qb2ludFVuaXF1ZUlkZW50aWZpZXIoKSwKLQkJCQljb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dGYWlsZWRDbGFzc0xvYWQoRXhjZXB0aW9uIGV4LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlsb2coZXgsIEpwdENvbW1vbkNvcmVNZXNzYWdlcy5SRUdJU1RSWV9GQUlMRURfQ0xBU1NfTE9BRCwKLQkJCQljbGFzc05hbWUsCi0JCQkJZXh0ZW5zaW9uUG9pbnQsCi0JCQkJcGx1Z2luSWQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ0ZhaWxlZEludGVyZmFjZUFzc2lnbm1lbnQoCi0JCQlTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGludGVyZmFjZU5hbWUpIHsKLQkJCi0JCWxvZyhKcHRDb21tb25Db3JlTWVzc2FnZXMuUkVHSVNUUllfRkFJTEVEX0lOVEVSRkFDRV9BU1NJR05NRU5ULAotCQkJCWNsYXNzTmFtZSwKLQkJCQlleHRlbnNpb25Qb2ludCwKLQkJCQlwbHVnaW5JZCwKLQkJCQlpbnRlcmZhY2VOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dGYWlsZWRJbnN0YW50aWF0aW9uKEV4Y2VwdGlvbiBleCwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJbG9nKGV4LCBKcHRDb21tb25Db3JlTWVzc2FnZXMuUkVHSVNUUllfRkFJTEVEX0lOU1RBTlRJQVRJT04sCi0JCQkJY2xhc3NOYW1lLAotCQkJCWV4dGVuc2lvblBvaW50LAotCQkJCXBsdWdpbklkKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBTdHJpbmcuLi4gYmluZGluZ3MpIHsKLQkJSnB0Q29tbW9uQ29yZVBsdWdpbi5sb2coTkxTLmJpbmQobXNnLCBiaW5kaW5ncykpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSBleCwgU3RyaW5nIG1zZywgU3RyaW5nLi4uIGJpbmRpbmdzKSB7Ci0JCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKE5MUy5iaW5kKG1zZywgYmluZGluZ3MpLCBleCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIGV4KSB7Ci0JCUpwdENvbW1vbkNvcmVQbHVnaW4ubG9nKGV4KTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBYUG9pbnRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQVNUVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NmNDM1Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUFubm90YXRpb25CaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVmFyaWFibGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuU2ltcGxlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZU1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGRlYWxpbmcgd2l0aCBKRFQgQVNUcy4KLSAqLwotcHVibGljIGNsYXNzIEFTVFRvb2xzIHsKLQotCS8qKgotCSAqIEJ1aWxkIGFuIEFTVCB3aXRob3V0IG1ldGhvZCBib2RpZXMgZm9yIHRoZSBzcGVjaWZpZWQgY29tcGlsYXRpb24gdW5pdAotCSAqIHdpdGggaXRzIGJpbmRpbmdzIHJlc29sdmVkIChhbmQgdGhlIHJlc3VsdGFudCBwZXJmb3JtYW5jZSBoaXQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdChJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCXBhcnNlci5zZXRTb3VyY2UoY29tcGlsYXRpb25Vbml0KTsKLQkJcGFyc2VyLnNldElnbm9yZU1ldGhvZEJvZGllcyh0cnVlKTsgIC8vIHdlIGRvbid0IG5lZWQgbWV0aG9kIGJvZGllcwotCQlwYXJzZXIuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwotCQlwYXJzZXIuc2V0QmluZGluZ3NSZWNvdmVyeSh0cnVlKTsgIC8vIHNlZSBidWdzIDE5NjIwMCwgMjIyNzM1Ci0JCXJldHVybiAoQ29tcGlsYXRpb25Vbml0KSBwYXJzZXIuY3JlYXRlQVNUKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKRFQgRE9NICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVFbnVtKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlpZiAoZXhwcmVzc2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FOgotCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FOgotCQkJCXJldHVybiByZXNvbHZlRW51bSgoTmFtZSkgZXhwcmVzc2lvbik7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUVudW0oTmFtZSBlbnVtRXhwcmVzc2lvbikgewotCQlJQmluZGluZyBiaW5kaW5nID0gZW51bUV4cHJlc3Npb24ucmVzb2x2ZUJpbmRpbmcoKTsKLQkJaWYgKGJpbmRpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7ICAvLyBUT0RPIGZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgbnVsbCBzb21ldGltZXMKLQkJfQotCQlpZiAoYmluZGluZy5nZXRLaW5kKCkgIT0gSUJpbmRpbmcuVkFSSUFCTEUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlWYXJpYWJsZUJpbmRpbmcgdmFyaWFibGVCaW5kaW5nID0gKElWYXJpYWJsZUJpbmRpbmcpIGJpbmRpbmc7Ci0JCXJldHVybiB2YXJpYWJsZUJpbmRpbmcuZ2V0VHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSArICcuJyArIHZhcmlhYmxlQmluZGluZy5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIG5vZGUncyBhbm5vdGF0aW9uCi0JICogY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUFubm90YXRpb24oQW5ub3RhdGlvbiBub2RlKSB7Ci0JCUlBbm5vdGF0aW9uQmluZGluZyBhbm5vdGF0aW9uQmluZGluZyA9IG5vZGUucmVzb2x2ZUFubm90YXRpb25CaW5kaW5nKCk7Ci0JCWlmIChhbm5vdGF0aW9uQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVHlwZUJpbmRpbmcgYW5ub3RhdGlvblR5cGVCaW5kaW5nID0gYW5ub3RhdGlvbkJpbmRpbmcuZ2V0QW5ub3RhdGlvblR5cGUoKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uVHlwZUJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvblR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGEgdHlwZSBsaXRlcmFsLCByZXR1cm4gdGhlIHR5cGUncyBmdWxseS0KLQkgKiBxdWFsaWZpZWQgbmFtZS4gUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCUlUeXBlQmluZGluZyByZXNvbHZlZFR5cGVCaW5kaW5nID0gcmVzb2x2ZVR5cGVCaW5kaW5nKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gKHJlc29sdmVkVHlwZUJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogcmVzb2x2ZWRUeXBlQmluZGluZy5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhbiBhcnJheSBpbml0aWFsaXplciwgcmV0dXJuIGFuIGFuIGl0ZXJhYmxlCi0JICogb24gdGhlIHR5cGVzJyBmdWxseSBxdWFsZmlmaWVkIG5hbWVzLiAgCi0JICogVGhlIHJlc3VsdHMgbWF5IGluY2x1ZGUgbnVsbHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IHJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVR5cGVCaW5kaW5nLCBTdHJpbmc+KHJlc29sdmVUeXBlQmluZGluZ3MoZXhwcmVzc2lvbikpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSVR5cGVCaW5kaW5nIG8pIHsKLQkJCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyBudWxsIDogby5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhIHR5cGUgbGl0ZXJhbCwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi0JICogdHlwZSBiaW5kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVR5cGVCaW5kaW5nIHJlc29sdmVUeXBlQmluZGluZyhFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24gIT0gbnVsbCAmJiBleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5UWVBFX0xJVEVSQUwpIHsKLQkJCXJldHVybiAoKFR5cGVMaXRlcmFsKSBleHByZXNzaW9uKS5nZXRUeXBlKCkucmVzb2x2ZUJpbmRpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGFuIGFycmF5IGluaXRpYWxpemVyLCByZXR1cm4gYW4gaXRlcmFibGUgb2YKLQkgKiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGJpbmRpbmdzIGZvciBlYWNoIHN1Yi1leHByZXNzaW9uLgotCSAqIFRoZSByZXN1bHQgbWF5IGluY2x1ZGUgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxJVHlwZUJpbmRpbmc+IHJlc29sdmVUeXBlQmluZGluZ3MoRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiAoZXhwcmVzc2lvbiAhPSBudWxsICYmIGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSA/Ci0JCQkJcmVzb2x2ZVR5cGVCaW5kaW5ncygoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvbikgOgotCQkJCUVtcHR5SXRlcmFibGUuPElUeXBlQmluZGluZz5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxJVHlwZUJpbmRpbmc+IHJlc29sdmVUeXBlQmluZGluZ3MoQXJyYXlJbml0aWFsaXplciBhcnJheUV4cHJlc3Npb24pIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gYXJyYXlFeHByZXNzaW9uLmV4cHJlc3Npb25zKCk7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxFeHByZXNzaW9uLCBJVHlwZUJpbmRpbmc+KGV4cHJlc3Npb25zKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJVHlwZUJpbmRpbmcgdHJhbnNmb3JtKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQkJCXJldHVybiByZXNvbHZlVHlwZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgTWV0aG9kU2lnbmF0dXJlIGJ1aWxkTWV0aG9kU2lnbmF0dXJlKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKAotCQkJCW1ldGhvZERlY2xhcmF0aW9uLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwKLQkJCQlidWlsZFBhcmFtZXRlclR5cGVzKG1ldGhvZERlY2xhcmF0aW9uKQotCQkJKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlW10gYnVpbGRQYXJhbWV0ZXJUeXBlcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlMaXN0PFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24+IHBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzKG1ldGhvZERlY2xhcmF0aW9uKTsKLQkJaW50IGxlbiA9IHBhcmFtZXRlcnMuc2l6ZSgpOwotCQlKYXZhVHlwZVtdIHBhcmFtZXRlclR5cGVzID0gbmV3IEphdmFUeXBlW2xlbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCUlUeXBlQmluZGluZyB0eXBlID0gcGFyYW1ldGVycy5nZXQoaSkuZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCk7Ci0JCQlwYXJhbWV0ZXJUeXBlc1tpXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh0eXBlLmdldFF1YWxpZmllZE5hbWUoKSwgdHlwZS5nZXREaW1lbnNpb25zKCkpOwotCQl9Ci0JCXJldHVybiBwYXJhbWV0ZXJUeXBlczsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBleHByZXNzaW9uIGlzIGEgdHlwZSBsaXRlcmFsIGFuZCB0aGUgdHlwZSBiaW5kaW5nCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSBleGlzdHMgaW4gdGhlIHR5cGUKLQkgKiBsaXRlcmFsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMgYW5kIGludGVyZmFjZXMpLgotCSAqIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZU9mKEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgU3RyaW5nIHNlYXJjaFR5cGVOYW1lKSB7Ci0JCXJldHVybiBmaW5kVHlwZUluSGllcmFyY2h5KGV4cHJlc3Npb24sIHNlYXJjaFR5cGVOYW1lKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhIHR5cGUgbGl0ZXJhbCwgcmV0dXJuIHRoZSB0eXBlIGJpbmRpbmcKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGlmIGl0IGV4aXN0cyBpbiB0aGUgdHlwZQotCSAqIGxpdGVyYWwncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgKHN1cGVyY2xhc3NlcyBhbmQgaW50ZXJmYWNlcykuCi0JICogUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRUeXBlSW5IaWVyYXJjaHkoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUpIHsKLQkJSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nID0gcmVzb2x2ZVR5cGVCaW5kaW5nKGV4cHJlc3Npb24pOwotCQlyZXR1cm4gKHR5cGVCaW5kaW5nID09IG51bGwpID8gbnVsbCA6IGZpbmRUeXBlSW5IaWVyYXJjaHkodHlwZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIHR5cGUgYmluZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGV4aXN0cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgdHlwZSBiaW5kaW5nJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMKLQkgKiBhbmQgaW50ZXJmYWNlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHR5cGVJc1N1YlR5cGVPZihJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hUeXBlTmFtZSkgewotCQlyZXR1cm4gZmluZFR5cGVJbkhpZXJhcmNoeSh0eXBlQmluZGluZywgc2VhcmNoVHlwZU5hbWUpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIGJpbmRpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSBpZiBpdAotCSAqIGV4aXN0cyBpbiB0aGUgc3BlY2lmaWVkIHR5cGUgYmluZGluZydzIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAoc3VwZXJjbGFzc2VzCi0JICogYW5kIGludGVyZmFjZXMpLiBSZXR1cm4gbnVsbCBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJVHlwZUJpbmRpbmcgZmluZFR5cGVJbkhpZXJhcmNoeShJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hUeXBlTmFtZSkgewotCQlyZXR1cm4gZmluZFR5cGVJbkhpZXJhcmNoeSh0eXBlQmluZGluZywgc2VhcmNoVHlwZU5hbWUsIG5ldyBIYXNoU2V0PFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRUeXBlSW5IaWVyYXJjaHkoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoVHlwZU5hbWUsIEhhc2hTZXQ8U3RyaW5nPiB2aXNpdGVkKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHR5cGVCaW5kaW5nLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHZpc2l0ZWQuY29udGFpbnModHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKHNlYXJjaFR5cGVOYW1lKSkgewotCQkJcmV0dXJuIHR5cGVCaW5kaW5nOwotCQl9Ci0JCXZpc2l0ZWQuYWRkKHR5cGVOYW1lKTsKLQkJCi0JCUlUeXBlQmluZGluZyBpbnRlcmZhY2VCaW5kaW5nID0gZmluZFR5cGVJbkludGVyZmFjZXModHlwZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lLCB2aXNpdGVkKTsKLQkJaWYgKGludGVyZmFjZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIGludGVyZmFjZUJpbmRpbmc7Ci0JCX0KLQkJCi0JCXJldHVybiBmaW5kVHlwZUluU3VwZXJjbGFzc2VzKHR5cGVCaW5kaW5nLCBzZWFyY2hUeXBlTmFtZSwgdmlzaXRlZCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVR5cGVCaW5kaW5nIGZpbmRUeXBlSW5JbnRlcmZhY2VzKElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIHNlYXJjaFR5cGVOYW1lLCBIYXNoU2V0PFN0cmluZz4gdmlzaXRlZCkgewotCQlJVHlwZUJpbmRpbmdbXSBpbnRlcmZhY2VCaW5kaW5ncyA9IHR5cGVCaW5kaW5nLmdldEludGVyZmFjZXMoKTsKLQkJZm9yIChJVHlwZUJpbmRpbmcgaW50ZXJmYWNlQmluZGluZyA6IGludGVyZmFjZUJpbmRpbmdzKSB7ICAvLyByZWN1cnNlIHVwIGludGVyZmFjZXMKLQkJCUlUeXBlQmluZGluZyByZXN1bHQgPSBmaW5kVHlwZUluSGllcmFyY2h5KGludGVyZmFjZUJpbmRpbmcsIHNlYXJjaFR5cGVOYW1lLCB2aXNpdGVkKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotIAkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJVHlwZUJpbmRpbmcgZmluZFR5cGVJblN1cGVyY2xhc3NlcyhJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcsIFN0cmluZyBzZWFyY2hUeXBlTmFtZSwgSGFzaFNldDxTdHJpbmc+IHZpc2l0ZWQpIHsKLQkJSVR5cGVCaW5kaW5nIHN1cGVyQmluZGluZyA9IHR5cGVCaW5kaW5nLmdldFN1cGVyY2xhc3MoKTsKLQkJaWYgKHN1cGVyQmluZGluZyAhPSBudWxsKSB7ICAvLyByZWN1cnNlIHVwIHN1cGVyY2xhc3NlcwotCQkJSVR5cGVCaW5kaW5nIHJlc3VsdCA9IGZpbmRUeXBlSW5IaWVyYXJjaHkoc3VwZXJCaW5kaW5nLCBzZWFyY2hUeXBlTmFtZSwgdmlzaXRlZCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwkJCi0JfQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhIHR5cGUgbGl0ZXJhbCBhbmQgdGhlIHR5cGUgYmluZGluZwotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpbnRlcmZhY2UgbmFtZSBleGlzdHMgaW4gdGhlIHR5cGUKLQkgKiBsaXRlcmFsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5IChzdXBlcmNsYXNzZXMgYW5kIGludGVyZmFjZXMpLgotCSAqIFJldHVybiBudWxsIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUltcGxlbWVudHNJbnRlcmZhY2UoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBTdHJpbmcgc2VhcmNoSW50ZXJmYWNlTmFtZSkgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSByZXNvbHZlVHlwZUJpbmRpbmcoZXhwcmVzc2lvbik7Ci0JCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGZpbmRJbnRlcmZhY2VJbkhpZXJhcmNoeSh0eXBlQmluZGluZywgc2VhcmNoSW50ZXJmYWNlTmFtZSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIHR5cGUgYmluZGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZXJmYWNlIG5hbWUgZXhpc3RzIGluCi0JICogdGhlIHNwZWNpZmllZCB0eXBlIGJpbmRpbmcncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkgKHN1cGVyY2xhc3NlcwotCSAqIGFuZCBpbnRlcmZhY2VzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUltcGxlbWVudHNJbnRlcmZhY2UoSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nLCBTdHJpbmcgc2VhcmNoSW50ZXJmYWNlTmFtZSkgewotCQlyZXR1cm4gZmluZEludGVyZmFjZUluSGllcmFyY2h5KHR5cGVCaW5kaW5nLCBzZWFyY2hJbnRlcmZhY2VOYW1lKSAhPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJVHlwZUJpbmRpbmcgZmluZEludGVyZmFjZUluSGllcmFyY2h5KElUeXBlQmluZGluZyB0eXBlQmluZGluZywgU3RyaW5nIHNlYXJjaEludGVyZmFjZU5hbWUpIHsKLQkJSGFzaFNldDxTdHJpbmc+IHZpc2l0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCUlUeXBlQmluZGluZyBpbnRlcmZhY2VCaW5kaW5nID0gZmluZFR5cGVJbkludGVyZmFjZXModHlwZUJpbmRpbmcsIHNlYXJjaEludGVyZmFjZU5hbWUsIHZpc2l0ZWQpOwotCQlpZiAoaW50ZXJmYWNlQmluZGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW50ZXJmYWNlQmluZGluZzsKLQkJfQotCQkKLQkJcmV0dXJuIGZpbmRUeXBlSW5TdXBlcmNsYXNzZXModHlwZUJpbmRpbmcsIHNlYXJjaEludGVyZmFjZU5hbWUsIHZpc2l0ZWQpOwotCi0JfQotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHRleHQgcmFuZ2UgZm9yIHRoZSBzcGVjaWZpZWQgQVNUIG5vZGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXh0UmFuZ2UgYnVpbGRUZXh0UmFuZ2UoQVNUTm9kZSBhc3ROb2RlKSB7Ci0JCXJldHVybiBidWlsZFRleHRSYW5nZShhc3ROb2RlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhlIHNwZWNpZmllZCBBU1Qgbm9kZSBpZiBpdCBkaWZmZXJzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHRleHQgcmFuZ2Ugb3IgdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoZSBBU1Qgbm9kZSBhbHJlYWR5IG1hdGNoZXMgdGhlCi0JICogc3BlY2lmaWVkIHRleHQgcmFuZ2UsIHNpbXBseSByZXR1cm4gdGhlIHRleHQgcmFuZ2UgdW5jaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlKEFTVE5vZGUgYXN0Tm9kZSwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlpbnQgb2Zmc2V0ID0gYXN0Tm9kZS5nZXRTdGFydFBvc2l0aW9uKCk7Ci0JCWludCBsZW5ndGggPSBhc3ROb2RlLmdldExlbmd0aCgpOwotCQlpbnQgbGluZU51bWJlciA9ICgoQ29tcGlsYXRpb25Vbml0KSBhc3ROb2RlLmdldFJvb3QoKSkuZ2V0TGluZU51bWJlcihvZmZzZXQpOwotCQlyZXR1cm4gKHRleHRSYW5nZSA9PSBudWxsKSA/Ci0JCQkJbmV3IFNpbXBsZVRleHRSYW5nZShvZmZzZXQsIGxlbmd0aCwgbGluZU51bWJlcikgOgotCQkJCXRleHRSYW5nZS5idWlsZFRleHRSYW5nZShvZmZzZXQsIGxlbmd0aCwgbGluZU51bWJlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzMzMzIyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBZGFwdCBhbiBhbm5vdGF0ZWQgZWxlbWVudCBhbmQgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudHMgQW5ub3RhdGlvbkFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50OwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIEFic3RyYWN0QW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcigpOwotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50OwotCQl0aGlzLmRhYSA9IGRhYTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmV3TWFya2VyQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGROZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKSB7Ci0JCXRoaXMuZWRpdCh0aGlzLmJ1aWxkTmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkVkaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdOb3JtYWxBbm5vdGF0aW9uKCkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGRSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKCkpOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFhLmdldEFzdE5vZGUodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGFhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0KEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGVkaXRvcikgewotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQuZWRpdChlZGl0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGJ1aWxkTmV3TWFya2VyQW5ub3RhdGlvbkVkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBOZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yKHRoaXMuZGFhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgYnVpbGROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IE5ld1NpbmdsZU1lbWJlckFubm90YXRpb25FZGl0b3IodGhpcy5kYWEpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciBidWlsZE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvcih0aGlzLmRhYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGJ1aWxkUmVtb3ZlQW5ub3RhdGlvbkVkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZW1vdmVBbm5vdGF0aW9uRWRpdG9yKHRoaXMuZGFhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBOZXdNYXJrZXJBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhOwotCi0JCU5ld01hcmtlckFubm90YXRpb25FZGl0b3IoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRhYSA9IGRhYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXRoaXMuZGFhLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbkVkaXRvciBpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTsKLQotCQlOZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRWRpdG9yKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kYWEgPSBkYWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5ld05vcm1hbEFubm90YXRpb25FZGl0b3IgaW1wbGVtZW50cyBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciB7Ci0JCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWE7Ci0KLQkJTmV3Tm9ybWFsQW5ub3RhdGlvbkVkaXRvcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGFhID0gZGFhOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJdGhpcy5kYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBSZW1vdmVBbm5vdGF0aW9uRWRpdG9yIGltcGxlbWVudHMgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgewotCQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhOwotCi0JCVJlbW92ZUFubm90YXRpb25FZGl0b3IoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRhYSA9IGRhYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXRoaXMuZGFhLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMWM0ZWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYW5ub3RhdGlvbk5hbWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uQW5kSW1wb3J0KGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSk7Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbkFuZEltcG9ydChkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCkpOwotCQl0aGlzLmFkZEFubm90YXRpb25BbmRJbXBvcnQoZGVjbGFyYXRpb24sIGFubm90YXRpb24pOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGFwcHJvcHJpYXRlIGltcG9ydCBzdGF0ZW1lbnQsIHRoZW4gc2hvcnRlbiB0aGUgYW5ub3RhdGlvbidzCi0JICogbmFtZSBiZWZvcmUgYWRkaW5nIGl0IHRvIHRoZSBkZWNsYXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uQW5kSW1wb3J0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGRlY2xhcmF0aW9uLmdldEFzdCgpLm5ld05hbWUodGhpcy5nZXRTb3VyY2VDb2RlQW5ub3RhdGlvbk5hbWUoZGVjbGFyYXRpb24pKSk7Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgYW5ub3RhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgbmFtZSBhcyBpdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZTsKLQkgKiBpLmUuIGlmIHdlIGNhbiBhZGQgaXQgdG8gdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBpbXBvcnRzLCByZXR1cm4gdGhlIHNob3J0Ci0JICogbmFtZTsgaWYgd2UgY2FuJ3QgKGJlY2F1c2Ugb2YgYSBjb2xsaXNpb24pLCByZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotCSAqIE5COiBhbiBpbXBvcnQgbWF5IGJlIGFkZGVkIGFzIGEgc2lkZS1lZmZlY3QgOi0oCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTb3VyY2VDb2RlQW5ub3RhdGlvbk5hbWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uYWRkSW1wb3J0KHRoaXMuYW5ub3RhdGlvbk5hbWUpID8gdGhpcy5nZXRTaG9ydEFubm90YXRpb25OYW1lKCkgOiB0aGlzLmFubm90YXRpb25OYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gdG8gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwKLQkgKiByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbik7Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyAncHVibGljJyBiZWNhdXNlIHdlIHVzZSBpdCBpbiBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JICogdG8gZ2V0IHRoZSBhbm5vdGF0aW9uIG5hbWUgZnJvbSBhIE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25OYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuYW1lTWF0Y2hlcyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMubmFtZU1hdGNoZXMoZGVjbGFyYXRpb24sIGFubm90YXRpb24sIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG5hbWVNYXRjaGVzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmFubm90YXRpb25Jc05hbWVkKGFubm90YXRpb24sIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oQVNUIGFzdCkgewotCQlyZXR1cm4gdGhpcy5uZXdNYXJrZXJBbm5vdGF0aW9uKGFzdCwgdGhpcy5hbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gbmV3TWFya2VyQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgbmFtZSkgewotCQlNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3QubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQlhbm5vdGF0aW9uLnNldFR5cGVOYW1lKGFzdC5uZXdOYW1lKG5hbWUpKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihBU1QgYXN0KSB7Ci0JCXJldHVybiB0aGlzLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oYXN0LCB0aGlzLmFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzdC5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCWFubm90YXRpb24uc2V0VHlwZU5hbWUoYXN0Lm5ld05hbWUobmFtZSkpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdOb3JtYWxBbm5vdGF0aW9uKEFTVCBhc3QpIHsKLQkJcmV0dXJuIHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsIHRoaXMuYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhc3QubmV3TmFtZShuYW1lKSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2hvcnRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1Nob3J0TmFtZSh0aGlzLmFubm90YXRpb25OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU2hvcnROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMoTm9ybWFsQW5ub3RhdGlvbiBuYSkgewotCQlyZXR1cm4gbmEudmFsdWVzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmI0OWZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBHYXRoZXIgdG9nZXRoZXIgdGhlIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBiZWhhdmlvci4KLSAqIFQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgdG8gYW5kIGZyb20gYW4gZXhwcmVzc2lvbi4KLSAqIAotICogV2UncmUgc3RpbGwgZmlndXJpbmcgb3V0IEphdmEgR2VuZXJpY3MgaGVyZS4uLi4gVGhlIG1ldGhvZHMgaW4gdGhpcyBhYnN0cmFjdAotICogY2xhc3Mgd29yayBmaW5lIHdpdGggYW55IHN1YmNsYXNzIG9mIEV4cHJlc3Npb24gRTsgYnV0IGEgQ2xhc3NDYXN0RXhjZXB0aW9uCi0gKiB3aWxsIG9jY3VyIGFzIHNvb24gYXMgd2UgY2FsbCBhbnkgbWV0aG9kIGltcGxlbWVudGVkIGJ5IGEgc3ViY2xhc3MKLSAqIChlLmcuIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIpIHRoYXQgZXhwZWN0cyBhIHBhcnRpY3VsYXIgc3ViY2xhc3Mgb2YKLSAqIEV4cHJlc3Npb24gKGUuZy4gU3RyaW5nTGl0ZXJhbCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLQlpbXBsZW1lbnRzIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4KLXsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9iamVjdCAtPiBleHByZXNzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFeHByZXNzaW9uIGNvbnZlcnQoVCBvYmplY3QsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIChvYmplY3QgPT0gbnVsbCkgPyB0aGlzLmNvbnZlcnROdWxsKGFzdCkgOiB0aGlzLmNvbnZlcnRPYmplY3Qob2JqZWN0LCBhc3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgYSBudWxsIG9iamVjdC4gQnkgZGVmYXVsdCwgYSBudWxsIG9iamVjdCB3aWxsCi0JICogYmUgY29udmVydGVkIGludG8gYSBudWxsIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gY29udmVydE51bGwoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEFTVCBhc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBvYmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjY29udmVydChPYmplY3QsIEFTVCkKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRXhwcmVzc2lvbiBjb252ZXJ0T2JqZWN0KFQgb2JqZWN0LCBBU1QgYXN0KTsKLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uIC0+IG9iamVjdCAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBjb252ZXJ0KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gKGV4cHJlc3Npb24gPT0gbnVsbCkgPyB0aGlzLmNvbnZlcnROdWxsKCkgOiB0aGlzLmNvbnZlcnRFeHByZXNzaW9uKGV4cHJlc3Npb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IGZvciBhIG51bGwgZXhwcmVzc2lvbi4gQnkgZGVmYXVsdCwgYSBudWxsIGV4cHJlc3Npb24gd2lsbAotCSAqIGJlIGNvbnZlcnRlZCBpbnRvIGEgbnVsbCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIFQgY29udmVydE51bGwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNjb252ZXJ0KEV4cHJlc3Npb24pCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFQgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3RKRFRUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEpEVFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhYzliMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9BYnN0cmFjdEpEVFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSVR5cGVCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBhYnN0cmFjdCB0eXBlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKRFRUeXBlCi0JZXh0ZW5kcyBKRFRNZW1iZXIKLQlpbXBsZW1lbnRzIEFic3RyYWN0VHlwZQotewotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXModHlwZURlY2xhcmF0aW9uLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJdGhpcyhudWxsLCB0eXBlRGVjbGFyYXRpb24sIDEsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhkZWNsYXJpbmdUeXBlLCB0eXBlRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgbmVzdGVkIHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SkRUVHlwZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCB0eXBlRGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKRFRUeXBlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZSBnZXREZWNsYXJpbmdUeXBlKCkgewotCQlyZXR1cm4gKFR5cGUpIHN1cGVyLmdldERlY2xhcmluZ1R5cGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE1lbWJlci9UeXBlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSVR5cGVCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdGQgPSB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJcmV0dXJuICh0ZCA9PSBudWxsKSA/IG51bGwgOiB0ZC5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCS8qKgotCSAqIGZpbmQgdGhlIHR5cGUncyBib2R5IGRlY2xhcmF0aW9uIGluIHRoZSBzcGVjaWZpZWQgQVNUCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUeXBlIGRlY2xhcmluZ1R5cGUgPSB0aGlzLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJaWYgKGRlY2xhcmluZ1R5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCX0KLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IGRlY2xhcmluZ1R5cGUuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCQkvLyB0aGUgdHlwZSBkZWNsYXJhdGlvbiBjYW4gYmUgbnVsbCB3aGVuIHRoZSBzb3VyY2UgaXMgY29tcGxldGVseSBob3NlZAotCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldE5lc3RlZFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24gPSB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJLy8gdGhlIGRlY2xhcmF0aW9uIGNhbiBiZSBudWxsIGlmIHRoZSByZXNvdXJjZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaWxlIHN5c3RlbQotCQlyZXR1cm4gKGJvZHlEZWNsYXJhdGlvbikgPT0gbnVsbCA/IG51bGwgOiBBU1RUb29scy5idWlsZFRleHRSYW5nZShib2R5RGVjbGFyYXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBmaXJzdCB0b3AtbGV2ZWwgdHlwZSBpbiB0aGUgc3BlY2lmaWVkIEFTVCB3aXRoIGEgbWF0Y2hpbmcgbmFtZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24odHlwZXMoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZURlY2xhcmF0aW9ucykgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucy50b0FycmF5KG5ldyBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvblt0eXBlRGVjbGFyYXRpb25zLnNpemUoKV0pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCB0eXBlIGRlY2xhcmF0aW9uIHdpdGggbWF0Y2hpbmcgbmFtZSBhbmQgb2NjdXJyZW5jZSB3aXRoaW4gdGhlIGRlY2xhcmluZyB0eXBlCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGdldE5lc3RlZFR5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIHJldHVybiB0aGUgdHlwZSBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGZyb20gdGhlIHNwZWNpZmllZAotCSAqIHNldCBvZiB0eXBlIGRlY2xhcmF0aW9ucyAobWF0Y2ggbmFtZSBhbmQgb2NjdXJyZW5jZSkuCi0JICogT25seSByZXR1cm4gdHlwZSBvciBlbnVtIGRlY2xhcmF0aW9ucwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWludCBvY2N1cnJlbmNlID0gdGhpcy5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uIDogdHlwZURlY2xhcmF0aW9ucykgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPT0gb2NjdXJyZW5jZSkgewotCQkJCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5nZXROb2RlVHlwZSgpID09IHRoaXMuZ2V0QVNUTm9kZVR5cGUoKSkgPyB0eXBlRGVjbGFyYXRpb24gOiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgdHlwZSBpcyBubyBsb25nZXIgaW4gdGhlIHNvdXJjZSBjb2RlOwotCQkvLyB0aGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgY29udGV4dCBtb2RlbCBoYXMgbm90IHlldAotCQkvLyBiZWVuIHN5bmNocm9uaXplZCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCBidXQgaXMgc3RpbGwKLQkJLy8gYXNraW5nIGZvciBhbiBBU1ROb2RlIChlLmcuIGR1cmluZyBhIHNlbGVjdGlvbiBldmVudCkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRBU1ROb2RlVHlwZSgpOwotCi0JLyoqCi0JICogd2Ugb25seSBpbnN0YW50aWF0ZSBhIHNpbmdsZSB0b3AtbGV2ZWwsIG5vbi1hbm5vdGF0aW9uCi0JICogdHlwZSBwZXIgY29tcGlsYXRpb24gdW5pdCAoaS5lLiBhIGNsYXNzLCBlbnVtLCBvciBpbnRlcmZhY2UpCi0JICovCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4gdHlwZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGFzdFJvb3QudHlwZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEVudW1EZWNsYXJhdGlvbltdIGdldEVudW1zKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pIHsKLQkJTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJkID0gYm9keURlY2xhcmF0aW9ucyhkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pOwotCQlpbnQgdHlwZUNvdW50ID0gMDsKLQkJZm9yIChJdGVyYXRvcjxCb2R5RGVjbGFyYXRpb24+IGl0ID0gYmQubGlzdEl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXQubmV4dCgpLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJdHlwZUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJRW51bURlY2xhcmF0aW9uW10gbWVtYmVyRW51bXMgPSBuZXcgRW51bURlY2xhcmF0aW9uW3R5cGVDb3VudF07Ci0JCWludCBuZXh0ID0gMDsKLQkJZm9yIChJdGVyYXRvcjxCb2R5RGVjbGFyYXRpb24+IGl0ID0gYmQubGlzdEl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7Ci0JCQlCb2R5RGVjbGFyYXRpb24gZGVjbCA9IGl0Lm5leHQoKTsKLQkJCWlmIChkZWNsLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJbWVtYmVyRW51bXNbbmV4dCsrXSA9IChFbnVtRGVjbGFyYXRpb24pIGRlY2w7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1lbWJlckVudW1zOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxCb2R5RGVjbGFyYXRpb24+IGJvZHlEZWNsYXJhdGlvbnMoVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uLmJvZHlEZWNsYXJhdGlvbnMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTJmNzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFB1bGwgdG9nZXRoZXIgc29tZSBvZiB0aGUgYmVoYXZpb3IgY29tbW9uIHRvCi0gKiB7QGxpbmsgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcn0KLSAqIGFuZCB7QGxpbmsgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJ9Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotewotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lOwotCi0JLy8gcmVkdWNlIE5MUyBjaGVja3MKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXRoaXMob3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgVkFMVUUsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIoYW5ub3RhdGlvbk5hbWUpOwotCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIgPSBvdXRlckFubm90YXRpb25BZGFwdGVyOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlFeHByZXNzaW9uIHZhbHVlID0gdGhpcy5lbGVtZW50VmFsdWUob3V0ZXIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQW5ub3RhdGlvbiBpbm5lciA9IHRoaXMuZ2V0QW5ub3RhdGlvbih2YWx1ZSk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyByZXR1cm4gdGhlIGFubm90YXRpb24gb25seSBpZiBpdCBoYXMgYSBtYXRjaGluZyBuYW1lKD8pCi0JCXJldHVybiB0aGlzLm5hbWVNYXRjaGVzKGRlY2xhcmF0aW9uLCBpbm5lcikgPyBpbm5lciA6IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJRXhwcmVzc2lvbiB2YWx1ZSA9IHRoaXMuZWxlbWVudFZhbHVlKG91dGVyKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBoYWNrIHRvIGFsbG93IHNob3J0LWNpcmN1aXQgd2hlbiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgaW5pdGlhbGl6ZXIKLQkJaWYgKHRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgb3V0ZXIsIHZhbHVlKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUFubm90YXRpb24gaW5uZXIgPSB0aGlzLmFubm90YXRpb25WYWx1ZSh2YWx1ZSk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gcmVtb3ZlIHRoZSBhbm5vdGF0aW9uIG9ubHkgaWYgaXQgaGFzIGEgbWF0Y2hpbmcgbmFtZSg/KQotCQlpZiAodGhpcy5uYW1lTWF0Y2hlcyhkZWNsYXJhdGlvbiwgaW5uZXIpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIG91dGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIG91dGVyIGFubm90YXRpb24ncyBub2RlCi0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGlubmVyKSB7Ci0JCUFubm90YXRpb24gb3V0ZXIgPSB0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvdXRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJ1aWxkTmV3T3V0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKE1hcmtlckFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubW9kaWZ5QW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgKE5vcm1hbEFubm90YXRpb24pIG91dGVyLCBpbm5lcik7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIG91dGVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFubm90YXRpb24gZXh0cmFjdGVkIGZyb20gdGhlIHNwZWNpZmllZCBleHByZXNzaW9uLAotCSAqIHdoaWNoIGlzIHRoZSB2YWx1ZSBvZiB0aGUgYWRhcHRlcidzIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiwKLQkgKiB3aGljaCBpcyB0aGUgdmFsdWUgb2YgdGhlIGFkYXB0ZXIncyBlbGVtZW50LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZW1vdmFsIHdhcyBzdWNjZXNzZnVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgRXhwcmVzc2lvbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgb3V0ZXIgYW5ub3RhdGlvbiB0byB0aGUKLQkgKiBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBtb2RpZnlBbm5vdGF0aW9uVmFsdWUoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcik7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlCi0JICogc3BlY2lmaWVkIGlubmVyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbW9kaWZ5TWVtYmVyVmFsdWVQYWlyKE1lbWJlclZhbHVlUGFpciBwYWlyLCBBbm5vdGF0aW9uIGlubmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBnZXRPdXRlckFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnROYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZXhwcmVzc2lvbiBpcyBhbiBhbm5vdGF0aW9uLCBjYXN0IGl0IHRvIGFuIGFubm90YXRpb247Ci0JICogb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGFubm90YXRpb25WYWx1ZShFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJc3dpdGNoIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgQVNUTm9kZS5OT1JNQUxfQU5OT1RBVElPTjoKLQkJCWNhc2UgQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT046Ci0JCQljYXNlIEFTVE5vZGUuTUFSS0VSX0FOTk9UQVRJT046Ci0JCQkJcmV0dXJuIChBbm5vdGF0aW9uKSBleHByZXNzaW9uOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgPGVtPmZpcnN0PC9lbT4gYW5ub3RhdGlvbiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24sIGNvbnZlcnRpbmcgdGhlIGFubm90YXRpb24gYXMgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCWlmIChvdXRlci5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKGRlY2xhcmF0aW9uLCAoTm9ybWFsQW5ub3RhdGlvbikgb3V0ZXIpOwotCQl9IGVsc2UgaWYgKG91dGVyLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnRBbmROb3JtYWxpemUoZGVjbGFyYXRpb24sIChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBvdXRlcik7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShkZWNsYXJhdGlvbiwgKE1hcmtlckFubm90YXRpb24pIG91dGVyKTsKLQkJfSBlbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gYW5ub3RhdGlvbiB0eXBlOiAiICsgb3V0ZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIDxlbT5maXJzdDwvZW0+IGFubm90YXRpb24gZWxlbWVudCB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudAotCSAqIG5hbWUgZnJvbSB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uIENvbnZlcnQgdGhlIGFubm90YXRpb24gdG8KLQkgKiBhIG1hcmtlciBhbm5vdGF0aW9uIG9yIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiBpZiBhcHByb3ByaWF0ZS4KLQkgKiA8cHJlPgotCSAqICYjNjQ7T3V0ZXIobmFtZT0iRnJlZCIsIGZvbz0mIzY0O0lubmVyKSA9PiAmIzY0O091dGVyKG5hbWU9IkZyZWQiKQotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpID0+ICYjNjQ7T3V0ZXIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIE5vcm1hbEFubm90YXRpb24gb3V0ZXIpIHsKLQkJdGhpcy5yZW1vdmVFbGVtZW50KG91dGVyKTsKLQkJdGhpcy5ub3JtYWxpemVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRoZSBlbGVtZW50IHdpdGgKLQkgKiB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50KE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlmb3IgKEl0ZXJhdG9yPE1lbWJlclZhbHVlUGFpcj4gc3RyZWFtID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG5vcm1hbCBhbm5vdGF0aW9uIHRvIGEgbWFya2VyIGFubm90YXRpb24gb3IKLQkgKiBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24gaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm9ybWFsaXplQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBOb3JtYWxBbm5vdGF0aW9uIG91dGVyKSB7Ci0JCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhvdXRlcik7Ci0JCXN3aXRjaCAodmFsdWVzLnNpemUoKSkgewotCQkJY2FzZSAwOgotCQkJCS8vIGlmIHRoZSBlbGVtZW50cyBhcmUgYWxsIGdvbmUsIGNvbnZlcnQgdGhlIGFubm90YXRpb24gdG8gYSBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHZhbHVlcy5nZXQoMCk7Ci0JCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhWQUxVRSkpIHsKLQkJCQkJLy8gaWYgdGhlIGxhc3QgcmVtYWluaW5nIGVsZW1lbnQgaXMgJ3ZhbHVlJywgY29udmVydCB0aGUgYW5ub3RhdGlvbiB0byBhIHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbgotCQkJCQlFeHByZXNzaW9uIHZ2ID0gcGFpci5nZXRWYWx1ZSgpOwotCQkJCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCQkJCXRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2dik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uIHRvIGEgbWFya2VyIGFubm90YXRpb24KLQkgKiBpZiB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudEFuZE5vcm1hbGl6ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlcikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBvdXRlcikgewotCQkvLyBOT1AKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAqZmlyc3QqIGFubm90YXRpb24gZWxlbWVudAotCSAqIHdpdGggdGhlIGFkYXB0ZXIncyBlbGVtZW50IG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKiAoQW4gZWxlbWVudCBuYW1lIG9mICJ2YWx1ZSIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlCi0JICogbWVtYmVyIGFubm90YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGVsZW1lbnRWYWx1ZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRWYWx1ZSgoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRWYWx1ZSgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gZWxlbWVudFZhbHVlKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24pOwotCQlyZXR1cm4gKHBhaXIgPT0gbnVsbCkgPyBudWxsIDogcGFpci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lIGlzICJ2YWx1ZSIsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYW5ub3RhdGlvbiwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGVsZW1lbnRWYWx1ZShTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSA/IGFubm90YXRpb24uZ2V0VmFsdWUoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAqZmlyc3QqIG1lbWJlciB2YWx1ZSBwYWlyIGZvciB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKGFubm90YXRpb24pKSB7Ci0JCQlpZiAocGFpci5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHBhaXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgb3V0ZXIgYW5ub3RhdGlvbiBhbmQgYWRkIHRoZSBzcGVjaWZpZWQKLQkgKiBpbm5lciBhbm5vdGF0aW9uIHRvIGl0OgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKiBvcgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGROZXdPdXRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQl0aGlzLm91dGVyQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodGhpcy5idWlsZE5ld0lubmVyRXhwcmVzc2lvbihpbm5lcikpOwotCQl9IGVsc2UgewotCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKHRoaXMub3V0ZXJBbm5vdGF0aW9uQWRhcHRlci5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSk7Ci0JCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKHRoaXMuYnVpbGROZXdJbm5lckV4cHJlc3Npb24oaW5uZXIpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIHRvIGJlIGFkZGVkIHRvIGEgbmV3IG91dGVyIGFubm90YXRpb24KLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBFeHByZXNzaW9uIGJ1aWxkTmV3SW5uZXJFeHByZXNzaW9uKEFubm90YXRpb24gaW5uZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgbWVtYmVyIHZhbHVlIHBhaXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCUFTVCBhc3QgPSB2YWx1ZS5nZXRBU1QoKTsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShuYW1lKSk7Ci0JCXBhaXIuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gcGFpcjsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBtZW1iZXIgdmFsdWUgcGFpciB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lCi0JICogYW5kIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcih0aGlzLmVsZW1lbnROYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgbWFya2VyIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQl0aGlzLmJ1aWxkTmV3T3V0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBpbm5lcik7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgc2luZ2xlIG1lbWJlciBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQl0aGlzLm1vZGlmeUFubm90YXRpb25WYWx1ZShvdXRlciwgaW5uZXIpOwotCQl9IGVsc2UgewotCQkJdGhpcy5tb2RpZnlBbm5vdGF0aW9uTm9uVmFsdWUoZGVjbGFyYXRpb24sIG91dGVyLCBpbm5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbm5lciBhbm5vdGF0aW9uIHRvIHRoZSBzaW5nbGUgbWVtYmVyIGFubm90YXRpb24sCi0JICogY29udmVydGluZyBpdCB0byBhIG5vcm1hbCBhbm5vdGF0aW9uOgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7T3V0ZXIoImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcih2YWx1ZT0ibG9yZW0gaXBzdW0iLCBmb289JiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uTm9uVmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQlFeHByZXNzaW9uIHZ2ID0gb3V0ZXIuZ2V0VmFsdWUoKTsKLQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwotCQlOb3JtYWxBbm5vdGF0aW9uIG5ld091dGVyID0gdGhpcy5vdXRlckFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMobmV3T3V0ZXIpOwotCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKFZBTFVFLCB2dikpOwotCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKHRoaXMuYnVpbGROZXdJbm5lckV4cHJlc3Npb24oaW5uZXIpKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW5uZXIgYW5ub3RhdGlvbiB0byB0aGUgbm9ybWFsIGFubm90YXRpb246Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihiYXI9ImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcihiYXI9ImxvcmVtIGlwc3VtIiwgZm9vPSYjNjQ7SW5uZXIpCi0JICogPC9wcmU+Ci0JICogb3IKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKCJsb3JlbSBpcHN1bSIpKSA9PiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKQotCSAqIDwvcHJlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vZGlmeUFubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIE5vcm1hbEFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihvdXRlcik7Ci0JCWlmIChwYWlyID09IG51bGwpIHsKLQkJCUxpc3Q8TWVtYmVyVmFsdWVQYWlyPiB2YWx1ZXMgPSB0aGlzLnZhbHVlcyhvdXRlcik7Ci0JCQl2YWx1ZXMuYWRkKHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGlubmVyKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLm1vZGlmeU1lbWJlclZhbHVlUGFpcihwYWlyLCBpbm5lcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQxOWE1Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0gLyoqCi0gKiBBZGFwdCBhbiBhbm5vdGF0ZWQgZWxlbWVudCBhbmQgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlpbXBsZW1lbnRzIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCXByaXZhdGUgZmluYWwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50OwotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+IGRhZWEpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudDsKLQkJdGhpcy5kYWVhID0gZGFlYTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kYWVhLmdldFZhbHVlKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBUIGdldFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhZWEuZ2V0VmFsdWUodGhpcy5hbm5vdGF0ZWRFbGVtZW50LmdldE1vZGlmaWVkRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJdGhpcy5lZGl0KHRoaXMuYnVpbGRTZXRWYWx1ZUVkaXRvcih2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyBFeHByZXNzaW9uIGdldEV4cHJlc3Npb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZGFlYS5nZXRFeHByZXNzaW9uKHRoaXMuYW5ub3RhdGVkRWxlbWVudC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmRhZWEuZ2V0QXN0Tm9kZSh0aGlzLmFubm90YXRlZEVsZW1lbnQuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYWVhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0KEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIGVkaXRvcikgewotCQl0aGlzLmFubm90YXRlZEVsZW1lbnQuZWRpdChlZGl0b3IpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0ZWRFbGVtZW50LkVkaXRvciBidWlsZFNldFZhbHVlRWRpdG9yKFQgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBTZXRWYWx1ZUVkaXRvcjxUPih2YWx1ZSwgdGhpcy5kYWVhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBTZXRWYWx1ZUVkaXRvcjxUPiBpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBkYWVhOwotCQlwcml2YXRlIGZpbmFsIFQgdmFsdWU7Ci0KLQkJU2V0VmFsdWVFZGl0b3IoVCB2YWx1ZSwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZGFlYSA9IGRhZWE7Ci0JCX0KLQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQl0aGlzLmRhZWEuc2V0VmFsdWUodGhpcy52YWx1ZSwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZmQ5ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Bbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjsKLQotLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IGluaXRpYWxpemVyIG9yIHNpbmdsZSBleHByZXNzaW9uIHRvL2Zyb20gYW4gYXJyYXkgb2YKLSAqIHN0cmluZ3MgKGUuZy4geyJ0ZXh0MCIsICJ0ZXh0MSJ9KS4KLSAqIEUgaXMgdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb25zIHRvIGJlIGZvdW5kIGVpdGhlciBzdGFuZC1hbG9uZSBvcgotICogYXMgZWxlbWVudHMgaW4gdGhlIGFycmF5IGluaXRpYWxpemVyLgotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4KLQkJaW1wbGVtZW50cyBJbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IHsKLQkKLQlwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyOwotCXByaXZhdGUgZmluYWwgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyIGFycmF5Q29udmVydGVyOwotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIGFycmF5IGluaXRpYWxpemVyIGlmIGl0IGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyKSB7Ci0JCXRoaXMoZWxlbWVudENvbnZlcnRlciwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGVsZW1lbnRDb252ZXJ0ZXIsIGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRDb252ZXJ0ZXIgPSBlbGVtZW50Q29udmVydGVyOwotCQl0aGlzLmFycmF5Q29udmVydGVyID0gbmV3IFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihlbGVtZW50Q29udmVydGVyLCByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KTsKLQl9Ci0KLQkvKioKLQkgKiBpZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgc3RyaW5nIGluIHRoZSBhcnJheSByZXR1cm4gdGhlIHNpbmdsZSBleHByZXNzaW9uLAotCSAqIHdpdGhvdXQgYnJhY2VzLCBpbnN0ZWFkIG9mIGFuIGFycmF5IGluaXRpYWxpemVyCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gY29udmVydE9iamVjdChTdHJpbmdbXSBzdHJpbmdzLCBBU1QgYXN0KSB7Ci0JCXJldHVybiAoc3RyaW5ncy5sZW5ndGggPT0gMSkgPwotCQkJCXRoaXMuZWxlbWVudENvbnZlcnRlci5jb252ZXJ0KHN0cmluZ3NbMF0sIGFzdCkKLQkJCToKLQkJCQl0aGlzLmFycmF5Q29udmVydGVyLmNvbnZlcnRPYmplY3Qoc3RyaW5ncywgYXN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydE51bGwoKSB7Ci0JCXJldHVybiB0aGlzLmFycmF5Q29udmVydGVyLmNvbnZlcnROdWxsKCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgZm9yIGEgc2luZ2xlIGV4cHJlc3Npb24gd2l0aCBubyBzdXJyb3VuZGluZyBicmFjZXMsIGltcGx5aW5nIGEKLQkgKiBzaW5nbGUtZW50cnkgYXJyYXkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCWlmIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlDb252ZXJ0ZXIuY29udmVydEFycmF5SW5pdGlhbGl6ZXIoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24pOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSB0aGlzLmVsZW1lbnRDb252ZXJ0ZXIuY29udmVydChleHByZXNzaW9uKTsKLQkJcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBuZXcgU3RyaW5nWzBdIDogbmV3IFN0cmluZ1tdIHsgcmVzdWx0IH07Ci0JfQotCQotCXB1YmxpYyBFeHByZXNzaW9uIGdldFN1YmV4cHJlc3Npb24oaW50IGluZGV4LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQlyZXR1cm4gdGhpcy5hcnJheUNvbnZlcnRlci5nZXRTdWJleHByZXNzaW9uKGluZGV4LCBleHByZXNzaW9uKTsKLQkJfQotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNvbnZlcnRlciBmb3IgYW4gYW5ub3RhdGlvbiBlbGVtZW50IG9mIHR5cGUgU3RyaW5nW10uCi0JICogICAgIEBGb28oYmFyPXsidGV4dDAiLCAidGV4dDEifSkKLQkgKiBvcgotCSAqICAgICBARm9vKGJhcj0idGV4dDAiKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JTdHJpbmdzKCkgewotCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhbiBleHByZXNzaW9uIGNvbnZlcnRlciBmb3IgYW4gYW5ub3RhdGlvbiBlbGVtZW50IG9mIHR5cGUgPGVudW0+W10uCi0JICogICAgIEBGb28oYmFyPXtCQVosIEJBVH0pCi0JICogb3IKLQkgKiAgICAgQEZvbyhiYXI9QkFaKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCi0JLyoqCi0JICogQnVpbGQgYW4gZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZm9yIGFuIGFubm90YXRpb24gZWxlbWVudCBvZiB0eXBlIENsYXNzW10uCi0JICogICAgIEBGb28oYmFyPXtCYXouY2xhc3MsIEJhdC5jbGFzc30pCi0JICogb3IKLQkgKiAgICAgQEZvbyhiYXI9QmF6LmNsYXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlciBmb3JUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0Jvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzM2E3MTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9vbGVhbkxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIGJvb2xlYW4gbGl0ZXJhbCB0by9mcm9tIGEgQm9vbGVhbgotICogKGUuZy4gQm9vbGVhbi5UUlVFKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8Qm9vbGVhbj4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPEJvb2xlYW4+IElOU1RBTkNFID0gbmV3IEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8Qm9vbGVhbj4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJvb2xlYW5MaXRlcmFsIGNvbnZlcnRPYmplY3QoQm9vbGVhbiBib29sZWFuT2JqZWN0LCBBU1QgYXN0KSB7Ci0JCXJldHVybiBhc3QubmV3Qm9vbGVhbkxpdGVyYWwoYm9vbGVhbk9iamVjdC5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJvb2xlYW4gY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSA/ICgoQm9vbGVhbikgdmFsdWUpIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZiNDcwNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9DaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNoYXJhY3RlckxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIGNoYXJhY3RlciBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBjaGFyYWN0ZXIKLSAqIChlLmcuICJBIikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBJTlNUQU5DRSA9IG5ldyBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJQ2hhcmFjdGVyTGl0ZXJhbCBjaGFyYWN0ZXJMaXRlcmFsID0gYXN0Lm5ld0NoYXJhY3RlckxpdGVyYWwoKTsKLQkJY2hhcmFjdGVyTGl0ZXJhbC5zZXRDaGFyVmFsdWUoc3RyaW5nLmNoYXJBdCgwKSk7Ci0JCXJldHVybiBjaGFyYWN0ZXJMaXRlcmFsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpID8gKChDaGFyYWN0ZXIpIHZhbHVlKS50b1N0cmluZygpIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlMDViMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogTWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHRoYXQgZWl0aGVyIG9jY3VycyBzdGFuZC1hbG9uZSwgZS5nLgotICogPHByZT4KLSAqICAgICAmIzY0O0lubmVyKCJ6ZXJvIikKLSAqICAgICBwcml2YXRlIGludCBpZDsKLSAqIDwvcHJlPgotICogICAgIAotICogb3IgaXMgZW1iZWRkZWQgaW4gYW4gZWxlbWVudCBhcnJheSB3aXRoaW4gYW5vdGhlciBhbm5vdGF0aW9uLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKCJ6ZXJvIiksICYjNjQ7SW5uZXIoIm9uZSIpLCAmIzY0O0lubmVyKCJ0d28iKX0pCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiAgICAgCi0gKiAgICAgICAgIGFubm90YXRpb25OYW1lID0gIklubmVyIgotICogICAgICAgICBjb250YWluZXJBbm5vdGF0aW9uTmFtZSA9ICJPdXRlciIKLSAqICAgICAgICAgZWxlbWVudE5hbWUgPSAiZm9vIgotICogICAgICAgICBpbmRleCA9IDAtMgotICogPC9wcmU+Ci0gKiAKLSAqIFRoaXMgaXMgYSB1c2VmdWwgcGF0dGVybiBiZWNhdXNlIGEgZGVjbGFyYXRpb24gY2Fubm90IGhhdmUgbW9yZQotICogdGhhbiBvbmUgYW5ub3RhdGlvbiBvZiB0aGUgc2FtZSB0eXBlLCBhbmQgYWxsb3dpbmcgdGhlIHN0YW5kLWFsb25lCi0gKiBjb25maWd1cmF0aW9uIHJlZHVjZXMgY2x1dHRlci4KLSAqIDxicj4KLSAqIE5COiBUaGlzIGNvbmZpZ3VyYXRpb24gb25seSBtYWtlcyBzZW5zZSBmb3IgInRvcC1sZXZlbCIgYW5ub3RhdGlvbnMsIGFzCi0gKiBvcHBvc2VkIHRvICJuZXN0ZWQiIGFubm90YXRpb25zLiBUaGlzIGlzIGJlY2F1c2UgYW5ub3RhdGlvbiBlbGVtZW50cwotICogY2FuIG9ubHkgYmUgZGVjbGFyZWQgd2l0aCBhIHR5cGUgb2YgYSBzaW5nbGUgYW5ub3RhdGlvbiBhbmQgYW5ub3RhdGlvbnMKLSAqIGNhbm5vdCBiZSBwYXJ0IG9mIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb25zIGNhbm5vdCAqYm90aCogYmUgc3VwcG9ydGVkOgotICogPHByZT4KLSAqICAgICAmIzY0O0ZvbyhiYXI9JiM2NDtPdXRlciguLi4pKQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogCi0gKiAgICAgJiM2NDtGb28oYmFyPSYjNjQ7SW5uZXIoLi4uKSkgIC8vIG5vdCBhbGxvd2VkCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiA8L3ByZT4KLSAqIAotICogTkI6IEJlaGF2aW9yIGlzIHVuZGVmaW5lZCB3aGVuIGJvdGggdGhlIHN0YW5kLWFsb25lIGFuZCB0aGUgbmVzdGVkCi0gKiBjb25maWd1cmF0aW9ucyBhbm5vdGF0ZSB0aGUgc2FtZSBkZWNsYXJhdGlvbiwgZS5nLgotICogPHByZT4KLSAqICAgICAvLyB1bmRlZmluZWQgYmVoYXZpb3IKLSAqICAgICAmIzY0O0lubmVyKCJ6ZXJvIikKLSAqICAgICAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKSwgJiM2NDtJbm5lcigidHdvIil9KQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JaW1wbGVtZW50cyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotewotCi0JLyoqCi0JICogdGhpcyBhZGFwdGVyIGlzIHVzZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiBpcyAic3RhbmQtYWxvbmUiOgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7SW5uZXIoInplcm8iKQotCSAqIDwvcHJlPgotCSAqIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgaW5kZXggaXMgMCBvciAxCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlcjsKLQotCS8qKgotCSAqIHRoaXMgYWRhcHRlciBpcyB1c2VkIHdoZW4gdGhlIGFubm90YXRpb24gaXMgIm5lc3RlZCI6Ci0JICogPHByZT4KLQkgKiAgICAgJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoInplcm8iKSwgJiM2NDtJbm5lcigib25lIil9KQotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgZmluYWwgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiB0aGlzIGFkYXB0ZXIgaXMgZm9yIHRoZSAibmVzdGVkIiBhbm5vdGF0aW9uIGF0IHRoZSB6ZXJvIGluZGV4OwotCSAqIGFuZCBpcyBvbmx5IHVzZWQgd2hlbiB0aGUgaW5kZXggaXMgMQotCSAqLwotCXByaXZhdGUgZmluYWwgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgemVyb05lc3RlZEFubm90YXRpb25BZGFwdGVyOwotCi0JLy8gcmVkdWNlIE5MUyBjaGVja3MKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgInZhbHVlIgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7SW5uZXIoInplcm8iKQotCSAqICAgICAmIzY0O091dGVyKHsmIzY0O0lubmVyKCJ6ZXJvIiksICYjNjQ7SW5uZXIoIm9uZSIpfSkKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSwgaW50IGluZGV4KSB7Ci0JCXRoaXMoYW5ub3RhdGlvbk5hbWUsIGNvbnRhaW5lckFubm90YXRpb25OYW1lLCBWQUxVRSwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGNvbnRhaW5lckFubm90YXRpb25OYW1lLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCBpbmRleCkgewotCQl0aGlzKG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGFubm90YXRpb25OYW1lKSwgbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpLCBlbGVtZW50TmFtZSwgaW5kZXgsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyAidmFsdWUiCi0JICovCi0JcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlciwgCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNvbnRhaW5lckFubm90YXRpb25BZGFwdGVyLCAKLQkJCWludCBpbmRleCwgCi0JCQlTdHJpbmcgbmVzdGVkQW5ub3RhdGlvbk5hbWUKLQkpIHsKLQkJdGhpcyhzdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIsIGNvbnRhaW5lckFubm90YXRpb25BZGFwdGVyLCBWQUxVRSwgaW5kZXgsIG5lc3RlZEFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLCAKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsIAotCQkJU3RyaW5nIGVsZW1lbnROYW1lLCAKLQkJCWludCBpbmRleCwgCi0JCQlTdHJpbmcgbmVzdGVkQW5ub3RhdGlvbk5hbWUKLQkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIgPSBzdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXI7Ci0JCXRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoY29udGFpbmVyQW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBpbmRleCwgbmVzdGVkQW5ub3RhdGlvbk5hbWUpOwotCQl0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlciA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihjb250YWluZXJBbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIDAsIG5lc3RlZEFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZ2V0SW5kZXgoKSA9PSAwKSB7Ci0JCQkvLyBjaGVjayBmb3IgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24KLQkJCUFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24gPSB0aGlzLmdldFN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCWlmIChzdGFuZEFsb25lQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHN0YW5kQWxvbmVBbm5vdGF0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmdldE5lc3RlZEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogW25vbmVdID0+ICYjNjQ7SW5uZXIKLQkgKiAgICAgb3IKLQkgKiAmIzY0O0lubmVyKCJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7SW5uZXIKLQkgKiAgICAgb3IKLQkgKiAmIzY0O0lubmVyKHRleHQ9ImxvcmVtIGlwc3VtIikgPT4gJiM2NDtJbm5lcgotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyLCAmIzY0O0lubmVyfSkgPT4gJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIsICYjNjQ7SW5uZXIsICYjNjQ7SW5uZXJ9KQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyLCAmIzY0O0lubmVyfSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O0lubmVyID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyLCAmIzY0O0lubmVyfSkKLQkgKiAgICAgZXRjLgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKE1hcmtlckFubm90YXRpb24pIHRoaXMubmV3QW5ub3RhdGlvbihNQVJLRVJfQU5OT1RBVElPTl9GQUNUT1JZLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgdGhpcy5uZXdBbm5vdGF0aW9uKFNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTl9GQUNUT1JZLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIE5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiAoTm9ybWFsQW5ub3RhdGlvbikgdGhpcy5uZXdBbm5vdGF0aW9uKE5PUk1BTF9BTk5PVEFUSU9OX0ZBQ1RPUlksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZ2V0SW5kZXgoKSA9PSAwKSB7Ci0JCQkvLyBjaGVjayBmb3IgdGhlIHN0YW5kLWFsb25lIGFubm90YXRpb24KLQkJCWlmICh0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uSXNQcmVzZW50KGRlY2xhcmF0aW9uKSkgewotCQkJCXRoaXMucmVtb3ZlU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQl0aGlzLnJlbW92ZU5lc3RlZEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAodGhpcy5uZXN0ZWRFbGVtZW50Q2FuQmVDb252ZXJ0ZWRUb1N0YW5kQWxvbmUoZGVjbGFyYXRpb24pKSB7Ci0JCQl0aGlzLmNvbnZlcnRMYXN0RWxlbWVudEFubm90YXRpb25Ub1N0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGFubm90YXRpb24gYWRhcHRlcgotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpbnQgb2xkSW5kZXggPSB0aGlzLmdldEluZGV4KCk7Ci0JCWlmIChuZXdJbmRleCA9PSBvbGRJbmRleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQW5ub3RhdGlvbiBzdGFuZEFsb25lQW5ub3RhdGlvbiA9IHRoaXMuZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlpZiAoc3RhbmRBbG9uZUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJdGhpcy5tb3ZlTmVzdGVkQW5ub3RhdGlvbihuZXdJbmRleCwgZGVjbGFyYXRpb24pOwotCQkJaWYgKHRoaXMubmVzdGVkRWxlbWVudENhbkJlQ29udmVydGVkVG9TdGFuZEFsb25lKGRlY2xhcmF0aW9uKSkgewotCQkJCXRoaXMuY29udmVydExhc3RFbGVtZW50QW5ub3RhdGlvblRvU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChvbGRJbmRleCA9PSAwKSAmJiAobmV3SW5kZXggPT0gMSkpIHsKLQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0d28gc2l0dWF0aW9ucyB3aGVyZSB3ZSB0cmFuc2l0aW9uIGZyb20gc3RhbmQtYWxvbmUgdG8gY29udGFpbmVyCi0JCQkJdGhpcy5tb3ZlU3RhbmRBbG9uZUFubm90YXRpb25Ub0NvbnRhaW5lckFubm90YXRpb24oc3RhbmRBbG9uZUFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJCQl0aGlzLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKG5ld0luZGV4LCBkZWNsYXJhdGlvbik7Ci0JCQl9IGVsc2UgaWYgKG5ld0luZGV4ID09IDApIHsKLQkJCQkvLyB3ZSBhcmUgbW92aW5nIGEgJ251bGwnIGVudHJ5IG9uIHRvcCBvZiB0aGUgc3RhbmQtYWxvbmUsIHNvIHJlbW92ZSBpdAotCQkJCXRoaXMucmVtb3ZlU3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbGQgaW5kZXggPSAiICsgb2xkSW5kZXggKyAiOyBuZXcgaW5kZXggPSAiICsgbmV3SW5kZXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIGJ1aWxkIHRoZSBhcHByb3ByaWF0ZSBuZXcgYW5ub3RhdGlvbiwKLQkgKiB3aGljaCBtYXkgcmVxdWlyZSBtb3ZpbmcgdGhlIDB0aCBhbm5vdGF0aW9uIGZyb20gInN0YW5kLWFsb25lIiB0byAibmVzdGVkIgotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKEFubm90YXRpb25GYWN0b3J5IGFubm90YXRpb25GYWN0b3J5LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmdldEluZGV4KCkgPT0gIDApIHsKLQkJCXJldHVybiB0aGlzLm5ld1plcm9Bbm5vdGF0aW9uKGFubm90YXRpb25GYWN0b3J5LCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJaWYgKHRoaXMuemVyb05lc3RlZEFubm90YXRpb25Jc1ByZXNlbnQoZGVjbGFyYXRpb24pKSB7Ci0JCQkvLyBtYW5pcHVsYXRlIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiAtIGlnbm9yZSB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbig/KQotCQkJLy8gQE91dGVyKGZvbz1ASW5uZXIoInplcm8iKSkgPT4gQE91dGVyKGZvbz17QElubmVyKCJ6ZXJvIiksIEBJbm5lcn0pCi0JCQkvLyAgICAgb3IKLQkJCS8vIEBPdXRlcihmb289e0BJbm5lcigiemVybyIpLCBASW5uZXIoIm9uZSIpfSkgPT4gQE91dGVyKGZvbz17QElubmVyKCJ6ZXJvIiksIEBJbm5lcn0pCi0JCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQotCQkvLyB0aGlzIGlzIG9uZSBvZiB0d28gc2l0dWF0aW9ucyB3aGVyZSB3ZSB0cmFuc2l0aW9uIGZyb20gc3RhbmQtYWxvbmUgdG8gY29udGFpbmVyCi0JCXRoaXMubW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJLy8gb25jZSB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbiBpcyBtb3ZlZCB0byBpbmRleD0wLCBidWlsZCB0aGUgbmV3IGFubm90YXRpb24gYXQgaW5kZXg9MQotCQlyZXR1cm4gYW5ub3RhdGlvbkZhY3RvcnkubmV3QW5ub3RhdGlvbih0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogdGhlIGluZGV4IGlzIDAgLSBidWlsZCB0aGUgYXBwcm9wcmlhdGUgbmV3IGFubm90YXRpb24sCi0JICogd2hpY2ggbWF5IGJlIGVpdGhlciAic3RhbmQtYWxvbmUiIG9yICJuZXN0ZWQiCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIG5ld1plcm9Bbm5vdGF0aW9uKEFubm90YXRpb25GYWN0b3J5IGFubm90YXRpb25GYWN0b3J5LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uSXNQcmVzZW50KGRlY2xhcmF0aW9uKSkgewotCQkJLy8gcmVwbGFjZSB0aGUgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbiAtIGlnbm9yZSB0aGUgY29udGFpbmVyIGFubm90YXRpb24oPykKLQkJCS8vIEBJbm5lcih0ZXh0PSJsb3JlbSBpcHN1bSIpID0+IEBJbm5lcgotCQkJcmV0dXJuIGFubm90YXRpb25GYWN0b3J5Lm5ld0Fubm90YXRpb24odGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIsIGRlY2xhcmF0aW9uKTsKLQkJfQotCQlpZiAodGhpcy5jb250YWluZXJBbm5vdGF0aW9uSXNQcmVzZW50KGRlY2xhcmF0aW9uKSkgewotCQkJLy8gbWFuaXB1bGF0ZSB0aGUgY29udGFpbmVyIGFubm90YXRpb24KLQkJCS8vIEBPdXRlcihmb289QElubmVyKHRleHQ9ImxvcmVtIGlwc3VtIikpID0+IEBPdXRlcihmb289QElubmVyKQotCQkJcmV0dXJuIGFubm90YXRpb25GYWN0b3J5Lm5ld0Fubm90YXRpb24odGhpcy5uZXN0ZWRBbm5vdGF0aW9uQWRhcHRlciwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCS8vIG5laXRoZXIgYW5ub3RhdGlvbiBpcyBwcmVzZW50IC0gYWRkIGEgbmV3IHN0YW5kLWFsb25lIGFubm90YXRpb24KLQkJcmV0dXJuIGFubm90YXRpb25GYWN0b3J5Lm5ld0Fubm90YXRpb24odGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIsIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBtb3ZlIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uIHRvIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBhdCBpbmRleD0wCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vdmVTdGFuZEFsb25lQW5ub3RhdGlvblRvQ29udGFpbmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gc3RhbmRBbG9uZUFubm90YXRpb24gPSB0aGlzLmdldFN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJaWYgKHN0YW5kQWxvbmVBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMubW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uVG9Db250YWluZXJBbm5vdGF0aW9uKHN0YW5kQWxvbmVBbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogbW92ZSB0aGUgc3BlY2lmaWVkLCBub24tbnVsbCwgc3RhbmQtYWxvbmUgYW5ub3RhdGlvbiB0bwotCSAqIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBhdCBpbmRleD0wCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vdmVTdGFuZEFsb25lQW5ub3RhdGlvblRvQ29udGFpbmVyQW5ub3RhdGlvbihBbm5vdGF0aW9uIHN0YW5kQWxvbmVBbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChzdGFuZEFsb25lQW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0gZWxzZSBpZiAoc3RhbmRBbG9uZUFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCUV4cHJlc3Npb24gdnYgPSAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIHN0YW5kQWxvbmVBbm5vdGF0aW9uKS5nZXRWYWx1ZSgpOwotCQkJdnYgPSAoRXhwcmVzc2lvbikgQVNUTm9kZS5jb3B5U3VidHJlZSh2di5nZXRBU1QoKSwgdnYpOwotCQkJdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodnYpOwotCQl9IGVsc2UgaWYgKHN0YW5kQWxvbmVBbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlOb3JtYWxBbm5vdGF0aW9uIG5ld05BID0gdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMobmV3TkEpOwotCQkJZm9yIChNZW1iZXJWYWx1ZVBhaXIgcGFpciA6IHRoaXMudmFsdWVzKChOb3JtYWxBbm5vdGF0aW9uKSBzdGFuZEFsb25lQW5ub3RhdGlvbikpIHsKLQkJCQl2YWx1ZXMuYWRkKChNZW1iZXJWYWx1ZVBhaXIpIEFTVE5vZGUuY29weVN1YnRyZWUocGFpci5nZXRBU1QoKSwgcGFpcikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBzdGFuZEFsb25lQW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnJlbW92ZVN0YW5kQWxvbmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gd2hldGhlciB0aGUgIm5lc3RlZCIgYW5ub3RhdGlvbiBjb250YWluZXIgaGFzIGJlZW4gcmVkdWNlZCB0bwotCSAqIGEgc2luZ2xlIGVsZW1lbnQgKGFuZCB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIgaXMgY29udmVydGVkIHRvIGp1c3QKLQkgKiB0aGUgc2luZ2xlIHJlbWFpbmluZyBlbGVtZW50KSBhbmQgY2FuIGJlIGZ1cnRoZXIgY29udmVydGVkIHRvIHRoZQotCSAqICJzdGFuZC1hbG9uZSIgYW5ub3RhdGlvbjoKLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKX0pID0+Ci0JICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIoInplcm8iKSkgPT4KLQkgKiAgICAgJiM2NDtJbm5lcigiemVybyIpCi0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSBib29sZWFuIG5lc3RlZEVsZW1lbnRDYW5CZUNvbnZlcnRlZFRvU3RhbmRBbG9uZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUFubm90YXRpb24gY29udGFpbmVyQW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChjb250YWluZXJBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY29udGFpbmVyQW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjb250YWluZXJBbm5vdGF0aW9uLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKSB7Ci0JCQlpZiAodGhpcy5nZXRFbGVtZW50TmFtZSgpLmVxdWFscyhWQUxVRSkpIHsKLQkJCQlyZXR1cm4gKCgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgY29udGFpbmVyQW5ub3RhdGlvbikuZ2V0VmFsdWUoKS5nZXROb2RlVHlwZSgpICE9IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpCi0JCQkJCQkmJiAodGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbikgIT0gbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNvbnRhaW5lckFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCU5vcm1hbEFubm90YXRpb24gbmEgPSAoTm9ybWFsQW5ub3RhdGlvbikgY29udGFpbmVyQW5ub3RhdGlvbjsKLQkJCWlmIChuYS52YWx1ZXMoKS5zaXplKCkgPT0gMCkgewotCQkJCXJldHVybiBmYWxzZTsgIC8vIHRoZXJlIGFyZSBubyBlbGVtZW50cyBwcmVzZW50Ci0JCQl9Ci0JCQlpZiAobmEudmFsdWVzKCkuc2l6ZSgpICE9IDEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGVyZSBhcmUgb3RoZXIgZWxlbWVudHMgcHJlc2VudCAtIGxlYXZlIHRoZW0gYWxsIGFsb25lCi0JCQl9Ci0JCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IChNZW1iZXJWYWx1ZVBhaXIpIG5hLnZhbHVlcygpLmdldCgwKTsKLQkJCWlmICh0aGlzLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgewotCQkJCXJldHVybiAocGFpci5nZXRWYWx1ZSgpLmdldE5vZGVUeXBlKCkgIT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikKLQkJCQkJCSYmICh0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSAhPSBudWxsKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGNvbnRhaW5lckFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogbW92ZSB0aGUgYW5ub3RhdGlvbiBpbiB0aGUgY29udGFpbmVyIGFubm90YXRpb24gYXQgaW5kZXg9MAotCSAqIHRvIHRoZSBzdGFuZC1hbG9uZSBhbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnZlcnRMYXN0RWxlbWVudEFubm90YXRpb25Ub1N0YW5kQWxvbmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJQW5ub3RhdGlvbiBsYXN0ID0gdGhpcy56ZXJvTmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChsYXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRoZSBsYXN0IG5lc3RlZCBhbm5vdGF0aW9uIGlzIG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgaWYgKGxhc3QuaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMubmV3U3RhbmRBbG9uZU1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9IGVsc2UgaWYgKGxhc3QuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCUV4cHJlc3Npb24gdnYgPSAoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGxhc3QpLmdldFZhbHVlKCk7Ci0JCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCQl0aGlzLm5ld1N0YW5kQWxvbmVTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKS5zZXRWYWx1ZSh2dik7Ci0JCX0gZWxzZSBpZiAobGFzdC5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJTm9ybWFsQW5ub3RhdGlvbiBuZXdOQSA9IHRoaXMubmV3U3RhbmRBbG9uZU5vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKG5ld05BKTsKLQkJCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLnZhbHVlcygoTm9ybWFsQW5ub3RhdGlvbikgbGFzdCkpIHsKLQkJCQl2YWx1ZXMuYWRkKChNZW1iZXJWYWx1ZVBhaXIpIEFTVE5vZGUuY29weVN1YnRyZWUocGFpci5nZXRBU1QoKSwgcGFpcikpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBsYXN0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucmVtb3ZlQ29udGFpbmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0YW5kQWxvbmVBbm5vdGF0aW9uSXNQcmVzZW50KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3RhbmRBbG9uZUFubm90YXRpb24oZGVjbGFyYXRpb24pICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGdldFN0YW5kQWxvbmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgTWFya2VyQW5ub3RhdGlvbiBuZXdTdGFuZEFsb25lTWFya2VyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnN0YW5kQWxvbmVBbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U3RhbmRBbG9uZVNpbmdsZU1lbWJlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5zdGFuZEFsb25lQW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBOb3JtYWxBbm5vdGF0aW9uIG5ld1N0YW5kQWxvbmVOb3JtYWxBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVTdGFuZEFsb25lQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuc3RhbmRBbG9uZUFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbiBnZXROZXN0ZWRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vdmVOZXN0ZWRBbm5vdGF0aW9uKGludCBuZXdJbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4LCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5lc3RlZEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb250YWluZXJBbm5vdGF0aW9uSXNQcmVzZW50KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb24gZ2V0Q29udGFpbmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLm5lc3RlZEFubm90YXRpb25BZGFwdGVyLmdldE91dGVyQW5ub3RhdGlvbkFkYXB0ZXIoKS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29udGFpbmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0T3V0ZXJBbm5vdGF0aW9uQWRhcHRlcigpLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB6ZXJvTmVzdGVkQW5ub3RhdGlvbklzUHJlc2VudChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldFplcm9OZXN0ZWRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbiBnZXRaZXJvTmVzdGVkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnplcm9OZXN0ZWRBbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmVzdGVkQW5ub3RhdGlvbkFkYXB0ZXIuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyhOb3JtYWxBbm5vdGF0aW9uIG5hKSB7Ci0JCXJldHVybiBuYS52YWx1ZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiBmYWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogZGVmaW5lIGludGVyZmFjZSB0aGF0IGFsbG93cyB1cyB0byAicmUtdXNlIiB0aGUgbmFzdHkgY29kZSBpbgotCSAqICNuZXdBbm5vdGF0aW9uKEFubm90YXRpb25GYWN0b3J5LCBNb2RpZmllZERlY2xhcmF0aW9uKQotCSAqLwotCXByaXZhdGUgaW50ZXJmYWNlIEFubm90YXRpb25GYWN0b3J5IHsKLQkJQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkZhY3RvcnkgTUFSS0VSX0FOTk9UQVRJT05fRkFDVE9SWSA9IG5ldyBBbm5vdGF0aW9uRmFjdG9yeSgpIHsKLQkJcHVibGljIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiBhZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNYXJrZXJBbm5vdGF0aW9uRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRmFjdG9yeSBTSU5HTEVfTUVNQkVSX0FOTk9UQVRJT05fRkFDVE9SWSA9IG5ldyBBbm5vdGF0aW9uRmFjdG9yeSgpIHsKLQkJcHVibGljIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFkYXB0ZXIsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiBhZGFwdGVyLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRmFjdG9yeSBOT1JNQUxfQU5OT1RBVElPTl9GQUNUT1JZID0gbmV3IEFubm90YXRpb25GYWN0b3J5KCkgewotCQlwdWJsaWMgQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYWRhcHRlciwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJcmV0dXJuIGFkYXB0ZXIubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk5vcm1hbEFubm90YXRpb25GYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NWY1Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhIGRlY2xhcmF0aW9uIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyIHRoYXQgZGVhbHMgd2l0aCBBU1QKLSAqIGV4cHJlc3Npb25zLCBjb252ZXJ0aW5nIHRoZW0gdG8vZnJvbSB2YXJpb3VzIG90aGVyIG9iamVjdHMuCi0gKiAKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZSBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHRoZSBhZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlpbXBsZW1lbnRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci17Ci0JLyoqCi0JICogVGhlIHdyYXBwZWQgYWRhcHRlciB0aGF0IHJldHVybnMgYW5kIHRha2VzIEFTVCBleHByZXNzaW9ucy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+IGFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgY29udmVydGVyIHRoYXQgY29udmVydHMgQVNUIGV4cHJlc3Npb25zIHRvIG90aGVyIG9iamVjdHMKLQkgKiAoZS5nLiBTdHJpbmdzKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4gY29udmVydGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKLQkJdGhpcyhuZXcgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+KGFubm90YXRpb25BZGFwdGVyKSwgY29udmVydGVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKLQkJdGhpcyhuZXcgRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEV4cHJlc3Npb24+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSksIGNvbnZlcnRlcik7Ci0JfQotCi0JcHVibGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFeHByZXNzaW9uPiBhZGFwdGVyLCBFeHByZXNzaW9uQ29udmVydGVyPFQ+IGNvbnZlcnRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoZGVjbGFyYXRpb24pOwotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuY29udmVydChleHByZXNzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbjsKLQkJdHJ5IHsKLQkJCWV4cHJlc3Npb24gPSB0aGlzLmNvbnZlcnRlci5jb252ZXJ0KHZhbHVlLCBkZWNsYXJhdGlvbi5nZXRBc3QoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWYgdGhlcmUgaXMgYSBwcm9ibGVtIGNvbnZlcnRpbmcgdGhlICd2YWx1ZScgdG8gYW4gRXhwcmVzc2lvbiB3ZSBnZXQgdGhpcyBleGNlcHRpb24KLQkJCXJldHVybjsgIC8vIGRvbid0IHNldCB0aGUgdmFsdWUgaWYgaXQgaXMgImlsbGVnYWwiCi0JCX0KLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKGV4cHJlc3Npb24sIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5IHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT47Ci0JICogdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBzdHJpbmcgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JTdHJpbmdzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIHN0cmluZyBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZvclN0cmluZ3MoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT47Ci0JICogdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBudW1iZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZm9yTnVtYmVycyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGFubm90YXRpb25BZGFwdGVyLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHByZXNzaW9uIGNvbnZlcnRlciBleHBlY3RzIG51bWJlciBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBmb3JOdW1iZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT47Ci0JICogdGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBib29sZWFuIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGZvckJvb2xlYW5zKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgYm9vbGVhbiBjb25zdGFudCBleHByZXNzaW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBmb3JCb29sZWFucyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+OwotCSAqIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gY29udmVydGVyIGV4cGVjdHMgY2hhcmFjdGVyIGNvbnN0YW50IGV4cHJlc3Npb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZm9yQ2hhcmFjdGVycyhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIENoYXJhY3RlclN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXhwcmVzc2lvbiBjb252ZXJ0ZXIgZXhwZWN0cyBjaGFyYWN0ZXIgY29uc3RhbnQgZXhwcmVzc2lvbnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBmb3JDaGFyYWN0ZXJzKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQ2hhcmFjdGVyU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9EZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI2NGE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBjbGVhbiB1cCBzb21lIG9mIHRoZSBuYXN0eSBFY2xpcHNlIGFubm90YXRpb24KLSAqIGZvcm1hdHRpbmcgKG9yIGxhY2sgdGhlcmVvZik7IGUuZy4gYXJyYXlzIG9mIGFubm90YXRpb25zLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2MsIFRleHRFZGl0IGVkaXRUcmVlKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlUZXh0RWRpdFtdIGVkaXRzID0gZWRpdFRyZWUuZ2V0Q2hpbGRyZW4oKTsKLQkJaW50IGxlbiA9IGVkaXRzLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlNdWx0aVRleHRFZGl0IGV4dHJhRWRpdHMgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlUZXh0RWRpdCBlZGl0MSA9IGVkaXRzW2ldOwotCQkJaWYgKCAhIChlZGl0MSBpbnN0YW5jZW9mIEluc2VydEVkaXQpKSB7Ci0JCQkJY29udGludWU7ICAvLyBpZiB0aGUgZWRpdCBpcyBub3QgYW4gaW5zZXJ0LCBza2lwIHRvIHRoZSBuZXh0IGVkaXQKLQkJCX0KLQkJCUluc2VydEVkaXQgaW5zZXJ0MSA9IChJbnNlcnRFZGl0KSBlZGl0MTsKLQkJCWludCBqID0gaSArIDE7Ci0JCQlpZiAoaiA8IGxlbikgewotCQkJCVRleHRFZGl0IGVkaXQyID0gZWRpdHNbal07Ci0JCQkJaWYgKGVkaXQyIGluc3RhbmNlb2YgSW5zZXJ0RWRpdCkgewotCQkJCQlJbnNlcnRFZGl0IGluc2VydDIgPSAoSW5zZXJ0RWRpdCkgZWRpdDI7Ci0JCQkJCVN0cmluZyB0ZXh0MSA9IGluc2VydDEuZ2V0VGV4dCgpOwotCQkJCQlTdHJpbmcgdGV4dDIgPSBpbnNlcnQyLmdldFRleHQoKTsKLQkJCQkJaW50IG9mZnNldDEgPSBpbnNlcnQxLmdldE9mZnNldCgpOwotCQkJCQlpbnQgb2Zmc2V0MiA9IGluc2VydDIuZ2V0T2Zmc2V0KCk7Ci0JCQkJCWlmICh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbih0ZXh0MSkgJiYgdGV4dDIuZXF1YWxzKCIgIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gYW4gYW5ub3RhdGlvbiB3YXMgaW5zZXJ0ZWQgYmVmb3JlIHNvbWV0aGluZyBvbiB0aGUgc2FtZSBsaW5lOwotCQkJCQkJLy8gcmVwbGFjZSB0aGUgdHJhaWxpbmcgc3BhY2Ugd2l0aCBhIG5ld2xpbmUgYW5kIGFwcHJvcHJpYXRlIGluZGVudAotCQkJCQkJZXh0cmFFZGl0cy5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQob2Zmc2V0MiwgMSwgdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0MikpKTsKLQkJCQkJCWkrKzsgIC8vIGp1bXAgdGhlIGluZGV4IHBhc3QgJ2VkaXQyJwotCQkJCQkJY29udGludWU7ICAvLyBnbyB0byB0aGUgbmV4dCBlZGl0Ci0JCQkJCX0KLQkJCQkJaW50IGNvbW1hMUxlbmd0aCA9IHRoaXMuY29tbWFMZW5ndGgodGV4dDEpOwotCQkJCQlpZiAoKGNvbW1hMUxlbmd0aCAhPSAwKSAmJiB0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbih0ZXh0MikpIHsKLQkJCQkJCS8vIGFuIGFubm90YXRpb24gd2FzIGluc2VydGVkIGluIGFuIGFycmF5IGluaXRpYWxpemVyIG9uIHRoZQotCQkJCQkJLy8gc2FtZSBsaW5lIGFzIHRoZSBwcmV2aW91cyBhcnJheSBlbGVtZW50OwotCQkJCQkJLy8gcmVwbGFjZSB0aGUgcHJlY2VkaW5nIHNwYWNlIHdpdGggYSBuZXdsaW5lIGFuZCBhcHByb3ByaWF0ZSBpbmRlbnQKLQkJCQkJCWV4dHJhRWRpdHMuYWRkQ2hpbGQobmV3IFJlcGxhY2VFZGl0KG9mZnNldDEgKyBjb21tYTFMZW5ndGgsIHRleHQxLmxlbmd0aCgpIC0gY29tbWExTGVuZ3RoLCB0aGlzLmJ1aWxkQ1IoZG9jLCBvZmZzZXQxKSkpOwotCQkJCQkJaSsrOyAgLy8ganVtcCB0aGUgaW5kZXggcGFzdCAnZWRpdDInCi0JCQkJCQljb250aW51ZTsgIC8vIGdvIHRvIHRoZSBuZXh0IGVkaXQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRoaXMuZm9ybWF0QXJyYXlJbml0aWFsaXplcihkb2MsIGluc2VydDEsIGV4dHJhRWRpdHMpOwotCQl9Ci0JCWV4dHJhRWRpdHMuYXBwbHkoZG9jLCBUZXh0RWRpdC5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgaW5zZXJ0IGVkaXQgaXMgaW5zZXJ0aW5nIGFuIGFubm90YXRpb24gY29udGFpbmluZyBhbiBhcnJheSBvZiBhbm5vdGF0aW9ucyBhcwotCSAqIGl0cyB2YWx1ZSB0aGVuIGZvcm1hdCB0aGVtIG5pY2VseS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0QXJyYXlJbml0aWFsaXplcihJRG9jdW1lbnQgZG9jLCBJbnNlcnRFZGl0IGluc2VydEVkaXQsIE11bHRpVGV4dEVkaXQgZXh0cmFFZGl0cykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHMgPSBpbnNlcnRFZGl0LmdldFRleHQoKTsKLQkJaWYgKCAhIHRoaXMuc3RyaW5nSXNBbm5vdGF0aW9uKHMpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWludCBwb3MgPSAxOyAgLy8gc2tpcCAnQCcKLQkJd2hpbGUgKHBvcyA8IGxlbikgewotCQkJY2hhciBjID0gcy5jaGFyQXQocG9zKTsKLQkJCXBvcysrOyAgLy8gYnVtcCB0byBqdXN0IHBhc3QgZmlyc3QgJygnCi0JCQlpZiAoYyA9PSAnKCcpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAocG9zID09IGxlbikgewotCQkJcmV0dXJuOyAgLy8gcmVhY2hlZCBlbmQgb2Ygc3RyaW5nCi0JCX0KLQkJd2hpbGUgKHBvcyA8IGxlbikgewotCQkJY2hhciBjID0gcy5jaGFyQXQocG9zKTsKLQkJCXBvcysrOyAgLy8gYnVtcCB0byBqdXN0IHBhc3QgZmlyc3QgJ3snCi0JCQlpZiAoYyA9PSAneycpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChjICE9ICcgJykgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAocG9zID09IGxlbikgewotCQkJcmV0dXJuOyAgLy8gcmVhY2hlZCBlbmQgb2Ygc3RyaW5nCi0JCX0KLQkJLy8gbm93IGxvb2sgZm9yICdAJyBub3QgaW5zaWRlIHBhcmVudGhlc2VzIGFuZCBwdXQgaW4gCi0JCS8vIGxpbmUgZGVsaW1ldGVyIGFuZCBpbmRlbnQgc3RyaW5nIGJlZm9yZSBlYWNoCi0JCWludCBvZmZzZXQgPSBpbnNlcnRFZGl0LmdldE9mZnNldCgpOwotCQlTdHJpbmcgaW5kZW50ID0gbnVsbDsKLQkJaW50IHBhcmVuRGVwdGggPSAwOwotCQl3aGlsZSAocG9zIDwgbGVuKSB7Ci0JCQlzd2l0Y2ggKHMuY2hhckF0KHBvcykpIHsKLQkJCQljYXNlICcoJyA6Ci0JCQkJCXBhcmVuRGVwdGgrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnKScgOgotCQkJCQlwYXJlbkRlcHRoLS07Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ0AnIDoKLQkJCQkJaWYgKHBhcmVuRGVwdGggPT0gMCkgewotCQkJCQkJaWYgKGluZGVudCA9PSBudWxsKSB7Ci0JCQkJCQkJaW5kZW50ID0gdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0LCAiXHQiKTsgIC8vIFRPRE8gdXNlIHRhYiBwcmVmZXJlbmNlPyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlleHRyYUVkaXRzLmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KG9mZnNldCArIHBvcywgaW5kZW50KSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnfScgOgotCQkJCQlpZiAocGFyZW5EZXB0aCA9PSAwKSB7Ci0JCQkJCQlleHRyYUVkaXRzLmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KG9mZnNldCArIHBvcywgdGhpcy5idWlsZENSKGRvYywgb2Zmc2V0KSkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcG9zKys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIHN0cmluZyBjb250YWluaW5nIGEgbGluZSBkZWxpbWV0ZXIgYW5kIGluZGVudGluZyBjaGFyYWN0ZXJzIAotCSAqIG1hdGNoaW5nIHRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIG9mZnNldAotCSAqIChpLmUuIHRoZSBuZXcgbGluZSdzIGluZGVudCBtYXRjaGVzIHRoZSBjdXJyZW50IGxpbmUpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ1IoSURvY3VtZW50IGRvYywgaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDUihkb2MsIG9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDUihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBTdHJpbmcgc3VmZml4KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChkb2MuZ2V0TGluZURlbGltaXRlcihsaW5lKSk7ICAvLyB1c2Ugc2FtZSBDUiBhcyBjdXJyZW50IGxpbmUKLQotCQlpbnQgbyA9IGRvYy5nZXRMaW5lT2Zmc2V0KGxpbmUpOyAgLy8gbWF0Y2ggdGhlIHdoaXRlc3BhY2Ugb2YgdGhlIGN1cnJlbnQgbGluZQotCQljaGFyIGMgPSBkb2MuZ2V0Q2hhcihvKyspOwotCQl3aGlsZSAoKGMgPT0gJyAnKSB8fCAoYyA9PSAnXHQnKSkgewotCQkJc2IuYXBwZW5kKGMpOwotCQkJYyA9IGRvYy5nZXRDaGFyKG8rKyk7Ci0JCX0KLQkJc2IuYXBwZW5kKHN1ZmZpeCk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGFuIGFubm90YXRpb24uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHN0cmluZ0lzQW5ub3RhdGlvbihTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCgpID4gMSkgJiYgc3RyaW5nLmNoYXJBdCgwKSA9PSAnQCc7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYSBzaW5nbGUgY29tbWEsIHBvc3NpYmx5IHN1cnJvdW5kZWQgYnkKLQkgKiBzcGFjZXMsIHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgY29udGFpbmluZyB0aGUKLQkgKiBpbml0aWFsIHNwYWNlcyBhbmQgdGhlIGNvbW1hLgotCSAqLwotCXByaXZhdGUgaW50IGNvbW1hTGVuZ3RoKFN0cmluZyBzdHJpbmcpIHsKLQkJYm9vbGVhbiBjb21tYSA9IGZhbHNlOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpbnQgcmVzdWx0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJc3dpdGNoIChzdHJpbmcuY2hhckF0KGkpKSB7Ci0JCQkJY2FzZSAnICcgOgotCQkJCQlpZiAoICEgY29tbWEpIHsKLQkJCQkJCXJlc3VsdCsrOyAgLy8gc3BhY2UgcHJlY2VkaW5nIGNvbW1hCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnLCcgOgotCQkJCQlpZiAoY29tbWEpIHsKLQkJCQkJCXJldHVybiAwOyAgLy8gc2Vjb25kIGNvbW1hIQotCQkJCQl9Ci0JCQkJCWNvbW1hID0gdHJ1ZTsKLQkJCQkJcmVzdWx0Kys7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiAwOyAgLy8gbm9uLWNvbW1hLCBub24tc3BhY2UgY2hhcgotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRBbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2YxNGE0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRBbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLQotLyoqCi0gKiBBZGFwdCBhbiBhbm5vdGF0ZWQgZWxlbWVudCBhbmQgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25BZGFwdGVyIHsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIoYW5ub3RhdGVkRWxlbWVudCwgZGFhKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlMzQ2Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBZGFwdCBhbiBhbm5vdGF0ZWQgZWxlbWVudCBhbmQgYW4gaW5kZXhlZCBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGFkYXB0ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEFubm90YXRpb25BZGFwdGVyCi0JaW1wbGVtZW50cyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQlwcml2YXRlIGZpbmFsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXN1cGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCQl0aGlzLmlkYWEgPSBpZGFhOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaWRhYS5nZXRJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQl0aGlzLmVkaXQodGhpcy5idWlsZE1vdmVBbm5vdGF0aW9uRWRpdG9yKG5ld0luZGV4KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQW5ub3RhdGVkRWxlbWVudC5FZGl0b3IgYnVpbGRNb3ZlQW5ub3RhdGlvbkVkaXRvcihpbnQgbmV3SW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBNb3ZlQW5ub3RhdGlvbkVkaXRvcih0aGlzLmlkYWEsIG5ld0luZGV4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBNb3ZlQW5ub3RhdGlvbkVkaXRvciBpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQuRWRpdG9yIHsKLQkJcHJpdmF0ZSBmaW5hbCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhOwotCQlwcml2YXRlIGludCBpbmRleDsKLQotCQlNb3ZlQW5ub3RhdGlvbkVkaXRvcihJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmlkYWEgPSBpZGFhOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJdGhpcy5pZGFhLm1vdmVBbm5vdGF0aW9uKHRoaXMuaW5kZXgsIGRlY2xhcmF0aW9uKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzYTc0Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGEgZGVjbGFyYXRpb24gYW5ub3RhdGlvbiBlbGVtZW50IGFkYXB0ZXIgYW5kIHNpbXBseQotICogYWRkIGFuIGltcG9ydCBmb3IgdGhlIGVudW1zIHdoZW4gbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIKLQlpbXBsZW1lbnRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPgotewotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGFkYXB0ZXIgdGhhdCByZXR1cm5zIGFuZCB0YWtlcyBuYW1lIHN0cmluZ3MgKGVudW1zKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIGFycmF5IGluaXRpYWxpemVyIGlmIGl0IGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byByZW1vdmUgdGhlIGFycmF5IGluaXRpYWxpemVyIGlmIGl0IGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcyhhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgewotCQl0aGlzKG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgYnVpbGRFeHByZXNzaW9uQ29udmVydGVyKHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHkpKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gYnVpbGRFeHByZXNzaW9uQ29udmVydGVyKGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSwgcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZ25vcmUgdGhlIGFkYXB0ZXIncyBnZXRWYWx1ZSgpIC0gd2Ugd2FudCB0aGUgZXhwcmVzc2lvbgotCQlyZXR1cm4gdGhpcy5yZXNvbHZlKHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKSwgZGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZ1tdIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuYWRhcHRlci5zZXRWYWx1ZSh0aGlzLmNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lcyh2YWx1ZSwgZGVjbGFyYXRpb24pLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0QXN0Tm9kZShkZWNsYXJhdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogcmVzb2x2ZSB0aGUgZW51bXMsIHdoaWNoIGNhbiBiZQotCSAqICAgICBudWxsCi0JICogb3IKLQkgKiAgICAge0ZPTywgQkFSLCBCQVp9Ci0JICogb3IKLQkgKiAgICAgRk9PCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIHJlc29sdmUoRXhwcmVzc2lvbiBleHByZXNzaW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkdfQVJSQVk7Ci0JCX0gZWxzZSBpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCXJldHVybiB0aGlzLnJlc29sdmVBcnJheSgoQXJyYXlJbml0aWFsaXplcikgZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24pOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZVNpbmdsZUVsZW1lbnQoZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIHJlc29sdmVBcnJheShBcnJheUluaXRpYWxpemVyIGFpLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhaSk7Ci0JCWludCBsZW4gPSBleHByZXNzaW9ucy5zaXplKCk7Ci0JCVN0cmluZ1tdIGVudW1zID0gbmV3IFN0cmluZ1tsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWVudW1zW2ldID0gdGhpcy5yZXNvbHZlRW51bShleHByZXNzaW9ucy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBlbnVtczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gcmVzb2x2ZVNpbmdsZUVsZW1lbnQoRXhwcmVzc2lvbiBlbnVtRXhwcmVzc2lvbiwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7dGhpcy5yZXNvbHZlRW51bShlbnVtRXhwcmVzc2lvbil9OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUVudW0oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRW51bShleHByZXNzaW9uKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2Qgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMoQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyKSB7Ci0JCXJldHVybiBhcnJheUluaXRpYWxpemVyLmV4cHJlc3Npb25zKCk7Ci0JfQotCi0JLyoqCi0JICogY29udmVydCB0aGUgZnVsbHktcXVhbGlmaWVkIGVudW1zIHRvIG5hbWVzIHRoYXQgY2FuIGJlIGluc2VydGVkIGluIHNvdXJjZSBjb2RlCi0JICogTkI6IGltcG9ydHMgbWF5IGJlIGFkZGVkIGFzIGEgc2lkZS1lZmZlY3QgOi0oCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lcyhTdHJpbmdbXSBlbnVtcywgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAoZW51bXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxlbiA9IGVudW1zLmxlbmd0aDsKLQkJU3RyaW5nW10gc291cmNlQ29kZU5hbWVzID0gbmV3IFN0cmluZ1tsZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlzb3VyY2VDb2RlTmFtZXNbaV0gPSB0aGlzLmNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKGVudW1zW2ldLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIHNvdXJjZUNvZGVOYW1lczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKFN0cmluZyBlbnVtXywgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKGVudW1fLCBkZWNsYXJhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWNiZTI5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0VudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFdyYXAgYSBkZWNsYXJhdGlvbiBhbm5vdGF0aW9uIGVsZW1lbnQgYWRhcHRlciBhbmQgc2ltcGx5Ci0gKiBhZGQgYW4gaW1wb3J0IGZvciB0aGUgZW51bSB3aGVuIG5lY2Vzc2FyeS4KLSAqLwotcHVibGljIGNsYXNzIEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcgotCWltcGxlbWVudHMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPgotewotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGFkYXB0ZXIgdGhhdCByZXR1cm5zIGFuZCB0YWtlcyBuYW1lIHN0cmluZ3MgKGVudW1zKS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGVsZW1lbnQgbmFtZSBpcyA8Y29kZT52YWx1ZTwvY29kZT4uCi0JICovCi0JcHVibGljIEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXRoaXMoYW5ub3RhdGlvbkFkYXB0ZXIsIFZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQl0aGlzKG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnJlc29sdmUodGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oZGVjbGFyYXRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5hZGFwdGVyLnNldFZhbHVlKGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lKHZhbHVlLCBkZWNsYXJhdGlvbiksIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRBc3ROb2RlKGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiByZXNvbHZlIHRoZSBlbnVtCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gQVNUVG9vbHMucmVzb2x2ZUVudW0oZXhwcmVzc2lvbik7Ci0JfQotCi0JLyoqCi0JICogY29udmVydCB0aGUgZnVsbHktcXVhbGlmaWVkIGVudW0gY29uc3RhbnQgdG8gYSBzdGF0aWMgaW1wb3J0IGFuZCB0aGUgY29uc3RhbnQncyBzaG9ydCBuYW1lLCBlLmcuCi0JICogICAgIHN0YXRpYyBpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRmV0Y2hUeXBlLkVBR0VSOwotCSAqICAgICByZXR1cm4gIkVBR0VSIgotCSAqIGlmIHRoYXQgZG9lc24ndCB3b3JrLCBjb252ZXJ0IHRvIGEgbm9ybWFsIGltcG9ydCBhbmQgdGhlIGNvbnN0YW50J3MgcGFydGlhbGx5LXF1YWxpZmllZCBuYW1lLCBlLmcuCi0JICogICAgIGltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGU7Ci0JICogICAgIHJldHVybiAiRmV0Y2hUeXBlLkVBR0VSIgotCSAqIGlmIHRoYXQgZG9lc24ndCB3b3JrLCBzaW1wbHkgcmV0dXJuIHRoZSBjb25zdGFudCdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCBlLmcuCi0JICogICAgIHJldHVybiAiamF2YXgucGVyc2lzdGVuY2UuRmV0Y2hUeXBlLkVBR0VSIgotCSAqIE5COiBhbiBpbXBvcnQgbWF5IGJlIGFkZGVkIGFzIGEgc2lkZS1lZmZlY3QgOi0oCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU291cmNlQ29kZU5hbWUoU3RyaW5nIGVudW1Db25zdGFudE5hbWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIChlbnVtQ29uc3RhbnROYW1lID09IG51bGwpID8gbnVsbCA6IGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lXyhlbnVtQ29uc3RhbnROYW1lLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogZW51bSBjb25zdGFudCBuYW1lIGlzIG5vbi1udWxsOwotCSAqIGNvbnZlcnQgaXQgdG8gaXRzIHNob3J0IHZlcnNpb24gaWYgd2UgY2FuIGFkZCBhIHN0YXRpYyBpbXBvcnQgZXRjLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1NvdXJjZUNvZGVOYW1lXyhTdHJpbmcgZW51bUNvbnN0YW50TmFtZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAoZGVjbGFyYXRpb24uYWRkU3RhdGljSW1wb3J0KGVudW1Db25zdGFudE5hbWUpKSB7Ci0JCQlyZXR1cm4gY29udmVydFRvU2hvcnROYW1lKGVudW1Db25zdGFudE5hbWUpOwotCQl9Ci0JCWlmIChkZWNsYXJhdGlvbi5hZGRJbXBvcnQoY29udmVydFRvVHlwZU5hbWUoZW51bUNvbnN0YW50TmFtZSkpKSB7Ci0JCQlyZXR1cm4gY29udmVydFRvUGFydGlhbGx5UXVhbGlmaWVkTmFtZShlbnVtQ29uc3RhbnROYW1lKTsKLQkJfQotCQlyZXR1cm4gZW51bUNvbnN0YW50TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9TaG9ydE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1R5cGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxhc3RJbmRleE9mKCcuJykpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1BhcnRpYWxseVF1YWxpZmllZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nLCBuYW1lLmxhc3RJbmRleE9mKCcuJykgLSAxKSArIDEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRXhwcmVzc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNiMDM3MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9FeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBNb3N0IG9idmlvdXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVyZmFjZS4KLSAqIEFzc3VtZSB0aGUgZWxlbWVudCdzIHZhbHVlIGlzIGFuIEV4cHJlc3Npb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8RSBleHRlbmRzIEV4cHJlc3Npb24+Ci0JaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxFPgotewotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCB0byBtYW5pcHVsYXRlIHRoZSBlbGVtZW50J3MgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgcmVsZXZhbnQgYW5ub3RhdGlvbiBlbGVtZW50LgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBFeHByZXNzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQl0aGlzKGFubm90YXRpb25BZGFwdGVyLCBWQUxVRSk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlciA9IGFubm90YXRpb25BZGFwdGVyOwotCQl0aGlzLmVsZW1lbnROYW1lID0gZWxlbWVudE5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBFIGdldFZhbHVlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gcmV0dXJuIHRoZSBleHByZXNzaW9uIHVubW9kaWZpZWQKLQkJcmV0dXJuIHRoaXMuZ2V0RXhwcmVzc2lvbihkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRSB2YWx1ZSwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLnNldFZhbHVlKHZhbHVlLCB0aGlzLmFubm90YXRpb25BZGFwdGVyLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pLCBkZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIEUgZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmV4cHJlc3Npb24odGhpcy5hbm5vdGF0aW9uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCUV4cHJlc3Npb24gZXhwID0gdGhpcy5nZXRFeHByZXNzaW9uKGRlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIChleHAgIT0gbnVsbCkgPyBleHAgOiB0aGlzLmFubm90YXRpb25BZGFwdGVyLmdldEFzdE5vZGUoZGVjbGFyYXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZWxlbWVudE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICogKEFuIGVsZW1lbnQgbmFtZSBvZiAidmFsdWUiIHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZQotCSAqIG1lbWJlciBhbm5vdGF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgRSBleHByZXNzaW9uKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uTm9Bbm5vdGF0aW9uKCk7Ci0JCX0KLQkJaWYgKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmV4cHJlc3Npb25NYXJrZXJBbm5vdGF0aW9uKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuZXhwcmVzc2lvblNpbmdsZU1lbWJlckFubm90YXRpb24oKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24pOwotCQl9Ci0JCWlmIChhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQlyZXR1cm4gdGhpcy5leHByZXNzaW9uTm9ybWFsQW5ub3RhdGlvbigoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBhbm5vdGF0aW9uIHR5cGU6ICIgKyBhbm5vdGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBFIGV4cHJlc3Npb25Ob0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwcmVzc2lvbiB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBhbm5vdGF0aW9uIGhhcyBubyBzdWNoIGVsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIEUgZXhwcmVzc2lvbk1hcmtlckFubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFIGV4cHJlc3Npb25TaW5nbGVNZW1iZXJBbm5vdGF0aW9uKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5kb3duY2FzdCh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkgPyBhbm5vdGF0aW9uLmdldFZhbHVlKCkgOiBudWxsKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEUgZG93bmNhc3QoRXhwcmVzc2lvbiBlKSB7Ci0JCXJldHVybiAoRSkgZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBFIGV4cHJlc3Npb25Ob3JtYWxBbm5vdGF0aW9uKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24pOwotCQlyZXR1cm4gdGhpcy5kb3duY2FzdCgocGFpciA9PSBudWxsKSA/IG51bGwgOiBwYWlyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQgdmFsdWUgKioqKioqKioqKgotCi0JLyoqCi0JICogc2V0IG5vbi1udWxsLCBub24tZW1wdHkgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShFeHByZXNzaW9uIHZhbHVlLCBBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudChhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFZhbHVlTm9Bbm5vdGF0aW9uKHZhbHVlLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5zZXRWYWx1ZU1hcmtlckFubm90YXRpb24odmFsdWUsIChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5zZXRWYWx1ZVNpbmdsZU1lbWJlckFubm90YXRpb24odmFsdWUsIChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSkgewotCQkJdGhpcy5zZXRWYWx1ZU5vcm1hbEFubm90YXRpb24odmFsdWUsIChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhZGQgbm9uLW51bGwsIG5vbi1lbXB0eSB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlTm9Bbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMuZWxlbWVudE5hbWUuZXF1YWxzKFZBTFVFKSkgewotCQkJLy8gQEZvbygieHh4IikKLQkJCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodmFsdWUpOwotCQl9IGVsc2UgewotCQkJLy8gQEZvbyhiYXI9Inh4eCIpCi0JCQl0aGlzLmFkZFZhbHVlKHZhbHVlLCB0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFZhbHVlKEV4cHJlc3Npb24gdmFsdWUsIE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQl0aGlzLmFkZFZhbHVlKHZhbHVlLCBhbm5vdGF0aW9uLCB0aGlzLmVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZShFeHByZXNzaW9uIHZhbHVlLCBOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBhbm5vdGF0aW9uRWxlbWVudE5hbWUpIHsKLQkJQVNUIGFzdCA9IGFubm90YXRpb24uZ2V0QVNUKCk7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gYXN0Lm5ld01lbWJlclZhbHVlUGFpcigpOwotCQlwYWlyLnNldE5hbWUoYXN0Lm5ld1NpbXBsZU5hbWUoYW5ub3RhdGlvbkVsZW1lbnROYW1lKSk7Ci0JCXBhaXIuc2V0VmFsdWUodmFsdWUpOwotCQlMaXN0PE1lbWJlclZhbHVlUGFpcj4gdmFsdWVzID0gdGhpcy52YWx1ZXMoYW5ub3RhdGlvbik7Ci0JCXZhbHVlcy5hZGQocGFpcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlTWFya2VyQW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIEBGb28gPT4gQEZvbygieHh4IikKLQkJLy8gICAgIG9yCi0JCS8vIEBGb28gPT4gQEZvbyhiYXI9Inh4eCIpCi0JCXRoaXMuc2V0VmFsdWVOb0Fubm90YXRpb24odmFsdWUsIGRlY2xhcmF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZVNpbmdsZU1lbWJlckFubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSwgU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnROYW1lLmVxdWFscyhWQUxVRSkpIHsKLQkJCS8vIEBGb28oInl5eSIpID0+IEBGb28oInh4eCIpCi0JCQlhbm5vdGF0aW9uLnNldFZhbHVlKHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCS8vIEBGb28oInl5eSIpID0+IEBGb28odmFsdWU9Inl5eSIsIGJhcj0ieHh4IikKLQkJCUV4cHJlc3Npb24gdnYgPSBhbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0JCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSB0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJdGhpcy5hZGRWYWx1ZSh2diwgbm9ybWFsQW5ub3RhdGlvbiwgVkFMVUUpOwotCQkJdGhpcy5hZGRWYWx1ZSh2YWx1ZSwgbm9ybWFsQW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZU5vcm1hbEFubm90YXRpb24oRXhwcmVzc2lvbiB2YWx1ZSwgTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24pOwotCQlpZiAocGFpciA9PSBudWxsKSB7Ci0JCQl0aGlzLmFkZFZhbHVlKHZhbHVlLCBhbm5vdGF0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXBhaXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50ICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudE5vQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJdGhpcy5yZW1vdmVFbGVtZW50TWFya2VyQW5ub3RhdGlvbigoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZGVjbGFyYXRpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudFNpbmdsZU1lbWJlckFubm90YXRpb24oKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGFubm90YXRpb24sIGRlY2xhcmF0aW9uKTsKLQkJfQotCQllbHNlIGlmIChhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLnJlbW92ZUVsZW1lbnROb3JtYWxBbm5vdGF0aW9uKChOb3JtYWxBbm5vdGF0aW9uKSBhbm5vdGF0aW9uLCBkZWNsYXJhdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIGFubm90YXRpb24gdHlwZTogIiArIGFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50Tm9Bbm5vdGF0aW9uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgZ29uZSAoPykKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50TWFya2VyQW5ub3RhdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGdvbmUgKD8pCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRWxlbWVudFNpbmdsZU1lbWJlckFubm90YXRpb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlpZiAodGhpcy5lbGVtZW50TmFtZS5lcXVhbHMoVkFMVUUpKSB7Ci0JCQkvLyBARm9vKCJ4eHgiKSA9PiBARm9vCi0JCQl0aGlzLmFubm90YXRpb25BZGFwdGVyLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl9IGVsc2UgewotCQkJLy8gdGhlIFtub24tJ3ZhbHVlJ10gZWxlbWVudCBpcyBhbHJlYWR5IGdvbmUgKD8pCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbGVtZW50Tm9ybWFsQW5ub3RhdGlvbihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyA9IHRoaXMudmFsdWVzKGFubm90YXRpb24pOwotCQlpZiAoKHZhbHVlcy5zaXplKCkgPT0gMSkgJiYgdmFsdWVzLmdldCgwKS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHRoaXMuZWxlbWVudE5hbWUpKSB7Ci0JCQkvLyBARm9vKGJhcj0ieHh4IikgPT4gQEZvbwotCQkJdGhpcy5hbm5vdGF0aW9uQWRhcHRlci5uZXdNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMucmVtb3ZlRWxlbWVudChhbm5vdGF0aW9uKTsKLQkJCWlmICh2YWx1ZXMuc2l6ZSgpID09IDEpIHsKLQkJCQlNZW1iZXJWYWx1ZVBhaXIgcGFpciA9IHZhbHVlcy5nZXQoMCk7Ci0JCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhWQUxVRSkpIHsKLQkJCQkJLy8gQEZvbyhiYXI9Inh4eCIsIHZhbHVlPSJ5eXkiKSA9PiBARm9vKCJ5eXkiKQotCQkJCQlFeHByZXNzaW9uIHZ2ID0gcGFpci5nZXRWYWx1ZSgpOwotCQkJCQl2diA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZ2LmdldEFTVCgpLCB2dik7Ci0JCQkJCXRoaXMuYW5ub3RhdGlvbkFkYXB0ZXIubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbikuc2V0VmFsdWUodnYpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEBGb28oYmFyPSJ4eHgiLCBiYXo9Inl5eSIpID0+IEBGb28oYmF6PSJ5eXkiKQotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gQEZvbyhiYXI9Inh4eCIsIGJhej0ieXl5Iiwgam9vPSJ4eHgiKSA9PiBARm9vKGJhej0ieXl5Iiwgam9vPSJ4eHgiKQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSAqZmlyc3QqIG1lbWJlciB2YWx1ZSBwYWlyIGZyb20gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBhZGFwdGVyJ3MgZWxlbWVudCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWZvciAoSXRlcmF0b3I8TWVtYmVyVmFsdWVQYWlyPiBzdHJlYW0gPSB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU1lbWJlclZhbHVlUGFpciBwYWlyID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50TmFtZSkpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICpmaXJzdCogbWVtYmVyIHZhbHVlIHBhaXIgZm9yIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgYWRhcHRlcidzIGVsZW1lbnQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlmb3IgKE1lbWJlclZhbHVlUGFpciBwYWlyIDogdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikpIHsKLQkJCWlmIChwYWlyLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHModGhpcy5lbGVtZW50TmFtZSkpIHsKLQkJCQlyZXR1cm4gcGFpcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyhOb3JtYWxBbm5vdGF0aW9uIG5hKSB7Ci0JCXJldHVybiBuYS52YWx1ZXMoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0dlbmVyaWNWaXNpdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9HZW5lcmljVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjE2MGFmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0dlbmVyaWNWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bc3NlcnRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFzc2lnbm1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CbG9ja0NvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvb2xlYW5MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5CcmVha1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ2FzdEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNhdGNoQ2xhdXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DaGFyYWN0ZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5DbGFzc0luc3RhbmNlQ3JlYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29uZGl0aW9uYWxFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db25zdHJ1Y3Rvckludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbnRpbnVlU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Eb1N0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW1wdHlTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVuaGFuY2VkRm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRmllbGREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRm9yU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JZlN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW1wb3J0RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluZml4RXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkluc3RhbmNlb2ZFeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5KYXZhZG9jOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5MYWJlbGVkU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5MaW5lQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RJbnZvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2RSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1ldGhvZFJlZlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk51bGxMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUG9zdGZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByZWZpeEV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlF1YWxpZmllZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlJldHVyblN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyRmllbGRBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN1cGVyTWV0aG9kSW52b2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3dpdGNoQ2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3dpdGNoU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TeW5jaHJvbml6ZWRTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRhZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRleHRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UaGlzRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVGhyb3dTdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlRyeVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlRGVjbGFyYXRpb25TdGF0ZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5XaGlsZVN0YXRlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uV2lsZGNhcmRUeXBlOwotCi0vKioKLSAqIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuZG9tLkdlbmVyaWNWaXNpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljVmlzaXRvciBleHRlbmRzIEFTVFZpc2l0b3IgewotCi0JcHVibGljIEdlbmVyaWNWaXNpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBHZW5lcmljVmlzaXRvcihib29sZWFuIHZpc2l0SmF2YWRvY1RhZ3MpIHsKLQkJc3VwZXIodmlzaXRKYXZhZG9jVGFncyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBob29rcyBmb3Igc3ViY2xhc3NlcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2aXNpdF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEFTVE5vZGUgbm9kZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmRWaXNpdF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEFTVE5vZGUgbm9kZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQXJyYXlDcmVhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFycmF5SW5pdGlhbGl6ZXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBcnJheVR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NlcnRTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChBc3NpZ25tZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQmxvY2sgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChCb29sZWFuTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEJyZWFrU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDYXRjaENsYXVzZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KENoYXJhY3RlckxpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb21waWxhdGlvblVuaXQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChDb250aW51ZVN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KERvU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRmllbGRBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChGaWVsZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRm9yU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSWZTdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEluZml4RXhwcmVzc2lvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEluc3RhbmNlb2ZFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoSW5pdGlhbGl6ZXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChKYXZhZG9jIG5vZGUpIHsKLQkJcmV0dXJuIChzdXBlci52aXNpdChub2RlKSkgPyB2aXNpdF8obm9kZSkgOiBmYWxzZTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTGFiZWxlZFN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KE51bGxMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhY2thZ2VEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChQcmVmaXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUHJpbWl0aXZlVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChSZXR1cm5TdGF0ZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTaW1wbGVOYW1lIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU2ltcGxlVHlwZSBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN0cmluZ0xpdGVyYWwgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlckNvbnN0cnVjdG9ySW52b2NhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTdXBlck1ldGhvZEludm9jYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChTd2l0Y2hDYXNlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU3luY2hyb25pemVkU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVGhpc0V4cHJlc3Npb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRyeVN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVMaXRlcmFsIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoQW5ub3RhdGlvblR5cGVEZWNsYXJhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEFubm90YXRpb25UeXBlTWVtYmVyRGVjbGFyYXRpb24gbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChCbG9ja0NvbW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChFbmhhbmNlZEZvclN0YXRlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KEVudW1Db25zdGFudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoRW51bURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTGluZUNvbW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChNYXJrZXJBbm5vdGF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWVtYmVyUmVmIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWVtYmVyVmFsdWVQYWlyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kUmVmIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTWV0aG9kUmVmUGFyYW1ldGVyIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoTW9kaWZpZXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChOb3JtYWxBbm5vdGF0aW9uIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoUGFyYW1ldGVyaXplZFR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChRdWFsaWZpZWRUeXBlIG5vZGUpIHsKLQkJcmV0dXJuIHZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmlzaXQoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFRhZ0VsZW1lbnQgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChUZXh0RWxlbWVudCBub2RlKSB7Ci0JCXJldHVybiB2aXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZpc2l0KFR5cGVQYXJhbWV0ZXIgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2aXNpdChXaWxkY2FyZFR5cGUgbm9kZSkgewotCQlyZXR1cm4gdmlzaXRfKG5vZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFub255bW91c0NsYXNzRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFycmF5QWNjZXNzIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUNyZWF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheUluaXRpYWxpemVyIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBcnJheVR5cGUgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEFzc2VydFN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQXNzaWdubWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQmxvY2sgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCcmVha1N0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ2FzdEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENhdGNoQ2xhdXNlIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDaGFyYWN0ZXJMaXRlcmFsIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDbGFzc0luc3RhbmNlQ3JlYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbXBpbGF0aW9uVW5pdCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KENvbnRpbnVlU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChEb1N0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW1wdHlTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEZpZWxkQWNjZXNzIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChGaWVsZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChGb3JTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KElmU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbXBvcnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW5maXhFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChJbnN0YW5jZW9mRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoSW5pdGlhbGl6ZXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEphdmFkb2Mgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KExhYmVsZWRTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZXRob2RJbnZvY2F0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChOdWxsTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTnVtYmVyTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUGFja2FnZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUG9zdGZpeEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByZWZpeEV4cHJlc3Npb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFByaW1pdGl2ZVR5cGUgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFF1YWxpZmllZE5hbWUgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFJldHVyblN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2ltcGxlTmFtZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU2ltcGxlVHlwZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3RyaW5nTGl0ZXJhbCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3VwZXJDb25zdHJ1Y3Rvckludm9jYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyRmllbGRBY2Nlc3Mgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFN1cGVyTWV0aG9kSW52b2NhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3dpdGNoQ2FzZSBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoU3dpdGNoU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChTeW5jaHJvbml6ZWRTdGF0ZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRoaXNFeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUaHJvd1N0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHJ5U3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFR5cGVEZWNsYXJhdGlvblN0YXRlbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoVHlwZUxpdGVyYWwgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFdoaWxlU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBbm5vdGF0aW9uVHlwZURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChBbm5vdGF0aW9uVHlwZU1lbWJlckRlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChCbG9ja0NvbW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KEVuaGFuY2VkRm9yU3RhdGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoRW51bURlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChMaW5lQ29tbWVudCBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWFya2VyQW5ub3RhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWVtYmVyUmVmIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNZW1iZXJWYWx1ZVBhaXIgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KE1ldGhvZFJlZiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTWV0aG9kUmVmUGFyYW1ldGVyIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChNb2RpZmllciBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoTm9ybWFsQW5ub3RhdGlvbiBub2RlKSB7Ci0JCWVuZFZpc2l0Xyhub2RlKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZW5kVmlzaXQoUGFyYW1ldGVyaXplZFR5cGUgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFF1YWxpZmllZFR5cGUgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFNpbmdsZU1lbWJlckFubm90YXRpb24gbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRhZ0VsZW1lbnQgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuZFZpc2l0KFRleHRFbGVtZW50IG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChUeXBlUGFyYW1ldGVyIG5vZGUpIHsKLQkJZW5kVmlzaXRfKG5vZGUpOwotCX0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmRWaXNpdChXaWxkY2FyZFR5cGUgbm9kZSkgewotCQllbmRWaXNpdF8obm9kZSk7Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0luZGV4ZWRDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0luZGV4ZWRDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0NWEwNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9JbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JCWV4dGVuZHMgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFRbXT4KLQkJaW1wbGVtZW50cyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gewotCQotCXB1YmxpYyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4gY29udmVydGVyKSB7Ci0JCXN1cGVyKGFubm90YXRpb25BZGFwdGVyLCBjb252ZXJ0ZXIpOwotCX0KLQotCXB1YmxpYyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBJbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIpIHsKLQkJc3VwZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyPFQ+KSBzdXBlci5nZXRDb252ZXJ0ZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0U3VidmFsdWVFeHByZXNzaW9uKGludCBpbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZ2V0Q29udmVydGVyKCkuZ2V0U3ViZXhwcmVzc2lvbihpbmRleCwgc3VwZXIuZ2V0RXhwcmVzc2lvbihkZWNsYXJhdGlvbikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEFubm90YXRlZEVsZW1lbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEFubm90YXRlZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc3MWM3Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRBbm5vdGF0ZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuTG9jYXRpb25LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIG1lbWJlciB3aXRoIHNpbXBsaWZpZWQgYW5ub3RhdGlvbiBoYW5kbGluZy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpEVEFubm90YXRlZEVsZW1lbnQKLQlpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQKLXsKLQotCS8qKiB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyBuYW1lIChkdWgpICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHRoZSBjb21waWxhdGlvbiB1bml0IChmaWxlKSBjb250YWluaW5nIHRoZSBhbm5vdGF0ZWQgZWxlbWVudDsKLQkgKiB1c2VkIGZvciBidWlsZGluZyBhbiBBU1Qgd2hlbiB3ZSBtb2RpZnkgdGhlIGFubm90YXRlZCBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdDsKLQotCS8qKgotCSAqIHRoaXMgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSBhIHdheSB0byBtb2RpZnkgdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiAoZmlsZSkgd2hlbiBpdCBpcyBvcGVuIGluIGFuIGVkaXRvciBhbmQgc2hvdWxkIGJlIG1vZGlmaWVkIG9uIHRoZSBVSQotCSAqIHRocmVhZAotCSAqLwotCXByaXZhdGUgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yOwotCi0JLyoqIHRoaXMgd2lsbCBmb3JtYXQgdGhlIGFubm90YXRlZCBlbGVtZW50J3MgYW5ub3RhdGlvbnMgYSBiaXQgKi8KLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEpEVEFubm90YXRlZEVsZW1lbnQoCi0JCQlTdHJpbmcgbmFtZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMobmFtZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKRFRBbm5vdGF0ZWRFbGVtZW50KAotCQkJU3RyaW5nIG5hbWUsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY29tcGlsYXRpb25Vbml0ID0gY29tcGlsYXRpb25Vbml0OwotCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0JCXRoaXMuYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgPSBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQW5ub3RhdGVkRWxlbWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IE1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JcHVibGljIE1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlZGl0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIEVkaXQgdGhlIG1lbWJlciB3aXRoIHRoZSBzcGVjaWZpZWQgZWRpdG9yLgotCSAqIFRoZSBlZGl0b3Igd2lsbCBiZSBpbnZva2VkIG9uY2UgdGhlIG1lbWJlcidzIGNvbXBpbGF0aW9uIHVuaXQKLQkgKiBpcyBpbiBhbiBlZGl0YWJsZSBzdGF0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlZGl0KEVkaXRvciBlZGl0b3IpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZWRpdF8oZWRpdG9yKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOQjogQmUgY2FyZWZ1bCBjaGFuZ2luZyB0aGlzIG1ldGhvZC4KLQkgKiBUaGluZ3MgdG8gbG9vayBvdXQgZm9yOgotCSAqICAgICAtIHdoZW4gZWRpdGluZyB2aWEgdGhlIEphdmFFZGl0b3IgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYSB3b3JraW5nIGNvcHkKLQkgKiAgICAgLSB3aGVuIGVkaXRpbmcgd2l0aG91dCBhbiBlZGl0b3Igb3IgdmlhIGEgc2ltcGxlIHRleHQgZWRpdG9yLCBhICJ3b3JraW5nIGNvcHkiIG11c3QgYmUgY3JlYXRlZC4KLQkgKiAgICAgICAgKGF0IGxlYXN0IGFzIGZhciBhcyBJIGNhbiB0ZWxsICB+a2ZtKQotCSAqICAgICAtIHNoYXJlZERvY3VtZW50IGlzIG9ubHkgZXZlciBmYWxzZSBpbiB0ZXN0cyAoaGVhZGxlc3MgbW9kZSkuICBJbiB0aGUgVUksIGV2ZW4gaWYgdGhlIGZpbGUKLQkgKiAgICAgICAgaXMgbm90IG9wZW4gaW4gYW4gZWRpdG9yLCBzaGFyZWREb2N1bWVudCBpcyBzdGlsbCB0cnVlIChidWZmZXIgaXMgbm90IG51bGwpCi0JICogICAgIC0gaWYgYSB3b3JraW5nIGNvcHkgaXMgY3JlYXRlZCwgdGhlbiB3ZSBtdXN0IGRpc2NhcmQgaXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0XyhFZGl0b3IgZWRpdG9yKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gY3JlYXRlV29ya2luZ0NvcHkgPSAhIHRoaXMuY29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKTsKLQkJaWYgKGNyZWF0ZVdvcmtpbmdDb3B5KSB7Ci0JCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5iZWNvbWVXb3JraW5nQ29weShudWxsKTsKLQkJfQotCi0JCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5nZXRUZXh0RmlsZUJ1ZmZlcih0aGlzLmNvbXBpbGF0aW9uVW5pdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCksIExvY2F0aW9uS2luZC5OT1JNQUxJWkUpOwotCQlib29sZWFuIHNoYXJlZERvY3VtZW50ID0gKGJ1ZmZlciAhPSBudWxsKTsgIC8vIGRvY3VtZW50cyBhcmUgdHlwaWNhbGx5IHNoYXJlZCB3aGVuIHRoZXkgYXJlIGFscmVhZHkgb3BlbiBpbiBhbiBlZGl0b3IKLQkJSURvY3VtZW50IGRvYyA9IHNoYXJlZERvY3VtZW50ID8KLQkJCQlidWZmZXIuZ2V0RG9jdW1lbnQoKSA6Ci0JCQkJbmV3IERvY3VtZW50KHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCkpOwotCi0JCXRyeSB7Ci0JCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KCk7Ci0JCQlhc3RSb290LnJlY29yZE1vZGlmaWNhdGlvbnMoKTsKLQkKLQkJCWVkaXRvci5lZGl0KHRoaXMuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JCi0JCQlUZXh0RWRpdCBlZGl0cyA9IGFzdFJvb3QucmV3cml0ZShkb2MsIHRoaXMuY29tcGlsYXRpb25Vbml0LmdldEphdmFQcm9qZWN0KCkuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCQlpZiAoc2hhcmVkRG9jdW1lbnQpIHsKLQkJCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUobmV3IE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZChlZGl0cywgZG9jKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuYXBwbHlFZGl0cyhlZGl0cywgZG9jKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChjcmVhdGVXb3JraW5nQ29weSkgewotCQkJCS8vZGlzY2FyZFdvcmtpbmdDb3B5IG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYmVjb21lV29ya2luZ0NvcHkgaXMgY2FsbGVkLgotCQkJCXRoaXMuY29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKGRvYy5nZXQoKSk7Ci0JCQkJdGhpcy5jb21waWxhdGlvblVuaXQuY29tbWl0V29ya2luZ0NvcHkodHJ1ZSwgbnVsbCk7ICAvLyB0cnVlPSJmb3JjZSIKLQkJCQl0aGlzLmNvbXBpbGF0aW9uVW5pdC5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGx5IHRoZSBzcGVjaWZpZWQgZWRpdHMgdG8gdGhlIHNwZWNpZmllZCBkb2N1bWVudCwKLQkgKiByZWZvcm1hdHRpbmcgdGhlIGRvY3VtZW50IGlmIG5lY2Vzc2FyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGx5RWRpdHMoVGV4dEVkaXQgZWRpdHMsIElEb2N1bWVudCBkb2MpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWVkaXRzLmFwcGx5KGRvYywgVGV4dEVkaXQuVVBEQVRFX1JFR0lPTlMpOwotCQl0aGlzLmFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmZvcm1hdChkb2MsIGVkaXRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLmJ1aWxkQVNUUm9vdCh0aGlzLmNvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vZGlmeSBzaGFyZWQgZG9jdW1lbnQgY29tbWFuZCBjbGFzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzaW1wbGUgY29tbWFuZCB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIG1lbWJlciB0byBhcHBseSB0aGUgZWRpdHMKLQkgKiBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgdGhlIGRvY3VtZW50IHdlcmUgbm90IHNoYXJlZAotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHJpdmF0ZSBmaW5hbCBUZXh0RWRpdCBlZGl0czsKLQkJcHJpdmF0ZSBmaW5hbCBJRG9jdW1lbnQgZG9jOwotCi0JCXByb3RlY3RlZCBNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmQoVGV4dEVkaXQgZWRpdHMsIElEb2N1bWVudCBkb2MpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVkaXRzID0gZWRpdHM7Ci0JCQl0aGlzLmRvYyA9IGRvYzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0cnkgewotCQkJCUpEVEFubm90YXRlZEVsZW1lbnQudGhpcy5hcHBseUVkaXRzKHRoaXMuZWRpdHMsIHRoaXMuZG9jKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZDliYzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIEFkYXB0IGFuZCBleHRlbmQgYSBKRFQgZW51bS4KLSAqLwotcHVibGljIGNsYXNzIEpEVEVudW0KLQlleHRlbmRzIEFic3RyYWN0SkRUVHlwZQotCWltcGxlbWVudHMgRW51bQotewotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRoZSBjb21waWxhdGlvbiB1bml0J3MgcHJpbWFyeSB0eXBlLCBhbiBlbnVtCi0JICovCi0JcHVibGljIEpEVEVudW0oCi0JCQlFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcyhlbnVtRGVjbGFyYXRpb24sIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQncyBwcmltYXJ5IHR5cGUsIGFuIGVudW0KLQkgKi8KLQlwdWJsaWMgSkRURW51bSgKLQkJCUVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKG51bGwsIGVudW1EZWNsYXJhdGlvbiwgMSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciBuZXN0ZWQgZW51bXMKLQkgKi8KLQlwdWJsaWMgSkRURW51bSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCUVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgZW51bURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCBlbnVtcwotCSAqLwotCXB1YmxpYyBKRFRFbnVtKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBlbnVtRGVjbGFyYXRpb24sIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGVzdGluZwotCSAqLwotCXB1YmxpYyBKRFRFbnVtKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCkgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnVtRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAoRW51bURlY2xhcmF0aW9uKSBzdXBlci5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb25bXSBnZXRFbnVtQ29uc3RhbnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUxpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHMgPSBlbnVtQ29uc3RhbnRzKGdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KSk7Ci0JCXJldHVybiBlbnVtQ29uc3RhbnRzLnRvQXJyYXkobmV3IEVudW1Db25zdGFudERlY2xhcmF0aW9uW2VudW1Db25zdGFudHMuc2l6ZSgpXSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50cyhFbnVtRGVjbGFyYXRpb24gZWQpIHsKLQkJcmV0dXJuIGVkLmVudW1Db25zdGFudHMoKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb24gZ2V0VG9wTGV2ZWxUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIChFbnVtRGVjbGFyYXRpb24pIHN1cGVyLmdldFRvcExldmVsVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFbnVtRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKExpc3Q8QWJzdHJhY3RUeXBlRGVjbGFyYXRpb24+IHR5cGVEZWNsYXJhdGlvbnMpIHsKLQkJcmV0dXJuIChFbnVtRGVjbGFyYXRpb24pIHN1cGVyLmdldFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb25zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRW51bURlY2xhcmF0aW9uIGdldE5lc3RlZFR5cGVEZWNsYXJhdGlvbihUeXBlRGVjbGFyYXRpb24gZGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVEZWNsYXJhdGlvbihnZXRFbnVtcyhkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRW51bURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbltdIHR5cGVEZWNsYXJhdGlvbnMpIHsKLQkJcmV0dXJuIChFbnVtRGVjbGFyYXRpb24pIHN1cGVyLmdldFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb25zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGdldEFTVE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVEVudW1Db25zdGFudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURW51bUNvbnN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjcxNGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURW51bUNvbnN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1Db25zdGFudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBlbnVtIGNvbnN0YW50LgotICovCi1wdWJsaWMgY2xhc3MgSkRURW51bUNvbnN0YW50Ci0JZXh0ZW5kcyBKRFRNZW1iZXIKLQlpbXBsZW1lbnRzIEVudW1Db25zdGFudAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpEVEVudW1Db25zdGFudCgKLQkJCUVudW0gZGVjbGFyaW5nRW51bSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKGRlY2xhcmluZ0VudW0sIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHVibGljIEpEVEVudW1Db25zdGFudCgKLQkJCUVudW0gZGVjbGFyaW5nRW51bSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKGRlY2xhcmluZ0VudW0sIG5hbWUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjb25zdHJ1Y3RvciBmb3IgdGVzdGluZwotCSAqLwotCXB1YmxpYyBKRFRFbnVtQ29uc3RhbnQoRW51bSBkZWNsYXJpbmdFbnVtLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRoaXMoZGVjbGFyaW5nRW51bSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVudW0gZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChFbnVtKSBzdXBlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBBbm5vdGF0ZWRFbGVtZW50L0VudW1Db25zdGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSVZhcmlhYmxlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlVmFyaWFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFNlbGVjdGVkRGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUVudW1Db25zdGFudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCS8vIHRoZSBkZWNsYXJhdGlvbiBjYW4gYmUgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0KLQkJcmV0dXJuIChkZWNsYXJhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5idWlsZFRleHRSYW5nZShkZWNsYXJhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCS8vQXMgZmFyIGFzIEkgY2FuIHRlbGwsIGVudW0gY29uc3RhbnRzIGFyZSBhbHdheXMgInBlcnNpc3RhYmxlIiwgCi0JLy90aGVyZSBhcmUgbm8gbW9kaWZpZXJzIHlvdSBjYW4gYWRkIHRvIGFuIGVudW0gY29uc3RhbnQKLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZ2V0U2VsZWN0ZWREZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCQlpbnQgb2NjdXJyZW5jZSA9IHRoaXMuZ2V0T2NjdXJyZW5jZSgpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKEVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uIDogdGhpcy5nZXREZWNsYXJpbmdUeXBlRW51bUNvbnN0YW50RGVjbGFyYXRpb25zKGFzdFJvb3QpKSB7Ci0JCQlpZiAoZW51bUNvbnN0YW50RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCWNvdW50Kys7Ci0JCQkJaWYgKGNvdW50ID09IG9jY3VycmVuY2UpIHsKLQkJCQkJcmV0dXJuIGVudW1Db25zdGFudERlY2xhcmF0aW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgZmllbGQgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZTsKLQkJLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGNvbnRleHQgbW9kZWwgaGFzIG5vdCB5ZXQKLQkJLy8gYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgYnV0IGlzIHN0aWxsCi0JCS8vIGFza2luZyBmb3IgYW4gQVNUTm9kZSAoZS5nLiBkdXJpbmcgYSBzZWxlY3Rpb24gZXZlbnQpCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbltdIGdldERlY2xhcmluZ1R5cGVFbnVtQ29uc3RhbnREZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50cyA9IGVudW1Db25zdGFudHModGhpcy5nZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCQlyZXR1cm4gZW51bUNvbnN0YW50cy50b0FycmF5KG5ldyBFbnVtQ29uc3RhbnREZWNsYXJhdGlvbltlbnVtQ29uc3RhbnRzLnNpemUoKV0pOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIExpc3Q8RW51bUNvbnN0YW50RGVjbGFyYXRpb24+IGVudW1Db25zdGFudHMoRW51bURlY2xhcmF0aW9uIGVkKSB7Ci0JCXJldHVybiBlZC5lbnVtQ29uc3RhbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudW1EZWNsYXJhdGlvbiBnZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVjbGFyaW5nVHlwZSgpLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRGaWVsZEF0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRURmllbGRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0M2NiMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRGaWVsZEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklWYXJpYWJsZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBmaWVsZC4KLSAqIEF0dHJpYnV0ZSBiYXNlZCBvbiBhIEphdmEgZmllbGQsIGUuZy4KLSAqICAgICBwcml2YXRlIGludCBmb287Ci0gKi8KLXB1YmxpYyBjbGFzcyBKRFRGaWVsZEF0dHJpYnV0ZQotCWV4dGVuZHMgSkRUTWVtYmVyCi0JaW1wbGVtZW50cyBGaWVsZEF0dHJpYnV0ZQotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpEVEZpZWxkQXR0cmlidXRlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoCi0JCQlUeXBlIGRlY2xhcmluZ1R5cGUsCi0JCQlTdHJpbmcgbmFtZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlzdXBlcihkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRURmllbGRBdHRyaWJ1dGUoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE1lbWJlci9BdHRyaWJ1dGUvRmllbGRBdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChUeXBlKSBzdXBlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JfQotCi0JcHVibGljIElWYXJpYWJsZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRGcmFnbWVudChhc3RSb290KS5yZXNvbHZlQmluZGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3RlZERlY2xhcmF0aW9uKGFzdFJvb3QsIEZJRUxEX0RFQ0xBUkFUSU9OX1NFTEVDVE9SKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IGZyYWdtZW50ID0gdGhpcy5nZXRGcmFnbWVudChhc3RSb290KTsKLQkJLy8gdGhlIGZyYWdtZW50IGNhbiBiZSBudWxsIGlmIHRoZSByZXNvdXJjZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaWxlIHN5c3RlbQotCQlyZXR1cm4gKGZyYWdtZW50ID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGZyYWdtZW50LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIElUeXBlQmluZGluZyBnZXRUeXBlQmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkuZ2V0VHlwZSgpLnJlc29sdmVCaW5kaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJVmFyaWFibGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMuZmllbGRJc1BlcnNpc3RhYmxlKG5ldyBKUFRUb29sc0FkYXB0ZXIoYmluZGluZykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldERlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBhc3N1bWUgdGhlIGRlY2xhcmluZyB0eXBlIGlzIG5vdCBhbiBlbnVtIG9yIGFubm90YXRpb24KLQkJLy8gc2luY2UgdGhleSBkbyBub3QgaGF2ZSBmaWVsZCBvciBtZXRob2QgZGVjbGFyYXRpb25zCi0JCXJldHVybiB0aGlzLmdldERlY2xhcmluZ1R5cGUoKS5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBnZXRGcmFnbWVudChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWxlY3RlZERlY2xhcmF0aW9uKGFzdFJvb3QsIFZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UX1NFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gZWl0aGVyIGEgRmllbGREZWNsYXJhdGlvbiBvciBhIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCwKLQkgKiBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBzZWxlY3RvcjsKLQkgKiAKLQkgKiBoYW5kbGUgbXVsdGlwbGUgZmllbGRzIGRlY2xhcmVkIGluIGEgc2luZ2xlIHN0YXRlbWVudDoKLQkgKiAgICAgcHJpdmF0ZSBpbnQgZm9vLCBiYXI7Ci0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgQVNUTm9kZT4gVCBnZXRTZWxlY3RlZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290LCBTZWxlY3RvcjxUPiBzZWxlY3RvcikgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCQlpbnQgb2NjdXJyZW5jZSA9IHRoaXMuZ2V0T2NjdXJyZW5jZSgpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKEZpZWxkRGVjbGFyYXRpb24gZmllbGREZWNsYXJhdGlvbiA6IHRoaXMuZ2V0RGVjbGFyaW5nVHlwZUZpZWxkRGVjbGFyYXRpb25zKGFzdFJvb3QpKSB7Ci0JCQlmb3IgKFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCBmcmFnbWVudCA6IGZyYWdtZW50cyhmaWVsZERlY2xhcmF0aW9uKSkgewotCQkJCWlmIChmcmFnbWVudC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWNvdW50Kys7Ci0JCQkJCWlmIChjb3VudCA9PSBvY2N1cnJlbmNlKSB7Ci0JCQkJCQlyZXR1cm4gc2VsZWN0b3Iuc2VsZWN0KGZpZWxkRGVjbGFyYXRpb24sIGZyYWdtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgZmllbGQgaXMgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZTsKLQkJLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIGNvbnRleHQgbW9kZWwgaGFzIG5vdCB5ZXQKLQkJLy8gYmVlbiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgYnV0IGlzIHN0aWxsCi0JCS8vIGFza2luZyBmb3IgYW4gQVNUTm9kZSAoZS5nLiBkdXJpbmcgYSBzZWxlY3Rpb24gZXZlbnQpCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBGaWVsZERlY2xhcmF0aW9uW10gZ2V0RGVjbGFyaW5nVHlwZUZpZWxkRGVjbGFyYXRpb25zKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24gPSB0aGlzLmdldERlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbihhc3RSb290KTsKLQkJLy8gdGhlIGRlY2xhcmF0aW9uIGNhbiBiZSBudWxsIGlmIHRoZSByZXNvdXJjZSBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBmaWxlIHN5c3RlbQotCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsKSA/IEVNUFRZX0ZJRUxEX0RFQ0xBUkFUSU9OX0FSUkFZIDogdHlwZURlY2xhcmF0aW9uLmdldEZpZWxkcygpOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEZpZWxkRGVjbGFyYXRpb25bXSBFTVBUWV9GSUVMRF9ERUNMQVJBVElPTl9BUlJBWSA9IG5ldyBGaWVsZERlY2xhcmF0aW9uWzBdOwotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IGZyYWdtZW50cyhGaWVsZERlY2xhcmF0aW9uIGZkKSB7Ci0JCXJldHVybiBmZC5mcmFnbWVudHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2VsZWN0b3IgKioqKioqKioqKgotCi0JLy8gSSdtIG5vdCBxdWl0ZSBzdXJlIHRoaXMgaW50ZXJmYWNlIGlzIHdvcnRoIHRoZSByZXN1bHRpbmcgb2JmdXNjYXRpb24sCi0JLy8gYnV0LCB0aGVuLCBJIGtlcHQgY2hhbmdpbmcgYm90aCBtZXRob2RzLCBzby4uLiAgfmJqdgotCXByb3RlY3RlZCBpbnRlcmZhY2UgU2VsZWN0b3I8VCBleHRlbmRzIEFTVE5vZGU+IHsKLQkJVCBzZWxlY3QoRmllbGREZWNsYXJhdGlvbiBmaWVsZERlY2xhcmF0aW9uLCBWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQgdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50KTsKLQkJU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvcjxGaWVsZERlY2xhcmF0aW9uPiBGSUVMRF9ERUNMQVJBVElPTl9TRUxFQ1RPUiA9Ci0JCW5ldyBTZWxlY3RvcjxGaWVsZERlY2xhcmF0aW9uPigpIHsKLQkJCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uIHNlbGVjdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIHsKLQkJCQlyZXR1cm4gZmllbGREZWNsYXJhdGlvbjsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQkJcmV0dXJuICJmaWVsZCBkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkZJRUxEX0RFQ0xBUkFUSU9OX1NFTEVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTZWxlY3RvcjxWYXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQ+IFZBUklBQkxFX0RFQ0xBUkFUSU9OX0ZSQUdNRU5UX1NFTEVDVE9SID0KLQkJbmV3IFNlbGVjdG9yPFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudD4oKSB7Ci0JCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50IHNlbGVjdChGaWVsZERlY2xhcmF0aW9uIGZpZWxkRGVjbGFyYXRpb24sIFZhcmlhYmxlRGVjbGFyYXRpb25GcmFnbWVudCB2YXJpYWJsZURlY2xhcmF0aW9uRnJhZ21lbnQpIHsKLQkJCQlyZXR1cm4gdmFyaWFibGVEZWNsYXJhdGlvbkZyYWdtZW50OwotCQkJfQotCQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCQlyZXR1cm4gInZhcmlhYmxlIGRlY2xhcmF0aW9uIGZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVkFSSUFCTEVfREVDTEFSQVRJT05fRlJBR01FTlRfU0VMRUNUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLQotCS8vICoqKioqKioqKiogSlBUVG9vbHMgYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKUFRUb29scyBuZWVkcyBhbiBhZGFwdGVyIHNvIGl0IGNhbiB3b3JrIHdpdGggZWl0aGVyIGFuIElGaWVsZAotCSAqIG9yIGFuIElWYXJpYWJsZUJpbmRpbmcgZXRjLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyIGltcGxlbWVudHMgSlBUVG9vbHMuRmllbGRBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBJVmFyaWFibGVCaW5kaW5nIGZpZWxkQmluZGluZzsKLQotCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElWYXJpYWJsZUJpbmRpbmcgZmllbGRCaW5kaW5nKSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKGZpZWxkQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmZpZWxkQmluZGluZyA9IGZpZWxkQmluZGluZzsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZmllbGRCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1lbWJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjM4ZjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWVtYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJvZHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5BYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIG1lbWJlciB3aXRoIHNpbXBsaWZpZWQgYW5ub3RhdGlvbiBoYW5kbGluZy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEpEVE1lbWJlciBleHRlbmRzIEpEVEFubm90YXRlZEVsZW1lbnQKLQlpbXBsZW1lbnRzIE1lbWJlcgotewotCi0JLyoqIHRoaXMgd2lsbCBiZSBudWxsIGZvciB0aGUgcHJpbWFyeSB0eXBlICovCi0JcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdFR5cGUgZGVjbGFyaW5nVHlwZTsKLQotCS8qKgotCSAqIG1lbWJlcnMgY2FuIG9jY3VyIG1vcmUgdGhhbiBvbmNlIGluIG5vbi1jb21waWxpbmcgc291cmNlOwotCSAqIGNvdW50IHN0YXJ0cyBhdCAxOyB0aGUgcHJpbWFyeSB0eXBlIHdpbGwgaGF2ZSBvY2N1cnJlbmNlIDEKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBvY2N1cnJlbmNlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEpEVE1lbWJlcigKLQkJCUFic3RyYWN0VHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJU3RyaW5nIG5hbWUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZW1iZXIoCi0JCQlBYnN0cmFjdFR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCVN0cmluZyBuYW1lLAotCQkJaW50IG9jY3VycmVuY2UsCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXN1cGVyKG5hbWUsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlID0gZGVjbGFyaW5nVHlwZTsKLQkJdGhpcy5vY2N1cnJlbmNlID0gb2NjdXJyZW5jZTsKLQl9Ci0KLQkvL2NvdmFyaWFudCBvdmVycmlkZQotCXB1YmxpYyBhYnN0cmFjdCBCb2R5RGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCQotCS8vICoqKioqKioqKiogTWVtYmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXIpIHsKLQkJcmV0dXJuIG1lbWJlck5hbWUuZXF1YWxzKHRoaXMuZ2V0TmFtZSgpKSAmJiAob2NjdXIgPT0gdGhpcy5vY2N1cnJlbmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGludCBnZXRPY2N1cnJlbmNlKCkgewotCQlyZXR1cm4gdGhpcy5vY2N1cnJlbmNlOwotCX0KLQotCS8qKgotCSAqIHRoaXMgd2lsbCByZXR1cm4gbnVsbCBmb3IgYSB0b3AtbGV2ZWwgdHlwZQotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVjbGFyaW5nVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1ldGhvZEF0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWV0aG9kQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTMzZWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTWV0aG9kQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZXRob2RBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVNZXRob2RTaWduYXR1cmU7Ci0KLS8qKgotICogQWRhcHQgYW5kIGV4dGVuZCBhIEpEVCBtZXRob2QuCi0gKiBBdHRyaWJ1dGUgYmFzZWQgb24gYSBKYXZhIHByb3BlcnR5LCBlLmcuCi0gKiAgICAgcHJpdmF0ZSBpbnQgZ2V0Rm9vKCkgewotICogICAgICAgICByZXR1cm4gZm9vOwotICogICAgIH0KLSAqICAgICBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCBmb28pIHsKLSAqICAgICAgICAgdGhpcy5mb28gPSBmb287Ci0gKiAgICAgfQotICovCi1wdWJsaWMgY2xhc3MgSkRUTWV0aG9kQXR0cmlidXRlCi0JZXh0ZW5kcyBKRFRNZW1iZXIKLQlpbXBsZW1lbnRzIE1ldGhvZEF0dHJpYnV0ZQotewotCS8qKiB3ZSBuZWVkIHRoZSBwYXJhbWV0ZXIgdHlwZXMgdG8gYnVpbGQgdGhlIG1ldGhvZCBzaWduYXR1cmUgKi8KLQlwcml2YXRlIGZpbmFsIEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGRlY2xhcmluZ1R5cGUsIHNpZ25hdHVyZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSkRUTWV0aG9kQXR0cmlidXRlIG5ld0luc3RhbmNlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJTWV0aG9kU2lnbmF0dXJlIHNpZ25hdHVyZSwKLQkJCWludCBvY2N1cnJlbmNlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsCi0JCQlBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcikgewotCQlyZXR1cm4gbmV3IEpEVE1ldGhvZEF0dHJpYnV0ZShkZWNsYXJpbmdUeXBlLCBzaWduYXR1cmUsIG9jY3VycmVuY2UsIGNvbXBpbGF0aW9uVW5pdCwgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IsIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKTsKLQl9Ci0KLQlwcml2YXRlIEpEVE1ldGhvZEF0dHJpYnV0ZSgKLQkJCVR5cGUgZGVjbGFyaW5nVHlwZSwKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUsCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbWV0aG9kU2lnbmF0dXJlLmdldE5hbWUoKSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCQl0aGlzLnBhcmFtZXRlclR5cGVzID0gbWV0aG9kU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRUTWV0aG9kQXR0cmlidXRlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcywgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZShuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMpLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCksIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL0F0dHJpYnV0ZS9NZXRob2RBdHRyaWJ1dGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGUgZ2V0RGVjbGFyaW5nVHlwZSgpIHsKLQkJcmV0dXJuIChUeXBlKSBzdXBlci5nZXREZWNsYXJpbmdUeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaWVsZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSU1ldGhvZEJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkucmVzb2x2ZUJpbmRpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoTWV0aG9kRGVjbGFyYXRpb24gbWV0aG9kRGVjbGFyYXRpb24gOiB0aGlzLmdldERlY2xhcmluZ1R5cGVNZXRob2REZWNsYXJhdGlvbnMoYXN0Um9vdCkpIHsKLQkJCWlmICh0aGlzLm1hdGNoZXMobWV0aG9kRGVjbGFyYXRpb24pKSB7Ci0JCQkJY291bnQrKzsKLQkJCQlpZiAoY291bnQgPT0gdGhpcy5nZXRPY2N1cnJlbmNlKCkpIHsKLQkJCQkJcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyByZXR1cm4gbnVsbCBpZiB0aGUgbWV0aG9kIGlzIG5vIGxvbmdlciBpbiB0aGUgc291cmNlIGNvZGU7Ci0JCS8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGhhcyBub3QgeWV0Ci0JCS8vIGJlZW4gc3luY2hyb25pemVkIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGJ1dCBpcyBzdGlsbAotCQkvLyBhc2tpbmcgZm9yIGFuIEFTVE5vZGUgKGUuZy4gZHVyaW5nIGEgc2VsZWN0aW9uIGV2ZW50KQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE1ldGhvZFNpZ25hdHVyZSBzaWduYXR1cmUsIGludCBvY2N1cnJlbmNlKSB7Ci0JCXJldHVybiB0aGlzLm1hdGNoZXMoc2lnbmF0dXJlKSAmJiAob2NjdXJyZW5jZSA9PSB0aGlzLmdldE9jY3VycmVuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlKSB7Ci0JCXJldHVybiBzaWduYXR1cmUuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmdldE5hbWUoKSkKLQkJCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLnBhcmFtZXRlclR5cGVzLCBzaWduYXR1cmUuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hlcyhNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbikgewotCQlyZXR1cm4gdGhpcy5tYXRjaGVzKEFTVFRvb2xzLmJ1aWxkTWV0aG9kU2lnbmF0dXJlKG1ldGhvZERlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBtZXRob2REZWNsYXJhdGlvbi5wYXJhbWV0ZXJzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJVc2UgI21hdGNoZXMoTWV0aG9kU2lnbmF0dXJlLCBpbnQpLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCU1ldGhvZERlY2xhcmF0aW9uIG1ldGhvZERlY2xhcmF0aW9uID0gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCS8vIHRoZSBkZWNsYXJhdGlvbiBjYW4gYmUgbnVsbCBpZiB0aGUgcmVzb3VyY2UgaXMgb3V0IG9mIHN5bmMgd2l0aCB0aGUgZmlsZSBzeXN0ZW0KLQkJcmV0dXJuIChtZXRob2REZWNsYXJhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5idWlsZFRleHRSYW5nZShtZXRob2REZWNsYXJhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiAiZm9vIiBmb3IgYSBtZXRob2QgbmFtZWQgImdldEZvbyIsICJpc0ZvbyIsICJzZXRGb28iCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gTmFtZVRvb2xzLmNvbnZlcnRHZXR0ZXJTZXR0ZXJNZXRob2ROYW1lVG9Qcm9wZXJ0eU5hbWUodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBJVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZyA9IGdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5yZXNvbHZlQmluZGluZygpOwotCQlyZXR1cm4gKG1ldGhvZEJpbmRpbmcgPT0gbnVsbCkgPyBudWxsIDogbWV0aG9kQmluZGluZy5nZXRSZXR1cm5UeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0YWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJTWV0aG9kQmluZGluZyBiaW5kaW5nID0gdGhpcy5nZXRCaW5kaW5nKGFzdFJvb3QpOwotCQlyZXR1cm4gKGJpbmRpbmcgPT0gbnVsbCkgPyBmYWxzZSA6IEpQVFRvb2xzLm1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihuZXcgSlBUVG9vbHNBZGFwdGVyKGJpbmRpbmcpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXREZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gYXNzdW1lIHRoZSBkZWNsYXJpbmcgdHlwZSBpcyBub3QgYW4gZW51bSBvciBhbm5vdGF0aW9uCi0JCS8vIHNpbmNlIHRoZXkgZG8gbm90IGhhdmUgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9ucwotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJpbmdUeXBlKCkuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2REZWNsYXJhdGlvbltdIGdldERlY2xhcmluZ1R5cGVNZXRob2REZWNsYXJhdGlvbnMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiA9IHRoaXMuZ2V0RGVjbGFyaW5nVHlwZURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCQkvLyB0aGUgZGVjbGFyYXRpb24gY2FuIGJlIG51bGwgaWYgdGhlIHJlc291cmNlIGlzIG91dCBvZiBzeW5jIHdpdGggdGhlIGZpbGUgc3lzdGVtCi0JCXJldHVybiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpID8gRU1QVFlfTUVUSE9EX0RFQ0xBUkFUSU9OX0FSUkFZIDogdHlwZURlY2xhcmF0aW9uLmdldE1ldGhvZHMoKTsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNZXRob2REZWNsYXJhdGlvbltdIEVNUFRZX01FVEhPRF9ERUNMQVJBVElPTl9BUlJBWSA9IG5ldyBNZXRob2REZWNsYXJhdGlvblswXTsKLQotCi0JLy8gKioqKioqKioqKiBKUFRUb29scyBhZGFwdGVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEpQVFRvb2xzIG5lZWRzIGFuIGFkYXB0ZXIgc28gaXQgY2FuIHdvcmsgd2l0aCBlaXRoZXIgYW4gSU1ldGhvZAotCSAqIG9yIGFuIElNZXRob2RCaW5kaW5nIGV0Yy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNpbXBsZUpQVFRvb2xzQWRhcHRlcgotCQlpbXBsZW1lbnRzIEpQVFRvb2xzLlNpbXBsZU1ldGhvZEFkYXB0ZXIKLQl7Ci0JCXByb3RlY3RlZCBmaW5hbCBJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nOwotCi0JCXByb3RlY3RlZCBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoSU1ldGhvZEJpbmRpbmcgbWV0aG9kQmluZGluZykgewotCQkJc3VwZXIoKTsKLQkJCWlmIChtZXRob2RCaW5kaW5nID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubWV0aG9kQmluZGluZyA9IG1ldGhvZEJpbmRpbmc7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0TW9kaWZpZXJzKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpIHsKLQkJCUlUeXBlQmluZGluZyByZXR1cm5UeXBlID0gdGhpcy5tZXRob2RCaW5kaW5nLmdldFJldHVyblR5cGUoKTsKLQkJCXJldHVybiAocmV0dXJuVHlwZSA9PSBudWxsKSA/IG51bGwgOiByZXR1cm5UeXBlLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEVyYXN1cmUoKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgewotCQkJcmV0dXJuIHRoaXMubWV0aG9kQmluZGluZy5pc0NvbnN0cnVjdG9yKCk7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgSlBUVG9vbHNBZGFwdGVyCi0JCWV4dGVuZHMgU2ltcGxlSlBUVG9vbHNBZGFwdGVyCi0JCWltcGxlbWVudHMgSlBUVG9vbHMuTWV0aG9kQWRhcHRlcgotCXsKLQkJcHJvdGVjdGVkIEpQVFRvb2xzQWRhcHRlcihJTWV0aG9kQmluZGluZyBtZXRob2RCaW5kaW5nKSB7Ci0JCQlzdXBlcihtZXRob2RCaW5kaW5nKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRQYXJhbWV0ZXJzTGVuZ3RoKCkgewotCQkJcmV0dXJuIHRoaXMubWV0aG9kQmluZGluZy5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyBKUFRUb29scy5TaW1wbGVNZXRob2RBZGFwdGVyIGdldFNpYmxpbmcoU3RyaW5nIG5hbWUpIHsKLQkJCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IHRoaXMubWV0aG9kQmluZGluZy5nZXREZWNsYXJpbmdDbGFzcygpOwotCQkJaWYgKHR5cGVCaW5kaW5nID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWZvciAoSU1ldGhvZEJpbmRpbmcgc2libGluZyA6IHR5cGVCaW5kaW5nLmdldERlY2xhcmVkTWV0aG9kcygpKSB7Ci0JCQkJaWYgKChzaWJsaW5nLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApCi0JCQkJCQkmJiBzaWJsaW5nLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJcmV0dXJuIG5ldyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoc2libGluZyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSlBUVG9vbHMuU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lLCBTdHJpbmcgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKSB7Ci0JCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSB0aGlzLm1ldGhvZEJpbmRpbmcuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKLQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlmb3IgKElNZXRob2RCaW5kaW5nIHNpYmxpbmcgOiB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotCQkJCUlUeXBlQmluZGluZ1tdIHNpYmxpbmdQYXJtVHlwZXMgPSBzaWJsaW5nLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJaWYgKChzaWJsaW5nUGFybVR5cGVzLmxlbmd0aCA9PSAxKQotCQkJCQkJJiYgc2libGluZy5nZXROYW1lKCkuZXF1YWxzKG5hbWUpCi0JCQkJCQkmJiBzaWJsaW5nUGFybVR5cGVzWzBdLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldEVyYXN1cmUoKS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSkpIHsKLQkJCQkJcmV0dXJuIG5ldyBTaW1wbGVKUFRUb29sc0FkYXB0ZXIoc2libGluZyk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUTW9kaWZpZWREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTY3ZTQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVE1vZGlmaWVkRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVHlwZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlZhcmlhYmxlRGVjbGFyYXRpb25FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5WYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViSXRlcmF0b3JXcmFwcGVyOwotCi0vKioKLSAqIFdyYXAgYW55IG9mIHRoZSBBU1Qgbm9kZXMgdGhhdCBoYXZlIG1vZGlmaWVycyAoc3BlY2lmaWNhbGx5LCBhbm5vdGF0aW9ucyk7Ci0gKiBpLmUuIEJvZHlEZWNsYXJhdGlvbiwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24sCi0gKiBhbmQgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24KLQlpbXBsZW1lbnRzIE1vZGlmaWVkRGVjbGFyYXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXIgYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oQWRhcHRlciBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oQm9keURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IEJvZHlEZWNsYXJhdGlvbkFkYXB0ZXIoZGVjbGFyYXRpb24pKTsKLQl9Ci0JCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oUGFja2FnZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IFBhY2thZ2VEZWNsYXJhdGlvbkFkYXB0ZXIoZGVjbGFyYXRpb24pKTsJCQkKLQl9Ci0KLQlwdWJsaWMgSkRUTW9kaWZpZWREZWNsYXJhdGlvbihTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMobmV3IFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25BZGFwdGVyKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcyhuZXcgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb25BZGFwdGVyKGRlY2xhcmF0aW9uKSk7Ci0JfQotCi0JcHVibGljIEpEVE1vZGlmaWVkRGVjbGFyYXRpb24oVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsYXJhdGlvbikgewotCQl0aGlzKG5ldyBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50QWRhcHRlcihkZWNsYXJhdGlvbikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8QW5ub3RhdGlvbj4gc3RyZWFtID0gdGhpcy5hbm5vdGF0aW9ucygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZChhbm5vdGF0aW9uLCBhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IHRoaXMuZ2V0TW9kaWZpZXJzKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZCgoQW5ub3RhdGlvbikgbW9kaWZpZXIsIGFubm90YXRpb25OYW1lKSkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIG9sZEFubm90YXRpb25OYW1lLCBBbm5vdGF0aW9uIG5ld0Fubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5nZXRNb2RpZmllcnMoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlJRXh0ZW5kZWRNb2RpZmllciBtb2RpZmllciA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobW9kaWZpZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCQlpZiAodGhpcy5hbm5vdGF0aW9uSXNOYW1lZCgoQW5ub3RhdGlvbikgbW9kaWZpZXIsIG9sZEFubm90YXRpb25OYW1lKSkgewotCQkJCQlzdHJlYW0uc2V0KG5ld0Fubm90YXRpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRoaXMuYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIHRvIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiBCeSBjb252ZW50aW9uIGFubm90YXRpb25zIHByZWNlZGUgdGhlICJzdGFuZGFyZCIgKEpMUzIpIG1vZGlmaWVyczsKLQkgKiB0aG91Z2gsIHRlY2huaWNhbGx5LCB0aGV5IGNhbiBiZSBpbnRlcnNwZXJzZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzID0gdGhpcy5nZXRNb2RpZmllcnMoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+IHN0cmVhbSA9IG1vZGlmaWVycy5saXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pc01vZGlmaWVyKCkpIHsKLQkJCQlzdHJlYW0ucHJldmlvdXMoKTsgIC8vIHB1dCB0aGUgYW5ub3RhdGlvbiAqYmVmb3JlKiB0aGUgZmlyc3QgInN0YW5kYXJkIiAoSkxTMikgbW9kaWZpZXIKLQkJCQlzdHJlYW0uYWRkKGFubm90YXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQltb2RpZmllcnMuYWRkKGFubm90YXRpb24pOyAgLy8ganVzdCB0YWNrIGl0IG9uIHRvIHRoZSBlbmQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEFubm90YXRpb24+IGFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhdG9yV3JhcHBlcjxJRXh0ZW5kZWRNb2RpZmllciwgQW5ub3RhdGlvbj4odGhpcy5hbm5vdGF0aW9uc18oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPElFeHRlbmRlZE1vZGlmaWVyPiBhbm5vdGF0aW9uc18oKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8SUV4dGVuZGVkTW9kaWZpZXI+KHRoaXMuZ2V0TW9kaWZpZXJzKCkuaXRlcmF0b3IoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSUV4dGVuZGVkTW9kaWZpZXIgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzQW5ub3RhdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgaW1wb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFkZEltcG9ydChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUuaW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsgIC8vIHRoZSBjbGFzcyBpcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIC0gbm8gbmVlZCBmb3IgaW1wb3J0Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkSW1wb3J0KGNsYXNzTmFtZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZFN0YXRpY0ltcG9ydChTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgewotCQlpbnQgaW5kZXgxID0gZW51bUNvbnN0YW50TmFtZS5pbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleDEgPT0gLTEpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZW51bUNvbnN0YW50TmFtZSk7ICAvLyBzaG91bGRuJ3QgaGFwcGVuPwotCQl9Ci0JCWludCBpbmRleDIgPSBlbnVtQ29uc3RhbnROYW1lLmluZGV4T2YoJy4nLCBpbmRleDEgKyAxKTsKLQkJaWYgKGluZGV4MiA9PSAtMSkgewotCQkJcmV0dXJuIHRydWU7ICAvLyB0aGUgZW51bSBpcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIC0gbm8gbmVlZCBmb3IgaW1wb3J0Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkSW1wb3J0KGVudW1Db25zdGFudE5hbWUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEltcG9ydChTdHJpbmcgaW1wb3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNJbXBvcnQpIHsKLQkJQm9vbGVhbiBpbmNsdWRlID0gdGhpcy5pbXBvcnRzSW5jbHVkZShpbXBvcnROYW1lLCBzdGF0aWNJbXBvcnQpOwotCQlpZiAoaW5jbHVkZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaW5jbHVkZS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCUltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uID0gdGhpcy5nZXRBc3QoKS5uZXdJbXBvcnREZWNsYXJhdGlvbigpOwotCQlpbXBvcnREZWNsYXJhdGlvbi5zZXROYW1lKHRoaXMuZ2V0QXN0KCkubmV3TmFtZShpbXBvcnROYW1lKSk7Ci0JCWltcG9ydERlY2xhcmF0aW9uLnNldFN0YXRpYyhzdGF0aWNJbXBvcnQpOwotCQl0aGlzLmdldEltcG9ydHMoKS5hZGQoaW1wb3J0RGVjbGFyYXRpb24pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IGEgYml0IGhhY2t5OgotCSAqICAgICBSZXR1cm4gQm9vbGVhbi5UUlVFIGlmIHRoZSBpbXBvcnQgaXMgYWxyZWFkeSBwcmVzZW50LgotCSAqICAgICBSZXR1cm4gQm9vbGVhbi5GQUxTRSBpZiBhIGNvbGxpZGluZyBpbXBvcnQgaXMgYWxyZWFkeSBwcmVzZW50LgotCSAqICAgICBSZXR1cm4gbnVsbCBpZiBhIG5ldyBpbXBvcnQgbWF5IGJlIGFkZGVkLgotCSAqIFRoaXMgaGFja2VyeSBhbGxvd3MgdXMgdG8gbG9vcCB0aHJvdWdoIHRoZSBpbXBvcnRzIG9ubHkgb25jZQotCSAqIChhbmQgY29tcG9zZSBvdXIgbWV0aG9kcykuCi0JICogUHJlLWNvbmRpdGlvbjogJ2ltcG9ydE5hbWUnIGlzIG5vdCBpbiB0aGUgImRlZmF1bHQiIHBhY2thZ2UgKGkuZS4gaXQgKmlzKiBxdWFsaWZpZWQpCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW1wb3J0c0luY2x1ZGUoU3RyaW5nIGltcG9ydE5hbWUsIGJvb2xlYW4gc3RhdGljSW1wb3J0KSB7Ci0JCWludCBwZXJpb2QgPSBpbXBvcnROYW1lLmxhc3RJbmRleE9mKCcuJyk7ICAvLyBzaG91bGQgbm90IGJlIC0xCi0JCVN0cmluZyBpbXBvcnROYW1lUXVhbGlmaWVyID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcoMCwgcGVyaW9kKTsKLQkJU3RyaW5nIHNob3J0SW1wb3J0TmFtZSA9IGltcG9ydE5hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOwotCQlyZXR1cm4gdGhpcy5pbXBvcnRzSW5jbHVkZShpbXBvcnROYW1lLCBpbXBvcnROYW1lUXVhbGlmaWVyLCBzaG9ydEltcG9ydE5hbWUsIHN0YXRpY0ltcG9ydCk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNhbGN1bGF0ZSB0aGUgcXVhbGlmaWVyIGFuZCBzaG9ydCBuYW1lCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW1wb3J0c0luY2x1ZGUoU3RyaW5nIGltcG9ydE5hbWUsIFN0cmluZyBpbXBvcnROYW1lUXVhbGlmaWVyLCBTdHJpbmcgc2hvcnRJbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY0ltcG9ydCkgewotCQlmb3IgKEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uIDogdGhpcy5nZXRJbXBvcnRzKCkpIHsKLQkJCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc1N0YXRpYygpID09IHN0YXRpY0ltcG9ydCkgewotCQkJCUJvb2xlYW4gbWF0Y2ggPSB0aGlzLmltcG9ydE1hdGNoZXMoaW1wb3J0RGVjbGFyYXRpb24sIGltcG9ydE5hbWUsIGltcG9ydE5hbWVRdWFsaWZpZXIsIHNob3J0SW1wb3J0TmFtZSk7Ci0JCQkJaWYgKG1hdGNoICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG1hdGNoOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB3ZSBzaG91bGQgYmUgYWJsZSB0byByZWx5IG9uIHRoZSBKRFQgbW9kZWwgaGVyZSwgc2luY2Ugd2UgYXJlIGxvb2tpbmcKLQkgKiBhdCBvYmplY3RzIHRoYXQgc2hvdWxkIG5vdCBiZSBjaGFuZ2luZyB1bmRlcm5lYXRoIHVzLi4uCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW1wb3J0TWF0Y2hlcyhJbXBvcnREZWNsYXJhdGlvbiBpbXBvcnREZWNsYXJhdGlvbiwgU3RyaW5nIGltcG9ydE5hbWUsIFN0cmluZyBpbXBvcnROYW1lUXVhbGlmaWVyLCBTdHJpbmcgc2hvcnRJbXBvcnROYW1lKSB7Ci0JCS8vIGV4YW1wbGVzOgotCQkvLyAnaW1wb3J0TmFtZScgaXMgImphdmEudXRpbC5EYXRlIgotCQkvLyAgICAgb3IKLQkJLy8gJ2ltcG9ydE5hbWUnIGlzICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFIgotCQlTdHJpbmcgaWRuID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQlpZiAoaW1wb3J0TmFtZS5lcXVhbHMoaWRuKSkgewotCQkJLy8gaW1wb3J0IGphdmEudXRpbC5EYXRlOyA9PiAiRGF0ZSIgd2lsbCByZXNvbHZlIHRvICJqYXZhLnV0aWwuRGF0ZSIKLQkJCS8vIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsgPT4gIlRZUEUiIHdpbGwgcmVzb2x2ZSB0byAiamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRSIKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0KLQotCQlTdHJpbmcgc2hvcnRJRE4gPSBpZG4uc3Vic3RyaW5nKGlkbi5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCWlmIChzaG9ydEltcG9ydE5hbWUuZXF1YWxzKHNob3J0SUROKSkgewotCQkJLy8gaW1wb3J0IGphdmEuc3FsLkRhdGU7ID0+IGFtYmlndW91cyByZXNvbHV0aW9uIG9mICJEYXRlIgotCQkJLy8gaW1wb3J0IHN0YXRpYyBvcmcuZm9vLkJhci5UWVBFOyA9PiBhbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiAiVFlQRSIKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0KLQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzT25EZW1hbmQoKSkgewotCQkJaWYgKGltcG9ydE5hbWVRdWFsaWZpZXIuZXF1YWxzKGlkbikpIHsKLQkJCQkvLyBpbXBvcnQgamF2YS51dGlsLio7ID0+ICJEYXRlIiB3aWxsIHJlc29sdmUgdG8gImphdmEudXRpbC5EYXRlIgotCQkJCS8vIGltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuKjsgPT4gIlRZUEUiIHdpbGwgcmVzb2x2ZSB0byAiamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRSIKLQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQkJfQotCQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkpIHsKLQkJCQlpZiAodGhpcy5lbnVtUmVzb2x2ZXMoaWRuLCBzaG9ydEltcG9ydE5hbWUpKSB7Ci0JCQkJCS8vIGltcG9ydCBzdGF0aWMgb3JnLmZvby5CYXIuKjsgPT4gYW1iaWd1b3VzIHJlc29sdXRpb24gb2YgIlRZUEUiCi0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMudHlwZVJlc29sdmVzKGlkbiArICcuJyArIHNob3J0SW1wb3J0TmFtZSkpIHsKLQkJCQkJLy8gaW1wb3J0IGphdmEuc3FsLio7ID0+IGFtYmlndW91cyByZXNvbHV0aW9uIG9mICJEYXRlIgotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gbWF0Y2hlcyAtIE9LIHRvIGFkZCBleHBsaWNpdCBpbXBvcnQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW51bVJlc29sdmVzKFN0cmluZyBlbnVtVHlwZU5hbWUsIFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5lbnVtUmVzb2x2ZXNfKGVudW1UeXBlTmFtZSwgZW51bUNvbnN0YW50TmFtZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW51bVJlc29sdmVzXyhTdHJpbmcgZW51bVR5cGVOYW1lLCBTdHJpbmcgZW51bUNvbnN0YW50TmFtZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlUeXBlIGpkdFR5cGUgPSB0aGlzLmZpbmRUeXBlXyhlbnVtVHlwZU5hbWUpOwotCQlpZiAoamR0VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIGpkdFR5cGUuaXNFbnVtKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKElGaWVsZCBqZHRGaWVsZCA6IGpkdFR5cGUuZ2V0RmllbGRzKCkpIHsKLQkJCWlmIChqZHRGaWVsZC5pc0VudW1Db25zdGFudCgpICYmIGpkdEZpZWxkLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGVudW1Db25zdGFudE5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHR5cGVSZXNvbHZlcyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5maW5kVHlwZShuYW1lKSAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZShTdHJpbmcgbmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZmluZFR5cGVfKG5hbWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZV8oU3RyaW5nIG5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRDb21waWxhdGlvblVuaXQoKS5nZXRKYXZhRWxlbWVudCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8SW1wb3J0RGVjbGFyYXRpb24+IGdldEltcG9ydHMoKSB7Ci0JCXJldHVybiB0aGlzLmltcG9ydHModGhpcy5nZXRDb21waWxhdGlvblVuaXQoKSk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PEltcG9ydERlY2xhcmF0aW9uPiBpbXBvcnRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBhc3RSb290LmltcG9ydHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiBuYW1lIHJlc29sdXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYW5ub3RhdGlvbklzTmFtZWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWFsaWZpZWROYW1lKGFubm90YXRpb24pLmVxdWFscyhuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbHkgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgdW5xdWFsaWZpZWQgbmFtZSBpZiB3ZSBjYW4ndCAicmVzb2x2ZSIgaXQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRRdWFsaWZpZWROYW1lKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBhbm5vdGF0aW9uLnJlc29sdmVUeXBlQmluZGluZygpOwotCQlpZiAodHlwZUJpbmRpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHJlc29sdmVkTmFtZSA9IHR5cGVCaW5kaW5nLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvbHZlZE5hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gaGFjayg/KTogY2hlY2sgZm9yIGEgbWF0Y2hpbmcgaW1wb3J0IGJlY2F1c2Ugd2hlbiBtb3ZpbmcgYSBzdGFuZC1hbG9uZQotCQkvLyBhbm5vdGF0aW9uIHRvIGl0cyBjb250YWluZXIgaW4gQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCQkvLyB0aGUgY29udGFpbmVyJ3MgaW1wb3J0IGlzIGFkZGVkIGJ1dCB0aGVuIGl0IHdvbid0ICJyZXNvbHZlIiB1cG9uCi0JCS8vIHN1YnNlcXVlbnQgbG9va3VwcyAoYmVjYXVzZSB0aGUgcGFyc2VyIGhhc24ndCBoYWQgdGltZSB0byBydW4/KS4uLiA6LSgKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvRnVsbENsYXNzTmFtZShhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIElmIG5lY2Vzc2FyeSwgdXNlIHRoZSBkZWNsYXJhdGlvbidzIGltcG9ydHMgdG8gY2FsY3VsYXRlIGEgZ3Vlc3MgYXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUncyBmdWxseS1xdWFsaWZpZWQgZm9ybS4KLQkgKiBTaW1wbHkgcmV0dXJuIHRoZSB1bnF1YWxpZmllZCBuYW1lIGlmIHdlIGNhbid0ICJyZXNvbHZlIiBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb0Z1bGxDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJLy8gY2hlY2sgZm9yIGZ1bGx5LXF1YWxpZmllZCBuYW1lCi0JCXJldHVybiAobmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSA/IG5hbWUgOiB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0cyhuYW1lLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogSWYgbmVjZXNzYXJ5LCB1c2UgdGhlIGRlY2xhcmF0aW9uJ3MgaW1wb3J0cyB0byBjYWxjdWxhdGUgYSBndWVzcyBhcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZSdzIGZ1bGx5LXF1YWxpZmllZCBmb3JtLgotCSAqIFNpbXBseSByZXR1cm4gdGhlIHVucXVhbGlmaWVkIG5hbWUgaWYgd2UgY2FuJ3QgInJlc29sdmUiIGl0LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvRnVsbEVudW1Db25zdGFudE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaW50IGluZGV4MSA9IG5hbWUuaW5kZXhPZignLicpOwotCQlpZiAoaW5kZXgxID09IC0xKSB7Ci0JCQkvLyBzaG9ydCBuYW1lLCBlLmcuICJUWVBFIgotCQkJLy8gdHJ1ZSA9IGxvb2sgZm9yIHN0YXRpYyBpbXBvcnQgb2YgZW51bSBjb25zdGFudAotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUFnYWluc3RJbXBvcnRzKG5hbWUsIHRydWUpOwotCQl9Ci0KLQkJaW50IGluZGV4MiA9IG5hbWUuaW5kZXhPZignLicsIGluZGV4MSArIDEpOwotCQlpZiAoaW5kZXgyID09IC0xKSB7Ci0JCQkvLyBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUsIGUuZy4gIkVsZW1lbnRUeXBlLlRZUEUiCi0JCQkvLyBmYWxzZSA9IGxvb2sgcmVndWxhciBpbXBvcnQgb2YgZW51bSBjbGFzcywgbm90IHN0YXRpYyBpbXBvcnQgb2YgZW51bSBjb25zdGFudAotCQkJcmV0dXJuIHRoaXMucmVzb2x2ZUFnYWluc3RJbXBvcnRzKG5hbWUsIGZhbHNlKTsKLQkJfQotCi0JCS8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCBlLmcuICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFIgotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0IHRvIHJlc29sdmUgdGhlIHNwZWNpZmllZCAic2hvcnQiIG5hbWUgYWdhaW5zdCB0aGUgZGVjbGFyYXRpb24ncwotCSAqIGltcG9ydHMuIFJldHVybiB0aGUgbmFtZSB1bmNoYW5nZWQgaWYgd2UgY2FuJ3QgcmVzb2x2ZSBpdCAocGVyaGFwcyBpdCBpcwotCSAqIGluIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlQWdhaW5zdEltcG9ydHMoU3RyaW5nIHNob3J0TmFtZSwgYm9vbGVhbiBzdGF0aWNfKSB7Ci0JCWZvciAoSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbGFyYXRpb24gOiB0aGlzLmdldEltcG9ydHMoKSkgewotCQkJaWYgKGltcG9ydERlY2xhcmF0aW9uLmlzU3RhdGljKCkgPT0gc3RhdGljXykgewotCQkJCVN0cmluZyByZXNvbHZlZE5hbWUgPSB0aGlzLnJlc29sdmVBZ2FpbnN0SW1wb3J0KGltcG9ydERlY2xhcmF0aW9uLCBzaG9ydE5hbWUpOwotCQkJCWlmIChyZXNvbHZlZE5hbWUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcmVzb2x2ZWROYW1lOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvcnROYW1lOyAgLy8gImRlZmF1bHQiIHBhY2thZ2Ugb3IgdW5rbm93bgotCX0KLQotCS8qKgotCSAqIEF0dGVtcHQgdG8gcmVzb2x2ZSB0aGUgc3BlY2lmaWVkICJzaG9ydCIgbmFtZSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQKLQkgKiBpbXBvcnQuIFJldHVybiB0aGUgcmVzb2x2ZWQgbmFtZSBpZiB0aGUgaW1wb3J0IHJlc29sdmVzIGl0OyBvdGhlcndpc2UKLQkgKiByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVBZ2FpbnN0SW1wb3J0KEltcG9ydERlY2xhcmF0aW9uIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgc2hvcnROYW1lKSB7Ci0JCVN0cmluZyBpZG4gPSBpbXBvcnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChpbXBvcnREZWNsYXJhdGlvbi5pc09uRGVtYW5kKCkpIHsKLQkJCVN0cmluZyBjYW5kaWRhdGUgPSBpZG4gKyAnLicgKyBzaG9ydE5hbWU7Ci0JCQlpZiAoaW1wb3J0RGVjbGFyYXRpb24uaXNTdGF0aWMoKSkgewotCQkJCWlmICh0aGlzLmVudW1SZXNvbHZlcyhpZG4sIHNob3J0TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNhbmRpZGF0ZTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLnR5cGVSZXNvbHZlcyhjYW5kaWRhdGUpKSB7Ci0JCQkJCXJldHVybiBjYW5kaWRhdGU7Ci0JCQkJfQotCQkJfQotCQkJLy8gbm8gbWF0Y2gKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gZXhwbGljaXQgaW1wb3J0IC0gc2VlIHdoZXRoZXIgaXRzIGVuZCBtYXRjaGVzICdzaG9ydE5hbWUnCi0JCWludCBwZXJpb2QgPSBpZG4ubGVuZ3RoKCkgLSBzaG9ydE5hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAocGVyaW9kIDwgMSkgewotCQkJLy8gc29tZXRoaW5nIG11c3QgcHJlY2VkZSBwZXJpb2QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoaWRuLmNoYXJBdChwZXJpb2QpID09ICcuJykgJiYgaWRuLmVuZHNXaXRoKHNob3J0TmFtZSkpIHsKLQkJCXJldHVybiBpZG47ICAvLyBwcm9iYWJsZSBleGFjdCBtYXRjaAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmF0aW9uJ3MgbGlzdCBvZiBtb2RpZmllcnMuCi0JICogRWxlbWVudCB0eXBlOiBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSUV4dGVuZGVkTW9kaWZpZXIKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldE1vZGlmaWVycygpOwotCX0KLQotCXB1YmxpYyBBU1QgZ2V0QXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldEFTVCgpOwotCX0KLQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gKENvbXBpbGF0aW9uVW5pdCkgdGhpcy5nZXREZWNsYXJhdGlvbigpLmdldFJvb3QoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmFkYXB0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlY2xhcmF0aW9uIGFkYXB0ZXIgaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmaW5lIGNvbW1vbiBwcm90b2NvbCBhbW9uZyB0aGUgdmFyaW91cyAiZGVjbGFyYXRpb25zIi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFkYXB0ZWQgImRlY2xhcmF0aW9uIi4KLQkJICovCi0JCUFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSAiZGVjbGFyYXRpb24iJ3MgbGlzdCBvZiBtb2RpZmllcnMuCi0JCSAqIEVsZW1lbnQgdHlwZTogb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyCi0JCSAqLwotCQlMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQm9keURlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIEJvZHlEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKLQkJcHVibGljIEJvZHlEZWNsYXJhdGlvbkFkYXB0ZXIoQm9keURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGVjbGFyYXRpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQYWNrYWdlRGVjbGFyYXRpb25BZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgUGFja2FnZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uOwotCQlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uQWRhcHRlcihQYWNrYWdlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLmFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCS8qcHVibGljIHN0YXRpYyBjbGFzcyBBU1ROb2RlQWRhcHRlciBpbXBsZW1lbnRzIEFkYXB0ZXIgewotCQlwcml2YXRlIGZpbmFsIEFTVE5vZGUgZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBBU1ROb2RlQWRhcHRlcihBU1ROb2RlIGRlY2xhcmF0aW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWNsYXJhdGlvbiA9IGRlY2xhcmF0aW9uOwotCQl9Ci0JCXB1YmxpYyBBU1ROb2RlIGdldERlY2xhcmF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb247Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBnZXRNb2RpZmllcnMoKSB7Ci0JCQlpZiAoZGVjbGFyYXRpb24gaW5zdGFuY2VvZiBCb2R5RGVjbGFyYXRpb24pIHsKLQkJCQlyZXR1cm4gKChCb2R5RGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uKS5tb2RpZmllcnMoKTsJCQkJCi0JCQl9IGVsc2UgaWYgKGRlY2xhcmF0aW9uIGluc3RhbmNlb2YgUGFja2FnZURlY2xhcmF0aW9uKSB7Ci0JCQkJcmV0dXJuICgoUGFja2FnZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbikuYW5ub3RhdGlvbnMoKTsJCQkJCi0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfSovCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25BZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbjsKLQkJcHVibGljIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb25BZGFwdGVyKFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLm1vZGlmaWVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb25BZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gZGVjbGFyYXRpb247Ci0JCXB1YmxpYyBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbkFkYXB0ZXIoVmFyaWFibGVEZWNsYXJhdGlvbkV4cHJlc3Npb24gZGVjbGFyYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlY2xhcmF0aW9uID0gZGVjbGFyYXRpb247Ci0JCX0KLQkJcHVibGljIEFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQkJfQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uLm1vZGlmaWVycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kZWNsYXJhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudEFkYXB0ZXIgaW1wbGVtZW50cyBBZGFwdGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50IGRlY2xhcmF0aW9uOwotCQlwdWJsaWMgVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudEFkYXB0ZXIoVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCBkZWNsYXJhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQkJfQotCQlwdWJsaWMgQVNUTm9kZSBnZXREZWNsYXJhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmRlY2xhcmF0aW9uOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gZ2V0TW9kaWZpZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuZGVjbGFyYXRpb24ubW9kaWZpZXJzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlY2xhcmF0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRQYWNrYWdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWY3NzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIE9yYWNsZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JUGFja2FnZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBKRFRQYWNrYWdlCi0JZXh0ZW5kcyBKRFRBbm5vdGF0ZWRFbGVtZW50IAotCWltcGxlbWVudHMgQW5ub3RhdGVkUGFja2FnZQotewotCXByb3RlY3RlZCBKRFRQYWNrYWdlKFBhY2thZ2VEZWNsYXJhdGlvbiBkZWNsYXJpbmdQYWNrYWdlLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsCi0JCQlDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IpIHsKLQkJc3VwZXIoZGVjbGFyaW5nUGFja2FnZS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksIAotCQkJCWNvbXBpbGF0aW9uVW5pdCwKLQkJCQltb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcik7Ci0JfQotCi0JcHVibGljIEpEVFBhY2thZ2UoCi0JCQlQYWNrYWdlRGVjbGFyYXRpb24gZGVjbGFyaW5nUGFja2FnZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nUGFja2FnZS5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCksCi0JCQkJY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RpZmllZERlY2xhcmF0aW9uIGdldE1vZGlmaWVkRGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKRFRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJUGFja2FnZURlY2xhcmF0aW9uIHBkID0gdGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCk7Ci0JCXJldHVybiAocGQgPT0gbnVsbCkgPyBudWxsIDogcGQucmVzb2x2ZUJpbmRpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUGFja2FnZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gYXN0Um9vdC5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBBU1RUb29scy5idWlsZFRleHRSYW5nZSh0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L0pEVFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTViZWY4OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BYnN0cmFjdFR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkZpZWxkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWV0aG9kRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLQotLyoqCi0gKiBBZGFwdCBhbmQgZXh0ZW5kIGEgSkRUIHR5cGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRFRUeXBlCi0JZXh0ZW5kcyBBYnN0cmFjdEpEVFR5cGUKLQlpbXBsZW1lbnRzIFR5cGUKLXsKLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZQotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzKHR5cGVEZWNsYXJhdGlvbiwgY29tcGlsYXRpb25Vbml0LCBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwgRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnN0cnVjdG9yIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCdzIHByaW1hcnkgdHlwZQotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwKLQkJCUNvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvciwKLQkJCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGFubm90YXRpb25FZGl0Rm9ybWF0dGVyKSB7Ci0JCXRoaXMobnVsbCwgdHlwZURlY2xhcmF0aW9uLCAxLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXRoaXMoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIG5lc3RlZCB0eXBlcwotCSAqLwotCXB1YmxpYyBKRFRUeXBlKAotCQkJVHlwZSBkZWNsYXJpbmdUeXBlLAotCQkJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgIC8vIGV4Y2x1ZGUgYW5ub3RhdGlvbnMgYW5kIGVudW1zCi0JCQlpbnQgb2NjdXJyZW5jZSwKLQkJCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0LAotCQkJQ29tbWFuZEV4ZWN1dG9yIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLAotCQkJQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgYW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgdHlwZURlY2xhcmF0aW9uLCBvY2N1cnJlbmNlLCBjb21waWxhdGlvblVuaXQsIG1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yLCBhbm5vdGF0aW9uRWRpdEZvcm1hdHRlcik7Ci0JfQotCi0JLyoqCi0JICogY29uc3RydWN0b3IgZm9yIHRlc3RpbmcKLQkgKi8KLQlwdWJsaWMgSkRUVHlwZShUeXBlIGRlY2xhcmluZ1R5cGUsIFN0cmluZyBuYW1lLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJc3VwZXIoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWVtYmVyL1R5cGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogZmluZCB0aGUgdHlwZSdzIGJvZHkgZGVjbGFyYXRpb24gaW4gdGhlIHNwZWNpZmllZCBBU1QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVHlwZURlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKFR5cGVEZWNsYXJhdGlvbikgc3VwZXIuZ2V0Qm9keURlY2xhcmF0aW9uKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSVR5cGVCaW5kaW5nIGJpbmRpbmcgPSB0aGlzLmdldEJpbmRpbmcoYXN0Um9vdCk7Ci0JCXJldHVybiAoYmluZGluZyA9PSBudWxsKSA/IGZhbHNlIDogSlBUVG9vbHMudHlwZUlzUGVyc2lzdGFibGUobmV3IEpQVFRvb2xzQWRhcHRlcihiaW5kaW5nKSk7Ci0JfQotCi0JcHVibGljIFR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXRUeXBlcygpOwotCX0KLQotCXB1YmxpYyBFbnVtRGVjbGFyYXRpb25bXSBnZXRFbnVtcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RW51bXModGhpcy5nZXRCb2R5RGVjbGFyYXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBGaWVsZERlY2xhcmF0aW9uW10gZ2V0RmllbGRzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXRGaWVsZHMoKTsKLQl9Ci0KLQlwdWJsaWMgTWV0aG9kRGVjbGFyYXRpb25bXSBnZXRNZXRob2RzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEJvZHlEZWNsYXJhdGlvbihhc3RSb290KS5nZXRNZXRob2RzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsICoqKioqKioqKioKLQotCS8qKgotCSAqIHJldHVybiB0aGUgZmlyc3QgdG9wLWxldmVsIHR5cGUgaW4gdGhlIHNwZWNpZmllZCBBU1Qgd2l0aCBhIG1hdGNoaW5nIG5hbWUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldFRvcExldmVsVHlwZURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSBzdXBlci5nZXRUb3BMZXZlbFR5cGVEZWNsYXJhdGlvbihhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbihMaXN0PEFic3RyYWN0VHlwZURlY2xhcmF0aW9uPiB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSBzdXBlci5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucyk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBuZXN0ZWQgdHlwZSB3aXRoIGEgbWF0Y2hpbmcgbmFtZSBhbmQgb2NjdXJyZW5jZQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlRGVjbGFyYXRpb24gZ2V0TmVzdGVkVHlwZURlY2xhcmF0aW9uKFR5cGVEZWNsYXJhdGlvbiBkZWNsYXJpbmdUeXBlRGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZURlY2xhcmF0aW9uKGRlY2xhcmluZ1R5cGVEZWNsYXJhdGlvbi5nZXRUeXBlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gdGhlIHR5cGUgZGVjbGFyYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBmcm9tIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXQgb2YgdHlwZSBkZWNsYXJhdGlvbnMgKG1hdGNoIG5hbWUgYW5kIG9jY3VycmVuY2UpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oQWJzdHJhY3RUeXBlRGVjbGFyYXRpb25bXSB0eXBlRGVjbGFyYXRpb25zKSB7Ci0JCXJldHVybiAoVHlwZURlY2xhcmF0aW9uKSBzdXBlci5nZXRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9ucyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXRBU1ROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEFTVE5vZGUuVFlQRV9ERUNMQVJBVElPTjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSlBUIHRvb2xzIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBKUFRUb29sc0FkYXB0ZXIgaW1wbGVtZW50cyBKUFRUb29scy5UeXBlQWRhcHRlciB7Ci0JCXByaXZhdGUgZmluYWwgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nOwotCQlwcm90ZWN0ZWQgSlBUVG9vbHNBZGFwdGVyKElUeXBlQmluZGluZyB0eXBlQmluZGluZykgewotCQkJc3VwZXIoKTsKLQkJCWlmICh0eXBlQmluZGluZyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnR5cGVCaW5kaW5nID0gdHlwZUJpbmRpbmc7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1vZGlmaWVycygpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmdldE1vZGlmaWVycygpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNBbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Fub255bW91cygpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzQW5vbnltb3VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNBcnJheSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbnVtKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNFbnVtKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZmFjZSgpIHsKLQkJCXJldHVybiB0aGlzLnR5cGVCaW5kaW5nLmlzSW50ZXJmYWNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgewotCQkJcmV0dXJuIHRoaXMudHlwZUJpbmRpbmcuaXNMb2NhbCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNNZW1iZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc01lbWJlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50eXBlQmluZGluZy5pc1ByaW1pdGl2ZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KUFRUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSlBUVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MzBjOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9KUFRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgSlBBLXJlbGF0ZWQgcXVlcmllcyBjb25jZXJuaW5nIEpEVCBvYmplY3RzLgotICovCi0vL1RPRE8gdGhpcyBuZWVkcyB0byBtb3ZlIGJlY2F1c2UgaXQgaXMgb25seSB1c2VkIGZvciBKUEEKLXB1YmxpYyBjbGFzcyBKUFRUb29scyB7Ci0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB0eXBlIGNhbiBiZSAicGVyc2lzdGVkIiwgaS5lLiBtYXJrZWQgYXMKLQkgKiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MsIEVtYmVkZGFibGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUlzUGVyc2lzdGFibGUoVHlwZUFkYXB0ZXIgdHlwZUFkYXB0ZXIpIHsKLQkJaWYgKHR5cGVBZGFwdGVyLmlzSW50ZXJmYWNlKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNFbnVtKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNMb2NhbCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzQW5vbnltb3VzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAodHlwZUFkYXB0ZXIuaXNQcmltaXRpdmUoKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlKD8pCi0JCX0KLQkJaWYgKHR5cGVBZGFwdGVyLmlzQXJyYXkoKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlKD8pCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUXVlcmllcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgYSB0eXBlIGlzICJwZXJzaXN0YWJsZSIuCi0JICogQWRhcHRlZCB0byBJVHlwZUJpbmRpbmcgYW5kIElUeXBlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgVHlwZUFkYXB0ZXIgewotCQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0JCWJvb2xlYW4gaXNBbm5vdGF0aW9uKCk7Ci0JCWJvb2xlYW4gaXNBbm9ueW1vdXMoKTsKLQkJYm9vbGVhbiBpc0FycmF5KCk7Ci0JCWJvb2xlYW4gaXNFbnVtKCk7Ci0JCWJvb2xlYW4gaXNJbnRlcmZhY2UoKTsKLQkJYm9vbGVhbiBpc0xvY2FsKCk7Ci0JCWJvb2xlYW4gaXNNZW1iZXIoKTsKLQkJYm9vbGVhbiBpc1ByaW1pdGl2ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWVsZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpZWxkIG1heSBiZSAicGVyc2lzdGVkIi4KLQkgKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsICJBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgdGhhdCBhcmUgbm90IAotCSAqIGFubm90YXRlZCB3aXRoIHRoZSBUcmFuc2llbnQgYW5ub3RhdGlvbiBhcmUgcGVyc2lzdGVudC4iCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpZWxkSXNQZXJzaXN0YWJsZShGaWVsZEFkYXB0ZXIgZmllbGRBZGFwdGVyKSB7Ci0JCWludCBtb2RpZmllcnMgPSBmaWVsZEFkYXB0ZXIuZ2V0TW9kaWZpZXJzKCk7Ci0JCWlmIChNb2RpZmllci5pc1N0YXRpYyhtb2RpZmllcnMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKE1vZGlmaWVyLmlzVHJhbnNpZW50KG1vZGlmaWVycykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBRdWVyaWVzIG5lZWRlZCB0byBjYWxjdWxhdGUgd2hldGhlciBhIGZpZWxkIGlzICJwZXJzaXN0YWJsZSIuCi0JICogQWRhcHRlZCB0byBJVmFyaWFibGVCaW5kaW5nIGFuZCBJRmllbGQuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBGaWVsZEFkYXB0ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBmaWVsZCdzIG1vZGlmaWVycy4gV2UgdXNlIHRoZXNlIHRvIGNoZWNrIHdoZXRoZXIgdGhlCi0JCSAqIGZpZWxkIGlzIHN0YXRpYyBvciB0cmFuc2llbnQuCi0JCSAqLwotCQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG1ldGhvZCBpcyBhICJnZXR0ZXIiIG1ldGhvZCB0aGF0Ci0JICogcmVwcmVzZW50cyBhIHByb3BlcnR5IHRoYXQgbWF5IGJlICJwZXJzaXN0ZWQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBtZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIoTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyKSB7Ci0JCWlmIChtZXRob2RIYXNJbnZhbGlkTW9kaWZpZXJzKG1ldGhvZEFkYXB0ZXIpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEFkYXB0ZXIuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSBtZXRob2RBZGFwdGVyLmdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpOwotCQlpZiAocmV0dXJuVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gRE9NIG1ldGhvZCBiaW5kaW5ncyBjYW4gaGF2ZSBhIG51bGwgbmFtZQotCQl9Ci0JCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEhhc1BhcmFtZXRlcnMobWV0aG9kQWRhcHRlcikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyBuYW1lID0gbWV0aG9kQWRhcHRlci5nZXROYW1lKCk7Ci0JCWludCBiZWdpbkluZGV4ID0gMDsKLQkJYm9vbGVhbiBib29sZWFuR2V0dGVyID0gZmFsc2U7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygiYm9vbGVhbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliZWdpbkluZGV4ID0gMjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYmVnaW5JbmRleCA9IDM7Ci0JCQlpZiAocmV0dXJuVHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJvb2xlYW5HZXR0ZXIgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSA9IG5hbWUuc3Vic3RyaW5nKGJlZ2luSW5kZXgpOwotCQkvLyBpZiB0aGUgdHlwZSBoYXMgYm90aCBtZXRob2RzOgotCQkvLyAgICAgYm9vbGVhbiBpc1Byb3BlcnR5KCkKLQkJLy8gICAgIGJvb2xlYW4gZ2V0UHJvcGVydHkoKQotCQkvLyB0aGVuICNpc1Byb3BlcnR5KCkgdGFrZXMgcHJlY2VkZW5jZSBhbmQgd2UgaWdub3JlICNnZXRQcm9wZXJ0eSgpOwotCQkvLyBidXQgb25seSBoYXZpbmcgI2dldFByb3BlcnR5KCkgaXMgT0sgdG9vCi0JCS8vIChzZWUgdGhlIEphdmFCZWFucyBzcGVjIDEuMDEpCi0JCWlmIChib29sZWFuR2V0dGVyICYmIG1ldGhvZEhhc1ZhbGlkU2libGluZ0lzTWV0aG9kKG1ldGhvZEFkYXB0ZXIsIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHNpbmNlIHRoZSB0eXBlIGFsc28gZGVmaW5lcyAjaXNQcm9wZXJ0eSgpLCBpZ25vcmUgI2dldFByb3BlcnR5KCkKLQkJfQotCQlyZXR1cm4gbWV0aG9kSGFzVmFsaWRTaWJsaW5nU2V0TWV0aG9kKG1ldGhvZEFkYXB0ZXIsIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSwgcmV0dXJuVHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QncyBtb2RpZmllcnMgcHJldmVudCBpdAotCSAqIGZyb20gYmVpbmcgYSBnZXR0ZXIgb3Igc2V0dGVyIGZvciBhICJwZXJzaXN0ZW50IiBwcm9wZXJ0eS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc0ludmFsaWRNb2RpZmllcnMoU2ltcGxlTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyKSB7Ci0JCWludCBtb2RpZmllcnMgPSBtZXRob2RBZGFwdGVyLmdldE1vZGlmaWVycygpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzUGFyYW1ldGVycyhNZXRob2RBZGFwdGVyIG1ldGhvZEFkYXB0ZXIpIHsKLQkJcmV0dXJuIG1ldGhvZEFkYXB0ZXIuZ2V0UGFyYW1ldGVyc0xlbmd0aCgpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBoYXMgYSBzaWJsaW5nICJpcyIgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgYW5kIHRoYXQgbWV0aG9kIGlzIHZhbGlkIGZvciBhICJwZXJzaXN0YWJsZSIgcHJvcGVydHkuCi0JICogUHJlLWNvbmRpdGlvbjogdGhlIG1ldGhvZCBpcyBhICJib29sZWFuIGdldHRlciIgKGUuZy4gJ3B1YmxpYyBib29sZWFuIGdldFByb3BlcnR5KCknKTsKLQkgKiB0aGlzIHByZXZlbnRzIHVzIGZyb20gcmV0dXJuaW5nIHRydWUgd2hlbiB0aGUgbWV0aG9kIGl0c2VsZiBpcyBhbgotCSAqICJpcyIgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzVmFsaWRTaWJsaW5nSXNNZXRob2QoTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyLCBTdHJpbmcgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lKSB7Ci0JCVNpbXBsZU1ldGhvZEFkYXB0ZXIgaXNNZXRob2RBZGFwdGVyID0gbWV0aG9kQWRhcHRlci5nZXRTaWJsaW5nKCJpcyIgKyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtZXRob2RJc1ZhbGlkU2libGluZyhpc01ldGhvZEFkYXB0ZXIsICJib29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIGhhcyBhIHNpYmxpbmcgInNldCIgbWV0aG9kCi0JICogYW5kIHRoYXQgbWV0aG9kIGlzIHZhbGlkIGZvciBhICJwZXJzaXN0YWJsZSIgcHJvcGVydHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNWYWxpZFNpYmxpbmdTZXRNZXRob2QoTWV0aG9kQWRhcHRlciBtZXRob2RBZGFwdGVyLCBTdHJpbmcgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lLCBTdHJpbmcgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKSB7Ci0JCVNpbXBsZU1ldGhvZEFkYXB0ZXIgc2V0TWV0aG9kQWRhcHRlciA9IG1ldGhvZEFkYXB0ZXIuZ2V0U2libGluZygic2V0IiArIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSwgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoc2V0TWV0aG9kQWRhcHRlciwgInZvaWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGEgdmFsaWQgc2libGluZyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCByZXR1cm4gdHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZElzVmFsaWRTaWJsaW5nKFNpbXBsZU1ldGhvZEFkYXB0ZXIgbWV0aG9kQWRhcHRlciwgU3RyaW5nIHJldHVyblR5cGVOYW1lKSB7Ci0JCWlmIChtZXRob2RBZGFwdGVyID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhtZXRob2RBZGFwdGVyKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtZXRob2RBZGFwdGVyLmlzQ29uc3RydWN0b3IoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBydE5hbWUgPSBtZXRob2RBZGFwdGVyLmdldFJldHVyblR5cGVFcmFzdXJlTmFtZSgpOwotCQlpZiAocnROYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIERPTSBtZXRob2QgYmluZGluZ3MgY2FuIGhhdmUgYSBudWxsIG5hbWUKLQkJfQotCQlyZXR1cm4gcnROYW1lLmVxdWFscyhyZXR1cm5UeXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUXVlcmllcyBuZWVkZWQgdG8gY2FsY3VsYXRlIHdoZXRoZXIgYSBtZXRob2QgaXMgInBlcnNpc3RhYmxlIi4KLQkgKiBBZGFwdGVkIHRvIElNZXRob2RCaW5kaW5nIGFuZCBJTWV0aG9kLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgU2ltcGxlTWV0aG9kQWRhcHRlciB7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIG1vZGlmaWVycy4KLQkJICogV2UgdXNlIHRoZXNlIHRvIGNoZWNrIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBzdGF0aWMsIGZpbmFsLCBldGMuCi0JCSAqLwotCQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgZXJhc3VyZS4KLQkJICogV2UgdXNlIHRoaXMgdG8gY2hlY2sgZm9yCi0JCSAqICAgLSBib29sZWFuIGdldHRlcnMKLQkJICogICAtIHZvaWQgcmV0dXJuIHR5cGVzCi0JCSAqICAgLSBtYXRjaGluZyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCi0JCSAqLwotCQlTdHJpbmcgZ2V0UmV0dXJuVHlwZUVyYXN1cmVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QgaXMgYSBjb25zdHJ1Y3Rvci4KLQkJICovCi0JCWJvb2xlYW4gaXNDb25zdHJ1Y3RvcigpOwotCX0KLQotCS8qKgotCSAqIFF1ZXJpZXMgbmVlZGVkIHRvIGNhbGN1bGF0ZSB3aGV0aGVyIGEgbWV0aG9kIGlzICJwZXJzaXN0YWJsZSIuCi0JICogQWRhcHRlZCB0byBJTWV0aG9kQmluZGluZyBhbmQgSU1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1ldGhvZEFkYXB0ZXIgZXh0ZW5kcyBTaW1wbGVNZXRob2RBZGFwdGVyIHsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgbmFtZS4KLQkJICogV2UgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lCi0JCSAqICAgLSB3aGV0aGVyIHRoZSBtZXRob2QgaXMgYSAiZ2V0dGVyIgotCQkgKiAgIC0gdGhlIHByb3BlcnR5IG5hbWUgaW1wbGllZCBieSB0aGUgZ2V0dGVyJ3MgbmFtZQotCQkgKi8KLQkJU3RyaW5nIGdldE5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcGFyYW10ZXJzIGRlY2xhcmVkIGJ5IHRoZSBtZXRob2QuCi0JCSAqIFdlIHVzZSB0aGlzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBtZXRob2QgaXMgYSAiZ2V0dGVyIi4KLQkJICovCi0JCWludCBnZXRQYXJhbWV0ZXJzTGVuZ3RoKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbWV0aG9kJ3MgInNpYmxpbmciIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBubyBwYXJhbWV0ZXJzLgotCQkgKiBXZSB1c2UgdGhpcyB0byBmaW5kIGFuICJpcyIgYm9vbGVhbiBnZXR0ZXIgdGhhdCB3b3VsZCB0YWtlIHByZWNlZGVuY2UKLQkJICogb3ZlciBhICJnZXQiIGJvb2xlYW4gZ2V0dGVyLgotCQkgKi8KLQkJU2ltcGxlTWV0aG9kQWRhcHRlciBnZXRTaWJsaW5nKFN0cmluZyBuYW1lKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBtZXRob2QncyAic2libGluZyIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHNpbmdsZSBwYXJhbWV0ZXIuCi0JCSAqIFdlIHVzZSB0aGlzIHRvIGZpbmQgYSBtYXRjaGluZyAic2V0dGVyIiBmb3IgYSBwb3NzaWJsZSAiZ2V0dGVyIi4KLQkJICovCi0JCVNpbXBsZU1ldGhvZEFkYXB0ZXIgZ2V0U2libGluZyhTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1cHByZXNzZWQgY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEpQVFRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzliYzQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIG5hbWUgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG5hbWUvaWRlbnRpZmllcgotICogKGUuZy4gImNvbS54eHguRm9vLlZBTFVFMSIgb3IgInZhbHVlIikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgTmFtZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE5hbWVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlyZXR1cm4gYXN0Lm5ld05hbWUoc3RyaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgewotCQlzd2l0Y2ggKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBBU1ROb2RlLlFVQUxJRklFRF9OQU1FOgotCQkJY2FzZSBBU1ROb2RlLlNJTVBMRV9OQU1FOgotCQkJCXJldHVybiAoKE5hbWUpIGV4cHJlc3Npb24pLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ViOTU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBNYW5pcHVsYXRlIGFuIGFubm90YXRpb24gdGhhdCBpcyBlbWJlZGRlZCBhcyBhbiBlbGVtZW50IHdpdGhpbgotICogYW5vdGhlciBhbm5vdGF0aW9uLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIpCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiAgICAgICAgIG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIgPSBBbm5vdGF0aW9uQWRhcHRlcjwmIzY0O091dGVyPgotICogICAgICAgICBlbGVtZW50TmFtZSA9ICJmb28iCi0gKiAgICAgICAgIGFubm90YXRpb25OYW1lID0gIklubmVyIgotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBlbGVtZW50IG5hbWUgaXMgPGNvZGU+dmFsdWU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgb3V0ZXJBbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKG91dGVyQW5ub3RhdGlvbkFkYXB0ZXIsIGFubm90YXRpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlbW92ZSB0aGUgb3V0ZXIgYW5ub3RhdGlvbiB3aGVuIGl0IGlzIGVtcHR5Ci0JICovCi0JcHVibGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBvdXRlckFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihvdXRlckFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb25WYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYnVpbGROZXdJbm5lckV4cHJlc3Npb24oQW5ub3RhdGlvbiBpbm5lcikgewotCQlyZXR1cm4gaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogdGhlIGFubm90YXRpb24gaXMgdGhlIGV4cHJlc3Npb24gaXRzZWxmLCBzbyB0aGUgYW5ub3RhdGlvbiBjYW5ub3QgYmUKLQkgKiAicmVtb3ZlZCIgZnJvbSBpdHNlbGYgLSByZXR1cm4gJ2ZhbHNlJwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHByZT4KLQkgKiAmIzY0O091dGVyKCJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcikKLQkgKiA8L3ByZT4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlBbm5vdGF0aW9uVmFsdWUoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBvdXRlciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQkvLyByZXBsYWNlKD8pIHRoZSBjdXJyZW50IGVsZW1lbnQgdmFsdWUKLQkJb3V0ZXIuc2V0VmFsdWUoaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIFNpbXBseSBzZXQgdGhlIHBhaXIncyB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RpZnlNZW1iZXJWYWx1ZVBhaXIoTWVtYmVyVmFsdWVQYWlyIHBhaXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJcGFpci5zZXRWYWx1ZShpbm5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmZDc0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFycmF5SW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogTWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHRoYXQgaXMgZW1iZWRkZWQgaW4gYW4gZWxlbWVudCBhcnJheSB3aXRoaW4KLSAqIGFub3RoZXIgYW5ub3RhdGlvbiwgZS5nLgotICogPHByZT4KLSAqICAgICAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigiemVybyIpLCAmIzY0O0lubmVyKCJvbmUiKSwgJiM2NDtJbm5lcigidHdvIil9KQotICogICAgIHByaXZhdGUgaW50IGlkOwotICogICAgICAgICBvdXRlckFubm90YXRpb25BZGFwdGVyID0gQW5ub3RhdGlvbkFkYXB0ZXI8JiM2NDtPdXRlcj4KLSAqICAgICAgICAgZWxlbWVudE5hbWUgPSAiZm9vIgotICogICAgICAgICBpbmRleCA9IDAtMgotICogICAgICAgICBhbm5vdGF0aW9uTmFtZSA9ICJJbm5lciIKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWltcGxlbWVudHMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQlwcml2YXRlIGludCBpbmRleDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZWxlbWVudCBuYW1lIGlzIDxjb2RlPnZhbHVlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgaW50IGluZGV4LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJc3VwZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGFubm90YXRpb25OYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCX0KLQotCXB1YmxpYyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIGludCBpbmRleCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXN1cGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgYW5ub3RhdGlvbk5hbWUpOwotCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbigoQXJyYXlJbml0aWFsaXplcikgdmFsdWUpOwotCQl9Ci0JCXJldHVybiAodGhpcy5pbmRleCA9PSAwKSA/IHRoaXMuYW5ub3RhdGlvblZhbHVlKHZhbHVlKSA6IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEV4cHJlc3Npb24gYnVpbGROZXdJbm5lckV4cHJlc3Npb24oQW5ub3RhdGlvbiBpbm5lcikgewotCQlyZXR1cm4gKHRoaXMuaW5kZXggPT0gMCkgPyBpbm5lciA6IChFeHByZXNzaW9uKSB0aGlzLmJ1aWxkTmV3SW5uZXJBcnJheUluaXRpYWxpemVyKGlubmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdXRlciwgKEFycmF5SW5pdGlhbGl6ZXIpIHZhbHVlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIG91ciBpbmRleCBpcyBncmVhdGVyIHRoYW4gemVybywgYnV0IHdlIGRvbid0IGhhdmUgYW4gYXJyYXksCi0JCS8vIHRoZW4gdGhlIGFubm90YXRpb24gbXVzdCBhbHJlYWR5IGJlIGdvbmUKLQkJcmV0dXJuICh0aGlzLmluZGV4ICE9IDApOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcih7JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pID0+ICYjNjQ7T3V0ZXIoeyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSksICYjNjQ7SW5uZXIoMil9KQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoImxvcmVtIGlwc3VtIikgPT4gJiM2NDtPdXRlcigmIzY0O0lubmVyKDApKQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoJiM2NDtJbm5lcigwKSkgPT4gJiM2NDtPdXRlcih7JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pCi0JICogPC9wcmU+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW9kaWZ5QW5ub3RhdGlvblZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gb3V0ZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJdGhpcy5tb2RpZnlFeHByZXNzaW9uKG91dGVyLCBTSU5HTEVfTUVNQkVSX0FOTk9UQVRJT05fRVhQUkVTU0lPTl9QUk9WSURFUiwgaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIDxwcmU+Ci0JICogJiM2NDtPdXRlcih0ZXh0PSJsb3JlbSBpcHN1bSIpID0+ICYjNjQ7T3V0ZXIodGV4dD0ibG9yZW0gaXBzdW0iLCBmb289JiM2NDtJbm5lcigwKSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz17JiM2NDtJbm5lcigwKSwgJiM2NDtJbm5lcigxKX0pID0+ICYjNjQ7T3V0ZXIoZm9vPXsmIzY0O0lubmVyKDApLCAmIzY0O0lubmVyKDEpLCAmIzY0O0lubmVyKDIpfSkKLQkgKiAgICAgb3IKLQkgKiAmIzY0O091dGVyKGZvbz0ibG9yZW0gaXBzdW0iKSA9PiAmIzY0O091dGVyKGZvbz0mIzY0O0lubmVyKDApKQotCSAqICAgICBvcgotCSAqICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7Tm90SW5uZXIpID0+ICYjNjQ7T3V0ZXIoZm9vPSYjNjQ7SW5uZXIoMCkpCi0JICogICAgIG9yCi0JICogJiM2NDtPdXRlcihmb289JiM2NDtJbm5lcigwKSkgPT4gJiM2NDtPdXRlcihmb289eyYjNjQ7SW5uZXIoMCksICYjNjQ7SW5uZXIoMSl9KQotCSAqIDwvcHJlPgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIG1vZGlmeU1lbWJlclZhbHVlUGFpcihNZW1iZXJWYWx1ZVBhaXIgcGFpciwgQW5ub3RhdGlvbiBpbm5lcikgewotCQl0aGlzLm1vZGlmeUV4cHJlc3Npb24ocGFpciwgTUVNQkVSX1ZBTFVFX1BBSVJfRVhQUkVTU0lPTl9QUk9WSURFUiwgaW5uZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5pbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBhbm5vdGF0aW9uIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXgsIGxlYXZpbmcgaXRzIG9yaWdpbmFsCi0JICogcG9zaXRpb24gY2xlYXJlZCBvdXQuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCWludCBvbGRJbmRleCA9IHRoaXMuaW5kZXg7Ci0JCWlmIChuZXdJbmRleCA9PSBvbGRJbmRleCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQW5ub3RhdGlvbiBvcmlnaW5hbCA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmluZGV4ID0gbmV3SW5kZXg7Ci0JCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOyAgLy8gY2xlYXIgb3V0IHRoZSBuZXcgbG9jYXRpb24gKD8pCi0JCX0gZWxzZSB7Ci0JCQlBbm5vdGF0aW9uIGNvcHkgPSAoQW5ub3RhdGlvbikgQVNUTm9kZS5jb3B5U3VidHJlZShvcmlnaW5hbC5nZXRBU1QoKSwgb3JpZ2luYWwpOwotCQkJdGhpcy5pbmRleCA9IG5ld0luZGV4OwotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBjb3B5KTsgIC8vIGluc3RhbGwgdGhlIGNvcHkgaW4gdGhlIG5ldyBsb2NhdGlvbgotCQkJdGhpcy5pbmRleCA9IG9sZEluZGV4OwotCQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsgIC8vIGdvIGJhY2sgYW5kIGNsZWFyIG91dCB0aGUgb3JpZ2luYWwgbG9jYXRpb24gKEFGVEVSIHRoZSBtb3ZlKQotCQkJdGhpcy5pbmRleCA9IG5ld0luZGV4OwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhZGFwdGVyJ3MgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgaW5pdGlhbGl6ZXIuCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uIGFubm90YXRpb24oQXJyYXlJbml0aWFsaXplciB2YWx1ZSkgewotCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyh2YWx1ZSk7Ci0JCXJldHVybiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpID8gbnVsbCA6IHRoaXMuYW5ub3RhdGlvblZhbHVlKGV4cHJlc3Npb25zLmdldCh0aGlzLmluZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgYXJyYXkgaW5pdGlhbGl6ZXIgdG8gaG9sZCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24sCi0JICogcGFkZGluZyBpdCB3aXRoICdudWxsJyBsaXRlcmFscyBhcyBuZWNlc3NhcnkKLQkgKi8KLQlwcml2YXRlIEFycmF5SW5pdGlhbGl6ZXIgYnVpbGROZXdJbm5lckFycmF5SW5pdGlhbGl6ZXIoQW5ub3RhdGlvbiBpbm5lcikgewotCQlBcnJheUluaXRpYWxpemVyIGFpID0gaW5uZXIuZ2V0QVNUKCkubmV3QXJyYXlJbml0aWFsaXplcigpOwotCQl0aGlzLmFkZElubmVyVG9FeHByZXNzaW9ucyhpbm5lciwgdGhpcy5leHByZXNzaW9ucyhhaSkpOwotCQlyZXR1cm4gYWk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGFycmF5IGluaXRpYWxpemVyLAotCSAqIHBhZGRpbmcgaXQgd2l0aCAnbnVsbCcgbGl0ZXJhbHMgYXMgbmVjZXNzYXJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZElubmVyVG9FeHByZXNzaW9ucyhBbm5vdGF0aW9uIGlubmVyLCBMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zKSB7Ci0JCWlmIChleHByZXNzaW9ucy5zaXplKCkgPiB0aGlzLmluZGV4KSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHByZXNzaW9ucyBzaXplIGlzIGdyZWF0ZXIgdGhhbiBpbmRleCAoc2l6ZTogIiArIGV4cHJlc3Npb25zLnNpemUoKSArICIgIGluZGV4OiAiICsgdGhpcy5pbmRleCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQkJd2hpbGUgKGV4cHJlc3Npb25zLnNpemUoKSA8IHRoaXMuaW5kZXgpIHsKLQkJCWV4cHJlc3Npb25zLmFkZChpbm5lci5nZXRBU1QoKS5uZXdOdWxsTGl0ZXJhbCgpKTsKLQkJfQotCQlleHByZXNzaW9ucy5hZGQoaW5uZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYWRhcHRlcidzIGFubm90YXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGluaXRpYWxpemVyLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIEFubm90YXRpb24gb3V0ZXIsIEFycmF5SW5pdGlhbGl6ZXIgdmFsdWUpIHsKLQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnModmFsdWUpOwotCQlpZiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpIHsKLQkJCXJldHVybjsgIC8vIGF2b2lkIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oPykKLQkJfQotCQlBbm5vdGF0aW9uIGlubmVyID0gdGhpcy5hbm5vdGF0aW9uVmFsdWUoZXhwcmVzc2lvbnMuZ2V0KHRoaXMuaW5kZXgpKTsKLQkJaWYgKGlubmVyID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoICEgdGhpcy5uYW1lTWF0Y2hlcyhkZWNsYXJhdGlvbiwgaW5uZXIpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuaW5kZXggPT0gKGV4cHJlc3Npb25zLnNpemUoKSAtIDEpKSB7Ci0JCQlleHByZXNzaW9ucy5yZW1vdmUodGhpcy5pbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlleHByZXNzaW9ucy5zZXQodGhpcy5pbmRleCwgdmFsdWUuZ2V0QVNUKCkubmV3TnVsbExpdGVyYWwoKSk7Ci0JCX0KLQkJdGhpcy50cmltRXhwcmVzc2lvbnMoZGVjbGFyYXRpb24sIG91dGVyLCBleHByZXNzaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogU3RyaXAgYWxsIHRoZSBudWxsIGxpdGVyYWxzIG9mZiB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBleHByZXNzaW9ucwotCSAqIGFuZCBub3JtYWxpemUgdGhlIHNwZWNpZmllZCBvdXRlciBhbm5vdGF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmltRXhwcmVzc2lvbnMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgQW5ub3RhdGlvbiBvdXRlciwgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucykgewotCQkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0Ci0JCWZvciAoaW50IGkgPSBleHByZXNzaW9ucy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJaWYgKGV4cHJlc3Npb25zLmdldChpKS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTlVMTF9MSVRFUkFMKSB7Ci0JCQkJZXhwcmVzc2lvbnMucmVtb3ZlKGkpOwotCQkJfSBlbHNlIHsKLQkJCQlicmVhazsgIC8vIHN0b3Agd2l0aCB0aGUgZmlyc3Qgbm9uLW51bGwgbGl0ZXJhbCBlbmNvdW50ZXJlZAotCQkJfQotCQl9Ci0JCXN3aXRjaCAoZXhwcmVzc2lvbnMuc2l6ZSgpKSB7Ci0JCQljYXNlIDA6Ci0JCQkJdGhpcy5yZW1vdmVFbGVtZW50QW5kTm9ybWFsaXplKGRlY2xhcmF0aW9uLCBvdXRlcik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE6Ci0JCQkJdGhpcy5jb252ZXJ0QXJyYXlUb0xhc3RSZW1haW5pbmdFeHByZXNzaW9uKG91dGVyLCBleHByZXNzaW9ucy5nZXQoMCkpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdoZW4gdGhlcmUgaXMgb25seSBhIHNpbmdsZSBlbGVtZW50IGluIGFuIGFycmF5IGluaXRpYWxpemVyLCBjb252ZXJ0IHRoZQotCSAqIGV4cHJlc3Npb24gdG8gYmUganVzdCB0aGUgc2luZ2xlIGVsZW1lbnQ7IGUuZy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0Zvbyh4eHg9eyJhYmMifSkgPT4gJiM2NDtGb28oeHh4PSJhYmMiKQotCSAqIG9yCi0JICogICAgICYjNjQ7Rm9vKHsiYWJjIn0pID0+ICYjNjQ7Rm9vKCJhYmMiKQotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgdm9pZCBjb252ZXJ0QXJyYXlUb0xhc3RSZW1haW5pbmdFeHByZXNzaW9uKEFubm90YXRpb24gb3V0ZXIsIEV4cHJlc3Npb24gbGFzdFZhbHVlKSB7Ci0JCWxhc3RWYWx1ZSA9IChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKGxhc3RWYWx1ZS5nZXRBU1QoKSwgbGFzdFZhbHVlKTsKLQkJaWYgKG91dGVyLmlzTm9ybWFsQW5ub3RhdGlvbigpKSB7Ci0JCQl0aGlzLm1lbWJlclZhbHVlUGFpcigoTm9ybWFsQW5ub3RhdGlvbikgb3V0ZXIpLnNldFZhbHVlKGxhc3RWYWx1ZSk7Ci0JCX0gZWxzZSBpZiAob3V0ZXIuaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpIHsKLQkJCSgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgb3V0ZXIpLnNldFZhbHVlKGxhc3RWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmV4cGVjdGVkIGFubm90YXRpb24gdHlwZTogIiArIG91dGVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFuaXB1bGF0ZSB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gYXBwcm9wcmlhdGVseS4KLQkgKiBJZiBpdCBpcyBhbiBhcnJheSBpbml0aWFsaXplciwgYWRkIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiB0byBpdC4KLQkgKiBJZiBpdCBpcyBub3QsIHJlcGxhY2UgdGhlIGV4cHJlc3Npb24gb3IgY29udmVydCBpdCBpbnRvIGFuIGFycmF5Ci0JICogaW5pdGlhbGl6ZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGlmeUV4cHJlc3Npb24oQVNUTm9kZSBub2RlLCBFeHByZXNzaW9uUHJvdmlkZXIgZXhwUHJvdmlkZXIsIEFubm90YXRpb24gaW5uZXIpIHsKLQkJRXhwcmVzc2lvbiB2YWx1ZSA9IGV4cFByb3ZpZGVyLmdldEV4cHJlc3Npb24obm9kZSk7Ci0JCWlmICh2YWx1ZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCS8vIGlnbm9yZSB0aGUgb3RoZXIgZW50cmllcyBpbiB0aGUgYXJyYXkgaW5pdGlhbGl6ZXIoPykgLSB0aGV5IG1heSBub3QgYmUgbWF0Y2hpbmcgQW5ub3RhdGlvbnMuLi4KLQkJCUxpc3Q8RXhwcmVzc2lvbj4gZXhwcmVzc2lvbnMgPSB0aGlzLmV4cHJlc3Npb25zKChBcnJheUluaXRpYWxpemVyKSB2YWx1ZSk7Ci0JCQlpZiAodGhpcy5pbmRleCA+PSBleHByZXNzaW9ucy5zaXplKCkpIHsKLQkJCQl0aGlzLmFkZElubmVyVG9FeHByZXNzaW9ucyhpbm5lciwgZXhwcmVzc2lvbnMpOwotCQkJfSBlbHNlIHsKLQkJCQlleHByZXNzaW9ucy5zZXQodGhpcy5pbmRleCwgaW5uZXIpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuaW5kZXggPT0gMCkgewotCQkJCS8vIHJlcGxhY2Ugd2hhdGV2ZXIgd2FzIHRoZXJlIGJlZm9yZQotCQkJCWV4cFByb3ZpZGVyLnNldEV4cHJlc3Npb24obm9kZSwgaW5uZXIpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBjb252ZXJ0IHRvIGFuIGFycmF5Ci0JCQkJQXJyYXlJbml0aWFsaXplciBhaSA9IGlubmVyLmdldEFTVCgpLm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJCQlMaXN0PEV4cHJlc3Npb24+IGV4cHJlc3Npb25zID0gdGhpcy5leHByZXNzaW9ucyhhaSk7Ci0JCQkJZXhwcmVzc2lvbnMuYWRkKChFeHByZXNzaW9uKSBBU1ROb2RlLmNvcHlTdWJ0cmVlKHZhbHVlLmdldEFTVCgpLCB2YWx1ZSkpOwotCQkJCXRoaXMuYWRkSW5uZXJUb0V4cHJlc3Npb25zKGlubmVyLCBleHByZXNzaW9ucyk7Ci0JCQkJZXhwUHJvdmlkZXIuc2V0RXhwcmVzc2lvbihub2RlLCBhaSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFpKSB7Ci0JCXJldHVybiBhaS5leHByZXNzaW9ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHByZXNzaW9uIHByb3ZpZGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkZWZpbmUgaW50ZXJmYWNlIHRoYXQgYWxsb3dzIHVzIHRvICJyZS11c2UiIHRoZSBjb2RlIGluCi0JICogI21vZGlmeUV4cHJlc3Npb24oQVNUTm9kZSwgRXhwcmVzc2lvblByb3ZpZGVyLCBBbm5vdGF0aW9uKQotCSAqLwotCXByaXZhdGUgaW50ZXJmYWNlIEV4cHJlc3Npb25Qcm92aWRlciB7Ci0JCUV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpOwotCQl2b2lkIHNldEV4cHJlc3Npb24oQVNUTm9kZSBub2RlLCBFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Qcm92aWRlciBNRU1CRVJfVkFMVUVfUEFJUl9FWFBSRVNTSU9OX1BST1ZJREVSID0gbmV3IEV4cHJlc3Npb25Qcm92aWRlcigpIHsKLQkJcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihBU1ROb2RlIG5vZGUpIHsKLQkJCXJldHVybiAoKE1lbWJlclZhbHVlUGFpcikgbm9kZSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQkoKE1lbWJlclZhbHVlUGFpcikgbm9kZSkuc2V0VmFsdWUoZXhwcmVzc2lvbik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1lbWJlclZhbHVlUGFpckV4cHJlc3Npb25Qcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uUHJvdmlkZXIgU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OX0VYUFJFU1NJT05fUFJPVklERVIgPSBuZXcgRXhwcmVzc2lvblByb3ZpZGVyKCkgewotCQlwdWJsaWMgRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSkgewotCQkJcmV0dXJuICgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgbm9kZSkuZ2V0VmFsdWUoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFeHByZXNzaW9uKEFTVE5vZGUgbm9kZSwgRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCQkoKFNpbmdsZU1lbWJlckFubm90YXRpb24pIG5vZGUpLnNldFZhbHVlKGV4cHJlc3Npb24pOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJTaW5nbGVNZW1iZXJBbm5vdGF0aW9uRXhwcmVzc2lvblByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0ZTkzNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIKLQlpbXBsZW1lbnRzIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyCi17Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXQoSURvY3VtZW50IGRvYywgVGV4dEVkaXQgZWRpdFRyZWUpIHRocm93cyBNYWxmb3JtZWRUcmVlRXhjZXB0aW9uLCBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIG5vIGZvcm1hdHRpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWZlMmQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBCZWhhdmlvcmxlc3MgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcgotCWltcGxlbWVudHMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIElOU1RBTkNFID0gbmV3IE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTWFya2VyQW5ub3RhdGlvbiBuZXdNYXJrZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFNpbmdsZU1lbWJlckFubm90YXRpb24gbmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNlNjE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogQmVoYXZpb3JsZXNzIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+Ci0JaW1wbGVtZW50cyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlciBJTlNUQU5DRQotCQkJPSBuZXcgTnVsbERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIDxTPiBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFQgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgQVNUTm9kZSBnZXRBc3ROb2RlKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L051bGxFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNDVhNzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogTm8gY29udmVyc2lvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxFeHByZXNzaW9uQ29udmVydGVyCi0JaW1wbGVtZW50cyBFeHByZXNzaW9uQ29udmVydGVyPEV4cHJlc3Npb24+Ci17Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPEV4cHJlc3Npb24+IElOU1RBTkNFID0gbmV3IE51bGxFeHByZXNzaW9uQ29udmVydGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4cHJlc3Npb25Db252ZXJ0ZXI8RXhwcmVzc2lvbj4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbEV4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24sIEFTVCBhc3QpIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc1ZDJkNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSBudW1iZXIgbGl0ZXJhbCB0by9mcm9tIGFuIEludGVnZXIKLSAqIChlLmcuIDUpLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxJbnRlZ2VyPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8SW50ZWdlcj4gSU5TVEFOQ0UgPSBuZXcgTnVtYmVySW50ZWdlckV4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE51bWJlckxpdGVyYWwgY29udmVydE9iamVjdChJbnRlZ2VyIGludGVnZXIsIEFTVCBhc3QpIHsKLQkJcmV0dXJuIGFzdC5uZXdOdW1iZXJMaXRlcmFsKGludGVnZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEludGVnZXIgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyKSA/ICgoSW50ZWdlcikgdmFsdWUpIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1ByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9QcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjE3NTAxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1ByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlByaW1pdGl2ZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotCi0vKioKLSAqIENvbnZlcnQgYSB0eXBlIGxpdGVyYWwgdG8vZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHByaW1pdGl2ZSB0eXBlCi0gKiAoZS5nLiAiaW50IikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9IGFzdC5uZXdQcmltaXRpdmVUeXBlKFByaW1pdGl2ZVR5cGUudG9Db2RlKHN0cmluZykpOwotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gdHlwZUxpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfTElURVJBTCkgewotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9ICgoVHlwZUxpdGVyYWwpIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5QUklNSVRJVkVfVFlQRSkgewotCQkJCXJldHVybiAoKFByaW1pdGl2ZVR5cGUpIHR5cGUpLmdldFByaW1pdGl2ZVR5cGVDb2RlKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZWU1NzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgYW5ub3RhdGlvbiBlbGVtZW50IGFkYXB0ZXIgYW5kIHNob3J0LWNpcmN1aXQgdGhlCi0gKiAjc2V0VmFsdWUgbWV0aG9kIGlmIHRoZSB2YWx1ZSBoYXMgbm90IGNoYW5nZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaG9ydENpcmN1aXRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlpbXBsZW1lbnRzIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotewotCS8qKiB0aGUgd3JhcHBlZCBhZGFwdGVyICovCi0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gYWRhcHRlcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gZGFlYSkgewotCQl0aGlzKG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFQ+KGFubm90YXRlZEVsZW1lbnQsIGRhZWEpKTsKLQl9Ci0KLQlwdWJsaWMgU2hvcnRDaXJjdWl0QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPiBhZGFwdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlciA9IGFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBUIGdldFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQl0aGlzLnNldFZhbHVlKHRoaXMuYWRhcHRlci5nZXRWYWx1ZSgpLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIEV4cHJlc3Npb24gZ2V0RXhwcmVzc2lvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIEFTVE5vZGUgZ2V0QXN0Tm9kZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hZGFwdGVyLmdldEFzdE5vZGUoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzZXQgdGhlIGFkYXB0ZXIncyB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpZiBpdAotCSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoVCBvbGRWYWx1ZSwgVCBuZXdWYWx1ZSkgewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsgIC8vIG51bGwgPT4gbnVsbAotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0gZWxzZSB7ICAvLyBudWxsID0+IG9iamVjdAotCQkJCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgeyAgLy8gb2JqZWN0ID0+IG51bGwKLQkJCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQl9IGVsc2UgeyAgLy8gb2JqZWN0ID0+IG9iamVjdAotCQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHsKLQkJCQkJLy8gZG8gbm90aGluZwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuYWRhcHRlci5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogYm90aCB2YWx1ZXMgYXJlIG5vbi1udWxsIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoVCBvbGRWYWx1ZSwgVCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaG9ydENpcmN1aXRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjc2YmMyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1Nob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGFubm90YXRpb24gZWxlbWVudCBhZGFwdGVyIGFuZCBzaG9ydC1jaXJjdWl0IHRoZQotICogI3NldFZhbHVlIG1ldGhvZCBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLiBPdmVycmlkZXMgI3ZhbHVlc0FyZUVxdWFsKCkKLSAqIHRvIGNoZWNrIGVxdWFsaXR5IG9uIGFycmF5cwotICovCi1wdWJsaWMgY2xhc3MgU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4KLQlleHRlbmRzIFNob3J0Q2lyY3VpdEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUW10+Ci17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2hvcnRDaXJjdWl0QXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUW10+IGRhZWEpIHsKLQkJc3VwZXIoYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFNob3J0Q2lyY3VpdEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUW10+IGFkYXB0ZXIpIHsKLQkJc3VwZXIoYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFubm90YXRpb25FbGVtZW50QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChUW10gb2xkVmFsdWUsIFRbXSBuZXdWYWx1ZSkgewotCQlyZXR1cm4gQXJyYXlzLmVxdWFscyhuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTVkYzE5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci0KLS8qKgotICogTWFuaXB1bGF0ZSBhbiBhbm5vdGF0aW9uIHdpdGggYSBzcGVjaWZpYyBuYW1lLCBlLmcuCi0gKiA8cHJlPgotICogICAgICYjNjQ7Rm9vCi0gKiAgICAgcHJpdmF0ZSBpbnQgaWQ7Ci0gKiA8L3ByZT4KLSAqIAotICogTkI6Ci0gKiBJZiB0aGUgZGVjbGFyYXRpb24gY29udGFpbnMgbW9yZSB0aGFuIG9uZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNhbWUKLSAqIG5hbWUsIHRoZSBhZGFwdGVyIHdpbGwgY29ycmVzcG9uZCB0byB0aGUgZmlyc3QgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQKLSAqIG5hbWUuIChBbHNvIG5vdGUgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBub3QgYWxsb3cgYSBkZWNsYXJhdGlvbiB0byBiZQotICogbW9kaWZpZWQgYnkgbXVsdGlwbGUgYW5ub3RhdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lLCBpLmUuIG9mIHRoZSBzYW1lIHR5cGU7Ci0gKiBzbyBpZiB0aGVyZSAqYXJlKiBtdWx0aXBsZSBhbm5vdGF0aW9ucyBvZiB0aGUgc2FtZSB0eXBlLCB0aGVyZSBhcmUgYmlnZ2VyCi0gKiBwcm9ibGVtcyB0byB3b3JyeSBhYm91dCB0aGFuIHdoaWNoIGFubm90YXRpb24gdGhlIGFkYXB0ZXIgbWFuaXB1bGF0ZXMuKQotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFic3RyYWN0RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlzdXBlcihhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQodGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJZGVjbGFyYXRpb24ucmVtb3ZlQW5ub3RhdGlvbk5hbWVkKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJZGVjbGFyYXRpb24ucmVwbGFjZUFubm90YXRpb25OYW1lZCh0aGlzLmdldEFubm90YXRpb25OYW1lKCksIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkvLyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIGRlY2xhcmF0aW9uCi0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSA/IGFubm90YXRpb24gOiBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmRjNWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2ltcGxlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHR5cGUgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2ltcGxlIHR5cGUKLSAqIChlLmcuICJqYXZhLmxhbmcuT2JqZWN0IikuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUeXBlTGl0ZXJhbCBjb252ZXJ0T2JqZWN0KFN0cmluZyBzdHJpbmcsIEFTVCBhc3QpIHsKLQkJTmFtZSBuYW1lID0gYXN0Lm5ld05hbWUoc3RyaW5nKTsKLQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9IGFzdC5uZXdTaW1wbGVUeXBlKG5hbWUpOwotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHR5cGUpOwotCQlyZXR1cm4gdHlwZUxpdGVyYWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLlRZUEVfTElURVJBTCkgewotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGUgdHlwZSA9ICgoVHlwZUxpdGVyYWwpIGV4cHJlc3Npb24pLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5TSU1QTEVfVFlQRSkgewotCQkJCXJldHVybiAoKFNpbXBsZVR5cGUpIHR5cGUpLmdldE5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZWU2Y2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQ29udmVydCBhbiBhcnJheSBpbml0aWFsaXplciB0by9mcm9tIGFuIGFycmF5IG9mIHN0cmluZ3MgKGUuZy4geyJ0ZXh0MCIsICJ0ZXh0MSJ9KS4KLSAqIAotICogRG8gTk9UIHVzZSB0aGlzIGNsYXNzIGZvciBjb252ZXJ0aW5nIGFycmF5IGluaXRpYWxpemVycyBpbiBhbm5vdGF0aW9uIGVsZW1lbnRzLgotICogSmF2YTUgaGFzIGEgYml0IG9mIHN5bnRhY3RpYyBzdWdhciB0aGF0IGFsbG93cyBhIHNpbmdsZS1lbGVtZW50IGFycmF5Ci0gKiBpbml0aWFsaXplciB0byBub3QgaGF2ZSBjdXJseSBicmFjZXMuIFRoaXMgY29udmVydGVyIHdpbGwgcmV0dXJuIG51bGwgaWYgaXQgZW5jb3VudGVycwotICogYW55dGhpbmcgb3RoZXIgdGhhbiBhbiBhcnJheSBpbml0aWFsaXplci4KLSAqIAotICogSW52YWxpZCBlbnRyaWVzIGluIHRoZSBhcnJheSBpbml0aWFsaXplciB3aWxsIHJlc3VsdCBpbiBudWxsIGVsZW1lbnRzIGluIHRoZQotICogcmVzdWx0aW5nIHN0cmluZyBhcnJheS4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byBtYW5pcHVsYXRlIGVsZW1lbnRzIGF0Ci0gKiB0aGUgYXBwcm9wcmlhdGUgaW5kZXguCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nW10+Ci0JCWltcGxlbWVudHMgSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlcjsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eTsKLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVtb3ZlIHRoZSBhcnJheSBpbml0aWFsaXplciBpZiBpdCBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyKEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBlbGVtZW50Q29udmVydGVyKSB7Ci0JCXRoaXMoZWxlbWVudENvbnZlcnRlciwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcihFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gZWxlbWVudENvbnZlcnRlciwgYm9vbGVhbiByZW1vdmVBcnJheUluaXRpYWxpemVyV2hlbkVtcHR5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudENvbnZlcnRlciA9IGVsZW1lbnRDb252ZXJ0ZXI7Ci0JCXRoaXMucmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSA9IHJlbW92ZUFycmF5SW5pdGlhbGl6ZXJXaGVuRW1wdHk7Ci0JfQotCi0JLyoKLQkgKiB0aGlzIG1ldGhvZCBpcyAncHVibGljJyBzbyBpdCBjYW4gYmUgY2FsbGVkIGJ5Ci0JICogQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBBcnJheUluaXRpYWxpemVyIGNvbnZlcnRPYmplY3QoU3RyaW5nW10gc3RyaW5ncywgQVNUIGFzdCkgewotCQlpZiAoKHN0cmluZ3MubGVuZ3RoID09IDApICYmIHRoaXMucmVtb3ZlQXJyYXlJbml0aWFsaXplcldoZW5FbXB0eSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnMoYXJyYXlJbml0aWFsaXplcik7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IHN0cmluZ3MpIHsKLQkJCWV4cHJlc3Npb25zLmFkZCh0aGlzLmVsZW1lbnRDb252ZXJ0ZXIuY29udmVydChzdHJpbmcsIGFzdCkpOwotCQl9Ci0JCXJldHVybiBhcnJheUluaXRpYWxpemVyOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKLQl9Ci0KLQkvKgotCSAqIHRoaXMgbWV0aG9kIGlzICdwdWJsaWMnIHNvIGl0IGNhbiBiZSBjYWxsZWQgYnkKLQkgKiBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZ1tdIGNvbnZlcnROdWxsKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJcmV0dXJuIChleHByZXNzaW9uLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgPwotCQkJCXRoaXMuY29udmVydEFycmF5SW5pdGlhbGl6ZXIoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24pIDoKLQkJCQlTdHJpbmdUb29scy5FTVBUWV9TVFJJTkdfQVJSQVk7Ci0JfQotCi0JLyoKLQkgKiB0aGlzIG1ldGhvZCBpcyAncHVibGljJyBzbyBpdCBjYW4gYmUgY2FsbGVkIGJ5Ci0JICogQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBjb252ZXJ0QXJyYXlJbml0aWFsaXplcihBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyA9IHRoaXMuZXhwcmVzc2lvbnMoYXJyYXlJbml0aWFsaXplcik7Ci0JCWludCBsZW4gPSBleHByZXNzaW9ucy5zaXplKCk7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJc3RyaW5nc1tpXSA9IHRoaXMuZWxlbWVudENvbnZlcnRlci5jb252ZXJ0KGV4cHJlc3Npb25zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHN0cmluZ3M7Ci0JfQotCQotCXB1YmxpYyBFeHByZXNzaW9uIGdldFN1YmV4cHJlc3Npb24oaW50IGluZGV4LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJaWYgKGV4cHJlc3Npb24uZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQlyZXR1cm4gZXhwcmVzc2lvbnMoKEFycmF5SW5pdGlhbGl6ZXIpIGV4cHJlc3Npb24pLmdldChpbmRleCk7Ci0JCX0KLQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1N0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlODhiNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L2pkdC9TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHN0cmluZyBsaXRlcmFsIHRvL2Zyb20gYSBzdHJpbmcgKGUuZy4gInRleHQiKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0RXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IElOU1RBTkNFID0gbmV3IFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ0xpdGVyYWwgY29udmVydE9iamVjdChTdHJpbmcgc3RyaW5nLCBBU1QgYXN0KSB7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKHN0cmluZyk7Ci0JCXJldHVybiBzdHJpbmdMaXRlcmFsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydEV4cHJlc3Npb24oRXhwcmVzc2lvbiBleHByZXNzaW9uKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IGV4cHJlc3Npb24ucmVzb2x2ZUNvbnN0YW50RXhwcmVzc2lvblZhbHVlKCk7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpID8gKFN0cmluZykgdmFsdWUgOiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvamR0L1R5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZDFiNzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uUHJpbWl0aXZlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZUxpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci0KLS8qKgotICogQ29udmVydCBhIHR5cGUgbGl0ZXJhbCB0by9mcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgCi0gKiBzaW1wbGUgdHlwZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpIG9yIHByaW1pdGl2ZSB0eXBlIChlLmcuICJpbnQiKS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBJTlNUQU5DRSA9IG5ldyBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFR5cGVMaXRlcmFsIGNvbnZlcnRPYmplY3QoU3RyaW5nIHN0cmluZywgQVNUIGFzdCkgewotCQlpZiAoUHJpbWl0aXZlVHlwZS50b0NvZGUoc3RyaW5nKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKFR5cGVMaXRlcmFsKSBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnQoc3RyaW5nLCBhc3QpOwotCQl9Ci0JCXJldHVybiAoVHlwZUxpdGVyYWwpIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydChzdHJpbmcsIGFzdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0RXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKLQkJU3RyaW5nIG5hbWUgPSBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnQoZXhwcmVzc2lvbik7Ci0JCXJldHVybiBuYW1lICE9IG51bGwgPyBuYW1lIDogUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0KGV4cHJlc3Npb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9Cb29sZWFuVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjI4MjVjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvQm9vbGVhblRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgY2xhc3MgQm9vbGVhblRyYW5zbGF0b3IKLQlleHRlbmRzIFRyYW5zbGF0b3IKLXsKLQlwdWJsaWMgQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIEJPT0xFQU5fRkVBVFVSRSB8IEJPT0xFQU5fTE9XRVJDQVNFKTsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW5UcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgc3RydWN0dXJhbEZlYXR1cmUsIEJPT0xFQU5fRkVBVFVSRSB8IEJPT0xFQU5fTE9XRVJDQVNFIHwgc3R5bGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNvbnZlcnRTdHJpbmdUb1ZhbHVlKFN0cmluZyBzdHJpbmcsIEVPYmplY3Qgb3duZXIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihzdHJpbmcpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvU3RyaW5nKE9iamVjdCB2YWx1ZSwgRU9iamVjdCBvd25lcikgewotCQlyZXR1cm4gKChCb29sZWFuKSB2YWx1ZSkudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL0VtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDk0NzA1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogVGhpcyB0cmFuc2xhdG9yIGlzIHRvIGJlIHVzZWQgZm9yIGVtcHR5IHhtbCB0YWdzIHRoYXQgY29ycmVzcG9uZAotICogdG8gYSBib29sZWFuIGF0dHJpYnV0ZSBpbiB0aGUgZW1mIG1vZGVsLiAgCi0gKiBjYXNjYWRlLXBlcnNpc3QgaXMgYW4gZXhhbXBsZSBmcm9tIHRoZSBvcm0ueHNkOgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+Ci0gKiAJCTxjYXNjYWRlLXBlcnNpc3QvPiAgICAgICAgCi0gKiAJPC9wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPiAgPT0+ICBjYXNjYWRlUGVyc2lzdCA9PSB0cnVlCi0gKiAKLSAqIHZzLgotICogCi0gKiAJPHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICAKLSAqIAk8L3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM+ICA9PT4gIGNhc2NhZGVQZXJzaXN0ID09IGZhbHNlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IKLQlleHRlbmRzIFRyYW5zbGF0b3IKLXsKLQlwdWJsaWMgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJdGhpcyhkb21QYXRoQW5kTmFtZXMsIHN0cnVjdHVyYWxGZWF0dXJlLCBOT19TVFlMRSk7Ci0JfQotCi0JcHVibGljIEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUgfCBFTVBUWV9UQUcgfCBCT09MRUFOX0ZFQVRVUkUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldE1PRlZhbHVlKEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCS8vIEkgYW0gb3ZlcnJpZGluZyB0aGlzIG1ldGhvZC4gIFRoaXMgaXMgc28gdGhlIHRhZyB3aWxsIGJlIHJlbW92ZWQgd2hlbiAKLQkJLy8gdGhlIHZhbHVlIGlzIGZhbHNlLgotCQkvLyBJJ20gbm90IHN1cmUgaWYgdGhpcyBpcyBhIGJ1ZyBpbiB0aGUgZWNvcmUgb3IgbWF5YmUgaW4gdGhlIHRyYW5zbGF0b3JzLCAKLQkJLy8gYnV0IEkgcmVhbGx5IGRvbid0IHRoaW5rIHRoYXQgd2Ugc2hvdWxkIGhhdmUgdG8gZGVwZW5kIG9uIHRoZSBib29sZWFuCi0JCS8vIGJlaW5nICJ1bnNldCIgdG8gcmVtb3ZlIHRoZSB0YWcuCi0JCUJvb2xlYW4gdmFsdWUgPSAoQm9vbGVhbikgc3VwZXIuZ2V0TU9GVmFsdWUobW9mT2JqZWN0KTsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IHZhbHVlIDogbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNzRiNGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9FbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvcgotCWV4dGVuZHMgVHJhbnNsYXRvcgotewotCXB1YmxpYyBFbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIHN0cnVjdHVyYWxGZWF0dXJlKTsKLQl9Ci0JCi0JcHVibGljIEVudW1lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlLCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8Pz4gZ2V0RW51bWVyYXRlZE9iamVjdFZhbHVlcygpOwotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY29udmVydFN0cmluZ1RvVmFsdWUoU3RyaW5nIHN0cmluZywgRU9iamVjdCBvd25lcikgewotCQlmb3IgKE9iamVjdCBlYWNoIDogZ2V0RW51bWVyYXRlZE9iamVjdFZhbHVlcygpKSB7Ci0JCQlpZiAoZWFjaC50b1N0cmluZygpLmVxdWFscyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIGVhY2g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFZhbHVlVG9TdHJpbmcoT2JqZWN0IHZhbHVlLCBFT2JqZWN0IG93bmVyKSB7Ci0JCXJldHVybiB2YWx1ZS50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlUm9vdFRyYW5zbGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2ludGVybmFsL3V0aWxpdHkvdHJhbnNsYXRvcnMvU2ltcGxlUm9vdFRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjMjBkMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVJvb3RUcmFuc2xhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUm9vdFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiBSb290IHRyYW5zbGF0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2hpbGQgdHJhbnNsYXRvcnMgYW5kIG5vIHNwZWNpYWwKLSAqIGJlaGF2aW9yLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUm9vdFRyYW5zbGF0b3IKLQlleHRlbmRzIFJvb3RUcmFuc2xhdG9yCi17Ci0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBjaGlsZHJlbjsKLQotCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRUNsYXNzIGVDbGFzcywgVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZUNsYXNzKTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCS8qKgotCSAqIFdpZGVuIG1ldGhvZCBhY2Nlc3MgdG8gJ3B1YmxpYycuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW47Ci0JfQotCi0JcHJvdGVjdGVkIFRyYW5zbGF0b3JbXSBnZXRDaGlsZHJlbl8oKSB7Ci0JCXJldHVybiAodGhpcy5jaGlsZHJlbiA9PSBudWxsKSA/IEVNUFRZX1RSQU5TTEFUT1JfQVJSQVkgOiB0aGlzLmNoaWxkcmVuOwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3JbXSBFTVBUWV9UUkFOU0xBVE9SX0FSUkFZID0gbmV3IFRyYW5zbGF0b3JbMF07Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHRyYW5zbGF0b3IncyBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIHRvIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IgYWRkQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLmFkZCh0aGlzLmdldENoaWxkcmVuXygpLCB0cmFuc2xhdG9yKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgdG8gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVSb290VHJhbnNsYXRvciBhZGRDaGlsZHJlbihUcmFuc2xhdG9yW10gdHJhbnNsYXRvcnMpIHsKLQkJdGhpcy5jaGlsZHJlbiA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuZ2V0Q2hpbGRyZW5fKCksIHRyYW5zbGF0b3JzKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvciBmcm9tIHRoZSB0cmFuc2xhdG9yJ3MgbGlzdCBvZiBjaGlsZHJlbi4KLQkgKiBSZXR1cm4gdGhlIHRyYW5zbGF0b3IgZm9yIG1ldGhvZCBjaGFpbmluZy4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlUm9vdFRyYW5zbGF0b3IgcmVtb3ZlQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLnJlbW92ZSh0aGlzLmNoaWxkcmVuLCB0cmFuc2xhdG9yKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgZnJvbSB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVJvb3RUcmFuc2xhdG9yIHJlbW92ZUNoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmVBbGwodGhpcy5jaGlsZHJlbiwgKE9iamVjdFtdKSB0cmFuc2xhdG9ycyk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvaW50ZXJuYWwvdXRpbGl0eS90cmFuc2xhdG9ycy9TaW1wbGVUcmFuc2xhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVRyYW5zbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkYjAyNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9pbnRlcm5hbC91dGlsaXR5L3RyYW5zbGF0b3JzL1NpbXBsZVRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9yczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JQYXRoOwotCi0vKioKLSAqIFRyYW5zbGF0b3IgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgY2hpbGQgdHJhbnNsYXRvcnMgYW5kIG5vIHNwZWNpYWwKLSAqIGJlaGF2aW9yLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlVHJhbnNsYXRvcgotCWV4dGVuZHMgVHJhbnNsYXRvcgotewotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gY2hpbGRyZW47Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVDbGFzcyBlQ2xhc3MpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSk7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCBlQ2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBFQ2xhc3MgZUNsYXNzLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIGVDbGFzcyk7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgZVN0cnVjdHVyYWxGZWF0dXJlLCBUcmFuc2xhdG9yUGF0aCB0cmFuc2xhdG9yUGF0aCkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgdHJhbnNsYXRvclBhdGgpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIFRyYW5zbGF0b3JQYXRoW10gdHJhbnNsYXRvclBhdGhzKSB7Ci0JCXN1cGVyKGRvbVBhdGhBbmROYW1lcywgZVN0cnVjdHVyYWxGZWF0dXJlLCB0cmFuc2xhdG9yUGF0aHMpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yKFN0cmluZyBkb21QYXRoQW5kTmFtZXMsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlU3RydWN0dXJhbEZlYXR1cmUsIGludCBzdHlsZSkgewotCQlzdXBlcihkb21QYXRoQW5kTmFtZXMsIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgc3R5bGUpOwotCX0KLQkKLQlwdWJsaWMgU2ltcGxlVHJhbnNsYXRvcihTdHJpbmcgZG9tUGF0aEFuZE5hbWVzLCBFU3RydWN0dXJhbEZlYXR1cmUgYUZlYXR1cmUsIGludCBzdHlsZSwgRUNsYXNzIGVDbGFzcywgVHJhbnNsYXRvcltdIGNoaWxkcmVuKSB7Ci0JCXRoaXMoZG9tUGF0aEFuZE5hbWVzLCBhRmVhdHVyZSwgc3R5bGUpOwotCQlzZXRFTUZDbGFzcyhlQ2xhc3MpOwotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IoU3RyaW5nIGRvbVBhdGhBbmROYW1lcywgRVN0cnVjdHVyYWxGZWF0dXJlIGVTdHJ1Y3R1cmFsRmVhdHVyZSwgaW50IHN0eWxlLCBUcmFuc2xhdG9yW10gY2hpbGRyZW4pIHsKLQkJc3VwZXIoZG9tUGF0aEFuZE5hbWVzLCBlU3RydWN0dXJhbEZlYXR1cmUsIHN0eWxlKTsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGlsZHJlbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXaWRlbiBtZXRob2QgYWNjZXNzIHRvICdwdWJsaWMnLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2xhdG9yW10gZ2V0Q2hpbGRyZW5fKCkgewotCQlyZXR1cm4gKHRoaXMuY2hpbGRyZW4gPT0gbnVsbCkgPyBFTVBUWV9UUkFOU0xBVE9SX0FSUkFZIDogdGhpcy5jaGlsZHJlbjsKLQl9Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUcmFuc2xhdG9yW10gRU1QVFlfVFJBTlNMQVRPUl9BUlJBWSA9IG5ldyBUcmFuc2xhdG9yWzBdOwotCi0JLyoqCi0JICogU2V0IHRoZSB0cmFuc2xhdG9yJ3MgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENoaWxkcmVuKFRyYW5zbGF0b3JbXSBjaGlsZHJlbikgewotCQl0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvciB0byB0aGUgdHJhbnNsYXRvcidzIGxpc3Qgb2YgY2hpbGRyZW4uCi0JICogUmV0dXJuIHRoZSB0cmFuc2xhdG9yIGZvciBtZXRob2QgY2hhaW5pbmcuCi0JICovCi0JcHVibGljIFNpbXBsZVRyYW5zbGF0b3IgYWRkQ2hpbGQoVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBBcnJheVRvb2xzLmFkZCh0aGlzLmdldENoaWxkcmVuXygpLCB0cmFuc2xhdG9yKTsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgdHJhbnNsYXRvcnMgdG8gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIGFkZENoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5hZGRBbGwodGhpcy5nZXRDaGlsZHJlbl8oKSwgdHJhbnNsYXRvcnMpOwotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCB0cmFuc2xhdG9yIGZyb20gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIHJlbW92ZUNoaWxkKFRyYW5zbGF0b3IgdHJhbnNsYXRvcikgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmUodGhpcy5jaGlsZHJlbiwgdHJhbnNsYXRvcik7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHRyYW5zbGF0b3JzIGZyb20gdGhlIHRyYW5zbGF0b3IncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqIFJldHVybiB0aGUgdHJhbnNsYXRvciBmb3IgbWV0aG9kIGNoYWluaW5nLgotCSAqLwotCXB1YmxpYyBTaW1wbGVUcmFuc2xhdG9yIHJlbW92ZUNoaWxkcmVuKFRyYW5zbGF0b3JbXSB0cmFuc2xhdG9ycykgewotCQl0aGlzLmNoaWxkcmVuID0gQXJyYXlUb29scy5yZW1vdmVBbGwodGhpcy5jaGlsZHJlbiwgKE9iamVjdFtdKSB0cmFuc2xhdG9ycyk7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvbGlicHJvdi9KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9saWJwcm92L0pwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U1MjQ0OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9saWJwcm92L0pwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklMaWJyYXJ5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyB7Ci0JCi0JSUZhY2V0ZWRQcm9qZWN0QmFzZSBnZXRGYWNldGVkUHJvamVjdCgpOwotCQotCUlMaWJyYXJ5UHJvdmlkZXIgZ2V0TGlicmFyeVByb3ZpZGVyKCk7Ci0JCi0JSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL2xpYnZhbC9MaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMTVjNDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvbGlidmFsL0xpYnJhcnlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBleHRlbmRlci1zdXBwbGllZCBsaWJyYXJ5IHZhbGlkYXRvcnMuICAKLSAqIEVhY2ggbGlicmFyeSB2YWxpZGF0b3IgbXVzdCBoYXZlIGEgemVyby1hcmcgY29uc3RydWN0b3IuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMaWJyYXJ5VmFsaWRhdG9yIHsKLQkKLQlJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL1Jlc291cmNlTG9jYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTYwOGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvUmVzb3VyY2VMb2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUxvY2F0b3IgewotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiBjb250YWluZXIgaXMgYW4gYWNjZXB0YWJsZSAobm9uLWphdmEpIHJlc291cmNlIAotCSAqIGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCSAqLwotCWJvb2xlYW4gYWNjZXB0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0LCBJQ29udGFpbmVyIGNvbnRhaW5lcik7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGxvY2F0aW9uIGluIHdoaWNoIHRvIGNyZWF0ZSBuZXcgKG5vbi1qYXZhKSByZXNvdXJjZXMKLQkgKi8KLQlJQ29udGFpbmVyIGdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKElQcm9qZWN0IHByb2plY3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgd29ya3NwYWNlIHJlbGF0aXZlIGFic29sdXRlIHJlc291cmNlIHBhdGggYmVzdCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gCi0JICogcnVudGltZSBwYXRoIGZvciB0aGUgZ2l2ZW4gcHJvamVjdAotCSAqLwotCUlQYXRoIGdldFJlc291cmNlUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBydW50aW1lUGF0aCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBydW50aW1lIHBhdGggYmVzdCByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gd29ya3NwYWNlIHJlbGF0aXZlIGFic29sdXRlCi0JICogcmVzb3VyY2UgcGF0aCBmb3IgdGhlIGdpdmVuIHByb2plY3QKLQkgKi8KLQlJUGF0aCBnZXRSdW50aW1lUGF0aChJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByZXNvdXJjZVBhdGgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZDVlMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIENvbW1vbiBKYXZhIHJlc291cmNlIGFubm90YXRpb24gYmVoYXZpb3IKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb24KLQlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFubm90YXRpb24ncyBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYXMgb3Bwb3NlZCB0byB0aGUgdmFsdWUgb2YKLQkgKiB0aGUgYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBGb3IgZXhhbXBsZToKLQkgKiAgICAgQGNvbS5mb28uQmFyKG5hbWU9IlRob21hcyIpCi0JICogI2dldEFubm90YXRpb25OYW1lKCkgd2lsbCByZXR1cm4gImNvbS5mb28uQmFyIi4KLQkgKiBJbiB0eXBpY2FsIHN1YmNsYXNzZXMsICNnZXROYW1lKCkgd291bGQgcmV0dXJuICJUaG9tYXMiLgotCSAqLwotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpEVCBET00gYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKLQkgKiBBU1QgY29tcGlsYXRpb24gdW5pdC4KLQkgKi8KLQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBnZXRBc3RBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgYW5ub3RhdGlvbiB0byB0aGUgSkRUIERPTS4KLQkgKi8KLQl2b2lkIG5ld0Fubm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBKYXZhIGFubm90YXRpb24gZnJvbSB0aGUgSkRUIERPTS4KLQkgKi8KLQl2b2lkIHJlbW92ZUFubm90YXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFsbCB0aGUgYW5ub3RhdGlvbidzIG1lbWJlciB2YWx1ZXMgYXJlIDxjb2RlPm51bGw8L2NvZGU+OwotCSAqIGltcGx5aW5nIHRoZSBhbm5vdGF0aW9uIGNhbiBiZSByZW1vdmVkIGlmIGl0IGhhcyBubyBzZW1hbnRpYyB2YWx1ZSBhcyBhCi0JICogbWFya2VyIGFubm90YXRpb24uCi0JICovCi0JYm9vbGVhbiBpc1Vuc2V0KCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZjQ1M2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotCi0vKioKLSAqIFVzZWQgdG8gYnVpbGQgQW5ub3RhdGlvbnMgZGlzY292ZXJlZCBpbiB0aGUgSmF2YSBzb3VyY2UgY29kZS4KLSAqIFRvIHByb3ZpZGUgbmV3IEFubm90YXRpb25EZWZpbml0aW9ucywgY3JlYXRlIGEgbmV3IEpheGJQbGF0Zm9ybQotICogYnkgaW1wbGVtZW50aW5nIEpheGJQbGF0Zm9ybURlZmluaXRpb24uCi0gKiAKLSAqIEBzZWUgQW5ub3RhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIHRoZSBkZWZpbml0aW9uIHdpbGwgYnVpbGQgaW4gdGhlCi0JICogdmFyaW91cyAjYnVpbGQuLi4oLi4uKSBtZXRob2RzLgotCSAqLwotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBhbm5vdGF0ZWQgZWxlbWVudC4KLQkgKi8KLQlBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGFuIGFubm90YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgSkRUIGFubm90YXRpb24KLQkgKiBvbiB0aGUgc3BlY2lmaWVkIGFubm90YXRlZCBlbGVtZW50LgotCSAqLwotCUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgIm51bGwiIGFubm90YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGVkIGVsZW1lbnQuCi0JICogT25seSBjZXJ0YWluIGFubm90YXRpb25zIGFyZSByZXF1aXJlZCB0byBoYXZlICJudWxsIiBpbXBsZW1lbnRhdGlvbnM7Ci0JICogdHlwaWNhbGx5IHRoZSBhbm5vdGF0aW9ucyB3aXRoIHJlYXNvbmFibHkgY29tcGxleCBkZWZhdWx0IGJlaGF2aW9yLgotCSAqIFRoZSAibnVsbCIgYW5ub3RhdGlvbiBpcyB1c2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGRlZmF1bHQgY29udGV4dCBtb2RlbC4KLQkgKiBUaGUgIm51bGwiIGFubm90YXRpb24gc2ltcGxpZmllcyB0aGUgY29udGV4dCBtb2RlbCBjb2RlLCBhbGxvd2luZyB0aGUKLQkgKiBjb250ZXh0IG1vZGVsIHRvIHNpbXBseSBzZXQgdmFyaW91cyBiaXRzIG9mIHN0YXRlIChlLmcuICduYW1lJykgYW5kIHRoZQotCSAqICJudWxsIiBhbm5vdGF0aW9uIHdpbGwgY3JlYXRlIGEgbmV3ICJyZWFsIiBhbm5vdGF0aW9uIGFuZCBmb3J3YXJkIHRoZQotCSAqIG5ldyBzdGF0ZSB0byBpdC4gVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgbnVsbCBjaGVja3MgaW4gdGhlIGNvbnRleHQKLQkgKiBtb2RlbCAoaG9wZWZ1bGx5KS4KLQkgKi8KLQlBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyOGE2ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IHR5cGUuICBUaGlzIGNvcnJlc3BvbmRzIHRvIGEge0BsaW5rIEFic3RyYWN0VHlwZURlY2xhcmF0aW9ufQotICogKHdoaWNoIGlzIHdoeSB0aGUgbmFtZSBpcyBzb21ld2hhdCB3b25reS4pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUKLQkJZXh0ZW5kcyBKYXZhUmVzb3VyY2VNZW1iZXIgewotCQotCS8qKgotCSAqIFByb3BlcnR5IGNoYW5nZSBTdHJpbmcgZm9yIHRoZSB1bnF1YWxpZmllZCAoc2hvcnQpIHR5cGUgbmFtZS4KLQkgKiBAc2VlIEphdmFSZXNvdXJjZU1lbWJlciNnZXROYW1lKCkKLQkgKi8KLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lLgotCSAqLwotCVN0cmluZyBnZXRRdWFsaWZpZWROYW1lKCk7Ci0JCVN0cmluZyBRVUFMSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJxdWFsaWZpZWROYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7Ci0JCVN0cmluZyBQQUNLQUdFX05BTUVfUFJPUEVSVFkgPSAicGFja2FnZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHR5cGUncyAiZGVjbGFyaW5nIHR5cGUiLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdHlwZSBpcyBhIHRvcC1sZXZlbCB0eXBlLgotCSAqLwotCVN0cmluZyBnZXREZWNsYXJpbmdUeXBlTmFtZSgpOwotCQlTdHJpbmcgREVDTEFSSU5HX1RZUEVfTkFNRV9QUk9QRVJUWSA9ICJkZWNsYXJpbmdUeXBlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgbWVtYmVyIHR5cGUuCi0JICovCi0JYm9vbGVhbiBpc01lbWJlclR5cGUoKTsKLQkJU3RyaW5nIE1FTUJFUl9UWVBFX1BST1BFUlRZID0gIm1lbWJlclR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpOwotCi0JYm9vbGVhbiBpc0luKElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlcik7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlbHkgbmVzdGVkIHR5cGVzIChjbGFzc2VzIG9yIGludGVyZmFjZXMsIG5vdCBlbnVtcyBvciBhbm5vdGF0aW9ucykgKGNoaWxkcmVuKS4KLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VUeXBlPiBnZXRUeXBlcygpOwotCQlTdHJpbmcgVFlQRVNfQ09MTEVDVElPTiA9ICJ0eXBlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIHR5cGVzOyB0aGUgdHlwZSBpdHNlbGYsIGl0cyBjaGlsZHJlbiwgaXRzIGdyYW5kY2hpbGRyZW4sCi0JICogZXRjLgotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+IGdldEFsbFR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZWx5IG5lc3RlZCBlbnVtcyAoY2hpbGRyZW4pLgotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZUVudW0+IGdldEVudW1zKCk7Ci0JCVN0cmluZyBFTlVNU19DT0xMRUNUSU9OID0gImVudW1zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgZW51bXM7IHRoZSBlbnVtIGl0c2VsZiwgaXRzIGNoaWxkcmVuLCBpdHMgZ3JhbmRjaGlsZHJlbiwKLQkgKiBldGMuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlRW51bT4gZ2V0QWxsRW51bXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjNDRmNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBhbm5vdGF0ZWQgZWxlbWVudC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQKLQlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQkvLyAqKioqKioqKioqIGFubm90YXRpb25zICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlICJhbm5vdGF0aW9ucyIgY29sbGVjdGlvbgotCSAqLwotCVN0cmluZyBBTk5PVEFUSU9OU19DT0xMRUNUSU9OID0gImFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgIm5lc3RhYmxlQW5ub3RhdGlvbnMiIGNvbGxlY3Rpb24KLQkgKi8KLQlTdHJpbmcgTkVTVEFCTEVfQU5OT1RBVElPTlNfQ09MTEVDVElPTiA9ICJuZXN0YWJsZUFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWVtYmVyJ3MgYW5ub3RhdGlvbnMgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIuCi0JICogRG8gbm90IHJldHVybiBkdXBsaWNhdGUgYW5ub3RhdGlvbnMgYXMgdGhpcyBlcnJvciBpcyBoYW5kbGVkIGJ5IHRoZSBKYXZhCi0JICogY29tcGlsZXIuCi0JICovCi0JSXRlcmFibGU8QW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBhbm5vdGF0aW9ucy4KLQkgKi8KLQlpbnQgZ2V0QW5ub3RhdGlvbnNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiB0aGUgZmlyc3QgaWYgdGhlcmUgYXJlIGR1cGxpY2F0ZXMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCSAqLwotCUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSBmaXJzdCBpZiB0aGVyZSBhcmUgZHVwbGljYXRlcyBpbiB0aGUgc291cmNlIGNvZGUuCi0JICogRG8gbm90IHJldHVybiBudWxsLCBidXQgYSBOdWxsIE9iamVjdCBpbnN0ZWFkIGlmIG5vIGFubm90YXRpb24KLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBleGlzdHMgaW4gdGhlIHNvdXJjZSBjb2RlLgotCSAqLwotCUFubm90YXRpb24gZ2V0Tm9uTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RhYmxlIGFubm90YXRpb25zIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGluIHRoZSBvcmRlciB0aGF0Ci0JICogdGhleSBhcHBlYXIuCi0JICogSWYgbmVzdGFibGUgYW5kIGNvbnRhaW5lciBhbm5vdGF0aW9ucyBhcmUgYm90aCBzcGVjaWZpZWQgb24gdGhlCi0JICogbWVtYmVyIGRpcmVjdGx5LCB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkCi0JICovCi0JLy8gVE9ETyB0aWUgdGhlIHNpbmd1bGFyIGFuZCBwbHVyYWwgYW5ub3RhdGlvbnMgdG9nZXRoZXIgc28gd2UgY2FuIGdlbmVyYXRlCi0JLy8gYSB2YWxpZGF0aW9uIGVycm9yIHdoZW4gYm90aCBhcmUgc3BlY2lmaWVkCi0JTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIG5lc3RhYmxlIGFubm90YXRpb25zIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIElmIG5lc3RhYmxlIGFuZCBjb250YWluZXIgYW5ub3RhdGlvbnMgYXJlIGJvdGggc3BlY2lmaWVkIG9uIHRoZQotCSAqIG1lbWJlciBkaXJlY3RseSwgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZAotCSAqLwotCWludCBnZXRBbm5vdGF0aW9uc1NpemUoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIElmIG5lc3RhYmxlIGFuZCBjb250YWluZXIgYW5ub3RhdGlvbnMgYXJlIGJvdGggc3BlY2lmaWVkIG9uIHRoZQotCSAqIG1lbWJlciBkaXJlY3RseSwgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZAotCSAqLwotCU5lc3RhYmxlQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGludCBpbmRleCwgU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIEFkZCBhbiBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBhbm5vdGF0aW9uLgotCSAqLwotCUFubm90YXRpb24gYWRkQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpOwotCQotCS8qKgotCSAqIEFkZCBhIG5ldyBuZXN0YWJsZSBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIENyZWF0ZSBhIG5ldyBjb250YWluZXIgYW5ub3RhdGlvbiBpZiBuZWNlc3NhcnkgYW5kIGFkZCB0aGUgbmVzdGFibGUKLQkgKiBhbm5vdGF0aW9uIHRvIGl0LgotCSAqIElmIGJvdGggdGhlIG5lc3RhYmxlIGFubm90YXRpb24gYW5kIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiBhbHJlYWR5Ci0JICogZXhpc3QsIHRoZW4gYWRkIHRvIHRoZSBjb250YWluZXIgYW5ub3RhdGlvbiwgbGVhdmluZyB0aGUgZXhpc3RpbmcKLQkgKiBuZXN0YWJsZSBhbm5vdGF0aW9uIGFsb25lLgotCSAqIElmIG9ubHkgdGhlIG5lc3RhYmxlIGFubm90YXRpb24gZXhpc3RzLCB0aGVuIGNyZWF0ZSB0aGUgbmV3IGNvbnRhaW5lcgotCSAqIGFubm90YXRpb24gYW5kIG1vdmUgdGhlIGV4aXN0aW5nIG5lc3RhYmxlIGFubm90YXRpb24gdG8gaXQgYWxvbmcgd2l0aAotCSAqIHRoZSBuZXcgb25lLiBJZiBuZWl0aGVyIGFubm90YXRpb24gZXhpc3RzLCB0aGVuIGNyZWF0ZSBhIG5ldyBuZXN0YWJsZQotCSAqIGFubm90YXRpb24uCi0JICovCi0JTmVzdGFibGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgbmVzdGFibGUgYW5ub3RhdGlvbiBhdCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVBbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZUFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBuZXN0YWJsZSBhbm5vdGF0aW9uIGZyb20gdGhlIGNvbnRhaW5lciBhbm5vdGF0aW9uIGF0IHRoZSBzcGVjaWZpZWQKLQkgKiBpbmRleC4KLQkgKiBJZiB0aGVyZSBpcyBubyBjb250YWluZXIsIGFzc3VtZSB0aGUgaW5kZXggaXMgemVybyBhbmQganVzdCByZW1vdmUgdGhlIG5lc3RhYmxlIGFubm90YXRpb24KLQkgKi8KLQl2b2lkIHJlbW92ZUFubm90YXRpb24oaW50IGluZGV4LCBTdHJpbmcgbmVzdGFibGVBbm5vdGF0aW9uTmFtZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQkJCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0b3AgbGV2ZWwgYW5ub3RhdGlvbnMuCi0JICogSWYgdGhlcmUgaXMgYSBjb250YWluZXIgYW5ub3RhdGlvbiwgcmV0dXJuIHRoYXQgYW5kIG5vdCBhbnkgbmVzdGFibGVzIHdpdGhpbiBpdC4KLQkgKiBJZiB0aGVyZSBpcyBhIG5lc3RhYmxlIGFsb25lLCByZXR1cm4gdGhhdCBhbmQgbm90IHRoZSBjb250YWluZXIuCi0JICovCi0JSXRlcmFibGU8QW5ub3RhdGlvbj4gZ2V0QWxsQW5ub3RhdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdW5kZXJseWluZyBKRFQgbWVtYmVyIGlzIGN1cnJlbnRseSBhbm5vdGF0ZWQgd2l0aCBhbnkgcmVjb2duaXplZAotCSAqIGFubm90YXRpb25zLgotCSAqLwotCWJvb2xlYW4gaXNBbm5vdGF0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB1bmRlcmx5aW5nIEpEVCBtZW1iZXIgaXMgYW5ub3RhdGVkIHdpdGggYW55IG9mIHRoZSBnaXZlbiBhbm5vdGF0aW9ucy4KLQkgKi8KLQlib29sZWFuIGlzQW5ub3RhdGVkV2l0aChJdGVyYWJsZTxTdHJpbmc+IGFubm90YXRpb25OYW1lcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQga2luZAotCSAqLwotCUtpbmQgZ2V0S2luZCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBmb3IgdGhlIG1lbWJlcidzIG5hbWUuCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBmb3IgdGhlIG5lc3RhYmxlIGFubm90YXRpb24gaWYgaXQgaXMgY3VycmVudGx5Ci0JICogdW5uZXN0ZWQuIElmIGl0IGlzIG5lc3RlZCwgcmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGZvciB0aGUgY29ycmVzcG9uZGluZwotCSAqIGNvbnRhaW5lciBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBzZWUgQW5ub3RhdGlvblByb3ZpZGVyI2dldENvbnRhaW5lckFubm90YXRpb25OYW1lKFN0cmluZykKLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogVGhlIGtpbmQgb2YgamF2YSBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBlbnVtIEtpbmQgewotCQkKLQkJLyoqCi0JCSAqIFJlcHJlc2VudHMgYW4gYW5ub3RhdGFibGUgcGFja2FnZS4KLQkJICogQW4ge0BsaW5rIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnR9IG9mIHtAbGluayBLaW5kfSBQQUNLQUdFIG1heSBzYWZlbHkgYmUgY2FzdCBhcyBhIAotCQkgKiB7QGxpbmsgSmF2YVJlc291cmNlUGFja2FnZX0KLQkJICovCi0JCVBBQ0tBR0UoQVNUTm9kZS5QQUNLQUdFX0RFQ0xBUkFUSU9OKSwKLQkJCi0JCS8qKgotCQkgKiBSZXByZXNlbnRzIGEgY2xhc3Mgb3IgaW50ZXJmYWNlLgotCQkgKiBBbiB7QGxpbmsgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudH0gb2Yge0BsaW5rIEtpbmR9IFRZUEUgbWF5IHNhZmVseSBiZSBjYXN0IGFzIGEgCi0JCSAqIHtAbGluayBKYXZhUmVzb3VyY2VUeXBlfQotCQkgKi8KLQkJVFlQRShBU1ROb2RlLlRZUEVfREVDTEFSQVRJT04pLAotCQkKLQkJLyoqCi0JCSAqIFJlcHJlc2VudHMgYW4gZW51bS4KLQkJICogQW4ge0BsaW5rIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnR9IG9mIHtAbGluayBLaW5kfSBFTlVNIG1heSBzYWZlbHkgYmUgY2FzdCBhcyBhIAotCQkgKiB7QGxpbmsgSmF2YVJlc291cmNlRW51bX0KLQkJICovCi0JCUVOVU0oQVNUTm9kZS5FTlVNX0RFQ0xBUkFUSU9OKSwKLQkJCi0JCS8qKgotCQkgKiBSZXByZXNlbnRzIGEgbWV0aG9kLgotCQkgKiBBbiB7QGxpbmsgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudH0gb2Yge0BsaW5rIEtpbmR9IE1FVEhPRCBtYXkgc2FmZWx5IGJlIGNhc3QgYXMgYSAKLQkJICoge0BsaW5rIEphdmFSZXNvdXJjZU1ldGhvZH0KLQkJICovCi0JCU1FVEhPRChBU1ROb2RlLk1FVEhPRF9ERUNMQVJBVElPTiksCi0JCQotCQkvKioKLQkJICogUmVwcmVzZW50cyBhIHR5cGUgZmllbGQuCi0JCSAqIEFuIHtAbGluayBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50fSBvZiB7QGxpbmsgS2luZH0gRklFTEQgbWF5IHNhZmVseSBiZSBjYXN0IGFzIGEgCi0JCSAqIHtAbGluayBKYXZhUmVzb3VyY2VGaWVsZH0KLQkJICovCi0JCUZJRUxEKEFTVE5vZGUuRklFTERfREVDTEFSQVRJT04pLAotCQkKLQkJLyoqCi0JCSAqIFJlcHJlc2VudHMgYW4gZW51bSBjb25zdGFudC4KLQkJICogQW4ge0BsaW5rIEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnR9IG9mIHtAbGluayBLaW5kfSBFTlVNX0NPTlNUQU5UIG1heSBzYWZlbHkgYmUgY2FzdCBhcyBhIAotCQkgKiB7QGxpbmsgSmF2YVJlc291cmNlRW51bUNvbnN0YW50fQotCQkgKi8KLQkJRU5VTV9DT05TVEFOVChBU1ROb2RlLkVOVU1fQ09OU1RBTlRfREVDTEFSQVRJT04pOwotCi0KLQkJcHJpdmF0ZSBpbnQgYXN0Tm9kZVR5cGU7Ci0KLQkJS2luZChpbnQgYXN0Tm9kZVR5cGUpIHsKLQkJCXRoaXMuYXN0Tm9kZVR5cGUgPSBhc3ROb2RlVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0QXN0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hc3ROb2RlVHlwZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQXR0cmlidXRlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTNmZWUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IGF0dHJpYnV0ZSAoZmllbGQvbWV0aG9kKQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlQXR0cmlidXRlCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VNZW1iZXIKLXsKLQlKYXZhUmVzb3VyY2VUeXBlIGdldFBhcmVudCgpOwotCi0JSmF2YVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGltcGxlbWVudHMgb3IgZXh0ZW5kcyB0aGUgc3BlY2lmaWVkCi0JICogdHlwZS4KLQkgKi8KLQlib29sZWFuIHR5cGVJc1N1YlR5cGVPZihTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzIHR5cGUgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZSB0eXBlCi0JICogKGkuZS4gYW55IHByaW1pdGl2ZSB0eXBlIGV4Y2VwdCAndm9pZCcpLgotCSAqLwotCWJvb2xlYW4gdHlwZUlzVmFyaWFibGVQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIEBzZWUgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXIKLQkgKi8KLQlpbnQgZ2V0TW9kaWZpZXJzKCk7Ci0JCVN0cmluZyBNT0RJRklFUlNfUFJPUEVSVFkgPSAibW9kaWZpZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvbHZlZCwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSdzIHR5cGUKLQkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb24iIG9yICJieXRlW10iKS4KLQkgKiBJZiB0aGUgdHlwZSBpcyBhbiBhcnJheSwgdGhpcyBuYW1lIHdpbGwgaW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyCi0JICogb2YgYnJhY2tldCBwYWlycy4KLQkgKiBUaGlzIG5hbWUgd2lsbCBub3QgaW5jbHVkZSB0aGUgdHlwZSdzIGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLQkgKiAoZS5nLiAiamF2YS51dGlsLkNvbGxlY3Rpb248amF2YS5sYW5nLlN0cmluZz4iIHdpbGwgb25seSByZXR1cm4KLQkgKiAiamF2YS51dGlsLkNvbGxlY3Rpb24iKS4KLQkgKiBAc2VlICN0eXBlVHlwZUFyZ3VtZW50TmFtZXMoKQotCSAqLwotCVN0cmluZyBnZXRUeXBlTmFtZSgpOwotCQlTdHJpbmcgVFlQRV9OQU1FX1BST1BFUlRZID0gInR5cGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGludGVyZmFjZS4KLQkgKi8KLQlib29sZWFuIHR5cGVJc0ludGVyZmFjZSgpOwotCQlTdHJpbmcgVFlQRV9JU19JTlRFUkZBQ0VfUFJPUEVSVFkgPSAidHlwZUlzSW50ZXJmYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGVudW0uCi0JICovCi0JYm9vbGVhbiB0eXBlSXNFbnVtKCk7Ci0JCVN0cmluZyBUWVBFX0lTX0VOVU1fUFJPUEVSVFkgPSAidHlwZUlzRW51bSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgdHlwZSBpcyBhbiBhcnJheS4KLQkgKi8KLQlib29sZWFuIHR5cGVJc0FycmF5KCk7Ci0JCVN0cmluZyBUWVBFX0lTX0FSUkFZX1BST1BFUlRZID0gInR5cGVJc0FycmF5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIGFycmF5LCAwIG90aGVyd2lzZS4KLQkgKiAoU3RyaW5nW11bXSAtPiAyLCBDb2xsZWN0aW9uPFN0cmluZz4gLT4gMCkKLQkgKi8KLQlpbnQgZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKTsKLQkJU3RyaW5nIFRZUEVfQVJSQVlfRElNRU5TSU9OQUxJVFlfUFJPUEVSVFkgPSAidHlwZUFycmF5RGltZW5zaW9uYWxpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb21wb25lbnQgdHlwZSBuYW1lIG9mIHRoZSBhcnJheSwgbnVsbCBvdGhlcndpc2UuCi0JICogKFN0cmluZ1tdW10gLT4gImphdmEubGFuZy5TdHJpbmciLCBDb2xsZWN0aW9uPFN0cmluZz4gLT4gbnVsbCkKLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKTsKLQkJU3RyaW5nIFRZUEVfQVJSQVlfQ09NUE9ORU5UX1RZUEVfTkFNRV9QUk9QRVJUWSA9ICJ0eXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZSdzIHN1cGVyY2xhc3Nlcy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlU3VwZXJjbGFzc05hbWVzKCk7Ci0JCVN0cmluZyBUWVBFX1NVUEVSQ0xBU1NfTkFNRVNfTElTVCA9ICJ0eXBlU3VwZXJjbGFzc05hbWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgYXR0cmlidXRlIHR5cGUncyBpbnRlcmZhY2VzLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZUludGVyZmFjZU5hbWVzKCk7Ci0JCVN0cmluZyBUWVBFX0lOVEVSRkFDRV9OQU1FU19DT0xMRUNUSU9OID0gInR5cGVJbnRlcmZhY2VOYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlJ3MgdHlwZSBhcmd1bWVudHMuCi0JICogVGhlIG5hbWUgZm9yIGFueSBhcmd1bWVudCB0aGF0IGlzIGFuIGFycmF5IHdpbGwgY29udGFpbiB0aGUgYXBwcm9wcmlhdGUKLQkgKiBudW1iZXIgb2YgYnJhY2tldCBwYWlycy4KLQkgKiBUaGUgbmFtZXMgd2lsbCBub3QgaW5jbHVkZSBhbnkgZnVydGhlciBnZW5lcmljIHR5cGUgYXJndW1lbnRzLgotCSAqLwotCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVUeXBlQXJndW1lbnROYW1lcygpOwotCQlTdHJpbmcgVFlQRV9UWVBFX0FSR1VNRU5UX05BTUVTX0xJU1QgPSAidHlwZVR5cGVBcmd1bWVudE5hbWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JaW50IGdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKTsKLQotCVN0cmluZyBnZXRUeXBlVHlwZUFyZ3VtZW50TmFtZShpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNsYXNzRmlsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VDbGFzc0ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkYTA3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNsYXNzRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotCi0KLS8qKgotICogSmF2YSBjbGFzcyBmaWxlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VDbGFzc0ZpbGUKLQlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZpbGUncyB0eXBlLgotCSAqLwotCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRUeXBlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdmNzE3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotCi0vKioKLSAqIERhbGkgcmVzb3VyY2UgZm9yIEpEVCBjb21waWxhdGlvbiB1bml0LgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0Ci0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlLlJvb3QKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgSkRUIGNvbXBpbGF0aW9uIHVuaXQuCi0JICovCi0JSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBhbm5vdGF0aW9uIGZvcm1hdHRlci4gVGhpcyBpcyB1c2VkIHRvIG1ha2UgYW55Ci0JICogbWFuaXB1bGF0ZWQgYW5ub3RhdGlvbnMgcmVhc29uYWJseSByZWFkYWJsZSBhZnRlciBiZWluZyB3cml0dGVuIHRvIHRoZQotCSAqIEphdmEgc291cmNlIGZpbGUuCi0JICovCi0JQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIgZ2V0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIoKTsKLQotCS8qKgotCSAqIFRoaXMgYWxsb3dzIHRoZSByZXNvdXJjZSBtb2RlbCB0byBtb2RpZnkgdGhlIEphdmEgc291cmNlIGNvZGUgb24gdGhlCi0JICogVUkgdGhyZWFkIHdoZW4gaXQgaXMgZXhlY3V0aW5nIG9uIGFub3RoZXIgdGhyZWFkLgotCSAqLwotCUNvbW1hbmRFeGVjdXRvciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpOwotCi0JLyoqCi0JICogUmVzb2x2ZSB0eXBlIGluZm9ybWF0aW9uIHRoYXQgY291bGQgYmUgZGVwZW5kZW50IG9uIG90aGVyIGZpbGVzIGJlaW5nCi0JICogYWRkZWQvcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIHJlc29sdmVUeXBlcygpOwotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgdHlwZSBvZiB0aGUgQVNUIGNvbXBpbGF0aW9uIHVuaXQsIGNhbiBiZSBudWxsLgotCSAqIFRoaXMgaXMgbmFtZWQgdGhlIHNhbWUgYXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCi0JICovCi0JSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldFByaW1hcnlUeXBlKCk7Ci0KLQkvKioKLQkgKiBTb21ldGhpbmcgaW4gSmF2YSBoYXMgY2hhbmdlZCAodHlwaWNhbGx5IGVpdGhlciB0aGUgY29tcGlsYXRpb24gdW5pdCdzCi0JICogc291cmNlIGNvZGUgb3IgdGhlIEphdmEgY2xhc3NwYXRoKTsgc3luY2hyb25pemUgdGhlIGNvbXBpbGF0aW9uIHVuaXQncwotCSAqIHN0YXRlIHdpdGggdGhlIEphdmEgc291cmNlIGNvZGUgZXRjLgotCSAqLwotCXZvaWQgc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSgpOwotCi0JLyoqCi0JICogQnVpbGQgYW4gQVNUIGZvciB0aGUgY29tcGlsYXRpb24gdW5pdCB3aXRoIGl0cyBiaW5kaW5ncyByZXNvbHZlZC4KLQkgKi8KLQlDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlRW51bS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NGQ5NWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi0KLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBlbnVtLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlRW51bQotCWV4dGVuZHMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlCi17Ci0KLQotCS8vICoqKioqKioqKiogZW51bSBjb25zdGFudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnVtJ3MgZW51bSBjb25zdGFudHMuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiBnZXRFbnVtQ29uc3RhbnRzKCk7Ci0JCVN0cmluZyBFTlVNX0NPTlNUQU5UU19DT0xMRUNUSU9OID0gImVudW1Db25zdGFudHMiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUVudW1Db25zdGFudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcyYzRjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUVudW1Db25zdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBlbnVtIGNvbnN0YW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQKLQlleHRlbmRzIEphdmFSZXNvdXJjZU1lbWJlcgotewotCS8qKgotCSAqIFRoZSBKYXZhIHJlc291cmNlIGVudW0gY29uc3RhbnQncyBuYW1lIGRvZXMgbm90IGNoYW5nZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUZpZWxkLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTlmOTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlIG9yIGJpbmFyeSBmaWVsZAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlRmllbGQKLQlleHRlbmRzIEphdmFSZXNvdXJjZUF0dHJpYnV0ZQotewotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNZW1iZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTWVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2JlZTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUgb3IgYmluYXJ5IHBlcnNpc3RlbnQgbWVtYmVyLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlTWVtYmVyCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50Ci17Ci0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFNldHMgdGhlIHNwZWNpZmllZCBwcmltYXJ5IGFubm90YXRpb24gYXMgdGhlIGZpcnN0IGFubm90YXRpb24sIGFuZCByZW1vdmVzIGFsbCBrbm93biAKLQkgKiBhbm5vdGF0aW9ucyAoaS5lLiBkb2VzIG5vdCByZW1vdmUgbm9uLXBlcnNpc3RlbmNlIGFubm90YXRpb25zKSB3aGljaCBhcmUgbm90IGluY2x1ZGVkCi0JICogaW4gdGhlIHN1cHBvcnRpbmcgYW5ub3RhdGlvbnMuCi0JICovCi0JQW5ub3RhdGlvbiBzZXRQcmltYXJ5QW5ub3RhdGlvbihTdHJpbmcgcHJpbWFyeUFubm90YXRpb25OYW1lLCBJdGVyYWJsZTxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpOwotCi0KLQotCS8vICoqKioqKioqKiogbW9kaWZpZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZW1iZXIgaXMgZmluYWwuCi0JICovCi0JYm9vbGVhbiBpc0ZpbmFsKCk7Ci0JCVN0cmluZyBGSU5BTF9QUk9QRVJUWSA9ICJmaW5hbCI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNUcmFuc2llbnQoKTsKLQkJU3RyaW5nIFRSQU5TSUVOVF9QUk9QRVJUWSA9ICJ0cmFuc2llbnQiOyAvLyROT04tTkxTLTEkCi0KLQlib29sZWFuIGlzUHVibGljKCk7Ci0JCVN0cmluZyBQVUJMSUNfUFJPUEVSVFkgPSAicHVibGljIjsgLy8kTk9OLU5MUy0xJAotCi0JYm9vbGVhbiBpc1N0YXRpYygpOwotCQlTdHJpbmcgU1RBVElDX1BST1BFUlRZID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNQcm90ZWN0ZWQoKTsKLQkJU3RyaW5nIFBST1RFQ1RFRF9QUk9QRVJUWSA9ICJwcm90ZWN0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgSmF2YSByZXNvdXJjZSBtZW1iZXIgaXMgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBtZW1iZXIuCi0JICovCi0JYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpOwotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXNvbHZlIHR5cGUgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBkZXBlbmRlbnQgb24gY2hhbmdlcyBlbHNld2hlcmUKLQkgKiBpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXZvaWQgcmVzb2x2ZVR5cGVzKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBKYXZhIHJlc291cmNlIG1lbWJlciBpcyBwdWJsaWMgb3IgcHJvdGVjdGVkCi0JICovCi0JYm9vbGVhbiBpc1B1YmxpY09yUHJvdGVjdGVkKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1ldGhvZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1ZmY5My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1ldGhvZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5NZXRob2RTaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogSmF2YSBzb3VyY2UgY29kZSBvciBiaW5hcnkgbWV0aG9kCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VNZXRob2QKLQkJZXh0ZW5kcyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgewotCQotCS8vICoqKioqIG1ldGhvZCBuYW1lICoqKioqCi0JCi0JLyoqCi0JICogVGhlIEphdmEgcmVzb3VyY2UgbWV0aG9kJ3MgbmFtZSBkb2VzIG5vdCBjaGFuZ2UuCi0JICovCi0JU3RyaW5nIGdldE1ldGhvZE5hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiBwYXJhbWV0ZXIgdHlwZSBuYW1lcyAqKioqKgotCQotCVN0cmluZyBQQVJBTUVURVJfVFlQRV9OQU1FU19MSVNUID0gInBhcmFtZXRlclR5cGVOYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRQYXJhbWV0ZXJUeXBlTmFtZXMoKTsKLQkJCi0JU3RyaW5nIGdldFBhcmFtZXRlclR5cGVOYW1lKGludCBpbmRleCk7Ci0JCi0JaW50IGdldFBhcmFtZXRlcnNTaXplKCk7Ci0JCi0JCi0JLy8gKioqKiogY29uc3RydWN0b3IgKioqKioKLQkKLQlTdHJpbmcgQ09OU1RSVUNUT1JfUFJPUEVSVFkgPSAiY29uc3RydWN0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCk7Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlzIGZvciB0aGUgc3BlY2lmaWVkCi0JICogbWV0aG9kLgotCSAqLwotCWJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VOb2RlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlNDQ2ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBDb21tb24gaW50ZXJmYWNlIGZvciBKYXZhIHJlc291cmNlIG5vZGVzIChzb3VyY2UgY29kZSBvciBiaW5hcnkpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlTm9kZQotCWV4dGVuZHMgTW9kZWwKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUncyBwYXJlbnQgbm9kZS4KLQkgKi8KLQlKYXZhUmVzb3VyY2VOb2RlIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBFY2xpcHNlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgSmF2YSByZXNvdXJjZSBub2RlCi0JICogKHR5cGljYWxseSBlaXRoZXIgYSBKYXZhIHNvdXJjZSBjb2RlIGZpbGUgb3IgYSBKQVIpLgotCSAqLwotCUlGaWxlIGdldEZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBvZiB0aGUgSmF2YSByZXNvdXJjZSBjb250YWlubWVudCBoaWVyYXJjaHkKLQkgKiAodHlwaWNhbGx5IGVpdGhlciBhIGNvbXBpbGF0aW9uIHVuaXQgb3IgYSBwYWNrYWdlIGZyYWdtZW50IHJvb3QpLgotCSAqLwotCVJvb3QgZ2V0Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBbc291cmNlXSBub2RlJ3Mgcm9vdCAodGhlIGNvbXBpbGF0aW9uIHVuaXQpLgotCSAqLwotCS8vIFRPRE8gZ2V0IHJpZCBvZiB0aGlzIG1ldGhvZC4uLj8KLQlKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFtzb3VyY2VdIG5vZGUncyB0ZXh0IHJhbmdlIGluIHRoZSBjb21waWxhdGlvbiB1bml0J3MgZmlsZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIFtzb3VyY2VdIG5vZGUgZnJvbSB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIFtzb3VyY2VdIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8qKgotCSAqIFJvb3Qgb2YgSmF2YSByZXNvdXJjZSBtb2RlbCBjb250YWlubWVudCBoaWVyYXJjaHkuCi0JICovCi0JaW50ZXJmYWNlIFJvb3QKLQkJCWV4dGVuZHMgSmF2YVJlc291cmNlTm9kZSwgSnB0UmVzb3VyY2VNb2RlbCB7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSByb290J3MgSmF2YSByZXNvdXJjZSAiYWJzdHJhY3QiIHR5cGVzLgotCQkgKi8KLQkJSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRUeXBlcygpOwotCQkJU3RyaW5nIFRZUEVTX0NPTExFQ1RJT04gPSAidHlwZXMiOyAvLyROT04tTkxTLTEkCi0JCQotCQkvKioKLQkJICogQ2FsbGVkICh2aWEgYSBob29rIGluIGNoYW5nZSBub3RpZmljYXRpb24pIHdoZW5ldmVyIGFueXRoaW5nIGluIHRoZQotCQkgKiBKYXZhIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuIEZvcndhcmRlZCB0byBsaXN0ZW5lcnMuCi0JCSAqLwotCQl2b2lkIHJlc291cmNlTW9kZWxDaGFuZ2VkKCk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBhbm5vdGF0aW9uIHByb3ZpZGVyIHRoYXQgc3VwcGxpZXMgdGhlIGFubm90YXRpb25zIGZvdW5kCi0JCSAqIGluIHRoZSBKYXZhIHJlc291cmNlIG1vZGVsLgotCQkgKi8KLQkJQW5ub3RhdGlvblByb3ZpZGVyIGdldEFubm90YXRpb25Qcm92aWRlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWI5NTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqIENvcHlyaWdodCAoYykgMjAxMCBSZWQgSGF0LCBJbmMuCi0gICogRGlzdHJpYnV0ZWQgdW5kZXIgbGljZW5zZSBieSBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICAqCi0gICogQ29udHJpYnV0b3I6Ci0gICogICAgIFJlZCBIYXQsIEluYy4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBAYXV0aG9yIERtaXRyeSBHZXJhc2tvdgotICoKLSAqIEphdmEgc291cmNlIGNvZGUgb2YgcGFja2FnZS1pbmZvCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZVBhY2thZ2UKLQkJZXh0ZW5kcyBKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHsKLQkKLQkvKioKLQkgKiBUaGUgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHBhY2thZ2UncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2NlYjI3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLQotCi0KLS8qKgotICogSmF2YSBwYWNrYWdlIGZyYWdtZW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnQKLQlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgZnJhZ21lbnQncyBjbGFzcyBmaWxlcyB0aGF0IGNvbnRhaW4gImFubm90YXRlZCIgdHlwZXMuCi0JICogQW5ub3RhdGVkIHdpdGggdGhlIGFubm90YXRpb25zIHdlIGNhcmUgYWJvdXQsIAotCSAqIEBzZWUgQW5ub3RhdGlvblByb3ZpZGVyCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlQ2xhc3NGaWxlPiBnZXRDbGFzc0ZpbGVzKCk7Ci0JCVN0cmluZyBDTEFTU19GSUxFU19DT0xMRUNUSU9OID0gImNsYXNzRmlsZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnQncyBjbGFzcyBmaWxlcy4KLQkgKi8KLQlpbnQgZ2V0Q2xhc3NGaWxlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCdzIEphdmEgdHlwZXMuCi0JICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIEphdmFSZXNvdXJjZVR5cGVzIG9mIHRoZSBjbGFzc0ZpbGVzLgotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0VHlwZXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIwODJjNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLQotLyoqCi0gKiBKYXZhIHBhY2thZ2UgZnJhZ2VtZW50IHJvb3QKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QKLQlleHRlbmRzIEphdmFSZXNvdXJjZU5vZGUuUm9vdAotewotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290J3MgcGFja2FnZSBmcmFnbWVudHMuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50PiBnZXRQYWNrYWdlRnJhZ21lbnRzKCk7Ci0JCVN0cmluZyBQQUNLQUdFX0ZSQUdNRU5UU19DT0xMRUNUSU9OID0gInBhY2thZ2VGcmFnbWVudHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCdzIHBhY2thZ2UgZnJhZ21lbnRzLgotCSAqLwotCWludCBnZXRQYWNrYWdlRnJhZ21lbnRzU2l6ZSgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNzE2MTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBEYWxpIHJlc291cmNlIGZvciBKRFQgY29tcGlsYXRpb24gdW5pdCBuYW1lZCBwYWNrYWdlLWluZm8uamF2YS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZXNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0Ci0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQKLXsKLQlKYXZhUmVzb3VyY2VQYWNrYWdlIGdldFBhY2thZ2UoKTsKLQkJU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJkZDIwMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi0KLS8qKgotICogSmF2YSBzb3VyY2UgY29kZSBvciBiaW5hcnkgY2xhc3Mgb3IgaW50ZXJmYWNlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlVHlwZQotCWV4dGVuZHMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0eXBlJ3Mgc3VwZXJjbGFzcy4KLQkgKi8KLQlTdHJpbmcgZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKTsKLQkJU3RyaW5nIFNVUEVSQ0xBU1NfUVVBTElGSUVEX05BTUVfUFJPUEVSVFkgPSAic3VwZXJjbGFzc1F1YWxpZmllZE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhYnN0cmFjdC4KLQkgKi8KLQlib29sZWFuIGlzQWJzdHJhY3QoKTsKLQkJU3RyaW5nIEFCU1RSQUNUX1BST1BFUlRZID0gImFic3RyYWN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaGFzIGEgbm8tYXJnIGNvbnN0cnVjdG9yIChwcml2YXRlLCBwcm90ZWN0ZWQsIG9yIHB1YmxpYykKLQkgKi8KLQlib29sZWFuIGhhc05vQXJnQ29uc3RydWN0b3IoKTsKLQkJU3RyaW5nIE5PX0FSR19DT05TVFJVQ1RPUl9QUk9QRVJUWSA9ICJub0FyZ0NvbnN0cnVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaGFzIGEgcHJpdmF0ZSBuby1hcmcgY29uc3RydWN0b3IKLQkgKi8KLQlib29sZWFuIGhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKCk7Ci0JCVN0cmluZyBQUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUl9QUk9QRVJUWSA9ICJwcml2YXRlTm9BcmdDb25zdHJ1Y3RvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBoYXMgYSBwdWJsaWMgb3IgcHJvdGVjdGVkIG5vLWFyZyBjb25zdHJ1Y3RvciAqb3IqIG9ubHkgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlib29sZWFuIGhhc1B1YmxpY09yUHJvdGVjdGVkTm9BcmdDb25zdHJ1Y3RvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaGFzIGEgcHVibGljIG9yIHByb3RlY3RlZCBuby1hcmcgY29uc3RydWN0b3IgKm9yKiBvbmx5IHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JYm9vbGVhbiBoYXNQdWJsaWNOb0FyZ0NvbnN0cnVjdG9yKCk7Ci0JCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGhhcyBhbnkgZmllbGQgdGhhdCBoYXZlIHJlbGV2YW50IGFubm90YXRpb25zCi0JICogb24gdGhlbSAod2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHR5cGUncyBhY2Nlc3MgdHlwZSkuCi0JICovCi0JYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRGaWVsZHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGhhcyBhbnkgZmllbGQgdGhhdCBoYXZlIHJlbGV2YW50IGFubm90YXRpb25zCi0JICogb24gdGhlbSAod2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHR5cGUncyBhY2Nlc3MgdHlwZSkuCi0JICovCi0JYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRNZXRob2RzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBoYXMgZXF1YWxzKCkgbWV0aG9kCi0JICovCi0JYm9vbGVhbiBoYXNFcXVhbHNNZXRob2QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBoYXMgaGFzaENvZGUoKSBtZXRob2QKLQkgKi8KLQlib29sZWFuIGhhc0hhc2hDb2RlTWV0aG9kKCk7Ci0KLQkvLyAqKioqKioqKioqIGZpZWxkcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBmaWVsZHMuCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+IGdldEZpZWxkcygpOwotCQlTdHJpbmcgRklFTERTX0NPTExFQ1RJT04gPSAiZmllbGRzIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgbWV0aG9kcy4gVGhpcyByZXR1cm5zICphbGwqIG1ldGhvZHMgZnJvbSB0aGUgSkRUIFR5cGUKLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGdldE1ldGhvZHMoKTsKLQkJU3RyaW5nIE1FVEhPRFNfQ09MTEVDVElPTiA9ICJtZXRob2RzIjsgLy8kTk9OLU5MUy0xJAotCi0JSmF2YVJlc291cmNlTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZUNhY2hlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZVR5cGVDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQ1ZTdlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogSmF2YSBwZXJzaXN0ZW50IHR5cGUgY2FjaGUgLSB1c2VkIHRvIGhvbGQgImV4dGVybmFsIiB0eXBlcwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlc291cmNlVHlwZUNhY2hlCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VOb2RlLlJvb3QKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUncyB0eXBlcy4KLQkgKi8KLQlpbnQgZ2V0VHlwZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBKYXZhIHJlc291cmNlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgSkRUIHR5cGUgdG8gdGhlCi0JICogY2FjaGUuIFJldHVybiB0aGUgbmV3IHR5cGUuCi0JICovCi0JSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZFR5cGUoSVR5cGUgamR0VHlwZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB0eXBlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBKQVIgZmlsZS4KLQkgKiBSZXR1cm4gd2hldGhlciBhbnkgdHlwZXMgd2VyZSByZW1vdmVkLgotCSAqLwotCWJvb2xlYW4gcmVtb3ZlVHlwZXMoSUZpbGUgamFyRmlsZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBbm5vdGF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQzNjRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Jlc291cmNlL2phdmEvTmVzdGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgZGVhbGluZyB3aXRoIGFubm90YXRpb25zIHRoYXQgY2FuIGJlICJuZXN0ZWQiIHdpdGhpbiBvdGhlcgotICogYW5ub3RhdGlvbnMsIHR5cGljYWxseSB3aXRoaW4gYXJyYXlzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmVzdGFibGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogTW92ZSB0aGUgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGluZGV4IHdpdGhpbiBpdHMgY29udGFpbmVyIGFubm90YXRpb24uCi0JICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiBpcyBhY3R1YWxseSBuZXN0ZWQuCi0JICovCi0Jdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvcmVzb3VyY2UvamF2YS9OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI5Nzg0Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS9yZXNvdXJjZS9qYXZhL05lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLQotLyoqCi0gKiBVc2VkIHRvIGJ1aWxkIE5lc3RhYmxlQW5ub3RhdGlvbnMgZGlzY292ZXJlZCBpbiB0aGUgSmF2YSBzb3VyY2UgY29kZS4KLSAqIFRvIHByb3ZpZGUgbmV3IE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zLCBjcmVhdGUgYSBuZXcgSmF4YlBsYXRmb3JtCi0gKiBieSBpbXBsZW1lbnRpbmcgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbi4KLSAqIAotICogQHNlZSBOZXN0YWJsZUFubm90YXRpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhbm5vdGF0aW9uIHRoZSBkZWZpbml0aW9uIHdpbGwgYnVpbGQgaW4gdGhlCi0JICogdmFyaW91cyAjYnVpbGQuLi4oLi4uKSBtZXRob2RzLgotCSAqLwotCVN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKTsKLQotCVN0cmluZyBnZXRFbGVtZW50TmFtZSgpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBhbm5vdGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGFubm90YXRlZCBlbGVtZW50LgotCSAqLwotCU5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBKRFQgYW5ub3RhdGlvbgotCSAqIG9uIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGVkIGVsZW1lbnQuCi0JICovCi0JTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQWJzdHJhY3RUZXh0UmFuZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQWJzdHJhY3RUZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2ZTY1My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L0Fic3RyYWN0VGV4dFJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuU2ltcGxlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBQYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRleHQgcmFuZ2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUZXh0UmFuZ2UKLQlpbXBsZW1lbnRzIFRleHRSYW5nZQotewotCXByb3RlY3RlZCBBYnN0cmFjdFRleHRSYW5nZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpIHsKLQkJcmV0dXJuICh0aGlzLmdldE9mZnNldCgpIDw9IGluZGV4KSAmJiAoaW5kZXggPCB0aGlzLmdldEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0b3VjaGVzKGludCBpbmRleCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0T2Zmc2V0KCkgPD0gaW5kZXgpICYmIChpbmRleCA8PSB0aGlzLmdldEVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIG9mZnNldCBpcyA8ZW0+ZXhjbHVzaXZlPC9lbT4sIGkuZS4gdGhlIGVsZW1lbnQgYXQgdGhlIGVuZCBvZmZzZXQKLQkgKiBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIHJhbmdlLgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPZmZzZXQoKSArIHRoaXMuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gKChvZmZzZXQgPT0gdGhpcy5nZXRPZmZzZXQoKSkgJiYKLQkJCQkobGVuZ3RoID09IHRoaXMuZ2V0TGVuZ3RoKCkpICYmCi0JCQkJKGxpbmVOdW1iZXIgPT0gdGhpcy5nZXRMaW5lTnVtYmVyKCkpKSA/Ci0JCQkJCXRoaXMgOgotCQkJCQluZXcgU2ltcGxlVGV4dFJhbmdlKG9mZnNldCwgbGVuZ3RoLCBsaW5lTnVtYmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgVGV4dFJhbmdlKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVRleHRSYW5nZSBvdGhlciA9IChUZXh0UmFuZ2UpIG87Ci0JCXJldHVybiAob3RoZXIuZ2V0T2Zmc2V0KCkgPT0gdGhpcy5nZXRPZmZzZXQoKSkKLQkJCQkmJiAob3RoZXIuZ2V0TGVuZ3RoKCkgPT0gdGhpcy5nZXRMZW5ndGgoKSkKLQkJCQkmJiAob3RoZXIuZ2V0TGluZU51bWJlcigpID09IHRoaXMuZ2V0TGluZU51bWJlcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPZmZzZXQoKSBeIHRoaXMuZ2V0TGVuZ3RoKCkgXiB0aGlzLmdldExpbmVOdW1iZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgc3RhcnQgPSBTdHJpbmcudmFsdWVPZih0aGlzLmdldE9mZnNldCgpKTsKLQkJU3RyaW5nIGVuZCA9IFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0RW5kKCkpOwotCQlTdHJpbmcgbGluZSA9IFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0TGluZU51bWJlcigpKTsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgc3RhcnQgKyAiLCAiICsgZW5kICsgIiBbIiArIGxpbmUgKyAnXScpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L0JvZHlTb3VyY2VXcml0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQm9keVNvdXJjZVdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWFiZWViLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvQm9keVNvdXJjZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSW5kZW50aW5nUHJpbnRXcml0ZXJ9IHdpdGggc29tZSBtZXRob2RzIHRoYXQgZmFjaWxpdGF0ZQotICogYnVpbGRpbmcgY2xhc3Mgc291cmNlIGNvZGUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJvZHlTb3VyY2VXcml0ZXIKLQlleHRlbmRzIEluZGVudGluZ1ByaW50V3JpdGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKLQkvLyBrZXkgPSBzaG9ydCBjbGFzcyBuYW1lOyB2YWx1ZSA9IGltcG9ydCBwYWNrYWdlCi0JcHJvdGVjdGVkIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBpbXBvcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPigpOwotCi0JcHVibGljIEJvZHlTb3VyY2VXcml0ZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXN1cGVyKG5ldyBTdHJpbmdXcml0ZXIoMjAwMCkpOwotCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCXRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5vdXQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuICgoU3RyaW5nV3JpdGVyKSB0aGlzLm91dCkuZ2V0QnVmZmVyKCkubGVuZ3RoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRWaXNpYmlsaXR5KFN0cmluZyB2aXNpYmlsaXR5TW9kaWZpZXIpIHsKLQkJaWYgKHZpc2liaWxpdHlNb2RpZmllci5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnByaW50KHZpc2liaWxpdHlNb2RpZmllcik7Ci0JCQl0aGlzLnByaW50KCcgJyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXRoaXMucHJpbnQoJ0AnKTsKLQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQl0aGlzLnByaW50KHRoaXMuYnVpbGRJbXBvcnRlZFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludEZpZWxkKFN0cmluZyBmaWVsZE5hbWUsIFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIFN0cmluZyB2aXNpYmlsaXR5KSB7Ci0JCXRoaXMucHJpbnRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCQl0aGlzLnByaW50VHlwZURlY2xhcmF0aW9uKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXRoaXMucHJpbnQoJyAnKTsKLQkJdGhpcy5wcmludChmaWVsZE5hbWUpOwotCQl0aGlzLnByaW50KCc7Jyk7Ci0JCXRoaXMucHJpbnRsbigpOwotCQl0aGlzLnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFBhcmFtZXRlcml6ZWRGaWVsZChTdHJpbmcgZmllbGROYW1lLCBTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgcGFyYW1ldGVyVHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgdmlzaWJpbGl0eSkgewotCQl0aGlzLnByaW50VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQkJdGhpcy5wcmludFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQl0aGlzLnByaW50KCc8Jyk7Ci0JCXRoaXMucHJpbnRUeXBlRGVjbGFyYXRpb24ocGFyYW1ldGVyVHlwZURlY2xhcmF0aW9uKTsKLQkJdGhpcy5wcmludCgnPicpOwotCQl0aGlzLnByaW50KCcgJyk7Ci0JCXRoaXMucHJpbnQoZmllbGROYW1lKTsKLQkJdGhpcy5wcmludCgnOycpOwotCQl0aGlzLnByaW50bG4oKTsKLQkJdGhpcy5wcmludGxuKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIDxlbT5TdHJpbmcgTGl0ZXJhbDwvZW0+IGFuZCBwcmludCBpdCwKLQkgKiBhZGRpbmcgdGhlIHN1cnJvdW5kaW5nIGRvdWJsZS1xdW90ZXMgYW5kIGVzY2FwaW5nIGNoYXJhY3RlcnMKLQkgKiBhcyBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgcHJpbnRTdHJpbmdMaXRlcmFsKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzdHJpbmcsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbXBvcnRzICoqKioqKioqKioKLQotCS8vICoqKioqIHdyaXRpbmcKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzICJpbXBvcnRlZCIgbmFtZS4KLQkgKiBUaGUgY2xhc3MgZGVjbGFyYXRpb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKLQkgKiAgICAgImludCIKLQkgKiAgICAgImludFtdIiAobm90ICJbSSIpCi0JICogICAgICJqYXZhLmxhbmcuT2JqZWN0IgotCSAqICAgICAiamF2YS5sYW5nLk9iamVjdFtdIiAobm90ICJbTGphdmEubGFuZy5PYmplY3Q7IikKLQkgKiAgICAgImphdmEudXRpbC5NYXAuRW50cnkiIChub3QgImphdmEudXRpbC5NYXAkRW50cnkiKQotCSAqICAgICAiamF2YS51dGlsLk1hcC5FbnRyeVtdW10iIChub3QgIltbTGphdmEudXRpbC5NYXAkRW50cnk7IikKLQkgKiAgICAgCi0JICogVG8gcmVhbGx5IGRvIHRoaXMgcmlnaHQsIHdlIHdvdWxkIG5lZWQgdG8gZ2F0aGVyIGFsbCB0aGUgdHlwZXMgZnJvbQotCSAqIHRoZSAidW5hbWVkIiAoZGVmYXVsdCkgcGFja2FnZSB0aGF0IHdlcmUgcmVmZXJlbmNlZCBpbiB0aGUKLQkgKiBjb21waWxhdGlvbiB1bml0IGJlZm9yZWhhbmQuICpBbnkqIGNvbGxpc2lvbnMgd2l0aCBvbmUgb2YgdGhlc2UKLQkgKiB0eXBlcyB3b3VsZCBoYXZlIHRvIGJlIGZ1bGx5IHF1YWxpZmllZCAod2hldGhlciBpdCB3YXMgZnJvbQotCSAqICdqYXZhLmxhbmcnIG9yIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIGN1cnJlbnQgY29tcGlsYXRpb24gdW5pdCkuCi0JICogSW4gb3RoZXIgd29yZHMsIGlmIHdlIGhhdmUgYW55IHR5cGVzIGZyb20gdGhlICJ1bm5hbWVkIiBwYWNrYWdlLAotCSAqIHJlc3VsdHMgYXJlIHVucHJlZGljdGFibGUuLi4uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEltcG9ydGVkVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaWYgKHRoaXMudHlwZURlY2xhcmF0aW9uSXNNZW1iZXJDbGFzcyh0eXBlRGVjbGFyYXRpb24pKSB7Ci0JCQkvLyBubyBuZWVkIGZvciBhbiBpbXBvcnQsIGp1c3QgcmV0dXJuIHRoZSBwYXJ0aWFsbHktcXVhbGlmaWVkIG5hbWUKLQkJCXJldHVybiB0aGlzLmJ1aWxkTWVtYmVyQ2xhc3NUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJfQotCQlpbnQgbGFzdCA9IHR5cGVEZWNsYXJhdGlvbi5sYXN0SW5kZXhPZignLicpOwotCQlTdHJpbmcgY3VycmVudFBhY2thZ2VOYW1lID0gKGxhc3QgPT0gLTEpID8gIiIgOiB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIGxhc3QpOwotCQlTdHJpbmcgc2hvcnRUeXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKGxhc3QgKyAxKTsKLQkJU3RyaW5nIHNob3J0RWxlbWVudFR5cGVOYW1lID0gc2hvcnRUeXBlRGVjbGFyYXRpb247Ci0JCXdoaWxlIChzaG9ydEVsZW1lbnRUeXBlTmFtZS5lbmRzV2l0aCgiW10iKSkgewotCQkJc2hvcnRFbGVtZW50VHlwZU5hbWUgPSBzaG9ydEVsZW1lbnRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgc2hvcnRFbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJfQotCQlJbXBvcnRQYWNrYWdlIHByZXYgPSB0aGlzLmltcG9ydHMuZ2V0KHNob3J0RWxlbWVudFR5cGVOYW1lKTsKLQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyB0aGUgZmlyc3QgY2xhc3Mgd2l0aCB0aGlzIHNob3J0IGVsZW1lbnQgdHlwZSBuYW1lCi0JCQl0aGlzLmltcG9ydHMucHV0KHNob3J0RWxlbWVudFR5cGVOYW1lLCBuZXcgSW1wb3J0UGFja2FnZShjdXJyZW50UGFja2FnZU5hbWUpKTsKLQkJCXJldHVybiBzaG9ydFR5cGVEZWNsYXJhdGlvbjsKLQkJfQotCQlpZiAocHJldi5wYWNrYWdlTmFtZS5lcXVhbHMoY3VycmVudFBhY2thZ2VOYW1lKSkgewotCQkJLy8gdGhpcyBlbGVtZW50IHR5cGUgaGFzIGFscmVhZHkgYmVlbiBpbXBvcnRlZAotCQkJcmV0dXJuIHNob3J0VHlwZURlY2xhcmF0aW9uOwotCQl9Ci0JCWlmIChjdXJyZW50UGFja2FnZU5hbWUuZXF1YWxzKHRoaXMucGFja2FnZU5hbWUpICYmCi0JCQkJcHJldi5wYWNrYWdlTmFtZS5lcXVhbHMoImphdmEubGFuZyIpKSB7Ci0JCQkvLyB3ZSBmb3JjZSB0aGUgJ2phdmEubGFuZycgY2xhc3MgdG8gYmUgZXhwbGljaXRseSBpbXBvcnRlZAotCQkJcHJldi5jb2xsaXNpb24gPSB0cnVlOwotCQl9Ci0JCS8vIGFub3RoZXIgY2xhc3Mgd2l0aCB0aGUgc2FtZSBzaG9ydCBlbGVtZW50IHR5cGUgbmFtZSBoYXMgYmVlbgotCQkvLyBwcmV2aW91c2x5IGltcG9ydGVkLCBzbyB0aGlzIG9uZSBtdXN0IGJlIHVzZWQgZnVsbHktcXVhbGlmaWVkCi0JCXJldHVybiB0eXBlRGVjbGFyYXRpb247Ci0JfQotCi0JLyoqCi0JICogZS5nLiAiZm9vLmJhci5FbXBsb3llZS5QSyIgd2lsbCByZXR1cm4gdHJ1ZQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHR5cGVEZWNsYXJhdGlvbklzTWVtYmVyQ2xhc3MoU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gKHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSA+IHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKQotCQkJCSYmIHR5cGVEZWNsYXJhdGlvbi5zdGFydHNXaXRoKHRoaXMuY2xhc3NOYW1lKQotCQkJCSYmICh0eXBlRGVjbGFyYXRpb24uY2hhckF0KHRoaXMuY2xhc3NOYW1lLmxlbmd0aCgpKSA9PSAnLicpOwotCX0KLQotCS8qKgotCSAqIGUuZy4gImZvby5iYXIuRW1wbG95ZWUuUEsiIHdpbGwgcmV0dXJuICJFbXBsb3llZS5QSyIKLQkgKiB0aGlzIHByZXZlbnRzIGNvbGxpc2lvbnMgd2l0aCBvdGhlciBpbXBvcnRlZCBjbGFzc2VzIChlLmcuICJqb28uamFyLlBLIikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTWVtYmVyQ2xhc3NUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlpbnQgaW5kZXggPSB0aGlzLnBhY2thZ2VOYW1lLmxlbmd0aCgpOwotCQlpZiAoaW5kZXggIT0gMCkgewotCQkJaW5kZXgrKzsgIC8vIGJ1bXAgcGFzdCB0aGUgJy4nCi0JCX0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoaW5kZXgpOwotCX0KLQotCS8vICoqKioqIHJlYWRpbmcKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRJbXBvcnRzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTb3J0ZWRSZXF1aXJlZEltcG9ydHMoKTsKLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2Zvcm0gb3VyIG1hcCBlbnRyaWVzIHRvIGNsYXNzIG5hbWVzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkUmVxdWlyZWRJbXBvcnRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4sIFN0cmluZz4odGhpcy5nZXRTb3J0ZWRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSwgdGhpcy5idWlsZEltcG9ydEVudHJpZXNUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4sIFN0cmluZz4gYnVpbGRJbXBvcnRFbnRyaWVzVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBJTVBPUlRfRU5UUklFU19UUkFOU0ZPUk1FUjsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+LCBTdHJpbmc+IElNUE9SVF9FTlRSSUVTX1RSQU5TRk9STUVSID0gbmV3IEltcG9ydEVudHJpZXNUcmFuc2Zvcm1lcigpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJbXBvcnRFbnRyaWVzVHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiwgU3RyaW5nPgotCXsKLQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBpbXBvcnRFbnRyeSkgewotCQkJU3RyaW5nIHBrZyA9IGltcG9ydEVudHJ5LmdldFZhbHVlKCkucGFja2FnZU5hbWU7Ci0JCQlTdHJpbmcgdHlwZSA9IGltcG9ydEVudHJ5LmdldEtleSgpOwotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHBrZy5sZW5ndGgoKSArIDEgKyB0eXBlLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZChwa2cpOwotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQodHlwZSk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHNvcnQgYnkgcGFja2FnZSBmaXJzdCwgdGhlbiBjbGFzcyAoKm5vdCogYnkgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBnZXRTb3J0ZWRSZXF1aXJlZEltcG9ydEVudHJpZXMoKSB7Ci0JCVRyZWVTZXQ8TWFwLkVudHJ5PFN0cmluZywgSW1wb3J0UGFja2FnZT4+IHNvcnRlZEVudHJpZXMgPSBuZXcgVHJlZVNldDxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4odGhpcy5idWlsZEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNvcnRlZEVudHJpZXMsIHRoaXMuZ2V0UmVxdWlyZWRJbXBvcnRFbnRyaWVzKCkpOwotCQlyZXR1cm4gc29ydGVkRW50cmllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4gYnVpbGRJbXBvcnRFbnRyaWVzQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIElNUE9SVF9FTlRSSUVTX0NPTVBBUkFUT1I7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBJTVBPUlRfRU5UUklFU19DT01QQVJBVE9SID0gbmV3IEltcG9ydEVudHJpZXNDb21wYXJhdG9yKCk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEltcG9ydEVudHJpZXNDb21wYXJhdG9yCi0JCWltcGxlbWVudHMgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4sIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIGludCBjb21wYXJlKE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGUxLCBNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPiBlMikgewotCQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJaW50IHBrZyA9IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0VmFsdWUoKS5wYWNrYWdlTmFtZSwgZTIuZ2V0VmFsdWUoKS5wYWNrYWdlTmFtZSk7Ci0JCQlyZXR1cm4gKHBrZyA9PSAwKSA/IGNvbGxhdG9yLmNvbXBhcmUoZTEuZ2V0S2V5KCksIGUyLmdldEtleSgpKSA6IHBrZzsKLQkJfQotCX0KLQotCS8qKgotCSAqIHN0cmlwIG9mZiBhbnkgbm9uLXJlcXVpcmVkIGltcG9ydHMgKGUuZy4gImphdmEubGFuZy5PYmplY3QnKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxNYXAuRW50cnk8U3RyaW5nLCBJbXBvcnRQYWNrYWdlPj4gZ2V0UmVxdWlyZWRJbXBvcnRFbnRyaWVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+Pih0aGlzLmltcG9ydHMuZW50cnlTZXQoKSwgdGhpcy5idWlsZFJlcXVpcmVkSW1wb3J0RW50cmllc0ZpbHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsdGVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PiBidWlsZFJlcXVpcmVkSW1wb3J0RW50cmllc0ZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBSZXF1aXJlZEltcG9ydEVudHJpZXNGaWx0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVxdWlyZWRJbXBvcnRFbnRyaWVzRmlsdGVyCi0JCWltcGxlbWVudHMgRmlsdGVyPE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+PgotCXsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KE1hcC5FbnRyeTxTdHJpbmcsIEltcG9ydFBhY2thZ2U+IGltcG9ydEVudHJ5KSB7Ci0JCQlyZXR1cm4gdGhpcy5wYWNrYWdlTXVzdEJlSW1wb3J0ZWQoaW1wb3J0RW50cnkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwYWNrYWdlTXVzdEJlSW1wb3J0ZWQoSW1wb3J0UGFja2FnZSBpbXBvcnRQYWNrYWdlKSB7Ci0JCQlTdHJpbmcgcGtnID0gaW1wb3J0UGFja2FnZS5wYWNrYWdlTmFtZTsKLQkJCWlmIChwa2cuZXF1YWxzKCIiKSkgewotCQkJCS8vIGNhbm5vdCBpbXBvcnQgYSB0eXBlIGZyb20gdGhlICJ1bm5hbWVkIiBwYWNrYWdlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKHBrZy5lcXVhbHMoImphdmEubGFuZyIpKSB7Ci0JCQkJLy8gd2UgbXVzdCBpbXBvcnQgZnJvbSAnamF2YS5sYW5nJyBpZiB3ZSBhbHNvIGhhdmUgYSBjbGFzcyBpbiB0aGUgc2FtZSBwYWNrYWdlCi0JCQkJcmV0dXJuIGltcG9ydFBhY2thZ2UuY29sbGlzaW9uOwotCQkJfQotCQkJaWYgKHBrZy5lcXVhbHMoQm9keVNvdXJjZVdyaXRlci50aGlzLnBhY2thZ2VOYW1lKSkgewotCQkJCS8vIHdlIG5ldmVyIG5lZWQgdG8gaW1wb3J0IGEgY2xhc3MgZnJvbSB0aGUgc2FtZSBwYWNrYWdlCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBuZWVkIGEgJ2NvbGxpc2lvbicgZmxhZyBmb3Igd2hlbiB3ZSBlbmNvdW50ZXIgYSBjbGFzcyBmcm9tCi0JICogJ2phdmEubGFuZycgZm9sbG93ZWQgYnkgYSBjbGFzcyBmcm9tIHRoZSBjdXJyZW50IGNvbXBpbGF0aW9uIHVuaXQncwotCSAqIHBhY2thZ2UuIFdlIHdpbGwgbmVlZCB0byBpbmNsdWRlIHRoZSBleHBsaWNpdCBpbXBvcnQgb2YgdGhlCi0JICogJ2phdmEubGFuZycgY2xhc3MgYW5kIGFsbCB0aGUgcmVmZXJlbmNlcyB0byB0aGUgb3RoZXIgY2xhc3Mgd2lsbAotCSAqIGhhdmUgdG8gYmUgZnVsbHktcXVhbGlmaWVkLgotCSAqIAotCSAqIElmIHRoZSBjbGFzc2VzIGFyZSBlbmNvdW50ZXJlZCBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIgKGkuZS4gdGhlIGNsYXNzCi0JICogZnJvbSB0aGUgY3VycmVudCBjb21waWxhdGlvbiB1bml0J3MgcGFja2FnZSBmb2xsb3dlZCBieSB0aGUgY2xhc3MKLQkgKiBmcm9tICdqYXZhLmxhbmcnKSwgd2UgZG8gKm5vdCogbmVlZCB0byBpbXBvcnQgdGhlIGZpcnN0IGNsYXNzIHdoaWxlCi0JICogYWxsIHRoZSByZWZlcmVuY2VzIHRvIHRoZSAnamF2YS5sYW5nJyBjbGFzcyB3aWxsIGJlIGZ1bGx5LXF1YWxpZmllZC4KLQkgKiAKLQkgKiBVbmZvcnR1bmF0ZWx5LCB3ZSBzdGlsbCBoYXZlIGEgcHJvYmxlbTogaWYgd2UgcmVmZXJlbmNlIGEgY2xhc3MgZnJvbQotCSAqICdqYXZhLmxhbmcnIGFuZCB0aGVyZSBpcyBhIGNvbmZsaWN0aW5nIGNsYXNzIGZyb20gdGhlIGN1cnJlbnQKLQkgKiBjb21waWxhdGlvbiB1bml0J3MgcGFja2FnZSAoYnV0IHRoYXQgY2xhc3MgaXMgKm5vdCogcmV2ZWFsZWQgdG8gdXMKLQkgKiBoZXJlKSwgdGhlIHNpbXBsZSBuYW1lIHdpbGwgYmUgcmVzb2x2ZWQgdG8gdGhlIG5vbi0namF2YS5sYW5nJyBjbGFzcy4KLQkgKiBVbmxlc3Mgd2Ugc2ltcGx5IGZvcmNlIGFuIGltcG9ydCBvZiAqYWxsKiAnamF2YS5sYW5nJyBjbGFzc2VzLi4uLiA6LSgKLQkgKiAKLQkgKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gdmVyeSBvZnRlbi4gOi0pCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBJbXBvcnRQYWNrYWdlIHsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gY29sbGlzaW9uID0gZmFsc2U7Ci0KLQkJcHJvdGVjdGVkIEltcG9ydFBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9UZXh0UmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxZGQ3Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L1RleHRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBIHRleHQgcmFuZ2UgZGVmaW5lcyB0aGUgb2Zmc2V0IGludG8sIGxlbmd0aCBvZiwgYW5kIGxpbmUgb2YgYSBwaWVjZQotICogb2YgdGV4dC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUZXh0UmFuZ2UgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIHRleHQuCi0JICovCi0JaW50IGdldE9mZnNldCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0LgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByYW5nZSBpbmNsdWRlcyB0aGUgY2hhcmFjdGVyIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhbmdlIHRvdWNoZXMgYW4gaW5zZXJ0aW9uIGN1cnNvciBhdCB0aGUKLQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JYm9vbGVhbiB0b3VjaGVzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSB0ZXh0LgotCSAqLwotCWludCBnZXRMaW5lTnVtYmVyKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgbmV3IHRleHQgcmFuZ2UgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGlmIHRoZXkgZGlmZmVyCi0JICogZnJvbSB0aGUgdGV4dCByYW5nZS4gSWYgdGhlIHNwZWNpZmllZCB2YWx1ZXMgbWF0Y2ggdGhlCi0JICogdGV4dCByYW5nZSwgc2ltcGx5IHJldHVybiB0aGUgdGV4dCByYW5nZSB1bmNoYW5nZWQuCi0JICovCi0JVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBsaW5lTnVtYmVyKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvZmZzZXRzLCBsZW5ndGhzLCBhbmQgbGluZSBudW1iZXJzIGFyZSB0aGUgc2FtZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggY29kZSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfQotCSAqIGNvbnRyYWN0LgotCSAqLwotCWludCBoYXNoQ29kZSgpOwotCi0KLQkvKioKLQkgKiBFbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB0ZXh0IHJhbmdlLgotCSAqLwotCWZpbmFsIGNsYXNzIEVtcHR5IGV4dGVuZHMgQWJzdHJhY3RUZXh0UmFuZ2UgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFRleHRSYW5nZSBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlwdWJsaWMgc3RhdGljIFRleHRSYW5nZSBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpIHsKLQkJCXJldHVybiBJTWVzc2FnZS5MSU5FTk9fVU5TRVQ7Ci0JCX0KLQkJcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCQlyZXR1cm4gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUOwotCQl9Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIElNZXNzYWdlLk9GRlNFVF9VTlNFVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQWJzdHJhY3RUeXBlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9BYnN0cmFjdFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlN2EwNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9BYnN0cmFjdFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLQotLyoqCi0gKiBBYnN0cmFjdFR5cGU6IGp1c3Qgc29tZSBjb3ZhcmlhbnQgb3ZlcnJpZGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWJzdHJhY3RUeXBlIGV4dGVuZHMgTWVtYmVyIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJVHlwZUJpbmRpbmcgZ2V0QmluZGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOTljZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0ZWRFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBEYWxpIG1hbmlwdWxhdGVzIGFubm90YXRpb25zIG9uIGVsZW1lbnRzIChwYWNrYWdlcywgdHlwZXMsIGZpZWxkcywgYW5kIG1ldGhvZHMpLgotICogVGhpcyBpbnRlcmZhY2Ugc2ltcGxpZmllcyB0aG9zZSBtYW5pcHVsYXRpb25zLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGVkRWxlbWVudCB7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIGJvZHkgZGVjbGFyYXRpb24gZnJvbSB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKiBUaGlzIGNhbiBiZSBudWxsIGlmIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCBpcyBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgQVNUCi0JICogYmVjYXVzZSB0aGUgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQgaW4gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JQVNUTm9kZSBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIGJpbmRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIEFTVC4KLQkgKi8KLQlJQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyAibW9kaWZpZWQiIGRlY2xhcmF0aW9uIGZyb20gdGhlIHNwZWNpZmllZCBBU1QuCi0JICovCi0JTW9kaWZpZWREZWNsYXJhdGlvbiBnZXRNb2RpZmllZERlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYW5ub3RhdGVkIGVsZW1lbnQncyAibW9kaWZpZWQiIGRlY2xhcmF0aW9uIGZyb20gYSBuZXdseS1nZW5lcmF0ZWQgQVNULgotCSAqLwotCU1vZGlmaWVkRGVjbGFyYXRpb24gZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIG5hbWUgdGV4dCByYW5nZSBmcm9tIHRoZSBzcGVjaWZpZWQgQVNULgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIEVkaXQgdGhlIGFubm90YXRlZCBlbGVtZW50J3MgZGVjbGFyYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlZGl0b3IuCi0JICovCi0Jdm9pZCBlZGl0KEVkaXRvciBlZGl0b3IpOwotCi0KLQkvLyAqKioqKioqKioqICJlZGl0b3IiIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIGEgY2FsbGJhY2sgdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIGFubm90YXRlZCBlbGVtZW50J3MKLQkgKiBjb21waWxhdGlvbiB1bml0L0FTVCBpcyBpbiBhIHN0YXRlIHRvIGJlIG1hbmlwdWxhdGVkLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRWRpdG9yIHsKLQotCQkvKioKLQkJICogRWRpdCB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLiBBbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBkZWNsYXJhdGlvbgotCQkgKiB3aWxsIGJlIGNhcHR1cmVkIGFuZCBhcHBsaWVkIHRvIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCdzIGNvbXBpbGF0aW9uIHVuaXQuCi0JCSAqLwotCQl2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZFBhY2thZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRlZFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhM2NjYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Bbm5vdGF0ZWRQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIFJlZCBIYXQsIEluYy4KLSAqIERpc3RyaWJ1dGVkIHVuZGVyIGxpY2Vuc2UgYnkgUmVkIEhhdCwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcjoKLSAqICAgICBSZWQgSGF0LCBJbmMuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JUGFja2FnZUJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlBhY2thZ2VEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIERtaXRyeSBHZXJhc2tvdgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0ZWRQYWNrYWdlIGV4dGVuZHMgQW5ub3RhdGVkRWxlbWVudCB7CQotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUlQYWNrYWdlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlQYWNrYWdlRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjA0YzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLQotLyoqCi0gKiBBZGFwdCBhIEphdmEgYW5ub3RhdGlvbiB3aXRoIGEgc2ltcGxlLXRvLXVzZSBpbnRlcmZhY2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGNvbXBpbGF0aW9uIHVuaXQsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYWRhcHRlcidzIGFubm90YXRpb24uCi0JICogQHNlZSAjZ2V0QW5ub3RhdGlvbigpCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IG1hcmtlciBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKi8KLQl2b2lkIG5ld01hcmtlckFubm90YXRpb24oKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgbmV3IHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICovCi0Jdm9pZCBuZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBub3JtYWwgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICovCi0Jdm9pZCBuZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEFTVCBub2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFubm90YXRpb24uCi0JICogSWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgcmV0dXJuIHRoZSBhbm5vdGF0aW9uJ3MgcGFyZW50IG5vZGUuCi0JICogQHNlZSAjZ2V0QXN0Tm9kZSgpCi0JICovCi0JQVNUTm9kZSBnZXRBc3ROb2RlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25FZGl0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YjNhYzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uRWRpdEZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiBSZXZpZXcgdGhlIHNwZWNpZmllZCBlZGl0cyBhbmQgZm9ybWF0IHRoZSBzcGVjaWZpZWQgZG9jdW1lbnQgYXMgbmVlZGVkLgotCSAqLwotCXZvaWQgZm9ybWF0KElEb2N1bWVudCBkb2MsIFRleHRFZGl0IGVkaXRUcmVlKSB0aHJvd3MgTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiwgQmFkTG9jYXRpb25FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0Fubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYzZlOTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLS8qKgotICogQWRhcHQgYSBKYXZhIGFubm90YXRpb24gZWxlbWVudCB3aXRoIGEgc2ltcGxlLXRvLXVzZSBpbnRlcmZhY2UuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudC4KLQkgKiBJZiB0aGUgY29tcGlsYXRpb24gdW5pdCBpcyBhdmFpbGFibGUsICN2YWx1ZShDb21waWxhdGlvblVuaXQpCi0JICogbWlnaHQgYmUgbW9yZSBwZXJmb3JtYW50LgotCSAqIEBzZWUgI2dldFZhbHVlKG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQpCi0JICovCi0JVCBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBjb21waWxhdGlvbiB1bml0LCByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZQotCSAqIGFkYXB0ZXIncyBhbm5vdGF0aW9uIGVsZW1lbnQuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqLwotCVQgZ2V0VmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYWRhcHRlcidzIGFubm90YXRpb24gZWxlbWVudC4KLQkgKiBTZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCB0byBudWxsIHdpbGwgY2F1c2UKLQkgKiB0aGUgZWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gaXRzIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShUIHZhbHVlKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgY29tcGlsYXRpb24gdW5pdCwgcmV0dXJuIHRoZSBleHByZXNzaW9uIHZhbHVlIG9mIHRoZQotCSAqIGFkYXB0ZXIncyBhbm5vdGF0aW9uIGVsZW1lbnQuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0JICogQHNlZSAjZ2V0RXhwcmVzc2lvbigpCi0JICovCi0JRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgQVNUIG5vZGUgY29ycmVzcG9uZGluZyB0byB0aGUgZWxlbWVudC4KLQkgKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIGFubm90YXRpb24ncyBub2RlLgotCSAqIEBzZWUgI2dldEFzdE5vZGUoKQotCSAqLwotCUFTVE5vZGUgZ2V0QXN0Tm9kZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0F0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTE5ZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLQotLyoqCi0gKiBBdHRyaWJ1dGVzIGFyZSBlaXRoZXIgcmVwcmVzZW50ZWQgYnkgZmllbGRzICgnZm9vJykgb3IgcHJvcGVydGllcy9tZXRob2QKLSAqIHBhaXJzICgnZ2V0Rm9vKCknLydzZXRGb28oKScpLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlIGV4dGVuZHMgTWVtYmVyIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgbmFtZSwgYXMgb3Bwb3NlZCB0byB0aGUgbWVtYmVyJ3MgbmFtZQotCSAqIChlLmcuICJnZXRGb28oKSIgcmV0dXJucyAiZm9vIikuCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBiaW5kaW5nIGZvciB0aGUgYXR0cmlidXRlJ3MgZGVjbGFyZWQgdHlwZSwKLQkgKiBhcyBvcHBvc2VkIHRvIGl0cyBkZWNsYXJpbmcgdHlwZS4KLQkgKi8KLQlJVHlwZUJpbmRpbmcgZ2V0VHlwZUJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBpcyBhIGZpZWxkLgotCSAqLwotCWJvb2xlYW4gaXNGaWVsZCgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOTNhMTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBQcm92aWRlIGNsaWVudHMgd2l0aCBhIHBsdWdnYWJsZSB3YXkgdG8gbWFuaXB1bGF0ZSBhbgotICogYW5ub3RhdGlvbiBtb2RpZnlpbmcgYSAiZGVjbGFyYXRpb24iLgotICogCi0gKiBUT0RPIHNwZWNpZnkgaG93IG11bHRpcGxlIGFubm90YXRpb25zIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgdG8gYmUgaGFuZGxlZAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCByZXR1cm4gdGhlIGFubm90YXRpb24uCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgbW9kaWZ5IGl0IHdpdGgKLQkgKiBhIG5ldyBtYXJrZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICogUmV0dXJuIHRoZSBuZXcgYW5ub3RhdGlvbi4KLQkgKi8KLQlNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBtb2RpZnkgaXQgd2l0aAotCSAqIGEgbmV3IHNpbmdsZSBtZW1iZXIgYW5ub3RhdGlvbiwgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhbm5vdGF0aW9uIGlmIHByZXNlbnQuCi0JICogUmV0dXJuIHRoZSBuZXcgYW5ub3RhdGlvbi4KLQkgKi8KLQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIG5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBtb2RpZnkgaXQgd2l0aAotCSAqIGEgbmV3IG5vcm1hbCBhbm5vdGF0aW9uLCByZXBsYWNpbmcgdGhlIG9yaWdpbmFsIGFubm90YXRpb24gaWYgcHJlc2VudC4KLQkgKiBSZXR1cm4gdGhlIG5ldyBhbm5vdGF0aW9uLgotCSAqLwotCU5vcm1hbEFubm90YXRpb24gbmV3Tm9ybWFsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgcmV0dXJuIHRoZSBBU1Qgbm9kZQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFubm90YXRpb24uCi0JICogSWYgdGhlIGFubm90YXRpb24gaXMgbWlzc2luZywgcmV0dXJuIGl0cyBwYXJlbnQgbm9kZS4KLQkgKi8KLQlBU1ROb2RlIGdldEFzdE5vZGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVlNGZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0RlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotCi0vKioKLSAqIFByb3ZpZGUgY2xpZW50cyB3aXRoIGEgcGx1Z2dhYmxlIHdheSB0byBtYW5pcHVsYXRlIGFuCi0gKiBhbm5vdGF0aW9uIGVsZW1lbnQgbW9kaWZ5aW5nIGEgImRlY2xhcmF0aW9uIi4KLSAqIFQgaXMgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0byBiZSBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHRoZSBhZGFwdGVyLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8VD4gewotCi0JLyoqCi0JICogUmVkdWNlIHRoZSBudW1iZXIgb2YgTkxTIHdhcm5pbmdzLgotCSAqLwotCVN0cmluZyBWQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0JICogYW5ub3RhdGlvbiBlbGVtZW50LiBSZXR1cm4gbnVsbCBvciBhbiBlbXB0eSBhcnJheQotCSAqIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCVQgZ2V0VmFsdWUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbik7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgc3BlY2lmaWVkIGRlY2xhcmF0aW9uLCBzZXQgdGhlIHZhbHVlIG9mIHRoZQotCSAqIGFubm90YXRpb24gZWxlbWVudC4gU2V0dGluZyB0aGUgdmFsdWUgb2YgdGhlIGVsZW1lbnQKLQkgKiB0byBudWxsIHdpbGwgY2F1c2UgdGhlIGVsZW1lbnQgdG8gYmUgcmVtb3ZlZCBmcm9tIGl0cwotCSAqIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShUIHZhbHVlLCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgZWxlbWVudCdzIHZhbHVlIGV4cHJlc3Npb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQuCi0JICovCi0JRXhwcmVzc2lvbiBnZXRFeHByZXNzaW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNwZWNpZmllZCBkZWNsYXJhdGlvbiwgcmV0dXJuIHRoZSBBU1Qgbm9kZQotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVsZW1lbnQncyB2YWx1ZS4KLQkgKiBJZiB0aGUgZWxlbWVudCBpcyBtaXNzaW5nLCByZXR1cm4gdGhlIGFubm90YXRpb24ncyBub2RlLgotCSAqLwotCUFTVE5vZGUgZ2V0QXN0Tm9kZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTY5MGIxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0VudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bUNvbnN0YW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1EZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBFbnVtOiBzb21lIGNvdmFyaWFudCBvdmVycmlkZXMgcGx1cyBlbnVtQ29uc3RhbnRzCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbnVtIGV4dGVuZHMgQWJzdHJhY3RUeXBlIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlFbnVtRGVjbGFyYXRpb24gZ2V0Qm9keURlY2xhcmF0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW51bSdzIGNvbnN0YW50cwotCSAqLwotCUVudW1Db25zdGFudERlY2xhcmF0aW9uW10gZ2V0RW51bUNvbnN0YW50cyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0VudW1Db25zdGFudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bUNvbnN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjkzZDQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRW51bUNvbnN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkVudW1Db25zdGFudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVmFyaWFibGVCaW5kaW5nOwotCi0vKioKLSAqIEVudW0gY29uc3RhbnRzIGFyZSBwYXJ0IG9mIEVudW1zCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBFbnVtQ29uc3RhbnQgZXh0ZW5kcyBNZW1iZXIgewotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJVmFyaWFibGVCaW5kaW5nIGdldEJpbmRpbmcoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUVudW1Db25zdGFudERlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0V4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVkN2VkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9FeHByZXNzaW9uQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLS8qKgotICogRGVmaW5lIHRoZSBwcm90b2NvbCBmb3IgY29udmVydGluZyBhbiBBU1QgZXhwcmVzc2lvbiBiYWNrIGFuZCBmb3J0aAotICogZnJvbSBhbiBhcmJpdHJhcnkgdHlwZSAoZS5nLiBTdHJpbmdMaXRlcmFsIDw9PiBTdHJpbmcpLgotICogVCBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCB0byBhbmQgZnJvbSBhbiBleHByZXNzaW9uLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhwcmVzc2lvbkNvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IHRvIGFuCi0JICogZXhwcmVzc2lvbiB0aGF0IGlzIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgQVNULgotCSAqIFRoZSB0eXBlIG9mIHRoZSBvYmplY3QgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBzcGVjaWZpZWQgYnkgdGhlIGNsaWVudC4KLQkgKi8KLQlFeHByZXNzaW9uIGNvbnZlcnQoVCBvYmplY3QsIEFTVCBhc3QpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGV4cHJlc3Npb24gdG8gYW4gb2JqZWN0IG9mIHNvbWUKLQkgKiBwcmUtZGV0ZXJtaW5lZCB0eXBlLgotCSAqLwotCVQgY29udmVydChFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9GaWVsZEF0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvRmllbGRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwMTRhYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9GaWVsZEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JVmFyaWFibGVCaW5kaW5nOwotCi0vKioKLSAqIEZpZWxkIGF0dHJpYnV0ZToganVzdCBzb21lIGNvdmFyaWFudCBvdmVycmlkZXMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBGaWVsZEF0dHJpYnV0ZSBleHRlbmRzIEF0dHJpYnV0ZSB7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JSVZhcmlhYmxlQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlGaWVsZERlY2xhcmF0aW9uIGdldEJvZHlEZWNsYXJhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWRBbm5vdGF0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWU5Y2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEFubm90YXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotCi0vKioKLSAqIEFkYXB0IGFuIGluZGV4ZWQgSmF2YSBhbm5vdGF0aW9uIHdpdGggYSBzaW1wbGUtdG8tdXNlIGludGVyZmFjZS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBleHRlbmRzIEFubm90YXRpb25BZGFwdGVyIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIHNpdHVhdGVkLgotCSAqLwotCWludCBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGluZGV4LCBsZWF2aW5nIGl0cyBvcmlnaW5hbAotCSAqIHBvc2l0aW9uIGNsZWFyZWQgb3V0LgotCSAqLwotCXZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOGYyMWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi0KLS8qKgotICogQWxsb3cgY2xpZW50cyB0byBtYW5pcHVsYXRlIGFuIGFubm90YXRpb24gd2l0aGluIGFuIGFycmF5IG9mIGFubm90YXRpb25zLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBhbm5vdGF0aW9uIGlzIHNpdHVhdGVkLgotCSAqLwotCWludCBnZXRJbmRleCgpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgYW5ub3RhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGluZGV4LCBsZWF2aW5nIGl0cyBvcmlnaW5hbAotCSAqIHBvc2l0aW9uIGNsZWFyZWQgb3V0LgotCSAqLwotCXZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4LCBNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5ZjgzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLS8qKgotICogUHJvdmlkZSBjbGllbnRzIHdpdGggYSBwbHVnZ2FibGUgd2F5IHRvIG1hbmlwdWxhdGUgYW4gPGk+aW5kZXhlZDwvaT4gYW5ub3RhdGlvbiAKLSAqIGVsZW1lbnQgbW9kaWZ5aW5nIGEgImRlY2xhcmF0aW9uIi4KLSAqIFRbXSBpcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJlIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgdGhlIGFkYXB0ZXIuCi0gKiBUIGlzIHRoZSBzdWItdmFsdWUgb2YgdGhlIHZhbHVlIG9iamVjdC4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxUPgotCQlleHRlbmRzIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFRbXT4gewotCQotCS8qKgotCSAqIEdpdmVuIHRoZSBzcGVjaWZpZWQgZGVjbGFyYXRpb24sIHJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIGVsZW1lbnQncyBzdWJ2YWx1ZSAKLQkgKiBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0JICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLQkgKi8KLQlFeHByZXNzaW9uIGdldFN1YnZhbHVlRXhwcmVzc2lvbihpbnQgaW5kZXgsIE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L0luZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNWFiNjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci0KLS8qKgotICogQSB0eXBlIG9mIHtAbGluayBFeHByZXNzaW9uQ29udmVydGVyfSB0aGF0IGNhbiBmdXJ0aGVyIHJldHJpZXZlIHN1Yi1leHByZXNzaW9ucwotICogYmFzZWQgb24gaW5kaWNlcy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyPFQ+Ci0JCWV4dGVuZHMgRXhwcmVzc2lvbkNvbnZlcnRlcjxUW10+IHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBzdWItdmFsdWUgYXQgdGhlIGdpdmVuIGluZGV4LgotCSAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLQkgKi8KLQlFeHByZXNzaW9uIGdldFN1YmV4cHJlc3Npb24oaW50IGluZGV4LCBFeHByZXNzaW9uIGV4cHJlc3Npb24pOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTWVtYmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9NZW1iZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI5ZjM5OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9NZW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLQotLyoqCi0gKiBEYWxpIG1hbmlwdWxhdGVzIGFubm90YXRpb25zIG9uIG1lbWJlcnMgKHR5cGVzLCBmaWVsZHMsIGFuZCBtZXRob2RzKS4KLSAqIFRoaXMgaW50ZXJmYWNlIHNpbXBsaWZpZXMgdGhvc2UgbWFuaXB1bGF0aW9ucy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lbWJlciBleHRlbmRzIEFubm90YXRlZEVsZW1lbnQgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1lbWJlciBpcyBwZXJzaXN0YWJsZS4KLQkgKi8KLQlib29sZWFuIGlzUGVyc2lzdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1lbWJlciBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgbWVtYmVyCi0JICogYW5kIG9jY3VycmVuY2UuCi0JICovCi0JYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBtZW1iZXJOYW1lLCBpbnQgb2NjdXJyZW5jZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01ldGhvZEF0dHJpYnV0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTWV0aG9kQXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlY2E5M2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvTWV0aG9kQXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklNZXRob2RCaW5kaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuTWV0aG9kU2lnbmF0dXJlOwotCi0vKioKLSAqIE1ldGhvZCBhdHRyaWJ1dGU6IGp1c3Qgc29tZSBjb3ZhcmlhbnQgb3ZlcnJpZGVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWV0aG9kQXR0cmlidXRlIGV4dGVuZHMgQXR0cmlidXRlIHsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlJTWV0aG9kQmluZGluZyBnZXRCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlNZXRob2REZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCBiZSB1c2VkIGluc3RlYWQgb2YgTWVtYmVyI21hdGNoZXMoU3RyaW5nLCBpbnQpLgotCSAqLwotCWJvb2xlYW4gbWF0Y2hlcyhNZXRob2RTaWduYXR1cmUgc2lnbmF0dXJlLCBpbnQgb2NjdXJyZW5jZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L01vZGlmaWVkRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxZTUzOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS91dGlsaXR5L2pkdC9Nb2RpZmllZERlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIERlZmluZSBhIHdyYXBwZXIgdGhhdCBwcm92aWRlcyBhIGNvbW1vbiBwcm90b2NvbCBmb3IgYWxsIHRoZSB2YXJpb3VzIEFTVAotICogZGVjbGFyYXRpb25zIHRoYXQgaGF2ZSBtb2RpZmllcnMgKGkuZS4gdGhlcmUgYXJlIGEgbnVtYmVyIG9mIEFTVCBub2RlCi0gKiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IHRoZSBtZXRob2QgI21vZGlmaWVycygpLCBidXQgdGhleSBkbyBub3QgaW1wbGVtZW50Ci0gKiBhIGNvbW1vbiBpbnRlcmZhY2UpOgotICogICAgIEJvZHlEZWNsYXJhdGlvbgotICogICAgIFNpbmdsZVZhcmlhYmxlRGVjbGFyYXRpb24KLSAqICAgICBWYXJpYWJsZURlY2xhcmF0aW9uRXhwcmVzc2lvbgotICogICAgIFZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGlmaWVkRGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiZGVjbGFyYXRpb24iIEFTVCBub2RlLgotCSAqLwotCUFTVE5vZGUgZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgImRlY2xhcmF0aW9uIiBBU1QuCi0JICovCi0JQVNUIGdldEFzdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAqZmlyc3QqIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGRlY2xhcmF0aW9uIGhhcyBubyBzdWNoIGFubm90YXRpb24uCi0JICovCi0JQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uTmFtZWQoU3RyaW5nIGFubm90YXRpb25OYW1lKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgKmZpcnN0KiBhbm5vdGF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGZyb20gdGhlIGRlY2xhcmF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQW5ub3RhdGlvbk5hbWVkKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBzcGVjaWZpZWQgb2xkIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBhbm5vdGF0aW9uLgotCSAqIElmIHRoZXJlIGlzIG5vIGFubm90YXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIHNpbXBseSBhZGQgdGhlIG5ldwotCSAqIGFubm90YXRpb24gdG8gdGhlIGRlY2xhcmF0aW9uJ3MgbW9kaWZpZXJzLgotCSAqLwotCXZvaWQgcmVwbGFjZUFubm90YXRpb25OYW1lZChTdHJpbmcgb2xkQW5ub3RhdGlvbk5hbWUsIEFubm90YXRpb24gbmV3QW5ub3RhdGlvbik7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpbXBvcnQgdG8gdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IHdhcyBhZGRlZCB0byBvciBhbHJlYWR5IHByZXNlbnQgaW4KLQkgKiB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBzcGVjaWZpZWQgY2xhc3MgY2FuIGJlCi0JICogc3Vic2VxdWVudGx5IHJlZmVyZW5jZWQgdXNpbmcgYSAic2hvcnQiIG5hbWUpLgotCSAqIEFsc28gcmV0dXJuIHRydWUgaWYgYW4gaW1wb3J0IHdhcyB1bm5lY2Vzc2FyeSAoaS5lLiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogaXMgcGFydCBvZiB0aGUgImRlZmF1bHQiIHBhY2thZ2UpLgotCSAqIFRoaXMgZG9lcyBub3Qgc3VwcG9ydCBhZGRpbmcgYSAid2lsZGNhcmQiIGltcG9ydCAoZS5nLiAiamF2YS51dGlsLioiKS4KLQkgKi8KLQlib29sZWFuIGFkZEltcG9ydChTdHJpbmcgY2xhc3NOYW1lKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHN0YXRpYyBpbXBvcnQgdG8gdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXBwcm9wcmlhdGUgaW1wb3J0IHdhcyBhZGRlZCB0byBvciBhbHJlYWR5IHByZXNlbnQgaW4KLQkgKiB0aGUgZGVjbGFyYXRpb24ncyBjb21waWxhdGlvbiB1bml0IChpLmUuIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgY2FuIGJlCi0JICogc3Vic2VxdWVudGx5IHJlZmVyZW5jZWQgdXNpbmcgYSAic2hvcnQiIG5hbWUpLgotCSAqIEFsc28gcmV0dXJuIHRydWUgaWYgYW4gaW1wb3J0IHdhcyB1bm5lY2Vzc2FyeSAoaS5lLiB0aGUgc3BlY2lmaWVkIGVudW0KLQkgKiBpcyBwYXJ0IG9mIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCi0JICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBhICJ3aWxkY2FyZCIgaW1wb3J0IChlLmcuICJqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS4qIikuCi0JICovCi0JYm9vbGVhbiBhZGRTdGF0aWNJbXBvcnQoU3RyaW5nIGVudW1Db25zdGFudE5hbWUpOwotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaW1wb3J0IHRvIHRoZSBkZWNsYXJhdGlvbidzIGNvbXBpbGF0aW9uIHVuaXQuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGFwcHJvcHJpYXRlIGltcG9ydCB3YXMgYWRkZWQgdG8gb3IgYWxyZWFkeSBwcmVzZW50IGluCi0JICogdGhlIGRlY2xhcmF0aW9uJ3MgY29tcGlsYXRpb24gdW5pdCAoaS5lLiB0aGUgc3BlY2lmaWVkIG5hbWUgY2FuIGJlCi0JICogc3Vic2VxdWVudGx5IHJlZmVyZW5jZWQgdXNpbmcgYSAic2hvcnQiIG5hbWUpLgotCSAqIEFsc28gcmV0dXJuIHRydWUgaWYgYW4gaW1wb3J0IHdhcyB1bm5lY2Vzc2FyeSAoaS5lLiB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogb3IgZW51bSBpcyBwYXJ0IG9mIHRoZSAiZGVmYXVsdCIgcGFja2FnZSkuCi0JICogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IGFkZGluZyBhICJ3aWxkY2FyZCIgaW1wb3J0IChlLmcuICJqYXZhLnV0aWwuKiIpLgotCSAqLwotCWJvb2xlYW4gYWRkSW1wb3J0KFN0cmluZyBpbXBvcnROYW1lLCBib29sZWFuIHN0YXRpY18pOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGhhcyB0aGUgc3BlY2lmaWVkCi0JICogKGZ1bGx5LXF1YWxpZmllZCkgbmFtZSB3aXRoaW4gdGhlIGRlY2xhcmF0aW9uJ3MgY29udGV4dDsgaS5lLiBhdHRlbXB0Ci0JICogdG8gcmVzb2x2ZSB0aGUgYW5ub3RhdGlvbidzIG5hbWUgKHVzaW5nIGltcG9ydHMgZXRjLikgYW5kIHJldHVybgotCSAqIHdoZXRoZXIgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JYm9vbGVhbiBhbm5vdGF0aW9uSXNOYW1lZChBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdXRpbGl0eS9qZHQvVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTNhNmE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3V0aWxpdHkvamR0L1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5GaWVsZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIFR5cGU6IG5lc3RlZFR5cGVzLCBuZXN0ZWRFbnVtcywgZmllbGRzLCBhbmQgbWV0aG9kcy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFR5cGUgZXh0ZW5kcyBBYnN0cmFjdFR5cGUgewotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCVR5cGVEZWNsYXJhdGlvbiBnZXRCb2R5RGVjbGFyYXRpb24oQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgbmVzdGVkIHR5cGVzIChkb2VzIG5vdCBpbmNsdWRlIGFubm90YXRpb25zIG9yIGVudW1zKS4KLQkgKi8KLQlUeXBlRGVjbGFyYXRpb25bXSBnZXRUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBuZXN0ZWQgZW51bXMuCi0JICovCi0JRW51bURlY2xhcmF0aW9uW10gZ2V0RW51bXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgZmllbGRzLgotCSAqLwotCUZpZWxkRGVjbGFyYXRpb25bXSBnZXRGaWVsZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlJ3MgbWV0aG9kcy4KLQkgKi8KLQlNZXRob2REZWNsYXJhdGlvbltdIGdldE1ldGhvZHMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyN2NhMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmIxMTI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMDdkNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjlmNjllLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgQ29tbW9uXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjBlM2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MzNkMjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWE3OWYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBDb21tb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLmNsYXNzcGF0aCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdjYzA2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc5YmQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyMjA0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDY6MzEgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYWQ4OWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5KcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjYwMCwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9hYm91dC5odG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlY2JiOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hcy8KLXNyYy5pbmNsdWRlcyA9IHNjaGVtYXMvCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzODY1ZDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIEVjbGlwc2VMaW5rIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnhtbCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDNmOTI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy40Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLSAKLTxwbHVnaW4+Ci0JCi0JPCEtLQotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogTGlicmFyeSBQcm92aWRlciBGcmFtZXdvcmsgSW50ZWdyYXRpb24gKgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCS0tPgotCQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmRvd25sb2FkYWJsZUxpYnJhcmllcyI+Ci0JCQotCQk8aW1wb3J0LWRlZmluaXRpb25zIAotCQkJdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGkvZGV2L2VjbGlwc2VsaW5rL2VjbGlwc2VsaW5rLWRvd25sb2FkYWJsZS1saWJzLnhtbCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCTxvcj4KLQkJCQkJCTx0ZXN0IAotCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJCXZhbHVlPSJqcHQuamF4YiIgCi0JCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJCQk8dGVzdCAKLQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCQl2YWx1ZT0ianB0LmpwYSIgCi0JCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJCTwvb3I+CQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9pbXBvcnQtZGVmaW5pdGlvbnM+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTwhLS0KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIEVjbGlwc2VMaW5rIHNjaGVtYXMgICAgICAgICAgICAgICAgICAgICoKLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQktLT4KLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4KLQkJCi0JCTxjYXRhbG9nQ29udHJpYnV0aW9uIGlkPSJkZWZhdWx0Ij4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMC54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMi54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QiLz4KLQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8yLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMi54c2QiLz4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl8zLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QiLz4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19vcm1fMl80LnhzZCIKLQkJCQl1cmk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhL29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2pwYS9lY2xpcHNlbGlua19vcm1fMl80LnhzZCIvPgotCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX294bV8yXzAueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8wLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8xLnhzZCIvPgotICAgCQkJCi0gICAJCQk8dXJpCi0gICAgICAgICAJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19veG1fMl8yLnhzZCIKLSAgICAgICAgIAkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzIueHNkIi8+Ci0KLQkJCTx1cmkKLSAgICAgICAgIAkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX294bV8yXzMueHNkIgotICAgICAgICAgCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMy54c2QiLz4KLQotCQkJPHVyaQotICAgICAgICAgCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfb3htXzJfNC54c2QiCi0gICAgICAgICAJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tb3h5L29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2pheGIvZWNsaXBzZWxpbmtfb3htXzJfNC54c2QiLz4KLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZCIKLQkJCQl1cmk9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZS9vcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4wLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4xLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZCIvPgotCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjAueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCIvPgotCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjMueHNkIgotCQkJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlL29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjMueHNkIi8+Ci0JCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4wLnhzZCIvPgotCQkJCQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkIgotCQkJCXVyaT0ic2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkIi8+CQotCQkJCQkJCi0JCQk8dXJpCi0JCQkJbmFtZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiCi0JCQkJdXJpPSJzY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QiLz4KLQkJCQkKLQkJCTx1cmkKLQkJCQluYW1lPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4wLnhzZCIKLQkJCQl1cmk9InNjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMi4wLnhzZCIvPgkKLQotCQkJPHVyaQotCQkJCW5hbWU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjEueHNkIgotCQkJCXVyaT0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlL29yZy9lY2xpcHNlL3BlcnNpc3RlbmNlL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMS54c2QiLz4JCi0JCQkKLQkJPC9jYXRhbG9nQ29udHJpYnV0aW9uPgotCQkKLSAgICA8L2V4dGVuc2lvbj4KLQkKLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fZWNsaXBzZWxpbmtfY29yZS5wcm9wZXJ0aWVzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fZWNsaXBzZWxpbmtfY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjdiYTkyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfY29tbW9uX2VjbGlwc2VsaW5rX2NvcmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb249U2VsZWN0ZWQgbGlicmFyaWVzIGRvIG5vdCBpbmNsdWRlIHJlcXVpcmVkIEVjbGlwc2VMaW5rIGFubm90YXRpb24gY2xhc3Nlcy4KLUVjbGlwc2VMaW5rTGlicmFyeVZhbGlkYXRvcl9tdWx0aXBsZUVjbGlwc2VMaW5rVmVyc2lvbnM9VGhlcmUgYXJlIG11bHRpcGxlIHZlcnNpb25zIG9mIEVjbGlwc2VMaW5rIGluIHNlbGVjdGVkIGxpYnJhcmllcy4KLUVjbGlwc2VMaW5rTGlicmFyeVZhbGlkYXRvcl9pbXByb3BlckVjbGlwc2VMaW5rVmVyc2lvbj1FY2xpcHNlTGluayB2ZXJzaW9uIGRvZXMgbm90IG1lZXQgcGxhdGZvcm0gcmVxdWlyZW1lbnRzLgotCi1FTEpheGJVc2VyTGlicmFyeVZhbGlkYXRvcl9ub1hqY0NsYXNzZXM9Q2xhc3MgZ2VuZXJhdGlvbiBtYXkgbm90IGJlIGF2YWlsYWJsZSBpZiBjb20uc3VuLnRvb2xzLnhqYyBhbmQgY29tLnN1bi54bWwuYmluZCBqYXJzIGFyZSBub3Qgb24gcHJvamVjdCBjbGFzc3BhdGguCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8wLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFkMWRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzEyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8xXzAueHNkIDEuMCAgRmVicnVhcnkgMSAyMDA4Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmV3IG5hdGl2ZSBFY2xpcHNlTGluayBYTUwgbWV0YWRhdGEKLSAgICAgICBmb3JtYXQgdXNlZCBmb3IgSlBBIGFuZCBuYXRpdmUgZGVwbG95bWVudCB4bWwgZmlsZXMuIAotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZSBlbnRpdHktbWFwcGluZ3MgZWxlbWVudCBpcyB0aGUgcm9vdCBlbGVtZW50IG9mIGFuIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSBvciBuYW1lZC1uYXRpdmUtcXVlcnkKLSAgICAgICAgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIAotICAgICAgICBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjEuMCIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkIHRoZW4gCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMgb3Igc2Vjb25kYXJ5IHRhYmxlcwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tbWFueSIgdHlwZT0ib3JtOm9uZS10by1tYW55IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFBlcnNpc3Qge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtbG9hZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdExvYWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvcGVydHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0JCQkvKioKLQkJCSogUHJvcGVydHkgbmFtZS4KLQkJCSovIAotCQkJU3RyaW5nIG5hbWUoKTsKLQkJCQotCQkJLyoqCi0JCQkqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLQkJCSogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLQkJCSovIAotCQkJU3RyaW5nIHZhbHVlKCk7Ci0JCQkKLQkJCS8qKgotCQkJKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotCQkJKiBUaGUgdmFsdWUgY29udmVydGVkIHRvIHZhbHVlVHlwZSBieSBDb252ZXJzaW9uTWFuYWdlci4KLQkJCSogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0JCQkqIENvbnZlcnNpb25NYW5hZ2VyOiAKLQkJCSogbnVtZXJpY2FsLCBib29sZWFuLCB0ZW1wb3JhbC4gIAotCQkJKi8gCi0JCQlDbGFzcyB2YWx1ZVR5cGUoKSBkZWZhdWx0IFN0cmluZy5jbGFzczsKLQkJfQotCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgIH0KLQotICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZ2VuZXJhdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgeyBUQUJMRSwgU0VRVUVOQ0UsIElERU5USVRZLCBBVVRPIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VRVUVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklERU5USVRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotCQkgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotCQkgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotCQkgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotCQkgKiAgCi0JCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0JCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAotCQkgKi8gCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFJlYWRUcmFuc2Zvcm1lciB7Ci0JCSAgICAvKioKLQkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLQkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5BdHRyaWJ1dGVUcmFuc2Zvcm1lciAKLQkJICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgCi0JCSAgICAgKiBidWlsZEF0dHJpYnV0ZVZhbHVlIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIAotCQkgICAgICogYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZS4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0JCSAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLQkJICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLQkJICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuCi0JCSAqICAKLQkJICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0JCSAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLQkJICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotCQkgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLQkJICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0JCSAgICAvKioKLQkJICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLQkJICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0JCSAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotCQkgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0JCSAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLQkJICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLQkJICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotCQkgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0JCSAgICAgKiBhIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgY29sdW1uLgotCQkgICAgICogTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIHN1cHBvcnRlZCB0aGUgCi0JCSAgICAgKiBtZXRob2Qgc2hvdWxkIGJlIGRlZmluZWQgdG8gcmV0dXJuIGEgcGFydGljdWxhciB0eXBlLCBub3QganVzdCAKLQkJICAgICAqIE9iamVjdCwgZm9yIGluc3RhbmNlOgotCQkgICAgICogcHVibGljIFRpbWUgZ2V0U3RhcnRUaW1lKCkuCi0JCSAgICAgKiBUaGUgbWV0aG9kIG1heSByZXF1aXJlIGEgVHJhbnNpZW50IGFubm90YXRpb24gdG8gYXZvaWQgYmVpbmcgCi0JCSAgICAgKiBtYXBwZWQgYXMgQmFzaWMgYnkgZGVmYXVsdC4KLQkJICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotCQkgICAgICovIAotCQkgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0JCQotCQkgICAgLyoqCi0JCSAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLQkJICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0JCSAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLQkJICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotCQkgICAgICovIAotCQkgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqCi0JCSAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotCQkgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLQkJICogZGF0YWJhc2UgY29sdW1ucy4KLQkJICogCi0JCSAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLQkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotCQkgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLQkJICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0JCSAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotCQkgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLQkJICogV3JpdGVUcmFuc2Zvcm1lcikuIAotCQkgKi8gCi0JCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCXB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLQkJICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0JCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0JCSAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotCQkgICAgICovCi0JCSAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCQkgICAgCi0JCSAgICAvKioKLQkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0JCSAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotCQkgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLQkJICAgICAqLwotCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYXNjYWRlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7IEFMTCwgUEVSU0lTVCwgTUVSR0UsIFJFTU9WRSwgUkVGUkVTSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGEgbWFwcGVkIHN1cGVyY2xhc3MuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgYmUgcmVjdXJzaXZlbHkgCi0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAgQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCi0gICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86Ci0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX2tleSIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSm9pbkZldGNoVHlwZSB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGRvZXMgbm90IGFsbG93IGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIElOTkVSLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBpbm5lciBqb2luIGlzIHVzZWQgdG8gZmV0Y2ggdGhlIHJlbGF0ZWQgb2JqZWN0LgotICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBPVVRFUiwKLSAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOTkVSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIG9wdGltaXN0aWMtbG9ja2luZyBlbGVtZW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogb3B0aW1pc3RpYyBsb2NraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyAKLSAgICAgICAgICogZW50aXRpZXMuIEFuIG9wdGltaXN0aWMtbG9ja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbgotICAgICAgICAgKiBhbiBlbnRpdHkgb3IgbWFwcGVkLXN1cGVyY2xhc3MuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJdCBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXN0aWMtbG9ja2luZy10eXBlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9wdGltaXN0aWNMb2NraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgdG8gdXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9wdGltaXN0aWNMb2NraW5nVHlwZSB0eXBlKCkgZGVmYXVsdCBWRVJTSU9OX0NPTFVNTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgb2YgdHlwZSAKLSAgICAgICAgICAgKiBTRUxFQ1RFRF9DT0xVTU5TLCB0aGlzIGFubm90YXRpb24gbWVtYmVyIGJlY29tZXMgYSAoUmVxdWlyZWQpIAotICAgICAgICAgICAqIGZpZWxkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbltdIHNlbGVjdGVkQ29sdW1ucygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgd2hlcmUgdGhlIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgc2hvdWxkIAotICAgICAgICAgICAqIGNhc2NhZGUgbG9jay4gQ3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdpdGggVkVSU0lPTl9DT0xVTU4gbG9ja2luZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIGNhc2NhZGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlbGVjdGVkLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAKLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXNjYWRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgc2ltcGxlIHR5cGUgdGhhdCBpcyB1c2VkIHdpdGhpbiBhbiBvcHRpbWlzdGljLWxvY2tpbmcgCi0gICAgICAgICAqIHNwZWNpZmljYXRpb24gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBvcHRpbWlzdGljLWxvY2tpbmcgdGhhdAotICAgICAgICAgKiBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBPcHRpbWlzdGljTG9ja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBldmVyeSBmaWVsZCBpbiB0aGUgdGFibGUKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQKLSAgICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFMTF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQSBkZWxldGUKLSAgICAgICAgICAgKiB3aWxsIG9ubHkgY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hBTkdFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgY29tcGFyZXMgc2VsZWN0ZWQgZmllbGRzIGluIHRoZSBXSEVSRQotICAgICAgICAgICAqIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gTm90ZSB0aGF0Ci0gICAgICAgICAgICogdGhlIGZpZWxkcyBzcGVjaWZpZWQgbXVzdCBiZSBtYXBwZWQgYW5kIG5vdCBiZSBwcmltYXJ5IGtleXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VMRUNURURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBhIHNpbmdsZSB2ZXJzaW9uIG51bWJlcgotICAgICAgICAgICAqIGluIHRoZSB3aGVyZSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIFRoZSB2ZXJzaW9uIGZpZWxkIG11c3QgYmUKLSAgICAgICAgICAgKiBtYXBwZWQgYW5kIG5vdCBiZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVkVSU0lPTl9DT0xVTU4KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTExfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUxFQ1RFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NPTFVNTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAotCSAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAotCSAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0JICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKLQkgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCi0JICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotCSAgICAgICAgICovIAotCSAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLQkgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCi0JICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCi0JICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLQkgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKLQkgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCi0JICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotCSAgICAgICAgICovIAotCSAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6Y2hvaWNlPgotCSAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8L3hzZDpjaG9pY2U+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCi0gICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLwotCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCi0JICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotCSAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotCSAgICAgICAgICogcmVhZC4KLQkgICAgICAgICAqLwotCSAgICAgICAgRlVMTCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLQkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0JICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFdFQUssCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0JICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotCSAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLQkgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNPRlQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0JICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKLQkgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotCSAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotCSAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKLQkgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotCSAgICAgICAgICovCi0JICAgICAgICBTT0ZUX1dFQUssCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0JICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotCSAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCi0JICAgICAgICAgKi8KLQkgICAgICAgIEhBUkRfV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKLQkgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLQkgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotCSAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KLQkgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLQkgICAgICAgICAqIGlkZW50aXR5LgotCSAgICAgICAgICovCi0JICAgICAgICBDQUNIRSwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLQkgICAgICAgICAqIG9iamVjdHMuCi0JICAgICAgICAgKi8KLQkgICAgICAgIE5PTkUKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLQkgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotCSAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0JCi0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLQkgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLQkgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0JICAgICAgICAgICovCi0JICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0JCi0JICAgICAgICAgLyoqCi0JICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQotCSAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLQkgICAgICAgICAgKi8KLQkgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLQkgICAgICAgICAgKi8KLQkgICAgICAgICBOT05FCi0gICAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotCTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0JICAgICAgQFRhcmdldCh7fSkKLQkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGltZU9mRGF5IHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2Vjb25kIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQotICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAotICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCi0gICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVRUUklCVVRFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAotICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCi0gICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAotICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9CSkVDVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KLSAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKLSAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAotICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5Ci0gICAgICAgICAgICovCi0gICAgICAgICAgREVGRVJSRUQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVVUTwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0gICAgICAvKiogCi0gICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZXNzaW9ucy5mYWN0b3JpZXMuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgotICAgICAgICoKLSAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCi0gICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICovIAotCSAgICBAVGFyZ2V0KHtUWVBFfSkKLQkgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLQkgICAgICAvKioKLQkgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotCSAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLQkgICAgICAgKi8KLQkgICAgICBDbGFzcyB2YWx1ZSgpOyAKLQkgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KLSAgICAgICAgIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqLyAKLQkgICAgICBAVGFyZ2V0KHtUWVBFfSkKLQkgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KLQkgICAgICAgICAqLwotCSAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KLQkgICAgICAgICAqLwotCSAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KLQkgICAgICAgICAqLwotCSAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpzZXF1ZW5jZT4KLQkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgCi0JICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiAKLQkgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotCSAgICA8L3hzZDpzZXF1ZW5jZT4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLQkgICAgICBAVGFyZ2V0KHt9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotCSAgICAgICAgICovCi0JICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotCSAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0JICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCi0JICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOwotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotCTwveHNkOmNvbXBsZXhUeXBlPgotCQotCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQkKLQk8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgotCSAgPHhzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLQkgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLQkgICAgICAgICAqLwotCSAgICAgICAgSU4sCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLQkgICAgICAgICAqLwotCSAgICAgICAgT1VULAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBJTl9PVVQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLQkgICAgICAgICAqLwotCSAgICAgICAgT1VUX0NVUlNPUgotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQkKLQk8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0JCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJLyoqIAotCQkJCSAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLQkJCQkgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLQkJCQkgKiBUaGlzIG1hcHBpbmcgaXMgdXN1YWxseSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBwb2ludGVyIChzdG9yZWQgaW4gYW4gCi0JCQkJICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLQkJCQkgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotCQkJCSAqIHVzaW5nIGEgZm9yZWlnbiBrZXkgYW5kIGEgdHlwZSBjb2RlLgotCQkJCSAqIAotCQkJCSAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotCQkJCSAqIE1hcHBlZFN1cGVyY2xhc3MgYW5kIEVtYmVkZGFibGUgY2xhc3MuIAotCQkJCSAqLyAKLQkJCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0JCQkJQFJldGVudGlvbihSVU5USU1FKQotCQkJCXB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0JCQkJICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLQkJCQkgICAgICogb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLgotCQkJCSAgICAgKi8KLQkJCQkgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkJCSAgICAKLQkJCQkgICAgLyoqCi0JCQkJICAgICAqIChPcHRpb25hbCkgVGhlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGNhc2NhZGVkIHRvIHRoZSB0YXJnZXQgb2YgCi0JCQkJICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLQkJCQkgICAgICovCi0JCQkJICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLQkJCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLQkJCQkgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLQkJCQkgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0JCQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotCQkJCSAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLQkJCQkgICAgICovCi0JCQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBvcHRpb25hbC4gSWYgc2V0IHRvIGZhbHNlIAotCQkJCSAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotCQkJCSAgICAgKi8KLQkJCQkgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQkJCQkgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotCQkJCSAgICAgKiBpbmRpY2F0b3JzLiBJZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSAKLQkJCQkgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLQkJCQkgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLQkJCQkgICAgICovCi0JCQkJICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0JCQkJICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAgICogdGhpcyBWYXJpYWJsZU9uZVRvT25lLiBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aG9zZSBlbnRpdGllcyAKLSAgICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgICAqIGRlZmF1bHQgYXMgZm9sbG93czoKLSAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAgICogICAgRW50aXR5IGNsYXNzCi0gICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgICAqLwotCQkJCSAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0JCQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1pbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCSAgICAgICAgLyoqCi0gICAgICAgICAgICogVGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICAgKiAKLSAgICAgICAgICAgKiBBbiBleGlzdGVuY2UtY2hlY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZyB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgRXhpc3RlbmNlVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQ0hFQ0tfQ0FDSEU7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAgICogaXQgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IG11c3QgZXhpc3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENIRUNLX0RBVEFCQVNFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAgICogaXQgbXVzdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciAKLSAgICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVNTVU1FX0VYSVNURU5DRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgICAqIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLiAgCi0gICAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFCi0JCQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgkgCi0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIiAvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLQkgIDwveHNkOnJlc3RyaWN0aW9uPgotCTwveHNkOnNpbXBsZVR5cGU+CQotCQotPC94c2Q6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzFfMS54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzZmYxNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDMyNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gSmF2YSBQZXJzaXN0ZW5jZSBBUEkgb2JqZWN0LXJlbGF0aW9uYWwgbWFwcGluZyBmaWxlIHNjaGVtYSAtLT4KLTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOm9ybT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIgCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIgCi0gIHZlcnNpb249IjEuMSI+Ci0KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIEAoIyllY2xpcHNlbGlua19vcm1fMV8xLnhzZCAxLjEgIEZlYnJ1YXJ5IDQgMjAwOQotICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5ldyBuYXRpdmUgRWNsaXBzZUxpbmsgWE1MIG1ldGFkYXRhCi0gICAgICAgZm9ybWF0IHVzZWQgZm9yIEpQQSBhbmQgbmF0aXZlIGRlcGxveW1lbnQgeG1sIGZpbGVzLiAKLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnkgb3IgbmFtZWQtbmF0aXZlLXF1ZXJ5Ci0gICAgICAgIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSAKLSAgICAgICAgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIxLjEiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCB0aGVuIAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcyBvciBzZWNvbmRhcnkgdGFibGVzCi0gICAgICAgICAgICB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzIG9yIHNlY29uZGFyeSB0YWJsZXMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci12YWx1ZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYyIgdHlwZT0ib3JtOmJhc2ljIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZCIgdHlwZT0ib3JtOmVtYmVkZGVkIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyBhbiBlbnRpdHkgbGlzdGVuZXIgdG8gYmUgaW52b2tlZCBhdCBsaWZlY3ljbGUgZXZlbnRzCi0gICAgICAgIGZvciB0aGUgZW50aXRpZXMgdGhhdCBsaXN0IHRoaXMgbGlzdGVuZXIuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotCQkJLyoqCi0JCQkqIFByb3BlcnR5IG5hbWUuCi0JCQkqLyAKLQkJCVN0cmluZyBuYW1lKCk7Ci0JCQkKLQkJCS8qKgotCQkJKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0JCQkqIGNvbnZlcnRlZCB0byBhbiBpbnN0YW5jZSBvZiB2YWx1ZVR5cGUuCi0JCQkqLyAKLQkJCVN0cmluZyB2YWx1ZSgpOwotCQkJCi0JCQkvKioKLQkJCSogUHJvcGVydHkgdmFsdWUgdHlwZS4KLQkJCSogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0JCQkqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotCQkJKiBDb252ZXJzaW9uTWFuYWdlcjogCi0JCQkqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLQkJCSovIAotCQkJQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0JCX0KLQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIAotICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICB9Ci0KLSAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy1tZXRob2RzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0JCSAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0JCSAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0JCSAqICAKLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotCQkgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLQkJICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0JCSAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotCQkgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotCQkgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0JCS8qKgotCQkgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4KLQkJICogIAotCQkgKiBBIHNpbmdsZSBXcml0ZVRyYW5zZm9ybWVyIG1heSBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgb24gdGhlIG1ldGhvZCBvciAKLQkJICogYXR0cmlidXRlLiBNdWx0aXBsZSBXcml0ZVRyYW5zZm9ybWVycyBzaG91bGQgYmUgd3JhcHBlZCBpbnRvIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uLiBObyBXcml0ZVRyYW5zZm9ybWVycyBzcGVjaWZpZWQgZm9yIAotCQkgKiByZWFkLW9ubHkgbWFwcGluZy4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgd3JpdGUtb25seSwgaXQgCi0JCSAqIHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIAotCQkgKiBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICovIAotCQlAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBXcml0ZVRyYW5zZm9ybWVyIHsKLQkJICAgIC8qKgotCQkgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotCQkgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkZpZWxkVHJhbnNmb3JtZXIgCi0JCSAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIGJ1aWxkRmllbGRWYWx1ZSAKLQkJICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW50byB0aGUgZGF0YWJhc2UgCi0JCSAgICAgKiBjb2x1bW4uIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSAKLQkJICAgICAqIHN1cHBvcnRlZCB0aGUgbWV0aG9kIGJ1aWxkRmllbGRWYWx1ZSBpbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIAotCQkgICAgICogZGVmaW5lZCB0byByZXR1cm4gdGhlIHJlbGV2YW50IEphdmEgdHlwZSwgbm90IGp1c3QgT2JqZWN0IGFzIAotCQkgICAgICogZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBidWlsZEZpZWxkVmFsdWUoT2JqZWN0IGluc3RhbmNlLCBTdHJpbmcgZmllbGROYW1lLCBTZXNzaW9uIHNlc3Npb24pLgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCQkKLQkJICAgIC8qKgotCQkgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLQkJICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0JCSAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLQkJICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotCQkgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0JCSAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLQkJICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLQkJICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotCQkgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0JCSAgICAgKi8gCi0JCSAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotCQkgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLQkJICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotCQkgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0JCSAgICAgKi8gCi0JCSAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKioKLQkJICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0JCSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLQkJICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotCQkgKiBkYXRhYmFzZSBjb2x1bW5zLgotCQkgKiAKLQkJICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotCQkgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0JCSAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotCQkgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLQkJICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLQkJICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0JCSAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0JCSAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotCQkgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0JCSAqLyAKLQkJQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0JCUBSZXRlbnRpb24oUlVOVElNRSkKLQkJcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotCQkgICAgLyoqCi0JCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLQkJICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0JCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotCQkgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0JCSAgICAgKi8KLQkJICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0JCSAgICAKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLQkJICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0JCSAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotCQkgICAgICovCi0JCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBGZXRjaFR5cGUgeyBMQVpZLCBFQUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTEFaWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRUFHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZW51bS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRW51bVR5cGUgewotICAgICAgICAgIE9SRElOQUwsCi0gICAgICAgICAgU1RSSU5HCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9SRElOQUwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+ICAgICAgIAotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlCi0gICAgICAgICAgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSk9JTkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMgCi0gICAgICAgIGFsbG93ZWQgdG8gYmUgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSAKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkIAotICAgICAgICBpbiB0aGUgY2xhc3MuIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiAKLSAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHNlcXVlbmNlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQKLSAgICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGNvbnZlcnRlckNsYXNzKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnNpb25WYWx1ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBkYXRhYmFzZSB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGEgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBvbiBhbiBFbnRpdHkuCi0gICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRoYXQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAqIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyBvciAKLSAgICAgICAgICogRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ2xvbmVDb3B5UG9saWN5IG9uIGFuIAotICAgICAgICAgKiBFbnRpdHkuIEEgQ2xvbmVDb3B5UG9saWN5IG11c3Qgc3BlY2lmeSBhdCBvbmUgb3IgYm90aCBvZiB0aGUgIm1ldGhvZCIgCi0gICAgICAgICAqIG9yICJ3b3JraW5nQ29weU1ldGhvZCIuICJ3b3JraW5nQ29weU1ldGhvZCIgaXMgdXNlZCB0byBjbG9uZSBvYmplY3RzIAotICAgICAgICAgKiB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgYXMgdGhleSBhcmUgcmVnaXN0ZXJlZCBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyB0cmFuc2FjdGlvbmFsIG1lY2hhbmlzbSwgdGhlIFVuaXRPZldvcmsuICJtZXRob2QiIHdpbGwgCi0gICAgICAgICAqIGJlIHVzZWQgZm9yIHRoZSBjbG9uZSB0aGF0IGlzIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIsIHdvcmtpbmdDb3B5TWV0aG9kPSJteVdvcmtpbmdDb3B5Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIHNpbXBsZSB0eXBlIHRoYXQgaXMgdXNlZCB3aXRoaW4gYW4gb3B0aW1pc3RpYy1sb2NraW5nIAotICAgICAgICAgKiBzcGVjaWZpY2F0aW9uIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2Ygb3B0aW1pc3RpYy1sb2NraW5nIHRoYXQKLSAgICAgICAgICogRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIGVudGl0aWVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgZXZlcnkgZmllbGQgaW4gdGhlIHRhYmxlCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkCi0gICAgICAgICAgICogaGFzIGJlZW4gY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBTExfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcwotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIEEgZGVsZXRlCi0gICAgICAgICAgICogd2lsbCBvbmx5IGNvbXBhcmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIQU5HRURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIGNvbXBhcmVzIHNlbGVjdGVkIGZpZWxkcyBpbiB0aGUgV0hFUkUKLSAgICAgICAgICAgKiBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZCBoYXMgYmVlbgotICAgICAgICAgICAqIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uIE5vdGUgdGhhdAotICAgICAgICAgICAqIHRoZSBmaWVsZHMgc3BlY2lmaWVkIG11c3QgYmUgbWFwcGVkIGFuZCBub3QgYmUgcHJpbWFyeSBrZXlzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTEVDVEVEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgYSBzaW5nbGUgdmVyc2lvbiBudW1iZXIKLSAgICAgICAgICAgKiBpbiB0aGUgd2hlcmUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBUaGUgdmVyc2lvbiBmaWVsZCBtdXN0IGJlCi0gICAgICAgICAgICogbWFwcGVkIGFuZCBub3QgYmUgdGhlIHByaW1hcnkga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFZFUlNJT05fQ09MVU1OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQUxMX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQU5HRURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VMRUNURURfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVkVSU0lPTl9DT0xVTU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLQkJLyoqIAotCQkgKiAgVGhlIFByaW1hcnlLZXkgYW5ub3RhdGlvbiBhbGxvd3MgYWR2YW5jZWQgY29uZmlndXJhdGlvbiBvZiB0aGUgSWQuCi0JCSAqICBBIHZhbGlkYXRpb24gcG9saWN5IGNhbiBiZSBnaXZlbiB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIGlmIHplcm8gaXMgYSB2YWxpZCBpZCB2YWx1ZS4KLQkJICogIFRoZSBzZXQgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyBjYW4gYWxzbyBiZSBzcGVjaWZpZWQgcHJlY2lzZWx5LgotCQkgKiAKLQkJICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0JCSAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjEKLQkJICovIAotCQlAVGFyZ2V0KHtUWVBFfSkKLQkJQFJldGVudGlvbihSVU5USU1FKQotCQlwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotCQkgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotCQkgICAgICovCi0JCSAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCQkKLQkJICAgIC8qKgotCQkgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgZGlyZWN0bHkuCi0JCSAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLQkJICAgICAqIHN1Y2ggYXMgYSBmb3JlaWduIGtleSwgb3IgYSBpbmhlcml0YW5jZSBkaXNjcmltaW5hdG9yLCBlbWJlZGRlZCwgb3IgdHJhbnNmb3JtYXRpb24gbWFwcGVkIGZpZWxkLgotCQkgICAgICovCi0JCSAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLQkJfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ib3JtOmlkLXZhbGlkYXRpb24iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotCQkvKiogCi0JCSAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLQkJICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLQkJICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0JCSAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLQkJICogCi0JCSAqIEBzZWUgUHJpbWFyeUtleQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotCQkgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLQkJICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLQkJICovIAotCQlwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotCQkgICAgLyoqCi0JCSAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLQkJICAgICAqLwotCQkgICAgTlVMTCwKLQkJCi0JCSAgICAvKioKLQkJICAgICAqIG51bGwgYW5kIDAgYXJlIG5vdCBhbGxvd2VkLCAob25seSBpbnQgYW5kIGxvbmcpLgotCQkgICAgICovCi0JCSAgICBaRVJPLAotCQkKLQkJICAgIC8qKgotCQkgICAgICogTm8gaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotCQkgICAgICovCi0JCSAgICBOT05FCi0JCX0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkVSTyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0JICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0JICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLQkgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotCSAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLQkgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0JICAgICAgICAgKi8gCi0JICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotCSAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLQkgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLQkgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotCSAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLQkgICAgICAgICAqLyAKLQkgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotCSAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLQkgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0JICAgICAgICAgKi8gCi0JICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDpjaG9pY2U+Ci0JICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLQkgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLQkgIDwveHNkOmNob2ljZT4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0JICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLQkgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0JICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0JICAgICAgICAgKiByZWFkLgotCSAgICAgICAgICovCi0JICAgICAgICBGVUxMLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotCSAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLQkgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLQkgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0JICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotCSAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU09GVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLQkgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotCSAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0JICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0JICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotCSAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFNPRlRfV0VBSywKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLQkgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0JICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLQkgICAgICAgICAqLwotCSAgICAgICAgSEFSRF9XRUFLLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotCSAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotCSAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0JICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotCSAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotCSAgICAgICAgICogaWRlbnRpdHkuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENBQ0hFLAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotCSAgICAgICAgICogb2JqZWN0cy4KLQkgICAgICAgICAqLwotCSAgICAgICAgTk9ORQotCSAgICAgIH0KLQkKLQkgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLQotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotCSAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotCSAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0JICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotCSAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotCSAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLQkgICAgICAgICAgKi8KLQkgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQkKLQkgICAgICAgICAvKioKLQkgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0JICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCQotCSAgICAgICAgIC8qKgotCSAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotCSAgICAgICAgICAqLwotCSAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0JPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLW9mLWRheSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLQkgICAgICBAVGFyZ2V0KHt9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIEhvdXIgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbnV0ZSBvZiB0aGUgZGF5LgotCSAgICAgICAgICovIAotCSAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBTZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgTWlsbGlzZWNvbmQgb2YgdGhlIGRheS4KLQkgICAgICAgICAqLyAKLQkgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogSW50ZXJuYWwgdXNlLiBEbyBub3QgbW9kaWZ5LgotCSAgICAgICAgICovIAotCSAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaW51dGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgIDwveHNkOmFubm90YXRpb24+Ci0JICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotCSAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0JPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgIC8qKiAKLSAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgKgotICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgKi8gCi0JICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0JICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotCSAgICAgIC8qKgotCSAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0JICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotCSAgICAgICAqLwotCSAgICAgIENsYXNzIHZhbHVlKCk7IAotCSAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQk8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAotICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe1RZUEV9KQotCSAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLQkgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgbmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotCSAgICAgICAgICovCi0JICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotCSAgICAgICAgICovCi0JICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgotCSAgICAgICAgICovCi0JICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotCSAgICAgICAgICovCi0JICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLQkgICAgICB9Ci0JCi0JICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0JICA8L3hzZDphbm5vdGF0aW9uPgotCSAgICA8eHNkOnNlcXVlbmNlPgotCSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiAKLQkgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLQkgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIAotCSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0JICAgIDwveHNkOnNlcXVlbmNlPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotCSAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLQkgIDx4c2Q6YW5ub3RhdGlvbj4KLQkgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotCSAgICAgIEBUYXJnZXQoe30pCi0JICAgICAgQFJldGVudGlvbihSVU5USU1FKQotCSAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0JICAgICAgICAgKi8KLQkgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCQotCSAgICAgICAgLyoqCi0JICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0JICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0JICAgICAgICAgKi8KLQkgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLQkgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLQkgICAgICAgICAqLwotCSAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLQkgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLQkgICAgICAgICAqLwotCSAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLQkgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0JPC94c2Q6Y29tcGxleFR5cGU+Ci0JCi0JPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCQotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotCSAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBJTiwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVQsCi0JCi0JICAgICAgICAvKioKLQkgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0JICAgICAgICAgKi8KLQkgICAgICAgIElOX09VVCwKLQkKLQkgICAgICAgIC8qKgotCSAgICAgICAgICogT3V0cHV0IGN1cnNvcgotCSAgICAgICAgICovCi0JICAgICAgICBPVVRfQ1VSU09SCi0JICAgICAgfQotCQotCSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotCSAgPC94c2Q6YW5ub3RhdGlvbj4KLQkgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgotCQotCTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQkKLQk8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkvKiogCi0JCQkJICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotCQkJCSAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAotCQkJCSAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLQkJCQkgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotCQkJCSAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCi0JCQkJICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0JCQkJICogCi0JCQkJICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCi0JCQkJICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0JCQkJICovIAotCQkJCUBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKLQkJCQlAUmV0ZW50aW9uKFJVTlRJTUUpCi0JCQkJcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKLQkJCQkgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotCQkJCSAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0JCQkJICAgICAqLwotCQkJCSAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0JCQkJICAgIAotCQkJCSAgICAvKioKLQkJCQkgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLQkJCQkgICAgICogdGhlIGFzc29jaWF0aW9uLgotCQkJCSAgICAgKi8KLQkJCQkgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotCQkJCSAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotCQkJCSAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotCQkJCSAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLQkJCQkgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0JCQkJICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQkJCQkgICAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0JCQkJICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCi0JCQkJICAgICAqLwotCQkJCSAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCQkJCSAgCi0JCQkJICAgIC8qKgotCQkJCSAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0JCQkJICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotCQkJCSAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAotCQkJCSAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotCQkJCSAgICAgKi8KLQkJCQkgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKLQkJCQkgICAgCi0gICAgICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAgICAgICAgICAgKiB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgdGhhdCBpbXBsZW1lbnQgdGhlIHRhcmdldCBpbnRlcmZhY2UgCi0gICAgICAgICAgICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgU1RSSU5HOiBFbnRpdHkubmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIElOVEVHRVI6IFRoZSBuZXh0IGludGVnZXIgYWZ0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgICAgICAgICAgICovCi0JCQkJICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKLQkJCQl9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgRGlzY3JpbWluYXRvckNsYXNzIGlzIHVzZWQgd2l0aGluIGEgVmFyaWFibGVPbmVUb09uZSBhbm5vdGF0aW9uLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDbGFzcyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZGlzY3JpbWluYXRvciB0byBiZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY2xhc3MgdG8gdGhlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBnaXZlbiAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3IiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotCTx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtdHlwZSI+Ci0JICA8eHNkOmFubm90YXRpb24+Ci0JICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQkgICAgICAgIC8qKgotICAgICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICAgKiBjaGVja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAgICogCi0gICAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFubm90YXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldCB0aGUgZXhpc3RlbmNlIGNoZWNrIGZvciBkZXRlcm1pbmluZwotICAgICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICAgIH0KLSAgICAgICAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIENIRUNLX0NBQ0hFLAotCQkJCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUGVyZm9ybSBkb2VzIGV4aXN0IGNoZWNrIG9uIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQkJCQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAgICogZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0JCQkKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgICAqIFRoaXMgd2lsbCBhbHdheXMgZm9yY2UgYW4gaW5zZXJ0IHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCQkKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4JIAotCSAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotCSAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIgLz4KLQkgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiIC8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiIC8+Ci0JICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0JICA8L3hzZDpyZXN0cmljdGlvbj4KLQk8L3hzZDpzaW1wbGVUeXBlPgkKLQkKLTwveHNkOnNjaGVtYT4KLQotCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMV8yLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2MyYjI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8xXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMzUxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMS4yIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8xXzIueHNkIDEuMCAgRmVicnVhcnkgMSAyMDA4Ci0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPHhzZDphbm5vdGF0aW9uPgotICAgICA8eHNkOmRvY3VtZW50YXRpb24+PCFbQ0RBVEFbCi0KLSAgICAgICBUaGlzIGlzIHRoZSBYTUwgU2NoZW1hIGZvciB0aGUgbmF0aXZlIEVjbGlwc2VsaW5rIFhNTCBtYXBwaW5nIGZpbGUKLSAgICAgICBUaGUgZmlsZSBtYXkgYmUgbmFtZWQgIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiIGluIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgIGFyY2hpdmUgb3IgaXQgbWF5IGJlIG5hbWVkIHNvbWUgb3RoZXIgbmFtZSB3aGljaCB3b3VsZCBiZQotICAgICAgIHVzZWQgdG8gbG9jYXRlIHRoZSBmaWxlIGFzIHJlc291cmNlIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgT2JqZWN0L3JlbGF0aW9uYWwgbWFwcGluZyBmaWxlcyBtdXN0IGluZGljYXRlIHRoZSBvYmplY3QvcmVsYXRpb25hbAotICAgICAgIG1hcHBpbmcgZmlsZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHBlcnNpc3RlbmNlIG5hbWVzcGFjZToKLQotICAgICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0KLQotICAgICAgIGFuZCBpbmRpY2F0ZSB0aGUgdmVyc2lvbiBvZiB0aGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB2ZXJzaW9uIGVsZW1lbnQgYXMgc2hvd24gYmVsb3c6Ci0KLSAgICAgICA8ZW50aXR5LW1hcHBpbmdzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIgotICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIAotICAgICAgIGVjbGlwc2VsaW5rX29ybV8xXzIueHNkCi0gICAgICAgdmVyc2lvbj0iMS4yIj4KLSAgICAgICAuLi4KLSAgICAgICA8L2VudGl0eS1tYXBwaW5ncz4KLQotICAgICBdXT48L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtcHR5VHlwZSIvPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idmVyc2lvblR5cGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6cGF0dGVybiB2YWx1ZT0iWzAtOV0rKFwuWzAtOV0rKSoiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhY2Nlc3MtbWV0aG9kcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGUgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuaW52YWxpZGF0aW9uLkNhY2hlSW52YWxpZGF0aW9uUG9saWN5IAotICAgICAgICAgKiB3aGljaCBzZXRzIG9iamVjdHMgaW4gRWNsaXBzZUxpbmsncyBpZGVudGl0eSBtYXBzIHRvIGJlIGludmFsaWQgCi0gICAgICAgICAqIGZvbGxvd2luZyBnaXZlbiBydWxlcy4gQnkgZGVmYXVsdCBpbiBFY2xpcHNlTGluaywgb2JqZWN0cyBkbyBub3QgCi0gICAgICAgICAqIGV4cGlyZSBpbiB0aGUgY2FjaGUuIFNldmVyYWwgZGlmZmVyZW50IHBvbGljaWVzIGFyZSBhdmFpbGFibGUgdG8gCi0gICAgICAgICAqIGFsbG93IG9iamVjdHMgdG8gZXhwaXJlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZVR5cGUKLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ2FjaGUgYW5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICogSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ2FjaGUgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSBkZWZpbmVkIAotICAgICAgICAgKiBvbiB0aGUgcm9vdCBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZVR5cGUgdHlwZSgpIGRlZmF1bHQgU09GVF9XRUFLOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2l6ZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAxMDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENhY2hlZCBpbnN0YW5jZXMgaW4gdGhlIHNoYXJlZCBjYWNoZSBvciBhIGNsaWVudCAKLSAgICAgICAgICAgKiBpc29sYXRlZCBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzaGFyZWQoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2FjaGUtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZnJlc2gtb25seS1pZi1uZXdlciIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNhYmxlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29vcmRpbmF0aW9uLXR5cGUiIHR5cGU9Im9ybTpjYWNoZS1jb29yZGluYXRpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+IAotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0gICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotICAgICAgICAgICAqIHJlYWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRlVMTCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0gICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0gICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0gICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLSAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotICAgICAgICAgICAqLwotICAgICAgICAgIEhBUkRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0gICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotICAgICAgICAgICAqIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENBQ0hFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLSAgICAgICAgICAgKiBvYmplY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLSAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLSAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0gICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTiwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOX09VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVRfQ1VSU09SCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhbiBtYXBwaW5nCi0gICAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgICAgMS4gVGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBjb250YWlucyBtZXRhZGF0YQotICAgICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgICB0aGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBkZWZpbmVkIGluCi0gICAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgICBuYW1lZC1uYXRpdmUtcXVlcnkgYW5kIHNxbC1yZXN1bHQtc2V0LW1hcHBpbmcgZWxlbWVudHMgYXJlIGdsb2JhbAotICAgICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgICAgb3IgZGlmZmVyZW50IG1hcHBpbmcgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyBhbHNvCi0gICAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICAgIHJlc3VsdC1zZXQtbWFwcGluZyBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lIG9yIGRpZmZlcmVudCBtYXBwaW5nCi0gICAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgICAgNC4gVGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZWFjaCBkZWZpbmUKLSAgICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgICBiZSBwYXJ0aWFsLgotCi0gICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyIgdHlwZT0ib3JtOm1hcHBlZC1zdXBlcmNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uVHlwZSIgZml4ZWQ9IjEuMiIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZQotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLgotCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywKLSAgICAgICAgICAgIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICAgICAgICAgICAgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8KLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4KLSAgICAgICAgdGhlIGRlZmF1bHRpbmcgcnVsZXMgZm9yIHRoZSBlbnRpdHkgYW5kIGl0cyBzdWItZWxlbWVudHMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ib3JtOnRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWNvbmRhcnktdGFibGUiIHR5cGU9Im9ybTpzZWNvbmRhcnktdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9Im9ybTppbmhlcml0YW5jZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307Ci0gICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGVzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGNvbnRhaW5zIHRoZSBlbnRpdHkgZmllbGQgb3IgcHJvcGVydHkgbWFwcGluZ3MuCi0gICAgICAgIEl0IG1heSBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgdG8gaW5jbHVkZSBvbmx5IGEgc3Vic2V0IG9mIHRoZQotICAgICAgICBmaWVsZHMgb3IgcHJvcGVydGllcy4gSWYgbWV0YWRhdGEtY29tcGxldGUgZm9yIHRoZSBlbnRpdHkgaXMgdHJ1ZQotICAgICAgICB0aGVuIHRoZSByZW1haW5kZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBkZWZhdWx0ZWQgYWNjb3JkaW5nCi0gICAgICAgIHRvIHRoZSBkZWZhdWx0IHJ1bGVzLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJvcm06aWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIiB0eXBlPSJvcm06YmFzaWMtY29sbGVjdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLW1hcCIgdHlwZT0ib3JtOmJhc2ljLW1hcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24iIHR5cGU9Im9ybTp2ZXJzaW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbmUtdG8tb25lIiB0eXBlPSJvcm06b25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiIgdHlwZT0ib3JtOnRyYW5zZm9ybWF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNpZW50IiB0eXBlPSJvcm06dHJhbnNpZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWMgewotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9iIiB0eXBlPSJvcm06bG9iIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNIfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1hbGwiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06Y29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGVtYmVkZGFibGUgb2JqZWN0cy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKLSAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWRDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpZC12YWxpZGF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgSWRWYWxpZGF0aW9uIGVudW0gZGV0ZXJtaW5lcyB0aGUgdHlwZSB2YWx1ZSB0aGF0IGFyZSB2YWxpZCBmb3IgYW4gSWQuCi0gICAgICAgICAqIEJ5IGRlZmF1bHQgbnVsbCBpcyBub3QgYWxsb3dlZCwgYW5kIDAgaXMgbm90IGFsbG93IGZvciBzaW5nbGV0b24gaWRzIG9mIGxvbmcgb3IgaW50IHR5cGUuCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFpFUk8gZm9yIHNpbmdsZXRvbiBpZHMsIGFuZCBOVUxMIGZvciBjb21wb3NpdGUgaWRzLgotICAgICAgICAgKiBUaGlzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIEBQcmltYXJ5S2V5IGFubm90YXRpb24sIG9yIENsYXNzRGVzY3JpcHRvciBBUEkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFByaW1hcnlLZXkKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3Ijc2V0SWRWYWxpZGF0aW9uKElkVmFsaWRhdGlvbikKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAxLjAgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gSWRWYWxpZGF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogT25seSBudWxsIGlzIG5vdCBhbGxvd2VkIGFzIGFuIGlkIHZhbHVlLCAwIGlzIGFsbG93ZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5VTEwsCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogbnVsbCBhbmQgMCBhcmUgbm90IGFsbG93ZWQsIChvbmx5IGludCBhbmQgbG9uZykuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFpFUk8sCi0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm8gaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWkVSTyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5oZXJpdGFuY2UgewotICAgICAgICAgIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgU0lOR0xFX1RBQkxFOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJpbmhlcml0YW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlIHsgU0lOR0xFX1RBQkxFLCBKT0lORUQsIFRBQkxFX1BFUl9DTEFTUyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgSU5ORVIsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIE9VVEVSLAotICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBpbnZlcnNlSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImludmVyc2Utam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLAotICAgICAgICBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsCi0gICAgICAgIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnktaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5Ci0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJvcm06bG9jay1tb2RlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnktaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24tbW9kZSIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbi12YWxpZGF0aW9uLW1vZGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1jb2x1bW4tdmFsaWRhdGlvbi1tb2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gT3JkZXJDb2x1bW5WYWxpZGF0aW9uTW9kZSB7Ci0gICAgICAgICAgTk9ORSwKLSAgICAgICAgICBDT1JSRUNUSU9OLAotICAgICAgICAgIEVYQ0VQVElPTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDT1JSRUNUSU9OIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFWENFUFRJT04iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXBlcnNpc3QiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUG9zdFJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVQZXJzaXN0IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogIFRoZSBQcmltYXJ5S2V5IGFubm90YXRpb24gYWxsb3dzIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIElkLgotICAgICAgICAgKiAgQSB2YWxpZGF0aW9uIHBvbGljeSBjYW4gYmUgZ2l2ZW4gdGhhdCBhbGxvd3Mgc3BlY2lmeWluZyBpZiB6ZXJvIGlzIGEgdmFsaWQgaWQgdmFsdWUuCi0gICAgICAgICAqICBUaGUgc2V0IG9mIHByaW1hcnkga2V5IGNvbHVtbnMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIHByZWNpc2VseS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMS4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIENvbmZpZ3VyZXMgd2hhdCBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICogQnkgZGVmYXVsdCAwIGlzIG5vdCBhIHZhbGlkIGlkIHZhbHVlLCB0aGlzIGNhbiBiZSB1c2VkIHRvIGFsbG93IDAgaWQgdmFsdWVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIElkVmFsaWRhdGlvbiB2YWxpZGF0aW9uKCkgZGVmYXVsdCBJZFZhbGlkYXRpb24uWkVSTzsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsaWRhdGlvbiIgdHlwZT0ib3JtOmlkLXZhbGlkYXRpb24iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLSAgICAgICAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0gICAgICAgICAgICogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0gICAgICAgICAgICogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0gICAgICAgICAgICogQ29udmVyc2lvbk1hbmFnZXI6IAotICAgICAgICAgICAqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlIaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNxbFJlc3VsdFNldE1hcHBpbmcgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgRW50aXR5UmVzdWx0W10gZW50aXRpZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENvbHVtblJlc3VsdFtdIGNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktcmVzdWx0IiB0eXBlPSJvcm06ZW50aXR5LXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1yZXN1bHQiIHR5cGU9Im9ybTpjb2x1bW4tcmVzdWx0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotICAgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotICAgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLSAgICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRlbXBvcmFsIHsKLSAgICAgICAgICBUZW1wb3JhbFR5cGUgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06dGVtcG9yYWwtdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0gICAgICAgICAgREFURSwgLy8gamF2YS5zcWwuRGF0ZQotICAgICAgICAgIFRJTUUsIC8vIGphdmEuc3FsLlRpbWUKLSAgICAgICAgICBUSU1FU1RBTVAgLy8gamF2YS5zcWwuVGltZXN0YW1wCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZS1vZi1kYXkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRpbWVPZkRheSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBIb3VyIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBob3VyKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaW51dGUgb2YgdGhlIGRheS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IG1pbnV0ZSgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIE1pbGxpc2Vjb25kIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaWxsaXNlY29uZCgpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEludGVybmFsIHVzZS4gRG8gbm90IG1vZGlmeS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBzcGVjaWZpZWQoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImhvdXIiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWludXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtaWxsaXNlY29uZCIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gaXMgYW4gb3B0aW9uYWwgYW5ub3RhdGlvbiBmb3IgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGFsbG93cyB0byBtYXAgYW4gYXR0cmlidXRlIHRvIG9uZSBvciBtb3JlIAotICAgICAgICAgKiBkYXRhYmFzZSBjb2x1bW5zLgotICAgICAgICAgKiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb24gYW5ub3RhdGlvbiBpcyBhbiBvcHRpb25hbCBwYXJ0IG9mIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgZGVmaW5pdGlvbi4gVW5sZXNzIHRoZSBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgaXMgCi0gICAgICAgICAqIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgUmVhZFRyYW5zZm9ybWVyLCBpdCBkZWZpbmVzIAotICAgICAgICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgdmFsdWUocylpbnRvIGF0dHJpYnV0ZSB2YWx1ZS4KLSAgICAgICAgICogQWxzbyB1bmxlc3MgaXQncyBhIHJlYWQtb25seSBtYXBwaW5nLCBlaXRoZXIgV3JpdGVUcmFuc2Zvcm1lciAKLSAgICAgICAgICogYW5ub3RhdGlvbiBvciBXcml0ZVRyYW5zZm9ybWVycyBhbm5vdGF0aW9uIHNob3VsZCBiZSBzcGVjaWZpZWQuIEVhY2ggCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGEgCi0gICAgICAgICAqIHNpbmdsZSBkYXRhYmFzZSBjb2x1bW4gdmFsdWUgKGNvbHVtbiBpcyBzcGVjaWZpZWQgaW4gdGhlIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyKS4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNmb3JtYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLSAgICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3B0aW9uYWwgZWxlbWVudCBpcyBhIGhpbnQgYXMgdG8gd2hldGhlciB0aGUgdmFsdWUKLSAgICAgICAgICAgICAqICBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgbWF5IGJlIG51bGwuIEl0IGlzIGRpc3JlZ2FyZGVkCi0gICAgICAgICAgICAgKiAgZm9yIHByaW1pdGl2ZSB0eXBlcywgd2hpY2ggYXJlIGNvbnNpZGVyZWQgbm9uLW9wdGlvbmFsLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTpyZWFkLXRyYW5zZm9ybWVyIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiIHR5cGU9Im9ybTp3cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYXJpYWJsZSBvbmUgdG8gb25lIG1hcHBpbmdzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBhIHBvaW50ZXIgCi0gICAgICAgICAqIHJlZmVyZW5jZXMgYmV0d2VlbiBhIGphdmEgb2JqZWN0IGFuZCBhbiBpbXBsZW1lbnRlciBvZiBhbiBpbnRlcmZhY2UuIAotICAgICAgICAgKiBUaGlzIG1hcHBpbmcgaXMgdXN1YWxseSByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBwb2ludGVyIChzdG9yZWQgaW4gYW4gCi0gICAgICAgICAqIGluc3RhbmNlIHZhcmlhYmxlKSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBvYmplY3RzLiBJbiB0aGUgCi0gICAgICAgICAqIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGVzLCB0aGVzZSBtYXBwaW5ncyBhcmUgbm9ybWFsbHkgaW1wbGVtZW50ZWQgCi0gICAgICAgICAqIHVzaW5nIGEgZm9yZWlnbiBrZXkgYW5kIGEgdHlwZSBjb2RlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBWYXJpYWJsZU9uZVRvT25lIGNhbiBiZSBzcGVjaWZpZWQgd2l0aGluIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5kIEVtYmVkZGFibGUgY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWYXJpYWJsZU9uZVRvT25lIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBpbnRlcmZhY2UgY2xhc3MgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSAKLSAgICAgICAgICAgKiBhc3NvY2lhdGlvbi4gSWYgbm90IHNwZWNpZmllZCBpdCB3aWxsIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgCi0gICAgICAgICAgICogb2YgdGhlIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHRhcmdldEludGVyZmFjZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIGNhc2NhZGVkIHRvIHRoZSB0YXJnZXQgb2YgCi0gICAgICAgICAgICogdGhlIGFzc29jaWF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgKiB0aGF0IHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSAKLSAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBvcHRpb25hbC4gSWYgc2V0IHRvIGZhbHNlIAotICAgICAgICAgICAqIHRoZW4gYSBub24tbnVsbCByZWxhdGlvbnNoaXAgbXVzdCBhbHdheXMgZXhpc3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdpbGwgaG9sZCB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBpbmRpY2F0b3JzLiBJZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmFtZSAKLSAgICAgICAgICAgKiBvZiB0aGUgZGlzY3JpbWluYXRvciBjb2x1bW4gZGVmYXVsdHMgdG8gIkRUWVBFIiBhbmQgdGhlIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IgdHlwZSB0byBTVFJJTkcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCBARGlzY3JpbWluYXRvckNvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGxpc3Qgb2YgZGlzY3JpbWluYXRvciB0eXBlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggCi0gICAgICAgICAgICogdGhpcyBWYXJpYWJsZU9uZVRvT25lLiBJZiBub25lIGFyZSBzcGVjaWZpZWQgdGhlbiB0aG9zZSBlbnRpdGllcyAKLSAgICAgICAgICAgKiB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgdGhhdCBpbXBsZW1lbnQgdGhlIHRhcmdldCBpbnRlcmZhY2UgCi0gICAgICAgICAgICogd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiB0eXBlcy4gVGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB3aWxsIAotICAgICAgICAgICAqIGRlZmF1bHQgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgU1RSSU5HOiBFbnRpdHkubmFtZSgpCi0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIENIQVI6IEZpcnN0IGxldHRlciBvZiB0aGUgCi0gICAgICAgICAgICogICAgRW50aXR5IGNsYXNzCi0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIElOVEVHRVI6IFRoZSBuZXh0IGludGVnZXIgYWZ0ZXIgCi0gICAgICAgICAgICogICAgdGhlIGhpZ2hlc3QgaW50ZWdlciBleHBsaWNpdGx5IGFkZGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDbGFzc1tdIGRpc2NyaW1pbmF0b3JDbGFzc2VzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgc2luZ2xlIFdyaXRlVHJhbnNmb3JtZXIgbWF5IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgbWV0aG9kIG9yIAotICAgICAgICAgKiBhdHRyaWJ1dGUuIE11bHRpcGxlIFdyaXRlVHJhbnNmb3JtZXJzIHNob3VsZCBiZSB3cmFwcGVkIGludG8gCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24uIE5vIFdyaXRlVHJhbnNmb3JtZXJzIHNwZWNpZmllZCBmb3IgCi0gICAgICAgICAqIHJlYWQtb25seSBtYXBwaW5nLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCAKLSAgICAgICAgICogc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgCi0gICAgICAgICAqIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFdyaXRlVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuRmllbGRUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgYnVpbGRGaWVsZFZhbHVlIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSAKLSAgICAgICAgICAgICAqIGNvbHVtbi4gTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIAotICAgICAgICAgICAgICogc3VwcG9ydGVkIHRoZSBtZXRob2QgYnVpbGRGaWVsZFZhbHVlIGluIHRoZSBjbGFzcyBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIHRvIHJldHVybiB0aGUgcmVsZXZhbnQgSmF2YSB0eXBlLCBub3QganVzdCBPYmplY3QgYXMgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGJ1aWxkRmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUsIFNlc3Npb24gc2Vzc2lvbikuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLSAgICAgICAgICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotICAgICAgICAgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0gICAgICAgICAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLSAgICAgICAgICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLSAgICAgICAgICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgICAgICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0gICAgICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzAueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYTIzYWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwzNjI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMi4wIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8yXzAueHNkIDIuMCAgT2N0b2JlciA1IDIwMDgKLSAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICA8L3hzZDphbm5vdGF0aW9uPgotICA8eHNkOmFubm90YXRpb24+Ci0gICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj48IVtDREFUQVsKLQotICAgICAgIFRoaXMgaXMgdGhlIFhNTCBTY2hlbWEgZm9yIHRoZSBuYXRpdmUgRWNsaXBzZWxpbmsgWE1MIG1hcHBpbmcgZmlsZQotICAgICAgIFRoZSBmaWxlIG1heSBiZSBuYW1lZCAiTUVUQS1JTkYvZWNsaXBzZWxpbmstb3JtLnhtbCIgaW4gdGhlIHBlcnNpc3RlbmNlCi0gICAgICAgYXJjaGl2ZSBvciBpdCBtYXkgYmUgbmFtZWQgc29tZSBvdGhlciBuYW1lIHdoaWNoIHdvdWxkIGJlCi0gICAgICAgdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgYXMgcmVzb3VyY2Ugb24gdGhlIGNsYXNzcGF0aC4KLSAgICAgICBPYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIGZpbGVzIG11c3QgaW5kaWNhdGUgdGhlIG9iamVjdC9yZWxhdGlvbmFsCi0gICAgICAgbWFwcGluZyBmaWxlIHNjaGVtYSBieSB1c2luZyB0aGUgcGVyc2lzdGVuY2UgbmFtZXNwYWNlOgotCi0gICAgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybQotCi0gICAgICAgYW5kIGluZGljYXRlIHRoZSB2ZXJzaW9uIG9mIHRoZSBzY2hlbWEgYnkgdXNpbmcgdGhlIHZlcnNpb24gZWxlbWVudCBhcyBzaG93biBiZWxvdzoKLQotICAgICAgIDxlbnRpdHktbWFwcGluZ3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iCi0gICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0gCi0gICAgICAgZWNsaXBzZWxpbmtfb3JtXzJfMC54c2QKLSAgICAgICB2ZXJzaW9uPSIyLjAiPgotICAgICAgIC4uLgotICAgICAgIDwvZW50aXR5LW1hcHBpbmdzPgotCi0gICAgIF1dPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gIDwveHNkOmFubm90YXRpb24+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1wdHlUeXBlIi8+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFjY2Vzcy1tZXRob2RzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZSBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5pbnZhbGlkYXRpb24uQ2FjaGVJbnZhbGlkYXRpb25Qb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIHNldHMgb2JqZWN0cyBpbiBFY2xpcHNlTGluaydzIGlkZW50aXR5IG1hcHMgdG8gYmUgaW52YWxpZCAKLSAgICAgICAgICogZm9sbG93aW5nIGdpdmVuIHJ1bGVzLiBCeSBkZWZhdWx0IGluIEVjbGlwc2VMaW5rLCBvYmplY3RzIGRvIG5vdCAKLSAgICAgICAgICogZXhwaXJlIGluIHRoZSBjYWNoZS4gU2V2ZXJhbCBkaWZmZXJlbnQgcG9saWNpZXMgYXJlIGF2YWlsYWJsZSB0byAKLSAgICAgICAgICogYWxsb3cgb2JqZWN0cyB0byBleHBpcmUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlVHlwZQotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDYWNoZSBhbm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDYWNoZSBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgCi0gICAgICAgICAqIG9uIHRoZSByb290IG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDYWNoZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjYWNoZSB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlVHlwZSB0eXBlKCkgZGVmYXVsdCBTT0ZUX1dFQUs7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzaXplIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IHNpemUoKSBkZWZhdWx0IDEwMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGEgY2xpZW50IAotICAgICAgICAgICAqIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhZnRlciBhIGZpeCBwZXJpb2Qgb2YgdGltZSAobXMpLiAKLSAgICAgICAgICAgKiBRdWVyaWVzIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayAKLSAgICAgICAgICAgKiB0byB0aGUgZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgaW50IGV4cGlyeSgpIGRlZmF1bHQgLTE7IC8vIG1pbnVzIG9uZSBpcyBubyBleHBpcnkuCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYSBzcGVjaWZpYyB0aW1lIG9mIGRheS4gUXVlcmllcyAKLSAgICAgICAgICAgKiBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgdG8gdGhlIAotICAgICAgICAgICAqIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIFRpbWVPZkRheSBleHBpcnlUaW1lT2ZEYXkoKSBkZWZhdWx0IEBUaW1lT2ZEYXkoc3BlY2lmaWVkPWZhbHNlKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yY2UgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UgdG8gYWx3YXlzIAotICAgICAgICAgICAqIHJlZnJlc2ggdGhlIGNhY2hlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGFsd2F5c1JlZnJlc2goKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYWxsIHF1ZXJpZXMgdGhhdCBnbyB0byB0aGUgZGF0YWJhc2UsIHJlZnJlc2ggdGhlCi0gICAgICAgICAgICogY2FjaGUgb25seSBpZiB0aGUgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBkYXRhYmFzZSBieSBhIHF1ZXJ5IGlzIAotICAgICAgICAgICAqIG5ld2VyIHRoYW4gdGhlIGRhdGEgaW4gdGhlIGNhY2hlIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcHRpbWlzdGljIAotICAgICAgICAgICAqIGxvY2tpbmcgZmllbGQpCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gcmVmcmVzaE9ubHlJZk5ld2VyKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0dGluZyB0byB0cnVlIHdpbGwgZm9yY2UgYWxsIHF1ZXJpZXMgdG8gYnlwYXNzIHRoZSAKLSAgICAgICAgICAgKiBjYWNoZSBmb3IgaGl0cyBidXQgc3RpbGwgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBjYWNoZSBmb3IgaWRlbnRpdHkuIAotICAgICAgICAgICAqIFRoaXMgZm9yY2VzIGFsbCBxdWVyaWVzIHRvIGhpdCB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZUhpdHMoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2FjaGUgY29vcmRpbmF0aW9uIG1vZGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENhY2hlQ29vcmRpbmF0aW9uVHlwZSBjb29yZGluYXRpb25UeXBlKCkgZGVmYXVsdCBTRU5EX09CSkVDVF9DSEFOR0VTOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnkiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZS1vZi1kYXkiIHR5cGU9Im9ybTp0aW1lLW9mLWRheSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6Y2hvaWNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2hhcmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLSAgICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotICAgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBiZSBtZW1vcnkgaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSAKLSAgICAgICAgICAgKiByZWFkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZVTEwsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFdFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLSAgICAgICAgICAgKiBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBXRUFLIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYQotICAgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotICAgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotICAgICAgICAgICAqIGRlc2NyaXB0b3IncyBzZXRJZGVudGl0eU1hcFNpemUoKSBtZXRob2QuIFRoZSBzdWItY2FjaGUKLSAgICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotICAgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0gICAgICAgICAgICogdGhhdCBpdCB1c2VzIGhhcmQgcmVmZXJlbmNlcyBpbiB0aGUgc3ViLWNhY2hlLiBVc2UgdGhpcyBpZGVudGl0eSAKLSAgICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBIQVJEX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotICAgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLSAgICAgICAgICAgKiBvbiBhIGxlYXN0LXJlY2VudGx5LXVzZWQgYmFzaXMuIFRoaXMgbWV0aG9kIGFsbG93cyBvYmplY3QKLSAgICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotICAgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLSAgICAgICAgICAgKiBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDQUNIRSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdBUk5JTkc6IERvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgCi0gICAgICAgICAgICogb2JqZWN0cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gIAotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1jb29yZGluYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDYWNoZSBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUNvb3JkaW5hdGlvblR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiBjaGFuZ2VkIG9iamVjdHMgaW5jbHVkaW5nIGRhdGEgYWJvdXQgdGhlIGNoYW5nZXMuCi0gICAgICAgICAgICogVGhpcyBkYXRhIGlzIG1lcmdlZCBpbnRvIHRoZSByZWNlaXZpbmcgY2FjaGUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9PQkpFQ1RfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNlbmRzIGEgbGlzdCBvZiB0aGUgaWRlbnRpdGllcyBvZiB0aGUgb2JqZWN0cyB0aGF0IGhhdmUgY2hhbmdlZC4gCi0gICAgICAgICAgICogVGhlIHJlY2VpdmluZyBjYWNoZSBpbnZhbGlkYXRlcyB0aGUgb2JqZWN0cyAocmF0aGVyIHRoYW4gY2hhbmdpbmcgCi0gICAgICAgICAgICogYW55IG9mIHRoZSBkYXRhKQotICAgICAgICAgICAqLwotICAgICAgICAgIElOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2FtZSBhcyBTRU5EX09CSkVDVF9DSEFOR0VTIGV4Y2VwdCBpdCBhbHNvIGluY2x1ZGVzIGFueSBuZXdseQotICAgICAgICAgICAqIGNyZWF0ZWQgb2JqZWN0cyBmcm9tIHRoZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIERvZXMgbm8gY2FjaGUgY29vcmRpbmF0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9PQkpFQ1RfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jaGFuZ2V0cmFja2luZy5PYmplY3RDaGFuZ2VQb2xpY3kgCi0gICAgICAgICAqIHdoaWNoIGNvbXB1dGVzIGNoYW5nZXMgc2V0cyBmb3IgRWNsaXBzZUxpbmsncyBVbml0T2ZXb3JrIGNvbW1pdCAKLSAgICAgICAgICogcHJvY2Vzcy4gQW4gT2JqZWN0Q2hhbmdlUG9saWN5IGlzIHN0b3JlZCBvbiBhbiBFbnRpdHkncyBkZXNjcmlwdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBBIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gbWF5IGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2hhbmdlVHJhY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgY2hhbmdlIHRyYWNraW5nIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2hhbmdlVHJhY2tpbmdUeXBlIHZhbHVlKCkgZGVmYXVsdCBBVVRPOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nLXR5cGUiIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBDaGFuZ2VUcmFja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIEFUVFJJQlVURSBjaGFuZ2UgdHJhY2tpbmcgdHlwZSBhbGxvd3MgY2hhbmdlIHRyYWNraW5nIGF0IHRoZQotICAgICAgICAgICAqIGF0dHJpYnV0ZSBsZXZlbCBvZiBhbiBvYmplY3QuIE9iamVjdHMgd2l0aCBjaGFuZ2VkIGF0dHJpYnV0ZXMgd2lsbAotICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBpbiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgCi0gICAgICAgICAgICogcmVzdWx0cyBvZiB0aGUgY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVRUUklCVVRFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gT0JKRUNUIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgYWxsb3dzIGFuIG9iamVjdCB0byBjYWxjdWxhdGUgZm9yIAotICAgICAgICAgICAqIGl0c2VsZiB3aGV0aGVyIGl0IGhhcyBjaGFuZ2VkLiBDaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBwcm9jZXNzZWQgaW4gCi0gICAgICAgICAgICogdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIHJlc3VsdHMgb2YgdGhlIAotICAgICAgICAgICAqIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIE9CSkVDVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgREVGRVJSRUQgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBkZWZlcnMgYWxsIGNoYW5nZSBkZXRlY3Rpb24gdG8KLSAgICAgICAgICAgKiB0aGUgVW5pdE9mV29yaydzIGNoYW5nZSBkZXRlY3Rpb24gcHJvY2Vzcy4gRXNzZW50aWFsbHksIHRoZSAKLSAgICAgICAgICAgKiBjYWxjdWxhdGVDaGFuZ2VzKCkgbWV0aG9kIHdpbGwgcnVuIGZvciBhbGwgb2JqZWN0cyBpbiBhIFVuaXRPZldvcmsuIAotICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgT2JqZWN0Q2hhbmdlUG9saWN5Ci0gICAgICAgICAgICovCi0gICAgICAgICAgREVGRVJSRUQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXaWxsIG5vdCBzZXQgYW55IGNoYW5nZSB0cmFja2luZyBwb2xpY3kuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQVVUTwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVFRSSUJVVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9CSkVDVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREVGRVJSRUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjdXN0b21pemVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvbmZpZy5EZXNjcmlwdG9yQ3VzdG9taXplciAKLSAgICAgICAgICogaW50ZXJmYWNlIGFuZCBpcyB0byBydW4gYWdhaW5zdCBhbiBlbmV0aXR5J3MgY2xhc3MgZGVzY3JpcHRvciBhZnRlciBhbGwgCi0gICAgICAgICAqIG1ldGFkYXRhIHByb2Nlc3NpbmcgaGFzIGJlZW4gY29tcGxldGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBUaGUgQ3VzdG9taXplciBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyAKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZSBjbGFzcy4gSW4gdGhlIGNhc2Ugb2YgaW5oZXJpdGFuY2UsIGEgQ3VzdG9taXplciBpcyBub3QgCi0gICAgICAgICAqIGluaGVyaXRlZCBmcm9tIGl0cyBwYXJlbnQgY2xhc3Nlcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9taXplciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yIGN1c3RvbWl6ZXIgY2xhc3MgdGhhdCAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgYXBwbGllZCBmb3IgdGhlIHJlbGF0ZWQgZW50aXR5IG9yIGVtYmVkZGFibGUgY2xhc3MuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24uCi0gICAgICAgICAqIEl0IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIAotICAgICAgICAgKiBwYXJhbWV0ZXJzIG9mIGEgbmFtZWQgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIERpcmVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU4sCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTl9PVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBPdXRwdXQgY3Vyc29yCi0gICAgICAgICAgICovCi0gICAgICAgICAgT1VUX0NVUlNPUgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTl9PVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVF9DVVJTT1IiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1tYXBwaW5ncyI+Ci0gICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYW4gbWFwcGluZwotICAgICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgICBmb3IgdGhlIGVudGlyZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgaWYgdGhpcyBlbGVtZW50Ci0gICAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICAgIHRoZSBzYW1lIGZpbGUgaW4gd2hpY2ggdGhleSBvY2N1ci4KLQotICAgICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgICB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZQotICAgICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbwotICAgICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnksIG5hbWVkLW5hdGl2ZS1xdWVyeSwgb3IKLSAgICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZwotICAgICAgICAgIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgICAgdGhlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGEgbWFuYWdlZCBwZXJzaXN0ZW50IGNsYXNzLiBUaGUgbWFwcGluZwotICAgICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIiB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRhYmxlIiB0eXBlPSJvcm06ZW1iZWRkYWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIGZpeGVkPSIyLjAiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0NBQ0hFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAotICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKLSAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAKLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+IAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkLAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4KLQotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsCi0gICAgICAgICAgICBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIGdlbmVyYXRvcnMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsCi0gICAgICAgICAgICBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIGdlbmVyYXRvcnMKLSAgICAgICAgICAgIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhbiBlbnRpdHkuIElzIGFsbG93ZWQgdG8gYmUKLSAgICAgICAgc3BhcnNlbHkgcG9wdWxhdGVkIGFuZCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGFubm90YXRpb25zLgotICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViLWVsZW1lbnRzIHdpbGwKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUiIHR5cGU9Im9ybTp0YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIiB0eXBlPSJvcm06c2Vjb25kYXJ5LXRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKLSAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgQ29sdW1uIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQtaWQiIHR5cGU9Im9ybTplbWJlZGRlZC1pZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW9uZSIgdHlwZT0ib3JtOm1hbnktdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSIgdHlwZT0ib3JtOnZhcmlhYmxlLW9uZS10by1vbmUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYW55LXRvLW1hbnkiIHR5cGU9Im9ybTptYW55LXRvLW1hbnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbGVtZW50LWNvbGxlY3Rpb24iIHR5cGU9Im9ybTplbGVtZW50LWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY0NvbGxlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSB2YWx1ZSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1tYXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpY01hcCB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgbWFwIAotICAgICAgICAgICAqIGtleS4gSWYgdGhlIG5hbWUgb24gdGUga2V5IGNvbHVtbiBpcyAiIiwgdGhlIG5hbWUgd2lsbCBkZWZhdWx0IHRvOgotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBvciBmaWVsZDsgIl9LRVkiLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiBrZXlDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIGtleSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIGRpcmVjdCBtYXAga2V5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQga2V5Q29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdmFsdWUgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBjb2x1bW4gbWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IHZhbHVlQ29udmVydGVyKCkgZGVmYXVsdCBAQ29udmVydDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJrZXktY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1yZWZyZXNoIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGFibGUuIElmIGl0IGlzIG5vdCAKLSAgICAgICAgICAgKiBzcGVjaWZpZWQsIGl0IGlzIGRlZmF1bHRlZCB0byB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nOiAKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgc291cmNlIGVudGl0eTsgIl8iIDsgdGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uc2hpcCAKLSAgICAgICAgICAgKiBwcm9wZXJ0eSBvciBmaWVsZCBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgY2F0YWxvZyBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgY2F0YWxvZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgc2NoZW1hIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBzY2hlbWEuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgYSBwcmltYXJ5IGtleSBjb2x1bW4gdGhhdCBpcyB1c2VkIGFzIGEgCi0gICAgICAgICAgICogZm9yZWlnbiBrZXkgdG8gam9pbiB0byBhbm90aGVyIHRhYmxlLiBJZiB0aGUgc291cmNlIGVudGl0eSB1c2VzIGEgCi0gICAgICAgICAgICogY29tcG9zaXRlIHByaW1hcnkga2V5LCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG11c3QgYmUgc3BlY2lmaWVkIAotICAgICAgICAgICAqIGZvciBlYWNoIGZpZWxkIG9mIHRoZSBjb21wb3NpdGUgcHJpbWFyeSBrZXkuIEluIGEgc2luZ2xlIHByaW1hcnkgCi0gICAgICAgICAgICoga2V5IGNhc2UsIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbWF5IG9wdGlvbmFsbHkgYmUgc3BlY2lmaWVkLiAKLSAgICAgICAgICAgKiBEZWZhdWx0aW5nIHdpbGwgYXBwbHkgb3RoZXJ3aXNlIGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogbmFtZSwgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIAotICAgICAgICAgICAqIG9mIHRoZSBzb3VyY2UgZW50aXR5LiByZWZlcmVuY2VkQ29sdW1uTmFtZSwgdGhlIHNhbWUgbmFtZSBvZiAKLSAgICAgICAgICAgKiBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OyAKLSAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVuaXF1ZSBjb25zdHJhaW50cyB0aGF0IGFyZSB0byBiZSBwbGFjZWQgb24gdGhlIHRhYmxlLiAKLSAgICAgICAgICAgKiBUaGVzZSBhcmUgb25seSB1c2VkIGlmIHRhYmxlIGdlbmVyYXRpb24gaXMgaW4gZWZmZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307IAotICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnNpb25WYWx1ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBkYXRhYmFzZSB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGF0YVZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIG9iamVjdCB2YWx1ZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgb2JqZWN0VmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgaW1wbGVtZW50Ci0gICAgICAgICAgICogdGhlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyIGludGVyZmFjZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBjb252ZXJ0ZXJDbGFzcygpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbi1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbHVtblJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGEgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBvbiBhbiBFbnRpdHkuCi0gICAgICAgICAqIEl0IGlzIHJlcXVpcmVkIHRoYXQgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeSBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAqIGFzIHRoZSBhcmd1bWVudC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcyBvciAKLSAgICAgICAgICogRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEZvciBpbnN0YW5jZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ29weVBvbGljeSgiZXhhbXBsZS5NeUNvcHlQb2xpY3kiKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29weVBvbGljeSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAoUmVxdWlyZWQpCi0gICAgICAgICogVGhpcyBkZWZpbmVzIHRoZSBjbGFzcyBvZiB0aGUgY29weSBwb2xpY3kuIEl0IG11c3Qgc3BlY2lmeSBhIGNsYXNzIAotICAgICAgICAqIHRoYXQgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kKLSAgICAgICAgKi8KLSAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIkRUWVBFIjsKLSAgICAgICAgICBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSgpIGRlZmF1bHQgU1RSSU5HOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAzMTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgRGlzY3JpbWluYXRvckNsYXNzIGlzIHVzZWQgd2l0aGluIGEgVmFyaWFibGVPbmVUb09uZSBhbm5vdGF0aW9uLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDbGFzcyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZGlzY3JpbWluYXRvciB0byBiZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiAKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY2xhc3MgdG8gdGhlIGluc3RhbnRpYXRlZCB3aXRoIHRoZSBnaXZlbiAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3IiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsgU1RSSU5HLCBDSEFSLCBJTlRFR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIQVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVEVHRVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcwotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCi0gICAgICAgIHRoZSBhbm5vdGF0aW9ucy4gQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZQotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbAotICAgICAgICBiZSByZWN1cnNpdmVseSBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGFibGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRlZC1pZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVtYmVkZGVkSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LWxpc3RlbmVycyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUxpc3RlbmVycyB7Ci0gICAgICAgICAgQ2xhc3NbXSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lciIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlSZXN1bHQgewotICAgICAgICAgIENsYXNzIGVudGl0eUNsYXNzKCk7Ci0gICAgICAgICAgRmllbGRSZXN1bHRbXSBmaWVsZHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yQ29sdW1uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZC1yZXN1bHQiIHR5cGU9Im9ybTpmaWVsZC1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJlbnRpdHktY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW1lcmF0ZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnVtZXJhdGVkIHsKLSAgICAgICAgICBFbnVtVHlwZSB2YWx1ZSgpIGRlZmF1bHQgT1JESU5BTDsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJvcm06ZW51bS10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJmZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRmV0Y2hUeXBlIHsgTEFaWSwgRUFHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkxBWlkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVBR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGaWVsZFJlc3VsdCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImdlbmVyYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEdlbmVyYXRpb25UeXBlIHsgVEFCTEUsIFNFUVVFTkNFLCBJREVOVElUWSwgQVVUTyB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFUVVFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJREVOVElUWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSWQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgeyBTSU5HTEVfVEFCTEUsIEpPSU5FRCwgVEFCTEVfUEVSX0NMQVNTIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSU5HTEVfVEFCTEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU5FRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX0NMQVNTIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqIG9uIGFuIEVudGl0eS4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgaXMgdGhlIGRlZmF1bHQgQ29weVBvbGljeSBpbiAKLSAgICAgICAgICogRWNsaXBzZUxpbmsgYW5kIHRoZXJlZm9yZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uIGlzIG9ubHkgdXNlZCB0byAKLSAgICAgICAgICogb3ZlcnJpZGUgb3RoZXIgdHlwZXMgb2YgY29weSBwb2xpY2llcwotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIG9yIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBFeGFtcGxlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBJbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqb2luLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pblRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGludmVyc2VKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW52ZXJzZS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsCi0gICAgICAgIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwKLSAgICAgICAgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hbnlUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXBwZWQtc3VwZXJjbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYSBtYXBwZWQgc3VwZXJjbGFzcy4gSXMKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUKLSAgICAgICAgY2FuIGJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBhcmUgdG8gYmUgcHJvY2Vzc2VkCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5Ci0gICAgICAgIGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3N7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQtY2xhc3MiIHR5cGU9Im9ybTppZC1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXkiIHR5cGU9Im9ybTpwcmltYXJ5LWtleSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciIgdHlwZT0ib3JtOmNhY2hlLWludGVyY2VwdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9jay1tb2RlIiB0eXBlPSJvcm06bG9jay1tb2RlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICA8L3hzZDpzZXF1ZW5jZT4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gb3B0aW1pc3RpYy1sb2NraW5nIGVsZW1lbnQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgKiBvcHRpbWlzdGljIGxvY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIG9yIGRlbGV0aW5nIAotICAgICAgICAgKiBlbnRpdGllcy4gQW4gb3B0aW1pc3RpYy1sb2NraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uCi0gICAgICAgICAqIGFuIGVudGl0eSBvciBtYXBwZWQtc3VwZXJjbGFzcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEl0IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc3RpYy1sb2NraW5nLXR5cGUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3B0aW1pc3RpY0xvY2tpbmcgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2Ygb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSB0byB1c2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT3B0aW1pc3RpY0xvY2tpbmdUeXBlIHR5cGUoKSBkZWZhdWx0IFZFUlNJT05fQ09MVU1OOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3IgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBvZiB0eXBlIAotICAgICAgICAgICAqIFNFTEVDVEVEX0NPTFVNTlMsIHRoaXMgYW5ub3RhdGlvbiBtZW1iZXIgYmVjb21lcyBhIChSZXF1aXJlZCkgCi0gICAgICAgICAgICogZmllbGQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uW10gc2VsZWN0ZWRDb2x1bW5zKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB3aGVyZSB0aGUgb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBzaG91bGQgCi0gICAgICAgICAgICogY2FzY2FkZSBsb2NrLiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgd2l0aCBWRVJTSU9OX0NPTFVNTiBsb2NraW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gY2FzY2FkZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VsZWN0ZWQtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmctdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhc2NhZGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgc2ltcGxlIHR5cGUgdGhhdCBpcyB1c2VkIHdpdGhpbiBhbiBvcHRpbWlzdGljLWxvY2tpbmcgCi0gICAgICAgICAqIHNwZWNpZmljYXRpb24gdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiBvcHRpbWlzdGljLWxvY2tpbmcgdGhhdAotICAgICAgICAgKiBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBPcHRpbWlzdGljTG9ja2luZ1R5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBldmVyeSBmaWVsZCBpbiB0aGUgdGFibGUKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQKLSAgICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFMTF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIG9ubHkgdGhlIGNoYW5nZWQgZmllbGRzCi0gICAgICAgICAgICogaW4gdGhlIFdIRVJFIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gQSBkZWxldGUKLSAgICAgICAgICAgKiB3aWxsIG9ubHkgY29tcGFyZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0hBTkdFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgY29tcGFyZXMgc2VsZWN0ZWQgZmllbGRzIGluIHRoZSBXSEVSRQotICAgICAgICAgICAqIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZSBvciBhIGRlbGV0ZS4gSWYgYW55IGZpZWxkIGhhcyBiZWVuCi0gICAgICAgICAgICogY2hhbmdlZCwgYW4gb3B0aW1pc3RpYyBsb2NraW5nIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4gTm90ZSB0aGF0Ci0gICAgICAgICAgICogdGhlIGZpZWxkcyBzcGVjaWZpZWQgbXVzdCBiZSBtYXBwZWQgYW5kIG5vdCBiZSBwcmltYXJ5IGtleXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VMRUNURURfQ09MVU1OUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFVzaW5nIHRoaXMgdHlwZSBvZiBsb2NraW5nIHBvbGljeSBjb21wYXJlcyBhIHNpbmdsZSB2ZXJzaW9uIG51bWJlcgotICAgICAgICAgICAqIGluIHRoZSB3aGVyZSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUuIFRoZSB2ZXJzaW9uIGZpZWxkIG11c3QgYmUKLSAgICAgICAgICAgKiBtYXBwZWQgYW5kIG5vdCBiZSB0aGUgcHJpbWFyeSBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVkVSU0lPTl9DT0xVTU4KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBTExfQ09MVU1OUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBTkdFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRUxFQ1RFRF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWRVJTSU9OX0NPTFVNTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPiAgCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcmRlci1ieSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQnkgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3JyZWN0aW9uLXR5cGUiIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4tY29ycmVjdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIE9yZGVyQ29ycmVjdGlvblR5cGUgewotICAgICAgICAgIFJFQUQsCi0gICAgICAgICAgUkVBRF9XUklURSwKLSAgICAgICAgICBFWENFUFRJT04KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRF9XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRVBUSU9OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVc2VkIHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IGNvbHVtbnMgZGlyZWN0bHkuCi0gICAgICAgICAgICogVGhpcyBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIEBJZCBpZiB0aGUgcHJpbWFyeSBrZXkgaW5jbHVkZXMgYSBub24gYmFzaWMgZmllbGQsCi0gICAgICAgICAgICogc3VjaCBhcyBhIGZvcmVpZ24ga2V5LCBvciBhIGluaGVyaXRhbmNlIGRpc2NyaW1pbmF0b3IsIGVtYmVkZGVkLCBvciB0cmFuc2Zvcm1hdGlvbiBtYXBwZWQgZmllbGQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uW10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgIAotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbGlkYXRpb24iIHR5cGU9Im9ybTppZC12YWxpZGF0aW9uIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLUBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi1wdWJsaWMgQGludGVyZmFjZSBRdWVyeVJlZGlyZWN0b3JzIHsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIEFsbFF1ZXJpZXMgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZyBvYmplY3QgcXVlcnkKLSAgICAgKiB0aGF0IGRvZXMgbm90IGhhdmUgYSBtb3JlIHByZWNpc2UgcmVkaXJlY3RvciAobGlrZSB0aGUgCi0gICAgICogUmVhZE9iamVjdFF1ZXJ5IFJlZGlyZWN0b3IpIG9yIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIAotICAgICAqLwotICAgIENsYXNzIGFsbFF1ZXJpZXMoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRBbGwgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRSZXN1bHRMaXN0KCkgQVBJIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZWFkQWxsKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBSZWFkT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhyb3VnaCB0aGUgZ2V0U2luZ2xlUmVzdWx0KCkgQVBJIG9yIEVudGl0eU1hbmFnZXIuZmluZCgpIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZWFkT2JqZWN0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBSZXBvcnRRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVwb3J0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhhdCBjb250YWlucyBhZ3JlZ2F0ZSBmdW5jdGlvbnMgb3Igc2VsZWN0cyBtdWx0aXBsZSBlbnRpdGllcyB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICovCi0gICAgQ2xhc3MgcmVwb3J0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBVcGRhdGUgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFVwZGF0ZU9iamVjdFF1ZXJ5IG9yIFVwZGF0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBVcGRhdGVPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuZXZlciBmbHVzaGluZyBjaGFuZ2VzIHRvIHRoZSBkYXRhc291cmNlLgotICAgICAqIFF1ZXJ5IHJlZGlyZWN0b3JzIGFsbG93IHRoZSB1c2VyIHRvIGludGVyY2VwdCBxdWVyeSBleGVjdXRpb24gcHJldmVudGluZwotICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAqLyAKLSAgICBDbGFzcyB1cGRhdGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IEluc2VydCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogSW5zZXJ0T2JqZWN0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIEluc2VydE9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW4gcGVyc2lzdGluZyBhbiBvYmplY3QgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovCi0gICAgQ2xhc3MgaW5zZXJ0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgIC8qKgotICAgICAqIEEgRGVmYXVsdCBEZWxldGUgT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBEZWxldGVPYmplY3RRdWVyeSBvciBEZWxldGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovCi0gICAgQ2xhc3MgZGVsZXRlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi19Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsLXF1ZXJpZXMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLWFsbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb2JqZWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGVsZXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotICAgICAgICAgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotICAgICAgICAgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotICAgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLSAgICAgICAgICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0gICAgICAgICAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0gICAgICAgICAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLSAgICAgICAgICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLSAgICAgICAgICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlY29uZGFyeS10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlY29uZGFyeVRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHBrSm9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBxdWVyeSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgSmF2YSBjbGFzcyBkZXNpcmVkIGJhY2sgZnJvbSB0aGUgcHJvY2VkdXJlLCAKLSAgICAgICAgICAgKiB0aGlzIGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBjb2RlLCB0aGlzIGRlcGVuZGVudCBvbiB0aGUgdHlwZSByZXR1cm5lZCAKLSAgICAgICAgICAgKiBmcm9tIHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgaW50IGpkYmNUeXBlKCkgZGVmYXVsdCAtMTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEpEQkMgdHlwZSBuYW1lLCB0aGlzIG1heSBiZSByZXF1aXJlZCBmb3IgQVJSQVkgb3IgCi0gICAgICAgICAgICogU1RSVUNUIHR5cGVzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBqZGJjVHlwZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXJlY3Rpb24iIHR5cGU9Im9ybTpkaXJlY3Rpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJxdWVyeS1wYXJhbWV0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCi0gICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCi0gICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtZ2VuZXJhdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3IgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHBrQ29sdW1uVmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBpbml0aWFsVmFsdWUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgaW50IGFsbG9jYXRpb25TaXplKCkgZGVmYXVsdCA1MDsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUtY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEQVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLSAgICAgICAgICogZGF0YWJhc2UgY29sdW1ucy4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotICAgICAgICAgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLSAgICAgICAgICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0gICAgICAgICAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotICAgICAgICAgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgZGF0YVR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBlbnRpdHkuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBvYmplY3RUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFVuaXF1ZUNvbnN0cmFpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmdbXSBjb2x1bW5OYW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKiogCi0gICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLSAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0gICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLSAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLSAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLSAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLSAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0gICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKLSAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCi0gICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKLSAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08L3hzZDpzY2hlbWE+Ci0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzY2U1Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8xLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDQxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTwhLS0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi08IS0tIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICAgICAxMi8yLzIwMDktMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTYyODk6IEFkZCBjdXJyZW50IGFubm90YXRpb24gbWV0YWRhdGEgc3VwcG9ydCBvbiBtYXBwZWQgc3VwZXJjbGFzc2VzIHRvIEVjbGlwc2VMaW5rLU9STS5YTUwgU2NoZW1hICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2NjEyOiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG9ubHkgbWV0YWRhdGEgc3VwcG9ydCBvZiByZXR1cm4gaW5zZXJ0L3VwZGF0ZSB0byB0aGUgRWNsaXBzZUxpbmstT1JNLlhNTCBTY2hlbWEgICAgLS0+Ci08IS0tICAgICAgICAtIGZvcm1hdHRlZCB0byBtYXRjaCBvcm1fMl8wLnhzZCBzbyB0aGF0IHVzZXJzIGNhbiBlYXNpbHkgY29tcGFyZSB0aGUgdHdvIHNjaGVtYXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgNS80LzIwMTAtMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjI3MjE5OiBFeHBhbmQgRWNsaXBzZUxpbmstT1JNLlhNTCBzY2hlbWEgZnVuY3Rpb25hbGl0eSBmb3IgMi4xIHJlbGVhc2UgICh1cGRhdGUgdmVyc2lvbiB0byAyLjEpICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIyLjEiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzJfMS54c2QgMi4xICBBcHJpbCAwNSAyMDEwCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8xLnhzZAotICAgICAgIHZlcnNpb249IjIuMSI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDYWNoZWQgaW5zdGFuY2VzIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgYSBjbGllbnQgCi0gICAgICAgICAgICogaXNvbGF0ZWQgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc2hhcmVkKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGFmdGVyIGEgZml4IHBlcmlvZCBvZiB0aW1lIChtcykuIAotICAgICAgICAgICAqIFF1ZXJpZXMgZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIAotICAgICAgICAgICAqIHRvIHRoZSBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgZXhwaXJ5KCkgZGVmYXVsdCAtMTsgLy8gbWludXMgb25lIGlzIG5vIGV4cGlyeS4KLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRXhwaXJlIGNhY2hlZCBpbnN0YW5jZSBhIHNwZWNpZmljIHRpbWUgb2YgZGF5LiBRdWVyaWVzIAotICAgICAgICAgICAqIGV4ZWN1dGVkIGFnYWluc3QgdGhlIGNhY2hlIGFmdGVyIHRoaXMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGUgCi0gICAgICAgICAgICogZGF0YWJhc2UgZm9yIGEgcmVmcmVzaGVkIGNvcHkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgVGltZU9mRGF5IGV4cGlyeVRpbWVPZkRheSgpIGRlZmF1bHQgQFRpbWVPZkRheShzcGVjaWZpZWQ9ZmFsc2UpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBGb3JjZSBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSB0byBhbHdheXMgCi0gICAgICAgICAgICogcmVmcmVzaCB0aGUgY2FjaGUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gYWx3YXlzUmVmcmVzaCgpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbGwgcXVlcmllcyB0aGF0IGdvIHRvIHRoZSBkYXRhYmFzZSwgcmVmcmVzaCB0aGUKLSAgICAgICAgICAgKiBjYWNoZSBvbmx5IGlmIHRoZSBkYXRhIHJlY2VpdmVkIGZyb20gdGhlIGRhdGFiYXNlIGJ5IGEgcXVlcnkgaXMgCi0gICAgICAgICAgICogbmV3ZXIgdGhhbiB0aGUgZGF0YSBpbiB0aGUgY2FjaGUgKGFzIGRldGVybWluZWQgYnkgdGhlIG9wdGltaXN0aWMgCi0gICAgICAgICAgICogbG9ja2luZyBmaWVsZCkKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiByZWZyZXNoT25seUlmTmV3ZXIoKSBkZWZhdWx0IGZhbHNlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXR0aW5nIHRvIHRydWUgd2lsbCBmb3JjZSBhbGwgcXVlcmllcyB0byBieXBhc3MgdGhlIAotICAgICAgICAgICAqIGNhY2hlIGZvciBoaXRzIGJ1dCBzdGlsbCByZXNvbHZlIGFnYWluc3QgdGhlIGNhY2hlIGZvciBpZGVudGl0eS4gCi0gICAgICAgICAgICogVGhpcyBmb3JjZXMgYWxsIHF1ZXJpZXMgdG8gaGl0IHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBkaXNhYmxlSGl0cygpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYWNoZSBjb29yZGluYXRpb24gbW9kZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVDb29yZGluYXRpb25UeXBlIGNvb3JkaW5hdGlvblR5cGUoKSBkZWZhdWx0IFNFTkRfT0JKRUNUX0NIQU5HRVM7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeSIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lLW9mLWRheSIgdHlwZT0ib3JtOnRpbWUtb2YtZGF5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaGFyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNhY2hlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbHdheXMtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZyZXNoLW9ubHktaWYtbmV3ZXIiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzYWJsZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvb3JkaW5hdGlvbi10eXBlIiB0eXBlPSJvcm06Y2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ2FjaGVJbnRlcmNlcHRvciB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDYWNoZVR5cGUgZW51bSBpcyB1c2VkIHdpdGggdGhlIENhY2hlIGFubm90YXRpb24gZm9yIGEgCi0gICAgICAgICAqIHBlcnNpc3RlbnQgY2xhc3MuIEl0IGRlZmluZXMgdGhlIHR5cGUgb2YgSWRlbnRpdHlNYXAvQ2FjaGUgdXNlZCBmb3IgCi0gICAgICAgICAqIHRoZSBjbGFzcy4gQnkgZGVmYXVsdCB0aGUgU09GVF9XRUFLIGNhY2hlIHR5cGUgaXMgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBDYWNoZVR5cGUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4gQ2FjaGVzIGFsbCBvYmplY3RzCi0gICAgICAgICAgICogYW5kIGRvZXMgbm90IHJlbW92ZSB0aGVtLiAKLSAgICAgICAgICAgKiBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgYmUgbWVtb3J5IGludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgCi0gICAgICAgICAgICogcmVhZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGVUxMLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHdlYWsgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBXRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgRlVMTCBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUKLSAgICAgICAgICAgKiBvYmplY3RzIHVzaW5nIHNvZnQgcmVmZXJlbmNlcy4gVGhpcyBtZXRob2QgYWxsb3dzIGZ1bGwgZ2FyYmFnZQotICAgICAgICAgICAqIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93IGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kCi0gICAgICAgICAgICogZ3VhcmFudGVlZCBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2ltaWxhciB0byB0aGUgV0VBSyBpZGVudGl0eSBtYXAgZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEKLSAgICAgICAgICAgKiBtb3N0LWZyZXF1ZW50bHktdXNlZCBzdWItY2FjaGUuIFRoZSBzaXplIG9mIHRoZSBzdWItY2FjaGUgaXMKLSAgICAgICAgICAgKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGlkZW50aXR5IG1hcCBhcyBzcGVjaWZpZWQgYnkKLSAgICAgICAgICAgKiBkZXNjcmlwdG9yJ3Mgc2V0SWRlbnRpdHlNYXBTaXplKCkgbWV0aG9kLiBUaGUgc3ViLWNhY2hlCi0gICAgICAgICAgICogdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUKLSAgICAgICAgICAgKiBnYXJiYWdlLWNvbGxlY3RlZCBvbmx5IGlmIHRoZSBzeXN0ZW0gaXMgbG93IG9uIG1lbW9yeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTT0ZUX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJZGVudGljYWwgdG8gdGhlIHNvZnQgY2FjaGUgd2VhayAoU09GVF9XRUFLKSBpZGVudGl0eSBtYXAgZXhjZXB0IAotICAgICAgICAgICAqIHRoYXQgaXQgdXNlcyBoYXJkIHJlZmVyZW5jZXMgaW4gdGhlIHN1Yi1jYWNoZS4gVXNlIHRoaXMgaWRlbnRpdHkgCi0gICAgICAgICAgICogbWFwIGlmIHNvZnQgcmVmZXJlbmNlcyBkbyBub3QgYmVoYXZlIHByb3Blcmx5IG9uIHlvdXIgcGxhdGZvcm0uCi0gICAgICAgICAgICovCi0gICAgICAgICAgSEFSRF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBjYWNoZSBpZGVudGl0eSBtYXAgbWFpbnRhaW5zIGEgZml4ZWQgbnVtYmVyIG9mIG9iamVjdHMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiBPYmplY3RzIGFyZSByZW1vdmVkIGZyb20gdGhlIGNhY2hlCi0gICAgICAgICAgICogb24gYSBsZWFzdC1yZWNlbnRseS11c2VkIGJhc2lzLiBUaGlzIG1ldGhvZCBhbGxvd3Mgb2JqZWN0Ci0gICAgICAgICAgICogaWRlbnRpdHkgZm9yIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgb2JqZWN0cy4KLSAgICAgICAgICAgKiBXQVJOSU5HOiBGdXJuaXNoZXMgY2FjaGluZyBhbmQgaWRlbnRpdHksIGJ1dCBkb2VzIG5vdCBndWFyYW50ZWUgCi0gICAgICAgICAgICogaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ0FDSEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBXQVJOSU5HOiBEb2VzIG5vdCBwcmVzZXJ2ZSBvYmplY3QgaWRlbnRpdHkgYW5kIGRvZXMgbm90IGNhY2hlIAotICAgICAgICAgICAqIG9iamVjdHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTT0ZUX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkhBUkRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0FDSEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotICAgICAgICAgICAqIFRoaXMgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgcmVjZWl2aW5nIGNhY2hlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotICAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotICAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNhbWUgYXMgU0VORF9PQkpFQ1RfQ0hBTkdFUyBleGNlcHQgaXQgYWxzbyBpbmNsdWRlcyBhbnkgbmV3bHkKLSAgICAgICAgICAgKiBjcmVhdGVkIG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBBVFRSSUJVVEUgY2hhbmdlIHRyYWNraW5nIHR5cGUgYWxsb3dzIGNoYW5nZSB0cmFja2luZyBhdCB0aGUKLSAgICAgICAgICAgKiBhdHRyaWJ1dGUgbGV2ZWwgb2YgYW4gb2JqZWN0LiBPYmplY3RzIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwKLSAgICAgICAgICAgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIAotICAgICAgICAgICAqIHJlc3VsdHMgb2YgdGhlIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFUVFJJQlVURSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIE9CSkVDVCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGFsbG93cyBhbiBvYmplY3QgdG8gY2FsY3VsYXRlIGZvciAKLSAgICAgICAgICAgKiBpdHNlbGYgd2hldGhlciBpdCBoYXMgY2hhbmdlZC4gQ2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIAotICAgICAgICAgICAqIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIG9mIHRoZSAKLSAgICAgICAgICAgKiBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPQkpFQ1QsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIERFRkVSUkVEIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZGVmZXJzIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIHRvCi0gICAgICAgICAgICogdGhlIFVuaXRPZldvcmsncyBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MuIEVzc2VudGlhbGx5LCB0aGUgCi0gICAgICAgICAgICogY2FsY3VsYXRlQ2hhbmdlcygpIG1ldGhvZCB3aWxsIHJ1biBmb3IgYWxsIG9iamVjdHMgaW4gYSBVbml0T2ZXb3JrLiAKLSAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IE9iamVjdENoYW5nZVBvbGljeQotICAgICAgICAgICAqLwotICAgICAgICAgIERFRkVSUkVELAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV2lsbCBub3Qgc2V0IGFueSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5LgotICAgICAgICAgICAqLwotICAgICAgICAgIEFVVE8KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUUklCVVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICAgKiBtZXRhZGF0YSBwcm9jZXNzaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUgY2xhc3MuIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIEN1c3RvbWl6ZXIgaXMgbm90IAotICAgICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5fT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IGN1cnNvcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVF9DVVJTT1IKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5fT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyAKLSAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcXVlcnkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIiB0eXBlPSJvcm06bWFwcGVkLXN1cGVyY2xhc3MiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5IiB0eXBlPSJvcm06ZW50aXR5IiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGFibGUiIHR5cGU9Im9ybTplbWJlZGRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb25UeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIGZpeGVkPSIyLjEiIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPC94c2Q6ZWxlbWVudD4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgRXhpc3RlbmNlQ2hlY2tpbmcgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIGNoZWNraW5nIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBlbnRpdGllcy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIGV4aXN0ZW5jZS1jaGVja2luZyBzcGVjaWZpY2F0aW9uIGlzIHN1cHBvcnRlZCBvbiBhbiBFbnRpdHkgb3IgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MgYW5ub3RhdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEV4aXN0ZW5jZUNoZWNraW5nIHsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU2V0IHRoZSBleGlzdGVuY2UgY2hlY2sgZm9yIGRldGVybWluaW5nCi0gICAgICAgICAgICogaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBFeGlzdGVuY2VUeXBlIHZhbHVlKCkgZGVmYXVsdCBDSEVDS19DQUNIRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgYW5kIAotICAgICAgICAgKiBpdCBpcyBpbiB0aGUgY2FjaGUsIHRoZW4gaXQgbXVzdCBleGlzdC4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0NBQ0hFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQZXJmb3JtIGRvZXMgZXhpc3QgY2hlY2sgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfREFUQUJBU0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCB0aGVuIAotICAgICAgICAgKiBpdCBtdXN0IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIAotICAgICAgICAgKiBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfRVhJU1RFTkNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCB0aGUgb2JqZWN0IGRvZXMgbm90IGV4aXN0LiBUaGlzIG1heSBiZSB1c2VkIGlmIHRoZSAKLSAgICAgICAgICogYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBleGlzdGVuY2UgY2hlY2suICAKLSAgICAgICAgICogVGhpcyB3aWxsIGFsd2F5cyBmb3JjZSBhbiBpbnNlcnQgdG8gYmUgY2FsbGVkLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX05PTl9FWElTVEVOQ0UKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPiAgICAKLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19DQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfREFUQUJBU0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9FWElTVEVOQ0UiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFTU1VNRV9OT05fRVhJU1RFTkNFIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+IAotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBNZXRhZGF0YSB0aGF0IGFwcGxpZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYW5kIG5vdCBqdXN0IHRvIAotICAgICAgICB0aGUgbWFwcGluZyBmaWxlIGluIHdoaWNoIGl0IGlzIGNvbnRhaW5lZC4gCi0KLSAgICAgICAgSWYgdGhlIHhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIGVsZW1lbnQgaXMgc3BlY2lmaWVkLAotICAgICAgICB0aGUgY29tcGxldGUgc2V0IG9mIG1hcHBpbmcgbWV0YWRhdGEgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0IAotICAgICAgICBpcyBjb250YWluZWQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGVzIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlc2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXMgYSB3aG9sZSAKLSAgICAgICAgdW5sZXNzIHRoZXkgYXJlIG92ZXJyaWRkZW4gYnkgbG9jYWwgYW5ub3RhdGlvbiBvciBYTUwgCi0gICAgICAgIGVsZW1lbnQgc2V0dGluZ3MuIAotICAgICAgICAKLSAgICAgICAgc2NoZW1hIC0gVXNlZCBhcyB0aGUgc2NoZW1hIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLCBqb2luCi0gICAgICAgICAgICB0YWJsZXMsIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgCi0gICAgICAgICAgICBnZW5lcmF0b3JzIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2F0YWxvZyAtIFVzZWQgYXMgdGhlIGNhdGFsb2cgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBkZWxpbWl0ZWQtaWRlbnRpZmllcnMgLSBVc2VkIHRvIHRyZWF0IGRhdGFiYXNlIGlkZW50aWZpZXJzIGFzCi0gICAgICAgICAgICBkZWxpbWl0ZWQgaWRlbnRpZmllcnMuCi0gICAgICAgIGFjY2VzcyAtIFVzZWQgYXMgdGhlIGFjY2VzcyB0eXBlIGZvciBhbGwgbWFuYWdlZCBjbGFzc2VzIGluCi0gICAgICAgICAgICB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXNjYWRlLXBlcnNpc3QgLSBBZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucwotICAgICAgICAgICAgaW4gYWxsIGVudGl0eSByZWxhdGlvbnNoaXBzIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGVudGl0eS1saXN0ZW5lcnMgLSBMaXN0IG9mIGRlZmF1bHQgZW50aXR5IGxpc3RlbmVycyB0byBiZSBpbnZva2VkIAotICAgICAgICAgICAgb24gZWFjaCBlbnRpdHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIAotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVsaW1pdGVkLWlkZW50aWZpZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIHRoZSBzZXR0aW5ncyBhbmQgbWFwcGluZ3MgZm9yIGFuIGVudGl0eS4gSXMgYWxsb3dlZCB0byBiZQotICAgICAgICBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYW5ub3RhdGlvbnMuCi0gICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gCi0gICAgICAgIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgb24gdGhlIGVudGl0eSBjbGFzcyAoYW5kIGl0cyBmaWVsZHMKLSAgICAgICAgb3IgcHJvcGVydGllcykgYXJlIHRvIGJlIHByb2Nlc3NlZC4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIAotICAgICAgICB0aGUgZGVmYXVsdGluZyBydWxlcyBmb3IgdGhlIGVudGl0eSBhbmQgaXRzIHN1YmVsZW1lbnRzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldChUWVBFKSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9Im9ybTpjbGFzcy1leHRyYWN0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0ib3JtOmZldGNoLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVJUVUFMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0e307Ci0gICAgICAgICAgSm9pblRhYmxlIGpvaW5UYWJsZSgpIGRlZmF1bHQgQEpvaW5UYWJsZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIENvbHVtbiBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljIHsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJnZW5lcmF0ZWQtdmFsdWUiIHR5cGU9Im9ybTpnZW5lcmF0ZWQtdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIgdHlwZT0ib3JtOmxvYiIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIgdHlwZT0ib3JtOmVudW1lcmF0ZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi1pbnNlcnQiIHR5cGU9Im9ybTpyZXR1cm4taW5zZXJ0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4tdXBkYXRlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2ljLW1hcCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljTWFwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGRhdGEgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCBtYXAgCi0gICAgICAgICAgICoga2V5LiBJZiB0aGUgbmFtZSBvbiB0ZSBrZXkgY29sdW1uIGlzICIiLCB0aGUgbmFtZSB3aWxsIGRlZmF1bHQgdG86Ci0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IG9yIGZpZWxkOyAiX0tFWSIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIGtleUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUga2V5IGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgZGlyZWN0IG1hcCBrZXkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCBrZXlDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IAotICAgICAgICAgICAqIGNvbGxlY3Rpb24gZGF0YS4gRGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IG9yIGZpZWxkIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29sdW1uIHZhbHVlQ29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB2YWx1ZSBjb252ZXJ0ZXIuIERlZmF1bHQgaXMgZXF1aXZhbGVudCB0byAKLSAgICAgICAgICAgKiBzcGVjaWZ5aW5nIEBDb252ZXJ0KCJub25lIiksIG1lYW5pbmcgbm8gY29udmVydGVyIHdpbGwgYmUgYWRkZWQgdG8gCi0gICAgICAgICAgICogdGhlIHZhbHVlIGNvbHVtbiBtYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnQgdmFsdWVDb252ZXJ0ZXIoKSBkZWZhdWx0IEBDb252ZXJ0OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMiI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4gICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmVjbGlwc2VsaW5rLWNvbGxlY3Rpb24tdGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0gsIERFVEFDSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRldGFjaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVyc2lvbi12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVyc2lvblZhbHVlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGRhdGFiYXNlIHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkYXRhVmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgb2JqZWN0IHZhbHVlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBvYmplY3RWYWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCBpbXBsZW1lbnQKLSAgICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIgaW50ZXJmYWNlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGNvbnZlcnRlckNsYXNzKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENvcHlQb2xpY3kgaXMgdXNlZCB0byBzZXQgYSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IG9uIGFuIEVudGl0eS4KLSAgICAgICAgICogSXQgaXMgcmVxdWlyZWQgdGhhdCBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICogYXMgdGhlIGFyZ3VtZW50LgotICAgICAgICAgKiAKLSAgICAgICAgICogQSBDb3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIG9yIAotICAgICAgICAgKiBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRm9yIGluc3RhbmNlOgotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDb3B5UG9saWN5KCJleGFtcGxlLk15Q29weVBvbGljeSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb3B5UG9saWN5IHsKLQotICAgICAgICAvKgotICAgICAgICAqIChSZXF1aXJlZCkKLSAgICAgICAgKiBUaGlzIGRlZmluZXMgdGhlIGNsYXNzIG9mIHRoZSBjb3B5IHBvbGljeS4gSXQgbXVzdCBzcGVjaWZ5IGEgY2xhc3MgCi0gICAgICAgICogdGhhdCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNvcHlpbmcuQ29weVBvbGljeQotICAgICAgICAqLwotICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiRFRZUEUiOwotICAgICAgICAgIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKCkgZGVmYXVsdCBTVFJJTkc7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDMxOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBEaXNjcmltaW5hdG9yQ2xhc3MgaXMgdXNlZCB3aXRoaW4gYSBWYXJpYWJsZU9uZVRvT25lIGFubm90YXRpb24uCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNsYXNzIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkaXNjcmltaW5hdG9yIHRvIGJlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIAotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBkaXNjcmltaW5hdG9yKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjbGFzcyB0byB0aGUgaW5zdGFudGlhdGVkIHdpdGggdGhlIGdpdmVuIAotICAgICAgICAgICAqIGRpc2NyaW1pbmF0b3IuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgeyBTVFJJTkcsIENIQVIsIElOVEVHRVIgfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNUUklORyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hBUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5URUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yVmFsdWUgewotICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTpjb2xsZWN0aW9uLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkYWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgZW1iZWRkYWJsZSBvYmplY3RzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBpcyB0aGUgY2FzZSB0aGVuIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIHdpbGwgCi0gICAgICAgIGJlIHJlY3Vyc2l2ZWx5IGFwcGxpZWQuCi0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkYWJsZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3VzdG9taXplciIgdHlwZT0ib3JtOmN1c3RvbWl6ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5nZS10cmFja2luZyIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1hdHRyaWJ1dGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEF0dHJpYnV0ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEdyb3VwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBncm91cCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGZldGNoIGdyb3VwIHNob3VsZCBiZSBsb2FkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBsb2FkKCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBmZXRjaC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9ybTpmZXRjaC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9hZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2stbW9kZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gTG9ja01vZGVUeXBlIHsgUkVBRCwgV1JJVEUsIE9QVElNSVNUSUMsIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBQRVNTSU1JU1RJQ19SRUFELCBQRVNTSU1JU1RJQ19XUklURSwgUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULCBOT05FfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotCi0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9Im9ybTpmZXRjaC1ncm91cCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiIHR5cGU9Im9ybTpxdWVyeS1yZWRpcmVjdG9ycyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FjaGVhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGlzdGVuY2UtY2hlY2tpbmciIHR5cGU9Im9ybTpleGlzdGVuY2UtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkTmF0aXZlUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsgLy9uYW1lZCBTcWxSZXN1bHRTZXRNYXBwaW5nCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgTG9ja01vZGVUeXBlIGxvY2tNb2RlKCkgZGVmYXVsdCBOT05FOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIAotICAgICAgICAgKiBxdWVyaWVzIHRoYXQgY2FsbCBzdG9yZWQgcHJvY2VkdXJlcyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCByZXR1cm4gYSByZXN1bHQgc2V0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gcmV0dXJuc1Jlc3VsdFNldCgpIGRlZmF1bHQgdHJ1ZTsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgYXJndW1lbnRzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlcltdIHBhcmFtZXRlcnMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06c3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVzdWx0LXNldC1tYXBwaW5nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm5zLXJlc3VsdC1zZXQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb2x1bW4iIHR5cGU9Im9ybTptYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTptYXAta2V5LWpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgIDwveHNkOmNob2ljZT4KLSAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcGVkLWJ5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ycmVjdGlvbi10eXBlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi1jb3JyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvcnJlY3Rpb25UeXBlIHsKLSAgICAgICAgICBSRUFELAotICAgICAgICAgIFJFQURfV1JJVEUsCi0gICAgICAgICAgRVhDRVBUSU9OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQURfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5UmVkaXJlY3RvcnMgewotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1vcmUgcHJlY2lzZSByZWRpcmVjdG9yIChsaWtlIHRoZSAKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgUmVkaXJlY3Rvcikgb3IgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogCi0gICAgICovCi0gICAgQ2xhc3MgYWxsUXVlcmllcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZEFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFJlc3VsdExpc3QoKSBBUEkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRPYmplY3QoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlcG9ydFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZXBvcnRRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aGF0IGNvbnRhaW5zIGFncmVnYXRlIGZ1bmN0aW9ucyBvciBzZWxlY3RzIG11bHRpcGxlIGVudGl0aWVzIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZXBvcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogVXBkYXRlT2JqZWN0UXVlcnkgb3IgVXBkYXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIFVwZGF0ZU9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGZsdXNoaW5nIGNoYW5nZXMgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovIAotICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgSW5zZXJ0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gSW5zZXJ0T2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbiBwZXJzaXN0aW5nIGFuIG9iamVjdCB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBpbnNlcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IERlbGV0ZSBPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIERlbGV0ZU9iamVjdFF1ZXJ5IG9yIERlbGV0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLX0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGwtcXVlcmllcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtYWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vYmplY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWxldGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuLWluc2VydCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJldHVybkluc2VydCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgUmV0dXJuSW5zZXJ0IGFubm90YXRpb24gYWxsb3dzIGZvciBJTlNFUlQgb3BlcmF0aW9ucyB0byByZXR1cm4gCi0gICAgICAgICAgICAgKiB2YWx1ZXMgYmFjayBpbnRvIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbi4gVGhpcyBhbGxvd3MgZm9yIHRhYmxlIAotICAgICAgICAgICAgICogZGVmYXVsdCB2YWx1ZXMsIHRyaWdnZXIgb3Igc3RvcmVkIHByb2NlZHVyZXMgY29tcHV0ZWQgdmFsdWVzIHRvIAotICAgICAgICAgICAgICogYmUgc2V0IGJhY2sgaW50byB0aGUgb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHJldHVybk9ubHkoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBzZXF1ZW5jZU5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAxOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAqIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlyZWN0aW9uIGRpcmVjdGlvbigpIGRlZmF1bHQgSU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgcXVlcnkgcGFyYW1ldGVyIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW1ldGVyKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0gICAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0gICAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAotICAgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RydWN0Q29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IAotICAgICAgICAgICAqIGltcGxlbWVudCB0aGUgRWNsaXBzZUxpbmsgaW50ZXJmYWNlIAotICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLmNvbnZlcnRlcnMuQ29udmVydGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNvbnZlcnRlcigpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0gICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLSAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0gICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLSAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zaWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zaWVudCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKiogCi0gICAgICAgICAqIFZhcmlhYmxlIG9uZSB0byBvbmUgbWFwcGluZ3MgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9pbnRlciAKLSAgICAgICAgICogcmVmZXJlbmNlcyBiZXR3ZWVuIGEgamF2YSBvYmplY3QgYW5kIGFuIGltcGxlbWVudGVyIG9mIGFuIGludGVyZmFjZS4gCi0gICAgICAgICAqIFRoaXMgbWFwcGluZyBpcyB1c3VhbGx5IHJlcHJlc2VudGVkIGJ5IGEgc2luZ2xlIHBvaW50ZXIgKHN0b3JlZCBpbiBhbiAKLSAgICAgICAgICogaW5zdGFuY2UgdmFyaWFibGUpIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9iamVjdHMuIEluIHRoZSAKLSAgICAgICAgICogcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZXMsIHRoZXNlIG1hcHBpbmdzIGFyZSBub3JtYWxseSBpbXBsZW1lbnRlZCAKLSAgICAgICAgICogdXNpbmcgYSBmb3JlaWduIGtleSBhbmQgYSB0eXBlIGNvZGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIFZhcmlhYmxlT25lVG9PbmUgY2FuIGJlIHNwZWNpZmllZCB3aXRoaW4gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbmQgRW1iZWRkYWJsZSBjbGFzcy4gCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIAotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhcmlhYmxlT25lVG9PbmUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIAotICAgICAgICAgICAqIGFzc29jaWF0aW9uLiBJZiBub3Qgc3BlY2lmaWVkIGl0IHdpbGwgYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSAKLSAgICAgICAgICAgKiBvZiB0aGUgb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgdGFyZ2V0SW50ZXJmYWNlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgY2FzY2FkZWQgdG8gdGhlIHRhcmdldCBvZiAKLSAgICAgICAgICAgKiB0aGUgYXNzb2NpYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAqIGhpbnQgdG8gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIAotICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFdoZXRoZXIgdGhlIGFzc29jaWF0aW9uIGlzIG9wdGlvbmFsLiBJZiBzZXQgdG8gZmFsc2UgCi0gICAgICAgICAgICogdGhlbiBhIG5vbi1udWxsIHJlbGF0aW9uc2hpcCBtdXN0IGFsd2F5cyBleGlzdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlzY3JpbWluYXRvciBjb2x1bW4gd2lsbCBob2xkIHRoZSB0eXBlIAotICAgICAgICAgICAqIGluZGljYXRvcnMuIElmIHRoZSBEaXNjcmltaW5hdG9yQ29sdW1uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuYW1lIAotICAgICAgICAgICAqIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiBkZWZhdWx0cyB0byAiRFRZUEUiIGFuZCB0aGUgCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvciB0eXBlIHRvIFNUUklORy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0IEBEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbGlzdCBvZiBkaXNjcmltaW5hdG9yIHR5cGVzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCAKLSAgICAgICAgICAgKiB0aGlzIFZhcmlhYmxlT25lVG9PbmUuIElmIG5vbmUgYXJlIHNwZWNpZmllZCB0aGVuIHRob3NlIGVudGl0aWVzIAotICAgICAgICAgICAqIHdpdGhpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0aGF0IGltcGxlbWVudCB0aGUgdGFyZ2V0IGludGVyZmFjZSAKLSAgICAgICAgICAgKiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHR5cGVzLiBUaGUgZGlzY3JpbWluYXRvciB0eXBlIHdpbGwgCi0gICAgICAgICAgICogZGVmYXVsdCBhcyBmb2xsb3dzOgotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBTVFJJTkc6IEVudGl0eS5uYW1lKCkKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgQ0hBUjogRmlyc3QgbGV0dGVyIG9mIHRoZSAKLSAgICAgICAgICAgKiAgICBFbnRpdHkgY2xhc3MKLSAgICAgICAgICAgKiAgLSBJZiBEaXNjcmltaW5hdG9yQ29sdW1uIHR5cGUgaXMgSU5URUdFUjogVGhlIG5leHQgaW50ZWdlciBhZnRlciAKLSAgICAgICAgICAgKiAgICB0aGUgaGlnaGVzdCBpbnRlZ2VyIGV4cGxpY2l0bHkgYWRkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRGlzY3JpbWluYXRvckNsYXNzW10gZGlzY3JpbWluYXRvckNsYXNzZXMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY2xhc3MiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNsYXNzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWludGVyZmFjZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3JwaGFuLXJlbW92YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZlcnNpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBWZXJzaW9uIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVtcG9yYWwiIHR5cGU9Im9ybTp0ZW1wb3JhbCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFubm90YXRpb24gZm9yIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLlRyYW5zZm9ybWF0aW9uTWFwcGluZy4KLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKiAgCi0gICAgICAgICAqIEEgc2luZ2xlIFdyaXRlVHJhbnNmb3JtZXIgbWF5IGJlIHNwZWNpZmllZCBkaXJlY3RseSBvbiB0aGUgbWV0aG9kIG9yIAotICAgICAgICAgKiBhdHRyaWJ1dGUuIE11bHRpcGxlIFdyaXRlVHJhbnNmb3JtZXJzIHNob3VsZCBiZSB3cmFwcGVkIGludG8gCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24uIE5vIFdyaXRlVHJhbnNmb3JtZXJzIHNwZWNpZmllZCBmb3IgCi0gICAgICAgICAqIHJlYWQtb25seSBtYXBwaW5nLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCAKLSAgICAgICAgICogc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgCi0gICAgICAgICAqIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFdyaXRlVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuRmllbGRUcmFuc2Zvcm1lciAKLSAgICAgICAgICAgICAqIGludGVyZmFjZS4gVGhlIGNsYXNzIHdpbGwgYmUgaW5zdGFudGlhdGVkLCBpdHMgYnVpbGRGaWVsZFZhbHVlIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSAKLSAgICAgICAgICAgICAqIGNvbHVtbi4gTm90ZSB0aGF0IGZvciBkZGwgZ2VuZXJhdGlvbiBhbmQgcmV0dXJuaW5nIHRvIGJlIAotICAgICAgICAgICAgICogc3VwcG9ydGVkIHRoZSBtZXRob2QgYnVpbGRGaWVsZFZhbHVlIGluIHRoZSBjbGFzcyBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIHRvIHJldHVybiB0aGUgcmVsZXZhbnQgSmF2YSB0eXBlLCBub3QganVzdCBPYmplY3QgYXMgCi0gICAgICAgICAgICAgKiBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGJ1aWxkRmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UsIFN0cmluZyBmaWVsZE5hbWUsIFNlc3Npb24gc2Vzc2lvbikuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbnRvIHRoZSBkYXRhYmFzZSBjb2x1bW4uCi0gICAgICAgICAgICAgKiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgc3VwcG9ydGVkIHRoZSAKLSAgICAgICAgICAgICAqIG1ldGhvZCBzaG91bGQgYmUgZGVmaW5lZCB0byByZXR1cm4gYSBwYXJ0aWN1bGFyIHR5cGUsIG5vdCBqdXN0IAotICAgICAgICAgICAgICogT2JqZWN0LCBmb3IgaW5zdGFuY2U6Ci0gICAgICAgICAgICAgKiBwdWJsaWMgVGltZSBnZXRTdGFydFRpbWUoKS4KLSAgICAgICAgICAgICAqIFRoZSBtZXRob2QgbWF5IHJlcXVpcmUgYSBUcmFuc2llbnQgYW5ub3RhdGlvbiB0byBhdm9pZCBiZWluZyAKLSAgICAgICAgICAgICAqIG1hcHBlZCBhcyBCYXNpYyBieSBkZWZhdWx0LgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZ5IGhlcmUgdGhlIGNvbHVtbiBpbnRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbi4KLSAgICAgICAgICAgICAqIFRoZSBvbmx5IGNhc2Ugd2hlbiB0aGlzIGNvdWxkIGJlIHNraXBwZWQgaXMgaWYgYSBzaW5nbGUgCi0gICAgICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGFubm90YXRlcyBhbiBhdHRyaWJ1dGUgLSB0aGUgYXR0cmlidXRlJ3MgbmFtZSAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCBhcyBhIGNvbHVtbiBuYW1lLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ29sdW1uIGNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmF0Y2gtZmV0Y2giPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQmF0Y2hGZXRjaCBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIG9uIGFueSByZWxhdGlvbnNoaXAgbWFwcGluZywKLSAgICAgICAgICogKE9uZVRvT25lLCBNYW55VG9PbmUsIE9uZVRvTWFueSwgTWFueVRvTWFueSwgRWxlbWVudENvbGxlY3Rpb24sIEJhc2ljQ29sbGVjdGlvbiwgQmFzaWNNYXApLgotICAgICAgICAgKiBJdCBhbGxvd3MgdGhlIHJlbGF0ZWQgb2JqZWN0cyB0byBiZSBiYXRjaCByZWFkIGluIGEgc2luZ2xlIHF1ZXJ5LgotICAgICAgICAgKiBCYXRjaCBmZXRjaGluZyBjYW4gYWxzbyBiZSBzZXQgYXQgdGhlIHF1ZXJ5IGxldmVsLCBhbmQgaXQgaXMgCi0gICAgICAgICAqIG5vcm1hbGx5IHJlY29tbWVuZGVkIHRvIGRvIHNvIGFzIGFsbCBxdWVyaWVzIG1heSBub3QgcmVxdWlyZSBiYXRjaGluZy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXRjaEZldGNoIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBiYXRjaC1mZXRjaCB0byB1c2UuCi0gICAgICAgICAgICAgKiBFaXRoZXIgSk9JTiwgRVhJU1RTIG9yIElOLgotICAgICAgICAgICAgICogSk9JTiBpcyB0aGUgZGVmYXVsdC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEJhdGNoRmV0Y2hUeXBlIHZhbHVlKCkgZGVmYXVsdCBCYXRjaEZldGNoVHlwZS5KT0lOOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZSB0aGUgZGVmYXVsdCBiYXRjaCBmZXRjaCBzaXplLgotICAgICAgICAgICAgICogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIElOIHR5cGUgYmF0Y2ggcmVhZGluZyBhbmQgZGVmaW5lcwotICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBrZXlzIHVzZWQgaW4gZWFjaCBJTiBjbGF1c2UuCi0gICAgICAgICAgICAgKiBUaGUgZGVmYXVsdCBzaXplIGlzIDI1Niwgb3IgdGhlIHF1ZXJ5J3MgcGFnZVNpemUgZm9yIGN1cnNvciBxdWVyaWVzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgLTE7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpemUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwveHNkOnNjaGVtYT4KLQotCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19vcm1fMl8yLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjMwMjllLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDc3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci08IS0tIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPiAKLTwhLS0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDEyLzIvMjAwOS0yLjEgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2Mjg5OiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG1ldGFkYXRhIHN1cHBvcnQgb24gbWFwcGVkIHN1cGVyY2xhc3NlcyB0byBFY2xpcHNlTGluay1PUk0uWE1MIFNjaGVtYSAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjk2NjEyOiBBZGQgY3VycmVudCBhbm5vdGF0aW9uIG9ubHkgbWV0YWRhdGEgc3VwcG9ydCBvZiByZXR1cm4gaW5zZXJ0L3VwZGF0ZSB0byB0aGUgRWNsaXBzZUxpbmstT1JNLlhNTCBTY2hlbWEgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gZm9ybWF0dGVkIHRvIG1hdGNoIG9ybV8yXzAueHNkIHNvIHRoYXQgdXNlcnMgY2FuIGVhc2lseSBjb21wYXJlIHRoZSB0d28gc2NoZW1hcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDUvNC8yMDEwLTIuMSBHdXkgUGVsbGV0aWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjI3MjE5OiBFeHBhbmQgRWNsaXBzZUxpbmstT1JNLlhNTCBzY2hlbWEgZnVuY3Rpb25hbGl0eSBmb3IgMi4xIHJlbGVhc2UgICh1cGRhdGUgdmVyc2lvbiB0byAyLjEpICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgIDYvMTQvMjAxMC0yLjIgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgIC0gMjQ3MDc4OiBlY2xpcHNlbGluay1vcm0ueG1sIHNjaGVtYSBzaG91bGQgYWxsb3cgbG9iIGFuZCBlbnVtZXJhdGVkIG9uIHZlcnNpb24gYW5kIGlkIG1hcHBpbmdzICh1cGRhdGUgdmVyc2lvbiB0byAyLjIpICAtLT4KLTwhLS0gICAgIDEwLzE1LzIwMTAtMi4yIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gICAgICAgLSAzMjIwMDg6IEltcHJvdmUgdXNhYmlsaXR5IG9mIGFkZGl0aW9uYWwgY3JpdGVyaWEgYXBwbGllZCB0byBxdWVyaWVzIGF0IHRoZSBzZXNzaW9uL0VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotPCEtLSBKYXZhIFBlcnNpc3RlbmNlIEFQSSBvYmplY3QtcmVsYXRpb25hbCBtYXBwaW5nIGZpbGUgc2NoZW1hIC0tPgotPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6b3JtPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtIiAKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiAKLSAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIiAKLSAgdmVyc2lvbj0iMi4yIj4KLQotICA8eHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgQCgjKWVjbGlwc2VsaW5rX29ybV8yXzIueHNkIDIuMiAgSnVuZSAxNCAyMDEwCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8yLnhzZAotICAgICAgIHZlcnNpb249IjIuMiI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InZlcnNpb25UeXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOnBhdHRlcm4gdmFsdWU9IlswLTldKyhcLlswLTldKykqIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhZGRpdGlvbmFsIGNyaXRlcmlhIGNhbiBiZSBzcGVjaWZpZWQgYXQgdGhlIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBsZXZlbC4gV2hlbiBzcGVjaWZpZWQgYXQgdGhlIG1hcHBlZCBzdXBlcmNsYXNzIGxldmVsLCBpdCBhcHBsaWVzIHRvIGFsbCAKLSAgICAgICAgICogaW5oZXJpdGluZyBlbnRpdGllcyB1bmxlc3MgdGhvc2UgZW50aXRpZXMgZGVmaW5lIHRoZWlyIG93biBhZGRpdGlvbmFsIAotICAgICAgICAgKiBjcml0ZXJpYSwgYXQgd2hpY2ggcG9pbnQgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgZnJvbSB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgCi0gICAgICAgICAqIGlzIGlnbm9yZWQuICAKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgc3VwcG9ydHMgYW55IHZhbGlkIEpQUUwgc3RyaW5nIGFuZCBtdXN0IHVzZSAndGhpcycgCi0gICAgICAgICAqIGFzIGFuIGFsaWFzIHRvIGZvcm0geW91ciBhZGRpdGlvbmFsIGNyaXRlcmlhLiBFLkcuLAotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQWRkaXRpb25hbENyaXRlcmlhKCJ0aGlzLm51dC5zaXplID0gOk5VVF9TSVpFIGFuZCB0aGlzLm51dC5jb2xvciA9IDpOVVRfQ09MT1IiKQotICAgICAgICAgKiBwdWJsaWMgY2xhc3MgQm9sdCB7Li4ufQotICAgICAgICAgKiAKLSAgICAgICAgICogQWRkaXRpb25hbCBjcml0ZXJpYSBwYXJhbWV0ZXJzIGFyZSBhbHNvIGFjY2VwdGVkIGFuZCBhcmUgc2V0IHRocm91Z2ggCi0gICAgICAgICAqIHByb3BlcnRpZXMgb24gdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnksIG9yIG9uIGFuIGVudGl0eSBtYW5hZ2VyLiBXaGVuIHNldCAKLSAgICAgICAgICogb24gdGhlIGVudGl0eSBtYW5hZ2VyLCB0aGUgcHJvcGVydGllcyBtdXN0IGJlIHNldCBiZWZvcmUgYW55IHF1ZXJ5IGV4ZWN1dGlvbgotICAgICAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZvciB0aGUgbGlmZSBzcGFuIG9mIHRoYXQgZW50aXR5IG1hbmFnZXIuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQcm9wZXJ0aWVzIHNldCBvbiB0aGUgZW50aXR5IG1hbmFnZXIgd2lsbCBvdmVycmlkZSB0aG9zZSBzaW1pbGFybHkgbmFtZWQgCi0gICAgICAgICAqIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBBZGRpdGlvbmFsIGNyaXRlcmlhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBhbnkgbmF0aXZlIHF1ZXJpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEd1eSBQZWxsZXRpZXIKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQWRkaXRpb25hbENyaXRlcmlhIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgSlBRTCBmcmFnbWVudCB0byB1c2UgYXMgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlLAotICAgICAgICAgICogb3Igb25seSBhIHBlciBFbnRpdHlNYW5hZ2VyIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgc2hhcmVkLgotICAgICAgICAgICogQGRlcHJlY2F0ZWQgIEFzIG9mIEVjbGlwc2VsaW5rIDIuMi4gIFNlZSB0aGUgYXR0cmlidXRlICdpc29sYXRpb24nCi0gICAgICAgICAgKi8gCi0gICAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAKLSAgICAgICAgIC8qKgotICAgICAgICAgICogKE9wdGlvbmFsKSBDb250cm9scyB0aGUgbGV2ZWwgb2YgY2FjaGluZyB0aGlzIEVudGl0eSB3aWxsIHVzZS4KLSAgICAgICAgICAqIFRoZSBkZWZhdWx0IGlzIENhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQgd2hpY2ggaGFzIEVjbGlwc2VMaW5rCi0gICAgICAgICAgKiBDYWNoaW5nIGFsbCBFbnRpdGllcyBpbiB0aGUgU2hhcmVkIENhY2hlLgotICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuQ2FjaGVJc29sYXRpb25UeXBlCi0gICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUlzb2xhdGlvblR5cGUgaXNvbGF0aW9uKCkgZGVmYXVsdCBTSEFSRUQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc29sYXRpb24iIHR5cGU9Im9ybTpjYWNoZS1pc29sYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBUaGUgQ2FjaGVUeXBlIGVudW0gaXMgdXNlZCB3aXRoIHRoZSBDYWNoZSBhbm5vdGF0aW9uIGZvciBhIAotICAgICAgICAgKiBwZXJzaXN0ZW50IGNsYXNzLiBJdCBkZWZpbmVzIHRoZSB0eXBlIG9mIElkZW50aXR5TWFwL0NhY2hlIHVzZWQgZm9yIAotICAgICAgICAgKiB0aGUgY2xhc3MuIEJ5IGRlZmF1bHQgdGhlIFNPRlRfV0VBSyBjYWNoZSB0eXBlIGlzIHVzZWQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuIENhY2hlcyBhbGwgb2JqZWN0cwotICAgICAgICAgICAqIGFuZCBkb2VzIG5vdCByZW1vdmUgdGhlbS4gCi0gICAgICAgICAgICogV0FSTklORzogVGhpcyBtZXRob2QgbWF5IGJlIG1lbW9yeSBpbnRlbnNpdmUgd2hlbiBtYW55IG9iamVjdHMgYXJlIAotICAgICAgICAgICAqIHJlYWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRlVMTCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGFuZCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIEZVTEwgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IHRoZSBtYXAgaG9sZHMgdGhlCi0gICAgICAgICAgICogb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgbWV0aG9kIGFsbG93cyBmdWxsIGdhcmJhZ2UKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIHdoZW4gbWVtb3J5IGlzIGxvdyBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZAotICAgICAgICAgICAqIGd1YXJhbnRlZWQgaWRlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNpbWlsYXIgdG8gdGhlIFdFQUsgaWRlbnRpdHkgbWFwIGV4Y2VwdCB0aGF0IGl0IG1haW50YWlucyBhCi0gICAgICAgICAgICogbW9zdC1mcmVxdWVudGx5LXVzZWQgc3ViLWNhY2hlLiBUaGUgc2l6ZSBvZiB0aGUgc3ViLWNhY2hlIGlzCi0gICAgICAgICAgICogcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBpZGVudGl0eSBtYXAgYXMgc3BlY2lmaWVkIGJ5Ci0gICAgICAgICAgICogZGVzY3JpcHRvcidzIHNldElkZW50aXR5TWFwU2l6ZSgpIG1ldGhvZC4gVGhlIHN1Yi1jYWNoZQotICAgICAgICAgICAqIHVzZXMgc29mdCByZWZlcmVuY2VzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIG9iamVjdHMgYXJlCi0gICAgICAgICAgICogZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU09GVF9XRUFLLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogSWRlbnRpY2FsIHRvIHRoZSBzb2Z0IGNhY2hlIHdlYWsgKFNPRlRfV0VBSykgaWRlbnRpdHkgbWFwIGV4Y2VwdCAKLSAgICAgICAgICAgKiB0aGF0IGl0IHVzZXMgaGFyZCByZWZlcmVuY2VzIGluIHRoZSBzdWItY2FjaGUuIFVzZSB0aGlzIGlkZW50aXR5IAotICAgICAgICAgICAqIG1hcCBpZiBzb2Z0IHJlZmVyZW5jZXMgZG8gbm90IGJlaGF2ZSBwcm9wZXJseSBvbiB5b3VyIHBsYXRmb3JtLgotICAgICAgICAgICAqLwotICAgICAgICAgIEhBUkRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEEgY2FjaGUgaWRlbnRpdHkgbWFwIG1haW50YWlucyBhIGZpeGVkIG51bWJlciBvZiBvYmplY3RzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gT2JqZWN0cyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZQotICAgICAgICAgICAqIG9uIGEgbGVhc3QtcmVjZW50bHktdXNlZCBiYXNpcy4gVGhpcyBtZXRob2QgYWxsb3dzIG9iamVjdAotICAgICAgICAgICAqIGlkZW50aXR5IGZvciB0aGUgbW9zdCBjb21tb25seSB1c2VkIG9iamVjdHMuCi0gICAgICAgICAgICogV0FSTklORzogRnVybmlzaGVzIGNhY2hpbmcgYW5kIGlkZW50aXR5LCBidXQgZG9lcyBub3QgZ3VhcmFudGVlIAotICAgICAgICAgICAqIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENBQ0hFLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV0FSTklORzogRG9lcyBub3QgcHJlc2VydmUgb2JqZWN0IGlkZW50aXR5IGFuZCBkb2VzIG5vdCBjYWNoZSAKLSAgICAgICAgICAgKiBvYmplY3RzLgotICAgICAgICAgICAqLwotICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRlVMTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU09GVF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJIQVJEX1dFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtaXNvbGF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIE9wdGlvbnMgZm9yIGhvdyBFbnRpdHkgaW5zdGFuY2VzIHNob3VsZCBiZSBzaGFyZWQgd2l0aGluIGFuIEVjbGlwc2VMaW5rIFBlcnNpc3RlbmNlIFVuaXQgLyBTZXJ2ZXJTZXNzaW9uCi0gICAgICAgICAqIEBzZWUgQ2xhc3NEZXNjcmlwdG9yI3NldENhY2hlSXNvbGF0aW9uVHlwZShDYWNoZUlzb2xhdGlvblR5cGUpCi0gICAgICAgICAqIEBhdXRob3IgR29yZG9uIFlvcmtlCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlSXNvbGF0aW9uVHlwZSB7Ci0gICAgICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBFbnRpdHkgaW5zdGFuY2VzIHdpbGwgYmUgY2FjaGVkIHdpdGhpbiB0aGUgRW50aXR5TWFuYWdlckZhY3RvcnkvU2VydmVyU2Vzc2lvbiBsZXZlbC4KLSAgICAgICAgICAqIEFueSB1c2VyIHF1ZXJpZXMgZm9yIHNoYXJlZCBjYWNoZSBpbnN0YW5jZXMgKGllIFJlYWQtT25seSBxdWVyeSBoaW50KSB3aWxsIHJldHVybiBhbiBFbnRpdHkKLSAgICAgICAgICAqIGluc3RhbmNlIHRoYXQgbWF5IGJlIHNoYXJlZCBieSBtdWx0aXBsZSBjbGllbnRzLiAKLSAgICAgICAgICAqIAotICAgICAgICAgICogVGhpcyBzZXR0aW5nIGlzIHRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbC4KLSAgICAgICAgICAqLwotICAgICAgICAgU0hBUkVELAotICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBFbnRpdHkgc3RhdGUgaW5mb3JtYXRpb24gd2lsbCBiZSBjYWNoZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBidXQgRW50aXR5Ci0gICAgICAgICAgKiBpbnN0YW5jZXMgd2lsbCBub3QgYmUgc2hhcmVkLiBBbnkgdXNlciBxdWVyaWVzIGZvciBzaGFyZWQgY2FjaGUgaW5zdGFuY2VzCi0gICAgICAgICAgKiAoaWUgUmVhZC1Pbmx5IHF1ZXJ5IGhpbnQpIHdpbGwgcmV0dXJuIGEgbmV3IEVudGl0eSBpbnN0YW5jZSB3aXRoIHRoZSBjYWNoZWQgc3RhdGUuCi0gICAgICAgICAgKiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBpbnN0YW5jZSBpcyA8aT5wcm90ZWN0ZWQ8L2k+IGZyb20gYW55IGNvbmN1cnJlbnQKLSAgICAgICAgICAqIHN0YXRlIGNoYW5nZS4KLSAgICAgICAgICAqLwotICAgICAgICAgUFJPVEVDVEVELAotICAgIAotICAgICAgICAgLyoqCi0gICAgICAgICAgKiBUaGUgRW50aXR5IGFuZCBpdHMgZGF0YSBpcyBub3Qgc3RvcmVkIGluIHRoZSBzaGFyZWQgY2FjaGUgYnV0IGlzCi0gICAgICAgICAgKiA8aT5pc29sYXRlZDwvaT4gdG8gdGhlIFBlcnNpc3RlbmNlIENvbnRleHQvVW5pdE9mV29yayBvcgotICAgICAgICAgICogSXNvbGF0ZWRDbGllbnRTZXNzaW9uLiBUaGlzIHNldHRpbmcgZWZmZWN0aXZlbHkgZGlzYWJsZXMgc2Vjb25kIGxldmVsCi0gICAgICAgICAgKiBjYWNoaW5nIGZvciB0aGlzIGVudGl0eSBhbmQgc2hvdWxkIGJlIHVzZWQgd2hlbiB1c2VycyBkbyBub3Qgd2FudCBjYWNoaW5nIGZvcgotICAgICAgICAgICogYSBwYXJ0aWN1bGFyIEVudGl0eS4KLSAgICAgICAgICAqLwotICAgICAgICAgSVNPTEFURUQ7Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0hBUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQUk9URUNURUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklTT0xBVEVEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPiAgCi0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENhY2hlIGFubm90YXRpb24uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLkNhY2hlIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlQ29vcmRpbmF0aW9uVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIGNoYW5nZWQgb2JqZWN0cyBpbmNsdWRpbmcgZGF0YSBhYm91dCB0aGUgY2hhbmdlcy4KLSAgICAgICAgICAgKiBUaGlzIGRhdGEgaXMgbWVyZ2VkIGludG8gdGhlIHJlY2VpdmluZyBjYWNoZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRU5EX09CSkVDVF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogU2VuZHMgYSBsaXN0IG9mIHRoZSBpZGVudGl0aWVzIG9mIHRoZSBvYmplY3RzIHRoYXQgaGF2ZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgKiBUaGUgcmVjZWl2aW5nIGNhY2hlIGludmFsaWRhdGVzIHRoZSBvYmplY3RzIChyYXRoZXIgdGhhbiBjaGFuZ2luZyAKLSAgICAgICAgICAgKiBhbnkgb2YgdGhlIGRhdGEpCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTYW1lIGFzIFNFTkRfT0JKRUNUX0NIQU5HRVMgZXhjZXB0IGl0IGFsc28gaW5jbHVkZXMgYW55IG5ld2x5Ci0gICAgICAgICAgICogY3JlYXRlZCBvYmplY3RzIGZyb20gdGhlIHRyYW5zYWN0aW9uLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogRG9lcyBubyBjYWNoZSBjb29yZGluYXRpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgTk9ORQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX09CSkVDVF9DSEFOR0VTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmNoYW5nZXRyYWNraW5nLk9iamVjdENoYW5nZVBvbGljeSAKLSAgICAgICAgICogd2hpY2ggY29tcHV0ZXMgY2hhbmdlcyBzZXRzIGZvciBFY2xpcHNlTGluaydzIFVuaXRPZldvcmsgY29tbWl0IAotICAgICAgICAgKiBwcm9jZXNzLiBBbiBPYmplY3RDaGFuZ2VQb2xpY3kgaXMgc3RvcmVkIG9uIGFuIEVudGl0eSdzIGRlc2NyaXB0b3IuCi0gICAgICAgICAqCi0gICAgICAgICAqIEEgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbiBtYXkgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDaGFuZ2VUcmFja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBjaGFuZ2UgdHJhY2tpbmcgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDaGFuZ2VUcmFja2luZ1R5cGUgdmFsdWUoKSBkZWZhdWx0IEFVVE87Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmctdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIHB1YmxpYyBlbnVtIENoYW5nZVRyYWNraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQW4gQVRUUklCVVRFIGNoYW5nZSB0cmFja2luZyB0eXBlIGFsbG93cyBjaGFuZ2UgdHJhY2tpbmcgYXQgdGhlCi0gICAgICAgICAgICogYXR0cmlidXRlIGxldmVsIG9mIGFuIG9iamVjdC4gT2JqZWN0cyB3aXRoIGNoYW5nZWQgYXR0cmlidXRlcyB3aWxsCi0gICAgICAgICAgICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSAKLSAgICAgICAgICAgKiByZXN1bHRzIG9mIHRoZSBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVFRSSUJVVEUsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBPQkpFQ1QgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBhbGxvd3MgYW4gb2JqZWN0IHRvIGNhbGN1bGF0ZSBmb3IgCi0gICAgICAgICAgICogaXRzZWxmIHdoZXRoZXIgaXQgaGFzIGNoYW5nZWQuIENoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIHByb2Nlc3NlZCBpbiAKLSAgICAgICAgICAgKiB0aGUgY29tbWl0IHByb2Nlc3MgdG8gaW5jbHVkZSBhbnkgY2hhbmdlcyBpbiB0aGUgcmVzdWx0cyBvZiB0aGUgCi0gICAgICAgICAgICogY29tbWl0LiBVbmNoYW5nZWQgb2JqZWN0cyB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgT0JKRUNULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogQSBERUZFUlJFRCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGRlZmVycyBhbGwgY2hhbmdlIGRldGVjdGlvbiB0bwotICAgICAgICAgICAqIHRoZSBVbml0T2ZXb3JrJ3MgY2hhbmdlIGRldGVjdGlvbiBwcm9jZXNzLiBFc3NlbnRpYWxseSwgdGhlIAotICAgICAgICAgICAqIGNhbGN1bGF0ZUNoYW5nZXMoKSBtZXRob2Qgd2lsbCBydW4gZm9yIGFsbCBvYmplY3RzIGluIGEgVW5pdE9mV29yay4gCi0gICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBPYmplY3RDaGFuZ2VQb2xpY3kKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBERUZFUlJFRCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdpbGwgbm90IHNldCBhbnkgY2hhbmdlIHRyYWNraW5nIHBvbGljeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBBVVRPCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFUVFJJQlVURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT0JKRUNUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJERUZFUlJFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1c3RvbWl6ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29uZmlnLkRlc2NyaXB0b3JDdXN0b21pemVyIAotICAgICAgICAgKiBpbnRlcmZhY2UgYW5kIGlzIHRvIHJ1biBhZ2FpbnN0IGFuIGVuZXRpdHkncyBjbGFzcyBkZXNjcmlwdG9yIGFmdGVyIGFsbCAKLSAgICAgICAgICogbWV0YWRhdGEgcHJvY2Vzc2luZyBoYXMgYmVlbiBjb21wbGV0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIFRoZSBDdXN0b21pemVyIGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5LCBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBvciBFbWJlZGRhYmxlIGNsYXNzLiBJbiB0aGUgY2FzZSBvZiBpbmhlcml0YW5jZSwgYSBDdXN0b21pemVyIGlzIG5vdCAKLSAgICAgICAgICogaW5oZXJpdGVkIGZyb20gaXRzIHBhcmVudCBjbGFzc2VzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDdXN0b21pemVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyB0aGF0IAotICAgICAgICAgICAqIHNob3VsZCBiZSBhcHBsaWVkIGZvciB0aGUgcmVsYXRlZCBlbnRpdHkgb3IgZW1iZWRkYWJsZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQW4gZW51bSB0aGF0IGlzIHVzZWQgd2l0aGluIHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbi4KLSAgICAgICAgICogSXQgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgCi0gICAgICAgICAqIHBhcmFtZXRlcnMgb2YgYSBuYW1lZCBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gRGlyZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTiwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBwYXJhbWV0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnB1dCBhbmQgb3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOX09VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIE91dHB1dCBjdXJzb3IKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPVVRfQ1VSU09SCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOX09VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VUX0NVUlNPUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LW1hcHBpbmdzIj4KLSAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhlIGVudGl0eS1tYXBwaW5ncyBlbGVtZW50IGlzIHRoZSByb290IGVsZW1lbnQgb2YgYSBtYXBwaW5nCi0gICAgICAgIGZpbGUuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZm91ciB0eXBlcyBvZiBlbGVtZW50czoKLQotICAgICAgICAxLiBUaGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IGNvbnRhaW5zIG1ldGFkYXRhCi0gICAgICAgIGZvciB0aGUgZW50aXJlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCBpZiB0aGlzIGVsZW1lbnQKLSAgICAgICAgb2NjdXJzIGluIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgd2l0aGluIHRoZSBzYW1lIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgIAotICAgICAgICAyLiBUaGUgcGFja2FnZSwgc2NoZW1hLCBjYXRhbG9nIGFuZCBhY2Nlc3MgZWxlbWVudHMgYXBwbHkgdG8gYWxsIG9mCi0gICAgICAgIHRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGRlZmluZWQgaW4KLSAgICAgICAgdGhlIHNhbWUgZmlsZSBpbiB3aGljaCB0aGV5IG9jY3VyLgotCi0gICAgICAgIDMuIFRoZSBzZXF1ZW5jZS1nZW5lcmF0b3IsIHRhYmxlLWdlbmVyYXRvciwgbmFtZWQtcXVlcnksCi0gICAgICAgIG5hbWVkLW5hdGl2ZS1xdWVyeSBhbmQgc3FsLXJlc3VsdC1zZXQtbWFwcGluZyBlbGVtZW50cyBhcmUgZ2xvYmFsCi0gICAgICAgIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJdCBpcyB1bmRlZmluZWQgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0gICAgICAgIHNlcXVlbmNlLWdlbmVyYXRvciBvciB0YWJsZS1nZW5lcmF0b3Igb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZQotICAgICAgICBvciBkaWZmZXJlbnQgbWFwcGluZyBmaWxlcyBpbiBhIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIGFsc28gCi0gICAgICAgIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUgbmFtZWQtcXVlcnksIG5hbWVkLW5hdGl2ZS1xdWVyeSwgb3IKLSAgICAgICAgcmVzdWx0LXNldC1tYXBwaW5nIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgb3IgZGlmZmVyZW50IG1hcHBpbmcgCi0gICAgICAgIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4KLQotICAgICAgICA0LiBUaGUgZW50aXR5LCBtYXBwZWQtc3VwZXJjbGFzcyBhbmQgZW1iZWRkYWJsZSBlbGVtZW50cyBlYWNoIGRlZmluZQotICAgICAgICB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBtYW5hZ2VkIHBlcnNpc3RlbnQgY2xhc3MuIFRoZSBtYXBwaW5nCi0gICAgICAgIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGVzZSBlbGVtZW50cyBtYXkgYmUgY29tcGxldGUgb3IgaXQgbWF5Ci0gICAgICAgIGJlIHBhcnRpYWwuCi0KLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhY2thZ2UiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpwYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5uZWQtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGlubmVkLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cmFuZ2UtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imhhc2gtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06aGFzaC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnVuaW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgICAgICAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvblR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZml4ZWQ9IjIuMiIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICA8L3hzZDplbGVtZW50PgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBFeGlzdGVuY2VDaGVja2luZyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiAKLSAgICAgICAgICogY2hlY2tpbmcgRWNsaXBzZUxpbmsgc2hvdWxkIHVzZSB3aGVuIHVwZGF0aW5nIGVudGl0aWVzLgotICAgICAgICAgKiAKLSAgICAgICAgICogQW4gZXhpc3RlbmNlLWNoZWNraW5nIHNwZWNpZmljYXRpb24gaXMgc3VwcG9ydGVkIG9uIGFuIEVudGl0eSBvciAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBhbm5vdGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRXhpc3RlbmNlQ2hlY2tpbmcgewotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTZXQgdGhlIGV4aXN0ZW5jZSBjaGVjayBmb3IgZGV0ZXJtaW5pbmcKLSAgICAgICAgICAgKiBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIEV4aXN0ZW5jZVR5cGUgdmFsdWUoKSBkZWZhdWx0IENIRUNLX0NBQ0hFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3RzIHByaW1hcnkga2V5IGRvZXMgbm90IGluY2x1ZGUgbnVsbCBhbmQgCi0gICAgICAgICAqIGl0IGlzIGluIHRoZSBjYWNoZSwgdGhlbiBpdCBtdXN0IGV4aXN0LgotICAgICAgICAgKi8KLSAgICAgICAgQ0hFQ0tfQ0FDSEUsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm0gZG9lcyBleGlzdCBjaGVjayBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19EQVRBQkFTRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIHRoZW4gCi0gICAgICAgICAqIGl0IG11c3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgCi0gICAgICAgICAqIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9FWElTVEVOQ0UsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFzc3VtZSB0aGF0IHRoZSBvYmplY3QgZG9lcyBub3QgZXhpc3QuIFRoaXMgbWF5IGJlIHVzZWQgaWYgdGhlIAotICAgICAgICAgKiBhcHBsaWNhdGlvbiBndWFyYW50ZWVzIG9yIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBjaGVjay4gIAotICAgICAgICAgKiBUaGlzIHdpbGwgYWx3YXlzIGZvcmNlIGFuIGluc2VydCB0byBiZSBjYWxsZWQuCi0gICAgICAgICAqLwotICAgICAgICBBU1NVTUVfTk9OX0VYSVNURU5DRQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+ICAgIAotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0NBQ0hFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEVDS19EQVRBQkFTRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX0VYSVNURU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVNTVU1FX05PTl9FWElTVEVOQ0UiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIE1ldGFkYXRhIHRoYXQgYXBwbGllcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgbm90IGp1c3QgdG8gCi0gICAgICAgIHRoZSBtYXBwaW5nIGZpbGUgaW4gd2hpY2ggaXQgaXMgY29udGFpbmVkLiAKLQotICAgICAgICBJZiB0aGUgeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgZWxlbWVudCBpcyBzcGVjaWZpZWQsCi0gICAgICAgIHRoZSBjb21wbGV0ZSBzZXQgb2YgbWFwcGluZyBtZXRhZGF0YSBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQgCi0gICAgICAgIGlzIGNvbnRhaW5lZCBpbiB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGVzZSBkZWZhdWx0cyBhcmUgYXBwbGllZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhcyBhIHdob2xlIAotICAgICAgICB1bmxlc3MgdGhleSBhcmUgb3ZlcnJpZGRlbiBieSBsb2NhbCBhbm5vdGF0aW9uIG9yIFhNTCAKLSAgICAgICAgZWxlbWVudCBzZXR0aW5ncy4gCi0gICAgICAgIAotICAgICAgICBzY2hlbWEgLSBVc2VkIGFzIHRoZSBzY2hlbWEgZm9yIGFsbCB0YWJsZXMsIHNlY29uZGFyeSB0YWJsZXMsIGpvaW4KLSAgICAgICAgICAgIHRhYmxlcywgY29sbGVjdGlvbiB0YWJsZXMsIHNlcXVlbmNlIGdlbmVyYXRvcnMsIGFuZCB0YWJsZSAKLSAgICAgICAgICAgIGdlbmVyYXRvcnMgdGhhdCBhcHBseSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBjYXRhbG9nIC0gVXNlZCBhcyB0aGUgY2F0YWxvZyBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgotICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAotICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGRlbGltaXRlZC1pZGVudGlmaWVycyAtIFVzZWQgdG8gdHJlYXQgZGF0YWJhc2UgaWRlbnRpZmllcnMgYXMKLSAgICAgICAgICAgIGRlbGltaXRlZCBpZGVudGlmaWVycy4KLSAgICAgICAgYWNjZXNzIC0gVXNlZCBhcyB0aGUgYWNjZXNzIHR5cGUgZm9yIGFsbCBtYW5hZ2VkIGNsYXNzZXMgaW4KLSAgICAgICAgICAgIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhc2NhZGUtcGVyc2lzdCAtIEFkZHMgY2FzY2FkZS1wZXJzaXN0IHRvIHRoZSBzZXQgb2YgY2FzY2FkZSBvcHRpb25zCi0gICAgICAgICAgICBpbiBhbGwgZW50aXR5IHJlbGF0aW9uc2hpcHMgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZW50aXR5LWxpc3RlbmVycyAtIExpc3Qgb2YgZGVmYXVsdCBlbnRpdHkgbGlzdGVuZXJzIHRvIGJlIGludm9rZWQgCi0gICAgICAgICAgICBvbiBlYWNoIGVudGl0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxpbWl0ZWQtaWRlbnRpZmllcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSIgdHlwZT0ib3JtOmFkZGl0aW9uYWwtY3JpdGVyaWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluZGV4IiB0eXBlPSJvcm06aW5kZXgiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0ib3JtOmluaGVyaXRhbmNlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItdmFsdWUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1leHRyYWN0b3IiIHR5cGU9Im9ybTpjbGFzcy1leHRyYWN0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9wdGltaXN0aWMtbG9ja2luZyIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUiIHR5cGU9Im9ybTpjYWNoZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtaW50ZXJjZXB0b3IiIHR5cGU9Im9ybTpjYWNoZS1pbnRlcmNlcHRvciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0ib3JtOmZldGNoLWdyb3VwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiB0eXBlPSJvcm06aW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNsb25lLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLW5hdGl2ZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLW5hdGl2ZS1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiIHR5cGU9Im9ybTpxdWVyeS1yZWRpcmVjdG9ycyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLXN1cGVyY2xhc3MtbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXJzIiB0eXBlPSJvcm06ZW50aXR5LWxpc3RlbmVycyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZXMiIHR5cGU9Im9ybTphdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNraW5nIiB0eXBlPSJvcm06ZXhpc3RlbmNlLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJwYXJ0aXRpb25pbmctZ3JvdXAiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGlubmVkLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnBpbm5lZC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJhbmdlLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJhbmdlLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06dmFsdWUtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOmhhc2gtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp1bmlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcnRpdGlvbmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0gICAgICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImFjY2Vzcy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgVGhpcyBlbGVtZW50IGRldGVybWluZXMgaG93IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBhY2Nlc3NlcyB0aGUKLSAgICAgICAgc3RhdGUgb2YgYW4gZW50aXR5IG9yIGVtYmVkZGVkIG9iamVjdC4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVklSVFVBTCIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdHt9OwotICAgICAgICAgIEpvaW5UYWJsZSBqb2luVGFibGUoKSBkZWZhdWx0IEBKb2luVGFibGU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZXMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgY29udGFpbnMgdGhlIGVudGl0eSBmaWVsZCBvciBwcm9wZXJ0eSBtYXBwaW5ncy4KLSAgICAgICAgSXQgbWF5IGJlIHNwYXJzZWx5IHBvcHVsYXRlZCB0byBpbmNsdWRlIG9ubHkgYSBzdWJzZXQgb2YgdGhlCi0gICAgICAgIGZpZWxkcyBvciBwcm9wZXJ0aWVzLiBJZiBtZXRhZGF0YS1jb21wbGV0ZSBmb3IgdGhlIGVudGl0eSBpcyB0cnVlCi0gICAgICAgIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGRlZmF1bHRlZCBhY2NvcmRpbmcKLSAgICAgICAgdG8gdGhlIGRlZmF1bHQgcnVsZXMuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaWQiIHR5cGU9Im9ybTppZCIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbWJlZGRlZC1pZCIgdHlwZT0ib3JtOmVtYmVkZGVkLWlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljIiB0eXBlPSJvcm06YmFzaWMiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2ljLWNvbGxlY3Rpb24iIHR5cGU9Im9ybTpiYXNpYy1jb2xsZWN0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtbWFwIiB0eXBlPSJvcm06YmFzaWMtbWFwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbiIgdHlwZT0ib3JtOnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tb25lIiB0eXBlPSJvcm06bWFueS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1tYW55IiB0eXBlPSJvcm06b25lLXRvLW1hbnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9uZS10by1vbmUiIHR5cGU9Im9ybTpvbmUtdG8tb25lIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIiB0eXBlPSJvcm06dmFyaWFibGUtb25lLXRvLW9uZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hbnktdG8tbWFueSIgdHlwZT0ib3JtOm1hbnktdG8tbWFueSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVsZW1lbnQtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmVsZW1lbnQtY29sbGVjdGlvbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkIiB0eXBlPSJvcm06ZW1iZWRkZWQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWF0aW9uIiB0eXBlPSJvcm06dHJhbnNmb3JtYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2llbnQiIHR5cGU9Im9ybTp0cmFuc2llbnQiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4taW5zZXJ0IiB0eXBlPSJvcm06cmV0dXJuLWluc2VydCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuLXVwZGF0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhc2ljQ29sbGVjdGlvbiB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgdGhhdCAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgaGludCB0byAKLSAgICAgICAgICAgKiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gCi0gICAgICAgICAgICogTEFaWS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIHZhbHVlIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FzY2FkZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gQ2FzY2FkZVR5cGUgeyBBTEwsIFBFUlNJU1QsIE1FUkdFLCBSRU1PVkUsIFJFRlJFU0gsIERFVEFDSH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtYWxsIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW1lcmdlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVtb3ZlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWRldGFjaCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5DbG9uZUNvcHlQb2xpY3kgb24gYW4gCi0gICAgICAgICAqIEVudGl0eS4gQSBDbG9uZUNvcHlQb2xpY3kgbXVzdCBzcGVjaWZ5IGF0IG9uZSBvciBib3RoIG9mIHRoZSAibWV0aG9kIiAKLSAgICAgICAgICogb3IgIndvcmtpbmdDb3B5TWV0aG9kIi4gIndvcmtpbmdDb3B5TWV0aG9kIiBpcyB1c2VkIHRvIGNsb25lIG9iamVjdHMgCi0gICAgICAgICAqIHRoYXQgd2lsbCBiZSByZXR1cm5lZCB0byB0aGUgdXNlciBhcyB0aGV5IGFyZSByZWdpc3RlcmVkIGluIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIHRyYW5zYWN0aW9uYWwgbWVjaGFuaXNtLCB0aGUgVW5pdE9mV29yay4gIm1ldGhvZCIgd2lsbCAKLSAgICAgICAgICogYmUgdXNlZCBmb3IgdGhlIGNsb25lIHRoYXQgaXMgdXNlZCBmb3IgY29tcGFyaXNvbiBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAqICAKLSAgICAgICAgICogQSBDbG9uZUNvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MKLSAgICAgICAgICogb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiKQotICAgICAgICAgKiAKLSAgICAgICAgICogb3I6Ci0gICAgICAgICAqIAotICAgICAgICAgKiBARW50aXR5Ci0gICAgICAgICAqIEBDbG9uZUNvcHlQb2xpY3kobWV0aG9kPSJteUNsb25lTWV0aG9kIiwgd29ya2luZ0NvcHlNZXRob2Q9Im15V29ya2luZ0NvcHlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeSh3b3JraW5nQ29weU1ldGhvZE5hbWU9Im15V29ya2luZ0NvcHlDbG9uZSIpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDbG9uZUNvcHlQb2xpY3kgewotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkKLSAgICAgICAgICAgICAqIEVpdGhlciBtZXRob2Qgb3Igd29ya2luZ0NvcHlNZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQgdGhpcyBkZWZpbmVzIAotICAgICAgICAgICAgICogYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCB3aWxsIGJlIHVzZWQgCi0gICAgICAgICAgICAgKiBmb3IgY29tcGFyaXNvbiBieQotICAgICAgICAgICAgICogRWNsaXBzZUxpbmsncyBEZWZlcnJlZENoYW5nZURldGVjdGlvblBvbGljeQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCk7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZAotICAgICAgICAgICAgICogdGhpcyBkZWZpbmVzIGEgbWV0aG9kIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhIGNsb25lIHRoYXQgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBvYmplY3QgcmV0dXJuZWQgd2hlbiByZWdpc3RlcmluZyBhbiAKLSAgICAgICAgICAgICAqIE9iamVjdCBpbiBhbiBFY2xpcHNlTGluayBVbml0T2ZXb3JrCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB3b3JraW5nQ29weU1ldGhvZCgpOwotCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ3b3JraW5nLWNvcHktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2xsZWN0aW9uVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0YWJsZS4gSWYgaXQgaXMgbm90IAotICAgICAgICAgICAqIHNwZWNpZmllZCwgaXQgaXMgZGVmYXVsdGVkIHRvIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmc6IAotICAgICAgICAgICAqIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZW50aXR5OyAiXyIgOyB0aGUgbmFtZSBvZiB0aGUgcmVsYXRpb25zaGlwIAotICAgICAgICAgICAqIHByb3BlcnR5IG9yIGZpZWxkIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBjYXRhbG9nIG9mIHRoZSB0YWJsZS4gSXQgZGVmYXVsdHMgdG8gdGhlIHBlcnNpc3RlbmNlIAotICAgICAgICAgICAqIHVuaXQgZGVmYXVsdCBjYXRhbG9nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBzY2hlbWEgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IHNjaGVtYS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSBhIHByaW1hcnkga2V5IGNvbHVtbiB0aGF0IGlzIHVzZWQgYXMgYSAKLSAgICAgICAgICAgKiBmb3JlaWduIGtleSB0byBqb2luIHRvIGFub3RoZXIgdGFibGUuIElmIHRoZSBzb3VyY2UgZW50aXR5IHVzZXMgYSAKLSAgICAgICAgICAgKiBjb21wb3NpdGUgcHJpbWFyeSBrZXksIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gbXVzdCBiZSBzcGVjaWZpZWQgCi0gICAgICAgICAgICogZm9yIGVhY2ggZmllbGQgb2YgdGhlIGNvbXBvc2l0ZSBwcmltYXJ5IGtleS4gSW4gYSBzaW5nbGUgcHJpbWFyeSAKLSAgICAgICAgICAgKiBrZXkgY2FzZSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtYXkgb3B0aW9uYWxseSBiZSBzcGVjaWZpZWQuIAotICAgICAgICAgICAqIERlZmF1bHRpbmcgd2lsbCBhcHBseSBvdGhlcndpc2UgYXMgZm9sbG93czoKLSAgICAgICAgICAgKiBuYW1lLCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHByaW1hcnkgdGFibGUgCi0gICAgICAgICAgICogb2YgdGhlIHNvdXJjZSBlbnRpdHkuIHJlZmVyZW5jZWRDb2x1bW5OYW1lLCB0aGUgc2FtZSBuYW1lIG9mIAotICAgICAgICAgICAqIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSBvZiB0aGUgc291cmNlIGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBQcmltYXJ5S2V5Sm9pbkNvbHVtbltdIHByaW1hcnlLZXlKb2luQ29sdW1ucygpIGRlZmF1bHQge307IAotIAotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVW5pcXVlIGNvbnN0cmFpbnRzIHRoYXQgYXJlIHRvIGJlIHBsYWNlZCBvbiB0aGUgdGFibGUuIAotICAgICAgICAgICAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaWYgdGFibGUgZ2VuZXJhdGlvbiBpcyBpbiBlZmZlY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsgCi0gICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogQSBQYXJ0aXRpb25pbmcgaXMgdXNlZCB0byBwYXJ0aXRpb24gdGhlIGRhdGEgZm9yIGEgY2xhc3MgYWNyb3NzIG11bHRpcGxlIGRpZmZlcmVuY2UgZGF0YWJhc2VzCi0gICAgICAgICAgICAgKiBvciBhY3Jvc3MgYSBkYXRhYmFzZSBjbHVzdGVyIHN1Y2ggYXMgT3JhY2xlIFJBQy4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gcHJvdmlkZSBpbXByb3ZlZCBzY2FsYWJpbGl0eSBieSBhbGxvd2luZyBtdWx0aXBsZSBkYXRhYmFzZSBtYWNoaW5lcyB0byBzZXJ2aWNlIHJlcXVlc3RzLgotICAgICAgICAgICAgICogVGhpcyBhbm5vdGF0aW9uIGNvbmZpZ3VyZXMgYSBjdXN0b20gUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBJZiBtdWx0aXBsZSBwYXJ0aXRpb25zIGFyZSB1c2VkIHRvIHByb2Nlc3MgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIEpUQSBzaG91bGQgYmUgdXNlZCBmb3IgcHJvcGVyIFhBIHRyYW5zYWN0aW9uIHN1cHBvcnQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbiBwb2xpY2llcyBhcmUgZ2xvYmFsbHkgbmFtZWQgdG8gYWxsb3cgcmV1c2UsCi0gICAgICAgICAgICAgKiB0aGUgcGFydGl0aW9uaW5nIHBvbGljeSBtdXN0IGFsc28gYmUgc2V0IHVzaW5nIHRoZSBAUGFydGl0aW9uZWQgYW5ub3RhdGlvbiB0byBiZSB1c2VkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAc2VlIFBhcnRpdGlvbmVkCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5QYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIEZ1bGwgcGFja2FnZS5jbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENsYXNzIHBhcnRpdGlvbmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBIYXNoUGFydGl0aW9uaW5nIHBhcnRpdGlvbnMgYWNjZXNzIHRvIGEgZGF0YWJhc2UgY2x1c3RlciBieSB0aGUgaGFzaCBvZiBhIGZpZWxkIHZhbHVlIGZyb20gdGhlIG9iamVjdCwKLSAgICAgICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAgICAgKiBUaGUgaGFzaCBpbmRleGVzIGludG8gdGhlIGxpc3Qgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCBoYXNoIHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgICAgICogdG8gYWxsIHNlcnZlcidzIGFuZCB1bmlvbmVkLCBvciBsZWZ0IHRvIHRoZSBzZXNpb24ncyBkZWZhdWx0IGJlaGF2aW9yLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLkhhc2hQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBIYXNoUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIHRhYmxlIGNvbHVtbiBuYW1lLCBub3QgdGhlIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLgotICAgICAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgY29udGFpbiB0aGUgZmllbGQgdGhlIHF1ZXJ5IHdpbGwgbm90IGJlIHBhcnRpdGlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIHBhcnRpdGlvbiBhY3Jvc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29ubmVjdGlvblBvb2xzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBEZWZpbmVzIGlmIHF1ZXJpZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgcGFydGl0aW9uIGZpZWxkIHNob3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5pb25VbnBhcnRpdGlvbmFibGVRdWVyaWVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeSBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGlkLCBsb2NhdGlvbiwgb3IgdGVuYW50LgotICAgICAgICAgKiBFYWNoIHNlcnZlciBpcyBhc3NpZ25lZCBhIHJhbmdlIG9mIHZhbHVlcy4KLSAgICAgICAgICogQWxsIHdyaXRlIG9yIHJlYWQgcmVxdWVzdCBmb3Igb2JqZWN0J3Mgd2l0aCB0aGF0IHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmllbGQgYXMgYSBwYXJhbWV0ZXIsIHRoZW4gaXQgY2FuIGVpdGhlciBiZSBzZW50Ci0gICAgICAgICAqIHRvIGFsbCBzZXJ2ZXIncyBhbmQgdW5pb25lZCwgb3IgbGVmdCB0byB0aGUgc2VzaW9uJ3MgZGVmYXVsdCBiZWhhdmlvci4KLSAgICAgICAgICogCi0gICAgICAgICAqIElmIG11bHRpcGxlIHBhcnRpdGlvbnMgYXJlIHVzZWQgdG8gcHJvY2VzcyBhIHNpbmdsZSB0cmFuc2FjdGlvbiwgSlRBIHNob3VsZCBiZSB1c2VkIGZvciBwcm9wZXIgWEEgdHJhbnNhY3Rpb24gc3VwcG9ydC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogUGFydGl0aW9uIHBvbGljaWVzIGFyZSBnbG9iYWxseSBuYW1lZCB0byBhbGxvdyByZXVzZSwKLSAgICAgICAgICogdGhlIHBhcnRpdGlvbmluZyBwb2xpY3kgbXVzdCBhbHNvIGJlIHNldCB1c2luZyB0aGUgQFBhcnRpdGlvbmVkIGFubm90YXRpb24gdG8gYmUgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUGFydGl0aW9uZWQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5wYXJ0aXRpb25pbmcuUmFuZ2VQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSYW5nZVBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgdGFibGUgY29sdW1uIG5hbWUsIG5vdCB0aGUgY2xhc3MgYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICAgKiBUaGUgY29sdW1uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHF1ZXJ5IGFuZCBzaG91bGQgbm9ybWFsbHkgYmUgcGFydCBvZiB0aGUgb2JqZWN0J3MgSWQuCi0gICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICogSWYgYSBxdWVyeSBkb2VzIG5vdCBjb250YWluIHRoZSBmaWVsZCB0aGUgcXVlcnkgd2lsbCBub3QgYmUgcGFydGl0aW9uZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIGxvYWQgYmFsYW5jZSBhY3Jvc3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFJhbmdlUGFydGl0aW9uW10gcGFydGl0aW9ucygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZXMgaWYgcXVlcmllcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBwYXJ0aXRpb24gZmllbGQgc2hvdWxkIGJlIHNlbnQKLSAgICAgICAgICAgICAqIHRvIGV2ZXJ5IGRhdGFiYXNlIGFuZCBoYXZlIHRoZSByZXN1bHQgdW5pb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiB1bmlvblVucGFydGl0aW9uYWJsZVF1ZXJpZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTpyYW5nZS1wYXJ0aXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyYW5nZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHJhbmdlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVmFsdWVzID0gc3RhcnRWYWx1ZSBhbmQgPSBlbmRWYWx1ZSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbgotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJhbmdlUGFydGl0aW9uIHsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBlbmRWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAvKiogVGhlIGNvbm5lY3Rpb24gcG9vbCB0byByb3V0ZSBxdWVyaWVzIHRvIGZvciB0aGlzIHJhbmdlLiAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW5kLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYWx1ZVBhcnRpdGlvbmluZyBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAqIEVhY2ggdmFsdWUgaXMgYXNzaWduZWQgYSBzcGVjaWZpYyBzZXJ2ZXIuCi0gICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCB2YWx1ZSBhcmUgc2VudCB0byB0aGUgc2VydmVyLgotICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgKiB0byBhbGwgc2VydmVyJ3MgYW5kIHVuaW9uZWQsIG9yIGxlZnQgdG8gdGhlIHNlc2lvbidzIGRlZmF1bHQgYmVoYXZpb3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5WYWx1ZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhbHVlUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIGRhdGFiYXNlIGNvbHVtbiBvciBxdWVyeSBwYXJhbWV0ZXIgdG8gcGFydGl0aW9uIHF1ZXJpZXMgYnkuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSB0YWJsZSBjb2x1bW4gbmFtZSwgbm90IHRoZSBjbGFzcyBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGFsc28gYmUgdGhlIG5hbWUgb2YgYSBxdWVyeSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGNvbnRhaW4gdGhlIGZpZWxkIHRoZSBxdWVyeSB3aWxsIG5vdCBiZSBwYXJ0aXRpb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29sdW1uIHBhcnRpdGlvbkNvbHVtbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogU3RvcmUgdGhlIHZhbHVlIHBhcnRpdGlvbnMuIEVhY2ggcGFydGl0aW9uIG1hcHMgYSB2YWx1ZSB0byBhIGNvbm5lY3Rpb25Qb29sLiAqLwotICAgICAgICAgICAgVmFsdWVQYXJ0aXRpb25bXSBwYXJ0aXRpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgYW55IHVubWFwcGVkIHZhbHVlcy4gKi8KLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0Q29ubmVjdGlvblBvb2woKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lcyBpZiBxdWVyaWVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHBhcnRpdGlvbiBmaWVsZCBzaG91bGQgYmUgc2VudAotICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHVuaW9uVW5wYXJ0aXRpb25hYmxlUXVlcmllcygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb24iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaW9uLXVucGFydGl0aW9uYWJsZS1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHZhbHVlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVGhlIHZhbHVlIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBjb25uZWN0aW9uIHBvb2wuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4yCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFsdWVQYXJ0aXRpb24gewotICAgICAgICAgICAgLyoqIFRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIHN0YXJ0IHZhbHVlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBjb25uZWN0aW9uIHBvb2wgdG8gcm91dGUgcXVlcmllcyB0byBmb3IgdGhpcyB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uUG9vbCgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHNlbmRzIHJlcXVlc3RzIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbiB0byB0aGUgc2V0IG9mIGNvbm5lY3Rpb24gcG9vbHMuCi0gICAgICAgICAgICAgKiBJdCBpcyBmb3IgbG9hZC1iYWxhbmNpbmcgcmVhZCBxdWVyaWVzIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBmdWxsIGRhdGFiYXNlIGJlIHJlcGxpY2F0ZWQgb24gZWFjaCBtYWNoaW5lLCBzbyBkb2VzIG5vdCBzdXBwb3J0IHBhcnRpdGlvbmluZy4KLSAgICAgICAgICAgICAqIFRoZSBkYXRhIHNob3VsZCBlaXRoZXIgYmUgcmVhZC1vbmx5LCBvciB3cml0ZXMgc2hvdWxkIGJlIHJlcGxpY2F0ZWQgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJvdW5kUm9iaW5Qb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChSZXF1aXJlZCkgTGlzdCBvZiBjb25uZWN0aW9uIHBvb2wgbmFtZXMgdG8gbG9hZCBiYWxhbmNlIGFjcm9zcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb25uZWN0aW9uUG9vbHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgYSBzZXQgb2YgZGF0YWJhc2UgdG8gYmUgd3JpdHRlbiB0byBhbmQga2VwdCBpbiBzeW5jaCwKLSAgICAgICAgICAgICAgICAgKiBhbmQgaGF2ZSByZWFkcyBsb2FkLWJhbGFuY2VkIGFjcm9zcyB0aGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwbGljYXRlV3JpdGVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwbGljYXRlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgc2VuZHMgcmVxdWVzdHMgdG8gYSBzZXQgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEl0IGlzIGZvciByZXBsaWNhdGluZyBkYXRhIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBPbmx5IG1vZGlmaWNhdGlvbiBxdWVyaWVzIGFyZSByZXBsaWNhdGVkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJlcGxpY2F0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogVW5pb25QYXJ0aXRpb25pbmcgc2VuZHMgcXVlcmllcyB0byBhbGwgY29ubmVjdGlvbiBwb29scyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLgotICAgICAgICAgICAgICogVGhpcyBpcyBmb3IgcXVlcmllcyBvciByZWxhdGlvbnNoaXBzIHRoYXQgc3BhbiBwYXJ0aXRpb25zIHdoZW4gcGFydGl0aW9uaW5nIGlzIHVzZWQsCi0gICAgICAgICAgICAgKiBzdWNoIGFzIG9uIGEgTWFueVRvTWFueSBjcm9zcyBwYXJ0aXRpb24gcmVsYXRpb25zaGlwLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlVuaW9uUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIERlZmluZXMgaWYgd3JpdGUgcXVlcmllcyBzaG91bGQgYmUgcmVwbGljYXRlZC4KLSAgICAgICAgICAgICAgICAgKiBXcml0ZXMgYXJlIG5vcm1hbGx5IG5vdCByZXBsaWNhdGVkIHdoZW4gdW5pb25pbmcsCi0gICAgICAgICAgICAgICAgICogYnV0IGNhbiBiZSBmb3IgTWFueVRvTWFueSByZWxhdGlvbnNoaXBzLCB3aGVuIHRoZSBqb2luIHRhYmxlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsaWNhdGVXcml0ZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBsaWNhdGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBpbm5lZC1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFBpbm5lZFBhcnRpdGlvbmluZyBwaW5zIHJlcXVlc3RzIHRvIGEgc2luZ2xlIGNvbm5lY3Rpb24gcG9vbC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlBpbm5lZFBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBpbm5lZFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHBvb2wgbmFtZSB0byBwaW4gcXVlcmllcyB0by4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bG9iIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLQotCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVtYmVkZGVkLWlkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW1iZWRkZWRJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgYW4gZW50aXR5IGxpc3RlbmVyIHRvIGJlIGludm9rZWQgYXQgbGlmZWN5Y2xlIGV2ZW50cwotICAgICAgICBmb3IgdGhlIGVudGl0aWVzIHRoYXQgbGlzdCB0aGlzIGxpc3RlbmVyLgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXBlcnNpc3QiIHR5cGU9Im9ybTpwcmUtcGVyc2lzdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1wZXJzaXN0IiB0eXBlPSJvcm06cG9zdC1wZXJzaXN0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcmVtb3ZlIiB0eXBlPSJvcm06cHJlLXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1yZW1vdmUiIHR5cGU9Im9ybTpwb3N0LXJlbW92ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXVwZGF0ZSIgdHlwZT0ib3JtOnByZS11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtdXBkYXRlIiB0eXBlPSJvcm06cG9zdC11cGRhdGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtbG9hZCIgdHlwZT0ib3JtOnBvc3QtbG9hZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEVudGl0eVJlc3VsdCB7Ci0gICAgICAgICAgQ2xhc3MgZW50aXR5Q2xhc3MoKTsKLSAgICAgICAgICBGaWVsZFJlc3VsdFtdIGZpZWxkcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkLXJlc3VsdCIgdHlwZT0ib3JtOmZpZWxkLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImVudGl0eS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImVudW0tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLSAgICAgICAgICBPUkRJTkFMLAotICAgICAgICAgIFNUUklORwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPUkRJTkFMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTVFJJTkciLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmZXRjaC1hdHRyaWJ1dGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEF0dHJpYnV0ZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBGZXRjaEdyb3VwIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBncm91cCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBJbmRpY2F0ZXMgd2hldGhlciBhbGwgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZXMKLSAgICAgICAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIGZldGNoIGdyb3VwIHNob3VsZCBiZSBsb2FkZWQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBsb2FkKCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGxpc3Qgb2YgYXR0cmlidXRlcyB0byBmZXRjaC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBGZXRjaEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiIHR5cGU9Im9ybTpmZXRjaC1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibG9hZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1yZXN1bHQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZpZWxkUmVzdWx0IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBjb2x1bW4oKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbiIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgR2VuZXJhdGVkVmFsdWUgewotICAgICAgICAgIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBBVVRPOwotICAgICAgICAgIFN0cmluZyBnZW5lcmF0b3IoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzdHJhdGVneSIgdHlwZT0ib3JtOmdlbmVyYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdlbmVyYXRvciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluZGV4IiB0eXBlPSJvcm06aW5kZXgiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImdlbmVyYXRlZC12YWx1ZSIgdHlwZT0ib3JtOmdlbmVyYXRlZC12YWx1ZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIiB0eXBlPSJvcm06ZW51bWVyYXRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZC1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkQ2xhc3MgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhbiAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5JbnN0YW50aWF0aW9uQ29weVBvbGljeSAKLSAgICAgICAgICogb24gYW4gRW50aXR5LiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBpcyB0aGUgZGVmYXVsdCBDb3B5UG9saWN5IGluIAotICAgICAgICAgKiBFY2xpcHNlTGluayBhbmQgdGhlcmVmb3JlIHRoaXMgY29uZmlndXJhdGlvbiBvcHRpb24gaXMgb25seSB1c2VkIHRvIAotICAgICAgICAgKiBvdmVycmlkZSBvdGhlciB0eXBlcyBvZiBjb3B5IHBvbGljaWVzCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBJbnN0YW50aWF0aW9uQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3Mgb3IgRW1iZWRkYWJsZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEV4YW1wbGU6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQEluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgewotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgSm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEpvaW5GZXRjaFR5cGUgewotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBkb2VzIG5vdCBhbGxvdyBmb3IgbnVsbC9lbXB0eSB2YWx1ZXMuCi0gICAgICAgICAqLwotICAgICAgICBJTk5FUiwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gaW5uZXIgam9pbiBpcyB1c2VkIHRvIGZldGNoIHRoZSByZWxhdGVkIG9iamVjdC4KLSAgICAgICAgICogVGhpcyBhbGxvd3MgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgT1VURVIsCi0gICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTk5FUiIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1VURVIiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBMb2Ige30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NrLW1vZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIExvY2tNb2RlVHlwZSB7IFJFQUQsIFdSSVRFLCBPUFRJTUlTVElDLCBPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgUEVTU0lNSVNUSUNfUkVBRCwgUEVTU0lNSVNUSUNfV1JJVEUsIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwgTk9ORX07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJSRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJXUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBFU1NJTUlTVElDX1dSSVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiLz4KLQotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvTWFueSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWJ5IiB0eXBlPSJvcm06b3JkZXItYnkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1jb2x1bW4iIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNsYXNzIiB0eXBlPSJvcm06bWFwLWtleS1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLXRhYmxlIiB0eXBlPSJvcm06am9pbi10YWJsZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlIiB0eXBlPSJvcm06Y2FzY2FkZS10eXBlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPiAgICAgICAKLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlDbGFzcyB7Ci0gICAgICAgICAgQ2xhc3MgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5Q29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgbGVuZ3RoKCkgZGVmYXVsdCAyNTU7Ci0gICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBwcmVjaXNpb24KLSAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgc2NhbGUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtY3JpdGVyaWEiIHR5cGU9Im9ybTphZGRpdGlvbmFsLWNyaXRlcmlhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWROYXRpdmVRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOyAvL25hbWVkIFNxbFJlc3VsdFNldE1hcHBpbmcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTmFtZWRRdWVyeSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgcXVlcnkoKTsKLSAgICAgICAgICBMb2NrTW9kZVR5cGUgbG9ja01vZGUoKSBkZWZhdWx0IE5PTkU7Ci0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ib3JtOmxvY2stbW9kZS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLTwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgYW5ub3RhdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24gb2YgCi0gICAgICAgICAqIHF1ZXJpZXMgdGhhdCBjYWxsIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBSZWZlcnMgdG8gdGhlIGNsYXNzIG9mIHRoZSByZXN1bHQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgcmVzdWx0Q2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBTUUxSZXN1bHRNYXBwaW5nLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHByb2NlZHVyZU5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgcXVlcnkgc2hvdWxkIHJldHVybiBhIHJlc3VsdCBzZXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiByZXR1cm5zUmVzdWx0U2V0KCkgZGVmYXVsdCB0cnVlOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyBhcmd1bWVudHMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJldHVybnMtcmVzdWx0LXNldCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT2JqZWN0VHlwZUNvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlCi0gICAgICAgICAgICogYWNyb3NzIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZQotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgCi0gICAgICAgICAgICogZmllbGQgb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgY29udmVyc2lvbiB2YWx1ZXMgdG8gYmUgdXNlZCAKLSAgICAgICAgICAgKiB3aXRoIHRoZSBvYmplY3QgY29udmVydGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbnZlcnNpb25WYWx1ZVtdIGNvbnZlcnNpb25WYWx1ZXMoKTsKLQotICAgICAgICAgICAvKioKLSAgICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IGEgZGVmYXVsdCBvYmplY3QgdmFsdWUuIFVzZWQgZm9yIAotICAgICAgICAgICAgKiBsZWdhY3kgZGF0YSBpZiB0aGUgZGF0YSB2YWx1ZSBpcyBtaXNzaW5nLgotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRPYmplY3RWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnNpb24tdmFsdWUiIHR5cGU9Im9ybTpjb252ZXJzaW9uLXZhbHVlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1vYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLTx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT25lVG9PbmUgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgRUFHRVI7Ci0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gb3JwaGFuUmVtb3ZhbCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtZW50aXR5IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtYXBzLWlkIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci08L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9yZGVyQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ycmVjdGlvbi10eXBlIiB0eXBlPSJvcm06b3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWNvbHVtbi1jb3JyZWN0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBPcmRlckNvcnJlY3Rpb25UeXBlIHsKLSAgICAgICAgICBSRUFELAotICAgICAgICAgIFJFQURfV1JJVEUsCi0gICAgICAgICAgRVhDRVBUSU9OCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlJFQURfV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYQ0VQVElPTiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwb3N0LWxvYWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RMb2FkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtcmVtb3ZlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVJlbW92ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByZS11cGRhdGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFByZVVwZGF0ZSB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEEgdXNlciBkZWZpbmVkIG1hcHBpbmcncyBwcm9wZXJ0eS4KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgVFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IG5hbWUuCi0gICAgICAgICAgICovIAotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgUHJvcGVydHkgdmFsdWUsCi0gICAgICAgICAgICogY29udmVydGVkIHRvIGFuIGluc3RhbmNlIG9mIHZhbHVlVHlwZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBQcm9wZXJ0eSB2YWx1ZSB0eXBlLgotICAgICAgICAgICAqIFRoZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gdmFsdWVUeXBlIGJ5IENvbnZlcnNpb25NYW5hZ2VyLgotICAgICAgICAgICAqIElmIHNwZWNpZmllZCBtdXN0IGJlIGEgc2ltcGxlIHR5cGUgdGhhdCBjb3VsZCBiZSBoYW5kbGVkIGJ5IAotICAgICAgICAgICAqIENvbnZlcnNpb25NYW5hZ2VyOiAKLSAgICAgICAgICAgKiBudW1lcmljYWwsIGJvb2xlYW4sIHRlbXBvcmFsLiAgCi0gICAgICAgICAgICovIAotICAgICAgICAgIENsYXNzIHZhbHVlVHlwZSgpIGRlZmF1bHQgU3RyaW5nLmNsYXNzOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWhpbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHt9KSBAUmV0ZW50aW9uKFJVTlRJTUUpIAotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBRdWVyeUhpbnQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktcmVkaXJlY3RvcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLXB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5UmVkaXJlY3RvcnMgewotICAgIAotICAgIC8qKgotICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhIG1vcmUgcHJlY2lzZSByZWRpcmVjdG9yIChsaWtlIHRoZSAKLSAgICAgKiBSZWFkT2JqZWN0UXVlcnkgUmVkaXJlY3Rvcikgb3IgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogCi0gICAgICovCi0gICAgQ2xhc3MgYWxsUXVlcmllcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogUmVhZEFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKiBGb3IgdXNlcnMgZXhlY3V0aW5nIGEgSlBBIFF1ZXJ5IHRocm91Z2ggdGhlIGdldFJlc3VsdExpc3QoKSBBUEkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlYWRPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAqLwotICAgIENsYXNzIHJlYWRPYmplY3QoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFJlcG9ydFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBSZXBvcnRRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aGF0IGNvbnRhaW5zIGFncmVnYXRlIGZ1bmN0aW9ucyBvciBzZWxlY3RzIG11bHRpcGxlIGVudGl0aWVzIHRoaXMgaXMgdGhlIHJlZGlyZWN0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQKLSAgICAgKi8KLSAgICBDbGFzcyByZXBvcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICogVXBkYXRlT2JqZWN0UXVlcnkgb3IgVXBkYXRlQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAqIEluIEVjbGlwc2VMaW5rIGFuIFVwZGF0ZU9iamVjdFF1ZXJ5IGlzIGV4ZWN1dGVkIHdoZW5ldmVyIGZsdXNoaW5nIGNoYW5nZXMgdG8gdGhlIGRhdGFzb3VyY2UuCi0gICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICogaXQgb3IgYWx0ZXJuYXRlbHkgcGVyZm9ybWluZyBzb21lIHNpZGUgZWZmZWN0IGxpa2UgYXVkaXRpbmcuCi0gICAgICovIAotICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIERlZmF1bHQgSW5zZXJ0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICogSW4gRWNsaXBzZUxpbmsgYW4gSW5zZXJ0T2JqZWN0UXVlcnkgaXMgZXhlY3V0ZWQgd2hlbiBwZXJzaXN0aW5nIGFuIG9iamVjdCB0byB0aGUgZGF0YXNvdXJjZS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBpbnNlcnQoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBEZWZhdWx0IERlbGV0ZSBPYmplY3QgUXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAqIERlbGV0ZU9iamVjdFF1ZXJ5IG9yIERlbGV0ZUFsbFF1ZXJ5IHRoYXQgZG9lcyBub3QgaGF2ZSBhIHJlZGlyZWN0b3Igc2V0IGRpcmVjdGx5IG9uIHRoZSBxdWVyeS4KLSAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgKi8KLSAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLX0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGwtcXVlcmllcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtYWxsIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vYmplY3QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBvcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkZWxldGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbm5vdGF0aW9uIGZvciBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IHNob3VsZCBoYXZlIGEgCi0gICAgICAgICAqIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSBjb2x1bW4ocykgCi0gICAgICAgICAqIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZWFkVHJhbnNmb3JtZXIgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBVc2VyLWRlZmluZWQgY2xhc3MgdGhhdCBtdXN0IGltcGxlbWVudCB0aGUgCi0gICAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy50cmFuc2Zvcm1lcnMuQXR0cmlidXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAgICAgKiBpbnRlcmZhY2UuIFRoZSBjbGFzcyB3aWxsIGJlIGluc3RhbnRpYXRlZCwgaXRzIAotICAgICAgICAgICAgICogYnVpbGRBdHRyaWJ1dGVWYWx1ZSB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSAKLSAgICAgICAgICAgICAqIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHRyYW5zZm9ybWVyQ2xhc3MoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIG1hcHBlZCBjbGFzcyBtdXN0IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUgd2hpY2ggcmV0dXJucyAKLSAgICAgICAgICAgICAqIGEgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGF0dHJpYnV0ZSAobm90IGFzc2lnbnMgdGhlIHZhbHVlIHRvIAotICAgICAgICAgICAgICogdGhlIGF0dHJpYnV0ZSkuIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIAotICAgICAgICAgICAgICogc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBTdHJpbmcgbWV0aG9kKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuLWluc2VydCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJldHVybkluc2VydCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgUmV0dXJuSW5zZXJ0IGFubm90YXRpb24gYWxsb3dzIGZvciBJTlNFUlQgb3BlcmF0aW9ucyB0byByZXR1cm4gCi0gICAgICAgICAgICAgKiB2YWx1ZXMgYmFjayBpbnRvIHRoZSBvYmplY3QgYmVpbmcgd3JpdHRlbi4gVGhpcyBhbGxvd3MgZm9yIHRhYmxlIAotICAgICAgICAgICAgICogZGVmYXVsdCB2YWx1ZXMsIHRyaWdnZXIgb3Igc3RvcmVkIHByb2NlZHVyZXMgY29tcHV0ZWQgdmFsdWVzIHRvIAotICAgICAgICAgICAgICogYmUgc2V0IGJhY2sgaW50byB0aGUgb2JqZWN0LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHJldHVybk9ubHkoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXR1cm4tb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWNvbmRhcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW5bXSBwa0pvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3FsUmVzdWx0U2V0TWFwcGluZyB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBFbnRpdHlSZXN1bHRbXSBlbnRpdGllcygpIGRlZmF1bHQge307Ci0gICAgICAgICAgQ29sdW1uUmVzdWx0W10gY29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1yZXN1bHQiIHR5cGU9Im9ybTplbnRpdHktcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLXJlc3VsdCIgdHlwZT0ib3JtOmNvbHVtbi1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHdpdGhpbiBhIAotICAgICAgICAgKiBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24uIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe30pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBKYXZhIGNsYXNzIGRlc2lyZWQgYmFjayBmcm9tIHRoZSBwcm9jZWR1cmUsIAotICAgICAgICAgICAqIHRoaXMgaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIGNvZGUsIHRoaXMgZGVwZW5kZW50IG9uIHRoZSB0eXBlIHJldHVybmVkIAotICAgICAgICAgICAqIGZyb20gdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpbnQgamRiY1R5cGUoKSBkZWZhdWx0IC0xOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgSkRCQyB0eXBlIG5hbWUsIHRoaXMgbWF5IGJlIHJlcXVpcmVkIGZvciBBUlJBWSBvciAKLSAgICAgICAgICAgKiBTVFJVQ1QgdHlwZXMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGpkYmNUeXBlTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iamRiYy10eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdENvbnZlcnRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBOYW1lIHRoaXMgY29udmVydGVyLiBUaGUgbmFtZSBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyAKLSAgICAgICAgICAgKiB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgY29udmVydGVyIGNsYXNzIHRvIGJlIHVzZWQuIFRoaXMgY2xhc3MgbXVzdCAKLSAgICAgICAgICAgKiBpbXBsZW1lbnQgdGhlIEVjbGlwc2VMaW5rIGludGVyZmFjZSAKLSAgICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBjb252ZXJ0ZXIoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNyZWF0aW9uLXN1ZmZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXgiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFsbG93IGEgZGF0YWJhc2UgSU5ERVggdG8gYmUgZGVmaW5lIHdoZW4gZ2VuZXJhdGluZyBEREwuCi0gICAgICAgICAqIFRoZSBASW5kZXggY2FuIGJlIGRlZmluZWQgb24gYSBFbnRpdHkgY2xhc3MsIG9yIG9uIGFuIGF0dHJpYnV0ZS4KLSAgICAgICAgICogVGhlIGNvbHVtbiBpcyBkZWZhdWx0ZWQgd2hlbiBkZWZpbmVkIG9uIGEgYXR0cmlidXRlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmRleCB7Ci0gICAgICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIElOREVYLCBkZWZhdWx0cyB0byBJTkRFWF8odGFibGUtbmFtZSkgKi8KLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc2NoZW1hIG9mIHRoZSBJTkRFWCAqLwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgY2F0YWxvZyBvZiB0aGUgSU5ERVggKi8KLSAgICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB0YWJsZSB0byBkZWZpbmUgdGhlIGluZGV4IG9uLCBkZWZhdWx0cyB0byBlbnRpdGllcyBwcmltYXJ5IHRhYmxlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgdGhlIHNldCBvZiBjb2x1bW5zIHRvIGRlZmluZSB0aGUgaW5kZXggb24uCi0gICAgICAgICAgICAgKiBOb3QgcmVxdWlyZWQgd2hlbiBhbm5vdGF0ZWQgb24gYSBmaWVsZC9tZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUYWJsZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgcGtDb2x1bW5WYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMDsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZS1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBrLWNvbHVtbi12YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImluaXRpYWwtdmFsdWUiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idGVtcG9yYWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUZW1wb3JhbCB7Ci0gICAgICAgICAgVGVtcG9yYWxUeXBlIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOnRlbXBvcmFsLXR5cGUiLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBUZW1wb3JhbFR5cGUgewotICAgICAgICAgIERBVEUsIC8vIGphdmEuc3FsLkRhdGUKLSAgICAgICAgICBUSU1FLCAvLyBqYXZhLnNxbC5UaW1lCi0gICAgICAgICAgVElNRVNUQU1QIC8vIGphdmEuc3FsLlRpbWVzdGFtcAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iREFURSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FIi8+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRJTUVTVEFNUCIvPgotICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBpcyBhbiBvcHRpb25hbCBhbm5vdGF0aW9uIGZvciAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbk1hcHBpbmcgYWxsb3dzIHRvIG1hcCBhbiBhdHRyaWJ1dGUgdG8gb25lIG9yIG1vcmUgCi0gICAgICAgICAqIGRhdGFiYXNlIGNvbHVtbnMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uIGlzIGFuIG9wdGlvbmFsIHBhcnQgb2YgCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBkZWZpbml0aW9uLiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyAKLSAgICAgICAgICogd3JpdGUtb25seSwgaXQgc2hvdWxkIGhhdmUgYSBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgCi0gICAgICAgICAqIHRyYW5zZm9ybWF0aW9uIG9mIGRhdGFiYXNlIGNvbHVtbihzKSB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2Zvcm1hdGlvbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSAKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIAotICAgICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICAgKiBkZWZhdWx0cyB0byBFQUdFUi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcHRpb25hbCBlbGVtZW50IGlzIGEgaGludCBhcyB0byB3aGV0aGVyIHRoZSB2YWx1ZQotICAgICAgICAgICAgICogIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSBtYXkgYmUgbnVsbC4gSXQgaXMgZGlzcmVnYXJkZWQKLSAgICAgICAgICAgICAqICBmb3IgcHJpbWl0aXZlIHR5cGVzLCB3aGljaCBhcmUgY29uc2lkZXJlZCBub24tb3B0aW9uYWwuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOnJlYWQtdHJhbnNmb3JtZXIiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ3cml0ZS10cmFuc2Zvcm1lciIgdHlwZT0ib3JtOndyaXRlLXRyYW5zZm9ybWVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNpZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVHJhbnNpZW50IHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGRhdGFiYXNlLiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbmNlIGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIGRhdGFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZW50aXR5LiBUaGUKLSAgICAgICAgICAgKiBkZWZhdWx0IGlzIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2YgdGhlIHBlcnNpc3RlbnQgZmllbGQgCi0gICAgICAgICAgICogb3IgcHJvcGVydHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3Mgb2JqZWN0VHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9iamVjdC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaXF1ZS1jb25zdHJhaW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBVbmlxdWVDb25zdHJhaW50IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nW10gY29sdW1uTmFtZXMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi08IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKiAKLSAgICAgICAgICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotICAgICAgICAgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLSAgICAgICAgICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotICAgICAgICAgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotICAgICAgICAgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0gICAgICAgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLSAgICAgICAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0gICAgICAgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0gICAgICAgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmRleCIgdHlwZT0ib3JtOmluZGV4IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXRjaC1mZXRjaCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogQSBCYXRjaEZldGNoIGFubm90YXRpb24gY2FuIGJlIHVzZWQgb24gYW55IHJlbGF0aW9uc2hpcCBtYXBwaW5nLAotICAgICAgICAgKiAoT25lVG9PbmUsIE1hbnlUb09uZSwgT25lVG9NYW55LCBNYW55VG9NYW55LCBFbGVtZW50Q29sbGVjdGlvbiwgQmFzaWNDb2xsZWN0aW9uLCBCYXNpY01hcCkuCi0gICAgICAgICAqIEl0IGFsbG93cyB0aGUgcmVsYXRlZCBvYmplY3RzIHRvIGJlIGJhdGNoIHJlYWQgaW4gYSBzaW5nbGUgcXVlcnkuCi0gICAgICAgICAqIEJhdGNoIGZldGNoaW5nIGNhbiBhbHNvIGJlIHNldCBhdCB0aGUgcXVlcnkgbGV2ZWwsIGFuZCBpdCBpcyAKLSAgICAgICAgICogbm9ybWFsbHkgcmVjb21tZW5kZWQgdG8gZG8gc28gYXMgYWxsIHF1ZXJpZXMgbWF5IG5vdCByZXF1aXJlIGJhdGNoaW5nLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjEKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEJhdGNoRmV0Y2ggewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGJhdGNoLWZldGNoIHRvIHVzZS4KLSAgICAgICAgICAgICAqIEVpdGhlciBKT0lOLCBFWElTVFMgb3IgSU4uCi0gICAgICAgICAgICAgKiBKT0lOIGlzIHRoZSBkZWZhdWx0LgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQmF0Y2hGZXRjaFR5cGUgdmFsdWUoKSBkZWZhdWx0IEJhdGNoRmV0Y2hUeXBlLkpPSU47Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lIHRoZSBkZWZhdWx0IGJhdGNoIGZldGNoIHNpemUuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgSU4gdHlwZSBiYXRjaCByZWFkaW5nIGFuZCBkZWZpbmVzCi0gICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGtleXMgdXNlZCBpbiBlYWNoIElOIGNsYXVzZS4KLSAgICAgICAgICAgICAqIFRoZSBkZWZhdWx0IHNpemUgaXMgMjU2LCBvciB0aGUgcXVlcnkncyBwYWdlU2l6ZSBmb3IgY3Vyc29yIHF1ZXJpZXMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGludCBzaXplKCkgZGVmYXVsdCAtMTsKLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpiYXRjaC1mZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotPC94c2Q6c2NoZW1hPgotCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX29ybV8yXzMueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDUyMWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw1NDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLTwhLS0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4gCi08IS0tIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IAotPCEtLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgdHdhcmUgLSB1cGRhdGUgdmVyc2lvbiBudW1iZXIgdG8gMi4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgMTIvMi8yMDA5LTIuMSBHdXkgUGVsbGV0aWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTYyODk6IEFkZCBjdXJyZW50IGFubm90YXRpb24gbWV0YWRhdGEgc3VwcG9ydCBvbiBtYXBwZWQgc3VwZXJjbGFzc2VzIHRvIEVjbGlwc2VMaW5rLU9STS5YTUwgU2NoZW1hICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyOTY2MTI6IEFkZCBjdXJyZW50IGFubm90YXRpb24gb25seSBtZXRhZGF0YSBzdXBwb3J0IG9mIHJldHVybiBpbnNlcnQvdXBkYXRlIHRvIHRoZSBFY2xpcHNlTGluay1PUk0uWE1MIFNjaGVtYSAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSBmb3JtYXR0ZWQgdG8gbWF0Y2ggb3JtXzJfMC54c2Qgc28gdGhhdCB1c2VycyBjYW4gZWFzaWx5IGNvbXBhcmUgdGhlIHR3byBzY2hlbWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgNS80LzIwMTAtMi4xIEd1eSBQZWxsZXRpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyMjcyMTk6IEV4cGFuZCBFY2xpcHNlTGluay1PUk0uWE1MIHNjaGVtYSBmdW5jdGlvbmFsaXR5IGZvciAyLjEgcmVsZWFzZSAgKHVwZGF0ZSB2ZXJzaW9uIHRvIDIuMSkgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgNi8xNC8yMDEwLTIuMiBHdXkgUGVsbGV0aWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAgLSAyNDcwNzg6IGVjbGlwc2VsaW5rLW9ybS54bWwgc2NoZW1hIHNob3VsZCBhbGxvdyBsb2IgYW5kIGVudW1lcmF0ZWQgb24gdmVyc2lvbiBhbmQgaWQgbWFwcGluZ3MgKHVwZGF0ZSB2ZXJzaW9uIHRvIDIuMikgIC0tPgotPCEtLSAgICAgMTAvMTUvMjAxMC0yLjIgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAtIDMyMjAwODogSW1wcm92ZSB1c2FiaWxpdHkgb2YgYWRkaXRpb25hbCBjcml0ZXJpYSBhcHBsaWVkIHRvIHF1ZXJpZXMgYXQgdGhlIHNlc3Npb24vRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgMDMvMjMvMjAxMS0yLjMgR3V5IFBlbGxldGllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAgICAgICAtIDMzNzMyMzogTXVsdGktdGVuYW50IHdpdGggc2hhcmVkIHNjaGVtYSBzdXBwb3J0IChwYXJ0IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08IS0tIEphdmEgUGVyc2lzdGVuY2UgQVBJIG9iamVjdC1yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZSBzY2hlbWEgLS0+Ci08eHNkOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczpvcm09Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iIAotICB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiIAotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiIAotICB2ZXJzaW9uPSIyLjMiPgotCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICBAKCMpZWNsaXBzZWxpbmtfb3JtXzJfMy54c2QgMi4zICBNYXJjaCAyMyAyMDExCi0gICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgCi0gIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgPHhzZDpkb2N1bWVudGF0aW9uPjwhW0NEQVRBWwotCi0gICAgICAgVGhpcyBpcyB0aGUgWE1MIFNjaGVtYSBmb3IgdGhlIG5hdGl2ZSBFY2xpcHNlbGluayBYTUwgbWFwcGluZyBmaWxlCi0gICAgICAgVGhlIGZpbGUgbWF5IGJlIG5hbWVkICJNRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiBpbiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICBhcmNoaXZlIG9yIGl0IG1heSBiZSBuYW1lZCBzb21lIG90aGVyIG5hbWUgd2hpY2ggd291bGQgYmUKLSAgICAgICB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBhcyByZXNvdXJjZSBvbiB0aGUgY2xhc3NwYXRoLgotICAgICAgIE9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgZmlsZXMgbXVzdCBpbmRpY2F0ZSB0aGUgb2JqZWN0L3JlbGF0aW9uYWwKLSAgICAgICBtYXBwaW5nIGZpbGUgc2NoZW1hIGJ5IHVzaW5nIHRoZSBwZXJzaXN0ZW5jZSBuYW1lc3BhY2U6Ci0KLSAgICAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3JtCi0KLSAgICAgICBhbmQgaW5kaWNhdGUgdGhlIHZlcnNpb24gb2YgdGhlIHNjaGVtYSBieSB1c2luZyB0aGUgdmVyc2lvbiBlbGVtZW50IGFzIHNob3duIGJlbG93OgotCi0gICAgICAgPGVudGl0eS1tYXBwaW5ncyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSIKLSAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL29ybSAKLSAgICAgICBlY2xpcHNlbGlua19vcm1fMl8zLnhzZAotICAgICAgIHZlcnNpb249IjIuMyI+Ci0gICAgICAgLi4uCi0gICAgICAgPC9lbnRpdHktbWFwcGluZ3M+Ci0KLSAgICAgXV0+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbXB0eVR5cGUiLz4KLSAgCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ2ZXJzaW9uVHlwZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDpwYXR0ZXJuIHZhbHVlPSJbMC05XSsoXC5bMC05XSspKiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InN1cHBvcnRlZC12ZXJzaW9ucy10eXBlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp2ZXJzaW9uVHlwZSI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjAiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IjIuMSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iMi4yIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSIyLjMiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4gCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWNjZXNzLW1ldGhvZHMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhZGRpdGlvbmFsIGNyaXRlcmlhIGNhbiBiZSBzcGVjaWZpZWQgYXQgdGhlIEVudGl0eSBvciBNYXBwZWRTdXBlcmNsYXNzIAotICAgICAgICAgKiBsZXZlbC4gV2hlbiBzcGVjaWZpZWQgYXQgdGhlIG1hcHBlZCBzdXBlcmNsYXNzIGxldmVsLCBpdCBhcHBsaWVzIHRvIGFsbCAKLSAgICAgICAgICogaW5oZXJpdGluZyBlbnRpdGllcyB1bmxlc3MgdGhvc2UgZW50aXRpZXMgZGVmaW5lIHRoZWlyIG93biBhZGRpdGlvbmFsIAotICAgICAgICAgKiBjcml0ZXJpYSwgYXQgd2hpY2ggcG9pbnQgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgZnJvbSB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgCi0gICAgICAgICAqIGlzIGlnbm9yZWQuICAKLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEgc3VwcG9ydHMgYW55IHZhbGlkIEpQUUwgc3RyaW5nIGFuZCBtdXN0IHVzZSAndGhpcycgCi0gICAgICAgICAqIGFzIGFuIGFsaWFzIHRvIGZvcm0geW91ciBhZGRpdGlvbmFsIGNyaXRlcmlhLiBFLkcuLAotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQWRkaXRpb25hbENyaXRlcmlhKCJ0aGlzLm51dC5zaXplID0gOk5VVF9TSVpFIGFuZCB0aGlzLm51dC5jb2xvciA9IDpOVVRfQ09MT1IiKQotICAgICAgICAgKiBwdWJsaWMgY2xhc3MgQm9sdCB7Li4ufQotICAgICAgICAgKiAKLSAgICAgICAgICogQWRkaXRpb25hbCBjcml0ZXJpYSBwYXJhbWV0ZXJzIGFyZSBhbHNvIGFjY2VwdGVkIGFuZCBhcmUgc2V0IHRocm91Z2ggCi0gICAgICAgICAqIHByb3BlcnRpZXMgb24gdGhlIGVudGl0eSBtYW5hZ2VyIGZhY3RvcnksIG9yIG9uIGFuIGVudGl0eSBtYW5hZ2VyLiBXaGVuIHNldCAKLSAgICAgICAgICogb24gdGhlIGVudGl0eSBtYW5hZ2VyLCB0aGUgcHJvcGVydGllcyBtdXN0IGJlIHNldCBiZWZvcmUgYW55IHF1ZXJ5IGV4ZWN1dGlvbgotICAgICAgICAgKiBhbmQgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGZvciB0aGUgbGlmZSBzcGFuIG9mIHRoYXQgZW50aXR5IG1hbmFnZXIuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQcm9wZXJ0aWVzIHNldCBvbiB0aGUgZW50aXR5IG1hbmFnZXIgd2lsbCBvdmVycmlkZSB0aG9zZSBzaW1pbGFybHkgbmFtZWQgCi0gICAgICAgICAqIHByb3BlcnRpZXMgc2V0IG9uIHRoZSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBBZGRpdGlvbmFsIGNyaXRlcmlhIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBhbnkgbmF0aXZlIHF1ZXJpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEd1eSBQZWxsZXRpZXIKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQWRkaXRpb25hbENyaXRlcmlhIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgSlBRTCBmcmFnbWVudCB0byB1c2UgYXMgdGhlIGFkZGl0aW9uYWwgY3JpdGVyaWEuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlIGFubm90YXRpb24gaXMgdXNlZCB0byBzZXQgYW4gCi0gICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLmludmFsaWRhdGlvbi5DYWNoZUludmFsaWRhdGlvblBvbGljeSAKLSAgICAgICAgICogd2hpY2ggc2V0cyBvYmplY3RzIGluIEVjbGlwc2VMaW5rJ3MgaWRlbnRpdHkgbWFwcyB0byBiZSBpbnZhbGlkIAotICAgICAgICAgKiBmb2xsb3dpbmcgZ2l2ZW4gcnVsZXMuIEJ5IGRlZmF1bHQgaW4gRWNsaXBzZUxpbmssIG9iamVjdHMgZG8gbm90IAotICAgICAgICAgKiBleHBpcmUgaW4gdGhlIGNhY2hlLiBTZXZlcmFsIGRpZmZlcmVudCBwb2xpY2llcyBhcmUgYXZhaWxhYmxlIHRvIAotICAgICAgICAgKiBhbGxvdyBvYmplY3RzIHRvIGV4cGlyZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGVUeXBlCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENhY2hlIGFub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHkgb3IgTWFwcGVkU3VwZXJjbGFzcy4gCi0gICAgICAgICAqIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIENhY2hlIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCAKLSAgICAgICAgICogb24gdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNhY2hlIHRvIHVzZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2FjaGVUeXBlIHR5cGUoKSBkZWZhdWx0IFNPRlRfV0VBSzsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNpemUgb2YgY2FjaGUgdG8gdXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2l6ZSgpIGRlZmF1bHQgMTAwOwotCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIChPcHRpb25hbCkgQ2FjaGVkIGluc3RhbmNlcyBpbiB0aGUgc2hhcmVkIGNhY2hlLAotICAgICAgICAgICogb3Igb25seSBhIHBlciBFbnRpdHlNYW5hZ2VyIGlzb2xhdGVkIGNhY2hlLgotICAgICAgICAgICogVGhlIGRlZmF1bHQgaXMgc2hhcmVkLgotICAgICAgICAgICogQGRlcHJlY2F0ZWQgIEFzIG9mIEVjbGlwc2VsaW5rIDIuMi4gIFNlZSB0aGUgYXR0cmlidXRlICdpc29sYXRpb24nCi0gICAgICAgICAgKi8gCi0gICAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgICBib29sZWFuIHNoYXJlZCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAKLSAgICAgICAgIC8qKgotICAgICAgICAgICogKE9wdGlvbmFsKSBDb250cm9scyB0aGUgbGV2ZWwgb2YgY2FjaGluZyB0aGlzIEVudGl0eSB3aWxsIHVzZS4KLSAgICAgICAgICAqIFRoZSBkZWZhdWx0IGlzIENhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQgd2hpY2ggaGFzIEVjbGlwc2VMaW5rCi0gICAgICAgICAgKiBDYWNoaW5nIGFsbCBFbnRpdGllcyBpbiB0aGUgU2hhcmVkIENhY2hlLgotICAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuQ2FjaGVJc29sYXRpb25UeXBlCi0gICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUlzb2xhdGlvblR5cGUgaXNvbGF0aW9uKCkgZGVmYXVsdCBTSEFSRUQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEV4cGlyZSBjYWNoZWQgaW5zdGFuY2UgYWZ0ZXIgYSBmaXggcGVyaW9kIG9mIHRpbWUgKG1zKS4gCi0gICAgICAgICAgICogUXVlcmllcyBleGVjdXRlZCBhZ2FpbnN0IHRoZSBjYWNoZSBhZnRlciB0aGlzIHdpbGwgYmUgZm9yY2VkIGJhY2sgCi0gICAgICAgICAgICogdG8gdGhlIGRhdGFiYXNlIGZvciBhIHJlZnJlc2hlZCBjb3B5Ci0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBleHBpcnkoKSBkZWZhdWx0IC0xOyAvLyBtaW51cyBvbmUgaXMgbm8gZXhwaXJ5LgotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBFeHBpcmUgY2FjaGVkIGluc3RhbmNlIGEgc3BlY2lmaWMgdGltZSBvZiBkYXkuIFF1ZXJpZXMgCi0gICAgICAgICAgICogZXhlY3V0ZWQgYWdhaW5zdCB0aGUgY2FjaGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvcmNlZCBiYWNrIHRvIHRoZSAKLSAgICAgICAgICAgKiBkYXRhYmFzZSBmb3IgYSByZWZyZXNoZWQgY29weQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBUaW1lT2ZEYXkgZXhwaXJ5VGltZU9mRGF5KCkgZGVmYXVsdCBAVGltZU9mRGF5KHNwZWNpZmllZD1mYWxzZSk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvcmNlIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlIHRvIGFsd2F5cyAKLSAgICAgICAgICAgKiByZWZyZXNoIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgYm9vbGVhbiBhbHdheXNSZWZyZXNoKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRm9yIGFsbCBxdWVyaWVzIHRoYXQgZ28gdG8gdGhlIGRhdGFiYXNlLCByZWZyZXNoIHRoZQotICAgICAgICAgICAqIGNhY2hlIG9ubHkgaWYgdGhlIGRhdGEgcmVjZWl2ZWQgZnJvbSB0aGUgZGF0YWJhc2UgYnkgYSBxdWVyeSBpcyAKLSAgICAgICAgICAgKiBuZXdlciB0aGFuIHRoZSBkYXRhIGluIHRoZSBjYWNoZSAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgb3B0aW1pc3RpYyAKLSAgICAgICAgICAgKiBsb2NraW5nIGZpZWxkKQotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIHJlZnJlc2hPbmx5SWZOZXdlcigpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldHRpbmcgdG8gdHJ1ZSB3aWxsIGZvcmNlIGFsbCBxdWVyaWVzIHRvIGJ5cGFzcyB0aGUgCi0gICAgICAgICAgICogY2FjaGUgZm9yIGhpdHMgYnV0IHN0aWxsIHJlc29sdmUgYWdhaW5zdCB0aGUgY2FjaGUgZm9yIGlkZW50aXR5LiAKLSAgICAgICAgICAgKiBUaGlzIGZvcmNlcyBhbGwgcXVlcmllcyB0byBoaXQgdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBib29sZWFuIGRpc2FibGVIaXRzKCkgZGVmYXVsdCBmYWxzZTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhY2hlIGNvb3JkaW5hdGlvbiBtb2RlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBDYWNoZUNvb3JkaW5hdGlvblR5cGUgY29vcmRpbmF0aW9uVHlwZSgpIGRlZmF1bHQgU0VORF9PQkpFQ1RfQ0hBTkdFUzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5IiB0eXBlPSJ4c2Q6aW50ZWdlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhwaXJ5LXRpbWUtb2YtZGF5IiB0eXBlPSJvcm06dGltZS1vZi1kYXkiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOmNob2ljZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNoYXJlZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpc29sYXRpb24iIHR5cGU9Im9ybTpjYWNoZS1pc29sYXRpb24tdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9Im9ybTpjYWNoZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcmVzaC1vbmx5LWlmLW5ld2VyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2FibGUtaGl0cyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb29yZGluYXRpb24tdHlwZSIgdHlwZT0ib3JtOmNhY2hlLWNvb3JkaW5hdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4gCi0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENhY2hlSW50ZXJjZXB0b3IgewotICAgICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENhY2hlVHlwZSBlbnVtIGlzIHVzZWQgd2l0aCB0aGUgQ2FjaGUgYW5ub3RhdGlvbiBmb3IgYSAKLSAgICAgICAgICogcGVyc2lzdGVudCBjbGFzcy4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBJZGVudGl0eU1hcC9DYWNoZSB1c2VkIGZvciAKLSAgICAgICAgICogdGhlIGNsYXNzLiBCeSBkZWZhdWx0IHRoZSBTT0ZUX1dFQUsgY2FjaGUgdHlwZSBpcyB1c2VkLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5DYWNoZSAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIENhY2hlVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LiBDYWNoZXMgYWxsIG9iamVjdHMKLSAgICAgICAgICAgKiBhbmQgZG9lcyBub3QgcmVtb3ZlIHRoZW0uIAotICAgICAgICAgICAqIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBiZSBtZW1vcnkgaW50ZW5zaXZlIHdoZW4gbWFueSBvYmplY3RzIGFyZSAKLSAgICAgICAgICAgKiByZWFkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZVTEwsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgd2VhayByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiBhbmQgcHJvdmlkZXMgZnVsbCBjYWNoaW5nIGFuZCBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFdFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBGVUxMIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCB0aGUgbWFwIGhvbGRzIHRoZQotICAgICAgICAgICAqIG9iamVjdHMgdXNpbmcgc29mdCByZWZlcmVuY2VzLiBUaGlzIG1ldGhvZCBhbGxvd3MgZnVsbCBnYXJiYWdlCi0gICAgICAgICAgICogY29sbGVjdGlvbiB3aGVuIG1lbW9yeSBpcyBsb3cgYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQKLSAgICAgICAgICAgKiBndWFyYW50ZWVkIGlkZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlQsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTaW1pbGFyIHRvIHRoZSBXRUFLIGlkZW50aXR5IG1hcCBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYQotICAgICAgICAgICAqIG1vc3QtZnJlcXVlbnRseS11c2VkIHN1Yi1jYWNoZS4gVGhlIHNpemUgb2YgdGhlIHN1Yi1jYWNoZSBpcwotICAgICAgICAgICAqIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwIGFzIHNwZWNpZmllZCBieQotICAgICAgICAgICAqIGRlc2NyaXB0b3IncyBzZXRJZGVudGl0eU1hcFNpemUoKSBtZXRob2QuIFRoZSBzdWItY2FjaGUKLSAgICAgICAgICAgKiB1c2VzIHNvZnQgcmVmZXJlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGVzZSBvYmplY3RzIGFyZQotICAgICAgICAgICAqIGdhcmJhZ2UtY29sbGVjdGVkIG9ubHkgaWYgdGhlIHN5c3RlbSBpcyBsb3cgb24gbWVtb3J5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFNPRlRfV0VBSywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElkZW50aWNhbCB0byB0aGUgc29mdCBjYWNoZSB3ZWFrIChTT0ZUX1dFQUspIGlkZW50aXR5IG1hcCBleGNlcHQgCi0gICAgICAgICAgICogdGhhdCBpdCB1c2VzIGhhcmQgcmVmZXJlbmNlcyBpbiB0aGUgc3ViLWNhY2hlLiBVc2UgdGhpcyBpZGVudGl0eSAKLSAgICAgICAgICAgKiBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGRvIG5vdCBiZWhhdmUgcHJvcGVybHkgb24geW91ciBwbGF0Zm9ybS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBIQVJEX1dFQUssCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIGNhY2hlIGlkZW50aXR5IG1hcCBtYWludGFpbnMgYSBmaXhlZCBudW1iZXIgb2Ygb2JqZWN0cwotICAgICAgICAgICAqIHNwZWNpZmllZCBieSB0aGUgYXBwbGljYXRpb24uIE9iamVjdHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUKLSAgICAgICAgICAgKiBvbiBhIGxlYXN0LXJlY2VudGx5LXVzZWQgYmFzaXMuIFRoaXMgbWV0aG9kIGFsbG93cyBvYmplY3QKLSAgICAgICAgICAgKiBpZGVudGl0eSBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBvYmplY3RzLgotICAgICAgICAgICAqIFdBUk5JTkc6IEZ1cm5pc2hlcyBjYWNoaW5nIGFuZCBpZGVudGl0eSwgYnV0IGRvZXMgbm90IGd1YXJhbnRlZSAKLSAgICAgICAgICAgKiBpZGVudGl0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDQUNIRSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFdBUk5JTkc6IERvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgCi0gICAgICAgICAgICogb2JqZWN0cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZVTEwiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IldFQUsiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNPRlRfV0VBSyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSEFSRF9XRUFLIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDQUNIRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1pc29sYXRpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogT3B0aW9ucyBmb3IgaG93IEVudGl0eSBpbnN0YW5jZXMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoaW4gYW4gRWNsaXBzZUxpbmsgUGVyc2lzdGVuY2UgVW5pdCAvIFNlcnZlclNlc3Npb24KLSAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVJc29sYXRpb25UeXBlKENhY2hlSXNvbGF0aW9uVHlwZSkKLSAgICAgICAgICogQGF1dGhvciBHb3Jkb24gWW9ya2UKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVJc29sYXRpb25UeXBlIHsKLSAgICAgICAgCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIEVudGl0eSBpbnN0YW5jZXMgd2lsbCBiZSBjYWNoZWQgd2l0aGluIHRoZSBFbnRpdHlNYW5hZ2VyRmFjdG9yeS9TZXJ2ZXJTZXNzaW9uIGxldmVsLgotICAgICAgICAgICogQW55IHVzZXIgcXVlcmllcyBmb3Igc2hhcmVkIGNhY2hlIGluc3RhbmNlcyAoaWUgUmVhZC1Pbmx5IHF1ZXJ5IGhpbnQpIHdpbGwgcmV0dXJuIGFuIEVudGl0eQotICAgICAgICAgICogaW5zdGFuY2UgdGhhdCBtYXkgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIGNsaWVudHMuIAotICAgICAgICAgICogCi0gICAgICAgICAgKiBUaGlzIHNldHRpbmcgaXMgdGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsLgotICAgICAgICAgICovCi0gICAgICAgICBTSEFSRUQsCi0gICAgCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIEVudGl0eSBzdGF0ZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGNhY2hlZCBpbiB0aGUgc2hhcmVkIGNhY2hlIGJ1dCBFbnRpdHkKLSAgICAgICAgICAqIGluc3RhbmNlcyB3aWxsIG5vdCBiZSBzaGFyZWQuIEFueSB1c2VyIHF1ZXJpZXMgZm9yIHNoYXJlZCBjYWNoZSBpbnN0YW5jZXMKLSAgICAgICAgICAqIChpZSBSZWFkLU9ubHkgcXVlcnkgaGludCkgd2lsbCByZXR1cm4gYSBuZXcgRW50aXR5IGluc3RhbmNlIHdpdGggdGhlIGNhY2hlZCBzdGF0ZS4KLSAgICAgICAgICAqIFRoaXMgd2lsbCBlbnN1cmUgdGhlIGluc3RhbmNlIGlzIDxpPnByb3RlY3RlZDwvaT4gZnJvbSBhbnkgY29uY3VycmVudAotICAgICAgICAgICogc3RhdGUgY2hhbmdlLgotICAgICAgICAgICovCi0gICAgICAgICBQUk9URUNURUQsCi0gICAgCi0gICAgICAgICAvKioKLSAgICAgICAgICAqIFRoZSBFbnRpdHkgYW5kIGl0cyBkYXRhIGlzIG5vdCBzdG9yZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBidXQgaXMKLSAgICAgICAgICAqIDxpPmlzb2xhdGVkPC9pPiB0byB0aGUgUGVyc2lzdGVuY2UgQ29udGV4dC9Vbml0T2ZXb3JrIG9yCi0gICAgICAgICAgKiBJc29sYXRlZENsaWVudFNlc3Npb24uIFRoaXMgc2V0dGluZyBlZmZlY3RpdmVseSBkaXNhYmxlcyBzZWNvbmQgbGV2ZWwKLSAgICAgICAgICAqIGNhY2hpbmcgZm9yIHRoaXMgZW50aXR5IGFuZCBzaG91bGQgYmUgdXNlZCB3aGVuIHVzZXJzIGRvIG5vdCB3YW50IGNhY2hpbmcgZm9yCi0gICAgICAgICAgKiBhIHBhcnRpY3VsYXIgRW50aXR5LgotICAgICAgICAgICovCi0gICAgICAgICBJU09MQVRFRDsKLSAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTSEFSRUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlBST1RFQ1RFRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSVNPTEFURUQiLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtY29vcmRpbmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2FjaGUgYW5ub3RhdGlvbi4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMuQ2FjaGUgCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2FjaGVDb29yZGluYXRpb25UeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgY2hhbmdlZCBvYmplY3RzIGluY2x1ZGluZyBkYXRhIGFib3V0IHRoZSBjaGFuZ2VzLgotICAgICAgICAgICAqIFRoaXMgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgcmVjZWl2aW5nIGNhY2hlLgotICAgICAgICAgICAqLwotICAgICAgICAgIFNFTkRfT0JKRUNUX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBTZW5kcyBhIGxpc3Qgb2YgdGhlIGlkZW50aXRpZXMgb2YgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGNoYW5nZWQuIAotICAgICAgICAgICAqIFRoZSByZWNlaXZpbmcgY2FjaGUgaW52YWxpZGF0ZXMgdGhlIG9iamVjdHMgKHJhdGhlciB0aGFuIGNoYW5naW5nIAotICAgICAgICAgICAqIGFueSBvZiB0aGUgZGF0YSkKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFNhbWUgYXMgU0VORF9PQkpFQ1RfQ0hBTkdFUyBleGNlcHQgaXQgYWxzbyBpbmNsdWRlcyBhbnkgbmV3bHkKLSAgICAgICAgICAgKiBjcmVhdGVkIG9iamVjdHMgZnJvbSB0aGUgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBEb2VzIG5vIGNhY2hlIGNvb3JkaW5hdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBOT05FCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTkRfT0JKRUNUX0NIQU5HRVMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZS10cmFja2luZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIENoYW5nZVRyYWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAKLSAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY2hhbmdldHJhY2tpbmcuT2JqZWN0Q2hhbmdlUG9saWN5IAotICAgICAgICAgKiB3aGljaCBjb21wdXRlcyBjaGFuZ2VzIHNldHMgZm9yIEVjbGlwc2VMaW5rJ3MgVW5pdE9mV29yayBjb21taXQgCi0gICAgICAgICAqIHByb2Nlc3MuIEFuIE9iamVjdENoYW5nZVBvbGljeSBpcyBzdG9yZWQgb24gYW4gRW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQSBDaGFuZ2VUcmFja2luZyBhbm5vdGF0aW9uIG1heSBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENoYW5nZVRyYWNraW5nIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIGNoYW5nZSB0cmFja2luZyB0byB1c2UuCi0gICAgICAgICAgICovIAotICAgICAgICAgIENoYW5nZVRyYWNraW5nVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmNoYW5nZS10cmFja2luZy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2hhbmdlLXRyYWNraW5nLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIHdpdGhpbiB0aGUgQ2hhbmdlVHJhY2tpbmcgYW5ub3RhdGlvbi4gCi0gICAgICAgICAqLyAKLSAgICAgICAgcHVibGljIGVudW0gQ2hhbmdlVHJhY2tpbmdUeXBlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBbiBBVFRSSUJVVEUgY2hhbmdlIHRyYWNraW5nIHR5cGUgYWxsb3dzIGNoYW5nZSB0cmFja2luZyBhdCB0aGUKLSAgICAgICAgICAgKiBhdHRyaWJ1dGUgbGV2ZWwgb2YgYW4gb2JqZWN0LiBPYmplY3RzIHdpdGggY2hhbmdlZCBhdHRyaWJ1dGVzIHdpbGwKLSAgICAgICAgICAgKiBiZSBwcm9jZXNzZWQgaW4gdGhlIGNvbW1pdCBwcm9jZXNzIHRvIGluY2x1ZGUgYW55IGNoYW5nZXMgaW4gdGhlIAotICAgICAgICAgICAqIHJlc3VsdHMgb2YgdGhlIGNvbW1pdC4gVW5jaGFuZ2VkIG9iamVjdHMgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIEFUVFJJQlVURSwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIEFuIE9CSkVDVCBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGFsbG93cyBhbiBvYmplY3QgdG8gY2FsY3VsYXRlIGZvciAKLSAgICAgICAgICAgKiBpdHNlbGYgd2hldGhlciBpdCBoYXMgY2hhbmdlZC4gQ2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIAotICAgICAgICAgICAqIHRoZSBjb21taXQgcHJvY2VzcyB0byBpbmNsdWRlIGFueSBjaGFuZ2VzIGluIHRoZSByZXN1bHRzIG9mIHRoZSAKLSAgICAgICAgICAgKiBjb21taXQuIFVuY2hhbmdlZCBvYmplY3RzIHdpbGwgYmUgaWdub3JlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPQkpFQ1QsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBBIERFRkVSUkVEIGNoYW5nZSB0cmFja2luZyBwb2xpY3kgZGVmZXJzIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIHRvCi0gICAgICAgICAgICogdGhlIFVuaXRPZldvcmsncyBjaGFuZ2UgZGV0ZWN0aW9uIHByb2Nlc3MuIEVzc2VudGlhbGx5LCB0aGUgCi0gICAgICAgICAgICogY2FsY3VsYXRlQ2hhbmdlcygpIG1ldGhvZCB3aWxsIHJ1biBmb3IgYWxsIG9iamVjdHMgaW4gYSBVbml0T2ZXb3JrLiAKLSAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBkZWZhdWx0IE9iamVjdENoYW5nZVBvbGljeQotICAgICAgICAgICAqLwotICAgICAgICAgIERFRkVSUkVELAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogV2lsbCBub3Qgc2V0IGFueSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5LgotICAgICAgICAgICAqLwotICAgICAgICAgIEFVVE8KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVRUUklCVVRFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPQkpFQ1QiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRFRkVSUkVEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBVVRPIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9taXplciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi0gICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb25maWcuRGVzY3JpcHRvckN1c3RvbWl6ZXIgCi0gICAgICAgICAqIGludGVyZmFjZSBhbmQgaXMgdG8gcnVuIGFnYWluc3QgYW4gZW5ldGl0eSdzIGNsYXNzIGRlc2NyaXB0b3IgYWZ0ZXIgYWxsIAotICAgICAgICAgKiBtZXRhZGF0YSBwcm9jZXNzaW5nIGhhcyBiZWVuIGNvbXBsZXRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogVGhlIEN1c3RvbWl6ZXIgYW5ub3RhdGlvbiBtYXkgYmUgZGVmaW5lZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3MgCi0gICAgICAgICAqIG9yIEVtYmVkZGFibGUgY2xhc3MuIEluIHRoZSBjYXNlIG9mIGluaGVyaXRhbmNlLCBhIEN1c3RvbWl6ZXIgaXMgbm90IAotICAgICAgICAgKiBpbmhlcml0ZWQgZnJvbSBpdHMgcGFyZW50IGNsYXNzZXMuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEN1c3RvbWl6ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciBjdXN0b21pemVyIGNsYXNzIHRoYXQgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHRoZSByZWxhdGVkIGVudGl0eSBvciBlbWJlZGRhYmxlIGNsYXNzLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHZhbHVlKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRpcmVjdGlvbi10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBlbnVtIHRoYXQgaXMgdXNlZCB3aXRoaW4gdGhlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciBhbm5vdGF0aW9uLgotICAgICAgICAgKiBJdCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZSAKLSAgICAgICAgICogcGFyYW1ldGVycyBvZiBhIG5hbWVkIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgZW51bSBEaXJlY3Rpb24gewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIElOLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IHBhcmFtZXRlcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVCwKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIElucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyCi0gICAgICAgICAgICovCi0gICAgICAgICAgSU5fT1VULAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogT3V0cHV0IGN1cnNvcgotICAgICAgICAgICAqLwotICAgICAgICAgIE9VVF9DVVJTT1IKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5fT1VUIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJPVVRfQ1VSU09SIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbWFwcGluZ3MiPgotICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGUgZW50aXR5LW1hcHBpbmdzIGVsZW1lbnQgaXMgdGhlIHJvb3QgZWxlbWVudCBvZiBhIG1hcHBpbmcKLSAgICAgICAgZmlsZS4gSXQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBmb3VyIHR5cGVzIG9mIGVsZW1lbnRzOgotCi0gICAgICAgIDEuIFRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgY29udGFpbnMgbWV0YWRhdGEKLSAgICAgICAgZm9yIHRoZSBlbnRpcmUgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgdW5kZWZpbmVkIGlmIHRoaXMgZWxlbWVudAotICAgICAgICBvY2N1cnMgaW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyB3aXRoaW4gdGhlIHNhbWUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgCi0gICAgICAgIDIuIFRoZSBwYWNrYWdlLCBzY2hlbWEsIGNhdGFsb2cgYW5kIGFjY2VzcyBlbGVtZW50cyBhcHBseSB0byBhbGwgb2YKLSAgICAgICAgdGhlIGVudGl0eSwgbWFwcGVkLXN1cGVyY2xhc3MgYW5kIGVtYmVkZGFibGUgZWxlbWVudHMgZGVmaW5lZCBpbgotICAgICAgICB0aGUgc2FtZSBmaWxlIGluIHdoaWNoIHRoZXkgb2NjdXIuCi0KLSAgICAgICAgMy4gVGhlIHNlcXVlbmNlLWdlbmVyYXRvciwgdGFibGUtZ2VuZXJhdG9yLCBuYW1lZC1xdWVyeSwKLSAgICAgICAgbmFtZWQtbmF0aXZlLXF1ZXJ5IGFuZCBzcWwtcmVzdWx0LXNldC1tYXBwaW5nIGVsZW1lbnRzIGFyZSBnbG9iYWwKLSAgICAgICAgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIEl0IGlzIHVuZGVmaW5lZCB0byBoYXZlIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgc2VxdWVuY2UtZ2VuZXJhdG9yIG9yIHRhYmxlLWdlbmVyYXRvciBvZiB0aGUgc2FtZSBuYW1lIGluIHRoZSBzYW1lCi0gICAgICAgIG9yIGRpZmZlcmVudCBtYXBwaW5nIGZpbGVzIGluIGEgcGVyc2lzdGVuY2UgdW5pdC4gSXQgaXMgYWxzbyAKLSAgICAgICAgdW5kZWZpbmVkIHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBuYW1lZC1xdWVyeSwgbmFtZWQtbmF0aXZlLXF1ZXJ5LCBvcgotICAgICAgICByZXN1bHQtc2V0LW1hcHBpbmcgb2YgdGhlIHNhbWUgbmFtZSBpbiB0aGUgc2FtZSBvciBkaWZmZXJlbnQgbWFwcGluZyAKLSAgICAgICAgZmlsZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LgotCi0gICAgICAgIDQuIFRoZSBlbnRpdHksIG1hcHBlZC1zdXBlcmNsYXNzIGFuZCBlbWJlZGRhYmxlIGVsZW1lbnRzIGVhY2ggZGVmaW5lCi0gICAgICAgIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIG1hbmFnZWQgcGVyc2lzdGVudCBjbGFzcy4gVGhlIG1hcHBpbmcKLSAgICAgICAgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZXNlIGVsZW1lbnRzIG1heSBiZSBjb21wbGV0ZSBvciBpdCBtYXkKLSAgICAgICAgYmUgcGFydGlhbC4KLQotICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIgCi0gICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2FnZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbmFudC1kaXNjcmltaW5hdG9yLWNvbHVtbiIgdHlwZT0ib3JtOnRlbmFudC1kaXNjcmltaW5hdG9yLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnNlcXVlbmNlLWdlbmVyYXRvciIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLWdlbmVyYXRvciIgdHlwZT0ib3JtOnRhYmxlLWdlbmVyYXRvciIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpwYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJlcGxpY2F0aW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cm91bmQtcm9iaW4tcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5uZWQtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGlubmVkLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cmFuZ2UtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imhhc2gtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06aGFzaC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaW9uLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnVuaW9uLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1xdWVyeSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1uYXRpdmUtcXVlcnkiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1wbHNxbC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcGxzcWwtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcGxzcWwtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC1yZWNvcmQiIHR5cGU9Im9ybTpwbHNxbC1yZWNvcmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsc3FsLXRhYmxlIiB0eXBlPSJvcm06cGxzcWwtdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwcGVkLXN1cGVyY2xhc3MiIHR5cGU9Im9ybTptYXBwZWQtc3VwZXJjbGFzcyIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHkiIHR5cGU9Im9ybTplbnRpdHkiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkYWJsZSIgdHlwZT0ib3JtOmVtYmVkZGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06c3VwcG9ydGVkLXZlcnNpb25zLXR5cGUiIAotICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iMi4zIiB1c2U9Im9wdGlvbmFsIi8+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDwveHNkOmVsZW1lbnQ+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIEV4aXN0ZW5jZUNoZWNraW5nIGFubm90YXRpb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIAotICAgICAgICAgKiBjaGVja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgZW50aXRpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBbiBleGlzdGVuY2UtY2hlY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24gYW4gRW50aXR5IG9yIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFubm90YXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFeGlzdGVuY2VDaGVja2luZyB7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNldCB0aGUgZXhpc3RlbmNlIGNoZWNrIGZvciBkZXRlcm1pbmluZwotICAgICAgICAgICAqIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRXhpc3RlbmNlVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQ0hFQ0tfQ0FDSEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgaWYgdGhlIG9iamVjdHMgcHJpbWFyeSBrZXkgZG9lcyBub3QgaW5jbHVkZSBudWxsIGFuZCAKLSAgICAgICAgICogaXQgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIGl0IG11c3QgZXhpc3QuCi0gICAgICAgICAqLwotICAgICAgICBDSEVDS19DQUNIRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybSBkb2VzIGV4aXN0IGNoZWNrIG9uIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIENIRUNLX0RBVEFCQVNFLAotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBc3N1bWUgdGhhdCBpZiB0aGUgb2JqZWN0cyBwcmltYXJ5IGtleSBkb2VzIG5vdCBpbmNsdWRlIG51bGwgdGhlbiAKLSAgICAgICAgICogaXQgbXVzdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gZ3VhcmFudGVlcyBvciAKLSAgICAgICAgICogZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLgotICAgICAgICAgKi8KLSAgICAgICAgQVNTVU1FX0VYSVNURU5DRSwKLQotICAgICAgICAvKioKLSAgICAgICAgICogQXNzdW1lIHRoYXQgdGhlIG9iamVjdCBkb2VzIG5vdCBleGlzdC4gVGhpcyBtYXkgYmUgdXNlZCBpZiB0aGUgCi0gICAgICAgICAqIGFwcGxpY2F0aW9uIGd1YXJhbnRlZXMgb3IgZG9lcyBub3QgY2FyZSBhYm91dCB0aGUgZXhpc3RlbmNlIGNoZWNrLiAgCi0gICAgICAgICAqIFRoaXMgd2lsbCBhbHdheXMgZm9yY2UgYW4gaW5zZXJ0IHRvIGJlIGNhbGxlZC4KLSAgICAgICAgICovCi0gICAgICAgIEFTU1VNRV9OT05fRVhJU1RFTkNFCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4gICAgCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQ0hFQ0tfQ0FDSEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNIRUNLX0RBVEFCQVNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfRVhJU1RFTkNFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBU1NVTUVfTk9OX0VYSVNURU5DRSIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPiAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgTWV0YWRhdGEgdGhhdCBhcHBsaWVzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBub3QganVzdCB0byAKLSAgICAgICAgdGhlIG1hcHBpbmcgZmlsZSBpbiB3aGljaCBpdCBpcyBjb250YWluZWQuIAotCi0gICAgICAgIElmIHRoZSB4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSBlbGVtZW50IGlzIHNwZWNpZmllZCwKLSAgICAgICAgdGhlIGNvbXBsZXRlIHNldCBvZiBtYXBwaW5nIG1ldGFkYXRhIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdCAKLSAgICAgICAgaXMgY29udGFpbmVkIGluIHRoZSBYTUwgbWFwcGluZyBmaWxlcyBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdWRlLWRlZmF1bHQtbWFwcGluZ3MiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPiAgICAgICAgICAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06cGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoZXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGFzIGEgd2hvbGUgCi0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBvdmVycmlkZGVuIGJ5IGxvY2FsIGFubm90YXRpb24gb3IgWE1MIAotICAgICAgICBlbGVtZW50IHNldHRpbmdzLiAKLSAgICAgICAgCi0gICAgICAgIHNjaGVtYSAtIFVzZWQgYXMgdGhlIHNjaGVtYSBmb3IgYWxsIHRhYmxlcywgc2Vjb25kYXJ5IHRhYmxlcywgam9pbgotICAgICAgICAgICAgdGFibGVzLCBjb2xsZWN0aW9uIHRhYmxlcywgc2VxdWVuY2UgZ2VuZXJhdG9ycywgYW5kIHRhYmxlIAotICAgICAgICAgICAgZ2VuZXJhdG9ycyB0aGF0IGFwcGx5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0gICAgICAgIGNhdGFsb2cgLSBVc2VkIGFzIHRoZSBjYXRhbG9nIGZvciBhbGwgdGFibGVzLCBzZWNvbmRhcnkgdGFibGVzLCBqb2luCi0gICAgICAgICAgICB0YWJsZXMsIGNvbGxlY3Rpb24gdGFibGVzLCBzZXF1ZW5jZSBnZW5lcmF0b3JzLCBhbmQgdGFibGUgCi0gICAgICAgICAgICBnZW5lcmF0b3JzIHRoYXQgYXBwbHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgZGVsaW1pdGVkLWlkZW50aWZpZXJzIC0gVXNlZCB0byB0cmVhdCBkYXRhYmFzZSBpZGVudGlmaWVycyBhcwotICAgICAgICAgICAgZGVsaW1pdGVkIGlkZW50aWZpZXJzLgotICAgICAgICBhY2Nlc3MgLSBVc2VkIGFzIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbgotICAgICAgICAgICAgdGhlIHBlcnNpc3RlbmNlIHVuaXQKLSAgICAgICAgY2FzY2FkZS1wZXJzaXN0IC0gQWRkcyBjYXNjYWRlLXBlcnNpc3QgdG8gdGhlIHNldCBvZiBjYXNjYWRlIG9wdGlvbnMKLSAgICAgICAgICAgIGluIGFsbCBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotICAgICAgICBlbnRpdHktbGlzdGVuZXJzIC0gTGlzdCBvZiBkZWZhdWx0IGVudGl0eSBsaXN0ZW5lcnMgdG8gYmUgaW52b2tlZCAKLSAgICAgICAgICAgIG9uIGVhY2ggZW50aXR5IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiAKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlbGltaXRlZC1pZGVudGlmaWVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJvcm06ZW1wdHlUeXBlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06dGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIERlZmluZXMgdGhlIHNldHRpbmdzIGFuZCBtYXBwaW5ncyBmb3IgYW4gZW50aXR5LiBJcyBhbGxvd2VkIHRvIGJlCi0gICAgICAgIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhbm5vdGF0aW9ucy4KLSAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIG1ldGFkYXRhLWNvbXBsZXRlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byAKLSAgICAgICAgaW5kaWNhdGUgdGhhdCBubyBhbm5vdGF0aW9ucyBvbiB0aGUgZW50aXR5IGNsYXNzIChhbmQgaXRzIGZpZWxkcwotICAgICAgICBvciBwcm9wZXJ0aWVzKSBhcmUgdG8gYmUgcHJvY2Vzc2VkLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gCi0gICAgICAgIHRoZSBkZWZhdWx0aW5nIHJ1bGVzIGZvciB0aGUgZW50aXR5IGFuZCBpdHMgc3ViZWxlbWVudHMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KFRZUEUpIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGl0ZW5hbnQiIHR5cGU9Im9ybTptdWx0aXRlbmFudCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWRkaXRpb25hbC1jcml0ZXJpYSIgdHlwZT0ib3JtOmFkZGl0aW9uYWwtY3JpdGVyaWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImN1c3RvbWl6ZXIiIHR5cGU9Im9ybTpjdXN0b21pemVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjaGFuZ2UtdHJhY2tpbmciIHR5cGU9Im9ybTpjaGFuZ2UtdHJhY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJvcm06dGFibGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlY29uZGFyeS10YWJsZSIgdHlwZT0ib3JtOnNlY29uZGFyeS10YWJsZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdCIgdHlwZT0ib3JtOnN0cnVjdCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpwcmltYXJ5LWtleS1qb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUtb24tZGVsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImlkLWNsYXNzIiB0eXBlPSJvcm06aWQtY2xhc3MiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5IiB0eXBlPSJvcm06cHJpbWFyeS1rZXkiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaGVyaXRhbmNlIiB0eXBlPSJvcm06aW5oZXJpdGFuY2UiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdmFsdWUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06ZGlzY3JpbWluYXRvci1jb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ib3JtOmNsYXNzLWV4dHJhY3RvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIiB0eXBlPSJvcm06b3B0aW1pc3RpYy1sb2NraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZSIgdHlwZT0ib3JtOmNhY2hlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1pbnRlcmNlcHRvciIgdHlwZT0ib3JtOmNhY2hlLWludGVyY2VwdG9yIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1wbHNxbC1zdG9yZWQtcHJvY2VkdXJlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVkLXBsc3FsLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXBsc3FsLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsc3FsLXJlY29yZCIgdHlwZT0ib3JtOnBsc3FsLXJlY29yZCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsc3FsLXRhYmxlIiB0eXBlPSJvcm06cGxzcWwtdGFibGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwtcmVzdWx0LXNldC1tYXBwaW5nIiAKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06c3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIiB0eXBlPSJvcm06cXVlcnktcmVkaXJlY3RvcnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LWxpc3RlbmVycyIgdHlwZT0ib3JtOmVudGl0eS1saXN0ZW5lcnMiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpncm91cCBuYW1lPSJwYXJ0aXRpb25pbmctZ3JvdXAiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFydGl0aW9uaW5nIiB0eXBlPSJvcm06cGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTpyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGlubmVkLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnBpbm5lZC1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJhbmdlLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOnJhbmdlLXBhcnRpdGlvbmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIiB0eXBlPSJvcm06dmFsdWUtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyIgdHlwZT0ib3JtOmhhc2gtcGFydGl0aW9uaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciIHR5cGU9Im9ybTp1bmlvbi1wYXJ0aXRpb25pbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcnRpdGlvbmVkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Z3JvdXA+Ci0gICAgICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAgIAotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iYWNjZXNzLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBUaGlzIGVsZW1lbnQgZGV0ZXJtaW5lcyBob3cgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIGFjY2Vzc2VzIHRoZQotICAgICAgICBzdGF0ZSBvZiBhbiBlbnRpdHkgb3IgZW1iZWRkZWQgb2JqZWN0LgotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkZJRUxEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJWSVJUVUFMIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEpvaW5Db2x1bW5bXSBqb2luQ29sdW1ucygpIGRlZmF1bHR7fTsKLSAgICAgICAgICBKb2luVGFibGUgam9pblRhYmxlKCkgZGVmYXVsdCBASm9pblRhYmxlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBDb2x1bW4gY29sdW1uKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIFRoaXMgZWxlbWVudCBjb250YWlucyB0aGUgZW50aXR5IGZpZWxkIG9yIHByb3BlcnR5IG1hcHBpbmdzLgotICAgICAgICBJdCBtYXkgYmUgc3BhcnNlbHkgcG9wdWxhdGVkIHRvIGluY2x1ZGUgb25seSBhIHN1YnNldCBvZiB0aGUKLSAgICAgICAgZmllbGRzIG9yIHByb3BlcnRpZXMuIElmIG1ldGFkYXRhLWNvbXBsZXRlIGZvciB0aGUgZW50aXR5IGlzIHRydWUKLSAgICAgICAgdGhlbiB0aGUgcmVtYWluZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpbGwgYmUgZGVmYXVsdGVkIGFjY29yZGluZwotICAgICAgICB0byB0aGUgZGVmYXVsdCBydWxlcy4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZCIgdHlwZT0ib3JtOmlkIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVtYmVkZGVkLWlkIiB0eXBlPSJvcm06ZW1iZWRkZWQtaWQiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMiIHR5cGU9Im9ybTpiYXNpYyIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzaWMtY29sbGVjdGlvbiIgdHlwZT0ib3JtOmJhc2ljLWNvbGxlY3Rpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNpYy1tYXAiIHR5cGU9Im9ybTpiYXNpYy1tYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJvcm06dmVyc2lvbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1vbmUiIHR5cGU9Im9ybTptYW55LXRvLW9uZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW1hbnkiIHR5cGU9Im9ybTpvbmUtdG8tbWFueSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib25lLXRvLW9uZSIgdHlwZT0ib3JtOm9uZS10by1vbmUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUiIHR5cGU9Im9ybTp2YXJpYWJsZS1vbmUtdG8tb25lIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFueS10by1tYW55IiB0eXBlPSJvcm06bWFueS10by1tYW55IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIiB0eXBlPSJvcm06ZWxlbWVudC1jb2xsZWN0aW9uIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW1iZWRkZWQiIHR5cGU9Im9ybTplbWJlZGRlZCIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNmb3JtYXRpb24iIHR5cGU9Im9ybTp0cmFuc2Zvcm1hdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIgdHlwZT0ib3JtOnRyYW5zaWVudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ib3JtOnN0cnVjdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFycmF5IiB0eXBlPSJvcm06YXJyYXkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBCYXNpYyB7Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2IiIHR5cGU9Im9ybTpsb2IiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZXR1cm4taW5zZXJ0IiB0eXBlPSJvcm06cmV0dXJuLWluc2VydCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuLXVwZGF0ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJiYXNpYy1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNDb2xsZWN0aW9uIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgd2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IAotICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICogc3RyYXRlZ3kgaXMgYSByZXF1aXJlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZSB0aGF0IAotICAgICAgICAgICAqIHRoZSB2YWx1ZSBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIExBWlkgc3RyYXRlZ3kgaXMgYSBoaW50IHRvIAotICAgICAgICAgICAqIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAKLSAgICAgICAgICAgKiBMQVpZLgotICAgICAgICAgICAqLwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdmFsdWUgY29sdW1uIHRoYXQgaG9sZHMgdGhlIGRpcmVjdCAKLSAgICAgICAgICAgKiBjb2xsZWN0aW9uIGRhdGEuIERlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBuYW1lLgotICAgICAgICAgICAqLwotICAgICAgICAgIENvbHVtbiB2YWx1ZUNvbHVtbigpIGRlZmF1bHQgQENvbHVtbjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbGxlY3Rpb24tdGFibGUiIHR5cGU9Im9ybTplY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzaWMtbWFwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmFzaWNNYXAgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgb3IgcHJvcGVydHkgCi0gICAgICAgICAgICogc2hvdWxkIGJlIGxhemlseSBsb2FkZWQgb3IgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBFQUdFUiAKLSAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIHRoYXQgCi0gICAgICAgICAgICogdGhlIHZhbHVlIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgTEFaWSBzdHJhdGVneSBpcyBhIGhpbnQgdG8gCi0gICAgICAgICAgICogdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIAotICAgICAgICAgICAqIExBWlkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBMQVpZOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgZGF0YSBjb2x1bW4gdGhhdCBob2xkcyB0aGUgZGlyZWN0IG1hcCAKLSAgICAgICAgICAgKiBrZXkuIElmIHRoZSBuYW1lIG9uIHRlIGtleSBjb2x1bW4gaXMgIiIsIHRoZSBuYW1lIHdpbGwgZGVmYXVsdCB0bzoKLSAgICAgICAgICAgKiB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgb3IgZmllbGQ7ICJfS0VZIi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4ga2V5Q29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSBrZXkgY29udmVydGVyLiBEZWZhdWx0IGlzIGVxdWl2YWxlbnQgdG8gCi0gICAgICAgICAgICogc3BlY2lmeWluZyBAQ29udmVydCgibm9uZSIpLCBtZWFuaW5nIG5vIGNvbnZlcnRlciB3aWxsIGJlIGFkZGVkIHRvIAotICAgICAgICAgICAqIHRoZSBkaXJlY3QgbWFwIGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJ0IGtleUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBkYXRhIGNvbHVtbiB0aGF0IGhvbGRzIHRoZSBkaXJlY3QgCi0gICAgICAgICAgICogY29sbGVjdGlvbiBkYXRhLiBEZWZhdWx0cyB0byB0aGUgcHJvcGVydHkgb3IgZmllbGQgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW4gdmFsdWVDb2x1bW4oKSBkZWZhdWx0IEBDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHZhbHVlIGNvbnZlcnRlci4gRGVmYXVsdCBpcyBlcXVpdmFsZW50IHRvIAotICAgICAgICAgICAqIHNwZWNpZnlpbmcgQENvbnZlcnQoIm5vbmUiKSwgbWVhbmluZyBubyBjb252ZXJ0ZXIgd2lsbCBiZSBhZGRlZCB0byAKLSAgICAgICAgICAgKiB0aGUgdmFsdWUgY29sdW1uIG1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ29udmVydCB2YWx1ZUNvbnZlcnRlcigpIGRlZmF1bHQgQENvbnZlcnQ7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+ICAgIAotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlLWNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIyIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPiAgICAKLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2xsZWN0aW9uLXRhYmxlIiB0eXBlPSJvcm06ZWNsaXBzZWxpbmstY29sbGVjdGlvbi10YWJsZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0ib3JtOmpvaW4tZmV0Y2gtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtZmV0Y2giIHR5cGU9Im9ybTpiYXRjaC1mZXRjaCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhc2NhZGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIENhc2NhZGVUeXBlIHsgQUxMLCBQRVJTSVNULCBNRVJHRSwgUkVNT1ZFLCBSRUZSRVNILCBERVRBQ0h9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLWFsbCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXBlcnNpc3QiIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1kZXRhY2giIHR5cGU9Im9ybTplbXB0eVR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWV4dHJhY3RvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIENsYXNzRXh0cmFjdG9yIGFsbG93cyBmb3IgYSB1c2VyIGRlZmluZWQgY2xhc3MgaW5kaWNhdG9yIGluIHBsYWNlIG9mIAotICAgICAgICAgKiBwcm92aWRpbmcgYSBkaXNjcmltaW5hdG9yIGNvbHVtbi4gVGhlIGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLQotICAgICAgICAgKiAgLSBJdCBtdXN0IGV4dGVuZCB0aGUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuQ2xhc3NFeHRyYWN0b3IgCi0gICAgICAgICAqICAgIGNsYXNzIGFuZCBpbXBsZW1lbnQgdGhlIGV4dHJhY3RDbGFzc0Zyb21Sb3coUmVjb3JkLCBTZXNzaW9uKSBtZXRob2QuIAotICAgICAgICAgKiAgLSBUaGF0IG1ldGhvZCBtdXN0IHRha2UgYSBkYXRhYmFzZSByb3cgKGEgUmVjb3JkL01hcCkgYXMgYW4gYXJndW1lbnQgYW5kIAotICAgICAgICAgKiAgICBtdXN0IHJldHVybiB0aGUgY2xhc3MgdG8gdXNlIGZvciB0aGF0IHJvdy4gCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIHVzZWQgdG8gZGVjaWRlIHdoaWNoIGNsYXNzIHRvIGluc3RhbnRpYXRlIHdoZW4gcmVhZGluZyAKLSAgICAgICAgICogZnJvbSB0aGUgZGF0YWJhc2UuIEl0IGlzIHRoZSBhcHBsaWNhdGlvbidzIHJlc3BvbnNpYmlsaXR5IHRvIHBvcHVsYXRlIGFueSAKLSAgICAgICAgICogdHlwaW5nIGluZm9ybWF0aW9uIGluIHRoZSBkYXRhYmFzZSByZXF1aXJlZCB0byBkZXRlcm1pbmUgdGhlIGNsYXNzIGZyb20gdGhlIAotICAgICAgICAgKiByb3cuCi0gICAgICAgICAqIAotICAgICAgICAgKiBUaGUgQ2xhc3NFeHRyYWN0b3IgbXVzdCBvbmx5IGJlIHNldCBvbiB0aGUgcm9vdCBvZiBhbiBlbnRpdHkgY2xhc3Mgb3IKLSAgICAgICAgICogc3ViLWhpZXJhcmNoeSBpbiB3aGljaCBhIGRpZmZlcmVudCBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyBhcHBsaWVkLiBUaGUgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgU0lOR0xFX1RBQkxFIGFuZCBKT0lORUQgaW5oZXJpdGFuY2UgCi0gICAgICAgICAqIHN0cmF0ZWdpZXMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBJZiBhIENsYXNzRXh0cmFjdG9yIGlzIHVzZWQgdGhlbiBhIERpc2NyaW1pbmF0b3JDb2x1bW4gY2Fubm90IGJlIHVzZWQuIEEgCi0gICAgICAgICAqIENsYXNzRXh0cmFjdG9yIGFsc28gY2Fubm90IGJlIHVzZWQgb24gZWl0aGVyIHRoZSByb290IG9yIGl0cyBzdWJjbGFzc2VzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSW4gYWRkaXRpb24sIGZvciBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbnMgdXNpbmcgYSBDbGFzc0V4dHJhY3RvciBhbmQgYSAKLSAgICAgICAgICogU0lOR0xFX1RBQkxFIHN0cmF0ZWd5LCB0aGUgZGVzY3JpcHRvcidzIHdpdGhBbGxTdWJjbGFzc2VzIGFuZCBvbmx5SW5zdGFuY2VzIAotICAgICAgICAgKiBleHByZXNzaW9ucyBzaG91bGQgYmUgc2V0IHRocm91Z2ggdGhlIENsYXNzRXh0cmFjdG9yJ3MgaW5pdGlhbGl6ZSBtZXRob2QuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0V2l0aEFsbFN1YmNsYXNzZXNFeHByZXNzaW9uKEV4cHJlc3Npb24pCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuSW5oZXJpdGFuY2VQb2xpY3kuc2V0T25seUluc3RhbmNlc0V4cHJlc3Npb24oRXhwcmVzc2lvbikKLSAgICAgICAgICogCi0gICAgICAgICAqIEBhdXRob3IgR3V5IFBlbGxldGllcgotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4xIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsYXNzRXh0cmFjdG9yIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBEZWZpbmVzIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBleHRyYWN0b3IgdGhhdCBzaG91bGQgYmUgCi0gICAgICAgICAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZW50aXR5J3MgZGVzY3JpcHRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgdmFsdWUoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ2xvbmVDb3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNsb25lQ29weVBvbGljeSBvbiBhbiAKLSAgICAgICAgICogRW50aXR5LiBBIENsb25lQ29weVBvbGljeSBtdXN0IHNwZWNpZnkgYXQgb25lIG9yIGJvdGggb2YgdGhlICJtZXRob2QiIAotICAgICAgICAgKiBvciAid29ya2luZ0NvcHlNZXRob2QiLiAid29ya2luZ0NvcHlNZXRob2QiIGlzIHVzZWQgdG8gY2xvbmUgb2JqZWN0cyAKLSAgICAgICAgICogdGhhdCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSB1c2VyIGFzIHRoZXkgYXJlIHJlZ2lzdGVyZWQgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgdHJhbnNhY3Rpb25hbCBtZWNoYW5pc20sIHRoZSBVbml0T2ZXb3JrLiAibWV0aG9kIiB3aWxsIAotICAgICAgICAgKiBiZSB1c2VkIGZvciB0aGUgY2xvbmUgdGhhdCBpcyB1c2VkIGZvciBjb21wYXJpc29uIGluIGNvbmp1bmN0aW9uIHdpdGggCi0gICAgICAgICAqIEVjbGlwc2VMaW5rJ3MgRGVmZXJyZWRDaGFuZ2VEZXRlY3Rpb25Qb2xpY3kKLSAgICAgICAgICogIAotICAgICAgICAgKiBBIENsb25lQ29weVBvbGljeSBzaG91bGQgYmUgc3BlY2lmaWVkIG9uIGFuIEVudGl0eSwgTWFwcGVkU3VwZXJjbGFzcwotICAgICAgICAgKiBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KG1ldGhvZD0ibXlDbG9uZU1ldGhvZCIpCi0gICAgICAgICAqIAotICAgICAgICAgKiBvcjoKLSAgICAgICAgICogCi0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENsb25lQ29weVBvbGljeShtZXRob2Q9Im15Q2xvbmVNZXRob2QiLCB3b3JraW5nQ29weU1ldGhvZD0ibXlXb3JraW5nQ29weUNsb25lTWV0aG9kIikKLSAgICAgICAgICogCi0gICAgICAgICAqIG9yOgotICAgICAgICAgKiAKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBAQ2xvbmVDb3B5UG9saWN5KHdvcmtpbmdDb3B5TWV0aG9kTmFtZT0ibXlXb3JraW5nQ29weUNsb25lIikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsb25lQ29weVBvbGljeSB7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKQotICAgICAgICAgICAgICogRWl0aGVyIG1ldGhvZCBvciB3b3JraW5nQ29weU1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCB0aGlzIGRlZmluZXMgCi0gICAgICAgICAgICAgKiBhIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBjbG9uZSB0aGF0IHdpbGwgYmUgdXNlZCAKLSAgICAgICAgICAgICAqIGZvciBjb21wYXJpc29uIGJ5Ci0gICAgICAgICAgICAgKiBFY2xpcHNlTGluaydzIERlZmVycmVkQ2hhbmdlRGV0ZWN0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKTsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpCi0gICAgICAgICAgICAgKiBFaXRoZXIgbWV0aG9kIG9yIHdvcmtpbmdDb3B5TWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkCi0gICAgICAgICAgICAgKiB0aGlzIGRlZmluZXMgYSBtZXRob2QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIGEgY2xvbmUgdGhhdCAKLSAgICAgICAgICAgICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIG9iamVjdCByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIAotICAgICAgICAgICAgICogT2JqZWN0IGluIGFuIEVjbGlwc2VMaW5rIFVuaXRPZldvcmsKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHdvcmtpbmdDb3B5TWV0aG9kKCk7Ci0KLSAgICAgICAgfQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9IndvcmtpbmctY29weS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sbGVjdGlvbi10YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZSB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgc2NoZW1hKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBKb2luQ29sdW1uW10gam9pbkNvbHVtbnMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIFVuaXF1ZUNvbnN0cmFpbnRbXSB1bmlxdWVDb25zdHJhaW50cygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi1jb2x1bW4iIHR5cGU9Im9ybTpqb2luLWNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVuaXF1ZS1jb25zdHJhaW50IiB0eXBlPSJvcm06dW5pcXVlLWNvbnN0cmFpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0YWxvZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjaGVtYSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNyZWF0aW9uLXN1ZmZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlY2xpcHNlbGluay1jb2xsZWN0aW9uLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRhYmxlLiBJZiBpdCBpcyBub3QgCi0gICAgICAgICAgICogc3BlY2lmaWVkLCBpdCBpcyBkZWZhdWx0ZWQgdG8gdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIGZvbGxvd2luZzogCi0gICAgICAgICAgICogdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBlbnRpdHk7ICJfIiA7IHRoZSBuYW1lIG9mIHRoZSByZWxhdGlvbnNoaXAgCi0gICAgICAgICAgICogcHJvcGVydHkgb3IgZmllbGQgb2YgdGhlIHNvdXJjZSBlbnRpdHkuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNhdGFsb2cgb2YgdGhlIHRhYmxlLiBJdCBkZWZhdWx0cyB0byB0aGUgcGVyc2lzdGVuY2UgCi0gICAgICAgICAgICogdW5pdCBkZWZhdWx0IGNhdGFsb2cuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHNjaGVtYSBvZiB0aGUgdGFibGUuIEl0IGRlZmF1bHRzIHRvIHRoZSBwZXJzaXN0ZW5jZSAKLSAgICAgICAgICAgKiB1bml0IGRlZmF1bHQgc2NoZW1hLgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVXNlZCB0byBzcGVjaWZ5IGEgcHJpbWFyeSBrZXkgY29sdW1uIHRoYXQgaXMgdXNlZCBhcyBhIAotICAgICAgICAgICAqIGZvcmVpZ24ga2V5IHRvIGpvaW4gdG8gYW5vdGhlciB0YWJsZS4gSWYgdGhlIHNvdXJjZSBlbnRpdHkgdXNlcyBhIAotICAgICAgICAgICAqIGNvbXBvc2l0ZSBwcmltYXJ5IGtleSwgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBtdXN0IGJlIHNwZWNpZmllZCAKLSAgICAgICAgICAgKiBmb3IgZWFjaCBmaWVsZCBvZiB0aGUgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJbiBhIHNpbmdsZSBwcmltYXJ5IAotICAgICAgICAgICAqIGtleSBjYXNlLCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG1heSBvcHRpb25hbGx5IGJlIHNwZWNpZmllZC4gCi0gICAgICAgICAgICogRGVmYXVsdGluZyB3aWxsIGFwcGx5IG90aGVyd2lzZSBhcyBmb2xsb3dzOgotICAgICAgICAgICAqIG5hbWUsIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHByaW1hcnkga2V5IGNvbHVtbiBvZiB0aGUgcHJpbWFyeSB0YWJsZSAKLSAgICAgICAgICAgKiBvZiB0aGUgc291cmNlIGVudGl0eS4gcmVmZXJlbmNlZENvbHVtbk5hbWUsIHRoZSBzYW1lIG5hbWUgb2YgCi0gICAgICAgICAgICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSBwcmltYXJ5IHRhYmxlIG9mIHRoZSBzb3VyY2UgZW50aXR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsgCi0gCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBVbmlxdWUgY29uc3RyYWludHMgdGhhdCBhcmUgdG8gYmUgcGxhY2VkIG9uIHRoZSB0YWJsZS4gCi0gICAgICAgICAgICogVGhlc2UgYXJlIG9ubHkgdXNlZCBpZiB0YWJsZSBnZW5lcmF0aW9uIGlzIGluIGVmZmVjdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OyAKLSAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiB0eXBlPSJvcm06cHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4gbnVsbGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICBpbnQgcHJlY2lzaW9uKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHByZWNpc2lvbgotICAgICAgICAgIGludCBzY2FsZSgpIGRlZmF1bHQgMDsgLy8gZGVjaW1hbCBzY2FsZQotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDppbnQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb252ZXJzaW9uVmFsdWUgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgU3BlY2lmeSB0aGUgZGF0YWJhc2UgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRhdGFWYWx1ZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBTcGVjaWZ5IHRoZSBvYmplY3QgdmFsdWUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG9iamVjdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGEtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgYWNyb3NzIAotICAgICAgICAgICAqIHRoZSB3aG9sZSBwZXJzaXN0ZW5jZSB1bml0LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBjb252ZXJ0ZXIgY2xhc3MgdG8gYmUgdXNlZC4gVGhpcyBjbGFzcyBtdXN0IGltcGxlbWVudAotICAgICAgICAgICAqIHRoZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5jb252ZXJ0ZXJzLkNvbnZlcnRlciBpbnRlcmZhY2UuCi0gICAgICAgICAgICovCi0gICAgICAgICAgQ2xhc3MgY29udmVydGVyQ2xhc3MoKTsgCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogQSBQYXJ0aXRpb25pbmcgaXMgdXNlZCB0byBwYXJ0aXRpb24gdGhlIGRhdGEgZm9yIGEgY2xhc3MgYWNyb3NzIG11bHRpcGxlIGRpZmZlcmVuY2UgZGF0YWJhc2VzCi0gICAgICAgICAgICAgKiBvciBhY3Jvc3MgYSBkYXRhYmFzZSBjbHVzdGVyIHN1Y2ggYXMgT3JhY2xlIFJBQy4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gcHJvdmlkZSBpbXByb3ZlZCBzY2FsYWJpbGl0eSBieSBhbGxvd2luZyBtdWx0aXBsZSBkYXRhYmFzZSBtYWNoaW5lcyB0byBzZXJ2aWNlIHJlcXVlc3RzLgotICAgICAgICAgICAgICogVGhpcyBhbm5vdGF0aW9uIGNvbmZpZ3VyZXMgYSBjdXN0b20gUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBJZiBtdWx0aXBsZSBwYXJ0aXRpb25zIGFyZSB1c2VkIHRvIHByb2Nlc3MgYSBzaW5nbGUgdHJhbnNhY3Rpb24sIEpUQSBzaG91bGQgYmUgdXNlZCBmb3IgcHJvcGVyIFhBIHRyYW5zYWN0aW9uIHN1cHBvcnQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgICAqIFBhcnRpdGlvbiBwb2xpY2llcyBhcmUgZ2xvYmFsbHkgbmFtZWQgdG8gYWxsb3cgcmV1c2UsCi0gICAgICAgICAgICAgKiB0aGUgcGFydGl0aW9uaW5nIHBvbGljeSBtdXN0IGFsc28gYmUgc2V0IHVzaW5nIHRoZSBAUGFydGl0aW9uZWQgYW5ub3RhdGlvbiB0byBiZSB1c2VkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBAc2VlIFBhcnRpdGlvbmVkCi0gICAgICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5QYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIEZ1bGwgcGFja2FnZS5jbGFzcyBuYW1lIG9mIGEgc3ViY2xhc3Mgb2YgUGFydGl0aW9uaW5nUG9saWN5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENsYXNzIHBhcnRpdGlvbmluZ0NsYXNzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoYXNoLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBIYXNoUGFydGl0aW9uaW5nIHBhcnRpdGlvbnMgYWNjZXNzIHRvIGEgZGF0YWJhc2UgY2x1c3RlciBieSB0aGUgaGFzaCBvZiBhIGZpZWxkIHZhbHVlIGZyb20gdGhlIG9iamVjdCwKLSAgICAgICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAgICAgKiBUaGUgaGFzaCBpbmRleGVzIGludG8gdGhlIGxpc3Qgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCBoYXNoIHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgICAgICogdG8gYWxsIHNlcnZlcidzIGFuZCB1bmlvbmVkLCBvciBsZWZ0IHRvIHRoZSBzZXNpb24ncyBkZWZhdWx0IGJlaGF2aW9yLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLkhhc2hQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBIYXNoUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIHRhYmxlIGNvbHVtbiBuYW1lLCBub3QgdGhlIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLgotICAgICAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgY29udGFpbiB0aGUgZmllbGQgdGhlIHF1ZXJ5IHdpbGwgbm90IGJlIHBhcnRpdGlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIHBhcnRpdGlvbiBhY3Jvc3MuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nW10gY29ubmVjdGlvblBvb2xzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBEZWZpbmVzIGlmIHF1ZXJpZXMgdGhhdCBkbyBub3QgY29udGFpbiB0aGUgcGFydGl0aW9uIGZpZWxkIHNob3VsZCBiZSBzZW50Ci0gICAgICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gdW5pb25VbnBhcnRpdGlvbmFibGVRdWVyaWVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmFuZ2UtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeSBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGlkLCBsb2NhdGlvbiwgb3IgdGVuYW50LgotICAgICAgICAgKiBFYWNoIHNlcnZlciBpcyBhc3NpZ25lZCBhIHJhbmdlIG9mIHZhbHVlcy4KLSAgICAgICAgICogQWxsIHdyaXRlIG9yIHJlYWQgcmVxdWVzdCBmb3Igb2JqZWN0J3Mgd2l0aCB0aGF0IHZhbHVlIGFyZSBzZW50IHRvIHRoZSBzZXJ2ZXIuCi0gICAgICAgICAqIElmIGEgcXVlcnkgZG9lcyBub3QgaW5jbHVkZSB0aGUgZmllbGQgYXMgYSBwYXJhbWV0ZXIsIHRoZW4gaXQgY2FuIGVpdGhlciBiZSBzZW50Ci0gICAgICAgICAqIHRvIGFsbCBzZXJ2ZXIncyBhbmQgdW5pb25lZCwgb3IgbGVmdCB0byB0aGUgc2VzaW9uJ3MgZGVmYXVsdCBiZWhhdmlvci4KLSAgICAgICAgICogCi0gICAgICAgICAqIElmIG11bHRpcGxlIHBhcnRpdGlvbnMgYXJlIHVzZWQgdG8gcHJvY2VzcyBhIHNpbmdsZSB0cmFuc2FjdGlvbiwgSlRBIHNob3VsZCBiZSB1c2VkIGZvciBwcm9wZXIgWEEgdHJhbnNhY3Rpb24gc3VwcG9ydC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogUGFydGl0aW9uIHBvbGljaWVzIGFyZSBnbG9iYWxseSBuYW1lZCB0byBhbGxvdyByZXVzZSwKLSAgICAgICAgICogdGhlIHBhcnRpdGlvbmluZyBwb2xpY3kgbXVzdCBhbHNvIGJlIHNldCB1c2luZyB0aGUgQFBhcnRpdGlvbmVkIGFubm90YXRpb24gdG8gYmUgdXNlZC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUGFydGl0aW9uZWQKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5wYXJ0aXRpb25pbmcuUmFuZ2VQYXJ0aXRpb25pbmdQb2xpY3kKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSYW5nZVBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBkYXRhYmFzZSBjb2x1bW4gb3IgcXVlcnkgcGFyYW1ldGVyIHRvIHBhcnRpdGlvbiBxdWVyaWVzIGJ5LgotICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgdGFibGUgY29sdW1uIG5hbWUsIG5vdCB0aGUgY2xhc3MgYXR0cmlidXRlIG5hbWUuCi0gICAgICAgICAgICAgKiBUaGUgY29sdW1uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIHF1ZXJ5IGFuZCBzaG91bGQgbm9ybWFsbHkgYmUgcGFydCBvZiB0aGUgb2JqZWN0J3MgSWQuCi0gICAgICAgICAgICAgKiBUaGlzIGNhbiBhbHNvIGJlIHRoZSBuYW1lIG9mIGEgcXVlcnkgcGFyYW1ldGVyLgotICAgICAgICAgICAgICogSWYgYSBxdWVyeSBkb2VzIG5vdCBjb250YWluIHRoZSBmaWVsZCB0aGUgcXVlcnkgd2lsbCBub3QgYmUgcGFydGl0aW9uZWQuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvbHVtbiBwYXJ0aXRpb25Db2x1bW4oKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIExpc3Qgb2YgY29ubmVjdGlvbiBwb29sIG5hbWVzIHRvIGxvYWQgYmFsYW5jZSBhY3Jvc3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFJhbmdlUGFydGl0aW9uW10gcGFydGl0aW9ucygpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIERlZmluZXMgaWYgcXVlcmllcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZSBwYXJ0aXRpb24gZmllbGQgc2hvdWxkIGJlIHNlbnQKLSAgICAgICAgICAgICAqIHRvIGV2ZXJ5IGRhdGFiYXNlIGFuZCBoYXZlIHRoZSByZXN1bHQgdW5pb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiB1bmlvblVucGFydGl0aW9uYWJsZVF1ZXJpZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTpyYW5nZS1wYXJ0aXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pb24tdW5wYXJ0aXRpb25hYmxlLXF1ZXJpZXMiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyYW5nZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHJhbmdlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVmFsdWVzID0gc3RhcnRWYWx1ZSBhbmQgPSBlbmRWYWx1ZSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgY29ubmVjdGlvbiBwb29sLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBSYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5SYW5nZVBhcnRpdGlvbgotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFJhbmdlUGFydGl0aW9uIHsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBzdGFydFZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIC8qKiBUaGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByYW5nZSBzdGFydCB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBlbmRWYWx1ZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAvKiogVGhlIGNvbm5lY3Rpb24gcG9vbCB0byByb3V0ZSBxdWVyaWVzIHRvIGZvciB0aGlzIHJhbmdlLiAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0YXJ0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW5kLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtcGFydGl0aW9uaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBWYWx1ZVBhcnRpdGlvbmluZyBwYXJ0aXRpb25zIGFjY2VzcyB0byBhIGRhdGFiYXNlIGNsdXN0ZXIgYnkgYSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBvYmplY3QsCi0gICAgICAgICAqIHN1Y2ggYXMgdGhlIG9iamVjdCdzIGxvY2F0aW9uLCBvciB0ZW5hbnQuCi0gICAgICAgICAqIEVhY2ggdmFsdWUgaXMgYXNzaWduZWQgYSBzcGVjaWZpYyBzZXJ2ZXIuCi0gICAgICAgICAqIEFsbCB3cml0ZSBvciByZWFkIHJlcXVlc3QgZm9yIG9iamVjdCdzIHdpdGggdGhhdCB2YWx1ZSBhcmUgc2VudCB0byB0aGUgc2VydmVyLgotICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGluY2x1ZGUgdGhlIGZpZWxkIGFzIGEgcGFyYW1ldGVyLCB0aGVuIGl0IGNhbiBlaXRoZXIgYmUgc2VudAotICAgICAgICAgKiB0byBhbGwgc2VydmVyJ3MgYW5kIHVuaW9uZWQsIG9yIGxlZnQgdG8gdGhlIHNlc2lvbidzIGRlZmF1bHQgYmVoYXZpb3IuCi0gICAgICAgICAqIAotICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLnBhcnRpdGlvbmluZy5WYWx1ZVBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZhbHVlUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGhlIGRhdGFiYXNlIGNvbHVtbiBvciBxdWVyeSBwYXJhbWV0ZXIgdG8gcGFydGl0aW9uIHF1ZXJpZXMgYnkuCi0gICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSB0YWJsZSBjb2x1bW4gbmFtZSwgbm90IHRoZSBjbGFzcyBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgICAqIFRoZSBjb2x1bW4gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgcXVlcnkgYW5kIHNob3VsZCBub3JtYWxseSBiZSBwYXJ0IG9mIHRoZSBvYmplY3QncyBJZC4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGFsc28gYmUgdGhlIG5hbWUgb2YgYSBxdWVyeSBwYXJhbWV0ZXIuCi0gICAgICAgICAgICAgKiBJZiBhIHF1ZXJ5IGRvZXMgbm90IGNvbnRhaW4gdGhlIGZpZWxkIHRoZSBxdWVyeSB3aWxsIG5vdCBiZSBwYXJ0aXRpb25lZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29sdW1uIHBhcnRpdGlvbkNvbHVtbigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKiogU3RvcmUgdGhlIHZhbHVlIHBhcnRpdGlvbnMuIEVhY2ggcGFydGl0aW9uIG1hcHMgYSB2YWx1ZSB0byBhIGNvbm5lY3Rpb25Qb29sLiAqLwotICAgICAgICAgICAgVmFsdWVQYXJ0aXRpb25bXSBwYXJ0aXRpb25zKCk7Ci0gICAgCi0gICAgICAgICAgICAvKiogVGhlIHR5cGUgb2YgdGhlIHN0YXJ0IGFuZCBlbmQgdmFsdWVzLiAqLwotICAgICAgICAgICAgQ2xhc3MgcGFydGl0aW9uVmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgYW55IHVubWFwcGVkIHZhbHVlcy4gKi8KLSAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0Q29ubmVjdGlvblBvb2woKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogRGVmaW5lcyBpZiBxdWVyaWVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlIHBhcnRpdGlvbiBmaWVsZCBzaG91bGQgYmUgc2VudAotICAgICAgICAgICAgICogdG8gZXZlcnkgZGF0YWJhc2UgYW5kIGhhdmUgdGhlIHJlc3VsdCB1bmlvbmVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBib29sZWFuIHVuaW9uVW5wYXJ0aXRpb25hYmxlUXVlcmllcygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24tY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb24iIHR5cGU9Im9ybTp2YWx1ZS1wYXJ0aXRpb24iIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaW9uLXVucGFydGl0aW9uYWJsZS1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtY29ubmVjdGlvbi1wb29sIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFydGl0aW9uLXZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1wYXJ0aXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFJlcHJlc2VudCBhIHNwZWNpZmljIHZhbHVlIHBhcnRpdGlvbi4KLSAgICAgICAgICogVGhlIHZhbHVlIHdpbGwgYmUgcm91dGVkIHRvIHRoZSBjb25uZWN0aW9uIHBvb2wuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIFZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlZhbHVlUGFydGl0aW9uCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4yCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFsdWVQYXJ0aXRpb24gewotICAgICAgICAgICAgLyoqIFRoZSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIHN0YXJ0IHZhbHVlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSBjb25uZWN0aW9uIHBvb2wgdG8gcm91dGUgcXVlcmllcyB0byBmb3IgdGhpcyB2YWx1ZS4gKi8KLSAgICAgICAgICAgIFN0cmluZyBjb25uZWN0aW9uUG9vbCgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJvdW5kLXJvYmluLXBhcnRpdGlvbmluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHNlbmRzIHJlcXVlc3RzIGluIGEgcm91bmQgcm9iaW4gZmFzaGlvbiB0byB0aGUgc2V0IG9mIGNvbm5lY3Rpb24gcG9vbHMuCi0gICAgICAgICAgICAgKiBJdCBpcyBmb3IgbG9hZC1iYWxhbmNpbmcgcmVhZCBxdWVyaWVzIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBmdWxsIGRhdGFiYXNlIGJlIHJlcGxpY2F0ZWQgb24gZWFjaCBtYWNoaW5lLCBzbyBkb2VzIG5vdCBzdXBwb3J0IHBhcnRpdGlvbmluZy4KLSAgICAgICAgICAgICAqIFRoZSBkYXRhIHNob3VsZCBlaXRoZXIgYmUgcmVhZC1vbmx5LCBvciB3cml0ZXMgc2hvdWxkIGJlIHJlcGxpY2F0ZWQgb24gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJvdW5kUm9iaW5Qb2xpY3kKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7VFlQRSwgTUVUSE9ELCBGSUVMRH0pCi0gICAgICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSb3VuZFJvYmluUGFydGl0aW9uaW5nIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChSZXF1aXJlZCkgTGlzdCBvZiBjb25uZWN0aW9uIHBvb2wgbmFtZXMgdG8gbG9hZCBiYWxhbmNlIGFjcm9zcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmdbXSBjb25uZWN0aW9uUG9vbHMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBUaGlzIGFsbG93cyBmb3IgYSBzZXQgb2YgZGF0YWJhc2UgdG8gYmUgd3JpdHRlbiB0byBhbmQga2VwdCBpbiBzeW5jaCwKLSAgICAgICAgICAgICAgICAgKiBhbmQgaGF2ZSByZWFkcyBsb2FkLWJhbGFuY2VkIGFjcm9zcyB0aGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVwbGljYXRlV3JpdGVzKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwbGljYXRlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBsaWNhdGlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgc2VuZHMgcmVxdWVzdHMgdG8gYSBzZXQgb2YgY29ubmVjdGlvbiBwb29scy4KLSAgICAgICAgICAgICAqIEl0IGlzIGZvciByZXBsaWNhdGluZyBkYXRhIGFjcm9zcyBhIGNsdXN0ZXIgb2YgZGF0YWJhc2UgbWFjaGluZXMuCi0gICAgICAgICAgICAgKiBPbmx5IG1vZGlmaWNhdGlvbiBxdWVyaWVzIGFyZSByZXBsaWNhdGVkLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlJlcGxpY2F0aW9uUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVwbGljYXRpb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogVW5pb25QYXJ0aXRpb25pbmcgc2VuZHMgcXVlcmllcyB0byBhbGwgY29ubmVjdGlvbiBwb29scyBhbmQgdW5pb25zIHRoZSByZXN1bHRzLgotICAgICAgICAgICAgICogVGhpcyBpcyBmb3IgcXVlcmllcyBvciByZWxhdGlvbnNoaXBzIHRoYXQgc3BhbiBwYXJ0aXRpb25zIHdoZW4gcGFydGl0aW9uaW5nIGlzIHVzZWQsCi0gICAgICAgICAgICAgKiBzdWNoIGFzIG9uIGEgTWFueVRvTWFueSBjcm9zcyBwYXJ0aXRpb24gcmVsYXRpb25zaGlwLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBQYXJ0aXRpb25pbmcgY2FuIGJlIGVuYWJsZWQgb24gYW4gRW50aXR5LCByZWxhdGlvbnNoaXAsIHF1ZXJ5LCBvciBzZXNzaW9uL3BlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlVuaW9uUGFydGl0aW9uaW5nUG9saWN5Ci0gICAgICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pb25QYXJ0aXRpb25pbmcgewotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBMaXN0IG9mIGNvbm5lY3Rpb24gcG9vbCBuYW1lcyB0byBsb2FkIGJhbGFuY2UgYWNyb3NzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZ1tdIGNvbm5lY3Rpb25Qb29scygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIERlZmluZXMgaWYgd3JpdGUgcXVlcmllcyBzaG91bGQgYmUgcmVwbGljYXRlZC4KLSAgICAgICAgICAgICAgICAgKiBXcml0ZXMgYXJlIG5vcm1hbGx5IG5vdCByZXBsaWNhdGVkIHdoZW4gdW5pb25pbmcsCi0gICAgICAgICAgICAgICAgICogYnV0IGNhbiBiZSBmb3IgTWFueVRvTWFueSByZWxhdGlvbnNoaXBzLCB3aGVuIHRoZSBqb2luIHRhYmxlIG5lZWRzIHRvIGJlIHJlcGxpY2F0ZWQuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgYm9vbGVhbiByZXBsaWNhdGVXcml0ZXMoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXBsaWNhdGUtd3JpdGVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBpbm5lZC1wYXJ0aXRpb25pbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICAvKiogCi0gICAgICAgICAqIFBpbm5lZFBhcnRpdGlvbmluZyBwaW5zIHJlcXVlc3RzIHRvIGEgc2luZ2xlIGNvbm5lY3Rpb24gcG9vbC4KLSAgICAgICAgICogCi0gICAgICAgICAqIFBhcnRpdGlvbmluZyBjYW4gYmUgZW5hYmxlZCBvbiBhbiBFbnRpdHksIHJlbGF0aW9uc2hpcCwgcXVlcnksIG9yIHNlc3Npb24vcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMucGFydGl0aW9uaW5nLlBpbm5lZFBhcnRpdGlvbmluZ1BvbGljeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMgotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBpbm5lZFBhcnRpdGlvbmluZyB7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBjb25uZWN0aW9uIHBvb2wgbmFtZSB0byBwaW4gcXVlcmllcyB0by4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbm5lY3Rpb25Qb29sKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb2x1bW4tcmVzdWx0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBDb2x1bW5SZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgQ29weVBvbGljeSBpcyB1c2VkIHRvIHNldCBhIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgb24gYW4gRW50aXR5LgotICAgICAgICAgKiBJdCBpcyByZXF1aXJlZCB0aGF0IGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkNvcHlQb2xpY3kgYmUgc3BlY2lmaWVkIAotICAgICAgICAgKiBhcyB0aGUgYXJndW1lbnQuCi0gICAgICAgICAqIAotICAgICAgICAgKiBBIENvcHlQb2xpY3kgc2hvdWxkIGJlIHNwZWNpZmllZCBvbiBhbiBFbnRpdHksIE1hcHBlZFN1cGVyY2xhc3Mgb3IgCi0gICAgICAgICAqIEVtYmVkZGFibGUuCi0gICAgICAgICAqIAotICAgICAgICAgKiBGb3IgaW5zdGFuY2U6Ci0gICAgICAgICAqIEBFbnRpdHkKLSAgICAgICAgICogQENvcHlQb2xpY3koImV4YW1wbGUuTXlDb3B5UG9saWN5IikKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIENvcHlQb2xpY3kgewotCi0gICAgICAgIC8qCi0gICAgICAgICogKFJlcXVpcmVkKQotICAgICAgICAqIFRoaXMgZGVmaW5lcyB0aGUgY2xhc3Mgb2YgdGhlIGNvcHkgcG9saWN5LiBJdCBtdXN0IHNwZWNpZnkgYSBjbGFzcyAKLSAgICAgICAgKiB0aGF0IGltcGxlbWVudHMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGVzY3JpcHRvcnMuY29weWluZy5Db3B5UG9saWN5Ci0gICAgICAgICovCi0gICAgICAgIENsYXNzIHZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpc2NyaW1pbmF0b3ItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJEVFlQRSI7Ci0gICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IFNUUklORzsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLWNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIERpc2NyaW1pbmF0b3JDbGFzcyBpcyB1c2VkIHdpdGhpbiBhIFZhcmlhYmxlT25lVG9PbmUgYW5ub3RhdGlvbi4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KSAKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ2xhc3MgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRpc2NyaW1pbmF0b3IgdG8gYmUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIGRpc2NyaW1pbmF0b3IoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNsYXNzIHRvIHRoZSBpbnN0YW50aWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0gICAgICAgICAgICogZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkaXNjcmltaW5hdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBEaXNjcmltaW5hdG9yVHlwZSB7IFNUUklORywgQ0hBUiwgSU5URUdFUiB9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFSIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJJTlRFR0VSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkaXNjcmltaW5hdG9yLXZhbHVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRGlzY3JpbWluYXRvclZhbHVlIHsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWxlbWVudC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRWxlbWVudENvbGxlY3Rpb24gewotICAgICAgICAgIENsYXNzIHRhcmdldENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXkiIHR5cGU9Im9ybTptYXAta2V5IgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LXRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTp0ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bG9iIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sbGVjdGlvbi10YWJsZSIgdHlwZT0ib3JtOmNvbGxlY3Rpb24tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub25jYWNoZWFibGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbXBvc2l0ZS1tZW1iZXIiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAKLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBcnJheSB0eXBlcyBhcmUgZXh0ZW5kZWQgb2JqZWN0LXJlbGF0aW9uYWwgZGF0YS10eXBlcyBzdXBwb3J0ZWQgYnkgc29tZSBkYXRhYmFzZXMuCi0gICAgICAgICAqIEFycmF5IHR5cGVzIGFyZSB1c2VyIGRlZmluZSB0eXBlcyBpbiB0aGUgZGF0YWJhc2Ugc3VjaCBhcyBWQVJSQVkgdHlwZXMgb24gT3JhY2xlLgotICAgICAgICAgKiBBcnJheXMgY2FuIGNvbnRhaW5zIGJhc2ljIHR5cGVzIChWQVJDSEFSKSBvciBvdGhlciBTdHJ1Y3QgdHlwZXMsIGFuZCBjYW4gYmUgc3RvcmVkIGluCi0gICAgICAgICAqIGEgY29sdW1uIG9yIGluIGEgU3RydWN0IHR5cGUuCi0gICAgICAgICAqIFRoaXMgYW5ub3RhdGlvbiBjYW4gYmUgZGVmaW5lZCBvbiBhIGNvbGxlY3Rpb24gYXR0cmlidXRlIHRoYXQgaXMKLSAgICAgICAgICogcGVyc2lzdGVkIHRvIGFuIEFycmF5IHR5cGUuICBUaGUgY29sbGVjdGlvbiBjYW4gYmUgb2YgYmFzaWMgdHlwZXMsIG9yIGVtYmVkZGFibGUKLSAgICAgICAgICogY2xhc3MgbWFwcGVkIHVzaW5nIGEgU3RydWN0LgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLk9iamVjdFJlbGF0aW9uYWxEYXRhVHlwZURlc2NyaXB0b3IKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLkFycmF5TWFwcGluZwotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnN0cnVjdHVyZXMuT2JqZWN0QXJyYXlNYXBwaW5nCi0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBBcnJheSB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGJhc2ljIG9yIGVtYmVkZGFibGUgY2xhc3MgdGhhdCBpcyB0aGUgZWxlbWVudAotICAgICAgICAgICAgICogdHlwZSBvZiB0aGUgY29sbGVjdGlvbi4gIFRoaXMgZWxlbWVudCBpcyBvcHRpb25hbCBvbmx5IGlmIHRoZQotICAgICAgICAgICAgICogY29sbGVjdGlvbiBmaWVsZCBvciBwcm9wZXJ0eSBpcyBkZWZpbmVkIHVzaW5nIEphdmEgZ2VuZXJpY3MsCi0gICAgICAgICAgICAgKiBhbmQgbXVzdCBiZSBzcGVjaWZpZWQgb3RoZXJ3aXNlLiAgSXQgZGVmYXVsdHMgdG8gdGhlCi0gICAgICAgICAgICAgKiBwYXJhbXRlcml6ZWQgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiB3aGVuIGRlZmluZWQgdXNpbmcKLSAgICAgICAgICAgICAqIGdlbmVyaWNzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyB0YXJnZXRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBkYXRhYmFzZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBhcnJheSBzdHJ1Y3R1cmUgdHlwZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlVHlwZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmVudW1lcmF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvYiIKLSAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTpsb2IiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjIiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhYmFzZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbWJlZGRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBlbWJlZGRhYmxlIG9iamVjdHMuIElzIAotICAgICAgICBhbGxvd2VkIHRvIGJlIHNwYXJzZWx5IHBvcHVsYXRlZCBhbmQgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIAotICAgICAgICB0aGUgYW5ub3RhdGlvbnMuIEFsdGVybmF0aXZlbHksIHRoZSBtZXRhZGF0YS1jb21wbGV0ZSBhdHRyaWJ1dGUgCi0gICAgICAgIGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gYW5ub3RhdGlvbnMgYXJlIHRvIGJlIHByb2Nlc3NlZCAKLSAgICAgICAgaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdGhlIGRlZmF1bHRpbmcgcnVsZXMgd2lsbCAKLSAgICAgICAgYmUgcmVjdXJzaXZlbHkgYXBwbGllZC4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRhYmxlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QiIHR5cGU9Im9ybTpzdHJ1Y3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvcHktcG9saWN5IiB0eXBlPSJvcm06Y29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5zdGFudGlhdGlvbi1jb3B5LXBvbGljeSIgdHlwZT0ib3JtOmluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xvbmUtY29weS1wb2xpY3kiIHR5cGU9Im9ybTpjbG9uZS1jb3B5LXBvbGljeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC1yZWNvcmQiIHR5cGU9Im9ybTpwbHNxbC1yZWNvcmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC10YWJsZSIgdHlwZT0ib3JtOnBsc3FsLXRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFzc29jaWF0aW9uLW92ZXJyaWRlIiB0eXBlPSJvcm06YXNzb2NpYXRpb24tb3ZlcnJpZGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGVzIiB0eXBlPSJvcm06YXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1tYXBwaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtb3ZlcnJpZGUiIHR5cGU9Im9ybTphdHRyaWJ1dGUtb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhc3NvY2lhdGlvbi1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW1iZWRkZWQtaWQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbWJlZGRlZElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1vdmVycmlkZSIgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlbnRpdHktbGlzdGVuZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBEZWZpbmVzIGFuIGVudGl0eSBsaXN0ZW5lciB0byBiZSBpbnZva2VkIGF0IGxpZmVjeWNsZSBldmVudHMKLSAgICAgICAgZm9yIHRoZSBlbnRpdGllcyB0aGF0IGxpc3QgdGhpcyBsaXN0ZW5lci4KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1wZXJzaXN0IiB0eXBlPSJvcm06cHJlLXBlcnNpc3QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcGVyc2lzdCIgdHlwZT0ib3JtOnBvc3QtcGVyc2lzdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlLXJlbW92ZSIgdHlwZT0ib3JtOnByZS1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBvc3QtcmVtb3ZlIiB0eXBlPSJvcm06cG9zdC1yZW1vdmUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS11cGRhdGUiIHR5cGU9Im9ybTpwcmUtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXVwZGF0ZSIgdHlwZT0ib3JtOnBvc3QtdXBkYXRlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LWxvYWQiIHR5cGU9Im9ybTpwb3N0LWxvYWQiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBFbnRpdHlMaXN0ZW5lcnMgewotICAgICAgICAgIENsYXNzW10gdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbnRpdHktbGlzdGVuZXIiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXIiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZW50aXR5LXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW50aXR5UmVzdWx0IHsKLSAgICAgICAgICBDbGFzcyBlbnRpdHlDbGFzcygpOwotICAgICAgICAgIEZpZWxkUmVzdWx0W10gZmllbGRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBTdHJpbmcgZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQtcmVzdWx0IiB0eXBlPSJvcm06ZmllbGQtcmVzdWx0IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZW50aXR5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0gICAgICAgICAgT1JESU5BTCwKLSAgICAgICAgICBTVFJJTkcKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iT1JESU5BTCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU1RSSU5HIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJlbnVtZXJhdGVkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRW51bWVyYXRlZCB7Ci0gICAgICAgICAgRW51bVR5cGUgdmFsdWUoKSBkZWZhdWx0IE9SRElOQUw7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ib3JtOmVudW0tdHlwZSIvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWF0dHJpYnV0ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEZldGNoQXR0cmlidXRlIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBmZXRjaCBhdHRyaWJ1dGUgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOyAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmV0Y2hHcm91cCB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgZmV0Y2ggZ3JvdXAgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOyAKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSW5kaWNhdGVzIHdoZXRoZXIgYWxsIHJlbGF0aW9uc2hpcCBhdHRyaWJ1dGVzCi0gICAgICAgICAgICogc3BlY2lmaWVkIGluIHRoZSBmZXRjaCBncm91cCBzaG91bGQgYmUgbG9hZGVkLgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gbG9hZCgpIGRlZmF1bHQgdHJ1ZTsgCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgdG8gZmV0Y2guCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hBdHRyaWJ1dGVbXSBhdHRyaWJ1dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiB0eXBlPSJvcm06ZmV0Y2gtYXR0cmlidXRlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImxvYWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZmV0Y2gtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIEZldGNoVHlwZSB7IExBWlksIEVBR0VSIH07Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJMQVpZIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJFQUdFUiIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLXJlc3VsdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgRmllbGRSZXN1bHQgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbigpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImdlbmVyYXRlZC12YWx1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlIHsKLSAgICAgICAgICBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSgpIGRlZmF1bHQgQVVUTzsKLSAgICAgICAgICBTdHJpbmcgZ2VuZXJhdG9yKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic3RyYXRlZ3kiIHR5cGU9Im9ybTpnZW5lcmF0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJnZW5lcmF0b3IiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJnZW5lcmF0aW9uLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSB7IFRBQkxFLCBTRVFVRU5DRSwgSURFTlRJVFksIEFVVE8gfTsKLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTRVFVRU5DRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURFTlRJVFkiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFVVE8iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIElkIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5kZXgiIHR5cGU9Im9ybTppbmRleCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZ2VuZXJhdGVkLXZhbHVlIiB0eXBlPSJvcm06Z2VuZXJhdGVkLXZhbHVlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRlbXBvcmFsIiB0eXBlPSJvcm06dGVtcG9yYWwiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudW1lcmF0ZWQiIHR5cGU9Im9ybTplbnVtZXJhdGVkIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtZ2VuZXJhdG9yIiB0eXBlPSJvcm06dGFibGUtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTpzZXF1ZW5jZS1nZW5lcmF0b3IiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWQtY2xhc3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJZENsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImlkLXZhbGlkYXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFRoZSBJZFZhbGlkYXRpb24gZW51bSBkZXRlcm1pbmVzIHRoZSB0eXBlIHZhbHVlIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBJZC4KLSAgICAgICAgICogQnkgZGVmYXVsdCBudWxsIGlzIG5vdCBhbGxvd2VkLCBhbmQgMCBpcyBub3QgYWxsb3cgZm9yIHNpbmdsZXRvbiBpZHMgb2YgbG9uZyBvciBpbnQgdHlwZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgWkVSTyBmb3Igc2luZ2xldG9uIGlkcywgYW5kIE5VTEwgZm9yIGNvbXBvc2l0ZSBpZHMuCi0gICAgICAgICAqIFRoaXMgY2FuIGJlIHNldCB1c2luZyB0aGUgQFByaW1hcnlLZXkgYW5ub3RhdGlvbiwgb3IgQ2xhc3NEZXNjcmlwdG9yIEFQSS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgUHJpbWFyeUtleQotICAgICAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRlc2NyaXB0b3JzLkNsYXNzRGVzY3JpcHRvciNzZXRJZFZhbGlkYXRpb24oSWRWYWxpZGF0aW9uKQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMCAKLSAgICAgICAgICovIAotICAgICAgICBwdWJsaWMgZW51bSBJZFZhbGlkYXRpb24gewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBPbmx5IG51bGwgaXMgbm90IGFsbG93ZWQgYXMgYW4gaWQgdmFsdWUsIDAgaXMgYWxsb3dlZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTlVMTCwKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBudWxsIGFuZCAwIGFyZSBub3QgYWxsb3dlZCwgKG9ubHkgaW50IGFuZCBsb25nKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgWkVSTywKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBObyBpZCB2YWxpZGF0aW9uIGlzIGRvbmUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE5PTkUKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOVUxMIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJaRVJPIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhY2hlLWtleS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ29uZmlndXJlcyB3aGF0IHR5cGUgb2YgSWQgdmFsdWUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgICAqIFRoaXMgY2FuIGVpdGhlciBiZSB0aGUgYmFzaWMgSWQgdmFsdWUgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLAotICAgICAgICAgICAgICogb3IgYW4gb3B0aW1pemVkIENhY2hlS2V5IHR5cGUuCi0gICAgICAgICAgICAgKiAKLSAgICAgICAgICAgICAqIEBzZWUgUHJpbWFyeUtleSNjYWNoZUtleVR5cGUoKQotICAgICAgICAgICAgICogQHNlZSBDbGFzc0Rlc2NyaXB0b3Ijc2V0Q2FjaGVLZXlUeXBlKENhY2hlS2V5VHlwZSkKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgZW51bSBDYWNoZUtleVR5cGUgewotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBmb3Igc2ltcGxlIHNpbmdsZXRvbiBJZHMsIHN1Y2ggYXMgbG9uZy9pbnQvU3RyaW5nLgotICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIHNpbXBsZSBzaW5nbGV0b24gSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIElEX1ZBTFVFLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogT3B0aW1pemVkIGNhY2hlIGtleSB0eXBlIHRoYXQgYWxsb3dzIGNvbXBvc2l0ZSBhbmQgY29tcGxleCB2YWx1ZXMuCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgY29tcG9zaXRlIG9yIGNvbXBsZXggSWRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENBQ0hFX0tFWSwKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoZSBjYWNoZSBrZXkgdHlwZSBpcyBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIHdoYXQgaXMgb3B0aW1hbCBmb3IgdGhlIGNsYXNzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEFVVE8KLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSURfVkFMVUUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkNBQ0hFX0tFWSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQVVUTyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmhlcml0YW5jZSB7Ci0gICAgICAgICAgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KCkgZGVmYXVsdCBTSU5HTEVfVEFCTEU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InN0cmF0ZWd5IiB0eXBlPSJvcm06aW5oZXJpdGFuY2UtdHlwZSIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUKLSAgICAgICAgICB7IFNJTkdMRV9UQUJMRSwgSk9JTkVELCBUQUJMRV9QRVJfQ0xBU1N9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iU0lOR0xFX1RBQkxFIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJKT0lORUQiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlRBQkxFX1BFUl9DTEFTUyIvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHVzZWQgdG8gc2V0IGFuIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kZXNjcmlwdG9ycy5jb3B5aW5nLkluc3RhbnRpYXRpb25Db3B5UG9saWN5IAotICAgICAgICAgKiBvbiBhbiBFbnRpdHkuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IGlzIHRoZSBkZWZhdWx0IENvcHlQb2xpY3kgaW4gCi0gICAgICAgICAqIEVjbGlwc2VMaW5rIGFuZCB0aGVyZWZvcmUgdGhpcyBjb25maWd1cmF0aW9uIG9wdGlvbiBpcyBvbmx5IHVzZWQgdG8gCi0gICAgICAgICAqIG92ZXJyaWRlIG90aGVyIHR5cGVzIG9mIGNvcHkgcG9saWNpZXMKLSAgICAgICAgICogCi0gICAgICAgICAqIEFuIEluc3RhbnRpYXRpb25Db3B5UG9saWN5IHNob3VsZCBiZSBzcGVjaWZpZWQgb24gYW4gRW50aXR5LCAKLSAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcyBvciBFbWJlZGRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogRXhhbXBsZToKLSAgICAgICAgICogQEVudGl0eQotICAgICAgICAgKiBASW5zdGFudGlhdGlvbkNvcHlQb2xpY3kgCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbnN0YW50aWF0aW9uQ29weVBvbGljeSB7Ci0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idW5pcXVlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im51bGxhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imluc2VydGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBKb2luRmV0Y2hUeXBlIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgZG9lcyBub3QgYWxsb3cgZm9yIG51bGwvZW1wdHkgdmFsdWVzLgotICAgICAgICAgKi8KLSAgICAgICAgSU5ORVIsCi0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuIGlubmVyIGpvaW4gaXMgdXNlZCB0byBmZXRjaCB0aGUgcmVsYXRlZCBvYmplY3QuCi0gICAgICAgICAqIFRoaXMgYWxsb3dzIGZvciBudWxsL2VtcHR5IHZhbHVlcy4KLSAgICAgICAgICovCi0gICAgICAgIE9VVEVSLAotICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU5ORVIiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9VVEVSIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJiYXRjaC1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBwdWJsaWMgZW51bSBCYXRjaEZldGNoVHlwZSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtIG9mIGJhdGNoIHJlYWRpbmcuCi0gICAgICAgICAgICAgICAgICogVGhlIG9yaWdpbmFsIHF1ZXJ5J3Mgc2VsZWN0aW9uIGNyaXRlcmlhIGlzIGpvaW5lZCB3aXRoIHRoZSBiYXRjaCBxdWVyeS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBKT0lOLAotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogVGhpcyB1c2VzIGFuIFNRTCBFWElTVFMgYW5kIGEgc3ViLXNlbGVjdCBpbiB0aGUgYmF0Y2ggcXVlcnkgaW5zdGVhZCBvZiBhIGpvaW4uCi0gICAgICAgICAgICAgICAgICogVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBub3QgcmVxdWlyaW5nIGFuIFNRTCBESVNUSU5DVCB3aGljaCBjYW4gaGF2ZSBpc3N1ZXMKLSAgICAgICAgICAgICAgICAgKiB3aXRoIExPQnMsIG9yIG1heSBiZSBtb3JlIGVmZmljaWVudCBmb3Igc29tZSB0eXBlcyBvZiBxdWVyaWVzIG9yIG9uIHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEVYSVNUUywKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIFRoaXMgdXNlcyBhbiBTUUwgSU4gY2xhdXNlIGluIHRoZSBiYXRjaCBxdWVyeSBwYXNzaW5nIGluIHRoZSBzb3VyY2Ugb2JqZWN0IElkcy4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIG9ubHkgc2VsZWN0aW5nIHRoZSBvYmplY3RzIG5vdCBhbHJlYWR5IGNvbnRhaW5lZCBpbiB0aGUgY2FjaGUsCi0gICAgICAgICAgICAgICAgICogYW5kIGNhbiB3b3JrIGJldHRlciB3aXRoIGN1cnNvcnMsIG9yIGlmIGpvaW5zIGNhbm5vdCBiZSB1c2VkLgotICAgICAgICAgICAgICAgICAqIFRoaXMgbWF5IG9ubHkgd29yayBmb3Igc2luZ2xldG9uIElkcyBvbiBzb21lIGRhdGFiYXNlcy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBJTiAgICAKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkpPSU4iLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVYSVNUUyIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iSU4iLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpvaW4tdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBKb2luVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgSm9pbkNvbHVtbltdIGpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBKb2luQ29sdW1uW10gaW52ZXJzZUpvaW5Db2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBVbmlxdWVDb25zdHJhaW50W10gdW5pcXVlQ29uc3RyYWludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbnZlcnNlLWpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvYiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIExvYiB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9jay1tb2RlLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBMb2NrTW9kZVR5cGUgeyBSRUFELCBXUklURSwgT1BUSU1JU1RJQywgT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIFBFU1NJTUlTVElDX1JFQUQsIFBFU1NJTUlTVElDX1dSSVRFLCBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQsIE5PTkV9OwotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iV1JJVEUiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19SRUFEIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJQRVNTSU1JU1RJQ19XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJOT05FIi8+Ci0KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYW55VG9NYW55IHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IExBWlk7Ci0gICAgICAgICAgU3RyaW5nIG1hcHBlZEJ5KCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItYnkiIHR5cGU9Im9ybTpvcmRlci1ieSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9yZGVyLWNvbHVtbiIgdHlwZT0ib3JtOm9yZGVyLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleSIgdHlwZT0ib3JtOm1hcC1rZXkiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY2xhc3MiIHR5cGU9Im9ybTptYXAta2V5LWNsYXNzIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktdGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnRlbXBvcmFsIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06ZW51bWVyYXRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbnZlcnQiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hdHRyaWJ1dGUtb3ZlcnJpZGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOmF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1hc3NvY2lhdGlvbi1vdmVycmlkZSIgdHlwZT0ib3JtOmFzc29jaWF0aW9uLW92ZXJyaWRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29sdW1uIiB0eXBlPSJvcm06bWFwLWtleS1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06bWFwLWtleS1qb2luLWNvbHVtbiIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIj4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0ib3JtOmNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTp0eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJvcm06c3RydWN0LWNvbnZlcnRlciIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hbnktdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFueVRvT25lIHsKLSAgICAgICAgICBDbGFzcyB0YXJnZXRFbnRpdHkoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgICAgQ2FzY2FkZVR5cGVbXSBjYXNjYWRlKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmNob2ljZT4gICAgICAgCi0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tdGFibGUiIHR5cGU9Im9ybTpqb2luLXRhYmxlIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhc2NhZGUiIHR5cGU9Im9ybTpjYXNjYWRlLXR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9Im9ybTpqb2luLWZldGNoLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJvcm06cHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhY2Nlc3MtbWV0aG9kcyIgdHlwZT0ib3JtOmFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub25jYWNoZWFibGUiIHR5cGU9Im9ybTplbXB0eVR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFyZ2V0LWVudGl0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWFwcy1pZCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTWFwS2V5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWtleS1jbGFzcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNsYXNzIHsKLSAgICAgICAgICBDbGFzcyB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYXAta2V5LWNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE1hcEtleUNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIGJvb2xlYW4gdW5pcXVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIGluc2VydGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgYm9vbGVhbiB1cGRhdGFibGUoKSBkZWZhdWx0IHRydWU7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMjU1OwotICAgICAgICAgIGludCBwcmVjaXNpb24oKSBkZWZhdWx0IDA7IC8vIGRlY2ltYWwgcHJlY2lzaW9uCi0gICAgICAgICAgaW50IHNjYWxlKCkgZGVmYXVsdCAwOyAvLyBkZWNpbWFsIHNjYWxlCi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByZWNpc2lvbiIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBLZXlKb2luQ29sdW1uIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIHVuaXF1ZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBudWxsYWJsZSgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiBpbnNlcnRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gdXBkYXRhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgdGFibGUoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVuaXF1ZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJudWxsYWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbnNlcnRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InVwZGF0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2x1bW4tZGVmaW5pdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1zdXBlcmNsYXNzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgRGVmaW5lcyB0aGUgc2V0dGluZ3MgYW5kIG1hcHBpbmdzIGZvciBhIG1hcHBlZCBzdXBlcmNsYXNzLiBJcyAKLSAgICAgICAgYWxsb3dlZCB0byBiZSBzcGFyc2VseSBwb3B1bGF0ZWQgYW5kIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAKLSAgICAgICAgdGhlIGFubm90YXRpb25zLiBBbHRlcm5hdGl2ZWx5LCB0aGUgbWV0YWRhdGEtY29tcGxldGUgYXR0cmlidXRlIAotICAgICAgICBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIGFubm90YXRpb25zIGFyZSB0byBiZSBwcm9jZXNzZWQgCi0gICAgICAgIElmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB0aGUgZGVmYXVsdGluZyBydWxlcyB3aWxsIGJlIHJlY3Vyc2l2ZWx5IAotICAgICAgICBhcHBsaWVkLgotCi0gICAgICAgIEBUYXJnZXQoVFlQRSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBNYXBwZWRTdXBlcmNsYXNze30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpdGVuYW50IiB0eXBlPSJvcm06bXVsdGl0ZW5hbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtY3JpdGVyaWEiIHR5cGU9Im9ybTphZGRpdGlvbmFsLWNyaXRlcmlhIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjdXN0b21pemVyIiB0eXBlPSJvcm06Y3VzdG9taXplciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2hhbmdlLXRyYWNraW5nIiB0eXBlPSJvcm06Y2hhbmdlLXRyYWNraW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpZC1jbGFzcyIgdHlwZT0ib3JtOmlkLWNsYXNzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ib3JtOnByaW1hcnkta2V5IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmciIHR5cGU9Im9ybTpvcHRpbWlzdGljLWxvY2tpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlIiB0eXBlPSJvcm06Y2FjaGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNhY2hlLWludGVyY2VwdG9yIiB0eXBlPSJvcm06Y2FjaGUtaW50ZXJjZXB0b3IiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJvcm06ZmV0Y2gtZ3JvdXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06b2JqZWN0LXR5cGUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3B5LXBvbGljeSIgdHlwZT0ib3JtOmNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiIHR5cGU9Im9ybTppbnN0YW50aWF0aW9uLWNvcHktcG9saWN5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsb25lLWNvcHktcG9saWN5IiB0eXBlPSJvcm06Y2xvbmUtY29weS1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtZ2VuZXJhdG9yIiB0eXBlPSJvcm06c2VxdWVuY2UtZ2VuZXJhdG9yIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZS1nZW5lcmF0b3IiIHR5cGU9Im9ybTp0YWJsZS1nZW5lcmF0b3IiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDpncm91cCByZWY9Im9ybTpwYXJ0aXRpb25pbmctZ3JvdXAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtbmF0aXZlLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtbmF0aXZlLXF1ZXJ5IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiB0eXBlPSJvcm06bmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+ICAgICAgICAgICAgCi0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSIgdHlwZT0ib3JtOm5hbWVkLXBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lZC1wbHNxbC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIHR5cGU9Im9ybTpuYW1lZC1wbHNxbC1zdG9yZWQtZnVuY3Rpb24tcXVlcnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC1yZWNvcmQiIHR5cGU9Im9ybTpwbHNxbC1yZWNvcmQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbHNxbC10YWJsZSIgdHlwZT0ib3JtOnBsc3FsLXRhYmxlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsLXJlc3VsdC1zZXQtbWFwcGluZyIgCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnNxbC1yZXN1bHQtc2V0LW1hcHBpbmciIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeS1yZWRpcmVjdG9ycyIgdHlwZT0ib3JtOnF1ZXJ5LXJlZGlyZWN0b3JzIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtZGVmYXVsdC1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1ZGUtc3VwZXJjbGFzcy1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbXB0eVR5cGUiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVudGl0eS1saXN0ZW5lcnMiIHR5cGU9Im9ybTplbnRpdHktbGlzdGVuZXJzIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtcGVyc2lzdCIgdHlwZT0ib3JtOnByZS1wZXJzaXN0IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXBlcnNpc3QiIHR5cGU9Im9ybTpwb3N0LXBlcnNpc3QiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZS1yZW1vdmUiIHR5cGU9Im9ybTpwcmUtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwb3N0LXJlbW92ZSIgdHlwZT0ib3JtOnBvc3QtcmVtb3ZlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmUtdXBkYXRlIiB0eXBlPSJvcm06cHJlLXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC11cGRhdGUiIHR5cGU9Im9ybTpwb3N0LXVwZGF0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icG9zdC1sb2FkIiB0eXBlPSJvcm06cG9zdC1sb2FkIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW92ZXJyaWRlIiB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXNzb2NpYXRpb24tb3ZlcnJpZGUiIAotICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlcyIgdHlwZT0ib3JtOmF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGFyZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWNoZWFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImV4aXN0ZW5jZS1jaGVja2luZyIgdHlwZT0ib3JtOmV4aXN0ZW5jZS10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZXhjbHVkZS1kZWZhdWx0LW1hcHBpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtdWx0aXRlbmFudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgTXVsdGl0ZW5hbnQgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIG11bHRpLXRlbmFudCBzdHJhdGVneSB0byB1c2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE11bHRpdGVuYW50VHlwZSB2YWx1ZSgpIGRlZmF1bHQgTXVsdGl0ZW5hbnRUeXBlLlNJTkdMRV9UQUJMRTsKLSAgICAgICAgfQotIAotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiB0eXBlPSJvcm06dGVuYW50LWRpc2NyaW1pbmF0b3ItY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm11bHRpdGVuYW50LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im11bHRpdGVuYW50LXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBwdWJsaWMgZW51bSBNdWx0aXRlbmFudFR5cGUgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCB0YWJsZShzKSB0aGUgZW50aXR5IG1hcHMgdG8gaW5jbHVkZXMgcm93cyBmb3IgbXVsdGlwbGUgCi0gICAgICAgICAgICAgKiB0ZW5hbnRzLiBUaGUgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uKHMpIGFyZSB1c2VkIHdpdGggYXBwbGljYXRpb24gCi0gICAgICAgICAgICAgKiBjb250ZXh0IHZhbHVlcyB0byBsaW1pdCB3aGF0IGEgcGVyc2lzdGVuY2UgY29udGV4dCBjYW4gYWNjZXNzLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTSU5HTEVfVEFCTEUsIAotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZmllcyB0aGF0IGRpZmZlcmVudCB0YWJsZXMgYXJlIHVzZWQgZm9yIGVhY2ggdGVuYW50LiBUaGUgdGFibGUgc2NhbiAKLSAgICAgICAgICAgICAqIGJlIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgbmFtZSwgc2NoZW1hL3RhYmxlc3BhY2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFRBQkxFX1BFUl9URU5BTlQsCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogU3BlY2lmaWVzIHRoYXQgdGhlIERCIHdpbGwgaGFuZGxlIHRoZSB0ZW5hbnQgZmlsdGVyaW5nIG9uIGFsbCBTRUxFQ1QsCi0gICAgICAgICAgICAgKiBVUERBVEUgYW5kIERFTEVURSBxdWVyaWVzLiBVc2luZyB0aGlzIHR5cGUgYXNzdW1lcyB0aGF0IHRoZSBwbGF0Zm9ybQotICAgICAgICAgICAgICogdXNlZCB3aXRoIHlvdXIgcGVyc2lzdGVuY2UgdW5pdCBkb2VzIGluZGVlZCBzdXBwb3J0IFZQRC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgVlBECi0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNJTkdMRV9UQUJMRSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVEFCTEVfUEVSX1RFTkFOVCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVlBEIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1uYXRpdmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5IHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyBxdWVyeSgpOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7IC8vbmFtZWQgU3FsUmVzdWx0U2V0TWFwcGluZwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxdWVyeSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUXVlcnkgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIHF1ZXJ5KCk7Ci0gICAgICAgICAgTG9ja01vZGVUeXBlIGxvY2tNb2RlKCkgZGVmYXVsdCBOT05FOwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9Im9ybTpsb2NrLW1vZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXN0b3JlZC1wcm9jZWR1cmUtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIHByb2NlZHVyZXMgYXMgbmFtZWQgcXVlcmllcy4KLSAgICAgICAgICogQSBOYW1lZFN0b3JlZFByb2NlZHVyZVF1ZXJ5IGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkU3RvcmVkUHJvY2VkdXJlUXVlcnkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVW5pcXVlIG5hbWUgdGhhdCByZWZlcmVuY2VzIHRoaXMgc3RvcmVkIHByb2NlZHVyZSBxdWVyeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBRdWVyeSBoaW50cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBRdWVyeUhpbnRbXSBoaW50cygpIGRlZmF1bHQge307Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFJlZmVycyB0byB0aGUgY2xhc3Mgb2YgdGhlIHJlc3VsdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyByZXN1bHRDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcHJvY2VkdXJlTmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBXaGV0aGVyIHRoZSBxdWVyeSBzaG91bGQgcmV0dXJuIGEgcmVzdWx0IHNldC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIHJldHVybnNSZXN1bHRTZXQoKSBkZWZhdWx0IHRydWU7IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGlmIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHJldHVybnMgbXVsdGlwbGUgcmVzdWx0IHNldHMuCi0gICAgICAgICAgICogVGhpcyBpcyBvbmx5IHJlbGV2YW50IG9uIGRhdGFiYXNlcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgcmVzdWx0IHNldHMgZnJvbSBzdG9yZWQgcHJvY2VkdXJlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBib29sZWFuIG11bHRpcGxlUmVzdWx0U2V0cygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGlmIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHNob3VsZCBiZSBjYWxsZWQgYnkgaW5kZXggb3IgYnkgbmFtZS4KLSAgICAgICAgICAgKiBCeSBpbmRleCByZXF1aXJlcyB0aGF0IHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHByb2NlZHVyZSBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICogQnkgbmFtZSByZXF1aXJlcyB0aGUgZGF0YWJhc2UgcGxhdGZvcm0gc3VwcG9ydCBuYW1pbmcgcHJvY2VkdXJlIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYWxsQnlJbmRleCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnN0b3JlZC1wcm9jZWR1cmUtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJucy1yZXN1bHQtc2V0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11bHRpcGxlLXJlc3VsdC1zZXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhbGwtYnktaW5kZXgiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtc3RvcmVkLWZ1bmN0aW9uLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiAKLSAgICAgICAgICogcXVlcmllcyB0aGF0IGNhbGwgc3RvcmVkIGZ1bmN0aW9uIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAqIEEgTmFtZWRTdG9yZWRGdW5jdGlvblF1ZXJ5IGFubm90YXRpb24gbWF5IGJlIGRlZmluZWQgb24gYW4gRW50aXR5IG9yCi0gICAgICAgICAqIE1hcHBlZFN1cGVyY2xhc3MuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe1RZUEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkU3RvcmVkRnVuY3Rpb25RdWVyeSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgICAqLwotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotICAgICAgICAgICAqLwotICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIFNRTFJlc3VsdE1hcHBpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgZnVuY3Rpb25OYW1lKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGlmIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHNob3VsZCBiZSBjYWxsZWQgYnkgaW5kZXggb3IgYnkgbmFtZS4KLSAgICAgICAgICAgKiBCeSBpbmRleCByZXF1aXJlcyB0aGF0IHRoZSBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXIgYXJlIGRlZmluZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHByb2NlZHVyZSBvbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICogQnkgbmFtZSByZXF1aXJlcyB0aGUgZGF0YWJhc2UgcGxhdGZvcm0gc3VwcG9ydCBuYW1pbmcgcHJvY2VkdXJlIHBhcmFtZXRlcnMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYWxsQnlJbmRleCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIGFyZ3VtZW50cyB0byB0aGUgc3RvcmVkIHByb2NlZHVyZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdG9yZWRQcm9jZWR1cmVQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgcmV0dXJuIG9mIHRoZSBzdG9yZWQgZnVuY3Rpb24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyW10gcmV0dXJuUGFyYW1ldGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaGludCIgdHlwZT0ib3JtOnF1ZXJ5LWhpbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi1wYXJhbWV0ZXIiIHR5cGU9Im9ybTpzdG9yZWQtcHJvY2VkdXJlLXBhcmFtZXRlciIgbWluT2NjdXJzPSIxIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYWxsLWJ5LWluZGV4IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hbWVkLXBsc3FsLXN0b3JlZC1mdW5jdGlvbi1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBBIE5hbWVkUExTUUxTdG9yZWRGdW5jdGlvblF1ZXJ5IGFubm90YXRpb24gYWxsb3dzIHRoZSBkZWZpbml0aW9uIG9mIHF1ZXJpZXMgdGhhdCAKLSAgICAgICAgICAgICAqIGNhbGwgUExTUUwgc3RvcmVkIGZ1bmN0aW9ucyBhcyBuYW1lZCBxdWVyaWVzLgotICAgICAgICAgICAgICogVGhlIFBMU1FMIHN1cHBvcnQgYWRkcyBzdXBwb3J0IGZvciBjb21wbGV4IFBMU1FMIHR5cGVzIHN1Y2ggYXMgUkVDT1JEIGFuZCBUQUJMRSB0eXBlcywKLSAgICAgICAgICAgICAqIHRoYXQgYXJlIG5vdCBhY2Nlc3NpYmxlIGZyb20gSkRCQy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQSBOYW1lZFBMU1FMU3RvcmVkRnVuY3Rpb25RdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUExTUUxTdG9yZWRGdW5jdGlvblF1ZXJ5IHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFVuaXF1ZSBuYW1lIHRoYXQgcmVmZXJlbmNlcyB0aGlzIHN0b3JlZCBwcm9jZWR1cmUgcXVlcnkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgUXVlcnkgaGludHMuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgUXVlcnlIaW50W10gaGludHMoKSBkZWZhdWx0IHt9OwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBmdW5jdGlvbk5hbWUoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZXMgdGhlIHBhcmFtZXRlcnMgdG8gdGhlIHN0b3JlZCBwcm9jZWR1cmUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgUExTUUxQYXJhbWV0ZXJbXSBwYXJhbWV0ZXJzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3RvcmVkIGZ1bmN0aW9uLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFBMU1FMUGFyYW1ldGVyIHJldHVyblBhcmFtZXRlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJoaW50IiB0eXBlPSJvcm06cXVlcnktaGludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhcmFtZXRlciIgdHlwZT0ib3JtOnBsc3FsLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJldHVybi1wYXJhbWV0ZXIiIHR5cGU9Im9ybTpwbHNxbC1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMSIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZXN1bHQtc2V0LW1hcHBpbmciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+ICAgIAotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZWQtcGxzcWwtc3RvcmVkLXByb2NlZHVyZS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgICAgICAvKiogCi0gICAgICAgICAgICAgKiBBIFBMU1FMTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIGFsbG93cyB0aGUgZGVmaW5pdGlvbiBvZiBxdWVyaWVzIHRoYXQgCi0gICAgICAgICAgICAgKiBjYWxsIFBMU1FMIHN0b3JlZCBwcm9jZWR1cmVzIGFzIG5hbWVkIHF1ZXJpZXMuCi0gICAgICAgICAgICAgKiBUaGUgUExTUUwgc3VwcG9ydCBhZGRzIHN1cHBvcnQgZm9yIGNvbXBsZXggUExTUUwgdHlwZXMgc3VjaCBhcyBSRUNPUkQgYW5kIFRBQkxFIHR5cGVzLAotICAgICAgICAgICAgICogdGhhdCBhcmUgbm90IGFjY2Vzc2libGUgZnJvbSBKREJDLgotICAgICAgICAgICAgICogCi0gICAgICAgICAgICAgKiBBIFBMU1FMTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uIG1heSBiZSBkZWZpbmVkIG9uIGFuIEVudGl0eSBvcgotICAgICAgICAgICAgICogTWFwcGVkU3VwZXJjbGFzcy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE5hbWVkUExTUUxTdG9yZWRQcm9jZWR1cmVRdWVyeSB7Ci0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBVbmlxdWUgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhpcyBzdG9yZWQgcHJvY2VkdXJlIHF1ZXJ5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFF1ZXJ5IGhpbnRzLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFF1ZXJ5SGludFtdIGhpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgUmVmZXJzIHRvIHRoZSBjbGFzcyBvZiB0aGUgcmVzdWx0LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIENsYXNzIHJlc3VsdENsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgU1FMUmVzdWx0TWFwcGluZy4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0U2V0TWFwcGluZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBwcm9jZWR1cmVOYW1lKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZSBzdG9yZWQgcHJvY2VkdXJlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFBMU1FMUGFyYW1ldGVyW10gcGFyYW1ldGVycygpIGRlZmF1bHQge307Ci0gICAgICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImhpbnQiIHR5cGU9Im9ybTpxdWVyeS1oaW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJvcm06cGxzcWwtcGFyYW1ldGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlc3VsdC1zZXQtbWFwcGluZyIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotICAKLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1yZWNvcmQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgUExTUUxSZWNvcmQgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIGRlZmluZSBhIGRhdGFiYXNlIFBMU1FMIFJFQ09SRCB0eXBlLgotICAgICAgICAgKiBUaGlzIHR5cGUgY2FuIGJlIHVzZWQgd2l0aGluIFBMU1FMIHByb2NlZHVyZSBjYWxscy4KLSAgICAgICAgICogCi0gICAgICAgICAqIEBzZWUgTmFtZWRQTFNRTFN0b3JlZFByb2NlZHVyZVF1ZXJ5Ci0gICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgKiBAc2luY2UgRWNsaXBzZUxpbmsgMi4zCi0gICAgICAgICAqLwotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQTFNRTFJlY29yZCB7Ci0gICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSByZWNvcmQgdHlwZSBpbiB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSBPQkpFQ1QgVFlQRSB0aGF0IG1pcnJvcnMgdGhlIHJlY29yZCdzIHN0cnVjdHVyZS4KLSAgICAgICAgICAgICAqIFRoZSByZWNvcmQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8vZnJvbSB0aGlzIHR5cGUgc28gaXQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIEpEQkMuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZyBjb21wYXRpYmxlVHlwZSgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIEphdmEgY2xhc3MgdG8gbWFwIHRoZSBvYmplY3QtdHlwZSB0by4KLSAgICAgICAgICAgICAqIFRoaXMgY2xhc3MgbXVzdCBiZSBtYXBwZWQgdXNpbmcgYSBAU3RydWN0IGFubm90YXRpb24uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENsYXNzIGphdmFUeXBlKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChSZXF1aXJlZCkgRGVmaW5lcyB0aGUgZmllbGRzIGluIHRoZSByZWNvcmQgdHlwZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgUExTUUxQYXJhbWV0ZXJbXSBmaWVsZHMoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0ib3JtOnBsc3FsLXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0gIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBIFBMU1FMUmVjb3JkIGFubm90YXRpb24gaXMgdXNlZCB0byBkZWZpbmUgYSBkYXRhYmFzZSBQTFNRTCBSRUNPUkQgdHlwZS4KLSAgICAgICAgICogVGhpcyB0eXBlIGNhbiBiZSB1c2VkIHdpdGhpbiBQTFNRTCBwcm9jZWR1cmUgY2FsbHMuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAc2VlIE5hbWVkUExTUUxTdG9yZWRQcm9jZWR1cmVRdWVyeQotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMwotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUExTUUxSZWNvcmQgewotICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgcmVjb3JkIHR5cGUgaW4gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKFJlcXVpcmVkKSBUaGUgbmFtZSBvZiB0aGUgZGF0YWJhc2UgT0JKRUNUIFRZUEUgdGhhdCBtaXJyb3JzIHRoZSByZWNvcmQncyBzdHJ1Y3R1cmUuCi0gICAgICAgICAgICAgKiBUaGUgcmVjb3JkIHdpbGwgYmUgY29udmVydGVkIHRvL2Zyb20gdGhpcyB0eXBlIHNvIGl0IGNhbiBiZSBwYXNzZWQgdGhyb3VnaCBKREJDLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgY29tcGF0aWJsZVR5cGUoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKYXZhIGNsYXNzIHRvIG1hcCB0aGUgb2JqZWN0LXR5cGUgdG8uCi0gICAgICAgICAgICAgKiBUaGlzIGNsYXNzIG11c3QgYmUgbWFwcGVkIHVzaW5nIGEgQFN0cnVjdCBhbm5vdGF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyBqYXZhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoUmVxdWlyZWQpIERlZmluZXMgdGhlIGZpZWxkcyBpbiB0aGUgcmVjb3JkIHR5cGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBMU1FMUGFyYW1ldGVyW10gZmllbGRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuZXN0ZWQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9iamVjdFR5cGVDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZQotICAgICAgICAgICAqIGFjcm9zcyB0aGUgd2hvbGUgcGVyc2lzdGVuY2UgdW5pdC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHRoZSB0eXBlIHN0b3JlZCBvbiB0aGUgZGF0YWJhc2UuIFRoZQotICAgICAgICAgICAqIGRlZmF1bHQgaXMgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UKLSAgICAgICAgICAgKiBmaWVsZCBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IAotICAgICAgICAgICAqIGZpZWxkIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFNwZWNpZnkgdGhlIGNvbnZlcnNpb24gdmFsdWVzIHRvIGJlIHVzZWQgCi0gICAgICAgICAgICogd2l0aCB0aGUgb2JqZWN0IGNvbnZlcnRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb252ZXJzaW9uVmFsdWVbXSBjb252ZXJzaW9uVmFsdWVzKCk7Ci0KLSAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSBhIGRlZmF1bHQgb2JqZWN0IHZhbHVlLiBVc2VkIGZvciAKLSAgICAgICAgICAgICogbGVnYWN5IGRhdGEgaWYgdGhlIGRhdGEgdmFsdWUgaXMgbWlzc2luZy4KLSAgICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBkZWZhdWx0T2JqZWN0VmFsdWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJzaW9uLXZhbHVlIiB0eXBlPSJvcm06Y29udmVyc2lvbi12YWx1ZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtb2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib2JqZWN0LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb01hbnkgewotICAgICAgICAgIENsYXNzIHRhcmdldEVudGl0eSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotICAgICAgICAgIEZldGNoVHlwZSBmZXRjaCgpIGRlZmF1bHQgTEFaWTsKLSAgICAgICAgICBTdHJpbmcgbWFwcGVkQnkoKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcmRlci1ieSIgdHlwZT0ib3JtOm9yZGVyLWJ5IgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3JkZXItY29sdW1uIiB0eXBlPSJvcm06b3JkZXItY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5IiB0eXBlPSJvcm06bWFwLWtleSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1jbGFzcyIgdHlwZT0ib3JtOm1hcC1rZXktY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS10ZW1wb3JhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06dGVtcG9yYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWFwLWtleS1lbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im9ybTplbnVtZXJhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktY29udmVydCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWF0dHJpYnV0ZS1vdmVycmlkZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJvcm06YXR0cmlidXRlLW92ZXJyaWRlIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktYXNzb2NpYXRpb24tb3ZlcnJpZGUiIHR5cGU9Im9ybTphc3NvY2lhdGlvbi1vdmVycmlkZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXAta2V5LWNvbHVtbiIgdHlwZT0ib3JtOm1hcC1rZXktY29sdW1uIgotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOm1hcC1rZXktam9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgPC94c2Q6Y2hvaWNlPgotICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9Im9ybTpjb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtY29udmVydGVyIiB0eXBlPSJvcm06dHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOm9iamVjdC10eXBlLWNvbnZlcnRlciIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0LWNvbnZlcnRlciIgdHlwZT0ib3JtOnN0cnVjdC1jb252ZXJ0ZXIiLz4KLSAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iCi0gICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYXNjYWRlLW9uLWRlbGV0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhdGNoLWZldGNoIiB0eXBlPSJvcm06YmF0Y2gtZmV0Y2giIG1pbk9jY3Vycz0iMCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPbmVUb09uZSB7Ci0gICAgICAgICAgQ2xhc3MgdGFyZ2V0RW50aXR5KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgICAgICAgIENhc2NhZGVUeXBlW10gY2FzY2FkZSgpIGRlZmF1bHQge307Ci0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLSAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIFN0cmluZyBtYXBwZWRCeSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgYm9vbGVhbiBvcnBoYW5SZW1vdmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpvaW4tY29sdW1uIiB0eXBlPSJvcm06am9pbi1jb2x1bW4iIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam9pbi10YWJsZSIgdHlwZT0ib3JtOmpvaW4tdGFibGUiIAotICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZS1vbi1kZWxldGUiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJvcm06am9pbi1mZXRjaC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC1mZXRjaCIgdHlwZT0ib3JtOmJhdGNoLWZldGNoIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9uY2FjaGVhYmxlIiB0eXBlPSJvcm06ZW1wdHlUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJvcm06cGFydGl0aW9uaW5nLWdyb3VwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhcmdldC1lbnRpdHkiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJmZXRjaCIgdHlwZT0ib3JtOmZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9ycGhhbi1yZW1vdmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1hcHMtaWQiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3B0aW1pc3RpYy1sb2NraW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgZWxlbWVudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgCi0gICAgICAgICAqIG9wdGltaXN0aWMgbG9ja2luZyBFY2xpcHNlTGluayBzaG91bGQgdXNlIHdoZW4gdXBkYXRpbmcgb3IgZGVsZXRpbmcgCi0gICAgICAgICAqIGVudGl0aWVzLiBBbiBvcHRpbWlzdGljLWxvY2tpbmcgc3BlY2lmaWNhdGlvbiBpcyBzdXBwb3J0ZWQgb24KLSAgICAgICAgICogYW4gZW50aXR5IG9yIG1hcHBlZC1zdXBlcmNsYXNzLgotICAgICAgICAgKiAKLSAgICAgICAgICogSXQgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBvcHRpbWlzdGljLWxvY2tpbmctdHlwZS4KLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBPcHRpbWlzdGljTG9ja2luZyB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgdHlwZSBvZiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHRvIHVzZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBPcHRpbWlzdGljTG9ja2luZ1R5cGUgdHlwZSgpIGRlZmF1bHQgVkVSU0lPTl9DT0xVTU47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIEZvciBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IG9mIHR5cGUgCi0gICAgICAgICAgICogU0VMRUNURURfQ09MVU1OUywgdGhpcyBhbm5vdGF0aW9uIG1lbWJlciBiZWNvbWVzIGEgKFJlcXVpcmVkKSAKLSAgICAgICAgICAgKiBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBzZWxlY3RlZENvbHVtbnMoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBTcGVjaWZ5IHdoZXJlIHRoZSBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IHNob3VsZCAKLSAgICAgICAgICAgKiBjYXNjYWRlIGxvY2suIEN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCB3aXRoIFZFUlNJT05fQ09MVU1OIGxvY2tpbmcuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBjYXNjYWRlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZWxlY3RlZC1jb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4gICAgCi0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOm9wdGltaXN0aWMtbG9ja2luZy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2FzY2FkZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcHRpbWlzdGljLWxvY2tpbmctdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIC8qKiAKLSAgICAgICAgICogQSBzaW1wbGUgdHlwZSB0aGF0IGlzIHVzZWQgd2l0aGluIGFuIG9wdGltaXN0aWMtbG9ja2luZyAKLSAgICAgICAgICogc3BlY2lmaWNhdGlvbiB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIG9wdGltaXN0aWMtbG9ja2luZyB0aGF0Ci0gICAgICAgICAqIEVjbGlwc2VMaW5rIHNob3VsZCB1c2Ugd2hlbiB1cGRhdGluZyBvciBkZWxldGluZyBlbnRpdGllcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBlbnVtIE9wdGltaXN0aWNMb2NraW5nVHlwZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGV2ZXJ5IGZpZWxkIGluIHRoZSB0YWJsZQotICAgICAgICAgICAqIGluIHRoZSBXSEVSRSBjbGF1c2Ugd2hlbiBkb2luZyBhbiB1cGRhdGUgb3IgYSBkZWxldGUuIElmIGFueSBmaWVsZAotICAgICAgICAgICAqIGhhcyBiZWVuIGNoYW5nZWQsIGFuIG9wdGltaXN0aWMgbG9ja2luZyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgICAgICovCi0gICAgICAgICAgQUxMX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBwb2xpY3kgY29tcGFyZXMgb25seSB0aGUgY2hhbmdlZCBmaWVsZHMKLSAgICAgICAgICAgKiBpbiB0aGUgV0hFUkUgY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBBIGRlbGV0ZQotICAgICAgICAgICAqIHdpbGwgb25seSBjb21wYXJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDSEFOR0VEX0NPTFVNTlMsCi0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBVc2luZyB0aGlzIHR5cGUgb2YgbG9ja2luZyBjb21wYXJlcyBzZWxlY3RlZCBmaWVsZHMgaW4gdGhlIFdIRVJFCi0gICAgICAgICAgICogY2xhdXNlIHdoZW4gZG9pbmcgYW4gdXBkYXRlIG9yIGEgZGVsZXRlLiBJZiBhbnkgZmllbGQgaGFzIGJlZW4KLSAgICAgICAgICAgKiBjaGFuZ2VkLCBhbiBvcHRpbWlzdGljIGxvY2tpbmcgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBOb3RlIHRoYXQKLSAgICAgICAgICAgKiB0aGUgZmllbGRzIHNwZWNpZmllZCBtdXN0IGJlIG1hcHBlZCBhbmQgbm90IGJlIHByaW1hcnkga2V5cy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTRUxFQ1RFRF9DT0xVTU5TLAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogVXNpbmcgdGhpcyB0eXBlIG9mIGxvY2tpbmcgcG9saWN5IGNvbXBhcmVzIGEgc2luZ2xlIHZlcnNpb24gbnVtYmVyCi0gICAgICAgICAgICogaW4gdGhlIHdoZXJlIGNsYXVzZSB3aGVuIGRvaW5nIGFuIHVwZGF0ZS4gVGhlIHZlcnNpb24gZmllbGQgbXVzdCBiZQotICAgICAgICAgICAqIG1hcHBlZCBhbmQgbm90IGJlIHRoZSBwcmltYXJ5IGtleS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBWRVJTSU9OX0NPTFVNTgotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLQotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnRva2VuIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFMTF9DT0xVTU5TIi8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJDSEFOR0VEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlNFTEVDVEVEX0NPTFVNTlMiLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlZFUlNJT05fQ09MVU1OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+ICAKLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im9yZGVyLWJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJCeSB7Ci0gICAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib3JkZXItY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgT3JkZXJDb2x1bW4gewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBib29sZWFuIG51bGxhYmxlKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICAgIGJvb2xlYW4gaW5zZXJ0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBib29sZWFuIHVwZGF0YWJsZSgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgICBTdHJpbmcgY29sdW1uRGVmaW5pdGlvbigpIGRlZmF1bHQgIiI7Ci0gICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibnVsbGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29sdW1uLWRlZmluaXRpb24iIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb3JyZWN0aW9uLXR5cGUiIHR5cGU9Im9ybTpvcmRlci1jb2x1bW4tY29ycmVjdGlvbi10eXBlIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3JkZXItY29sdW1uLWNvcnJlY3Rpb24tdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIHB1YmxpYyBlbnVtIE9yZGVyQ29ycmVjdGlvblR5cGUgewotICAgICAgICAgIFJFQUQsCi0gICAgICAgICAgUkVBRF9XUklURSwKLSAgICAgICAgICBFWENFUFRJT04KLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6dG9rZW4iPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRCIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iUkVBRF9XUklURSIvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRVhDRVBUSU9OIi8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1sb2FkIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0TG9hZCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1wZXJzaXN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0UGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icG9zdC1yZW1vdmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0R9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBvc3RSZW1vdmUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBvc3QtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQb3N0VXBkYXRlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtcGVyc2lzdCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUGVyc2lzdCB7fQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJlLXJlbW92ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJlUmVtb3ZlIHt9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcmUtdXBkYXRlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9EfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmVVcGRhdGUge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1ldGhvZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByaW1hcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqICBUaGUgUHJpbWFyeUtleSBhbm5vdGF0aW9uIGFsbG93cyBhZHZhbmNlZCBjb25maWd1cmF0aW9uIG9mIHRoZSBJZC4KLSAgICAgICAgICogIEEgdmFsaWRhdGlvbiBwb2xpY3kgY2FuIGJlIGdpdmVuIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgaWYgemVybyBpcyBhIHZhbGlkIGlkIHZhbHVlLgotICAgICAgICAgKiAgVGhlIHNldCBvZiBwcmltYXJ5IGtleSBjb2x1bW5zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBwcmVjaXNlbHkuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDEuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUHJpbWFyeUtleSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgaWQgdmFsaWRhdGlvbiBpcyBkb25lLgotICAgICAgICAgICAqIEJ5IGRlZmF1bHQgMCBpcyBub3QgYSB2YWxpZCBpZCB2YWx1ZSwgdGhpcyBjYW4gYmUgdXNlZCB0byBhbGxvdyAwIGlkIHZhbHVlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBJZFZhbGlkYXRpb24gdmFsaWRhdGlvbigpIGRlZmF1bHQgSWRWYWxpZGF0aW9uLlpFUk87IAotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBDb25maWd1cmVzIHdoYXQgY2FjaGUga2V5IHR5cGUgaXMgdXNlZCB0byBzdG9yZSB0aGUgb2JqZWN0IGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgKiBCeSBkZWZhdWx0IHRoZSB0eXBlIGlzIGRldGVybWluZWQgYnkgd2hhdCB0eXBlIGlzIG9wdGltYWwgZm9yIHRoZSBjbGFzcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYWNoZUtleVR5cGUgY2FjaGVLZXlUeXBlKCkgZGVmYXVsdCBDYWNoZUtleVR5cGUuQVVUTzsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFVzZWQgdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgY29sdW1ucyBkaXJlY3RseS4KLSAgICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgQElkIGlmIHRoZSBwcmltYXJ5IGtleSBpbmNsdWRlcyBhIG5vbiBiYXNpYyBmaWVsZCwKLSAgICAgICAgICAgKiBzdWNoIGFzIGEgZm9yZWlnbiBrZXksIG9yIGEgaW5oZXJpdGFuY2UgZGlzY3JpbWluYXRvciwgZW1iZWRkZWQsIG9yIHRyYW5zZm9ybWF0aW9uIG1hcHBlZCBmaWVsZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDb2x1bW5bXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4iIHR5cGU9Im9ybTpjb2x1bW4iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWxpZGF0aW9uIiB0eXBlPSJvcm06aWQtdmFsaWRhdGlvbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhY2hlLWtleS10eXBlIiB0eXBlPSJvcm06Y2FjaGUta2V5LXR5cGUiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJpbWFyeS1rZXktam9pbi1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbiB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmZXJlbmNlZC1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb3BlcnR5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQSB1c2VyIGRlZmluZWQgbWFwcGluZydzIHByb3BlcnR5LgotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBQcm9wZXJ0eSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogUHJvcGVydHkgbmFtZS4KLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBQcm9wZXJ0eSB2YWx1ZSwKLSAgICAgICAgICAgKiBjb252ZXJ0ZWQgdG8gYW4gaW5zdGFuY2Ugb2YgdmFsdWVUeXBlLgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIHR5cGUuCi0gICAgICAgICAgICogVGhlIHZhbHVlIGNvbnZlcnRlZCB0byB2YWx1ZVR5cGUgYnkgQ29udmVyc2lvbk1hbmFnZXIuCi0gICAgICAgICAgICogSWYgc3BlY2lmaWVkIG11c3QgYmUgYSBzaW1wbGUgdHlwZSB0aGF0IGNvdWxkIGJlIGhhbmRsZWQgYnkgCi0gICAgICAgICAgICogQ29udmVyc2lvbk1hbmFnZXI6IAotICAgICAgICAgICAqIG51bWVyaWNhbCwgYm9vbGVhbiwgdGVtcG9yYWwuICAKLSAgICAgICAgICAgKi8gCi0gICAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnktaGludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkgCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFF1ZXJ5SGludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgdmFsdWUoKTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlZGlyZWN0b3JzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUXVlcnlSZWRpcmVjdG9ycyB7Ci0gICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoaXMgQWxsUXVlcmllcyBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nIG9iamVjdCBxdWVyeQotICAgICAgICAgICAgICogdGhhdCBkb2VzIG5vdCBoYXZlIGEgbW9yZSBwcmVjaXNlIHJlZGlyZWN0b3IgKGxpa2UgdGhlIAotICAgICAgICAgICAgICogUmVhZE9iamVjdFF1ZXJ5IFJlZGlyZWN0b3IpIG9yIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyBhbGxRdWVyaWVzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIERlZmF1bHQgUmVhZEFsbCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBSZWFkQWxsUXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhyb3VnaCB0aGUgZ2V0UmVzdWx0TGlzdCgpIEFQSSB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENsYXNzIHJlYWRBbGwoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIEEgRGVmYXVsdCBSZWFkT2JqZWN0IFF1ZXJ5IFJlZGlyZWN0b3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBleGVjdXRpbmcKLSAgICAgICAgICAgICAqIFJlYWRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgICAgICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAgICAgICAgICogRm9yIHVzZXJzIGV4ZWN1dGluZyBhIEpQQSBRdWVyeSB0aHJvdWdoIHRoZSBnZXRTaW5nbGVSZXN1bHQoKSBBUEkgb3IgRW50aXR5TWFuYWdlci5maW5kKCkgdGhpcyBpcyB0aGUgcmVkaXJlY3RvciB0aGF0IHdpbGwgYmUgaW52b2tlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyByZWFkT2JqZWN0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIERlZmF1bHQgUmVwb3J0UXVlcnkgUmVkaXJlY3RvciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGV4ZWN1dGluZwotICAgICAgICAgICAgICogUmVwb3J0UXVlcnkgdGhhdCBkb2VzIG5vdCBoYXZlIGEgcmVkaXJlY3RvciBzZXQgZGlyZWN0bHkgb24gdGhlIHF1ZXJ5LgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqIEZvciB1c2VycyBleGVjdXRpbmcgYSBKUEEgUXVlcnkgdGhhdCBjb250YWlucyBhZ3JlZ2F0ZSBmdW5jdGlvbnMgb3Igc2VsZWN0cyBtdWx0aXBsZSBlbnRpdGllcyB0aGlzIGlzIHRoZSByZWRpcmVjdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENsYXNzIHJlcG9ydCgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQSBEZWZhdWx0IFVwZGF0ZSBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBVcGRhdGVPYmplY3RRdWVyeSBvciBVcGRhdGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBVcGRhdGVPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuZXZlciBmbHVzaGluZyBjaGFuZ2VzIHRvIHRoZSBkYXRhc291cmNlLgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIENsYXNzIHVwZGF0ZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLSAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQSBEZWZhdWx0IEluc2VydCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBJbnNlcnRPYmplY3RRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBJbiBFY2xpcHNlTGluayBhbiBJbnNlcnRPYmplY3RRdWVyeSBpcyBleGVjdXRlZCB3aGVuIHBlcnNpc3RpbmcgYW4gb2JqZWN0IHRvIHRoZSBkYXRhc291cmNlLgotICAgICAgICAgICAgICogUXVlcnkgcmVkaXJlY3RvcnMgYWxsb3cgdGhlIHVzZXIgdG8gaW50ZXJjZXB0IHF1ZXJ5IGV4ZWN1dGlvbiBwcmV2ZW50aW5nCi0gICAgICAgICAgICAgKiBpdCBvciBhbHRlcm5hdGVseSBwZXJmb3JtaW5nIHNvbWUgc2lkZSBlZmZlY3QgbGlrZSBhdWRpdGluZy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ2xhc3MgaW5zZXJ0KCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIERlZmF1bHQgRGVsZXRlIE9iamVjdCBRdWVyeSBSZWRpcmVjdG9yIHdpbGwgYmUgYXBwbGllZCB0byBhbnkgZXhlY3V0aW5nCi0gICAgICAgICAgICAgKiBEZWxldGVPYmplY3RRdWVyeSBvciBEZWxldGVBbGxRdWVyeSB0aGF0IGRvZXMgbm90IGhhdmUgYSByZWRpcmVjdG9yIHNldCBkaXJlY3RseSBvbiB0aGUgcXVlcnkuCi0gICAgICAgICAgICAgKiBRdWVyeSByZWRpcmVjdG9ycyBhbGxvdyB0aGUgdXNlciB0byBpbnRlcmNlcHQgcXVlcnkgZXhlY3V0aW9uIHByZXZlbnRpbmcKLSAgICAgICAgICAgICAqIGl0IG9yIGFsdGVybmF0ZWx5IHBlcmZvcm1pbmcgc29tZSBzaWRlIGVmZmVjdCBsaWtlIGF1ZGl0aW5nLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDbGFzcyBkZWxldGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsLXF1ZXJpZXMiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLWFsbCIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlYWQtb2JqZWN0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVwb3J0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5zZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGVsZXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBVbmxlc3MgdGhlIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBpcyB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIAotICAgICAgICAgKiBSZWFkVHJhbnNmb3JtZXIsIGl0IGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIAotICAgICAgICAgKiB2YWx1ZShzKWludG8gYXR0cmlidXRlIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBBbHNvIHVubGVzcyBpdCdzIGEgcmVhZC1vbmx5IG1hcHBpbmcsIGVpdGhlciBXcml0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgKiBhbm5vdGF0aW9uIG9yIFdyaXRlVHJhbnNmb3JtZXJzIGFubm90YXRpb24gc2hvdWxkIGJlIHNwZWNpZmllZC4gRWFjaCAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lciBkZWZpbmVzIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUgdG8gYSAKLSAgICAgICAgICogc2luZ2xlIGRhdGFiYXNlIGNvbHVtbiB2YWx1ZSAoY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgCi0gICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIpLgotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgUmVhZFRyYW5zZm9ybWVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVXNlci1kZWZpbmVkIGNsYXNzIHRoYXQgbXVzdCBpbXBsZW1lbnQgdGhlIAotICAgICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MudHJhbnNmb3JtZXJzLkF0dHJpYnV0ZVRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyAKLSAgICAgICAgICAgICAqIGJ1aWxkQXR0cmlidXRlVmFsdWUgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgdmFsdWUgdG8gYmUgCi0gICAgICAgICAgICAgKiBhc3NpZ25lZCB0byB0aGUgYXR0cmlidXRlLgotICAgICAgICAgICAgICogRWl0aGVyIHRyYW5zZm9ybWVyQ2xhc3Mgb3IgbWV0aG9kIG11c3QgYmUgc3BlY2lmaWVkLCBidXQgbm90IGJvdGguCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDbGFzcyB0cmFuc2Zvcm1lckNsYXNzKCkgZGVmYXVsdCB2b2lkLmNsYXNzOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFRoZSBtYXBwZWQgY2xhc3MgbXVzdCBoYXZlIGEgbWV0aG9kIHdpdGggdGhpcyBuYW1lIHdoaWNoIHJldHVybnMgCi0gICAgICAgICAgICAgKiBhIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBhdHRyaWJ1dGUgKG5vdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byAKLSAgICAgICAgICAgICAqIHRoZSBhdHRyaWJ1dGUpLiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSAKLSAgICAgICAgICAgICAqIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgU3RyaW5nIG1ldGhvZCgpIGRlZmF1bHQgIiI7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybi1pbnNlcnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBSZXR1cm5JbnNlcnQgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBBIFJldHVybkluc2VydCBhbm5vdGF0aW9uIGFsbG93cyBmb3IgSU5TRVJUIG9wZXJhdGlvbnMgdG8gcmV0dXJuIAotICAgICAgICAgICAgICogdmFsdWVzIGJhY2sgaW50byB0aGUgb2JqZWN0IGJlaW5nIHdyaXR0ZW4uIFRoaXMgYWxsb3dzIGZvciB0YWJsZSAKLSAgICAgICAgICAgICAqIGRlZmF1bHQgdmFsdWVzLCB0cmlnZ2VyIG9yIHN0b3JlZCBwcm9jZWR1cmVzIGNvbXB1dGVkIHZhbHVlcyB0byAKLSAgICAgICAgICAgICAqIGJlIHNldCBiYWNrIGludG8gdGhlIG9iamVjdC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiByZXR1cm5Pbmx5KCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmV0dXJuLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vjb25kYXJ5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uW10gcGtKb2luQ29sdW1ucygpIGRlZmF1bHQge307Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgdHlwZT0ib3JtOnByaW1hcnkta2V5LWpvaW4tY29sdW1uIiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY3JlYXRpb24tc3VmZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZS1nZW5lcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvciB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLSAgICAgICAgICBTdHJpbmcgc2VxdWVuY2VOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgaW50IGluaXRpYWxWYWx1ZSgpIGRlZmF1bHQgMTsKLSAgICAgICAgICBpbnQgYWxsb2NhdGlvblNpemUoKSBkZWZhdWx0IDUwOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJpbml0aWFsLXZhbHVlIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNxbC1yZXN1bHQtc2V0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTcWxSZXN1bHRTZXRNYXBwaW5nIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIEVudGl0eVJlc3VsdFtdIGVudGl0aWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgICBDb2x1bW5SZXN1bHRbXSBjb2x1bW5zKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW50aXR5LXJlc3VsdCIgdHlwZT0ib3JtOmVudGl0eS1yZXN1bHQiIAotICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tcmVzdWx0IiB0eXBlPSJvcm06Y29sdW1uLXJlc3VsdCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEEgU3RvcmVkUHJvY2VkdXJlUGFyYW1ldGVyIGFubm90YXRpb24gaXMgdXNlZCB3aXRoaW4gYSAKLSAgICAgICAgICogTmFtZWRTdG9yZWRQcm9jZWR1cmVRdWVyeSBhbm5vdGF0aW9uLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHt9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0b3JlZFByb2NlZHVyZVBhcmFtZXRlciB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlci4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXJlY3Rpb24gZGlyZWN0aW9uKCkgZGVmYXVsdCBJTjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3RvcmVkIHByb2NlZHVyZSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIFRoZSBxdWVyeSBwYXJhbWV0ZXIgbmFtZS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgcXVlcnlQYXJhbWV0ZXIoKTsKLSAgICAKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIERlZmluZSBpZiB0aGUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLCBvciBvcHRpb25hbCBhbmQgZGVmYXVsdGVkIGJ5IHRoZSBwcm9jZWR1cmUuCi0gICAgICAgICAgICovCi0gICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgZmFsc2U7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIEphdmEgY2xhc3MgZGVzaXJlZCBiYWNrIGZyb20gdGhlIHByb2NlZHVyZSwgCi0gICAgICAgICAgICogdGhpcyBpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIHR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgY29kZSwgdGhpcyBkZXBlbmRlbnQgb24gdGhlIHR5cGUgcmV0dXJuZWQgCi0gICAgICAgICAgICogZnJvbSB0aGUgcHJvY2VkdXJlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGludCBqZGJjVHlwZSgpIGRlZmF1bHQgLTE7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBKREJDIHR5cGUgbmFtZSwgdGhpcyBtYXkgYmUgcmVxdWlyZWQgZm9yIEFSUkFZIG9yIAotICAgICAgICAgICAqIFNUUlVDVCB0eXBlcy4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgamRiY1R5cGVOYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJvcm06ZGlyZWN0aW9uLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icXVlcnktcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImpkYmMtdHlwZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJqZGJjLXR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1wYXJhbWV0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAgICAgLyoqIAotICAgICAgICAgICAgICogQSBQTFNRTFBhcmFtZXRlciBhbm5vdGF0aW9uIGlzIHVzZWQgd2l0aGluIGEgCi0gICAgICAgICAgICAgKiBOYW1lZFBMU1FMU3RvcmVkUHJvY2VkdXJlUXVlcnkgb3IgUExTUUxSZWNvcmQgYW5ub3RhdGlvbi4KLSAgICAgICAgICAgICAqIAotICAgICAgICAgICAgICogQHNlZSBOYW1lZFBMU1FMU3RvcmVkUHJvY2VkdXJlUXVlcnkKLSAgICAgICAgICAgICAqIEBzZWUgUExTUUxSZWNvcmQKLSAgICAgICAgICAgICAqIEBhdXRob3IgSmFtZXMgU3V0aGVybGFuZAotICAgICAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMwotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBMU1FMUGFyYW1ldGVyIHsKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXJlY3Rpb24gb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUgcGFyYW1ldGVyLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkaXJlY3Rpb24oKSBkZWZhdWx0IElOOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogKFJlcXVpcmVkKSBTdG9yZWQgcHJvY2VkdXJlIHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHF1ZXJ5IHBhcmFtZXRlciBuYW1lLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgRGVmaW5lIGlmIHRoZSBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQsIG9yIG9wdGlvbmFsIGFuZCBkZWZhdWx0ZWQgYnkgdGhlIHByb2NlZHVyZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBib29sZWFuIG9wdGlvbmFsKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkYXRhYmFzZSBkYXRhLXR5cGUgZm9yIHRoZSBwYXJhbXRlci4KLSAgICAgICAgICAgICAgICAgKiBUaGlzIGVpdGhlciBvbmUgb2YgdGhlIHR5cGUgY29uc3RhbnRzIGRlZmluZWQgaW4gT3JhY2xlUExTUUxUeXBlcywgb3IgSkRCQ1R5cGVzLAotICAgICAgICAgICAgICAgICAqIG9yIGEgY3VzdG9tIHJlY29yZCBvciB0YWJsZSB0eXBlIG5hbWUuCi0gICAgICAgICAgICAgICAgICogQHNlZSBQTFNRTFJlY29yZAotICAgICAgICAgICAgICAgICAqIEBzZWUgT3JhY2xlUExTUUxUeXBlcwotICAgICAgICAgICAgICAgICAqIEBzZWUgSkRCQ1R5cGVzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgU3RyaW5nIGRhdGFiYXNlVHlwZSgpIGRlZmF1bHQgIlZBUkNIQVIiOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG1heCBsZW5ndGggb2YgdGhlIGZpZWxkIHZhbHVlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDI1NTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIElmIGEgbnVtZXJpYywgdGhlIG1heCBzY2FsZSB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpbnQgc2NhbGUoKSBkZWZhdWx0IDA7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAoT3B0aW9uYWwpIElmIGEgbnVtZXJpYywgdGhlIG1heCBwcmVjaXNpb24gdmFsdWUuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaW50IHByZWNpc2lvbigpIGRlZmF1bHQgMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ib3JtOmRpcmVjdGlvbi10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InF1ZXJ5LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRhdGFiYXNlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBTdHJ1Y3RDb252ZXJ0ZXIgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgTmFtZSB0aGlzIGNvbnZlcnRlci4gVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBhY3Jvc3MgCi0gICAgICAgICAgICogdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgU3RyaW5nIG5hbWUoKTsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGNvbnZlcnRlciBjbGFzcyB0byBiZSB1c2VkLiBUaGlzIGNsYXNzIG11c3QgCi0gICAgICAgICAgICogaW1wbGVtZW50IHRoZSBFY2xpcHNlTGluayBpbnRlcmZhY2UgCi0gICAgICAgICAgICogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuY29udmVydGVycy5Db252ZXJ0ZXIKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBTdHJpbmcgY29udmVydGVyKCk7IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RydWN0Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqIAotICAgICAgICAgKiBTdHJ1Y3QgdHlwZXMgYXJlIGV4dGVuZGVkIG9iamVjdC1yZWxhdGlvbmFsIGRhdGEtdHlwZXMgc3VwcG9ydGVkIGJ5IHNvbWUgZGF0YWJhc2VzLgotICAgICAgICAgKiBTdHJ1Y3QgdHlwZXMgYXJlIHVzZXIgZGVmaW5lIHR5cGVzIGluIHRoZSBkYXRhYmFzZSBzdWNoIGFzIE9CSkVDVCB0eXBlcyBvbiBPcmFjbGUuCi0gICAgICAgICAqIFN0cnVjdHMgY2FuIG5vcm1hbGx5IGNvbnRhaW5zIEFycmF5cyAoVkFSUkFZKSBvciBvdGhlciBTdHJ1Y3QgdHlwZXMsIGFuZCBjYW4gYmUgc3RvcmVkIGluCi0gICAgICAgICAqIGEgY29sdW1uIG9yIGEgdGFibGUuCi0gICAgICAgICAqIFRoaXMgYW5ub3RhdGlvbiBkZWZpbmUgYSBjbGFzcyB0byBtYXAgdG8gYSBkYXRhYmFzZSBTdHJ1Y3QgdHlwZS4KLSAgICAgICAgICogVGhlIGNsYXNzIHNob3VsZCBub3JtYWxseSBiZSBhbiBFbWJlZGRhYmxlLCBidXQgY291bGQgYWxzbyBiZSBhbiBFbnRpdHkgaWYgc3RvcmVkIGluIGEgb2JqZWN0IHRhYmxlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLk9iamVjdFJlbGF0aW9uYWxEYXRhVHlwZURlc2NyaXB0b3IKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLlN0cnVjdHVyZU1hcHBpbmcKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjMKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChSZXF1aXJlZCkgVGhlIGRhdGFiYXNlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIHN0cnVjdHVyZSB0eXBlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHRoZSBvcmRlciBvZiB0aGUgZmllbGRzIGNvbnRhaW5lZCBpbiB0aGUgZGF0YWJhc2Ugc3RydWN0dXJlIHR5cGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIGZpZWxkcygpIGRlZmF1bHQge307IAotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIFN0cnVjdCB0eXBlcyBhcmUgZXh0ZW5kZWQgb2JqZWN0LXJlbGF0aW9uYWwgZGF0YS10eXBlcyBzdXBwb3J0ZWQgYnkgc29tZSBkYXRhYmFzZXMuCi0gICAgICAgICAqIFN0cnVjdCB0eXBlcyBhcmUgdXNlciBkZWZpbmUgdHlwZXMgaW4gdGhlIGRhdGFiYXNlIHN1Y2ggYXMgT0JKRUNUIHR5cGVzIG9uIE9yYWNsZS4KLSAgICAgICAgICogU3RydWN0cyBjYW4gbm9ybWFsbHkgY29udGFpbnMgQXJyYXlzIChWQVJSQVkpIG9yIG90aGVyIFN0cnVjdCB0eXBlcywgYW5kIGNhbiBiZSBzdG9yZWQgaW4KLSAgICAgICAgICogYSBjb2x1bW4gb3IgYSB0YWJsZS4KLSAgICAgICAgICogVGhpcyBhbm5vdGF0aW9uIGNhbiBiZSBkZWZpbmVkIG9uIGEgZmllbGQvbWV0aG9kIHRvIGRlZmluZSBhbiBTdHJ1Y3R1cmVNYXBwaW5nIHRvIGFuIGVtYmVkZGVkIFN0cnVjdCB0eXBlLgotICAgICAgICAgKiBUaGUgdGFyZ2V0IEVtYmVkZGFibGUgbXVzdCBiZSBtYXBwZWQgdXNpbmcgdGhlIFN0cnVjdCBhbm5vdGF0aW9uLgotICAgICAgICAgKiAKLSAgICAgICAgICogQHNlZSBTdHJ1Y3QKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLk9iamVjdFJlbGF0aW9uYWxEYXRhVHlwZURlc2NyaXB0b3IKLSAgICAgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5zdHJ1Y3R1cmVzLlN0cnVjdHVyZU1hcHBpbmcKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjMKLSAgICAgICAgICovCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFN0cnVjdHVyZSB7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7VFlQRX0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGFibGUgewotICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBTdHJpbmcgY2F0YWxvZygpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCIgdHlwZT0ib3JtOnVuaXF1ZS1jb25zdHJhaW50IiAKLSAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICAKLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5kZXgiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKiogCi0gICAgICAgICAqIEFsbG93IGEgZGF0YWJhc2UgSU5ERVggdG8gYmUgZGVmaW5lIHdoZW4gZ2VuZXJhdGluZyBEREwuCi0gICAgICAgICAqIFRoZSBASW5kZXggY2FuIGJlIGRlZmluZWQgb24gYSBFbnRpdHkgY2xhc3MsIG9yIG9uIGFuIGF0dHJpYnV0ZS4KLSAgICAgICAgICogVGhlIGNvbHVtbiBpcyBkZWZhdWx0ZWQgd2hlbiBkZWZpbmVkIG9uIGEgYXR0cmlidXRlLgotICAgICAgICAgKiAKLSAgICAgICAgICogQGF1dGhvciBKYW1lcyBTdXRoZXJsYW5kCi0gICAgICAgICAqIEBzaW5jZSBFY2xpcHNlTGluayAyLjIKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBUWVBFfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBJbmRleCB7Ci0gICAgICAgICAgICAvKiogVGhlIG5hbWUgb2YgdGhlIElOREVYLCBkZWZhdWx0cyB0byBJTkRFWF8odGFibGUtbmFtZSkgKi8KLSAgICAgICAgICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgc2NoZW1hIG9mIHRoZSBJTkRFWCAqLwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtYSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8qKiBUaGUgY2F0YWxvZyBvZiB0aGUgSU5ERVggKi8KLSAgICAgICAgICAgIFN0cmluZyBjYXRhbG9nKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqIFRoZSB0YWJsZSB0byBkZWZpbmUgdGhlIGluZGV4IG9uLCBkZWZhdWx0cyB0byBlbnRpdGllcyBwcmltYXJ5IHRhYmxlLiAqLwotICAgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYm9vbGVhbiB1bmlxdWUoKSBkZWZhdWx0IGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgdGhlIHNldCBvZiBjb2x1bW5zIHRvIGRlZmluZSB0aGUgaW5kZXggb24uCi0gICAgICAgICAgICAgKiBOb3QgcmVxdWlyZWQgd2hlbiBhbm5vdGF0ZWQgb24gYSBmaWVsZC9tZXRob2QuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjYXRhbG9nIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ1bmlxdWUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLWdlbmVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe1RZUEUsIE1FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRhYmxlR2VuZXJhdG9yIHsKLSAgICAgICAgICBTdHJpbmcgbmFtZSgpOwotICAgICAgICAgIFN0cmluZyB0YWJsZSgpIGRlZmF1bHQgIiI7Ci0gICAgICAgICAgU3RyaW5nIGNhdGFsb2coKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBzY2hlbWEoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZyBwa0NvbHVtblZhbHVlKCkgZGVmYXVsdCAiIjsKLSAgICAgICAgICBpbnQgaW5pdGlhbFZhbHVlKCkgZGVmYXVsdCAwOwotICAgICAgICAgIGludCBhbGxvY2F0aW9uU2l6ZSgpIGRlZmF1bHQgNTA7Ci0gICAgICAgICAgVW5pcXVlQ29uc3RyYWludFtdIHVuaXF1ZUNvbnN0cmFpbnRzKCkgZGVmYXVsdCB7fTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idW5pcXVlLWNvbnN0cmFpbnQiIHR5cGU9Im9ybTp1bmlxdWUtY29uc3RyYWludCIgCi0gICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzY2hlbWEiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjcmVhdGlvbi1zdWZmaXgiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJway1jb2x1bW4tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlLWNvbHVtbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icGstY29sdW1uLXZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaW5pdGlhbC12YWx1ZSIgdHlwZT0ieHNkOmludCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFsbG9jYXRpb24tc2l6ZSIgdHlwZT0ieHNkOmludCIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InRlbXBvcmFsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVtcG9yYWwgewotICAgICAgICAgIFRlbXBvcmFsVHlwZSB2YWx1ZSgpOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9Im9ybTp0ZW1wb3JhbC10eXBlIi8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ0ZW1wb3JhbC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLSAgICAgICAgICBEQVRFLCAvLyBqYXZhLnNxbC5EYXRlCi0gICAgICAgICAgVElNRSwgLy8gamF2YS5zcWwuVGltZQotICAgICAgICAgIFRJTUVTVEFNUCAvLyBqYXZhLnNxbC5UaW1lc3RhbXAKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDp0b2tlbiI+Ci0gICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkRBVEUiLz4KLSAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iVElNRSIvPgotICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJUSU1FU1RBTVAiLz4KLSAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0ZW5hbnQtZGlzY3JpbWluYXRvci1jb2x1bW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgQFRhcmdldCh7fSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbiB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgY29sdW1uIHRvIGJlIHVzZWQgZm9yIHRoZSB0ZW5hbnQgZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICJURU5BTlRfSUQiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG5hbWUgb2YgdGhlIGNvbnRleHQgcHJvcGVydHkgdG8gYXBwbHkgdG8gdGhlIAotICAgICAgICAgICAgICogdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBTdHJpbmcgY29udGV4dFByb3BlcnR5KCkgZGVmYXVsdCAiZWNsaXBzZWxpbmsudGVuYW50LWlkIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSB0eXBlIG9mIG9iamVjdC9jb2x1bW4gdG8gdXNlIGFzIGEgY2xhc3MgZGlzY3JpbWluYXRvci4KLSAgICAgICAgICAgICAqIERlZmF1bHRzIHRvIHtAbGluayBEaXNjcmltaW5hdG9yVHlwZSNTVFJJTkcgRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HfS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUoKSBkZWZhdWx0IERpc2NyaW1pbmF0b3JUeXBlLlNUUklORzsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBTUUwgZnJhZ21lbnQgdGhhdCBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgRERMCi0gICAgICAgICAgICAgKiBmb3IgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uLgotICAgICAgICAgICAgICogRGVmYXVsdHMgdG8gdGhlIHByb3ZpZGVyLWdlbmVyYXRlZCBTUUwgdG8gY3JlYXRlIGEgY29sdW1uCi0gICAgICAgICAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgdHlwZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24oKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIGNvbHVtbiBsZW5ndGggZm9yIFN0cmluZy1iYXNlZCBkaXNjcmltaW5hdG9yIHR5cGVzLgotICAgICAgICAgICAgICogSWdub3JlZCBmb3Igb3RoZXIgZGlzY3JpbWluYXRvciB0eXBlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IGxlbmd0aCgpIGRlZmF1bHQgMzE7Ci0KLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdGhhdCBjb250YWlucyB0aGUgY29sdW1uLgotICAgICAgICAgICAgICogSWYgYWJzZW50IHRoZSBjb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBpbiB0aGUgcHJpbWFyeSB0YWJsZS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgU3RyaW5nIHRhYmxlKCkgZGVmYXVsdCAiIjsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBTcGVjaWZpZXMgdGhhdCB0aGUgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGlzIHBhcnQgb2YgdGhlIHByaW1hcnkgCi0gICAgICAgICAgICAgKiBrZXkgb2YgdGhlIHRhYmxlcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBwcmltYXJ5S2V5KCkgZGVmYXVsdCBmYWxzZTsgCi0gICAgICAgIH0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY29udGV4dC1wcm9wZXJ0eSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImRpc2NyaW1pbmF0b3ItdHlwZSIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibGVuZ3RoIiB0eXBlPSJ4c2Q6aW50Ii8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwcmltYXJ5LWtleSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIAotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+ICAKLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtb2YtZGF5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgQFRhcmdldCh7fSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUaW1lT2ZEYXkgewotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgSG91ciBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgaG91cigpIGRlZmF1bHQgMDsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgTWludXRlIG9mIHRoZSBkYXkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGludCBtaW51dGUoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgc2Vjb25kKCkgZGVmYXVsdCAwOwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBNaWxsaXNlY29uZCBvZiB0aGUgZGF5LgotICAgICAgICAgICAqLyAKLSAgICAgICAgICBpbnQgbWlsbGlzZWNvbmQoKSBkZWZhdWx0IDA7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiBJbnRlcm5hbCB1c2UuIERvIG5vdCBtb2RpZnkuCi0gICAgICAgICAgICovIAotICAgICAgICAgIGJvb2xlYW4gc3BlY2lmaWVkKCkgZGVmYXVsdCB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJob3VyIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im1pbnV0ZSIgdHlwZT0ieHNkOmludGVnZXIiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWlsbGlzZWNvbmQiIHR5cGU9InhzZDppbnRlZ2VyIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLQotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGlzIGFuIG9wdGlvbmFsIGFubm90YXRpb24gZm9yIAotICAgICAgICAgKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tYXBwaW5ncy5UcmFuc2Zvcm1hdGlvbk1hcHBpbmcuCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uTWFwcGluZyBhbGxvd3MgdG8gbWFwIGFuIGF0dHJpYnV0ZSB0byBvbmUgb3IgbW9yZSAKLSAgICAgICAgICogZGF0YWJhc2UgY29sdW1ucy4KLSAgICAgICAgICogCi0gICAgICAgICAqIFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24gaXMgYW4gb3B0aW9uYWwgcGFydCBvZiAKLSAgICAgICAgICogVHJhbnNmb3JtYXRpb25NYXBwaW5nIGRlZmluaXRpb24uIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIAotICAgICAgICAgKiB3cml0ZS1vbmx5LCBpdCBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyAKLSAgICAgICAgICogdHJhbnNmb3JtYXRpb24gb2YgZGF0YWJhc2UgY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqIEFsc28gdW5sZXNzIGl0J3MgYSByZWFkLW9ubHkgbWFwcGluZywgZWl0aGVyIFdyaXRlVHJhbnNmb3JtZXIgCi0gICAgICAgICAqIGFubm90YXRpb24gb3IgV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbiBzaG91bGQgYmUgc3BlY2lmaWVkLiBFYWNoIAotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuIAotICAgICAgICAgKi8gCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KQotICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYW5zZm9ybWF0aW9uIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgICAqIHNob3VsZCBiZSBsYXppbHkgbG9hZGVkIG9yIG11c3QgYmUgZWFnZXJseSBmZXRjaGVkLiBUaGUgRUFHRVIgCi0gICAgICAgICAgICAgKiBzdHJhdGVneSBpcyBhIHJlcXVpcmVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lIAotICAgICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICAgKiBoaW50IHRvIHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlciBydW50aW1lLiBJZiBub3Qgc3BlY2lmaWVkLCAKLSAgICAgICAgICAgICAqIGRlZmF1bHRzIHRvIEVBR0VSLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBGZXRjaFR5cGUgZmV0Y2goKSBkZWZhdWx0IEVBR0VSOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIG9wdGlvbmFsIGVsZW1lbnQgaXMgYSBoaW50IGFzIHRvIHdoZXRoZXIgdGhlIHZhbHVlCi0gICAgICAgICAgICAgKiAgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBJdCBpcyBkaXNyZWdhcmRlZAotICAgICAgICAgICAgICogIGZvciBwcmltaXRpdmUgdHlwZXMsIHdoaWNoIGFyZSBjb25zaWRlcmVkIG5vbi1vcHRpb25hbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYm9vbGVhbiBvcHRpb25hbCgpIGRlZmF1bHQgdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWFkLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06cmVhZC10cmFuc2Zvcm1lciIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9IndyaXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJvcm06d3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0ib3JtOnByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWNjZXNzLW1ldGhvZHMiIHR5cGU9Im9ybTphY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZldGNoIiB0eXBlPSJvcm06ZmV0Y2gtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFjY2VzcyIgdHlwZT0ib3JtOmFjY2Vzcy10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2llbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUcmFuc2llbnQge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICBAVGFyZ2V0KHtUWVBFLCBNRVRIT0QsIEZJRUxEfSkKLSAgICAgICAgQFJldGVudGlvbihSVU5USU1FKQotICAgICAgICBwdWJsaWMgQGludGVyZmFjZSBUeXBlQ29udmVydGVyIHsKLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoUmVxdWlyZWQpIE5hbWUgdGhpcyBjb252ZXJ0ZXIuIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUKLSAgICAgICAgICAgKiBhY3Jvc3MgdGhlIHdob2xlIHBlcnNpc3RlbmNlIHVuaXQuCi0gICAgICAgICAgICovCi0gICAgICAgICAgIFN0cmluZyBuYW1lKCk7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFNwZWNpZnkgdGhlIHR5cGUgc3RvcmVkIG9uIHRoZSBkYXRhYmFzZS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZCAKLSAgICAgICAgICAgKiBvciBwcm9wZXJ0eS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyBkYXRhVHlwZSgpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgU3BlY2lmeSB0aGUgdHlwZSBzdG9yZWQgb24gdGhlIGVudGl0eS4gVGhlCi0gICAgICAgICAgICogZGVmYXVsdCBpcyBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIG9mIHRoZSBwZXJzaXN0ZW50IGZpZWxkIAotICAgICAgICAgICAqIG9yIHByb3BlcnR5LgotICAgICAgICAgICAqLwotICAgICAgICAgIENsYXNzIG9iamVjdFR5cGUoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvYmplY3QtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlxdWUtY29uc3RyYWludCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe30pIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludCB7Ci0gICAgICAgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgICAgICAgIFN0cmluZ1tdIGNvbHVtbk5hbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIAotICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+Ci0KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YXJpYWJsZS1vbmUtdG8tb25lIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKiAKLSAgICAgICAgICogVmFyaWFibGUgb25lIHRvIG9uZSBtYXBwaW5ncyBhcmUgdXNlZCB0byByZXByZXNlbnQgYSBwb2ludGVyIAotICAgICAgICAgKiByZWZlcmVuY2VzIGJldHdlZW4gYSBqYXZhIG9iamVjdCBhbmQgYW4gaW1wbGVtZW50ZXIgb2YgYW4gaW50ZXJmYWNlLiAKLSAgICAgICAgICogVGhpcyBtYXBwaW5nIGlzIHVzdWFsbHkgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciAoc3RvcmVkIGluIGFuIAotICAgICAgICAgKiBpbnN0YW5jZSB2YXJpYWJsZSkgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgb2JqZWN0cy4gSW4gdGhlIAotICAgICAgICAgKiByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlcywgdGhlc2UgbWFwcGluZ3MgYXJlIG5vcm1hbGx5IGltcGxlbWVudGVkIAotICAgICAgICAgKiB1c2luZyBhIGZvcmVpZ24ga2V5IGFuZCBhIHR5cGUgY29kZS4KLSAgICAgICAgICogCi0gICAgICAgICAqIEEgVmFyaWFibGVPbmVUb09uZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGhpbiBhbiBFbnRpdHksIAotICAgICAgICAgKiBNYXBwZWRTdXBlcmNsYXNzIGFuZCBFbWJlZGRhYmxlIGNsYXNzLiAKLSAgICAgICAgICovIAotICAgICAgICBAVGFyZ2V0KHtNRVRIT0QsIEZJRUxEfSkgCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVmFyaWFibGVPbmVUb09uZSB7Ci0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBUaGUgaW50ZXJmYWNlIGNsYXNzIHRoYXQgaXMgdGhlIHRhcmdldCBvZiB0aGUgCi0gICAgICAgICAgICogYXNzb2NpYXRpb24uIElmIG5vdCBzcGVjaWZpZWQgaXQgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSB0eXBlIAotICAgICAgICAgICAqIG9mIHRoZSBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDbGFzcyB0YXJnZXRJbnRlcmZhY2UoKSBkZWZhdWx0IHZvaWQuY2xhc3M7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBvcGVyYXRpb25zIHRoYXQgbXVzdCBiZSBjYXNjYWRlZCB0byB0aGUgdGFyZ2V0IG9mIAotICAgICAgICAgICAqIHRoZSBhc3NvY2lhdGlvbi4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDYXNjYWRlVHlwZVtdIGNhc2NhZGUoKSBkZWZhdWx0IHt9OwotCi0gICAgICAgICAgLyoqCi0gICAgICAgICAgICogKE9wdGlvbmFsKSBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBvciBwcm9wZXJ0eSAKLSAgICAgICAgICAgKiBzaG91bGQgYmUgbGF6aWx5IGxvYWRlZCBvciBtdXN0IGJlIGVhZ2VybHkgZmV0Y2hlZC4gVGhlIEVBR0VSIAotICAgICAgICAgICAqIHN0cmF0ZWd5IGlzIGEgcmVxdWlyZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHJ1bnRpbWUgCi0gICAgICAgICAgICogdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSBlYWdlcmx5IGZldGNoZWQuIFRoZSBMQVpZIHN0cmF0ZWd5IGlzIGEgCi0gICAgICAgICAgICogaGludCB0byB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIgcnVudGltZS4gSWYgbm90IHNwZWNpZmllZCwgCi0gICAgICAgICAgICogZGVmYXVsdHMgdG8gRUFHRVIuCi0gICAgICAgICAgICovCi0gICAgICAgICAgRmV0Y2hUeXBlIGZldGNoKCkgZGVmYXVsdCBFQUdFUjsKLQotICAgICAgICAgIC8qKgotICAgICAgICAgICAqIChPcHRpb25hbCkgV2hldGhlciB0aGUgYXNzb2NpYXRpb24gaXMgb3B0aW9uYWwuIElmIHNldCB0byBmYWxzZSAKLSAgICAgICAgICAgKiB0aGVuIGEgbm9uLW51bGwgcmVsYXRpb25zaGlwIG11c3QgYWx3YXlzIGV4aXN0LgotICAgICAgICAgICAqLwotICAgICAgICAgIGJvb2xlYW4gb3B0aW9uYWwoKSBkZWZhdWx0IHRydWU7Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aWxsIGhvbGQgdGhlIHR5cGUgCi0gICAgICAgICAgICogaW5kaWNhdG9ycy4gSWYgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgbm90IHNwZWNpZmllZCwgdGhlIG5hbWUgCi0gICAgICAgICAgICogb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIGRlZmF1bHRzIHRvICJEVFlQRSIgYW5kIHRoZSAKLSAgICAgICAgICAgKiBkaXNjcmltaW5hdG9yIHR5cGUgdG8gU1RSSU5HLgotICAgICAgICAgICAqLwotICAgICAgICAgIERpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbigpIGRlZmF1bHQgQERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLSAgICAgICAgICAvKioKLSAgICAgICAgICAgKiAoT3B0aW9uYWwpIFRoZSBsaXN0IG9mIGRpc2NyaW1pbmF0b3IgdHlwZXMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIAotICAgICAgICAgICAqIHRoaXMgVmFyaWFibGVPbmVUb09uZS4gSWYgbm9uZSBhcmUgc3BlY2lmaWVkIHRoZW4gdGhvc2UgZW50aXRpZXMgCi0gICAgICAgICAgICogd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHRoYXQgaW1wbGVtZW50IHRoZSB0YXJnZXQgaW50ZXJmYWNlIAotICAgICAgICAgICAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdHlwZXMuIFRoZSBkaXNjcmltaW5hdG9yIHR5cGUgd2lsbCAKLSAgICAgICAgICAgKiBkZWZhdWx0IGFzIGZvbGxvd3M6Ci0gICAgICAgICAgICogIC0gSWYgRGlzY3JpbWluYXRvckNvbHVtbiB0eXBlIGlzIFNUUklORzogRW50aXR5Lm5hbWUoKQotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBDSEFSOiBGaXJzdCBsZXR0ZXIgb2YgdGhlIAotICAgICAgICAgICAqICAgIEVudGl0eSBjbGFzcwotICAgICAgICAgICAqICAtIElmIERpc2NyaW1pbmF0b3JDb2x1bW4gdHlwZSBpcyBJTlRFR0VSOiBUaGUgbmV4dCBpbnRlZ2VyIGFmdGVyIAotICAgICAgICAgICAqICAgIHRoZSBoaWdoZXN0IGludGVnZXIgZXhwbGljaXRseSBhZGRlZC4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBEaXNjcmltaW5hdG9yQ2xhc3NbXSBkaXNjcmltaW5hdG9yQ2xhc3NlcygpIGRlZmF1bHQge307Ci0gICAgICAgIH0KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FzY2FkZSIgdHlwZT0ib3JtOmNhc2NhZGUtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jb2x1bW4iIHR5cGU9Im9ybTpkaXNjcmltaW5hdG9yLWNvbHVtbiIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlzY3JpbWluYXRvci1jbGFzcyIgdHlwZT0ib3JtOmRpc2NyaW1pbmF0b3ItY2xhc3MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqb2luLWNvbHVtbiIgdHlwZT0ib3JtOmpvaW4tY29sdW1uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpdmF0ZS1vd25lZCIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vbmNhY2hlYWJsZSIgdHlwZT0ib3JtOmVtcHR5VHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmdyb3VwIHJlZj0ib3JtOnBhcnRpdGlvbmluZy1ncm91cCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQtaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZmV0Y2giIHR5cGU9Im9ybTpmZXRjaC10eXBlIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYWNjZXNzIiB0eXBlPSJvcm06YWNjZXNzLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcnBoYW4tcmVtb3ZhbCIgdHlwZT0ieHNkOmJvb2xlYW4iLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotCi0gICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTER9KSBAUmV0ZW50aW9uKFJVTlRJTUUpCi0gICAgICAgIHB1YmxpYyBAaW50ZXJmYWNlIFZlcnNpb24ge30KLQotICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29sdW1uIiB0eXBlPSJvcm06Y29sdW1uIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbmRleCIgdHlwZT0ib3JtOmluZGV4IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0ZW1wb3JhbCIgdHlwZT0ib3JtOnRlbXBvcmFsIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0IiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiB0eXBlPSJvcm06Y29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLWNvbnZlcnRlciIgdHlwZT0ib3JtOnR5cGUtY29udmVydGVyIi8+Ci0gICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtdHlwZS1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpvYmplY3QtdHlwZS1jb252ZXJ0ZXIiLz4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9Im9ybTpzdHJ1Y3QtY29udmVydGVyIi8+Ci0gICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIHR5cGU9Im9ybTpwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFjY2Vzcy1tZXRob2RzIiB0eXBlPSJvcm06YWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhY2Nlc3MiIHR5cGU9Im9ybTphY2Nlc3MtdHlwZSIvPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id3JpdGUtdHJhbnNmb3JtZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW5ub3RhdGlvbiBmb3Igb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubWFwcGluZ3MuVHJhbnNmb3JtYXRpb25NYXBwaW5nLgotICAgICAgICAgKiBXcml0ZVRyYW5zZm9ybWVyIGRlZmluZXMgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIAotICAgICAgICAgKiBzaW5nbGUgZGF0YWJhc2UgY29sdW1uIHZhbHVlIChjb2x1bW4gaXMgc3BlY2lmaWVkIGluIHRoZSAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcikuCi0gICAgICAgICAqICAKLSAgICAgICAgICogQSBzaW5nbGUgV3JpdGVUcmFuc2Zvcm1lciBtYXkgYmUgc3BlY2lmaWVkIGRpcmVjdGx5IG9uIHRoZSBtZXRob2Qgb3IgCi0gICAgICAgICAqIGF0dHJpYnV0ZS4gTXVsdGlwbGUgV3JpdGVUcmFuc2Zvcm1lcnMgc2hvdWxkIGJlIHdyYXBwZWQgaW50byAKLSAgICAgICAgICogV3JpdGVUcmFuc2Zvcm1lcnMgYW5ub3RhdGlvbi4gTm8gV3JpdGVUcmFuc2Zvcm1lcnMgc3BlY2lmaWVkIGZvciAKLSAgICAgICAgICogcmVhZC1vbmx5IG1hcHBpbmcuIFVubGVzcyB0aGUgVHJhbnNmb3JtYXRpb25NYXBwaW5nIGlzIHdyaXRlLW9ubHksIGl0IAotICAgICAgICAgKiBzaG91bGQgaGF2ZSBhIFJlYWRUcmFuc2Zvcm1lciwgaXQgZGVmaW5lcyB0cmFuc2Zvcm1hdGlvbiBvZiBkYXRhYmFzZSAKLSAgICAgICAgICogY29sdW1uKHMpIHZhbHVlKHMpaW50byBhdHRyaWJ1dGUgdmFsdWUuCi0gICAgICAgICAqLyAKLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgV3JpdGVUcmFuc2Zvcm1lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFVzZXItZGVmaW5lZCBjbGFzcyB0aGF0IG11c3QgaW1wbGVtZW50IHRoZSAKLSAgICAgICAgICAgICAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1hcHBpbmdzLnRyYW5zZm9ybWVycy5GaWVsZFRyYW5zZm9ybWVyIAotICAgICAgICAgICAgICogaW50ZXJmYWNlLiBUaGUgY2xhc3Mgd2lsbCBiZSBpbnN0YW50aWF0ZWQsIGl0cyBidWlsZEZpZWxkVmFsdWUgCi0gICAgICAgICAgICAgKiB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIAotICAgICAgICAgICAgICogY29sdW1uLiBOb3RlIHRoYXQgZm9yIGRkbCBnZW5lcmF0aW9uIGFuZCByZXR1cm5pbmcgdG8gYmUgCi0gICAgICAgICAgICAgKiBzdXBwb3J0ZWQgdGhlIG1ldGhvZCBidWlsZEZpZWxkVmFsdWUgaW4gdGhlIGNsYXNzIHNob3VsZCBiZSAKLSAgICAgICAgICAgICAqIGRlZmluZWQgdG8gcmV0dXJuIHRoZSByZWxldmFudCBKYXZhIHR5cGUsIG5vdCBqdXN0IE9iamVjdCBhcyAKLSAgICAgICAgICAgICAqIGRlZmluZWQgaW4gdGhlIGludGVyZmFjZSwgZm9yIGluc3RhbmNlOgotICAgICAgICAgICAgICogcHVibGljIFRpbWUgYnVpbGRGaWVsZFZhbHVlKE9iamVjdCBpbnN0YW5jZSwgU3RyaW5nIGZpZWxkTmFtZSwgU2Vzc2lvbiBzZXNzaW9uKS4KLSAgICAgICAgICAgICAqIEVpdGhlciB0cmFuc2Zvcm1lckNsYXNzIG9yIG1ldGhvZCBtdXN0IGJlIHNwZWNpZmllZCwgYnV0IG5vdCBib3RoLgotICAgICAgICAgICAgICovIAotICAgICAgICAgICAgQ2xhc3MgdHJhbnNmb3JtZXJDbGFzcygpIGRlZmF1bHQgdm9pZC5jbGFzczsKLQotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBUaGUgbWFwcGVkIGNsYXNzIG11c3QgaGF2ZSBhIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSB3aGljaCByZXR1cm5zIAotICAgICAgICAgICAgICogYSB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gdGhlIGRhdGFiYXNlIGNvbHVtbi4KLSAgICAgICAgICAgICAqIE5vdGUgdGhhdCBmb3IgZGRsIGdlbmVyYXRpb24gYW5kIHJldHVybmluZyB0byBiZSBzdXBwb3J0ZWQgdGhlIAotICAgICAgICAgICAgICogbWV0aG9kIHNob3VsZCBiZSBkZWZpbmVkIHRvIHJldHVybiBhIHBhcnRpY3VsYXIgdHlwZSwgbm90IGp1c3QgCi0gICAgICAgICAgICAgKiBPYmplY3QsIGZvciBpbnN0YW5jZToKLSAgICAgICAgICAgICAqIHB1YmxpYyBUaW1lIGdldFN0YXJ0VGltZSgpLgotICAgICAgICAgICAgICogVGhlIG1ldGhvZCBtYXkgcmVxdWlyZSBhIFRyYW5zaWVudCBhbm5vdGF0aW9uIHRvIGF2b2lkIGJlaW5nIAotICAgICAgICAgICAgICogbWFwcGVkIGFzIEJhc2ljIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgKiBFaXRoZXIgdHJhbnNmb3JtZXJDbGFzcyBvciBtZXRob2QgbXVzdCBiZSBzcGVjaWZpZWQsIGJ1dCBub3QgYm90aC4KLSAgICAgICAgICAgICAqLyAKLSAgICAgICAgICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOwotCi0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIFNwZWNpZnkgaGVyZSB0aGUgY29sdW1uIGludG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuLgotICAgICAgICAgICAgICogVGhlIG9ubHkgY2FzZSB3aGVuIHRoaXMgY291bGQgYmUgc2tpcHBlZCBpcyBpZiBhIHNpbmdsZSAKLSAgICAgICAgICAgICAqIFdyaXRlVHJhbnNmb3JtZXIgYW5ub3RhdGVzIGFuIGF0dHJpYnV0ZSAtIHRoZSBhdHRyaWJ1dGUncyBuYW1lIAotICAgICAgICAgICAgICogd2lsbCBiZSB1c2VkIGFzIGEgY29sdW1uIG5hbWUuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBDb2x1bW4gY29sdW1uKCkgZGVmYXVsdCBAQ29sdW1uOwotICAgICAgICB9Ci0KLSAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbHVtbiIgdHlwZT0ib3JtOmNvbHVtbiIvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIi8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KLSAgIAotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhdGNoLWZldGNoIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBIEJhdGNoRmV0Y2ggYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCBvbiBhbnkgcmVsYXRpb25zaGlwIG1hcHBpbmcsCi0gICAgICAgICAqIChPbmVUb09uZSwgTWFueVRvT25lLCBPbmVUb01hbnksIE1hbnlUb01hbnksIEVsZW1lbnRDb2xsZWN0aW9uLCBCYXNpY0NvbGxlY3Rpb24sIEJhc2ljTWFwKS4KLSAgICAgICAgICogSXQgYWxsb3dzIHRoZSByZWxhdGVkIG9iamVjdHMgdG8gYmUgYmF0Y2ggcmVhZCBpbiBhIHNpbmdsZSBxdWVyeS4KLSAgICAgICAgICogQmF0Y2ggZmV0Y2hpbmcgY2FuIGFsc28gYmUgc2V0IGF0IHRoZSBxdWVyeSBsZXZlbCwgYW5kIGl0IGlzIAotICAgICAgICAgKiBub3JtYWxseSByZWNvbW1lbmRlZCB0byBkbyBzbyBhcyBhbGwgcXVlcmllcyBtYXkgbm90IHJlcXVpcmUgYmF0Y2hpbmcuCi0gICAgICAgICAqIAotICAgICAgICAgKiBAYXV0aG9yIEphbWVzIFN1dGhlcmxhbmQKLSAgICAgICAgICogQHNpbmNlIEVjbGlwc2VMaW5rIDIuMQotICAgICAgICAgKi8KLSAgICAgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUlVOVElNRSkKLSAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgQmF0Y2hGZXRjaCB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIChPcHRpb25hbCkgVGhlIHR5cGUgb2YgYmF0Y2gtZmV0Y2ggdG8gdXNlLgotICAgICAgICAgICAgICogRWl0aGVyIEpPSU4sIEVYSVNUUyBvciBJTi4KLSAgICAgICAgICAgICAqIEpPSU4gaXMgdGhlIGRlZmF1bHQuCi0gICAgICAgICAgICAgKi8gCi0gICAgICAgICAgICBCYXRjaEZldGNoVHlwZSB2YWx1ZSgpIGRlZmF1bHQgQmF0Y2hGZXRjaFR5cGUuSk9JTjsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBEZWZpbmUgdGhlIGRlZmF1bHQgYmF0Y2ggZmV0Y2ggc2l6ZS4KLSAgICAgICAgICAgICAqIFRoaXMgaXMgb25seSB1c2VkIGZvciBJTiB0eXBlIGJhdGNoIHJlYWRpbmcgYW5kIGRlZmluZXMKLSAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2Yga2V5cyB1c2VkIGluIGVhY2ggSU4gY2xhdXNlLgotICAgICAgICAgICAgICogVGhlIGRlZmF1bHQgc2l6ZSBpcyAyNTYsIG9yIHRoZSBxdWVyeSdzIHBhZ2VTaXplIGZvciBjdXJzb3IgcXVlcmllcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW50IHNpemUoKSBkZWZhdWx0IC0xOwotICAgICAgICB9Ci0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ib3JtOmJhdGNoLWZldGNoLXR5cGUiLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJzaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgCi08L3hzZDpzY2hlbWE+Ci0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMC54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8wLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIxMGNlNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8wLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBkbWNjYW5uIC0gTm92ZW1iZXIgMjQvMjAwOSAtIDIuMCAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIiAKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgdmVyc2lvbj0iMi4wIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1iaW5kaW5ncyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImphdmEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXJvb3QtZWxlbWVudCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2VlLWFsc28iIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLWF0dHJpYnV0ZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImphdmEtYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtdHJhbnNpZW50IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWN1c3RvbWl6ZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLW9yZGVyIiB0eXBlPSJ4bWwtYWNjZXNzLW9yZGVyIiBkZWZhdWx0PSJVTkRFRklORUQiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0KLSAgICA8IS0tIEVudW1zIC0tPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3Mtb3JkZXIiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUxQSEFCRVRJQ0FMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRFRklORUQiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3MtdHlwZSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1ucy1mb3JtIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJRVUFMSUZJRUQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOU0VUIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1QQUNLQUdFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1ucyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnQtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxQQUNLQUdFfSkgLS0+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e1BBQ0tBR0UsRklFTEQsTUVUSE9ELFRZUEUsUEFSQU1FVEVSfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFRZUEV9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHJhbnNpZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPVRZUEUpIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvcC1vcmRlciI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1yb290LWVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2VlLWFsc28iPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxEfSkgIC0tPgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0R9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYXR0cmlidXRlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXgiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbS1oYW5kbGVyIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uVzNDRG9tSGFuZGxlciIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtbWFwIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudC5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC13cmFwcGVyIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC12YWx1ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJrZXkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+IAotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX294bV8yXzEueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZWE4NDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIAotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wIAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLiAKLSBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgZG1jY2FubiAtIERlY2VtYmVyIDA4LzIwMDkgLSAyLjEgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPHhzOnNjaGVtYSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIAotICAgIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIgotICAgIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIgCi0gICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgYXR0cmlidXRlRm9ybURlZmF1bHQ9InVucXVhbGlmaWVkIgotICAgIHZlcnNpb249IjIuMSI+Ci0KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYmluZGluZ3MiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXJzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cmllcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXJlZ2lzdHJ5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW1zIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZW51bSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9ImphdmEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cnkiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtZGVjbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJcdTAwMDAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjb3BlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wuR0xPQkFMIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yb290LWVsZW1lbnQiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNlZS1hbHNvIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS1hdHRyaWJ1dGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1jdXN0b21pemVyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci10eXBlIiB0eXBlPSJ4bWwtYWNjZXNzLXR5cGUiIGRlZmF1bHQ9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hY2Nlc3Nvci1vcmRlciIgdHlwZT0ieG1sLWFjY2Vzcy1vcmRlciIgZGVmYXVsdD0iVU5ERUZJTkVEIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIHR5cGU9ImphdmEtYXR0cmlidXRlIiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIHR5cGU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSBFbnVtcyAtLT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLW9yZGVyIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMUEhBQkVUSUNBTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLXR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbnMtZm9ybSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlNFVCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLW1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9UEFDS0FHRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50LWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYS10eXBlcyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFBBQ0tBR0V9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZS5ERUZBVUxUIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17UEFDS0FHRSxGSUVMRCxNRVRIT0QsVFlQRSxQQVJBTUVURVJ9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsVFlQRX0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10cmFuc2llbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9VFlQRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW0iPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZW51bS12YWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtZW51bSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb3Atb3JkZXIiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcm9vdC1lbGVtZW50Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNlZS1hbHNvIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRH0pICAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bS12YWx1ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWVudW0tdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0R9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFueS1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxheCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9tLWhhbmRsZXIiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5XM0NEb21IYW5kbGVyIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50IiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLW1hcCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50LkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYXR0YWNobWVudC1yZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taW1lLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnRzIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1yZWYiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1yZWZzIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtcmVmIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtaW52ZXJzZS1yZWZlcmVuY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtd3JhcHBlciI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdmFsdWUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbWFwIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJrZXkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+IAotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIHR5cGU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJudWxsLXJlcHJlc2VudGF0aW9uLWZvci14bWwiIHR5cGU9InhtbC1tYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iIC8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnVsbC1wb2xpY3kiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWlzLXNldC1udWxsLXBvbGljeSIgc3Vic3RpdHV0aW9uR3JvdXA9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpcy1zZXQtbWV0aG9kLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMi54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8yLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlMzdjNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8yLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBkbWNjYW5uIC0gT2N0b2JlciAxMi8yMDEwIC0gMi4yIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0tLT4KLTx4czpzY2hlbWEgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAKLSAgICB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlL294bSIKLSAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iIAotICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgICB2ZXJzaW9uPSIyLjIiPgotCi0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWJpbmRpbmdzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlZ2lzdHJpZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1yZWdpc3RyeSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVudW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJqYXZhLXR5cGVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJqYXZhLXR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3ItdHlwZSIgdHlwZT0ieG1sLWFjY2Vzcy10eXBlIiBkZWZhdWx0PSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYWNrYWdlLW5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cnkiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtZGVjbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJcdTAwMDAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjb3BlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wuR0xPQkFMIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcm9vdC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zZWUtYWxzbyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWNsYXNzLWV4dHJhY3RvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1cGVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWN1c3RvbWl6ZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWRpc2NyaW1pbmF0b3Itbm9kZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtY2xhc3MtZXh0cmFjdG9yIiB0eXBlPSJ4bWwtY2xhc3MtZXh0cmFjdG9yIiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2xhc3MtZXh0cmFjdG9yIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcHJvcGVydGllcyIgdHlwZT0ieG1sLXByb3BlcnRpZXMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1wcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXByb3BlcnR5IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiA+Ci0gICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YS5sYW5nLlN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPCEtLSBFbnVtcyAtLT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLW9yZGVyIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFMUEhBQkVUSUNBTCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iVU5ERUZJTkVEIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtYWNjZXNzLXR5cGUiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRklFTEQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Ik5PTkUiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBST1BFUlRZIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQVUJMSUNfTUVNQkVSIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbnMtZm9ybSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlFVQUxJRklFRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTlNFVCIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ieG1sLW1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJYU0lfTklMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9UEFDS0FHRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJlZml4IiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYXR0cmlidXRlLWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbGVtZW50LWZvcm0tZGVmYXVsdCIgdHlwZT0ieG1sLW5zLWZvcm0iIGRlZmF1bHQ9IlVOU0VUIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNjaGVtYS10eXBlcyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17RklFTEQsTUVUSE9ELFBBQ0tBR0V9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hLXR5cGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZS5ERUZBVUxUIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT17UEFDS0FHRSxGSUVMRCxNRVRIT0QsVFlQRSxQQVJBTUVURVJ9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsVFlQRX0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10cmFuc2llbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIiAvPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9VFlQRSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVudW0iPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZW51bS12YWx1ZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtZW51bSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlLkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImZhY3RvcnktbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb3Atb3JkZXIiPgotICAgICAgICAgICAgICAgIDx4czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHM6YXR0cmlidXRlPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcm9vdC1lbGVtZW50Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXNlZS1hbHNvIj4KLSAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOnNpbXBsZVR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRH0pICAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bS12YWx1ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWVudW0tdmFsdWUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6c2ltcGxlQ29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0R9KSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hdHRyaWJ1dGUiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWtleSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pbmxpbmUtYmluYXJ5LWRhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtYW55LWVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXJlZnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJsYXgiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbS1oYW5kbGVyIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uVzNDRG9tSGFuZGxlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtbWFwIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdC12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5pbGxhYmxlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50LkRFRkFVTFQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1rZXkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYXR0YWNobWVudC1yZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taW1lLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnRzIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWpvaW4tbm9kZXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC1yZWYiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgdHlwZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZi5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXJlZnMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC1yZWYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtaW52ZXJzZS1yZWZlcmVuY2UiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1hcHBlZC1ieSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXdyYXBwZXIiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuaWxsYWJsZSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXZhbHVlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLW1hcCI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ia2V5IiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0idmFsdWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPiAKLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiB0eXBlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibnVsbC1yZXByZXNlbnRhdGlvbi1mb3IteG1sIiB0eXBlPSJ4bWwtbWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiBkZWZhdWx0PSJBQlNFTlRfTk9ERSIgLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1udWxsLXBvbGljeSIgc3Vic3RpdHV0aW9uR3JvdXA9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2V0LXBlcmZvcm1lZC1mb3ItYWJzZW50LW5vZGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtaXMtc2V0LW51bGwtcG9saWN5IiBzdWJzdGl0dXRpb25Hcm91cD0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iaXMtc2V0LXBhcmFtZXRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaXMtc2V0LW1ldGhvZC1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtdHJhbnNmb3JtYXRpb24iIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVhZC10cmFuc2Zvcm1lciI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC13cml0ZS10cmFuc2Zvcm1lciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHJhbnNmb3JtZXItY2xhc3MiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im9wdGlvbmFsIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtam9pbi1ub2RlcyIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIiA+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWpvaW4tbm9kZSIgbWluT2NjdXJzPSIxIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlZmVyZW5jZWQteG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotPC94czpzY2hlbWE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfb3htXzJfMy54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8zLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRhNGQ1NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19veG1fMl8zLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDU4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAgCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uIAotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgCi0gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBkbWNjYW5uIC0gRGVjZW1iZXIgMjIvMjAxMCAtIDIuMyAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgCi0gICAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9veG0iCi0gICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2Uvb3htIiAKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIKLSAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgdmVyc2lvbj0iMi4zIj4KLQotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1iaW5kaW5ncyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGVzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlcnMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1yZWdpc3RyaWVzIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcmVnaXN0cnkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbnVtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iamF2YS10eXBlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS10eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLW9yZGVyIiB0eXBlPSJ4bWwtYWNjZXNzLW9yZGVyIiBkZWZhdWx0PSJVTkRFRklORUQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1tYXBwaW5nLW1ldGFkYXRhLWNvbXBsZXRlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGFja2FnZS1uYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW5hbWUtdHJhbnNmb3JtZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3VwcG9ydGVkLXZlcnNpb25zIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcmVnaXN0cnkiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWVsZW1lbnQtZGVjbCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRWYWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJcdTAwMDAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjb3BlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wuR0xPQkFMIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzdWJzdGl0dXRpb25IZWFkTmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcm9vdC1lbGVtZW50IiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC12aXJ0dWFsLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zZWUtYWxzbyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtamF2YS10eXBlLWFkYXB0ZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWNsYXNzLWV4dHJhY3RvciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0iamF2YS1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN1cGVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtYWNjZXNzb3Itb3JkZXIiIHR5cGU9InhtbC1hY2Nlc3Mtb3JkZXIiIGRlZmF1bHQ9IlVOREVGSU5FRCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWFjY2Vzc29yLXR5cGUiIHR5cGU9InhtbC1hY2Nlc3MtdHlwZSIgZGVmYXVsdD0iUFVCTElDX01FTUJFUiIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWN1c3RvbWl6ZXIiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWRpc2NyaW1pbmF0b3Itbm9kZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtZGlzY3JpbWluYXRvci12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaW5saW5lLWJpbmFyeS1kYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXRyYW5zaWVudCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1uYW1lLXRyYW5zZm9ybWVyIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9ImphdmEtYXR0cmlidXRlIiB0eXBlPSJqYXZhLWF0dHJpYnV0ZSIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iamF2YS1hdHRyaWJ1dGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJqYXZhLWF0dHJpYnV0ZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyI+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1jbGFzcy1leHRyYWN0b3IiIHR5cGU9InhtbC1jbGFzcy1leHRyYWN0b3IiIC8+Ci0gICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1leHRyYWN0b3IiPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiLz4KLSAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1wcm9wZXJ0aWVzIiB0eXBlPSJ4bWwtcHJvcGVydGllcyIgLz4KLSAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXByb3BlcnRpZXMiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtcHJvcGVydHkiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZhLmxhbmcuU3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8IS0tIEVudW1zIC0tPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3Mtb3JkZXIiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iQUxQSEFCRVRJQ0FMIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJVTkRFRklORUQiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1hY2Nlc3MtdHlwZSI+Ci0gICAgICAgIDx4czpyZXN0cmljdGlvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJGSUVMRCIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ORSIgLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUFJPUEVSVFkiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlBVQkxJQ19NRU1CRVIiIC8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPgotICAgIDx4czpzaW1wbGVUeXBlIG5hbWU9InhtbC1ucy1mb3JtIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOUVVBTElGSUVEIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJRVUFMSUZJRUQiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlVOU0VUIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtbWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIj4KLSAgICAgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IlhTSV9OSUwiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJFTVBUWV9OT0RFIiAvPgotICAgICAgICA8L3hzOnJlc3RyaWN0aW9uPgotICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJzdXBwb3J0ZWQtdmVyc2lvbnMiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMi4wIi8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IjIuMSIvPgotICAgICAgICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSIyLjIiLz4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iMi4zIi8+Ci0gICAgICAgIDwveHM6cmVzdHJpY3Rpb24+Ci0gICAgPC94czpzaW1wbGVUeXBlPiAKLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1QQUNLQUdFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1ucyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlLXVyaSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwcmVmaXgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJhdHRyaWJ1dGUtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVsZW1lbnQtZm9ybS1kZWZhdWx0IiB0eXBlPSJ4bWwtbnMtZm9ybSIgZGVmYXVsdD0iVU5TRVQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxvY2F0aW9uIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2NoZW1hLXR5cGVzIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXNjaGVtYS10eXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWphdmEtdHlwZS1hZGFwdGVycyI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtGSUVMRCxNRVRIT0QsUEFDS0FHRX0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1zY2hlbWEtdHlwZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlLkRFRkFVTFQiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotCi0gICAgPCEtLSBAVGFyZ2V0KHZhbHVlPXtQQUNLQUdFLEZJRUxELE1FVEhPRCxUWVBFLFBBUkFNRVRFUn0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlci5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRCxUWVBFfSkgLS0+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXRyYW5zaWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiIC8+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLQotICAgIDwhLS0gQFRhcmdldCh2YWx1ZT1UWVBFKSAtLT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZW51bSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbnVtLXZhbHVlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iamF2YS1lbnVtIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmEubGFuZy5TdHJpbmciIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC10eXBlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeS1jbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGUuREVGQVVMVCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeS1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icHJvcC1vcmRlciI+Ci0gICAgICAgICAgICAgICAgPHhzOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpzaW1wbGVUeXBlPgotICAgICAgICAgICAgPC94czphdHRyaWJ1dGU+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1yb290LWVsZW1lbnQiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtc2VlLWFsc28iPgotICAgICAgICA8eHM6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgIDwveHM6c2ltcGxlVHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXZpcnR1YWwtYWNjZXNzLW1ldGhvZHMiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImdldC1tZXRob2QiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iZ2V0IiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9InNldCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ic2NoZW1hIiB0eXBlPSJ4bWwtdmlydHVhbC1hY2Nlc3MtbWV0aG9kcy1zY2hlbWEiIGRlZmF1bHQ9Ik5PREVTIiAvPgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJ4bWwtdmlydHVhbC1hY2Nlc3MtbWV0aG9kcy1zY2hlbWEiPgotICAgICAgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iTk9ERVMiIC8+Ci0gICAgICAgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9IkFOWSIgLz4KLSAgICAgICAgPC94czpyZXN0cmljdGlvbj4KLSAgICA8L3hzOnNpbXBsZVR5cGU+Ci0KLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxEfSkgIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbnVtLXZhbHVlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4czpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImphdmEtZW51bS12YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpzaW1wbGVDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICAKLSAgICA8IS0tIEBUYXJnZXQodmFsdWU9e0ZJRUxELE1FVEhPRH0pIC0tPgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hbnktYXR0cmlidXRlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWF0dHJpYnV0ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1zY2hlbWEtdHlwZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlkcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwta2V5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbGlzdCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWlubGluZS1iaW5hcnktZGF0YSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWF0dGFjaG1lbnQtcmVmIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWltZS10eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hbnktZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtcmVmcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtbWl4ZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImxheCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9tLWhhbmRsZXIiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5XM0NEb21IYW5kbGVyIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudCIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPiAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQtd3JhcHBlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1tYXAiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtc2NoZW1hLXR5cGUiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czphbGw+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQuREVGQVVMVCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pZHJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWtleSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLWxpc3QiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1pbmxpbmUtYmluYXJ5LWRhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1hdHRhY2htZW50LXJlZiIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1pbWUtdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id3JpdGUtb25seSIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2RhdGEiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudHMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWVsZW1lbnQiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtam9pbi1ub2RlcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtaWRyZWYiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1saXN0IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXJlZiIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC13cmFwcGVyIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9ImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZi5ERUZBVUxUIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InhtbC1taXhlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ3cml0ZS1vbmx5IiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1lbGVtZW50LXJlZnMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiB0eXBlPSJ4bWwtYWNjZXNzLW1ldGhvZHMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtZWxlbWVudC1yZWYiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1lbGVtZW50LXdyYXBwZXIiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWphdmEtdHlwZS1hZGFwdGVyIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLW1peGVkIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWludmVyc2UtcmVmZXJlbmNlIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphbGw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1hY2Nlc3MtbWV0aG9kcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtcHJvcGVydGllcyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXBwZWQtYnkiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtZWxlbWVudC13cmFwcGVyIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmlsbGFibGUiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZXF1aXJlZCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC12YWx1ZSIgc3Vic3RpdHV0aW9uR3JvdXA9ImphdmEtYXR0cmlidXRlIj4KLSAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgICAgIDx4czpleHRlbnNpb24gYmFzZT0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1wcm9wZXJ0aWVzIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InhtbC1qYXZhLXR5cGUtYWRhcHRlciIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6YWxsPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNkYXRhIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgZGVmYXVsdD0iIyNkZWZhdWx0IiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9IndyaXRlLW9ubHkiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNvbnRhaW5lci10eXBlIiB0eXBlPSJ4czpzdHJpbmciIGRlZmF1bHQ9IiMjZGVmYXVsdCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzOmV4dGVuc2lvbj4KLSAgICAgICAgICAgIDwveHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1tYXAiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6YWxsPgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImtleSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InZhbHVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzOmFsbD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4gCi0gICAgPC94czplbGVtZW50PgotICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSIgdHlwZT0ieG1sLWFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4c2ktbmlsLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+Ci0gICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW1wdHktbm9kZS1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgotICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ieG1sLW1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiIgZGVmYXVsdD0iQUJTRU5UX05PREUiIC8+Ci0gICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtbnVsbC1wb2xpY3kiIHN1YnN0aXR1dGlvbkdyb3VwPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJ4bWwtYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4czpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWlzLXNldC1udWxsLXBvbGljeSIgc3Vic3RpdHV0aW9uR3JvdXA9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDx4czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgICAgICA8eHM6ZXh0ZW5zaW9uIGJhc2U9InhtbC1hYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9ImlzLXNldC1wYXJhbWV0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXRyYW5zZm9ybWF0aW9uIiBzdWJzdGl0dXRpb25Hcm91cD0iamF2YS1hdHRyaWJ1dGUiPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1hY2Nlc3MtbWV0aG9kcyIgdHlwZT0ieG1sLWFjY2Vzcy1tZXRob2RzIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IHJlZj0ieG1sLXByb3BlcnRpZXMiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLXJlYWQtdHJhbnNmb3JtZXIiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHM6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJ4bWwtd3JpdGUtdHJhbnNmb3JtZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZXRob2QiIHR5cGU9InhzOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ4bWwtcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4czpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJvcHRpb25hbCIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDwveHM6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgPC94czpjb21wbGV4Q29udGVudD4KLSAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICA8L3hzOmVsZW1lbnQ+Ci0gICAgPHhzOmVsZW1lbnQgbmFtZT0ieG1sLWpvaW4tbm9kZXMiIHN1YnN0aXR1dGlvbkdyb3VwPSJqYXZhLWF0dHJpYnV0ZSIgPgotICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8eHM6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgPHhzOmV4dGVuc2lvbiBiYXNlPSJqYXZhLWF0dHJpYnV0ZSI+Ci0gICAgICAgICAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9InhtbC1qb2luLW5vZGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ieG1sLXBhdGgiIHR5cGU9InhzOnN0cmluZyIgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWZlcmVuY2VkLXhtbC1wYXRoIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94czpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6c3RyaW5nIiBkZWZhdWx0PSIjI2RlZmF1bHQiIC8+Ci0gICAgICAgICAgICAgICAgPC94czpleHRlbnNpb24+Ci0gICAgICAgICAgICA8L3hzOmNvbXBsZXhDb250ZW50PgotICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgotICAgIDwveHM6ZWxlbWVudD4KLTwveHM6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjEueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMS54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NDZlYWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfcGVyc2lzdGVuY2VfbWFwXzEuMS54c2QKKysrIC9kZXYvbnVsbApAQCAtMSw0MTgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLQotIENvbnRyaWJ1dG9yczoKLSAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIGZyb20gT3JhY2xlIFRvcExpbmsKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLS0+Ci08IS0tIEVjbGlwc2UgUGVyc2lzdGVuY2UgU2VydmljZSBQcm9qZWN0IDo6IE1hcCBTY2hlbWEgZmlsZSBmb3IgT1JNL09YTS9FSVMgLS0+Ci08eHNkOnNjaGVtYQotICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSIKLSAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKLSAgdmVyc2lvbj0iMS4xIgotICA+Ci0gIDx4c2Q6ZWxlbWVudCBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiIHR5cGU9Im9iamVjdC1wZXJzaXN0ZW5jZSIgLz4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcGVyc2lzdGVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvYmplY3QtcGVyc2lzdGVuY2UgbWFwcGluZyBtb2R1bGUsIGEgc2V0IG9mIGNsYXNzLW1hcHBpbmctZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIG5hbWUgZm9yIHRoZSBtb2RlbCBiZWluZyBtYXBwZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBjbGFzcyBtYXBwaW5nIGRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiIHR5cGU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2dpbiIgdHlwZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkZWZhdWx0LXRlbXBvcmFsLW11dGFibGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZWZhdWx0IGZvciBob3cgRGF0ZSBhbmQgQ2FsZW5kYXIgdHlwZXMgYXJlIHVzZWQgd2l0aCBjaGFuZ2UgdHJhY2tpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QnkgZGVmYXVsdCB0aGV5IGFyZSBhc3N1bWVkIG5vdCB0byBiZSBjaGFuZ2VkIGRpcmVjdGx5IChvbmx5IHJlcGxhY2VkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBkZWZhdWx0PSJFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2VzIC0gMS4xIChCdWlsZCBZWU1NREQpIiBuYW1lPSJ2ZXJzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHBsYXRmb3JtIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZGF0YXNvdXJjZSB1c2VyLW5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgcGFzc3dvcmQsIHRoaXMgaXMgc3RvcmVkIGluIGVuY3J5cHRlZCBmb3JtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNvbm5lY3Rpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBkYXRhc291cmNlIGRyaXZlciwgYW5kIGEgbmV3IGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmUgcGVyIGNhbGwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZXh0ZXJuYWwtdHJhbnNhY3Rpb24tY29udHJvbGxlciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIHRyYW5zYWN0aW9uIGFyZSBtYW5hZ2VkIGJ5IGEgdHJhbnNhY3Rpb24gbWFuYWdlciwgYW5kIHNob3VsZCBub3QgYmUgbWFuYWdlZCBieSBUb3BMaW5rLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCBpZiB0aGUgZGF0YXNvdXJjZSBkb2VzIG5vdCBzdXBwb3J0IHRyYW5zYWN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNpbmcgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVmYXVsdC1zZXF1ZW5jZSIgdHlwZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmF1bHQgc2VxdWVuY2UuIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VxdWVuY2VzIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ob24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZSBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBkcml2ZXIgYW5kIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRyaXZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEpEQkMgZHJpdmVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgSkRCQyBkcml2ZXIgY29ubmVjdGlvbiBVUkwuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgcGFyYW1ldGVyIGJpbmRpbmcgc2hvdWxkIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdGF0ZW1lbnQgY2FjaGluZyBzaG91bGQgYmUgdXNlZC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZywgdGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGJ5dGUgYXJyYXkgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyaW5nLWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgZGF0YS10eXBlcyBzaG91bGQgdXNlIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIyNTYiIG5hbWU9InN0cmluZy1iaW5kaW5nLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGhyZXNob2xkIHN0cmluZyBzaXplIGZvciB1c2FnZSBvZiBzdHJpbmcgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgbGFyZ2UgYnl0ZSBhcnJheSBhbmQgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIGJlIGJvdW5kIGFzIHN0cmVhbXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZm9yY2UtZmllbGQtbmFtZXMtdG8tdXBwZXItY2FzZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIHRvIGZvcmNlIGFsbCBmaWVsZCBuYW1lcyB0byB1cHBlci1jYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgZGF0YSBvcHRpbWl6YXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ0cmltLXN0cmluZ3MiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBzdHJpbmcgdHJhaWxpbmcgYmxhbmtzIHNob3VsZCBiZSB0cmltbWVkLiAgVGhpcyBpcyBub3JtYWxseSByZXF1aXJlZCBmb3IgQ0hBUiBkYXRhLXR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXdyaXRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB1c2luZyBiYXRjaCB3cml0aW5nLCBjb25maWd1cmUgaWYgdGhlIEpEQkMgZHJpdmVycyBiYXRjaCB3cml0aW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkNBIGRyaXZlciBhbmQgRUlTIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFRvcExpbmsgcGxhdGZvcm0gc3BlY2lmaWMgY29ubmVjdGlvbiBzcGVjIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29ubmVjdGlvbi1mYWN0b3J5LXVybCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSk5ESSB1cmwgZm9yIHRoZSBtYW5hZ2VkIEpDQSBhZGFwdGVyJ3MgY29ubmVjdGlvbiBmYWN0b3J5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtbG9naW4iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY29ubmVjdGlvbiBhbmQgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgIAk8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAJCW5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAJPHhzZDplbGVtZW50IG5hbWU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiCi0gICAgICAgIAkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIgbWF4T2NjdXJzPSIxIgotICAgICAgICAJCW1pbk9jY3Vycz0iMCI+Ci0gICAgICAgIAk8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5mb3JtYXRpb24gb2YgaG93IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGl0cyBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyBhbiBhYnN0cmFjdCBkZWZpbml0aW9uIHRvIGFsbG93IGZsZXhpYmlsaXR5IGluIHRoZSB0eXBlcyBvZiBjbGFzc2VzIGFuZCBkYXRhc3RvcmVzIHBlcnNpc3RlZCwgaS5lLiBpbnRlcmZhY2VzLCBhYnN0cmFjdCBjbGFzc2VzLCBhZ2dyZWdhdGVzLCBub24tcmVsYXRpb25hbCBwZXJzaXN0ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGJlaW5nIHBlcnNpc3RlZC4gIFRoZSBjbGFzcyBuYW1lIG11c3QgYmUgZnVsbCBxdWFsaWZpZWQgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8Y2xhc3MgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+ZXhhbXBsZS5lbXBsb3llZS5pbXBsZW1lbnRhdGlvbi5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGlhcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBhbiBhbGlhcyBuYW1lIGNhbiBiZSBnaXZlbiBmb3IgdGhlIGNsYXNzLiAgVGhlIGFsaWFzIGlzIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNsYXNzIGluIHBsYWNlIG9mIGl0cyBpbXBsZW1lbnRhdGlvbiBuYW1lLCBzdWNoIGFzIGluIHF1ZXJ5aW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxhbGlhcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5FbXBsb3llZTwvYWxpYXM+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmltYXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzL2NvbHVtbnMgdGhhdCBtYWtlIHVwIHRoZSBwcmltYXJ5IGtleSBvciB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBpcyB1c2VkIGZvciBjYWNoaW5nLCByZWxhdGlvbnNoaXBzLCBhbmQgZm9yIGRhdGFiYXNlIG9wZXJhdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwcmltYXJ5IGtleSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaWYgdGhlIGNsYXNzIGlzIHJlYWQtb25seS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmhlcml0YW5jZSIgdHlwZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MgaXMgcmVsYXRlZCBpbiBpbmhlcml0YW5jZSBhbmQgaG93IHRoaXMgaW5oZXJpdGFuY2UgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnRzIiB0eXBlPSJldmVudC1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnlpbmciIHR5cGU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZGVmaW5lZCBxdWVyaWVzIGZvciB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZ3MiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG1hcHBpbmdzIHRoYXQgZGVmaW5lIGhvdyB0aGUgY2xhc3MnIGF0dHJpYnV0ZXMgYXJlIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmciIHR5cGU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGF0dHJpYnV0ZSBpcyBwZXJzaXN0ZWQuIFRoZSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9uIGlzIGV4dGVuZGFibGUgdG8gYWxsb3cgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVzY3JpcHRvci10eXBlIiB0eXBlPSJjbGFzcy1kZXNjcmlwdG9yLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGRlc2NyaXB0b3IgdHlwZSwgc3VjaCBhcyBhZ2dyZWdhdGUgb3IgaW5kZXBlbmRlbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnRlcmZhY2VzIiB0eXBlPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBpbnRlcmZhY2VzIHRoYXQgdGhpcyBjbGFzcyBpbXBsZW1lbnRzLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxvY2tpbmciIHR5cGU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBsb2NraW5nIGJlaGF2aW9yIGZvciB0aGUgY2xhc3MuICBTdWNoIGFzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gdmVyc2lvbiwgdGltZXN0YW1wIG9yIGNoYW5nZSBzZXQgb2YgY29sdW1ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNpbmciIHR5cGU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVtb3RlLWNhY2hpbmciIHR5cGU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyB0aGUgY2xhc3MnIGluc3RhbmNlcyBzaG91bGQgYmUgY2FjaGVkIG9uIHJlbW90ZSBjbGllbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybmluZy1wb2xpY3kiIHR5cGU9InJldHVybmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgcmV0dW5pbmcgcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIHJldHVybmluZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbWVuZG1lbnQiIHR5cGU9ImFtZW5kbWVudCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnN0YW50aWF0aW9uIiB0eXBlPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvcHlpbmciIHR5cGU9ImNvcHktcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgb2JqZWN0IGNsb25pbmcvY29weWluZyBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnkta2V5cyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBsaXN0IG9mIHF1ZXJ5IGtleXMgb3IgYWxpYXNlcyBmb3IgZGF0YWJhc2UgaW5mb3JtYXRpb24uICBUaGVzZSBjYW4gYmUgdXNlZCBpbiBxdWVyaWVzIGluc3RlYWQgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiBuYW1lcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkta2V5IiB0eXBlPSJxdWVyeS1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbXAtcG9saWN5IiB0eXBlPSJjbXAtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5QbGFjZSBob2xkZXIgb2YgQ01QIGluZm9ybWF0aW9uIHNwZWNpZmljLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXBzIiB0eXBlPSJmZXRjaC1ncm91cHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMgYXQgdGhlIGRlc2NyaXB0b3IgbGV2ZWw8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iY2hhbmdlLXBvbGljeSIgdHlwZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIENoYW5nZSBQb2xpY3kgZm9yIHRoaXMgZGVzY3JpcHRvcjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIxMCIgbmFtZT0ic2NoZW1hLW1ham9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICAgIDx4c2Q6YXR0cmlidXRlIGZpeGVkPSIwIiBuYW1lPSJzY2hlbWEtbWlub3ItdmVyc2lvbiIgdHlwZT0ieHNkOmludGVnZXIiIC8+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2xhc3MgZGVzY3JpcHRvciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5kZXBlbmRlbnQiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhZ2dyZWdhdGUtY29sbGVjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludGVyZmFjZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnRlcmZhY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW50ZXJmYWNlcyB0aGF0IGEgY2xhc3MgZGVzY3JpcHRvciBpbXBsZW1lbnRzLCBvciB0aGUgaW1wbGVtZW50aW9uIGNsYXNzIGZvciBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYSBzZXQgb2YgcHVibGljIGludGVyZmFjZXMgZm9yIHRoZSBjbGFzcyBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcyBhbGxvd3MgdGhlIGludGVyZmFjZSB0byBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPklmIHR3byBjbGFzc2VzIGltcGxlbWVudCB0aGUgc2FtZSBpbnRlcmZhY2UsIGFuIGludGVyZmFjZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBkZWZpbmVkIGZvciB0aGUgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYWxzbyBiZSB1c2VkIHRvIGRlZmluZSBpbmhlcml0YW5jZSBiZXR3ZWVuIGludGVyZmFjZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbnRlcmZhY2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgaW50ZXJmYWNlIGNsYXNzIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuYXBpLkVtcGxveWVlPC9jbGFzcz48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpbXBsZW1lbnRvci1kZXNjcmlwdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB3aGljaCB0aGlzIGludGVyZmFjZSBpcyB0aGUgcHVibGljIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIHRoZSBpbnRlcmZhY2UgaGFzIG9ubHkgYSBzaW5nbGUgaW1wbGVtZW50b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbC5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tY29weS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DcmVhdGVzIGEgY29weWluZyB0aHJvdWdoIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIHRvIGNvcHkgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsb25lLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xvbmUgbWV0aG9kLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBjbG9uZSBtZXRob2Qgb24gdGhlIG9iamVjdCwgaS5lLiAnY2xvbmUnPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc3RhbnRpYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBpbnN0YW50aWF0aW9uIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIGZhY3RvcnkgdG8gaW5zdGFudGlhdGUgdGhlIG9iamVjdCBpbnN0YW5jZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZS4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmYWN0b3J5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBpbnN0YW50aWF0ZSB0aGUgZmFjdG9yeSBjbGFzcy4nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFtZW5kbWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIGNsYXNzIGFuZCBzdGF0aWMgbWV0aG9kIHRvIGJlIGNhbGxlZCB0byBhbGxvdyBmb3IgdGhlIGRlc2NyaXB0b3IgdG8gYmUgYW1lbmRlZCBvciBjdXN0b21pemVkIHRocm91Z2ggYSBjbGFzcyBBUEkgYWZ0ZXIgbG9hZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFtZW5kbWVudCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhbWVuZG1lbnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RhdGljIGFtZW5kbWVudCBtZXRob2Qgb24gdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgcmVsYXRpb25hbCBkYXRhYmFzZSB0YWJsZShzKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YWJsZXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGhlIHRhYmxlcyB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVHlwaWNhbGx5IGEgY2xhc3MgaXMgcGVyc2lzdGVkIHRvIGEgc2luZ2xlIHRhYmxlLCBidXQgbXVsdGlwbGUgdGFibGVzIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InRhYmxlIiB0eXBlPSJ0YWJsZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiB0YWJsZXMgdGhhdCB0aGUgY2xhc3MgaXMgcGVyc2lzdGVkIHRvLiAgVGhpcyBpcyB0eXBpY2FsbHkgYSBzaW5nbGUgdGFibGUgYnV0IGNhbiBiZSBtdWx0aXBsZSwgb3IgZW1wdHkgZm9yIGluaGVyaXRhbmNlIG9yIGFnZ3JlZ2F0ZWQgY2xhc3Nlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXlzLWZvci1tdWx0aXBsZS10YWJsZSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGZvcmVpZ24ga2V5IGZpZWxkIHJlZmVyZW5jZXMgdG8gYmUgZGVmaW5lIGZvciBtdWx0aXBsZSB0YWJsZSBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im11bHRpcGxlLXRhYmxlLWpvaW4tY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBjb21wbGV4IG11bHRpcGxlIHRhYmxlIGpvaW4gY29uZGl0aW9ucyBhbiBleHByZXNzaW9uIG1heSBiZSBwcm92aWRlZCBpbnN0ZWFkIG9mIHRoZSB0YWJsZSBmb3JlaWduIGtleSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGEgbnVtZXJpYyB2ZXJzaW9uIGZpZWxkL2NvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idmVyc2lvbi1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgYW5kIG9wdGlvbmFsbHkgdGhlIHRhYmxlIG9mIHRoZSBjb2x1bW4gdGhhdCB0aGUgYXR0cmlidXRlIGlzIHN0b3JlZCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ic3RvcmUtdmVyc2lvbi1pbi1jYWNoZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdmVyc2lvbiB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIGluIHRoZSBjYWNoZSwgb3IgaWYgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGltZXN0YW1wLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHRpbWVzdGFtcCB2ZXJzaW9uIGNvbHVtbiB0aGF0IHRyYWNrcyBjaGFuZ2VzIGFuZCB0aGUgdmVyc2lvbiB0byBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZlcnNpb24tbG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJzZXJ2ZXItdGltZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgdGltZXN0YW1wIHNob3VsZCBiZSBvYnRhaW5lZCBsb2NhbGx5IG9yIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWxsLWZpZWxkcy1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBjb21wYXJpbmcgdGhlIG9yaWdpbmFsIHJlYWQgdmFsdWVzIG9mIGFsbCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBvbmx5IHRoZSBjaGFuZ2VkIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZWxlY3RlZC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhIHNwZWNpZmllZCBzZXQgb2YgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgc2V0IG9mIGZpZWxkcyB0byBjb21wYXJlIG9uIHVwZGF0ZSBhbmQgZGVsZXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIGRhdGFiYXNlIGdlbmVyYXRlZCB1bmlxdWUgaWQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IuICBUaGlzIGNvdWxkIGJlIHRoZSBuYW1lIG9mIGEgc2VxdWVuY2Ugb2JqZWN0LCBvciBhIHJvdyB2YWx1ZSBpbiBhIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZSBpZCBpcyBhc3NpZ25lZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhY2hpbmcgdHlwZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZnVsbCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LXJlZmVyZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJoYXJkLWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBhbmQgaG93IG9iamVjdCBpZGVudGl0eSBzaG91bGQgYmUgbWFpbnRhaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InNvZnQtY2FjaGUtd2Vhay1yZWZlcmVuY2UiIG5hbWU9ImNhY2hlLXR5cGUiIHR5cGU9ImNhY2hlLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHR5cGUgb2YgY2FjaGluZywgc3VjaCBhcyBMUlUsIHdlYWsgcmVmZXJlbmNlIG9yIG5vbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9ImNhY2hlLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBpbml0aWFsIG9yIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyByZWZyZXNoIGNhY2hlZCBvYmplY3RzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib25seS1yZWZyZXNoLWNhY2hlLWlmLW5ld2VyLXZlcnNpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIHJlZnJlc2ggaWYgdGhlIGNhY2hlZCBvYmplY3QgaXMgYW4gb2xkZXIgdmVyc2lvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJkaXNhYmxlLWNhY2hlLWhpdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EaXNhYmxlIG9idGFpbmluZyBjYWNoZSBoaXRzIG9uIHByaW1hcnkga2V5IHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYWx3YXlzLWNvbmZvcm0iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBjb25mb3JtIHF1ZXJpZXMgd2l0aGluIGEgdHJhbnNhY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaXNvbGF0ZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgb2YgdGhpcyB0eXBlIHNob3VsZCBiZSBpc29sYXRlZCBmcm9tIHRoZSBzaGFyZWQgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJpc29sYXRlLW5ldy1kYXRhLWFmdGVyLXRyYW5zYWN0aW9uIiBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCIgdHlwZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgc2hvdWxkIGJlIGlzb2xhdGVkIHRvIHRoZSBzZXNzaW9uIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJjaGFuZ2Utc2V0IiBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiIHR5cGU9ImNhY2hlLXN5bmMtdHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGlzIGRlc2NyaXBvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2FjaGUtaW52YWxpZGF0aW9uIiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFic3RyYWN0IHN1cGVyY2xhc3MgZm9yIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1cGRhdGUtcmVhZC10aW1lLW9uLXVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWV4cGlyeS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGluIHRoZSBjYWNoZSBkbyBub3QgZXhwaXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWUtdG8tbGl2ZS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeSB3aGVyZSBvYmplY3RzIGxpdmUgYSBzcGVjaWZpYyBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIHRoZXkgYXJlIHJlYWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRpbWUtdG8tbGl2ZSIgdHlwZT0ieHNkOmxvbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYWlseS1jYWNoZS1pbnZhbGlkYXRpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q2FjaGUgaW52YWxpZGF0aW9uIFBvbGljeSB3aGVyZSBvYmplY3RzIGV4cGlyZSBhdCBhIHNwZWNpZmljIHRpbWUgZXZlcnkgZGF5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4cGlyeS10aW1lIiB0eXBlPSJ4c2Q6ZGF0ZVRpbWUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2Ygb2JqZWN0cyBhcmUgdG8gYmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iaGFuZGxlLXdyaXRlcyIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWRhdGFiYXNlLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS10YWJsZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG5hbWVzIG9mIHRoZSBtaXJyb3JpbmcgaGlzdG9yaWNhbCB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJoaXN0b3J5LXRhYmxlIiB0eXBlPSJoaXN0b3J5LXRhYmxlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdGFydC1maWVsZHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHN0YXJ0IGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic3RhcnQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJlbmQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBlbmQgZmllbGRzIGZvciBlYWNoIGhpc3RvcmljYWwgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJlbmQtZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imhpc3RvcnktdGFibGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FYWNoIGVudHJ5IGlzIGEgc291cmNlIChkZXNjcmlwdG9yKSB0byBoaXN0b3J5IHRhYmxlIG5hbWUgYXNzb2NpYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9InNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9Imhpc3RvcnkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMSIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm9zIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5MaXN0cyB0aGUgZmllbGRzIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdGhlIGZsYWdzIGRlZmluaW5nIHJldHVybmluZyBvcHRpb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJyZXR1cm5pbmctZmllbGQtaW5mbyIgdHlwZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5GaWVsZCB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHR5cGUgYW5kIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9ucy4gQXQgbGVhc3Qgb25lIG9mIGluc2VydCwgdXBkYXRlIHNob3VsZCBiZSB0cnVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHRhcmdldCByZWZlcmVuY2VkIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRvIGJlIHJldHVybmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iaW5zZXJ0LW1vZGUtcmV0dXJuLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiBpbnNlcnQ9PXRydWUsIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgbm90IGJlIGluc2VydGVkICh0cnVlKS4gSWYgaW5zZXJ0PT1mYWxzZSAtIGlnbm9yZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSByZXR1bmVkIGFmdGVyIEluc2VydC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5oZXJpdGFuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBhcmVudC1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHBhcmVudC9zdXBlcmNsYXNzIG9mIHRoZSBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkICAgd2l0aCBpdHMgcGFja2FnZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InJlYWQtc3ViY2xhc3Nlcy1vbi1xdWVyaWVzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGlmIHN1YmNsYXNzZXMgb2YgdGhlIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZCBvbiBxdWVyaWVzLCBvciBvbmx5IHRoZSBleGFjdCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLXZpZXciIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSB0aGUgbmFtZSBvZiBhIHZpZXcgdGhhdCBqb2lucyBhbGwgb2YgdGhlIHN1YmNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWNsYXNzLW5hbWUtYXMtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBzaG91bGQgYmUgdXNlZCBhcyB0aGUgY2xhc3MgdHlwZSBpbmRpY2F0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1leHRyYWN0aW9uLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBtZXRob2Qgb24gdGhlIGNsYXNzIHRoYXQgdGFrZXMgdGhlIGNsYXNzJyByb3cgYXMgYXJndW1lbnQgYSBjb21wdXRlZCB0aGF0IGNsYXNzIHR5cGUgdG8gYmUgdXNlZCB0byBpbnN0YW50aWF0ZSBmcm9tIHRoZSByb3cuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBmaWVsZC9jb2x1bW4gdGhhdCB0aGUgY2xhc3MgdHlwZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdG9yIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhIGNsYXNzIGV4dHJhY3RvciBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvbmx5LWluc3RhbmNlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IGFsbCBzaWJsaW5nIGFuZCBzdWJjbGFzcyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFsbC1zdWJjbGFzc2VzLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNyaXRlcmlhIHRoYXQgZmlsdGVycyBvdXQgc2libGluZyBpbnN0YW5jZXMgb24gcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJvdXRlci1qb2luLXN1YmNsYXNzZXMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InFuYW1lLWluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4dGVuZHMgaW5oZXJpdGFuY2UgcG9saWN5LiBBbGxvd3MgZm9yIHByZWZpeGVkIG5hbWVzIHRvIGJlIHJlc29sdmVkIGF0IHJ1bnRpbWUgdG8gZmluZCB0aGUgYXBwcm9yaWF0ZSBjbGFzczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmhlcml0YW5jZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmciPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhlIHR5cGUgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1pbmRpY2F0b3IiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdmFsdWUgdXNlZCB0byBkZWZpbmUgdGhlIGNsYXNzIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXZlbnQtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgcGVyc2lzdGVudCBldmVudHMgZm9yIHRoaXMgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJldmVudC1saXN0ZW5lcnMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXZlbnQtbGlzdGVuZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBldmVudCBsaXN0ZW5lciBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWJ1aWxkLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGJ1aWxkaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3Qtd3JpdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgd3JpdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWluc2VydC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIHVwZGF0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgZGVsZXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtZGVsZXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhYm91dC10by1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8tdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1jbG9uZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBjbG9uaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LW1lcmdlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIG1lcmdpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtcmVmcmVzaC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciByZWZyZXNoaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBhbmQgcXVlcnkgcHJvcGVydGllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcmllcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeSIgdHlwZT0icXVlcnkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgZGVmaW5pdGlvbiBmb3IgdGhlIGNsYXNzJyBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGFwcGx5IHRvIGFsbCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hlY2stY2FjaGUiIG5hbWU9ImV4aXN0ZW5jZSIgdHlwZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIGJlaGF2b2lyIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIGluc2VydCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBpbnNlcnQgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idXBkYXRlLXF1ZXJ5IiB0eXBlPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gdXBkYXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHVwZGF0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkZWxldGUgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgZGVsZXRlIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRvZXMtZXhpc3QtcXVlcnkiIHR5cGU9ImRvZXMtZXhpc3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBkb2VzIGV4aXN0IHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLW9iamVjdC1xdWVyeSIgdHlwZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIG9iamVjdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlYWQtYWxsLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHJlYWQgYWxsIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IHJlYWQgYWxsIGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJleGlzdGVuY2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBwb2xpY2llcyBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gaW5zZXJ0IG9yIHVwZGF0ZSBzaG91bGQgb2NjdXIgZm9yIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgcXVlcnlpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5LWtleSBhbGlhcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgdHlwZSBvZiBjYWNoZSBzeW5jaHJvbml6YXRpb24gdG8gdXNlIHdpdGggYSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW52YWxpZGF0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8tY2hhbmdlcyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQtd2l0aC1uZXctb2JqZWN0cyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoYW5nZS1zZXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ1bml0b2Z3b3JrLWlzb2xhdGlvbi1sZXZlbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSB1bml0IG9mIHdvcmsgaXNvbGF0ZWQgZnJvbSB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVzZS1zZXNzaW9uLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtY2FjaGUtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFsd2F5cyIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InF1ZXJ5LWtleSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGJlaW5nIGFsaWFzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSBqb2luIHRvIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6Y2hvaWNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGpvaW4gY29uZGl0aW9uIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGNsYXNzJyB0YWJsZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgam9pbiBjcml0ZXJpYSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1vbmUtcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLTEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW1hbnktcXVlcnkta2V5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhbGlhcyBmb3IgYSAxLW0gam9pbiBmcm9tIGFub3RoZXIgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLXF1ZXJ5LWtleSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBhIHZhbHVlIHRoYXQgbnVsbCBkYXRhIHZhbHVlcyBzaG91bGQgYmUgY29udmVydGVkIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzaWZpY2F0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS4gIFRoaXMgaXMgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIGF0dHJpYnV0ZSBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJnZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZ2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNldC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzZXQgbWV0aG9kIGZvciB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvcGVydGllcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InByb3BlcnR5IiB0eXBlPSJwcm9wZXJ0eSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSB1c2VyIGRlZmluZWQgcHJvcGVydHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHNpbXBsZSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtZGlyZWN0LW1hcHBpbmciPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZGlyZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBmcm9tIGFuIGF0dGlyYnV0ZSB0byBhIHNpbXBsZSBmaWVsZCBkYXRhdHlwZSwgaS5lLiBTdHJpbmcsIE51bWJlciwgRGF0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1jZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZmllbGQgdHJhbnNmb3JtYXRpb24gZm9yIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWV0aG9kLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zZm9ybWVyLWJhc2VkLWZpZWxkLXRyYW5zZm9ybWF0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zZm9ybWVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSB0cmFuc2Zvcm1hdGlvbiBtYXBwaW5nIHRoYXQgdXNlcyBKYXZhIGNvZGUgdG8gdHJhbnNmb3JtIGJldHdlZW4gdGhlIGRhdGEgYW5kIG9iamVjdCB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBiZSB1c2VkIGlmIGEgc2luZ2xlIGF0dHJpYnV0ZSBtYXBzIHRvIG11bHRpcGxlIGZpZWxkcywgb3IgZmllbGQgb25seSBtYXBwaW5ncyBvciBhdHRyaWJ1dGUgb25seSBtYXBwaW5ncy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1hdGlvbiBkZWZpbmVkIGluIHRoZSBkb21haW4gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtdHJhbnNmb3JtZXIiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0cmFuc2Zvcm1lci4gVXNlZCBpbiBwbGFjZSBvZiBhdHRyaWJ1dGUtdHJhbnNmb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJtdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgdHJhbnNmb3JtYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIHR5cGU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWxhdGlvbnNoaXAgd2hlcmUgdGhlIHRhcmdldCBvYmplY3QgaXMgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0IGFuZCBzdG9yZXMgd2l0aGluIHRoZSBzb3VyY2Ugb2JqZWN0cyByb3c8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImFsbG93LW51bGwiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgYSByb3cgb2YgYWxsIG51bGxzIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBudWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgbWFwcGluZyB0byB1c2UgZGlmZmVyZW50IGZpZWxkIG5hbWVzIHRoYW4gdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10cmFuc2xhdGlvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIGRlc2NyaXB0b3IncyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgYWdncmVnYXRlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgcmVsYXRpb25zaGlwIGJldHdlZW4gdHdvIGNsYXNzZXMgaXMgcGVyc2lzdGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHRhcmdldCBjbGFzcyBvZiB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InByaXZhdGUtb3duZWQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRhcmdldCBvYmplY3RzIGFyZSBwcml2YXRlbHkgb3duZWQgZGVwZW5kZW50IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1wZXJzaXN0IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBjcmVhdGUgb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1tZXJnZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVmcmVzaCBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlbW92ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcmVtb3ZlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvbmUtdG8tb25lLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHRhcmdldCBjbGFzcycgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWdyb3VwaW5nLWVsZW1lbnQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRlbGV0ZS1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByZWxhdGVkIG9iamVjdHMgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIHNpbXBsZSB0eXBlcyByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIHNpbXBsZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UgcHJpbWFyeSBrZXkgYW5kIHRoZSBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3QtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgaW4gdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWZlcmVuY2UgdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJvd3MgZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgc2Vzc2lvbiB0aGF0IGRlZmluZXMgdGhlIHJlZmVyZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIHRoaXMgYXR0cmlidXRlIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtbWFwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gYSBzZXQgb2Yga2V5IHZhbHVlcyBwYWlycyBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXJlY3Qta2V5LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzb3JlcyB0aGUgbWFwIGtleSBkYXRhIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2V5LWNvbnZlcnRlciIgdHlwZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGtleSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcyB3aGVyZSB0aGUgdGFyZ2V0IGluc3RhbmNlcyBhcmUgc3RyaWN0bHkgcHJpdmF0ZWx5IG93bmVkIGJ5IHRoZSBzb3VyY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtYW55LXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWxhdGlvbi10YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVsYXRpb24gdGFibGUgdGhhdCBzdG9yZXMgdGhlIHNvdXJjZS90YXJnZXQgcHJpbWFyeSBrZXlzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXJlbGF0aW9uLWZvcmVpZ24ta2V5IiB0eXBlPSJmb3JlaWduLWtleSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZnJvbSB0aGUgcmVsYXRpb25hbCB0YWJsZSB0byB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zZXJ0LXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGluc2VydCBhIHJvdyBpbnRvIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhIHJvdyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlbGF0aW9uIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFyaWFibGUtb25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UgdGhhdCBtYXkgYmUgb2Ygc2V2ZXJhbCB0eXBlcyByZWxhdGVkIHRocm91Z2ggYW4gaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgY29sdW1uIHRvIHN0b3JlIHRoZSBjbGFzcyB0eXBlIG9mIHRoZSByZWxhdGVkIG9iamVjdCBpbnRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleS10by1xdWVyeS1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygc291cmNlL3RhcmdldCBjb2x1bW4vcXVlcnkga2V5IHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHF1ZXJ5IGtleXMgZGVmaW5pbmcgYSBwcmltYXJ5IG9yIHVuaXF1ZSBrZXkgdmFsdWUgaW4gdGhlIG90aGVyIGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleS1yZWZlcmVuY2UiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJlZmVyZW5jZSBvZiBhIHNvdXJjZSB0YWJsZSBmb3JlaWduIGtleSBhbmQgYSB0YXJnZXQgaW50ZXJmYWNlIGRlc2NyaXB0b3IgcXVlcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtcXVlcnkta2V5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeSBrZXkgbmFtZSBvZiB0aGUgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyIgdHlwZT0iY2xhc3MtaW5kaWNhdG9yLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgY2xhc3MgaW5kaWNhdG9yIHZhbHVlcyBhbmQgdGhlIHN1YmNsYXNzZXMgdGhleSBtYXAgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29udGFpbmVyL2NvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic29ydGVkLWNvbGxlY3Rpb24tY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzb3J0ZWQgY29sbGVjdGlvbiB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXJhdG9yLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbXBhcml0b3IsIHVzZWQgdG8gY29tcGFyZSBvYmplY3RzIGluIHNvcnRpbmcgdGhlIGNvbGxlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imxpc3QtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBsaXN0IGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXAgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjcm9sbGFibGUtY3Vyc29yLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzY3JvbGxhYmxlIGN1cnNvciBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3Vyc29yZWQtc3RyZWFtLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjdXJzb3JlZCBzdHJlYW0gY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGlyZWN0aW9uLXBvbGljeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZGVmZXJyZWQgcmVhZCBpbmRpcmVjdGlvbiBtZWNoYW5pc20uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1ob2xkZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB2YWx1ZSBob2xkZXJzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm94eS1pbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHVzYWdlIG9mIHByb3hpZXMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcGFyZW50LWNvbGxlY3Rpb24taW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiB0cmFuc3BhcmVudCBjb2xsZWN0aW9ucyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29sbGVjdGlvbi10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW50ZXJmYWNlIHRvIHVzZSwgaS5lLiBMaXN0LCBTZXQsIE1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1hcC1rZXktbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWV0aG9kIHRvIGNhbGwgb24gdGhlIHRhcmdldCBvYmplY3RzIHRvIGdldCB0aGUga2V5IHZhbHVlIGZvciB0aGUgbWFwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBhIHVzZXIgZGVmaW5lZCBjb250YWluZXIgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb250YWluZXIgaW1wbGVtZW50ZXIgdG8gdXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlc2FmZS1lbnVtZXJhdGlvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UeXBlc2FmZSBFbnVtZXJhdGlvbiBjb252ZXJzaW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1jb252ZXJzaW9uLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZGF0YSB0eXBlIGFuZCBhbiBvYmplY3QgdHlwZSBvZiB0aGUgYXR0cmlidXRlIHRvIGNvbnZlcnQgYmV0d2Vlbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcmlhbGl6ZWQtb2JqZWN0LWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgb2JqZWN0IHNlcmlhbGl6YXRpb24gdG8gY29udmVydCBiZXR3ZWVuIHRoZSBvYmplY3QgYW5kIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkYXRhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgYXR0cmlidXRlcyBzdG9yYWdlIGRhdGEgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXR5cGUtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiB2YWx1ZXMgZnJvbSBkYXRhYmFzZSB2YWx1ZXMgdXNlZCBpbiB0aGUgZmllbGQgYW5kIG9iamVjdCB2YWx1ZXMgdXNlZCBpbiB0aGUgYXR0cmlidXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgdmFsdWUgaXMgdXNlZCBpZiBhIGRhdGFiYXNlIHR5cGUgaXMgbm90IGZvdW5kIGluIHRoZSB0eXBlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1hcHBpbmcgb2YgdmFsdWVzLiAgQm90aCB0aGUgb2JqZWN0IGFuZCBkYXRhYmFzZSB2YWx1ZXMgbXVzdCBiZSB1bmlxdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImF0dHJpYnV0ZS1vbmx5LXR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgbWFwcGluZyBvZiBhZGRpdGlvbmFsIHZhbHVlcyB0aGF0IG1hcCBub24tdW5pcXVlIGRhdGEgdmFsdWVzIHRvIGEgdW5pcXVlIGF0dHJpYnV0ZSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0eXBlLW1hcHBpbmciIHR5cGU9InR5cGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBvYmplY3QgYW5kIGRhdGEgdmFsdWUgbWFwcGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0eXBlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgYW4gb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIG9iamVjdCdzIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhLXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSB2YWx1ZSB0byB1c2UgaW4gdGhlIGRhdGFiYXNlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhYmFzZS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkvaW50ZXJhY3Rpb24gYWdhaW5zdCBhIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibWFpbnRhaW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGJ5cGFzcyB0aGUgY2FjaGUgY29tcGxldGVseS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpbmQtYWxsLXBhcmFtZXRlcnMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHVzZSBwYXJhbWF0ZXIgYmluZGluZyBmb3IgYXJndW1lbnRzLCBvciBwcmludCB0aGUgYXJndW1lbnRzIGluLWxpbmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoZS1zdGF0ZW1lbnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcmllcyBzdGF0ZW1lbnQgc2hvdWxkIGJlIGNhY2hlZCwgdGhpcyBtdXN0IGJlIHVzZWQgd2l0aCBwYXJhbWV0ZXIgYmluZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InRpbWVvdXQiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIHRpbWVvdXQgdG8gY2FuY2VsIHRoZSBxdWVyeSBpbiBpZiB0aGUgcmVxdWVzdCB0YWtlcyB0b28gbG9uZyB0byBjb21wbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InByZXBhcmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIHByZXBhcmUgYW5kIGNhY2hlIGl0cyBnZW5lcmF0ZWQgU1FMLCBvciByZWdlbmVyYXRlIHRoZSBTUUwgb24gZWFjaCBleGVjdXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWxsIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3Igc3RhdGljIGNhbGxzIHRoZSBTUUwgb3IgU3RvcmVkIFByb2NlZHVyZSBjYWxsIGRlZmluaXRpb24gY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqb2luLWZldGNoLXR5cGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgam9pbiBmZXRjaCBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImlubmVyLWpvaW4iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvdXRlci1qb2luIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgY2FzY2FkZSBwb2xpY2llcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJwcml2YXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhbHVlLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBzaW5nbGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGEtcmVhZC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZyByYXcgZGF0YS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLXF1ZXJ5LXJlc3VsdHMiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgcXVlcnkgc2hvdWxkIGNhY2hlIHRoZSBxdWVyeSByZXN1bHRzIHRvIGF2b2lkIGZ1dHVyZSBleGVjdXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWF4LXJvd3MiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCwgcmVzdWx0cyB3aWxsIGJlIHRydW5jdGF0ZSBvbiB0aGUgZGF0YWJhc2UgdG8gdGhpcyBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmlyc3QtcmVzdWx0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgd2hlcmUgdG8gc3RhcnQgdGhlIGN1cnNvciBpbiBhIHJlc3VsdCBzZXQgcmV0dXJuZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFJlc3VsdHMgcHJpb3IgdG8gdGhpcyBudW1iZXIgd2lsbCBub3QgYmUgYnVpbHQgaW50byBvYmplY3RzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXNzIHRoZSBudW1iZXIgb2Ygcm93cyB0byBmZXRjaCBmcm9tIHRoZSBkYXRhYmFzZSBvbiBlYWNoIHJlc3VsdCBzZXQgbmV4dCBvcGVyYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5IiB0eXBlPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSByZXN1bHRzIHNob3VsZCBiZSBjYWNoZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LXJlc3VsdC1jYWNoZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHF1ZXJ5J3MgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW52YWxpZGF0aW9uLXBvbGljeSIgdHlwZT0iY2FjaGUtaW52YWxpZGF0aW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LiBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjEwMCIgbmFtZT0ibWF4aW11bS1jYWNoZWQtcmVzdWx0cyIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHF1ZXJ5IHJlc3VsdCBzZXRzIHRoYXQgd2lsbCBiZSBjYWNoZWQuIFRoZSBMUlUgcXVlcnkgcmVzdWx0cyB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHRoZSBtYXggc2l6ZSBpcyByZWFjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLW1vZGlmeS1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbWFuaXB1bGF0aW5nIGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgbW9kaWZ5aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVwZGF0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHVwZGF0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW5zZXJ0LW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgaW5zZXJ0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbW9kaWZ5LXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZXRlcm1pbmluZyBpZiBhbiBvYmplY3QgZXhpc3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIiB0eXBlPSJleGlzdGVuY2UtY2hlY2siPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGV4aXN0ZW5jZSBjaGVjayBvcHRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGV4aXN0ZW5jZSBjaGVjayBvcHRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stY2FjaGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1kYXRhYmFzZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1leGlzdGVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtbm9uLWV4aXN0ZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBkZWxldGluZyBhIGNyaXRlcmlhIG9mIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG9iamVjdHMgKGFzIGFwcG9zZWQgdG8gZGF0YSkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbCBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3Mgb2Ygb2JqZWN0cyBiZWluZyBxdWVyaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZW1vdGUtcmVmcmVzaCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIHJlZnJlc2ggYW55IHJlbW90ZWx5IGNhY2hlZCBvYmplY3RzIGZyb20gdGhlIHNlcnZlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImNhc2NhZGUtcG9saWN5IiB0eXBlPSJjYXNjYWRlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc2V0dGluZ3MgKHN1Y2ggYXMgcmVmcmVzaCwgbWFpbnRhaW4tY2FjaGUpIHNob3VsZCBhcHBseSB0byB0aGUgb2JqZWN0J3MgcmVsYXRpb25zaGlwIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJwcmltYXJ5LWtleSIgbmFtZT0iY2FjaGUtdXNhZ2UiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBob3cgdGhlIHF1ZXJ5IHNob3VsZCBpbnRlcmFjdCB3aXRoIHRoZSBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImxvY2stbW9kZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgbG9jayB0aGUgcmVzdWx0aW5nIHJvd3Mgb24gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iZGlzdGluY3Qtc3RhdGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGZpbHRlciBkaXN0aW5jdCByZXN1bHRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW4tbWVtb3J5LXF1ZXJ5aW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbiBtZW1vcnkgcXVlcnlpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgZGVmYXVsdD0iaWdub3JlLWV4Y2VwdGlvbnMtcmV0dXJuLWNvbmZvcm1lZCIgbmFtZT0icG9saWN5IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IGluZGlyZWN0aW9uIG9yIHVuY29uZm9ybWFibGUgZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHRyZWF0aW5nIHdpdGggaW4tbWVtb3J5IHF1ZXJ5aW5nIGFuZCBjb25mb3JtaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJ1c2UtZGVmYXVsdC1mZXRjaC1ncm91cCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgZGVmYXVsdCBmZXRjaCBncm91cCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBhIHByZS1kZWZpbmVkIG5hbWVkIGZldGNoIGdyb3VwIHRvIGFsbG93IHRoZSBxdWVyeSB0byBwYXJ0aWFsbHkgZmV0Y2ggdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UtZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIChWUEQpIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqb2luZWQtYXR0cmlidXRlLWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgYXR0cmlidXRlcyBiZWluZyBqb2luZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3Igam9pbmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVhZC1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIG9iamVjdHMgcmVzdWx0aW5nIGZyb20gdGhlIHF1ZXJ5IGFyZSByZWFkLW9ubHksIGFuZCB3aWxsIG5vdCBiZSByZWdpc3RlcmVkIGluIHRoZSB1bml0IG9mIHdvcmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgaW5oZXJpdGFuY2UgcXVlcmllcyBzcGVjaWZ5IGlmIGFsbCBzdWJjbGFzc2VzIHNob3VsZCBiZSBvdXRlciBqb2luZWQsIGluc3RlYWQgb2YgYSBxdWVyeSBwZXIgc3ViY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNldCBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJvYmplY3QtbGV2ZWwtcmVhZC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiYXRjaC1yZWFkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYWxsIGF0dHJpYnV0ZXMgZm9yIGJhdGNoIHJlYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJleHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBmb3IgYmF0Y2ggcmVhZGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvcmRlci1ieS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXRzIHRoZSBvcmRlciBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIG9yZGVyaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGEgc2luZ2xlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlF1ZXJ5IGZvciBpbmZvcm1hdGlvbiBhYm91dCBhIHNldCBvZiBvYmplY3RzIGluc3RlYWQgb2YgdGhlIG9iamVjdHMgdGhlbXNlbHZlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHVybi1jaG9pY2UiIHR5cGU9InJldHVybi1jaG9pY2UiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyIgdHlwZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXBvcnQtaXRlbXMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SXRlbXMgdG8gYmUgc2VsZWN0ZWQsIHRoZXNlIGNvdWxkIGJlIGF0dHJpYnV0ZXMgb3IgYWdncmVnYXRlIGZ1bmN0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Iml0ZW0iIHR5cGU9InJlcG9ydC1pdGVtIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ3JvdXAtYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyBHUk9VUCBCWSBleHByZXNzaW9ucyBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGdyb3VwaW5nPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJyZXR1cm4tY2hvaWNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2ltcGxpZmllcyB0aGUgcmVzdWx0IGJ5IG9ubHkgcmV0dXJuaW5nIHRoZSBmaXJzdCByZXN1bHQsIGZpcnN0IHZhbHVlLCBvciBhbGwgYXR0cmlidXRlIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtcmVzdWx0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icmV0dXJuLXNpbmdsZS12YWx1ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtYXR0cmlidXRlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0cmlldmUtcHJpbWFyeS1rZXlzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHdldGhlciB0aGUgcHJpbWFyeSBrZXkgdmFsdWVzIHNob3VsZCBhbHNvIGJlIHJldHJpZXZlZCBmb3IgdGhlIHJlZmVyZW5jZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaXJzdC1wcmltYXJ5LWtleSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXByaW1hcnkta2V5IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlcG9ydC1pdGVtIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBpdGVtIHJlcXVlc3RlZCBpbiBSZXBvcnRRdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5OYW1lIGdpdmVuIGZvciBpdGVtLCBjYW4gYmUgdXNlZCB0byByZXRpZXZlIHZhbHVlIGZyb20gcmVzdWx0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHByZXNzaW9uIiB0eXBlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHByZXNzaW9uIChwYXJ0aWFsKSB0aGF0IGRlc2NyaWJlcyB0aGUgYXR0cmlidXRlIHdhbnRlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZXhwcmVzc2lvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZmlsdGVyIGV4cHJlc3Npb24gdHJlZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aW9uLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb24gZXhwcmVzc2lvbiB0aGF0IGNvbXBhcmVzIHRvIGV4cHJlc3Npb25zIHRocm91Z2ggb3BlcmF0b3JzIHN1Y2ggYXMgZXF1YWwsIGxlc3NUaGFuLCBldGMuLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGVmdCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmlnaHQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJvcGVyYXRvciIgdHlwZT0ib3BlcmF0b3IiIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2ljLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZXhwcmVzc2lvbiBjb21wb3NlZCBvZiB0d28gc3ViLWV4cHJlc3Npb25zIGpvaW5lZCB0aHJvdWdoIGFuIG9wZXJhdG9yIHN1Y2ggYXMgQU5ELCBPUi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmdW5jdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgYSBmdW5jdGlvbiBhcHBsaWVkIHRvIGEgbGlzdCBvZiBzdWItZXhwcmVzc2lvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBmdW5jdGlvbiBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IGV4cHJlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iZnVuY3Rpb24iIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25zdGFudC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIHZhbHVlLiAgSWYgdGhlIHZhbHVlIGlzIG51bGwgdGhlIHZhbHVlIHRhZyBjYW4gaXMgYWJzZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1rZXktZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBxdWVyeS1rZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYW55LW9mIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3V0ZXItam9pbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZpZWxkLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJhc2UiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwYXJhbWV0ZXItZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBwYXJhbWV0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXIiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYmFzZS1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGJ1aWxkZXIvYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJvcGVyYXRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBvcGVyYXRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzcWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gU1FMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzcWwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgU1FMIHF1ZXJ5IHN0cmluZy4gIEFyZ3VtZW50cyBjYW4gYmUgc3BlY2lmaWVkIHRocm91Z2ggI2FyZy1uYW1lIHRva2VucyBpbiB0aGUgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlamJxbC1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSkItUUwgcXVlcnkgbGFuZ3VhZ2Ugc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVqYnFsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBFSkItUUwgcXVlcnkgc3RyaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvY2VkdXJlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0b3JlZCBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjdXJzb3Itb3V0cHV0LXByb2NlZHVyZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBjYWxsIHRvIHVzZSBhIGN1cnNvciBvdXRwdXQgcGFyYW1ldGVyIHRvIGRlZmluZSB0aGUgcmVzdWx0IHNldC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCB0byB0aGUgcHJvY2VkdXJlLiBUaGUgb3JkZXIgb2YgdGhlIGFyZ3VtZW50cyBtdXN0IG1hdGNoIHRoZSBwcm9jZWR1cmUgYXJndW1lbnRzIGlmIG5vdCBuYW1lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgZnVuY3Rpb24gaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InN0b3JlZC1mdW5jdGlvbi1yZXN1bHQiIHR5cGU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgc3RvcmVkLWZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzdG9yZWQgcHJvY2VkdXJlIG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBGb3IgaW5kZXhlZCBhcmd1bWVudCB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhcmd1bWVudCBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXNxbHR5cGUiIHR5cGU9InhzZDppbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBKREJDIGludCB0eXBlIG9mIHRoZSBhcmd1bWVudCwgYXMgZGVmaW5lZCBpbiBqYXZhLmpkYmMuVHlwZXM8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0eXBlIGlmIHByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIGlzIFNUUlVDVCBvciBBUlJBWTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLW91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1pbm91dHB1dC1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGNhbGwgb3V0cHV0IGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwcm9jZWR1cmUtYXJndW1lbnQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXRwdXQtYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbnQuIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXN0b3JlZC1wcm9jZWR1cmUtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdG9yZWQgcHJvY2VkdXJlIGludm9jYXRpb24gZGVmaW5pdGlvbiB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBhdCBsZWFzdCBvbmUgT3JhY2xlIFBML1NRTCB0eXBlIHRoYXQgaGFzIG5vIEpEQkMgcmVwcmVzZW50YXRpb24gKGUuZy4gQk9PTEVBTiwgUExTX0lOVEVHRVIsIFBML1NRTCByZWNvcmQpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFuZCBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGV4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGlyZWN0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqZGJjLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imxlbmd0aCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVjaXNpb24iIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2FsZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgIDwveHNkOmNob2ljZT4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtdHlwZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXJlY29yZCI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZmllbGRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1jb2xsZWN0aW9uIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb21wYXRpYmxlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iamF2YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBFSVMgcmVjb3JkIGRhdGEgc3RydWN0dXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkYXRhdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcmVjb3JkIHN0cnVjdHVyZSBuYW1lIHRoZSBkZXNjcmlwdG9yIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFwcGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIE1hcHBlZFJlY29yZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBpbnB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIFhNTCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVjb3JkLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgdG8gdXNlIGZvciB0aGUgaW5wdXQgcmVjb3JkLCBpZiByZXF1aXJlZCBieSB0aGUgYWRhcHRlci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJvb3QtZWxlbWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluZGV4ZWQtaW50ZXJhY3Rpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIEVJUyBpbnRlcmFjdGlvbiB1dGlsaXppbmcgSW5kZXhlZCByZWNvcmRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZ1bmN0aW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGlucHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im91dHB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2Ygb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJpbnRlcmFjdGlvbi1hcmd1bWVudCIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGludGVyYWN0aW9uIGFyZ3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtdmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJvY2VkdXJlIGFyZ3VtZW50IHZhbHVlIG1heWJlIGJlIHNwZWNpZmllZCBpZiBub3QgdXNpbmcgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbnRlcmFjdGlvbiBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnRzIHRoZSBuYW1lIGlzIG5vdCByZXF1aXJlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgbmFtZSBvZiB0aGUgYXJndW1lbi4gVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXJndW1lbnQgYXMgZGVmaW5lIGluIHRoZSBxdWVyeSwgb3IgdGhlIGRlc2NyaXB0b3IgZmllbGQgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1yZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjbGFzcyBtYXBwaW5nIHRvIGEgU3RydWN0dXJlIHR5cGUgaW4gYW4gb2JqZWN0LXJlbGF0aW9uYWwgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uYWwtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzdHJ1Y3R1cmUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIG9iamVjdCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLW9yZGVyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBvcmRlcmVkIGxpc3Qgb2YgdGhlIGZpZWxkIGRlZmluZWQgaW4gdGhlIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5lc3RlZC10YWJsZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbS9tLW0gcmVsYXRpb25zaGlwIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBvYmplY3QtcmVsYXRpb25hbCBuZXN0ZWQtdGFibGUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgc291cmNlIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBuZXN0ZWQtdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFycmF5LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUvc2ltcGxlIHR5cGUgdmFsdWVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC1hcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBhcnJheSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHR5cGUgbmFtZSBvZiB0aGUgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InN0cnVjdHVyZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0cnVjdHVyZSBvZiBvYmplY3QtdHlwZXMgdXNpbmcgdGhlIG9iamVjdC1yZWxhdGlvbmFsIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIG9iamVjdC10eXBlIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCByZWZlcmVuY2UgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIGluIHRoZSBzb3VyY2UgdHlwZSB0aGF0IHN0b3JlcyB0aGUgcmVmZXJlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1maWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gT2JqZWN0UmVsYXRpb25hbERhdGFiYXNlRmllbGQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5lc3RlZC10eXBlLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC14bWwtdHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBtYXBwaW5nIHRvIGFuIE9yYWNsZSBYREIgWE1MIFR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLXdob2xlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1kaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRpcmVjdCBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InZhbHVlLWNvbnZlcnRlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB1c2VyIGRlZmluZWQgY29udmVydGVyIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb2xsZWN0aW9uLXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtTSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIFhNTCBlbGVtZW50IHRvIHRoZSB0YXJnZXQgWE1MIGVsZW1lbnQgYmFzZWQgb24gYSBrZXkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1vYmplY3QtcmVmZXJlbmNlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lcnBvbGljeSIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVzZXMtc2luZ2xlLW5vZGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIG9uZSBvciBtb3JlIGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGQtYXNzb2NpYXRpb24iIHR5cGU9ImZvcmVpZ24ta2V5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLQk8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItYXR0cmlidXRlIiBtaW5PY2N1cnM9IjAiLz4KLQkgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXNldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb21wb3NpdGUgb2JqZWN0IG1hcHBpbmcgZm9yIGFuIFhNTCBuZXN0ZWQgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBYTUwgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50LWZpZWxkIiB0eXBlPSJub2RlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBYTUxGaWVsZCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLXByZXNlcnZlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgbm9kZXMgc2hvdWxkIGJlIGNhY2hlZCB0byBwcmVzZXJ2ZSB1bm1hcHBlZCBkYXRhPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNjaGVtYSIgdHlwZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbG9jYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbiBvciB4czphbnlUeXBlIGVsZW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIHNpbmdsZSBvYmplY3QgdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIE5vZGUgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIG9mIE5vZGVzIHRvIGEgZnJhZ21lbnQgb2YgYW4gWE1MIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBiaW5hcnkgb2JqZWN0IHRvIGJhc2U2NCBiaW5hcnk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zd2EtcmVmIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtaW1lLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLWlubGluZS1kYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jaG9pY2UtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItcG9saWN5IiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBjb2xsZWN0aW9uIHRvIGEgY2hvaWNlIHN0cnVjdHVyZSBpbiBhbiB4bWwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIHR5cGU9InhtbC1jaG9pY2UtZmllbGQtdG8tY2xhc3MtYXNzb2NpYXRpb24iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InhtbC1maWVsZCIgdHlwZT0ibm9kZSIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29udmVyc2lvbi1wYWlyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InFuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFhQYXRoIGV4cHJlc3Npb24gdG8gYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUgaW4gYW4gWE1MIGRvY3VtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zaXRpb24iIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSBpbiB0aGUgcGFyZW50IHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibGVhZi1lbGVtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIHRoZSBlbGVtZW50cyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmlvbi1ub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VXNlIHRvIHJlcHJlc2VudCBub2RlcyB3aGljaCBhcmUgbWFwcGVkIHRvIHVuaW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiBuYW1lPSJuYW1lc3BhY2VzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9Im5hbWVzcGFjZSIgdHlwZT0ibmFtZXNwYWNlIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImRlZmF1bHQtbmFtZXNwYWNlLXVyaSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmFtZXNwYWNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByZWZpeCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtcmVmZXJlbmNlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NoZW1hLWNvbnRleHQiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtY2xhc3MtcGF0aC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1maWxlLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLXVybC1yZWZlcmVuY2UiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNjaGVtYS1yZWZlcmVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS1jaGFyYWN0ZXIiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdGltZXN0YW1wIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImphdmEtdXRpbC1kYXRlIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpkYXRlVGltZSIgLz4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbXAtcG9saWN5Ij4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyIgdHlwZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY21wIGJlYW4tbGV2ZWwgcGVzc2ltaXN0aWMgbG9ja2luZyBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiIHR5cGU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBtb2RpZmljYXRpb24gZGVmZXJyYWwgbGV2ZWwgZm9yIG5vbi1kZWZlcnJlZCB3cml0ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJub24tZGVmZXJyZWQtY3JlYXRlLXRpbWUiIHR5cGU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBwb2ludCBhdCB3aGljaCBpbnNlcnQgd2lsbCBiZSBpc3N1ZWQgdG8gRGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBlc3NpbWlzdGljLWxvY2tpbmciPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ3YWl0IiBuYW1lPSJsb2NraW5nLW1vZGUiIHR5cGU9ImxvY2tpbmctbW9kZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJkZWZlci11bnRpbC1jb21taXQiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwtbW9kaWZpY2F0aW9ucyIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVwZGF0ZS1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYmNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFmdGVyLWVqYnBvc3RjcmVhdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1bmRlZmluZWQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJsb2NraW5nLW1vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Ib2xkcyB0aGUgcGVzc2ltaXN0aWMgbG9ja2luZyBtb2RlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FpdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLXdhaXQiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSI1MCIgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZSBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRvIHVzZSBwcmVhbGxvY2F0aW9uIHNpemUgb2YgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibmF0aXZlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRhYmxlIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZSBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFfQ09VTlQiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idW5hcnktdGFibGUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5VbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLCB0YWJsZSBoYXMgYSBzaW5nbGUgZmllbGQgYW5kIGEgc2luZ2xlIHJvdzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbGZpbGUgc2VxdWVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWwgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJyb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9OQU1FIiBuYW1lPSJuYW1lLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlciBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwcyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGFsbCBwcmUtZGVmaW5lZCBmZXRjaCBncm91cHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LWZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cCIgdHlwZT0iZmV0Y2gtZ3JvdXAiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZldGNoLWdyb3VwIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgdGhlIGZldGNoIGdyb3VwIGF0dHJpYnV0ZXMgaW5mby48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmV0Y2gtZ3JvdXAtYXR0cmlidXRlcyI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIGEgZmV0Y2ggZ3JvdXAncyBhdHRyaWJ1dGUgbGlzdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlc2NyaWJlcyB0aGUgY2hhbmdlIHRyYWNraW5nIHBvbGljeSBmb3IgdGhpcyBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVmZXJyZWQtZGV0ZWN0aW9uLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGJhY2t1cCBjbG9uZSB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzICJtYXJrIGRpcnR5IiB0byBkZXRlY3QgY2hhbmdlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2hhbmdlLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXR0cmlidXRlLWxldmVsLWNoYW5nZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIGEgQ2hhbmdlVHJhY2tlciBmaXJpbmcgUHJvcGVydHlDaGFuZ2VFdmVudCdzIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIE51bGwgUG9saWN5IGluIHVzZSBmb3IgdGhpcyByZWxhdGlvbnNoaXAgY3VycmVudGx5IGEgY2hvaWNlIG9mIFtOdWxsUG9saWN5IGFuZCBJc1NldE51bGxQb2xpY3ldLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InhzaS1uaWwtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJlbXB0eS1ub2RlLXJlcHJlc2VudHMtbnVsbCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXJlcHJlc2VudGF0aW9uLWZvci14bWwiIHR5cGU9Im1hcnNoYWwtbnVsbC1yZXByZXNlbnRhdGlvbiIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJpcy1zZXQtcGVyZm9ybWVkLWZvci1hYnNlbnQtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpcy1zZXQtbnVsbC1wb2xpY3kiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpcy1zZXQtbWV0aG9kLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImlzLXNldC1wYXJhbWV0ZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlciIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+V3JpdGUgbnVsbCwgbm8gdGFnKGRlZmF1bHQpIG9yIGFuIGVtcHR5IHRhZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlhTSV9OSUwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBQlNFTlRfTk9ERSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkVNUFRZX05PREUiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgZ2VuZXJpYyBmaWVsZCBjb25jZXB0LCBzdWNoIGFzIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbHVtbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2x1bW4gaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLiBUaGlzIHRhYmxlIG11c3QgYmUgbGlzdGVkIGluIHRoZSBjbGFzcycgdGFibGVzLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBmaXJzdCB0YWJsZSBvZiB0aGUgY2xhc3Mgd2lsbCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JlaWduLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgZmllbGQvY29sdW1uIHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBpbiBhbm90aGVyIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC1yZWZlcmVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IHRhYmxlIHByaW1hcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSB0YXJnZXQgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgc3BlY2lmaWNhdGlvbiBmb3IgcXVlcnlpbmcgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBvZiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHF1ZXJ5IGFyZ3VtZW50cy4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCBtdXN0IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgdmFsdWUgcGFzc2VkIHRvIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeS4gIFRoaXMgbmFtZSBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYW5kIGV4ZWN1dGUgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JpdGVyaWEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBmaWx0ZXJpbmcgY2xhdXNlIG9mIGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdHlwZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBtYXkgYmUgcHJvdmlkZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIGNvbnN0YW50IHZhbHVlIGZvciB0aGUgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gIFRoZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQgd2l0aCB0aGUgc2NoZW1hLCB0YWJsZXNwYWNlIG9yIGxpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZQotICAgICAgICBvYmplY3QgdmFsdWUuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gIAk8eHNkOnNlcXVlbmNlPgotICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgCQk8L3hzZDplbGVtZW50PgotICAJPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMS4yLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmE1Njk2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8xLjIueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDI1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2UgUHJvamVjdCA6OiBNYXAgU2NoZW1hIGZpbGUgZm9yIE9STS9PWE0vRUlTIC0tPgotPHhzZDpzY2hlbWEKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gIHZlcnNpb249IjEuMiIKLSAgPgotICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiB0eXBlPSJvYmplY3QtcGVyc2lzdGVuY2UiIC8+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb2JqZWN0LXBlcnNpc3RlbmNlIG1hcHBpbmcgbW9kdWxlLCBhIHNldCBvZiBjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBuYW1lIGZvciB0aGUgbW9kZWwgYmVpbmcgbWFwcGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgY2xhc3MgbWFwcGluZyBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIiB0eXBlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9naW4iIHR5cGU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGVmYXVsdC10ZW1wb3JhbC1tdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVmYXVsdCBmb3IgaG93IERhdGUgYW5kIENhbGVuZGFyIHR5cGVzIGFyZSB1c2VkIHdpdGggY2hhbmdlIHRyYWNraW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkJ5IGRlZmF1bHQgdGhleSBhcmUgYXNzdW1lZCBub3QgdG8gYmUgY2hhbmdlZCBkaXJlY3RseSAob25seSByZXBsYWNlZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcmllcyB0byBiZSBzdG9yZWQgb24gdGhlIHNlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZGVmYXVsdD0iRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyAtIDEuMSAoQnVpbGQgWVlNTUREKSIgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwbGF0Zm9ybSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgdXNlci1uYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHBhc3N3b3JkLCB0aGlzIGlzIHN0b3JlZCBpbiBlbmNyeXB0ZWQgZm9ybS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjb25uZWN0aW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZGF0YXNvdXJjZSBkcml2ZXIsIGFuZCBhIG5ldyBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlIHBlciBjYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSB0cmFuc2FjdGlvbiBhcmUgbWFuYWdlZCBieSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIsIGFuZCBzaG91bGQgbm90IGJlIG1hbmFnZWQgYnkgVG9wTGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgaWYgdGhlIGRhdGFzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jaW5nIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNlcyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Tm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkcml2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKREJDIGRyaXZlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIEpEQkMgZHJpdmVyIGNvbm5lY3Rpb24gVVJMLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHBhcmFtZXRlciBiaW5kaW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RhdGVtZW50IGNhY2hpbmcgc2hvdWxkIGJlIHVzZWQuICBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcsIHRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBieXRlIGFycmF5IGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmluZy1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMjU2IiBuYW1lPSJzdHJpbmctYmluZGluZy1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRocmVzaG9sZCBzdHJpbmcgc2l6ZSBmb3IgdXNhZ2Ugb2Ygc3RyaW5nIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGxhcmdlIGJ5dGUgYXJyYXkgYW5kIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCBiZSBib3VuZCBhcyBzdHJlYW1zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0byBmb3JjZSBhbGwgZmllbGQgbmFtZXMgdG8gdXBwZXItY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGRhdGEgb3B0aW1pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIHRyYWlsaW5nIGJsYW5rcyBzaG91bGQgYmUgdHJpbW1lZC4gIFRoaXMgaXMgbm9ybWFsbHkgcmVxdWlyZWQgZm9yIENIQVIgZGF0YS10eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdXNpbmcgYmF0Y2ggd3JpdGluZywgY29uZmlndXJlIGlmIHRoZSBKREJDIGRyaXZlcnMgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpDQSBkcml2ZXIgYW5kIEVJUyBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBUb3BMaW5rIHBsYXRmb3JtIHNwZWNpZmljIGNvbm5lY3Rpb24gc3BlYyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpOREkgdXJsIGZvciB0aGUgbWFuYWdlZCBKQ0EgYWRhcHRlcidzIGNvbm5lY3Rpb24gZmFjdG9yeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAJPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgCQluYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgICAgICAJCXR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgCQltaW5PY2N1cnM9IjAiPgotICAgICAgICAJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgYW4gYWJzdHJhY3QgZGVmaW5pdGlvbiB0byBhbGxvdyBmbGV4aWJpbGl0eSBpbiB0aGUgdHlwZXMgb2YgY2xhc3NlcyBhbmQgZGF0YXN0b3JlcyBwZXJzaXN0ZWQsIGkuZS4gaW50ZXJmYWNlcywgYWJzdHJhY3QgY2xhc3NlcywgYWdncmVnYXRlcywgbm9uLXJlbGF0aW9uYWwgcGVyc2lzdGVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbGVtZW50YXRpb24uRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxpYXMiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYW4gYWxpYXMgbmFtZSBjYW4gYmUgZ2l2ZW4gZm9yIHRoZSBjbGFzcy4gIFRoZSBhbGlhcyBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzcyBpbiBwbGFjZSBvZiBpdHMgaW1wbGVtZW50YXRpb24gbmFtZSwgc3VjaCBhcyBpbiBxdWVyeWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8YWxpYXMgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+RW1wbG95ZWU8L2FsaWFzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy9jb2x1bW5zIHRoYXQgbWFrZSB1cCB0aGUgcHJpbWFyeSBrZXkgb3IgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdXNlZCBmb3IgY2FjaGluZywgcmVsYXRpb25zaGlwcywgYW5kIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBrZXkgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjbGFzcyBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50cyIgdHlwZT0iZXZlbnQtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5aW5nIiB0eXBlPSJxdWVyeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBtYXBwaW5ncyB0aGF0IGRlZmluZSBob3cgdGhlIGNsYXNzJyBhdHRyaWJ1dGVzIGFyZSBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIiB0eXBlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlc2NyaXB0b3ItdHlwZSIgdHlwZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZXNjcmlwdG9yIHR5cGUsIHN1Y2ggYXMgYWdncmVnYXRlIG9yIGluZGVwZW5kZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50ZXJmYWNlcyIgdHlwZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgY2xhc3MgaW1wbGVtZW50cy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2NraW5nIiB0eXBlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbG9ja2luZyBiZWhhdmlvciBmb3IgdGhlIGNsYXNzLiAgU3VjaCBhcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHZlcnNpb24sIHRpbWVzdGFtcCBvciBjaGFuZ2Ugc2V0IG9mIGNvbHVtbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIiB0eXBlPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlbW90ZS1jYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBvbiByZW1vdGUgY2xpZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm5pbmctcG9saWN5IiB0eXBlPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYW1lbmRtZW50IiB0eXBlPSJhbWVuZG1lbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zdGFudGlhdGlvbiIgdHlwZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb3B5aW5nIiB0eXBlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LWtleXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbGlzdCBvZiBxdWVyeSBrZXlzIG9yIGFsaWFzZXMgZm9yIGRhdGFiYXNlIGluZm9ybWF0aW9uLiAgVGhlc2UgY2FuIGJlIHVzZWQgaW4gcXVlcmllcyBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleSIgdHlwZT0icXVlcnkta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY21wLXBvbGljeSIgdHlwZT0iY21wLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UGxhY2UgaG9sZGVyIG9mIENNUCBpbmZvcm1hdGlvbiBzcGVjaWZpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwcyIgdHlwZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzIGF0IHRoZSBkZXNjcmlwdG9yIGxldmVsPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNoYW5nZS1wb2xpY3kiIHR5cGU9ImNoYW5nZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBDaGFuZ2UgUG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3I8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMTAiIG5hbWU9InNjaGVtYS1tYWpvci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMCIgbmFtZT0ic2NoZW1hLW1pbm9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNsYXNzIGRlc2NyaXB0b3IgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZGVwZW5kZW50IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlcmZhY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGludGVyZmFjZXMgdGhhdCBhIGNsYXNzIGRlc2NyaXB0b3IgaW1wbGVtZW50cywgb3IgdGhlIGltcGxlbWVudGlvbiBjbGFzcyBmb3IgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGEgc2V0IG9mIHB1YmxpYyBpbnRlcmZhY2VzIGZvciB0aGUgY2xhc3MgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgYWxsb3dzIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB0byByZWZlciB0byB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0d28gY2xhc3NlcyBpbXBsZW1lbnQgdGhlIHNhbWUgaW50ZXJmYWNlLCBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvciBzaG91bGQgYmUgZGVmaW5lZCBmb3IgdGhlIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCB0byBkZWZpbmUgaW5oZXJpdGFuY2UgYmV0d2VlbiBpbnRlcmZhY2UgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGludGVyZmFjZSBjbGFzcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmFwaS5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW1wbGVtZW50b3ItZGVzY3JpcHRvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igd2hpY2ggdGhpcyBpbnRlcmZhY2UgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgaW50ZXJmYWNlIGhhcyBvbmx5IGEgc2luZ2xlIGltcGxlbWVudG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGwuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3JlYXRlcyBhIGNvcHlpbmcgdGhyb3VnaCBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSB0byBjb3B5IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsb25lIG1ldGhvZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY2xvbmUgbWV0aG9kIG9uIHRoZSBvYmplY3QsIGkuZS4gJ2Nsb25lJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBmYWN0b3J5IHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgaW5zdGFuY2UuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBmYWN0b3J5IGNsYXNzIG5hbWUuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgY2xhc3MuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbWVuZG1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBjbGFzcyBhbmQgc3RhdGljIG1ldGhvZCB0byBiZSBjYWxsZWQgdG8gYWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhbWVuZG1lbnQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhbWVuZG1lbnQgbWV0aG9kIG9uIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUocykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFibGVzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRoZSB0YWJsZXMgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFR5cGljYWxseSBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBhIHNpbmdsZSB0YWJsZSwgYnV0IG11bHRpcGxlIHRhYmxlcyBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0YWJsZSIgdHlwZT0idGFibGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5cy1mb3ItbXVsdGlwbGUtdGFibGUiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBmb3JlaWduIGtleSBmaWVsZCByZWZlcmVuY2VzIHRvIGJlIGRlZmluZSBmb3IgbXVsdGlwbGUgdGFibGUgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtdWx0aXBsZS10YWJsZS1qb2luLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgY29tcGxleCBtdWx0aXBsZSB0YWJsZSBqb2luIGNvbmRpdGlvbnMgYW4gZXhwcmVzc2lvbiBtYXkgYmUgcHJvdmlkZWQgaW5zdGVhZCBvZiB0aGUgdGFibGUgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBhIG51bWVyaWMgdmVyc2lvbiBmaWVsZC9jb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24tZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InN0b3JlLXZlcnNpb24taW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHZlcnNpb24gdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWVzdGFtcC1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB0aW1lc3RhbXAgdmVyc2lvbiBjb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic2VydmVyLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRpbWVzdGFtcCBzaG91bGQgYmUgb2J0YWluZWQgbG9jYWxseSBvciBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFsbC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhbGwgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2Ygb25seSB0aGUgY2hhbmdlZCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VsZWN0ZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgc2V0IG9mIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHNldCBvZiBmaWVsZHMgdG8gY29tcGFyZSBvbiB1cGRhdGUgYW5kIGRlbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBkYXRhYmFzZSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yLiAgVGhpcyBjb3VsZCBiZSB0aGUgbmFtZSBvZiBhIHNlcXVlbmNlIG9iamVjdCwgb3IgYSByb3cgdmFsdWUgaW4gYSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgaWQgaXMgYXNzaWduZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYWNoaW5nIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGFyZC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgYW5kIGhvdyBvYmplY3QgaWRlbnRpdHkgc2hvdWxkIGJlIG1haW50YWluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiBuYW1lPSJjYWNoZS10eXBlIiB0eXBlPSJjYWNoZS10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSB0eXBlIG9mIGNhY2hpbmcsIHN1Y2ggYXMgTFJVLCB3ZWFrIHJlZmVyZW5jZSBvciBub25lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJjYWNoZS1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW5pdGlhbCBvciBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgcmVmcmVzaCBjYWNoZWQgb2JqZWN0cyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im9ubHktcmVmcmVzaC1jYWNoZS1pZi1uZXdlci12ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byByZWZyZXNoIGlmIHRoZSBjYWNoZWQgb2JqZWN0IGlzIGFuIG9sZGVyIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGlzYWJsZS1jYWNoZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGlzYWJsZSBvYnRhaW5pbmcgY2FjaGUgaGl0cyBvbiBwcmltYXJ5IGtleSBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1jb25mb3JtIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgY29uZm9ybSBxdWVyaWVzIHdpdGhpbiBhIHRyYW5zYWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imlzb2xhdGVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgaXNvbGF0ZWQgZnJvbSB0aGUgc2hhcmVkIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiIHR5cGU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIHNob3VsZCBiZSBpc29sYXRlZCB0byB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hhbmdlLXNldCIgbmFtZT0iY2FjaGUtc3luYy10eXBlIiB0eXBlPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byBiZSB1c2VkIHdpdGggdGhpcyBkZXNjcmlwb3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlLXJlYWQtdGltZS1vbi11cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1leHBpcnktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBpbiB0aGUgY2FjaGUgZG8gbm90IGV4cGlyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLXRvLWxpdmUtY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBsaXZlIGEgc3BlY2lmaWMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciB0aGV5IGFyZSByZWFkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lLXRvLWxpdmUiIHR5cGU9InhzZDpsb25nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGFpbHktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBQb2xpY3kgd2hlcmUgb2JqZWN0cyBleHBpcmUgYXQgYSBzcGVjaWZpYyB0aW1lIGV2ZXJ5IGRheTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHRvIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImhhbmRsZS13cml0ZXMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1kYXRhYmFzZS10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktdGFibGVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBuYW1lcyBvZiB0aGUgbWlycm9yaW5nIGhpc3RvcmljYWwgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaGlzdG9yeS10YWJsZSIgdHlwZT0iaGlzdG9yeS10YWJsZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RhcnQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzdGFydCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InN0YXJ0LWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZW5kLWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZW5kIGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZW5kLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RWFjaCBlbnRyeSBpcyBhIHNvdXJjZSAoZGVzY3JpcHRvcikgdG8gaGlzdG9yeSB0YWJsZSBuYW1lIGFzc29jaWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJoaXN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgdGhlIGZpZWxkcyB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIHR5cGU9InJldHVybmluZy1maWVsZC1pbmZvIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RmllbGQgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0eXBlIGFuZCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnMuIEF0IGxlYXN0IG9uZSBvZiBpbnNlcnQsIHVwZGF0ZSBzaG91bGQgYmUgdHJ1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0byBiZSByZXR1cm5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydC1tb2RlLXJldHVybi1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgaW5zZXJ0PT10cnVlLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCAodHJ1ZSkuIElmIGluc2VydD09ZmFsc2UgLSBpZ25vcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYXJlbnQvc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCAgIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJyZWFkLXN1YmNsYXNzZXMtb24tcXVlcmllcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBpZiBzdWJjbGFzc2VzIG9mIHRoZSBjbGFzcyBzaG91bGQgYmUgcmV0dXJuZWQgb24gcXVlcmllcywgb3Igb25seSB0aGUgZXhhY3QgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy12aWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgdGhlIG5hbWUgb2YgYSB2aWV3IHRoYXQgam9pbnMgYWxsIG9mIHRoZSBzdWJjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1jbGFzcy1uYW1lLWFzLWluZGljYXRvciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGNsYXNzIHR5cGUgaW5kaWNhdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdGlvbi1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBjbGFzcyB0aGF0IHRha2VzIHRoZSBjbGFzcycgcm93IGFzIGFyZ3VtZW50IGEgY29tcHV0ZWQgdGhhdCBjbGFzcyB0eXBlIHRvIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZnJvbSB0aGUgcm93LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGNsYXNzIHR5cGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBjbGFzcyBleHRyYWN0b3IgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib25seS1pbnN0YW5jZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBhbGwgc2libGluZyBhbmQgc3ViY2xhc3MgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IHNpYmxpbmcgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZS1pbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHRlbmRzIGluaGVyaXRhbmNlIHBvbGljeS4gQWxsb3dzIGZvciBwcmVmaXhlZCBuYW1lcyB0byBiZSByZXNvbHZlZCBhdCBydW50aW1lIHRvIGZpbmQgdGhlIGFwcHJvcmlhdGUgY2xhc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5oZXJpdGFuY2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRoZSB0eXBlIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHZhbHVlIHVzZWQgdG8gZGVmaW5lIHRoZSBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV2ZW50LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnQtbGlzdGVuZXJzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV2ZW50LWxpc3RlbmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYW4gZXZlbnQgbGlzdGVuZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1idWlsZC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBidWlsZGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8taW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtY2xvbmUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgY2xvbmluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1tZXJnZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBtZXJnaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXJlZnJlc2gtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgYW5kIHF1ZXJ5IHByb3BlcnRpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJpZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkiIHR5cGU9InF1ZXJ5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IGRlZmluaXRpb24gZm9yIHRoZSBjbGFzcycgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBhcHBseSB0byBhbGwgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoZWNrLWNhY2hlIiBuYW1lPSJleGlzdGVuY2UiIHR5cGU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBiZWhhdm9pciB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0IHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBpbnNlcnQgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgaW5zZXJ0IGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVwZGF0ZS1xdWVyeSIgdHlwZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHVwZGF0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCB1cGRhdGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZGVsZXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5IiB0eXBlPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZG9lcyBleGlzdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBvYmplY3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLWFsbC1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIGFsbCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGFsbCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgcG9saWNpZXMgZm9yIGRldGVybWluaW5nIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeS1rZXkgYWxpYXMgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIHVzZSB3aXRoIGEgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRhdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLWNoYW5nZXMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0LXdpdGgtbmV3LW9iamVjdHMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIGlzb2xhdGVkIGZyb20gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1c2Utc2Vzc2lvbi1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hbHdheXMiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBiZWluZyBhbGlhc2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBqb2luIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGpvaW4gY3JpdGVyaWEgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS0xIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS1tIGpvaW4gZnJvbSBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB2YWx1ZSB0aGF0IG51bGwgZGF0YSB2YWx1ZXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzc2lmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhdHRyaWJ1dGUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGdldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBzaW1wbGUgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGZpZWxkIHRyYW5zZm9ybWF0aW9uIGZvciBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1lci1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZyB0aGF0IHVzZXMgSmF2YSBjb2RlIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHRoZSBkYXRhIGFuZCBvYmplY3QgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtYXRpb24gZGVmaW5lZCBpbiB0aGUgZG9tYWluIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtZXIuIFVzZWQgaW4gcGxhY2Ugb2YgYXR0cmlidXRlLXRyYW5zZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRyYW5zZm9ybWF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiB0eXBlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSB0YXJnZXQgb2JqZWN0IGlzIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdCBhbmQgc3RvcmVzIHdpdGhpbiB0aGUgc291cmNlIG9iamVjdHMgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJhbGxvdy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIGEgcm93IG9mIGFsbCBudWxscyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgbnVsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIG1hcHBpbmcgdG8gdXNlIGRpZmZlcmVudCBmaWVsZCBuYW1lcyB0aGFuIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSBkZXNjcmlwdG9yJ3MgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBjbGFzc2VzIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0YXJnZXQgb2JqZWN0cyBhcmUgcHJpdmF0ZWx5IG93bmVkIGRlcGVuZGVudCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlZnJlc2ggb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlbW92ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib25lLXRvLW9uZS1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1ncm91cGluZy1lbGVtZW50IiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBzaW1wbGUgdHlwZXMgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlIHByaW1hcnkga2V5IGFuZCB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHNlc3Npb24gdGhhdCBkZWZpbmVzIHRoZSByZWZlcmVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIGtleSB2YWx1ZXMgcGFpcnMgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWtleS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc29yZXMgdGhlIG1hcCBrZXkgZGF0YSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBrZXkgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMgd2hlcmUgdGhlIHRhcmdldCBpbnN0YW5jZXMgYXJlIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb24tdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UvdGFyZ2V0IHByaW1hcnkga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHRhcmdldCBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlIHRoYXQgbWF5IGJlIG9mIHNldmVyYWwgdHlwZXMgcmVsYXRlZCB0aHJvdWdoIGFuIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGNvbHVtbiB0byBzdG9yZSB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgcmVsYXRlZCBvYmplY3QgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXktdG8tcXVlcnkta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgY29sdW1uL3F1ZXJ5IGtleSByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBxdWVyeSBrZXlzIGRlZmluaW5nIGEgcHJpbWFyeSBvciB1bmlxdWUga2V5IHZhbHVlIGluIHRoZSBvdGhlciBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXktcmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yIHF1ZXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXF1ZXJ5LWtleSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkga2V5IG5hbWUgb2YgdGhlIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbnRhaW5lci9jb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNvcnRlZC1jb2xsZWN0aW9uLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc29ydGVkIGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGFyYXRvci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb21wYXJpdG9yLCB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0cyBpbiBzb3J0aW5nIHRoZSBjb2xsZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0LWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbGlzdCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY3JvbGxhYmxlLWN1cnNvci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc2Nyb2xsYWJsZSBjdXJzb3IgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1cnNvcmVkLXN0cmVhbS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY3Vyc29yZWQgc3RyZWFtIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRpcmVjdGlvbi1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRlZmVycmVkIHJlYWQgaW5kaXJlY3Rpb24gbWVjaGFuaXNtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtaG9sZGVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdmFsdWUgaG9sZGVycyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJveHktaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBwcm94aWVzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BhcmVudC1jb2xsZWN0aW9uLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdHJhbnNwYXJlbnQgY29sbGVjdGlvbnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGludGVyZmFjZSB0byB1c2UsIGkuZS4gTGlzdCwgU2V0LCBNYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgYSB1c2VyIGRlZmluZWQgY29udGFpbmVyIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29udGFpbmVyIGltcGxlbWVudGVyIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxpc3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdCBjb252ZXJ0ZXI8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBsaXN0J3MgZWxlbWVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPiAKLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZXNhZmUtZW51bWVyYXRpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VHlwZXNhZmUgRW51bWVyYXRpb24gY29udmVyc2lvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVyc2lvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGRhdGEgdHlwZSBhbmQgYW4gb2JqZWN0IHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSB0byBjb252ZXJ0IGJldHdlZW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib2JqZWN0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJpYWxpemVkLW9iamVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIG9iamVjdCBzZXJpYWxpemF0aW9uIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgb2JqZWN0IGFuZCBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgdmFsdWVzIGZyb20gZGF0YWJhc2UgdmFsdWVzIHVzZWQgaW4gdGhlIGZpZWxkIGFuZCBvYmplY3QgdmFsdWVzIHVzZWQgaW4gdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgaWYgYSBkYXRhYmFzZSB0eXBlIGlzIG5vdCBmb3VuZCBpbiB0aGUgdHlwZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHZhbHVlcy4gIEJvdGggdGhlIG9iamVjdCBhbmQgZGF0YWJhc2UgdmFsdWVzIG11c3QgYmUgdW5pcXVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtb25seS10eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgYWRkaXRpb25hbCB2YWx1ZXMgdGhhdCBtYXAgbm9uLXVuaXF1ZSBkYXRhIHZhbHVlcyB0byBhIHVuaXF1ZSBhdHRyaWJ1dGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGFuIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBvYmplY3QncyBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBkYXRhYmFzZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5L2ludGVyYWN0aW9uIGFnYWluc3QgYSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im1haW50YWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBieXBhc3MgdGhlIGNhY2hlIGNvbXBsZXRlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCB1c2UgcGFyYW1hdGVyIGJpbmRpbmcgZm9yIGFyZ3VtZW50cywgb3IgcHJpbnQgdGhlIGFyZ3VtZW50cyBpbi1saW5lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtc3RhdGVtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc3RhdGVtZW50IHNob3VsZCBiZSBjYWNoZWQsIHRoaXMgbXVzdCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGNhbmNlbCB0aGUgcXVlcnkgaW4gaWYgdGhlIHJlcXVlc3QgdGFrZXMgdG9vIGxvbmcgdG8gY29tcGxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJwcmVwYXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBwcmVwYXJlIGFuZCBjYWNoZSBpdHMgZ2VuZXJhdGVkIFNRTCwgb3IgcmVnZW5lcmF0ZSB0aGUgU1FMIG9uIGVhY2ggZXhlY3V0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FsbCIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIHN0YXRpYyBjYWxscyB0aGUgU1FMIG9yIFN0b3JlZCBQcm9jZWR1cmUgY2FsbCBkZWZpbml0aW9uIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGpvaW4gZmV0Y2ggb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lci1qb2luIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3V0ZXItam9pbiIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhc2NhZGUgcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHJpdmF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgc2luZ2xlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YS1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgcmF3IGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1xdWVyeS1yZXN1bHRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBjYWNoZSB0aGUgcXVlcnkgcmVzdWx0cyB0byBhdm9pZCBmdXR1cmUgZXhlY3V0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1heC1yb3dzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2gsIHJlc3VsdHMgd2lsbCBiZSB0cnVuY3RhdGUgb24gdGhlIGRhdGFiYXNlIHRvIHRoaXMgc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpcnN0LXJlc3VsdCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHdoZXJlIHRvIHN0YXJ0IHRoZSBjdXJzb3IgaW4gYSByZXN1bHQgc2V0IHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlLiBSZXN1bHRzIHByaW9yIHRvIHRoaXMgbnVtYmVyIHdpbGwgbm90IGJlIGJ1aWx0IGludG8gb2JqZWN0czwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzcyB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggZnJvbSB0aGUgZGF0YWJhc2Ugb24gZWFjaCByZXN1bHQgc2V0IG5leHQgb3BlcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSIgdHlwZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBxdWVyeSdzIHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9Im1heGltdW0tY2FjaGVkLXJlc3VsdHMiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBxdWVyeSByZXN1bHQgc2V0cyB0aGF0IHdpbGwgYmUgY2FjaGVkLiBUaGUgTFJVIHF1ZXJ5IHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGUgbWF4IHNpemUgaXMgcmVhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1hbmlwdWxhdGluZyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1vZGlmeWluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciB1cGRhdGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGluc2VydGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGV4aXN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayIgdHlwZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBleGlzdGVuY2UgY2hlY2sgb3B0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgY2hlY2sgb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYSBjcml0ZXJpYSBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBvYmplY3RzIChhcyBhcHBvc2VkIHRvIGRhdGEpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9mIG9iamVjdHMgYmVpbmcgcXVlcmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVtb3RlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSByZW1vdGVseSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJjYXNjYWRlLXBvbGljeSIgdHlwZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHNldHRpbmdzIChzdWNoIGFzIHJlZnJlc2gsIG1haW50YWluLWNhY2hlKSBzaG91bGQgYXBwbHkgdG8gdGhlIG9iamVjdCdzIHJlbGF0aW9uc2hpcCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0icHJpbWFyeS1rZXkiIG5hbWU9ImNhY2hlLXVzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGxvY2sgdGhlIHJlc3VsdGluZyByb3dzIG9uIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImRpc3RpbmN0LXN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBmaWx0ZXIgZGlzdGluY3QgcmVzdWx0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluLW1lbW9yeS1xdWVyeWluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW4gbWVtb3J5IHF1ZXJ5aW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IGRlZmF1bHQ9Imlnbm9yZS1leGNlcHRpb25zLXJldHVybi1jb25mb3JtZWQiIG5hbWU9InBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyBpbmRpcmVjdGlvbiBvciB1bmNvbmZvcm1hYmxlIGV4cHJlc3Npb25zIHNob3VsZCBiZSB0cmVhdGluZyB3aXRoIGluLW1lbW9yeSBxdWVyeWluZyBhbmQgY29uZm9ybWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idXNlLWRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgYSBwcmUtZGVmaW5lZCBuYW1lZCBmZXRjaCBncm91cCB0byBhbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBleGNsdXNpdmUgY29ubmVjdGlvbiAoVlBEKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iam9pbmVkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYmVpbmcgam9pbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGpvaW5pbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeSBhcmUgcmVhZC1vbmx5LCBhbmQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgdW5pdCBvZiB3b3JrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzZXQgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmF0Y2gtcmVhZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGFsbCBhdHRyaWJ1dGVzIGZvciBiYXRjaCByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGJhdGNoIHJlYWRpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3JkZXItYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyB0aGUgb3JkZXIgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBvcmRlcmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNpbmdsZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5RdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXQgb2Ygb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4tY2hvaWNlIiB0eXBlPSJyZXR1cm4tY2hvaWNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiIHR5cGU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVwb3J0LWl0ZW1zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkl0ZW1zIHRvIGJlIHNlbGVjdGVkLCB0aGVzZSBjb3VsZCBiZSBhdHRyaWJ1dGVzIG9yIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpdGVtIiB0eXBlPSJyZXBvcnQtaXRlbSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imdyb3VwLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgR1JPVVAgQlkgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBncm91cGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXJlc3VsdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtdmFsdWUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLWF0dHJpYnV0ZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsLXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmlyc3QtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1wcmltYXJ5LWtleSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtaXRlbSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQgaW4gUmVwb3J0UXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TmFtZSBnaXZlbiBmb3IgaXRlbSwgY2FuIGJlIHVzZWQgdG8gcmV0aWV2ZSB2YWx1ZSBmcm9tIHJlc3VsdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhwcmVzc2lvbiAocGFydGlhbCkgdGhhdCBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZSB3YW50ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4cHJlc3Npb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZpbHRlciBleHByZXNzaW9uIHRyZWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uIGV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0byBleHByZXNzaW9ucyB0aHJvdWdoIG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFsLCBsZXNzVGhhbiwgZXRjLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpYy1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdHdvIHN1Yi1leHByZXNzaW9ucyBqb2luZWQgdGhyb3VnaCBhbiBvcGVyYXRvciBzdWNoIGFzIEFORCwgT1IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIGEgZnVuY3Rpb24gYXBwbGllZCB0byBhIGxpc3Qgb2Ygc3ViLWV4cHJlc3Npb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZnVuY3Rpb24gYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCBleHByZXNzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RhbnQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZSB2YWx1ZSB0YWcgY2FuIGlzIGFic2VudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcXVlcnkta2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFueS1vZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im91dGVyLWpvaW4iIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW1ldGVyLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcGFyYW1ldGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2UtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBidWlsZGVyL2Jhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3BlcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgb3BlcmF0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFNRTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIFNRTCBxdWVyeSBzdHJpbmcuICBBcmd1bWVudHMgY2FuIGJlIHNwZWNpZmllZCB0aHJvdWdoICNhcmctbmFtZSB0b2tlbnMgaW4gdGhlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpicWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUpCLVFMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamJxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgRUpCLVFMIHF1ZXJ5IHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3Vyc29yLW91dHB1dC1wcm9jZWR1cmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgY2FsbCB0byB1c2UgYSBjdXJzb3Igb3V0cHV0IHBhcmFtZXRlciB0byBkZWZpbmUgdGhlIHJlc3VsdCBzZXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMgbXVzdCBtYXRjaCB0aGUgcHJvY2VkdXJlIGFyZ3VtZW50cyBpZiBub3QgbmFtZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIGZ1bmN0aW9uIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tcmVzdWx0IiB0eXBlPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN0b3JlZC1mdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc3RvcmVkIHByb2NlZHVyZSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnQgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXJndW1lbnQgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIiB0eXBlPSJ4c2Q6aW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBpbnQgdHlwZSBvZiB0aGUgYXJndW1lbnQsIGFzIGRlZmluZWQgaW4gamF2YS5qZGJjLlR5cGVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBpZiBwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSBpcyBTVFJVQ1Qgb3IgQVJSQVk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtaW5vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3V0cHV0LWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1zdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24gd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIE9yYWNsZSBQTC9TUUwgdHlwZSB0aGF0IGhhcyBubyBKREJDIHJlcHJlc2VudGF0aW9uIChlLmcuIEJPT0xFQU4sIFBMU19JTlRFR0VSLCBQTC9TUUwgcmVjb3JkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRleCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamRiYy10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1yZWNvcmQiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZSIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gRUlTIHJlY29yZCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlY29yZCBzdHJ1Y3R1cmUgbmFtZSB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBNYXBwZWRSZWNvcmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBYTUwgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlY29yZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGlucHV0IHJlY29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIGFkYXB0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yb290LWVsZW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRleGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIEluZGV4ZWQgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyYWN0aW9uLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBpbnRlcmFjdGlvbiBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW50ZXJhY3Rpb24gbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50cyB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW4uIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnksIG9yIHRoZSBkZXNjcmlwdG9yIGZpZWxkIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIFN0cnVjdHVyZSB0eXBlIGluIGFuIG9iamVjdC1yZWxhdGlvbmFsIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC1vcmRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgb3JkZXJlZCBsaXN0IG9mIHRoZSBmaWVsZCBkZWZpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuZXN0ZWQtdGFibGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0vbS1tIHJlbGF0aW9uc2hpcCB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHNvdXJjZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgbmVzdGVkLXRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlL3NpbXBsZSB0eXBlIHZhbHVlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdHJ1Y3R1cmUgb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBvYmplY3QtdHlwZSB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgcmVmZXJlbmNlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIHR5cGUgdGhhdCBzdG9yZXMgdGhlIHJlZmVyZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIE9iamVjdFJlbGF0aW9uYWxEYXRhYmFzZUZpZWxkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZS1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QteG1sLXR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwcGluZyB0byBhbiBPcmFjbGUgWERCIFhNTCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC13aG9sZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdXNlciBkZWZpbmVkIGNvbnZlcnRlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29sbGVjdGlvbi1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLU0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIGEga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXJwb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VzLXNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIG9uZSBvciBtb3JlIGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGQtYXNzb2NpYXRpb24iIHR5cGU9ImZvcmVpZ24ta2V5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0JICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotCSAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBYTUwgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50LWZpZWxkIiB0eXBlPSJub2RlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBYTUxGaWVsZCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLXByZXNlcnZlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgbm9kZXMgc2hvdWxkIGJlIGNhY2hlZCB0byBwcmVzZXJ2ZSB1bm1hcHBlZCBkYXRhPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNjaGVtYSIgdHlwZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbG9jYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVzdWx0LWFsd2F5cy14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmNsdWRlLW5hbWVzcGFjZS1kZWNsYXJhdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5jbHVkZS1zY2hlbWEtaW5zdGFuY2UiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgb2JqZWN0IHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIE5vZGUgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiBvZiBOb2RlcyB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZmllbGQiIHR5cGU9Im5vZGUiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbnZlcnNpb24tcGFpciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBYUGF0aCBleHByZXNzaW9uIHRvIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlIGluIGFuIFhNTCBkb2N1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgaW4gdGhlIHBhcmVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxlYWYtZWxlbWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgZWxlbWVudHMgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXMtcmVxdWlyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaW9uLW5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2UgdG8gcmVwcmVzZW50IG5vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gdW5pb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWVzcGFjZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJuYW1lc3BhY2UiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdC1uYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEtY29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1jbGFzcy1wYXRoLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWZpbGUtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtdXJsLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLWNoYXJhY3RlciI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS10aW1lc3RhbXAiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS11dGlsLWRhdGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1wb2xpY3kiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIiB0eXBlPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbXAgYmVhbi1sZXZlbCBwZXNzaW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCIgdHlwZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIG1vZGlmaWNhdGlvbiBkZWZlcnJhbCBsZXZlbCBmb3Igbm9uLWRlZmVycmVkIHdyaXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSIgdHlwZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHBvaW50IGF0IHdoaWNoIGluc2VydCB3aWxsIGJlIGlzc3VlZCB0byBEYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IndhaXQiIG5hbWU9ImxvY2tpbmctbW9kZSIgdHlwZT0ibG9ja2luZy1tb2RlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbC1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpiY3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpicG9zdGNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVuZGVmaW5lZCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2tpbmctbW9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkhvbGRzIHRoZSBwZXNzaW1pc3RpYyBsb2NraW5nIG1vZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YWl0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8td2FpdCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjUwIiBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3Vwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgZmV0Y2ggZ3JvdXAgYXR0cmlidXRlcyBpbmZvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYSBmZXRjaCBncm91cCdzIGF0dHJpYnV0ZSBsaXN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZlcnJlZC1kZXRlY3Rpb24tY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYmFja3VwIGNsb25lIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgIm1hcmsgZGlydHkiIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYSBDaGFuZ2VUcmFja2VyIGZpcmluZyBQcm9wZXJ0eUNoYW5nZUV2ZW50J3MgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgTnVsbCBQb2xpY3kgaW4gdXNlIGZvciB0aGlzIHJlbGF0aW9uc2hpcCBjdXJyZW50bHkgYSBjaG9pY2Ugb2YgW051bGxQb2xpY3kgYW5kIElzU2V0TnVsbFBvbGljeV0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJudWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlzLXNldC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Xcml0ZSBudWxsLCBubyB0YWcoZGVmYXVsdCkgb3IgYW4gZW1wdHkgdGFnLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnZW5lcmljIGZpZWxkIGNvbmNlcHQsIHN1Y2ggYXMgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbHVtbiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIFRoaXMgdGFibGUgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIGNsYXNzJyB0YWJsZXMuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IHRhYmxlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNxbC10eXBlY29kZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4ob3B0aW9uYWwgZmllbGQpIFRoZSBKREJDIHR5cGVjb2RlIG9mIHRoaXMgY29sdW1uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+KG9wdGlvbmFsIGZpZWxkKSBOYW1lIG9mIHRoZSBKREJDIHR5cGVjb2RlIGZvciB0aGlzIGNvbHVtbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JlaWduLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgZmllbGQvY29sdW1uIHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBpbiBhbm90aGVyIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC1yZWZlcmVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IHRhYmxlIHByaW1hcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSB0YXJnZXQgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgc3BlY2lmaWNhdGlvbiBmb3IgcXVlcnlpbmcgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBvZiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHF1ZXJ5IGFyZ3VtZW50cy4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCBtdXN0IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgdmFsdWUgcGFzc2VkIHRvIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeS4gIFRoaXMgbmFtZSBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYW5kIGV4ZWN1dGUgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JpdGVyaWEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBmaWx0ZXJpbmcgY2xhdXNlIG9mIGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdHlwZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBtYXkgYmUgcHJvdmlkZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIGNvbnN0YW50IHZhbHVlIGZvciB0aGUgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gIFRoZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQgd2l0aCB0aGUgc2NoZW1hLCB0YWJsZXNwYWNlIG9yIGxpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZQotICAgICAgICBvYmplY3QgdmFsdWUuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gIAk8eHNkOnNlcXVlbmNlPgotICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgCQk8L3hzZDplbGVtZW50PgotICAJPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUKLSAgICAJbmFtZT0iZGVzY3JpcHRvci1sZXZlbC1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWJpbmRlci1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imlnbm9yZS1uZXctZWxlbWVudHMtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgIAk8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19wZXJzaXN0ZW5jZV9tYXBfMi4wLnhzZCBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTNiOWVhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3BlcnNpc3RlbmNlX21hcF8yLjAueHNkCisrKyAvZGV2L251bGwKQEAgLTEsNDI1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSBFY2xpcHNlIFBlcnNpc3RlbmNlIFNlcnZpY2UgUHJvamVjdCA6OiBNYXAgU2NoZW1hIGZpbGUgZm9yIE9STS9PWE0vRUlTIC0tPgotPHhzZDpzY2hlbWEKLSAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiCi0gIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgotICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gIHZlcnNpb249IjIuMCIKLSAgPgotICA8eHNkOmVsZW1lbnQgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIiB0eXBlPSJvYmplY3QtcGVyc2lzdGVuY2UiIC8+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXBlcnNpc3RlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+QW4gb2JqZWN0LXBlcnNpc3RlbmNlIG1hcHBpbmcgbW9kdWxlLCBhIHNldCBvZiBjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBuYW1lIGZvciB0aGUgbW9kZWwgYmVpbmcgbWFwcGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9ycyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgY2xhc3MgbWFwcGluZyBkZXNjcmlwdG9ycy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIiB0eXBlPSJjbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibG9naW4iIHR5cGU9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGVmYXVsdC10ZW1wb3JhbC1tdXRhYmxlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZGVmYXVsdCBmb3IgaG93IERhdGUgYW5kIENhbGVuZGFyIHR5cGVzIGFyZSB1c2VkIHdpdGggY2hhbmdlIHRyYWNraW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkJ5IGRlZmF1bHQgdGhleSBhcmUgYXNzdW1lZCBub3QgdG8gYmUgY2hhbmdlZCBkaXJlY3RseSAob25seSByZXBsYWNlZCkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJxdWVyaWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIGxpc3Qgb2YgcXVlcmllcyB0byBiZSBzdG9yZWQgb24gdGhlIHNlc3Npb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5IiB0eXBlPSJkYXRhYmFzZS1xdWVyeSI+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgZGVmYXVsdD0iRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyAtIDIuMCAoQnVpbGQgWVlNTUREKSIgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YXNvdXJjZS1sb2dpbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBwbGF0Zm9ybSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVzZXItbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGRhdGFzb3VyY2UgdXNlci1uYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBkYXRhc291cmNlIHBhc3N3b3JkLCB0aGlzIGlzIHN0b3JlZCBpbiBlbmNyeXB0ZWQgZm9ybS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJleHRlcm5hbC1jb25uZWN0aW9uLXBvb2xpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjb25uZWN0aW9ucyBhcmUgbWFuYWdlZCBieSB0aGUgZGF0YXNvdXJjZSBkcml2ZXIsIGFuZCBhIG5ldyBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlIHBlciBjYWxsLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSB0cmFuc2FjdGlvbiBhcmUgbWFuYWdlZCBieSBhIHRyYW5zYWN0aW9uIG1hbmFnZXIsIGFuZCBzaG91bGQgbm90IGJlIG1hbmFnZWQgYnkgVG9wTGluay48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGNhbiBhbHNvIGJlIHVzZWQgaWYgdGhlIGRhdGFzb3VyY2UgZG9lcyBub3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jaW5nIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiIHR5cGU9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSWYgbm8gbmFtZSBwcm92aWRlZCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlcXVlbmNlcyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Tm9uIGRlZmF1bHQgc2VxdWVuY2VzLiBNYWtlIHN1cmUgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InNlcXVlbmNlIiB0eXBlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpEQkMgZHJpdmVyIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkcml2ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKREJDIGRyaXZlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tdXJsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIEpEQkMgZHJpdmVyIGNvbm5lY3Rpb24gVVJMLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIHBhcmFtZXRlciBiaW5kaW5nIHNob3VsZCBiZSB1c2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhY2hlLWFsbC1zdGF0ZW1lbnRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RhdGVtZW50IGNhY2hpbmcgc2hvdWxkIGJlIHVzZWQuICBUaGlzIHNob3VsZCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcsIHRoaXMgY2Fubm90IGJlIHVzZWQgd2l0aCBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSBpZiBieXRlIGFycmF5IGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InN0cmluZy1iaW5kaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIGRhdGEtdHlwZXMgc2hvdWxkIHVzZSBiaW5kaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMjU2IiBuYW1lPSJzdHJpbmctYmluZGluZy1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRocmVzaG9sZCBzdHJpbmcgc2l6ZSBmb3IgdXNhZ2Ugb2Ygc3RyaW5nIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic3RyZWFtcy1mb3ItYmluZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGlmIGxhcmdlIGJ5dGUgYXJyYXkgYW5kIHN0cmluZyBkYXRhLXR5cGVzIHNob3VsZCBiZSBib3VuZCBhcyBzdHJlYW1zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0byBmb3JjZSBhbGwgZmllbGQgbmFtZXMgdG8gdXBwZXItY2FzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im9wdGltaXplLWRhdGEtY29udmVyc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29uZmlndXJlIGRhdGEgb3B0aW1pemF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgc3RyaW5nIHRyYWlsaW5nIGJsYW5rcyBzaG91bGQgYmUgdHJpbW1lZC4gIFRoaXMgaXMgbm9ybWFsbHkgcmVxdWlyZWQgZm9yIENIQVIgZGF0YS10eXBlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgaWYgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImpkYmMtYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdXNpbmcgYmF0Y2ggd3JpdGluZywgY29uZmlndXJlIGlmIHRoZSBKREJDIGRyaXZlcnMgYmF0Y2ggd3JpdGluZyBzaG91bGQgYmUgdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpDQSBkcml2ZXIgYW5kIEVJUyBjb25uZWN0aW9uIGFuZCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhc291cmNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBUb3BMaW5rIHBsYXRmb3JtIHNwZWNpZmljIGNvbm5lY3Rpb24gc3BlYyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIEpOREkgdXJsIGZvciB0aGUgbWFuYWdlZCBKQ0EgYWRhcHRlcidzIGNvbm5lY3Rpb24gZmFjdG9yeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGNvbm5lY3Rpb24gYW5kIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFzb3VyY2UtbG9naW4iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBuYW1lPSJlcXVhbC1uYW1lc3BhY2UtcmVzb2x2ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgICAgICAgICAgICAgIHR5cGU9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiIG1heE9jY3Vycz0iMSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZm9ybWF0aW9uIG9mIGhvdyBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBpdHMgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgYW4gYWJzdHJhY3QgZGVmaW5pdGlvbiB0byBhbGxvdyBmbGV4aWJpbGl0eSBpbiB0aGUgdHlwZXMgb2YgY2xhc3NlcyBhbmQgZGF0YXN0b3JlcyBwZXJzaXN0ZWQsIGkuZS4gaW50ZXJmYWNlcywgYWJzdHJhY3QgY2xhc3NlcywgYWdncmVnYXRlcywgbm9uLXJlbGF0aW9uYWwgcGVyc2lzdGVuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBiZWluZyBwZXJzaXN0ZWQuICBUaGUgY2xhc3MgbmFtZSBtdXN0IGJlIGZ1bGwgcXVhbGlmaWVkIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhhbXBsZTogPGNsYXNzIHhtbG5zPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rL3hzZHMvcGVyc2lzdGVuY2UiPmV4YW1wbGUuZW1wbG95ZWUuaW1wbGVtZW50YXRpb24uRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWxpYXMiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgYW4gYWxpYXMgbmFtZSBjYW4gYmUgZ2l2ZW4gZm9yIHRoZSBjbGFzcy4gIFRoZSBhbGlhcyBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzcyBpbiBwbGFjZSBvZiBpdHMgaW1wbGVtZW50YXRpb24gbmFtZSwgc3VjaCBhcyBpbiBxdWVyeWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeGFtcGxlOiA8YWxpYXMgeG1sbnM9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZSI+RW1wbG95ZWU8L2FsaWFzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJpbWFyeS1rZXkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy9jb2x1bW5zIHRoYXQgbWFrZSB1cCB0aGUgcHJpbWFyeSBrZXkgb3IgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgaXMgdXNlZCBmb3IgY2FjaGluZywgcmVsYXRpb25zaGlwcywgYW5kIGZvciBkYXRhYmFzZSBvcGVyYXRpb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBrZXkgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGlmIHRoZSBjbGFzcyBpcyByZWFkLW9ubHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9wZXJ0aWVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdXNlciBkZWZpbmVkIHByb3BlcnRpZXMgdG8gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icHJvcGVydHkiIHR5cGU9InByb3BlcnR5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHVzZXIgZGVmaW5lZCBwcm9wZXJ0eS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5oZXJpdGFuY2UiIHR5cGU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzIGlzIHJlbGF0ZWQgaW4gaW5oZXJpdGFuY2UgYW5kIGhvdyB0aGlzIGluaGVyaXRhbmNlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV2ZW50cyIgdHlwZT0iZXZlbnQtcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBwZXJzaXN0ZW50IGV2ZW50cyBmb3IgdGhpcyBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5aW5nIiB0eXBlPSJxdWVyeS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGRlZmluZWQgcXVlcmllcyBmb3IgdGhlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW1hcHBpbmdzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBtYXBwaW5ncyB0aGF0IGRlZmluZSBob3cgdGhlIGNsYXNzJyBhdHRyaWJ1dGVzIGFyZSBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImF0dHJpYnV0ZS1tYXBwaW5nIiB0eXBlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBhdHRyaWJ1dGUgaXMgcGVyc2lzdGVkLiBUaGUgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbiBpcyBleHRlbmRhYmxlIHRvIGFsbG93IGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlc2NyaXB0b3ItdHlwZSIgdHlwZT0iY2xhc3MtZGVzY3JpcHRvci10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBkZXNjcmlwdG9yIHR5cGUsIHN1Y2ggYXMgYWdncmVnYXRlIG9yIGluZGVwZW5kZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW50ZXJmYWNlcyIgdHlwZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgY2xhc3MgaW1wbGVtZW50cy4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsb2NraW5nIiB0eXBlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgbG9ja2luZyBiZWhhdmlvciBmb3IgdGhlIGNsYXNzLiAgU3VjaCBhcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIHZlcnNpb24sIHRpbWVzdGFtcCBvciBjaGFuZ2Ugc2V0IG9mIGNvbHVtbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXF1ZW5jaW5nIiB0eXBlPSJzZXF1ZW5jaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlbW90ZS1jYWNoaW5nIiB0eXBlPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgdGhlIGNsYXNzJyBpbnN0YW5jZXMgc2hvdWxkIGJlIGNhY2hlZCBvbiByZW1vdGUgY2xpZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktcG9saWN5IiB0eXBlPSJoaXN0b3J5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiBvYmplY3RzIGFyZSBwZXJzaXN0ZWQgdG8gdGhlIGRhdGEtc3RvcmUuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gaGlzdG9yeSBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm5pbmctcG9saWN5IiB0eXBlPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHJldHVuaW5nIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyByZXR1cm5pbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYW1lbmRtZW50IiB0eXBlPSJhbWVuZG1lbnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB0aGUgZGVzY3JpcHRvciB0byBiZSBhbWVuZGVkIG9yIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsYXNzIEFQSSBhZnRlciBsb2FkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5zdGFudGlhdGlvbiIgdHlwZT0iaW5zdGFudGlhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb3B5aW5nIiB0eXBlPSJjb3B5LXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QWxsb3cgdGhlIG9iamVjdCBjbG9uaW5nL2NvcHlpbmcgYmVoYXZvaXIgdG8gYmUgY3VzdG9taXplZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJ5LWtleXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgbGlzdCBvZiBxdWVyeSBrZXlzIG9yIGFsaWFzZXMgZm9yIGRhdGFiYXNlIGluZm9ybWF0aW9uLiAgVGhlc2UgY2FuIGJlIHVzZWQgaW4gcXVlcmllcyBpbnN0ZWFkIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gbmFtZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InF1ZXJ5LWtleSIgdHlwZT0icXVlcnkta2V5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFsaWFzIGZvciBxdWVyeWluZyBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY21wLXBvbGljeSIgdHlwZT0iY21wLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UGxhY2UgaG9sZGVyIG9mIENNUCBpbmZvcm1hdGlvbiBzcGVjaWZpYy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwcyIgdHlwZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyBhbGwgcHJlLWRlZmluZWQgZmV0Y2ggZ3JvdXBzIGF0IHRoZSBkZXNjcmlwdG9yIGxldmVsPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9ImNoYW5nZS1wb2xpY3kiIHR5cGU9ImNoYW5nZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNvbnRhaW5zIHRoZSBDaGFuZ2UgUG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3I8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMTAiIG5hbWU9InNjaGVtYS1tYWpvci12ZXJzaW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KLSAgICA8eHNkOmF0dHJpYnV0ZSBmaXhlZD0iMCIgbmFtZT0ic2NoZW1hLW1pbm9yLXZlcnNpb24iIHR5cGU9InhzZDppbnRlZ2VyIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNsYXNzLWRlc2NyaXB0b3ItdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNsYXNzIGRlc2NyaXB0b3IgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZGVwZW5kZW50IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWdncmVnYXRlLWNvbGxlY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3NpdGUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbnRlcmZhY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaW50ZXJmYWNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGludGVyZmFjZXMgdGhhdCBhIGNsYXNzIGRlc2NyaXB0b3IgaW1wbGVtZW50cywgb3IgdGhlIGltcGxlbWVudGlvbiBjbGFzcyBmb3IgYW4gaW50ZXJmYWNlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IGEgc2V0IG9mIHB1YmxpYyBpbnRlcmZhY2VzIGZvciB0aGUgY2xhc3MgY2FuIGJlIHNwZWNpZmllZC4gIFRoaXMgYWxsb3dzIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB0byByZWZlciB0byB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0d28gY2xhc3NlcyBpbXBsZW1lbnQgdGhlIHNhbWUgaW50ZXJmYWNlLCBhbiBpbnRlcmZhY2UgZGVzY3JpcHRvciBzaG91bGQgYmUgZGVmaW5lZCBmb3IgdGhlIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGFsc28gYmUgdXNlZCB0byBkZWZpbmUgaW5oZXJpdGFuY2UgYmV0d2VlbiBpbnRlcmZhY2UgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW50ZXJmYWNlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIGludGVyZmFjZSBjbGFzcyBuYW1lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmFwaS5FbXBsb3llZTwvY2xhc3M+PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaW1wbGVtZW50b3ItZGVzY3JpcHRvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3Igd2hpY2ggdGhpcyBpbnRlcmZhY2UgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiB0aGUgaW50ZXJmYWNlIGhhcyBvbmx5IGEgc2luZ2xlIGltcGxlbWVudG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkV4YW1wbGU6IDxjbGFzcyB4bWxucz0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL3BlcnNpc3RlbmNlIj5leGFtcGxlLmVtcGxveWVlLmltcGwuRW1wbG95ZWU8L2NsYXNzPjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLWNvcHktcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3JlYXRlcyBhIGNvcHlpbmcgdGhyb3VnaCBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSB0byBjb3B5IGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvcHktcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbG9uZS1jb3B5LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgY2xvbmluZy9jb3B5aW5nIGJlaGF2b2lyIHRvIGJlIGN1c3RvbWl6ZWQgdGhyb3VnaCBhIGNsb25lIG1ldGhvZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29weS1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY2xvbmUgbWV0aG9kIG9uIHRoZSBvYmplY3QsIGkuZS4gJ2Nsb25lJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbnN0YW50aWF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBvYmplY3QgaW5zdGFudGlhdGlvbiBiZWhhdm9pciB0byBiZSBjdXN0b21pemVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSBmYWN0b3J5IHRvIGluc3RhbnRpYXRlIHRoZSBvYmplY3QgaW5zdGFuY2UuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBmYWN0b3J5IGNsYXNzIG5hbWUuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmFjdG9yeS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBtZXRob2QgdG8gaW5zdGFudGlhdGUgdGhlIGZhY3RvcnkgY2xhc3MuJzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhbWVuZG1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSBjbGFzcyBhbmQgc3RhdGljIG1ldGhvZCB0byBiZSBjYWxsZWQgdG8gYWxsb3cgZm9yIHRoZSBkZXNjcmlwdG9yIHRvIGJlIGFtZW5kZWQgb3IgY3VzdG9taXplZCB0aHJvdWdoIGEgY2xhc3MgQVBJIGFmdGVyIGxvYWRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4gVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBhbWVuZG1lbnQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW1lbmRtZW50LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHN0YXRpYyBhbWVuZG1lbnQgbWV0aG9kIG9uIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUocykuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFibGVzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRoZSB0YWJsZXMgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFR5cGljYWxseSBhIGNsYXNzIGlzIHBlcnNpc3RlZCB0byBhIHNpbmdsZSB0YWJsZSwgYnV0IG11bHRpcGxlIHRhYmxlcyBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJ0YWJsZSIgdHlwZT0idGFibGUiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgdGFibGVzIHRoYXQgdGhlIGNsYXNzIGlzIHBlcnNpc3RlZCB0by4gIFRoaXMgaXMgdHlwaWNhbGx5IGEgc2luZ2xlIHRhYmxlIGJ1dCBjYW4gYmUgbXVsdGlwbGUsIG9yIGVtcHR5IGZvciBpbmhlcml0YW5jZSBvciBhZ2dyZWdhdGVkIGNsYXNzZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5cy1mb3ItbXVsdGlwbGUtdGFibGUiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBmb3JlaWduIGtleSBmaWVsZCByZWZlcmVuY2VzIHRvIGJlIGRlZmluZSBmb3IgbXVsdGlwbGUgdGFibGUgZGVzY3JpcHRvcnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtdWx0aXBsZS10YWJsZS1qb2luLWNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgY29tcGxleCBtdWx0aXBsZSB0YWJsZSBqb2luIGNvbmRpdGlvbnMgYW4gZXhwcmVzc2lvbiBtYXkgYmUgcHJvdmlkZWQgaW5zdGVhZCBvZiB0aGUgdGFibGUgZm9yZWlnbiBrZXkgaW5mb3JtYXRpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmVyc2lvbi1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiBhIG51bWVyaWMgdmVyc2lvbiBmaWVsZC9jb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZlcnNpb24tZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIGFuZCBvcHRpb25hbGx5IHRoZSB0YWJsZSBvZiB0aGUgY29sdW1uIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyBzdG9yZWQgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9InN0b3JlLXZlcnNpb24taW4tY2FjaGUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHZlcnNpb24gdmFsdWUgc2hvdWxkIGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0IHdpbGwgYmUgc3RvcmVkIGluIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRpbWVzdGFtcC1sb2NraW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gb3B0aW1pc3RpYyBsb2NraW5nIHBvbGljeSBiYXNlZCBvbiB0aW1lc3RhbXAgdmVyc2lvbiBjb2x1bW4gdGhhdCB0cmFja3MgY2hhbmdlcyBhbmQgdGhlIHZlcnNpb24gdG8gYW4gb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2ZXJzaW9uLWxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ic2VydmVyLXRpbWUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHRpbWVzdGFtcCBzaG91bGQgYmUgb2J0YWluZWQgbG9jYWxseSBvciBmcm9tIHRoZSBkYXRhYmFzZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFsbC1maWVsZHMtbG9ja2luZy1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIG9wdGltaXN0aWMgbG9ja2luZyBwb2xpY3kgYmFzZWQgb24gY29tcGFyaW5nIHRoZSBvcmlnaW5hbCByZWFkIHZhbHVlcyBvZiBhbGwgZmllbGRzIG9mIHRoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9ja2luZy1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNoYW5nZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2Ygb25seSB0aGUgY2hhbmdlZCBmaWVsZHMgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2NraW5nLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VsZWN0ZWQtZmllbGRzLWxvY2tpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBvcHRpbWlzdGljIGxvY2tpbmcgcG9saWN5IGJhc2VkIG9uIGNvbXBhcmluZyB0aGUgb3JpZ2luYWwgcmVhZCB2YWx1ZXMgb2YgYSBzcGVjaWZpZWQgc2V0IG9mIGZpZWxkcyBvZiB0aGUgb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvY2tpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHNldCBvZiBmaWVsZHMgdG8gY29tcGFyZSBvbiB1cGRhdGUgYW5kIGRlbGV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcXVlbmNpbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBkYXRhYmFzZSBnZW5lcmF0ZWQgdW5pcXVlIGlkIHNob3VsZCBiZSBhc3NpZ25lZCB0byB0aGUgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yLiAgVGhpcyBjb3VsZCBiZSB0aGUgbmFtZSBvZiBhIHNlcXVlbmNlIG9iamVjdCwgb3IgYSByb3cgdmFsdWUgaW4gYSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBnZW5lcmF0ZWQgc2VxdWVuY2UgaWQgaXMgYXNzaWduZWQgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtdHlwZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBjYWNoaW5nIHR5cGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm9uZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZ1bGwiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IndlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic29mdC1yZWZlcmVuY2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaGFyZC1jYWNoZS13ZWFrLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjYWNoaW5nLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcycgaW5zdGFuY2VzIHNob3VsZCBiZSBjYWNoZWQgYW5kIGhvdyBvYmplY3QgaWRlbnRpdHkgc2hvdWxkIGJlIG1haW50YWluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJzb2Z0LWNhY2hlLXdlYWstcmVmZXJlbmNlIiBuYW1lPSJjYWNoZS10eXBlIiB0eXBlPSJjYWNoZS10eXBlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSB0eXBlIG9mIGNhY2hpbmcsIHN1Y2ggYXMgTFJVLCB3ZWFrIHJlZmVyZW5jZSBvciBub25lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iMTAwIiBuYW1lPSJjYWNoZS1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgaW5pdGlhbCBvciBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1yZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgcmVmcmVzaCBjYWNoZWQgb2JqZWN0cyBvbiBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im9ubHktcmVmcmVzaC1jYWNoZS1pZi1uZXdlci12ZXJzaW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byByZWZyZXNoIGlmIHRoZSBjYWNoZWQgb2JqZWN0IGlzIGFuIG9sZGVyIHZlcnNpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iZGlzYWJsZS1jYWNoZS1oaXRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGlzYWJsZSBvYnRhaW5pbmcgY2FjaGUgaGl0cyBvbiBwcmltYXJ5IGtleSBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImFsd2F5cy1jb25mb3JtIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgY29uZm9ybSBxdWVyaWVzIHdpdGhpbiBhIHRyYW5zYWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imlzb2xhdGVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIG9mIHRoaXMgdHlwZSBzaG91bGQgYmUgaXNvbGF0ZWQgZnJvbSB0aGUgc2hhcmVkIGNhY2hlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iaXNvbGF0ZS1uZXctZGF0YS1hZnRlci10cmFuc2FjdGlvbiIgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiIHR5cGU9InVuaXRvZndvcmstaXNvbGF0aW9uLWxldmVsIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIHNob3VsZCBiZSBpc29sYXRlZCB0byB0aGUgc2Vzc2lvbiBjYWNoZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iY2hhbmdlLXNldCIgbmFtZT0iY2FjaGUtc3luYy10eXBlIiB0eXBlPSJjYWNoZS1zeW5jLXR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSB0eXBlIG9mIGNhY2hlIHN5bmNocm9uaXphdGlvbiB0byBiZSB1c2VkIHdpdGggdGhpcyBkZXNjcmlwb3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNhY2hlLWludmFsaWRhdGlvbiIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBjYWNoZSBpbnZhbGlkYXRpb24gcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXBkYXRlLXJlYWQtdGltZS1vbi11cGRhdGUiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1leHBpcnktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBpbiB0aGUgY2FjaGUgZG8gbm90IGV4cGlyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2FjaGUtaW52YWxpZGF0aW9uIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0aW1lLXRvLWxpdmUtY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kgd2hlcmUgb2JqZWN0cyBsaXZlIGEgc3BlY2lmaWMgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBhZnRlciB0aGV5IGFyZSByZWFkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0aW1lLXRvLWxpdmUiIHR5cGU9InhzZDpsb25nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGFpbHktY2FjaGUtaW52YWxpZGF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkNhY2hlIGludmFsaWRhdGlvbiBQb2xpY3kgd2hlcmUgb2JqZWN0cyBleHBpcmUgYXQgYSBzcGVjaWZpYyB0aW1lIGV2ZXJ5IGRheTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjYWNoZS1pbnZhbGlkYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHBpcnktdGltZSIgdHlwZT0ieHNkOmRhdGVUaW1lIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBwYXN0IHZlcnNpb25zIG9mIG9iamVjdHMgYXJlIHRvIGJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImhhbmRsZS13cml0ZXMiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1kYXRhYmFzZS10aW1lIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imhpc3RvcnktdGFibGVzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBuYW1lcyBvZiB0aGUgbWlycm9yaW5nIGhpc3RvcmljYWwgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaGlzdG9yeS10YWJsZSIgdHlwZT0iaGlzdG9yeS10YWJsZSIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RhcnQtZmllbGRzIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzdGFydCBmaWVsZHMgZm9yIGVhY2ggaGlzdG9yaWNhbCB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InN0YXJ0LWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZW5kLWZpZWxkcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgZW5kIGZpZWxkcyBmb3IgZWFjaCBoaXN0b3JpY2FsIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZW5kLWZpZWxkIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJoaXN0b3J5LXRhYmxlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RWFjaCBlbnRyeSBpcyBhIHNvdXJjZSAoZGVzY3JpcHRvcikgdG8gaGlzdG9yeSB0YWJsZSBuYW1lIGFzc29jaWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iIiBuYW1lPSJzb3VyY2UiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJoaXN0b3J5IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXR1cm5pbmctcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyByZXR1bmluZyBwb2xpY3kuICBCeSBkZWZhdWx0IHRoZXJlIHdpbGwgYmUgbm8gcmV0dXJuaW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjEiIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvcyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdHMgdGhlIGZpZWxkcyB0byBiZSByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBmbGFncyBkZWZpbmluZyByZXR1cm5pbmcgb3B0aW9uczwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icmV0dXJuaW5nLWZpZWxkLWluZm8iIHR5cGU9InJldHVybmluZy1maWVsZC1pbmZvIiAvPgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJldHVybmluZy1maWVsZC1pbmZvIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RmllbGQgdG8gYmUgcmV0dXJuZWQgdG9nZXRoZXIgd2l0aCB0eXBlIGFuZCB0aGUgZmxhZ3MgZGVmaW5pbmcgcmV0dXJuaW5nIG9wdGlvbnMuIEF0IGxlYXN0IG9uZSBvZiBpbnNlcnQsIHVwZGF0ZSBzaG91bGQgYmUgdHJ1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJlZmVyZW5jZS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSB0YXJnZXQgcmVmZXJlbmNlZCBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCB0byBiZSByZXR1cm5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJpbnNlcnQiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIGJlIHJldHVuZWQgYWZ0ZXIgSW5zZXJ0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Imluc2VydC1tb2RlLXJldHVybi1vbmx5IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgaW5zZXJ0PT10cnVlLCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZmllbGQgc2hvdWxkIG5vdCBiZSBpbnNlcnRlZCAodHJ1ZSkuIElmIGluc2VydD09ZmFsc2UgLSBpZ25vcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWVsZCBzaG91bGQgYmUgcmV0dW5lZCBhZnRlciBJbnNlcnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImluaGVyaXRhbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHRoZSBjbGFzcyBpcyByZWxhdGVkIGluIGluaGVyaXRhbmNlIGFuZCBob3cgdGhpcyBpbmhlcml0YW5jZSBpcyBwZXJzaXN0ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwYXJlbnQtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBwYXJlbnQvc3VwZXJjbGFzcyBvZiB0aGUgY2xhc3MgYmVpbmcgcGVyc2lzdGVkLiAgVGhlIGNsYXNzIG5hbWUgbXVzdCBiZSBmdWxsIHF1YWxpZmllZCAgIHdpdGggaXRzIHBhY2thZ2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJyZWFkLXN1YmNsYXNzZXMtb24tcXVlcmllcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSBpZiBzdWJjbGFzc2VzIG9mIHRoZSBjbGFzcyBzaG91bGQgYmUgcmV0dXJuZWQgb24gcXVlcmllcywgb3Igb25seSB0aGUgZXhhY3QgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy12aWV3IiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgdGhlIG5hbWUgb2YgYSB2aWV3IHRoYXQgam9pbnMgYWxsIG9mIHRoZSBzdWJjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InVzZS1jbGFzcy1uYW1lLWFzLWluZGljYXRvciIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBpZiB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGNsYXNzIHR5cGUgaW5kaWNhdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtZXh0cmFjdGlvbi1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIGEgbWV0aG9kIG9uIHRoZSBjbGFzcyB0aGF0IHRha2VzIHRoZSBjbGFzcycgcm93IGFzIGFyZ3VtZW50IGEgY29tcHV0ZWQgdGhhdCBjbGFzcyB0eXBlIHRvIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgZnJvbSB0aGUgcm93LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2xhc3MtaW5kaWNhdG9yLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHR5cGUgZmllbGQvY29sdW1uIHRoYXQgdGhlIGNsYXNzIHR5cGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBjbGFzcyBpbmRpY2F0b3IgdmFsdWVzIGFuZCB0aGUgc3ViY2xhc3NlcyB0aGV5IG1hcCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNsYXNzLWV4dHJhY3RvciIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYSBjbGFzcyBleHRyYWN0b3IgaW50ZXJmYWNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib25seS1pbnN0YW5jZXMtY3JpdGVyaWEiIHR5cGU9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgY3JpdGVyaWEgdGhhdCBmaWx0ZXJzIG91dCBhbGwgc2libGluZyBhbmQgc3ViY2xhc3MgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhbGwtc3ViY2xhc3Nlcy1jcml0ZXJpYSIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjcml0ZXJpYSB0aGF0IGZpbHRlcnMgb3V0IHNpYmxpbmcgaW5zdGFuY2VzIG9uIHF1ZXJpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ib3V0ZXItam9pbi1zdWJjbGFzc2VzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxbmFtZS1pbmhlcml0YW5jZS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5FeHRlbmRzIGluaGVyaXRhbmNlIHBvbGljeS4gQWxsb3dzIGZvciBwcmVmaXhlZCBuYW1lcyB0byBiZSByZXNvbHZlZCBhdCBydW50aW1lIHRvIGZpbmQgdGhlIGFwcHJvcmlhdGUgY2xhc3M8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5oZXJpdGFuY2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIHRoZSB0eXBlIG1hcHMgdG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtaW5kaWNhdG9yIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHZhbHVlIHVzZWQgdG8gZGVmaW5lIHRoZSBjbGFzcyB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV2ZW50LXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHBlcnNpc3RlbnQgZXZlbnRzIGZvciB0aGlzIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZXZlbnQtbGlzdGVuZXJzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV2ZW50LWxpc3RlbmVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgYW4gZXZlbnQgbGlzdGVuZXIgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBkZXNjcmlwdG9yIGV2ZW50IGxpc3RlbmVyIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1idWlsZC1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBidWlsZGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJlLXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB3cml0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXdyaXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGFmdGVyIHdyaXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGluc2VydGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1pbnNlcnQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgaW5zZXJ0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcmUtdXBkYXRlLW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSB1cGRhdGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC11cGRhdGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByZS1kZWxldGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LWRlbGV0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBkZWxldGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYWJvdXQtdG8taW5zZXJ0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TWV0aG9kIGV4ZWN1dGVkIGJlZm9yZSBpbnNlcnRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFib3V0LXRvLXVwZGF0ZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc3QtY2xvbmUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgY2xvbmluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icG9zdC1tZXJnZS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk1ldGhvZCBleGVjdXRlZCBhZnRlciBtZXJnaW5nIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwb3N0LXJlZnJlc2gtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5NZXRob2QgZXhlY3V0ZWQgYWZ0ZXIgcmVmcmVzaGluZyB0aGUgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBkZWZpbmVkIHF1ZXJpZXMgYW5kIHF1ZXJ5IHByb3BlcnRpZXMgZm9yIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InF1ZXJpZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0icXVlcnkiIHR5cGU9InF1ZXJ5Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IGRlZmluaXRpb24gZm9yIHRoZSBjbGFzcycgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGEgdGltZW91dCB0byBhcHBseSB0byBhbGwgcXVlcmllcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImNoZWNrLWNhY2hlIiBuYW1lPSJleGlzdGVuY2UiIHR5cGU9ImV4aXN0ZW5jZS1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IHRoZSBiZWhhdm9pciB1c2VkIHRvIGRldGVybWluZSBpZiBhbiBpbnNlcnQgb3IgdXBkYXRlIHNob3VsZCBvY2N1ciBmb3IgYW4gb2JqZWN0IHRvIGJlIGN1c3RvbWl6ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnNlcnQtcXVlcnkiIHR5cGU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSBpbnNlcnQgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgaW5zZXJ0IGJlaGF2b2lyIGZvciB1c2FnZSB3aXRoIHN0b3JlZCBwcm9jZWR1cmVzIG9yIGN1c3RvbSBjYWxscy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InVwZGF0ZS1xdWVyeSIgdHlwZT0idXBkYXRlLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q3VzdG9tIHVwZGF0ZSBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCB1cGRhdGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLXF1ZXJ5IiB0eXBlPSJkZWxldGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZGVsZXRlIHF1ZXJ5LiAgVGhpcyBvdmVyaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkb2VzLWV4aXN0LXF1ZXJ5IiB0eXBlPSJkb2VzLWV4aXN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gZG9lcyBleGlzdCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCBkZWxldGUgYmVoYXZvaXIgZm9yIHVzYWdlIHdpdGggc3RvcmVkIHByb2NlZHVyZXMgb3IgY3VzdG9tIGNhbGxzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC1vYmplY3QtcXVlcnkiIHR5cGU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5DdXN0b20gcmVhZCBvYmplY3QgcXVlcnkuICBUaGlzIG92ZXJpZGUgdGhlIGRlZmF1bHQgcmVhZCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWFkLWFsbC1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkN1c3RvbSByZWFkIGFsbCBxdWVyeS4gIFRoaXMgb3ZlcmlkZSB0aGUgZGVmYXVsdCByZWFkIGFsbCBiZWhhdm9pciBmb3IgdXNhZ2Ugd2l0aCBzdG9yZWQgcHJvY2VkdXJlcyBvciBjdXN0b20gY2FsbHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iZXhpc3RlbmNlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgcG9saWNpZXMgZm9yIGRldGVybWluaW5nIGlmIGFuIGluc2VydCBvciB1cGRhdGUgc2hvdWxkIG9jY3VyIGZvciBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGVjay1jYWNoZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWRhdGFiYXNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLWV4aXN0ZW5jZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFzc3VtZS1ub24tZXhpc3RlbmNlIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIHF1ZXJ5aW5nIGRhdGFiYXNlIGluZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBxdWVyeS1rZXkgYWxpYXMgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2FjaGUtc3luYy10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHR5cGUgb2YgY2FjaGUgc3luY2hyb25pemF0aW9uIHRvIHVzZSB3aXRoIGEgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImludmFsaWRhdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vLWNoYW5nZXMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0LXdpdGgtbmV3LW9iamVjdHMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjaGFuZ2Utc2V0IiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0idW5pdG9md29yay1pc29sYXRpb24tbGV2ZWwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgdW5pdCBvZiB3b3JrIGlzb2xhdGVkIGZyb20gdGhlIHNlc3Npb24gY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ1c2Utc2Vzc2lvbi1jYWNoZS1hZnRlci10cmFuc2FjdGlvbiIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Imlzb2xhdGUtbmV3LWRhdGEtYWZ0ZXItdHJhbnNhY3Rpb24iIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpc29sYXRlLWNhY2hlLWFmdGVyLXRyYW5zYWN0aW9uIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaXNvbGF0ZS1jYWNoZS1hbHdheXMiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgZGF0YWJhc2UgY29sdW1uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJxdWVyeS1rZXkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBiZWluZyBhbGlhc2VkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbnNoaXAtcXVlcnkta2V5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgam9pbiB0byBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkta2V5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGFyZ2V0IHJlZmVyZW5jZWQgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmNob2ljZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBqb2luIGNvbmRpdGlvbiBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBjbGFzcycgdGFibGVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGpvaW4gY3JpdGVyaWEgYmV0d2VlbiB0aGUgc291cmNlIGFuZCB0YXJnZXQgY2xhc3MnIHRhYmxlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tb25lLXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS0xIGpvaW4gdG8gYW5vdGhlciBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9uZS10by1tYW55LXF1ZXJ5LWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYWxpYXMgZm9yIGEgMS1tIGpvaW4gZnJvbSBhbm90aGVyIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1xdWVyeS1rZXkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBhbmQgb3B0aW9uYWxseSB0aGUgdGFibGUgb2YgdGhlIGZpZWxkL2NvbHVtbiB0aGF0IHRoZSBhdHRyaWJ1dGUgaXMgc3RvcmVkIGludG8uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgYSB2YWx1ZSB0aGF0IG51bGwgZGF0YSB2YWx1ZXMgc2hvdWxkIGJlIGNvbnZlcnRlZCB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsbHkgc3BlY2lmeSBob3cgdGhlIGRhdGEgdmFsdWUgc2hvdWxkIGJlIGNvbnZlcnRlZCB0byB0aGUgb2JqZWN0IHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzc2lmaWNhdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IGEgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC4gVGhlIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb24gaXMgZXh0ZW5kYWJsZSB0byBhbGxvdyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuICBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhdHRyaWJ1dGUgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWFkLW9ubHkiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVhZC1vbmx5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZ2V0LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGdldCBtZXRob2QgZm9yIHRoZSBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZXQtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc2V0IG1ldGhvZCBmb3IgdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb3BlcnRpZXMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkFsbG93IGZvciB1c2VyIGRlZmluZWQgcHJvcGVydGllcyB0byBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJwcm9wZXJ0eSIgdHlwZT0icHJvcGVydHkiPgotICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBzaW1wbGUgYXR0cmlidXRlIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgZnJvbSBhbiBhdHRpcmJ1dGUgdG8gYSBzaW1wbGUgZmllbGQgZGF0YXR5cGUsIGkuZS4gU3RyaW5nLCBOdW1iZXIsIERhdGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtY2RhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcG9saWN5IiB0eXBlPSJhYnN0cmFjdC1udWxsLXBvbGljeSIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1kaXJlY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIGZyb20gYW4gYXR0aXJidXRlIHRvIGEgc2ltcGxlIGZpZWxkIGRhdGF0eXBlLCBpLmUuIFN0cmluZywgTnVtYmVyLCBEYXRlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1kaXJlY3QtbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGZpZWxkIHRyYW5zZm9ybWF0aW9uIGZvciBhIHRyYW5zZm9ybWF0aW9uIG1hcHBpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1ldGhvZC1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtZXRob2QiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc2Zvcm1lci1iYXNlZC1maWVsZC10cmFuc2Zvcm1hdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQtdHJhbnNmb3JtYXRpb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc2Zvcm1lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LXRyYW5zZm9ybWF0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgdHJhbnNmb3JtYXRpb24gbWFwcGluZyB0aGF0IHVzZXMgSmF2YSBjb2RlIHRvIHRyYW5zZm9ybSBiZXR3ZWVuIHRoZSBkYXRhIGFuZCBvYmplY3QgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhpcyBjYW4gYmUgdXNlZCBpZiBhIHNpbmdsZSBhdHRyaWJ1dGUgbWFwcyB0byBtdWx0aXBsZSBmaWVsZHMsIG9yIGZpZWxkIG9ubHkgbWFwcGluZ3Mgb3IgYXR0cmlidXRlIG9ubHkgbWFwcGluZ3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtbWV0aG9kIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtYXRpb24gZGVmaW5lZCBpbiB0aGUgZG9tYWluIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXR0cmlidXRlLXRyYW5zZm9ybWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHJhbnNmb3JtZXIuIFVzZWQgaW4gcGxhY2Ugb2YgYXR0cmlidXRlLXRyYW5zZm9ybWF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0ibXV0YWJsZSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC10cmFuc2Zvcm1hdGlvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkIHRyYW5zZm9ybWF0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRyYW5zZm9ybWF0aW9uIiB0eXBlPSJmaWVsZC10cmFuc2Zvcm1hdGlvbiIgLz4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtdHJhbnNmb3JtYXRpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoaXMgY2FuIGJlIHVzZWQgaWYgYSBzaW5nbGUgYXR0cmlidXRlIG1hcHMgdG8gbXVsdGlwbGUgZmllbGRzLCBvciBmaWVsZCBvbmx5IG1hcHBpbmdzIG9yIGF0dHJpYnV0ZSBvbmx5IG1hcHBpbmdzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC10cmFuc2Zvcm1hdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhZ2dyZWdhdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcmVsYXRpb25zaGlwIHdoZXJlIHRoZSB0YXJnZXQgb2JqZWN0IGlzIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdCBhbmQgc3RvcmVzIHdpdGhpbiB0aGUgc291cmNlIG9iamVjdHMgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgdGFyZ2V0IGNsYXNzIG9mIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJhbGxvdy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIGEgcm93IG9mIGFsbCBudWxscyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgbnVsbC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpZWxkLXRyYW5zbGF0aW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyBmb3IgdGhlIG1hcHBpbmcgdG8gdXNlIGRpZmZlcmVudCBmaWVsZCBuYW1lcyB0aGFuIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQtdHJhbnNsYXRpb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic291cmNlLWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIHNvdXJjZSBkZXNjcmlwdG9yJ3MgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQgaW4gdGhlIGFnZ3JlZ2F0ZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGhvdyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byBjbGFzc2VzIGlzIHBlcnNpc3RlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSB0YXJnZXQgY2xhc3Mgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJwcml2YXRlLW93bmVkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSB0YXJnZXQgb2JqZWN0cyBhcmUgcHJpdmF0ZWx5IG93bmVkIGRlcGVuZGVudCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtcGVyc2lzdCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgY3JlYXRlIG9wZXJhdGlvbiBzaG91bGQgYmUgY2FzY2FkZWQgdG8gdGhlIHJlZmVyZW5jZWQgb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImNhc2NhZGUtbWVyZ2UiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGNyZWF0ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYXNjYWRlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlZnJlc2ggb3BlcmF0aW9uIHNob3VsZCBiZSBjYXNjYWRlZCB0byB0aGUgcmVmZXJlbmNlZCBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iY2FzY2FkZS1yZW1vdmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHJlbW92ZSBvcGVyYXRpb24gc2hvdWxkIGJlIGNhc2NhZGVkIHRvIHRoZSByZWZlcmVuY2VkIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib25lLXRvLW9uZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtMSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZm9yZWlnbi1rZXktZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1vbmUtdG8tb25lLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS0xIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib25lLXRvLW9uZS1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvbmUtdG8tbWFueS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIDEtbSByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIHRoZSB0YXJnZXQgaW5zdGFuY2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbnNoaXAtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSB0YXJnZXQgY2xhc3MnIHRhYmxlIHRoYXQgZGVmaW5lcyB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmlkaXJlY3Rpb25hbC10YXJnZXQtYXR0cmlidXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkZvciBiaS1kaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIHRoZSB0YXJnZXQgaW52ZXJzZSByZWxhdGlvbnNoaXAgY2FuIGJlIGRlZmluZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJqb2luLWZldGNoIiB0eXBlPSJqb2luLWZldGNoLXR5cGUiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBhbHdheXMgam9pbiB0aGUgcmVsYXRlZCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtb25lLXRvLW1hbnktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS1mb3JlaWduLWtleS1maWVsZHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBzZXQgb2YgZm9yZWlnbiBrZXkgZmllbGRzIHBvcHVsYXRlZCBieSB0aGlzIHJlbGF0aW9uc2hpcCBpbiB0aGUgc291cmNlIGNsYXNzJyB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idGFyZ2V0LWZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmb3JlaWduLWtleS1ncm91cGluZy1lbGVtZW50IiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0icmVhZC1hbGwtcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0aGUgcXVlcnkgdG8gdXNlIHRvIHNlbGVjdCB0aGUgdGFyZ2V0IG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtYWxsLXF1ZXJ5IiB0eXBlPSJkZWxldGUtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcmVsYXRlZCBvYmplY3RzIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29sbGVjdGlvbiBvZiBzaW1wbGUgdHlwZXMgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byBhIHNldCBvZiBzaW1wbGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0iYmF0Y2gtcmVhZGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSB0byBvcHRpbWl6ZSByZWFkcyBmb3IgdGhlIGNsYXNzIGJ5IGJhdGNoaW5nIHRoZSByZWFkcyB0byB0aGlzIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5kaXJlY3Rpb24iIHR5cGU9ImluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW5kaXJlY3Rpb24gcG9saWN5IHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNlbGVjdGlvbi1xdWVyeSIgdHlwZT0iZGF0YS1yZWFkLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBkYXRhIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2UtdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlZmVyZW5jZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgc291cmNlIHByaW1hcnkga2V5IGFuZCB0aGUgZGF0YSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWZpZWxkIiB0eXBlPSJmaWVsZCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZmllbGQvY29sdW1uIGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlZmVyZW5jZS1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGluIHRoZSByZWZlcmVuY2UgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBkYXRhIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gdGhlIG9iamVjdCB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVmZXJlbmNlIHRhYmxlIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWxldGUtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGEgcm93IGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYWxsIG9mIHRoZSByb3dzIGZyb20gdGhlIHJlZmVyZW5jZSB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHNlc3Npb24gdGhhdCBkZWZpbmVzIHRoZSByZWZlcmVuY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJoaXN0b3J5LXBvbGljeSIgdHlwZT0iaGlzdG9yeS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgcGFzdCB2ZXJzaW9ucyBvZiB0aGlzIGF0dHJpYnV0ZSBhcmUgcGVyc2lzdGVkIHRvIHRoZSBkYXRhLXN0b3JlLiAgQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGhpc3RvcnkgcG9saWN5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LW1hcC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCByZWxhdGlvbnNoaXAgZnJvbSB0aGUgc291cmNlIGluc3RhbmNlIHRvIGEgc2V0IG9mIGtleSB2YWx1ZXMgcGFpcnMgb2Ygc2ltcGxlIGRhdGEgdmFsdWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGlyZWN0LWtleS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZpZWxkL2NvbHVtbiBpbiB0aGUgcmVmZXJlbmNlIHRhYmxlIHRoYXQgc29yZXMgdGhlIG1hcCBrZXkgZGF0YSB2YWx1ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtleS1jb252ZXJ0ZXIiIHR5cGU9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbGx5IHNwZWNpZnkgaG93IHRoZSBrZXkgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFnZ3JlZ2F0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgMS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMgd2hlcmUgdGhlIHRhcmdldCBpbnN0YW5jZXMgYXJlIHN0cmljdGx5IHByaXZhdGVseSBvd25lZCBieSB0aGUgc291cmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBpbiB0aGUgdGFyZ2V0IGNsYXNzJyB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXIiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluZGlyZWN0aW9uIiB0eXBlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGluZGlyZWN0aW9uIHBvbGljeSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzZWxlY3Rpb24tcXVlcnkiIHR5cGU9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIHF1ZXJ5IHRvIHVzZSB0byBzZWxlY3QgdGhlIHRhcmdldCBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSIgdHlwZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BIHF1ZXJ5IHRvIGRlbGV0ZSBhbGwgb2YgdGhlIHJlbGF0ZWQgb2JqZWN0cyBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0ibm9uZSIgbmFtZT0iam9pbi1mZXRjaCIgdHlwZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gYWx3YXlzIGpvaW4gdGhlIHJlbGF0ZWQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibWFueS10by1tYW55LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbS1tIHJlbGF0aW9uc2hpcCBmcm9tIHRoZSBzb3VyY2UgaW5zdGFuY2UgdG8gdGhlIHRhcmdldCBpbnN0YW5jZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVsYXRpb24tdGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlbGF0aW9uIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBzb3VyY2UvdGFyZ2V0IHByaW1hcnkga2V5cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtcmVsYXRpb24tZm9yZWlnbi1rZXkiIHR5cGU9ImZvcmVpZ24ta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmb3JlaWduIGtleSBmcm9tIHRoZSByZWxhdGlvbmFsIHRhYmxlIHRvIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhcmdldC1yZWxhdGlvbi1mb3JlaWduLWtleSIgdHlwZT0iZm9yZWlnbi1rZXkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZyb20gdGhlIHJlbGF0aW9uYWwgdGFibGUgdG8gdGhlIHRhcmdldCBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaWRpcmVjdGlvbmFsLXRhcmdldC1hdHRyaWJ1dGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGJpLWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcHMgdGhlIHRhcmdldCBpbnZlcnNlIHJlbGF0aW9uc2hpcCBjYW4gYmUgZGVmaW5lZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJiYXRjaC1yZWFkaW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIG9wdGltaXplIHJlYWRzIGZvciB0aGUgY2xhc3MgYnkgYmF0Y2hpbmcgdGhlIHJlYWRzIHRvIHRoaXMgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imluc2VydC1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBpbnNlcnQgYSByb3cgaW50byB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1xdWVyeSIgdHlwZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+QSBxdWVyeSB0byBkZWxldGUgYSByb3cgZnJvbSB0aGUgcmVsYXRpb24gdGFibGUgY2FuIGJlIHNwZWNpZmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlbGV0ZS1hbGwtcXVlcnkiIHR5cGU9ImRhdGEtbW9kaWZ5LXF1ZXJ5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgcXVlcnkgdG8gZGVsZXRlIGFsbCBvZiB0aGUgcm93cyBmcm9tIHRoZSByZWxhdGlvbiB0YWJsZSBjYW4gYmUgc3BlY2lmaWVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaGlzdG9yeS1wb2xpY3kiIHR5cGU9Imhpc3RvcnktcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgaG93IHBhc3QgdmVyc2lvbnMgb2YgdGhpcyBhdHRyaWJ1dGUgYXJlIHBlcnNpc3RlZCB0byB0aGUgZGF0YS1zdG9yZS4gIEJ5IGRlZmF1bHQgdGhlcmUgd2lsbCBiZSBubyBoaXN0b3J5IHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImpvaW4tZmV0Y2giIHR5cGU9ImpvaW4tZmV0Y2gtdHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRvIGFsd2F5cyBqb2luIHRoZSByZWxhdGVkIG9iamVjdHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InZhcmlhYmxlLW9uZS10by1vbmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBpbnN0YW5jZSB0byB0aGUgdGFyZ2V0IGluc3RhbmNlIHRoYXQgbWF5IGJlIG9mIHNldmVyYWwgdHlwZXMgcmVsYXRlZCB0aHJvdWdoIGFuIGludGVyZmFjZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icmVsYXRpb25zaGlwLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImJpZGlyZWN0aW9uYWwtdGFyZ2V0LWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Gb3IgYmktZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyB0aGUgdGFyZ2V0IGludmVyc2UgcmVsYXRpb25zaGlwIGNhbiBiZSBkZWZpbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImJhdGNoLXJlYWRpbmciIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdG8gb3B0aW1pemUgcmVhZHMgZm9yIHRoZSBjbGFzcyBieSBiYXRjaGluZyB0aGUgcmVhZHMgdG8gdGhpcyByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRpcmVjdGlvbiIgdHlwZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBpbmRpcmVjdGlvbiBwb2xpY3kgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2VsZWN0aW9uLXF1ZXJ5IiB0eXBlPSJyZWFkLW9iamVjdC1xdWVyeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBxdWVyeSB0byB1c2UgdG8gc2VsZWN0IHRoZSB0YXJnZXQgb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgdGhlIGNvbHVtbiB0byBzdG9yZSB0aGUgY2xhc3MgdHlwZSBvZiB0aGUgcmVsYXRlZCBvYmplY3QgaW50by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZvcmVpZ24ta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGZvcmVpZ24ga2V5IGZpZWxkcyBwb3B1bGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAgaW4gdGhlIHNvdXJjZSBjbGFzcycgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNldCBvZiBmb3JlaWduIGtleSBmaWVsZHMgcG9wdWxhdGVkIGJ5IHRoaXMgcmVsYXRpb25zaGlwIGluIHRoZSBzb3VyY2UgY2xhc3MnIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZm9yZWlnbi1rZXktdG8tcXVlcnkta2V5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgY29sdW1uL3F1ZXJ5IGtleSByZWZlcmVuY2VzIHJlbGF0aW5nIGEgZm9yZWlnbiBrZXkgaW4gb25lIHRhYmxlIHRvIHRoZSBxdWVyeSBrZXlzIGRlZmluaW5nIGEgcHJpbWFyeSBvciB1bmlxdWUga2V5IHZhbHVlIGluIHRoZSBvdGhlciBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJxdWVyeS1rZXktcmVmZXJlbmNlIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IGludGVyZmFjZSBkZXNjcmlwdG9yIHF1ZXJ5IGtleS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNvdXJjZS1maWVsZCIgdHlwZT0iZmllbGQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZvcmVpZ24ga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSBzb3VyY2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFyZ2V0LXF1ZXJ5LWtleSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkga2V5IG5hbWUgb2YgdGhlIHRhcmdldCBpbnRlcmZhY2UgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjbGFzcy1pbmRpY2F0b3ItbWFwcGluZ3MiIHR5cGU9ImNsYXNzLWluZGljYXRvci1tYXBwaW5ncyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2V0IG9mIGNsYXNzIGluZGljYXRvciB2YWx1ZXMgYW5kIHRoZSBzdWJjbGFzc2VzIHRoZXkgbWFwIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbnRhaW5lci9jb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb2xsZWN0aW9uLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNvcnRlZC1jb2xsZWN0aW9uLWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc29ydGVkIGNvbGxlY3Rpb24gdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGFyYXRvci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb21wYXJpdG9yLCB1c2VkIHRvIGNvbXBhcmUgb2JqZWN0cyBpbiBzb3J0aW5nIHRoZSBjb2xsZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsaXN0LWNvbnRhaW5lci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbGlzdCBjb2xsZWN0aW9uIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcC1jb250YWluZXItcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcCBjb250YWluZXIgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWFwLWtleS1tZXRob2QiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtZXRob2QgdG8gY2FsbCBvbiB0aGUgdGFyZ2V0IG9iamVjdHMgdG8gZ2V0IHRoZSBrZXkgdmFsdWUgZm9yIHRoZSBtYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRpcmVjdC1tYXAtY29udGFpbmVyLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY3JvbGxhYmxlLWN1cnNvci1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc2Nyb2xsYWJsZSBjdXJzb3IgY29udGFpbmVyIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImN1cnNvcmVkLXN0cmVhbS1wb2xpY3kiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY3Vyc29yZWQgc3RyZWFtIGNvbnRhaW5lciB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRpcmVjdGlvbi1wb2xpY3kiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGRlZmVycmVkIHJlYWQgaW5kaXJlY3Rpb24gbWVjaGFuaXNtLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idmFsdWUtaG9sZGVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdmFsdWUgaG9sZGVycyB0byBpbXBsZW1lbnQgaW5kaXJlY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImluZGlyZWN0aW9uLXBvbGljeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJveHktaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB1c2FnZSBvZiBwcm94aWVzIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0cmFuc3BhcmVudC1jb2xsZWN0aW9uLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgdHJhbnNwYXJlbnQgY29sbGVjdGlvbnMgdG8gaW1wbGVtZW50IGluZGlyZWN0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJpbmRpcmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbGxlY3Rpb24tdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGludGVyZmFjZSB0byB1c2UsIGkuZS4gTGlzdCwgU2V0LCBNYXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJtYXAta2V5LW1ldGhvZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1ldGhvZCB0byBjYWxsIG9uIHRoZSB0YXJnZXQgb2JqZWN0cyB0byBnZXQgdGhlIGtleSB2YWx1ZSBmb3IgdGhlIG1hcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29udGFpbmVyLWluZGlyZWN0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdXNhZ2Ugb2YgYSB1c2VyIGRlZmluZWQgY29udGFpbmVyIHRvIGltcGxlbWVudCBpbmRpcmVjdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iaW5kaXJlY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY29udGFpbmVyIGltcGxlbWVudGVyIHRvIHVzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxpc3QtY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+TGlzdCBjb252ZXJ0ZXI8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvYmplY3QtY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBsaXN0J3MgZWxlbWVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPiAKLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZXNhZmUtZW51bWVyYXRpb24tY29udmVydGVyIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VHlwZXNhZmUgRW51bWVyYXRpb24gY29udmVyc2lvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ2YWx1ZS1jb252ZXJ0ZXIiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InR5cGUtY29udmVyc2lvbi1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGRhdGEgdHlwZSBhbmQgYW4gb2JqZWN0IHR5cGUgb2YgdGhlIGF0dHJpYnV0ZSB0byBjb252ZXJ0IGJldHdlZW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib2JqZWN0LWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIHRoZSBhdHRyaWJ1dGVzIHN0b3JhZ2UgZGF0YSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJpYWxpemVkLW9iamVjdC1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2VzIG9iamVjdCBzZXJpYWxpemF0aW9uIHRvIGNvbnZlcnQgYmV0d2VlbiB0aGUgb2JqZWN0IGFuZCBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InZhbHVlLWNvbnZlcnRlciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZGF0YS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZXMgc3RvcmFnZSBkYXRhIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9iamVjdC10eXBlLWNvbnZlcnRlciI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgdmFsdWVzIGZyb20gZGF0YWJhc2UgdmFsdWVzIHVzZWQgaW4gdGhlIGZpZWxkIGFuZCBvYmplY3QgdmFsdWVzIHVzZWQgaW4gdGhlIGF0dHJpYnV0ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idmFsdWUtY29udmVydGVyIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJkZWZhdWx0LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbiBvcHRpb25hbCBkZWZhdWx0IHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzIHZhbHVlIGlzIHVzZWQgaWYgYSBkYXRhYmFzZSB0eXBlIGlzIG5vdCBmb3VuZCBpbiB0aGUgdHlwZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InR5cGUtbWFwcGluZ3MiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHRoZSBtYXBwaW5nIG9mIHZhbHVlcy4gIEJvdGggdGhlIG9iamVjdCBhbmQgZGF0YWJhc2UgdmFsdWVzIG11c3QgYmUgdW5pcXVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InR5cGUtbWFwcGluZyIgdHlwZT0idHlwZS1tYXBwaW5nIj4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhdHRyaWJ1dGUtb25seS10eXBlLW1hcHBpbmdzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyBhIG1hcHBpbmcgb2YgYWRkaXRpb25hbCB2YWx1ZXMgdGhhdCBtYXAgbm9uLXVuaXF1ZSBkYXRhIHZhbHVlcyB0byBhIHVuaXF1ZSBhdHRyaWJ1dGUgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0idHlwZS1tYXBwaW5nIiB0eXBlPSJ0eXBlLW1hcHBpbmciPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgb2JqZWN0IGFuZCBkYXRhIHZhbHVlIG1hcHBpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHlwZS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIGFuIG9iamVjdCBhbmQgZGF0YSB2YWx1ZSBtYXBwaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im9iamVjdC12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBvYmplY3QncyBhdHRyaWJ1dGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YS12YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZmllcyB0aGUgdmFsdWUgdG8gdXNlIGluIHRoZSBkYXRhYmFzZSBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5L2ludGVyYWN0aW9uIGFnYWluc3QgYSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9Im1haW50YWluLWNhY2hlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBieXBhc3MgdGhlIGNhY2hlIGNvbXBsZXRlbHkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCB1c2UgcGFyYW1hdGVyIGJpbmRpbmcgZm9yIGFyZ3VtZW50cywgb3IgcHJpbnQgdGhlIGFyZ3VtZW50cyBpbi1saW5lLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FjaGUtc3RhdGVtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJpZXMgc3RhdGVtZW50IHNob3VsZCBiZSBjYWNoZWQsIHRoaXMgbXVzdCBiZSB1c2VkIHdpdGggcGFyYW1ldGVyIGJpbmRpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0aW1lb3V0IiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgYSB0aW1lb3V0IHRvIGNhbmNlbCB0aGUgcXVlcnkgaW4gaWYgdGhlIHJlcXVlc3QgdGFrZXMgdG9vIGxvbmcgdG8gY29tcGxldGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJ0cnVlIiBuYW1lPSJwcmVwYXJlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBwcmVwYXJlIGFuZCBjYWNoZSBpdHMgZ2VuZXJhdGVkIFNRTCwgb3IgcmVnZW5lcmF0ZSB0aGUgU1FMIG9uIGVhY2ggZXhlY3V0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY2FsbCIgdHlwZT0iY3JpdGVyaWEiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIHN0YXRpYyBjYWxscyB0aGUgU1FMIG9yIFN0b3JlZCBQcm9jZWR1cmUgY2FsbCBkZWZpbml0aW9uIGNhbiBiZSBzcGVjaWZpZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iam9pbi1mZXRjaC10eXBlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGpvaW4gZmV0Y2ggb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Im5vbmUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJpbm5lci1qb2luIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib3V0ZXItam9pbiIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImNhc2NhZGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgc2V0IG9mIHZhbGlkIGNhc2NhZGUgcG9saWNpZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0icHJpdmF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1yZWFkLXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciByZWFkaW5nIGEgc2luZ2xlIHZhbHVlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtcmVhZC1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGlyZWN0LXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YS1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkYXRhLXJlYWQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIHJlYWRpbmcgcmF3IGRhdGEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLXF1ZXJ5IiBhYnN0cmFjdD0idHJ1ZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgcmVhZGluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJjYWNoZS1xdWVyeS1yZXN1bHRzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHF1ZXJ5IHNob3VsZCBjYWNoZSB0aGUgcXVlcnkgcmVzdWx0cyB0byBhdm9pZCBmdXR1cmUgZXhlY3V0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1heC1yb3dzIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2gsIHJlc3VsdHMgd2lsbCBiZSB0cnVuY3RhdGUgb24gdGhlIGRhdGFiYXNlIHRvIHRoaXMgc2l6ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZpcnN0LXJlc3VsdCIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIHdoZXJlIHRvIHN0YXJ0IHRoZSBjdXJzb3IgaW4gYSByZXN1bHQgc2V0IHJldHVybmVkIGZyb20gdGhlIGRhdGFiYXNlLiBSZXN1bHRzIHByaW9yIHRvIHRoaXMgbnVtYmVyIHdpbGwgbm90IGJlIGJ1aWx0IGludG8gb2JqZWN0czwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmV0Y2gtc2l6ZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzcyB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZmV0Y2ggZnJvbSB0aGUgZGF0YWJhc2Ugb24gZWFjaCByZXN1bHQgc2V0IG5leHQgb3BlcmF0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSIgdHlwZT0icXVlcnktcmVzdWx0LWNhY2hlLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyB0aGUgcXVlcnkgcmVzdWx0cyBzaG91bGQgYmUgY2FjaGVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1yZXN1bHQtY2FjaGUtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBob3cgYSBxdWVyeSdzIHJlc3VsdHMgc2hvdWxkIGJlIGNhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImludmFsaWRhdGlvbi1wb2xpY3kiIHR5cGU9ImNhY2hlLWludmFsaWRhdGlvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY2FjaGUgaW52YWxpZGF0aW9uIHBvbGljeS4gQnkgZGVmYXVsdCB0aGVyZSB3aWxsIGJlIG5vIGNhY2hlIGludmFsaWRhdGlvbiBwb2xpY3kuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSIxMDAiIG5hbWU9Im1heGltdW0tY2FjaGVkLXJlc3VsdHMiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGlzIGRlZmluZXMgdGhlIG51bWJlciBvZiBxdWVyeSByZXN1bHQgc2V0cyB0aGF0IHdpbGwgYmUgY2FjaGVkLiBUaGUgTFJVIHF1ZXJ5IHJlc3VsdHMgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGUgbWF4IHNpemUgaXMgcmVhY2hlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YS1tb2RpZnktcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1hbmlwdWxhdGluZyBkYXRhLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIG1vZGlmeWluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRhdGFiYXNlLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1cGRhdGUtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciB1cGRhdGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imluc2VydC1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGluc2VydGluZyBhbiBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1tb2RpZnktcXVlcnkiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlbGV0ZS1vYmplY3QtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgZm9yIGRlbGV0aW5nIGFuIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LW1vZGlmeS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9lcy1leGlzdC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGV4aXN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2UtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayIgdHlwZT0iZXhpc3RlbmNlLWNoZWNrIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBleGlzdGVuY2UgY2hlY2sgb3B0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImV4aXN0ZW5jZS1jaGVjayI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIHNldCBvZiB2YWxpZCBleGlzdGVuY2UgY2hlY2sgb3B0aW9ucy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNoZWNrLWNhY2hlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY2hlY2stZGF0YWJhc2UiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhc3N1bWUtZXhpc3RlbmNlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYXNzdW1lLW5vbi1leGlzdGVuY2UiIC8+Ci0gICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGVsZXRlLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgZGVsZXRpbmcgYSBjcml0ZXJpYSBvZiBvYmplY3RzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1xdWVyeSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBvYmplY3RzIChhcyBhcHBvc2VkIHRvIGRhdGEpLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWFkLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZWZlcmVuY2UtY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGZ1bGwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzIG9mIG9iamVjdHMgYmVpbmcgcXVlcmllZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJyZWZyZXNoIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBxdWVyeSBzaG91bGQgcmVmcmVzaCBhbnkgY2FjaGVkIG9iamVjdHMgZnJvbSB0aGUgZGF0YWJhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVtb3RlLXJlZnJlc2giIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCByZWZyZXNoIGFueSByZW1vdGVseSBjYWNoZWQgb2JqZWN0cyBmcm9tIHRoZSBzZXJ2ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJjYXNjYWRlLXBvbGljeSIgdHlwZT0iY2FzY2FkZS1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGlmIHRoZSBxdWVyaWVzIHNldHRpbmdzIChzdWNoIGFzIHJlZnJlc2gsIG1haW50YWluLWNhY2hlKSBzaG91bGQgYXBwbHkgdG8gdGhlIG9iamVjdCdzIHJlbGF0aW9uc2hpcCBxdWVyaWVzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0icHJpbWFyeS1rZXkiIG5hbWU9ImNhY2hlLXVzYWdlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaG93IHRoZSBxdWVyeSBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGUgY2FjaGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJub25lIiBuYW1lPSJsb2NrLW1vZGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiB0aGUgcXVlcnkgc2hvdWxkIGxvY2sgdGhlIHJlc3VsdGluZyByb3dzIG9uIHRoZSBkYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9Im5vbmUiIG5hbWU9ImRpc3RpbmN0LXN0YXRlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIHF1ZXJ5IHNob3VsZCBmaWx0ZXIgZGlzdGluY3QgcmVzdWx0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImluLW1lbW9yeS1xdWVyeWluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW4gbWVtb3J5IHF1ZXJ5aW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IGRlZmF1bHQ9Imlnbm9yZS1leGNlcHRpb25zLXJldHVybi1jb25mb3JtZWQiIG5hbWU9InBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGhvdyBpbmRpcmVjdGlvbiBvciB1bmNvbmZvcm1hYmxlIGV4cHJlc3Npb25zIHNob3VsZCBiZSB0cmVhdGluZyB3aXRoIGluLW1lbW9yeSBxdWVyeWluZyBhbmQgY29uZm9ybWluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0idHJ1ZSIgbmFtZT0idXNlLWRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgaWYgdGhlIGRlZmF1bHQgZmV0Y2ggZ3JvdXAgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5BbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmZXRjaC1ncm91cC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNwZWNpZnkgYSBwcmUtZGVmaW5lZCBuYW1lZCBmZXRjaCBncm91cCB0byBhbGxvdyB0aGUgcXVlcnkgdG8gcGFydGlhbGx5IGZldGNoIHRoZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0idXNlLWV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IGlmIHRoZSBleGNsdXNpdmUgY29ubmVjdGlvbiAoVlBEKSBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iam9pbmVkLWF0dHJpYnV0ZS1leHByZXNzaW9ucyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZpZXMgdGhlIGF0dHJpYnV0ZXMgYmVpbmcgam9pbmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGpvaW5pbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9InJlYWQtb25seSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmeSBpZiBvYmplY3RzIHJlc3VsdGluZyBmcm9tIHRoZSBxdWVyeSBhcmUgcmVhZC1vbmx5LCBhbmQgd2lsbCBub3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUgdW5pdCBvZiB3b3JrLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9Im91dGVyLWpvaW4tc3ViY2xhc3NlcyIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Rm9yIGluaGVyaXRhbmNlIHF1ZXJpZXMgc3BlY2lmeSBpZiBhbGwgc3ViY2xhc3NlcyBzaG91bGQgYmUgb3V0ZXIgam9pbmVkLCBpbnN0ZWFkIG9mIGEgcXVlcnkgcGVyIHN1YmNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWFsbC1xdWVyeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBmb3IgYSBzZXQgb2Ygb2JqZWN0cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ib2JqZWN0LWxldmVsLXJlYWQtcXVlcnkiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYmF0Y2gtcmVhZC1hdHRyaWJ1dGUtZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U3BlY2lmaWVzIGFsbCBhdHRyaWJ1dGVzIGZvciBiYXRjaCByZWFkaW5nLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGV4cHJlc3Npb24gZm9yIGJhdGNoIHJlYWRpbmc8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3JkZXItYnktZXhwcmVzc2lvbnMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2V0cyB0aGUgb3JkZXIgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBvcmRlcmluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlYWQtb2JqZWN0LXF1ZXJ5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZvciBhIHNpbmdsZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im9iamVjdC1sZXZlbC1yZWFkLXF1ZXJ5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtcXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5RdWVyeSBmb3IgaW5mb3JtYXRpb24gYWJvdXQgYSBzZXQgb2Ygb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlYWQtYWxsLXF1ZXJ5Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXR1cm4tY2hvaWNlIiB0eXBlPSJyZXR1cm4tY2hvaWNlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXRyaWV2ZS1wcmltYXJ5LWtleXMiIHR5cGU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgd2V0aGVyIHRoZSBwcmltYXJ5IGtleSB2YWx1ZXMgc2hvdWxkIGFsc28gYmUgcmV0cmlldmVkIGZvciB0aGUgcmVmZXJlbmNlIGNsYXNzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVwb3J0LWl0ZW1zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkl0ZW1zIHRvIGJlIHNlbGVjdGVkLCB0aGVzZSBjb3VsZCBiZSBhdHRyaWJ1dGVzIG9yIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpdGVtIiB0eXBlPSJyZXBvcnQtaXRlbSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZXByZXNlbnRzIGFuIGl0ZW0gcmVxdWVzdGVkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Imdyb3VwLWJ5LWV4cHJlc3Npb25zIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNldHMgR1JPVVAgQlkgZXhwcmVzc2lvbnMgZm9yIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImV4cHJlc3Npb24iIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+UmVwcmVzZW50cyBhbiBleHByZXNzaW9uIGZvciBncm91cGluZzwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icmV0dXJuLWNob2ljZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNpbXBsaWZpZXMgdGhlIHJlc3VsdCBieSBvbmx5IHJldHVybmluZyB0aGUgZmlyc3QgcmVzdWx0LCBmaXJzdCB2YWx1ZSwgb3IgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLXJlc3VsdCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InJldHVybi1zaW5nbGUtdmFsdWUiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJyZXR1cm4tc2luZ2xlLWF0dHJpYnV0ZSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InJldHJpZXZlLXByaW1hcnkta2V5cyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB3ZXRoZXIgdGhlIHByaW1hcnkga2V5IHZhbHVlcyBzaG91bGQgYWxzbyBiZSByZXRyaWV2ZWQgZm9yIHRoZSByZWZlcmVuY2UgY2xhc3MuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmdWxsLXByaW1hcnkta2V5IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmlyc3QtcHJpbWFyeS1rZXkiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJuby1wcmltYXJ5LWtleSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZXBvcnQtaXRlbSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlJlcHJlc2VudHMgYW4gaXRlbSByZXF1ZXN0ZWQgaW4gUmVwb3J0UXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+TmFtZSBnaXZlbiBmb3IgaXRlbSwgY2FuIGJlIHVzZWQgdG8gcmV0aWV2ZSB2YWx1ZSBmcm9tIHJlc3VsdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXhwcmVzc2lvbiIgdHlwZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RXhwcmVzc2lvbiAocGFydGlhbCkgdGhhdCBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZSB3YW50ZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImV4cHJlc3Npb24iIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHF1ZXJ5IGZpbHRlciBleHByZXNzaW9uIHRyZWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGlvbi1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHJlbGF0aW9uIGV4cHJlc3Npb24gdGhhdCBjb21wYXJlcyB0byBleHByZXNzaW9ucyB0aHJvdWdoIG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFsLCBsZXNzVGhhbiwgZXRjLi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxlZnQiIHR5cGU9ImV4cHJlc3Npb24iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJpZ2h0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ib3BlcmF0b3IiIHR5cGU9Im9wZXJhdG9yIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dpYy1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdHdvIHN1Yi1leHByZXNzaW9ucyBqb2luZWQgdGhyb3VnaCBhbiBvcGVyYXRvciBzdWNoIGFzIEFORCwgT1IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsZWZ0IiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyaWdodCIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im9wZXJhdG9yIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZnVuY3Rpb24tZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBleHByZXNzaW9uIGNvbXBvc2VkIG9mIGEgZnVuY3Rpb24gYXBwbGllZCB0byBhIGxpc3Qgb2Ygc3ViLWV4cHJlc3Npb25zLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgZnVuY3Rpb24gYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImV4cHJlc3Npb24iPgotICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBhcmd1bWVudCBleHByZXNzaW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZ1bmN0aW9uIiB0eXBlPSJvcGVyYXRvciIgLz4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29uc3RhbnQtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiB2YWx1ZS4gIElmIHRoZSB2YWx1ZSBpcyBudWxsIHRoZSB2YWx1ZSB0YWcgY2FuIGlzIGFic2VudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZXhwcmVzc2lvbiI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUiIHR5cGU9InhzZDphbnlTaW1wbGVUeXBlIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkta2V5LWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcXVlcnkta2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmFzZSIgdHlwZT0iZXhwcmVzc2lvbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFueS1vZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im91dGVyLWpvaW4iIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZC1leHByZXNzaW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBleHByZXNzaW9uIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXNlIiB0eXBlPSJleHByZXNzaW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGFyYW1ldGVyLWV4cHJlc3Npb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGV4cHJlc3Npb24gcGFyYW1ldGVyLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJleHByZXNzaW9uIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFyYW1ldGVyIiB0eXBlPSJmaWVsZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImJhc2UtZXhwcmVzc2lvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gZXhwcmVzc2lvbiBidWlsZGVyL2Jhc2UuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImV4cHJlc3Npb24iIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ib3BlcmF0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBzZXQgb2YgdmFsaWQgb3BlcmF0b3JzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciIC8+Ci0gIDwveHNkOnNpbXBsZVR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3FsLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIFNRTCBxdWVyeSBsYW5ndWFnZSBzdHJpbmcuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3FsIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxsIFNRTCBxdWVyeSBzdHJpbmcuICBBcmd1bWVudHMgY2FuIGJlIHNwZWNpZmllZCB0aHJvdWdoICNhcmctbmFtZSB0b2tlbnMgaW4gdGhlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWpicWwtY2FsbCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUpCLVFMIHF1ZXJ5IGxhbmd1YWdlIHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlamJxbCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgRUpCLVFMIHF1ZXJ5IHN0cmluZy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgaW52b2NhdGlvbiBkZWZpbml0aW9uLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb2NlZHVyZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBzdG9yZWQgcHJvY2VkdXJlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY3Vyc29yLW91dHB1dC1wcm9jZWR1cmUiIHR5cGU9InhzZDpib29sZWFuIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZSB0aGUgY2FsbCB0byB1c2UgYSBjdXJzb3Igb3V0cHV0IHBhcmFtZXRlciB0byBkZWZpbmUgdGhlIHJlc3VsdCBzZXQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYW5kIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gYXJndW1lbnQgdG8gdGhlIHByb2NlZHVyZS4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudHMgbXVzdCBtYXRjaCB0aGUgcHJvY2VkdXJlIGFyZ3VtZW50cyBpZiBub3QgbmFtZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RvcmVkLWZ1bmN0aW9uLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIGZ1bmN0aW9uIGludm9jYXRpb24gZGVmaW5pdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic3RvcmVkLXByb2NlZHVyZS1jYWxsIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIxIiBuYW1lPSJzdG9yZWQtZnVuY3Rpb24tcmVzdWx0IiB0eXBlPSJwcm9jZWR1cmUtb3V0cHV0LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN0b3JlZC1mdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIHN0b3JlZCBwcm9jZWR1cmUgY2FsbCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc3RvcmVkIHByb2NlZHVyZSBuYW1lIG9mIHRoZSBhcmd1bWVudC4gRm9yIGluZGV4ZWQgYXJndW1lbnQgdGhlIG5hbWUgaXMgbm90IHJlcXVpcmVkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iYXJndW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXJndW1lbnQgY2xhc3MgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InByb2NlZHVyZS1hcmd1bWVudC1zcWx0eXBlIiB0eXBlPSJ4c2Q6aW50Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgSkRCQyBpbnQgdHlwZSBvZiB0aGUgYXJndW1lbnQsIGFzIGRlZmluZWQgaW4gamF2YS5qZGJjLlR5cGVzPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgdHlwZSBpZiBwcm9jZWR1cmUtYXJndW1lbnQtc3FsdHlwZSBpcyBTVFJVQ1Qgb3IgQVJSQVk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InByb2NlZHVyZS1vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9jZWR1cmUtaW5vdXRwdXQtYXJndW1lbnQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBjYWxsIG91dHB1dCBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icHJvY2VkdXJlLWFyZ3VtZW50Ij4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3V0cHV0LWFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW50LiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBhcyBkZWZpbmUgaW4gdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1zdG9yZWQtcHJvY2VkdXJlLWNhbGwiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgc3RvcmVkIHByb2NlZHVyZSBpbnZvY2F0aW9uIGRlZmluaXRpb24gd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gYXQgbGVhc3Qgb25lIE9yYWNsZSBQTC9TUUwgdHlwZSB0aGF0IGhhcyBubyBKREJDIHJlcHJlc2VudGF0aW9uIChlLmcuIEJPT0xFQU4sIFBMU19JTlRFR0VSLCBQTC9TUUwgcmVjb3JkKS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9jZWR1cmUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgc3RvcmVkIHByb2NlZHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhbmQgb3V0cHV0IGFyZ3VtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImFyZ3VtZW50IiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIGFic3RyYWN0PSJ0cnVlIj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmRleCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRpcmVjdGlvbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamRiYy10eXBlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJsZW5ndGgiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlY2lzaW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2NhbGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InBsc3FsLXR5cGUiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwbHNxbC1yZWNvcmQiPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InBsc3FsLXByb2NlZHVyZS1hcmd1bWVudC10eXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHlwZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbXBhdGlibGUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJqYXZhLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIGZpZWxkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkIiB0eXBlPSJwbHNxbC1wcm9jZWR1cmUtYXJndW1lbnQtdHlwZSI+Ci0gICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIGFyZ3VtZW50IHRvIHRoZSBwcm9jZWR1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGxzcWwtY29sbGVjdGlvbiI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0eXBlLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29tcGF0aWJsZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImphdmEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZSIgdHlwZT0icGxzcWwtcHJvY2VkdXJlLWFyZ3VtZW50LXR5cGUiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNsYXNzIG1hcHBpbmcgdG8gYW4gRUlTIHJlY29yZCBkYXRhIHN0cnVjdHVyZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIHJlY29yZCBzdHJ1Y3R1cmUgbmFtZSB0aGUgZGVzY3JpcHRvciBtYXBzIHRvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZXNwYWNlLXJlc29sdmVyIiB0eXBlPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWVzcGFjZSByZXNvbHZlciBmb3IgdGhlIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im1hcHBlZC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBNYXBwZWRSZWNvcmQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNyaXRlcmlhIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yZXN1bHQtcGF0aCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgaW5wdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIG91dHB1dCByZXN1bHQgaXMgbm90IGF0IHRoZSByZWNvcmQgcm9vdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1pbnRlcmFjdGlvbiI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYW4gRUlTIGludGVyYWN0aW9uIHV0aWxpemluZyBYTUwgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LXJlY29yZC1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIHRvIHVzZSBmb3IgdGhlIGlucHV0IHJlY29yZCwgaWYgcmVxdWlyZWQgYnkgdGhlIGFkYXB0ZXIuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1yb290LWVsZW1lbnQtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5PcHRpb25hbCByb290IGtleSBpZiB0aGUgb3V0cHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5wdXQtcmVzdWx0LXBhdGgiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWwgcm9vdCBrZXkgaWYgdGhlIGlucHV0IHJlc3VsdCBpcyBub3QgYXQgdGhlIHJlY29yZCByb290LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LXJlc3VsdC1wYXRoIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIHJvb3Qga2V5IGlmIHRoZSBvdXRwdXQgcmVzdWx0IGlzIG5vdCBhdCB0aGUgcmVjb3JkIHJvb3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbnB1dC1hcmd1bWVudHMiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIGxpc3Qgb2YgaW5wdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ib3V0cHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBvdXRwdXQgYXJndW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9ImludGVyYWN0aW9uLWFyZ3VtZW50IiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpbmRleGVkLWludGVyYWN0aW9uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBFSVMgaW50ZXJhY3Rpb24gdXRpbGl6aW5nIEluZGV4ZWQgcmVjb3Jkcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY3JpdGVyaWEiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmdW5jdGlvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlucHV0LWFyZ3VtZW50cyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbGlzdCBvZiBpbnB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJvdXRwdXQtYXJndW1lbnRzIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIG91dHB1dCBhcmd1bWVudHMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJhcmd1bWVudCIgdHlwZT0iaW50ZXJhY3Rpb24tYXJndW1lbnQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImludGVyYWN0aW9uLWFyZ3VtZW50Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBpbnRlcmFjdGlvbiBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImFyZ3VtZW50LXZhbHVlIiB0eXBlPSJ4c2Q6YW55U2ltcGxlVHlwZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHByb2NlZHVyZSBhcmd1bWVudCB2YWx1ZSBtYXliZSBiZSBzcGVjaWZpZWQgaWYgbm90IHVzaW5nIGEgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgaW50ZXJhY3Rpb24gbmFtZSBvZiB0aGUgYXJndW1lbnQuIEZvciBpbmRleGVkIGFyZ3VtZW50cyB0aGUgbmFtZSBpcyBub3QgcmVxdWlyZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImFyZ3VtZW50LW5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHF1ZXJ5IG5hbWUgb2YgdGhlIGFyZ3VtZW4uIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGFyZ3VtZW50IGFzIGRlZmluZSBpbiB0aGUgcXVlcnksIG9yIHRoZSBkZXNjcmlwdG9yIGZpZWxkIG5hbWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtcmVsYXRpb25hbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhIFN0cnVjdHVyZSB0eXBlIGluIGFuIG9iamVjdC1yZWxhdGlvbmFsIGRhdGFiYXNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJyZWxhdGlvbmFsLWNsYXNzLW1hcHBpbmctZGVzY3JpcHRvciI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic3RydWN0dXJlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBvYmplY3Qgc3RydWN0dXJlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZC1vcmRlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgb3JkZXJlZCBsaXN0IG9mIHRoZSBmaWVsZCBkZWZpbmVkIGluIHRoZSBzdHJ1Y3R1cmUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuZXN0ZWQtdGFibGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLW0vbS1tIHJlbGF0aW9uc2hpcCB0aGF0IG1ha2VzIHVzZSBvZiB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgbmVzdGVkLXRhYmxlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZC9jb2x1bW4gaW4gdGhlIHNvdXJjZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgbmVzdGVkLXRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIG5lc3RlZC10YWJsZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcnJheS1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgcHJpbWl0aXZlL3NpbXBsZSB0eXBlIHZhbHVlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtYXJyYXktbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG9iamVjdC10eXBlcyB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgYXJyYXkgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdHVyZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TcGVjaWZ5IHRoZSBvYmplY3QtcmVsYXRpb25hbCB0eXBlIG5hbWUgb2YgdGhlIHN0cnVjdHVyZSB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdHJ1Y3R1cmUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBzdHJ1Y3R1cmUgb2Ygb2JqZWN0LXR5cGVzIHVzaW5nIHRoZSBvYmplY3QtcmVsYXRpb25hbCBzdHJ1Y3R1cmUgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSByZWZlcmVuY2UgdG8gYW5vdGhlciBvYmplY3QtdHlwZSB1c2luZyB0aGUgb2JqZWN0LXJlbGF0aW9uYWwgcmVmZXJlbmNlIHR5cGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJlbGF0aW9uc2hpcC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmaWVsZCBpbiB0aGUgc291cmNlIHR5cGUgdGhhdCBzdG9yZXMgdGhlIHJlZmVyZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2JqZWN0LXJlbGF0aW9uYWwtZmllbGQiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGFuIE9iamVjdFJlbGF0aW9uYWxEYXRhYmFzZUZpZWxkPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuZXN0ZWQtdHlwZS1maWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkaXJlY3QteG1sLXR5cGUtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgbWFwcGluZyB0byBhbiBPcmFjbGUgWERCIFhNTCBUeXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVhZC13aG9sZS1kb2N1bWVudCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhYnN0cmFjdC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYXR0cmlidXRlLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idmFsdWUtY29udmVydGVyIiB0eXBlPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBvYmplY3QgdmFsdWUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+T3B0aW9uYWxseSBzcGVjaWZ5IGEgdXNlciBkZWZpbmVkIGNvbnZlcnRlciBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjb2xsZWN0aW9uIHR5cGUgdG8gdXNlIGZvciB0aGUgcmVsYXRpb25zaGlwLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtY29sbGVjdGlvbi1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLU0gcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIGEga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtb2JqZWN0LXJlZmVyZW5jZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJjb250YWluZXJwb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgY29sbGVjdGlvbiB0eXBlIHRvIHVzZSBmb3IgdGhlIHJlbGF0aW9uc2hpcC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VzLXNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLW9iamVjdC1yZWZlcmVuY2UtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSAxLTEgcmVsYXRpb25zaGlwIGZyb20gdGhlIHNvdXJjZSBYTUwgZWxlbWVudCB0byB0aGUgdGFyZ2V0IFhNTCBlbGVtZW50IGJhc2VkIG9uIG9uZSBvciBtb3JlIGtleXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFnZ3JlZ2F0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic291cmNlLXRvLXRhcmdldC1rZXktZmllbGQtYXNzb2NpYXRpb24iIHR5cGU9ImZvcmVpZ24ta2V5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNvdXJjZS10by10YXJnZXQta2V5LWZpZWxkcyI+Ci0gICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLWNkYXRhIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJudWxsLXBvbGljeSIgdHlwZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtZGlyZWN0LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBkaXJlY3QgY29sbGVjdGlvbiBtYXBwaW5nIGZvciBhbiBYTUwgbGlzdCBvZiBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LWNvbXBvc2l0ZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIGNvbGxlY3Rpb24gbWFwcGluZyBmb3IgYW4gWE1MIGxpc3Qgb2YgbmVzdGVkIGVsZW1lbnRzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5Ij4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgdGhlIGNvbGxlY3Rpb24gdHlwZSB0byB1c2UgZm9yIHRoZSByZWxhdGlvbnNoaXAuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1hdHRyaWJ1dGUiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb250YWluZXItZ2V0LW1ldGhvZCIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ia2VlcC1hcy1lbGVtZW50LXBvbGljeSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBjb2xsZWN0aW9uIG1hcHBpbmcgZm9yIGFuIFhNTCBsaXN0IG9mIG5lc3RlZCBlbGVtZW50cy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtY29tcG9zaXRlLWNvbGxlY3Rpb24tbWFwcGluZyIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYWJzdHJhY3QtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmVmZXJlbmNlLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWF0dHJpYnV0ZSIgbWluT2NjdXJzPSIwIi8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29udGFpbmVyLWdldC1tZXRob2QiIG1pbk9jY3Vycz0iMCIvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1zZXQtbWV0aG9kIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY29tcG9zaXRlIG9iamVjdCBtYXBwaW5nIGZvciBhbiBYTUwgbmVzdGVkIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImFic3RyYWN0LWNvbXBvc2l0ZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibnVsbC1wb2xpY3kiIHR5cGU9ImFic3RyYWN0LW51bGwtcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJlaXMtY29tcG9zaXRlLW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbXBvc2l0ZSBvYmplY3QgbWFwcGluZyBmb3IgYW4gWE1MIG5lc3RlZCBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtb2JqZWN0LW1hcHBpbmciIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1jbGFzcy1tYXBwaW5nLWRlc2NyaXB0b3IiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgY2xhc3MgbWFwcGluZyB0byBhbiBYTUwgZWxlbWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iY2xhc3MtbWFwcGluZy1kZXNjcmlwdG9yIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iZGVmYXVsdC1yb290LWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhlIGRlc2NyaXB0b3IgbWFwcyB0by48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtcm9vdC1lbGVtZW50LWZpZWxkIiB0eXBlPSJub2RlIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBYTUxGaWVsZCByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgcm9vdCBlbGVtZW50IG9mIHRoZSBkZXNjcmlwdG9yLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ic2hvdWxkLXByZXNlcnZlLWRvY3VtZW50IiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgbm9kZXMgc2hvdWxkIGJlIGNhY2hlZCB0byBwcmVzZXJ2ZSB1bm1hcHBlZCBkYXRhPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiIHR5cGU9Im5hbWVzcGFjZS1yZXNvbHZlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZXNwYWNlIHJlc29sdmVyIGZvciB0aGUgZGVzY3JpcHRvci48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNjaGVtYSIgdHlwZT0ic2NoZW1hLXJlZmVyZW5jZSI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbG9jYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0icmVzdWx0LWFsd2F5cy14bWwtcm9vdCIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhbiB4czphbnkgZGVjbGFyYXRpb24gb3IgeHM6YW55VHlwZSBlbGVtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJmaWVsZCIgdHlwZT0iZmllbGQiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iY29udGFpbmVyIiB0eXBlPSJjb250YWluZXItcG9saWN5IiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1hbnktYXR0cmlidXRlLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYW4geHM6YW55IGRlY2xhcmF0aW9uIG9yIHhzOmFueVR5cGUgZWxlbWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNvbnRhaW5lciIgdHlwZT0iY29udGFpbmVyLXBvbGljeSIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJpbmNsdWRlLW5hbWVzcGFjZS1kZWNsYXJhdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaW5jbHVkZS1zY2hlbWEtaW5zdGFuY2UiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InJldXNlLWNvbnRhaW5lciIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYW55LW9iamVjdC1tYXBwaW5nIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIG1hcHBpbmcgb2YgYSBzaW5nbGUgb2JqZWN0IHRvIGFuIHhzOmFueSBkZWNsYXJhdGlvbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iZmllbGQiIHR5cGU9ImZpZWxkIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9ImZhbHNlIiBuYW1lPSJ1c2UteG1sLXJvb3QiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImtlZXAtYXMtZWxlbWVudC1wb2xpY3kiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtZnJhZ21lbnQtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgc2luZ2xlIE5vZGUgdG8gYSBmcmFnbWVudCBvZiBhbiBYTUwgZG9jdW1lbnQ8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ieG1sLWRpcmVjdC1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWZyYWdtZW50LWNvbGxlY3Rpb24tbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiBvZiBOb2RlcyB0byBhIGZyYWdtZW50IG9mIGFuIFhNTCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhYnN0cmFjdC1jb21wb3NpdGUtY29sbGVjdGlvbi1tYXBwaW5nIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluYXJ5LWRhdGEtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgYmluYXJ5IG9iamVjdCB0byBiYXNlNjQgYmluYXJ5PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhtbC1kaXJlY3QtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0iaXMtc3dhLXJlZiIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibWltZS10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNob3VsZC1pbmxpbmUtZGF0YSIgdHlwZT0ieHNkOmJvb2xlYW4iIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0icmV1c2UtY29udGFpbmVyIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5hcnktZGF0YS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGJpbmFyeSBvYmplY3QgdG8gYmFzZTY0IGJpbmFyeTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4bWwtY29tcG9zaXRlLWRpcmVjdC1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXN3YS1yZWYiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im1pbWUtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaG91bGQtaW5saW5lLWRhdGEiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1jb2xsZWN0aW9uLW1hcHBpbmciPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgbWFwcGluZyBvZiBhIGNvbGxlY3Rpb24gdG8gYSBjaG9pY2Ugc3RydWN0dXJlIGluIGFuIHhtbCBkb2N1bWVudDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJhdHRyaWJ1dGUtbWFwcGluZyI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbnRhaW5lci1wb2xpY3kiIHR5cGU9ImNvbnRhaW5lci1wb2xpY3kiIC8+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgdHlwZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXVzZS1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1vYmplY3QtbWFwcGluZyI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBtYXBwaW5nIG9mIGEgY29sbGVjdGlvbiB0byBhIGNob2ljZSBzdHJ1Y3R1cmUgaW4gYW4geG1sIGRvY3VtZW50PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImF0dHJpYnV0ZS1tYXBwaW5nIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiB0eXBlPSJ4bWwtY2hvaWNlLWZpZWxkLXRvLWNsYXNzLWFzc29jaWF0aW9uIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNob2ljZS1maWVsZC10by1jbGFzcy1hc3NvY2lhdGlvbiI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ4bWwtZmllbGQiIHR5cGU9Im5vZGUiIC8+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2xhc3MtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWNvbnZlcnNpb24tcGFpciI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJxbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjbGFzcy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhbiBYUGF0aCBleHByZXNzaW9uIHRvIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlIGluIGFuIFhNTCBkb2N1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZmllbGQiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InBvc2l0aW9uIiB0eXBlPSJ4c2Q6aW50ZWdlciI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcG9zaXRpb24gb2YgdGhlIG5vZGUgaW4gdGhlIHBhcmVudCB0eXBlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0idHlwZWQtdGV4dC1maWVsZCIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SWYgdGhpcyBpcyBhIHR5cGVkIHRleHQgZmllbGQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJzaW5nbGUtbm9kZSIgdHlwZT0ieHNkOmJvb2xlYW4iPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+SW5kaWNhdGVzIGlmIGVhY2ggaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBpcyBpbiB0aGUgc2FtZSBub2RlIGluc3RlYWQgb2YgaGF2aW5nIG9uZSBub2RlIHBlciBpdGVtIGluIHRoZSBjb2xsZWN0aW9uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ic2NoZW1hLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBlbGVtZW50LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9InhtbC10by1qYXZhLWNvbnZlcnNpb24tcGFpciIgdHlwZT0ieG1sLWNvbnZlcnNpb24tcGFpciIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iamF2YS10by14bWwtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImxlYWYtZWxlbWVudC10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkluZGljYXRlcyB0aGUgZWxlbWVudHMgdHlwZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iaXMtcmVxdWlyZWQiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuaW9uLW5vZGUiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Vc2UgdG8gcmVwcmVzZW50IG5vZGVzIHdoaWNoIGFyZSBtYXBwZWQgdG8gdW5pb25zPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ0eXBlZC10ZXh0LWZpZWxkIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0aGlzIGlzIGEgdHlwZWQgdGV4dCBmaWVsZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InNpbmdsZS1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5JbmRpY2F0ZXMgaWYgZWFjaCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uIGlzIGluIHRoZSBzYW1lIG5vZGUgaW5zdGVhZCBvZiBoYXZpbmcgb25lIG5vZGUgcGVyIGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb248L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJzY2hlbWEtdHlwZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgc2NoZW1hIHR5cGUgb2YgdGhlIGVsZW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ieG1sLXRvLWphdmEtY29udmVyc2lvbi1wYWlyIiB0eXBlPSJ4bWwtY29udmVyc2lvbi1wYWlyIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJqYXZhLXRvLXhtbC1jb252ZXJzaW9uLXBhaXIiIHR5cGU9InhtbC1jb252ZXJzaW9uLXBhaXIiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UtcmVzb2x2ZXIiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiIG5hbWU9Im5hbWVzcGFjZXMiPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0ibmFtZXNwYWNlIiB0eXBlPSJuYW1lc3BhY2UiIC8+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0iMSIgbmFtZT0iZGVmYXVsdC1uYW1lc3BhY2UtdXJpIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYW1lc3BhY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlZml4IiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWVzcGFjZS11cmkiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1yZWZlcmVuY2UiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJyZXNvdXJjZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzY2hlbWEtY29udGV4dCIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciIC8+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNjaGVtYS1jbGFzcy1wYXRoLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2NoZW1hLWZpbGUtcmVmZXJlbmNlIj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzY2hlbWEtcmVmZXJlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzY2hlbWEtdXJsLXJlZmVyZW5jZSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2NoZW1hLXJlZmVyZW5jZSIgLz4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJqYXZhLWNoYXJhY3RlciI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS10aW1lc3RhbXAiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iamF2YS11dGlsLWRhdGUiPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOmRhdGVUaW1lIiAvPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNtcC1wb2xpY3kiPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJwZXNzaW1pc3RpYy1sb2NraW5nIiB0eXBlPSJwZXNzaW1pc3RpYy1sb2NraW5nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBjbXAgYmVhbi1sZXZlbCBwZXNzaW1pc3RpYyBsb2NraW5nIHBvbGljeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCIgdHlwZT0iZGVmZXItdW50aWwtY29tbWl0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIG1vZGlmaWNhdGlvbiBkZWZlcnJhbCBsZXZlbCBmb3Igbm9uLWRlZmVycmVkIHdyaXRlcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im5vbi1kZWZlcnJlZC1jcmVhdGUtdGltZSIgdHlwZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHBvaW50IGF0IHdoaWNoIGluc2VydCB3aWxsIGJlIGlzc3VlZCB0byBEYXRhYmFzZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icGVzc2ltaXN0aWMtbG9ja2luZyI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IndhaXQiIG5hbWU9ImxvY2tpbmctbW9kZSIgdHlwZT0ibG9ja2luZy1tb2RlIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImRlZmVyLXVudGlsLWNvbW1pdCI+Ci0gICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImFsbC1tb2RpZmljYXRpb25zIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0idXBkYXRlLW1vZGlmaWNhdGlvbnMiIC8+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJub25lIiAvPgotICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICA8L3hzZDpzaW1wbGVUeXBlPgotICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibm9uLWRlZmVycmVkLWNyZWF0ZS10aW1lIj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpiY3JlYXRlIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWZ0ZXItZWpicG9zdGNyZWF0ZSIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InVuZGVmaW5lZCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9ImxvY2tpbmctbW9kZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkhvbGRzIHRoZSBwZXNzaW1pc3RpYyBsb2NraW5nIG1vZGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJ3YWl0IiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ibm8td2FpdCIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlNlcXVlbmNlIG9iamVjdC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IiIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2UgbmFtZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IjUwIiBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBwcmVhbGxvY2F0aW9uIHNpemUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5SZWZlcmVuY2VzIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LCBvdmVycmlkaW5nIGl0cyBuYW1lIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgc2V0IHByZWFsbG9jYXRpb24gc2l6ZSB0byAwPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRhYmxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUVVFTkNFIiBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93PC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJTRVFVRU5DRSIgbmFtZT0iY291bnRlci1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWxmaWxlLXNlcXVlbmNlIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1zZXF1ZW5jZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRVUVOQ0UiIG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX05BTUUiIG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iU0VRX0NPVU5UIiBuYW1lPSJjb3VudGVyLWVsZW1lbnQiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXBzIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYWxsIHByZS1kZWZpbmVkIGZldGNoIGdyb3Vwcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImRlZmF1bHQtZmV0Y2gtZ3JvdXAiIHR5cGU9ImZldGNoLWdyb3VwIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwIiB0eXBlPSJmZXRjaC1ncm91cCIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZmV0Y2gtZ3JvdXAiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Db250YWlucyB0aGUgZmV0Y2ggZ3JvdXAgYXR0cmlidXRlcyBpbmZvLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmZXRjaC1ncm91cC1hdHRyaWJ1dGVzIj4KLSAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Q29udGFpbnMgYSBmZXRjaCBncm91cCdzIGF0dHJpYnV0ZSBsaXN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWU9ImZldGNoLWdyb3VwLWF0dHJpYnV0ZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICA8L3hzZDplbGVtZW50PgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjaGFuZ2UtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVzY3JpYmVzIHRoZSBjaGFuZ2UgdHJhY2tpbmcgcG9saWN5IGZvciB0aGlzIGRlc2NyaXB0b3IuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZlcnJlZC1kZXRlY3Rpb24tY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYmFja3VwIGNsb25lIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYmplY3QtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgIm1hcmsgZGlydHkiIHRvIGRldGVjdCBjaGFuZ2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmNvbXBsZXhDb250ZW50IG1peGVkPSJmYWxzZSI+Ci0gICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjaGFuZ2UtcG9saWN5IiAvPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhdHRyaWJ1dGUtbGV2ZWwtY2hhbmdlLXBvbGljeSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlVzZXMgYSBDaGFuZ2VUcmFja2VyIGZpcmluZyBQcm9wZXJ0eUNoYW5nZUV2ZW50J3MgdG8gZGV0ZWN0IGNoYW5nZXMuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNoYW5nZS1wb2xpY3kiIC8+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImFic3RyYWN0LW51bGwtcG9saWN5Ij4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyB0aGUgTnVsbCBQb2xpY3kgaW4gdXNlIGZvciB0aGlzIHJlbGF0aW9uc2hpcCBjdXJyZW50bHkgYSBjaG9pY2Ugb2YgW051bGxQb2xpY3kgYW5kIElzU2V0TnVsbFBvbGljeV0uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBkZWZhdWx0PSJmYWxzZSIgbmFtZT0ieHNpLW5pbC1yZXByZXNlbnRzLW51bGwiIHR5cGU9InhzZDpib29sZWFuIiAvPgotICAgICAgPHhzZDplbGVtZW50IG1pbk9jY3Vycz0iMCIgZGVmYXVsdD0iZmFsc2UiIG5hbWU9ImVtcHR5LW5vZGUtcmVwcmVzZW50cy1udWxsIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9Im51bGwtcmVwcmVzZW50YXRpb24tZm9yLXhtbCIgdHlwZT0ibWFyc2hhbC1udWxsLXJlcHJlc2VudGF0aW9uIiAvPgotICAgIDwveHNkOnNlcXVlbmNlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJudWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIGRlZmF1bHQ9InRydWUiIG5hbWU9ImlzLXNldC1wZXJmb3JtZWQtZm9yLWFic2VudC1ub2RlIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImlzLXNldC1udWxsLXBvbGljeSI+Ci0gICAgPHhzZDpjb21wbGV4Q29udGVudCBtaXhlZD0iZmFsc2UiPgotICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iYWJzdHJhY3QtbnVsbC1wb2xpY3kiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImlzLXNldC1tZXRob2QtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iaXMtc2V0LXBhcmFtZXRlci10eXBlIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJpcy1zZXQtcGFyYW1ldGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJtYXJzaGFsLW51bGwtcmVwcmVzZW50YXRpb24iPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5Xcml0ZSBudWxsLCBubyB0YWcoZGVmYXVsdCkgb3IgYW4gZW1wdHkgdGFnLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iWFNJX05JTCIgLz4KLSAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IkFCU0VOVF9OT0RFIiAvPgotICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRU1QVFlfTk9ERSIgLz4KLSAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmaWVsZCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBnZW5lcmljIGZpZWxkIGNvbmNlcHQsIHN1Y2ggYXMgYSBkYXRhYmFzZSBjb2x1bW4uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIG5hbWUgb2YgdGhlIGZpZWxkLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29sdW1uIj4KLSAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICA8eHNkOmRvY3VtZW50YXRpb24+RGVmaW5lcyBhIGNvbHVtbiBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDx4c2Q6Y29tcGxleENvbnRlbnQgbWl4ZWQ9ImZhbHNlIj4KLSAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImZpZWxkIj4KLSAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGFibGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIFRoaXMgdGFibGUgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIGNsYXNzJyB0YWJsZXMuIElmIG5vdCBzcGVjaWZpZWQgdGhlIGZpcnN0IHRhYmxlIG9mIHRoZSBjbGFzcyB3aWxsIGJlIHVzZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNxbC10eXBlY29kZSIgdHlwZT0ieHNkOmludGVnZXIiPgotICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4ob3B0aW9uYWwgZmllbGQpIFRoZSBKREJDIHR5cGVjb2RlIG9mIHRoaXMgY29sdW1uPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8L3hzZDphdHRyaWJ1dGU+Ci0gICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbHVtbi1kZWZpbml0aW9uIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+KG9wdGlvbmFsIGZpZWxkKSBOYW1lIG9mIHRoZSBKREJDIHR5cGVjb2RlIGZvciB0aGlzIGNvbHVtbjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPC94c2Q6YXR0cmlidXRlPgotICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmb3JlaWduLWtleSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHNvdXJjZS90YXJnZXQgZmllbGQvY29sdW1uIHJlZmVyZW5jZXMgcmVsYXRpbmcgYSBmb3JlaWduIGtleSBpbiBvbmUgdGFibGUgdG8gdGhlIHByaW1hcnkgb3IgdW5pcXVlIGtleSBpbiBhbm90aGVyIHRhYmxlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lPSJmaWVsZC1yZWZlcmVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSByZWZlcmVuY2Ugb2YgYSBzb3VyY2UgdGFibGUgZm9yZWlnbiBrZXkgYW5kIGEgdGFyZ2V0IHRhYmxlIHByaW1hcnkga2V5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzb3VyY2UtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgZm9yZWlnbiBrZXkgZmllbGQvY29sdW1uIG5hbWUgaW4gdGhlIHNvdXJjZSB0YWJsZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YXJnZXQtZmllbGQiIHR5cGU9ImZpZWxkIj4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcHJpbWFyeSBvciB1bmlxdWUga2V5IGZpZWxkL2NvbHVtbiBuYW1lIGluIHRoZSB0YXJnZXQgdGFibGUuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icXVlcnkiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIGEgcXVlcnkgc3BlY2lmaWNhdGlvbiBmb3IgcXVlcnlpbmcgaW5zdGFuY2VzIG9mIHRoZSBjbGFzcy48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9ImNyaXRlcmlhIiB0eXBlPSJjcml0ZXJpYSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBvZiB0aGUgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJhcmd1bWVudHMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHF1ZXJ5IGFyZ3VtZW50cy4gVGhlIG9yZGVyIG9mIHRoZSBhcmd1bWVudCBtdXN0IG1hdGNoIHRoZSBvcmRlciBvZiB0aGUgYXJndW1lbnQgdmFsdWUgcGFzc2VkIHRvIHRoZSBxdWVyeS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbmFtZT0iYXJndW1lbnQiIHR5cGU9InF1ZXJ5LWFyZ3VtZW50Ij4KLSAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSBxdWVyeS4gIFRoaXMgbmFtZSBjYW4gYmUgdXNlZCB0byByZWZlcmVuY2UgYW5kIGV4ZWN1dGUgdGhlIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgIDwveHNkOmF0dHJpYnV0ZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3JpdGVyaWEiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5EZWZpbmVzIHRoZSBmaWx0ZXJpbmcgY2xhdXNlIG9mIGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJxdWVyeS1hcmd1bWVudCI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkRlZmluZXMgYSBxdWVyeSBhcmd1bWVudC48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgIDx4c2Q6ZWxlbWVudCBtaW5PY2N1cnM9IjAiIG5hbWU9InR5cGUiIHR5cGU9InhzZDpzdHJpbmciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgdHlwZSBuYW1lIG9mIHRoZSBhcmd1bWVudCBtYXkgYmUgcHJvdmlkZWQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICA8eHNkOmVsZW1lbnQgbWluT2NjdXJzPSIwIiBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOmFueVNpbXBsZVR5cGUiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPk9wdGlvbmFsIGNvbnN0YW50IHZhbHVlIGZvciB0aGUgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UaGUgbmFtZSBvZiB0aGUgcXVlcnkgYXJndW1lbnQuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPkEgdXNlciBkZWZpbmVkIHByb3BlcnR5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6YW55VHlwZSIgLz4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZSI+Ci0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBsaXN0IG9mIHRhYmxlcyB0aGF0IHRoZSBjbGFzcyBpcyBwZXJzaXN0ZWQgdG8uICBUaGlzIGlzIHR5cGljYWxseSBhIHNpbmdsZSB0YWJsZSBidXQgY2FuIGJlIG11bHRpcGxlLCBvciBlbXB0eSBmb3IgaW5oZXJpdGFuY2Ugb3IgYWdncmVnYXRlZCBjbGFzc2VzLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlRoZSBuYW1lIG9mIHRoZSB0YWJsZS4gIFRoZSBuYW1lIGNhbiBiZSBmdWxseSBxdWFsaWZpZWQgd2l0aCB0aGUgc2NoZW1hLCB0YWJsZXNwYWNlIG9yIGxpbmsuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6YXR0cmlidXRlPgotICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ2YWx1ZS1jb252ZXJ0ZXIiPgotICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgU3BlY2lmaWVzIGhvdyB0aGUgZGF0YSB2YWx1ZSBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZQotICAgICAgICBvYmplY3QgdmFsdWUuCi0gICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIDwveHNkOmFubm90YXRpb24+Ci0gIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5IgotICAgICAgICAgICAgdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpjb21wbGV4VHlwZT4KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgICAgICBuYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJlbGF0aXZlLXBvc2l0aW9uLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODMxYWYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBDb3B5cmlnaHQgKGMpIDE5OTgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCAKLSB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gCi0gVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCAKLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4wIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYnJva2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFByb3ZpZGVzIGEgc2luZ2xlIHZpZXcgdG8gYSBzZXNzaW9uIHRoYXQKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVudGx5IGFjY2Vzc2VzIG11bHRwbGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm9qZWN0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhtbCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaW50byBFY2xpcHNlTGluaywgdGhlCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIGRvIGFsbCBvZiBpdHMgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotICAgICAgICAgICAgICAgIG9iamVjdHMgdGhyb3VnaCB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gYWxzbyBtYW5hZ2VzCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCB1bml0cyBvZiB3b3JrLiBUaGUgZGF0YWJhc2Ugc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciB1c2FnZSBpbiB0d28tdGllciBjbGllbnQtc2VydmVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBBbHRob3VnaCBpdCBjb3VsZCBiZSB1c2VkIGluIGEgc2VydmVyCi0gICAgICAgICAgICAgICAgc2l0dWF0aW9uLCBpdCBpcyBsaW1pdHRlZCB0byBvbmx5IGhhdmluZyBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG9wZW4KLSAgICAgICAgICAgICAgICBkYXRhYmFzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1wcm9qZWN0IiB0eXBlPSJwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCAoY2xhc3Mgb3IgeG1sKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCBhcyB0aGUgcHJpbWFyeSBwcm9qZWN0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtcHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InByb2plY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBwcm9qZWN0cyB3aWxsIGhhdmUgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJcyBhbiBleHRlbnNpb24gb2YgYSBEYXRhYmFzZVNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29scyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIHBvb2xzIGFyZSBvbmx5IGZvciB1c2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGlmIHVzaW5nIGV4dGVybmFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndyaXRlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNlcXVlbmNlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIHRhZyB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBkZWZhdWx0IGNsaWVudCBzZXNzaW9ucyBhcmUgYWNxdWlyZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgcmVhZHMsIHJlcXVpcmVkIGZvciBWUEQsIG9yIHVzZXIgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF6eSIgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgaGVsZCB1cGZyb250IGluIHRoZSBjbGllbnQgc2Vzc2lvbiwgb3Igb25seQotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgd2hlbiBuZWVkZWQgYW5kIHRoZW4gcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb21tb24gZmllbGRzIGZvciBkYXRhYmFzZS1sb2dpbiBhbmQgZWlzLWxvZ2luCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtcXVhbGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcXVhbGlmaWVyIGZvciBhbGwgdGFibGVzLiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRhYmxlIG9yIGRhdGFiYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YWJsZSBleGlzdHMgb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIHN1Y2ggYXMgT3JhY2xlIGFuZCBEQjIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vzc2lvbiB3aWxsIGJlIHVzaW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2luZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgYSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGV4dHJhIHByb3BlcnRpZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICB0byBhIEpEQkMgZHJpdmVyLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHJpdmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgY2xhc3MgaXMgdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCAoZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgb2YgYSBkYXRhc291cmNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGJ5IHRoZSBzZXNzaW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxvb2t1cCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9va3VwLWVudW0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBiaW5kIGFsbCBhcmd1bWVudHMgdG8gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHByZXBhcmVkIHN0YXRlbWVudHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBiaW5kaW5nIGZvciBsYXJnZSBiaW5hcnkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFY2xpcHNlTGluayB3aWxsIHByaW50IHRoaXMgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBoZXggdGhyb3VnaCB0aGUgSkRCQyBiaW5hcnkgZXhjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZS4gQm90aCBiaW5kaW5nIGFuZCBwcmludGluZyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgbGltaXRzIG9uIGFsbCBkYXRhYmFzZXMgKGUuZy4gNWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzMmspLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBib3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBoZWxwIGJlYW4gaW50cm9zcGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9yZSBsYXJnZSBiaW5hcnkgZGF0YS4gVGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSB0aGUgbWF4IHNpemUgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIEpEQkMgZHJpdmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGV4cGVjdHMgdXBwZXIgY2FzZSBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGRvZXMgbm90IHJldHVybiBjb25zaXN0ZW50IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZGlmZmVyZW50IGRhdGFiYXNlcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIGRyaXZlciBsZXZlbCBkYXRhIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGFzIHNvbWUgZHJpdmVycyBwZXJmb3JtIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiB0aGVtc2VsdmVzIGluY29ycmVjdGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IENIQVIgZmllbGQgdmFsdWVzIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgYmxhbmtzIHRyaW1tZWQsIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgZmFjaWxpdHkgYWxsb3dzIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMgdG8gYmUgc3VibWl0dGVkIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZm9yIHByb2Nlc3NpbmcgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0dGluZyBtdWx0aXBsZSB1cGRhdGVzIHRvZ2V0aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseSwgY2FuIGdyZWF0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0YWcgd2l0aCB0cnVlIGluZGljYXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayB0aGF0IHRoZSBKREJDIGRyaXZlciBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCB3cml0aW5nLiBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQuIFNldHRpbmcgdGhpcyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBmYWxzZSBpbmRpY2F0ZXMgdG8gRWNsaXBzZUxpbmsgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ciB3aGljaCBpcyB0byBkZWxlZ2F0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYmF0Y2gtd3JpdGluZy1zaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMyMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgZm9yIHRoZSBtYXggYmF0Y2ggd3JpdGluZyBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBiYXRjaCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxpbWl0ZWQgYXMgbW9zdCBkYXRhYmFzZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdCBsaW1pdHMuIFRoZSBzaXplIGlzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBkZWZhdWx0IGlzIDMyMDAwIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF0aXZlLXNxbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBzcGVjaWZpYyBzcWwgZ3JhbW1hciBub3QgSkRCQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYy4gVGhpcyBpcyBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBicmlkZ2VzIHRvIG5vdCBzdXBwb3J0IHRoZSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgc3RhbmRhcmQuIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgdXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSkRCQyBzcWwgZ3JhbW1hci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9InN0cnVjdC1jb252ZXJ0ZXJzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWhlYWx0aC12YWxpZGF0ZWQtb24tZXJyb3IiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHdpbGwgY2F1c2UgRWNsaXBzZUxpbmsgdG8gcGluZyBkYXRhYmFzZSB0byBkZXRlcm1pbmUgaWYgYW4gU1FMRXhjZXB0aW9uIHdhcyBjYXVzZSBieSBhIGNvbW11bmljYXRpb24gZmFpbHVyZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmV0cnktYXR0ZW1wdC1jb3VudCIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIEVjbGlwc2VMaW5rIHdpbGwgbWFrZSBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxheS1iZXR3ZWVuLXJlY29ubmVjdC1hdHRlbXB0cyIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgd2FpdCBiZXR3ZWVuIGF0dGVtcHRzIHRvIHJlY29ubmVjdCBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nLXNxbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3ZlcnJpZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIFNRTCB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgaXNzdWUgdG8gYSBjb25uZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBsaXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9va3VwLWVudW0iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3VuZC1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbm5lY3QgdGhyb3VnaCBFSVMsCi0gICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBhbmQgdXNlCi0gICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZ2V0Q29ubmVjdGlvbiAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnksIGFuZCBhIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uU3BlYwotICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIGdldENvbm5lY3Rpb24gLSBDb25uZWN0IGluIGEgbm9uLW1hbmFnZWQKLSAgICAgICAgICAgICAgICB3YXkgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBBbgotICAgICAgICAgICAgICAgIEVJU0Nvbm5lY3Rpb25TcGVjIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVmaW5lIGhvdyB0bwotICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIEVJUyBhZGFwdGVyLiBUaGUgRUlTIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBkYXRhc291cmNlL2RyaXZlciBzcGVjaWZpYyBiZWhhdm9pciBzdWNoIGFzCi0gICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TcGVjIGFuZCBSZWNvcmQgY29udmVyc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgbG9naW4gYW5kIHBsYXRmb3JtIHR5cGUgdG8gYmUgdXNlZAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBwb29sZWQgaW4gYQotICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBhd2F5cyBiZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgcmVhZCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgcmVhZCBhY2Nlc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gQW55IG9mIHRoZSBjb25uZWN0aW9uIHBvb2xzIGNhbiBiZQotICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZWFkIHBvb2wgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0LiBUaGlzCi0gICAgICAgICAgICAgICAgcG9vbCBhbGxvd3MgZm9yIGNvbmN1cnJlbnQgcmVhZHMgYWdhaW5zdCB0aGUgc2FtZSBKREJDCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGUgSkRCQyBjb25uZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICBjb25jdXJyZW50IHJlYWQgYWNjZXNzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgZnJvbSB0aGUgcmVhZCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgYXJlIGV4Y2x1c2l2ZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY29tbW9uIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEphdmEgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEVjbGlwc2VMaW5rIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1sZXZlbCIgZGVmYXVsdD0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2cgbGV2ZWwgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvZmYiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNldmVyZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FybmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5mbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29uZmlnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXN0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIGxvZ2dpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgU2VydmVyIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1leGNlcHRpb24tc3RhY2t0cmFjZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZXhjZXB0aW9uIHN0YWNrdHJhY2UuIFdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCwgdGhlIHN0YWNrdHJhY2UgaXMgbG9nZ2VkIGZvciBGSU5FUgotICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGVzcyAoRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXRocmVhZCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgdGhyZWFkLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQgaXMgbG9nZ2VkIGZvciBGSU5FIG9yIGxlc3MgKEZJTkVSIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtc2Vzc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBzZXNzaW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBzZXNzaW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBjb25uZWN0aW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBkYXRlLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGlzIFJNSQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbi1jb25uZWN0aW9uLWVycm9yIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkRpc2NhcmRDb25uZWN0aW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YgIkRpc2NhcmRDb25uZWN0aW9uIiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIktlZXBDb25uZWN0aW9uIi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgUkNNIHNlcnZpY2Ugc2hvdWxkIGJlIGRyb3BwZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tbXVuaWNhdGlvbiBlcnJvciB3aXRoIHRoYXQgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZENvbm5lY3Rpb24iLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjYXJkQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZSBSTUkgdHJhbnNwb3J0IG1lY2hhbmlzbS4gVGhlCi0gICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW5kLW1vZGUiIGRlZmF1bHQ9IkFzeW5jaHJvbm91cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiIG9yICJTeW5jaHJvbm91cyIuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgd2hldGhlciB0aGUgUkNNIHByb3BhZ2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgY29tbWFuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggaXRzIGV4ZWN1dGlvbiBpbiBhc3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciB3YWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NvdmVyeSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBzZXR0aW5ncyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgZGVmYXVsdCBEaXNjb3Zlcnkgd2l0aCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzZXR0aW5ncyBpcyBjcmVhdGVkIHdoZW4gdGhlIHJtaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtdWx0aWNhc3QtZ3JvdXAtYWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIyNi4xMC4xMi42NCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGljYXN0LXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzEyMSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5ub3VuY2VtZW50LWRlbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjEwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIG11bHRpY2FzdCBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgIjEwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrZXQtdGltZS10by1saXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRpbWUtdG8tbGl2ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0cyB0aGF0IGFyZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIERpc2NvdmVyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHN0aWNhc3Qgc29ja2V0IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLiBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGVsZW1lbnQgaXMgIjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJybWktcmVnaXN0cnktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJtaSBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgUk1JIHJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLWlpb3AtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBSTUktSUlPUCB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mCi0gICAgICAgICAgICAgICAgdGhlIFJDTS4gVGhlIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJtaS10cmFuc3BvcnQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam1zLXRvcGljLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgSk1TIHRvcGljIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1ob3N0LXVybCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWNvbm5lY3Rpb24tZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWNDb25uZWN0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpYyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai1qZ3JvdXBzLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgT0M0SiBKR3JvdXBzIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2Utc2luZ2xlLXRocmVhZGVkLW5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdW4tY29yYmEtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBTdW4gQ09SQkEgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRlZmluZWQtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBhIHVzZXIgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgZm9yIG5hbWluZyBzZXJ2aWNlIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iYWRtaW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0icGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gIFRPRE86IE5lZWQgdG8gaGF2ZSBhIG5vbiBPcmFjbGUtQVMgZGVmYXVsdCBvciByb3V0ZSB0aHJvdWdoIHNlcnZlciBwbGF0Zm9ybSBieSBkZWZhdWx0IC0tPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtY29udGV4dC1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJjb20uZXZlcm1pbmQuc2VydmVyLnJtaS5STUlJbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzcyBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWluZyBzZXJ2aWNlIHJlcXVpcmVzIGV4dHJhIHByb3BlcnR5IHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IEVjbGlwc2VMaW5rIGJ1dCBpdCBpcyByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmdyb3VwIG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsCi0gICAgICAgICAgICAgICAgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1lbGVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NjaGVtYXMvZWNsaXBzZWxpbmtfc2Vzc2lvbnNfMS4xLnhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg3MmExNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjEueHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTU4NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIENvcHlyaWdodCAoYykgMTk5OCwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gQ29udHJpYnV0b3JzOgotICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gZnJvbSBPcmFjbGUgVG9wTGluawotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAKLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4xIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYnJva2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFByb3ZpZGVzIGEgc2luZ2xlIHZpZXcgdG8gYSBzZXNzaW9uIHRoYXQKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVudGx5IGFjY2Vzc2VzIG11bHRwbGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm9qZWN0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhtbCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaW50byBFY2xpcHNlTGluaywgdGhlCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIGRvIGFsbCBvZiBpdHMgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotICAgICAgICAgICAgICAgIG9iamVjdHMgdGhyb3VnaCB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gYWxzbyBtYW5hZ2VzCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCB1bml0cyBvZiB3b3JrLiBUaGUgZGF0YWJhc2Ugc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciB1c2FnZSBpbiB0d28tdGllciBjbGllbnQtc2VydmVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBBbHRob3VnaCBpdCBjb3VsZCBiZSB1c2VkIGluIGEgc2VydmVyCi0gICAgICAgICAgICAgICAgc2l0dWF0aW9uLCBpdCBpcyBsaW1pdHRlZCB0byBvbmx5IGhhdmluZyBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG9wZW4KLSAgICAgICAgICAgICAgICBkYXRhYmFzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1wcm9qZWN0IiB0eXBlPSJwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCAoY2xhc3Mgb3IgeG1sKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCBhcyB0aGUgcHJpbWFyeSBwcm9qZWN0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtcHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InByb2plY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBwcm9qZWN0cyB3aWxsIGhhdmUgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJcyBhbiBleHRlbnNpb24gb2YgYSBEYXRhYmFzZVNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29scyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIHBvb2xzIGFyZSBvbmx5IGZvciB1c2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGlmIHVzaW5nIGV4dGVybmFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndyaXRlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNlcXVlbmNlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIHRhZyB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBkZWZhdWx0IGNsaWVudCBzZXNzaW9ucyBhcmUgYWNxdWlyZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgcmVhZHMsIHJlcXVpcmVkIGZvciBWUEQsIG9yIHVzZXIgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF6eSIgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgaGVsZCB1cGZyb250IGluIHRoZSBjbGllbnQgc2Vzc2lvbiwgb3Igb25seQotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgd2hlbiBuZWVkZWQgYW5kIHRoZW4gcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb21tb24gZmllbGRzIGZvciBkYXRhYmFzZS1sb2dpbiBhbmQgZWlzLWxvZ2luCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtcXVhbGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcXVhbGlmaWVyIGZvciBhbGwgdGFibGVzLiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRhYmxlIG9yIGRhdGFiYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YWJsZSBleGlzdHMgb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIHN1Y2ggYXMgT3JhY2xlIGFuZCBEQjIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vzc2lvbiB3aWxsIGJlIHVzaW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2luZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgYSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGV4dHJhIHByb3BlcnRpZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICB0byBhIEpEQkMgZHJpdmVyLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHJpdmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgY2xhc3MgaXMgdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCAoZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgb2YgYSBkYXRhc291cmNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGJ5IHRoZSBzZXNzaW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxvb2t1cCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9va3VwLWVudW0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBiaW5kIGFsbCBhcmd1bWVudHMgdG8gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHByZXBhcmVkIHN0YXRlbWVudHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBiaW5kaW5nIGZvciBsYXJnZSBiaW5hcnkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFY2xpcHNlTGluayB3aWxsIHByaW50IHRoaXMgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBoZXggdGhyb3VnaCB0aGUgSkRCQyBiaW5hcnkgZXhjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZS4gQm90aCBiaW5kaW5nIGFuZCBwcmludGluZyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgbGltaXRzIG9uIGFsbCBkYXRhYmFzZXMgKGUuZy4gNWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzMmspLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBib3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBoZWxwIGJlYW4gaW50cm9zcGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9yZSBsYXJnZSBiaW5hcnkgZGF0YS4gVGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSB0aGUgbWF4IHNpemUgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIEpEQkMgZHJpdmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGV4cGVjdHMgdXBwZXIgY2FzZSBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGRvZXMgbm90IHJldHVybiBjb25zaXN0ZW50IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZGlmZmVyZW50IGRhdGFiYXNlcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIGRyaXZlciBsZXZlbCBkYXRhIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGFzIHNvbWUgZHJpdmVycyBwZXJmb3JtIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiB0aGVtc2VsdmVzIGluY29ycmVjdGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IENIQVIgZmllbGQgdmFsdWVzIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgYmxhbmtzIHRyaW1tZWQsIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgZmFjaWxpdHkgYWxsb3dzIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMgdG8gYmUgc3VibWl0dGVkIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZm9yIHByb2Nlc3NpbmcgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0dGluZyBtdWx0aXBsZSB1cGRhdGVzIHRvZ2V0aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseSwgY2FuIGdyZWF0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0YWcgd2l0aCB0cnVlIGluZGljYXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayB0aGF0IHRoZSBKREJDIGRyaXZlciBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCB3cml0aW5nLiBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQuIFNldHRpbmcgdGhpcyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBmYWxzZSBpbmRpY2F0ZXMgdG8gRWNsaXBzZUxpbmsgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ciB3aGljaCBpcyB0byBkZWxlZ2F0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYmF0Y2gtd3JpdGluZy1zaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMyMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgZm9yIHRoZSBtYXggYmF0Y2ggd3JpdGluZyBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBiYXRjaCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxpbWl0ZWQgYXMgbW9zdCBkYXRhYmFzZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdCBsaW1pdHMuIFRoZSBzaXplIGlzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBkZWZhdWx0IGlzIDMyMDAwIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF0aXZlLXNxbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBzcGVjaWZpYyBzcWwgZ3JhbW1hciBub3QgSkRCQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYy4gVGhpcyBpcyBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBicmlkZ2VzIHRvIG5vdCBzdXBwb3J0IHRoZSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgc3RhbmRhcmQuIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgdXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSkRCQyBzcWwgZ3JhbW1hci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9InN0cnVjdC1jb252ZXJ0ZXJzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWhlYWx0aC12YWxpZGF0ZWQtb24tZXJyb3IiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHdpbGwgY2F1c2UgRWNsaXBzZUxpbmsgdG8gcGluZyBkYXRhYmFzZSB0byBkZXRlcm1pbmUgaWYgYW4gU1FMRXhjZXB0aW9uIHdhcyBjYXVzZSBieSBhIGNvbW11bmljYXRpb24gZmFpbHVyZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmV0cnktYXR0ZW1wdC1jb3VudCIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIEVjbGlwc2VMaW5rIHdpbGwgbWFrZSBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxheS1iZXR3ZWVuLXJlY29ubmVjdC1hdHRlbXB0cyIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgd2FpdCBiZXR3ZWVuIGF0dGVtcHRzIHRvIHJlY29ubmVjdCBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nLXNxbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3ZlcnJpZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIFNRTCB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgaXNzdWUgdG8gYSBjb25uZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBsaXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9va3VwLWVudW0iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3VuZC1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbm5lY3QgdGhyb3VnaCBFSVMsCi0gICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBhbmQgdXNlCi0gICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZ2V0Q29ubmVjdGlvbiAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnksIGFuZCBhIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uU3BlYwotICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIGdldENvbm5lY3Rpb24gLSBDb25uZWN0IGluIGEgbm9uLW1hbmFnZWQKLSAgICAgICAgICAgICAgICB3YXkgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBBbgotICAgICAgICAgICAgICAgIEVJU0Nvbm5lY3Rpb25TcGVjIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVmaW5lIGhvdyB0bwotICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIEVJUyBhZGFwdGVyLiBUaGUgRUlTIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBkYXRhc291cmNlL2RyaXZlciBzcGVjaWZpYyBiZWhhdm9pciBzdWNoIGFzCi0gICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TcGVjIGFuZCBSZWNvcmQgY29udmVyc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCURlZmluZXMgbG9naW4gYW5kIHBsYXRmb3JtIHR5cGUgdG8gYmUgdXNlZAotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAJCQk8eHNkOnNlcXVlbmNlPgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIKLSAgICAJCQkJCXR5cGU9InhzZDpib29sZWFuIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgIAkJCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiCi0gICAgCQkJCQl0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLQotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCTwveHNkOnNlcXVlbmNlPgotICAgIAkJPC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBwb29sZWQgaW4gYQotICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBhd2F5cyBiZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgcmVhZCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgcmVhZCBhY2Nlc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gQW55IG9mIHRoZSBjb25uZWN0aW9uIHBvb2xzIGNhbiBiZQotICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZWFkIHBvb2wgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0LiBUaGlzCi0gICAgICAgICAgICAgICAgcG9vbCBhbGxvd3MgZm9yIGNvbmN1cnJlbnQgcmVhZHMgYWdhaW5zdCB0aGUgc2FtZSBKREJDCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGUgSkRCQyBjb25uZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICBjb25jdXJyZW50IHJlYWQgYWNjZXNzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgZnJvbSB0aGUgcmVhZCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgYXJlIGV4Y2x1c2l2ZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY29tbW9uIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEphdmEgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEVjbGlwc2VMaW5rIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1sZXZlbCIgZGVmYXVsdD0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2cgbGV2ZWwgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvZmYiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNldmVyZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FybmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5mbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29uZmlnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXN0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIGxvZ2dpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgU2VydmVyIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1leGNlcHRpb24tc3RhY2t0cmFjZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZXhjZXB0aW9uIHN0YWNrdHJhY2UuIFdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCwgdGhlIHN0YWNrdHJhY2UgaXMgbG9nZ2VkIGZvciBGSU5FUgotICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGVzcyAoRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXRocmVhZCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgdGhyZWFkLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQgaXMgbG9nZ2VkIGZvciBGSU5FIG9yIGxlc3MgKEZJTkVSIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtc2Vzc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBzZXNzaW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBzZXNzaW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBjb25uZWN0aW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBkYXRlLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGlzIFJNSQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbi1jb25uZWN0aW9uLWVycm9yIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkRpc2NhcmRDb25uZWN0aW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YgIkRpc2NhcmRDb25uZWN0aW9uIiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIktlZXBDb25uZWN0aW9uIi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgUkNNIHNlcnZpY2Ugc2hvdWxkIGJlIGRyb3BwZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tbXVuaWNhdGlvbiBlcnJvciB3aXRoIHRoYXQgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZENvbm5lY3Rpb24iLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjYXJkQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZSBSTUkgdHJhbnNwb3J0IG1lY2hhbmlzbS4gVGhlCi0gICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW5kLW1vZGUiIGRlZmF1bHQ9IkFzeW5jaHJvbm91cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiIG9yICJTeW5jaHJvbm91cyIuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgd2hldGhlciB0aGUgUkNNIHByb3BhZ2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgY29tbWFuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggaXRzIGV4ZWN1dGlvbiBpbiBhc3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciB3YWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NvdmVyeSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBzZXR0aW5ncyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgZGVmYXVsdCBEaXNjb3Zlcnkgd2l0aCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzZXR0aW5ncyBpcyBjcmVhdGVkIHdoZW4gdGhlIHJtaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtdWx0aWNhc3QtZ3JvdXAtYWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIyNi4xMC4xMi42NCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGljYXN0LXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzEyMSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5ub3VuY2VtZW50LWRlbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjEwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIG11bHRpY2FzdCBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgIjEwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrZXQtdGltZS10by1saXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRpbWUtdG8tbGl2ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0cyB0aGF0IGFyZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIERpc2NvdmVyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHN0aWNhc3Qgc29ja2V0IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLiBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGVsZW1lbnQgaXMgIjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJybWktcmVnaXN0cnktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJtaSBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgUk1JIHJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLWlpb3AtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBSTUktSUlPUCB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mCi0gICAgICAgICAgICAgICAgdGhlIFJDTS4gVGhlIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJtaS10cmFuc3BvcnQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam1zLXRvcGljLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgSk1TIHRvcGljIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1ob3N0LXVybCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWNvbm5lY3Rpb24tZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWNDb25uZWN0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpYyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai1qZ3JvdXBzLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgT0M0SiBKR3JvdXBzIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2Utc2luZ2xlLXRocmVhZGVkLW5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdW4tY29yYmEtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBTdW4gQ09SQkEgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRlZmluZWQtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBhIHVzZXIgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgZm9yIG5hbWluZyBzZXJ2aWNlIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iYWRtaW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0icGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gIFRPRE86IE5lZWQgdG8gaGF2ZSBhIG5vbiBXZWJMb2dpYyAocHJldmlvdXNseSBPQzRKKSBkZWZhdWx0IG9yIHJvdXRlIHRocm91Z2ggc2VydmVyIHBsYXRmb3JtIGJ5IGRlZmF1bHQgLS0+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC1jb250ZXh0LWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IndlYmxvZ2ljLmpuZGkuV0xJbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzcyBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWluZyBzZXJ2aWNlIHJlcXVpcmVzIGV4dHJhIHByb3BlcnR5IHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IEVjbGlwc2VMaW5rIGJ1dCBpdCBpcyByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmdyb3VwIG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsCi0gICAgICAgICAgICAgICAgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1lbGVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggZG9jdW1lbnQgcHJlc2VydmF0aW9uCi0gICAgICAgIAkJc3RyYXRlZ3kgd2lsbCBiZSB1c2VkLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgICAJCQl0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJPC94c2Q6ZWxlbWVudD4KLSAgICAJPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggbm9kZSBvcmRlcmluZyBzdHJhdGVneSB3aWxsCi0gICAgCQkJYmUgdXNlZC4KLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgCW5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvbiBQb2xpY3kgdGhhdAotICAgICAgICAJCWFjY2Vzc2VzIHRoZSBzZXNzaW9uIGNhY2hlIHRvIHN0b3JlIE9iamVjdHMgYW5kIHRoZWlyCi0gICAgICAgIAkJYXNzb2NpYXRlZCBub2Rlcy4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUEgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdG8gaW5kaWNhdGUgdGhhdCBubwotICAgICAgICAJCWRvY3VtZW50IHByZXNlcnZhdGlvbiB3b3JrIHNob3VsZCBiZSBkb25lLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRoYXQKLSAgICAgICAgCQltYWludGFpbnMgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gSmF2YQotICAgICAgICAJCU9iamVjdHMgYW5kIHRoZSBYTUxOb2RlcyB0aGV5IG9yaWdpbmF0ZWQgZnJvbS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBzaW1wbHkKLSAgICAgICAgCQlhcHBlbmRzIHRoZSBuZXcgY2hpbGQgZWxlbWVudCB0byB0aGUgcGFyZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBpZ25vcmVzIGFueQotICAgICAgICAJCW5ldyBlbGVtZW50cyB3aGVuIHVwZGF0aW5nIGEgY2FjaGVkIGRvY3VtZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgYWRkcyBuZXcKLSAgICAgICAgCQllbGVtZW50cyB0byBhbiBYTUwgRG9jdW1lbnQgYmFzZWQgb24gdGhlIGxhc3QgdXBkYXRlZAotICAgICAgICAJCXNpYmxpbmcgaW4gdGhlaXIgY29udGV4dC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18xLjIueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTgyNDI3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzEuMi54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDEuMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAKLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMS4yIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iamJvc3MtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlc3Npb24tYnJva2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFByb3ZpZGVzIGEgc2luZ2xlIHZpZXcgdG8gYSBzZXNzaW9uIHRoYXQKLSAgICAgICAgICAgICAgICB0cmFuc3BhcmVudGx5IGFjY2Vzc2VzIG11bHRwbGUgZGF0YWJhc2VzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlc3Npb24iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXNzaW9uLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJwcm9qZWN0Ij4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIiAvPgotICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9InhtbCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJjbGFzcyI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0icHJvamVjdCIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgc2Vzc2lvbiBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgaW50byBFY2xpcHNlTGluaywgdGhlCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2hvdWxkIGRvIGFsbCBvZiBpdHMgcmVhZGluZyBhbmQgd3JpdGluZyBvZgotICAgICAgICAgICAgICAgIG9iamVjdHMgdGhyb3VnaCB0aGUgc2Vzc2lvbi4gVGhlIHNlc3Npb24gYWxzbyBtYW5hZ2VzCi0gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25zIGFuZCB1bml0cyBvZiB3b3JrLiBUaGUgZGF0YWJhc2Ugc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciB1c2FnZSBpbiB0d28tdGllciBjbGllbnQtc2VydmVyCi0gICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiBBbHRob3VnaCBpdCBjb3VsZCBiZSB1c2VkIGluIGEgc2VydmVyCi0gICAgICAgICAgICAgICAgc2l0dWF0aW9uLCBpdCBpcyBsaW1pdHRlZCB0byBvbmx5IGhhdmluZyBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIG9ubHkgYWxsb3dzIGEgc2luZ2xlIG9wZW4KLSAgICAgICAgICAgICAgICBkYXRhYmFzZSB0cmFuc2FjdGlvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbWFyeS1wcm9qZWN0IiB0eXBlPSJwcm9qZWN0IgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcHJvamVjdCAoY2xhc3Mgb3IgeG1sKSB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCBhcyB0aGUgcHJpbWFyeSBwcm9qZWN0IGZvciB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFkZGl0aW9uYWwtcHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InByb2plY3QiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBwcm9qZWN0cyB3aWxsIGhhdmUgdGhlaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcnMgYXBwZW5kZWQgdG8gdGhlIHByaW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2luIiB0eXBlPSJsb2dpbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItc2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBJcyBhbiBleHRlbnNpb24gb2YgYSBEYXRhYmFzZVNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJkYXRhYmFzZS1zZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29scyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uIHBvb2xzIGFyZSBvbmx5IGZvciB1c2FnZSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsIGNvbm5lY3Rpb24gcG9vbGluZyBhbmQgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkIGlmIHVzaW5nIGV4dGVybmFsIGNvbm5lY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IndyaXRlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9InNlcXVlbmNlLWNvbm5lY3Rpb24tcG9vbCIgdHlwZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0aGlzIHRhZyB0byB1c2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY29ubmVjdGlvbi1wb29sIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXBvbGljeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9saWN5IiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBkZWZhdWx0IGNsaWVudCBzZXNzaW9ucyBhcmUgYWNxdWlyZWQKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXhjbHVzaXZlLWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGlmIGFuIGV4Y2x1c2l2ZSBjb25uZWN0aW9uIHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBmb3IgcmVhZHMsIHJlcXVpcmVkIGZvciBWUEQsIG9yIHVzZXIgYmFzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgc2VjdXJpdHkuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibGF6eSIgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhIGNvbm5lY3Rpb24gc2hvdWxkIGJlIGFjcXVpcmVkIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgaGVsZCB1cGZyb250IGluIHRoZSBjbGllbnQgc2Vzc2lvbiwgb3Igb25seQotICAgICAgICAgICAgICAgICAgICAgICAgYWNxdWlyZWQgd2hlbiBuZWVkZWQgYW5kIHRoZW4gcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyBjb21tb24gZmllbGRzIGZvciBkYXRhYmFzZS1sb2dpbiBhbmQgZWlzLWxvZ2luCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBsYXRmb3JtLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBlbGVtZW50IHRoYXQgcmVwcmVzZW50cyB0aGUgcGxhdGZvcm0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idGFibGUtcXVhbGlmaWVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGRlZmF1bHQgcXVhbGlmaWVyIGZvciBhbGwgdGFibGVzLiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgdGhlIGNyZWF0b3Igb2YgdGhlIHRhYmxlIG9yIGRhdGFiYXNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0YWJsZSBleGlzdHMgb24uIFRoaXMgaXMgcmVxdWlyZWQgYnkgc29tZQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2VzIHN1Y2ggYXMgT3JhY2xlIGFuZCBEQjIuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXh0ZXJuYWwtY29ubmVjdGlvbi1wb29saW5nIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIHNob3VsZCB1c2UgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbm5lY3Rpb24gcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXIiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgc2Vzc2lvbiB3aWxsIGJlIHVzaW5nIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2luZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNpbmcgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IHNlcXVlbmNlLiBUaGUgbmFtZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwuIElmIG5vIG5hbWUgcHJvdmlkZWQgYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtcHR5IHN0cmluZyB3aWxsIGJlIHVzZWQgYXMgYSBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbiBkZWZhdWx0IHNlcXVlbmNlcy4gTWFrZSBzdXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHNlcXVlbmNlIGhhcyB1bmlxdWUgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VxdWVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic2VxdWVuY2UiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgYSBsb2dpbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGV4dHJhIHByb3BlcnRpZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2dpbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZGF0YWJhc2UtbG9naW4iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSG9sZHMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRvIGNvbm5lY3QKLSAgICAgICAgICAgICAgICB0byBhIEpEQkMgZHJpdmVyLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZHJpdmVyLWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkcml2ZXIgY2xhc3MgaXMgdGhlIEphdmEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBmb3IgdGhlIEpEQkMgZHJpdmVyIHRvIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCAoZS5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIFVSTCB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZGF0YXNvdXJjZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgb2YgYSBkYXRhc291cmNlIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSB1c2VkIGJ5IHRoZSBzZXNzaW9uIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlQ29udGVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Imxvb2t1cCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9va3VwLWVudW0iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiaW5kLWFsbC1wYXJhbWV0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBiaW5kIGFsbCBhcmd1bWVudHMgdG8gYW55Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNRTCBzdGF0ZW1lbnQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjYWNoZS1hbGwtc3RhdGVtZW50cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHByZXBhcmVkIHN0YXRlbWVudHMgc2hvdWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNhY2hlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImJ5dGUtYXJyYXktYmluZGluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBiaW5kaW5nIGZvciBsYXJnZSBiaW5hcnkgZGF0YS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFY2xpcHNlTGluayB3aWxsIHByaW50IHRoaXMgZGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBoZXggdGhyb3VnaCB0aGUgSkRCQyBiaW5hcnkgZXhjYXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXVzZS4gQm90aCBiaW5kaW5nIGFuZCBwcmludGluZyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlvdXMgbGltaXRzIG9uIGFsbCBkYXRhYmFzZXMgKGUuZy4gNWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAzMmspLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic3RyaW5nLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiBzdHJpbmdzIHNob3VsZCBiZSBib3VuZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlZCB0byBoZWxwIGJlYW4gaW50cm9zcGVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmVhbXMtZm9yLWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2Ugc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdG9yZSBsYXJnZSBiaW5hcnkgZGF0YS4gVGhpcyBjYW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSB0aGUgbWF4IHNpemUgZm9yIHJlYWRpbmcvd3JpdGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBzb21lIEpEQkMgZHJpdmVycy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZvcmNlLWZpZWxkLW5hbWVzLXRvLXVwcGVyLWNhc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgY2FuIGJlIHVzZWQgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGV4cGVjdHMgdXBwZXIgY2FzZSBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGRvZXMgbm90IHJldHVybiBjb25zaXN0ZW50IGNhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gZGlmZmVyZW50IGRhdGFiYXNlcykuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvcHRpbWl6ZS1kYXRhLWNvbnZlcnNpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIGRyaXZlciBsZXZlbCBkYXRhIGNvbnZlcnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemF0aW9uIGlzIGVuYWJsZWQuIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkIGFzIHNvbWUgZHJpdmVycyBwZXJmb3JtIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbiB0aGVtc2VsdmVzIGluY29ycmVjdGx5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJpbS1zdHJpbmdzIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IENIQVIgZmllbGQgdmFsdWVzIGhhdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmcgYmxhbmtzIHRyaW1tZWQsIHRoaXMgY2FuIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJiYXRjaC13cml0aW5nIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcuIFRoaXMgZmFjaWxpdHkgYWxsb3dzIG11bHRpcGxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlIG9wZXJhdGlvbnMgdG8gYmUgc3VibWl0dGVkIHRvIGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgZm9yIHByb2Nlc3NpbmcgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VibWl0dGluZyBtdWx0aXBsZSB1cGRhdGVzIHRvZ2V0aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mIGluZGl2aWR1YWxseSwgY2FuIGdyZWF0bHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqZGJjLWJhdGNoLXdyaXRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhpcyB0YWcgd2l0aCB0cnVlIGluZGljYXRlcyB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayB0aGF0IHRoZSBKREJDIGRyaXZlciBzdXBwb3J0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaCB3cml0aW5nLiBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmcgaXMgZGlzYWJsZWQuIFNldHRpbmcgdGhpcyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBmYWxzZSBpbmRpY2F0ZXMgdG8gRWNsaXBzZUxpbmsgdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkRCQyBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIHdpbGwgcmV2ZXJ0IHRvIHRoZSBkZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW91ciB3aGljaCBpcyB0byBkZWxlZ2F0ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluaydzIGludGVybmFsIGJhdGNoIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtYmF0Y2gtd3JpdGluZy1zaXplIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMyMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3cgZm9yIHRoZSBtYXggYmF0Y2ggd3JpdGluZyBzaXplIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNldC4gVGhpcyBhbGxvd3MgZm9yIHRoZSBiYXRjaCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGxpbWl0ZWQgYXMgbW9zdCBkYXRhYmFzZSBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdCBsaW1pdHMuIFRoZSBzaXplIGlzIGluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMsIHRoZSBkZWZhdWx0IGlzIDMyMDAwIGJ1dCB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbCB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBkYXRhYmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmF0aXZlLXNxbCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBzcGVjaWZpYyBzcWwgZ3JhbW1hciBub3QgSkRCQwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYy4gVGhpcyBpcyBiZWNhdXNlIHVuZm9ydHVuYXRlbHkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29tZSBicmlkZ2VzIHRvIG5vdCBzdXBwb3J0IHRoZSBmdWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgc3RhbmRhcmQuIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgdXNlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgSkRCQyBzcWwgZ3JhbW1hci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpncm91cCByZWY9InN0cnVjdC1jb252ZXJ0ZXJzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWhlYWx0aC12YWxpZGF0ZWQtb24tZXJyb3IiIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5JZiB0cnVlIHdpbGwgY2F1c2UgRWNsaXBzZUxpbmsgdG8gcGluZyBkYXRhYmFzZSB0byBkZXRlcm1pbmUgaWYgYW4gU1FMRXhjZXB0aW9uIHdhcyBjYXVzZSBieSBhIGNvbW11bmljYXRpb24gZmFpbHVyZTwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icXVlcnktcmV0cnktYXR0ZW1wdC1jb3VudCIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGF0dGVtcHRzIEVjbGlwc2VMaW5rIHdpbGwgbWFrZSBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkZWxheS1iZXR3ZWVuLXJlY29ubmVjdC1hdHRlbXB0cyIgdHlwZT0ieHNkOmludGVnZXIiIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPkNvbmZpZ3VyZSB0aGUgdGltZSBpbiBtaWxpc2Vjb25kcyB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgd2FpdCBiZXR3ZWVuIGF0dGVtcHRzIHRvIHJlY29ubmVjdCBpZiBFY2xpcHNlTGluayBpcyBhdHRlbXB0aW5nIHRvIHJldHJ5IGEgcXVlcnkuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLQkJCQkJCTwveHNkOmFubm90YXRpb24+Ci0JCQkJCTwveHNkOmVsZW1lbnQ+Ci0JCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJwaW5nLXNxbCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+T3ZlcnJpZGUgdGhlIHBsYXRmb3JtIHNwZWNpZmljIFNRTCB0aGF0IEVjbGlwc2VMaW5rIHdpbGwgaXNzdWUgdG8gYSBjb25uZWN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgY29ubmVjdGlvbiBpcyBzdGlsbCBsaXZlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0ibG9va3VwLWVudW0iPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG9zaXRlLW5hbWUiIC8+Ci0gICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJjb21wb3VuZC1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ic3RyaW5nIiAvPgotICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWlzLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBhbmQgZGF0YXNvdXJjZQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGNvbm5lY3QgdGhyb3VnaCBFSVMsCi0gICAgICAgICAgICAgICAgLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZSBDb25uZWN0aW9uRmFjdG9yeSBhbmQgdXNlCi0gICAgICAgICAgICAgICAgdGhlIGRlZmF1bHQgZ2V0Q29ubmVjdGlvbiAtIFByb3ZpZGUgYSBKTkRJIG5hbWUgdG8gdGhlCi0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbkZhY3RvcnksIGFuZCBhIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uU3BlYwotICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIGdldENvbm5lY3Rpb24gLSBDb25uZWN0IGluIGEgbm9uLW1hbmFnZWQKLSAgICAgICAgICAgICAgICB3YXkgZGlyZWN0bHkgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBDb25uZWN0aW9uRmFjdG9yeSBBbgotICAgICAgICAgICAgICAgIEVJU0Nvbm5lY3Rpb25TcGVjIG11c3QgYmUgcHJvdmlkZWQgdG8gZGVmaW5lIGhvdyB0bwotICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIEVJUyBhZGFwdGVyLiBUaGUgRUlTIHBsYXRmb3JtIGNhbiBiZSB1c2VkCi0gICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBkYXRhc291cmNlL2RyaXZlciBzcGVjaWZpYyBiZWhhdm9pciBzdWNoIGFzCi0gICAgICAgICAgICAgICAgSW50ZXJhY3Rpb25TcGVjIGFuZCBSZWNvcmQgY29udmVyc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tc3BlYy1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tZmFjdG9yeS11cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLWxvZ2luIj4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCURlZmluZXMgbG9naW4gYW5kIHBsYXRmb3JtIHR5cGUgdG8gYmUgdXNlZAotICAgIAkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAJPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZ2luIj4KLSAgICAJCQk8eHNkOnNlcXVlbmNlPgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZXF1YWwtbmFtZXNwYWNlLXJlc29sdmVycyIKLSAgICAJCQkJCXR5cGU9InhzZDpib29sZWFuIiBtYXhPY2N1cnM9IjEiIG1pbk9jY3Vycz0iMCI+Ci0gICAgCQkJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5IgotICAgIAkJCQkJbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiCi0gICAgCQkJCQl0eXBlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLQotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCTwveHNkOnNlcXVlbmNlPgotICAgIAkJPC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVc2VkIHRvIHNwZWNpZnkgaG93IGNvbm5lY3Rpb25zIHNob3VsZCBiZSBwb29sZWQgaW4gYQotICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1heC1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBpbiB0aGUgcG9vbAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im1pbi1jb25uZWN0aW9ucyIgdHlwZT0ieHNkOmludGVnZXIiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtaW4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRoYXQgd2lsbCBhd2F5cyBiZQotICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWFkLWNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGUgcmVhZCBjb25uZWN0aW9uIHBvb2wgaXMgdXNlZCBmb3IgcmVhZCBhY2Nlc3MgdGhyb3VnaAotICAgICAgICAgICAgICAgIHRoZSBzZXJ2ZXIgc2Vzc2lvbi4gQW55IG9mIHRoZSBjb25uZWN0aW9uIHBvb2xzIGNhbiBiZQotICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSByZWFkIHBvb2wgaG93ZXZlciB0aGlzIGlzIHRoZSBkZWZhdWx0LiBUaGlzCi0gICAgICAgICAgICAgICAgcG9vbCBhbGxvd3MgZm9yIGNvbmN1cnJlbnQgcmVhZHMgYWdhaW5zdCB0aGUgc2FtZSBKREJDCi0gICAgICAgICAgICAgICAgY29ubmVjdGlvbiBhbmQgcmVxdWlyZXMgdGhhdCB0aGUgSkRCQyBjb25uZWN0aW9uIHN1cHBvcnQKLSAgICAgICAgICAgICAgICBjb25jdXJyZW50IHJlYWQgYWNjZXNzLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImNvbm5lY3Rpb24tcG9vbCI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBpZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgZnJvbSB0aGUgcmVhZCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wgYXJlIGV4Y2x1c2l2ZSBvciBub3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgY29tbW9uIGxvZ2dpbmcgb3B0aW9ucwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImphdmEtbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEphdmEgbG9nCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9nIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZy1vcHRpb25zIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ibG9nZ2luZy1vcHRpb25zIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZWNsaXBzZWxpbmstbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIEVjbGlwc2VMaW5rIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1sZXZlbCIgZGVmYXVsdD0iaW5mbyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBsb2cgbGV2ZWwgZm9yIGxvZ2dpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJvZmYiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InNldmVyZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0id2FybmluZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iaW5mbyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29uZmlnIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJmaW5lciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXN0IiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJhbGwiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZmlsZS1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgb2YgdGhlIGZpbGUgdG8gd3JpdGUgdGhlIGxvZ2dpbmcgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1sb2ciPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGVmaW5lcyB0aGUgb3B0aW9ucyBvZiB0aGUgU2VydmVyIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZy1leGNlcHRpb24tc3RhY2t0cmFjZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZXhjZXB0aW9uIHN0YWNrdHJhY2UuIFdpdGhvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZWxlbWVudCwgdGhlIHN0YWNrdHJhY2UgaXMgbG9nZ2VkIGZvciBGSU5FUgotICAgICAgICAgICAgICAgICAgICAgICAgb3IgbGVzcyAoRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXRocmVhZCIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgdGhyZWFkLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQgaXMgbG9nZ2VkIGZvciBGSU5FIG9yIGxlc3MgKEZJTkVSIG9yCi0gICAgICAgICAgICAgICAgICAgICAgICBGSU5FU1QpCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtc2Vzc2lvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBzZXNzaW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBzZXNzaW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtY29ubmVjdGlvbiIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBjb25uZWN0aW9uLiBXaXRob3V0IHRoaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIHRoZSBjb25uZWN0aW9uIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJpbnQtZGF0ZSIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNldCB3aGV0aGVyIHRvIGxvZyBkYXRlLiBXaXRob3V0IHRoaXMgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkYXRlIGlzIGFsd2F5cyBwcmludGVkCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIHRyYW5zcG9ydCBtZWNoYW5pc20gb2YgdGhlIFJDTS4KLSAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB0cmFuc3BvcnQgbWVjaGFuaXNtIGlzIFJNSQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvbi1jb25uZWN0aW9uLWVycm9yIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IkRpc2NhcmRDb25uZWN0aW9uIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFuZCBoYXMgdmFsdWUgb2YgIkRpc2NhcmRDb25uZWN0aW9uIiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgIktlZXBDb25uZWN0aW9uIi4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIHRvIGEgUkNNIHNlcnZpY2Ugc2hvdWxkIGJlIGRyb3BwZWQgaWYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGEgY29tbXVuaWNhdGlvbiBlcnJvciB3aXRoIHRoYXQgUkNNCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGlzY2FyZENvbm5lY3Rpb24iLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iS2VlcENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJEaXNjYXJkQ29ubmVjdGlvbiIgLz4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZWZpbmVzIHRoZSBSTUkgdHJhbnNwb3J0IG1lY2hhbmlzbS4gVGhlCi0gICAgICAgICAgICAgICAgZGVmYXVsdCBuYW1pbmcgc2VydmljZSBpcyBKTkRJCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZW5kLW1vZGUiIGRlZmF1bHQ9IkFzeW5jaHJvbm91cyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY2hyb25vdXMiIG9yICJTeW5jaHJvbm91cyIuIEl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZXMgd2hldGhlciB0aGUgUkNNIHByb3BhZ2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBhbmQgZG9lcyBub3Qgd2FpdCBmb3IgY29tbWFuZCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2ggaXRzIGV4ZWN1dGlvbiBpbiBhc3luY2hyb25vdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBvciB3YWl0IGZvciBjb21tYW5kIHRvIGZpbmlzaCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIGluIHN5bmNocm9ub3VzIG1vZGUuIFRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJBc3luY2hyb25vdXMiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IlN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRpc2NvdmVyeSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJtaSBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvdmVyeSBzZXR0aW5ncyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGEgZGVmYXVsdCBEaXNjb3Zlcnkgd2l0aCBpdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBzZXR0aW5ncyBpcyBjcmVhdGVkIHdoZW4gdGhlIHJtaQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzIHNwZWNpZmllZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJtdWx0aWNhc3QtZ3JvdXAtYWRkcmVzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjIyNi4xMC4xMi42NCIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibXVsdGljYXN0LXBvcnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50ZWdlciIgZGVmYXVsdD0iMzEyMSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYW5ub3VuY2VtZW50LWRlbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjEwMDAiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIG11bHRpY2FzdCBncm91cAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIHNob3VsZCBiZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgaXMgIjEwMDAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYWNrZXQtdGltZS10by1saXZlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdGhlIHRpbWUtdG8tbGl2ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFja2V0cyB0aGF0IGFyZSBzZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIERpc2NvdmVyeSdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHN0aWNhc3Qgc29ja2V0IHNob3VsZCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkLiBUaGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGlzIGVsZW1lbnQgaXMgIjIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJybWktcmVnaXN0cnktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHJtaSBlbGVtZW5lbnQuIEl0IGRldGVybWluZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgUk1JIHJlZ2lzdHJ5IHNob3VsZCBiZSB1c2VkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icm1pLWlpb3AtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBSTUktSUlPUCB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mCi0gICAgICAgICAgICAgICAgdGhlIFJDTS4gVGhlIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InJtaS10cmFuc3BvcnQiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iam1zLXRvcGljLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgSk1TIHRvcGljIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1ob3N0LXVybCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLWNvbm5lY3Rpb24tZmFjdG9yeS1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWNDb25uZWN0aW9uRmFjdG9yeSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJqbXMvRWNsaXBzZUxpbmtUb3BpYyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImpuZGktbmFtaW5nLXNlcnZpY2UiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai1qZ3JvdXBzLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgT0M0SiBKR3JvdXBzIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2Utc2luZ2xlLXRocmVhZGVkLW5vdGlmaWNhdGlvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzdW4tY29yYmEtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSBTdW4gQ09SQkEgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgIG9mIHRoZSBSQ00KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ0cmFuc3BvcnQtbWFuYWdlciIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1c2VyLWRlZmluZWQtdHJhbnNwb3J0Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZXMgd2hldGhlciBhIHVzZXIgaW1wbGVtZW50ZWQKLSAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIHRoYXQgc2hvdWxkIGJlIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0cmFuc3BvcnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBVUkwgZm9yIG5hbWluZyBzZXJ2aWNlIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1c2VyLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0iYWRtaW4iIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmNyeXB0aW9uLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLnNlY3VyaXR5LkpDRUVuY3J5cHRvciIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFzc3dvcmQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgZGVmYXVsdD0icGFzc3dvcmQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgIDwhLS0gIFRPRE86IE5lZWQgdG8gaGF2ZSBhIG5vbiBXZWJMb2dpYyAocHJldmlvdXNseSBPQzRKKSBkZWZhdWx0IG9yIHJvdXRlIHRocm91Z2ggc2VydmVyIHBsYXRmb3JtIGJ5IGRlZmF1bHQgLS0+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC1jb250ZXh0LWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IndlYmxvZ2ljLmpuZGkuV0xJbml0aWFsQ29udGV4dEZhY3RvcnkiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsIGNvbnRleHQgZmFjdG9yeSBjbGFzcyBmb3IgbmFtaW5nIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjaGFuZ2VkLiAKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mCi0gICAgICAgICAgICAgICAgICAgICAgICBqbmRpLW5hbWluZy1zZXJ2aWNlLiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWluZyBzZXJ2aWNlIHJlcXVpcmVzIGV4dHJhIHByb3BlcnR5IHRoYXQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBkZWZpbmVkIGJ5IEVjbGlwc2VMaW5rIGJ1dCBpdCBpcyByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXBwbGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmdyb3VwIG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzZXMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWxpc3RlbmVyLWNsYXNzIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Z3JvdXAgbmFtZT0ic3RydWN0LWNvbnZlcnRlcnMiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cnVjdC1jb252ZXJ0ZXIiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Z3JvdXA+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5TZXF1ZW5jZSBvYmplY3QuPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmVhbGxvY2F0aW9uLXNpemUiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjUwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRlZmF1bHQtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgUmVmZXJlbmNlcyBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwgb3ZlcnJpZGluZyBpdHMgbmFtZQotICAgICAgICAgICAgICAgIGFuZCAob3B0aW9uYWxseSkgcHJlYWxsb2NhdGlvbiBzaXplLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUbyB1c2UgcHJlYWxsb2NhdGlvbiBzaXplIG9mIGRlZmF1bHQgc2VxdWVuY2Ugb2JqZWN0LAotICAgICAgICAgICAgICAgIHNldCBwcmVhbGxvY2F0aW9uIHNpemUgdG8gMAotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5hdGl2ZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEYXRhYmFzZSBzZXF1ZW5jZSBtZWNoYW5pc20gdXNlZC4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ0YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5UYWJsZSBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1maWVsZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfQ09VTlQiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InVuYXJ5LXRhYmxlLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVuYXJ5IHRhYmxlIHNlcXVlbmNlIC0gc2VxdWVuY2UgbmFtZSBpcyBhIHRhYmxlIG5hbWUsCi0gICAgICAgICAgICAgICAgdGFibGUgaGFzIGEgc2luZ2xlIGZpZWxkIGFuZCBhIHNpbmdsZSByb3cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFVRU5DRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sZmlsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj5YbWxmaWxlIHNlcXVlbmNlLjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sIHNlcXVlbmNlPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcXVlbmNlIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icm9vdC1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZS1lbGVtZW50IiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX05BTUUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY291bnRlci1lbGVtZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLQotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggZG9jdW1lbnQgcHJlc2VydmF0aW9uCi0gICAgICAgIAkJc3RyYXRlZ3kgd2lsbCBiZSB1c2VkLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAJCTx4c2Q6ZWxlbWVudCBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSIKLSAgICAJCQl0eXBlPSJub2RlLW9yZGVyaW5nLXBvbGljeSIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJPC94c2Q6ZWxlbWVudD4KLSAgICAJPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij4KLSAgICAJPHhzZDphbm5vdGF0aW9uPgotICAgIAkJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgIAkJCVRoaXMgZWxlbWVudCBzcGVjaWZpZXMgd2hpY2ggbm9kZSBvcmRlcmluZyBzdHJhdGVneSB3aWxsCi0gICAgCQkJYmUgdXNlZC4KLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+PC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlCi0gICAgCW5hbWU9ImRlc2NyaXB0b3ItbGV2ZWwtZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvbiBQb2xpY3kgdGhhdAotICAgICAgICAJCWFjY2Vzc2VzIHRoZSBzZXNzaW9uIGNhY2hlIHRvIHN0b3JlIE9iamVjdHMgYW5kIHRoZWlyCi0gICAgICAgIAkJYXNzb2NpYXRlZCBub2Rlcy4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuby1kb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUEgRG9jdW1lbnRQcmVzZXJ2YXRpb25Qb2xpY3kgdG8gaW5kaWNhdGUgdGhhdCBubwotICAgICAgICAJCWRvY3VtZW50IHByZXNlcnZhdGlvbiB3b3JrIHNob3VsZCBiZSBkb25lLgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1iaW5kZXItcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRoYXQKLSAgICAgICAgCQltYWludGFpbnMgYmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXBzIGJldHdlZW4gSmF2YQotICAgICAgICAJCU9iamVjdHMgYW5kIHRoZSBYTUxOb2RlcyB0aGV5IG9yaWdpbmF0ZWQgZnJvbS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJhcHBlbmQtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBzaW1wbHkKLSAgICAgICAgCQlhcHBlbmRzIHRoZSBuZXcgY2hpbGQgZWxlbWVudCB0byB0aGUgcGFyZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJpZ25vcmUtbmV3LWVsZW1lbnRzLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBOb2RlT3JkZXJpbmdQb2xpY3kgdGhhdCBpZ25vcmVzIGFueQotICAgICAgICAJCW5ldyBlbGVtZW50cyB3aGVuIHVwZGF0aW5nIGEgY2FjaGVkIGRvY3VtZW50LgotICAgICAgICAJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAJCTx4c2Q6ZXh0ZW5zaW9uIGJhc2U9Im5vZGUtb3JkZXJpbmctcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJyZWxhdGl2ZS1wb3NpdGlvbi1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgYWRkcyBuZXcKLSAgICAgICAgCQllbGVtZW50cyB0byBhbiBYTUwgRG9jdW1lbnQgYmFzZWQgb24gdGhlIGxhc3QgdXBkYXRlZAotICAgICAgICAJCXNpYmxpbmcgaW4gdGhlaXIgY29udGV4dC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLTwveHNkOnNjaGVtYT4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc2NoZW1hcy9lY2xpcHNlbGlua19zZXNzaW9uc18yLjAueHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODQ4MjFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zY2hlbWFzL2VjbGlwc2VsaW5rX3Nlc3Npb25zXzIuMC54c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQ29weXJpZ2h0IChjKSAxOTk4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSBDb250cmlidXRvcnM6Ci0gICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiBmcm9tIE9yYWNsZSBUb3BMaW5rCi0gICAgIHR3YXJlIC0gdXBkYXRlIHZlcnNpb24gbnVtYmVyIHRvIDIuMAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAKLS0tPgotPCEtLSAKLQotWE1MIFNjaGVtYSBkZWZpbml0aW9uIGZvciB0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0IFNlc3Npb24gQ29uZmlndXJhdGlvbiBmaWxlLiBJbnN0YW5jZXMKLW9mIHRoaXMgZmlsZSBhcmUgdHlwaWNhbGx5IGxvY2F0ZWQgYXM6ICdNRVRBLUlORi9zZXNzaW9ucy54bWwnCi0KLSAtLT4KLQotPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKLSAgICBlbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCIgdmVyc2lvbj0iMi4wIj4KLSAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbnMiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50IGFuZCBleGlzdHMgb25seSBmb3IgWE1MCi0gICAgICAgICAgICAgICAgc3RydWN0dXJlCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbiIgdHlwZT0ic2Vzc2lvbiIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8L3hzZDplbGVtZW50PgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2Vzc2lvbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgYSBwYXJ0aWN1bGFyIHNlc3Npb24KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljIGVsZW1lbnQgdXNlZCB0byBkZXNjcmliZSBhIHN0cmluZyB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSBuYW1lIG9mIGFuIGl0ZW0KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXJ2ZXItcGxhdGZvcm0iIHR5cGU9InNlcnZlci1wbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmNob2ljZSBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJyZW1vdGUtY29tbWFuZCI+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gZWxlbWVudCB0aGF0IGRlZmluZSB0aGUgUmVtb3RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZCBNb2R1bGUgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlIHN5bmNocm9uaXphdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IkVjbGlwc2VMaW5rQ29tbWFuZENoYW5uZWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbW1hbmRzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBvZiByZW1vdGUtY29tbWFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuIEl0IGRldGVybWluZSB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmZWF0dXJlcywgdGhlIFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtc3luYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZWxlbWVudC4gSXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXJucyBvbiBjYWNoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXphdGlvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93IHNlbmRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2aW5nIGNhY2hlIHN5bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zcG9ydCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0idHJhbnNwb3J0LW1hbmFnZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9mIHJlbW90ZS1jb21tYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFJNSQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8L3hzZDpjaG9pY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmdyb3VwIHJlZj0iZXZlbnQtbGlzdGVuZXItY2xhc3NlcyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvZmlsZXIiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgcmVwcmVzZW50cyBpZiB0aGUgcHJvZmlsZXIgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCBieSB0aGUgc2Vzc2lvbgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpzaW1wbGVUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InhzZDpzdHJpbmciPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZG1zIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZWNsaXBzZWxpbmsiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2VwdGlvbi1oYW5kbGVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjbGFzcyB0aGF0IHRoZSBzZXNzaW9uIHdpbGwgdXNlIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZnJvbSB3aXRoaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9nZ2luZyIgdHlwZT0ibG9nIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9nZ2luZyBvcHRpb25zCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1jdXN0b21pemVyLWNsYXNzIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHRoZSBzZXNzaW9uIGN1c3RvbWl6ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRvIHJ1biBvbiBhIGxvYWRlZCBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBub2RlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgd2hpY2ggc2VydmVyCi0gICAgICAgICAgICAgICAgcGxhdGZvcm0gdG8gdXNlLCBKVEEgc2V0dGluZ3MgYW5kIHJ1bnRpbWUgc2VydmljZXMKLSAgICAgICAgICAgICAgICBzZXR0aW5ncwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJlbmFibGUtcnVudGltZS1zZXJ2aWNlcyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50LiBUaGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hldGhlciBvciBub3QgdGhlIEpNWCBNQmVhbiBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBydW50aW1lIHNlcnZpY2VzIGlzIGRlcGxveWVkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImVuYWJsZS1qdGEiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudC4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoaXMgc2Vzc2lvbiB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGUgd2l0aCB0aGUgSlRBIChpLmUuIHdoZXRoZXIgdGhlIHNlc3Npb24KLSAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcy4gVGhlIGNob2ljZSBvZiBzZXJ2ZXItY2xhc3Mgd2lsbAotICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBiZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRyYW5zYWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iY3VzdG9tLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcnZlci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnBsYXRmb3JtLnNlcnZlci5DdXN0b21TZXJ2ZXJQbGF0Zm9ybSIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBzdWJjbGFzcyBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5wbGF0Zm9ybS5zZXJ2ZXIuUGxhdGZvcm1CYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNwZWNpZnkgd2hpY2ggc2VydmVyIHBsYXRmb3JtIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9ImV4dGVybmFsLXRyYW5zYWN0aW9uLWNvbnRyb2xsZXItY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai05MDMtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotOTA0LXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJvYzRqLTEwMTItcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotMTAxMy1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ib2M0ai0xMTExLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTYxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJsb2dpYy03MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2VibG9naWMtODEtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTktcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYmxvZ2ljLTEwLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNDAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS01MC1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTUxLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ3ZWJzcGhlcmUtNjAtcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9IndlYnNwaGVyZS02MS1wbGF0Zm9ybSI+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXJ2ZXItcGxhdGZvcm0iIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0id2Vic3BoZXJlLTctcGxhdGZvcm0iPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VydmVyLXBsYXRmb3JtIiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Impib3NzLXBsYXRmb3JtIj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InNlcnZlci1wbGF0Zm9ybSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXNzaW9uLWJyb2tlciI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBQcm92aWRlcyBhIHNpbmdsZSB2aWV3IHRvIGEgc2Vzc2lvbiB0aGF0Ci0gICAgICAgICAgICAgICAgdHJhbnNwYXJlbnRseSBhY2Nlc3NlcyBtdWx0cGxlIGRhdGFiYXNlcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXNzaW9uIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2Vzc2lvbi1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0icHJvamVjdCI+Ci0gICAgICAgIDx4c2Q6cmVzdHJpY3Rpb24gYmFzZT0ieHNkOnN0cmluZyIgLz4KLSAgICA8L3hzZDpzaW1wbGVUeXBlPgotICAgIDx4c2Q6c2ltcGxlVHlwZSBuYW1lPSJ4bWwiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOnNpbXBsZVR5cGUgbmFtZT0iY2xhc3MiPgotICAgICAgICA8eHNkOnJlc3RyaWN0aW9uIGJhc2U9InByb2plY3QiIC8+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHNlc3Npb24gaXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGludG8gRWNsaXBzZUxpbmssIHRoZQotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNob3VsZCBkbyBhbGwgb2YgaXRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgb2YKLSAgICAgICAgICAgICAgICBvYmplY3RzIHRocm91Z2ggdGhlIHNlc3Npb24uIFRoZSBzZXNzaW9uIGFsc28gbWFuYWdlcwotICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9ucyBhbmQgdW5pdHMgb2Ygd29yay4gVGhlIGRhdGFiYXNlIHNlc3Npb24gaXMKLSAgICAgICAgICAgICAgICBpbnRlbmRlZCBmb3IgdXNhZ2UgaW4gdHdvLXRpZXIgY2xpZW50LXNlcnZlcgotICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucy4gQWx0aG91Z2ggaXQgY291bGQgYmUgdXNlZCBpbiBhIHNlcnZlcgotICAgICAgICAgICAgICAgIHNpdHVhdGlvbiwgaXQgaXMgbGltaXR0ZWQgdG8gb25seSBoYXZpbmcgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBvbmx5IGFsbG93cyBhIHNpbmdsZSBvcGVuCi0gICAgICAgICAgICAgICAgZGF0YWJhc2UgdHJhbnNhY3Rpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW1hcnktcHJvamVjdCIgdHlwZT0icHJvamVjdCIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb2plY3QgKGNsYXNzIG9yIHhtbCkgd2lsbCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgYXMgdGhlIHByaW1hcnkgcHJvamVjdCBmb3IgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJhZGRpdGlvbmFsLXByb2plY3QiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJwcm9qZWN0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWwgcHJvamVjdHMgd2lsbCBoYXZlIHRoZWlyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzIGFwcGVuZGVkIHRvIHRoZSBwcmltYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dpbiIgdHlwZT0ibG9naW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VydmVyLXNlc3Npb24iPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgSXMgYW4gZXh0ZW5zaW9uIG9mIGEgRGF0YWJhc2VTZXNzaW9uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0iZGF0YWJhc2Utc2Vzc2lvbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbHMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBwb29scyBhcmUgb25seSBmb3IgdXNhZ2Ugd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCBjb25uZWN0aW9uIHBvb2xpbmcgYW5kIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZCBpZiB1c2luZyBleHRlcm5hbCBjb25uZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlYWQtY29ubmVjdGlvbi1wb29sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ3cml0ZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJzZXF1ZW5jZS1jb25uZWN0aW9uLXBvb2wiIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhpcyB0YWcgdG8gdXNlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbm5lY3Rpb24tcG9vbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImNvbm5lY3Rpb24tcG9vbCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1wb2xpY3kiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJjb25uZWN0aW9uLXBvbGljeSIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbm5lY3Rpb24tcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFVzZWQgdG8gc3BlY2lmeSBob3cgZGVmYXVsdCBjbGllbnQgc2Vzc2lvbnMgYXJlIGFjcXVpcmVkCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4Y2x1c2l2ZS1jb25uZWN0aW9uIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBpZiBhbiBleGNsdXNpdmUgY29ubmVjdGlvbiBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIHJlYWRzLCByZXF1aXJlZCBmb3IgVlBELCBvciB1c2VyIGJhc2VkCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFkIHNlY3VyaXR5LgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxhenkiIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaWYgYSBjb25uZWN0aW9uIHNob3VsZCBiZSBhY3F1aXJlZCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlbGQgdXBmcm9udCBpbiB0aGUgY2xpZW50IHNlc3Npb24sIG9yIG9ubHkKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjcXVpcmVkIHdoZW4gbmVlZGVkIGFuZCB0aGVuIHJlbGVhc2VkLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgY29tbW9uIGZpZWxkcyBmb3IgZGF0YWJhc2UtbG9naW4gYW5kIGVpcy1sb2dpbgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwbGF0Zm9ybS1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgdGhlIHBsYXRmb3JtCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBuYW1lCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgdXNlZCBpbiB0aGUgbG9naW4gYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlIFN5bmNocm9uaXphdGlvbiBmZWF0dXJlCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyB1c2VkIGluIHRoZSBsb2dpbiBhcyB3ZWxsIGFzIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgU3luY2hyb25pemF0aW9uIGZlYXR1cmUKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXNzd29yZCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIHVzZWQgaW4gdGhlIGxvZ2luIGFzIHdlbGwgYXMgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZSBTeW5jaHJvbml6YXRpb24gZmVhdHVyZQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRhYmxlLXF1YWxpZmllciIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBkZWZhdWx0IHF1YWxpZmllciBmb3IgYWxsIHRhYmxlcy4gVGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHRoZSBjcmVhdG9yIG9mIHRoZSB0YWJsZSBvciBkYXRhYmFzZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGFibGUgZXhpc3RzIG9uLiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlcyBzdWNoIGFzIE9yYWNsZSBhbmQgREIyLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV4dGVybmFsLWNvbm5lY3Rpb24tcG9vbGluZyIKLSAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gdHJ1ZSBpZiB0aGUgY29ubmVjdGlvbiBzaG91bGQgdXNlIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb25uZWN0aW9uIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleHRlcm5hbC10cmFuc2FjdGlvbi1jb250cm9sbGVyIgotICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgdGhlIHNlc3Npb24gd2lsbCBiZSB1c2luZyBhbgotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgdHJhbnNhY3Rpb24gY29udHJvbGxlcgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jaW5nIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgPHhzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBzZXF1ZW5jZS4gVGhlIG5hbWUgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsLiBJZiBubyBuYW1lIHByb3ZpZGVkIGFuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eSBzdHJpbmcgd2lsbCBiZSB1c2VkIGFzIGEgbmFtZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzZXF1ZW5jZXMiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24gZGVmYXVsdCBzZXF1ZW5jZXMuIE1ha2Ugc3VyZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZXF1ZW5jZSBoYXMgdW5pcXVlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InNlcXVlbmNlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InNlcXVlbmNlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eSIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIGEgbG9naW4uCi0gICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyB1c2VkIHRvIGRlZmluZSBleHRyYSBwcm9wZXJ0aWVzIG9uIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgbG9naW4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzZT0icmVxdWlyZWQiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImRhdGFiYXNlLWxvZ2luIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIEhvbGRzIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBjb25uZWN0Ci0gICAgICAgICAgICAgICAgdG8gYSBKREJDIGRyaXZlci4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpjaG9pY2UgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRyaXZlci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZHJpdmVyIGNsYXNzIGlzIHRoZSBKYXZhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgZm9yIHRoZSBKREJDIGRyaXZlciB0byBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4uamRiYy5vZGJjLkpkYmNPZGJjRHJpdmVyLmNsYXNzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBVUkwgdGhhdCB3aWxsIGJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBjb25uZWN0IHRvIHRoZSBkYXRhYmFzZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImRhdGFzb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgVVJMIG9mIGEgZGF0YXNvdXJjZSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgdXNlZCBieSB0aGUgc2Vzc2lvbiB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZUNvbnRlbnQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsb29rdXAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Imxvb2t1cC1lbnVtIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpzaW1wbGVDb250ZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmluZC1hbGwtcGFyYW1ldGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIiBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gYmluZCBhbGwgYXJndW1lbnRzIHRvIGFueQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUUwgc3RhdGVtZW50LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iY2FjaGUtYWxsLXN0YXRlbWVudHMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBwcmVwYXJlZCBzdGF0ZW1lbnRzIHNob3VsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjYWNoZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJieXRlLWFycmF5LWJpbmRpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0idHJ1ZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgYmluZGluZyBmb3IgbGFyZ2UgYmluYXJ5IGRhdGEuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgRWNsaXBzZUxpbmsgd2lsbCBwcmludCB0aGlzIGRhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgaGV4IHRocm91Z2ggdGhlIEpEQkMgYmluYXJ5IGV4Y2FwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGF1c2UuIEJvdGggYmluZGluZyBhbmQgcHJpbnRpbmcgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpb3VzIGxpbWl0cyBvbiBhbGwgZGF0YWJhc2VzIChlLmcuIDVrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gMzJrKS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0cmluZy1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRvIHRydWUgaWYgc3RyaW5ncyBzaG91bGQgYmUgYm91bmQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gaGVscCBiZWFuIGludHJvc3BlY3Rpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJlYW1zLWZvci1iaW5kaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gdXNlIHN0cmVhbXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcmUgbGFyZ2UgYmluYXJ5IGRhdGEuIFRoaXMgY2FuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgdGhlIG1heCBzaXplIGZvciByZWFkaW5nL3dyaXRpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gc29tZSBKREJDIGRyaXZlcnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJmb3JjZS1maWVsZC1uYW1lcy10by11cHBlci1jYXNlIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzZXR0aW5nIGNhbiBiZSB1c2VkIGlmIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBleHBlY3RzIHVwcGVyIGNhc2UgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhYmFzZSBkb2VzIG5vdCByZXR1cm4gY29uc2lzdGVudCBjYXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGRpZmZlcmVudCBkYXRhYmFzZXMpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib3B0aW1pemUtZGF0YS1jb252ZXJzaW9uIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciBkcml2ZXIgbGV2ZWwgZGF0YSBjb252ZXJzaW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGltaXphdGlvbiBpcyBlbmFibGVkLiBUaGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBhcyBzb21lIGRyaXZlcnMgcGVyZm9ybSBkYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24gdGhlbXNlbHZlcyBpbmNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyaW0tc3RyaW5ncyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBDSEFSIGZpZWxkIHZhbHVlcyBoYXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nIGJsYW5rcyB0cmltbWVkLCB0aGlzIGNhbiBiZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmVkLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYmF0Y2gtd3JpdGluZyIgdHlwZT0ieHNkOmJvb2xlYW4iCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJmYWxzZSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjbGlwc2VMaW5rIGNhbiBiZSBjb25maWd1cmVkIHRvIHVzZSBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nLiBUaGlzIGZhY2lsaXR5IGFsbG93cyBtdWx0aXBsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBvcGVyYXRpb25zIHRvIGJlIHN1Ym1pdHRlZCB0byBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFiYXNlIGZvciBwcm9jZXNzaW5nIGF0IG9uY2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ym1pdHRpbmcgbXVsdGlwbGUgdXBkYXRlcyB0b2dldGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCBvZiBpbmRpdmlkdWFsbHksIGNhbiBncmVhdGx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBzaXR1YXRpb25zLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iamRiYy1iYXRjaC13cml0aW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nIHRoaXMgdGFnIHdpdGggdHJ1ZSBpbmRpY2F0ZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsgdGhhdCB0aGUgSkRCQyBkcml2ZXIgc3VwcG9ydHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmF0Y2ggd3JpdGluZy4gRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0aW5nIGlzIGRpc2FibGVkLiBTZXR0aW5nIHRoaXMgdGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggZmFsc2UgaW5kaWNhdGVzIHRvIEVjbGlwc2VMaW5rIHRoYXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpEQkMgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYmF0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGluZy4gVGhpcyB3aWxsIHJldmVydCB0byB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgd2hpY2ggaXMgdG8gZGVsZWdhdGUgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWNsaXBzZUxpbmsncyBpbnRlcm5hbCBiYXRjaCB3cml0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWF4LWJhdGNoLXdyaXRpbmctc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIzMjAwMCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93IGZvciB0aGUgbWF4IGJhdGNoIHdyaXRpbmcgc2l6ZSB0bwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzZXQuIFRoaXMgYWxsb3dzIGZvciB0aGUgYmF0Y2ggc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBsaW1pdGVkIGFzIG1vc3QgZGF0YWJhc2UgaGF2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3QgbGltaXRzLiBUaGUgc2l6ZSBpcyBpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzLCB0aGUgZGVmYXVsdCBpcyAzMjAwMCBidXQgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgdmFsdWUgZGVwZW5kcyBvbiB0aGUgZGF0YWJhc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hdGl2ZS1zcWwiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFY2xpcHNlTGluayBjYW4gYmUgY29uZmlndXJlZCB0byB1c2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2Ugc3BlY2lmaWMgc3FsIGdyYW1tYXIgbm90IEpEQkMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWMuIFRoaXMgaXMgYmVjYXVzZSB1bmZvcnR1bmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvbWUgYnJpZGdlcyB0byBub3Qgc3VwcG9ydCB0aGUgZnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKREJDIHN0YW5kYXJkLiBCeSBkZWZhdWx0IEVjbGlwc2VMaW5rIHVzZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIEpEQkMgc3FsIGdyYW1tYXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVycyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6Z3JvdXAgcmVmPSJzdHJ1Y3QtY29udmVydGVycyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iY29ubmVjdGlvbi1oZWFsdGgtdmFsaWRhdGVkLW9uLWVycm9yIiB0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWluT2NjdXJzPSIwIj4KLQkJCQkJCTx4c2Q6YW5ub3RhdGlvbj4KLQkJCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+SWYgdHJ1ZSB3aWxsIGNhdXNlIEVjbGlwc2VMaW5rIHRvIHBpbmcgZGF0YWJhc2UgdG8gZGV0ZXJtaW5lIGlmIGFuIFNRTEV4Y2VwdGlvbiB3YXMgY2F1c2UgYnkgYSBjb21tdW5pY2F0aW9uIGZhaWx1cmU8L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLQkJCQkJPHhzZDplbGVtZW50IG5hbWU9InF1ZXJ5LXJldHJ5LWF0dGVtcHQtY291bnQiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIG51bWJlciBvZiBhdHRlbXB0cyBFY2xpcHNlTGluayB3aWxsIG1ha2UgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZGVsYXktYmV0d2Vlbi1yZWNvbm5lY3QtYXR0ZW1wdHMiIHR5cGU9InhzZDppbnRlZ2VyIiBtaW5PY2N1cnM9IjAiPgotCQkJCQkJPHhzZDphbm5vdGF0aW9uPgotCQkJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj5Db25maWd1cmUgdGhlIHRpbWUgaW4gbWlsaXNlY29uZHMgdGhhdCBFY2xpcHNlTGluayB3aWxsIHdhaXQgYmV0d2VlbiBhdHRlbXB0cyB0byByZWNvbm5lY3QgaWYgRWNsaXBzZUxpbmsgaXMgYXR0ZW1wdGluZyB0byByZXRyeSBhIHF1ZXJ5LjwveHNkOmRvY3VtZW50YXRpb24+Ci0JCQkJCQk8L3hzZDphbm5vdGF0aW9uPgotCQkJCQk8L3hzZDplbGVtZW50PgotCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0icGluZy1zcWwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0JCQkJCQk8eHNkOmFubm90YXRpb24+Ci0JCQkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPk92ZXJyaWRlIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBTUUwgdGhhdCBFY2xpcHNlTGluayB3aWxsIGlzc3VlIHRvIGEgY29ubmVjdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgbGl2ZS48L3hzZDpkb2N1bWVudGF0aW9uPgotCQkJCQkJPC94c2Q6YW5ub3RhdGlvbj4KLQkJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpzaW1wbGVUeXBlIG5hbWU9Imxvb2t1cC1lbnVtIj4KLSAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbXBvc2l0ZS1uYW1lIiAvPgotICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iY29tcG91bmQtbmFtZSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9InN0cmluZyIgLz4KLSAgICAgICAgPC94c2Q6cmVzdHJpY3Rpb24+Ci0gICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVpcy1sb2dpbiI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gYW5kIGRhdGFzb3VyY2UKLSAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLiBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byBjb25uZWN0IHRocm91Z2ggRUlTLAotICAgICAgICAgICAgICAgIC0gUHJvdmlkZSBhIEpOREkgbmFtZSB0byB0aGUgQ29ubmVjdGlvbkZhY3RvcnkgYW5kIHVzZQotICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGdldENvbm5lY3Rpb24gLSBQcm92aWRlIGEgSk5ESSBuYW1lIHRvIHRoZQotICAgICAgICAgICAgICAgIENvbm5lY3Rpb25GYWN0b3J5LCBhbmQgYSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvblNwZWMKLSAgICAgICAgICAgICAgICB0byBwYXNzIHRvIHRoZSBnZXRDb25uZWN0aW9uIC0gQ29ubmVjdCBpbiBhIG5vbi1tYW5hZ2VkCi0gICAgICAgICAgICAgICAgd2F5IGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIgc3BlY2lmaWMgQ29ubmVjdGlvbkZhY3RvcnkgQW4KLSAgICAgICAgICAgICAgICBFSVNDb25uZWN0aW9uU3BlYyBtdXN0IGJlIHByb3ZpZGVkIHRvIGRlZmluZSBob3cgdG8KLSAgICAgICAgICAgICAgICBjb25uZWN0IHRvIHRoZSBFSVMgYWRhcHRlci4gVGhlIEVJUyBwbGF0Zm9ybSBjYW4gYmUgdXNlZAotICAgICAgICAgICAgICAgIHRvIHByb3ZpZGUgZGF0YXNvdXJjZS9kcml2ZXIgc3BlY2lmaWMgYmVoYXZvaXIgc3VjaCBhcwotICAgICAgICAgICAgICAgIEludGVyYWN0aW9uU3BlYyBhbmQgUmVjb3JkIGNvbnZlcnNpb24uCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ibG9naW4iPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLXNwZWMtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb25uZWN0aW9uLWZhY3RvcnktdXJsIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbC1sb2dpbiI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlEZWZpbmVzIGxvZ2luIGFuZCBwbGF0Zm9ybSB0eXBlIHRvIGJlIHVzZWQKLSAgICAJCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgCTwveHNkOmFubm90YXRpb24+Ci0gICAgCTx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2dpbiI+Ci0gICAgCQkJPHhzZDpzZXF1ZW5jZT4KLSAgICAJCQkJPHhzZDplbGVtZW50IG5hbWU9ImVxdWFsLW5hbWVzcGFjZS1yZXNvbHZlcnMiCi0gICAgCQkJCQl0eXBlPSJ4c2Q6Ym9vbGVhbiIgbWF4T2NjdXJzPSIxIiBtaW5PY2N1cnM9IjAiPgotICAgIAkJCQk8L3hzZDplbGVtZW50PgotICAgIAkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSIKLSAgICAJCQkJCW1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIgotICAgIAkJCQkJdHlwZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0KLSAgICAJCQkJPC94c2Q6ZWxlbWVudD4KLSAgICAJCQk8L3hzZDpzZXF1ZW5jZT4KLSAgICAJCTwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVXNlZCB0byBzcGVjaWZ5IGhvdyBjb25uZWN0aW9ucyBzaG91bGQgYmUgcG9vbGVkIGluIGEKLSAgICAgICAgICAgICAgICBzZXJ2ZXIgc2Vzc2lvbi4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtYXgtY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4IG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgaW4gdGhlIHBvb2wKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJtaW4tY29ubmVjdGlvbnMiIHR5cGU9InhzZDppbnRlZ2VyIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWluIG51bWJlciBvZiBjb25uZWN0aW9ucyB0aGF0IHdpbGwgYXdheXMgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwb29sCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibG9naW4iIHR5cGU9ImxvZ2luIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVhZC1jb25uZWN0aW9uLXBvb2wiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhlIHJlYWQgY29ubmVjdGlvbiBwb29sIGlzIHVzZWQgZm9yIHJlYWQgYWNjZXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHNlc3Npb24uIEFueSBvZiB0aGUgY29ubmVjdGlvbiBwb29scyBjYW4gYmUKLSAgICAgICAgICAgICAgICB1c2VkIGZvciB0aGUgcmVhZCBwb29sIGhvd2V2ZXIgdGhpcyBpcyB0aGUgZGVmYXVsdC4gVGhpcwotICAgICAgICAgICAgICAgIHBvb2wgYWxsb3dzIGZvciBjb25jdXJyZW50IHJlYWRzIGFnYWluc3QgdGhlIHNhbWUgSkRCQwotICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYW5kIHJlcXVpcmVzIHRoYXQgdGhlIEpEQkMgY29ubmVjdGlvbiBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgY29uY3VycmVudCByZWFkIGFjY2Vzcy4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJjb25uZWN0aW9uLXBvb2wiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJleGNsdXNpdmUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgaWYgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIGZyb20gdGhlIHJlYWQgY29ubmVjdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sIGFyZSBleGNsdXNpdmUgb3Igbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGNvbW1vbiBsb2dnaW5nIG9wdGlvbnMKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqYXZhLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBKYXZhIGxvZwotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9ImxvZyI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ2dpbmctb3B0aW9ucyIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImxvZ2dpbmctb3B0aW9ucyIgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImVjbGlwc2VsaW5rLWxvZyI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBEZWZpbmVzIHRoZSBvcHRpb25zIG9mIHRoZSBFY2xpcHNlTGluayBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctbGV2ZWwiIGRlZmF1bHQ9ImluZm8iCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IHNwZWNpZmllcyB0aGUgbG9nIGxldmVsIGZvciBsb2dnaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0ib2ZmIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJzZXZlcmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9Indhcm5pbmciIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImluZm8iIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImNvbmZpZyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iZmluZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9ImZpbmVzdCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iYWxsIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImZpbGUtbmFtZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lIG9mIHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBsb2dnaW5nIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2dnaW5nLW9wdGlvbnMiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJsb2dnaW5nLW9wdGlvbnMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJzZXJ2ZXItbG9nIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIG9wdGlvbnMgb2YgdGhlIFNlcnZlciBsb2cKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJsb2ciIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nZ2luZy1vcHRpb25zIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJsb2ctZXhjZXB0aW9uLXN0YWNrdHJhY2UiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIGV4Y2VwdGlvbiBzdGFja3RyYWNlLiBXaXRob3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGVsZW1lbnQsIHRoZSBzdGFja3RyYWNlIGlzIGxvZ2dlZCBmb3IgRklORVIKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxlc3MgKEZJTkVTVCkKLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwcmludC10aHJlYWQiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZhbHNlIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgU2V0IHdoZXRoZXIgdG8gbG9nIHRocmVhZC4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhyZWFkIGlzIGxvZ2dlZCBmb3IgRklORSBvciBsZXNzIChGSU5FUiBvcgotICAgICAgICAgICAgICAgICAgICAgICAgRklORVNUKQotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LXNlc3Npb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgc2Vzc2lvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgc2Vzc2lvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWNvbm5lY3Rpb24iIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgY29ubmVjdGlvbi4gV2l0aG91dCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LCB0aGUgY29ubmVjdGlvbiBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InByaW50LWRhdGUiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBTZXQgd2hldGhlciB0byBsb2cgZGF0ZS4gV2l0aG91dCB0aGlzIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0ZSBpcyBhbHdheXMgcHJpbnRlZAotICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBkZWZpbmVzIHRoZSB0cmFuc3BvcnQgbWVjaGFuaXNtIG9mIHRoZSBSQ00uCi0gICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHJhbnNwb3J0IG1lY2hhbmlzbSBpcyBSTUkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ib24tY29ubmVjdGlvbi1lcnJvciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJEaXNjYXJkQ29ubmVjdGlvbiIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50IG9mIHRyYW5zcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBhbmQgaGFzIHZhbHVlIG9mICJEaXNjYXJkQ29ubmVjdGlvbiIgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICJLZWVwQ29ubmVjdGlvbiIuIEl0IGRldGVybWluZXMgd2hldGhlcgotICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB0byBhIFJDTSBzZXJ2aWNlIHNob3VsZCBiZSBkcm9wcGVkIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBhIGNvbW11bmljYXRpb24gZXJyb3Igd2l0aCB0aGF0IFJDTQotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZWxlbWVudCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgIkRpc2NhcmRDb25uZWN0aW9uIi4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgIDx4c2Q6c2ltcGxlVHlwZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZW51bWVyYXRpb24gdmFsdWU9IktlZXBDb25uZWN0aW9uIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iRGlzY2FyZENvbm5lY3Rpb24iIC8+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOnJlc3RyaWN0aW9uPgotICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YgdHJhbnNwb3J0Ci0gICAgICAgICAgICAgICAgZWxlbWVudC4gSXQgZGVmaW5lcyB0aGUgUk1JIHRyYW5zcG9ydCBtZWNoYW5pc20uIFRoZQotICAgICAgICAgICAgICAgIGRlZmF1bHQgbmFtaW5nIHNlcnZpY2UgaXMgSk5ESQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2VuZC1tb2RlIiBkZWZhdWx0PSJBc3luY2hyb25vdXMiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsIGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1pIGVsZW1lbnQgYW5kIGhhcyB2YWx1ZSBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXN5bmNocm9ub3VzIiBvciAiU3luY2hyb25vdXMiLiBJdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIFJDTSBwcm9wYWdhdGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgYW5kIGRvZXMgbm90IHdhaXQgZm9yIGNvbW1hbmQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoIGl0cyBleGVjdXRpb24gaW4gYXN5bmNocm9ub3VzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgb3Igd2FpdCBmb3IgY29tbWFuZCB0byBmaW5pc2ggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBpbiBzeW5jaHJvbm91cyBtb2RlLiBUaGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGVsZW1lbnQgaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzeW5jaHJvbm91cyIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpyZXN0cmljdGlvbiBiYXNlPSJ4c2Q6c3RyaW5nIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbnVtZXJhdGlvbiB2YWx1ZT0iQXN5bmNocm9ub3VzIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVudW1lcmF0aW9uIHZhbHVlPSJTeW5jaHJvbm91cyIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpyZXN0cmljdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNpbXBsZVR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkaXNjb3ZlcnkiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybWkgZWxlbWVudC4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3Zlcnkgc2V0dGluZ3Mgc2hvdWxkIGJlIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBhIGRlZmF1bHQgRGlzY292ZXJ5IHdpdGggaXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgc2V0dGluZ3MgaXMgY3JlYXRlZCB3aGVuIHRoZSBybWkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBpcyBzcGVjaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ibXVsdGljYXN0LWdyb3VwLWFkZHJlc3MiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIyMjYuMTAuMTIuNjQiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im11bHRpY2FzdC1wb3J0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOmludGVnZXIiIGRlZmF1bHQ9IjMxMjEiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImFubm91bmNlbWVudC1kZWxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIxMDAwIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSBtdWx0aWNhc3QgZ3JvdXAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBzaG91bGQgYmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGlzICIxMDAwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icGFja2V0LXRpbWUtdG8tbGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnRlZ2VyIiBkZWZhdWx0PSIyIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGlzIGFuIG9wdGlvbmFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgb2YgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbmVudC4gSXQgZGV0ZXJtaW5lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRoZSB0aW1lLXRvLWxpdmUgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhY2tldHMgdGhhdCBhcmUgc2VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBEaXNjb3ZlcnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWxzdGljYXN0IHNvY2tldCBzaG91bGQgYmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZC4gVGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBlbGVtZW50IGlzICIyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6Y2hvaWNlIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iam5kaS1uYW1pbmctc2VydmljZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0icm1pLXJlZ2lzdHJ5LW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZWxlbWVudCBpcyBhbiBvcHRpb25hbCBlbGVtZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBybWkgZWxlbWVuZW50LiBJdCBkZXRlcm1pbmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGV0aGVyIFJNSSByZWdpc3RyeSBzaG91bGQgYmUgdXNlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InVybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6Y2hvaWNlPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InJtaS1paW9wLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgUk1JLUlJT1AgdHJhbnNwb3J0IG1lY2hhbmlzbSBvZgotICAgICAgICAgICAgICAgIHRoZSBSQ00uIFRoZSBkZWZhdWx0IG5hbWluZyBzZXJ2aWNlIGlzIEpOREkKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJybWktdHJhbnNwb3J0IiAvPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Imptcy10b3BpYy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIEpNUyB0b3BpYyB0cmFuc3BvcnQgbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idG9waWMtaG9zdC11cmwiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1jb25uZWN0aW9uLWZhY3RvcnktbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9Imptcy9FY2xpcHNlTGlua1RvcGljQ29ubmVjdGlvbkZhY3RvcnkiCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0b3BpYy1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iam1zL0VjbGlwc2VMaW5rVG9waWMiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpuZGktbmFtaW5nLXNlcnZpY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJqbmRpLW5hbWluZy1zZXJ2aWNlIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9Im9jNGotamdyb3Vwcy10cmFuc3BvcnQiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVGhpcyBlbGVtZW50IGRlZmluZXMgdGhlIE9DNEogSkdyb3VwcyB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBtZWNoYW5pc20gb2YgdGhlIFJDTQotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlLXNpbmdsZS10aHJlYWRlZC1ub3RpZmljYXRpb24iCi0gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIG1pbk9jY3Vycz0iMCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRvcGljLW5hbWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3VuLWNvcmJhLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgZGVmaW5lcyB0aGUgU3VuIENPUkJBIHRyYW5zcG9ydCBtZWNoYW5pc20KLSAgICAgICAgICAgICAgICBvZiB0aGUgUkNNCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0idHJhbnNwb3J0LW1hbmFnZXIiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idXNlci1kZWZpbmVkLXRyYW5zcG9ydCI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZiB0cmFuc3BvcnQKLSAgICAgICAgICAgICAgICBlbGVtZW50LiBJdCBkZXRlcm1pbmVzIHdoZXRoZXIgYSB1c2VyIGltcGxlbWVudGVkCi0gICAgICAgICAgICAgICAgdHJhbnNwb3J0IG1lY2hhbmlzbSB0aGF0IHNob3VsZCBiZSB1c2VkLgotICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgPHhzZDpjb21wbGV4Q29udGVudD4KLSAgICAgICAgICAgIDx4c2Q6ZXh0ZW5zaW9uIGJhc2U9InRyYW5zcG9ydC1tYW5hZ2VyIj4KLSAgICAgICAgICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idHJhbnNwb3J0LWNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIgLz4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJqbmRpLW5hbWluZy1zZXJ2aWNlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ1cmwiIHR5cGU9InhzZDpzdHJpbmciIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgVVJMIGZvciBuYW1pbmcgc2VydmljZSBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0idXNlci1uYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImFkbWluIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZW5jcnlwdGlvbi1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5pbnRlcm5hbC5zZWN1cml0eS5KQ0VFbmNyeXB0b3IiCi0gICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InBhc3N3b3JkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIGRlZmF1bHQ9InBhc3N3b3JkIiBtaW5PY2N1cnM9IjAiIC8+Ci0gICAgICAgICAgICA8IS0tICBUT0RPOiBOZWVkIHRvIGhhdmUgYSBub24gV2ViTG9naWMgKHByZXZpb3VzbHkgT0M0SikgZGVmYXVsdCBvciByb3V0ZSB0aHJvdWdoIHNlcnZlciBwbGF0Zm9ybSBieSBkZWZhdWx0IC0tPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImluaXRpYWwtY29udGV4dC1mYWN0b3J5LW5hbWUiCi0gICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSJ3ZWJsb2dpYy5qbmRpLldMSW5pdGlhbENvbnRleHRGYWN0b3J5IgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCBjb250ZXh0IGZhY3RvcnkgY2xhc3MgZm9yIG5hbWluZyBzZXJ2aWNlCi0gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2hhbmdlZC4gCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVsZW1lbnQgaXMgYW4gb3B0aW9uYWwgZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgICAgICAgam5kaS1uYW1pbmctc2VydmljZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1pbmcgc2VydmljZSByZXF1aXJlcyBleHRyYSBwcm9wZXJ0eSB0aGF0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICBub3QgZGVmaW5lZCBieSBFY2xpcHNlTGluayBidXQgaXQgaXMgcmVxdWlyZWQgYnkgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGFwcGxpY2F0aW9uCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICA8eHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgdXNlPSJyZXF1aXJlZCIgLz4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2U9InJlcXVpcmVkIiAvPgotICAgICAgICAgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpncm91cCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzc2VzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiAvPgotICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICA8L3hzZDpncm91cD4KLSAgICA8eHNkOmdyb3VwIG5hbWU9InN0cnVjdC1jb252ZXJ0ZXJzIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJzdHJ1Y3QtY29udmVydGVyIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmdyb3VwPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+U2VxdWVuY2Ugb2JqZWN0LjwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG5hbWUuCi0gICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icHJlYWxsb2NhdGlvbi1zaXplIiB0eXBlPSJ4c2Q6aW50ZWdlciIKLSAgICAgICAgICAgICAgICBkZWZhdWx0PSI1MCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJkZWZhdWx0LXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgIFJlZmVyZW5jZXMgZGVmYXVsdCBzZXF1ZW5jZSBvYmplY3QsIG92ZXJyaWRpbmcgaXRzIG5hbWUKLSAgICAgICAgICAgICAgICBhbmQgKG9wdGlvbmFsbHkpIHByZWFsbG9jYXRpb24gc2l6ZS4KLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgVG8gdXNlIHByZWFsbG9jYXRpb24gc2l6ZSBvZiBkZWZhdWx0IHNlcXVlbmNlIG9iamVjdCwKLSAgICAgICAgICAgICAgICBzZXQgcHJlYWxsb2NhdGlvbiBzaXplIHRvIDAKLSAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSIgLz4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJuYXRpdmUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgRGF0YWJhc2Ugc2VxdWVuY2UgbWVjaGFuaXNtIHVzZWQuCi0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0idGFibGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+VGFibGUgc2VxdWVuY2U8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWJsZSIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZmllbGQiIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJTRVFfTkFNRSIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRX0NPVU5UIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBjb3VudGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDwveHNkOmV4dGVuc2lvbj4KLSAgICAgICAgPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ1bmFyeS10YWJsZS1zZXF1ZW5jZSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICBVbmFyeSB0YWJsZSBzZXF1ZW5jZSAtIHNlcXVlbmNlIG5hbWUgaXMgYSB0YWJsZSBuYW1lLAotICAgICAgICAgICAgICAgIHRhYmxlIGhhcyBhIHNpbmdsZSBmaWVsZCBhbmQgYSBzaW5nbGUgcm93Ci0gICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiPgotICAgICAgICAgICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJjb3VudGVyLWZpZWxkIiB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iU0VRVUVOQ0UiIG1pbk9jY3Vycz0iMCI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmUgdGhlIG5hbWUgb2YgdGhlIHNlcXVlbmNlIGNvdW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgaW4gdGhlIHNlcXVlbmNlIHRhYmxlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3hzZDplbGVtZW50PgotICAgICAgICAgICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPC94c2Q6ZXh0ZW5zaW9uPgotICAgICAgICA8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9InhtbGZpbGUtc2VxdWVuY2UiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+WG1sZmlsZSBzZXF1ZW5jZS48L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgICAgICAgICAgPHhzZDpleHRlbnNpb24gYmFzZT0ic2VxdWVuY2UiIC8+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ieG1sLXNlcXVlbmNlIj4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgPHhzZDpkb2N1bWVudGF0aW9uPlhtbCBzZXF1ZW5jZTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgICAgICAgICA8eHNkOmV4dGVuc2lvbiBiYXNlPSJzZXF1ZW5jZSI+Ci0gICAgICAgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJvb3QtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUVVFTkNFIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWUtZWxlbWVudCIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IlNFUV9OQU1FIiBtaW5PY2N1cnM9IjAiPgotICAgICAgICAgICAgICAgICAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBuYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIGluIHRoZSBzZXF1ZW5jZSB0YWJsZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZWxlbWVudD4KLSAgICAgICAgICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvdW50ZXItZWxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciIGRlZmF1bHQ9IlNFUV9DT1VOVCIgbWluT2NjdXJzPSIwIj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZSB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2UgY291bnRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBpbiB0aGUgc2VxdWVuY2UgdGFibGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwveHNkOmVsZW1lbnQ+Ci0gICAgICAgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8L3hzZDpleHRlbnNpb24+Ci0gICAgICAgIDwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIGRvY3VtZW50IHByZXNlcnZhdGlvbgotICAgICAgICAJCXN0cmF0ZWd5IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6c2VxdWVuY2U+Ci0gICAgCQk8eHNkOmVsZW1lbnQgbmFtZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiCi0gICAgCQkJdHlwZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiIG1heE9jY3Vycz0iMSIgbWluT2NjdXJzPSIwIj4KLSAgICAJCTwveHNkOmVsZW1lbnQ+Ci0gICAgCTwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+Ci0gICAgCTx4c2Q6YW5ub3RhdGlvbj4KLSAgICAJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAJCQlUaGlzIGVsZW1lbnQgc3BlY2lmaWVzIHdoaWNoIG5vZGUgb3JkZXJpbmcgc3RyYXRlZ3kgd2lsbAotICAgIAkJCWJlIHVzZWQuCi0gICAgCQk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgIAk8L3hzZDphbm5vdGF0aW9uPjwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZQotICAgIAluYW1lPSJkZXNjcmlwdG9yLWxldmVsLWRvY3VtZW50LXByZXNlcnZhdGlvbi1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgRG9jdW1lbnRQcmVzZXJ2YXRpb24gUG9saWN5IHRoYXQKLSAgICAgICAgCQlhY2Nlc3NlcyB0aGUgc2Vzc2lvbiBjYWNoZSB0byBzdG9yZSBPYmplY3RzIGFuZCB0aGVpcgotICAgICAgICAJCWFzc29jaWF0ZWQgbm9kZXMuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibm8tZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBIERvY3VtZW50UHJlc2VydmF0aW9uUG9saWN5IHRvIGluZGljYXRlIHRoYXQgbm8KLSAgICAgICAgCQlkb2N1bWVudCBwcmVzZXJ2YXRpb24gd29yayBzaG91bGQgYmUgZG9uZS4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJkb2N1bWVudC1wcmVzZXJ2YXRpb24tcG9saWN5Ij48L3hzZDpleHRlbnNpb24+Ci0gICAgCTwveHNkOmNvbXBsZXhDb250ZW50PgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJ4bWwtYmluZGVyLXBvbGljeSI+Ci0gICAgICAgIDx4c2Q6YW5ub3RhdGlvbj4KLSAgICAgICAgCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgCQlBbiBpbXBsZW1lbnRhdGlvbiBvZiBEb2N1bWVudFByZXNlcnZhdGlvblBvbGljeSB0aGF0Ci0gICAgICAgIAkJbWFpbnRhaW5zIGJpZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIEphdmEKLSAgICAgICAgCQlPYmplY3RzIGFuZCB0aGUgWE1MTm9kZXMgdGhleSBvcmlnaW5hdGVkIGZyb20uCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0iZG9jdW1lbnQtcHJlc2VydmF0aW9uLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iYXBwZW5kLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgc2ltcGx5Ci0gICAgICAgIAkJYXBwZW5kcyB0aGUgbmV3IGNoaWxkIGVsZW1lbnQgdG8gdGhlIHBhcmVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0iaWdub3JlLW5ldy1lbGVtZW50cy1vcmRlcmluZy1wb2xpY3kiPgotICAgICAgICA8eHNkOmFubm90YXRpb24+Ci0gICAgICAgIAk8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIAkJQW4gaW1wbGVtZW50YXRpb24gb2YgTm9kZU9yZGVyaW5nUG9saWN5IHRoYXQgaWdub3JlcyBhbnkKLSAgICAgICAgCQluZXcgZWxlbWVudHMgd2hlbiB1cGRhdGluZyBhIGNhY2hlZCBkb2N1bWVudC4KLSAgICAgICAgCTwveHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgIDwveHNkOmFubm90YXRpb24+Ci0gICAgICAgIDx4c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgCQk8eHNkOmV4dGVuc2lvbiBiYXNlPSJub2RlLW9yZGVyaW5nLXBvbGljeSI+PC94c2Q6ZXh0ZW5zaW9uPgotICAgIAk8L3hzZDpjb21wbGV4Q29udGVudD4KLSAgICA8L3hzZDpjb21wbGV4VHlwZT4KLQotICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0icmVsYXRpdmUtcG9zaXRpb24tb3JkZXJpbmctcG9saWN5Ij4KLSAgICAgICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICAJPHhzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICAJCUFuIGltcGxlbWVudGF0aW9uIG9mIE5vZGVPcmRlcmluZ1BvbGljeSB0aGF0IGFkZHMgbmV3Ci0gICAgICAgIAkJZWxlbWVudHMgdG8gYW4gWE1MIERvY3VtZW50IGJhc2VkIG9uIHRoZSBsYXN0IHVwZGF0ZWQKLSAgICAgICAgCQlzaWJsaW5nIGluIHRoZWlyIGNvbnRleHQuCi0gICAgICAgIAk8L3hzZDpkb2N1bWVudGF0aW9uPgotICAgICAgICA8L3hzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmNvbXBsZXhDb250ZW50PgotICAgIAkJPHhzZDpleHRlbnNpb24gYmFzZT0ibm9kZS1vcmRlcmluZy1wb2xpY3kiPjwveHNkOmV4dGVuc2lvbj4KLSAgICAJPC94c2Q6Y29tcGxleENvbnRlbnQ+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS9KcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL0pwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGNiNDU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL0pwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbgotCQlleHRlbmRzIFBsdWdpbiB7Ci0JCi0JLy8gKioqKioqKioqKiBwdWJsaWMgY29uc3RhbnRzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIHRoZSBqcHQgY29tbW9uIGNvcmUgc3VwcG9ydAotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF8gPSBQTFVHSU5fSUQgKyAnLic7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbiBJTlNUQU5DRTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBqcHQgY29tbW9uIGVjbGlwc2VsaW5rIGNvcmUgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHB1YmxpYyBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQkvLyBub3RoaW5nIHlldC4uLgkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0pwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YWY3MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWNsaXBzZUxpbmtMaWJyYXJ5VmFsaWRhdG9yX211bHRpcGxlRWNsaXBzZUxpbmtWZXJzaW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb247Ci0JCi0JLy8gVE9ETyAtIG1vdmUgdG8ganB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSB3aGVuIHRoZXJlIGFyZSBtZXNzYWdlcyB0aGVyZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVMSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yX25vWGpjQ2xhc3NlczsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X2NvbW1vbl9lY2xpcHNlbGlua19jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZU1lc3NhZ2VzLmNsYXNzOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0xpYlZhbFV0aWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FY2xpcHNlTGlua0xpYlZhbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkNTJhYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9saWJ2YWwvRWNsaXBzZUxpbmtMaWJWYWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlRvb2xGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnV0aWwuSUNsYXNzRmlsZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS51dGlsLklGaWVsZEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlLkpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rTGliVmFsVXRpbCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFZFUlNJT05fQ0xBU1NfUEFUSCA9ICJvcmcvZWNsaXBzZS9wZXJzaXN0ZW5jZS9WZXJzaW9uLmNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWRVJTSU9OX0ZJRUxEX05BTUUgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGUoSXRlcmFibGU8SUNsYXNzcGF0aEVudHJ5PiBsaWJyYXJ5RW50cmllcywgU2V0PFZlcnNpb25SYW5nZT4gdmVyc2lvblJhbmdlcykgewotCQlWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IGxpYnJhcnlFbnRyaWVzKSB7Ci0JCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IG51bGw7Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9MSUJSQVJZKSB7Ci0JCQkJSUNsYXNzRmlsZVJlYWRlciBjbGFzc1JlYWRlciA9IAotCQkJCQkJVG9vbEZhY3RvcnkuY3JlYXRlRGVmYXVsdENsYXNzRmlsZVJlYWRlcigKLQkJCQkJCQllbnRyeS5nZXRQYXRoKCkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCksIFZFUlNJT05fQ0xBU1NfUEFUSCwgSUNsYXNzRmlsZVJlYWRlci5GSUVMRF9JTkZPUyk7Ci0JCQkJaWYgKGNsYXNzUmVhZGVyICE9IG51bGwpIHsKLQkJCQkJZm9yIChJRmllbGRJbmZvIGZpZWxkIDogY2xhc3NSZWFkZXIuZ2V0RmllbGRJbmZvcygpKSB7Ci0JCQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKGZpZWxkLmdldE5hbWUoKSwgVkVSU0lPTl9GSUVMRF9OQU1FLnRvQ2hhckFycmF5KCkpKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJdmVyc2lvblN0cmluZyA9IGZpZWxkLmdldENvbnN0YW50VmFsdWVBdHRyaWJ1dGUoKS5nZXRDb25zdGFudFZhbHVlKCkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCS8vIHBvdGVudGlhbGx5IGEgYml0IGNvdWxkIGdvIHdyb25nIHdpdGggdGhhdCBsYXN0IGxpbmUsIGJ1dCBpZiBhbnkKLQkJCQkJCQkJLy8gYXNzdW1wdGlvbnMgYXJlbid0IG1ldCwgdGhlcmUncyBubyB2YWx1ZQotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRDb21tb25FY2xpcHNlTGlua0NvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfbXVsdGlwbGVFY2xpcHNlTGlua1ZlcnNpb25zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKHZlcnNpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdENvbW1vbkVjbGlwc2VMaW5rQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3Jfbm9FY2xpcHNlTGlua1ZlcnNpb24pOwotCQl9Ci0JCQotCQlmb3IgKFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgOiB2ZXJzaW9uUmFuZ2VzKSB7Ci0JCQlpZiAoISB2ZXJzaW9uUmFuZ2UuaXNJbmNsdWRlZCh2ZXJzaW9uKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJSVN0YXR1cy5FUlJPUiwgSnB0Q29tbW9uRWNsaXBzZUxpbmtDb3JlUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCQlKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FY2xpcHNlTGlua0xpYnJhcnlWYWxpZGF0b3JfaW1wcm9wZXJFY2xpcHNlTGlua1ZlcnNpb24pOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jbGFzc3BhdGggYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNGZiMzguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jdnNpZ25vcmUgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZkZTk2Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWI3OGRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI01vbiBNYXIgMjEgMTc6Mzk6MTMgRURUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM2MjAwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLkpwdENvbW1vblVpUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZHJhdzJkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgotRGFsaS1Db21tZW50OiAqTk8qIEVjbGlwc2VMaW5rIGZyaWVuZHMhCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9hYm91dC5odG1sIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYzc4MGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2FmOTBlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbiBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF9jb21tb25fdWkucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDNhMTk1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvcHJvcGVydHlfZmlsZXMvanB0X2NvbW1vbl91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUJvb2xlYW5fVHJ1ZT1UcnVlCi1Cb29sZWFuX0ZhbHNlPUZhbHNlCi0KLU5vbmVTZWxlY3RlZD08Tm9uZT4KLURlZmF1bHRFbXB0eT1EZWZhdWx0Ci1EZWZhdWx0V2l0aE9uZVBhcmFtPURlZmF1bHQgKHswfSkKLQotQWRkUmVtb3ZlUGFuZV9BZGRCdXR0b25UZXh0PUFkZC4uLgotQWRkUmVtb3ZlUGFuZV9SZW1vdmVCdXR0b25UZXh0PVJlbW92ZQotQ2hvb3NlclBhbmVfYnJvd3NlQnV0dG9uPUJyb3dzZS4uLgotQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlPSZFbnRlciB0eXBlIG5hbWUgcHJlZml4IG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZT1DbGFzcyBTZWxlY3Rpb24KLVBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZT1QYWNrYWdlIFNlbGVjdGlvbgotUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2U9JkVudGVyIHBhY2thZ2UgbmFtZSBwcmVmaXggb3IgcGF0dGVybiAoKiA9IGFueSBzdHJpbmcsID8gPSAgYW55IGNoYXJhY3Rlcik6Ci1FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdD1EZWZhdWx0ICgpCi1FbnVtQ29tYm9WaWV3ZXJfZGVmYXVsdFdpdGhEZWZhdWx0PURlZmF1bHQgKHswfSkKLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLU5ld05hbWVTdGF0ZU9iamVjdF9uYW1lQWxyZWFkeUV4aXN0cz1BbiBvYmplY3Qgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMuCi0KLU9wdGlvbmFsTWVzc2FnZURpYWxvZ19kb05vdFNob3dXYXJuaW5nPURvIG5vdCBzaG93IHRoaXMgJm1lc3NhZ2UgYWdhaW4KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvSnB0Q29tbW9uVWlQbHVnaW4uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvSnB0Q29tbW9uVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0OTc3NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL0pwdENvbW1vblVpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25VaVBsdWdpbiAKLQlleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4KLXsKLQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwbHVnLWluIGlkZW50aWZpZXIgb2YgSlBUIENvbW1vbiBVSSBzdXBwb3J0ICh2YWx1ZSB7QHZhbHVlfSkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEXyA9IFBMVUdJTl9JRCArICcuJzsKLQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEpwdENvbW1vblVpUGx1Z2luIElOU1RBTkNFOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2luZ2xldG9uIEpQVCBVSSBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0Q29tbW9uVWlQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9nZ2luZyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JcHVibGljIEpwdENvbW1vblVpUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvV2lkZ2V0RmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9XaWRnZXRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNzE1NGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9XaWRnZXRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotCi0vKioKLSAqIEEgd2lkZ2V0IGZhY3RvcnkgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGFuIFNXVCB3aWRnZXQgYmFzZWQgb24gdGhlIHJpZ2h0Ci0gKiBzdHlsZS4gU29tZSBzdHlsZSBzaG93cyB0aGUgd2lkZ2V0cyBkaWZmZXJlbnRseSwgZm9yIGluc3RhbmNlLCB0aGUgZmxhdCBzdHlsZQotICogc2hvd3MgdGhlIHdpZGdldHMgd2l0aCBsZXNzIGJvcmRlcnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZWd1bGFyIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgY3VzdG9tIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBkZXByZWNhdGVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqLwotCUBEZXByZWNhdGVkCi0JQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21ibzwvY29kZT4KLQkgKi8KLQlDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUNvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IERhdGVUaW1lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgaXMgdG8gdGVsbCB0aGUgdHlwZSBvZiB3aWRnZXQKLQkgKiAoPGNvZGU+U1dULkRBVEU8L2NvZGU+IG9yIDxjb2RlPlNXVC5USU1FPC9jb2RlPiBvciA8Y29kZT5TV1QuQ0FMRU5EQVI8L2NvZGU+KQotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RGF0ZVRpbWU8L2NvZGU+Ci0JICovCi0JRGF0ZVRpbWUgY3JlYXRlRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIGN1c3RvbSA8Y29kZT5DQ29tYm88L2NvZGU+LgotCSAqCi0JICogQGRlcHJlY2F0ZWQKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlDQ29tYm8gY3JlYXRlRWRpdGFibGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqLwotCUNvbWJvIGNyZWF0ZUVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRpdGxlZCBwYW5lIChncm91cCBib3gpLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0aXRsZSBUaGUgZ3JvdXAgcGFuZSdzIHRpdGxlCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Hcm91cDwvY29kZT4KLQkgKi8KLQlHcm91cCBjcmVhdGVHcm91cChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGl0bGUpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJlbCB0aGF0IGlzIHNob3duIGFzIGEgaHlwZXJsaW5rLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkh5cGVybGluazwvY29kZT4KLQkgKi8KLQlIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4KLQkgKi8KLQlMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgbGFiZWxUZXh0KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlzdC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIGlzIHVzdWFsbHkgdG8gdGVsbCB3aGF0IHR5cGUgb2Ygc2VsZWN0aW9uCi0JICogKDxjb2RlPlNXVC5NVUxUSTwvY29kZT4gb3IgPGNvZGU+U1dULlNJTkdMRTwvY29kZT4pCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5MYWJlbDwvY29kZT4KLQkgKi8KLQlMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgdGhhdCBjYW4gYmUgd3JhcHBlZCBvbiBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkZvcm1UZXh0PC9jb2RlPgotCSAqLwotCUZvcm1UZXh0IGNyZWF0ZU11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBsYWJlbFRleHQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSB0ZXh0IGFyZWEuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHBhcmVudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+Ci0JICovCi0JVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSB0ZXh0IGZpZWxkIHRoYXQgaGFuZGxlcyBwYXNzd29yZC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+Ci0JICovCi0JVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uICh0b2dnbGUgYmV0d2VlbiBzZWxlY3RlZCBhbmQgdW5zZWxlY3RlZCkuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKi8KLQlCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHJhZGlvIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCUJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNlY3Rpb24sIHdoaWNoIGlzIGEgY29sbGFwc2FibGUgcGFuZSB3aXRoIGEgdGl0bGUgYmFyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBzdHlsZSBUaGUgc3R5bGUgb2YgdGhlIHRpdGxlIGJhciwgd2hpY2ggY2FuIGJlCi0JICogPGNvZGU+RXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5FeHBhbmRhYmxlQ29tcG9zaXRlLlRJVExFX0JBUjwvY29kZT4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+Ci0JICovCi0JU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNwaW5uZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqLwotCVNwaW5uZXIgY3JlYXRlU3Bpbm5lcihDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgdGFibGUKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqLwotCVRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIHRleHQgZmllbGQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5UZXh0PC9jb2RlPgotCSAqLwotCVRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdHJpLXN0YXRlIGNoZWNrIGJveC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+QnV0dG9uPC9jb2RlPiB0aGF0IGhhcyAzIHNlbGVjdGlvbiBzdGF0ZXMKLQkgKi8KLQlCdXR0b24gY3JlYXRlVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9KcHRDb21tb25VaU1lc3NhZ2VzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL0pwdENvbW1vblVpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlMTQzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL0pwdENvbW1vblVpTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIFVJLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uVWlNZXNzYWdlcyB7Ci0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvb2xlYW5fVHJ1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCb29sZWFuX0ZhbHNlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRFbXB0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0V2l0aE9uZVBhcmFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vbmVTZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFJlbW92ZVBhbmVfQWRkQnV0dG9uVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRSZW1vdmVQYW5lX1JlbW92ZUJ1dHRvblRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDaG9vc2VyUGFuZV9icm93c2VCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFja2FnZUNob29zZXJQYW5lX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1Db21ib1ZpZXdlcl9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1Db21ib1ZpZXdlcl9kZWZhdWx0V2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3TmFtZVN0YXRlT2JqZWN0X25hbWVBbHJlYWR5RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld05hbWVTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wdGlvbmFsTWVzc2FnZURpYWxvZ19kb05vdFNob3dXYXJuaW5nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9jb21tb25fdWkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0Q29tbW9uVWlNZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0Q29tbW9uVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL1RyYWNpbmcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvVHJhY2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI2MDE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvVHJhY2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuSnB0Q29tbW9uVWlQbHVnaW47Ci0KLS8qKgotICogVGhpcyB0cmFjaW5nIGNsYXNzIG1hbmFnZXMgdG8gY29udmVydCB0aGUgc3RyaW5nIHZhbHVlIGludG8gYm9vbGVhbiB2YWx1ZXMgb3IKLSAqIGludGVnZXIgdmFsdWVzIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhY2luZyBkZWJ1ZyBmbGFncy4gVGhvc2UgZmxhZ3MKLSAqIGFyZSBzcGVjaWZpZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUuIFRoZSBzdXBwb3J0ZWQga2V5cyBhcmUgZGVmaW5lZCBoZXJlIGFzCi0gKiBjb25zdGFudHMgZm9yIHF1aWNrIHJlZmVyZW5jZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhY2luZwotewotCS8qKgotCSAqIEEgY29uc3RhbnQgdXNlZCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoICIvZGVidWciLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQlVHID0gIi9kZWJ1ZyI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiL2RlYnVnL3VpL2RiIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9EQiA9ICIvZGVidWcvdWkvZGIiOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi9kZWJ1Zy91aS9kZXRhaWxzVmlldyIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfREVUQUlMU19WSUVXID0gIi9kZWJ1Zy91aS9kZXRhaWxzVmlldyI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCAiL2RlYnVnL3VpL2xheW91dCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfTEFZT1VUID0gIi9kZWJ1Zy91aS9sYXlvdXQiOwotCi0JLyoqCi0JICogQSBjb25zdGFudCB1c2VkIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggIi91bml0LXRlc3RzIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTklUX1RFU1RTID0gIi91bml0LXRlc3RzIjsKLQotCS8qKgotCSAqIENhbid0IGluc3RhbnRpYXRlIHRoaXMgPGNvZGU+VHJhY2luZzwvY29kZT4gY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBUcmFjaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVHJhY2luZyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIik7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuIFRoZSBkZWZhdWx0Ci0JICogdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdpdmVuIGZsYWcgaXMgYWN0aXZlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYm9vbGVhbkRlYnVnT3B0aW9uKFN0cmluZyBmbGFnKQotCXsKLQkJcmV0dXJuIGJvb2xlYW5EZWJ1Z09wdGlvbihmbGFnLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGdpdmVuIGZsYWcgY291bGQgbm90IGJlIGZvdW5kCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZ2l2ZW4gZmxhZyBpcyBhY3RpdmU7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBib29sZWFuRGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKQotCXsKLQkJU3RyaW5nIHN0cmluZyA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKEpwdENvbW1vblVpUGx1Z2luLlBMVUdJTl9JRCArIGZsYWcpOwotCQlyZXR1cm4gKHN0cmluZyA9PSBudWxsKSA/IGRlZmF1bHRWYWx1ZSA6IEJvb2xlYW4ucGFyc2VCb29sZWFuKHN0cmluZy50cmltKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGVidWcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLiBUaGUgZGVmYXVsdCB2YWx1ZQotCSAqIGlzIDAuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW50RGVidWdPcHRpb24oU3RyaW5nIGZsYWcpCi0JewotCQlyZXR1cm4gaW50RGVidWdPcHRpb24oZmxhZywgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuCi0JICoKLQkgKiBAcGFyYW0gZmxhZyBUaGUgZmxhZyB0byByZXRyaWV2ZSB0aGUgZGVidWcgdmFsdWUsIHdoaWNoIHNob3VsZCBiZQotCSAqIGNvbnRhaW5lZCBpbiB0aGUgLm9wdGlvbnMgZmlsZSwgdGhlIGZsYWcgc2hvdWxkIHN0YXJ0IHdpdGggIi8iCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgZGVmYXVsdCB2YWx1ZSBpZiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZQotCSAqIGdpdmVuIGZsYWcgY291bGQgbm90IGJlIGZvdW5kCi0JICogQHJldHVybiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmbGFnLCBvciB0aGUgZ2l2ZW4gZGVmYXVsdAotCSAqIHZhbHVlCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaW50RGVidWdPcHRpb24oU3RyaW5nIGZsYWcsIGludCBkZWZhdWx0VmFsdWUpCi0JewotCQlTdHJpbmcgc3RyaW5nID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oSnB0Q29tbW9uVWlQbHVnaW4uUExVR0lOX0lEICsgZmxhZyk7Ci0JCXJldHVybiAoc3RyaW5nID09IG51bGwpID8gIGRlZmF1bHRWYWx1ZSA6IEludGVnZXIucGFyc2VJbnQoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBnaXZlbiBtZXNzYWdlcywgYXBwZW5kcyBpdCB3aXRoIHRoaXMgcGx1Zy1pbiBpZC4KLQkgKgotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpCi0JewotCQlTeXN0ZW0ub3V0LnByaW50KCJbIiArIEpwdENvbW1vblVpUGx1Z2luLlBMVUdJTl9JRCArICJdICIpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4obWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZWJ1ZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcuIFRoZSBkZWZhdWx0IHZhbHVlCi0JICogaXMgYW4gZW1wdHkgc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIGZsYWcgVGhlIGZsYWcgdG8gcmV0cmlldmUgdGhlIGRlYnVnIHZhbHVlLCB3aGljaCBzaG91bGQgYmUKLQkgKiBjb250YWluZWQgaW4gdGhlIC5vcHRpb25zIGZpbGUsIHRoZSBmbGFnIHNob3VsZCBzdGFydCB3aXRoICIvIgotCSAqIEByZXR1cm4gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZywgb3IgdGhlIGdpdmVuIGRlZmF1bHQKLQkgKiB2YWx1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0RlYnVnT3B0aW9uKFN0cmluZyBmbGFnKQotCXsKLQkJcmV0dXJuIHN0cmluZ0RlYnVnT3B0aW9uKGZsYWcsICIiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGRlYnVnIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmxhZy4KLQkgKgotCSAqIEBwYXJhbSBmbGFnIFRoZSBmbGFnIHRvIHJldHJpZXZlIHRoZSBkZWJ1ZyB2YWx1ZSwgd2hpY2ggc2hvdWxkIGJlCi0JICogY29udGFpbmVkIGluIHRoZSAub3B0aW9ucyBmaWxlLCB0aGUgZmxhZyBzaG91bGQgc3RhcnQgd2l0aCAiLyIKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlIGlmIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gZmxhZyBjb3VsZCBub3QgYmUgZm91bmQKLQkgKiBAcmV0dXJuIFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGZsYWcsIG9yIHRoZSBnaXZlbiBkZWZhdWx0Ci0JICogdmFsdWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdEZWJ1Z09wdGlvbihTdHJpbmcgZmxhZywgU3RyaW5nIGRlZmF1bHRWYWx1ZSkKLQl7Ci0JCVN0cmluZyBzdHJpbmcgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihKcHRDb21tb25VaVBsdWdpbi5QTFVHSU5fSUQgKyBmbGFnKTsKLQkJcmV0dXJuIChzdHJpbmcgIT0gbnVsbCkgPyBzdHJpbmcgOiBkZWZhdWx0VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL09wdGlvbmFsTWVzc2FnZURpYWxvZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9kaWFsb2dzL09wdGlvbmFsTWVzc2FnZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjI4MWZjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvZGlhbG9ncy9PcHRpb25hbE1lc3NhZ2VEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLQotLyoqCi0gKiBBIDxjb2RlPk9wdGlvbmFsTWVzc2FnZURpYWxvZzwvY29kZT4gaXMgYSBkaWFsb2cgdGhhdCBoYXMgYSBjaGVjayBib3ggYWxsb3dpbmcgdGhlCi0gKiBvcHRpb24gdG8gbm8gbG9uZ2VyIHNob3cgdGhlIGRpYWxvZyBpbiB0aGUgZnV0dXJlLiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9wdGlvbmFsTWVzc2FnZURpYWxvZyBleHRlbmRzIE1lc3NhZ2VEaWFsb2cgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLQk9YX1RFWFQgPSBKcHRDb21tb25VaU1lc3NhZ2VzLk9wdGlvbmFsTWVzc2FnZURpYWxvZ19kb05vdFNob3dXYXJuaW5nOwotCi0JLy8gRGlhbG9nIHN0b3JlIGlkIGNvbnN0YW50cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9SRV9JRCA9ICJPcHRpb25hbE1lc3NhZ2VEaWFsb2cuaGlkZS4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfU0hPV04gPSBJRGlhbG9nQ29uc3RhbnRzLkNMSUVOVF9JRCArIDE7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGNoZWNrQm94VGV4dDsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgZGlhbG9nIHdpdGggdGhlIGdpdmVuIHBhcmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9iamVjdCB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgcGFyZW50IHNoZWxsIAotCSAqLwotCXB1YmxpYyBPcHRpb25hbE1lc3NhZ2VEaWFsb2coU3RyaW5nIGlkLCBTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIGRpYWxvZ1RpdGxlLCBTdHJpbmcgZGlhbG9nTWVzc2FnZSwgaW50IGRpYWxvZ1R5cGUsIFN0cmluZ1tdIGJ1dHRvbkxhYmVscywgaW50IGRlZmF1bHRCdXR0b25JbmRleCkgewotCQl0aGlzKGlkLCBwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUsIGRpYWxvZ01lc3NhZ2UsIGRpYWxvZ1R5cGUsIGJ1dHRvbkxhYmVscywgZGVmYXVsdEJ1dHRvbkluZGV4LCBDSEVDS0JPWF9URVhUKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRpYWxvZyB3aXRoIHRoZSBnaXZlbiBwYXJlbnQgYW5kIGEgY2hlY2tib3ggd2l0aCB0aGUgbGFiZWxlZCB3aXRoIHRoZSB0ZXh0IGluIDxjb2RlPmNoZWNrQm94VGV4dDwvY29kZT4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwKLQkgKiAgICAgICAgICAgIG9iamVjdCB0aGF0IHJldHVybnMgdGhlIGN1cnJlbnQgcGFyZW50IHNoZWxsIAotCSAqLwkKLQlwdWJsaWMgT3B0aW9uYWxNZXNzYWdlRGlhbG9nKFN0cmluZyBpZCwgU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZyBkaWFsb2dUaXRsZSwgU3RyaW5nIGRpYWxvZ01lc3NhZ2UsIGludCBkaWFsb2dUeXBlLCBTdHJpbmdbXSBidXR0b25MYWJlbHMsIGludCBkZWZhdWx0QnV0dG9uSW5kZXgsIFN0cmluZyBjaGVja0JveFRleHQpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIGRpYWxvZ1RpdGxlLCBudWxsLCBkaWFsb2dNZXNzYWdlLCBkaWFsb2dUeXBlLCBidXR0b25MYWJlbHMsIGRlZmF1bHRCdXR0b25JbmRleCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5jaGVja0JveFRleHQgPSBjaGVja0JveFRleHQ7Ci0JfQotCQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUN1c3RvbUFyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAlmaW5hbCBCdXR0b24gY2hlY2tib3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLSAgICAJY2hlY2tib3guc2V0VGV4dCh0aGlzLmNoZWNrQm94VGV4dCk7Ci0gICAgCWNoZWNrYm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0gICAgCWNoZWNrYm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIAljaGVja2JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZXREaWFsb2dFbmFibGVkKGlkLCAhKChCdXR0b24pZS53aWRnZXQpLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLSAgICAJfSk7Ci0gICAgCXJldHVybiBjaGVja2JveDsKLSAgICB9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgZGlhbG9nIHNldHRpbmdzCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXNldHRpbmdzPSBzZXR0aW5ncy5nZXRTZWN0aW9uKFNUT1JFX0lEKTsKLQkJaWYgKHNldHRpbmdzID09IG51bGwpCi0JCQlzZXR0aW5ncz0gSmF2YVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKS5hZGROZXdTZWN0aW9uKFNUT1JFX0lEKTsKLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotCS8qKgotCSAqIEFuc3dlcnMgd2hldGhlciB0aGUgb3B0aW9uYWwgZGlhbG9nIGlzIGVuYWJsZWQgYW5kIHNob3VsZCBiZSBzaG93bi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaWFsb2dFbmFibGVkKFN0cmluZyBrZXkpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlyZXR1cm4gIXNldHRpbmdzLmdldEJvb2xlYW4oa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgdGhlIG9wdGlvbmFsIGRpYWxvZyBpcyBlbmFibGVkIGFuZCBzaG91bGQgYmUgc2hvd24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERpYWxvZ0VuYWJsZWQoU3RyaW5nIGtleSwgYm9vbGVhbiBpc0VuYWJsZWQpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSBnZXREaWFsb2dTZXR0aW5ncygpOwotCQlzZXR0aW5ncy5wdXQoa2V5LCAhaXNFbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgYWxsIHJlbWVtYmVyZWQgaW5mb3JtYXRpb24gYWJvdXQgaGlkZGVuIGRpYWxvZ3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJBbGxSZW1lbWJlcmVkU3RhdGVzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IEphdmFQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCXNldHRpbmdzLmFkZE5ld1NlY3Rpb24oU1RPUkVfSUQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTFkZGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSXRlbUxhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgdXBkYXRpbmcKLSAqIGxhYmVsIGluZm9ybWF0aW9uIGZvciBhIE1vZGVsIG9iamVjdC4KLSAqIAotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAjYnVpbGRJbWFnZU1vZGVsKCkKLSAqIAkgICByZXR1cm4gYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IHJlcHJlc2VudHMgdGhlIGltYWdlIGZvciB0aGUgCi0gKiAgICAgcmVwcmVzZW50ZWQgbW9kZWwgb2JqZWN0Ci0gKiAjYnVpbGRUZXh0TW9kZWwoKQotICogICAgIHJldHVybiBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgdGV4dCBmb3IgdGhlIAotICogICAgIHJlcHJlc2VudGVkIG1vZGVsIG9iamVjdC4KLSAqICNidWlsZERlc2NyaXB0aW9uTW9kZWwoKQotICogCSAgIHJldHVybiBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgZGVzY3JpcHRpb24gZm9yIAotICogICAgIHRoZSByZXByZXNlbnRlZCBtb2RlbCBvYmplY3QKLSAqIAotICogT3RoZXIgbWV0aG9kcyBtYXkgYmUgb3ZlcnJpZGRlbiwgYnV0IHRha2UgY2FyZSB0byBwcmVzZXJ2ZSB0aGUgbG9naWMgcHJvdmlkZWQgCi0gKiBieSB0aGlzIGNsYXNzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIE1vZGVsIG1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBpbWFnZU1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVzY3JpcHRpb25Nb2RlbDsKLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGFiZWxDaGFuZ2VMaXN0ZW5lcjsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcigKLQkJCU1vZGVsIG1vZGVsLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubGFiZWxQcm92aWRlciA9IGxhYmVsUHJvdmlkZXI7Ci0JCXRoaXMubGFiZWxDaGFuZ2VMaXN0ZW5lciA9IGJ1aWxkTGFiZWxDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciB0byB1cGRhdGUgdGhlIHZpZXdlciAodGhyb3VnaCB0aGUgbGFiZWwgcHJvdmlkZXIpCi0JICogaWYgdGhlIHRleHQgb3IgaW1hZ2UgY2hhbmdlcwotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGFiZWxDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRMYWJlbFByb3ZpZGVyKCkudXBkYXRlTGFiZWwoZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaW1hZ2UgdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBnZXRJbWFnZU1vZGVsKCkgewotCQlpZiAodGhpcy5pbWFnZU1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuaW1hZ2VNb2RlbCA9IGJ1aWxkSW1hZ2VNb2RlbCgpOwotCQkJZW5nYWdlSW1hZ2VNb2RlbCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmltYWdlTW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpbWFnZSBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpOwotCQotCS8qKiAKLQkgKiBTaG91bGQgb25seSBiZSBvdmVycmlkZGVuIHdpdGggYSBjYWxsIHRvIHN1cGVyLmVuZ2FnZUltYWdlTW9kZWwoKSBiZWZvcmUgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSW1hZ2VNb2RlbCgpIHsKLQkJdGhpcy5pbWFnZU1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNlbmdhZ2VJbWFnZU1vZGVsKCkgYWZ0ZXIgCi0JICogc3ViY2xhc3MgbG9naWMgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSW1hZ2VNb2RlbCgpIHsKLQkJdGhpcy5pbWFnZU1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxhYmVsQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZ2V0VGV4dE1vZGVsKCkgewotCQlpZiAodGhpcy50ZXh0TW9kZWwgPT0gbnVsbCkgewotCQkJdGhpcy50ZXh0TW9kZWwgPSBidWlsZFRleHRNb2RlbCgpOwotCQkJZW5nYWdlVGV4dE1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudGV4dE1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0ZXh0IHZhbHVlIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCk7Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZW5nYWdlVGV4dE1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVRleHRNb2RlbCgpIHsKLQkJdGhpcy50ZXh0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKiAKLQkgKiBTaG91bGQgb25seSBiZSBvdmVycmlkZGVuIHdpdGggYSBjYWxsIHRvIHN1cGVyLmRpc2VuZ2FnZVRleHRNb2RlbCgpIGFmdGVyIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVRleHRNb2RlbCgpIHsKLQkJdGhpcy50ZXh0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGFiZWxDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gdmFsdWUgbW9kZWwKLQkgKiAobGF6eSBhbmQganVzdC1pbi10aW1lIGluaXRpYWxpemVkKQotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZ2V0RGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJaWYgKHRoaXMuZGVzY3JpcHRpb25Nb2RlbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uTW9kZWwgPSBidWlsZERlc2NyaXB0aW9uTW9kZWwoKTsKLQkJCWVuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbk1vZGVsOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBkZXNjcmlwdGlvbiB2YWx1ZSBtb2RlbAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKTsKLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VEZXNjcmlwdGlvbk1vZGVsKCkgYmVmb3JlIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25Nb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5sYWJlbENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlRGVzY3JpcHRpb25Nb2RlbCgpIGFmdGVyIAotCSAqIHN1YmNsYXNzIGxvZ2ljIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25Nb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5sYWJlbENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhpcyBpdGVtCi0JICovCi0JcHVibGljIE1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsYWJlbCBwcm92aWRlciB0aGF0IGRlbGVnYXRlcyB0byB0aGlzIGl0ZW0KLQkgKi8KLQlwdWJsaWMgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldEltYWdlTW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0TW9kZWwoKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb25Nb2RlbCgpLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc3Bvc2VUZXh0TW9kZWwoKTsKLQkJZGlzcG9zZUltYWdlTW9kZWwoKTsKLQkJZGlzcG9zZURlc2NyaXB0aW9uTW9kZWwoKTsJCi0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlVGV4dE1vZGVsKCkgewotCQlpZiAodGhpcy50ZXh0TW9kZWwgIT0gbnVsbCkgewotCQkJZGlzZW5nYWdlVGV4dE1vZGVsKCk7Ci0JCQl0aGlzLnRleHRNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2VJbWFnZU1vZGVsKCkgewotCQlpZiAodGhpcy5pbWFnZU1vZGVsICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZUltYWdlTW9kZWwoKTsKLQkJCXRoaXMuaW1hZ2VNb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGRpc3Bvc2VEZXNjcmlwdGlvbk1vZGVsKCkgewotCQlpZiAodGhpcy5kZXNjcmlwdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCWRpc2VuZ2FnZURlc2NyaXB0aW9uTW9kZWwoKTsKLQkJCXRoaXMuZGVzY3JpcHRpb25Nb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0Fic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTYzMWI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmVlSXRlbUNvbnRlbnRQcm92aWRlcn0gdGhhdCBwcm92aWRlcyB1cGRhdGluZwotICogY2hpbGRyZW4gaW5mb3JtYXRpb24gZm9yIGEgTW9kZWwgb2JqZWN0LgotICogCi0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKLSAqICNnZXRQYXJlbnQoKQotICogICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGlzIG1ldGhvZCBpcyB0byByZXR1cm4gbnVsbC4gIHRoZXJlIGlzIG5vIAotICogICAgIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGlzIGFzIHRoaXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2luZyBmb3IgYSBnaXZlbgotICogICAgIG5vZGUuICBhbGwgc3VjaCBjaGFuZ2VzIHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlIHBhcmVudCBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAuCi0gKiAjYnVpbGRDaGlsZHJlbk1vZGVsKCkKLSAqICAgICByZXR1cm4gYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IHRoYXQgcmVwcmVzZW50cyB0aGUgY2hpbGRyZW4gZm9yIHRoZSByZXByZXNlbnRlZAotICogICAgIG1vZGVsIG9iamVjdC4gICNidWlsZENoaWxkcmVuTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWwpIGFuZCAKLSAqICAgICAjYnVpbGRDaGlsZHJlbk1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbCkgYXJlIHByb3ZpZGVkIGlmIHRoZSBjaGlsZHJlbiBhcmUgbW9yZQotICogICAgIGVhc2lseSByZXByZXNlbnRlZCBhcyBhIGNvbGxlY3Rpb24gb3IgYXMgYSBwcm9wZXJ0eSAoc2luZ2xlIGNoaWxkKQotICogICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJldHVybiBhIHtAbGluayBOdWxsTGlzdFZhbHVlTW9kZWx9Ci0gKiAKLSAqIE90aGVyIG1ldGhvZHMgbWF5IGJlIG92ZXJyaWRkZW4sIGJ1dCB0YWtlIGNhcmUgdG8gcHJlc2VydmUgdGhlIGxvZ2ljIHByb3ZpZGVkIAotICogYnkgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8RT4KLQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXI7Ci0JCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQkKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNoaWxkcmVuTW9kZWw7Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY2hpbGRyZW5MaXN0ZW5lcjsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCU1vZGVsIG1vZGVsLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHRyZWVDb250ZW50UHJvdmlkZXIpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnRyZWVDb250ZW50UHJvdmlkZXIgPSB0cmVlQ29udGVudFByb3ZpZGVyOwotCQl0aGlzLmNoaWxkcmVuTGlzdGVuZXIgPSBidWlsZENoaWxkcmVuTGlzdGVuZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdGVuZXIgdG8gcmVmcmVzaCB0aGUgdHJlZSAodGhyb3VnaCB0aGUgdHJlZSBjb250ZW50IHByb3ZpZGVyKQotCSAqIGlmIHRoZSBjaGlsZHJlbiBjaGFuZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0VHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQoZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkudXBkYXRlQ29udGVudChnZXRNb2RlbCgpKTsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJCQlnZXRUcmVlQ29udGVudFByb3ZpZGVyKCkuZGlzcG9zZShpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS51cGRhdGVDb250ZW50KGdldE1vZGVsKCkpOwotCQkJCS8vIGluIHRoZSBjYXNlIG9mIGEgbGlzdCBjaGFuZ2VkIGV2ZW50LCB3ZSBkb24ndCBoYXZlIAotCQkJCS8vIGFjY2VzcyB0byB0aGUgcmVtb3ZlZCBvYmplY3RzLCBzbyB3ZSBjYW4ndCBkaXNwb3NlIHRoZW0uCi0JCQkJLy8ga2VlcCBhIHdhdGNoIG9uIHRoaXMgdG8gc2VlIGlmIHRoaXMgYmVjb21lcyBhIHByb2JsZW0uCi0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0VHJlZUNvbnRlbnRQcm92aWRlcigpLnVwZGF0ZUNvbnRlbnQoZ2V0TW9kZWwoKSk7Ci0JCQkJLy8gaW4gdGhlIGNhc2Ugb2YgYSBsaXN0IGNsZWFyZWQgZXZlbnQsIHdlIGRvbid0IGhhdmUgCi0JCQkJLy8gYWNjZXNzIHRvIHRoZSByZW1vdmVkIG9iamVjdHMsIHNvIHdlIGNhbid0IGRpc3Bvc2UgdGhlbS4KLQkJCQkvLyBrZWVwIGEgd2F0Y2ggb24gdGhpcyB0byBzZWUgaWYgdGhpcyBiZWNvbWVzIGEgcHJvYmxlbS4KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGlsZHJlbiBtb2RlbAotCSAqIChsYXp5IGFuZCBqdXN0LWluLXRpbWUgaW5pdGlhbGl6ZWQpCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBJdGVyYXRvcjxFPiBjaGlsZHJlbk1vZGVsKCkgewotCQlpZiAodGhpcy5jaGlsZHJlbk1vZGVsID09IG51bGwpIHsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpOwotCQkJZW5nYWdlQ2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNoaWxkcmVuIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4oKTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUgY2hpbGRyZW4gbW9kZWwgaXMgYmV0dGVyIHJlcHJlc2VudGVkCi0JICogYXMgYSBjb2xsZWN0aW9uLgotCSAqIFRoaXMgd3JhcHMgdGhlIGNoaWxkcmVuIGNvbGxlY3Rpb24gbW9kZWwgYW5kIHVzZXMgaXQgaW50ZXJuYWxseSBhcyBhIGxpc3QKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gYnVpbGRDaGlsZHJlbk1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGx2bSkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obHZtKTsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2QgdGhhdCBjYW4gYmUgdXNlZCBpZiB0aGUgY2hpbGRyZW4gbW9kZWwgaXMgYmV0dGVyIHJlcHJlc2VudGVkCi0JICogYXMgYSBzaW5nbGUgdmFsdWUgcHJvcGVydHkuCi0JICogVGhpcyB3cmFwcyB0aGUgY2hpbGRyZW4gKGNoaWxkKSBwcm9wZXJ0eSBtb2RlbCBhbmQgdXNlcyBpdCBpbnRlcm5hbGx5IGFzIGEgbGlzdAotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFPiBidWlsZENoaWxkcmVuTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGx2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGx2bSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbW9kZWwgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJlZSBjb250ZW50IHByb3ZpZGVyIHRoYXQgZGVsZWdhdGVzIHRvIHRoaXMgbm9kZQotCSAqLwotCXB1YmxpYyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGdldFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRyZWVDb250ZW50UHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmNoaWxkcmVuTW9kZWwoKSk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHdpdGggcG90ZW50aWFsbHkgbW9yZSBlZmZpY2llbnQgbG9naWMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLmhhc05leHQoKTsKLQl9Ci0JCi0JLyoqCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5kaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmb3IgKE9iamVjdCBjaGlsZCA6IGdldENoaWxkcmVuKCkpIHsKLQkJCWdldFRyZWVDb250ZW50UHJvdmlkZXIoKS5kaXNwb3NlKGNoaWxkKTsKLQkJfQotCQlkaXNwb3NlQ2hpbGRyZW5Nb2RlbCgpOwotCX0KLQkKLQkvKiogCi0JICogU2hvdWxkIG9ubHkgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgY2FsbCB0byBzdXBlci5lbmdhZ2VDaGlsZHJlbigpIGJlZm9yZSAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VDaGlsZHJlbigpIHsKLQkJdGhpcy5jaGlsZHJlbk1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY2hpbGRyZW5MaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNwb3NlQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJaWYgKHRoaXMuY2hpbGRyZW5Nb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZUNoaWxkcmVuTW9kZWwoKTsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IG51bGw7Ci0JCX0KLQl9Ci0JLyoqIAotCSAqIFNob3VsZCBvbmx5IGJlIG92ZXJyaWRkZW4gd2l0aCBhIGNhbGwgdG8gc3VwZXIuZGlzZW5nYWdlQ2hpbGRyZW4oKSBhZnRlciAKLQkgKiBzdWJjbGFzcyBsb2dpYyAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VDaGlsZHJlbk1vZGVsKCkgewotCQl0aGlzLmNoaWxkcmVuTW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0FyY2hpdmVGaWxlVmlld2VyRmlsdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0FyY2hpdmVGaWxlVmlld2VyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZmY1NTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9BcmNoaXZlRmlsZVZpZXdlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLkpwdENvbW1vblVpUGx1Z2luOwotCi0vKioKLSAqIFRoaXMgZmlsdGVyIHdpbGwgZGVueSBzaG93aW5nIGFueSBmaWxlIHRoYXQgYXJlIG5vdCBKQVIgZmlsZXMgb3IgZm9sZGVycwotICogdGhhdCBkb24ndCBjb250YWluIGFueSBKQVIgZmlsZXMgaW4gaXRzIHN1Yi1oaWVyYXJjaHkuIAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIgCi0JZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gYXJjaGl2ZUV4dGVuc2lvbnM9IHsgImphciIsICJ6aXAiIH07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkKLQkKLQlwdWJsaWMgQXJjaGl2ZUZpbGVWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdCgKLQkJCVZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnRFbGVtZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gaXNBcmNoaXZlUGF0aCgoKElGaWxlKWVsZW1lbnQpLmdldEZ1bGxQYXRoKCkpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRm9sZGVyKSB7Ci0JCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBlbGVtZW50OwotCQkJdHJ5IHsKLQkJCQlmb3IgKElSZXNvdXJjZSBlYWNoIDogZm9sZGVyLm1lbWJlcnMoKSkgewotCQkJCQlpZiAoc2VsZWN0KHZpZXdlciwgZm9sZGVyLCBlYWNoKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCS8vIGp1c3Qgc2tpcCB0aGlzIG9uZSwgdGhlbgotCQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhjZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcmNoaXZlUGF0aChJUGF0aCBwYXRoKSB7Ci0JCVN0cmluZyBleHQ9IHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQlpZiAoZXh0ICE9IG51bGwgJiYgZXh0Lmxlbmd0aCgpICE9IDApIHsKLQkJCWZvciAoaW50IGk9IDA7IGkgPCBhcmNoaXZlRXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChleHQuZXF1YWxzSWdub3JlQ2FzZShhcmNoaXZlRXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGYyMTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogRXh0ZW5zaW9uIG9mIHtAbGluayBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMgYW4gZXh0ZW5zaW9uCi0gKiB0byBwcm92aWRlIHRyZWUgY29udGVudAotICovCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciAKLQlleHRlbmRzIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIKLXsKLQlwdWJsaWMgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSB0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkpIHsKLQkJc3VwZXIodHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgdHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LAotCQkJSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSkgewotCQlzdXBlcih0cmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnksIGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyKE9iamVjdCBpdGVtKSB7Ci0JCXJldHVybiAoVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIpIHN1cGVyLml0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSk7Ci0JfQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIocGFyZW50RWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBuZXcgT2JqZWN0WzBdIDogcHJvdmlkZXIuZ2V0Q2hpbGRyZW4oKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IGl0ZW1Db250ZW50UHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDogcHJvdmlkZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUNvbnRlbnRQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IGZhbHNlIDogcHJvdmlkZXIuaGFzQ2hpbGRyZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL0ltYWdlSW1hZ2VEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMDc5ZTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9JbWFnZUltYWdlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZURhdGE7Ci0KLS8qKgotICogSW1hZ2UgZGVzY3JpcHRvciBmb3IgYW4gaW1hZ2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbWFnZUltYWdlRGVzY3JpcHRvciBleHRlbmRzIEltYWdlRGVzY3JpcHRvciAKLXsKLQkKLQlwcml2YXRlIEltYWdlIGZJbWFnZTsKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSW1hZ0ltYWdlRGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgSW1hZ2VJbWFnZURlc2NyaXB0b3IoSW1hZ2UgaW1hZ2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mSW1hZ2UgPSBpbWFnZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIChvYmogIT0gbnVsbCkgJiYgZ2V0Q2xhc3MoKS5lcXVhbHMob2JqLmdldENsYXNzKCkpICYmIHRoaXMuZkltYWdlLmVxdWFscygoKEltYWdlSW1hZ2VEZXNjcmlwdG9yKSBvYmopLmZJbWFnZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCkgewotCQlyZXR1cm4gdGhpcy5mSW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmZJbWFnZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvTnVsbExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4MGIzZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL051bGxMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogTnVsbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUxhYmVsUHJvdmlkZXIgaW50ZXJmYWNlLgotICogSW1wbGVtZW50ZWQgYXMgYSBzaW5nbGV0b24uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGFiZWxQcm92aWRlciAKLQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyIAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgTnVsbExhYmVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbExhYmVsUHJvdmlkZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgSUxhYmVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgYSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL051bGxUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNTBmZmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9qZmFjZS9OdWxsVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLQotLyoqCi0gKiBOdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBJTGFiZWxQcm92aWRlciBpbnRlcmZhY2UuCi0gKiBJbXBsZW1lbnRlZCBhcyBhIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxUcmVlQ29udGVudFByb3ZpZGVyCi0JaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciAKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBOdWxsVHJlZUNvbnRlbnRQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsVHJlZUNvbnRlbnRQcm92aWRlcigpOwotCi0JcHVibGljIHN0YXRpYyBJVHJlZUNvbnRlbnRQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBhIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE51bGxUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQlyZXR1cm4gRU1QVFlfQVJSQVk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBFTVBUWV9BUlJBWTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvamZhY2UvU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5NTMwMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2pmYWNlL1N0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdExpc3RWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGFuIEFic3RyYWN0TGlzdFZpZXdlcgotICogKGUuZy4gYSBMaXN0Vmlld2VyIG9yIENvbWJvVmlld2VyKSBpbiBzeW5jaCB3aXRoIGEgTGlzdFZhbHVlTW9kZWwKLSAqIChvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsKS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyCi0JaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotewotCS8qKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbCBsaXN0SG9sZGVyOwotCi0JLyoqIFRoZSBsaXN0IHZpZXdlciB3ZSBrZWVwIGluIHN5bmNoIHdpdGggdGhlIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIEFic3RyYWN0TGlzdFZpZXdlciBsaXN0Vmlld2VyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBsaXN0IHZpZXdlciB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaG9sZGVyIHNvIHRoZXkKLQkgKiBzdGF5IGluIHN5bmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIgYWRhcHQoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXIpIHsKLQkJLy8gd2UgbmVlZCBvbmx5IGNvbnN0cnVjdCB0aGUgYWRhcHRlciBhbmQgaXQgd2lsbCBob29rIHVwIHRvIHRoZSBsaXN0IHZpZXdlciBldGMuCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIobGlzdFZpZXdlciwgbGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBsaXN0IHZpZXdlciB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaG9sZGVyIHNvIHRoZXkKLQkgKiBzdGF5IGluIHN5bmNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIgYWRhcHQoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJLy8gd2UgbmVlZCBvbmx5IGNvbnN0cnVjdCB0aGUgYWRhcHRlciBhbmQgaXQgd2lsbCBob29rIHVwIHRvIHRoZSBsaXN0IHZpZXdlciBldGMuCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIobGlzdFZpZXdlciwgY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIExpc3RWYWx1ZU1vZGVsIGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdFZpZXdlciA9IGxpc3RWaWV3ZXI7Ci0JCXRoaXMubGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodGhpcyk7Ci0JCS8vIHRoZSBsaXN0IHZpZXdlciB3aWxsIGNhbGwgYmFjayB0byAjaW5wdXRDaGFuZ2VkKFZpZXdlciwgT2JqZWN0LCBPYmplY3QpCi0JCXRoaXMubGlzdFZpZXdlci5zZXRJbnB1dChsaXN0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIoQWJzdHJhY3RMaXN0Vmlld2VyIGxpc3RWaWV3ZXIsIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhsaXN0Vmlld2VyLCBuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihjb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlckFkYXB0ZXIudGhpcy5saXN0Q2hhbmdlZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCWlmIChpbnB1dEVsZW1lbnQgIT0gdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGlucHV0IGVsZW1lbnQ6ICIgKyBpbnB1dEVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBsaXN0IHZpZXdlciwgc28gZG9uJ3QgdXBkYXRlIHRoZSBsaXN0IHZpZXdlciBoZXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAodmlld2VyICE9IHRoaXMubGlzdFZpZXdlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCB2aWV3ZXI6ICIgKyB2aWV3ZXIpOwotCQl9Ci0JCWlmIChvbGRJbnB1dCAhPSB0aGlzLmxpc3RIb2xkZXIpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgb2xkIGlucHV0OiAiICsgb2xkSW5wdXQpOwotCQl9Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKChMaXN0VmFsdWVNb2RlbCkgb2xkSW5wdXQsIChMaXN0VmFsdWVNb2RlbCkgbmV3SW5wdXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgLSBsaXN0ZW5lcnMgc2hvdWxkJ3ZlIGFscmVhZHkgYmVlbiByZW1vdmVkIGluICNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoTGlzdFZhbHVlTW9kZWwgb2xkTW9kZWwsIExpc3RWYWx1ZU1vZGVsIG5ld01vZGVsKSB7Ci0JCWlmIChvbGRNb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3TW9kZWw7Ci0JCWlmIChuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdFZhbHVlTW9kZWwgbW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWwgbGlzdEhvbGRlcikgewotCQkvLyB0aGUgbGlzdCB2aWV3ZXIgd2lsbCBjYWxsIGJhY2sgdG8gI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQl0aGlzLmxpc3RWaWV3ZXIuc2V0SW5wdXQobGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWwgY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzLnNldE1vZGVsKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoT2JqZWN0IGl0ZW0gOiBlLmdldEl0ZW1zKCkpIHsKLQkJCXRoaXMubGlzdFZpZXdlci5pbnNlcnQoaXRlbSwgaSsrKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQl0aGlzLmxpc3RWaWV3ZXIucmVtb3ZlKEFycmF5VG9vbHMuYXJyYXkoZS5nZXRJdGVtcygpLCBlLmdldEl0ZW1zU2l6ZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQl0aGlzLmxpc3RWaWV3ZXIucmVtb3ZlKEFycmF5VG9vbHMuYXJyYXkoZS5nZXRPbGRJdGVtcygpLCBlLmdldEl0ZW1zU2l6ZSgpKSk7Ci0JCWludCBpID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogZS5nZXROZXdJdGVtcygpKSB7Ci0JCQl0aGlzLmxpc3RWaWV3ZXIuaW5zZXJ0KGl0ZW0sIGkrKyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgdmlld2VyLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCWludCBsZW4gPSBlLmdldExlbmd0aCgpOwotCQlPYmplY3RbXSBpdGVtcyA9IG5ldyBPYmplY3RbbGVuXTsKLQkJaW50IG9mZnNldCA9IGUuZ2V0U291cmNlSW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaXRlbXNbaV0gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KG9mZnNldCArIGkpOwotCQl9Ci0JCXRoaXMubGlzdFZpZXdlci5yZW1vdmUoaXRlbXMpOwotCi0JCW9mZnNldCA9IGUuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5saXN0Vmlld2VyLmluc2VydChpdGVtc1tpXSwgb2Zmc2V0ICsgaSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IHdhcyBjbGVhcmVkLgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZCgpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGhhcyBjaGFuZ2VkICJkcmFtYXRpY2FsbHkiLgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHZpZXdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZCgpIHsKLQkJdGhpcy5saXN0Vmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE4NzA4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRGlzcGxheSNzeW5jRXhlYyhSdW5uYWJsZSl9IGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uVUlUaHJlYWQoUnVubmFibGUgcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocik7Ci0vLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkXyhDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkXyhDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjEwODBkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcihMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZExpc3RDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zTW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZXBsYWNlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBEaXNwbGF5I3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1ZmJlNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4gKFR5cGljYWxseSwgdGhlIGFkYXB0ZXIocykgYmV0d2VlbiBhIDxlbT5wcm9wZXJ0eTwvZW0+IGFuZAotICogaXRzIGNvcnJlc3BvbmRpbmcgVUkgd2lkZ2V0IGFyZSByZWFkLXdyaXRlOyBhcyBvcHBvc2VkIHRvIHRoZSBhZGFwdGVyKHMpCi0gKiBiZXR3ZWVuIGEgPGVtPmNvbGxlY3Rpb248L2VtPiAob3IgPGVtPmxpc3Q8L2VtPikgYW5kIGl0cyBVSSB3aWRnZXQsIHdoaWNoCi0gKiBpcyByZWFkLW9ubHkuKQotICovCi1wdWJsaWMgY2xhc3MgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIERpc3BsYXkjc3luY0V4ZWMoUnVubmFibGUpfSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCX0KLQotCXZvaWQgcHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiZjExOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGNsYXNzIFNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFN0YXRlQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3RhdGVDaGFuZ2VkUnVubmFibGUoZmluYWwgU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBEaXNwbGF5I2FzeW5jRXhlYyhSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBEaXNwbGF5I3N5bmNFeGVjKFJ1bm5hYmxlKX0gY2FuIHNvbXRpbWVzIG1ha2UgdGhpbmdzCi0JICogbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25VSVRocmVhZChSdW5uYWJsZSByKSB7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLS8vCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQl9Ci0KLQl2b2lkIHN0YXRlQ2hhbmdlZF8oU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJTV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDI1NWU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvbGlzdGVuZXJzL1NXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBTV1QKLSAqIFVJIHRocmVhZCwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LgotICovCi1wdWJsaWMgY2xhc3MgU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlcihUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLm5vZGVBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZUFkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGZpbmFsIFRyZWVBZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLm5vZGVSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDbGVhcmVkUnVubmFibGUoZmluYWwgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRGlzcGxheSNhc3luY0V4ZWMoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRGlzcGxheSNzeW5jRXhlYyhSdW5uYWJsZSl9IGNhbiBzb210aW1lcyBtYWtlIHRoaW5ncwotCSAqIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uVUlUaHJlYWQoUnVubmFibGUgcikgewotCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocik7Ci0vLwkJRGlzcGxheS5nZXREZWZhdWx0KCkuc3luY0V4ZWMocik7Ci0JfQotCi0Jdm9pZCBub2RlQWRkZWRfKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0Jdm9pZCBub2RlUmVtb3ZlZF8oVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNsZWFyZWRfKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgdHJlZUNoYW5nZWRfKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZTViZDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pwdFByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlByb2dyZXNzTW9uaXRvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkubGlicHJvdi5MaWJyYXJ5RmFjZXRQcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmludGVybmFsLkZhY2V0c1Byb3BlcnR5UGFnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlCi0JCWV4dGVuZHMgTGlicmFyeUZhY2V0UHJvcGVydHlQYWdlIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SVByb2plY3Q+IHByb2plY3RNb2RlbDsKLQlwcm90ZWN0ZWQgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyIHRyaWdnZXI7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIHZhbGlkYXRpb25MaXN0ZW5lcjsKLQkKLQkKLQlwdWJsaWMgSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlKCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMucHJvamVjdE1vZGVsID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJUHJvamVjdD4oKTsKLQkJdGhpcy50cmlnZ2VyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuVHJpZ2dlcigpOwotCQkKLQkJYnVpbGRNb2RlbHMoKTsKLQkJCi0JCXRoaXMudmFsaWRhdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFZhbGlkYXRpb25MaXN0ZW5lcigpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBCdWlsZCBhbnkgYWRkaXRpb25hbCBtb2RlbHMgbmVlZGVkIGJ5IHRoaXMgcGFnZS4gIFRoZSBwcm9qZWN0IG1vZGVsIGhhcyBiZWVuIGNyZWF0ZWQgYXQgdGhpcwotCSAqIHBvaW50LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGJ1aWxkTW9kZWxzKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZmxhZ0lzU2V0KFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnTW9kZWwpIHsKLQkJQm9vbGVhbiBmbGFnID0gZmxhZ01vZGVsLmdldFZhbHVlKCk7Ci0JCXJldHVybiAoZmxhZyAhPSBudWxsKSAmJiBmbGFnLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIExpYnJhcnlGYWNldFByb3BlcnR5UGFnZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0KLQkKLQlwcm90ZWN0ZWQgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaWJyYXJ5UHJvdmlkZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5LCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSApIHsKLQkJCQkJaWYgKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUuUFJPUF9BVkFJTEFCTEVfUFJPVklERVJTLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCQkJCWFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHBhZ2UgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUGFnZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKHRoaXMucHJvamVjdE1vZGVsLmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCX0KLQkJCi0JCXRoaXMucHJvamVjdE1vZGVsLnNldFZhbHVlKGdldFByb2plY3QoKSk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJY3JlYXRlV2lkZ2V0cyhjb21wb3NpdGUpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb21wb3NpdGUpOwotCQkKLQkJYWRqdXN0TGlicmFyeVByb3ZpZGVycygpOwotCQkKLQkJZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXVwZGF0ZVZhbGlkYXRpb24oKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBzcGVjaWZpYyB3aWRnZXRzLiAgTGF5b3V0IGFuZCB2YWxpZGF0aW9uIHdpbGwgYmUgdGFrZW4gY2FyZSBvZi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVXaWRnZXRzKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJZGlzZW5nYWdlVmFsaWRhdGlvbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaW5rIGJ1aWxkRmFjZXRzUGFnZUxpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGluayBmYWNldHNQYWdlTGluayA9IGJ1aWxkTGluayhwYXJlbnQsIHRleHQpOwotCQlmYWNldHNQYWdlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZEZhY2V0c1BhZ2VMaW5rTGlzdGVuZXIoKSk7ICAvLyB0aGUgbGluayB3aWxsIGJlIEdDZWQKLQkJcmV0dXJuIGZhY2V0c1BhZ2VMaW5rOwotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkRmFjZXRzUGFnZUxpbmtMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3BlblByb2plY3RGYWNldHNQYWdlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJmYWNldHMgcGFnZSBsaW5rIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuUHJvamVjdEZhY2V0c1BhZ2UoKSB7Ci0JCSgoSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIpZ2V0Q29udGFpbmVyKCkpLm9wZW5QYWdlKEZhY2V0c1Byb3BlcnR5UGFnZS5JRCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIERvbid0IGFsbG93IHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NvbXB1dGVTaXplKCl9Ci0JICogdG8gY2FjaGUgdGhlIHBhZ2UncyBzaXplLCBzaW5jZSB0aGUgc2l6ZSBvZiB0aGUgIkxpYnJhcnkiIHBhbmVsIGNhbgotCSAqIGNoYW5nZSBkZXBlbmRpbmcgb24gdGhlIHVzZXIncyBzZWxlY3Rpb24gZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFBvaW50IGNvbXB1dGVTaXplKCkgewotCQlyZXR1cm4gdGhpcy5kb0NvbXB1dGVTaXplKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogd2lkZ2V0cyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGJ1aWxkQnV0dG9uKHBhcmVudCwgaG9yaXpvbnRhbFNwYW4sIHRleHQsIFNXVC5DSEVDSyk7Ci0JfQotCQotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBpbnQgaG9yaXpvbnRhbFNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBidWlsZEJ1dHRvbihwYXJlbnQsIGhvcml6b250YWxTcGFuLCB0ZXh0LCBTV1QuUkFESU8pOwotCX0KLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGJ1aWxkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gYnVpbGREcm9wRG93bihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBidWlsZERyb3BEb3duKHBhcmVudCwgMSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBidWlsZERyb3BEb3duKENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQljb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGluayBidWlsZExpbmsoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxpbms7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogT0svUmV2ZXJ0L0FwcGx5IGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJdHJ5IHsKLQkJCS8vIHRydWU9Zm9yazsgZmFsc2U9dW5jYW5jZWxsYWJsZQotCQkJdGhpcy5idWlsZE9rUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKCkucnVuKHRydWUsIGZhbHNlLCB0aGlzLmJ1aWxkT2tSdW5uYWJsZVdpdGhQcm9ncmVzcygpKTsKLQkJfQotCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSAKLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgSVJ1bm5hYmxlQ29udGV4dCBidWlsZE9rUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotCX0KLQotCXByaXZhdGUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIGJ1aWxkT2tSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJcmV0dXJuIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCUlXb3Jrc3BhY2Ugd3MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gdGhlIGJ1aWxkIHdlIGV4ZWN1dGUgaW4gI3BlcmZvcm1Pa18oKSBsb2NrcyB0aGUgd29ya3NwYWNlIHJvb3QsCi0JCQkJCS8vIHNvIHdlIG5lZWQgdG8gdXNlIHRoZSB3b3Jrc3BhY2Ugcm9vdCBhcyBvdXIgc2NoZWR1bGluZyBydWxlIGhlcmUKLQkJCQkJd3MucnVuKAotCQkJCQkJCWJ1aWxkT2tXb3Jrc3BhY2VSdW5uYWJsZSgpLAotCQkJCQkJCXdzLmdldFJvb3QoKSwKLQkJCQkJCQlJV29ya3NwYWNlLkFWT0lEX1VQREFURSwKLQkJCQkJCQltb25pdG9yKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyogcHJpdmF0ZSAqLyBJV29ya3NwYWNlUnVubmFibGUgYnVpbGRPa1dvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlwZXJmb3JtT2tfKG1vbml0b3IpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvLyAqKioqKioqKioqIE9LL1JldmVydC9BcHBseSBiZWhhdmlvciAqKioqKioqKioqCi0JCi0Jdm9pZCBwZXJmb3JtT2tfKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaXNCdWZmZXJpbmcoKSkgewotCQkJYm9vbGVhbiByZWJ1aWxkID0gcHJvamVjdFJlYnVpbGRSZXF1aXJlZCgpOwotCQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQkJaWYgKHJlYnVpbGQpIHsKLQkJCQlyZWJ1aWxkUHJvamVjdCgpOwotCQkJfQotCQkJdGhpcy5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5GVUxMX0JVSUxELCBtb25pdG9yKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBwcm9qZWN0UmVidWlsZFJlcXVpcmVkKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVidWlsZFByb2plY3QoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbnkgb2YgdGhlIG1vZGVscyBhcmUgYnVmZmVyaW5nIGEgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0J1ZmZlcmluZygpIHsKLQkJZm9yIChCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IG1vZGVsIDogYnVpbGRCdWZmZXJlZE1vZGVscygpKSB7Ci0JCQlpZiAobW9kZWwuaXNCdWZmZXJpbmcoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBidWlsZEJ1ZmZlcmVkTW9kZWxzKCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZGlzZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsaWRhdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoKSB7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbGlkYXRpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAoICEgZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJdXBkYXRlVmFsaWRhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpIHsKLQkJZm9yIChNb2RlbCBtb2RlbCA6IGJ1aWxkVmFsaWRhdGlvbk1vZGVscygpKSB7Ci0JCQltb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLnZhbGlkYXRpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IE1vZGVsW10gYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCk7Ci0JCi0JcHJpdmF0ZSB2b2lkIGRpc2VuZ2FnZVZhbGlkYXRpb25MaXN0ZW5lcigpIHsKLQkJZm9yIChNb2RlbCBtb2RlbCA6IGJ1aWxkUmV2ZXJzZVZhbGlkYXRpb25Nb2RlbHMoKSkgewotCQkJbW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWxpZGF0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBNb2RlbFtdIGJ1aWxkUmV2ZXJzZVZhbGlkYXRpb25Nb2RlbHMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLnJldmVyc2UoYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBFUlJPUl9TVEFUVVMgPSBJbnRlZ2VyLnZhbHVlT2YoSVN0YXR1cy5FUlJPUik7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdBUk5JTkdfU1RBVFVTID0gSW50ZWdlci52YWx1ZU9mKElTdGF0dXMuV0FSTklORyk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElORk9fU1RBVFVTID0gSW50ZWdlci52YWx1ZU9mKElTdGF0dXMuSU5GTyk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIE9LX1NUQVRVUyA9IEludGVnZXIudmFsdWVPZihJU3RhdHVzLk9LKTsKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyBidWlsZEluZm9TdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgYnVpbGRXYXJuaW5nU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RhdHVzKElTdGF0dXMuV0FSTklORywgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIGJ1aWxkRXJyb3JTdGF0dXMoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdGF0dXMoSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJU3RhdHVzIGJ1aWxkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpwdENvbW1vbkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgcGVyZm9ybVZhbGlkYXRpb24oKSB7Ci0JCUhhc2hNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PiBzdGF0dXNlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEFycmF5TGlzdDxJU3RhdHVzPj4oKTsKLQkJc3RhdHVzZXMucHV0KEVSUk9SX1NUQVRVUywgbmV3IEFycmF5TGlzdDxJU3RhdHVzPigpKTsKLQkJc3RhdHVzZXMucHV0KFdBUk5JTkdfU1RBVFVTLCBuZXcgQXJyYXlMaXN0PElTdGF0dXM+KCkpOwotCQlzdGF0dXNlcy5wdXQoSU5GT19TVEFUVVMsIG5ldyBBcnJheUxpc3Q8SVN0YXR1cz4oKSk7Ci0JCXN0YXR1c2VzLnB1dChPS19TVEFUVVMsIENvbGxlY3Rpb25Ub29scy5saXN0KFN0YXR1cy5PS19TVEFUVVMpKTsKLQkJCi0JCXBlcmZvcm1WYWxpZGF0aW9uKHN0YXR1c2VzKTsKLQkJCi0JCWlmICggISBzdGF0dXNlcy5nZXQoRVJST1JfU1RBVFVTKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzdGF0dXNlcy5nZXQoRVJST1JfU1RBVFVTKS5nZXQoMCk7Ci0JCX0KLQkJZWxzZSBpZiAoICEgc3RhdHVzZXMuZ2V0KFdBUk5JTkdfU1RBVFVTKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBzdGF0dXNlcy5nZXQoV0FSTklOR19TVEFUVVMpLmdldCgwKTsKLQkJfQotCQllbHNlIGlmICggISBzdGF0dXNlcy5nZXQoSU5GT19TVEFUVVMpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHN0YXR1c2VzLmdldChJTkZPX1NUQVRVUykuZ2V0KDApOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHN0YXR1c2VzLmdldChPS19TVEFUVVMpLmdldCgwKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PiBzdGF0dXNlcykgewotCQkvKiBsaWJyYXJ5IHByb3ZpZGVyICovCi0JCUlTdGF0dXMgbHBTdGF0dXMgPSBzdXBlci5wZXJmb3JtVmFsaWRhdGlvbigpOwotCQlzdGF0dXNlcy5nZXQoSW50ZWdlci52YWx1ZU9mKGxwU3RhdHVzLmdldFNldmVyaXR5KCkpKS5hZGQobHBTdGF0dXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L0Fic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUzYWNhMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBwcm92aWRlcyBhIG1vcmUgb2JqZWN0LW9yaWVudGVkIGludGVyZmFjZSB0byB0aGUgaXRlbXMgYW5kCi0gKiBzZWxlY3RlZCBpdGVtIGluIGEgY29tYm8uCi0gKiA8cD4KLSAqIDxiPmxpc3RIb2xkZXI8L2I+IGNvbnRhaW5zIHRoZSBpdGVtcyBpbiB0aGUgY29tYm8uPGJyPgotICogPGI+c2VsZWN0ZWRJdGVtSG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gJ2xpc3RIb2xkZXInIHRoYXQgYXJlCi0gKiBzZWxlY3RlZCBpbiB0aGUgY29tYm8uCi0gKgotICogQHBhcmFtIDxFPiBUaGUgdHlwZSBvZiB0aGUgaXRlbXMgaW4gPGI+bGlzdEhvbGRlcjwvYj4KLSAqIEBzZWUgQ29tYm9Nb2RlbEFkYXB0ZXIKLSAqIEBzZWUgQ0NvbWJvTW9kZWxBZGFwdGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gewotCi0JLy8gKioqKioqKioqKiBtb2RlbCAqKioqKioqKioqCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29tYm8ncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29tYm8ncyBzZWxlY3Rpb24gd2l0aCB0aGUKLQkgKiBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnZlcnRlciB0aGF0IGNvbnZlcnRzIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0Ci0JICogdG8gc3RyaW5ncyB0aGF0IGNhbiBiZSBwdXQgaW4gdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyOwotCi0JLy8gKioqKioqKioqKiBVSSAqKioqKioqKioqCi0JLyoqCi0JICogVGhlIGNvbWJvIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvSG9sZGVyIGNvbWJvSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBjb21ib01vZGlmeUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIGxpc3QgaG9sZGVyCi0JICogd2l0aCB0aGUgY29tYm8ncyBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGNvbWJvU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0OwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIGRvdWJsZSBjbGljayBldmVudHMuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBkb3VibGVDbGlja0xpc3RlbmVyTGlzdDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgY29tYm8KLQkgKiBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGNvbWJvRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBsaXN0IGhvbGRlciwgc2VsZWN0aW9ucyBob2xkZXIsIGNvbWJvLCBhbmQKLQkgKiBzdHJpbmcgY29udmVydGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDb21ib0hvbGRlciBjb21ib0hvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwobGlzdEhvbGRlciwgICAgICAgICAiVGhlIGhvbGRlciBvZiB0aGUgaXRlbXMiKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChzZWxlY3RlZEl0ZW1Ib2xkZXIsICJUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtIGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoY29tYm9Ib2xkZXIsICAgICAgICAiVGhlIGhvbGRlciBvZiB0aGUgY29tYm8gd2lkZ2V0IGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoc3RyaW5nQ29udmVydGVyLCAgICAiVGhlIHN0cmluZyBjb252ZXJ0ZXIgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIgICAgICAgICA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyID0gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCQl0aGlzLmNvbWJvSG9sZGVyICAgICAgICA9IGNvbWJvSG9sZGVyOwotCQl0aGlzLnN0cmluZ0NvbnZlcnRlciAgICA9IHN0cmluZ0NvbnZlcnRlcjsKLQotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIpOwotCi0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRWRpdGFibGUoKSkgewotCQkJdGhpcy5jb21ib01vZGlmeUxpc3RlbmVyID0gdGhpcy5idWlsZENvbWJvTW9kaWZ5TGlzdGVuZXIoKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcy5jb21ib01vZGlmeUxpc3RlbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuY29tYm9TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuY29tYm9TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdCA9IHRoaXMuYnVpbGREb3VibGVDbGlja0xpc3RlbmVyTGlzdCgpOwotCi0JCXRoaXMuY29tYm9EaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29tYm9EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21ib0hvbGRlci5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy5jb21ib0Rpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIE1vZGlmeUxpc3RlbmVyIGJ1aWxkQ29tYm9Nb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLnRoaXMuY29tYm9TZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29tYm8gbW9kaWZ5IGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmNvbWJvU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbWJvIG1vZGlmeSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPiBidWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPihEb3VibGVDbGlja0xpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdGVuZXJMaXN0PFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBidWlsZFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+KFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkQ29tYm9EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci50aGlzLmNvbWJvRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21ibyBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZUNvbWJvKCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9JdGVtcygpOwotCQl0aGlzLnN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyaW5nIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdDb252ZXJ0ZXIoU3RyaW5nQ29udmVydGVyPEU+IHN0cmluZ0NvbnZlcnRlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKHN0cmluZ0NvbnZlcnRlciwgIlRoZSBTdHJpbmdDb252ZXJ0ZXIgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBzdHJpbmdDb252ZXJ0ZXI7Ci0JCXRoaXMuc3luY2hyb25pemVDb21ibygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGUgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgaXRlbSB0byBhCi0JICogc3RyaW5nIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnQoRSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcoaXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQnJ1dGUgZm9yY2Ugc3luY2hyb25pemF0aW9uIG9mIGNvbWJvIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVDb21ib0l0ZW1zKCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgbGVuID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2xlbl07Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW47IGluZGV4KyspIHsKLQkJCWl0ZW1zW2luZGV4XSA9IHRoaXMuY29udmVydCh0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0SXRlbXMoaXRlbXMpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb21iby4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1Db3VudCgpOwotCQlpbnQgaW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCi0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuYWRkKHRoaXMuY29udmVydChpdGVtKSwgaW5kZXgrKyk7Ci0JCX0KLQotCQkvLyBXaGVuIHRoZSBjb21ibyBpcyBwb3B1bGF0ZWQsIGl0J3MgcG9zc2libGUgdGhlIHNlbGVjdGlvbiB3YXMgYWxyZWFkeQotCQkvLyBzZXQgYnV0IG5vIGl0ZW1zIHdhcyBmb3VuZCwgcmVzeW5jIHRoZSBzZWxlY3RlZCBpdGVtCi0JCXN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgY29tYm8uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQl0cnkgewotCQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmUoZXZlbnQuZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0SW5kZXgoKSArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IHRhcmdldCA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCWludCBzb3VyY2UgPSBldmVudC5nZXRTb3VyY2VJbmRleCgpOwotCQlpbnQgbGVuID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBsb1N0YXJ0ID0gTWF0aC5taW4odGFyZ2V0LCBzb3VyY2UpOwotCQlpbnQgaGlTdGFydCA9IE1hdGgubWF4KHRhcmdldCwgc291cmNlKTsKLQkJLy8gbWFrZSBhIGNvcHkgb2YgdGhlIGFmZmVjdGVkIGl0ZW1zLi4uCi0JCVN0cmluZ1tdIHN1YkFycmF5ID0gQXJyYXlUb29scy5zdWJBcnJheSh0aGlzLmNvbWJvSG9sZGVyLmdldEl0ZW1zKCksIGxvU3RhcnQsIGhpU3RhcnQgKyBsZW4gLSBsb1N0YXJ0KTsKLQkJLy8gLi4ubW92ZSB0aGVtIGFyb3VuZC4uLgotCQlzdWJBcnJheSA9IEFycmF5VG9vbHMubW92ZShzdWJBcnJheSwgdGFyZ2V0IC0gbG9TdGFydCwgc291cmNlIC0gbG9TdGFydCwgbGVuKTsKLQkJLy8gLi4uYW5kIHRoZW4gcHV0IHRoZW0gYmFjawotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc3ViQXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldEl0ZW0obG9TdGFydCArIGluZGV4LCBzdWJBcnJheVtpbmRleF0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50IGluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5jb21ib0hvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkvL2ZpeGluZyBidWcgMjY5MTAwIGJ5IHNldHRpbmcgdGhlIHBvcHVsYXRpbmcgZmxhZyB0byB0cnVlCi0JCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJdHJ5IHsKLQkJCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhldmVudCkpIHsKLQkJCQl0aGlzLmNvbWJvSG9sZGVyLnNldEl0ZW0oaW5kZXgrKywgdGhpcy5jb252ZXJ0KGl0ZW0pKTsKLQkJCX0KLQkJCWlmIChzZWxlY3Rpb25JbmRleCA9PSAwKSB7Ci0JCQkJdGhpcy5jb21ib0hvbGRlci5zZXRUZXh0KHRoaXMuY29tYm9Ib2xkZXIuZ2V0SXRlbXMoKVswXSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQkJdHJ5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIucmVtb3ZlQWxsKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGNvbWJvLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29tYm8oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW1zICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFIGl0ZW0pIHsKLQkJaW50IGxlbmd0aCA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKLQkJCWlmICh2YWx1ZXNBcmVFcXVhbCh0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KSwgaXRlbSkpIHsKLQkJCQlyZXR1cm4gaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplQ29tYm9TZWxlY3Rpb24oKSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSB8fCB0aGlzLmNvbWJvSG9sZGVyLmlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFIHNlbGVjdGVkVmFsdWUgPSB0aGlzLnNlbGVjdGVkSXRlbUhvbGRlci5nZXRWYWx1ZSgpOwotCQlpZiAodGhpcy5jb21ib0hvbGRlci5nZXRUZXh0KCkuZXF1YWxzKHNlbGVjdGVkVmFsdWUpKSB7Ci0JCQkvL2lmIHRoZSBzZWxlY3Rpb24gaXMgc3RpbGwgdGhlIHNhbWUsIGRvbid0IHJlc2V0IGl0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jb21ib0hvbGRlci5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQl0cnkgewotCQkJdGhpcy5jb21ib0hvbGRlci5kZXNlbGVjdEFsbCgpOwotCQkJU3RyaW5nIHNlbGVjdGVkSXRlbSA9IHRoaXMuY29udmVydChzZWxlY3RlZFZhbHVlKTsKLQkJCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCQkJCXNlbGVjdGVkSXRlbSA9ICIiOwotCQkJfQotCQkJdGhpcy5jb21ib0hvbGRlci5zZXRUZXh0KHNlbGVjdGVkSXRlbSk7Ci0JCQl0aGlzLm5vdGlmeUxpc3RlbmVycyhzZWxlY3RlZFZhbHVlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUNvbWJvU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHZhbHVlcyBhcmUgZXF1YWwsIHdpdGggdGhlIGFwcHJvcHJpYXRlIG51bGwgY2hlY2tzLgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlpZiAoKHZhbHVlMSA9PSBudWxsKSAmJiAodmFsdWUyID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsJLy8gYm90aCBhcmUgbnVsbAotCQl9Ci0JCWlmICgodmFsdWUxID09IG51bGwpIHx8ICh2YWx1ZTIgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gb25lIGlzIG51bGwgYnV0IHRoZSBvdGhlciBpcyBub3QKLQkJfQotCQlyZXR1cm4gdmFsdWUxLmVxdWFscyh2YWx1ZTIpOwotCX0KLQotCS8vICoqKioqKioqKiogY29tYm8gZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGNvbWJvU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21ib1NlbGVjdGlvbkNoYW5nZWQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJaWYgKCF0aGlzLmNvbWJvSG9sZGVyLmlzUG9wdWxhdGluZygpKSB7Ci0JCQlFIHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtKCk7Ci0JCQl0aGlzLmNvbWJvSG9sZGVyLnNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQl0cnkgewotCQkJCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCQkJdGhpcy5ub3RpZnlMaXN0ZW5lcnMoc2VsZWN0ZWRJdGVtKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRoaXMuY29tYm9Ib2xkZXIuc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5TGlzdGVuZXJzKEUgc2VsZWN0ZWRJdGVtKSB7Ci0JCWlmICh0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPiBzY0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+KHRoaXMsIHNlbGVjdGVkSXRlbSk7Ci0JCQlmb3IgKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIDogdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKHNjRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgc2VsZWN0ZWRJdGVtKCkgewotCQlpZiAodGhpcy5jb21ib0hvbGRlci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaWYgKHRoaXMuY29tYm9Ib2xkZXIuaXNFZGl0YWJsZSgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IHRoaXMuY29tYm9Ib2xkZXIuZ2V0VGV4dCgpOwotCi0JCQlpZiAodGV4dC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGluZGV4ID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQlFIGl0ZW0gPSB0aGlzLmxpc3RIb2xkZXIuZ2V0KGluZGV4KTsKLQkJCQlTdHJpbmcgdmFsdWUgPSB0aGlzLmNvbnZlcnQoaXRlbSk7Ci0JCQkJaWYgKHZhbHVlc0FyZUVxdWFsKHRleHQsIHZhbHVlKSkgewotCQkJCQlyZXR1cm4gaXRlbTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIFRPRE86IEZpbmQgYSB3YXkgdG8gcHJldmVudCB0aGlzIHR5cGUgY2FzdCAoaXQnbGwgd29yayBpZiBFIGlzCi0JCQkvLyBTdHJpbmcgYnV0IGl0IHdvbid0IHdvcmsgaWYgRSBpcyBzb21ldGhpbmcgZWxzZSksIG1heWJlIHVzZSBhCi0JCQkvLyBCaWRpU3RyaW5nQ29udmVydGVyIGluc3RlYWQgb2YgU3RyaW5nQ29udmVydGVyCi0JCQl0cnkgewotCQkJCXJldHVybiAoRSkgdGV4dDsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0KLQkJaW50IGluZGV4ID0gdGhpcy5jb21ib0hvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9Eb3VibGVDbGlja2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LnNpemUoKSA+IDApIHsKLQkJCS8vIHRoZXJlIHNob3VsZCBiZSBvbmx5IGEgc2luZ2xlIGl0ZW0gc2VsZWN0ZWQgZHVyaW5nIGEgZG91YmxlLWNsaWNrKD8pCi0JCQlFIHNlbGVjdGlvbiA9IHRoaXMubGlzdEhvbGRlci5nZXQodGhpcy5jb21ib0hvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCURvdWJsZUNsaWNrRXZlbnQ8RT4gZGNFdmVudCA9IG5ldyBEb3VibGVDbGlja0V2ZW50PEU+KHRoaXMsIHNlbGVjdGlvbik7Ci0JCQlmb3IgKERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZG91YmxlQ2xpY2tMaXN0ZW5lciA6IHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlkb3VibGVDbGlja0xpc3RlbmVyLmRvdWJsZUNsaWNrKGRjRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgY29tYm9EaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGNvbWJvIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy5jb21ib0Rpc3Bvc2VMaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmNvbWJvSG9sZGVyLmlzRWRpdGFibGUoKSkgewotCQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzLmNvbWJvTW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5jb21ib0hvbGRlci5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmNvbWJvU2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRvdWJsZSBjbGljayBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50PEU+IGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZUNsaWNrRXZlbnQ8RT4gZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCXByaXZhdGUgZmluYWwgRSBzZWxlY3Rpb247Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXByb3RlY3RlZCBEb3VibGVDbGlja0V2ZW50KEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8RT4gc291cmNlLCBFIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc291cmNlKTsKLQkJCWlmIChzZWxlY3Rpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBzZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb247Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gbGlzdGVuZXIpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlbGVjdGlvbkNoYW5nZUV2ZW50PEU+IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCQlwcml2YXRlIGZpbmFsIEUgc2VsZWN0ZWRJdGVtOwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwcm90ZWN0ZWQgU2VsZWN0aW9uQ2hhbmdlRXZlbnQoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPiBzb3VyY2UsIEUgc2VsZWN0ZWRJdGVtKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBzZWxlY3RlZEl0ZW07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBzZWxlY3RlZEl0ZW0oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEl0ZW07Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIEludGVybmFsIG1lbWJlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGhvbGRlciBpcyByZXF1aXJlZCBmb3Igc3VwcG9ydGluZyA8Y29kZT5Db21ibzwvY29kZT4gYW5kCi0JICogPGNvZGU+Q0NvbWJvPC9jb2RlPiB0cmFuc3BhcmVudGx5LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50ZXJmYWNlIENvbWJvSG9sZGVyIHsKLQkJdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCk7Ci0JCXZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpOwotCQl2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKE1vZGlmeUxpc3RlbmVyIG1vZGlmeUxpc3RlbmVyKTsKLQkJdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXZvaWQgZGVzZWxlY3RBbGwoKTsKLQkJaW50IGdldEl0ZW1Db3VudCgpOwotCQlTdHJpbmdbXSBnZXRJdGVtcygpOwotCQlpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJU3RyaW5nIGdldFRleHQoKTsKLQkJYm9vbGVhbiBpc0Rpc3Bvc2VkKCk7Ci0JCWJvb2xlYW4gaXNFZGl0YWJsZSgpOwotCQlib29sZWFuIGlzUG9wdWxhdGluZygpOwotCQl2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKTsKLQkJdm9pZCByZW1vdmVNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcik7Ci0JCXZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSk7Ci0JCXZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpOwotCQl2b2lkIHNldFBvcHVsYXRpbmcoYm9vbGVhbiBwb3B1bGF0aW5nKTsKLQkJdm9pZCBzZXRUZXh0KFN0cmluZyBpdGVtKTsKLQkJdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKTsKLQkJdm9pZCByZW1vdmVBbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9Db2x1bW5BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9Db2x1bW5BZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NWJmOTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQ29sdW1uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBpcyB1c2VkIGJ5IHRoZSB0YWJsZSBtb2RlbCBhZGFwdGVyIHRvIGNvbnZlcnQgYSBtb2RlbCBvYmplY3QKLSAqIGludG8gdGhlIG1vZGVscyB1c2VkIGZvciBlYWNoIG9mIHRoZSBjZWxscyBmb3IgdGhlIG9iamVjdCdzIGNvcnJlc3BvbmRpbmcgcm93Ci0gKiBpbiB0aGUgdGFibGUuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uQWRhcHRlcjxWPiB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwgbW9kZWxzIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIHJvdyBpbiB0aGUgdGFibGUuCi0JICovCi0JV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKFYgc3ViamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUuIFR5cGljYWxseSB0aGlzIGlzIHN0YXRpYy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjb2x1bW5zCi0JICovCi0JaW50IGNvbHVtbkNvdW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKgotCSAqIEBwYXJhbSBjb2x1bW5JbmRleCBUaGUgaW5kZXggb2YgdGhlIGNvbHVtbiB0byByZXRyaWV2ZSBpdHMgZGlzcGxheSB0ZXh0Ci0JICogQHJldHVybiBUaGUgZGlzcGxheSB0ZXh0IG9mIHRoZSBjb2x1bW4KLQkgKi8KLQlTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGVkaXRhYmxlLiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUKLQkgKiBzYW1lIGZvciBldmVyeSByb3cuCi0JICoKLQkgKiBAcGFyYW0gY29sdW1uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBjb2x1bW4gZm9yIHdoaWNoIHdlIGRldGVybWluZSBpZgotCSAqIHRoZSBjb250ZW50IGNhbiBiZSBtb2RpZmllZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gYWxsb3cgZWRpdGluZyBvZiB0aGUgY2VsbCBhdCB0aGUgZ2l2ZW4KLQkgKiBjb2x1bW4gaW5kZXg7IDxjb2RlPmZhbHNlPC9jb2RlPiB0byBrZWVwIGl0IG5vdCBlZGl0YWJsZQotCSAqLwotLy8JYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBjb2x1bW5JbmRleCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvQ29tYm9Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3OTRhOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgcHJvdmlkZXMgYSBtb3JlIG9iamVjdC1vcmllbnRlZCBpbnRlcmZhY2UgdG8gdGhlIGl0ZW1zIGFuZAotICogc2VsZWN0ZWQgaXRlbSBpbiBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLSAqIDxwPgotICogPGI+bGlzdEhvbGRlcjwvYj4gY29udGFpbnMgdGhlIGl0ZW1zIGluIHRoZSA8Y29kZT5Db21ibzwvY29kZT4uPGJyPgotICogPGI+c2VsZWN0ZWRJdGVtSG9sZGVyPC9iPiBjb250YWlucyB0aGUgaXRlbXMgaW4gJ2xpc3RIb2xkZXInIHRoYXQgYXJlCi0gKiBzZWxlY3RlZCBpbiB0aGUgPGNvZGU+Q29tYm88L2NvZGU+LgotICoKLSAqIEBwYXJhbSA8RT4gVGhlIHR5cGUgb2YgdGhlIGl0ZW1zIGluIDxiPmxpc3RIb2xkZXI8L2I+Ci0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYm9Nb2RlbEFkYXB0ZXI8RT4gZXh0ZW5kcyBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPEU+IHsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBjb21iby4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBjb21ibywgd2hpY2ggY2FsbHMgI3RvU3RyaW5nKCkgb24gdGhlCi0JICogaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29tYm9Nb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJQ29tYm8gY29tYm8pCi0JewotCQlyZXR1cm4gYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48VD5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb24gdG8gdGhlIHNwZWNpZmllZCBjb21iby4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGNvbWJvLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbWJvTW9kZWxBZGFwdGVyPFQ+IGFkYXB0KAotCQkJTGlzdFZhbHVlTW9kZWw8VD4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCUNvbWJvIGNvbWJvLAotCQkJU3RyaW5nQ29udmVydGVyPFQ+IHN0cmluZ0NvbnZlcnRlcikKLQl7Ci0JCXJldHVybiBuZXcgQ29tYm9Nb2RlbEFkYXB0ZXI8VD4oCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyLCBzZWxlY3Rpb25zIGhvbGRlciwgY29tYm8sIGFuZAotCSAqIHN0cmluZyBjb252ZXJ0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBDb21ib01vZGVsQWRhcHRlcigKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlDb21ibyBjb21ibywKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpCi0JewotCQlzdXBlcihsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIG5ldyBTV1RDb21ib0hvbGRlcihjb21ibyksCi0JCSAgICAgIHN0cmluZ0NvbnZlcnRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEludGVybmFsIG1lbWJlciAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBTV1RDb21ib0hvbGRlciBpbXBsZW1lbnRzIENvbWJvSG9sZGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBjb21ibzsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVkaXRhYmxlOwotCQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZEl0ZW07Ci0KLQkJU1dUQ29tYm9Ib2xkZXIoQ29tYm8gY29tYm8pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbWJvICAgID0gY29tYm87Ci0JCQl0aGlzLmVkaXRhYmxlID0gKGNvbWJvLmdldFN0eWxlKCkgJiBTV1QuUkVBRF9PTkxZKSA9PSAwOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkKFN0cmluZyBpdGVtLCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMuY29tYm8uYWRkKGl0ZW0sIGluZGV4KTsKLQotCQkJLy8gSXQgaXMgcG9zc2libGUgdGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHNldCBiZWZvcmUgdGhlIGNvbWJvIGlzIGJlaW5nCi0JCQkvLyBwb3B1bGF0ZWQsIHVwZGF0ZSB0aGUgc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG1hdGNoZXMgdGhlIGl0ZW0gYmVpbmcKLQkJCS8vIGFkZGVkCi0JCQlpZiAoKHRoaXMuc2VsZWN0ZWRJdGVtICE9IG51bGwpICYmIHRoaXMuc2VsZWN0ZWRJdGVtLmVxdWFscyhpdGVtKSkgewotCQkJCXRoaXMuc2V0VGV4dCh0aGlzLnNlbGVjdGVkSXRlbSk7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBkaXNwb3NlTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8uYWRkRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2VMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRNb2RpZnlMaXN0ZW5lcihNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCQkJdGhpcy5jb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZXNlbGVjdEFsbCgpIHsKLQkJCXRoaXMuY29tYm8uZGVzZWxlY3RBbGwoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0SXRlbUNvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0SXRlbUNvdW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0SXRlbXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtcygpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21iby5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZSgpIHsKLQkJCXJldHVybiB0aGlzLmVkaXRhYmxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQb3B1bGF0aW5nKCkgewotCQkJcmV0dXJuIHRoaXMuY29tYm8uZ2V0RGF0YSgicG9wdWxhdGluZyIpID09IEJvb2xlYW4uVFJVRTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlKHN0YXJ0LCBlbmQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQkJdGhpcy5jb21iby5yZW1vdmVBbGwoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKSB7Ci0JCQl0aGlzLmNvbWJvLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTW9kaWZ5TGlzdGVuZXIoTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJCXRoaXMuY29tYm8ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBpdGVtKSB7Ci0JCQl0aGlzLmNvbWJvLnNldEl0ZW0oaW5kZXgsIGl0ZW0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJCXRoaXMuY29tYm8uc2V0SXRlbXMoaXRlbXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0UG9wdWxhdGluZyhib29sZWFuIHBvcHVsYXRpbmcpIHsKLQkJCXRoaXMuY29tYm8uc2V0RGF0YSgicG9wdWxhdGluZyIsIEJvb2xlYW4udmFsdWVPZihwb3B1bGF0aW5nKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBpdGVtKSB7Ci0KLQkJCS8vIEtlZXAgdHJhY2sgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gc2luY2UgaXQncyBwb3NzaWJsZSB0aGUgc2VsZWN0ZWQKLQkJCS8vIGl0ZW0gaXMgYmVmb3JlIHRoZSBjb21ibyBpcyBwb3B1bGF0ZWQKLQkJCWlmICh0aGlzLmNvbWJvLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7Ci0JCQl9Ci0JCQl0aGlzLmNvbWJvLnNldFRleHQoaXRlbSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9EYXRlVGltZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvRGF0ZVRpbWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0N2YzZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9EYXRlVGltZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBEYXRlVGltZSB3aWRnZXQgaW4gc3luY2ggd2l0aAotICogbW9kZWwgaW50ZWdlcnMgaG91cnMsIG1pbnV0ZXMsIGFuZCBzZWNvbmRzLiAgSGFzIGRlZmF1bHQgaG91cnMsCi0gKiBtaW51dGVzIGFuZCBzZWNvbmRzIG9mIDAgd2hpY2ggY29ycmVzcG9uZHMgdG8gMTI6MDA6MDAgQU0uIFRoaXMgbW9kZWwKLSAqIGFkYXB0ZXIgY2FuIG9ubHkgYmUgdXNlZCBmb3IgYSBEYXRlVGltZSB3aWRnZXQgd2l0aCB0aGUgc3R5bGUgU1dULlRJTUUKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGF0ZVRpbWVNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBob3VycyBpbnRlZ2VyLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlcjsKLQkKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIG1pbnV0ZXMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbWludXRlc0hvbGRlcjsKLQkKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHNlY29uZHMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGRhdGVUaW1lJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgaG91cnMgaW50ZWdlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBob3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0JCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgZGF0ZVRpbWUncyBzZWxlY3Rpb24gc3RhdGUgd2l0aAotCSAqIHRoZSBtb2RlbCBtaW51dGVzIGludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0JCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgZGF0ZVRpbWUncyBzZWxlY3Rpb24gc3RhdGUgd2l0aAotCSAqIHRoZSBtb2RlbCBzZWNvbmRzIGludGVnZXIuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2Vjb25kc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGF0ZVRpbWUgd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwgaW50ZWdlcnMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERhdGVUaW1lIGRhdGVUaW1lOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIG51bWJlciBob2xkZXIKLQkgKiB3aXRoIHRoZSBzcGlubmVyJ3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGRhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGRhdGVUaW1lCi0JICogaXMgZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciBkYXRlVGltZURpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoaXMgbG9jayBpcyB1c2VkIHRvIHByZXZlbnQgdGhlIGxpc3RlbmVycyB0byBiZSBub3RpZmllZCB3aGVuIHRoZSB2YWx1ZQotCSAqIGNoYW5nZXMgZnJvbSB0aGUgc3Bpbm5lciBvciBmcm9tIHRoZSBob2xkZXIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHQgdGhlIHNwZWNpZmllZCBtb2RlbCBpbnRlZ2VyIGhvbGRlcnMgdG8gdGhlIHNwZWNpZmllZCBkYXRlVGltZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERhdGVUaW1lTW9kZWxBZGFwdGVyIGFkYXB0KAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKLQkJCURhdGVUaW1lIGRhdGVUaW1lKQotCXsKLQkJcmV0dXJuIG5ldyBEYXRlVGltZU1vZGVsQWRhcHRlcihob3Vyc0hvbGRlciwgbWludXRlc0hvbGRlciwgc2Vjb25kc0hvbGRlciwgZGF0ZVRpbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgaG91cnNIb2xkZXIsIG1pbnV0ZXNIb2xkZXIsIHNlY29uZHNIb2xkZXIsIGFuZCBkYXRlVGltZSBhcmUgcmVxdWlyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRGF0ZVRpbWVNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gaG91cnNIb2xkZXIsCi0JCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyLAotCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKLQkJCQkJCQkJCURhdGVUaW1lIGRhdGVUaW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoaG91cnNIb2xkZXIgPT0gbnVsbCkgCi0JCQl8fCAobWludXRlc0hvbGRlciA9PSBudWxsKSAKLQkJCXx8IChzZWNvbmRzSG9sZGVyID09IG51bGwpIAotCQkJfHwgKGRhdGVUaW1lID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmhvdXJzSG9sZGVyID0gaG91cnNIb2xkZXI7Ci0JCXRoaXMubWludXRlc0hvbGRlciA9IG1pbnV0ZXNIb2xkZXI7Ci0JCXRoaXMuc2Vjb25kc0hvbGRlciA9IHNlY29uZHNIb2xkZXI7Ci0JCXRoaXMuZGF0ZVRpbWUgPSBkYXRlVGltZTsKLQotCQl0aGlzLmhvdXJzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRIb3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5ob3Vyc0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ob3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMubWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5taW51dGVzSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLnNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2Vjb25kc0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmRhdGVUaW1lU2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmRhdGVUaW1lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuZGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJdGhpcy5kYXRlVGltZURpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGREYXRlVGltZURpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmRhdGVUaW1lLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLmRhdGVUaW1lRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnVwZGF0ZURhdGVUaW1lSG91cnMoaG91cnNIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudXBkYXRlRGF0ZVRpbWVNaW51dGVzKG1pbnV0ZXNIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudXBkYXRlRGF0ZVRpbWVTZWNvbmRzKHNlY29uZHNIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRIb3Vyc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLmhvdXJzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlVGltZSBob3VycyBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTWludXRlc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRlVGltZU1vZGVsQWRhcHRlci50aGlzLm1pbnV0ZXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRhdGVUaW1lIG1pbnV0ZXMgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWNvbmRzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIudGhpcy5zZWNvbmRzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlVGltZSBzZWNvbmRzIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGREYXRlVGltZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMuZGF0ZVRpbWVTZWxlY3RlZChlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsJCQkJCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImRhdGVUaW1lIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZERhdGVUaW1lRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCURhdGVUaW1lTW9kZWxBZGFwdGVyLnRoaXMuZGF0ZVRpbWVEaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlVGltZSBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgZXZlbnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGhvdXJzQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMudXBkYXRlRGF0ZVRpbWVIb3VycygoSW50ZWdlcikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtaW51dGVzQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICghdGhpcy5sb2NrZWQpIHsKLQkJCXRoaXMudXBkYXRlRGF0ZVRpbWVNaW51dGVzKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlY29uZHNDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy51cGRhdGVEYXRlVGltZVNlY29uZHMoKEludGVnZXIpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBkYXRlVGltZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgZGF0ZVRpbWVTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAoIXRoaXMubG9ja2VkKSB7Ci0JCQl0aGlzLmxvY2tlZCA9IHRydWU7Ci0JCQl0cnkgewotCQkJCS8vdG9vIGJhZCB0aGV5IGRpZG4ndCBzcGxpdCB0aGUgZXZlbnQgdXAKLQkJCQlob3Vyc1NlbGVjdGVkKCk7Ci0JCQkJbWludXRlc1NlbGVjdGVkKCk7Ci0JCQkJc2Vjb25kc1NlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQl0aGlzLmxvY2tlZCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhvdXJzU2VsZWN0ZWQoKSB7Ci0JCUludGVnZXIgaG91cnMgPSBudWxsOwotCQlpZiAodGhpcy5kYXRlVGltZS5nZXRIb3VycygpICE9IDApIHsKLQkJCWhvdXJzID0gSW50ZWdlci52YWx1ZU9mKHRoaXMuZGF0ZVRpbWUuZ2V0SG91cnMoKSk7Ci0JCX0KLQkJdGhpcy5ob3Vyc0hvbGRlci5zZXRWYWx1ZShob3Vycyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1pbnV0ZXNTZWxlY3RlZCgpIHsKLQkJSW50ZWdlciBtaW51dGVzID0gbnVsbDsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuZ2V0TWludXRlcygpICE9IDApIHsKLQkJCW1pbnV0ZXMgPSBJbnRlZ2VyLnZhbHVlT2YodGhpcy5kYXRlVGltZS5nZXRNaW51dGVzKCkpOwotCQl9Ci0JCXRoaXMubWludXRlc0hvbGRlci5zZXRWYWx1ZShtaW51dGVzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2Vjb25kc1NlbGVjdGVkKCkgewotCQlJbnRlZ2VyIHNlY29uZHMgPSBudWxsOwotCQlpZiAodGhpcy5kYXRlVGltZS5nZXRTZWNvbmRzKCkgIT0gMCkgewotCQkJc2Vjb25kcyA9IEludGVnZXIudmFsdWVPZih0aGlzLmRhdGVUaW1lLmdldFNlY29uZHMoKSk7Ci0JCX0KLQkJdGhpcy5zZWNvbmRzSG9sZGVyLnNldFZhbHVlKHNlY29uZHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRhdGVUaW1lRGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIHRoZSBkYXRlVGltZSBpcyBub3QgeWV0ICJkaXNwb3NlZCIgd2hlbiB3ZSByZWNlaXZlIHRoaXMgZXZlbnQKLQkJLy8gc28gd2UgY2FuIHN0aWxsIHJlbW92ZSBvdXIgbGlzdGVuZXJzCi0JCXRoaXMuZGF0ZVRpbWUucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuZGF0ZVRpbWVEaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmRhdGVUaW1lLnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuZGF0ZVRpbWVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuaG91cnNIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaG91cnNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5taW51dGVzSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm1pbnV0ZXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zZWNvbmRzSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlY29uZHNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEYXRlVGltZUhvdXJzKEludGVnZXIgaG91cnMpIHsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGhvdXJzID09IG51bGwpIHsKLQkJCWhvdXJzID0gSW50ZWdlci52YWx1ZU9mKDApOy8vVE9ETyBkZWZhdWx0SG91cnMKLQkJfQotCQl0aGlzLmxvY2tlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0aGlzLmRhdGVUaW1lLnNldEhvdXJzKGhvdXJzLmludFZhbHVlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEYXRlVGltZU1pbnV0ZXMoSW50ZWdlciBtaW51dGVzKSB7Ci0JCWlmICh0aGlzLmRhdGVUaW1lLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChtaW51dGVzID09IG51bGwpIHsKLQkJCW1pbnV0ZXMgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ly9UT0RPIGRlZmF1bHRNaW51dGVzCi0JCX0KLQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5kYXRlVGltZS5zZXRNaW51dGVzKG1pbnV0ZXMuaW50VmFsdWUoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmxvY2tlZCA9IGZhbHNlOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURhdGVUaW1lU2Vjb25kcyhJbnRlZ2VyIHNlY29uZHMpIHsKLQkJaWYgKHRoaXMuZGF0ZVRpbWUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHNlY29uZHMgPT0gbnVsbCkgewotCQkJc2Vjb25kcyA9IEludGVnZXIudmFsdWVPZigwKTsvL1RPRE8gZGVmYXVsdFNlY29uZHMKLQkJfQotCQl0aGlzLmxvY2tlZCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0aGlzLmRhdGVUaW1lLnNldFNlY29uZHMoc2Vjb25kcy5pbnRWYWx1ZSgpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRoaXMubG9ja2VkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ob3Vyc0hvbGRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWJiNjNlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci0KLS8qKgotICoKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3Bpbm5lck1vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIHNwaW5uZXIncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBzcGlubmVyIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIHN0cmluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBzcGlubmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgc2VsZWN0aW9uIG51bWJlciBob2xkZXIKLQkgKiB3aXRoIHRoZSBzcGlubmVyJ3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGlmeUxpc3RlbmVyIHNwaW5uZXJNb2RpZnlMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgc3Bpbm5lcgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGludCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGxvY2sgaXMgdXNlZCB0byBwcmV2ZW50IHRoZSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGUgdmFsdWUKLQkgKiBjaGFuZ2VzIGZyb20gdGhlIHNwaW5uZXIgb3IgZnJvbSB0aGUgaG9sZGVyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsb2NrZWQ7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9ucyB0byB0aGUgc3BlY2lmaWVkIHNwaW5uZXIuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBzcGlubmVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3Bpbm5lck1vZGVsQWRhcHRlciBhZGFwdCgKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkJCVNwaW5uZXIgc3Bpbm5lciwKLQkJCWludCBkZWZhdWx0VmFsdWUpCi0JewotCQlyZXR1cm4gbmV3IFNwaW5uZXJNb2RlbEFkYXB0ZXIobnVtYmVySG9sZGVyLCBzcGlubmVyLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIsIHNlbGVjdGlvbnMgaG9sZGVyLCBsaXN0IGJveCwgYW5kCi0JICogc3RyaW5nIGNvbnZlcnRlciBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwaW5uZXIgc3Bpbm5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobnVtYmVySG9sZGVyID09IG51bGwpIHx8IChzcGlubmVyID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm51bWJlckhvbGRlciA9IG51bWJlckhvbGRlcjsKLQkJdGhpcy5zcGlubmVyID0gc3Bpbm5lcjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5udW1iZXJIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kaWZ5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3Bpbm5lck1vZGlmeUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lci5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzLnNwaW5uZXJNb2RpZnlMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zcGlubmVyRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZFNwaW5uZXJEaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5zcGlubmVyLmFkZERpc3Bvc2VMaXN0ZW5lcih0aGlzLnNwaW5uZXJEaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMudXBkYXRlU3Bpbm5lcihudW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNwaW5uZXIgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBidWlsZFNwaW5uZXJNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5zcGlubmVyTW9kaWZpZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzcGlubmVyIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZFNwaW5uZXJEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnNwaW5uZXJEaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzcGlubmVyIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy51cGRhdGVTcGlubmVyKChJbnRlZ2VyKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGlubmVyIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzcGlubmVyTW9kaWZpZWQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJaWYgKCF0aGlzLmxvY2tlZCkgewotCQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQkJdHJ5IHsKLQkJCQl0aGlzLm51bWJlckhvbGRlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdGhpcy5sb2NrZWQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNwaW5uZXJEaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIHNwaW5uZXIgaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLnNwaW5uZXIucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuc3Bpbm5lckRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMuc3Bpbm5lci5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzLnNwaW5uZXJNb2RpZnlMaXN0ZW5lcik7Ci0JCXRoaXMubnVtYmVySG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogdXBkYXRlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwaW5uZXIoSW50ZWdlciB2YWx1ZSkgewotCQlpZiAodGhpcy5zcGlubmVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIHRoZSBtb2RlbCBjYW4gYmUgbnVsbCwgYnV0IHRoZSBzcGlubmVyIGNhbm5vdAotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCX0KLQkJdGhpcy5sb2NrZWQgPSB0cnVlOwotCQl0cnkgewotCQkJdGhpcy5zcGlubmVyLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0aGlzLmxvY2tlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubnVtYmVySG9sZGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RhYmxlSXRlbU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFhNjdlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RhYmxlSXRlbU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIHRhYmxlIGl0ZW0gaW4gc3luY2ggd2l0aCB0aGUgcHJvcGVydGllcyBvZgotICogYSBtb2RlbC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVJdGVtTW9kZWxBZGFwdGVyIHsKLQotCS8qKiBUaGUgdGFibGUgaXRlbSB3ZSBzeW5jaHJvbml6ZSB3aXRoIHRoZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGVJdGVtIHRhYmxlSXRlbTsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gc3R1ZmYgd2hlbiB0aGUgYnV0dG9uCi0JICogaXMgZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciB0YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDbGllbnQtc3VwcGxpZWQgYWRhcHRlciB0aGF0IHByb3ZpZGVzIHdpdGggdGhlIHZhcmlvdXMgY29sdW1uIHNldHRpbmdzIGFuZAotCSAqIGNvbnZlcnRzIHRoZSBvYmplY3RzIGluIHRoZSBMVk0gaW50byBhbiBhcnJheSBvZiBjZWxsIG1vZGVscy4KLQkgKi8KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8T2JqZWN0PiBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogVGhlIHZhbHVlIG1vZGVscyB1c2VkIHRvIGxpc3RlbiB0byBlYWNoIHByb3BlcnR5IHRoYXQgYXJlIGRpc3BsYXkgYnkgdGhlCi0JICogdGFibGUgaXRlbS4KLQkgKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gdmFsdWVIb2xkZXJzOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT5zIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbgotCSAqIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBtb2RlbCBiZWluZyBkaXNwbGF5IGludG8gYSByb3cgY2hhbmdlLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcltdIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzOwotCi0JLyoqCi0JICogVGhlIGxhYmVsIHVzZWQgdG8gZm9ybWF0IHRoZSBvYmplY3RzIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICovCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgc3BlY2lmaWVkIGJ1dHRvbi4KLQkgKiBJZiB0aGUgYm9vbGVhbiBpcyBudWxsLCB0aGUgYnV0dG9uJ3MgdmFsdWUgd2lsbCBiZSAidW5zZWxlY3RlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYWRhcHQoVGFibGVJdGVtIHRhYmxlSXRlbSwgQ29sdW1uQWRhcHRlcjw/PiBjb2x1bW5BZGFwdGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIodGFibGVJdGVtLCBjb2x1bW5BZGFwdGVyLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGFuZCBidXR0b24gYXJlIHJlcXVpcmVkLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIoVGFibGVJdGVtIHRhYmxlSXRlbSwgQ29sdW1uQWRhcHRlcjw/PiBjb2x1bW5BZGFwdGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHRhYmxlSXRlbSA9PSBudWxsIHx8IGNvbHVtbkFkYXB0ZXIgPT0gbnVsbCB8fCBsYWJlbFByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudGFibGVJdGVtID0gdGFibGVJdGVtOwotCQl0aGlzLmxhYmVsUHJvdmlkZXIgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLmNvbHVtbkFkYXB0ZXIgPSAoQ29sdW1uQWRhcHRlcjxPYmplY3Q+KSBjb2x1bW5BZGFwdGVyOwotCi0JCXRoaXMudGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlSXRlbURpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLnRhYmxlSXRlbS5hZGREaXNwb3NlTGlzdGVuZXIodGhpcy50YWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMudmFsdWVIb2xkZXJzID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHModGFibGVJdGVtLmdldERhdGEoKSk7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJdGFibGVJdGVtQ2hhbmdlZChpbmRleCwgdGFibGVJdGVtLmdldERhdGEoKSwgZmFsc2UpOwotCQkJdmFsdWVIb2xkZXJzW2luZGV4XS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnNbaW5kZXhdKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbXSBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyW10gbGlzdGVuZXJzID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJbY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpXTsKLQkJZm9yIChpbnQgaW5kZXggPSBsaXN0ZW5lcnMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJbGlzdGVuZXJzW2luZGV4XSA9IGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyczsKLQl9Ci0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCXRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXyhpbmRleCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFRhYmxlSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRUYWJsZUl0ZW1EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyLnRoaXMudGFibGVJdGVtRGlzcG9zZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVGFibGVJdGVtIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUl0ZW1DaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IHN1YmplY3QsIGJvb2xlYW4gcmV2YWxpZGF0ZSkgewotCi0JCWlmICghdGhpcy50YWJsZUl0ZW0uaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnVwZGF0ZVRhYmxlSXRlbVRleHQoaW5kZXgsIHN1YmplY3QpOwotCQkJdGhpcy51cGRhdGVUYWJsZUl0ZW1JbWFnZShpbmRleCwgc3ViamVjdCk7Ci0KLQkJCWlmIChyZXZhbGlkYXRlKSB7Ci0JCQkJdGhpcy5sYXlvdXRUYWJsZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlSXRlbVRleHQoaW50IGluZGV4LCBPYmplY3Qgc3ViamVjdCkgewotCQlTdHJpbmcgdGV4dCA9IHRoaXMubGFiZWxQcm92aWRlci5nZXRDb2x1bW5UZXh0KHN1YmplY3QsIGluZGV4KTsKLQkJaWYgKHRleHQgPT0gbnVsbCkgewotCQkJdGV4dCA9ICIiOwotCQl9Ci0JCXRoaXMudGFibGVJdGVtLnNldFRleHQoaW5kZXgsIHRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZUl0ZW1JbWFnZShpbnQgaW5kZXgsIE9iamVjdCBzdWJqZWN0KSB7Ci0JCUltYWdlIGltYWdlID0gdGhpcy5sYWJlbFByb3ZpZGVyLmdldENvbHVtbkltYWdlKHN1YmplY3QsIGluZGV4KTsKLQkJdGhpcy50YWJsZUl0ZW0uc2V0SW1hZ2UoaW5kZXgsIGltYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0VGFibGUoKSB7Ci0JCS8vIFJlZnJlc2ggdGhlIHRhYmxlIGluIG9yZGVyIHRvIHNob3cgdGhlIHNjcm9sbGJhciBpZiByZXF1aXJlZAotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy50YWJsZUl0ZW0uZ2V0UGFyZW50KCkuZ2V0UGFyZW50KCk7Ci0JCWNvbnRhaW5lci5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQljb250YWluZXIubGF5b3V0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlSXRlbURpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgYnV0dG9uIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy50YWJsZUl0ZW0ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMudGFibGVJdGVtRGlzcG9zZUxpc3RlbmVyKTsKLQotCQlmb3IgKGludCBpbmRleCA9IHZhbHVlSG9sZGVycy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQl2YWx1ZUhvbGRlcnNbaW5kZXhdLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyc1tpbmRleF0pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0gICBwcml2YXRlIGNsYXNzIFRhYmxlSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotICAgCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0gICAJVGFibGVJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihpbnQgaW5kZXgpIHsKLSAgIAkJc3VwZXIoKTsKLSAgIAkJdGhpcy5pbmRleCA9IGluZGV4OwotICAgCX0KLQotICAgCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0gICAJCWlmICghdGFibGVJdGVtLmlzRGlzcG9zZWQoKSkgewotICAgCQkJVGFibGUgdGFibGUgPSB0YWJsZUl0ZW0uZ2V0UGFyZW50KCk7Ci0gICAJCQl0YWJsZUl0ZW1DaGFuZ2VkKGluZGV4LCB0YWJsZUl0ZW0uZ2V0RGF0YSgpLCB0YWJsZS5nZXRDb2x1bW5Db3VudCgpID09IDApOwotICAgCQl9Ci0gICAJfQotICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3N3dC9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDNiNGUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogVGhpcyBhZGFwdGVyIHByb3ZpZGVzIGEgbW9yZSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIHRoZSBpdGVtcyBhbmQKLSAqIHNlbGVjdGVkIGl0ZW1zIGluIGEgdGFibGUuCi0gKiB7QGxpbmsgI2xpc3RIb2xkZXJ9IGNvbnRhaW5zIHRoZSBkYXRhIG9mIGEgc2luZ2xlIGNvbHVtbiBpbiB0aGUgdGFibGUuCi0gKiB7QGxpbmsgI3NlbGVjdGVkSXRlbXNIb2xkZXJ9IGNvbnRhaW5zIHRoZSBkYXRhIG9mIGEgc2luZ2xlIGNvbHVtbiBpbgotICoge0BsaW5rICNsaXN0SG9sZGVyfSB0aGF0IGFyZSBzZWxlY3RlZCBpbiB0aGUgdGFibGUuCi0gKi8KLS8vIFRPRE8gYmp2Ci1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlcjxFPiB7Ci0KLQkvLyAqKioqKioqKioqIG1vZGVsICoqKioqKioqKioKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSB0YWJsZSdzIGNvbnRlbnRzIHdpdGgKLQkgKiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc0hvbGRlcjsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIHRhYmxlJ3Mgc2VsZWN0aW9uIHdpdGgKLQkgKiB0aGUgbW9kZWwgc2VsZWN0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSB0YWJsZSB3ZSBrZWVwIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSB0YWJsZTsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgb3VyIHNlbGVjdGlvbiBsaXN0IGhvbGRlcgotCSAqIHdpdGggdGhlIHRhYmxlJ3Mgc2VsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTZWxlY3Rpb25MaXN0ZW5lciB0YWJsZVNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQ2xpZW50cyB0aGF0IGFyZSBpbnRlcmVzdGVkIGluIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdDsKLQotCS8qKgotCSAqIENsaWVudHMgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiBkb3VibGUgY2xpY2sgZXZlbnRzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0ZW5lckxpc3Q8RG91YmxlQ2xpY2tMaXN0ZW5lcjxFPj4gZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3Q7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIHRhYmxlCi0JICogaXMgZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIERpc3Bvc2VMaXN0ZW5lciB0YWJsZURpc3Bvc2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoaXMgbGFiZWwgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgdG8gY29udmVydCBhIHByb3BlcnR5IGF0IGEgY29sdW1uIGluZGV4Ci0JICogdG8gYSBzdHJpbmcgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcjsKLQotCS8qKgotCSAqIFRoZSBjb2x1bW4gYWRhcHRlciBpcyByZXNwb25zaWJsZSB0byByZXR1cm4gdGhlIGNvdW50IG9mIGNvbHVtbnMgYW5kIHRvCi0JICogY3JlYXRlIHRoZSB2YWx1ZSBob2xkZXJzIGZvciBhbGwgdGhlIHByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBDb2x1bW5BZGFwdGVyPEU+IGNvbHVtbkFkYXB0ZXI7Ci0KLQkvKioKLQkgKiBLZWVwcyB0cmFjayBvZiB0aGUgPGNvZGU+VGFibGVJdGVtTW9kZWxBZGFwdGVyPC9jb2RlPnMgdGhhdCB3ZXJlIGNyZWF0ZWQKLQkgKiBmb3IgZWFjaCBpdGVtIG9mIHRoZSBsaXN0IGhvbGRlci4KLQkgKi8KLQlwcml2YXRlIExpc3Q8VGFibGVJdGVtTW9kZWxBZGFwdGVyPiB0YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIGxpc3QgbW9kZWwgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIHRhYmxlLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVGFibGVNb2RlbEFkYXB0ZXI8VD4gYWRhcHQoCi0JCQlMaXN0VmFsdWVNb2RlbDxUPiBsaXN0SG9sZGVyLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVRhYmxlIHRhYmxlLAotCQkJQ29sdW1uQWRhcHRlcjxUPiBjb2x1bW5BZGFwdGVyLAotCQkJSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFRhYmxlTW9kZWxBZGFwdGVyPFQ+KAotCQkJbGlzdEhvbGRlciwKLQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxUPihzZWxlY3RlZEl0ZW1Ib2xkZXIpLAotCQkJdGFibGUsCi0JCQljb2x1bW5BZGFwdGVyLAotCQkJbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbGlzdCBtb2RlbCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgdGFibGUuCi0JICogVGhlIHNwZWNpZmllZCBzZWxlY3Rpb24gbW9kZWwgd2lsbCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdGFibGUuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUYWJsZU1vZGVsQWRhcHRlcjxUPiBhZGFwdCgKLQkJCUxpc3RWYWx1ZU1vZGVsPFQ+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFQ+IHNlbGVjdGlvbk1vZGVsLAotCQkJVGFibGUgdGFibGUsCi0JCQlDb2x1bW5BZGFwdGVyPFQ+IGNvbHVtbkFkYXB0ZXIsCi0JCQlJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCi0JCVRhYmxlTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSAKLQkJCQluZXcgVGFibGVNb2RlbEFkYXB0ZXI8VD4oCi0JCQkJCWxpc3RIb2xkZXIsCi0JCQkJCXNlbGVjdGlvbk1vZGVsLAotCQkJCQl0YWJsZSwKLQkJCQkJY29sdW1uQWRhcHRlciwKLQkJCQkJbGFiZWxQcm92aWRlcik7Ci0JCWFkYXB0ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTeW5jTGlzdGVuZXIoc2VsZWN0aW9uTW9kZWwpKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIDxUPiBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFN5bmNMaXN0ZW5lcigKLQkJCQlmaW5hbCBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFQ+IHNlbGVjdGlvbk1vZGVsKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXNlbGVjdGlvbk1vZGVsLnNldFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUoZXZlbnQuc2VsZWN0aW9uKCkpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIsIHNlbGVjdGlvbnMgaG9sZGVyLCB0YWJsZSwgYW5kCi0JICogc3RyaW5nIGNvbnZlcnRlciBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIFRhYmxlTW9kZWxBZGFwdGVyKAotCQkJTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwKLQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNIb2xkZXIsCi0JCQlUYWJsZSB0YWJsZSwKLQkJCUNvbHVtbkFkYXB0ZXI8RT4gY29sdW1uQWRhcHRlciwKLQkJCUlUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLQl7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobGlzdEhvbGRlciA9PSBudWxsKSB8fCAoc2VsZWN0ZWRJdGVtc0hvbGRlciA9PSBudWxsKSB8fCAodGFibGUgPT0gbnVsbCkgfHwgKGxhYmVsUHJvdmlkZXIgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlciA9IHNlbGVjdGVkSXRlbXNIb2xkZXI7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJdGhpcy5jb2x1bW5BZGFwdGVyID0gY29sdW1uQWRhcHRlcjsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQkJdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzID0gbmV3IEFycmF5TGlzdDxUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXI+KGNvbHVtbkFkYXB0ZXIuY29sdW1uQ291bnQoKSk7Ci0KLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLnRhYmxlU2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMudGFibGVTZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KCk7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QgPSB0aGlzLmJ1aWxkRG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QoKTsKLQotCQl0aGlzLnRhYmxlRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZFRhYmxlRGlzcG9zZUxpc3RlbmVyKCk7Ci0JCXRoaXMudGFibGUuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMudGFibGVEaXNwb3NlTGlzdGVuZXIpOwotCi0JCXRoaXMuc3luY2hyb25pemVUYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0SXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRhYmxlTW9kZWxBZGFwdGVyIGxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuc2VsZWN0ZWRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5zZWxlY3RlZEl0ZW1zQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRhYmxlTW9kZWxBZGFwdGVyIHNlbGVjdGVkIGl0ZW1zIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRUYWJsZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnRhYmxlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlci50aGlzLnRhYmxlRG91YmxlQ2xpY2tlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUYWJsZU1vZGVsQWRhcHRlciB0YWJsZSBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pCi0JcHJvdGVjdGVkIExpc3RlbmVyTGlzdDxEb3VibGVDbGlja0xpc3RlbmVyPEU+PiBidWlsZERvdWJsZUNsaWNrTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdChEb3VibGVDbGlja0xpc3RlbmVyLmNsYXNzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KQotCXByb3RlY3RlZCBMaXN0ZW5lckxpc3Q8U2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8RT4+IGJ1aWxkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyTGlzdChTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIERpc3Bvc2VMaXN0ZW5lciBidWlsZFRhYmxlRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMudGFibGVEaXNwb3NlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJUYWJsZU1vZGVsQWRhcHRlciB0YWJsZSBkaXNwb3NlIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVRhYmxlKCkgewotCQl0aGlzLnN5bmNocm9uaXplVGFibGVDb2x1bW5zKCk7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZUl0ZW1zKCk7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZVNlbGVjdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHRhYmxlIGNvbHVtcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZVRhYmxlQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgY29sdW1uQ291bnQgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY29sdW1uQ291bnQoKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY29sdW1uQ291bnQ7IGluZGV4KyspIHsKLQkJCVRhYmxlQ29sdW1uIHRhYmxlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRoaXMudGFibGUsIFNXVC5OVUxMLCBpbmRleCk7Ci0JCQl0YWJsZUNvbHVtbi5zZXRNb3ZlYWJsZShmYWxzZSk7Ci0JCQl0YWJsZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQl0YWJsZUNvbHVtbi5zZXRXaWR0aCgxMDApOwotCi0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGluZGV4KTsKLQotCQkJaWYgKGNvbHVtbk5hbWUgPT0gbnVsbCkgewotCQkJCWNvbHVtbk5hbWUgPSAiIjsKLQkJCX0KLQotCQkJdGFibGVDb2x1bW4uc2V0VGV4dChjb2x1bW5OYW1lKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJydXRlIGZvcmNlIHN5bmNocm9uaXphdGlvbiBvZiB0YWJsZSB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplVGFibGVJdGVtcygpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpbmRleCA9IHRoaXMudGFibGUuZ2V0SXRlbUNvdW50KCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQl0aGlzLnRhYmxlLnJlbW92ZShpbmRleCk7Ci0JCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMucmVtb3ZlKGluZGV4KTsKLQkJfQotCi0JCWludCBpdGVtQ291bnQgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBpdGVtQ291bnQ7IGluZGV4KyspIHsKLQotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpKTsKLQotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmJ1aWxkSXRlbU1vZGVsKHRhYmxlSXRlbSk7Ci0JCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuYWRkKGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCi0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGluZGV4ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0KLQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSBuZXcgVGFibGVJdGVtKHRoaXMudGFibGUsIFNXVC5OVUxMLCBpbmRleCk7Ci0JCQl0YWJsZUl0ZW0uc2V0RGF0YShpdGVtKTsKLQotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmJ1aWxkSXRlbU1vZGVsKHRhYmxlSXRlbSk7Ci0JCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuYWRkKGluZGV4KyssIGFkYXB0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0KLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLnRhYmxlLnJlbW92ZShldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJbmRleCgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxKTsKLQotCQlmb3IgKGludCBpbmRleCA9IGV2ZW50LmdldEluZGV4KCkgKyBldmVudC5nZXRJdGVtc1NpemUoKTsgLS1pbmRleCA+PSBldmVudC5nZXRJbmRleCgpOyApIHsKLQkJCXRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycy5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQotCQlpZiAodGhpcy50YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBsZW5ndGggICAgICAgID0gZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBzb3VyY2VJbmRleCAgID0gZXZlbnQuZ2V0U291cmNlSW5kZXgoKTsKLQkJaW50IHRhcmdldEluZGV4ICAgPSBldmVudC5nZXRUYXJnZXRJbmRleCgpOwotCQlpbnQgbG93U3RhcnRJbmRleCA9IE1hdGgubWluKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCWludCBoaVN0YXJ0SW5kZXggID0gTWF0aC5tYXgodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQotCQlPYmplY3RbXSBpdGVtcyA9IG5ldyBPYmplY3RbaGlTdGFydEluZGV4IC0gbG93U3RhcnRJbmRleCArIGxlbmd0aF07Ci0JCWludCBpdGVtc0luZGV4ID0gaXRlbXMubGVuZ3RoOwotCi0JCS8vIFJlbW92ZSB0aGUgVGFibGVJdGVtcyB3cmFwcGluZyB0aGUgbW92ZWQgaXRlbXMKLQkJZm9yIChpbnQgaW5kZXggPSBoaVN0YXJ0SW5kZXggKyBsZW5ndGg7IC0taW5kZXggPj0gbG93U3RhcnRJbmRleDsgKSB7Ci0KLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciB0YWJsZUl0ZW1Nb2RlbCA9IHRoaXMudGFibGVJdGVtTW9kZWxBZGFwdGVycy5nZXQoaW5kZXgpOwotCQkJaXRlbXNbLS1pdGVtc0luZGV4XSA9IHRhYmxlSXRlbU1vZGVsLnRhYmxlSXRlbS5nZXREYXRhKCk7Ci0KLQkJCS8vIFJlbW92ZSB0aGUgVGFibGVJdGVtLCB3aGljaCB3aWxsIGFsc28gZGlzcG9zZSBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIKLQkJCXRoaXMudGFibGUucmVtb3ZlKGluZGV4KTsKLQkJfQotCi0JCS8vIE1vdmUgdGhlIGl0ZW1zIHNvIHRoZXkgY2FuIHJldHJpZXZlZCBpbiB0aGUgcmlnaHQgb3JkZXIgd2hlbgotCQkvLyByZS1jcmVhdGluZyB0aGUgVGFibGVJdGVtcwotCQlBcnJheVRvb2xzLm1vdmUoCi0JCQlpdGVtcywKLQkJCXRhcmdldEluZGV4IC0gbG93U3RhcnRJbmRleCwKLQkJCXNvdXJjZUluZGV4IC0gbG93U3RhcnRJbmRleCwKLQkJCWxlbmd0aAotCQkpOwotCi0JCWl0ZW1zSW5kZXggPSAwOwotCi0JCS8vIEFkZCBUYWJsZUl0ZW1zIGZvciB0aGUgbW92ZWQgaXRlbXMKLQkJZm9yIChpbnQgaW5kZXggPSBsb3dTdGFydEluZGV4OyBpbmRleCA8PSBoaVN0YXJ0SW5kZXggKyBsZW5ndGggLSAxOyBpbmRleCsrKSB7Ci0KLQkJCS8vIENyZWF0ZSB0aGUgbmV3IFRhYmxlSXRlbQotCQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IG5ldyBUYWJsZUl0ZW0odGhpcy50YWJsZSwgU1dULk5VTEwsIGluZGV4KTsKLQkJCXRhYmxlSXRlbS5zZXREYXRhKGl0ZW1zW2l0ZW1zSW5kZXgrK10pOwotCi0JCQkvLyBBZGFwdCBpdCB3aXRoIGEgbW9kZWwgYWRhcHRlcgotCQkJVGFibGVJdGVtTW9kZWxBZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmJ1aWxkSXRlbU1vZGVsKHRhYmxlSXRlbSk7Ci0JCQl0aGlzLnRhYmxlSXRlbU1vZGVsQWRhcHRlcnMuc2V0KGluZGV4LCBhZGFwdGVyKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBUYWJsZUl0ZW1Nb2RlbEFkYXB0ZXIgYnVpbGRJdGVtTW9kZWwoVGFibGVJdGVtIHRhYmxlSXRlbSkgewotCQlyZXR1cm4gVGFibGVJdGVtTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJdGFibGVJdGVtLAotCQkJdGhpcy5jb2x1bW5BZGFwdGVyLAotCQkJdGhpcy5sYWJlbFByb3ZpZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgcm93SW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCi0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhldmVudCkpIHsKLQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSB0aGlzLnRhYmxlLmdldEl0ZW0ocm93SW5kZXgpOwotCQkJdGFibGVJdGVtLnNldERhdGEoaXRlbSk7Ci0KLQkJCVRhYmxlSXRlbU1vZGVsQWRhcHRlciBhZGFwdGVyID0gdGhpcy50YWJsZUl0ZW1Nb2RlbEFkYXB0ZXJzLmdldChyb3dJbmRleCk7Ci0KLQkJCWludCBjb2x1bW5Db3VudCA9IHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5Db3VudCgpOwotCQkJYm9vbGVhbiByZXZhbGlkYXRlID0gKGNvbHVtbkNvdW50ID09IDEpOwotCi0JCQlmb3IgKGludCBjb2x1bW5JbmRleCA9IGNvbHVtbkNvdW50OyAtLWNvbHVtbkluZGV4ID49IDA7ICkgewotCQkJCWFkYXB0ZXIudGFibGVJdGVtQ2hhbmdlZChjb2x1bW5JbmRleCwgdGFibGVJdGVtLmdldERhdGEoKSwgcmV2YWxpZGF0ZSk7Ci0JCQl9Ci0KLQkJCXJvd0luZGV4Kys7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGFibGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZVRhYmxlSXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGVkIGl0ZW1zICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFIGl0ZW0pIHsKLQkJaW50IGxlbiA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICh0aGlzLmxpc3RIb2xkZXIuZ2V0KGkpID09IGl0ZW0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVUYWJsZVNlbGVjdGlvbigpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChFIHNlbGVjdGVkSXRlbUhvbGRlciA6IHRoaXMuc2VsZWN0ZWRJdGVtc0hvbGRlcikgewotCQkJaW5kaWNlc1tpKytdID0gdGhpcy5pbmRleE9mKHNlbGVjdGVkSXRlbUhvbGRlcik7Ci0JCX0KLQkJdGhpcy50YWJsZS5kZXNlbGVjdEFsbCgpOwotCQl0aGlzLnRhYmxlLnNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGFibGUuc2VsZWN0KHRoaXMuZ2V0SW5kaWNlcyhldmVudC5nZXRJdGVtc1NpemUoKSwgdGhpcy5nZXRJdGVtcyhldmVudCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YWJsZS5kZXNlbGVjdCh0aGlzLmdldEluZGljZXMoZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGludFtdIGdldEluZGljZXMoaW50IGl0ZW1zU2l6ZSwgSXRlcmFibGU8RT4gaXRlbXMpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbaXRlbXNTaXplXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIGluZGljZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGFibGUuZGVzZWxlY3RBbGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZEl0ZW1zQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVUYWJsZVNlbGVjdGlvbigpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGJveCBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3Quc2l6ZSgpID4gMCkgewotCQkJU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gc2NFdmVudCA9IG5ldyBTZWxlY3Rpb25DaGFuZ2VFdmVudDxFPih0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbXMoKSk7Ci0JCQlmb3IgKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IHNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyIDogdGhpcy5zZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlzZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKHNjRXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gc2VsZWN0ZWRJdGVtcygpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKLQkJfQotCQlBcnJheUxpc3Q8RT4gc2VsZWN0ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy50YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkJZm9yIChpbnQgc2VsZWN0aW9uSW5kZXggOiB0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkluZGljZXMoKSkgewotCQkJc2VsZWN0ZWRJdGVtcy5hZGQodGhpcy5saXN0SG9sZGVyLmdldChzZWxlY3Rpb25JbmRleCkpOwotCQl9Ci0JCXJldHVybiBzZWxlY3RlZEl0ZW1zOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRhYmxlRG91YmxlQ2xpY2tlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMudGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3Quc2l6ZSgpID4gMCkgewotCQkJLy8gdGhlcmUgc2hvdWxkIGJlIG9ubHkgYSBzaW5nbGUgaXRlbSBzZWxlY3RlZCBkdXJpbmcgYSBkb3VibGUtY2xpY2soPykKLQkJCUUgc2VsZWN0aW9uID0gdGhpcy5saXN0SG9sZGVyLmdldCh0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJRG91YmxlQ2xpY2tFdmVudDxFPiBkY0V2ZW50ID0gbmV3IERvdWJsZUNsaWNrRXZlbnQ8RT4odGhpcywgc2VsZWN0aW9uKTsKLQkJCWZvciAoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBkb3VibGVDbGlja0xpc3RlbmVyIDogdGhpcy5kb3VibGVDbGlja0xpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWRvdWJsZUNsaWNrTGlzdGVuZXIuZG91YmxlQ2xpY2soZGNFdmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZURpc3Bvc2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIHRhYmxlIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy50YWJsZS5yZW1vdmVEaXNwb3NlTGlzdGVuZXIodGhpcy50YWJsZURpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMudGFibGUucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy50YWJsZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zSG9sZGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRvdWJsZSBjbGljayBzdXBwb3J0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoRG91YmxlQ2xpY2tMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLmRvdWJsZUNsaWNrTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihEb3VibGVDbGlja0xpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuZG91YmxlQ2xpY2tMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIERvdWJsZUNsaWNrTGlzdGVuZXI8RT4gZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50PEU+IGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERvdWJsZUNsaWNrRXZlbnQ8RT4gZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCXByaXZhdGUgZmluYWwgRSBzZWxlY3Rpb247Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXByb3RlY3RlZCBEb3VibGVDbGlja0V2ZW50KFRhYmxlTW9kZWxBZGFwdGVyPEU+IHNvdXJjZSwgRSBzZWxlY3Rpb24pIHsKLQkJCXN1cGVyKHNvdXJjZSk7Ci0JCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXI8RT4gZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIChUYWJsZU1vZGVsQWRhcHRlcjxFPikgc3VwZXIuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBzZWxlY3Rpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zZWxlY3Rpb247Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3Rpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBsaXN0ZW5lcikgewotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPEU+IGxpc3RlbmVyKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFPiBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCQl2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gZXZlbnQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uQ2hhbmdlRXZlbnQ8RT4gZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxFPiBzZWxlY3Rpb247Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXByb3RlY3RlZCBTZWxlY3Rpb25DaGFuZ2VFdmVudChUYWJsZU1vZGVsQWRhcHRlcjxFPiBzb3VyY2UsIENvbGxlY3Rpb248RT4gc2VsZWN0aW9uKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyPEU+IGdldFNvdXJjZSgpIHsKLQkJCXJldHVybiAoVGFibGVNb2RlbEFkYXB0ZXI8RT4pIHN1cGVyLmdldFNvdXJjZSgpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEU+IHNlbGVjdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLnNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC9zd3QvVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzE2YjViLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5UcmlTdGF0ZUNoZWNrQm94OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBjYW4gYmUgdXNlZCB0byBrZWVwIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBpbiBzeW5jaCB3aXRoCi0gKiBhIG1vZGVsIEJvb2xlYW4gd2hlcmUgdGhlIHZhbHVlIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlciB7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogVGhlIGNoZWNrIGJveC90b2dnbGUgYnV0dG9uIHdlIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGJvb2xlYW4uICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYnV0dG9uOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbW9kZWwgYm9vbGVhbiB3aXRoCi0JICogdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2VsZWN0aW9uTGlzdGVuZXIgYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGJ1dHRvbgotCSAqIGlzIGRpc3Bvc2VkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgYnV0dG9uRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgYm9vbGVhbiB0byB0aGUgc3BlY2lmaWVkIGJ1dHRvbi4KLQkgKiBJZiB0aGUgYm9vbGVhbiBpcyBudWxsLCB0aGUgYnV0dG9uJ3MgdmFsdWUgd2lsbCBiZSAicGFydGlhbGx5IGNoZWNrZWQiCi0JICogKGkuZS4gdGhlIGJ1dHRvbiB3aWxsIGJlIGNoZWNrZWQgYnV0IGdyYXllZCBvdXQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlciBhZGFwdChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLCBUcmlTdGF0ZUNoZWNrQm94IGJ1dHRvbikgewotCQlyZXR1cm4gbmV3IFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoYm9vbGVhbkhvbGRlciwgYnV0dG9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGFuZCBidXR0b24gYXJlIHJlcXVpcmVkLgotCSAqLwotCXByb3RlY3RlZCBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIFRyaVN0YXRlQ2hlY2tCb3ggYnV0dG9uKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChib29sZWFuSG9sZGVyLCAiVGhlIGJvb2xlYW4gaG9sZGVyIGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoYnV0dG9uLCAiVGhlIGNoZWNrIGJveCBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYnV0dG9uID0gYnV0dG9uOwotCi0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCXRoaXMuc2V0QnV0dG9uU2VsZWN0aW9uKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIudGhpcy5ib29sZWFuQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmktc3RhdGUgYm9vbGVhbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLnRoaXMuYnV0dG9uU2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJpLXN0YXRlIGJ1dHRvbiBzZWxlY3Rpb24gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBEaXNwb3NlTGlzdGVuZXIgYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci50aGlzLmJ1dHRvbkRpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyaS1zdGF0ZSBidXR0b24gZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBidXR0b24uCi0JICogSWYgdGhlIG5ldyBtb2RlbCB2YWx1ZSBpcyBudWxsLCB1c2UgdGhlIGFkYXB0ZXIncyBkZWZhdWx0IHZhbHVlCi0JICogKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbigoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0QnV0dG9uU2VsZWN0aW9uKEJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCWlmICh0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnV0dG9uIGhhcyBiZWVuICJzZWxlY3RlZCIgLSBzeW5jaHJvbml6ZSB0aGUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uU2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwb3NlICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvbkRpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkvLyB0aGUgYnV0dG9uIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5idXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuYnV0dG9uLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lcik7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbkhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvQ29udHJvbEFsaWduZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmJkMWVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIHRvIHNldCBhIHByZWZlcnJlZCB3aWR0aCBvbiB0aGUgcmVnaXN0ZXJlZCB3aWRnZXRzCi0gKiAoZWl0aGVyIDxjb2RlPkNvbnRyb2w8L2NvZGU+IG9yIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgYmFzZWQgb24gdGhlCi0gKiB3aWRlc3Qgd2lkZ2V0LgotICogPHA+Ci0gKiBJbXBvcnRhbnQ6IFRoZSBsYXlvdXQgZGF0YSBoYXMgdG8gYmUgYSA8Y29kZT5HcmlkRGF0YTwvY29kZT4uIElmIG5vbmUgaXMgc2V0LAotICogdGhlbiBhIG5ldyA8Y29kZT5HcmlkRGF0YTwvY29kZT4gaXMgYXV0b21hdGljYWxseSBjcmVhdGVkLgotICogPHA+Ci0gKiBIZXJlIGFuIGV4YW1wbGUgb2YgdGhlIHJlc3VsdCBpZiB0aGlzIGFsaWduZXIgaXMgdXNlZCB0byBhbGlnbiBjb250cm9scwotICogd2l0aGluIGVpdGhlciBvbmUgb3IgdHdvIGdyb3VwIGJveGVzLCB0aGUgY29udHJvbHMgYWRkZWQgYXJlIHRoZSBsYWJlbHMgaW4KLSAqIHRoaXMgY2FzZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBhbGlnbiBjb250cm9scyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUKLSAqIG1haW4gY29tcG9uZW50LCBhIHNwYWNlciBjYW4gYmUgdXNlZCBmb3IgZXh0cmEgc3BhY2UuCi0gKiA8cD4KLSAqIEhlcmUncyBhbiBleGFtcGxlOgotICogPHByZT4KLSAqIC0gR3JvdXAgQm94IDEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgUHJlYWxsb2NhdGlvbiBTaXplOiB8ICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgIHwKLSAqIHwgRGVzY3JpcHRvcjogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqCi0gKiAtIEdyb3VwIEJveCAyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8IE1hcHBpbmcgVHlwZTogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8VnwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8IENoZWNrIGluIFNjcmlwdDogICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRyb2xBbGlnbmVyCi17Ci0JLyoqCi0JICogRmxhZyB1c2VkIHRvIHByZXZlbnQgYSB2YWxpZGF0aW9uIHNvIGl0IGNhbiBiZSBkb25lIGFmdGVyIGFuIG9wZXJhdGlvbgotCSAqIGNvbXBsZXRlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gYXV0b1ZhbGlkYXRlOwotCi0JLyoqCi0JICogVGhlIHV0aWxpdHkgY2xhc3MgdXNlZCB0byBzdXBwb3J0IGJvdW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPExpc3RlbmVyPiBjaGFuZ2VTdXBwb3J0OwotCi0JLyoqCi0JICogVGhlIGxpc3RlbmVyIGFkZGVkIHRvIGVhY2ggb2YgdGhlIGNvbnRyb2xzIHRoYXQgbGlzdGVucyBvbmx5IHRvIGEgdGV4dAotCSAqIGNoYW5nZS4KLQkgKi8KLQlwcml2YXRlIExpc3RlbmVyIGxpc3RlbmVyOwotCi0JLyoqCi0JICogUHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHdoZW4gcmVjYWxjdWxhdGluZyB0aGUgcHJlZmVycmVkIHdpZHRoLgotCSAqIFRoaXMgaGFwcGVucyBpbiBhbiBoaWVyYXJjaHkgb2YgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+cy4gVGhlIGxvY2sKLQkgKiBoYXMgdG8gYmUgcGxhY2VkIGhlcmUgYW5kIG5vdCBpbiB0aGUge0BsaW5rIENvbnRyb2xBbGlnbmVyV3JhcHBlcn0uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCS8qKgotCSAqIFRoZSBsZW5ndGggb2YgdGhlIHdpZGVzdCBjb250cm9sLiBJZiB0aGUgbGVuZ3RoIHdhcyBub3QgY2FsY3VsYXRlZCwgdGhlbgotCSAqIHRoaXMgdmFsdWUgaXMgMC4KLQkgKi8KLQlwcml2YXRlIGludCBtYXhpbXVtV2lkdGg7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiB7QGxpbmsgV3JhcHBlcn1zIGVuY2Fwc3VsYXRpbmcgZWl0aGVyIDxjb2RlPkNvbnRyb2w8L2NvZGU+cwotCSAqIG9yIHtAbGluayBDb250cm9sQWxpZ25lcn1zLgotCSAqLwotCXByaXZhdGUgQ29sbGVjdGlvbjxXcmFwcGVyPiB3cmFwcGVyczsKLQotCS8qKgotCSAqIEEgbnVsbC08Y29kZT5Qb2ludDwvY29kZT4gb2JqZWN0IHVzZWQgdG8gY2xlYXIgdGhlIHByZWZlcnJlZCBzaXplLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFBvaW50IERFRkFVTFRfU0laRSA9IG5ldyBQb2ludChTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JLyoqCi0JICogVGhlIHR5cGVzIG9mIGV2ZW50cyB0byBsaXN0ZW4gaW4gb3JkZXIgdG8gcHJvcGVybHkgYWRqdXN0IHRoZSBzaXplIG9mIGFsbAotCSAqIHRoZSB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEVWRU5UX1RZUEVTID0gewotCQlTV1QuRGlzcG9zZSwKLQkJU1dULkhpZGUsCi0JCVNXVC5SZXNpemUsCi0JCVNXVC5TaG93Ci0JfTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb250cm9sQWxpZ25lcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2xzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2w8L2NvZGU+cwotCSAqLwotCXB1YmxpYyBDb250cm9sQWxpZ25lcihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCQl0aGlzKCk7Ci0JCWFkZEFsbENvbnRyb2xzKGNvbnRyb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb250cm9sLiBJdHMgd2lkdGggd2lsbCBiZSB1c2VkIGFsb25nIHdpdGggdGhlIHdpZHRoIG9mIGFsbAotCSAqIHRoZSBvdGhlciByZWdpc3RlcmVkIGNvbnRyb2xzIGluIG9yZGVyIHRvIGdldCB0aGUgZ3JlYXRlciB3aXRkaCBhbmQgdXNlCi0JICogaXQgYXMgdGhlIHdpZHRoIGZvciBhbGwgdGhlIGNvbnRyb2xzLgotCSAqCi0JICogQHBhcmFtIGNvbnRyb2wgVGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+IHRvIGJlIGFkZGVkCi0JICovCi0JcHVibGljIHZvaWQgYWRkKENvbnRyb2wgY29udHJvbCkgewotCi0JCUFzc2VydC5pc05vdE51bGwoY29udHJvbCwgIkNhbid0IGFkZCBudWxsIHRvIHRoaXMgQ29udHJvbEFsaWduZXIiKTsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSBidWlsZFdyYXBwZXIoY29udHJvbCk7Ci0JCXdyYXBwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl3cmFwcGVycy5hZGQod3JhcHBlcik7Ci0KLQkJcmV2YWxpZGF0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gY29udHJvbC4gSXRzIHdpZHRoIHdpbGwgYmUgdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwKLQkgKiB0aGUgb3RoZXIgcmVnaXN0ZXJlZCBjb250cm9scyBpbiBvcmRlciB0byBnZXQgdGhlIGdyZWF0ZXIgd2l0ZGggYW5kIHVzZQotCSAqIGl0IGFzIHRoZSB3aWR0aCBmb3IgYWxsIHRoZSBjb250cm9scy4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sQWxpZ25lciBUaGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHRvIGJlIGFkZGVkCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gQ2FuJ3QgYWRkIHRoZSA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4KLQkgKiB0byBpdHNlbGYKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2xBbGlnbmVyLCAiQ2FuJ3QgYWRkIG51bGwgdG8gdGhpcyBDb250cm9sQWxpZ25lciIpOwotCQlBc3NlcnQuaXNMZWdhbChjb250cm9sQWxpZ25lciAhPSB0aGlzLCAiQ2FuJ3QgYWRkIHRoZSBDb250cm9sQWxpZ25lciB0byBpdHNlbGYiKTsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSBidWlsZFdyYXBwZXIoY29udHJvbEFsaWduZXIpOwotCQl3cmFwcGVyLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJd3JhcHBlcnMuYWRkKHdyYXBwZXIpOwotCi0JCWlmICghY29udHJvbEFsaWduZXIud3JhcHBlcnMuaXNFbXB0eSgpKSB7Ci0JCQlyZXZhbGlkYXRlKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGl0ZW1zIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBpbnRvIHRoaXMKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4uIFRoZSBwcmVmZXJyZWQgd2lkdGggb2YgZWFjaCBpdGVtIHdpbGwgYmUKLQkgKiB1c2VkIGFsb25nIHdpdGggdGhlIHdpZHRoIG9mIGFsbCB0aGUgb3RoZXIgaXRlbXMgaW4gb3JkZXIgdG8gZ2V0IHRoZQotCSAqIHdpZGVzdCBjb250cm9sIGFuZCB1c2UgaXRzIHdpZHRoIGFzIHRoZSB3aWR0aCBmb3IgYWxsIHRoZSBjb250cm9scy4KLQkgKgotCSAqIEBwYXJhbSBhbGlnbmVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT5zCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWxsQ29udHJvbEFsaWduZXJzKENvbGxlY3Rpb248Q29udHJvbEFsaWduZXI+IGFsaWduZXJzKSB7Ci0KLQkJLy8gRGVhY3RpdmF0ZSB0aGUgYXV0byB2YWxpZGF0aW9uIHdoaWxlIGFkZGluZyBhbGwgdGhlIENvbnRyb2xzIGFuZC9vcgotCQkvLyBDb250cm9sQWxpZ25lcnMgaW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQlib29sZWFuIG9sZEF1dG9WYWxpZGF0ZSA9IGF1dG9WYWxpZGF0ZTsKLQkJYXV0b1ZhbGlkYXRlID0gZmFsc2U7Ci0KLQkJZm9yIChDb250cm9sQWxpZ25lciBhbGlnbmVyIDogYWxpZ25lcnMpIHsKLQkJCWFkZChhbGlnbmVyKTsKLQkJfQotCi0JCWF1dG9WYWxpZGF0ZSA9IG9sZEF1dG9WYWxpZGF0ZTsKLQkJcmV2YWxpZGF0ZShmYWxzZSk7Ci0JfQotCi0gICAvKioKLQkgKiBBZGRzIHRoZSBpdGVtcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIGNvbGxlY3Rpb24gaW50byB0aGlzCi0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LiBUaGUgcHJlZmVycmVkIHdpZHRoIG9mIGVhY2ggaXRlbSB3aWxsIGJlCi0JICogdXNlZCBhbG9uZyB3aXRoIHRoZSB3aWR0aCBvZiBhbGwgdGhlIG90aGVyIGl0ZW1zIGluIG9yZGVyIHRvIGdldCB0aGUKLQkgKiB3aWRlc3QgY29udHJvbCBhbmQgdXNlIGl0cyB3aWR0aCBhcyB0aGUgd2lkdGggZm9yIGFsbCB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gY29udHJvbHMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbDwvY29kZT5zCi0JICovCi0JcHVibGljIHZvaWQgYWRkQWxsQ29udHJvbHMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHMpIHsKLQotCQkvLyBEZWFjdGl2YXRlIHRoZSBhdXRvIHZhbGlkYXRpb24gd2hpbGUgYWRkaW5nIGFsbCB0aGUgQ29udHJvbHMgYW5kL29yCi0JCS8vIENvbnRyb2xBbGlnbmVycyBpbiBvcmRlciB0byBpbXByb3ZlIHBlcmZvcm1hbmNlCi0JCWJvb2xlYW4gb2xkQXV0b1ZhbGlkYXRlID0gYXV0b1ZhbGlkYXRlOwotCQlhdXRvVmFsaWRhdGUgPSBmYWxzZTsKLQotCQlmb3IgKENvbnRyb2wgY29udHJvbCA6IGNvbnRyb2xzKSB7Ci0JCQlhZGQoY29udHJvbCk7Ci0JCX0KLQotCQlhdXRvVmFsaWRhdGUgPSBvbGRBdXRvVmFsaWRhdGU7Ci0JCXJldmFsaWRhdGUoZmFsc2UpOwotCX0KLQotICAgLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvTGlzdGVuZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxpc3RlbmVyIFRoZSA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gYmUgYWRkZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQlpZiAoY2hhbmdlU3VwcG9ydCA9PSBudWxsKSB7Ci0JCSAgICBjaGFuZ2VTdXBwb3J0ID0gbmV3IEFycmF5TGlzdDxMaXN0ZW5lcj4oKTsKLQkJfQotCi0JCWNoYW5nZVN1cHBvcnQuYWRkKGxpc3RlbmVyKTsKLSAgIH0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+V3JhcHBlcjwvY29kZT4gdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGdpdmVuIHNvdXJjZS4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIGJlIHdyYXBwZWQKLQkgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBXcmFwcGVyfQotCSAqLwotCXByaXZhdGUgV3JhcHBlciBidWlsZFdyYXBwZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCXJldHVybiBuZXcgQ29udHJvbFdyYXBwZXIoY29udHJvbCk7Ci0JfQotCi0gICAvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPldyYXBwZXI8L2NvZGU+IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBnaXZlbiBzb3VyY2UuCi0JICoKLQkgKiBAcGFyYW0gQ29udHJvbEFsaWduZXIgVGhlIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiB0byBiZSB3cmFwcGVkCi0JICogQHJldHVybiBBIG5ldyB7QGxpbmsgQ29udHJvbEFsaWduZXJXcmFwcGVyfQotCSAqLwotCXByaXZhdGUgV3JhcHBlciBidWlsZFdyYXBwZXIoQ29udHJvbEFsaWduZXIgQ29udHJvbEFsaWduZXIpIHsKLQkJcmV0dXJuIG5ldyBDb250cm9sQWxpZ25lcldyYXBwZXIoQ29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIHRha2VuIGJ5IHRoZSB3aWRnZXRzIGFuZCByZXR1cm5zIHRoZSBtYXhpbXVtIHdpZHRoLgotCSAqCi0JICogQHBhcmFtIHJlY2FsY3VsYXRlU2l6ZSA8Y29kZT50cnVlPC9jb2RlPiB0byByZWNhbGN1bGF0ZSB0aGUgcHJlZmVycmVkIHNpemUKLQkgKiBvZiBhbGwgdGhlIHdyYXBwZXJzIGNvbnRhaW5lZCB3aXRoaW4gdGhlbSByYXRoZXIgdGhhbiB1c2luZyB0aGUgY2FjaGVkCi0JICogc2l6ZTsgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIHVzZSB0aGUgY2FjaGVkIHNpemUKLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVXaWR0aChib29sZWFuIHJlY2FsY3VsYXRlU2l6ZSkgewotCi0JCWludCB3aWR0aCA9IDA7Ci0KLQkJZm9yIChXcmFwcGVyIHdyYXBwZXIgOiB3cmFwcGVycykgewotCQkJUG9pbnQgc2l6ZSA9IHdyYXBwZXIuY2FjaGVkU2l6ZSgpOwotCi0JCQkvLyBUaGUgc2l6ZSBoYXMgbm90IGJlZW4gY2FsY3VsYXRlZCB5ZXQKLQkJCWlmIChyZWNhbGN1bGF0ZVNpemUgfHwgKHNpemUueCA9PSAwKSkgewotCQkJCXNpemUgPSB3cmFwcGVyLmNhbGN1bGF0ZVNpemUoKTsKLQkJCX0KLQotCQkJLy8gT25seSBrZWVwIHRoZSBncmVhdGVzdCB3aWR0aAotCQkJd2lkdGggPSBNYXRoLm1heChzaXplLngsIHdpZHRoKTsKLQkJfQotCi0JCXJldHVybiB3aWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnRzIGEgYm91bmQgcHJvcGVydHkgY2hhbmdlLgotCSAqCi0JICogQHBhcmFtIG9sZFZhbHVlIHRoZSBvbGQgdmFsdWUgb2YgdGhlIHByb3BlcnR5IChhcyBhbiBpbnQpCi0JICogQHBhcmFtIG5ld1ZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5IChhcyBhbiBpbnQpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbnRyb2xSZXNpemVkKGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0KLQkJaWYgKChjaGFuZ2VTdXBwb3J0ICE9IG51bGwpICYmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkpIHsKLQkJCUV2ZW50IGV2ZW50ICA9IG5ldyBFdmVudCgpOwotCQkJZXZlbnQud2lkZ2V0ID0gU1dUVXRpbC5nZXRTaGVsbCgpOwotCQkJZXZlbnQuZGF0YSAgID0gdGhpczsKLQotCQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IGNoYW5nZVN1cHBvcnQpIHsKLQkJCQlsaXN0ZW5lci5oYW5kbGVFdmVudChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNwb3NlcyB0aGlzIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPiwgdGhpcyBjYW4gaW1wcm92ZSB0aGUgc3BlZWQgb2YKLQkgKiBkaXNwb3NpbmcgYSBwYW5lLiBXaGVuIGEgcGFuZSBpcyBkaXNwb3NlZCwgdGhpcyBhbGlnbmVyIGRvZXNuJ3QgbmVlZCB0bwotCSAqIHJldmFsaWRhdGUgaXRzIHNpemUgdXBvbiBkaXNwb3NlIG9mIGl0cyB3aWRnZXRzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0KLQkJZm9yIChJdGVyYXRvcjxXcmFwcGVyPiBpdGVyID0gd3JhcHBlcnMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJV3JhcHBlciB3cmFwcGVyID0gaXRlci5uZXh0KCk7Ci0JCQl3cmFwcGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCX0KLQotCQl0aGlzLndyYXBwZXJzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB3aWRlc3QgY29udHJvbC4gSWYgdGhlIGxlbmd0aCB3YXMgbm90Ci0JICogY2FsY3VsYXRlZCwgdGhlbiB0aGlzIHZhbHVlIGlzIDAuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IGNvbnRyb2wgb3IgMCBpZiB0aGUgbGVuZ3RoIGhhcyBub3QgYmVlbgotCSAqIGNhbGN1bGF0ZWQgeWV0Ci0JICovCi0JcHVibGljIGludCBnZXRNYXhpbXVtV2lkdGgoKSB7Ci0JCXJldHVybiBtYXhpbXVtV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJdGhpcy5hdXRvVmFsaWRhdGUgPSB0cnVlOwotCQl0aGlzLm1heGltdW1XaWR0aCA9IDA7Ci0JCXRoaXMubGlzdGVuZXIgICAgID0gbmV3IExpc3RlbmVySGFuZGxlcigpOwotCQl0aGlzLndyYXBwZXJzICAgICA9IG5ldyBBcnJheUxpc3Q8V3JhcHBlcj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnZhbGlkYXRlcyB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9iamVjdCB0byBiZSBpbnZhbGlkYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnZhbGlkYXRlKE9iamVjdCBzb3VyY2UpIHsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSByZXRyaWV2ZVdyYXBwZXIoc291cmNlKTsKLQotCQlpZiAoIXdyYXBwZXIubG9ja2VkKCkpIHsKLQkJCVBvaW50IHNpemUgPSB3cmFwcGVyLmNhY2hlZFNpemUoKTsKLQkJCXNpemUueCA9IHNpemUueSA9IDA7Ci0JCQl3cmFwcGVyLnNldFNpemUoREVGQVVMVF9TSVpFKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIG1heGltdW0gbGVuZ3RoIGJhc2VkIG9uIHRoZSB3aWRlc3QgY29udHJvbC4gVGhpcyBtZXRob2RzCi0JICogZG9lcyBub3QgdXBkYXRlIHRoZSB3aWR0aCBvZiB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gcmVjYWxjdWxhdGVTaXplIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJlY2FsY3VsYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZQotCSAqIG9mIGFsbCB0aGUgd3JhcHBlcnMgY29udGFpbmVkIHdpdGhpbiB0aGVtIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBjYWNoZWQKLQkgKiBzaXplOyA8Y29kZT5mYWxzZTwvY29kZT4gdG8gdXNlIHRoZSBjYWNoZWQgc2l6ZQotCSAqLwotCXByaXZhdGUgdm9pZCByZWNhbGN1bGF0ZVdpZHRoKGJvb2xlYW4gcmVjYWxjdWxhdGVTaXplKSB7Ci0KLQkJaW50IHdpZHRoID0gY2FsY3VsYXRlV2lkdGgocmVjYWxjdWxhdGVTaXplKTsKLQotCQl0cnkgewotCQkJbG9ja2VkID0gdHJ1ZTsKLQkJCXNldE1heGltdW1XaWR0aCh3aWR0aCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlsb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRyb2wuIEl0cyBwcmVmZXJyZWQgd2lkdGggd2lsbCBub3QgYmUgdXNlZCB3aGVuCi0JICogY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aWR0aC4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIGJlIHJlbW92ZWQKLQkgKiBAZXhjZXB0aW9uIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZShDb250cm9sIGNvbnRyb2wpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2wsICJUaGUgQ29udHJvbCB0byByZW1vdmUgY2Fubm90IGJlIG51bGwiKTsKLQotCQlXcmFwcGVyIHdyYXBwZXIgPSByZXRyaWV2ZVdyYXBwZXIoY29udHJvbCk7Ci0JCXdyYXBwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl3cmFwcGVycy5yZW1vdmUod3JhcHBlcik7Ci0KLQkJcmV2YWxpZGF0ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4uIEl0cyBwcmVmZXJyZWQgd2lkdGgKLQkgKiB3aWxsIG5vdCBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHByZWZlcnJlZCB3aXRkaC4KLQkgKgotCSAqIEBwYXJhbSBjb250cm9sQWxpZ25lciBUaGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHRvIGJlIHJlbW92ZWQKLQkgKiBAZXhjZXB0aW9uIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4gPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+Ci0JICogaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIpIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRyb2xBbGlnbmVyLCAiVGhlIENvbnRyb2xBbGlnbmVyIHRvIHJlbW92ZSBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCVdyYXBwZXIgd3JhcHBlciA9IHJldHJpZXZlV3JhcHBlcihjb250cm9sQWxpZ25lcik7Ci0JCXdyYXBwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl3cmFwcGVycy5yZW1vdmUod3JhcHBlcik7Ci0KLQkJcmV2YWxpZGF0ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBnaXZlbiA8Y29kZT5MaXN0ZW5lcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbGlzdGVuZXIgVGhlIDxjb2RlPkxpc3RlbmVyPC9jb2RlPiB0byBiZSByZW1vdmVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJY2hhbmdlU3VwcG9ydC5yZW1vdmUobGlzdGVuZXIpOwotCi0JCWlmIChjaGFuZ2VTdXBwb3J0LmlzRW1wdHkoKSkgewotCQkJY2hhbmdlU3VwcG9ydCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIDxjb2RlPldyYXBwZXI8L2NvZGU+IHRoYXQgaXMgZW5jYXBzdWxhdGluZyB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBFaXRoZXIgYSA8Y29kZT5Db250cm9sPC9jb2RlPiBvciBhIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPgotCSAqIEByZXR1cm4gSXRzIDxjb2RlPldyYXBwZXI8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBXcmFwcGVyIHJldHJpZXZlV3JhcHBlcihPYmplY3Qgc291cmNlKSB7Ci0KLQkJZm9yIChXcmFwcGVyIHdyYXBwZXIgOiB3cmFwcGVycykgewotCQkJaWYgKHdyYXBwZXIuc291cmNlKCkgPT0gc291cmNlKSB7Ci0JCQkJcmV0dXJuIHdyYXBwZXI7Ci0JCQl9Ci0JCX0KLQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDYW4ndCByZXRyaWV2ZSB0aGUgV3JhcHBlciBmb3IgIiArIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGNvdW50IG9mIGNvbnRyb2wgaXMgZ3JlYXRlciB0aGFuIG9uZSBhbmQge0BsaW5rICNpc0F1dG9WYWxpZGF0ZSgpfQotCSAqIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZW4gdGhlIHNpemUgb2YgYWxsIHRoZSByZWdpc3RlcmVkCi0JICogPGNvZGU+Q29udHJvbDwvY29kZT5zIHdpbGwgYmUgdWRwYXRlZC4KLQkgKgotCSAqIEBwYXJhbSByZWNhbGN1bGF0ZVNpemUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplCi0JICogb2YgYWxsIHRoZSB3cmFwcGVycyBjb250YWluZWQgd2l0aGluIHRoZW0gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGNhY2hlZAotCSAqIHNpemU7IDxjb2RlPmZhbHNlPC9jb2RlPiB0byB1c2UgdGhlIGNhY2hlZCBzaXplCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJldmFsaWRhdGUoYm9vbGVhbiByZWNhbGN1bGF0ZVNpemUpIHsKLQotCQlpZiAoYXV0b1ZhbGlkYXRlKSB7Ci0JCQlyZWNhbGN1bGF0ZVdpZHRoKHJlY2FsY3VsYXRlU2l6ZSk7Ci0JCQl1cGRhdGVXcmFwcGVyU2l6ZShyZWNhbGN1bGF0ZVNpemUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQmFzZXMgb24gdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gPGNvZGU+RXZlbnQ8L2NvZGU+LAotCSAqIHJlc2l6ZSB0aGUgY29udHJvbHMuCi0JICoKLQkgKiBAcGFyYW0gZXZlbnQgVGhlIDxjb2RlPkV2ZW50PC9jb2RlPiBzZW50IGJ5IHRoZSBVSSB0aHJlYWQgd2hlbiB0aGUgc3RhdGUKLQkgKiBvZiBhIHdpZGdldCBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJldmFsaWRhdGUoRXZlbnQgZXZlbnQpIHsKLQotCQkvLyBXZSBkb24ndCBuZWVkIHRvIHJldmFsaWRhdGUgZHVyaW5nIGEgcmV2YWxpZGF0aW9uIHByb2Nlc3MKLQkJaWYgKGxvY2tlZCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJT2JqZWN0IHNvdXJjZTsKLQotCQlpZiAoZXZlbnQud2lkZ2V0ICE9IFNXVFV0aWwuZ2V0U2hlbGwoKSkgewotCQkJc291cmNlID0gZXZlbnQud2lkZ2V0OwotCQkJQ29udHJvbCBjb250cm9sID0gKENvbnRyb2wpIHNvdXJjZTsKLQotCQkJLy8gV2hlbiBhIGRpYWxvZyBpcyBvcGVuZWQsIHdlIG5lZWQgdG8gYWN0dWFsbHkgZm9yY2UgYSBsYXlvdXQgb2YKLQkJCS8vIHRoZSBjb250cm9scywgdGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSBjb250cm9sIGlzIGFjdHVhbGx5Ci0JCQkvLyBub3QgdmlzaWJsZSB3aGVuIHRoZSBwcmVmZXJyZWQgd2lkdGggaXMgY2FjdWxhdGVkCi0JCQlpZiAoY29udHJvbCA9PSBjb250cm9sLmdldFNoZWxsKCkpIHsKLQkJCQlpZiAoZXZlbnQudHlwZSA9PSBTV1QuRGlzcG9zZSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJc291cmNlID0gbnVsbDsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNvdXJjZSA9IGV2ZW50LmRhdGE7Ci0JCX0KLQotCQkvLyBFaXRoZXIgcmVtb3ZlIHRoZSBDb250cm9sV3JhcHBlciBpZiB0aGUgd2lkZ2V0IHdhcyBkaXNwb3NlZCBvcgotCQkvLyBpbnZhbGlkYXRlIHRoZSB3aWRnZXQgaW4gb3JkZXIgdG8gcmVjYWxjdWxhdGUgdGhlIHByZWZlcnJlZCBzaXplCi0JCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJaWYgKGV2ZW50LnR5cGUgPT0gU1dULkRpc3Bvc2UpIHsKLQkJCQlXcmFwcGVyIHdyYXBwZXIgPSByZXRyaWV2ZVdyYXBwZXIoc291cmNlKTsKLQkJCQl3cmFwcGVycy5yZW1vdmUod3JhcHBlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnZhbGlkYXRlKHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBOb3cgcmV2YWxpZGF0ZSBhbGwgdGhlIENvbnRyb2xzIGFuZCBDb250cm9sQWxpZ25lcnMKLQkJcmV2YWxpZGF0ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGhlIHdpZGVzdCBjb250cm9sLiBJZiB0aGUgbGVuZ3RoIHdhcyBub3QgY2FsdWxjYXRlZCwKLQkgKiB0aGVuIHRoaXMgdmFsdWUgaXMgMC4KLQkgKgotCSAqIEBwYXJhbSBtYXhpbXVtV2lkdGggVGhlIHdpZHRoIG9mIHRoZSB3aWRlc3QgY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNYXhpbXVtV2lkdGgoaW50IG1heGltdW1XaWR0aCkgewotCi0JCWludCBvbGRNYXhpbXVtV2lkdGggPSB0aGlzLm1heGltdW1XaWR0aDsKLQkJdGhpcy5tYXhpbXVtV2lkdGggPSBtYXhpbXVtV2lkdGg7Ci0JCWNvbnRyb2xSZXNpemVkKG9sZE1heGltdW1XaWR0aCwgbWF4aW11bVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBJbmZvcm1hdGlvbiBhYm91dCB0aGlzIG9iamVjdAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoIm1heGltdW1XaWR0aD0iKTsKLQkJc2IuYXBwZW5kKG1heGltdW1XaWR0aCk7Ci0JCXNiLmFwcGVuZCgiLCB3cmFwcGVycz0iKTsKLQkJc2IuYXBwZW5kKHdyYXBwZXJzKTsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgc2IpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgZXZlcnkgPGNvZGU+V3JhcHBlcjwvY29kZT4gYmFzZWQgb24gdGhlIG1heGltdW0gd2lkdGguCi0JICoKLQkgKiBAcGFyYW0gZm9yY2VSZXZhbGlkYXRlIDxjb2RlPnRydWU8L2NvZGU+IHRvIHJldmFsaWRhdGUgdGhlIHdyYXBwZXIncyBzaXplCi0JICogZXZlbiB0aG91Z2ggaXRzIGN1cnJlbnQgc2l6ZSBtaWdodCBiZSB0aGUgc2FtZSBhcyB0aGUgbWF4aW11bSB3aWR0aDsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gb25seSByZXZhbGlkYXRlIHRoZSB3cmFwcGVycyB3aXRoIGEgZGlmZmVyZW50IHdpZHRoCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVdyYXBwZXJTaXplKGJvb2xlYW4gZm9yY2VSZXZhbGlkYXRlKSB7Ci0KLQkJZm9yIChXcmFwcGVyIHdyYXBwZXIgOiB3cmFwcGVycykgewotCQkJUG9pbnQgY2FjaGVkU2l6ZSA9IHdyYXBwZXIuY2FjaGVkU2l6ZSgpOwotCi0JCQkvLyBObyBuZWVkIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgd3JhcHBlciBzaW5jZSBpdCdzIGFsd2F5cyB1c2luZwotCQkJLy8gdGhlIG1heGltdW0gd2lkdGgKLQkJCWlmIChmb3JjZVJldmFsaWRhdGUgfHwgKGNhY2hlZFNpemUueCAhPSBtYXhpbXVtV2lkdGgpKSB7Ci0JCQkJUG9pbnQgc2l6ZSA9IG5ldyBQb2ludChtYXhpbXVtV2lkdGgsIGNhY2hlZFNpemUueSk7Ci0JCQkJd3JhcHBlci5zZXRTaXplKHNpemUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPiBlbmNhcHN1bGF0ZXMgYSB7QGxpbmsgQ29udHJvbEFsaWduZXJ9LgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ29udHJvbEFsaWduZXJXcmFwcGVyIGltcGxlbWVudHMgV3JhcHBlciB7Ci0JCS8qKgotCQkgKiBUaGUgY2FjaGVkIHNpemUsIHdoaWNoIGlzIHtAbGluayBDb250cm9sQWxpZ25lciNtYXhpbXVtV2lkdGh9LgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBQb2ludCBjYWNoZWRTaXplOwotCi0JCS8qKgotCQkgKiBUaGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IGVuY2Fwc3VsYXRlZCBieSB0aGlzCi0JCSAqIDxjb2RlPldyYXBwZXI8L2NvZGU+LgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db250cm9sQWxpZ25lcldyYXBwZXI8L2NvZGU+IHRoYXQgZW5jYXBzdWxhdGVzCi0JCSAqIHRoZSBnaXZlbiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4uCi0JCSAqCi0JCSAqIEBwYXJhbSBjb250cm9sQWxpZ25lciBUaGUgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHRvIGJlCi0JCSAqIGVuY2Fwc3VsYXRlZCBieSB0aGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIENvbnRyb2xBbGlnbmVyV3JhcHBlcihDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29udHJvbEFsaWduZXIgPSBjb250cm9sQWxpZ25lcjsKLQkJCXRoaXMuY2FjaGVkU2l6ZSAgICAgPSBuZXcgUG9pbnQoY29udHJvbEFsaWduZXIubWF4aW11bVdpZHRoLCAwKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQljb250cm9sQWxpZ25lci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgUG9pbnQgY2FjaGVkU2l6ZSgpIHsKLQkJCWNhY2hlZFNpemUueCA9IGNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aDsKLQkJCXJldHVybiBjYWNoZWRTaXplOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFBvaW50IGNhbGN1bGF0ZVNpemUoKSB7Ci0KLQkJCVBvaW50IHNpemUgPSBuZXcgUG9pbnQoY29udHJvbEFsaWduZXIuY2FsY3VsYXRlV2lkdGgoZmFsc2UpLCAwKTsKLQotCQkJaWYgKHNpemUueCAhPSBTV1QuREVGQVVMVCkgewotCQkJCWNhY2hlZFNpemUueCA9IHNpemUueDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNhY2hlZFNpemUueCA9IDA7Ci0JCQl9Ci0KLQkJCWlmIChzaXplLnkgIT0gU1dULkRFRkFVTFQpIHsKLQkJCQljYWNoZWRTaXplLnkgPSBzaXplLnk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYWNoZWRTaXplLnkgPSAwOwotCQkJfQotCi0JCQlyZXR1cm4gc2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGxvY2tlZCgpIHsKLQkJCXJldHVybiBjb250cm9sQWxpZ25lci5sb2NrZWQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJY29udHJvbEFsaWduZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2l6ZShQb2ludCBzaXplKSB7Ci0KLQkJCWlmIChzaXplID09IERFRkFVTFRfU0laRSkgewotCQkJCWNvbnRyb2xBbGlnbmVyLm1heGltdW1XaWR0aCA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250cm9sQWxpZ25lci5tYXhpbXVtV2lkdGggIT0gc2l6ZS54KSB7Ci0JCQkJY29udHJvbEFsaWduZXIubWF4aW11bVdpZHRoID0gc2l6ZS54OwotCQkJCWNvbnRyb2xBbGlnbmVyLnVwZGF0ZVdyYXBwZXJTaXplKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBzb3VyY2UoKSB7Ci0JCQlyZXR1cm4gY29udHJvbEFsaWduZXI7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQotCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJc2IuYXBwZW5kKCJDYWNoZWQgc2l6ZT0iKTsKLQkJCXNiLmFwcGVuZChjYWNoZWRTaXplKTsKLQkJCXNiLmFwcGVuZCgiLCBDb250cm9sQWxpZ25lcj0iKTsKLQkJCXNiLmFwcGVuZChjb250cm9sQWxpZ25lcik7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+IGVuY2Fwc3VsYXRlcyBhIHtAbGluayBDb250cm9sfS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRyb2xXcmFwcGVyIGltcGxlbWVudHMgV3JhcHBlciB7Ci0JCS8qKgotCQkgKiBUaGUgY2FjaGVkIHNpemUsIHdoaWNoIGlzIGNvbnRyb2wncyBzaXplLgotCQkgKi8KLQkJcHJpdmF0ZSBQb2ludCBjYWNoZWRTaXplOwotCi0JCS8qKgotCQkgKiBUaGUgY29udHJvbCB0byBiZSBlbmNhcHN1bGF0ZWQgYnkgdGhpcyA8Y29kZT5XcmFwcGVyPC9jb2RlPi4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgQ29udHJvbCBjb250cm9sOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPmNvbnRyb2xXcmFwcGVyPC9jb2RlPiB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgZ2l2ZW4KLQkJICogY29udHJvbC4KLQkJICoKLQkJICogQHBhcmFtIGNvbnRyb2wgVGhlIGNvbnRyb2wgdG8gYmUgZW5jYXBzdWxhdGVkIGJ5IHRoaXMgPGNvZGU+V3JhcHBlcjwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgQ29udHJvbFdyYXBwZXIoQ29udHJvbCBjb250cm9sKSB7Ci0JCQlzdXBlcigpOwotCi0JCQl0aGlzLmNvbnRyb2wgICAgPSBjb250cm9sOwotCQkJdGhpcy5jYWNoZWRTaXplID0gbmV3IFBvaW50KDAsIDApOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQkJZm9yIChpbnQgZXZlbnRUeXBlIDogRVZFTlRfVFlQRVMpIHsKLQkJCQljb250cm9sLmFkZExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFBvaW50IGNhY2hlZFNpemUoKSB7Ci0JCQlyZXR1cm4gY2FjaGVkU2l6ZTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBQb2ludCBjYWxjdWxhdGVTaXplKCkgewotCi0JCQljYWNoZWRTaXplID0gY29udHJvbC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCi0JCQkvLyBVcGRhdGUgcmlnaHQgYXdheSB0aGUgY29udHJvbCdzIEdyaWREYXRhCi0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgY29udHJvbC5nZXRMYXlvdXREYXRhKCk7Ci0KLQkJCWlmIChncmlkRGF0YSA9PSBudWxsKSB7Ci0JCQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQl9Ci0KLQkJCWdyaWREYXRhLndpZHRoSGludCAgPSBjYWNoZWRTaXplLng7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gY2FjaGVkU2l6ZS55OwotCi0JCQkvLyBNYWtlIHN1cmUgdGhlIHNpemUgaXMgbm90IC0xCi0JCQlpZiAoY2FjaGVkU2l6ZS54ID09IFNXVC5ERUZBVUxUKSB7Ci0JCQkJY2FjaGVkU2l6ZS54ID0gMDsKLQkJCX0KLQotCQkJaWYgKGNhY2hlZFNpemUueSA9PSBTV1QuREVGQVVMVCkgewotCQkJCWNhY2hlZFNpemUueSA9IDA7Ci0JCQl9Ci0KLQkJCXJldHVybiBjYWNoZWRTaXplOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gbG9ja2VkKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQotCQkJZm9yIChpbnQgZXZlbnRUeXBlIDogRVZFTlRfVFlQRVMpIHsKLQkJCQljb250cm9sLnJlbW92ZUxpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0U2l6ZShQb2ludCBzaXplKSB7Ci0KLQkJCWlmIChjb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJLy8gVXBkYXRlIHRoZSBHcmlkRGF0YSB3aXRoIHRoZSBuZXcgc2l6ZQotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAoR3JpZERhdGEpIGNvbnRyb2wuZ2V0TGF5b3V0RGF0YSgpOwotCi0JCQlpZiAoZ3JpZERhdGEgPT0gbnVsbCkgewotCQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJCQljb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJfQotCi0JCQlncmlkRGF0YS53aWR0aEhpbnQgID0gc2l6ZS54OwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IHNpemUueTsKLQotCQkJLy8gRm9yY2UgdGhlIGNvbnRyb2wgdG8gYmUgcmVzaXplZCwgYW5kIHRlbGwgaXRzIHBhcmVudCB0byBsYXlvdXQKLQkJCS8vIGl0cyB3aWRnZXRzCi0JCQlpZiAoc2l6ZS54ID4gMCkgewotLy8JCQkJbG9ja2VkID0gdHJ1ZTsKLS8vCQkJCXRyeSAgewotLy8vLwkJCQkJY29udHJvbC5nZXRQYXJlbnQoKS5sYXlvdXQobmV3IENvbnRyb2xbXSB7IGNvbnRyb2wgfSk7Ci0vLwkJCQkJY29udHJvbC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0vLwkJCQl9Ci0vLwkJCQlmaW5hbGx5IHsKLS8vCQkJCQlsb2NrZWQgPSBmYWxzZTsKLS8vCQkJCX0KLQkJCQlSZWN0YW5nbGUgYm91bmRzID0gY29udHJvbC5nZXRCb3VuZHMoKTsKLQotCQkJCS8vIE9ubHkgdXBkYXRlIHRoZSBjb250cm9sJ3Mgd2lkdGggaWYgaXQncwotCQkJCS8vIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHNpemUKLQkJCQlpZiAoYm91bmRzLndpZHRoICE9IHNpemUueCkgewotCQkJCQlsb2NrZWQgPSB0cnVlOwotCi0JCQkJCXRyeSB7Ci0vLwkJCQkJCWNvbnRyb2wuc2V0Qm91bmRzKGJvdW5kcy54LCBib3VuZHMueSwgc2l6ZS54LCBzaXplLnkpOwotCQkJCQkJY29udHJvbC5nZXRQYXJlbnQoKS5sYXlvdXQodHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseQotCQkJCQl7Ci0JCQkJCQlsb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICovCi0JCXB1YmxpYyBDb250cm9sIHNvdXJjZSgpIHsKLQkJCXJldHVybiBjb250cm9sOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0KLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgiQ2FjaGVkIHNpemU9Iik7Ci0JCQlzYi5hcHBlbmQoY2FjaGVkU2l6ZSk7Ci0JCQlzYi5hcHBlbmQoIiwgQ29udHJvbD0iKTsKLQkJCXNiLmFwcGVuZChjb250cm9sKTsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBsaXN0ZW5lciBhZGRlZCB0byBlYWNoIG9mIHRoZSBjb250cm9sIHRoYXQgaXMgbm90aWZpZWQgaW4gb3JkZXIgdG8KLQkgKiByZXZhbGlkYXRlIHRoZSBwcmVmZXJyZWQgc2l6ZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIExpc3RlbmVySGFuZGxlciBpbXBsZW1lbnRzIExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCUNvbnRyb2xBbGlnbmVyLnRoaXMucmV2YWxpZGF0ZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+IGhlbHBzIHRvIGVuY2Fwc3VsYXRlIGhldGVyb2dlbmVvdXMgb2JqZWN0cyBhbmQKLQkgKiBhcHBseSB0aGUgc2FtZSBiZWhhdmlvciBvbiB0aGVtLgotCSAqLwotCXByaXZhdGUgaW50ZXJmYWNlIFdyYXBwZXIgewotCSAgIC8qKgotCQkgKiBBZGRzIHRoZSBnaXZlbiA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gd3JhcHBlZCBvYmplY3QgaW4gb3JkZXIgdG8KLQkJICogcmVjZWl2ZSBub3RpZmljYXRpb24gd2hlbiBpdHMgcHJvcGVydHkgY2hhbmdlZC4KLQkJICoKLQkJICogQHBhcmFtIGxpc3RlbmVyIFRoZSA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gYmUgYWRkZWQKLQkJICovCi0JCXZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBjYWNoZWQgc2l6ZSBvZiB0aGUgZW5jYXBzdWxhdGVkIHNvdXJjZS4KLQkJICoKLQkJICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiA8Y29kZT5Qb2ludDwvY29kZT4gd2hlcmUgdGhlIHggaXMgdGhlCi0JCSAqIHdpZHRoIGFuZCB0aGUgeSBpcyB0aGUgaGVpZ2h0IG9mIHRoZSB3aWRnZXQKLQkJICovCi0JCVBvaW50IGNhY2hlZFNpemUoKTsKLQotCQkvKioKLQkJICogQ2FsY3VsYXRlcyB0aGUgcHJlZmVycmVkIHNpemUgdGhlIHdyYXBwZWQgb2JqZWN0IHdvdWxkIHRha2UgYnkgaXRzZWxmLgotCQkgKgotCQkgKiBAcmV0dXJuIFRoZSBjYWxjdWxhdGVkIHNpemUKLQkJICovCi0JCVBvaW50IGNhbGN1bGF0ZVNpemUoKTsKLQotCQkvKioKLQkJICogUHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIHdoZW4gcmVjYWxjdWxhdGluZyB0aGUgcHJlZmVycmVkIHdpZHRoLgotCQkgKiBUaGlzIGhhcHBlbnMgaW4gYW4gaGllcmFyY2h5IG9mIDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPnMuCi0JCSAqCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gdG8gcHJldmVudCB0aGlzIDxjb2RlPldyYXBwZXI8L2NvZGU+IGZyb20KLQkJICogYmVpbmcgaW52YWxpZGF0ZWQ7IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4KLQkJICovCi0JCWJvb2xlYW4gbG9ja2VkKCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZXMgdGhlIGdpdmVuIDxjb2RlPkxpc3RlbmVyPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIGxpc3RlbmVyIFRoZSA8Y29kZT5MaXN0ZW5lcjwvY29kZT4gdG8gYmUgcmVtb3ZlZAotCQkgKi8KLQkJdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkJLyoqCi0JCSAqIFNldHMgdGhlIHNpemUgb24gdGhlIGVuY2Fwc3VsYXRlZCBzb3VyY2UuCi0JCSAqCi0JCSAqIEBwYXJhbSBzaXplIFRoZSBuZXcgc2l6ZQotCQkgKi8KLQkJdm9pZCBzZXRTaXplKFBvaW50IHNpemUpOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBlbmNhcHN1bGF0ZWQgb2JqZWN0LgotCQkgKgotCQkgKiBAcmV0dXJuIFRoZSBvYmplY3QgdGhhdCBpcyBiZWVuIHdyYXBwZWQKLQkJICovCi0JCU9iamVjdCBzb3VyY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0NvbnRyb2xTd2l0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWQ2NDcxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhpcyBjb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIHRvIHN3aXRjaCB0aGUgYWN0aXZlIHBhZ2UgYmFzZWQgb24gYSB2YWx1ZS4gQQotICogPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+IGlzIHVzZWQgdG8gdHJhbnNmb3JtZWQgdGhhdCB2YWx1ZSBpbnRvIGEKLSAqIDxjb2RlPkNvbnRyb2w8L2NvZGU+LgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbFN3aXRjaGVyCi17Ci0JLyoqCi0JICogVGhlIHdpZGdldCB0aGF0IGlzIHVzZWQgdG8gc2hvdyB0aGUgYWN0aXZlIDxjb2RlPkNvbnRyb2w8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgUGFnZUJvb2sgcGFnZUJvb2s7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+IHVzZWQgdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZSBpbnRvIGEKLQkgKiA8Y29kZT5Db250cm9sPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIFRyYW5zZm9ybWVyPD8sIENvbnRyb2w+IGNvbnRyb2xUcmFuc2Zvcm1lcjsKLQotCXByaXZhdGUgTGFiZWwgZW1wdHlMYWJlbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29udHJvbFN3aXRjaGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzd2l0Y2hIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmV0cmlldmUKLQkgKiB0aGUgcmlnaHQgPGNvZGU+Q29udHJvbDwvY29kZT4gd2hlbiBwYXNzZWQgdG8gdGhlIGdpdmVuIHRyYW5zZm9ybWVyCi0JICogQHBhcmFtIGNvbnRyb2xUcmFuc2Zvcm1lciBUaGUgPGNvZGU+VHJhbnNmb3JtZXI8L2NvZGU+IHVzZWQgdG8gdHJhbnNmb3JtIHRoZSB2YWx1ZSBpbnRvIGEKLQkgKiA8Y29kZT5Db250cm9sPC9jb2RlPgotCSAqIEBwYXJhbSBwYWdlQm9vayBUaGUgPGNvZGU+UGFnZUJvb2s8L2NvZGU+IHVzZWQgZm9yIHN3aXRjaGluZyB0aGUgPGNvZGU+Q29udHJvbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgPFQ+IENvbnRyb2xTd2l0Y2hlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN3aXRjaEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lcjxULCBDb250cm9sPiBjb250cm9sVHJhbnNmb3JtZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUJvb2sgcGFnZUJvb2spCi0JewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKHN3aXRjaEhvbGRlciwgY29udHJvbFRyYW5zZm9ybWVyLCBwYWdlQm9vayk7Ci0JfQotCi0JcHVibGljIDxUPiBDb250cm9sU3dpdGNoZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzd2l0Y2hIb2xkZXIsCi0JCQkJCQkJCUNvbnRyb2wgY29udHJvbCwKLQkJCQkJCQkJUGFnZUJvb2sgcGFnZUJvb2spCi0JewotCQl0aGlzKHN3aXRjaEhvbGRlciwgYnVpbGROdWxsQ29udHJvbFRyYW5zZm9ybWVyKGNvbnRyb2wpLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPFQ+IFRyYW5zZm9ybWVyPFQsIENvbnRyb2w+IGJ1aWxkTnVsbENvbnRyb2xUcmFuc2Zvcm1lcihmaW5hbCBDb250cm9sIGNvbnRyb2wpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxULCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShUIG1vZGVsKSB7Ci0JCQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBjb250cm9sOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFByb3BlcnR5VmFsdWVNb2RlbDw/PiBzd2l0Y2hIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXI8PywgQ29udHJvbD4gY29udHJvbFRyYW5zZm9ybWVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VCb29rIHBhZ2VCb29rKQotCXsKLQkJdGhpcy5wYWdlQm9vayAgICAgICAgPSBwYWdlQm9vazsKLQkJdGhpcy5jb250cm9sVHJhbnNmb3JtZXIgPSBjb250cm9sVHJhbnNmb3JtZXI7Ci0KLQkJdGhpcy5lbXB0eUxhYmVsID0gdGhpcy5idWlsZEVtcHR5TGFiZWwoKTsKLQotCQlzd2l0Y2hIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCi0JCSk7Ci0KLQkJc3dpdGNoUGFnZXMoc3dpdGNoSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8vQnVpbGQgYW4gZW1wdHkgbGFiZWwgdG8gZGlzcGxheSBpbiB0aGUgcGFnZSBib29rIHdoZW4gdGhlIGNvbnRyb2xUcmFuc2Zvcm1lciByZXR1cm5zIG51bGwuCi0JLy9TV1QuU0hBRE9XX05PTkUgbWFrZXMgdGhlIGxpbmUgc2VwYXJhdG9yIG5vdCB2aXNpYmxlCi0JLy9UaGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBjb21lIHVwIHdpdGggZm9yIGFuIGVtcHR5IHBhZ2UKLQlwcml2YXRlIExhYmVsIGJ1aWxkRW1wdHlMYWJlbCgpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbCh0aGlzLnBhZ2VCb29rLCBTV1QuU0VQQVJBVE9SIHwgU1dULlNIQURPV19OT05FIHwgU1dULkhPUklaT05UQUwpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoCi0JCQlidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCXN3aXRjaFBhZ2VzKGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoZXMgdGhlIGFjdGl2ZSBwYWdlIGJ5IHRyYW5zZm9ybWluZyB0aGUgZ2l2ZW4gdmFsdWUgaW50byBpdHMKLQkgKiBjb3JyZXNwb25kaW5nIGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHN0YXRlIHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtZXIgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlCi0JICogbmV3IGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3dpdGNoUGFnZXMoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh0aGlzLnBhZ2VCb29rLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gUmV0cmlldmUgdGhlIENvbnRyb2wgZm9yIHRoZSBuZXcgdmFsdWUKLQkJQ29udHJvbCBwYWdlID0gdHJhbnNmb3JtKHZhbHVlKTsKLQotCQlpZiAocGFnZSA9PSBudWxsKSB7Ci0JCQkvL05vdGU6IFdlIGNhbid0IHBhc3MgaW4gbnVsbCBkdWUgdG8gYSBidWcgaW4gUGFnZUJvb2sKLQkJCXBhZ2UgPSB0aGlzLmVtcHR5TGFiZWw7Ci0JCX0KLQkJdGhpcy5wYWdlQm9vay5zaG93UGFnZShwYWdlKTsKLQotCQkvLyBSZXZhbGlkYXRlIHRoZSBwYXJlbnRzIGluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgbGF5b3V0Ci0JCVNXVFV0aWwucmVmbG93KHRoaXMucGFnZUJvb2spOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgQ29udHJvbCB0cmFuc2Zvcm0oT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAoKFRyYW5zZm9ybWVyPE9iamVjdCwgQ29udHJvbD4pIHRoaXMuY29udHJvbFRyYW5zZm9ybWVyKS50cmFuc2Zvcm0odmFsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvbi5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkNmQyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZEJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci0KLS8qKgotICogQSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkxhYmVsZWRDb250cm9sPC9jb2RlPiB0aGF0IHVwZGF0ZXMgYQotICogPGNvZGU+QnV0dG9uPC9jb2RlPiB3aGVuIHJlcXVpcmVkLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQnV0dG9uIGltcGxlbWVudHMgTGFiZWxlZENvbnRyb2wKLXsKLQkvKioKLQkgKiBUaGUgYnV0dG9uIHRvIGJlIHVwZGF0ZWQgd2l0aCBhIGRpZmZlcmVudCBpY29uIGFuZCB0ZXh0LgotCSAqLwotCXByaXZhdGUgZmluYWwgQnV0dG9uIGJ1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGFiZWxlZEJ1dHRvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYnV0dG9uIFRoZSBidXR0b24gdGhhdCB3aWxsIGhhdmUgaXRzIHRleHQgYW5kIGljb24gdXBkYXRlZCB3aGVuCi0JICogcmVxdWlyZWQKLQkgKiBAZXhjZXB0aW9uIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBJZiB0aGUgZ2l2ZW4gPGNvZGU+QnV0dG9uPC9jb2RlPiBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIExhYmVsZWRCdXR0b24oQnV0dG9uIGJ1dHRvbikgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwoYnV0dG9uLCAiVGhlIGJ1dHRvbiBjYW5ub3QgYmUgbnVsbCIpOwotCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlpZiAoIXRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5idXR0b24uc2V0SW1hZ2UoaW1hZ2UpOwotCQkJdGhpcy5idXR0b24uZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5idXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJCXRoaXMuYnV0dG9uLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWYwZGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczogT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPkxhYmVsZWRDb250cm9sPC9jb2RlPiBpcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIGEgd2lkZ2V0IGFuZCB1cGRhdGUKLSAqIGl0cyBwcm9wZXJ0aWVzIChpY29uIGFuZCB0ZXh0KS4KLSAqCi0gKiBAc2VlIExhYmVsZWRCdXR0b24KLSAqIEBzZWUgTGFiZWxlZExhYmVsCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGFiZWxlZENvbnRyb2wgewotCS8qKgotCSAqIFBhc3NlcyB0aGUgaW1hZ2Ugc28gdGhlIHdyYXBwZWQgY29tcG9uZW50IGNhbiByZWNlaXZlIGl0LgotCSAqCi0JICogQHBhcmFtIGltYWdlIFRoZSBuZXcgPGNvZGU+SW1hZ2U8L2NvZGU+Ci0JICovCi0Jdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSk7Ci0KLQkvKioKLQkgKiBQYXNzZXMgdGhlIHRleHQgc28gdGhlIHdyYXBwZWQgY29tcG9uZW50IGNhbiByZWNlaXZlIGl0LgotCSAqCi0JICogQHBhcmFtIHRleHQgVGhlIG5ldyB0ZXh0Ci0JICovCi0Jdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlOTgxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZENvbnRyb2xVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIFRoaXMgdXBkYXRlciBpcyByZXNwb25zaWJsZSB0byB1cGRhdGUgdGhlIDxjb2RlPkxhYmVsZWRDb250cm9sPC9jb2RlPiB3aGVuCi0gKiB0aGUgdGV4dCBhbmQgdGhlIGljb24gbmVlZCB0byBjaGFuZ2UuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRDb250cm9sVXBkYXRlciB7Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlciBhcm91bmQgYSBjb250cm9sIHRoYXQgaGFzIHRleHQgYW5kIGljb24uCi0JICovCi0JcHJpdmF0ZSBMYWJlbGVkQ29udHJvbCBsYWJlbGVkQ29udHJvbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TGFiZWxlZENvbnRyb2xVcGRhdGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBsYWJlbGVkQ29udHJvbCBUaGUgd3JhcHBlciBhcm91bmQgdGhlIGNvbnRyb2wgdGhhdCBuZWVkcyB0bwotCSAqIGhhdmUgaXRzIHRleHQgdXBkYXRlZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgdGhpcyBjbGFzcyB3aWxsIGxpc3RlbiBmb3IgY2hhbmdlcwotCSAqLwotCXB1YmxpYyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoTGFiZWxlZENvbnRyb2wgbGFiZWxlZENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKQotCXsKLQkJdGhpcyhsYWJlbGVkQ29udHJvbCwgdGV4dEhvbGRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5MYWJlbGVkQ29udHJvbFVwZGF0ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxhYmVsZWRDb250cm9sIFRoZSB3cmFwcGVyIGFyb3VuZCB0aGUgY29udHJvbCB0aGF0IG5lZWRzIHRvCi0JICogaGF2ZSBpdHMgaW1hZ2UgYW5kIHRleHQgdXBkYXRlZAotCSAqIEBwYXJhbSBpbWFnZUhvbGRlciBUaGUgaG9sZGVyIHRoaXMgY2xhc3Mgd2lsbCBsaXN0ZW4gZm9yIGNoYW5nZXMgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgdGV4dCBuZXZlciBjaGFuZ2VzCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciB0aGlzIGNsYXNzIHdpbGwgbGlzdGVuIGZvciBjaGFuZ2VzIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGltYWdlIG5ldmVyIGNoYW5nZXMKLQkgKi8KLQlwdWJsaWMgTGFiZWxlZENvbnRyb2xVcGRhdGVyKExhYmVsZWRDb250cm9sIGxhYmVsZWRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VIb2xkZXIpCi0JewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKGxhYmVsZWRDb250cm9sLCB0ZXh0SG9sZGVyLCBpbWFnZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSWNvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkSWNvbkxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJY29uTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGFiZWxlZENvbnRyb2xVcGRhdGVyLnRoaXMuc2V0SW1hZ2UoKEltYWdlKSBlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJMYWJlbGVkQ29udHJvbFVwZGF0ZXIuaW1hZ2VMaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVGV4dExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkVGV4dExpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0TGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGFiZWxlZENvbnRyb2xVcGRhdGVyLnRoaXMuc2V0VGV4dCgoU3RyaW5nKSBlLmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJMYWJlbGVkQ29udHJvbFVwZGF0ZXIudGV4dExpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShMYWJlbGVkQ29udHJvbCBsYWJlbGVkQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VIb2xkZXIpCi0JewotCQlBc3NlcnQuaXNOb3ROdWxsKGxhYmVsZWRDb250cm9sLCAiVGhlIExhYmVsZWRDb250cm9sIGNhbm5vdCBiZSBudWxsIik7Ci0KLQkJdGhpcy5sYWJlbGVkQ29udHJvbCA9IGxhYmVsZWRDb250cm9sOwotCi0JCWlmICh0ZXh0SG9sZGVyICE9IG51bGwpIHsKLQkJCXRleHRIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1aWxkVGV4dExpc3RlbmVyKCkpOwotCQkJc2V0VGV4dCh0ZXh0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl9Ci0KLQkJaWYgKGltYWdlSG9sZGVyICE9IG51bGwpIHsKLQkJCWltYWdlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWlsZEljb25MaXN0ZW5lcigpKTsKLQkJCXNldEltYWdlKGltYWdlSG9sZGVyLmdldFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEltYWdlKEltYWdlIGljb24pIHsKLQkJbGFiZWxlZENvbnRyb2wuc2V0SW1hZ2UoaWNvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQotCQlpZiAodGV4dCA9PSBudWxsKSB7Ci0JCQl0ZXh0ID0gIiI7Ci0JCX0KLQotCQlsYWJlbGVkQ29udHJvbC5zZXRUZXh0KHRleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGVmMDYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL0xhYmVsZWRMYWJlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiAgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+TGFiZWxlZENvbnRyb2w8L2NvZGU+IHRoYXQgdXBkYXRlcyBhbgotICogPGNvZGU+TGFiZWw8L2NvZGU+IHdoZW4gcmVxdWlyZWQuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIExhYmVsZWRMYWJlbCBpbXBsZW1lbnRzIExhYmVsZWRDb250cm9sCi17Ci0JLyoqCi0JICogVGhlIGxhYmVsIHRvIGJlIHVwZGF0ZWQgd2l0aCBhIGRpZmZlcmVudCBpY29uIGFuZCB0ZXh0LgotCSAqLwotCXByaXZhdGUgZmluYWwgTGFiZWwgbGFiZWw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxhYmVsZWRCdXR0b248L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB0aGF0IHdpbGwgaGF2ZSBpdHMgdGV4dCBhbmQgaWNvbiB1cGRhdGVkIHdoZW4KLQkgKiByZXF1aXJlZAotCSAqIEBleGNlcHRpb24gQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIElmIHRoZSBnaXZlbiA8Y29kZT5MYWJlbDwvY29kZT4gaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBMYWJlbGVkTGFiZWwoTGFiZWwgbGFiZWwpIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGxhYmVsLCAiVGhlIGxhYmVsIGNhbm5vdCBiZSBudWxsIik7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlpZiAoIXRoaXMubGFiZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxhYmVsLnNldEltYWdlKGltYWdlKTsKLQkJCXRoaXMubGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoIXRoaXMubGFiZWwuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQl0aGlzLmxhYmVsLmdldFBhcmVudCgpLmxheW91dCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTVjNzIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1BhbmVFbmFibGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgPGNvZGU+UGFuZUVuYWJsZXI8L2NvZGU+IGtlZXBzIHRoZSAiZW5hYmxlZCIgc3RhdGUgb2YgYSBjb2xsZWN0aW9uIG9mCi0gKiBjb250cm9scyBpbiBzeW5jaCB3aXRoIHRoZSBwcm92aWRlZCBib29sZWFuIGhvbGRlci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBhbmVFbmFibGVyIGV4dGVuZHMgU3RhdGVDb250cm9sbGVyCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gKGkuZS4gZGlzYWJsZWQpLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgd2hvc2UgImVuYWJsZWQiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZQotCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4gcGFuZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgUGFuZTw/Pi4uLiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24ocGFuZXMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlCi0JICogYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4gcGFuZSwKLQkgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihwYW5lKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgUGFuZTw/PltdIHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKHBhbmVzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKcGFDb250cm9sbGVyRW5hYmxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUKLQkgKiBvZiogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIGRpc2FibGVkKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBUaGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAiZW5hYmxlZCIgc3RhdGUgaXMga2VwdCBpbiBzeW5jCi0JICogd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSnBhQ29udHJvbGxlckVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJlbmFibGVkIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lRW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcy5pdGVyYXRvcigpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpwYUNvbnRyb2xsZXJFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBkaXNhYmxlZCkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlCi0JICogaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZXMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKcGFDb250cm9sbGVyRW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgImVuYWJsZWQiIHN0YXRlCi0JICogaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMsCi0JICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJc3VwZXIoYm9vbGVhbkhvbGRlciwgd3JhcChwYW5lcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiB3cmFwKEl0ZXJhdG9yPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24obmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGFuZTw/PiwgQ29udHJvbEhvbGRlcj4ocGFuZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnRyb2xIb2xkZXIgdHJhbnNmb3JtKFBhbmU8Pz4gcGFuZSkgewotCQkJCXJldHVybiBuZXcgUGFuZUhvbGRlcihwYW5lKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBob2xkZXIgaG9sZHMgb250byBhbiA8Y29kZT5QYW5lPC9jb2RlPiBhbmQgdXBkYXRlIGl0cyBlbmFibGVkCi0JICogc3RhdGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFuZUhvbGRlciBpbXBsZW1lbnRzIENvbnRyb2xIb2xkZXIgewotCQlwcml2YXRlIGZpbmFsIFBhbmU8Pz4gcGFuZTsKLQotCQlQYW5lSG9sZGVyKFBhbmU8Pz4gcGFuZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucGFuZSA9IHBhbmU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCQlpZiAoIXRoaXMucGFuZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJdGhpcy5wYW5lLmVuYWJsZVdpZGdldHMoc3RhdGUpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MTgzOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvUGFuZVZpc2liaWxpdHlFbmFibGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4ga2VlcHMgdGhlICJ2aXNpYmxlIiBzdGF0ZSBvZiBhCi0gKiBjb2xsZWN0aW9uIG9mIGNvbnRyb2xzIGluIHN5bmNoIHdpdGggdGhlIHByb3ZpZGVkIGJvb2xlYW4gaG9sZGVyLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUGFuZVZpc2liaWxpdHlFbmFibGVyIGV4dGVuZHMgU3RhdGVDb250cm9sbGVyCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIG5vdCB2aXNpYmxlKS4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUKLQkgKiBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4gcGFuZSkgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgcGFuZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/Pi4uLiBwYW5lcykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24ocGFuZXMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZQotCSAqIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmU8Pz4gcGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3IocGFuZSksIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmVWaXNpYmlsaXR5RW5hYmxlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFBhbmVWaXNpYmlsaXR5RW5hYmxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhbmU8Pz5bXSBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IocGFuZXMpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgVGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjw/IGV4dGVuZHMgUGFuZTw/Pj4gcGFuZXMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIHBhbmVzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lVmlzaWJpbGl0eUVuYWJsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIHBhbmVzIFRoZSBjb2xsZWN0aW9uIG9mIHBhbmVzIHdob3NlICJ2aXNpYmxlIiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMKLQkgKiB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBQYW5lPD8+PiBwYW5lcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcy5pdGVyYXRvcigpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiAoaS5lLiBub3QgdmlzaWJsZSkuCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gcGFuZXMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YgcGFuZXMgd2hvc2UgInZpc2libGUiIHN0YXRlCi0JICogaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBwYW5lcywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZVZpc2liaWxpdHlFbmFibGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBwYW5lcyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZiBwYW5lcyB3aG9zZSAidmlzaWJsZSIgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgUGFuZVZpc2liaWxpdHlFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQlzdXBlcihib29sZWFuSG9sZGVyLCB3cmFwKHBhbmVzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IHdyYXAoSXRlcmF0b3I8PyBleHRlbmRzIFBhbmU8Pz4+IHBhbmVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxQYW5lPD8+LCBDb250cm9sSG9sZGVyPihwYW5lcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbEhvbGRlciB0cmFuc2Zvcm0oUGFuZTw/PiBwYW5lKSB7Ci0JCQkJcmV0dXJuIG5ldyBQYW5lSG9sZGVyKHBhbmUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGhvbGRlciBob2xkcyBvbnRvIGFuIDxjb2RlPlBhbmU8L2NvZGU+IGFuZCB1cGRhdGUgaXRzIHZpc2libGUKLQkgKiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYW5lSG9sZGVyIGltcGxlbWVudHMgQ29udHJvbEhvbGRlciB7Ci0JCXByaXZhdGUgZmluYWwgUGFuZTw/PiBwYW5lOwotCi0JCVBhbmVIb2xkZXIoUGFuZTw/PiBwYW5lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYW5lID0gcGFuZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpIHsKLQkJCXRoaXMucGFuZS5zZXRWaXNpYmxlKHN0YXRlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTIwNjM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9TV1RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotCi0vKioKLSAqIEEgc3VpdGUgb2YgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIHVzZXIgaW50ZXJmYWNlLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0KLQkvKioKLQkgKiBDYXVzZXMgdGhlIDxjb2RlPnJ1bigpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGdpdmVuIHJ1bm5hYmxlIHRvIGJlIGludm9rZWQKLQkgKiBieSB0aGUgdXNlci1pbnRlcmZhY2UgdGhyZWFkIGF0IHRoZSBuZXh0IHJlYXNvbmFibGUgb3Bwb3J0dW5pdHkuIFRoZSBjYWxsZXIKLQkgKiBvZiB0aGlzIG1ldGhvZCBjb250aW51ZXMgdG8gcnVuIGluIHBhcmFsbGVsLCBhbmQgaXMgbm90IG5vdGlmaWVkIHdoZW4gdGhlCi0JICogcnVubmFibGUgaGFzIGNvbXBsZXRlZC4KLQkgKgotCSAqIEBwYXJhbSBydW5uYWJsZSBDb2RlIHRvIHJ1biBvbiB0aGUgdXNlci1pbnRlcmZhY2UgdGhyZWFkCi0JICogQGV4Y2VwdGlvbiBvcmcuZWNsaXBzZS5zd3QuU1dURXhjZXB0aW9uCi0JICogPHVsPgotCSAqIDxsaT5FUlJPUl9ERVZJQ0VfRElTUE9TRUQgLSBpZiB0aGUgcmVjZWl2ZXIgaGFzIGJlZW4gZGlzcG9zZWQ8L2xpPgotCSAqIDwvdWw+Ci0JICogQHNlZSAjc3luY0V4ZWMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXN5bmNFeGVjKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCWdldFN0YW5kYXJkRGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogVHdlYWtzIHRoZSBnaXZlbiA8Y29kZT5Db21ibzwvY29kZT4gdG8gcmVtb3ZlIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlCi0JICogd2lkZ2V0IHJlY2VpdmVzIHRoZSBmb2N1cyBhbmQgdG8gc2hvdyB0aGUgZGVmYXVsdCB3aGVuIHRoZSB3aWRnZXQgbG9zZXMKLQkgKiB0aGUgZm9jdXMuCi0JICoKLQkgKiBAcGFyYW0gY29tYm8gVGhlIHdpZGdldCBoYXZpbmcgYSBkZWZhdWx0IHZhbHVlIHRoYXQgaXMgYWx3YXlzIGF0IHRoZQotCSAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBhdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKENvbWJvIGNvbWJvKSB7Ci0JCUNvbWJvSGFuZGxlciBoYW5kbGVyID0gbmV3IENvbWJvSGFuZGxlcigpOwotCQljb21iby5hZGRGb2N1c0xpc3RlbmVyKGhhbmRsZXIpOwotCQljb21iby5hZGRNb2RpZnlMaXN0ZW5lcihoYW5kbGVyKTsKLQl9Ci0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBzaGVsbC4gSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzCi0JICogbm90IHRoZSBVSSB0aHJlYWQsIHRoZW4gYW4gaW52YWxpZCB0aHJlYWQgYWNjZXNzIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHNoZWxsLCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIGFjdGl2ZSBzaGVsbCwgd2hpY2ggY2FuIGJlIHRoZSBzaGVsbCBmcm9tIGFueSB3aW5kb3cKLQkJU2hlbGwgc2hlbGwgPSBnZXRTdGFuZGFyZERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCi0JCS8vIE5vIHNoZWxsIGNvdWxkIGJlIGZvdW5kLCByZXZlcnQgYmFjayB0byB0aGUgYWN0aXZlIHdvcmtiZW5jaCB3aW5kb3cKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJfQotCi0JCS8vIE1ha2Ugc3VyZSBpdCdzIG5ldmVyIG51bGwKLQkJaWYgKHNoZWxsID09IG51bGwpIHsKLQkJCXNoZWxsID0gbmV3IFNoZWxsKGdldFN0YW5kYXJkRGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YW5kYXJkIGRpc3BsYXkgdG8gYmUgdXNlZC4gVGhlIG1ldGhvZCBmaXJzdCBjaGVja3MsIGlmIHRoZQotCSAqIHRocmVhZCBjYWxsaW5nIHRoaXMgbWV0aG9kIGhhcyBhbiBhc3NvY2lhdGVkIGRpc3BsYXkuIElmIHNvLCB0aGlzIGRpc3BsYXkKLQkgKiBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCBkaXNwbGF5LgotCSAqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBkaXNwbGF5IGlmIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UgdGhlIGRlZmF1bHQKLQkgKiBkaXNwbGF5IGlzIHJldHVybmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFN0YW5kYXJkRGlzcGxheSgpCi0JewotCQlEaXNwbGF5IGRpc3BsYXkgPSBEaXNwbGF5LmdldEN1cnJlbnQoKTsKLQotCQlpZiAoZGlzcGxheSA9PSBudWxsKSB7Ci0JCQlkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCX0KLQotCQlyZXR1cm4gZGlzcGxheTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRUYWJsZUhlaWdodEhpbnQoVGFibGUgdGFibGUsIGludCByb3dzKSB7Ci0JCWlmICh0YWJsZS5nZXRGb250KCkuZXF1YWxzKEpGYWNlUmVzb3VyY2VzLmdldERlZmF1bHRGb250KCkpKQotCQkJdGFibGUuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCkpOwotCQlpbnQgcmVzdWx0PSB0YWJsZS5nZXRJdGVtSGVpZ2h0KCkgKiByb3dzICsgdGFibGUuZ2V0SGVhZGVySGVpZ2h0KCk7Ci0JCWlmICh0YWJsZS5nZXRMaW5lc1Zpc2libGUoKSkKLQkJCXJlc3VsdCs9IHRhYmxlLmdldEdyaWRMaW5lV2lkdGgoKSAqIChyb3dzIC0gMSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0gICAvKioKLQkgKiBSZXR1cm5zIHRoZSBQbGF0Zm9ybSBVSSB3b3JrYmVuY2guCi0JICoKLQkgKiBAcmV0dXJuIFRoZSB3b3JrYmVuY2ggZm9yIHRoaXMgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtiZW5jaCBnZXRXb3JrYmVuY2goKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCX0KLQotCS8qKgotCSAqIFJlbGF5cyBvdXQgdGhlIHBhcmVudHMgb2YgdGhlIDxjb2RlPkNvbnRyb2w8L2NvZGU+LiBUaGlzIHdhcyB0YWtlbiBmcm9tCi0JICogdGhlIHdpZGdldCA8Y29kZT5TZWN0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJldmFsaWRhdGUgYXMgd2VsbCBhcyBpdHMgcGFyZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZsb3coQ29tcG9zaXRlIHBhbmUpIHsKLQotCQlmb3IgKENvbXBvc2l0ZSBjb21wb3NpdGUgPSBwYW5lOyBjb21wb3NpdGUgIT0gbnVsbDsgKSB7Ci0JCQljb21wb3NpdGUuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSB8fCBjb21wb3NpdGUgaW5zdGFuY2VvZiBTaGVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJZm9yIChDb21wb3NpdGUgY29tcG9zaXRlID0gcGFuZTsgY29tcG9zaXRlICE9IG51bGw7ICkgewotCQkJY29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJCWNvbXBvc2l0ZSA9IGNvbXBvc2l0ZS5nZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbXBvc2l0ZSBpbnN0YW5jZW9mIFNjcm9sbGVkRm9ybSkgewotCQkJCSgoU2Nyb2xsZWRGb3JtKSBjb21wb3NpdGUpLnJlZmxvdyh0cnVlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWZvciAoQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IHBhbmU7IGNvbXBvc2l0ZSAhPSBudWxsOyApIHsKLQkJCWNvbXBvc2l0ZS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQljb21wb3NpdGUgPSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0KLQkJCWlmIChjb21wb3NpdGUgaW5zdGFuY2VvZiBTY3JvbGxlZEZvcm0gfHwgY29tcG9zaXRlIGluc3RhbmNlb2YgU2hlbGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQ2F1c2VzIHRoZSA8Y29kZT5ydW4oKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBnaXZlbiBydW5uYWJsZSB0byBiZSBpbnZva2VkCi0JICogYnkgdGhlIHVzZXItaW50ZXJmYWNlIHRocmVhZCBhdCB0aGUgbmV4dCByZWFzb25hYmxlIG9wcG9ydHVuaXR5LiBUaGUKLQkgKiB0aHJlYWQgd2hpY2ggY2FsbHMgdGhpcyBtZXRob2QgaXMgc3VzcGVuZGVkIHVudGlsIHRoZSBydW5uYWJsZSBjb21wbGV0ZXMuCi0JICoKLQkgKiBAcGFyYW0gcnVubmFibGUgY29kZSB0byBydW4gb24gdGhlIHVzZXItaW50ZXJmYWNlIHRocmVhZC4KLQkgKiBAc2VlICNhc3luY0V4ZWMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQkJZ2V0U3RhbmRhcmREaXNwbGF5KCkuc3luY0V4ZWMocnVubmFibGUpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0J3MgdGhlIFVJIGV2ZW50IHRocmVhZCwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVpVGhyZWFkKCkgewotCQlyZXR1cm4gZ2V0U3RhbmRhcmREaXNwbGF5KCkuZ2V0VGhyZWFkKCkgPT0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkIGJ5IHVzaW5nIHRoZQotCSAqIHRocmVhZCBmcm9tIHdoaWNoIHRoZSBnaXZlbiB2aWV3ZXIncyBkaXNwbGF5IHdhcyBpbnN0YW50aWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gdmlld2VyIFRoZSB2aWV3ZXIgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCi0JICogaXMgdGhlIFVJIGV2ZW50IHRocmVhZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQ7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1aVRocmVhZChWaWV3ZXIgdmlld2VyKSB7Ci0JCXJldHVybiB1aVRocmVhZCh2aWV3ZXIuZ2V0Q29udHJvbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyB0aGUgVUkgZXZlbnQgdGhyZWFkIGJ5IHVzaW5nIHRoZQotCSAqIHRocmVhZCBmcm9tIHdoaWNoIHRoZSBnaXZlbiB3aWRnZXQncyBkaXNwbGF5IHdhcyBpbnN0YW50aWF0ZWQuCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0IFRoZSB3aWRnZXQgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGN1cnJlbnQgdGhyZWFkCi0JICogaXMgdGhlIFVJIGV2ZW50IHRocmVhZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHRoZSBVSSBldmVudCB0aHJlYWQ7Ci0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB1aVRocmVhZChXaWRnZXQgd2lkZ2V0KSB7Ci0JCXJldHVybiB3aWRnZXQuZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpID09IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHJlbW92aW5nIHRoZSBkZWZhdWx0IHZhbHVlIHdoZW4gdGhlIGNvbWJvCi0JICogaGFzIHRoZSBmb2N1cyBvciB3aGVuIHRoZSBzZWxlY3RlZCBpdGVtIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCB0byBzZWxlY3QKLQkgKiBpdCB3aGVuIHRoZSBjb21ibyBsb3NlcyB0aGUgZm9jdXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tYm9IYW5kbGVyIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9jdXNMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JCQlDb21ibyBjb21ibyA9IChDb21ibykgZS53aWRnZXQ7Ci0KLQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpID09IDApIHsJCi0JCQkJLy8gVGhlIHRleHQgc2VsZWN0aW9uIGhhcyB0byBiZSBjaGFuZ2VkIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhpcwotCQkJCS8vIGxpc3RlbmVyIG90aGVyd2lzZSB0aGUgY29tYm8gd29uJ3QgdXBkYXRlIGJlY2F1c2UgaXQncyBjdXJyZW50bHkKLQkJCQkvLyBub3RpZnlpbmcgaXRzIGxpc3RlbmVycwotCQkJCWFzeW5jRXhlYyhuZXcgU2VsZWN0VGV4dChjb21ibykpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJLy9kbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQotCQkJQ29tYm8gY29tYm8gPSAoQ29tYm8pIGUud2lkZ2V0OwotCi0JCQlpZiAoY29tYm8uaXNGb2N1c0NvbnRyb2woKSAmJgotCQkJICAgIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gMCkgewotCi0JCQkJLy8gVGhlIHRleHQgaGFzIHRvIGJlIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGUgY29udGV4dCBvZiB0aGlzCi0JCQkJLy8gbGlzdGVuZXIgb3RoZXJ3aXNlIHRoZSBjb21ibyB3b24ndCB1cGRhdGUgYmVjYXVzZSBpdCdzIGN1cnJlbnRseQotCQkJCS8vIG5vdGlmeWluZyBpdHMgbGlzdGVuZXJzCi0JCQkJYXN5bmNFeGVjKG5ldyBNb2RpZnlUZXh0KGNvbWJvKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIE1vZGlmeVRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotCi0JCQlwdWJsaWMgTW9kaWZ5VGV4dChDb21ibyBjb21ibykgewotCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyA9IGNvbWJvOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvLmdldFRleHQoKTsKLQotCQkJCWlmICh0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCQkJdGV4dCA9IHRoaXMuY29tYm8uZ2V0SXRlbSgwKTsKLQkJCQkJdGhpcy5jb21iby5zZXRUZXh0KHRleHQpOwotCQkJCX0KLQotCQkJCXRoaXMuY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBQb2ludCgwLCB0ZXh0Lmxlbmd0aCgpKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIFNlbGVjdFRleHQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCQlwcml2YXRlIGZpbmFsIENvbWJvIGNvbWJvOwotCi0JCQlwdWJsaWMgU2VsZWN0VGV4dChDb21ibyBjb21ibykgewotCQkJCXN1cGVyKCk7Ci0JCQkJdGhpcy5jb21ibyA9IGNvbWJvOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKHRoaXMuY29tYm8uaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJU3RyaW5nIHRleHQgPSB0aGlzLmNvbWJvLmdldFRleHQoKTsKLQkJCQl0aGlzLmNvbWJvLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgdGV4dC5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9TdGF0ZUNvbnRyb2xsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9TdGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzMTNlNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWwvU3RhdGVDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IGtlZXBzIHRoZSBzdGF0ZSBvZiBhIGNvbGxlY3Rpb24gb2Ygd2lkZ2V0cyBpbgotICogc3luY2ggd2l0aCB0aGUgcHJvdmlkZWQgYm9vbGVhbiBob2xkZXIuCi0gKgotICogQHNlZSBDb250cm9sRW5hYmxlcgotICogQHNlZSBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXIKLSAqIEBzZWUgUGFuZUVuYWJsZXIKLSAqIEBzZWUgUGFuZVZpc2liaWxpdHlFbmFibGVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotYWJzdHJhY3QgY2xhc3MgU3RhdGVDb250cm9sbGVyCi17Ci0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgY29udHJvbEhvbGRlcnMgd2l0aCBjaGFuZ2VzCi0JICogbWFkZSB0byB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBib29sZWFuQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIHN0YXRlIGlzIGtlcHQgaW4gc3luYwotCSAqIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIHN0YXRlOyBmb3Igd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgPGNvZGU+ZmFsc2U8Y29kZT4uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRWYWx1ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPi4KLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlCi0JICogc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbGxlY3Rpb248Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIGNvbnRyb2xIb2xkZXJzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQotCSAqIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycywKLQkgICAgICAgICAgICAgICAgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQotCQl0aGlzKCk7Ci0JCWluaXRpYWxpemUoYm9vbGVhbkhvbGRlciwgY29udHJvbEhvbGRlcnMsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXIgVGhlIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+IHdob3NlIHN0YXRlIGlzIGtlcHQKLQkgKiBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKi8KLQlTdGF0ZUNvbnRyb2xsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICAgICAgICAgIENvbnRyb2xIb2xkZXIgY29udHJvbEhvbGRlcikgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgY29udHJvbEhvbGRlciwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2UKLQkgKiBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlci4uLiBjb250cm9sSG9sZGVycykgewotCi0JCXRoaXMoYm9vbGVhbkhvbGRlciwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29udHJvbEhvbGRlcnMpLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggYSBkZWZhdWx0IHZhbHVlIG9mCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXIgVGhlIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+IHdob3NlIHN0YXRlIGlzIGtlcHQKLQkgKiBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4gaG9sZGVyJ3MgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICBDb250cm9sSG9sZGVyIGNvbnRyb2xIb2xkZXIsCi0JICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcyhib29sZWFuSG9sZGVyLCBuZXcgQ29udHJvbEhvbGRlcltdIHsgY29udHJvbEhvbGRlciB9LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIFRoZSBjb2xsZWN0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZQotCSAqIHN0YXRlIGlzIGtlcHQgaW4gc3luYyB3aXRoIHRoZSBib29sZWFuIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgQ29udHJvbEhvbGRlcltdIGNvbnRyb2xIb2xkZXJzLAotCSAgICAgICAgICAgICAgICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCXRoaXMoKTsKLQkJdGhpcy5pbml0aWFsaXplKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbnRyb2xIb2xkZXJzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlN0YXRlQ29udHJvbGxlcjwvY29kZT4gd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwKLQkgKiBAcGFyYW0gY29udHJvbEhvbGRlcnMgQW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3Rpb24gb2YKLQkgKiA8Y29kZT5Db250cm9sSG9sZGVyPC9jb2RlPnMgd2hvc2Ugc3RhdGUgaXMga2VwdCBpbiBzeW5jIHdpdGggdGhlIGJvb2xlYW4KLQkgKiBob2xkZXIncyB2YWx1ZQotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgSXRlcmF0b3I8Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMpIHsKLQotCQl0aGlzKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbnRyb2xIb2xkZXJzKSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgYm9vbGVhbiBtb2RlbAotCSAqIEBwYXJhbSBjb250cm9sSG9sZGVycyBBbiBpdGVyYXRvciBvbiB0aGUgY29sbGVjdGlvbiBvZgotCSAqIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cyB3aG9zZSBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbgotCSAqIGhvbGRlcidzIHZhbHVlCi0JICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0YXRlQ29udHJvbGxlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgSXRlcmF0b3I8Q29udHJvbEhvbGRlcj4gY29udHJvbEhvbGRlcnMsCi0JICAgICAgICAgICAgICAgIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0KLQkJdGhpcygpOwotCQlpbml0aWFsaXplKGJvb2xlYW5Ib2xkZXIsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGNvbnRyb2xIb2xkZXJzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBib29sZWFuIHByaW1pdGl2ZSBvZiB0aGUgZ2l2ZW4gPGNvZGU+Qm9vbGVhbjwvY29kZT4gdmFsdWUgYnV0Ci0JICogYWxzbyBjaGVja3MgZm9yIDxjb2RlPm51bGw8L2NvZGU+LCBpZiB0aGF0IGlzIHRoZSBjYXNlLCB0aGVuCi0JICoge0BsaW5rICNkZWZhdWx0VmFsdWV9IGlzIHJldHVybmVkLgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSA8Y29kZT5Cb29sZWFuPC9jb2RlPiB2YWx1ZSB0byBiZSByZXR1cm5lZCBhcyBhIHByaW1pdGl2ZQotCSAqIEByZXR1cm4gVGhlIHByaW1pdGl2ZSBvZiB0aGUgZ2l2ZW4gdmFsdWUgb3Ige0BsaW5rICNkZWZhdWx0VmFsdWV9d2hlbiB0aGUKLQkgKiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJvb2xlYW5WYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyB0aGlzLmRlZmF1bHRWYWx1ZSA6IHZhbHVlLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBsaXN0ZW5lciBmb3IgdGhlIGJvb2xlYW4gaG9sZGVyLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPC9jb2RlPgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiU3RhdGVDb250cm9sbGVyLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbGlzdGVuZXIgZm9yIHRoZSBib29sZWFuIGhvbGRlci4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZVN0YXRlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlN0YXRlQ29udHJvbGxlci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIDxjb2RlPkl0ZXJhdG9yPC9jb2RlPiBvdmVyIHRoZSBjb2xsZWN0aW9uIG9mCi0JICogPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zLgotCSAqCi0JICogQHJldHVybiBUaGUgaXRlcmF0aW9uIG9mIDxjb2RlPkNvbnRyb2xIb2xkZXI8L2NvZGU+cwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJdGVyYXRvcjxDb250cm9sSG9sZGVyPiBjb250cm9sSG9sZGVycygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPENvbnRyb2xIb2xkZXI+KHRoaXMuY29udHJvbEhvbGRlcnMpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgPGNvZGU+U3RhdGVDb250cm9sbGVyPC9jb2RlPiBieSBidWlsZGluZyB0aGUgYXBwcm9wcmlhdGUKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyA8Y29kZT5TdGF0ZUNvbnRyb2xsZXI8L2NvZGU+IHdpdGggdGhlIGdpdmVuIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBib29sZWFuIG1vZGVsCi0JICogQHBhcmFtIGNvbnRyb2xIb2xkZXJzIEEgPGNvZGU+Q29udHJvbEhvbGRlcjwvY29kZT5zIHdob3NlIGVuYWJsZW1lbnQgc3RhdGUKLQkgKiBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBob2xkZXIncyB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHRvIHVzZSB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCQkJCQkJCQkJICBDb2xsZWN0aW9uPENvbnRyb2xIb2xkZXI+IGNvbnRyb2xIb2xkZXJzLAotCQkJCQkJCQkJICBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoYm9vbGVhbkhvbGRlciwgICJUaGUgaG9sZGVyIG9mIHRoZSBib29sZWFuIHZhbHVlIGNhbm5vdCBiZSBudWxsIik7Ci0JCUFzc2VydC5pc05vdE51bGwoY29udHJvbEhvbGRlcnMsICJUaGUgY29sbGVjdGlvbiBvZiBDb250cm9sSG9sZGVycyBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMuY29udHJvbEhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xIb2xkZXI+KGNvbnRyb2xIb2xkZXJzKTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgICA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyICA9IGJvb2xlYW5Ib2xkZXI7Ci0KLQkJdGhpcy5ib29sZWFuSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcgotCQkpOwotCi0JCXRoaXMudXBkYXRlU3RhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiB0aGUgY29udHJvbCBob2xkZXJzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXRlKCkgewotCQl0aGlzLnVwZGF0ZVN0YXRlKGJvb2xlYW5WYWx1ZSh0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSA8Y29kZT5Db250cm9sPC9jb2RlPnMuCi0JICoKLQkgKiBAcGFyYW0gc3RhdGUgVGhlIG5ldyBzdGF0ZSB0aGUgd2lkZ2V0cyBuZWVkIHRvIGhhdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0ZShib29sZWFuIHN0YXRlKSB7Ci0JCWZvciAoQ29udHJvbEhvbGRlciBjb250cm9sSG9sZGVyIDogdGhpcy5jb250cm9sSG9sZGVycykgewotCQkJY29udHJvbEhvbGRlci51cGRhdGVTdGF0ZShzdGF0ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgaG9sZGVyIG9mIHRoZSBhY3R1YWwgd2lkZ2V0LgotCSAqLwotCXN0YXRpYyBpbnRlcmZhY2UgQ29udHJvbEhvbGRlciB7Ci0KLQkJLyoqCi0JCSAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSB3cmFwcGVkIGNvbnRyb2wuCi0JCSAqCi0JCSAqIEBwYXJhbSBzdGF0ZSBUaGUgbmV3IHN0YXRlIHRoZSBjb250cm9sIHNob3VsZCBoYXZlCi0JCSAqLwotCQl2b2lkIHVwZGF0ZVN0YXRlKGJvb2xlYW4gc3RhdGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbC9UYWJsZUxheW91dENvbXBvc2l0ZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhODc5MGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsL1RhYmxlTGF5b3V0Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vLyBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbkxheW91dERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5QaXhlbERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotCi0vKioKLSAqIEEgc3BlY2lhbCBjb21wb3NpdGUgdG8gbGF5b3V0IGNvbHVtbnMgaW5zaWRlIGEgdGFibGUuIFRoZSBjb21wb3NpdGUgaXMgbmVlZGVkIHNpbmNlIHdlIGhhdmUKLSAqIHRvIGxheW91dCB0aGUgY29sdW1ucyAiYmVmb3JlIiB0aGUgYWN0dWFsIHRhYmxlIGdldHMgbGF5b3V0ZWQuIEhlbmNlIHdlIGNhbid0IHVzZSBhIG5vcm1hbAotICogbGF5b3V0IG1hbmFnZXIuCi0gKiA8cD4KLSAqIFhYWDogU2hvdWxkIHN3aXRjaCB0byB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5UYWJsZUNvbHVtbkxheW91dH0uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUxheW91dENvbXBvc2l0ZSBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGV4dHJhIHBpeGVscyB0YWtlbiBhcyBob3Jpem9udGFsIHRyaW0gYnkgdGhlIHRhYmxlIGNvbHVtbi4KLQkgKiBUbyBlbnN1cmUgdGhlcmUgYXJlIE4gcGl4ZWxzIGF2YWlsYWJsZSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbHVtbiwKLQkgKiBhc3NpZ24gTitDT0xVTU5fVFJJTSBmb3IgdGhlIGNvbHVtbiB3aWR0aC4KLQkgKiA8cD4KLQkgKiBYWFg6IFNob3VsZCBlaXRoZXIgc3dpdGNoIHRvIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LlRhYmxlQ29sdW1uTGF5b3V0fSBvciBnZXQgQVBJIGZyb20gSkZhY2Ugb3IgU1dULCBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMTg0ODMKLQkgKiA8L3A+Ci0JICoKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IENPTFVNTl9UUklNOwotCXN0YXRpYyB7Ci0JCVN0cmluZyBwbGF0Zm9ybT0gU1dULmdldFBsYXRmb3JtKCk7Ci0JCWlmICgid2luMzIiLmVxdWFscyhwbGF0Zm9ybSkpIC8vJE5PTi1OTFMtMSQKLQkJCUNPTFVNTl9UUklNPSA0OwotCQllbHNlIGlmICgiY2FyYm9uIi5lcXVhbHMocGxhdGZvcm0pKSAvLyROT04tTkxTLTEkCi0JCQlDT0xVTU5fVFJJTT0gMjQ7Ci0JCWVsc2UKLQkJCUNPTFVNTl9UUklNPSAzOwotCX0KLQotCXByaXZhdGUgTGlzdCBjb2x1bW5zPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRhYmxlTGF5b3V0Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gc3R5bGUgdGhlIFNXVCBzdHlsZQotCSAqLwotCXB1YmxpYyBUYWJsZUxheW91dENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0gICAgICAgIGFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBhcmVhPSBnZXRDbGllbnRBcmVhKCk7Ci0gICAgICAgICAgICAgICAgVGFibGUgdGFibGU9IChUYWJsZSlnZXRDaGlsZHJlbigpWzBdOwotICAgICAgICAgICAgICAgIFBvaW50IHByZWZlcnJlZFNpemU9IGNvbXB1dGVUYWJsZVNpemUodGFibGUpOwotICAgICAgICAgICAgICAgIGludCB3aWR0aD0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotICAgICAgICAgICAgICAgIGlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbiB3aWR0aAotICAgICAgICAgICAgICAgICAgICAvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgIFBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdpZHRoIC09IHZCYXJTaXplLng7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxheW91dFRhYmxlKHRhYmxlLCB3aWR0aCwgYXJlYSwgdGFibGUuZ2V0U2l6ZSgpLnggPCBhcmVhLndpZHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBjb2x1bW4gb2YgZGF0YSB0byB0aGlzIHRhYmxlIGxheW91dC4KLQkgKgotCSAqIEBwYXJhbSBkYXRhIHRoZSBjb2x1bW4gbGF5b3V0IGRhdGEKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5EYXRhKENvbHVtbkxheW91dERhdGEgZGF0YSkgewotCQljb2x1bW5zLmFkZChkYXRhKTsKLQl9Ci0KLQkvLy0tLS0gSGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQlwcml2YXRlIFBvaW50IGNvbXB1dGVUYWJsZVNpemUoVGFibGUgdGFibGUpIHsKLQkJUG9pbnQgcmVzdWx0PSB0YWJsZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWludCB3aWR0aD0gMDsKLQkJaW50IHNpemU9IGNvbHVtbnMuc2l6ZSgpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0JCQlDb2x1bW5MYXlvdXREYXRhIGxheW91dERhdGE9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChsYXlvdXREYXRhIGluc3RhbmNlb2YgQ29sdW1uUGl4ZWxEYXRhKSB7Ci0JCQkJQ29sdW1uUGl4ZWxEYXRhIGNvbD0gKENvbHVtblBpeGVsRGF0YSkgbGF5b3V0RGF0YTsKLQkJCQl3aWR0aCArPSBjb2wud2lkdGg7Ci0JCQkJaWYgKGNvbC5hZGRUcmltKSB7Ci0JCQkJCXdpZHRoICs9IENPTFVNTl9UUklNOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAobGF5b3V0RGF0YSBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQlDb2x1bW5XZWlnaHREYXRhIGNvbD0gKENvbHVtbldlaWdodERhdGEpIGxheW91dERhdGE7Ci0JCQkJd2lkdGggKz0gY29sLm1pbmltdW1XaWR0aDsKLQkJCX0gZWxzZSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24gY29sdW1uIGxheW91dCBkYXRhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlpZiAod2lkdGggPiByZXN1bHQueCkKLQkJCXJlc3VsdC54PSB3aWR0aDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0VGFibGUoVGFibGUgdGFibGUsIGludCB3aWR0aCwgUmVjdGFuZ2xlIGFyZWEsIGJvb2xlYW4gaW5jcmVhc2UpIHsKLQkJLy8gWFhYOiBMYXlvdXQgaXMgYmVpbmcgY2FsbGVkIHdpdGggYW4gaW52YWxpZCB2YWx1ZSB0aGUgZmlyc3QgdGltZQotCQkvLyBpdCBpcyBiZWluZyBjYWxsZWQgb24gTGludXguIFRoaXMgbWV0aG9kIHJlc2V0cyB0aGUKLQkJLy8gTGF5b3V0IHRvIG51bGwgc28gd2UgbWFrZSBzdXJlIHdlIHJ1biBpdCBvbmx5IHdoZW4KLQkJLy8gdGhlIHZhbHVlIGlzIE9LLgotCQlpZiAod2lkdGggPD0gMSkKLQkJCXJldHVybjsKLQotCQlUYWJsZUNvbHVtbltdIHRhYmxlQ29sdW1ucz0gdGFibGUuZ2V0Q29sdW1ucygpOwotCQlpbnQgc2l6ZT0gTWF0aC5taW4oY29sdW1ucy5zaXplKCksIHRhYmxlQ29sdW1ucy5sZW5ndGgpOwotCQlpbnRbXSB3aWR0aHM9IG5ldyBpbnRbc2l6ZV07Ci0JCWludCBmaXhlZFdpZHRoPSAwOwotCQlpbnQgbnVtYmVyT2ZXZWlnaHRDb2x1bW5zPSAwOwotCQlpbnQgdG90YWxXZWlnaHQ9IDA7Ci0KLQkJLy8gRmlyc3QgY2FsYyBzcGFjZSBvY2N1cGllZCBieSBmaXhlZCBjb2x1bW5zCi0JCWZvciAoaW50IGk9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uUGl4ZWxEYXRhKSB7Ci0JCQkJQ29sdW1uUGl4ZWxEYXRhIGNwZD0gKENvbHVtblBpeGVsRGF0YSkgY29sOwotCQkJCWludCBwaXhlbHM9IGNwZC53aWR0aDsKLQkJCQlpZiAoY3BkLmFkZFRyaW0pIHsKLQkJCQkJcGl4ZWxzICs9IENPTFVNTl9UUklNOwotCQkJCX0KLQkJCQl3aWR0aHNbaV09IHBpeGVsczsKLQkJCQlmaXhlZFdpZHRoICs9IHBpeGVsczsKLQkJCX0gZWxzZSBpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCUNvbHVtbldlaWdodERhdGEgY3c9IChDb2x1bW5XZWlnaHREYXRhKSBjb2w7Ci0JCQkJbnVtYmVyT2ZXZWlnaHRDb2x1bW5zKys7Ci0JCQkJLy8gZmlyc3QgdGltZSwgdXNlIHRoZSB3ZWlnaHQgc3BlY2lmaWVkIGJ5IHRoZSBjb2x1bW4gZGF0YSwgb3RoZXJ3aXNlIHVzZSB0aGUgYWN0dWFsIHdpZHRoIGFzIHRoZSB3ZWlnaHQKLQkJCQkvLyBpbnQgd2VpZ2h0ID0gZmlyc3RUaW1lID8gY3cud2VpZ2h0IDogdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJaW50IHdlaWdodD0gY3cud2VpZ2h0OwotCQkJCXRvdGFsV2VpZ2h0ICs9IHdlaWdodDsKLQkJCX0gZWxzZSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVua25vd24gY29sdW1uIGxheW91dCBkYXRhIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCS8vIERvIHdlIGhhdmUgY29sdW1ucyB0aGF0IGhhdmUgYSB3ZWlnaHQKLQkJaWYgKG51bWJlck9mV2VpZ2h0Q29sdW1ucyA+IDApIHsKLQkJCS8vIE5vdyBkaXN0cmlidXRlIHRoZSByZXN0IHRvIHRoZSBjb2x1bW5zIHdpdGggd2VpZ2h0LgotCQkJaW50IHJlc3Q9IHdpZHRoIC0gZml4ZWRXaWR0aDsKLQkJCWludCB0b3RhbERpc3RyaWJ1dGVkPSAwOwotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7ICsraSkgewotCQkJCUNvbHVtbkxheW91dERhdGEgY29sPSAoQ29sdW1uTGF5b3V0RGF0YSkgY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbCBpbnN0YW5jZW9mIENvbHVtbldlaWdodERhdGEpIHsKLQkJCQkJQ29sdW1uV2VpZ2h0RGF0YSBjdz0gKENvbHVtbldlaWdodERhdGEpIGNvbDsKLQkJCQkJLy8gY2FsY3VsYXRlIHdlaWdodCBhcyBhYm92ZQotCQkJCQkvLyBpbnQgd2VpZ2h0ID0gZmlyc3RUaW1lID8gY3cud2VpZ2h0IDogdGFibGVDb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJCWludCB3ZWlnaHQ9IGN3LndlaWdodDsKLQkJCQkJaW50IHBpeGVscz0gdG90YWxXZWlnaHQgPT0gMCA/IDAgOiB3ZWlnaHQgKiByZXN0IC8gdG90YWxXZWlnaHQ7Ci0JCQkJCWlmIChwaXhlbHMgPCBjdy5taW5pbXVtV2lkdGgpCi0JCQkJCQlwaXhlbHM9IGN3Lm1pbmltdW1XaWR0aDsKLQkJCQkJdG90YWxEaXN0cmlidXRlZCArPSBwaXhlbHM7Ci0JCQkJCXdpZHRoc1tpXT0gcGl4ZWxzOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gRGlzdHJpYnV0ZSBhbnkgcmVtYWluaW5nIHBpeGVscyB0byBjb2x1bW5zIHdpdGggd2VpZ2h0LgotCQkJaW50IGRpZmY9IHJlc3QgLSB0b3RhbERpc3RyaWJ1dGVkOwotCQkJZm9yIChpbnQgaT0gMDsgZGlmZiA+IDA7ICsraSkgewotCQkJCWlmIChpID09IHNpemUpCi0JCQkJCWk9IDA7Ci0JCQkJQ29sdW1uTGF5b3V0RGF0YSBjb2w9IChDb2x1bW5MYXlvdXREYXRhKSBjb2x1bW5zLmdldChpKTsKLQkJCQlpZiAoY29sIGluc3RhbmNlb2YgQ29sdW1uV2VpZ2h0RGF0YSkgewotCQkJCQkrK3dpZHRoc1tpXTsKLQkJCQkJLS1kaWZmOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChpbmNyZWFzZSkgewotCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQkJZm9yIChpbnQgaT0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdGFibGVDb2x1bW5zW2ldLnNldFdpZHRoKHdpZHRoc1tpXSk7Ci0JCX0KLQkJaWYgKCFpbmNyZWFzZSkgewotCQkJdGFibGUuc2V0U2l6ZShhcmVhLndpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9Bc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThiM2FhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9Bc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIENvbW1hbmRFeGVjdXRvciBjYW4gYmUgdXNlZCBieSBhIG5vbi1VSQotICogdGhyZWFkIHRvIGFzeW5jaHJvbm91c2x5IG1vZGlmeSBhIEpQQSBwcm9qZWN0IHdpdGggYW55IG9iamVjdHMgYXNzb2NpYXRlZAotICogd2l0aCBkb2N1bWVudHMgdGhhdCBhcmUgY3VycmVudGx5IGRpc3BsYXllZCBpbiB0aGUgVUkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcgotCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKTsKLQotCXB1YmxpYyBzdGF0aWMgQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgQXN5bmNocm9ub3VzVWlDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJdGhpcy5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKHRoaXMuYnVpbGRSdW5uYWJsZShjb21tYW5kKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmRSdW5uYWJsZShjb21tYW5kKTsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCXJldHVybiAoZGlzcGxheSAhPSBudWxsKSA/IGRpc3BsYXkgOiBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9TeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVkZDIxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9TeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbW1hbmRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgQ29tbWFuZEV4ZWN1dG9yIGNhbiBiZSB1c2VkIGJ5IGEgbm9uLVVJCi0gKiB0aHJlYWQgdG8gc3luY2hyb25vdXNseSBtb2RpZnkgYSBKUEEgcHJvamVjdCB3aXRoIGFueSBvYmplY3RzIGFzc29jaWF0ZWQKLSAqIHdpdGggZG9jdW1lbnRzIHRoYXQgYXJlIGN1cnJlbnRseSBkaXNwbGF5ZWQgaW4gdGhlIFVJLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcgotCWltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgU3luY2hyb25vdXNVaUNvbW1hbmRFeGVjdXRvcigpOwotCi0JcHVibGljIHN0YXRpYyBDb21tYW5kRXhlY3V0b3IgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JcHJpdmF0ZSBTeW5jaHJvbm91c1VpQ29tbWFuZEV4ZWN1dG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuZ2V0RGlzcGxheSgpLnN5bmNFeGVjKHRoaXMuYnVpbGRSdW5uYWJsZShjb21tYW5kKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKENvbW1hbmQgY29tbWFuZCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmRSdW5uYWJsZShjb21tYW5kKTsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCXJldHVybiAoZGlzcGxheSAhPSBudWxsKSA/IGRpc3BsYXkgOiBEaXNwbGF5LmdldERlZmF1bHQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9BYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZGY0NTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9BYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogQWxsIHRoZSAibGlzdCB3aWRnZXRzIiBhcmUgc3ViY2xhc3NlcyBvZiB7QGxpbmsgV2lkZ2V0fTsgc28gd2UgY2FuIHByb3ZpZGUKLSAqIGEgc21pZGdlbiBvZiBjb21tb24gYmVoYXZpb3IgaGVyZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcjxXIGV4dGVuZHMgV2lkZ2V0PgotCWltcGxlbWVudHMgTGlzdFdpZGdldE1vZGVsQmluZGluZy5MaXN0V2lkZ2V0Ci17Ci0JZmluYWwgVyB3aWRnZXQ7Ci0KLQlBYnN0cmFjdExpc3RXaWRnZXRBZGFwdGVyKFcgd2lkZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMud2lkZ2V0ID0gd2lkZ2V0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGlzcG9zZWQoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldC5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGlzcG9zZUxpc3RlbmVyKERpc3Bvc2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5hZGREaXNwb3NlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Cb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2NzAyOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci0KLS8qKgotICogVGhpcyBiaW5kaW5nIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBjaGVjay1ib3gsIHRvZ2dsZSBidXR0b24sIG9yIHJhZGlvIGJ1dHRvbgotICogInNlbGVjdGlvbiIgc3luY2hyb25pemVkIHdpdGggYSBtb2RlbCBib29sZWFuLgotICogCi0gKiBAc2VlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIEJ1dHRvbgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIEJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcgewotCi0JLy8gKioqKiogbW9kZWwKLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgYnV0dG9uJ3Mgc2VsZWN0aW9uIHN0YXRlIHdpdGgKLQkgKiB0aGUgbW9kZWwgYm9vbGVhbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIGNoZWNrLWJveC90b2dnbGUgYnV0dG9uL3JhZGlvIGJ1dHRvbjsKLQkgKiBmb3Igd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IChpLmUuIHRoZSBjaGVjay1ib3gKLQkgKiBpcyB1bmNoZWNrZWQvdG9nZ2xlIGJ1dHRvbiBwb3BwZWQgb3V0L3JhZGlvIGJ1dHRvbiB1bmNoZWNrZWQpLgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvLyAqKioqKiBVSQotCS8qKiBUaGUgY2hlY2stYm94L3RvZ2dsZSBidXR0b24vcmFkaW8gYnV0dG9uIHdlIHN5bmNocm9uaXplIHdpdGggdGhlIG1vZGVsIGJvb2xlYW4uICovCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbW9kZWwgYm9vbGVhbiB3aXRoCi0JICogdGhlIGJ1dHRvbidzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSBidXR0b24KLQkgKiBpcyBkaXNwb3NlZC4gKENyaXRpY2FsIGZvciBwcmV2ZW50aW5nIG1lbW9yeSBsZWFrcy4pCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgYnV0dG9uRGlzcG9zZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwgYW5kIGJ1dHRvbiBhcmUgcmVxdWlyZWQuCi0JICovCi0JQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZyhXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEJ1dHRvbiBidXR0b24sIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoYm9vbGVhbk1vZGVsID09IG51bGwpIHx8IChidXR0b24gPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbk1vZGVsID0gYm9vbGVhbk1vZGVsOwotCQl0aGlzLmJ1dHRvbiA9IGJ1dHRvbjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0KLQkJdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuYm9vbGVhbk1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idXR0b25TZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQl0aGlzLmJ1dHRvbkRpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy5idXR0b24uYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnNldEJ1dHRvblNlbGVjdGlvbih0aGlzLmJvb2xlYW5Nb2RlbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJvb2xlYW4gbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUJvb2xlYW5CdXR0b25Nb2RlbEJpbmRpbmcudGhpcy5idXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYnV0dG9uIHNlbGVjdGlvbiBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgYnVpbGRCdXR0b25EaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhbkJ1dHRvbk1vZGVsQmluZGluZy50aGlzLmJ1dHRvbkRpc3Bvc2VkKCk7Ci0JCQl9Ci0JCSAgICBAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJidXR0b24gZGlzcG9zZSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJvb2xlYW4gbW9kZWwgZXZlbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBidXR0b24uCi0JICogSWYgdGhlIG5ldyBtb2RlbCB2YWx1ZSBpcyBudWxsLCB1c2UgdGhlIGJpbmRpbmcncyBkZWZhdWx0IHZhbHVlCi0JICogKHdoaWNoIGlzIHR5cGljYWxseSBmYWxzZSkuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRCdXR0b25TZWxlY3Rpb24oKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRCdXR0b25TZWxlY3Rpb24oQm9vbGVhbiBiKSB7Ci0JCWlmICggISB0aGlzLmJ1dHRvbi5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih0aGlzLmJvb2xlYW5WYWx1ZShiKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlKEJvb2xlYW4gYikgewotCQlyZXR1cm4gKGIgIT0gbnVsbCkgPyBiLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJ1dHRvbiBldmVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGJ1dHRvbiBoYXMgYmVlbiAic2VsZWN0ZWQiIC0gc3luY2hyb25pemUgdGhlIG1vZGVsLgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBidXR0b25TZWxlY3RlZCgpIHsKLQkJaWYgKCAhIHRoaXMuYnV0dG9uLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5ib29sZWFuTW9kZWwuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKHRoaXMuYnV0dG9uLmdldFNlbGVjdGlvbigpKSk7Ci0JCX0KLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgYnV0dG9uRGlzcG9zZWQoKSB7Ci0JCS8vIHRoZSBidXR0b24gaXMgbm90IHlldCAiZGlzcG9zZWQiIHdoZW4gd2UgcmVjZWl2ZSB0aGlzIGV2ZW50Ci0JCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVycwotCQl0aGlzLmJ1dHRvbi5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy5idXR0b24ucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMuYnV0dG9uRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy5ib29sZWFuTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmJvb2xlYW5Nb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWE5ODhkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjb250cm9sbGVyIGVuYWJsZXMgYSBib29sZWFuIG1vZGVsIHRvIGNvbnRyb2wgZWl0aGVyIHRoZQotICogPGVtPmVuYWJsZWQ8L2VtPiBvciA8ZW0+dmlzaWJsZTwvZW0+IHByb3BlcnRpZXMgb2YgU1dUIGNvbnRyb2xzOyBpLmUuIHRoZQotICogY29udHJvbHMnIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgYm9vbGVhbiBtb2RlbCwKLSAqIGJ1dCA8ZW0+bm90PC9lbT4gdmljZS12ZXJzYS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG1hbmFnZSB0aGUgbGlzdGVuZXJzOyBpLmUuIHRoZSBlbmdhZ2luZyBhbmQgZGlzZW5nYWdpbmcgb2YKLSAqIHRoZSBib29sZWFuIG1vZGVsIGFuZCB0aGUgY29udHJvbChzKS4KLSAqIAotICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIEBzZWUgQ29udHJvbCNzZXRFbmFibGVkKGJvb2xlYW4pCi0gKiBAc2VlIENvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQotICovCi1hYnN0cmFjdCBjbGFzcyBCb29sZWFuU3RhdGVDb250cm9sbGVyIHsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sbGluZyBib29sZWFuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIGNvbnRyb2wgc3RhdGVzIHdpdGgKLQkgKiBjaGFuZ2VzIGluIHRoZSB2YWx1ZSBvZiB0aGUgYm9vbGVhbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIGFsbCB0aGUKLQkgKiBjb250cm9scyBhcmUgZGlzcG9zZWQuIChDcml0aWNhbCBmb3IgcHJldmVudGluZyBtZW1vcnkgbGVha3MuKQotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGNvbnRyb2xEaXNwb3NlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgc3RhdGU7IGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIGJvb2xlYW4gbW9kZWwgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgYWRhcHRlciBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlICdlbmFibGVkJyBvciAndmlzaWJsZScgcHJvcGVydHkgaXMKLQkgKiBjb250cm9sbGVkLgotCSAqLwotCXByaXZhdGUgZmluYWwgQWRhcHRlciBhZGFwdGVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gbW9kZWwgYW5kIHRoZSBhZGFwdGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlCb29sZWFuU3RhdGVDb250cm9sbGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIGJvb2xlYW4gZGVmYXVsdFZhbHVlLCBBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChib29sZWFuTW9kZWwgPT0gbnVsbCkgfHwgKGFkYXB0ZXIgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbk1vZGVsID0gYm9vbGVhbk1vZGVsOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQotCQl0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5jb250cm9sRGlzcG9zZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbnRyb2xEaXNwb3NlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRCb29sZWFuQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmJvb2xlYW5DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImJvb2xlYW4gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgYnVpbGRDb250cm9sRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCS8vIHRoZSBjb250cm9sIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkJCS8vIHNvIHdlIGNhbiBzdGlsbCByZW1vdmUgb3VyIGxpc3RlbmVyCi0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmNvbnRyb2xEaXNwb3NlZCgoQ29udHJvbCkgZXZlbnQud2lkZ2V0KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbnRyb2wgZGlzcG9zZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYm9vbGVhbiBtb2RlbCAqKioqKioqKioqCi0KLQl2b2lkIGVuZ2FnZUJvb2xlYW5Nb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQl2b2lkIGRpc2VuZ2FnZUJvb2xlYW5Nb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYm9vbGVhbiBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBjb250cm9scy4KLQkgKiBJZiB0aGUgbmV3IGJvb2xlYW4gbW9kZWwgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHVzZSB0aGUgY29udHJvbGxlcidzCi0JICogZGVmYXVsdCB2YWx1ZSAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgYm9vbGVhbkNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnNldENvbnRyb2xTdGF0ZSgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQlib29sZWFuIGdldEJvb2xlYW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYm9vbGVhblZhbHVlKHRoaXMuYm9vbGVhbk1vZGVsLmdldFZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiAhPSBudWxsKSA/IGIuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udHJvbCAqKioqKioqKioqCi0KLQl2b2lkIGVuZ2FnZUNvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCWNvbnRyb2wuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMuY29udHJvbERpc3Bvc2VMaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBkaXNlbmdhZ2VDb250cm9sKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmNvbnRyb2xEaXNwb3NlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDb250cm9sU3RhdGUoQm9vbGVhbiBiKSB7Ci0JCXRoaXMuc2V0Q29udHJvbFN0YXRlKHRoaXMuYm9vbGVhblZhbHVlKGIpKTsKLQl9Ci0KLQlhYnN0cmFjdCB2b2lkIHNldENvbnRyb2xTdGF0ZShib29sZWFuIGIpOwotCi0Jdm9pZCBzZXRDb250cm9sU3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGIpIHsKLQkJaWYgKCAhIGNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmFkYXB0ZXIuc2V0U3RhdGUoY29udHJvbCwgYik7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNvbnRyb2xEaXNwb3NlZChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5kaXNlbmdhZ2VDb250cm9sKGNvbnRyb2wpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuYm9vbGVhbk1vZGVsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIEFkYXB0ZXIgewotCQl2b2lkIHNldFN0YXRlKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZmI4YmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9Ecm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYmluZGluZyBjYW4gYmUgdXNlZCB0byBrZWVwIGEgZHJvcC1kb3duIGxpc3QgYm94J3Mgc2VsZWN0aW9uCi0gKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgc2VsZWN0aW9uIGNhbiBiZSBtb2RpZmllZCBieSBlaXRoZXIgdGhlCi0gKiBkcm9wLWRvd24gbGlzdCBib3ggb3IgdGhlIG1vZGVsLCBzbyBjaGFuZ2VzIG11c3QgYmUgY29vcmRpbmF0ZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IEEgc2VsZWN0ZWQgaXRlbSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPiBjYW4gYmUgdXNlZAotICogdG8gY2xlYXIgdGhlIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGlvbi4gSWYgPGNvZGU+bnVsbDwvY29kZT4gaXMgYQotICogdmFsaWQgaXRlbSBpbiB0aGUgbW9kZWwgbGlzdCwgYW4gaW52YWxpZCBzZWxlY3RlZCBpdGVtIGNhbiBiZSB1c2VkIHRvIGNsZWFyCi0gKiB0aGUgc2VsZWN0aW9uLgotICogCi0gKiBAc2VlIExpc3RWYWx1ZU1vZGVsCi0gKiBAc2VlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsCi0gKiBAc2VlIERyb3BEb3duTGlzdEJveAotICogQHNlZSBTV1RUb29scwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4KLQlpbXBsZW1lbnRzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZwotewotCS8vICoqKioqIG1vZGVsCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbDsKLQotCS8qKgotCSAqIEEgd3JpdGFibGUgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbW9kZWwgc2VsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBkcm9wLWRvd24gbGlzdCBib3gncwotCSAqIHNlbGVjdGlvbiB3aXRoIHRoZSBtb2RlbCBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyOwotCi0JLy8gKioqKiogVUkKLQkvKioKLQkgKiBUaGUgZHJvcC1kb3duIGxpc3QgYm94IHdob3NlIHNlbGVjdGlvbiB3ZSBrZWVwIHN5bmNocm9uaXplZAotCSAqIHdpdGggdGhlIG1vZGVsIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERyb3BEb3duTGlzdEJveCBkcm9wZG93bkxpc3RCb3g7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3RlZCBpdGVtIGhvbGRlcgotCSAqIHdpdGggdGhlIGRyb3AtZG93biBsaXN0IGJveCdzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGRyb3Bkb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gYWxsIHBhcmFtZXRlcnMgYXJlIHJlcXVpcmVkLgotCSAqLwotCURyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcoCi0JCQlMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCwKLQkJCURyb3BEb3duTGlzdEJveCBkcm9wZG93bkxpc3RCb3gKLQkpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0TW9kZWwgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbU1vZGVsID09IG51bGwpIHx8IChkcm9wZG93bkxpc3RCb3ggPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE1vZGVsID0gbGlzdE1vZGVsOwotCQl0aGlzLnNlbGVjdGVkSXRlbU1vZGVsID0gc2VsZWN0ZWRJdGVtTW9kZWw7Ci0JCXRoaXMuZHJvcGRvd25MaXN0Qm94ID0gZHJvcGRvd25MaXN0Qm94OwotCi0JCXRoaXMuc2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Nb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wZG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGREcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmRyb3Bkb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTZWxlY3RlZEl0ZW1DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VsZWN0ZWQgaXRlbSBsaXN0ZW5lciI7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuZHJvcERvd25MaXN0Qm94RG91YmxlQ2xpY2tlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkcm9wLWRvd24gbGlzdCBib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFdpZGdldE1vZGVsQmluZGluZy5TZWxlY3Rpb25CaW5kaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgZHJvcC1kb3duIGxpc2IgYm94J3Mgc2VsZWN0ZWQgaXRlbSBwcm9ncmFtbWF0aWNhbGx5IGRvZXMKLQkgKiBub3QgdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqIDxwPgotCSAqIFByZS1jb25kaXRpb246IFRoZSBkcm9wLWRvd24gbGlzdCBib3ggaXMgbm90IGRpc3Bvc2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpIHsKLQkJaW50IG9sZEluZGV4ID0gdGhpcy5kcm9wZG93bkxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJRSB2YWx1ZSA9IHRoaXMuc2VsZWN0ZWRJdGVtTW9kZWwuZ2V0VmFsdWUoKTsKLQkJaW50IG5ld0luZGV4ID0gdGhpcy5pbmRleE9mKHZhbHVlKTsKLQkJaWYgKChvbGRJbmRleCAhPSAtMSkgJiYgKG5ld0luZGV4ICE9IC0xKSAmJiAobmV3SW5kZXggIT0gb2xkSW5kZXgpKSB7Ci0JCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5kZXNlbGVjdChvbGRJbmRleCk7Ci0JCX0KLQkJaWYgKG5ld0luZGV4ID09IC0xKSB7Ci0JCQl0aGlzLmRyb3Bkb3duTGlzdEJveC5kZXNlbGVjdEFsbCgpOwotCQl9IGVsc2UgewotCQkJaWYgKG5ld0luZGV4ICE9IG9sZEluZGV4KSB7Ci0JCQkJdGhpcy5kcm9wZG93bkxpc3RCb3guc2VsZWN0KG5ld0luZGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZHJvcGRvd25MaXN0Qm94LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuZHJvcGRvd25MaXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnNlbGVjdGVkSXRlbU1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbSAqKioqKioqKioqCi0KLQl2b2lkIHNlbGVjdGVkSXRlbUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5kcm9wZG93bkxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbUNoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgZHJvcC1kb3duIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbSBwcm9ncmFtbWF0aWNhbGx5IGRvZXMKLQkgKiBub3QgdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1DaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCXByaXZhdGUgaW50IGluZGV4T2YoRSBpdGVtKSB7Ci0JCWludCBsZW4gPSB0aGlzLmxpc3RNb2RlbC5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmxpc3RNb2RlbC5nZXQoaSksIGl0ZW0pKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgJ251bGwnIGlzIG5vdCBpbiB0aGUgbGlzdCwgdXNlIGl0IHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24KLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCS8vIFdlIGNhbiBnZXQgaGVyZSB2aWEgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0JCS8vIDEuIFRoZSBzZWxlY3RlZCBpdGVtIG1vZGVsIGlzIGludmFsaWQgYW5kIG5vdCBpbiBzeW5jIHdpdGggdGhlIGxpc3QKLQkJLy8gICAgbW9kZWwuIFRoaXMgaXMgbm90IGdvb2QgYW5kIHdlIGRvbid0IG1ha2UgdGhpcyAocHJvZ3JhbW1pbmcKLQkJLy8gICAgZXJyb3IpIG9idmlvdXMgKGUuZy4gdmlhIGFuIGV4Y2VwdGlvbikuIDotKAotCQkvLyAyLiBJZiBib3RoIHRoZSBzZWxlY3RlZCBpdGVtIG1vZGVsIGFuZCB0aGUgbGlzdCBtb2RlbCBhcmUgZGVwZW5kZW50Ci0JCS8vICAgIG9uIHRoZSBzYW1lIHVuZGVybHlpbmcgbW9kZWwsIHRoZSBzZWxlY3RlZCBpdGVtIG1vZGVsIG1heSByZWNlaXZlCi0JCS8vICAgIGl0cyBldmVudCBmaXJzdCwgcmVzdWx0aW5nIGluIGEgbWlzc2luZyBpdGVtLiBUaGlzIHdpbGwgcmVzb2x2ZQotCQkvLyAgICBpdHNlbGYgb25jZSB0aGUgbGlzdCBtb2RlbCByZWNlaXZlcyBpdHMgZXZlbnQgYW5kIHN5bmNocm9uaXplcwotCQkvLyAgICB3aXRoIHRoZSBzYW1lIHVuZGVybHlpbmcgbW9kZWwuIFRoaXMgc2l0dWF0aW9uIGlzIGFjY2VwdGFibGUuCi0JCXJldHVybiAtMTsKLQotLy8gVGhpcyBpcyB3aGF0IHdlIHVzZWQgdG8gZG86Ci0vLwkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2VsZWN0ZWQgaXRlbSBub3QgZm91bmQ6ICIgKyBpdGVtKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tYm8tYm94IGV2ZW50cyAqKioqKioqKioqCi0KLQl2b2lkIGRyb3BEb3duTGlzdEJveFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuZHJvcGRvd25MaXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5kcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGRyb3BEb3duTGlzdEJveERvdWJsZUNsaWNrZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMuZHJvcGRvd25MaXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5kcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtTW9kZWwuc2V0VmFsdWUodGhpcy5nZXREcm9wRG93bkxpc3RCb3hTZWxlY3RlZEl0ZW0oKSk7Ci0JfQotCi0JcHJpdmF0ZSBFIGdldERyb3BEb3duTGlzdEJveFNlbGVjdGVkSXRlbSgpIHsKLQkJaW50IHNlbGVjdGlvbkluZGV4ID0gdGhpcy5kcm9wZG93bkxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJcmV0dXJuIChzZWxlY3Rpb25JbmRleCA9PSAtMSkgPyBudWxsIDogdGhpcy5saXN0TW9kZWwuZ2V0KHNlbGVjdGlvbkluZGV4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbU1vZGVsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIGJ5IHRoZSBkcm9wLWRvd24gbGlzdCBib3ggc2VsZWN0aW9uIGJpbmRpbmcgdG8gcXVlcnkgYW5kIG1hbmlwdWxhdGUKLQkgKiB0aGUgZHJvcC1kb3duIGxpc3QgYm94LgotCSAqLwotCWludGVyZmFjZSBEcm9wRG93bkxpc3RCb3ggewotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29tYm8tYm94IGlzICJkaXNwb3NlZCIuCi0JCSAqLwotCQlib29sZWFuIGlzRGlzcG9zZWQoKTsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIGxpc3RlbmVyIHRvIHRoZSBjb21iby1ib3guCi0JCSAqLwotCQl2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNvbWJvLWJveC4KLQkJICovCi0JCXZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjb21iby1ib3gncyBzZWxlY3Rpb24uCi0JCSAqLwotCQlpbnQgZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotCQkvKioKLQkJICogU2VsZWN0IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGNvbWJvLWJveC4KLQkJICovCi0JCXZvaWQgc2VsZWN0KGludCBpbmRleCk7Ci0KLQkJLyoqCi0JCSAqIERlc2VsZWN0IHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggaW4gdGhlIGNvbWJvLWJveC4KLQkJICovCi0JCXZvaWQgZGVzZWxlY3QoaW50IGluZGV4KTsKLQotCQkvKioKLQkJICogQ2xlYXIgdGhlIGNvbWJvLWJveCdzIHNlbGVjdGlvbi4KLQkJICovCi0JCXZvaWQgZGVzZWxlY3RBbGwoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94U2VsZWN0aW9uQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzVjMjhiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3QgYm94J3Mgc2VsZWN0aW9uCi0gKiBzeW5jaHJvbml6ZWQgd2l0aCBhIG1vZGVsLiBUaGUgc2VsZWN0aW9uIGNhbiBiZSBtb2RpZmllZCBieSBlaXRoZXIgdGhlIGxpc3QKLSAqIGJveCBvciB0aGUgbW9kZWwsIHNvIGNoYW5nZXMgbXVzdCBiZSBjb29yZGluYXRlZC4KLSAqIAotICogQHNlZSBMaXN0VmFsdWVNb2RlbAotICogQHNlZSBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsCi0gKiBAc2VlIExpc3QKLSAqIEBzZWUgU1dUVG9vbHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBMaXN0Qm94U2VsZWN0aW9uQmluZGluZzxFPgotCWltcGxlbWVudHMgTGlzdFdpZGdldE1vZGVsQmluZGluZy5TZWxlY3Rpb25CaW5kaW5nCi17Ci0JLy8gKioqKiogbW9kZWwKLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsOwotCi0JLyoqCi0JICogQSB3cml0YWJsZSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBzZWxlY3Rpb25zLgotCSAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1zTW9kZWw7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHRoZSBsaXN0IGJveCdzIHNlbGVjdGlvbiB3aXRoCi0JICogdGhlIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyOwotCi0JLy8gKioqKiogVUkKLQkvKioKLQkgKiBUaGUgbGlzdCBib3ggd2hvc2Ugc2VsZWN0aW9uIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIHNlbGVjdGlvbnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IGxpc3RCb3g7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIG91ciBzZWxlY3RlZCBpdGVtcyBob2xkZXIKLQkgKiB3aXRoIHRoZSBsaXN0IGJveCdzIHNlbGVjdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIGFsbCBwYXJhbWV0ZXJzIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZygKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwKLQkJCVdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsLAotCQkJTGlzdCBsaXN0Qm94Ci0JKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgobGlzdE1vZGVsID09IG51bGwpIHx8IChzZWxlY3RlZEl0ZW1zTW9kZWwgPT0gbnVsbCkgfHwgKGxpc3RCb3ggPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdE1vZGVsID0gbGlzdE1vZGVsOwotCQl0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbCA9IHNlbGVjdGVkSXRlbXNNb2RlbDsKLQkJdGhpcy5saXN0Qm94ID0gbGlzdEJveDsKLQotCQl0aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXIpOwotCi0JCXRoaXMubGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5saXN0Qm94U2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTZWxlY3RlZEl0ZW1zQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMuc2VsZWN0ZWRJdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcudGhpcy5zZWxlY3RlZEl0ZW1zQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLnNlbGVjdGVkSXRlbXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlbGVjdGVkIGl0ZW1zIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkTGlzdEJveFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Qm94U2VsZWN0aW9uQmluZGluZy50aGlzLmxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLnRoaXMubGlzdEJveERvdWJsZUNsaWNrZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFdpZGdldE1vZGVsQmluZGluZy5TZWxlY3Rpb25CaW5kaW5nIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgbGlzdCBib3gncyBzZWxlY3RlZCBpdGVtcyBwcm9ncmFtbWF0aWNhbGx5IGRvZXMgbm90Ci0JICogdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqIAotCSAqIFByZS1jb25kaXRpb246IFRoZSBsaXN0LWJveCBpcyBub3QgZGlzcG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCkgewotCQlpbnQgc2VsZWN0ZWRJdGVtc1NpemUgPSB0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbC5zaXplKCk7Ci0JCWludFtdIHNlbGVjdCA9IG5ldyBpbnRbc2VsZWN0ZWRJdGVtc1NpemVdOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwpIHsKLQkJCXNlbGVjdFtpKytdID0gdGhpcy5pbmRleE9mKGl0ZW0pOwotCQl9Ci0KLQkJaW50IGxpc3RTaXplID0gdGhpcy5saXN0TW9kZWwuc2l6ZSgpOwotCQlpbnRbXSBkZXNlbGVjdCA9IG5ldyBpbnRbbGlzdFNpemUgLSBzZWxlY3RlZEl0ZW1zU2l6ZV07Ci0JCWkgPSAwOwotCQlmb3IgKGludCBqID0gMDsgaiA8IGxpc3RTaXplOyBqKyspIHsKLQkJCWlmICggISBBcnJheVRvb2xzLmNvbnRhaW5zKHNlbGVjdCwgaikpIHsKLQkJCQlkZXNlbGVjdFtpKytdID0gajsKLQkJCX0KLQkJfQotCi0JCWludFtdIG9sZCA9IEFycmF5VG9vbHMuc29ydCh0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kaWNlcygpKTsKLQkJc2VsZWN0ID0gQXJyYXlUb29scy5zb3J0KHNlbGVjdCk7Ci0JCWlmICggISBBcnJheXMuZXF1YWxzKHNlbGVjdCwgb2xkKSkgewotCQkJdGhpcy5saXN0Qm94LmRlc2VsZWN0KGRlc2VsZWN0KTsKLQkJCXRoaXMubGlzdEJveC5zZWxlY3Qoc2VsZWN0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMubGlzdEJveC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmxpc3RCb3hTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtc01vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0ZWQgaXRlbXMgKioqKioqKioqKgotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5aW5nIHRoZSBsaXN0IGJveCdzIHNlbGVjdGVkIGl0ZW1zIHByb2dyYW1tYXRpY2FsbHkgZG9lcyBub3QKLQkgKiB0cmlnZ2VyIGEgU2VsZWN0aW9uRXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGVkSXRlbXNBZGRlZF8oQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2V2ZW50LmdldEl0ZW1zU2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQkJdGhpcy5saXN0Qm94LnNlbGVjdChpbmRpY2VzKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0Jdm9pZCBzZWxlY3RlZEl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdEJveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1vZGlmeWluZyB0aGUgbGlzdCBib3gncyBzZWxlY3RlZCBpdGVtcyBwcm9ncmFtbWF0aWNhbGx5IGRvZXMgbm90Ci0JICogdHJpZ2dlciBhIFNlbGVjdGlvbkV2ZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3RlZEl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2V2ZW50LmdldEl0ZW1zU2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQlpbmRpY2VzW2krK10gPSB0aGlzLmluZGV4T2YoaXRlbSk7Ci0JCX0KLQkJdGhpcy5saXN0Qm94LmRlc2VsZWN0KGluZGljZXMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRJdGVtcyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQl2b2lkIHNlbGVjdGVkSXRlbXNDbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLmxpc3RCb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnNlbGVjdGVkSXRlbXNDbGVhcmVkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnlpbmcgdGhlIGxpc3QgYm94J3Mgc2VsZWN0ZWQgaXRlbXMgcHJvZ3JhbW1hdGljYWxseSBkb2VzIG5vdAotCSAqIHRyaWdnZXIgYSBTZWxlY3Rpb25FdmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRJdGVtc0NsZWFyZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RCb3guZGVzZWxlY3RBbGwoKTsKLQl9Ci0KLQl2b2lkIHNlbGVjdGVkSXRlbXNDaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGVkSXRlbXNDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0V2lkZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihFIGl0ZW0pIHsKLQkJaW50IGxlbiA9IHRoaXMubGlzdE1vZGVsLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMubGlzdE1vZGVsLmdldChpKSwgaXRlbSkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQkvLyBzZWUgY29tbWVudCBpbiBEcm9wRG93bkxpc3RCb3hTZWxlY3Rpb25CaW5kaW5nLmluZGV4T2YoRSkKLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGJveCBldmVudHMgKioqKioqKioqKgotCi0Jdm9pZCBsaXN0Qm94U2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0Jdm9pZCBsaXN0Qm94RG91YmxlQ2xpY2tlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5saXN0Qm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5saXN0Qm94U2VsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1zTW9kZWwuc2V0VmFsdWVzKHRoaXMuZ2V0TGlzdEJveFNlbGVjdGVkSXRlbXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXRMaXN0Qm94U2VsZWN0ZWRJdGVtcygpIHsKLQkJQXJyYXlMaXN0PEU+IHNlbGVjdGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Db3VudCgpKTsKLQkJZm9yIChpbnQgc2VsZWN0aW9uSW5kZXggOiB0aGlzLmxpc3RCb3guZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQlzZWxlY3RlZEl0ZW1zLmFkZCh0aGlzLmxpc3RNb2RlbC5nZXQoc2VsZWN0aW9uSW5kZXgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0ZWRJdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnNlbGVjdGVkSXRlbXNNb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L0xpc3RXaWRnZXRNb2RlbEJpbmRpbmcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdFdpZGdldE1vZGVsQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGI5ZTdjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdFdpZGdldE1vZGVsQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGJpbmRpbmcgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3Qgd2lkZ2V0J3MgY29udGVudHMKLSAqIHN5bmNocm9uaXplZCB3aXRoIGEgbW9kZWwuIFRoZSBsaXN0IHdpZGdldCBuZXZlciBhbHRlcnMKLSAqIGl0cyBjb250ZW50cyBkaXJlY3RseTsgYWxsIGNoYW5nZXMgYXJlIGRyaXZlbiBieSB0aGUgbW9kZWwuCi0gKiAKLSAqIEBzZWUgTGlzdFZhbHVlTW9kZWwKLSAqIEBzZWUgU3RyaW5nQ29udmVydGVyCi0gKiBAc2VlIExpc3RXaWRnZXQKLSAqIEBzZWUgU2VsZWN0aW9uQmluZGluZwotICogQHNlZSBTV1RUb29scwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIExpc3RXaWRnZXRNb2RlbEJpbmRpbmc8RT4gewotCi0JLy8gKioqKiogbW9kZWwKLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQncyBjb250ZW50cyB3aXRoCi0JICogdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBjb252ZXJ0ZXIgdGhhdCBjb252ZXJ0cyBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdAotCSAqIHRvIHN0cmluZ3MgdGhhdCBjYW4gYmUgcHV0IGluIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXI7Ci0KLQkvLyAqKioqKiBVSQotCS8qKgotCSAqIEFuIGFkYXB0ZXIgb24gdGhlIGxpc3Qgd2lkZ2V0IHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0V2lkZ2V0IGxpc3RXaWRnZXQ7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHN0dWZmIHdoZW4gdGhlIGxpc3Qgd2lkZ2V0Ci0JICogaXMgZGlzcG9zZWQuIChDcml0aWNhbCBmb3IgcHJldmVudGluZyBtZW1vcnkgbGVha3MuKQotCSAqLwotCXByaXZhdGUgZmluYWwgRGlzcG9zZUxpc3RlbmVyIGxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXI7Ci0KLQkvLyAqKioqKiBzZWxlY3Rpb24KLQkvKioKLQkgKiBXaWRnZXQtc3BlY2lmaWMgc2VsZWN0aW9uIGJpbmRpbmcuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTZWxlY3Rpb25CaW5kaW5nIHNlbGVjdGlvbkJpbmRpbmc7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSBhbGwgcGFyYW1ldGVycyBhcmUgcmVxdWlyZWQuCi0JICovCi0JTGlzdFdpZGdldE1vZGVsQmluZGluZygKLQkJCUxpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwKLQkJCUxpc3RXaWRnZXQgbGlzdFdpZGdldCwKLQkJCVN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIsCi0JCQlTZWxlY3Rpb25CaW5kaW5nIHNlbGVjdGlvbkJpbmRpbmcKLQkpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChsaXN0TW9kZWwgPT0gbnVsbCkgfHwgKGxpc3RXaWRnZXQgPT0gbnVsbCkgfHwgKHN0cmluZ0NvbnZlcnRlciA9PSBudWxsKSB8fCAoc2VsZWN0aW9uQmluZGluZyA9PSBudWxsKSkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0TW9kZWwgPSBsaXN0TW9kZWw7Ci0JCXRoaXMubGlzdFdpZGdldCA9IGxpc3RXaWRnZXQ7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCQl0aGlzLnNlbGVjdGlvbkJpbmRpbmcgPSBzZWxlY3Rpb25CaW5kaW5nOwotCi0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcigpOwotCQl0aGlzLmxpc3RXaWRnZXQuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMubGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3RXaWRnZXQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0SXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RXaWRnZXRNb2RlbEJpbmRpbmcudGhpcy5saXN0SXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdEl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFdpZGdldE1vZGVsQmluZGluZy50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkTGlzdFdpZGdldERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBEaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREaXNwb3NlZChEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0V2lkZ2V0TW9kZWxCaW5kaW5nLnRoaXMubGlzdFdpZGdldERpc3Bvc2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3Qgd2lkZ2V0IGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEJydXRlIGZvcmNlIHN5bmNocm9uaXphdGlvbiBvZiBsaXN0IHdpZGdldCB3aXRoIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXQoKSB7Ci0JCWlmICggISB0aGlzLmxpc3RXaWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldF8oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRfKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbC5zaXplKCkpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMubGlzdE1vZGVsKSB7Ci0JCQlpdGVtcy5hZGQodGhpcy5jb252ZXJ0KGl0ZW0pKTsKLQkJfQotCQl0aGlzLmxpc3RXaWRnZXQuc2V0SXRlbXMoaXRlbXMudG9BcnJheShuZXcgU3RyaW5nW2l0ZW1zLnNpemUoKV0pKTsKLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0SXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNBZGRlZF8oTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJdGhpcy5saXN0V2lkZ2V0LmFkZCh0aGlzLmNvbnZlcnQoaXRlbSksIGkrKyk7Ci0JCX0KLQotCQkvLyBub3cgdGhhdCB0aGUgbGlzdCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBzeW5jaCB0aGUgc2VsZWN0aW9uCi0JCXRoaXMuc2VsZWN0aW9uQmluZGluZy5zeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxpc3RJdGVtc1JlbW92ZWRfKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RXaWRnZXQucmVtb3ZlKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEluZGV4KCkgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDEpOwotCi0JCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpbnQgdGFyZ2V0ID0gZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKTsKLQkJaW50IHNvdXJjZSA9IGV2ZW50LmdldFNvdXJjZUluZGV4KCk7Ci0JCWludCBsZW4gPSBldmVudC5nZXRMZW5ndGgoKTsKLQkJaW50IGxvU3RhcnQgPSBNYXRoLm1pbih0YXJnZXQsIHNvdXJjZSk7Ci0JCWludCBoaVN0YXJ0ID0gTWF0aC5tYXgodGFyZ2V0LCBzb3VyY2UpOwotCQkvLyBtYWtlIGEgY29weSBvZiB0aGUgYWZmZWN0ZWQgaXRlbXMuLi4KLQkJU3RyaW5nW10gc3ViQXJyYXkgPSBBcnJheVRvb2xzLnN1YkFycmF5KHRoaXMubGlzdFdpZGdldC5nZXRJdGVtcygpLCBsb1N0YXJ0LCBoaVN0YXJ0ICsgbGVuKTsKLQkJLy8gLi4ubW92ZSB0aGVtIGFyb3VuZC4uLgotCQlzdWJBcnJheSA9IEFycmF5VG9vbHMubW92ZShzdWJBcnJheSwgdGFyZ2V0IC0gbG9TdGFydCwgc291cmNlIC0gbG9TdGFydCwgbGVuKTsKLQkJLy8gLi4uYW5kIHRoZW4gcHV0IHRoZW0gYmFjawotCQlpbnQgaSA9IGxvU3RhcnQ7Ci0JCWZvciAoU3RyaW5nIGl0ZW0gOiBzdWJBcnJheSkgewotCQkJdGhpcy5saXN0V2lkZ2V0LnNldEl0ZW0oaSsrLCBpdGVtKTsKLQkJfQotCi0JCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIHRoZSBsaXN0IHdpZGdldC4KLQkgKi8KLQl2b2lkIGxpc3RJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdEl0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0SXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMubGlzdFdpZGdldC5zZXRJdGVtKGkrKywgdGhpcy5jb252ZXJ0KGl0ZW0pKTsKLQkJfQotCi0JCS8vIG5vdyB0aGF0IHRoZSBsaXN0IGhhcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHN5bmNoIHRoZSBzZWxlY3Rpb24KLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLnN5bmNocm9uaXplTGlzdFdpZGdldFNlbGVjdGlvbigpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBjaGFuZ2VkIC0gc3luY2hyb25pemUgdGhlIGxpc3Qgd2lkZ2V0LgotCSAqLwotCXZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0Q2xlYXJlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdFdpZGdldC5yZW1vdmVBbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIGNoYW5nZWQgLSBzeW5jaHJvbml6ZSB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0Jdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCAhIHRoaXMubGlzdFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0Q2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdFdpZGdldF8oKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gYQotCSAqIHN0cmluZyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgbGlzdCB3aWRnZXQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydChFIGl0ZW0pIHsKLQkJcmV0dXJuIHRoaXMuc3RyaW5nQ29udmVydGVyLmNvbnZlcnRUb1N0cmluZyhpdGVtKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCB3aWRnZXQgZXZlbnRzICoqKioqKioqKioKLQotCXZvaWQgbGlzdFdpZGdldERpc3Bvc2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEaXNwb3NlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGxpc3Qgd2lkZ2V0IGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5saXN0V2lkZ2V0LnJlbW92ZURpc3Bvc2VMaXN0ZW5lcih0aGlzLmxpc3RXaWRnZXREaXNwb3NlTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zZWxlY3Rpb25CaW5kaW5nLmRpc3Bvc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RNb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgaW50ZXJmYWNlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGFwdGVyIHVzZWQgYnkgdGhlIGxpc3Qgd2lkZ2V0IG1vZGVsIGJpbmRpbmcgdG8gcXVlcnkgYW5kIG1hbmlwdWxhdGUKLQkgKiB0aGUgd2lkZ2V0LgotCSAqLwotCWludGVyZmFjZSBMaXN0V2lkZ2V0IHsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3Qgd2lkZ2V0IGlzICJkaXNwb3NlZCIuCi0JCSAqLwotCQlib29sZWFuIGlzRGlzcG9zZWQoKTsKLQotCQkvKioKLQkJICogQWRkIHRoZSBzcGVjaWZpZWQgZGlzcG9zZSBsaXN0ZW5lciB0byB0aGUgbGlzdCB3aWRnZXQuCi0JCSAqLwotCQl2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBkaXNwb3NlIGxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgd2lkZ2V0LgotCQkgKi8KLQkJdm9pZCByZW1vdmVEaXNwb3NlTGlzdGVuZXIoRGlzcG9zZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBsaXN0IHdpZGdldCdzIGl0ZW1zLgotCQkgKi8KLQkJU3RyaW5nW10gZ2V0SXRlbXMoKTsKLQotCQkvKioKLQkJICogU2V0IHRoZSBsaXN0IHdpZGdldCdzIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgc3BlY2lmaWVkIGl0ZW0uCi0JCSAqLwotCQl2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcy4KLQkJICovCi0JCXZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpOwotCi0JCS8qKgotCQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBsaXN0IHdpZGdldCdzIGl0ZW1zIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQl2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb2YgaXRlbXMgZnJvbSB0aGUgbGlzdCB3aWRnZXQncyBpdGVtcy4KLQkJICovCi0JCXZvaWQgcmVtb3ZlKGludCBzdGFydCwgaW50IGVuZCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSBhbGwgdGhlIGl0ZW1zIGZyb20gdGhlIGxpc3Qgd2lkZ2V0LgotCQkgKi8KLQkJdm9pZCByZW1vdmVBbGwoKTsKLQotCX0KLQotCi0JLyoqCi0JICogV2lkZ2V0LXNwZWNpZmljIHNlbGVjdGlvbiBiaW5kaW5nIHRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgbGlzdCB3aWRnZXQKLQkgKiBtb2RlbCBiaW5kaW5nLgotCSAqLwotCWludGVyZmFjZSBTZWxlY3Rpb25CaW5kaW5nIHsKLQotCQkvKioKLQkJICogU3luY2hyb25pemUgdGhlIHNlbGVjdGlvbiBiaW5kaW5nJ3Mgd2lkZ2V0IHdpdGggdGhlIHNlbGVjdGlvbiBtb2RlbC4KLQkJICogPHA+Ci0JCSAqIFByZS1jb25kaXRpb246IFRoZSB3aWRnZXQgaXMgbm90IGRpc3Bvc2VkLgotCQkgKi8KLQkJdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIHdpZGdldCBoYXMgYmVlbiBkaXNwb3NlZDsgZGlzcG9zZSB0aGUgc2VsZWN0aW9uIGJpbmRpbmcuCi0JCSAqLwotCQl2b2lkIGRpc3Bvc2UoKTsKLQotCi0JCS8qKgotCQkgKiBVc2VmdWwgZm9yIGxpc3QgYm94ZXMgdGhhdCBpZ25vcmUgdGhlIHNlbGVjdGlvbi4KLQkJICovCi0JCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBTZWxlY3Rpb25CaW5kaW5nIHsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VsZWN0aW9uQmluZGluZyBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlwdWJsaWMgc3RhdGljIFNlbGVjdGlvbkJpbmRpbmcgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUxpc3RXaWRnZXRTZWxlY3Rpb24oKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJTZWxlY3Rpb25CaW5kaW5nLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9NdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L011bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE1MmE4MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L011bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjb250cm9sbGVyIGVuYWJsZXMgYSBib29sZWFuIG1vZGVsIHRvIGNvbnRyb2wgZWl0aGVyIHRoZQotICogPGVtPmVuYWJsZWQ8L2VtPiBvciA8ZW0+dmlzaWJsZTwvZW0+IHByb3BlcnRpZXMgb2YgYSBzZXQgb2YgU1dUIGNvbnRyb2xzOwotICogaS5lLiB0aGUgY29udHJvbHMnIHByb3BlcnRpZXMgYXJlIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgYm9vbGVhbiBtb2RlbCwKLSAqIGJ1dCA8ZW0+bm90PC9lbT4gdmljZS12ZXJzYS4KLSAqIAotICogQHNlZSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIEBzZWUgQ29sbGVjdGlvblZhbHVlTW9kZWwKLSAqIEBzZWUgQ29udHJvbCNzZXRFbmFibGVkKGJvb2xlYW4pCi0gKiBAc2VlIENvbnRyb2wjc2V0VmlzaWJsZShib29sZWFuKQotICovCi1maW5hbCBjbGFzcyBNdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyCi0JZXh0ZW5kcyBCb29sZWFuU3RhdGVDb250cm9sbGVyCi17Ci0JLyoqCi0JICogVGhlIHNldCBvZiBjb250cm9scyB3aG9zZSBzdGF0ZSBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgYm9vbGVhbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyBjbGllbnRzIHRvIGFkZC9yZW1vdmUgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgY29udHJvbHNMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENhY2hlIG9mIGNvbnRyb2xzLgotCSAqLwotCXByaXZhdGUgZmluYWwgSGFzaFNldDxDb250cm9sPiBjb250cm9scyA9IG5ldyBIYXNoU2V0PENvbnRyb2w+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBtb2RlbCwgdGhlIGNvbnRyb2xzIG1vZGVsLCBhbmQgdGhlIGFkYXB0ZXIgYXJlIHJlcXVpcmVkLgotCSAqLwotCU11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLAotCQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWwsCi0JCQlib29sZWFuIGRlZmF1bHRWYWx1ZSwKLQkJCUFkYXB0ZXIgYWRhcHRlcgotCSkgewotCQlzdXBlcihib29sZWFuTW9kZWwsIGRlZmF1bHRWYWx1ZSwgYWRhcHRlcik7Ci0JCWlmIChjb250cm9sc01vZGVsID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29udHJvbHNNb2RlbCA9IGNvbnRyb2xzTW9kZWw7Ci0JCXRoaXMuY29udHJvbHNMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb250cm9sc0xpc3RlbmVyKCk7Ci0JCXRoaXMuYWRkQ29udHJvbHMoY29udHJvbHNNb2RlbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29udHJvbHNMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLmFkZENvbnRyb2xzKChJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4pIGV2ZW50LmdldEl0ZW1zKCkpOwotCQkJfQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlci50aGlzLnJlbW92ZUNvbnRyb2xzKChJdGVyYWJsZTw/IGV4dGVuZHMgQ29udHJvbD4pIGV2ZW50LmdldEl0ZW1zKCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlNdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLnRoaXMuY2xlYXJDb250cm9scygpOwotCQkJfQotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlNdWx0aUNvbnRyb2xCb29sZWFuU3RhdGVDb250cm9sbGVyLnRoaXMuY2xlYXJDb250cm9scygpOwotCQkJCU11bHRpQ29udHJvbEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIudGhpcy5hZGRDb250cm9scygoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+KSBldmVudC5nZXRDb2xsZWN0aW9uKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29udHJvbHMgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRyb2xzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXZvaWQgc2V0Q29udHJvbFN0YXRlKGJvb2xlYW4gYikgewotCQlmb3IgKENvbnRyb2wgY29udHJvbCA6IHRoaXMuY29udHJvbHMpIHsKLQkJCXRoaXMuc2V0Q29udHJvbFN0YXRlKGNvbnRyb2wsIGIpOwotCQl9Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIGFkZENvbnRyb2xzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc18pIHsKLQkJYm9vbGVhbiBiID0gdGhpcy5nZXRCb29sZWFuVmFsdWUoKTsKLQkJZm9yIChDb250cm9sIGNvbnRyb2wgOiBjb250cm9sc18pIHsKLQkJCXRoaXMuYWRkQ29udHJvbChjb250cm9sLCBiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb250cm9sKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKSB7Ci0JCWlmICh0aGlzLmNvbnRyb2xzLmlzRW1wdHkoKSkgewotCQkJdGhpcy5lbmdhZ2VCb29sZWFuTW9kZWwoKTsKLQkJCXRoaXMuY29udHJvbHNNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbnRyb2xzTGlzdGVuZXIpOwotCQl9Ci0JCWlmICh0aGlzLmNvbnRyb2xzLmFkZChjb250cm9sKSkgewotCQkJdGhpcy5lbmdhZ2VDb250cm9sKGNvbnRyb2wpOwotCQkJdGhpcy5zZXRDb250cm9sU3RhdGUoY29udHJvbCwgYik7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXBsaWNhdGUgY29udHJvbDogIiArIGNvbnRyb2wpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgY2xlYXJDb250cm9scygpIHsKLQkJdGhpcy5yZW1vdmVDb250cm9scyhuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPENvbnRyb2w+KHRoaXMuY29udHJvbHMpKTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgcmVtb3ZlQ29udHJvbHMoSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzXykgewotCQlmb3IgKENvbnRyb2wgY29udHJvbCA6IGNvbnRyb2xzXykgewotCQkJdGhpcy5kaXNlbmdhZ2VDb250cm9sKGNvbnRyb2wpOwotCQkJdGhpcy5yZW1vdmVDb250cm9sKGNvbnRyb2wpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbnRyb2woQ29udHJvbCBjb250cm9sKSB7Ci0JCXRoaXMuY29udHJvbHMucmVtb3ZlKGNvbnRyb2wpOwotCQlpZiAodGhpcy5jb250cm9scy5pc0VtcHR5KCkpIHsKLQkJCXRoaXMuY29udHJvbHNNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbnRyb2xzTGlzdGVuZXIpOwotCQkJdGhpcy5kaXNlbmdhZ2VCb29sZWFuTW9kZWwoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgY29udHJvbERpc3Bvc2VkKENvbnRyb2wgY29udHJvbCkgewotCQlzdXBlci5jb250cm9sRGlzcG9zZWQoY29udHJvbCk7Ci0JCXRoaXMucmVtb3ZlQ29udHJvbChjb250cm9sKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUQ29tYm9BZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVENvbWJvQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzI1MjRkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUQ29tYm9BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotCi0vKioKLSAqIEFkYXB0IGFuIFNXVCB7QGxpbmsgQ29tYm99IHRvIHRoZSBsaXN0IHdpZGdldCBleHBlY3RlZCBieQotICoge0BsaW5rIExpc3RXaWRnZXRNb2RlbEJpbmRpbmd9IGFuZCB0aGUKLSAqIGRyb3AtZG93biBsaXN0IGJveCBleHBlY3RlZCBieSB7QGxpbmsgRHJvcERvd25MaXN0Qm94U2VsZWN0aW9uQmluZGluZ30uCi0gKi8KLWZpbmFsIGNsYXNzIFNXVENvbWJvQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcjxDb21ibz4KLQlpbXBsZW1lbnRzIERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmcuRHJvcERvd25MaXN0Qm94Ci17Ci0JU1dUQ29tYm9BZGFwdGVyKENvbWJvIGNvbWJvKSB7Ci0JCXN1cGVyKGNvbWJvKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JcHVibGljIFN0cmluZ1tdIGdldEl0ZW1zKCkgewotCQlyZXR1cm4gdGhpcy53aWRnZXQuZ2V0SXRlbXMoKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXRlbShpbnQgaW5kZXgsIFN0cmluZyBpdGVtKSB7Ci0JCXRoaXMud2lkZ2V0LnNldEl0ZW0oaW5kZXgsIGl0ZW0pOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtcyhTdHJpbmdbXSBpdGVtcykgewotCQl0aGlzLndpZGdldC5zZXRJdGVtcyhpdGVtcyk7Ci0JfQotCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSwgaW50IGluZGV4KSB7Ci0JCXRoaXMud2lkZ2V0LmFkZChpdGVtLCBpbmRleCk7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhpcy53aWRnZXQucmVtb3ZlKHN0YXJ0LCBlbmQpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZUFsbCgpOwotCX0KLQotCS8vICoqKioqKioqKiogQ29tYm9Cb3hTZWxlY3Rpb25CaW5kaW5nLkNvbWJvQm94IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0LmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNlbGVjdChpbnQgaW5kZXgpIHsKLQkJdGhpcy53aWRnZXQuc2VsZWN0KGluZGV4KTsKLQl9Ci0JcHVibGljIHZvaWQgZGVzZWxlY3QoaW50IGluZGV4KSB7Ci0JCXRoaXMud2lkZ2V0LmRlc2VsZWN0KGluZGV4KTsKLQl9Ci0JcHVibGljIHZvaWQgZGVzZWxlY3RBbGwoKSB7Ci0JCXRoaXMud2lkZ2V0LmRlc2VsZWN0QWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RMaXN0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RMaXN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjdiZTFiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU1dUTGlzdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLQotLyoqCi0gKiBBZGFwdCBhbiBTV1Qge0BsaW5rIExpc3R9IHRvIHRoZSBsaXN0IHdpZGdldCBleHBlY3RlZCBieQotICoge0BsaW5rIExpc3RXaWRnZXRNb2RlbEJpbmRpbmd9LgotICovCi1maW5hbCBjbGFzcyBTV1RMaXN0QWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RMaXN0V2lkZ2V0QWRhcHRlcjxMaXN0PgotewotCVNXVExpc3RBZGFwdGVyKExpc3QgbGlzdCkgewotCQlzdXBlcihsaXN0KTsKLQl9Ci0JcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy53aWRnZXQuYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLndpZGdldC5yZW1vdmVTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJdGVtcygpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0LmdldEl0ZW1zKCk7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEl0ZW0oaW50IGluZGV4LCBTdHJpbmcgaXRlbSkgewotCQl0aGlzLndpZGdldC5zZXRJdGVtKGluZGV4LCBpdGVtKTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0SXRlbXMoU3RyaW5nW10gaXRlbXMpIHsKLQkJdGhpcy53aWRnZXQuc2V0SXRlbXMoaXRlbXMpOwotCX0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGl0ZW0sIGludCBpbmRleCkgewotCQl0aGlzLndpZGdldC5hZGQoaXRlbSwgaW5kZXgpOwotCX0KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCXRoaXMud2lkZ2V0LnJlbW92ZShzdGFydCwgZW5kKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQl0aGlzLndpZGdldC5yZW1vdmVBbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVFRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NXVFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YjkzNTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC91dGlsaXR5L3N3dC9TV1RUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci0KLS8qKgotICogVmFyaW91cyBTV1QgdG9vbHMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFNXVFRvb2xzIHsKLQotCS8vICoqKioqKioqKiogY2hlY2stYm94L3JhZGlvIGJ1dHRvbi90b2dnbGUgYnV0dG9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBidXR0b24gKGNoZWNrLWJveCwgcmFkaW8gYnV0dG9uLCBvciB0b2dnbGUgYnV0dG9uKQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgYm9vbGVhbiBtb2RlbC4KLQkgKiBJZiB0aGUgYm9vbGVhbiBtb2RlbCBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgYnV0dG9uJ3MgJ3NlbGVjdGlvbicgc3RhdGUgd2lsbAotCSAqIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQnV0dG9uIGJ1dHRvbikgewotCQliaW5kKGJvb2xlYW5Nb2RlbCwgYnV0dG9uLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIGJ1dHRvbiAoY2hlY2stYm94LCByYWRpbyBidXR0b24sIG9yIHRvZ2dsZSBidXR0b24pCi0JICogdG8gdGhlIHNwZWNpZmllZCBib29sZWFuIG1vZGVsLgotCSAqIElmIHRoZSBib29sZWFuIG1vZGVsIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBidXR0b24ncyAnc2VsZWN0aW9uJyBzdGF0ZSB3aWxsCi0JICogYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBiaW5kKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQnV0dG9uIGJ1dHRvbiwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJLy8gdGhlIG5ldyBiaW5kaW5nIHdpbGwgYWRkIGl0c2VsZiBhcyBhIGxpc3RlbmVyIHRvIHRoZSBib29sZWFuIG1vZGVsIGFuZCB0aGUgYnV0dG9uCi0JCW5ldyBCb29sZWFuQnV0dG9uTW9kZWxCaW5kaW5nKGJvb2xlYW5Nb2RlbCwgYnV0dG9uLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXh0IGZpZWxkICoqKioqKioqKioKLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCB0ZXh0IG1vZGVsIHRvIHRoZSBzcGVjaWZpZWQgdGV4dCBmaWVsZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0TW9kZWwsIFRleHQgdGV4dEZpZWxkKSB7Ci0JCS8vIHRoZSBuZXcgYmluZGluZyB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdGV4dCBtb2RlbCBhbmQgdGhlIHRleHQgZmllbGQKLQkJbmV3IFRleHRGaWVsZE1vZGVsQmluZGluZyh0ZXh0TW9kZWwsIHRleHRGaWVsZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgYm94ICoqKioqKioqKioKLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVGhlIGxpc3QgYm94IHNlbGVjdGlvbiBpcyBpZ25vcmVkLgotCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGxpc3QgYm94LCB3aGljaCBjYWxscyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9Ci0JICogb24gdGhlIGl0ZW1zIGluIHRoZSBtb2RlbCBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIExpc3QgbGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgbGlzdEJveCwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGJveC4KLQkgKiBUaGUgbGlzdCBib3ggc2VsZWN0aW9uIGlzIGlnbm9yZWQuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBMaXN0IGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJYmluZChsaXN0TW9kZWwsIG5ldyBTV1RMaXN0QWRhcHRlcihsaXN0Qm94KSwgc3RyaW5nQ29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3gsIHdoaWNoIGNhbGxzIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0KLQkgKiBvbiB0aGUgaXRlbXMgaW4gdGhlIG1vZGVsIGxpc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtTW9kZWwsIExpc3QgbGlzdEJveCkgewotCQliaW5kKGxpc3RNb2RlbCwgc2VsZWN0ZWRJdGVtTW9kZWwsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEFkYXB0IHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCwgTGlzdCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWNoZWNrRm9yU2luZ2xlU2VsZWN0aW9uU3R5bGUobGlzdEJveCk7Ci0JCWJpbmQobGlzdE1vZGVsLCBuZXcgV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihzZWxlY3RlZEl0ZW1Nb2RlbCksIGxpc3RCb3gsIHN0cmluZ0NvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQmluZCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBsaXN0IGJveC4KLQkgKiBVc2UgdGhlIGRlZmF1bHQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveCwgd2hpY2ggY2FsbHMge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfQotCSAqIG9uIHRoZSBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbCwgTGlzdCBsaXN0Qm94KSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBzZWxlY3RlZEl0ZW1zTW9kZWwsIGxpc3RCb3gsIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IGFuZCBzZWxlY3Rpb25zIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBib3guCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IHNlbGVjdGVkSXRlbXNNb2RlbCwgTGlzdCBsaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWJpbmQoCi0JCQlsaXN0TW9kZWwsCi0JCQluZXcgU1dUTGlzdEFkYXB0ZXIobGlzdEJveCksCi0JCQlzdHJpbmdDb252ZXJ0ZXIsCi0JCQluZXcgTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4obGlzdE1vZGVsLCBzZWxlY3RlZEl0ZW1zTW9kZWwsIGxpc3RCb3gpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0ZvclNpbmdsZVNlbGVjdGlvblN0eWxlKExpc3QgbGlzdEJveCkgewotCQlpZiAoICEgQml0VG9vbHMuZmxhZ0lzU2V0KGxpc3RCb3guZ2V0U3R5bGUoKSwgU1dULlNJTkdMRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImxpc3QgYm94IG11c3QgYmUgc2luZ2xlLXNlbGVjdGlvbjogIiArIGxpc3RCb3gpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRyb3AtZG93biBsaXN0IGJveCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCBhbmQgc2VsZWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgZHJvcC1kb3duIGxpc3QgYm94LgotCSAqIFVzZSB0aGUgZGVmYXVsdCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3AtZG93biBsaXN0IGJveCwgd2hpY2ggY2FsbHMge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfQotCSAqIG9uIHRoZSBpdGVtcyBpbiB0aGUgbW9kZWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCwgQ29tYm8gZHJvcERvd25MaXN0Qm94KSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBzZWxlY3RlZEl0ZW1Nb2RlbCwgZHJvcERvd25MaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGFwdCB0aGUgc3BlY2lmaWVkIG1vZGVsIGxpc3QgYW5kIHNlbGVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIGRyb3AtZG93biBsaXN0IGJveC4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29udmVydGVyIHRvIGNvbnZlcnQgdGhlIG1vZGVsIGl0ZW1zIHRvIHN0cmluZ3MKLQkgKiB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIGRyb3AtZG93biBsaXN0IGJveC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiB2b2lkIGJpbmQoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdE1vZGVsLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCwgQ29tYm8gZHJvcERvd25MaXN0Qm94LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWNoZWNrRm9yUmVhZE9ubHlTdHlsZShkcm9wRG93bkxpc3RCb3gpOwotCQlTV1RDb21ib0FkYXB0ZXIgY29tYm9BZGFwdGVyID0gbmV3IFNXVENvbWJvQWRhcHRlcihkcm9wRG93bkxpc3RCb3gpOwotCQliaW5kKAotCQkJbGlzdE1vZGVsLAotCQkJY29tYm9BZGFwdGVyLAotCQkJc3RyaW5nQ29udmVydGVyLAotCQkJbmV3IERyb3BEb3duTGlzdEJveFNlbGVjdGlvbkJpbmRpbmc8RT4obGlzdE1vZGVsLCBzZWxlY3RlZEl0ZW1Nb2RlbCwgY29tYm9BZGFwdGVyKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JSZWFkT25seVN0eWxlKFdpZGdldCBjb21ib0JveCkgewotCQlpZiAoICEgQml0VG9vbHMuZmxhZ0lzU2V0KGNvbWJvQm94LmdldFN0eWxlKCksIFNXVC5SRUFEX09OTFkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb21iby1ib3ggbXVzdCBiZSByZWFkLW9ubHk6ICIgKyBjb21ib0JveCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCAid2lkZ2V0IiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCaW5kIHRoZSBzcGVjaWZpZWQgbW9kZWwgbGlzdCB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgd2lkZ2V0LgotCSAqIFRoZSBsaXN0IHdpZGdldCdzIHNlbGVjdGlvbiBpcyBpZ25vcmVkLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUgbW9kZWwgaXRlbXMgdG8gc3RyaW5ncwotCSAqIHRvIGJlIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IHZvaWQgYmluZChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0TW9kZWwsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuTGlzdFdpZGdldCBsaXN0V2lkZ2V0LCBTdHJpbmdDb252ZXJ0ZXI8RT4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCWJpbmQobGlzdE1vZGVsLCBsaXN0V2lkZ2V0LCBzdHJpbmdDb252ZXJ0ZXIsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZy5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIEJpbmQgdGhlIHNwZWNpZmllZCBtb2RlbCBsaXN0IHRvIHRoZSBzcGVjaWZpZWQgbGlzdCB3aWRnZXQuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc2VsZWN0aW9uIGJpbmRpbmcgdG8gY29udHJvbCB0aGUgbGlzdCB3aWRnZXQncyBzZWxlY3Rpb24uCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnZlcnRlciB0byBjb252ZXJ0IHRoZSBtb2RlbCBpdGVtcyB0byBzdHJpbmdzCi0JICogdG8gYmUgZGlzcGxheWVkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gdm9pZCBiaW5kKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RNb2RlbCwgTGlzdFdpZGdldE1vZGVsQmluZGluZy5MaXN0V2lkZ2V0IGxpc3RXaWRnZXQsIFN0cmluZ0NvbnZlcnRlcjxFPiBzdHJpbmdDb252ZXJ0ZXIsIExpc3RXaWRnZXRNb2RlbEJpbmRpbmcuU2VsZWN0aW9uQmluZGluZyBzZWxlY3Rpb25CaW5kaW5nKSB7Ci0JCS8vIHRoZSBuZXcgYmluZGluZyB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdmFsdWUgbW9kZWxzIGFuZCB0aGUgbGlzdCBib3gKLQkJbmV3IExpc3RXaWRnZXRNb2RlbEJpbmRpbmc8RT4obGlzdE1vZGVsLCBsaXN0V2lkZ2V0LCBzdHJpbmdDb252ZXJ0ZXIsIHNlbGVjdGlvbkJpbmRpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiAnZW5hYmxlZCcgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wuLi4gY29udHJvbHMpIHsKLQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sW10gY29udHJvbHMsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN3aXRjaCAoY29udHJvbHMubGVuZ3RoKSB7Ci0JCQljYXNlIDA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZW1wdHkgY29udHJvbHMgYXJyYXk6ICIgKyBBcnJheXMudG9TdHJpbmcoY29udHJvbHMpKTsKLQkJCWNhc2UgMToKLQkJCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNbMF0sIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29udHJvbD4oY29udHJvbHMpLCBkZWZhdWx0VmFsdWUpOwotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scykgewotCQljb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT5lbmFibGVkPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbEVuYWJsZWRTdGF0ZShib29sZWFuTW9kZWwsIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIDxjb2RlPmZhbHNlPGNvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sRW5hYmxlZFN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsKSB7Ci0JCWNvbnRyb2xFbmFibGVkU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9sc01vZGVsLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udHJvbCB0aGUgPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2xzIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9scycKLQkgKiA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlcyB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbChib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGRlZmF1bHRWYWx1ZSwgRU5BQkxFRF9BREFQVEVSKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+ZW5hYmxlZDwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbCdzCi0JICogPGVtPmVuYWJsZWQ8L2VtPiBzdGF0ZSB3aWxsIGJlIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWNvbnRyb2woYm9vbGVhbk1vZGVsLCBjb250cm9sLCBkZWZhdWx0VmFsdWUsIEVOQUJMRURfQURBUFRFUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyIEVOQUJMRURfQURBUFRFUiA9Ci0JCQluZXcgQm9vbGVhblN0YXRlQ29udHJvbGxlci5BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNldFN0YXRlKENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBiKSB7Ci0JCQkJCWNvbnRyb2wuc2V0RW5hYmxlZChiKTsKLQkJCQl9Ci0JCQl9OwotICAgCi0KLQkvLyAqKioqKioqKioqICd2aXNpYmxlJyBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbC4uLiBjb250cm9scykgewotCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgY29udHJvbHMsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2xbXSBjb250cm9scywgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3dpdGNoIChjb250cm9scy5sZW5ndGgpIHsKLQkJCWNhc2UgMDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJlbXB0eSBjb250cm9scyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhjb250cm9scykpOwotCQkJY2FzZSAxOgotCQkJCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9sc1swXSwgZGVmYXVsdFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb250cm9sPihjb250cm9scyksIGRlZmF1bHRWYWx1ZSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzKSB7Ci0JCWNvbnRyb2xWaXNpYmxlU3RhdGUoYm9vbGVhbk1vZGVsLCBjb250cm9scywgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT52aXNpYmxlPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9scyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuLiBJZiB0aGUgYm9vbGVhbiBpcyA8Y29kZT5udWxsPGNvZGU+LCB0aGUgY29udHJvbHMnCi0JICogPGVtPnZpc2libGU8L2VtPiBzdGF0ZXMgd2lsbCBiZSB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgSXRlcmFibGU8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQljb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Nb2RlbCwgbmV3IFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbnRyb2w+KGNvbnRyb2xzKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgPGNvZGU+ZmFsc2U8Y29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnRyb2xWaXNpYmxlU3RhdGUoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIENvbnRyb2w+IGNvbnRyb2xzTW9kZWwpIHsKLQkJY29udHJvbFZpc2libGVTdGF0ZShib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cm9sIHRoZSA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgY29udHJvbHMgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbi4gSWYgdGhlIGJvb2xlYW4gaXMgPGNvZGU+bnVsbDxjb2RlPiwgdGhlIGNvbnRyb2xzJwotCSAqIDxlbT52aXNpYmxlPC9lbT4gc3RhdGVzIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb250cm9sPiBjb250cm9sc01vZGVsLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQljb250cm9sKGJvb2xlYW5Nb2RlbCwgY29udHJvbHNNb2RlbCwgZGVmYXVsdFZhbHVlLCBWSVNJQkxFX0FEQVBURVIpOwotCX0KLQotCS8qKgotCSAqIENvbnRyb2wgdGhlIDxlbT52aXNpYmxlPC9lbT4gc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9sIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4uIElmIHRoZSBib29sZWFuIGlzIDxjb2RlPm51bGw8Y29kZT4sIHRoZSBjb250cm9sJ3MKLQkgKiA8ZW0+dmlzaWJsZTwvZW0+IHN0YXRlIHdpbGwgYmUgdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb250cm9sVmlzaWJsZVN0YXRlKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJY29udHJvbChib29sZWFuTW9kZWwsIGNvbnRyb2wsIGRlZmF1bHRWYWx1ZSwgVklTSUJMRV9BREFQVEVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIgVklTSUJMRV9BREFQVEVSID0KLQkJCW5ldyBCb29sZWFuU3RhdGVDb250cm9sbGVyLkFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2V0U3RhdGUoQ29udHJvbCBjb250cm9sLCBib29sZWFuIGIpIHsKLQkJCQkJY29udHJvbC5zZXRWaXNpYmxlKGIpOwotCQkJCX0KLQkJCX07Ci0gICAKLQotCS8vICoqKioqKioqKiogYm9vbGVhbiBzdGF0ZSBjb250cm9sbGVyICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udHJvbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29udHJvbD4gY29udHJvbHNNb2RlbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUsIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlciBhZGFwdGVyKSB7Ci0JCS8vIHRoZSBuZXcgY29udHJvbGxlciB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdmFsdWUgbW9kZWwgYW5kIHRoZSBjb250cm9scwotCQluZXcgTXVsdGlDb250cm9sQm9vbGVhblN0YXRlQ29udHJvbGxlcihib29sZWFuTW9kZWwsIGNvbnRyb2xzTW9kZWwsIGRlZmF1bHRWYWx1ZSwgYWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb250cm9sKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuTW9kZWwsIENvbnRyb2wgY29udHJvbCwgYm9vbGVhbiBkZWZhdWx0VmFsdWUsIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuQWRhcHRlciBhZGFwdGVyKSB7Ci0JCS8vIHRoZSBuZXcgY29udHJvbGxlciB3aWxsIGFkZCBpdHNlbGYgYXMgYSBsaXN0ZW5lciB0byB0aGUgdmFsdWUgbW9kZWwgYW5kIHRoZSBjb250cm9scwotCQluZXcgU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlcihib29sZWFuTW9kZWwsIGNvbnRyb2wsIGRlZmF1bHRWYWx1ZSwgYWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBTV1RUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1NpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjM4YmIzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvU2ltcGxlQm9vbGVhblN0YXRlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi0vKioKLSAqIFRoaXMgY29udHJvbGxlciBlbmFibGVzIGEgYm9vbGVhbiBtb2RlbCB0byBjb250cm9sIGVpdGhlciB0aGUKLSAqIDxlbT5lbmFibGVkPC9lbT4gb3IgPGVtPnZpc2libGU8L2VtPiBwcm9wZXJ0aWVzIG9mIGFuIFNXVCBjb250cm9sOyBpLmUuIHRoZQotICogY29udHJvbCdzIHByb3BlcnR5IGlzIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgYm9vbGVhbiBtb2RlbCwKLSAqIGJ1dCA8ZW0+bm90PC9lbT4gdmljZS12ZXJzYS4KLSAqIDxwPgotICogT25jZSB0aGUgY29udHJvbCBpcyBkaXNwb3NlZCwgdGhpcyBjb250cm9sbGVyIGlzIGthcHV0LgotICogCi0gKiBAc2VlIFByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBDb250cm9sI3NldEVuYWJsZWQoYm9vbGVhbikKLSAqIEBzZWUgQ29udHJvbCNzZXRWaXNpYmxlKGJvb2xlYW4pCi0gKi8KLWZpbmFsIGNsYXNzIFNpbXBsZUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIKLQlleHRlbmRzIEJvb2xlYW5TdGF0ZUNvbnRyb2xsZXIKLXsKLQlwcml2YXRlIGZpbmFsIENvbnRyb2wgY29udHJvbDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIG1vZGVsLCB0aGUgY29udHJvbCwgYW5kIHRoZSBhZGFwdGVyIGFyZSByZXF1aXJlZC4KLQkgKi8KLQlTaW1wbGVCb29sZWFuU3RhdGVDb250cm9sbGVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwKLQkJCUNvbnRyb2wgY29udHJvbCwKLQkJCWJvb2xlYW4gZGVmYXVsdFZhbHVlLAotCQkJQWRhcHRlciBhZGFwdGVyCi0JKSB7Ci0JCXN1cGVyKGJvb2xlYW5Nb2RlbCwgZGVmYXVsdFZhbHVlLCBhZGFwdGVyKTsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb250cm9sID0gY29udHJvbDsKLQkJdGhpcy5lbmdhZ2VCb29sZWFuTW9kZWwoKTsKLQkJdGhpcy5lbmdhZ2VDb250cm9sKGNvbnRyb2wpOwotCQl0aGlzLnNldENvbnRyb2xTdGF0ZShjb250cm9sLCB0aGlzLmdldEJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udHJvbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jdm9pZCBzZXRDb250cm9sU3RhdGUoYm9vbGVhbiBiKSB7Ci0JCXRoaXMuc2V0Q29udHJvbFN0YXRlKHRoaXMuY29udHJvbCwgYik7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjb250cm9sRGlzcG9zZWQoQ29udHJvbCBjKSB7Ci0JCXN1cGVyLmNvbnRyb2xEaXNwb3NlZChjKTsKLQkJdGhpcy5kaXNlbmdhZ2VCb29sZWFuTW9kZWwoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3V0aWxpdHkvc3d0L1RleHRGaWVsZE1vZGVsQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMwY2UxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoaXMgYmluZGluZyBjYW4gYmUgdXNlZCB0byBrZWVwIGEgdGV4dCBmaWVsZAotICogc3luY2hyb25pemVkIHdpdGggYSBtb2RlbCB0ZXh0L3N0cmluZy4KLSAqIAotICogQHNlZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbAotICogQHNlZSBUZXh0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotY2xhc3MgVGV4dEZpZWxkTW9kZWxCaW5kaW5nIHsKLQotCS8qKgotCSAqIFRoZSB0ZXh0IG1vZGVsIHdlIGtlZXAgc3luY2hyb25pemVkIHdpdGggdGhlIHRleHQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRNb2RlbDsKLQotCS8qKgotCSAqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgdGhlIHRleHQgZmllbGQncyBjb250ZW50cyB3aXRoCi0JICogdGhlIHRleHQgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHRleHRNb2RlbENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIHRleHQgZmllbGQgd2Uga2VlcCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgdGV4dCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRleHQgdGV4dEZpZWxkOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSBvdXIgdGV4dCBtb2RlbAotCSAqIHdpdGggdGhlIHRleHQgZmllbGQncyBjb250ZW50cy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1vZGlmeUxpc3RlbmVyIHRleHRGaWVsZE1vZGlmeUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzdG9wIGxpc3RlbmluZyB0byBzdHVmZiB3aGVuIHRoZSB0ZXh0IGZpZWxkCi0JICogaXMgZGlzcG9zZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBEaXNwb3NlTGlzdGVuZXIgdGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyOwotCi0JLyoqCi0JICogSG1tLi4uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNldHRpbmdUZXh0RmllbGRUZXh0ID0gZmFsc2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdGV4dCBtb2RlbCBhbmQgdGV4dCBmaWVsZCBhcmUgcmVxdWlyZWQuCi0JICovCi0JVGV4dEZpZWxkTW9kZWxCaW5kaW5nKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dE1vZGVsLCBUZXh0IHRleHRGaWVsZCkgewotCQlzdXBlcigpOwotCQlpZiAoKHRleHRNb2RlbCA9PSBudWxsKSB8fCAodGV4dEZpZWxkID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnRleHRNb2RlbCA9IHRleHRNb2RlbDsKLQkJdGhpcy50ZXh0RmllbGQgPSB0ZXh0RmllbGQ7Ci0KLQkJdGhpcy50ZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRleHRNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50ZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy50ZXh0RmllbGRNb2RpZnlMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXh0RmllbGRNb2RpZnlMaXN0ZW5lcigpOwotCQl0aGlzLnRleHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzLnRleHRGaWVsZE1vZGlmeUxpc3RlbmVyKTsKLQotCQl0aGlzLnRleHRGaWVsZERpc3Bvc2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUZXh0RmllbGREaXNwb3NlTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0RmllbGQuYWRkRGlzcG9zZUxpc3RlbmVyKHRoaXMudGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyKTsKLQotCQl0aGlzLnNldFRleHRGaWVsZFRleHQodGV4dE1vZGVsLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXh0TW9kZWxDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkVGV4dE1vZGVsQ2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRleHRNb2RlbENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmcudGhpcy50ZXh0TW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRleHQgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTW9kaWZ5TGlzdGVuZXIgYnVpbGRUZXh0RmllbGRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmcudGhpcy50ZXh0RmllbGRNb2RpZmllZCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGV4dCBmaWVsZCBtb2RpZnkgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRGlzcG9zZUxpc3RlbmVyIGJ1aWxkVGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCVRleHRGaWVsZE1vZGVsQmluZGluZy50aGlzLnRleHRGaWVsZERpc3Bvc2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0ZXh0IGZpZWxkIGRpc3Bvc2UgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXh0IG1vZGVsIGV2ZW50cyAqKioqKioqKioqCi0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgdGV4dE1vZGVsQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICggISB0aGlzLnRleHRGaWVsZC5pc0Rpc3Bvc2VkKCkpIHsgIC8vID8/PwotCQkJdGhpcy5zZXRUZXh0RmllbGRUZXh0KChTdHJpbmcpIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRGaWVsZFRleHQoU3RyaW5nIHRleHQpIHsKLQkJLy8gdGhlIHRleHQgbW9kZWwgY2FuIGJlIG51bGwsIGJ1dCB0aGUgdGV4dCBmaWVsZCBjYW5ub3QKLQkJdGhpcy5zZXRUZXh0RmllbGRUZXh0XygodGV4dCA9PSBudWxsKSA/ICIiIDogdGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRGaWVsZFRleHRfKFN0cmluZyB0ZXh0KSB7Ci0JCWlmICggISB0ZXh0LmVxdWFscyh0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkpKSB7ICAvLyA/Pz8KLQkJCXRoaXMuc2V0VGV4dEZpZWxkVGV4dF9fKHRleHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRGaWVsZFRleHRfXyhTdHJpbmcgdGV4dCkgewotCQl0aGlzLnNldHRpbmdUZXh0RmllbGRUZXh0ID0gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGV4dEZpZWxkLnNldFRleHQodGV4dCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLnNldHRpbmdUZXh0RmllbGRUZXh0ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGV4dCBmaWVsZCBldmVudHMgKioqKioqKioqKgotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHRleHRGaWVsZE1vZGlmaWVkKCkgewotCQlpZiAoICEgdGhpcy5zZXR0aW5nVGV4dEZpZWxkVGV4dCkgewotCQkJdGhpcy5zZXRUZXh0TW9kZWxUZXh0KHRoaXMudGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGV4dE1vZGVsVGV4dChTdHJpbmcgdGV4dCkgewotCQlpZiAoICEgdGV4dC5lcXVhbHModGhpcy50ZXh0TW9kZWwuZ2V0VmFsdWUoKSkpIHsgIC8vID8/PwotCQkJdGhpcy50ZXh0TW9kZWwuc2V0VmFsdWUodGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgdGV4dEZpZWxkRGlzcG9zZWQoKSB7Ci0JCS8vIHRoZSB0ZXh0IGZpZWxkIGlzIG5vdCB5ZXQgImRpc3Bvc2VkIiB3aGVuIHdlIHJlY2VpdmUgdGhpcyBldmVudAotCQkvLyBzbyB3ZSBjYW4gc3RpbGwgcmVtb3ZlIG91ciBsaXN0ZW5lcnMKLQkJdGhpcy50ZXh0RmllbGQucmVtb3ZlRGlzcG9zZUxpc3RlbmVyKHRoaXMudGV4dEZpZWxkRGlzcG9zZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXh0RmllbGQucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcy50ZXh0RmllbGRNb2RpZnlMaXN0ZW5lcik7Ci0JCXRoaXMudGV4dE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRleHRNb2RlbENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnRleHRNb2RlbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlTGlzdFBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVMaXN0UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWVmZTJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVMaXN0UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IHVzZXMgYSA8Y29kZT5UYWJsZTwvY29kZT4KLSAqIGFzIGl0cyBtYWluIHdpZGdldCwgYSA8Y29kZT5MaXN0PC9jb2RlPiBjYW4ndCBiZSB1c2VkIGJlY2F1c2UgaXQgZG9lc24ndAotICogc3VwcG9ydCBzaG93aW5nIGltYWdlcy4gSG93ZXZlciwgdGhlIHRhYmxlIGlzIGRpc3BsYXllZCBsaWtlIGEgbGlzdC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3Qgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0gfAotICogfCB8IEl0ZW0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQWRkLi4uICB8IHwKLSAqIHwgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgSXRlbSBuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgRWRpdC4uLiB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgUmVtb3ZlICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQWRkUmVtb3ZlTGlzdFBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIEFkZFJlbW92ZVBhbmU8VD4KLXsKLQotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIGFkZC9yZW1vdmUgcGFuZS4KLQkgKi8KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLAotCQkgICAgICBwYXJlbnQsCi0JCSAgICAgIGFkYXB0ZXIsCi0JCSAgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgIHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICAgaGVscElkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSB0YWJsZSBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZQotCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VQYW5lIDxjb2RlPnRydWU8L2NvZGU+IHRvIGhhdmUgdGhlIHBhcmVudCBwYW5lIG1hbmFnZQotCSAqIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgcGFuZQotCSAqLwotCXB1YmxpYyBBZGRSZW1vdmVMaXN0UGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBwYXJlbnRNYW5hZ2VQYW5lKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCwKLQkJICAgICAgcGFyZW50TWFuYWdlUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVMaXN0UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIHRhYmxlIGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZUxpc3RQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgdGFibGUgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlTGlzdFBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgc3ViamVjdEhvbGRlciwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5BZGFwdGVyPE9iamVjdD4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbHVtbkFkYXB0ZXI8T2JqZWN0PigpIHsKLQkJCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoT2JqZWN0IHN1YmplY3QpIHsKLQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIHZhbHVlSG9sZGVycyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PlsxXTsKLQkJCQl2YWx1ZUhvbGRlcnNbMF0gPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oc3ViamVjdCk7Ci0JCQkJcmV0dXJuIHZhbHVlSG9sZGVyczsKLQkJCX0KLQotCQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCQlyZXR1cm4gMTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiAiIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCXN1cGVyLml0ZW1zQWRkZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQlzdXBlci5pdGVtc01vdmVkKGUpOwotCQlyZXZhbGlkYXRlTGF5b3V0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCXN1cGVyLml0ZW1zUmVtb3ZlZChlKTsKLQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCXN1cGVyLml0ZW1zUmVwbGFjZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQlzdXBlci5saXN0Q2hhbmdlZChlKTsKLQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJc3VwZXIubGlzdENsZWFyZWQoZSk7Ci0JCXJldmFsaWRhdGVMYXlvdXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXZhbGlkYXRlcyB0aGUgdGFibGUgbGF5b3V0IGFmdGVyIHRoZSBsaXN0IG9mIGl0ZW1zIGhhcyBjaGFuZ2VkLiBUaGUKLQkgKiBsYXlvdXQgaGFzIHRvIGJlIGRvbmUgaW4gYSBuZXcgVUkgdGhyZWFkIGJlY2F1c2Ugb3VyIGxpc3RlbmVyIG1pZ2h0IGJlCi0JICogbm90aWZpZWQgYmVmb3JlIHRoZSB0YWJsZSBoYXMgYmVlbiB1cGRhdGVkICh0YWJsZSBjb2x1bW4gYWRkZWQgb3IgcmVtb3ZlZCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJldmFsaWRhdGVMYXlvdXQoKSB7Ci0JCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKCF0YWJsZS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQl0YWJsZS5nZXRQYXJlbnQoKS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQkJCXRhYmxlLmdldFBhcmVudCgpLmxheW91dCgpOwotCQkJfQotCQl9fSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWdldFNlbGVjdGlvbk1vZGVsKCkuc2V0U2VsZWN0ZWRWYWx1ZShlLmdldE5ld1ZhbHVlKCkpOwotCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPE9iamVjdD4gYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxPYmplY3Q+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxPYmplY3Q+IGUpIHsKLQkJCQlBZGRSZW1vdmVMaXN0UGFuZS50aGlzLnNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhZGRUYWJsZUNvbnRhaW5lcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkUGFuZShjb250YWluZXIsIGJ1aWxkVGFibGVDb250YWluZXJMYXlvdXQoKSk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIExheW91dCBidWlsZFRhYmxlQ29udGFpbmVyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCVRhYmxlIHRhYmxlID0gKFRhYmxlKSBjb21wb3NpdGUuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJCQlUYWJsZUNvbHVtbiB0YWJsZUNvbHVtbiA9IHRhYmxlLmdldENvbHVtbigwKTsKLQkJCQlpbnQgY29sdW1uV2lkdGggPSB0YWJsZUNvbHVtbi5nZXRXaWR0aCgpOwotCQkJCXBhY2tDb2x1bW4odGFibGUpOwotCi0JCQkJLy8gQ2FsY3VsYXRlIHRoZSB0YWJsZSBzaXplIGFuZCBhZGp1c3QgaXQgd2l0aCB0aGUgaGludHMKLQkJCQlQb2ludCBzaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQkJCWlmICh3aWR0aEhpbnQgIT0gU1dULkRFRkFVTFQpIHsKLQkJCQkJc2l6ZS54ID0gd2lkdGhIaW50OwotCQkJCX0KLQotCQkJCWlmIChoZWlnaHRIaW50ICE9IFNXVC5ERUZBVUxUKSB7Ci0JCQkJCXNpemUueSA9IGhlaWdodEhpbnQ7Ci0JCQkJfQotCi0JCQkJLy8gUmV2ZXJ0IHRoZSBjb2x1bW4ncyB3aWR0aCB0byBpdHMgY3VycmVudCB2YWx1ZQotCQkJCXRhYmxlLnNldFJlZHJhdyhmYWxzZSk7Ci0JCQkJdGFibGUuc2V0TGF5b3V0RGVmZXJyZWQodHJ1ZSk7Ci0JCQkJdGFibGVDb2x1bW4uc2V0V2lkdGgoY29sdW1uV2lkdGgpOwotCQkJCXRhYmxlLnNldExheW91dERlZmVycmVkKGZhbHNlKTsKLQkJCQl0YWJsZS5zZXRSZWRyYXcodHJ1ZSk7Ci0KLQkJCQlyZXR1cm4gc2l6ZTsKLQkJCX0KLQotCQkJcHJpdmF0ZSBib29sZWFuIGlzVmVydGljYWxTY3JvbGxiYXJCYXJWaXNpYmxlKFRhYmxlIHRhYmxlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY3RhbmdsZSBjbGllbnRBcmVhKSB7Ci0KLQkJCQkvLyBHZXQgdGhlIGhlaWdodCBvZiBhbGwgdGhlIHJvd3MKLQkJCQlpbnQgaGVpZ2h0ID0gdGFibGUuZ2V0SXRlbUNvdW50KCkgKiB0YWJsZS5nZXRJdGVtSGVpZ2h0KCk7Ci0KLQkJCQkvLyBSZW1vdmUgdGhlIGJvcmRlciBmcm9tIHRoZSBoZWlnaHQKLQkJCQloZWlnaHQgKz0gKHRhYmxlLmdldEJvcmRlcldpZHRoKCkgKiAyKTsKLQotCQkJCXJldHVybiAoY2xpZW50QXJlYS5oZWlnaHQgPCBoZWlnaHQpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGxheW91dChDb21wb3NpdGUgY29tcG9zaXRlLCBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCVJlY3RhbmdsZSBib3VuZHMgPSBjb21wb3NpdGUuZ2V0Q2xpZW50QXJlYSgpOwotCi0JCQkJaWYgKGJvdW5kcy53aWR0aCA+IDApIHsKLQotCQkJCQlUYWJsZSB0YWJsZSA9IChUYWJsZSkgY29tcG9zaXRlLmdldENoaWxkcmVuKClbMF07Ci0JCQkJCXRhYmxlLnNldEJvdW5kcygwLCAwLCBib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCi0JCQkJCXVwZGF0ZVRhYmxlQ29sdW1uV2lkdGgoCi0JCQkJCQl0YWJsZSwKLQkJCQkJCWJvdW5kcy53aWR0aCwKLQkJCQkJCWlzVmVydGljYWxTY3JvbGxiYXJCYXJWaXNpYmxlKHRhYmxlLCBib3VuZHMpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgcGFja0NvbHVtbihUYWJsZSB0YWJsZSkgewotCi0JCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0KLQkJCQl0YWJsZS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCXRhYmxlLnNldExheW91dERlZmVycmVkKHRydWUpOwotCQkJCXRhYmxlQ29sdW1uLnBhY2soKTsKLQkJCQl0YWJsZS5zZXRMYXlvdXREZWZlcnJlZChmYWxzZSk7Ci0JCQkJdGFibGUuc2V0UmVkcmF3KHRydWUpOwotCi0JCQkJLy8gQ2FjaGUgdGhlIGNvbHVtbiB3aWR0aCBzbyBpdCBjYW4gYmUgdXNlZCBpbgotCQkJCS8vIHVwZGF0ZVRhYmxlQ29sdW1uV2lkdGgoKSB3aGVuIGRldGVybWluZSB3aGljaCB3aWR0aCB0byB1c2UKLQkJCQl0YWJsZS5zZXREYXRhKAotCQkJCQkiY29sdW1uLndpZHRoIiwKLQkJCQkJSW50ZWdlci52YWx1ZU9mKHRhYmxlQ29sdW1uLmdldFdpZHRoKCkpCi0JCQkJKTsKLQkJCX0KLQotCQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmxlQ29sdW1uV2lkdGgoVGFibGUgdGFibGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHZlcnRpY2FsU2Nyb2xsYmFyQmFyVmlzaWJsZSkgewotCi0JCQkJLy8gUmVtb3ZlIHRoZSBib3JkZXIgZnJvbSB0aGUgd2lkdGgKLQkJCQl3aWR0aCAtPSAodGFibGUuZ2V0Qm9yZGVyV2lkdGgoKSAqIDIpOwotCi0JCQkJLy8gUmVtb3ZlIHRoZSBzY3JvbGxiYXIgZnJvbSB0aGUgd2lkdGggaWYgaXQgaXMgc2hvd24KLQkJCQlpZiAodmVydGljYWxTY3JvbGxiYXJCYXJWaXNpYmxlKSB7Ci0JCQkJCXdpZHRoIC09IHRhYmxlLmdldFZlcnRpY2FsQmFyKCkuZ2V0U2l6ZSgpLng7Ci0JCQkJfQotCi0JCQkJVGFibGVDb2x1bW4gdGFibGVDb2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oMCk7Ci0KLQkJCQkvLyBSZXRyaWV2ZSB0aGUgY2FjaGVkIGNvbHVtbiB3aWR0aCwgd2hpY2ggaXMgcmVxdWlyZWQgZm9yCi0JCQkJLy8gZGV0ZXJtaW5pbmcgd2hpY2ggd2lkdGggdG8gdXNlICh0aGUgY29sdW1uIHdpZHRoIG9yIHRoZQotCQkJCS8vIGNhbGN1bGF0ZWQgd2lkdGgpCi0JCQkJSW50ZWdlciBjb2x1bW5XaXRkaCA9IChJbnRlZ2VyKSB0YWJsZS5nZXREYXRhKCJjb2x1bW4ud2lkdGgiKTsKLQotCQkJCS8vIFVzZSB0aGUgY2FsY3VsYXRlZCB3aWR0aCBpZiB0aGUgY29sdW1uIGlzIHNtYWxsZXIsIG90aGVyd2lzZQotCQkJCS8vIHVzZSB0aGUgY29sdW1uIHdpZHRoIGFuZCBhIGhvcml6b250YWwgc2Nyb2xsIGJhciB3aWxsIHNob3cgdXAKLQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjb2x1bW5XaXRkaCk7Ci0KLQkJCQkvLyBBZGp1c3QgdGhlIGNvbHVtbiB3aWR0aAotCQkJCXRhYmxlQ29sdW1uLnNldFdpZHRoKHdpZHRoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElUYWJsZUxhYmVsUHJvdmlkZXIgYnVpbGRUYWJsZUxhYmVsUHJvdmlkZXIoSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKElMYWJlbFByb3ZpZGVyKSBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TWFpbkNvbnRyb2woKSB7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFpbkNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJdGFibGUgPSBhZGRVbm1hbmFnZWRUYWJsZSgKLQkJCWFkZFRhYmxlQ29udGFpbmVyKGNvbnRhaW5lciksCi0JCQlTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQotCi0JCVRhYmxlTW9kZWxBZGFwdGVyIG1vZGVsID0gVGFibGVNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQkoTGlzdFZhbHVlTW9kZWw8T2JqZWN0PikgbGlzdEhvbGRlciwKLQkJCWdldFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkVGFibGVMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpCi0JCSk7Ci0KLQkJbW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgZ2l2ZW4gdGFibGUsIHdoaWNoIGFjdHMgbGlrZSBhIGxpc3QgaW4gb3VyIGNhc2UuCi0JICoKLQkgKiBAcGFyYW0gdGFibGUgVGhlIG1haW4gd2lkZ2V0IG9mIHRoaXMgcGFuZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZShUYWJsZSB0YWJsZSkgewotCi0JCXRhYmxlLnNldERhdGEoImNvbHVtbi53aWR0aCIsIG5ldyBJbnRlZ2VyKDApKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZShmYWxzZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZCwgdXBkYXRlICgxKSB0aGUgc2VsZWN0ZWQgaXRlbSBob2xkZXIsICgyKSB0aGUKLQkgKiBzZWxlY3Rpb24gbW9kZWwgYW5kICgzKSB0aGUgYnV0dG9ucy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZCgpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBnZXRTZWxlY3RlZEl0ZW1Ib2xkZXIoKTsKLQkJT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsID0gZ2V0U2VsZWN0aW9uTW9kZWwoKTsKLQkJaW50IHNlbGVjdGlvbkNvdW50ID0gdGhpcy50YWJsZS5nZXRTZWxlY3Rpb25Db3VudCgpOwotCi0JCWlmIChzZWxlY3Rpb25Db3VudCA9PSAwKSB7Ci0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQlzZWxlY3Rpb25Nb2RlbC5jbGVhclNlbGVjdGlvbigpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGlvbkNvdW50ICE9IDEpIHsKLQkJCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCXNlbGVjdGlvbk1vZGVsLmNsZWFyU2VsZWN0aW9uKCk7Ci0KLQkJCWZvciAoaW50IGluZGV4IDogdGhpcy50YWJsZS5nZXRTZWxlY3Rpb25JbmRpY2VzKCkpIHsKLQkJCQlzZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3Rpb25JbnRlcnZhbChpbmRleCwgaW5kZXgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW50IHNlbGVjdGVkSW5kZXggPSB0aGlzLnRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlPYmplY3Qgc2VsZWN0ZWRJdGVtID0gZ2V0TGlzdEhvbGRlcigpLmdldChzZWxlY3RlZEluZGV4KTsKLQotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCQlzZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCX0KLQotCQl1cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBsYWJlbCBwcm92aWRlciBzaW1wbHkgZGVsZWdhdGVzIHRoZSByZW5kZXJpbmcgdG8gdGhlIHByb3ZpZGVkCi0JICogPGNvZGU+SUxhYmVsUHJvdmlkZXI8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlcgotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyOwotCi0JCVRhYmxlTGFiZWxQcm92aWRlcihJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5sYWJlbFByb3ZpZGVyID0gbGFiZWxQcm92aWRlcjsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbGFiZWxQcm92aWRlci5nZXRUZXh0KGVsZW1lbnQpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQWRkUmVtb3ZlUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWQ2MTc1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHBhbmUgdGhhdCBoYXMgYnV0dG9ucyBmb3IgYWRkaW5nLCByZW1vdmluZyBhbmQKLSAqIHBvc3NpYmx5IGVkaXRpbmcgdGhlIGl0ZW1zLgotICoKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFJlbW92ZVBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIFBhbmU8VD4KLXsKLQlwcml2YXRlIEFkYXB0ZXIgYWRhcHRlcjsKLQlwcml2YXRlIEJ1dHRvbiBhZGRCdXR0b247Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29udGFpbmVyOwotCXByaXZhdGUgYm9vbGVhbiBlbmFibGVkOwotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCXByaXZhdGUgQnV0dG9uIG9wdGlvbmFsQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhZGFwdGVyLAotCQkgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgQWRkUmVtb3ZlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsCi0JCSAgICAgcGFyZW50LAotCQkgICAgIGFkYXB0ZXIsCi0JCSAgICAgbGlzdEhvbGRlciwKLQkJICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgbGFiZWxQcm92aWRlciwKLQkJICAgICBoZWxwSWQsCi0JCSAgICAgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICogQHBhcmFtIHBhcmVudE1hbmFnZVBhbmUgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gaGF2ZSB0aGUgcGFyZW50IHBhbmUgbWFuYWdlCi0JICogdGhlIGVuYWJsZWQgc3RhdGUgb2YgdGhpcyBwYW5lCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLCAKLQkgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIHRydWUsIHBhcmVudE1hbmFnZVBhbmUpOwotCi0JCWluaXRpYWxpemUoCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIKLQkJKTsKLQotCQlpbml0aWFsaXplTGF5b3V0KAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXRoaXMocGFyZW50UGFuZSwKLQkJICAgICBzdWJqZWN0SG9sZGVyLAotCQkgICAgIHBhcmVudCwKLQkJICAgICBhZGFwdGVyLAotCQkgICAgIGxpc3RIb2xkZXIsCi0JCSAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdAotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHJvdGVjdGVkIEFkZFJlbW92ZVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQotCQlpbml0aWFsaXplKAotCQkJYWRhcHRlciwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJaW5pdGlhbGl6ZUxheW91dCgKLQkJCWFkYXB0ZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJbGFiZWxQcm92aWRlciwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIEdpdmVzIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgYnV0dG9ucyBhZnRlciB0aGUgQWRkIGJ1dHRvbiBhbmQgYmVmb3JlIHRoZQotCSAqIG9wdGlvbmFsIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyQWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCX0KLQotCS8qKgotCSAqIEdpdmVzIHRoZSBwb3NzaWJpbGl0eSB0byBhZGQgYnV0dG9ucyBhZnRlciB0aGUgb3B0aW9uYWwgYnV0dG9uIGFuZCBiZWZvcmUKLQkgKiB0aGUgUmVtb3ZlIGJ1dHRvbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYnV0dG9ucwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEN1c3RvbUJ1dHRvbkFmdGVyT3B0aW9uYWxCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgQWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSXRlbSgpIHsKLQkJYWRhcHRlci5hZGROZXdJdGVtKHNlbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6ZQotCSAqLwotCXByb3RlY3RlZCBBZGFwdGVyIGJ1aWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYWRkQWRkQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGFkZFVubWFuYWdlZEJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWFkYXB0ZXIuYWRkQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRBZGRJdGVtQWN0aW9uKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgQWRkCi0JICovCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEFkZEl0ZW1BY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmFkZEl0ZW0oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLml0ZW1zQWRkZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLml0ZW1zTW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUFkZFJlbW92ZVBhbmUudGhpcy5pdGVtc1JlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLml0ZW1zUmVwbGFjZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmxpc3RDaGFuZ2VkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJQWRkUmVtb3ZlUGFuZS50aGlzLmxpc3RDbGVhcmVkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJT2JqZWN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLmdldFZhbHVlKCk7Ci0KLQkJaWYgKHNlbGVjdGVkSXRlbSA9PSBudWxsKSB7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGUuZ2V0SXRlbXMoKSwgc2VsZWN0ZWRJdGVtKSkgewotCQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogQGNhdGVnb3J5IE9wdGlvbgotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRPcHRpb25hbEFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBZGRSZW1vdmVQYW5lLnRoaXMuZWRpdEl0ZW0oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgT3B0aW9uCi0JICovCi0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRPcHRpb25hbEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBhZGRVbm1hbmFnZWRCdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlhZGFwdGVyLm9wdGlvbmFsQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRPcHRpb25hbEFjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IEFkZAotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gYWRkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGFkZFVubWFuYWdlZEJ1dHRvbigKLQkJCXBhcmVudCwKLQkJCWFkYXB0ZXIucmVtb3ZlQnV0dG9uVGV4dCgpLAotCQkJYnVpbGRSZW1vdmVJdGVtc0FjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFJlbW92ZQotCSAqLwotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSZW1vdmVJdGVtc0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBZGRSZW1vdmVQYW5lLnRoaXMucmVtb3ZlSXRlbXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdE1vZGVsKSB7Ci0JCXJldHVybiBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKG5ldyBMaXN0TW9kZWxBZGFwdGVyKGxpc3RNb2RlbCkpOwotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBPcHRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0SXRlbSgpIHsKLQkJdGhpcy5hZGFwdGVyLm9wdGlvbk9uU2VsZWN0aW9uKGdldFNlbGVjdGlvbk1vZGVsKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJdGhpcy5lbmFibGVkID0gZW5hYmxlZDsKLQotCQlpZiAoIXRoaXMuZ2V0TWFpbkNvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuZ2V0TWFpbkNvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0KLQkJdGhpcy51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIElCYXNlTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbGFiZWxQcm92aWRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdFZhbHVlTW9kZWw8Pz4gZ2V0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIGxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDb21wb3NpdGUgZ2V0TWFpbkNvbnRyb2woKTsKLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGdldFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIHNlbGVjdGVkSXRlbUhvbGRlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGdldFNlbGVjdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gc2VsZWN0aW9uTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gYWRhcHRlciBUaGlzIDxjb2RlPkFkYXB0ZXI8L2NvZGU+IGlzIHVzZWQgdG8gZGljdGFjdGUgdGhlIGJlaGF2aW9yCi0JICogb2YgdGhpcyA8Y29kZT5BZGRSZW1vdmVQYW5lPC9jb2RlPiBhbmQgYnkgZGVsZWdhdGluZyB0byBpdCBzb21lIG9mIHRoZQotCSAqIGJlaGF2aW9yCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICoKLQkgKiBAY2F0ZWdvcnkgSW5pdGlhbGl6YXRpb24KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJQmFzZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikKLQl7Ci0JCXRoaXMubGlzdEhvbGRlciAgICAgICAgID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5sYWJlbFByb3ZpZGVyICAgICAgPSBsYWJlbFByb3ZpZGVyOwotCQl0aGlzLmFkYXB0ZXIgICAgICAgICAgICA9IChhZGFwdGVyID09IG51bGwpID8gYnVpbGRBZGFwdGVyKCkgOiBhZGFwdGVyOwotCQl0aGlzLnNlbGVjdGVkSXRlbUhvbGRlciA9IChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwgICAgID0gbmV3IE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbChuZXcgTGlzdE1vZGVsQWRhcHRlcihsaXN0SG9sZGVyKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigKLQkJCUxpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLAotCQkJYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIGJ1dHRvbnMgKEFkZCwgb3B0aW9uYWwgKGlmIHJlcXVpcmVkKQotCSAqIGFuZCBSZW1vdmUpLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBidXR0b25zCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJ1dHRvblBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ICAgICAgID0gU1dULlRPUDsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIEFkZCBidXR0b24KLQkJdGhpcy5hZGRCdXR0b24gPSBhZGRBZGRCdXR0b24oY29udGFpbmVyKTsKLQkJYWRkQWxpZ25SaWdodCh0aGlzLmFkZEJ1dHRvbik7Ci0KLQkJLy8gQ3VzdG9tIGJ1dHRvbgotCQlhZGRDdXN0b21CdXR0b25BZnRlckFkZEJ1dHRvbihjb250YWluZXIsIGhlbHBJZCk7Ci0KLQkJLy8gT3B0aW9uYWwgYnV0dG9uCi0JCWlmICh0aGlzLmFkYXB0ZXIuaGFzT3B0aW9uYWxCdXR0b24oKSkgewotCQkJdGhpcy5vcHRpb25hbEJ1dHRvbiA9IGFkZE9wdGlvbmFsQnV0dG9uKGNvbnRhaW5lcik7Ci0JCQlhZGRBbGlnblJpZ2h0KHRoaXMub3B0aW9uYWxCdXR0b24pOwotCQl9Ci0KLQkJLy8gQ3VzdG9tIGJ1dHRvbgotCQlhZGRDdXN0b21CdXR0b25BZnRlck9wdGlvbmFsQnV0dG9uKGNvbnRhaW5lciwgaGVscElkKTsKLQotCQkvLyBSZW1vdmUgYnV0dG9uCi0JCXJlbW92ZUJ1dHRvbiA9IGFkZFJlbW92ZUJ1dHRvbihjb250YWluZXIpOwotCQlhZGRBbGlnblJpZ2h0KHJlbW92ZUJ1dHRvbik7Ci0KLQkJLy8gVXBkYXRlIHRoZSBoZWxwIHRvcGljIElECi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWRkQnV0dG9uLCBoZWxwSWQpOwotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocmVtb3ZlQnV0dG9uLCBoZWxwSWQpOwotCi0JCQlpZiAob3B0aW9uYWxCdXR0b24gIT0gbnVsbCkgewotCQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG9wdGlvbmFsQnV0dG9uLCBoZWxwSWQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBhZGQvcmVtb3ZlIHBhbmUgYnkgY3JlYXRpbmcgdGhlIHdpZGdldHMuIFRoZSBzdWJjbGFzcyBpcwotCSAqIHJlcXVpcmVkIHRvIGJ1aWxkIHRoZSBtYWluIHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBhZGFwdGVyIFRoaXMgPGNvZGU+QWRhcHRlcjwvY29kZT4gaXMgdXNlZCB0byBkaWN0YWN0ZSB0aGUgYmVoYXZpb3IKLQkgKiBvZiB0aGlzIDxjb2RlPkFkZFJlbW92ZVBhbmU8L2NvZGU+IGFuZCBieSBkZWxlZ2F0aW5nIHRvIGl0IHNvbWUgb2YgdGhlCi0JICogYmVoYXZpb3IKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KEFkYXB0ZXIgYWRhcHRlciwKLSAgICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0gICAJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlhZGFwdGVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWxhYmVsUHJvdmlkZXIsCi0JCQloZWxwSWQpOwotCi0JCWluaXRpYWxpemVCdXR0b25QYW5lKGNvbnRhaW5lciwgaGVscElkKTsKLQkJZW5hYmxlV2lkZ2V0cyhnZXRTdWJqZWN0KCkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY29udGFpbmVyLCAyLCAwLCAwLCAwLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBhZGQvcmVtb3ZlIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIgVGhpcyA8Y29kZT5BZGFwdGVyPC9jb2RlPiBpcyB1c2VkIHRvIGRpY3RhY3RlIHRoZSBiZWhhdmlvcgotCSAqIG9mIHRoaXMgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gYW5kIGJ5IGRlbGVnYXRpbmcgdG8gaXQgc29tZSBvZiB0aGUKLQkgKiBiZWhhdmlvcgotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVNb2RlbDwvY29kZT4gY29udGFpbmluZyB0aGUgaXRlbXMKLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0sIGlmIG1vcmUgdGhhbgotCSAqIG9uZSBpdGVtIG9yIG5vIGl0ZW1zIGFyZSBzZWxlY3RlZCwgdGhlbiA8Y29kZT5udWxsPC9jb2RlPiB3aWxsIGJlIHBhc3NlZAotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSByZW5kZXJlciB1c2VkIHRvIGZvcm1hdCB0aGUgbGlzdCBob2xkZXIncyBpdGVtcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgcGFuZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IHdhcyBub3Qgc3BlY2lmaWVkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKTsKLQotCS8qKgotCSAqIEBjYXRlZ29yeSBSZW1vdmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVJdGVtcygpIHsKLQotCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBzZWxlY3RlZCBpbmRpY2VzIHNvIHdlIGNhbiBzZWxlY3QgYW4gaXRlbQotCQkvLyBiZWZvcmUgdGhlIGxvd2VzdCBpbmRleAotCQlpbnRbXSBpbmRpY2VzID0gc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0JCUFycmF5cy5zb3J0KGluZGljZXMpOwotCi0JCS8vIE5vdGlmeSB0aGUgYWRhcHRlciB0byByZW1vdmUgdGhlIHNlbGVjdGVkIGl0ZW1zCi0JCWFkYXB0ZXIucmVtb3ZlU2VsZWN0ZWRJdGVtcyhzZWxlY3Rpb25Nb2RlbCk7Ci0KLQkJLy8gU2VsZWN0IGEgbmV3IGl0ZW0KLQkJaWYgKGdldExpc3RIb2xkZXIoKS5zaXplKCkgPiAwKSB7Ci0JCQlpbnQgaW5kZXggPSBNYXRoLm1pbihpbmRpY2VzWzBdLCBnZXRMaXN0SG9sZGVyKCkuc2l6ZSgpIC0gMSk7Ci0JCQlPYmplY3QgaXRlbSA9IGdldExpc3RIb2xkZXIoKS5nZXQoaW5kZXgpOwotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKGl0ZW0pOwotCQl9Ci0JCS8vIFRoZSBsaXN0IGlzIGVtcHR5LCBjbGVhciB0aGUgdmFsdWUKLQkJZWxzZSB7Ci0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3RzIHRoZSBnaXZlbiB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEl0ZW0oT2JqZWN0IHZhbHVlKSB7Ci0JCXNlbGVjdGVkSXRlbUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGNhdGVnb3J5IFVwZGF0ZUJ1dHRvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBZGRCdXR0b24oQnV0dG9uIGFkZEJ1dHRvbikgewotCQlhZGRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBAY2F0ZWdvcnkgVXBkYXRlQnV0dG9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUJ1dHRvbnMoKSB7Ci0JCWlmICghY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdXBkYXRlQWRkQnV0dG9uKGFkZEJ1dHRvbik7Ci0JCQl1cGRhdGVSZW1vdmVCdXR0b24ocmVtb3ZlQnV0dG9uKTsKLQkJCXVwZGF0ZU9wdGlvbmFsQnV0dG9uKG9wdGlvbmFsQnV0dG9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBVcGRhdGVCdXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT3B0aW9uYWxCdXR0b24oQnV0dG9uIG9wdGlvbmFsQnV0dG9uKSB7Ci0JCWlmIChvcHRpb25hbEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlvcHRpb25hbEJ1dHRvbi5zZXRFbmFibGVkKAotCQkJCWVuYWJsZWQgJiYKLQkJCQlhZGFwdGVyLmVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbk1vZGVsKQotCQkJKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBjYXRlZ29yeSBVcGRhdGVCdXR0b25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVtb3ZlQnV0dG9uKEJ1dHRvbiByZW1vdmVCdXR0b24pIHsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoCi0JCQllbmFibGVkICYmCi0JCQlhZGFwdGVyLmVuYWJsZVJlbW92ZU9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGlvbk1vZGVsKQotCQkpOwotCX0KLQotCS8qKgotCSAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPkFkYXB0ZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBZGFwdGVyIGltcGxlbWVudHMgQWRhcHRlciB7Ci0KLQkJLyoqCi0JCSAqIFRoZSB0ZXh0IG9mIHRoZSBhZGQgYnV0dG9uLgotCQkgKi8KLQkJcHJpdmF0ZSBTdHJpbmcgYWRkQnV0dG9uVGV4dDsKLQotCQkvKioKLQkJICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBvcHRpb25hbCBidXR0b24gc2hvdWxkIGJlIHNob3duIG9yIG5vdC4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbjsKLQotCQkvKioKLQkJICogVGhlIHRleHQgb2YgdGhlIG9wdGlvbmFsIGJ1dHRvbiwgaWYgdXNlZC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dDsKLQotCQkvKioKLQkJICogVGhlIHRleHQgb2YgdGhlIHJlbW92ZSBidXR0b24uCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyByZW1vdmVCdXR0b25UZXh0OwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0QWRhcHRlcjwvY29kZT4gd2l0aCBkZWZhdWx0IHRleHQgZm9yIHRoZQotCQkgKiBhZGQgYW5kIHJlbW92ZSBidXR0b25zLgotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXRoaXMoSnB0Q29tbW9uVWlNZXNzYWdlcy5BZGRSZW1vdmVQYW5lX0FkZEJ1dHRvblRleHQsCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5BZGRSZW1vdmVQYW5lX1JlbW92ZUJ1dHRvblRleHQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RBZGFwdGVyPC9jb2RlPiB3aXRoIGRlZmF1bHQgdGV4dCBmb3IgdGhlCi0JCSAqIGFkZCBhbmQgcmVtb3ZlIGJ1dHRvbnMuCi0JCSAqCi0JCSAqIEBwYXJhbSBoYXNPcHRpb25hbEJ1dHRvbiA8Y29kZT50cnVlPC9jb2RlPiB0byBzaG93IGFuIG9wdGlvbmFsIGJ1dHRvbgotCQkgKiBhbmQgdG8gdXNlIHRoZSBiZWhhdmlvciByZWxhdGVkIHRvIHRoZSBvcHRpb25hbCBidXR0b247Ci0JCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgdXNlIGl0Ci0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyKGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24pIHsKLQkJCXRoaXMoKTsKLQkJCXRoaXMuc2V0SGFzT3B0aW9uYWxCdXR0b24oaGFzT3B0aW9uYWxCdXR0b24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RBZGFwdGVyPC9jb2RlPiB3aXRoIGRlZmF1bHQgdGV4dCBmb3IgdGhlCi0JCSAqIGFkZCBhbmQgcmVtb3ZlIGJ1dHRvbnMuCi0JCSAqCi0JCSAqIEBwYXJhbSBvcHRpb25hbEJ1dHRvblRleHQgVGhlIHRleHQgb2YgdGhlIG9wdGlvbmFsIGJ1dHRvbiwgd2hpY2ggbWVhbnMKLQkJICogdGhlIG9wdGlvbmFsIGJ1dHRvbiB3aWxsIGJlIHNob3duCi0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyKFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQpIHsKLQkJCXRoaXModHJ1ZSk7Ci0JCQl0aGlzLnNldE9wdGlvbmFsQnV0dG9uVGV4dChvcHRpb25hbEJ1dHRvblRleHQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RBZGFwdGVyPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIGFkZEJ1dHRvblRleHQgVGhlIGFkZCBidXR0b24ncyB0ZXh0Ci0JCSAqIEBwYXJhbSByZW1vdmVCdXR0b25UZXh0IFRoZSByZW1vdmUgYnV0dG9uJ3MgdGV4dAotCQkgKi8KLQkJcHVibGljIEFic3RyYWN0QWRhcHRlcihTdHJpbmcgYWRkQnV0dG9uVGV4dCwKLQkJICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCkgewotCi0JCQlzdXBlcigpOwotCQkJdGhpcy5hZGRCdXR0b25UZXh0ICAgID0gYWRkQnV0dG9uVGV4dDsKLQkJCXRoaXMucmVtb3ZlQnV0dG9uVGV4dCA9IHJlbW92ZUJ1dHRvblRleHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEFkYXB0ZXI8L2NvZGU+LgotCQkgKgotCQkgKiBAcGFyYW0gYWRkQnV0dG9uVGV4dCBUaGUgYWRkIGJ1dHRvbidzIHRleHQKLQkJICogQHBhcmFtIHJlbW92ZUJ1dHRvblRleHQgVGhlIHJlbW92ZSBidXR0b24ncyB0ZXh0Ci0JCSAqIEBwYXJhbSBvcHRpb25hbEJ1dHRvblRleHQgVGhlIHRleHQgb2YgdGhlIG9wdGlvbmFsIGJ1dHRvbiwgd2hpY2ggbWVhbnMKLQkJICogdGhlIG9wdGlvbmFsIGJ1dHRvbiB3aWxsIGJlIHNob3duCi0JCSAqLwotCQlwdWJsaWMgQWJzdHJhY3RBZGFwdGVyKFN0cmluZyBhZGRCdXR0b25UZXh0LAotCQkgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZW1vdmVCdXR0b25UZXh0LAotCQkgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQpIHsKLQotCQkJdGhpcyhvcHRpb25hbEJ1dHRvblRleHQpOwotCQkJdGhpcy5zZXRBZGRCdXR0b25UZXh0KGFkZEJ1dHRvblRleHQpOwotCQkJdGhpcy5zZXRSZW1vdmVCdXR0b25UZXh0KHJlbW92ZUJ1dHRvblRleHQpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBhZGRCdXR0b25UZXh0KCkgewotCQkJcmV0dXJuIGFkZEJ1dHRvblRleHQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBlbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQlyZXR1cm4gbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzU2l6ZSgpID09IDE7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlbmFibGVSZW1vdmVPblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQlyZXR1cm4gbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSAhPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQlyZXR1cm4gaGFzT3B0aW9uYWxCdXR0b247Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCXJldHVybiBvcHRpb25hbEJ1dHRvblRleHQ7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZUJ1dHRvblRleHQoKSB7Ci0JCQlyZXR1cm4gcmVtb3ZlQnV0dG9uVGV4dDsKLQkJfQotCi0JCS8qKgotCQkgKiBDaGFuZ2VzIHRoZSB0ZXh0IG9mIHRoZSBhZGQgYnV0dG9uLiBUaGlzIG1ldGhvZCBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZQotCQkgKiB0aGUgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+IGlzIGluaXRpYWxpemVkLgotCQkgKgotCQkgKiBAcGFyYW0gYWRkQnV0dG9uVGV4dCBUaGUgYWRkIGJ1dHRvbidzIHRleHQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEFkZEJ1dHRvblRleHQoU3RyaW5nIGFkZEJ1dHRvblRleHQpIHsKLQkJCXRoaXMuYWRkQnV0dG9uVGV4dCA9IGFkZEJ1dHRvblRleHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hhbmdlcyB0aGUgc3RhdGUgb2YgdGhlIG9wdGlvbmFsIGJ1dHRvbiwgbWVhbmluZyBpZiBpdCBzaG91bGQgYmUgc2hvd24KLQkJICogYmV0d2VlbiB0aGUgYWRkIGFuZCByZW1vdmUgYnV0dG9ucyBvciBub3QuCi0JCSAqCi0JCSAqIEBwYXJhbSBoYXNPcHRpb25hbEJ1dHRvbiA8Y29kZT50cnVlPC9jb2RlPiB0byBzaG93IGFuIG9wdGlvbmFsIGJ1dHRvbgotCQkgKiBhbmQgdG8gdXNlIHRoZSBiZWhhdmlvciByZWxhdGVkIHRvIHRoZSBvcHRpb25hbCBidXR0b247Ci0JCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgdXNlIGl0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRIYXNPcHRpb25hbEJ1dHRvbihib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKSB7Ci0JCQl0aGlzLmhhc09wdGlvbmFsQnV0dG9uID0gaGFzT3B0aW9uYWxCdXR0b247Ci0JCX0KLQotCQkvKioKLQkJICogQ2hhbmdlcyB0aGUgdGV4dCBvZiB0aGUgb3B0aW9uYWwgYnV0dG9uLiBUaGlzIG1ldGhvZCBoYXMgdG8gYmUgY2FsbGVkCi0JCSAqIGJlZm9yZSB0aGUgPGNvZGU+QWRkUmVtb3ZlTGlzdFBhbmU8L2NvZGU+IGlzIGluaXRpYWxpemVkLiBUaGlzIGRvZXMgbm90Ci0JCSAqIG1ha2UgdGhlIG9wdGlvbmFsIGJ1dHRvbiB2aXNpYmxlLgotCQkgKgotCQkgKiBAcGFyYW0gb3B0aW9uYWxCdXR0b25UZXh0IFRoZSBvcHRpb25hbCBidXR0b24ncyB0ZXh0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRPcHRpb25hbEJ1dHRvblRleHQoU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCkgewotCQkJdGhpcy5vcHRpb25hbEJ1dHRvblRleHQgPSBvcHRpb25hbEJ1dHRvblRleHQ7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hhbmdlcyB0aGUgdGV4dCBvZiB0aGUgcmVtb3ZlIGJ1dHRvbi4gVGhpcyBtZXRob2QgaGFzIHRvIGJlIGNhbGxlZAotCQkgKiBiZWZvcmUgdGhlIDxjb2RlPkFkZFJlbW92ZUxpc3RQYW5lPC9jb2RlPiBpcyBpbml0aWFsaXplZC4KLQkJICoKLQkJICogQHBhcmFtIHJlbW92ZUJ1dHRvblRleHQgVGhlIHJlbW92ZSBidXR0b24ncyB0ZXh0Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRSZW1vdmVCdXR0b25UZXh0KFN0cmluZyByZW1vdmVCdXR0b25UZXh0KSB7Ci0JCQl0aGlzLnJlbW92ZUJ1dHRvblRleHQgPSByZW1vdmVCdXR0b25UZXh0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhZGFwdGVyIGlzIHVzZWQgdG8gcGVyZm9ybSB0aGUgYWN0dWFsIGFjdGlvbiB3aGVuIGFkZGluZyBhIG5ldyBpdGVtCi0JICogb3IgcmVtb3ZpbmcgdGhlIHNlbGVjdGVkIGl0ZW1zLiBJdCBpcyBwb3NzaWJsZSB0byBhZGQgYW4gb3B0aW9uYWwgYnV0dG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEFkYXB0ZXIgewotCi0JCS8qKgotCQkgKiBUaGUgYWRkIGJ1dHRvbidzIHRleHQuCi0JCSAqCi0JCSAqIEByZXR1cm4gVGhlIHRleHQgc2hvd24gb24gdGhlIGFkZCBidXR0b24KLQkJICovCi0JCVN0cmluZyBhZGRCdXR0b25UZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIEludm9rZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIHRoZSBBZGQgYnV0dG9uLgotCQkgKi8KLQkJdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMuIEltcGxlbWVudGF0aW9uIGRpY3RhdGVzIHdoZXRoZXIgYnV0dG9uCi0JCSAqIHNob3VsZCBiZSBlbmFibGVkLgotCQkgKi8KLQkJYm9vbGVhbiBlbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzLiBJbXBsZW1lbnRhdGlvbiBkaWN0YXRlcyB3aGV0aGVyIHJlbW92ZSBidXR0b24KLQkJICogc2hvdWxkIGJlIGVuYWJsZWQuCi0JCSAqLwotCQlib29sZWFuIGVuYWJsZVJlbW92ZU9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCi0JCS8qKgotCQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gb3B0aW9uYWwgYnV0dG9uIHNob3VsZCBiZSBhZGRlZCBiZXR3ZWVuIHRoZSBhZGQKLQkJICogYW5kIHJlbW92ZSBidXR0b25zLgotCQkgKgotCQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IHRvIHNob3cgYW4gb3B0aW9uYWwgYnV0dG9uIGFuZCB0byB1c2UgdGhlCi0JCSAqIGJlaGF2aW9yIHJlbGF0ZWQgdG8gdGhlIG9wdGlvbmFsIGJ1dHRvbjsgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIG5vdCB1c2UKLQkJICogaXQKLQkJICovCi0JCWJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKTsKLQotCQkvKioKLQkJICogUmVzb3VyY2Ugc3RyaW5nIGtleSBmb3IgdGhlIG9wdGlvbmFsIGJ1dHRvbi4KLQkJICovCi0JCVN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKTsKLQotCQkvKioKLQkJICogSW52b2tlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgdGhlIG9wdGlvbmFsIGJ1dHRvbgotCQkgKi8KLQkJdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQotCQkvKioKLQkJICogVGhlIHJlbW92ZSBidXR0b24ncyB0ZXh0LgotCQkgKgotCQkgKiBAcmV0dXJuIFRoZSB0ZXh0IHNob3duIG9uIHRoZSByZW1vdmUgYnV0dG9uCi0JCSAqLwotCQlTdHJpbmcgcmVtb3ZlQnV0dG9uVGV4dCgpOwotCi0JCS8qKgotCQkgKiBJbnZva2VkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyB0aGUgUmVtb3ZlIGJ1dHRvbi4KLQkJICovCi0JCXZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0FkZFJlbW92ZVRhYmxlUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWE3ZWRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9BZGRSZW1vdmVUYWJsZVBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuVGFibGVNb2RlbEFkYXB0ZXIuU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGNvZGU+QWRkUmVtb3ZlUGFuZTwvY29kZT4gdXNlcyBhIDxjb2RlPlRhYmxlPC9jb2RlPgotICogYXMgaXRzIG1haW4gd2lkZ2V0LgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0gfAotICogfCB8IENvbHVtbiAxIHwgQ29sdW1uIDIgfCAuLi4gICB8IENvbHVtbiBpIHwgLi4uICAgfCBDb2x1bm0gbiB8IHwgQWRkLi4uICB8IHwKLSAqIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgLS0tLS0tLS0tLS0gfAotICogfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgRWRpdC4uLiB8IHwKLSAqIHwgfCAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICB8IHwgUmVtb3ZlICB8IHwKLSAqIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFkZFJlbW92ZVRhYmxlUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQWRkUmVtb3ZlUGFuZTxUPgotewotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBwcmV2ZW50IGNpcmN1bGFyCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGxvY2tlZDsKLQotCS8qKgotCSAqIFRoZSBtYWluIHdpZGdldCBvZiB0aGlzIGFkZC9yZW1vdmUgcGFuZS4KLQkgKi8KLQlwcml2YXRlIFRhYmxlIHRhYmxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVUYWJsZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWRkUmVtb3ZlVGFibGVQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBwYW5lCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0ZXIgYWRhcHRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwKLQkJICAgICAgcGFyZW50LAotCQkgICAgICBhZGFwdGVyLAotCQkgICAgICBsaXN0SG9sZGVyLAotCQkgICAgICBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgIGhlbHBJZCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BZGRSZW1vdmVUYWJsZVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZU1vZGVsPC9jb2RlPiBjb250YWluaW5nIHRoZSBpdGVtcwotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbSwgaWYgbW9yZSB0aGFuCi0JICogb25lIGl0ZW0gb3Igbm8gaXRlbXMgYXJlIHNlbGVjdGVkLCB0aGVuIDxjb2RlPm51bGw8L2NvZGU+IHdpbGwgYmUgcGFzc2VkCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHJlbmRlcmVyIHVzZWQgdG8gZm9ybWF0IHRoZSBsaXN0IGhvbGRlcidzIGl0ZW1zCi0JICovCi0JcHVibGljIEFkZFJlbW92ZVRhYmxlUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFkZFJlbW92ZVRhYmxlUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gYWRhcHRlcgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlTW9kZWw8L2NvZGU+IGNvbnRhaW5pbmcgdGhlIGl0ZW1zCi0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtLCBpZiBtb3JlIHRoYW4KLQkgKiBvbmUgaXRlbSBvciBubyBpdGVtcyBhcmUgc2VsZWN0ZWQsIHRoZW4gPGNvZGU+bnVsbDwvY29kZT4gd2lsbCBiZSBwYXNzZWQKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcmVuZGVyZXIgdXNlZCB0byBmb3JtYXQgdGhlIGxpc3QgaG9sZGVyJ3MgaXRlbXMKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIHBhbmUKLQkgKi8KLQlwdWJsaWMgQWRkUmVtb3ZlVGFibGVQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsCi0JCSAgICAgIHN1YmplY3RIb2xkZXIsCi0JCSAgICAgIHBhcmVudCwKLQkJICAgICAgYWRhcHRlciwKLQkJICAgICAgbGlzdEhvbGRlciwKLQkJICAgICAgc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICBsYWJlbFByb3ZpZGVyLAotCQkgICAgICBoZWxwSWQpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcigKLQkJCWJ1aWxkU2VsZWN0ZWRJdGVtUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcl8oKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGVkSXRlbVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKHRhYmxlLmlzRGlzcG9zZWQoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKCFsb2NrZWQpIHsKLQkJCQkJbG9ja2VkID0gdHJ1ZTsKLQotCQkJCQl0cnkgewotCQkJCQkJT2JqZWN0IHZhbHVlID0gZS5nZXROZXdWYWx1ZSgpOwotCQkJCQkJZ2V0U2VsZWN0aW9uTW9kZWwoKS5zZXRTZWxlY3RlZFZhbHVlKGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQkJCQlpbnQgaW5kZXggPSAtMTsKLQotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldExpc3RIb2xkZXIoKS5pdGVyYXRvcigpLCB2YWx1ZSk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXRhYmxlLnNlbGVjdChpbmRleCk7Ci0JCQkJCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQkJCX0KLQkJCQkJZmluYWxseSB7Ci0JCQkJCQlsb2NrZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyPE9iamVjdD4gYnVpbGRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxPYmplY3Q+KCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VFdmVudDxPYmplY3Q+IGUpIHsKLQkJCQlBZGRSZW1vdmVUYWJsZVBhbmUudGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE1haW5Db250cm9sKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkKLQl7Ci0JCXRhYmxlID0gYWRkVW5tYW5hZ2VkVGFibGUoY29udGFpbmVyLCBoZWxwSWQpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTW9kZWxBZGFwdGVyPE9iamVjdD4gdGFibGVNb2RlbCA9IFRhYmxlTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJKExpc3RWYWx1ZU1vZGVsPE9iamVjdD4pIGxpc3RIb2xkZXIsCi0JCQlidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGFibGUsCi0JCQkoQ29sdW1uQWRhcHRlcjxPYmplY3Q+KSBidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCShJVGFibGVMYWJlbFByb3ZpZGVyKSBsYWJlbFByb3ZpZGVyCi0JCSk7Ci0KLQkJdGFibGVNb2RlbC5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCXNlbGVjdGVkSXRlbUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRTZWxlY3RlZEl0ZW1Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgKDEpIHRoZSBzZWxlY3RlZCBpdGVtIGhvbGRlciwgKDIpIHRoZQotCSAqIHNlbGVjdGlvbiBtb2RlbCBhbmQgKDMpIHRoZSBidXR0b25zLgotCSAqLwotCXByaXZhdGUgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKCkgewotCi0JCWlmIChsb2NrZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWxvY2tlZCA9IHRydWU7Ci0KLQkJdHJ5IHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gZ2V0U2VsZWN0ZWRJdGVtSG9sZGVyKCk7Ci0JCQlPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgc2VsZWN0aW9uTW9kZWwgPSBnZXRTZWxlY3Rpb25Nb2RlbCgpOwotCQkJaW50IHNlbGVjdGlvbkNvdW50ID0gdGFibGUuZ2V0U2VsZWN0aW9uQ291bnQoKTsKLQotCQkJaWYgKHNlbGVjdGlvbkNvdW50ID09IDApIHsKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHNlbGVjdGlvbkNvdW50ICE9IDEpIHsKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuY2xlYXJTZWxlY3Rpb24oKTsKLQotCQkJCWZvciAoaW50IGluZGV4IDogdGFibGUuZ2V0U2VsZWN0aW9uSW5kaWNlcygpKSB7Ci0JCQkJCXNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHNlbGVjdGVkSW5kZXggPSB0YWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBnZXRMaXN0SG9sZGVyKCkuZ2V0KHNlbGVjdGVkSW5kZXgpOwotCi0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKHNlbGVjdGVkSXRlbSk7Ci0JCQkJc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShzZWxlY3RlZEl0ZW0pOwotCQkJfQotCi0JCQl1cGRhdGVCdXR0b25zKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlsb2NrZWQgPSBmYWxzZTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DaG9vc2VyUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0Nob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NTI1NjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0Nob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIGNob29zZXIgaXMgc2ltcGx5IGEgcGFuZSB3aXRoIHRocmVlIHdpZGdldHMsIHRoZSBsYWJlbCBvbiB0aGUgbGVmdCwgYSBtYWluCi0gKiB3aWRnZXQsIHVzdWFsbHkgYSB0ZXh0IGZpZWxkLCBhbmQgYSByaWdodCB3aWRnZXQgd2hpY2ggaXMgdXN1YWxseSBhIGJyb3dzZQotICogYnV0dG9uLgotICoKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICogQHNlZSBQYWNrYWdlQ2hvb3NlclBhbmUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENob29zZXJQYW5lPFQgZXh0ZW5kcyBNb2RlbD4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvbnRyb2wgc2hvd24gYWZ0ZXIgdGhlIGxhYmVsIChsZWZ0IGNvbnRyb2wpLgotCSAqLwotCXByaXZhdGUgQ29udHJvbCBtYWluQ29udHJvbDsKLQotCS8qKgotCSAqIFRoZSBjb250cm9sIHNob3duIGFmdGVyIHRoZSBtYWluIGNvbnRyb2wuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sIHJpZ2h0Q29udHJvbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENob29zZXJQYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5tYWluQ29udHJvbCAgPSBhZGRNYWluQ29udHJvbChjb250YWluZXIpOwotCQl0aGlzLnJpZ2h0Q29udHJvbCA9IGFkZFJpZ2h0Q29udHJvbChjb250YWluZXIpOwotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlhZGRMZWZ0Q29udHJvbChjb250YWluZXIpLAotCQkJdGhpcy5tYWluQ29udHJvbCwKLQkJCXRoaXMucmlnaHRDb250cm9sLAotCQkJZ2V0SGVscElkKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsZWZ0IGNvbnRyb2wuIEJ5IGRlZmF1bHQgYSBsYWJlbCBpcyBjcmVhdGVkIGFuZCBpdHMgdGV4dCBpcwotCSAqIHJldHJpZXZlZCBieSB7QGxpbmsgI2dldExhYmVsVGV4dCgpfS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGxlZnQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGFkZExlZnRDb250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIGFkZExhYmVsKGNvbnRhaW5lciwgZ2V0TGFiZWxUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIFRoZSB0ZXh0IG9mIHRoZSBsYWJlbC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNidWlsZExlZnRDb250cm9sKENvbXBvc2l0ZSl9LgotCSAqCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgb2YgdGhlIGxlZnQgY29udHJvbCAod2hpY2ggaXMgYSBsYWJlbCBieQotCSAqIGRlZmF1bHQpCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMYWJlbFRleHQoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1haW4gY29udHJvbCBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBtYWluIGNvbnRyb2wKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHJpZ2h0IGNvbnRyb2wuIEJ5IGRlZmF1bHQgYSBicm93c2UgYnV0dG9uIGlzIGNyZWF0ZWQgYW5kIGl0cwotCSAqIGFjdGlvbiBpcyBwZXJmb3JtZWQgYnkge0BsaW5rICNidWlsZEJyb3dzZUFjdGlvbigpfSBhbmQgaXRzIHRleHQgaXMKLQkgKiByZXRyaWV2ZWQgYnkge0BsaW5rICNnZXRCcm93c2VCdXR0b25UZXh0KCl9LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgcmlnaHQgY29udHJvbAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGFkZFJpZ2h0Q29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBhZGRCdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlnZXRCcm93c2VCdXR0b25UZXh0KCksCi0JCQlidWlsZEJyb3dzZUFjdGlvbigpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGUgYnJvd3NlIGJ1dHRvbi4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNidWlsZFJpZ2h0Q29udHJvbChDb21wb3NpdGUpfS4KLQkgKgotCSAqIEByZXR1cm4gIkJyb3dzZS4uLiIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEJyb3dzZUJ1dHRvblRleHQoKSB7Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkNob29zZXJQYW5lX2Jyb3dzZUJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBhY3Rpb24gcmVzcG9uc2libGUgdG8gcGVyZm9ybSB0aGUgYWN0aW9uIHdoZW4gdGhlIEJyb3dzZSBpcwotCSAqIGNsaWNrZWQuCi0JICoKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPlJ1bm5hYmxlPC9jb2RlPiBwZXJmb3JtaW5nIHRoZSBhY3R1YWwgYWN0aW9uIG9mIHRoZQotCSAqIGJ1dHRvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscCB0b3BpYyBJRCBmb3IgdGhlIGNvbnRyb2xzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgb3RoZXJ3aXNlIHRoZSBzdWJjbGFzcyBjYW4gcmV0dXJuIGFuIElECi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0KLQkJc3VwZXIuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQotCQlpZiAoIXRoaXMubWFpbkNvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLm1haW5Db250cm9sLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQotCQlpZiAoIXRoaXMucmlnaHRDb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5yaWdodENvbnRyb2wuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJDb21ib1BhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJDb21ib1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwZWIzYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ2xhc3NDaG9vc2VyQ29tYm9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSB0eXBlIHdoZW4gYnJvd3NpbmcgYW5kIGl0IGFkZHMgY29kZQotICogY29tcGxldGlvbiBzdXBwb3J0IHRvIHRoZSB0ZXh0IGZpZWxkLCB3aGljaCBpcyB0aGUgbWFpbiBjb21wb25lbnQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGFzc0Nob29zZXJDb21ib1BhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENsYXNzQ2hvb3NlclBhbmU8VD4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENsYXNzQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgc3ViUGFuZSA9IGFkZFN1YlBhbmUoY29udGFpbmVyKTsKLSAgICAJQ29tYm8gY29tYm8gPSB0aGlzLmFkZENsYXNzQ29tYm8oc3ViUGFuZSk7Ci0KLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlQ29tYm9Db250ZW50QXNzaXN0YW50KAotCQkJY29tYm8sCi0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IKLQkJKTsKLQotCQlyZXR1cm4gc3ViUGFuZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbWJvIGFkZENsYXNzQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZENsYXNzTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFRleHRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRDbGFzc0NvbnZlcnRlcigpCi0JCSk7Ci0gCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENsYXNzTGlzdEhvbGRlcigpOwotCQotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZENsYXNzQ29udmVydGVyKCkgewotCQlyZXR1cm4gU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9DbGFzc0Nob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZmM5MzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0NsYXNzQ2hvb3NlclBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLmNvbnRlbnRhc3Npc3QuSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk5ld0NsYXNzQ3JlYXRpb25XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0NsYXNzV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuSnB0Q29tbW9uVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5DbGFzc05hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSB0eXBlIHdoZW4gYnJvd3NpbmcgYW5kIGl0IGFkZHMgY29kZQotICogY29tcGxldGlvbiBzdXBwb3J0IHRvIHRoZSB0ZXh0IGZpZWxkLCB3aGljaCBpcyB0aGUgbWFpbiBjb21wb25lbnQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENob29zZXJQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvZGUgY29tcGxldGlvbiBtYW5hZ2VyLgotCSAqLwotCXByb3RlY3RlZCBKYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN1YmplY3RDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q2xhc3NDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENsYXNzQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENsYXNzQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJLy8gVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKLQkJdGhpcy5qYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yKGZhbHNlLCBmYWxzZSk7Ci0KLQkJdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJdGhpcy5jbGFzc0Nob29zZXJTdWJqZWN0Q2hhbmdlZChnZXRTdWJqZWN0KCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDbGFzc0Nob29zZXJQYW5lLnRoaXMuY2xhc3NDaG9vc2VyU3ViamVjdENoYW5nZWQoKFQpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xhc3NDaG9vc2VyU3ViamVjdENoYW5nZWQoVCBuZXdTdWJqZWN0KSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gbnVsbDsKLQkJaWYgKG5ld1N1YmplY3QgIT0gbnVsbCkgewotCQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJCWlmIChyb290ICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnQgPSByb290LmdldFBhY2thZ2VGcmFnbWVudCgiIik7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5qYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VGcmFnbWVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTGVmdENvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpZiggISB0aGlzLmFsbG93VHlwZUNyZWF0aW9uKCkpIHsKLQkJCXJldHVybiBzdXBlci5hZGRMZWZ0Q29udHJvbChjb250YWluZXIpOwotCQl9Ci0JCUh5cGVybGluayBsYWJlbExpbmsgPSB0aGlzLmFkZEh5cGVybGluayhjb250YWluZXIsCi0JCQl0aGlzLmdldExhYmVsVGV4dCgpLAotCQkJdGhpcy5idWlsZEh5cGVyTGlua0FjdGlvbigpCi0JCSk7Ci0JCXJldHVybiBsYWJlbExpbms7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEh5cGVyTGlua0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDbGFzc0Nob29zZXJQYW5lLnRoaXMuaHlwZXJMaW5rU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoeXBlckxpbmtTZWxlY3RlZCgpIHsKLQkJSVR5cGUgdHlwZSA9IHJlc29sdmVKZHRUeXBlKCk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCW9wZW5JbkVkaXRvcih0eXBlKTsJCi0JCX0KLQkJZWxzZSBpZiAoYWxsb3dUeXBlQ3JlYXRpb24oKSl7Ci0JCQljcmVhdGVUeXBlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIElUeXBlIHJlc29sdmVKZHRUeXBlKCkgewotCQlpZiAodGhpcy5nZXRDbGFzc05hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldENsYXNzTmFtZSgpLnJlcGxhY2UoJyQnLCAnLicpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVHlwZSgpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0KLQkJTmV3Q2xhc3NXaXphcmRQYWdlIG5ld0NsYXNzV2l6YXJkUGFnZSA9IG5ldyBOZXdDbGFzc1dpemFyZFBhZ2UoKTsKLQkJbmV3Q2xhc3NXaXphcmRQYWdlLmluaXQoc2VsZWN0aW9uKTsKLQkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFN1cGVyQ2xhc3MoZ2V0U3VwZXJjbGFzc05hbWUoKSwgdHJ1ZSk7Ci0JCW5ld0NsYXNzV2l6YXJkUGFnZS5zZXRTdXBlckludGVyZmFjZXMoZ2V0U3VwZXJJbnRlcmZhY2VOYW1lcygpLCB0cnVlKTsKLQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldENsYXNzTmFtZSgpKSkgewotCQkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFR5cGVOYW1lKENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGdldENsYXNzTmFtZSgpKSwgdHJ1ZSk7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoZ2V0Q2xhc3NOYW1lKCkpOwotCQkJbmV3Q2xhc3NXaXphcmRQYWdlLnNldFBhY2thZ2VGcmFnbWVudChnZXRGaXJzdEphdmFTb3VyY2VGb2xkZXIoKS5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpLCB0cnVlKTsKLQkJfQotCQlOZXdDbGFzc0NyZWF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdDbGFzc0NyZWF0aW9uV2l6YXJkKG5ld0NsYXNzV2l6YXJkUGFnZSwgZmFsc2UpOwotCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzZWxlY3Rpb24pOwotCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKGdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IGRSZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQlpZiAoZFJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSAobmV3Q2xhc3NXaXphcmRQYWdlLmdldENyZWF0ZWRUeXBlKCkpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkpOwotCQkJc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpOwotCQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgdG8gY2hhbmdlIHRoZSBlbmNsb3NpbmcgdHlwZSBzZXBhcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJyQnOwotCX0KLQkKLQkvKioKLQkgKiBPdmVycmlkZSB0aGlzIHRvIHNldCBhIHN1cGVyY2xhc3MgaW4gdGhlIE5ldyBDbGFzcyB3aXphcmQuICBJZiBubyBjbGFzcyBpcyBjaG9zZW4sIAotCSAqIGNsaWNraW5nIHRoZSBoeXBlcmxpbmsgbGFiZWwgd2lsbCBvcGVuIHRoZSBuZXcgY2xhc3Mgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJjbGFzc05hbWUoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzZXQgYSBzdXBlciBpbnRlcmZhY2UgaW4gdGhlIE5ldyBDbGFzcyB3aXphcmQuICBJZiBubyBjbGFzcyBpcyBjaG9zZW4sIAotCSAqIGNsaWNraW5nIHRoZSBoeXBlcmxpbmsgbGFiZWwgd2lsbCBvcGVuIHRoZSBuZXcgY2xhc3Mgd2l6YXJkLgotCSAqIEBzZWUgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRTdXBlckludGVyZmFjZU5hbWVzKCkgewotCQlyZXR1cm4gZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgIT0gbnVsbCA/IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkpIDogQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyB0byBzZXQgYSBzdXBlciBpbnRlcmZhY2UgaW4gdGhlIE5ldyBDbGFzcyB3aXphcmQuICBJZiBubyBjbGFzcyBpcyBjaG9zZW4sIAotCSAqIGNsaWNraW5nIHRoZSBoeXBlcmxpbmsgbGFiZWwgd2lsbCBvcGVuIHRoZSBuZXcgY2xhc3Mgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3VwZXJJbnRlcmZhY2VOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdGhpcyBpZiBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGFsbG93IHRoZSB1c2VyIHRvIGNyZWF0ZSBhIG5ldyB0eXBlLgotCSAqIFRoaXMgd2lsbCBkZXRlcm1pbmUgd2hldGhlciBjbGlja2luZyB0aGUgaHlwZXJsaW5rIG9wZW5zIHRoZSBOZXcgQ2xhc3Mgd2l6YXJkCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFsbG93VHlwZUNyZWF0aW9uKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkluRWRpdG9yKElUeXBlIHR5cGUpIHsKLQkJdHJ5IHsKLQkJCUphdmFVSS5vcGVuSW5FZGl0b3IodHlwZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRDb21tb25VaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUpwdENvbW1vblVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKTsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKGNvbnRhaW5lcik7Ci0JCVRleHQgdGV4dCA9IGFkZFRleHQoc3ViUGFuZSwgYnVpbGRUZXh0SG9sZGVyKCkpOwotCi0JCUNvbnRyb2xDb250ZW50QXNzaXN0SGVscGVyLmNyZWF0ZVRleHRDb250ZW50QXNzaXN0YW50KAotCQkJdGV4dCwKLQkJCWphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvcgotCQkpOwotCi0JCXJldHVybiBzdWJQYW5lOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbHVlIGhvbGRlciBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqCi0JICogQHJldHVybiBUaGUgaG9sZGVyIG9mIHRoZSBjbGFzcyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCk7Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFR5cGUgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKLQkgKiBjYW5jZWxsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGdldEphdmFQcm9qZWN0KCkgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKSwKLQkJCQlzY29wZSwKLQkJCQlnZXRUeXBlRGlhbG9nU3R5bGUoKSwKLQkJCQlmYWxzZSwKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldENsYXNzTmFtZSgpKSA/ICIiIDogQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoZ2V0Q2xhc3NOYW1lKCkpCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldFRpdGxlKEpwdENvbW1vblVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dUaXRsZSk7Ci0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRDb21tb25VaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nTWVzc2FnZSk7Ci0KLQkJaWYgKHR5cGVTZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJVHlwZSkgdHlwZVNlbGVjdGlvbkRpYWxvZy5nZXRSZXN1bHQoKVswXTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VHlwZURpYWxvZ1N0eWxlKCkgewotCQlyZXR1cm4gSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsYXNzIG5hbWUgZnJvbSBpdHMgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNsYXNzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBpcyBkZWZpbmVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDbGFzc05hbWUoKTsKLQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRGaXJzdEphdmFTb3VyY2VGb2xkZXIoKSB7Ci0JCUl0ZXJhdG9yPElQYWNrYWdlRnJhZ21lbnRSb290PiBpID0gSkRUVG9vbHMuZ2V0SmF2YVNvdXJjZUZvbGRlcnMoZ2V0SmF2YVByb2plY3QoKSkuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIGkuaGFzTmV4dCgpID8gaS5uZXh0KCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFRoZSBicm93c2UgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGNsYXNzIGFuZCBzZXQgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvbXB0VHlwZSgpIHsKLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlVHlwZSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkpOwotCQkJc2V0Q2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25VaVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Db21ib1BhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Db21ib1BhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0NmVkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvQ29tYm9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQYW5lIHdpdGggY29tYm8gYm94IHN1cHBvcnQgZm9yIGF1dG9tYXRpYyB1cGRhdGluZyBvZjoKLSAqICAtIHNlbGVjdGVkIHZhbHVlCi0gKiAgLSBkZWZhdWx0IHZhbHVlCi0gKiAgLSB2YWx1ZSBjaG9pY2VzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb21ib1BhbmU8VCBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBtYWluIChvbmx5KSB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByb3RlY3RlZCBDb21ibyBjb21ib0JveDsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBlbmFibGVkTW9kZWwpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5jb21ib0JveCA9IHRoaXMuYWRkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCQl0aGlzLmNvbWJvQm94LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMuYnVpbGRNb2RpZnlMaXN0ZW5lcigpKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKHRoaXMuY29tYm9Cb3gpOwotCX0KLQkKLQlwcm90ZWN0ZWQgTW9kaWZ5TGlzdGVuZXIgYnVpbGRNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCUNvbWJvUGFuZS50aGlzLmNvbWJvQm94TW9kaWZpZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0eXBpY2FsIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3NzaWJsZSB2YWx1ZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbWJvIGR1cmluZwotCSAqIHBvcHVsYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsdWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbWJvIGlzIHRvIGFkZCBhIGRlZmF1bHQgdmFsdWUgdG8gdGhlIGNob2ljZXMKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzRGVmYXVsdFZhbHVlKCkgewotCQkvLyBkZWZhdWx0IHJlc3BvbnNlIGlzICd0cnVlJwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBkZWZhdWx0IGlzCi0JICogc3BlY2lmaWVkLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhbGxlZCB3aGVuIHRoZSBzdWJqZWN0IGlzIG5vbi1udWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIGZyb20gdGhlIHN1YmplY3QuCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgd2hlbiB0aGUgc3ViamVjdCBpcyBub24tbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUgYXMgdGhlIG5ldyB2YWx1ZSBvbiB0aGUgc3ViamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb1BvcHVsYXRlKCkgewotCQlzdXBlci5kb1BvcHVsYXRlKCk7Ci0JCXRoaXMucG9wdWxhdGVDb21ib0JveCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHBvcHVsYXRpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBQb3B1bGF0ZSB0aGUgY29tYm8tYm94IGxpc3QgYnkgY2xlYXJpbmcgaXQsIHRoZW4gYWRkaW5nIGZpcnN0IHRoZSBkZWZhdWx0Ci0JICogdmFsdWUsIGlmIGF2YWlsYWJsZSwgYW5kIHRoZW4gdGhlIHBvc3NpYmxlIGNob2ljZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVDb21ib0JveCgpIHsKLQkJdGhpcy5jb21ib0JveC5yZW1vdmVBbGwoKTsKLQkJCi0JCWlmICh1c2VzRGVmYXVsdFZhbHVlKCkpIHsKLQkJCXRoaXMuY29tYm9Cb3guYWRkKHRoaXMuYnVpbGREZWZhdWx0VmFsdWVFbnRyeSgpKTsKLQkJfQotCQkJCi0JCWZvciAoU3RyaW5nIHZhbHVlIDogdGhpcy5nZXRWYWx1ZXMoKSkgewotCQkJdGhpcy5jb21ib0JveC5hZGQodmFsdWUpOwotCQl9Ci0JCQotCQl0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbV8oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQlpZiAoZ2V0U3ViamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLk5vbmVTZWxlY3RlZDsKLQkJfQotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoKTsKLQkJcmV0dXJuIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgPyB0aGlzLmJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgOiB0aGlzLmJ1aWxkTm9uTnVsbERlZmF1bHRWYWx1ZUVudHJ5KGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGROdWxsRGVmYXVsdFZhbHVlRW50cnkoKSB7Ci0JCXJldHVybiBKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRFbXB0eTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZE5vbk51bGxEZWZhdWx0VmFsdWVFbnRyeShTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0ZWRJdGVtKCkgewotCQkvLyBtYWtlIHN1cmUgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdXAgdG8gZGF0ZSAoPz8/IH5ianYpCi0JCWlmICh1c2VzRGVmYXVsdFZhbHVlKCkpIHsKLQkJCVN0cmluZyBkZWZhdWx0VmFsdWVFbnRyeSA9IHRoaXMuYnVpbGREZWZhdWx0VmFsdWVFbnRyeSgpOwotCQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guZ2V0SXRlbSgwKS5lcXVhbHMoZGVmYXVsdFZhbHVlRW50cnkpKSB7Ci0JCQkJdGhpcy5jb21ib0JveC5yZW1vdmUoMCk7Ci0JCQkJdGhpcy5jb21ib0JveC5hZGQoZGVmYXVsdFZhbHVlRW50cnksIDApOwotCQkJfQotCQl9Ci0JCQotCQl0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbV8oKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc2VsZWN0ZWQgaXRlbSBieSBzZWxlY3RpbmcgdGhlIGN1cnJlbnQgdmFsdWUsIGlmIG5vdAotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCBvciBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUgaWYgb25lIGlzIGF2YWlsYWJsZSwKLQkgKiBvdGhlcndpc2UgcmVtb3ZlIHRoZSBzZWxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU2VsZWN0ZWRJdGVtXygpIHsKLQkJU3RyaW5nIHZhbHVlID0gKHRoaXMuZ2V0U3ViamVjdCgpID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0VmFsdWUoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWlmICh1c2VzRGVmYXVsdFZhbHVlKCkpIHsKLQkJCQkvLyBzZWxlY3QgdGhlIGRlZmF1bHQgdmFsdWUKLQkJCQl0aGlzLmNvbWJvQm94LnNlbGVjdCgwKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuY29tYm9Cb3guc2V0VGV4dCgiIik7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZWxlY3QgdGhlIG5ldyB2YWx1ZQotCQkJaWYgKCAhIHZhbHVlLmVxdWFscyh0aGlzLmNvbWJvQm94LmdldFRleHQoKSkpIHsKLQkJCQkvLyBUaGlzIHByZXZlbnRzIHRoZSBjdXJzb3IgZnJvbSBiZWluZyBzZXQgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lIChidWcgMjM0NDE4KS4KLQkJCQkvLyBUaGUgcmVhc29uIHdlIGFyZSBoaXR0aW5nIHRoaXMgbWV0aG9kIGF0IGFsbCBpcyBiZWNhdXNlIHRoZQotCQkJCS8vIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRpbmcgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwgaW4gYSB3YXkKLQkJCQkvLyB0aGF0IGNhdXNlcyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyB0byBiZSBmaXJlZCAodGhlIGFubm90YXRpb24KLQkJCQkvLyBpcyBhZGRlZCB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoYW5nZSBub3RpZmljYXRpb24gb2NjdXJzCi0JCQkJLy8gb24gdGhlIHVwZGF0ZSB0aHJlYWQsIGFuZCB0aGVuIHRoZSBuYW1lIGlzIHNldCwgdGhlc2UgMgotCQkJCS8vIHRocmVhZHMgY2FuIGdldCBpbiB0aGUgd3Jvbmcgb3JkZXIpLgotCQkJCS8vIFRoZSAjdmFsdWVDaGFuZ2VkKCkgbWV0aG9kIHNldHMgdGhlIHBvcHVsYXRpbmcgZmxhZyB0byB0cnVlLAotCQkJCS8vIGJ1dCBpbiB0aGlzIGNhc2UgaXQgaXMgYWxyZWFkeSBzZXQgYmFjayB0byBmYWxzZSB3aGVuIHdlCi0JCQkJLy8gcmVjZWl2ZSBub3RpZmljYXRpb24gYmFjayBmcm9tIHRoZSBtb2RlbCBiZWNhdXNlIGl0IGhhcwotCQkJCS8vIG1vdmVkIHRvIHRoZSB1cGRhdGUgdGhyZWFkIGFuZCB0aGVuIGp1bXBzIGJhY2sgb24gdGhlIFVJIHRocmVhZC4KLQkJCQl0aGlzLmNvbWJvQm94LnNldFRleHQodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlcG9wdWxhdGVDb21ib0JveCgpIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnJlcG9wdWxhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbWJvLWJveCBsaXN0ZW5lciBjYWxsYmFjayAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBjb21ib0JveE1vZGlmaWVkKCkgewotCQlpZiAoICEgdGhpcy5pc1BvcHVsYXRpbmcoKSkgewotCQkJdGhpcy52YWx1ZUNoYW5nZWQodGhpcy5jb21ib0JveC5nZXRUZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFRoZSBjb21iby1ib3ggc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKiBJZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQgYW5kIHRoZSBzdWJqZWN0IGlzIG51bGwsIHdlIGNhbiBidWlsZCBhIHN1YmplY3QKLQkgKiBiZWZvcmUgc2V0dGluZyB0aGUgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlUIHN1YmplY3QgPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJU3RyaW5nIG9sZFZhbHVlOwotCQlpZiAoc3ViamVjdCA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5udWxsU3ViamVjdElzTm90QWxsb3dlZCgpKSB7Ci0JCQkJcmV0dXJuOyAgLy8gbm8gc3ViamVjdCB0byBzZXQgdGhlIHZhbHVlIG9uCi0JCQl9Ci0JCQlvbGRWYWx1ZSA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlvbGRWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJLy8gY29udmVydCBlbXB0eSBzdHJpbmcgb3IgZGVmYXVsdCB0byBudWxsCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG5ld1ZhbHVlKSB8fCB0aGlzLnZhbHVlSXNEZWZhdWx0KG5ld1ZhbHVlKSkgewotCQkJbmV3VmFsdWUgPSBudWxsOwotCQl9Ci0JCQotCQkvLyBzZXQgdGhlIG5ldyB2YWx1ZSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIHZhbHVlCi0JCWlmIChUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJCi0JCQl0cnkgewotCQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQl0aGlzLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHdlIGNhbiBzZXQgdGhlIHZhbHVlIHdoZW4gdGhlIHN1YmplY3QgaXMgbnVsbAotCSAqIChpLmUuICNzZXRWYWx1ZShTdHJpbmcpIHdpbGwgY29uc3RydWN0IHRoZSBzdWJqZWN0IGlmIG5lY2Vzc2FyeSkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbnVsbFN1YmplY3RJc05vdEFsbG93ZWQoKSB7Ci0JCXJldHVybiAhIHRoaXMubnVsbFN1YmplY3RJc0FsbG93ZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdmFsdWUgaXMgbm90IG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZUlzRGVmYXVsdChTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCEgdXNlc0RlZmF1bHRWYWx1ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLmNvbWJvQm94LmdldEl0ZW1Db3VudCgpID4gMCkKLQkJCQkmJiB2YWx1ZS5lcXVhbHModGhpcy5jb21ib0JveC5nZXRJdGVtKDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGVmYXVsdFdpZGdldEZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EZWZhdWx0V2lkZ2V0RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Y0ZGMzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EZWZhdWx0V2lkZ2V0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TcGlubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2VjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBMYXlvdXQ7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5XaWRnZXRGYWN0b3J5PC9jb2RlPiBzaW1wbHkgY3JlYXRlcyBwbGFpbiBTV1Qgd2lkZ2V0cy4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRXaWRnZXRGYWN0b3J5IGltcGxlbWVudHMgV2lkZ2V0RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoaXMgPGNvZGU+SVdpZGdldEZhY3Rvcnk8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgV2lkZ2V0RmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0V2lkZ2V0RmFjdG9yeSgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EZWZhdWx0V2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBEZWZhdWx0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5JV2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyA8Y29kZT5JV2lkZ2V0RmFjdG9yeTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdpZGdldEZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgYnV0dG9uLCB3aGljaCBkZXRlcm1pbmVzIGl0cyB0eXBlOgotCSAqIHRvZ2dsZSwgcHVzaCwgY2hlY2sgYm94LCByYWRpbwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgaW50IHN0eWxlKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ0NvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5DSEVDSyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgRGF0ZVRpbWUgY3JlYXRlRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVRpbWUocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIENDb21ibyBjcmVhdGVFZGl0YWJsZUNDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ0NvbWJvKHBhcmVudCwgU1dULkJPUkRFUik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21ibyBjcmVhdGVFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlncm91cC5zZXRUZXh0KHRpdGxlKTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlIeXBlcmxpbmsgaHlwZXJsaW5rID0gbmV3IEh5cGVybGluayhwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaHlwZXJsaW5rLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBoeXBlcmxpbms7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExpc3QgY3JlYXRlTGlzdChDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBMaXN0KHBhcmVudCwgU1dULkJPUkRFUiB8IHN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEZvcm1UZXh0IGNyZWF0ZU11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQlUYWJsZVdyYXBMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlV3JhcExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyAgID0gMTsKLQkJbGF5b3V0LmJvdHRvbU1hcmdpbiA9IDA7Ci0JCWxheW91dC5sZWZ0TWFyZ2luICAgPSAwOwotCQlsYXlvdXQucmlnaHRNYXJnaW4gID0gMDsKLQkJbGF5b3V0LnRvcE1hcmdpbiAgICA9IDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlGb3JtVG9vbGtpdCB3aWRnZXRGYWN0b3J5ID0gbmV3IEZvcm1Ub29sa2l0KHBhcmVudC5nZXREaXNwbGF5KCkpOwotCQlGb3JtVGV4dCB0ZXh0ID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVGb3JtVGV4dChjb250YWluZXIsIHRydWUpOwotCQl0ZXh0LnNldExheW91dERhdGEobmV3IFRhYmxlV3JhcERhdGEoVGFibGVXcmFwRGF0YS5GSUxMX0dSQUIpKTsKLQkJdGV4dC5zZXRUZXh0KGxhYmVsVGV4dCwgZmFsc2UsIGZhbHNlKTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgVGV4dChwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlBBU1NXT1JEKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5QVVNIKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUkFESU8pOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gbmV3IFNlY3Rpb24ocGFyZW50LCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTcGlubmVyIGNyZWF0ZVNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFNwaW5uZXIocGFyZW50LCBTV1QuTlVMTCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUYWJsZSBjcmVhdGVUYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEJ1dHRvbiBjcmVhdGVUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsIHRleHQsIHRoaXMpOwotCQlyZXR1cm4gY2hlY2tCb3guZ2V0Q2hlY2tCb3goKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODc2N2I5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5UaXRsZUFyZWFEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpYWxvZyB1c2luZyBhICJzdGF0ZSBvYmplY3QiIChtb2RlbCBvYmplY3QpCi0gKiBmb3IgYmVoYXZpb3IuCi0gKiA8cD4KLSAqIFRoZSBtYWluIHBhbmUgb2YgdGhpcyBkaWFsb2cgc2hvdWxkIGJlIGV4dGVuZGluZyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPgotICogZm9yIGNyZWF0aW5nIHRoZSByaWdodCB0eXBlIG9mIHdpZGdldHMgYW5kIGl0IGhhcyB0aGUgInN0YXRlIG9iamVjdCIgKHN1YmplY3QpCi0gKiBiZWhhdmlvciBidWlsdC1pbi4KLSAqCi0gKiBAc2VlIE5vZGUKLSAqIEBzZWUgRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEaWFsb2c8VCBleHRlbmRzIE5vZGU+IGV4dGVuZHMgVGl0bGVBcmVhRGlhbG9nCi17Ci0JLyoqCi0JICogVGhlIG1haW4gY29udGVudCBwYW5lIG9mIHRoaXMgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgRGlhbG9nUGFuZTw/PiBwYW5lOwotCi0JLyoqCi0JICogVGhlIGhvbGRlciBvZiB0aGUgInN0YXRlIG9iamVjdCIgdXNlZCBieSB0aGlzIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBDYWNoZXMgdGhlIHRpdGxlIHRleHQgdW50aWwgdGhlIGRpYWxvZyBpcyBjcmVhdGVkIGFuZCB0aGUgZGlhbG9nJ3Mgc2hlbGwKLQkgKiBuZWVkcyB0byBiZSBjb25maWd1cmVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZyhTaGVsbCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsICIiKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIGRpYWxvZydzIHRpdGxlCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZyhTaGVsbCBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGUgbWFpbiBwYW5lIG9mIHRoaXMgZGlhbG9nLiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIG9ubHkKLQkgKiB3aGVuIHRoZSBkaWFsb2cgaXMgcmVxdWVzdGVkIHRvIHNob3cgb24gc2NyZWVuIGFuZCBub3QgZHVyaW5nCi0JICogaW5pdGlhbGl6YXRpb24uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgdG8gd2hpY2ggdGhlIHdpZGdldHMgc2hvdWxkIGJlIGFkZGVkIHRvLAotCSAqIHRoZSBsYXlvdXQgaXMgYWxyZWFkeSBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlhbG9nUGFuZTw/PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHN0YXRlIG9iamVjdCAobW9kZWwgb2JqZWN0KSB0aGF0IHdpbGwgYmUgdXNlZCB0byBrZWVwIHRyYWNrCi0JICogb2YgdGhlIGluZm9ybWF0aW9uIGVudGVyZWQgaW4gdGhpcyBkaWFsb2cuIFRoZSBzdGF0ZSBvYmplY3Qgd2lsbCBiZSBzdG9yZWQKLQkgKiBpbiB0aGUgc3ViamVjdCBob2xkZXIgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcge0BsaW5rICNzdWJqZWN0KCl9LgotCSAqCi0JICogQHJldHVybiBBIG5ldyBzdGF0ZSBvYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgVCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIGNoYW5nZXMgYXJlCi0JICogbWFkZSB0byB0aGUgc3RhdGUgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIHN0YXRlIG9iamVjdAotCSAqLwotCU5vZGUuVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gTm9kZS5OVUxMX1ZBTElEQVRPUjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQotCQkvLyBEaXNwb3NlIHRoZSBwYW5lIGluIG9yZGVyIHRvIHJlbW92ZSBhbnkgbGlzdGVuZXJzIHRoYXQgY291bGQKLQkJLy8gaGF2ZSBiZWVuIGluc3RhbGxlZCBvdXRzaWRlIHRoZSBzY3JvcGUgb2YgdGhlIHN0YXRlIG9iamVjdAotCQlpZiAocGFuZSAhPSBudWxsKSB7Ci0JCQlwYW5lLmRpc3Bvc2UoKTsKLQkJCXBhbmUgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dChnZXRUaXRsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQkJaW5zdGFsbFN1YmplY3QoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChoYXNUaXRsZUFyZWEoKSkgewotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCX0KLQotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdENvbnRlbnQocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IG1haW4gY29udGFpbmVyIG9mIHRoaXMgZGlhbG9nIHdoZW4gdGhlIHRpdGxlIGFyZWEgaXMKLQkgKiBub3QgcmVxdWlyZWQuIFRoZSB0b3AgcGFydCBpcyB0aGUgZGlhbG9nIGFyZWEgcG9wdWxhdGVkIGJ5IHRoZSBzdWJjbGFzcwotCSAqIGFuZCB0aGUgbG93ZXIgcGFydCBpcyB0aGUgYnV0dG9uIHBhbmUgaGF2aW5nIHRoZSBPSyBhbmQgQ2FuY2VsIGJ1dHRvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVEZWZhdWx0Q29udGVudChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgICAgICA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgICAgPSAwOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhjb21wb3NpdGUpOwotCQlkaWFsb2dBcmVhID0gY3JlYXRlRGlhbG9nQXJlYShjb21wb3NpdGUpOwotCQlidXR0b25CYXIgID0gY3JlYXRlQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIElmIHRoZSB0aXRsZSBhcmVhIG5lZWRzIHRvIGJlIHNob3duLCB0aGVuIGxlYXZlIHRoZSBzdXBlcmNsYXNzIHRvCi0JCS8vIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHdpZGdldHMKLQkJaWYgKGhhc1RpdGxlQXJlYSgpKSB7Ci0JCQlwYXJlbnQgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCX0KLQotCQkvLyBDcmVhdGUgdGhlIG1haW4gYXJlYSdzIGNvbnRhaW5lcgotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgR3JpZExheW91dCgxLCBmYWxzZSkpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlICAgPSB0cnVlOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSB0aGUgY29udGVudCBwYW5lCi0JCXBhbmUgPSBidWlsZExheW91dChjb250YWluZXIpOwotCi0JCS8vIEluaXRpYWxpemUgdGhlIFVJIHBhcnQsIHdoaWNoIHJlcXVpcmVzIHRoZSB3aWRnZXRzIGJlaW5nIGNyZWF0ZWQKLQkJaW5pdGlhbGl6ZVVJKCk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRlc2NyaXB0aW9uIGFyZWEgKHdoZXJlIGEgdGl0bGUsIGRlc2NyaXB0aW9uIGFuZAotCSAqIGltYWdlKSBzaG91bGQgYmUgdmlzaWJsZSBvciBoaWRkZW4uIDxjb2RlPlZhbGlkYXRpbmdEaWFsb2c8L2NvZGU+Ci0JICogYXV0b21hdGljYWxseSBzaG93IHRoZSBkZXNjcmlwdGlvbiBhcmVhIGluIG9yZGVyIHRvIHNob3cgcHJvYmxlbXMuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBieSBkZWZhdWx0LCB3aGljaCBtZWFucyB0aGUgbWV0aG9kcyB1c2VkIHRvCi0JICogdXBkYXRlIHRoZSB0aXRsZSwgZGVzY3JpcHRpb24gYW5kIGltYWdlIHNob3VsZG4ndCBiZSBjYWxsZWQ7IDxjb2RlPnRydWU8L2NvZGU+Ci0JICogdG8gbWFrZSB0aGUgZGVzY3JpcHRpb24gcGFuZSB2aXNpYmxlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGl0bGVBcmVhKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaGVscHMgc3lzdGVtLgotCSAqCi0JICogQHJldHVybiBUaGUgcGxhdGZvcm0ncyBoZWxwIHN5c3RlbQotCSAqCi0JICogQGNhdGVnb3J5IEhlbHBlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUPigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBVSSBwYXJ0IG9mIHRoaXMgZGlhbG9nLCB0aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgd2lkZ2V0cwotCSAqIGhhdmUgYmVlbiBjcmVhdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVVSSgpIHsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzdGF0ZSBvYmplY3QsIGlmIG9uZSBpcyBuZWVkZWQgYW5kIGluc3RhbGwgYSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+Ci0JICogaW4gb3JkZXIgdG8gcmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhbmdlcyBkb25lIHRvIHRoYXQgc3RhdGUgb2JqZWN0LiBUaGUKLQkgKiBzdWJqZWN0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgc3ViamVjdCBob2xkZXIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxTdWJqZWN0KCkgewotCi0JCVQgc3ViamVjdCA9IGJ1aWxkU3RhdGVPYmplY3QoKTsKLQotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQlzdWJqZWN0LnNldFZhbGlkYXRvcihidWlsZFZhbGlkYXRvcigpKTsKLQkJfQotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUoc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZXMgYWNjZXNzIHRvIHRoZSBkaWFsb2cncyBtYWluIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYW5lIHNob3dpbmcgdGhlIGN1c3RvbSB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8Pz4gZ2V0UGFuZSgpIHsKLQkJcmV0dXJuIHBhbmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ViamVjdCBvZiB0aGlzIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3Qgb2YgdGhpcyBkaWFsb2cgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gc3ViamVjdCB3YXMKLQkgKiB1c2VkCi0JICovCi0JcHVibGljIFQgZ2V0U3ViamVjdCgpIHsKLQkJcmV0dXJuIHN1YmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0IGhvbGRlciB1c2VkIHRvIGJlIHBhc3NlZCB0byB0aGUgZGlhbG9nIHBhbmUsIHdoaWNoIGlzCi0JICogYW4gaW5zdGFuY2Ugb2YgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBzdWJqZWN0SG9sZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgZGlhbG9nJ3MgdGl0bGUuIFRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIHdpbGwgYmUKLQkgKiByZXR1cm5lZCBieSBkZWZhdWx0IGJ1dCBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLCB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZAotCSAqIHRvIHJldHVybiBpdC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSB0aXRsZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9yIGEgZGlmZmVyZW50IHRpdGxlCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQgb3Igbm90LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjYW5jZWxsZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGl0IHdhcyBjb25maXJtZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDYW5jZWxsZWQoKSB7Ci0JCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gQ0FOQ0VMOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlciB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQgb3Igbm90LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgZGlhbG9nIHdhcyBjb25maXJtZWQ7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGl0IHdhcyBjYW5jZWxsZWQKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB3YXNDb25maXJtZWQoKSB7Ci0JCXJldHVybiBnZXRSZXR1cm5Db2RlKCkgPT0gT0s7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2dQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRGlhbG9nUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjNjZDBjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9EaWFsb2dQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IHBhbmUgdG8gdXNlIHdoZW4gdGhlIHBhbmUgaXMgc2hvd24gaW4gYW4gPGNvZGU+RGlhbG9nPC9jb2RlPi4KLSAqCi0gKiBAc2VlIERpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlhbG9nUGFuZTxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBQYW5lPFQ+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlhbG9nUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZShEaWFsb2dQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgY29udHJvbGxlcjsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKERpYWxvZ1BhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZShEaWFsb2dQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBjb250cm9sbGVyOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IENvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmUoRGlhbG9nUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5EaWFsb2dQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEaWFsb2dQYW5lKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUNvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNDJlZjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Db21ib1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBUaGlzIHBhbmUgc2ltcGx5IHNob3dzIGEgY29tYm8gd2hlcmUgaXRzIGRhdGEgaXMgcG9wdWxhdGluZyB0aHJvdWdoCi0gKiB7QGxpbmsgI2Nob2ljZXMoKX0gYW5kIGEgZGVmYXVsdCB2YWx1ZSBjYW4gYWxzbyBiZSBhZGRlZC4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1hYnN0cmFjdCBjbGFzcyBFbnVtQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPiBleHRlbmRzIFBhbmU8VD4KLXsKLQkvKioKLQkgKiBUaGUgbWFpbiB3aWRnZXQgb2YgdGhpcyBwYW5lLgotCSAqLwotCXByaXZhdGUgQ29tYm9WaWV3ZXIgY29tYm9WaWV3ZXI7Ci0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gcmVwcmVzZW50IHRoZSA8Y29kZT5udWxsPC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1ZBTFVFID0gIm51bGwiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JRW51bUNvbWJvVmlld2VyKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyB3aWRnZXRzCi0JICovCi0JRW51bUNvbWJvVmlld2VyKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCUVudW1Db21ib1ZpZXdlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3Qgb2YgY2hvaWNlcyBhbmQgYWRkIGFuIGV4dHJhIGVsZW1lbnQgdGhhdCByZXByZXNlbnRzIHRoZQotCSAqIGRlZmF1bHQgdmFsdWUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjb21ibydzIGNob2ljZXMgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IHZhbHVlCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZENob2ljZXMoKSB7Ci0JCVZbXSBjaG9pY2VzID0gZ2V0Q2hvaWNlcygpOwotCQlpZiAoc29ydENob2ljZXMoKSkgewotCQkJQXJyYXlzLnNvcnQoY2hvaWNlcywgYnVpbGRDb21wYXJhdG9yKCkpOwotCQl9Ci0KLQkJT2JqZWN0W10gZXh0ZW5kZWRDaG9pY2VzID0gbmV3IE9iamVjdFtjaG9pY2VzLmxlbmd0aCArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNob2ljZXMsIDAsIGV4dGVuZGVkQ2hvaWNlcywgMSwgY2hvaWNlcy5sZW5ndGgpOwotCQlleHRlbmRlZENob2ljZXNbMF0gPSBOVUxMX1ZBTFVFOwotCi0JCXJldHVybiBleHRlbmRlZENob2ljZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgdG8gc29ydCB0aGUgY2hvaWNlcyBpbiBhbHBoYWJldGljYWwgb3JkZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4gd2l0aCB0aGUgcmlnaHQgY29tYm8gd2lkZ2V0cy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgY29tYm8KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiBjb250YWluaW5nIHRoZSByaWdodCBjb21ibyB3aWRnZXQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tYm9WaWV3ZXIgYWRkQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYWRkQ29tYm9WaWV3ZXIoY29udGFpbmVyLCBidWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPE9iamVjdD4gYnVpbGRDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8T2JqZWN0PigpIHsKLQkJCWZpbmFsIExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IGJ1aWxkTGFiZWxQcm92aWRlcigpOwotCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IHRoaXMubGFiZWxQcm92aWRlci5nZXRUZXh0KHZhbHVlMSk7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcyID0gdGhpcy5sYWJlbFByb3ZpZGVyLmdldFRleHQodmFsdWUyKTsKLQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRpc3BsYXlTdHJpbmcxLCBkaXNwbGF5U3RyaW5nMik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGlzcGxheSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCBpcyB0aGUKLQkgKiB2aXJ0dWFsIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIHRoZW4gaXRzIGRpc3BsYXkgc3RyaW5nIHdpbGwgYmUgIkRlZmF1bHQiCi0JICogYXBwZW5kZWQgYnkgdGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlLCBpZiBpdCBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQgaW50byBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZwotCSAqIEByZXR1cm4gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZ2l2ZW4gZWxlbWVudAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGlzcGxheVN0cmluZyhPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IE5VTExfVkFMVUUpIHsKLQkJCVYgZGVmYXVsdFZhbHVlID0gKGdldFN1YmplY3QoKSAhPSBudWxsKSA/IGdldERlZmF1bHRWYWx1ZSgpIDogbnVsbDsKLQotCQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nKGRlZmF1bHRWYWx1ZSk7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKEpwdENvbW1vblVpTWVzc2FnZXMuRW51bUNvbWJvVmlld2VyX2RlZmF1bHRXaXRoRGVmYXVsdCwgZGlzcGxheVN0cmluZyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbERpc3BsYXlTdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBkaXNwbGF5U3RyaW5nKChWKSB2YWx1ZSk7Ci0JfQotCi0JZmluYWwgTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGJ1aWxkRGlzcGxheVN0cmluZyhlbGVtZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gYnVpbGRTZWxlY3Rpb24oKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IChnZXRTdWJqZWN0KCkgIT0gbnVsbCkgPyBnZXRWYWx1ZSgpIDogbnVsbDsKLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBOVUxMX1ZBTFVFOwotCQl9Ci0KLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgYnVpbGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQlpZiAoIWlzUG9wdWxhdGluZygpKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIGUuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCXZhbHVlQ2hhbmdlZChzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NzaWJsZSBjaG9pY2VzIHRvIHNob3cgaW4gdGhlIHZpZXdlci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIGNvbWJvcwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWW10gZ2V0Q2hvaWNlcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBtZXRob2QgaXMgbm90IGNhbGxlZCBpZiB0aGUgc3ViamVjdCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgdmFsdWUgdGhhdCBpcyBkZWNsYXJlZCBhcyBiZWluZyB0aGUgZGVmYXVsdCB3aGVuIGl0IGlzIG5vdAotCSAqIGRlZmluZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWIGdldERlZmF1bHRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzcGxheWFibGUgc3RyaW5nIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRyYW5zbGF0ZSBpbnRvIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHRleHQgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB2YWx1ZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZGlzcGxheVN0cmluZyhWIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkaXNwbGF5YWJsZSBzdHJpbmcgZm9yIGEgbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG51bGxEaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsgLy9JIHdvdWxkIHJhdGhlciBkaXNwbGF5IG5vdGhpbmcgdGhhbiAiRGVmYXVsdCgpIgotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbWJvKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucwotCSAqCi0JICogQHJldHVybgotCSAqLwotCWZpbmFsIENvbWJvVmlld2VyIGdldENvbWJvVmlld2VyKCkgewotCQlyZXR1cm4gdGhpcy5jb21ib1ZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHN1YmplY3QncyB2YWx1ZS4gVGhlIHN1YmplY3QgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdWJqZWN0JyB2YWx1ZSwgd2hpY2ggY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgZ2V0VmFsdWUoKTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuY29tYm9WaWV3ZXIgPSB0aGlzLmFkZENvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFBvcHVsYXRlcyB0aGUgY29tYm8gYnkgcmUtYWRkaW5nIGFsbCB0aGUgaXRlbXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29tYm8oKSB7Ci0KLQkJcmVtb3ZlQWxsKCk7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuYWRkKGJ1aWxkQ2hvaWNlcygpKTsKLQkJdXBkYXRlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCXRoaXMucG9wdWxhdGVDb21ibygpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHRoZSBpdGVtcyBmcm9tIHRoZSBjb21iby4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHJlbW92ZUFsbCgpOwotCi0JLyoqCi0JICogUmVxdWVzdHMgdGhlIGdpdmVuIG5ldyB2YWx1ZSBiZSBzZXQgb24gdGhlIHN1YmplY3QuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSB0byBiZSBzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzZXRWYWx1ZShWIHZhbHVlKTsKLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGN1cnNvciwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gc2hvdyB0aGUgZW50aXJlIHNlbGVjdGVkIGl0ZW0KLQkgKiB3aXRoaW4gdGhlIGNvbWJvJ3MgYXJlYS4KLQkgKi8KLQlhYnN0cmFjdCB2b2lkIHVwZGF0ZUN1cnNvcigpOwotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3Rpb24oKSB7Ci0JCXRoaXMuY29tYm9WaWV3ZXIuc2V0U2VsZWN0aW9uKGJ1aWxkU2VsZWN0aW9uKCkpOwotCQl1cGRhdGVDdXJzb3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGNoYW5nZXMsIG5vdGlmeSB0aGUgc3ViY2xhc3MgdG8gc2V0IHRoZSB2YWx1ZS4KLQkgKgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgbmV3IHNlbGVjdGVkIGl0ZW0KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKE9iamVjdCB2YWx1ZSkgewotCi0JCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgIm51bGwiIHZhbHVlIHRvIGEgcmVhbCBudWxsCi0JCWlmICh2YWx1ZSA9PSBOVUxMX1ZBTFVFKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQotCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlzZXRWYWx1ZSgoVikgdmFsdWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bURpYWxvZ0NvbWJvVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDZiMTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1EaWFsb2dDb21ib1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+IHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhIGRpYWxvZyBwYW5lLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRW51bURpYWxvZ0NvbWJvVmlld2VyPFQgZXh0ZW5kcyBNb2RlbCwgVj4KLQlleHRlbmRzIEVudW1Db21ib1ZpZXdlcjxULCBWPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bURpYWxvZ0NvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRGlhbG9nQ29tYm9WaWV3ZXIoRGlhbG9nUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudW1EaWFsb2dDb21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bURpYWxvZ0NvbWJvVmlld2VyKERpYWxvZ1BhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCi0JCUNvbWJvIGNvbWJvID0gZ2V0Q29tYm8oKTsKLQkJaWYgKCAhIGNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJY29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBnZXRDb21ibygpIHsKLQkJcmV0dXJuIGdldENvbWJvVmlld2VyKCkuZ2V0Q29tYm8oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHJlbW92ZUFsbCgpIHsKLQkJZ2V0Q29tYm8oKS5yZW1vdmVBbGwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHVwZGF0ZUN1cnNvcigpIHsKLQkJZ2V0Q29tYm8oKS5zZXRTZWxlY3Rpb24obmV3IFBvaW50KDAsIDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUZvcm1Db21ib1ZpZXdlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0VudW1Gb3JtQ29tYm9WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZTg5Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRW51bUZvcm1Db21ib1ZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5FbnVtQ29tYm9WaWV3ZXI8L2NvZGU+IHNob3VsZCBiZSB1c2VkIHdpdGhpbiBhIGZvcm0gcGFuZS4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVudW1Gb3JtQ29tYm9WaWV3ZXI8VCBleHRlbmRzIE1vZGVsLCBWPgotCWV4dGVuZHMgRW51bUNvbWJvVmlld2VyPFQsIFY+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnVtRm9ybUNvbWJvVmlld2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBFbnVtRm9ybUNvbWJvVmlld2VyKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bUZvcm1Db21ib1ZpZXdlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bUZvcm1Db21ib1ZpZXdlcihQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCi0JCUNvbWJvIGNvbWJvID0gZ2V0Q29tYm8oKTsKLQkJaWYgKCAhIGNvbWJvLmlzRGlzcG9zZWQoKSkgewotCQkJY29tYm8uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBnZXRDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29tYm9WaWV3ZXIoKS5nZXRDb21ibygpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgcmVtb3ZlQWxsKCkgewotCQlnZXRDb21ibygpLnJlbW92ZUFsbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdXBkYXRlQ3Vyc29yKCkgewotCQlnZXRDb21ibygpLnNldFNlbGVjdGlvbihuZXcgUG9pbnQoMCwgMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9GaWxlQ2hvb3NlckNvbWJvUGFuZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyQ29tYm9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNDdiYWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyQ29tYm9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlIHdoZW4gYnJvd3NpbmcuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlQ2hvb3NlckNvbWJvUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgRmlsZUNob29zZXJQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GaWxlQ2hvb3NlckNvbWJvUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyQ29tYm9QYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyQ29tYm9QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGaWxlQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQlyZXR1cm4gYWRkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmdldFRleHRIb2xkZXIoKSwKLQkJCXRoaXMuYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGxpc3QgaG9sZGVyIG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQl0aGlzLmJ1aWxkRGVmYXVsdExpc3QoKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgbGlzdCBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGREZWZhdWx0TGlzdCgpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGhpcy5nZXREZWZhdWx0U3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoKTsKLQkKLQkvKioKLQkgKiBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGNvbWJvIGJveCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJcmV0dXJuIFN0cmluZ0NvbnZlcnRlci5EZWZhdWx0LjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRmlsZUNob29zZXJQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYWVjNmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0ZpbGVDaG9vc2VyUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuSnB0Q29tbW9uVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotCi0vKioKLSAqIFRoaXMgY2hvb3NlciBhbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZSB3aGVuIGJyb3dzaW5nLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENob29zZXJQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZpbGVDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GaWxlQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZpbGVDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0RmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIDxjb2RlPlZpZXdlckZpbHRlcjwvY29kZT4gdGhhdCB3aWxsIGZpbHRlciB0aGUgY29udGVudCBvZiB0aGUKLQkgKiBkaWFsb2cgYW5kIG9ubHkgZGlzcGxheXMgd2hhdCBpcyB2YWxpZC4KLQkgKgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+Vmlld2VyRmlsdGVyPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyRmlsdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyZW50RWxlbWVudCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbWVudCkgewotCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGhpcy50ZXh0SG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB2YWx1ZSBob2xkZXIgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0eS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGhvbGRlciBvZiB0aGUgY2xhc3MgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsaWRhdG9yIHRoYXQgd2lsbCBzaG93IGEgc3RhdHVzIG1lc3NhZ2UgYmFzZWQgb24gd2hhdCBpcwotCSAqIHNlbGVjdGVkIGluIHRoZSBzZWxlY3Rpb24gZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBJU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShPYmplY3RbXSBzZWxlY3Rpb24pIHsKLQotCQkJCWlmIChzZWxlY3Rpb24ubGVuZ3RoICE9IDEpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0Q29tbW9uVWlQbHVnaW4uUExVR0lOX0lELCAiIik7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSnB0Q29tbW9uVWlQbHVnaW4uUExVR0lOX0lELCAiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGRpYWxvZydzIHRpdGxlLgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBzdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHByb2plY3QgcGF0aCB0aGF0IHdpbGwgYmUgdXNlZCBieSB0aGUgc2VsZWN0aW9uIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHByb2plY3QgcGF0aCB1c2VkIHRvIGRpc3BsYXkgaXRzIGNvbnRlbnQgaW4gYSBzZWxlY3Rpb24gZGlhbG9nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9qZWN0UGF0aCgpOwotCi0JcHJvdGVjdGVkICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGdldFRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRleHRIb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnRleHRIb2xkZXIgPSB0aGlzLmJ1aWxkVGV4dEhvbGRlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSBicm93c2UgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZpbGUgYW5kIHNldCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRGaWxlKCkgewotCQlTdHJpbmcgcHJvamVjdFBhdGg9IHRoaXMuZ2V0UHJvamVjdFBhdGgoKTsKLQotCQlGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKGdldFNoZWxsKCkpOwotCQlkaWFsb2cuc2V0VGV4dCh0aGlzLmdldERpYWxvZ1RpdGxlKCkpOwotCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwcm9qZWN0UGF0aCk7Ci0JCVN0cmluZyBmaWxlUGF0aCA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQlGaWxlQ2hvb3NlclBhbmUudGhpcy50ZXh0SG9sZGVyLnNldFZhbHVlKGZpbGVQYXRoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyQ29tYm9QYW5lLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlckNvbWJvUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2NjZThhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyQ29tYm9QYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGZvbGRlciB3aGVuIGJyb3dzaW5nLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9sZGVyQ2hvb3NlckNvbWJvUGFuZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgRm9sZGVyQ2hvb3NlclBhbmU8VD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvbGRlckNob29zZXJDb21ib1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBGb2xkZXJDaG9vc2VyQ29tYm9QYW5lKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Rm9sZGVyQ2hvb3NlckNvbWJvUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRm9sZGVyQ2hvb3NlckNvbWJvUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgYWRkTWFpbkNvbnRyb2woQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkKLQkJcmV0dXJuIGFkZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQl0aGlzLmJ1aWxkTGlzdEhvbGRlcigpLAotCQkJdGhpcy5nZXRUZXh0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBsaXN0IGhvbGRlciBvZiB0aGUgY29tYm8gYm94LgotCSAqLwotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJdGhpcy5idWlsZERlZmF1bHRMaXN0KCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGxpc3Qgb2YgdGhlIGNvbWJvIGJveC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkRGVmYXVsdExpc3QoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRoaXMuZ2V0RGVmYXVsdFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBjb21ibyBib3guCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKCk7Ci0JCi0JLyoqCi0JICogVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBjb21ibyBib3ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gYnVpbGRTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9sZGVyQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE0MTQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9Gb2xkZXJDaG9vc2VyUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpcmVjdG9yeURpYWxvZzsKLQotLyoqCi0gKiBUaGlzIGNob29zZXIgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIGZvbGRlciB3aGVuIGJyb3dzaW5nLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0gfAotICogfCBMYWJlbDogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJyb3dzZS4uLiB8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9sZGVyQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENob29zZXJQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkZvbGRlckNob29zZXJQYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRm9sZGVyQ2hvb3NlclBhbmUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb2xkZXJDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRm9sZGVyQ2hvb3NlclBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBidWlsZEJyb3dzZUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlwcm9tcHRGb2xkZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBhZGRNYWluQ29udHJvbChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0aGlzLnRleHRIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHZhbHVlIGhvbGRlciBvZiB0aGUgc3ViamVjdCdzIHByb3BlcnR5LgotCSAqCi0JICogQHJldHVybiBUaGUgaG9sZGVyIG9mIHRoZSBjbGFzcyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXNzYWdlIHRvIGJlIHNob3duIGluIHRoZSBzZWxlY3Rpb24gZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBzdHJpbmcgc2hvd24gYWJvdmUgdGhlIHRleHQgZmllbGQgb2YgdGhlCi0JICogc2VsZWN0aW9uIGRpYWxvZwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGlhbG9nTWVzc2FnZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VsZWN0aW9uIGRpYWxvZydzIHRpdGxlLgotCSAqCi0JICogQHJldHVybiBBIG5vbi08Y29kZT5udWxsPC9jb2RlPiBzdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpYWxvZ1RpdGxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXRoIHRoYXQgdGhlIGRpYWxvZyB3aWxsIHVzZSB0byBmaWx0ZXIgdGhlIGRpcmVjdG9yaWVzIGl0Ci0JICogc2hvd3MgdG8gdGhlIGFyZ3VtZW50LCB3aGljaCBtYXkgYmUgbnVsbC4gSWYgdGhlIHN0cmluZyBpcyBudWxsLCB0aGVuIHRoZQotCSAqIG9wZXJhdGluZyBzeXN0ZW0ncyBkZWZhdWx0IGZpbHRlciBwYXRoIHdpbGwgYmUgdXNlZC4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgdGhlIHBhdGggc3RyaW5nIGlzIHBsYXRmb3JtIGRlcGVuZGVudC4gRm9yIGNvbnZlbmllbmNlLCBlaXRoZXIKLQkgKiAnLycgb3IgJ1wnIGNhbiBiZSB1c2VkIGFzIGEgcGF0aCBzZXBhcmF0b3IuCi0JICogPC9wPgotCSAqCi0JICogQHJldHVybiBUaGUgZmlsdGVyIHBhdGgKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbHRlclBhdGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBnZXRUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0SG9sZGVyOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy50ZXh0SG9sZGVyID0gdGhpcy5idWlsZFRleHRIb2xkZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmb2xkZXIgYW5kIHNldCBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9tcHRGb2xkZXIoKSB7Ci0KLQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKHRoaXMuZ2V0RGlhbG9nTWVzc2FnZSgpKTsKLQkJZGlhbG9nLnNldFRleHQodGhpcy5nZXREaWFsb2dUaXRsZSgpKTsKLQkJZGlhbG9nLnNldEZpbHRlclBhdGgodGhpcy5maWx0ZXJQYXRoKCkpOwotCQlTdHJpbmcgZGlyZWN0b3J5ID0gZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlyZWN0b3J5ICE9IG51bGwpIHsKLQkJCXRoaXMudGV4dEhvbGRlci5zZXRWYWx1ZShkaXJlY3RvcnkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL0Zvcm1XaWRnZXRGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9ybVdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWExMzAyZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvRm9ybVdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRhdGVUaW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5Gb3JtVG9vbGtpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlNlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5UYWJsZVdyYXBEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwTGF5b3V0OwotCi0vKioKLSAqIFRoaXMgPGNvZGU+V2lkZ2V0RmFjdG9yeTwvY29kZT4gaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0gKiB1c2luZyB0aGUgPGNvZGU+Rm9ybVRvb2xraXQ8L2NvZGU+IGluIG9yZGVyIHVzZSB0aGUgZm9ybSBzdHlsZSAoZmxhdC1zdHlsZSkKLSAqIGxvb2sgYW5kIGZlZWwuCi0gKgotICogQHNlZSBGb3JtVG9vbGtpdAotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGb3JtV2lkZ2V0RmFjdG9yeSBpbXBsZW1lbnRzIFdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBmYWN0b3J5IHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbmV3IHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBGb3JtVG9vbGtpdCB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Gb3JtV2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcKLQkgKiB3aWRnZXRzCi0JICovCi0JcHVibGljIEZvcm1XaWRnZXRGYWN0b3J5KEZvcm1Ub29sa2l0IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKHdpZGdldEZhY3RvcnksICJUaGUgd2lkZ2V0IGZhY3RvcnkgY2Fubm90IGJlIG51bGwiKTsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ID0gd2lkZ2V0RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwcyB0aGUgZ2l2ZW4gPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiBpbnRvIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4KLQkgKiBpbiBvcmRlciB0byBoYXZlIHRoZSB3aWRnZXRzJyBib3JkZXIgcGFpbnRlZC4gRXhjZXB0IGZvciA8Y29kZT5DQ29tYm88L2NvZGU+LAotCSAqIHRoZSB0b3AgYW5kIGJvdHRvbSBtYXJnaW5zIGhhdmUgdG8gYmUgMiBwaXhlbCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0Ci0JICogbWFyZ2lucyBoYXZlIHRvIGJlIDEgcGl4ZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgb2YgdGhlIHN1Yi1wYW5lCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHRoYXQgaGFzIHRoZSBuZWNlc3Nhcnkgc3BhY2UgdG8gcGFpbnQKLQkgKiB0aGUgYm9yZGVyCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVCb3JkZXJDb250YWluZXIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gY3JlYXRlQm9yZGVyQ29udGFpbmVyKGNvbnRhaW5lciwgMiwgMSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQm9yZGVyQ29udGFpbmVyKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBtYXJnaW5IZWlnaHQsIGludCBtYXJnaW5XaWR0aCkgewotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gbWFyZ2luSGVpZ2h0OwotCQlsYXlvdXQubWFyZ2luV2lkdGggID0gbWFyZ2luV2lkdGg7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0JCWNvbnRhaW5lciA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKGNvbnRhaW5lcik7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULk5VTEwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgYnV0dG9uLCB3aGljaCBkZXRlcm1pbmVzIGl0cyB0eXBlOgotCSAqIHRvZ2dsZSwgcHVzaCwgY2hlY2sgYm94LCByYWRpbwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIENDb21ibyBjcmVhdGVDQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlQ0NvbWJvKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb21iby4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSBjb21ibywgdXN1YWxseSByZWFkLW9ubHksIGZsYXQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgQ0NvbWJvIGNyZWF0ZUNDb21ibyhDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJcGFyZW50ID0gY3JlYXRlQm9yZGVyQ29udGFpbmVyKHBhcmVudCwgMSwgMSk7Ci0KLQkJQ0NvbWJvIGNvbWJvID0gbmV3IENDb21ibyhwYXJlbnQsIHN0eWxlKTsKLQkJd2lkZ2V0RmFjdG9yeS5hZGFwdChjb21ibywgdHJ1ZSwgZmFsc2UpOwotCi0JCS8vIEJ1Z3ppbGxhIDE0NTgzNyAtIHdvcmthcm91bmQgZm9yIG5vIGJvcmRlcnMgb24gV2luZG93cyBYUAotCQlpZiAod2lkZ2V0RmFjdG9yeS5nZXRCb3JkZXJTdHlsZSgpID09IFNXVC5CT1JERVIpIHsKLQkJCWNvbWJvLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCX0KLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIHRleHQsIFNXVC5DSEVDSyk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZIHwgU1dULkZMQVQpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCk7Ci0JfQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgRGF0ZVRpbWUgY3JlYXRlRGF0ZVRpbWUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXBhcmVudCA9IGNyZWF0ZUJvcmRlckNvbnRhaW5lcihwYXJlbnQpOwotCi0JCURhdGVUaW1lIGRhdGVUaW1lID0gbmV3IERhdGVUaW1lKHBhcmVudCwgc3R5bGUgfCBTV1QuRkxBVCk7Ci0JCWRhdGVUaW1lLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCXRoaXMud2lkZ2V0RmFjdG9yeS5hZGFwdChkYXRlVGltZSwgdHJ1ZSwgZmFsc2UpOwotCi0JCXJldHVybiBkYXRlVGltZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgQ0NvbWJvIGNyZWF0ZUVkaXRhYmxlQ0NvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZUNDb21ibyhwYXJlbnQsIFNXVC5OVUxMKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIENvbWJvIGNyZWF0ZUVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5GTEFUKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRpdGxlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlncm91cC5zZXRUZXh0KHRpdGxlKTsKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVIeXBlcmxpbmsocGFyZW50LCB0ZXh0LCBTV1QuRkxBVCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZUxhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0LCBTV1QuV1JBUCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMaXN0IGNyZWF0ZUxpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHN0eWxlKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBMaXN0KGNvbnRhaW5lciwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JCWxpc3Quc2V0RGF0YShGb3JtVG9vbGtpdC5LRVlfRFJBV19CT1JERVIsIEZvcm1Ub29sa2l0LlRFWFRfQk9SREVSKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBGb3JtVGV4dCBjcmVhdGVNdWx0aUxpbmVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHdpZGdldEZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJY29udGFpbmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVRhYmxlV3JhcExheW91dCBsYXlvdXQgPSBuZXcgVGFibGVXcmFwTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zICAgPSAxOwotCQlsYXlvdXQuYm90dG9tTWFyZ2luID0gMDsKLQkJbGF5b3V0LmxlZnRNYXJnaW4gICA9IDA7Ci0JCWxheW91dC5yaWdodE1hcmdpbiAgPSAwOwotCQlsYXlvdXQudG9wTWFyZ2luICAgID0gMDsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCi0JCUZvcm1UZXh0IHRleHQgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUZvcm1UZXh0KGNvbnRhaW5lciwgdHJ1ZSk7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShuZXcgVGFibGVXcmFwRGF0YShUYWJsZVdyYXBEYXRhLkZJTExfR1JBQikpOwotCQl0ZXh0LnNldFRleHQobGFiZWxUZXh0LCBmYWxzZSwgZmFsc2UpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZVRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVQYXNzd29yZFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gY3JlYXRlVGV4dChwYXJlbnQsIFNXVC5QQVNTV09SRCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gY3JlYXRlQnV0dG9uKHBhcmVudCwgdGV4dCwgU1dULlBVU0gpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBjcmVhdGVCdXR0b24ocGFyZW50LCB0ZXh0LCBTV1QuUkFESU8pOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU2VjdGlvbiBjcmVhdGVTZWN0aW9uKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlyZXR1cm4gd2lkZ2V0RmFjdG9yeS5jcmVhdGVTZWN0aW9uKHBhcmVudCwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTcGlubmVyIGNyZWF0ZVNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlwYXJlbnQgPSBjcmVhdGVCb3JkZXJDb250YWluZXIocGFyZW50KTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihwYXJlbnQsIFNXVC5GTEFUKTsKLQkJc3Bpbm5lci5zZXREYXRhKEZvcm1Ub29sa2l0LktFWV9EUkFXX0JPUkRFUiwgRm9ybVRvb2xraXQuVEVYVF9CT1JERVIpOwotCQl3aWRnZXRGYWN0b3J5LmFkYXB0KHNwaW5uZXIsIHRydWUsIGZhbHNlKTsKLQotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRhYmxlIGNyZWF0ZVRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUYWJsZShwYXJlbnQsIFNXVC5CT1JERVIgfCBzdHlsZSk7Ci0JCXRhYmxlLnNldERhdGEoRm9ybVRvb2xraXQuS0VZX0RSQVdfQk9SREVSLCBGb3JtVG9vbGtpdC5URVhUX0JPUkRFUik7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVUZXh0KHBhcmVudCwgU1dULk5PTkUpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXJldHVybiB3aWRnZXRGYWN0b3J5LmNyZWF0ZVRleHQocGFyZW50LCBudWxsLCBTV1QuQk9SREVSIHwgU1dULkZMQVQgfCBzdHlsZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBCdXR0b24gY3JlYXRlVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCB0ZXh0LCB0aGlzKTsKLQkJcmV0dXJuIGNoZWNrQm94LmdldENoZWNrQm94KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcgd2lkZ2V0cy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhlIHdpZGdldHMgd2l0aCB0aGUgZm9ybSBzdHlsZSAoZmxhdC1zdHlsZSkKLQkgKi8KLQlwdWJsaWMgRm9ybVRvb2xraXQgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHdpZGdldEZhY3Rvcnk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9JbnRlZ2VyQ29tYm8uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9JbnRlZ2VyQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwM2Q2YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvSW50ZWdlckNvbWJvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlZlcmlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBhIFNwaW5uZXIuICBJdCBpcyBhIGNvbWJvIHRoYXQgb25seSBhY2NlcHRzIGludGVnZXJzLgotICogSXQgYWxzbyBpbmNsdWRlcyBhIERlZmF1bHQgb3B0aW9uIGluIHRoZSBjb21iby4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEludGVnZXJDb21ibzxUIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0KLQkvKioKLQkgKiBUaGUgbWFpbiAob25seSkgd2lkZ2V0IG9mIHRoaXMgcGFuZS4KLQkgKi8KLQlwcml2YXRlIENvbWJvIGNvbWJvQm94OwotCi0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlZmF1bHRWYWx1ZUhvbGRlcjsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSW50ZWdlckNvbWJvKAotCQkJCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQKLQkpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlckNvbWJvKAotCQkJCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudAotCSkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBDb21ibyBnZXRDb21ibygpIHsKLQkJcmV0dXJuIHRoaXMuY29tYm9Cb3g7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlSG9sZGVyID0gYnVpbGREZWZhdWx0U3RyaW5nSG9sZGVyKCk7Ci0JCXRoaXMuY29tYm9Cb3ggPSB0aGlzLmFkZEludGVnZXJDb21ibyhjb250YWluZXIpOwotCi0JCWludCBtYXJnaW4gPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0TWF4aW11bURlY29yYXRpb25XaWR0aCgpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ID0gbWFyZ2luOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCXRoaXMuY29tYm9Cb3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQotCQl0aGlzLmNvbWJvQm94LmFkZFZlcmlmeUxpc3RlbmVyKHRoaXMuYnVpbGRWZXJpZnlMaXN0ZW5lcigpKTsKLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKHRoaXMuY29tYm9Cb3gpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm8gYWRkSW50ZWdlckNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQkJY29udGFpbmVyLAotCQkJCWdldExhYmVsVGV4dCgpLAotCQkJCWJ1aWxkRGVmYXVsdExpc3RIb2xkZXIoKSwKLQkJCQlidWlsZFNlbGVjdGVkSXRlbVN0cmluZ0hvbGRlcigpLAotCQkJCWdldEhlbHBJZCgpCi0JCQkJKTsKLQkJCi0JfQotCQotCXByb3RlY3RlZCBWZXJpZnlMaXN0ZW5lciBidWlsZFZlcmlmeUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFZlcmlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmVyaWZ5VGV4dChWZXJpZnlFdmVudCBlKSB7Ci0JCQkJSW50ZWdlckNvbWJvLnRoaXMudmVyaWZ5Q29tYm9Cb3goZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuZGVmYXVsdFZhbHVlSG9sZGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZERlZmF1bHRIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEludGVnZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKEludGVnZXIgZGVmYXVsdFZhbHVlKSB7Ci0JCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sCi0JCQkJZGVmYXVsdFZhbHVlCi0JCQkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU2VsZWN0ZWRJdGVtU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlciwgU3RyaW5nPihidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEludGVnZXIgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IAotCQkJCQkJZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkJCQkJOiAKLQkJCQkJCXZhbHVlLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgcmV2ZXJzZVRyYW5zZm9ybV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaW50IGludExlbmd0aDsKLQkJCQl0cnkgewotCQkJCQlpbnRMZW5ndGggPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vaWYgdGhlIGRlZmF1bHQgaXMgc2VsZWN0ZWQgZnJvbSB0aGUgY29tYm8sIHNldCBsZW5ndGggdG8gbnVsbAotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihpbnRMZW5ndGgpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogYWJzdHJhY3QgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMYWJlbFRleHQoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEhlbHBJZCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKTsKLQotCS8vICoqKioqKioqKiogY29tYm8tYm94IHZlcmlmeSBsaXN0ZW5lciBjYWxsYmFjayAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDb21ib0JveChWZXJpZnlFdmVudCBlKSB7Ci0JCWlmIChlLmNoYXJhY3RlciA9PSAnXGInKSB7Ci0JCQkvL2lnbm9yZSBiYWNrc3BhY2UKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZS50ZXh0LmVxdWFscygiIikgLy9EZWZhdWx0VmFsdWVIYW5kbGVyIHNldHMgdGhlIHRleHQgdG8gIiIgLy8kTk9OLU5MUy0xJAotCQkJCXx8IGUudGV4dC5lcXVhbHModGhpcy5kZWZhdWx0VmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpIHsgCi0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCUludGVnZXIucGFyc2VJbnQoZS50ZXh0KTsKLQkJfQotCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGQ2MzU1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9OZXdOYW1lRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBUaGUgZGlhbG9nIHVzZWQgdG8gcmVxdWVzdHMgYSBuYW1lIGZyb20gdGhlIHVzZXIuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdOYW1lRGlhbG9nIGV4dGVuZHMgVmFsaWRhdGluZ0RpYWxvZzxOZXdOYW1lU3RhdGVPYmplY3Q+Ci17Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBJbWFnZSBkZXNjcmlwdGlvbkltYWdlOwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWxUZXh0OwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVEaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFNoZWxsCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uVGl0bGUKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25JbWFnZQotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEBwYXJhbSBuYW1lcwotCSAqLwotCU5ld05hbWVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsCi0JICAgICAgICAgICAgICBTdHJpbmcgZGlhbG9nVGl0bGUsCi0JICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSwKLQkgICAgICAgICAgICAgIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2UsCi0JICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCi0JICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgU3RyaW5nIG5hbWUsCi0JICAgICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpCi0JewotCQlzdXBlcihwYXJlbnRTaGVsbCwgZGlhbG9nVGl0bGUpOwotCi0JCXRoaXMubmFtZSAgICAgICAgICAgICA9IG5hbWU7Ci0JCXRoaXMubmFtZXMgICAgICAgICAgICA9IG5hbWVzOwotCQl0aGlzLmxhYmVsVGV4dCAgICAgICAgPSBsYWJlbFRleHQ7Ci0JCXRoaXMuZGVzY3JpcHRpb24gICAgICA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmRlc2NyaXB0aW9uSW1hZ2UgPSBkZXNjcmlwdGlvbkltYWdlOwotCQl0aGlzLmRlc2NyaXB0aW9uVGl0bGUgPSBkZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPE5ld05hbWVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IE5ld05hbWVEaWFsb2dQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5ld05hbWVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IE5ld05hbWVTdGF0ZU9iamVjdChuYW1lLCBuYW1lcyk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQotCQlOZXdOYW1lRGlhbG9nUGFuZSBwYW5lID0gKE5ld05hbWVEaWFsb2dQYW5lKSBnZXRQYW5lKCk7Ci0JCXBhbmUuc2VsZWN0QWxsKCk7Ci0KLQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKGZhbHNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlIGdldERlc2NyaXB0aW9uSW1hZ2UoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbkltYWdlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZmllbGQncyBpbnB1dCwgd2hpY2ggaXMgdGhlIG5ldyBuYW1lIHRoZSB1c2VyIGVudGVyZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lIHRoZSB1c2VyIGVudGVyZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TmFtZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgTmV3TmFtZURpYWxvZ1BhbmUgZXh0ZW5kcyBEaWFsb2dQYW5lPE5ld05hbWVTdGF0ZU9iamVjdD4gewotCi0JCXByaXZhdGUgVGV4dCB0ZXh0OwotCi0JCU5ld05hbWVEaWFsb2dQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKE5ld05hbWVEaWFsb2cudGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TmV3TmFtZVN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgTmV3TmFtZVN0YXRlT2JqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJCXRleHQgPSBhZGRMYWJlbGVkVGV4dCgKLQkJCQljb250YWluZXIsCi0JCQkJbGFiZWxUZXh0LAotCQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCQkpOwotCQl9Ci0KLQkJdm9pZCBzZWxlY3RBbGwoKSB7Ci0JCQl0ZXh0LnNlbGVjdEFsbCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVEaWFsb2dCdWlsZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZ0J1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE0MmMwNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZURpYWxvZ0J1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgYnVpbGRlciBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgYSBmdWxseSBpbml0aWFsaXplZAotICogPGNvZGU+TmV3TmFtZURpYWxvZzwvY29kZT4gb25jZSBhbGwgdGhlIHByb3BlcnRpZXMgaGF2ZSBiZWVuIHNldC4KLSAqCi0gKiBAc2VlIE5ld05hbWVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTmV3TmFtZURpYWxvZ0J1aWxkZXIgewotCi0JLyoqCi0JICogVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCS8qKgotCSAqIFRoZSBpbWFnZSBvZiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIEltYWdlIGRlc2NyaXB0aW9uSW1hZ2U7Ci0KLQkvKioKLQkgKiBUaGUgdGl0bGUgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvblRpdGxlOwotCi0JLyoqCi0JICogVGhlIHRpdGxlIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGlhbG9nVGl0bGU7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxhYmVsVGV4dDsKLQotCS8qKgotCSAqIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuIGJlCi0JICogc3BlY2lmaWVkLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub25lCi0JICogYXJlIGF2YWlsYWJsZS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBuYW1lczsKLQotCS8qKgotCSAqIFRoZSBwYXJlbnQgc2hlbGwgb2YgdGhlIG5ldyBuYW1lIGRpYWxvZy4KLQkgKi8KLQlwcml2YXRlIFNoZWxsIHBhcmVudFNoZWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lRGlhbG9nQnVpbGRlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50U2hlbGwgVGhlIHBhcmVudCBzaGVsbCBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nCi0JICovCi0JcHVibGljIE5ld05hbWVEaWFsb2dCdWlsZGVyKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUocGFyZW50U2hlbGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGRpYWxvZyB0aGF0IHdpbGwgYmUgdXNlZCB0byByZXF1ZXN0IGEgbmV3IG5hbWUgZnJvbSB0aGUgdXNlci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGluaXRpYWxpemVkIGRpYWxvZwotCSAqLwotCXB1YmxpYyBOZXdOYW1lRGlhbG9nIGJ1aWxkRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IE5ld05hbWVEaWFsb2coCi0JCQlwYXJlbnRTaGVsbCwKLQkJCWRpYWxvZ1RpdGxlLAotCQkJZGVzY3JpcHRpb25UaXRsZSwKLQkJCWRlc2NyaXB0aW9uSW1hZ2UsCi0JCQlkZXNjcmlwdGlvbiwKLQkJCWxhYmVsVGV4dCwKLQkJCW5hbWUsCi0JCQluYW1lcwotCQkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgYnVpbGRlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbCBUaGUgcGFyZW50IHNoZWxsIG9mIHRoZSBuZXcgbmFtZSBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChwYXJlbnRTaGVsbCwgIlRoZSBwYXJlbnQgc2hlbGwgY2Fubm90IGJlIG51bGwiKTsKLQotCQl0aGlzLnBhcmVudFNoZWxsID0gcGFyZW50U2hlbGw7Ci0JCXRoaXMubmFtZXMgICAgICAgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiB0byBiZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYSB1bmRlciB0aGUgdGl0bGUuCi0JICoKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW1hZ2UgdG8gYmUgc2hvd24gdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGRlc2NyaXB0aW9uIGFyZWEuCi0JICoKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25JbWFnZSBUaGUgaW1hZ2Ugb2YgdGhlIGRlc2NyaXB0aW9uIGFyZWEKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbkltYWdlKEltYWdlIGRlc2NyaXB0aW9uSW1hZ2UpIHsKLQkJdGhpcy5kZXNjcmlwdGlvbkltYWdlID0gZGVzY3JpcHRpb25JbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0aXRsZSB0byBiZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gYXJlYS4KLQkgKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvblRpdGxlIFRoZSB0aXRsZSB0byBzaG93IGluIHRoZSBkZXNjcmlwdGlvbiBhcmVhCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25UaXRsZShTdHJpbmcgZGVzY3JpcHRpb25UaXRsZSkgewotCQl0aGlzLmRlc2NyaXB0aW9uVGl0bGUgPSBkZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRpYWxvZydzIHRpdGxlLgotCSAqCi0JICogQHBhcmFtIGRpYWxvZ1RpdGxlIFRoZSB0aXRsZSBvZiB0aGUgbmV3IG5hbWUgZGlhbG9nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlhbG9nVGl0bGUoU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMuZGlhbG9nVGl0bGUgPSBkaWFsb2dUaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBleGlzdGluZyBuYW1lcyB0aGF0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgdGV4dCBmaWVsZCdzCi0JICogaW5wdXQgYW5kIHByZXZlbnQgdGhlIHVzZXIgZnJvbSB1c2luZyBpdC4KLQkgKgotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeGlzdGluZ05hbWVzKEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMpIHsKLQkJdGhpcy5uYW1lcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB0ZXh0IHRvIGxhYmVsIHRoZSB0ZXh0IGZpZWxkLgotCSAqCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBmaWVsZCdzIGxhYmVsCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWxUZXh0KFN0cmluZyBsYWJlbFRleHQpIHsKLQkJdGhpcy5sYWJlbFRleHQgPSBsYWJlbFRleHQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgaW5pdGlhbCBuYW1lIGlmIG9uZSBleGlzdHMuIEl0IGlzIHZhbGlkIHRvIGxlYXZlIHRoaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIHRoZSB1c2VyIGhhcyB0byBlbnRlciBzb21ldGhpbmcuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvTmV3TmFtZVN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NmJhZTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL05ld05hbWVTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5OZXdOYW1lRGlhbG9nPC9jb2RlPiwgd2hpY2ggc3RvcmVzCi0gKiB0aGUgY3VycmVudCBuYW1lIGFuZCB2YWxpZGF0ZXMgaXQgd2hlbiBpdCBpcyBtb2RpZmllZC4KLSAqCi0gKiBAc2VlIE5ld05hbWVEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1maW5hbCBjbGFzcyBOZXdOYW1lU3RhdGVPYmplY3QgZXh0ZW5kcyBBYnN0cmFjdE5vZGUKLXsKLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbiBiZQotCSAqIHNwZWNpZmllZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgbmFtZXMgdGhhdCBjYW4ndCBiZSB1c2VkIG9yIGFuIGVtcHR5IGNvbGxlY3Rpb24gaWYgbm9uZQotCSAqIGFyZSBhdmFpbGFibGUuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXM7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+VmFsaWRhdG9yPC9jb2RlPiB1c2VkIHRvIHZhbGlkYXRlIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgVmFsaWRhdG9yIHZhbGlkYXRvcjsKLQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBuYW1lIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TmV3TmFtZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBuYW1lIFRoZSBpbml0aWFsIGlucHV0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGluaXRpYWwgdmFsdWUgY2FuCi0JICogYmUgc3BlY2lmaWVkCi0JICogQHBhcmFtIG5hbWVzIFRoZSBjb2xsZWN0aW9uIG9mIG5hbWVzIHRoYXQgY2FuJ3QgYmUgdXNlZCBvciBhbiBlbXB0eQotCSAqIGNvbGxlY3Rpb24gaWYgbm9uZSBhcmUgYXZhaWxhYmxlCi0JICovCi0JTmV3TmFtZVN0YXRlT2JqZWN0KFN0cmluZyBuYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXMpIHsKLQkJc3VwZXIobnVsbCk7Ci0KLQkJdGhpcy5uYW1lICA9IG5hbWU7Ci0JCXRoaXMubmFtZXMgPSBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIG5hbWUgcHJvcGVydHkuCi0JICoKLQkgKiBAcGFyYW0gY3VycmVudFByb2JsZW1zIFRoZSBsaXN0IHRvIHdoaWNoIDxjb2RlPlByb2JsZW08L2NvZGU+cyBjYW4gYmUKLQkgKiBhZGRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGROYW1lUHJvYmxlbXMoTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0Q29tbW9uVWlNZXNzYWdlcy5OZXdOYW1lU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWVzLmNvbnRhaW5zKG5hbWUudHJpbSgpKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0Q29tbW9uVWlNZXNzYWdlcy5OZXdOYW1lU3RhdGVPYmplY3RfbmFtZUFscmVhZHlFeGlzdHMsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpCi0JewotCQlzdXBlci5hZGRQcm9ibGVtc1RvKGN1cnJlbnRQcm9ibGVtcyk7Ci0JCWFkZE5hbWVQcm9ibGVtcyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBuYW1lIHN0b3JlZCBpbiB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGN1cnJlbnQgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJyZW50IG5hbWUgc3RvcmVkIGluIHRoaXMgc3RhdGUgb2JqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogY2xlYXIgaXQuCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgbmV3IG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYWNrYWdlQ2hvb3NlclBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NzI2Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvUGFja2FnZUNob29zZXJQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5KcHRDb21tb25VaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogVGhpcyBjaG9vc2VyIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSBwYWNrYWdlIHdoZW4gYnJvd3NpbmcgYW5kIGl0IGFkZHMKLSAqIGNvZGUgY29tcGxldGlvbiBzdXBwb3J0IHRvIHRoZSB0ZXh0IGZpZWxkLCB3aGljaCBpcyB0aGUgbWFpbiBjb21wb25lbnQuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExhYmVsOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYWNrYWdlQ2hvb3NlclBhbmU8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENob29zZXJQYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGNvZGUgY29tcGxldGlvbiBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yIGphdmFQYWNrYWdlQ29tcGxldGlvblByb2Nlc3NvcjsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhY2thZ2VDaG9vc2VyUGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBhY2thZ2VDaG9vc2VyUGFuZShQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYWNrYWdlQ2hvb3NlclBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBhY2thZ2VDaG9vc2VyUGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJLy8gVE9ETyBidWcgMTU2MTg1IC0gd2hlbiB0aGlzIGlzIGZpeGVkIHRoZXJlIHNob3VsZCBiZSBhcGkgZm9yIHRoaXMKLQkJdGhpcy5qYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSmF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yKAotCQkJbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ST09UKQotCQkpOwotCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5wYWNrYWdlQ2hvb3NlclN1YmplY3RDaGFuZ2VkKGdldFN1YmplY3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVBhY2thZ2VDaG9vc2VyUGFuZS50aGlzLnBhY2thZ2VDaG9vc2VyU3ViamVjdENoYW5nZWQoKFQpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFja2FnZUNob29zZXJTdWJqZWN0Q2hhbmdlZChUIG5ld1N1YmplY3QpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IG51bGw7Ci0JCWlmIChuZXdTdWJqZWN0ICE9IG51bGwpIHsKLQkJCXJvb3QgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCX0KLQkJdGhpcy5qYXZhUGFja2FnZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50Um9vdChyb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgUnVubmFibGUgYnVpbGRCcm93c2VBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHJvbXB0UGFja2FnZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGFkZE1haW5Db250cm9sKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKGNvbnRhaW5lcik7Ci0KLQkJVGV4dCB0ZXh0ID0gYWRkVGV4dChzdWJQYW5lLCBidWlsZFRleHRIb2xkZXIoKSk7Ci0KLQkJSW1hZ2UgaW1hZ2UgPSBGaWVsZERlY29yYXRpb25SZWdpc3RyeS5nZXREZWZhdWx0KCkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19DT05URU5UX1BST1BPU0FMKS5nZXRJbWFnZSgpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGltYWdlLmdldEJvdW5kcygpLndpZHRoOwotCQl0ZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlVGV4dENvbnRlbnRBc3Npc3RhbnQoCi0JCQl0ZXh0LAotCQkJamF2YVBhY2thZ2VDb21wbGV0aW9uUHJvY2Vzc29yCi0JCSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgdmFsdWUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBob2xkZXIgb2YgdGhlIHBhY2thZ2UgbmFtZQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpOwotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBQYWNrYWdlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCBwYWNrYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsbGVkIHRoZSBkaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBjaG9vc2VQYWNrYWdlKCkgewotCi0JCVNlbGVjdGlvbkRpYWxvZyBzZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVQYWNrYWdlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpCi0JCQkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0Q29tbW9uVWlQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlzZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0Q29tbW9uVWlNZXNzYWdlcy5QYWNrYWdlQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGUpOwotCQlzZWxlY3Rpb25EaWFsb2cuc2V0TWVzc2FnZShKcHRDb21tb25VaU1lc3NhZ2VzLlBhY2thZ2VDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2sgPSBnZXRQYWNrYWdlRnJhZ21lbnQoKTsKLQotCQlpZiAocGFjayAhPSBudWxsKSB7Ci0JCQlzZWxlY3Rpb25EaWFsb2cuc2V0SW5pdGlhbFNlbGVjdGlvbnMobmV3IE9iamVjdFtdIHsgcGFjayB9KTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb25EaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJcmV0dXJuIChJUGFja2FnZUZyYWdtZW50KSBzZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYWNrYWdlIG5hbWUgZnJvbSBpdHMgc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhY2thZ2UgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGlzIGRlZmluZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGUgYnJvd3NlIGJ1dHRvbiB3YXMgY2xpY2tlZCwgaXRzIGFjdGlvbiBpbnZva2VzIHRoaXMgYWN0aW9uIHdoaWNoIHNob3VsZAotCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBwYWNrYWdlIGFuZCBzZXQgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvbXB0UGFja2FnZSgpIHsKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSBjaG9vc2VQYWNrYWdlKCk7Ci0KLQkJaWYgKHBhY2thZ2VGcmFnbWVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCXRoaXMuc2V0UGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwotCi0JCWlmIChwYWNrYWdlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRDb21tb25VaVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1BhbmUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9QYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTNhODIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1BhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuRmllbGREZWNvcmF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5saXN0ZW5lcnMuU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuRGF0ZVRpbWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sQWxpZ25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuTGFiZWxlZEJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuTGFiZWxlZENvbnRyb2xVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGF0ZVRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5FeHBhbmRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuRm9ybVRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5IeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMud2lkZ2V0cy5TZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBhIHBhbmUgd2hpY2ggaG9sZHMgb250byBhIDxjb2RlPlByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4KLSAqIHRoYXQgY29udGFpbnMgdGhlIHN1YmplY3Qgb2YgdGhpcyBwYW5lLgotICogPHA+Ci0gKiBJdCBhbHNvIGNvbnRhaW5zIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGJ1aWxkaW5nIGJ1dHRvbnMsIGxhYmVscywgY2hlY2sKLSAqIGJveGVzLCBhbmQgcmFkaW8gYnV0dG9ucywgZXRjLgotICogPHA+Ci0gKiBJdCBpcyBwb3NzaWJsZSB0byBlYXNpbHkgbGlzdGVuIHRvIGFueSBwcm9wZXJ0eSBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQotICogc3ViamVjdCwge0BsaW5rICNhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb24pfSBpcyBzcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMKLSAqIGFyZSBvZiBpbnRlcmVzdCBhbmQge0BsaW5rICNwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nKX0gaXMgdXNlZCB0byBub3RpZnkgdGhlCi0gKiBwYW5lIHdoZW4gdGhlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotICoKLSAqIEBzZWUgRm9ybVBhbmUKLSAqIEBzZWUgRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYW5lPFQgZXh0ZW5kcyBNb2RlbD4KLXsKLQkvKioKLQkgKiBUaGUgbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzdWJqZWN0IGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYQotCSAqIHByb3BlcnR5IGhhcyBjaGFuZ2VkLCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIGRldGVybWluZWQgYnkKLQkgKiB7QGxpbmsgI3Byb3BlcnR5TmFtZXMoKX0uCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFzcGVjdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIGNvbnRhaW5lciBvZiB0aGlzIGNvbXBvc2l0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIENvbXBvc2l0ZSBjb250YWluZXI7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIGxlZnRDb250cm9sQWxpZ25lcjsKLQotCS8qKgotCSAqIEZsYWcgdXNlZCB0byBzdG9wIHRoZSBjaXJjdWxhciBwb3B1bGF0aW9uIG9mIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHBvcHVsYXRpbmc7Ci0KLQkvKioKLQkgKiBUaGUgYWxpZ25lciByZXNwb25zaWJsZSB0byBhbGlnbiB0aGUgbGVmdCBjb250cm9scy4KLQkgKi8KLQlwcml2YXRlIENvbnRyb2xBbGlnbmVyIHJpZ2h0Q29udHJvbEFsaWduZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc3ViamVjdCBob2xkZXIgaW4gb3JkZXIgdG8KLQkgKiBhdXRvbWF0aWNhbGx5IHJlcG9wdWxhdGUgdGhpcyBwYW5lIHdpdGggdGhlIG5ldyBzdWJqZWN0LgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBvZiB0aGlzIHBhbmUuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlcjsKLQotCS8qKgotCSAqIFRoZSBjb2xsZWN0aW9uIG9mIHJlZ2lzdGVyZWQgc3ViLXBhbmVzIHdpbGwgYmUgYXV0b21hdGljYWxseSBub3RpZmllZAotCSAqIHdoZW4gbGlzdGVuZXJzIG5lZWQgdG8gYmUgZW5nYWdlZCBvciBkaXNlbmdhZ2VkIG9yIHdoZW4gdG8gcG9wdWxhdGUgaXRzCi0JICogd2lkZ2V0cy4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248UGFuZTw/Pj4gc3ViUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzLgotCSAqLwotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5OwotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gb2YgPGNvZGU+Q29udHJvbDwvY29kZT5zIHRoYXQgYXJlIGRpc3BsYXllZCBpbiB0aGlzIHBhbmUsCi0JICogd2hpY2ggd2lsbCBoYXZlIHRoZWlyIGVuYWJsZW1lbnQgc3RhdGUgdXBkYXRlZCB3aGVuCi0JICoge0BsaW5rICNlbmFibGVXaWRnZXRzKGJvb2xlYW4pfSBpcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBBcnJheUxpc3Q8Q29udHJvbD4gbWFuYWdlZFdpZGdldHM7Ci0KLQkvKioKLQkgKiBUaGUgY29sbGVjdGlvbiBvZiA8Y29kZT5QYW5lPC9jb2RlPnMgdGhhdCBhcmUgZGlzcGxheWVkIGluIHRoaXMgcGFuZSwKLQkgKiB3aGljaCB3aWxsIGhhdmUgdGhlaXIgZW5hYmxlbWVudCBzdGF0ZSB1cGRhdGVkIHdoZW4KLQkgKiB7QGxpbmsgI2VuYWJsZVdpZGdldHMoYm9vbGVhbil9IGlzIGNhbGxlZC4KLQkgKi8KLQlwcml2YXRlIEFycmF5TGlzdDxQYW5lPD8+PiBtYW5hZ2VkU3ViUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGlzIGVuYWJsZWQgbW9kZWwgaXMgdXNlZCB0byBzdG9yZSB0aGUgcGFuZSdzIGJhc2UgZW5hYmxlbWVudCBzdGF0ZS4KLQkgKiBJZiBBUEkgaXMgY2FsbGVkIHRvIHNldCB0aGUgcGFuZSBlbmFibGVkLCB0aGlzIG1vZGVsIGdldHMgdXBkYXRlZC4gIElmIHRoZSBwYW5lIGlzIHRoZXJlYnkKLQkgKiBmdWxseSBlbmFibGVkIChjb250cm9sbGVyIGVuYWJsZWQgbW9kZWwgaXMgYWxzbyBpbiBhZ3JlZW1lbnQpIHRoZSBwYW5lJ3Mgd2lkZ2V0cyBhcmUgc2V0Ci0JICogZW5hYmxlZC4KLQkgKiBAc2VlICNnZXRDb21iaW5lZEVuYWJsZWRNb2RlbCgpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBiYXNlRW5hYmxlZE1vZGVsCi0JCQk9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQotCS8qKgotCSAqIFRoaXMgZW5hYmxlZCBtb2RlbCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgcGFuZSdzIGVuYWJsZW1lbnQgYXMgY29udHJvbGxlZCBieSBvdGhlciB3aWRnZXRzLAotCSAqIHRlc3RzLCBldGMuIChmb3IgZXhhbXBsZSBhIHJhZGlvIGJ1dHRvbikKLQkgKiBJZiB0aGlzIG1vZGVsIGlzIGNoYW5nZWQsIGFuZCB0aGUgcGFuZSBpcyB0aGVyZWJ5IGZ1bGx5IGVuYWJsZWQgKGJhc2UgZW5hYmxlZCBtb2RlbCBpcyBhbHNvCi0JICogaW4gYWdyZWVtZW50KSB0aGUgcGFuZSdzIHdpZGdldHMgYXJlIHNldCBlbmFibGVkLgotCSAqIEBzZWUgI2dldENvbWJpbmVkRW5hYmxlZE1vZGVsKCkKLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjb250cm9sbGVyRW5hYmxlZE1vZGVsOwotCi0JLyoqCi0JICogVGhlICJhbmQiIGNvbWJpbmF0aW9uIG9mIHtAbGluayAjYmFzZUVuYWJsZWRNb2RlbH0gYW5kIHtAbGluayAjY29udHJvbGxlckVuYWJsZWRNb2RlbH0KLQkgKi8KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBjb21iaW5lZEVuYWJsZWRNb2RlbDsKLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjb21iaW5lZEVuYWJsZWRNb2RlbExpc3RlbmVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQl0aGlzKHBhcmVudFBhbmUsIHBhcmVudCwgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpIHsKLQotCQl0aGlzKAotCQkJcGFyZW50UGFuZSwKLQkJCXBhcmVudFBhbmUuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJcGFyZW50LAotCQkJYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQotCQl0aGlzKAotCQkJcGFyZW50UGFuZSwKLQkJCXBhcmVudFBhbmUuZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJcGFyZW50LAotCQkJYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkJCXBhcmVudE1hbmFnZVBhbmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHRydWUsIGVuYWJsZWRNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXRoaXMocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0KLQkJdGhpcyhwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHRydWUsIGVuYWJsZWRNb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYW5lPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEBwYXJhbSBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzIDxjb2RlPnRydWU8L2NvZGU+IHRvIG1ha2UgdGhlIHdpZGdldHMKLQkgKiB0aGlzIHBhbmUgYWxpZ25lZCB3aXRoIHRoZSB3aWRnZXRzIG9mIHRoZSBnaXZlbiBwYXJlbnQgcGFuZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gbm90IGFsaWduIHRoZW0KLQkgKiBAcGFyYW0gcGFyZW50TWFuYWdlUGFuZSA8Y29kZT50cnVlPC9jb2RlPiB0byBoYXZlIHRoZSBwYXJlbnQgcGFuZSBtYW5hZ2UKLQkgKiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGlzIHBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCWJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cywKLQkJCWJvb2xlYW4gcGFyZW50TWFuYWdlUGFuZSkgewotCi0JCXRoaXMoc3ViamVjdEhvbGRlciwgcGFyZW50LCBwYXJlbnRQYW5lLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShwYXJlbnRQYW5lLCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzLCBwYXJlbnRNYW5hZ2VQYW5lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JCQlib29sZWFuIHBhcmVudE1hbmFnZVBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0KLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHBhcmVudFBhbmUuZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudFBhbmUsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsIHBhcmVudE1hbmFnZVBhbmUpOwotCQl0aGlzLmluaXRpYWxpemVFbmFibGVkTW9kZWwoZW5hYmxlZE1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKgotCSAqIEBjYXRlZ29yeSBDb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBQYW5lKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZShzdWJqZWN0SG9sZGVyLCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5jb250YWluZXIgPSB0aGlzLmFkZENvbnRhaW5lcihwYXJlbnQpOwotCQl0aGlzLmluaXRpYWxpemVMYXlvdXQodGhpcy5jb250YWluZXIpOwotCQl0aGlzLmVuZ2FnZVN1YmplY3RIb2xkZXIoKTsKLQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnMoZ2V0U3ViamVjdCgpKTsKLQkJdGhpcy5wb3B1bGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoc3ViamVjdEhvbGRlciwgIlRoZSBzdWJqZWN0IGhvbGRlciBjYW5ub3QgYmUgbnVsbCIpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlciAgICAgICAgID0gKFByb3BlcnR5VmFsdWVNb2RlbDxUPikgc3ViamVjdEhvbGRlcjsKLQkJdGhpcy53aWRnZXRGYWN0b3J5ICAgICAgICAgPSB3aWRnZXRGYWN0b3J5OwotCQl0aGlzLnN1YlBhbmVzICAgICAgICAgICAgICA9IG5ldyBBcnJheUxpc3Q8UGFuZTw/Pj4oKTsKLQkJdGhpcy5tYW5hZ2VkV2lkZ2V0cyAgICAgICAgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2w+KCk7Ci0JCXRoaXMubWFuYWdlZFN1YlBhbmVzICAgICAgID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigpOwotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lciAgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIgICA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQl0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lciAgPSB0aGlzLmJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXIoKTsKLQotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgdGhpcyBwYW5lIHdpdGggdGhlIHBhcmVudCBwYW5lLgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lCi0JICogQHBhcmFtIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gbWFrZSB0aGUgd2lkZ2V0cwotCSAqIHRoaXMgcGFuZSBhbGlnbmVkIHdpdGggdGhlIHdpZGdldHMgb2YgdGhlIGdpdmVuIHBhcmVudCBwYW5lOwotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBub3QgYWxpZ24gdGhlbQotCSAqIEBwYXJhbSBwYXJlbnRNYW5hZ2VQYW5lIDxjb2RlPnRydWU8L2NvZGU+IHRvIGhhdmUgdGhlIHBhcmVudCBwYW5lIG1hbmFnZQotCSAqIHRoZSBlbmFibGVkIHN0YXRlIG9mIHRoaXMgcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IEluaXRpYWxpemF0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlib29sZWFuIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMsCi0JICAgICAgICBib29sZWFuIHBhcmVudE1hbmFnZVBhbmUpIHsKLQotCQkvLyBSZWdpc3RlciB0aGlzIHBhbmUgd2l0aCB0aGUgcGFyZW50IHBhbmUsIGl0IHdpbGwgY2FsbCB0aGUgbWV0aG9kcwotCQkvLyBhdXRvbWF0aWNhbGx5IChlbmdhZ2VMaXN0ZW5lcnMoKSwgZGlzZW5nYWdlTGlzdGVuZXJzKCksIHBvcHVsYXRlKCksCi0JCS8vIGRpc3Bvc2UoKSwgZXRjKQotCQlwYXJlbnRQYW5lLnJlZ2lzdGVyU3ViUGFuZSh0aGlzKTsKLQotCQlpZiAocGFyZW50TWFuYWdlUGFuZSkgewotCQkJcGFyZW50UGFuZS5tYW5hZ2VTdWJQYW5lKHRoaXMpOwotCQl9Ci0KLQkJLy8gQWxpZ24gdGhlIGxlZnQgYW5kIHJpZ2h0IGNvbnRyb2xzIHdpdGggdGhlIGNvbnRyb2xzIGZyb20gdGhlIHBhcmVudAotCQkvLyBwYW5lCi0JCWlmIChhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0JCQlwYXJlbnRQYW5lLmFkZEFsaWduTGVmdCh0aGlzKTsKLQkJCXBhcmVudFBhbmUuYWRkQWxpZ25SaWdodCh0aGlzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRW5hYmxlZE1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJdGhpcy5jb250cm9sbGVyRW5hYmxlZE1vZGVsID0gZW5hYmxlZE1vZGVsOwotCQl0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsID0KLQkJCQlDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmFuZCh0aGlzLmJhc2VFbmFibGVkTW9kZWwsIHRoaXMuY29udHJvbGxlckVuYWJsZWRNb2RlbCk7Ci0JCXRoaXMuY29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lciA9IGJ1aWxkQ29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcigpOwotCQl0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsTGlzdGVuZXIpOwotCQllbmFibGVXaWRnZXRzXyhnZXRDb21iaW5lZEVuYWJsZW1lbnQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZENvbnRyb2xsZXJFbmFibGVkTW9kZWxMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29udHJvbGxlckVuYWJsZWRNb2RlbExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUGFuZS50aGlzLmNvbnRyb2xsZXJFbmFibGVtZW50Q2hhbmdlZCgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQlwcml2YXRlIHZvaWQgbWFuYWdlV2lkZ2V0KENvbnRyb2wgY29udHJvbCkgewotCQlpZiAodGhpcy5tYW5hZ2VkV2lkZ2V0cy5jb250YWlucyhjb250cm9sKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubWFuYWdlZFdpZGdldHMuYWRkKGNvbnRyb2wpOwotCX0KLQotCXByaXZhdGUgdm9pZCBtYW5hZ2VTdWJQYW5lKFBhbmU8Pz4gc3ViUGFuZSkgewotCQlpZiAodGhpcy5tYW5hZ2VkU3ViUGFuZXMuY29udGFpbnMoc3ViUGFuZSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm1hbmFnZWRTdWJQYW5lcy5hZGQoc3ViUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGggaXRzCi0JICogbGVmdCA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4pIHRvIHRoaXMgcGFuZSdzIGxlZnQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCBjYW4gYmUgYWRqdXN0ZWQgdG8gaGF2ZQotCSAqIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25MZWZ0KFBhbmU8Pz4gY29udGFpbmVyKSB7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLmFkZChjb250YWluZXIubGVmdENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb250cm9sIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgdGhhdCBoYXZlIHRoZWlyIHdpZHRoCi0JICogYWRqdXN0IHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LiBUaGUgbGVmdCBhbGlnbm1lbnQgaXMgdXN1YWxseQotCSAqIHVzZWQgZm9yIGxhYmVscy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIGFkZAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZEFsaWduTGVmdChDb250cm9sIGNvbnRyb2wpIHsKLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoIGl0cwotCSAqIHJpZ2h0IDxjb2RlPkNvbnRyb2xBbGlnbmVyPC9jb2RlPikgdG8gdGhpcyBwYW5lJ3MgcmlnaHQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCBjYW4gYmUgYWRqdXN0ZWQgdG8gaGF2ZQotCSAqIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkQWxpZ25SaWdodChQYW5lPD8+IGNvbnRhaW5lcikgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRhaW5lci5yaWdodENvbnRyb2xBbGlnbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBjb250cm9sIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgdGhhdCBoYXZlIHRoZWlyIHdpZHRoCi0JICogYWRqdXN0IHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LiBUaGUgbGVmdCBhbGlnbm1lbnQgaXMgdXN1YWxseQotCSAqIHVzZWQgZm9yIGJ1dHRvbnMuCi0JICoKLQkgKiBAcGFyYW0gcGFuZSBUaGUgcGFuZSB0byBhZGQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBhZGRBbGlnblJpZ2h0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIGdpdmVuIHBhbmUncyBjb250cm9scyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgZm9yCi0JICogYWxpZ25tZW50KSBmcm9tIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gYWRkIGZvcgotCSAqIGFsaWdubWVudAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGFkZFBhbmVGb3JBbGlnbm1lbnQoUGFuZTw/PiBjb250YWluZXIpIHsKLQkJYWRkQWxpZ25MZWZ0KGNvbnRhaW5lcik7Ci0JCWFkZEFsaWduUmlnaHQoY29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGFueSBwcm9wZXJ0eSBuYW1lcyB0byB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBpbiBvcmRlciB0byBiZSBub3RpZmllZAotCSAqIHdoZW4gdGhlIGFjdHVhbCBwcm9wZXJ0eSBjaGFuZ2VzIGluIHRoZSBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZXMgVGhlIGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgbmFtZXMgdG8gcmVnaXN0ZXIgd2l0aCB0aGUKLQkgKiBzdWJqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKGJ1aWxkQXNwZWN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEFzcGVjdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCS8vc3ViamVjdCgpIGNvdWxkIGhhdmUgY2hhbmdlZCBvciBpcyBudWxsIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mCi0JCQkJLy8ianVtcGluZyIgb24gdGhlIFVJIHRocmVhZCBoZXJlIGFuZCBhIHNlbGVjdGlvbiBjaGFuZ2Ugb2NjdXJpbmcKLQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBnZXRTdWJqZWN0KCkpIHsKLQkJCQkJdXBkYXRlUGFuZShlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBidXR0b24gdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRCdXR0b24oY29udGFpbmVyLCB0ZXh0LCBudWxsLCBidXR0b25BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIDxjb2RlPkJ1dHRvbjwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zCi0JICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFVubWFuYWdlZEJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRVbm1hbmFnZWRCdXR0b24oY29udGFpbmVyLCB0ZXh0LCBudWxsLCBidXR0b25BY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkQnV0dG9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBidXR0b25BY3Rpb24pIHsKLQotCQlCdXR0b24gYnV0dG9uID0gYWRkVW5tYW5hZ2VkQnV0dG9uKGNvbnRhaW5lciwgdGV4dCwgaGVscElkLCBidXR0b25BY3Rpb24pOwotCQl0aGlzLm1hbmFnZVdpZGdldChidXR0b24pOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+QnV0dG9uPC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4KLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHBhcmFtIGJ1dHRvbkFjdGlvbiBUaGUgYWN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgYnV0dG9uIGlzIHByZXNzZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBhZGRVbm1hbmFnZWRCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCUJ1dHRvbiBidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKGNvbnRhaW5lciwgdGV4dCk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJ1dHRvbkFjdGlvbi5ydW4oKTsKLQkJCX0KLQkJfSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7Ci0JCX0KLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGxheW91dCB3aWxsIGxlYXZlIHNwYWNlIGZvciBkZWNvcmF0aW9ucyBvbiB3aWRnZXRzLgotCSAqIFdoZXRoZXIgZGVjb3JhdGVkIG9yIG5vdCwgYWxsIG9mIHRoZSB3aWRnZXRzIG5lZWQgdGhlIHNhbWUgaW5kZW50Ci0gCSAqIHNvIHRoYXQgdGhleSBhbGlnbiBwcm9wZXJseS4KLQkgKi8KLQlwcm90ZWN0ZWQgR3JpZERhdGEgZ2V0RmllbGRHcmlkRGF0YSgpIHsKLQkJaW50IG1hcmdpbiA9IEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LmdldERlZmF1bHQoKQotCQkJCS5nZXRNYXhpbXVtRGVjb3JhdGlvbldpZHRoKCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWRhdGEud2lkdGhIaW50ID0gSURpYWxvZ0NvbnN0YW50cy5FTlRSWV9GSUVMRF9XSURUSCArIG1hcmdpbjsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gbWFyZ2luOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlyZXR1cm4gZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYm9vbGVhbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3Rpb24gc3RhdGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgY2hlY2sgYm94Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRDaGVja0JveCgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVG9nZ2xlQnV0dG9uKAotCQkJcGFyZW50LAotCQkJYnV0dG9uVGV4dCwKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQloZWxwSWQsCi0JCQlTV1QuQ0hFQ0spOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBCdXR0b24gYWRkQ2hlY2tCb3goCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJU3RyaW5nIGJ1dHRvblRleHQsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCQkJU3RyaW5nIGhlbHBJZCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQotCQlCdXR0b24gYnV0dG9uID0gdGhpcy5hZGRVbm1hbmFnZWRUb2dnbGVCdXR0b24ocGFyZW50LCBidXR0b25UZXh0LCBib29sZWFuSG9sZGVyLCBoZWxwSWQsIFNXVC5DSEVDSyk7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIGJ1dHRvbik7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPiB0aGF0IGNhbiBiZSBjb2xsYXBzZWQuIEEgc3ViLXBhbmUgaXMKLQkgKiBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCXNlY3Rpb25UZXh0LAotCQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4gdGhhdCBjYW4gYmUgY29sbGFwc2VkLiBBIHN1Yi1wYW5lIGlzCi0JICogYXV0b21hdGljYWxseSBhZGRlZCBhcyBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIHNlY3Rpb24ncyBkZXNjcmlwdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyLCBzZWN0aW9uVGV4dCwgbnVsbCwgdHlwZSwgZXhwYW5kZWRTdGF0ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIHdhcyBwcm92aWRlZAotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IHRoaXMuYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJZGVzY3JpcHRpb24sCi0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUgfCB0eXBlCi0JCSk7Ci0KLQkJU2VjdGlvbiBzZWN0aW9uID0gKFNlY3Rpb24pIHN1YlBhbmUuZ2V0UGFyZW50KCk7Ci0KLQkJZXhwYW5kZWRTdGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXIoc2VjdGlvbikKLQkJKTsKLQotCQlzZWN0aW9uLnNldEV4cGFuZGVkKAotCQkJZXhwYW5kZWRTdGF0ZUhvbGRlci5nZXRWYWx1ZSgpICE9IG51bGwgPyBleHBhbmRlZFN0YXRlSG9sZGVyLmdldFZhbHVlKCkgOiB0cnVlCi0JCSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2VjdGlvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZXhwYW5kZWRTdGF0ZUhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4cGFuZGVkU3RhdGVIb2xkZXIpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlzZWN0aW9uVGV4dCwKLQkJCWRlc2NyaXB0aW9uLAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIgfCBFeHBhbmRhYmxlQ29tcG9zaXRlLlRXSVNUSUUsCi0JCQlleHBhbmRlZFN0YXRlSG9sZGVyCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBleHBhbmRlZFN0YXRlSG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlTV1QuTlVMTCwKLQkJCWV4cGFuZGVkU3RhdGVIb2xkZXIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkVW5tYW5hZ2VkQ29tYm8oY29udGFpbmVyKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoY29tYm8pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBub24tZWRpdGFibGUgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBDb21ibyBhZGRVbm1hbmFnZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbm9uLWVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oY29udGFpbmVyKTsKLQotCQlDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQljb21ibywKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG5vbi1lZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgPFY+IENvbWJvIGFkZFVubWFuYWdlZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRVbm1hbmFnZWRDb21ibyhjb250YWluZXIpOwotCi0JCUNvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkQ29tYm8oCi0JCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQkJTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCVN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZE1vZGVsKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSB0aGlzLmFkZFVubWFuYWdlZENvbWJvKGNvbnRhaW5lciwgbGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBzdHJpbmdDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBjb21ibyk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbWJvVmlld2VyPC9jb2RlPiB1c2luZyBhIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxQcm92aWRlciBUaGUgcHJvdmlkZXIgcmVzcG9uc2libGUgdG8gY29udmVydCB0aGUgY29tYm8ncyBpdGVtcwotCSAqIGludG8gaHVtYW4gcmVhZGFibGUgc3RyaW5ncwotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvVmlld2VyIGFkZENvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tYm9WaWV3ZXIgdmlld2VyID0gbmV3IENvbWJvVmlld2VyKGNvbWJvKTsKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWFpbiBjb250YWluZXIgb2YgdGhpcyBwYW5lLiBUaGUgbGF5b3V0IGFuZCBsYXlvdXQgZGF0YSBhcmUKLQkgKiBhdXRvbWF0aWNhbGx5IHNldC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdGhhdCB3aWxsIGhvbGRzIGFsbCB0aGUKLQkgKiB3aWRnZXRzIGNyZWF0ZWQgYnkgdGhpcyBwYW5lIHRocm91Z2gge0BsaW5rICNpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSl9Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIDxWPiBDb21ibyBhZGRFZGl0YWJsZUNvbWJvKAotCQkJQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCUxpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRVbm1hbmFnZWRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lciwgbGlzdEhvbGRlciwgc2VsZWN0ZWRJdGVtSG9sZGVyLCBzdHJpbmdDb252ZXJ0ZXIpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBjb21ibyk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkRWRpdGFibGVDb21ibygKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoY29tYm8pOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlZGl0YWJsZSA8Y29kZT5Db21ibzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCi0JCUNvbWJvTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCWNvbWJvLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZWRpdGFibGUgPGNvZGU+Q29tYm9WaWV3ZXI8L2NvZGU+IHVzaW5nIGEgPGNvZGU+Q29tYm88L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFByb3ZpZGVyIFRoZSBwcm92aWRlciByZXNwb25zaWJsZSB0byBjb252ZXJ0IHRoZSBjb21ibydzIGl0ZW1zCi0JICogaW50byBodW1hbiByZWFkYWJsZSBzdHJpbmdzCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ib1ZpZXdlcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm9WaWV3ZXIgYWRkRWRpdGFibGVDb21ib1ZpZXdlcihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkRWRpdGFibGVDb21ibyhjb250YWluZXIpOwotCQlDb21ib1ZpZXdlciB2aWV3ZXIgPSBuZXcgQ29tYm9WaWV3ZXIoY29tYm8pOwotCQl2aWV3ZXIuc2V0TGFiZWxQcm92aWRlcihsYWJlbFByb3ZpZGVyKTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXIoZmluYWwgU2VjdGlvbiBzZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgU1dUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXJfKHNlY3Rpb24pKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRFeHBhbmRlZFN0YXRlQ2hhbmdlTGlzdGVuZXJfKGZpbmFsIFNlY3Rpb24gc2VjdGlvbikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoZmluYWwgUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKSBlLmdldE5ld1ZhbHVlKCk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBCb29sZWFuLlRSVUU7Ci0JCQkJfQotCQkJCXNlY3Rpb24uc2V0RXhwYW5kZWQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SHlwZXJsaW5rPC9jb2RlPiB0aGF0IHdpbGwgaW52b2tlZCB0aGUgZ2l2ZW4KLQkgKiA8Y29kZT5SdW5uYWJsZTwvY29kZT4gd2hlbiBzZWxlY3RlZC4gVGhlIGdpdmVuIGFjdGlvbiBpcyBhbHdheXMgaW52b2tlZAotCSAqIGZyb20gdGhlIFVJIHRocmVhZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgaHlwZXJsaW5rJ3MgdGV4dAotCSAqIEBwYXJhbSBoeXBlckxpbmtBY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGxpbmsgd2FzIHNlbGVjdGVkCi0JICogcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkh5cGVybGluazwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSHlwZXJsaW5rIGFkZEh5cGVybGluayhDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW5uYWJsZSBoeXBlckxpbmtBY3Rpb24pIHsKLQotCQlIeXBlcmxpbmsgbGluayA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVIeXBlcmxpbmsocGFyZW50LCB0ZXh0KTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQobGluayk7Ci0KLQkJbGluay5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0KLQkJCQlIeXBlcmxpbmsgaHlwZXJMaW5rID0gKEh5cGVybGluaykgZS53aWRnZXQ7Ci0KLQkJCQlpZiAoaHlwZXJMaW5rLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWh5cGVyTGlua0FjdGlvbi5ydW4oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGFiZWwgdXNpbmcgdGhlIGdpdmVuIGluZm9ybWF0aW9uLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMYWJlbCBhZGRMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQpIHsKLQotCQlMYWJlbCBsYWJlbCA9IGFkZFVubWFuYWdlZExhYmVsKGNvbnRhaW5lciwgbGFiZWxUZXh0KTsKLQkJbWFuYWdlV2lkZ2V0KGxhYmVsKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBMYWJlbCBhZGRMYWJlbCgKLQkJCUNvbXBvc2l0ZSBjb250YWluZXIsCi0JCQlTdHJpbmcgbGFiZWxUZXh0LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGVuYWJsZWRNb2RlbAotCSkgewotCQlMYWJlbCBsYWJlbCA9IHRoaXMuYWRkVW5tYW5hZ2VkTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCQl0aGlzLmNvbnRyb2xFbmFibGVkU3RhdGUoZW5hYmxlZE1vZGVsLCBsYWJlbCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5MYWJlbDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zCi0JICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIGxhYmVsJ3MgdGV4dAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgTGFiZWwgYWRkVW5tYW5hZ2VkTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSBub24tZWRpdGFibGUgY29tYm8gbGFiZWxlZCB3aXRoCi0JICogdGhlIGdpdmVuIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCBvZiB0aGUgbGFiZWwKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIGNvbnRyb2wgc2hvd24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkTGFiZWxlZENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0NvbnZlcnRlcjxWPiBzdHJpbmdDb252ZXJ0ZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlDb21ibyBjb21ibyA9IHRoaXMuYWRkQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJc3RyaW5nQ29udmVydGVyCi0JCSk7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgbm9uLWVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aAotCSAqIHRoZSBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQlzdHJpbmdDb252ZXJ0ZXIsCi0JCQludWxsLAotCQkJaGVscElkCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGVmdENvbnRyb2wgVGhlIHdpZGdldCBzaG93biB0byB0aGUgbGVmdCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCQkJCQkJCQkJCQlDb250cm9sIGxlZnRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJLy8gQ29udGFpbmVyIGZvciB0aGUgbGFiZWwgYW5kIG1haW4gY29tcG9zaXRlCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDMsIDAsIDAsIDAsIDApOwotCi0JCS8vIExlZnQgY29udHJvbAotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWxlZnRDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIFJlLXBhcmVudCB0aGUgbGVmdCBjb250cm9sIHRvIHRoZSBuZXcgc3ViIHBhbmUKLQkJbGVmdENvbnRyb2wuc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCXRoaXMuYWRkQWxpZ25MZWZ0KGxlZnRDb250cm9sKTsKLQotCi0JCS8vIFJlLXBhcmVudCB0aGUgY2VudGVyIGNvbnRyb2wgdG8gdGhlIG5ldyBzdWIgcGFuZQotCQljZW50ZXJDb250cm9sLnNldFBhcmVudChjb250YWluZXIpOwotCi0JCS8vIFJlZ2lzdGVyIHRoZSBoZWxwIGlkIGZvciB0aGUgY2VudGVyIGNvbnRyb2wKLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjZW50ZXJDb250cm9sLCBoZWxwSWQpOwotCQl9Ci0KLQkJLy8gUmlnaHQgY29udHJvbAotCQlpZiAocmlnaHRDb250cm9sID09IG51bGwpIHsKLQkJCUNvbXBvc2l0ZSBzcGFjZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyKTsKLQkJCXNwYWNlci5zZXRMYXlvdXQodGhpcy5idWlsZFNwYWNlckxheW91dCgpKTsKLQkJCXJpZ2h0Q29udHJvbCA9IHNwYWNlcjsKLQkJfQotCQllbHNlIHsKLQkJCXJpZ2h0Q29udHJvbC5zZXRQYXJlbnQoY29udGFpbmVyKTsKLQotCQkJLy8gUmVnaXN0ZXIgdGhlIGhlbHAgaWQgZm9yIHRoZSByaWdodCBjb250cm9sCi0JCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChyaWdodENvbnRyb2wsIGhlbHBJZCk7Ci0JCQl9Ci0JCX0KLQotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ICAgICAgID0gR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0KLQkJcmlnaHRDb250cm9sLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLmFkZEFsaWduUmlnaHQocmlnaHRDb250cm9sKTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCB1c2VkIHRvIGRlc2NyaWJlIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbnRyb2wKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJCQkJCQkJCQkJCQlDb250cm9sIGxhYmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJY2VudGVyQ29udHJvbCwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJQYW5lIFRoZSBtYWluIHdpZGdldAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFuZTw/PiBjZW50ZXJQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY2VudGVyUGFuZS5nZXRDb250cm9sKCksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbXBvc2l0ZSBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwgdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IHRvIGxhYmVsIHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBjZW50ZXJDb250cm9sIFRoZSBtYWluIHdpZGdldAotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgbGFiZWwgYW5kIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkTGFiZWxlZENvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCBjZW50ZXJDb250cm9sKSB7Ci0KLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJY2VudGVyQ29udHJvbCwKLQkJCW51bGwsCi0JCQludWxsCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgdGhlIGdpdmVuIGNlbnRlciBjb21wb3NpdGUgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsIHRleHQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgdGV4dCB0byBsYWJlbCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gY2VudGVyQ29udHJvbCBUaGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgb2YgdGhlIGxhYmVsIGFuZCB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZExhYmVsZWRDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgY2VudGVyQ29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYWRkTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpLAotCQkJY2VudGVyQ29udHJvbCwKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29tcG9zaXRlIGxhYmVsZWQKLQkgKiB3aXRoIHRoZSBnaXZlbiBsYWJlbCB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgdG8gbGFiZWwgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgY29udGFpbmVyIG9mIHRoZSBsYWJlbCBhbmQgdGhlIGdpdmVuIGNlbnRlciBjb250cm9sCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRMYWJlbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIGNlbnRlckNvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUxhYmVsIGxhYmVsID0gdGhpcy5hZGRMYWJlbChjb250YWluZXIsIGxhYmVsVGV4dCk7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsLAotCQkJY2VudGVyQ29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIHJpZ2h0Q29udHJvbCBUaGUgY29udHJvbCBzaG93biB0byB0aGUgcmlnaHQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5DQ29tYm88L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kaWZ5TGlzdGVuZXIgY29tYm9MaXN0ZW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCWNvbWJvLmFkZE1vZGlmeUxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBjb21ib0xpc3RlbmVyIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VsZWN0aW9uCi0JICogY2hhbmdlcwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNlbnRlcgotCSAqIGNvbXBvc2l0ZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21ibyBhZGRMYWJlbGVkRWRpdGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQljb21ib0xpc3RlbmVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIHRoZSBnaXZlbiBjZW50ZXIgY29udHJvbCBsYWJlbGVkCi0JICogd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxlZnRDb250cm9sIFRoZSB3aWRnZXQgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGNlbnRlckNvbnRyb2wgVGhlIG1haW4gd2lkZ2V0Ci0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvVmlld2VyIGNvbWJvVmlld2VyID0gdGhpcy5hZGRFZGl0YWJsZUNvbWJvVmlld2VyKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxQcm92aWRlcgotCQkpOwotCi0JCUNvbWJvIGNvbWJvID0gY29tYm9WaWV3ZXIuZ2V0Q29tYm8oKTsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0KLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJKGNvbWJvLmdldFBhcmVudCgpICE9IGNvbnRhaW5lcikgPyBjb21iby5nZXRQYXJlbnQoKSA6IGNvbWJvLAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIGNvbWJvOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGNvbWJvTGlzdGVuZXIgVGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWxlY3Rpb24KLQkgKiBjaGFuZ2VzCi0JICogQHBhcmFtIGxhYmVsUHJvdmlkZXIgVGhlIHByb3ZpZGVyIHJlc3BvbnNpYmxlIHRvIGNvbnZlcnQgdGhlIGNvbWJvJ3MgaXRlbXMKLQkgKiBpbnRvIGh1bWFuIHJlYWRhYmxlIHN0cmluZ3MKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm9WaWV3ZXIoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RpZnlMaXN0ZW5lciBjb21ib0xpc3RlbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRMYWJlbGVkRWRpdGFibGVDb21ib1ZpZXdlcigKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCWNvbWJvTGlzdGVuZXIsCi0JCQlsYWJlbFByb3ZpZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGFuIGVkaXRhYmxlIGNvbWJvIGxhYmVsZWQgd2l0aCB0aGUKLQkgKiBnaXZlbiB0ZXh0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDxWPiBsaXN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFY+aW5zdGFuY2UoKSwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSB0aGUgZ2l2ZW4gY2VudGVyIGNvbnRyb2wgbGFiZWxlZAotCSAqIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgb2YgdGhlIGxhYmVsCi0JICogQHBhcmFtIGxpc3RIb2xkZXIgVGhlIDxjb2RlPkxpc3RWYWx1ZUhvbGRlcjwvY29kZT4KLQkgKiBAcGFyYW0gc2VsZWN0ZWRJdGVtSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGVkIGl0ZW0KLQkgKiBAcGFyYW0gc3RyaW5nQ29udmVydGVyIFRoZSBjb252ZXJ0ZXIgcmVzcG9uc2libGUgdG8gdHJhbnNmb3JtIGVhY2ggaXRlbQotCSAqIGludG8gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24KLQkgKiBAcGFyYW0gcmlnaHRDb250cm9sIFRoZSBjb250cm9sIHNob3duIHRvIHRoZSByaWdodCBvZiB0aGUgbWFpbiB3aWRnZXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjZW50ZXIKLQkgKiBjb21wb3NpdGUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCA8Vj4gQ29tYm8gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFZhbHVlTW9kZWw8Vj4gbGlzdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29udHJvbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy5hZGRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlcgotCQkpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCShjb21iby5nZXRQYXJlbnQoKSAhPSBjb250YWluZXIpID8gY29tYm8uZ2V0UGFyZW50KCkgOiBjb21ibywKLQkJCXJpZ2h0Q29udHJvbCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhbiBlZGl0YWJsZSBjb21ibyBsYWJlbGVkIHdpdGggdGhlCi0JICogZ2l2ZW4gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IG9mIHRoZSBsYWJlbAotCSAqIEBwYXJhbSBsaXN0SG9sZGVyIFRoZSA8Y29kZT5MaXN0VmFsdWVIb2xkZXI8L2NvZGU+Ci0JICogQHBhcmFtIHNlbGVjdGVkSXRlbUhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIHN0cmluZ0NvbnZlcnRlciBUaGUgY29udmVydGVyIHJlc3BvbnNpYmxlIHRvIHRyYW5zZm9ybSBlYWNoIGl0ZW0KLQkgKiBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gY2VudGVyCi0JICogY29tcG9zaXRlCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPFY+IENvbWJvIGFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nQ29udmVydGVyPFY+IHN0cmluZ0NvbnZlcnRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJbGFiZWxUZXh0LAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXN0cmluZ0NvbnZlcnRlciwKLQkJCW51bGwsCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB0aGF0IHdpbGwgaGF2ZSBhIHRleHQgZmllbGQgYXMgdGhlIGNlbnRlciBjb250cm9sCi0JICogbGFiZWxlZCB3aXRoIHRoZSBnaXZlbiBsYWJlbC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGFyZWEncyBsYWJlbAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBsaW5lQ291bnQgVGhlIG51bWJlciBvZiBsaW5lcyB0aGUgdGV4dCBhcmVhIHNob3VsZCBkaXNwbGF5Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkTXVsdGlMaW5lVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGxhYmVsVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lQ291bnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgbGluZUNvdW50KTsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJaGVscElkCi0JCSk7Ci0KLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQotCQkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgdGV4dC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhlaWdodEhpbnQgPSB0ZXh0LmdldExpbmVIZWlnaHQoKSAqIGxpbmVDb3VudDsKLQotCQkvLyBNb3ZlIHRoZSBsYWJlbCB0byB0aGUgdG9wIG9mIGl0cyBjZWxsCi0JCUNvbnRyb2wgbGFiZWwgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJaW50IGxhYmVsSGVpZ2h0ID0gbGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCi0JCWdyaWREYXRhID0gKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgICArPSAoTWF0aC5hYnModGV4dEhlaWdodCAtIGxhYmVsSGVpZ2h0KSAvIDIpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAotCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkgKiBmaWVsZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFBhc3N3b3JkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgcmlnaHRDb250cm9sLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRQYXNzd29yZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0LAotCQkJcmlnaHRDb250cm9sLAotCQkJaGVscElkCi0JCSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgdGV4dCBmaWVsZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRMYWJlbGVkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3Bpbm5lci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSBsYWJlbCdzIHRleHQKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1pbmltdW1WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gbWF4aW11bVZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSByaWdodENvbnRyb2wgVGhlIHdpZGdldCB0byBiZSBwbGFjZWQgdG8gdGhlIHJpZ2h0IG9mIHNwaW5uZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBzcGlubmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5TcGlubmVyPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTcGlubmVyIGFkZExhYmVsZWRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtVmFsdWUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbnRyb2wsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy5hZGRTcGlubmVyKAotCQkJcGFyZW50LAotCQkJbnVtYmVySG9sZGVyLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJbWluaW11bVZhbHVlLAotCQkJbWF4aW11bVZhbHVlLAotCQkJaGVscElkCi0JCSk7Ci0JCUxhYmVsIGxhYmVsID0gYWRkTGFiZWwocGFyZW50LCBsYWJlbFRleHQpOwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJcGFyZW50LAotCQkJbGFiZWwsCi0JCQkoc3Bpbm5lci5nZXRQYXJlbnQoKSAhPSBwYXJlbnQpID8gc3Bpbm5lci5nZXRQYXJlbnQoKSA6IHNwaW5uZXIsCi0JCQlyaWdodENvbnRyb2wsCi0JCQloZWxwSWQKLQkJKTsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgc3Bpbm5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0KLQkJcmV0dXJuIHNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBtYW5hZ2VkIHNwaW5uZXIuIE1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIGhhbmRsZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQgaWYgYSBQYW5lRW5hYmxlciBpcyB1c2VkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBudW1iZXJIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgaW50ZWdlciB2YWx1ZQotCSAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgVGhlIHZhbHVlIHNob3duIHdoZW4gdGhlIGhvbGRlciBoYXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gbWluaW11bVZhbHVlIFRoZSBtaW5pbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBtYXhpbXVtVmFsdWUgVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc3Bpbm5lciB3aWxsIGFsbG93Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+U3Bpbm5lcjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3Bpbm5lciBhZGRTcGlubmVyKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRWYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1WYWx1ZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IGFkZFVubWFuYWdlZFNwaW5uZXIocGFyZW50LCBudW1iZXJIb2xkZXIsIGRlZmF1bHRWYWx1ZSwgbWluaW11bVZhbHVlLCBtYXhpbXVtVmFsdWUsIGhlbHBJZCk7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KHNwaW5uZXIpOwotCQlyZXR1cm4gc3Bpbm5lcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCBzcGlubmVyLiAgVW5tYW5hZ2VkIG1lYW5zIHRoYXQgdGhpcyBQYW5lIHdpbGwKLQkgKiBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuICBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZQotCSAqIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbnVtYmVySG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSBzaG93biB3aGVuIHRoZSBob2xkZXIgaGFzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIG1pbmltdW1WYWx1ZSBUaGUgbWluaW11bSB2YWx1ZSB0aGF0IHRoZSBzcGlubmVyIHdpbGwgYWxsb3cKLQkgKiBAcGFyYW0gbWF4aW11bVZhbHVlIFRoZSBtYXhpbXVtIHZhbHVlIHRoYXQgdGhlIHNwaW5uZXIgd2lsbCBhbGxvdwotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlNwaW5uZXI8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBTcGlubmVyIGFkZFVubWFuYWdlZFNwaW5uZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdFZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluaW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4aW11bVZhbHVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVNwaW5uZXIocGFyZW50KTsKLQkJc3Bpbm5lci5zZXRNaW5pbXVtKG1pbmltdW1WYWx1ZSk7Ci0JCXNwaW5uZXIuc2V0TWF4aW11bShtYXhpbXVtVmFsdWUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IGdldEZpZWxkR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IGZhbHNlOwotCQlzcGlubmVyLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQobnVtYmVySG9sZGVyLCBzcGlubmVyLCBkZWZhdWx0VmFsdWUpOwotCi0JCWlmIChoZWxwSWQgIT0gbnVsbCkgewotCQkJZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3Bpbm5lciwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBzcGlubmVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuYWdlZCBEYXRlVGltZSBvZiB0eXBlIFNXVC5USU1FLiAgTWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogaGFuZGxlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldCBpZiBhIFBhbmVFbmFibGVyIGlzIHVzZWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhvdXJzSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGhvdXJzIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gbWludXRlc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBtaW51dGVzIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gc2Vjb25kc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzZWNvbmRzIGludGVnZXIgdmFsdWUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgZGF0ZVRpbWUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkRhdGVUaW1lPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEYXRlVGltZSBhZGREYXRlVGltZShDb21wb3NpdGUgcGFyZW50LAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbWludXRlc0hvbGRlciwKLQkJCQkJCQkJCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gc2Vjb25kc0hvbGRlciwKLQkJCQkJCQkJCQkJU3RyaW5nIGhlbHBJZCkgewotCi0JCURhdGVUaW1lIGRhdGVUaW1lID0gdGhpcy5hZGRVbm1hbmFnZWREYXRlVGltZShwYXJlbnQsIGhvdXJzSG9sZGVyLCBtaW51dGVzSG9sZGVyLCBzZWNvbmRzSG9sZGVyLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldChkYXRlVGltZSk7Ci0KLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBEYXRlVGltZSBhZGREYXRlVGltZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBob3Vyc0hvbGRlciwKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG1pbnV0ZXNIb2xkZXIsCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAotCQkJU3RyaW5nIGhlbHBJZCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwKLQkpIHsKLQkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSB0aGlzLmFkZFVubWFuYWdlZERhdGVUaW1lKHBhcmVudCwgaG91cnNIb2xkZXIsIG1pbnV0ZXNIb2xkZXIsIHNlY29uZHNIb2xkZXIsIGhlbHBJZCk7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZShlbmFibGVkTW9kZWwsIGRhdGVUaW1lKTsKLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIERhdGVUaW1lIG9mIHR5cGUgU1dULlRJTUUuICBVbm1hbmFnZWQgbWVhbnMgdGhhdCB0aGlzIFBhbmUgd2lsbAotCSAqIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4gIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlCi0JICogaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBob3Vyc0hvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBob3VycyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIG1pbnV0ZXNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWludXRlcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIHNlY29uZHNIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2Vjb25kcyBpbnRlZ2VyIHZhbHVlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGRhdGVUaW1lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5EYXRlVGltZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIERhdGVUaW1lIGFkZFVubWFuYWdlZERhdGVUaW1lKENvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJCQkJCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGhvdXJzSG9sZGVyLAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBtaW51dGVzSG9sZGVyLAotCQkJCQkJCQkJCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBzZWNvbmRzSG9sZGVyLAotCQkJCQkJCQkJCQlTdHJpbmcgaGVscElkKSB7Ci0KLQkJRGF0ZVRpbWUgZGF0ZVRpbWUgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlRGF0ZVRpbWUocGFyZW50LCBTV1QuVElNRSk7Ci0KLQkJRGF0ZVRpbWVNb2RlbEFkYXB0ZXIuYWRhcHQoaG91cnNIb2xkZXIsIG1pbnV0ZXNIb2xkZXIsIHNlY29uZHNIb2xkZXIsIGRhdGVUaW1lKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRhdGVUaW1lLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGRhdGVUaW1lOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGlzdEhvbGRlciBUaGUgPGNvZGU+TGlzdFZhbHVlSG9sZGVyPC9jb2RlPgotCSAqIEBwYXJhbSBzZWxlY3RlZEl0ZW1Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBzdHJpbmdDb252ZXJ0ZXIgVGhlIGNvbnZlcnRlciByZXNwb25zaWJsZSB0byB0cmFuc2Zvcm0gZWFjaCBpdGVtCi0JICogaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q0NvbWJvPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgPFY+IENvbWJvIGFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPFY+IGxpc3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb252ZXJ0ZXI8Vj4gc3RyaW5nQ29udmVydGVyKSB7Ci0KLQkJQ29tYm8gY29tYm8gPSBhZGRVbm1hbmFnZWRFZGl0YWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0KLQkJQ29tYm9Nb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJY29tYm8sCi0JCQlzdHJpbmdDb252ZXJ0ZXIKLQkJKTsKLQotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVkaXRhYmxlIDxjb2RlPkNvbWJvPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNDb21ibzwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbWJvIGFkZFVubWFuYWdlZEVkaXRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUNvbWJvIGNvbWJvID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUVkaXRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250YWluZXIgdGhhdCB3aWxsIGhhdmUgYSB0ZXh0IGZpZWxkIGFzIHRoZSBjZW50ZXIgY29udHJvbAotCSAqIGxhYmVsZWQgd2l0aCB0aGUgZ2l2ZW4gbGFiZWwuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZExhYmVsZWRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZFRleHQoY29udGFpbmVyLCBsYWJlbFRleHQsIHRleHRIb2xkZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAotCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkgKiBmaWVsZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIHJpZ2h0Q29tcG9uZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIpOwotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCWxhYmVsVGV4dCwKLQkJCXRleHQsCi0JCQlyaWdodENvbXBvbmVudCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQkvKioKLQkgKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBsYWJlbFRleHQgVGhlIHRleHQgZmllbGQncyBsYWJlbAotCSAqIEBwYXJhbSByaWdodENvbXBvbmVudCBUaGUgY29tcG9uZW50IHRvIGJlIHBsYWNlZCB0byB0aGUgcmlnaHQgb2YgdGhlIHRleHQKLQkgKiBmaWVsZAotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsIGxhYmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbCByaWdodENvbXBvbmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyKTsKLQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbCwKLQkJCXRleHQsCi0JCQlyaWdodENvbXBvbmVudCwKLQkJCWhlbHBJZAotCQkpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBsYWJlbFRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlsYWJlbFRleHQsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHRoYXQgd2lsbCBoYXZlIGEgdGV4dCBmaWVsZCBhcyB0aGUgY2VudGVyIGNvbnRyb2wKLQkgKiBsYWJlbGVkIHdpdGggdGhlIGdpdmVuIGxhYmVsLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIHRleHQgZmllbGQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkTGFiZWxlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsIGxhYmVsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJbGFiZWwsCi0JCQl0ZXh0SG9sZGVyLAotCQkJbnVsbCwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlzdCBhbmQgbm90aWZ5IHRoZSBnaXZlbiBzZWxlY3Rpb24gaG9sZGVyIHdoZW4gdGhlCi0JICogc2VsZWN0aW9uIGNoYW5nZXMuIElmIHRoZSBzZWxlY3Rpb24gY291bnQgaXMgZGlmZmVyZW50IHRoYW4gb25lIHRoYW4gdGhlCi0JICogaG9sZGVyIHdpbGwgcmVjZWl2ZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgcmFkaW8gYnV0dG9uCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5MaXN0PC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0IGFkZExpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiB0aGlzLmFkZExpc3QoCi0JCQljb250YWluZXIsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbGlzdCBhbmQgbm90aWZ5IHRoZSBnaXZlbiBzZWxlY3Rpb24gaG9sZGVyIHdoZW4gdGhlCi0JICogc2VsZWN0aW9uIGNoYW5nZXMuIElmIHRoZSBzZWxlY3Rpb24gY291bnQgaXMgZGlmZmVyZW50IHRoYW4gb25lIHRoYW4gdGhlCi0JICogaG9sZGVyIHdpbGwgcmVjZWl2ZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc2VsZWN0aW9uSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHVuaXF1ZSBzZWxlY3RlZCBpdGVtCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHJhZGlvIGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+TGlzdDwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdCBhZGRMaXN0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJTGlzdCBsaXN0ID0gdGhpcy5hZGRVbm1hbmFnZWRMaXN0KGNvbnRhaW5lciwgc2VsZWN0aW9uSG9sZGVyLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldChsaXN0KTsKLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCBsaXN0IGFuZCBub3RpZnkgdGhlIGdpdmVuIHNlbGVjdGlvbiBob2xkZXIgd2hlbiB0aGUKLQkgKiBzZWxlY3Rpb24gY2hhbmdlcy4gSWYgdGhlIHNlbGVjdGlvbiBjb3VudCBpcyBkaWZmZXJlbnQgdGhhbiBvbmUgdGhhbiB0aGUKLQkgKiBob2xkZXIgd2lsbCByZWNlaXZlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4KLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHNlbGVjdGlvbkhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB1bmlxdWUgc2VsZWN0ZWQgaXRlbQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkxpc3Q8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGFkZFVubWFuYWdlZExpc3QoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzZWxlY3Rpb25Ib2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlMaXN0IGxpc3QgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTGlzdCgKLQkJCWNvbnRhaW5lciwKLQkJCVNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuTVVMVEkKLQkJKTsKLQotCQlsaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uSG9sZGVyKSk7Ci0JCWxpc3Quc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChsaXN0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBsYWJsZSBleHBhbmRpbmcgb24gbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGxhYmVsVGV4dCBUaGUgbGFiZWwncyB0ZXh0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEZvcm1UZXh0IGFkZE11bHRpTGluZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbGFiZWxUZXh0KSB7Ci0KLQkJRm9ybVRleHQgbGFiZWwgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlTXVsdGlMaW5lTGFiZWwoY29udGFpbmVyLCBsYWJlbFRleHQpOwotCQltYW5hZ2VXaWRnZXQobGFiZWwpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVNdWx0aUxpbmVUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQl0aGlzLm1hbmFnZVdpZGdldCh0ZXh0KTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldCB0aGF0IGhhcyBtdWx0aXBsZSBsaW5lcy4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gbGluZUNvdW50IFRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRNdWx0aUxpbmVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRleHQgdGV4dCA9IHRoaXMuYWRkTXVsdGlMaW5lVGV4dChjb250YWluZXIpOwotCQlhZGp1c3RNdWx0aUxpbmVUZXh0TGF5b3V0KGNvbnRhaW5lciwgbGluZUNvdW50LCB0ZXh0LCB0ZXh0LmdldExpbmVIZWlnaHQoKSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGxpbmVDb3VudCBUaGUgbnVtYmVyIG9mIGxpbmVzIHRoZSB0ZXh0IGFyZWEgc2hvdWxkIGRpc3BsYXkKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50KSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkTXVsdGlMaW5lVGV4dChjb250YWluZXIsIHRleHRIb2xkZXIsIGxpbmVDb3VudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQgdGhhdCBoYXMgbXVsdGlwbGUgbGluZXMuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRleHQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldAotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZE11bHRpTGluZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZUNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRNdWx0aUxpbmVUZXh0KGNvbnRhaW5lciwgbGluZUNvdW50LCBoZWxwSWQpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3RzIHRoZSBsYXlvdXQgb2YgdGhlIGdpdmVuIGNvbnRhaW5lciBzbyB0aGF0IHRoZSB0ZXh0IGNvbnRyb2wgaGFzIHRoZSBjb3JyZWN0IGFtb3VudCBvZgotCSAqIGxpbmVzIGJ5IGRlZmF1bHQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRqdXN0TXVsdGlMaW5lVGV4dExheW91dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVDb3VudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0KSB7Ci0KLQkJaW50IHRleHRIZWlnaHQgPSB0ZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueTsKLQotCQkvLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgbGluZXMgdGhlIHRleHQgYXJlYSBzaG91bGQgZGlzcGxheQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IChHcmlkRGF0YSkgdGV4dC5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChncmlkRGF0YSA9PSBudWxsKSB7Ci0JCQlncmlkRGF0YSA9IHRoaXMuZ2V0RmllbGRHcmlkRGF0YSgpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJfQotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gbGluZUhlaWdodCAqIGxpbmVDb3VudDsKLQotCQkvLyBNb3ZlIHRoZSBsYWJlbCB0byB0aGUgdG9wIG9mIGl0cyBjZWxsCi0JCUNvbnRyb2wgbGFiZWwgPSBjb250YWluZXIuZ2V0Q2hpbGRyZW4oKVswXTsKLQkJaW50IGxhYmVsSGVpZ2h0ID0gbGFiZWwuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKS55OwotCi0JCWdyaWREYXRhID0gKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgICArPSAoTWF0aC5hYnModGV4dEhlaWdodCAtIGxhYmVsSGVpZ2h0KSAvIDIpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBhZ2VCb29rPC9jb2RlPiBhbmQgc2V0IHRoZSBwcm9wZXIgbGF5b3V0IGFuZCBsYXlvdXQKLQkgKiBkYXRhLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+UGFnZUJvb2s8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFBhZ2VCb29rIGFkZFBhZ2VCb29rKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBwYWdlQm9vazsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRob3V0IHNwZWNpZnlpbmcgYW55IGxheW91dCBtYW5hZ2VyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IG9mIHRoZSBuZXcgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB1c2luZyB0aGUgZ2l2ZW4gbGF5b3V0IG1hbmFnZXIuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgb2YgdGhlIG5ldyBjb250YWluZXIKLQkgKiBAcGFyYW0gbGF5b3V0IFRoZSBsYXlvdXQgbWFuYWdlciBvZiB0aGUgbmV3IGNvbnRhaW5lcgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgY29udGFpbmVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIExheW91dCBsYXlvdXQpIHsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyKTsKLQkJY29udGFpbmVyLnNldExheW91dChsYXlvdXQpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRQYXNzd29yZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFBhc3N3b3JkVGV4dChjb250YWluZXIpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRleHQgZmllbGQncyBpbnB1dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkUGFzc3dvcmRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUGFzc3dvcmRUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCi0JCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHB1c2ggYnV0dG9uIHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBidXR0b25BY3Rpb24gVGhlIGFjdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIGJ1dHRvbiBpcyBwcmVzc2VkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5CdXR0b248L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJ1dHRvbiBhZGRQdXNoQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgYnV0dG9uQWN0aW9uKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQsIG51bGwsIGJ1dHRvbkFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBwdXNoIGJ1dHRvbiB1c2luZyB0aGUgZ2l2ZW4gaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGJ1dHRvblRleHQgVGhlIGJ1dHRvbidzIHRleHQKLQkgKiBAcGFyYW0gYnV0dG9uQWN0aW9uIFRoZSBhY3Rpb24gdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBidXR0b24gaXMgcHJlc3NlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bm5hYmxlIGJ1dHRvbkFjdGlvbikgewotCi0JCUJ1dHRvbiBidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQltYW5hZ2VXaWRnZXQoYnV0dG9uKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYnV0dG9uQWN0aW9uLnJ1bigpOwotCQkJfQotCQl9KTsKLQotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscChidXR0b24sIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY2hlY2sgYm94IHVzaW5nIHRoZSBnaXZlbiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyByYWRpbyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQnV0dG9uIGFkZFJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBidXR0b25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVG9nZ2xlQnV0dG9uKAotCQkJcGFyZW50LAotCQkJYnV0dG9uVGV4dCwKLQkJCWJvb2xlYW5Ib2xkZXIsCi0JCQloZWxwSWQsCi0JCQlTV1QuUkFESU8KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5TZWN0aW9uPC9jb2RlPidzIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0KSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5USVRMRV9CQVIKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY3Rpb248L2NvZGU+LiBBIHN1Yi1wYW5lIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMKLQkgKiBpdHMgY2xpZW50IGFuZCBpcyB0aGUgcmV0dXJuZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIGNvbnRhaW5lciBvZiB0aGUgbmV3IHdpZGdldAotCSAqIEBwYXJhbSBzZWN0aW9uVGV4dCBUaGUgdGV4dCBvZiB0aGUgbmV3IHNlY3Rpb24KLQkgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiBzZWN0aW9uIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBleHBhbmRlZFN0YXRlSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdGhhdCB3aWxsIGRpY3RhdGUKLQkgKiB3aGVuIHRvIGV4cGFuZCBvciBjb2xsYXBzZSB0aGUgc2VjdGlvbgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPlNlY3Rpb248L2NvZGU+J3Mgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIENvbXBvc2l0ZSBhZGRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRTZWN0aW9uKGNvbnRhaW5lciwgc2VjdGlvblRleHQsIG51bGwsIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2VjdGlvbjwvY29kZT4uIEEgc3ViLXBhbmUgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcwotCSAqIGl0cyBjbGllbnQgYW5kIGlzIHRoZSByZXR1cm5lZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgY29udGFpbmVyIG9mIHRoZSBuZXcgd2lkZ2V0Ci0JICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSB0ZXh0IG9mIHRoZSBuZXcgc2VjdGlvbgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgc2VjdGlvbidzIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJc2VjdGlvblRleHQsCi0JCQlkZXNjcmlwdGlvbiwKLQkJCUV4cGFuZGFibGVDb21wb3NpdGUuVElUTEVfQkFSCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCBhbmQgaXMgdGhlIHJldHVybmVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBzZWN0aW9uJ3MgZGVzY3JpcHRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqIHdhcyBwcm92aWRlcgotCSAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIG9mIHNlY3Rpb24gdG8gY3JlYXRlCi0JICogQHBhcmFtIGV4cGFuZGVkU3RhdGVIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB0aGF0IHdpbGwgZGljdGF0ZQotCSAqIHdoZW4gdG8gZXhwYW5kIG9yIGNvbGxhcHNlIHRoZSBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGFkZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlY3Rpb25UZXh0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGVzY3JpcHRpb24sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlKSB7Ci0KLQkJU2VjdGlvbiBzZWN0aW9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVNlY3Rpb24oY29udGFpbmVyLCB0eXBlIHwgKChkZXNjcmlwdGlvbiAhPSBudWxsKSA/IFNlY3Rpb24uREVTQ1JJUFRJT04gOiBTV1QuTlVMTCkpOwotCQlzZWN0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzZWN0aW9uLnNldFRleHQoc2VjdGlvblRleHQpOwotCQlzZWN0aW9uLm1hcmdpbldpZHRoICA9IDA7Ci0JCXNlY3Rpb24ubWFyZ2luSGVpZ2h0ID0gMDsKLQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJc2VjdGlvbi5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JCX0KLQotCQlDb21wb3NpdGUgc3ViUGFuZSA9IHRoaXMuYWRkU3ViUGFuZShzZWN0aW9uKTsKLQkJc2VjdGlvbi5zZXRDbGllbnQoc3ViUGFuZSk7Ci0KLQkJcmV0dXJuIHN1YlBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUxpc3QgbGlzdCA9IChMaXN0KSBlLndpZGdldDsKLQkJCQlTdHJpbmdbXSBzZWxlY3RlZEl0ZW1zID0gbGlzdC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoKHNlbGVjdGVkSXRlbXMgPT0gbnVsbCkgfHwgKHNlbGVjdGVkSXRlbXMubGVuZ3RoICE9IDEpKSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3RlZEl0ZW1zWzBdKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGF5b3V0IHJlc3BvbnNpYmxlIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHNwYWNlciBjcmVhdGVkCi0JICogZm9yIHRoZSByaWdodCBjb250cm9sIHdoZW4gbm9uZSB3YXMgZ2l2ZW4uIFRoZSBzcGFjZXIgaGVscHMgdG8gYWxpZ24gYWxsCi0JICogdGhlIHJpZ2h0IGNvbnRyb2xzLgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgTGF5b3V0IGJ1aWxkU3BhY2VyTGF5b3V0KCkgewotCQlyZXR1cm4gbmV3IExheW91dCgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBvaW50IGNvbXB1dGVTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoSGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0SGludCwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZsdXNoQ2FjaGUpIHsKLQotCQkJCXJldHVybiBuZXcgUG9pbnQod2lkdGhIaW50LCBoZWlnaHRIaW50KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBsYXlvdXQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0JCQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSkgY29tcG9zaXRlLmdldExheW91dERhdGEoKTsKLQkJCQljb21wb3NpdGUuc2V0Qm91bmRzKDAsIDAsIGRhdGEud2lkdGhIaW50LCBkYXRhLmhlaWdodEhpbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQYW5lLnRoaXMuc3ViamVjdENoYW5nZWQoKFQpIGUuZ2V0T2xkVmFsdWUoKSwgKFQpIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRvcE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIHRvcCBvZiB0aGUgcGFuZQotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcG9zaXRlIGFkZFN1YlBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHRvcE1hcmdpbikgewotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgdG9wTWFyZ2luLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcE1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdE1hcmdpbikgewotCi0JCXJldHVybiB0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4sIDAsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB1c2VkIGFzIGEgc3ViLXBhbmUsIHRoZSBuZXcgd2lkZ2V0Ci0JICogd2lsbCBoYXZlIGl0cyBsYXlvdXQgYW5kIGxheW91dCBkYXRhIGFscmVhZHkgaW5pdGlhbGl6ZWQsIHRoZSBsYXlvdXQgd2lsbAotCSAqIGJlIGEgPGNvZGU+R3JpZExheW91dDwvY29kZT4gd2l0aCAxIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdG9wTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgdG9wIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGxlZnRNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIHRvIHRoZSBsZWZ0IG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIGJvdHRvbU1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgYXQgdGhlIGJvdHRvbSBvZiB0aGUgcGFuZQotCSAqIEBwYXJhbSByaWdodE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYW5lCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViUGFuZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4pIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMSwKLQkJCXRvcE1hcmdpbiwKLQkJCWxlZnRNYXJnaW4sCi0JCQlib3R0b21NYXJnaW4sCi0JCQlyaWdodE1hcmdpbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IHVzZWQgYXMgYSBzdWItcGFuZSwgdGhlIG5ldyB3aWRnZXQKLQkgKiB3aWxsIGhhdmUgaXRzIGxheW91dCBhbmQgbGF5b3V0IGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlIGxheW91dCB3aWxsCi0JICogYmUgYSA8Y29kZT5HcmlkTGF5b3V0PC9jb2RlPiB3aXRoIDEgY29sdW1uLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0b3BNYXJnaW4gVGhlIGV4dHJhIHNwYWNpbmcgdG8gYWRkIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gbGVmdE1hcmdpbiBUaGUgZXh0cmEgc3BhY2luZyB0byBhZGQgdG8gdGhlIGxlZnQgb2YgdGhlIHBhbmUKLQkgKiBAcGFyYW0gYm90dG9tTWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYW5lCi0JICogQHBhcmFtIHJpZ2h0TWFyZ2luIFRoZSBleHRyYSBzcGFjaW5nIHRvIGFkZCB0byB0aGUgcmlnaHQgb2YgdGhlIHBhbmUKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gdXNlZCBhcyBhIHN1Yi1wYW5lCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBvc2l0ZSBhZGRTdWJQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3BNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnRNYXJnaW4sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbU1hcmdpbiwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHRNYXJnaW4pIHsKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KGNvbHVtbkNvdW50LCBmYWxzZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCAgICA9IHRvcE1hcmdpbjsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgICA9IGxlZnRNYXJnaW47Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSBib3R0b21NYXJnaW47Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSByaWdodE1hcmdpbjsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFBhbmUoY29udGFpbmVyLCBsYXlvdXQpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWN0aW9uPC9jb2RlPi4gQSBzdWItcGFuZSBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGFzCi0JICogaXRzIGNsaWVudCB3aGljaCBjYW4gYmUgdHlwZWQgY2FzdCBkaXJlY3RseSBhcyBhIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBjb250YWluZXIgb2YgdGhlIG5ldyB3aWRnZXQKLQkgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHRleHQgb2YgdGhlIG5ldyBzZWN0aW9uCi0JICogQHJldHVybiBUaGUgPGNvZGU+U2VjdGlvbjwvY29kZT4ncyBzdWItcGFuZQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb21wb3NpdGUgYWRkU3ViU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZWN0aW9uVGV4dCkgewotCi0JCXJldHVybiB0aGlzLmFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCXNlY3Rpb25UZXh0LAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0YWJsZS4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gc3R5bGUgVGhlIHN0eWxlIHRvIGFwcGx5IHRvIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHlsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBhZGRVbm1hbmFnZWRUYWJsZShjb250YWluZXIsIHN0eWxlLCBoZWxwSWQpOwotCQl0aGlzLm1hbmFnZVdpZGdldCh0YWJsZSk7Ci0KLQkJcmV0dXJuIHRhYmxlOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCB0YWJsZS4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKLQkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHN0eWxlIFRoZSBzdHlsZSB0byBhcHBseSB0byB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGFibGUgb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwIElEIGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UYWJsZTwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGUgYWRkVW5tYW5hZ2VkVGFibGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3R5bGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZVRhYmxlKGNvbnRhaW5lciwgc3R5bGUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgICA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGFibGUuZ2V0SXRlbUhlaWdodCgpICogNDsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZSwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHRhYmxlLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0YWJsZSBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGhlbHAgSUQgaXMgcmVxdWlyZWQKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRhYmxlPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZSBhZGRUYWJsZShDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYWRkVGFibGUoCi0JCQljb250YWluZXIsCi0JCQlTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEksCi0JCQloZWxwSWQKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCB0YWJsZS4gIFVubWFuYWdlZCBtZWFucyB0aGF0IHRoaXMgUGFuZSB3aWxsCi0JICogbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LiAgVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUKLQkgKiBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IHRhYmxlIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaGVscCBJRCBpcyByZXF1aXJlZAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGFibGU8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlIGFkZFVubWFuYWdlZFRhYmxlKENvbXBvc2l0ZSBjb250YWluZXIsIFN0cmluZyBoZWxwSWQpIHsKLQotCQlyZXR1cm4gdGhpcy5hZGRVbm1hbmFnZWRUYWJsZSgKLQkJCWNvbnRhaW5lciwKLQkJCVNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSwKLQkJCWhlbHBJZAotCQkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgbWFuYWdlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lcik7Ci0JCXRoaXMubWFuYWdlV2lkZ2V0KHRleHQpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHVubWFuYWdlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuICBVbm1hbmFnZWQgbWVhbnMKLQkgKiB0aGF0IHRoaXMgUGFuZSB3aWxsIG5vdCBoYW5kbGUgdGhlIGVuYWJsaW5nL2Rpc2FibGluZyBvZiB0aGlzIHdpZGdldC4KLQkgKiBUaGUgb3duaW5nIG9iamVjdCB3aWxsIGhhbmRsZSBpdCB3aXRoIGl0cyBvd24gUGFuZUVuYWJsZXIgb3IgQ29udHJvbEVuYWJsZXIuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVRleHQgdGV4dCA9IHRoaXMud2lkZ2V0RmFjdG9yeS5jcmVhdGVUZXh0KGNvbnRhaW5lcik7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZXRGaWVsZEdyaWREYXRhKCkpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lcik7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bm1hbmFnZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0LiAgVW5tYW5hZ2VkIG1lYW5zCi0JICogdGhhdCB0aGlzIFBhbmUgd2lsbCBub3QgaGFuZGxlIHRoZSBlbmFibGluZy9kaXNhYmxpbmcgb2YgdGhpcyB3aWRnZXQuCi0JICogVGhlIG93bmluZyBvYmplY3Qgd2lsbCBoYW5kbGUgaXQgd2l0aCBpdHMgb3duIFBhbmVFbmFibGVyIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyB0ZXh0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIFRleHQgYWRkVW5tYW5hZ2VkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lcik7Ci0KLQkJaWYgKGhlbHBJZCAhPSBudWxsKSB7Ci0JCQlnZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0ZXh0LCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQuCi0JICoKLQkgKiBAcGFyYW0gY29udGFpbmVyIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdGV4dCBmaWVsZCdzIGlucHV0Ci0JICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCA8Y29kZT5UZXh0PC9jb2RlPiB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGV4dCBhZGRUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlcikgewotCi0JCXJldHVybiB0aGlzLmFkZFRleHQoY29udGFpbmVyLCB0ZXh0SG9sZGVyLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRleHQgYWRkVGV4dChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQlUZXh0IHRleHQgPSB0aGlzLmFkZFRleHQoY29udGFpbmVyLCBoZWxwSWQpOwotCQlTV1RUb29scy5iaW5kKHRleHRIb2xkZXIsIHRleHQpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBUZXh0IGFkZFRleHQoCi0JCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCQkJU3RyaW5nIGhlbHBJZCwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwKLQkpIHsKLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lciwgdGV4dEhvbGRlciwgaGVscElkKTsKLQkJdGhpcy5jb250cm9sRW5hYmxlZFN0YXRlKGVuYWJsZWRNb2RlbCwgdGV4dCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIDxjb2RlPlRleHQ8L2NvZGU+IHdpZGdldC4gIFVubWFuYWdlZCBtZWFucwotCSAqIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nIG9mIHRoaXMgd2lkZ2V0LgotCSAqIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlciBvciBDb250cm9sRW5hYmxlci4KLQkgKgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0ZXh0IGZpZWxkJ3MgaW5wdXQKLQkgKiBAcGFyYW0gaGVscElkIFRoZSB0b3BpYyBoZWxwIElEIHRvIGJlIHJlZ2lzdGVyZWQgZm9yIHRoZSBuZXcgdGV4dAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+VGV4dDwvY29kZT4gd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJpdmF0ZSBUZXh0IGFkZFVubWFuYWdlZFRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJVGV4dCB0ZXh0ID0gdGhpcy5hZGRVbm1hbmFnZWRUZXh0KGNvbnRhaW5lciwgaGVscElkKTsKLQkJU1dUVG9vbHMuYmluZCh0ZXh0SG9sZGVyLCB0ZXh0KTsKLQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbnRhaW5lciB3aXRoIGEgdGl0bGVkIGJvcmRlci4KLQkgKgotCSAqIEBwYXJhbSB0aXRsZSBUaGUgdGV4dCBvZiB0aGUgdGl0bGVkIGJvcmRlcgotCSAqIEBwYXJhbSBjb250YWluZXIgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkNvbXBvc2l0ZTwvY29kZT4gd2l0aCBhIHRpdGxlZCBib3JkZXIKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgR3JvdXAgYWRkVGl0bGVkR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIHRpdGxlKSB7Ci0JCXJldHVybiB0aGlzLmFkZFRpdGxlZEdyb3VwKGNvbnRhaW5lciwgdGl0bGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGggYSB0aXRsZWQgYm9yZGVyLgotCSAqCi0JICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IG9mIHRoZSB0aXRsZWQgYm9yZGVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBncm91cAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIGEgdGl0bGVkIGJvcmRlcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBHcm91cCBhZGRUaXRsZWRHcm91cChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCXJldHVybiBhZGRUaXRsZWRHcm91cChjb250YWluZXIsIHRpdGxlLCAxLCBoZWxwSWQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGFpbmVyIHdpdGggYSB0aXRsZWQgYm9yZGVyLgotCSAqCi0JICogQHBhcmFtIHRpdGxlIFRoZSB0ZXh0IG9mIHRoZSB0aXRsZWQgYm9yZGVyCi0JICogQHBhcmFtIGNvbnRhaW5lciBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBncm91cAotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPiB3aXRoIGEgdGl0bGVkIGJvcmRlcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBHcm91cCBhZGRUaXRsZWRHcm91cChDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRpdGxlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbkNvdW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCUdyb3VwIGdyb3VwID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUdyb3VwKGNvbnRhaW5lciwgdGl0bGUpOwotCQkvL21hbmFnZVdpZGdldChncm91cCk7IFRPRE8gdW5zdXJlIGlmIEkgd2FudCB0byBtYW5hZ2UgZ3JvdXBzLAotCQkvL2Fsc28gc2hvdWxkIHByb2JhYmx5IHJlbmFtZSB0aGlzIGFkZFVubWFuYWdlZFRpdGxlZFBhbmUKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dChjb2x1bW5Db3VudCwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgICAgPSA1OwotCQlsYXlvdXQubWFyZ2luTGVmdCAgID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDU7Ci0JCWxheW91dC5tYXJnaW5SaWdodCAgPSA1OwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBoZWxwSWQpOwotCQl9Ci0KLQkJcmV0dXJuIGdyb3VwOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgdW5tYW5hZ2VkIG5ldyB0b2dnbGUgYnV0dG9uIChyYWRpbyBidXR0b24gb3IgY2hlY2sgYm94KS4KLQkgKiBVbm1hbmFnZWQgbWVhbnMgIHRoYXQgdGhpcyBQYW5lIHdpbGwgbm90IGhhbmRsZSB0aGUgZW5hYmxpbmcvZGlzYWJsaW5nCi0JICogb2YgdGhpcyB3aWRnZXQuIFRoZSBvd25pbmcgb2JqZWN0IHdpbGwgaGFuZGxlIGl0IHdpdGggaXRzIG93biBQYW5lRW5hYmxlcgotCSAqIG9yIENvbnRyb2xFbmFibGVyLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSBidXR0b25UZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc2VsZWN0aW9uIHN0YXRlCi0JICogQHBhcmFtIGhlbHBJZCBUaGUgdG9waWMgaGVscCBJRCB0byBiZSByZWdpc3RlcmVkIGZvciB0aGUgbmV3IGJ1dHRvbgotCSAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgPGNvZGU+QnV0dG9uPC9jb2RlPgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByaXZhdGUgQnV0dG9uIGFkZFVubWFuYWdlZFRvZ2dsZUJ1dHRvbigKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBTdHJpbmcgYnV0dG9uVGV4dCwKLQkgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsCi0JICAgICAgICBTdHJpbmcgaGVscElkLAotCSAgICAgICAgaW50IHRvZ2dsZUJ1dHRvblR5cGUpIHsKLQotCQlCdXR0b24gYnV0dG9uOwotCi0JCWlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5QVVNIKSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUHVzaEJ1dHRvbihwYXJlbnQsIGJ1dHRvblRleHQpOwotCQl9Ci0JCWVsc2UgaWYgKHRvZ2dsZUJ1dHRvblR5cGUgPT0gU1dULlJBRElPKSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlUmFkaW9CdXR0b24ocGFyZW50LCBidXR0b25UZXh0KTsKLQkJfQotCQllbHNlIGlmICh0b2dnbGVCdXR0b25UeXBlID09IFNXVC5DSEVDSykgewotCQkJYnV0dG9uID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUNoZWNrQm94KHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlidXR0b24gPSB0aGlzLndpZGdldEZhY3RvcnkuY3JlYXRlQnV0dG9uKHBhcmVudCwgYnV0dG9uVGV4dCk7Ci0JCX0KLQotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCVNXVFRvb2xzLmJpbmQoYm9vbGVhbkhvbGRlciwgYnV0dG9uKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGJ1dHRvbiwgaGVscElkKTsKLQkJfQotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB0b2dnbGUgYnV0dG9uIChyYWRpbyBidXR0b24gb3IgY2hlY2sgYm94KSB1c2luZyB0aGUgZ2l2ZW4KLQkgKiBpbmZvcm1hdGlvbi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gYnV0dG9uVGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHNlbGVjdGlvbiBzdGF0ZQotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBidXR0b24KLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPkJ1dHRvbjwvY29kZT4KLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBhZGRUb2dnbGVCdXR0b24oCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgU3RyaW5nIGJ1dHRvblRleHQsCi0JICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyLAotCSAgICAgICAgU3RyaW5nIGhlbHBJZCwKLQkgICAgICAgIGludCB0b2dnbGVCdXR0b25UeXBlKSB7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IGFkZFVubWFuYWdlZFRvZ2dsZUJ1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJYnV0dG9uVGV4dCwKLQkJCQlib29sZWFuSG9sZGVyLAotCQkJCWhlbHBJZCwKLQkJCQl0b2dnbGVCdXR0b25UeXBlKTsKLQkJdGhpcy5tYW5hZ2VXaWRnZXQoYnV0dG9uKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNoZWNrIGJveCB0aGF0IGNhbiBoYXZlIDMgc2VsZWN0aW9uIHN0YXRlcyAoc2VsZWN0ZWQsCi0JICogdW5zZWxlY3RlZCBhbmQgcGFydGlhbGx5IHNlbGVjdGVkLgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB0ZXh0IFRoZSBidXR0b24ncyB0ZXh0Ci0JICogQHBhcmFtIGJvb2xlYW5Ib2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgYm9vbGVhbiB2YWx1ZSB3aGVyZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIG1lYW5zIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYWRkVHJpU3RhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveCgKLQkJCXBhcmVudCwKLQkJCXRleHQsCi0JCQl0aGlzLmdldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCi0JCXRoaXMubWFuYWdlV2lkZ2V0KGNoZWNrQm94LmdldENoZWNrQm94KCkpOwotCi0JCVRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQlib29sZWFuSG9sZGVyLAotCQkJY2hlY2tCb3gKLQkJKTsKLQotCQlpZiAoaGVscElkICE9IG51bGwpIHsKLQkJCWdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNoZWNrQm94LmdldENoZWNrQm94KCksIGhlbHBJZCk7Ci0JCX0KLQotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjaGVjayBib3ggdGhhdCBjYW4gaGF2ZSAzIHNlbGVjdGlvbiBzdGF0ZXMgKHNlbGVjdGVkLAotCSAqIHVuc2VsZWN0ZWQgYW5kIHBhcnRpYWxseSBzZWxlY3RlZC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gdGV4dCBUaGUgYnV0dG9uJ3MgdGV4dAotCSAqIEBwYXJhbSBib29sZWFuSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJvb2xlYW4gdmFsdWUgd2hlcmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBtZWFucyBwYXJ0aWFsbHkgc2VsZWN0ZWQKLQkgKiBAcGFyYW0gc3RyaW5nSG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN0cmluZyB0byBwdXQgaW4gcGFyZW50aGVzaXMgYWZ0ZXIKLQkgKiB0aGUgY2hlY2sgYm94J3MgdGV4dCB3aGVuIGl0IGlzIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqIEBwYXJhbSBoZWxwSWQgVGhlIHRvcGljIGhlbHAgSUQgdG8gYmUgcmVnaXN0ZXJlZCBmb3IgdGhlIG5ldyBjaGVjayBib3gKLQkgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyaVN0YXRlQ2hlY2tCb3ggYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGhlbHBJZCkgewotCi0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSB0aGlzLmFkZFRyaVN0YXRlQ2hlY2tCb3goCi0JCQlwYXJlbnQsCi0JCQl0ZXh0LAotCQkJYm9vbGVhbkhvbGRlciwKLQkJCWhlbHBJZAotCQkpOwotCi0JCW5ldyBMYWJlbGVkQ29udHJvbFVwZGF0ZXIoCi0JCQluZXcgTGFiZWxlZEJ1dHRvbihjaGVja0JveC5nZXRDaGVja0JveCgpKSwKLQkJCXN0cmluZ0hvbGRlcgotCQkpOwotCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGlzIHBhbmUgdG8gcG9wdWxhdGUgaXRzIHdpZGdldHMgd2l0aCB0aGUgc3ViamVjdCdzIHZhbHVlcy4KLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5kb1BvcHVsYXRlKCkiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsLCBDb250cm9sLi4uIGNvbnRyb2xzKSB7Ci0JCXRoaXMuY29udHJvbEVuYWJsZWRTdGF0ZV8odGhpcy53cmFwRW5hYmxlZE1vZGVsKGJvb2xlYW5Nb2RlbCksIGNvbnRyb2xzKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bWUgdGhlICJlbmFibGVkIiBtb2RlbHMgY2FuIHJldHVybiBudWxsICh3aGljaCBpcyB0eXBpY2FsIHdpdGggYXNwZWN0Ci0JICogYWRhcHRlcnMgZXRjLikuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gd3JhcEVuYWJsZWRNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgQm9vbGVhbj4oYm9vbGVhbk1vZGVsLCBOb25OdWxsQm9vbGVhblRyYW5zZm9ybWVyLkZBTFNFKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29udHJvbEVuYWJsZWRTdGF0ZV8oUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Nb2RlbCwgQ29udHJvbC4uLiBjb250cm9scykgewotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuYW5kRW5hYmxlZE1vZGVsKGJvb2xlYW5Nb2RlbCksIGNvbnRyb2xzKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBnZXRDb21iaW5lZEVuYWJsZWRNb2RlbCgpIHsKLQkJcmV0dXJuICh0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsICE9IG51bGwpID8gdGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbCA6IHRoaXMuYmFzZUVuYWJsZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0Q29tYmluZWRFbmFibGVtZW50KCkgewotCQlCb29sZWFuIGVuYWJsZWQgPSBnZXRDb21iaW5lZEVuYWJsZWRNb2RlbCgpLmdldFZhbHVlKCk7Ci0JCXJldHVybiAoZW5hYmxlZCA9PSBudWxsKSA/IHRydWUgOiBlbmFibGVkLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGFuZEVuYWJsZWRNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsKSB7Ci0JCXJldHVybiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmFuZChnZXRDb21iaW5lZEVuYWJsZWRNb2RlbCgpLCBib29sZWFuTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyb2xsZXJFbmFibGVtZW50Q2hhbmdlZCgpIHsKLQkJZW5hYmxlV2lkZ2V0c18oZ2V0Q29tYmluZWRFbmFibGVtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGVuYWJsZW1lbnQgc3RhdGUgb2YgdGhlIHdpZGdldHMgb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIGVuYWJsZWQgPGNvZGU+dHJ1ZTwvY29kZT4gdG8gZW5hYmxlIHRoZSB3aWRnZXRzIG9yIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIHRvIGRpc2FibGUgdGhlbQotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuYmFzZUVuYWJsZWRNb2RlbC5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoZW5hYmxlZCkpOwotCQllbmFibGVXaWRnZXRzXyhnZXRDb21iaW5lZEVuYWJsZW1lbnQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZVdpZGdldHNfKGJvb2xlYW4gZW5hYmxlZCkgewotCQlpZiAoISB0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWZvciAoQ29udHJvbCBjb250cm9sIDogdGhpcy5tYW5hZ2VkV2lkZ2V0cykgewotCQkJCWNvbnRyb2wuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCX0KLQotCQkJZm9yIChQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLm1hbmFnZWRTdWJQYW5lcykgewotCQkJCXN1YlBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmdhZ2VTdWJqZWN0SG9sZGVyKCkgewotCQl0aGlzLnN1YmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBlbmdhZ2UgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTGlzdGVuZXJzKFQgc3ViamVjdCkgewotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVuZ2FnZUxpc3RlbmVyc18oc3ViamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgc3ViamVjdCBpcyBub3QgbnVsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVyc18oVCBzdWJqZWN0KSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5lbmdhZ2VMaXN0ZW5lcnNfKCIgKyBzdWJqZWN0ICsgJyknKTsKLQotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLmdldFByb3BlcnR5TmFtZXMoKSkgewotCQkJc3ViamVjdC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBkaXNlbmdhZ2UgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKFQgc3ViamVjdCkgewotCQlpZiAoc3ViamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVyc18oc3ViamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgc3ViamVjdCBpcyBub3QgbnVsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVyc18oVCBzdWJqZWN0KSB7Ci0JCXRoaXMubG9nKFRyYWNpbmcuVUlfTEFZT1VULCAiICAgLT5kaXNlbmdhZ2VMaXN0ZW5lcnNfKCIgKyBzdWJqZWN0ICsgJyknKTsKLQotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLmdldFByb3BlcnR5TmFtZXMoKSkgewotCQkJc3ViamVjdC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5hc3BlY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFpbiA8Y29kZT5Db250cm9sPC9jb2RlPiBvZiB0aGlzIHBhbmUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBtYWluIGNvbnRhaW5lcgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXB1YmxpYyBDb21wb3NpdGUgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN1YmplY3QgaG9sZGVyIHVzZWQgYnkgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHdpZGdldHMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBmYWN0b3J5IHVzZWQgYnkgdGhpcyBwYW5lIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLndpZGdldEZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWFyZ2luIHRha2VuIGJ5IGEgZ3JvdXAgYm94LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHBpeGVsIHRoZQotCSAqIGdyb3VwIGJveCBib3JkZXIgYW5kIGl0cyBtYXJnaW4gdGFrZXMgYmVmb3JlIGRpc3BsYXlpbmcgaXRzIHdpZGdldHMgcGx1cwotCSAqIDUgcGl4ZWxzIHNpbmNlIHRoZSB3aWRnZXRzIGluc2lkZSBvZiB0aGUgZ3JvdXAgYm94IGFuZCB0aGUgYm9yZGVyIHNob3VsZAotCSAqIGhhdmUgdGhhdCBleHRyYSA1IHBpeGVscy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHdpZHRoIHRha2VuIGJ5IHRoZSBncm91cCBib3ggYm9yZGVyIHdpdGggaXRzIG1hcmdpbgotCSAqCi0JICogQGNhdGVnb3J5IExheW91dAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0R3JvdXBCb3hNYXJnaW4oKSB7Ci0JCUdyb3VwIGdyb3VwID0gdGhpcy53aWRnZXRGYWN0b3J5LmNyZWF0ZUdyb3VwKFNXVFV0aWwuZ2V0U2hlbGwoKSwgIiIpOwotCQlSZWN0YW5nbGUgY2xpZW50QXJlYSA9IGdyb3VwLmdldENsaWVudEFyZWEoKTsKLQkJZ3JvdXAuZGlzcG9zZSgpOwotCQlyZXR1cm4gY2xpZW50QXJlYS54ICsgNTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWxwcyBzeXN0ZW0uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwbGF0Zm9ybSdzIGhlbHAgc3lzdGVtCi0JICoKLQkgKiBAY2F0ZWdvcnkgSGVscGVyCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci0KLQotCS8qKgotCSAqIERldGVybWluZXMgd2hldGhlcgotCSAqCi0JICogQHJldHVybgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNQb3B1bGF0aW5nKCkgewotCQlyZXR1cm4gdGhpcy5wb3B1bGF0aW5nOwotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGdpdmVuIG1lc3NhZ2UgaWYgdGhlIDxjb2RlPlRyYWNpbmcuREVCVUdfTEFZT1VUPC9jb2RlPiBpcyBlbmFibGVkLgotCSAqCi0JICogQHBhcmFtIGZsYWcKLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbG9nZ2luZyBtZXNzYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBmbGFnLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoZmxhZy5lcXVhbHMoVHJhY2luZy5VSV9MQVlPVVQpICYmIFRyYWNpbmcuYm9vbGVhbkRlYnVnT3B0aW9uKFRyYWNpbmcuVUlfTEFZT1VUKSkgewotCQkJdGhpcy5sb2cobWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJQ2xhc3M8Pz4gdGhpc0NsYXNzID0gdGhpcy5nZXRDbGFzcygpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpc0NsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQotCQlpZiAodGhpc0NsYXNzLmlzQW5vbnltb3VzQ2xhc3MoKSkgewotCQkJY2xhc3NOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUuaW5kZXhPZignJCcpKTsKLQkJCWNsYXNzTmFtZSArPSAiLT4iICsgdGhpc0NsYXNzLmdldFN1cGVyY2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JCX0KLQotCQlUcmFjaW5nLmxvZyhjbGFzc05hbWUgKyAiOiAiICsgbWVzc2FnZSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBwYW5lIHRvIHBvcHVsYXRlIGl0c2VsZiB1c2luZyB0aGUgc3ViamVjdCdzIGluZm9ybWF0aW9uLgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlKCkgewotCQlpZiAoIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJwb3B1bGF0ZSgpIik7Ci0JCQl0aGlzLnJlcG9wdWxhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBzdWJqZWN0J3MgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lCi0JICogaGFzIGNoYW5nZWQuCi0JICoKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9wZXJ0eSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgY2hhbmdlCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbmFtZXMgdG8gbGlzdGVuIGZvciBwcm9wZXJ0aWVzIGNoYW5naW5nIGZyb20gdGhlCi0JICogc3ViamVjdC4KLQkgKgotCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcwotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBwcm9wZXJ0eU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyB3aWRnZXRzICh0aG9zZSB0aGF0IHdlcmUgcmVnaXN0ZXJlZCB3aXRoCi0JICogaXRzIGxlZnQgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+KSBmcm9tIHRoaXMgcGFuZSdzIGxlZnQKLQkgKiA8Y29kZT5Db250cm9sQWxpZ25lcjwvY29kZT4gc28gdGhhdCB0aGVpciB3aWR0aCB3aWxsIG5vIGxvbmdlciBiZSBhZGp1c3RlZAotCSAqIHdpdGggdGhlIHdpZHRoIG9mIHRoZSB3aWRlc3Qgd2lkZ2V0LgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgY29udGFpbmluZyB0aGUgd2lkZ2V0cyB0byByZW1vdmUKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnbkxlZnQoUGFuZTw/PiBwYW5lKSB7Ci0JCXRoaXMubGVmdENvbnRyb2xBbGlnbmVyLnJlbW92ZShwYW5lLmxlZnRDb250cm9sQWxpZ25lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gY29udHJvbCBmcm9tIHRoZSBjb2xsZWN0aW9uIG9mIHdpZGdldHMgdGhhdCBhcmUgYWxpZ25lZAotCSAqIHRvIGhhdmUgdGhlIHNhbWUgd2lkdGggd2hlbiB0aGV5IGFyZSBzaG93biB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSAzCi0JICogd2lkZ2V0IGNvbHVtcy4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIHRvIHJlbW92ZSwgaXRzIHdpZHRoIHdpbGwgbm8gbG9uZ2VyIGJlCi0JICogYWp1c3RlZCB0byBiZSB0aGUgd2lkdGggb2YgdGhlIGxvbmdlc3Qgd2lkZ2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25MZWZ0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLmxlZnRDb250cm9sQWxpZ25lci5yZW1vdmUoY29udHJvbCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcGFuZSdzIHdpZGdldHMgKHRob3NlIHRoYXQgd2VyZSByZWdpc3RlcmVkIHdpdGgKLQkgKiBpdHMgcmlnaHQgPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+KSBmcm9tIHRoaXMgcGFuZSdzIHJpZ2h0Ci0JICogPGNvZGU+Q29udHJvbEFsaWduZXI8L2NvZGU+IHNvIHRoYXQgdGhlaXIgd2lkdGggd2lsbCBubyBsb25nZXIgYmUgYWRqdXN0ZWQKLQkgKiB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgd2lkZXN0IHdpZGdldC4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdG8gcmVtb3ZlCi0JICoKLQkgKiBAY2F0ZWdvcnkgTGF5b3V0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVtb3ZlQWxpZ25SaWdodChQYW5lPD8+IHBhbmUpIHsKLQkJdGhpcy5yaWdodENvbnRyb2xBbGlnbmVyLnJlbW92ZShwYW5lLnJpZ2h0Q29udHJvbEFsaWduZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIGNvbnRyb2wgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB3aWRnZXRzIHRoYXQgYXJlIGFsaWduZWQKLQkgKiB0byBoYXZlIHRoZSBzYW1lIHdpZHRoIHdoZW4gdGhleSBhcmUgc2hvd24gdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIDMKLQkgKiB3aWRnZXQgY29sdW1zLgotCSAqCi0JICogQHBhcmFtIHBhbmUgVGhlIHBhbmUgdG8gcmVtb3ZlLCBpdHMgd2lkdGggd2lsbCBubyBsb25nZXIgYmUKLQkgKiBhanVzdGVkIHRvIGJlIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVBbGlnblJpZ2h0KENvbnRyb2wgY29udHJvbCkgewotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIucmVtb3ZlKGNvbnRyb2wpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHBhbmUncyBjb250cm9scyAodGhvc2UgdGhhdCB3ZXJlIHJlZ2lzdGVyZWQgZm9yCi0JICogYWxpZ25tZW50KSBmcm9tIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBwYW5lIFRoZSBwYW5lIGNvbnRhaW5pbmcgdGhlIHdpZGdldHMgdGhhdCBubyBsb25nZXIKLQkgKiByZXF1aXJlcyB0aGVpciB3aWR0aCBhZGp1c3RlZCB3aXRoIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCB3aWRnZXQKLQkgKgotCSAqIEBjYXRlZ29yeSBMYXlvdXQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZW1vdmVQYW5lRm9yQWxpZ25tZW50KFBhbmU8Pz4gcGFuZSkgewotCQlyZW1vdmVBbGlnbkxlZnQocGFuZSk7Ci0JCXJlbW92ZUFsaWduUmlnaHQocGFuZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIChwZXJoYXBzIGludGVybmFsbHkpIHdoZW4gdGhpcyBuZWVkcyB0byByZXBvcHVsYXRlCi0JICogYnV0IHRoZSBvYmplY3Qgb2YgaW50ZXJlc3QgaGFzIG5vdCBjaGFuZ2VkLgotCSAqCi0JICogQGNhdGVnb3J5IFBvcHVsYXRlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgcmVwb3B1bGF0ZSgpIHsKLQotCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgIiAgIC0+cmVwb3B1bGF0ZSgpIik7Ci0KLQkJLy8gUG9wdWxhdGUgdGhpcyBwYW5lCi0JCXRyeSB7Ci0JCQlzZXRQb3B1bGF0aW5nKHRydWUpOwotCQkJZG9Qb3B1bGF0ZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0UG9wdWxhdGluZyhmYWxzZSk7Ci0JCX0KLQotCQkvLyBBc2sgdGhlIHN1Yi1wYW5lcyB0byByZXBvcHVsYXRlIHRoZW1zZWx2ZXMKLQkJZm9yIChQYW5lPD8+IHN1YlBhbmUgOiB0aGlzLnN1YlBhbmVzKSB7Ci0JCQlzdWJQYW5lLnJlcG9wdWxhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGludGVybmFsIGZsYWcgdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBwYW5lIGlzIGJlaW5nCi0JICogcG9wdWxhdGVkIG9yIG5vdC4gRHVyaW5nIHBvcHVsYXRpb24sIGl0IGlzIHJlcXVpcmVkIHRvIG5vdCB1cGRhdGUgdGhlCi0JICogd2lkZ2V0cyB3aGVuIHRoZSBtb2RlbCBpcyB1cGRhdGVkIG5vciB0byB1cGRhdGUgdGhlIG1vZGVsIHdoZW4gdGhlIHdpZGdldHMKLQkgKiBhcmUgYmVpbmcgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsJ3MgdmFsdWVzLgotCSAqCi0JICogQHBhcmFtIHBvcHVsYXRpbmcKLQkgKgotCSAqIEBjYXRlZ29yeSBQb3B1bGF0ZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFBvcHVsYXRpbmcoYm9vbGVhbiBwb3B1bGF0aW5nKSB7Ci0JCXRoaXMucG9wdWxhdGluZyA9IHBvcHVsYXRpbmc7Ci0JfQotCi0JLyoqCi0JICogRWl0aGVyIHNob3cgb3IgaGlkZXMgdGhpcyBwYW5lLgotCSAqCi0JICogQHBhcmFtIHZpc2libGUgVGhlIG5ldyB2aXNpYmlsaXR5IHN0YXRlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJaWYgKCF0aGlzLmNvbnRhaW5lci5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuY29udGFpbmVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZWFyZXN0IDxjb2RlPlNoZWxsPC9jb2RlPiBkaXNwbGF5aW5nIHRoZSBtYWluIHdpZGdldCBvZiB0aGlzCi0JICogcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG5lYXJlc3Qgd2luZG93IGRpc3BsYXlpbmcgdGhpcyBwYW5lCi0JICovCi0JcHVibGljIGZpbmFsIFNoZWxsIGdldFNoZWxsKCkgewotCQlyZXR1cm4gdGhpcy5jb250YWluZXIuZ2V0U2hlbGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdWJqZWN0IG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHN1YmplY3QgaWYgdGhpcyBwYW5lIHdhcyBub3QgZGlzcG9zZWQ7IDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgaXQgd2FzCi0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwdWJsaWMgVCBnZXRTdWJqZWN0KCkgewotCQlyZXR1cm4gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaGFzIGNoYW5nZWQsIGRpc2Nvbm5lY3RzIGFueSBsaXN0ZW5lcnMgZnJvbSB0aGUgb2xkIHN1YmplY3QKLQkgKiBhbmQgY29ubmVjdHMgdGhvc2UgbGlzdGVuZXJzIG9udG8gdGhlIG5ldyBzdWJqZWN0LgotCSAqCi0JICogQHBhcmFtIG9sZHN1YmplY3QgVGhlIG9sZCBzdWJqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgd2FzIHNldAotCSAqIEBwYXJhbSBuZXdTdWJqZWN0IFRoZSBuZXcgc3ViamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIG5lZWRzIHRvIGJlCi0JICogc2V0Ci0JICoKLQkgKiBAY2F0ZWdvcnkgUG9wdWxhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzdWJqZWN0Q2hhbmdlZChUIG9sZFN1YmplY3QsIFQgbmV3U3ViamVjdCkgewotCQlpZiAoIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCi0JCQl0aGlzLmxvZyhUcmFjaW5nLlVJX0xBWU9VVCwgInN1YmplY3RDaGFuZ2VkKCkiKTsKLQkJCXRoaXMuZGlzZW5nYWdlTGlzdGVuZXJzKG9sZFN1YmplY3QpOwotCi0JCQl0aGlzLnJlcG9wdWxhdGUoKTsKLQotCQkJdGhpcy5lbmdhZ2VMaXN0ZW5lcnMobmV3U3ViamVjdCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJlZ2lzdGVycyBhbm90aGVyIDxjb2RlPlBhbmU8L2NvZGU+IHdpdGggdGhpcyBvbmUgc28gaXQgY2FuCi0JICogYmUgYXV0b21hdGljYWxseSBub3RpZmllZCBhYm91dCBjZXJ0YWluIGV2ZW50cyBzdWNoIGFzIGVuZ2FnaW5nIG9yCi0JICogZGlzZW5nYWdpbmcgdGhlIGxpc3RlbmVycywgZXRjLgotCSAqCi0JICogQHBhcmFtIHN1YlBhbmUgVGhlIHN1Yi1wYW5lIHRvIHJlZ2lzdGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29udHJvbGxlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHJlZ2lzdGVyU3ViUGFuZShQYW5lPD8+IHN1YlBhbmUpIHsKLQkJdGhpcy5zdWJQYW5lcy5hZGQoc3ViUGFuZSk7Ci0JfQotCi0JLyoqCi0JICogVW5yZWdpc3RlcnMgdGhlIGdpdmVuIDxjb2RlPlBhbmU8L2NvZGU+IGZyb20gdGhpcyBvbmUgc28gaXQKLQkgKiBjYW4gbm8gbG9uZ2VyIGJlIGF1dG9tYXRpY2FsbHkgbm90aWZpZWQgYWJvdXQgY2VydGFpbiBldmVudHMgc3VjaCBhcwotCSAqIGVuZ2FnaW5nIG9yIGRpc2VuZ2FnaW5nIHRoZSBsaXN0ZW5lcnMsIGV0Yy4KLQkgKgotCSAqIEBwYXJhbSBzdWJQYW5lIFRoZSBzdWItcGFuZSB0byB1bnJlZ2lzdGVyCi0JICoKLQkgKiBAY2F0ZWdvcnkgQ29udHJvbGxlcgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHVucmVnaXN0ZXJTdWJQYW5lKFBhbmU8Pz4gc3ViUGFuZSkgewotCQl0aGlzLnN1YlBhbmVzLnJlbW92ZShzdWJQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlUGFuZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmICghaXNQb3B1bGF0aW5nKCkgJiYgIXRoaXMuY29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5wb3B1bGF0aW5nID0gdHJ1ZTsKLQotCQkJdHJ5IHsKLQkJCQlwcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRoaXMucG9wdWxhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5sb2coVHJhY2luZy5VSV9MQVlPVVQsICJkaXNwb3NlKCkiKTsKLQotCQkvLyBEaXNwb3NlIHRoaXMgcGFuZQotCQl0aGlzLmRpc2VuZ2FnZUxpc3RlbmVycyhnZXRTdWJqZWN0KCkpOwotCQl0aGlzLmRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKTsKLQotCQlpZiAodGhpcy5jb21iaW5lZEVuYWJsZWRNb2RlbCAhPSBudWxsICYmIHRoaXMuY29tYmluZWRFbmFibGVkTW9kZWxMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNvbWJpbmVkRW5hYmxlZE1vZGVsTGlzdGVuZXIpOwotCQl9Ci0KLQkJdGhpcy5sZWZ0Q29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCQl0aGlzLnJpZ2h0Q29udHJvbEFsaWduZXIuZGlzcG9zZSgpOwotCi0JCS8vIEFzayB0aGUgc3ViLXBhbmVzIHRvIGRpc3Bvc2UgdGhlbXNlbHZlcwotCQlmb3IgKFBhbmU8Pz4gc3ViUGFuZSA6IHRoaXMuc3ViUGFuZXMpIHsKLQkJCXN1YlBhbmUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1Byb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MTk3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyA8Y29kZT5XaWRnZXRGYWN0b3J5PC9jb2RlPiBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHdpZGdldHMgdXNpbmcKLSAqIDxjb2RlPlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5PC9jb2RlPiBpbiBvcmRlciB1c2UgdGhlIGZvcm0gc3R5bGUKLSAqIChmbGF0LXN0eWxlKSBsb29rIGFuZCBmZWVsLgotICoKLSAqIEBzZWUgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGV4dGVuZHMgRm9ybVdpZGdldEZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Qcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgYWN0dWFsIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBuZXcKLQkgKiB3aWRnZXRzCi0JICovCi0JcHVibGljIFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJc3VwZXIod2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDb21wb3NpdGUocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEdyb3VwIGNyZWF0ZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0aXRsZSkgewotCQlyZXR1cm4gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUdyb3VwKHBhcmVudCwgdGl0bGUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIChUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkgc3VwZXIuZ2V0V2lkZ2V0RmFjdG9yeSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvVHJpU3RhdGVDaGVja0JveC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9pbnRlcm5hbC93aWRnZXRzL1RyaVN0YXRlQ2hlY2tCb3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiMGQyMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvVHJpU3RhdGVDaGVja0JveC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+IGNhbiBkaXNwbGF5IG9uZSBvZiB0aHJlZSBzdGF0ZXM6Ci0gKiB1bmNoZWNrZWQsIGNoZWNrZWQsIG9yIHBhcnRpYWxseSBjaGVja2VkLiBJdCBjYW4gYmUgbW9kaWZpZWQgdmlhIGEgbW91c2UKLSAqIHNlbGVjdGlvbiwgdmlhIGEga2V5Ym9hcmQgc2VsZWN0aW9uLCBvciBwcm9ncmFtbWF0aWNhbGx5LiBUaGUgc2VsZWN0aW9uIHN0YXRlIGlzCi0gKiByZXByZXNlbnRlZCBieSBhIDxjb2RlPkJvb2xlYW48L2NvZGU+IHZhbHVlIHdoZXJlIGEgPGNvZGU+bnVsbDwvY29kZT4KLSAqIHZhbHVlIG1lYW5zIHBhcnRpYWxseSBjaGVja2VkLgotICogPHA+Ci0gKiBUaGUgb3JkZXIgb2Ygc3RhdGUgY2hhbmdlcyBpczogdW5jaGVja2VkIC0+IHBhcnRpYWxseSBjaGVja2VkIC0+IGNoZWNrZWQuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3gKLXsKLQkvKioKLQkgKiBBIGNoZWNrIGJveCBidXR0b24uCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gYnV0dG9uOwotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgc2VsZWN0aW9uIHN0YXRlLgotCSAqLwotCXByaXZhdGUgVHJpU3RhdGUgc3RhdGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+IHdpdGggbm8gdGV4dC4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb21wb3NpdGUKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIFRyaVN0YXRlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXRoaXMocGFyZW50LCBudWxsLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlRyaVN0YXRlQ2hlY2tCb3g8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSB0ZXh0IFRoZSBjaGVjayBib3gncyB0ZXh0Ci0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIGNoZWNrIGJveAotCSAqLwotCXB1YmxpYyBUcmlTdGF0ZUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhdGUgPSBUcmlTdGF0ZS5VTkNIRUNLRUQ7Ci0JCXRoaXMuYnV0dG9uID0gd2lkZ2V0RmFjdG9yeS5jcmVhdGVDaGVja0JveChwYXJlbnQsIHRleHQpOwotCQl0aGlzLmJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBBZGRzIGEgZGlzcG9zZSBsaXN0ZW5lciB0byB0aGUgY2hlY2sgYm94LgotCSAqIFRoZSBzb3VyY2Ugb2YgYW55IGV2ZW50cyBzZW50IHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHRoZSBjaGVjayBib3ggd2lkZ2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKSB7Ci0JCXRoaXMuYnV0dG9uLmFkZERpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZDogQWRkcyBhIHNlbGVjdGlvbiBsaXN0ZW5lciB0byB0aGUgY2hlY2sgYm94LgotCSAqIFRoZSBzb3VyY2Ugb2YgYW55IGV2ZW50cyBzZW50IHRvIHRoZSBsaXN0ZW5lciB3aWxsIGJlIHRoZSBjaGVjayBib3ggd2lkZ2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKFNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyKSB7Ci0JCXRoaXMuYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVRyaVN0YXRlQ2hlY2tCb3gudGhpcy5jaGVja0JveENsaWNrZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY2hlY2sgYm94IHdhcyBjbGlja2VkLCBjaGFuZ2UgdGhlIHRyaS1zdGF0ZSB0byB0aGUgbmV4dCB2YWx1ZSBhbmQKLQkgKiB1cGRhdGUgdGhlIGNoZWNrIGJveCdzIHN0YXRlLgotCSAqLwotCXZvaWQgY2hlY2tCb3hDbGlja2VkKCkgewotCQl0aGlzLnN0YXRlID0gdGhpcy5uZXh0U3RhdGUoKTsKLQkJdGhpcy51cGRhdGVDaGVja0JveCgpOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2VzIHRoZSBjaGVjayBib3ggd2lkZ2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuYnV0dG9uLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5CdXR0b248L2NvZGU+IHVzZWQgdG8gc2hvdyBhIHRyaS1zdGF0ZSBjaGVjayBib3guCi0JICoKLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5CdXR0b248L2NvZGU+IHVzZWQgdG8gc2hvdyBhIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgQnV0dG9uIGdldENoZWNrQm94KCkgewotCQlyZXR1cm4gdGhpcy5idXR0b247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hlY2sgYm94J3MgaW1hZ2UuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjaGVjayBib3gncyBpbWFnZS4KLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmJ1dHRvbi5nZXRJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoZWNrIGJveCdzIHNlbGVjdGlvbiBzdGF0ZS4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IgY2hlY2tlZCBvcgotCSAqIHVuY2hlY2tlZDsgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuICh0aGlzLnN0YXRlID09IFRyaVN0YXRlLlBBUlRJQUxMWV9DSEVDS0VEKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdGF0ZSA9PSBUcmlTdGF0ZS5DSEVDS0VEKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGVjayBib3gncyB0ZXh0LgotCSAqCi0JICogQHJldHVybiBUaGUgdGV4dCBvZiB0aGUgY2hlY2sgYm94Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gdGhpcy5idXR0b24uZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY2hlY2sgYm94IGlzIGRpc3Bvc2VkLgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgYm94IGlzIGRpc3Bvc2VkOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc3Bvc2VkKCkgewotCQlyZXR1cm4gdGhpcy5idXR0b24uaXNEaXNwb3NlZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgY2hlY2sgYm94IGlzIGVuYWJsZWQuCi0JICoKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBib3ggaXMgZW5hYmxlZDsgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gdGhpcy5idXR0b24uaXNFbmFibGVkKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCBzdGF0ZToKLQkgKiAgICAgVU5DSEVDS0VEIC0+IFBBUlRJQUxMWV9DSEVDS0VECi0JICogICAgIFBBUlRJQUxMWV9DSEVDS0VEIC0+IENIRUNLRUQKLQkgKiAgICAgQ0hFQ0tFRCAtPiBVTkNIRUNLRUQKLQkgKi8KLQlwcml2YXRlIFRyaVN0YXRlIG5leHRTdGF0ZSgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlKSB7Ci0JCQljYXNlIFVOQ0hFQ0tFRDoKLQkJCQlyZXR1cm4gVHJpU3RhdGUuUEFSVElBTExZX0NIRUNLRUQ7Ci0JCQljYXNlIFBBUlRJQUxMWV9DSEVDS0VEOgotCQkJCXJldHVybiBUcmlTdGF0ZS5DSEVDS0VEOwotCQkJY2FzZSBDSEVDS0VEOgotCQkJCXJldHVybiBUcmlTdGF0ZS5VTkNIRUNLRUQ7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gc3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZDogUmVtb3ZlcyBhIGRpc3Bvc2UgbGlzdGVuZXIgZnJvbSB0aGUgY2hlY2sgYm94LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURpc3Bvc2VMaXN0ZW5lcihEaXNwb3NlTGlzdGVuZXIgZGlzcG9zZUxpc3RlbmVyKSB7Ci0JCXRoaXMuYnV0dG9uLnJlbW92ZURpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZDogUmVtb3ZlcyBhIHNlbGVjdGlvbiBsaXN0ZW5lciBmcm9tIHRoZSBjaGVjayBib3guCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIpIHsKLQkJdGhpcy5idXR0b24ucmVtb3ZlU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGNoZWNrIGJveCdzIGVuYWJsZW1lbnQgc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gZW5hYmxlZCA8Y29kZT50cnVlPC9jb2RlPiB0byBlbmFibGUgdGhlIGNoZWNrIGJveCBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiB0byBkaXNhYmxlIGl0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJdGhpcy5idXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBib3gncyBpbWFnZS4KLQkgKgotCSAqIEBwYXJhbSBpbWFnZSBUaGUgbmV3IGltYWdlIG9mIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQl0aGlzLmJ1dHRvbi5zZXRJbWFnZShpbWFnZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY2hlY2sgYm94J3Mgc2VsZWN0aW9uIHN0YXRlLgotCSAqCi0JICogQHBhcmFtIHNlbGVjdGlvbiBFaXRoZXIgPGNvZGU+dHJ1ZTwvY29kZT4gb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvcgotCSAqIGNoZWNrZWQgYW5kIHVuY2hlY2tlZDsgb3IgPGNvZGU+bnVsbDwvY29kZT4gZm9yIHBhcnRpYWxseSBzZWxlY3RlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihCb29sZWFuIHNlbGVjdGlvbikgewotCQlUcmlTdGF0ZSBvbGQgPSB0aGlzLnN0YXRlOwotCQl0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZUZvckJvb2xlYW4oc2VsZWN0aW9uKTsKLQkJaWYgKG9sZCAhPSB0aGlzLnN0YXRlKSB7Ci0JCQl0aGlzLnVwZGF0ZUNoZWNrQm94KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjaGVjayBib3gncyB0ZXh0LgotCSAqCi0JICogQHBhcmFtIHRleHQgVGhlIG5ldyB0ZXh0IG9mIHRoZSBjaGVjayBib3gKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMuYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHJpLXN0YXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJvb2xlYW4uCi0JICoKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIFRoZSBib29sZWFuIHRvIGJlIGNvbnZlcnRlZCB0byBhIHRyaS1zdGF0ZQotCSAqLwotCXByaXZhdGUgVHJpU3RhdGUgc3RhdGVGb3JCb29sZWFuKEJvb2xlYW4gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiAoc2VsZWN0aW9uID09IG51bGwpID8gVHJpU3RhdGUuUEFSVElBTExZX0NIRUNLRUQgOgotCQkJc2VsZWN0aW9uLmJvb2xlYW5WYWx1ZSgpID8gVHJpU3RhdGUuQ0hFQ0tFRCA6IFRyaVN0YXRlLlVOQ0hFQ0tFRDsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgdGhlIG9mIHRoZSBjaGVjayBib3ggYmFzZWQgb24gdGhlIHRyaS1zdGF0ZQotCSAqIHZhbHVlLgotCSAqLwotCXZvaWQgdXBkYXRlQ2hlY2tCb3goKSB7Ci0JCXN3aXRjaCAodGhpcy5zdGF0ZSkgewotCQkJY2FzZSBVTkNIRUNLRUQ6Ci0JCQkJdGhpcy5idXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQl0aGlzLmJ1dHRvbi5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQVJUSUFMTFlfQ0hFQ0tFRDoKLQkJCQl0aGlzLmJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJdGhpcy5idXR0b24uc2V0R3JheWVkKHRydWUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDSEVDS0VEOgotCQkJCXRoaXMuYnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQl0aGlzLmJ1dHRvbi5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIHN0YXRlOiAiICsgdGhpcy5zdGF0ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbiBlbnVtIGNvbnRhaW5pbmcgdGhlIHBvc3NpYmxlIHNlbGVjdGlvbnMuCi0JICovCi0JZW51bSBUcmlTdGF0ZSB7Ci0JCUNIRUNLRUQsCi0JCVBBUlRJQUxMWV9DSEVDS0VELAotCQlVTkNIRUNLRUQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9WYWxpZGF0aW5nRGlhbG9nLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpZGdldHMvVmFsaWRhdGluZ0RpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGI2Y2RmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2lkZ2V0cy9WYWxpZGF0aW5nRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0czsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyBzaW1pbGFyIHRvIGl0IHN1cGVyY2xhc3MsIDxjb2RlPkRpYWxvZzwvY29kZT4sIHdpdGgKLSAqIHRoZSBhZGRlZCB2YWx1ZSBvZiBhbiBlcnJvciBtZXNzYWdlIGxhYmVsIGJlbG93IHRoZSBtYWluIHBhbmVsLiBBIHN1YmNsYXNzCi0gKiBjYW4gc2V0IHRoaXMgZXJyb3IgbWVzc2FnZSBhcyBuZWVkZWQgc28gdGhhdCBpdCBjYW4gaW5mb3JtIHRoZSB1c2VyIHNvbWV0aGluZwotICogaW5jb3JyZWN0IGhhcyBiZWVuIGVudGVyZWQuCi0gKiA8cD4KLSAqIElmIHRoZXJlIGlzIGFuIGVycm9yIG1lc3NhZ2UsIGl0IHdpbGwgYmUgc2hvd24uIElmIHRoZXJlIGlzIGEgd2FybmluZwotICogbWVzc2FnZSwgaXQgd2lsbCBvbmx5IGJlIHNob3duIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuIFdhcm5pbmcgbWVzc2FnZXMKLSAqIGhhdmUgYSBkaWZmZXJlbnQgaWNvbiB0aGFuIGVycm9yIG1lc3NhZ2VzLgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGluZ0RpYWxvZzxUIGV4dGVuZHMgTm9kZT4gZXh0ZW5kcyBEaWFsb2c8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW5nRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW5nRGlhbG9nKFNoZWxsIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGluZ0RpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gdGl0bGUgVGhlIGRpYWxvZydzIHRpdGxlCi0JICovCi0JcHVibGljIFZhbGlkYXRpbmdEaWFsb2coU2hlbGwgcGFyZW50LCBTdHJpbmcgdGl0bGUpIHsKLQkJc3VwZXIocGFyZW50LCB0aXRsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JZmluYWwgTm9kZS5WYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTm9kZS5WYWxpZGF0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVzdW1lKCkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCQlWYWxpZGF0aW5nRGlhbG9nLnRoaXMudmFsaWRhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIG1lc3NhZ2VzIGZyb20gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjbGVhck1lc3NhZ2UoKXsKLQkJc2V0TWVzc2FnZShnZXREZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhcnMgdGhlIGVycm9yIG1lc3NhZ2UgZnJvbSB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjbGVhckVycm9yTWVzc2FnZSgpIHsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lLgotCSAqCi0JICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gdW5kZXIgdGhlIGRlc2NyaXB0aW9uJ3MgdGl0bGUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBzaG93biBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGltYWdlIG9mIHRoZSBkZXNjcmlwdGlvbiBwYW5lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUgaXMKLQkgKiByZXF1aXJlZAotCSAqLwotCXByb3RlY3RlZCBJbWFnZSBnZXREZXNjcmlwdGlvbkltYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0aXRsZSBvZiB0aGUgZGVzY3JpcHRpb24gcGFuZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHRpdGxlIHNob3duIGluIHRoZSBkZXNjcmlwdGlvbiBwYW5lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCVBvaW50IHJlc3VsdCA9IGdldFNoZWxsKCkuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJUG9pbnQgcGFuZVNpemUgPSBnZXRQYW5lKCkuZ2V0Q29udHJvbCgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCWludCB3aWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKDQwMCk7Ci0JCXJlc3VsdC54ID0gTWF0aC5tYXgod2lkdGgsIHBhbmVTaXplLngpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1RpdGxlQXJlYSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVVJKCkgewotCi0JCXN1cGVyLmluaXRpYWxpemVVSSgpOwotCi0JCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRpb24gdGl0bGUKLQkJU3RyaW5nIGRlc2NyaXB0aW9uVGl0bGUgPSBnZXREZXNjcmlwdGlvblRpdGxlKCk7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uVGl0bGUgIT0gbnVsbCkgewotCQkJc2V0VGl0bGUoZGVzY3JpcHRpb25UaXRsZSk7Ci0JCX0KLQotCQkvLyBVcGRhdGUgdGhlIGRlc2NyaXB0aW9uIHRpdGxlCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKCk7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXNldE1lc3NhZ2UoZGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJLy8gVXBkYXRlIHRoZSBkZXNjcmlwdGlvbiBpbWFnZQotCQlJbWFnZSBpbWFnZSA9IGdldERlc2NyaXB0aW9uSW1hZ2UoKTsKLQotCQlpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJc2V0VGl0bGVJbWFnZShpbWFnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBkZXNjcmlwdGlvbiBwYW5lIGJ5IHNob3dpbmcgdGhlIGdpdmVuIGVycm9yIG1lc3NhZ2UgYW5kIGZvcm1hdAotCSAqIHRoZSB0ZXh0IHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgYXJndW1lbnRzIGlmIGFueSBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIFRoZSBlcnJvciBtZXNzYWdlIHRvIHNob3cgaW4gdGhlIGRlc2NyaXB0aW9uIHBhbmUKLQkgKiBAcGFyYW0gYXJndW1lbnRzIFRoZSBsaXN0IG9mIGFyZ3VtZW50cyB1c2VkIHRvIGZvcm1hdCB0aGUgZXJyb3IgbWVzc2FnZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7Ci0JCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChlcnJvck1lc3NhZ2UsIGFyZ3VtZW50cykpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGRlc2NyaXB0aW9uIHBhbmUgYnkgc2hvd2luZyB0aGUgZ2l2ZW4gd2FybmluZyBtZXNzYWdlIGFuZCBmb3JtYXQKLQkgKiB0aGUgdGV4dCB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIGFyZ3VtZW50cyBpZiBhbnkgZXhpc3RzLgotCSAqCi0JICogQHBhcmFtIHdhcm5pbmdNZXNzYWdlIFRoZSB3YXJuaW5nIG1lc3NhZ2UgdG8gc2hvdyBpbiB0aGUgZGVzY3JpcHRpb24gcGFuZQotCSAqIEBwYXJhbSBhcmd1bWVudHMgVGhlIGxpc3Qgb2YgYXJndW1lbnRzIHVzZWQgdG8gZm9ybWF0IHRoZSBlcnJvciBtZXNzYWdlCi0JICovCi0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0V2FybmluZ01lc3NhZ2UoU3RyaW5nIHdhcm5pbmdNZXNzYWdlLCBPYmplY3QuLi4gYXJndW1lbnRzKSB7Ci0JCXNldE1lc3NhZ2UoTkxTLmJpbmQod2FybmluZ01lc3NhZ2UsIGFyZ3VtZW50cyksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZXJyb3IgbWVzc2FnZSwgZWl0aGVyIHNob3dzIHRoZSBmaXJzdCBlcnJvciBwcm9ibGVtIG9yIGhpZGVzCi0JICogdGhlIGVycm9yIHBhbmUuIElmIHRoZSBwcm9ncmVzcyBiYXIgaXMgc2hvd24sIHRoZW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbAotCSAqIG5vdCBiZSBzaG93bi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlTWVzc2FnZSgpIHsKLQkJaWYgKGdldFN1YmplY3QoKS5icmFuY2hQcm9ibGVtc1NpemUoKSA9PSAwKSB7Ci0JCQljbGVhck1lc3NhZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCQlmb3IgKExpc3RJdGVyYXRvcjxQcm9ibGVtPiBwcm9ibGVtcyA9IGdldFN1YmplY3QoKS5icmFuY2hQcm9ibGVtcygpOyBwcm9ibGVtcy5oYXNOZXh0KCk7KXsKLQkJCQkJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXMubmV4dCgpOwotCQkJCQlpZiAocHJvYmxlbS5tZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuRVJST1IpewotCQkJCQkJdGhpcy5zZXRFcnJvck1lc3NhZ2UocHJvYmxlbS5tZXNzYWdlS2V5KCksIHByb2JsZW0ubWVzc2FnZUFyZ3VtZW50cygpKTsKLQkJCQkJfSAKLQkJCQkJZWxzZSBpZiAocHJvYmxlbS5tZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyl7Ci0JCQkJCQl0aGlzLnNldFdhcm5pbmdNZXNzYWdlKHByb2JsZW0ubWVzc2FnZUtleSgpLCBwcm9ibGVtLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQkJaWYgKCF0aGlzLmNvbnRhaW5zRXJyb3JNZXNzYWdlKCkpewotCQkJY2xlYXJFcnJvck1lc3NhZ2UoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0Vycm9yTWVzc2FnZSgpewotCQlib29sZWFuIGVycm9yID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zID0gZ2V0U3ViamVjdCgpLmJyYW5jaFByb2JsZW1zKCk7IHByb2JsZW1zLmhhc05leHQoKTspewotCQkJUHJvYmxlbSBwcm9ibGVtID0gcHJvYmxlbXMubmV4dCgpOwotCQkJaWYgKHByb2JsZW0ubWVzc2FnZVR5cGUoKSA9PUlNZXNzYWdlUHJvdmlkZXIuRVJST1IpewotCQkJCWVycm9yID0gdHJ1ZTsKLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGVycm9yOwotCX0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIHN0YXRlIG9iamVjdCBhbmQgYmFzZWQgb24gaXRzIHN0YXR1cywgdXBkYXRlIHRoZSBkZXNjcmlwdGlvbgotCSAqIHBhbmUgdG8gc2hvdyB0aGUgZmlyc3QgZXJyb3IgaWYgYW55IGV4aXN0cyBhbmQgdXBkYXRlIHRoZSBlbmFibGVtZW50IG9mCi0JICogdGhlIE9LIGJ1dHRvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWdldFN1YmplY3QoKS52YWxpZGF0ZUJyYW5jaCgpOwotCQl1cGRhdGVNZXNzYWdlKCk7Ci0JCWdldEJ1dHRvbihPSykuc2V0RW5hYmxlZCghY29udGFpbnNFcnJvck1lc3NhZ2UoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2l6YXJkcy9KYXZhUHJvamVjdFdpemFyZFBhZ2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvaW50ZXJuYWwvd2l6YXJkcy9KYXZhUHJvamVjdFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwOTU3YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2ludGVybmFsL3dpemFyZHMvSmF2YVByb2plY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vKioKLSAqICBKYXZhUHJvamVjdFdpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcm9qZWN0V2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25MYWJlbDsKLQlwcml2YXRlIFRhYmxlIHByb2plY3RUYWJsZTsKLQlwcml2YXRlIFRhYmxlVmlld2VyIHByb2plY3RUYWJsZVZpZXdlcjsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU0VMRUNUX1BST0pFQ1RfUEFHRV9OQU1FID0gIlNlbGVjdEphdmFQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGludCBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYID0gMDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhUHJvamVjdFdpemFyZFBhZ2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXN1cGVyKFNFTEVDVF9QUk9KRUNUX1BBR0VfTkFNRSk7Ci0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCX0KLQkKLQkvLyAqKioqKioqKioqIElEaWFsb2dQYWdlIGltcGxlbWVudGF0aW9uICAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJdGhpcy5idWlsZExhYmVsKGNvbXBvc2l0ZSwgdGhpcy5kZXN0aW5hdGlvbkxhYmVsKTsKLQkJCi0JCXRoaXMucHJvamVjdFRhYmxlID0gdGhpcy5idWlsZFByb2plY3RUYWJsZShjb21wb3NpdGUsIHRoaXMuYnVpbGRQcm9qZWN0VGFibGVTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCi0JCXRoaXMucHJvamVjdFRhYmxlVmlld2VyID0gdGhpcy5idWlsZFByb2plY3RUYWJsZVZpZXdlcigKLQkJCQkJCQkJCQkJCXRoaXMucHJvamVjdFRhYmxlLCAKLQkJCQkJCQkJCQkJCXRoaXMuYnVpbGRQcm9qZWN0VGFibGVMYWJlbFByb3ZpZGVyKCksIAotCQkJCQkJCQkJCQkJdGhpcy5idWlsZFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdGhpcy5maWxsUHJvamVjdExpc3QoKTsKLQkJdGhpcy5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRoaXMuc2V0VGFibGVTZWxlY3Rpb24odGhpcy5qYXZhUHJvamVjdCk7Ci0JCXRoaXMudmFsaWRhdGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkUHJvamVjdFRhYmxlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdGVkUHJvamVjdENoYW5nZWQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJQcm9tcHRQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0IHRhYmxlIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGNhbGxiYWNrcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZFByb2plY3RDaGFuZ2VkKCkgewotCQlpZih0aGlzLnByb2plY3RUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9ICB0aGlzLnByb2plY3RUYWJsZS5nZXRJdGVtKHRoaXMucHJvamVjdFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gaXRlbS5nZXRUZXh0KDApOwotCQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9qZWN0TmFtZSkpIHsKLQotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCXRoaXMuc2V0SmF2YVByb2plY3QoSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpKTsKLQkJCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbkxhYmVsKFN0cmluZyBkZXN0aW5hdGlvbkxhYmVsKSB7Ci0JCXRoaXMuZGVzdGluYXRpb25MYWJlbCA9IGRlc3RpbmF0aW9uTGFiZWw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcm90ZWN0ZWQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZVNlbGVjdGlvbihJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYoamF2YVByb2plY3QgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCWZvcihUYWJsZUl0ZW0gaXRlbTogdGhpcy5wcm9qZWN0VGFibGUuZ2V0SXRlbXMoKSkgewotCQkJCWlmKGl0ZW0uZ2V0VGV4dCgwKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0JCQkJCXRoaXMucHJvamVjdFRhYmxlLnNldFNlbGVjdGlvbihpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZmlsbFByb2plY3RMaXN0KCkgewotCQl0aGlzLnByb2plY3RUYWJsZVZpZXdlci5zZXRJbnB1dCh0aGlzLmdldFNvcnRlZEphdmFQcm9qZWN0c05hbWVzKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRoaXMucHJvamVjdFRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCkgIT0gLTEpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb3J0ZWRKYXZhUHJvamVjdHNOYW1lcygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydCh0aGlzLmdldEphdmFQcm9qZWN0c05hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0SmF2YVByb2plY3RzTmFtZXMoKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVByb2plY3QsIFN0cmluZz4odGhpcy5nZXRKYXZhUHJvamVjdHMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCQkJcmV0dXJuIHByb2plY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0sCi0JCQluZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElQcm9qZWN0PiBnZXRKYXZhUHJvamVjdHMoKSB7Ci0JICAgcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJUHJvamVjdD4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRQcm9qZWN0cygpKSkgewotCSAgICAgIEBPdmVycmlkZQotCSAgICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJUHJvamVjdCBuZXh0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIG5leHQuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkgICAgICB9Ci0JICAgfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SVByb2plY3Q+IGdldFByb2plY3RzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8SVByb2plY3Q+KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgZmluYWwgY2xhc3MgUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYoY29sdW1uSW5kZXggPT0gUFJPSkVDVF9OQU1FX0NPTFVNTl9JTkRFWCkKLQkJCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZShvcmcuZWNsaXBzZS51aS5pZGUuSURFLlNoYXJlZEltYWdlcy5JTUdfT0JKX1BST0pFQ1QpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJYXNzZXJ0IGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmc7Ci0JCQlTdHJpbmcgcHJvamVjdE5hbWUgPSAoU3RyaW5nKWVsZW1lbnQ7Ci0JCQlpZihjb2x1bW5JbmRleCA9PSBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYKQotCQkJCXJldHVybiBwcm9qZWN0TmFtZTsKLQkJCXJldHVybiBudWxsOwotCQl9CQkKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuICgoU3RyaW5nW10paW5wdXRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQl9Ci0KLQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZFByb2plY3RUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdFRhYmxlTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgYnVpbGRQcm9qZWN0VGFibGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvamVjdFRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMYWJlbCBidWlsZExhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FICk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlIGJ1aWxkUHJvamVjdFRhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCwgCi0JCQkJCQkJCQkJCQlTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5WSVJUVUFMKTsJCQotCi0JCVRhYmxlIHRhYmxlID0gdGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCXRhYmxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCXByaXZhdGUgVGFibGVWaWV3ZXIgYnVpbGRQcm9qZWN0VGFibGVWaWV3ZXIoVGFibGUgcGFyZW50LCBJVGFibGVMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCi0JCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotfQkKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0RlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmYzYmUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlckNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JRGVzY3JpcHRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXJ9IGFuZCB7QGxpbmsgSUxhYmVsUHJvdmlkZXJ9IHRoYXQgCi0gKiBtYWludGFpbnMgYSBjb2xsZWN0aW9uIChNYXAsIGFjdHVhbGx5KSBvZiB7QGxpbmsgSXRlbUNvbnRlbnRQcm92aWRlcn0gCi0gKiBkZWxlZ2F0ZXMgdGhhdCBwZXJmb3JtIHRoZSBmdW5jdGlvbiBvZiBwcm92aWRpbmcgY29udGVudCBhbmQgbGFiZWwgaW5mb3JtYXRpb24KLSAqIGZvciBlYWNoIHJlcHJlc2VudGVkIGl0ZW0KLSAqIAotICogTkI6IFRoaXMgY2xhc3MsIGlmIHVzZWQgYXMgYSBsYWJlbCBwcm92aWRlciAqTVVTVCogYmUgdXNlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIKLSAqIGZvciB0aGUgc2FtZSB2aWV3ZXIuICBJdCBtYXkgYmUgdXNlZCBhcyBhIGNvbnRlbnQgcHJvdmlkZXIgd2l0aCBhIGRpZmZlcmVudAotICogbGFiZWwgcHJvdmlkZXIsIGhvd2V2ZXIuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgCi0JZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCWltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIsIElMYWJlbFByb3ZpZGVyLCBJRGVzY3JpcHRpb25Qcm92aWRlcgotewotCXByaXZhdGUgZmluYWwgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCQotCXByaXZhdGUgZmluYWwgTWFwPE9iamVjdCwgSXRlbUNvbnRlbnRQcm92aWRlcj4gaXRlbUNvbnRlbnRQcm92aWRlcnM7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LCBJdGVtTGFiZWxQcm92aWRlcj4gaXRlbUxhYmVsUHJvdmlkZXJzOwotCQotCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyOwotCQotCQotCXByb3RlY3RlZCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIoCi0JCQlJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBpdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSkgewotCQl0aGlzKGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LCBudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LAotCQkJSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5ID0gaXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0JCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5ID0gaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotCQl0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBJdGVtQ29udGVudFByb3ZpZGVyPigpOwotCQl0aGlzLml0ZW1MYWJlbFByb3ZpZGVycyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgSXRlbUxhYmVsUHJvdmlkZXI+KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJdGVtQ29udGVudFByb3ZpZGVyIGl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0pIHsKLQkJSXRlbUNvbnRlbnRQcm92aWRlciBpdGVtQ29udGVudFByb3ZpZGVyID0gdGhpcy5pdGVtQ29udGVudFByb3ZpZGVycy5nZXQoaXRlbSk7Ci0JCWlmIChpdGVtQ29udGVudFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtQ29udGVudFByb3ZpZGVyOwotCQl9Ci0JCWl0ZW1Db250ZW50UHJvdmlkZXIgPSB0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCB0aGlzKTsKLQkJaWYgKGl0ZW1Db250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJdGhpcy5pdGVtQ29udGVudFByb3ZpZGVycy5wdXQoaXRlbSwgaXRlbUNvbnRlbnRQcm92aWRlcik7Ci0JCXJldHVybiBpdGVtQ29udGVudFByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlbUxhYmVsUHJvdmlkZXIgaXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0pIHsKLQkJaWYgKHRoaXMudmlld2VyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0JCQkJCSJUaGlzIHByb3ZpZGVyIG11c3QgYmUgdXNlZCBhcyBhIGNvbnRlbnQiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkicHJvdmlkZXIgKmFzIHdlbGwgYXMqIGEgbGFiZWwgcHJvdmlkZXIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJdGVtTGFiZWxQcm92aWRlciBpdGVtTGFiZWxQcm92aWRlciA9IHRoaXMuaXRlbUxhYmVsUHJvdmlkZXJzLmdldChpdGVtKTsKLQkJaWYgKGl0ZW1MYWJlbFByb3ZpZGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBpdGVtTGFiZWxQcm92aWRlcjsKLQkJfQotCQlpdGVtTGFiZWxQcm92aWRlciA9IHRoaXMuaXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoaXRlbSwgdGhpcyk7Ci0JCWlmIChpdGVtTGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl0aGlzLml0ZW1MYWJlbFByb3ZpZGVycy5wdXQoaXRlbSwgaXRlbUxhYmVsUHJvdmlkZXIpOwotCQlyZXR1cm4gaXRlbUxhYmVsUHJvdmlkZXI7Ci0JfQotCQotCQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCXJldHVybiBpdGVtQ29udGVudFByb3ZpZGVyKGlucHV0RWxlbWVudCkuZ2V0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyIHByb3ZpZGVyID0gaXRlbUxhYmVsUHJvdmlkZXIoZWxlbWVudCk7Ci0JCXJldHVybiAocHJvdmlkZXIgPT0gbnVsbCkgPyBudWxsIDpwcm92aWRlci5nZXRJbWFnZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJSXRlbUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBwcm92aWRlci5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IGVsZW1lbnQpIHsKLQkJSXRlbUxhYmVsUHJvdmlkZXIgcHJvdmlkZXIgPSBpdGVtTGFiZWxQcm92aWRlcihlbGVtZW50KTsKLQkJcmV0dXJuIChwcm92aWRlciA9PSBudWxsKSA/IG51bGwgOiBwcm92aWRlci5nZXREZXNjcmlwdGlvbigpOwotCX0KLQkKLQkvKioKLQkgKiBEaXNwb3NlcyBhbGwgaXRlbXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlkaXNwb3NlUHJvdmlkZXJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNwb3NlUHJvdmlkZXJzKCkgewotCQkvLyBjb2RlZCB0aGlzIHdheSB0byBhbGxvdyBzb21lIGl0ZW0gcHJvdmlkZXJzIHRvIGRpc3Bvc2Ugb2YgdGhlaXIgY2hpbGQgCi0JCS8vIGVsZW1lbnRzIHdpdGhvdXQgZGlzcnVwdGluZyB0aGUgZW50aXJlIHByb2Nlc3MKLQkJd2hpbGUgKCEgdGhpcy5pdGVtQ29udGVudFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWRpc3Bvc2UodGhpcy5pdGVtQ29udGVudFByb3ZpZGVycy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQkJLy8gdGhpcyBjYXRjaGVzIGFueSBpdGVtcyB0aGF0IHdlcmVuJ3QgZGlzcG9zZWQgZnJvbSB0aGUgY29udGVudCBwcm92aWRlcnMsCi0JCS8vIHRob3VnaCB0aGVyZSBtb3N0IGxpa2VseSB3b24ndCBiZSBhbnkgaXRlbXMgcmVwcmVzZW50ZWQgaGVyZSB0aGF0IAotCQkvLyBoYXZlbid0IGFscmVhZHkgYmVlbiBkaXNwb3NlZAotCQl3aGlsZSAoISB0aGlzLml0ZW1MYWJlbFByb3ZpZGVycy5pc0VtcHR5KCkpIHsKLQkJCWRpc3Bvc2UodGhpcy5pdGVtTGFiZWxQcm92aWRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIERpc3Bvc2VzIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKE9iamVjdCBpdGVtKSB7Ci0JCWlmICh0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzLmNvbnRhaW5zS2V5KGl0ZW0pKSB7Ci0JCQl0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzLmdldChpdGVtKS5kaXNwb3NlKCk7Ci0JCQl0aGlzLml0ZW1Db250ZW50UHJvdmlkZXJzLnJlbW92ZShpdGVtKTsKLQkJfQotCQlpZiAodGhpcy5pdGVtTGFiZWxQcm92aWRlcnMuY29udGFpbnNLZXkoaXRlbSkpIHsKLQkJCXRoaXMuaXRlbUxhYmVsUHJvdmlkZXJzLmdldChpdGVtKS5kaXNwb3NlKCk7Ci0JCQl0aGlzLml0ZW1MYWJlbFByb3ZpZGVycy5yZW1vdmUoaXRlbSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAob2xkSW5wdXQgIT0gbmV3SW5wdXQpIHsKLQkJCWRpc3Bvc2VQcm92aWRlcnMoKTsKLQkJfQotCQl0aGlzLnZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBzdHJ1Y3R1cmVkVmlld2VyOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGUgdGhlIGNvbnRlbnQgZm9yIHRoZSBnaXZlbiBpdGVtCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlQ29udGVudChmaW5hbCBPYmplY3QgaXRlbSkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaChpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWlmICghdmlld2VySXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JLy8gb3BlbiB1cCB2aXNpYmlsaXR5IGEgYml0IGZvciBpbm5lciBjbGFzc2VzCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUxhYmVsUHJvdmlkZXJDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGl0ZW0KLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVMYWJlbChmaW5hbCBPYmplY3QgaXRlbSkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAodmlld2VyICE9IG51bGwgJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQlmaXJlTGFiZWxQcm92aWRlckNoYW5nZWQobmV3IExhYmVsUHJvdmlkZXJDaGFuZ2VkRXZlbnQoRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLnRoaXMsIGl0ZW0pKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWlmICghdmlld2VySXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLnZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlld2VySXNEaXNwb3NlZCgpIHsKLQkJcmV0dXJuIHRoaXMudmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjIxMjA2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLS8qKgotICogTWFya2VyIGludGVyZmFjZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRGVsZWdhdGluZ0NvbnRlbnRQcm92aWRlciB0byByZXR1cm4gCi0gKiBjb250ZW50IGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgaXRlbS4KLSAqIEBzZWUgRGVsZWdhdGluZ0NvbnRlbnRQcm92aWRlcgotICogQHNlZSBJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVtQ29udGVudFByb3ZpZGVyCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50cyBvZiB0aGUgcmVwcmVzZW50ZWQgaXRlbS4KLQkgKiBOb3RlIHRoYXQgd2hlbiB0aGlzIGlzIGNhbGxlZCwgdGhlIHJlcHJlc2VudGVkIGl0ZW0gaXMgYW4gaW5wdXQgZWxlbWVudC4KLQkgKi8KLQlPYmplY3RbXSBnZXRFbGVtZW50cygpOwotCQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhpcyBjb250ZW50IHByb3ZpZGVyLCBjbGVhbmluZyB1cCBhbGwgcmVmZXJlbmNlcywgbGlzdGVuZXJzLCBldGMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL0l0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Yzk1MWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLS8qKgotICogRmFjdG9yeSBpbnRlcmZhY2UgdXNlZCB0byBkZXNjcmliZSBob3cgdG8gYnVpbGQge0BsaW5rIEl0ZW1Db250ZW50UHJvdmlkZXJ9cwotICogZm9yIGEge0BsaW5rIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcn0KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSwgCi0JCQlEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTJhOGE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXIgdG8gcmV0dXJuIAotICogbGFiZWwgaW5mb3JtYXRpb24gZm9yIGEgcGFydGljdWxhciBpdGVtLgotICogQHNlZSBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlcgotICogQHNlZSBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSXRlbUxhYmVsUHJvdmlkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltYWdlIGZvciB0aGUgaXRlbQotCSAqLwotCUltYWdlIGdldEltYWdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IGZvciB0aGUgaXRlbQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBpdGVtCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhpcyBsYWJlbCBwcm92aWRlciwgY2xlYW5pbmcgdXAgYWxsIHJlZmVyZW5jZXMsIGxpc3RlbmVycywgZXRjLgotCSAqLwotCXZvaWQgZGlzcG9zZSgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNjFiMzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlOwotCi0vKioKLSAqIEZhY3RvcnkgaW50ZXJmYWNlIHVzZWQgdG8gZGVzY3JpYmUgaG93IHRvIGJ1aWxkIElJdGVtTGFiZWxQcm92aWRlcnMKLSAqIGZvciBhIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQlJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKE9iamVjdCBpdGVtLCAKLQkJCURlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlOTc4ZjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS9qZmFjZS9UcmVlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlciB0byByZXR1cm4gCi0gKiB0cmVlIGluZm9ybWF0aW9uIGZvciBhIHBhcnRpY3VsYXIgaXRlbS4KLSAqIEBzZWUgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXIKLSAqIEBzZWUgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgSXRlbUNvbnRlbnRQcm92aWRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgcGFyZW50IG9mIHRoZSByZXByZXNlbnRlZCBpdGVtCi0JICovCi0JT2JqZWN0IGdldFBhcmVudCgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZXByZXNlbnRlZCBpdGVtIGhhcyBjaGlsZHJlbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hpbGRyZW4oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoaWxkcmVuIG9mIHRoZSByZXByZXNlbnRlZCBpdGVtCi0JICovCi0JT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL2pmYWNlL1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTNhNzM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvamZhY2UvVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZTsKLQotLyoqCi0gKiBFeHRlbnNpb24gb2Yge0BsaW5rIEl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5fSB0aGF0IGV4dGVuZHMgZnVuY3Rpb25hbGl0eQotICogZm9yIHRyZWUgY29udGVudAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIAotCQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8uY2xhc3NwYXRoIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5jdnNpZ25vcmUgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5wcm9qZWN0IGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmU2ZTU3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1MzE0Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDY6NTEgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzM2Y0YmIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLURhbGktQ29tbWVudDogKk5PKiBFY2xpcHNlTGluayBmcmllbmRzIQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4iLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWksCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIudWksCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotICAgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsCi0gICBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSwKLSAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4sCi0gICBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLAotICAgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4iLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycwpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L2Fib3V0Lmh0bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI0NDY1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L2NvbXBvbmVudC54bWwgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBjM2E1MC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTNjZDQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gVXRpbGl0eQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvQ29tbWFuZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWQzNWZiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFNpbXBsZSBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyB0aGUgR09GIENvbW1hbmQgZGVzaWduIHBhdHRlcm4sCi0gKiBhbmQgaXQgZG9lc24ndCBjYXJyeSB0aGUgYmFnZ2FnZSBvZiB7QGxpbmsgamF2YS5sYW5nLlJ1bm5hYmxlfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZAotCWV4dGVuZHMgSW50ZXJydXB0aWJsZUNvbW1hbmQKLXsKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjb21tYW5kLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBjb21tYW5kCi0JICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuCi0JICovCi0Jdm9pZCBleGVjdXRlKCk7Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvIG5vdGhpbmcKLQkgKiB3aGVuIGV4ZWN1dGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIE51bGwKLQkJaW1wbGVtZW50cyBDb21tYW5kLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tbWFuZCBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQgaW50ZXJmYWNlIHRoYXQgd2lsbCB0aHJvdyBhbgotCSAqIGV4Y2VwdGlvbiB3aGVuIGV4ZWN1dGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIERpc2FibGVkCi0JCWltcGxlbWVudHMgQ29tbWFuZCwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJcHVibGljIHN0YXRpYyBDb21tYW5kIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9Db21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0NvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2E4ZWE0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0NvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgdG8gY29udHJvbCBob3cgYSBjb21tYW5kIGlzIGV4ZWN1dGVkLgotICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgc2VydmVyIHByb3ZpZGVzIHRoZSBjb21tYW5kIGJ1dCB0aGUgY2xpZW50IHByb3ZpZGVzCi0gKiB0aGUgY29udGV4dCAoZS5nLiB0aGUgY2xpZW50IHdvdWxkIGxpa2UgdG8gZGlzcGF0Y2ggdGhlIGNvbW1hbmQgdG8gdGhlIFVJCi0gKiB0aHJlYWQpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tYW5kRXhlY3V0b3IgewotCi0JLyoqCi0JICogRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICovCi0Jdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCk7Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tbWFuZCBleGVjdXRvciBpbnRlcmZhY2UKLQkgKiB0aGF0IHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCB3aXRob3V0IGFueSBzb3J0IG9mIGVuaGFuY2VtZW50LgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQKLQkJaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDb21tYW5kRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlwdWJsaWMgc3RhdGljIENvbW1hbmRFeGVjdXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ZpbHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNTA5ZjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gZmlsdGVyIG9iamVjdHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIG9iamVjdHMgdG8gYmUgZmlsdGVyZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBGaWx0ZXI8VD4gewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiBmaWx0ZXIuIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JYm9vbGVhbiBhY2NlcHQoVCBvKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmaWx0ZXIgaW50ZXJmYWNlIHRoYXQgYWNjZXB0cyBhbGwgdGhlCi0JICogb2JqZWN0cyAoaS5lLiBpdCBkb2VzIG5vIGZpbHRlcmluZykuCi0JICovCi0JZmluYWwgY2xhc3MgTnVsbDxTPgotCQlpbXBsZW1lbnRzIEZpbHRlcjxTPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbHRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIG5vdGhpbmcgaXMgZmlsdGVyZWQgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZmlsdGVyIGludGVyZmFjZSB0aGF0IGFjY2VwdHMgbm9uZSBvZiB0aGUKLQkgKiBvYmplY3RzIChpLmUuIGl0IGZpbHRlcnMgb3V0IGFsbCB0aGUgb2JqZWN0cykuCi0JICovCi0JZmluYWwgY2xhc3MgT3BhcXVlPFM+Ci0JCWltcGxlbWVudHMgRmlsdGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IE9wYXF1ZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBPcGFxdWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQgLSBub3RoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTIG8pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpbHRlciBpbnRlcmZhY2UgdGhhdCB0aHJvd3MgYW4gZXhjZXB0aW9uCi0JICogaWYgY2FsbGVkLgotCSAqLwotCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+Ci0JCWltcGxlbWVudHMgRmlsdGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyIElOU1RBTkNFID0gbmV3IERpc2FibGVkKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0luZGVudGluZ1ByaW50V3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjQxYWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvSW5kZW50aW5nUHJpbnRXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBQcmludFdyaXRlcn0gdG8gYXV0b21hdGljYWxseSBpbmRlbnQgbmV3IGxpbmVzLgotICovCi1wdWJsaWMgY2xhc3MgSW5kZW50aW5nUHJpbnRXcml0ZXIKLQlleHRlbmRzIFByaW50V3JpdGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW5kZW50OwotCXByaXZhdGUgaW50IGluZGVudExldmVsOwotCXByaXZhdGUgYm9vbGVhbiBuZWVkc0luZGVudDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFRkFVTFRfSU5ERU5UID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0ZXIgdGhhdCBpbmRlbnRzIHdpdGggdGFicy4KLQkgKi8KLQlwdWJsaWMgSW5kZW50aW5nUHJpbnRXcml0ZXIoV3JpdGVyIG91dCkgewotCQl0aGlzKG91dCwgREVGQVVMVF9JTkRFTlQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHdyaXRlciB0aGF0IGluZGVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKi8KLQlwdWJsaWMgSW5kZW50aW5nUHJpbnRXcml0ZXIoV3JpdGVyIG91dCwgU3RyaW5nIGluZGVudCkgewotCQlzdXBlcihvdXQpOwotCQl0aGlzLmluZGVudCA9IGluZGVudDsKLQkJdGhpcy5pbmRlbnRMZXZlbCA9IDA7Ci0JCXRoaXMubmVlZHNJbmRlbnQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFNldCBmbGFnIHNvIGZvbGxvd2luZyBsaW5lIGlzIGluZGVudGVkLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50bG4oKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQlzdXBlci5wcmludGxuKCk7Ci0JCQl0aGlzLm5lZWRzSW5kZW50ID0gdHJ1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByaW50IHRoZSBhcHByb3ByaWF0ZSBpbmRlbnQuCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByaW50SW5kZW50KCkgewotCQlpZiAodGhpcy5uZWVkc0luZGVudCkgewotCQkJdGhpcy5uZWVkc0luZGVudCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IHRoaXMuaW5kZW50TGV2ZWw7IGktLSA+IDA7ICkgewotCQkJCXRoaXMucHJpbnQodGhpcy5pbmRlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBwb3J0aW9uIG9mIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoY2hhciBidWZbXSwgaW50IG9mZiwgaW50IGxlbikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5wcmludEluZGVudCgpOwotCQkJc3VwZXIud3JpdGUoYnVmLCBvZmYsIGxlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLmxvY2spIHsKLQkJCXRoaXMucHJpbnRJbmRlbnQoKTsKLQkJCXN1cGVyLndyaXRlKGMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogV3JpdGUgYSBwb3J0aW9uIG9mIGEgc3RyaW5nLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHdyaXRlKFN0cmluZyBzLCBpbnQgb2ZmLCBpbnQgbGVuKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLnByaW50SW5kZW50KCk7Ci0JCQlzdXBlci53cml0ZShzLCBvZmYsIGxlbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCdW1wIHRoZSBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIHZvaWQgaW5kZW50KCkgewotCQl0aGlzLmluY3JlbWVudEluZGVudExldmVsKCk7Ci0JfQotCi0JLyoqCi0JICogRGVjcmVtZW50IHRoZSBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIHZvaWQgdW5kZW50KCkgewotCQl0aGlzLmRlY3JlbWVudEluZGVudExldmVsKCk7Ci0JfQotCi0JLyoqCi0JICogQnVtcCB0aGUgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyB2b2lkIGluY3JlbWVudEluZGVudExldmVsKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubG9jaykgewotCQkJdGhpcy5pbmRlbnRMZXZlbCsrOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVjcmVtZW50IHRoZSBpbmRlbnQgbGV2ZWwuCi0JICovCi0JcHVibGljIHZvaWQgZGVjcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQl0aGlzLmluZGVudExldmVsLS07Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZW50TGV2ZWwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQlyZXR1cm4gdGhpcy5pbmRlbnRMZXZlbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93IHRoZSBpbmRlbnQgbGV2ZWwgdG8gYmUgc2V0IGRpcmVjdGx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgaW5kZW50IGxldmVsLgotCSAqLwotCXB1YmxpYyBpbnQgc2V0SW5kZW50TGV2ZWwoaW50IGluZGVudExldmVsKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5sb2NrKSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5pbmRlbnRMZXZlbDsKLQkJCXRoaXMuaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbDsKLQkJCXJldHVybiBvbGQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ludGVycnVwdGlibGVDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9JbnRlcnJ1cHRpYmxlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODUzNTAwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ludGVycnVwdGlibGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBTaW1wbGUgaW50ZXJmYWNlIGZvciBpbXBsZW1lbnRpbmcgdGhlIEdPRiBDb21tYW5kIGRlc2lnbiBwYXR0ZXJuCi0gKiBhbmQgYWxsb3dzIGZvciB0aGUgY29tbWFuZCB0byB0aHJvdyBhbiB7QGxpbmsgSW50ZXJydXB0ZWRFeGNlcHRpb259LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEludGVycnVwdGlibGVDb21tYW5kIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIGNvbW1hbmQuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGNvbW1hbmQKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KLQkgKi8KLQl2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJydXB0aWJsZSBjb21tYW5kIGludGVyZmFjZSB0aGF0Ci0JICogd2lsbCB0aHJvdyBhbiBpbnRlcnJ1cHRlZCBleGNlcHRpb24gd2hlbiBleGVjdXRlZC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBJbnRlcnJ1cHRlZAotCQlpbXBsZW1lbnRzIEludGVycnVwdGlibGVDb21tYW5kLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZXJydXB0aWJsZUNvbW1hbmQgSU5TVEFOQ0UgPSBuZXcgSW50ZXJydXB0ZWQoKTsKLQkJcHVibGljIHN0YXRpYyBJbnRlcnJ1cHRpYmxlQ29tbWFuZCBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgSW50ZXJydXB0ZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ludGVycnVwdGlibGVDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L0ludGVycnVwdGlibGVDb21tYW5kRXhlY3V0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxMTY0Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9JbnRlcnJ1cHRpYmxlQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY2xpZW50cyB0byBjb250cm9sIGhvdyBhbiBpbnRlcnJ1cHRpYmxlIGNvbW1hbmQgaXMgZXhlY3V0ZWQuCi0gKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSBzZXJ2ZXIgcHJvdmlkZXMgdGhlIGNvbW1hbmQgYnV0IHRoZSBjbGllbnQgcHJvdmlkZXMKLSAqIHRoZSBjb250ZXh0IChlLmcuIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byBkaXNwYXRjaCB0aGUgY29tbWFuZCB0byB0aGUgVUkKLSAqIHRocmVhZCkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3IKLSAqLwotcHVibGljIGludGVyZmFjZSBJbnRlcnJ1cHRpYmxlQ29tbWFuZEV4ZWN1dG9yIHsKLQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqLwotCXZvaWQgZXhlY3V0ZShJbnRlcnJ1cHRpYmxlQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW50ZXJydXB0aWJsZSBjb21tYW5kIGV4ZWN1dG9yIGludGVyZmFjZQotCSAqIHRoYXQgc2ltcGx5IGV4ZWN1dGVzIHRoZSBjb21tYW5kIHdpdGhvdXQgYW55IHNvcnQgb2YgZW5oYW5jZW1lbnQuCi0JICovCi0JZmluYWwgY2xhc3MgRGVmYXVsdAotCQlpbXBsZW1lbnRzIEludGVycnVwdGlibGVDb21tYW5kRXhlY3V0b3IsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlcnJ1cHRpYmxlQ29tbWFuZEV4ZWN1dG9yIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBJbnRlcnJ1cHRpYmxlQ29tbWFuZEV4ZWN1dG9yIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBleGVjdXRlKEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9KYXZhVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIwMTlkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9KYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZXMgYSBKYXZhIHR5cGU7IGkuZS4gaXRzICJlbGVtZW50IHR5cGUiCi0gKiBhbmQgaXRzICJhcnJheSBkZXB0aCIuIFRoZSBlbGVtZW50IHR5cGUgaXMgcmVmZXJlbmNlZCBieSBuYW1lLAotICogYWxsb3dpbmcgdXMgdG8gcmVmZXJlbmNlIGNsYXNzZXMgdGhhdCBhcmUgbm90IChvciBjYW5ub3QgYmUpIGxvYWRlZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFUeXBlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSdzICJlbGVtZW50IHR5cGUiLgotCSAqIEEgbWVtYmVyIHR5cGUgd2lsbCBoYXZlIG9uZSBvciBtb3JlIDxjb2RlPickJzwvY29kZT4gY2hhcmFjdGVycyBpbiBpdHMgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyAiYXJyYXkgZGVwdGgiLgotCSAqLwotCWludCBnZXRBcnJheURlcHRoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhbiBhcnJheSAoaS5lLiBpdHMgImFycmF5IGRlcHRoIiBpcyBncmVhdGVyCi0JICogdGhhbiB6ZXJvKS4KLQkgKi8KLQlib29sZWFuIGlzQXJyYXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInByaW1pdGl2ZSIgKGUuZy4gPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+ZmxvYXQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzUHJpbWl0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhICJwcmltaXRpdmUgd3JhcHBlciIgKGUuZy4ge0BsaW5rIGphdmEubGFuZy5JbnRlZ2VyfSwKLQkgKiB7QGxpbmsgamF2YS5sYW5nLkZsb2F0fSkuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JYm9vbGVhbiBpc1ByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInZhcmlhYmxlIHByaW1pdGl2ZSIgKGUuZy4gPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+ZmxvYXQ8L2NvZGU+LAotCSAqIGJ1dCBub3QgPGNvZGU+dm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IHZhcmlhYmxlcyBjYW5ub3QgYmUgZGVjbGFyZWQgPGNvZGU+dm9pZDwvY29kZT4KLQkgKi8KLQlib29sZWFuIGlzVmFyaWFibGVQcmltaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGlzIGEgInZhcmlhYmxlIHByaW1pdGl2ZSB3cmFwcGVyIiAoZS5nLgotCSAqIHtAbGluayBqYXZhLmxhbmcuSW50ZWdlcn0sIHtAbGluayBqYXZhLmxhbmcuRmxvYXR9LAotCSAqIGJ1dCBub3Qge0BsaW5rIGphdmEubGFuZy5Wb2lkfSkuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gdmFyaWFibGVzIGNhbm5vdCBiZSBkZWNsYXJlZCA8Y29kZT52b2lkPC9jb2RlPgotCSAqLwotCWJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSdzIGVsZW1lbnQgdHlwZSBhbmQgYXJyYXkgZGVwdGguCi0JICovCi0JQ2xhc3M8Pz4gZ2V0SmF2YUNsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgbWF0Y2hlcyB0aGF0Ci0JICogcmV0dXJuZWQgYnkge0BsaW5rIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCl9Ci0JICogKGUuZy4gPGNvZGU+IltbSiI8L2NvZGU+LCA8Y29kZT4iW0xqYXZhLmxhbmcuT2JqZWN0OyI8L2NvZGU+LAotCSAqIDxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4pLgotCSAqLwotCVN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyRWxlbWVudFR5cGVOYW1lLCBpbnQgb3RoZXJBcnJheURlcHRoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0eXBlIGRlc2NyaWJlcyB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBkZXNjcmliZXMoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBkZXNjcmliZXMgdG8gdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCWJvb2xlYW4gZGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoSmF2YVR5cGUgb3RoZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIGluIHNvdXJjZSBjb2RlOjx1bD4KLQkgKiA8bGk+PGNvZGU+IltbSiI8L2NvZGU+ID0+IDxjb2RlPiJsb25nW11bXSI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhLnV0aWwuTWFwJEVudHJ5IjwvY29kZT4gPT4gPGNvZGU+ImphdmEudXRpbC5NYXAuRW50cnkiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JU3RyaW5nIGRlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHZlcnNpb24gb2YgdGhlIHR5cGUncyBuYW1lIHRoYXQgY2FuIGJlIHVzZWQgaW4gc291cmNlIGNvZGU6PHVsPgotCSAqIDxsaT48Y29kZT4iW1tKIjwvY29kZT4gPT4gPGNvZGU+ImxvbmdbXVtdIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEudXRpbC5NYXAkRW50cnkiPC9jb2RlPiA9PiA8Y29kZT4iamF2YS51dGlsLk1hcC5FbnRyeSI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQl2b2lkIGFwcGVuZERlY2xhcmF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSdzIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiBzb3VyY2UgY29kZTo8dWw+Ci0JICogPGxpPjxjb2RlPiJbW0oiPC9jb2RlPiA9PiA8Y29kZT4ibG9uZ1tdW10iPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS51dGlsLk1hcCRFbnRyeSI8L2NvZGU+ID0+IDxjb2RlPiJqYXZhLnV0aWwuTWFwLkVudHJ5IjwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCXZvaWQgcHJpbnREZWNsYXJhdGlvbk9uKFByaW50V3JpdGVyIHB3KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9NZXRob2RTaWduYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJlNzkzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9NZXRob2RTaWduYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVzY3JpYmVzIGEgSmF2YSBtZXRob2Qgc2lnbmF0dXJlOyBpLmUuIGl0cyAibmFtZSIKLSAqIGFuZCBpdHMgInBhcmFtZXRlciB0eXBlcyIuIFRoZSBwYXJhbWV0ZXIgdHlwZXMgYXJlIHJlZmVyZW5jZWQgYnkgbmFtZSwKLSAqIGFsbG93aW5nIHVzIHRvIHJlZmVyZW5jZSBjbGFzc2VzIHRoYXQgYXJlIG5vdCAob3IgY2Fubm90IGJlKSBsb2FkZWQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRob2RTaWduYXR1cmUgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRob2QncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1ldGhvZCdzIHBhcmFtZXRlciB0eXBlcy4KLQkgKi8KLQlKYXZhVHlwZVtdIGdldFBhcmFtZXRlclR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIHNpZ25hdHVyZSBkZXNjcmliZXMgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JYm9vbGVhbiBkZXNjcmliZXMoTWV0aG9kIG1ldGhvZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIHNpZ25hdHVyZSBlcXVhbHMgdGhlIHNwZWNpZmllZCBzaWduYXR1cmUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyTmFtZSwgSmF2YVR5cGVbXSBvdGhlclBhcmFtZXRlclR5cGVzKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGVxdWFscyB0aGUgc3BlY2lmaWVkIHNpZ25hdHVyZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhNZXRob2RTaWduYXR1cmUgb3RoZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXRob2QncyBzaWduYXR1cmU6PHA+Ci0JICogPGNvZGU+ImZvbyhpbnQsIGphdmEubGFuZy5TdHJpbmcpIjwvY29kZT4KLQkgKi8KLQlTdHJpbmcgZ2V0U2lnbmF0dXJlKCk7Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZTo8cD4KLQkgKiA8Y29kZT4iZm9vKGludCwgamF2YS5sYW5nLlN0cmluZykiPC9jb2RlPgotCSAqLwotCXZvaWQgYXBwZW5kU2lnbmF0dXJlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0KLQkvKioKLQkgKiBQcmludCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWV0aG9kJ3Mgc2lnbmF0dXJlOjxwPgotCSAqIDxjb2RlPiJmb28oaW50LCBqYXZhLmxhbmcuU3RyaW5nKSI8L2NvZGU+Ci0JICovCi0Jdm9pZCBwcmludFNpZ25hdHVyZU9uKFByaW50V3JpdGVyIHB3KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvT2JqZWN0UmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9PYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxYzJjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9PYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5OwotCi0vKioKLSAqIFByb3ZpZGUgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlIHJlY2lwaWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBPYmplY3RSZWZlcmVuY2U8Vj4KLQlleHRlbmRzIFJlYWRPbmx5T2JqZWN0UmVmZXJlbmNlPFY+Ci17Ci0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCVYgc2V0VmFsdWUoViB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JViBzZXROdWxsKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9SZWFkT25seU9iamVjdFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvUmVhZE9ubHlPYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjNGZmNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9SZWFkT25seU9iamVjdFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7Ci0KLS8qKgotICogUHJvdmlkZSBhIGNvbnRhaW5lciBmb3IgaG9sZGluZyBhbiBvYmplY3QgdGhhdCBjYW5ub3QgYmUgY2hhbmdlZC4KLSAqIAotICogQHNlZSBPYmplY3RSZWZlcmVuY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seU9iamVjdFJlZmVyZW5jZTxWPgotewotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlWIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHZhbHVlTm90RXF1YWwoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlib29sZWFuIGlzTnVsbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gaXNOb3ROdWxsKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BYnN0cmFjdEFzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NGQ5NWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQWJzdHJhY3RBc3NvY2lhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogSW1wbGVtZW50IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4ge0BsaW5rIEFzc29jaWF0aW9ufSB0aGF0IGNhbgotICogYmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgbWV0aG9kcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXNzb2NpYXRpb248SywgVj4KLQlpbXBsZW1lbnRzIEFzc29jaWF0aW9uPEssIFY+Ci17Ci0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RBc3NvY2lhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIEFzc29jaWF0aW9uPD8sID8+KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUFzc29jaWF0aW9uPD8sID8+IG90aGVyID0gKEFzc29jaWF0aW9uPD8sID8+KSBvOwotCQlyZXR1cm4gdGhpcy5rZXlFcXVhbHMob3RoZXIpICYmIHRoaXMudmFsdWVFcXVhbHMob3RoZXIpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGtleUVxdWFscyhBc3NvY2lhdGlvbjw/LCA/PiBvdGhlcikgewotCQlPYmplY3Qga2V5ID0gdGhpcy5nZXRLZXkoKTsKLQkJcmV0dXJuIChrZXkgPT0gbnVsbCkgPwotCQkJCShvdGhlci5nZXRLZXkoKSA9PSBudWxsKSA6Ci0JCQkJa2V5LmVxdWFscyhvdGhlci5nZXRLZXkoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsdWVFcXVhbHMoQXNzb2NpYXRpb248PywgPz4gb3RoZXIpIHsKLQkJT2JqZWN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8KLQkJCQkob3RoZXIuZ2V0VmFsdWUoKSA9PSBudWxsKSA6Ci0JCQkJdmFsdWUuZXF1YWxzKG90aGVyLmdldFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5rZXlIYXNoQ29kZSgpIF4gdGhpcy52YWx1ZUhhc2hDb2RlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBrZXlIYXNoQ29kZSgpIHsKLQkJT2JqZWN0IGtleSA9IHRoaXMuZ2V0S2V5KCk7Ci0JCXJldHVybiAoa2V5ID09IG51bGwpID8gMCA6IGtleS5oYXNoQ29kZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgdmFsdWVIYXNoQ29kZSgpIHsKLQkJT2JqZWN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gMCA6IHZhbHVlLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldEtleSgpICsgIiA9PiAiICsgdGhpcy5nZXRWYWx1ZSgpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BcnJheVRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9BcnJheVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMTUyMDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXJyYXlUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBBcnJheS1yZWxhdGVkIHV0aWxpdHkgbWV0aG9kcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFycmF5VG9vbHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfT0JKRUNUX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXJbXSBFTVBUWV9DSEFSX0FSUkFZID0gbmV3IGNoYXJbMF07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnRbXSBFTVBUWV9JTlRfQVJSQVkgPSBuZXcgaW50WzBdOwotCi0JLy8gKioqKioqKioqKiBpbnN0YW50aWF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB3aXRoIHRoZSBzYW1lIGxlbmd0aAotCSAqIGFuZCB0aGUgc2FtZSBjb21wb25lbnQgdHlwZSBhcyB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5uZXdBcnJheShPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG5ld0FycmF5KEVbXSBhcnJheSkgewotCQlyZXR1cm4gbmV3QXJyYXkoYXJyYXksIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGgKLQkgKiBhbmQgdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubmV3QXJyYXkoT2JqZWN0W10gYXJyYXksIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBuZXdBcnJheShFW10gYXJyYXksIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ld0FycmF5KGNvbXBvbmVudFR5cGUoYXJyYXkpLCBsZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFycmF5J3MgY29tcG9uZW50IHR5cGUsIHdpdGggYXBwcm9wcmlhdGUgc3VwcG9ydAotCSAqIGZvciBnZW5lcmljcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBDbGFzczw/IGV4dGVuZHMgRT4gY29tcG9uZW50VHlwZShFW10gYXJyYXkpIHsKLQkJQ2xhc3M8Pz4gcmF3Q29tcG9uZW50VHlwZSA9IGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQ2xhc3M8PyBleHRlbmRzIEU+IGNvbXBvbmVudFR5cGUgPSAoQ2xhc3M8PyBleHRlbmRzIEU+KSByYXdDb21wb25lbnRUeXBlOwotCQlyZXR1cm4gY29tcG9uZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCB0eXBlIGFuZCBsZW5ndGgsCi0JICogd2l0aCBhcHByb3ByaWF0ZSBzdXBwb3J0IGZvciBnZW5lcmljcy4gVGhlIGNvbXBvbmVudCB0eXBlIGNhbm5vdCBiZSBhCi0JICogcHJpbWl0aXZlIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG5ld0FycmF5KENsYXNzPD8gZXh0ZW5kcyBFPiBjb21wb25lbnRUeXBlLCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChjb21wb25lbnRUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFycmF5IGNsYXNzIGNhbm5vdCBiZSBwcmltaXRpdmU6ICIgKyBjb21wb25lbnRUeXBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuZXdBcnJheV8oY29tcG9uZW50VHlwZSwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGNvbXBvbmVudCB0eXBlIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gbmV3QXJyYXlfKENsYXNzPD8gZXh0ZW5kcyBFPiBjb21wb25lbnRUeXBlLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiAoRVtdKSAoKGNvbXBvbmVudFR5cGUgPT0gT0JKRUNUX0NMQVNTKSA/Ci0JCQkJbmV3IE9iamVjdFtsZW5ndGhdIDoKLQkJCQlBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBsZW5ndGgpKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8T2JqZWN0PiBPQkpFQ1RfQ0xBU1MgPSBPYmplY3QuY2xhc3M7Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvQXJyYXkoKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvQXJyYXkoKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3RbXSBhcnJheShJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgaXRlcmFibGUgZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoZSBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0FycmF5KE9iamVjdFtdKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGFycmF5KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGlzIHRoYXQgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBJZiB0aGUgaXRlcmFibGUgZml0cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LCBpdCBpcyByZXR1cm5lZCB0aGVyZWluLgotCSAqIE90aGVyd2lzZSwgYSBuZXcgYXJyYXkgaXMgYWxsb2NhdGVkIHdpdGggdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYW5kIHRoZSBzaXplIG9mIHRoZSBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnRvQXJyYXkoT2JqZWN0W10pPC9jb2RlPgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhcnJheShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIEVbXSBhcnJheSkgewotCQlyZXR1cm4gYXJyYXkoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IpLnRvQXJyYXkoKSA6Ci0JCQkJRU1QVFlfT0JKRUNUX0FSUkFZOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0FycmF5KCk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gYXJyYXkoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkudG9BcnJheSgpIDoKLQkJCQlFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhdG9yIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IudG9BcnJheShPYmplY3RbXSk8L2NvZGU+Ci0JICogQHNlZSBDb2xsZWN0aW9uI3RvQXJyYXkoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFycmF5KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRVtdIGFycmF5KSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yKS50b0FycmF5KGFycmF5KSA6Ci0JCQkJZW1wdHlBcnJheShhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcyB0aGF0IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogSWYgdGhlIGl0ZXJhdG9yIGZpdHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheSwgaXQgaXMgcmV0dXJuZWQgdGhlcmVpbi4KLQkgKiBPdGhlcndpc2UsIGEgbmV3IGFycmF5IGlzIGFsbG9jYXRlZCB3aXRoIHRoZSBydW50aW1lIHR5cGUgb2YgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGFuZCB0aGUgc2l6ZSBvZiB0aGUgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0FycmF5KE9iamVjdFtdKTwvY29kZT4KLQkgKiBAc2VlIENvbGxlY3Rpb24jdG9BcnJheShPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYXJyYXkoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBFW10gYXJyYXkpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSkudG9BcnJheShhcnJheSkgOgotCQkJCWVtcHR5QXJyYXkoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMgZW1wdHksIHJldHVybiBpdDsKLQkgKiBvdGhlcndpc2UsIHNldCBpdHMgZmlyc3QgZWxlbWVudCB0byBudWxsLgotCSAqIEBzZWUgQ29sbGVjdGlvbiN0b0FycmF5KE9iamVjdFtdKQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gZW1wdHlBcnJheShFW10gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBhcnJheSA6IGNsZWFyRmlyc3QoYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGFycmF5J3MgZmlyc3QgZWxlbWVudCB0byBudWxsIGFuZCBhbmQgcmV0dXJuIHRoZSBhcnJheS4KLQkgKiBBc3N1bWUgdGhlIGFycmF5IGxlbmd0aCA+IDAuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBjbGVhckZpcnN0KEVbXSBhcnJheSkgewotCQlhcnJheVswXSA9IG51bGw7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYmUgYWRkZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGQoRVtdIGFycmF5LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuICsgMSk7Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkKEVbXSBhcnJheSwgaW50IGluZGV4LCBFIHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuICsgMSk7Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGluZGV4IDwgbGVuKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gYWRkKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCWlmIChsZW4gPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGxlbik7Ci0JCX0KLQkJcmVzdWx0W2xlbl0gPSB2YWx1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZChjaGFyW10gYXJyYXksIGludCBpbmRleCwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuICsgMV07Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCXJlc3VsdFtpbmRleF0gPSB2YWx1ZTsKLQkJaWYgKGluZGV4IDwgbGVuKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgcmVzdWx0LCBpbmRleCArIDEsIGxlbiAtIGluZGV4KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBiZSBhZGRlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtsZW4gKyAxXTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgbGVuKTsKLQkJfQotCQlyZXN1bHRbbGVuXSA9IHZhbHVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIGFkZGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZChpbnRbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkKGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbiArIDFdOwotCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlyZXN1bHRbaW5kZXhdID0gdmFsdWU7Ci0JCWlmIChpbmRleCA8IGxlbikgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyAxLCBsZW4gLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKjxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGNvbGxlY3Rpb24gc2l6ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiAoY29sbGVjdGlvblNpemUgPT0gMCkgPyBhcnJheSA6IGFkZEFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gYWRkQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIHNpemUgPiB6ZXJvCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5Lmxlbmd0aCwgY29sbGVjdGlvblNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBjb2xsZWN0aW9uIHNpemUgPiB6ZXJvOyBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPwotCQkJCWNvbGxlY3Rpb24udG9BcnJheShuZXdBcnJheShhcnJheSwgY29sbGVjdGlvblNpemUpKSA6Ci0JCQkJYWRkQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgsIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoIGFuZCBjb2xsZWN0aW9uIHNpemUgPiB6ZXJvCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBhcnJheUxlbmd0aCArIGNvbGxlY3Rpb25TaXplKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBhcnJheUxlbmd0aCk7Ci0JCWludCBpID0gYXJyYXlMZW5ndGg7Ci0JCWZvciAoRSBlbGVtZW50IDogY29sbGVjdGlvbikgewotCQkJcmVzdWx0W2krK10gPSBlbGVtZW50OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvcikpIDogYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgMSBmb2xsb3dlZCBieSB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBFLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIEVbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBhcnJheTEgOiBhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgRVtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXkxLCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheTEsIGFycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoT2JqZWN0W10gYXJyYXkxLCBpbnQgaW5kZXgsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXkxLCBpbnQgaW5kZXgsIEUuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheTEsIGludCBpbmRleCwgRVtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTEubGVuZ3RoLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDA7IGNoZWNrIGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8KLQkJCQkJYXJyYXkyIDoKLQkJCQkJKGluZGV4ID09IGFycmF5MUxlbmd0aCkgPyAgLy8gJ2FycmF5MicgYWRkZWQgdG8gZW5kIG9mICdhcnJheTEnCi0JCQkJCQlhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCkgOgotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMCBhbmQgaW5kZXggIT0gYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5MSwgaW50IGluZGV4LCBFW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheTEsIGFycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheTIsIDAsIHJlc3VsdCwgaW5kZXgsIGFycmF5Mkxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCBpbmRleCwgcmVzdWx0LCBpbmRleCArIGFycmF5Mkxlbmd0aCwgYXJyYXkxTGVuZ3RoIC0gaW5kZXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb24gYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5LCBpbmRleCwgY29sbGVjdGlvbiwgY29sbGVjdGlvbi5zaXplKCkpOwotCX0KLQotCS8qKgotCSAqIGNoZWNrIGNvbGxlY3Rpb24gc2l6ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgY29sbGVjdGlvblNpemUpIHsKLQkJcmV0dXJuIChjb2xsZWN0aW9uU2l6ZSA9PSAwKSA/IGFycmF5IDogYWRkQWxsXyhhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gYWRkQWxsXyhFW10gYXJyYXksIGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbiwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBhcnJheS5sZW5ndGgsIGNvbGxlY3Rpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBzaXplID4gMDsgY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGwoRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCwgaW50IGNvbGxlY3Rpb25TaXplKSB7Ci0JCWlmIChhcnJheUxlbmd0aCA9PSAwKSB7Ci0JCQlpZiAoaW5kZXggPT0gMCkgewotCQkJCXJldHVybiBjb2xsZWN0aW9uLnRvQXJyYXkobmV3QXJyYXkoYXJyYXksIGNvbGxlY3Rpb25TaXplKSk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIChpbmRleCA9PSBhcnJheUxlbmd0aCkgPyAgLy8gJ2NvbGxlY3Rpb24nIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXknCi0JCQkJYWRkQWxsXyhhcnJheSwgY29sbGVjdGlvbiwgYXJyYXlMZW5ndGgsIGNvbGxlY3Rpb25TaXplKSA6Ci0JCQkJYWRkQWxsXyhhcnJheSwgaW5kZXgsIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoLCBjb2xsZWN0aW9uU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCBhbmQgY29sbGVjdGlvbiBzaXplID4gMCBhbmQgaW5kZXggIT0gYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSBhZGRBbGxfKEVbXSBhcnJheSwgaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgsIGludCBjb2xsZWN0aW9uU2l6ZSkgewotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGFycmF5TGVuZ3RoICsgY29sbGVjdGlvblNpemUpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJaW50IGkgPSBpbmRleDsKLQkJZm9yIChFIGl0ZW0gOiBjb2xsZWN0aW9uKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IGl0ZW07Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBjb2xsZWN0aW9uU2l6ZSwgYXJyYXlMZW5ndGggLSBpbmRleCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheSwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXksIGluZGV4LCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmFkZEFsbChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGFkZEFsbChFW10gYXJyYXksIGludCBpbmRleCwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBhZGRBbGxfKGFycmF5LCBpbmRleCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgsIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gYWRkQWxsKEVbXSBhcnJheSwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oYXJyYXksIGluZGV4LCBDb2xsZWN0aW9uVG9vbHMubGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSkgOiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIGFkZEFsbF8oRVtdIGFycmF5LCBpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIGFkZEFsbF8oYXJyYXksIGluZGV4LCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uLnNpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSAxIGZvbGxvd2VkIGJ5IHRoZSBlbGVtZW50cwotCSAqIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGFkZEFsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGxfKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBhZGRBbGxfKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2FycmF5MUxlbmd0aCArIGFycmF5Mkxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkxLCAwLCByZXN1bHQsIDAsIGFycmF5MUxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogZmlyc3Qgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG9iamVjdHMgaW4gdGhlIHNlY29uZAotCSAqIHNwZWNpZmllZCBhcnJheSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGQoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBhZGRBbGwoY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyLi4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgMiBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTJMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAyIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsXyhjaGFyW10gYXJyYXkxLCBpbnQgaW5kZXgsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MS5sZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMDsgY2hlY2sgYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gYWRkQWxsKGNoYXJbXSBhcnJheTEsIGludCBpbmRleCwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/Ci0JCQkJCWFycmF5MiA6Ci0JCQkJCShpbmRleCA9PSBhcnJheTFMZW5ndGgpID8gIC8vICdhcnJheTInIGFkZGVkIHRvIGVuZCBvZiAnYXJyYXkxJwotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGFycmF5MiwgYXJyYXkxTGVuZ3RoLCBhcnJheTJMZW5ndGgpIDoKLQkJCQkJCWFkZEFsbF8oYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAgYW5kIGluZGV4ICE9IGFycmF5IDEgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGFkZEFsbF8oY2hhcltdIGFycmF5MSwgaW50IGluZGV4LCBjaGFyW10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhclthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IDEgZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBhcnJheSAyLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5hZGRBbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50Li4uIGFycmF5MikgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5Mkxlbmd0aCA9PSAwKSA/IGFycmF5MSA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbF8oaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJcmV0dXJuIGFkZEFsbChhcnJheTEsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5MUxlbmd0aCA9PSAwKSA/IGFycmF5MiA6IGFkZEFsbF8oYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbF8oaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBhcnJheTFMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MiwgMCwgcmVzdWx0LCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIGZpcnN0IHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBvYmplY3RzIGluIHRoZSBzZWNvbmQKLQkgKiBzcGVjaWZpZWQgYXJyYXkgYWRkZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuYWRkKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gYWRkQWxsKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnQuLi4gYXJyYXkyKSB7Ci0JCXJldHVybiBhZGRBbGwoYXJyYXkxLCBpbmRleCwgYXJyYXkyLCBhcnJheTIubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSAyIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gYXJyYXkxIDogYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDIgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbF8oaW50W10gYXJyYXkxLCBpbnQgaW5kZXgsIGludFtdIGFycmF5MiwgaW50IGFycmF5Mkxlbmd0aCkgewotCQlyZXR1cm4gYWRkQWxsKGFycmF5MSwgaW5kZXgsIGFycmF5MiwgYXJyYXkxLmxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgMiBsZW5ndGggPiAwOyBjaGVjayBhcnJheSAxIGxlbmd0aAotCSAqLwotCXByaXZhdGUgc3RhdGljIGludFtdIGFkZEFsbChpbnRbXSBhcnJheTEsIGludCBpbmRleCwgaW50W10gYXJyYXkyLCBpbnQgYXJyYXkxTGVuZ3RoLCBpbnQgYXJyYXkyTGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8KLQkJCQkJYXJyYXkyIDoKLQkJCQkJKGluZGV4ID09IGFycmF5MUxlbmd0aCkgPyAgLy8gJ2FycmF5MicgYWRkZWQgdG8gZW5kIG9mICdhcnJheTEnCi0JCQkJCQlhZGRBbGxfKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCkgOgotCQkJCQkJYWRkQWxsXyhhcnJheTEsIGluZGV4LCBhcnJheTIsIGFycmF5MUxlbmd0aCwgYXJyYXkyTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYm90aCBhcnJheSBsZW5ndGhzID4gMCBhbmQgaW5kZXggIT0gYXJyYXkgMSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBhZGRBbGxfKGludFtdIGFycmF5MSwgaW50IGluZGV4LCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFthcnJheTFMZW5ndGggKyBhcnJheTJMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXkyLCAwLCByZXN1bHQsIGluZGV4LCBhcnJheTJMZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5MSwgaW5kZXgsIHJlc3VsdCwgaW5kZXggKyBhcnJheTJMZW5ndGgsIGFycmF5MUxlbmd0aCAtIGluZGV4KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHdpdGggdGhlIHNhbWUgY29tcG9uZW50IHR5cGUgYXMgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY2xlYXIoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBjbGVhcihFW10gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBhcnJheSA6IG5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uY2F0ZW5hdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBlbGVtZW50cyBpbiBhbGwgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5cywgY29uY2F0ZW5hdGVkIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGNvbnN0YW50IGFycmF5cyBvdXQgb2Ygb3RoZXIgY29uc3RhbnQgYXJyYXlzLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb25jYXRlbmF0ZShPYmplY3RbXS4uLiBhcnJheXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBjb25jYXRlbmF0ZShFW10uLi4gYXJyYXlzKSB7Ci0JCWludCBsZW4gPSAwOwotCQlmb3IgKEVbXSBhcnJheSA6IGFycmF5cykgewotCQkJbGVuICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXlzWzBdLCBsZW4pOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaW50IGN1cnJlbnQgPSAwOwotCQlmb3IgKEVbXSBhcnJheSA6IGFycmF5cykgewotCQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQkJaWYgKGFycmF5TGVuZ3RoID4gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgY3VycmVudCwgYXJyYXlMZW5ndGgpOwotCQkJCWN1cnJlbnQgKz0gYXJyYXlMZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGluICBhbGwgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5cywgY29uY2F0ZW5hdGVkIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGNvbnN0YW50IGFycmF5cyBvdXQgb3RoZXIgY29uc3RhbnQgYXJyYXlzLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb25jYXRlbmF0ZShjaGFyW10uLi4gYXJyYXlzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb25jYXRlbmF0ZShjaGFyW10uLi4gYXJyYXlzKSB7Ci0JCWludCBsZW4gPSAwOwotCQlmb3IgKGNoYXJbXSBhcnJheSA6IGFycmF5cykgewotCQkJbGVuICs9IGFycmF5Lmxlbmd0aDsKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOwotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlpbnQgY3VycmVudCA9IDA7Ci0JCWZvciAoY2hhcltdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCQlpZiAoYXJyYXlMZW5ndGggIT0gMCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgY3VycmVudCwgYXJyYXlMZW5ndGgpOwotCQkJCWN1cnJlbnQgKz0gYXJyYXlMZW5ndGg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzIGluICBhbGwgdGhlCi0JICogc3BlY2lmaWVkIGFycmF5cywgY29uY2F0ZW5hdGVkIGluIHRoZSBzcGVjaWZpZWQgb3JkZXIuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGJ1aWxkaW5nIGNvbnN0YW50IGFycmF5cyBvdXQgb3RoZXIgY29uc3RhbnQgYXJyYXlzLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb25jYXRlbmF0ZShpbnRbXS4uLiBhcnJheXMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gY29uY2F0ZW5hdGUoaW50W10uLi4gYXJyYXlzKSB7Ci0JCWludCBsZW4gPSAwOwotCQlmb3IgKGludFtdIGFycmF5IDogYXJyYXlzKSB7Ci0JCQlsZW4gKz0gYXJyYXkubGVuZ3RoOwotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbl07Ci0JCWludCBjdXJyZW50ID0gMDsKLQkJZm9yIChpbnRbXSBhcnJheSA6IGFycmF5cykgewotCQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQkJaWYgKGFycmF5TGVuZ3RoICE9IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIGN1cnJlbnQsIGFycmF5TGVuZ3RoKTsKLQkJCQljdXJyZW50ICs9IGFycmF5TGVuZ3RoOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3Qgbyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zKGFycmF5LCB2YWx1ZSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gZmFsc2UgOiBjb250YWluc18oYXJyYXksIHZhbHVlLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNfKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSBjb250YWlucyB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCXJldHVybiBjb250YWlucyhhcnJheSwgdmFsdWUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gZmFsc2UgOiBjb250YWluc18oYXJyYXksIHZhbHVlLCBhcnJheUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zXyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUsIGludCBhcnJheUxlbmd0aCkgewotCQlmb3IgKGludCBpID0gYXJyYXlMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXJyYXkgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiBjb250YWlucyhhcnJheSwgdmFsdWUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgYXJyYXkgbGVuZ3RoCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhpbnRbXSBhcnJheSwgaW50IHZhbHVlLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29udGFpbnNfKGFycmF5LCB2YWx1ZSwgYXJyYXlMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb250YWluc18oaW50W10gYXJyYXksIGludCB2YWx1ZSwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChhcnJheSwgY29sbGVjdGlvbi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJLy8gdXNlIGhhc2hlZCBsb29rdXAKLQkJSGFzaFNldDxPYmplY3Q+IHNldCA9IENvbGxlY3Rpb25Ub29scy5zZXQoYXJyYXkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoICEgc2V0LmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3QuLi4gYXJyYXkyKSB7Ci0JCS8vIHVzZSBoYXNoZWQgbG9va3VwCi0JCUhhc2hTZXQ8T2JqZWN0PiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KGFycmF5MSk7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBzZXQuY29udGFpbnMoYXJyYXkyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGFycmF5IDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuY29udGFpbnNBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKGNoYXJbXSBhcnJheTEsIGNoYXIuLi4gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheSAxIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IDIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmNvbnRhaW5zQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoaW50W10gYXJyYXkxLCBpbnQuLi4gYXJyYXkyKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheTIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTEsIGFycmF5MltpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQsIGJlZ2lubmluZyBhdCB0aGUgZW5kLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGlkZW50aWNhbCwgcmV0dXJuIC0xLgotCSAqIElmIHRoZSBhcnJheXMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBhcnJheS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBkaWZmRW5kKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKSB7Ci0JCWludCBsZW4xID0gYXJyYXkxLmxlbmd0aDsKLQkJaW50IGxlbjIgPSBhcnJheTIubGVuZ3RoOwotCQlpZiAobGVuMSAhPSBsZW4yKSB7Ci0JCQlyZXR1cm4gTWF0aC5tYXgobGVuMSwgbGVuMikgLSAxOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW4xIC0gMTsgaSA+IC0xOyBpLS0pIHsKLQkJCU9iamVjdCBvID0gYXJyYXkxW2ldOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChhcnJheTJbaV0gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICggISBvLmVxdWFscyhhcnJheTJbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqIEBzZWUgI2RpZmZTdGFydChPYmplY3RbXSwgT2JqZWN0W10pCi0JICogQHNlZSAjZGlmZkVuZChPYmplY3RbXSwgT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZSBkaWZmUmFuZ2UoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IGRpZmZFbmQoYXJyYXkxLCBhcnJheTIpOwotCQlpZiAoZW5kID09IC0xKSB7Ci0JCQkvLyB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgdGhlIHN0YXJ0IGlzIHRoZSBzaXplIG9mIHRoZSB0d28gbGlzdHMKLQkJCXJldHVybiBuZXcgUmFuZ2UoYXJyYXkxLmxlbmd0aCwgZW5kKTsKLQkJfQotCQkvLyB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCwgY2FsY3VsYXRlIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UKLQkJcmV0dXJuIG5ldyBSYW5nZShkaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpLCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybgotCSAqIHRoZSBzaXplIG9mIHRoZSB0d28gYXJyYXlzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBhcnJheSBtYXRjaCB0aGVpciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluCi0JICogdGhlIGxvbmdlciBhcnJheSwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGFycmF5Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgYXJyYXkpLgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgZW5kID0gTWF0aC5taW4oYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW5kOyBpKyspIHsKLQkJCU9iamVjdCBvID0gYXJyYXkxW2ldOwotCQkJaWYgKG8gPT0gbnVsbCkgewotCQkJCWlmIChhcnJheTJbaV0gIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICggISBvLmVxdWFscyhhcnJheTJbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZW5kOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGl0eSBkaWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LCBiZWdpbm5pbmcgYXQgdGhlIGVuZC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlCi0JICogbGFzdCBlbGVtZW50IGluIHRoZSBsb25nZXIgYXJyYXkuCi0JICogVXNlIG9iamVjdCBpZGVudGl0eSB0byBjb21wYXJlIHRoZSBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpZGVudGl0eURpZmZFbmQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGxlbjEgPSBhcnJheTEubGVuZ3RoOwotCQlpbnQgbGVuMiA9IGFycmF5Mi5sZW5ndGg7Ci0JCWlmIChsZW4xICE9IGxlbjIpIHsKLQkJCXJldHVybiBNYXRoLm1heChsZW4xLCBsZW4yKSAtIDE7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjEgLSAxOyBpID4gLTE7IGktLSkgewotCQkJaWYgKGFycmF5MVtpXSAhPSBhcnJheTJbaV0pIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogQHNlZSAjaWRlbnRpdHlEaWZmU3RhcnQoT2JqZWN0W10sIE9iamVjdFtdKQotCSAqIEBzZWUgI2lkZW50aXR5RGlmZkVuZChPYmplY3RbXSwgT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBSYW5nZSBpZGVudGl0eURpZmZSYW5nZShPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgZW5kID0gaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKTsKLQkJaWYgKGVuZCA9PSAtMSkgewotCQkJLy8gdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHRoZSBzdGFydCBpcyB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzCi0JCQlyZXR1cm4gbmV3IFJhbmdlKGFycmF5MS5sZW5ndGgsIGVuZCk7Ci0JCX0KLQkJLy8gdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQsIGNhbGN1bGF0ZSB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlCi0JCXJldHVybiBuZXcgUmFuZ2UoaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpLCBlbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBhcnJheXMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybgotCSAqIHRoZSBzaXplIG9mIHRoZSB0d28gYXJyYXlzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBhcnJheSBtYXRjaCB0aGVpciBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluCi0JICogdGhlIGxvbmdlciBhcnJheSwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGFycmF5Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgYXJyYXkpLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgaWRlbnRpdHlEaWZmU3RhcnQoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaW50IGVuZCA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpZiAoYXJyYXkxW2ldICE9IGFycmF5MltpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBhcnJheXMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaWRlbnRpY2FsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVJZGVudGljYWwoT2JqZWN0W10gYXJyYXkxLCBPYmplY3RbXSBhcnJheTIpIHsKLQkJaWYgKGFycmF5MSA9PSBhcnJheTIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhcnJheTEgPT0gbnVsbCB8fCBhcnJheTIgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBsZW5ndGggPSBhcnJheTEubGVuZ3RoOwotCQlpZiAoYXJyYXkyLmxlbmd0aCAhPSBsZW5ndGgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheTFbaV0gIT0gYXJyYXkyW2ldKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmluZGV4T2YoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlpZiAoYXJyYXlbaV0gPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQkJaWYgKHZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmlkZW50aXR5SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChhcnJheVtpXSA9PSB2YWx1ZSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5pbmRleE9mKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2YoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoYXJyYXlbaV0gPT0gdmFsdWUpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1heGltdW0gaW5kZXggb2Ygd2hlcmUgdGhlIHNwZWNpZmllZCBjb21wYXJhYmxlIG9iamVjdAotCSAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGFycmF5IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGFycmF5IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihFW10gc29ydGVkQXJyYXksIENvbXBhcmFibGU8RT4gdmFsdWUpIHsKLQkJaW50IGxlbiA9IHNvcnRlZEFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHZhbHVlLmNvbXBhcmVUbyhzb3J0ZWRBcnJheVtpXSkgPCAwKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1heGltdW0gaW5kZXggb2Ygd2hlcmUgdGhlIHNwZWNpZmllZCBjb21wYXJhYmxlIG9iamVjdAotCSAqIHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGFycmF5IGFuZCBzdGlsbCBrZWVwCi0JICogdGhlIGFycmF5IHNvcnRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBpbnQgaW5zZXJ0aW9uSW5kZXhPZihFW10gc29ydGVkQXJyYXksIEUgdmFsdWUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCWludCBsZW4gPSBzb3J0ZWRBcnJheS5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChjb21wYXJhdG9yLmNvbXBhcmUodmFsdWUsIHNvcnRlZEFycmF5W2ldKSA8IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsYXN0IGluZGV4IG9mICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5OwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5sYXN0SW5kZXhPZihPYmplY3RbXSBhcnJheSwgT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmIChhcnJheVtpXSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCXJldHVybiBpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBzcGVjaWZpZWQgYXJyYXksCi0JICogb3IgcmV0dXJuIC0xIGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmxhc3RJbmRleE9mKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoY2hhcltdIGFycmF5LCBjaGFyIHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIG9yIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5sYXN0SW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBsYXN0SW5kZXhPZihpbnRbXSBhcnJheSwgaW50IHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaW4vbWF4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hhcmFjdGVyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtaW5pbXVtIHZhbHVlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5taW4oY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgbWluKGNoYXIuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBsYXN0ID0gbGVuIC0gMTsKLQkJY2hhciBtaW4gPSBhcnJheVtsYXN0XTsKLQkJZm9yIChpbnQgaSA9IGxhc3Q7IGktLSA+IDA7ICkgewotCQkJY2hhciBjID0gYXJyYXlbaV07Ci0JCQlpZiAoYyA8IG1pbikgewotCQkJCW1pbiA9IGM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1pbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGludGVnZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIG1pbmltdW0gdmFsdWUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLm1pbihpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbWluKGludC4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGxhc3QgPSBsZW4gLSAxOwotCQlpbnQgbWluID0gYXJyYXlbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCWludCB4ID0gYXJyYXlbaV07Ci0JCQlpZiAoeCA8IG1pbikgewotCQkJCW1pbiA9IHg7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1pbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXJhY3RlciBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgbWF4aW11bSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMubWF4KGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIG1heChjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLQkJfQotCQlpbnQgbGFzdCA9IGxlbiAtIDE7Ci0JCWNoYXIgbWF4ID0gYXJyYXlbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCWNoYXIgYyA9IGFycmF5W2ldOwotCQkJaWYgKGMgPiBtYXgpIHsKLQkJCQltYXggPSBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbnRlZ2VyIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tYXgoaW50W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IG1heChpbnQuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotCQl9Ci0JCWludCBsYXN0ID0gbGVuIC0gMTsKLQkJaW50IG1heCA9IGFycmF5W2xhc3RdOwotCQlmb3IgKGludCBpID0gbGFzdDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgeCA9IGFycmF5W2ldOwotCQkJaWYgKHggPiBtYXgpIHsKLQkJCQltYXggPSB4OwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1vdmUgKioqKioqKioqKgotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKE9iamVjdFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG1vdmUoRVtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGFycmF5IDogbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRhcmdldCBpbmRleCAhPSBzb3VyY2UgaW5kZXgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIG1vdmVfKEVbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJRSB0ZW1wID0gYXJyYXlbc291cmNlSW5kZXhdOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIDEsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyAxLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCWFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKE9iamVjdFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIG1vdmUoRVtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJRVtdIHRlbXAgPSBuZXdBcnJheShhcnJheSwgbGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXgsIHRlbXAsIDAsIGxlbmd0aCk7Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgbGVuZ3RoLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgbGVuZ3RoLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgYXJyYXksIHRhcmdldEluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGFycmF5IDogbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50W10gbW92ZV8oaW50W10gYXJyYXksIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWludCB0ZW1wID0gYXJyYXlbc291cmNlSW5kZXhdOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIDEsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyAxLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCWFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBtb3ZlKGludFtdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJaW50W10gdGVtcCA9IG5ldyBpbnRbbGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXgsIHRlbXAsIDAsIGxlbmd0aCk7Ci0JCWlmICh0YXJnZXRJbmRleCA8IHNvdXJjZUluZGV4KSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCB0YXJnZXRJbmRleCwgYXJyYXksIHRhcmdldEluZGV4ICsgbGVuZ3RoLCBzb3VyY2VJbmRleCAtIHRhcmdldEluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHNvdXJjZUluZGV4ICsgbGVuZ3RoLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgYXJyYXksIHRhcmdldEluZGV4LCBsZW5ndGgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIG1vdmUoY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlyZXR1cm4gKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSA/IGFycmF5IDogbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIG1vdmVfKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJY2hhciB0ZW1wID0gYXJyYXlbc291cmNlSW5kZXhdOwotCQlpZiAodGFyZ2V0SW5kZXggPCBzb3VyY2VJbmRleCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgdGFyZ2V0SW5kZXgsIGFycmF5LCB0YXJnZXRJbmRleCArIDEsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyAxLCBhcnJheSwgc291cmNlSW5kZXgsIHRhcmdldEluZGV4IC0gc291cmNlSW5kZXgpOwotCQl9Ci0JCWFycmF5W3RhcmdldEluZGV4XSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5tb3ZlKGNoYXJbXSBhcnJheSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIG1vdmUoY2hhcltdIGFycmF5LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaWYgKGxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gbW92ZV8oYXJyYXksIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJY2hhcltdIHRlbXAgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBzb3VyY2VJbmRleCwgdGVtcCwgMCwgbGVuZ3RoKTsKLQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHRhcmdldEluZGV4LCBhcnJheSwgdGFyZ2V0SW5kZXggKyBsZW5ndGgsIHNvdXJjZUluZGV4IC0gdGFyZ2V0SW5kZXgpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgc291cmNlSW5kZXggKyBsZW5ndGgsIGFycmF5LCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXggLSBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCBhcnJheSwgdGFyZ2V0SW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlKE9iamVjdFtdIGFycmF5LCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmUoRVtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRBdEluZGV4KGFycmF5LCBpbmRleE9mKGFycmF5LCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGluZGV4T2YoYXJyYXksIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmUoaW50W10gYXJyYXksIGludCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmUoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudEF0SW5kZXgoYXJyYXksIGluZGV4T2YoYXJyYXksIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUZpcnN0KE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRmlyc3QoRVtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUZpcnN0KGNoYXJbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRmlyc3QoY2hhcltdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBmaXJzdCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUZpcnN0KGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlbW92ZUZpcnN0KGludFtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlTGFzdChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUxhc3QoRVtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgYXJyYXkubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlTGFzdChjaGFyW10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUxhc3QoY2hhcltdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgYXJyYXkubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBsYXN0IGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlTGFzdChpbnRbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVMYXN0KGludFtdIGFycmF5KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50QXRJbmRleChhcnJheSwgYXJyYXkubGVuZ3RoIC0gMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGFycmF5LCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbChhcnJheSwgaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCS8vIGNvbnZlcnQgdG8gYSBzZXQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IHJlbW92ZUFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5zZXQoaXRlcmF0b3IpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQkvLyBjb252ZXJ0IHRvIGEgc2V0IHRvIHRha2UgYWR2YW50YWdlIG9mIGhhc2hlZCBsb29rLXVwCi0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyByZW1vdmVBbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKSA6IGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSwgQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uLmlzRW1wdHkoKSA/IGFycmF5IDogcmVtb3ZlQWxsXyhhcnJheSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZW1vdmVBbGxfKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiByZW1vdmVBbGwoYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGNvbGxlY3Rpb24gaXMgbm9uLWVtcHR5OyBjaGVjayBhcnJheSBsZW5ndGgKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXksIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgaW50IGFycmF5TGVuZ3RoKSB7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJlbW92ZUFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCkgewotCQkvLyBidWlsZCB0aGUgaW5kaWNlcyBvZiB0aGUgZWxlbWVudHMgdGhhdCBhcmUgdG8gcmVtYWluCi0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGogPT0gYXJyYXlMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIGopOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJlbW92ZUFsbChFW10gYXJyYXkxLCBPYmplY3QuLi4gYXJyYXkyKSB7Ci0JCS8vIGNvbnZlcnQgdG8gYSBzZXQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgaGFzaGVkIGxvb2stdXAKLQkJcmV0dXJuIChhcnJheTIubGVuZ3RoID09IDApID8gYXJyYXkxIDogcmVtb3ZlQWxsXyhhcnJheTEsIENvbGxlY3Rpb25Ub29scy5zZXQoYXJyYXkyKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIGZpcnN0IHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNlY29uZCBzcGVjaWZpZWQgYXJyYXkgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cyNyZW1vdmVBbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsKGNoYXJbXSBhcnJheTEsIGNoYXIuLi4gYXJyYXkyKSB7Ci0JCWlmIChhcnJheTIubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCWlmIChhcnJheTFMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTIsIGFycmF5MVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgZmlyc3Qgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2Vjb25kIHNwZWNpZmllZCBhcnJheSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzI3JlbW92ZUFsbChpbnRbXSBhcnJheTEsIGludFtdIGFycmF5Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVBbGwoaW50W10gYXJyYXkxLCBpbnQuLi4gYXJyYXkyKSB7Ci0JCWlmIChhcnJheTIubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTE7Ci0JCX0KLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCWlmIChhcnJheTFMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5MTsKLQkJfQotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheTFMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkxTGVuZ3RoOyBpKyspIHsKLQkJCWlmICggISBjb250YWlucyhhcnJheTIsIGFycmF5MVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5MUxlbmd0aCkgewotCQkJcmV0dXJuIGFycmF5MTsgIC8vIG5vdGhpbmcgd2FzIHJlbW92ZWQKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXkxW2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhPYmplY3RbXSBhcnJheSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoRVtdIGFycmF5LCBPYmplY3QgdmFsdWUpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoYXJyYXlMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludFtdIGluZGljZXMgPSBuZXcgaW50W2FycmF5TGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5TGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAoYXJyYXlbaV0gIT0gbnVsbCkgewotCQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJCWlmICggISB2YWx1ZS5lcXVhbHMoYXJyYXlbaV0pKSB7Ci0JCQkJCWluZGljZXNbaisrXSA9IGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJRVtdIHJlc3VsdCA9IG5ld0FycmF5KGFycmF5LCBqKTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGZyb20gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgb2NjdXJyZW5jZXMgb2YKLQkgKiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gYXJyYXksIGNoYXIgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChhcnJheUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gIT0gdmFsdWUpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2pdOwotCQlpbnQgcmVzdWx0TGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRMZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gYXJyYXlbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCBvY2N1cnJlbmNlcyBvZgotCSAqIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGludFtdIGFycmF5LCBpbnQgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoaW50W10gYXJyYXksIGludCB2YWx1ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWlmIChhcnJheUxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXlMZW5ndGhdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSBhcnJheUxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYXJyYXlbaV0gIT0gdmFsdWUpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBub3RoaW5nIHdhcyByZW1vdmVkCi0JCX0KLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5W2luZGljZXNbaV1dOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBkdXBsaWNhdGUgZWxlbWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGFueSBkdXBsaWNhdGUgZWxlbWVudHMgZnJvbSB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHdoaWxlIG1haW50YWluaW5nIHRoZSBvcmRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRHVwbGljYXRlRWxlbWVudHMoRS4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJQXJyYXlMaXN0PEU+IHRlbXAgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhcnJheSk7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHModGVtcCwgbGVuKSA/Ci0JCQkJCXRlbXAudG9BcnJheShuZXdBcnJheShhcnJheSwgdGVtcC5zaXplKCkpKSA6Ci0JCQkJCWFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZWxlbWVudCBhdCBpbmRleCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudHMgaW4gdGhlCi0JICogc3BlY2lmaWVkIGFycmF5IHdpdGggdGhlIHNwZWNpZmllZCBlbGVtZW50IHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRBdEluZGV4KE9iamVjdFtdIGFycmF5LCBpbnQgaW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZW1vdmVFbGVtZW50QXRJbmRleChFW10gYXJyYXksIGludCBpbmRleCkgewotCQlyZXR1cm4gcmVtb3ZlRWxlbWVudHNBdEluZGV4KGFycmF5LCBpbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCByZW1vdmVkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZW1vdmVFbGVtZW50QXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRWxlbWVudEF0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHJlbW92ZUVsZW1lbnRzQXRJbmRleChhcnJheSwgaW5kZXgsIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudEF0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVFbGVtZW50QXRJbmRleChpbnRbXSBhcnJheSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiByZW1vdmVFbGVtZW50c0F0SW5kZXgoYXJyYXksIGluZGV4LCAxKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChPYmplY3RbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVtb3ZlRWxlbWVudHNBdEluZGV4KEVbXSBhcnJheSwgaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChsZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJaW50IG5ld0xlbmd0aCA9IGFycmF5TGVuZ3RoIC0gbGVuZ3RoOwotCQlFW10gcmVzdWx0ID0gbmV3QXJyYXkoYXJyYXksIG5ld0xlbmd0aCk7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIHJlc3VsdDsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJaWYgKGluZGV4ICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHJlc3VsdCwgMCwgaW5kZXgpOwotCQl9Ci0JCWludCBsZW5ndGgyID0gbmV3TGVuZ3RoIC0gaW5kZXg7Ci0JCWlmIChsZW5ndGgyICE9IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgbGVuZ3RoLCByZXN1bHQsIGluZGV4LCBsZW5ndGgyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50cyBpbiB0aGUKLQkgKiBzcGVjaWZpZWQgYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIHJlbW92ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChjaGFyW10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVFbGVtZW50c0F0SW5kZXgoY2hhcltdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlpbnQgbmV3TGVuZ3RoID0gYXJyYXlMZW5ndGggLSBsZW5ndGg7Ci0JCWlmICgobmV3TGVuZ3RoID09IDApICYmIChpbmRleCA9PSAwKSkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltuZXdMZW5ndGhdOwotCQlpZiAoaW5kZXggIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgcmVzdWx0LCAwLCBpbmRleCk7Ci0JCX0KLQkJaW50IGxlbmd0aDIgPSBuZXdMZW5ndGggLSBpbmRleDsKLQkJaWYgKGxlbmd0aDIgIT0gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyBsZW5ndGgsIHJlc3VsdCwgaW5kZXgsIGxlbmd0aDIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGVsZW1lbnRzIGluIHRoZQotCSAqIHNwZWNpZmllZCBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgcmVtb3ZlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGludFtdIGFycmF5LCBpbnQgaW5kZXgsIGludCBsZW5ndGgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZW1vdmVFbGVtZW50c0F0SW5kZXgoaW50W10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAobGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCWludCBuZXdMZW5ndGggPSBhcnJheUxlbmd0aCAtIGxlbmd0aDsKLQkJaWYgKChuZXdMZW5ndGggPT0gMCkgJiYgKGluZGV4ID09IDApKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSU5UX0FSUkFZOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W25ld0xlbmd0aF07Ci0JCWlmIChpbmRleCAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJfQotCQlpbnQgbGVuZ3RoMiA9IG5ld0xlbmd0aCAtIGluZGV4OwotCQlpZiAobGVuZ3RoMiAhPSAwKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIGxlbmd0aCwgcmVzdWx0LCBpbmRleCwgbGVuZ3RoMik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVwbGFjZSBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlcGxhY2VBbGwoT2JqZWN0W10gYXJyYXksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmVwbGFjZUFsbChFW10gYXJyYXksIE9iamVjdCBvbGRWYWx1ZSwgRSBuZXdWYWx1ZSkgewotCQlpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGFycmF5W2ldID09IG51bGwpIHsKLQkJCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCQlpZiAob2xkVmFsdWUuZXF1YWxzKGFycmF5W2ldKSkgewotCQkJCQlhcnJheVtpXSA9IG5ld1ZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICo8cD4KLQkgKiA8Y29kZT4gQXJyYXlzLnJlcGxhY2VBbGwoaW50W10gYXJyYXksIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJlcGxhY2VBbGwoaW50W10gYXJyYXksIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSBhcnJheS5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGFycmF5W2ldID09IG9sZFZhbHVlKSB7Ci0JCQkJYXJyYXlbaV0gPSBuZXdWYWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBvbGQgdmFsdWUgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLiBSZXR1cm4gdGhlIGFsdGVyZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJlcGxhY2VBbGwoY2hhcltdIGFycmF5LCBjaGFyIG9sZFZhbHVlLCBjaGFyIG5ld1ZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZXBsYWNlQWxsKGNoYXJbXSBhcnJheSwgY2hhciBvbGRWYWx1ZSwgY2hhciBuZXdWYWx1ZSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhcnJheVtpXSA9PSBvbGRWYWx1ZSkgewotCQkJCWFycmF5W2ldID0gbmV3VmFsdWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldGFpbiBpbiB0aGUgc3BlY2lmaWVkIGFycmF5IGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbChFW10gYXJyYXksIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheUxlbmd0aCA9PSAwKSA/IGFycmF5IDogcmV0YWluQWxsKGFycmF5LCBhcnJheUxlbmd0aCwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXksIEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGFycmF5TGVuZ3RoLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldGFpbkFsbChPYmplY3RbXSBhcnJheSwgSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlpbnQgYXJyYXlMZW5ndGggPSBhcnJheS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXlMZW5ndGggPT0gMCkgPyBhcnJheSA6IHJldGFpbkFsbChhcnJheSwgYXJyYXlMZW5ndGgsIGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSBsZW5ndGggPiAwCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBpbnQgYXJyYXlMZW5ndGgsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPwotCQkJCXJldGFpbkFsbF8oYXJyYXksIENvbGxlY3Rpb25Ub29scy5zZXQoaXRlcmF0b3IpLCBhcnJheUxlbmd0aCkgOgotCQkJCW5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgaW50IGFycmF5TGVuZ3RoLCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8KLQkJCQlyZXRhaW5BbGxfKGFycmF5LCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBhcnJheUxlbmd0aCkgOgotCQkJCW5ld0FycmF5KGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gaW4gdGhlIHNwZWNpZmllZCBhcnJheSBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5LCBDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXRhaW5BbGwoRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJaW50IGFycmF5TGVuZ3RoID0gYXJyYXkubGVuZ3RoOwotCQlyZXR1cm4gKGFycmF5TGVuZ3RoID09IDApID8gYXJyYXkgOiByZXRhaW5BbGwoYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgYXJyYXkgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBpbnQgYXJyYXlMZW5ndGgpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb24uaXNFbXB0eSgpID8KLQkJCQluZXdBcnJheShhcnJheSwgMCkgOgotCQkJCXJldGFpbkFsbF8oYXJyYXksIGNvbGxlY3Rpb24sIGFycmF5TGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgY29sbGVjdGlvbiBpcyBub24tZW1wdHkgYW5kIGFycmF5IGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHJldGFpbkFsbF8oRVtdIGFycmF5LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIGludCBhcnJheUxlbmd0aCkgewotCQlpbnRbXSBpbmRpY2VzID0gbmV3IGludFthcnJheUxlbmd0aF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29sbGVjdGlvbi5jb250YWlucyhhcnJheVtpXSkpIHsKLQkJCQlpbmRpY2VzW2orK10gPSBpOwotCQkJfQotCQl9Ci0JCWlmIChqID09IGFycmF5TGVuZ3RoKSB7Ci0JCQlyZXR1cm4gYXJyYXk7ICAvLyBldmVyeXRoaW5nIHdhcyByZXRhaW5lZAotCQl9Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgaik7Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKE9iamVjdFtdIGFycmF5MSwgT2JqZWN0W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFW10gcmV0YWluQWxsKEVbXSBhcnJheTEsIE9iamVjdFtdIGFycmF5MikgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPwotCQkJCWFycmF5MSA6Ci0JCQkJKGFycmF5Mi5sZW5ndGggPT0gMCkgPwotCQkJCQluZXdBcnJheShhcnJheTEsIDApIDoKLQkJCQkJcmV0YWluQWxsKGFycmF5MSwgQ29sbGVjdGlvblRvb2xzLnNldChhcnJheTIpLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHJldGFpbkFsbChjaGFyW10gYXJyYXkxLCBjaGFyLi4uIGFycmF5MikgewotCQlpbnQgYXJyYXkxTGVuZ3RoID0gYXJyYXkxLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTFMZW5ndGggPT0gMCkgPyBhcnJheTEgOiByZXRhaW5BbGwoYXJyYXkxLCBhcnJheTIsIGFycmF5MUxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGFycmF5IDEgbGVuZ3RoID4gMAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZXRhaW5BbGwoY2hhcltdIGFycmF5MSwgY2hhcltdIGFycmF5MiwgaW50IGFycmF5MUxlbmd0aCkgewotCQlpbnQgYXJyYXkyTGVuZ3RoID0gYXJyYXkyLmxlbmd0aDsKLQkJcmV0dXJuIChhcnJheTJMZW5ndGggPT0gMCkgPyBFTVBUWV9DSEFSX0FSUkFZIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcmV0YWluQWxsKGNoYXJbXSBhcnJheTEsIGNoYXJbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGFpbnNfKGFycmF5MiwgYXJyYXkxW2ldLCBhcnJheTJMZW5ndGgpKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBldmVyeXRoaW5nIHdhcyByZXRhaW5lZAotCQl9Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltqXTsKLQkJaW50IHJlc3VsdExlbmd0aCA9IHJlc3VsdC5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0TGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGFycmF5MVtpbmRpY2VzW2ldXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBmcm9tIHRoZSBmaXJzdCBzcGVjaWZpZWQgYXJyYXkgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzZWNvbmQgc3BlY2lmaWVkIGFycmF5IGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV0YWluQWxsKGludFtdIGFycmF5MSwgaW50W10gYXJyYXkyKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJldGFpbkFsbChpbnRbXSBhcnJheTEsIGludC4uLiBhcnJheTIpIHsKLQkJaW50IGFycmF5MUxlbmd0aCA9IGFycmF5MS5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkxTGVuZ3RoID09IDApID8gYXJyYXkxIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIGFzc3VtZSBhcnJheSAxIGxlbmd0aCA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSByZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgpIHsKLQkJaW50IGFycmF5Mkxlbmd0aCA9IGFycmF5Mi5sZW5ndGg7Ci0JCXJldHVybiAoYXJyYXkyTGVuZ3RoID09IDApID8gRU1QVFlfSU5UX0FSUkFZIDogcmV0YWluQWxsKGFycmF5MSwgYXJyYXkyLCBhcnJheTFMZW5ndGgsIGFycmF5Mkxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGJvdGggYXJyYXkgbGVuZ3RocyA+IDAKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSByZXRhaW5BbGwoaW50W10gYXJyYXkxLCBpbnRbXSBhcnJheTIsIGludCBhcnJheTFMZW5ndGgsIGludCBhcnJheTJMZW5ndGgpIHsKLQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbYXJyYXkxTGVuZ3RoXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5MUxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY29udGFpbnNfKGFycmF5MiwgYXJyYXkxW2ldLCBhcnJheTJMZW5ndGgpKSB7Ci0JCQkJaW5kaWNlc1tqKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAoaiA9PSBhcnJheTFMZW5ndGgpIHsKLQkJCXJldHVybiBhcnJheTE7ICAvLyBldmVyeXRoaW5nIHdhcyByZXRhaW5lZAotCQl9Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbal07Ci0JCWludCByZXN1bHRMZW5ndGggPSByZXN1bHQubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdExlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHRbaV0gPSBhcnJheTFbaW5kaWNlc1tpXV07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmV2ZXJzZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5LCByZXZlcnNlZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucmV2ZXJzZShPYmplY3QuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSByZXZlcnNlKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGkgPSAwLCBtaWQgPSBsZW4gPj4gMSwgaiA9IGxlbiAtIDE7IGkgPCBtaWQ7IGkrKywgai0tKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCBqKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSwgcmV2ZXJzZWQuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJldmVyc2UoY2hhci4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmV2ZXJzZShjaGFyLi4uIGFycmF5KSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBpID0gMCwgbWlkID0gbGVuID4+IDEsIGogPSBsZW4gLSAxOyBpIDwgbWlkOyBpKyssIGotLSkgewotCQkJc3dhcChhcnJheSwgaSwgaik7Ci0JCX0KLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXksIHJldmVyc2VkLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yZXZlcnNlKGludC4uLiBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSByZXZlcnNlKGludC4uLiBhcnJheSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG1pZCA9IGxlbiA+PiAxLCBqID0gbGVuIC0gMTsgaSA8IG1pZDsgaSsrLCBqLS0pIHsKLQkJCXN3YXAoYXJyYXksIGksIGopOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCBvbmUgcG9zaXRpb24uCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFLi4uIGFycmF5KSB7Ci0JCXJldHVybiByb3RhdGUoYXJyYXksIDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm90YXRlZCBhcnJheSBhZnRlciByb3RhdGluZyBpdCB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoT2JqZWN0W10gYXJyYXksIGludCBkaXN0YW5jZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHJvdGF0ZShFW10gYXJyYXksIGludCBkaXN0YW5jZSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZGlzdGFuY2UgPSBkaXN0YW5jZSAlIGxlbjsKLQkJaWYgKGRpc3RhbmNlIDwgMCkgewotCQkJZGlzdGFuY2UgKz0gbGVuOwotCQl9Ci0JCWlmIChkaXN0YW5jZSA9PSAwKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgY3ljbGVTdGFydCA9IDAsIG5Nb3ZlZCA9IDA7IG5Nb3ZlZCAhPSBsZW47IGN5Y2xlU3RhcnQrKykgewotCQkJRSBkaXNwbGFjZWQgPSBhcnJheVtjeWNsZVN0YXJ0XTsKLQkJCWludCBpID0gY3ljbGVTdGFydDsKLQkJCWRvIHsKLQkJCQlpICs9IGRpc3RhbmNlOwotCQkJCWlmIChpID49IGxlbikgewotCQkJCQlpIC09IGxlbjsKLQkJCQl9Ci0JCQkJRSB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgb25lIHBvc2l0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5yb3RhdGUoY2hhcltdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByb3RhdGUoY2hhci4uLiBhcnJheSkgewotCQlyZXR1cm4gcm90YXRlKGFycmF5LCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvdGF0ZWQgYXJyYXkgYWZ0ZXIgcm90YXRpbmcgaXQgdGhlIHNwZWNpZmllZCBkaXN0YW5jZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKGNoYXJbXSBhcnJheSwgaW50IGRpc3RhbmNlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByb3RhdGUoY2hhcltdIGFycmF5LCBpbnQgZGlzdGFuY2UpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJaWYgKChsZW4gPT0gMCkgfHwgKGxlbiA9PSAxKSkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWRpc3RhbmNlID0gZGlzdGFuY2UgJSBsZW47Ci0JCWlmIChkaXN0YW5jZSA8IDApIHsKLQkJCWRpc3RhbmNlICs9IGxlbjsKLQkJfQotCQlpZiAoZGlzdGFuY2UgPT0gMCkgewotCQkJcmV0dXJuIGFycmF5OwotCQl9Ci0JCWZvciAoaW50IGN5Y2xlU3RhcnQgPSAwLCBuTW92ZWQgPSAwOyBuTW92ZWQgIT0gbGVuOyBjeWNsZVN0YXJ0KyspIHsKLQkJCWNoYXIgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCWNoYXIgdGVtcCA9IGFycmF5W2ldOwotCQkJCWFycmF5W2ldID0gZGlzcGxhY2VkOwotCQkJCWRpc3BsYWNlZCA9IHRlbXA7Ci0JCQkJbk1vdmVkICsrOwotCQkJfSB3aGlsZSAoaSAhPSBjeWNsZVN0YXJ0KTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IG9uZSBwb3NpdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMucm90YXRlKGludFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJvdGF0ZShpbnQuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHJvdGF0ZShhcnJheSwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb3RhdGVkIGFycmF5IGFmdGVyIHJvdGF0aW5nIGl0IHRoZSBzcGVjaWZpZWQgZGlzdGFuY2UuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnJvdGF0ZShpbnRbXSBhcnJheSwgaW50IGRpc3RhbmNlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIHJvdGF0ZShpbnRbXSBhcnJheSwgaW50IGRpc3RhbmNlKSB7Ci0JCWludCBsZW4gPSBhcnJheS5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChsZW4gPT0gMSkpIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlkaXN0YW5jZSA9IGRpc3RhbmNlICUgbGVuOwotCQlpZiAoZGlzdGFuY2UgPCAwKSB7Ci0JCQlkaXN0YW5jZSArPSBsZW47Ci0JCX0KLQkJaWYgKGRpc3RhbmNlID09IDApIHsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCQlmb3IgKGludCBjeWNsZVN0YXJ0ID0gMCwgbk1vdmVkID0gMDsgbk1vdmVkICE9IGxlbjsgY3ljbGVTdGFydCsrKSB7Ci0JCQlpbnQgZGlzcGxhY2VkID0gYXJyYXlbY3ljbGVTdGFydF07Ci0JCQlpbnQgaSA9IGN5Y2xlU3RhcnQ7Ci0JCQlkbyB7Ci0JCQkJaSArPSBkaXN0YW5jZTsKLQkJCQlpZiAoaSA+PSBsZW4pIHsKLQkJCQkJaSAtPSBsZW47Ci0JCQkJfQotCQkJCWludCB0ZW1wID0gYXJyYXlbaV07Ci0JCQkJYXJyYXlbaV0gPSBkaXNwbGFjZWQ7Ci0JCQkJZGlzcGxhY2VkID0gdGVtcDsKLQkJCQluTW92ZWQgKys7Ci0JCQl9IHdoaWxlIChpICE9IGN5Y2xlU3RhcnQpOwotCQl9Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2h1ZmZsZSAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSYW5kb20gUkFORE9NID0gbmV3IFJhbmRvbSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShPYmplY3QuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShPYmplY3RbXSBhcnJheSwgUmFuZG9tIHIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzaHVmZmxlKEVbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShjaGFyLi4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzaHVmZmxlKGNoYXIuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShjaGFyW10gYXJyYXksIFJhbmRvbSByKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzaHVmZmxlKGNoYXJbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShpbnQuLi4gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc2h1ZmZsZShpbnQuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNodWZmbGUoYXJyYXksIFJBTkRPTSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciAic2h1ZmZsaW5nIiBpdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc2h1ZmZsZShpbnRbXSBhcnJheSwgUmFuZG9tIHIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc2h1ZmZsZShpbnRbXSBhcnJheSwgUmFuZG9tIHJhbmRvbSkgewotCQlpbnQgbGVuID0gYXJyYXkubGVuZ3RoOwotCQlpZiAoKGxlbiA9PSAwKSB8fCAobGVuID09IDEpKSB7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlzd2FwKGFycmF5LCBpLCByYW5kb20ubmV4dEludChsZW4pKTsKLQkJfQotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN1Yi1hcnJheSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdWItYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBhcnJheSB3aXRoIGVsZW1lbnRzIGNvcGllZCBmcm9tCi0JICogdGhlIHNwZWNpZmllZCByYW5nZS4gVGhlICJmcm9tIiBpbmRleCBpcyBpbmNsdXNpdmU7IHRoZSAidG8iIGluZGV4IGlzIGV4Y2x1c2l2ZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc3ViQXJyYXkoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHN1YkFycmF5KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJaW50IGxlbiA9IHRvSW5kZXggLSBmcm9tSW5kZXg7Ci0JCUVbXSByZXN1bHQgPSBuZXdBcnJheShhcnJheSwgbGVuKTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGZyb21JbmRleCwgcmVzdWx0LCAwLCBsZW4pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3ViLWFycmF5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgd2l0aCBlbGVtZW50cyBjb3BpZWQgZnJvbQotCSAqIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIFRoZSAiZnJvbSIgaW5kZXggaXMgaW5jbHVzaXZlOyB0aGUgInRvIiBpbmRleCBpcyBleGNsdXNpdmUuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN1YkFycmF5KGludFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzdWJBcnJheShpbnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJaW50IGxlbiA9IHRvSW5kZXggLSBmcm9tSW5kZXg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0lOVF9BUlJBWTsKLQkJfQotCQlpbnRbXSByZXN1bHQgPSBuZXcgaW50W2xlbl07Ci0JCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGZyb21JbmRleCwgcmVzdWx0LCAwLCBsZW4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN1Yi1hcnJheSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IHdpdGggZWxlbWVudHMgY29waWVkIGZyb20KLQkgKiB0aGUgc3BlY2lmaWVkIHJhbmdlLiBUaGUgImZyb20iIGluZGV4IGlzIGluY2x1c2l2ZTsgdGhlICJ0byIgaW5kZXggaXMgZXhjbHVzaXZlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIEFycmF5cy5zdWJBcnJheShjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KTwvY29kZT4KLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc3ViQXJyYXkoY2hhcltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgewotCQlpbnQgbGVuID0gdG9JbmRleCAtIGZyb21JbmRleDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0hBUl9BUlJBWTsKLQkJfQotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJU3lzdGVtLmFycmF5Y29weShhcnJheSwgZnJvbUluZGV4LCByZXN1bHQsIDAsIGxlbik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN3YXAgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN3YXAoT2JqZWN0W10gYXJyYXksIGludCBpLCBpbnQgaik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHN3YXAoRVtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJcmV0dXJuIChpID09IGopID8gYXJyYXkgOiBzd2FwXyhhcnJheSwgaSwgaik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpbmRpY2VzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gRVtdIHN3YXBfKEVbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCUUgdGVtcCA9IGFycmF5W2ldOwotCQlhcnJheVtpXSA9IGFycmF5W2pdOwotCQlhcnJheVtqXSA9IHRlbXA7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMgaGF2ZSBiZWVuICJzd2FwcGVkIi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuc3dhcChjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gc3dhcChjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQlyZXR1cm4gKGkgPT0gaikgPyBhcnJheSA6IHN3YXBfKGFycmF5LCBpLCBqKTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGluZGljZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBzd2FwXyhjaGFyW10gYXJyYXksIGludCBpLCBpbnQgaikgewotCQljaGFyIHRlbXAgPSBhcnJheVtpXTsKLQkJYXJyYXlbaV0gPSBhcnJheVtqXTsKLQkJYXJyYXlbal0gPSB0ZW1wOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzIGhhdmUgYmVlbiAic3dhcHBlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLnN3YXAoaW50W10gYXJyYXksIGludCBpLCBpbnQgaik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzd2FwKGludFtdIGFycmF5LCBpbnQgaSwgaW50IGopIHsKLQkJcmV0dXJuIChpID09IGopID8gYXJyYXkgOiBzd2FwXyhhcnJheSwgaSwgaik7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpbmRpY2VzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBzd2FwXyhpbnRbXSBhcnJheSwgaW50IGksIGludCBqKSB7Ci0JCWludCB0ZW1wID0gYXJyYXlbaV07Ci0JCWFycmF5W2ldID0gYXJyYXlbal07Ci0JCWFycmF5W2pdID0gdGVtcDsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBcnJheXMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChib29sZWFuW10sIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuW10gZmlsbChib29sZWFuW10gYXJyYXksIGJvb2xlYW4gdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChib29sZWFuW10sIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbltdIGZpbGwoYm9vbGVhbltdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgYm9vbGVhbiB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYnl0ZVtdLCBieXRlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZpbGwoYnl0ZVtdIGFycmF5LCBieXRlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoYnl0ZVtdLCBpbnQsIGludCwgYnl0ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBmaWxsKGJ5dGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGJ5dGUgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGNoYXJbXSwgY2hhcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmaWxsKGNoYXJbXSBhcnJheSwgY2hhciB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGNoYXJbXSwgaW50LCBpbnQsIGNoYXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gZmlsbChjaGFyW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBjaGFyIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChkb3VibGVbXSwgZG91YmxlKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gZmlsbChkb3VibGVbXSBhcnJheSwgZG91YmxlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoZG91YmxlW10sIGludCwgaW50LCBkb3VibGUpCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBmaWxsKGRvdWJsZVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgZG91YmxlIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChmbG9hdFtdLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gZmlsbChmbG9hdFtdIGFycmF5LCBmbG9hdCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGZsb2F0W10sIGludCwgaW50LCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gZmlsbChmbG9hdFtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgZmxvYXQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKGludFtdLCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBmaWxsKGludFtdIGFycmF5LCBpbnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIHZhbHVlKTsKLQkJcmV0dXJuIGFycmF5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXJyYXkgYWZ0ZXIgaXQgaGFzIGJlZW4gImZpbGxlZCIuCi0JICogQHNlZSBBcnJheXMjZmlsbChpbnRbXSwgaW50LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludFtdIGZpbGwoaW50W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBpbnQgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKE9iamVjdFtdLCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGZpbGwoRVtdIGFycmF5LCBFIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoT2JqZWN0W10sIGludCwgaW50LCBPYmplY3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIGZpbGwoRVtdIGFycmF5LCBpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCwgRSB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwobG9uZ1tdLCBsb25nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgbG9uZ1tdIGZpbGwobG9uZ1tdIGFycmF5LCBsb25nIHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwobG9uZ1tdLCBpbnQsIGludCwgbG9uZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBmaWxsKGxvbmdbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIGxvbmcgdmFsdWUpIHsKLQkJQXJyYXlzLmZpbGwoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCwgdmFsdWUpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIEFycmF5cyNmaWxsKHNob3J0W10sIHNob3J0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBmaWxsKHNob3J0W10gYXJyYXksIHNob3J0IHZhbHVlKSB7Ci0JCUFycmF5cy5maWxsKGFycmF5LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJmaWxsZWQiLgotCSAqIEBzZWUgQXJyYXlzI2ZpbGwoc2hvcnRbXSwgaW50LCBpbnQsIHNob3J0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBmaWxsKHNob3J0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4LCBzaG9ydCB2YWx1ZSkgewotCQlBcnJheXMuZmlsbChhcnJheSwgZnJvbUluZGV4LCB0b0luZGV4LCB2YWx1ZSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIHNvcnQoYnl0ZS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoYnl0ZVtdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBzb3J0KGJ5dGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoY2hhcltdKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNvcnQoY2hhci4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoY2hhcltdLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBzb3J0KGNoYXJbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZG91YmxlW10pCi0JICovCi0JcHVibGljIHN0YXRpYyBkb3VibGVbXSBzb3J0KGRvdWJsZS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZG91YmxlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZG91YmxlW10gc29ydChkb3VibGVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZmxvYXRbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZsb2F0W10gc29ydChmbG9hdC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoZmxvYXRbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmbG9hdFtdIHNvcnQoZmxvYXRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoaW50W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnRbXSBzb3J0KGludC4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoaW50W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gc29ydChpbnRbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRS4uLiBhcnJheSkgewotCQlBcnJheXMuc29ydChhcnJheSk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10sIENvbXBhcmF0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRVtdIHNvcnQoRVtdIGFycmF5LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCk7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIEBzZWUgQXJyYXlzI3NvcnQoT2JqZWN0W10sIGludCwgaW50LCBDb21wYXJhdG9yKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEVbXSBzb3J0KEVbXSBhcnJheSwgaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGxvbmdbXSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmdbXSBzb3J0KGxvbmcuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KGxvbmdbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBsb25nW10gc29ydChsb25nW10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KHNob3J0W10pCi0JICovCi0JcHVibGljIHN0YXRpYyBzaG9ydFtdIHNvcnQoc2hvcnQuLi4gYXJyYXkpIHsKLQkJQXJyYXlzLnNvcnQoYXJyYXkpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBAc2VlIEFycmF5cyNzb3J0KHNob3J0W10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgc2hvcnRbXSBzb3J0KHNob3J0W10gYXJyYXksIGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCUFycmF5cy5zb3J0KGFycmF5LCBmcm9tSW5kZXgsIHRvSW5kZXgpOwotCQlyZXR1cm4gYXJyYXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBBcnJheVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjIyNmI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgZGVmaW5pdGlvbiBvZiBhbiBvYmplY3QgcGFpcmluZy4KLSAqIFRoZSBrZXkgaXMgaW1tdXRhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc29jaWF0aW9uPEssIFY+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRpb24ncyBrZXkuCi0JICovCi0JSyBnZXRLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRpb24ncyB2YWx1ZS4KLQkgKi8KLQlWIGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGFzc29jaWF0aW9uJ3MgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlWIHNldFZhbHVlKFYgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGFzc29jaWF0aW9ucycga2V5cyBhbmQgdmFsdWVzCi0JICogYXJlIGVxdWFsLgotCSAqLwotCWJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGhhc2ggY29kZSBiYXNlZCBvbiB0aGUgYXNzb2NpYXRpb24ncwotCSAqIGtleSBhbmQgdmFsdWUuCi0JICovCi0JaW50IGhhc2hDb2RlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0FzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjJlNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBjb21tYW5kIGV4ZWN1dG9yIHdpbGwgZGlzcGF0Y2ggY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQgaW4gYSBzZXBhcmF0ZQotICogdGhyZWFkLCBhbGxvd2luZyBjYWxscyB0byB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yI2V4ZWN1dGUoQ29tbWFuZCl9IHRvIHJldHVybgotICogaW1tZWRpYXRlbHkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZHMgc2hvdWxkIGhhbmRsZSBhbnkKLSAqIGV4Y2VwdGlvbiBhcHByb3ByaWF0ZWx5IChlLmcuIGxvZyB0aGUgZXhjZXB0aW9uIGFuZCByZXR1cm4gZ3JhY2VmdWxseSkgc28KLSAqIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQgY2FuIGNvbnRpbnVlIGV4ZWN1dGluZy4KLSAqLwotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcgotCWltcGxlbWVudHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLXsKLQkvKioKLQkgKiBUaGlzIGNvbW1hbmQgcXVldWUgaXMgc2hhcmVkIHdpdGggdGhlIGNvbW1hbmQgZXhlY3V0aW9uL2NvbnN1bWVyIHRocmVhZC4KLQkgKiBBZGRpbmcgYSBjb21tYW5kIHRvIGl0IHdpbGwgdHJpZ2dlciB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZCBieSB0aGUKLQkgKiBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQgb3IsIGlmIGFub3RoZXIgY29tbWFuZCBpcyBjdXJyZW50bHkgZXhlY3V0aW5nLAotCSAqIHRvIGV4ZWN1dGUgdGhlIG5ldyBjb21tYW5kIG9uY2UgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29tbWFuZCBoYXMKLQkgKiBmaW5pc2hlZCBleGVjdXRpbmcuCi0JICovCi0JZmluYWwgU3luY2hyb25pemVkUXVldWU8Q29tbWFuZD4gY29tbWFuZHMgPSBuZXcgU3luY2hyb25pemVkUXVldWU8Q29tbWFuZD4oKTsKLQotCS8qKgotCSAqIE1vc3Qgb2YgdGhlIHRocmVhZC1yZWxhdGVkIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byB0aGlzIGNvb3JkaW5hdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBjb25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpLgotCSAqIEFsbG93IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQgSkRLLWdlbmVyYXRlZCBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKCkgewotCQl0aGlzKFNpbXBsZVRocmVhZEZhY3RvcnkuaW5zdGFuY2UoKSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIGV4ZWN1dG9yLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkKHMpLgotCSAqIEFsbG93IHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQgSkRLLWdlbmVyYXRlZCBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSkgewotCQl0aGlzKHRocmVhZEZhY3RvcnksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBVc2Ugc2ltcGxlIEpESyB0aHJlYWQocykgZm9yIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykuCi0JICogQXNzaWduIHRoZSBjb21tYW5kIGV4ZWN1dGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IoU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJdGhpcyhTaW1wbGVUaHJlYWRGYWN0b3J5Lmluc3RhbmNlKCksIHRocmVhZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3luY2hyb25vdXMgY29tbWFuZCBleGVjdXRvci4KLQkgKiBBc3NpZ24gdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZChzKSB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcihUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvciA9IHRoaXMuYnVpbGRDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKHRocmVhZEZhY3RvcnksIHRocmVhZE5hbWUpOwotCX0KLQotCXByaXZhdGUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBidWlsZENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LCBTdHJpbmcgdGhyZWFkTmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IodGhpcy5idWlsZENvbnN1bWVyKCksIHRocmVhZEZhY3RvcnksIHRocmVhZE5hbWUpOwotCX0KLQotCXByaXZhdGUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lciBidWlsZENvbnN1bWVyKCkgewotCQlyZXR1cm4gbmV3IENvbnN1bWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhbGxiYWNrU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQnVpbGQgYW5kIHN0YXJ0IHRoZSBjb21tYW5kIGV4ZWN1dGlvbi9jb25zdW1lciB0aHJlYWQuCi0JICogPHA+Ci0JICogTm90ZTogV2UgZG9uJ3QgY2xlYXIgdGhlIGNvbW1hbmQgcXVldWUgaGVyZTsgc28gaWYgYSBjb21tYW5kIGhhcyBiZWVuCi0JICogYWRkZWQgdG8gdGhlIHF1ZXVlIDxlbT5iZWZvcmU8L2VtPiBnZXR0aW5nIGhlcmUsIHRoZSBmaXJzdCBjb21tYW5kIHdpbGwKLQkgKiBiZSBleGVjdXRlZCBwcm9tcHRseSAoYWxiZWl0LCBhc3luY2hyb25vdXNseSkuCi0JICogVGhlIGNvbW1hbmQgcXVldWUgd2lsbCBiZSBub24tZW1wdHkgaWY6PHVsPgotCSAqIDxsaT57QGxpbmsgI2V4ZWN1dGUoQ29tbWFuZCl9IHdhcyBjYWxsZWQgYWZ0ZXIgdGhlIGNvbW1hbmQgZXhlY3V0b3Igd2FzCi0JICogICAgIGNvbnN0cnVjdGVkIGJ1dCBiZWZvcmUge0BsaW5rICNzdGFydCgpfSB3YXMgY2FsbGVkOyBvcgotCSAqIDxsaT57QGxpbmsgI2V4ZWN1dGUoQ29tbWFuZCl9IHdhcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQKLQkgKiAgICAgYnV0IGJlZm9yZSB7QGxpbmsgI3N0YXJ0KCl9IHdhcyBjYWxsZWQgKHRvIHJlc3RhcnQgdGhlIGNvbW1hbmQgZXhlY3V0b3IpOyBvcgotCSAqIDxsaT57QGxpbmsgI3N0b3AoKX0gd2FzIGNhbGxlZCB3aGVuIHRoZXJlIHdlcmUgc3RpbGwgb3V0c3RhbmRpbmcgY29tbWFuZHMKLQkgKiAgICAgcmVtYWluaW5nIGluIHRoZSBjb21tYW5kIHF1ZXVlCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnN0YXJ0KCk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBzcGVjaWZpZWQgY29tbWFuZCBvbiB0aGUgY29tbWFuZCBxdWV1ZSwgdG8gYmUgY29uc3VtZWQgYnkgdGhlCi0JICogY29tbWFuZCBleGVjdXRpb24gdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMuY29tbWFuZHMuZW5xdWV1ZShjb21tYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcnJ1cHQgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIHRocmVhZCBzbyB0aGF0IGl0IHN0b3BzIGV4ZWN1dGluZyBhdCB0aGUKLQkgKiBlbmQgb2YgdGhlIGN1cnJlbnQgY29tbWFuZC4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgY29tbWFuZCBleGVjdXRpb24gdGhyZWFkIGlzIGZpbmlzaGVkIGV4ZWN1dGluZy4gSWYgYW55IHVuY2F1Z2h0Ci0JICogZXhjZXB0aW9ucyB3ZXJlIHRocm93biB3aGlsZSB0aGUgZXhlY3V0aW9uIHRocmVhZCB3YXMgZXhlY3V0aW5nLAotCSAqIHdyYXAgdGhlbSBpbiBhIGNvbXBvc2l0ZSBleGNlcHRpb24gYW5kIHRocm93IHRoZSBjb21wb3NpdGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCXRoaXMuY29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5zdG9wKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN1bWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXJ9Ci0JICogd2lsbCBleGVjdXRlIHRoZSBjb21tYW5kcyBlbnF1ZXVlZCBieSB0aGUgYXN5bmNocm9ub3VzIGNvbW1hbmQgZXhlY3V0b3IuCi0JICogSXQgd2lsbCB3YWl0IHVudGlsIHRoZSBzaGFyZWQgY29tbWFuZCBxdWV1ZSBpcyBub24tZW1wdHkgdG8gYmVnaW4gZXhlY3V0aW5nIHRoZQotCSAqIGNvbW1hbmRzIGluIHRoZSBxdWV1ZS4gT25jZSBhIGNvbWFuZCBpcyBleGVjdXRlZCwgdGhlIHRocmVhZCB3aWxsIHF1aWVzY2UgdW50aWwKLQkgKiBhbm90aGVyIGNvbW1hbmQgaXMgcGxhY2VkIGluIHRoZSBjb21tYW5kIHF1ZXVlLiBJZiBhIG5ldyBjb21tYW5kIGlzCi0JICogZW5xdWV1ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYW5vdGhlciBjb21tYW5kIChlaXRoZXIgcmVjdXJzaXZlbHkgYnkKLQkgKiB0aGUgY29tbWFuZCBpdHNlbGYgb3IgYnkgYW5vdGhlciB0aHJlYWQpLAotCSAqIHRoZSBuZXcgY29tbWFuZCB3aWxsIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50bHkKLQkgKiBleGVjdXRpbmcgY29tbWFuZCBpcyBmaW5pc2hlZC4KLQkgKiBTdG9wIHRoZSB0aHJlYWQgYnkgY2FsbGluZyB7QGxpbmsgVGhyZWFkI2ludGVycnVwdCgpfS4KLQkgKi8KLQljbGFzcyBDb25zdW1lcgotCQlpbXBsZW1lbnRzIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIKLQl7Ci0JCUNvbnN1bWVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBXYWl0IHVudGlsIGEgY29tbWFuZCBoYXMgYmVlbiBwbGFjZWQgaW4gdGhlIHF1ZXVlLgotCQkgKi8KLQkJcHVibGljIHZvaWQgd2FpdEZvclByb2R1Y2VyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCUFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci50aGlzLmNvbW1hbmRzLndhaXRVbnRpbE5vdEVtcHR5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogRXhlY3V0ZSB0aGUgZmlyc3QgY29tbWFuZCBpbiB0aGUgcXVldWUgYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCQkgKi8KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCUFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvci50aGlzLmNvbW1hbmRzLmRlcXVldWUoKS5leGVjdXRlKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmFnLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlY2Y5Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIGNvbGxlY3Rpb24gdGhhdCBhbGxvd3MgZHVwbGljYXRlIGVsZW1lbnRzLgotICogPHA+Ci0gKiBUaGUgPGNvZGU+QmFnPC9jb2RlPiBpbnRlcmZhY2UgcGxhY2VzIGFkZGl0aW9uYWwgc3RpcHVsYXRpb25zLAotICogYmV5b25kIHRob3NlIGluaGVyaXRlZCBmcm9tIHRoZSB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb259IGludGVyZmFjZSwKLSAqIG9uIHRoZSBjb250cmFjdHMgb2YgdGhlIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IGFuZCB7QGxpbmsgI2hhc2hDb2RlKCl9IG1ldGhvZHMuCi0gKiAKLSAqIEBzZWUgSGFzaEJhZwotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgQmFnPEU+IGV4dGVuZHMgamF2YS51dGlsLkNvbGxlY3Rpb248RT4gewotCi0JLyoqCi0JICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIGJhZyBmb3IgZXF1YWxpdHkuIFJldHVybnMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhbHNvIGEgYmFnLCB0aGUgdHdvIGJhZ3MKLQkgKiBoYXZlIHRoZSBzYW1lIHNpemUsIGFuZCBldmVyeSBtZW1iZXIgb2YgdGhlIHNwZWNpZmllZCBiYWcgaXMKLQkgKiBjb250YWluZWQgaW4gdGhpcyBiYWcgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgKG9yIGVxdWl2YWxlbnRseSwKLQkgKiBldmVyeSBtZW1iZXIgb2YgdGhpcyBiYWcgaXMgY29udGFpbmVkIGluIHRoZSBzcGVjaWZpZWQgYmFnIHdpdGggdGhlIHNhbWUKLQkgKiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMpLiBUaGlzIGRlZmluaXRpb24gZW5zdXJlcyB0aGF0IHRoZQotCSAqIGVxdWFscyBtZXRob2Qgd29ya3MgcHJvcGVybHkgYWNyb3NzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi0JICogYmFnIGludGVyZmFjZS4KLQkgKi8KLQlib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgYmFnLiBUaGUgaGFzaCBjb2RlIG9mIGEgYmFnIGlzCi0JICogZGVmaW5lZCB0byBiZSB0aGUgc3VtIG9mIHRoZSBoYXNoIGNvZGVzIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgYmFnLAotCSAqIHdoZXJlIHRoZSBoYXNoY29kZSBvZiBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQgaXMgZGVmaW5lZCB0byBiZSB6ZXJvLgotCSAqIFRoaXMgZW5zdXJlcyB0aGF0IDxjb2RlPmIxLmVxdWFscyhiMik8L2NvZGU+IGltcGxpZXMgdGhhdAotCSAqIDxjb2RlPmIxLmhhc2hDb2RlKCkgPT0gYjIuaGFzaENvZGUoKTwvY29kZT4gZm9yIGFueSB0d28gYmFncwotCSAqIDxjb2RlPmIxPC9jb2RlPiBhbmQgPGNvZGU+YjI8L2NvZGU+LCBhcyByZXF1aXJlZCBieSB0aGUgZ2VuZXJhbAotCSAqIGNvbnRyYWN0IG9mIHRoZSB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlKCl9IG1ldGhvZC4KLQkgKi8KLQlpbnQgaGFzaENvZGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IG9jY3VycyBpbiB0aGUgYmFnLgotCSAqLwotCWludCBjb3VudChPYmplY3Qgbyk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGltZXMgdG8gdGhlIGJhZy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYmFnIGNoYW5nZWQuCi0JICovCi0JYm9vbGVhbiBhZGQoRSBvLCBpbnQgY291bnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogZnJvbSB0aGUgYmFnLiBSZXR1cm4gd2hldGhlciB0aGUgYmFnIGNoYW5nZWQuCi0JICovCi0JYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGVhY2ggaXRlbSBpbiB0aGUgYmFnCi0JICogb25jZSBhbmQgb25seSBvbmNlLCBpcnJlc3BlY3RpdmUgb2YgaG93IG1hbnkgdGltZXMKLQkgKiB0aGUgaXRlbSB3YXMgYWRkZWQgdG8gdGhlIGJhZy4KLQkgKi8KLQlqYXZhLnV0aWwuSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBpdGVtcyBpbiB0aGUgYmFnLgotCSAqLwotCWludCB1bmlxdWVDb3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBhbiBlbnRyeSBmb3IgZWFjaCBpdGVtIGluIHRoZSBiYWcKLQkgKiBvbmNlIGFuZCBvbmx5IG9uY2UsIGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcwotCSAqIHRoZSBpdGVtIHdhcyBhZGRlZCB0byB0aGUgYmFnLiBUaGUgZW50cnkgd2lsbCBpbmRpY2F0ZSB0aGUgaXRlbSdzCi0JICogY291bnQuCi0JICovCi0JamF2YS51dGlsLkl0ZXJhdG9yPEVudHJ5PEU+PiBlbnRyaWVzKCk7Ci0KLQotCS8qKgotCSAqIEEgYmFnIGVudHJ5IChlbGVtZW50LWNvdW50IHBhaXIpLgotCSAqIFRoZSB7QGxpbmsgQmFnI2VudHJpZXMoKX0gbWV0aG9kIHJldHVybnMgYW4gaXRlcmF0b3Igd2hvc2UKLQkgKiBlbGVtZW50cyBhcmUgb2YgdGhpcyBjbGFzcy4gVGhlIDxlbT5vbmx5PC9lbT4gd2F5IHRvIG9idGFpbiBhIHJlZmVyZW5jZQotCSAqIHRvIGEgYmFnIGVudHJ5IGlzIGZyb20gdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLiBUaGVzZQotCSAqIDxjb2RlPkJhZy5FbnRyeTwvY29kZT4gb2JqZWN0cyBhcmUgdmFsaWQgPGVtPm9ubHk8L2VtPiBmb3IgdGhlIGR1cmF0aW9uCi0JICogb2YgdGhlIGl0ZXJhdGlvbjsgbW9yZSBmb3JtYWxseSwgdGhlIGJlaGF2aW9yIG9mIGEgYmFnIGVudHJ5IGlzCi0JICogdW5kZWZpbmVkIGlmIHRoZSBiYWNraW5nIGJhZyBoYXMgYmVlbiBtb2RpZmllZCBhZnRlciB0aGUgZW50cnkgd2FzCi0JICogcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLCBleGNlcHQgdGhyb3VnaCB0aGUge0BsaW5rICNzZXRDb3VudChpbnQpfQotCSAqIG9wZXJhdGlvbiBvbiB0aGUgYmFnIGVudHJ5LgotCSAqLwotCWludGVyZmFjZSBFbnRyeTxFPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZW50cnkncyBlbGVtZW50LgotCQkgKi8KLQkJRSBnZXRFbGVtZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBlbnRyeSdzIGNvdW50OyBpLmUuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGVudHJ5J3MgZWxlbWVudAotCQkgKiBvY2N1cnMgaW4gdGhlIGJhZy4KLQkJICogQHNlZSBCYWcjY291bnQoT2JqZWN0KQotCQkgKi8KLQkJaW50IGdldENvdW50KCk7Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgZW50cnkncyBjb3VudDsgaS5lLiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBlbnRyeSdzIGVsZW1lbnQKLQkJICogb2NjdXJzIGluIHRoZSBiYWcuIFRoZSBuZXcgY291bnQgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlci4KLQkJICogUmV0dXJuIHRoZSBwcmV2aW91cyBjb3VudCBvZiB0aGUgZW50cnkncyBlbGVtZW50LgotCQkgKiBOQjogVXNlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gdG8gc2V0IHRoZQotCQkgKiBjb3VudCB0byB6ZXJvLgotCQkgKi8KLQkJaW50IHNldENvdW50KGludCBjb3VudCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG9iamVjdDsKLQkJICogaS5lLiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIDxjb2RlPkJhZy5FbnRyeTwvY29kZT4gYW5kIGl0cwotCQkgKiBlbGVtZW50IGFuZCBjb3VudCBhcmUgdGhlIHNhbWUgYXMgdGhlIGVudHJ5J3MuCi0JCSAqLwotCQlib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBlbnRyeSdzIGhhc2ggY29kZS4KLQkJICovCi0JCWludCBoYXNoQ29kZSgpOwotCi0JfQotCi0KLQlmaW5hbCBjbGFzcyBFbXB0eTxFPiBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPiBpbXBsZW1lbnRzIEJhZzxFPiwgU2VyaWFsaXphYmxlIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBCYWcgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IEJhZzxUPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRW1wdHkoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gdW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBlbnRyaWVzKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjb3VudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKG8gPT0gdGhpcykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgQmFnPD8+KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiAoKEJhZzw/Pikgbykuc2l6ZSgpID09IDA7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpRmlsdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNWRjOGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIFVzZWQgYnkgdmFyaW91cyAicGx1Z2dhYmxlIiBjbGFzc2VzIHRvIGZpbHRlciBvYmplY3RzCi0gKiBpbiBib3RoIGRpcmVjdGlvbnMuCi0gKiAKLSAqIElmIGFueW9uZSBjYW4gY29tZSB1cCB3aXRoIGEgYmV0dGVyIGNsYXNzIG5hbWUKLSAqIGFuZC9vciBtZXRob2QgbmFtZSwgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgaXQuICB+Ymp2Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmlkaUZpbHRlcjxUPgotCWV4dGVuZHMgRmlsdGVyPFQ+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgImFjY2VwdGVkIiBieSB0aGUKLQkgKiAicmV2ZXJzZSIgZmlsdGVyLiBXaGF0IHRoYXQgbWVhbnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCWJvb2xlYW4gcmV2ZXJzZUFjY2VwdChUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsPFM+Ci0JCWltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaUZpbHRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gbm90aGluZyBpcyBmaWx0ZXJlZCAtIGV2ZXJ5dGhpbmcgaXMgYWNjZXB0ZWQKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFMgbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gbm90aGluZyBpcyAicmV2ZXJzZS1maWx0ZXJlZCIgLSBldmVyeXRoaW5nIGlzIGFjY2VwdGVkCi0JCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoUyBvKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBPcGFxdWU8Uz4KLQkJaW1wbGVtZW50cyBCaWRpRmlsdGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaUZpbHRlciBJTlNUQU5DRSA9IG5ldyBPcGFxdWUoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE9wYXF1ZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyBpcyBmaWx0ZXJlZCAtIG5vdGhpbmcgaXMgYWNjZXB0ZWQKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFMgbykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGV2ZXJ5dGhpbmcgaXMgInJldmVyc2UtZmlsdGVyZWQiIC0gbm90aGluZyBpcyBhY2NlcHRlZAotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KFMgbykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+Ci0JCWltcGxlbWVudHMgQmlkaUZpbHRlcjxTPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IEJpZGlGaWx0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoUyBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2ViZGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gdHJhbnNmb3JtIG9iamVjdHMKLSAqIGludG8gc3RyaW5ncyBhbmQgdmljZSB2ZXJzYS4KLSAqIAotICogSWYgYW55b25lIGNhbiBjb21lIHVwIHdpdGggYSBiZXR0ZXIgY2xhc3MgbmFtZQotICogYW5kL29yIG1ldGhvZCBuYW1lLCBJIHdvdWxkIGxvdmUgdG8gaGVhciBpdC4gIH5ianYKLSAqLwotcHVibGljIGludGVyZmFjZSBCaWRpU3RyaW5nQ29udmVydGVyPFQ+Ci0JZXh0ZW5kcyBTdHJpbmdDb252ZXJ0ZXI8VD4KLXsKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIGludG8gYW4gb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImNvbnZlcnQgdG8gb2JqZWN0IiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKiBUeXBpY2FsbHksIGlmIHRoZSBzdHJpbmcgaXMgbnVsbCwgbnVsbCBpcyByZXR1cm5lZC4KLQkgKi8KLQlUIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcyk7Ci0KLQotCWZpbmFsIGNsYXNzIERlZmF1bHQ8Uz4KLQkJaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSPiBCaWRpU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QncyAjdG9TdHJpbmcoKSByZXN1bHQKLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoUyBvKSB7Ci0JCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyBudWxsIDogby50b1N0cmluZygpOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIHN0cmluZwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gKFMpIHM7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4KLQkJaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gQmlkaVN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUyBjb252ZXJ0VG9PYmplY3QoU3RyaW5nIHMpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIEJvb2xlYW5Db252ZXJ0ZXIKLQkJaW1wbGVtZW50cyBCaWRpU3RyaW5nQ29udmVydGVyPEJvb2xlYW4+LCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiBJTlNUQU5DRSA9IG5ldyBCb29sZWFuQ29udmVydGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQmlkaVN0cmluZ0NvbnZlcnRlcjxCb29sZWFuPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgQm9vbGVhbkNvbnZlcnRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLyoqIFJldHVybiAidHJ1ZSIgaWYgdGhlIEJvb2xlYW4gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiAiZmFsc2UiLiAqLwotCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhCb29sZWFuIGIpIHsKLQkJCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLyoqIFJldHVybiBCb29sZWFuLlRSVUUgaWYgdGhlIHN0cmluZyBpcyAidHJ1ZSIgKGNhc2UtaW5zZW5zaXRpdmUpLCBvdGhlcndpc2UgcmV0dXJuIEJvb2xlYW4uRkFMU0UuICovCi0JCXB1YmxpYyBCb29sZWFuIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IEJvb2xlYW4udmFsdWVPZihzKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBJbnRlZ2VyQ29udmVydGVyCi0JCWltcGxlbWVudHMgQmlkaVN0cmluZ0NvbnZlcnRlcjxJbnRlZ2VyPiwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8SW50ZWdlcj4gSU5TVEFOQ0UgPSBuZXcgSW50ZWdlckNvbnZlcnRlcigpOwotCQlwdWJsaWMgc3RhdGljIEJpZGlTdHJpbmdDb252ZXJ0ZXI8SW50ZWdlcj4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEludGVnZXJDb252ZXJ0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8qKiBJbnRlZ2VyJ3MgI3RvU3RyaW5nKCkgd29ya3Mgd2VsbC4gKi8KLQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoSW50ZWdlciBpbnRlZ2VyKSB7Ci0JCQlyZXR1cm4gKGludGVnZXIgPT0gbnVsbCkgPyBudWxsIDogaW50ZWdlci50b1N0cmluZygpOwotCQl9Ci0JCS8qKiBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gYW4gSW50ZWdlciwgaWYgcG9zc2libGUuICovCi0JCXB1YmxpYyBJbnRlZ2VyIGNvbnZlcnRUb09iamVjdChTdHJpbmcgcykgewotCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IEludGVnZXIudmFsdWVPZihzKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTE2YWY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0JpZGlUcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW4gYm90aCBkaXJlY3Rpb25zLgotICogCi0gKiBJZiBhbnlvbmUgY2FuIGNvbWUgdXAgd2l0aCBhIGJldHRlciBjbGFzcyBuYW1lCi0gKiBhbmQvb3IgbWV0aG9kIG5hbWUsIEkgd291bGQgbG92ZSB0byBoZWFyIGl0LiAgfmJqdgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+Ci0JZXh0ZW5kcyBUcmFuc2Zvcm1lcjxUMSwgVDI+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSAicmV2ZXJzZS10cmFuc2Zvcm1lZCIgb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgInJldmVyc2UtdHJhbnNmb3JtIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZQotCSAqIGNvbnRyYWN0IGJldHdlZW4gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlUMSByZXZlcnNlVHJhbnNmb3JtKFQyIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsPFMxLCBTMj4KLQkJaW1wbGVtZW50cyBCaWRpVHJhbnNmb3JtZXI8UzEsIFMyPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxSMSwgUjI+IEJpZGlUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQlyZXR1cm4gKFMyKSBvOwotCQl9Ci0JCS8vIHNpbXBseSByZXR1cm4gdGhlIG9iamVjdCwgdW5jaGFuZ2VkCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgUzEgcmV2ZXJzZVRyYW5zZm9ybShTMiBvKSB7Ci0JCQlyZXR1cm4gKFMxKSBvOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCWZpbmFsIGNsYXNzIERpc2FibGVkPFMxLCBTMj4KLQkJaW1wbGVtZW50cyBCaWRpVHJhbnNmb3JtZXI8UzEsIFMyPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEJpZGlUcmFuc2Zvcm1lciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBCaWRpVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzEgcmV2ZXJzZVRyYW5zZm9ybShTMiBvKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQml0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBjYmY3Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9CaXRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEFzc29ydGVkIGJpdCB0b29scwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQml0VG9vbHMgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZsYWdJc1NldChpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZsYWdJc09mZihpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBvbmx5RmxhZ0lzU2V0KGludCBmbGFncywgaW50IGZsYWdUb0NoZWNrKSB7Ci0JCXJldHVybiBvbmx5RmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb25seUZsYWdJc09mZihpbnQgZmxhZ3MsIGludCBmbGFnVG9DaGVjaykgewotCQlyZXR1cm4gb25seUZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnVG9DaGVjayk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spID09IGZsYWdzVG9DaGVjazsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFsbCB0aGUgc3BlY2lmaWVkCi0JICogJ2ZsYWdzVG9DaGVjaycgdHVybmVkIG9mZi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYWxsRmxhZ3NBcmVPZmYoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCBmbGFnc1RvQ2hlY2spICYmIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCB+ZmxhZ3NUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIGFsbEZsYWdzQXJlT2ZmKGZsYWdzLCBmbGFnc1RvQ2hlY2spICYmIGFsbEZsYWdzQXJlU2V0KGZsYWdzLCB+ZmxhZ3NUb0NoZWNrKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQgZmxhZ3NUb0NoZWNrKSB7Ci0JCXJldHVybiAoZmxhZ3MgJiBmbGFnc1RvQ2hlY2spICE9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbnkgb25lIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyB0dXJuZWQgb2ZmLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhbnlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludCBmbGFnc1RvQ2hlY2spIHsKLQkJcmV0dXJuIChmbGFncyAmIGZsYWdzVG9DaGVjaykgIT0gZmxhZ3NUb0NoZWNrOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyBoYXMgYWxsIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlU2V0KGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBhbGwgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFsbEZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIGhhcyBPTkxZIHRoZSBzcGVjaWZpZWQKLQkgKiAnZmxhZ3NUb0NoZWNrJyBzZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZVNldChpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJaW50IGNvbWJpbmVkRmxhZ3MgPSBvckZsYWdzKGZsYWdzVG9DaGVjayk7Ci0JCXJldHVybiBhbGxGbGFnc0FyZVNldChmbGFncywgY29tYmluZWRGbGFncykgJiYgYWxsRmxhZ3NBcmVPZmYoZmxhZ3MsIH5jb21iaW5lZEZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIE9OTFkgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9ubHlGbGFnc0FyZU9mZihpbnQgZmxhZ3MsIGludC4uLiBmbGFnc1RvQ2hlY2spIHsKLQkJaW50IGNvbWJpbmVkRmxhZ3MgPSBvckZsYWdzKGZsYWdzVG9DaGVjayk7Ci0JCXJldHVybiBhbGxGbGFnc0FyZU9mZihmbGFncywgY29tYmluZWRGbGFncykgJiYgYWxsRmxhZ3NBcmVTZXQoZmxhZ3MsIH5jb21iaW5lZEZsYWdzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gYW55RmxhZ3NBcmVTZXQoaW50IGZsYWdzLCBpbnQuLi4gZmxhZ3NUb0NoZWNrKSB7Ci0JCWZvciAoaW50IGkgPSBmbGFnc1RvQ2hlY2subGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChhbnlGbGFnc0FyZVNldChmbGFncywgZmxhZ3NUb0NoZWNrW2ldKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkICdmbGFncycgaGFzIGFueSBvbmUgb2YgdGhlIHNwZWNpZmllZAotCSAqICdmbGFnc1RvQ2hlY2snIHR1cm5lZCBvZmYuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGFueUZsYWdzQXJlT2ZmKGludCBmbGFncywgaW50Li4uIGZsYWdzVG9DaGVjaykgewotCQlmb3IgKGludCBpID0gZmxhZ3NUb0NoZWNrLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoYW55RmxhZ3NBcmVPZmYoZmxhZ3MsIGZsYWdzVG9DaGVja1tpXSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogT1IgYWxsIHRoZSBzcGVjaWZpZWQgJ2ZsYWdzJyB0b2dldGhlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgb3JGbGFncyhpbnQuLi4gZmxhZ3MpIHsKLQkJaW50IGxhc3QgPSBmbGFncy5sZW5ndGggLSAxOwotCQlpbnQgcmVzdWx0ID0gZmxhZ3NbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdCB8PSBmbGFnc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFORCBhbGwgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIHRvZ2V0aGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBhbmRGbGFncyhpbnQuLi4gZmxhZ3MpIHsKLQkJaW50IGxhc3QgPSBmbGFncy5sZW5ndGggLSAxOwotCQlpbnQgcmVzdWx0ID0gZmxhZ3NbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdCAmPSBmbGFnc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFhPUiBhbGwgdGhlIHNwZWNpZmllZCAnZmxhZ3MnIHRvZ2V0aGVyIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCB4b3JGbGFncyhpbnQuLi4gZmxhZ3MpIHsKLQkJaW50IGxhc3QgPSBmbGFncy5sZW5ndGggLSAxOwotCQlpbnQgcmVzdWx0ID0gZmxhZ3NbbGFzdF07Ci0JCWZvciAoaW50IGkgPSBsYXN0OyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdCBePSBmbGFnc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQml0VG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDExNDI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5SZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYSBmbGFnIHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkKLSAqIHRoZSByZWNpcGllbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQm9vbGVhblJlZmVyZW5jZQotCWV4dGVuZHMgUmVhZE9ubHlCb29sZWFuUmVmZXJlbmNlCi17Ci0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gc2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIHRoZSBOT1Qgb2YgaXRzIGN1cnJlbnQgdmFsdWUuCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBmbGlwKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gc2V0Tm90KGJvb2xlYW4gdik7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBzZXRUcnVlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gc2V0RmFsc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0Jvb2xlYW5Ub29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4M2MwZjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQm9vbGVhblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQXNzb3J0ZWQgIkNhcGl0YWwtQiBCb29sZWFuIiBvcGVyYXRpb25zLgotICovCi0gLy8gY29tbWVudGVkIGNvZGUgaXMganVzdCBwbGF5aW5nIGFyb3VuZCB3aXRoIGJ1aWxkaW5nICpldmVyeXRoaW5nKiBmcm9tIE5BTkQKLXB1YmxpYyBmaW5hbCBjbGFzcyBCb29sZWFuVG9vbHMgewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCBCb29sZWFuLgotCSAqIEJvb2xlYW4jbm90KCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gbm90KEJvb2xlYW4gYikgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIGIuYm9vbGVhblZhbHVlKCkpOwotLy8JCXJldHVybiBuYW5kKGIsIGIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQU5EIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNhbmQoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gYW5kKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihiMS5ib29sZWFuVmFsdWUoKSAmJiBiMi5ib29sZWFuVmFsdWUoKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCXJldHVybiBuYW5kKG5hbmQsIG5hbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgT1Igb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI29yKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihiMS5ib29sZWFuVmFsdWUoKSB8fCBiMi5ib29sZWFuVmFsdWUoKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCUJvb2xlYW4geG9yID0gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotLy8JCUJvb2xlYW4gYW5kID0gbmFuZChuYW5kLCBuYW5kKTsKLS8vCQlCb29sZWFuIG5hbmQyID0gbmFuZCh4b3IsIGFuZCk7Ci0vLwkJcmV0dXJuIG5hbmQobmFuZCh4b3IsIG5hbmQyKSwgbmFuZChhbmQsIG5hbmQyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBYT1Igb2YgdGhlIHNwZWNpZmllZCBCb29sZWFucy4KLQkgKiBCb29sZWFuI3hvcihCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiB4b3IoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gYW5kKG9yKGIxLCBiMiksIG5hbmQoYjEsIGIyKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCXJldHVybiBuYW5kKG5hbmQoYjEsIG5hbmQpLCBuYW5kKGIyLCBuYW5kKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBOQU5EIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNuYW5kKEJvb2xlYW4pCi0JICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIG5hbmQoQm9vbGVhbiBiMSwgQm9vbGVhbiBiMikgewotCQlyZXR1cm4gbm90KGFuZChiMSwgYjIpKTsKLS8vCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIChiMS5ib29sZWFuVmFsdWUoKSAmJiBiMi5ib29sZWFuVmFsdWUoKSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgTk9SIG9mIHRoZSBzcGVjaWZpZWQgQm9vbGVhbnMuCi0JICogQm9vbGVhbiNub3IoQm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEJvb2xlYW4gbm9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIG5vdChvcihiMSwgYjIpKTsKLS8vCQlCb29sZWFuIG5hbmQgPSBuYW5kKGIxLCBiMik7Ci0vLwkJQm9vbGVhbiB4b3IgPSBuYW5kKG5hbmQoYjEsIG5hbmQpLCBuYW5kKGIyLCBuYW5kKSk7Ci0vLwkJQm9vbGVhbiBhbmQgPSBuYW5kKG5hbmQsIG5hbmQpOwotLy8JCUJvb2xlYW4gbmFuZDIgPSBuYW5kKHhvciwgYW5kKTsKLS8vCQlCb29sZWFuIG5hbmQzID0gbmFuZChuYW5kKHhvciwgbmFuZDIpLCBuYW5kKGFuZCwgbmFuZDIpKTsKLS8vCQlyZXR1cm4gbmFuZChuYW5kMywgbmFuZDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgWE5PUiBvZiB0aGUgc3BlY2lmaWVkIEJvb2xlYW5zLgotCSAqIEJvb2xlYW4jeG5vcihCb29sZWFuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQm9vbGVhbiB4bm9yKEJvb2xlYW4gYjEsIEJvb2xlYW4gYjIpIHsKLQkJcmV0dXJuIG5vdCh4b3IoYjEsIGIyKSk7Ci0vLwkJQm9vbGVhbiBuYW5kID0gbmFuZChiMSwgYjIpOwotLy8JCUJvb2xlYW4geG9yID0gbmFuZChuYW5kKGIxLCBuYW5kKSwgbmFuZChiMiwgbmFuZCkpOwotLy8JCXJldHVybiBuYW5kKHhvciwgeG9yKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEJvb2xlYW5Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9DbGFzc05hbWUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NsYXNzTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY0YmUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NsYXNzTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIEphdmEgY2xhc3MgbmFtZXMgYXMgcmV0dXJuZWQgYnkKLSAqIHtAbGluayBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpfS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzTmFtZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0lEX0NMQVNTX05BTUUgPSBSZWZsZWN0aW9uVG9vbHMuVk9JRF9DTEFTUy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUgPSBSZWZsZWN0aW9uVG9vbHMuVk9JRF9XUkFQUEVSX0NMQVNTLmdldE5hbWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSA9ICdMJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX05BTUVfREVMSU1JVEVSID0gJzsnOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhbiBhcnJheSB0eXBlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FycmF5KFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gJ1snOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudFR5cGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGRlcHRoID0gZ2V0QXJyYXlEZXB0aChjbGFzc05hbWUpOwotCQlpZiAoZGVwdGggPT0gMCkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJqYXZhLmxhbmcuT2JqZWN0IiBvciAiaW50IgotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVOYW1lXyhjbGFzc05hbWUsIGRlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBhcnJheSBkZXB0aCBpcyBub3QgemVybwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVfKFN0cmluZyBjbGFzc05hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCWludCBsYXN0ID0gY2xhc3NOYW1lLmxlbmd0aCgpIC0gMTsKLQkJaWYgKGNsYXNzTmFtZS5jaGFyQXQoYXJyYXlEZXB0aCkgPT0gUkVGRVJFTkNFX0NMQVNTX0NPREUpIHsKLQkJCS8vIHRoZSBuYW1lIGlzIGluIHRoZSBmb3JtOiAiW1tbTGphdmEubGFuZy5PYmplY3Q7IgotCQkJcmV0dXJuIGNsYXNzTmFtZS5zdWJzdHJpbmcoYXJyYXlEZXB0aCArIDEsIGxhc3QpOwkvLyBkcm9wIHRoZSB0cmFpbGluZyAnOycKLQkJfQotCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0kiCi0JCXJldHVybiBmb3JDb2RlKGNsYXNzTmFtZS5jaGFyQXQobGFzdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEFycmF5RGVwdGgoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoY2xhc3NOYW1lLmNoYXJBdChkZXB0aCkgPT0gJ1snKSB7Ci0JCQlkZXB0aCsrOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcydzIGNvbXBvbmVudCB0eXBlLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbiBhcnJheSB0eXBlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJc3dpdGNoIChnZXRBcnJheURlcHRoKGNsYXNzTmFtZSkpIHsKLQkJCWNhc2UgMDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWNhc2UgMToKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVOYW1lXyhjbGFzc05hbWUsIDEpOwotCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzJ3Mgc2ltcGxlIG5hbWUuCi0JICogUmV0dXJuIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFub255bW91cy4KLQkgKiA8cD4KLQkgKiBUaGUgc2ltcGxlIG5hbWUgb2YgYW4gYXJyYXkgdHlwZSBpcyB0aGUgc2ltcGxlIG5hbWUgb2YgdGhlCi0JICogY29tcG9uZW50IHR5cGUgd2l0aCA8Y29kZT4iW10iPC9jb2RlPiBhcHBlbmRlZC4gSW4gcGFydGljdWxhciwKLQkgKiB0aGUgc2ltcGxlIG5hbWUgb2YgYW4gYXJyYXkgdHlwZSB3aG9zZSBjb21wb25lbnQgdHlwZSBpcwotCSAqIGFub255bW91cyBpcyBzaW1wbHkgPGNvZGU+IltdIjwvY29kZT4uCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBpc0FycmF5KGNsYXNzTmFtZSkgPwotCQkJCWdldFNpbXBsZU5hbWUoZ2V0Q29tcG9uZW50VHlwZU5hbWUoY2xhc3NOYW1lKSkgKyAiW10iIDogLy8kTk9OLU5MUy0xJAotCQkJCWdldFNpbXBsZU5hbWVfKGNsYXNzTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogc3BlY2lmaWVkIGNsYXNzIGlzIG5vdCBhbiBhcnJheSB0eXBlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNpbXBsZU5hbWVfKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaW50IGluZGV4ID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCckJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgeyAgLy8gInRvcC1sZXZlbCIgY2xhc3MgLSBzdHJpcCBwYWNrYWdlIG5hbWUKLQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCX0KLQotCQlpbnQgbGVuID0gY2xhc3NOYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gKytpbmRleDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoICEgY2hhcklzQXNjaWlEaWdpdChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGkpOyAgLy8gIm1lbWJlciIgb3IgImxvY2FsIiBjbGFzcwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAnJCcgYXJlIEFTQ0lJIGRpZ2l0cyAoImFub255bW91cyIgY2xhc3MpCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNsYXNzJ3MgcGFja2FnZSBuYW1lIChlLmcuCi0JICogPGNvZGU+ImphdmEubGFuZy5PYmplY3QiPC9jb2RlPiByZXR1cm5zCi0JICogPGNvZGU+ImphdmEubGFuZyI8L2NvZGU+KS4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXM6PHVsPgotCSAqIDxsaT5pbiB0aGUgImRlZmF1bHQiIHBhY2thZ2UKLQkgKiA8bGk+YW4gYXJyYXkgY2xhc3MKLQkgKiA8bGk+YSBwcmltdGl2ZSBjbGFzcwotCSAqIDwvdWw+Ci0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0UGFja2FnZSgpCi0JICogQHNlZSBqYXZhLmxhbmcuUGFja2FnZSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWludCBsYXN0UGVyaW9kID0gY2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCXJldHVybiAobGFzdFBlcmlvZCA9PSAtMSkgPyAiIiA6IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInRvcC1sZXZlbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJtZW1iZXIiLCAibG9jYWwiLCBvciAiYW5vbnltb3VzIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgSkRLIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGRvZXMgTk9UIGNvbnRhaW4gYSA8Y29kZT4nJCc8L2NvZGU+KS4KLQkgKiBBICJ0b3AtbGV2ZWwiIGNsYXNzIGNhbiBiZSBlaXRoZXIgdGhlICJwcmltYXJ5IiAocHVibGljKSBjbGFzcyBkZWZpbmVkCi0JICogaW4gYSBmaWxlL2NvbXBpbGF0aW9uIHVuaXQgKGkuZS4gdGhlIGNsYXNzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBpdHMKLQkgKiBmaWxlJ3Mgc2ltcGxlIGJhc2UgbmFtZSkgb3IgYSAibm9uLXByaW1hcnkiIChwYWNrYWdlIHZpc2libGUpIGNsYXNzCi0JICogKGkuZS4gdGhlIG90aGVyIHRvcC1sZXZlbCBjbGFzc2VzIGRlZmluZWQgaW4gYSBmaWxlKS4KLQkgKiBBICJ0b3AtbGV2ZWwiIGNsYXNzIGNhbiBjb250YWluIGFueSBvZiB0aGUgb3RoZXIgdHlwZXMgb2YgY2xhc3Nlcy4gCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVG9wTGV2ZWwoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZS5sYXN0SW5kZXhPZignJCcpID09IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibWVtYmVyIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBKREsgbmFtaW5nIGNvbnZlbnRpb24gKGkuZS4gdGhlIGNsYXNzCi0JICogbmFtZSBlbmRzIHdpdGggYSA8Y29kZT4nJCc8L2NvZGU+IGZvbGxvd2VkIGJ5IGEgbGVnYWwgY2xhc3MgbmFtZTsgZS5nLgotCSAqIDxjb2RlPiJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzJE1lbWJlckNsYXNzIjwvY29kZT4pLgotCSAqIEEgIm1lbWJlciIgY2xhc3MgY2FuIGJlIGVpdGhlciAibmVzdGVkIiAoc3RhdGljKSBvciAiaW5uZXIiOwotCSAqIGJ1dCB0aGVyZSBpcyBubyB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGZyb20gdGhlIGNsYXNzJ3MgbmFtZS4KLQkgKiBBICJtZW1iZXIiIGNsYXNzIGNhbiBjb250YWluICJsb2NhbCIsICJhbm9ueW1vdXMiLCBvciBvdGhlcgotCSAqICJtZW1iZXIiIGNsYXNzZXM7IGFuZCB2aWNlLXZlcnNhLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01lbWJlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciB0aGUgZG9sbGFyIHNpZ24gY2Fubm90IGJlIGFuIEFTQ0lJIGRpZ2l0Ci0JCXJldHVybiAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdCgrK2luZGV4KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJsb2NhbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIEpESyBuYW1pbmcgY29udmVudGlvbiAoaS5lLiB0aGUgY2xhc3MgbmFtZQotCSAqIGVuZHMgd2l0aCA8Y29kZT4iJG5ublhYWCI8L2NvZGU+LAotCSAqIHdoZXJlIHRoZSA8Y29kZT4nJCc8L2NvZGU+IGlzCi0JICogZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgbnVtZXJpYyBkaWdpdHMgd2hpY2ggYXJlIGZvbGxvd2VkIGJ5IHRoZQotCSAqIGxvY2FsIGNsYXNzIG5hbWU7IGUuZy4gPGNvZGU+IlRvcExldmVsQ2xhc3MkMUxvY2FsQ2xhc3MiPC9jb2RlPikuCi0JICogQSAibG9jYWwiIGNsYXNzIGNhbiBjb250YWluICJtZW1iZXIiLCAiYW5vbnltb3VzIiwgb3Igb3RoZXIKLQkgKiAibG9jYWwiIGNsYXNzZXM7IGFuZCB2aWNlLXZlcnNhLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignJCcpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsJLy8gInRvcC1sZXZlbCIgY2xhc3MKLQkJfQotCQlpZiAoICEgY2hhcklzQXNjaWlEaWdpdChjbGFzc05hbWUuY2hhckF0KCsraW5kZXgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gIm1lbWJlciIgY2xhc3MKLQkJfQotCQlpbnQgbGVuID0gY2xhc3NOYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gKytpbmRleDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoICEgY2hhcklzQXNjaWlEaWdpdChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAnJCcgYXJlIEFTQ0lJIGRpZ2l0cyAoImFub255bW91cyIgY2xhc3MpCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFuICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIGFzIG9wcG9zZWQgdG8gYSAidG9wLWxldmVsIiwgIm1lbWJlciIsIG9yICJsb2NhbCIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIEpESyBuYW1pbmcgY29udmVudGlvbiAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGVuZHMgd2l0aCA8Y29kZT4iJG5ubiI8L2NvZGU+IHdoZXJlIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZQotCSAqIGxhc3QgPGNvZGU+JyQnPC9jb2RlPiBhcmUgQVNDSUkgbnVtZXJpYyBkaWdpdHM7Ci0JICogZS5nLiA8Y29kZT4iVG9wTGV2ZWxDbGFzcyQxIjwvY29kZT4pLgotCSAqIEFuICJhbm9ueW1vdXMiIGNsYXNzIGNhbiBjb250YWluICJtZW1iZXIiLCAibG9jYWwiLCBvciBvdGhlcgotCSAqICJhbm9ueW1vdXMiIGNsYXNzZXM7IGFuZCB2aWNlLXZlcnNhLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Fub255bW91cyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChpc0FycmF5KGNsYXNzTmFtZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaW5kZXggPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJyQnKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7CS8vICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdCgrK2luZGV4KSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vICJtZW1iZXIiIGNsYXNzCi0JCX0KLQkJaW50IGxlbiA9IGNsYXNzTmFtZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9ICsraW5kZXg7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCAhIGNoYXJJc0FzY2lpRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChpKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyAibG9jYWwiIGNsYXNzCi0JCQl9Ci0JCX0KLQkJLy8gYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlICckJyBhcmUgQVNDSUkgZGlnaXRzICgiYW5vbnltb3VzIiBjbGFzcykKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIENoYXJhY3RlciNpc0RpZ2l0KGNoYXIpfSByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGZvciBzb21lIG5vbi1BU0NJSQotCSAqIGRpZ2l0cy4gVGhpcyBtZXRob2QgZG9lcyBub3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjaGFySXNBc2NpaURpZ2l0KGNoYXIgYykgewotCQlyZXR1cm4gKCcwJyA8PSBjKSAmJiAoYyA8PSAnOScpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAicmVmZXJlbmNlIgotCSAqIGNsYXNzIChpLmUuIG5laXRoZXIgPGNvZGU+dm9pZDwvY29kZT4gbm9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVmZXJlbmNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuICEgaXNQcmltaXRpdmUoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gPGNvZGU+dm9pZDwvY29kZT4gb3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiA8Y29kZT5ib29sZWFuPC9jb2RlPiwgPGNvZGU+aW50PC9jb2RlPiwgPGNvZGU+ZmxvYXQ8L2NvZGU+LCBldGMuKS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoaXNBcnJheShjbGFzc05hbWUpIHx8IChjbGFzc05hbWUubGVuZ3RoKCkgPiBSZWZsZWN0aW9uVG9vbHMuTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJZm9yIChSZWZsZWN0aW9uVG9vbHMuUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFJlZmxlY3Rpb25Ub29scy5QUklNSVRJVkVTKSB7Ci0JCQlpZiAoY2xhc3NOYW1lLmVxdWFscyhwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhIHByaW1pdGl2ZSB3cmFwcGVyCi0JICogY2xhc3MgKGkuZS4gPGNvZGU+amF2YS5sYW5nLlZvaWQ8L2NvZGU+IG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlCi0JICogdmFyaWFibGUgd3JhcHBlciBjbGFzc2VzLCA8Y29kZT5qYXZhLmxhbmcuQm9vbGVhbjwvY29kZT4sCi0JICogPGNvZGU+amF2YS5sYW5nLkludGVnZXI8L2NvZGU+LCA8Y29kZT5qYXZhLmxhbmcuRmxvYXQ8L2NvZGU+LCBldGMuKS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVXcmFwcGVyKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGlzQXJyYXkoY2xhc3NOYW1lKSB8fCAoY2xhc3NOYW1lLmxlbmd0aCgpID4gUmVmbGVjdGlvblRvb2xzLk1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJZm9yIChSZWZsZWN0aW9uVG9vbHMuUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFJlZmxlY3Rpb25Ub29scy5QUklNSVRJVkVTKSB7Ci0JCQlpZiAoY2xhc3NOYW1lLmVxdWFscyhwcmltaXRpdmUud3JhcHBlckNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gPGNvZGU+Ym9vbGVhbjwvY29kZT4sIDxjb2RlPmludDwvY29kZT4sIDxjb2RlPmZsb2F0PC9jb2RlPiwgZXRjLiwKLQkgKiBidXQgbm90IDxjb2RlPnZvaWQ8L2NvZGU+KS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8Y29kZT52b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBpc1ByaW1pdGl2ZShjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Cb29sZWFuPC9jb2RlPiwKLQkgKiA8Y29kZT5qYXZhLmxhbmcuSW50ZWdlcjwvY29kZT4sIDxjb2RlPmphdmEubGFuZy5GbG9hdDwvY29kZT4sIGV0Yy4sCi0JICogYnV0IG5vdCA8Y29kZT5qYXZhLmxhbmcuVm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBpc1ByaW1pdGl2ZVdyYXBwZXIoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByaW1pdGl2ZSB3cmFwcGVyIGNsYXNzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAotCSAqIHByaW1pdGl2ZSBjbGFzcy4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgbm90IGEgcHJpbWl0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdyYXBwZXJDbGFzc05hbWUoU3RyaW5nIHByaW1pdGl2ZUNsYXNzTmFtZSkgewotCQlmb3IgKFJlZmxlY3Rpb25Ub29scy5QcmltaXRpdmUgcHJpbWl0aXZlIDogUmVmbGVjdGlvblRvb2xzLlBSSU1JVElWRVMpIHsKLQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMocHJpbWl0aXZlQ2xhc3NOYW1lKSkgewotCQkJCXJldHVybiBwcmltaXRpdmUud3JhcHBlckNsYXNzLmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByaW1pdGl2ZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBwcmltaXRpdmUgd3JhcHBlciBjbGFzcy4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgd3JhcHBlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmltaXRpdmVDbGFzc05hbWUoU3RyaW5nIHByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWUpIHsKLQkJZm9yIChSZWZsZWN0aW9uVG9vbHMuUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFJlZmxlY3Rpb25Ub29scy5QUklNSVRJVkVTKSB7Ci0JCQlpZiAocHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCkuZXF1YWxzKHByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHByaW1pdGl2ZS5qYXZhQ2xhc3MuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHdvIGNsYXNzIG5hbWVzIGFyZSBlcXVpdmFsZW50LCBnaXZlbiBhdXRvYm94aW5nLgotCSAqIChlLmcuICJqYXZhLmxhbmcuSW50ZWdlciIgYW5kICJpbnQiIHNob3VsZCBiZSBlcXVpdmFsZW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVBdXRvYm94RXF1aXZhbGVudHMoU3RyaW5nIGNsYXNzTmFtZTEsIFN0cmluZyBjbGFzc05hbWUyKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChjbGFzc05hbWUxLCBjbGFzc05hbWUyKQotCQkJfHwgVG9vbHMudmFsdWVzQXJlRXF1YWwoZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKGNsYXNzTmFtZTEpLCBjbGFzc05hbWUyKQotCQkJfHwgVG9vbHMudmFsdWVzQXJlRXF1YWwoZ2V0V3JhcHBlckNsYXNzTmFtZShjbGFzc05hbWUxKSwgY2xhc3NOYW1lMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1pdGl2ZSBjb2RlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNvZGUKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JDb2RlKGludCBjbGFzc0NvZGUpIHsKLQkJcmV0dXJuIGZvckNvZGUoKGNoYXIpIGNsYXNzQ29kZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlDbGFzczw/PiBwcmltaXRpdmVDbGFzcyA9IFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvckNvZGUoY2xhc3NDb2RlKTsKLQkJcmV0dXJuIChwcmltaXRpdmVDbGFzcyA9PSBudWxsKSA/IG51bGwgOiBwcmltaXRpdmVDbGFzcy5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBjbGFzcy4KLQkgKiBSZXR1cm4gPGNvZGU+MDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgZ2V0Q29kZUZvckNsYXNzTmFtZShTdHJpbmcgcHJpbWl0aXZlQ2xhc3NOYW1lKSB7Ci0JCWlmICgoICEgaXNBcnJheShwcmltaXRpdmVDbGFzc05hbWUpKSAmJiAocHJpbWl0aXZlQ2xhc3NOYW1lLmxlbmd0aCgpIDw9IFJlZmxlY3Rpb25Ub29scy5NQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSkgewotCQkJZm9yIChSZWZsZWN0aW9uVG9vbHMuUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFJlZmxlY3Rpb25Ub29scy5QUklNSVRJVkVTKSB7Ci0JCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhwcmltaXRpdmVDbGFzc05hbWUpKSB7Ci0JCQkJCXJldHVybiBwcmltaXRpdmUuY29kZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3RhdGljIHZvaWQgYXBwZW5kKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJc2IuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBwcmVzc2VkIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDbGFzc05hbWUoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ2xhc3NwYXRoLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmMDNiZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9DbGFzc3BhdGguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiA8Y29kZT5DbGFzc3BhdGg8L2NvZGU+IG1vZGVscyBhIEphdmEgY2xhc3NwYXRoLCB3aGljaCBjb25zaXN0cyBvZiBhIGxpc3Qgb2YKLSAqIHtAbGluayBFbnRyeX1zLCBlYWNoIG9mIHdoaWNoIGNvbnRhaW4gSmF2YSBjbGFzc2VzLiBUaGUgY2xhc3NwYXRoIGNhbiByZXR1cm4KLSAqIHRoZSBuYW1lcyBvZiBjbGFzc2VzIGZvdW5kIGluIGl0IGV0Yy4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHN0YXRpYwotICogY29udmVuaWVuY2UgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2UgdG8gY29uc3RydWN0IDxjb2RlPkNsYXNzcGF0aDwvY29kZT5zCi0gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBKYXZhIGNsYXNzcGF0aCBldGMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc3BhdGgKLQlpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgZW50cmllcyBpbiB0aGUgY2xhc3NwYXRoICovCi0JcHJpdmF0ZSBmaW5hbCBFbnRyeVtdIGVudHJpZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmYWN0b3J5IG1ldGhvZHMgZm9yICJzdGFuZGFyZCIgY2xhc3NwYXRocyAqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhICJib290IiBjbGFzc3BhdGguIFRoaXMgaW5jbHVkZXMgPGNvZGU+cnQuamFyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzcGF0aCBib290Q2xhc3NwYXRoKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChTeXN0ZW0uZ2V0UHJvcGVydHkoInN1bi5ib290LmNsYXNzLnBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgInZpcnR1YWwgY2xhc3NwYXRoIiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgamFycwotCSAqIHRoYXQgd291bGQgYmUgdXNlZCBieSB0aGUgSmF2YSBFeHRlbnNpb24gTWVjaGFuaXNtLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3NwYXRoIGphdmFFeHRlbnNpb25DbGFzc3BhdGgoKSB7Ci0JCUZpbGVbXSBkaXJzID0gamF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCk7Ci0JCUxpc3Q8U3RyaW5nPiBqYXJGaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChGaWxlIGRpciA6IGRpcnMpIHsKLQkJCWlmIChkaXIuaXNEaXJlY3RvcnkoKSkgewotCQkJCWFkZEphckZpbGVOYW1lc1RvKGRpciwgamFyRmlsZU5hbWVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChqYXJGaWxlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSAic3lzdGVtIiBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggamF2YUNsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBDbGFzc3BhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVucmV0b3VjaGVkICJjb21wbGV0ZSIgY2xhc3NwYXRoLgotCSAqIFRoaXMgaW5jbHVkZXMgdGhlIGJvb3QgY2xhc3NwYXRoLCB0aGUgSmF2YSBFeHRlbnNpb24KLQkgKiBNZWNoYW5pc20gY2xhc3NwYXRoLCBhbmQgdGhlIG5vcm1hbCAic3lzdGVtIiBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggY29tcGxldGVDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3NwYXRoKG5ldyBDbGFzc3BhdGhbXSB7Ci0JCQkJYm9vdENsYXNzcGF0aCgpLAotCQkJCWphdmFFeHRlbnNpb25DbGFzc3BhdGgoKSwKLQkJCQlqYXZhQ2xhc3NwYXRoKCkKLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY2xhc3NwYXRoIHRoYXQgY29udGFpbnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzc3BhdGggY2xhc3NwYXRoRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChsb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQl9Ci0KLQotCS8vICoqKioqIGZpbGUgPT4gY2xhc3MgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIG5hbWUgdG8gYSBjbGFzcyBuYW1lOyB0aGlzIHdpbGwgd29yayBmb3IKLQkgKiBhbnkgZmlsZSB0aGF0IGhhcyBhIHNpbmdsZSBleHRlbnNpb24gYmV5b25kIHRoZSBiYXNlCi0JICogY2xhc3MgbmFtZTo8dWw+Ci0JICogPGxpPjxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4gaXMgY29udmVydGVkIHRvIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuamF2YSI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0byA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc05hbWUoU3RyaW5nIGNsYXNzRmlsZU5hbWUpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbihjbGFzc0ZpbGVOYW1lKTsKLQkJLy8gZG8gdGhpcyBmb3IgYXJjaGl2ZSBlbnRyeSBuYW1lcwotCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgnLycsICcuJyk7Ci0JCS8vIGRvIHRoaXMgZm9yIE8vUy1zcGVjaWZpYyBmaWxlIG5hbWVzCi0JCWlmIChGaWxlLnNlcGFyYXRvckNoYXIgIT0gJy8nKSB7Ci0JCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcuJyk7Ci0JCX0KLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgZmlsZSB0byBhIGNsYXNzIG5hbWU7Ci0JICogZS5nLiA8Y29kZT5GaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0NsYXNzTmFtZShGaWxlIGNsYXNzRmlsZSkgewotCQlyZXR1cm4gY29udmVydFRvQ2xhc3NOYW1lKGNsYXNzRmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIG5hbWUgdG8gYSBjbGFzczsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+amF2YS5sYW5nLlN0cmluZy5jbGFzczwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjb252ZXJ0VG9DbGFzcyhTdHJpbmcgY2xhc3NGaWxlTmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjb252ZXJ0VG9DbGFzc05hbWUoY2xhc3NGaWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSByZWxhdGl2ZSBmaWxlIHRvIGEgY2xhc3M7Ci0JICogZS5nLiA8Y29kZT5GaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNvbnZlcnRUb0NsYXNzKEZpbGUgY2xhc3NGaWxlKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzcyhjbGFzc0ZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqIGNsYXNzID0+IEpBUiBlbnRyeSAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYW4gYXJjaGl2ZSBlbnRyeSBuYW1lIGJhc2U7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lLnJlcGxhY2UoJy4nLCAnLycpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgdG8gYW4gYXJjaGl2ZSBlbnRyeSBuYW1lIGJhc2U7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVFbnRyeU5hbWVCYXNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGFuIGFyY2hpdmUgY2xhc3MgZmlsZSBlbnRyeSBuYW1lOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gY29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoY2xhc3NOYW1lKSArICIuY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhbiBhcmNoaXZlIGNsYXNzIGZpbGUgZW50cnkgbmFtZTsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCi0JLy8gKioqKiogY2xhc3MgPT4gZmlsZSAoLmNsYXNzIG9yIC5qYXZhKSAqKioqKgotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIG5hbWUgdG8gYSBmaWxlIG5hbWUgYmFzZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZyI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZyI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvRmlsZU5hbWVCYXNlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgZmlsZSBuYW1lIGJhc2UgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nIjwvY29kZT4gb24gVW5peCBhbmQKLQkgKiA8Y29kZT4iamF2YVxcbGFuZ1xcU3RyaW5nIjwvY29kZT4gb24gV2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9GaWxlTmFtZUJhc2UoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPiJqYXZhL2xhbmcvU3RyaW5nLmNsYXNzIjwvY29kZT4gb24gVW5peCBhbmQKLQkgKiA8Y29kZT4iamF2YVxcbGFuZ1xcU3RyaW5nLmNsYXNzIjwvY29kZT4gb24gV2luZG93cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShjbGFzc05hbWUpICsgIi5jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgY2xhc3MgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5jbGFzcyI8L2NvZGU+IG9uIFVuaXggYW5kCi0JICogPGNvZGU+ImphdmFcXGxhbmdcXFN0cmluZy5jbGFzcyI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvQ2xhc3NGaWxlTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgY2xhc3MgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5GaWxlKGphdmEvbGFuZy9TdHJpbmcuY2xhc3MpPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgY29udmVydFRvQ2xhc3NGaWxlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoY2xhc3NOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGNsYXNzIGZpbGUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPmphdmEubGFuZy5TdHJpbmcuY2xhc3M8L2NvZGU+IGlzIGNvbnZlcnRlZCB0bwotCSAqIDxjb2RlPkZpbGUoamF2YS9sYW5nL1N0cmluZy5jbGFzcyk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9DbGFzc0ZpbGUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9DbGFzc0ZpbGUoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyBuYW1lIHRvIGEgamF2YSBmaWxlIG5hbWUgZm9yIHRoZSBjdXJyZW50IE8vUzsKLQkgKiBlLmcuIDxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nIjwvY29kZT4gaXMgY29udmVydGVkIHRvCi0JICogPGNvZGU+ImphdmEvbGFuZy9TdHJpbmcuamF2YSI8L2NvZGU+IG9uIFVuaXhsIGFuZAotCSAqIDxjb2RlPiJqYXZhXFxsYW5nXFxTdHJpbmcuamF2YSI8L2NvZGU+IG9uIFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSmF2YUZpbGVOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0ZpbGVOYW1lQmFzZShjbGFzc05hbWUpICsgIi5qYXZhIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIGphdmEgZmlsZSBuYW1lIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iamF2YS9sYW5nL1N0cmluZy5qYXZhIjwvY29kZT4gb24gVW5peCBhbmQKLQkgKiA8Y29kZT4iamF2YVxcbGFuZ1xcU3RyaW5nLmphdmEiPC9jb2RlPiBvbiBXaW5kb3dzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFGaWxlTmFtZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFGaWxlTmFtZShqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IGEgY2xhc3MgbmFtZSB0byBhIGphdmEgZmlsZSBmb3IgdGhlIGN1cnJlbnQgTy9TOwotCSAqIGUuZy4gPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5GaWxlKGphdmEvbGFuZy9TdHJpbmcuamF2YSk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9KYXZhRmlsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXcgRmlsZShjb252ZXJ0VG9KYXZhRmlsZU5hbWUoY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgamF2YSBmaWxlIGZvciB0aGUgY3VycmVudCBPL1M7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5GaWxlKGphdmEvbGFuZy9TdHJpbmcuamF2YSk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9KYXZhRmlsZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb0phdmFGaWxlKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKiogY2xhc3MgPT4gcmVzb3VyY2UgKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgYSBjbGFzcyB0byBhIHJlc291cmNlIG5hbWU7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT4iL2phdmEvbGFuZy9TdHJpbmcuY2xhc3MiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZXNvdXJjZU5hbWUoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiAnLycgKyBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGphdmFDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCBhIGNsYXNzIHRvIGEgcmVzb3VyY2U7Ci0JICogZS5nLiA8Y29kZT5qYXZhLmxhbmcuU3RyaW5nLmNsYXNzPC9jb2RlPiBpcyBjb252ZXJ0ZWQgdG8KLQkgKiA8Y29kZT5VUkwoamFyOmZpbGU6L0M6L2pkay8xLjQuMl8wNC9qcmUvbGliL3J0LmphciEvamF2YS9sYW5nL1N0cmluZy5jbGFzcyk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGNvbnZlcnRUb1Jlc291cmNlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gamF2YUNsYXNzLmdldFJlc291cmNlKGNvbnZlcnRUb1Jlc291cmNlTmFtZShqYXZhQ2xhc3MpKTsKLQl9Ci0KLQotCS8vICoqKioqIHV0aWxpdGllcyAqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIGlzIGFuIGFyY2hpdmUgZmlsZTsKLQkgKiBpLmUuIGl0cyBuYW1lIGVuZHMgd2l0aCA8Y29kZT4iLnppcCI8L2NvZGU+IG9yIDxjb2RlPiIuamFyIjwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNBcmNoaXZlKFN0cmluZyBmaWxlTmFtZSkgewotCQlTdHJpbmcgZXh0ID0gRmlsZVRvb2xzLmV4dGVuc2lvbihmaWxlTmFtZSkudG9Mb3dlckNhc2UoKTsKLQkJcmV0dXJuIGV4dC5lcXVhbHMoIi5qYXIiKSB8fCBleHQuZXF1YWxzKCIuemlwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgaXMgYW4gYXJjaGl2ZSBmaWxlOwotCSAqIGkuZS4gaXRzIG5hbWUgZW5kcyB3aXRoIDxjb2RlPiIuemlwIjwvY29kZT4gb3IgPGNvZGU+Ii5qYXIiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZUlzQXJjaGl2ZShGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZpbGVOYW1lSXNBcmNoaXZlKGZpbGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoYXQgc2hvdWxkIGJlIHRoZSBmdWxseS1xdWFsaWZpZWQgZmlsZSBuYW1lCi0JICogZm9yIHRoZSBKUkUgcnVudGltZSBKQVI7Ci0JICogZS5nLiA8Y29kZT4iQzpcamRrMS40LjJfMDRcanJlXGxpYlxydC5qYXIiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBydEphck5hbWUoKSB7Ci0JCXJldHVybiBsb2NhdGlvbkZvcihqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsb2NhdGlvbiBmcm9tIHdoZXJlIHRoZSBzcGVjaWZpZWQgY2xhc3Mgd2FzIGxvYWRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbkZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJVVJMIHVybCA9IGNvbnZlcnRUb1Jlc291cmNlKGphdmFDbGFzcyk7Ci0JCVN0cmluZyBwYXRoOwotCQl0cnkgewotCQkJcGF0aCA9IEZpbGVUb29scy5idWlsZEZpbGUodXJsKS5nZXRQYXRoKCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JCVN0cmluZyBwcm90b2NvbCA9IHVybC5nZXRQcm90b2NvbCgpLnRvTG93ZXJDYXNlKCk7Ci0JCWlmIChwcm90b2NvbC5lcXVhbHMoImphciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGlmIHRoZSBjbGFzcyBpcyBpbiBhIEpBUiwgdGhlIFVSTCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLQkJCS8vICAgICBqYXI6ZmlsZTovQzovamRrLzEuNC4yXzA0L2pyZS9saWIvcnQuamFyIS9qYXZhL2xhbmcvU3RyaW5nLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5pbmRleE9mKCchJykpOwotCQl9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygiZmlsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIGlmIHRoZSBjbGFzcyBpcyBpbiBhIGRpcmVjdG9yeSwgdGhlIFVSTCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLQkJCS8vICAgICBmaWxlOi9DOi9kZXYvbWFpbi9td2Rldi9jbGFzcy9vcmcvZWNsaXBzZS9kYWxpL3V0aWxpdHkvQ2xhc3NwYXRoLmNsYXNzCi0JCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoamF2YUNsYXNzKS5sZW5ndGgoKSAtIDEpOwotCQl9IGVsc2UgaWYgKHByb3RvY29sLmVxdWFscygiYnVuZGxlcmVzb3VyY2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkvLyBpZiB0aGUgY2xhc3MgaXMgaW4gYSBidW5kbGUgcmVzb3VyY2UgKEVjbGlwc2U/KSwgdGhlIFVSTCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKLQkJCS8vICAgICBidW5kbGVyZXNvdXJjZTovLzQzL29yZy9lY2xpcHNlL2RhbGkvdXRpbGl0eS9DbGFzc3BhdGguY2xhc3MKLQkJCXJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCgpIC0gY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHVybC50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJlY3RvcmllcyB1c2VkIGJ5IHRoZSBKYXZhIEV4dGVuc2lvbiBNZWNoYW5pc20uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlW10gamF2YUV4dGVuc2lvbkRpcmVjdG9yaWVzKCkgewotCQlyZXR1cm4gY29udmVydFRvRmlsZXMoamF2YUV4dGVuc2lvbkRpcmVjdG9yeU5hbWVzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGlyZWN0b3J5IG5hbWVzIHVzZWQgYnkgdGhlIEphdmEgRXh0ZW5zaW9uIE1lY2hhbmlzbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5leHQuZGlycyIpLnNwbGl0KEZpbGUucGF0aFNlcGFyYXRvcik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqIGludGVybmFsICoqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gY29udmVydFRvRmlsZXMoU3RyaW5nW10gZmlsZU5hbWVzKSB7Ci0JCUZpbGVbXSBmaWxlcyA9IG5ldyBGaWxlW2ZpbGVOYW1lcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gZmlsZU5hbWVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlmaWxlc1tpXSA9IG5ldyBGaWxlKGZpbGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSmFyRmlsZU5hbWVzVG8oRmlsZSBkaXIsIExpc3Q8U3RyaW5nPiBqYXJGaWxlTmFtZXMpIHsKLQkJRmlsZVtdIGphckZpbGVzID0gamFyRmlsZXNJbihkaXIpOwotCQlmb3IgKEZpbGUgamFyRmlsZSA6IGphckZpbGVzKSB7Ci0JCQlqYXJGaWxlTmFtZXMuYWRkKEZpbGVUb29scy5jYW5vbmljYWxGaWxlKGphckZpbGUpLmdldFBhdGgoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gamFyRmlsZXNJbihGaWxlIGRpcmVjdG9yeSkgewotCQlyZXR1cm4gZGlyZWN0b3J5Lmxpc3RGaWxlcyhqYXJGaWxlRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGVGaWx0ZXIgamFyRmlsZUZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZmlsZSkgewotCQkJCXJldHVybiBGaWxlVG9vbHMuZXh0ZW5zaW9uKGZpbGUuZ2V0TmFtZSgpKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIGVudHJpZXMuCi0JICovCi0JcHJpdmF0ZSBDbGFzc3BhdGgoRW50cnlbXSBlbnRyaWVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZW50cmllcyA9IGVudHJpZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoU3RyaW5nLi4uIGZpbGVOYW1lcykgewotCQl0aGlzKGJ1aWxkRW50cmllcyhmaWxlTmFtZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTa2lwIGVtcHR5IGZpbGUgbmFtZXMgYmVjYXVzZSB0aGV5IHdpbGwgZW5kIHVwIGV4cGFuZGluZyB0byB0aGUgY3VycmVudAotCSAqIHdvcmtpbmcgZGlyZWN0b3J5LCB3aGljaCBpcyBub3Qgd2hhdCB3ZSB3YW50LiBFbXB0eSBmaWxlIG5hbWVzIGFjdHVhbGx5Ci0JICogb2NjdXIgd2l0aCBzb21lIGZyZXF1ZW5jeTsgc3VjaCBhcyB3aGVuIHRoZSBjbGFzc3BhdGggaGFzIGJlZW4gYnVpbHQgdXAKLQkgKiBkeW5hbWljYWxseSB3aXRoIHRvbyBtYW55IHNlcGFyYXRvcnMuIEZvciBleGFtcGxlOjxwcmU+Ci0JICogICAgICJDOlxkZXZcZm9vLmphcjs7QzpcZGV2XGJhci5qYXIiCi0JICogPC9wcmU+d2lsbCBiZSBwYXJzZWQgaW50byB0aHJlZSBmaWxlIG5hbWVzOjxwcmU+Ci0JICogICAgIHsgIkM6XGRldlxmb28uamFyIiwgIiIsICJDOlxkZXZcYmFyLmphciIgfQotCSAqIDwvcHJlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVudHJ5W10gYnVpbGRFbnRyaWVzKFN0cmluZ1tdIGZpbGVOYW1lcykgewotCQlMaXN0PEVudHJ5PiBlbnRyaWVzID0gbmV3IEFycmF5TGlzdDxFbnRyeT4oKTsKLQkJZm9yIChTdHJpbmcgZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLQkJCWlmICgoZmlsZU5hbWUgIT0gbnVsbCkgJiYgKGZpbGVOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQkJZW50cmllcy5hZGQobmV3IEVudHJ5KGZpbGVOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXMudG9BcnJheShuZXcgRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjbGFzc3BhdGggd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGguCi0JICovCi0JcHVibGljIENsYXNzcGF0aChTdHJpbmcgcGF0aCkgewotCQl0aGlzKHBhdGguc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2xhc3NwYXRoIHdpdGggdGhlIHNwZWNpZmllZCBlbnRyaWVzLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoSXRlcmFibGU8U3RyaW5nPiBmaWxlTmFtZXMpIHsKLQkJdGhpcyhBcnJheVRvb2xzLmFycmF5KGZpbGVOYW1lcywgU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc29saWRhdGUgdGhlIHNwZWNpZmllZCBjbGFzc3BhdGhzIGludG8gYSBzaW5nbGUgY2xhc3NwYXRoLgotCSAqLwotCXB1YmxpYyBDbGFzc3BhdGgoQ2xhc3NwYXRoLi4uIGNsYXNzcGF0aHMpIHsKLQkJdGhpcyhjb25zb2xpZGF0ZUVudHJpZXMoY2xhc3NwYXRocykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVudHJ5W10gY29uc29saWRhdGVFbnRyaWVzKENsYXNzcGF0aFtdIGNsYXNzcGF0aHMpIHsKLQkJTGlzdDxFbnRyeT4gZW50cmllcyA9IG5ldyBBcnJheUxpc3Q8RW50cnk+KCk7Ci0JCWZvciAoQ2xhc3NwYXRoIGNsYXNzcGF0aCA6IGNsYXNzcGF0aHMpIHsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZW50cmllcywgY2xhc3NwYXRoLmdldEVudHJpZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGVudHJpZXMudG9BcnJheShuZXcgRW50cnlbZW50cmllcy5zaXplKCldKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzcGF0aCdzIGVudHJpZXMuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPEVudHJ5PiBnZXRFbnRyaWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RW50cnk+KHRoaXMuZW50cmllcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzc3BhdGgncyBwYXRoLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkJaW50IG1heCA9IHRoaXMuZW50cmllcy5sZW5ndGggLSAxOwotCQlpZiAobWF4ID09IC0xKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwMCk7Ci0JCS8vIHN0b3Agb25lIHNob3J0IG9mIHRoZSBlbmQgb2YgdGhlIGFycmF5Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCXNiLmFwcGVuZCh0aGlzLmVudHJpZXNbaV0uZ2V0RmlsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoRmlsZS5wYXRoU2VwYXJhdG9yQ2hhcik7Ci0JCX0KLQkJc2IuYXBwZW5kKHRoaXMuZW50cmllc1ttYXhdLmdldEZpbGVOYW1lKCkpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggdGhlIGNsYXNzcGF0aCBmb3IgdGhlIHNwZWNpZmllZCAodW5xdWFsaWZpZWQpIGZpbGUKLQkgKiBhbmQgcmV0dXJuIGl0cyBlbnRyeS4gUmV0dXJuIG51bGwgaWYgYW4gZW50cnkgaXMgbm90IGZvdW5kLgotCSAqIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGZpbmQgdGhlIGVudHJ5Ci0JICogZm9yIDxjb2RlPiJydC5qYXIiPC9jb2RlPiBvciA8Y29kZT4idG9wbGluay5qYXIiPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRW50cnkgZ2V0RW50cnlGb3JGaWxlTmFtZWQoU3RyaW5nIHNob3J0RmlsZU5hbWUpIHsKLQkJZm9yIChFbnRyeSBlbnRyeSA6IHRoaXMuZW50cmllcykgewotCQkJaWYgKGVudHJ5LmdldEZpbGUoKS5nZXROYW1lKCkuZXF1YWxzKHNob3J0RmlsZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgZW50cnkgZmlsZSBpbiB0aGUgY2xhc3NwYXRoCi0JICogdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFJldHVybiBudWxsIGlmIGFuIGVudHJ5IGlzIG5vdCBmb3VuZC4KLQkgKi8KLQlwdWJsaWMgRW50cnkgZ2V0RW50cnlGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJU3RyaW5nIHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSA9IGNvbnZlcnRUb0NsYXNzRmlsZU5hbWUoY2xhc3NOYW1lKTsKLQkJU3RyaW5nIGFyY2hpdmVFbnRyeU5hbWUgPSBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGNsYXNzTmFtZSk7Ci0JCWZvciAoRW50cnkgZW50cnkgOiB0aGlzLmVudHJpZXMpIHsKLQkJCWlmIChlbnRyeS5jb250YWlucyhyZWxhdGl2ZUNsYXNzRmlsZU5hbWUsIGFyY2hpdmVFbnRyeU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudHJ5OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aCwKLQkgKiB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLQkgKiBAc2VlICNjbGFzc05hbWVzKCkKLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzc05hbWVzKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLCB3aXRoIGR1cGxpY2F0ZXMgcmVtb3ZlZC4KLQkgKiBAc2VlICNjbGFzc05hbWVzKEZpbHRlcikKLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc05hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oMTAwMDApOwotCQl0aGlzLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzLCBmaWx0ZXIpOwotCQlyZXR1cm4gY2xhc3NOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIG9uIHRoZSBjbGFzc3BhdGgKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2xhc3NOYW1lc1RvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzKSB7Ci0JCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlmb3IgKEVudHJ5IGVudHJ5IDogdGhpcy5lbnRyaWVzKSB7Ci0JCQllbnRyeS5hZGRDbGFzc05hbWVzVG8oY2xhc3NOYW1lcywgZmlsdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkgKiBKdXN0IGEgYml0IG1vcmUgcGVyZm9ybWFudCB0aGFuIHtAbGluayAjZ2V0Q2xhc3NOYW1lcygpfS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBvbiB0aGUgY2xhc3NwYXRoCi0JICogdGhhdCBhcmUgYWNjZXB0ZWQgYnkgdGhlIHNwZWNpZmllZCBmaWx0ZXIuCi0JICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiB7QGxpbmsgI2dldENsYXNzTmFtZXMoRmlsdGVyKX0uCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuZW50cnlDbGFzc05hbWVzSXRlcmF0b3JzKGZpbHRlcikpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gZW50cnlDbGFzc05hbWVzSXRlcmF0b3JzKGZpbmFsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RW50cnksIEl0ZXJhdG9yPFN0cmluZz4+KG5ldyBBcnJheUl0ZXJhdG9yPEVudHJ5Pih0aGlzLmVudHJpZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHRyYW5zZm9ybShFbnRyeSBlbnRyeSkgewotCQkJCXJldHVybiBlbnRyeS5jbGFzc05hbWVzKGZpbHRlcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgImNvbXByZXNzZWQiIHZlcnNpb24gb2YgdGhlIGNsYXNzcGF0aCB3aXRoIGl0cwotCSAqIGR1cGxpY2F0ZSBlbnRyaWVzIGVsaW1pbmF0ZWQuCi0JICovCi0JcHVibGljIENsYXNzcGF0aCBjb21wcmVzc2VkKCkgewotCQlyZXR1cm4gbmV3IENsYXNzcGF0aChBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKHRoaXMuZW50cmllcykpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGNsYXNzcGF0aCB0byBhbiBhcnJheSBvZiBVUkxzCi0JICogKHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgYSB7QGxpbmsgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXJ9KS4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8VVJMPiBnZXRVUkxzKCkgewotCQlpbnQgbGVuID0gdGhpcy5lbnRyaWVzLmxlbmd0aDsKLQkJVVJMW10gdXJscyA9IG5ldyBVUkxbbGVuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdXJsc1tpXSA9IHRoaXMuZW50cmllc1tpXS5nZXRVUkwoKTsKLQkJfQotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8VVJMPih1cmxzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldFBhdGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIDxjb2RlPkVudHJ5PC9jb2RlPiBtb2RlbHMgYSBKYXZhIGNsYXNzcGF0aCBlbnRyeSwgd2hpY2ggY2FuIGJlIGVpdGhlciBhCi0JICogZGlyZWN0b3J5IGNvbnRhaW5pbmcgPGNvZGU+LmNsYXNzPC9jb2RlPiBmaWxlcyBvciBhIEpBUiBmaWxlIChvciwKLQkgKiBzaW1pbGFybHksIGEgPGNvZGU+LnppcDwvY29kZT4gZmlsZSkuIFRoZSBlbnRyeSBjYW4gcmV0dXJuIHRoZSBuYW1lcyBvZgotCSAqIGNsYXNzZXMgZm91bmQgaW4gaXQgZXRjLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW50cnkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlTmFtZTsKLQkJcHJpdmF0ZSBmaW5hbCBGaWxlIGZpbGU7Ci0JCXByaXZhdGUgZmluYWwgRmlsZSBjYW5vbmljYWxGaWxlOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUVudHJ5KFN0cmluZyBmaWxlTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCWlmICgoZmlsZU5hbWUgPT0gbnVsbCkgfHwgKGZpbGVOYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ2ZpbGVOYW1lJyBtdXN0IGJlIG5vbi1lbXB0eSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCQl0aGlzLmZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQl0aGlzLmNhbm9uaWNhbEZpbGUgPSBGaWxlVG9vbHMuY2Fub25pY2FsRmlsZSh0aGlzLmZpbGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRGaWxlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmZpbGVOYW1lOwotCQl9Ci0KLQkJcHVibGljIEZpbGUgZ2V0RmlsZSgpIHsKLQkJCXJldHVybiB0aGlzLmZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgRmlsZSBnZXRDYW5vbmljYWxGaWxlKCkgewotCQkJcmV0dXJuIHRoaXMuY2Fub25pY2FsRmlsZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q2Fub25pY2FsRmlsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQkJaWYgKCAhIChvIGluc3RhbmNlb2YgRW50cnkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuICgoRW50cnkpIG8pLmNhbm9uaWNhbEZpbGUuZXF1YWxzKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGUuaGFzaENvZGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGVudHJ5J3MgImNhbm9uaWNhbCIgVVJMLgotCQkgKi8KLQkJcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiB0aGlzLmNhbm9uaWNhbEZpbGUudG9VUkkoKS50b1VSTCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudHJ5IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRhaW5zKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuY29udGFpbnMoY29udmVydFRvQ2xhc3NGaWxlTmFtZShjbGFzc05hbWUpLCBjb252ZXJ0VG9BcmNoaXZlQ2xhc3NGaWxlRW50cnlOYW1lKGNsYXNzTmFtZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSBjb250YWlucyBlaXRoZXIgdGhlIHNwZWNpZmllZCByZWxhdGl2ZQotCQkgKiBjbGFzcyBmaWxlIG9yIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBlbnRyeS4KLQkJICogTm90IHRoZSBwcmV0dGllc3Qgc2lnbmF0dXJlLCBidXQgaXQncyBpbnRlcm5hbC4uLi4KLQkJICovCi0JCWJvb2xlYW4gY29udGFpbnMoU3RyaW5nIHJlbGF0aXZlQ2xhc3NGaWxlTmFtZSwgU3RyaW5nIGFyY2hpdmVFbnRyeU5hbWUpIHsKLQkJCWlmICggISB0aGlzLmNhbm9uaWNhbEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmlzRGlyZWN0b3J5KCkgJiYgKG5ldyBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSwgcmVsYXRpdmVDbGFzc0ZpbGVOYW1lKSkuZXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiAoZmlsZUlzQXJjaGl2ZSh0aGlzLmNhbm9uaWNhbEZpbGUpICYmIHRoaXMuYXJjaGl2ZUNvbnRhaW5zRW50cnkoYXJjaGl2ZUVudHJ5TmFtZSkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRyeSdzIGFyY2hpdmUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBlbnRyeS4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBhcmNoaXZlQ29udGFpbnNFbnRyeShTdHJpbmcgemlwRW50cnlOYW1lKSB7Ci0JCQlaaXBGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJWmlwRW50cnkgemlwRW50cnkgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gbmV3IFppcEZpbGUodGhpcy5jYW5vbmljYWxGaWxlKTsKLQkJCQl6aXBFbnRyeSA9IHppcEZpbGUuZ2V0RW50cnkoemlwRW50cnlOYW1lKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gc29tZXRoaW5nIGlzIHdyb25nLCBsZWF2ZSB0aGUgZW50cnkgbnVsbAotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlpZiAoemlwRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQl6aXBFbnRyeSA9IG51bGw7CS8vIHNvbWV0aGluZyBpcyB3cm9uZywgY2xlYXIgb3V0IHRoZSBlbnRyeQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB6aXBFbnRyeSAhPSBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgaW4gdGhlIGVudHJ5LgotCQkgKiBAc2VlICNjbGFzc05hbWVzKCkKLQkJICovCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENsYXNzTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDbGFzc05hbWVzKEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyLgotCQkgKiBAc2VlICNjbGFzc05hbWVzKEZpbHRlcikKLQkJICovCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENsYXNzTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigyMDAwKTsKLQkJCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQlyZXR1cm4gY2xhc3NOYW1lczsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkIGluIHRoZSBlbnRyeQotCQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhZGRDbGFzc05hbWVzVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJCXRoaXMuYWRkQ2xhc3NOYW1lc1RvKGNsYXNzTmFtZXMsIEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGNsYXNzZXMgZGlzY292ZXJlZCBpbiB0aGUgZW50cnkKLQkJICogYW5kIGFjY2VwdGVkIGJ5IHRoZSBzcGVjaWZpZWQgZmlsdGVyIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIGFkZENsYXNzTmFtZXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpZiAodGhpcy5jYW5vbmljYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCXRoaXMuYWRkQ2xhc3NOYW1lc0ZvckRpcmVjdG9yeVRvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQkJfSBlbHNlIGlmIChmaWxlSXNBcmNoaXZlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQkJdGhpcy5hZGRDbGFzc05hbWVzRm9yQXJjaGl2ZVRvKGNsYXNzTmFtZXMsIGZpbHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogdW5kZXIgdGhlIGVudHJ5J3MgZGlyZWN0b3J5IGFuZCBhY2NlcHRlZCBieQotCQkgKiB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgYWRkQ2xhc3NOYW1lc0ZvckRpcmVjdG9yeVRvKENvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCWludCBzdGFydCA9IHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDE7Ci0JCQlmb3IgKEl0ZXJhdG9yPEZpbGU+IHN0cmVhbSA9IHRoaXMuY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29udmVydFRvQ2xhc3NOYW1lKHN0cmVhbS5uZXh0KCkuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQkJaWYgKGZpbHRlci5hY2NlcHQoY2xhc3NOYW1lKSkgewotCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBjbGFzcyBmaWxlcyBkaXNjb3ZlcmVkCi0JCSAqIHVuZGVyIHRoZSBlbnRyeSdzIGRpcmVjdG9yeS4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8RmlsZT4gY2xhc3NGaWxlc0ZvckRpcmVjdG9yeSgpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4oRmlsZVRvb2xzLmZpbGVzSW5UcmVlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRmlsZSBuZXh0KSB7Ci0JCQkJCXJldHVybiBFbnRyeS50aGlzLmZpbGVOYW1lTWlnaHRCZUZvckNsYXNzRmlsZShuZXh0LmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIGluIHRoZSBlbnRyeSdzIGFyY2hpdmUgZmlsZSBhbmQgYWNjZXB0ZWQgYnkgdGhlCi0JCSAqIHNwZWNpZmllZCBmaWx0ZXIgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXNGb3JBcmNoaXZlVG8oQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMsIEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCWZvciAoRW51bWVyYXRpb248PyBleHRlbmRzIFppcEVudHJ5PiBzdHJlYW0gPSB6aXBGaWxlLmVudHJpZXMoKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOyApIHsKLQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB6aXBFbnRyeU5hbWUgPSB6aXBFbnRyeS5nZXROYW1lKCk7Ci0JCQkJaWYgKHRoaXMuZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKHppcEVudHJ5TmFtZSkpIHsKLQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbnZlcnRUb0NsYXNzTmFtZSh6aXBFbnRyeU5hbWUpOwotCQkJCQlpZiAoZmlsdGVyLmFjY2VwdChjbGFzc05hbWUpKSB7Ci0JCQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgbWlnaHQgYmUgYSBKYXZhIGNsYXNzIGZpbGUuCi0JCSAqIFRoZSBmaWxlIG5hbWUgbXVzdCBhdCBsZWFzdCBlbmQgd2l0aCA8Y29kZT4iLmNsYXNzIjwvY29kZT4gYW5kIGNvbnRhaW4gbm8gc3BhY2VzLgotCQkgKiAoTmVpdGhlciBjbGFzcyBuYW1lcyBub3IgcGFja2FnZSBuYW1lcyBtYXkgY29udGFpbiBzcGFjZXMuKQotCQkgKiBXaGV0aGVyIGl0IGFjdHVhbGx5IGlzIGEgY2xhc3MgZmlsZSB3aWxsIG5lZWQgdG8gYmUgZGV0ZXJtaW5lZCBieQotCQkgKiBhIGNsYXNzIGxvYWRlci4KLQkJICovCi0JCWJvb2xlYW4gZmlsZU5hbWVNaWdodEJlRm9yQ2xhc3NGaWxlKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gRmlsZVRvb2xzLmV4dGVuc2lvbihuYW1lKS50b0xvd2VyQ2FzZSgpLmVxdWFscygiLmNsYXNzIikgLy8kTk9OLU5MUy0xJAotCQkJCQkmJiAobmFtZS5pbmRleE9mKCcgJykgPT0gLTEpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aC4KLQkJICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiB7QGxpbmsgI2dldENsYXNzTmFtZXMoKX0uCi0JCSAqLwotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lcyhGaWx0ZXIuTnVsbC48U3RyaW5nPmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQgb24gdGhlIGNsYXNzcGF0aAotCQkgKiB0aGF0IGFyZSBhY2NlcHRlZCBieSB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLQkJICogSnVzdCBhIGJpdCBtb3JlIHBlcmZvcm1hbnQgdGhhbiB7QGxpbmsgI2dldENsYXNzTmFtZXMoRmlsdGVyKX0uCi0JCSAqLwotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJaWYgKHRoaXMuY2Fub25pY2FsRmlsZS5leGlzdHMoKSkgewotCQkJCWlmICh0aGlzLmNhbm9uaWNhbEZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCQlyZXR1cm4gdGhpcy5jbGFzc05hbWVzRm9yRGlyZWN0b3J5KGZpbHRlcik7Ci0JCQkJfQotCQkJCWlmIChmaWxlSXNBcmNoaXZlKHRoaXMuY2Fub25pY2FsRmlsZSkpIHsKLQkJCQkJcmV0dXJuIHRoaXMuY2xhc3NOYW1lc0ZvckFyY2hpdmUoZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjbGFzc2VzIGRpc2NvdmVyZWQKLQkJICogdW5kZXIgdGhlIGVudHJ5J3MgZGlyZWN0b3J5IGFuZCBhY2NlcHRlZCBieQotCQkgKiB0aGUgc3BlY2lmaWVkIGZpbHRlci4KLQkJICovCi0JCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBjbGFzc05hbWVzRm9yRGlyZWN0b3J5KEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KHRoaXMuY2xhc3NOYW1lc0ZvckRpcmVjdG9yeSgpLCBmaWx0ZXIpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRyYW5zZm9ybSB0aGUgY2xhc3MgZmlsZXMgdG8gY2xhc3MgbmFtZXMuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckRpcmVjdG9yeSgpIHsKLQkJCWZpbmFsIGludCBzdGFydCA9IHRoaXMuY2Fub25pY2FsRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5sZW5ndGgoKSArIDE7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgU3RyaW5nPih0aGlzLmNsYXNzRmlsZXNGb3JEaXJlY3RvcnkoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEZpbGUgZikgewotCQkJCQlyZXR1cm4gY29udmVydFRvQ2xhc3NOYW1lKGYuZ2V0QWJzb2x1dGVQYXRoKCkuc3Vic3RyaW5nKHN0YXJ0KSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY2xhc3NlcyBkaXNjb3ZlcmVkCi0JCSAqIGluIHRoZSBlbnRyeSdzIGFyY2hpdmUgZmlsZSBhbmQgYWNjZXB0ZWQgYnkgdGhlCi0JCSAqIHNwZWNpZmllZCBmaWx0ZXIuCi0JCSAqLwotCQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gY2xhc3NOYW1lc0ZvckFyY2hpdmUoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQkvLyB3ZSBjYW4ndCBzaW1wbHkgd3JhcCBpdGVyYXRvcnMgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gY2xvc2UgdGhlIGFyY2hpdmUgZmlsZS4uLgotCQkJWmlwRmlsZSB6aXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJemlwRmlsZSA9IG5ldyBaaXBGaWxlKHRoaXMuY2Fub25pY2FsRmlsZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oemlwRmlsZS5zaXplKCkpOwotCQkJZm9yIChFbnVtZXJhdGlvbjw/IGV4dGVuZHMgWmlwRW50cnk+IHN0cmVhbSA9IHppcEZpbGUuZW50cmllcygpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7ICkgewotCQkJCVppcEVudHJ5IHppcEVudHJ5ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHppcEVudHJ5TmFtZSA9IHppcEVudHJ5LmdldE5hbWUoKTsKLQkJCQlpZiAodGhpcy5maWxlTmFtZU1pZ2h0QmVGb3JDbGFzc0ZpbGUoemlwRW50cnlOYW1lKSkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gY29udmVydFRvQ2xhc3NOYW1lKHppcEVudHJ5TmFtZSk7Ci0JCQkJCWlmIChmaWx0ZXIuYWNjZXB0KGNsYXNzTmFtZSkpIHsKLQkJCQkJCWNsYXNzTmFtZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCXppcEZpbGUuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCXJldHVybiBjbGFzc05hbWVzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwYzFkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db2xsZWN0aW9uVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdXBlckl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiB7QGxpbmsgQ29sbGVjdGlvbn0tcmVsYXRlZCB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uVG9vbHMgewotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gYWRkQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmFkZEFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGFkZEFsbF8oY29sbGVjdGlvbiwgaXRlcmF0b3IpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBpdGVyYXRvciBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyA8RT4gYm9vbGVhbiBhZGRBbGxfKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBjb2xsZWN0aW9uLmFkZEFsbChsaXN0KGl0ZXJhdG9yLCBzaXplKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5hZGRBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBzdXBlciBFPiBjb2xsZWN0aW9uLCBFLi4uIGFycmF5KSB7Ci0JCXJldHVybiAoYXJyYXkubGVuZ3RoID09IDApID8gZmFsc2UgOiBhZGRBbGxfKGNvbGxlY3Rpb24sIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBhc3N1bWUgdGhlIGFycmF5IGlzIG5vdCBlbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbF8oQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGNvbGxlY3Rpb24sIEUuLi4gYXJyYXkpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlmb3IgKEUgZWxlbWVudCA6IGFycmF5KSB7Ci0JCQltb2RpZmllZCB8PSBjb2xsZWN0aW9uLmFkZChlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBhZGRBbGwobGlzdCwgaW5kZXgsIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgaW50IHNpemUpIHsKLQkJcmV0dXJuIGFkZEFsbChsaXN0LCBpbmRleCwgaXRlcmFibGUuaXRlcmF0b3IoKSwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbGlzdC5hZGRBbGwoaW5kZXgsIGxpc3QoaXRlcmF0b3IpKSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QuYWRkQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGFkZEFsbChMaXN0PD8gc3VwZXIgRT4gbGlzdCwgaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCkgPyBsaXN0LmFkZEFsbChpbmRleCwgbGlzdChpdGVyYXRvciwgc2l6ZSkpIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5hZGRBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGJvb2xlYW4gYWRkQWxsKExpc3Q8PyBzdXBlciBFPiBsaXN0LCBpbnQgaW5kZXgsIEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIChhcnJheS5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IGxpc3QuYWRkQWxsKGluZGV4LCBBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJhZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoRW51bWVyYXRpb24gZW51bWVyYXRpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uLCBuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24gc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uLCBpbnQgZW51bWVyYXRpb25TaXplKSB7Ci0JCXJldHVybiBiYWcoZW51bWVyYXRpb24sIG5ldyBIYXNoQmFnPEU+KGVudW1lcmF0aW9uU2l6ZSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIEhhc2hCYWc8RT4gYmFnKSB7Ci0JCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJYmFnLmFkZChlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpKTsKLQkJfQotCQlyZXR1cm4gYmFnOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJhZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaEJhZyhJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBiYWcoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoQmFnKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGJhZyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvciwgbmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgYmFnIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gYmFnKGl0ZXJhdG9yLCBuZXcgSGFzaEJhZzxFPihpdGVyYXRvclNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBiYWcoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBIYXNoQmFnPEU+IGJhZykgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQliYWcuYWRkKGl0ZXJhdG9yLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBiYWcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hCYWcoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gYmFnKEUuLi4gYXJyYXkpIHsKLQkJaW50IGxlbiA9IGFycmF5Lmxlbmd0aDsKLQkJSGFzaEJhZzxFPiBiYWcgPSBuZXcgSGFzaEJhZzxFPihsZW4pOwotCQlmb3IgKEUgaXRlbSA6IGFycmF5KSB7Ci0JCQliYWcuYWRkKGl0ZW0pOwotCQl9Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBFPiBlbnVtZXJhdGlvbikgewotCQlyZXR1cm4gYmFnKGVudW1lcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGVudW1lcmF0aW9uIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24sIGludCBlbnVtZXJhdGlvblNpemUpIHsKLQkJcmV0dXJuIGJhZyhlbnVtZXJhdGlvbiwgZW51bWVyYXRpb25TaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb2xsZWN0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb2xsZWN0aW9uKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gY29sbGVjdGlvbihpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hCYWc8RT4gY29sbGVjdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGJhZyhpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoQmFnPEU+IGNvbGxlY3Rpb24oSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBiYWcoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29sbGVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaEJhZzxFPiBjb2xsZWN0aW9uKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGJhZyhhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZW51bWVyYXRpb24gY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+RW51bWVyYXRpb24uY29udGFpbnMoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhFbnVtZXJhdGlvbjw/PiBlbnVtZXJhdGlvbiwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCWlmICh2YWx1ZS5lcXVhbHMoZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIHRoZQotCSAqIHNwZWNpZmllZCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnMoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gY29udGFpbnMoaXRlcmFibGUuaXRlcmF0b3IoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnMoT2JqZWN0IG8pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWlucyhJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKGl0ZXJhdG9yLm5leHQoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgYWxsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24uY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdC4uLiBhcnJheSkgewotCQlmb3IgKGludCBpID0gYXJyYXkubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBjb2xsZWN0aW9uLmNvbnRhaW5zKGFycmF5W2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuY29udGFpbnNBbGwoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZSAyLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgMSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgaW50IGl0ZXJhYmxlMVNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMVNpemUsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZSBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUsIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmFibGU8Pz4gaXRlcmFibGUsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoaXRlcmFibGUuaXRlcmF0b3IoKSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5jb250YWluc0FsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IpLmNvbnRhaW5zQWxsKGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKENvbGxlY3Rpb24gY29sbGVjdGlvbik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJcmV0dXJuIHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUKLQkgKiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSksIGl0ZXJhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5jb250YWluc0FsbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zQWxsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IxKSwgaXRlcmF0b3IyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgMi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIDEgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIGludCBpdGVyYXRvcjFTaXplLCBJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJcmV0dXJuIGNvbnRhaW5zQWxsKHNldChpdGVyYXRvcjEsIGl0ZXJhdG9yMVNpemUpLCBpdGVyYXRvcjIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgY29udGFpbnMgYWxsIG9mIHRoZQotCSAqIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuY29udGFpbnNBbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjb250YWluc0FsbChJdGVyYXRvcjw/PiBpdGVyYXRvciwgT2JqZWN0Li4uIGFycmF5KSB7Ci0JCXJldHVybiBjb250YWluc0FsbChzZXQoaXRlcmF0b3IpLCBhcnJheSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBjb250YWlucyBhbGwgb2YgdGhlCi0JICogZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmNvbnRhaW5zQWxsKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNBbGwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gY29udGFpbnNBbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBsaXN0LgotCSAqIFVzZSB0aGUgZWxlbWVudHMnIHtAbGluayBPYmplY3QjZXF1YWxzKE9iamVjdCl9IG1ldGhvZCB0byBjb21wYXJlIHRoZQotCSAqIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmRpZmZFbmQoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZGlmZkVuZChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZFbmQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmFuZ2Ugb2YgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGFycmF5cyB0aGF0IGFyZSBkaWZmZXJlbnQuCi0JICogSWYgdGhlIGFycmF5cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4gW3NpemUsIC0xXS4KLQkgKiBVc2UgdGhlIGVsZW1lbnRzJyB7QGxpbmsgT2JqZWN0I2VxdWFscyhPYmplY3QpfSBtZXRob2QgdG8gY29tcGFyZSB0aGUKLQkgKiBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9ucy5kaWZmUmFuZ2UoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICogQHNlZSAjZGlmZlN0YXJ0KExpc3QsIExpc3QpCi0JICogQHNlZSAjZGlmZkVuZChMaXN0LCBMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmFuZ2UgZGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuZGlmZlJhbmdlKGxpc3QxLnRvQXJyYXkoKSwgbGlzdDIudG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogbGlzdHMgdGhhdCBhcmUgZGlmZmVyZW50LiBJZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCwgcmV0dXJuCi0JICogdGhlIHNpemUgb2YgdGhlIHR3byBsaXN0cyAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCkuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBkaWZmZXJlbnQgc2l6ZXMgYW5kIGFsbCB0aGUgZWxlbWVudHMgaW4KLQkgKiB0aGUgc2hvcnRlciBsaXN0IG1hdGNoIHRoZWlyIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4KLQkgKiB0aGUgbG9uZ2VyIGxpc3QsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc2hvcnRlciBsaXN0Ci0JICogKGkuZS4gb25lIHBhc3QgdGhlIGxhc3QgaW5kZXggb2YgdGhlIHNob3J0ZXIgbGlzdCkuCi0JICogVXNlIHRoZSBlbGVtZW50cycge0BsaW5rIE9iamVjdCNlcXVhbHMoT2JqZWN0KX0gbWV0aG9kIHRvIGNvbXBhcmUgdGhlCi0JICogZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuZGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGRpZmZTdGFydChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmRpZmZTdGFydChsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGxpc3RzIHRoYXQgYXJlIGRpZmZlcmVudCwgYmVnaW5uaW5nIGF0IHRoZSBlbmQuCi0JICogSWYgdGhlIGxpc3RzIGFyZSBpZGVudGljYWwsIHJldHVybiAtMS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcywgcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUKLQkgKiBsYXN0IGVsZW1lbnQgaW4gdGhlIGxvbmdlciBsaXN0LgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuaWRlbnRpdHlEaWZmRW5kKExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZkVuZChMaXN0PD8+IGxpc3QxLCBMaXN0PD8+IGxpc3QyKSB7Ci0JCXJldHVybiBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChsaXN0MS50b0FycmF5KCksIGxpc3QyLnRvQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByYW5nZSBvZiBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkCi0JICogYXJyYXlzIHRoYXQgYXJlIGRpZmZlcmVudC4KLQkgKiBJZiB0aGUgYXJyYXlzIGFyZSBpZGVudGljYWwsIHJldHVybiBbc2l6ZSwgLTFdLgotCSAqIFVzZSBvYmplY3QgaWRlbnRpdHkgdG8gY29tcGFyZSB0aGUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbnMuaWRlbnRpdHlEaWZmU3RhcnQoTGlzdCBsaXN0MSwgTGlzdCBsaXN0Mik8L2NvZGU+Ci0JICogQHNlZSAjaWRlbnRpdHlEaWZmU3RhcnQoTGlzdCwgTGlzdCkKLQkgKiBAc2VlICNpZGVudGl0eURpZmZFbmQoTGlzdCwgTGlzdCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJhbmdlIGlkZW50aXR5RGlmZlJhbmdlKExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBsaXN0cyB0aGF0IGFyZSBkaWZmZXJlbnQuIElmIHRoZSBsaXN0cyBhcmUgaWRlbnRpY2FsLCByZXR1cm4KLQkgKiB0aGUgc2l6ZSBvZiB0aGUgdHdvIGxpc3RzIChpLmUuIG9uZSBwYXN0IHRoZSBsYXN0IGluZGV4KS4KLQkgKiBJZiB0aGUgbGlzdHMgYXJlIGRpZmZlcmVudCBzaXplcyBhbmQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzaG9ydGVyIGxpc3QgbWF0Y2ggdGhlaXIgY29ycmVzcG9uZGluZyBlbGVtZW50cyBpbgotCSAqIHRoZSBsb25nZXIgbGlzdCwgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzaG9ydGVyIGxpc3QKLQkgKiAoaS5lLiBvbmUgcGFzdCB0aGUgbGFzdCBpbmRleCBvZiB0aGUgc2hvcnRlciBsaXN0KS4KLQkgKiBVc2Ugb2JqZWN0IGlkZW50aXR5IHRvIGNvbXBhcmUgdGhlIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb25zLmlkZW50aXR5RGlmZlN0YXJ0KExpc3QgbGlzdDEsIExpc3QgbGlzdDIpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGlkZW50aXR5RGlmZlN0YXJ0KExpc3Q8Pz4gbGlzdDEsIExpc3Q8Pz4gbGlzdDIpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQobGlzdDEudG9BcnJheSgpLCBsaXN0Mi50b0FycmF5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbGVtZW50cyBhcmUgZXF1YWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMgZG8gbm90IHJldHVybiB0aGUgc2FtZSBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQlyZXR1cm4gZWxlbWVudHNBcmVEaWZmZXJlbnQoaXRlcmFibGUxLml0ZXJhdG9yKCksIGl0ZXJhYmxlMi5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9ycyBkbyBub3QgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzCi0JICogaW4gdGhlIHNhbWUgb3JkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlRGlmZmVyZW50KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXJldHVybiAhIGVsZW1lbnRzQXJlRXF1YWwoaXRlcmF0b3IxLCBpdGVyYXRvcjIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmFibGVzIHJldHVybiBlcXVhbCBlbGVtZW50cwotCSAqIGluIHRoZSBzYW1lIG9yZGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmVsZW1lbnRzQXJlRXF1YWwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBlbGVtZW50c0FyZUVxdWFsKGl0ZXJhYmxlMS5pdGVyYXRvcigpLCBpdGVyYWJsZTIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvcnMgcmV0dXJuIGVxdWFsIGVsZW1lbnRzCi0JICogaW4gdGhlIHNhbWUgb3JkZXIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IuZWxlbWVudHNBcmVFcXVhbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlRXF1YWwoSXRlcmF0b3I8Pz4gaXRlcmF0b3IxLCBJdGVyYXRvcjw/PiBpdGVyYXRvcjIpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgJiYgaXRlcmF0b3IyLmhhc05leHQoKSkgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudChpdGVyYXRvcjEubmV4dCgpLCBpdGVyYXRvcjIubmV4dCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gISAoaXRlcmF0b3IxLmhhc05leHQoKSB8fCBpdGVyYXRvcjIuaGFzTmV4dCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGlkZW50aWNhbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlcyByZXR1cm4gdGhlIHNhbWUgZWxlbWVudHMuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuaWRlbnRpY2FsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWxlbWVudHNBcmVJZGVudGljYWwoSXRlcmFibGU8Pz4gaXRlcmFibGUxLCBJdGVyYWJsZTw/PiBpdGVyYWJsZTIpIHsKLQkJcmV0dXJuIGVsZW1lbnRzQXJlSWRlbnRpY2FsKGl0ZXJhYmxlMS5pdGVyYXRvcigpLCBpdGVyYWJsZTIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYXRvcnMgcmV0dXJuIHRoZSBzYW1lIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmlkZW50aWNhbChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlSWRlbnRpY2FsKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMSwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IyKSB7Ci0JCXdoaWxlIChpdGVyYXRvcjEuaGFzTmV4dCgpICYmIGl0ZXJhdG9yMi5oYXNOZXh0KCkpIHsKLQkJCWlmIChpdGVyYXRvcjEubmV4dCgpICE9IGl0ZXJhdG9yMi5uZXh0KCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICEgKGl0ZXJhdG9yMS5oYXNOZXh0KCkgfHwgaXRlcmF0b3IyLmhhc05leHQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMgZG8gPGVtPm5vdDwvZW0+IHJldHVybiB0aGUgc2FtZQotCSAqIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLm5vdElkZW50aWNhbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzQXJlTm90SWRlbnRpY2FsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBlbGVtZW50c0FyZU5vdElkZW50aWNhbChpdGVyYWJsZTEuaXRlcmF0b3IoKSwgaXRlcmFibGUyLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzIGRvIDxlbT5ub3Q8L2VtPiByZXR1cm4gdGhlIHNhbWUKLQkgKiBlbGVtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5ub3RJZGVudGljYWwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbGVtZW50c0FyZU5vdElkZW50aWNhbChJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgewotCQlyZXR1cm4gISBlbGVtZW50c0FyZUlkZW50aWNhbChpdGVyYXRvcjEsIGl0ZXJhdG9yMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdldCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5nZXQoaW50IGluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFIGdldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpbmRleCkgewotCQlyZXR1cm4gZ2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5nZXQoaW50IGluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBFIGdldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpbmRleCkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUUgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpKysgPT0gaW5kZXgpIHsKLQkJCQlyZXR1cm4gbmV4dDsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkgKyAnOicgKyBTdHJpbmcudmFsdWVPZihpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhhc2ggY29kZSAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlpZiAoaXRlcmFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJaW50IGhhc2ggPSAxOwotCQlmb3IgKE9iamVjdCBlbGVtZW50IDogaXRlcmFibGUpIHsKLQkJCWhhc2ggPSAzMSAqIGhhc2ggKyAoZWxlbWVudCA9PSBudWxsID8gMCA6IGVsZW1lbnQuaGFzaENvZGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5pbmRleE9mKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGluZGV4T2YoaXRlcmFibGUuaXRlcmF0b3IoKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcjsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5pbmRleE9mKE9iamVjdCBvKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpdGVyYXRvci5oYXNOZXh0KCk7IGkrKykgewotCQkJCWlmIChpdGVyYXRvci5uZXh0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKGl0ZXJhdG9yLm5leHQoKSkpIHsKLQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zZXJ0aW9uIGluZGV4IG9mICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpbmRleCBvZiB3aGVyZSB0aGUgc3BlY2lmaWVkIGNvbXBhcmFibGUgb2JqZWN0Ci0JICogY2FuIGJlIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBzb3J0ZWQgbGlzdCBhbmQgc3RpbGwga2VlcAotCSAqIHRoZSBsaXN0IHNvcnRlZC4gSWYgdGhlIHNwZWNpZmllZCBzb3J0ZWQgbGlzdCBpcyBhbiBpbnN0YW5jZSBvZgotCSAqIHtAbGluayBSYW5kb21BY2Nlc3N9IHJldHVybiB0aGUgPGVtPm1heGltdW08L2VtPiBpbnNlcnRpb24gaW5kZXg7Ci0JICogb3RoZXJ3aXNlIHJldHVybiB0aGUgPGVtPm1pbmltdW08L2VtPiBpbnNlcnRpb24gaW5kZXguCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gaW50IGluc2VydGlvbkluZGV4T2YoTGlzdDxFPiBzb3J0ZWRMaXN0LCBDb21wYXJhYmxlPEU+IHZhbHVlKSB7Ci0JCWlmIChzb3J0ZWRMaXN0IGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSB7Ci0JCQlmb3IgKGludCBpID0gc29ydGVkTGlzdC5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJCWlmICh2YWx1ZS5jb21wYXJlVG8oc29ydGVkTGlzdC5nZXQoaSkpID49IDApIHsKLQkJCQkJcmV0dXJuIGkgKyAxOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBpID0gMDsKLQkJZm9yIChFIGVsZW1lbnQgOiBzb3J0ZWRMaXN0KSB7Ci0JCQlpZiAodmFsdWUuY29tcGFyZVRvKGVsZW1lbnQpIDw9IDApIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5kZXggb2Ygd2hlcmUgdGhlIHNwZWNpZmllZCBjb21wYXJhYmxlIG9iamVjdAotCSAqIGNhbiBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgYW5kIHN0aWxsIGtlZXAKLQkgKiB0aGUgbGlzdCBzb3J0ZWQuIElmIHRoZSBzcGVjaWZpZWQgc29ydGVkIGxpc3QgaXMgYW4gaW5zdGFuY2Ugb2YKLQkgKiB7QGxpbmsgUmFuZG9tQWNjZXNzfSByZXR1cm4gdGhlIDxlbT5tYXhpbXVtPC9lbT4gaW5zZXJ0aW9uIGluZGV4OwotCSAqIG90aGVyd2lzZSByZXR1cm4gdGhlIDxlbT5taW5pbXVtPC9lbT4gaW5zZXJ0aW9uIGluZGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IGludCBpbnNlcnRpb25JbmRleE9mKExpc3Q8RT4gc29ydGVkTGlzdCwgRSB2YWx1ZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJaWYgKHNvcnRlZExpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpIHsKLQkJCWZvciAoaW50IGkgPSBzb3J0ZWRMaXN0LnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvbXBhcmF0b3IuY29tcGFyZSh2YWx1ZSwgc29ydGVkTGlzdC5nZXQoaSkpID49IDApIHsKLQkJCQkJcmV0dXJuIGkgKyAxOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0JCWludCBpID0gMDsKLQkJZm9yIChFIGVsZW1lbnQgOiBzb3J0ZWRMaXN0KSB7Ci0JCQlpZiAoY29tcGFyYXRvci5jb21wYXJlKHZhbHVlLCBlbGVtZW50KSA8PSAwKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGl0ZXJhYmxlL2l0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5BcnJheXMuaXRlcmFibGUoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEU+KGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLml0ZXJhdG9yKE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYXRvcjxFPiBpdGVyYXRvcihFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxFPihhcnJheSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUncyBsYXN0IGVsZW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUubGFzdCgpPC9jb2RlPgotCSAqIAotICAgICAqIEBleGNlcHRpb24gamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaXRlcmFibGUgaXMgZW1wdHkuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gRSBsYXN0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBsYXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yJ3MgbGFzdCBlbGVtZW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmxhc3QoKTwvY29kZT4KLQkgKiAKLSAgICAgKiBAZXhjZXB0aW9uIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uIGl0ZXJhdG9yIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEUgbGFzdChJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQlFIGxhc3Q7Ci0JCWRvIHsKLQkJCWxhc3QgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXJldHVybiBsYXN0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsYXN0IGluZGV4IG9mICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmxhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGxhc3RJbmRleE9mKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgdGhlCi0JICogc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZTsKLQkgKiByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gc3VjaCBpbmRleC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLmxhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGxhc3RJbmRleE9mKGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLmxhc3RJbmRleE9mKE9iamVjdCBvKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yLCBPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGxpc3QoaXRlcmF0b3IpLmxhc3RJbmRleE9mKHZhbHVlKSA6IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgZWxlbWVudCBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yOwotCSAqIHJldHVybiAtMSBpZiB0aGVyZSBpcyBubyBzdWNoIGluZGV4LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3IubGFzdEluZGV4T2YoT2JqZWN0IG8pCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgbGFzdEluZGV4T2YoSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUsIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gbGlzdChpdGVyYXRvciwgaXRlcmF0b3JTaXplKS5sYXN0SW5kZXhPZih2YWx1ZSkgOiAtMTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0xpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS50b0xpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0xpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmF0b3IsIG5ldyBBcnJheUxpc3Q8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci50b0xpc3QoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGxpc3QoaXRlcmF0b3IsIG5ldyBBcnJheUxpc3Q8RT4oaXRlcmF0b3JTaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiBsaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQXJyYXlMaXN0PEU+IGxpc3QpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbGlzdC5hZGQoaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBVbmxpa2Uge0BsaW5rIEFycmF5cyNhc0xpc3QoT2JqZWN0W10pfSwgdGhlIGxpc3QKLQkgKiBpcyBtb2RpZmlhYmxlIGFuZCBpcyBub3QgYmFja2VkIGJ5IHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbGlzdChFLi4uIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PEU+KEFycmF5cy5hc0xpc3QoYXJyYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5saXN0SXRlcmF0b3IoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQlyZXR1cm4gbGlzdEl0ZXJhdG9yKGFycmF5LCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCi0JICogPHA+Ci0JICogPGNvZGU+QXJyYXlzLmxpc3RJdGVyYXRvcihPYmplY3RbXSBhcnJheSwgaW50IGluZGV4KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JCXJldHVybiBsaXN0SXRlcmF0b3IoYXJyYXksIHN0YXJ0LCBhcnJheS5sZW5ndGggLSBzdGFydCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheQotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhlIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPkFycmF5cy5saXN0SXRlcmF0b3IoT2JqZWN0W10gYXJyYXksIGludCBpbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPEU+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW92ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZSBpbmRleCB0byB0aGUgc3BlY2lmaWVkIHRhcmdldAotCSAqIGluZGV4LiBSZXR1cm4gdGhlIGFsdGVyZWQgbGlzdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5MaXN0Lm1vdmUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gbW92ZShMaXN0PEU+IGxpc3QsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXJldHVybiAodGFyZ2V0SW5kZXggPT0gc291cmNlSW5kZXgpID8gbGlzdCA6IG1vdmVfKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRhcmdldEluZGV4ICE9IHNvdXJjZUluZGV4Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IExpc3Q8RT4gbW92ZV8oTGlzdDxFPiBsaXN0LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpZiAobGlzdCBpbnN0YW5jZW9mIFJhbmRvbUFjY2VzcykgewotCQkJLy8gbW92ZSBlbGVtZW50cywgbGVhdmluZyB0aGUgbGlzdCBpbiBwbGFjZQotCQkJRSB0ZW1wID0gbGlzdC5nZXQoc291cmNlSW5kZXgpOwotCQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGktLSA+IHRhcmdldEluZGV4OyApIHsKLQkJCQkJbGlzdC5zZXQoaSArIDEsIGxpc3QuZ2V0KGkpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWZvciAoaW50IGkgPSBzb3VyY2VJbmRleDsgaSA8IHRhcmdldEluZGV4OyBpKyspIHsKLQkJCQkJbGlzdC5zZXQoaSwgbGlzdC5nZXQoaSArIDEpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlsaXN0LnNldCh0YXJnZXRJbmRleCwgdGVtcCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyByZW1vdmUgdGhlIGVsZW1lbnQgYW5kIHJlLWFkZCBpdCBhdCB0aGUgdGFyZ2V0IGluZGV4Ci0JCQlsaXN0LmFkZCh0YXJnZXRJbmRleCwgbGlzdC5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGVsZW1lbnRzIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlIHNwZWNpZmllZCB0YXJnZXQKLQkgKiBpbmRleC4gUmV0dXJuIHRoZSBhbHRlcmVkIGxpc3QuCi0JICogPHA+Ci0JICogPGNvZGU+TGlzdC5tb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IG1vdmUoTGlzdDxFPiBsaXN0LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlpZiAoKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB8fCAobGVuZ3RoID09IDApKSB7Ci0JCQlyZXR1cm4gbGlzdDsKLQkJfQotCQlpZiAobGVuZ3RoID09IDEpIHsKLQkJCXJldHVybiBtb3ZlXyhsaXN0LCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl9Ci0JCWlmIChsaXN0IGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSB7Ci0JCQkvLyBtb3ZlIGVsZW1lbnRzLCBsZWF2aW5nIHRoZSBsaXN0IGluIHBsYWNlCi0JCQlBcnJheUxpc3Q8RT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8RT4obGlzdC5zdWJMaXN0KHNvdXJjZUluZGV4LCBzb3VyY2VJbmRleCArIGxlbmd0aCkpOwotCQkJaWYgKHRhcmdldEluZGV4IDwgc291cmNlSW5kZXgpIHsKLQkJCQlmb3IgKGludCBpID0gc291cmNlSW5kZXg7IGktLSA+IHRhcmdldEluZGV4OyApIHsKLQkJCQkJbGlzdC5zZXQoaSArIGxlbmd0aCwgbGlzdC5nZXQoaSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaSA9IHNvdXJjZUluZGV4OyBpIDwgdGFyZ2V0SW5kZXg7IGkrKykgewotCQkJCQlsaXN0LnNldChpLCBsaXN0LmdldChpICsgbGVuZ3RoKSk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCWxpc3Quc2V0KHRhcmdldEluZGV4ICsgaSwgdGVtcC5nZXQoaSkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gcmVtb3ZlIHRoZSBlbGVtZW50cyBhbmQgcmUtYWRkIHRoZW0gYXQgdGhlIHRhcmdldCBpbmRleAotCQkJbGlzdC5hZGRBbGwodGFyZ2V0SW5kZXgsIHJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCBzb3VyY2VJbmRleCwgbGVuZ3RoKSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGwoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYWJsZTw/PiBpdGVyYWJsZSwgaW50IGl0ZXJhYmxlU2l6ZSkgewotCQlyZXR1cm4gcmVtb3ZlQWxsKGNvbGxlY3Rpb24sIGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZW1vdmVBbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlyZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gY29sbGVjdGlvbi5yZW1vdmVBbGwoc2V0KGl0ZXJhdG9yKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsKEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmF0b3I8Pz4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKSA/IGNvbGxlY3Rpb24ucmVtb3ZlQWxsKHNldChpdGVyYXRvciwgaXRlcmF0b3JTaXplKSkgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJlbW92ZUFsbChPYmplY3RbXSBhcnJheSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdC4uLiBhcnJheSkgewotCQlyZXR1cm4gKGFycmF5Lmxlbmd0aCA9PSAwKSA/IGZhbHNlIDogY29sbGVjdGlvbi5yZW1vdmVBbGwoc2V0KGFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmVtb3ZlQWxsT2NjdXJyZW5jZXMoT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsT2NjdXJyZW5jZXMoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QgdmFsdWUpIHsKLQkJYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOwotCQlJdGVyYXRvcjw/PiBzdHJlYW0gPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCWlmIChzdHJlYW0ubmV4dCgpID09IG51bGwpIHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQltb2RpZmllZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlpZiAodmFsdWUuZXF1YWxzKHN0cmVhbS5uZXh0KCkpKSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJbW9kaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50cyBhdCBpbmRleCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGVsZW1lbnRzIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGVsZW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3QucmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IHJlbW92ZUVsZW1lbnRzQXRJbmRleChMaXN0PEU+IGxpc3QsIGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQlMaXN0PEU+IHN1Ykxpc3QgPSBsaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgbGVuZ3RoKTsKLQkJQXJyYXlMaXN0PEU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGR1cGxpY2F0ZSBlbGVtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZW1vdmUgYW55IGR1cGxpY2F0ZSBlbGVtZW50cyBmcm9tIHRoZSBzcGVjaWZpZWQgbGlzdCwKLQkgKiB3aGlsZSBtYWludGFpbmluZyB0aGUgb3JkZXIuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKExpc3Q8RT4gbGlzdCkgewotCQlpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotCQlpZiAoKHNpemUgPT0gMCkgfHwgKHNpemUgPT0gMSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCwgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIGxpc3QgaXMgbm9uLWVtcHR5Ci0JICovCi0Jc3RhdGljIDxFPiBib29sZWFuIHJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKExpc3Q8RT4gbGlzdCwgaW50IHNpemUpIHsKLQkJTGlua2VkSGFzaFNldDxFPiB0ZW1wID0gbmV3IExpbmtlZEhhc2hTZXQ8RT4oc2l6ZSk7CQkvLyB0YWtlIGFkdmFudGFnZSBvZiBoYXNoZWQgbG9vay11cAotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCWZvciAoRSBpdGVtIDogbGlzdCkgewotCQkJaWYgKCAhIHRlbXAuYWRkKGl0ZW0pKSB7Ci0JCQkJbW9kaWZpZWQgPSB0cnVlOyAgLy8gZHVwbGljYXRlIGl0ZW0KLQkJCX0KLQkJfQotCQlpZiAobW9kaWZpZWQpIHsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoRSBlIDogdGVtcCkgewotCQkJCWxpc3Quc2V0KGksIGUpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWludCB0ZW1wU2l6ZSA9IHRlbXAuc2l6ZSgpOwotCQkJZm9yIChpID0gbGlzdC5zaXplKCk7IGktLSA+IHRlbXBTaXplOyApIHsKLQkJCQlsaXN0LnJlbW92ZShpKTsgIC8vIHB1bGwgb2ZmIHRoZSBlbmQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5Db2xsZWN0aW9uLnJldGFpbkFsbChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiByZXRhaW5BbGwoY29sbGVjdGlvbiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIG9ubHkgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZCBhcyBhIHJlc3VsdC4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhYmxlIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkNvbGxlY3Rpb24ucmV0YWluQWxsKEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgSXRlcmFibGU8Pz4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJldGFpbkFsbChjb2xsZWN0aW9uLCBpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgewotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoc2V0KGl0ZXJhdG9yKSk7Ci0JCX0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gb25seSB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvcgotCSAqIGluIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkIGFzIGEgcmVzdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBJdGVyYXRvcjw/PiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gY29sbGVjdGlvbi5yZXRhaW5BbGwoc2V0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiBvbmx5IHRoZSBlbGVtZW50cyBpbiB0aGUgc3BlY2lmaWVkIGFycmF5Ci0JICogaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQgYXMgYSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Q29sbGVjdGlvbi5yZXRhaW5BbGwoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3QuLi4gYXJyYXkpIHsKLQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCXJldHVybiBjb2xsZWN0aW9uLnJldGFpbkFsbChzZXQoYXJyYXkpKTsKLQkJfQotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlIGxpc3QgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCB3aXRoIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRob3NlCi0JICogcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5yZXZlcnNlTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIHJldmVyc2VMaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5yZXZlcnNlTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHJldmVyc2VMaXN0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCB3aXRoIGVudHJpZXMgaW4gcmV2ZXJzZSBvcmRlciBmcm9tIHRob3NlCi0JICogcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5yZXZlcnNlTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIChBcnJheUxpc3Q8RT4pIHJldmVyc2UobGlzdChpdGVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgd2l0aCBlbnRyaWVzIGluIHJldmVyc2Ugb3JkZXIgZnJvbSB0aG9zZQotCSAqIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5yZXZlcnNlTGlzdCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiByZXZlcnNlTGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBzaXplKSB7Ci0JCXJldHVybiAoQXJyYXlMaXN0PEU+KSByZXZlcnNlKGxpc3QoaXRlcmF0b3IsIHNpemUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicm90YXRlZCIgYnkgb25lIHBvc2l0aW9uLgotCSAqIDxwPgotCSAqIDxjb2RlPkxpc3Qucm90YXRlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByb3RhdGUoTGlzdDxFPiBsaXN0KSB7Ci0JCXJldHVybiByb3RhdGUobGlzdCwgMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkhhc2hTZXQoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gc2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHNldChpdGVyYWJsZS5pdGVyYXRvcigpLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+SGFzaFNldChJdGVyYXRvciBpdGVyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSGFzaFNldDxFPiBzZXQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBzZXQoaXRlcmF0b3IsIG5ldyBIYXNoU2V0PEU+KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIHNldChpdGVyYXRvciwgbmV3IEhhc2hTZXQ8RT4oaXRlcmF0b3JTaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgPEU+IEhhc2hTZXQ8RT4gc2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgSGFzaFNldDxFPiBzZXQpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJc2V0LmFkZChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5IYXNoU2V0KE9iamVjdFtdIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IHNldChFLi4uIGFycmF5KSB7Ci0JCUhhc2hTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8RT4oYXJyYXkubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXNldC5hZGQoYXJyYXlbaV0pOwotCQl9Ci0JCXJldHVybiBzZXQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiBpdGVyYXRvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNpbmdsZSwKLQkgKiBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC50b0l0ZXJhdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmF0b3I8RT4gc2luZ2xldG9uSXRlcmF0b3IoRSB2YWx1ZSkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPih2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc2luZ2xlLAotCSAqIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LnRvTGlzdEl0ZXJhdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IHNpbmdsZXRvbkxpc3RJdGVyYXRvcihFIHZhbHVlKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjxFPih2YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpemUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5zaXplKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgc2l6ZShJdGVyYWJsZTw/PiBpdGVyYWJsZSkgewotCQlyZXR1cm4gc2l6ZShpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnNpemUoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBzaXplKEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCWludCBzaXplID0gMDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJc2l6ZSsrOwotCQl9Ci0JCXJldHVybiBzaXplOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlIGlzIGVtcHR5Ci0JICogKFNob3J0Y3V0cyB0aGUgaXRlcmF0b3IgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgdGhlIGVudGlyZSBzaXplKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KEl0ZXJhYmxlPD8+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiBpc0VtcHR5KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yIGlzIGVtcHR5Ci0JICogKFNob3J0Y3V0cyB0aGUgaXRlcmF0b3IgcmF0aGVyIHRoYW4gY2FsY3VsYXRpbmcgdGhlIGVudGlyZSBzaXplKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5KEl0ZXJhdG9yPD8+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiAhIGl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBzb3J0ZWQgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYWJsZS5zb3J0KCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gSXRlcmFibGU8RT4gc29ydChJdGVyYWJsZTxFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gc29ydChpdGVyYWJsZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc29ydCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmFibGUsIG51bGwsIGl0ZXJhYmxlU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhYmxlLnNvcnQoQ29tcGFyYXRvciBjb21wYXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBJdGVyYWJsZTxFPiBzb3J0KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhYmxlKSwgY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIHNvcnRlZCBlbGVtZW50cyBvZiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmFibGUuc29ydChDb21wYXJhdG9yIGNvbXBhcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IEl0ZXJhYmxlPEU+IHNvcnQoSXRlcmFibGU8RT4gaXRlcmFibGUsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0KGxpc3QoaXRlcmFibGUsIGl0ZXJhYmxlU2l6ZSksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlcmF0b3IgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogPHA+Ci0JICogPGNvZGU+SXRlcmF0b3Iuc29ydCgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IExpc3RJdGVyYXRvcjxFPiBzb3J0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gc29ydChpdGVyYXRvciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVyYXRvciBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnNvcnQoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEU+PiBMaXN0SXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIHNvcnQoaXRlcmF0b3IsIG51bGwsIGl0ZXJhdG9yU2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVyYXRvciBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiA8cD4KLQkgKiA8Y29kZT5JdGVyYXRvci5zb3J0KENvbXBhcmF0b3IgY29tcGFyYXRvcik8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdEl0ZXJhdG9yPEU+IHNvcnQoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydChsaXN0KGl0ZXJhdG9yKSwgY29tcGFyYXRvcikubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVyYXRvciBhZnRlciBpdCBoYXMgYmVlbiAic29ydGVkIi4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPkl0ZXJhdG9yLnNvcnQoQ29tcGFyYXRvciBjb21wYXJhdG9yKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0SXRlcmF0b3I8RT4gc29ydChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBpbnQgaXRlcmF0b3JTaXplKSB7Ci0JCXJldHVybiBzb3J0KGxpc3QoaXRlcmF0b3IsIGl0ZXJhdG9yU2l6ZSksIGNvbXBhcmF0b3IpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzb3J0ZWQgc2V0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqIFRoZSBzcGVjaWZpZWQgaXRlcmFibGUgc2l6ZSBpcyBhIHBlcmZvcm1hbmNlIGhpbnQuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYWJsZSBpdGVyYWJsZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIENvbXBhcmFibGU8PyBzdXBlciBFPj4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgaXRlcmFibGVTaXplKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQoaXRlcmFibGUuaXRlcmF0b3IoKSwgaXRlcmFibGVTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIGFuZCBjb21wYXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmFibGUgaXRlcmFibGUsIENvbXBhcmF0b3IgYyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhYmxlLml0ZXJhdG9yKCksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYWJsZSBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhYmxlIGl0ZXJhYmxlLCBDb21wYXJhdG9yIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IsIGludCBpdGVyYWJsZVNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChpdGVyYWJsZS5pdGVyYXRvcigpLCBjb21wYXJhdG9yLCBpdGVyYWJsZVNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhdG9yLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzb3J0ZWQgc2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZXJhdG9yIHNpemUgaXMgYSBwZXJmb3JtYW5jZSBoaW50LgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgaW50IGl0ZXJhdG9yU2l6ZSkgewotCQlyZXR1cm4gc29ydGVkU2V0KGl0ZXJhdG9yLCBudWxsLCBpdGVyYXRvclNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+VHJlZVNldChJdGVyYXRvciBpdGVyYXRvciwgQ29tcGFyYXRvciBjKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBUcmVlU2V0PEU+IHNvcnRlZFNldChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yKSB7Ci0JCXJldHVybiBzb3J0ZWRTZXQobGlzdChpdGVyYXRvciksIGNvbXBhcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yCi0JICogYW5kIGNvbXBhcmF0b3IuCi0JICogVGhlIHNwZWNpZmllZCBpdGVyYXRvciBzaXplIGlzIGEgcGVyZm9ybWFuY2UgaGludC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KEl0ZXJhdG9yIGl0ZXJhdG9yLCBDb21wYXJhdG9yIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IsIGludCBpdGVyYXRvclNpemUpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChsaXN0KGl0ZXJhdG9yLCBpdGVyYXRvclNpemUpLCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gVHJlZVNldDxFPiBzb3J0ZWRTZXQoTGlzdDxFPiBsaXN0LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlUcmVlU2V0PEU+IHNvcnRlZFNldCA9IG5ldyBUcmVlU2V0PEU+KGNvbXBhcmF0b3IpOwotCQlzb3J0ZWRTZXQuYWRkQWxsKGxpc3QpOwotCQlyZXR1cm4gc29ydGVkU2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBzZXQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqIDxwPgotCSAqIDxjb2RlPlRyZWVTZXQoT2JqZWN0W10gYXJyYXkpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEUuLi4gYXJyYXkpIHsKLQkJcmV0dXJuIHNvcnRlZFNldChhcnJheSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc29ydGVkIHNldCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiBhbmQgY29tcGFyYXRvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5UcmVlU2V0KE9iamVjdFtdIGFycmF5LCBDb21wYXJhdG9yIGMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFRyZWVTZXQ8RT4gc29ydGVkU2V0KEVbXSBhcnJheSwgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IpIHsKLQkJVHJlZVNldDxFPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxFPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChBcnJheXMuYXNMaXN0KGFycmF5KSk7Ci0JCXJldHVybiBzb3J0ZWRTZXQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9sZCBTY2hvb2wgVmVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmFibGUgaXRlcmFibGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXJldHVybiB2ZWN0b3IoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIHtAbGluayBWZWN0b3J9LgotCSAqIDxwPgotCSAqIDxjb2RlPlZlY3RvcihJdGVyYWJsZSBpdGVyYWJsZSwgaW50IHNpemUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhYmxlLml0ZXJhdG9yKCksIHNpemUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoSXRlcmF0b3IgaXRlcmF0b3IpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiB2ZWN0b3IoaXRlcmF0b3IsIG5ldyBWZWN0b3I8RT4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdmVjdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgbGVnYWN5IGNvZGUgdGhhdCByZXF1aXJlcyBhIHtAbGluayBWZWN0b3J9LgotCSAqIDxwPgotCSAqIDxjb2RlPlZlY3RvcihJdGVyYXRvciBpdGVyYXRvciwgaW50IHNpemUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IFZlY3RvcjxFPiB2ZWN0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gdmVjdG9yKGl0ZXJhdG9yLCBuZXcgVmVjdG9yPEU+KHNpemUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyA8RT4gVmVjdG9yPEU+IHZlY3RvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIFZlY3RvcjxFPiB2KSB7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXYuYWRkRWxlbWVudChpdGVyYXRvci5uZXh0KCkpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVGhpcyBpcyB1c2VmdWwgZm9yIGxlZ2FjeSBjb2RlIHRoYXQgcmVxdWlyZXMgYSB7QGxpbmsgVmVjdG9yfS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5WZWN0b3IoT2JqZWN0Li4uIGFycmF5KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBWZWN0b3I8RT4gdmVjdG9yKEUuLi4gYXJyYXkpIHsKLQkJVmVjdG9yPEU+IHYgPSBuZXcgVmVjdG9yPEU+KGFycmF5Lmxlbmd0aCk7Ci0JCWZvciAoRSBpdGVtIDogYXJyYXkpIHsKLQkJCXYuYWRkRWxlbWVudChpdGVtKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2luZ2xlLXVzZSBJdGVyYWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBvbmUtdXNlIHtAbGluayBJdGVyYWJsZX0gZm9yIHRoZSBzcGVjaWZpZWQge0BsaW5rIEl0ZXJhdG9yfS4KLQkgKiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpZiB7QGxpbmsgSXRlcmFibGUjaXRlcmF0b3IoKX0KLQkgKiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogQXMgc3VjaCwgdGhpcyB1dGlsaXR5IHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gb25lLXVzZSBzaXR1YXRpb25zLCBzdWNoIGFzCi0JICogYSBmb3JlYWNoIGxvb3AuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gSXRlcmFibGU8RT4gaXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlVXNlSXRlcmFibGU8RT4oaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBvbmUtdGltZSB1c2UgaXRlcmFibGUgdGhhdCBjYW4gcmV0dXJuIGEgc2luZ2xlIGl0ZXJhdG9yLgotCSAqIE9uY2UgdGhlIGl0ZXJhdG9yIGlzIHJldHVybmVkIHRoZSBpdGVyYWJsZSBpcyBubyBsb25nZXIgdmFsaWQuCi0JICogQXMgc3VjaCwgdGhpcyB1dGlsaXR5IHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gb25lLXRpbWUgdXNlIHNpdHVhdGlvbnMsCi0JICogc3VjaCBhcyBhICdmb3ItZWFjaCcgbG9vcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZVVzZUl0ZXJhYmxlPEU+IGltcGxlbWVudHMgSXRlcmFibGU8RT4gewotCQlwcml2YXRlIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCi0JCXB1YmxpYyBTaW5nbGVVc2VJdGVyYWJsZShJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoaXRlcmF0b3IgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5pdGVyYXRvciA9IG5ldyBTdXBlckl0ZXJhdG9yV3JhcHBlcjxFPihpdGVyYXRvcik7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCQlpZiAodGhpcy5pdGVyYXRvciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBtZXRob2QgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUl0ZXJhdG9yPEU+IHJlc3VsdCA9IHRoaXMuaXRlcmF0b3I7Ci0JCQl0aGlzLml0ZXJhdG9yID0gbnVsbDsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogamF2YS51dGlsLkNvbGxlY3Rpb25zIGVuaGFuY2VtZW50cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlc3RpbmF0aW9uIGxpc3QgYWZ0ZXIgdGhlIHNvdXJjZSBsaXN0IGhhcyBiZWVuIGNvcGllZCBpbnRvIGl0LgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjY29weShMaXN0LCBMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gY29weShMaXN0PEU+IGRlc3QsIExpc3Q8PyBleHRlbmRzIEU+IHNyYykgewotCQlDb2xsZWN0aW9ucy5jb3B5KGRlc3QsIHNyYyk7Ci0JCXJldHVybiBkZXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAiZmlsbGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI2ZpbGwoTGlzdCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gZmlsbChMaXN0PEU+IGxpc3QsIEUgdmFsdWUpIHsKLQkJQ29sbGVjdGlvbnMuZmlsbChsaXN0LCB2YWx1ZSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBhZnRlciBpdCBoYXMgYmVlbiAicmV2ZXJzZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjcmV2ZXJzZShMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gcmV2ZXJzZShMaXN0PEU+IGxpc3QpIHsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJyb3RhdGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3JvdGF0ZShMaXN0LCBpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiByb3RhdGUoTGlzdDxFPiBsaXN0LCBpbnQgZGlzdGFuY2UpIHsKLQkJQ29sbGVjdGlvbnMucm90YXRlKGxpc3QsIGRpc3RhbmNlKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzaHVmZmxlZCIuCi0JICogQHNlZSBDb2xsZWN0aW9ucyNzaHVmZmxlKExpc3QpCi0JICovCi0JcHVibGljIHN0YXRpYyA8RT4gTGlzdDxFPiBzaHVmZmxlKExpc3Q8RT4gbGlzdCkgewotCQlDb2xsZWN0aW9ucy5zaHVmZmxlKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNodWZmbGVkIi4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3NodWZmbGUoTGlzdCwgUmFuZG9tKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gc2h1ZmZsZShMaXN0PEU+IGxpc3QsIFJhbmRvbSByYW5kb20pIHsKLQkJQ29sbGVjdGlvbnMuc2h1ZmZsZShsaXN0LCByYW5kb20pOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgaXQgaGFzIGJlZW4gInNvcnRlZCIuCi0JICogTkI6IFRoZSBsaXN0IGlzIHNvcnRlZCBpbiBwbGFjZSBhcyBhIHNpZGUtZWZmZWN0LgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc29ydChMaXN0KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+IExpc3Q8RT4gc29ydChMaXN0PEU+IGxpc3QpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0IGFmdGVyIGl0IGhhcyBiZWVuICJzb3J0ZWQiLgotCSAqIE5COiBUaGUgbGlzdCBpcyBzb3J0ZWQgaW4gcGxhY2UgYXMgYSBzaWRlLWVmZmVjdC4KLQkgKiBAc2VlIENvbGxlY3Rpb25zI3NvcnQoTGlzdCwgQ29tcGFyYXRvcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHNvcnQoTGlzdDxFPiBsaXN0LCBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIGNvbXBhcmF0b3IpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QgYWZ0ZXIgdGhlIHNwZWNpZmllZCBlbGVtZW50cyBoYXZlIGJlZW4gInN3YXBwZWQiLgotCSAqIEBzZWUgQ29sbGVjdGlvbnMjc3dhcChMaXN0LCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxFPiBMaXN0PEU+IHN3YXAoTGlzdDxFPiBsaXN0LCBpbnQgaSwgaW50IGopIHsKLQkJQ29sbGVjdGlvbnMuc3dhcChsaXN0LCBpLCBqKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tbWFuZFJ1bm5hYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db21tYW5kUnVubmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY2NmVmMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db21tYW5kUnVubmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogV3JhcCBhIENvbW1hbmQgc28gaXQgY2FuIGJlIHVzZWQgYXMgYSBSdW5uYWJsZS4KLSAqLwotcHVibGljIGNsYXNzIENvbW1hbmRSdW5uYWJsZSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBjb21tYW5kOwotCi0JcHVibGljIENvbW1hbmRSdW5uYWJsZShDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJSdW5uYWJsZVsiICsgdGhpcy5jb21tYW5kLnRvU3RyaW5nKCkgKyddJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlQ29tbWFuZC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2U2NjEwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi0vKioKLSAqIDxjb2RlPkNvbXBvc2l0ZUNvbW1hbmQ8L2NvZGU+IHByb3ZpZGVzIHN1cHBvcnQgZm9yIHRyZWF0aW5nIGEgY29sbGVjdGlvbiBvZgotICoge0BsaW5rIENvbW1hbmR9cyBhcyBhIHNpbmdsZSBjb21tYW5kLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQ29tbWFuZAotCWltcGxlbWVudHMgQ29tbWFuZAotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8Q29tbWFuZD4gY29tbWFuZHM7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlQ29tbWFuZChDb21tYW5kLi4uIGNvbW1hbmRzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmFibGU8Q29tbWFuZD4oY29tbWFuZHMpKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcG9zaXRlQ29tbWFuZChJdGVyYWJsZTxDb21tYW5kPiBjb21tYW5kcykgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbW1hbmRzID0gY29tbWFuZHM7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJZm9yIChDb21tYW5kIGNvbW1hbmQgOiB0aGlzLmNvbW1hbmRzKSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29tbWFuZHMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29tcG9zaXRlRXhjZXB0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNiNTEyOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db21wb3NpdGVFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIFByb3ZpZGUgYSB3YXkgZm9yIG11bHRpcGxlIGV4Y2VwdGlvbnMgdG8gYmUgcGFja2FnZWQgYW5kIHJlcG9ydGVkLgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlRXhjZXB0aW9uCi0JZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBUaHJvd2FibGVbXSBleGNlcHRpb25zOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGV4Y2VwdGlvbnMgbGlzdCBtdXN0IG5vdCBiZSBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlRXhjZXB0aW9uKENvbGxlY3Rpb248VGhyb3dhYmxlPiBleGNlcHRpb25zKSB7Ci0JCXRoaXMoZXhjZXB0aW9ucy50b0FycmF5KG5ldyBUaHJvd2FibGVbZXhjZXB0aW9ucy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBleGNlcHRpb25zIGxpc3QgbXVzdCBub3QgYmUgZW1wdHkuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUV4Y2VwdGlvbihUaHJvd2FibGVbXSBleGNlcHRpb25zKSB7Ci0JCS8vIHByb3ZpZGUgYSBsaXN0IG9mIHRoZSBuZXN0ZWQgZXhjZXB0aW9ucyBhbmQKLQkJLy8gZ3JhYiB0aGUgZmlyc3QgZXhjZXB0aW9uIGFuZCBtYWtlIGl0IHRoZSAiY2F1c2UiCi0JCXN1cGVyKGJ1aWxkTWVzc2FnZShleGNlcHRpb25zKSk7Ci0JCXRoaXMuZXhjZXB0aW9ucyA9IGV4Y2VwdGlvbnM7Ci0JfQotCi0JcHVibGljIFRocm93YWJsZVtdIGdldEV4Y2VwdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmV4Y2VwdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkTWVzc2FnZShUaHJvd2FibGVbXSBleGNlcHRpb25zKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoZXhjZXB0aW9ucy5sZW5ndGgpOwotCQlzYi5hcHBlbmQoIiBleGNlcHRpb25zOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoJ1snKTsKLQkJZm9yIChUaHJvd2FibGUgZXggOiBleGNlcHRpb25zKSB7Ci0JCQlzYi5hcHBlbmQoZXguZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2Iuc2V0TGVuZ3RoKHNiLmxlbmd0aCgpIC0gMik7ICAvLyBjaG9wIG9mZiB0cmFpbGluZyBjb21tYQotCQlzYi5hcHBlbmQoJ10nKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRTdGFja1RyYWNlKFByaW50U3RyZWFtIHMpIHsKLQkJc3luY2hyb25pemVkIChzKSB7Ci0JCQlzLnByaW50bG4odGhpcyk7Ci0JCQlmb3IgKFN0YWNrVHJhY2VFbGVtZW50IGVsZW1lbnQgOiB0aGlzLmdldFN0YWNrVHJhY2UoKSkgewotCQkJCXMucHJpbnQoIlx0YXQgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzLnByaW50bG4oZWxlbWVudCk7Ci0JCQl9Ci0JCQlpbnQgaSA9IDE7Ci0JCQlmb3IgKFRocm93YWJsZSBleCA6IHRoaXMuZXhjZXB0aW9ucykgewotCQkJCXMucHJpbnQoIk5lc3RlZCBleGNlcHRpb24gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzLnByaW50KGkrKyk7Ci0JCQkJcy5wcmludCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWV4LnByaW50U3RhY2tUcmFjZShzKTsKLQkJCX0KLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByaW50U3RhY2tUcmFjZShQcmludFdyaXRlciBzKSB7Ci0JCXN5bmNocm9uaXplZCAocykgewotCQkJcy5wcmludGxuKHRoaXMpOwotCQkJZm9yIChTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50IDogdGhpcy5nZXRTdGFja1RyYWNlKCkpIHsKLQkJCQlzLnByaW50KCJcdGF0ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcy5wcmludGxuKGVsZW1lbnQpOwotCQkJfQotCQkJaW50IGkgPSAxOwotCQkJZm9yIChUaHJvd2FibGUgZXggOiB0aGlzLmV4Y2VwdGlvbnMpIHsKLQkJCQlzLnByaW50KCJOZXN0ZWQgZXhjZXB0aW9uICIpOyAvLyROT04tTkxTLTEkCi0JCQkJcy5wcmludChpKyspOwotCQkJCXMucHJpbnQoIjogIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlleC5wcmludFN0YWNrVHJhY2Uocyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db25zdW1lclRocmVhZENvb3JkaW5hdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Db25zdW1lclRocmVhZENvb3JkaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzM0ZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotCi0vKioKLSAqIEEgPGNvZGU+Q29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjwvY29kZT4gY29udHJvbHMgdGhlIGNyZWF0aW9uLAotICogc3RhcnRpbmcsIGFuZCBzdG9wcGluZyBvZiBhIGdlbmVyYWwgcHVycG9zZSAiY29uc3VtZXIiIHRocmVhZC4gQ29uc3RydWN0Ci0gKiB0aGUgY29vcmRpbmF0b3Igd2l0aCBhIHtAbGluayBDb25zdW1lcn0gdGhhdCBib3RoIHdhaXRzIGZvciB0aGUgcHJvZHVjZXIKLSAqIHRvICJwcm9kdWNlIiBzb21ldGhpbmcgdG8gImNvbnN1bWUiIGFuZCwgb25jZSB0aGUgd2FpdCBpcyBvdmVyLAotICogImNvbnN1bWVzIiB3aGF0ZXZlciBpcyBhdmFpbGFibGUuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSBjbGllbnQtc3VwcGxpZWQgY29uc3VtZXIgc2hvdWxkIGhhbmRsZSBhbnkKLSAqIGV4Y2VwdGlvbiBhcHByb3ByaWF0ZWx5IChlLmcuIGxvZyB0aGUgZXhjZXB0aW9uIGFuZCByZXR1cm4gZ3JhY2VmdWxseSkgc28KLSAqIHRoZSB0aHJlYWQgY2FuIGNvbnRpbnVlIGV4ZWN1dGluZy4KLSAqLwotcHVibGljIGNsYXNzIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgewotCS8qKgotCSAqIFRoZSBydW5uYWJsZSBwYXNzZWQgdG8gdGhlIGNvbnN1bWVyIHRocmVhZCBlYWNoIHRpbWUgaXQgaXMgYnVpbHQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZTsKLQotCS8qKgotCSAqIENsaWVudC1zdXBwbGllZCB0aHJlYWQgZmFjdG9yeS4gRGVmYXVsdHMgdG8gYSBzdHJhaWdodGZvcndhcmQKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeTsKLQotCS8qKgotCSAqIE9wdGlvbmFsLCBjbGllbnQtc3VwcGxpZWQgbmFtZSBmb3IgdGhlIGNvbnN1bWVyIHRocmVhZC4KLQkgKiBJZiBudWxsLCB0aGUgSkRLIGFzc2lnbnMgYSBuYW1lLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHRocmVhZE5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3VtZXIgaXMgZXhlY3V0ZWQgb24gdGhpcyB0aHJlYWQuIEEgbmV3IHRocmVhZCBpcyBidWlsdAotCSAqIGZvciBldmVyeSBzdGFydC9zdG9wIGN5Y2xlIChzaW5jZSBhIHRocmVhZCBjYW5ub3QgYmUgc3RhcnRlZCBtb3JlIHRoYW4KLQkgKiBvbmNlKS4KLQkgKi8KLQlwcml2YXRlIHZvbGF0aWxlIFRocmVhZCB0aHJlYWQ7Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBjb25zdW1lcgotCSAqIGR1cmluZyB0aGUgY3VycmVudCBzdGFydC9zdG9wIGN5Y2xlLgotCSAqLwotCWZpbmFsIFZlY3RvcjxUaHJvd2FibGU+IGV4Y2VwdGlvbnMgPSBuZXcgVmVjdG9yPFRocm93YWJsZT4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29uc3VtZXIgdGhyZWFkIGNvb3JkaW5hdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN1bWVyLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIGNvbnN1bWVyIHRocmVhZChzKS4KLQkgKiBBbGxvdyB0aGUgY29uc3VtZXIgdGhyZWFkKHMpIHRvIGJlIGFzc2lnbmVkIEpESy1nZW5lcmF0ZWQgbmFtZXMuCi0JICovCi0JcHVibGljIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoQ29uc3VtZXIgY29uc3VtZXIpIHsKLQkJdGhpcyhjb25zdW1lciwgU2ltcGxlVGhyZWFkRmFjdG9yeS5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb25zdW1lciB0aHJlYWQgY29vcmRpbmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY29uc3VtZXIuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgdGhyZWFkIGZhY3RvcnkgdG8gY29uc3RydWN0IHRoZSBjb25zdW1lciB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIGNvbnN1bWVyIHRocmVhZChzKSB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yKENvbnN1bWVyIGNvbnN1bWVyLCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkpIHsKLQkJdGhpcyhjb25zdW1lciwgdGhyZWFkRmFjdG9yeSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29uc3VtZXIgdGhyZWFkIGNvb3JkaW5hdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN1bWVyLgotCSAqIEFzc2lnbiB0aGUgY29uc3VtZXIgdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBVc2Ugc2ltcGxlIEpESyB0aHJlYWQocykgZm9yIHRoZSBjb25zdW1lciB0aHJlYWQocykuCi0JICovCi0JcHVibGljIENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IoQ29uc3VtZXIgY29uc3VtZXIsIFN0cmluZyB0aHJlYWROYW1lKSB7Ci0JCXRoaXMoY29uc3VtZXIsIFNpbXBsZVRocmVhZEZhY3RvcnkuaW5zdGFuY2UoKSwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29uc3VtZXIgdGhyZWFkIGNvb3JkaW5hdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN1bWVyLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgY29uc3VtZXIgdGhyZWFkKHMpLgotCSAqIEFzc2lnbiB0aGUgY29uc3VtZXIgdGhyZWFkKHMpIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcihDb25zdW1lciBjb25zdW1lciwgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LCBTdHJpbmcgdGhyZWFkTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJ1bm5hYmxlID0gdGhpcy5idWlsZFJ1bm5hYmxlKGNvbnN1bWVyKTsKLQkJdGhpcy50aHJlYWRGYWN0b3J5ID0gdGhyZWFkRmFjdG9yeTsKLQkJdGhpcy50aHJlYWROYW1lID0gdGhyZWFkTmFtZTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoQ29uc3VtZXIgY29uc3VtZXIpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZUNvbnN1bWVyKGNvbnN1bWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlmZWN5Y2xlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQnVpbGQgYW5kIHN0YXJ0IHRoZSBjb25zdW1lciB0aHJlYWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQlpZiAodGhpcy50aHJlYWQgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHN0b3BwZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnRocmVhZCA9IHRoaXMuYnVpbGRUaHJlYWQoKTsKLQkJdGhpcy50aHJlYWQuc3RhcnQoKTsKLQl9Ci0KLQlwcml2YXRlIFRocmVhZCBidWlsZFRocmVhZCgpIHsKLQkJVGhyZWFkIHQgPSB0aGlzLnRocmVhZEZhY3RvcnkubmV3VGhyZWFkKHRoaXMucnVubmFibGUpOwotCQlpZiAodGhpcy50aHJlYWROYW1lICE9IG51bGwpIHsKLQkJCXQuc2V0TmFtZSh0aGlzLnRocmVhZE5hbWUpOwotCQl9Ci0JCXJldHVybiB0OwotCX0KLQotCS8qKgotCSAqIEludGVycnVwdCB0aGUgY29uc3VtZXIgdGhyZWFkIHNvIHRoYXQgaXQgc3RvcHMgZXhlY3V0aW5nIGF0IHRoZQotCSAqIGVuZCBvZiBpdHMgY3VycmVudCBpdGVyYXRpb24uIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsCi0JICogdGhlIGNvbnN1bWVyIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIGNvbnN1bWVyIHRocmVhZCB3YXMgZXhlY3V0aW5nLAotCSAqIHdyYXAgdGhlbSBpbiBhIGNvbXBvc2l0ZSBleGNlcHRpb24gYW5kIHRocm93IHRoZSBjb21wb3NpdGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlpZiAodGhpcy50aHJlYWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm90IHN0YXJ0ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnRocmVhZC5pbnRlcnJ1cHQoKTsKLQkJdHJ5IHsKLQkJCXRoaXMudGhyZWFkLmpvaW4oKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoZSB0aHJlYWQgdGhhdCBjYWxsZWQgI3N0b3AoKSB3YXMgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyB0bwotCQkJLy8gam9pbiB0aGUgY29uc3VtZXIgdGhyZWFkIC0gaWdub3JlOwotCQkJLy8gJ3RocmVhZCcgaXMgc3RpbGwgImludGVycnVwdGVkIiwgc28gaXRzICNydW4oKSBsb29wIHdpbGwgc3RpbGwgc3RvcAotCQkJLy8gYWZ0ZXIgaXRzIGN1cnJlbnQgZXhlY3V0aW9uIC0gd2UganVzdCB3b24ndCB3YWl0IGFyb3VuZCBmb3IgaXQuLi4KLQkJfQotCQl0aGlzLnRocmVhZCA9IG51bGw7Ci0KLQkJaWYgKHRoaXMuZXhjZXB0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlUaHJvd2FibGVbXSB0ZW1wID0gdGhpcy5leGNlcHRpb25zLnRvQXJyYXkobmV3IFRocm93YWJsZVt0aGlzLmV4Y2VwdGlvbnMuc2l6ZSgpXSk7Ci0JCQl0aGlzLmV4Y2VwdGlvbnMuY2xlYXIoKTsKLQkJCXRocm93IG5ldyBDb21wb3NpdGVFeGNlcHRpb24odGVtcCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnRocmVhZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN1bWVyIHRocmVhZCBydW5uYWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBSdW5uYWJsZX0gaXMgYSBsb25nLXJ1bm5pbmcgY29uc3VtZXIgdGhhdAotCSAqIHdpbGwgcmVwZWF0ZWRseSBleGVjdXRlIHRoZSBjb25zdW1lciB7QGxpbmsgQ29uc3VtZXIjZXhlY3V0ZSgpfSBtZXRob2QuCi0JICogV2l0aCBlYWNoIGl0ZXJhdGlvbiwgdGhlIGNvbnN1bWVyIHRocmVhZCB3aWxsIHdhaXQKLQkgKiB1bnRpbCB0aGUgb3RoZXIgY29uc3VtZXIgbWV0aG9kLCB7QGxpbmsgQ29uc3VtZXIjd2FpdEZvclByb2R1Y2VyKCl9LCBhbGxvd3MgdGhlCi0JICogY29uc3VtZXIgdGhyZWFkIHRvIHByb2NlZWQgKGkuZS4gdGhlcmUgaXMgc29tZXRoaW5nIGZvciB0aGUgY29uc3VtZXIgdG8KLQkgKiBjb25zdW1lKS4gT25jZSB7QGxpbmsgQ29uc3VtZXIjZXhlY3V0ZSgpfSBpcyBmaW5pc2hlZCwgdGhlIHRocmVhZCB3aWxsIHF1aWVzY2UKLQkgKiB1bnRpbCB7QGxpbmsgQ29uc3VtZXIjd2FpdEZvclByb2R1Y2VyKCl9IHJldHVybnMgYWdhaW4uCi0JICogU3RvcCB0aGUgdGhyZWFkIGJ5IGNhbGxpbmcge0BsaW5rIFRocmVhZCNpbnRlcnJ1cHQoKX0uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBSdW5uYWJsZUNvbnN1bWVyCi0JCWltcGxlbWVudHMgUnVubmFibGUKLQl7Ci0JCS8qKgotCQkgKiBDbGllbnQtc3VwcGxpZWQgY29uc3VtZXIgdGhhdCBjb250cm9scyB3YWl0aW5nIGZvciBzb21ldGhpbmcgdG8gY29uc3VtZQotCQkgKiBhbmQgdGhlIGNvbnN1bWluZyBpdHNlbGYuCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbnN1bWVyIGNvbnN1bWVyOwotCi0JCVJ1bm5hYmxlQ29uc3VtZXIoQ29uc3VtZXIgY29uc3VtZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvbnN1bWVyID0gY29uc3VtZXI7Ci0JCX0KLQotCQkvKioKLQkJICogTG9vcCB3aGlsZSB0aGlzIHRocmVhZCBoYXMgbm90IGJlZW4gaW50ZXJydXB0ZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0JCSAqIEluIGVhY2ggbG9vcDogUGF1c2UgZXhlY3V0aW9uIHVudGlsIHtAbGluayBDb25zdW1lciN3YWl0Rm9yUHJvZHVjZXIoKX0KLQkJICogYWxsb3dzIHVzIHRvIHByb2NlZWQuCi0JCSAqIDxwPgotCQkgKiBJZiB0aGlzIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCA8ZW0+ZHVyaW5nPC9lbT4ge0BsaW5rIENvbnN1bWVyI2V4ZWN1dGUoKX0sCi0JCSAqIHRoZSBjYWxsIHRvIHtAbGluayBUaHJlYWQjaW50ZXJydXB0ZWQoKX0gd2lsbCBzdG9wIHRoZSBsb29wLiBJZiB0aGlzIHRocmVhZCBpcwotCQkgKiBpbnRlcnJ1cHRlZCBkdXJpbmcgdGhlIGNhbGwgdG8ge0BsaW5rIENvbnN1bWVyI3dhaXRGb3JQcm9kdWNlcigpfSwKLQkJICogd2Ugd2lsbCBjYXRjaCB0aGUge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufSBhbmQgc3RvcCB0aGUgbG9vcCBhbHNvLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJd2hpbGUgKCAhIFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhpcy5jb25zdW1lci53YWl0Rm9yUHJvZHVjZXIoKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCQkvLyB3ZSB3ZXJlIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcsIG11c3QgYmUgUXVpdHRpbicgVGltZQotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCXRoaXMuZXhlY3V0ZSgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4ZWN1dGUgdGhlIGNvbnN1bWVyIHtAbGluayBDb25zdW1lciNleGVjdXRlKCl9IG1ldGhvZC4KLQkJICogRG8gbm90IGFsbG93IGFueSB1bmhhbmRsZWQgZXhjZXB0aW9ucyB0byBraWxsIHRoZSB0aHJlYWQuCi0JCSAqIFN0b3JlIHRoZW0gdXAgZm9yIGxhdGVyIHBhaW4uCi0JCSAqIEBzZWUgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciNzdG9wKCkKLQkJICovCi0JCXByaXZhdGUgdm9pZCBleGVjdXRlKCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLmV4ZWN1dGVfKCk7Ci0JCQl9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKLQkJCQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLnRoaXMuZXhjZXB0aW9ucy5hZGQoZXgpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFN1YmNsYXNzLWltcGxlbWVudGVkIGJlaGF2aW9yOiBjb25zdW1lIHN0dWZmLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIGV4ZWN1dGVfKCkgewotCQkJdGhpcy5jb25zdW1lci5leGVjdXRlKCk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMgdGhhdCBjb250cm9sczo8dWw+Ci0JICogPGxpPndoZW4gdGhlIGNvbnN1bWVyIHRocmVhZCBzdXNwZW5kcywgd2FpdGluZyBmb3Igc29tZXRoaW5nIHRvIGNvbnN1bWUKLQkgKiA8bGk+dGhlIGNvbnN1bWluZyBvZiB3aGF0ZXZlciBpcyBiZWluZyBwcm9kdWNlZAotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIGludGVyZmFjZSBDb25zdW1lciB7Ci0JCS8qKgotCQkgKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gY29uc3VtZS4KLQkJICogVGhyb3cgYW4ge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufSBpZiB0aGUgdGhyZWFkIGlzIGludGVycnVwdGVkLgotCQkgKi8KLQkJdm9pZCB3YWl0Rm9yUHJvZHVjZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0KLQkJLyoqCi0JCSAqIENvbnN1bWUgd2hhdGV2ZXIgaXMgY3VycmVudGx5IGF2YWlsYWJsZS4KLQkJICovCi0JCXZvaWQgZXhlY3V0ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRXhjZXB0aW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDliMzg0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogU2ltcGxlIGludGVyZmFjZSBmb3IgYWxsb3dpbmcgY2xpZW50cyB0byBwYXNzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGEKLSAqIHNlcnZpY2UgKGUuZy4gdG8gbG9nIHRoZSBleGNlcHRpb24pLiBUaGlzIGlzIHBhcnRpY3VsYXJseSBoZWxwZnVsIGlmIHRoZQotICogc2VydmljZSBleGVjdXRlcyBvbiBhbm90aGVyLCBwb3NzaWJseSBpbmFjY2Vzc2libGUsIHRocmVhZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRXhjZXB0aW9uSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiB3YXMgdGhyb3duLiBIYW5kbGUgaXQgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQl2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdCk7Ci0KLQkvKioKLQkgKiBTaW5nbGV0b24gaW1wbGVtZW50YXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGludGVyZmFjZSB0aGF0IGRvZXMKLQkgKiBub3RoaW5nIHdpdGggdGhlIGV4Y2VwdGlvbi4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgRXhjZXB0aW9uSGFuZGxlciwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbkhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIEV4Y2VwdGlvbkhhbmRsZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaW50ZXJmYWNlIHRoYXQKLQkgKiB3cmFwcyB0aGUgZXhjZXB0aW9uIGluIGEgcnVudGltZSBleGNlcHRpb24gYW5kIHRocm93cyBpdC4KLQkgKi8KLQlmaW5hbCBjbGFzcyBSdW50aW1lCi0JCWltcGxlbWVudHMgRXhjZXB0aW9uSGFuZGxlciwgU2VyaWFsaXphYmxlCi0JewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEV4Y2VwdGlvbkhhbmRsZXIgSU5TVEFOQ0UgPSBuZXcgUnVudGltZSgpOwotCQlwdWJsaWMgc3RhdGljIEV4Y2VwdGlvbkhhbmRsZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIFJ1bnRpbWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdCkgewotCQkJLy8gcmUtdGhyb3cgdGhlIGV4Y2VwdGlvbiB1bmNoZWNrZWQKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ZpbGVUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZTkzYTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmlsZVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi0vKioKLSAqIEFzc29ydGVkIGZpbGUgdG9vbHM6Ci0gKiAtIGRlbGV0ZSBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGl0ZXJhdG9ycyBvbiBlbnRpcmUgdHJlZXMgb2YgZGlyZWN0b3JpZXMgYW5kIGZpbGVzCi0gKiAtIGJ1aWxkIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeQotICogLSAiY2Fub25pemUiIGZpbGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGaWxlVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9IT01FX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUgPSAidG1wZGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVUlJFTlRfV09SS0lOR19ESVJFQ1RPUllfTkFNRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIEEgbGlzdCBvZiBzb21lIGludmFsaWQgZmlsZSBuYW1lIGNoYXJhY3RlcnMuCi0JCQkJOiBpcyB0aGUgZmlsZW5hbWUgc2VwYXJhdG9yIGluIE1hY09TIGFuZCB0aGUgZHJpdmUgaW5kaWNhdG9yIGluIERPUwotCQkJCSogaXMgYSBET1Mgd2lsZGNhcmQgY2hhcmFjdGVyCi0JCQkJfCBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkmIGlzIG91ciBvd24gZXNjYXBlIGNoYXJhY3RlcgotCQkJCS8gaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBVbml4IGFuZCB0aGUgY29tbWFuZCBvcHRpb24gdGFnIGluIERPUwotCQkJCVwgaXMgdGhlIGZpbGVuYW1lIHNlcGFyYXRvciBpbiBET1MvV2luZG93cyBhbmQgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgaW4gVW5peAotCQkJCTsgaXMgPz8/Ci0JCQkJPyBpcyBhIERPUyB3aWxkY2FyZCBjaGFyYWN0ZXIKLQkJCQlbIGlzID8/PwotCQkJCV0gaXMgPz8/Ci0JCQkJPSBpcyA/Pz8KLQkJCQkrIGlzID8/PwotCQkJCTwgaXMgYSBET1MgcmVkaXJlY3Rpb24gY2hhcmFjdGVyCi0JCQkJPiBpcyBhIERPUyByZWRpcmVjdGlvbiBjaGFyYWN0ZXIKLQkJCQkiIGlzIHVzZWQgYnkgRE9TIHRvIGRlbGltaXQgZmlsZSBuYW1lcyB3aXRoIHNwYWNlcwotCQkJCSwgaXMgPz8/Ci0gICAgICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTID0geyAnOicsICcqJywgJ3wnLCAnJicsICcvJywgJ1xcJywgJzsnLCAnPycsICdbJywgJ10nLCAnPScsICcrJywgJzwnLCAnPicsICciJywgJywnIH07Ci0KLQkvKiogVGhpcyBlbmNvZGVyIHdpbGwgY29udmVydCBzdHJpbmdzIGludG8gdmFsaWQgZmlsZSBuYW1lcy4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFN0cmluZ0VuY29kZXIgRklMRV9OQU1FX0VOQ09ERVIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihJTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JLyoqIFdpbmRvd3MgZmlsZXMgdGhhdCBhcmUgcmVkaXJlY3RlZCB0byBkZXZpY2VzIGV0Yy4gKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBXSU5ET1dTX1JFU0VSVkVEX0ZJTEVfTkFNRVMgPSB7Ci0JCSJjb24iLAotCQkiYXV4IiwKLQkJImNvbTEiLCAiY29tMiIsICJjb20zIiwgImNvbTQiLCAiY29tNSIsICJjb202IiwgImNvbTciLCAiY29tOCIsICJjb205IiwKLQkJImxwdDEiLCAibHB0MiIsICJscHQzIiwgImxwdDQiLCAibHB0NSIsICJscHQ2IiwgImxwdDciLCAibHB0OCIsICJscHQ5IiwKLQkJInBybiIsCi0JCSJudWwiCi0JfTsKLQotCS8qKiBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBzaG9ydGVuZWQgZmlsZSBuYW1lLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEggPSA2MDsKLQotCi0JLy8gKioqKioqKioqKiBkZWxldGluZyBkaXJlY3RvcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWxldGUgdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkgYW5kIGFsbCBvZiBpdHMgY29udGVudHMuCi0JICogPGVtPlVTRSBXSVRIIENBUkUuPC9lbT4KLQkgKiBGaWxlI2RlbGV0ZUFsbCgpPwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnkoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJZGVsZXRlRGlyZWN0b3J5KG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5IGFuZCBhbGwgb2YgaXRzIGNvbnRlbnRzLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVBbGwoKT8KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcmVjdG9yeSk7Ci0JCWlmICggISBkaXJlY3RvcnkuZGVsZXRlKCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmFibGUgdG8gZGVsZXRlIGRpcmVjdG9yeTogIiArIGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBEZWxldGUgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5Ci0JICogKGJ1dCBub3QgdGhlIGRpcmVjdG9yeSBpdHNlbGYpLgotCSAqIDxlbT5VU0UgV0lUSCBDQVJFLjwvZW0+Ci0JICogRmlsZSNkZWxldGVGaWxlcygpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVsZXRlIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeQotCSAqIChidXQgbm90IHRoZSBkaXJlY3RvcnkgaXRzZWxmKS4KLQkgKiA8ZW0+VVNFIFdJVEggQ0FSRS48L2VtPgotCSAqIEZpbGUjZGVsZXRlRmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXJlY3RvcnlDb250ZW50cyhGaWxlIGRpcmVjdG9yeSkgewotCQlmb3IgKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWRlbGV0ZURpcmVjdG9yeShmaWxlKTsJLy8gcmVjdXJzZSB0aHJvdWdoIHN1YmRpcmVjdG9yaWVzCi0JCQl9IGVsc2UgewotCQkJCWlmICggISBmaWxlLmRlbGV0ZSgpKSB7Ci0JCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ1bmFibGUgdG8gZGVsZXRlIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQotCS8vICoqKioqKioqKiogY29weWluZyBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNvdXJjZSBmaWxlIHRvIHRoZSBkZXN0aW5hdGlvbiBmaWxlLgotCSAqIEZpbGUjY29weShGaWxlIGRlc3RpbmF0aW9uRmlsZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weVRvRmlsZShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25GaWxlKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCUZpbGVDaGFubmVsIHNvdXJjZUNoYW5uZWwgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZUZpbGUpLmdldENoYW5uZWwoKTsKLQkJRmlsZUNoYW5uZWwgZGVzdGluYXRpb25DaGFubmVsID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb25GaWxlKS5nZXRDaGFubmVsKCk7Ci0JCXRyeSB7Ci0JCQlkZXN0aW5hdGlvbkNoYW5uZWwudHJhbnNmZXJGcm9tKHNvdXJjZUNoYW5uZWwsIDAsIHNvdXJjZUNoYW5uZWwuc2l6ZSgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXNvdXJjZUNoYW5uZWwuY2xvc2UoKTsKLQkJCWRlc3RpbmF0aW9uQ2hhbm5lbC5jbG9zZSgpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvcGllcyB0aGUgY29udGVudCBvZiB0aGUgc291cmNlIGZpbGUgdG8gYSBmaWxlIGJ5Ci0JICogdGhlIHNhbWUgbmFtZSBpbiB0aGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LgotCSAqIEZpbGUjY29weVRvRGlyZWN0b3J5KEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHlUb0RpcmVjdG9yeShGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdGluYXRpb25EaXJlY3RvcnkpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJRmlsZSBkZXN0aW5hdGlvbkZpbGUgPSBuZXcgRmlsZShkZXN0aW5hdGlvbkRpcmVjdG9yeSwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotCQlpZiAoICEgZGVzdGluYXRpb25GaWxlLmV4aXN0cygpICYmICEgZGVzdGluYXRpb25GaWxlLmNyZWF0ZU5ld0ZpbGUoKSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImNyZWF0ZU5ld0ZpbGUoKSBmYWlsZWQ6ICIgKyBkZXN0aW5hdGlvbkZpbGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0aW5hdGlvbkZpbGUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogaXRlcmF0b3Jpbmcgb3ZlciBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjZmlsZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZmlsZXNJbihuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGZpbGVzIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIFRoZSBpdGVyYXRvciB3aWxsIHNraXAgb3ZlciBzdWJkaXJlY3Rvcmllcy4KLQkgKiBGaWxlI2ZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW4oRmlsZSBkaXJlY3RvcnkpIHsKLQkJcmV0dXJuIGZpbGVzSW4oZGlyZWN0b3J5Lmxpc3RGaWxlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJbihGaWxlW10gZmlsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxGaWxlPihuZXcgQXJyYXlJdGVyYXRvcjxGaWxlPihmaWxlcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmlzRmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBzdWJkaXJlY3RvcmllcwotCSAqIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZGlyZWN0b3JpZXNJbihTdHJpbmcgZGlyZWN0b3J5TmFtZSkgewotCQlyZXR1cm4gZGlyZWN0b3JpZXNJbihuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzCi0JICogaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogRmlsZSNzdWJEaXJlY3RvcmllcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBkaXJlY3Rvcmllc0luKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luKGRpcmVjdG9yeS5saXN0RmlsZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW4oRmlsZVtdIGZpbGVzKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8RmlsZT4obmV3IEFycmF5SXRlcmF0b3I8RmlsZT4oZmlsZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChGaWxlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5pc0RpcmVjdG9yeSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gYWxsIHRoZSBmaWxlcyB1bmRlciB0aGUgc3BlY2lmaWVkCi0JICogZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3Rvcmllcy4KLQkgKiBUaGUgaXRlcmF0b3Igd2lsbCBza2lwIG92ZXIgdGhlIHN1YmRpcmVjdG9yaWVzIHRoZW1zZWx2ZXMuCi0JICogRmlsZSNmaWxlc1JlY3Vyc2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8RmlsZT4gZmlsZXNJblRyZWUoU3RyaW5nIGRpcmVjdG9yeU5hbWUpIHsKLQkJcmV0dXJuIGZpbGVzSW5UcmVlKG5ldyBGaWxlKGRpcmVjdG9yeU5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9uIGFsbCB0aGUgZmlsZXMgdW5kZXIgdGhlIHNwZWNpZmllZAotCSAqIGRpcmVjdG9yeSwgcmVjdXJzaW5nIGludG8gc3ViZGlyZWN0b3JpZXMuCi0JICogVGhlIGl0ZXJhdG9yIHdpbGwgc2tpcCBvdmVyIHRoZSBzdWJkaXJlY3RvcmllcyB0aGVtc2VsdmVzLgotCSAqIEZpbGUjZmlsZXNSZWN1cnNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGZpbGVzSW5UcmVlKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCXJldHVybiBmaWxlc0luVHJlZUFzU2V0KGRpcmVjdG9yeSkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTZXQ8RmlsZT4gZmlsZXNJblRyZWVBc1NldChGaWxlIGRpcmVjdG9yeSkgewotCQlTZXQ8RmlsZT4gZmlsZXMgPSBuZXcgSGFzaFNldDxGaWxlPigxMDAwMCk7Ci0JCWFkZEZpbGVzSW5UcmVlVG8oZGlyZWN0b3J5LCBmaWxlcyk7Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEZpbGVzSW5UcmVlVG8oRmlsZSBkaXJlY3RvcnksIENvbGxlY3Rpb248RmlsZT4gYWxsRmlsZXMpIHsKLQkJZm9yIChGaWxlIGZpbGUgOiBkaXJlY3RvcnkubGlzdEZpbGVzKCkpIHsKLQkJCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQkJYWxsRmlsZXMuYWRkKGZpbGUpOwotCQkJfSBlbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlhZGRGaWxlc0luVHJlZVRvKGZpbGUsIGFsbEZpbGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXNSZWN1cnNlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlKFN0cmluZyBkaXJlY3RvcnlOYW1lKSB7Ci0JCXJldHVybiBkaXJlY3Rvcmllc0luVHJlZShuZXcgRmlsZShkaXJlY3RvcnlOYW1lKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciBvbiBhbGwgdGhlIGRpcmVjdG9yaWVzIHVuZGVyIHRoZSBzcGVjaWZpZWQKLQkgKiBkaXJlY3RvcnksIHJlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLgotCSAqIEZpbGUjc3ViRGlyZWN0b3JpZXNSZWN1cnNlKCkKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCUZpbGVbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxGaWxlPihkaXJlY3Rvcmllc0luKGZpbGVzKSwgZGlyZWN0b3JpZXNJblRyZWVzKGRpcmVjdG9yaWVzSW4oZmlsZXMpKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGRpcmVjdG9yaWVzSW5UcmVlcyhJdGVyYXRvcjxGaWxlPiBkaXJlY3RvcmllcykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEZpbGU+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgSXRlcmF0b3I8RmlsZT4+KGRpcmVjdG9yaWVzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEZpbGU+IHRyYW5zZm9ybShGaWxlIG5leHQpIHsKLQkJCQkJcmV0dXJuIEZpbGVUb29scy5kaXJlY3Rvcmllc0luVHJlZShuZXh0KTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBzaG9ydCBmaWxlIG5hbWUgbWFuaXB1bGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmlwIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JICogU3RyaXAgdGhlIGV4dGVuc2lvbiBmcm9tIHRoZSBzcGVjaWZpZWQgZmlsZSdzIG5hbWUKLQkgKiBhbmQgcmV0dXJuIHRoZSByZXN1bHQuIElmIHRoZSBmaWxlJ3MgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gc3RyaXBFeHRlbnNpb24oZmlsZS5nZXRQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8gZXh0ZW5zaW9uLCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nLgotCSAqIEZpbGUjZXh0ZW5zaW9uKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWludCBpbmRleCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZpbGVOYW1lLnN1YnN0cmluZyhpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgdGhlIGRvdCwgb2YgdGhlIHNwZWNpZmllZCBmaWxlJ3MgbmFtZS4KLQkgKiBJZiB0aGUgZmlsZSdzIG5hbWUgaGFzIG5vIGV4dGVuc2lvbiwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KLQkgKiBGaWxlI2V4dGVuc2lvbigpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0ZW5zaW9uKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZXh0ZW5zaW9uKGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVtcG9yYXJ5IGRpcmVjdG9yaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYW4gZW1wdHkgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGNsZWFyZWQgb3V0LgotCSAqIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIEphdmEgdGVtcG9yYXJ5IGRpcmVjdG9yeSwKLQkgKiBhcyBpbmRpY2F0ZWQgYnkgdGhlIFN5c3RlbSBwcm9wZXJ0eSAiamF2YS5pby50bXBkaXIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBlbXB0eVRlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgbmFtZSkgewotCQlGaWxlIGRpciA9IG5ldyBGaWxlKHVzZXJUZW1wb3JhcnlEaXJlY3RvcnkoKSwgbmFtZSk7Ci0JCWlmIChkaXIuZXhpc3RzKCkpIHsKLQkJCWRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlta2RpcnMoZGlyKTsKLQkJfQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWtkaXJzKEZpbGUgZGlyKSB7Ci0JCWlmICggISBkaXIubWtkaXJzKCkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJta2RpcnMoKSBmYWlsZWQ6ICIgKyBkaXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhbiBlbXB0eSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggYQotCSAqIG5hbWUgb2YgInRtcGRpciIuIElmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IHdpbGwgYmUgY2xlYXJlZCBvdXQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGVtcHR5VGVtcG9yYXJ5RGlyZWN0b3J5KCkgewotCQlyZXR1cm4gZW1wdHlUZW1wb3JhcnlEaXJlY3RvcnkoREVGQVVMVF9URU1QT1JBUllfRElSRUNUT1JZX05BTUUpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lLiBJZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIGxlZnQgdW5jaGFuZ2VkOwotCSAqIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QsIGl0IHdpbGwgYmUgY3JlYXRlZC4KLQkgKiBUaGlzIGRpcmVjdG9yeSB3aWxsIGJlIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSBKYXZhIHRlbXBvcmFyeSBkaXJlY3RvcnksCi0JICogYXMgaW5kaWNhdGVkIGJ5IHRoZSBTeXN0ZW0gcHJvcGVydHkgImphdmEuaW8udG1wZGlyIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdGVtcG9yYXJ5RGlyZWN0b3J5KFN0cmluZyBuYW1lKSB7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBuYW1lKTsKLQkJaWYgKCAhIGRpci5leGlzdHMoKSkgewotCQkJbWtkaXJzKGRpcik7Ci0JCX0KLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhIG5hbWUgb2YKLQkgKiAidG1wZGlyIi4gSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSBsZWZ0IHVuY2hhbmdlZDsKLQkgKiBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBpdCB3aWxsIGJlIGNyZWF0ZWQuCi0JICogVGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LAotCSAqIGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIHRlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIHRlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSAqbmV3KiB0ZW1wb3JhcnkgZGlyZWN0b3J5IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHByZWZpeC4gVGhlIHByZWZpeCB3aWxsIGJlIGFwcGVuZGVkIHdpdGggYSBudW1iZXIgdGhhdAotCSAqIGlzIGluY3JlbWVudGVkLCBzdGFydGluZyB3aXRoIDEsIHVudGlsIGEgbm9uLXByZS1leGlzdGluZyBkaXJlY3RvcnkKLQkgKiBpcyBmb3VuZCBhbmQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYQotCSAqIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhcyBpbmRpY2F0ZWQgYnkKLQkgKiB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIG5ld1RlbXBvcmFyeURpcmVjdG9yeShTdHJpbmcgcHJlZml4KSB7Ci0JCWlmICggISBwcmVmaXguZW5kc1dpdGgoIi4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcmVmaXggPSBwcmVmaXggKyAnLic7Ci0JCX0KLQkJRmlsZSBkaXI7Ci0JCWludCBpID0gMDsKLQkJZG8gewotCQkJaSsrOwotCQkJZGlyID0gbmV3IEZpbGUodXNlclRlbXBvcmFyeURpcmVjdG9yeSgpLCBwcmVmaXggKyBpKTsKLQkJfSB3aGlsZSAoICEgZGlyLm1rZGlycygpKTsKLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhICpuZXcqIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhCi0JICogcHJlZml4IG9mICJ0bXBkaXIiLiBUaGlzIHByZWZpeCB3aWxsIGJlIGFwcGVuZGVkIHdpdGggYSBudW1iZXIgdGhhdAotCSAqIGlzIGluY3JlbWVudGVkLCBzdGFydGluZyB3aXRoIDEsIHVudGlsIGEgbm9uLXByZS1leGlzdGluZyBkaXJlY3RvcnkKLQkgKiBpcyBmb3VuZCBhbmQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIFRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgYQotCSAqIHN1YmRpcmVjdG9yeSBvZiB0aGUgSmF2YSB0ZW1wb3JhcnkgZGlyZWN0b3J5LCBhcyBpbmRpY2F0ZWQgYnkKLQkgKiB0aGUgU3lzdGVtIHByb3BlcnR5ICJqYXZhLmlvLnRtcGRpciIuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIG5ld1RlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ld1RlbXBvcmFyeURpcmVjdG9yeShERUZBVUxUX1RFTVBPUkFSWV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBmaWxlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KLQkgKiBUaGUgcmVzb3VyY2UgbmFtZSBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZCwgaS5lLiBpdCBjYW5ub3QgYmUgcmVsYXRpdmUKLQkgKiB0byB0aGUgcGFja2FnZSBuYW1lL2RpcmVjdG9yeS4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgcmVzb3VyY2VGaWxlKFN0cmluZyByZXNvdXJjZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlpZiAoICEgcmVzb3VyY2VOYW1lLnN0YXJ0c1dpdGgoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHJlc291cmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlRmlsZShyZXNvdXJjZU5hbWUsIEZpbGVUb29scy5jbGFzcyk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlLgotCSAqIE5COiBUaGVyZSBpcyBhIGJ1ZyBpbiBqZGsxLjQueCB0aGUgcHJldmVudHMgdXMgZnJvbSBnZXR0aW5nCi0JICogYSByZXNvdXJjZSB0aGF0IGhhcyBzcGFjZXMgKG9yIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycykgaW4KLQkgKiBpdHMgbmFtZS4uLi4gKHNlZSBTdW4ncyBKYXZhIGJ1ZyA0NDY2NDg1KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvdXJjZUZpbGUoU3RyaW5nIHJlc291cmNlTmFtZSwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IGphdmFDbGFzcy5nZXRSZXNvdXJjZShyZXNvdXJjZU5hbWUpOwotCQlyZXR1cm4gYnVpbGRGaWxlKHVybCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIFVSTC4KLQkgKiBOQjogVGhlcmUgaXMgYSBidWcgaW4gamRrMS40LnggdGhlIHByZXZlbnRzIHVzIGZyb20gZ2V0dGluZwotCSAqIGEgcmVzb3VyY2UgdGhhdCBoYXMgc3BhY2VzIChvciBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMpIGluCi0JICogaXRzIG5hbWUuLi4uIChzZWUgU3VuJ3MgSmF2YSBidWcgNDQ2NjQ4NSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgYnVpbGRGaWxlKFVSTCB1cmwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRGaWxlKHVybC5nZXRGaWxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUuCi0JICogTkI6IFRoZXJlIGlzIGEgYnVnIGluIGpkazEuNC54IHRoZSBwcmV2ZW50cyB1cyBmcm9tIGdldHRpbmcKLQkgKiBhIHJlc291cmNlIHRoYXQgaGFzIHNwYWNlcyAob3Igb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzKSBpbgotCSAqIGl0cyBuYW1lLi4uLiAoc2VlIFN1bidzIEphdmEgYnVnIDQ0NjY0ODUpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGJ1aWxkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQlVUkkgdXJpID0gbmV3IFVSSShmaWxlTmFtZSk7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaS5nZXRQYXRoKCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqICJjYW5vbmljYWwiIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlIGludG8gYSAiY2Fub25pY2FsIiBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjYW5vbmljYWxGaWxlKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2V4Y2VwdGlvbikgewotCQkJLy8gc2V0dGxlIGZvciB0aGUgYWJzb2x1dGUgZmlsZQotCQkJcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVGaWxlKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gaXRlcmF0b3IgdGhhdCB3aWxsIGNvbnZlcnQgdGhlIHNwZWNpZmllZCBmaWxlcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBjYW5vbmljYWxGaWxlcyhJdGVyYXRvcjxGaWxlPiBmaWxlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8RmlsZSwgRmlsZT4oZmlsZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEZpbGUgdHJhbnNmb3JtKEZpbGUgbmV4dCkgewotCQkJCXJldHVybiBjYW5vbmljYWxGaWxlKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGVzCi0JICogaW50byAiY2Fub25pY2FsIiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPEZpbGU+IGNhbm9uaWNhbEZpbGVzKENvbGxlY3Rpb248RmlsZT4gZmlsZXMpIHsKLQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVzKGZpbGVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGludG8gYSAiY2Fub25pY2FsIiBmaWxlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCS8qKgotCSAqIEJ1aWxkIGFuIGl0ZXJhdG9yIHRoYXQgd2lsbCBjb252ZXJ0IHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lcwotCSAqIGludG8gImNhbm9uaWNhbCIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gY2Fub25pY2FsRmlsZU5hbWVzKEl0ZXJhdG9yPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oZmlsZU5hbWVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIGNhbm9uaWNhbEZpbGVOYW1lKG5leHQpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBCdWlsZCBhbiBpdGVyYXRvciB0aGF0IHdpbGwgY29udmVydCB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZXMKLQkgKiBpbnRvICJjYW5vbmljYWwiIGZpbGUgbmFtZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNhbm9uaWNhbEZpbGVOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gZmlsZU5hbWVzKSB7Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlTmFtZXMoZmlsZU5hbWVzLml0ZXJhdG9yKCkpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogZmlsZSBuYW1lIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsZU5hbWVJc0ludmFsaWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiAhIGZpbGVOYW1lSXNWYWxpZChmaWxlbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgaXMgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNWYWxpZChTdHJpbmcgZmlsZW5hbWUpIHsKLQkJaW50IGxlbiA9IGZpbGVuYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGZpbGVuYW1lQ2hhciA9IGZpbGVuYW1lLmNoYXJBdChpKTsKLQkJCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKElOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUywgZmlsZW5hbWVDaGFyKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBpbGxlZ2FsIGNoYXJhY3RlcnMgaW4gdGhlIHNwZWNpZmllZCBmaWxlIG5hbWUgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVmFsaWRGaWxlTmFtZShTdHJpbmcgZmlsZW5hbWUsIGNoYXIgcmVwbGFjZW1lbnRDaGFyKSB7Ci0JCWludCBsZW4gPSBmaWxlbmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgZmlsZW5hbWVDaGFyID0gZmlsZW5hbWUuY2hhckF0KGkpOwotCQkJaWYgKEFycmF5VG9vbHMuY29udGFpbnMoSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTLCBmaWxlbmFtZUNoYXIpKSB7Ci0JCQkJc2IuYXBwZW5kKHJlcGxhY2VtZW50Q2hhcik7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZChmaWxlbmFtZUNoYXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGlsbGVnYWwgY2hhcmFjdGVycyBpbiB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZSB0bwotCSAqIHBlcmlvZHMgKCcuJykgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1ZhbGlkRmlsZU5hbWUoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9WYWxpZEZpbGVOYW1lKGZpbGVuYW1lLCAnLicpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZmlsZSBuYW1lIGlzICJyZXNlcnZlZCIKLQkgKiAoaS5lLiBpdCBjYW5ub3QgYmUgdXNlZCBmb3IgInVzZXIiIGZpbGVzKS4gV2luZG93cyByZXNlcnZlcwotCSAqIGEgbnVtYmVyIG9mIGZpbGUgbmFtZXMgKGUuZy4gQ09OLCBBVVgsIFBSTikuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGZpbGVOYW1lSXNSZXNlcnZlZChTdHJpbmcgZmlsZU5hbWUpIHsKLQkJLy8gVW5peC9MaW51eCBkb2VzIG5vdCBoYXZlIGFueSAicmVzZXJ2ZWQiIGZpbGUgbmFtZXMgKEkgdGhpbmsuLi4pCi0JCXJldHVybiBUb29scy5vc0lzV2luZG93cygpICYmIEFycmF5VG9vbHMuY29udGFpbnMoV0lORE9XU19SRVNFUlZFRF9GSUxFX05BTUVTLCBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGZpbGUgY29udGFpbnMgYW55ICJyZXNlcnZlZCIKLQkgKiBjb21wb25lbnRzLgotCSAqIFdpbmRvd3MgcmVzZXJ2ZXMgYSBudW1iZXIgb2YgZmlsZSBuYW1lcyAoZS5nLiBDT04sIEFVWCwgUFJOKTsKLQkgKiBhbmQgdGhlc2UgZmlsZSBuYW1lcyBjYW5ub3QgYmUgdXNlZCBmb3IgZWl0aGVyIHRoZSBuYW1lcyBvZgotCSAqIGZpbGVzIG9yIGRpcmVjdG9yaWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBmaWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKEZpbGUgZmlsZSkgewotCQlGaWxlIHRlbXAgPSBmaWxlOwotCQl3aGlsZSAodGVtcCAhPSBudWxsKSB7Ci0JCQlpZiAoZmlsZU5hbWVJc1Jlc2VydmVkKHRlbXAuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50RmlsZSgpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2hvcnRlbmVkIGZpbGUgbmFtZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoVVJMIHVybCkgewotCQlyZXR1cm4gc2hvcnRlbkZpbGVOYW1lKHVybCwgTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2hvcnRlciB2ZXJzaW9uIG9mIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBUaGUgc2hvcnRlciB2ZXJzaW9uIHdpbGwgbm90IGJlIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aC4KLQkgKiBUaGUgZmlyc3QgZGlyZWN0b3J5ICh1c3VhbGx5IHRoZSBkcml2ZSBsZXR0ZXIpIGFuZCB0aGUgZmlsZSBuYW1lIG9yIHRoZQotCSAqIGxhc3QgZGlyZWN0b3J5IHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBnZW5lcmF0ZWQgc3RyaW5nIHJlZ2FyZGxlc3Mgb2YKLQkgKiB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydGVuRmlsZU5hbWUoVVJMIHVybCwgaW50IG1heExlbmd0aCkgewotCQlGaWxlIGZpbGU7Ci0JCXRyeSB7Ci0JCQlmaWxlID0gYnVpbGRGaWxlKHVybCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlmaWxlID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHNob3J0ZW5GaWxlTmFtZShmaWxlLCBtYXhMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gc2hvcnRlbkZpbGVOYW1lKGZpbGUsIE1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHNob3J0ZXIgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogVGhlIHNob3J0ZXIgdmVyc2lvbiB3aWxsIG5vdCBiZSBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGguCi0JICogVGhlIGZpcnN0IGRpcmVjdG9yeSAodXN1YWxseSB0aGUgZHJpdmUgbGV0dGVyKSBhbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUKLQkgKiBsYXN0IGRpcmVjdG9yeSB3aWxsIGFsd2F5cyBiZSBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkIHN0cmluZyByZWdhcmRsZXNzIG9mCi0JICogdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnRlbkZpbGVOYW1lKEZpbGUgZmlsZSwgaW50IG1heExlbmd0aCkgewotCQlTdHJpbmcgYWJzb2x1dGVGaWxlTmFtZSA9IGNhbm9uaWNhbEZpbGUoZmlsZSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCWlmIChhYnNvbHV0ZUZpbGVOYW1lLmxlbmd0aCgpIDw9IG1heExlbmd0aCkgewotCQkJLy8gbm8gbmVlZCB0byBzaG9ydGVuCi0JCQlyZXR1cm4gYWJzb2x1dGVGaWxlTmFtZTsKLQkJfQotCi0JCS8vIGJyZWFrIGRvd24gdGhlIHBhdGggaW50byBpdHMgY29tcG9uZW50cwotCQlTdHJpbmcgZnMgPSBGaWxlLnNlcGFyYXRvcjsKLQkJU3RyaW5nW10gcGF0aHMgPSBhYnNvbHV0ZUZpbGVOYW1lLnNwbGl0KCdcXCcgKyBmcyk7Ci0KLQkJaWYgKHBhdGhzLmxlbmd0aCA8PSAxKSB7Ci0JCQkvLyBlLmcuICJDOlwiCi0JCQlyZXR1cm4gcGF0aHNbMF07Ci0JCX0KLQotCQlpZiAocGF0aHMubGVuZ3RoID09IDIpIHsKLQkJCS8vIGUuZy4gIkM6XE15UmVhbGx5TG9uZ0ZpbGVOYW1lLmV4dCIgb3IgIkM6XE15UmVhbGx5TG9uZ0RpcmVjdG9yeU5hbWUiCi0JCQkvLyByZXR1cm4gdGhlIGNvbXBsZXRlIGZpbGUgbmFtZSBzaW5jZSB0aGlzIGlzIGEgbWluaW11bSByZXF1aXJlbWVudCwKLQkJCS8vIHJlZ2FyZGxlc3Mgb2YgdGhlIG1heGltdW0gbGVuZ3RoIGFsbG93ZWQKLQkJCXJldHVybiBhYnNvbHV0ZUZpbGVOYW1lOwotCQl9Ci0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChwYXRoc1swXSk7CQkvLyBhbHdheXMgYWRkIHRoZSBmaXJzdCBkaXJlY3RvcnksIHdoaWNoIGlzIHVzdWFsbHkgdGhlIGRyaXZlIGxldHRlcgotCi0JCS8vIEtlZXAgdGhlIGluZGV4IG9mIGluc2VydGlvbiBpbnRvIHRoZSBzdHJpbmcgYnVmZmVyCi0JCWludCBpbnNlcnRJbmRleCA9IHNiLmxlbmd0aCgpOwotCi0JCXNiLmFwcGVuZChmcyk7Ci0JCXNiLmFwcGVuZChwYXRoc1twYXRocy5sZW5ndGggLSAxXSk7CQkvLyBhcHBlbmQgdGhlIGZpbGUgbmFtZSBvciB0aGUgbGFzdCBkaXJlY3RvcnkKLQotCQltYXhMZW5ndGggLT0gNDsgICAgICAgICAgICAgICAgICAgICAgLy8gLTQgZm9yICIvLi4uIgotCi0JCWludCBjdXJyZW50TGVuZ3RoID0gc2IubGVuZ3RoKCkgLSA0OyAvLyAtNCBmb3IgIi8uLi4iCi0JCWludCBsZWZ0SW5kZXggPSAxOyAgICAgICAgICAgICAgICAgICAvLyAgMSB0byBza2lwIHRoZSByb290IGRpcmVjdG9yeQotCQlpbnQgcmlnaHRJbmRleCA9IHBhdGhzLmxlbmd0aCAtIDI7ICAgLy8gLTEgZm9yIHRoZSBmaWxlIG5hbWUgb3IgdGhlIGxhc3QgZGlyZWN0b3J5Ci0KLQkJYm9vbGVhbiBjYW5BZGRGcm9tTGVmdCA9IHRydWU7Ci0JCWJvb2xlYW4gY2FuQWRkRnJvbVJpZ2h0ID0gdHJ1ZTsKLQotCQkvLyBBZGQgZWFjaCBkaXJlY3RvcnksIHRoZSBpbnNlcnRpb24gaXMgZ29pbmcgaW4gYm90aCBkaXJlY3Rpb246IGxlZnQgYW5kCi0JCS8vIHJpZ2h0LCBvbmNlIGEgc2lkZSBjYW4ndCBiZSBhZGRlZCwgdGhlIG90aGVyIHNpZGUgaXMgc3RpbGwgY29udGludWluZwotCQkvLyB1bnRpbCBib3RoIGNhbid0IGFkZCBhbnltb3JlCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAoIWNhbkFkZEZyb21MZWZ0ICYmICFjYW5BZGRGcm9tUmlnaHQpCi0JCQkJYnJlYWs7Ci0KLQkJCWlmIChjYW5BZGRGcm9tUmlnaHQpIHsKLQkJCQlTdHJpbmcgcmlnaHREaXJlY3RvcnkgPSBwYXRoc1tyaWdodEluZGV4XTsKLQkJCQlpbnQgcmlnaHRMZW5ndGggPSByaWdodERpcmVjdG9yeS5sZW5ndGgoKTsKLQotCQkJCS8vIEFkZCB0aGUgZGlyZWN0b3J5IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBsb29wCi0JCQkJaWYgKGN1cnJlbnRMZW5ndGggKyByaWdodExlbmd0aCArIDEgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgICAgIGZzKTsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgcmlnaHREaXJlY3RvcnkpOwotCi0JCQkJCWN1cnJlbnRMZW5ndGggKz0gcmlnaHRMZW5ndGggKyAxOwotCQkJCQlyaWdodEluZGV4LS07Ci0KLQkJCQkJLy8gVGhlIHJpZ2h0IHNpZGUgaXMgbm93IG92ZXJsYXBwaW5nIHRoZSBsZWZ0IHNpZGUsIHRoYXQgbWVhbnMKLQkJCQkJLy8gd2UgY2FuJ3QgYWRkIGZyb20gdGhlIHJpZ2h0IHNpZGUgYW55bW9yZQotCQkJCQlpZiAobGVmdEluZGV4ID49IHJpZ2h0SW5kZXgpIHsKLQkJCQkJCWNhbkFkZEZyb21SaWdodCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY2FuQWRkRnJvbVJpZ2h0ID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2FuQWRkRnJvbUxlZnQpIHsKLQkJCQlTdHJpbmcgbGVmdERpcmVjdG9yeSA9IHBhdGhzW2xlZnRJbmRleF07Ci0JCQkJaW50IGxlZnRMZW5ndGggPSBsZWZ0RGlyZWN0b3J5Lmxlbmd0aCgpOwotCi0JCQkJLy8gQWRkIHRoZSBkaXJlY3Rvcnkgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgbG9vcAotCQkJCWlmIChjdXJyZW50TGVuZ3RoICsgbGVmdExlbmd0aCArIDEgPD0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXNiLmluc2VydChpbnNlcnRJbmRleCwgICAgIGZzKTsKLQkJCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4ICsgMSwgbGVmdERpcmVjdG9yeSk7Ci0KLQkJCQkJaW5zZXJ0SW5kZXggKz0gbGVmdExlbmd0aCArIDE7Ci0JCQkJCWN1cnJlbnRMZW5ndGggKz0gbGVmdExlbmd0aCArIDE7Ci0JCQkJCWxlZnRJbmRleCsrOwotCi0JCQkJCS8vIFRoZSBsZWZ0IHNpZGUgaXMgbm93IG92ZXJsYXBwaW5nIHRoZSByaWdodCBzaWRlLCB0aGF0IG1lYW5zCi0JCQkJCS8vIHdlIGNhbid0IGFkZCBmcm9tIHRoZSBsZWZ0IHNpZGUgYW55bW9yZQotCQkJCQlpZiAobGVmdEluZGV4ID49IHJpZ2h0SW5kZXgpIHsKLQkJCQkJCWNhbkFkZEZyb21MZWZ0ID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQljYW5BZGRGcm9tTGVmdCA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChsZWZ0SW5kZXggPD0gcmlnaHRJbmRleCkgewotCQkJc2IuaW5zZXJ0KGluc2VydEluZGV4LCBmcyk7Ci0JCQlzYi5pbnNlcnQoaW5zZXJ0SW5kZXggKyAxLCAiLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeXN0ZW0gcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB1c2VySG9tZURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKFVTRVJfSE9NRV9ESVJFQ1RPUllfTkFNRSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgcmVwcmVzZW50aW5nIHRoZSB1c2VyJ3MgdGVtcG9yYXJ5IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgdXNlclRlbXBvcmFyeURpcmVjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKFVTRVJfVEVNUE9SQVJZX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoQ1VSUkVOVF9XT1JLSU5HX0RJUkVDVE9SWV9OQU1FKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhlIGZpbGVzIHRoYXQgZml0IHRoZSBmaWx0ZXIuCi0JICogRmlsZSNmaWxlcyhGaWxlRmlsdGVyIGZpbGVGaWx0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxGaWxlPiBmaWx0ZXIoSXRlcmF0b3I8RmlsZT4gZmlsZXMsIGZpbmFsIEZpbGVGaWx0ZXIgZmlsZUZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEZpbGU+KGZpbGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChGaWxlIG5leHQpIHsKLQkJCQlyZXR1cm4gZmlsZUZpbHRlci5hY2NlcHQobmV4dCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKC9mb28vYmFyL2Jhei5qYXZhLCAvZm9vKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzOgotCSAqICAgICAgICAgY29udmVydFRvUmVsYXRpdmVGaWxlKEM6XGZvb1xiYXJcYmF6LmphdmEsIEM6XGZvbykKLQkgKiAgICAgICAgICAgICA9PiBiYXIvYmF6LmphdmEKLQkgKiBUaGUgZmlsZSBjYW4gYmUgZWl0aGVyIGEgZmlsZSBvciBhIGRpcmVjdG9yeTsgdGhlIGRpcmVjdG9yeQotCSAqICpzaG91bGQqIGJlIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgcmVsYXRpdmUgb3IgaXQgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUKLQkgKiB0byB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIEZpbGUgZGlyKSB7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSByZWxhdGl2ZQotCQlpZiAoICEgZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0KLQkJRmlsZSBjRmlsZSA9IGNhbm9uaWNhbEZpbGUoZmlsZSk7Ci0JCUZpbGUgY0RpciA9IGNhbm9uaWNhbEZpbGUoZGlyKTsKLQotCQkvLyB0aGUgdHdvIGFyZSB0aGUgc2FtZSBkaXJlY3RvcnkKLQkJaWYgKGNGaWxlLmVxdWFscyhjRGlyKSkgewotCQkJcmV0dXJuIG5ldyBGaWxlKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUZpbGVbXSBmaWxlUGF0aEZpbGVzID0gcGF0aEZpbGVzKGNGaWxlKTsKLQkJRmlsZVtdIGRpclBhdGhGaWxlcyA9IHBhdGhGaWxlcyhjRGlyKTsKLQotCQkvLyBXaW5kb3dzIG9ubHkgKD8pOiB0aGUgcm9vdHMgYXJlIGRpZmZlcmVudCAtIGUuZy4gRDpcIHZzLiBDOlwKLQkJaWYgKCAhIGRpclBhdGhGaWxlc1swXS5lcXVhbHMoZmlsZVBhdGhGaWxlc1swXSkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0KLQkJLy8gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByb290IGlzIHRoZSBzYW1lLCBub3cgZmluZCBob3cgbXVjaCBpcyBpbiBjb21tb24KLQkJaW50IGkgPSAwOwkJLy8gdGhpcyB3aWxsIHBvaW50IGF0IHRoZSBmaXJzdCBtaXNjb21wYXJlCi0JCXdoaWxlICgoaSA8IGRpclBhdGhGaWxlcy5sZW5ndGgpICYmIChpIDwgZmlsZVBhdGhGaWxlcy5sZW5ndGgpKSB7Ci0JCQlpZiAoZGlyUGF0aEZpbGVzW2ldLmVxdWFscyhmaWxlUGF0aEZpbGVzW2ldKSkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gc2F2ZSBvdXIgY3VycmVudCBwb3NpdGlvbgotCQlpbnQgZmlyc3RNaXNtYXRjaCA9IGk7Ci0KLQkJLy8gY2hlY2sgd2hldGhlciB0aGUgZmlsZSBpcyBBQk9WRSB0aGUgZGlyZWN0b3J5OiAuLi8uLgotCQlpZiAoZmlyc3RNaXNtYXRjaCA9PSBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJcmV0dXJuIHJlbGF0aXZlUGFyZW50RmlsZShkaXJQYXRoRmlsZXMubGVuZ3RoIC0gZmlyc3RNaXNtYXRjaCk7Ci0JCX0KLQotCQkvLyBidWlsZCBhIG5ldyBmaWxlIGZyb20gdGhlIHBhdGggYmV5b25kIHRoZSBtYXRjaGluZyBwb3J0aW9ucwotCQlGaWxlIGRpZmYgPSBuZXcgRmlsZShmaWxlUGF0aEZpbGVzW2ldLmdldE5hbWUoKSk7Ci0JCXdoaWxlICgrK2kgPCBmaWxlUGF0aEZpbGVzLmxlbmd0aCkgewotCQkJZGlmZiA9IG5ldyBGaWxlKGRpZmYsIGZpbGVQYXRoRmlsZXNbaV0uZ2V0TmFtZSgpKTsKLQkJfQotCi0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgQkVMT1cgdGhlIGRpcmVjdG9yeTogc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCWlmIChmaXJzdE1pc21hdGNoID09IGRpclBhdGhGaWxlcy5sZW5ndGgpIHsKLQkJCXJldHVybiBkaWZmOwotCQl9Ci0KLQkJLy8gdGhlIGZpbGUgbXVzdCBiZSBhIFBFRVIgb2YgdGhlIGRpcmVjdG9yeTogLi4vLi4vc3ViZGlyMS9zdWJkaXIyL2ZpbGUuZXh0Ci0JCXJldHVybiBuZXcgRmlsZShyZWxhdGl2ZVBhcmVudEZpbGUoZGlyUGF0aEZpbGVzLmxlbmd0aCAtIGZpcnN0TWlzbWF0Y2gpLCBkaWZmLmdldFBhdGgoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB0aGF0IGlzIGEgcmUtc3BlY2lmaWNhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0JICogZmlsZSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JICogICAgIExpbnV4L1VuaXgvTWFjIChDV0QgPSAvZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZSgvZm9vL2Jhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBiYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93cyAoQ1dEID0gQzpcZm9vKToKLQkgKiAgICAgICAgIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShDOlxmb29cYmFyXGJhei5qYXZhKQotCSAqICAgICAgICAgICAgID0+IGJhci9iYXouamF2YQotCSAqIFRoZSBmaWxlIGNhbiBiZSBlaXRoZXIgYSBmaWxlIG9yIGEgZGlyZWN0b3J5LgotCSAqIElmIHRoZSBmaWxlIGlzIGFscmVhZHkgcmVsYXRpdmUgb3IgaXQgY2Fubm90IGJlIG1hZGUgcmVsYXRpdmUKLQkgKiB0byB0aGUgZGlyZWN0b3J5LCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaW5hbCBGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgZmlsZXMgcmVwcmVzZW50aW5nIHRoZSBwYXRoIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLiBGb3IgZXhhbXBsZToKLQkgKiAgICAgQzovZm9vL2Jhci9iYXoudHh0ID0+Ci0JICogICAgIHsgQzovLCBDOi9mb28sIEM6L2Zvby9iYXIsIEM6L2Zvby9iYXIvYmF6LnR4dCB9Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZVtdIHBhdGhGaWxlcyhGaWxlIGZpbGUpIHsKLQkJTGlzdDxGaWxlPiBwYXRoID0gbmV3IEFycmF5TGlzdDxGaWxlPigpOwotCQlmb3IgKEZpbGUgZiA9IGZpbGU7IGYgIT0gbnVsbDsgZiA9IGYuZ2V0UGFyZW50RmlsZSgpKSB7Ci0JCQlwYXRoLmFkZChmKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHBhdGgpOwotCQlyZXR1cm4gcGF0aC50b0FycmF5KG5ldyBGaWxlW3BhdGguc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgKG5vbi16ZXJvKSBudW1iZXIgb2YgcmVsYXRpdmUKLQkgKiBmaWxlIG5hbWVzLCBlLmcuIHh4eCgzKSA9PiAuLi8uLi8uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgcmVsYXRpdmVQYXJlbnRGaWxlKGludCBsZW4pIHsKLQkJaWYgKGxlbiA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybzogIiArIGxlbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKCIuLiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSBsZW4gLSAxOyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdCA9IG5ldyBGaWxlKHJlc3VsdCwgIi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGZpbGUgdGhhdCBpcyBhIHJlLXNwZWNpZmljYXRpb24gb2YgdGhlIHNwZWNpZmllZAotCSAqIGZpbGUsIGFic29sdXRlIHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgotCSAqICAgICBMaW51eC9Vbml4L01hYzoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIC9mb28pCi0JICogICAgICAgICAgICAgPT4gL2Zvby9iYXIvYmF6LmphdmEKLQkgKiAgICAgV2luZG93czoKLQkgKiAgICAgICAgIGNvbnZlcnRUb0Fic29sdXRlRmlsZShiYXIvYmF6LmphdmEsIEM6XGZvbykKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3Rvcnk7IHRoZSBkaXJlY3RvcnkKLQkgKiAqc2hvdWxkKiBiZSBhIGRpcmVjdG9yeS4KLQkgKiBJZiB0aGUgZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlLCBpdCB3aWxsIGJlIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiAKLQkgKiBOQjogVGhpcyBtZXRob2QgaGFzIGJlZW4gdGVzdGVkIG9uIFdpbmRvd3MgYW5kIExpbnV4LAotCSAqIGJ1dCBub3QgTWFjIChidXQgdGhlIE1hYyBpcyBVbml4LWJhc2VkIHRoZXNlIGRheXMsIHNvCi0JICogaXQgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4uLikuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGNvbnZlcnRUb0Fic29sdXRlRmlsZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIEZpbGUgZGlyKSB7Ci0JCS8vIGNoZWNrIHdoZXRoZXIgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZQotCQlpZiAoZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCXJldHVybiBmaWxlOwkJLy8gcmV0dXJuIHVuY2hhbmdlZAotCQl9Ci0JCXJldHVybiBjYW5vbmljYWxGaWxlKG5ldyBGaWxlKGRpciwgZmlsZS5nZXRQYXRoKCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWxlIHRoYXQgaXMgYSByZS1zcGVjaWZpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLCBhYnNvbHV0ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KLQkgKiAgICAgTGludXgvVW5peC9NYWMgKENXRCA9IC9mb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiAvZm9vL2Jhci9iYXouamF2YQotCSAqICAgICBXaW5kb3dzIChDV0QgPSBDOlxmb28pOgotCSAqICAgICAgICAgY29udmVydFRvQWJzb2x1dGVGaWxlKGJhci9iYXouamF2YSkKLQkgKiAgICAgICAgICAgICA9PiBDOlxmb29cYmFyXGJhei5qYXZhCi0JICogVGhlIGZpbGUgY2FuIGJlIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuCi0JICogSWYgdGhlIGZpbGUgaXMgYWxyZWFkeSBhYnNvbHV0ZSwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIGhhcyBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzIGFuZCBMaW51eCwKLQkgKiBidXQgbm90IE1hYyAoYnV0IHRoZSBNYWMgaXMgVW5peC1iYXNlZCB0aGVzZSBkYXlzLCBzbwotCSAqIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0uLi4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmluYWwgRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgY3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBGaWxlVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmxhZ2dlZE9iamVjdFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvRmxhZ2dlZE9iamVjdFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQwNmM2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ZsYWdnZWRPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIFByb3ZpZGUgYSBjb250YWluZXIgZm9yIHBhc3NpbmcgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkgdGhlCi0gKiByZWNpcGllbnQuIElmIHRoZSB2YWx1ZSBpcyBzZXQgYXQgYW55IHRpbWUgYWZ0ZXIgY29uc3RydWN0aW9uIG9mIHRoZQotICogcmVmZXJlbmNlLCB0aGUgcmVmZXJlbmNlIGlzIG1hcmtlZCAic2V0Ii4gVGhpcyBhbGxvd3MgdGhlIGNsaWVudCB0bwotICogZGV0ZWN0IHdoZXRoZXIgdGhlIHNlcnZlci9yZWNpcGllbnQgZXZlciBzZXQgdGhlIHZhbHVlLCBldmVuIGlmIGl0IHJlbWFpbnMKLSAqIHVuY2hhbmdlZC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4gdGhlIHZhbHVlIGNhbiBiZSBzZXQgdG8KLSAqIDxjb2RlPm51bGw8L2NvZGU+LgotICogPHA+Ci0gKiBUaGUgcmVmZXJlbmNlIGNhbiBiZSBzZXQgbXVsdGlwbGUgdGltZXMsIGJ1dCBpdCBjYW4KLSAqIG5ldmVyIGJlICJ1bnNldCIgb25jZSBpdCBpcyAic2V0Ii4KLSAqLwotcHVibGljIGNsYXNzIEZsYWdnZWRPYmplY3RSZWZlcmVuY2U8Vj4KLQlleHRlbmRzIFNpbXBsZU9iamVjdFJlZmVyZW5jZTxWPgotewotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBzZXQgPSBmYWxzZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb2JqZWN0IHJlZmVyZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRmxhZ2dlZE9iamVjdFJlZmVyZW5jZShWIHZhbHVlKSB7Ci0JCXN1cGVyKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gb2JqZWN0IHJlZmVyZW5jZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmxhZ2dlZE9iamVjdFJlZmVyZW5jZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2V0ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzU2V0KCkgewotCQlyZXR1cm4gdGhpcy5zZXQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0JCXRoaXMuc2V0ID0gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9IHN1cGVyLnRvU3RyaW5nKCk7Ci0JCXJldHVybiAodGhpcy5zZXQpID8gJyonICsgcyA6IHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSGFzaEJhZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSGFzaEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzk0YmJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0hhc2hCYWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0BsaW5rIEJhZ30gaW50ZXJmYWNlLCBiYWNrZWQgYnkgYQotICogaGFzaCB0YWJsZS4gSXQgbWFrZXMgbm8gZ3VhcmFudGVlcyBhcyB0byB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mCi0gKiB0aGUgYmFnJ3MgZWxlbWVudHM7IGluIHBhcnRpY3VsYXIsIGl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGUgb3JkZXIKLSAqIHdpbGwgcmVtYWluIGNvbnN0YW50IG92ZXIgdGltZS4gVGhpcyBjbGFzcyBwZXJtaXRzIHRoZSA8Y29kZT5udWxsPC9jb2RlPgotICogZWxlbWVudC4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBvZmZlcnMgY29uc3RhbnQgdGltZSBwZXJmb3JtYW5jZSBmb3IgdGhlIGJhc2ljIG9wZXJhdGlvbnMKLSAqICg8Y29kZT5hZGQ8L2NvZGU+LCA8Y29kZT5yZW1vdmU8L2NvZGU+LCA8Y29kZT5jb250YWluczwvY29kZT4gYW5kCi0gKiA8Y29kZT5zaXplPC9jb2RlPiksIGFzc3VtaW5nIHRoZSBoYXNoIGZ1bmN0aW9uIGRpc3BlcnNlcyB0aGUgZWxlbWVudHMKLSAqIHByb3Blcmx5IGFtb25nIHRoZSBidWNrZXRzLiBJdGVyYXRpbmcgb3ZlciB0aGlzIGJhZyByZXF1aXJlcyB0aW1lCi0gKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHN1bSBvZiB0aGUgYmFnJ3Mgc2l6ZSAodGhlIG51bWJlciBvZiBlbGVtZW50cykgcGx1cyB0aGUKLSAqICJjYXBhY2l0eSIgb2YgdGhlIGJhY2tpbmcgaGFzaCB0YWJsZSAodGhlIG51bWJlciBvZiBidWNrZXRzKS4gVGh1cywgaXQgaXMKLSAqIGltcG9ydGFudCBub3QgdG8gc2V0IHRoZSBpbml0aWFsIGNhcGFjaXR5IHRvbyBoaWdoIChvciB0aGUgbG9hZCBmYWN0b3IgdG9vCi0gKiBsb3cpIGlmIGl0ZXJhdGlvbiBwZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L3N0cm9uZz4gSWYgbXVsdGlwbGUKLSAqIHRocmVhZHMgYWNjZXNzIGEgYmFnIGNvbmN1cnJlbnRseSwgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGhyZWFkcyBtb2RpZmllcwotICogdGhlIGJhZywgaXQgPGVtPm11c3Q8L2VtPiBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4gVGhpcyBpcyB0eXBpY2FsbHkKLSAqIGFjY29tcGxpc2hlZCBieSBzeW5jaHJvbml6aW5nIG9uIHNvbWUgb2JqZWN0IHRoYXQgbmF0dXJhbGx5IGVuY2Fwc3VsYXRlcwotICogdGhlIGJhZy4gSWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCB0aGUgYmFnIHNob3VsZCBiZSAid3JhcHBlZCIgdXNpbmcgdGhlCi0gKiA8Y29kZT5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uPC9jb2RlPiBtZXRob2QuIFRoaXMgaXMKLSAqIGJlc3QgZG9uZSBhdCBjcmVhdGlvbiB0aW1lLCB0byBwcmV2ZW50IGFjY2lkZW50YWwgdW5zeW5jaHJvbml6ZWQgYWNjZXNzCi0gKiB0byB0aGUgYmFnOgotICogPHByZT4KLSAqIENvbGxlY3Rpb24gYyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24obmV3IEhhc2hCYWcoLi4uKSk7Ci0gKiA8L3ByZT4KLSAqIDxwPgotICogVGhlIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIGNsYXNzJ3MgPGNvZGU+aXRlcmF0b3I8L2NvZGU+IG1ldGhvZCBhcmUKLSAqIDxlbT5mYWlsLWZhc3Q8L2VtPjogaWYgdGhlIGJhZyBpcyBtb2RpZmllZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgaXRlcmF0b3IgaXMKLSAqIGNyZWF0ZWQsIGluIGFueSB3YXkgZXhjZXB0IHRocm91Z2ggdGhlIGl0ZXJhdG9yJ3Mgb3duIDxjb2RlPnJlbW92ZTwvY29kZT4KLSAqIG1ldGhvZCwgdGhlIGl0ZXJhdG9yIHRocm93cyBhIHtAbGluayBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufS4KLSAqIFRodXMsIGluIHRoZSBmYWNlIG9mIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLCB0aGUgaXRlcmF0b3IgZmFpbHMgcXVpY2tseQotICogYW5kIGNsZWFubHksIHJhdGhlciB0aGFuIHJpc2tpbmcgYXJiaXRyYXJ5LCBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvciBhdAotICogYW4gdW5kZXRlcm1pbmVkIHRpbWUgaW4gdGhlIGZ1dHVyZS4KLSAqIDxwPgotICogTm90ZSB0aGF0IHRoZSBmYWlsLWZhc3QgYmVoYXZpb3Igb2YgYW4gaXRlcmF0b3IgY2Fubm90IGJlIGd1YXJhbnRlZWQKLSAqIGFzIGl0IGlzLCBnZW5lcmFsbHkgc3BlYWtpbmcsIGltcG9zc2libGUgdG8gbWFrZSBhbnkgaGFyZCBndWFyYW50ZWVzIGluIHRoZQotICogcHJlc2VuY2Ugb2YgdW5zeW5jaHJvbml6ZWQgY29uY3VycmVudCBtb2RpZmljYXRpb24uIEZhaWwtZmFzdCBpdGVyYXRvcnMKLSAqIHRocm93IDxjb2RlPkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb248L2NvZGU+IG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuCi0gKiBUaGVyZWZvcmUsIGl0IHdvdWxkIGJlIHdyb25nIHRvIHdyaXRlIGEgcHJvZ3JhbSB0aGF0IGRlcGVuZGVkIG9uIHRoaXMKLSAqIGV4Y2VwdGlvbiBmb3IgaXRzIGNvcnJlY3RuZXNzOiA8ZW0+dGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBpdGVyYXRvcnMKLSAqIHNob3VsZCBiZSB1c2VkIG9ubHkgdG8gZGV0ZWN0IGJ1Z3MuPC9lbT4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBtYWludGFpbmVkIGJ5IHRoZSBiYWcKLSAqIAotICogQHNlZSBDb2xsZWN0aW9uCi0gKiBAc2VlIEJhZwotICogQHNlZSBTeW5jaHJvbml6ZWRCYWcKLSAqIEBzZWUJQ29sbGVjdGlvbnMjc3luY2hyb25pemVkQ29sbGVjdGlvbihDb2xsZWN0aW9uKQotICogQHNlZSBJZGVudGl0eUhhc2hCYWcKLSAqLwotcHVibGljIGNsYXNzIEhhc2hCYWc8RT4KLQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxFPgotCWltcGxlbWVudHMgQmFnPEU+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgaGFzaCB0YWJsZS4gUmVzaXplZCBhcyBuZWNlc3NhcnkuIExlbmd0aCBNVVNUIEFsd2F5cyBiZSBhIHBvd2VyIG9mIHR3by4gKi8KLQl0cmFuc2llbnQgRW50cnk8RT5bXSB0YWJsZTsKLQotCS8qKiBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHNpemUgPSAwOwotCi0JLyoqIFRoZSBudW1iZXIgb2YgVU5JUVVFIGVudHJpZXMgaW4gdGhlIGJhZy4gKi8KLQl0cmFuc2llbnQgaW50IHVuaXF1ZUNvdW50ID0gMDsKLQotCS8qKgotCSAqIFRoZSBoYXNoIHRhYmxlIGlzIHJlaGFzaGVkIHdoZW4gaXRzIHNpemUgZXhjZWVkcyB0aGlzIHRocmVzaG9sZC4gKFRoZQotCSAqIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgPGNvZGU+KGludCkgKGNhcGFjaXR5ICogbG9hZEZhY3Rvcik8L2NvZGU+LikKLQkgKgotCSAqIEBzZXJpYWwKLQkgKi8KLQlwcml2YXRlIGludCB0aHJlc2hvbGQ7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBoYXNoIHRhYmxlLgotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgZmluYWwgZmxvYXQgbG9hZEZhY3RvcjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBiYWcgaGFzIGJlZW4gc3RydWN0dXJhbGx5IG1vZGlmaWVkLgotCSAqIFN0cnVjdHVyYWwgbW9kaWZpY2F0aW9ucyBhcmUgdGhvc2UgdGhhdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluCi0JICogdGhlIGJhZyBvciBvdGhlcndpc2UgbW9kaWZ5IGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUgKGUuZy4gcmVoYXNoKS4KLQkgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gbWFrZSBpdGVyYXRvcnMgb24gdGhpcyBiYWcgZmFpbC1mYXN0LgotCSAqCi0JICogQHNlZSBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbgotCSAqLwotCXRyYW5zaWVudCBpbnQgbW9kQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaW5pdGlhbCBjYXBhY2l0eSAtIE1VU1QgYmUgYSBwb3dlciBvZiB0d28uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSA9IDE2OwotCi0JLyoqCi0JICogVGhlIG1heGltdW0gY2FwYWNpdHksIHVzZWQgaWYgYSBoaWdoZXIgdmFsdWUgaXMgaW1wbGljaXRseSBzcGVjaWZpZWQKLQkgKiBieSBlaXRoZXIgb2YgdGhlIGNvbnN0cnVjdG9ycyB3aXRoIGFyZ3VtZW50cy4KLQkgKiBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvIDw9ICgxIDw8IDMwKS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IDEgPDwgMzA7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgdXNlZCB3aGVuIG5vbmUgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlCi0JICogZGVmYXVsdCBjYXBhY2l0eSwgd2hpY2ggaXMgMTYsIGFuZCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKi8KLQlwdWJsaWMgSGFzaEJhZygpIHsKLQkJdGhpcyhERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5Ci0JICogYW5kIHRoZSBkZWZhdWx0IGxvYWQgZmFjdG9yLCB3aGljaCBpcyAwLjc1LgotCSAqCi0JICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIGxlc3MKLQkgKiAgICAgdGhhbiB6ZXJvCi0JICovCi0JcHVibGljIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSkgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgREVGQVVMVF9MT0FEX0ZBQ1RPUiwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGJhZyB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBAcGFyYW0gbG9hZEZhY3RvciB0aGUgbG9hZCBmYWN0b3IKLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBsZXNzCi0JICogICAgIHRoYW4gemVybyBvciBpZiB0aGUgbG9hZCBmYWN0b3IgaXMgbm9uLXBvc2l0aXZlCi0JICovCi0JcHVibGljIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgdHJ1ZSk7ICAvLyB0cnVlID0gdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvciwgYm9vbGVhbiB2YWxpZGF0ZVBhcm1zKSB7Ci0JCXN1cGVyKCk7Ci0JCWludCBjYXBhY2l0eSA9IGluaXRpYWxDYXBhY2l0eTsKLQkJaWYgKHZhbGlkYXRlUGFybXMpIHsKLQkJCWlmIChjYXBhY2l0eSA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEluaXRpYWwgQ2FwYWNpdHk6ICIgKyBjYXBhY2l0eSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChjYXBhY2l0eSA+IE1BWElNVU1fQ0FQQUNJVFkpIHsKLQkJCQljYXBhY2l0eSA9IE1BWElNVU1fQ0FQQUNJVFk7Ci0JCQl9Ci0JCQlpZiAobG9hZEZhY3RvciA8PSAwIHx8IEZsb2F0LmlzTmFOKGxvYWRGYWN0b3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBMb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3IpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCi0JCQkvLyBmaW5kIGEgcG93ZXIgb2YgMiA+PSAnaW5pdGlhbENhcGFjaXR5JwotCQkJY2FwYWNpdHkgPSAxOwotCQkJd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCQkJY2FwYWNpdHkgPDw9IDE7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLmxvYWRGYWN0b3IgPSBsb2FkRmFjdG9yOwotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKGNhcGFjaXR5KTsKLQkJdGhpcy50aHJlc2hvbGQgPSAoaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgYmFnIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQKLQkgKiBjb2xsZWN0aW9uLiBUaGUgYmFnJ3MgbG9hZCBmYWN0b3Igd2lsbCBiZSB0aGUgZGVmYXVsdCwgd2hpY2ggaXMgMC43NSwKLQkgKiBhbmQgaXRzIGluaXRpYWwgY2FwYWNpdHkgd2lsbCBiZSBzdWZmaWNpZW50IHRvIGhvbGQgYWxsIHRoZSBlbGVtZW50cyBpbgotCSAqIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYyB0aGUgY29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyBhcmUgdG8gYmUgcGxhY2VkIGludG8gdGhpcyBiYWcuCi0JICovCi0JcHVibGljIEhhc2hCYWcoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQl0aGlzKE1hdGgubWF4KChpbnQpIChjLnNpemUoKSAvIERFRkFVTFRfTE9BRF9GQUNUT1IpICsgMSwgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZKSwgREVGQVVMVF9MT0FEX0ZBQ1RPUik7Ci0JCXRoaXMuYWRkQWxsXyhjKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBoYXNoIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIGludCBoYXNoKE9iamVjdCBvKSB7Ci0JCXJldHVybiAobyA9PSBudWxsKSA/IDAgOiB0aGlzLnR3ZWFrSGFzaChvLmhhc2hDb2RlKCkpOwotCX0KLQotCS8qKgotCSAqIFR3ZWFrIHRoZSBzcGVjaWZpZWQgaGFzaCwgdG8gZGVmZW5kIGFnYWluc3QgcG9vciBpbXBsZW1lbnRhdGlvbnMKLQkgKiBvZiB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlKCl9LgotCSAqLwotCXByaXZhdGUgaW50IHR3ZWFrSGFzaChpbnQgaCkgewotCQloIF49IChoID4+PiAyMCkgXiAoaCA+Pj4gMTIpOwotCQlyZXR1cm4gaCBeIChoID4+PiA3KSBeIChoID4+PiA0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGhhc2guCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXgoaW50IGhhc2gpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXgoaGFzaCwgdGhpcy50YWJsZS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaAotCSAqIHdpdGhpbiBhIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JaW50IGluZGV4KGludCBoYXNoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBoYXNoICYgKGxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkQWxsKENvbGxlY3Rpb24pfSBmb3IgY29uc3RydWN0aW9uIGFuZCBjbG9uaW5nLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsXyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYykgewotCQlmb3IgKEUgZSA6IGMpIHsKLQkJCXRoaXMuYWRkXyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkKE9iamVjdCl9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRfKEUgbykgewotCQl0aGlzLmFkZF8obywgMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0LCBpbnQpfSBmb3IgY29uc3RydWN0aW9uLCBjbG9uaW5nLCBhbmQgc2VyaWFsaXphdGlvbi4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvLCBpbnQgY250KSB7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlPYmplY3QgZW87Ci0JCQlpZiAoKGUuaGFzaCA9PSBoYXNoKSAmJiAoKChlbyA9IGUub2JqZWN0KSA9PSBvKSB8fCAoKG8gIT0gbnVsbCkgJiYgby5lcXVhbHMoZW8pKSkpIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2ltcGx5IHJldHVybnMgdGhlIG1haW50YWluZWQgc2l6ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNpemU7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY29tcGFyZXMgdGhlIG1haW50YWluZWQgc2l6ZSB0byB6ZXJvLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLnNpemUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggZm9yIHRoZSBvYmplY3QncyBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCXByaXZhdGUgRW50cnk8RT4gZ2V0RW50cnkoT2JqZWN0IG8pIHsKLQkJaW50IGhhc2ggPSB0aGlzLmhhc2gobyk7Ci0JCWZvciAoRW50cnk8RT4gZSA9IHRoaXMudGFibGVbdGhpcy5pbmRleChoYXNoKV07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJT2JqZWN0IGVvOwotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKCgoZW8gPSBlLm9iamVjdCkgPT0gbykgfHwgKChvICE9IG51bGwpICYmIG8uZXF1YWxzKGVvKSkpKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50cnkobykgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+IGUgPSB0aGlzLmdldEVudHJ5KG8pOwotCQlyZXR1cm4gKGUgPT0gbnVsbCkgPyAwIDogZS5jb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZWhhc2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWcgaW50byBhIG5ldyBoYXNoIHRhYmxlCi0JICogd2l0aCBhIGxhcmdlciBjYXBhY2l0eS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0JICogbnVtYmVyIG9mIGRpZmZlcmVudCBlbGVtZW50cyBpbiB0aGUgYmFnIGV4Y2VlZHMgaXRzCi0JICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JCUVudHJ5PEU+W10gb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQlpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGg7Ci0KLQkJaWYgKG9sZENhcGFjaXR5ID09IE1BWElNVU1fQ0FQQUNJVFkpIHsKLQkJCXRoaXMudGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbmV3Q2FwYWNpdHkgPSAyICogb2xkQ2FwYWNpdHk7Ci0JCUVudHJ5PEU+W10gbmV3VGFibGUgPSB0aGlzLmJ1aWxkVGFibGUobmV3Q2FwYWNpdHkpOwotCi0JCWZvciAoaW50IGkgPSBvbGRDYXBhY2l0eTsgaS0tID4gMDsgKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IG9sZCA9IG9sZFRhYmxlW2ldOyBvbGQgIT0gbnVsbDsgKSB7Ci0JCQkJRW50cnk8RT4gZSA9IG9sZDsKLQkJCQlvbGQgPSBvbGQubmV4dDsKLQotCQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXgoZS5oYXNoLCBuZXdDYXBhY2l0eSk7Ci0JCQkJZS5uZXh0ID0gbmV3VGFibGVbaW5kZXhdOwotCQkJCW5ld1RhYmxlW2luZGV4XSA9IGU7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnRhYmxlID0gbmV3VGFibGU7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKG5ld0NhcGFjaXR5ICogdGhpcy5sb2FkRmFjdG9yKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFbnRyeTxFPltdIGJ1aWxkVGFibGUoaW50IGNhcGFjaXR5KSB7Ci0JCXJldHVybiBuZXcgRW50cnlbY2FwYWNpdHldOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZChvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNudCkgewotCQlpZiAoY250IDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJT2JqZWN0IGVvOwotCQkJaWYgKChlLmhhc2ggPT0gaGFzaCkgJiYgKCgoZW8gPSBlLm9iamVjdCkgPT0gbykgfHwgKChvICE9IG51bGwpICYmIG8uZXF1YWxzKGVvKSkpKSB7Ci0JCQkJZS5jb3VudCArPSBjbnQ7Ci0JCQkJdGhpcy5zaXplICs9IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlaGFzaCB0aGUgdGFibGUgaWYgd2UgYXJlIGdvaW5nIHRvIGV4Y2VlZCB0aGUgdGhyZXNob2xkCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID49IHRoaXMudGhyZXNob2xkKSB7Ci0JCQl0aGlzLnJlaGFzaCgpOwotCQkJaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOyAgLy8gbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlIGluZGV4Ci0JCX0KLQotCQkvLyBjcmVhdGUgdGhlIG5ldyBlbnRyeSBhbmQgcHV0IGl0IGluIHRoZSB0YWJsZQotCQlFbnRyeTxFPiBlID0gdGhpcy5idWlsZEVudHJ5KGhhc2gsIG8sIGNudCwgdGhpcy50YWJsZVtpbmRleF0pOwotCQl0aGlzLnRhYmxlW2luZGV4XSA9IGU7Ci0JCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCXRoaXMudW5pcXVlQ291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSApCi0JcHJpdmF0ZSBFbnRyeTxFPiBidWlsZEVudHJ5KGludCBoYXNoLCBPYmplY3QgbywgaW50IGNudCwgRW50cnkgbmV4dCkgewotCQlyZXR1cm4gbmV3IEVudHJ5PEU+KGhhc2gsIChFKSBvLCBjbnQsIChFbnRyeTxFPikgbmV4dCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmUobywgMSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzZWFyY2hlcyBmb3IgdGhlIG9iamVjdCBpbiB0aGUgaGFzaCB0YWJsZSBieSBjYWxjdWxhdGluZwotCSAqIHRoZSBvYmplY3QncyBoYXNoIGNvZGUgYW5kIGV4YW1pbmluZyB0aGUgZW50cmllcyBpbiB0aGUgY29ycmVzcG9uZGluZyBoYXNoCi0JICogdGFibGUgYnVja2V0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNudCkgewotCQlpZiAoY250IDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgaGFzaCA9IHRoaXMuaGFzaChvKTsKLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChoYXNoKTsKLQotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCU9iamVjdCBlbzsKLQkJCWlmICgoZS5oYXNoID09IGhhc2gpICYmICgoKGVvID0gZS5vYmplY3QpID09IG8pIHx8ICgobyAhPSBudWxsKSAmJiBvLmVxdWFscyhlbykpKSkgewotCQkJCXRoaXMubW9kQ291bnQrKzsKLQkJCQljbnQgPSAoY250IDwgZS5jb3VudCkgPyBjbnQgOiBlLmNvdW50OwotCQkJCWUuY291bnQgLT0gY250OwotCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBlbGVtZW50KHMpLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJaWYgKGUuY291bnQgPT0gMCkgewotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQl0aGlzLnRhYmxlW2luZGV4XSA9IGUubmV4dDsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXByZXYubmV4dCA9IGUubmV4dDsKLQkJCQkJfQotCQkJCQl0aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJfQotCQkJCXRoaXMuc2l6ZSAtPSBjbnQ7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xlYXJzIG91dCBhbGwgb2YgdGhlIGhhc2ggdGFibGUgYnVja2V0cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWZvciAoaW50IGkgPSB0YWIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXRhYltpXSA9IG51bGw7Ci0JCX0KLQkJdGhpcy5zaXplID0gMDsKLQkJdGhpcy51bmlxdWVDb3VudCA9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZzogdGhlIGVsZW1lbnRzCi0JICogdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLQkgKgotCSAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEhhc2hCYWc8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUhhc2hCYWc8RT4gY2xvbmUgPSAoSGFzaEJhZzxFPikgc3VwZXIuY2xvbmUoKTsKLQkJCWNsb25lLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWNsb25lLnNpemUgPSAwOwotCQkJY2xvbmUudW5pcXVlQ291bnQgPSAwOwotCQkJY2xvbmUubW9kQ291bnQgPSAwOwotCQkJY2xvbmUuYWRkQWxsXyh0aGlzKTsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogSGFzaCB0YWJsZSBjb2xsaXNpb24gbGlzdCBlbnRyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeTxFPiBpbXBsZW1lbnRzIEJhZy5FbnRyeTxFPiB7Ci0JCWZpbmFsIGludCBoYXNoOwotCQlmaW5hbCBFIG9iamVjdDsKLQkJaW50IGNvdW50OwotCQlFbnRyeTxFPiBuZXh0OwotCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgaW50IGNvdW50LCBFbnRyeTxFPiBuZXh0KSB7Ci0JCQl0aGlzLmhhc2ggPSBoYXNoOwotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQl0aGlzLm5leHQgPSBuZXh0OwotCQl9Ci0KLQkJLy8gKioqKiogQmFnLkVudHJ5IGltcGxlbWVudGF0aW9uCi0JCXB1YmxpYyBFIGdldEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNldENvdW50KGludCBjb3VudCkgewotCQkJaWYgKGNvdW50IDw9IDApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvOiAiICsgY291bnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgb2xkID0gdGhpcy5jb3VudDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXJldHVybiBvbGQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBCYWcuRW50cnk8Pz4pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCUJhZy5FbnRyeSBlID0gKEJhZy5FbnRyeSkgbzsKLQkJCXJldHVybiAodGhpcy5jb3VudCA9PSBlLmdldENvdW50KCkpICYmCi0JCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMub2JqZWN0LCBlLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCUUgbyA9IHRoaXMub2JqZWN0OwotCQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6ICh0aGlzLmNvdW50ICogby5oYXNoQ29kZSgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0ICsgIj0+IiArIHRoaXMuY291bnQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IEhhc2hJdGVyYXRvcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBVbmlxdWVJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvdW50OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgRW50cnlJdGVyYXRvcigpOwotCX0KLQotCi0JLyoqCi0JICogRW1wdHkgaXRlcmF0b3IgdGhhdCBkb2VzIGp1c3QgYWJvdXQgbm90aGluZy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotCQlFbXB0eUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEhhc2hJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSBIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgaW50IG5leHRFbnRyeUNvdW50ID0gMDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IEhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlIYXNoSXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCUVudHJ5PEU+IGUgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGV0ID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQlldCA9IHRhYlstLWldOwkJLy8gbW92ZSBiYWNrd2FyZHMgdGhyb3VnaCB0aGUgdGFibGUKLQkJCX0KLQkJCXRoaXMubmV4dEVudHJ5ID0gZXQ7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCWlmIChldCA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUVudHJ5PEU+IGUgPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gdGhpcy5uZXh0RW50cnk7Ci0JCQl0aGlzLm5leHRFbnRyeUNvdW50Kys7Ci0JCQlpZiAodGhpcy5uZXh0RW50cnlDb3VudCA9PSBlLmNvdW50KSB7Ci0JCQkJdGhpcy5uZXh0RW50cnkgPSBlLm5leHQ7Ci0JCQkJdGhpcy5uZXh0RW50cnlDb3VudCA9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gZS5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBIYXNoQmFnLnRoaXMuaW5kZXgodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoLCBIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoRW50cnk8RT4gZSA9IEhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJZS5jb3VudC0tOwotCQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCQkvLyBpZiB3ZSBhcmUgcmVtb3ZpbmcgdGhlIGxhc3Qgb25lLCByZW1vdmUgdGhlIGVudHJ5IGZyb20gdGhlIHRhYmxlCi0JCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQkJSGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdID0gZS5uZXh0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCQl9Ci0JCQkJCQlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNsaWRlIGJhY2sgdGhlIGNvdW50IHRvIGFjY291bnQgZm9yIHRoZSBqdXN0LXJlbW92ZWQgZWxlbWVudAotCQkJCQkJdGhpcy5uZXh0RW50cnlDb3VudC0tOwotCQkJCQl9Ci0JCQkJCUhhc2hCYWcudGhpcy5zaXplLS07Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEVudHJ5SXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxFbnRyeTxFPj4gewotCQlwcml2YXRlIGludCBpbmRleCA9IEhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBFbnRyeTxFPiBsYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCi0JCSAqIGJhZyBzaG91bGQgaGF2ZS4gSWYgdGhpcyBleHBlY3RhdGlvbiBpcyB2aW9sYXRlZCwgdGhlIGl0ZXJhdG9yCi0JCSAqIGhhcyBkZXRlY3RlZCBhIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgZXhwZWN0ZWRNb2RDb3VudCA9IEhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlFbnRyeUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IEhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChlID09IG51bGwpICYmIChpID4gMCkpIHsKLQkJCQllID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBlOwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlyZXR1cm4gZSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIEVudHJ5PEU+IG5leHQoKSB7Ci0JCQlpZiAoSGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKEhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBIYXNoQmFnLnRoaXMuaW5kZXgodGhpcy5sYXN0UmV0dXJuZWRFbnRyeS5oYXNoLCBIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoRW50cnk8RT4gZSA9IEhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUhhc2hCYWcudGhpcy5tb2RDb3VudCsrOwotCQkJCQl0aGlzLmV4cGVjdGVkTW9kQ291bnQrKzsKLQkJCQkJLy8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZQotCQkJCQlpZiAocHJldiA9PSBudWxsKSB7Ci0JCQkJCQlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJSGFzaEJhZy50aGlzLnVuaXF1ZUNvdW50LS07Ci0JCQkJCUhhc2hCYWcudGhpcy5zaXplIC09IHRoaXMubGFzdFJldHVybmVkRW50cnkuY291bnQ7Ci0JCQkJCXRoaXMubGFzdFJldHVybmVkRW50cnkgPSBudWxsOwkvLyBpdCBjYW5ub3QgYmUgcmVtb3ZlZCBhZ2FpbgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFVuaXF1ZUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RT4gewotCQlwcml2YXRlIEVudHJ5SXRlcmF0b3IgZW50cnlJdGVyYXRvciA9IG5ldyBFbnRyeUl0ZXJhdG9yKCk7Ci0JCQotCQlVbmlxdWVJdGVyYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuZW50cnlJdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuZW50cnlJdGVyYXRvci5uZXh0KCkub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5lbnRyeUl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0KLQl9Ci0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBCYWc8Pz4pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUJhZzxFPiBiID0gKEJhZzxFPikgbzsKLQkJaWYgKGIuc2l6ZSgpICE9IHRoaXMuc2l6ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGIudW5pcXVlQ291bnQoKSAhPSB0aGlzLnVuaXF1ZUNvdW50KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gc3RyZWFtID0gYi5lbnRyaWVzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJQmFnLkVudHJ5PEU+IGVudHJ5ID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChlbnRyeS5nZXRDb3VudCgpICE9IHRoaXMuY291bnQoZW50cnkuZ2V0RWxlbWVudCgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaCA9IDA7Ci0JCWZvciAoRSBvIDogdGhpcykgewotCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCWggKz0gby5oYXNoQ29kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBoOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGhlIHN0YXRlIG9mIHRoaXMgYmFnIHRvIGEgc3RyZWFtIChpLmUuIHNlcmlhbGl6ZSBpdCkuCi0JICoKLQkgKiBAc2VyaWFsRGF0YSBFbWl0IHRoZSBjYXBhY2l0eSBvZiB0aGUgYmFnIChpbnQpLAotCSAqICAgICBmb2xsb3dlZCBieSB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cyBpbiB0aGUgYmFnIChpbnQpLAotCSAqICAgICBmb2xsb3dlZCBieSBhbGwgb2YgdGhlIGJhZydzIGVsZW1lbnRzIChlYWNoIGFuIE9iamVjdCkgYW5kCi0JICogICAgIHRoZWlyIGNvdW50cyAoZWFjaCBhbiBpbnQpLCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQotCQkJCXRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gd3JpdGUgb3V0IHRoZSB0aHJlc2hvbGQsIGxvYWQgZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCS8vIHdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cwotCQlzLndyaXRlSW50KHRoaXMudGFibGUubGVuZ3RoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlzLndyaXRlSW50KHRoaXMudW5pcXVlQ291bnQpOwotCi0JCS8vIHdyaXRlIG91dCBlbGVtZW50cyBhbmQgY291bnRzIChhbHRlcm5hdGluZykKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPiAwKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IGVudHJ5IDogdGhpcy50YWJsZSkgewotCQkJCXdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJCXMud3JpdGVPYmplY3QoZW50cnkub2JqZWN0KTsKLQkJCQkJcy53cml0ZUludChlbnRyeS5jb3VudCk7Ci0JCQkJCWVudHJ5ID0gZW50cnkubmV4dDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlY29uc3RpdHV0ZSB0aGUgYmFnIGZyb20gYSBzdHJlYW0gKGkuZS4gZGVzZXJpYWxpemUgaXQpLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIHJlYWQgaW4gdGhlIHRocmVzaG9sZCwgbG9hZGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0UmVhZE9iamVjdCgpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIGJ1Y2tldHMgYW5kIGFsbG9jYXRlIHRoZSBidWNrZXQgYXJyYXkKLQkJdGhpcy50YWJsZSA9IHRoaXMuYnVpbGRUYWJsZShzLnJlYWRJbnQoKSk7Ci0KLQkJLy8gcmVhZCBpbiBudW1iZXIgb2YgdW5pcXVlIGVsZW1lbnRzCi0JCWludCB1bmlxdWUgPSBzLnJlYWRJbnQoKTsKLQotCQkvLyByZWFkIHRoZSBlbGVtZW50cyBhbmQgY291bnRzLCBhbmQgcHV0IHRoZSBlbGVtZW50cyBpbiB0aGUgYmFnCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5pcXVlOyBpKyspIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJRSBlbGVtZW50ID0gKEUpIHMucmVhZE9iamVjdCgpOwotCQkJaW50IGVsZW1lbnRDb3VudCA9IHMucmVhZEludCgpOwotCQkJdGhpcy5hZGRfKGVsZW1lbnQsIGVsZW1lbnRDb3VudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0lkZW50aXR5SGFzaEJhZy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmZiYzQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZSB3aXRoIGEKLSAqIGhhc2ggdGFibGUsIHVzaW5nIG9iamVjdC1pZGVudGl0eSBpbiBwbGFjZSBvZiBvYmplY3QtZXF1YWxpdHkgd2hlbgotICogY29tcGFyaW5nIGVsZW1lbnRzLiBJbiBvdGhlciB3b3JkcywgaW4gYW4gPGNvZGU+SWRlbnRpdHlIYXNoQmFnPC9jb2RlPiwKLSAqIHR3byBvYmplY3RzIDxjb2RlPm8xPC9jb2RlPiBhbmQgPGNvZGU+bzI8L2NvZGU+IGFyZSBjb25zaWRlcmVkCi0gKiBlcXVhbCBpZiBhbmQgb25seSBpZiA8Y29kZT4obzEgPT0gbzIpPC9jb2RlPi4gKEluIG5vcm1hbCB7QGxpbmsgQmFnfQotICogaW1wbGVtZW50YXRpb25zIChsaWtlIHtAbGluayBIYXNoQmFnfSkgdHdvIG9iamVjdHMgPGNvZGU+bzE8L2NvZGU+Ci0gKiBhbmQgPGNvZGU+bzI8L2NvZGU+IGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIGFuZCBvbmx5IGlmCi0gKiA8Y29kZT4obzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpKTwvY29kZT4uKQotICogPHA+Ci0gKiA8c3Ryb25nPgotICogVGhpcyBjbGFzcyBpcyA8ZW0+bm90PC9lbT4gYSBnZW5lcmFsLXB1cnBvc2Uge0BsaW5rIEJhZ30KLSAqIGltcGxlbWVudGF0aW9uISBXaGlsZSB0aGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayBCYWd9IGludGVyZmFjZSwgaXQKLSAqIGludGVudGlvbmFsbHkgdmlvbGF0ZXMge0BsaW5rIEJhZ30ncyBnZW5lcmFsIGNvbnRyYWN0LCB3aGljaCBtYW5kYXRlcyB0aGUKLSAqIHVzZSBvZiB0aGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBtZXRob2Qgd2hlbiBjb21wYXJpbmcgb2JqZWN0cy4gVGhpcyBjbGFzcyBpcwotICogZGVzaWduZWQgZm9yIHVzZSBvbmx5IGluIHRoZSByYXJlIGNhc2VzIHdoZXJlaW4gb2JqZWN0LWlkZW50aXR5Ci0gKiBzZW1hbnRpY3MgYXJlIHJlcXVpcmVkLgotICogPC9zdHJvbmc+Ci0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgbWFrZXMgbm8gZ3VhcmFudGVlcyBhcyB0byB0aGUgaXRlcmF0aW9uIG9yZGVyIG9mCi0gKiB0aGUgYmFnJ3MgZWxlbWVudHM7IGluIHBhcnRpY3VsYXIsIGl0IGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBvcmRlcgotICogd2lsbCByZW1haW4gY29uc3RhbnQgb3ZlciB0aW1lLiBUaGlzIGNsYXNzIHBlcm1pdHMgdGhlIDxjb2RlPm51bGw8L2NvZGU+Ci0gKiBlbGVtZW50LgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIG9mZmVycyBjb25zdGFudCB0aW1lIHBlcmZvcm1hbmNlIGZvciB0aGUgYmFzaWMgb3BlcmF0aW9ucwotICogKDxjb2RlPmFkZDwvY29kZT4sIDxjb2RlPnJlbW92ZTwvY29kZT4sIDxjb2RlPmNvbnRhaW5zPC9jb2RlPiBhbmQKLSAqIDxjb2RlPnNpemU8L2NvZGU+KSwgYXNzdW1pbmcgdGhlIHN5c3RlbSBpZGVudGl0eSBoYXNoIGZ1bmN0aW9uCi0gKiAoe0BsaW5rIFN5c3RlbSNpZGVudGl0eUhhc2hDb2RlKE9iamVjdCl9KSBkaXNwZXJzZXMgZWxlbWVudHMgcHJvcGVybHkKLSAqIGFtb25nIHRoZSBidWNrZXRzLiBJdGVyYXRpbmcgb3ZlciB0aGlzIGJhZyByZXF1aXJlcyB0aW1lCi0gKiBwcm9wb3J0aW9uYWwgdG8gdGhlIHN1bSBvZiB0aGUgYmFnJ3Mgc2l6ZSAodGhlIG51bWJlciBvZiBlbGVtZW50cykgcGx1cyB0aGUKLSAqICJjYXBhY2l0eSIgb2YgdGhlIGJhY2tpbmcgaGFzaCB0YWJsZSAodGhlIG51bWJlciBvZiBidWNrZXRzKS4gVGh1cywgaXQgaXMKLSAqIGltcG9ydGFudCBub3QgdG8gc2V0IHRoZSBpbml0aWFsIGNhcGFjaXR5IHRvbyBoaWdoIChvciB0aGUgbG9hZCBmYWN0b3IgdG9vCi0gKiBsb3cpIGlmIGl0ZXJhdGlvbiBwZXJmb3JtYW5jZSBpcyBpbXBvcnRhbnQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L3N0cm9uZz4gSWYgbXVsdGlwbGUKLSAqIHRocmVhZHMgYWNjZXNzIGEgYmFnIGNvbmN1cnJlbnRseSwgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgdGhyZWFkcyBtb2RpZmllcwotICogdGhlIGJhZywgaXQgPGVtPm11c3Q8L2VtPiBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4gVGhpcyBpcyB0eXBpY2FsbHkKLSAqIGFjY29tcGxpc2hlZCBieSBzeW5jaHJvbml6aW5nIG9uIHNvbWUgb2JqZWN0IHRoYXQgbmF0dXJhbGx5IGVuY2Fwc3VsYXRlcwotICogdGhlIGJhZy4gSWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCB0aGUgYmFnIHNob3VsZCBiZSAid3JhcHBlZCIgdXNpbmcgdGhlCi0gKiA8Y29kZT5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uPC9jb2RlPiBtZXRob2QuIFRoaXMgaXMKLSAqIGJlc3QgZG9uZSBhdCBjcmVhdGlvbiB0aW1lLCB0byBwcmV2ZW50IGFjY2lkZW50YWwgdW5zeW5jaHJvbml6ZWQgYWNjZXNzCi0gKiB0byB0aGUgYmFnOgotICogPHByZT4KLSAqIENvbGxlY3Rpb24gYyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZENvbGxlY3Rpb24obmV3IElkZW50aXR5SGFzaEJhZyguLi4pKTsKLSAqIDwvcHJlPgotICogPHA+Ci0gKiBUaGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgY2xhc3MncyA8Y29kZT5pdGVyYXRvcjwvY29kZT4gbWV0aG9kIGFyZQotICogPGVtPmZhaWwtZmFzdDwvZW0+OiBpZiB0aGUgYmFnIGlzIG1vZGlmaWVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBpdGVyYXRvciBpcwotICogY3JlYXRlZCwgaW4gYW55IHdheSBleGNlcHQgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBvd24gPGNvZGU+cmVtb3ZlPC9jb2RlPgotICogbWV0aG9kLCB0aGUgaXRlcmF0b3IgdGhyb3dzIGEge0BsaW5rIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LgotICogVGh1cywgaW4gdGhlIGZhY2Ugb2YgY29uY3VycmVudCBtb2RpZmljYXRpb24sIHRoZSBpdGVyYXRvciBmYWlscyBxdWlja2x5Ci0gKiBhbmQgY2xlYW5seSwgcmF0aGVyIHRoYW4gcmlza2luZyBhcmJpdHJhcnksIG5vbi1kZXRlcm1pbmlzdGljIGJlaGF2aW9yIGF0Ci0gKiBhbiB1bmRldGVybWluZWQgdGltZSBpbiB0aGUgZnV0dXJlLgotICogPHA+Ci0gKiBOb3RlIHRoYXQgdGhlIGZhaWwtZmFzdCBiZWhhdmlvciBvZiBhbiBpdGVyYXRvciBjYW5ub3QgYmUgZ3VhcmFudGVlZAotICogYXMgaXQgaXMsIGdlbmVyYWxseSBzcGVha2luZywgaW1wb3NzaWJsZSB0byBtYWtlIGFueSBoYXJkIGd1YXJhbnRlZXMgaW4gdGhlCi0gKiBwcmVzZW5jZSBvZiB1bnN5bmNocm9uaXplZCBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4gRmFpbC1mYXN0IGl0ZXJhdG9ycwotICogdGhyb3cgPGNvZGU+Q29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjwvY29kZT4gb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4KLSAqIFRoZXJlZm9yZSwgaXQgd291bGQgYmUgd3JvbmcgdG8gd3JpdGUgYSBwcm9ncmFtIHRoYXQgZGVwZW5kZWQgb24gdGhpcwotICogZXhjZXB0aW9uIGZvciBpdHMgY29ycmVjdG5lc3M6IDxlbT50aGUgZmFpbC1mYXN0IGJlaGF2aW9yIG9mIGl0ZXJhdG9ycwotICogc2hvdWxkIGJlIHVzZWQgb25seSB0byBkZXRlY3QgYnVncy48L2VtPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIG1haW50YWluZWQgYnkgdGhlIGJhZwotICogCi0gKiBAc2VlIENvbGxlY3Rpb24KLSAqIEBzZWUgQmFnCi0gKiBAc2VlIFN5bmNocm9uaXplZEJhZwotICogQHNlZQlDb2xsZWN0aW9ucyNzeW5jaHJvbml6ZWRDb2xsZWN0aW9uKENvbGxlY3Rpb24pCi0gKiBAc2VlIEhhc2hCYWcKLSAqLwotcHVibGljIGNsYXNzIElkZW50aXR5SGFzaEJhZzxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPEU+Ci0JaW1wbGVtZW50cyBCYWc8RT4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIFRoZSBoYXNoIHRhYmxlLiBSZXNpemVkIGFzIG5lY2Vzc2FyeS4gTGVuZ3RoIE1VU1QgQWx3YXlzIGJlIGEgcG93ZXIgb2YgdHdvLiAqLwotCXRyYW5zaWVudCBFbnRyeTxFPltdIHRhYmxlOwotCi0JLyoqIFRoZSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgc2l6ZSA9IDA7Ci0KLQkvKiogVGhlIG51bWJlciBvZiBVTklRVUUgZW50cmllcyBpbiB0aGUgYmFnLiAqLwotCXRyYW5zaWVudCBpbnQgdW5pcXVlQ291bnQgPSAwOwotCi0JLyoqCi0JICogVGhlIGhhc2ggdGFibGUgaXMgcmVoYXNoZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlCi0JICogdmFsdWUgb2YgdGhpcyBmaWVsZCBpcyA8Y29kZT4oaW50KSAoY2FwYWNpdHkgKiBsb2FkRmFjdG9yKTwvY29kZT4uKQotCSAqCi0JICogQHNlcmlhbAotCSAqLwotCXByaXZhdGUgaW50IHRocmVzaG9sZDsKLQotCS8qKgotCSAqIFRoZSBsb2FkIGZhY3RvciBmb3IgdGhlIGhhc2ggdGFibGUuCi0JICoKLQkgKiBAc2VyaWFsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhZyBoYXMgYmVlbiBzdHJ1Y3R1cmFsbHkgbW9kaWZpZWQuCi0JICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4KLQkgKiB0aGUgYmFnIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiByZWhhc2gpLgotCSAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBtYWtlIGl0ZXJhdG9ycyBvbiB0aGlzIGJhZyBmYWlsLWZhc3QuCi0JICoKLQkgKiBAc2VlIGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JICovCi0JdHJhbnNpZW50IGludCBtb2RDb3VudCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5IC0gTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZID0gMTY7Ci0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGhpZ2hlciB2YWx1ZSBpcyBpbXBsaWNpdGx5IHNwZWNpZmllZAotCSAqIGJ5IGVpdGhlciBvZiB0aGUgY29uc3RydWN0b3JzIHdpdGggYXJndW1lbnRzLgotCSAqIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gPD0gKDEgPDwgMzApLgotCQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IDEgPDwgMzA7Ci0KLQkvKioKLQkgKiBUaGUgbG9hZCBmYWN0b3IgdXNlZCB3aGVuIG5vbmUgc3BlY2lmaWVkIGluIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgYmFnIHdpdGggdGhlCi0JICogZGVmYXVsdCBjYXBhY2l0eSwgd2hpY2ggaXMgMTYsIGFuZCBsb2FkIGZhY3Rvciwgd2hpY2ggaXMgMC43NS4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKCkgewotCQl0aGlzKERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkKLQkgKiBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IsIHdoaWNoIGlzIDAuNzUuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJdGhpcyhpbml0aWFsQ2FwYWNpdHksIERFRkFVTFRfTE9BRF9GQUNUT1IsIGZhbHNlKTsgIC8vIGZhbHNlID0gZG8gbm90IHZhbGlkYXRlIHBhcm1zCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBiYWcgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSBhbmQgbG9hZCBmYWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5Ci0JICogQHBhcmFtIGxvYWRGYWN0b3IgdGhlIGxvYWQgZmFjdG9yCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbGVzcwotCSAqICAgICB0aGFuIHplcm8gb3IgaWYgdGhlIGxvYWQgZmFjdG9yIGlzIG5vbi1wb3NpdGl2ZQotCSAqLwotCXB1YmxpYyBJZGVudGl0eUhhc2hCYWcoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgewotCQl0aGlzKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgdHJ1ZSk7ICAvLyB0cnVlID0gdmFsaWRhdGUgcGFybXMKLQl9Ci0KLQlwcml2YXRlIElkZW50aXR5SGFzaEJhZyhpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yLCBib29sZWFuIHZhbGlkYXRlUGFybXMpIHsKLQkJc3VwZXIoKTsKLQkJaW50IGNhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OwotCQlpZiAodmFsaWRhdGVQYXJtcykgewotCQkJaWYgKGNhcGFjaXR5IDwgMCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSW5pdGlhbCBDYXBhY2l0eTogIiArIGNhcGFjaXR5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGNhcGFjaXR5ID4gTUFYSU1VTV9DQVBBQ0lUWSkgewotCQkJCWNhcGFjaXR5ID0gTUFYSU1VTV9DQVBBQ0lUWTsKLQkJCX0KLQkJCWlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIExvYWQgZmFjdG9yOiAiICsgbG9hZEZhY3Rvcik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkKLQkJCS8vIGZpbmQgYSBwb3dlciBvZiAyID49ICdpbml0aWFsQ2FwYWNpdHknCi0JCQljYXBhY2l0eSA9IDE7Ci0JCQl3aGlsZSAoY2FwYWNpdHkgPCBpbml0aWFsQ2FwYWNpdHkpIHsKLQkJCQljYXBhY2l0eSA8PD0gMTsKLQkJCX0KLQkJfQotCi0JCXRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoY2FwYWNpdHkpOwotCQl0aGlzLnRocmVzaG9sZCA9IChpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBiYWcgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBiYWcncyBsb2FkIGZhY3RvciB3aWxsIGJlIHRoZSBkZWZhdWx0LCB3aGljaCBpcyAwLjc1LAotCSAqIGFuZCBpdHMgaW5pdGlhbCBjYXBhY2l0eSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gaG9sZCBhbGwgdGhlIGVsZW1lbnRzIGluCi0JICogdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBwbGFjZWQgaW50byB0aGlzIGJhZy4KLQkgKi8KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJdGhpcyhNYXRoLm1heCgoaW50KSAoYy5zaXplKCkgLyBERUZBVUxUX0xPQURfRkFDVE9SKSArIDEsIERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSksIERFRkFVTFRfTE9BRF9GQUNUT1IpOwotCQl0aGlzLmFkZEFsbF8oYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqLwotCXByaXZhdGUgaW50IGluZGV4KE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4KHRoaXMuaGFzaChvKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgaGFzaCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFzaChPYmplY3QgbykgewotCQlyZXR1cm4gKG8gPT0gbnVsbCkgPyAwIDogdGhpcy50d2Vha0hhc2goU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpOwotCX0KLQotCS8qKgotCSAqIFR3ZWFrIHRoZSBzcGVjaWZpZWQgaGFzaC4KLQkgKi8KLQlwcml2YXRlIGludCB0d2Vha0hhc2goaW50IGgpIHsKLQkJcmV0dXJuIGg7Ci0vLwkJaCBePSAoaCA+Pj4gMjApIF4gKGggPj4+IDEyKTsKLS8vCQlyZXR1cm4gaCBeIChoID4+PiA3KSBeIChoID4+PiA0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGZvciB0aGUgc3BlY2lmaWVkIGhhc2guCi0JICovCi0JcHJpdmF0ZSBpbnQgaW5kZXgoaW50IGhhc2gpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXgoaGFzaCwgdGhpcy50YWJsZS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgaGFzaAotCSAqIHdpdGhpbiBhIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JaW50IGluZGV4KGludCBoYXNoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBoYXNoICYgKGxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkQWxsKENvbGxlY3Rpb24pfSBmb3IgY29uc3RydWN0aW9uIGFuZCBjbG9uaW5nLgotCSAqIChObyBjaGVjayBmb3IgcmUtaGFzaDsgbm8gY2hhbmdlIHRvIG1vZCBjb3VudDsgbm8gcmV0dXJuIHZhbHVlLikKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWxsXyhJdGVyYWJsZTw/IGV4dGVuZHMgRT4gYykgewotCQlmb3IgKEUgZSA6IGMpIHsKLQkJCXRoaXMuYWRkXyhlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEludGVybmFsIHtAbGluayAjYWRkKE9iamVjdCl9IGZvciBjb25zdHJ1Y3Rpb24gYW5kIGNsb25pbmcuCi0JICogKE5vIGNoZWNrIGZvciByZS1oYXNoOyBubyBjaGFuZ2UgdG8gbW9kIGNvdW50OyBubyByZXR1cm4gdmFsdWUuKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRfKEUgbykgewotCQl0aGlzLmFkZF8obywgMSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwge0BsaW5rICNhZGQoT2JqZWN0LCBpbnQpfSBmb3IgY29uc3RydWN0aW9uLCBjbG9uaW5nLCBhbmQgc2VyaWFsaXphdGlvbi4KLQkgKiAoTm8gY2hlY2sgZm9yIHJlLWhhc2g7IG5vIGNoYW5nZSB0byBtb2QgY291bnQ7IG5vIHJldHVybiB2YWx1ZS4pCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZF8oRSBvLCBpbnQgY250KSB7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XTsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7Ci0JCQlpZiAoZS5vYmplY3QgPT0gbykgewotCQkJCWUuY291bnQgKz0gY250OwotCQkJCXRoaXMuc2l6ZSArPSBjbnQ7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gY3JlYXRlIHRoZSBuZXcgZW50cnkgYW5kIHB1dCBpdCBpbiB0aGUgdGFibGUKLQkJRW50cnk8RT4gZSA9IHRoaXMuYnVpbGRFbnRyeShoYXNoLCBvLCBjbnQsIHRoaXMudGFibGVbaW5kZXhdKTsKLQkJdGhpcy50YWJsZVtpbmRleF0gPSBlOwotCQl0aGlzLnNpemUgKz0gY250OwotCQl0aGlzLnVuaXF1ZUNvdW50Kys7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgbWFpbnRhaW5lZCBzaXplLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNpbXBseSBjb21wYXJlcyB0aGUgbWFpbnRhaW5lZCBzaXplIHRvIHplcm8uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZSA9PSAwOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaCBmb3IgdGhlIG9iamVjdCdzIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHJpdmF0ZSBFbnRyeTxFPiBnZXRFbnRyeShPYmplY3QgbykgewotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW3RoaXMuaW5kZXgobyldOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJcmV0dXJuIGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50cnkobykgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvdW50KE9iamVjdCBvKSB7Ci0JCUVudHJ5PEU+IGUgPSB0aGlzLmdldEVudHJ5KG8pOwotCQlyZXR1cm4gKGUgPT0gbnVsbCkgPyAwIDogZS5jb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBSZWhhc2ggdGhlIGNvbnRlbnRzIG9mIHRoZSBiYWcgaW50byBhIG5ldyBoYXNoIHRhYmxlCi0JICogd2l0aCBhIGxhcmdlciBjYXBhY2l0eS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlCi0JICogbnVtYmVyIG9mIGRpZmZlcmVudCBlbGVtZW50cyBpbiB0aGUgYmFnIGV4Y2VlZHMgaXRzCi0JICogY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCByZWhhc2goKSB7Ci0JCUVudHJ5PEU+W10gb2xkVGFibGUgPSB0aGlzLnRhYmxlOwotCQlpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGg7Ci0KLQkJaWYgKG9sZENhcGFjaXR5ID09IE1BWElNVU1fQ0FQQUNJVFkpIHsKLQkJCXRoaXMudGhyZXNob2xkID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbmV3Q2FwYWNpdHkgPSAyICogb2xkQ2FwYWNpdHk7Ci0JCUVudHJ5PEU+W10gbmV3VGFibGUgPSB0aGlzLmJ1aWxkVGFibGUobmV3Q2FwYWNpdHkpOwotCi0JCWZvciAoaW50IGkgPSBvbGRDYXBhY2l0eTsgaS0tID4gMDsgKSB7Ci0JCQlmb3IgKEVudHJ5PEU+IG9sZCA9IG9sZFRhYmxlW2ldOyBvbGQgIT0gbnVsbDsgKSB7Ci0JCQkJRW50cnk8RT4gZSA9IG9sZDsKLQkJCQlvbGQgPSBvbGQubmV4dDsKLQotCQkJCWludCBpbmRleCA9IHRoaXMuaW5kZXgoZS5oYXNoLCBuZXdDYXBhY2l0eSk7Ci0JCQkJZS5uZXh0ID0gbmV3VGFibGVbaW5kZXhdOwotCQkJCW5ld1RhYmxlW2luZGV4XSA9IGU7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnRhYmxlID0gbmV3VGFibGU7Ci0JCXRoaXMudGhyZXNob2xkID0gKGludCkgKG5ld0NhcGFjaXR5ICogdGhpcy5sb2FkRmFjdG9yKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFbnRyeTxFPltdIGJ1aWxkVGFibGUoaW50IGNhcGFjaXR5KSB7Ci0JCXJldHVybiBuZXcgRW50cnlbY2FwYWNpdHldOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZChvLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciB0aGUgb2JqZWN0IGluIHRoZSBoYXNoIHRhYmxlIGJ5IGNhbGN1bGF0aW5nCi0JICogdGhlIG9iamVjdCdzIGlkZW50aXR5IGhhc2ggY29kZSBhbmQgZXhhbWluaW5nIHRoZSBlbnRyaWVzIGluIHRoZSBjb3JyZXNwb25kaW5nIGhhc2gKLQkgKiB0YWJsZSBidWNrZXQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNudCkgewotCQlpZiAoY250IDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWludCBoYXNoID0gdGhpcy5oYXNoKG8pOwotCQlpbnQgaW5kZXggPSB0aGlzLmluZGV4KGhhc2gpOwotCi0JCS8vIGlmIHRoZSBvYmplY3QgaXMgYWxyZWFkeSBpbiB0aGUgYmFnLCBzaW1wbHkgYnVtcCBpdHMgY291bnQKLQkJZm9yIChFbnRyeTxFPiBlID0gdGhpcy50YWJsZVtpbmRleF07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgewotCQkJaWYgKGUub2JqZWN0ID09IG8pIHsKLQkJCQllLmNvdW50ICs9IGNudDsKLQkJCQl0aGlzLnNpemUgKz0gY250OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVoYXNoIHRoZSB0YWJsZSBpZiB3ZSBhcmUgZ29pbmcgdG8gZXhjZWVkIHRoZSB0aHJlc2hvbGQKLQkJaWYgKHRoaXMudW5pcXVlQ291bnQgPj0gdGhpcy50aHJlc2hvbGQpIHsKLQkJCXRoaXMucmVoYXNoKCk7Ci0JCQlpbmRleCA9IHRoaXMuaW5kZXgoaGFzaCk7ICAvLyBuZWVkIHRvIHJlLWNhbGN1bGF0ZSB0aGUgaW5kZXgKLQkJfQotCi0JCS8vIGNyZWF0ZSB0aGUgbmV3IGVudHJ5IGFuZCBwdXQgaXQgaW4gdGhlIHRhYmxlCi0JCUVudHJ5PEU+IGUgPSB0aGlzLmJ1aWxkRW50cnkoaGFzaCwgbywgY250LCB0aGlzLnRhYmxlW2luZGV4XSk7Ci0JCXRoaXMudGFibGVbaW5kZXhdID0gZTsKLQkJdGhpcy5zaXplICs9IGNudDsKLQkJdGhpcy51bmlxdWVDb3VudCsrOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoeyAidW5jaGVja2VkIiwgInJhd3R5cGVzIiB9KQotCXByaXZhdGUgRW50cnk8RT4gYnVpbGRFbnRyeShpbnQgaGFzaCwgT2JqZWN0IG8sIGludCBjbnQsIEVudHJ5IG5leHQpIHsKLQkJcmV0dXJuIG5ldyBFbnRyeTxFPihoYXNoLCAoRSkgbywgY250LCAoRW50cnk8RT4pIG5leHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlKG8sIDEpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIHRoZSBvYmplY3QgaW4gdGhlIGhhc2ggdGFibGUgYnkgY2FsY3VsYXRpbmcKLQkgKiB0aGUgb2JqZWN0J3MgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCBleGFtaW5pbmcgdGhlIGVudHJpZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgaGFzaAotCSAqIHRhYmxlIGJ1Y2tldC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8sIGludCBjbnQpIHsKLQkJaWYgKGNudCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGluZGV4ID0gdGhpcy5pbmRleChvKTsKLQotCQlmb3IgKEVudHJ5PEU+IGUgPSB0aGlzLnRhYmxlW2luZGV4XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCWlmIChlLm9iamVjdCA9PSBvKSB7Ci0JCQkJdGhpcy5tb2RDb3VudCsrOwotCQkJCWNudCA9IChjbnQgPCBlLmNvdW50KSA/IGNudCA6IGUuY291bnQ7Ci0JCQkJZS5jb3VudCAtPSBjbnQ7Ci0JCQkJLy8gaWYgd2UgYXJlIHJlbW92aW5nIHRoZSBsYXN0IGVsZW1lbnQocyksIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQlpZiAoZS5jb3VudCA9PSAwKSB7Ci0JCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCXRoaXMudGFibGVbaW5kZXhdID0gZS5uZXh0OwotCQkJCQl9IGVsc2UgewotCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQl9Ci0JCQkJCXRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQl9Ci0JCQkJdGhpcy5zaXplIC09IGNudDsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgb2JqZWN0LWlkZW50aXR5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQotCSAqIHNwZWNpZmllZCBjb2xsZWN0aW9uIGNvbnRhaW5zIGEgcGFydGljdWxhciBlbGVtZW50LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChuZXcgSWRlbnRpdHlIYXNoQmFnPE9iamVjdD4oYykpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyBvYmplY3QtaWRlbnRpdHkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlCi0JICogc3BlY2lmaWVkIGNvbGxlY3Rpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIGVsZW1lbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gc3VwZXIucmV0YWluQWxsKG5ldyBJZGVudGl0eUhhc2hCYWc8T2JqZWN0PihjKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2xlYXJzIG91dCBhbGwgb2YgdGhlIGhhc2ggdGFibGUgYnVja2V0cy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJRW50cnk8RT5bXSB0YWIgPSB0aGlzLnRhYmxlOwotCQl0aGlzLm1vZENvdW50Kys7Ci0JCWZvciAoaW50IGkgPSB0YWIubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXRhYltpXSA9IG51bGw7Ci0JCX0KLQkJdGhpcy5zaXplID0gMDsKLQkJdGhpcy51bmlxdWVDb3VudCA9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIGJhZzogdGhlIGVsZW1lbnRzCi0JICogdGhlbXNlbHZlcyBhcmUgbm90IGNsb25lZC4KLQkgKgotCSAqIEByZXR1cm4gYSBzaGFsbG93IGNvcHkgb2YgdGhpcyBiYWcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIElkZW50aXR5SGFzaEJhZzxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJSWRlbnRpdHlIYXNoQmFnPEU+IGNsb25lID0gKElkZW50aXR5SGFzaEJhZzxFPikgc3VwZXIuY2xvbmUoKTsKLQkJCWNsb25lLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKHRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWNsb25lLnNpemUgPSAwOwotCQkJY2xvbmUudW5pcXVlQ291bnQgPSAwOwotCQkJY2xvbmUubW9kQ291bnQgPSAwOwotCQkJY2xvbmUuYWRkQWxsXyh0aGlzKTsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogSGFzaCB0YWJsZSBjb2xsaXNpb24gbGlzdCBlbnRyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRyeTxFPiBpbXBsZW1lbnRzIEJhZy5FbnRyeTxFPiB7Ci0JCWZpbmFsIGludCBoYXNoOyAgLy8gY2FjaGUgdGhlIGhhc2ggZm9yIHJlLWhhc2hlcwotCQlmaW5hbCBFIG9iamVjdDsKLQkJaW50IGNvdW50OwotCQlFbnRyeTxFPiBuZXh0OwotCi0JCUVudHJ5KGludCBoYXNoLCBFIG9iamVjdCwgaW50IGNvdW50LCBFbnRyeTxFPiBuZXh0KSB7Ci0JCQl0aGlzLmhhc2ggPSBoYXNoOwotCQkJdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0JCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQl0aGlzLm5leHQgPSBuZXh0OwotCQl9Ci0KLQkJLy8gKioqKiogQmFnLkVudHJ5IGltcGxlbWVudGF0aW9uCi0JCXB1YmxpYyBFIGdldEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5vYmplY3Q7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuY291bnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNldENvdW50KGludCBjb3VudCkgewotCQkJaWYgKGNvdW50IDw9IDApIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb3VudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvOiAiICsgY291bnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgb2xkID0gdGhpcy5jb3VudDsKLQkJCXRoaXMuY291bnQgPSBjb3VudDsKLQkJCXJldHVybiBvbGQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBCYWcuRW50cnk8Pz4pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCUJhZy5FbnRyeSBlID0gKEJhZy5FbnRyeSkgbzsKLQkJCXJldHVybiAodGhpcy5vYmplY3QgPT0gZS5nZXRFbGVtZW50KCkpCi0JCQkJCSYmICh0aGlzLmNvdW50ID09IGUuZ2V0Q291bnQoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCUUgbyA9IHRoaXMub2JqZWN0OwotCQkJcmV0dXJuIChvID09IG51bGwpID8gMCA6ICh0aGlzLmNvdW50ICogby5oYXNoQ29kZSgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMub2JqZWN0ICsgIj0+IiArIHRoaXMuY291bnQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc2l6ZSA9PSAwKSA/IEVNUFRZX0lURVJBVE9SIDogbmV3IEhhc2hJdGVyYXRvcigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnNpemUgPT0gMCkgPyBFTVBUWV9JVEVSQVRPUiA6IG5ldyBVbmlxdWVJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBpbnQgdW5pcXVlQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvdW50OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zaXplID09IDApID8gRU1QVFlfSVRFUkFUT1IgOiBuZXcgRW50cnlJdGVyYXRvcigpOwotCX0KLQotCi0JLyoqCi0JICogRW1wdHkgaXRlcmF0b3IgdGhhdCBkb2VzIGp1c3QgYWJvdXQgbm90aGluZy4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yIEVNUFRZX0lURVJBVE9SID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yIHsKLQotCQlFbXB0eUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEhhc2hJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZS5sZW5ndGg7CS8vIHN0YXJ0IGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlCi0JCXByaXZhdGUgRW50cnk8RT4gbmV4dEVudHJ5ID0gbnVsbDsKLQkJcHJpdmF0ZSBpbnQgbmV4dEVudHJ5Q291bnQgPSAwOwotCQlwcml2YXRlIEVudHJ5PEU+IGxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIG1vZENvdW50IHZhbHVlIHRoYXQgdGhlIGl0ZXJhdG9yIGJlbGlldmVzIHRoYXQgdGhlIGJhY2tpbmcKLQkJICogYmFnIHNob3VsZCBoYXZlLiBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKLQkJICogaGFzIGRldGVjdGVkIGEgY29uY3VycmVudCBtb2RpZmljYXRpb24uCi0JCSAqLwotCQlwcml2YXRlIGludCBleHBlY3RlZE1vZENvdW50ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQ7Ci0KLQkJSGFzaEl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBldCA9IHRoaXMubmV4dEVudHJ5OwotCQkJaW50IGkgPSB0aGlzLmluZGV4OwotCQkJRW50cnk8RT5bXSB0YWIgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZTsKLQkJCS8vIFVzZSBsb2NhbHMgZm9yIGZhc3RlciBsb29wIGl0ZXJhdGlvbgotCQkJd2hpbGUgKChldCA9PSBudWxsKSAmJiAoaSA+IDApKSB7Ci0JCQkJZXQgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGV0OwotCQkJdGhpcy5pbmRleCA9IGk7Ci0JCQlpZiAoZXQgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IHRoaXMubmV4dEVudHJ5OwotCQkJdGhpcy5uZXh0RW50cnlDb3VudCsrOwotCQkJaWYgKHRoaXMubmV4dEVudHJ5Q291bnQgPT0gZS5jb3VudCkgewotCQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJCXRoaXMubmV4dEVudHJ5Q291bnQgPSAwOwotCQkJfQotCQkJcmV0dXJuIGUub2JqZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJaWYgKHRoaXMubGFzdFJldHVybmVkRW50cnkgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IHNsb3QgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5pbmRleCh0aGlzLmxhc3RSZXR1cm5lZEVudHJ5Lmhhc2gsIElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlLmxlbmd0aCk7Ci0JCQlmb3IgKEVudHJ5PEU+IGUgPSBJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSwgcHJldiA9IG51bGw7IGUgIT0gbnVsbDsgcHJldiA9IGUsIGUgPSBlLm5leHQpIHsKLQkJCQlpZiAoZSA9PSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5KSB7Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50Kys7Ci0JCQkJCXRoaXMuZXhwZWN0ZWRNb2RDb3VudCsrOwotCQkJCQllLmNvdW50LS07Ci0JCQkJCWlmIChlLmNvdW50ID09IDApIHsKLQkJCQkJCS8vIGlmIHdlIGFyZSByZW1vdmluZyB0aGUgbGFzdCBvbmUsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCQkJCQlJZGVudGl0eUhhc2hCYWcudGhpcy50YWJsZVtzbG90XSA9IGUubmV4dDsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcHJldi5uZXh0ID0gZS5uZXh0OwotCQkJCQkJfQotCQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHNsaWRlIGJhY2sgdGhlIGNvdW50IHRvIGFjY291bnQgZm9yIHRoZSBqdXN0LXJlbW92ZWQgZWxlbWVudAotCQkJCQkJdGhpcy5uZXh0RW50cnlDb3VudC0tOwotCQkJCQl9Ci0JCQkJCUlkZW50aXR5SGFzaEJhZy50aGlzLnNpemUtLTsKLQkJCQkJdGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9IG51bGw7CS8vIGl0IGNhbm5vdCBiZSByZW1vdmVkIGFnYWluCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCXByaXZhdGUgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEVudHJ5PEU+PiB7Ci0JCXByaXZhdGUgaW50IGluZGV4ID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoOwkvLyBzdGFydCBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZQotCQlwcml2YXRlIEVudHJ5PEU+IG5leHRFbnRyeSA9IG51bGw7Ci0JCXByaXZhdGUgRW50cnk8RT4gbGFzdFJldHVybmVkRW50cnkgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgbW9kQ291bnQgdmFsdWUgdGhhdCB0aGUgaXRlcmF0b3IgYmVsaWV2ZXMgdGhhdCB0aGUgYmFja2luZwotCQkgKiBiYWcgc2hvdWxkIGhhdmUuIElmIHRoaXMgZXhwZWN0YXRpb24gaXMgdmlvbGF0ZWQsIHRoZSBpdGVyYXRvcgotCQkgKiBoYXMgZGV0ZWN0ZWQgYSBjb25jdXJyZW50IG1vZGlmaWNhdGlvbi4KLQkJICovCi0JCXByaXZhdGUgaW50IGV4cGVjdGVkTW9kQ291bnQgPSBJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudDsKLQotCQlFbnRyeUl0ZXJhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlFbnRyeTxFPiBlID0gdGhpcy5uZXh0RW50cnk7Ci0JCQlpbnQgaSA9IHRoaXMuaW5kZXg7Ci0JCQlFbnRyeTxFPltdIHRhYiA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlOwotCQkJLy8gVXNlIGxvY2FscyBmb3IgZmFzdGVyIGxvb3AgaXRlcmF0aW9uCi0JCQl3aGlsZSAoKGUgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWUgPSB0YWJbLS1pXTsJCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIHRhYmxlCi0JCQl9Ci0JCQl0aGlzLm5leHRFbnRyeSA9IGU7Ci0JCQl0aGlzLmluZGV4ID0gaTsKLQkJCXJldHVybiBlICE9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRW50cnk8RT4gbmV4dCgpIHsKLQkJCWlmIChJZGVudGl0eUhhc2hCYWcudGhpcy5tb2RDb3VudCAhPSB0aGlzLmV4cGVjdGVkTW9kQ291bnQpIHsKLQkJCQl0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZXQgPSB0aGlzLm5leHRFbnRyeTsKLQkJCWludCBpID0gdGhpcy5pbmRleDsKLQkJCUVudHJ5PEU+W10gdGFiID0gSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGU7Ci0JCQkvLyBVc2UgbG9jYWxzIGZvciBmYXN0ZXIgbG9vcCBpdGVyYXRpb24KLQkJCXdoaWxlICgoZXQgPT0gbnVsbCkgJiYgKGkgPiAwKSkgewotCQkJCWV0ID0gdGFiWy0taV07CQkvLyBtb3ZlIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB0YWJsZQotCQkJfQotCQkJdGhpcy5uZXh0RW50cnkgPSBldDsKLQkJCXRoaXMuaW5kZXggPSBpOwotCQkJaWYgKGV0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJRW50cnk8RT4gZSA9IHRoaXMubGFzdFJldHVybmVkRW50cnkgPSB0aGlzLm5leHRFbnRyeTsKLQkJCXRoaXMubmV4dEVudHJ5ID0gZS5uZXh0OwotCQkJcmV0dXJuIGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQlpZiAodGhpcy5sYXN0UmV0dXJuZWRFbnRyeSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJaWYgKElkZW50aXR5SGFzaEJhZy50aGlzLm1vZENvdW50ICE9IHRoaXMuZXhwZWN0ZWRNb2RDb3VudCkgewotCQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpbnQgc2xvdCA9IElkZW50aXR5SGFzaEJhZy50aGlzLmluZGV4KHRoaXMubGFzdFJldHVybmVkRW50cnkuaGFzaCwgSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGUubGVuZ3RoKTsKLQkJCWZvciAoRW50cnk8RT4gZSA9IElkZW50aXR5SGFzaEJhZy50aGlzLnRhYmxlW3Nsb3RdLCBwcmV2ID0gbnVsbDsgZSAhPSBudWxsOyBwcmV2ID0gZSwgZSA9IGUubmV4dCkgewotCQkJCWlmIChlID09IHRoaXMubGFzdFJldHVybmVkRW50cnkpIHsKLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMubW9kQ291bnQrKzsKLQkJCQkJdGhpcy5leHBlY3RlZE1vZENvdW50Kys7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgdGFibGUKLQkJCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudGFibGVbc2xvdF0gPSBlLm5leHQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2Lm5leHQgPSBlLm5leHQ7Ci0JCQkJCX0KLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMudW5pcXVlQ291bnQtLTsKLQkJCQkJSWRlbnRpdHlIYXNoQmFnLnRoaXMuc2l6ZSAtPSB0aGlzLmxhc3RSZXR1cm5lZEVudHJ5LmNvdW50OwotCQkJCQl0aGlzLmxhc3RSZXR1cm5lZEVudHJ5ID0gbnVsbDsJLy8gaXQgY2Fubm90IGJlIHJlbW92ZWQgYWdhaW4KLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXRocm93IG5ldyBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBVbmlxdWVJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLQkJcHJpdmF0ZSBFbnRyeUl0ZXJhdG9yIGVudHJ5SXRlcmF0b3IgPSBuZXcgRW50cnlJdGVyYXRvcigpOwotCQkKLQkJVW5pcXVlSXRlcmF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIEUgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLmVudHJ5SXRlcmF0b3IubmV4dCgpLm9iamVjdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuZW50cnlJdGVyYXRvci5yZW1vdmUoKTsKLQkJfQotCi0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIElkZW50aXR5SGFzaEJhZzw/PikgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlJZGVudGl0eUhhc2hCYWc8RT4gYiA9IChJZGVudGl0eUhhc2hCYWc8RT4pIG87Ci0JCQlpZiAoYi5zaXplKCkgIT0gdGhpcy5zaXplKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoYi51bmlxdWVDb3VudCgpICE9IHRoaXMudW5pcXVlQ291bnQoKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3I8QmFnLkVudHJ5PEU+PiBzdHJlYW0gPSBiLmVudHJpZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJQmFnLkVudHJ5PEU+IGVudHJ5ID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoZW50cnkuZ2V0Q291bnQoKSAhPSB0aGlzLmNvdW50KGVudHJ5LmdldEVsZW1lbnQoKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoaXMuZXF1YWxzXyhvKTsKLQkJfQotLy8JCX0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJhZzw/PikgewotLy8JCQkvLyBobW1tLi4uCi0vLwkJCXJldHVybiBuZXcgSGFzaEJhZzxPYmplY3Q+KHRoaXMpLmVxdWFscyhvKTsKLS8vCQl9IGVsc2UgewotLy8JCQlyZXR1cm4gZmFsc2U7Ci0vLwkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBlcXVhbHNfKE9iamVjdCBvKSB7Ci0JCS8vIGhtbW0uLi4KLQkJcmV0dXJuIChvIGluc3RhbmNlb2YgQmFnPD8+KSAmJiAKLQkJCQluZXcgSGFzaEJhZzxPYmplY3Q+KHRoaXMpLmVxdWFscyhvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaCA9IDA7Ci0JCWZvciAoRSBvIDogdGhpcykgewotCQkJaCArPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKLQkJfQotCQlyZXR1cm4gaDsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGlzIGJhZyB0byBhIHN0cmVhbSAoaS5lLiBzZXJpYWxpemUgaXQpLgotCSAqCi0JICogQHNlcmlhbERhdGEgRW1pdCB0aGUgY2FwYWNpdHkgb2YgdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgdGhlIG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMgaW4gdGhlIGJhZyAoaW50KSwKLQkgKiAgICAgZm9sbG93ZWQgYnkgYWxsIG9mIHRoZSBiYWcncyBlbGVtZW50cyAoZWFjaCBhbiBPYmplY3QpIGFuZAotCSAqICAgICB0aGVpciBjb3VudHMgKGVhY2ggYW4gaW50KSwgaW4gbm8gcGFydGljdWxhciBvcmRlci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykKLQkJCQl0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCS8vIHdyaXRlIG91dCB0aGUgdGhyZXNob2xkLCBsb2FkIGZhY3RvciwgYW5kIGFueSBoaWRkZW4gc3R1ZmYKLQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQotCQkvLyB3cml0ZSBvdXQgbnVtYmVyIG9mIGJ1Y2tldHMKLQkJcy53cml0ZUludCh0aGlzLnRhYmxlLmxlbmd0aCk7Ci0KLQkJLy8gd3JpdGUgb3V0IG51bWJlciBvZiB1bmlxdWUgZWxlbWVudHMKLQkJcy53cml0ZUludCh0aGlzLnVuaXF1ZUNvdW50KTsKLQotCQkvLyB3cml0ZSBvdXQgZWxlbWVudHMgYW5kIGNvdW50cyAoYWx0ZXJuYXRpbmcpCi0JCWlmICh0aGlzLnVuaXF1ZUNvdW50ID4gMCkgewotCQkJZm9yIChFbnRyeTxFPiBlbnRyeSA6IHRoaXMudGFibGUpIHsKLQkJCQl3aGlsZSAoZW50cnkgIT0gbnVsbCkgewotCQkJCQlzLndyaXRlT2JqZWN0KGVudHJ5Lm9iamVjdCk7Ci0JCQkJCXMud3JpdGVJbnQoZW50cnkuY291bnQpOwotCQkJCQllbnRyeSA9IGVudHJ5Lm5leHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBSZWNvbnN0aXR1dGUgdGhlIGJhZyBmcm9tIGEgc3RyZWFtIChpLmUuIGRlc2VyaWFsaXplIGl0KS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIHMpCi0JCQkJdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkvLyByZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQkvLyByZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUocy5yZWFkSW50KCkpOwotCi0JCS8vIHJlYWQgaW4gbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cwotCQlpbnQgdW5pcXVlID0gcy5yZWFkSW50KCk7Ci0KLQkJLy8gcmVhZCB0aGUgZWxlbWVudHMgYW5kIGNvdW50cywgYW5kIHB1dCB0aGUgZWxlbWVudHMgaW4gdGhlIGJhZwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuaXF1ZTsgaSsrKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUUgZWxlbWVudCA9IChFKSBzLnJlYWRPYmplY3QoKTsKLQkJCWludCBlbGVtZW50Q291bnQgPSBzLnJlYWRJbnQoKTsKLQkJCXRoaXMuYWRkXyhlbGVtZW50LCBlbGVtZW50Q291bnQpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9JbnRSZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk4OWI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0ludFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIGNvbnRhaW5lciBmb3IgcGFzc2luZyBhbiBpbnRlZ2VyIHRoYXQgY2FuIGJlIGNoYW5nZWQgYnkKLSAqIHRoZSByZWNpcGllbnQuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSW50UmVmZXJlbmNlCi0JZXh0ZW5kcyBSZWFkT25seUludFJlZmVyZW5jZQotewotCS8qKgotCSAqIFNldCB0aGUgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCWludCBzZXRWYWx1ZShpbnQgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0IHRoZSA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIHRvIHplcm8uCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlpbnQgc2V0WmVybygpOwotCi0JLyoqCi0JICogSW5jcmVtZW50IGFuZCByZXR1cm4gdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICovCi0JaW50IGluY3JlbWVudCgpOwotCi0JLyoqCi0JICogRGVjcmVtZW50IGFuZCByZXR1cm4gdGhlIDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICovCi0JaW50IGRlY3JlbWVudCgpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2M2E4ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLQotLyoqCi0gKiBIZWxwZXIgbWV0aG9kcyBmb3IgZGVhbGluZyB3aXRoIHRoZSBKREJDIEFQSS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpEQkNUb29scyB7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSBqZGJjVHlwZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcgbWFwcGluZyA9IGphdmFUb0pEQkNUeXBlTWFwcGluZyhjbGFzc05hbWUpOwotCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCkgPyBERUZBVUxUX0pEQkNfVFlQRSA6IG1hcHBpbmcuZ2V0SkRCQ1R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSkRCQ1R5cGUgamRiY1R5cGVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKREJDIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpEQkNUeXBlIGpkYmNUeXBlRm9yKEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCXJldHVybiBqZGJjVHlwZUZvckNsYXNzTmFtZWQoamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgSkRCQyB0eXBlLgotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCUpEQkNUb0phdmFUeXBlTWFwcGluZyBtYXBwaW5nID0gamRiY1RvSmF2YVR5cGVNYXBwaW5nKGpkYmNUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IERFRkFVTFRfSkFWQV9UWVBFIDogbWFwcGluZy5nZXRKYXZhVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3IoSkRCQ1R5cGUgamRiY1R5cGUpIHsKLQkJcmV0dXJuIGphdmFUeXBlRm9ySkRCQ1R5cGVOYW1lZChqZGJjVHlwZS5uYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKREJDIHR5cGUuCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGUgamF2YVR5cGVGb3JKREJDVHlwZUNvZGUoaW50IGpkYmNUeXBlQ29kZSkgewotCQlyZXR1cm4gamF2YVR5cGVGb3IoSkRCQ1R5cGUudHlwZShqZGJjVHlwZUNvZGUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgc3R1ZmYgKioqKioqKioqKgotCi0KLQkvLyAqKioqKioqKioqIEpEQkMgPT4gSmF2YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEgdHlwZSBtYXBwaW5ncywga2V5ZWQgYnkgSkRCQyB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKQotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IEpEQkNfVE9fSkFWQV9UWVBFX01BUFBJTkdTOyAgLy8gcHNldWRvICdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgREVGQVVMVF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7ICAvLyBUT0RPIE9iamVjdCBpcyB0aGUgZGVmYXVsdD8KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIGpkYmNUb0phdmFUeXBlTWFwcGluZyhTdHJpbmcgamRiY1R5cGVOYW1lKSB7Ci0JCXJldHVybiBqZGJjVG9KYXZhVHlwZU1hcHBpbmdzKCkuZ2V0KGpkYmNUeXBlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IGpkYmNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCWlmIChKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9PSBudWxsKSB7Ci0JCQlKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUyA9IGJ1aWxkSkRCQ1RvSmF2YVR5cGVNYXBwaW5ncygpOwotCQl9Ci0JCXJldHVybiBKREJDX1RPX0pBVkFfVFlQRV9NQVBQSU5HUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+KCk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ3NUbyhtYXBwaW5ncyk7Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiBoYXJkIGNvZGUgdGhlIGRlZmF1bHQgbWFwcGluZ3MgZnJvbSB0aGUgSkRCQyB0eXBlcyB0byB0aGUKLQkgKiBhcHByb3ByaWF0ZSBKYXZhIHR5cGVzCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqIHNlZSAiSkRCQyAzLjAgU3BlY2lmaWNhdGlvbiIgQXBwZW5kaXggQgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nc1RvKEhhc2hNYXA8U3RyaW5nLCBKREJDVG9KYXZhVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkFSUkFZLCBqYXZhLnNxbC5BcnJheS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5CSUdJTlQsIGxvbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQklULCBib29sZWFuLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkJMT0IsIGphdmEuc3FsLkJsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuQk9PTEVBTiwgYm9vbGVhbi5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5DSEFSLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkNMT0IsIGphdmEuc3FsLkNsb2IuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuREFUQUxJTkssIGphdmEubmV0LlVSTC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5EQVRFLCBqYXZhLnNxbC5EYXRlLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRFQ0lNQUwsIGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLkRJU1RJTkNULCBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLCBtYXBwaW5ncyk7ICAvLyA/Pz8KLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRE9VQkxFLCBkb3VibGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuRkxPQVQsIGRvdWJsZS5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5JTlRFR0VSLCBpbnQuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuSkFWQV9PQkpFQ1QsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsgIC8vID8/PwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5MT05HVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTE9OR1ZBUkNIQVIsIGphdmEubGFuZy5TdHJpbmcuY2xhc3MsIG1hcHBpbmdzKTsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgZGVmaW5lZCBpbiBqYXZhLnNxbC5UeXBlcwotLy8JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLk5VTEwsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuTlVNRVJJQywgamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuT1RIRVIsIGphdmEubGFuZy5PYmplY3QuY2xhc3MsIG1hcHBpbmdzKTsJLy8gPz8/Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFQUwsIGZsb2F0LmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlJFRiwgamF2YS5zcWwuUmVmLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlNNQUxMSU5ULCBzaG9ydC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5TVFJVQ1QsIGphdmEuc3FsLlN0cnVjdC5jbGFzcywgbWFwcGluZ3MpOwotCQlhZGRKREJDVG9KYXZhVHlwZU1hcHBpbmdUbyhUeXBlcy5USU1FLCBqYXZhLnNxbC5UaW1lLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTUVTVEFNUCwgamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBtYXBwaW5ncyk7Ci0JCWFkZEpEQkNUb0phdmFUeXBlTWFwcGluZ1RvKFR5cGVzLlRJTllJTlQsIGJ5dGUuY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQklOQVJZLCBieXRlW10uY2xhc3MsIG1hcHBpbmdzKTsKLQkJYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oVHlwZXMuVkFSQ0hBUiwgamF2YS5sYW5nLlN0cmluZy5jbGFzcywgbWFwcGluZ3MpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSkRCQ1RvSmF2YVR5cGVNYXBwaW5nVG8oaW50IGpkYmNUeXBlQ29kZSwgQ2xhc3M8Pz4gamF2YUNsYXNzLCBIYXNoTWFwPFN0cmluZywgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlcwotCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKTsKLQkJT2JqZWN0IHByZXYgPSBtYXBwaW5ncy5wdXQoamRiY1R5cGUubmFtZSgpLCBidWlsZEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgamF2YUNsYXNzKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKREJDIHR5cGU6ICIgKyBqZGJjVHlwZS5uYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBKREJDVG9KYXZhVHlwZU1hcHBpbmcgYnVpbGRKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gbmV3IEpEQkNUb0phdmFUeXBlTWFwcGluZyhqZGJjVHlwZSwgbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhID0+IEpEQkMgKioqKioqKioqKgotCi0JLyoqCi0JICogSmF2YSA9PiBKREJDIHR5cGUgbWFwcGluZ3MsIGtleWVkIGJ5IEphdmEgY2xhc3MgbmFtZSAoZS5nLiAiamF2YS5sYW5nLk9iamVjdCIpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7ICAvLyBwc2V1ZG8gJ2ZpbmFsJyAtIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKREJDVHlwZSBERUZBVUxUX0pEQkNfVFlQRSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7ICAvLyBUT0RPIFZBUkNIQVIgaXMgdGhlIGRlZmF1bHQ/Ci0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBqYXZhVG9KREJDVHlwZU1hcHBpbmcoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gamF2YVRvSkRCQ1R5cGVNYXBwaW5ncygpLmdldChjbGFzc05hbWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBqYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlpZiAoSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPT0gbnVsbCkgewotCQkJSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1MgPSBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZ3MoKTsKLQkJfQotCQlyZXR1cm4gSkFWQV9UT19KREJDX1RZUEVfTUFQUElOR1M7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIEphdmFUb0pEQkNUeXBlTWFwcGluZz4gYnVpbGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzKCkgewotCQlIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPigpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdzVG8obWFwcGluZ3MpOwotCQlyZXR1cm4gbWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogaGFyZCBjb2RlIHRoZSBkZWZhdWx0IG1hcHBpbmdzIGZyb20gdGhlIEphdmEgdHlwZXMgdG8gdGhlCi0JICogYXBwcm9wcmlhdGUgSkRCQyB0eXBlcwotCSAqIEBzZWUgamF2YS5zcWwuVHlwZXMKLQkgKiBzZWUgIkpEQkMgMy4wIFNwZWNpZmljYXRpb24iIEFwcGVuZGl4IEIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ3NUbyhIYXNoTWFwPFN0cmluZywgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nPiBtYXBwaW5ncykgewotCQkvLyBwcmltaXRpdmVzCi0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhieXRlLmNsYXNzLCBUeXBlcy5USU5ZSU5ULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGRvdWJsZS5jbGFzcywgVHlwZXMuRE9VQkxFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGludC5jbGFzcywgVHlwZXMuSU5URUdFUiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhsb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oc2hvcnQuY2xhc3MsIFR5cGVzLlNNQUxMSU5ULCBtYXBwaW5ncyk7Ci0KLQkJLy8gcmVmZXJlbmNlIGNsYXNzZXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MsIFR5cGVzLkJJVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuQnl0ZS5jbGFzcywgVHlwZXMuVElOWUlOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuRG91YmxlLmNsYXNzLCBUeXBlcy5ET1VCTEUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBUeXBlcy5SRUFMLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBUeXBlcy5JTlRFR0VSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubGFuZy5Mb25nLmNsYXNzLCBUeXBlcy5CSUdJTlQsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLlNob3J0LmNsYXNzLCBUeXBlcy5TTUFMTElOVCwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCBUeXBlcy5WQVJDSEFSLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubWF0aC5CaWdEZWNpbWFsLmNsYXNzLCBUeXBlcy5OVU1FUklDLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEubmV0LlVSTC5jbGFzcywgVHlwZXMuREFUQUxJTkssIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQXJyYXkuY2xhc3MsIFR5cGVzLkFSUkFZLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLkJsb2IuY2xhc3MsIFR5cGVzLkJMT0IsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuQ2xvYi5jbGFzcywgVHlwZXMuQ0xPQiwgbWFwcGluZ3MpOwotCQlhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhqYXZhLnNxbC5EYXRlLmNsYXNzLCBUeXBlcy5EQVRFLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlJlZi5jbGFzcywgVHlwZXMuUkVGLCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlN0cnVjdC5jbGFzcywgVHlwZXMuU1RSVUNULCBtYXBwaW5ncyk7Ci0JCWFkZEphdmFUb0pEQkNUeXBlTWFwcGluZ1RvKGphdmEuc3FsLlRpbWUuY2xhc3MsIFR5cGVzLlRJTUUsIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLCBUeXBlcy5USU1FU1RBTVAsIG1hcHBpbmdzKTsKLQotCQkvLyBhcnJheXMKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oYnl0ZVtdLmNsYXNzLCBUeXBlcy5WQVJCSU5BUlksIG1hcHBpbmdzKTsKLQkJYWRkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nVG8oamF2YS5sYW5nLkJ5dGVbXS5jbGFzcywgVHlwZXMuVkFSQklOQVJZLCBtYXBwaW5ncyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRKYXZhVG9KREJDVHlwZU1hcHBpbmdUbyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUsIEhhc2hNYXA8U3RyaW5nLCBKYXZhVG9KREJDVHlwZU1hcHBpbmc+IG1hcHBpbmdzKSB7Ci0JCS8vIGNoZWNrIGZvciBkdXBsaWNhdGVzCi0JCU9iamVjdCBwcmV2ID0gbWFwcGluZ3MucHV0KGphdmFDbGFzcy5nZXROYW1lKCksIGJ1aWxkSmF2YVRvSkRCQ1R5cGVNYXBwaW5nKGphdmFDbGFzcywgamRiY1R5cGVDb2RlKSk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBKYXZhIGNsYXNzOiAiICsgKChKYXZhVG9KREJDVHlwZU1hcHBpbmcpIHByZXYpLmdldEphdmFUeXBlKCkuZGVjbGFyYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIEphdmFUb0pEQkNUeXBlTWFwcGluZyBidWlsZEphdmFUb0pEQkNUeXBlTWFwcGluZyhDbGFzczw/PiBqYXZhQ2xhc3MsIGludCBqZGJjVHlwZUNvZGUpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVG9KREJDVHlwZU1hcHBpbmcobmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyksIEpEQkNUeXBlLnR5cGUoamRiY1R5cGVDb2RlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBKREJDVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBKREJDID0+IEphdmEKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSkRCQ1RvSmF2YVR5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQotCQlKREJDVG9KYXZhVHlwZU1hcHBpbmcoSkRCQ1R5cGUgamRiY1R5cGUsIEphdmFUeXBlIGphdmFUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQl9Ci0KLQkJcHVibGljIEpEQkNUeXBlIGdldEpEQkNUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVR5cGUgZ2V0SmF2YVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoaW50IGpkYmNUeXBlQ29kZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUuY29kZSgpID09IGpkYmNUeXBlQ29kZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGpkYmNUeXBlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuamRiY1R5cGUubmFtZSgpLmVxdWFscyhqZGJjVHlwZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gbWFwcyhKREJDVHlwZSB0eXBlKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZSA9PSB0eXBlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXRoaXMuYXBwZW5kVG8oc2IpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmphdmFUeXBlLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBKYXZhID0+IEpEQkMKLQkgKi8KLQlzdGF0aWMgY2xhc3MgSmF2YVRvSkRCQ1R5cGVNYXBwaW5nIHsKLQkJcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLQkJcHJpdmF0ZSBmaW5hbCBKREJDVHlwZSBqZGJjVHlwZTsKLQotCQlKYXZhVG9KREJDVHlwZU1hcHBpbmcoSmF2YVR5cGUgamF2YVR5cGUsIEpEQkNUeXBlIGpkYmNUeXBlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5qYXZhVHlwZSA9IGphdmFUeXBlOwotCQkJdGhpcy5qZGJjVHlwZSA9IGpkYmNUeXBlOwotCQl9Ci0KLQkJcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgewotCQkJcmV0dXJuIHRoaXMuamF2YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgSkRCQ1R5cGUgZ2V0SkRCQ1R5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qZGJjVHlwZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoSmF2YVR5cGUganQpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmVxdWFscyhqdCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBtYXBzKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoU3RyaW5nIGphdmFDbGFzc05hbWUpIHsKLQkJCXJldHVybiB0aGlzLmphdmFUeXBlLmRlc2NyaWJlcyhqYXZhQ2xhc3NOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIG1hcHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhVHlwZS5kZXNjcmliZXMoamF2YUNsYXNzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJdGhpcy5qYXZhVHlwZS5hcHBlbmREZWNsYXJhdGlvblRvKHNiKTsKLQkJCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmpkYmNUeXBlLmFwcGVuZFRvKHNiKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvSkRCQ1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmZDI4My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9KREJDVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5zcWwuVHlwZXM7Ci0KLS8qKgotICogQXNzb2NpYXRlIHRoZSBKYXZhIGNvbnN0YW50IGFuZCB0aGUgSkRCQyB0eXBlIG5hbWUuCi0gKiBUaGVzZSBhcmUgZGVyaXZlZCBmcm9tIGphdmEuc3FsLlR5cGVzLgotICogCi0gKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKREJDVHlwZQotCWltcGxlbWVudHMgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQotCS8qKgotCSAqIHRoZSBjb25zdGFudCBuYW1lIChlLmcuIFZBUkNIQVIpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIHRoZSBKREJDIGNvZGUgdXNlZCBieSBKREJDIGRyaXZlcnMKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBjb2RlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpEQkMgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdHlwZSBjb2RlLgotCSAqIFRoaXMgaXMgcHJpdmF0ZSBiZWNhdXNlIGFsbCB0aGUgcG9zc2libGUgSkRCQyB0eXBlcyBhcmUgYnVpbHQgYW5kCi0JICogc3RvcmVkIGluIHRoZSBzdGF0aWMgYXJyYXkgVFlQRVMuCi0JICogQHNlZSAjdHlwZXMoKQotCSAqLwotCXByaXZhdGUgSkRCQ1R5cGUoU3RyaW5nIG5hbWUsIGludCBjb2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuY29kZSA9IGNvZGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHR5cGUsIGFzIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBuYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIGNvZGUsIGFzIGRlZmluZWQgaW4gamF2YS5zcWwuVHlwZXMuCi0JICovCi0JcHVibGljIGludCBjb2RlKCkgewotCQlyZXR1cm4gdGhpcy5jb2RlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmludGluZyBhbmQgZGlzcGxheWluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZFRvKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKREJDVHlwZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSkRCQ1R5cGUpIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBzdHVmZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBhbGwgdGhlIEpEQkMgdHlwZSBkZWZpbmVkIGluIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSkRCQ1R5cGVbXSBUWVBFUzsJCS8vIHBzZXVkbyAnZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKREJDVHlwZVtdIHR5cGVzKCkgewotCQlpZiAoVFlQRVMgPT0gbnVsbCkgewotCQkJVFlQRVMgPSBidWlsZFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIFRZUEVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgY29kZSAoZS5nLiBUeXBlcy5WQVJDSEFSKS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSB0eXBlKGludCBjb2RlKSB7Ci0JCUpEQkNUeXBlW10gdHlwZXMgPSB0eXBlcygpOwotCQlmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0eXBlc1tpXS5jb2RlKCkgPT0gY29kZSkgewotCQkJCXJldHVybiB0eXBlc1tpXTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIEpEQkMgdHlwZSBjb2RlOiAiICsgY29kZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpEQkMgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlIG5hbWUgKGUuZy4gIlZBUkNIQVIiKS4KLQkgKiBAc2VlIGphdmEuc3FsLlR5cGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBKREJDVHlwZSB0eXBlKFN0cmluZyBuYW1lKSB7Ci0JCUpEQkNUeXBlW10gdHlwZXMgPSB0eXBlcygpOwotCQlmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmICh0eXBlc1tpXS5uYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHR5cGVzW2ldOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSkRCQyB0eXBlIG5hbWU6ICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGJ1aWxkIHVwIHRoZSBKREJDIHR5cGVzIHZpYSByZWZsZWN0aW9uCi0JICogQHNlZSBqYXZhLnNxbC5UeXBlcwotCSAqLwotCXByaXZhdGUgc3RhdGljIEpEQkNUeXBlW10gYnVpbGRUeXBlcygpIHsKLQkJRmllbGRbXSBmaWVsZHMgPSBUeXBlcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlpbnQgbGVuID0gZmllbGRzLmxlbmd0aDsKLQkJSkRCQ1R5cGVbXSB0eXBlcyA9IG5ldyBKREJDVHlwZVtsZW5dOwotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCWludCBjb2RlOwotCQkJdHJ5IHsKLQkJCQljb2RlID0gKChJbnRlZ2VyKSBmaWVsZHNbaV0uZ2V0KG51bGwpKS5pbnRWYWx1ZSgpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsJLy8gc2hvdWxkbid0IGhhcHBlbi4uLgotCQkJfQotCQkJdHlwZXNbaV0gPSBuZXcgSkRCQ1R5cGUobmFtZSwgY29kZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvS2V5ZWRTZXQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0tleWVkU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDcxZjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvS2V5ZWRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtYWludGFpbnMgYSB7QGxpbmsgU2V0fSBvZiBpdGVtcywgYW5kIGEge0BsaW5rIE1hcH0gb2Yga2V5cyB0byB0aG9zZSBpdGVtcy4KLSAqIEFuIGl0ZW0gbWF5IGhhdmUgbXVsdGlwbGUga2V5cywgYnV0IGFuIGl0ZW0gbWF5IGhhdmUgbm8ga2V5cyBhbmQgcmVtYWluIGluIHRoZSBzZXQuICBPbmNlIGFuIAotICogaXRlbSdzIGxhc3Qga2V5IGlzIHJlbW92ZWQsIHRoZSBpdGVtIGlzIGFsc28gcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIEtleWVkU2V0PEssIFY+IHsKLQkKLQlwcml2YXRlIGZpbmFsIFNldDxWPiBpdGVtU2V0OwotCXByaXZhdGUgZmluYWwgU2V0PFY+IHVubW9kaWZpYWJsZUl0ZW1TZXQ7Ci0JcHJpdmF0ZSBmaW5hbCBNYXA8SyxWPiBtYXA7Ci0JCi0JCi0JcHVibGljIEtleWVkU2V0KCkgewotCQl0aGlzLml0ZW1TZXQgPSBuZXcgSGFzaFNldDxWPigpOwotCQl0aGlzLnVubW9kaWZpYWJsZUl0ZW1TZXQgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQodGhpcy5pdGVtU2V0KTsKLQkJdGhpcy5tYXAgPSBuZXcgSGFzaE1hcDxLLFY+KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiB1bm1vZGlmaWFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNldCBvZiBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgU2V0PFY+IGdldEl0ZW1TZXQoKSB7Ci0JCXJldHVybiB0aGlzLnVubW9kaWZpYWJsZUl0ZW1TZXQ7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBzdG9yZWQgdW5kZXIgdGhlIGdpdmVuIGtleS4KLQkgKi8KLQlwdWJsaWMgViBnZXRJdGVtKEsga2V5KSB7Ci0JCXJldHVybiB0aGlzLm1hcC5nZXQoa2V5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW4gaXRlbSBpcyBzdG9yZWQgdW5kZXIgdGhlIGdpdmVuIGtleS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShLIGtleSkgewotCQlyZXR1cm4gdGhpcy5tYXAuY29udGFpbnNLZXkoa2V5KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGl0ZW0gaXMgc3RvcmVkIHVuZGVyICphbnkqIGtleS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0l0ZW0oViBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLml0ZW1TZXQuY29udGFpbnMoaXRlbSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZCBhbiBpdGVtIHRvIGJlIHN0b3JlZCB1bmRlciB0aGUgZ2l2ZW4ga2V5LiAgCi0JICogVGhlIGl0ZW0gbXVzdCBub3QgYWxyZWFkeSBiZSBzdG9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkSXRlbShLIGtleSwgViBpdGVtKSB7Ci0JCWFkZEl0ZW0oaXRlbSk7Ci0JCWFkZEtleShrZXksIGl0ZW0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSXRlbShWIGl0ZW0pIHsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuaXRlbVNldC5hZGQoaXRlbSk7Ci0JfQotCQotCS8qKiAKLQkgKiBBZGQgYW4gYWRkaXRpb25hbCBrZXkgdG8gYW4gaXRlbSBhbHJlYWR5IHN0b3JlZCB1bmRlciBhbiBhbHRlcm5hdGUga2V5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEtleShLIGtleSwgViBpdGVtKSB7Ci0JCWlmIChrZXkgPT0gbnVsbCB8fCBpdGVtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoISB0aGlzLml0ZW1TZXQuY29udGFpbnMoaXRlbSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm1hcC5wdXQoa2V5LCBpdGVtKTsKLQl9Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBnaXZlbiBpdGVtIGFuZCByZW1vdmUgYW55IGtleS10by1pdGVtIG1hcHBpbmcgaXQgbWF5IGhhdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbShWIGl0ZW0pIHsKLQkJaWYgKHRoaXMuaXRlbVNldC5yZW1vdmUoaXRlbSkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PEssVj4gZW50cnkgOiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLm1hcC5lbnRyeVNldCgpKSkgewotCQkJCWlmIChlbnRyeS5nZXRWYWx1ZSgpID09IGl0ZW0pIHsKLQkJCQkJbWFwLnJlbW92ZShlbnRyeS5nZXRLZXkoKSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIGtleS10by1pdGVtIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBrZXkuCi0JICogSWYgaXQgaXMgdGhlIGxhc3Qga2V5IHRvIHRoZSBpdGVtLCBhbHNvIHJlbW92ZSB0aGUgaXRlbS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVLZXkoSyBrZXkpIHsKLQkJZmluYWwgViBpdGVtID0gdGhpcy5tYXAuZ2V0KGtleSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXRoaXMubWFwLnJlbW92ZShrZXkpOwotCQkJYm9vbGVhbiBvdGhlcktleSA9IGZhbHNlOwotCQkJZm9yIChNYXAuRW50cnk8SyxWPiBlbnRyeSA6IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMubWFwLmVudHJ5U2V0KCkpKSB7Ci0JCQkJaWYgKG90aGVyS2V5IHwgZW50cnkuZ2V0VmFsdWUoKSA9PSBpdGVtKSB7Ci0JCQkJCW90aGVyS2V5ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoISBvdGhlcktleSkgewotCQkJCXJlbW92ZUl0ZW0oaXRlbSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTGF6eVJlYWRPbmx5T2JqZWN0UmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9MYXp5UmVhZE9ubHlPYmplY3RSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRkMDFlMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9MYXp5UmVhZE9ubHlPYmplY3RSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5SZWFkT25seU9iamVjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBQcm92aWRlIGEgdGhyZWFkLXNhZmUsIHJlYXNvbmFibHkgcGVyZm9ybWluZyBjb250YWluZXIgZm9yIGhvbGRpbmcgYW4KLSAqIG9iamVjdCB0aGF0IHdpbGwgYmUgImxhenktaW5pdGlhbGl6ZWQiIHVwb24gaXRzIGZpcnN0IHJlZmVyZW5jZS4gVGhpcyBpcwotICogYWxzbyB1c2VmdWwgZm9yIHByZXZlbnRpbmcgZGlyZWN0IHJlZmVyZW5jZXMgKGFjY2lkZW50YWwgb3Igb3RoZXJ3aXNlKSB0bwotICogbGF6eS1pbml0aWFsaXplZCBzdGF0ZS4KLSAqIDxwPgotICogVGhlcmUgYXJlIHNvbWUgcGVuYWx0aWVzOjx1bD4KLSAqIDxsaT5UaGUgcmVmZXJlbmNlJ3MgdXNlIG9mIGdlbmVyaWNzIHdpbGwgcmVxdWlyZSBjYXN0aW5nIChhbmQgdGhlIHJlcXVpc2l0ZQotICogICAgIFZNIHRlc3RpbmcpIHdpdGggZXZlcnkgYWNjZXNzCi0gKiA8bGk+SWYgdGhlIHZhbHVlIGNhbGN1bGF0ZWQgZHVyaW5nIGxhenkgaW5pdGlhbGl6YXRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4sCi0gKiAgICAgYWNjZXNzIHdpbGwgYmUgPGNvZGU+c3luY2hyb25pemVkPC9jb2RlPiA8ZW0+ZXZlcnk8L2VtPiB0aW1lLgotICogPC91bD4KLSAqIEBzZWUgU2ltcGxlT2JqZWN0UmVmZXJlbmNlCi0gKiBAc2VlIFN5bmNocm9uaXplZE9iamVjdAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGF6eVJlYWRPbmx5T2JqZWN0UmVmZXJlbmNlPFY+Ci0JaW1wbGVtZW50cyBSZWFkT25seU9iamVjdFJlZmVyZW5jZTxWPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyB2YWx1ZS4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFYgdmFsdWUgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhIGxhenkgb2JqZWN0IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgTGF6eVJlYWRPbmx5T2JqZWN0UmVmZXJlbmNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbiBKREsgNSBhbmQgbGF0ZXIsIHRoaXMgImRvdWJsZS1jaGVja2VkIGxvY2tpbmciIGlkaW9tIHdvcmtzIGFzIGxvbmcKLQkgKiBhcyB0aGUgaW5zdGFuY2UgdmFyaWFibGUgaXMgbWFya2VkIDxjb2RlPnZvbGF0aWxlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLQkJViByZXN1bHQgPSB0aGlzLnZhbHVlOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAodGhpcykgewotCQkJCXJlc3VsdCA9IHRoaXMudmFsdWU7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCXRoaXMudmFsdWUgPSByZXN1bHQgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgViBidWlsZFZhbHVlKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZUVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmdldFZhbHVlKCksIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVOb3RFcXVhbChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5nZXRWYWx1ZSgpLCBvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKSA9PSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBMYXp5UmVhZE9ubHlPYmplY3RSZWZlcmVuY2U8Vj4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxhenlSZWFkT25seU9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSA9IChMYXp5UmVhZE9ubHlPYmplY3RSZWZlcmVuY2U8Vj4pIHN1cGVyLmNsb25lKCk7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCA8ZW0+bm90PC9lbT4gdHJpZ2dlciB0aGUgImxhenktaW5pdGlhbGl6YXRpb24iLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKSArICddJzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9MaXN0ZW5lckxpc3QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0xpc3RlbmVyTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzJiM2ZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL0xpc3RlbmVyTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci0KLS8qKgotICogTWFpbnRhaW4gYSB0aHJlYWQtc2FmZSBsaXN0IG9mIGxpc3RlbmVycyB0aGF0IGRvZXMgbm90IGFsbG93IGFkZGluZwotICogZHVwbGljYXRlIGxpc3RlbmVycyBvciByZW1vdmluZyBub24tbGlzdGVuZXJzLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdGVuZXJMaXN0PEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPgotCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi17Ci0JLyoqCi0JICogV2UgY2FuIG1hcmsgdGhpcyB2b2xhdGlsZSBhbmQgbm90IHN5bmNocm9uaXplIHRoZSByZWFkIG1ldGhvZHMgYmVjYXVzZQotCSAqIHdlIG5ldmVyIGNoYW5nZSB0aGUgPGVtPmNvbnRlbnRzPC9lbT4gb2YgdGhlIGFycmF5LgotCSAqLwotCXByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIExbXSBsaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdGVuZXIgbGlzdCBmb3IgbGlzdGVuZXJzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgTGlzdGVuZXJMaXN0KENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmJ1aWxkTGlzdGVuZXJBcnJheShsaXN0ZW5lckNsYXNzLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0ZW5lciBsaXN0IGZvciBsaXN0ZW5lcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0ZW5lckxpc3QoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmJ1aWxkTGlzdGVuZXJBcnJheShsaXN0ZW5lckNsYXNzLCAxKTsKLQkJdGhpcy5saXN0ZW5lcnNbMF0gPSBsaXN0ZW5lcjsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExbXSBidWlsZExpc3RlbmVyQXJyYXkoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gKExbXSkgQXJyYXkubmV3SW5zdGFuY2UobGlzdGVuZXJDbGFzcywgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8TD4gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8TD4odGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVycy5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3RlbmVyIGxpc3QgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lcnMubGVuZ3RoID09IDA7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gdGhlIGxpc3RlbmVyIGxpc3QuCi0JICogRHVwbGljYXRlIGxpc3RlbmVycyBhcmUgbm90IGFsbG93ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChMIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoQXJyYXlUb29scy5jb250YWlucyh0aGlzLmxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkdXBsaWNhdGUgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMuYWRkKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgZnJvbSB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKiBSZW1vdmluZyBhIGxpc3RlbmVyIHRoYXQgaXMgbm90IG9uIHRoZSBsaXN0IGlzIG5vdCBhbGxvd2VkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoTCBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHRoaXMubGlzdGVuZXJzLCBsaXN0ZW5lcik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5yZWdpc3RlcmVkIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5saXN0ZW5lcnMgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRBdEluZGV4KHRoaXMubGlzdGVuZXJzLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIGxpc3RlbmVyIGxpc3QuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMuY2xlYXIodGhpcy5saXN0ZW5lcnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiBsaXN0ZW5lcnMgaGVsZCBieSB0aGUgbGlzdGVuZXIgbGlzdC4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ2xhc3M8TD4gZ2V0TGlzdGVuZXJUeXBlKCkgewotCQlyZXR1cm4gKENsYXNzPEw+KSB0aGlzLmxpc3RlbmVycy5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gQXJyYXlzLnRvU3RyaW5nKHRoaXMubGlzdGVuZXJzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VyaWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTaWxlbnRseSBkcm9wIGFueSBub24tc2VyaWFsaXphYmxlIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlT2JqZWN0KE9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyB3cml0ZSBvdXQgYW55IGhpZGRlbiBzdHVmZgotCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlDbGFzczxMPiBsaXN0ZW5lckNsYXNzID0gKENsYXNzPEw+KSB0aGlzLmxpc3RlbmVycy5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKTsKLQkJcy53cml0ZU9iamVjdChsaXN0ZW5lckNsYXNzKTsKLQotCQkvLyBvbmx5IHdyaXRlIG91dCBzZXJpYWxpemFibGUgbGlzdGVuZXJzCi0JCWZvciAoTCBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJzKSB7Ci0JCQlpZiAobGlzdGVuZXIgaW5zdGFuY2VvZiBTZXJpYWxpemFibGUpIHsKLQkJCQlzLndyaXRlT2JqZWN0KGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCXMud3JpdGVPYmplY3QobnVsbCk7Ci0gICAgfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQotCQlDbGFzczxMPiBsaXN0ZW5lckNsYXNzID0gKENsYXNzPEw+KSBzLnJlYWRPYmplY3QoKTsKLQkJdGhpcy5saXN0ZW5lcnMgPSB0aGlzLmJ1aWxkTGlzdGVuZXJBcnJheShsaXN0ZW5lckNsYXNzLCAwKTsKLQkJT2JqZWN0IG87Ci0JCXdoaWxlICgobyA9IHMucmVhZE9iamVjdCgpKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmxpc3RlbmVycyA9IEFycmF5VG9vbHMuYWRkKHRoaXMubGlzdGVuZXJzLCAoTCkgbyk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05hbWVUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTmFtZVRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2YxZWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTmFtZVRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLkludHJvc3BlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi0vKioKLSAqIFZhcmlvdXMgaGVscGVyIG1ldGhvZHMgZm9yIGdlbmVyYXRpbmcgbmFtZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOYW1lVG9vbHMgewotCi0JLyoqCi0JICogR2l2ZW4gYSAicm9vdCIgbmFtZSBhbmQgYSBzZXQgb2YgZXhpc3RpbmcgbmFtZXMsIGdlbmVyYXRlIGEgdW5pcXVlCi0JICogbmFtZSB0aGF0IGlzIGVpdGhlciB0aGUgInJvb3QiIG5hbWUgb3Igc29tZSB2YXJpYXRpb24gb24gdGhlICJyb290IgotCSAqIG5hbWUgKGUuZy4gInJvb3QyIiwgInJvb3QzIiwuLi4pLiBUaGUgbmFtZXMgYXJlIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIEl0ZXJhdG9yPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgQ29sbGVjdGlvblRvb2xzLnNldChleGlzdGluZ05hbWVzKSk7Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBjYXNlLXNlbnNpdGl2ZQotCSAqIChpLmUuICJSb290IiBhbmQgInJvb3QiIGFyZSBib3RoIGFsbG93ZWQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3IoU3RyaW5nIHJvb3ROYW1lLCBDb2xsZWN0aW9uPFN0cmluZz4gZXhpc3RpbmdOYW1lcykgewotCQlyZXR1cm4gdW5pcXVlTmFtZUZvcihyb290TmFtZSwgZXhpc3RpbmdOYW1lcywgcm9vdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIGEgInJvb3QiIG5hbWUgYW5kIGEgc2V0IG9mIGV4aXN0aW5nIG5hbWVzLCBnZW5lcmF0ZSBhIHVuaXF1ZQotCSAqIG5hbWUgdGhhdCBpcyBlaXRoZXIgdGhlICJyb290IiBuYW1lIG9yIHNvbWUgdmFyaWF0aW9uIG9uIHRoZSAicm9vdCIKLQkgKiBuYW1lIChlLmcuICJyb290MiIsICJyb290MyIsLi4uKS4gVGhlIG5hbWVzIGFyZSBOT1QgY2FzZS1zZW5zaXRpdmUKLQkgKiAoaS5lLiAiUm9vdCIgYW5kICJyb290IiBhcmUgTk9UIGJvdGggYWxsb3dlZCkuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoU3RyaW5nIHJvb3ROYW1lLCBJdGVyYXRvcjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKHJvb3ROYW1lLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGV4aXN0aW5nTmFtZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBHaXZlbiBhICJyb290IiBuYW1lIGFuZCBhIHNldCBvZiBleGlzdGluZyBuYW1lcywgZ2VuZXJhdGUgYSB1bmlxdWUKLQkgKiBuYW1lIHRoYXQgaXMgZWl0aGVyIHRoZSAicm9vdCIgbmFtZSBvciBzb21lIHZhcmlhdGlvbiBvbiB0aGUgInJvb3QiCi0JICogbmFtZSAoZS5nLiAicm9vdDIiLCAicm9vdDMiLC4uLikuIFRoZSBuYW1lcyBhcmUgTk9UIGNhc2Utc2Vuc2l0aXZlCi0JICogKGkuZS4gIlJvb3QiIGFuZCAicm9vdCIgYXJlIE5PVCBib3RoIGFsbG93ZWQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKFN0cmluZyByb290TmFtZSwgQ29sbGVjdGlvbjxTdHJpbmc+IGV4aXN0aW5nTmFtZXMpIHsKLQkJcmV0dXJuIHVuaXF1ZU5hbWVGb3Iocm9vdE5hbWUsIGNvbnZlcnRUb0xvd2VyQ2FzZShleGlzdGluZ05hbWVzKSwgcm9vdE5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogdXNlIHRoZSBzdWZmaXhlZCAidGVtcGxhdGUiIG5hbWUgdG8gcGVyZm9ybSB0aGUgY29tcGFyaXNvbnMsIGJ1dCBSRVRVUk4KLQkgKiB0aGUgc3VmZml4ZWQgInJvb3QiIG5hbWU7IHRoaXMgYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMKLQkgKiAoaS5lLiB0aGUgInRlbXBsYXRlIiBuYW1lIGhhcyBiZWVuIG1vcnBoZWQgdG8gdGhlIHNhbWUgY2FzZSBhcwotCSAqIHRoZSAiZXhpc3RpbmciIG5hbWVzLCB3aGlsZSB0aGUgInJvb3QiIG5hbWUgaGFzIG5vdCwgYnV0IHRoZSAicm9vdCIgbmFtZQotCSAqIGlzIHdoYXQgdGhlIGNsaWVudCB3YW50cyBtb3JwaGVkIHRvIGJlIHVuaXF1ZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdW5pcXVlTmFtZUZvcihTdHJpbmcgcm9vdE5hbWUsIENvbGxlY3Rpb248U3RyaW5nPiBleGlzdGluZ05hbWVzLCBTdHJpbmcgdGVtcGxhdGVOYW1lKSB7Ci0JCWlmICggISBleGlzdGluZ05hbWVzLmNvbnRhaW5zKHRlbXBsYXRlTmFtZSkpIHsKLQkJCXJldHVybiByb290TmFtZTsKLQkJfQotCQlTdHJpbmcgdW5pcXVlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJZm9yIChpbnQgc3VmZml4ID0gMjsgdHJ1ZTsgc3VmZml4KyspIHsKLQkJCWlmICggISBleGlzdGluZ05hbWVzLmNvbnRhaW5zKHVuaXF1ZU5hbWUgKyBzdWZmaXgpKSB7Ci0JCQkJcmV0dXJuIHJvb3ROYW1lLmNvbmNhdChTdHJpbmcudmFsdWVPZihzdWZmaXgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHN0cmluZ3MgdG8gYSBjb2xsZWN0aW9uIG9mIHRoZSBzYW1lCi0JICogc3RyaW5ncyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBIYXNoU2V0PFN0cmluZz4gY29udmVydFRvTG93ZXJDYXNlKENvbGxlY3Rpb248U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHN0cmluZ3Muc2l6ZSgpKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogc3RyaW5ncykgewotCQkJcmVzdWx0LmFkZChzdHJpbmcudG9Mb3dlckNhc2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdC4KLQkgKiBWYXJpYXRpb25zOgotCSAqICAgICBjYXRhbG9nLnNjaGVtYS5uYW1lCi0JICogICAgIGNhdGFsb2cuLm5hbWUKLQkgKiAgICAgc2NoZW1hLm5hbWUKLQkgKiAgICAgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKFN0cmluZyBjYXRhbG9nLCBTdHJpbmcgc2NoZW1hLCBTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGNhdGFsb2cgPT0gbnVsbCkgJiYgKHNjaGVtYSA9PSBudWxsKSkgewotCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJaWYgKGNhdGFsb2cgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKGNhdGFsb2cpOwotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQoc2NoZW1hKTsKLQkJfQotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKG5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2V0IG9mIHJlc2VydmVkIHdvcmRzIGluIHRoZSBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFfUkVTRVJWRURfV09SRFMgPSBuZXcgU3RyaW5nW10gewotCQkJCSJhYnN0cmFjdCIsCi0JCQkJImFzc2VydCIsICAvLyBqZGsgMS40Ci0JCQkJImJvb2xlYW4iLAotCQkJCSJicmVhayIsCi0JCQkJImJ5dGUiLAotCQkJCSJjYXNlIiwKLQkJCQkiY2F0Y2giLAotCQkJCSJjaGFyIiwKLQkJCQkiY2xhc3MiLAotCQkJCSJjb25zdCIsICAvLyB1bnVzZWQKLQkJCQkiY29udGludWUiLAotCQkJCSJkZWZhdWx0IiwKLQkJCQkiZG8iLAotCQkJCSJkb3VibGUiLAotCQkJCSJlbHNlIiwKLQkJCQkiZW51bSIsICAvLyBqZGsgMS41Ci0JCQkJImV4dGVuZHMiLAotCQkJCSJmYWxzZSIsCi0JCQkJImZpbmFsIiwKLQkJCQkiZmluYWxseSIsCi0JCQkJImZsb2F0IiwKLQkJCQkiZm9yIiwKLQkJCQkiZ290byIsICAvLyB1bnVzZWQKLQkJCQkiaWYiLAotCQkJCSJpbXBsZW1lbnRzIiwKLQkJCQkiaW1wb3J0IiwKLQkJCQkiaW5zdGFuY2VvZiIsCi0JCQkJImludCIsCi0JCQkJImludGVyZmFjZSIsCi0JCQkJImxvbmciLAotCQkJCSJuYXRpdmUiLAotCQkJCSJuZXciLAotCQkJCSJudWxsIiwKLQkJCQkicGFja2FnZSIsCi0JCQkJInByaXZhdGUiLAotCQkJCSJwcm90ZWN0ZWQiLAotCQkJCSJwdWJsaWMiLAotCQkJCSJyZXR1cm4iLAotCQkJCSJzaG9ydCIsCi0JCQkJInN0YXRpYyIsCi0JCQkJInN0cmljdGZwIiwgIC8vIGpkayAxLjIKLQkJCQkic3VwZXIiLAotCQkJCSJzd2l0Y2giLAotCQkJCSJzeW5jaHJvbml6ZWQiLAotCQkJCSJ0aGlzIiwKLQkJCQkidGhyb3ciLAotCQkJCSJ0aHJvd3MiLAotCQkJCSJ0cmFuc2llbnQiLAotCQkJCSJ0cnVlIiwKLQkJCQkidHJ5IiwKLQkJCQkidm9pZCIsCi0JCQkJInZvbGF0aWxlIiwKLQkJCQkid2hpbGUiCi0JCQl9OwotCi0JLyoqCi0JICogVGhlIHNldCBvZiByZXNlcnZlZCB3b3JkcyBpbiB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZS4KLQkgKiBUaGVzZSB3b3JkcyBjYW5ub3QgYmUgdXNlZCBhcyBpZGVudGlmaWVycyAoaS5lLiBuYW1lcykuCi0JICogaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2Jvb2tzL3R1dG9yaWFsL2phdmEvbnV0c2FuZGJvbHRzL19rZXl3b3Jkcy5odG1sCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTb3J0ZWRTZXQ8U3RyaW5nPiBKQVZBX1JFU0VSVkVEX1dPUkRTX1NFVCA9IAotCQlDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQoQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldChKQVZBX1JFU0VSVkVEX1dPUkRTKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiBKYXZhIHByb2dyYW1taW5nIGxhbmd1YWdlIHJlc2VydmVkIHdvcmRzLgotCSAqIFRoZXNlIHdvcmRzIGNhbm5vdCBiZSB1c2VkIGFzIGlkZW50aWZpZXJzIChpLmUuIG5hbWVzKS4KLQkgKiBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvdHV0b3JpYWwvamF2YS9udXRzYW5kYm9sdHMvX2tleXdvcmRzLmh0bWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gamF2YVJlc2VydmVkV29yZHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBVkFfUkVTRVJWRURfV09SRFMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGNvbnNpc3RzIG9mIEphdmEgaWRlbnRpZmllcgotCSAqIGNoYXJhY3RlcnMgKGJ1dCBtYXkgYmUgYSByZXNlcnZlZCB3b3JkKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVycyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzXyhzdHJpbmcudG9DaGFyQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgY29uc2lzdHMgb2YgSmF2YSBpZGVudGlmaWVyCi0JICogY2hhcmFjdGVycyAoYnV0IG1heSBiZSBhIHJlc2VydmVkIHdvcmQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzKGNoYXJbXSBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdDb25zaXN0c09mSmF2YUlkZW50aWZpZXJDaGFyYWN0ZXJzXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgc3RyaW5nIG11c3Qgbm90IGJlIGVtcHR5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nQ29uc2lzdHNPZkphdmFJZGVudGlmaWVyQ2hhcmFjdGVyc18oY2hhcltdIHN0cmluZykgewotCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChzdHJpbmdbMF0pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHN0cmluZy5sZW5ndGg7IGktLSA+IDE7ICkgeyAgLy8gTkI6IGVuZCB3aXRoIDEKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoc3RyaW5nW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoc3RyaW5nKQotCQkJCSYmICEgSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMoc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBhIHZhbGlkIEphdmEgaWRlbnRpZmllci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0NvbnNpc3RzT2ZKYXZhSWRlbnRpZmllckNoYXJhY3RlcnMoc3RyaW5nKQotCQkJCSYmICEgSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMobmV3IFN0cmluZyhzdHJpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIGEgdmFsaWQgSmF2YSBpZGVudGlmaWVyCi0JICogYnkgc3Vic3RpdHV0aW5nIGFuIHVuZGVyc2NvcmUgJ18nIGZvciBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzCi0JICogaW4gdGhlIHN0cmluZyBhbmQgYXBwZW5kaW5nIGFuIHVuZGVyc2NvcmUgJ18nIHRvIHRoZSBzdHJpbmcgaWYKLQkgKiBpdCBpcyBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihzdHJpbmcsICdfJyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kLCBpZiBuZWNlc3NhcnksIGFwcGVuZGluZyB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIHRvIHRoZSBzdHJpbmcgdW50aWwgaXQgaXMgbm90IGEgSmF2YSByZXNlcnZlZCB3b3JkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKEpBVkFfUkVTRVJWRURfV09SRFNfU0VULmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCS8vIGEgcmVzZXJ2ZWQgd29yZCBpcyBhIHZhbGlkIGlkZW50aWZpZXIsIHdlIGp1c3QgbmVlZCB0byB0d2VhayBpdCBhIGJpdAotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoc3RyaW5nICsgYywgYyk7Ci0JCX0KLQkJY2hhcltdIGFycmF5ID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcl8oYXJyYXksIGMpID8gbmV3IFN0cmluZyhhcnJheSkgOiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byBhIHZhbGlkIEphdmEgaWRlbnRpZmllcgotCSAqIGJ5IHN1YnN0aXR1dGluZyBhbiB1bmRlcnNjb3JlICdfJyBmb3IgYW55IGludmFsaWQgY2hhcmFjdGVycwotCSAqIGluIHRoZSBzdHJpbmcgYW5kIGFwcGVuZGluZyBhbiB1bmRlcnNjb3JlICdfJyB0byB0aGUgc3RyaW5nIGlmCi0JICogaXQgaXMgYSBKYXZhIHJlc2VydmVkIHdvcmQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvSmF2YUlkZW50aWZpZXIoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gY29udmVydFRvSmF2YUlkZW50aWZpZXIoc3RyaW5nLCAnXycpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIKLQkgKiBieSBzdWJzdGl0dXRpbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgZm9yIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKLQkgKiBpbiB0aGUgc3RyaW5nIGFuZCwgaWYgbmVjZXNzYXJ5LCBhcHBlbmRpbmcgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiB0byB0aGUgc3RyaW5nIHVudGlsIGl0IGlzIG5vdCBhIEphdmEgcmVzZXJ2ZWQgd29yZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoSkFWQV9SRVNFUlZFRF9XT1JEU19TRVQuY29udGFpbnMobmV3IFN0cmluZyhzdHJpbmcpKSkgewotCQkJLy8gYSByZXNlcnZlZCB3b3JkIGlzIGEgdmFsaWQgaWRlbnRpZmllciwgd2UganVzdCBuZWVkIHRvIHR3ZWFrIGl0IGEgYml0Ci0JCQljaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjKTsKLQkJCXJldHVybiBjb252ZXJ0VG9KYXZhSWRlbnRpZmllcihBcnJheVRvb2xzLmFkZChzdHJpbmcsIGMpLCBjKTsKLQkJfQotCQljb252ZXJ0VG9KYXZhSWRlbnRpZmllcl8oc3RyaW5nLCBjKTsKLQkJcmV0dXJuIHN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHN0cmluZyBtdXN0IG5vdCBiZSBlbXB0eS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RyaW5nIHdhcyBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbnZlcnRUb0phdmFJZGVudGlmaWVyXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJYm9vbGVhbiBtb2QgPSBmYWxzZTsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoc3RyaW5nWzBdKSkgewotCQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCQkJc3RyaW5nWzBdID0gYzsKLQkJCW1vZCA9IHRydWU7Ci0JCX0KLQkJY2hlY2tDaGFySXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JCWZvciAoaW50IGkgPSBzdHJpbmcubGVuZ3RoOyBpLS0gPiAxOyApIHsgIC8vIE5COiBlbmQgd2l0aCAxCi0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KHN0cmluZ1tpXSkpIHsKLQkJCQlzdHJpbmdbaV0gPSBjOwotCQkJCW1vZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrQ2hhcklzSmF2YUlkZW50aWZpZXJTdGFydChjaGFyIGMpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoYykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgSmF2YSBpZGVudGlmaWVyIHN0YXJ0IGNoYXI6ICciICsgYyArICdcJycpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NoYXJJc0phdmFJZGVudGlmaWVyUGFydChjaGFyIGMpIHsKLQkJaWYgKCAhIENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBKYXZhIGlkZW50aWZpZXIgcGFydCBjaGFyOiAnIiArIGMgKyAnXCcnKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBtZXRob2QgbmFtZSB0byBhIHByb3BlcnR5IG5hbWUuCi0JICogQHNlZSBJbnRyb3NwZWN0b3IjZGVjYXBpdGFsaXplKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0R2V0dGVyU2V0dGVyTWV0aG9kTmFtZVRvUHJvcGVydHlOYW1lKFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCWludCBiZWdpbkluZGV4ID0gMDsKLQkJaWYgKG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiZ2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYmVnaW5JbmRleCA9IDM7Ci0JCX0gZWxzZSBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJzZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQliZWdpbkluZGV4ID0gMzsKLQkJfSBlbHNlIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImlzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJYmVnaW5JbmRleCA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbWV0aG9kTmFtZTsgIC8vIHJldHVybiBtZXRob2QgbmFtZSB1bmNoYW5nZWQ/Ci0JCX0KLQkJcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUobWV0aG9kTmFtZS5zdWJzdHJpbmcoYmVnaW5JbmRleCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTmFtZVRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbkVtcHR5U3RyaW5nRmlsdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob25FbXB0eVN0cmluZ0ZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFjNGJjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbkVtcHR5U3RyaW5nRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciBhY2NlcHRzIG9ubHkgbm9uLTxjb2RlPm51bGw8L2NvZGU+LCBub24tZW1wdHksCi0gKiBub24td2hpdGVzcGFjZS1vbmx5IHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25FbXB0eVN0cmluZ0ZpbHRlcgotCWltcGxlbWVudHMgRmlsdGVyPFN0cmluZz4sIFNlcmlhbGl6YWJsZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyPFN0cmluZz4gSU5TVEFOQ0UgPSBuZXcgTm9uRW1wdHlTdHJpbmdGaWx0ZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgRmlsdGVyPFN0cmluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JcHJpdmF0ZSBOb25FbXB0eVN0cmluZ0ZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyBhY2NlcHQgb25seSBub24tbnVsbCBvYmplY3RzCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkoc3RyaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5NzQ5Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob25OdWxsQm9vbGVhblRyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotLyoqCi0gKiBBIDxjb2RlPk5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXI8L2NvZGU+IHdpbGwgdHJhbnNmb3JtIGEgcG9zc2libHktbnVsbAotICoge0BsaW5rIEJvb2xlYW59IHRvIGEgbm9uLW51bGwge0BsaW5rIEJvb2xlYW59Ojx1bD4KLSAqIDxsaT5XaGVuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gaXMgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LAotICogdGhlIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIGl0IHVuY2hhbmdlZC4KLSAqIDxsaT5XaGVuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gaXMgPGNvZGU+bnVsbDwvY29kZT4sCi0gKiB0aGUgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gaXRzIGNsaWVudC1zcGVjaWZpZWQgIm51bGwgdmFsdWUiCi0gKiAoe0BsaW5rIEJvb2xlYW4jVFJVRX0gb3Ige0BsaW5rIEJvb2xlYW4jRkFMU0V9KS4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb25OdWxsQm9vbGVhblRyYW5zZm9ybWVyCi0JaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPgotewotCS8vIG5vdCBudWxsCi0JcHJpdmF0ZSBmaW5hbCBCb29sZWFuIG51bGxWYWx1ZTsKLQotCS8qKgotCSAqIEEge0BsaW5rIFRyYW5zZm9ybWVyfSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gd2hlbgotCSAqIGl0IGlzIG5vbi08Y29kZT5udWxsPC9jb2RlPjsgb3RoZXJ3aXNlIHRoZSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHdpbGwgcmV0dXJuCi0JICoge0BsaW5rIEJvb2xlYW4jVFJVRX0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiBUUlVFID0gbmV3IE5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIoQm9vbGVhbi5UUlVFKTsKLQotCS8qKgotCSAqIEEge0BsaW5rIFRyYW5zZm9ybWVyfSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBvcmlnaW5hbCB7QGxpbmsgQm9vbGVhbn0gd2hlbgotCSAqIGl0IGlzIG5vbi08Y29kZT5udWxsPC9jb2RlPjsgb3RoZXJ3aXNlIHRoZSB7QGxpbmsgVHJhbnNmb3JtZXJ9IHdpbGwgcmV0dXJuCi0JICoge0BsaW5rIEJvb2xlYW4jRkFMU0V9LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gRkFMU0UgPSBuZXcgTm9uTnVsbEJvb2xlYW5UcmFuc2Zvcm1lcihCb29sZWFuLkZBTFNFKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHRyYW5zZm9ybWVyIHRoYXQgd2lsbCByZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBpZiB0aGUgb3JpZ2luYWwKLQkgKiB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4gVGhyb3cgYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb259IGlmIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gdmFsdWVPZihCb29sZWFuIGIpIHsKLQkJcmV0dXJuIHZhbHVlT2YoYi5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgdHJhbnNmb3JtZXIgdGhhdCB3aWxsIHJldHVybiB0aGUge0BsaW5rIEJvb2xlYW59IGNvcnJlc3BvbmRpbmcKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gdmFsdWVPZihib29sZWFuIGIpIHsKLQkJcmV0dXJuIGIgPyBUUlVFIDogRkFMU0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIG9ubHkgMiBjb25zdGFudCB2ZXJzaW9ucy4KLQkgKi8KLQlwcml2YXRlIE5vbk51bGxCb29sZWFuVHJhbnNmb3JtZXIoQm9vbGVhbiBudWxsVmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG51bGxWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLm51bGxWYWx1ZSA9IG51bGxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiB0cmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiAhPSBudWxsKSA/IGIgOiB0aGlzLm51bGxWYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm51bGxWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob3RCb29sZWFuVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vdEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjM0YWM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL05vdEJvb2xlYW5UcmFuc2Zvcm1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogQSA8Y29kZT5Ob3RCb29sZWFuVHJhbnNmb3JtZXI8L2NvZGU+IHdpbGwgdHJhbnNmb3JtIGEKLSAqIHtAbGluayBCb29sZWFufSB0byBpdHMgTk9UIHZhbHVlOjx1bD4KLSAqIDxsaT5JZiB0aGUgb3JpZ2luYWwge0BsaW5rIEJvb2xlYW59IGlzIHtAbGluayBCb29sZWFuI1RSVUV9LAotICogdGhlIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIHtAbGluayBCb29sZWFuI0ZBTFNFfS4KLSAqIDxsaT5JZiB0aGUgb3JpZ2luYWwge0BsaW5rIEJvb2xlYW59IGlzIHtAbGluayBCb29sZWFuI0ZBTFNFfSwKLSAqIHRoZSB0cmFuc2Zvcm1lciB3aWxsIHJldHVybiB7QGxpbmsgQm9vbGVhbiNUUlVFfS4KLSAqIDxsaT5JZiB0aGUgb3JpZ2luYWwge0BsaW5rIEJvb2xlYW59IGlzIDxjb2RlPm51bGw8L2NvZGU+LAotICogdGhlIHRyYW5zZm9ybWVyIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIE5vdEJvb2xlYW5UcmFuc2Zvcm1lcgotCWltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPEJvb2xlYW4sIEJvb2xlYW4+Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCaWRpVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQm9vbGVhbj4gSU5TVEFOQ0UgPSBuZXcgTm90Qm9vbGVhblRyYW5zZm9ybWVyKCk7Ci0KLQlwdWJsaWMgc3RhdGljIEJpZGlUcmFuc2Zvcm1lcjxCb29sZWFuLCBCb29sZWFuPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIE5vdEJvb2xlYW5UcmFuc2Zvcm1lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiB0cmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuVG9vbHMubm90KGIpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIHJldmVyc2VUcmFuc2Zvcm0oQm9vbGVhbiBiKSB7Ci0JCXJldHVybiAoYiA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuVG9vbHMubm90KGIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZTI3ZTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTm90TnVsbEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci0KLS8qKgotICogVGhpcyBmaWx0ZXIgYWNjZXB0cyBvbmx5IG5vbi1udWxsIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOb3ROdWxsRmlsdGVyPFQ+Ci0JaW1wbGVtZW50cyBGaWx0ZXI8VD4sIFNlcmlhbGl6YWJsZQotewotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWx0ZXIgSU5TVEFOQ0UgPSBuZXcgTm90TnVsbEZpbHRlcigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8Uj4gRmlsdGVyPFI+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCXByaXZhdGUgTm90TnVsbEZpbHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyBhY2NlcHQgb25seSBub24tbnVsbCBvYmplY3RzCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gbyAhPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvTnVsbExpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2NTkzZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9OdWxsTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSAibnVsbCIgbGlzdCBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBhbiAiZW1wdHkiIGxpc3Q6IGl0IGFsbG93cyBjbGllbnRzIHRvCi0gKiBhZGQvcmVtb3ZlIGVsZW1lbnRzIHRvL2Zyb20gaXQgYnV0IG5ldmVyIGNoYW5nZXMuIFRoaXMgaXMgdXNlZnVsCi0gKiBmb3IgcGFzc2luZyB0byBtZXRob2RzIHRoYXQgcmVxdWlyZSBhICJjb2xsZWN0aW5nIHBhcmFtZXRlciIgYnV0IHRoZQotICogY2xpZW50IHdpbGwgaWdub3JlIHRoZSByZXN1bHRpbmcgImNvbGxlY3Rpb24iLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbExpc3Q8RT4KLQlpbXBsZW1lbnRzIExpc3Q8RT4sIFNlcmlhbGl6YWJsZQotewotCS8vIHNpbmdsZXRvbgotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTnVsbExpc3QgSU5TVEFOQ0UgPSBuZXcgTnVsbExpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPEU+IExpc3Q8RT4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTnVsbExpc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQkvLyBpZ25vcmUKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJLy8gaWdub3JlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gYy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBsYXN0SW5kZXhPZihPYmplY3QgbykgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIGxpc3QgZGlkIG5vdCBjaGFuZ2UKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vIHRoZSBsaXN0IGRpZCBub3QgY2hhbmdlCi0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gZmFsc2U7ICAvLyB0aGUgbGlzdCBkaWQgbm90IGNoYW5nZQotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiBFTVBUWV9PQkpFQ1RfQVJSQVk7Ci0JfQotCi0JcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotCQlyZXR1cm4gYTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1F1ZXVlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9RdWV1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQ2YmJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1F1ZXVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBkZWZpbmluZyB0aGUgY2xhc3NpYyBxdWV1ZSBiZWhhdmlvciwKLSAqIHdpdGhvdXQgdGhlIGJhY2tkb29ycyBhbGxvd2VkIGJ5IHtAbGluayBqYXZhLnV0aWwuUXVldWV9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBieSB0aGUgcXVldWUKLSAqLwotcHVibGljIGludGVyZmFjZSBRdWV1ZTxFPiB7Ci0KLQkvKioKLQkgKiAiRW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZS4KLQkgKi8KLQl2b2lkIGVucXVldWUoRSBvKTsKLQotCS8qKgotCSAqICJEZXF1ZXVlIiBhbiBpdGVtIGZyb20gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLgotCSAqLwotCUUgZGVxdWV1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtIG9uIHRoZSBoZWFkIG9mIHRoZSBxdWV1ZQotCSAqIHdpdGhvdXQgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgcXVldWUuCi0JICovCi0JRSBwZWVrKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcXVldWUgaXMgZW1wdHkuCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLQotCWZpbmFsIGNsYXNzIEVtcHR5PEU+Ci0JCWltcGxlbWVudHMgUXVldWU8RT4sIFNlcmlhbGl6YWJsZQotCXsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBRdWV1ZSBJTlNUQU5DRSA9IG5ldyBFbXB0eSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8VD4gUXVldWU8VD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEVtcHR5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBlbnF1ZXVlKEUgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgZGVxdWV1ZSgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcGVlaygpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY2MDQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgc2ltcGxlIGNvbnRhaW5lciBjbGFzcyBzaW1wbHkgcHV0cyBhIGJpdCBvZiBzZW1hbnRpY3MKLSAqIGFyb3VuZCBhIHBhaXIgb2YgbnVtYmVycy4KLSAqLwotcHVibGljIGNsYXNzIFJhbmdlCi0JaW1wbGVtZW50cyBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBUaGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHJhbmdlLiAqLwotCXB1YmxpYyBmaW5hbCBpbnQgc3RhcnQ7Ci0KLQkvKiogVGhlIGVuZGluZyBpbmRleCBvZiB0aGUgcmFuZ2UuICovCi0JcHVibGljIGZpbmFsIGludCBlbmQ7Ci0KLQkvKioKLQkgKiBUaGUgc2l6ZSBjYW4gYmUgbmVnYXRpdmUgaWYgdGhlIGVuZGluZyBpbmRleAotCSAqIGlzIGxlc3MgdGhhbiB0aGUgc3RhcnRpbmcgaW5kZXguCi0JICovCi0JcHVibGljIGZpbmFsIGludCBzaXplOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnQgYW5kIGVuZCwKLQkgKiBib3RoIG9mIHdoaWNoIGFyZSBpbW11dGFibGUuCi0JICovCi0JcHVibGljIFJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCXRoaXMuZW5kID0gZW5kOwotCQl0aGlzLnNpemUgPSBlbmQgLSBzdGFydCArIDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJhbmdlIGluY2x1ZGVzIHRoZSBzcGVjaWZpZWQKLQkgKiBpbmRleC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhpbnQgaW5kZXgpIHsKLQkJcmV0dXJuICh0aGlzLnN0YXJ0IDw9IGluZGV4KSAmJiAoaW5kZXggPD0gdGhpcy5lbmQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAodGhpcyA9PSBvKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBSYW5nZSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlSYW5nZSBvdGhlclJhbmdlID0gKFJhbmdlKSBvOwotCQlyZXR1cm4gKHRoaXMuc3RhcnQgPT0gb3RoZXJSYW5nZS5zdGFydCkKLQkJCSYmICh0aGlzLmVuZCA9PSBvdGhlclJhbmdlLmVuZCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RhcnQgXiB0aGlzLmVuZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmFuZ2UgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKFJhbmdlKSBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyB0aGlzLnN0YXJ0ICsgIiwgIiArIHRoaXMuZW5kICsgJ10nOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWFkT25seUJvb2xlYW5SZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JlYWRPbmx5Qm9vbGVhblJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDJjNTZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JlYWRPbmx5Qm9vbGVhblJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZvciBhIGNvbnRhaW5lciBmb3IgaG9sZGluZyBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHRoYXQgY2Fubm90IGJlCi0gKiBjaGFuZ2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlCb29sZWFuUmVmZXJlbmNlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLgotCSAqLwotCWJvb2xlYW4gZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGVxdWFsIHRvIHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGlzKGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgbm90IGVxdWFsIHRvCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGlzTm90KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMKLQkgKiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKi8KLQlib29sZWFuIGlzVHJ1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBpc0ZhbHNlKCk7Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWFkT25seUludFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmVhZE9ubHlJbnRSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlNTE1NC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZWFkT25seUludFJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgYSBjb250YWluZXIgZm9yIGhvbGRpbmcgYW4gPGNvZGU+aW50PC9jb2RlPiB0aGF0IGNhbm5vdCBiZQotICogY2hhbmdlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5SW50UmVmZXJlbmNlCi0JZXh0ZW5kcyBDb21wYXJhYmxlPFJlYWRPbmx5SW50UmVmZXJlbmNlPgotewotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlLgotCSAqLwotCWludCBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBlcXVhbCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBub3QgZXF1YWwgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gbm90RXF1YWwoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyB6ZXJvLgotCSAqLwotCWJvb2xlYW4gaXNaZXJvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIG5vdCB6ZXJvLgotCSAqLwotCWJvb2xlYW4gaXNOb3RaZXJvKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbgotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBpc0dyZWF0ZXJUaGFuKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgZ3JlYXRlciB0aGFuCi0JICogb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGlzR3JlYXRlclRoYW5PckVxdWFsKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgbGVzcyB0aGFuCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGlzTGVzc1RoYW4oaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBsZXNzIHRoYW4KLQkgKiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWJvb2xlYW4gaXNMZXNzVGhhbk9yRXF1YWwoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBwb3NpdGl2ZS4KLQkgKi8KLQlib29sZWFuIGlzUG9zaXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgaXMgbm90IHBvc2l0aXZlCi0JICogKGkuZS4gbmVnYXRpdmUgb3IgemVybykuCi0JICovCi0JYm9vbGVhbiBpc05vdFBvc2l0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGlzIG5lZ2F0aXZlLgotCSAqLwotCWJvb2xlYW4gaXNOZWdhdGl2ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBpcyBub3QgbmVnYXRpdmUKLQkgKiAoaS5lLiB6ZXJvIG9yIHBvc2l0aXZlKS4KLQkgKi8KLQlib29sZWFuIGlzTm90TmVnYXRpdmUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZS4KLQkgKi8KLQlpbnQgYWJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lZ2F0aXZlIHZhbHVlIG9mIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUuCi0JICovCi0JaW50IG5lZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgcGx1cyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWludCBhZGQoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBtaW51cyB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWludCBzdWJ0cmFjdChpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpbnQgbXVsdGlwbHkoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSBkaXZpZGVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaW50IGRpdmlkZShpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbWFpbmRlciBvZiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGRpdmlkZWQgYnkKLQkgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCWludCByZW1haW5kZXIoaW50IHYpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtaW5pbXVtIG9mIHRoZSBjdXJyZW50IDxjb2RlPmludDwvY29kZT4gdmFsdWUgYW5kCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlpbnQgbWluKGludCB2KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWF4aW11bSBvZiB0aGUgY3VycmVudCA8Y29kZT5pbnQ8L2NvZGU+IHZhbHVlIGFuZAotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JaW50IG1heChpbnQgdik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgPGNvZGU+aW50PC9jb2RlPiB2YWx1ZSByYWlzZWQgdG8gdGhlIHBvd2VyCi0JICogb2YgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlkb3VibGUgcG93KGludCB2KTsKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JlZmxlY3Rpb25Ub29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjMzYzcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUmVmbGVjdGlvblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi0vKioKLSAqIENvbnZlbmllbmNlIG1ldGhvZHMgcmVsYXRlZCB0byB0aGUgPGNvZGU+amF2YS5sYW5nLnJlZmxlY3Q8L2NvZGU+IHBhY2thZ2UuCi0gKiBUaGVzZSBtZXRob2RzIHByb3ZpZGUgc2hvcnRjdXRzIGZvciBtYW5pcHVsYXRpbmcgb2JqZWN0cyB2aWEKLSAqIHJlZmxlY3Rpb247IHBhcnRpY3VsYXJseSB3aGVuIGRlYWxpbmcgd2l0aCBmaWVsZHMgYW5kL29yIG1ldGhvZHMgdGhhdAotICogYXJlIG5vdCBwdWJsaWNseSBhY2Nlc3NpYmxlIG9yIGFyZSBpbmhlcml0ZWQuCi0gKiA8cD4KLSAqIEluIG1vc3QgY2FzZXMsIGFsbCBleGNlcHRpb25zIGFyZSBoYW5kbGVkIGFuZCB3cmFwcGVkIGluCi0gKiB7QGxpbmsgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb259czsgc28gdGhlc2UgbWV0aG9kcyBzaG91bGQKLSAqIGJlIHVzZWQgd2hlbiB0aGVyZSBzaG91bGQgYmUgbm8gcHJvYmxlbXMgdXNpbmcgcmVmbGVjdGlvbiAoaS5lLgotICogdGhlIHJlZmVyZW5jZWQgbWVtYmVycyBhcmUgcHJlc3VtYWJseSBwcmVzZW50IGV0Yy4pLgotICogPHA+Ci0gKiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBtZXRob2RzIHdob3NlIG5hbWVzCi0gKiBlbmQgd2l0aCBhbiB1bmRlcnNjb3JlLiBUaGVzZSBtZXRob2RzIGRlY2xhcmUgdGhlIGV4cGVjdGVkIGNoZWNrZWQKLSAqIGV4Y2VwdGlvbnMgKGUuZy4ge0BsaW5rIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbn0sIHtAbGluayBOb1N1Y2hGaWVsZEV4Y2VwdGlvbn0pLgotICogVGhlc2UgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBwcm9iZQotICogZm9yIG1ldGhvZHMsIGZpZWxkcywgZXRjLiB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGJ1dCBtaWdodCBub3QgYmUuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBSZWZsZWN0aW9uVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFpFUk9fUEFSQU1FVEVSX1RZUEVTID0gbmV3IENsYXNzWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gWkVST19BUkdVTUVOVFMgPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN0cmluZ1Rvb2xzLkNSOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBWT0lEX0NMQVNTID0gdm9pZC5jbGFzczsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPGphdmEubGFuZy5Wb2lkPiBWT0lEX1dSQVBQRVJfQ0xBU1MgPSBqYXZhLmxhbmcuVm9pZC5jbGFzczsKLQotCi0JLy8gKioqKioqKioqKiBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogR2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5nZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldEZpZWxkVmFsdWVfKG9iamVjdCwgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgZXgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5PYmplY3QuZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRGaWVsZFZhbHVlXyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRGaWVsZF8ob2JqZWN0LCBmaWVsZE5hbWUpLmdldChvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0U3RhdGljRmllbGRWYWx1ZV8oamF2YUNsYXNzLCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U3RhdGljRmllbGRWYWx1ZV8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRGaWVsZF8oamF2YUNsYXNzLCBmaWVsZE5hbWUpLmdldChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LnNldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCXNldEZpZWxkVmFsdWVfKG9iamVjdCwgZmllbGROYW1lLCB2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGV4KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0LCBmaWVsZCBuYW1lLCBhbmQgbmV3IHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LnNldEZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRWYWx1ZV8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IHZhbHVlKQotCQl0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24KLQl7Ci0JCWdldEZpZWxkXyhvYmplY3QsIGZpZWxkTmFtZSkuc2V0KG9iamVjdCwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFNldCBhIHN0YXRpYyBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgY2xhc3MsIGZpZWxkIG5hbWUsIGFuZCBuZXcgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5zZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCXNldFN0YXRpY0ZpZWxkVmFsdWVfKGphdmFDbGFzcywgZmllbGROYW1lLCB2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGV4KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3Muc2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgdmFsdWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRTdGF0aWNGaWVsZFZhbHVlXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCB2YWx1ZSkKLQkJdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCi0JewotCQlnZXRGaWVsZF8oamF2YUNsYXNzLCBmaWVsZE5hbWUpLnNldChudWxsLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZCBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5nZXRGaWVsZChTdHJpbmcgZmllbGROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGdldEZpZWxkKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGaWVsZF8ob2JqZWN0LCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGRlZmluZSB0aGUgZmllbGQsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmdldEZpZWxkKFN0cmluZyBmaWVsZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZ2V0RmllbGRfKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldEZpZWxkXyhvYmplY3QuZ2V0Q2xhc3MoKSwgZmllbGROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBmaWVsZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZ2V0RmllbGQoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0RmllbGRfKGphdmFDbGFzcywgZmllbGROYW1lKTsKLQkJfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgZmllbGQgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgYW5kIGZpZWxkIG5hbWUuCi0JICogSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogZGVmaW5lIHRoZSBmaWVsZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGQgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpZWxkIGdldEZpZWxkXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbgotCXsKLQkJRmllbGQgZmllbGQgPSBudWxsOwotCQl0cnkgewotCQkJZmllbGQgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZChmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQlyZXR1cm4gZ2V0RmllbGRfKHN1cGVyY2xhc3MsIGZpZWxkTmFtZSk7ICAvLyByZWN1cnNlCi0JCX0KLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIGZpZWxkOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGZpZWxkcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcyBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEFsbEZpZWxkcygpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8RmllbGQ+IGdldEFsbEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJQXJyYXlMaXN0PEZpZWxkPiBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0PEZpZWxkPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCWFkZERlY2xhcmVkRmllbGRzVG8odGVtcENsYXNzLCBmaWVsZHMpOwotCQl9Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCi0JLyoKLQkgKiBBZGQgdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERlY2xhcmVkRmllbGRzVG8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBBcnJheUxpc3Q8RmllbGQ+IGZpZWxkcykgewotCQlmb3IgKEZpZWxkIGZpZWxkIDogZ2V0RGVjbGFyZWRGaWVsZHMoamF2YUNsYXNzKSkgewotCQkJZmllbGRzLmFkZChmaWVsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGZpZWxkcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGZpZWxkcyBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEFjY2Vzc2libGVEZWNsYXJlZEZpZWxkcygpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8RmllbGQ+IGdldERlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0JCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxGaWVsZD4oZmllbGRzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+T2JqZWN0LmV4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fQVJHVU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBhcmd1bWVudC4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5leGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIGFyZ3VtZW50cy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5leGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKSB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKGdldE1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgYXJndW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIgYW5kIGFyZ3VtZW50cy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIGNhY2hlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2QoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IHJlY2VpdmVyLCBPYmplY3RbXSBhcmd1bWVudHMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBhcmd1bWVudHMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgbWV0aG9kLCBleCk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZCArIENSICsgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5leGVjdXRlKFN0cmluZyBtZXRob2ROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kXyhPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZF8ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBhcmd1bWVudC4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5leGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RfKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RfKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7YXJndW1lbnR9KTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIGFyZ3VtZW50cy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPk9iamVjdC5leGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RfKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE1ldGhvZF8ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKS5pbnZva2UocmVjZWl2ZXIsIGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgYXJndW1lbnQuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge2FyZ3VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogRXhlY3V0ZSBhIHN0YXRpYyBtZXRob2QsIGdpdmVuIHRoZSBjbGFzcywKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgYXJndW1lbnRzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQl0cnkgewotCQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50cyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSArIENSICsgZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSBjbGFzcyBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5leGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZXhlY3V0ZVN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgc3RhdGljIG1ldGhvZCwgZ2l2ZW4gdGhlIGNsYXNzLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZSwgYW5kIGFyZ3VtZW50LgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIGFyZ3VtZW50cy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmV4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0U3RhdGljTWV0aG9kXyhqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKS5pbnZva2UobnVsbCwgYXJndW1lbnRzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE1ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB7Ci0JCXJldHVybiBnZXRNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JewotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQkvLyByZWN1cnNlCi0JCQlyZXR1cm4gZ2V0TWV0aG9kXyhzdXBlcmNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0KLQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBtZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdAotCSAqIGFuZCBtZXRob2QgbmFtZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0Ci0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kXyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE1ldGhvZF8ob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0TWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0TWV0aG9kXyhPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE1ldGhvZF8ob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgewotCQlyZXR1cm4gZ2V0TWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldE1ldGhvZF8oT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRNZXRob2RfKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgemVyby1hcmd1bWVudCBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZ2V0U3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGVzfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RhdGljIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZXMuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQl0cnkgewotCQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2QgYWNjZXNzaWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRTdGF0aWNNZXRob2RfKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRTdGF0aWNNZXRob2RfKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kIGFjY2Vzc2libGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0U3RhdGljTWV0aG9kXyhDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldFN0YXRpY01ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZXN9KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZCBhY2Nlc3NpYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFN0YXRpY01ldGhvZF8oQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJTWV0aG9kIG1ldGhvZCA9IGdldE1ldGhvZF8oamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCWlmIChNb2RpZmllci5pc1N0YXRpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQlyZXR1cm4gbWV0aG9kOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hNZXRob2RFeGNlcHRpb24oYnVpbGRGdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIG1ldGhvZHMuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0QWxsTWV0aG9kcygpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8TWV0aG9kPiBnZXRBbGxNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlBcnJheUxpc3Q8TWV0aG9kPiBtZXRob2RzID0gbmV3IEFycmF5TGlzdDxNZXRob2Q+KCk7Ci0JCWZvciAoQ2xhc3M8Pz4gdGVtcENsYXNzID0gamF2YUNsYXNzOyB0ZW1wQ2xhc3MgIT0gbnVsbDsgdGVtcENsYXNzID0gdGVtcENsYXNzLmdldFN1cGVyY2xhc3MoKSkgewotCQkJYWRkRGVjbGFyZWRNZXRob2RzVG8odGVtcENsYXNzLCBtZXRob2RzKTsKLQkJfQotCQlyZXR1cm4gbWV0aG9kczsKLQl9Ci0KLQkvKgotCSAqIEFkZCB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZERlY2xhcmVkTWV0aG9kc1RvKENsYXNzPD8+IGphdmFDbGFzcywgQXJyYXlMaXN0PE1ldGhvZD4gbWV0aG9kcykgewotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiBnZXREZWNsYXJlZE1ldGhvZHMoamF2YUNsYXNzKSkgewotCQkJbWV0aG9kcy5hZGQobWV0aG9kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRBY2Nlc3NpYmxlRGVjbGFyZWRNZXRob2RzKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxNZXRob2Q+IGdldERlY2xhcmVkTWV0aG9kcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJTWV0aG9kW10gbWV0aG9kcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKTsKLQkJZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgewotCQkJbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE1ldGhvZD4obWV0aG9kcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldERlZmF1bHRDb25zdHJ1Y3RvcigpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldERlZmF1bHRDb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yKGphdmFDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IKLQkgKiBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0Q29uc3RydWN0b3IoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXRDb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0Q29uc3RydWN0b3IoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRDb25zdHJ1Y3RvcihDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXRDb25zdHJ1Y3RvcihDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRDb25zdHJ1Y3Rvcl8oamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXggKyBDUiArIGJ1aWxkRnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3RvcgotCSAqIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIE1ha2UgYW55IHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3IgYWNjZXNzaWJsZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXREZWZhdWx0Q29uc3RydWN0b3IoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBDb25zdHJ1Y3RvcjxUPiBnZXREZWZhdWx0Q29uc3RydWN0b3JfKENsYXNzPFQ+IGphdmFDbGFzcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yXyhqYXZhQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3JfKENsYXNzPFQ+IGphdmFDbGFzcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldENvbnN0cnVjdG9yXyhqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGUuCi0JICogTWFrZSBhbnkgcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvciBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldENvbnN0cnVjdG9yKENsYXNzPD8+IHBhcmFtZXRlclR5cGUpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yXyhDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUpCi0JCXRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDb25zdHJ1Y3Rvcl8oamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9yIGFjY2Vzc2libGUuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuZ2V0Q29uc3RydWN0b3IoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3JfKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCXsKLQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7Ci0JCWNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlY2xhcmVkIGNvbnN0cnVjdG9ycyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBNYWtlIGFueSBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycyBhY2Nlc3NpYmxlLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEFjY2Vzc2libGVEZWNsYXJlZENvbnN0cnVjdG9ycygpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPENvbnN0cnVjdG9yPFQ+PiBnZXREZWNsYXJlZENvbnN0cnVjdG9ycyhDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUNvbnN0cnVjdG9yPFQ+W10gY29uc3RydWN0b3JzID0gKENvbnN0cnVjdG9yPFQ+W10pIGphdmFDbGFzcy5nZXREZWNsYXJlZENvbnN0cnVjdG9ycygpOwotCQlmb3IgKENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7Ci0JCQljb25zdHJ1Y3Rvci5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxDb25zdHJ1Y3RvcjxUPj4oY29uc3RydWN0b3JzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjbGFzc05hbWUsIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjbGFzcyAod2l0aG91dCB0aGUgY2hlY2tlZCBleGNlcHRpb24pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JOYW1lKFN0cmluZyBjbGFzc05hbWUsIGJvb2xlYW4gaW5pdGlhbGl6ZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgaW5pdGlhbGl6ZSwgY2xhc3NMb2FkZXIpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjbGFzc05hbWUsIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImFycmF5IGRlcHRoIiBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5IHR5cGUuCi0JICogTm9uLWFycmF5IHR5cGVzIGhhdmUgYSBkZXB0aCBvZiB6ZXJvLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEFycmF5RGVwdGgoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBnZXRBcnJheURlcHRoKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJZGVwdGgrKzsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIEEgbm9uLWFycmF5IHR5cGUgc2ltcGx5IHJldHVybnMgaXRzZWxmLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmdldEVsZW1lbnRUeXBlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRFbGVtZW50VHlwZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWphdmFDbGFzcyA9IGphdmFDbGFzcy5nZXRDb21wb25lbnRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdyYXBwZXIgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCi0JICogcHJpbWl0aXZlIGNsYXNzLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5nZXRXcmFwcGVyQ2xhc3MoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldFdyYXBwZXJDbGFzcyhDbGFzczw/PiBwcmltaXRpdmVDbGFzcykgewotCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQlpZiAocHJpbWl0aXZlLmphdmFDbGFzcyA9PSBwcmltaXRpdmVDbGFzcykgewotCQkJCXJldHVybiBwcmltaXRpdmUud3JhcHBlckNsYXNzOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSBwcmltaXRpdmUgd3JhcHBlcgotCSAqIGNsYXNzIChpLmUuIDxjb2RlPmphdmEubGFuZy5Wb2lkPC9jb2RlPiBvciBvbmUgb2YgdGhlIHByaW1pdGl2ZQotCSAqIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywgPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+LAotCSAqIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkZsb2F0PC9jb2RlPiwgZXRjLikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuaXNQcmltaXRpdmVXcmFwcGVyKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlpZiAoamF2YUNsYXNzLmlzQXJyYXkoKSB8fCAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA+IE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSCkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJaWYgKGphdmFDbGFzcyA9PSBwcmltaXRpdmUud3JhcHBlckNsYXNzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZSB3cmFwcGVyCi0JICogY2xhc3MgKGkuZS4gPGNvZGU+amF2YS5sYW5nLkJvb2xlYW48L2NvZGU+LAotCSAqIDxjb2RlPmphdmEubGFuZy5JbnRlZ2VyPC9jb2RlPiwgPGNvZGU+amF2YS5sYW5nLkZsb2F0PC9jb2RlPiwgZXRjLiwKLQkgKiBidXQgbm90IDxjb2RlPmphdmEubGFuZy5Wb2lkPC9jb2RlPikuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGNsYXNzSXNQcmltaXRpdmVXcmFwcGVyKGphdmFDbGFzcykKLQkJCSYmIChqYXZhQ2xhc3MgIT0gVk9JRF9XUkFQUEVSX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiA8Y29kZT5ib29sZWFuPC9jb2RlPiwgPGNvZGU+aW50PC9jb2RlPiwKLQkgKiA8Y29kZT5mbG9hdDwvY29kZT4sIGV0Yy4sIGJ1dCBub3QgPGNvZGU+dm9pZDwvY29kZT4pLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IDxjb2RlPnZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlPC9jb2RlPgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLmlzVmFyaWFibGVQcmltaXRpdmUoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gamF2YUNsYXNzLmlzUHJpbWl0aXZlKCkgJiYgKGphdmFDbGFzcyAhPSBWT0lEX0NMQVNTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByaW1pdGl2ZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjb2RlCi0JICogaXMgbm90IGEgcHJpbWl0aXZlIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gZ2V0Q2xhc3NGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWl0aXZlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBjbGFzcyBjb2RlLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIGNvZGUKLQkgKiBpcyBub3QgYSBwcmltaXRpdmUgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yQ29kZShjaGFyIGNsYXNzQ29kZSkgewotCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQlpZiAocHJpbWl0aXZlLmNvZGUgPT0gY2xhc3NDb2RlKSB7Ci0JCQkJcmV0dXJuIHByaW1pdGl2ZS5qYXZhQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSBjbGFzcy4KLQkgKiBSZXR1cm4gPGNvZGU+MDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGlzIG5vdCBhIHByaW1pdGl2ZSBjbGFzcy4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXIgZ2V0Q29kZUZvckNsYXNzKENsYXNzPD8+IHByaW1pdGl2ZUNsYXNzKSB7Ci0JCWlmICgoICEgcHJpbWl0aXZlQ2xhc3MuaXNBcnJheSgpKSAmJiAocHJpbWl0aXZlQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpIDw9IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEgpKSB7Ci0JCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MgPT0gcHJpbWl0aXZlQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIHByaW1pdGl2ZS5jb2RlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zdGFudGlhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoKTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc05hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgYXJndW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgcGFyYW1ldGVyVHlwZSwgYXJndW1lbnQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlcywgYXJndW1lbnRzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIGNsYXNzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzRm9yTmFtZShjbGFzc05hbWUsIGZhbHNlLCBjbGFzc0xvYWRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgYXJndW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShjbGFzc0Zvck5hbWUoY2xhc3NOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpLCBwYXJhbWV0ZXJUeXBlLCBhcmd1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgYXJndW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NGb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZXMsIGFyZ3VtZW50cyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBjbGFzcydzIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKCk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fQVJHVU1FTlRTKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBhcmd1bWVudC4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgYXJndW1lbnQpIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge2FyZ3VtZW50fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlcyBhbmQgYXJndW1lbnRzLgotCSAqIDxwPgotCSAqIDxjb2RlPkNsYXNzLm5ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cyk8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIGFyZ3VtZW50cykgewotCQl0cnkgewotCQkJcmV0dXJuIG5ld0luc3RhbmNlXyhqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzLCBhcmd1bWVudHMpOwotCQl9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCArIENSICsgYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBleCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oYnVpbGRGdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpICsgQ1IgKyBleC5nZXRUYXJnZXRFeGNlcHRpb24oKSwgZXgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4ICsgQ1IgKyBidWlsZEZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZSgpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2VfKENsYXNzPFQ+IGphdmFDbGFzcykKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIG5ld0luc3RhbmNlXyhqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX0FSR1VNRU5UUyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgYXJndW1lbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Q2xhc3MubmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IGFyZ3VtZW50KTwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlXyhDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBhcmd1bWVudCkKLQkJdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIG5ld0luc3RhbmNlXyhqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHthcmd1bWVudH0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIGFyZ3VtZW50cy4KLQkgKiA8cD4KLQkgKiA8Y29kZT5DbGFzcy5uZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBhcmd1bWVudHMpPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2VfKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gYXJndW1lbnRzKQotCQl0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0Q29uc3RydWN0b3JfKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLm5ld0luc3RhbmNlKGFyZ3VtZW50cyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHR5cGUgZGVjbGFyYXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKQotCQl0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyh0eXBlRGVjbGFyYXRpb24sIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCwgY2xhc3NMb2FkZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotCQl0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotCXsKLQkJVHlwZURlY2xhcmF0aW9uIHRkID0gYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uKTsKLQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyh0ZC5lbGVtZW50VHlwZU5hbWUsIHRkLmFycmF5RGVwdGgsIGNsYXNzTG9hZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gYnVpbGRUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQl0eXBlRGVjbGFyYXRpb24gPSBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbik7Ci0JCWludCBhcnJheURlcHRoID0gZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uKTsKLQkJU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSA9IGdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uLCBhcnJheURlcHRoKTsKLQkJcmV0dXJuIG5ldyBUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFycmF5IGRlcHRoIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIjsgZS5nLjx1bD4KLQkgKiA8bGk+PGNvZGU+ImludFtdIjwvY29kZT4gcmV0dXJucyA8Y29kZT4xPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+MzwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBubyB3aGl0ZXNwYWNlIGluIHRoZSB0eXBlIGRlY2xhcmF0aW9uLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCWludCBsYXN0ID0gdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gMTsKLQkJaW50IGRlcHRoID0gMDsKLQkJaW50IGNsb3NlID0gbGFzdDsKLQkJd2hpbGUgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UpID09ICddJykgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UgLSAxKSA9PSAnWycpIHsKLQkJCQlkZXB0aCsrOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHR5cGUgZGVjbGFyYXRpb246ICIgKyB0eXBlRGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljbG9zZSA9IGxhc3QgLSAoZGVwdGggKiAyKTsKLQkJfQotCQlyZXR1cm4gZGVwdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IHR5cGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy48dWw+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImludCI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nW11bXVtdIjwvY29kZT4gcmV0dXJucyA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQl0eXBlRGVjbGFyYXRpb24gPSBTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbik7Ci0JCXJldHVybiBnZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbiwgZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbl8odHlwZURlY2xhcmF0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IHR5cGUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy48dWw+Ci0JICogPGxpPjxjb2RlPiJpbnRbXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImludCI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJqYXZhLmxhbmcuU3RyaW5nW11bXVtdIjwvY29kZT4gcmV0dXJucyA8Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+Ci0JICogPC91bD4KLQkgKiBVc2VmdWwgZm9yIGNsaWVudHMgdGhhdCBoYXZlIGFscmVhZHkgcXVlcmllZCB0aGUgdHlwZSBkZWNsYXJhdGlvbidzIGFycmF5IGRlcHRoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uLCBpbnQgYXJyYXlEZXB0aCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbiksIGFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IG5vIHdoaXRlc3BhY2UgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbiwgaW50IGFycmF5RGVwdGgpIHsKLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbi5zdWJzdHJpbmcoMCwgdHlwZURlY2xhcmF0aW9uLmxlbmd0aCgpIC0gKGFycmF5RGVwdGggKiAyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQlyZXR1cm4gZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkKLQkJdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oZWxlbWVudFR5cGVOYW1lLCBhcnJheURlcHRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgewotCQl0cnkgewotCQkJcmV0dXJuIGdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uXyhlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgsIGNsYXNzTG9hZGVyKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiIsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIuCi0JICovCi0JLy8gc2VlIHRoZSAiRXZhbHVhdGlvbiIgb2YgSkRLIGJ1ZyA2NDQ2NjI3IGZvciBhIGRpc2N1c3Npb24gb2YgbG9hZGluZyBjbGFzc2VzCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbl8oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKQotCQl0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotCXsKLQkJLy8gcHJpbWl0aXZlcyBjYW5ub3QgYmUgbG9hZGVkIHZpYSBDbGFzcy5mb3JOYW1lKCksCi0JCS8vIHNvIGNoZWNrIGZvciBhIHByaW1pdGl2ZSBjbGFzcyBuYW1lIGZpcnN0Ci0JCVByaW1pdGl2ZSBwY2MgPSBudWxsOwotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmxlbmd0aCgpIDw9IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEgpIHsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQkJaWYgKHByaW1pdGl2ZS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhlbGVtZW50VHlwZU5hbWUpKSB7Ci0JCQkJCXBjYyA9IHByaW1pdGl2ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiAocGNjID09IG51bGwpID8gQ2xhc3MuZm9yTmFtZShlbGVtZW50VHlwZU5hbWUsIGZhbHNlLCBjbGFzc0xvYWRlcikgOiBwY2MuamF2YUNsYXNzOwotCQl9Ci0KLQkJLy8gYXJyYXkKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7Ci0JCWZvciAoaW50IGkgPSBhcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXNiLmFwcGVuZCgnWycpOwotCQl9Ci0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJQ2xhc3NOYW1lLmFwcGVuZChlbGVtZW50VHlwZU5hbWUsIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChwY2MuY29kZSk7Ci0JCX0KLQkJcmV0dXJuIENsYXNzLmZvck5hbWUoc2IudG9TdHJpbmcoKSwgZmFsc2UsIGNsYXNzTG9hZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuPHVsPgotCSAqIDxsaT48Y29kZT4iaW50IjwvY29kZT4gcmV0dXJucyA8Y29kZT4iaW50IjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImludFtdIjwvY29kZT4gcmV0dXJucyA8Y29kZT4iW0kiPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZyI8L2NvZGU+IHJldHVybnMgPGNvZGU+ImphdmEubGFuZy5TdHJpbmciPC9jb2RlPgotCSAqIDxsaT48Y29kZT4iamF2YS5sYW5nLlN0cmluZ1tdW11bXSI8L2NvZGU+IHJldHVybnMgPGNvZGU+IltbW0xqYXZhLmxhbmcuU3RyaW5nOyI8L2NvZGU+Ci0JICogPC91bD4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgewotCQlUeXBlRGVjbGFyYXRpb24gdGQgPSBidWlsZFR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIi4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJLy8gbm9uLWFycmF5Ci0JCWlmIChhcnJheURlcHRoID09IDApIHsKLQkJCXJldHVybiBlbGVtZW50VHlwZU5hbWU7Ci0JCX0KLQotCQlpZiAoZWxlbWVudFR5cGVOYW1lLmVxdWFscyhDbGFzc05hbWUuVk9JRF9DTEFTU19OQU1FKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbignXCcnICsgQ2xhc3NOYW1lLlZPSURfQ0xBU1NfTkFNRSArICInIG11c3QgaGF2ZSBhbiBhcnJheSBkZXB0aCBvZiB6ZXJvOiAiICsgYXJyYXlEZXB0aCArICcuJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKCdbJyk7Ci0JCX0KLQotCQkvLyBsb29rIGZvciBhIHByaW1pdGl2ZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIKSB7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQkJZm9yIChQcmltaXRpdmUgcHJpbWl0aXZlIDogUFJJTUlUSVZFUykgewotCQkJCWlmIChwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudFR5cGVOYW1lKSkgewotCQkJCQlwY2MgPSBwcmltaXRpdmU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJQ2xhc3NOYW1lLmFwcGVuZChlbGVtZW50VHlwZU5hbWUsIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChwY2MuY29kZSk7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXhjZXB0aW9uIG1lc3NhZ2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKGphdmFDbGFzcywgbnVsbCwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkRnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LmdldENsYXNzKCksIGZpZWxkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gdGhpcyBjaGVjayBhbGxvd3MgdXMgdG8gdXNlIHRoaXMgY29kZSBmb3IgY29uc3RydWN0b3JzLCB3aGVyZSB0aGUgbWV0aG9kTmFtZSBpcyBudWxsCi0JCWlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQkJc2IuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbWF4ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCAhPSAtMSkgewotCQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNiLmFwcGVuZChwYXJhbWV0ZXJUeXBlc1ttYXhdLmdldE5hbWUoKSk7Ci0JCX0KLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltaXRpdmUgY29uc3RhbnRzICoqKioqKioqKioKLQotCXN0YXRpYyBmaW5hbCBJdGVyYWJsZTxQcmltaXRpdmU+IFBSSU1JVElWRVMgPSBidWlsZFByaW1pdGl2ZXMoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBCWVRFX0NPREUgPSAnQic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENIQVJfQ09ERSA9ICdDJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRE9VQkxFX0NPREUgPSAnRCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEZMT0FUX0NPREUgPSAnRic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIElOVF9DT0RFID0gJ0knOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBMT05HX0NPREUgPSAnSic7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFNIT1JUX0NPREUgPSAnUyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJPT0xFQU5fQ09ERSA9ICdaJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVk9JRF9DT0RFID0gJ1YnOwotCi0Jc3RhdGljIGZpbmFsIGludCBNQVhfUFJJTUlUSVZFX0NMQVNTX05BTUVfTEVOR1RIID0gY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0Jc3RhdGljIGZpbmFsIGludCBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCWZvciAoUHJpbWl0aXZlIHByaW1pdGl2ZSA6IFBSSU1JVElWRVMpIHsKLQkJCWludCBsZW4gPSBwcmltaXRpdmUuamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlmb3IgKFByaW1pdGl2ZSBwcmltaXRpdmUgOiBQUklNSVRJVkVTKSB7Ci0JCQlpbnQgbGVuID0gcHJpbWl0aXZlLndyYXBwZXJDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQlpZiAobGVuID4gbWF4KSB7Ci0JCQkJbWF4ID0gbGVuOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0JLyoqCi0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gPGNvZGU+dm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWU8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8UHJpbWl0aXZlPiBidWlsZFByaW1pdGl2ZXMoKSB7Ci0JCVByaW1pdGl2ZVtdIGFycmF5ID0gbmV3IFByaW1pdGl2ZVs5XTsKLQkJYXJyYXlbMF0gPSBuZXcgUHJpbWl0aXZlKEJZVEVfQ09ERSwgamF2YS5sYW5nLkJ5dGUuY2xhc3MpOwotCQlhcnJheVsxXSA9IG5ldyBQcmltaXRpdmUoQ0hBUl9DT0RFLCBqYXZhLmxhbmcuQ2hhcmFjdGVyLmNsYXNzKTsKLQkJYXJyYXlbMl0gPSBuZXcgUHJpbWl0aXZlKERPVUJMRV9DT0RFLCBqYXZhLmxhbmcuRG91YmxlLmNsYXNzKTsKLQkJYXJyYXlbM10gPSBuZXcgUHJpbWl0aXZlKEZMT0FUX0NPREUsIGphdmEubGFuZy5GbG9hdC5jbGFzcyk7Ci0JCWFycmF5WzRdID0gbmV3IFByaW1pdGl2ZShJTlRfQ09ERSwgamF2YS5sYW5nLkludGVnZXIuY2xhc3MpOwotCQlhcnJheVs1XSA9IG5ldyBQcmltaXRpdmUoTE9OR19DT0RFLCBqYXZhLmxhbmcuTG9uZy5jbGFzcyk7Ci0JCWFycmF5WzZdID0gbmV3IFByaW1pdGl2ZShTSE9SVF9DT0RFLCBqYXZhLmxhbmcuU2hvcnQuY2xhc3MpOwotCQlhcnJheVs3XSA9IG5ldyBQcmltaXRpdmUoQk9PTEVBTl9DT0RFLCBqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcyk7Ci0JCWFycmF5WzhdID0gbmV3IFByaW1pdGl2ZShWT0lEX0NPREUsIGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFByaW1pdGl2ZT4oYXJyYXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgUHJpbWl0aXZlIHsKLQkJZmluYWwgY2hhciBjb2RlOwotCQlmaW5hbCBDbGFzczw/PiBqYXZhQ2xhc3M7Ci0JCWZpbmFsIENsYXNzPD8+IHdyYXBwZXJDbGFzczsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FID0gIlRZUEUiOyAvLyROT04tTkxTLTEkCi0JCS8vIGUuZy4gamF2YS5sYW5nLkJvb2xlYW4uVFlQRSA9PiBib29sZWFuLmNsYXNzCi0JCVByaW1pdGl2ZShjaGFyIGNvZGUsIENsYXNzPD8+IHdyYXBwZXJDbGFzcykgewotCQkJdGhpcy5jb2RlID0gY29kZTsKLQkJCXRoaXMud3JhcHBlckNsYXNzID0gd3JhcHBlckNsYXNzOwotCQkJdGhpcy5qYXZhQ2xhc3MgPSAoQ2xhc3M8Pz4pIGdldFN0YXRpY0ZpZWxkVmFsdWUod3JhcHBlckNsYXNzLCBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUeXBlRGVjbGFyYXRpb24gewotCQlmaW5hbCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lOwotCQlmaW5hbCBpbnQgYXJyYXlEZXB0aDsKLQkJVHlwZURlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50VHlwZU5hbWUsIGludCBhcnJheURlcHRoKSB7Ci0JCQl0aGlzLmVsZW1lbnRUeXBlTmFtZSA9IGVsZW1lbnRUeXBlTmFtZTsKLQkJCXRoaXMuYXJyYXlEZXB0aCA9IGFycmF5RGVwdGg7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3VwcHJlc3NlZCBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgUmVmbGVjdGlvblRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhiODU4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgY29tcGFyYXRvciB3aWxsIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLSAqIElmIHRoZSBjb21wYXJhdG9yIGlzIG51bGwsIHRoZSBuYXR1cmFsIG9yZGVyaW5nIG9mIHRoZSBvYmplY3RzIHdpbGwgYmUgdXNlZC4KLSAqLwotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yPEUgZXh0ZW5kcyBDb21wYXJhYmxlPD8gc3VwZXIgRT4+Ci0JaW1wbGVtZW50cyBDb21wYXJhdG9yPEU+LCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCXB1YmxpYyBSZXZlcnNlQ29tcGFyYXRvcigpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3IoQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JfQotCi0JcHVibGljIGludCBjb21wYXJlKEUgZTEsIEUgZTIpIHsKLQkJcmV0dXJuICh0aGlzLmNvbXBhcmF0b3IgPT0gbnVsbCkgPwotCQkJZTIuY29tcGFyZVRvKGUxKQotCQk6Ci0JCQl0aGlzLmNvbXBhcmF0b3IuY29tcGFyZShlMiwgZTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvUnVubmFibGVDb21tYW5kLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SdW5uYWJsZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3OTk2Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9SdW5uYWJsZUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogV3JhcCBhIFJ1bm5hYmxlIHNvIGl0IGNhbiBiZSB1c2VkIGFzIGEgQ29tbWFuZC4KLSAqLwotcHVibGljIGNsYXNzIFJ1bm5hYmxlQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCXByb3RlY3RlZCBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZTsKLQotCXB1YmxpYyBSdW5uYWJsZUNvbW1hbmQoUnVubmFibGUgcnVubmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHJ1bm5hYmxlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucnVubmFibGUgPSBydW5uYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQl0aGlzLnJ1bm5hYmxlLnJ1bigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQ29tbWFuZFsiICsgdGhpcy5ydW5uYWJsZS50b1N0cmluZygpICsnXSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVBc3NvY2lhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDkwYzI2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQXNzb2NpYXRpb259LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb248SywgVj4KLQlleHRlbmRzIEFic3RyYWN0QXNzb2NpYXRpb248SywgVj4KLQlpbXBsZW1lbnRzIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBLIGtleTsKLQlwcml2YXRlIFYgdmFsdWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzc29jaWF0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBrZXkKLQkgKiBhbmQgYSBudWxsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvbihLIGtleSkgewotCQlzdXBlcigpOwotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXNzb2NpYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIFNpbXBsZUFzc29jaWF0aW9uKEsga2V5LCBWIHZhbHVlKSB7Ci0JCXRoaXMoa2V5KTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JcHVibGljIEsgZ2V0S2V5KCkgewotCQlyZXR1cm4gdGhpcy5rZXk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3luY2hyb25pemVkIFNpbXBsZUFzc29jaWF0aW9uPEssIFY+IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVBc3NvY2lhdGlvbjxLLCBWPikgc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2UuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhYmY1OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVCb29sZWFuUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBQcm92aWRlIGEgY29udGFpbmVyIGZvciBwYXNzaW5nIGEgZmxhZyB0aGF0IGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSByZWNpcGllbnQuCi0gKiAKLSAqIEBzZWUgU3luY2hyb25pemVkQm9vbGVhbgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQm9vbGVhblJlZmVyZW5jZQotCWltcGxlbWVudHMgQm9vbGVhblJlZmVyZW5jZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyA8Y29kZT5ib29sZWFuPC9jb2RlPi4gKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiB2YWx1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiByZWZlcmVuY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICovCi0JcHVibGljIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoYm9vbGVhbiB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gcmVmZXJlbmNlIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSgpIHsKLQkJdGhpcyhmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXMoYm9vbGVhbiB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IHY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3QoYm9vbGVhbiB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUcnVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhbHNlKCkgewotCQlyZXR1cm4gISB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZmxpcCgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPSAhIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2V0Tm90KGJvb2xlYW4gdikgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZSggISB2KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRUcnVlKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXRGYWxzZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVCb29sZWFuUmVmZXJlbmNlKSBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKSArICddJzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVDb21tYW5kRXhlY3V0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUNvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjk2NTRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUNvbW1hbmRFeGVjdXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yfS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmRFeGVjdXRvcgotCWltcGxlbWVudHMgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IKLXsKLQlwcml2YXRlIGJvb2xlYW4gYWN0aXZlID0gZmFsc2U7Ci0KLQlwdWJsaWMgU2ltcGxlQ29tbWFuZEV4ZWN1dG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlpZiAodGhpcy5hY3RpdmUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBzdG9wcGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hY3RpdmUgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWlmICh0aGlzLmFjdGl2ZSkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlpZiAoICEgdGhpcy5hY3RpdmUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vdCBzdGFydGVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hY3RpdmUgPSBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZUZpbHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZmYxMjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotCi0vKioKLSAqIFNpbXBsZSwgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+RmlsdGVyPC9jb2RlPgotICogdGhhdCBob2xkcyBvbiB0byBhIGNyaXRlcmlvbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUKLSAqIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBvciA8Y29kZT5yZWplY3QoT2JqZWN0KTwvY29kZT4KLSAqIG1ldGhvZHMuIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGVpdGhlciBvZiB0aGVzZSBtZXRob2RzLAotICogZGVwZW5kaW5nIG9uIHdoaWNoIGlzIGVhc2llciB0byBpbXBsZW1lbnQuIE5vdGUgdGhhdCBhdCBsZWFzdAotICogb25lIG9mIHRoZXNlIG1ldGhvZHMgPGVtPm11c3Q8L2VtPiBiZSBvdmVycmlkZGVuIG9yCi0gKiBhbiBpbmZpbml0ZSBsb29wIHdpbGwgb2NjdXIuIElmIGJvdGggb2YgdGhlbSBhcmUgb3ZlcnJpZGRlbiwKLSAqIG9ubHkgdGhlIDxjb2RlPmFjY2VwdChPYmplY3QpPC9jb2RlPiBtZXRob2Qgd2lsbCBiZSB1c2VkLgotICogPHA+Ci0gKiBTaW1wbGlmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzdHJhaWdodGZvcndhcmQgaW5uZXIgY2xhc3Nlcy4KLSAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIGZpbHRlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEKLSAqIDxjb2RlPkZpbHRlcmluZ0l0ZXJhdG9yPC9jb2RlPiB0byByZXR1cm4gb25seSB0aG9zZSBzdHJpbmdzCi0gKiBpbiB0aGUgbmVzdGVkIGl0ZXJhdG9yIHN0YXJ0IHdpdGggInByZWZpeCI6Ci0gKiA8cHJlPgotICoJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmc+KCJwcmVmaXgiKSB7Ci0gKgkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBvKSB7Ci0gKgkJCXJldHVybiBvLnN0YXJ0c1dpdGgoKFN0cmluZykgY3JpdGVyaW9uKTsKLSAqCQl9Ci0gKgl9OwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW1wbGVGaWx0ZXI8VCwgUz4KLQlpbXBsZW1lbnRzIEZpbHRlcjxUPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgUyBjcml0ZXJpb247Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogTW9yZSB1c2VmdWwgY29uc3RydWN0b3IuIFRoZSBzcGVjaWZpZWQgY3JpdGVyaW9uIGNhbgotCSAqIGJlIHVzZWQgYnkgYSBzdWJjbGFzcyB0byAiYWNjZXB0IiBvciAicmVqZWN0IiBvYmplY3RzLgotCSAqLwotCXByb3RlY3RlZCBTaW1wbGVGaWx0ZXIoUyBjcml0ZXJpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jcml0ZXJpb24gPSBjcml0ZXJpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc2ltcGxlIGZpbHRlciB3aXRoIGEgbnVsbCBjcml0ZXJpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU2ltcGxlRmlsdGVyKCkgewotCQl0aGlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBzaG91bGQgYmUgInJlamVjdGVkIi4KLQkgKiBUaGUgc2VtYW50aWNzIG9mICJyZWplY3RlZCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlamVjdChUIG8pIHsKLQkJcmV0dXJuICEgdGhpcy5hY2NlcHQobyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHNob3VsZCBiZSAiYWNjZXB0ZWQiLgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgImFjY2VwdGVkIiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KFQgbykgewotCQlyZXR1cm4gISB0aGlzLnJlamVjdChvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU2ltcGxlRmlsdGVyPFQsIFM+IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIChTaW1wbGVGaWx0ZXI8VCwgUz4pIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmICggISAobyBpbnN0YW5jZW9mIFNpbXBsZUZpbHRlcjw/LCA/PikpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTaW1wbGVGaWx0ZXI8PywgPz4gb3RoZXIgPSAoU2ltcGxlRmlsdGVyPD8sID8+KSBvOwotCQlyZXR1cm4gKHRoaXMuY3JpdGVyaW9uID09IG51bGwpID8KLQkJCShvdGhlci5jcml0ZXJpb24gPT0gbnVsbCkgOiB0aGlzLmNyaXRlcmlvbi5lcXVhbHMob3RoZXIuY3JpdGVyaW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKHRoaXMuY3JpdGVyaW9uID09IG51bGwpID8gMCA6IHRoaXMuY3JpdGVyaW9uLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jcml0ZXJpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSW50UmVmZXJlbmNlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3YTNiNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgd2hlcmV2ZXIgYSBtdXRhYmxlIGludGVnZXIgb2JqZWN0IGlzIG5lZWRlZC4KLSAqIEl0IGlzIGEgY3Jvc3MgYmV0d2VlbiBhbiA8Y29kZT5pbnQ8L2NvZGU+IGFuZCBhbiB7QGxpbmsgSW50ZWdlcn0uCi0gKiBJdCBjYW4gYmUgc3RvcmVkIGluIGEgc3RhbmRhcmQgY29udGFpbmVyIChlLmcuIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbn0pCi0gKiBidXQgY2FuIGJlIG1vZGlmaWVkLiBJdCBpcyBhbHNvIHVzZWZ1bCBwYXNzaW5nIGEgdmFsdWUgdGhhdCBjYW4gYmUgY2hhbmdlZAotICogYnkgdGhlIHJlY2lwaWVudC4KLSAqIAotICogQHNlZSBTeW5jaHJvbml6ZWRJbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZUludFJlZmVyZW5jZQotCWltcGxlbWVudHMgSW50UmVmZXJlbmNlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIDxjb2RlPmludDwvY29kZT4uICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBpbnQgdmFsdWUgPSAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIDxjb2RlPmludDwvY29kZT4gcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVJbnRSZWZlcmVuY2UoaW50IGNvdW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSBjb3VudDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSA8Y29kZT5pbnQ8L2NvZGU+IHJlZmVyZW5jZSB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgemVyby4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSW50UmVmZXJlbmNlKCkgewotCQl0aGlzKDApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5vdEVxdWFsKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNaZXJvKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90WmVybygpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXJUaGFuKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID4gdjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSA+PSB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW4oaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgPCB2OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW5PckVxdWFsKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlIDw9IHY7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQb3NpdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNHcmVhdGVyVGhhbigwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05vdFBvc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05lZ2F0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0xlc3NUaGFuKDApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TmVnYXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzR3JlYXRlclRoYW5PckVxdWFsKDApOwotCX0KLQotCXB1YmxpYyBpbnQgYWJzKCkgewotCQlyZXR1cm4gTWF0aC5hYnModGhpcy52YWx1ZSk7Ci0JfQotCi0JcHVibGljIGludCBuZWcoKSB7Ci0JCXJldHVybiAtdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGFkZChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSArIHY7Ci0JfQotCi0JcHVibGljIGludCBzdWJ0cmFjdChpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAtIHY7Ci0JfQotCi0JcHVibGljIGludCBtdWx0aXBseShpbnQgdikgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAqIHY7Ci0JfQotCi0JcHVibGljIGludCBkaXZpZGUoaW50IHYpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWUgLyB2OwotCX0KLQotCXB1YmxpYyBpbnQgcmVtYWluZGVyKGludCB2KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlICUgdjsKLQl9Ci0KLQlwdWJsaWMgaW50IG1pbihpbnQgdikgewotCQlyZXR1cm4gTWF0aC5taW4odGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JcHVibGljIGludCBtYXgoaW50IHYpIHsKLQkJcmV0dXJuIE1hdGgubWF4KHRoaXMudmFsdWUsIHYpOwotCX0KLQotCXB1YmxpYyBkb3VibGUgcG93KGludCB2KSB7Ci0JCXJldHVybiBNYXRoLnBvdyh0aGlzLnZhbHVlLCB2KTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNldFZhbHVlKGludCB2YWx1ZSkgewotCQlpbnQgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCXB1YmxpYyBpbnQgc2V0WmVybygpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoMCk7Ci0JfQotCi0JcHVibGljIGludCBpbmNyZW1lbnQoKSB7Ci0JCXJldHVybiArK3RoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBkZWNyZW1lbnQoKSB7Ci0JCXJldHVybiAtLXRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbXBhcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb21wYXJlVG8oUmVhZE9ubHlJbnRSZWZlcmVuY2UgcmVmKSB7Ci0JCWludCB2ID0gcmVmLmdldFZhbHVlKCk7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA8IHYpID8gLTEgOiAoKHRoaXMudmFsdWUgPT0gdikgPyAwIDogMSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNpbXBsZUludFJlZmVyZW5jZSBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoU2ltcGxlSW50UmVmZXJlbmNlKSBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLnZhbHVlKSArICddJzsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVKYXZhVHlwZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY0N2JhMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVKYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBKYXZhVHlwZX0gaW50ZXJmYWNlLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlSmF2YVR5cGUKLQlpbXBsZW1lbnRzIEphdmFUeXBlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCi0JLyoqCi0JICogc3RvcmUgdGhlIHR5cGUgYXMgYSBuYW1lLCBzbyB3ZSBjYW4gcmVmZXJlbmNlIGNsYXNzZXMKLQkgKiB0aGF0IGFyZSBub3QgbG9hZGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZWxlbWVudFR5cGVOYW1lOwotCi0JLyoqCi0JICogbm9uLWFycmF5IHR5cGVzIGhhdmUgYW4gYXJyYXkgZGVwdGggb2YgemVybwotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IGFycmF5RGVwdGg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBQ0tFVFMgPSAiW10iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0eXBlIGFuZCBhcnJheSBkZXB0aC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlSmF2YVR5cGUoU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChlbGVtZW50VHlwZU5hbWUgPT0gbnVsbCkgfHwgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGVsZW1lbnQgdHlwZSBuYW1lIGlzIHJlcXVpcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGVsZW1lbnRUeXBlTmFtZSkgIT0gMCkgewkJLy8gZS5nLiAiW0xqYXZhLmxhbmcuT2JqZWN0OyIKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBlbGVtZW50IHR5cGUgbXVzdCBub3QgYmUgYW4gYXJyYXk6ICIgKyBlbGVtZW50VHlwZU5hbWUgKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGFycmF5RGVwdGggPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgYXJyYXkgZGVwdGggbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gemVybzogIiArIGFycmF5RGVwdGggKyAnLicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5lcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCkpICYmIChhcnJheURlcHRoICE9IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCIndm9pZCcgbXVzdCBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lOwotCQl0aGlzLmFycmF5RGVwdGggPSBhcnJheURlcHRoOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEphdmEgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgY2xhc3MgbmFtZSBjYW4gYmUgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6PHVsPjxjb2RlPgotCSAqIDxsaT5qYXZhLmxhbmcuT2JqZWN0Ci0JICogPGxpPmludAotCSAqIDxsaT5qYXZhLnV0aWwuTWFwJEVudHJ5Ci0JICogPGxpPltMamF2YS5sYW5nLk9iamVjdDsKLQkgKiA8bGk+W0kKLQkgKiA8bGk+W0xqYXZhLnV0aWwuTWFwJEVudHJ5OwotCSAqIDwvY29kZT48L3VsPgotCSAqLwotCXB1YmxpYyBTaW1wbGVKYXZhVHlwZShTdHJpbmcgamF2YUNsYXNzTmFtZSkgewotCQl0aGlzKENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoamF2YUNsYXNzTmFtZSksIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGphdmFDbGFzc05hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXZhIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICovCi0JcHVibGljIFNpbXBsZUphdmFUeXBlKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl0aGlzKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUeXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEFycmF5RGVwdGgoKSB7Ci0JCXJldHVybiB0aGlzLmFycmF5RGVwdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNBcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlEZXB0aCA+IDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmUoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzTmFtZS5pc1ByaW1pdGl2ZSh0aGlzLmVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQcmltaXRpdmVXcmFwcGVyKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKHRoaXMuZWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlyZXR1cm4gKHRoaXMuYXJyYXlEZXB0aCA9PSAwKSAmJiBDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZSh0aGlzLmVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKSB7Ci0JCXJldHVybiAodGhpcy5hcnJheURlcHRoID09IDApICYmIENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcih0aGlzLmVsZW1lbnRUeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIENsYXNzPD8+IGdldEphdmFDbGFzcygpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbih0aGlzLmVsZW1lbnRUeXBlTmFtZSwgdGhpcy5hcnJheURlcHRoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRoaXMuZWxlbWVudFR5cGVOYW1lLCB0aGlzLmFycmF5RGVwdGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb21wYXJpc29uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgb3RoZXJFbGVtZW50VHlwZU5hbWUsIGludCBvdGhlckFycmF5RGVwdGgpIHsKLQkJcmV0dXJuICh0aGlzLmFycmF5RGVwdGggPT0gb3RoZXJBcnJheURlcHRoKQotCQkJJiYgdGhpcy5lbGVtZW50VHlwZU5hbWUuZXF1YWxzKG90aGVyRWxlbWVudFR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZXNjcmliZXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gdGhpcy5lcXVhbHMoQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShjbGFzc05hbWUpLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChjbGFzc05hbWUpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkZXNjcmliZXMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiB0aGlzLmRlc2NyaWJlcyhqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSmF2YVR5cGUgb3RoZXIpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKG90aGVyLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBvdGhlci5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gKHRoaXMgPT0gbykgPyB0cnVlIDogKG8gaW5zdGFuY2VvZiBKYXZhVHlwZSkgPyB0aGlzLmVxdWFscygoSmF2YVR5cGUpIG8pIDogZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lLmhhc2hDb2RlKCkgXiB0aGlzLmFycmF5RGVwdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW50aW5nIGFuZCBkaXNwbGF5aW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZGVjbGFyYXRpb24oKSB7Ci0JCWlmICh0aGlzLmFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKTsKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIodGhpcy5lbGVtZW50VHlwZU5hbWUubGVuZ3RoKCkgKyAoMiAqIHRoaXMuYXJyYXlEZXB0aCkpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBlbmREZWNsYXJhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0RWxlbWVudFR5cGVOYW1lRGVjbGFyYXRpb24oKSk7Ci0JCWZvciAoaW50IGkgPSB0aGlzLmFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEJSQUNLRVRTKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50RGVjbGFyYXRpb25PbihQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCh0aGlzLmdldEVsZW1lbnRUeXBlTmFtZURlY2xhcmF0aW9uKCkpOwotCQlmb3IgKGludCBpID0gdGhpcy5hcnJheURlcHRoOyBpLS0gPiAwOyApIHsKLQkJCXB3LnByaW50KEJSQUNLRVRTKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSA8Y29kZT4nJCc8L2NvZGU+IHZlcnNpb24gb2YgdGhlIG5hbWUgaXMgdXNlZCBpbiB7QGxpbmsgQ2xhc3MjZm9yTmFtZShTdHJpbmcpfSwKLQkgKiBidXQgdGhlIDxjb2RlPicuJzwvY29kZT4gdmVyc2lvbiBvZiB0aGUgbmFtZSBpcyB1c2VkIGluIHNvdXJjZSBjb2RlLgotCSAqIFZlcnkgaXJyaXRhdGluZy4uLi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRFbGVtZW50VHlwZU5hbWVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFR5cGVOYW1lLnJlcGxhY2UoJyQnLCAnLicpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZERlY2xhcmF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBzdXBlci5jbG9uZSgpOwotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlTWV0aG9kU2lnbmF0dXJlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVNZXRob2RTaWduYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0YjUyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVNZXRob2RTaWduYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE1ldGhvZFNpZ25hdHVyZSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTaW1wbGVNZXRob2RTaWduYXR1cmUKLQlpbXBsZW1lbnRzIE1ldGhvZFNpZ25hdHVyZSwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogc3RvcmUgdGhlIHBhcmFtZXRlciB0eXBlcyBhcyBuYW1lcywgc28gd2UgY2FuIHJlZmVyZW5jZSBjbGFzc2VzCi0JICogdGhhdCBhcmUgbm90IGxvYWRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgSmF2YVR5cGVbXSBwYXJhbWV0ZXJUeXBlczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF2YVR5cGVbXSBFTVBUWV9QQVJBTUVURVJfVFlQRVMgPSBuZXcgSmF2YVR5cGVbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX1NFUEFSQVRPUiA9ICIsICI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQKLQkgKiBubyBwYXJhbWV0ZXIgdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSkgewotCQl0aGlzKG5hbWUsIEVNUFRZX1BBUkFNRVRFUl9UWVBFUyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyCi0JICogdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSwgSmF2YVR5cGUuLi4gcGFyYW1ldGVyVHlwZXMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgbmFtZSBpcyByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIHR5cGVzIGFyZSByZXF1aXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNoZWNrUGFyYW1ldGVyVHlwZXMocGFyYW1ldGVyVHlwZXMpOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLnBhcmFtZXRlclR5cGVzID0gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja1BhcmFtZXRlclR5cGVzKEphdmFUeXBlW10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlclR5cGVzW2ldID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHBhcmFtZXRlciB0eXBlOiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChwYXJhbWV0ZXJUeXBlc1tpXS5nZXRFbGVtZW50VHlwZU5hbWUoKS5lcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCkpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQSBwYXJhbWV0ZXIgdHlwZSBvZiAndm9pZCcgaXMgbm90IGFsbG93ZWQ6ICIgKyBpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbWV0aG9kIHNpZ25hdHVyZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgcGFyYW1ldGVyCi0JICogdHlwZXMuCi0JICovCi0JcHVibGljIFNpbXBsZU1ldGhvZFNpZ25hdHVyZShTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIHBhcmFtZXRlclR5cGVOYW1lcykgewotCQl0aGlzKG5hbWUsIGJ1aWxkUGFyYW1ldGVyVHlwZXMocGFyYW1ldGVyVHlwZU5hbWVzKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVR5cGVbXSBidWlsZFBhcmFtZXRlclR5cGVzKFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcykgewotCQlpZiAocGFyYW1ldGVyVHlwZU5hbWVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBwYXJhbWV0ZXIgdHlwZSBuYW1lcyBhcmUgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXZhVHlwZVtdIHBhcmFtZXRlclR5cGVzID0gbmV3IEphdmFUeXBlW3BhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclR5cGVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcmFtZXRlclR5cGVOYW1lc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBwYXJhbWV0ZXIgdHlwZSBuYW1lOiAiICsgaSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhcmFtZXRlclR5cGVzW2ldID0gbmV3IFNpbXBsZUphdmFUeXBlKHBhcmFtZXRlclR5cGVOYW1lc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG1ldGhvZCBzaWduYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIHBhcmFtZXRlcgotCSAqIHR5cGVzLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoU3RyaW5nIG5hbWUsIENsYXNzPD8+Li4uIHBhcmFtZXRlckphdmFDbGFzc2VzKSB7Ci0JCXRoaXMobmFtZSwgYnVpbGRQYXJhbWV0ZXJUeXBlTmFtZXMocGFyYW1ldGVySmF2YUNsYXNzZXMpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBidWlsZFBhcmFtZXRlclR5cGVOYW1lcyhDbGFzczw/PltdIHBhcmFtZXRlckphdmFDbGFzc2VzKSB7Ci0JCWlmIChwYXJhbWV0ZXJKYXZhQ2xhc3NlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgcGFyYW1ldGVyIEphdmEgY2xhc3NlcyBhcmUgcmVxdWlyZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdbXSBwYXJhbWV0ZXJUeXBlTmFtZXMgPSBuZXcgU3RyaW5nW3BhcmFtZXRlckphdmFDbGFzc2VzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVySmF2YUNsYXNzZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwYXJhbWV0ZXJKYXZhQ2xhc3Nlc1tpXSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyBwYXJhbWV0ZXIgSmF2YSBjbGFzczogIiArIGkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwYXJhbWV0ZXJUeXBlTmFtZXNbaV0gPSBwYXJhbWV0ZXJKYXZhQ2xhc3Nlc1tpXS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHBhcmFtZXRlclR5cGVOYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBtZXRob2Qgc2lnbmF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIEphdmEgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTaW1wbGVNZXRob2RTaWduYXR1cmUoTWV0aG9kIG1ldGhvZCkgewotCQl0aGlzKG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGVbXSBnZXRQYXJhbWV0ZXJUeXBlcygpIHsKLQkJcmV0dXJuIHRoaXMucGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbXBhcmlzb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZGVzY3JpYmVzKE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkKLQkJCQkmJiB0aGlzLnBhcmFtZXRlclR5cGVzRGVzY3JpYmUobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwYXJhbWV0ZXJUeXBlc0Rlc2NyaWJlKENsYXNzPD8+W10gb3RoZXJQYXJhbWV0ZXJUeXBlcykgewotCQlKYXZhVHlwZVtdIGxvY2FsUGFyYW1ldGVyVHlwZXMgPSB0aGlzLnBhcmFtZXRlclR5cGVzOwotCQlpbnQgbGVuID0gbG9jYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCWlmIChvdGhlclBhcmFtZXRlclR5cGVzLmxlbmd0aCAhPSBsZW4pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBsb2NhbFBhcmFtZXRlclR5cGVzW2ldLmRlc2NyaWJlcyhvdGhlclBhcmFtZXRlclR5cGVzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoU3RyaW5nIG90aGVyTmFtZSwgSmF2YVR5cGVbXSBvdGhlclBhcmFtZXRlclR5cGVzKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuZXF1YWxzKG90aGVyTmFtZSkKLQkJCQkmJiBBcnJheXMuZXF1YWxzKHRoaXMucGFyYW1ldGVyVHlwZXMsIG90aGVyUGFyYW1ldGVyVHlwZXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhNZXRob2RTaWduYXR1cmUgb3RoZXIpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxzKG90aGVyLmdldE5hbWUoKSwgb3RoZXIuZ2V0UGFyYW1ldGVyVHlwZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCXJldHVybiAodGhpcyA9PSBvKSA/IHRydWUgOiAobyBpbnN0YW5jZW9mIE1ldGhvZFNpZ25hdHVyZSkgPyB0aGlzLmVxdWFscygoTWV0aG9kU2lnbmF0dXJlKSBvKSA6IGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWUuaGFzaENvZGUoKSBeIEFycmF5cy5oYXNoQ29kZSh0aGlzLnBhcmFtZXRlclR5cGVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbnRpbmcgYW5kIGRpc3BsYXlpbmcgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQl0aGlzLmFwcGVuZFNpZ25hdHVyZVRvKHNiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwZW5kU2lnbmF0dXJlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJc2IuYXBwZW5kKCcoJyk7Ci0JCUphdmFUeXBlW10gbG9jYWxQYXJhbWV0ZXJUeXBlcyA9IHRoaXMucGFyYW1ldGVyVHlwZXM7Ci0JCWludCBsZW4gPSBsb2NhbFBhcmFtZXRlclR5cGVzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKGkgIT0gMCkgewotCQkJCXNiLmFwcGVuZChQQVJBTUVURVJfU0VQQVJBVE9SKTsKLQkJCX0KLQkJCWxvY2FsUGFyYW1ldGVyVHlwZXNbaV0uYXBwZW5kRGVjbGFyYXRpb25UbyhzYik7Ci0JCX0KLQkJc2IuYXBwZW5kKCcpJyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRTaWduYXR1cmVPbihQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCh0aGlzLm5hbWUpOwotCQlwdy5wcmludCgnKCcpOwotCQlKYXZhVHlwZVtdIGxvY2FsUGFyYW1ldGVyVHlwZXMgPSB0aGlzLnBhcmFtZXRlclR5cGVzOwotCQlpbnQgbGVuID0gbG9jYWxQYXJhbWV0ZXJUeXBlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChpICE9IDApIHsKLQkJCQlwdy5wcmludChQQVJBTUVURVJfU0VQQVJBVE9SKTsKLQkJCX0KLQkJCWxvY2FsUGFyYW1ldGVyVHlwZXNbaV0ucHJpbnREZWNsYXJhdGlvbk9uKHB3KTsKLQkJfQotCQlwdy5wcmludCgnKScpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQl0aGlzLmFwcGVuZFNpZ25hdHVyZVRvKHNiKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gc3VwZXIuY2xvbmUoKTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlT2JqZWN0UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzRhYTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlT2JqZWN0UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5PYmplY3RSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZSBhIGNvbnRhaW5lciBmb3IgcGFzc2luZyBhbiBvYmplY3QgdGhhdCBjYW4gYmUgY2hhbmdlZCBieSB0aGUgcmVjaXBpZW50LgotICogCi0gKiBAc2VlIFN5bmNocm9uaXplZE9iamVjdAotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFY+Ci0JaW1wbGVtZW50cyBPYmplY3RSZWZlcmVuY2U8Vj4sIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgdmFsdWUuICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBWIHZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBvYmplY3QgcmVmZXJlbmNlIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVPYmplY3RSZWZlcmVuY2UoViB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIG9iamVjdCByZWZlcmVuY2Ugd2l0aCBhbiBpbml0aWFsIHZhbHVlIG9mCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFNpbXBsZU9iamVjdFJlZmVyZW5jZSgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlRXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIG9iamVjdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVOb3RFcXVhbChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy52YWx1ZSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGwoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlID09IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROdWxsKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBWIHNldFZhbHVlKFYgdmFsdWUpIHsKLQkJViBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXJldHVybiBvbGQ7Ci0JfQotCi0JcHVibGljIFYgc2V0TnVsbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNpbXBsZU9iamVjdFJlZmVyZW5jZTxWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFY+IGNsb25lID0gKFNpbXBsZU9iamVjdFJlZmVyZW5jZTxWPikgc3VwZXIuY2xvbmUoKTsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gJ1snICsgU3RyaW5nLnZhbHVlT2YodGhpcy52YWx1ZSkgKyAnXSc7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlUXVldWUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZTAyNmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgUXVldWV9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVF1ZXVlPEU+Ci0JaW1wbGVtZW50cyBRdWV1ZTxFPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIExpbmtlZExpc3Q8RT4gZWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHF1ZXVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVRdWV1ZSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcXVldWUgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBxdWV1ZSB3aWxsIGRlcXVldWUgaXRzIGVsZW1lbnRzIGluIHRoZSBzYW1lCi0JICogb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgYnkgdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvciAoaS5lLiB0aGUKLQkgKiBmaXJzdCBlbGVtZW50IHJldHVybmVkIGJ5IHRoZSBjb2xsZWN0aW9uJ3MgaXRlcmF0b3Igd2lsbCBiZSB0aGUKLQkgKiBmaXJzdCBlbGVtZW50IHJldHVybmVkIGJ5IHtAbGluayAjZGVxdWV1ZSgpfSkuCi0JICovCi0JcHVibGljIFNpbXBsZVF1ZXVlKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KGMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBRdWV1ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBlbnF1ZXVlKEUgbykgewotCQl0aGlzLmVsZW1lbnRzLmFkZExhc3Qobyk7Ci0JfQotCi0JcHVibGljIEUgZGVxdWV1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMucmVtb3ZlRmlyc3QoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50cy5nZXRGaXJzdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmlzRW1wdHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ2xvbmVhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTaW1wbGVRdWV1ZTxFPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJU2ltcGxlUXVldWU8RT4gY2xvbmUgPSAoU2ltcGxlUXVldWU8RT4pIHN1cGVyLmNsb25lKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUxpbmtlZExpc3Q8RT4gbGwgPSAoTGlua2VkTGlzdDxFPikgdGhpcy5lbGVtZW50cy5jbG9uZSgpOwotCQkJY2xvbmUuZWxlbWVudHMgPSBsbDsKLQkJCXJldHVybiBjbG9uZTsKLQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbnRlcm5hbEVycm9yKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnBlZWsoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdGFjay5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxNmI0OS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TaW1wbGVTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3RhY2t9IGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0YWNrPEU+Ci0JaW1wbGVtZW50cyBTdGFjazxFPiwgQ2xvbmVhYmxlLCBTZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIExpbmtlZExpc3Q8RT4gZWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN0YWNrLgotCSAqLwotCXB1YmxpYyBTaW1wbGVTdGFjaygpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhY2sgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIHNwZWNpZmllZAotCSAqIGNvbGxlY3Rpb24uIFRoZSBzdGFjayB3aWxsIHBvcCBpdHMgZWxlbWVudHMgaW4gcmV2ZXJzZSBvZiB0aGUKLQkgKiBvcmRlciB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIChpLmUuIHRoZQotCSAqIGxhc3QgZWxlbWVudCByZXR1cm5lZCBieSB0aGUgY29sbGVjdGlvbidzIGl0ZXJhdG9yIHdpbGwgYmUgdGhlCi0JICogZmlyc3QgZWxlbWVudCByZXR1cm5lZCBieSB7QGxpbmsgI3BvcCgpfSkuCi0JICovCi0JcHVibGljIFNpbXBsZVN0YWNrKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IG5ldyBMaW5rZWRMaXN0PEU+KGNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGFjayBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBwdXNoKEUgZWxlbWVudCkgewotCQl0aGlzLmVsZW1lbnRzLmFkZExhc3QoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEUgcG9wKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZWxlbWVudHMucmVtb3ZlTGFzdCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRzLmdldExhc3QoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmlzRW1wdHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2ltcGxlU3RhY2s8RT4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVNpbXBsZVN0YWNrPEU+IGNsb25lID0gKFNpbXBsZVN0YWNrPEU+KSBzdXBlci5jbG9uZSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlMaW5rZWRMaXN0PEU+IGxsID0gKExpbmtlZExpc3Q8RT4pIHRoaXMuZWxlbWVudHMuY2xvbmUoKTsKLQkJCWNsb25lLmVsZW1lbnRzID0gbGw7Ci0JCQlyZXR1cm4gY2xvbmU7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5wZWVrKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RyaW5nTWF0Y2hlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlU3RyaW5nTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg1Zjc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVN0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci0KLS8vIFRPRE8gdGhlIHJlZ2V4IGNvZGUgaXMgbm90IHZlcnkgZmFzdCAtIHdlIGNvdWxkIHByb2JhYmx5IGRvIGJldHRlciwKLS8vIGhhbmQtY29kaW5nIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gKGVjbGlwc2UgU3RyaW5nTWF0Y2hlcj8pCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNpbXBsZSBzdHJpbmctbWF0Y2hpbmcgYWxnb3JpdGhtIHRoYXQgaXMgYSBsaXR0bGUKLSAqIG1vcmUgdXNlci1mcmllbmRseSB0aGFuIHN0YW5kYXJkIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIEluc3RhbnRpYXRlIGEKLSAqIHN0cmluZyBtYXRjaGVyIHdpdGggYSBmaWx0ZXIgcGF0dGVybiBhbmQgdGhlbiB5b3UgY2FuIHVzZSB0aGUgbWF0Y2hlcgotICogdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW5vdGhlciBzdHJpbmcgKG9yIG9iamVjdCkgbWF0Y2hlcyB0aGUgcGF0dGVybi4KLSAqIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHdoZXRoZXIgdGhlIG1hdGNoaW5nIHNob3VsZCBiZSBjYXNlLXNlbnNpdGl2ZS4KLSAqIAotICogVGhlIHBhdHRlcm4gY2FuIGNvbnRhaW4gdHdvICJtZXRhLWNoYXJhY3RlcnMiOgotICogCScqJyB3aWxsIG1hdGNoIGFueSBzZXQgb2YgemVybyBvciBtb3JlIGNoYXJhY3RlcnMKLSAqIAknPycgd2lsbCBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlcgotICogCi0gKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSAjcHJlZml4KCkgYW5kL29yICNzdWZmaXgoKSB0byBjaGFuZ2Ugd2hhdAotICogc3RyaW5ncyBhcmUgcHJlcGVuZGVkIG9yIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbCBwYXR0ZXJuIHN0cmluZy4KLSAqIFRoaXMgY2FuIG9mZmVyIGEgc2xpZ2h0IHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG92ZXIgY29uY2F0ZW5hdGluZwotICogc3RyaW5ncyBiZWZvcmUgY2FsbGluZyAjc2V0UGF0dGVyblN0cmluZyhTdHJpbmcpLgotICogQnkgZGVmYXVsdCwgYSAnKicgaXMgYXBwZW5kZWQgdG8gZXZlcnkgc3RyaW5nLgotICogCi0gKiBUaGlzIGNsYXNzIGFsc28gdXNlcyB0aGUgc3RyaW5nLW1hdGNoaW5nIGFsZ29yaXRobSB0byAiZmlsdGVyIiBvYmplY3RzCi0gKiAoYW5kLCBhcyBhIHJlc3VsdCwgYWxzbyBpbXBsZW1lbnRzIHRoZSBGaWx0ZXIgaW50ZXJmYWNlKS4KLSAqIEEgc3RyaW5nIGNvbnZlcnRlciBpcyB1c2VkIHRvIGRldGVybWluZSB3aGF0IHN0cmluZyBhc3BlY3Qgb2YgdGhlCi0gKiBvYmplY3QgaXMgY29tcGFyZWQgdG8gdGhlIHBhdHRlcm4uIEJ5IGRlZmF1bHQgdGhlIHN0cmluZyByZXR1cm5lZAotICogYnkgdGhlIG9iamVjdCdzICN0b1N0cmluZygpIG1ldGhvZCBpcyBwYXNzZWQgdG8gdGhlIHBhdHRlcm4gbWF0Y2hlci4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVN0cmluZ01hdGNoZXI8VD4KLQlpbXBsZW1lbnRzIFN0cmluZ01hdGNoZXIsIEZpbHRlcjxUPiwgU2VyaWFsaXphYmxlCi17Ci0KLQkvKiogQW4gYWRhcHRlciB0aGF0IGNvbnZlcnRzIHRoZSBvYmplY3RzIGludG8gc3RyaW5ncyB0byBiZSBtYXRjaGVkIHdpdGggdGhlIHBhdHRlcm4uICovCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyOwotCi0JLyoqIFRoZSBzdHJpbmcgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLiAqLwotCXByaXZhdGUgU3RyaW5nIHBhdHRlcm5TdHJpbmc7Ci0KLQkvKiogV2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UgLSB0aGUgZGVmYXVsdCBpcyB0cnVlLiAqLwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVzQ2FzZTsKLQotCS8qKiBUaGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gYnVpbHQgZnJvbSB0aGUgcGF0dGVybiBzdHJpbmcuICovCi0JcHJpdmF0ZSBQYXR0ZXJuIHBhdHRlcm47Ci0KLQkvKiogQSBsaXN0IG9mIHRoZSBtZXRhLWNoYXJhY3RlcnMgd2UgbmVlZCB0byBlc2NhcGUgaWYgZm91bmQgaW4gdGhlIHBhdHRlcm4gc3RyaW5nLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIFJFR19FWF9NRVRBX0NIQVJTID0geyAnKCcsICdbJywgJ3snLCAnXFwnLCAnXicsICckJywgJ3wnLCAnKScsICc/JywgJyonLCAnKycsICcuJyB9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0cmluZyBtYXRjaGVyIHdpdGggYW4gcGF0dGVybiB0aGF0IHdpbGwgbWF0Y2gKLQkgKiBhbnkgc3RyaW5nIGFuZCBpZ25vcmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RyaW5nTWF0Y2hlcigpIHsKLQkJdGhpcygiKiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RyaW5nIG1hdGNoZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdHRlcm4KLQkgKiB0aGF0IHdpbGwgaWdub3JlIGNhc2UuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm5TdHJpbmcpIHsKLQkJdGhpcyhwYXR0ZXJuU3RyaW5nLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdHJpbmcgbWF0Y2hlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGF0dGVybiB0aGF0IHdpbGwKLQkgKiBpZ25vcmUgY2FzZSBhcyBzcGVjaWZpZWQuCi0JICovCi0JcHVibGljIFNpbXBsZVN0cmluZ01hdGNoZXIoU3RyaW5nIHBhdHRlcm5TdHJpbmcsIGJvb2xlYW4gaWdub3Jlc0Nhc2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuU3RyaW5nID0gcGF0dGVyblN0cmluZzsKLQkJdGhpcy5pZ25vcmVzQ2FzZSA9IGlnbm9yZXNDYXNlOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zdHJpbmdDb252ZXJ0ZXIgPSBTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIGN1cnJlbnQgcGF0dGVybiBzdHJpbmcgYW5kIGNhc2Utc2Vuc2l0aXZpdHkgc2V0dGluZywKLQkgKiByZS1idWlsZCB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHJlYnVpbGRQYXR0ZXJuKCkgewotCQl0aGlzLnBhdHRlcm4gPSB0aGlzLmJ1aWxkUGF0dGVybigpOwotCX0KLQotCS8qKgotCSAqIEdpdmVuIHRoZSBjdXJyZW50IHBhdHRlcm4gc3RyaW5nIGFuZCBjYXNlLXNlbnNpdGl2aXR5IHNldHRpbmcsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRoYXQgY2FuIGJlIHVzZWQKLQkgKiB0byBtYXRjaCBzdHJpbmdzLgotCSAqLwotCXByb3RlY3RlZCBQYXR0ZXJuIGJ1aWxkUGF0dGVybigpIHsKLQkJaW50IHBhdHRlcm5GbGFncyA9IDB4MDsKLQkJaWYgKHRoaXMuaWdub3Jlc0Nhc2UpIHsKLQkJCXBhdHRlcm5GbGFncyA9IFBhdHRlcm4uVU5JQ09ERV9DQVNFIHwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFOwotCQl9Ci0JCXJldHVybiBQYXR0ZXJuLmNvbXBpbGUodGhpcy5jb252ZXJ0VG9SZWdFeCh0aGlzLnBhdHRlcm5TdHJpbmcpLCBwYXR0ZXJuRmxhZ3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdHJpbmdNYXRjaGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQYXR0ZXJuU3RyaW5nKFN0cmluZyBwYXR0ZXJuU3RyaW5nKSB7Ci0JCXRoaXMucGF0dGVyblN0cmluZyA9IHBhdHRlcm5TdHJpbmc7Ci0JCXRoaXMucmVidWlsZFBhdHRlcm4oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVybi5tYXRjaGVyKHN0cmluZykubWF0Y2hlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBGaWx0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGFjY2VwdChUIG8pIHsKLQkJcmV0dXJuIHRoaXMubWF0Y2hlcyh0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcobykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJpbmcgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgb2JqZWN0cwotCSAqIHBhc3NlZCB0byB0aGUgbWF0Y2hlciBpbnRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdDb252ZXJ0ZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzdHJpbmcgY29udmVydGVyIHVzZWQgdG8gY29udmVydCB0aGUgb2JqZWN0cwotCSAqIHBhc3NlZCB0byB0aGUgbWF0Y2hlciBpbnRvIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3JpZ2luYWwgcGF0dGVybiBzdHJpbmcuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgcGF0dGVyblN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVyblN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlnbm9yZXNDYXNlKCkgewotCQlyZXR1cm4gdGhpcy5pZ25vcmVzQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgd2hldGhlciB0aGUgbWF0Y2hlciBpZ25vcmVzIGNhc2UuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldElnbm9yZXNDYXNlKGJvb2xlYW4gaWdub3Jlc0Nhc2UpIHsKLQkJdGhpcy5pZ25vcmVzQ2FzZSA9IGlnbm9yZXNDYXNlOwotCQl0aGlzLnJlYnVpbGRQYXR0ZXJuKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFBhdHRlcm4gcGF0dGVybigpIHsKLQkJcmV0dXJuIHRoaXMucGF0dGVybjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3RoZXIgcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3JyZXNwb25kaW5nIHRvCi0JICogdGhlIG9yaWdpbmFsIHBhdHRlcm4gc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIHJlZ3VsYXJFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9SZWdFeCh0aGlzLnBhdHRlcm5TdHJpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0VG9SZWdFeChTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoc3RyaW5nLmxlbmd0aCgpICsgMTApOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24odGhpcy5wcmVmaXgoKSwgc2IpOwotCQl0aGlzLmNvbnZlcnRUb1JlZ0V4T24oc3RyaW5nLCBzYik7Ci0JCXRoaXMuY29udmVydFRvUmVnRXhPbih0aGlzLnN1ZmZpeCgpLCBzYik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbnkgcHJlZml4IHRoYXQgc2hvdWxkIGJlIHByZXBlbmRlZCB0byB0aGUgb3JpZ2luYWwKLQkgKiBzdHJpbmcuIEJ5IGRlZmF1bHQsIHRoZXJlIGlzIG5vIHByZWZpeC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeCgpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFueSBzdWZmaXggdGhhdCBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIG9yaWdpbmFsCi0JICogc3RyaW5nLiBTaW5jZSB0aGlzIGNsYXNzIGlzIHR5cGljYWxseSB1c2VkIGluIFVJIHNpdHVhdGlvbiB3aGVyZQotCSAqIHRoZSB1c2VyIGlzIHR5cGluZyBpbiBhIHBhdHRlcm4gdXNlZCB0byBmaWx0ZXIgYSBsaXN0LCB0aGUgZGVmYXVsdAotCSAqIHN1ZmZpeCBpcyBhIHdpbGRjYXJkIGNoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN1ZmZpeCgpIHsKLQkJcmV0dXJuICIqIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udmVydFRvUmVnRXhPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhcltdIGNoYXJBcnJheSA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgbGVuZ3RoID0gY2hhckFycmF5Lmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJY2hhciBjID0gY2hhckFycmF5W2ldOwotCQkJLy8gY29udmVydCB1c2VyLWZyaWVuZGx5IG1ldGEtY2hhcnMgaW50byByZWdleCBtZXRhLWNoYXJzCi0JCQlpZiAoYyA9PSAnKicpIHsKLQkJCQlzYi5hcHBlbmQoIi4qIik7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjID09ICc/JykgewotCQkJCXNiLmFwcGVuZCgnLicpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLy8gZXNjYXBlIHJlZ2V4IG1ldGEtY2hhcnMKLQkJCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKFJFR19FWF9NRVRBX0NIQVJTLCBjKSkgewotCQkJCXNiLmFwcGVuZCgnXFwnKTsKLQkJCX0KLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlVGhyZWFkRmFjdG9yeS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU2ltcGxlVGhyZWFkRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzJiYmIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1NpbXBsZVRocmVhZEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbXBsZVRocmVhZEZhY3Rvcnk8L2NvZGU+IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mCi0gKiB0aGUgSkRLIHtAbGluayBUaHJlYWRGYWN0b3J5fS4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZVRocmVhZEZhY3RvcnkKLQlpbXBsZW1lbnRzIFRocmVhZEZhY3RvcnkKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVUaHJlYWRGYWN0b3J5IElOU1RBTkNFID0gbmV3IFNpbXBsZVRocmVhZEZhY3RvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGhyZWFkRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBTaW1wbGVUaHJlYWRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWQocik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0YWNrLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjljMzRjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVyZmFjZSBkZWZpbmluZyB0aGUgY2xhc3NpYyBzdGFjayBiZWhhdmlvciwKLSAqIHdpdGhvdXQgdGhlIGJhY2tkb29ycyBhbGxvd2VkIGJ5IHtAbGluayBqYXZhLnV0aWwuU3RhY2t9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBieSB0aGUgc3RhY2sKLSAqLwotcHVibGljIGludGVyZmFjZSBTdGFjazxFPiB7Ci0KLQkvKioKLQkgKiAiUHVzaCIgdGhlIHNwZWNpZmllZCBpdGVtIG9uIHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXZvaWQgcHVzaChFIGVsZW1lbnQpOwotCi0JLyoqCi0JICogIlBvcCIgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCUUgcG9wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGl0ZW0gb24gdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIHN0YWNrLgotCSAqLwotCUUgcGVlaygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHN0YWNrIGlzIGVtcHR5LgotCSAqLwotCWJvb2xlYW4gaXNFbXB0eSgpOwotCi0KLQlmaW5hbCBjbGFzcyBFbXB0eTxFPgotCQlpbXBsZW1lbnRzIFN0YWNrPEU+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RhY2sgSU5TVEFOQ0UgPSBuZXcgRW1wdHkoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFQ+IFN0YWNrPFQ+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBFbXB0eSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcHVzaChFIGVsZW1lbnQpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXB1YmxpYyBFIHBvcCgpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIEUgcGVlaygpIHsKLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2U5OWRlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgdG8gY29udHJvbCBob3cgYSBjb21tYW5kIGlzIGV4ZWN1dGVkLgotICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgc2VydmVyIHByb3ZpZGVzIHRoZSBjb21tYW5kIGJ1dCB0aGUgY2xpZW50IHByb3ZpZGVzCi0gKiB0aGUgY29udGV4dCAoZS5nLiB0aGUgY2xpZW50IHdvdWxkIGxpa2UgdG8gZGlzcGF0Y2ggdGhlIGNvbW1hbmQgdG8gdGhlIFVJCi0gKiB0aHJlYWQpLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yCi0JZXh0ZW5kcyBDb21tYW5kRXhlY3V0b3IKLXsKLQkvKioKLQkgKiBTdGFydCB0aGUgY29tbWFuZCBleGVjdXRvci4KLQkgKi8KLQl2b2lkIHN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTdG9wIHRoZSBjb21tYW5kIGV4ZWN1dG9yLgotCSAqLwotCXZvaWQgc3RvcCgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb2xsYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nQ29sbGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYjBiMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb2xsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBUaGlzIGNvbGxhdG9yIHNpbXBseSB3cmFwcyBhIEphdmEgdGV4dCBjb2xsYXRvciBhbmQgaW1wbGVtZW50cyBhCi0gKiB7QGxpbmsgU3RyaW5nfSB7QGxpbmsgQ29tcGFyYXRvcn0gKGluc3RlYWQgb2YgYW4ge0BsaW5rIE9iamVjdH0KLSAqIHtAbGluayBDb21wYXJhdG9yfSwgd2hpY2ggaXMgd2hhdCB7QGxpbmsgQ29sbGF0b3J9IGRvZXMsIHBvc3NpYmx5IGZvcgotICogYmFja3dhcmQtY29tcGF0aWJpbGl0eSByZWFzb25zKD8pKS4KLSAqIAotICogQHNlZSBDb2xsYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU3RyaW5nQ29sbGF0b3IKLQlpbXBsZW1lbnRzIENvbXBhcmF0b3I8U3RyaW5nPgotewotCXByaXZhdGUgZmluYWwgQ29sbGF0b3IgY29sbGF0b3I7Ci0KLQotCS8qKgotCSAqIFdyYXAgdGhlIGRlZmF1bHQgY29sbGF0b3IuCi0JICogQHNlZSBDb2xsYXRvciNnZXRJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIFN0cmluZ0NvbGxhdG9yKCkgewotCQl0aGlzKENvbGxhdG9yLmdldEluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIGNvbGxhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGxvY2FsZS4KLQkgKiBAc2VlIENvbGxhdG9yI2dldEluc3RhbmNlKExvY2FsZSkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29sbGF0b3IoTG9jYWxlIGxvY2FsZSkgewotCQl0aGlzKENvbGxhdG9yLmdldEluc3RhbmNlKGxvY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBjb2xsYXRvci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nQ29sbGF0b3IoQ29sbGF0b3IgY29sbGF0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2xsYXRvciA9IGNvbGxhdG9yOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgc3RyaW5nMSwgU3RyaW5nIHN0cmluZzIpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGF0b3IuY29tcGFyZShzdHJpbmcxLCBzdHJpbmcyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmNvbGxhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdDb252ZXJ0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzdiNDFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5IHZhcmlvdXMgInBsdWdnYWJsZSIgY2xhc3NlcyB0byB0cmFuc2Zvcm0gb2JqZWN0cwotICogaW50byBzdHJpbmdzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ0NvbnZlcnRlcjxUPiB7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBzdHJpbmcuCi0JICogVGhlIHNlbWFudGljcyBvZiAiY29udmVydCIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUIG8pOwotCi0KLQlmaW5hbCBjbGFzcyBEZWZhdWx0PFM+Ci0JCWltcGxlbWVudHMgU3RyaW5nQ29udmVydGVyPFM+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nQ29udmVydGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFI+IFN0cmluZ0NvbnZlcnRlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGVmYXVsdCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0J3MgI3RvU3RyaW5nKCkgcmVzdWx0Ci0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJcmV0dXJuIChvID09IG51bGwpID8gbnVsbCA6IG8udG9TdHJpbmcoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci0KLQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPgotCQlpbXBsZW1lbnRzIFN0cmluZ0NvbnZlcnRlcjxTPiwgU2VyaWFsaXphYmxlCi0JewotCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8Uj4gU3RyaW5nQ29udmVydGVyPFI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFMgbykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWFiMDQwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N0cmluZ01hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhIHNpbXBsZSBBUEkgZm9yIGFsbG93aW5nICJwbHVnZ2FibGUiCi0gKiBzdHJpbmcgbWF0Y2hlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGEgcGF0dGVybiBzdHJpbmcKLSAqIHRoZW4gdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBzdHJpbmdzIG1hdGNoIHRoZSBwYXR0ZXJuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0cmluZ01hdGNoZXIgewotCi0JLyoqCi0JICogU2V0IHRoZSBwYXR0ZXJuIHN0cmluZyB1c2VkIHRvIGRldGVybWluZSBmdXR1cmUKLQkgKiBtYXRjaGVzLiBUaGUgZm9ybWF0IGFuZCBzZW1hbnRpY3Mgb2YgdGhlIHBhdHRlcm4KLQkgKiBzdHJpbmcgYXJlIGRldGVybWluZWQgYnkgdGhlIGNvbnRyYWN0IGJldHdlZW4gdGhlCi0JICogY2xpZW50IGFuZCB0aGUgc2VydmVyLgotCSAqLwotCXZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBtYXRjaGVzIHRoZQotCSAqIGVzdGFibGlzaGVkIHBhdHRlcm4gc3RyaW5nLiBUaGUgc2VtYW50aWNzIG9mIGEgbWF0Y2gKLQkgKiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZQotCSAqIGNsaWVudCBhbmQgdGhlIHNlcnZlci4KLQkgKi8KLQlib29sZWFuIG1hdGNoZXMoU3RyaW5nIHN0cmluZyk7Ci0KLQotCWZpbmFsIGNsYXNzIE51bGwKLQkJaW1wbGVtZW50cyBTdHJpbmdNYXRjaGVyLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nTWF0Y2hlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgU3RyaW5nTWF0Y2hlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UGF0dGVyblN0cmluZyhTdHJpbmcgcGF0dGVyblN0cmluZykgewotCQkJLy8gaWdub3JlIHRoZSBwYXR0ZXJuIHN0cmluZwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoU3RyaW5nIHN0cmluZykgewotCQkJLy8gZXZlcnl0aGluZyBpcyBhIG1hdGNoCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3RyaW5nVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0NThiZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TdHJpbmdUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcuU3RyaW5nIGNsYXNzLgotICoKLSAqIEFzIG9mIGpkayAxLjUsIGl0J3MgdGVtcHRpbmcgdG8gY29udmVydCBhbGwgb2YgdGhlc2UgbWV0aG9kcyB0byB1c2UKLSAqIGphdmEubGFuZy5BcHBlbmRhYmxlIChpbnN0ZWFkIG9mIFN0cmluZ0J1ZmZlciwgU3RyaW5nQnVpbGRlciwgYW5kIFdyaXRlcik7Ci0gKiBidXQgYWxsIHRoZSBBcHBlbmRhYmxlIG1ldGhvZHMgdGhyb3cgamF2YS5pby5JT0V4Y2VwdGlvbiAoeWVjaCkgYW5kIHdlCi0gKiBbbWlnaHQ/XSBnZXQgYSBiaXQgYmV0dGVyIHBlcmZvcm1hbmNlIGludm9raW5nIG1ldGhvZHMgb24gY2xhc3NlcyB0aGFuCi0gKiB3ZSBnZXQgb24gaW50ZXJmYWNlcy4gOi0pCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdUb29scyB7Ci0KLQkvKiogY2FycmlhZ2UgcmV0dXJuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQkvKiogZG91YmxlIHF1b3RlICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFFVT1RFID0gJyInOwotCi0JLyoqIHBhcmVudGhlc2lzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fUEFSRU5USEVTSVMgPSAnKCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX1BBUkVOVEhFU0lTID0gJyknOwotCi0JLyoqIGJyYWNrZXRzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIE9QRU5fQlJBQ0tFVCA9ICdbJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0xPU0VfQlJBQ0tFVCA9ICddJzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0JSQUNFID0gJ3snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBDTE9TRV9CUkFDRSA9ICd9JzsKLQotCS8qKiBicmFja2V0cyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPUEVOX0NIRVZST04gPSAnPCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENMT1NFX0NIRVZST04gPSAnPic7Ci0KLQkvKiogZW1wdHkgc3RyaW5nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiBlbXB0eSBjaGFyIGFycmF5ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyW10gRU1QVFlfQ0hBUl9BUlJBWSA9IG5ldyBjaGFyWzBdOwotCi0JLyoqIGVtcHR5IHN0cmluZyBhcnJheSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotCi0KLQkvLyAqKioqKioqKioqIHBhZGRpbmcvdHJ1bmNhdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkKGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZChzdHJpbmcsIGxlbmd0aCwgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWQoaW50LCBjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWQoU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWQoaW50KQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWQoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gcGFkKHN0cmluZywgbGVuZ3RoLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPbihpbnQsIHdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZChpbnQsIGNoYXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGUoaW50KQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBwYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlwYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcuc3Vic3RyaW5nKDAsIGxlbmd0aCkpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZy5zdWJzdHJpbmcoMCwgbGVuZ3RoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgdHJ1bmNhdGVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggc3BhY2VzIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGUoaW50KQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcgJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCBzcGFjZXMgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJcGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHNwYWNlcyBhdCB0aGUgZW5kLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5wYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZShjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJyAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBwYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBsZW5ndGgpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyB0cnVuY2F0ZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAwLCBsZW5ndGgsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHRydW5jYXRlZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIDAsIGxlbmd0aCk7Ci0JCX0gZWxzZSB7Ci0JCQlwYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhZF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKHBhZF8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbmd0aCwgYykpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHdyaXRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCgpLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCB3cml0ZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHdyaXRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhpbnQgc3RyaW5nTGVuZ3RoLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVTdHJpbmdPbihBcnJheVRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXSwgYyksIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCgpLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIEFkZCBlbm91Z2ggY2hhcmFjdGVycyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZpbGxfKGludCBzdHJpbmdMZW5ndGgsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXNiLmFwcGVuZChBcnJheVRvb2xzLmZpbGwobmV3IGNoYXJbbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoXSwgYykpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCX0KLQotCS8qCi0JICogQWRkIGVub3VnaCBjaGFyYWN0ZXJzIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIgdG8gY29tcGVuc2F0ZSBmb3IKLQkgKiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmlsbF8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZy5sZW5ndGgoKSwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLmxlbmd0aCwgbGVuZ3RoLCBjLCBzYik7Ci0JfQotCi0JLyoKLQkgKiBBZGQgZW5vdWdoIGNoYXJhY3RlcnMgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlciB0byBjb21wZW5zYXRlIGZvcgotCSAqIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaWxsXyhpbnQgc3RyaW5nTGVuZ3RoLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKEFycmF5VG9vbHMuZmlsbChuZXcgY2hhcltsZW5ndGggLSBzdHJpbmdMZW5ndGhdLCBjKSk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gcGFkXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCAwLCBzdHJpbmdMZW5ndGgpOwotCQlBcnJheXMuZmlsbChyZXN1bHQsIHN0cmluZ0xlbmd0aCwgbGVuZ3RoLCBjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHBhZE9uXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWQoaW50KQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB6ZXJvUGFkKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9uKGludCwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWQoaW50LCBjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmcm9udFBhZChTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBmcm9udFBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9uKGludCwgY2hhciwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGlzIHRvbyBsb25nOiAiICsgc3RyaW5nTGVuZ3RoICsgIiA+ICIgKyBsZW5ndGgpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWQoaW50KQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB6ZXJvUGFkKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkKHN0cmluZywgbGVuZ3RoLCAnMCcpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9uKGludCwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJZnJvbnRQYWRPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9uKGludCwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWQoaW50LCBjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZChjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gZnJvbnRQYWRfKHN0cmluZywgbGVuZ3RoLCBjKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgaXMgdG9vIGxvbmc6ICIgKyBzdHJpbmdMZW5ndGggKyAiID4gIiArIGxlbmd0aCk7ICAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpcyB0aHJvd24uCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPbihpbnQsIGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgdGhyb3duLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT24oaW50LCBjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0cmluZyBpcyB0b28gbG9uZzogIiArIHN0cmluZ0xlbmd0aCArICIgPiAiICsgbGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9yVHJ1bmNhdGUoaW50KQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB6ZXJvUGFkT3JUcnVuY2F0ZShTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBmcm9udFBhZE9yVHJ1bmNhdGUoc3RyaW5nLCBsZW5ndGgsICcwJyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB6ZXJvcyBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnplcm9QYWRPclRydW5jYXRlT24oaW50LCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6ZXJvUGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZnJvbnRQYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsICcwJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPclRydW5jYXRlKGludCwgY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZnJvbnRQYWRPclRydW5jYXRlKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYykgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiBmcm9udFBhZF8oc3RyaW5nLCBsZW5ndGgsIGMpOwotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcuc3Vic3RyaW5nKHN0cmluZ0xlbmd0aCAtIGxlbmd0aCksIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlmcm9udFBhZE9uXyhzdHJpbmcsIGxlbmd0aCwgYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhZCBvciB0cnVuY2F0ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIGxlbmd0aC4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC4KLQkgKiBJZiBpdCBpcyBsb25nZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgb25seSB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICogSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyBwYWRkZWQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhcmFjdGVyIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuZnJvbnRQYWRPclRydW5jYXRlT24oaW50LCBjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBmcm9udFBhZE9yVHJ1bmNhdGVPbihTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLnN1YnN0cmluZyhzdHJpbmdMZW5ndGggLSBsZW5ndGgpKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkT3JUcnVuY2F0ZShpbnQpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHplcm9QYWRPclRydW5jYXRlKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIGZyb250UGFkT3JUcnVuY2F0ZShzdHJpbmcsIGxlbmd0aCwgJzAnKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgemVyb1BhZE9yVHJ1bmNhdGVPbihjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zIGF0IHRoZSBmcm9udC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuemVyb1BhZE9yVHJ1bmNhdGVPbihpbnQsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZyb250UGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCAnMCcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggemVyb3MgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy56ZXJvUGFkT3JUcnVuY2F0ZU9uKGludCwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHplcm9QYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlmcm9udFBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgJzAnLCBzYik7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9yVHJ1bmNhdGUoaW50LCBjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBmcm9udFBhZE9yVHJ1bmNhdGUoY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjKSB7Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAoc3RyaW5nTGVuZ3RoID09IGxlbmd0aCkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoKSB7Ci0JCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBzdHJpbmdMZW5ndGggLSBsZW5ndGgsIHJlc3VsdCwgMCwgbGVuZ3RoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGZyb250UGFkXyhzdHJpbmcsIGxlbmd0aCwgYyk7Ci0JfQotCi0JLyoqCi0JICogUGFkIG9yIHRydW5jYXRlIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLgotCSAqIElmIGl0IGlzIGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBvbmx5IHRoZSBsYXN0IHBhcnQgb2YgdGhlIHN0cmluZyBpcyByZXR1cm5lZC4KLQkgKiBJZiBpdCBpcyBzaG9ydGVyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHBhZGRlZCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBjaGFyYWN0ZXIgYXQgdGhlIGZyb250LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5mcm9udFBhZE9yVHJ1bmNhdGVPbihpbnQsIGNoYXIsIFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZnJvbnRQYWRPclRydW5jYXRlT24oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChzdHJpbmdMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIGlmIChzdHJpbmdMZW5ndGggPiBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcsIHN0cmluZ0xlbmd0aCAtIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWZyb250UGFkT25fKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYWQgb3IgdHJ1bmNhdGUgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICogSWYgdGhlIHN0cmluZyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0JICogSWYgaXQgaXMgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIG9ubHkgdGhlIGxhc3QgcGFydCBvZiB0aGUgc3RyaW5nIGlzIHJldHVybmVkLgotCSAqIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxlbmd0aCwgaXQgaXMgcGFkZGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIGNoYXJhY3RlciBhdCB0aGUgZnJvbnQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmZyb250UGFkT3JUcnVuY2F0ZU9uKGludCwgY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZyb250UGFkT3JUcnVuY2F0ZU9uKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgc3RyaW5nTGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKHN0cmluZ0xlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgaWYgKHN0cmluZ0xlbmd0aCA+IGxlbmd0aCkgewotCQkJc2IuYXBwZW5kKHN0cmluZywgc3RyaW5nTGVuZ3RoIC0gbGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJZnJvbnRQYWRPbl8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogRnJvbnQtcGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZyb250UGFkXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZnJvbnRQYWRfKHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW5ndGgsIGMpKTsKLQl9Ci0KLQkvKgotCSAqIFplcm8tcGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGZyb250UGFkXyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMpIHsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbmd0aF07Ci0JCWludCBzdHJpbmdMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwotCQlpbnQgcGFkTGVuZ3RoID0gbGVuZ3RoIC0gc3RyaW5nTGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMCwgcmVzdWx0LCBwYWRMZW5ndGgsIHN0cmluZ0xlbmd0aCk7Ci0JCUFycmF5cy5maWxsKHJlc3VsdCwgMCwgcGFkTGVuZ3RoLCBjKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oY2hhcltdIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQl9Ci0KLQkvKgotCSAqIFBhZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRob3V0IHZhbGlkYXRpbmcgdGhlIHBhcm1zLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZnJvbnRQYWRPbl8oU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCwgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZpbGxfKHN0cmluZywgbGVuZ3RoLCBjLCBzYik7Ci0JCXNiLmFwcGVuZChzdHJpbmcpOwotCX0KLQotCS8qCi0JICogUGFkIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGhvdXQgdmFsaWRhdGluZyB0aGUgcGFybXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmcm9udFBhZE9uXyhTdHJpbmcgc3RyaW5nLCBpbnQgbGVuZ3RoLCBjaGFyIGMsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJZmlsbF8oc3RyaW5nLCBsZW5ndGgsIGMsIHNiKTsKLQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBQYWQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aG91dCB2YWxpZGF0aW5nIHRoZSBwYXJtcy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZyb250UGFkT25fKGNoYXJbXSBzdHJpbmcsIGludCBsZW5ndGgsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlmaWxsXyhzdHJpbmcsIGxlbmd0aCwgYywgc2IpOwotCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VwYXJhdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzZXBhcmF0ZShTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCXJldHVybiAobGVuIDw9IHNlZ21lbnRTaXplKSA/IHN0cmluZyA6IG5ldyBTdHJpbmcoc2VwYXJhdGUoc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIGxlbikpOwotCX0KLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA8PSBzZWdtZW50U2l6ZSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlzZXBhcmF0ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc3RyaW5nLmxlbmd0aCgpIDw9IHNlZ21lbnRTaXplKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXNlcGFyYXRlT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VwYXJhdGVPbihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPD0gc2VnbWVudFNpemUpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJc2VwYXJhdGVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHNlcGFyYXRlKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCXJldHVybiAobGVuIDw9IHNlZ21lbnRTaXplKSA/IHN0cmluZyA6IHNlcGFyYXRlKHN0cmluZywgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uczogc3RyaW5nIGlzIGxvbmdlciB0aGFuIHNlZ21lbnQgc2l6ZTsgc2VnbWVudCBzaXplIGlzIHBvc2l0aXZlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHNlcGFyYXRlKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIGludCBsZW4pIHsKLQkJaW50IHJlc3VsdExlbiA9IGxlbiArIChsZW4gLyBzZWdtZW50U2l6ZSk7Ci0JCWlmICgobGVuICUgc2VnbWVudFNpemUpID09IDApIHsKLQkJCXJlc3VsdExlbi0tOyAgLy8gbm8gc2VwYXJhdG9yIGFmdGVyIHRoZSBmaW5hbCBzZWdtZW50IGlmIG5vdGhpbmcgZm9sbG93aW5nIGl0Ci0JCX0KLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW3Jlc3VsdExlbl07Ci0JCWludCBqID0gMDsKLQkJaW50IHNlZ0NvdW50ID0gMDsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCWlmIChzZWdDb3VudCA9PSBzZWdtZW50U2l6ZSkgewotCQkJCXJlc3VsdFtqKytdID0gc2VwYXJhdG9yOwotCQkJCXNlZ0NvdW50ID0gMDsKLQkJCX0KLQkJCXNlZ0NvdW50Kys7Ci0JCQlyZXN1bHRbaisrXSA9IGM7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXBhcmF0ZSB0aGUgc2VnbWVudHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogc2VwYXJhdG9yOjxwcmU+Ci0JICogICAgIHNlcGFyYXRlKCIwMTIzNDUiLCAnLScsIDIpID0+ICIwMS0yMy00NSIKLQkgKiA8L3ByZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2VwYXJhdGVPbihjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzZWdtZW50U2l6ZSA8PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWdtZW50IHNpemUgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHNlZ21lbnRTaXplKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzdHJpbmcubGVuZ3RoIDw9IHNlZ21lbnRTaXplKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXNlcGFyYXRlT25fKHN0cmluZywgc2VwYXJhdG9yLCBzZWdtZW50U2l6ZSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb25zOiBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gc2VnbWVudCBzaXplOyBzZWdtZW50IHNpemUgaXMgcG9zaXRpdmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNlcGFyYXRlT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IHNlZ0NvdW50ID0gMDsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCWlmIChzZWdDb3VudCA9PSBzZWdtZW50U2l6ZSkgewotCQkJCXdyaXRlQ2hhck9uKHNlcGFyYXRvciwgd3JpdGVyKTsKLQkJCQlzZWdDb3VudCA9IDA7Ci0JCQl9Ci0JCQlzZWdDb3VudCsrOwotCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc2VnbWVudFNpemUgPD0gMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VnbWVudCBzaXplIG11c3QgYmUgcG9zaXRpdmU6ICIgKyBzZWdtZW50U2l6ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoc3RyaW5nLmxlbmd0aCA8PSBzZWdtZW50U2l6ZSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXBhcmF0ZU9uXyhzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudFNpemUsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb25zOiBzdHJpbmcgaXMgbG9uZ2VyIHRoYW4gc2VnbWVudCBzaXplOyBzZWdtZW50IHNpemUgaXMgcG9zaXRpdmUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNlcGFyYXRlT25fKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgc2VnQ291bnQgPSAwOwotCQlmb3IgKGNoYXIgYyA6IHN0cmluZykgewotCQkJaWYgKHNlZ0NvdW50ID09IHNlZ21lbnRTaXplKSB7Ci0JCQkJc2IuYXBwZW5kKHNlcGFyYXRvcik7Ci0JCQkJc2VnQ291bnQgPSAwOwotCQkJfQotCQkJc2VnQ291bnQrKzsKLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlcGFyYXRlIHRoZSBzZWdtZW50cyBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBzZXBhcmF0b3I6PHByZT4KLQkgKiAgICAgc2VwYXJhdGUoIjAxMjM0NSIsICctJywgMikgPT4gIjAxLTIzLTQ1IgotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudFNpemUsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHNlZ21lbnRTaXplIDw9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlZ21lbnQgc2l6ZSBtdXN0IGJlIHBvc2l0aXZlOiAiICsgc2VnbWVudFNpemUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHN0cmluZy5sZW5ndGggPD0gc2VnbWVudFNpemUpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJc2VwYXJhdGVPbl8oc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRTaXplLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uczogc3RyaW5nIGlzIGxvbmdlciB0aGFuIHNlZ21lbnQgc2l6ZTsgc2VnbWVudCBzaXplIGlzIHBvc2l0aXZlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXBhcmF0ZU9uXyhjaGFyW10gc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRTaXplLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBzZWdDb3VudCA9IDA7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoc2VnQ291bnQgPT0gc2VnbWVudFNpemUpIHsKLQkJCQlzYi5hcHBlbmQoc2VwYXJhdG9yKTsKLQkJCQlzZWdDb3VudCA9IDA7Ci0JCQl9Ci0JCQlzZWdDb3VudCsrOwotCQkJc2IuYXBwZW5kKGMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlbGltaXRpbmcvcXVvdGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIGRlbGltaXQoc3RyaW5nLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcXVvdGVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcsIFFVT1RFLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiBhIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHF1b3RlKEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gZGVsaW1pdChzdHJpbmdzLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGltaXQoU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGVsaW1pdChzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1ZmZlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGRlbGltaXRlciwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLCBzYik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFN0cmluZz4gZGVsaW1pdChJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgbmV3IENoYXJTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gZGVsaW1pdChJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgbmV3IENoYXJTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhclN0cmluZ0RlbGltaXRlciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPiB7Ci0JCXByaXZhdGUgY2hhciBkZWxpbWl0ZXI7Ci0JCUNoYXJTdHJpbmdEZWxpbWl0ZXIoY2hhciBkZWxpbWl0ZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIHRoaXMuZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlbGltaXQoU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlcikgewotCQlpZiAoZGVsaW1pdGVyLmxlbmd0aCgpID09IDEpIHsKLQkJCXJldHVybiBkZWxpbWl0KHN0cmluZywgZGVsaW1pdGVyLmNoYXJBdCgwKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoZGVsaW1pdChzdHJpbmcudG9DaGFyQXJyYXkoKSwgZGVsaW1pdGVyLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSB7Ci0JCQlkZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIuY2hhckF0KDApLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLmNoYXJBdCgwKSwgc2IpOwotCQl9IGVsc2UgewotCQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZGVsaW1pdGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmIChkZWxpbWl0ZXIubGVuZ3RoKCkgPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLmNoYXJBdCgwKSwgc2IpOwotCQl9IGVsc2UgewotCQkJZGVsaW1pdE9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBkZWxpbWl0ZXIudG9DaGFyQXJyYXkoKSwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiBkZWxpbWl0KEl0ZXJhYmxlPFN0cmluZz4gc3RyaW5ncywgU3RyaW5nIGRlbGltaXRlcikgewotCQlyZXR1cm4gKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSA/Ci0JCQkJZGVsaW1pdChzdHJpbmdzLCBkZWxpbWl0ZXIuY2hhckF0KDApKSA6Ci0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIG5ldyBTdHJpbmdTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8U3RyaW5nPiBkZWxpbWl0KEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncywgU3RyaW5nIGRlbGltaXRlcikgewotCQlyZXR1cm4gKGRlbGltaXRlci5sZW5ndGgoKSA9PSAxKSA/Ci0JCQkJZGVsaW1pdChzdHJpbmdzLCBkZWxpbWl0ZXIuY2hhckF0KDApKSA6Ci0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIG5ldyBTdHJpbmdTdHJpbmdEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RyaW5nU3RyaW5nRGVsaW1pdGVyIGltcGxlbWVudHMgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IHsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVsaW1pdGVyOwotCQlTdHJpbmdTdHJpbmdEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVsaW1pdGVyID0gZGVsaW1pdGVyOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5kZWxpbWl0KHN0cmluZywgdGhpcy5kZWxpbWl0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGRvdWJsZSBxdW90ZXMuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIGRvdWJsZSBxdW90ZSBpbiB0aGUgc3RyaW5nIHdpdGggYW5vdGhlcgotCSAqIGRvdWJsZSBxdW90ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBxdW90ZShjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBkZWxpbWl0KHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggZG91YmxlIHF1b3Rlcy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgZG91YmxlIHF1b3RlIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBxdW90ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIKLQkgKiBkb3VibGUgcXVvdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHF1b3RlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlkZWxpbWl0T24oc3RyaW5nLCBRVU9URSwgc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3Mgd2l0aCBkb3VibGUgcXVvdGVzLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBkb3VibGUgcXVvdGUgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyCi0JICogZG91YmxlIHF1b3RlLgotCSAqLwotCS8vIGNhbm5vdCBuYW1lIG1ldGhvZCBzaW1wbHkgJ3F1b3RlJyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBxdW90ZUNoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBkZWxpbWl0Q2hhckFycmF5cyhzdHJpbmdzLCBRVU9URSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGRlbGltaXQoY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGggKyAyKTsKLQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKGRlbGltaXRlciwgd3JpdGVyKTsKLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGRlbGltaXRlciwgd3JpdGVyKTsKLQkJd3JpdGVDaGFyT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiB0aGUgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXIgZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxpbWl0T24oY2hhcltdIHN0cmluZywgY2hhciBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoYyk7Ci0JCX0KLQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdkZWxpbWl0JyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Y2hhcltdPiBkZWxpbWl0Q2hhckFycmF5cyhJdGVyYWJsZTxjaGFyW10+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJDaGFyQXJyYXlEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhCi0JICogY29weSBvZiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIHRoZSBkZWxpbWl0ZXIgaW4gYSBzdHJpbmcgd2l0aCBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdkZWxpbWl0JyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBkZWxpbWl0Q2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MsIGNoYXIgZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJDaGFyQXJyYXlEZWxpbWl0ZXIoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhckNoYXJBcnJheURlbGltaXRlciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPGNoYXJbXSwgY2hhcltdPiB7Ci0JCXByaXZhdGUgY2hhciBkZWxpbWl0ZXI7Ci0JCUNoYXJDaGFyQXJyYXlEZWxpbWl0ZXIoY2hhciBkZWxpbWl0ZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmRlbGltaXRlciA9IGRlbGltaXRlcjsKLQkJfQotCQlwdWJsaWMgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuZGVsaW1pdChzdHJpbmcsIHRoaXMuZGVsaW1pdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGltaXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcjsgaS5lLiBwdXQgYSBjb3B5IG9mCi0JICogdGhlIGRlbGltaXRlciBhdCB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcuCi0JICogRXNjYXBlIGFueSBvY2N1cnJlbmNlcyBvZiBhIHNpbmdsZS1jaGFyYWN0ZXIgZGVsaW1pdGVyIGluIHRoZSBzdHJpbmcgd2l0aAotCSAqIGFub3RoZXIgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGRlbGltaXQoY2hhcltdIHN0cmluZywgY2hhcltdIGRlbGltaXRlcikgewotCQlpbnQgZGVsaW1pdGVyTGVuZ3RoID0gZGVsaW1pdGVyLmxlbmd0aDsKLQkJaWYgKGRlbGltaXRlckxlbmd0aCA9PSAxKSB7Ci0JCQlyZXR1cm4gZGVsaW1pdChzdHJpbmcsIGRlbGltaXRlclswXSk7Ci0JCX0KLQkJaW50IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltzdHJpbmdMZW5ndGgrKDIqZGVsaW1pdGVyTGVuZ3RoKV07Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGVsaW1pdGVyLCAwLCByZXN1bHQsIDAsIGRlbGltaXRlckxlbmd0aCk7Ci0JCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIGRlbGltaXRlckxlbmd0aCwgc3RyaW5nTGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShkZWxpbWl0ZXIsIDAsIHJlc3VsdCwgc3RyaW5nTGVuZ3RoK2RlbGltaXRlckxlbmd0aCwgZGVsaW1pdGVyTGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJd3JpdGVTdHJpbmdPbihkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJCXdyaXRlU3RyaW5nT24oZGVsaW1pdGVyLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsaW1pdCB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsaW1pdGVyOyBpLmUuIHB1dCBhIGNvcHkgb2YKLQkgKiB0aGUgZGVsaW1pdGVyIGF0IHRoZSBmcm9udCBhbmQgYmFjayBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy4KLQkgKiBFc2NhcGUgYW55IG9jY3VycmVuY2VzIG9mIGEgc2luZ2xlLWNoYXJhY3RlciBkZWxpbWl0ZXIgaW4gdGhlIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBjaGFyW10gZGVsaW1pdGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEgY29weSBvZgotCSAqIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiB0aGUgc3RyaW5nIHdpdGgKLQkgKiBhbm90aGVyIGRlbGltaXRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIGNoYXJbXSBkZWxpbWl0ZXIsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKGRlbGltaXRlci5sZW5ndGggPT0gMSkgewotCQkJZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyWzBdLCBzYik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoZGVsaW1pdGVyKTsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQkJc2IuYXBwZW5kKGRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnZGVsaW1pdCcgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPGNoYXJbXT4gZGVsaW1pdENoYXJBcnJheXMoSXRlcmFibGU8Y2hhcltdPiBzdHJpbmdzLCBjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJBcnJheUNoYXJBcnJheURlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxpbWl0IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIHdpdGggdGhlIHNwZWNpZmllZCBkZWxpbWl0ZXI7IGkuZS4gcHV0IGEKLQkgKiBjb3B5IG9mIHRoZSBkZWxpbWl0ZXIgYXQgdGhlIGZyb250IGFuZCBiYWNrIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLgotCSAqIEVzY2FwZSBhbnkgb2NjdXJyZW5jZXMgb2YgYSBzaW5nbGUtY2hhcmFjdGVyIGRlbGltaXRlciBpbiBhIHN0cmluZyB3aXRoCi0JICogYW5vdGhlciBkZWxpbWl0ZXIuCi0JICovCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnZGVsaW1pdCcgYmVjYXVzZSBvZiB0eXBlLWVyYXN1cmUuLi4KLQlwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPGNoYXJbXT4gZGVsaW1pdENoYXJBcnJheXMoSXRlcmF0b3I8Y2hhcltdPiBzdHJpbmdzLCBjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgbmV3IENoYXJBcnJheUNoYXJBcnJheURlbGltaXRlcihkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDaGFyQXJyYXlDaGFyQXJyYXlEZWxpbWl0ZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxjaGFyW10sIGNoYXJbXT4gewotCQlwcml2YXRlIGNoYXJbXSBkZWxpbWl0ZXI7Ci0JCUNoYXJBcnJheUNoYXJBcnJheURlbGltaXRlcihjaGFyW10gZGVsaW1pdGVyKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCX0KLQkJcHVibGljIGNoYXJbXSB0cmFuc2Zvcm0oY2hhcltdIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCB0aGlzLmRlbGltaXRlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVsaW1pdGluZyBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHF1b3RlZDogIlwiZm9vXCIiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1F1b3RlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIFFVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBwYXJlbnRoZXRpY2FsOiAiKGZvbykiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1BhcmVudGhldGljYWwoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX1BBUkVOVEhFU0lTLCBDTE9TRV9QQVJFTlRIRVNJUyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2tldGVkOiAiW2Zvb10iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNrZXRlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0tFVCwgQ0xPU0VfQlJBQ0tFVCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgYnJhY2VkOiAie2Zvb30iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0JyYWNlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fQlJBQ0UsIENMT1NFX0JSQUNFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBjaGV2cm9uZWQ6ICI8Zm9vPiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQ2hldnJvbmVkKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9DSEVWUk9OLCBDTE9TRV9DSEVWUk9OKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBkZWxpbWl0ZWQgYnkgdGhlIHNwZWNpZmllZAotCSAqIGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHN0cmluZywgY2hhciBjKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIGMsIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHN0cmluZywgY2hhciBzdGFydCwgY2hhciBlbmQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA8IDIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLnRvQ2hhckFycmF5KCksIHN0YXJ0LCBlbmQsIGxlbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgcXVvdGVkOiAiXCJmb29cIiIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUXVvdGVkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgUVVPVEUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHBhcmVudGhldGljYWw6ICIoZm9vKSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzUGFyZW50aGV0aWNhbChjaGFyW10gc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmdJc0RlbGltaXRlZChzdHJpbmcsIE9QRU5fUEFSRU5USEVTSVMsIENMT1NFX1BBUkVOVEhFU0lTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFja2V0ZWQ6ICJbZm9vXSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2tldGVkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDS0VULCBDTE9TRV9CUkFDS0VUKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBicmFjZWQ6ICJ7Zm9vfSIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzQnJhY2VkKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgT1BFTl9CUkFDRSwgQ0xPU0VfQlJBQ0UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGNoZXZyb25lZDogIjxmb28+Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNDaGV2cm9uZWQoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBPUEVOX0NIRVZST04sIENMT1NFX0NIRVZST04pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGRlbGltaXRlZCBieSB0aGUgc3BlY2lmaWVkCi0JICogY2hhcmFjdGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJcmV0dXJuIHN0cmluZ0lzRGVsaW1pdGVkKHN0cmluZywgYywgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgZGVsaW1pdGVkIGJ5IHRoZSBzcGVjaWZpZWQKLQkgKiBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0RlbGltaXRlZChjaGFyW10gc3RyaW5nLCBjaGFyIHN0YXJ0LCBjaGFyIGVuZCkgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA8IDIpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNEZWxpbWl0ZWQoc3RyaW5nLCBzdGFydCwgZW5kLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNEZWxpbWl0ZWQoY2hhcltdIHMsIGNoYXIgc3RhcnQsIGNoYXIgZW5kLCBpbnQgbGVuKSB7Ci0JCXJldHVybiAoc1swXSA9PSBzdGFydCkgJiYgKHNbbGVuIC0gMV0gPT0gZW5kKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdW5kZWxpbWl0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZGVsaW1pdChTdHJpbmcgc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAyOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcodW5kZWxpbWl0XyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuZGVsaW1pdChTdHJpbmcgc3RyaW5nLCBpbnQgY291bnQpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKSAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIHN0cmluZyArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcodW5kZWxpbWl0KHN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIGNvdW50KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gdW5kZWxpbWl0KGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAyOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBFTVBUWV9DSEFSX0FSUkFZOwotCQl9Ci0JCXJldHVybiB1bmRlbGltaXRfKHN0cmluZywgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdW5kZWxpbWl0XyhjaGFyW10gc3RyaW5nLCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGgpOwotCQl1bmRlbGltaXRPbl8oc3RyaW5nLCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSB1bmRlbGltaXQoY2hhcltdIHN0cmluZywgaW50IGNvdW50KSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NIQVJfQVJSQVk7Ci0JCX0KLQkJcmV0dXJuIHVuZGVsaW1pdChzdHJpbmcsIGxlbiwgY291bnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB1bmRlbGltaXQoY2hhcltdIHN0cmluZywgaW50IGxlbiwgaW50IGNvdW50KSB7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgY291bnQsIHJlc3VsdCwgMCwgbGVuKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl1bmRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGludCBjb3VudCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgc3RyaW5nICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCBjb3VudCwgbGVuLCB3cml0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZGVsaW1pdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLCByZW1vdmluZyBhbnkgZXNjYXBlCi0JICogY2hhcmFjdGVycy4gVGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0Ci0JICogdG8gdW5kZWxpbWl0IChpLmUuIGxlbmd0aCA8IDIpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJdW5kZWxpbWl0T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IGFuZCBsYXN0IGNvdW50IGNoYXJhY3RlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZy4KLQkgKiBJZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydCB0byBiZSB1bmRlbGltaXRlZCwgdGhyb3cgYW4KLQkgKiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0JICogVXNlIHRoaXMgbWV0aG9kIHRvIHVuZGVsaW1pdCBzdHJpbmdzIHRoYXQgZG8gbm90IGVzY2FwZSBlbWJlZGRlZAotCSAqIGRlbGltaXRlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKFN0cmluZyBzdHJpbmcsIGludCBjb3VudCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGNvdW50ICsgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQl1bmRlbGltaXRPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oU3RyaW5nIHN0cmluZywgaW50IGNvdW50LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCkgLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBzdHJpbmcgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc2IuYXBwZW5kKHN0cmluZywgY291bnQsIGNvdW50ICsgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogc3RyaW5nIGlzIGF0IGxlYXN0IDMgY2hhcmFjdGVycyBsb25nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIGRlbGltaXRlciA9IHN0cmluZ1swXTsgIC8vIHRoZSBmaXJzdCBjaGFyIGlzIHRoZSBkZWxpbWl0ZXIKLQkJY2hhciBjID0gc3RyaW5nWzBdOwotCQljaGFyIG5leHQgPSBzdHJpbmdbMV07Ci0JCWludCBpID0gMTsKLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoIC0gMTsKLQkJZG8gewotCQkJYyA9IG5leHQ7Ci0JCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJaSsrOwotCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCWlmICgobmV4dCAhPSBkZWxpbWl0ZXIpIHx8IChpID09IGxhc3QpKSB7Ci0JCQkJCS8vIGFuIGVtYmVkZGVkIGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVsaW1pdGVyCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQl9Ci0JCX0gd2hpbGUgKGkgIT0gbGFzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBpbnQgY291bnQsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGggLSAoMiAqIGNvdW50KTsKLQkJaWYgKGxlbiA8IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgc3RyaW5nOiBcIiIgKyBuZXcgU3RyaW5nKHN0cmluZykgKyAnIicpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIGNvdW50LCBsZW4sIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBkZWxpbWl0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcsIHJlbW92aW5nIGFueSBlc2NhcGUKLQkgKiBjaGFyYWN0ZXJzLiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQKLQkgKiB0byB1bmRlbGltaXQgKGkuZS4gbGVuZ3RoIDwgMikuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdHJpbmcgaXMgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBkZWxpbWl0ZXIgPSBzdHJpbmdbMF07ICAvLyB0aGUgZmlyc3QgY2hhciBpcyB0aGUgZGVsaW1pdGVyCi0JCWNoYXIgYyA9IHN0cmluZ1swXTsKLQkJY2hhciBuZXh0ID0gc3RyaW5nWzFdOwotCQlpbnQgaSA9IDE7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWRvIHsKLQkJCWMgPSBuZXh0OwotCQkJc2IuYXBwZW5kKGMpOwotCQkJaSsrOwotCQkJbmV4dCA9IHN0cmluZ1tpXTsKLQkJCWlmIChjID09IGRlbGltaXRlcikgewotCQkJCWlmICgobmV4dCAhPSBkZWxpbWl0ZXIpIHx8IChpID09IGxhc3QpKSB7Ci0JCQkJCS8vIGFuIGVtYmVkZGVkIGRlbGltaXRlciBtdXN0IGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgZGVsaW1pdGVyCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaSsrOwotCQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQl9Ci0JCX0gd2hpbGUgKGkgIT0gbGFzdCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBhbmQgbGFzdCBjb3VudCBjaGFyYWN0ZXJzIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBpcyB0b28gc2hvcnQgdG8gYmUgdW5kZWxpbWl0ZWQsIHRocm93IGFuCi0JICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgotCSAqIFVzZSB0aGlzIG1ldGhvZCB0byB1bmRlbGltaXQgc3RyaW5ncyB0aGF0IGRvIG5vdCBlc2NhcGUgZW1iZWRkZWQKLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmRlbGltaXRPbihjaGFyW10gc3RyaW5nLCBpbnQgY291bnQsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtICgyICogY291bnQpOwotCQlpZiAobGVuIDwgMCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBzdHJpbmc6IFwiIiArIG5ldyBTdHJpbmcoc3RyaW5nKSArICciJyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlzYi5hcHBlbmQoc3RyaW5nLCBjb3VudCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGRlbGltaXRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZywgcmVtb3ZpbmcgYW55IGVzY2FwZQotCSAqIGNoYXJhY3RlcnMuIFRocm93IGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgc3RyaW5nIGlzIHRvbyBzaG9ydAotCSAqIHRvIHVuZGVsaW1pdCAoaS5lLiBsZW5ndGggPCAyKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCAtIDI7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXVuZGVsaW1pdE9uXyhzdHJpbmcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdHJpbmcgaXMgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzIGxvbmcKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuZGVsaW1pdE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXIgZGVsaW1pdGVyID0gc3RyaW5nWzBdOyAgLy8gdGhlIGZpcnN0IGNoYXIgaXMgdGhlIGRlbGltaXRlcgotCQljaGFyIGMgPSBzdHJpbmdbMF07Ci0JCWNoYXIgbmV4dCA9IHN0cmluZ1sxXTsKLQkJaW50IGkgPSAxOwotCQlpbnQgbGFzdCA9IHN0cmluZy5sZW5ndGggLSAxOwotCQlkbyB7Ci0JCQljID0gbmV4dDsKLQkJCXNiLmFwcGVuZChjKTsKLQkJCWkrKzsKLQkJCW5leHQgPSBzdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlpZiAoKG5leHQgIT0gZGVsaW1pdGVyKSB8fCAoaSA9PSBsYXN0KSkgewotCQkJCQkvLyBhbiBlbWJlZGRlZCBkZWxpbWl0ZXIgbXVzdCBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGRlbGltaXRlcgotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWkrKzsKLQkJCQluZXh0ID0gc3RyaW5nW2ldOwotCQkJfQotCQl9IHdoaWxlIChpICE9IGxhc3QpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3QgYW5kIGxhc3QgY291bnQgY2hhcmFjdGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIHNob3J0IHRvIGJlIHVuZGVsaW1pdGVkLCB0aHJvdyBhbgotCSAqIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4KLQkgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW5kZWxpbWl0IHN0cmluZ3MgdGhhdCBkbyBub3QgZXNjYXBlIGVtYmVkZGVkCi0JICogZGVsaW1pdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5kZWxpbWl0T24oY2hhcltdIHN0cmluZywgaW50IGNvdW50LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoIC0gKDIgKiBjb3VudCk7Ci0JCWlmIChsZW4gPCAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHN0cmluZzogXCIiICsgbmV3IFN0cmluZyhzdHJpbmcpICsgJyInKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXNiLmFwcGVuZChzdHJpbmcsIGNvdW50LCBsZW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmluZyBjaGFyYWN0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVGaXJzdE9jY3VycmVuY2UoY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgbm90IGZvdW5kCi0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJcmV0dXJuIHN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCX0KLQkJaW50IGxhc3QgPSBzdHJpbmcubGVuZ3RoKCkgLSAxOwotCQlpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBsYXN0KTsKLQkJfQotCQkvLyBjaGFyYWN0ZXIgZm91bmQgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2YgdGhlIHN0cmluZwotCQlyZXR1cm4gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkuY29uY2F0KHN0cmluZy5zdWJzdHJpbmcoaW5kZXggKyAxKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcHJpbnQgdGhlIHJlc3VsdCBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhciwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihTdHJpbmcgc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgaW5kZXggPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLnRvQ2hhckFycmF5KCksIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBpbmRleCA9IHN0cmluZy5pbmRleE9mKGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgaW5kZXgsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVGaXJzdE9jY3VycmVuY2UoY2hhcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlRmlyc3RPY2N1cnJlbmNlKGNoYXJbXSBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgbm90IGZvdW5kCi0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsYXN0XTsKLQkJaWYgKGluZGV4ID09IDApIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBhdCB0aGUgZnJvbnQgb2Ygc3RyaW5nCi0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cmluZywgMSwgcmVzdWx0LCAwLCBsYXN0KTsKLQkJfSBlbHNlIGlmIChpbmRleCA9PSBsYXN0KSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGVuZCBvZiBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGxhc3QpOwotCQl9IGVsc2UgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIHNvbWV3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzdHJpbmcKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCAwLCByZXN1bHQsIDAsIGluZGV4KTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc3RyaW5nLCBpbmRleCArIDEsIHJlc3VsdCwgaW5kZXgsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGluZGV4ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDaGFyQXRJbmRleE9uKHN0cmluZywgaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNoYXJBdEluZGV4T24oY2hhcltdIHN0cmluZywgaW50IGluZGV4LCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIDEsIGxhc3QsIHdyaXRlcik7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgbGFzdCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgaW5kZXgsIHdyaXRlcik7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgaW5kZXggKyAxLCBsYXN0IC0gaW5kZXgsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgaW5kZXggPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUNoYXJBdEluZGV4T24oc3RyaW5nLCBpbmRleCwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVDaGFyQXRJbmRleE9uKGNoYXJbXSBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMSwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBpbmRleCk7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBwcmludCB0aGUgcmVzdWx0IG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihjaGFyLCBTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBpbmRleCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQ2hhckF0SW5kZXhPbihzdHJpbmcsIGluZGV4LCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUNoYXJBdEluZGV4T24oY2hhcltdIHN0cmluZywgaW50IGluZGV4LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsYXN0ID0gc3RyaW5nLmxlbmd0aCAtIDE7Ci0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQkvLyBjaGFyYWN0ZXIgZm91bmQgYXQgdGhlIGZyb250IG9mIHN0cmluZwotCQkJc2IuYXBwZW5kKHN0cmluZywgMSwgbGFzdCk7Ci0JCX0gZWxzZSBpZiAoaW5kZXggPT0gbGFzdCkgewotCQkJLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2Ygc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBsYXN0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIGNoYXJhY3RlciBmb3VuZCBzb21ld2hlcmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RyaW5nCi0JCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBpbmRleCk7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nLCBpbmRleCArIDEsIGxhc3QgLSBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbE9jY3VycmVuY2VzKGNoYXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUFsbE9jY3VycmVuY2VzKFN0cmluZyBzdHJpbmcsIGNoYXIgYykgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiBuZXcgU3RyaW5nKHJlbW92ZUFsbE9jY3VycmVuY2VzXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyLCBXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oU3RyaW5nIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gc3RyaW5nLmluZGV4T2YoYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKGNoYXIsIFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uKFN0cmluZyBzdHJpbmcsIGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBzdHJpbmcuaW5kZXhPZihjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBjLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcgotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlcyhjaGFyW10gc3RyaW5nLCBjaGFyIGMpIHsKLQkJaW50IGZpcnN0ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogcmVtb3ZlQWxsT2NjdXJyZW5jZXNfKHN0cmluZywgYywgZmlyc3QpOwotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxPY2N1cnJlbmNlc18oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGgpOwotCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCBzYik7Ci0JCXJldHVybiBjb252ZXJ0VG9DaGFyQXJyYXkoc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgV3JpdGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGZpcnN0ID0gQXJyYXlUb29scy5pbmRleE9mKHN0cmluZywgYyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhzdHJpbmcsIGMsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXdyaXRlQ2hhck9uKGQsIHdyaXRlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihjaGFyW10gc3RyaW5nLCBjaGFyIGMsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgZmlyc3QgPSBBcnJheVRvb2xzLmluZGV4T2Yoc3RyaW5nLCBjKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbE9jY3VycmVuY2VzT25fKHN0cmluZywgYywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBtYXRjaGluZyBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oY2hhcltdIHN0cmluZywgY2hhciBjLCBpbnQgZmlyc3QsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXNiLmFwcGVuZChkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhciwgU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbE9jY3VycmVuY2VzT24oY2hhcltdIHN0cmluZywgY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IEFycmF5VG9vbHMuaW5kZXhPZihzdHJpbmcsIGMpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbl8oc3RyaW5nLCBjLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxPY2N1cnJlbmNlc09uXyhjaGFyW10gc3RyaW5nLCBjaGFyIGMsIGludCBmaXJzdCwgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoc3RyaW5nLCAwLCBmaXJzdCk7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBkID0gc3RyaW5nW2ldOwotCQkJaWYgKGQgIT0gYykgewotCQkJCXNiLmFwcGVuZChkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsU3BhY2VzKCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsU3BhY2VzKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgd3JpdGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxTcGFjZXNPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgc3BhY2VzCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1ZmZlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsU3BhY2VzT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBzdHJpbmcgYnVpbGRlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsU3BhY2VzT24oU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgc2IpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHNwYWNlcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsU3BhY2VzKCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gcmVtb3ZlQWxsU3BhY2VzKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIHJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgJyAnKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFNwYWNlc09uKFdyaXRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFNwYWNlc09uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJcmVtb3ZlQWxsT2NjdXJyZW5jZXNPbihzdHJpbmcsICcgJywgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsU3BhY2VzT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsU3BhY2VzT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBzcGFjZXMKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFNwYWNlc09uKFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxTcGFjZXNPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXJlbW92ZUFsbE9jY3VycmVuY2VzT24oc3RyaW5nLCAnICcsIHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxXaGl0ZXNwYWNlKCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlQWxsV2hpdGVzcGFjZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiBuZXcgU3RyaW5nKHJlbW92ZUFsbFdoaXRlc3BhY2VfKHN0cmluZzIsIGZpcnN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZzIsIGZpcnN0LCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSB3aGl0ZXNwYWNlCi0JICogZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhbGwgdGhlIHdoaXRlc3BhY2UgZnJvbSB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFdoaXRlc3BhY2UoKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogcmVtb3ZlQWxsV2hpdGVzcGFjZV8oc3RyaW5nLCBmaXJzdCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSByZW1vdmVBbGxXaGl0ZXNwYWNlXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cmluZy5sZW5ndGgpOwotCQlyZW1vdmVBbGxXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCB3cml0ZXIuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKCAhIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQWxsV2hpdGVzcGFjZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJc2IuYXBwZW5kKGMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCB0aGUgd2hpdGVzcGFjZQotCSAqIGZyb20gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKFN0cmluZ0J1aWxkZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCXJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHJlbW92ZUFsbFdoaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDAsIGZpcnN0KTsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSBmaXJzdDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzdHJpbmdbaV07Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKSkgewotCQkJCXNiLmFwcGVuZChjKTsKLQkJCX0KLQkJfQotCX0KLS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21wcmVzc1doaXRlc3BhY2UoKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wcmVzc1doaXRlc3BhY2UoU3RyaW5nIHN0cmluZykgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCXJldHVybiAoZmlyc3QgPT0gLTEpID8gc3RyaW5nIDogbmV3IFN0cmluZyhjb21wcmVzc1doaXRlc3BhY2VfKHN0cmluZzIsIGZpcnN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21wcmVzc1doaXRlc3BhY2VPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWNoYXJbXSBzdHJpbmcyID0gc3RyaW5nLnRvQ2hhckFycmF5KCk7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcyKTsKLQkJaWYgKGZpcnN0ID09IC0xKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbXByZXNzV2hpdGVzcGFjZU9uXyhzdHJpbmcyLCBmaXJzdCwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyLgotCSAqIFRoZSB3aGl0ZXNwYWNlIGlzIGNvbXByZXNzZWQgYnkgcmVwbGFjaW5nIGFueSBvY2N1cnJlbmNlIG9mIG9uZSBvciBtb3JlCi0JICogd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHdpdGggYSBzaW5nbGUgc3BhY2UuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZ0J1ZmZlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlCi0JICogaW4gdGhlIHNwZWNpZmllZCBzdHJpbmcgYW5kIGFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21wcmVzc1doaXRlc3BhY2VPbihTdHJpbmdCdWlsZGVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQljaGFyW10gc3RyaW5nMiA9IHN0cmluZy50b0NoYXJBcnJheSgpOwotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nMik7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nMiwgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXByZXNzIHRoZSB3aGl0ZXNwYWNlIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21wcmVzc1doaXRlc3BhY2UoKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb21wcmVzc1doaXRlc3BhY2UoY2hhcltdIHN0cmluZykgewotCQlpbnQgZmlyc3QgPSBpbmRleE9mV2hpdGVzcGFjZV8oc3RyaW5nKTsKLQkJcmV0dXJuIChmaXJzdCA9PSAtMSkgPyBzdHJpbmcgOiBjb21wcmVzc1doaXRlc3BhY2VfKHN0cmluZywgZmlyc3QpOwotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNvbXByZXNzV2hpdGVzcGFjZV8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0KSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmcubGVuZ3RoKTsKLQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHdyaXRlci4KLQkgKiBUaGUgd2hpdGVzcGFjZSBpcyBjb21wcmVzc2VkIGJ5IHJlcGxhY2luZyBhbnkgb2NjdXJyZW5jZSBvZiBvbmUgb3IgbW9yZQotCSAqIHdoaXRlc3BhY2UgY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21wcmVzc1doaXRlc3BhY2VPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXdyaXRlU3RyaW5nT24oc3RyaW5nLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgcGFzc2VkIGluLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT25fKGNoYXJbXSBzdHJpbmcsIGludCBmaXJzdCwgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMCwgZmlyc3QsIHdyaXRlcik7Ci0JCWJvb2xlYW4gc3BhY2VXcml0dGVuID0gZmFsc2U7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlmb3IgKGludCBpID0gZmlyc3Q7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gc3RyaW5nW2ldOwotCQkJaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIHsKLQkJCQlpZiAoc3BhY2VXcml0dGVuKSB7Ci0JCQkJCS8vIHNraXAgc3Vic2VxdWVudCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMKLQkJCQl9IGVsc2UgewotCQkJCQkvLyByZXBsYWNlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIHdpdGggYSBzcGFjZQotCQkJCQlzcGFjZVdyaXR0ZW4gPSB0cnVlOwotCQkJCQl3cml0ZUNoYXJPbignICcsIHdyaXRlcik7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJCQl3cml0ZUNoYXJPbihjLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHJlc3MgdGhlIHdoaXRlc3BhY2UKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIHN0cmluZyBhbmQgYXBwZW5kIHRoZSByZXN1bHQgdG8gdGhlCi0JICogc3BlY2lmaWVkIHN0cmluZyBidWZmZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29tcHJlc3NXaGl0ZXNwYWNlT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBmaXJzdCA9IGluZGV4T2ZXaGl0ZXNwYWNlXyhzdHJpbmcpOwotCQlpZiAoZmlyc3QgPT0gLTEpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJY29tcHJlc3NXaGl0ZXNwYWNlT25fKHN0cmluZywgZmlyc3QsIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciBpcyBwYXNzZWQgaW4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wcmVzc1doaXRlc3BhY2VPbl8oY2hhcltdIHN0cmluZywgaW50IGZpcnN0LCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlib29sZWFuIHNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJaWYgKHNwYWNlV3JpdHRlbikgewotCQkJCQkvLyBza2lwIHN1YnNlcXVlbnQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVwbGFjZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciB3aXRoIGEgc3BhY2UKLQkJCQkJc3BhY2VXcml0dGVuID0gdHJ1ZTsKLQkJCQkJc2IuYXBwZW5kKCcgJyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wcmVzcyB0aGUgd2hpdGVzcGFjZQotCSAqIGluIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIuCi0JICogVGhlIHdoaXRlc3BhY2UgaXMgY29tcHJlc3NlZCBieSByZXBsYWNpbmcgYW55IG9jY3VycmVuY2Ugb2Ygb25lIG9yIG1vcmUKLQkgKiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgd2l0aCBhIHNpbmdsZSBzcGFjZS4KLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcuY29tcHJlc3NXaGl0ZXNwYWNlT24oU3RyaW5nQnVpbGRlcikKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGZpcnN0ID0gaW5kZXhPZldoaXRlc3BhY2VfKHN0cmluZyk7Ci0JCWlmIChmaXJzdCA9PSAtMSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wcmVzc1doaXRlc3BhY2VPbl8oc3RyaW5nLCBmaXJzdCwgc2IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IHdoaXRlc3BhY2UgY2hhcmFjdGVyIGlzIHBhc3NlZCBpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbXByZXNzV2hpdGVzcGFjZU9uXyhjaGFyW10gc3RyaW5nLCBpbnQgZmlyc3QsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHN0cmluZywgMCwgZmlyc3QpOwotCQlib29sZWFuIHNwYWNlV3JpdHRlbiA9IGZhbHNlOwotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IGZpcnN0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0cmluZ1tpXTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKSB7Ci0JCQkJaWYgKHNwYWNlV3JpdHRlbikgewotCQkJCQkvLyBza2lwIHN1YnNlcXVlbnQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCi0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gcmVwbGFjZSBmaXJzdCB3aGl0ZXNwYWNlIGNoYXJhY3RlciB3aXRoIGEgc3BhY2UKLQkJCQkJc3BhY2VXcml0dGVuID0gdHJ1ZTsKLQkJCQkJc2IuYXBwZW5kKCcgJyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlzcGFjZVdyaXR0ZW4gPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29tbW9uIHByZWZpeCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aChzMS50b0NoYXJBcnJheSgpLCBzMi50b0NoYXJBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvbW1vblByZWZpeExlbmd0aChjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlyZXR1cm4gY29tbW9uUHJlZml4TGVuZ3RoXyhzMSwgczIsIE1hdGgubWluKHMxLmxlbmd0aCwgczIubGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmNvbW1vblByZWZpeExlbmd0aChTdHJpbmcsIGludCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tbW9uUHJlZml4TGVuZ3RoKFN0cmluZyBzMSwgU3RyaW5nIHMyLCBpbnQgbWF4KSB7Ci0JCXJldHVybiBjb21tb25QcmVmaXhMZW5ndGgoczEudG9DaGFyQXJyYXkoKSwgczIudG9DaGFyQXJyYXkoKSwgbWF4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgY29tbW9uIHByZWZpeCBzaGFyZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJpbmdzOwotCSAqIGJ1dCBsaW1pdCB0aGUgbGVuZ3RoIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGgoY2hhcltdIHMxLCBjaGFyW10gczIsIGludCBtYXgpIHsKLQkJcmV0dXJuIGNvbW1vblByZWZpeExlbmd0aF8oczEsIHMyLCBNYXRoLm1pbihtYXgsIE1hdGgubWluKHMxLmxlbmd0aCwgczIubGVuZ3RoKSkpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGNvbW1vbiBwcmVmaXggc2hhcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc3RyaW5nczsKLQkgKiBidXQgbGltaXQgdGhlIGxlbmd0aCB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0uIEFzc3VtZSB0aGUgc3BlY2lmaWVkCi0JICogbWF4aW11bSBpcyBsZXNzIHRoYW4gdGhlIGxlbmd0aHMgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBjb21tb25QcmVmaXhMZW5ndGhfKGNoYXJbXSBzMSwgY2hhcltdIHMyLCBpbnQgbWF4KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCWlmIChzMVtpXSAhPSBzMltpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7CS8vIGFsbCB0aGUgY2hhcmFjdGVycyB1cCB0byAnbWF4JyBhcmUgdGhlIHNhbWUKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FwaXRhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciBsb3dlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIGNhcGl0YWxpemVfKGNoYXJbXSBzdHJpbmcpIHsKLQkJc3RyaW5nWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aAotCSAqIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY2FwaXRhbGl6ZShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nLmxlbmd0aCA9PSAwKSB8fCBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gY2FwaXRhbGl6ZV8oc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jYXBpdGFsaXplKCkKLQkgKiA8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nLmxlbmd0aCgpID09IDApIHx8IENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjYXBpdGFsaXplXyhzdHJpbmcudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBlYWNoIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5ncywgY2FwaXRhbGl6aW5nIHRoZSBmaXJzdCBsZXR0ZXIgb2YKLQkgKiBlYWNoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8U3RyaW5nPiBjYXBpdGFsaXplKEl0ZXJhYmxlPFN0cmluZz4gc3RyaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHN0cmluZ3MsIFNUUklOR19DQVBJVEFMSVpFUik7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IGVhY2ggb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzLCBjYXBpdGFsaXppbmcgdGhlIGZpcnN0IGxldHRlciBvZgotCSAqIGVhY2guCi0JICovCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNhcGl0YWxpemUoSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIFN0cmluZz4oc3RyaW5ncywgU1RSSU5HX0NBUElUQUxJWkVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gU1RSSU5HX0NBUElUQUxJWkVSID0gbmV3IFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPigpIHsKLQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoc3RyaW5nKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBNb2RpZnkgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MsIGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyIG9mCi0JICogZWFjaC4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdjYXBpdGFsaXplJyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Y2hhcltdPiBjYXBpdGFsaXplQ2hhckFycmF5cyhJdGVyYWJsZTxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBDSEFSX0FSUkFZX0NBUElUQUxJWkVSKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RpZnkgZWFjaCBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MsIGNhcGl0YWxpemluZyB0aGUgZmlyc3QgbGV0dGVyIG9mCi0JICogZWFjaC4KLQkgKi8KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdjYXBpdGFsaXplJyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3I8Y2hhcltdPiBjYXBpdGFsaXplQ2hhckFycmF5cyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBDSEFSX0FSUkFZX0NBUElUQUxJWkVSKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFuc2Zvcm1lcjxjaGFyW10sIGNoYXJbXT4gQ0hBUl9BUlJBWV9DQVBJVEFMSVpFUiA9IG5ldyBUcmFuc2Zvcm1lcjxjaGFyW10sIGNoYXJbXT4oKSB7Ci0JCXB1YmxpYyBjaGFyW10gdHJhbnNmb3JtKGNoYXJbXSBzdHJpbmcpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5jYXBpdGFsaXplKHN0cmluZyk7Ci0JCX0KLQl9OwotCi0JLyoKLQkgKiBubyB6ZXJvLWxlbmd0aCBjaGVjayBvciB1cHBlciBjYXNlIGNoZWNrCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0cmluZ1swXSkpOwotCQlzYi5hcHBlbmQoc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMF0pKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNhcGl0YWxpemVkLgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy5jYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKFN0cmluZyBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmNhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQlzYi5hcHBlbmQoc3RyaW5nKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXdyaXRlQ2hhck9uKENoYXJhY3Rlci50b1VwcGVyQ2FzZShzdHJpbmdbMF0pLCB3cml0ZXIpOwotCQl3cml0ZVN0cmluZ09uKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEsIHdyaXRlcik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1ZmZlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjYXBpdGFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJaWYgKHN0cmluZy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nWzBdKSkgewotCQkJd3JpdGVTdHJpbmdPbihzdHJpbmcsIHdyaXRlcik7Ci0JCX0gZWxzZSB7Ci0JCQljYXBpdGFsaXplT25fKHN0cmluZywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY2FwaXRhbGl6ZWQuCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLmNhcGl0YWxpemVPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQlpZiAoc3RyaW5nLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZy5jaGFyQXQoMCkpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdW5jYXBpdGFsaXplXyhjaGFyW10gc3RyaW5nKSB7Ci0JCXN0cmluZ1swXSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pOwotCQlyZXR1cm4gc3RyaW5nOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHN0cmluZ1swXSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCS8vIGlmIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2hhcmFjdGVycyBhcmUgY2FwaXRhbGl6ZWQsCi0JCS8vIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZAotCQlpZiAoKHN0cmluZy5sZW5ndGggPiAxKQotCQkJCSYmIENoYXJhY3Rlci5pc1VwcGVyQ2FzZShzdHJpbmdbMV0pCi0JCQkJJiYgQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKHN0cmluZ1swXSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE1vZGlmeSBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHdpdGggaXRzCi0JICogZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhcltdIHVuY2FwaXRhbGl6ZShjaGFyW10gc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiB1bmNhcGl0YWxpemVfKHN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShzdHJpbmcuY2hhckF0KDApKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy8gaWYgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBjaGFyYWN0ZXJzIGFyZSBjYXBpdGFsaXplZCwKLQkJLy8gcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkCi0JCWlmICgoc3RyaW5nLmxlbmd0aCgpID4gMSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgxKSkKLQkJCQkmJiBDaGFyYWN0ZXIuaXNVcHBlckNhc2Uoc3RyaW5nLmNoYXJBdCgwKSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nLnVuY2FwaXRhbGl6ZSgpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuY2FwaXRhbGl6ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQlyZXR1cm4gc3RyaW5nOwotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nKHVuY2FwaXRhbGl6ZV8oc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHJpbmdbMF0pKTsKLQkJc2IuYXBwZW5kKHN0cmluZywgMSwgc3RyaW5nLmxlbmd0aCAtIDEpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWZmZXIKLQkgKiB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UuCi0JICogKFVubGVzcyBib3RoIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGxldHRlcnMgYXJlIHVwcGVyIGNhc2UsCi0JICogaW4gd2hpY2ggY2FzZSB0aGUgc3RyaW5nIGlzIHJldHVybmVkIHVuY2hhbmdlZC4pCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uKGNoYXJbXSBzdHJpbmcsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy51bmNhcGl0YWxpemVPbihTdHJpbmdCdWZmZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaWYgKHN0cmluZ05lZWROb3RCZVVuY2FwaXRhbGl6ZWRfKHN0cmluZykpIHsKLQkJCXNiLmFwcGVuZChzdHJpbmcpOwotCQl9IGVsc2UgewotCQkJdW5jYXBpdGFsaXplT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIG5vIHplcm8tbGVuZ3RoIGNoZWNrIG9yIGxvd2VyIGNhc2UgY2hlY2sKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHVuY2FwaXRhbGl6ZU9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc3RyaW5nWzBdKSk7Ci0JCXNiLmFwcGVuZChzdHJpbmcsIDEsIHN0cmluZy5sZW5ndGggLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcgotCSAqIHdpdGggaXRzIGZpcnN0IGxldHRlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZS4KLQkgKiAoVW5sZXNzIGJvdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgbGV0dGVycyBhcmUgdXBwZXIgY2FzZSwKLQkgKiBpbiB3aGljaCBjYXNlIHRoZSBzdHJpbmcgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLikKLQkgKiA8cD4KLQkgKiA8Y29kZT4KLQkgKiBTdHJpbmcudW5jYXBpdGFsaXplT24oU3RyaW5nQnVmZmVyKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT24oU3RyaW5nIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpZiAoc3RyaW5nTmVlZE5vdEJlVW5jYXBpdGFsaXplZF8oc3RyaW5nKSkgewotCQkJc2IuYXBwZW5kKHN0cmluZyk7Ci0JCX0gZWxzZSB7Ci0JCQl1bmNhcGl0YWxpemVPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gemVyby1sZW5ndGggY2hlY2sgb3IgdXBwZXIgY2FzZSBjaGVjawotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgdW5jYXBpdGFsaXplT25fKGNoYXJbXSBzdHJpbmcsIFdyaXRlciB3cml0ZXIpIHsKLQkJd3JpdGVDaGFyT24oQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHN0cmluZ1swXSksIHdyaXRlcik7Ci0JCXdyaXRlU3RyaW5nT24oc3RyaW5nLCAxLCBzdHJpbmcubGVuZ3RoIC0gMSwgd3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcsIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHNwZWNpZmllZCBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyCi0JICogd2l0aCBpdHMgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlLgotCSAqIChVbmxlc3MgYm90aCB0aGUgZmlyc3QgYW5kIHNlY29uZCBsZXR0ZXJzIGFyZSB1cHBlciBjYXNlLAotCSAqIGluIHdoaWNoIGNhc2UgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuKQotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZy51bmNhcGl0YWxpemVPbihXcml0ZXIpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB1bmNhcGl0YWxpemVPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmdOZWVkTm90QmVVbmNhcGl0YWxpemVkXyhzdHJpbmcpKSB7Ci0JCQl3cml0ZVN0cmluZ09uKHN0cmluZywgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCXVuY2FwaXRhbGl6ZU9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgd3JpdGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0b1N0cmluZygpIGhlbHBlciBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIGEgIkRhbGkgc3RhbmRhcmQiIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKSB0b1N0cmluZygpfSByZXN1bHQgZm9yCi0JICogdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246PHByZT4KLQkgKiAgICAgQ2xhc3NOYW1lWzAwLUYzLUVFLTQyXShhZGQnbCBpbmZvKQotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVG9TdHJpbmdGb3IoT2JqZWN0IG8sIE9iamVjdCBhZGRpdGlvbmFsSW5mbykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYXBwZW5kU2ltcGxlVG9TdHJpbmcoc2IsIG8pOwotCQlzYi5hcHBlbmQoJygnKTsKLQkJc2IuYXBwZW5kKGFkZGl0aW9uYWxJbmZvKTsKLQkJc2IuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgIkRhbGkgc3RhbmRhcmQiIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKSB0b1N0cmluZygpfSByZXN1bHQgZm9yCi0JICogdGhlIHNwZWNpZmllZCBvYmplY3Q6PHByZT4KLQkgKiAgICAgQ2xhc3NOYW1lWzAwLUYzLUVFLTQyXQotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkVG9TdHJpbmdGb3IoT2JqZWN0IG8pIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWFwcGVuZFNpbXBsZVRvU3RyaW5nKHNiLCBvKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgIkRhbGkgc3RhbmRhcmQiIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKSB0b1N0cmluZygpfSByZXN1bHQgZm9yCi0JICogdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBzdHJpbmcgYnVpbGRlcjo8cHJlPgotCSAqICAgICBDbGFzc05hbWVbMDAtRjMtRUUtNDJdCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZFNpbXBsZVRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IsIE9iamVjdCBvKSB7Ci0JCWFwcGVuZFRvU3RyaW5nQ2xhc3NOYW1lKHNiLCBvLmdldENsYXNzKCkpOwotCQlzYi5hcHBlbmQoJ1snKTsKLQkJc2VwYXJhdGVPbihidWlsZEhhc2hDb2RlKG8pLCAnLScsIDIsIHNiKTsKLQkJc2IuYXBwZW5kKCddJyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkSGFzaENvZGUoT2JqZWN0IG8pIHsKLQkJLy8gdXNlIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKE9iamVjdCksIHNpbmNlIE9iamVjdC5oYXNoQ29kZSgpIG1heSBiZSBvdmVycmlkZGVuCi0JCXJldHVybiB6ZXJvUGFkKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobykpLnRvVXBwZXJDYXNlKCksIDgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG5hbWUgc3VpdGFibGUgZm9yIGEgIkRhbGkgc3RhbmRhcmQiCi0JICoge0BsaW5rIE9iamVjdCN0b1N0cmluZygpIHRvU3RyaW5nKCl9IGltcGxlbWVudGF0aW9uLgotCSAqIHtAbGluayBDbGFzcyNnZXRTaW1wbGVOYW1lKCl9IGlzbid0IHF1aXRlIHVzZWZ1bCBlbm91Z2g6PHVsPgotCSAqIDxsaT5BbiA8ZW0+YW5vbnltb3VzPC9lbT4gY2xhc3MncyBzaW1wbGUgbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcuCi0JICogICAgIFJldHVybiB0aGUgIkRhbGkgc3RhbmRhcmQiIG5hbWUgb2YgdGhlIGFub255bW91cyBjbGFzcydzIHN1cGVyIGNsYXNzCi0JICogICAgIGluc3RlYWQsIHdoaWNoIGlzIGEgYml0IG1vcmUgaGVscGZ1bC4KLQkgKiA8bGk+QSA8ZW0+bWVtYmVyPC9lbT4gb3IgPGVtPmxvY2FsPC9lbT4gY2xhc3MncyBzaW1wbGUgbmFtZSBkb2VzIG5vdAotCSAqICAgICBpbmNsdWRlIGl0cyBjb250ZXh0LiBQcmVmaXggdGhlIGNsYXNzJ3Mgc2ltcGxlIG5hbWUgd2l0aCBpdHMKLQkgKiAgICAgZW5jbG9zaW5nIGNsYXNzJ3MgIkRhbGkgc3RhbmRhcmQiIG5hbWUuCi0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvU3RyaW5nQ2xhc3NOYW1lKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYXBwZW5kVG9TdHJpbmdDbGFzc05hbWUoc2IsIGphdmFDbGFzcyk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyBzdWl0YWJsZSBmb3IgYSA8ZW0+c2luZ2xldG9uPC9lbT47IHdoaWNoIGlzIHRoZSBzaW1wbGUKLQkgKiBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcywgc2luY2UgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkU2luZ2xldG9uVG9TdHJpbmcoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIGJ1aWxkVG9TdHJpbmdDbGFzc05hbWUoby5nZXRDbGFzcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgYSBuYW1lIHN1aXRhYmxlIGZvciBhICJEYWxpIHN0YW5kYXJkIgotCSAqIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKSB0b1N0cmluZygpfSBpbXBsZW1lbnRhdGlvbiB0byB0aGUgc3BlY2lmaWVkCi0JICogc3RyaW5nIGJ1aWxkZXIuCi0JICogQHNlZSAjYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShDbGFzcykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXBwZW5kVG9TdHJpbmdDbGFzc05hbWUoU3RyaW5nQnVpbGRlciBzYiwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCWlmIChqYXZhQ2xhc3MuaXNBbm9ueW1vdXNDbGFzcygpKSB7Ci0JCQlhcHBlbmRUb1N0cmluZ0NsYXNzTmFtZShzYiwgamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKSk7ICAvLyByZWN1cnNlCi0JCX0gZWxzZSB7Ci0JCQlDbGFzczw/PiBlbmNsb3NpbmdDbGFzcyA9IGphdmFDbGFzcy5nZXRFbmNsb3NpbmdDbGFzcygpOwotCQkJaWYgKGVuY2xvc2luZ0NsYXNzID09IG51bGwpIHsKLQkJCQlhcHBlbmRUb1N0cmluZ0NsYXNzTmFtZV8oc2IsIGphdmFDbGFzcyk7ICAvLyB0b3AtbGV2ZWwgY2xhc3MKLQkJCX0gZWxzZSB7Ci0JCQkJYXBwZW5kVG9TdHJpbmdDbGFzc05hbWUoc2IsIGVuY2xvc2luZ0NsYXNzKTsgIC8vIHJlY3Vyc2UKLQkJCQlzYi5hcHBlbmQoJy4nKTsKLQkJCQlzYi5hcHBlbmQoamF2YUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgdG9wLWxldmVsIGNsYXNzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRUb1N0cmluZ0NsYXNzTmFtZV8oU3RyaW5nQnVpbGRlciBzYiwgQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0cmluZyBmdWxsTmFtZSA9IGphdmFDbGFzcy5nZXROYW1lKCk7Ci0JCWludCBkb3QgPSBmdWxsTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoZG90ID09IC0xKSB7Ci0JCQlzYi5hcHBlbmQoZnVsbE5hbWUpOyAgLy8gImRlZmF1bHQiIHBhY2thZ2UKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChmdWxsTmFtZSwgZG90ICsgMSwgZnVsbE5hbWUubGVuZ3RoKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgYXJyYXkKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyOjxwcmU+Ci0JICogICAgIFsiZm9vIiwgImJhciIsICJiYXoiXQotCSAqIDwvcHJlPgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZ0J1aWxkZXIuYXBwZW5kKE9iamVjdFtdKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIFRbXSBhcnJheSkgewotCQlyZXR1cm4gYXBwZW5kKHNiLCBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8VD4oYXJyYXkpKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBlbmQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgdGhlIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYWJsZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGJ1aWxkZXI6PHByZT4KLQkgKiAgICAgWyJmb28iLCAiYmFyIiwgImJheiJdCi0JICogPC9wcmU+Ci0JICogPHA+Ci0JICogPGNvZGU+Ci0JICogU3RyaW5nQnVpbGRlci5hcHBlbmQoSXRlcmFibGUpCi0JICogPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFN0cmluZyBhcHBlbmQoU3RyaW5nQnVpbGRlciBzYiwgSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKLQkJcmV0dXJuIGFwcGVuZChzYiwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBvYmplY3RzIGluIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHN0cmluZyBidWlsZGVyOjxwcmU+Ci0JICogICAgIFsiZm9vIiwgImJhciIsICJiYXoiXQotCSAqIDwvcHJlPgotCSAqIDxwPgotCSAqIDxjb2RlPgotCSAqIFN0cmluZ0J1aWxkZXIuYXBwZW5kKEl0ZXJhdG9yKQotCSAqIDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCXNiLmFwcGVuZCgnWycpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlzYi5hcHBlbmQoaXRlcmF0b3IubmV4dCgpKTsKLQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlzYi5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzYi5hcHBlbmQoJ10nKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgPGNvZGU+bnVsbDwvY29kZT4sIGVtcHR5LCBvcgotCSAqIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aCgpOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0VtcHR5XyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZW1wdHksIG9yCi0JICogY29udGFpbnMgb25seSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzRW1wdHkoY2hhcltdIHN0cmluZykgewotCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBzdHJpbmdJc0VtcHR5XyhzdHJpbmcsIGxlbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc0VtcHR5XyhjaGFyW10gcywgaW50IGxlbikgewotCQlmb3IgKGludCBpID0gbGVuOyBpLS0gPiAwOyApIHsKLQkJCWlmICggISBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vbi08Y29kZT5udWxsPC9jb2RlPiwgbm9uLWVtcHR5LAotCSAqIGFuZCBkb2VzIG5vdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc05vdEVtcHR5KFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuICEgc3RyaW5nSXNFbXB0eShzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIG5vbi08Y29kZT5udWxsPC9jb2RlPiwgbm9uLWVtcHR5LAotCSAqIGFuZCBkb2VzIG5vdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc05vdEVtcHR5KGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuICEgc3RyaW5nSXNFbXB0eShzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwuCi0JICogQ2hlY2sgZm9yIDxjb2RlPm51bGw8L2NvZGU+cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChzMSwgczIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwuCi0JICogQ2hlY2sgZm9yIDxjb2RlPm51bGw8L2NvZGU+cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsKGNoYXJbXSBzMSwgY2hhcltdIHMyKSB7Ci0JCXJldHVybiAoczEgPT0gbnVsbCkgPwotCQkJCShzMiA9PSBudWxsKSA6Ci0JCQkJKChzMiAhPSBudWxsKSAmJiBzdHJpbmdzQXJlRXF1YWxfKHMxLCBzMikpOwotCX0KLQotCS8qKgotCSAqIG5vIDxjb2RlPm51bGw8L2NvZGU+IGNoZWNrcwotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsXyhjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlpbnQgbGVuID0gczEubGVuZ3RoOwotCQlpZiAobGVuICE9IHMyLmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKHMxW2ldICE9IHMyW2ldKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQ2hlY2sgZm9yIDxjb2RlPm51bGw8L2NvZGU+cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShTdHJpbmcgczEsIFN0cmluZyBzMikgewotCQlyZXR1cm4gKHMxID09IG51bGwpID8KLQkJCQkoczIgPT0gbnVsbCkgOgotCQkJCSgoczIgIT0gbnVsbCkgJiYgczEuZXF1YWxzSWdub3JlQ2FzZShzMikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5ncyBhcmUgZXF1YWwsIGlnbm9yaW5nIGNhc2UuCi0JICogQ2hlY2sgZm9yIDxjb2RlPm51bGw8L2NvZGU+cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZShjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlyZXR1cm4gKHMxID09IG51bGwpID8KLQkJCQkoczIgPT0gbnVsbCkgOgotCQkJCSgoczIgIT0gbnVsbCkgJiYgc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZV8oczEsIHMyKSk7Ci0JfQotCi0JLyoqCi0JICogbm8gPGNvZGU+bnVsbDwvY29kZT4gY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlXyhjaGFyW10gczEsIGNoYXJbXSBzMikgewotCQlpbnQgbGVuID0gczEubGVuZ3RoOwotCQlpZiAobGVuICE9IHMyLmxlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBsZW47IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoczFbaV0sIHMyW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwKLQkgKiBpZ25vcmluZyBjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZShjaGFyW10gc3RyaW5nLCBjaGFyW10gcHJlZml4KSB7Ci0JCWludCBwcmVmaXhMZW5ndGggPSBwcmVmaXgubGVuZ3RoOwotCQlpZiAoc3RyaW5nLmxlbmd0aCA8IHByZWZpeExlbmd0aCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZvciAoaW50IGkgPSBwcmVmaXhMZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKCAhIGNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2Uoc3RyaW5nW2ldLCBwcmVmaXhbaV0pKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LAotCSAqIGlnbm9yaW5nIGNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJcmV0dXJuIHN0cmluZy5yZWdpb25NYXRjaGVzKHRydWUsIDAsIHByZWZpeCwgMCwgcHJlZml4Lmxlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcnMgYXJlIGFyZSBlcXVhbCwgaWdub3JpbmcgY2FzZS4KLQkgKiBAc2VlIFN0cmluZyNyZWdpb25NYXRjaGVzKGJvb2xlYW4sIGludCwgU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZShjaGFyIGMxLCBjaGFyIGMyKSB7Ci0JCS8vICBzb21ldGhpbmcgYWJvdXQgdGhlIEdlb3JnaWFuIGFscGhhYmV0IHJlcXVpcmVzIHVzIHRvIGNoZWNrIGxvd2VyIGNhc2UgYWxzbwotCQlyZXR1cm4gKGMxID09IGMyKQotCQkJCXx8IChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQkJfHwgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBzdHJpbmcgaXMgdXBwZXJjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdHJpbmdJc1VwcGVyY2FzZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiAoc3RyaW5nLmxlbmd0aCgpID09IDApID8gZmFsc2UgOiBzdHJpbmdJc1VwcGVyY2FzZV8oc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyB1cHBlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzVXBwZXJjYXNlKGNoYXJbXSBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoID09IDApID8gZmFsc2UgOiBzdHJpbmdJc1VwcGVyY2FzZV8obmV3IFN0cmluZyhzdHJpbmcpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzVXBwZXJjYXNlXyhTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcuZXF1YWxzKHN0cmluZy50b1VwcGVyQ2FzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBsb3dlcmNhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHN0cmluZ0lzTG93ZXJjYXNlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzTG93ZXJjYXNlXyhzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIGxvd2VyY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMb3dlcmNhc2UoY2hhcltdIHN0cmluZykgewotCQlyZXR1cm4gKHN0cmluZy5sZW5ndGggPT0gMCkgPyBmYWxzZSA6IHN0cmluZ0lzTG93ZXJjYXNlXyhuZXcgU3RyaW5nKHN0cmluZykpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNMb3dlcmNhc2VfKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZy5lcXVhbHMoc3RyaW5nLnRvTG93ZXJDYXNlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IGNhbWVsIGNhc2UgdG8gYWxsIGNhcHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhTdHJpbmcgY2FtZWxDYXNlU3RyaW5nKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIGNhbWVsQ2FzZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZywgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbikgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICogMik7Ci0JCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbGVuLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbjsgaSsrKSB7CS8vIE5COiBzdGFydCBhdCAxIGFuZCBlbmQgYXQgbGVuIQotCQkJYyA9IG5leHQ7Ci0JCQluZXh0ID0gKChpID09IGxlbikgPyAwIDogY2FtZWxDYXNlU3RyaW5nW2ldKTsKLQkJCWlmIChjYW1lbENhc2VXb3JkQnJlYWtfKHByZXYsIGMsIG5leHQpKSB7Ci0JCQkJc2IuYXBwZW5kKCdfJyk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpKTsKLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2FtZWxDYXNlU3RyaW5nLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IGxlbiwgV3JpdGVyIHdyaXRlcikgewotCQljaGFyIHByZXYgPSAwOwkvLyBhc3N1bWUgMCBpcyBub3QgYSB2YWxpZCBjaGFyCi0JCWNoYXIgYyA9IDA7Ci0JCWNoYXIgbmV4dCA9IGNhbWVsQ2FzZVN0cmluZ1swXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbGVuOyBpKyspIHsJLy8gTkI6IHN0YXJ0IGF0IDEgYW5kIGVuZCBhdCBsZW4hCi0JCQljID0gbmV4dDsKLQkJCW5leHQgPSAoKGkgPT0gbGVuKSA/IDAgOiBjYW1lbENhc2VTdHJpbmdbaV0pOwotCQkJaWYgKGNhbWVsQ2FzZVdvcmRCcmVha18ocHJldiwgYywgbmV4dCkpIHsKLQkJCQl3cml0ZUNoYXJPbignXycsIHdyaXRlcik7Ci0JCQl9Ci0JCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQlwcmV2ID0gYzsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcyhTdHJpbmcgY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmICgobGVuID09IDApIHx8IChtYXhMZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdHJpbmcoY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc18oY2FtZWxDYXNlU3RyaW5nLnRvQ2hhckFycmF5KCksIG1heExlbmd0aCwgbGVuKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGg7Ci0JCWlmICgobGVuID09IDApIHx8IChtYXhMZW5ndGggPT0gMCkpIHsKLQkJCXJldHVybiBjYW1lbENhc2VTdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNfKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihtYXhMZW5ndGgpOwotCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJcmV0dXJuIGNvbnZlcnRUb0NoYXJBcnJheShzYik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aCgpOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZy50b0NoYXJBcnJheSgpLCBtYXhMZW5ndGgsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1ZmZlciBzYikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbl8oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgaW50IGxlbiwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAiY2FtZWwgY2FzZSIgc3RyaW5nIHRvIGFuICJhbGwgY2FwcyIgc3RyaW5nOgotCSAqICJsYXJnZVByb2plY3QiIC0+ICJMQVJHRV9QUk9KRUNUIgotCSAqIExpbWl0IHRoZSByZXN1bHRpbmcgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBsZW5ndGguCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBjYW1lbENhc2VTdHJpbmcubGVuZ3RoOwotCQlpZiAoKGxlbiAhPSAwKSAmJiAobWF4TGVuZ3RoICE9IDApKSB7Ci0JCQljb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNhbWVsQ2FzZVN0cmluZywgbWF4TGVuZ3RoLCBsZW4sIHNiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjaGFyW10gY2FtZWxDYXNlU3RyaW5nLCBpbnQgbWF4TGVuZ3RoLCBpbnQgbGVuLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWNoYXIgcHJldiA9IDA7CS8vIGFzc3VtZSAwIGlzIG5vdCBhIHZhbGlkIGNoYXIKLQkJY2hhciBjID0gMDsKLQkJY2hhciBuZXh0ID0gY2FtZWxDYXNlU3RyaW5nWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXNiLmFwcGVuZCgnXycpOwotCQkJCWlmIChzYi5sZW5ndGgoKSA9PSBtYXhMZW5ndGgpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykpOwotCQkJaWYgKHNiLmxlbmd0aCgpID09IG1heExlbmd0aCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCXByZXYgPSBjOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJjYW1lbCBjYXNlIiBzdHJpbmcgdG8gYW4gImFsbCBjYXBzIiBzdHJpbmc6Ci0JICogImxhcmdlUHJvamVjdCIgLT4gIkxBUkdFX1BST0pFQ1QiCi0JICogTGltaXQgdGhlIHJlc3VsdGluZyBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBtYXhpbXVtIGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uKFN0cmluZyBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IGNhbWVsQ2FzZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcudG9DaGFyQXJyYXkoKSwgbWF4TGVuZ3RoLCBsZW4sIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgImNhbWVsIGNhc2UiIHN0cmluZyB0byBhbiAiYWxsIGNhcHMiIHN0cmluZzoKLQkgKiAibGFyZ2VQcm9qZWN0IiAtPiAiTEFSR0VfUFJPSkVDVCIKLQkgKiBMaW1pdCB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byB0aGUgc3BlY2lmaWVkIG1heGltdW0gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oY2hhcltdIGNhbWVsQ2FzZVN0cmluZywgaW50IG1heExlbmd0aCwgV3JpdGVyIHdyaXRlcikgewotCQlpbnQgbGVuID0gY2FtZWxDYXNlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKChsZW4gIT0gMCkgJiYgKG1heExlbmd0aCAhPSAwKSkgewotCQkJY29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uXyhjYW1lbENhc2VTdHJpbmcsIG1heExlbmd0aCwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25fKGNoYXJbXSBjYW1lbENhc2VTdHJpbmcsIGludCBtYXhMZW5ndGgsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsJLy8gYXNzdW1lIDAgaXMgbm90IGEgdmFsaWQgY2hhcgotCQljaGFyIGMgPSAwOwotCQljaGFyIG5leHQgPSBjYW1lbENhc2VTdHJpbmdbMF07Ci0JCWludCB3cml0ZXJMZW5ndGggPSAwOwotCQlmb3IgKGludCBpID0gMTsgaSA8PSBsZW47IGkrKykgewkvLyBOQjogc3RhcnQgYXQgMSBhbmQgZW5kIGF0IGxlbiEKLQkJCWMgPSBuZXh0OwotCQkJbmV4dCA9ICgoaSA9PSBsZW4pID8gMCA6IGNhbWVsQ2FzZVN0cmluZ1tpXSk7Ci0JCQlpZiAoY2FtZWxDYXNlV29yZEJyZWFrXyhwcmV2LCBjLCBuZXh0KSkgewotCQkJCXdyaXRlQ2hhck9uKCdfJywgd3JpdGVyKTsKLQkJCQlpZiAoKyt3cml0ZXJMZW5ndGggPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQl3cml0ZUNoYXJPbihDaGFyYWN0ZXIudG9VcHBlckNhc2UoYyksIHdyaXRlcik7Ci0JCQlpZiAoKyt3cml0ZXJMZW5ndGggPT0gbWF4TGVuZ3RoKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcHJldiA9IGM7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc2VyaWVzIG9mIGNoYXJhY3RlcnMgb2NjdXIgYXQKLQkgKiBhICJjYW1lbCBjYXNlIiB3b3JrIGJyZWFrOgotCSAqICAgICAiKmFhIiAtPiBmYWxzZQotCSAqICAgICAiKkFBIiAtPiBmYWxzZQotCSAqICAgICAiKkFhIiAtPiBmYWxzZQotCSAqICAgICAiQWFBIiAtPiBmYWxzZQotCSAqICAgICAiQUFBIiAtPiBmYWxzZQotCSAqICAgICAiYWEqIiAtPiBmYWxzZQotCSAqICAgICAiQWFBIiAtPiBmYWxzZQotCSAqICAgICAiYUFhIiAtPiB0cnVlCi0JICogICAgICJBQSoiIC0+IGZhbHNlCi0JICogICAgICJBQWEiIC0+IHRydWUKLQkgKiB3aGVyZSAnKicgPT0gYW55IGNoYXIKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbWVsQ2FzZVdvcmRCcmVha18oY2hhciBwcmV2LCBjaGFyIGMsIGNoYXIgbmV4dCkgewotCQlpZiAocHJldiA9PSAwKSB7CS8vIHN0YXJ0IG9mIHN0cmluZwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHByZXYpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAobmV4dCA9PSAwKSB7CS8vIGVuZCBvZiBzdHJpbmcKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKG5leHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IHVuZGVyc2NvcmVzIHRvIGNhbWVsIGNhc2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAiTGFyZ2VQcm9qZWN0IgotCSAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShTdHJpbmcgdW5kZXJzY29yZVN0cmluZykgewotCQlyZXR1cm4gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UodW5kZXJzY29yZVN0cmluZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAiTGFyZ2VQcm9qZWN0IgotCSAqIENhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjaGFyW10gdW5kZXJzY29yZVN0cmluZykgewotCQlyZXR1cm4gY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UodW5kZXJzY29yZVN0cmluZywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdW5kZXJzY29yZVN0cmluZzsKLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZV8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbikpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNoYXJbXSBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuID09IDApIHsKLQkJCXJldHVybiB1bmRlcnNjb3JlU3RyaW5nOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZV8odW5kZXJzY29yZVN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBsZW4pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNoYXJbXSBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZV8oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBpbnQgbGVuKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4pOwotCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQlyZXR1cm4gY29udmVydFRvQ2hhckFycmF5KHNiKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oU3RyaW5nIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKGNoYXJbXSB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFN0cmluZ0J1ZmZlciBzYikgewotCQljaGFyIHByZXYgPSAwOwotCQljaGFyIGMgPSAwOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJcHJldiA9IGM7Ci0JCQljID0gdW5kZXJzY29yZVN0cmluZ1tpXTsKLQkJCWlmIChjID09ICdfJykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGZpcnN0KSB7Ci0JCQkJZmlyc3QgPSBmYWxzZTsKLQkJCQlzYi5hcHBlbmQoY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKChwcmV2ID09ICdfJykgPyBDaGFyYWN0ZXIudG9VcHBlckNhc2UoYykgOiBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkICJ1bmRlcnNjb3JlIiBzdHJpbmcgdG8gYSAiY2FtZWwgY2FzZSIgc3RyaW5nOgotCSAqICJMQVJHRV9QUk9KRUNUIiAtPiAibGFyZ2VQcm9qZWN0IgotCSAqIE9wdGlvbmFsbHkgY2FwaXRhbGl6ZSB0aGUgZmlyc3QgbGV0dGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKFN0cmluZyB1bmRlcnNjb3JlU3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlciwgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gdW5kZXJzY29yZVN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLnRvQ2hhckFycmF5KCksIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCBzYik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgInVuZGVyc2NvcmUiIHN0cmluZyB0byBhICJjYW1lbCBjYXNlIiBzdHJpbmc6Ci0JICogIkxBUkdFX1BST0pFQ1QiIC0+ICJsYXJnZVByb2plY3QiCi0JICogT3B0aW9uYWxseSBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oY2hhcltdIHVuZGVyc2NvcmVTdHJpbmcsIGJvb2xlYW4gY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSB1bmRlcnNjb3JlU3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQljb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyh1bmRlcnNjb3JlU3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgc2IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJc2IuYXBwZW5kKGNhcGl0YWxpemVGaXJzdExldHRlciA/IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjKSA6IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjKSk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZCgocHJldiA9PSAnXycpID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihTdHJpbmcgdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gIT0gMCkgewotCQkJY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbl8odW5kZXJzY29yZVN0cmluZy50b0NoYXJBcnJheSgpLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGxlbiwgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAidW5kZXJzY29yZSIgc3RyaW5nIHRvIGEgImNhbWVsIGNhc2UiIHN0cmluZzoKLQkgKiAiTEFSR0VfUFJPSkVDVCIgLT4gImxhcmdlUHJvamVjdCIKLQkgKiBPcHRpb25hbGx5IGNhcGl0YWxpemUgdGhlIGZpcnN0IGxldHRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbihjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIFdyaXRlciB3cml0ZXIpIHsKLQkJaW50IGxlbiA9IHVuZGVyc2NvcmVTdHJpbmcubGVuZ3RoOwotCQlpZiAobGVuICE9IDApIHsKLQkJCWNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25fKHVuZGVyc2NvcmVTdHJpbmcsIGNhcGl0YWxpemVGaXJzdExldHRlciwgbGVuLCB3cml0ZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uXyhjaGFyW10gdW5kZXJzY29yZVN0cmluZywgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJY2hhciBwcmV2ID0gMDsKLQkJY2hhciBjID0gMDsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCXByZXYgPSBjOwotCQkJYyA9IHVuZGVyc2NvcmVTdHJpbmdbaV07Ci0JCQlpZiAoYyA9PSAnXycpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmaXJzdCkgewotCQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQkJd3JpdGVDaGFyT24oY2FwaXRhbGl6ZUZpcnN0TGV0dGVyID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJfSBlbHNlIHsKLQkJCQl3cml0ZUNoYXJPbigocHJldiA9PSAnXycpID8gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpIDogQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMpLCB3cml0ZXIpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdG8gSmF2YSBzdHJpbmcgbGl0ZXJhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMID0gIlwiXCIiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhcltdIEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUxfQ0hBUl9BUlJBWSA9IEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwudG9DaGFyQXJyYXkoKTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKFN0cmluZyBzdHJpbmcpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTDsKLQkJfQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIobGVuICsgNSk7Ci0JCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZy50b0NoYXJBcnJheSgpLCBzYiwgbGVuKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjaGFyW10gY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoY2hhcltdIHN0cmluZykgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTF9DSEFSX0FSUkFZOwotCQl9Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4gKyA1KTsKLQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCBzYiwgbGVuKTsKLQkJbGVuID0gc2IubGVuZ3RoKCk7Ci0JCWNoYXJbXSByZXN1bHQgPSBuZXcgY2hhcltsZW5dOwotCQlzYi5nZXRDaGFycygwLCBsZW4sIHJlc3VsdCwgMCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyhJdGVyYWJsZTxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBTVFJJTkdfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyhJdGVyYXRvcjxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFN0cmluZywgU3RyaW5nPihzdHJpbmdzLCBTVFJJTkdfVE9fSkFWQV9TVFJJTkdfTElURVJBTF9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IFNUUklOR19UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSID0gbmV3IFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPigpIHsKLQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHN0cmluZykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKHN0cmluZyk7Ci0JCX0KLQl9OwotCi0JLy8gY2Fubm90IG5hbWUgbWV0aG9kIHNpbXBseSAnY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzJyBiZWNhdXNlIG9mIHR5cGUtZXJhc3VyZS4uLgotCXB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Y2hhcltdPiBjb252ZXJ0VG9KYXZhQ2hhckFycmF5TGl0ZXJhbHMoSXRlcmFibGU8Y2hhcltdPiBzdHJpbmdzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxjaGFyW10sIGNoYXJbXT4oc3RyaW5ncywgQ0hBUl9BUlJBWV9UT19KQVZBX1NUUklOR19MSVRFUkFMX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQkvLyBjYW5ub3QgbmFtZSBtZXRob2Qgc2ltcGx5ICdjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMnIGJlY2F1c2Ugb2YgdHlwZS1lcmFzdXJlLi4uCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxjaGFyW10+IGNvbnZlcnRUb0phdmFDaGFyQXJyYXlMaXRlcmFscyhJdGVyYXRvcjxjaGFyW10+IHN0cmluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPGNoYXJbXSwgY2hhcltdPihzdHJpbmdzLCBDSEFSX0FSUkFZX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zZm9ybWVyPGNoYXJbXSwgY2hhcltdPiBDSEFSX0FSUkFZX1RPX0pBVkFfU1RSSU5HX0xJVEVSQUxfVFJBTlNGT1JNRVIgPSBuZXcgVHJhbnNmb3JtZXI8Y2hhcltdLCBjaGFyW10+KCkgewotCQlwdWJsaWMgY2hhcltdIHRyYW5zZm9ybShjaGFyW10gc3RyaW5nKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoc3RyaW5nKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2IsIGxlbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJc2IuYXBwZW5kKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLCBzYiwgbGVuKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gbGVuZ3RoIGNoZWNrcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oY2hhcltdIHN0cmluZywgU3RyaW5nQnVmZmVyIHNiLCBpbnQgbGVuKSB7Ci0JCXNiLmVuc3VyZUNhcGFjaXR5KHNiLmxlbmd0aCgpICsgbGVuICsgNSk7Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdcYic6ICAvLyBiYWNrc3BhY2UKLQkJCQkJc2IuYXBwZW5kKCJcXGIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHQnOiAgLy8gaG9yaXpvbnRhbCB0YWIKLQkJCQkJc2IuYXBwZW5kKCJcXHQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nOiAgLy8gbGluZS1mZWVkIExGCi0JCQkJCXNiLmFwcGVuZCgiXFxuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xmJzogIC8vIGZvcm0tZmVlZCBGRgotCQkJCQlzYi5hcHBlbmQoIlxcZiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdccic6ICAvLyBjYXJyaWFnZS1yZXR1cm4gQ1IKLQkJCQkJc2IuYXBwZW5kKCJcXHIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6ICAvLyBkb3VibGUtcXVvdGUKLQkJCQkJc2IuYXBwZW5kKCJcXFwiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotLy8JCQkJY2FzZSAnXCcnOiAgLy8gc2luZ2xlLXF1b3RlCi0vLwkJCQkJc2IuYXBwZW5kKCJcXCciKTsgIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlicmVhazsKLQkJCQljYXNlICdcXCc6ICAvLyBiYWNrc2xhc2gKLQkJCQkJc2IuYXBwZW5kKCJcXFxcIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNiLmFwcGVuZChjKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihTdHJpbmcgc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzdHJpbmcubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJc2IuYXBwZW5kKEVNUFRZX0pBVkFfU1RSSU5HX0xJVEVSQUwpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24oY2hhcltdIHN0cmluZywgU3RyaW5nQnVpbGRlciBzYikgewotCQlpbnQgbGVuID0gc3RyaW5nLmxlbmd0aDsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlzYi5hcHBlbmQoRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCk7Ci0JCX0gZWxzZSB7Ci0JCQljb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhzdHJpbmcsIHNiLCBsZW4pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBubyBsZW5ndGggY2hlY2tzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uXyhjaGFyW10gc3RyaW5nLCBTdHJpbmdCdWlsZGVyIHNiLCBpbnQgbGVuKSB7Ci0JCXNiLmVuc3VyZUNhcGFjaXR5KHNiLmxlbmd0aCgpICsgbGVuICsgNSk7Ci0JCXNiLmFwcGVuZChRVU9URSk7Ci0JCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICdcYic6ICAvLyBiYWNrc3BhY2UKLQkJCQkJc2IuYXBwZW5kKCJcXGIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXHQnOiAgLy8gaG9yaXpvbnRhbCB0YWIKLQkJCQkJc2IuYXBwZW5kKCJcXHQiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXG4nOiAgLy8gbGluZS1mZWVkIExGCi0JCQkJCXNiLmFwcGVuZCgiXFxuIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xmJzogIC8vIGZvcm0tZmVlZCBGRgotCQkJCQlzYi5hcHBlbmQoIlxcZiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdccic6ICAvLyBjYXJyaWFnZS1yZXR1cm4gQ1IKLQkJCQkJc2IuYXBwZW5kKCJcXHIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnIic6ICAvLyBkb3VibGUtcXVvdGUKLQkJCQkJc2IuYXBwZW5kKCJcXFwiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotLy8JCQkJY2FzZSAnXCcnOiAgLy8gc2luZ2xlLXF1b3RlCi0vLwkJCQkJc2IuYXBwZW5kKCJcXCciKTsgIC8vJE5PTi1OTFMtMSQKLS8vCQkJCQlicmVhazsKLQkJCQljYXNlICdcXCc6ICAvLyBiYWNrc2xhc2gKLQkJCQkJc2IuYXBwZW5kKCJcXFxcIik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXNiLmFwcGVuZChjKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJc2IuYXBwZW5kKFFVT1RFKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihTdHJpbmcgc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoKCkgPT0gMCkgewotCQkJd3JpdGVTdHJpbmdPbihFTVBUWV9KQVZBX1NUUklOR19MSVRFUkFMLCB3cml0ZXIpOwotCQl9IGVsc2UgewotCQkJY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oc3RyaW5nLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihjaGFyW10gc3RyaW5nLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCWlmIChzdHJpbmcubGVuZ3RoID09IDApIHsKLQkJCXdyaXRlU3RyaW5nT24oRU1QVFlfSkFWQV9TVFJJTkdfTElURVJBTCwgd3JpdGVyKTsKLQkJfSBlbHNlIHsKLQkJCWNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25fKHN0cmluZywgd3JpdGVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogbm8gbGVuZ3RoIGNoZWNrcwotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbl8oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl3cml0ZUNoYXJPbihRVU9URSwgd3JpdGVyKTsKLQkJZm9yIChjaGFyIGMgOiBzdHJpbmcpIHsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJ1xiJzogIC8vIGJhY2tzcGFjZQotCQkJCQl3cml0ZVN0cmluZ09uKCJcXGIiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcdCc6ICAvLyBob3Jpem9udGFsIHRhYgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXHQiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICdcbic6ICAvLyBsaW5lLWZlZWQgTEYKLQkJCQkJd3JpdGVTdHJpbmdPbigiXFxuIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnXGYnOiAgLy8gZm9ybS1mZWVkIEZGCi0JCQkJCXdyaXRlU3RyaW5nT24oIlxcZiIsIHdyaXRlcik7ICAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xyJzogIC8vIGNhcnJpYWdlLXJldHVybiBDUgotCQkJCQl3cml0ZVN0cmluZ09uKCJcXHIiLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICciJzogIC8vIGRvdWJsZS1xdW90ZQotCQkJCQl3cml0ZVN0cmluZ09uKCJcXFwiIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0vLwkJCQljYXNlICdcJyc6ICAvLyBzaW5nbGUtcXVvdGUKLS8vCQkJCQl3cml0ZVN0cmluZ09uKCJcXCciLCB3cml0ZXIpOyAgLy8kTk9OLU5MUy0xJAotLy8JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1xcJzogIC8vIGJhY2tzbGFzaAotCQkJCQl3cml0ZVN0cmluZ09uKCJcXFxcIiwgd3JpdGVyKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJd3JpdGVDaGFyT24oYywgd3JpdGVyKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd3JpdGVDaGFyT24oUVVPVEUsIHdyaXRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShTdHJpbmdCdWZmZXIgc2IpIHsKLQkJaW50IGxlbiA9IHNiLmxlbmd0aCgpOwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuXTsKLQkJc2IuZ2V0Q2hhcnMoMCwgbGVuLCByZXN1bHQsIDApOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2hhcltdIGNvbnZlcnRUb0NoYXJBcnJheShTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWludCBsZW4gPSBzYi5sZW5ndGgoKTsKLQkJY2hhcltdIHJlc3VsdCA9IG5ldyBjaGFyW2xlbl07Ci0JCXNiLmdldENoYXJzKDAsIGxlbiwgcmVzdWx0LCAwKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oY2hhcltdIHN0cmluZywgY2hhciBlc2NhcGUsIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCWZvciAoY2hhciBjIDogc3RyaW5nKSB7Ci0JCQkJaWYgKGMgPT0gZXNjYXBlKSB7Ci0JCQkJCXdyaXRlci53cml0ZShjKTsKLQkJCQl9Ci0JCQkJd3JpdGVyLndyaXRlKGMpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ09uKGNoYXJbXSBzdHJpbmcsIGludCBvZmYsIGludCBsZW4sIFdyaXRlciB3cml0ZXIpIHsKLQkJdHJ5IHsKLQkJCXdyaXRlci53cml0ZShzdHJpbmcsIG9mZiwgbGVuKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVTdHJpbmdPbihTdHJpbmcgc3RyaW5nLCBpbnQgb2ZmLCBpbnQgbGVuLCBXcml0ZXIgd3JpdGVyKSB7Ci0JCXRyeSB7Ci0JCQl3cml0ZXIud3JpdGUoc3RyaW5nLCBvZmYsIGxlbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nT24oU3RyaW5nIHN0cmluZywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKHN0cmluZyk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlQ2hhck9uKGNoYXIgYywgV3JpdGVyIHdyaXRlcikgewotCQl0cnkgewotCQkJd3JpdGVyLndyaXRlKGMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCYWcuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmNjZTM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRocmVhZC1zYWZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQmFnfSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRCYWc8RT4KLQlpbXBsZW1lbnRzIEJhZzxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgYmFnLiAqLwotCXByaXZhdGUgZmluYWwgQmFnPEU+IGJhZzsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIGJhZyB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBiYWcgYW5kIGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZyhCYWc8RT4gYmFnLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGJhZyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmJhZyA9IGJhZzsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBiYWcgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgYmFnIGFuZCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZyhCYWc8RT4gYmFnKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChiYWcgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5iYWcgPSBiYWc7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBiYWcgdGhhdCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCYWcoT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobmV3IEhhc2hCYWc8RT4oKSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBiYWcgdGhhdCBsb2NrcyBvbiBpdHNlbGYuCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJhZygpIHsKLQkJdGhpcyhuZXcgSGFzaEJhZzxFPigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmFnIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8sIGludCBjb3VudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5hZGQobywgY291bnQpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5jb3VudChvKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxCYWcuRW50cnk8RT4+IGVudHJpZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvLCBjb3VudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHVuaXF1ZUNvdW50KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQl9Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IHVuaXF1ZUl0ZXJhdG9yKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5hZGQoZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5hZGRBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLmJhZy5jbGVhcigpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnMobyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuY29udGFpbnNBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5pc0VtcHR5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcucmVtb3ZlKG8pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmJhZy5yZW1vdmVBbGwoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnJldGFpbkFsbChjKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcuc2l6ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoKTsKLQkJfQotCX0KLQotCXB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGEpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5iYWcudG9BcnJheShhKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIHB1YmxpYyBwcm90b2NvbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3RhY2sgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW4uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljMzY4Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSW50ZXJydXB0aWJsZUNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkludGVycnVwdGlibGVDb21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGEgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUuCi0gKiBJdCBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IG9yIDxjb2RlPmZhbHNlPC9jb2RlPiwKLSAqIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICogCi0gKiBAc2VlIFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEJvb2xlYW4KLQlpbXBsZW1lbnRzIEludGVycnVwdGlibGVDb21tYW5kRXhlY3V0b3IsIEJvb2xlYW5SZWZlcmVuY2UsIENsb25lYWJsZSwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgPGNvZGU+Ym9vbGVhbjwvY29kZT4uICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbHVlOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogaW5pdGlhbCB2YWx1ZSBhbmQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oYm9vbGVhbiB2YWx1ZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCA8Y29kZT5ib29sZWFuPC9jb2RlPiB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4gaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRCb29sZWFuKGJvb2xlYW4gdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgPGNvZGU+Ym9vbGVhbjwvY29kZT4KLQkgKiB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogYW5kIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhbihPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhmYWxzZSwgbXV0ZXgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCA8Y29kZT5ib29sZWFuPC9jb2RlPgotCSAqIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogVGhlIHN5bmNocm9uaXplZCA8Y29kZT5ib29sZWFuPC9jb2RlPiBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4oKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpcyhib29sZWFuIGIpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA9PSBiOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3QoYm9vbGVhbiBiKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgIT0gYjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVHJ1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRmFsc2UoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICEgdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKiBSZXR1cm4gdGhlIDxlbT5vbGQ8L2VtPiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSB0aGlzLnZhbHVlKSA/IHZhbHVlIDogISB0aGlzLnNldENoYW5nZWRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkOyBuZXcgdmFsdWUgaXMgZGlmZmVyZW50Ci0JICogPGJyPgotCSAqIFJldHVybiB0aGUgPGVtPm5ldzwvZW0+IHZhbHVlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZXRDaGFuZ2VkVmFsdWVfKGJvb2xlYW4gdikgewotCQl0aGlzLnZhbHVlID0gdjsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIHY7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqIFJldHVybiB0aGUgbmV3IHZhbHVlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZsaXAoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0Q2hhbmdlZFZhbHVlXyggISB0aGlzLnZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gPGNvZGU+dmFsdWUgJiBiPC9jb2RlPiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFuZChib29sZWFuIGIpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8odGhpcy52YWx1ZSAmIGIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSB0byA8Y29kZT52YWx1ZSB8IGI8L2NvZGU+IGFuZCByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gb3IoYm9vbGVhbiBiKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHRoaXMudmFsdWUgfCBiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gPGNvZGU+dmFsdWUgXiBiPC9jb2RlPiBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHhvcihib29sZWFuIGIpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8odGhpcy52YWx1ZSBeIGIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICogPGJyPgotCSAqIFJldHVybiB0aGUgPGVtPm5ldzwvZW0+IHZhbHVlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzZXRWYWx1ZV8oYm9vbGVhbiB2KSB7Ci0JCXJldHVybiAodiA9PSB0aGlzLnZhbHVlKSA/IHYgOiB0aGlzLnNldENoYW5nZWRWYWx1ZV8odik7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldE5vdChib29sZWFuIGIpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoICEgYik7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNldFRydWUoKSB7Ci0JCXJldHVybiB0aGlzLnNldFZhbHVlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB2YWx1ZSBjaGFuZ2VzLCBhbGwgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZXRGYWxzZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWUoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaWYgaXQgaXMgY3VycmVudGx5IHRoZSBzcGVjaWZpZWQKLQkgKiBleHBlY3RlZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nIHRocmVhZHMgYXJlIG5vdGlmaWVkLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb21taXQgd2FzIHN1Y2Nlc3NmdWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29tbWl0KGJvb2xlYW4gZXhwZWN0ZWRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9ICh0aGlzLnZhbHVlID09IGV4cGVjdGVkVmFsdWUpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEF0b21pY2FsbHkgc3dhcCB0aGUgdmFsdWUgb2YgdGhpcyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB3aXRoIHRoZSB2YWx1ZSBvZgotCSAqIHRoZSBzcGVjaWZpZWQgc3luY2hyb25pemVkIGJvb2xlYW4uIE1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHZhbHVlIG9mCi0JICogPGVtPmlkZW50aXR5IGhhc2ggY29kZTwvZW0+IHRvIGF2b2lkIGRlYWRsb2NrIHdoZW4gdHdvIHN5bmNocm9uaXplZAotCSAqIGJvb2xlYW5zIHN3YXAgdmFsdWVzIHdpdGggZWFjaCBvdGhlciBzaW11bHRhbmVvdXNseS4KLQkgKiBJZiBlaXRoZXIgdmFsdWUgY2hhbmdlcywgdGhlIGNvcnJlc3BvbmRpbmcgd2FpdGluZyB0aHJlYWRzIGFyZSBub3RpZmllZC4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzd2FwKFN5bmNocm9uaXplZEJvb2xlYW4gb3RoZXIpIHsKLQkJaWYgKG90aGVyID09IHRoaXMpIHsKLQkJCXJldHVybiB0aGlzLmdldFZhbHVlKCk7Ci0JCX0KLQkJYm9vbGVhbiB0aGlzRmlyc3QgPSBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSA8IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG90aGVyKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBmaXJzdCA9IHRoaXNGaXJzdCA/IHRoaXMgOiBvdGhlcjsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBzZWNvbmQgPSB0aGlzRmlyc3QgPyBvdGhlciA6IHRoaXM7Ci0JCXN5bmNocm9uaXplZCAoZmlyc3QubXV0ZXgpIHsKLQkJCXN5bmNocm9uaXplZCAoc2Vjb25kLm11dGV4KSB7Ci0JCQkJYm9vbGVhbiB0aGlzVmFsdWUgPSB0aGlzLnZhbHVlOwotCQkJCWJvb2xlYW4gb3RoZXJWYWx1ZSA9IG90aGVyLnZhbHVlOwotCQkJCWlmICh0aGlzVmFsdWUgPT0gb3RoZXJWYWx1ZSkgewotCQkJCQlyZXR1cm4gdGhpc1ZhbHVlOyAgLy8gbm90aGluZyBjaGFuZ2VzCi0JCQkJfQotCQkJCW90aGVyLnNldENoYW5nZWRWYWx1ZV8odGhpc1ZhbHVlKTsKLQkJCQlyZXR1cm4gdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKG90aGVyVmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhpcyBvYmplY3QgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsVmFsdWVJcyhib29sZWFuIGIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxWYWx1ZUlzXyhib29sZWFuIGIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlICE9IGIpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzTm90KGJvb2xlYW4gYikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKCAhIGIpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFRydWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbFZhbHVlSXModHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxGYWxzZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsVmFsdWVJcyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUKLQkgKiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRWYWx1ZShib29sZWFuIGIpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyggISBiKTsKLQkJCXRoaXMuc2V0Q2hhbmdlZFZhbHVlXyhiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sCi0JICogc2V0IHRoZSB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VG9TZXRUcnVlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VG9TZXRWYWx1ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogc2V0IHRoZSB2YWx1ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvU2V0RmFsc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRUb1NldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUKLQkgKiBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogdGhlbiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCi0JICogdmFsdWUsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdoZW5FcXVhbChib29sZWFuIGIsIEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhiKTsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogdGhlbiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2hlbk5vdEVxdWFsKGJvb2xlYW4gYiwgSW50ZXJydXB0aWJsZUNvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53aGVuRXF1YWwoICEgYiwgY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiB0aGVuIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LAotCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdoZW5UcnVlKEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2hlbkVxdWFsKHRydWUsIGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZQotCSAqIGNoYW5nZXMgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIHRoZW4gZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+ZmFsc2U8L2NvZGU+LAotCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdoZW5GYWxzZShJbnRlcnJ1cHRpYmxlQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndoZW5FcXVhbChmYWxzZSwgY29tbWFuZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRpbWVkIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxWYWx1ZUlzKGJvb2xlYW4gYiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKGIsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNfKGJvb2xlYW4gYiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhiKTsJLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOwkvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSAhPSBiKSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gYik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlCi0JICogY2hhbmdlcyB0byB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNOb3QoYm9vbGVhbiBiLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXMoICEgYiwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT50cnVlPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT50cnVlPC9jb2RlPiwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFRydWUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKHRydWUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gd2FzIGFjaGlldmVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxGYWxzZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXMoZmFsc2UsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIE5PVCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QKLQkgKiBjaGFuZ2UgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZQotCSAqIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkKLQkgKiB0aGUgTk9UIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZQotCSAqIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKGJvb2xlYW4gYiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJc18oICEgYiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0Q2hhbmdlZFZhbHVlXyhiKTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kCi0JICogY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dAotCSAqIGNoYW5naW5nIHRoZSB2YWx1ZS4gCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+OwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sIHNldCB0aGUKLQkgKiB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9TZXRUcnVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUodHJ1ZSwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kCi0JICogY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0Ci0JICogY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT47Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IDxjb2RlPnRydWU8L2NvZGU+LCBzZXQgdGhlCi0JICogdmFsdWUgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldEZhbHNlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUoZmFsc2UsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3VyczsKLQkgKiB0aGVuLCBpZiBhIHRpbWUtb3V0IGRpZCBub3Qgb2NjdXIsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2hlbkVxdWFsKGJvb2xlYW4gYiwgSW50ZXJydXB0aWJsZUNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJc18oYiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3VyczsKLQkgKiB0aGVuLCBpZiBhIHRpbWUtb3V0IGRpZCBub3Qgb2NjdXIsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgY29tbWFuZCB3YXMgZXhlY3V0ZWQ7Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBOT1Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpbW1lZGlhdGVseSBhbmQgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3aGVuTm90RXF1YWwoYm9vbGVhbiBiLCBJbnRlcnJ1cHRpYmxlQ29tbWFuZCBjb21tYW5kLCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndoZW5FcXVhbCggISBiLCBjb21tYW5kLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgY2hhbmdlcwotCSAqIHRvIDxjb2RlPnRydWU8L2NvZGU+IG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzOwotCSAqIHRoZW4sIGlmIGEgdGltZS1vdXQgZGlkIG5vdCBvY2N1ciwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBjb21tYW5kIHdhcyBleGVjdXRlZDsKLQkgKiByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+dHJ1ZTwvY29kZT4sCi0JICogZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2hlblRydWUoSW50ZXJydXB0aWJsZUNvbW1hbmQgY29tbWFuZCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53aGVuRXF1YWwodHJ1ZSwgY29tbWFuZCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5mYWxzZTwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnM7Ci0JICogdGhlbiwgaWYgYSB0aW1lLW91dCBkaWQgbm90IG9jY3VyLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZC4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIGNvbW1hbmQgd2FzIGV4ZWN1dGVkOwotCSAqIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4gdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5mYWxzZTwvY29kZT4sCi0JICogZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2hlbkZhbHNlKEludGVycnVwdGlibGVDb21tYW5kIGNvbW1hbmQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2hlbkVxdWFsKGZhbHNlLCBjb21tYW5kLCB0aW1lb3V0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgdmFsdWUgZnJvbSBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSW50ZXJydXB0aWJsZUNvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN5bmNocm9uaXplZEJvb2xlYW4gY2xvbmUoKSB7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCQlyZXR1cm4gKFN5bmNocm9uaXplZEJvb2xlYW4pIHN1cGVyLmNsb25lKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT2JqZWN0IGlkZW50aXR5IGlzIGNyaXRpY2FsIHRvIHN5bmNocm9uaXplZCBib29sZWFucy4KLQkgKiBUaGVyZSBpcyBubyByZWFzb24gZm9yIHR3byBkaWZmZXJlbnQgc3luY2hyb25pemVkIGJvb2xlYW5zIHRvIGJlCi0JICogPGVtPmVxdWFsPC9lbT4uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCX0KLQotCS8qKgotCSAqIEBzZWUgI2VxdWFscyhPYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0VmFsdWUoKSkgKyAnXSc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkSW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5YWE0NC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBzeW5jaHJvbml6ZWQgYWNjZXNzIHRvIGFuIDxjb2RlPmludDwvY29kZT4uCi0gKiBJdCBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogdmFsdWUgaXMgc2V0IHRvIGEgc3BlY2lmaWVkIHZhbHVlLCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqIAotICogQHNlZSBTaW1wbGVJbnRSZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZEludAotCWltcGxlbWVudHMgSW50UmVmZXJlbmNlLCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIDxjb2RlPmludDwvY29kZT4uICovCi0JcHJpdmF0ZSBpbnQgdmFsdWU7Ci0KLQkvKiogT2JqZWN0IHRvIHN5bmNocm9uaXplIG9uLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG11dGV4OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBpbnRlZ2VyIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlCi0JICogYW5kIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQoaW50IHZhbHVlLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gbXV0ZXg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIGludGVnZXIgd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgdmFsdWUuCi0JICogVGhlIHN5bmNocm9uaXplZCBpbnRlZ2VyIGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkSW50KGludCB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHN5bmNocm9uaXplZCBpbnRlZ2VyIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiB6ZXJvCi0JICogYW5kIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZEludChPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcygwLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIGFuIGluaXRpYWwgdmFsdWUgb2YgemVyby4KLQkgKiBUaGUgc3luY2hyb25pemVkIGludGVnZXIgaXRzZWxmIHdpbGwgYmUgdGhlIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRJbnQoKSB7Ci0JCXRoaXMoMCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRWYWx1ZSgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID09IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBub3RFcXVhbChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICE9IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1plcm8oKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gMDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90WmVybygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSAwOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNHcmVhdGVyVGhhbihpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlID4gdjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR3JlYXRlclRoYW5PckVxdWFsKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPj0gdjsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGVzc1RoYW4oaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSA8IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xlc3NUaGFuT3JFcXVhbChpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlIDw9IHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5pc0dyZWF0ZXJUaGFuKDApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90UG9zaXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzTGVzc1RoYW5PckVxdWFsKDApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTmVnYXRpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzTGVzc1RoYW4oMCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOb3ROZWdhdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNHcmVhdGVyVGhhbk9yRXF1YWwoMCk7Ci0JfQotCi0JcHVibGljIGludCBhYnMoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIE1hdGguYWJzKHRoaXMudmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBuZWcoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIC10aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JcHVibGljIGludCBhZGQoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSArIHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IHN1YnRyYWN0KGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgLSB2OwotCQl9Ci0JfQotCi0JcHVibGljIGludCBtdWx0aXBseShpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlICogdjsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZGl2aWRlKGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgLyB2OwotCQl9Ci0JfQotCi0JcHVibGljIGludCByZW1haW5kZXIoaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAlIHY7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG1pbihpbnQgdikgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBNYXRoLm1pbih0aGlzLnZhbHVlLCB2KTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgbWF4KGludCB2KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIE1hdGgubWF4KHRoaXMudmFsdWUsIHYpOwotCQl9Ci0JfQotCi0JcHVibGljIGRvdWJsZSBwb3coaW50IHYpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gTWF0aC5wb3codGhpcy52YWx1ZSwgdik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcgdGhyZWFkcyBhcmUgbm90aWZpZWQuCi0JICovCi0JcHVibGljIGludCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8odmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBpbnQgc2V0VmFsdWVfKGludCB2KSB7Ci0JCWludCBvbGQgPSB0aGlzLnZhbHVlOwotCQlyZXR1cm4gKG9sZCA9PSB2KSA/IG9sZCA6IHRoaXMuc2V0VmFsdWVfKHYsIG9sZCk7Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkIGFuZCBuZXcgdmFsdWUgaXMgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgc2V0Q2hhbmdlZFZhbHVlXyhpbnQgdikgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZV8odiwgdGhpcy52YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkIGFuZCBuZXcgdmFsdWUgaXMgZGlmZmVyZW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgc2V0VmFsdWVfKGludCB2LCBpbnQgb2xkKSB7Ci0JCXRoaXMudmFsdWUgPSB2OwotCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQlyZXR1cm4gb2xkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgdG8gemVyby4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIGludCBzZXRaZXJvKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZSgwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmNyZW1lbnQgdGhlIHZhbHVlIGJ5IG9uZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGluY3JlbWVudCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnZhbHVlKys7Ci0JCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEZWNyZW1lbnQgdGhlIHZhbHVlIGJ5IG9uZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGRlY3JlbWVudCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLnZhbHVlLS07Ci0JCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCBzZXQgaXQgdG8gdGhlCi0JICogc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVBbmRTd2FwKGludCBleHBlY3RlZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wYXJlQW5kU3dhcF8oZXhwZWN0ZWRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcGFyZUFuZFN3YXBfKGludCBleHBlY3RlZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IGV4cGVjdGVkVmFsdWUpID8gdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpIDogdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3luY2hyb25pemVkIGludGVnZXIgbG9ja3Mgb24gd2hpbGUgcGVyZm9ybWluZwotCSAqIGl0cyBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TXV0ZXgoKSB7Ci0JCXJldHVybiB0aGlzLm11dGV4OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsRXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFcXVhbF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsRXF1YWxfKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSAhPSB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlCi0JICogdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90RXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsTm90RXF1YWxfKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSA9PSB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIHplcm8uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgemVybywgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFplcm8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEVxdWFsKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gemVyby4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gemVybywKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90WmVybygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsTm90RXF1YWwoMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeQotCSAqIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsR3JlYXRlclRoYW4oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbl8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsR3JlYXRlclRoYW5fKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy52YWx1ZSA8PSB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gYSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbChpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPCB2KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gYSB2YWx1ZSBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkKLQkgKiBsZXNzIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbExlc3NUaGFuKGludCB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsTGVzc1RoYW5fKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbExlc3NUaGFuXyhpbnQgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMudmFsdWUgPj0gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5Ci0JICogbGVzcyB0aGFuIG9yIGVxdWFsIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxMZXNzVGhhbk9yRXF1YWwoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbExlc3NUaGFuT3JFcXVhbF8oaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXdoaWxlICh0aGlzLnZhbHVlID4gdikgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgcG9zaXRpdmUuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgcG9zaXRpdmUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxQb3NpdGl2ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW4oMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5vdCBwb3NpdGl2ZQotCSAqIChpLmUuIG5lZ2F0aXZlIG9yIHplcm8pLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiBwb3NpdGl2ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90UG9zaXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbExlc3NUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbmVnYXRpdmUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOZWdhdGl2ZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsTGVzc1RoYW4oMCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5vdCBuZWdhdGl2ZQotCSAqIChpLmUuIHplcm8gb3IgcG9zaXRpdmUpLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiBuZWdhdGl2ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFVudGlsTm90TmVnYXRpdmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsIHNldAotCSAqIHRoZSB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgd2FpdFRvU2V0VmFsdWUoaW50IHYpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odik7Ci0JCQlyZXR1cm4gdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB6ZXJvLCB0aGVuIGNoYW5nZSBpdAotCSAqIGJhY2sgdG8gemVybyBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IDxlbT5ub3Q8L2VtPiB6ZXJvLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gemVybyBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgd2FpdFRvU2V0WmVybygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKDApOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsCi0JICogc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqLwotCXB1YmxpYyBpbnQgd2FpdFRvU3dhcChpbnQgZXhwZWN0ZWRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsRXF1YWxfKGV4cGVjdGVkVmFsdWUpOwotCQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gdHJ1ZSBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRXF1YWwoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFcXVhbF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsRXF1YWxfKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVxdWFsXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlICE9IHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIHJlbW92ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYQotCSAqIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdEVxdWFsKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTm90RXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbE5vdEVxdWFsXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxOb3RFcXVhbF8odik7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPT0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlICE9IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gemVybyBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyB6ZXJvOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgemVybywKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFplcm8obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgbm90IHplcm87IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4KLQkgKiB6ZXJvLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdFplcm8obG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxOb3RFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBhIHZhbHVlIGdyZWF0ZXIKLQkgKiB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbihpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuXyh2LCB0aW1lb3V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbl8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5fKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPD0gdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlID4gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gYSB2YWx1ZSBncmVhdGVyCi0JICogdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWwoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxHcmVhdGVyVGhhbk9yRXF1YWxfKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbF8oaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsR3JlYXRlclRoYW5PckVxdWFsXyh2KTsgIC8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsgIC8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnZhbHVlIDwgdikgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnZhbHVlID49IHYpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvIGEgdmFsdWUgbGVzcwotCSAqIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuKGludCB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTGVzc1RoYW5fKHYsIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbl8odik7ICAvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7ICAvLyBpZiBpdCBldmVyIGNvbWVzIGJhY2ssIHRoZSBjb25kaXRpb24gd2FzIG1ldAotCQl9Ci0KLQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyB0aW1lb3V0OwotCQlsb25nIHJlbWFpbmluZyA9IHRpbWVvdXQ7Ci0JCXdoaWxlICgodGhpcy52YWx1ZSA+PSB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPCB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBhIHZhbHVlIGxlc3MKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSwKLQkgKiByZXR1cm4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbExlc3NUaGFuT3JFcXVhbChpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuT3JFcXVhbF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsTGVzc1RoYW5PckVxdWFsXyhpbnQgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxMZXNzVGhhbk9yRXF1YWxfKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMudmFsdWUgPiB2KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMudmFsdWUgPD0gdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIHBvc2l0aXZlCi0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSBpcyBub3cgcG9zaXRpdmU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBwb3NpdGl2ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFBvc2l0aXZlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsR3JlYXRlclRoYW4oMCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGlzIG5vdCBwb3NpdGl2ZQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IG5vdCBwb3NpdGl2ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IG5vdCBwb3NpdGl2ZSwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE5vdFBvc2l0aXZlKGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsTGVzc1RoYW5PckVxdWFsKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZQotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgaXMgbm93IG5lZ2F0aXZlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgbmVnYXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOZWdhdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbExlc3NUaGFuKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIGlzIG5vdyBub3QgbmVnYXRpdmU7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBub3QgbmVnYXRpdmUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3ROZWdhdGl2ZShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEdyZWF0ZXJUaGFuT3JFcXVhbCgwLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUsIHRoZW4gY2hhbmdlCi0JICogaXQgYmFjayB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUgYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZwotCSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHZhbHVlLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgdmFsdWUgd2FzIHNldCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCBzZXQKLQkgKiB0aGUgdmFsdWUgaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0VmFsdWUoaW50IHYsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbE5vdEVxdWFsXyh2LCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKHYpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIHplcm8sIHRoZW4gY2hhbmdlIGl0IGJhY2sgdG8gemVybwotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiB6ZXJvIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZQotCSAqIGV4ZWN1dGluZyB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gemVybzsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gemVybywgc2V0Ci0JICogdGhlIHZhbHVlIHRvIHplcm8gaW1tZWRpYXRlbHkgYW5kIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPi4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU2V0WmVybyhsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRUb1NldFZhbHVlKDAsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwgdGhlbiBjaGFuZ2UgaXQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZQotCSAqIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZwotCSAqIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWU7IHJldHVybgotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsCi0JICogc2V0IHRoZSB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBpbW1lZGlhdGVseS4KLQkgKiBSZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlLgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9Td2FwKGludCBleHBlY3RlZFZhbHVlLCBpbnQgbmV3VmFsdWUsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVxdWFsXyhleHBlY3RlZFZhbHVlLCB0aW1lb3V0KTsKLQkJCWlmIChzdWNjZXNzKSB7Ci0JCQkJdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBpbnRlcnJ1cHRlZCwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgCi0JICogd2l0aCB0aGUgbXV0ZXggbG9ja2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIHRoZSB2YWx1ZSBmcm9tIGFub3RoZXIKLQkgKiB0aHJlYWQuCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZShDb21tYW5kIGNvbW1hbmQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgewotCQkJdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21wYXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKFJlYWRPbmx5SW50UmVmZXJlbmNlIHJlZikgewotCQlpbnQgdGhpc1ZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpOwotCQlpbnQgb3RoZXJWYWx1ZSA9IHJlZi5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gKHRoaXNWYWx1ZSA8IG90aGVyVmFsdWUpID8gLTEgOiAoKHRoaXNWYWx1ZSA9PSBvdGhlclZhbHVlKSA/IDAgOiAxKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3luY2hyb25pemVkSW50IGNsb25lKCkgewotCQl0cnkgewotCQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQkJcmV0dXJuIChTeW5jaHJvbml6ZWRJbnQpIHN1cGVyLmNsb25lKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICdbJyArIFN0cmluZy52YWx1ZU9mKHRoaXMuZ2V0VmFsdWUoKSkgKyAnXSc7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3QuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YyMDQ4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk9iamVjdFJlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIHN5bmNocm9uaXplZCBhY2Nlc3MgdG8gYW4gb2JqZWN0IG9mIHR5cGUgPGNvZGU+VjwvY29kZT4uCi0gKiBJdCBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogdmFsdWUgaXMgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IG9yIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IHZhbHVlLAotICogd2l0aCBvcHRpb25hbCB0aW1lLW91dHMuCi0gKiAKLSAqIEBwYXJtIFYgdGhlIHR5cGUgb2YgdGhlIHN5bmNocm9uaXplZCBvYmplY3QncyB2YWx1ZQotICogQHNlZSBTaW1wbGVPYmplY3RSZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZE9iamVjdDxWPgotCWltcGxlbWVudHMgT2JqZWN0UmVmZXJlbmNlPFY+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZQotewotCS8qKiBCYWNraW5nIHZhbHVlLiAqLwotCXByaXZhdGUgViB2YWx1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIGEgc3luY2hyb25pemVkIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbCB2YWx1ZQotCSAqIGFuZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFYgdmFsdWUsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlLgotCSAqIFRoZSBzeW5jaHJvbml6ZWQgb2JqZWN0IGl0c2VsZiB3aWxsIGJlIHRoZSBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0KFYgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW5jaHJvbml6ZWQgb2JqZWN0IHdpdGggYW4gaW5pdGlhbCB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBUaGUgc3luY2hyb25pemVkIG9iamVjdCBpdHNlbGYgd2lsbCBiZSB0aGUgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVFcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXRWYWx1ZSgpLCBvYmplY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbHVlTm90RXF1YWwoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuZ2V0VmFsdWUoKSwgb2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGwoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMudmFsdWUgPT0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTm90TnVsbCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZSAhPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZS4gSWYgdGhlIHZhbHVlIGNoYW5nZXMsIGFsbCB3YWl0aW5nCi0JICogdGhyZWFkcyBhcmUgbm90aWZpZWQuIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIFYgc2V0VmFsdWVfKFYgdikgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChvbGQsIHYpID8gb2xkIDogdGhpcy5zZXRWYWx1ZV8odiwgb2xkKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQgYW5kIG5ldyB2YWx1ZSBpcyBkaWZmZXJlbnQKLQkgKi8KLQlwcml2YXRlIFYgc2V0Q2hhbmdlZFZhbHVlXyhWIHYpIHsKLQkJcmV0dXJuIHRoaXMuc2V0VmFsdWVfKHYsIHRoaXMudmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZCBhbmQgbmV3IHZhbHVlIGlzIGRpZmZlcmVudAotCSAqLwotCXByaXZhdGUgViBzZXRWYWx1ZV8oViB2LCBWIG9sZCkgewotCQl0aGlzLnZhbHVlID0gdjsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIG9sZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGUgdmFsdWUgY2hhbmdlcywgYWxsIHdhaXRpbmcKLQkgKiB0aHJlYWRzIGFyZSBub3RpZmllZC4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBzZXROdWxsKCkgewotCQlyZXR1cm4gdGhpcy5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCBzZXQgaXQgdG8gdGhlCi0JICogc3BlY2lmaWVkIG5ldyB2YWx1ZS4gUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBjb21wYXJlQW5kU3dhcChWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wYXJlQW5kU3dhcF8oZXhwZWN0ZWRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBWIGNvbXBhcmVBbmRTd2FwXyhWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIGV4cGVjdGVkVmFsdWUpID8gdGhpcy5zZXRWYWx1ZV8obmV3VmFsdWUpIDogdGhpcy52YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCB0aGUgc3luY2hyb25pemVkIG9iamVjdCBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxWYWx1ZUlzKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFZhbHVlSXNfKFYgdikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnZhbHVlLCB2KSkgewotCQkJdGhpcy5tdXRleC53YWl0KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcwotCSAqIHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmIHRoZQotCSAqIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbFZhbHVlSXNOb3QoViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsVmFsdWVJc05vdF8oViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAoVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy52YWx1ZSwgdikpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGNvZGU+bnVsbDwvY29kZT4sIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzKG51bGwpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3ROdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzTm90KG51bGwpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzIHRvCi0JICogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgdGhlbiBjaGFuZ2UKLQkgKiBpdCBiYWNrIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0Ci0JICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgd2FpdFRvU2V0VmFsdWUoViB2KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odik7Ci0JCQlyZXR1cm4gdGhpcy5zZXRDaGFuZ2VkVmFsdWVfKHYpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQKLQkgKiBiYWNrIHRvIDxjb2RlPm51bGw8L2NvZGU+IGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+IDxjb2RlPm51bGw8L2NvZGU+LAotCSAqIHNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViB3YWl0VG9TZXROdWxsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFRvU2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLCB0aGVuIGNoYW5nZSBpdAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCBleHBlY3RlZCB2YWx1ZSwKLQkgKiBzZXQgdGhlIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIGltbWVkaWF0ZWx5LgotCSAqIFJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUuCi0JICovCi0JcHVibGljIFYgd2FpdFRvU3dhcChWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxWYWx1ZUlzXyhleHBlY3RlZFZhbHVlKTsKLQkJCXJldHVybiB0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4KLQkgKiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgdGhlIHNwZWNpZmllZCB2YWx1ZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXMoViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc18odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJc18oViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNfKHYpOyAgLy8gd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgbm90aWZpZWQKLQkJCXJldHVybiB0cnVlOyAgLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudmFsdWUsIHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnZhbHVlLCB2KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0byBzb21ldGhpbmcKLQkgKiBvdGhlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIHJlbW92ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYQotCSAqIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8ZW0+bm90PC9lbT4gdGhlIHNwZWNpZmllZAotCSAqIHZhbHVlLCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbFZhbHVlSXNOb3QoViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odiwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsVmFsdWVJc05vdF8oViB2LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aW1lb3V0ID09IDBMKSB7Ci0JCQl0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3RfKHYpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIHYpICYmIChyZW1haW5pbmcgPiAwTCkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdChyZW1haW5pbmcpOwotCQkJcmVtYWluaW5nID0gc3RvcCAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy52YWx1ZSwgdik7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMKLQkgKiB0byA8Y29kZT5udWxsPC9jb2RlPiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxWYWx1ZUlzKG51bGwsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSB2YWx1ZSBjaGFuZ2VzCi0JICogdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2FzIGFjaGlldmVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4gSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgPGVtPm5vdDwvZW0+Ci0JICogPGNvZGU+bnVsbDwvY29kZT4sIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90TnVsbChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbFZhbHVlSXNOb3QobnVsbCwgdGltZW91dCk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8KLQkgKiBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLCB0aGVuIGNoYW5nZQotCSAqIGl0IGJhY2sgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBhbmQgY29udGludWUgZXhlY3V0aW5nLgotCSAqIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGJlZm9yZSB0aGUgdGltZS1vdXQsIHNpbXBseSBjb250aW51ZSBleGVjdXRpbmcKLQkgKiB3aXRob3V0IGNoYW5naW5nIHRoZSB2YWx1ZS4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ci0JICogaWYgdGhlIHZhbHVlIHdhcyBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwgc2V0Ci0JICogdGhlIHZhbHVlIGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldFZhbHVlKFYgdiwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsVmFsdWVJc05vdF8odiwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMuc2V0Q2hhbmdlZFZhbHVlXyh2KTsKLQkJCX0KLQkJCXJldHVybiBzdWNjZXNzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHZhbHVlIGNoYW5nZXMgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbiBjaGFuZ2UgaXQgYmFjayB0byA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdG8gc29tZXRoaW5nCi0JICogb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUKLQkgKiBleGVjdXRpbmcgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+OyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBzb21ldGhpbmcgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPiwgc2V0Ci0JICogdGhlIHZhbHVlIHRvIDxjb2RlPm51bGw8L2NvZGU+IGltbWVkaWF0ZWx5IGFuZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRUb1NldE51bGwobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VG9TZXRWYWx1ZShudWxsLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgdmFsdWUgY2hhbmdlcyB0bwotCSAqIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUsIHRoZW4gY2hhbmdlIGl0Ci0JICogdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgYW5kIGNvbnRpbnVlIGV4ZWN1dGluZy4KLQkgKiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY2hhbmdlIHRvIHRoZSBzcGVjaWZpZWQgZXhwZWN0ZWQgdmFsdWUKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQgY2hhbmdpbmcKLQkgKiB0aGUgdmFsdWUuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPgotCSAqIGlmIHRoZSB2YWx1ZSB3YXMgc2V0IHRvIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlOyByZXR1cm4KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIGV4cGVjdGVkIHZhbHVlLAotCSAqIHNldCB0aGUgdmFsdWUgdG8gdGhlIHNwZWNpZmllZCBuZXcgdmFsdWUgaW1tZWRpYXRlbHkuCi0JICogUmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvU3dhcChWIGV4cGVjdGVkVmFsdWUsIFYgbmV3VmFsdWUsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbFZhbHVlSXNfKGV4cGVjdGVkVmFsdWUsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLnNldFZhbHVlXyhuZXdWYWx1ZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgY3VycmVudCB0aHJlYWQgaXMgbm90IGludGVycnVwdGVkLCBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCAKLQkgKiB3aXRoIHRoZSBtdXRleCBsb2NrZWQuIFRoaXMgaXMgdXNlZnVsIGZvciBpbml0aWFsaXppbmcgdGhlIHZhbHVlIGZyb20gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN5bmNocm9uaXplZE9iamVjdDxWPiBjbG9uZSgpIHsKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJCVN5bmNocm9uaXplZE9iamVjdDxWPiBjbG9uZSA9IChTeW5jaHJvbml6ZWRPYmplY3Q8Vj4pIHN1cGVyLmNsb25lKCk7Ci0JCQkJcmV0dXJuIGNsb25lOwotCQkJfQotCQl9IGNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IEludGVybmFsRXJyb3IoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAnWycgKyBTdHJpbmcudmFsdWVPZih0aGlzLmdldFZhbHVlKCkpICsgJ10nOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcy5kZWZhdWx0V3JpdGVPYmplY3QoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYmIzMjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogVGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBRdWV1ZX0gaW50ZXJmYWNlLgotICogVGhpcyBhbHNvIHByb3ZpZGVzIHByb3RvY29sIGZvciBzdXNwZW5kaW5nIGEgdGhyZWFkIHVudGlsIHRoZQotICogcXVldWUgaXMgZW1wdHkgb3Igbm90IGVtcHR5LCB3aXRoIG9wdGlvbmFsIHRpbWUtb3V0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZFF1ZXVlPEU+Ci0JaW1wbGVtZW50cyBRdWV1ZTxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLyoqIEJhY2tpbmcgcXVldWUuICovCi0JcHJpdmF0ZSBmaW5hbCBRdWV1ZTxFPiBxdWV1ZTsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3luY2hyb25pemVkIHF1ZXVlIHRoYXQgd3JhcHMgdGhlCi0JICogc3BlY2lmaWVkIHF1ZXVlIGFuZCBsb2NrcyBvbiB0aGUgc3BlY2lmaWVkIG11dGV4LgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRRdWV1ZShRdWV1ZTxFPiBxdWV1ZSwgT2JqZWN0IG11dGV4KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChxdWV1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnF1ZXVlID0gcXVldWU7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgcXVldWUgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgcXVldWUgYW5kIGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWUoUXVldWU8RT4gcXVldWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHF1ZXVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQkJdGhpcy5tdXRleCA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBxdWV1ZSB0aGF0IGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFF1ZXVlKE9iamVjdCBtdXRleCkgewotCQl0aGlzKG5ldyBTaW1wbGVRdWV1ZTxFPigpLCBtdXRleCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVtcHR5IHN5bmNocm9uaXplZCBxdWV1ZSB0aGF0IGxvY2tzIG9uIGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWUoKSB7Ci0JCXRoaXMobmV3IFNpbXBsZVF1ZXVlPEU+KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBRdWV1ZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBlbnF1ZXVlKEUgZWxlbWVudCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuZW5xdWV1ZV8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5xdWV1ZV8oRSBlbGVtZW50KSB7Ci0JCXRoaXMucXVldWUuZW5xdWV1ZShlbGVtZW50KTsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQl9Ci0KLQlwdWJsaWMgRSBkZXF1ZXVlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmRlcXVldWVfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIEUgZGVxdWV1ZV8oKSB7Ci0JCUUgZWxlbWVudCA9IHRoaXMucXVldWUuZGVxdWV1ZSgpOwotCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgRSBwZWVrKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnF1ZXVlLnBlZWsoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMucXVldWUuaXNFbXB0eSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGVmaW5pdGUgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5SXMoYm9vbGVhbiBlbXB0eSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGVtcHR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCB3YWl0VW50aWxFbXB0eUlzXyhib29sZWFuIGVtcHR5KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQl3aGlsZSAodGhpcy5xdWV1ZS5pc0VtcHR5KCkgIT0gZW1wdHkpIHsKLQkJCXRoaXMubXV0ZXgud2FpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBxdWV1ZSBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqLwotCXB1YmxpYyB2b2lkIHdhaXRVbnRpbE5vdEVtcHR5KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHksCi0JICogdGhlbiAiZW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZQotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvRW5xdWV1ZShFIGVsZW1lbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyh0cnVlKTsKLQkJCXRoaXMuZW5xdWV1ZV8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdCwKLQkgKiB0aGVuICJkZXF1ZXVlIiBhbiBpdGVtIGZyb20gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGFuZCByZXR1cm4gaXQuCi0JICovCi0JcHVibGljIE9iamVjdCB3YWl0VG9EZXF1ZXVlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGZhbHNlKTsKLQkJCXJldHVybiB0aGlzLmRlcXVldWVfKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGltZWQgd2FpdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlJ3MgZW1wdHkgc3RhdHVzIGNoYW5nZXMKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHNwZWNpZmllZAotCSAqIGVtcHR5IHN0YXR1cyB3YXMgYWNoaWV2ZWQ7IHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgYSB0aW1lLW91dCBvY2N1cnJlZC4KLQkgKiBJZiB0aGUgcXVldWUncyBlbXB0eSBzdGF0dXMgaXMgYWxyZWFkeSB0aGUgc3BlY2lmaWVkIHZhbHVlLAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHlJcyhib29sZWFuIGVtcHR5LCBsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHksIHRpbWVvdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogc3luY2hyb25pemVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRVbnRpbEVtcHR5SXNfKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRpbWVvdXQgPT0gMEwpIHsKLQkJCXRoaXMud2FpdFVudGlsRW1wdHlJc18oZW1wdHkpOwkvLyB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCBub3RpZmllZAotCQkJcmV0dXJuIHRydWU7CS8vIGlmIGl0IGV2ZXIgY29tZXMgYmFjaywgdGhlIGNvbmRpdGlvbiB3YXMgbWV0Ci0JCX0KLQotCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArIHRpbWVvdXQ7Ci0JCWxvbmcgcmVtYWluaW5nID0gdGltZW91dDsKLQkJd2hpbGUgKCh0aGlzLnF1ZXVlLmlzRW1wdHkoKSAhPSBlbXB0eSkgJiYgKHJlbWFpbmluZyA+IDBMKSkgewotCQkJdGhpcy5tdXRleC53YWl0KHJlbWFpbmluZyk7Ci0JCQlyZW1haW5pbmcgPSBzdG9wIC0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLnF1ZXVlLmlzRW1wdHkoKSA9PSBlbXB0eSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5Ci0JICogb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZgotCSAqIHRoZSBxdWV1ZSBpcyBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGVtcHR5LCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaW1tZWRpYXRlbHkuCi0JICogSWYgdGhlIHRpbWUtb3V0IGlzIHplcm8sIHdhaXQgaW5kZWZpbml0ZWx5LgotCSAqLwotCXB1YmxpYyBib29sZWFuIHdhaXRVbnRpbEVtcHR5KGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBxdWV1ZSBhbHJlYWR5IGhhcyBzb21ldGhpbmcgb24gaXQsIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsTm90RW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzKGZhbHNlLCB0aW1lb3V0KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHksCi0JICogdGhlbiAiZW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZQotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuIElmIHRoZSBxdWV1ZSBpcyBub3QgZW1wdGllZCBvdXQKLQkgKiBiZWZvcmUgdGhlIHRpbWUtb3V0LCBzaW1wbHkgY29udGludWUgZXhlY3V0aW5nIHdpdGhvdXQKLQkgKiAiZW5xdWV1ZWluZyIgdGhlIGl0ZW0uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUKLQkgKiBpdGVtIHdhcyBlbnF1ZXVlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5IGVtcHR5LCAiZW5xdWV1ZSIgdGhlIHNwZWNpZmllZCBpdGVtIGFuZAotCSAqIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFRvRW5xdWV1ZShFIGVsZW1lbnQsIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlib29sZWFuIHN1Y2Nlc3MgPSB0aGlzLndhaXRVbnRpbEVtcHR5SXNfKHRydWUsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQl0aGlzLmVucXVldWVfKGVsZW1lbnQpOwotCQkJfQotCQkJcmV0dXJuIHN1Y2Nlc3M7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgcXVldWUgaGFzIHNvbWV0aGluZyBvbiBpdCwKLQkgKiB0aGVuICJkZXF1ZXVlIiBhbiBpdGVtIGZyb20gdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIGFuZCByZXR1cm4gaXQuCi0JICogSWYgdGhlIHF1ZXVlIGlzIGVtcHR5IGFuZCBub3RoaW5nIGlzICJlbnF1ZXVlZCIgb24gdG8gaXQgYmVmb3JlIHRoZQotCSAqIHRpbWUtb3V0LCB0aHJvdyBhIG5vIHN1Y2ggZWxlbWVudCBleGNlcHRpb24uCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuCi0JICogSWYgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSwgImRlcXVldWUiIGFuIGl0ZW0gYW5kCi0JICogcmV0dXJuIGl0IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb0RlcXVldWUobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsRW1wdHlJc18oZmFsc2UsIHRpbWVvdXQpOwotCQkJaWYgKHN1Y2Nlc3MpIHsKLQkJCQlyZXR1cm4gdGhpcy5kZXF1ZXVlXygpOwotCQkJfQotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIG5vdCBpbnRlcnJ1cHRlZCwgZXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgCi0JICogd2l0aCB0aGUgbXV0ZXggbG9ja2VkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBxdWV1ZSBpbiBhbm90aGVyCi0JICogdGhyZWFkLgotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoVGhyZWFkLmludGVycnVwdGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaXRpb25hbCBwdWJsaWMgcHJvdG9jb2wgKioqKioqKioqKgotCi0JLyoqCi0JICogIkRyYWluIiBhbGwgdGhlIGN1cnJlbnQgaXRlbXMgZnJvbSB0aGUgcXVldWUgaW50byBzcGVjaWZpZWQgcXVldWUuCi0JICovCi0JcHVibGljIHZvaWQgZHJhaW5UbyhRdWV1ZTxFPiBxKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5kcmFpblRvXyhxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBkcmFpblRvXyhRdWV1ZTxFPiBxKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQl3aGlsZSAoICEgdGhpcy5xdWV1ZS5pc0VtcHR5KCkpIHsKLQkJCXEuZW5xdWV1ZSh0aGlzLnF1ZXVlLmRlcXVldWUoKSk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpZiAoY2hhbmdlZCkgewotCQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoZSBxdWV1ZSBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gJ1snICsgdGhpcy5xdWV1ZS50b1N0cmluZygpICsgJ10nOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvU3luY2hyb25pemVkU3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwMzNmYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaHJlYWQtc2FmZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFN0YWNrfSBpbnRlcmZhY2UuCi0gKiBUaGlzIGFsc28gcHJvdmlkZXMgcHJvdG9jb2wgZm9yIHN1c3BlbmRpbmcgYSB0aHJlYWQgdW50aWwgdGhlCi0gKiBzdGFjayBpcyBlbXB0eSBvciBub3QgZW1wdHksIHdpdGggb3B0aW9uYWwgdGltZS1vdXRzLgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkU3RhY2s8RT4KLQlpbXBsZW1lbnRzIFN0YWNrPEU+LCBTZXJpYWxpemFibGUKLXsKLQkvKiogQmFja2luZyBzdGFjay4gKi8KLQlwcml2YXRlIGZpbmFsIFN0YWNrPEU+IHN0YWNrOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbml6ZWQgc3RhY2sgdGhhdCB3cmFwcyB0aGUKLQkgKiBzcGVjaWZpZWQgc3RhY2sgYW5kIGxvY2tzIG9uIHRoZSBzcGVjaWZpZWQgbXV0ZXguCi0JICovCi0JcHVibGljIFN5bmNocm9uaXplZFN0YWNrKFN0YWNrPEU+IHN0YWNrLCBPYmplY3QgbXV0ZXgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHN0YWNrID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3RhY2sgPSBzdGFjazsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN5bmNocm9uaXplZCBzdGFjayB0aGF0IHdyYXBzIHRoZQotCSAqIHNwZWNpZmllZCBzdGFjayBhbmQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjayhTdGFjazxFPiBzdGFjaykgewotCQlzdXBlcigpOwotCQlpZiAoc3RhY2sgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zdGFjayA9IHN0YWNrOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgbG9ja3Mgb24gdGhlIHNwZWNpZmllZCBtdXRleC4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2soT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobmV3IFNpbXBsZVN0YWNrPEU+KCksIG11dGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgc3luY2hyb25pemVkIHN0YWNrIHRoYXQgbG9ja3Mgb24gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBTeW5jaHJvbml6ZWRTdGFjaygpIHsKLQkJdGhpcyhuZXcgU2ltcGxlU3RhY2s8RT4oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YWNrIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHB1c2goRSBlbGVtZW50KSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5wdXNoXyhlbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHN5bmNocm9uaXplZAotCSAqLwotCXByaXZhdGUgdm9pZCBwdXNoXyhFIGVsZW1lbnQpIHsKLQkJdGhpcy5zdGFjay5wdXNoKGVsZW1lbnQpOwotCQl0aGlzLm11dGV4Lm5vdGlmeUFsbCgpOwotCX0KLQotCXB1YmxpYyBFIHBvcCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5wb3BfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIEUgcG9wXygpIHsKLQkJRSBvID0gdGhpcy5zdGFjay5wb3AoKTsKLQkJdGhpcy5tdXRleC5ub3RpZnlBbGwoKTsKLQkJcmV0dXJuIG87Ci0JfQotCi0JcHVibGljIEUgcGVlaygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdGFjay5wZWVrKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLnN0YWNrLmlzRW1wdHkoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmRlZmluaXRlIHdhaXRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjaydzIGVtcHR5IHN0YXR1cyBjaGFuZ2VzCi0JICogdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHkpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhlbXB0eSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2FpdFVudGlsRW1wdHlJc18oYm9vbGVhbiBlbXB0eSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJd2hpbGUgKHRoaXMuc3RhY2suaXNFbXB0eSgpICE9IGVtcHR5KSB7Ci0JCQl0aGlzLm11dGV4LndhaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxFbXB0eSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsRW1wdHlJcyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB3YWl0VW50aWxOb3RFbXB0eSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRoaXMud2FpdFVudGlsRW1wdHlJcyhmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIHN0YWNrIGlzIGVtcHR5LAotCSAqIHRoZW4gInB1c2giIHRoZSBzcGVjaWZpZWQgaXRlbSBvbiB0byB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIGFuZCBjb250aW51ZSBleGVjdXRpbmcuCi0JICovCi0JcHVibGljIHZvaWQgd2FpdFRvUHVzaChFIGVsZW1lbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyh0cnVlKTsKLQkJCXRoaXMucHVzaF8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaGFzIHNvbWV0aGluZyBvbiBpdCwKLQkgKiB0aGVuICJwb3AiIGFuIGl0ZW0gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjayBhbmQgcmV0dXJuIGl0LgotCSAqLwotCXB1YmxpYyBPYmplY3Qgd2FpdFRvUG9wKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQl0aGlzLndhaXRVbnRpbEVtcHR5SXNfKGZhbHNlKTsKLQkJCXJldHVybiB0aGlzLnBvcF8oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0aW1lZCB3YWl0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sncyBlbXB0eSBzdGF0dXMgY2hhbmdlcwotCSAqIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIHNwZWNpZmllZCB0aW1lLW91dCBvY2N1cnMuCi0JICogVGhlIHRpbWUtb3V0IGlzIHNwZWNpZmllZCBpbiBtaWxsaXNlY29uZHMuIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkCi0JICogZW1wdHkgc3RhdHVzIHdhcyBhY2hpZXZlZDsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBhIHRpbWUtb3V0IG9jY3VycmVkLgotCSAqIElmIHRoZSBzdGFjaydzIGVtcHR5IHN0YXR1cyBpcyBhbHJlYWR5IHRoZSBzcGVjaWZpZWQgdmFsdWUsCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxFbXB0eUlzKGJvb2xlYW4gZW1wdHksIGxvbmcgdGltZW91dCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzXyhlbXB0eSwgdGltZW91dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBzeW5jaHJvbml6ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gd2FpdFVudGlsRW1wdHlJc18oYm9vbGVhbiBlbXB0eSwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAodGltZW91dCA9PSAwTCkgewotCQkJdGhpcy53YWl0VW50aWxFbXB0eUlzXyhlbXB0eSk7CS8vIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIG5vdGlmaWVkCi0JCQlyZXR1cm4gdHJ1ZTsJLy8gaWYgaXQgZXZlciBjb21lcyBiYWNrLCB0aGUgY29uZGl0aW9uIHdhcyBtZXQKLQkJfQotCi0JCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgdGltZW91dDsKLQkJbG9uZyByZW1haW5pbmcgPSB0aW1lb3V0OwotCQl3aGlsZSAoKHRoaXMuc3RhY2suaXNFbXB0eSgpICE9IGVtcHR5KSAmJiAocmVtYWluaW5nID4gMEwpKSB7Ci0JCQl0aGlzLm11dGV4LndhaXQocmVtYWluaW5nKTsKLQkJCXJlbWFpbmluZyA9IHN0b3AgLSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMuc3RhY2suaXNFbXB0eSgpID09IGVtcHR5KTsKLQl9Ci0KLQkvKioKLQkgKiBTdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZCB1bnRpbCB0aGUgc3RhY2sgaXMgZW1wdHkKLQkgKiBvciB0aGUgc3BlY2lmaWVkIHRpbWUtb3V0IG9jY3Vycy4KLQkgKiBUaGUgdGltZS1vdXQgaXMgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcy4gUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmCi0JICogdGhlIHN0YWNrIGlzIGVtcHR5OyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHN0YWNrIGlzIGFscmVhZHkgZW1wdHksIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpbW1lZGlhdGVseS4KLQkgKiBJZiB0aGUgdGltZS1vdXQgaXMgemVybywgd2FpdCBpbmRlZmluaXRlbHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gd2FpdFVudGlsRW1wdHkobG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy53YWl0VW50aWxFbXB0eUlzKHRydWUsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LgotCSAqIG9yIHRoZSBzcGVjaWZpZWQgdGltZS1vdXQgb2NjdXJzLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYKLQkgKiB0aGUgc3RhY2sgaXMgbm90IGVtcHR5OyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHN0YWNrIGFscmVhZHkgaGFzIHNvbWV0aGluZyBvbiBpdCwgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VW50aWxOb3RFbXB0eShsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLndhaXRVbnRpbEVtcHR5SXMoZmFsc2UsIHRpbWVvdXQpOwotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eSwKLQkgKiB0aGVuICJwdXNoIiB0aGUgc3BlY2lmaWVkIGl0ZW0gb24gdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2sKLQkgKiBhbmQgY29udGludWUgZXhlY3V0aW5nLiBJZiB0aGUgc3RhY2sgaXMgbm90IGVtcHRpZWQgb3V0Ci0JICogYmVmb3JlIHRoZSB0aW1lLW91dCwgc2ltcGx5IGNvbnRpbnVlIGV4ZWN1dGluZyB3aXRob3V0Ci0JICogInB1c2hpbmciIHRoZSBpdGVtLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlCi0JICogaXRlbSB3YXMgcHVzaGVkOyByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGEgdGltZS1vdXQgb2NjdXJyZWQuCi0JICogSWYgdGhlIHN0YWNrIGlzIGFscmVhZHkgZW1wdHksICJwdXNoIiB0aGUgc3BlY2lmaWVkIGl0ZW0gYW5kCi0JICogcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB3YWl0VG9QdXNoKEUgZWxlbWVudCwgbG9uZyB0aW1lb3V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWJvb2xlYW4gc3VjY2VzcyA9IHRoaXMud2FpdFVudGlsRW1wdHlJc18odHJ1ZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXRoaXMucHVzaF8oZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VjY2VzczsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1c3BlbmQgdGhlIGN1cnJlbnQgdGhyZWFkIHVudGlsIHRoZSBzdGFjayBoYXMgc29tZXRoaW5nIG9uIGl0LAotCSAqIHRoZW4gInBvcCIgYW4gaXRlbSBmcm9tIHRoZSB0b3Agb2YgdGhlIHN0YWNrIGFuZCByZXR1cm4gaXQuCi0JICogSWYgdGhlIHN0YWNrIGlzIGVtcHR5IGFuZCBub3RoaW5nIGlzICJwdXNoZWQiIG9uIHRvIGl0IGJlZm9yZSB0aGUKLQkgKiB0aW1lLW91dCwgdGhyb3cgYW4gZW1wdHkgc3RhY2sgZXhjZXB0aW9uLgotCSAqIFRoZSB0aW1lLW91dCBpcyBzcGVjaWZpZWQgaW4gbWlsbGlzZWNvbmRzLgotCSAqIElmIHRoZSBzdGFjayBpcyBub3QgZW1wdHksICJwb3AiIGFuIGl0ZW0gYW5kCi0JICogcmV0dXJuIGl0IGltbWVkaWF0ZWx5LgotCSAqIElmIHRoZSB0aW1lLW91dCBpcyB6ZXJvLCB3YWl0IGluZGVmaW5pdGVseS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHdhaXRUb1BvcChsb25nIHRpbWVvdXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJYm9vbGVhbiBzdWNjZXNzID0gdGhpcy53YWl0VW50aWxFbXB0eUlzXyhmYWxzZSwgdGltZW91dCk7Ci0JCQlpZiAoc3VjY2VzcykgewotCQkJCXJldHVybiB0aGlzLnBvcF8oKTsKLQkJCX0KLQkJCXRocm93IG5ldyBFbXB0eVN0YWNrRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemVkIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBub3QgaW50ZXJydXB0ZWQsIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIAotCSAqIHdpdGggdGhlIG11dGV4IGxvY2tlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIGluaXRpYWxpemluZyB0aGUgc3RhY2sgaW4gYW5vdGhlcgotCSAqIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJaWYgKFRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJfQotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZGl0aW9uYWwgcHVibGljIHByb3RvY29sICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgb2JqZWN0IHRoZSBzdGFjayBsb2NrcyBvbiB3aGlsZSBwZXJmb3JtaW5nCi0JICogaXRzIG9wZXJhdGlvbnMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRNdXRleCgpIHsKLQkJcmV0dXJuIHRoaXMubXV0ZXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gJ1snICsgdGhpcy5zdGFjay50b1N0cmluZygpICsgJ10nOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjE2OGZjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDb21tYW5kIGludGVyZmFjZSBhbGxvd3MgdGhlIGNsaWVudCB0bwotICogc3BlY2lmeSBhIGRpZmZlcmVudCBDb21tYW5kIGZvciBlYWNoIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZExvY2FsQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCXByb3RlY3RlZCBmaW5hbCBUaHJlYWRMb2NhbDxDb21tYW5kPiB0aHJlYWRMb2NhbDsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZCBkZWZhdWx0Q29tbWFuZDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGNvbW1hbmQgZG9lcyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmQoKSB7Ci0JCXRoaXMoQ29tbWFuZC5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBUaHJlYWRMb2NhbENvbW1hbmQoQ29tbWFuZCBkZWZhdWx0Q29tbWFuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLmRlZmF1bHRDb21tYW5kID0gZGVmYXVsdENvbW1hbmQ7Ci0JCXRoaXMudGhyZWFkTG9jYWwgPSB0aGlzLmJ1aWxkVGhyZWFkTG9jYWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWw8Q29tbWFuZD4gYnVpbGRUaHJlYWRMb2NhbCgpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWRMb2NhbDxDb21tYW5kPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCXRoaXMuZ2V0KCkuZXhlY3V0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGdldCgpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gdGhpcy50aHJlYWRMb2NhbC5nZXQoKTsKLQkJcmV0dXJuIChjb21tYW5kICE9IG51bGwpID8gY29tbWFuZCA6IHRoaXMuZGVmYXVsdENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMudGhyZWFkTG9jYWwuc2V0KGNvbW1hbmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0KCkudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGU1MDY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ29tbWFuZEV4ZWN1dG9yIGludGVyZmFjZSBhbGxvd3MgdGhlIGNsaWVudCB0bwotICogc3BlY2lmeSBhIGRpZmZlcmVudCBDb21tYW5kIEV4ZWN1dG9yIGZvciBlYWNoIHRocmVhZC4KLSAqLwotcHVibGljIGNsYXNzIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIGltcGxlbWVudHMgQ29tbWFuZEV4ZWN1dG9yIHsKLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiB0aHJlYWRMb2NhbDsKLQlwcm90ZWN0ZWQgZmluYWwgQ29tbWFuZEV4ZWN1dG9yIGRlZmF1bHRDb21tYW5kRXhlY3V0b3I7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBjb21tYW5kIGV4ZWN1dG9yIHNpbXBseSBleGVjdXRlcyB0aGUgY29tbWFuZCBkaXJlY3RseS4KLQkgKi8KLQlwdWJsaWMgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IoKSB7Ci0JCXRoaXMoQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBkZWZhdWx0Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVmYXVsdENvbW1hbmRFeGVjdXRvciA9IGRlZmF1bHRDb21tYW5kRXhlY3V0b3I7Ci0JCXRoaXMudGhyZWFkTG9jYWwgPSB0aGlzLmJ1aWxkVGhyZWFkTG9jYWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWw8Q29tbWFuZEV4ZWN1dG9yPiBidWlsZFRocmVhZExvY2FsKCkgewotCQlyZXR1cm4gbmV3IFRocmVhZExvY2FsPENvbW1hbmRFeGVjdXRvcj4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQl0aGlzLmdldFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkuZXhlY3V0ZShjb21tYW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZEV4ZWN1dG9yIGdldFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCkgewotCQlDb21tYW5kRXhlY3V0b3IgY2UgPSB0aGlzLnRocmVhZExvY2FsLmdldCgpOwotCQlyZXR1cm4gKGNlICE9IG51bGwpID8gY2UgOiB0aGlzLmRlZmF1bHRDb21tYW5kRXhlY3V0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQgZXhlY3V0b3IgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvcikgewotCQl0aGlzLnRocmVhZExvY2FsLnNldChjb21tYW5kRXhlY3V0b3IpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IHRocmVhZCdzIGNvbW1hbmQKLQkgKiBleGVjdXRvci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ub29scy5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhNGYwMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9Ub29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLS8qKgotICogVmFyaW91cyB1dGlsaXR5IG1ldGhvZHMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGZpbmFsIGNsYXNzIFRvb2xzIHsKLQotCS8vICoqKioqKioqKiogb2JqZWN0IGNvbXBhcmlzb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGNoZWNrcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsdWVzQXJlRXF1YWwoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gKHZhbHVlMSA9PSBudWxsKSA/Ci0JCQkJKHZhbHVlMiA9PSBudWxsKSA6Ci0JCQkJKCh2YWx1ZTIgIT0gbnVsbCkgJiYgdmFsdWUxLmVxdWFscyh2YWx1ZTIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhcmUgZGlmZmVyZW50LCB3aXRoIHRoZSBhcHByb3ByaWF0ZQotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGNoZWNrcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsdWVzQXJlRGlmZmVyZW50KE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuICh2YWx1ZTEgPT0gbnVsbCkgPwotCQkJCSh2YWx1ZTIgIT0gbnVsbCkgOgotCQkJCSgodmFsdWUyID09IG51bGwpIHx8ICEgdmFsdWUxLmVxdWFscyh2YWx1ZTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3lzdGVtIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgSlZNIGlzIFN1bidzIChvciBPcmFjbGUncykuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGp2bUlzU3VuKCkgewotCQlyZXR1cm4ganZtSXMoIlN1biIpIHx8IGp2bUlzKCJPcmFjbGUiKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY3VycmVudCBKVk0gaXMgSUJNJ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGp2bUlzSUJNKCkgewotCQlyZXR1cm4ganZtSXMoIklCTSIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4ganZtSXMoU3RyaW5nIGp2bVZlbmRvck5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZW5kb3IiKS5zdGFydHNXaXRoKGp2bVZlbmRvck5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTWljcm9zb2Z0IFdpbmRvd3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9zSXNXaW5kb3dzKCkgewotCQlyZXR1cm4gb3NJcygiV2luZG93cyIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IG9wZXJhdGluZyBzeXN0ZW0gaXMgTGludXguCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG9zSXNMaW51eCgpIHsKLQkJcmV0dXJuIG9zSXMoIkxpbnV4Iik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIHN5c3RlbSBpcyBNYWMgT1MgWC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3NJc01hYygpIHsKLQkJcmV0dXJuIG9zSXMoIk1hYyIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gb3NJcyhTdHJpbmcgb3NOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zLm5hbWUiKS5pbmRleE9mKG9zTmFtZSkgIT0gLTE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1RyYW5zZm9ybWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDMwZjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvVHJhbnNmb3JtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci0KLS8qKgotICogVXNlZCBieSB2YXJpb3VzICJwbHVnZ2FibGUiIGNsYXNzZXMgdG8gdHJhbnNmb3JtIG9iamVjdHMuCi0gKiBUcmFuc2Zvcm0gYW4gb2JqZWN0IG9mIHR5cGUgPGNvZGU+VDE8L2NvZGU+IHRvIGFuIG9iamVjdCBvZiB0eXBlCi0gKiA8Y29kZT5UMjwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8VDE+IHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgcGFzc2VkIHRvIHRoZSB0cmFuc2Zvcm1lcgotICogQHBhcmFtIDxUMj4gdGhlIHR5cGUgb2YgdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgdHJhbnNmb3JtZXIKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2Zvcm1lcjxUMSwgVDI+IHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHJhbnNmb3JtZWQgb2JqZWN0LgotCSAqIFRoZSBzZW1hbnRpY3Mgb2YgInRyYW5zZm9ybSIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBjb250cmFjdCBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuCi0JICovCi0JVDIgdHJhbnNmb3JtKFQxIG8pOwotCi0KLQkvKioKLQkgKiBBICJudWxsIiB0cmFuc2Zvcm1lciB3aWxsIHBlcmZvcm0gbm8gdHJhbnNmb3JtYXRpb24gYXQgYWxsOwotCSAqIGl0IHdpbGwgc2ltcGx5IHJldHVybiB0aGUgb2JqZWN0ICJ1bnRyYW5zZm9ybWVkIi4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsPFMxLCBTMj4KLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIHN0YXRpYyA8UjEsIFIyPiBUcmFuc2Zvcm1lcjxSMSwgUjI+IGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcmV0dXJuIHRoZSBvYmplY3QsIHVuY2hhbmdlZAotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJcHVibGljIFMyIHRyYW5zZm9ybShTMSBvKSB7Ci0JCQlyZXR1cm4gKFMyKSBvOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgImRpc2FibGVkIiB0cmFuc2Zvcm1lciB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBpZgotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGlzIGNhbGxlZC4gVGhpcyBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucwotCSAqIHdoZXJlIGEgdHJhbnNmb3JtZXIgaXMgb3B0aW9uYWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyIHNob3VsZAotCSAqIG5vdCBiZSB1c2VkLgotCSAqLwotCWZpbmFsIGNsYXNzIERpc2FibGVkPFMxLCBTMj4KLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTMSwgUzI+LCBTZXJpYWxpemFibGUKLQl7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBzdGF0aWMgPFIxLCBSMj4gVHJhbnNmb3JtZXI8UjEsIFIyPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQlwdWJsaWMgUzIgdHJhbnNmb3JtKFMxIG8pIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1ZlcnNpb25Db21wYXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9WZXJzaW9uQ29tcGFyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE5NjAzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1ZlcnNpb25Db21wYXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotLyoqCi0gKiBUaGlzIGNvbXBhcmF0b3IgY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB2ZXJzaW9uIHN0cmluZ3MgKGUuZy4gIjIuMi4yIiB2cy4KLSAqICIyLjE0LjMiKS4gQ2xpZW50cyBjYW4gc3BlY2lmeSB0aGUgZGVsaW1pdGVyKHMpIHRoYXQgc2VwYXJhdGVzIGEgdmVyc2lvbidzCi0gKiA8ZW0+c2VnbWVudHM8L2VtPiBhcyB3ZWxsIGFzIGEgcGFyc2VyIHRvIGJlIHVzZWQgZm9yIHBhcnNpbmcgZWFjaAotICogPGVtPnNlZ21lbnQ8L2VtPi4KLSAqIAotICogQHNlZSAjSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25Db21wYXJhdG9yPFQgZXh0ZW5kcyBDb21wYXJhYmxlPFQ+PgotCWltcGxlbWVudHMgQ29tcGFyYXRvcjxTdHJpbmc+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZGVsaW1pdGVyczsKLQlwcml2YXRlIGZpbmFsIFNlZ21lbnRQYXJzZXI8VD4gc2VnbWVudFBhcnNlcjsKLQotCi0JLyoqCi0JICogU3RhdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSB2ZXJzaW9uIGNvbXBhcmF0b3IgaW50ZXJmYWNlIHRoYXQgY29udmVydHMKLQkgKiBlYWNoIHZlcnNpb24gaW50byBhIHNlcmllcyBvZiBpbnRlZ2VycyBhbmQgY29tcGFyZXMgdGhlbS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBXaXRoIHRoaXMgY29tcGFyYXRvciA8Y29kZT4iMi4xNCIgPiAiMi4yIjwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBJTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUiA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxJbnRlZ2VyPihTZWdtZW50UGFyc2VyLkludGVnZXJTZWdtZW50UGFyc2VyLmluc3RhbmNlKCkpOwotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBkZWxpbWl0ZXIgaXMgPGNvZGU+Jy4nPC9jb2RlPi4KLQkgKiBUaGUgZGVmYXVsdCBzZWdtZW50IHBhcnNlciBpcyBkaXNhYmxlZC4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTdWJjbGFzcyBtdXN0IG92ZXJyaWRlOjx1bD4KLQkgKiAgICAgPGxpPntAbGluayAjcGFyc2VTZWdtZW50KGludCwgU3RyaW5nKX0KLQkgKiAgICAgPGxpPntAbGluayAjZ2V0WmVybygpfQotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIFZlcnNpb25Db21wYXJhdG9yKCkgewotCQl0aGlzKCIuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZWdtZW50IHBhcnNlciBpcyBkaXNhYmxlZC4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTdWJjbGFzcyBtdXN0IG92ZXJyaWRlOjx1bD4KLQkgKiAgICAgPGxpPntAbGluayAjcGFyc2VTZWdtZW50KGludCwgU3RyaW5nKX0KLQkgKiAgICAgPGxpPntAbGluayAjZ2V0WmVybygpfQotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIFZlcnNpb25Db21wYXJhdG9yKFN0cmluZyBkZWxpbWl0ZXJzKSB7Ci0JCXRoaXMoZGVsaW1pdGVycywgU2VnbWVudFBhcnNlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBzZWdtZW50IHBhcnNlci4KLQkgKiBUaGUgZGVmYXVsdCBkZWxpbWl0ZXIgaXMgPGNvZGU+Jy4nPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgVmVyc2lvbkNvbXBhcmF0b3IoU2VnbWVudFBhcnNlcjxUPiBzZWdtZW50UGFyc2VyKSB7Ci0JCXRoaXMoIi4iLCBzZWdtZW50UGFyc2VyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGRlbGltaXRlcnMgYW5kIHNlZ21lbnQgcGFyc2VyLgotCSAqLwotCXB1YmxpYyBWZXJzaW9uQ29tcGFyYXRvcihTdHJpbmcgZGVsaW1pdGVycywgU2VnbWVudFBhcnNlcjxUPiBzZWdtZW50UGFyc2VyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVsaW1pdGVycyA9IGRlbGltaXRlcnM7Ci0JCXRoaXMuc2VnbWVudFBhcnNlciA9IHNlZ21lbnRQYXJzZXI7Ci0JfQotCi0KLQkvKioKLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBDYWxsZXJzIG11c3QgaGFuZGxlIGFueSBleGNlcHRpb25zIHRocm93biBieSB0aGUKLQkgKiBzZWdtZW50IHBhcnNlciBzdXBwbGllZCB0byB0aGUgY29tcGFyYXRvci4gSW4gcGFydGljdWxhciwgdGhlIHByZS1idWlsdAotCSAqIGludGVnZXIgc2VnbWVudCBwYXJzZXIge0BsaW5rICNJTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUn0gY2FuIHRocm93IGEKLQkgKiB7QGxpbmsgTnVtYmVyRm9ybWF0RXhjZXB0aW9ufSBpZiBhbnkgc2VnZW1lbnQgc3RyaW5nIGNvbnRhaW5zIG5vbi1udW1lcmljCi0JICogY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHZlcnNpb24xLCBTdHJpbmcgdmVyc2lvbjIpIHsKLQkJQXJyYXlMaXN0PFQ+IHNlZ21lbnRzMSA9IHRoaXMucGFyc2VWZXJzaW9uKHZlcnNpb24xKTsKLQkJQXJyYXlMaXN0PFQ+IHNlZ21lbnRzMiA9IHRoaXMucGFyc2VWZXJzaW9uKHZlcnNpb24yKTsKLQkJaW50IHNpemUxID0gc2VnbWVudHMxLnNpemUoKTsKLQkJaW50IHNpemUyID0gc2VnbWVudHMyLnNpemUoKTsKLQkJaW50IG1pbiA9IE1hdGgubWluKHNpemUxLCBzaXplMik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLQkJCWludCBzZWdtZW50Q29tcGFyZSA9IHNlZ21lbnRzMS5nZXQoaSkuY29tcGFyZVRvKHNlZ21lbnRzMi5nZXQoaSkpOwotCQkJaWYgKHNlZ21lbnRDb21wYXJlICE9IDApIHsKLQkJCQlyZXR1cm4gc2VnbWVudENvbXBhcmU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc2l6ZTEgPT0gc2l6ZTIpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaW50IG1heCA9IE1hdGgubWF4KHNpemUxLCBzaXplMik7Ci0JCVQgemVybyA9IHRoaXMuZ2V0WmVybygpOwotCQlpZiAoc2l6ZTEgPCBzaXplMikgewotCQkJZm9yIChpbnQgaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7Ci0JCQkJaW50IHNlZ21lbnRDb21wYXJlID0gemVyby5jb21wYXJlVG8oc2VnbWVudHMyLmdldChpKSk7Ci0JCQkJaWYgKHNlZ21lbnRDb21wYXJlICE9IDApIHsKLQkJCQkJcmV0dXJuIHNlZ21lbnRDb21wYXJlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGkgPSBtaW47IGkgPCBtYXg7IGkrKykgewotCQkJCWludCBzZWdtZW50Q29tcGFyZSA9IHNlZ21lbnRzMS5nZXQoaSkuY29tcGFyZVRvKHplcm8pOwotCQkJCWlmIChzZWdtZW50Q29tcGFyZSAhPSAwKSB7Ci0JCQkJCXJldHVybiBzZWdtZW50Q29tcGFyZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIGludG8gYSBsaXN0IG9mIHNlZ21lbnRzIHRoYXQgY2FuIGJlCi0JICogY29tcGFyZWQgaW5kaXZpZHVhbGx5LgotCSAqLwotCXByb3RlY3RlZCBBcnJheUxpc3Q8VD4gcGFyc2VWZXJzaW9uKFN0cmluZyBzKSB7Ci0JCUFycmF5TGlzdDxUPiBzZWdtZW50cyA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciBzdHJlYW0gPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsIHRoaXMuZGVsaW1pdGVycyk7IHN0cmVhbS5oYXNNb3JlVG9rZW5zKCk7ICkgewotCQkJc2VnbWVudHMuYWRkKHRoaXMucGFyc2VTZWdtZW50KGkrKywgc3RyZWFtLm5leHRUb2tlbigpKSk7Ci0JCX0KLQkJcmV0dXJuIHNlZ21lbnRzOwotCX0KLQotCS8qKgotCSAqIFBhcnNlIHRoZSBzcGVjaWZpZWQgc2VnbWVudCBpbnRvIHRoZSBhcHByb3ByaWF0ZSBjb21wYXJhYmxlLgotCSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiBhIHNlZ21lbnQgcGFyc2VyIGlzIG5vdCBwYXNzZWQKLQkgKiB0byB0aGUgdmVyc2lvbiBjb21wYXJhdG9yJ3MgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFQgcGFyc2VTZWdtZW50KGludCBpbmRleCwgU3RyaW5nIHMpIHsKLQkJcmV0dXJuIHRoaXMuc2VnbWVudFBhcnNlci5wYXJzZShpbmRleCwgcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFQgZ2V0WmVybygpIHsKLQkJcmV0dXJuIHRoaXMuc2VnbWVudFBhcnNlci5nZXRaZXJvKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBBIHNlZ21lbnQgcGFyc2VyIGlzIHVzZWQgYnkgYSB2ZXJzaW9uIGNvbXBhcmF0b3IgdG8gY29udmVydCBlYWNoCi0JICogPGVtPnNlZ21lbnQ8L2VtPiBvZiBhIHZlcnNpb24gaW50byBzb21ldGhpbmcgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8gdGhlCi0JICogY29ycmVzcG9uZGluZyA8ZW0+c2VnbWVudDwvZW0+IGluIGFub3RoZXIgdmVyc2lvbi4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIFNlZ21lbnRQYXJzZXI8VCBleHRlbmRzIENvbXBhcmFibGU8VD4+IHsKLQkJLyoqCi0JCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCB2ZXJzaW9uIDxlbT5zZWdtZW50PC9lbT4gaW50byBzb21ldGhpbmcgdGhhdAotCQkgKiBjYW4gYmUgY29tcGFyZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgPGVtPnNlZ21lbnQ8L2VtPiBpbiBhbm90aGVyCi0JCSAqIHZlcnNpb24uCi0JCSAqLwotCQlUIHBhcnNlKGludCBzZWdtZW50SW5kZXgsIFN0cmluZyBzZWdtZW50KTsKLQotCQkvKioKLQkJICogUmV0dXJuIGEgInplcm8iIDxlbT5zZWdtZW50PC9lbT4gdmFsdWUgdGhhdCBjYW4gYmUgY29tcGFyZWQgdG8KLQkJICogdHJhaWxpbmcgc2VnbWVudHMgd2hlbiB0d28gdmVyc2lvbiBoYXZlIGRpZmZlcmluZyBudW1iZXJzIG9mCi0JCSAqIDxlbT5zZWdtZW50czwvZW0+LgotCQkgKi8KLQkJVCBnZXRaZXJvKCk7Ci0KLQkJLyoqCi0JCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2VnbWVudCBwYXJzZXIgaW50ZXJmYWNlIHRoYXQgY29udmVydHMKLQkJICogZWFjaCBzZWdtZW50IGludG8gYW4gaW50ZWdlciwgaXJyZXNwZWN0aXZlIG9mIHBvc2l0aW9uLgotCQkgKiA8cD4KLQkJICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gV2l0aCB0aGlzIHBhcnNlciA8Y29kZT4iMi4xNCIgPiAiMi4yIjwvY29kZT4KLQkJICovCi0JCWZpbmFsIGNsYXNzIEludGVnZXJTZWdtZW50UGFyc2VyCi0JCQlpbXBsZW1lbnRzIFNlZ21lbnRQYXJzZXI8SW50ZWdlcj4sIFNlcmlhbGl6YWJsZQotCQl7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFNlZ21lbnRQYXJzZXI8SW50ZWdlcj4gSU5TVEFOQ0UgPSBuZXcgSW50ZWdlclNlZ21lbnRQYXJzZXIoKTsKLQkJCXB1YmxpYyBzdGF0aWMgU2VnbWVudFBhcnNlcjxJbnRlZ2VyPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIEludGVnZXJTZWdtZW50UGFyc2VyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcGFyc2UgdGhlIHNlZ21lbnQgYXMgYW4gaW50ZWdlcgotCQkJcHVibGljIEludGVnZXIgcGFyc2UoaW50IHNlZ21lbnRJbmRleCwgU3RyaW5nIHNlZ21lbnQpIHsKLQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHNlZ21lbnQpOwotCQkJfQotCQkJcHVibGljIEludGVnZXIgZ2V0WmVybygpIHsKLQkJCQlyZXR1cm4gWkVSTzsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgWkVSTyA9IEludGVnZXIudmFsdWVPZigwKTsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZWdtZW50IHBhcnNlciBpbnRlcmZhY2UgdGhhdCB0aHJvd3MKLQkJICogYW4gZXhjZXB0aW9uIGlmIGNhbGxlZC4KLQkJICovCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFMgZXh0ZW5kcyBDb21wYXJhYmxlPFM+PgotCQkJaW1wbGVtZW50cyBTZWdtZW50UGFyc2VyPFM+LCBTZXJpYWxpemFibGUKLQkJewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VnbWVudFBhcnNlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSIGV4dGVuZHMgQ29tcGFyYWJsZTxSPj4gU2VnbWVudFBhcnNlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBTIHBhcnNlKGludCBzZWdtZW50SW5kZXgsIFN0cmluZyBzZWdtZW50KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgUyBnZXRaZXJvKCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmN2QzMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotCi0vKioKLSAqIFRoaXMgZW5jb2RlciB3aWxsIHJlcGxhY2UgYW55IG9mIGEgc3BlY2lmaWVkIHNldCBvZiBjaGFyYWN0ZXJzIHdpdGggYW4gWE1MCi0gKiAiY2hhcmFjdGVyIHJlZmVyZW5jZSI6ICcvJyA9PiAiJiN4MmY7IgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWE1MU3RyaW5nRW5jb2RlciB7Ci0KLQkvKiogVGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gKi8KLQlwcml2YXRlIGZpbmFsIGNoYXJbXSBjaGFyczsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUgb2YgdGhlIGhpZ2hlc3QgY2hhcmFjdGVyIGluIHRoZSBzZXQgYWJvdmUuICovCi0JcHJpdmF0ZSBmaW5hbCBjaGFyIG1heENoYXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBlbmNvZGVyIHRoYXQgY29udmVydHMgdGhlIHNwZWNpZmllZCBzZXQgb2YgY2hhcmFjdGVycwotCSAqIGludG8gWE1MIGNoYXJhY3RlciByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBYTUxTdHJpbmdFbmNvZGVyKGNoYXJbXSBjaGFycykgewotCQlzdXBlcigpOwotCQlpZiAoY2hhcnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhlIGFtcGVyc2FuZCBtdXN0IGJlIGluY2x1ZGVkIHNpbmNlIGl0IGlzIHRoZSBlc2NhcGUgY2hhcmFjdGVyCi0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKGNoYXJzLCAnJicpKSB7Ci0JCQl0aGlzLmNoYXJzID0gY2hhcnM7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNoYXJzID0gQXJyYXlUb29scy5hZGQoY2hhcnMsICcmJyk7Ci0JCX0KLQkJdGhpcy5tYXhDaGFyID0gdGhpcy5jYWxjdWxhdGVNYXhJbnZhbGlkRmlsZU5hbWVDaGFyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBzZXQgb2YgY2hhcmFjdGVycyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBpbnRvIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGUKLQkgKiBzZWFyY2ggZm9yIGEgY2hhcmFjdGVyIGluIHRoZSBzZXQuCi0JICogQHNlZSAjY2hhcklzVG9CZUVuY29kZWQoY2hhcikKLQkgKi8KLQlwcml2YXRlIGNoYXIgY2FsY3VsYXRlTWF4SW52YWxpZEZpbGVOYW1lQ2hhcigpIHsKLQkJY2hhcltdIGxvY2FsQ2hhcnMgPSB0aGlzLmNoYXJzOwotCQljaGFyIG1heCA9IDA7Ci0JCWZvciAoaW50IGkgPSBsb2NhbENoYXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQljaGFyIGMgPSBsb2NhbENoYXJzW2ldOwotCQkJaWYgKG1heCA8IGMpIHsKLQkJCQltYXggPSBjOwotCQkJfQotCQl9Ci0JCXJldHVybiBtYXg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzdHJpbmcgd2l0aCBhbnkgY2hhcmFjdGVycyBpbiB0aGUgc2V0Ci0JICogcmVwbGFjZWQgd2l0aCBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHsKLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCS8vIGFsbG93IGZvciBhIGZldyBlbmNvZGVkIGNoYXJhY3RlcnMKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbiArIDIwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hcHBlbmRDaGFyYWN0ZXJUbyhzLmNoYXJBdChpKSwgc2IpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHN0cmluZyB3aXRoIGFueSBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMKLQkgKiByZXBsYWNlZCBieSB0aGUgY2hhcmFjdGVycyB0aGVtc2VsdmVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzLmxlbmd0aCgpKTsKLQkJU3RyaW5nQnVpbGRlciB0ZW1wID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsJLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJdGhpcy5kZWNvZGVUbyhuZXcgU3RyaW5nUmVhZGVyKHMpLCBzYiwgdGVtcCk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciB0byB0aGUgc3RyaW5nIGJ1ZmZlciwKLQkgKiBjb252ZXJ0aW5nIGl0IHRvIGFuIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQ2hhcmFjdGVyVG8oY2hhciBjLCBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCWlmICh0aGlzLmNoYXJJc1RvQmVFbmNvZGVkKGMpKSB7Ci0JCQl0aGlzLmFwcGVuZENoYXJhY3RlclJlZmVyZW5jZVRvKGMsIHNiKTsKLQkJfSBlbHNlIHsKLQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG9uZSBvZiB0aGUgY2hhcmFjdGVycwotCSAqIHRvIGJlIGNvbnZlcnRlZCB0byBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoYXJJc1RvQmVFbmNvZGVkKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPD0gdGhpcy5tYXhDaGFyKSAmJiBBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMuY2hhcnMsIGMpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcidzIFhNTCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHRvIHRoZQotCSAqIHNwZWNpZmllZCBzdHJpbmcgYnVmZmVyIChlLmcuICcvJyA9PiAiJiN4MmY7IikuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENoYXJhY3RlclJlZmVyZW5jZVRvKGNoYXIgYywgU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoIiYjeCIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChJbnRlZ2VyLnRvU3RyaW5nKGMsIDE2KSk7Ci0JCXNiLmFwcGVuZCgnOycpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWNvZGVUbyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZGVjb2RlVG9fKHJlYWRlciwgc2IsIHRlbXApOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlY29kZVRvXyhSZWFkZXIgcmVhZGVyLCBTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmdCdWlsZGVyIHRlbXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBjID0gcmVhZGVyLnJlYWQoKTsKLQkJd2hpbGUgKGMgIT0gLTEpIHsKLQkJCWlmIChjID09ICcmJykgewotCQkJCXRoaXMuZGVjb2RlQ2hhcmFjdGVyUmVmZXJlbmNlVG8ocmVhZGVyLCBzYiwgdGVtcCk7Ci0JCQl9IGVsc2UgewotCQkJCXNiLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQl9Ci0JCQljID0gcmVhZGVyLnJlYWQoKTsKLQkJfQotCQlyZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVjb2RlQ2hhcmFjdGVyUmVmZXJlbmNlVG8oUmVhZGVyIHJlYWRlciwgU3RyaW5nQnVpbGRlciBzYiwgU3RyaW5nQnVpbGRlciB0ZW1wKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXRoaXMuY2hlY2tDaGFyKGMsICcjJyk7Ci0JCWMgPSByZWFkZXIucmVhZCgpOwotCQl0aGlzLmNoZWNrQ2hhcihjLCAneCcpOwotCi0JCXRlbXAuc2V0TGVuZ3RoKDApOyAgLy8gcmUtdXNlIHRlbXAKLQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9ICc7JykgewotCQkJdGhpcy5jaGVja0VuZE9mU3RyZWFtKGMpOwotCQkJdGVtcC5hcHBlbmQoKGNoYXIpIGMpOwotCQkJYyA9IHJlYWRlci5yZWFkKCk7Ci0JCX0KLQkJU3RyaW5nIGNoYXJWYWx1ZSA9IHRlbXAudG9TdHJpbmcoKTsKLQkJaWYgKGNoYXJWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIG51bWVyaWMgc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzYi5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoY2hhclZhbHVlLCAxNikpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0NoYXIoaW50IGMsIGludCBleHBlY3RlZCkgewotCQl0aGlzLmNoZWNrRW5kT2ZTdHJlYW0oYyk7Ci0JCWlmIChjICE9IGV4cGVjdGVkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJleHBlY3RlZCAnIiArIChjaGFyKSBleHBlY3RlZCArICInLCBidXQgZW5jb3VudGVyZWQgJyIgKyAoY2hhcikgYyArICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tFbmRPZlN0cmVhbShpbnQgYykgewotCQlpZiAoYyA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb24uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDBjMDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLmVudW1lcmF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUVudW1lcmF0aW9uPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGVudW1lcmF0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUVudW1lcmF0aW9uPEU+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUVudW1lcmF0aW9uIElOU1RBTkNFID0gbmV3IEVtcHR5RW51bWVyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEVudW1lcmF0aW9uPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5RW51bWVyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dEVsZW1lbnQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTYwMDBjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2VudW1lcmF0aW9ucy9JdGVyYXRvckVudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5JdGVyYXRvckVudW1lcmF0aW9uPC9jb2RlPiB3cmFwcyBhbgotICoge0BsaW5rIEl0ZXJhdG9yfSBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGxpa2UgYW4KLSAqIHtAbGluayBFbnVtZXJhdGlvbn0uCi0gKiBIb3BlZnVsbHkgd2UgZG9uJ3QgaGF2ZSBtdWNoIG5lZWQgZm9yIHRoaXMuLi4uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGVudW1lcmF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVyYXRvckVudW1lcmF0aW9uPEU+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGlvbjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVudW1lcmF0aW9uIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3JFbnVtZXJhdGlvbihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gZW51bWVyYXRpb24gdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvckVudW1lcmF0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY2N2U3Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5SXRlcmFibGU8L2NvZGU+IHByb3ZpZGVzIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIGZvciBhbiBhcnJheSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBBcnJheUl0ZXJhdG9yCi0gKiBAc2VlIEFycmF5TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnJheUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCWZpbmFsIEVbXSBhcnJheTsKLQlmaW5hbCBpbnQgc3RhcnQ7Ci0JZmluYWwgaW50IGxlbmd0aDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHJlc3Qgb2YgdGhlIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhYmxlKEVbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JCXRoaXMoYXJyYXksIHN0YXJ0LCBhcnJheS5sZW5ndGggLSBzdGFydCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5SXRlcmFibGUoRVtdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKChzdGFydCA8IDApIHx8IChzdGFydCA+IGFycmF5Lmxlbmd0aCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXJ0OiAiICsgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKChsZW5ndGggPCAwKSB8fCAobGVuZ3RoID4gYXJyYXkubGVuZ3RoIC0gc3RhcnQpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsZW5ndGg6ICIgKyBsZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5hcnJheSA9IGFycmF5OwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPEU+KHRoaXMuYXJyYXksIHRoaXMuc3RhcnQsIHRoaXMubGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBBcnJheXMudG9TdHJpbmcodGhpcy5hcnJheSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjZWIwZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5TGlzdEl0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhIHtAbGluayBMaXN0SXRlcmFibGV9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIEFycmF5SXRlcmFibGUKLSAqIEBzZWUgQXJyYXlMaXN0SXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBBcnJheUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBBcnJheUxpc3RJdGVyYWJsZShFLi4uIGFycmF5KSB7Ci0JCXRoaXMoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmFibGUoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhYmxlKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPEU+KHRoaXMuYXJyYXksIHRoaXMuc3RhcnQsIHRoaXMubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmRjYzc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DaGFpbkl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+Q2hhaW5JdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYSBwbHVnZ2FibGUge0BsaW5rIEl0ZXJhYmxlfQotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0KLSAqIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgcGFzc2VkIHRoZSBsYXN0Ci0gKiBsaW5rIG9mIHRoZSBjaGFpbikuCi0gKiBUbyB1c2UsIHN1cHBseSBhIHN0YXJ0aW5nIGxpbmsgYW5kIHN1cHBseSBhIHtAbGluayBDaGFpbkl0ZXJhdG9yLkxpbmtlcn0gb3IKLSAqIHN1YmNsYXNzIDxjb2RlPkNoYWluSXRlcmFibGU8L2NvZGU+IGFuZCBvdmVycmlkZSB0aGUKLSAqIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0gbWV0aG9kLgotICogVGhlIHN0YXJ0aW5nIGxpbmsgd2lsbCBiZSB0aGUgZmlyc3Qgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yLgotICogSWYgdGhlIHN0YXJ0aW5nIGxpbmsgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBpdGVyYWJsZSB3aWxsIGJlIGVtcHR5LgotICogTm90ZSB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDaGFpbkl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgRSBzdGFydExpbms7Ci0JcHJpdmF0ZSBmaW5hbCBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxFPiBsaW5rZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBhIGRlZmF1bHQgbGlua2VyIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIENoYWluSXRlcmF0b3IuTGlua2VyfS4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYWJsZShFIHN0YXJ0TGluaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YXJ0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdExpbmtlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBsaW5rZXIuCi0JICovCi0JcHVibGljIENoYWluSXRlcmFibGUoRSBzdGFydExpbmssIENoYWluSXRlcmF0b3IuTGlua2VyPEU+IGxpbmtlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YXJ0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSBsaW5rZXI7Ci0JfQotCi0JcHJvdGVjdGVkIENoYWluSXRlcmF0b3IuTGlua2VyPEU+IGJ1aWxkRGVmYXVsdExpbmtlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0TGlua2VyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8RT4odGhpcy5zdGFydExpbmssIHRoaXMubGlua2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbiBhbHRlcm5hdGl2ZSB0bwotCSAqIGJ1aWxkaW5nIGEge0BsaW5rIENoYWluSXRlcmF0b3IuTGlua2VyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgRSBuZXh0TGluayhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBjdXJyZW50TGluaykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zdGFydExpbmspOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbGlua2VyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0TGlua2VyIGltcGxlbWVudHMgQ2hhaW5JdGVyYXRvci5MaW5rZXI8RT4gewotCQlwdWJsaWMgRSBuZXh0TGluayhFIGN1cnJlbnRMaW5rKSB7Ci0JCQlyZXR1cm4gQ2hhaW5JdGVyYWJsZS50aGlzLm5leHRMaW5rKGN1cnJlbnRMaW5rKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYTIxYTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLQotLyoqCi0gKiBQdWxsIHRvZ2V0aGVyIHJlbW92ZXIgc3RhdGUgYW5kIGJlaGF2aW9yIGZvciBzdWJjbGFzc2VzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIExpdmVDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbG9uZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCWZpbmFsIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiByZW1vdmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2xvbmVJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZW1vdmVyID0gdGhpcy5idWlsZERlZmF1bHRSZW1vdmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsb25lSXRlcmFibGUoQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IHJlbW92ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZW1vdmVyID0gcmVtb3ZlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPEU+IGJ1aWxkRGVmYXVsdFJlbW92ZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFJlbW92ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCByZW1vdmFsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZnJvbSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQ2xvbmVJdGVyYXRvci5SZW1vdmVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBtdXRhdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0UmVtb3ZlciBpbXBsZW1lbnRzIENsb25lSXRlcmF0b3IuUmVtb3ZlcjxFPiB7Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZShFIGVsZW1lbnQpIHsKLQkJCUNsb25lSXRlcmFibGUudGhpcy5yZW1vdmUoZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OGM0MjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIFB1bGwgdG9nZXRoZXIgbXV0YXRvciBzdGF0ZSBhbmQgYmVoYXZpb3IgZm9yIHN1YmNsYXNzZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZQotICogQHNlZSBMaXZlQ2xvbmVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENsb25lTGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlmaW5hbCBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IG11dGF0b3I7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDbG9uZUxpc3RJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tdXRhdG9yID0gdGhpcy5idWlsZERlZmF1bHRNdXRhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENsb25lTGlzdEl0ZXJhYmxlKENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gbXV0YXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotCX0KLQotCXByb3RlY3RlZCBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IGJ1aWxkRGVmYXVsdE11dGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE11dGF0b3IoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBtdXRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQXQgdGhlIHNwZWNpZmllZCBpbmRleCwgYWRkIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIHN1YmNsYXNzIGFzIGFuCi0JICogYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcn0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGVsZW1lbnQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBdCB0aGUgc3BlY2lmaWVkIGluZGV4LCBzZXQgdGhlIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUgZWxlbWVudCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBtdXRhdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0TXV0YXRvciBpbXBsZW1lbnRzIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gewotCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJCUNsb25lTGlzdEl0ZXJhYmxlLnRoaXMuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCQlDbG9uZUxpc3RJdGVyYWJsZS50aGlzLnJlbW92ZShpbmRleCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCQlDbG9uZUxpc3RJdGVyYWJsZS50aGlzLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MjczN2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVJdGVyYWJsZTwvY29kZT4gd3JhcHMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogb2Yge0BsaW5rIEl0ZXJhYmxlfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiB7QGxpbmsgSXRlcmFibGV9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ29tcG9zaXRlSXRlcmF0b3IKLSAqIEBzZWUgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGVzID0gaXRlcmFibGVzOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEUgb2JqZWN0LCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KG9iamVjdCksIGl0ZXJhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYWJsZSwgbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+Li4uIGl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhYmxlPEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4oaXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogY29tYmluZWQgaXRlcmF0b3JzCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPEU+KHRoaXMuaXRlcmF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIGl0ZXJhdG9yIG9mIGl0ZXJhdG9ycwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJdGVyYWJsZTw/IGV4dGVuZHMgRT4sIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4odGhpcy5pdGVyYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IHRyYW5zZm9ybShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogaXRlcmF0b3Igb2YgaXRlcmFibGVzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmFibGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmY3NTYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGEge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIG9mIHtAbGluayBMaXN0SXRlcmFibGV9cyBhbmQgbWFrZXMgdGhlbSBhcHBlYXIgdG8gYmUgYSBzaW5nbGUKLSAqIHtAbGluayBMaXN0SXRlcmFibGV9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIENvbXBvc2l0ZUxpc3RJdGVyYXRvcgotICogQHNlZSBDb21wb3NpdGVJdGVyYWJsZQotICogQHNlZSBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPEU+PiBpdGVyYWJsZXM7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0PExpc3RJdGVyYWJsZTxFPj4gaXRlcmFibGVzKSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPEU+PihpdGVyYWJsZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3QgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4+IGl0ZXJhYmxlcykgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlcyA9IGl0ZXJhYmxlczsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoRSBvYmplY3QsIExpc3Q8RT4gbGlzdCkgewotCQl0aGlzKG9iamVjdCwgbmV3IExpc3RMaXN0SXRlcmFibGU8RT4obGlzdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmFibGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShFIG9iamVjdCwgTGlzdEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8RT4ob2JqZWN0KSwgaXRlcmFibGUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlKExpc3Q8RT4gbGlzdCwgRSBvYmplY3QpIHsKLQkJdGhpcyhuZXcgTGlzdExpc3RJdGVyYWJsZTxFPihsaXN0KSwgb2JqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmFibGUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8RT4gaXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmFibGUsIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgaXRlcmFibGVzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPEU+Li4uIGl0ZXJhYmxlcykgewotCQl0aGlzKG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0SXRlcmFibGU8RT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdDxFPi4uLiBsaXN0cykgewotCQl0aGlzKG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxMaXN0PEU+LCBMaXN0SXRlcmFibGU8RT4+KG5ldyBBcnJheUxpc3RJdGVyYWJsZTxMaXN0PEU+PihsaXN0cykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxFPiB0cmFuc2Zvcm0oTGlzdDxFPiBsaXN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBMaXN0TGlzdEl0ZXJhYmxlPEU+KGxpc3QpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBjb21iaW5lZCBsaXN0IGl0ZXJhdG9ycwotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KHRoaXMuaXRlcmF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIGxpc3QgaXRlcmF0b3Igb2YgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8RT4+IGl0ZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0SXRlcmFibGU8RT4sIExpc3RJdGVyYXRvcjxFPj4odGhpcy5pdGVyYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IHRyYW5zZm9ybShMaXN0SXRlcmFibGU8RT4gbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogbGlzdCBpdGVyYXRvciBvZiBsaXN0IGl0ZXJhYmxlcwotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYWJsZTxFPj4gaXRlcmFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0VtcHR5SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNlZDFjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotCi0vKioKLSAqIEFuIDxjb2RlPkVtcHR5SXRlcmFibGU8L2NvZGU+IGlzIGp1c3QgdGhhdC4KLSAqIE1heWJlIGp1c3QgYSB0b3VjaCBiZXR0ZXItcGVyZm9ybWluZyB0aGFuIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjRU1QVFlfU0VUfQotICogc2luY2Ugd2UgZG9uJ3QgY3JlYXRlIGEgbmV3IHtAbGluayBJdGVyYXRvcn0gZXZlcnkgdGltZSB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzIGNhbGxlZC4KLSAqIChOb3Qgc3VyZSB3aHkgdGhleSBkbyB0aGF0Li4uLikKLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIEVtcHR5SXRlcmF0b3IKLSAqIEBzZWUgRW1wdHlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVtcHR5SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+LCBTZXJpYWxpemFibGUKLXsKLQkvLyBzaW5nbGV0b24KLQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlIElOU1RBTkNFID0gbmV3IEVtcHR5SXRlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5SXRlcmFibGUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY2MTNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQW4gPGNvZGU+RW1wdHlMaXN0SXRlcmFibGU8L2NvZGU+IGlzIGp1c3QgdGhhdC4KLSAqIE1heWJlIGp1c3QgYSB0b3VjaCBiZXR0ZXItcGVyZm9ybWluZyB0aGFuIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbnMjRU1QVFlfTElTVH0KLSAqIHNpbmNlIHdlIGRvbid0IGNyZWF0ZSBhIG5ldyB7QGxpbmsgSXRlcmF0b3J9IGV2ZXJ5IHRpbWUge0BsaW5rICNpdGVyYXRvcigpfSBpcyBjYWxsZWQuCi0gKiAoTm90IHN1cmUgd2h5IHRoZXkgZG8gdGhhdC4uLi4pCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgRW1wdHlMaXN0SXRlcmF0b3IKLSAqIEBzZWUgRW1wdHlJdGVyYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFPiwgU2VyaWFsaXphYmxlCi17Ci0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0SXRlcmFibGUgSU5TVEFOQ0UgPSBuZXcgRW1wdHlMaXN0SXRlcmFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IExpc3RJdGVyYWJsZTxUPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbXB0eUxpc3RJdGVyYWJsZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZjBkOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYWJsZTwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmFibGV9Ci0gKiBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9IHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50cyBpbiB0aGUKLSAqIG5lc3RlZCBpdGVyYWJsZSBhcmUgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IuCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0sIGEgc3ViY2xhc3MKLSAqIG9mIDxjb2RlPkZpbHRlcmluZ0l0ZXJhYmxlPC9jb2RlPiBjYW4gb3ZlcnJpZGUgdGhlCi0gKiB7QGxpbmsgI2FjY2VwdChPYmplY3QpfSBtZXRob2QuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgZmlsdGVyZWQKLSAqIAotICogQHNlZSBGaWx0ZXJpbmdJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0JcHJpdmF0ZSBmaW5hbCBGaWx0ZXI8RT4gZmlsdGVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhYmxlIGFuZCBhIGRlZmF1bHQgZmlsdGVyIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCQl0aGlzLmZpbHRlciA9IHRoaXMuYnVpbGREZWZhdWx0RmlsdGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBpdGVyYWJsZSBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUsIEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsdGVyPEU+IGJ1aWxkRGVmYXVsdEZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0RmlsdGVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPEU+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSwgdGhpcy5maWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0JICogc2hvdWxkIHJldHVybiB0aGUgc3BlY2lmaWVkIG5leHQgZWxlbWVudCBmcm9tIGEgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfSBtZXRob2QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIG8pIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgZmlsdGVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyPEU+IHsKLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEUgbykgewotCQkJcmV0dXJuIEZpbHRlcmluZ0l0ZXJhYmxlLnRoaXMuYWNjZXB0KG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0dyYXBoSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE5MTJhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR3JhcGhJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmFibGU8L2NvZGU+IGlzIHNpbWlsYXIgdG8gYSB7QGxpbmsgVHJlZUl0ZXJhYmxlfQotICogZXhjZXB0IHRoYXQgaXQgY2Fubm90IGJlIGFzc3VtZWQgdGhhdCBhbGwgbm9kZXMgYXNzdW1lIGEgc3RyaWN0IHRyZWUKLSAqIHN0cnVjdHVyZS4gRm9yIGluc3RhbmNlLCBpbiBhIHRyZWUsIGEgbm9kZSBjYW5ub3QgYmUgYSBkZXNjZW5kZW50IG9mCi0gKiBpdHNlbGYsIGJ1dCBhIGdyYXBoIG1heSBoYXZlIGEgY3ljbGljYWwgc3RydWN0dXJlLgotICogCi0gKiBBIDxjb2RlPkdyYXBoSXRlcmFibGU8L2NvZGU+IHNpbXBsaWZpZXMgdGhlIHRyYXZlcnNhbCBvZiBhCi0gKiBncmFwaCBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBuZXh0IGNvbGxlY3Rpb24gb2Ygbm9kZXMgaW4gdGhlIGdyYXBoLAotICogKG9yIDxlbT5uZWlnaGJvcnM8L2VtPiksIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvcgotICogZ2V0dGluZyA8ZW0+YWxsPC9lbT4gb2YgdGhlIG5vZGVzIGluIHRoZSBncmFwaC4KLSAqIChlLmcuIGEgbmVpZ2hib3IgY2FuIHJldHVybiBoaXMgbmVpZ2hib3JzLCBhbmQgdGhvc2UgbmVpZ2hib3JzCi0gKiBjYW4gcmV0dXJuIHRoZWlyIG5laWdoYm9ycywgd2hpY2ggbWlnaHQgYWxzbyBpbmNsdWRlIHRoZSBvcmlnaW5hbAotICogbmVpZ2hib3IsIGJ1dCB5b3Ugb25seSB3YW50IHRvIHZpc2l0IHRoZSBvcmlnaW5hbCBuZWlnaGJvciBvbmNlLikKLSAqIDxwPgotICogSWYgYSBuZWlnaGJvciBoYXMgYWxyZWFkeSBiZWVuIHZpc2l0ZWQgKGRldGVybWluZWQgYnkgdXNpbmcgCi0gKiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSksIHRoYXQgbmVpZ2hib3IgaXMgbm90IHZpc2l0ZWQgYWdhaW4sCi0gKiBub3IgYXJlIHRoZSBuZWlnaGJvcnMgb2YgdGhhdCBvYmplY3QuCi0gKiA8cD4KLSAqIEl0IGlzIHVwIHRvIHRoZSB1c2VyIG9mIHRoaXMgY2xhc3MgdG8gZW5zdXJlIGEgPGVtPmNvbXBsZXRlPC9lbT4gZ3JhcGguCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSBpbml0aWFsIG5vZGUgb2YgdGhlIGdyYXBoIG9yIGFuIHtAbGluayBJdGVyYWJsZX0KLSAqIG9mIHRoZSBpbml0aWFsIGNvbGxlY3Rpb24gb2YgZ3JhcGggbm9kZXMKLSAqIDxsaT4gYSB7QGxpbmsgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnN9IHRoYXQgdGVsbHMgd2hvIHRoZSBuZWlnaGJvcnMgYXJlCi0gKiBvZiBlYWNoIG5vZGUKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5HcmFwaEl0ZXJhYmxlPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QpCi0gKiA8L3VsPgotICogVGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMgYmVoYXZpb3IsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgR3JhcGhJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290czsKLQlwcml2YXRlIGZpbmFsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VyczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgZ3JhcGggd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QKLQkgKiBhbmQgYSBkZWZhdWx0IE1yLiBSb2dlcnMgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFIHJvb3QpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSBncmFwaCAKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFIHJvb3QsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4ocm9vdCksIG1pc3RlclJvZ2Vycyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgZ3JhcGggCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkZWZhdWx0IE1yLiBSb2dlcnMgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25laWdoYm9ycyhPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFLi4uIHJvb3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShFW10gcm9vdHMsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQl0aGlzKEFycmF5cy5hc0xpc3Qocm9vdHMpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGVmYXVsdCBNci4gUm9nZXJzIHRoYXQgY2FsbHMgYmFjayB0byB0aGUgaXRlcmFibGUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2Vyc30uCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdHMgPSByb290czsKLQkJdGhpcy5taXN0ZXJSb2dlcnMgPSB0aGlzLmJ1aWxkRGVmYXVsdE1pc3RlclJvZ2VycygpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIGdyYXBoIAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgTXIuIFJvZ2Vycy4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMsIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlzdGVyUm9nZXJzID0gbWlzdGVyUm9nZXJzOwotCX0KLQotCXByb3RlY3RlZCBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiBidWlsZERlZmF1bHRNaXN0ZXJSb2dlcnMoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1pc3RlclJvZ2VycygpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yPEU+KHRoaXMucm9vdHMsIHRoaXMubWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5laWdoYm9ycyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRSBuZXh0KSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJvb3RzKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiBkZWZhdWx0IE1yLiBSb2dlcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRNaXN0ZXJSb2dlcnMgaW1wbGVtZW50cyBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxFPiB7Ci0JCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbmVpZ2hib3JzKEUgbm9kZSkgewotCQkJcmV0dXJuIEdyYXBoSXRlcmFibGUudGhpcy5uZWlnaGJvcnMobm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MYXRlcmFsSXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGF0ZXJhbEl0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I2NTZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MYXRlcmFsSXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYW4KLSAqIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiA8ZW0+QXNzdW1lPC9lbT4gdGhlIHdyYXBwZWQKLSAqIGl0ZXJhYmxlIGNvbnRhaW5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIFRoZSByZXN1bHQgaXMgYQotICoge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZhbHNlLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSB3cmFwcGVkIGl0ZXJhYmxlCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIExhdGVyYWxJdGVyYXRvcldyYXBwZXIKLSAqIEBzZWUgU3ViSXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXRlcmFsSXRlcmFibGVXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8RTE+IGl0ZXJhYmxlOwotCi0KLQlwdWJsaWMgTGF0ZXJhbEl0ZXJhYmxlV3JhcHBlcihJdGVyYWJsZTxFMT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xhdGVyYWxMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGF0ZXJhbExpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0NzcyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGF0ZXJhbExpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5MYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIDxlbT5Bc3N1bWU8L2VtPiB0aGUKLSAqIHdyYXBwZWQgaXRlcmFibGUgY29udGFpbnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIFRoZSByZXN1bHQgaXMgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZmFsc2UuCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyBjb250YWluZWQgYnkgdGhlIHdyYXBwZWQgbGlzdCBpdGVyYWJsZQotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIExhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyCi0gKiBAc2VlIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIExhdGVyYWxMaXN0SXRlcmFibGVXcmFwcGVyPEUxLCBFMj4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYWJsZTxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTxFMT4gaXRlcmFibGU7Ci0KLQotCXB1YmxpYyBMYXRlcmFsTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpKTsKLQl9Ci0KLQlwdWJsaWMgTGF0ZXJhbExpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTGF0ZXJhbExpc3RJdGVyYXRvcldyYXBwZXI8RTEsIEUyPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFiYWI4Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+TGlzdEl0ZXJhYmxlPC9jb2RlPiBzaW1wbHkgZXh0ZW5kcyB7QGxpbmsgSXRlcmFibGV9Ci0gKiB0byByZXR1cm4gYSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICovCi1wdWJsaWMgaW50ZXJmYWNlIExpc3RJdGVyYWJsZTxFPgotCWV4dGVuZHMgSXRlcmFibGU8RT4KLXsKLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IGl0ZXJhdG9yIG92ZXIgYSBzZXQgb2YgZWxlbWVudHMgb2YgdHlwZSBFLgotCSAqLwotCUxpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXN0TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNWE1ZDcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpc3RMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5MaXN0TGlzdEl0ZXJhYmxlPC9jb2RlPiBhZGFwdHMgYSB7QGxpbmsgTGlzdH0KLSAqIHRvIHRoZSB7QGxpbmsgTGlzdEl0ZXJhYmxlfSBpbnRlcmZhY2UuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3Q8RT4gbGlzdDsKLQotCXB1YmxpYyBMaXN0TGlzdEl0ZXJhYmxlKExpc3Q8RT4gbGlzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGFhY2NmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPiByZXR1cm5zIGFuIGl0ZXJhdG9yIG9uIGEgY3VycmVudCBjb3B5IG9mIGEKLSAqIGNvbGxlY3Rpb24sIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQQotICogY29weSBvZiB0aGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUge0BsaW5rICNpdGVyYXRvcigpfSBpcwotICogY2FsbGVkLiBBcyBhIHJlc3VsdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb2xsZWN0aW9uIGNhbiBiZSBkaWZmZXJlbnQgd2l0aAotICogZWFjaCBjYWxsIHRvIHtAbGluayAjaXRlcmF0b3IoKX0gKGkuZS4gaXQgaXMgImxpdmUiKS4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4ncwotICogY29uc3RydWN0b3Igc2hvdWxkIGJlIHRocmVhZC1zYWZlIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkgYSA8Y29kZT5MaXZlQ2xvbmVJdGVyYWJsZTwvY29kZT4gZG9lcyBub3QKLSAqIHN1cHBvcnQgdGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QKLSAqIGhhdmUgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLiBCdXQgaWYgdGhlIDxjb2RlPkxpdmVDbG9uZUl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhbiB7QGxpbmsgQ2xvbmVJdGVyYXRvci5SZW1vdmVyfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIDxjb2RlPlJlbW92ZXI8L2NvZGU+LgotICogQWx0ZXJuYXRpdmVseSwgYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLSAqIG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIENsb25lSXRlcmF0b3IKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIExpdmVDbG9uZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lSXRlcmFibGU8RT4KLQlleHRlbmRzIENsb25lSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb247Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJsaXZlIiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgaXRlcmF0b3IgcmV0dXJuZWQgYnkge0BsaW5rICNpdGVyYXRvcigpfQotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotCSAqIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lSXRlcmFibGUoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJsaXZlIiBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFRoZSBzcGVjaWZpZWQgcmVtb3ZlciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBpdGVyYXRvcnMgdG8KLQkgKiByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBMaXZlQ2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uLCB0aGlzLnJlbW92ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjY1NTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPiByZXR1cm5zIGEgbGlzdCBpdGVyYXRvciBvbiBhIGN1cnJlbnQKLSAqIGNvcHkgb2YgYSBsaXN0LCBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEEKLSAqIGNvcHkgb2YgdGhlIGxpc3QgaXMgY3JlYXRlZCBldmVyeSB0aW1lIHtAbGluayAjaXRlcmF0b3IoKX0gaXMKLSAqIGNhbGxlZC4gQXMgYSByZXN1bHQsIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCBjYW4gYmUgZGlmZmVyZW50IHdpdGgKLSAqIGVhY2ggY2FsbCB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9IChpLmUuIGl0IGlzICJsaXZlIikuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBsaXN0IHBhc3NlZCB0byB0aGUgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdGhyZWFkLXNhZmUgKGUuZy4ge0BsaW5rIGphdmEudXRpbC5WZWN0b3J9KTsKLSAqIG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mIGEgY29ycnVwdGVkIGxpc3QuCi0gKiA8cD4KLSAqIEJ5IGRlZmF1bHQsIHRoZSBsaXN0IGl0ZXJhdG9yIHJldHVybmVkIGJ5IGEgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogZG9lcyBub3Qgc3VwcG9ydCB0aGUgbW9kaWZ5IG9wZXJhdGlvbnM7IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuIEJ1dCBpZiB0aGUgPGNvZGU+TGl2ZUNsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhbiB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcn0gaXQgd2lsbCBkZWxlZ2F0ZSB0aGUKLSAqIG1vZGlmeSBvcGVyYXRpb25zIHRvIHRoZSA8Y29kZT5NdXRhdG9yPC9jb2RlPi4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbXV0YXRpb24KLSAqIG1ldGhvZHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgQ2xvbmVMaXN0SXRlcmF0b3IKLSAqIEBzZWUgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZQotICogQHNlZSBMaXZlQ2xvbmVJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdDw/IGV4dGVuZHMgRT4gbGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgImxpdmUiIGxpc3QgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBUaGUge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9ucyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgbGlzdCBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBpdGVyYWJsZSdzIG11dGF0aW9uCi0JICogbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAibGl2ZSIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSBzcGVjaWZpZWQgbXV0YXRvciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBsaXN0IGl0ZXJhdG9ycyB0bwotCSAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8RT4gbXV0YXRvcikgewotCQlzdXBlcihtdXRhdG9yKTsKLQkJdGhpcy5saXN0ID0gbGlzdDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEl0ZXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0LCB0aGlzLm11dGF0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1BlZWthYmxlSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzODFlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUGVla2FibGVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlBlZWthYmxlSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHJldHVybnMgYW4ge0BsaW5rIFBlZWthYmxlSXRlcmF0b3J9IHRoYXQgYWxsb3dzIGEKLSAqIHtAbGluayBQZWVrYWJsZUl0ZXJhdG9yI3BlZWsoKSBwZWVrfSBhdCB0aGUgbmV4dCBlbGVtZW50IHRvIGJlIAotICogcmV0dXJuZWQgYnkge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgaXRlcmF0b3IgaXMgdGhhdAotICogdGhlIG5lc3RlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZAotICogPGVtPmJlZm9yZTwvZW0+IHRoZSBwZWVrYWJsZSBpdGVyYXRvcidzIHtAbGluayBJdGVyYXRvciNuZXh0KCl9Ci0gKiBtZXRob2QgaXMgaW52b2tlZC4gVGhpcyBpcyBiZWNhdXNlIHRoZSAibmV4dCIgZWxlbWVudCBtdXN0IGJlCi0gKiBwcmUtbG9hZGVkIGZvciB0aGUge0BsaW5rIFBlZWthYmxlSXRlcmF0b3IjcGVlaygpfSBtZXRob2QuCi0gKiBUaGlzIGFsc28gcHJldmVudHMgYSBwZWVrYWJsZSBpdGVyYXRvciBmcm9tIHN1cHBvcnRpbmcgdGhlIG9wdGlvbmFsCi0gKiB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFBlZWthYmxlSXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFBlZWthYmxlSXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwZWVrYWJsZSBpdGVyYWJsZSB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQKLQkgKiBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUGVla2FibGVJdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZSA9IGl0ZXJhYmxlOwotCX0KLQotCXB1YmxpYyBQZWVrYWJsZUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFBlZWthYmxlSXRlcmF0b3I8RT4odGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1F1ZXVlSXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyYWE2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlF1ZXVlSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5RdWV1ZUl0ZXJhYmxlPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmFibGV9Ci0gKiBmb3IgYSB7QGxpbmsgUXVldWV9IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhlIHF1ZXVlJ3MgZWxlbWVudHMKLSAqIGFyZSB7QGxpbmsgUXVldWUjZGVxdWV1ZSgpIGRlcXVldWV9ZCIgYXMgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucwotICogdGhlbSB3aXRoIGNhbGxzIHRvIHtAbGluayBJdGVyYXRvciNuZXh0KCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUXVldWUKLSAqIEBzZWUgUXVldWVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUXVldWVJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIFF1ZXVlPEU+IHF1ZXVlOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlLgotCSAqLwotCXB1YmxpYyBRdWV1ZUl0ZXJhYmxlKFF1ZXVlPEU+IHF1ZXVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUXVldWVJdGVyYXRvcjxFPih0aGlzLnF1ZXVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnF1ZXVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMjgxMGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTwvY29kZT4gd3JhcHMgYSB7QGxpbmsgTGlzdEl0ZXJhYmxlfQotICogb2Yge0BsaW5rIExpc3RJdGVyYWJsZX1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICogcmVhZC1vbmx5IHtAbGluayBMaXN0SXRlcmFibGV9LiBBIHJlYWQtb25seSBjb21wb3NpdGUgbGlzdAotICogaXRlcmFibGUgaXMgbW9yZSBmbGV4aWJsZSB0aGFuIGEgbm9ybWFsIGNvbXBvc2l0ZSBsaXN0IGl0ZXJhYmxlIHdoZW4gaXQKLSAqIGNvbWVzIHRvIHRoZSBlbGVtZW50IHR5cGVzIG9mIHRoZSBuZXN0ZWQgbGlzdCBpdGVyYWJsZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmFibGUncyBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IKLSAqIEBzZWUgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlczsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+PiBpdGVyYWJsZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYWJsZXMgPSBpdGVyYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYWJsZS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoRSBvYmplY3QsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpLCBpdGVyYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhYmxlLCBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxFPihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGUoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4oaXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogY29tYmluZWQgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEU+KHRoaXMuaXRlcmF0b3JzKCkpOwotCX0KLQotCS8qKgotCSAqIGxpc3QgaXRlcmF0b3Igb2YgbGlzdCBpdGVyYXRvcnMKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4odGhpcy5pdGVyYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBsaXN0IGl0ZXJhdG9yIG9mIGxpc3QgaXRlcmFibGVzCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gaXRlcmFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZXMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhYmxlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ4MzkyOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHJldHVybnMgYSByZWFkLW9ubHkge0BsaW5rIEl0ZXJhdG9yfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFJlYWRPbmx5SXRlcmF0b3IKLSAqIEBzZWUgUmVhZE9ubHlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSB0aGUgcmV0dXJucyBhIHJlYWQtb25seSBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWZkZTQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+UmVhZE9ubHlMaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIGFuZCByZXR1cm5zIGEgcmVhZC1vbmx5IHtAbGluayBMaXN0SXRlcmF0b3J9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFJlYWRPbmx5TGlzdEl0ZXJhdG9yCi0gKiBAc2VlIFJlYWRPbmx5SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFJlYWRPbmx5TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHRoZSByZXR1cm5zIGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzCi0JICogaW4gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RJdGVyYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmFibGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGVhM2E3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiB0aGF0IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8ge0BsaW5rIEl0ZXJhdG9yI2hhc05leHQoKX0uCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudEl0ZXJhYmxlPC9jb2RlPiBpcyBlcXVpdmFsZW50IHRvIHRoZQotICoge0BsaW5rIEl0ZXJhYmxlfSByZXR1cm5lZCBieToKLSAqIAl7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbihPYmplY3QpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRJdGVyYXRvcgotICogQHNlZSBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudEl0ZXJhYmxlKEUgZWxlbWVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4odGhpcy5lbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTIxMDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiB0aGF0IGhvbGRzIGEgc2luZ2xlIGVsZW1lbnQKLSAqIGFuZCByZXR1cm5zIGl0IHdpdGggdGhlIGZpcnN0IGNhbGwgdG8ge0BsaW5rIExpc3RJdGVyYXRvciNuZXh0KCl9LCBhdAotICogd2hpY2ggcG9pbnQgaXQgd2lsbCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGFueSBzdWJzZXF1ZW50Ci0gKiBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjaGFzTmV4dCgpfS4gTGlrZXdpc2UsIGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotICogdG8gYSBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjaGFzUHJldmlvdXMoKX0gdW50aWwgYSBjYWxsIHRvIHtAbGluayBMaXN0SXRlcmF0b3IjbmV4dCgpfSwKLSAqIGF0IHdoaWNoIHBvaW50IGEgY2FsbCB0byB7QGxpbmsgTGlzdEl0ZXJhdG9yI3ByZXZpb3VzKCl9IHdpbGwgcmV0dXJuIHRoZQotICogc2luZ2xlIGVsZW1lbnQuCi0gKiA8cD4KLSAqIEEgPGNvZGU+U2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUKLSAqIHtAbGluayBJdGVyYWJsZX0gcmV0dXJuZWQgYnk6Ci0gKiAJe0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaW5nbGV0b25MaXN0KE9iamVjdCl9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IKLSAqIEBzZWUgU2luZ2xlRWxlbWVudEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEUgZWxlbWVudDsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmFibGUgdGhhdCBjb250YWlucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZShFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4odGhpcy5lbGVtZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmJlZWJlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TbmFwc2hvdENsb25lSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci0KLS8qKgotICogQSA8Y29kZT5TbmFwc2hvdENsb25lSXRlcmFibGU8L2NvZGU+IHJldHVybnMgYW4gaXRlcmF0b3Igb24gYSAic25hcHNob3QiIG9mIGEKLSAqIGNvbGxlY3Rpb24sIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4gQQotICogY29weSBvZiB0aGUgY29sbGVjdGlvbiBpcyBjcmVhdGVkIHdoZW4gdGhlIGl0ZXJhYmxlIGlzIGNvbnN0cnVjdGVkLgotICogQXMgYSByZXN1bHQsIHRoZSBjb250ZW50cyBvZiB0aGUgY29sbGVjdGlvbiB3aWxsIGJlIHRoZSBzYW1lIHdpdGgKLSAqIGV2ZXJ5IGNhbGwgdG8ge0BsaW5rICNpdGVyYXRvcigpfS4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5TbmFwc2hvdENsb25lSXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgY29sbGVjdGlvbi4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IGEgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPiBkb2VzIG5vdAotICogc3VwcG9ydCB0aGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+U25hcHNob3RDbG9uZUl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBDbG9uZUl0ZXJhdG9yLlJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgSXRlcmF0b3IjcmVtb3ZlKCl9IG9wZXJhdGlvbiB0byB0aGUgPGNvZGU+UmVtb3ZlcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgaXRlcmFibGUncyB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogPHA+Ci0gKiBUaGlzIGl0ZXJhYmxlIGlzIHVzZWZ1bCBmb3IgbXVsdGlwbGUgcGFzc2VzIG92ZXIgYSBjb2xsZWN0aW9uIHRoYXQgc2hvdWxkIG5vdAotICogYmUgY2hhbmdlZCAoZS5nLiBieSBhbm90aGVyIHRocmVhZCkgYmV0d2VlbiBwYXNzZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUl0ZXJhdG9yCi0gKiBAc2VlIExpdmVDbG9uZUl0ZXJhYmxlCi0gKiBAc2VlIFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxFPgotCWV4dGVuZHMgQ2xvbmVJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJyYXk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICogVGhlIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0gb3BlcmF0aW9uIHdpbGwgbm90IGJlIHN1cHBvcnRlZAotCSAqIGJ5IHRoZSBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBpdGVyYWJsZSdzIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXJyYXkgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqIFRoZSBzcGVjaWZpZWQgcmVtb3ZlciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBpdGVyYXRvcnMgdG8KLQkgKiByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGUoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5hcnJheSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUge0BsaW5rIEl0ZXJhdG9yI3JlbW92ZSgpfSBvcGVyYXRpb24gd2lsbCBub3QgYmUgc3VwcG9ydGVkCi0JICogYnkgdGhlIGl0ZXJhdG9yIHJldHVybmVkIGJ5IHtAbGluayAjaXRlcmF0b3IoKX0KLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIGl0ZXJhYmxlJ3Mge0BsaW5rICNyZW1vdmUoT2JqZWN0KX0KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIFNuYXBzaG90Q2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYXJyYXkgPSBjb2xsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSAic25hcHNob3QiIGl0ZXJhYmxlIGZvciB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogVGhlIHNwZWNpZmllZCByZW1vdmVyIHdpbGwgYmUgdXNlZCBieSBhbnkgZ2VuZXJhdGVkIGl0ZXJhdG9ycyB0bwotCSAqIHJlbW92ZSBvYmplY3RzIGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIFNuYXBzaG90Q2xvbmVJdGVyYWJsZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uLCBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQlzdXBlcihyZW1vdmVyKTsKLQkJdGhpcy5hcnJheSA9IGNvbGxlY3Rpb24udG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDbG9uZUl0ZXJhdG9yPEU+KHRoaXMucmVtb3ZlciwgdGhpcy5hcnJheSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQXJyYXlzLnRvU3RyaW5nKHRoaXMuYXJyYXkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmUgaXRlcmF0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogcHJvdmlkZSBhY2Nlc3MgdG8gImludGVybmFsIiBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTG9jYWxDbG9uZUl0ZXJhdG9yPEU+IGV4dGVuZHMgQ2xvbmVJdGVyYXRvcjxFPiB7Ci0JCXByb3RlY3RlZCBMb2NhbENsb25lSXRlcmF0b3IoUmVtb3ZlcjxFPiByZW1vdmVyLCBPYmplY3RbXSBhcnJheSkgewotCQkJc3VwZXIocmVtb3ZlciwgYXJyYXkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0MmFiNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTwvY29kZT4gcmV0dXJucyBhIGxpc3QgaXRlcmF0b3Igb24gYQotICogInNuYXBzaG90IiBvZiBhIGxpc3QsIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLSAqIEEgY29weSBvZiB0aGUgbGlzdCBpcyBjcmVhdGVkIHdoZW4gdGhlIGxpc3QgaXRlcmFibGUgaXMgY29uc3RydWN0ZWQuCi0gKiBBcyBhIHJlc3VsdCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IHdpbGwgYmUgdGhlIHNhbWUgd2l0aAotICogZXZlcnkgY2FsbCB0byB7QGxpbmsgI2l0ZXJhdG9yKCl9LCBldmVuIGlmIHRoZSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkIHZpYQotICogdGhlIGxpc3QgaXRlcmF0b3IncyBtdXRhdGlvbiBtZXRob2RzLgotICogPHA+Ci0gKiBUaGUgb3JpZ2luYWwgbGlzdCBwYXNzZWQgdG8gdGhlIDxjb2RlPlNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB0aHJlYWQtc2FmZSAoZS5nLiB7QGxpbmsgamF2YS51dGlsLlZlY3Rvcn0pOwotICogb3RoZXJ3aXNlIHlvdSBydW4gdGhlIHJpc2sgb2YgYSBjb3JydXB0ZWQgbGlzdC4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgdGhlIGxpc3QgaXRlcmF0b3IgcmV0dXJuZWQgYnkgYSA8Y29kZT5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPiBkb2VzIG5vdAotICogc3VwcG9ydCB0aGUge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9uczsgdGhpcyBpcyBiZWNhdXNlIGl0IGRvZXMgbm90Ci0gKiBoYXZlIGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgbGlzdC4gQnV0IGlmIHRoZSA8Y29kZT5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICoge0BsaW5rIExpc3RJdGVyYXRvcn0gbXV0YXRpb24gb3BlcmF0aW9ucyB0byB0aGUgPGNvZGU+TXV0YXRvcjwvY29kZT4uCi0gKiBBbHRlcm5hdGl2ZWx5LCBhIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB0aGUgbGlzdCBpdGVyYWJsZSdzIG11dGF0aW9uCi0gKiBtZXRob2RzLgotICogPHA+Ci0gKiBUaGlzIGxpc3QgaXRlcmFibGUgaXMgdXNlZnVsIGZvciBtdWx0aXBsZSBwYXNzZXMgb3ZlciBhIGxpc3QgdGhhdCBzaG91bGQgbm90Ci0gKiBiZSBjaGFuZ2VkIChlLmcuIGJ5IGFub3RoZXIgdGhyZWFkKSBiZXR3ZWVuIHBhc3Nlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBDbG9uZUxpc3RJdGVyYXRvcgotICogQHNlZSBMaXZlQ2xvbmVMaXN0SXRlcmFibGUKLSAqIEBzZWUgU25hcHNob3RDbG9uZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlPEU+Ci0JZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYXJyYXk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBtb2RpZnkgb3BlcmF0aW9ucyB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKiBieSB0aGUgbGlzdCBpdGVyYXRvciByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9Ci0JICogdW5sZXNzIGEgc3ViY2xhc3Mgb3ZlcnJpZGVzIHRoZSBsaXN0IGl0ZXJhYmxlJ3MgbW9kaWZ5Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlKExpc3Q8PyBleHRlbmRzIEU+IGxpc3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hcnJheSA9IGxpc3QudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhICJzbmFwc2hvdCIgbGlzdCBpdGVyYWJsZSBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIFRoZSBzcGVjaWZpZWQgbXV0YXRvciB3aWxsIGJlIHVzZWQgYnkgYW55IGdlbmVyYXRlZCBsaXN0IGl0ZXJhdG9ycyB0bwotCSAqIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZShMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJc3VwZXIobXV0YXRvcik7Ci0JCXRoaXMuYXJyYXkgPSBsaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEl0ZXJhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxDbG9uZUxpc3RJdGVyYXRvcjxFPih0aGlzLm11dGF0b3IsIHRoaXMuYXJyYXkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIEFycmF5cy50b1N0cmluZyh0aGlzLmFycmF5KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25lIGl0ZXJhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIHByb3ZpZGUgYWNjZXNzIHRvICJpbnRlcm5hbCIgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2FsQ2xvbmVMaXN0SXRlcmF0b3I8RT4gZXh0ZW5kcyBDbG9uZUxpc3RJdGVyYXRvcjxFPiB7Ci0JCXByb3RlY3RlZCBMb2NhbENsb25lTGlzdEl0ZXJhdG9yKE11dGF0b3I8RT4gbXV0YXRvciwgT2JqZWN0W10gYXJyYXkpIHsKLQkJCXN1cGVyKG11dGF0b3IsIGFycmF5KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMWZlM2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TdGFja0l0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+U3RhY2tJdGVyYWJsZTwvY29kZT4gcHJvdmlkZXMgYW4ge0BsaW5rIEl0ZXJhYmxlfQotICogZm9yIGEge0BsaW5rIFN0YWNrfSBvZiBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4uIFRoZSBzdGFjaydzIGVsZW1lbnRzCi0gKiBhcmUge0BsaW5rIFN0YWNrI3BvcCgpICJwb3BwZWQifSBhcyB0aGUgaXRlcmFibGUncyBpdGVyYXRvciByZXR1cm5zCi0gKiB0aGVtIHdpdGggY2FsbHMgdG8ge0BsaW5rIEl0ZXJhdG9yI25leHQoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBTdGFjawotICogQHNlZSBTdGFja0l0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFja0l0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgU3RhY2s8RT4gc3RhY2s7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RhY2suCi0JICovCi0JcHVibGljIFN0YWNrSXRlcmFibGUoU3RhY2s8RT4gc3RhY2spIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zdGFjayA9IHN0YWNrOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTdGFja0l0ZXJhdG9yPEU+KHRoaXMuc3RhY2spOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhY2spOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykl0ZXJhYmxlV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykl0ZXJhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2Y1Y2IwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN1Ykl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTE8L2NvZGU+LCBjb252ZXJ0aW5nIGl0IGludG8gYW4KLSAqIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiA8ZW0+QXNzdW1lPC9lbT4gdGhlIHdyYXBwZWQKLSAqIGl0ZXJhYmxlIGNvbnRhaW5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIFRoZSByZXN1bHQgaXMgYQotICoge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZhbHNlLgotICogPHA+Ci0gKiBUaGlzIGlzIGxpa2UgYSB7QGxpbmsgTGF0ZXJhbEl0ZXJhYmxlV3JhcHBlcn0gYnV0IHdpdGggbW9yZSByZXN0cmljdGl2ZSB0eXBlCi0gKiBwYXJhbWV0ZXJzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSB3cmFwcGVkIGl0ZXJhYmxlCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIFN1Ykl0ZXJhdG9yV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3ViSXRlcmFibGVXcmFwcGVyPEUxLCBFMiBleHRlbmRzIEUxPgotCWltcGxlbWVudHMgSXRlcmFibGU8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxFMT4gaXRlcmFibGU7Ci0KLQotCXB1YmxpYyBTdWJJdGVyYWJsZVdyYXBwZXIoSXRlcmFibGU8RTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RTI+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdWJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NjVkMWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1Ykxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmFibGUgb2YgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIDxlbT5Bc3N1bWU8L2VtPiB0aGUKLSAqIHdyYXBwZWQgaXRlcmFibGUgY29udGFpbnMgb25seSBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4KLSAqIFRoZSByZXN1bHQgaXMgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZmFsc2UuCi0gKiA8cD4KLSAqIFRoaXMgaXMgbGlrZSBhIHtAbGluayBMYXRlcmFsTGlzdEl0ZXJhYmxlV3JhcHBlcn0gYnV0IHdpdGggbW9yZSByZXN0cmljdGl2ZSB0eXBlCi0gKiBwYXJhbWV0ZXJzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgY29udGFpbmVkIGJ5IHRoZSB3cmFwcGVkIGxpc3QgaXRlcmFibGUKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgbGlzdCBpdGVyYXRvcnMKLSAqIAotICogQHNlZSBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPEUxLCBFMiBleHRlbmRzIEUxPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZTsKLQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdDxFMT4gbGlzdCkgewotCQl0aGlzKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPEUxPihsaXN0KSk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+KHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzZTgzZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYWJsZSBvZiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgdGhlcmUKLSAqIGlzIG5vIHdheSB0byBhZGQgaW52YWxpZCBlbGVtZW50cyB0byB0aGUgaXRlcmFibGUuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBTdXBlckl0ZXJhYmxlV3JhcHBlcjxFPgotCWltcGxlbWVudHMgSXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlOwotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU3VwZXJJdGVyYWJsZVdyYXBwZXIoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHRoaXMgc2hvdWxkIGJlIGEgc2FmZSBjYXN0IC0gdGhlIGl0ZXJhdG9yIHdpbGwgb25seSBldmVyCi0JCS8vIHJldHVybiBFIChvciBhIHN1Yi10eXBlKSBmcm9tICNuZXh0KCkKLQkJdGhpcy5pdGVyYWJsZSA9IChJdGVyYWJsZTxFPikgaXRlcmFibGU7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiZTQzMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyOwotCi0vKioKLSAqIFdyYXAgYSBsaXN0IGl0ZXJhYmxlIG9mIGVsZW1lbnRzIG9mIGFueSBzdWItdHlwZSBvZiA8Y29kZT5FPC9jb2RlPiwKLSAqIGNvbnZlcnRpbmcgaXQgaW50byBhIDxlbT5ub24td3JpdGFibGU8L2VtPiBsaXN0IGl0ZXJhYmxlIG9mIGVsZW1lbnRzCi0gKiBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIHNpbmNlIHRoZSByZXN1bHRpbmcgbGlzdCBpdGVyYWJsZSdzIGxpc3QKLSAqIGl0ZXJhdG9yIGRpc2FibGVzIHRoZSBtZXRob2RzIHRoYXQgd291bGQgcHV0IGludmFsaWQgZWxlbWVudHMgaW4gdGhlIGxpc3QKLSAqIGl0ZXJhdG9yJ3MgYmFja2luZyBsaXN0IChpLmUuIHtAbGluayBTdXBlckxpc3RJdGVyYXRvcldyYXBwZXIjc2V0KE9iamVjdCl9Ci0gKiBhbmQge0BsaW5rIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlciNhZGQoT2JqZWN0KX0pLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSdzIGl0ZXJhdG9ycwotICogCi0gKiBAc2VlIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGU7Ci0KLQotCXB1YmxpYyA8VCBleHRlbmRzIEU+IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0PFQ+IGxpc3QpIHsKLQkJdGhpcyhuZXcgTGlzdExpc3RJdGVyYWJsZTxUPihsaXN0KSk7Ci0JfQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcjxFPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25JdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRjMTVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhYmxlfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIGVsZW1lbnRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIE9iamVjdHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4gYXJlIHRyYW5zZm9ybWVkIGludG8gb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPjsKLSAqIGkuZS4gdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yCi0gKiBAc2VlIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhYmxlPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmFibGUgPSBpdGVyYWJsZTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZCBpdGVyYWJsZQotCSAqIGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZShJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4odGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpLCB0aGlzLnRyYW5zZm9ybWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEUxIG8pIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmFibGUpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbGlua2VyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBvKSB7Ci0JCQlyZXR1cm4gVHJhbnNmb3JtYXRpb25JdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYyZDA1OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYWJsZXMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYWJsZX0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyBlbGVtZW50cyBmb3IgY2xpZW50IGNvbnN1bXB0aW9uLiBUbyB1c2UsIHN1cHBseSBhIAotICoge0BsaW5rIFRyYW5zZm9ybWVyfSBvciBzdWJjbGFzcyA8Y29kZT5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kLgotICogT2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiBhcmUgdHJhbnNmb3JtZWQgaW50byBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+OwotICogaS5lLiB0aGUgbGlzdCBpdGVyYWJsZSdzIGxpc3QgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhYmxlJ3MgaXRlcmF0b3IKLSAqIAotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcgotICogQHNlZSBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxFMSwgRTI+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmFibGU8RTI+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZTsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdAotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBsaXN0IGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZShMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgbGlzdCBpdGVyYWJsZQotCSAqIGFuZCBhIGRlZmF1bHQgdHJhbnNmb3JtZXIgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBsaXN0IGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0aGlzLmJ1aWxkRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3QKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3Q8RTE+IGxpc3QsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IExpc3RMaXN0SXRlcmFibGU8RTE+KGxpc3QpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3QgaXRlcmFibGUKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhYmxlID0gaXRlcmFibGU7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gYnVpbGREZWZhdWx0VHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPih0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCksIHRoaXMudHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICovCi0JcHJvdGVjdGVkIEUyIHRyYW5zZm9ybShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRTEgbykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYWJsZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogZGVmYXVsdCBsaW5rZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPEUxLCBFMj4gewotCQlwdWJsaWMgRTIgdHJhbnNmb3JtKEUxIG8pIHsKLQkJCXJldHVybiBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZS50aGlzLnRyYW5zZm9ybShvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmFibGVzL1RyZWVJdGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTNlMWZmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLQotLyoqCi0gKiBBIDxjb2RlPlRyZWVJdGVyYWJsZTwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIHRyZWUgb2Ygb2JqZWN0cywgd2hlcmUgdGhlIG9iamVjdHMnIHByb3RvY29sKHMpIHByb3ZpZGVzCi0gKiBhIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBnaXZlbgotICogbm9kZSBidXQgZG9lcyBub3QgcHJvdmlkZSBhIG1ldGhvZCBmb3IgZ2V0dGluZyBhbGwgdGhlCi0gKiBkZXNjZW5kYW50cyAoY2hpbGRyZW4sIGdyYW5kY2hpbGRyZW4sIGV0Yy4pIG9mIHRoZSBnaXZlbiBub2RlLgotICogPHA+Ci0gKiBUbyB1c2UsIHN1cHBseTo8dWw+Ci0gKiA8bGk+IGVpdGhlciB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSB0cmVlIG9yLCBpZiB0aGUgdHJlZSBoYXMKLSAqIG11bHRpcGxlIHJvb3RzLCBhbiB7QGxpbmsgSXRlcmFibGV9IG9mIHRoZSBzZXQgb2Ygcm9vdHMKLSAqIDxsaT4gYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuIG9mIGVhY2ggY2hpbGQKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5UcmVlSXRlcmFibGU8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUncyBpdGVyYXRvcgotICogCi0gKiBAc2VlIFRyZWVJdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgVHJlZUl0ZXJhYmxlPEU+Ci0JaW1wbGVtZW50cyBJdGVyYWJsZTxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzOwotCXByaXZhdGUgZmluYWwgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290Ci0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFIHJvb3QsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEU+KHJvb3QpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUgbm9kZXMgb2YgYSB0cmVlIHdpdGggdGhlIHNwZWNpZmllZCByb290cwotCSAqIGFuZCBhIGRlZmF1bHQgbWlkd2lmZSB0aGF0IGNhbGxzIGJhY2sgdG8gdGhlIGl0ZXJhYmxlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmVlSXRlcmF0b3IuTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFLi4uIHJvb3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChyb290cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYWJsZSBjb250YWluaW5nIHRoZSBub2RlcyBvZiBhIHRyZWUgd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzCi0JICogYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYWJsZShFW10gcm9vdHMsIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IG1pZHdpZmUpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KHJvb3RzKSwgbWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgYSBkZWZhdWx0IG1pZHdpZmUgdGhhdCBjYWxscyBiYWNrIHRvIHRoZSBpdGVyYWJsZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJlZUl0ZXJhdG9yLk1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmFibGUoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucm9vdHMgPSByb290czsKLQkJdGhpcy5taWR3aWZlID0gdGhpcy5idWlsZERlZmF1bHRNaWR3aWZlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhYmxlIGNvbnRhaW5pbmcgdGhlIG5vZGVzIG9mIGEgdHJlZSB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMKLQkgKiBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhYmxlKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cywgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJvb3RzID0gcm9vdHM7Ci0JCXRoaXMubWlkd2lmZSA9IG1pZHdpZmU7Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVJdGVyYXRvci5NaWR3aWZlPEU+IGJ1aWxkRGVmYXVsdE1pZHdpZmUoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1pZHdpZmUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPEU+KHRoaXMucm9vdHMsIHRoaXMubWlkd2lmZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyZWVJdGVyYXRvci5NaWR3aWZlfS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGNoaWxkcmVuKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIG5leHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucm9vdHMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGRlZmF1bHQgbWlkd2lmZSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdE1pZHdpZmUgaW1wbGVtZW50cyBUcmVlSXRlcmF0b3IuTWlkd2lmZTxFPiB7Ci0JCXB1YmxpYyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oRSBub2RlKSB7Ci0JCQlyZXR1cm4gVHJlZUl0ZXJhYmxlLnRoaXMuY2hpbGRyZW4obm9kZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjBlMjc3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5BcnJheUl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlmaW5hbCBFW10gYXJyYXk7CS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JaW50IGN1cnNvcjsJCS8vIHByaXZhdGUtcHJvdGVjdGVkCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbWF4OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5SXRlcmF0b3IoRS4uLiBhcnJheSkgewotCQl0aGlzKGFycmF5LCAwLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlJdGVyYXRvcihFW10gYXJyYXksIGludCBzdGFydCkgewotCQl0aGlzKGFycmF5LCBzdGFydCwgYXJyYXkubGVuZ3RoIC0gc3RhcnQpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBBcnJheUl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICgoc3RhcnQgPCAwKSB8fCAoc3RhcnQgPiBhcnJheS5sZW5ndGgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGFydDogIiArIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmICgobGVuZ3RoIDwgMCkgfHwgKGxlbmd0aCA+IGFycmF5Lmxlbmd0aCAtIHN0YXJ0KSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGVuZ3RoOiAiICsgbGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYXJyYXkgPSBhcnJheTsKLQkJdGhpcy5jdXJzb3IgPSBzdGFydDsKLQkJdGhpcy5tYXggPSBzdGFydCArIGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3IgIT0gdGhpcy5tYXg7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hcnJheVt0aGlzLmN1cnNvcisrXTsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgQXJyYXlzLnRvU3RyaW5nKHRoaXMuYXJyYXkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwOGNmZTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0FycmF5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIDxjb2RlPkFycmF5TGlzdEl0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9Ci0gKiBmb3IgYW4gYXJyYXkgb2Ygb2JqZWN0cy4KLSAqIDxwPgotICogVGhlIG5hbWUgbWlnaHQgYmUgYSBiaXQgY29uZnVzaW5nOgotICogVGhpcyBpcyBhIHtAbGluayBMaXN0SXRlcmF0b3J9IGZvciBhbiA8Y29kZT5BcnJheTwvY29kZT47Ci0gKiA8ZW0+bm90PC9lbT4gYW4ge0BsaW5rIGphdmEudXRpbC5JdGVyYXRvciBJdGVyYXRvcn0gZm9yIGFuCi0gKiB7QGxpbmsgamF2YS51dGlsLkFycmF5TGlzdCBBcnJheUxpc3R9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhdG9yPEU+Ci0JZXh0ZW5kcyBBcnJheUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIGludCBtaW47Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEUuLi4gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBhcnJheSwKLQkgKiBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGluZGV4IGFuZCBjb250aW51aW5nIGZvcgotCSAqIHRoZSByZXN0IG9mIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBpbnQgc3RhcnQpIHsKLQkJdGhpcyhhcnJheSwgc3RhcnQsIGFycmF5Lmxlbmd0aCAtIHN0YXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LAotCSAqIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc3RhcnQgaW5kZXggYW5kIGNvbnRpbnVpbmcgZm9yCi0JICogdGhlIHNwZWNpZmllZCBsZW5ndGguCi0JICovCi0JcHVibGljIEFycmF5TGlzdEl0ZXJhdG9yKEVbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQkJdGhpcy5taW4gPSBzdGFydDsKLQl9Ci0JCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmN1cnNvcjsKLQl9Ci0JCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5jdXJzb3IgLSAxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMuY3Vyc29yICE9IHRoaXMubWluOwotCX0KLQkKLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzUHJldmlvdXMoKSkgewotCQkJcmV0dXJuIHRoaXMuYXJyYXlbLS10aGlzLmN1cnNvcl07Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZjY3MTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NoYWluSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gcHJvdmlkZXMgYSBwbHVnZ2FibGUge0BsaW5rIEl0ZXJhdG9yfQotICogdGhhdCBsb29wcyBvdmVyIGEgY2hhaW4gb2YgYXJiaXRyYXJpbHkgbGlua2VkIG9iamVjdHMuIFRoZSBjaGFpbgotICogc2hvdWxkIGJlIG51bGwtdGVybWluYXRlZCAoaS5lLiBhIGNhbGwgdG8gdGhlIHtAbGluayAjbmV4dExpbmsoT2JqZWN0KX0KLSAqIG1ldGhvZCBzaG91bGQgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgcGFzc2VkIHRoZSBsYXN0Ci0gKiBsaW5rIG9mIHRoZSBjaGFpbikuCi0gKiBUbyB1c2UsIHN1cHBseSBhIHN0YXJ0aW5nIGxpbmsgYW5kIHN1cHBseSBhIHtAbGluayBMaW5rZXJ9IG9yIAotICogc3ViY2xhc3MgPGNvZGU+Q2hhaW5JdGVyYXRvcjwvY29kZT4gYW5kIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNuZXh0TGluayhPYmplY3QpfSBtZXRob2QuCi0gKiBUaGUgc3RhcnRpbmcgbGluayB3aWxsIGJlIHRoZSBmaXJzdCBvYmplY3QgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yLgotICogSWYgdGhlIHN0YXJ0aW5nIGxpbmsgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZSBpdGVyYXRvciB3aWxsIGJlIGVtcHR5LgotICogTm90ZSB0aGlzIGl0ZXJhdG9yIGRvZXMgbm90IHN1cHBvcnQgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgRSBuZXh0TGluazsKLQlwcml2YXRlIGZpbmFsIExpbmtlcjxFPiBsaW5rZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBhIGRpc2FibGVkIGxpbmtlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI25leHRMaW5rKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTGlua2VyfS4KLQkgKi8KLQlwdWJsaWMgQ2hhaW5JdGVyYXRvcihFIHN0YXJ0TGluaykgewotCQl0aGlzKHN0YXJ0TGluaywgTGlua2VyLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgc3RhcnRpbmcgbGluawotCSAqIGFuZCBsaW5rZXIuCi0JICovCi0JcHVibGljIENoYWluSXRlcmF0b3IoRSBzdGFydExpbmssIExpbmtlcjxFPiBsaW5rZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5uZXh0TGluayA9IHN0YXJ0TGluazsKLQkJdGhpcy5saW5rZXIgPSBsaW5rZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dExpbmsgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5uZXh0TGluayA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0TGluazsKLQkJdGhpcy5uZXh0TGluayA9IHRoaXMubmV4dExpbmsodGhpcy5uZXh0TGluayk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JICovCi0JcHJvdGVjdGVkIEUgbmV4dExpbmsoRSBjdXJyZW50TGluaykgewotCQlyZXR1cm4gdGhpcy5saW5rZXIubmV4dExpbmsoY3VycmVudExpbmspOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubmV4dExpbmspOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgQ2hhaW5JdGVyYXRvcn0gdG8gbGluawotCSAqIHRoZSBlbGVtZW50cyBpbiB0aGUgY2hhaW4uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaW5rZXI8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5leHQgbGluayBpbiB0aGUgY2hhaW47IG51bGwgaWYgdGhlcmUgYXJlIG5vIG1vcmUgbGlua3MuCi0JCSAqLwotCQlUIG5leHRMaW5rKFQgY3VycmVudExpbmspOwotCi0KLQkJZmluYWwgY2xhc3MgTnVsbDxTPiBpbXBsZW1lbnRzIExpbmtlcjxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBMaW5rZXIgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyBzaW1wbHkgcmV0dXJuIG51bGwsIGluZGljYXRpbmcgdGhlIGNoYWluIGlzIGVuZGVkCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDaGFpbkl0ZXJhdG9yLkxpbmtlci5OdWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JCWZpbmFsIGNsYXNzIERpc2FibGVkPFM+IGltcGxlbWVudHMgTGlua2VyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIExpbmtlciBJTlNUQU5DRSA9IG5ldyBEaXNhYmxlZCgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBMaW5rZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBEaXNhYmxlZCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJLy8gdGhyb3cgYW4gZXhjZXB0aW9uCi0JCQlwdWJsaWMgUyBuZXh0TGluayhTIGN1cnJlbnRMaW5rKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7ICAvLyBDaGFpbkl0ZXJhdG9yLm5leHRMaW5rKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2hhaW5JdGVyYXRvci5MaW5rZXIuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTMxZGRlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGl0ZXJhdGVzIG92ZXIgYSBjb3B5IG9mIGEgY29sbGVjdGlvbiwKLSAqIGFsbG93aW5nIGZvciBjb25jdXJyZW50IGFjY2VzcyB0byB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLSAqIDxwPgotICogVGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gcGFzc2VkIHRvIHRoZSA8Y29kZT5DbG9uZUl0ZXJhdG9yPC9jb2RlPidzCi0gKiBjb25zdHJ1Y3RvciBzaG91bGQgYmUgc3luY2hyb25pemVkIChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfSk7Ci0gKiBvdGhlcndpc2UgeW91IHJ1biB0aGUgcmlzayBvZiBhIGNvcnJ1cHRlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBCeSBkZWZhdWx0LCBhIDxjb2RlPkNsb25lSXRlcmF0b3I8L2NvZGU+IGRvZXMgbm90IHN1cHBvcnQgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb247IHRoaXMgaXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlCi0gKiBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uIEJ1dCBpZiB0aGUgPGNvZGU+Q2xvbmVJdGVyYXRvcjwvY29kZT4KLSAqIGlzIHN1cHBsaWVkIHdpdGggYW4ge0BsaW5rIFJlbW92ZXJ9IGl0IHdpbGwgZGVsZWdhdGUgdGhlCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBvcGVyYXRpb24gdG8gdGhlIHtAbGluayBSZW1vdmVyfS4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSB7QGxpbmsgI3JlbW92ZShPYmplY3QpfQotICogbWV0aG9kLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGUKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENsb25lSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yOwotCXByaXZhdGUgRSBjdXJyZW50OwotCXByaXZhdGUgZmluYWwgUmVtb3ZlcjxFPiByZW1vdmVyOwotCXByaXZhdGUgYm9vbGVhbiByZW1vdmVBbGxvd2VkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKiBUaGUge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9LgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhjb2xsZWN0aW9uLCBSZW1vdmVyLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlIHtAbGluayAjcmVtb3ZlKE9iamVjdCl9LgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKEVbXSBhcnJheSkgewotCQl0aGlzKGFycmF5LCBSZW1vdmVyLlJlYWRPbmx5LjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHJlbW92ZXIgdG8gcmVtb3ZlIG9iamVjdHMgZnJvbSB0aGUKLQkgKiBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGNvbGxlY3Rpb24sIFJlbW92ZXI8RT4gcmVtb3ZlcikgewotCQl0aGlzKHJlbW92ZXIsIGNvbGxlY3Rpb24udG9BcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgcmVtb3ZlciB0byByZW1vdmUgb2JqZWN0cyBmcm9tIHRoZQotCSAqIG9yaWdpbmFsIGFycmF5LgotCSAqLwotCXB1YmxpYyBDbG9uZUl0ZXJhdG9yKEVbXSBhcnJheSwgUmVtb3ZlcjxFPiByZW1vdmVyKSB7Ci0JCXRoaXMocmVtb3ZlciwgYXJyYXkuY2xvbmUoKSk7Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgY29uc3RydWN0b3IgdXNlZCBieSBzdWJjbGFzc2VzLgotCSAqIFN3YXAgb3JkZXIgb2YgYXJndW1lbnRzIHRvIHByZXZlbnQgY29sbGlzaW9uIHdpdGggb3RoZXIgY29uc3RydWN0b3IuCi0JICogVGhlIHBhc3NlZCBpbiBhcnJheSB3aWxsICpub3QqIGJlIGNsb25lZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2xvbmVJdGVyYXRvcihSZW1vdmVyPEU+IHJlbW92ZXIsIE9iamVjdC4uLiBhcnJheSkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihhcnJheSk7Ci0JCXRoaXMuY3VycmVudCA9IG51bGw7Ci0JCXRoaXMucmVtb3ZlciA9IHJlbW92ZXI7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJdGVyYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5jdXJyZW50ID0gdGhpcy5uZXN0ZWROZXh0KCk7Ci0JCXRoaXMucmVtb3ZlQWxsb3dlZCA9IHRydWU7Ci0JCXJldHVybiB0aGlzLmN1cnJlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAoICEgdGhpcy5yZW1vdmVBbGxvd2VkKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yZW1vdmUodGhpcy5jdXJyZW50KTsKLQkJdGhpcy5yZW1vdmVBbGxvd2VkID0gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGNvbGxlY3Rpb24gcGFzc2VkIGluIGR1cmluZyBjb25zdHJ1Y3Rpb24gaGVsZCBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LAotCSAqIHNvIHRoaXMgY2FzdCBpcyBub3QgYSBwcm9ibGVtLiBXZSBuZWVkIHRoaXMgY2FzdCBiZWNhdXNlCi0JICogYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3ZXJlIGNvcGllZCBpbnRvCi0JICogYW4gb2JqZWN0IGFycmF5ICg8Y29kZT5PYmplY3RbXTwvY29kZT4pLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBFIG5lc3RlZE5leHQoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBSZW1vdmVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoRSBlKSB7Ci0JCXRoaXMucmVtb3Zlci5yZW1vdmUoZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2VkIGJ5IHtAbGluayBDbG9uZUl0ZXJhdG9yfSB0byByZW1vdmUKLQkgKiBlbGVtZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uOyBzaW5jZSB0aGUgaXRlcmF0b3IKLQkgKiBkb2VzIG5vdCBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIGludGVyZmFjZSBSZW1vdmVyPFQ+IHsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24uCi0JCSAqLwotCQl2b2lkIHJlbW92ZShUIGVsZW1lbnQpOwotCi0KLQkJZmluYWwgY2xhc3MgUmVhZE9ubHk8Uz4gaW1wbGVtZW50cyBSZW1vdmVyPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFJlbW92ZXIgSU5TVEFOQ0UgPSBuZXcgUmVhZE9ubHkoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gUmVtb3ZlcjxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIFJlYWRPbmx5KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgaXMgbm90IHN1cHBvcnRlZAotCQkJcHVibGljIHZvaWQgcmVtb3ZlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJDbG9uZUl0ZXJhdG9yLlJlbW92ZXIuUmVhZE9ubHkiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTM2YTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPiBpdGVyYXRlcyBvdmVyIGEgY29weSBvZiBhIGxpc3QsCi0gKiBhbGxvd2luZyBmb3IgY29uY3VycmVudCBhY2Nlc3MgdG8gdGhlIG9yaWdpbmFsIGxpc3QuCi0gKiA8cD4KLSAqIFRoZSBvcmlnaW5hbCBsaXN0IHBhc3NlZCB0byB0aGUgPGNvZGU+Q2xvbmVMaXN0SXRlcmF0b3I8L2NvZGU+J3MKLSAqIGNvbnN0cnVjdG9yIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQ7IG90aGVyd2lzZSB5b3UgcnVuIHRoZSByaXNrIG9mCi0gKiBhIGNvcnJ1cHRlZCBsaXN0IChlLmcuIHtAbGluayBqYXZhLnV0aWwuVmVjdG9yfS4KLSAqIDxwPgotICogQnkgZGVmYXVsdCwgYSA8Y29kZT5DbG9uZUxpc3RJdGVyYXRvcjwvY29kZT4gZG9lcyBub3Qgc3VwcG9ydCB0aGUKLSAqIG1vZGlmaWNhdGlvbiBvcGVyYXRpb25zOyB0aGlzIGlzIGJlY2F1c2UgaXQgZG9lcyBub3QgaGF2ZQotICogYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LiBCdXQgaWYgdGhlIDxjb2RlPkNsb25lTGlzdEl0ZXJhdG9yPC9jb2RlPgotICogaXMgc3VwcGxpZWQgd2l0aCBhIHtAbGluayBNdXRhdG9yfSBpdCB3aWxsIGRlbGVnYXRlIHRoZQotICogbW9kaWZpY2F0aW9uIG9wZXJhdGlvbnMgdG8gdGhlIHtAbGluayBNdXRhdG9yfS4KLSAqIEFsdGVybmF0aXZlbHksIGEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoZSBtb2RpZmljYXRpb24gbWV0aG9kcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZQotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENsb25lTGlzdEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxPYmplY3Q+IGxpc3RJdGVyYXRvcjsKLQlwcml2YXRlIGludCBjdXJzb3I7Ci0JcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsKLQlwcml2YXRlIGZpbmFsIE11dGF0b3I8RT4gbXV0YXRvcjsKLQotCXByaXZhdGUgZW51bSBTdGF0ZSB7Ci0JCVVOS05PV04sCi0JCVBSRVZJT1VTLAotCQlORVhUCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhlIG1vZGlmaWNhdGlvbiBtZXRob2RzIHdpbGwgbm90IGJlIHN1cHBvcnRlZCwKLQkgKiB1bmxlc3MgYSBzdWJjbGFzcyBvdmVycmlkZXMgdGhlbS4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QsIE11dGF0b3IuUmVhZE9ubHkuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgbW9kaWZpY2F0aW9uIG1ldGhvZHMgd2lsbCBub3QgYmUgc3VwcG9ydGVkLAotCSAqIHVubGVzcyBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGVtLgotCSAqLwotCXB1YmxpYyBDbG9uZUxpc3RJdGVyYXRvcihFW10gYXJyYXkpIHsKLQkJdGhpcyhhcnJheSwgTXV0YXRvci5SZWFkT25seS48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIG9uIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgbGlzdCBtdXRhdG9yIHRvIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCwgTXV0YXRvcjxFPiBtdXRhdG9yKSB7Ci0JCXRoaXMobXV0YXRvciwgbGlzdC50b0FycmF5KCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgbGlzdCBtdXRhdG9yIHRvIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3IoRVtdIGFycmF5LCBNdXRhdG9yPEU+IG11dGF0b3IpIHsKLQkJdGhpcyhtdXRhdG9yLCBhcnJheS5jbG9uZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBjb25zdHJ1Y3RvciB1c2VkIGJ5IHN1YmNsYXNzZXMuCi0JICogU3dhcCBvcmRlciBvZiBhcmd1bWVudHMgdG8gcHJldmVudCBjb2xsaXNpb24gd2l0aCBvdGhlciBjb25zdHJ1Y3Rvci4KLQkgKiBUaGUgcGFzc2VkIGluIGFycmF5IHdpbGwgKm5vdCogYmUgY2xvbmVkLgotCSAqLwotCXByb3RlY3RlZCBDbG9uZUxpc3RJdGVyYXRvcihNdXRhdG9yPEU+IG11dGF0b3IsIE9iamVjdC4uLiBhcnJheSkgewotCQlzdXBlcigpOwotCQkvLyBidWlsZCBhIGNvcHkgb2YgdGhlIGxpc3QgYW5kIGtlZXAgaXQgaW4gc3luY2ggd2l0aCBvcmlnaW5hbCAoaWYgdGhlIG11dGF0b3IgYWxsb3dzIGNoYW5nZXMpCi0JCS8vIHRoYXQgd2F5IHRoZSBuZXN0ZWQgbGlzdCBpdGVyYXRvciB3aWxsIG1haW50YWluIHNvbWUgb2Ygb3VyIHN0YXRlCi0JCXRoaXMubGlzdEl0ZXJhdG9yID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYXJyYXkpLmxpc3RJdGVyYXRvcigpOwotCQl0aGlzLm11dGF0b3IgPSBtdXRhdG9yOwotCQl0aGlzLmN1cnNvciA9IDA7Ci0JCXRoaXMuc3RhdGUgPSBTdGF0ZS5VTktOT1dOOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0SXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQkvLyBhbGxvdyB0aGUgbmVzdGVkIGl0ZXJhdG9yIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBiZWZvcmUgd2UgbW9kaWZ5IHRoZSBpbmRleAotCQlFIG5leHQgPSB0aGlzLm5lc3RlZE5leHQoKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQkJdGhpcy5zdGF0ZSA9IFN0YXRlLk5FWFQ7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLmxpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQkJaWYgKHRoaXMuc3RhdGUgPT0gU3RhdGUuUFJFVklPVVMpIHsKLQkJCXRoaXMucmVtb3ZlKHRoaXMuY3Vyc29yKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuY3Vyc29yLS07Ci0JCQl0aGlzLnJlbW92ZSh0aGlzLmN1cnNvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIGluZGV4Ci0JCUUgcHJldmlvdXMgPSB0aGlzLm5lc3RlZFByZXZpb3VzKCk7Ci0JCXRoaXMuY3Vyc29yLS07Ci0JCXRoaXMuc3RhdGUgPSBTdGF0ZS5QUkVWSU9VUzsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIG8pIHsKLQkJLy8gYWxsb3cgdGhlIG5lc3RlZCBpdGVyYXRvciB0byB0aHJvdyBhbiBleGNlcHRpb24gYmVmb3JlIHdlIG1vZGlmeSB0aGUgb3JpZ2luYWwgbGlzdAotCQl0aGlzLmxpc3RJdGVyYXRvci5hZGQobyk7Ci0JCXRoaXMuYWRkKHRoaXMuY3Vyc29yLCBvKTsKLQkJdGhpcy5jdXJzb3IrKzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBvKSB7Ci0JCS8vIGFsbG93IHRoZSBuZXN0ZWQgaXRlcmF0b3IgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGJlZm9yZSB3ZSBtb2RpZnkgdGhlIG9yaWdpbmFsIGxpc3QKLQkJdGhpcy5saXN0SXRlcmF0b3Iuc2V0KG8pOwotCQlpZiAodGhpcy5zdGF0ZSA9PSBTdGF0ZS5QUkVWSU9VUykgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IsIG8pOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXQodGhpcy5jdXJzb3IgLSAxLCBvKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBsaXN0IHBhc3NlZCBpbiBkdXJpbmcgY29uc3RydWN0aW9uIGhlbGQgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPiwKLQkgKiBzbyB0aGlzIGNhc3QgaXMgbm90IGEgcHJvYmxlbS4gV2UgbmVlZCB0aGlzIGNhc3QgYmVjYXVzZQotCSAqIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gd2VyZSBjb3BpZWQgaW50bwotCSAqIGFuIG9iamVjdCBhcnJheSAoPGNvZGU+T2JqZWN0W108L2NvZGU+KS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgRSBuZXN0ZWROZXh0KCkgewotCQlyZXR1cm4gKEUpIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBwYXNzZWQgaW4gZHVyaW5nIGNvbnN0cnVjdGlvbiBoZWxkIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTwvY29kZT4sCi0JICogc28gdGhpcyBjYXN0IGlzIG5vdCBhIHByb2JsZW0uIFdlIG5lZWQgdGhpcyBjYXN0IGJlY2F1c2UKLQkgKiBhbGwgdGhlIGVsZW1lbnRzIG9mIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIHdlcmUgY29waWVkIGludG8KLQkgKiBhbiBvYmplY3QgYXJyYXkgKDxjb2RlPk9iamVjdFtdPC9jb2RlPikuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEUgbmVzdGVkUHJldmlvdXMoKSB7Ci0JCXJldHVybiAoRSkgdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBNdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBFIG8pIHsKLQkJdGhpcy5tdXRhdG9yLmFkZChpbmRleCwgbyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBmcm9tIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBNdXRhdG9yfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXRoaXMubXV0YXRvci5yZW1vdmUoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIGxpc3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE11dGF0b3J9LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChpbnQgaW5kZXgsIEUgbykgewotCQl0aGlzLm11dGF0b3Iuc2V0KGluZGV4LCBvKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCX0KLQotCi0JLy8qKioqKioqKioqIG1lbWJlciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgQ2xvbmVMaXN0SXRlcmF0b3J9IHRvIHJlbW92ZQotCSAqIGVsZW1lbnRzIGZyb20gdGhlIG9yaWdpbmFsIGxpc3Q7IHNpbmNlIHRoZSBsaXN0IGl0ZXJhdG9yCi0JICogZG9lcyBub3QgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvIHRoZSBvcmlnaW5hbCBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTXV0YXRvcjxUPiB7Ci0KLQkJLyoqCi0JCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgb3JpZ2luYWwgbGlzdC4KLQkJICovCi0JCXZvaWQgYWRkKGludCBpbmRleCwgVCBvKTsKLQotCQkvKioKLQkJICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGZyb20gdGhlIG9yaWdpbmFsIGxpc3QuCi0JCSAqLwotCQl2b2lkIHJlbW92ZShpbnQgaW5kZXgpOwotCi0JCS8qKgotCQkgKiBTZXQgdGhlIHNwZWNpZmllZCBvYmplY3QgaW4gdGhlIG9yaWdpbmFsIGxpc3QuCi0JCSAqLwotCQl2b2lkIHNldChpbnQgaW5kZXgsIFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBSZWFkT25seTxTPiBpbXBsZW1lbnRzIE11dGF0b3I8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgTXV0YXRvciBJTlNUQU5DRSA9IG5ldyBSZWFkT25seSgpOwotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgc3RhdGljIDxSPiBNdXRhdG9yPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgUmVhZE9ubHkoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIGFkZCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJLy8gcmVtb3ZlIGlzIG5vdCBzdXBwb3J0ZWQKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJCS8vIHNldCBpcyBub3Qgc3VwcG9ydGVkCi0JCQlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBPYmplY3QgbykgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvci5SZWFkT25seSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJhZDc2ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+Q29tcG9zaXRlSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgY29sbGVjdGlvbgotICogb2Yge0BsaW5rIEl0ZXJhdG9yfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiB7QGxpbmsgSXRlcmF0b3J9LgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQlwcml2YXRlIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBsYXN0SXRlcmF0b3JUb1JldHVybk5leHQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgYWxsIHRoZSBlbGVtZW50cyBoZWxkIGJ5IHRoZQotCSAqIHNwZWNpZmllZCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBJdGVyYWJsZTw/IGV4dGVuZHMgRT4+IGl0ZXJhYmxlcykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8SXRlcmFibGU8PyBleHRlbmRzIEU+LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcy5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlKSB7Ci0JCQkJCXJldHVybiBpdGVyYWJsZS5pdGVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2YgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgSXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoRSBvYmplY3QsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKG9iamVjdCwgaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoRSBvYmplY3QsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBFIG9iamVjdCkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgYXBwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmF0b3IsIG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBpdGVyYWJsZXMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlJdGVyYWJsZTxJdGVyYWJsZTw/IGV4dGVuZHMgRT4+KGl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3JzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8SXRlcmF0b3I8PyBleHRlbmRzIEU+PihpdGVyYXRvcnMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZEN1cnJlbnRJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5sb2FkQ3VycmVudEl0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBzZXQgJ2xhc3RJdGVyYXRvclRvUmV0dXJuTmV4dCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybk5leHQgPSB0aGlzLmN1cnJlbnRJdGVyYXRvcjsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJaWYgKHRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5OZXh0ID09IG51bGwpIHsKLQkJCS8vIENvbXBvc2l0ZUl0ZXJhdG9yI25leHQoKSBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuTmV4dC5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHtAbGluayAjY3VycmVudEl0ZXJhdG9yfSB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IHtAbGluayBJdGVyYXRvciNoYXNOZXh0KCl9Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkQ3VycmVudEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKCggISB0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc05leHQoKSkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3JzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzExMTQ1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVMaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGEgbGlzdAotICogb2Yge0BsaW5rIExpc3RJdGVyYXRvcn1zIGFuZCBtYWtlcyB0aGVtIGFwcGVhciB0byBiZSBhIHNpbmdsZQotICoge0BsaW5rIExpc3RJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIExpc3RJdGVyYXRvcjxFPj4gaXRlcmF0b3JzOwotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEU+IG5leHRJdGVyYXRvcjsKLQlwcml2YXRlIGludCBuZXh0SW5kZXg7Ci0gCS8qKgotIAkgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiAibmV4dCIgd2FzIGxhc3QgcmV0dXJuZWQ7Ci0gCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiAicHJldmlvdXMiIHdhcyBsYXN0IHJldHVybmVkOwotIAkgKiB0aGlzIGRldGVybWluZXMgdGhlIGVmZmVjdCBvZiB7QGxpbmsgI3JlbW92ZSgpfSBvbiB7QGxpbmsgI25leHRJbmRleH0KLSAJICovCi0JcHJpdmF0ZSBib29sZWFuIG5leHRSZXR1cm5lZDsKLQlwcml2YXRlIExpc3RJdGVyYXRvcjxFPiBsYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQ7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8PyBleHRlbmRzIExpc3Q8RT4+IGxpc3RzKSB7Ci0JCXRoaXMoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8TGlzdDxFPiwgTGlzdEl0ZXJhdG9yPEU+PihsaXN0cy5saXN0SXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gdHJhbnNmb3JtKExpc3Q8RT4gbGlzdCkgewotCQkJCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBMaXN0SXRlcmFibGU8RT4+IGxpc3RJdGVyYWJsZXMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0SXRlcmFibGU8RT4sIExpc3RJdGVyYXRvcjxFPj4obGlzdEl0ZXJhYmxlcy5pdGVyYXRvcigpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiB0cmFuc2Zvcm0oTGlzdEl0ZXJhYmxlPEU+IGxpc3QpIHsKLQkJCQkJcmV0dXJuIGxpc3QuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBvZiBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPEU+PiBpdGVyYXRvcnMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5pdGVyYXRvcnMgPSBpdGVyYXRvcnM7Ci0JCXRoaXMubmV4dEluZGV4ID0gMDsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBvYmplY3QgcHJlcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3Q8RT4gbGlzdCkgewotCQl0aGlzKG9iamVjdCwgbGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0SXRlcmFibGU8RT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCXRoaXMob2JqZWN0LCBsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSwgaXRlcmF0b3IpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCwgRSBvYmplY3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpLCBvYmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobGlzdEl0ZXJhYmxlLml0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgRSBvYmplY3QpIHsKLQkJdGhpcyhpdGVyYXRvciwgbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4ob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdHMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PEU+Li4uIGxpc3RzKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChsaXN0cykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPEU+Li4uIGxpc3RJdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPEU+PihsaXN0SXRlcmFibGVzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4uLi4gaXRlcmF0b3JzKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEUgbykgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXRoaXMubmV4dEl0ZXJhdG9yLmFkZChvKTsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZFByZXZpb3VzSXRlcmF0b3IoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gdGhpcyBvY2N1cnMgaWYgdGhlcmUgYXJlIG5vIGl0ZXJhdG9ycyBhdCBhbGwKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXh0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQl0aGlzLmxvYWROZXh0SXRlcmF0b3IoKTsKLQkJRSByZXN1bHQgPSB0aGlzLm5leHRJdGVyYXRvci5uZXh0KCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgrKzsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSB0cnVlOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0KLQkJLy8gdGhlIHN0YXRlbWVudCBhYm92ZSB3aWxsIHRocm93IGEgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgotCQkvLyBpZiB0aGUgY3VycmVudCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOwotCQkvLyBzbyBpZiB3ZSBnZXQgaGVyZSwgd2UgY2FuIHNldCB0aGUgJ2xhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCcKLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPSB0aGlzLm5leHRJdGVyYXRvcjsKLQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJdGhpcy5uZXh0UmV0dXJuZWQgPSBmYWxzZTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICAtIDE7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQlpZiAodGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGFzdEl0ZXJhdG9yVG9SZXR1cm5FbGVtZW50LnJlbW92ZSgpOwotCQlpZiAodGhpcy5uZXh0UmV0dXJuZWQpIHsKLQkJCS8vIGRlY3JlbWVudCB0aGUgaW5kZXggYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgaGFzIG1vdmVkIGZvcndhcmQgaW4gdGhlIGxpc3QKLQkJCXRoaXMubmV4dEluZGV4LS07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoRSBlKSB7Ci0JCWlmICh0aGlzLmxhc3RJdGVyYXRvclRvUmV0dXJuRWxlbWVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5sYXN0SXRlcmF0b3JUb1JldHVybkVsZW1lbnQuc2V0KGUpOwotCX0KLQotCS8qKgotCSAqIExvYWQgJ25leHRJdGVyYXRvcicgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCA8Y29kZT5oYXNOZXh0KCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCAnbmV4dEl0ZXJhdG9yJyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRvciB0aGF0IDxjb2RlPmhhc1ByZXZpb3VzKCk8L2NvZGU+Ci0JICogb3IgdGhlIGZpcnN0IGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUHJldmlvdXNJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmICduZXh0SXRlcmF0b3InIGlzIG51bGwsIGxvYWQgaXQgd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTmV4dEl0ZXJhdG9yKCkgewotCQlpZiAodGhpcy5uZXh0SXRlcmF0b3IgPT0gbnVsbCkgewotCQkJdGhpcy5uZXh0SXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9ycy5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9ycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2ZTJlMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbXB0eUl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgKG5vdCkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbXB0eUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUl0ZXJhdG9yIElOU1RBTkNFID0gbmV3IEVtcHR5SXRlcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhdG9yPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlMjM3Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW1wdHlMaXN0SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEFuIDxjb2RlPkVtcHR5TGlzdEl0ZXJhdG9yPC9jb2RlPiBpcyBqdXN0IHRoYXQuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgKG5vdCkgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCi0JLy8gc2luZ2xldG9uCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbXB0eUxpc3RJdGVyYXRvciBJTlNUQU5DRSA9IG5ldyBFbXB0eUxpc3RJdGVyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyA8VD4gTGlzdEl0ZXJhdG9yPFQ+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtcHR5TGlzdEl0ZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBFIHByZXZpb3VzKCkgewotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGU5ZDM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBbiA8Y29kZT5FbnVtZXJhdGlvbkl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbgotICoge0BsaW5rIEVudW1lcmF0aW9ufSBzbyB0aGF0IGl0IGNhbiBiZSB0cmVhdGVkIGxpa2UgYW4KLSAqIHtAbGluayBJdGVyYXRvcn0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGlvbkl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRW51bWVyYXRpb248PyBleHRlbmRzIEU+IGVudW1lcmF0aW9uOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgd3JhcHMgdGhlIHNwZWNpZmllZCBlbnVtZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb25JdGVyYXRvcihFbnVtZXJhdGlvbjw/IGV4dGVuZHMgRT4gZW51bWVyYXRpb24pIHsKLQkJdGhpcy5lbnVtZXJhdGlvbiA9IGVudW1lcmF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5lbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5lbnVtZXJhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL0ZpbHRlcmluZ0l0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzMTc2Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgdXNlcyBhIHtAbGluayBGaWx0ZXJ9IHRvIGRldGVybWluZSB3aGljaCBlbGVtZW50cyBpbiB0aGUKLSAqIG5lc3RlZCBpdGVyYXRvciBhcmUgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMgdG8ge0BsaW5rICNuZXh0KCl9LgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LCBhIHN1YmNsYXNzCi0gKiBvZiA8Y29kZT5GaWx0ZXJpbmdJdGVyYXRvcjwvY29kZT4gY2FuIG92ZXJyaWRlIHRoZQotICoge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIGl0ZXJhdG9yIGlzIHRoYXQKLSAqIHRoZSBuZXN0ZWQgaXRlcmF0b3IncyA8Y29kZT5uZXh0KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJlIGludm9rZWQKLSAqIDxlbT5iZWZvcmU8L2VtPiB0aGUgZmlsdGVyZWQgaXRlcmF0b3IncyB7QGxpbmsgI25leHQoKX0KLSAqIG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlICJuZXh0IiBlbGVtZW50IG11c3QgYmUKLSAqIGNoZWNrZWQgZm9yIHdoZXRoZXIgaXQgaXMgdG8gYmUgYWNjZXB0ZWQgYmVmb3JlIHRoZSBmaWx0ZXJlZCBpdGVyYXRvcgotICogY2FuIGRldGVybWluZSB3aGV0aGVyIGl0IGhhcyBhICJuZXh0IiBlbGVtZW50IChpLmUuIHRoYXQgdGhlCi0gKiB7QGxpbmsgI2hhc05leHQoKX0gbWV0aG9kIHNob3VsZCByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4pLgotICogVGhpcyBhbHNvIHByZXZlbnRzIGEgZmlsdGVyZWQgaXRlcmF0b3IgZnJvbSBzdXBwb3J0aW5nIHRoZSBvcHRpb25hbAotICogPGNvZGU+cmVtb3ZlKCk8L2NvZGU+IG1ldGhvZC4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyB0byBiZSBmaWx0ZXJlZAotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCXByaXZhdGUgZmluYWwgRmlsdGVyPEU+IGZpbHRlcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIGl0ZXJhYmxlIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2FjY2VwdChPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IgYW5kIGEgZGlzYWJsZWQgZmlsdGVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjYWNjZXB0KE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgRmlsdGVyfS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXRoaXMoaXRlcmF0b3IsIEZpbHRlci5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogaXRlcmFibGUgYW5kIGZpbHRlci4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBGaWx0ZXI8RT4gZmlsdGVyKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIGl0ZXJhdG9yIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvciwgRmlsdGVyPEU+IGZpbHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmxvYWROZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJRSByZXN1bHQgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCZWNhdXNlIHdlIG5lZWQgdG8gcHJlLWxvYWQgdGhlIG5leHQgZWxlbWVudAotCSAqIHRvIGJlIHJldHVybmVkLCB3ZSBjYW5ub3Qgc3VwcG9ydCB0aGUgPGNvZGU+cmVtb3ZlKCk8L2NvZGU+Ci0JICogbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IHdpdGggdGhlIG5leHQgdmFsaWQgZW50cnkgZnJvbSB0aGUgbmVzdGVkCi0JICogaXRlcmF0b3IuIElmIHRoZXJlIGFyZSBub25lLCBuZXh0IGlzIHNldCB0byA8Y29kZT5FTkQ8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dCgpIHsKLQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJd2hpbGUgKHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpICYmICh0aGlzLmRvbmUpKSB7Ci0JCQlFIHRlbXAgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0aGlzLmFjY2VwdCh0ZW1wKSkgewotCQkJCS8vIGFzc3VtZSB0aGF0IGlmIHRoZSBvYmplY3Qgd2FzIGFjY2VwdGVkIGl0IGlzIG9mIHR5cGUgRQotCQkJCXRoaXMubmV4dCA9IHRlbXA7Ci0JCQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMubmV4dCA9IG51bGw7Ci0JCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB7QGxpbmsgRmlsdGVyaW5nSXRlcmF0b3J9Ci0JICogc2hvdWxkIHJldHVybiB0aGUgc3BlY2lmaWVkIG5leHQgZWxlbWVudCBmcm9tIGEgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgI25leHQoKX0gbWV0aG9kLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdChvKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUwZjE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9HcmFwaEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gaXMgc2ltaWxhciB0byBhIHtAbGluayBUcmVlSXRlcmF0b3J9Ci0gKiBleGNlcHQgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFsbCBub2RlcyBhc3N1bWUgYSBzdHJpY3QgdHJlZQotICogc3RydWN0dXJlLiBGb3IgaW5zdGFuY2UsIGluIGEgdHJlZSwgYSBub2RlIGNhbm5vdCBiZSBhIGRlc2NlbmRlbnQgb2YKLSAqIGl0c2VsZiwgYnV0IGEgZ3JhcGggbWF5IGhhdmUgYSBjeWNsaWNhbCBzdHJ1Y3R1cmUuCi0gKiAKLSAqIEEgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4gc2ltcGxpZmllcyB0aGUgdHJhdmVyc2FsIG9mIGEKLSAqIGdyYXBoIG9mIG9iamVjdHMsIHdoZXJlIHRoZSBvYmplY3RzJyBwcm90b2NvbChzKSBwcm92aWRlcwotICogYSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIG5leHQgY29sbGVjdGlvbiBvZiBub2RlcyBpbiB0aGUgZ3JhcGgsCi0gKiAob3IgPGVtPm5laWdoYm9yczwvZW0+KSwgYnV0IGRvZXMgbm90IHByb3ZpZGUgYSBtZXRob2QgZm9yCi0gKiBnZXR0aW5nIDxlbT5hbGw8L2VtPiBvZiB0aGUgbm9kZXMgaW4gdGhlIGdyYXBoLgotICogKGUuZy4gYSBuZWlnaGJvciBjYW4gcmV0dXJuIGhpcyBuZWlnaGJvcnMsIGFuZCB0aG9zZSBuZWlnaGJvcnMKLSAqIGNhbiByZXR1cm4gdGhlaXIgbmVpZ2hib3JzLCB3aGljaCBtaWdodCBhbHNvIGluY2x1ZGUgdGhlIG9yaWdpbmFsCi0gKiBuZWlnaGJvciwgYnV0IHlvdSBvbmx5IHdhbnQgdG8gdmlzaXQgdGhlIG9yaWdpbmFsIG5laWdoYm9yIG9uY2UuKQotICogPHA+Ci0gKiBJZiBhIG5laWdoYm9yIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCAoZGV0ZXJtaW5lZCBieSB1c2luZyAKLSAqIHtAbGluayAjZXF1YWxzKE9iamVjdCl9KSwgdGhhdCBuZWlnaGJvciBpcyBub3QgdmlzaXRlZCBhZ2FpbiwKLSAqIG5vciBhcmUgdGhlIG5laWdoYm9ycyBvZiB0aGF0IG9iamVjdC4KLSAqIDxwPgotICogSXQgaXMgdXAgdG8gdGhlIHVzZXIgb2YgdGhpcyBjbGFzcyB0byBlbnN1cmUgYSA8ZW0+Y29tcGxldGU8L2VtPiBncmFwaC4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBlaXRoZXIgdGhlIGluaXRpYWwgbm9kZSBvZiB0aGUgZ3JhcGggb3IgYW4ge0BsaW5rIEl0ZXJhdG9yfQotICogb3ZlciBhbiBpbml0aWFsIGNvbGxlY3Rpb24gb2YgZ3JhcGggbm9kZXMKLSAqIDxsaT4gYSB7QGxpbmsgTWlzdGVyUm9nZXJzfSB0aGF0IHRlbGxzIHdobyB0aGUgbmVpZ2hib3JzIGFyZQotICogb2YgZWFjaCBub2RlCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+R3JhcGhJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNuZWlnaGJvcnMoT2JqZWN0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIHtAbGluayAjcmVtb3ZlKCl9IGlzIG5vdCBzdXBwb3J0ZWQuIFRoaXMgYmVoYXZpb3IsIGlmIAotICogZGVzaXJlZCwgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUgdXNlciBvZiB0aGlzIGNsYXNzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuR3JhcGhJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgR3JhcGhJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQkvLyB1c2UgYSBMaW5rZWRMaXN0IHNpbmNlIHdlIHdpbGwgYmUgcHVsbGluZyBvZmYgdGhlIGZyb250IGFuZCBhZGRpbmcgdG8gdGhlIGVuZAotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdDxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IGl0ZXJhdG9ycyA9IG5ldyBMaW5rZWRMaXN0PEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oKTsKLQlwcml2YXRlIGZpbmFsIEhhc2hTZXQ8RT4gdmlzaXRlZE5laWdoYm9ycyA9IG5ldyBIYXNoU2V0PEU+KCk7Ci0JcHJpdmF0ZSBmaW5hbCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzOwotCQotCXByaXZhdGUgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGN1cnJlbnRJdGVyYXRvcjsKLQkKLQlwcml2YXRlIEUgbmV4dE5laWdoYm9yOwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBNci4gUm9nZXJzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihFLi4uIHJvb3RzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBNci4gUm9nZXJzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBNci4gUm9nZXJzLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlzdGVyUm9nZXJzfS4KLQkgKi8KLQlwdWJsaWMgR3JhcGhJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cywgTWlzdGVyUm9nZXJzLkRpc2FibGVkLjxFPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdAotCSAqIGFuZCBhIGRpc2FibGVkIE1yLiBSb2dlcnMuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICogPGNvZGU+bmVpZ2hib3JzKE9iamVjdCk8L2NvZGU+IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSA8Y29kZT5NaXN0ZXJSb2dlcnM8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEUgcm9vdCkgewotCQl0aGlzKHJvb3QsIE1pc3RlclJvZ2Vycy5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRSByb290LCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXRoaXMobmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxFPihyb290KSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoRVtdIHJvb3RzLCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpLCBtaXN0ZXJSb2dlcnMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgZ3JhcGgKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIE1yLiBSb2dlcnMuCi0JICovCi0JcHVibGljIEdyYXBoSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IHJvb3RzLCBNaXN0ZXJSb2dlcnM8RT4gbWlzdGVyUm9nZXJzKSB7Ci0JCXRoaXMocm9vdHMuaXRlcmF0b3IoKSwgbWlzdGVyUm9nZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIGdyYXBoCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3RzIGFuZCBNci4gUm9nZXJzLgotCSAqLwotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cywgTWlzdGVyUm9nZXJzPEU+IG1pc3RlclJvZ2VycykgewotCQlzdXBlcigpOwotCQl0aGlzLmN1cnJlbnRJdGVyYXRvciA9IHJvb3RzOwotCQl0aGlzLm1pc3RlclJvZ2VycyA9IG1pc3RlclJvZ2VyczsKLQkJdGhpcy5sb2FkTmV4dE5laWdoYm9yKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCBuZXh0IG5laWdoYm9yIHdpdGggdGhlIG5leHQgZW50cnkgZnJvbSB0aGUgY3VycmVudCBpdGVyYXRvci4KLQkgKiBJZiB0aGUgY3VycmVudCBpdGVyYXRvciBoYXMgbm9uZSwgbG9hZCB0aGUgbmV4dCBpdGVyYXRvci4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSwgdGhlIHtAbGluayAjZG9uZX0gZmxhZyBpcyBzZXQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWROZXh0TmVpZ2hib3IoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvciA9PSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpIHsKLQkJCXRoaXMuZG9uZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlFIG5leHRQb3NzaWJsZU5laWdoYm9yID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHRoaXMudmlzaXRlZE5laWdoYm9ycy5jb250YWlucyhuZXh0UG9zc2libGVOZWlnaGJvcikpIHsKLQkJCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5uZXh0TmVpZ2hib3IgPSBuZXh0UG9zc2libGVOZWlnaGJvcjsKLQkJCQl0aGlzLnZpc2l0ZWROZWlnaGJvcnMuYWRkKG5leHRQb3NzaWJsZU5laWdoYm9yKTsKLQkJCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5uZWlnaGJvcnMobmV4dFBvc3NpYmxlTmVpZ2hib3IpKTsKLQkJCX0KLQkJfSAKLQkJZWxzZSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7ICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpICYmIHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gc3RyZWFtLm5leHQoKTsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCQlpZiAoICEgdGhpcy5jdXJyZW50SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCQl9Ci0JCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsgIC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiAhIHRoaXMuZG9uZTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlpZiAodGhpcy5kb25lKSB7Ci0JCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQl9Ci0JCUUgbmV4dCA9IHRoaXMubmV4dE5laWdoYm9yOwotCQl0aGlzLmxvYWROZXh0TmVpZ2hib3IoKTsKLQkJcmV0dXJuIG5leHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGltbWVkaWF0ZSBuZWlnaGJvcnMgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBuZWlnaGJvcnMoRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pc3RlclJvZ2Vycy5uZWlnaGJvcnMobmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgR3JhcGhJdGVyYXRvcn0gdG8gcmV0cmlldmUKLQkgKiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiBhIG5vZGUgaW4gdGhlIGdyYXBoLgotCSAqICJUaGVzZSBhcmUgdGhlIHBlb3BsZSBpbiB5b3VyIG5laWdoYm9yaG9vZC4uLiIKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIE1pc3RlclJvZ2VyczxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIG5laWdoYm9ycyBvZiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkJICovCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBuZWlnaGJvcnMoVCBuZXh0KTsKLQkJCi0JCQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlzdGVyUm9nZXJzPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pc3RlclJvZ2VycyBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IE1pc3RlclJvZ2VyczxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBuZWlnaGJvcnMoUyBuZXh0KSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzLk51bGwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQkJLyoqIFRoZSBNci4gUm9nZXJzIHVzZWQgd2hlbiB0aGUge0BsaW5rIEdyYXBoSXRlcmF0b3IjbmVpZ2hib3JzKE9iamVjdCl9IG1ldGhvZCBpcyBvdmVycmlkZGVuLiAqLwotCQlmaW5hbCBjbGFzcyBEaXNhYmxlZDxTPiBpbXBsZW1lbnRzIE1pc3RlclJvZ2VyczxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaXN0ZXJSb2dlcnMgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlzdGVyUm9nZXJzPFI+IGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgRGlzYWJsZWQoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHRocm93IGFuIGV4Y2VwdGlvbgotCQkJcHVibGljIEl0ZXJhdG9yPFM+IG5laWdoYm9ycyhTIG5leHQpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgIC8vIEdyYXBoSXRlcmF0b3IubmVpZ2hib3JzKE9iamVjdCkgd2FzIG5vdCBpbXBsZW1lbnRlZAotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnMuRGlzYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9MYXRlcmFsSXRlcmF0b3JXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWM2N2NlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9MYXRlcmFsSXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4gPGVtPkFzc3VtZTwvZW0+IHRoZSB3cmFwcGVkCi0gKiBpdGVyYXRvciByZXR1cm5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIFRoZSByZXN1bHQgaXMgYQotICoge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZhbHNlLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHdyYXBwZWQgaXRlcmF0b3IKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MYXRlcmFsSXRlcmFibGVXcmFwcGVyCi0gKiBAc2VlIFN1Ykl0ZXJhdG9yV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgTGF0ZXJhbEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFMj4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPEUxPiBpdGVyYXRvcjsKLQotCi0JcHVibGljIExhdGVyYWxJdGVyYXRvcldyYXBwZXIoSXRlcmFibGU8RTE+IGl0ZXJhYmxlKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIExhdGVyYWxJdGVyYXRvcldyYXBwZXIoSXRlcmF0b3I8RTE+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCXJldHVybiAoRTIpIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvTGF0ZXJhbExpc3RJdGVyYXRvcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9MYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzRiOGVmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9MYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvCi0gKiBhIGxpc3QgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIDxlbT5Bc3N1bWU8L2VtPiB0aGUKLSAqIHdyYXBwZWQgbGlzdCBpdGVyYXRvciByZXR1cm5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uCi0gKiBUaGUgcmVzdWx0IGlzIGEge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZhbHNlLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHdyYXBwZWQgbGlzdCBpdGVyYXRvcgotICogQHBhcmFtIDxFMj4gb3V0cHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgbGlzdCBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGF0ZXJhbEl0ZXJhYmxlV3JhcHBlcgotICogQHNlZSBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlcjxFMSwgRTI+Ci0JaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RTI+Ci17Ci0JZmluYWwgTGlzdEl0ZXJhdG9yPEUxPiBsaXN0SXRlcmF0b3I7Ci0KLQotCXB1YmxpYyBMYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0PEUxPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIExhdGVyYWxMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3RJdGVyYWJsZTxFMT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCXRoaXMobGlzdEl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBMYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0SXRlcmF0b3I8RTE+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgRTIgbmV4dCgpIHsKLQkJcmV0dXJuIChFMikgdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNQcmV2aW91cygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBFMiBwcmV2aW91cygpIHsKLQkJcmV0dXJuIChFMikgdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aGlzLmxpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBzZXQoRTIgZSkgewotCQl0aGlzLmxpc3RJdGVyYXRvci5zZXQoKEUxKSBlKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBhZGQoRTIgZSkgewotCQl0aGlzLmxpc3RJdGVyYXRvci5hZGQoKEUxKSBlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWY2MjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1BlZWthYmxlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+UGVla2FibGVJdGVyYXRvcjwvY29kZT4gd3JhcHMgYW5vdGhlciB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBhbmQgYWxsb3dzIGEge0BsaW5rICNwZWVrKCl9IGF0IHRoZSBuZXh0IGVsZW1lbnQgdG8gYmUgCi0gKiByZXR1cm5lZCBieSB7QGxpbmsgI25leHQoKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgaXRlcmF0b3IgaXMgdGhhdAotICogdGhlIG5lc3RlZCBpdGVyYXRvcidzIDxjb2RlPm5leHQoKTwvY29kZT4gbWV0aG9kIHdpbGwgYmUgaW52b2tlZAotICogPGVtPmJlZm9yZTwvZW0+IHRoZSBwZWVrYWJsZSBpdGVyYXRvcidzIHtAbGluayAjbmV4dCgpfQotICogbWV0aG9kIGlzIGludm9rZWQuIFRoaXMgaXMgYmVjYXVzZSB0aGUgIm5leHQiIGVsZW1lbnQgbXVzdCBiZQotICogcHJlLWxvYWRlZCBmb3IgdGhlIHtAbGluayAjcGVlaygpfSBtZXRob2QuCi0gKiBUaGlzIGFsc28gcHJldmVudHMgYSBwZWVrYWJsZSBpdGVyYXRvciBmcm9tIHN1cHBvcnRpbmcgdGhlIG9wdGlvbmFsCi0gKiB7QGxpbmsgI3JlbW92ZSgpfSBtZXRob2QuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5QZWVrYWJsZUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBQZWVrYWJsZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCXByaXZhdGUgRSBuZXh0OwotCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwZWVrYWJsZSBpdGVyYXRvciB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQKLQkgKiBpdGVyYWJsZS4KLQkgKi8KLQlwdWJsaWMgUGVla2FibGVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwZWVrYWJsZSBpdGVyYXRvciB0aGF0IHdyYXBzIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogaXRlcmF0b3IuCi0JICovCi0JcHVibGljIFBlZWthYmxlSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JCXRoaXMubG9hZE5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIHJlc3VsdCA9IHRoaXMubmV4dDsKLQkJdGhpcy5sb2FkTmV4dCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYnkgdGhlIG5leHQgY2FsbCB0byB0aGUKLQkgKiB7QGxpbmsgI25leHQoKX0gbWV0aG9kLCB3aXRob3V0IGFkdmFuY2luZyBwYXN0IGl0LgotCSAqLwotCXB1YmxpYyBFIHBlZWsoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBCZWNhdXNlIHdlIG5lZWQgdG8gcHJlLWxvYWQgdGhlIG5leHQgZWxlbWVudAotCSAqIHRvIGJlIHJldHVybmVkLCB3ZSBjYW5ub3Qgc3VwcG9ydCB0aGUge0BsaW5rICNyZW1vdmUoKX0KLQkgKiBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIG5leHQgd2l0aCB0aGUgbmV4dCBlbnRyeSBmcm9tIHRoZSBuZXN0ZWQKLQkgKiBpdGVyYXRvci4gSWYgdGhlcmUgYXJlIG5vbmUsIHtAbGluayAjbmV4dH0gaXMgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogYW5kIHtAbGluayAjZG9uZX0gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dCgpIHsKLQkJaWYgKHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubmV4dCA9IG51bGw7Ci0JCQl0aGlzLmRvbmUgPSB0cnVlOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUXVldWVJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1F1ZXVlSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY5NDYyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUXVldWVJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlF1ZXVlSXRlcmF0b3I8L2NvZGU+IHByb3ZpZGVzIGFuIHtAbGluayBJdGVyYXRvcn0KLSAqIGZvciBhIHtAbGluayBRdWV1ZX0gb2Ygb2JqZWN0cyBvZiB0eXBlIDxjb2RlPkU8L2NvZGU+LiBUaGUgcXVldWUncyBlbGVtZW50cwotICogYXJlIHtAbGluayBRdWV1ZSNkZXF1ZXVlKCkgZGVxdWV1ZX1kIiBhcyB0aGUgaXRlcmF0b3IgcmV0dXJucyB0aGVtIHdpdGgKLSAqIGNhbGxzIHRvIHtAbGluayAjbmV4dCgpfS4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBRdWV1ZQotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlF1ZXVlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFF1ZXVlSXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBRdWV1ZTxFPiBxdWV1ZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlLgotCSAqLwotCXB1YmxpYyBRdWV1ZUl0ZXJhdG9yKFF1ZXVlPEU+IHF1ZXVlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucXVldWUgPSBxdWV1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLnF1ZXVlLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlyZXR1cm4gdGhpcy5xdWV1ZS5kZXF1ZXVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnF1ZXVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNTc4ODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQSA8Y29kZT5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjwvY29kZT4gd3JhcHMgYSBsaXN0Ci0gKiBvZiB7QGxpbmsgTGlzdEl0ZXJhdG9yfXMgYW5kIG1ha2VzIHRoZW0gYXBwZWFyIHRvIGJlIGEgc2luZ2xlCi0gKiByZWFkLW9ubHkge0BsaW5rIExpc3RJdGVyYXRvcn0uIEEgcmVhZC1vbmx5IGNvbXBvc2l0ZSBsaXN0Ci0gKiBpdGVyYXRvciBpcyBtb3JlIGZsZXhpYmxlIHRoYW4gYSBub3JtYWwgY29tcG9zaXRlIGxpc3QgaXRlcmF0b3Igd2hlbiBpdAotICogY29tZXMgdG8gdGhlIGVsZW1lbnQgdHlwZXMgb2YgdGhlIG5lc3RlZCBpdGVyYXRvcnMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IG5leHRJdGVyYXRvcjsKLQlwcml2YXRlIGludCBuZXh0SW5kZXg7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGxpc3RzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBMaXN0PD8gZXh0ZW5kcyBFPj4gbGlzdHMpIHsKLQkJdGhpcygKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxMaXN0PD8gZXh0ZW5kcyBFPiwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4obGlzdHMubGlzdEl0ZXJhdG9yKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiB0cmFuc2Zvcm0oTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQkJCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgbGlzdHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4gbGlzdEl0ZXJhYmxlcykgewotCQl0aGlzKAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4sIExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4+KGxpc3RJdGVyYWJsZXMuaXRlcmF0b3IoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IHRyYW5zZm9ybShMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSkgewotCQkJCQlyZXR1cm4gbGlzdEl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mCi0JICogbGlzdCBpdGVyYXRvcnMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4gaXRlcmF0b3JzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotCQl0aGlzLm5leHRJbmRleCA9IDA7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKEUgb2JqZWN0LCBMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMob2JqZWN0LCBsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHByZXBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoRSBvYmplY3QsIExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCXRoaXMob2JqZWN0LCBsaXN0SXRlcmFibGUuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBwcmVwZW5kZWQKLQkgKiB0byB0aGUgc3BlY2lmaWVkIGl0ZXJhdG9yLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihFIG9iamVjdCwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KG9iamVjdCksIGl0ZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZWFkLW9ubHkgbGlzdCBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGFwcGVuZGVkCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBFIG9iamVjdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBsaXN0SXRlcmFibGUsIEUgb2JqZWN0KSB7Ci0JCXRoaXMobGlzdEl0ZXJhYmxlLml0ZXJhdG9yKCksIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIG9iamVjdCBhcHBlbmRlZAotCSAqIHRvIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIEUgb2JqZWN0KSB7Ci0JCXRoaXMoaXRlcmF0b3IsIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0cy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4uLi4gbGlzdHMpIHsKLQkJdGhpcyhBcnJheXMuYXNMaXN0KGxpc3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcmVhZC1vbmx5IGxpc3QgaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3RzLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+Li4uIGxpc3RJdGVyYWJsZXMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmFibGU8TGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPj4obGlzdEl0ZXJhYmxlcykpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSBsaXN0IGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhdG9ycy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPi4uLiBpdGVyYXRvcnMpIHsKLQkJdGhpcyhuZXcgQXJyYXlMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPj4oaXRlcmF0b3JzKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9hZE5leHRJdGVyYXRvcigpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGlzIG9jY3VycyBpZiB0aGVyZSBhcmUgbm8gaXRlcmF0b3JzIGF0IGFsbAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvYWRQcmV2aW91c0l0ZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIHRoaXMgb2NjdXJzIGlmIHRoZXJlIGFyZSBubyBpdGVyYXRvcnMgYXQgYWxsCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJdGhpcy5sb2FkTmV4dEl0ZXJhdG9yKCk7Ci0JCUUgcmVzdWx0ID0gdGhpcy5uZXh0SXRlcmF0b3IubmV4dCgpOwotCQotCQkvLyB0aGUgc3RhdGVtZW50IGFib3ZlIHdpbGwgdGhyb3cgYSBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCi0JCS8vIGlmIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmU7Ci0JCS8vIHNvIGlmIHdlIGdldCBoZXJlLCB3ZSBjYW4gaW5jcmVtZW50ICduZXh0SW5kZXgnCi0JCXRoaXMubmV4dEluZGV4Kys7Ci0JCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJdGhpcy5sb2FkUHJldmlvdXNJdGVyYXRvcigpOwotCQlFIHJlc3VsdCA9IHRoaXMubmV4dEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCi0JCS8vIHRoZSBzdGF0ZW1lbnQgYWJvdmUgd2lsbCB0aHJvdyBhIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkJLy8gaWYgdGhlIGN1cnJlbnQgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGluZTsKLQkJLy8gc28gaWYgd2UgZ2V0IGhlcmUsIHdlIGNhbiBkZWNyZW1lbnQgJ25leHRJbmRleCcKLQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLm5leHRJbmRleCAgLSAxOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFIG8pIHsKLQkJLy8gdGhlIGxpc3QgaXRlcmF0b3IgaXMgcmVhZC1vbmx5Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gdGhlIGxpc3QgaXRlcmF0b3IgaXMgcmVhZC1vbmx5Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJLy8gdGhlIGxpc3QgaXRlcmF0b3IgaXMgcmVhZC1vbmx5Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8qKgotCSAqIExvYWQge0BsaW5rICNuZXh0SXRlcmF0b3J9IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yIHRoYXQge0BsaW5rICNoYXNOZXh0KCl9Ci0JICogb3IgdGhlIGZpbmFsIGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkTmV4dEl0ZXJhdG9yKCkgewotCQl0aGlzLmNoZWNrTmV4dEl0ZXJhdG9yKCk7Ci0JCXdoaWxlICgoICEgdGhpcy5uZXh0SXRlcmF0b3IuaGFzTmV4dCgpKSAmJiB0aGlzLml0ZXJhdG9ycy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9hZCB7QGxpbmsgI25leHRJdGVyYXRvcn0gd2l0aCB0aGUgZmlyc3QgaXRlcmF0b3IgdGhhdCB7QGxpbmsgI2hhc1ByZXZpb3VzKCl9Ci0JICogb3IgdGhlIGZpcnN0IGl0ZXJhdG9yIGlmIGFsbCB0aGUgZWxlbWVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gcmV0cmlldmVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkUHJldmlvdXNJdGVyYXRvcigpIHsKLQkJdGhpcy5jaGVja05leHRJdGVyYXRvcigpOwotCQl3aGlsZSAoKCAhIHRoaXMubmV4dEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpICYmIHRoaXMuaXRlcmF0b3JzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHtAbGluayAjbmV4dEl0ZXJhdG9yfSBpcyBudWxsLCBsb2FkIGl0IHdpdGggdGhlIGZpcnN0IGl0ZXJhdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja05leHRJdGVyYXRvcigpIHsKLQkJaWYgKHRoaXMubmV4dEl0ZXJhdG9yID09IG51bGwpIHsKLQkJCXRoaXMubmV4dEl0ZXJhdG9yID0gdGhpcy5pdGVyYXRvcnMubmV4dCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NzNkM2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfQotICogYW5kIHJlbW92ZXMgc3VwcG9ydCBmb3Ige0BsaW5rICNyZW1vdmUoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0aGF0Ci0JICogZGlzYWxsb3dzIHJlbW92ZXMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5SXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGMpIHsKLQkJdGhpcyhjLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGl0ZXJhdG9yCi0JICogYW5kIGRpc2FsbG93IHJlbW92ZXMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5SXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDkxMzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5TGlzdEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBBIDxjb2RlPlJlYWRPbmx5TGlzdEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgTGlzdEl0ZXJhdG9yfSBhbmQgcmVtb3ZlcyBzdXBwb3J0IGZvcjo8dWw+Ci0gKiA8bGk+e0BsaW5rICNyZW1vdmUoKX0KLSAqIAk8bGk+e0BsaW5rICNzZXQoT2JqZWN0KX0KLSAqIAk8bGk+e0BsaW5rICNhZGQoT2JqZWN0KX0KLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGxpc3QgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5TGlzdEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcjsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgc3BlY2lmaWVkIGxpc3QgdGhhdAotCSAqIGRpc2FsbG93cyByZW1vdmVzLCBzZXRzLCBhbmQgYWRkcy4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBsaXN0IHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcywgc2V0cywgYW5kIGFkZHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhYmxlKSB7Ci0JCXRoaXMobGlzdEl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgaXRlcmF0b3Igb24gdGhlIHNwZWNpZmllZCBsaXN0IGl0ZXJhdG9yIHRoYXQKLQkgKiBkaXNhbGxvd3MgcmVtb3Zlcywgc2V0cywgYW5kIGFkZHMuCi0JICovCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUgcHJldmlvdXMoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgbykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMubGlzdEl0ZXJhdG9yKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmVzdWx0U2V0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2NmOGM4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9SZXN1bHRTZXRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlJlc3VsdFNldEl0ZXJhdG9yPC9jb2RlPiB3cmFwcyBhbiBTUUwge0BsaW5rIFJlc3VsdFNldH0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyByb3dzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlCi0gKiB7QGxpbmsgI2J1aWxkTmV4dChSZXN1bHRTZXQpfSB0byBidWlsZCB0aGUgZXhwZWN0ZWQgb2JqZWN0IGZyb20KLSAqIHRoZSBjdXJyZW50IHJvdyBvZiB0aGUgcmVzdWx0IHNldC4KLSAqIDxwPgotICogVG8gdXNlLCBzdXBwbHk6PHVsPgotICogPGxpPiBhIHtAbGluayBSZXN1bHRTZXR9Ci0gKiA8bGk+IGFuIHtAbGluayBBZGFwdGVyfSB0aGF0IGNvbnZlcnRzIGEgcm93IGluIHRoZSB7QGxpbmsgUmVzdWx0U2V0fQotICogaW50byB0aGUgZGVzaXJlZCBvYmplY3QKLSAqIChhbHRlcm5hdGl2ZWx5LCBzdWJjbGFzcyA8Y29kZT5SZXN1bHRTZXRJdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICNidWlsZE5leHQoUmVzdWx0U2V0KX0gbWV0aG9kKQotICogPC91bD4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBqYXZhLnNxbC5SZXN1bHRTZXQKLSAqLwotcHVibGljIGNsYXNzIFJlc3VsdFNldEl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgUmVzdWx0U2V0IHJlc3VsdFNldDsKLQlwcml2YXRlIGZpbmFsIEFkYXB0ZXI8RT4gYWRhcHRlcjsKLQlwcml2YXRlIEUgbmV4dDsKLQlwcml2YXRlIGJvb2xlYW4gZG9uZTsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNldCB0aGF0IHJldHVybnMKLQkgKiB0aGUgb2JqZWN0cyBwcm9kdWNlZCBieSB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFJlc3VsdFNldEl0ZXJhdG9yKFJlc3VsdFNldCByZXN1bHRTZXQsIEFkYXB0ZXI8RT4gYWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnJlc3VsdFNldCA9IHJlc3VsdFNldDsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JCXRoaXMubmV4dCA9IHRoaXMuYnVpbGROZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIG9uIHRoZSBzcGVjaWZpZWQgcmVzdWx0IHNldCB0aGF0IHJldHVybnMKLQkgKiB0aGUgZmlyc3Qgb2JqZWN0IGluIGVhY2ggcm93IG9mIHRoZSByZXN1bHQgc2V0LgotCSAqLwotCXB1YmxpYyBSZXN1bHRTZXRJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0KSB7Ci0JCXRoaXMocmVzdWx0U2V0LCBBZGFwdGVyLkRlZmF1bHQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIG5leHQgb2JqZWN0IGZvciB0aGUgaXRlcmF0b3IgdG8gcmV0dXJuLgotCSAqIENsb3NlIHRoZSByZXN1bHQgc2V0IHdoZW4gd2UgcmVhY2ggdGhlIGVuZC4KLQkgKi8KLQlwcml2YXRlIEUgYnVpbGROZXh0KCkgewotCQl0cnkgewotCQkJaWYgKHRoaXMucmVzdWx0U2V0Lm5leHQoKSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTmV4dCh0aGlzLnJlc3VsdFNldCk7Ci0JCQl9Ci0JCQl0aGlzLnJlc3VsdFNldC5jbG9zZSgpOwotCQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChTUUxFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIHJldHVybiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBjdXJyZW50IHJvdwotCSAqIG9mIHRoZSByZXN1bHQgc2V0LiBBbnkge0BsaW5rIFNRTEV4Y2VwdGlvbn1zIHdpbGwKLQkgKiBiZSBjYXVnaHQgYW5kIHdyYXBwZWQgaW4gYSB7QGxpbmsgUnVudGltZUV4Y2VwdGlvbn0uCi0JICovCi0JcHJvdGVjdGVkIEUgYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuYnVpbGROZXh0KHJzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gISB0aGlzLmRvbmU7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuZG9uZSkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlFIHRlbXAgPSB0aGlzLm5leHQ7Ci0JCXRoaXMubmV4dCA9IHRoaXMuYnVpbGROZXh0KCk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5yZXN1bHRTZXQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgUmVzdWx0U2V0SXRlcmF0b3J9IHRvIGNvbnZlcnQgYQotCSAqIHtAbGluayBSZXN1bHRTZXR9J3MgY3VycmVudCByb3cgaW50byB0aGUgbmV4dCBvYmplY3QKLQkgKiB0byBiZSByZXR1cm5lZCBieSB0aGUge0BsaW5rIEl0ZXJhdG9yfS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXI8VD4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gYW4gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc3VsdCBzZXQncwotCQkgKiAiY3VycmVudCIgcm93LiBBbnkge0BsaW5rIFNRTEV4Y2VwdGlvbn1zIHdpbGwKLQkJICogYmUgY2F1Z2h0IGFuZCB3cmFwcGVkIGluIGEge0BsaW5rIFJ1bnRpbWVFeGNlcHRpb259LgotCQkgKiBAc2VlIGphdmEuc3FsLlJlc3VsdFNldAotCQkgKi8KLQkJVCBidWlsZE5leHQoUmVzdWx0U2V0IHJzKSB0aHJvd3MgU1FMRXhjZXB0aW9uOwotCi0KLQkJZmluYWwgY2xhc3MgRGVmYXVsdDxTPiBpbXBsZW1lbnRzIEFkYXB0ZXI8Uz4gewotCQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBEZWZhdWx0KCk7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyBzdGF0aWMgPFI+IEFkYXB0ZXI8Uj4gaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyByZXR1cm4gdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgY3VycmVudCByb3cgb2YgdGhlIHJlc3VsdCBzZXQKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIFMgYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQkJLy8gcmVzdWx0IHNldCBjb2x1bW5zIGFyZSBpbmRleGVkIHN0YXJ0aW5nIHdpdGggMQotCQkJCXJldHVybiAoUykgcnMuZ2V0T2JqZWN0KDEpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiUmVzdWx0U2V0SXRlcmF0b3IuQWRhcHRlci5EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmV2ZXJzZUl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvUmV2ZXJzZUl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiOGJmYjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1JldmVyc2VJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5SZXZlcnNlSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfSBhbmQgcmV0dXJucwotICogaXRzIGVsZW1lbnRzIGluIHRoZSByZXZlcnNlIG9yZGVyIGluIHdoaWNoIHRoZSB3cmFwcGVkIHtAbGluayBJdGVyYXRvcn0KLSAqIHJldHVybnMgdGhlIGVsZW1lbnRzLgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgUmV2ZXJzZUl0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCS8qKgotCSAqIFRoZSBlbGVtZW50cyBpbiB0aGlzIGl0ZXJhdG9yIGFyZSBhbHJlYWR5IHJldmVyc2VkLgotCSAqLwotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJldmVyc2UgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JcHVibGljIFJldmVyc2VJdGVyYXRvcihJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQl0aGlzKENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJldmVyc2UgaXRlcmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCi0JICovCi0JcHVibGljIFJldmVyc2VJdGVyYXRvcihJdGVyYXRvcjxFPiBpdGVyYXRvciwgaW50IHNpemUpIHsKLQkJdGhpcyhDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmF0b3IsIHNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXZlcnNlIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZXZlcnNlSXRlcmF0b3IoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKLQkJdGhpcyhDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSByZXZlcnNlIGl0ZXJhdG9yIGZvciB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlLgotCSAqLwotCXB1YmxpYyBSZXZlcnNlSXRlcmF0b3IoSXRlcmFibGU8RT4gaXRlcmFibGUsIGludCBzaXplKSB7Ci0JCXRoaXMoQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KGl0ZXJhYmxlLCBzaXplKSk7Ci0JfQotCi0JcHJpdmF0ZSBSZXZlcnNlSXRlcmF0b3IoQXJyYXlMaXN0PEU+IHJldmVyc2VMaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSByZXZlcnNlTGlzdC5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQl9Ci0KLQlwdWJsaWMgRSBuZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YTc0M2QuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYXRvcjwvY29kZT4gaG9sZHMgYSBzaW5nbGUgZWxlbWVudAotICogYW5kIHJldHVybnMgaXQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgI25leHQoKX0sIGF0Ci0gKiB3aGljaCBwb2ludCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gdG8gYW55IHN1YnNlcXVlbnQKLSAqIGNhbGwgdG8ge0BsaW5rICNoYXNOZXh0KCl9LgotICogPHA+Ci0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRJdGVyYXRvcjwvY29kZT4gaXMgZXF1aXZhbGVudCB0byB0aGUKLSAqIHtAbGluayBJdGVyYXRvcn0gcmV0dXJuZWQgYnk6Ci0gKiAJe0BsaW5rIGphdmEudXRpbC5Db2xsZWN0aW9ucyNzaW5nbGV0b24oT2JqZWN0IGVsZW1lbnQpfTxjb2RlPi5pdGVyYXRvcigpPC9jb2RlPgotICogCi0gKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvcgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBFIGVsZW1lbnQ7Ci0JcHJpdmF0ZSBib29sZWFuIGRvbmU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCi0JICovCi0JcHVibGljIFNpbmdsZUVsZW1lbnRJdGVyYXRvcihFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5kb25lID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5kb25lOwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmRvbmUpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5kb25lID0gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZWxlbWVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM2M2NkMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPC9jb2RlPiBob2xkcyBhIHNpbmdsZSBlbGVtZW50Ci0gKiBhbmQgcmV0dXJucyBpdCB3aXRoIHRoZSBmaXJzdCBjYWxsIHRvIHtAbGluayAjbmV4dCgpfSwgYXQKLSAqIHdoaWNoIHBvaW50IGl0IHdpbGwgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBhbnkgc3Vic2VxdWVudAotICogY2FsbCB0byB7QGxpbmsgI2hhc05leHQoKX0uIExpa2V3aXNlLCBpdCB3aWxsIHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4KLSAqIHRvIGEgY2FsbCB0byB7QGxpbmsgI2hhc1ByZXZpb3VzKCl9IHVudGlsIGEgY2FsbCB0byB7QGxpbmsgI25leHQoKX0sCi0gKiBhdCB3aGljaCBwb2ludCBhIGNhbGwgdG8ge0BsaW5rICNwcmV2aW91cygpfSB3aWxsIHJldHVybiB0aGUKLSAqIHNpbmdsZSBlbGVtZW50LgotICogPHA+Ci0gKiBBIDxjb2RlPlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gdGhlCi0gKiB7QGxpbmsgTGlzdEl0ZXJhdG9yfSByZXR1cm5lZCBieToKLSAqIAl7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3NpbmdsZXRvbkxpc3QoT2JqZWN0IGVsZW1lbnQpfTxjb2RlPi5saXN0SXRlcmF0b3IoKTwvY29kZT4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8RT4KLQlpbXBsZW1lbnRzIExpc3RJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgRSBlbGVtZW50OwotCXByaXZhdGUgYm9vbGVhbiBoYXNOZXh0OwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGl0ZXJhdG9yIHRoYXQgcmV0dXJucyBvbmx5IHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcihFIGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5oYXNOZXh0ID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0OwotCX0KLQotCXB1YmxpYyBFIG5leHQoKSB7Ci0JCWlmICh0aGlzLmhhc05leHQpIHsKLQkJCXRoaXMuaGFzTmV4dCA9IGZhbHNlOwotCQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQkJfQotCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQlyZXR1cm4gdGhpcy5oYXNOZXh0ID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTmV4dDsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJaWYgKHRoaXMuaGFzTmV4dCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmhhc05leHQgPSB0cnVlOwotCQlyZXR1cm4gdGhpcy5lbGVtZW50OwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzTmV4dCA/IC0xIDogMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFIGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N0YWNrSXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdGFja0l0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTA2ZDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N0YWNrSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogQSA8Y29kZT5TdGFja0l0ZXJhdG9yPC9jb2RlPiBwcm92aWRlcyBhbiB7QGxpbmsgSXRlcmF0b3J9Ci0gKiBmb3IgYSB7QGxpbmsgU3RhY2t9IG9mIG9iamVjdHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhlIHN0YWNrJ3MgZWxlbWVudHMKLSAqIGFyZSB7QGxpbmsgU3RhY2sjcG9wKCkgcG9wfXBlZCIgYXMgdGhlIGl0ZXJhdG9yIHJldHVybnMgdGhlbSB3aXRoCi0gKiBjYWxscyB0byB7QGxpbmsgI25leHQoKX0uCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgU3RhY2sKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdGFja0l0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGFja0l0ZXJhdG9yPEU+Ci0JaW1wbGVtZW50cyBJdGVyYXRvcjxFPgotewotCXByaXZhdGUgZmluYWwgU3RhY2s8RT4gc3RhY2s7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdGFjay4KLQkgKi8KLQlwdWJsaWMgU3RhY2tJdGVyYXRvcihTdGFjazxFPiBzdGFjaykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0YWNrID0gc3RhY2s7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJcmV0dXJuICEgdGhpcy5zdGFjay5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuc3RhY2sucG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0YWNrKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJJdGVyYXRvcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJJdGVyYXRvcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZhZjc4OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3ViSXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogV3JhcCBhbiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiwgY29udmVydGluZyBpdCBpbnRvIGFuCi0gKiBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlIDxjb2RlPkUyPC9jb2RlPi4gPGVtPkFzc3VtZTwvZW0+IHRoZSB3cmFwcGVkCi0gKiBpdGVyYXRvciByZXR1cm5zIG9ubHkgZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMjwvY29kZT4uIFRoZSByZXN1bHQgaXMgYQotICoge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZhbHNlLgotICogPHA+Ci0gKiBUaGlzIGlzIGEge0BsaW5rIExhdGVyYWxJdGVyYXRvcldyYXBwZXJ9IHdpdGggbW9yZSByZXN0cmljdGl2ZSB0eXBlCi0gKiBwYXJhbWV0ZXJzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIHdyYXBwZWQgaXRlcmF0b3IKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1Ykl0ZXJhdG9yV3JhcHBlcjxFMSwgRTIgZXh0ZW5kcyBFMT4KLQlleHRlbmRzIExhdGVyYWxJdGVyYXRvcldyYXBwZXI8RTEsIEUyPgotewotCXB1YmxpYyBTdWJJdGVyYXRvcldyYXBwZXIoSXRlcmFibGU8RTE+IGl0ZXJhYmxlKSB7Ci0JCXN1cGVyKGl0ZXJhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3ViSXRlcmF0b3JXcmFwcGVyKEl0ZXJhdG9yPEUxPiBpdGVyYXRvcikgewotCQlzdXBlcihpdGVyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1Ykxpc3RJdGVyYXRvcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdWJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMjVkODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1Ykxpc3RJdGVyYXRvcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FMTwvY29kZT4sIGNvbnZlcnRpbmcgaXQgaW50bwotICogYSBsaXN0IGl0ZXJhdG9yIG9uIGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LiA8ZW0+QXNzdW1lPC9lbT4gdGhlCi0gKiB3cmFwcGVkIGxpc3QgaXRlcmF0b3IgcmV0dXJucyBvbmx5IGVsZW1lbnRzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogVGhlIHJlc3VsdCBpcyBhIHtAbGluayBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIHRoaXMgYXNzdW1wdGlvbiBpcyBmYWxzZS4KLSAqIDxwPgotICogVGhpcyBpcyBhIHtAbGluayBMYXRlcmFsTGlzdEl0ZXJhdG9yV3JhcHBlcn0gd2l0aCBtb3JlIHJlc3RyaWN0aXZlIHR5cGUKLSAqIHBhcmFtZXRlcnMuCi0gKiAKLSAqIEBwYXJhbSA8RTE+IGlucHV0OiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgd3JhcHBlZCBsaXN0IGl0ZXJhdG9yCi0gKiBAcGFyYW0gPEUyPiBvdXRwdXQ6IHRoZSB0eXBlIG9mIGVsZW1lbnRzIHJldHVybmVkIGJ5IHRoZSBsaXN0IGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyPEUxLCBFMiBleHRlbmRzIEUxPgotCWV4dGVuZHMgTGF0ZXJhbExpc3RJdGVyYXRvcldyYXBwZXI8RTEsIEUyPgotewotCXB1YmxpYyBTdWJMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3Q8RTE+IGxpc3QpIHsKLQkJc3VwZXIobGlzdCk7Ci0JfQotCi0JcHVibGljIFN1Ykxpc3RJdGVyYXRvcldyYXBwZXIoTGlzdEl0ZXJhYmxlPEUxPiBsaXN0SXRlcmFibGUpIHsKLQkJc3VwZXIobGlzdEl0ZXJhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3ViTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0SXRlcmF0b3I8RTE+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKGl0ZXJhdG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXQoRTIgZSkgewotCQkvLyBubyBleHBsaWNpdCBjYXN0IG5lY2Vzc2FyeQotCQl0aGlzLmxpc3RJdGVyYXRvci5zZXQoZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKEUyIGUpIHsKLQkJLy8gbm8gZXhwbGljaXQgY2FzdCBuZWNlc3NhcnkKLQkJdGhpcy5saXN0SXRlcmF0b3IuYWRkKGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckl0ZXJhdG9yV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDIwZmMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVySXRlcmF0b3JXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFdyYXAgYW4gaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgYW55IHN1Yi10eXBlIG9mIDxjb2RlPkU8L2NvZGU+LCBjb252ZXJ0aW5nCi0gKiBpdCBpbnRvIGEgaXRlcmF0b3Igb24gZWxlbWVudHMgb2YgdHlwZSA8Y29kZT5FPC9jb2RlPi4gVGhpcyBzaG91bGRuJ3QgYmUgYQotICogcHJvYmxlbSBzaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gYWRkIGludmFsaWQgZWxlbWVudHMgdG8gdGhlIGl0ZXJhdG9yJ3MKLSAqIGJhY2tpbmcgY29sbGVjdGlvbi4gKE5vdGUgdGhlIGxhY2sgb2YgY29tcGlsZXIgd2FybmluZ3MsIHN1cHByZXNzZWQgb3IKLSAqIG90aGVyd2lzZS4pCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckl0ZXJhYmxlV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU3VwZXJJdGVyYXRvcldyYXBwZXI8RT4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7Ci0KLQotCXB1YmxpYyBTdXBlckl0ZXJhdG9yV3JhcHBlcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3VwZXJJdGVyYXRvcldyYXBwZXIoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLml0ZXJhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmM4ZTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBXcmFwIGEgbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiBhbnkgc3ViLXR5cGUgb2YgPGNvZGU+RTwvY29kZT4sCi0gKiBjb252ZXJ0aW5nIGl0IGludG8gYSA8ZW0+bm9uLXdyaXRhYmxlPC9lbT4gbGlzdCBpdGVyYXRvciBvbiBlbGVtZW50cyBvZiB0eXBlCi0gKiA8Y29kZT5FPC9jb2RlPi4gVGhpcyBzaG91bGRuJ3QgYmUgYSBwcm9ibGVtIHNpbmNlIHRoZQotICogcmVzdWx0aW5nIGxpc3QgaXRlcmF0b3IgZGlzYWJsZXMgdGhlIG1ldGhvZHMgdGhhdCB3b3VsZCBwdXQgaW52YWxpZCBlbGVtZW50cwotICogaW4gdGhlIGl0ZXJhdG9yJ3MgYmFja2luZyBsaXN0IChpLmUuIHtAbGluayAjc2V0KE9iamVjdCl9IGFuZCB7QGxpbmsgI2FkZChPYmplY3QpfSkuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXIKLSAqLwotcHVibGljIGNsYXNzIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEU+IGxpc3RJdGVyYXRvcjsKLQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIFN1cGVyTGlzdEl0ZXJhdG9yV3JhcHBlcihMaXN0SXRlcmFibGU8PyBleHRlbmRzIEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3VwZXJMaXN0SXRlcmF0b3JXcmFwcGVyKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQl9Ci0KLQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkKEUgZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmZWY3ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBXcmFwIGFuIGl0ZXJhdG9yIGFuZCBzeW5jaHJvbml6ZSBhbGwgaXRzIG1ldGhvZHMgc28gaXQgY2FuIGJlIHNhZmVseSBzaGFyZWQKLSAqIGFtb25nIG11bHRpcGxlIHRocmVhZHMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcjsKLQotCS8qKiBPYmplY3QgdG8gc3luY2hyb25pemUgb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgbXV0ZXg7Ci0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlcmFibGUpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZXJhYmxlLCBPYmplY3QgbXV0ZXgpIHsKLQkJdGhpcyhpdGVyYWJsZS5pdGVyYXRvcigpLCBtdXRleCk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVyYXRvcikgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSB0aGlzOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCXRoaXMubXV0ZXggPSBtdXRleDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgbmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuaXRlcmF0b3IpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTYzODQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogV3JhcCBhIGxpc3QgaXRlcmF0b3IgYW5kIHN5bmNocm9uaXplIGFsbCBpdHMgbWV0aG9kcyBzbyBpdCBjYW4gYmUgc2FmZWx5IHNoYXJlZAotICogYW1vbmcgbXVsdGlwbGUgdGhyZWFkcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+Ci17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yOwotCi0JLyoqIE9iamVjdCB0byBzeW5jaHJvbml6ZSBvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBtdXRleDsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0PEU+IGxpc3QpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3Q8RT4gbGlzdCwgT2JqZWN0IG11dGV4KSB7Ci0JCXRoaXMobGlzdC5saXN0SXRlcmF0b3IoKSwgbXV0ZXgpOwotCX0KLQotCXB1YmxpYyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPEU+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTxFPiBsaXN0SXRlcmFibGUsIE9iamVjdCBtdXRleCkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpLCBtdXRleCk7Ci0JfQotCi0JcHVibGljIFN5bmNocm9uaXplZExpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdEl0ZXJhdG9yID0gbGlzdEl0ZXJhdG9yOwotCQl0aGlzLm11dGV4ID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IsIE9iamVjdCBtdXRleCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RJdGVyYXRvciA9IGxpc3RJdGVyYXRvcjsKLQkJdGhpcy5tdXRleCA9IG11dGV4OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEUgbmV4dCgpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgbmV4dEluZGV4KCkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5uZXh0SW5kZXgoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRSBwcmV2aW91cygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmUoKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5saXN0SXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkKEUgZSkgewotCQlzeW5jaHJvbml6ZWQgKHRoaXMubXV0ZXgpIHsKLQkJCXRoaXMubGlzdEl0ZXJhdG9yLmFkZChlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXQoRSBlKSB7Ci0JCXN5bmNocm9uaXplZCAodGhpcy5tdXRleCkgewotCQkJdGhpcy5saXN0SXRlcmF0b3Iuc2V0KGUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJc3luY2hyb25pemVkICh0aGlzLm11dGV4KSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmxpc3RJdGVyYXRvcik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjZhYTQxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci0KLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIEl0ZXJhdG9yfQotICogYW5kIHRyYW5zZm9ybXMgaXRzIHJlc3VsdHMgZm9yIGNsaWVudCBjb25zdW1wdGlvbi4gVG8gdXNlLCBzdXBwbHkgYSAKLSAqIHtAbGluayBUcmFuc2Zvcm1lcn0gb3Igc3ViY2xhc3MgPGNvZGU+VHJhbnNmb3JtYXRpb25JdGVyYXRvcjwvY29kZT4KLSAqIGFuZCBvdmVycmlkZSB0aGUge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kLgotICogT2JqZWN0cyBvZiB0eXBlIDxjb2RlPkUxPC9jb2RlPiBhcmUgdHJhbnNmb3JtZWQgaW50byBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+OwotICogaS5lLiB0aGUgaXRlcmF0b3IgcmV0dXJucyBvYmplY3RzIG9mIHR5cGUgPGNvZGU+RTI8L2NvZGU+LgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPEUxLCBFMj4KLQlpbXBsZW1lbnRzIEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBpdGVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZXJhYmxlCi0JICogYW5kIGEgZGlzYWJsZWQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmFibGU8PyBleHRlbmRzIEUxPiBpdGVyYWJsZSkgewotCQl0aGlzKGl0ZXJhYmxlLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGl0ZXJhdG9yCi0JICogYW5kIGEgZGlzYWJsZWQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmF0b3I8PyBleHRlbmRzIEUxPiBpdGVyYXRvcikgewotCQl0aGlzKGl0ZXJhdG9yLCBUcmFuc2Zvcm1lci5EaXNhYmxlZC48RTEsIEUyPmluc3RhbmNlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlcmFibGUsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMoaXRlcmFibGUuaXRlcmF0b3IoKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGl0ZXJhdG9yCi0JICogYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gaXRlcmF0b3IsIFRyYW5zZm9ybWVyPEUxLCA/IGV4dGVuZHMgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCX0KLQotCXB1YmxpYyBFMiBuZXh0KCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMuaXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oRTEgbmV4dCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5pdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTQ1NWNkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEEgPGNvZGU+VHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8L2NvZGU+IHdyYXBzIGFub3RoZXIge0BsaW5rIExpc3RJdGVyYXRvcn0KLSAqIGFuZCB0cmFuc2Zvcm1zIGl0cyByZXN1bHRzIGZvciBjbGllbnQgY29uc3VtcHRpb24uIFRvIHVzZSwgc3VwcGx5IGEgCi0gKiB7QGxpbmsgVHJhbnNmb3JtZXJ9IG9yIHN1YmNsYXNzIDxjb2RlPlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8L2NvZGU+Ci0gKiBhbmQgb3ZlcnJpZGUgdGhlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZC4KLSAqIDxwPgotICogVGhlIG1ldGhvZHMge0BsaW5rICNzZXQoT2JqZWN0KX0gYW5kIHtAbGluayAjYWRkKE9iamVjdCl9Ci0gKiBhcmUgbGVmdCB1bnN1cHBvcnRlZCBpbiB0aGlzIGNsYXNzLgotICogCi0gKiBAcGFyYW0gPEUxPiBpbnB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgdG8gYmUgdHJhbnNmb3JtZWQKLSAqIEBwYXJhbSA8RTI+IG91dHB1dDogdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3I8RTEsIEUyPgotCWltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEUyPgotewotCXByaXZhdGUgZmluYWwgTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhdG9yOwotCXByaXZhdGUgZmluYWwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXI7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbGlzdAotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCkgewotCQl0aGlzKGxpc3QubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkIGxpc3RlZCBpdGVyYXRvcgotCSAqIGFuZCBhIGRpc2FibGVkIHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEUxPiBsaXN0SXRlcmF0b3IpIHsKLQkJdGhpcyhsaXN0SXRlcmF0b3IsIFRyYW5zZm9ybWVyLkRpc2FibGVkLjxFMSwgRTI+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0Ci0JICogYW5kIGEgZGlzYWJsZWQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm0oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYWJsZSkgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0PD8gZXh0ZW5kcyBFMT4gbGlzdCwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhsaXN0Lmxpc3RJdGVyYXRvcigpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IoTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gbGlzdEl0ZXJhYmxlLCBUcmFuc2Zvcm1lcjxFMSwgPyBleHRlbmRzIEUyPiB0cmFuc2Zvcm1lcikgewotCQl0aGlzKGxpc3RJdGVyYWJsZS5pdGVyYXRvcigpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQgaXRlcmF0b3IKLQkgKiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRTE+IGxpc3RJdGVyYXRvciwgVHJhbnNmb3JtZXI8RTEsID8gZXh0ZW5kcyBFMj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5saXN0SXRlcmF0b3IgPSBsaXN0SXRlcmF0b3I7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkvLyBkZWxlZ2F0ZSB0byB0aGUgbmVzdGVkIGl0ZXJhdG9yCi0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvci5oYXNOZXh0KCk7Ci0JfQotCi0JcHVibGljIEUyIG5leHQoKSB7Ci0JCS8vIHRyYW5zZm9ybSB0aGUgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSBuZXN0ZWQgaXRlcmF0b3IgYmVmb3JlIHJldHVybmluZyBpdAotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5saXN0SXRlcmF0b3IubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0JCS8vIGRlbGVnYXRlIHRvIHRoZSBuZXN0ZWQgaXRlcmF0b3IKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JfQotCi0JcHVibGljIEUyIHByZXZpb3VzKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIGl0ZXJhdG9yIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMubGlzdEl0ZXJhdG9yLnByZXZpb3VzKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChFMiBvKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJLy8gZGVsZWdhdGUgdG8gdGhlIG5lc3RlZCBpdGVyYXRvcgotCQl0aGlzLmxpc3RJdGVyYXRvci5yZW1vdmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm0oRTEgbmV4dCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SXRlcmF0b3IpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTAzYWY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIEEgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPiBzaW1wbGlmaWVzIHRoZSB0cmF2ZXJzYWwgb2YgYQotICogdHJlZSBvZiBvYmplY3RzLCB3aGVyZSB0aGUgb2JqZWN0cycgcHJvdG9jb2wocykgcHJvdmlkZXMKLSAqIGEgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIGdpdmVuCi0gKiBub2RlIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvciBnZXR0aW5nIGFsbCB0aGUKLSAqIGRlc2NlbmRhbnRzIChjaGlsZHJlbiwgZ3JhbmRjaGlsZHJlbiwgZXRjLikgb2YgdGhlIGdpdmVuIG5vZGUuCi0gKiA8cD4KLSAqIFRvIHVzZSwgc3VwcGx5Ojx1bD4KLSAqIDxsaT4gZWl0aGVyIHRoZSByb290IGVsZW1lbnQgb2YgdGhlIHRyZWUgb3IsIGlmIHRoZSB0cmVlIGhhcwotICogbXVsdGlwbGUgcm9vdHMsIGFuIHtAbGluayBJdGVyYXRvcn0gb3ZlciB0aGUgc2V0IG9mIHJvb3RzCi0gKiA8bGk+IGEge0BsaW5rIE1pZHdpZmV9IHRoYXQgZGVsaXZlcnMgdGhlIGNoaWxkcmVuCi0gKiBvZiBlYWNoIGNoaWxkCi0gKiAoYWx0ZXJuYXRpdmVseSwgc3ViY2xhc3MgPGNvZGU+VHJlZUl0ZXJhdG9yPC9jb2RlPgotICogYW5kIG92ZXJyaWRlIHRoZSB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCkKLSAqIDwvdWw+Ci0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgcmV0dXJuZWQgYnkgdGhlIGl0ZXJhdG9yCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmVlSXRlcmFibGUKLSAqLwotcHVibGljIGNsYXNzIFRyZWVJdGVyYXRvcjxFPgotCWltcGxlbWVudHMgSXRlcmF0b3I8RT4KLXsKLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PiBpdGVyYXRvcnM7Ci0JcHJpdmF0ZSBmaW5hbCBNaWR3aWZlPEU+IG1pZHdpZmU7Ci0JcHJpdmF0ZSBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY3VycmVudEl0ZXJhdG9yOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBvZiByb290cwotCSAqIGFuZCBhIGRpc2FibGVkIG1pZHdpZmUuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICNjaGlsZHJlbihPYmplY3QpfSBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZwotCSAqIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXB1YmxpYyBUcmVlSXRlcmF0b3IoRS4uLiByb290cykgewotCQl0aGlzKG5ldyBBcnJheUl0ZXJhdG9yPEU+KHJvb3RzKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb2Ygcm9vdHMKLQkgKiBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiByb290cykgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG9mIHJvb3RzCi0JICogYW5kIGEgZGlzYWJsZWQgbWlkd2lmZS4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUKLQkgKiB7QGxpbmsgI2NoaWxkcmVuKE9iamVjdCl9IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nCi0JICogYSB7QGxpbmsgTWlkd2lmZX0uCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gcm9vdHMpIHsKLQkJdGhpcyhyb290cywgTWlkd2lmZS5EaXNhYmxlZC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdCBhbmQgYSBkaXNhYmxlZCBtaWR3aWZlLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZQotCSAqIHtAbGluayAjY2hpbGRyZW4oT2JqZWN0KX0gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcKLQkgKiBhIHtAbGluayBNaWR3aWZlfS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEUgcm9vdCkgewotCQl0aGlzKHJvb3QsIE1pZHdpZmUuRGlzYWJsZWQuPEU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGl0ZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbm9kZXMgb2YgYSB0cmVlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHJvb3QgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihFIHJvb3QsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8RT4ocm9vdCksIG1pZHdpZmUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEVbXSByb290cywgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXRoaXMobmV3IEFycmF5SXRlcmF0b3I8RT4ocm9vdHMpLCBtaWR3aWZlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIHRoZSBub2RlcyBvZiBhIHRyZWUKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgcm9vdHMgYW5kIG1pZHdpZmUuCi0JICovCi0JcHVibGljIFRyZWVJdGVyYXRvcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gcm9vdHMsIE1pZHdpZmU8RT4gbWlkd2lmZSkgewotCQl0aGlzKHJvb3RzLml0ZXJhdG9yKCksIG1pZHdpZmUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBpdGVyYXRvciB0aGF0IHJldHVybnMgdGhlIG5vZGVzIG9mIGEgdHJlZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCByb290cyBhbmQgbWlkd2lmZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiByb290cywgTWlkd2lmZTxFPiBtaWR3aWZlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY3VycmVudEl0ZXJhdG9yID0gcm9vdHM7Ci0JCS8vIHVzZSBhIExpbmtlZExpc3Qgc2luY2Ugd2Ugd2lsbCBiZSBwdWxsaW5nIG9mZiB0aGUgZnJvbnQgYW5kIGFkZGluZyB0byB0aGUgZW5kCi0JCXRoaXMuaXRlcmF0b3JzID0gbmV3IExpbmtlZExpc3Q8SXRlcmF0b3I8PyBleHRlbmRzIEU+PigpOwotCQl0aGlzLm1pZHdpZmUgPSBtaWR3aWZlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWZvciAoSXRlcmF0b3I8PyBleHRlbmRzIEU+IGl0ZXJhdG9yIDogdGhpcy5pdGVyYXRvcnMpIHsKLQkJCWlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEUgbmV4dCgpIHsKLQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMubmV4dEludGVybmFsKCk7Ci0JCX0KLQkJZm9yIChJdGVyYXRvcjxJdGVyYXRvcjw/IGV4dGVuZHMgRT4+IHN0cmVhbSA9IHRoaXMuaXRlcmF0b3JzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5jdXJyZW50SXRlcmF0b3IgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHRoaXMuY3VycmVudEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJc3RyZWFtLnJlbW92ZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5leHRJbnRlcm5hbCgpOwotCX0KLQotCS8qKgotCSAqIEZldGNoIHRoZSBjaGlsZHJlbiBvZiB0aGUgbmV4dCBub2RlIGJlZm9yZSByZXR1cm5pbmcgaXQuCi0JICovCi0JcHJpdmF0ZSBFIG5leHRJbnRlcm5hbCgpIHsKLQkJRSBuZXh0ID0gdGhpcy5jdXJyZW50SXRlcmF0b3IubmV4dCgpOwotCQl0aGlzLml0ZXJhdG9ycy5hZGQodGhpcy5jaGlsZHJlbihuZXh0KSk7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJdGhpcy5jdXJyZW50SXRlcmF0b3IucmVtb3ZlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIE1pZHdpZmV9LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gY2hpbGRyZW4oRSBuZXh0KSB7Ci0JCXJldHVybiB0aGlzLm1pZHdpZmUuY2hpbGRyZW4obmV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5jdXJyZW50SXRlcmF0b3IpOwotCX0KLQotCi0JLy8qKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZCBieSB7QGxpbmsgVHJlZUl0ZXJhdG9yfSB0byByZXRyaWV2ZQotCSAqIHRoZSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBub2RlIGluIHRoZSB0cmVlLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTWlkd2lmZTxUPiB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCQkgKi8KLQkJSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGNoaWxkcmVuKFQgbyk7Ci0KLQotCQlmaW5hbCBjbGFzcyBOdWxsPFM+IGltcGxlbWVudHMgTWlkd2lmZTxTPiB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBNaWR3aWZlIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlkd2lmZTxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCS8vIHJldHVybiBubyBuZWlnaGJvcnMKLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBjaGlsZHJlbihTIG5leHQpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiVHJlZUl0ZXJhdG9yLk1pZHdpZmUuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIG1pZHdpZmUgdXNlZCB3aGVuIHRoZSB7QGxpbmsgVHJlZUl0ZXJhdG9yI2NoaWxkcmVuKE9iamVjdCl9Ci0JCSAqIG1ldGhvZCBpcyBvdmVycmlkZGVuLgotCQkgKi8KLQkJZmluYWwgY2xhc3MgRGlzYWJsZWQ8Uz4gaW1wbGVtZW50cyBNaWR3aWZlPFM+IHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1pZHdpZmUgSU5TVEFOQ0UgPSBuZXcgRGlzYWJsZWQoKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHN0YXRpYyA8Uj4gTWlkd2lmZTxSPiBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIERpc2FibGVkKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQkvLyB0aHJvdyBhbiBleGNlcHRpb24KLQkJCXB1YmxpYyBJdGVyYXRvcjxTPiBjaGlsZHJlbihTIG5leHQpIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgIC8vIFRyZWVJdGVyYXRvci5jaGlsZHJlbihPYmplY3QpIHdhcyBub3QgaW1wbGVtZW50ZWQKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIlRyZWVJdGVyYXRvci5NaWR3aWZlLkRpc2FibGVkIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZDFkYzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFJlYXNvbmFibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNb2RlbH0gcHJvdG9jb2wKLSAqIHdpdGggbnVtZXJvdXMgY29udmVuaWVuY2UgbWV0aG9kcy4KLSAqIAotICogQHNlZSBDaGFuZ2VTdXBwb3J0Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBNb2RlbAotewotCS8qKgotCSAqIERlbGVnYXRlIHN0YXRlL3Byb3BlcnR5L2NvbGxlY3Rpb24vbGlzdC90cmVlIGNoYW5nZSBzdXBwb3J0IHRvIHRoaXMKLQkgKiBoZWxwZXIgb2JqZWN0LiBUaGUgY2hhbmdlIHN1cHBvcnQgb2JqZWN0IGlzIDxlbT5sYXppbHktaW5pdGlhbGl6ZWQ8L2VtPjsKLQkgKiBzbyBpdCBtYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uIFRoZSBtZXRob2Qge0BsaW5rICNnZXRDaGFuZ2VTdXBwb3J0KCl9Ci0JICogd2lsbCBpbml0aWFsaXplIHRoaXMgZmllbGQgaWYgaXQgaXMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gV2UgaW5zdGFudGlhdGUgdGhpcyB3aGVuIHdlIGZpcmUgZXZlbnRzLCBldmVuIHdoZW4KLQkgKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzICh3aGljaCBpcyBiZSBpbXBsaWVkIGlmIHRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4pLgotCSAqIFRoaXMgYWxsb3dzIHRoZSBjaGFuZ2Ugc3VwcG9ydCB0byBoYXZlIGJlaGF2aW9yIHRpZWQgdG8gZXZlbnRzIGV2ZW4gd2hlbgotCSAqIHdlIGhhdmUgbm8gbGlzdGVuZXJzLgotCSAqIAotCSAqIEBzZWUgQXNwZWN0Q2hhbmdlU3VwcG9ydCNhc3BlY3RDaGFuZ2VkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWNjZXNzb3Igd2lsbCBidWlsZCB0aGUgY2hhbmdlIHN1cHBvcnQgd2hlbiByZXF1aXJlZC4KLQkgKiBUaGlzIG9ubHkgaGVscHMgcmVkdWNlIHRoZSBmb290cHJpbnQgb2YgYSBtb2RlbCB0aGF0IG5laXRoZXIgaGFzIGFueQotCSAqIGxpc3RlbmVycyBhZGRlZCB0byBpdCBub3IgZXZlciBjaGFuZ2VzIChmaXJlcyBhbnkgZXZlbnRzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIENoYW5nZVN1cHBvcnQgZ2V0Q2hhbmdlU3VwcG9ydCgpIHsKLQkJaWYgKHRoaXMuY2hhbmdlU3VwcG9ydCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSB0aGlzLmJ1aWxkQ2hhbmdlU3VwcG9ydCgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNoYW5nZVN1cHBvcnQ7Ci0JfQotCi0JLyoqCi0JICogQWxsb3cgc3ViY2xhc3NlcyB0byB0d2VhayB0aGUgY2hhbmdlIHN1cHBvcnQgdXNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgbm8gY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2hhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuICh0aGlzLmNoYW5nZVN1cHBvcnQgIT0gbnVsbCkgJiYgdGhpcy5jaGFuZ2VTdXBwb3J0Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVN0YXRlQ2hhbmdlZCgpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZywgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcsIGJvb2xlYW4sIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsaWVkIDxjb2RlPm51bGw8L2NvZGU+ICJvbGQiIHZhbHVlLgotCSAqIEBzZWUgI2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlyZXR1cm4gdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbnVsbCwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc0FkZGVkKFN0cmluZywgQ29sbGVjdGlvbikKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbUFkZGVkKFN0cmluZywgT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcsIENvbGxlY3Rpb24pCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlbW92ZWQoU3RyaW5nLCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlQ29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVDb2xsZWN0aW9uQ2xlYXJlZChTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbVRvQ29sbGVjdGlvbihPYmplY3QsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvQ29sbGVjdGlvbihFIGl0ZW0sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9Db2xsZWN0aW9uKGl0ZW0sIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0NvbGxlY3Rpb24oT2JqZWN0W10sIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oRVtdIGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0NvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbiwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihPYmplY3QsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oT2JqZWN0IGl0ZW0sIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oaXRlbSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKE9iamVjdFtdLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYXRvciwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKE9iamVjdFtdLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oT2JqZWN0W10gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZXRhaW5JdGVtc0luQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhYmxlLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oSXRlcmFibGU8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYXRvciwgQ29sbGVjdGlvbiwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oaXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjY2xlYXJDb2xsZWN0aW9uKENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uLCBDb2xsZWN0aW9uLCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmFibGUsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhYmxlPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmF0b3IsIENvbGxlY3Rpb24sIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhdG9yPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBMaXN0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBMaXN0Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBsaXN0IGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIGxpc3QgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNBZGRlZChMaXN0QWRkRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc0FkZGVkKFN0cmluZywgaW50LCBMaXN0KQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtQWRkZWQoU3RyaW5nLCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nLCBpbnQsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlbW92ZWQoU3RyaW5nLCBpbnQsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlSXRlbVJlbW92ZWQobGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNSZXBsYWNlZChTdHJpbmcsIGludCwgTGlzdCwgTGlzdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgPEU+IGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IG5ld0l0ZW1zLCBMaXN0PEU+IHJlcGxhY2VkSXRlbXMpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc1JlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbXMsIHJlcGxhY2VkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbVJlcGxhY2VkKFN0cmluZywgaW50LCBPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbVJlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IHJlcGxhY2VkSXRlbSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZmlyZUl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUl0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlSXRlbXNNb3ZlZChTdHJpbmcsIGludCwgaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIDxFPiBib29sZWFuIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVJdGVtTW92ZWQoU3RyaW5nLCBpbnQsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBmaXJlSXRlbU1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVJdGVtTW92ZWQobGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZUxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZUxpc3RDbGVhcmVkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVMaXN0Q2hhbmdlZChTdHJpbmcgbGlzdE5hbWUsIExpc3Q8Pz4gbGlzdCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTGlzdENoYW5nZWQobGlzdE5hbWUsIGxpc3QpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtVG9MaXN0KGludCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiB2b2lkIGFkZEl0ZW1Ub0xpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbVRvTGlzdChPYmplY3QsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbVRvTGlzdChFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtVG9MaXN0KGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoaW50LCBPYmplY3RbXSwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtc1RvTGlzdChpbnQsIENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRJdGVtc1RvTGlzdChpbnQsIEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaW5kZXgsIGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KGludCwgSXRlcmF0b3IsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoRVtdIGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuYWRkSXRlbXNUb0xpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbiwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2FkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1Gcm9tTGlzdChpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtRnJvbUxpc3QoT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbUZyb21MaXN0KE9iamVjdCBpdGVtLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbUZyb21MaXN0KGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmVtb3ZlUmFuZ2VGcm9tTGlzdChpbnQsIGludCwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiByZW1vdmVSYW5nZUZyb21MaXN0KGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVSYW5nZUZyb21MaXN0KGJlZ2luSW5kZXgsIGVuZEluZGV4LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoaW50LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KGludCwgaW50LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHJlbW92ZUl0ZW1zRnJvbUxpc3QoaW50IGluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpbmRleCwgbGVuZ3RoLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KENvbGxlY3Rpb248Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlbW92ZUl0ZW1zRnJvbUxpc3QoSXRlcmFibGUsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhYmxlPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmVtb3ZlSXRlbXNGcm9tTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmV0YWluSXRlbXNJbkxpc3QoT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5MaXN0KENvbGxlY3Rpb24sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChDb2xsZWN0aW9uPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkucmV0YWluSXRlbXNJbkxpc3QoaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjcmV0YWluSXRlbXNJbkxpc3QoSXRlcmFibGUsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJldGFpbkl0ZW1zSW5MaXN0KGl0ZW1zLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JldGFpbkl0ZW1zSW5MaXN0KEl0ZXJhdG9yLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXRhaW5JdGVtc0luTGlzdChpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNzZXRJdGVtSW5MaXN0KGludCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBFIHNldEl0ZW1Jbkxpc3QoaW50IGluZGV4LCBFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtSW5MaXN0KGluZGV4LCBpdGVtLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3JlcGxhY2VJdGVtSW5MaXN0KE9iamVjdCwgT2JqZWN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBpbnQgcmVwbGFjZUl0ZW1Jbkxpc3QoRSBvbGRJdGVtLCBFIG5ld0l0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5yZXBsYWNlSXRlbUluTGlzdChvbGRJdGVtLCBuZXdJdGVtLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3NldEl0ZW1zSW5MaXN0KGludCwgT2JqZWN0W10sIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IExpc3Q8RT4gc2V0SXRlbXNJbkxpc3QoaW50IGluZGV4LCBFW10gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjc2V0SXRlbXNJbkxpc3QoaW50LCBMaXN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0KGludCBpbmRleCwgTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zZXRJdGVtc0luTGlzdChpbmRleCwgaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjbW92ZUl0ZW1zSW5MaXN0KGludCwgaW50LCBpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IHZvaWQgbW92ZUl0ZW1zSW5MaXN0KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5tb3ZlSXRlbXNJbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjbW92ZUl0ZW1Jbkxpc3QoaW50LCBpbnQsIExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgPEU+IHZvaWQgbW92ZUl0ZW1Jbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNtb3ZlSXRlbUluTGlzdChpbnQsIE9iamVjdCwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gdm9pZCBtb3ZlSXRlbUluTGlzdChpbnQgdGFyZ2V0SW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIGl0ZW0sIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjY2xlYXJMaXN0KExpc3QsIFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGVhckxpc3QoTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmNsZWFyTGlzdChsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplTGlzdChMaXN0LCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChMaXN0PD8gZXh0ZW5kcyBFPiBuZXdMaXN0LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuc3luY2hyb25pemVMaXN0KG5ld0xpc3QsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjc3luY2hyb25pemVMaXN0KEl0ZXJhYmxlLCBMaXN0LCBTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnN5bmNocm9uaXplTGlzdChuZXdMaXN0LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3N5bmNocm9uaXplTGlzdChJdGVyYXRvciwgTGlzdCwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNhZGRUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBUcmVlQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNyZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBUcmVlQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gKHRoaXMuY2hhbmdlU3VwcG9ydCAhPSBudWxsKSAmJiB0aGlzLmNoYW5nZVN1cHBvcnQuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyB0cmVlIGNoYW5nZSBsaXN0ZW5lcnMgdGhhdCB3aWxsCi0JICogYmUgbm90aWZpZWQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyZWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyB0cmVlTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnModHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZU5vZGVBZGRlZChTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlTm9kZUFkZGVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZU5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVOb2RlUmVtb3ZlZChTdHJpbmcsIExpc3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVOb2RlUmVtb3ZlZCh0cmVlTmFtZSwgcGF0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENoYW5nZVN1cHBvcnQjZmlyZVRyZWVDbGVhcmVkKFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmaXJlVHJlZUNsZWFyZWQoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I2ZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlVHJlZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ2hhbmdlU3VwcG9ydCNmaXJlVHJlZUNoYW5nZWQoU3RyaW5nLCBDb2xsZWN0aW9uKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYXJlIGVxdWFsLCB3aXRoIHRoZSBhcHByb3ByaWF0ZSA8Y29kZT5udWxsPC9jb2RlPiBjaGVja3MuCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiA8cD4KLQkgKiA8ZW0+RG8gbm90PC9lbT4gdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZmlyZSBhIGNoYW5nZSBub3RpZmljYXRpb24sCi0JICoge0BsaW5rIENoYW5nZVN1cHBvcnR9IGFscmVhZHkgZG9lcyB0aGF0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICN2YWx1ZXNBcmVFcXVhbChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBhdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVzQXJlRXF1YWwob2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8qKgotCSAqIDxlbT5EbyBub3Q8L2VtPiB1c2UgdGhpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBmaXJlIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiwKLQkgKiB7QGxpbmsgQ2hhbmdlU3VwcG9ydH0gYWxyZWFkeSBkb2VzIHRoYXQuCi0JICogPHA+Ci0JICogRm9yIGV4YW1wbGUsIGFmdGVyIGZpcmluZyB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiwgeW91IGNhbiB1c2UgdGhpcyBtZXRob2QKLQkgKiB0byBkZWNpZGUgaWYgc29tZSBvdGhlciwgcmVsYXRlZCwgcGllY2Ugb2Ygc3RhdGUgbmVlZHMgdG8gYmUgc3luY2hyb25pemVkCi0JICogd2l0aCB0aGUgc3RhdGUgdGhhdCBqdXN0IGNoYW5nZWQuCi0JICogCi0JICogQHNlZSBDaGFuZ2VTdXBwb3J0I3ZhbHVlc0FyZURpZmZlcmVudChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICN2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsdGhvdWdoIGNsb25pbmcgbW9kZWxzIGlzIHVzdWFsbHkgbm90IGEgR29vZCBJZGVhLAotCSAqIHdlIHNob3VsZCBhdCBsZWFzdCBzdXBwb3J0IGl0IHByb3Blcmx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdE1vZGVsIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RNb2RlbCBjbG9uZSA9IChBYnN0cmFjdE1vZGVsKSBzdXBlci5jbG9uZSgpOwotCQkvLyBjbGVhciBvdXQgY2hhbmdlIHN1cHBvcnQgLSBtb2RlbHMgZG8gbm90IHNoYXJlIGxpc3RlbmVycwotCQljbG9uZS5jaGFuZ2VTdXBwb3J0ID0gbnVsbDsKLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIGUuZy4gPGNvZGU+IkNsYXNzTmFtZVswMC1GMy1FRS00Ml0oYWRkJ2wgaW5mbykiPC9jb2RlPgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5hcHBlbmRTaW1wbGVUb1N0cmluZyhzYiwgdGhpcyk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7Ci0JCXRoaXMudG9TdHJpbmcoc2IpOwotCQlpZiAoc2IubGVuZ3RoKCkgPT0gbGVuKSB7Ci0JCQlzYi5kZWxldGVDaGFyQXQobGVuIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBwdWJsaWMgc28gb25lIG1vZGVsIGNhbiBjYWxsIGEgbmVzdGVkIGFic3RyYWN0IG1vZGVsJ3MKLQkgKiA8Y29kZT4jdG9TdHJpbmcoU3RyaW5nQnVpbGRlcik8L2NvZGU+LgotCSAqLwotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCS8vIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gZG8gc29tZXRoaW5nIGEgYml0IG1vcmUgaGVscGZ1bAotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL0FzcGVjdENoYW5nZVN1cHBvcnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL0FzcGVjdENoYW5nZVN1cHBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4ZjQ0My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9Bc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLQotLyoqCi0gKiBUaGlzIGNoYW5nZSBzdXBwb3J0IGNsYXNzIHdpbGwgbm90aWZ5IGxpc3RlbmVycyB3aGVuZXZlciBvbmUgb2YgdGhlIHNvdXJjZSdzCi0gKiBhc3BlY3RzIGhhcyBjaGFuZ2VkLiBPbmx5IHRoZSBhc3BlY3QgbmFtZSBpcyBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyOyBubwotICogZXZlbnQgaXMgZ2VuZXJhdGVkLiBUaGlzIGFsbG93cyB0aGUgbGlzdGVuZXJzIHRvIGRlbGVnYXRlIHRvIHRoZSBjaGFuZ2UKLSAqIHN1cHBvcnQgb2JqZWN0IHZlcmlmaWNhdGlvbiB0aGF0IGFuIGFzcGVjdCBhcyBhY3R1YWxseSBjaGFuZ2VkLiBUaGlzIGlzCi0gKiB1c2VmdWwgZm9yIHNpbXBsZSB0aGluZ3MgbGlrZSBzZXR0aW5nIGRpcnR5IGZsYWdzLCBibGFua2V0IHZhbGlkYXRpb24sIGFuZAotICogYmxhbmtldCBzeWNocm9uaXphdGlvbjsgaS5lLiB0aGluZ3MgdGhhdCBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoZSA8ZW0+bmFtZTwvZW0+Ci0gKiBvZiB0aGUgYXNwZWN0IHRoYXQgY2hhbmdlZCBidXQgbm90IHNvIG11Y2ggPGVtPmhvdzwvZW0+IHRoZSBhc3BlY3QgY2hhbmdlZC4KLSAqLwotcHVibGljIGNsYXNzIEFzcGVjdENoYW5nZVN1cHBvcnQKLQlleHRlbmRzIENoYW5nZVN1cHBvcnQKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RlbmVyPiBMSVNURU5FUl9DTEFTUyA9IExpc3RlbmVyLmNsYXNzOwotCi0KLQlwdWJsaWMgQXNwZWN0Q2hhbmdlU3VwcG9ydChNb2RlbCBzb3VyY2UsIExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMoc291cmNlKTsKLQkJdGhpcy5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIEFzcGVjdENoYW5nZVN1cHBvcnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlJdGVyYWJsZTxMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0ZW5lcnMoKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJbGlzdGVuZXIuYXNwZWN0Q2hhbmdlZChhc3BlY3ROYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKExJU1RFTkVSX0NMQVNTLCBsaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKCkgewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KCk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogTGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIG9mIGFueSBhc3BlY3QgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgYXNwZWN0IGNoYW5nZWQuCi0JCSAqLwotCQl2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpOwotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlU3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCXN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWRfKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNBZGRlZF8oY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiByZW1vdmVkSXRlbXMpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zUmVtb3ZlZF8oY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IHJlbW92ZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNsZWFyZWQoY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiBhZGRlZEl0ZW1zKSB7Ci0JCXN1cGVyLmZpcmVJdGVtc0FkZGVkXyhsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBhZGRlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNSZW1vdmVkXyhsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLQkJc3VwZXIuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCQl0aGlzLmFzcGVjdENoYW5nZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVJdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gcmVwbGFjZWRJdGVtcykgewotCQlzdXBlci5maXJlSXRlbXNSZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1SZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3QgcmVwbGFjZWRJdGVtKSB7Ci0JCXN1cGVyLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgcmVwbGFjZWRJdGVtKTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGxpc3ROYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlSXRlbXNNb3ZlZF8oZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zTW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJc3VwZXIuZmlyZUl0ZW1zTW92ZWRfKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENsZWFyZWQoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2xlYXJlZChsaXN0TmFtZSk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlTGlzdENoYW5nZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChsaXN0TmFtZSwgbGlzdCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChsaXN0TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZChldmVudCk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZChldmVudC5nZXRUcmVlTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQodHJlZU5hbWUsIHBhdGgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQlzdXBlci5maXJlTm9kZVJlbW92ZWQodHJlZU5hbWUsIHBhdGgpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQoZXZlbnQpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQoZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlci5maXJlVHJlZUNsZWFyZWQodHJlZU5hbWUpOwotCQl0aGlzLmFzcGVjdENoYW5nZWQodHJlZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJdGhpcy5hc3BlY3RDaGFuZ2VkKGV2ZW50LmdldFRyZWVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JCXRoaXMuYXNwZWN0Q2hhbmdlZCh0cmVlTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNGI5NTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogU3VwcG9ydCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBieSBpbXBsZW1lbnRvcnMgb2YgdGhlIHtAbGluayBNb2RlbH0gaW50ZXJmYWNlLgotICogSXQgcHJvdmlkZXMgZm9yIHN0YXRlLCBwcm9wZXJ0eSwgY29sbGVjdGlvbiwgbGlzdCwgYW5kIHRyZWUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgdG8KLSAqIGxpc3RlbmVycy4KLSAqIDxwPgotICogPHN0cm9uZz5OQjE6PC9zdHJvbmc+IFRoZXJlIGlzIGxvdHMgb2YgY29weS1uLXBhc3RlIGNvZGUgaW4gdGhpcyBjbGFzcy4gTmVhcmx5IGFsbCBvZiB0aGlzIGR1cGxpY2F0aW9uCi0gKiBpcyBhbiBlZmZvcnQgdG8gcHJldmVudCB0aGUgdW5uZWNlc3NhcnkgY3JlYXRpb24gb2YgbmV3IG9iamVjdHMgKHR5cGljYWxseSBldmVudAotICogb2JqZWN0cykuIFNpbmNlIG1hbnkgZXZlbnRzIGFyZSBmaXJlZCB3aGVuIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMsIHdlIHBvc3Rwb25lCi0gKiB0aGUgY3JlYXRpb24gb2YgZXZlbnQgb2JqZWN0cyB1bnRpbCB3ZSBrbm93IHdlIGhhdmUgaW50ZXJlc3RlZCBsaXN0ZW5lcnMuCi0gKiBNb3N0IG1ldGhvZHMgaGF2ZSB0aGUgIm5vbi1kdXBsaWNhdGVkIiB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgYm9keSBjb21tZW50ZWQKLSAqIG91dCBhdCB0aGUgdG9wIG9mIHRoZSBjdXJyZW50IG1ldGhvZCBib2R5LgotICogVGhlIGhvcGUgd2FzIHRoYXQgdGhpcyBjbGFzcyB3b3VsZCBwcm92ZSB0byBiZSBmYWlybHkgc3RhdGljIGFuZCB0aGUgZHVwbGljYXRlZAotICogY29kZSB3b3VsZCBub3QgcHJvdmUgb25lcm91czsgYnV0IHRoYXQgaGFzIG5vdCBwcm92ZW4gdG8gYmUKLSAqIHRoZSBjYXNlLCBhcyB3ZSBoYXZlIGFkZGVkIHN1cHBvcnQgZm9yICJzdGF0ZSIgY2hhbmdlcywgImRpcnR5IiBub3RpZmljYXRpb24sCi0gKiBhbmQgY3VzdG9tICJub3RpZmllcnMiLCB3aXRoIG1vcmUgdG8gY29tZSwgSSdtIHN1cmUuLi4uICB+Ymp2Ci0gKiA8cD4KLSAqIDxzdHJvbmc+TkIyOjwvc3Ryb25nPiBUaGlzIGNsYXNzIHdpbGwgY2hlY2sgdG8gc2VlIGlmLCBkdXJpbmcgdGhlIGZpcmluZyBvZiBldmVudHMsIGEgbGlzdGVuZXIKLSAqIG9uIHRoZSBvcmlnaW5hbCwgY2xvbmVkLCBsaXN0IG9mIGxpc3RlbmVycyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1hc3RlcgotICogbGlzdCBvZiBsaXN0ZW5lcnMgPGVtPmJlZm9yZTwvZW0+IGl0IGlzIG5vdGlmaWVkLiBJZiB0aGUgbGlzdGVuZXIgaGFzIGJlZW4gcmVtb3ZlZAotICogImNvbmN1cnJlbnRseSIgaXQgd2lsbCA8ZW0+bm90PC9lbT4gYmUgbm90aWZpZWQuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkIzOjwvc3Ryb25nPiBBbnkgbGlzdGVuZXIgdGhhdCBpcyBhZGRlZCBkdXJpbmcgdGhlIGZpcmluZyBvZiBldmVudHMgd2lsbCA8ZW0+bm90PC9lbT4gYmUKLSAqIGFsc28gbm90aWZpZWQuIFRoaXMgaXMgYSBiaXQgaW5jb25zaXN0ZW50IHdpdGggTkIyLCBidXQgc2VlbXMgcmVhc29uYWJsZQotICogc2luY2UgYW55IGFkZGVkIGxpc3RlbmVyIHNob3VsZCBhbHJlYWR5IGJlIGluIHN5bmNoIHdpdGggdGhlIG1vZGVsLgotICogPHA+Ci0gKiA8c3Ryb25nPk5CNDo8L3N0cm9uZz4gVGhpcyBjbGFzcyBpcyBzZXJpYWxpemFibGUsIGJ1dCBpdCB3aWxsIG9ubHkgd3JpdGUgb3V0IGxpc3RlbmVycyB0aGF0Ci0gKiBhcmUgYWxzbyBzZXJpYWxpemFibGUgd2hpbGUgc2lsZW50bHkgbGVhdmluZyBiZWhpbmQgbGlzdGVuZXJzIHRoYXQgYXJlIG5vdC4KLSAqIAotICogQHNlZSBNb2RlbAotICogQHNlZSBBYnN0cmFjdE1vZGVsCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGFuZ2VTdXBwb3J0Ci0JaW1wbGVtZW50cyBTZXJpYWxpemFibGUKLXsKLQkvKiogVGhlIG9iamVjdCB0byBiZSBwcm92aWRlZCBhcyB0aGUgInNvdXJjZSIgZm9yIGFueSBnZW5lcmF0ZWQgZXZlbnRzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBNb2RlbCBzb3VyY2U7Ci0KLQkvKiogQXNzb2NpYXRlIGFzcGVjdCBuYW1lcyB0byBjbGFzcy1zcGVjaWZpYyBsaXN0ZW5lciBsaXN0cy4gKi8KLQlwcml2YXRlIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8Pz5bXSBhc3BlY3RMaXN0ZW5lckxpc3RQYWlycyA9IEVNUFRZX0FTUEVDVF9MSVNURU5FUl9MSVNUX1BBSVJfQVJSQVk7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8Pz5bXSBFTVBUWV9BU1BFQ1RfTElTVEVORVJfTElTVF9QQUlSX0FSUkFZID0gbmV3IEFzcGVjdExpc3RlbmVyTGlzdFBhaXJbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3Qgc3VwcG9ydCBmb3IgdGhlIHNwZWNpZmllZCBzb3VyY2Ugb2YgY2hhbmdlIGV2ZW50cy4KLQkgKiBUaGUgc291cmNlIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ2hhbmdlU3VwcG9ydChNb2RlbCBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQKLQkgKiBjYXJyeWluZyB0aGUgc3BlY2lmaWVkIGFzcGVjdCBuYW1lLgotCSAqIE5laXRoZXIgdGhlIGFzcGVjdCBuYW1lIG5vciB0aGUgbGlzdGVuZXIgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBhc3BlY3RMaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJaWYgKGFzcGVjdExpc3RlbmVyTGlzdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzID0gQXJyYXlUb29scy5hZGQodGhpcy5hc3BlY3RMaXN0ZW5lckxpc3RQYWlycywgbmV3IFNpbXBsZUFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TD4obGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpKTsKLQkJfSBlbHNlIHsKLQkJCWFzcGVjdExpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQlpZiAobGlzdGVuZXJMaXN0ID09IG51bGwpIHsKLQkJCXRoaXMuYXNwZWN0TGlzdGVuZXJMaXN0UGFpcnMgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzLCBuZXcgTnVsbEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TD4obGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpKTsKLQkJfSBlbHNlIHsKLQkJCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgbGlzdGVuZXIgdGhhdCBoYXMgYmVlbiByZWdpc3RlcmVkIGZvciBhbGwgdGhlCi0JICogZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgY2FycnlpbmcgdGhlIHNwZWNpZmllZCBhc3BlY3QgbmFtZS4KLQkgKiBOZWl0aGVyIHRoZSBhc3BlY3QgbmFtZSBub3IgdGhlIGxpc3RlbmVyIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCByZW1vdmVMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQlMaXN0ZW5lckxpc3Q8TD4gYXNwZWN0TGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRMaXN0ZW5lckxpc3QobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCWlmIChhc3BlY3RMaXN0ZW5lckxpc3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5yZWdpc3RlcmVkIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYXNwZWN0TGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7ICAvLyBsZWF2ZSB0aGUgcGFpciwgZXZlbiBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBlbXB0eT8KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgZm9yIGFsbCB0aGUgZXZlbnRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJTGlzdGVuZXJMaXN0PEw+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0TGlzdGVuZXJMaXN0KGxpc3RlbmVyQ2xhc3MpOwotCQlpZiAobGlzdGVuZXJMaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVucmVnaXN0ZXJlZCBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOyAgLy8gbGVhdmUgdGhlIHBhaXIsIGV2ZW4gaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgZW1wdHk/Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0ZW5lciBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzIGFuZCBhc3BlY3QgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGxpc3RlbmVyIGxpc3QgaXMgbm90IHByZXNlbnQuCi0JICogVGhlIGFzcGVjdCBuYW1lIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBMaXN0ZW5lckxpc3Q8TD4gZ2V0TGlzdGVuZXJMaXN0KENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCS8vIHB1dCBpbiBhIG51bGwgY2hlY2sgdG8gc2ltcGxpZnkgY2FsbGluZyBjb2RlCi0JCWlmIChhc3BlY3ROYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdF8obGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0ZW5lciBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBMaXN0ZW5lckxpc3Q8TD4gZ2V0TGlzdGVuZXJMaXN0KENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0XyhsaXN0ZW5lckNsYXNzLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3RlbmVyIGxpc3QgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MgYW5kIGFzcGVjdCBuYW1lLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgbGlzdGVuZXIgbGlzdCBpcyBub3QgcHJlc2VudC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gTGlzdGVuZXJMaXN0PEw+IGdldExpc3RlbmVyTGlzdF8oQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJZm9yIChBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPD8+IHBhaXIgOiB0aGlzLmFzcGVjdExpc3RlbmVyTGlzdFBhaXJzKSB7Ci0JCQlpZiAocGFpci5tYXRjaGVzKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpKSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIExpc3RlbmVyTGlzdDxMPiBhc3BlY3RMaXN0ZW5lckxpc3QgPSAoTGlzdGVuZXJMaXN0PEw+KSBwYWlyLmxpc3RlbmVyTGlzdDsKLQkJCQlyZXR1cm4gYXNwZWN0TGlzdGVuZXJMaXN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyIGNsYXNzCi0JICogYW5kIGFzcGVjdCBuYW1lLgotCSAqLwotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBhc3BlY3RMaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJaWYgKChhc3BlY3RMaXN0ZW5lckxpc3QgIT0gbnVsbCkgJiYgISBhc3BlY3RMaXN0ZW5lckxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5oYXNBbnlDaGFuZ2VMaXN0ZW5lcnMoKTsgIC8vIGNoZWNrIGZvciBhbnkgZ2VuZXJhbCBwdXJwb3NlIGxpc3RlbmVycwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MKLQkgKiBhbmQgYXNwZWN0IG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNOb0xpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmhhc0FueUxpc3RlbmVycyhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3RlbmVycyBmb3IgdGhlIHNwZWNpZmllZCBsaXN0ZW5lciBjbGFzcy4KLQkgKi8KLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBib29sZWFuIGhhc0FueUxpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCUxpc3RlbmVyTGlzdDxMPiBhc3BlY3RMaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RlbmVyTGlzdChsaXN0ZW5lckNsYXNzKTsKLQkJaWYgKChhc3BlY3RMaXN0ZW5lckxpc3QgIT0gbnVsbCkgJiYgISBhc3BlY3RMaXN0ZW5lckxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBjaGVjayBmb3IgYW55IGdlbmVyYWwgcHVycG9zZSBsaXN0ZW5lcnMgKHVubGVzcyB0aGF0J3Mgd2hhdCB3ZSdyZSBhbHJlYWR5IGRvaW5nKQotCQlyZXR1cm4gKGxpc3RlbmVyQ2xhc3MgPT0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkpID8gZmFsc2UgOiB0aGlzLmhhc0FueUNoYW5nZUxpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBubyBsaXN0ZW5lcnMgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgY2xhc3MuCi0JICovCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNOb0xpc3RlbmVycyhDbGFzczxMPiBsaXN0ZW5lckNsYXNzKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmFsIHB1cnBvc2UgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogU3ViY2xhc3NlcyB0aGF0IGFkZCBvdGhlciB0eXBlcyBvZiBsaXN0ZW5lcnMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kCi0JICogdG8gcmV0dXJuIHRoZSBleHRlbnNpb24gdG8gQ2hhbmdlTGlzdGVuZXIgdGhhdCBhbHNvIGV4dGVuZHMgd2hhdGV2ZXIgbmV3Ci0JICogbGlzdGVuZXIgdHlwZXMgYXJlIHN1cHBvcnRlZC4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgPEwgZXh0ZW5kcyBDaGFuZ2VMaXN0ZW5lcj4gQ2xhc3M8TD4gZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpIHsKLQkJLy8gbm90IHN1cmUgd2h5IEkgbmVlZCB0byBjYXN0IGhlcmUuLi4KLQkJcmV0dXJuIChDbGFzczxMPikgQ0hBTkdFX0xJU1RFTkVSX0NMQVNTOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q2hhbmdlTGlzdGVuZXI+IENIQU5HRV9MSVNURU5FUl9DTEFTUyA9IENoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgZ2VuZXJhbCBwdXJwb3NlIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgZXZlbnRzLAotCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGFzcGVjdCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGV2ZW50LgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgZ2VuZXJhbCBwdXJwb3NlIGxpc3RlbmVyLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBnZW5lcmFsIHB1cnBvc2UgbGlzdGVuZXJzIHRoYXQgd2lsbCBiZQotCSAqIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueUNoYW5nZUxpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdGVuZXJzKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxDaGFuZ2VMaXN0ZW5lcj4gZ2V0Q2hhbmdlTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBnZXRDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUxpc3RlbmVyTGlzdDxDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJcmV0dXJuIChsaXN0ZW5lckxpc3QgPT0gbnVsbCkgPyBudWxsIDogbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCksIGxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBTdGF0ZUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKFNUQVRFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHN0YXRlIGNoYW5nZSBsaXN0ZW5lci4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHN0YXRlIGNoYW5nZSBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhTVEFURV9DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGdldFN0YXRlQ2hhbmdlTGlzdGVuZXJMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoU1RBVEVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGdldFN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlMaXN0ZW5lckxpc3Q8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRTdGF0ZUNoYW5nZUxpc3RlbmVyTGlzdCgpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1N0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgdGhlIHNwZWNpZmllZCBzdGF0ZSBjaGFuZ2UgZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlJdGVyYWJsZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFN0YXRlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgZ2VuZXJpYyBzdGF0ZSBjaGFuZ2UgZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgc3RhdGUgY2hhbmdlCi0JICogbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVTdGF0ZUNoYW5nZWQoKSB7Ci0vLwkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKG5ldyBTdGF0ZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlKSk7Ci0JCVN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFN0YXRlQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFN0YXRlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgU3RhdGVDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvcGVydHkgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCi0JLyoqCi0JICogQWRkIGEgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LiBUaGUgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIG5vdGlmaWVkIG9ubHkgZm9yIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5hZGRMaXN0ZW5lcihQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdhcyByZWdpc3RlcmVkIGZvciBhIHNwZWNpZmljIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lckxpc3QoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QoUFJPUEVSVFlfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlMaXN0ZW5lckxpc3Q8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyTGlzdChwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEZpcmUgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIHRoZSBzcGVjaWZpZWQgZXZlbnQncyBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHRoZSBzYW1lOwotCSAqIHRoaXMgaW5jbHVkZXMgd2hlbiBib3RoIHZhbHVlcyBhcmUgbnVsbC4gVXNlIGEgc3RhdGUgY2hhbmdlIGV2ZW50Ci0JICogZm9yIGdlbmVyYWwgcHVycG9zZSBub3RpZmljYXRpb24gb2YgY2hhbmdlcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChldmVudC5nZXRPbGRWYWx1ZSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkXyhldmVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBldmVudCdzIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlZF8oUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCUl0ZXJhYmxlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHByb3BlcnR5IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSB0aGUgc2FtZTsKLQkgKiB0aGlzIGluY2x1ZGVzIHdoZW4gYm90aCB2YWx1ZXMgYXJlIG51bGwuIFVzZSBhIHN0YXRlIGNoYW5nZSBldmVudAotCSAqIGZvciBnZW5lcmFsIHB1cnBvc2Ugbm90aWZpY2F0aW9uIG9mIGNoYW5nZXMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob2xkVmFsdWUsIG5ld1ZhbHVlKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGFuIDxjb2RlPmludDwvY29kZT4gYm91bmQgcHJvcGVydHkgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBObyBldmVudCBpcyBmaXJlZCBpZiB0aGUgc3BlY2lmaWVkIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZXF1YWwuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmUgZGlmZmVyZW50LgotCSAqIDxwPgotCSAqIFRoaXMgaXMgbWVyZWx5IGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIG1vcmUgZ2VuZXJhbCBtZXRob2QKLQkgKiB7QGxpbmsgI2ZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nLCBPYmplY3QsIE9iamVjdCl9LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgSW50ZWdlci52YWx1ZU9mKG9sZFZhbHVlKSwgSW50ZWdlci52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCWlmIChvbGRWYWx1ZSAhPSBuZXdWYWx1ZSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkXyhwcm9wZXJ0eU5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVQcm9wZXJ0eUNoYW5nZWRfKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBJbnRlZ2VyLnZhbHVlT2Yob2xkVmFsdWUpLCBJbnRlZ2VyLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgSW50ZWdlci52YWx1ZU9mKG9sZFZhbHVlKSwgSW50ZWdlci52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSA8Y29kZT5ib29sZWFuPC9jb2RlPiBib3VuZCBwcm9wZXJ0eSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIE5vIGV2ZW50IGlzIGZpcmVkIGlmIHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBlcXVhbC4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQuCi0JICogPHA+Ci0JICogVGhpcyBpcyBtZXJlbHkgYSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgbW9yZSBnZW5lcmFsIG1ldGhvZAotCSAqIHtAbGluayAjZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcsIE9iamVjdCwgT2JqZWN0KX0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUsIEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCQlpZiAob2xkVmFsdWUgIT0gbmV3VmFsdWUpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZF8ocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgdmFsdWVzIGFyZSBkaWZmZXJlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlUHJvcGVydHlDaGFuZ2VkXyhTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgcHJvcGVydHlOYW1lLCBCb29sZWFuLnZhbHVlT2Yob2xkVmFsdWUpLCBCb29sZWFuLnZhbHVlT2YobmV3VmFsdWUpKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHByb3BlcnR5TmFtZSwgQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgQm9vbGVhbi52YWx1ZU9mKG5ld1ZhbHVlKSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLiBUaGUgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIG5vdGlmaWVkIG9ubHkgZm9yIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBnZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlMaXN0ZW5lckxpc3Q8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lckxpc3QoY29sbGVjdGlvbk5hbWUpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGV2ZW50IGhhcyBhbnkgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkXyhldmVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBldmVudCBjb250YWlucyBpdGVtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc0FkZGVkXyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGNvbGxlY3Rpb25OYW1lID0gZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKTsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIuaXRlbXNBZGRlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gYWRkZWRJdGVtcykgewotLy8JCXJldHVybiB0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW1zKSk7Ci0JCWlmICggISBhZGRlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8oY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICdhZGRlZEl0ZW1zJyBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLQkJQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGFkZGVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihhZGRlZEl0ZW0pKTsKLQotCQlDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvbkFkZEV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBhZGRlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZXZlbnQgaGFzIGFueSBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQuZ2V0SXRlbXNTaXplKCkgIT0gMCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBldmVudCBjb250YWlucyBpdGVtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlbW92ZWRfKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZW1vdmVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotLy8JCXJldHVybiB0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIHJlbW92ZWRJdGVtcykpOwotCQlpZiAoICEgcmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAncmVtb3ZlZEl0ZW1zJyBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gcmVtb3ZlZEl0ZW1zKSB7Ci0JCUNvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihyZW1vdmVkSXRlbSkpOwotCi0JCUNvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZSA9IGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCk7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DbGVhcmVkKFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotLy8JCXRoaXMuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKG5ldyBDb2xsZWN0aW9uQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpKTsKLQotCQlDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKGNvbGxlY3Rpb25OYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBjb2xsZWN0aW9uIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgY29sbGVjdGlvbk5hbWUgPSBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpOwotCQlJdGVyYWJsZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhjb2xsZWN0aW9uTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgY29sbGVjdGlvbiB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotLy8JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKSk7Ci0KLQkJQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoY29sbGVjdGlvbk5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VFdmVudCh0aGlzLnNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGNvbGxlY3Rpb24pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBjb2xsZWN0aW9uKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbSB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI2FkZChPYmplY3QpCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1Ub0NvbGxlY3Rpb24oRSBpdGVtLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5hZGQoaXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChjb2xsZWN0aW9uTmFtZSwgaXRlbSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI2FkZEFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihFW10gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiAoaXRlbXMubGVuZ3RoICE9IDApCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8obmV3IEFycmF5SXRlcmF0b3I8RT4oaXRlbXMpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI2FkZEFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8oaXRlbXMuaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNhZGRBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0NvbGxlY3Rpb24oSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI2FkZEFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvQ29sbGVjdGlvbihJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBpdGVtcy5oYXNOZXh0KCkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9Db2xsZWN0aW9uXyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCUNvbGxlY3Rpb248RT4gYWRkZWRJdGVtcyA9IG51bGw7Ci0JCXdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCUUgaXRlbSA9IGl0ZW1zLm5leHQoKTsKLQkJCWlmIChjb2xsZWN0aW9uLmFkZChpdGVtKSkgewotCQkJCWlmIChhZGRlZEl0ZW1zID09IG51bGwpIHsKLQkJCQkJYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oKTsKLQkJCQl9Ci0JCQkJYWRkZWRJdGVtcy5hZGQoaXRlbSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFkZGVkSXRlbXMgIT0gbnVsbCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZF8oY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW0gZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JlbW92ZShPYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKE9iamVjdCBpdGVtLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5yZW1vdmUoaXRlbSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCBpdGVtKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihPYmplY3RbXSBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiAoICEgY29sbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uXyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKENvbGxlY3Rpb248Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiAoICEgaXRlbXMuaXNFbXB0eSgpKQotCQkJCSYmICggISBjb2xsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25fKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihJdGVyYWJsZTw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oSXRlcmF0b3I8Pz4gaXRlbXMsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBpdGVtcy5oYXNOZXh0KCkKLQkJCQkmJiAoICEgY29sbGVjdGlvbi5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uXyhpdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25fKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlIYXNoQmFnPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZW1zKTsKLQkJcmVtb3ZlZEl0ZW1zLnJldGFpbkFsbChjb2xsZWN0aW9uKTsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gY29sbGVjdGlvbi5yZW1vdmVBbGwocmVtb3ZlZEl0ZW1zKTsKLQotCQlpZiAoICEgcmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkXyhjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKE9iamVjdFtdIGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoaXRlbXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbl8oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uXyhuZXcgQXJyYXlJdGVyYXRvcjxPYmplY3Q+KGl0ZW1zKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uXyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb25fKGl0ZW1zLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICogQHNlZSBDb2xsZWN0aW9uI3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKEl0ZXJhYmxlPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luQ29sbGVjdGlvbihpdGVtcy5pdGVyYXRvcigpLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBjb2xsZWN0aW9uCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqIEBzZWUgQ29sbGVjdGlvbiNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luQ29sbGVjdGlvbihJdGVyYXRvcjw/PiBpdGVtcywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKCAhIGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uXyhjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb25fKGl0ZW1zLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogbm8gZW1wdHkgY2hlY2tzCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmV0YWluSXRlbXNJbkNvbGxlY3Rpb25fKEl0ZXJhdG9yPD8+IGl0ZW1zLCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlIYXNoQmFnPD8+IHJldGFpbmVkSXRlbXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihpdGVtcyk7Ci0JCUhhc2hCYWc8Pz4gcmVtb3ZlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oY29sbGVjdGlvbik7Ci0JCXJlbW92ZWRJdGVtcy5yZW1vdmVBbGwocmV0YWluZWRJdGVtcyk7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGNvbGxlY3Rpb24ucmV0YWluQWxsKHJldGFpbmVkSXRlbXMpOwotCi0JCWlmICggISByZW1vdmVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCQl9Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBlbnRpcmUgY29sbGVjdGlvbgotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKiBAc2VlIENvbGxlY3Rpb24jY2xlYXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsZWFyQ29sbGVjdGlvbihDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIFN0cmluZyBjb2xsZWN0aW9uTmFtZSkgewotCQlpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb25fKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsZWFyQ29sbGVjdGlvbl8oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJY29sbGVjdGlvbi5jbGVhcigpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChjb2xsZWN0aW9uTmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBjb2xsZWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBuZXcgY29sbGVjdGlvbiwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiByZW1vdmVzIGFuZCBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2xsZWN0aW9uIGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplQ29sbGVjdGlvbihDb2xsZWN0aW9uPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCWlmIChuZXdDb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJDb2xsZWN0aW9uKGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQkJfQotCi0JCWlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb25fKG5ld0NvbGxlY3Rpb24uaXRlcmF0b3IoKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uXyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBjb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGNvbGxlY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBjb2xsZWN0aW9uLAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHJlbW92ZXMgYW5kIGFkZHMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbGxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gc3luY2hyb25pemVDb2xsZWN0aW9uKEl0ZXJhYmxlPEU+IG5ld0NvbGxlY3Rpb24sIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbiwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihuZXdDb2xsZWN0aW9uLml0ZXJhdG9yKCksIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgY29sbGVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmV3IGNvbGxlY3Rpb24sCi0JICogbWFraW5nIGEgbWluaW11bSBudW1iZXIgb2YgcmVtb3ZlcyBhbmQgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sbGVjdGlvbiBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUNvbGxlY3Rpb24oSXRlcmF0b3I8RT4gbmV3Q29sbGVjdGlvbiwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJaWYgKCAhIG5ld0NvbGxlY3Rpb24uaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJaWYgKGNvbGxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbl8obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uXyhDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihuZXdDb2xsZWN0aW9uKSwgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUNvbGxlY3Rpb25fKENvbGxlY3Rpb248RT4gbmV3Q29sbGVjdGlvbiwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb248RT4gcmVtb3ZlSXRlbXMgPSBuZXcgSGFzaEJhZzxFPihjb2xsZWN0aW9uKTsKLQkJcmVtb3ZlSXRlbXMucmVtb3ZlQWxsKG5ld0NvbGxlY3Rpb24pOwotCQljaGFuZ2VkIHw9IHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihyZW1vdmVJdGVtcywgY29sbGVjdGlvbiwgY29sbGVjdGlvbk5hbWUpOwotCi0JCUNvbGxlY3Rpb248RT4gYWRkSXRlbXMgPSBuZXcgSGFzaEJhZzxFPihuZXdDb2xsZWN0aW9uKTsKLQkJYWRkSXRlbXMucmVtb3ZlQWxsKGNvbGxlY3Rpb24pOwotCQljaGFuZ2VkIHw9IHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oYWRkSXRlbXMsIGNvbGxlY3Rpb24sIGNvbGxlY3Rpb25OYW1lKTsKLQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDaGFuZ2VMaXN0ZW5lcj4gTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MgPSBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0IGNoYW5nZSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBsaXN0LiBUaGUgbGlzdGVuZXIKLQkgKiB3aWxsIGJlIG5vdGlmaWVkIG9ubHkgZm9yIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZExpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmFkZExpc3RlbmVyKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2FzIHJlZ2lzdGVyZWQgZm9yIGEgc3BlY2lmaWMgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZW1vdmVMaXN0ZW5lcihMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGxpc3QgY2hhbmdlIGxpc3RlbmVycyB0aGF0IHdpbGwKLQkgKiBiZSBub3RpZmllZCB3aGVuIHRoZSBzcGVjaWZpZWQgbGlzdCBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlMaXN0ZW5lcnMoTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RlbmVyTGlzdDxMaXN0Q2hhbmdlTGlzdGVuZXI+IGdldExpc3RDaGFuZ2VMaXN0ZW5lckxpc3QoU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldExpc3RlbmVyTGlzdChMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBnZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKFN0cmluZyBsaXN0TmFtZSkgewotCQlMaXN0ZW5lckxpc3Q8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lckxpc3QobGlzdE5hbWUpOwotCQlyZXR1cm4gKGxpc3RlbmVyTGlzdCA9PSBudWxsKSA/IG51bGwgOiBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSksIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50IGNvbnRhaW5zIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IGFkZGVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpKTsKLQkJaWYgKCAhIGFkZGVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkXyhsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICdhZGRlZEl0ZW1zJyBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNBZGRlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gYWRkZWRJdGVtcykgewotCQlMaXN0QWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdEFkZEV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RBZGRFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1BZGRlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGFkZGVkSXRlbSkgewotLy8JCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGFkZGVkSXRlbSkpOwotCi0JCUxpc3RBZGRFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0QWRkRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSByZW1vdmVkIGl0ZW1zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRJdGVtc1NpemUoKSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50IGNvbnRhaW5zIGl0ZW1zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgYW55IHJlbW92ZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlSXRlbXNSZW1vdmVkKG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKSk7Ci0JCWlmICggISByZW1vdmVkSXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWRfKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAncmVtb3ZlZEl0ZW1zJyBpcyBub3QgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZW1vdmVkXyhTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgTGlzdDw/PiByZW1vdmVkSXRlbXMpIHsKLQkJTGlzdFJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCBsaXN0IHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZUl0ZW1SZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgcmVtb3ZlZEl0ZW0pIHsKLS8vCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobGlzdE5hbWUsIGluZGV4LCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlbW92ZWRJdGVtKSk7Ci0KLQkJTGlzdFJlbW92ZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCByZW1vdmVkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVtb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVwbGFjZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlpZiAoKGV2ZW50LmdldEl0ZW1zU2l6ZSgpICE9IDApICYmIHRoaXMuZWxlbWVudHNBcmVEaWZmZXJlbnQoZXZlbnQuZ2V0TmV3SXRlbXMoKSwgZXZlbnQuZ2V0T2xkSXRlbXMoKSkpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGV2ZW50IGNvbnRhaW5zIG5ldyBpdGVtcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc1JlcGxhY2VkXyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgcmVwbGFjZWQgaXRlbXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gb2xkSXRlbXMpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlSXRlbXNSZXBsYWNlZChuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgb2xkSXRlbXMpKTsKLQkJaWYgKCggISBuZXdJdGVtcy5pc0VtcHR5KCkpICYmIHRoaXMuZWxlbWVudHNBcmVEaWZmZXJlbnQobmV3SXRlbXMsIG9sZEl0ZW1zKSkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZF8obGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgb2xkSXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICduZXdJdGVtcycgaXMgbm90IGVtcHR5IGFuZCB1bmVxdWFsIHRvICdvbGRJdGVtcycKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlSXRlbXNSZXBsYWNlZF8oU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gbmV3SXRlbXMsIExpc3Q8Pz4gb2xkSXRlbXMpIHsKLQkJTGlzdFJlcGxhY2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLCBvbGRJdGVtcyk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgb2xkSXRlbXMpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgaXRlbSBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtUmVwbGFjZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCBuZXdJdGVtLCBPYmplY3Qgb2xkSXRlbSkgewotLy8JCXJldHVybiB0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXdJdGVtKSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChvbGRJdGVtKSk7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChuZXdJdGVtLCBvbGRJdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkXyhsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgb2xkIGFuZCBuZXcgaXRlbXMgYXJlIGRpZmZlcmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtUmVwbGFjZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IG9sZEl0ZW0pIHsKLQkJTGlzdFJlcGxhY2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0UmVwbGFjZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RSZXBsYWNlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbW92ZWQgaXRlbXMuCi0JICovCi0JLy8gaXQncyB1bmxpa2VseSBidXQgcG9zc2libGUgdGhlIGxpc3QgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBtb3ZlLi4uCi0JLy8gZS5nLiBhbnkgbW92ZXMgd2l0aGluIFsiZm9vIiwgImZvbyIsICJmb28iXQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFRhcmdldEluZGV4KCkgIT0gZXZlbnQuZ2V0U291cmNlSW5kZXgoKSkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZF8oZXZlbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBzcGVjaWZpZWQgZXZlbnQgaW5kaWNhdGVzIGEgbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtc01vdmVkXyhMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGV2ZW50LmdldExpc3ROYW1lKCk7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbW92ZWQgaXRlbXMuCi0JICovCi0JLy8gaXQncyB1bmxpa2VseSBidXQgcG9zc2libGUgdGhlIGxpc3QgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBtb3ZlLi4uCi0JLy8gZS5nLiBhbnkgbW92ZXMgd2l0aGluIFsiZm9vIiwgImZvbyIsICJmb28iXQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc01vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLS8vCQlyZXR1cm4gdGhpcy5maXJlSXRlbXNNb3ZlZChuZXcgTGlzdE1vdmVFdmVudCh0aGlzLnNvdXJjZSwgbGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKSk7Ci0JCWlmICh0YXJnZXRJbmRleCAhPSBzb3VyY2VJbmRleCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZF8obGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgbGVuZ3RoKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIGluZGljZXMgaW5kaWNhdGUgYSBtb3ZlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUl0ZW1zTW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJTGlzdE1vdmVFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IExpc3RNb3ZlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgbW92ZWQgaXRlbXMuCi0JICovCi0JLy8gaXQncyB1bmxpa2VseSBidXQgcG9zc2libGUgdGhlIGxpc3QgaXMgdW5jaGFuZ2VkIGJ5IHRoZSBtb3ZlLi4uCi0JLy8gZS5nLiBhbnkgbW92ZXMgd2l0aGluIFsiZm9vIiwgImZvbyIsICJmb28iXQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtTW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpZiAodGFyZ2V0SW5kZXggIT0gc291cmNlSW5kZXgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1Nb3ZlZF8obGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBpbmRpY2VzIGluZGljYXRlIGEgbW92ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVJdGVtTW92ZWRfKFN0cmluZyBsaXN0TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZF8obGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgMSk7Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBldmVudC5nZXRMaXN0TmFtZSgpOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLS8vCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChuZXcgTGlzdENsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lKSk7Ci0KLQkJTGlzdENsZWFyRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0TGlzdENoYW5nZUxpc3RlbmVycyhsaXN0TmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lKTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENsZWFyRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgbGlzdCB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIGxpc3ROYW1lID0gZXZlbnQuZ2V0TGlzdE5hbWUoKTsKLQkJSXRlcmFibGU8TGlzdENoYW5nZUxpc3RlbmVyPiBsaXN0ZW5lcnMgPSB0aGlzLmdldExpc3RDaGFuZ2VMaXN0ZW5lcnMobGlzdE5hbWUpOwotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCBsaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJbGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIGxpc3QgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTGlzdENoYW5nZWQoU3RyaW5nIGxpc3ROYW1lLCBMaXN0PD8+IGxpc3QpIHsKLS8vCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSkpOwotCi0JCUxpc3RDaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRMaXN0Q2hhbmdlTGlzdGVuZXJzKGxpc3ROYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0xpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIGxpc3ROYW1lLCBsaXN0KTsKLQkJCQkJfQotCQkJCQlsaXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgTGlzdENoYW5nZUV2ZW50KHRoaXMuc291cmNlLCBsaXN0TmFtZSwgbGlzdCk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW0gdG8gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQuCi0JICogQHNlZSBMaXN0I2FkZChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IHZvaWQgYWRkSXRlbVRvTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJbGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQgKGkuZS4gJ3RydWUnKS4KLQkgKiBAc2VlIExpc3QjYWRkKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbVRvTGlzdChFIGl0ZW0sIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmFkZChpdGVtKSkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKGxpc3ROYW1lLCBsaXN0LnNpemUoKSAtIDEsIGl0ZW0pOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gTGlzdCNhZGQoT2JqZWN0KSBzaG91bGQgYWx3YXlzIHJldHVybiAndHJ1ZScsIHNvIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZS4uLgotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoaW50LCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhpbmRleCwgQXJyYXlzLmFzTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKGludCwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvTGlzdF8oaW5kZXgsIHRoaXMuY29udmVydFRvTGlzdChpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdF8oaW50IGluZGV4LCBMaXN0PD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuYWRkQWxsKGluZGV4LCBpdGVtcykpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyAgJ2l0ZW1zJyBzaG91bGQgbm90IGJlIGVtcHR5LCBzbyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChpbnQsIENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KGludCBpbmRleCwgSXRlcmFibGU8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChpbmRleCwgaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKGludCwgQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gYWRkSXRlbXNUb0xpc3QoaW50IGluZGV4LCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCUFycmF5TGlzdDxFPiBhZGRlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlbXMpOwotCQlpZiAobGlzdC5hZGRBbGwoaW5kZXgsIGFkZGVkSXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyAgJ2l0ZW1zJyBzaG91bGQgbm90IGJlIGVtcHR5LCBzbyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5sZW5ndGggIT0gMCkKLQkJCQkmJiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhBcnJheXMuYXNMaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGl0ZW1zIHRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNhZGRBbGwoaW50LCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgdGhpcy5hZGRJdGVtc1RvTGlzdF8odGhpcy5jb252ZXJ0VG9MaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCA8RT4gTGlzdDw/IGV4dGVuZHMgRT4gY29udmVydFRvTGlzdChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3Q8Pz4pID8gKExpc3Q8PyBleHRlbmRzIEU+KSBjb2xsZWN0aW9uIDogbmV3IEFycmF5TGlzdDxFPihjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdF8oTGlzdDw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWludCBpbmRleCA9IGxpc3Quc2l6ZSgpOwotCQlpZiAobGlzdC5hZGRBbGwoaXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbXMpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOyAgLy8gICdpdGVtcycgc2hvdWxkIG5vdCBiZSBlbXB0eSwgc28gd2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLi4uCi0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgaXRlbXMgdG8gdGhlIGVuZCBvZiB0byB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I2FkZEFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBhZGRJdGVtc1RvTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBpdGVtcyB0byB0aGUgZW5kIG9mIHRvIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjYWRkQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0KEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKCAhIGl0ZW1zLmhhc05leHQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBib29sZWFuIGFkZEl0ZW1zVG9MaXN0XyhJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlbXMsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCUFycmF5TGlzdDxFPiBhZGRlZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoaXRlbXMpOwotCQlpbnQgaW5kZXggPSBsaXN0LnNpemUoKTsKLQkJaWYgKGxpc3QuYWRkQWxsKGFkZGVkSXRlbXMpKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGxpc3ROYW1lLCBpbmRleCwgYWRkZWRJdGVtcyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7ICAvLyAgJ2l0ZW1zJyBzaG91bGQgbm90IGJlIGVtcHR5LCBzbyB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUuLi4KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgaXRlbS4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlKGludCkKLQkgKi8KLQlwdWJsaWMgPEU+IEUgcmVtb3ZlSXRlbUZyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSBpdGVtID0gbGlzdC5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIGl0ZW0pOwotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZW1vdmUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1Gcm9tTGlzdChPYmplY3QgaXRlbSwgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaW50IGluZGV4ID0gbGlzdC5pbmRleE9mKGl0ZW0pOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlsaXN0LnJlbW92ZShpbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgaXRlbSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGluZGV4IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLQkgKiBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW1zLgotCSAqIEBzZWUgTGlzdCNyZW1vdmUoaW50KQotCSAqLwotCXB1YmxpYyA8RT4gTGlzdDxFPiByZW1vdmVJdGVtc0Zyb21MaXN0KGludCBpbmRleCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlUmFuZ2VGcm9tTGlzdChpbmRleCwgbGlzdC5zaXplKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW1zLgotCSAqIEBzZWUgTGlzdCNyZW1vdmUoaW50KQotCSAqLwotCXB1YmxpYyA8RT4gTGlzdDxFPiByZW1vdmVJdGVtc0Zyb21MaXN0KGludCBpbmRleCwgaW50IGxlbmd0aCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlUmFuZ2VGcm9tTGlzdChpbmRleCwgaW5kZXggKyBsZW5ndGgsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuIFRoZSBiZWdpbiBpbmRleAotCSAqIGlzIGluY2x1c2l2ZSwgd2hpbGUgdGhlIGVuZCBpbmRleCBpcyBleGNsdXNpdmUuCi0JICogUmV0dXJuIHRoZSByZW1vdmVkIGl0ZW1zLgotCSAqIEBzZWUgTGlzdCNyZW1vdmUoaW50KQotCSAqIEBzZWUgTGlzdCNzdWJMaXN0KGludCwgaW50KQotCSAqLwotCXB1YmxpYyA8RT4gTGlzdDxFPiByZW1vdmVSYW5nZUZyb21MaXN0KGludCBiZWdpbkluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChiZWdpbkluZGV4ID09IGVuZEluZGV4KSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmVtb3ZlUmFuZ2VGcm9tTGlzdF8oYmVnaW5JbmRleCwgZW5kSW5kZXgsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVjawotCSAqLwotCXByb3RlY3RlZCA8RT4gTGlzdDxFPiByZW1vdmVSYW5nZUZyb21MaXN0XyhpbnQgYmVnaW5JbmRleCwgaW50IGVuZEluZGV4LCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlMaXN0PEU+IHN1Ykxpc3QgPSBsaXN0LnN1Ykxpc3QoYmVnaW5JbmRleCwgZW5kSW5kZXgpOwotCQlMaXN0PEU+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCXN1Ykxpc3QuY2xlYXIoKTsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBiZWdpbkluZGV4LCByZW1vdmVkSXRlbXMpOwotCQlyZXR1cm4gcmVtb3ZlZEl0ZW1zOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KE9iamVjdFtdIGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKGl0ZW1zLmxlbmd0aCAhPSAwKQotCQkJCSYmICggISBsaXN0LmlzRW1wdHkoKSkKLQkJCQkmJiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3RfKG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4oaXRlbXMpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JlbW92ZUFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUl0ZW1zRnJvbUxpc3QoQ29sbGVjdGlvbjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuICggISBpdGVtcy5pc0VtcHR5KCkpCi0JCQkJJiYgKCAhIGxpc3QuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdF8oaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGl0ZW1zIGZyb20gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZW1vdmVBbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0KEl0ZXJhYmxlPD8+IGl0ZW1zLCBMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGl0ZW1zLml0ZXJhdG9yKCksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpdGVtcyBmcm9tIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmVtb3ZlQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSXRlbXNGcm9tTGlzdChJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIChpdGVtcy5oYXNOZXh0KCkpCi0JCQkJJiYgKCAhIGxpc3QuaXNFbXB0eSgpKQotCQkJCSYmIHRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdF8oaXRlbXMsIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBubyBlbXB0eSBjaGVja3MKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVJdGVtc0Zyb21MaXN0XyhJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCWNoYW5nZWQgfD0gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaXRlbXMubmV4dCgpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChPYmplY3RbXSBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckxpc3RfKGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdF8obmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0PihpdGVtcyksIGxpc3QsIGxpc3ROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRhaW4gdGhlIHNwZWNpZmllZCBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQocykgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICogQHNlZSBMaXN0I3JldGFpbkFsbChDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0KENvbGxlY3Rpb248Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChpdGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdF8obGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0XyhpdGVtcy5pdGVyYXRvcigpLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0YWluIHRoZSBzcGVjaWZpZWQgaXRlbXMgaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50KHMpIGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqIEBzZWUgTGlzdCNyZXRhaW5BbGwoQ29sbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5JdGVtc0luTGlzdChJdGVyYWJsZTw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkxpc3QoaXRlbXMuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldGFpbiB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudChzKSBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjcmV0YWluQWxsKENvbGxlY3Rpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmV0YWluSXRlbXNJbkxpc3QoSXRlcmF0b3I8Pz4gaXRlbXMsIExpc3Q8Pz4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChsaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISBpdGVtcy5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiB0aGlzLmNsZWFyTGlzdF8obGlzdCwgbGlzdE5hbWUpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5MaXN0XyhpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldGFpbkl0ZW1zSW5MaXN0XyhJdGVyYXRvcjw/PiBpdGVtcywgTGlzdDw/PiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJSGFzaEJhZzw/PiByZXRhaW5lZEl0ZW1zID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlbXMpOwotCQlIYXNoQmFnPD8+IHJlbW92ZWRJdGVtcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGxpc3QpOwotCQlyZW1vdmVkSXRlbXMucmVtb3ZlQWxsKHJldGFpbmVkSXRlbXMpOwotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHJlbW92ZWRJdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGl0ZW0gaW4gdGhlIHNwZWNpZmllZCBib3VuZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50IGlmIG5lY2Vzc2FyeS4KLQkgKiBSZXR1cm4gdGhlIHJlcGxhY2VkIGl0ZW0uCi0JICogQHNlZSBMaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IEUgc2V0SXRlbUluTGlzdChpbnQgaW5kZXgsIEUgaXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJRSBvbGRJdGVtID0gbGlzdC5zZXQoaW5kZXgsIGl0ZW0pOwotCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBpdGVtLCBvbGRJdGVtKTsKLQkJcmV0dXJuIG9sZEl0ZW07Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGUgc3BlY2lmaWVkIGl0ZW0KLQkgKiBpbiB0aGUgc3BlY2lmaWVkIGJvdW5kIGxpc3QKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgbmVjZXNzYXJ5LgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHJlcGxhY2VkIGl0ZW0uCi0JICogUmV0dXJuIC0xIGlmIHRoZSBpdGVtIHdhcyBub3QgZm91bmQgaW4gdGhlIGxpc3QuCi0JICogQHNlZSBMaXN0I3NldChpbnQsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgPEU+IGludCByZXBsYWNlSXRlbUluTGlzdChFIG9sZEl0ZW0sIEUgbmV3SXRlbSwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGxpc3QuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQotCQlpbnQgaW5kZXggPSBsaXN0LmluZGV4T2Yob2xkSXRlbSk7Ci0JCWlmICgoaW5kZXggIT0gLTEpICYmIHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG9sZEl0ZW0sIG5ld0l0ZW0pKSB7Ci0JCQlsaXN0LnNldChpbmRleCwgbmV3SXRlbSk7Ci0JCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpbmRleCwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCX0KLQkJcmV0dXJuIGluZGV4OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtcy4KLQkgKiBAc2VlIExpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdChpbnQgaW5kZXgsIEVbXSBpdGVtcywgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2V0SXRlbXNJbkxpc3RfKGluZGV4LCBBcnJheXMuYXNMaXN0KGl0ZW1zKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgYm91bmQgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHRoZSByZXBsYWNlZCBpdGVtcy4KLQkgKiBAc2VlIExpc3Qjc2V0KGludCwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyA8RT4gTGlzdDxFPiBzZXRJdGVtc0luTGlzdChpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlpZiAoaXRlbXMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2V0SXRlbXNJbkxpc3RfKGluZGV4LCBpdGVtcywgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIDxFPiBMaXN0PEU+IHNldEl0ZW1zSW5MaXN0XyhpbnQgaW5kZXgsIExpc3Q8PyBleHRlbmRzIEU+IGl0ZW1zLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlMaXN0PEU+IHN1Ykxpc3QgPSBsaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgaXRlbXMuc2l6ZSgpKTsKLQkJTGlzdDxFPiBvbGRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oc3ViTGlzdCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLQkJCUUgbmV3SXRlbSA9IGl0ZW1zLmdldChpKTsKLQkJCUUgb2xkSXRlbSA9IHN1Ykxpc3Quc2V0KGksIG5ld0l0ZW0pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKGxpc3ROYW1lLCBpbmRleCArIGksIG5ld0l0ZW0sIG9sZEl0ZW0pOwotCQl9Ci0JCXJldHVybiBvbGRJdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZQotCSAqIHNwZWNpZmllZCB0YXJnZXQgaW5kZXggZm9yIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIG1vdmVJdGVtc0luTGlzdChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJaWYgKCh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgfHwgKGxlbmd0aCA9PSAwKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIGl0J3MgdW5saWtlbHkgYnV0IHBvc3NpYmxlIHRoZSBsaXN0IGlzIHVuY2hhbmdlZCBieSB0aGUgbW92ZS4uLiAoZS5nLiBhbnkgbW92ZXMgd2l0aGluIFsiZm9vIiwgImZvbyIsICJmb28iXS4uLikKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBsZW5ndGgpOwotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBpdGVtIGluIHRoZSBzcGVjaWZpZWQgbGlzdCB0byB0aGUKLQkgKiBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIG1vdmVJdGVtSW5MaXN0KGludCB0YXJnZXRJbmRleCwgRSBpdGVtLCBMaXN0PEU+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgbGlzdC5pbmRleE9mKGl0ZW0pLCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogTW92ZSBhbiBpdGVtIGluIHRoZSBzcGVjaWZpZWQgbGlzdCBmcm9tIHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IHRvIHRoZQotCSAqIHNwZWNpZmllZCB0YXJnZXQgaW5kZXguCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgPEU+IGJvb2xlYW4gbW92ZUl0ZW1Jbkxpc3QoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICh0YXJnZXRJbmRleCA9PSBzb3VyY2VJbmRleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGxpc3QuZ2V0KHRhcmdldEluZGV4KSwgbGlzdC5nZXQoc291cmNlSW5kZXgpKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZmlyZUl0ZW1Nb3ZlZF8obGlzdE5hbWUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBlbnRpcmUgbGlzdAotCSAqIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBldmVudCBpZiBuZWNlc3NhcnkuCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGxpc3QgY2hhbmdlZC4KLQkgKiBAc2VlIExpc3QjY2xlYXIoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNsZWFyTGlzdChMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlyZXR1cm4gKCAhIGxpc3QuaXNFbXB0eSgpKSAmJiB0aGlzLmNsZWFyTGlzdF8obGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xlYXJMaXN0XyhMaXN0PD8+IGxpc3QsIFN0cmluZyBsaXN0TmFtZSkgewotCQlsaXN0LmNsZWFyKCk7Ci0JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKGxpc3ROYW1lKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBsaXN0LAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHNldHMsIHJlbW92ZXMsIGFuZC9vciBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChMaXN0PEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmIChuZXdMaXN0LmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0KGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhuZXdMaXN0LCBsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVMaXN0XyhuZXdMaXN0LCBsaXN0LCBsaXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5ldyBsaXN0LAotCSAqIG1ha2luZyBhIG1pbmltdW0gbnVtYmVyIG9mIHNldHMsIHJlbW92ZXMsIGFuZC9vciBhZGRzLgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGNoYW5nZWQuCi0JICovCi0JcHVibGljIDxFPiBib29sZWFuIHN5bmNocm9uaXplTGlzdChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbmV3TGlzdCwgTGlzdDxFPiBsaXN0LCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVMaXN0KG5ld0xpc3QuaXRlcmF0b3IoKSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBuZXcgbGlzdCwKLQkgKiBtYWtpbmcgYSBtaW5pbXVtIG51bWJlciBvZiBzZXRzLCByZW1vdmVzLCBhbmQvb3IgYWRkcy4KLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbGlzdCBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3QoSXRlcmF0b3I8PyBleHRlbmRzIEU+IG5ld0xpc3QsIExpc3Q8RT4gbGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWlmICggISBuZXdMaXN0Lmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRoaXMuY2xlYXJMaXN0KGxpc3QsIGxpc3ROYW1lKTsKLQkJfQotCQlpZiAobGlzdC5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0XyhuZXdMaXN0LCBsaXN0LCBsaXN0TmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc3luY2hyb25pemVMaXN0XyhDb2xsZWN0aW9uVG9vbHMubGlzdChuZXdMaXN0KSwgbGlzdCwgbGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIG5vIGVtcHR5IGNoZWNrcwotCSAqLwotCXByb3RlY3RlZCA8RT4gYm9vbGVhbiBzeW5jaHJvbml6ZUxpc3RfKExpc3Q8PyBleHRlbmRzIEU+IG5ld0xpc3QsIExpc3Q8RT4gb2xkTGlzdCwgU3RyaW5nIGxpc3ROYW1lKSB7Ci0JCWludCBuZXdTaXplID0gbmV3TGlzdC5zaXplKCk7Ci0JCWludCBvbGRTaXplID0gb2xkTGlzdC5zaXplKCk7Ci0KLQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCS8vIFRPRE8gY2hlY2sgZm9yIFJhbmRvbUFjY2VzcwotCQlpbnQgbWluID0gTWF0aC5taW4obmV3U2l6ZSwgb2xkU2l6ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluOyBpKyspIHsKLQkJCUUgbmV3SXRlbSA9IG5ld0xpc3QuZ2V0KGkpOwotCQkJRSBvbGRJdGVtID0gb2xkTGlzdC5zZXQoaSwgbmV3SXRlbSk7Ci0JCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQobmV3SXRlbSwgb2xkSXRlbSkpIHsKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVwbGFjZWRfKGxpc3ROYW1lLCBpLCBuZXdJdGVtLCBvbGRJdGVtKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdTaXplID09IG9sZFNpemUpIHsKLQkJCXJldHVybiBjaGFuZ2VkOwotCQl9Ci0KLQkJaWYgKG5ld1NpemUgPCBvbGRTaXplKSB7Ci0JCQl0aGlzLnJlbW92ZVJhbmdlRnJvbUxpc3RfKG5ld1NpemUsIG9sZFNpemUsIG9sZExpc3QsIGxpc3ROYW1lKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gbmV3U2l6ZSA+IG9sZFNpemUKLQkJdGhpcy5hZGRJdGVtc1RvTGlzdF8obmV3TGlzdC5zdWJMaXN0KG9sZFNpemUsIG5ld1NpemUpLCBvbGRMaXN0LCBsaXN0TmFtZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmVlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNoYW5nZUxpc3RlbmVyPiBUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUyA9IFRyZWVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQotCS8qKgotCSAqIEFkZCBhIHRyZWUgY2hhbmdlIGxpc3RlbmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyZWUuIFRoZSBsaXN0ZW5lcgotCSAqIHdpbGwgYmUgbm90aWZpZWQgb25seSBmb3IgY2hhbmdlcyB0byB0aGUgc3BlY2lmaWVkIHRyZWUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuYWRkTGlzdGVuZXIoVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBmb3IgYSBzcGVjaWZpYyB0cmVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgdHJlZU5hbWUsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnJlbW92ZUxpc3RlbmVyKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdHJlZSBjaGFuZ2UgbGlzdGVuZXJzIHRoYXQgd2lsbAotCSAqIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHNwZWNpZmllZCB0cmVlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgdHJlZU5hbWUpOwotCX0KLQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PFRyZWVDaGFuZ2VMaXN0ZW5lcj4gZ2V0VHJlZUNoYW5nZUxpc3RlbmVyTGlzdChTdHJpbmcgdHJlZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGdldFRyZWVDaGFuZ2VMaXN0ZW5lcnMoU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCUxpc3RlbmVyTGlzdDxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVyTGlzdCh0cmVlTmFtZSk7Ci0JCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJY2hhbmdlTGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotLy8JCXRoaXMuZmlyZU5vZGVBZGRlZChuZXcgVHJlZUFkZEV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCkpOwotCQlUcmVlQWRkRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUFkZEV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQWRkRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBwYXRoKTsKLQkJCQkJfQotCQkJCQljaGFuZ2VMaXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcG9ydCBhIGJvdW5kIHRyZWUgdXBkYXRlIHRvIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlTm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0vLwkJdGhpcy5maXJlTm9kZVJlbW92ZWQobmV3IFRyZWVSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpKTsKLQotCQlUcmVlUmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZVJlbW92ZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgcGF0aCk7Ci0JCQkJCX0KLQkJCQkJbGlzdGVuZXIubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUl0ZXJhYmxlPENoYW5nZUxpc3RlbmVyPiBjaGFuZ2VMaXN0ZW5lcnMgPSB0aGlzLmdldENoYW5nZUxpc3RlbmVycygpOwotCQlpZiAoY2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWZvciAoQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgOiBjaGFuZ2VMaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNDaGFuZ2VMaXN0ZW5lcihjaGFuZ2VMaXN0ZW5lcikpIHsgIC8vIHZlcmlmeSBsaXN0ZW5lciBpcyBzdGlsbCBsaXN0ZW5pbmcKLQkJCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJCWV2ZW50ID0gbmV3IFRyZWVSZW1vdmVFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUsIHBhdGgpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyB0cmVlTmFtZSA9IGV2ZW50LmdldFRyZWVOYW1lKCk7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWNoYW5nZUxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotLy8JCXRoaXMuZmlyZVRyZWVDbGVhcmVkKG5ldyBUcmVlQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUpKTsKLQotCQlUcmVlQ2xlYXJFdmVudCBldmVudCA9IG51bGw7Ci0JCUl0ZXJhYmxlPFRyZWVDaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJzID0gdGhpcy5nZXRUcmVlQ2hhbmdlTGlzdGVuZXJzKHRyZWVOYW1lKTsKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc1RyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgbGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2xlYXJFdmVudCh0aGlzLnNvdXJjZSwgdHJlZU5hbWUpOwotCQkJCQl9Ci0JCQkJCWNoYW5nZUxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYSBib3VuZCB0cmVlIHVwZGF0ZSB0byBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgdHJlZU5hbWUgPSBldmVudC5nZXRUcmVlTmFtZSgpOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlsaXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSXRlcmFibGU8Q2hhbmdlTGlzdGVuZXI+IGNoYW5nZUxpc3RlbmVycyA9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCk7Ci0JCWlmIChjaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lciA6IGNoYW5nZUxpc3RlbmVycykgewotCQkJCWlmICh0aGlzLmhhc0NoYW5nZUxpc3RlbmVyKGNoYW5nZUxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQljaGFuZ2VMaXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwb3J0IGEgYm91bmQgdHJlZSB1cGRhdGUgdG8gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLgotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUcmVlQ2hhbmdlZChTdHJpbmcgdHJlZU5hbWUsIENvbGxlY3Rpb248Pz4gbm9kZXMpIHsKLS8vCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgbm9kZXMpKTsKLQotCQlUcmVlQ2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlJdGVyYWJsZTxUcmVlQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0VHJlZUNoYW5nZUxpc3RlbmVycyh0cmVlTmFtZSk7Ci0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJZm9yIChUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgOiBsaXN0ZW5lcnMpIHsKLQkJCQlpZiAodGhpcy5oYXNUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIGxpc3RlbmVyKSkgeyAgLy8gdmVyaWZ5IGxpc3RlbmVyIGlzIHN0aWxsIGxpc3RlbmluZwotCQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQkJZXZlbnQgPSBuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMuc291cmNlLCB0cmVlTmFtZSwgbm9kZXMpOwotCQkJCQl9Ci0JCQkJCWxpc3RlbmVyLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJdGVyYWJsZTxDaGFuZ2VMaXN0ZW5lcj4gY2hhbmdlTGlzdGVuZXJzID0gdGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJaWYgKGNoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyIDogY2hhbmdlTGlzdGVuZXJzKSB7Ci0JCQkJaWYgKHRoaXMuaGFzQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpKSB7ICAvLyB2ZXJpZnkgbGlzdGVuZXIgaXMgc3RpbGwgbGlzdGVuaW5nCi0JCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQlldmVudCA9IG5ldyBUcmVlQ2hhbmdlRXZlbnQodGhpcy5zb3VyY2UsIHRyZWVOYW1lLCBub2Rlcyk7Ci0JCQkJCX0KLQkJCQkJY2hhbmdlTGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY2hlY2tpbmcgd2hldGhlciBhbiBhdHRyaWJ1dGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICogQHNlZSBUb29scyN2YWx1ZXNBcmVFcXVhbChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZXNBcmVFcXVhbChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh2YWx1ZTEsIHZhbHVlMik7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjaGVja2luZyB3aGV0aGVyIGFuIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgY2hhbmdlZC4KLQkgKiBAc2VlIFRvb2xzI3ZhbHVlc0FyZURpZmZlcmVudChPYmplY3QsIE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZXNBcmVEaWZmZXJlbnQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHZhbHVlMSwgdmFsdWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbGxlY3Rpb25Ub29scyNlbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlLCBJdGVyYWJsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb2xsZWN0aW9uVG9vbHMjZWxlbWVudHNBcmVEaWZmZXJlbnQoSXRlcmFibGUsIEl0ZXJhYmxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVsZW1lbnRzQXJlRGlmZmVyZW50KEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVEaWZmZXJlbnQoaXRlcmFibGUxLCBpdGVyYWJsZTIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc291cmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFpciBhIHBvc3NpYmx5IDxjb2RlPm51bGw8L2NvZGU+IGFzcGVjdCBuYW1lIHdpdGggaXRzIGFzc29jaWF0ZWQKLQkgKiBsaXN0ZW5lcnMuCi0JICovCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+Ci0JCWltcGxlbWVudHMgU2VyaWFsaXphYmxlCi0JewotCQlmaW5hbCBMaXN0ZW5lckxpc3Q8TD4gbGlzdGVuZXJMaXN0OwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUFzcGVjdExpc3RlbmVyTGlzdFBhaXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMPihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlib29sZWFuIG1hdGNoZXMoQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyVHlwZSgpID09IGxpc3RlbmVyQ2xhc3M7Ci0JCX0KLQotCQlib29sZWFuIG1hdGNoZXMoQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLm1hdGNoZXMobGlzdGVuZXJDbGFzcywgbnVsbCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0QXNwZWN0TmFtZSgpKTsKLQkJfQotCi0JCWFic3RyYWN0IFN0cmluZyBnZXRBc3BlY3ROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUGFpciBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiBhc3BlY3QgbmFtZSB3aXRoIGl0cyBhc3NvY2lhdGVkIGxpc3RlbmVycy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgU2ltcGxlQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4KLQkJZXh0ZW5kcyBBc3BlY3RMaXN0ZW5lckxpc3RQYWlyPEw+Ci0JewotCQlmaW5hbCBTdHJpbmcgYXNwZWN0TmFtZTsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlTaW1wbGVBc3BlY3RMaXN0ZW5lckxpc3RQYWlyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBMIGxpc3RlbmVyKSB7Ci0JCQlzdXBlcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JCQlpZiAoYXNwZWN0TmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmFzcGVjdE5hbWUgPSBhc3BlY3ROYW1lOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWJvb2xlYW4gbWF0Y2hlcyhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgQFN1cHByZXNzV2FybmluZ3MoImhpZGluZyIpIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5hc3BlY3ROYW1lLmVxdWFscyhhc3BlY3ROYW1lKQotCQkJCQkmJiBzdXBlci5tYXRjaGVzKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCVN0cmluZyBnZXRBc3BlY3ROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuYXNwZWN0TmFtZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFBhaXIgYSA8Y29kZT5udWxsPC9jb2RlPiBhc3BlY3QgbmFtZSB3aXRoIGl0cyBhc3NvY2lhdGVkIGxpc3RlbmVycy4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTnVsbEFzcGVjdExpc3RlbmVyTGlzdFBhaXI8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+Ci0JCWV4dGVuZHMgQXNwZWN0TGlzdGVuZXJMaXN0UGFpcjxMPgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJTnVsbEFzcGVjdExpc3RlbmVyTGlzdFBhaXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQkJc3VwZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWJvb2xlYW4gbWF0Y2hlcyhDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCXJldHVybiAoYXNwZWN0TmFtZSA9PSBudWxsKQotCQkJCQkmJiBzdXBlci5tYXRjaGVzKGxpc3RlbmVyQ2xhc3MsIG51bGwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCVN0cmluZyBnZXRBc3BlY3ROYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NjQxZDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjaGFuZ2Ugc3VwcG9ydCBjbGFzcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiB0aGUgc3RhbmRhcmQKLSAqIGNoYW5nZSBzdXBwb3J0IGluIHNldmVyYWwgd2F5czo8dWw+Ci0gKiA8bGk+QWxsIGV2ZW50cyBmaXJlZCBieSB0aGUgc291cmNlIG11c3Qgc3BlY2lmeSB0aGUgc2luZ2xlIGFzcGVjdC4KLSAqIDxsaT5MaXN0ZW5lcnMgYXJlIHJlcXVpcmVkIHRvIGJlIGVpdGhlciAiZ2VuZXJhbCBwdXJwb3NlIiBsaXN0ZW5lcnMgb3IKLSAqIAkgICAgbGlzdGVuZXJzIG9mIHRoZSBzaW5nbGUgYXNwZWN0LgotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQKLQlleHRlbmRzIENoYW5nZVN1cHBvcnQKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZhbGlkTGlzdGVuZXJDbGFzczsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHZhbGlkQXNwZWN0TmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KE1vZGVsIHNvdXJjZSwgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZhbGlkTGlzdGVuZXJDbGFzcywgU3RyaW5nIHZhbGlkQXNwZWN0TmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAoICEgdmFsaWRMaXN0ZW5lckNsYXNzLmlzQXNzaWduYWJsZUZyb20odGhpcy5nZXRDaGFuZ2VMaXN0ZW5lckNsYXNzKCkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2hhbmdlIHN1cHBvcnQncyBjaGFuZ2UgbGlzdGVuZXIgY2xhc3MgKCIgKyB0aGlzLmdldENoYW5nZUxpc3RlbmVyQ2xhc3MoKS5nZXROYW1lKCkgKyAvLyROT04tTkxTLTEkCi0JCQkJCSIpIGRvZXMgbm90IGV4dGVuZCB0aGUgdmFsaWQgbGlzdGVuZXIgY2xhc3M6ICIgKyB2YWxpZExpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMudmFsaWRMaXN0ZW5lckNsYXNzID0gdmFsaWRMaXN0ZW5lckNsYXNzOwotCQl0aGlzLnZhbGlkQXNwZWN0TmFtZSA9IHZhbGlkQXNwZWN0TmFtZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBidWlsZFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotCQkJCSJUaGlzIE1vZGVsIHN1cHBvcnRzIG9ubHkgY2hhbmdlcyBmb3IgdGhlIGxpc3RlbmVyIHR5cGUgXCIiICsgdGhpcy52YWxpZExpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkrICJcIiBhbmQgdGhlIGFzcGVjdCBcIiIgKyB0aGlzLnZhbGlkQXNwZWN0TmFtZSArICciJyAvLyROT04tTkxTLTEkCi0JCQkpOwotCX0KLQotCS8qKgotCSAqIFRoZSBsaXN0ZW5lciBjYW4gYmUgZWl0aGVyIGFuIGluc3RhbmNlIG9mIHRoZSB2YWxpZCBsaXN0ZW5lciBjbGFzcyBvcgotCSAqIHRoZSAiZ2VuZXJhbC1wdXJwb3NlIiBjaGFuZ2UgbGlzdGVuZXIgY2xhc3MgKHdoaWNoIHNob3VsZCBleHRlbmQgdGhlCi0JICogdGhlIHZhbGlkIGxpc3RlbmVyIGNsYXNzKS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2soQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyQ2xhc3MpIHsKLQkJaWYgKChsaXN0ZW5lckNsYXNzICE9IHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJDbGFzcygpKSAmJiAobGlzdGVuZXJDbGFzcyAhPSB0aGlzLnZhbGlkTGlzdGVuZXJDbGFzcykpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0JCQkJCSJUaGlzIE1vZGVsIHN1cHBvcnRzIG9ubHkgY2hhbmdlcyBmb3IgdGhlIGxpc3RlbmVyIHR5cGUgXCIiICsgdGhpcy52YWxpZExpc3RlbmVyQ2xhc3MuZ2V0TmFtZSgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXCIgOiBcIiIgKyBsaXN0ZW5lckNsYXNzLmdldE5hbWUoKSArICciJyAvLyROT04tTkxTLTEkCi0JCQkJKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlpZiAoICEgYXNwZWN0TmFtZS5lcXVhbHModGhpcy52YWxpZEFzcGVjdE5hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotCQkJCQkiVGhpcyBNb2RlbCBzdXBwb3J0cyBvbmx5IGNoYW5nZXMgZm9yIHRoZSBhc3BlY3QgXCIiICsgdGhpcy52YWxpZEFzcGVjdE5hbWUgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcIiA6IFwiIiArIGFzcGVjdE5hbWUgKyAnIicgLy8kTk9OLU5MUy0xJAotCQkJCSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxMPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSwgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpOwotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgYWRkTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgTCBsaXN0ZW5lcikgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lckNsYXNzLCBsaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIEwgbGlzdGVuZXIpIHsKLQkJdGhpcy5jaGVjayhsaXN0ZW5lckNsYXNzLCBhc3BlY3ROYW1lKTsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPEwgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIEwgbGlzdGVuZXIpIHsKLQkJdGhpcy5jaGVjayhsaXN0ZW5lckNsYXNzKTsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCA8TCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKENsYXNzPEw+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXRoaXMuY2hlY2sobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5oYXNBbnlMaXN0ZW5lcnMobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIDxMIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoQ2xhc3M8TD4gbGlzdGVuZXJDbGFzcykgewotCQl0aGlzLmNoZWNrKGxpc3RlbmVyQ2xhc3MpOwotCQlyZXR1cm4gc3VwZXIuaGFzQW55TGlzdGVuZXJzKGxpc3RlbmVyQ2xhc3MpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhyb3cgdGhpcy5idWlsZFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVN0YXRlQ2hhbmdlZCgpIHsKLQkJdGhyb3cgdGhpcy5idWlsZFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlyZXR1cm4gc3VwZXIuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZVByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmNoZWNrKFBST1BFUlRZX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVQcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVQcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgaW50IG9sZFZhbHVlLCBpbnQgbmV3VmFsdWUpIHsKLQkJdGhpcy5jaGVjayhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlUHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gb2xkVmFsdWUsIGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJdGhpcy5jaGVjayhQUk9QRVJUWV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlUHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhDT0xMRUNUSU9OX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgY29sbGVjdGlvbk5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zQWRkZWQoY29sbGVjdGlvbk5hbWUsIGFkZGVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtQWRkZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1BZGRlZChjb2xsZWN0aW9uTmFtZSwgYWRkZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlbW92ZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNSZW1vdmVkKGNvbGxlY3Rpb25OYW1lLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVJdGVtUmVtb3ZlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChjb2xsZWN0aW9uTmFtZSwgcmVtb3ZlZEl0ZW0pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNsZWFyZWQoU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGNvbGxlY3Rpb25OYW1lKTsKLQkJc3VwZXIuZmlyZUNvbGxlY3Rpb25DbGVhcmVkKGNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soQ09MTEVDVElPTl9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlzdXBlci5maXJlQ29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVDb2xsZWN0aW9uQ2hhbmdlZChTdHJpbmcgY29sbGVjdGlvbk5hbWUsIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgewotCQl0aGlzLmNoZWNrKENPTExFQ1RJT05fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXN1cGVyLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc0FkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IGFkZGVkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zQWRkZWQobGlzdE5hbWUsIGluZGV4LCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbUFkZGVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3QgYWRkZWRJdGVtKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUl0ZW1BZGRlZChsaXN0TmFtZSwgaW5kZXgsIGFkZGVkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZW1vdmVkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IHJlbW92ZWRJdGVtcykgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXJldHVybiBzdXBlci5maXJlSXRlbXNSZW1vdmVkKGxpc3ROYW1lLCBpbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlSXRlbVJlbW92ZWQoU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIE9iamVjdCByZW1vdmVkSXRlbSkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBsaXN0TmFtZSk7Ci0JCXN1cGVyLmZpcmVJdGVtUmVtb3ZlZChsaXN0TmFtZSwgaW5kZXgsIHJlbW92ZWRJdGVtKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGZpcmVJdGVtc1JlcGxhY2VkKFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IHJlcGxhY2VkSXRlbXMpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1zUmVwbGFjZWQobGlzdE5hbWUsIGluZGV4LCBuZXdJdGVtcywgcmVwbGFjZWRJdGVtcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1SZXBsYWNlZChTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCByZXBsYWNlZEl0ZW0pIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlyZXR1cm4gc3VwZXIuZmlyZUl0ZW1SZXBsYWNlZChsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW0sIHJlcGxhY2VkSXRlbSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZmlyZUl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKExJU1RfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc01vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBmaXJlSXRlbXNNb3ZlZChTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJcmV0dXJuIHN1cGVyLmZpcmVJdGVtc01vdmVkKGxpc3ROYW1lLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2xlYXJlZChTdHJpbmcgbGlzdE5hbWUpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdE5hbWUpOwotCQlzdXBlci5maXJlTGlzdENsZWFyZWQobGlzdE5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhMSVNUX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVMaXN0Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZUxpc3RDaGFuZ2VkKFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXRoaXMuY2hlY2soTElTVF9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIGxpc3ROYW1lKTsKLQkJc3VwZXIuZmlyZUxpc3RDaGFuZ2VkKGxpc3ROYW1lLCBsaXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlTm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZU5vZGVBZGRlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVBZGRlZChTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVOb2RlQWRkZWQodHJlZU5hbWUsIHBhdGgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpcmVOb2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVOb2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZU5vZGVSZW1vdmVkKFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZU5vZGVSZW1vdmVkKHRyZWVOYW1lLCBwYXRoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jaGVjayhUUkVFX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgZXZlbnQuZ2V0VHJlZU5hbWUoKSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2xlYXJlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDbGVhcmVkKFN0cmluZyB0cmVlTmFtZSkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCB0cmVlTmFtZSk7Ci0JCXN1cGVyLmZpcmVUcmVlQ2xlYXJlZCh0cmVlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlyZVRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmNoZWNrKFRSRUVfQ0hBTkdFX0xJU1RFTkVSX0NMQVNTLCBldmVudC5nZXRUcmVlTmFtZSgpKTsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBmaXJlVHJlZUNoYW5nZWQoU3RyaW5nIHRyZWVOYW1lLCBDb2xsZWN0aW9uPD8+IG5vZGVzKSB7Ci0JCXRoaXMuY2hlY2soVFJFRV9DSEFOR0VfTElTVEVORVJfQ0xBU1MsIHRyZWVOYW1lKTsKLQkJc3VwZXIuZmlyZVRyZWVDaGFuZ2VkKHRyZWVOYW1lLCBub2Rlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMTZlYTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQotCXB1YmxpYyBBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkU3RhdGVDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2xlYXJlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc01vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubm9kZUFkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnRyZWVDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuc3RhdGVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFByb3BlcnR5Q2hhbmdlZFJ1bm5hYmxlKGZpbmFsIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlbW92ZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShmaW5hbCBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBhZGRlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc01vdmVkUnVubmFibGUoZmluYWwgTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zTW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIG1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlcGxhY2VkUnVubmFibGUoZmluYWwgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVwbGFjZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIHJlcGxhY2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRMaXN0Q2xlYXJlZFJ1bm5hYmxlKGZpbmFsIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5saXN0Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlQWRkZWRSdW5uYWJsZShmaW5hbCBUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgYWRkZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE5vZGVSZW1vdmVkUnVubmFibGUoZmluYWwgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIm5vZGUgcmVtb3ZlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVHJlZUNsZWFyZWRSdW5uYWJsZShmaW5hbCBUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNsZWFyZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMudHJlZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyZWUgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBzdGF0ZUNoYW5nZWRfKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5zdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgcHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWRfKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNNb3ZlZF8oTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zTW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZXBsYWNlZF8oTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENsZWFyZWRfKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubGlzdENsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbGlzdENoYW5nZWRfKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIG5vZGVBZGRlZF8oVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIubm9kZUFkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIG5vZGVSZW1vdmVkXyhUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5ub2RlUmVtb3ZlZChldmVudCk7Ci0JfQotCi0Jdm9pZCB0cmVlQ2xlYXJlZF8oVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2xlYXJlZChldmVudCk7Ci0JfQotCi0Jdm9pZCB0cmVlQ2hhbmdlZF8oVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIudHJlZUNoYW5nZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQVdUKCIgKyB0aGlzLmxpc3RlbmVyLnRvU3RyaW5nKCkgKyAnKSc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGFmNTJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIEFXVAotICogZXZlbnQgcXVldWUsIGFzeW5jaHJvbm91c2x5IGlmIG5lY2Vzc2FyeS4gSWYgdGhlIGV2ZW50IGFycml2ZWQgb24gdGhlIFVJCi0gKiB0aHJlYWQgdGhhdCBpcyBwcm9iYWJseSBiZWNhdXNlIGl0IHdhcyBpbml0aWF0ZWQgYnkgYSBVSSB3aWRnZXQ7IGFzIGEKLSAqIHJlc3VsdCwgd2Ugd2FudCB0byBsb29wIGJhY2sgc3luY2hyb25vdXNseSBzbyB0aGUgZXZlbnRzIGNhbiBiZQotICogc2hvcnQtY2lyY3VpdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0KLQlwdWJsaWMgQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlcihDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zQWRkZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZENvbGxlY3Rpb25DbGVhcmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNBZGRlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc0FkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBhZGRlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZW1vdmVkUnVubmFibGUoZmluYWwgQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVtb3ZlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ29sbGVjdGlvbkNsZWFyZWRSdW5uYWJsZShmaW5hbCBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjbGVhcmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sbGVjdGlvbiBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSB7Ci0JCXJldHVybiBFdmVudFF1ZXVlLmlzRGlzcGF0Y2hUaHJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VMYXRlcihSdW5uYWJsZSl9IHNlZW1zIHRvIHdvcmsgT0s7Ci0JICogYnV0IHVzaW5nIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUFuZFdhaXQoUnVubmFibGUpfSBjYW4gc29tZXRpbWVzIG1ha2UKLQkgKiB0aGluZ3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGRlYnVnZ2luZywgYXQgdGhlIHJpc2sgb2YgZGVhZGxvY2tzLgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlT25FdmVudFF1ZXVlKFJ1bm5hYmxlIHIpIHsKLQkJRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihyKTsKLS8vCQl0cnkgewotLy8JCQlFdmVudFF1ZXVlLmludm9rZUFuZFdhaXQocik7Ci0vLwkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0gY2F0Y2ggKGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLS8vCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotLy8JCX0KLQl9Ci0KLQl2b2lkIGl0ZW1zQWRkZWRfKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgaXRlbXNSZW1vdmVkXyhDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNsZWFyZWRfKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRfKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NzdmNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIKLQlpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIoTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNBZGRlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVtb3ZlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuaXRlbXNNb3ZlZF8oZXZlbnQpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25FdmVudFF1ZXVlKHRoaXMuYnVpbGRJdGVtc01vdmVkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5pdGVtc1JlcGxhY2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZEl0ZW1zUmVwbGFjZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTGlzdENsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZExpc3RDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc0FkZGVkUnVubmFibGUoZmluYWwgTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLml0ZW1zQWRkZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW1zIGFkZGVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc1JlbW92ZWRSdW5uYWJsZShmaW5hbCBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyByZW1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRJdGVtc01vdmVkUnVubmFibGUoZmluYWwgTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5pdGVtc01vdmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtcyBtb3ZlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSXRlbXNSZXBsYWNlZFJ1bm5hYmxlKGZpbmFsIExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMuaXRlbXNSZXBsYWNlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbXMgcmVwbGFjZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZExpc3RDbGVhcmVkUnVubmFibGUoZmluYWwgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENsZWFyZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2xlYXJlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkTGlzdENoYW5nZWRSdW5uYWJsZShmaW5hbCBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubGlzdENoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkgewotCQlyZXR1cm4gRXZlbnRRdWV1ZS5pc0Rpc3BhdGNoVGhyZWFkKCk7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlTGF0ZXIoUnVubmFibGUpfSBzZWVtcyB0byB3b3JrIE9LOwotCSAqIGJ1dCB1c2luZyB7QGxpbmsgRXZlbnRRdWV1ZSNpbnZva2VBbmRXYWl0KFJ1bm5hYmxlKX0gY2FuIHNvbWV0aW1lcyBtYWtlCi0JICogdGhpbmdzIG1vcmUgcHJlZGljdGFibGUgd2hlbiBkZWJ1Z2dpbmcsIGF0IHRoZSByaXNrIG9mIGRlYWRsb2Nrcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZU9uRXZlbnRRdWV1ZShSdW5uYWJsZSByKSB7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIocik7Ci0vLwkJdHJ5IHsKLS8vCQkJRXZlbnRRdWV1ZS5pbnZva2VBbmRXYWl0KHIpOwotLy8JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9IGNhdGNoIChqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLS8vCQl9Ci0JfQotCi0Jdm9pZCBpdGVtc0FkZGVkXyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc0FkZGVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVtb3ZlZF8oTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zTW92ZWRfKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc01vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGl0ZW1zUmVwbGFjZWRfKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGxpc3RDbGVhcmVkXyhMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIGxpc3RDaGFuZ2VkXyhMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5saXN0Q2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2YmQ4Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dDsKLQotaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgcHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZSwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcgotCWltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcgotewotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCi0JcHVibGljIEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQcm9wZXJ0eUNoYW5nZWRSdW5uYWJsZShmaW5hbCBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5wcm9wZXJ0eUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlQW5kV2FpdChSdW5uYWJsZSl9IGNhbiBzb21ldGltZXMgbWFrZQotCSAqIHRoaW5ncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgcHJvcGVydHlDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWVjZjJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL2xpc3RlbmVyL2F3dC9BV1RTdGF0ZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0OwotCi1pbXBvcnQgamF2YS5hd3QuRXZlbnRRdWV1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFdyYXAgYW5vdGhlciBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGZvcndhcmQgZXZlbnRzIHRvIGl0IG9uIHRoZSBBV1QKLSAqIGV2ZW50IHF1ZXVlLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBldmVudCBhcnJpdmVkIG9uIHRoZSBVSQotICogdGhyZWFkIHRoYXQgaXMgcHJvYmFibHkgYmVjYXVzZSBpdCB3YXMgaW5pdGlhdGVkIGJ5IGEgVUkgd2lkZ2V0OyBhcyBhCi0gKiByZXN1bHQsIHdlIHdhbnQgdG8gbG9vcCBiYWNrIHN5bmNocm9ub3VzbHkgc28gdGhlIGV2ZW50cyBjYW4gYmUKLSAqIHNob3J0LWNpcmN1aXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIEFXVFN0YXRlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkU3RhdGVDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTdGF0ZUNoYW5nZWRSdW5uYWJsZShmaW5hbCBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5zdGF0ZUNoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN0YXRlIGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlQW5kV2FpdChSdW5uYWJsZSl9IGNhbiBzb21ldGltZXMgbWFrZQotCSAqIHRoaW5ncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgc3RhdGVDaGFuZ2VkXyhTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubGlzdGVuZXIuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkFXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC9saXN0ZW5lci9hd3QvQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE2MDQ2OWQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvYXd0L0FXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3Q7Ci0KLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogV3JhcCBhbm90aGVyIHRyZWUgY2hhbmdlIGxpc3RlbmVyIGFuZCBmb3J3YXJkIGV2ZW50cyB0byBpdCBvbiB0aGUgQVdUCi0gKiBldmVudCBxdWV1ZSwgYXN5bmNocm9ub3VzbHkgaWYgbmVjZXNzYXJ5LiBJZiB0aGUgZXZlbnQgYXJyaXZlZCBvbiB0aGUgVUkKLSAqIHRocmVhZCB0aGF0IGlzIHByb2JhYmx5IGJlY2F1c2UgaXQgd2FzIGluaXRpYXRlZCBieSBhIFVJIHdpZGdldDsgYXMgYQotICogcmVzdWx0LCB3ZSB3YW50IHRvIGxvb3AgYmFjayBzeW5jaHJvbm91c2x5IHNvIHRoZSBldmVudHMgY2FuIGJlCi0gKiBzaG9ydC1jaXJjdWl0ZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBUcmVlQ2hhbmdlTGlzdGVuZXIKLXsKLQlwcml2YXRlIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCXB1YmxpYyBBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyKFRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlcigpOwotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubm9kZUFkZGVkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZE5vZGVBZGRlZFJ1bm5hYmxlKGV2ZW50KSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkTm9kZVJlbW92ZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRfKGV2ZW50KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uRXZlbnRRdWV1ZSh0aGlzLmJ1aWxkVHJlZUNsZWFyZWRSdW5uYWJsZShldmVudCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnRyZWVDaGFuZ2VkXyhldmVudCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPbkV2ZW50UXVldWUodGhpcy5idWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZXZlbnQpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlQWRkZWRSdW5uYWJsZShmaW5hbCBUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlBV1RUcmVlQ2hhbmdlTGlzdGVuZXJXcmFwcGVyLnRoaXMubm9kZUFkZGVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIGFkZGVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGROb2RlUmVtb3ZlZFJ1bm5hYmxlKGZpbmFsIFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUFXVFRyZWVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIudGhpcy5ub2RlUmVtb3ZlZF8oZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibm9kZSByZW1vdmVkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRUcmVlQ2xlYXJlZFJ1bm5hYmxlKGZpbmFsIFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDbGVhcmVkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNsZWFyZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyZWVDaGFuZ2VkUnVubmFibGUoZmluYWwgVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQVdUVHJlZUNoYW5nZUxpc3RlbmVyV3JhcHBlci50aGlzLnRyZWVDaGFuZ2VkXyhldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIEV2ZW50UXVldWUuaXNEaXNwYXRjaFRocmVhZCgpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBFdmVudFF1ZXVlI2ludm9rZUxhdGVyKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIEV2ZW50UXVldWUjaW52b2tlQW5kV2FpdChSdW5uYWJsZSl9IGNhbiBzb21ldGltZXMgbWFrZQotCSAqIHRoaW5ncyBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPbkV2ZW50UXVldWUoUnVubmFibGUgcikgewotCQlFdmVudFF1ZXVlLmludm9rZUxhdGVyKHIpOwotLy8JCXRyeSB7Ci0vLwkJCUV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChyKTsKLS8vCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotLy8JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0vLwkJfQotCX0KLQotCXZvaWQgbm9kZUFkZGVkXyhUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci5ub2RlQWRkZWQoZXZlbnQpOwotCX0KLQotCXZvaWQgbm9kZVJlbW92ZWRfKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLm5vZGVSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDbGVhcmVkXyhUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmxpc3RlbmVyLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQl9Ci0KLQl2b2lkIHRyZWVDaGFuZ2VkXyhUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5saXN0ZW5lci50cmVlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBV1QoIiArIHRoaXMubGlzdGVuZXIudG9TdHJpbmcoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWFhZDg1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBmb3IgImxhemlseSIgYWRkaW5nIGxpc3RlbmVycwotICogdG8gYW4gdW5kZXJseWluZyBtb2RlbCBhcyBuZWNlc3NhcnkuIFN1YmNsYXNzZXMgd2lsbCBuZWVkIHRvIGVuZ2FnZSBhbmQKLSAqIGRpc2VnYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGFuZCBmaXJlIHRoZSBhcHByb3ByaWF0ZSBjb2xsZWN0aW9uIGNoYW5nZQotICogZXZlbnRzLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9LgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczo8dWw+Ci0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhZGQgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8bGk+e0BsaW5rICNkaXNlbmdhZ2VNb2RlbCgpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZW1vdmUgdGhlIGFwcHJvcHJpYXRlIGxpc3RlbmVyIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzcywgQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChjb2xsZWN0aW9uTmFtZS5lcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIGxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgbGlzdGVuZXIpOwotCQlpZiAoY29sbGVjdGlvbk5hbWUuZXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYW55IGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmdhZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlTW9kZWwoKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0TGlzdFZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0TGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4MmE1Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdExpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgZm9yICJsYXppbHkiIGFkZGluZyBsaXN0ZW5lcnMKLSAqIHRvIGFuIHVuZGVybHlpbmcgbW9kZWwgYXMgbmVjZXNzYXJ5LiBTdWJjbGFzc2VzIHdpbGwgbmVlZCB0byBlbmdhZ2UgYW5kCi0gKiBkaXNlZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbCBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgbGlzdCBjaGFuZ2UKLSAqIGV2ZW50cy4gU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbAotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RMaXN0VmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0TmFtZS5lcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihTdHJpbmcgbGlzdE5hbWUsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIGxpc3RlbmVyKTsKLQkJaWYgKGxpc3ROYW1lLmVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykgJiYgdGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwgaGFzIG5vIGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCBoYXMgYW55IGNvbGxlY3Rpb24gdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEVuZ2FnZSB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VNb2RlbCgpOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlTW9kZWwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNjI0MjkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIGZvciAibGF6aWx5IiBhZGRpbmcgbGlzdGVuZXJzCi0gKiB0byBhbiB1bmRlcmx5aW5nIG1vZGVsIGFzIG5lY2Vzc2FyeS4gU3ViY2xhc3NlcyB3aWxsIG5lZWQgdG8gZW5nYWdlIGFuZAotICogZGlzZWdhZ2UgdGhlIHVuZGVybHlpbmcgbW9kZWwgYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnR5IGNoYW5nZQotICogZXZlbnRzLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgdW5kZXJseWluZyBtb2RlbAotICogPGxpPntAbGluayAjZGlzZW5nYWdlTW9kZWwoKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSB1bmRlcmx5aW5nIG1vZGVsCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVuZCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSAmJiB0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgbGlzdGVuZXIpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpICYmIHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBubyBwcm9wZXJ0eSB2YWx1ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1vZGVsIGhhcyBhbnkgcHJvcGVydHkgdmFsdWUgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogRW5nYWdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmRkZTI5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0Fic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50Ojx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IG1vZGVsCi0gKiA8bGk+e0BsaW5rICNlbmdhZ2VNb2RlbF8oKX08cD4KLSAqICAgICB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGFkYXB0ZWQgbW9kZWwKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZU1vZGVsXygpfTxwPgotICogICAgIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBhZGFwdGVkIG1vZGVsCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI3Byb3BlcnR5Q2hhbmdlZCgpfSB3aGVuZXZlciB0aGUgY2FsY3VsYXRlZAotICogdmFsdWUgb2YgdGhlIHByb3BlcnR5IGNoYW5nZXMgKGFzIGRldGVybWluZWQgYnkgdGhlIHN1YmNsYXNzKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxWPgotewotCS8qKgotCSAqIENhY2hlIHRoZSBjdXJyZW50IHZhbHVlIHNvIHdlIGNhbiBwYXNzIGFuICJvbGQgdmFsdWUiIHdoZW4KLQkgKiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZSBtYXkgYmUgY2FsY3VsYXRlZCBhbmQgd2UgbWF5Ci0JICogbm90IGFibGUgdG8gZGVyaXZlIHRoZSAib2xkIHZhbHVlIiBmcm9tIGFueSBmaXJlZCBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIFYgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJLy8gb3VyIHZhbHVlIGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbW9kZWwKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwgYW5kIGJ1aWxkIHRoZSB2YWx1ZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5lbmdhZ2VNb2RlbF8oKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbCwKLQkJLy8gc2luY2UgdGhlIG1vZGVsJ3MgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VNb2RlbF8oKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLQkgKiBjdXJyZW50IHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBWIGJ1aWxkVmFsdWUoKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbCBhbmQgY2xlYXIgdGhlIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmRpc2VuZ2FnZU1vZGVsXygpOwotCQkvLyBjbGVhciBvdXQgb3VyIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKTsKLQotCS8qKgotCSAqIFRoZSB1bmRlcmx5aW5nIG1vZGVsIGNoYW5nZWQgaW4gc29tZSBmYXNoaW9uLgotCSAqIFJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgbm90aWZ5IGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQWJzdHJhY3RUcmVlTm9kZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3Njc2ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFN1YmNsYXNzZXMgbmVlZCBvbmx5IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0gKiAKLSAqICN2YWx1ZSgpCi0gKgkgICAgcmV0dXJuIHRoZSB1c2VyLWRldGVybWluZWQgInZhbHVlIiBvZiB0aGUgbm9kZSwKLSAqICAgICBpLmUuIHRoZSBvYmplY3QgIndyYXBwZWQiIGJ5IHRoZSBub2RlCi0gKiAKLSAqICNzZXRWYWx1ZShPYmplY3QpCi0gKiAgICAgc2V0IHRoZSB1c2VyLWRldGVybWluZWQgInZhbHVlIiBvZiB0aGUgbm9kZSwKLSAqICAgICBpLmUuIHRoZSBvYmplY3QgIndyYXBwZWQiIGJ5IHRoZSBub2RlOwotICogICAgIHR5cGljYWxseSBvbmx5IG92ZXJyaWRkZW4gZm9yIG5vZGVzIHdpdGggInByaW1pdGl2ZSIgdmFsdWVzCi0gKiAKLSAqICNwYXJlbnQoKQotICogICAgIHJldHVybiB0aGUgcGFyZW50IG9mIHRoZSBub2RlLCB3aGljaCBzaG91bGQgYmUgYW5vdGhlcgotICogICAgIFRyZWVOb2RlVmFsdWVNb2RlbAotICogCi0gKiAjY2hpbGRyZW5Nb2RlbCgpCi0gKiAgICAgcmV0dXJuIGEgTGlzdFZhbHVlTW9kZWwgZm9yIHRoZSBub2RlJ3MgY2hpbGRyZW4KLSAqIAotICogI2VuZ2FnZVZhbHVlKCkgYW5kICNkaXNlbmdhZ2VWYWx1ZSgpCi0gKiAgICAgb3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyB0byBsaXN0ZW4gdG8gdGhlIG5vZGUncyB2YWx1ZSBpZgotICogICAgIGl0IGNhbiBjaGFuZ2UgaW4gYSB3YXkgdGhhdCBzaG91bGQgYmUgcmVmbGVjdGVkIGluIHRoZSB0cmVlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkvLyB0aGlzIG1vZGVsIGZpcmVzICpib3RoKiAidmFsdWUgcHJvcGVydHkgY2hhbmdlIiBhbmQgInN0YXRlIGNoYW5nZSIgZXZlbnRzLi4uCi0vLwkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCXJldHVybiBzdXBlci5idWlsZENoYW5nZVN1cHBvcnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZW5kIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ2xpZW50cyBzaG91bGQgYmUgYWRkaW5nIGJvdGggInN0YXRlIGNoYW5nZSIgYW5kICJ2YWx1ZSBwcm9wZXJ0eSBjaGFuZ2UiCi0JICogbGlzdGVuZXJzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlVmFsdWUoKTsKLQkJfQotCQlzdXBlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBCZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUncyB2YWx1ZSdzIHN0YXRlLiBJZiB0aGUgc3RhdGUgb2YgdGhlIG5vZGUgY2hhbmdlcwotCSAqIGluIGEgd2F5IHRoYXQgc2hvdWxkIGJlIHJlZmxlY3RlZCBpbiB0aGUgdHJlZSwgZmlyZSBhICJzdGF0ZSBjaGFuZ2UiIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZVZhbHVlKCk7Ci0KLQkvKioKLQkgKiBAc2VlICNhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2RlJ3MgdmFsdWUuCi0JICogQHNlZSAjZW5nYWdlVmFsdWUoKQotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVZhbHVlKCk7Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFQgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgoKSB7Ci0JCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBwYXRoID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYmFja1BhdGgoKSk7Ci0JCXJldHVybiBwYXRoLnRvQXJyYXkobmV3IFRyZWVOb2RlVmFsdWVNb2RlbFtwYXRoLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpdGVyYXRvciB0aGF0IGNsaW1icyB1cCB0aGUgbm9kZSdzIHBhdGgsCi0JICogc3RhcnRpbmcgd2l0aCwgYW5kIGluY2x1ZGluZywgdGhlIG5vZGUKLQkgKiBhbmQgdXAgdG8sIGFuZCBpbmNsdWRpbmcsIHRoZSByb290IG5vZGUuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gYmFja1BhdGgoKSB7Ci0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KHRoaXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBuZXh0TGluayhUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsucGFyZW50KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBjaGlsZChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBjaGlsZHJlblNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNoaWxkcmVuTW9kZWwoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mQ2hpbGQoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKSB7Ci0JCUxpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTW9kZWwoKTsKLQkJaW50IHNpemUgPSBjaGlsZHJlbi5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4uZ2V0KGkpID09IGNoaWxkKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTGVhZigpIHsKLQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbCgpLnNpemUoKSA9PSAwOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGltcGxlbWVudCAjZXF1YWxzKE9iamVjdCkgc28gdGhhdCBUcmVlUGF0aHMgY29udGFpbmluZyB0aGVzZSBub2RlcwotCSAqIHdpbGwgcmVzb2x2ZSBwcm9wZXJseSB3aGVuIHRoZSBub2RlcyBjb250YWluIHRoZSBzYW1lIHZhbHVlcy4gVGhpcyBpcwotCSAqIG5lY2Vzc2FyeSBiZWNhdXNlIG5vZGVzIGFyZSBkcm9wcGVkIGFuZCByZWJ1aWx0IHdpbGx5LW5pbGx5IHdoZW4gZGVhbGluZwotCSAqIHdpdGggYSBzb3J0ZWQgbGlzdCBvZiBjaGlsZHJlbjsgYW5kIHRoaXMgYWxsb3dzIHVzIHRvIHNhdmUgYW5kIHJlc3RvcmUKLQkgKiBhIHRyZWUncyBleHBhbmRlZCBwYXRocy4gVGhlIG5vZGVzIGluIHRoZSBleHBhbmRlZCBwYXRocyB0aGF0IGFyZQotCSAqIHNhdmVkIGJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIChlLmcuIHJlbmFtaW5nIGEgbm9kZSkgd2lsbCBiZSBkaWZmZXJlbnQKLQkgKiBmcm9tIHRoZSBub2RlcyBpbiB0aGUgdHJlZSdzIHBhdGhzIGFmdGVyIHRoZSBtb2RpZmljYXRpb24sIGlmIHRoZSBtb2RpZmljYXRpb24KLQkgKiByZXN1bHRzIGluIGEgcG9zc2libGUgY2hhbmdlIGluIHRoZSBub2RlIHNvcnQgb3JkZXIuICB+Ymp2Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoby5nZXRDbGFzcygpICE9IHRoaXMuZ2V0Q2xhc3MoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBvdGhlciA9IChBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgbzsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKS5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZjE3OTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgZXh0ZW5zaW9uIG9mIHtAbGluayBBYnN0cmFjdE1vZGVsfSBwcm92aWRlcyBhIGJhc2UgZm9yIGFkZGluZyAKLSAqIGNoYW5nZSBsaXN0ZW5lcnMgKHByb3BlcnR5IGNoYW5nZSwgY29sbGVjdGlvbiBjaGFuZ2UsIGxpc3QgY2hhbmdlLCB0cmVlIGNoYW5nZSkKLSAqIHRvIGEgc3ViamVjdCBhbmQgY29udmVydGluZyB0aGUgc3ViamVjdCdzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gYSBzaW5nbGUKLSAqIHNldCBvZiBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBmb3IgYSBjb21tb24gYXNwZWN0IChlLmcuIDxjb2RlPlZBTFVFPC9jb2RlPikuCi0gKiA8cD4KLSAqIFRoZSBhZGFwdGVyIHdpbGwgb25seSBsaXN0ZW4gdG8gdGhlIHN1YmplY3QgKGFuZCBzdWJqZWN0IGhvbGRlcikgd2hlbiB0aGUKLSAqIGFkYXB0ZXIgaXRzZWxmIGFjdHVhbGx5IGhhcyBsaXN0ZW5lcnMuIFRoaXMgd2lsbCBhbGxvdyB0aGUgYWRhcHRlciB0byBiZQotICogZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiBhcHByb3ByaWF0ZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0QWRhcHRlcjxTPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotewotCS8qKgotCSAqIFRoZSBzdWJqZWN0IHRoYXQgaG9sZHMgdGhlIGFzcGVjdCBhbmQgZmlyZXMKLQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIHdoZW4gdGhlIGFzcGVjdCBjaGFuZ2VzLgotCSAqIFdlIG5lZWQgdG8gaG9sZCBvbiB0byB0aGlzIGRpcmVjdGx5IHNvIHdlIGNhbgotCSAqIGRpc2VuZ2FnZSBpdCB3aGVuIGl0IGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIFMgc3ViamVjdDsKLQotCS8qKgotCSAqIEEgdmFsdWUgbW9kZWwgdGhhdCBob2xkcyB0aGUgc3ViamVjdAotCSAqIHRoYXQgaG9sZHMgdGhlIGFzcGVjdCBhbmQgcHJvdmlkZXMgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZXJlIGFyZSBhIG51bWJlciBvZiBhc3BlY3QgYWRhcHRlcnMKLQkgKiB0aGF0IGhhdmUgdGhlIHNhbWUgc3ViamVjdCBhbmQgdGhhdCBzdWJqZWN0IGNhbiBjaGFuZ2UuCi0JICogQWxsIHRoZSBhc3BlY3QgYWRhcHRlcnMgc2hvdWxkIHNoYXJlIHRoZSBzYW1lIHN1YmplY3QgaG9sZGVyLgotCSAqIEZvciBub3csIHRoaXMgaXMgY2FuIG9ubHkgYmUgc2V0IHVwb24gY29uc3RydWN0aW9uIGFuZCBpcwotCSAqIGltbXV0YWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBrZWVwcyB1cyBpbiBzeW5jaCB3aXRoIHRoZSBzdWJqZWN0IGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RBZGFwdGVyKFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlci4KLQkgKiBUaGUgc3ViamVjdCBob2xkZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdWJqZWN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IHN1YmplY3RIb2xkZXI7Ci0JCXRoaXMuc3ViamVjdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyB0aGUgc3ViamVjdCBpcyBudWxsIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gaXQKLQkJLy8gdGhpcyB3aWxsIHR5cGljYWxseSByZXN1bHQgaW4gb3VyIHZhbHVlIGJlaW5nIG51bGwKLQkJdGhpcy5zdWJqZWN0ID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ2hhbmdlU3VwcG9ydCh0aGlzLCB0aGlzLmdldExpc3RlbmVyQ2xhc3MoKSwgdGhpcy5nZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaG9sZGVyJ3MgdmFsdWUgaGFzIGNoYW5nZWQsIGtlZXAgb3VyIHN1YmplY3QgaW4gc3luY2guCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRTdWJqZWN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLnN1YmplY3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdWJqZWN0IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaGFzIGNoYW5nZWQuIE5vdGlmeSBsaXN0ZW5lcnMgdGhhdCB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHN1YmplY3RDaGFuZ2VkKCkgewotCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7Ci0JCWJvb2xlYW4gaGFzTGlzdGVuZXJzID0gdGhpcy5oYXNMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VTdWJqZWN0KCk7Ci0JCX0KLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlU3ViamVjdCgpOwotCQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGRWYWx1ZSwgdGhpcy5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGdldFZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIGxpc3RlbmVyIHRoYXQgaXMgaW50ZXJlc3RlZCBpbiB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGFzcGVjdCBhZGFwdGVyJ3MgYXNwZWN0IChlLmcuIFZBTFVFKS4KLQkgKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBhc3BlY3QgYWRhcHRlcidzIHNpbmdsZSBhc3BlY3QsIG5vdCB0aGUKLQkgKiBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgYXNwZWN0IHRoZSBhc3BlY3QgYWRhcHRlciBpcyBhZGFwdGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBsaXN0ZW5lcnMgZm9yIHRoZSBhc3BlY3QuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgbm8gbGlzdGVuZXJzIGZvciB0aGUgYXNwZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc0xpc3RlbmVycygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhc3BlY3QgaGFzIGNoYW5nZWQsIG5vdGlmeSBsaXN0ZW5lcnMgYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0KCkgewotCQkvLyBjaGVjayBmb3Igbm90aGluZyB0byBsaXN0ZW4gdG8KLQkJaWYgKHRoaXMuc3ViamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVuZ2FnZVN1YmplY3RfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3ViamVjdCBpcyBub3QgbnVsbCAtIGFkZCBvdXIgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZW5nYWdlU3ViamVjdF8oKTsKLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3QoKSB7Ci0JCS8vIGNoZWNrIGZvciBub3RoaW5nIHRvIGxpc3RlbiB0bwotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuZGlzZW5nYWdlU3ViamVjdF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0IGlzIG5vdCBudWxsIC0gcmVtb3ZlIG91ciBsaXN0ZW5lci4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpOwotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBzdWJqZWN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5zdWJqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdEhvbGRlcigpIHsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN1YmplY3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgc3ViamVjdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIGl0cyBob2xkZXIKLQkJdGhpcy5zdWJqZWN0ID0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbHMoKSB7Ci0JCXRoaXMuZW5nYWdlU3ViamVjdEhvbGRlcigpOwotCQl0aGlzLmVuZ2FnZVN1YmplY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbHMoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlU3ViamVjdCgpOwotCQl0aGlzLmRpc2VuZ2FnZVN1YmplY3RIb2xkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9jYWwgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIGNoYW5nZSBzdXBwb3J0IHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgYXNwZWN0IGFkYXB0ZXIncwotCSAqIG1vZGVscyAodGhlIHN1YmplY3QgaG9sZGVyIGFuZCB0aGUgc3ViamVjdCBpdHNlbGYpIHdoZW4gdGhlIGZpcnN0Ci0JICogcmVsZXZhbnQgbGlzdGVuZXIgaXMgYWRkZWQuCi0JICogQ29udmVyc2VseSwgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFzcGVjdCBhZGFwdGVyJ3MgbW9kZWxzIHdoZW4gdGhlCi0JICogbGFzdCByZWxldmFudCBsaXN0ZW5lciBpcyByZW1vdmVkLgotCSAqIEEgcmVsZXZhbnQgbGlzdGVuZXIgaXMgYSBsaXN0ZW5lciBvZiB0aGUgcmVsZXZhbnQgdHlwZSBhbmQgYXNwZWN0IG9yIGEKLQkgKiBnZW5lcmFsLXB1cnBvc2UgbGlzdGVuZXIuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsQ2hhbmdlU3VwcG9ydCBleHRlbmRzIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgTG9jYWxDaGFuZ2VTdXBwb3J0KEFzcGVjdEFkYXB0ZXI8Uz4gc291cmNlLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdmFsaWRMaXN0ZW5lckNsYXNzLCBTdHJpbmcgdmFsaWRBc3BlY3ROYW1lKSB7Ci0JCQlzdXBlcihzb3VyY2UsIHZhbGlkTGlzdGVuZXJDbGFzcywgdmFsaWRBc3BlY3ROYW1lKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMuaGFzTm9MaXN0ZW5lcnModGhpcy52YWxpZExpc3RlbmVyQ2xhc3MsIHRoaXMudmFsaWRBc3BlY3ROYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIDxUIGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gdm9pZCBhZGRMaXN0ZW5lcihDbGFzczxUPiBsaXN0ZW5lckNsYXNzLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIGFkZExpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFN0cmluZyBhc3BlY3ROYW1lLCBUIGxpc3RlbmVyKSB7Ci0JCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQkJQXNwZWN0QWRhcHRlci50aGlzLmVuZ2FnZU1vZGVscygpOwotCQkJfQotCQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZSwgbGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgPFQgZXh0ZW5kcyBFdmVudExpc3RlbmVyPiB2b2lkIHJlbW92ZUxpc3RlbmVyKENsYXNzPFQ+IGxpc3RlbmVyQ2xhc3MsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZGlzZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCA8VCBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ2xhc3M8VD4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUsIFQgbGlzdGVuZXIpIHsKLQkJCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUsIGxpc3RlbmVyKTsKLQkJCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCQlBc3BlY3RBZGFwdGVyLnRoaXMuZGlzZW5nYWdlTW9kZWxzKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ZjMxNi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNWQUxVRVN9IGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgdG8gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgZnJvbSB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZ2V0SXRlcmFibGUoKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmFibGUgY29udGFpbmluZyB0aGUKLSAqICAgICBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3Q7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZiBlaXRoZXIKLSAqICAgICB7QGxpbmsgI2l0ZXJhdG9yXygpfSBvciB7QGxpbmsgI2l0ZXJhdG9yKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNzaXplXygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcHJvdmUgcGVyZm9ybWFuY2U7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbiBpZgotICogICAgIHtAbGluayAjc2l6ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjaXRlcmF0b3JfKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGFuIGl0ZXJhdG9yIG9uIHRoZQotICogICAgIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdCBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gaW1wbGVtZW50IHtAbGluayAjZ2V0SXRlcmFibGUoKX07Ci0gKiAgICAgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAge0BsaW5rICNpdGVyYXRvcigpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjaXRlcmF0b3IoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhbiBlbXB0eSBpdGVyYXRvciB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDxsaT57QGxpbmsgI3NpemUoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhIHplcm8gd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8L3VsPgotICogVG8gbm90aWZ5IGxpc3RlbmVycywgc3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI2NvbGxlY3Rpb25DaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gRW1wdHlJdGVyYXRvci48RT5pbnN0YW5jZSgpIDogdGhpcy5pdGVyYXRvcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNpdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SXRlcmFibGUoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2l0ZXJhdG9yXygpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZXJhYmxlKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IDAgOiB0aGlzLnNpemVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgY29sbGVjdGlvbiBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5pdGVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIFZBTFVFUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ29sbGVjdGlvbjxFPiBuZXdDb2xsZWN0aW9uID0gKENvbGxlY3Rpb248RT4pIG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIG5ld0NvbGxlY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248RT4gYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRWYWx1ZUNvbGxlY3Rpb24oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWQzNmEwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMge0BsaW5rIEFzcGVjdEFkYXB0ZXJ9IHByb3ZpZGVzIGJhc2ljIGxpc3QgY2hhbmdlIHN1cHBvcnQuCi0gKiBUaGlzIGNvbnZlcnRzIGFuICJhc3BlY3QiIChhcyBkZWZpbmVkIGJ5IHN1YmNsYXNzZXMpIGludG8KLSAqIGEgc2luZ2xlIHtAbGluayAjTElTVF9WQUxVRVN9IGxpc3QuCi0gKiA8cD4KLSAqIFRoZSB0eXBpY2FsIHN1YmNsYXNzIHdpbGwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzOjx1bD4KLSAqIDxsaT57QGxpbmsgI2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIGFkZCB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgdG8gdGhlIHN1YmplY3QKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZVN1YmplY3RfKCl9PHA+Ci0gKiAgICAgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgYXBwcm9wcmlhdGUgbGlzdGVuZXIgZnJvbSB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZ2V0TGlzdEl0ZXJhYmxlKCl9PHA+Ci0gKiAgICAgYXQgdGhlIHZlcnkgbWluaW11bSwgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGEgbGlzdCBpdGVyYWJsZSBjb250YWluaW5nIHRoZQotICogICAgIHN1YmplY3QncyBsaXN0IGFzcGVjdDsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmIGVpdGhlcgotICogICAgIHtAbGluayAjbGlzdEl0ZXJhdG9yXygpfSBvciB7QGxpbmsgI2xpc3RJdGVyYXRvcigpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjZ2V0KGludCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotICogPGxpPntAbGluayAjc2l6ZV8oKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBpbXByb3ZlIHBlcmZvcm1hbmNlOyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI3NpemUoKX0gaXMgb3ZlcnJpZGRlbiBhbmQgaXRzIGJlaGF2aW9yIGNoYW5nZWQKLSAqIDxsaT57QGxpbmsgI3RvQXJyYXlfKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBvdmVycmlkZGVuIGlmCi0gKiAgICAge0BsaW5rICN0b0FycmF5KCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNsaXN0SXRlcmF0b3JfKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvbiB0aGUgc3ViamVjdCdzIGxpc3QKLSAqICAgICBhc3BlY3QgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGltcGxlbWVudCB7QGxpbmsgI2dldExpc3RJdGVyYWJsZSgpfTsKLSAqICAgICBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI2xpc3RJdGVyYXRvcigpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjbGlzdEl0ZXJhdG9yKCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCBpdGVyYXRvciB3aGVuIHRoZQotICogICAgIHN1YmplY3QgaXMgbnVsbCBpcyB1bmFjY2VwdGFibGUKLSAqIDxsaT57QGxpbmsgI3NpemUoKX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHJldHVybmluZyBhIHplcm8gd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8bGk+e0BsaW5rICN0b0FycmF5KCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb25seSBpZiByZXR1cm5pbmcgYW4gZW1wdHkgYXJyYXkgd2hlbiB0aGUKLSAqICAgICBzdWJqZWN0IGlzIG51bGwgaXMgdW5hY2NlcHRhYmxlCi0gKiA8L3VsPgotICogVG8gbm90aWZ5IGxpc3RlbmVycywgc3ViY2xhc3NlcyBjYW4gY2FsbCB7QGxpbmsgI2xpc3RDaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVsZW1lbnRzIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gRW1wdHlMaXN0SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMubGlzdEl0ZXJhdG9yXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2xpc3RJdGVyYXRvcigpCi0JICovCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3JfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0SXRlcmFibGUoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZWxlbWVudHMgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2xpc3RJdGVyYXRvcl8oKQotCSAqLwotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8RT4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuZ2V0KHRoaXMubGlzdEl0ZXJhdG9yKCksIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnN1YmplY3QgPT0gbnVsbCA/IDAgOiB0aGlzLnNpemVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzaXplKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG1hbmlmZXN0YXRpb24gb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuc3ViamVjdCA9PSBudWxsID8gRU1QVFlfQVJSQVkgOiB0aGlzLnRvQXJyYXlfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG1hbmlmZXN0YXRpb24gb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI3RvQXJyYXkoKQotCSAqLwotCXByb3RlY3RlZCBPYmplY3RbXSB0b0FycmF5XygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkodGhpcy5saXN0SXRlcmF0b3IoKSwgdGhpcy5zaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PEU+IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlTGlzdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIExJU1RfVkFMVUVTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIExpc3Q8RT4gbmV3TGlzdCA9IChMaXN0PEU+KSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIG5ld0xpc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5idWlsZFZhbHVlTGlzdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDxFPiBidWlsZFZhbHVlTGlzdCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlcmF0b3IoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5idWlsZFZhbHVlTGlzdCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0FzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwMTUzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMge0BsaW5rIEFzcGVjdEFkYXB0ZXJ9IHByb3ZpZGVzIGJhc2ljIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhbiAiYXNwZWN0IiAoYXMgZGVmaW5lZCBieSBzdWJjbGFzc2VzKSBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI1ZBTFVFfSBwcm9wZXJ0eS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlXygpfTxwPgotICogICAgIGF0IHRoZSB2ZXJ5IG1pbmltdW0sIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlCi0gKiAgICAgc3ViamVjdCdzIGFzcGVjdCAob3IgInZpcnR1YWwiIGFzcGVjdCk7IGl0IGRvZXMgbm90IG5lZWQgdG8gYmUKLSAqICAgICBvdmVycmlkZGVuIGlmIHtAbGluayAjYnVpbGRWYWx1ZSgpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjc2V0VmFsdWVfKE9iamVjdCl9PHA+Ci0gKiAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIGNsaWVudCBjb2RlIG5lZWRzIHRvIDxlbT5zZXQ8L2VtPiB0aGUgdmFsdWUgb2YKLSAqICAgICB0aGUgc3ViamVjdCdzIGFzcGVjdDsgb2Z0ZW50aW1lcywgdGhvdWdoLCB0aGUgY2xpZW50IGNvZGUgKGUuZy4gVUkpCi0gKiAgICAgd2lsbCBuZWVkIG9ubHkgdG8gPGVtPmdldDwvZW0+IHRoZSB2YWx1ZTsgaXQgZG9lcyBub3QgbmVlZCB0byBiZQotICogICAgIG92ZXJyaWRkZW4gaWYge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfSBpcyBvdmVycmlkZGVuIGFuZCBpdHMgYmVoYXZpb3IgY2hhbmdlZAotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGEgPGNvZGU+bnVsbDwvY29kZT4gdmFsdWUgd2hlbgotICogICAgIHRoZSBzdWJqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+IGlzIHVuYWNjZXB0YWJsZQotICogPGxpPntAbGluayAjc2V0VmFsdWUoT2JqZWN0KX08cD4KLSAqICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZCBvbmx5IGlmIHNvbWV0aGluZyBtdXN0IGJlIGRvbmUgd2hlbiB0aGUgc3ViamVjdAotICogICAgIGlzIDxjb2RlPm51bGw8L2NvZGU+IChlLmcuIHRocm93IGFuIGV4Y2VwdGlvbikKLSAqIDwvdWw+Ci0gKiBUbyBub3RpZnkgbGlzdGVuZXJzLCBzdWJjbGFzc2VzIGNhbiBjYWxsIHtAbGluayAjcHJvcGVydHlDaGFuZ2VkKCl9Ci0gKiB3aGVuZXZlciB0aGUgYXNwZWN0IGhhcyBjaGFuZ2VkLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxTLCBWPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYXNwZWN0IHNvIHdlCi0JICogY2FuIHBhc3MgYW4gIm9sZCB2YWx1ZSIgd2hlbiB3ZSBmaXJlIGEgcHJvcGVydHkgY2hhbmdlIGV2ZW50LgotCSAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIHRoZSB2YWx1ZSBtYXkgYmUgY2FsY3VsYXRlZCBhbmQgbWF5Ci0JICogbm90IGJlIGluIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIHN1YmplY3QsCi0JICogZXNwZWNpYWxseSB3aGVuIGRlYWxpbmcgd2l0aCBtdWx0aXBsZSBhc3BlY3RzLgotCSAqLwotCXByb3RlY3RlZCBWIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhZGFwdGVyIGZvciBhbiBhc3BlY3Qgb2YgdGhlCi0JICogc3BlY2lmaWVkIHN1YmplY3QuCi0JICovCi0JcHJvdGVjdGVkIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQkvLyBvdXIgdmFsdWUgaXMgbnVsbCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgViBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoViB2YWx1ZSkgewotCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHN1YmplY3QncyBhc3BlY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKiBAc2VlICNzZXRWYWx1ZShPYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBWIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2xhc3M8PyBleHRlbmRzIEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyQ2xhc3MoKSB7Ci0JCXJldHVybiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUU7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhWQUxVRSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3QoKSB7Ci0JCXN1cGVyLmVuZ2FnZVN1YmplY3QoKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBzdWJqZWN0LAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlU3ViamVjdCgpOwotCQkvLyBjbGVhciBvdXQgb3VyIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNwZWN0J3MgdmFsdWUuCi0JICogQXQgdGhpcyBwb2ludCB0aGUgc3ViamVjdCBtYXkgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgViBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVmFsdWVfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3ViamVjdCdzIGFzcGVjdC4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqIEBzZWUgI2J1aWxkVmFsdWUoKQotCSAqLwotCXByb3RlY3RlZCBWIGJ1aWxkVmFsdWVfKCkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBieSBzdWJjbGFzc2VzIHdoZW5ldmVyIHRoZSBzdWJqZWN0J3MgYXNwZWN0Ci0JICogaGFzIGNoYW5nZWQ7IGxpc3RlbmVycyB3aWxsIGJlIG5vdGlmaWVkIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKCkgewotCQlWIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQXNwZWN0VHJlZVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4OTk5MS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Bc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgYmFzaWMgdHJlZSBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYW4gImFzcGVjdCIgKGFzIGRlZmluZWQgYnkgc3ViY2xhc3NlcykgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNOT0RFU30gdHJlZS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gYWRkIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciB0byB0aGUgc3ViamVjdAotICogPGxpPntAbGluayAjZGlzZW5nYWdlU3ViamVjdF8oKX08cD4KLSAqICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVtb3ZlIHRoZSBhcHByb3ByaWF0ZSBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0Ci0gKiA8bGk+e0BsaW5rICNub2Rlc18oKX08cD4KLSAqICAgICBhdCB0aGUgdmVyeSBtaW5pbXVtLCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byByZXR1cm4gYW4gaXRlcmF0b3IKLSAqICAgICBvbiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0OyBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gaWYKLSAqICAgICB7QGxpbmsgI25vZGVzKCl9IGlzIG92ZXJyaWRkZW4gYW5kIGl0cyBiZWhhdmlvciBjaGFuZ2VkCi0gKiA8bGk+e0BsaW5rICNub2RlcygpfTxwPgotICogICAgIG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9ubHkgaWYgcmV0dXJuaW5nIGFuIGVtcHR5IGl0ZXJhdG9yIHdoZW4gdGhlCi0gKiAgICAgc3ViamVjdCBpcyBudWxsIGlzIHVuYWNjZXB0YWJsZQotICogPC91bD4KLSAqIFRvIG5vdGlmeSBsaXN0ZW5lcnMsIHN1YmNsYXNzZXMgY2FuIGNhbGwge0BsaW5rICN0cmVlQ2hhbmdlZCgpfQotICogd2hlbmV2ZXIgdGhlIGFzcGVjdCBoYXMgY2hhbmdlZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFzcGVjdFRyZWVWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxTPgotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgdmFsdWUgbW9kZWwgYWRhcHRlciBmb3IgYW4gYXNwZWN0IG9mIHRoZQotCSAqIHNwZWNpZmllZCBzdWJqZWN0LgotCSAqLwotCXByb3RlY3RlZCBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGVzIG9mIHRoZSBzdWJqZWN0J3MgdHJlZSBhc3BlY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEVtcHR5SXRlcmF0b3IuPEU+aW5zdGFuY2UoKSA6IHRoaXMubm9kZXNfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub2RlcyBvZiB0aGUgc3ViamVjdCdzIHRyZWUgYXNwZWN0LgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICogQHNlZSAjbm9kZXMoKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBub2Rlc18oKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbHVlQ29sbGVjdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFRyZWVDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIE5PREVTOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhOT0RFUyk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUFzcGVjdENoYW5nZWQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIENvbGxlY3Rpb248RT4gbmV3Tm9kZXMgPSAoQ29sbGVjdGlvbjxFPikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTLCBuZXdOb2Rlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKE5PREVTLCB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uPEU+IGJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5ub2RlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2QxOTFjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+QnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gaXMgdXNlZCB0byBob2xkIGEgdGVtcG9yYXJ5IGNvcHkgb2YgdGhlIHZhbHVlCi0gKiBpbiBhbm90aGVyIHByb3BlcnR5IHZhbHVlIG1vZGVsICh0aGUgIndyYXBwZWQiIHZhbHVlIGhvbGRlcikuIFRoZSBhcHBsaWNhdGlvbgotICogY2FuIG1vZGlmeSB0aGlzIHRlbXBvcmFyeSBjb3B5LCBhZCBuYXVzZWFtOyBidXQgdGhlIHRlbXBvcmFyeSBjb3B5IGlzIG9ubHkKLSAqIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSAid3JhcHBlZCIgdmFsdWUgaG9sZGVyIHdoZW4gdGhlIHRyaWdnZXIgImFjY2VwdHMiIHRoZQotICogYnVmZmVyZWQgdmFsdWUuIEFsdGVybmF0aXZlbHksIHRoZSBhcHBsaWNhdGlvbiBjYW4gInJlc2V0IiB0aGUgYnVmZmVyZWQgdmFsdWUKLSAqIHRvIHRoZSBvcmlnaW5hbCwgIndyYXBwZWQiIHZhbHVlLgotICogPHA+Ci0gKiBUaGUgdHJpZ2dlciBpcyBhbm90aGVyIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgaG9sZHMgYSB7QGxpbmsgQm9vbGVhbn0KLSAqIGFuZCB0aGUgYXBwbGljYXRpb24gY2hhbmdlcyB0aGUgdHJpZ2dlcidzIHZhbHVlIHRvIHRydWUgb24gImFjY2VwdCIsIGZhbHNlIG9uICJyZXNldCIuCi0gKiBUeXBpY2FsbHksIGluIGEgZGlhbG9nOjx1bD4KLSAqIDxsaT5wcmVzc2luZyB0aGUgIk9LIiBidXR0b24gd2lsbCB0cmlnZ2VyIGFuICJhY2NlcHQiIGFuZCBjbG9zZSB0aGUgZGlhbG9nCi0gKiA8bGk+cHJlc3NpbmcgdGhlICJDYW5jZWwiIGJ1dHRvbiB3aWxsIHNpbXBseSBjbG9zZSB0aGUgZGlhbG9nLAotICogICBkcm9wcGluZyB0aGUgImJ1ZmZlcmVkIiB2YWx1ZXMgaW50byB0aGUgYml0IGJ1Y2tldAotICogPGxpPnByZXNzaW5nIHRoZSAiQXBwbHkiIGJ1dHRvbiB3aWxsIHRyaWdnZXIgYW4gImFjY2VwdCIgYW5kIGxlYXZlIHRoZSBkaWFsb2cgb3BlbgotICogPGxpPnByZXNzaW5nIHRoZSAiUmVzdG9yZSIgYnV0dG9uIHdpbGwgdHJpZ2dlciBhICJyZXNldCIgYW5kIGxlYXZlIHRoZSBkaWFsb2cgb3BlbgotICogPC91bD4KLSAqIDxwPgotICogQSBudW1iZXIgb2YgYnVmZmVyZWQgcHJvcGVydHkgdmFsdWUgbW9kZWxzIGNhbiB3cmFwIGFub3RoZXIgc2V0IG9mCi0gKiBwcm9wZXJ0eSBhc3BlY3QgYWRhcHRlcnMgdGhhdCBhZGFwdCB0aGUgdmFyaW91cyBhc3BlY3RzIG9mIGEgc2luZ2xlCi0gKiBkb21haW4gbW9kZWwuIEFsbCB0aGUgYnVmZmVyZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMgY2FuIGJlIGhvb2tlZCB0byB0aGUKLSAqIHNhbWUgdHJpZ2dlciwgYW5kIHRoYXQgdHJpZ2dlciBpcyBjb250cm9sbGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgdHlwaWNhbGx5Ci0gKiB2aWEgdGhlIE9LIGJ1dHRvbiBpbiBhIGRpYWxvZy4KLSAqIAotICogQHNlZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8VD4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0KLQkvKioKLQkgKiBXZSBjYWNoZSB0aGUgdmFsdWUgaGVyZSB1bnRpbCBpdCBpcyBhY2NlcHRlZCBhbmQgcGFzc2VkCi0JICogdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIFQgYnVmZmVyZWRWYWx1ZTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiB3ZSBhcmUgImFjY2VwdGluZyIgdGhlIGJ1ZmZlcmVkIHZhbHVlCi0JICogYW5kIHBhc3NpbmcgaXQgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuIFRoaXMgYWxsb3dzCi0JICogdXMgdG8gaWdub3JlIHRoZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZmlyZWQgYnkgdGhlIHdyYXBwZWQKLQkgKiB2YWx1ZSBob2xkZXIuCi0JICogKFdlIGNhbid0IHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlciwgYmVjYXVzZQotCSAqIGlmIHdlIGFyZSB0aGUgb25seSBsaXN0ZW5lciB0aGF0IGNvdWxkICJkZWFjdGl2YXRlIiB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlci4pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0aW5nOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgdHJpZ2dlciB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBidWZmZXJlZCB2YWx1ZQotCSAqIHNob3VsZCBiZSBhY2NlcHRlZCBvciByZXNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRyaWdnZXJIb2xkZXI7Ci0KLQkvKiogVGhpcyBsaXN0ZW5zIHRvIHRoZSB0cmlnZ2VyIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0cmlnZ2VyQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGlzIGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgb3VyIGJ1ZmZlcmVkIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkCi0JICogYSB2YWx1ZSBhbmQgaXMgcG9zc2libHkgb3V0IG9mIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVmZmVyaW5nOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBidWZmZXJlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCB0cmlnZ2VyIGhvbGRlci4KLQkgKi8KLQlwdWJsaWMgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiB2YWx1ZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRyaWdnZXJIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQlpZiAodHJpZ2dlckhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnRyaWdnZXJIb2xkZXIgPSB0cmlnZ2VySG9sZGVyOwotCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQl0aGlzLmFjY2VwdGluZyA9IGZhbHNlOwotCQl0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmlnZ2VyQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUcmlnZ2VyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC50aGlzLnRyaWdnZXJDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRyaWdnZXIgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHdlIGFyZSBjdXJyZW50bHkgImJ1ZmZlcmluZyIgYSB2YWx1ZSwgcmV0dXJuIHRoYXQ7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1ZmZlcmluZyA/IHRoaXMuYnVmZmVyZWRWYWx1ZSA6IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NpZ24gdGhlIG5ldyB2YWx1ZSB0byBvdXIgImJ1ZmZlcmVkIiB2YWx1ZS4KLQkgKiBJdCB3aWxsIGJlIHB1c2hlZCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIKLQkgKiB3aGVuIHRoZSB0cmlnZ2VyIGlzICJhY2NlcHRlZCIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQlpZiAodGhpcy5idWZmZXJpbmcpIHsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKHZhbHVlLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpKSB7Ci0JCQkJLy8gdGhlIGJ1ZmZlcmVkIHZhbHVlIGlzIGJlaW5nIHNldCBiYWNrIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZQotCQkJCXRoaXMucmVzZXQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGhlIGJ1ZmZlcmVkIHZhbHVlIGlzIGJlaW5nIGNoYW5nZWQKLQkJCQlPYmplY3Qgb2xkID0gdGhpcy5idWZmZXJlZFZhbHVlOwotCQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IHZhbHVlOwotCQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkLCB2YWx1ZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy52YWx1ZXNBcmVFcXVhbCh2YWx1ZSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSkgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG9yaWdpbmFsIHZhbHVlIC0gaWdub3JlCi0JCQl9IGVsc2UgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgZm9yIHRoZSBmaXJzdCB0aW1lCi0JCQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJCQl0aGlzLmJ1ZmZlcmVkVmFsdWUgPSB2YWx1ZTsKLQkJCQl0aGlzLmJ1ZmZlcmluZyA9IHRydWU7Ci0JCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGV4dGVuc2lvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogZXh0ZW5kIHRvIGVuZ2FnZSB0aGUgdHJpZ2dlciBob2xkZXIgYWxzbwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLnRyaWdnZXJIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy50cmlnZ2VyQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIGV4dGVuZCB0byBkaXNlbmdhZ2UgdGhlIHRyaWdnZXIgaG9sZGVyIGFsc28KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy50cmlnZ2VySG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMudHJpZ2dlckNoYW5nZUxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgd2UgYXJlIGN1cnJlbnRseSAiYWNjZXB0aW5nIiB0aGUgdmFsdWUgKGkuZSBwYXNzaW5nIGl0IG9uIHRvIHRoZQotCSAqICJ3cmFwcGVkIiBtb2RlbCksIGlnbm9yZSBjaGFuZ2Ugbm90aWZpY2F0aW9ucywgc2luY2Ugd2UgY2F1c2VkCi0JICogdGhlbSBhbmQgb3VyIG93biBsaXN0ZW5lcnMgYXJlIGFscmVhZHkgYXdhcmUgb2YgdGhlIGNoYW5nZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoICEgdGhpcy5hY2NlcHRpbmcpIHsKLQkJCXRoaXMudmFsdWVDaGFuZ2VkXyhldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBoYXZlIGEgImJ1ZmZlcmVkIiB2YWx1ZSwgY2hlY2sgd2hldGhlciB0aGUgIndyYXBwZWQiIHZhbHVlIGhhcwotCSAqIGNoYW5nZWQgdG8gYmUgdGhlIHNhbWUgYXMgdGhlICJidWZmZXJlZCIgdmFsdWUuIElmIGl0IGhhcywgc3RvcCAiYnVmZmVyaW5nIjsKLQkgKiBpZiBub3QsIGRvIG5vdGhpbmcuCi0JICogSWYgd2UgZG8gbm90IHlldCBoYXZlIGEgImJ1ZmZlcmVkIiB2YWx1ZSwgc2ltcGx5IHByb3BhZ2F0ZSB0aGUKLQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIHdpdGggdGhlIGJ1ZmZlcmVkIG1vZGVsIGFzIHRoZSBzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkXyhQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmJ1ZmZlcmluZykgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZXZlbnQuZ2V0TmV3VmFsdWUoKSwgdGhpcy5idWZmZXJlZFZhbHVlKSkgewotCQkJCS8vIHRoZSBidWZmZXJlZCB2YWx1ZSBpcyBiZWluZyBzZXQgYmFjayB0byB0aGUgb3JpZ2luYWwgdmFsdWUKLQkJCQl0aGlzLnJlc2V0KCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuaGFuZGxlQ2hhbmdlQ29uZmxpY3QoZXZlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGlmIHdlIGhhdmUgYSAiYnVmZmVyZWQiIHZhbHVlIGFuZCB0aGUgIndyYXBwZWQiIHZhbHVlIGNoYW5nZXMsCi0JICogd2Ugc2ltcGx5IGlnbm9yZSB0aGUgbmV3ICJ3cmFwcGVkIiB2YWx1ZSBhbmQgc2ltcGx5IG92ZXJsYXkgaXQgd2l0aCB0aGUKLQkgKiAiYnVmZmVyZWQiIHZhbHVlIGlmIGl0IGlzICJhY2NlcHRlZCIuICgiTGFzdCBPbmUgSW4gV2lucyIgY29uY3VycmVuY3kgbW9kZWwpCi0JICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY2hhbmdlIHRoYXQgYmVoYXZpb3Igd2l0aCBhCi0JICogZGlmZmVyZW50IGNvbmN1cnJlbmN5IG1vZGVsLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIGRyb3AgdGhlICJidWZmZXJlZCIgdmFsdWUKLQkgKiBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBuZXcgIndyYXBwZWQiIHZhbHVlLCBvciB5b3UgY291bGQgdGhyb3cgYW4KLQkgKiBleGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlQ29uZmxpY3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdGhlIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIFRoZSB0cmlnZ2VyIGNoYW5nZWQ6PHVsPgotCSAqIDxsaT5JZiBpdCBpcyBub3cgdHJ1ZSwgImFjY2VwdCIgdGhlIGJ1ZmZlcmVkIHZhbHVlIGFuZCBwdXNoCi0JICogaXQgdG8gdGhlIHdyYXBwZWQgdmFsdWUgaG9sZGVyLgotCSAqIDxsaT5JZiBpdCBpcyBub3cgZmFsc2UsICJyZXNldCIgdGhlIGJ1ZmZlcmVkIHZhbHVlIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZS4KLQkgKiA8L3VsPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyaWdnZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gaWYgbm90aGluZyBoYXMgYmVlbiAiYnVmZmVyZWQiLCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueXRoaW5nOgotCQkvLyBub3RoaW5nIG5lZWRzIHRvIGJlIHBhc3NlZCB0aHJvdWdoOyBub3RoaW5nIG5lZWRzIHRvIGJlIHJlc2V0OwotCQlpZiAodGhpcy5idWZmZXJpbmcpIHsKLQkJCWlmICgoKEJvb2xlYW4pIGV2ZW50LmdldE5ld1ZhbHVlKCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJdGhpcy5hY2NlcHQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5yZXNldCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWNjZXB0KCkgewotCQkvLyBzZXQgdGhlIGFjY2VwdGluZyBmbGFnIHNvIHdlIGlnbm9yZSBhbnkgZXZlbnRzCi0JCS8vIGZpcmVkIGJ5IHRoZSB3cmFwcGVkIHZhbHVlIGhvbGRlcgotCQl0aGlzLmFjY2VwdGluZyA9IHRydWU7Ci0JCXRyeSB7Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodGhpcy5idWZmZXJlZFZhbHVlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMuYnVmZmVyZWRWYWx1ZSA9IG51bGw7Ci0JCQl0aGlzLmJ1ZmZlcmluZyA9IGZhbHNlOwotCQkJLy8gY2xlYXIgdGhlIGZsYWcgb25jZSB0aGUgImFjY2VwdCIgaXMgY29tcGxldGUKLQkJCXRoaXMuYWNjZXB0aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldCgpIHsKLQkJLy8gbm90aWZ5IG91ciBsaXN0ZW5lcnMgdGhhdCBvdXIgdmFsdWUgaGFzIGJlZW4gcmVzZXQKLQkJT2JqZWN0IG9sZCA9IHRoaXMuYnVmZmVyZWRWYWx1ZTsKLQkJdGhpcy5idWZmZXJlZFZhbHVlID0gbnVsbDsKLQkJdGhpcy5idWZmZXJpbmcgPSBmYWxzZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYnVmZmVyZWQgbW9kZWwgaXMgY3VycmVudGx5ICJidWZmZXJpbmciCi0JICogYSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0J1ZmZlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMuYnVmZmVyaW5nOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFQ+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIDxjb2RlPlRyaWdnZXI8L2NvZGU+IGlzIGEgc3BlY2lhbCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IG9ubHkgbWFpbnRhaW5zIGl0cwotCSAqIHZhbHVlIChvZiA8Y29kZT50cnVlPC9jb2RlPiBvciA8Y29kZT5mYWxzZTwvY29kZT4pIGR1cmluZyB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBjYXVzZWQgYnkKLQkgKiB7QGxpbmsgI3NldFZhbHVlKFQpfS4gSW4gb3RoZXIgd29yZHMsIGEgPGNvZGU+VHJpZ2dlcjwvY29kZT4KLQkgKiBvbmx5IGhhcyBhIHZhbGlkIHZhbHVlIHdoZW4gaXQgaXMgYmVpbmcgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHJpZ2dlciBleHRlbmRzIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB7Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQkvKioKLQkJICogQ29uc3RydWN0IGEgdHJpZ2dlciB3aXRoIGEgbnVsbCB2YWx1ZS4KLQkJICovCi0JCXB1YmxpYyBUcmlnZ2VyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvKioKLQkJICogRXh0ZW5kIHNvIHRoYXQgdGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBkdXJpbmcKLQkJICogY2hhbmdlIG5vdGlmaWNhdGlvbiB0cmlnZ2VyZWQgYnkge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJCWlmICh0aGlzLnZhbHVlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbWV0aG9kIFRyaWdnZXIuZ2V0VmFsdWUoKSBtYXkgb25seSBiZSBjYWxsZWQgZHVyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0aGlzLnZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEV4dGVuZCB0byByZXNldCB0aGUgdmFsdWUgdG8gPGNvZGU+bnVsbDwvY29kZT4gb25jZSBhbGwgdGhlCi0JCSAqIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIFNldCB0aGUgdHJpZ2dlcidzIHZhbHVlOjx1bD4KLQkJICogCTxsaT48Y29kZT50cnVlPC9jb2RlPiBpbmRpY2F0ZXMgImFjY2VwdCIKLQkJICogCTxsaT48Y29kZT5mYWxzZTwvY29kZT4gaW5kaWNhdGVzICJyZXNldCIKLQkJICogPC91bD4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLQkJCXRoaXMuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKHZhbHVlKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0cmlnZ2VyJ3MgdmFsdWU6PHVsPgotCQkgKiAJPGxpPjxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRlcyAiYWNjZXB0IgotCQkgKiAJPGxpPjxjb2RlPmZhbHNlPC9jb2RlPiBpbmRpY2F0ZXMgInJlc2V0IgotCQkgKiA8L3VsPgotCQkgKiBUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIGR1cmluZyBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gYm9vbGVhblZhbHVlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBY2NlcHQgdGhlIHRyaWdnZXIgKGkuZS4gc2V0IGl0cyB2YWx1ZSB0byA8Y29kZT50cnVlPC9jb2RlPikuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY2NlcHQoKSB7Ci0JCQl0aGlzLnNldFZhbHVlKHRydWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0cmlnZ2VyIGhhcyBiZWVuIGFjY2VwdGVkCi0JCSAqIChpLmUuIGl0cyB2YWx1ZSB3YXMgY2hhbmdlZCB0byA8Y29kZT50cnVlPC9jb2RlPikuCi0JCSAqIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGludm9rZWQgZHVyaW5nIGNoYW5nZSBub3RpZmljYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0FjY2VwdGVkKCkgewotCQkJcmV0dXJuIHRoaXMuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmVzZXQgdGhlIHRyaWdnZXIgKGkuZS4gc2V0IGl0cyB2YWx1ZSB0byA8Y29kZT5mYWxzZTwvY29kZT4pLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHJpZ2dlciBoYXMgYmVlbiByZXNldAotCQkgKiAoaS5lLiBpdHMgdmFsdWUgd2FzIGNoYW5nZWQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkJICogVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgaW52b2tlZCBkdXJpbmcgY2hhbmdlIG5vdGlmaWNhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGlzUmVzZXQoKSB7Ci0JCQlyZXR1cm4gISB0aGlzLmJvb2xlYW5WYWx1ZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MmU2ODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0gKiB0byB0cmFuc2Zvcm0gdGhlIHdyYXBwZWQgdmFsdWUgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VmFsdWUoKX0uCi0gKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgaXMgY2FsY3VsYXRlZCBhbmQgY2FjaGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgZXZlcnkKLSAqIHRpbWUgdGhlIHdyYXBwZWQgdmFsdWUgY2hhbmdlcy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIG9sZCB2YWx1ZQotICogcGFzc2VkIGluIHRvIHtAbGluayAjdmFsdWVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50KX0KLSAqIGNhbiBubyBsb25nZXIgYmUgInRyYW5zZm9ybWVkIiBiZWNhdXNlIGl0cyBzdGF0ZSBpcyBubyBsb25nZXIgdmFsaWQuCi0gKiBUaGlzIGNhY2hpbmcgY2FuIGFsc28gaW1wcm92ZSB0aW1lIHBlcmZvcm1hbmNlIGluIHNvbWUgc2l0dWF0aW9ucy4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LAotICogYSBzdWJjbGFzcyBvZiA8Y29kZT5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBvciwKLSAqIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwsIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotICovCi1wdWJsaWMgY2xhc3MgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLQlleHRlbmRzIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgc28gdGhhdCBkdXJpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG5vdGlmaWNhdGlvbgotCSAqIHdlIGRvIG5vdCBoYXZlIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLiBUaGUgb2xkIHZhbHVlIGNvdWxkIG5vIGxvbmdlciBiZSB2YWxpZCBpbgotCSAqIHRoZSBtb2RlbDsgYXMgYSByZXN1bHQsIHRyYW5zZm9ybWluZyBpdCB3b3VsZCBub3QgYmUgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFQyIGNhY2hlZFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9Ci0JICogaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlciwgVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBoYXZlIGxpc3RlbmVycywgdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUgYW5kIGNhY2hlIHRoZSByZXN1bHQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMsIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBudWxsOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vIG5lZWQgdG8gdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUsIHNpbXBseSByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSwKLQkgKiB3aGljaCBpcyBhbHJlYWR5IHRyYW5zZm9ybWVkLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUMiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLCBjYWNoaW5nIGl0IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0JICogQSBiaXQgb2YgYSBzaWRlLWVmZmVjdCwgYnV0IGl0IHNlZW1zIHJlYXNvbmFibGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU5ldyhUMSB2YWx1ZSkgewotCQl0aGlzLmNhY2hlZFZhbHVlID0gc3VwZXIudHJhbnNmb3JtTmV3KHZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG9sZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU9sZChUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTYwMzY3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPGNvZGU+IGF1Z21lbnRzIHRoZQotICogYmVoYXZpb3Igb2YgYSB7QGxpbmsgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYnkgY2FjaGluZwotICogdGhlIHRyYW5zZm9ybWVkIHZhbHVlLgotICogVGhlIHRyYW5zZm9ybWVkIHZhbHVlIGlzIGNhbGN1bGF0ZWQgYW5kIGNhY2hlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gYW5kIGV2ZXJ5Ci0gKiB0aW1lIHRoZSB3cmFwcGVkIHZhbHVlIGNoYW5nZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZSBvbGQgdmFsdWUKLSAqIHBhc3NlZCBpbiB0byB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudCl9Ci0gKiBjYW4gbm8gbG9uZ2VyIGJlICJ0cmFuc2Zvcm1lZCIgYmVjYXVzZSBpdHMgc3RhdGUgaXMgbm8gbG9uZ2VyIHZhbGlkLgotICogVGhpcyBjYWNoaW5nIGNhbiBhbHNvIGltcHJvdmUgdGltZSBwZXJmb3JtYW5jZSBpbiBzb21lIHNpdHVhdGlvbnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMSwgVDI+Ci0JZXh0ZW5kcyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxLCBUMj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgdHJhbnNmb3JtZWQgdmFsdWUgc28gdGhhdCBkdXJpbmcgcHJvcGVydHkgY2hhbmdlIGV2ZW50IG5vdGlmaWNhdGlvbgotCSAqIHdlIGRvIG5vdCBoYXZlIHRvIHRyYW5zZm9ybSB0aGUgb2xkIHZhbHVlLiBUaGUgb2xkIHZhbHVlIGNvdWxkIG5vIGxvbmdlciBiZSB2YWxpZCBpbgotCSAqIHRoZSBtb2RlbDsgYXMgYSByZXN1bHQsIHRyYW5zZm9ybWluZyBpdCB3b3VsZCBub3QgYmUgdmFsaWQuCi0JICovCi0JcHJvdGVjdGVkIFQyIGNhY2hlZFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybV8oT2JqZWN0KX0gYW5kIHtAbGluayByZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpfQotCSAqIChvciB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfSBhbmQge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtKE9iamVjdCl9KQotCSAqIG1ldGhvZHMgaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBCaWRpVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgYmlkaSB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyLCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXZSBoYXZlIGxpc3RlbmVycywgdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUgYW5kIGNhY2hlIHRoZSByZXN1bHQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSB0aGlzLnRyYW5zZm9ybSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFdlIGhhdmUgbm8gbW9yZSBsaXN0ZW5lcnMsIGNsZWFyIHRoZSBjYWNoZWQgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY2FjaGVkVmFsdWUgPSBudWxsOwotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIE5vIG5lZWQgdG8gdHJhbnNmb3JtIHRoZSBuZXN0ZWQgdmFsdWUsIHNpbXBseSByZXR1cm4gdGhlIGNhY2hlZCB2YWx1ZSwKLQkgKiB3aGljaCBpcyBhbHJlYWR5IHRyYW5zZm9ybWVkLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUMiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlLCBjYWNoaW5nIGl0IGJlZm9yZSByZXR1cm5pbmcgaXQuCi0JICogQSBiaXQgb2YgYSBzaWRlLWVmZmVjdCwgYnV0IGl0IHNlZW1zIHJlYXNvbmFibGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU5ldyhUMSB2YWx1ZSkgewotCQl0aGlzLmNhY2hlZFZhbHVlID0gc3VwZXIudHJhbnNmb3JtTmV3KHZhbHVlKTsKLQkJcmV0dXJuIHRoaXMuY2FjaGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogTm8gbmVlZCB0byB0cmFuc2Zvcm0gdGhlIG9sZCB2YWx1ZSwgc2ltcGx5IHJldHVybiB0aGUgY2FjaGVkIHZhbHVlLAotCSAqIHdoaWNoIGlzIGFscmVhZHkgdHJhbnNmb3JtZWQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU9sZChUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWRWYWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZkOGRkZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjYnVpbGRDaGFuZ2VMaXN0ZW5lcigpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTW9kZWwgbW9kZWw7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENoYW5nZUxpc3RlbmVyIGNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBDaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKE1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQkJdGhpcy5jaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGFuZ2VQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNoYW5nZSBsaXN0ZW5lciBjb21tYW5kIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG1vZGVsLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5tb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbW9kZWwgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW9kZWxDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlhMGNmOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIHtAbGluayBBc3BlY3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJ9IHByb3ZpZGVzCi0gKiBiYXNpYyBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhIHNldCBvZiBvbmUgb3IgbW9yZSBjb2xsZWN0aW9ucyBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI1ZBTFVFU30gY29sbGVjdGlvbi4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgKHNlZSB0aGUgZGVzY3JpcHRpb25zCi0gKiBpbiB7QGxpbmsgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyfSk6PHVsPgotICogPGxpPntAbGluayAjZ2V0SXRlcmFibGUoKX0KLSAqIDxsaT57QGxpbmsgI3NpemVfKCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVyYXRvcl8oKX0KLSAqIDxsaT57QGxpbmsgI2l0ZXJhdG9yKCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplKCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBFPgotCWV4dGVuZHMgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBjb2xsZWN0aW9ucyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfQ09MTEVDVElPTl9OQU1FUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGFzcGVjdHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihTdHJpbmcgY29sbGVjdGlvbk5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7Y29sbGVjdGlvbk5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgY29sbGVjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lcywgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSwgY29sbGVjdGlvbk5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWVzID0gY29sbGVjdGlvbk5hbWVzOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIGNvbGxlY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBjb2xsZWN0aW9uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW2NvbGxlY3Rpb25OYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBhc3BlY3QgYWRhcHRlciBmb3IgYW4gInVuY2hhbmdpbmciIGNvbGxlY3Rpb24gaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHN1YmplY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIGNvbGxlY3Rpb24gYXNwZWN0IHRoYXQgZG9lcyBub3QKLQkgKiBjaGFuZ2UgZm9yIGEgcGFydGljdWxhciBzdWJqZWN0OyBidXQgdGhlIHN1YmplY3Qgd2lsbCBjaGFuZ2UsIHJlc3VsdGluZyBpbgotCSAqIGEgbmV3IGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIEVNUFRZX0NPTExFQ1RJT05fTkFNRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyBjb2xsZWN0aW9uIGNoYW5nZSBldmVudHMgaW50byBWQUxVRVMgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChDb2xsZWN0aW9uQXNwZWN0QWRhcHRlci50aGlzLmNvbGxlY3Rpb25OYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBjb2xsZWN0aW9uTmFtZSA6IHRoaXMuY29sbGVjdGlvbk5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihjb2xsZWN0aW9uTmFtZSwgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmUodGhpcywgVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoZXZlbnQuY2xvbmUodGhpcywgVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMsIFZBTFVFUykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzNkOGI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQW4gYWRhcHRlciB0aGF0IGFsbG93cyB1cyB0byBtYWtlIGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHkge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIFRvIG1haW50YWluIGEgcmVhc29uYWJseSBjb25zaXN0ZW50IGFwcGVhcmFuY2UgdG8gY2xpZW50IGNvZGUsIHdlCi0gKiBrZWVwIGFuIGludGVybmFsIGxpc3Qgc29tZXdoYXQgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBTaW5jZSB3ZSBvbmx5IGxpc3RlbiB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHdoZW4gd2UgaGF2ZQotICogbGlzdGVuZXJzIG91cnNlbHZlcyBhbmQgd2UgY2FuIG9ubHkgc3RheSBpbiBzeW5jaCB3aXRoIHRoZSB3cmFwcGVkCi0gKiBjb2xsZWN0aW9uIHdoaWxlIHdlIGFyZSBsaXN0ZW5pbmcgdG8gaXQsIHJlc3VsdHMgdG8gdmFyaW91cyBtZXRob2RzCi0gKiAoZS5nLiB7QGxpbmsgI3NpemUoKX0sIHtAbGluayAjZ2V0KGludCl9KSB3aWxsIGJlIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnRzIHdpbGwgYWxzbyBiZSBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsCi0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgY29sbGVjdGlvbiBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBjb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBPdXIgaW50ZXJuYWwgbGlzdCwgd2hpY2ggaG9sZHMgdGhlIHNhbWUgZWxlbWVudHMgYXMKLQkgKiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLCBidXQga2VlcHMgdGhlbSBpbiBvcmRlci4KLQkgKi8KLQkvLyB3ZSBkZWNsYXJlIHRoaXMgYW4gQXJyYXlMaXN0IHNvIHdlIGNhbiB1c2UgI2Nsb25lKCkgYW5kICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxFPiBsaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAoY29sbGVjdGlvbkhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdDxFPihjb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSBsaXN0IGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbgotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogbGlzdCBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5TGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdCk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b0FycmF5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCQkvLyBzeW5jaCBvdXIgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgbGlzdCB3aGVuIHdlIGFyZSBub3QgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlcgotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZExpc3QoKSB7Ci0JCS8vIGlmIHRoZSBuZXcgY29sbGVjdGlvbiBpcyBlbXB0eSwgZG8gbm90aGluZwotCQlpbnQgc2l6ZSA9IHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCk7Ci0JCWlmIChzaXplICE9IDApIHsKLQkJCXRoaXMuYnVpbGRMaXN0KHNpemUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRMaXN0KGludCBzaXplKSB7Ci0JCXRoaXMubGlzdC5lbnN1cmVDYXBhY2l0eShzaXplKTsKLQkJZm9yIChFIGVhY2ggOiB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJCXRoaXMubGlzdC5hZGQoZWFjaCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KHRoaXMuaW5kZXhUb0FkZEl0ZW1zKCksIHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGludCBpbmRleFRvQWRkSXRlbXMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc2l6ZSgpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QodGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2xlYXJMaXN0KHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQkKLQkvKioKLQkgKiBzeW5jaHJvbml6ZSBvdXIgaW50ZXJuYWwgbGlzdCB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24KLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgc2l6ZSA9IHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCk7Ci0JCWlmIChzaXplID09IDApIHsKLQkJCWlmICh0aGlzLmxpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJLy8gbm8gY2hhbmdlCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMubGlzdCwgTElTVF9WQUxVRVMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMubGlzdC5pc0VtcHR5KCkpIHsKLQkJCQl0aGlzLmJ1aWxkTGlzdChzaXplKTsKLQkJCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfVkFMVUVTLCAwLCB0aGlzLmxpc3QpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0aGlzLmJ1aWxkU3luY0xpc3QoKSwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIEU+IGJ1aWxkU3luY0xpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb25Ib2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQxOGIyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgY29udmVydAotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zIGludG8gcHJvcGVydHkgdmFsdWUgbW9kZWwgY2hhbmdlCi0gKiBub3RpZmljYXRpb25zLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGU6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgY29sbGVjdGlvbiB2YWx1ZQotICogPC91bD4KLSAqIFN1YmNsYXNzZXMgbWlnaHQgd2FudCB0byBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMKLSAqIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgKGJ5IG5vdCByZWNhbGN1bGF0aW5nIHRoZSB2YWx1ZSwgaWYgcG9zc2libGUpOjx1bD4KLSAqIDxsaT57QGxpbmsgI2l0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2l0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxWPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Nb2RlbDsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Nb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb25Nb2RlbCA9IGNvbGxlY3Rpb25Nb2RlbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb2xsZWN0aW9uIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBjb2xsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbk1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuY29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Nb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIgd2FzIGNsZWFyZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkxZGNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhbm90aGVyIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIHByb3BhZ2F0ZQotICogaXRzIGNoYW5nZSBub3RpZmljYXRpb25zLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZQotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uVmFsdWVNb2RlbAotewotCS8qKiBUaGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlci4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBjb2xsZWN0aW9uSG9sZGVyOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUNvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbGxlY3Rpb24gaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gaG9sZGVyIHdhcyBjbGVhcmVkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZWRjNWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsPC9jb2RlPiBhZGFwdHMgYQotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSBob2xkaW5nIGJvb2xlYW4ge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH1zCi0gKiB0byBhIHNpbmdsZSBib29sZWFuIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9LiBUaGUgY29tcG9zaXRlIHZhbHVlIGlzCi0gKiBkZXRlcm1pbmVkIGJ5IHRoZSB7QGxpbmsgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbC5BZGFwdGVyfSBwcm92aWRlZAotICogYXQgY29uc3RydWN0aW9uLiBUeXBpY2FsbHkgdGhlIGNvbXBvc2l0ZSB3aWxsIGJlIGVpdGhlciBhbiBBTkQgb3IgYW4gT1Igb2YKLSAqIGFsbCB0aGUgYm9vbGVhbiB2YWx1ZXMuCi0gKiA8cD4KLSAqIElmIHRoZXJlIGFyZSA8ZW0+bm88L2VtPiBib29sZWFuIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9cywgdGhlIGNvbXBvc2l0ZQotICogd2lsbCByZXR1cm4gaXRzIGRlZmF1bHQgdmFsdWU7IHdoaWNoLCBieSBkZWZhdWx0LCBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gTm9uZSBvZiB0aGUgd3JhcHBlZCBib29sZWFuIG1vZGVscyBjYW4gcmV0dXJuIGEKLSAqIDxjb2RlPm51bGw8L2NvZGU+IHZhbHVlIG9yIHRoaXMgY2xhc3Mgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uIFRoZSBhc3N1bXB0aW9uCi0gKiBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZCBib29sZWFuIG1vZGVscyBhcmUgY29uZmlndXJlZCB3aXRoICJkZWZhdWx0IiB2YWx1ZXMKLSAqIHRoYXQgZGV0ZXJtaW5lIHRoZSBtb2RlbCdzIHZhbHVlIChUUlVFIG9yIEZBTFNFKSB3aGVuIDxjb2RlPm51bGw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbAotCWV4dGVuZHMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Ci17Ci0JLyoqCi0JICogQ2FsY3VsYXRpb24gb2YgdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZGVsZWdhdGVkIHRvIHRoaXMgYWRhcHRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQWRhcHRlciBhZGFwdGVyOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc2V0dGluZyBmb3IgdGhlIGNvbXBvc2l0ZSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsOwotCSAqIGZvciB3aGVuIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwgaXMgZW1wdHkuCi0JICogVGhlIGRlZmF1bHQgW2RlZmF1bHQgdmFsdWVdIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByaXZhdGUgZmluYWwgQm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogQU5EIGZhY3RvcnkgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgQU5EIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyB0cnVlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSB0cnVlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIGZhbHNlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgQU5EIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyB0cnVlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSB0cnVlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIGZhbHNlLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgYW5kKENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbCBhbmQoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoQU5EX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIEFORCBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgdHJ1ZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgdHJ1ZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyBmYWxzZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFORF9BREFQVEVSLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBBTkQgb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIHRydWUKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIHRydWUsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgZmFsc2UuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIGFuZChCb29sZWFuIGRlZmF1bHRWYWx1ZSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBTkRfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPUiBmYWN0b3J5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIE9SIG9mIHRoZQotCSAqIHNwZWNpZmllZCBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsczsgaS5lLiB0aGUgbW9kZWwncyB2YWx1ZSBpcyBmYWxzZQotCSAqIGlmIGFsbCB0aGUgY29udGFpbmVkIG1vZGVscyBhcmUgZmFsc2UsIG90aGVyd2lzZSBpdHMgdmFsdWUgaXMgdHJ1ZS4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIG9yKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIG9yKEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4uLi4gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgYXJyYXkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgT1Igb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIGZhbHNlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSBmYWxzZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyB0cnVlLgotCSAqIFdoZW4gdGhlIG1vZGVsIGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGl0cyB2YWx1ZSB3aWxsIGJlIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEUgZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwoT1JfQURBUFRFUiwgZGVmYXVsdFZhbHVlLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgT1Igb2YgdGhlCi0JICogc3BlY2lmaWVkIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzOyBpLmUuIHRoZSBtb2RlbCdzIHZhbHVlIGlzIGZhbHNlCi0JICogaWYgYWxsIHRoZSBjb250YWluZWQgbW9kZWxzIGFyZSBmYWxzZSwgb3RoZXJ3aXNlIGl0cyB2YWx1ZSBpcyB0cnVlLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwgb3IoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChPUl9BREFQVEVSLCBjb2xsZWN0aW9uTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBPUiBvZiB0aGUKLQkgKiBzcGVjaWZpZWQgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHM7IGkuZS4gdGhlIG1vZGVsJ3MgdmFsdWUgaXMgZmFsc2UKLQkgKiBpZiBhbGwgdGhlIGNvbnRhaW5lZCBtb2RlbHMgYXJlIGZhbHNlLCBvdGhlcndpc2UgaXRzIHZhbHVlIGlzIHRydWUuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsIG9yKEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKE9SX0FEQVBURVIsIGRlZmF1bHRWYWx1ZSwgY29sbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbHMsIGFzIGRlZmluZWQgYnkgdGhlIHNwZWNpZmllZCBhZGFwdGVyLgotCSAqIFRoZSBtb2RlbCdzIGRlZmF1bHQgdmFsdWUsIHdoZW4gaXQgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBZGFwdGVyIGFkYXB0ZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPi4uLiBhcnJheSkgewotCQl0aGlzKGFkYXB0ZXIsIG51bGwsIGFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBZGFwdGVyIGFkYXB0ZXIsIEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4uLi4gYXJyYXkpIHsKLQkJc3VwZXIoYXJyYXkpOwotCQl0aGlzLmFkYXB0ZXIgPSBhZGFwdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBUaGUgbW9kZWwncyBkZWZhdWx0IHZhbHVlLCB3aGVuIGl0IGNvbnRhaW5zIG5vIG5lc3RlZCBtb2RlbHMsIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoYWRhcHRlciwgbnVsbCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVscywgYXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCi0JICogV2hlbiB0aGUgbW9kZWwgY29udGFpbnMgbm8gbmVzdGVkIG1vZGVscywgaXRzIHZhbHVlIHdpbGwgYmUgdGhlCi0JICogc3BlY2lmaWVkIGRlZmF1bHQuCi0JICovCi0JcHVibGljIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQm9vbGVhbiBkZWZhdWx0VmFsdWUsIENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQlzdXBlcihjb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgYm9vbGVhbiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0aGF0IGlzIGEgY29tcG9zaXRlIG9mIHRoZSBzcGVjaWZpZWQKLQkgKiBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVscywgYXMgZGVmaW5lZCBieSB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuCi0JICogVGhlIG1vZGVsJ3MgZGVmYXVsdCB2YWx1ZSwgd2hlbiBpdCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsKEFkYXB0ZXIgYWRhcHRlciwgQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXRoaXMoYWRhcHRlciwgbnVsbCwgY29sbGVjdGlvbk1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBib29sZWFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUgbW9kZWxzLCBhcyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWRhcHRlci4KLQkgKiBXaGVuIHRoZSBtb2RlbCBjb250YWlucyBubyBuZXN0ZWQgbW9kZWxzLCBpdHMgdmFsdWUgd2lsbCBiZSB0aGUKLQkgKiBzcGVjaWZpZWQgZGVmYXVsdC4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbChBZGFwdGVyIGFkYXB0ZXIsIEJvb2xlYW4gZGVmYXVsdFZhbHVlLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjb2xsZWN0aW9uTW9kZWwpIHsKLQkJc3VwZXIoY29sbGVjdGlvbk1vZGVsKTsKLQkJdGhpcy5hZGFwdGVyID0gYWRhcHRlcjsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFsbCB0aGUgY29udGFpbmVkIGJvb2xlYW5zIGFyZSB0cnVlOyBvdGhlcndpc2UgcmV0dXJuCi0JICogZmFsc2UuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmNvbGxlY3Rpb25Nb2RlbC5zaXplKCkgPT0gMCkgPyB0aGlzLmRlZmF1bHRWYWx1ZSA6IHRoaXMuYnVpbGRWYWx1ZV8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJcmV0dXJuIHRoaXMuYWRhcHRlci5idWlsZFZhbHVlKHRoaXMuZ2V0Qm9vbGVhbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEJvb2xlYW4+IGdldEJvb2xlYW5zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+LCBCb29sZWFuPih0aGlzLmdldENvbGxlY3Rpb25Nb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbk1vZGVsKSB7Ci0JCQkJcmV0dXJuIGJvb2xlYW5Nb2RlbC5nZXRWYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBnZXRDb2xsZWN0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiAoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4pIHN1cGVyLmdldENvbGxlY3Rpb25Nb2RlbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgYWRhcHRlciBhbGxvd3MgdGhlIHtAbGluayBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsfSB0byBiZQotCSAqIHBsdWdnYWJsZS4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb21wb3NpdGUgYm9vbGVhbiB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24KLQkJICogb2YgYm9vbGVhbiBtb2RlbHMuCi0JCSAqLwotCQlCb29sZWFuIGJ1aWxkVmFsdWUoSXRlcmFibGU8Qm9vbGVhbj4gYm9vbGVhbnMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIGFsbCB0aGUgYm9vbGVhbnMgYXJlIHRydWU7IG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBBZGFwdGVyIEFORF9BREFQVEVSID0gbmV3IEFkYXB0ZXIoKSB7Ci0JCXB1YmxpYyBCb29sZWFuIGJ1aWxkVmFsdWUoSXRlcmFibGU8Qm9vbGVhbj4gYm9vbGVhbnMpIHsKLQkJCWZvciAoQm9vbGVhbiBiIDogYm9vbGVhbnMpIHsKLQkJCQlpZiAoICEgYi5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJBTkRfQURBUFRFUiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLQkvKioKLQkgKiBSZXR1cm4gZmFsc2UgaWYgYWxsIHRoZSBib29sZWFucyBhcmUgZmFsc2U7IG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFkYXB0ZXIgT1JfQURBUFRFUiA9IG5ldyBBZGFwdGVyKCkgewotCQlwdWJsaWMgQm9vbGVhbiBidWlsZFZhbHVlKEl0ZXJhYmxlPEJvb2xlYW4+IGJvb2xlYW5zKSB7Ci0JCQlmb3IgKEJvb2xlYW4gYiA6IGJvb2xlYW5zKSB7Ci0JCQkJaWYgKGIuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiT1JfQURBUFRFUiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmYxNmEzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTnVsbExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSBhbmQgdXNlcyBhIHtAbGluayBUcmFuc2Zvcm1lcn0KLSAqIHRvIGNvbnZlcnQgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdG8geWV0IGFub3RoZXIKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0uIFRoaXMgY29tcG9zaXRlIGNvbGxlY3Rpb24gY29udGFpbnMKLSAqIHRoZSBjb21iaW5lZCBpdGVtcyBmcm9tIGFsbCB0aGVzZSBjb21wb25lbnQgY29sbGVjdGlvbnMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gbXVzdCBiZSBhbiAiaWRlbnRpdHkgc2V0IiB0aGF0IGRvZXMgbm90Ci0gKiBjb250YWluIHRoZSBzYW1lIGl0ZW0gdHdpY2Ugb3IgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAqIDxwPgotICogVGVybWlub2xvZ3k6PHVsPgotICogPGxpPjxlbT5zb3VyY2VzPC9lbT4gLSB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbDsgdGhlc2UKLSAqICAgIGFyZSBjb252ZXJ0ZWQgaW50byBjb21wb25lbnQgQ1ZNcyBieSB0aGUgdHJhbnNmb3JtZXIKLSAqIDxsaT48ZW0+Y29tcG9uZW50IENWTXM8L2VtPiAtIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMgdGhhdCBhcmUgY29tYmluZWQKLSAqICAgIGJ5IHRoaXMgY29tcG9zaXRlIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwKLSAqIDxsaT48ZW0+aXRlbXM8L2VtPiAtIHRoZSBpdGVtcyBoZWxkIGJ5IHRoZSBjb21wb25lbnQgQ1ZNcwotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUxLCBFMj4KLQlleHRlbmRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPgotewotCS8qKgotCSAqIFRoaXMgaXMgdGhlIChvcHRpb25hbCkgdXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCB0cmFuc2Zvcm1zCi0JICogdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdG8gY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcjsKLQotCS8qKgotCSAqIENhY2hlIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMgdGhhdAotCSAqIHdlcmUgZ2VuZXJhdGVkIGJ5IHRoZSB0cmFuc2Zvcm1lcjsga2V5ZWQgYnkgdGhlIGl0ZW0KLQkgKiBpbiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHRoYXQgd2FzIHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtZXIuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJZGVudGl0eUhhc2hNYXA8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gY29tcG9uZW50Q1ZNcyA9Ci0JCQluZXcgSWRlbnRpdHlIYXNoTWFwPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+KCk7Ci0KLQkvKioKLQkgKiBDYWNoZSBvZiB0aGUgY29sbGVjdGlvbnMgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG9uZW50Ci0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbHMgYWJvdmU7IGtleWVkIGJ5IHRoZSBjb21wb25lbnQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscy4KLQkgKiBVc2Uge0BsaW5rIEFycmF5TGlzdH1zIHNvIHdlIGNhbiB1c2Uge0BsaW5rIEFycmF5TGlzdH0tc3BlY2lmaWMgbWV0aG9kcwotCSAqIChlLmcuIHtAbGluayBBcnJheUxpc3QjY2xvbmUoKX0gYW5kIHtAbGluayBBcnJheUxpc3QjZW5zdXJlQ2FwYWNpdHkoaW50KX0pLgotCSAqLwotCXByaXZhdGUgZmluYWwgSWRlbnRpdHlIYXNoTWFwPENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiwgQXJyYXlMaXN0PEUyPj4gY29sbGVjdGlvbnMgPQotCQkJbmV3IElkZW50aXR5SGFzaE1hcDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4sIEFycmF5TGlzdDxFMj4+KCk7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLiAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNvbXBvbmVudENWTUxpc3RlbmVyOwotCi0JLyoqIENhY2hlIHRoZSBzaXplIG9mIHRoZSBjb21wb3NpdGUgY29sbGVjdGlvbi4gKi8KLQlwcml2YXRlIGludCBzaXplOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKGNvbGxlY3Rpb25Ib2xkZXIsIFRyYW5zZm9ybWVyLk51bGwuPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIsIFRyYW5zZm9ybWVyPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXRoaXMuY29tcG9uZW50Q1ZNTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29tcG9uZW50TGlzdGVuZXIoKTsKLQkJdGhpcy5zaXplID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBjb2xsZWN0aW9uIHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlcikgewotCQl0aGlzKG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEUxPihsaXN0SG9sZGVyKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGxpc3RIb2xkZXIsIFRyYW5zZm9ybWVyPEUxLCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGxpc3RIb2xkZXIpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb24pIHsKLQkJdGhpcyhuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8RTE+KGNvbGxlY3Rpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFMT4gY29sbGVjdGlvbiwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8RTE+KGNvbGxlY3Rpb24pLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwoRTEuLi4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMT4oY29sbGVjdGlvbikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsKEUxW10gY29sbGVjdGlvbiwgVHJhbnNmb3JtZXI8RTEsIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJdGhpcyhuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8RTE+KGNvbGxlY3Rpb24pLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb21wb25lbnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNBZGRlZChldmVudCk7Ci0JCQl9CQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50Q29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRDb2xsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21wb25lbnQgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8RTI+KHRoaXMuYnVpbGRDb2xsZWN0aW9uc0l0ZXJhdG9ycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SXRlcmF0b3I8RTI+PiBidWlsZENvbGxlY3Rpb25zSXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8QXJyYXlMaXN0PEUyPiwgSXRlcmF0b3I8RTI+Pih0aGlzLmNvbGxlY3Rpb25zLnZhbHVlcygpLml0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPEUyPiB0cmFuc2Zvcm0oQXJyYXlMaXN0PEUyPiBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuaXRlcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNpemU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlciBvdmVycmlkZXMvaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmNoIG91ciBjYWNoZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBjb2xsZWN0aW9uLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmFkZEFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gYWxsIHRoZSBzb3VyY2VzIHRvIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWxzCi0JICogYW5kIGFkZCB0aGVpciBpdGVtcyB0byBvdXIgY2FjaGUsIHdpdGggbm8gZXZlbnQgbm90aWZpY2F0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFsbENvbXBvbmVudFNvdXJjZXMoKSB7Ci0JCWZvciAoRTEgc291cmNlIDogdGhpcy5jb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZShzb3VyY2UsIE51bGxMaXN0LjxFMj5pbnN0YW5jZSgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBzdG9wIGxpc3RlbmluZyB0byB0aGUgY29tcG9uZW50cy4uLgotCQlmb3IgKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gOiB0aGlzLmNvbXBvbmVudENWTXMudmFsdWVzKCkpIHsKLQkJCWNvbXBvbmVudENWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVkFMVUVTLCB0aGlzLmNvbXBvbmVudENWTUxpc3RlbmVyKTsKLQkJfQotCQkvLyAuLi5hbmQgY2xlYXIgdGhlIGNhY2hlCi0JCXRoaXMuY29tcG9uZW50Q1ZNcy5jbGVhcigpOwotCQl0aGlzLmNvbGxlY3Rpb25zLmNsZWFyKCk7Ci0JCXRoaXMuc2l6ZSA9IDA7Ci0JfQotCi0JLyoqCi0JICogU29tZSBjb21wb25lbnQgc291cmNlcyB3ZXJlIGFkZGVkOwotCSAqIGFkZCB0aGVpciBjb3JyZXNwb25kaW5nIGl0ZW1zIHRvIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RTI+IGFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPigpOwotCQlmb3IgKEUxIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2UoaXRlbSwgYWRkZWRJdGVtcyk7Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNBZGRlZChWQUxVRVMsIGFkZGVkSXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIHNvdXJjZSB0byBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwKLQkgKiBhbmQgYWRkIGl0cyBpdGVtcyB0byBvdXIgY2FjaGUgYW5kIHRoZSAiY29sbGVjdGluZyBwYXJhbWV0ZXIiLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudFNvdXJjZShFMSBzb3VyY2UsIExpc3Q8RTI+IGFkZGVkSXRlbXMpIHsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZSk7Ci0JCWlmICh0aGlzLmNvbXBvbmVudENWTXMucHV0KHNvdXJjZSwgY29tcG9uZW50Q1ZNKSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJkdXBsaWNhdGUgY29tcG9uZW50OiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNvbXBvbmVudENWTS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVkFMVUVTLCB0aGlzLmNvbXBvbmVudENWTUxpc3RlbmVyKTsKLQkJQXJyYXlMaXN0PEUyPiBjb21wb25lbnRDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxFMj4oY29tcG9uZW50Q1ZNLnNpemUoKSk7Ci0JCWlmICh0aGlzLmNvbGxlY3Rpb25zLnB1dChjb21wb25lbnRDVk0sIGNvbXBvbmVudENvbGxlY3Rpb24pICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImR1cGxpY2F0ZSBjb2xsZWN0aW9uOiAiICsgc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuYWRkQ29tcG9uZW50SXRlbXMoY29tcG9uZW50Q1ZNLCBjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJYWRkZWRJdGVtcy5hZGRBbGwoY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBpdGVtcyBpbiB0aGUgc3BlY2lmaWVkIGNvbXBvbmVudCBDVk0gdG8gdGhlIHNwZWNpZmllZCBjb21wb25lbnQKLQkgKiBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudEl0ZW1zKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0sIEFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbikgewotCQlpbnQgaXRlbXNTaXplID0gY29tcG9uZW50Q1ZNLnNpemUoKTsKLQkJdGhpcy5zaXplICs9IGl0ZW1zU2l6ZTsKLQkJY29tcG9uZW50Q29sbGVjdGlvbi5lbnN1cmVDYXBhY2l0eShjb21wb25lbnRDb2xsZWN0aW9uLnNpemUoKSArIGl0ZW1zU2l6ZSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoY29tcG9uZW50Q29sbGVjdGlvbiwgY29tcG9uZW50Q1ZNKTsKLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgcmVtb3ZlZDsKLQkgKiByZW1vdmUgdGhlaXIgY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFMj4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQkJZm9yIChFMSBpdGVtIDogdGhpcy5nZXRJdGVtcyhldmVudCkpIHsKLQkJCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlKGl0ZW0sIHJlbW92ZWRJdGVtcyk7Ci0JCX0KLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKFZBTFVFUywgcmVtb3ZlZEl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGl0ZW1zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiBmcm9tIG91ciBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRTb3VyY2UoRTEgc291cmNlLCBMaXN0PEUyPiByZW1vdmVkSXRlbXMpIHsKLQkJQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTSA9IHRoaXMuY29tcG9uZW50Q1ZNcy5yZW1vdmUoc291cmNlKTsKLQkJaWYgKGNvbXBvbmVudENWTSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtaXNzaW5nIGNvbXBvbmVudDogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljb21wb25lbnRDVk0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFZBTFVFUywgdGhpcy5jb21wb25lbnRDVk1MaXN0ZW5lcik7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMucmVtb3ZlKGNvbXBvbmVudENWTSk7Ci0JCWlmIChjb21wb25lbnRDb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgY29sbGVjdGlvbjogIiArIHNvdXJjZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZW1vdmVkSXRlbXMuYWRkQWxsKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCQl0aGlzLnJlbW92ZUNvbXBvbmVudEl0ZW1zKGNvbXBvbmVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSBvdXIgc2l6ZSBhbmQgY29sbGVjdGlvbiBjYWNoZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb21wb25lbnRJdGVtcyhBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24pIHsKLQkJdGhpcy5zaXplIC09IGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIGNsZWFyZWQ7Ci0JICogY2xlYXIgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQWxsQ29tcG9uZW50U291cmNlcygpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChWQUxVRVMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbENvbXBvbmVudFNvdXJjZXMoKSB7Ci0JCS8vIGNvcHkgdGhlIGtleXMgc28gd2UgZG9uJ3QgZWF0IG91ciBvd24gdGFpbAotCQlBcnJheUxpc3Q8RTE+IGNvcHkgPSBuZXcgQXJyYXlMaXN0PEUxPih0aGlzLmNvbXBvbmVudENWTXMua2V5U2V0KCkpOwotCQlmb3IgKEUxIHNvdXJjZSA6IGNvcHkpIHsKLQkJCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlKHNvdXJjZSwgTnVsbExpc3QuPEUyPmluc3RhbmNlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIGNoYW5nZWQ7Ci0JICogcmVidWlsZCBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQWxsQ29tcG9uZW50U291cmNlcygpOwotCQl0aGlzLmFkZEFsbENvbXBvbmVudFNvdXJjZXMoKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCBvYmplY3QgaW50byBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IHRyYW5zZm9ybShFMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGhhZCBpdGVtcyBhZGRlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludCBpdGVtc1NpemUgPSBldmVudC5nZXRJdGVtc1NpemUoKTsKLQkJdGhpcy5zaXplICs9IGl0ZW1zU2l6ZTsKLQotCQlBcnJheUxpc3Q8RTI+IGNvbXBvbmVudENvbGxlY3Rpb24gPSB0aGlzLmNvbGxlY3Rpb25zLmdldCh0aGlzLmNvbXBvbmVudENWTShldmVudCkpOwotCQljb21wb25lbnRDb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KGNvbXBvbmVudENvbGxlY3Rpb24uc2l6ZSgpICsgaXRlbXNTaXplKTsKLQotCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpLCBjb21wb25lbnRDb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgY29tcG9uZW50IGNvbGxlY3Rpb25zIGhhZCBpdGVtcyByZW1vdmVkOwotCSAqIHN5bmNocm9uaXplIG91ciBjYWNoZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnNpemUgLT0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMuZ2V0KHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KSk7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0aGlzLmdldENvbXBvbmVudEl0ZW1zKGV2ZW50KSwgY29tcG9uZW50Q29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBjb2xsZWN0aW9ucyB3YXMgY2xlYXJlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzIGJ5IGNsZWFyaW5nIG91dCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudENvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMuZ2V0KHRoaXMuY29tcG9uZW50Q1ZNKGV2ZW50KSk7Ci0JCUFycmF5TGlzdDxFMj4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxFMj4oY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50SXRlbXMoY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChWQUxVRVMsIHJlbW92ZWRJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgY29sbGVjdGlvbnMgY2hhbmdlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGVzIGJ5IGNsZWFyaW5nIG91dCB0aGUgYXBwcm9wcmlhdGUKLQkgKiBjb2xsZWN0aW9uIGFuZCB0aGVuIHJlYnVpbGRpbmcgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50Q29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRDVk0gPSB0aGlzLmNvbXBvbmVudENWTShldmVudCk7Ci0JCUFycmF5TGlzdDxFMj4gY29tcG9uZW50Q29sbGVjdGlvbiA9IHRoaXMuY29sbGVjdGlvbnMuZ2V0KGNvbXBvbmVudENWTSk7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50SXRlbXMoY29tcG9uZW50Q29sbGVjdGlvbik7Ci0JCXRoaXMuYWRkQ29tcG9uZW50SXRlbXMoY29tcG9uZW50Q1ZNLCBjb21wb25lbnRDb2xsZWN0aW9uKTsKLQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoVkFMVUVTLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEUyPiBnZXRDb21wb25lbnRJdGVtcyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFMj4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFMj4gZ2V0Q29tcG9uZW50SXRlbXMoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RTI+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudENWTShDb2xsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFMj4pIGV2ZW50LmdldFNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjAxN2IwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGFuZCB1c2VzIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotICogdG8gY29udmVydCBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCB0byB5ZXQgYW5vdGhlcgotICoge0BsaW5rIExpc3RWYWx1ZU1vZGVsfS4gVGhpcyBjb21wb3NpdGUgbGlzdCBjb250YWlucwotICogdGhlIGNvbWJpbmVkIGl0ZW1zIGZyb20gYWxsIHRoZXNlIGNvbXBvbmVudCBsaXN0cy4KLSAqIDxwPgotICogVGVybWlub2xvZ3k6PHVsPgotICogPGxpPjxlbT5zb3VyY2VzPC9lbT4gLSB0aGUgaXRlbXMgaW4gdGhlIHdyYXBwZWQgbGlzdCB2YWx1ZSBtb2RlbDsgdGhlc2UKLSAqICAgIGFyZSBjb252ZXJ0ZWQgaW50byBjb21wb25lbnQgTFZNcyBieSB0aGUgdHJhbnNmb3JtZXIKLSAqIDxsaT48ZW0+Y29tcG9uZW50IExWTXM8L2VtPiAtIHRoZSBjb21wb25lbnQgbGlzdCB2YWx1ZSBtb2RlbHMgdGhhdCBhcmUgY29tYmluZWQKLSAqICAgIGJ5IHRoaXMgY29tcG9zaXRlIGxpc3QgdmFsdWUgbW9kZWwKLSAqIDxsaT48ZW0+aXRlbXM8L2VtPiAtIHRoZSBpdGVtcyBoZWxkIGJ5IHRoZSBjb21wb25lbnQgTFZNcwotICogPC91bD4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCS8qKgotCSAqIFRoaXMgaXMgdGhlIChvcHRpb25hbCkgdXNlci1zdXBwbGllZCBvYmplY3QgdGhhdCB0cmFuc2Zvcm1zCi0JICogdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkIGxpc3QgdG8gbGlzdCB2YWx1ZSBtb2RlbHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUcmFuc2Zvcm1lcjxFMSwgTGlzdFZhbHVlTW9kZWw8RTI+PiB0cmFuc2Zvcm1lcjsKLQotCS8qKgotCSAqIENhY2hlIG9mIHRoZSBzb3VyY2VzLCBjb21wb25lbnQgTFZNcywgbGlzdHMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW5mbz4gaW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KCk7Ci0JcHJvdGVjdGVkIGNsYXNzIEluZm8gewotCQkvLyB0aGUgb2JqZWN0IHBhc3NlZCB0byB0aGUgdHJhbnNmb3JtZXIKLQkJZmluYWwgRTEgc291cmNlOwotCQkvLyB0aGUgbGlzdCB2YWx1ZSBtb2RlbCBnZW5lcmF0ZWQgYnkgdGhlIHRyYW5zZm9ybWVyCi0JCWZpbmFsIExpc3RWYWx1ZU1vZGVsPEUyPiBjb21wb25lbnRMVk07Ci0JCS8vIGNhY2hlIG9mIHRoZSBpdGVtcyBoZWxkIGJ5IHRoZSBjb21wb25lbnQgTFZNCi0JCWZpbmFsIEFycmF5TGlzdDxFMj4gaXRlbXM7Ci0JCS8vIHRoZSBjb21wb25lbnQgTFZNJ3MgYmVnaW5uaW5nIGluZGV4IHdpdGhpbiB0aGUgY29tcG9zaXRlIExWTQotCQlpbnQgYmVnaW47Ci0JCXByb3RlY3RlZCBJbmZvKEUxIHNvdXJjZSwgTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSwgQXJyYXlMaXN0PEUyPiBpdGVtcywgaW50IGJlZ2luKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLmNvbXBvbmVudExWTSA9IGNvbXBvbmVudExWTTsKLQkJCXRoaXMuaXRlbXMgPSBpdGVtczsKLQkJCXRoaXMuYmVnaW4gPSBiZWdpbjsKLQkJfQotCX0KLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBjb21wb25lbnQgbGlzdCB2YWx1ZSBtb2RlbHMuICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgY29tcG9uZW50TFZNTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHNpemUgb2YgdGhlIGNvbXBvc2l0ZSBsaXN0LiAqLwotCXByaXZhdGUgaW50IHNpemU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsLiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZjx1bD4KLQkgKiA8bGk+IHRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwgYWxyZWFkeSBjb250YWlucyBvdGhlcgotCSAqICAgICAgIGxpc3QgdmFsdWUgbW9kZWxzLCBvcgotCSAqIDxsaT4geW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm0oRTEpfQotCSAqICAgICAgIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobGlzdEhvbGRlciwgVHJhbnNmb3JtZXIuTnVsbC48RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlciwgVHJhbnNmb3JtZXI8RTEsIExpc3RWYWx1ZU1vZGVsPEUyPj4gdHJhbnNmb3JtZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5jb21wb25lbnRMVk1MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb21wb25lbnRMVk1MaXN0ZW5lcigpOwotCQl0aGlzLnNpemUgPSAwOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBsaXN0IHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKExpc3Q8PyBleHRlbmRzIEUxPiBsaXN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEUxPihsaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQsIHVuY2hhbmdpbmcsIHdyYXBwZWQKLQkgKiBsaXN0IGFuZCB0cmFuc2Zvcm1lci4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwoTGlzdDw/IGV4dGVuZHMgRTE+IGxpc3QsIFRyYW5zZm9ybWVyPEUxLCBMaXN0VmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEUxPihsaXN0KSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkLCB1bmNoYW5naW5nLCB3cmFwcGVkCi0JICogbGlzdC4gVXNlIHRoaXMgY29uc3RydWN0b3IgaWY8dWw+Ci0JICogPGxpPiB0aGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsIGFscmVhZHkgY29udGFpbnMgb3RoZXIKLQkgKiAgICAgICBsaXN0IHZhbHVlIG1vZGVscywgb3IKLQkgKiA8bGk+IHlvdSB3YW50IHRvIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKEUxKX0KLQkgKiAgICAgICBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsKEUxLi4uIGxpc3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8RTE+KGxpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCwgdW5jaGFuZ2luZywgd3JhcHBlZAotCSAqIGxpc3QgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbChFMVtdIGxpc3QsIFRyYW5zZm9ybWVyPEUxLCBMaXN0VmFsdWVNb2RlbDxFMj4+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPEUxPihsaXN0KSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkQ29tcG9uZW50TFZNTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVMaXN0VmFsdWVNb2RlbC50aGlzLmNvbXBvbmVudEl0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRJdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50SXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsLnRoaXMuY29tcG9uZW50TGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwudGhpcy5jb21wb25lbnRMaXN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb21wb25lbnQgTFZNIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgRTIgZ2V0KGludCBpbmRleCkgewotCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID49IHRoaXMuc2l6ZSkpIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogIiArIHRoaXMuc2l6ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCS8vIG1vdmUgYmFja3dhcmRzIHRocm91Z2ggdGhlIGluZm8gbGlzdAotCQlmb3IgKGludCBpID0gdGhpcy5pbmZvTGlzdC5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoaSk7Ci0JCQlpZiAoaW5kZXggPj0gaW5mby5iZWdpbikgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmdldChpbmRleCAtIGluZm8uYmVnaW4pOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgIC8vIHNvbWV0aGluZyBpcyB3YWNrCi0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEUyPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFMj4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPEUyPih0aGlzLmJ1aWxkTGlzdHNJdGVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxMaXN0SXRlcmF0b3I8RTI+PiBidWlsZExpc3RzSXRlcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPEluZm8sIExpc3RJdGVyYXRvcjxFMj4+KHRoaXMuaW5mb0xpc3QubGlzdEl0ZXJhdG9yKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxFMj4gdHJhbnNmb3JtKEluZm8gaW5mbykgewotCQkJCXJldHVybiBpbmZvLml0ZW1zLmxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2l6ZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkodGhpcy5saXN0SXRlcmF0b3IoKSwgdGhpcy5zaXplKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWxXcmFwcGVyIG92ZXJyaWRlcy9pbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggb3VyIGNhY2hlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGxpc3QsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcygwLCB0aGlzLmxpc3RIb2xkZXIsIHRoaXMubGlzdEhvbGRlci5zaXplKCksIGZhbHNlKTsgIC8vIGZhbHNlID0gZG8gbm90IGZpcmUgZXZlbnQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGNvbXBvbmVudCBMVk1zLi4uCi0JCWZvciAoSW5mbyBpbmZvIDogdGhpcy5pbmZvTGlzdCkgewotCQkJaW5mby5jb21wb25lbnRMVk0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfVkFMVUVTLCB0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyKTsKLQkJfQotCQkvLyAuLi5hbmQgY2xlYXIgdGhlIGNhY2hlCi0JCXRoaXMuaW5mb0xpc3QuY2xlYXIoKTsKLQkJdGhpcy5zaXplID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgYWRkZWQ7IHVwZGF0ZSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5hZGRDb21wb25lbnRTb3VyY2VzKGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIEFkZCBpbmZvcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgc291cmNlcyB0byBvdXIgY2FjaGUuCi0JICogRmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQgaWYgcmVxdWVzdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZENvbXBvbmVudFNvdXJjZXMoaW50IGFkZGVkU291cmNlc0luZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IGFkZGVkU291cmNlcywgaW50IGFkZGVkU291cmNlc1NpemUsIGJvb2xlYW4gZmlyZUV2ZW50KSB7Ci0JCUFycmF5TGlzdDxJbmZvPiBuZXdJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW5mbz4oYWRkZWRTb3VyY2VzU2l6ZSk7Ci0JCS8vIHRoZSAnaXRlbXMnIGFyZSBlaXRoZXIgdGFja2VkIG9uIHRvIHRoZSBlbmQgb3IKLQkJLy8gYXQgdGhlICdiZWdpbicgaW5kZXggb2YgdGhlIGZpcnN0ICdpbmZvJyB0aGF0IGlzIGJlaW5nIHB1c2hlZCBiYWNrCi0JCWludCBuZXdJdGVtc0luZGV4ID0gKGFkZGVkU291cmNlc0luZGV4ID09IHRoaXMuaW5mb0xpc3Quc2l6ZSgpKSA/IHRoaXMuc2l6ZSA6IHRoaXMuaW5mb0xpc3QuZ2V0KGFkZGVkU291cmNlc0luZGV4KS5iZWdpbjsKLQotCQlpbnQgYmVnaW4gPSBuZXdJdGVtc0luZGV4OwotCQlmb3IgKEUxIHNvdXJjZSA6IGFkZGVkU291cmNlcykgewotCQkJTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZSk7Ci0JCQljb21wb25lbnRMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfVkFMVUVTLCB0aGlzLmNvbXBvbmVudExWTUxpc3RlbmVyKTsKLQkJCUFycmF5TGlzdDxFMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihjb21wb25lbnRMVk0uc2l6ZSgpKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoaXRlbXMsIGNvbXBvbmVudExWTS5saXN0SXRlcmF0b3IoKSk7Ci0JCQluZXdJbmZvTGlzdC5hZGQobmV3IEluZm8oc291cmNlLCBjb21wb25lbnRMVk0sIGl0ZW1zLCBiZWdpbikpOwotCQkJYmVnaW4gKz0gaXRlbXMuc2l6ZSgpOwotCQl9Ci0JCXRoaXMuaW5mb0xpc3QuYWRkQWxsKGFkZGVkU291cmNlc0luZGV4LCBuZXdJbmZvTGlzdCk7Ci0JCWludCBuZXdJdGVtc1NpemUgPSBiZWdpbiAtIG5ld0l0ZW1zSW5kZXg7Ci0JCXRoaXMuc2l6ZSArPSBuZXdJdGVtc1NpemU7Ci0KLQkJLy8gYnVtcCB0aGUgJ2JlZ2luJyBpbmRleCBmb3IgYWxsIHRoZSBpbmZvcyB0aGF0IHdlcmUgcHVzaGVkIGJhY2sgYnkgdGhlIGluc2VydAotCQlpbnQgbW92ZWRJbmZvc0luZGV4ID0gYWRkZWRTb3VyY2VzSW5kZXggKyBhZGRlZFNvdXJjZXNTaXplOwotCQlmb3IgKGludCBpID0gbW92ZWRJbmZvc0luZGV4OyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gKz0gbmV3SXRlbXNTaXplOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJQXJyYXlMaXN0PEUyPiBuZXdJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KG5ld0l0ZW1zU2l6ZSk7Ci0JCQlmb3IgKGludCBpID0gYWRkZWRTb3VyY2VzSW5kZXg7IGkgPCBtb3ZlZEluZm9zSW5kZXg7IGkrKykgewotCQkJCW5ld0l0ZW1zLmFkZEFsbCh0aGlzLmluZm9MaXN0LmdldChpKS5pdGVtcyk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfVkFMVUVTLCBuZXdJdGVtc0luZGV4LCBuZXdJdGVtcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgcmVtb3ZlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCBldmVudC5nZXRJdGVtc1NpemUoKSwgdHJ1ZSk7ICAvLyB0cnVlID0gZmlyZSBldmVudAotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgaW5mb3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIHNvdXJjZXMgZnJvbSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29tcG9uZW50U291cmNlcyhpbnQgcmVtb3ZlZFNvdXJjZXNJbmRleCwgaW50IHJlbW92ZWRTb3VyY2VzU2l6ZSwgYm9vbGVhbiBmaXJlRXZlbnQpIHsKLQkJaW50IHJlbW92ZWRJdGVtc0luZGV4ID0gdGhpcy5pbmZvTGlzdC5nZXQocmVtb3ZlZFNvdXJjZXNJbmRleCkuYmVnaW47Ci0JCWludCBtb3ZlZFNvdXJjZXNJbmRleCA9IHJlbW92ZWRTb3VyY2VzSW5kZXggKyByZW1vdmVkU291cmNlc1NpemU7Ci0JCWludCBtb3ZlZEl0ZW1zSW5kZXggPSAobW92ZWRTb3VyY2VzSW5kZXggPT0gdGhpcy5pbmZvTGlzdC5zaXplKCkpID8gdGhpcy5zaXplIDogdGhpcy5pbmZvTGlzdC5nZXQobW92ZWRTb3VyY2VzSW5kZXgpLmJlZ2luOwotCQlpbnQgcmVtb3ZlZEl0ZW1zU2l6ZSA9IG1vdmVkSXRlbXNJbmRleCAtIHJlbW92ZWRJdGVtc0luZGV4OwotCQl0aGlzLnNpemUgLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQotCQlMaXN0PEluZm8+IHN1Ykxpc3QgPSB0aGlzLmluZm9MaXN0LnN1Ykxpc3QocmVtb3ZlZFNvdXJjZXNJbmRleCwgcmVtb3ZlZFNvdXJjZXNJbmRleCArIHJlbW92ZWRTb3VyY2VzU2l6ZSk7Ci0JCUFycmF5TGlzdDxJbmZvPiByZW1vdmVkSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0PEluZm8+KHN1Ykxpc3QpOyAgLy8gbWFrZSBhIGNvcHkKLQkJc3ViTGlzdC5jbGVhcigpOwotCi0JCS8vIGRlY3JlbWVudCB0aGUgJ2JlZ2luJyBpbmRleCBmb3IgYWxsIHRoZSBpbmZvcyB0aGF0IHdlcmUgbW92ZWQgZm9yd2FyZCBieSB0aGUgZGVsZXRlcwotCQlmb3IgKGludCBpID0gcmVtb3ZlZFNvdXJjZXNJbmRleDsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luIC09IHJlbW92ZWRJdGVtc1NpemU7Ci0JCX0KLQotCQlmb3IgKEluZm8gcmVtb3ZlZEluZm8gOiByZW1vdmVkSW5mb0xpc3QpIHsKLQkJCXJlbW92ZWRJbmZvLmNvbXBvbmVudExWTS5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9WQUxVRVMsIHRoaXMuY29tcG9uZW50TFZNTGlzdGVuZXIpOwotCQl9Ci0KLQkJaWYgKGZpcmVFdmVudCkgewotCQkJQXJyYXlMaXN0PEUyPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihyZW1vdmVkSXRlbXNTaXplKTsKLQkJCWZvciAoSW5mbyByZW1vdmVkSW5mbyA6IHJlbW92ZWRJbmZvTGlzdCkgewotCQkJCXJlbW92ZWRJdGVtcy5hZGRBbGwocmVtb3ZlZEluZm8uaXRlbXMpOwotCQkJfQotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKExJU1RfVkFMVUVTLCByZW1vdmVkSXRlbXNJbmRleCwgcmVtb3ZlZEl0ZW1zKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNvbWUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSByZXBsYWNlZDsgdXBkYXRlIG91ciBjYWNoZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZXBsYWNlQ29tcG9uZW50U291cmNlcyhldmVudC5nZXRJbmRleCgpLCB0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlZCBjb21wb25lbnQgc291cmNlcyB3aWxsIG5vdCAodHlwaWNhbGx5KSBtYXAgdG8gYSBzZXQgb2YgcmVwbGFjZWQKLQkgKiBpdGVtcywgc28gd2UgcmVtb3ZlIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgbGlzdHMgb2YgaXRlbXMsIHJlc3VsdGluZyBpbgotCSAqIHR3byBldmVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZUNvbXBvbmVudFNvdXJjZXMoaW50IHJlcGxhY2VkU291cmNlc0luZGV4LCBJdGVyYWJsZTw/IGV4dGVuZHMgRTE+IG5ld1NvdXJjZXMsIGludCByZXBsYWNlZFNvdXJjZXNTaXplLCBib29sZWFuIGZpcmVFdmVudCkgewotCQl0aGlzLnJlbW92ZUNvbXBvbmVudFNvdXJjZXMocmVwbGFjZWRTb3VyY2VzSW5kZXgsIHJlcGxhY2VkU291cmNlc1NpemUsIGZpcmVFdmVudCk7Ci0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhyZXBsYWNlZFNvdXJjZXNJbmRleCwgbmV3U291cmNlcywgcmVwbGFjZWRTb3VyY2VzU2l6ZSwgZmlyZUV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBTb21lIGNvbXBvbmVudCBzb3VyY2VzIHdlcmUgbW92ZWQ7IHVwZGF0ZSBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW92ZUNvbXBvbmVudFNvdXJjZXMoZXZlbnQuZ2V0VGFyZ2V0SW5kZXgoKSwgZXZlbnQuZ2V0U291cmNlSW5kZXgoKSwgZXZlbnQuZ2V0TGVuZ3RoKCksIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQ29tcG9uZW50U291cmNlcyhpbnQgdGFyZ2V0U291cmNlc0luZGV4LCBpbnQgc291cmNlU291cmNlc0luZGV4LCBpbnQgbW92ZWRTb3VyY2VzTGVuZ3RoLCBib29sZWFuIGZpcmVFdmVudCkgewotCQlpbnQgc291cmNlSXRlbXNJbmRleCA9IHRoaXMuaW5mb0xpc3QuZ2V0KHNvdXJjZVNvdXJjZXNJbmRleCkuYmVnaW47Ci0KLQkJaW50IG5leHRTb3VyY2VTb3VyY2VJbmRleCA9IHNvdXJjZVNvdXJjZXNJbmRleCArIG1vdmVkU291cmNlc0xlbmd0aDsKLQkJaW50IG5leHRTb3VyY2VJdGVtSW5kZXggPSAobmV4dFNvdXJjZVNvdXJjZUluZGV4ID09IHRoaXMuaW5mb0xpc3Quc2l6ZSgpKSA/IHRoaXMuc2l6ZSA6IHRoaXMuaW5mb0xpc3QuZ2V0KG5leHRTb3VyY2VTb3VyY2VJbmRleCkuYmVnaW47Ci0JCWludCBtb3ZlSXRlbXNMZW5ndGggPSBuZXh0U291cmNlSXRlbUluZGV4IC0gc291cmNlSXRlbXNJbmRleDsKLQotCQlpbnQgdGFyZ2V0SXRlbXNJbmRleCA9IC0xOwotCQlpZiAoc291cmNlU291cmNlc0luZGV4ID4gdGFyZ2V0U291cmNlc0luZGV4KSB7Ci0JCQkvLyBtb3ZlIGZyb20gaGlnaCB0byBsb3cgaW5kZXgKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSB0aGlzLmluZm9MaXN0LmdldCh0YXJnZXRTb3VyY2VzSW5kZXgpLmJlZ2luOwotCQl9IGVsc2UgewotCQkJLy8gbW92ZSBmcm9tIGxvdyB0byBoaWdoIGluZGV4IChoaWdoZXIgaXRlbXMgbW92ZSBkb3duIGR1cmluZyBtb3ZlKQotCQkJaW50IG5leHRUYXJnZXRTb3VyY2VJbmRleCA9IHRhcmdldFNvdXJjZXNJbmRleCArIG1vdmVkU291cmNlc0xlbmd0aDsKLQkJCXRhcmdldEl0ZW1zSW5kZXggPSAobmV4dFRhcmdldFNvdXJjZUluZGV4ID09IHRoaXMuaW5mb0xpc3Quc2l6ZSgpKSA/IHRoaXMuc2l6ZSA6IHRoaXMuaW5mb0xpc3QuZ2V0KG5leHRUYXJnZXRTb3VyY2VJbmRleCkuYmVnaW47Ci0JCQl0YXJnZXRJdGVtc0luZGV4ID0gdGFyZ2V0SXRlbXNJbmRleCAtIG1vdmVJdGVtc0xlbmd0aDsKLQkJfQotCi0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuaW5mb0xpc3QsIHRhcmdldFNvdXJjZXNJbmRleCwgc291cmNlU291cmNlc0luZGV4LCBtb3ZlZFNvdXJjZXNMZW5ndGgpOwotCi0JCS8vIHVwZGF0ZSB0aGUgJ2JlZ2luJyBpbmRleGVzIG9mIGFsbCB0aGUgYWZmZWN0ZWQgJ2luZm9zJwotCQlpbnQgbWluID0gTWF0aC5taW4odGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgpOwotCQlpbnQgbWF4ID0gTWF0aC5tYXgodGFyZ2V0U291cmNlc0luZGV4LCBzb3VyY2VTb3VyY2VzSW5kZXgpICsgbW92ZWRTb3VyY2VzTGVuZ3RoOwotCQlpbnQgYmVnaW4gPSBNYXRoLm1pbih0YXJnZXRJdGVtc0luZGV4LCBzb3VyY2VJdGVtc0luZGV4KTsKLQkJZm9yIChpbnQgaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7Ci0JCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChpKTsKLQkJCWluZm8uYmVnaW4gPSBiZWdpbjsKLQkJCWJlZ2luICs9IGluZm8uY29tcG9uZW50TFZNLnNpemUoKTsKLQkJfQotCi0JCWlmIChmaXJlRXZlbnQpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQoTElTVF9WQUxVRVMsIHRhcmdldEl0ZW1zSW5kZXgsIHNvdXJjZUl0ZW1zSW5kZXgsIG1vdmVJdGVtc0xlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29tcG9uZW50IHNvdXJjZXMgd2VyZSBjbGVhcmVkOyBjbGVhciBvdXIgY2FjaGUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbXBvbmVudFNvdXJjZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhckNvbXBvbmVudFNvdXJjZXMoKSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50U291cmNlcygwLCB0aGlzLmluZm9MaXN0LnNpemUoKSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBkbyBub3QgZmlyZSBldmVudAotCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbXBvbmVudCBzb3VyY2VzIGNoYW5nZWQ7IHJlYnVpbGQgb3VyIGNhY2hlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlpbnQgbmV3U2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmIChuZXdTaXplID09IDApIHsKLQkJCXRoaXMuY2xlYXJDb21wb25lbnRTb3VyY2VzKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2xkU2l6ZSA9IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOwotCQlpZiAob2xkU2l6ZSA9PSAwKSB7Ci0JCQl0aGlzLmFkZENvbXBvbmVudFNvdXJjZXMoMCwgdGhpcy5saXN0SG9sZGVyLCBuZXdTaXplLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgbWluID0gTWF0aC5taW4obmV3U2l6ZSwgb2xkU2l6ZSk7Ci0JCS8vIGhhbmRsZSByZXBsYWNlZCBzb3VyY2VzIGluZGl2aWR1YWxseSBzbyB3ZSBkb24ndCBmaXJlIGV2ZW50cyBmb3IgdW5jaGFuZ2VkIHNvdXJjZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW47IGkrKykgewotCQkJRTEgbmV3U291cmNlID0gdGhpcy5saXN0SG9sZGVyLmdldChpKTsKLQkJCUUxIG9sZFNvdXJjZSA9IHRoaXMuaW5mb0xpc3QuZ2V0KGkpLnNvdXJjZTsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChuZXdTb3VyY2UsIG9sZFNvdXJjZSkpIHsKLQkJCQl0aGlzLnJlcGxhY2VDb21wb25lbnRTb3VyY2VzKGksIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RTE+KG5ld1NvdXJjZSksIDEsIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQkJCX0KLQkJfQotCi0JCWlmIChuZXdTaXplID09IG9sZFNpemUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChuZXdTaXplIDwgb2xkU2l6ZSkgewotCQkJdGhpcy5yZW1vdmVDb21wb25lbnRTb3VyY2VzKG1pbiwgb2xkU2l6ZSAtIG5ld1NpemUsIHRydWUpOyAgLy8gdHJ1ZSA9IGZpcmUgZXZlbnQKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ld1NpemUgPiBvbGRTaXplCi0JCXRoaXMuYWRkQ29tcG9uZW50U291cmNlcyhtaW4sIHRoaXMuYnVpbGRTdWJMaXN0SG9sZGVyKG1pbiksIG5ld1NpemUgLSBvbGRTaXplLCB0cnVlKTsgIC8vIHRydWUgPSBmaXJlIGV2ZW50Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gYnVpbGRTdWJMaXN0SG9sZGVyKGludCBmcm9tSW5kZXgpIHsKLQkJaW50IGxpc3RIb2xkZXJTaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlciwgbGlzdEhvbGRlclNpemUpLnN1Ykxpc3QoZnJvbUluZGV4LCBsaXN0SG9sZGVyU2l6ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gYnVpbGRTdWJMaXN0SG9sZGVyKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCWludCBsaXN0SG9sZGVyU2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCXJldHVybiAoKGZyb21JbmRleCA9PSAwKSAmJiAodG9JbmRleCA9PSBsaXN0SG9sZGVyU2l6ZSkpID8KLQkJCQl0aGlzLmxpc3RIb2xkZXIgOgotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlciwgbGlzdEhvbGRlclNpemUpLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludG8gYSBsaXN0IHZhbHVlIG1vZGVsLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3MgYXMgYW4KLQkgKiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPEUyPiB0cmFuc2Zvcm0oRTEgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZXIudHJhbnNmb3JtKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IExWTS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGluZGV4T2YoTGlzdFZhbHVlTW9kZWw8RTI+IGNvbXBvbmVudExWTSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmICh0aGlzLmluZm9MaXN0LmdldChpKS5jb21wb25lbnRMVk0gPT0gY29tcG9uZW50TFZNKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBjb21wb25lbnQgTFZNOiAiICsgY29tcG9uZW50TFZNKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBldmVudCdzIGNvbXBvbmVudCBMVk0uCi0JICovCi0JcHJvdGVjdGVkIGludCBpbmRleEZvcihMaXN0RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXhPZih0aGlzLmdldENvbXBvbmVudExWTShldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudExWTUluZGV4LCB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCksIGV2ZW50LmdldEluZGV4KCksIHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50SXRlbXMoaW50IGNvbXBvbmVudExWTUluZGV4LCBJbmZvIGluZm8sIGludCBhZGRlZEl0ZW1zSW5kZXgsIEl0ZXJhYmxlPEUyPiBhZGRlZEl0ZW1zLCBpbnQgYWRkZWRJdGVtc1NpemUpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJZm9yIChpbnQgaSA9IGNvbXBvbmVudExWTUluZGV4ICsgMTsgaSA8IHRoaXMuaW5mb0xpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuaW5mb0xpc3QuZ2V0KGkpLmJlZ2luICs9IGFkZGVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSArPSBhZGRlZEl0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChpbmZvLml0ZW1zLCBhZGRlZEl0ZW1zSW5kZXgsIGFkZGVkSXRlbXMsIGFkZGVkSXRlbXNTaXplKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9WQUxVRVMsIGluZm8uYmVnaW4gKyBhZGRlZEl0ZW1zSW5kZXgsIGluZm8uaXRlbXMuc3ViTGlzdChhZGRlZEl0ZW1zSW5kZXgsIGFkZGVkSXRlbXNJbmRleCArIGFkZGVkSXRlbXNTaXplKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdXBkYXRlIHRoZSBhZmZlY3RlZCAnYmVnaW4nIGluZGljZXMKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCWludCByZW1vdmVkSXRlbXNTaXplID0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBjb21wb25lbnRMVk1JbmRleCArIDE7IGkgPCB0aGlzLmluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQl0aGlzLmluZm9MaXN0LmdldChpKS5iZWdpbiAtPSByZW1vdmVkSXRlbXNTaXplOwotCQl9Ci0JCXRoaXMuc2l6ZSAtPSByZW1vdmVkSXRlbXNTaXplOwotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCWludCBpdGVtSW5kZXggPSBldmVudC5nZXRJbmRleCgpOwotCQlpbmZvLml0ZW1zLnN1Ykxpc3QoaXRlbUluZGV4LCBpdGVtSW5kZXggKyBldmVudC5nZXRJdGVtc1NpemUoKSkuY2xlYXIoKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgaW5mby5iZWdpbikpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gb25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHM7Ci0JICogc3luY2hyb25pemUgb3VyIGNhY2hlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBvbmVudEl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBubyBjaGFuZ2VzIHRvIHRoZSAnYmVnaW4nIGluZGljZXMgb3Igc2l6ZQotCi0JCS8vIHN5bmNocm9uaXplIHRoZSBjYWNoZWQgbGlzdAotCQlpbnQgY29tcG9uZW50TFZNSW5kZXggPSB0aGlzLmluZGV4Rm9yKGV2ZW50KTsKLQkJSW5mbyBpbmZvID0gdGhpcy5pbmZvTGlzdC5nZXQoY29tcG9uZW50TFZNSW5kZXgpOwotCQlpbnQgaSA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWZvciAoRTIgaXRlbSA6IHRoaXMuZ2V0Q29tcG9uZW50SXRlbXMoZXZlbnQpKSB7Ci0JCQlpbmZvLml0ZW1zLnNldChpKyssIGl0ZW0pOwotCQl9Ci0KLQkJLy8gdHJhbnNsYXRlIHRoZSBldmVudAotCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luKSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiBvbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0czsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50SXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIGNoYW5nZXMgdG8gdGhlICdiZWdpbicgaW5kaWNlcyBvciBzaXplCi0KLQkJLy8gc3luY2hyb25pemUgdGhlIGNhY2hlZCBsaXN0Ci0JCWludCBjb21wb25lbnRMVk1JbmRleCA9IHRoaXMuaW5kZXhGb3IoZXZlbnQpOwotCQlJbmZvIGluZm8gPSB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKGluZm8uaXRlbXMsIGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpKTsKLQotCQkvLyB0cmFuc2xhdGUgdGhlIGV2ZW50Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIGluZm8uYmVnaW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIGNvbXBvbmVudCBsaXN0cyB3YXMgY2xlYXJlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29tcG9uZW50TGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCXRoaXMuY2xlYXJDb21wb25lbnRMaXN0KGNvbXBvbmVudExWTUluZGV4LCB0aGlzLmluZm9MaXN0LmdldChjb21wb25lbnRMVk1JbmRleCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyQ29tcG9uZW50TGlzdChpbnQgY29tcG9uZW50TFZNSW5kZXgsIEluZm8gaW5mbykgewotCQkvLyB1cGRhdGUgdGhlIGFmZmVjdGVkICdiZWdpbicgaW5kaWNlcwotCQlpbnQgcmVtb3ZlZEl0ZW1zU2l6ZSA9IGluZm8uaXRlbXMuc2l6ZSgpOwotCQlpZiAocmVtb3ZlZEl0ZW1zU2l6ZSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gY29tcG9uZW50TFZNSW5kZXggKyAxOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQkJfQotCQl0aGlzLnNpemUgLT0gcmVtb3ZlZEl0ZW1zU2l6ZTsKLQotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY2FjaGVkIGxpc3QKLQkJQXJyYXlMaXN0PEUyPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KGluZm8uaXRlbXMpOyAgLy8gbWFrZSBhIGNvcHkKLQkJaW5mby5pdGVtcy5jbGVhcigpOwotCi0JCS8vIHRyYW5zbGF0ZSB0aGUgZXZlbnQKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luLCBpdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogT25lIG9mIHRoZSBjb21wb25lbnQgbGlzdHMgY2hhbmdlZDsKLQkgKiBzeW5jaHJvbml6ZSBvdXIgY2FjaGUgYnkgc3luY2hyb25pemluZyB0aGUgYXBwcm9wcmlhdGUKLQkgKiBsaXN0IGFuZCBmaXJpbmcgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjb21wb25lbnRMaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IGNvbXBvbmVudExWTUluZGV4ID0gdGhpcy5pbmRleEZvcihldmVudCk7Ci0JCUluZm8gaW5mbyA9IHRoaXMuaW5mb0xpc3QuZ2V0KGNvbXBvbmVudExWTUluZGV4KTsKLQotCQlpbnQgbmV3SXRlbXNTaXplID0gaW5mby5jb21wb25lbnRMVk0uc2l6ZSgpOwotCQlpZiAobmV3SXRlbXNTaXplID09IDApIHsKLQkJCXRoaXMuY2xlYXJDb21wb25lbnRMaXN0KGNvbXBvbmVudExWTUluZGV4LCBpbmZvKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvbGRJdGVtc1NpemUgPSBpbmZvLml0ZW1zLnNpemUoKTsKLQkJaWYgKG9sZEl0ZW1zU2l6ZSA9PSAwKSB7Ci0JCQl0aGlzLmFkZENvbXBvbmVudEl0ZW1zKGNvbXBvbmVudExWTUluZGV4LCBpbmZvLCAwLCBpbmZvLmNvbXBvbmVudExWTSwgbmV3SXRlbXNTaXplKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBtaW4gPSBNYXRoLm1pbihuZXdJdGVtc1NpemUsIG9sZEl0ZW1zU2l6ZSk7Ci0JCS8vIGhhbmRsZSByZXBsYWNlZCBpdGVtcyBpbmRpdmlkdWFsbHkgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgZm9yIHVuY2hhbmdlZCBpdGVtcwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pbjsgaSsrKSB7Ci0JCQlFMiBuZXdJdGVtID0gaW5mby5jb21wb25lbnRMVk0uZ2V0KGkpOwotCQkJRTIgb2xkSXRlbSA9IGluZm8uaXRlbXMuc2V0KGksIG5ld0l0ZW0pOwotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfVkFMVUVTLCBpbmZvLmJlZ2luICsgaSwgbmV3SXRlbSwgb2xkSXRlbSk7Ci0JCX0KLQotCQlpbnQgZGVsdGEgPSBuZXdJdGVtc1NpemUgLSBvbGRJdGVtc1NpemU7Ci0JCWlmIChkZWx0YSA9PSAwKSB7ICAvLyBuZXdJdGVtc1NpemUgPT0gb2xkSXRlbXNTaXplCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gY29tcG9uZW50TFZNSW5kZXggKyAxOyBpIDwgdGhpcy5pbmZvTGlzdC5zaXplKCk7IGkrKykgewotCQkJdGhpcy5pbmZvTGlzdC5nZXQoaSkuYmVnaW4gKz0gZGVsdGE7Ci0JCX0KLQkJdGhpcy5zaXplICs9IGRlbHRhOwotCi0JCWlmIChkZWx0YSA8IDApIHsgIC8vIG5ld0l0ZW1zU2l6ZSA8IG9sZEl0ZW1zU2l6ZQotCQkJTGlzdDxFMj4gc3ViTGlzdCA9IGluZm8uaXRlbXMuc3ViTGlzdChuZXdJdGVtc1NpemUsIG9sZEl0ZW1zU2l6ZSk7Ci0JCQlBcnJheUxpc3Q8RTI+IHJlbW92ZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RTI+KHN1Ykxpc3QpOyAgLy8gbWFrZSBhIGNvcHkKLQkJCXN1Ykxpc3QuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiArIG5ld0l0ZW1zU2l6ZSwgcmVtb3ZlZEl0ZW1zKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5ld0l0ZW1zU2l6ZSA+IG9sZEl0ZW1zU2l6ZQotCQlBcnJheUxpc3Q8RTI+IGFkZGVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEUyPihkZWx0YSk7Ci0JCWZvciAoaW50IGkgPSBvbGRJdGVtc1NpemU7IGkgPCBuZXdJdGVtc1NpemU7IGkrKykgewotCQkJYWRkZWRJdGVtcy5hZGQoaW5mby5jb21wb25lbnRMVk0uZ2V0KGkpKTsKLQkJfQotCQlpbmZvLml0ZW1zLmFkZEFsbChhZGRlZEl0ZW1zKTsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgaW5mby5iZWdpbiArIG9sZEl0ZW1zU2l6ZSwgYWRkZWRJdGVtcyk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFMj4gZ2V0Q29tcG9uZW50SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RTI+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RTI+IGdldENvbXBvbmVudEl0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFMj4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxFMj4gZ2V0Q29tcG9uZW50TFZNKExpc3RFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RWYWx1ZU1vZGVsPEUyPikgZXZlbnQuZ2V0U291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU0YzA2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLklkZW50aXR5SGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGFkYXB0cyBhCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGhvbGRpbmcgb3RoZXIge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH1zCi0gKiB0byBhIHNpbmdsZSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudDo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY29tcG9uZW50IHZhbHVlcwotICogPC91bD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gbXVzdCBub3QgY29udGFpbiBhbnkgZHVwbGljYXRlcwotICogb3IgdGhpcyBjbGFzcyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbDxWPgotCWV4dGVuZHMgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Vj4KLXsKLQkvKioKLQkgKiBDYWNoZSB0aGUgY29tcG9uZW50IHByb3BlcnR5IHZhbHVlIG1vZGVscyBzbyB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgdG8KLQkgKiB0aGVtIHdoZW4gdGhleSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJZGVudGl0eUhhc2hCYWc8UHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBjb21wb25lbnRQVk1zID0gCi0JCQluZXcgSWRlbnRpdHlIYXNoQmFnPFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4oKTsKLQotCS8qKgotCSAqIExpc3RlbiB0byBldmVyeSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBpbiB0aGUgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKiBJZiBvbmUgY2hhbmdlcywgd2UgbmVlZCB0byByZS1jYWxjdWxhdGUgb3VyIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHRoYXQgaXMgYSBjb21wb3NpdGUgb2YgdGhlIHNwZWNpZmllZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVscy4KLQkgKi8KLQlwdWJsaWMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/Pi4uLiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoQXJyYXlzLmFzTGlzdChjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWxzLgotCSAqLwotCXB1YmxpYyA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsKENvbGxlY3Rpb248RT4gY29sbGVjdGlvbikgewotCQl0aGlzKG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPihjb2xsZWN0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgdGhhdCBpcyBhIGNvbXBvc2l0ZSBvZiB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gY29sbGVjdGlvbk1vZGVsKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Nb2RlbCk7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWwudGhpcy5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJvcGVydHkgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGUgZXZlbnQgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZQotCSAqIHRoZSBwZXJmb3JtYW5jZSBvZiBidWlsZGluZyBhIG5ldyB2YWx1ZSAoZS5nLiBzb21lIHByb3BlcnR5IGNoYW5nZXMgbWF5Ci0JICogbm90IG5lY2Vzc2l0YXRlIHRoZSByZS1jYWxjdWxhdGlvbiBvZiB0aGUgdmFsdWUpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlciBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbF8oKTsKLQkJdGhpcy5hZGRDb21wb25lbnRQVk1zKHRoaXMuZ2V0Q29sbGVjdGlvbk1vZGVsKCkpOwotCX0KLQotCXByb3RlY3RlZCA8RSBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gdm9pZCBhZGRDb21wb25lbnRQVk1zKEl0ZXJhYmxlPEU+IHB2bXMpIHsKLQkJZm9yIChQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gZWFjaCA6IHB2bXMpIHsKLQkJCXRoaXMuY29tcG9uZW50UFZNcy5hZGQoZWFjaCk7Ci0JCQllYWNoLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbF8oKSB7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50UFZNcyh0aGlzLmdldENvbGxlY3Rpb25Nb2RlbCgpKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWxfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFIGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiB2b2lkIHJlbW92ZUNvbXBvbmVudFBWTXMoSXRlcmFibGU8RT4gcHZtcykgewotCQlmb3IgKFByb3BlcnR5VmFsdWVNb2RlbDw/PiBlYWNoIDogcHZtcykgewotCQkJZWFjaC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5jb21wb25lbnRQVk1zLnJlbW92ZShlYWNoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkQ29tcG9uZW50UFZNcyh0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JCXN1cGVyLml0ZW1zQWRkZWQoZXZlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVDb21wb25lbnRQVk1zKHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQkJc3VwZXIuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUFsbENvbXBvbmVudFBWTXMoKTsKLQkJc3VwZXIuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbENvbXBvbmVudFBWTXMoKSB7Ci0JCS8vIGNvcHkgdGhlIGxpc3Qgc28gd2UgZG9uJ3QgZWF0IG91ciBvd24gdGFpbAotCQlBcnJheUxpc3Q8UHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBjb3B5ID0gbmV3IEFycmF5TGlzdDxQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KHRoaXMuY29tcG9uZW50UFZNcyk7Ci0JCXRoaXMucmVtb3ZlQ29tcG9uZW50UFZNcyhjb3B5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVBbGxDb21wb25lbnRQVk1zKCk7Ci0JCXRoaXMuYWRkQ29tcG9uZW50UFZNcyh0aGlzLmdldENvbGxlY3Rpb25Nb2RlbCgpKTsKLQkJc3VwZXIuY29sbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9e0Bjb2RlPD8gZXh0ZW5kcyB9e0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH17QGNvZGU8Pz4+fS4KLQkgKi8KLQkvLyBtaW5pbWl6ZSBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGdldENvbGxlY3Rpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PikgdGhpcy5jb2xsZWN0aW9uTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9yIGFjY2VwdHMgb25seSBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH17QGNvZGU8PyBleHRlbmRzIH17QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTw/Pj59LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PiBnZXRJdGVtcyhDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTw/IGV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsPD8+PikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfXtAY29kZTw/IGV4dGVuZHMgfXtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPD8+Pn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+IGdldEl0ZW1zKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0V4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MDE2MTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyB3cmFwcGVyIGV4dGVuZHMgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IChvciB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9KQotICogd2l0aCBmaXhlZCBjb2xsZWN0aW9ucyBvZiBpdGVtcyBvbiBlaXRoZXIgZW5kLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBCZSBjYXJlZnVsIHVzaW5nIG9yIHdyYXBwaW5nIHRoaXMgbGlzdCB2YWx1ZSBtb2RlbCwgc2luY2UgdGhlCi0gKiAiZXh0ZW5kZWQiIGl0ZW1zIG1heSBiZSB1bmV4cGVjdGVkIGJ5IHRoZSBjbGllbnQgY29kZSBvciB3cmFwcGVyLgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKiogdGhlIGl0ZW1zICJwcmVwZW5kZWQiIHRvIHRoZSB3cmFwcGVkIGxpc3QgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFPiBwcmVmaXg7Ci0KLQkvKiogdGhlIGl0ZW1zICJhcHBlbmRlZCIgdG8gdGhlIHdyYXBwZWQgbGlzdCAqLwotCXByb3RlY3RlZCBMaXN0PEU+IHN1ZmZpeDsKLQotCi0JLy8gKioqKioqKioqKiBsb3RzIG8nIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggYW5kIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdDw/IGV4dGVuZHMgRT4gcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgTGlzdDw/IGV4dGVuZHMgRT4gc3VmZml4KSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IG5ldyBBcnJheUxpc3Q8RT4ocHJlZml4KTsKLQkJdGhpcy5zdWZmaXggPSBuZXcgQXJyYXlMaXN0PEU+KHN1ZmZpeCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRoZSBzcGVjaWZpZWQgbGlzdCB3aXRoIGEgcHJlZml4IGFuZCBzdWZmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKEUgcHJlZml4LCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlciwgRSBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3Q8PyBleHRlbmRzIEU+IHByZWZpeCwgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gbmV3IEFycmF5TGlzdDxFPihwcmVmaXgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHByZWZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoRSBwcmVmaXgsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJlZml4KTsKLQkJdGhpcy5zdWZmaXggPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBzdWZmaXguCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBMaXN0PD8gZXh0ZW5kcyBFPiBzdWZmaXgpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMucHJlZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRoaXMuc3VmZml4ID0gbmV3IEFycmF5TGlzdDxFPihzdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0aGUgc3BlY2lmaWVkIGxpc3Qgd2l0aCBhIHN1ZmZpeC4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIsIEUgc3VmZml4KSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl0aGlzLnN1ZmZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qoc3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdGhlIHNwZWNpZmllZCBsaXN0IHdpdGggYSBwcmVmaXggY29udGFpbmluZyBhIHNpbmdsZSBudWxsIGl0ZW0uCi0JICovCi0JcHVibGljIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByZWZpeCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobnVsbCk7Ci0JCXRoaXMuc3VmZml4ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0SXRlcmF0b3JfKCkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxFPigKLQkJCXRoaXMucHJlZml4Lmxpc3RJdGVyYXRvcigpLAotCQkJdGhpcy5saXN0SG9sZGVyLmxpc3RJdGVyYXRvcigpLAotCQkJdGhpcy5zdWZmaXgubGlzdEl0ZXJhdG9yKCkKLQkJKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCWludCBwcmVmaXhTaXplID0gdGhpcy5wcmVmaXguc2l6ZSgpOwotCQlpZiAoaW5kZXggPCBwcmVmaXhTaXplKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmVmaXguZ2V0KGluZGV4KTsKLQkJfSBlbHNlIGlmIChpbmRleCA+PSBwcmVmaXhTaXplICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSkgewotCQkJcmV0dXJuIHRoaXMuc3VmZml4LmdldChpbmRleCAtIChwcmVmaXhTaXplICsgdGhpcy5saXN0SG9sZGVyLnNpemUoKSkpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXggLSBwcmVmaXhTaXplKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZml4LnNpemUoKSArIHRoaXMubGlzdEhvbGRlci5zaXplKCkgKyB0aGlzLnN1ZmZpeC5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCUFycmF5TGlzdDxFPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLnNpemUoKSk7Ci0JCWxpc3QuYWRkQWxsKHRoaXMucHJlZml4KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkQWxsKHRoaXMuc3VmZml4KTsKLQkJcmV0dXJuIGxpc3QudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24vb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTLCB0aGlzLnByZWZpeC5zaXplKCkpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUywgdGhpcy5wcmVmaXguc2l6ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zTW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMsIHRoaXMucHJlZml4LnNpemUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdCgpKTsgIC8vIG5vdCAiY2xlYXJlZCIKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJU3RyaW5nVG9vbHMuYXBwZW5kKHNiLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoTGlzdDxFPiBwcmVmaXgpIHsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdWZmaXgoTGlzdDxFPiBzdWZmaXgpIHsKLQkJdGhpcy5zdWZmaXggPSBzdWZmaXg7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8RT4gYnVpbGRMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0SXRlcmF0b3JfKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZWZkNGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgRmlsdGVyfQotICogdG8gZGV0ZXJtaW5lIHdoaWNoIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uIGFyZSByZXR1cm5lZCBieSBjYWxscwotICogdG8ge0BsaW5rICNpdGVyYXRvcigpfS4KLSAqIDxwPgotICogVGhlIGZpbHRlciBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZTsgYWxsb3dpbmcgdGhlIHNhbWUKLSAqIGFkYXB0ZXIgdG8gYmUgdXNlZCB3aXRoIGRpZmZlcmVudCBmaWx0ZXIgY3JpdGVyaWEgKGUuZy4gd2hlbiB0aGUgdXNlcgotICogd2FudHMgdG8gdmlldyBhIGxpc3Qgb2YgPGNvZGU+LmphdmE8L2NvZGU+IGZpbGVzKS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gSWYgdGhlIG9iamVjdHMgaW4gdGhlICJmaWx0ZXJlZCIgY29sbGVjdGlvbiBjYW4gY2hhbmdlIGluIHN1Y2ggYSB3YXkKLSAqIHRoYXQgdGhleSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoZSAiZmlsdGVyZWQiIGNvbGxlY3Rpb24sIHlvdSB3aWxsCi0gKiBuZWVkIHRvIHdyYXAgdGhlIG9yaWdpbmFsIGNvbGxlY3Rpb24gaW4gYW4ge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9LgotICogRm9yIGV4YW1wbGUsIGlmIHRoZSBmaWx0ZXIgb25seSAiYWNjZXB0cyIgaXRlbXMgd2hvc2UgbmFtZXMgYmVnaW4KLSAqIHdpdGggIlgiIGFuZCB0aGUgbmFtZXMgb2YgdGhlIGl0ZW1zIGNhbiBjaGFuZ2UsIHlvdSB3aWxsIG5lZWQgdG8KLSAqIHdyYXAgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdW5maWx0ZXJlZCBpdGVtcyB3aXRoIGFuCi0gKiB7QGxpbmsgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0aGF0IGxpc3RlbnMgZm9yIGNoYW5nZXMgdG8gZWFjaAotICogaXRlbSdzIG5hbWUgYW5kIGZpcmVzIHRoZSBhcHByb3ByaWF0ZSBldmVudCB3aGVuZXZlciBhbiBpdGVtJ3MgbmFtZQotICogY2hhbmdlcy4gVGhlIGV2ZW50IHdpbGwgY2F1c2UgdGhpcyB3cmFwcGVyIHRvIHJlLWZpbHRlciB0aGUgY2hhbmdlZAotICogaXRlbSBhbmQgYWRkIG9yIHJlbW92ZSBpdCBmcm9tIHRoZSAiZmlsdGVyZWQiIGNvbGxlY3Rpb24gYXMgYXBwcm9wcmlhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQ29sbGVjdGlvblZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGlzIGZpbHRlcnMgdGhlIGl0ZW1zIGluIHRoZSBuZXN0ZWQgY29sbGVjdGlvbi4gKi8KLQlwcml2YXRlIEZpbHRlcjxFPiBmaWx0ZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhY2NlcHRlZCBieSB0aGUgZmlsdGVyICovCi0JcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEU+IGZpbHRlcmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGFuZCBhIGZpbHRlciB0aGF0IHNpbXBseSBhY2NlcHRzIGV2ZXJ5IG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhjb2xsZWN0aW9uSG9sZGVyLCBGaWx0ZXIuTnVsbC48RT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgZmlsdGVyLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlciwgRmlsdGVyPEU+IGZpbHRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGxpc3QgdmFsdWUgbW9kZWwgYW5kIGEgZmlsdGVyIHRoYXQgc2ltcGx5IGFjY2VwdHMgZXZlcnkgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbChMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyKSB7Ci0JCXRoaXMobmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4obGlzdEhvbGRlcikpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0SG9sZGVyKSwgZmlsdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5maWx0ZXJlZEl0ZW1zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzL2ltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCBvdXIgY2FjaGUgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIG5lc3RlZCBjb2xsZWN0aW9uLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuZmlsdGVyZWRJdGVtcywgdGhpcy5maWx0ZXIodGhpcy5jb2xsZWN0aW9uSG9sZGVyKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY2FjaGUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIGNvbGxlY3Rpb24KLQkJdGhpcy5maWx0ZXJlZEl0ZW1zLmNsZWFyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZmlsdGVyIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmZpbHRlcih0aGlzLmdldEl0ZW1zKGV2ZW50KSksIHRoaXMuZmlsdGVyZWRJdGVtcywgVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvICpub3QqIGZpbHRlciB0aGUgdmFsdWVzLCBiZWNhdXNlIHRoZXkgbWF5IG5vIGxvbmdlciBiZQotCQkvLyAiYWNjZXB0ZWQiIGFuZCB0aGF0IG1pZ2h0IGJlIHdoeSB0aGV5IHdlcmUgcmVtb3ZlZCBpbiB0aGUgZmlyc3QgcGxhY2U7Ci0JCS8vIGFueXdheSwgYW55IGV4dHJhbmVvdXMgaXRlbXMgYXJlIGhhcm1sZXNzCi0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihldmVudC5nZXRJdGVtcygpLCB0aGlzLmZpbHRlcmVkSXRlbXMsIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5maWx0ZXJlZEl0ZW1zLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlYnVpbGRGaWx0ZXJlZEl0ZW1zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2NlbGxhbmVvdXMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSBmaWx0ZXIgYW5kIHJlYnVpbGQgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKEZpbHRlcjxFPiBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JCXRoaXMucmVidWlsZEZpbHRlcmVkSXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmFibGUgdGhhdCBmaWx0ZXJzIHRoZSBzcGVjaWZpZWQgaXRlcmFibGUuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGZpbHRlcihJdGVyYWJsZTw/IGV4dGVuZHMgRT4gaXRlbXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxFPihpdGVtcywgdGhpcy5maWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIG91ciBjYWNoZSB3aXRoIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVidWlsZEZpbHRlcmVkSXRlbXMoKSB7Ci0JCXRoaXMuZmlsdGVyZWRJdGVtcy5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuZmlsdGVyZWRJdGVtcywgdGhpcy5maWx0ZXIodGhpcy5jb2xsZWN0aW9uSG9sZGVyKSk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgdGhpcy5maWx0ZXJlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmZpbHRlcmVkSXRlbXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY5MzU4Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPkZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgRmlsdGVyfQotICogdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgYnkgY2FsbHMKLSAqIHRvIHtAbGluayAjZ2V0VmFsdWUoKX0uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0sIGEgc3ViY2xhc3MKLSAqIGNhbiBvdmVycmlkZSB7QGxpbmsgI2FjY2VwdChUKX0uCi0gKiA8cD4KLSAqIE9uZSwgcG9zc2libHkgdW5kZXNpcmFibGUsIHNpZGUtZWZmZWN0IG9mIHVzaW5nIHRoaXMgdmFsdWUgbW9kZWwgaXMgdGhhdAotICogaXQgbXVzdCByZXR1cm4gKnNvbWV0aGluZyogYXMgdGhlIHZhbHVlLiBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcwotICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IHdoZW5ldmVyIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCAiYWNjZXB0ZWQiLAotICogd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgYW5kL29yIG92ZXJyaWRkZW4gKHtAbGluayAjZ2V0RGVmYXVsdFZhbHVlKCl9KS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxUPgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIEZpbHRlcjxUPiBmaWx0ZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIFQgZGVmYXVsdFZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBmaWx0ZXJpbmcgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB7QGxpbmsgI2FjY2VwdChUKX0KLQkgKiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgRmlsdGVyLkRpc2FibGVkLjxUPmluc3RhbmNlKCksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlLCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUge0BsaW5rICNhY2NlcHQoVCl9Ci0JICogaW5zdGVhZCBvZiBidWlsZGluZyBhIHtAbGluayBGaWx0ZXJ9Ci0JICogPGVtPmFuZDwvZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkKLQkgKiBhIGRlZmF1bHQgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gdmFsdWVIb2xkZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEZpbHRlci5EaXNhYmxlZC48VD5pbnN0YW5jZSgpLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGZpbHRlci4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlciwgRmlsdGVyPFQ+IGZpbHRlcikgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBmaWx0ZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwsIGZpbHRlciwgYW5kIGRlZmF1bHQgdmFsdWUuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHZhbHVlSG9sZGVyLCBGaWx0ZXI8VD4gZmlsdGVyLCBUIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJWYWx1ZSh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZpbHRlciB0aGUgdmFsdWVzIGJlZm9yZSBwcm9wYWdhdGluZyB0aGUgY2hhbmdlIGV2ZW50Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlUIGV2ZW50T2xkVmFsdWUgPSAoVCkgZXZlbnQuZ2V0T2xkVmFsdWUoKTsKLQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5maWx0ZXJWYWx1ZShldmVudE9sZFZhbHVlKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVQgZXZlbnROZXdWYWx1ZSA9IChUKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQlPYmplY3QgbmV3VmFsdWUgPSB0aGlzLmZpbHRlclZhbHVlKGV2ZW50TmV3VmFsdWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyAiYWNjZXB0ZWQiIHNpbXBseSByZXR1cm4gaXQsCi0JICogb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVCBmaWx0ZXJWYWx1ZShUIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFjY2VwdCh2YWx1ZSkgPyB2YWx1ZSA6IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZpbHRlcmluZyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBzaG91bGQKLQkgKiByZXR1cm4gdGhlIHNwZWNpZmllZCB2YWx1ZSBmcm9tIGEgY2FsbCB0bwotCSAqIHtAbGluayAjZ2V0VmFsdWUoKX07IHRoZSB2YWx1ZSBjYW1lCi0JICogZnJvbSB0aGUgbmVzdGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEZpbHRlcn0uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyLmFjY2VwdCh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgaWYKLQkgKiB0aGUgbmVzdGVkIHZhbHVlIHdhcyByZWplY3RlZCBieSB0aGUgZmlsdGVyLgotCSAqIFRoZSBkZWZhdWx0IGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBUIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlYWMwZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgPGNvZGU+RmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgQmlkaUZpbHRlcn0KLSAqIHRvIGRldGVybWluZSB3aGVuIHRoZSB3cmFwcGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkIGJ5IGNhbGxzCi0gKiB0byB7QGxpbmsgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsI2dldFZhbHVlKCkgZ2V0VmFsdWUoKX0gYW5kIG1vZGlmaWVkIGJ5IGNhbGxzIHRvCi0gKiB7QGxpbmsgI3NldFZhbHVlKFQpfS4KLSAqIDxwPgotICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0sIGEgc3ViY2xhc3MKLSAqIGNhbiBvdmVycmlkZSB7QGxpbmsgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsI2FjY2VwdChUKSBhY2NlcHQoVCl9IGFuZCB7QGxpbmsgI3JldmVyc2VBY2NlcHQoVCl9LgotICogPHA+Ci0gKiBPbmUsIHBvc3NpYmx5IHVuZGVzaXJhYmxlLCBzaWRlLWVmZmVjdCBvZiB1c2luZyB0aGlzIHZhbHVlIG1vZGVsIGlzIHRoYXQKLSAqIGl0IG11c3QgcmV0dXJuICpzb21ldGhpbmcqIGFzIHRoZSB2YWx1ZS4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMKLSAqIHRvIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuZXZlciB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgImFjY2VwdGVkIiwKLSAqIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIGFuZC9vciBvdmVycmlkZGVuICh7QGxpbmsgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsI2dldERlZmF1bHRWYWx1ZSgpIGdldERlZmF1bHRWYWx1ZSgpfSkuCi0gKiA8cD4KLSAqIFNpbWlsYXJseSwgaWYgYW4gaW5jb21pbmcgdmFsdWUgaXMgbm90ICJyZXZlcnNlIGFjY2VwdGVkIiwgPGVtPm5vdGhpbmc8L2VtPgotICogd2lsbCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIsIG5vdCBldmVuIDxjb2RlPm51bGw8L2NvZGU+LgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxUPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBhbmQgYSBkaXNhYmxlZCBmaWx0ZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI2FjY2VwdChUKX0gYW5kIHtAbGluayAjcmV2ZXJzZUFjY2VwdChUKX0KLQkgKiBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlGaWx0ZXJ9LgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIEZpbHRlcmluZ1dyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXIuRGlzYWJsZWQuPFQ+aW5zdGFuY2UoKSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgZmlsdGVyaW5nIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUsIGFuZCBhIGRpc2FibGVkIGZpbHRlci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjYWNjZXB0KFQpfSBhbmQge0BsaW5rICNyZXZlcnNlQWNjZXB0KFQpfQotCSAqIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgQmlkaUZpbHRlcn0uCi0JICogPGVtPmFuZDwvZW0+IHlvdSBuZWVkIHRvIHNwZWNpZnkKLQkgKiBhIGRlZmF1bHQgdmFsdWUgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIFQgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXIuRGlzYWJsZWQuPFQ+aW5zdGFuY2UoKSwgZGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5lc3RlZAotCSAqIHByb3BlcnR5IHZhbHVlIG1vZGVsIGFuZCBmaWx0ZXIuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXI8VD4gZmlsdGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIGZpbHRlciwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgZmlsdGVyLCBhbmQgZGVmYXVsdCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gdmFsdWVIb2xkZXIsIEJpZGlGaWx0ZXI8VD4gZmlsdGVyLCBUIGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgZmlsdGVyLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCWlmICh0aGlzLnJldmVyc2VBY2NlcHQodmFsdWUpKSB7Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZpbHRlcmluZyB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbAotCSAqIHNob3VsZCBwYXNzIHRocm91Z2ggdGhlIHNwZWNpZmllZCB2YWx1ZSB0byB0aGUgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgaW4gYSBjYWxsIHRvCi0JICoge0BsaW5rICNzZXRWYWx1ZShUKX0uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYSBzdWJjbGFzcyBhcyBhbgotCSAqIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlGaWx0ZXJ9LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJldmVyc2VBY2NlcHQoVCB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5nZXRGaWx0ZXIoKS5yZXZlcnNlQWNjZXB0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBPdXIgY29uc3RydWN0b3IgYWNjZXB0cyBvbmx5IGEge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfXtAY29kZTxUPn0uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSBiaWRpcmVjdGlvbmFsIGZpbHRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQmlkaUZpbHRlcjxUPiBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiAoQmlkaUZpbHRlcjxUPikgdGhpcy5maWx0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZjgxODMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUludFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogQWJzdHJhY3QgbGlzdCB2YWx1ZSBtb2RlbCB0aGF0IHByb3ZpZGVzIGJlaGF2aW9yIGZvciB3cmFwcGluZyBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIChvciB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9KSBhbmQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIGFzcGVjdHMgb2YgdGhlCi0gKiA8ZW0+aXRlbXM8L2VtPiBoZWxkIGJ5IHRoZSBsaXN0IChvciBjb2xsZWN0aW9uKS4gQ2hhbmdlcyB0byB0aGUgYWN0dWFsIGxpc3QKLSAqIChvciBjb2xsZWN0aW9uKSBhcmUgYWxzbyBtb25pdG9yZWQuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGEgY29sbGVjdGlvbiBvZiBpdGVtcyB0aGF0IGNhbiBiZSBtb2RpZmllZCBieSBhZGRpbmcKLSAqIG9yIHJlbW92aW5nIGl0ZW1zIG9yIHRoZSBpdGVtcyB0aGVtc2VsdmVzIG1pZ2h0IGNoYW5nZSBpbiBhIGZhc2hpb24gdGhhdAotICogbWlnaHQgY2hhbmdlIHRoZSBsaXN0IG9yIGNvbGxlY3Rpb24ncyBleHRlcm5hbCBhcHBlYXJhbmNlLgotICogCi0gKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdHdvIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlSXRlbV8oTW9kZWwpfTxwPgotICogICAgIGJlZ2luIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSBzcGVjaWZpZWQgaXRlbSBhbmQgY2FsbAotICogICAgIHtAbGluayAjaXRlbUFzcGVjdENoYW5nZWQoRXZlbnRPYmplY3QpfSB3aGVuZXZlciB0aGUgYXNwZWN0IGNoYW5nZXMKLSAqIDxsaT57QGxpbmsgI2Rpc2VuZ2FnZUl0ZW1fKE1vZGVsKX08cD4KLSAqICAgICBzdG9wIGxpc3RlbmluZyB0byB0aGUgYXBwcm9wcmlhdGUgYXNwZWN0IG9mIHRoZSBzcGVjaWZpZWQgaXRlbQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIE1haW50YWluIGEgY291bnRlciBmb3IgZWFjaCBvZiB0aGUgaXRlbXMgaW4gdGhlCi0JICogd3JhcHBlZCBsaXN0IGhvbGRlciB3ZSBhcmUgbGlzdGVuaW5nIHRvLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJZGVudGl0eUhhc2hNYXA8RSwgU2ltcGxlSW50UmVmZXJlbmNlPiBjb3VudGVyczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHJvdGVjdGVkIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY291bnRlcnMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPEUsIFNpbXBsZUludFJlZmVyZW5jZT4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcykgewotCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7Ci0JCQl0aGlzLmVuZ2FnZUl0ZW0oaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtKEUgaXRlbSkgewotCQkvLyBsaXN0ZW4gdG8gZWFjaCBpdGVtIG9ubHkgb25jZQotCQlTaW1wbGVJbnRSZWZlcmVuY2UgY291bnRlciA9IHRoaXMuY291bnRlcnMuZ2V0KGl0ZW0pOwotCQlpZiAoY291bnRlciA9PSBudWxsKSB7Ci0JCQljb3VudGVyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQkJdGhpcy5jb3VudGVycy5wdXQoaXRlbSwgY291bnRlcik7Ci0JCQl0aGlzLmVuZ2FnZUl0ZW1fKChNb2RlbCkgaXRlbSk7Ci0JCX0KLQkJY291bnRlci5pbmNyZW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHNwZWNpZmllZCBpdGVtLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pOwotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyIGFuZCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsSXRlbXMoKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VBbGxJdGVtcygpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLmxpc3RIb2xkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBpdGVtcykgewotCQlmb3IgKEUgaXRlbSA6IGl0ZW1zKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZUl0ZW0oaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtKEUgaXRlbSkgewotCQkvLyBzdG9wIGxpc3RlbmluZyB0byBlYWNoIGl0ZW0gb25seSBvbmNlCi0JCVNpbXBsZUludFJlZmVyZW5jZSBjb3VudGVyID0gdGhpcy5jb3VudGVycy5nZXQoaXRlbSk7Ci0JCWlmIChjb3VudGVyID09IG51bGwpIHsKLQkJCS8vIHNvbWV0aGluZyBpcyB3cm9uZyBpZiB0aGlzIGhhcHBlbnMuLi4gIH5ianYKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgY291bnRlcjogIiArIGl0ZW0pOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGNvdW50ZXIuZGVjcmVtZW50KCkgPT0gMCkgewotCQkJdGhpcy5jb3VudGVycy5yZW1vdmUoaXRlbSk7Ci0JCQl0aGlzLmRpc2VuZ2FnZUl0ZW1fKChNb2RlbCkgaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgc3BlY2lmaWVkIGl0ZW0uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBGb3J3YXJkIHRoZSBldmVudCBhbmQgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc0FkZGVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuZW5nYWdlSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCkpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIHJlcGxhY2VkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByZW1vdmVkIGl0ZW1zLCBmb3J3YXJkIHRoZSBldmVudCwKLQkgKiBhbmQgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhZGRlZCBpdGVtcy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyh0aGlzLmdldE9sZEl0ZW1zKGV2ZW50KSk7Ci0JCS8vIHJlLWZpcmUgZXZlbnQgd2l0aCB0aGUgd3JhcHBlciBhcyB0aGUgc291cmNlCi0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5lbmdhZ2VJdGVtcyh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlci4KLQkgKiBObyBuZWVkIHRvIGNoYW5nZSBhbnkgbGlzdGVuZXJzOyBqdXN0IGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVJdGVtc01vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQuCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHJlbW92ZWQgaXRlbXMgYW5kIGZvcndhcmQgdGhlIGV2ZW50LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIHdlIHNob3VsZCBvbmx5IG5lZWQgdG8gZGlzZW5nYWdlIGVhY2ggaXRlbSBvbmNlLi4uCi0JCS8vIG1ha2UgYSBjb3B5IHRvIHByZXZlbnQgYSBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uCi0JCUNvbGxlY3Rpb248RT4ga2V5cyA9IG5ldyBBcnJheUxpc3Q8RT4odGhpcy5jb3VudGVycy5rZXlTZXQoKSk7Ci0JCXRoaXMuZGlzZW5nYWdlSXRlbXMoa2V5cyk7Ci0JCXRoaXMuY291bnRlcnMuY2xlYXIoKTsKLQkJLy8gcmUtZmlyZSBldmVudCB3aXRoIHRoZSB3cmFwcGVyIGFzIHRoZSBzb3VyY2UKLQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWNvbmZpZ3VyZSBvdXIgbGlzdGVuZXJzIGFuZCBmb3J3YXJkIHRoZSBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBkaXNlbmdhZ2UgZWFjaCBpdGVtIG9uY2UuLi4KLQkJLy8gbWFrZSBhIGNvcHkgdG8gcHJldmVudCBhIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KLQkJQ29sbGVjdGlvbjxFPiBrZXlzID0gbmV3IEFycmF5TGlzdDxFPih0aGlzLmNvdW50ZXJzLmtleVNldCgpKTsKLQkJdGhpcy5kaXNlbmdhZ2VJdGVtcyhrZXlzKTsKLQkJdGhpcy5jb3VudGVycy5jbGVhcigpOwotCQkvLyByZS1maXJlIGV2ZW50IHdpdGggdGhlIHdyYXBwZXIgYXMgdGhlIHNvdXJjZQotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JCXRoaXMuZW5nYWdlQWxsSXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaXRlbSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIGl0ZW0gaGFzIGEgYm91bmQgcHJvcGVydHkgdGhhdCBoYXMgY2hhbmdlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2UuIFRoZSBsaXN0ZW5lcnMgd2lsbCBoYXZlIHRvIGRldGVybWluZQotCSAqIHdoZXRoZXIgdGhlIGl0ZW0gYXNwZWN0IGNoYW5nZSBpcyBzaWduaWZpY2FudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtQXNwZWN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRXZlbnRPYmplY3QgZXZlbnQpIHsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlciwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY4MTdiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1DaGFuZ2VMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlNpbXBsZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBhbGwgb2YgdGhlIGNoYW5nZXMKLSAqIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlTGlzdGVuZXIgaXRlbUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtcy4KLQkgKi8KLQlwdWJsaWMgSXRlbUNoYW5nZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLml0ZW1DaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ2hhbmdlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJaXRlbS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLml0ZW1DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlpdGVtLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuaXRlbUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDc5NzM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgY29sbGVjdGlvbgotICogYXNwZWN0cyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0KLQkvKiogVGhlIG5hbWVzIG9mIHRoZSBpdGVtcycgY29sbGVjdGlvbnMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGl0ZW1Db2xsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY29sbGVjdGlvbk5hbWVzID0gY29sbGVjdGlvbk5hbWVzOwotCQl0aGlzLml0ZW1Db2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbUNvbGxlY3Rpb25MaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gQ29sbGVjdGlvbnMuCi0JICovCi0JcHVibGljIEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBjb2xsZWN0aW9uTmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgY29sbGVjdGlvbk5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgYSBDb2xsZWN0aW9uIGFzcGVjdCBoYXMgCi0JICogY2hhbmdlZC4gIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1Db2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gY29sbGVjdGlvbiBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJaXRlbS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMuaXRlbUNvbGxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCWl0ZW0ucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLml0ZW1Db2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljYWMyYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIGxpc3QKLSAqIGFzcGVjdHMgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgc3ViamVjdCdzIGxpc3RzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSBsaXN0TmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBpdGVtTGlzdExpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBpdGVtIExpc3QgYXNwZWN0cy4KLQkgKi8KLQlwdWJsaWMgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlciwgU3RyaW5nLi4uIGxpc3ROYW1lcykgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy5saXN0TmFtZXMgPSBsaXN0TmFtZXM7Ci0JCXRoaXMuaXRlbUxpc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtTGlzdExpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBMaXN0IGFzcGVjdHMuCi0JICovCi0JcHVibGljIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgbGlzdE5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgdGhlIExpc3QgYXNwZWN0IGhhcyAKLQkgKiBjaGFuZ2VkLiAgRG8gdGhlIHNhbWUgdGhpbmcgbm8gbWF0dGVyIHdoaWNoIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbUxpc3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1Bc3BlY3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIml0ZW0gbGlzdCBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5saXN0TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCWl0ZW0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLml0ZW1MaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQlpdGVtLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy5pdGVtTGlzdExpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcwYTM2NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZQotICogcHJvcGVydGllcyBvZiBlYWNoIGl0ZW0gaW4gdGhlIHdyYXBwZWQgbGlzdCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgaXRlbXMnIHByb3BlcnRpZXMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHByb3BlcnR5TmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCB0aGUgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaXRlbVByb3BlcnR5TGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCQl0aGlzLml0ZW1Qcm9wZXJ0eUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1Qcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlciwgU3RyaW5nLi4uIHByb3BlcnR5TmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgcHJvcGVydHlOYW1lcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkSXRlbVByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiaXRlbSBwcm9wZXJ0eSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMucHJvcGVydHlOYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQlpdGVtLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLml0ZW1Qcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUl0ZW1fKE1vZGVsIGl0ZW0pIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQlpdGVtLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLml0ZW1Qcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkYzVlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSB0byBsaXN0ZW4gdG8gdGhlCi0gKiAic3RhdGUiIG9mIGVhY2ggaXRlbSBpbiB0aGUgd3JhcHBlZCBsaXN0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdGhlIGl0ZW1zIGluIHRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGl0ZW1TdGF0ZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIGl0ZW0gc3RhdGUuCi0JICovCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLml0ZW1TdGF0ZUxpc3RlbmVyID0gdGhpcy5idWlsZEl0ZW1TdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBpdGVtIHN0YXRlLgotCSAqLwotCXB1YmxpYyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtU3RhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlpdGVtLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5pdGVtU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlpdGVtLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5pdGVtU3RhdGVMaXN0ZW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlNWE5Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlIHRyZWUKLSAqIGFzcGVjdHMgb2YgZWFjaCBpdGVtIGluIHRoZSB3cmFwcGVkIGxpc3QgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBJdGVtVHJlZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotCWV4dGVuZHMgSXRlbUFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPgotewotCi0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgaXRlbXMnIHRyZWUgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHRyZWVOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHRoZSBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIGl0ZW1UcmVlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gdHJlZXMuCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMudHJlZU5hbWVzID0gdHJlZU5hbWVzOwotCQl0aGlzLml0ZW1UcmVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSXRlbVRyZWVMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0gdHJlZXMuCi0JICovCi0JcHVibGljIEl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFPihjb2xsZWN0aW9uSG9sZGVyKSwgdHJlZU5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIHdlIHJlYWxseSBjYXJlIGFib3V0IGlzIHRoZSBmYWN0IHRoYXQgYSB0cmVlIGFzcGVjdCBoYXMgCi0JICogY2hhbmdlZC4gIERvIHRoZSBzYW1lIHRoaW5nIG5vIG1hdHRlciB3aGljaCBldmVudCBvY2N1cnMuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZEl0ZW1UcmVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkJCUl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbUFzcGVjdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJSXRlbVRyZWVMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJpdGVtIHRyZWUgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KEl0ZW1UcmVlTGlzdFZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudHJlZU5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VJdGVtXyhNb2RlbCBpdGVtKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCWl0ZW0uYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLml0ZW1UcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlSXRlbV8oTW9kZWwgaXRlbSkgewotCQlmb3IgKFN0cmluZyB0cmVlTmFtZSA6IHRoaXMudHJlZU5hbWVzKSB7Ci0JCQlpdGVtLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcih0cmVlTmFtZSwgdGhpcy5pdGVtVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RBc3BlY3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjVlYjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSBwcm92aWRlcwotICogYmFzaWMgbGlzdCBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgbGlzdHMgaW50bwotICogYSBzaW5nbGUge0BsaW5rICNMSVNUX1ZBTFVFU30gbGlzdC4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgKHNlZSB0aGUgZGVzY3JpcHRpb25zCi0gKiBpbiB7QGxpbmsgQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyfSk6PHVsPgotICogPGxpPntAbGluayAjbGlzdEl0ZXJhdG9yXygpfQotICogPGxpPntAbGluayAjZ2V0KGludCl9Ci0gKiA8bGk+e0BsaW5rICNzaXplXygpfQotICogPGxpPntAbGluayAjdG9BcnJheV8oKX0KLSAqIDxsaT57QGxpbmsgI2xpc3RJdGVyYXRvcigpfQotICogPGxpPntAbGluayAjc2l6ZSgpfQotICogPGxpPntAbGluayAjdG9BcnJheSgpfQotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIExpc3RBc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgRT4KLQlleHRlbmRzIEFzcGVjdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTLCBFPgotewotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSBzdWJqZWN0J3MgbGlzdHMgdGhhdCB3ZSB1c2UgZm9yIHRoZSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX0xJU1RfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3RzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoU3RyaW5nIGxpc3ROYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge2xpc3ROYW1lfSwgc3ViamVjdCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogYW5kIGxpc3RzLgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihTdHJpbmdbXSBsaXN0TmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIGxpc3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBTdHJpbmcuLi4gbGlzdE5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBhc3BlY3QgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlcgotCSAqIGFuZCBsaXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBTPiBzdWJqZWN0SG9sZGVyLCBDb2xsZWN0aW9uPFN0cmluZz4gbGlzdE5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgbGlzdE5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0TmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBsaXN0IGluCi0JICogdGhlIHNwZWNpZmllZCBzdWJqZWN0LiBUaGlzIGlzIHVzZWZ1bCBmb3IgYSBsaXN0IGFzcGVjdCB0aGF0IGRvZXMgbm90Ci0JICogY2hhbmdlIGZvciBhIHBhcnRpY3VsYXIgc3ViamVjdDsgYnV0IHRoZSBzdWJqZWN0IHdpbGwgY2hhbmdlLCByZXN1bHRpbmcgaW4KLQkgKiBhIG5ldyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBMaXN0QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCBFTVBUWV9MSVNUX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBzdWJqZWN0J3MgbGlzdCBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgbGlzdCBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KExpc3RBc3BlY3RBZGFwdGVyLnRoaXMubGlzdE5hbWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIGxpc3ROYW1lIDogdGhpcy5saXN0TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKGxpc3ROYW1lLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNBZGRlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoZXZlbnQuY2xvbmUodGhpcywgTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5maXJlSXRlbXNNb3ZlZChldmVudC5jbG9uZSh0aGlzLCBMSVNUX1ZBTFVFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDbGVhcmVkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMsIExJU1RfVkFMVUVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzN2YyMjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogV2Uga2VlcCBhbiBpbnRlcm5hbCBjb2xsZWN0aW9uIHNvbWV3aGF0IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQgbGlzdC4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgaXRlcmF0b3IoKX0pIHdpbGwgYmUgdW5wcmVkaWN0YWJsZSB3aGVuZXZlcgotICogd2UgZG8gbm90IGhhdmUgYW55IGxpc3RlbmVycy4gVGhpcyBzaG91bGQgbm90IGJlIHRvbyBwYWluZnVsIHNpbmNlLAotICogbW9zdCBsaWtlbHksIGNsaWVudCBvYmplY3RzIHdpbGwgYWxzbyBiZSBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gbGlzdEhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgbGlzdCBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBPdXIgaW50ZXJuYWwgY29sbGVjdGlvbiwgd2hpY2ggaG9sZHMgdGhlIHNhbWUgZWxlbWVudHMgYXMKLQkgKiB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotCS8vIHdlIGRlY2xhcmUgdGhpcyBhbiBBcnJheUxpc3Qgc28gd2UgY2FuIHVzZSAjY2xvbmUoKSBhbmQgI2Vuc3VyZUNhcGFjaXR5KGludCkKLQlwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PEU+IGNvbGxlY3Rpb247Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBsaXN0IHZhbHVlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSBjb2xsZWN0aW9uIGFuZCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbGlzdAotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCS8vIHRyeSB0byBwcmV2ZW50IGJhY2tkb29yIG1vZGlmaWNhdGlvbiBvZiB0aGUgbGlzdAotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8RT4odGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24uc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciBjb2xsZWN0aW9uICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBsaXN0IGhvbGRlciwKLQkJLy8gc2luY2UgaXRzIHZhbHVlIG1pZ2h0IGNoYW5nZSB3aGVuIGEgbGlzdGVuZXIgaXMgYWRkZWQKLQkJdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIGNvbGxlY3Rpb24gd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIKLQkJdGhpcy5jb2xsZWN0aW9uLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24odGhpcy5nZXRJdGVtcyhldmVudCksIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXRJdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbih0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldEl0ZW1zKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXRJdGVtcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGhpcy5nZXRPbGRJdGVtcyhldmVudCksIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQkJdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbih0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE9sZEl0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0T2xkSXRlbXMoKTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxFPiBnZXROZXdJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nPyBtb3ZpbmcgaXRlbXMgaW4gYSBsaXN0IGhhcyBubyBuZXQgZWZmZWN0IG9uIGEgY29sbGVjdGlvbi4uLgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkvLyBwdXQgaW4gZW1wdHkgY2hlY2sgc28gd2UgZG9uJ3QgZmlyZSBldmVudHMgdW5uZWNlc3NhcmlseQotCQlpZiAoICEgdGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGhpcy5jb2xsZWN0aW9uLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2xlYXJlZChWQUxVRVMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIGNvbGxlY3Rpb24gd2l0aCB0aGUgd3JhcHBlZCBsaXN0Ci0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubGlzdEhvbGRlci5zaXplKCkgPT0gMCkgewotCQkJaWYgKHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkvLyBubyBjaGFuZ2UKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoVkFMVUVTLCB0aGlzLmNvbGxlY3Rpb24pOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJCQl0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgdGhpcy5jb2xsZWN0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJLy8gaWYgdGhlIG5ldyBsaXN0IGlzIGVtcHR5LCBkbyBub3RoaW5nCi0JCWludCBzaXplID0gdGhpcy5saXN0SG9sZGVyLnNpemUoKTsKLQkJaWYgKHNpemUgIT0gMCkgewotCQkJdGhpcy5idWlsZENvbGxlY3Rpb24oc2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidWlsZENvbGxlY3Rpb24oaW50IHNpemUpIHsKLQkJdGhpcy5jb2xsZWN0aW9uLmVuc3VyZUNhcGFjaXR5KHNpemUpOwotCQlmb3IgKEUgZWFjaCA6IHRoaXMubGlzdEhvbGRlcikgewotCQkJdGhpcy5jb2xsZWN0aW9uLmFkZChlYWNoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUzNjM4Yi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGV4dGVuc2lvbiBvZiB7QGxpbmsgQXNwZWN0QWRhcHRlcn0gcHJvdmlkZXMgbGlzdCBjaGFuZ2Ugc3VwcG9ydAotICogYnkgYWRhcHRpbmcgYSBzdWJqZWN0J3Mgc3RhdGUgY2hhbmdlIGV2ZW50cyB0byBhIG1pbmltdW0gc2V0Ci0gKiBvZiBsaXN0IGNoYW5nZSBldmVudHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBMaXN0Q3VyYXRvcjxTIGV4dGVuZHMgTW9kZWwsIEU+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFM+Ci0JaW1wbGVtZW50cyBMaXN0VmFsdWVNb2RlbDxFPgotewotCS8qKiBIb3cgdGhlIGxpc3QgbG9va2VkIGJlZm9yZSB0aGUgbGFzdCBzdGF0ZSBjaGFuZ2UgKi8KLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFPiByZWNvcmQ7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgZm9yIHRoZSBzdWJqZWN0J3Mgc3RhdGUgdG8gY2hhbmdlICovCi0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGN1cmF0b3IgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdEN1cmF0b3IoUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY3VyYXRvciBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0IGhvbGRlci4KLQkgKiBUaGUgc3ViamVjdCBob2xkZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDdXJhdG9yKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQlzdXBlcihzdWJqZWN0SG9sZGVyKTsKLQkJdGhpcy5yZWNvcmQgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzdWJqZWN0J3Mgc3RhdGUgaGFzIGNoYW5nZWQsIGRvIGludmVudG9yeSBhbmQgcmVwb3J0IHRvIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdEN1cmF0b3IudGhpcy5zdWJtaXRJbnZlbnRvcnlSZXBvcnQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN0YXRlIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8RT4odGhpcy5yZWNvcmQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBzdWJqZWN0J3MgbGlzdCBhc3BlY3QuCi0JICovCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5yZWNvcmQuZ2V0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnJlY29yZC5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG1hbmlmZXN0YXRpb24gb2YgdGhlIHN1YmplY3QncyBsaXN0IGFzcGVjdC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMucmVjb3JkLnRvQXJyYXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEU+IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5pdGVyYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIExpc3RDaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExpc3RlbmVyQXNwZWN0TmFtZSgpIHsKLQkJcmV0dXJuIExJU1RfVkFMVUVTOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFzcGVjdCBoYXMgY2hhbmdlZCwgbm90aWZ5IGxpc3RlbmVycyBhcHByb3ByaWF0ZWx5LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLnJlY29yZCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaXMgbm90IG51bGwgLSBhZGQgb3VyIGxpc3RlbmVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIGxpc3QgKmFmdGVyKiB3ZSBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5yZWNvcmQsIHRoaXMuaXRlcmF0b3JGb3JSZWNvcmQoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN1YmplY3QgaXMgbm90IG51bGwgLSByZW1vdmUgb3VyIGxpc3RlbmVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkoKE1vZGVsKSB0aGlzLnN1YmplY3QpLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gY2xlYXIgb3V0IHRoZSBsaXN0IHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHN1YmplY3QKLQkJdGhpcy5yZWNvcmQuY2xlYXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdEN1cmF0b3IgcHJvdG9jb2wgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyBpbnRlbmRlZCB0byBiZSBkaWZmZXJlbnQgZnJvbSB7QGxpbmsgTGlzdFZhbHVlTW9kZWwjaXRlcmF0b3IoKX0uCi0JICogSXQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbmx5IHdoZW4gdGhlIHN1YmplY3QgY2hhbmdlcyBvciB0aGUKLQkgKiBzdWJqZWN0J3MgInN0YXRlIiBjaGFuZ2VzIChhcyBzaWduaWZpZWQgYnkgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQpLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYXRvcjxFPiBpdGVyYXRvckZvclJlY29yZCgpOwotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCXZvaWQgc3VibWl0SW52ZW50b3J5UmVwb3J0KCkgewotCQlMaXN0PEU+IG5ld1JlY29yZCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuaXRlcmF0b3JGb3JSZWNvcmQoKSk7Ci0JCWludCByZWNvcmRJbmRleCA9IDA7Ci0KLQkJLy8gYWRkIGl0ZW1zIGZyb20gdGhlIG5ldyByZWNvcmQKLQkJZm9yIChFIG5ld0l0ZW0gOiBuZXdSZWNvcmQpIHsKLQkJCXRoaXMuaW52ZW50b3J5TmV3SXRlbShyZWNvcmRJbmRleCwgbmV3SXRlbSk7Ci0JCQlyZWNvcmRJbmRleCsrOwotCQl9Ci0KLQkJLy8gY2xlYW4gb3V0IGl0ZW1zIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgbmV3IHJlY29yZAotCQlmb3IgKHJlY29yZEluZGV4ID0gMDsgcmVjb3JkSW5kZXggPCB0aGlzLnJlY29yZC5zaXplKCk7ICkgewotCQkJRSBpdGVtID0gdGhpcy5yZWNvcmQuZ2V0KHJlY29yZEluZGV4KTsKLQotCQkJaWYgKG5ld1JlY29yZC5jb250YWlucyhpdGVtKSkgewotCQkJCXJlY29yZEluZGV4Kys7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVtb3ZlSXRlbUZyb21JbnZlbnRvcnkocmVjb3JkSW5kZXgsIGl0ZW0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludmVudG9yeU5ld0l0ZW0oaW50IHJlY29yZEluZGV4LCBFIG5ld0l0ZW0pIHsKLQkJTGlzdDxFPiByZWMgPSBuZXcgQXJyYXlMaXN0PEU+KHRoaXMucmVjb3JkKTsKLQotCQlpZiAoKHJlY29yZEluZGV4IDwgcmVjLnNpemUoKSkgJiYgcmVjLmdldChyZWNvcmRJbmRleCkuZXF1YWxzKG5ld0l0ZW0pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHJlYy5jb250YWlucyhuZXdJdGVtKSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUludmVudG9yeShyZWNvcmRJbmRleCwgcmVjLmdldChyZWNvcmRJbmRleCkpOwotCQkJdGhpcy5pbnZlbnRvcnlOZXdJdGVtKHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYWRkSXRlbVRvSW52ZW50b3J5KHJlY29yZEluZGV4LCBuZXdJdGVtKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRJdGVtVG9JbnZlbnRvcnkoaW50IGluZGV4LCBFIGl0ZW0pIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBpdGVtLCB0aGlzLnJlY29yZCwgTElTVF9WQUxVRVMpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVJdGVtRnJvbUludmVudG9yeShpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBFIGl0ZW0pIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMucmVjb3JkLCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5yZWNvcmQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZjcxMDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYSBsaXN0IHZhbHVlIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNidWlsZFZhbHVlKCl9PHA+Ci0gKiAgICAgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHByb3BlcnR5IHZhbHVlLCBhcyBkZXJpdmVkIGZyb20gdGhlCi0gKiAgICAgY3VycmVudCBsaXN0IHZhbHVlCi0gKiA8L3VsPgotICogU3ViY2xhc3NlcyBtaWdodCB3YW50IHRvIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcwotICogdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSAoYnkgbm90IHJlY2FsY3VsYXRpbmcgdGhlIHZhbHVlLCBpZiBwb3NzaWJsZSk6PHVsPgotICogPGxpPntAbGluayAjaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICNpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2xpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI2xpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLQlleHRlbmRzIEFic3RyYWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotewotCS8qKiBUaGUgd3JhcHBlZCBsaXN0IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBsaXN0SG9sZGVyOwotCQl0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0JCQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLml0ZW1zTW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibGlzdCBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXI7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlciBoYXMgY2hhbmdlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMDFhMzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBhYnN0cmFjdCBjbGFzcyBwcm92aWRlcyB0aGUgaW5mcmFzdHJ1Y3R1cmUgbmVlZGVkIHRvIHdyYXAKLSAqIGFub3RoZXIgbGlzdCB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlCi0gKiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdExpc3RWYWx1ZU1vZGVsCi17Ci0JLyoqIFRoZSB3cmFwcGVkIGxpc3QgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0SG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCXRoaXMubGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RWYWx1ZU1vZGVsV3JhcHBlci50aGlzLml0ZW1zUmVwbGFjZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdFZhbHVlTW9kZWxXcmFwcGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCUxpc3RWYWx1ZU1vZGVsV3JhcHBlci50aGlzLmxpc3RDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUxpc3RWYWx1ZU1vZGVsV3JhcHBlci50aGlzLmxpc3RDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3QgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RT4gZ2V0TmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKEl0ZXJhYmxlPEU+KSBldmVudC5nZXROZXdJdGVtcygpOwotCX0KLQotCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEU+IGdldE9sZEl0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0T2xkSXRlbXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogSXRlbXMgd2VyZSBtb3ZlZCBpbiB0aGUgd3JhcHBlZCBsaXN0IGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhlIHdyYXBwZWQgbGlzdCBob2xkZXIgd2FzIGNsZWFyZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTA2MWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSByZWFkLW9ubHkgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhIGNvbGxlY3Rpb24uIEluIHBhcnRpY3VsYXIsIHRoaXMKLSAqIGlzIHVzZWZ1bCBmb3IgdGhlIGxlYWYgbm9kZXMgb2YgYSB0cmVlIHRoYXQgbmV2ZXIgaGF2ZQotICogY2hpbGRyZW4uCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsTGlzdFZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODgwMWNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBlbXB0eSBsaXN0IHZhbHVlIG1vZGVsIGZvciB3aGVuIHlvdSBkb24ndAotICogbmVlZCB0byBzdXBwb3J0IGEgbGlzdC4KLSAqIDxwPgotICogV2UgZG9uJ3QgdXNlIGEgc2luZ2xldG9uIGJlY2F1c2Ugd2UgaG9sZCBvbiB0byBsaXN0ZW5lcnMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTGlzdFZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbExpc3RWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXg6ICIgKyBpbmRleCArICIsIFNpemU6IDAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiBFTVBUWV9BUlJBWTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0NWQ5Ni4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhIHZhbHVlLgotICogPHA+Ci0gKiBXZSBkb24ndCB1c2UgYSBzaW5nbGV0b24gYmVjYXVzZSB3ZSBob2xkIG9uIHRvIGxpc3RlbmVycy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIFByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbFByb3BlcnR5VmFsdWVNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsVHJlZVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDRiOTYwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxUcmVlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgdHJlZSB2YWx1ZSBtb2RlbCBmb3Igd2hlbiB5b3UKLSAqIGRvbid0IG5lZWQgdG8gc3VwcG9ydCBhbnkgbm9kZXMuCi0gKiA8cD4KLSAqIFdlIGRvbid0IHVzZSBhIHNpbmdsZXRvbiBiZWNhdXNlIHdlIGhvbGQgb24gdG8gbGlzdGVuZXJzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFRyZWVWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBUcmVlVmFsdWVNb2RlbDxFPgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTnVsbFRyZWVWYWx1ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogVHJlZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IG5vZGVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlBc3BlY3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI3YTczNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIHtAbGluayBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyfSBwcm92aWRlcyBiYXNpYyBwcm9wZXJ0eSBjaGFuZ2Ugc3VwcG9ydC4KLSAqIFRoaXMgY29udmVydHMgYSBzZXQgb2Ygb25lIG9yIG1vcmUgc3RhbmRhcmQgcHJvcGVydGllcyBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI1ZBTFVFfSBwcm9wZXJ0eS4KLSAqIDxwPgotICogVGhlIHR5cGljYWwgc3ViY2xhc3Mgd2lsbCBvdmVycmlkZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgKHNlZSB0aGUgZGVzY3JpcHRpb25zCi0gKiBpbiB7QGxpbmsgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcn0pOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWVfKCl9Ci0gKiA8bGk+e0BsaW5rICNzZXRWYWx1ZV8oT2JqZWN0KX0KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX0KLSAqIDxsaT57QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFMgZXh0ZW5kcyBNb2RlbCwgVj4KLQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8UywgVj4KLXsKLQkvKiogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyBwcm9wZXJ0aWVzIHRoYXQgd2UgdXNlIGZvciB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIHByb3BlcnR5TmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfUFJPUEVSVFlfTkFNRVMgPSBuZXcgU3RyaW5nWzBdOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIG9mIHRoZSBzdWJqZWN0LiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgcHJvcGVydHkuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihTdHJpbmcgcHJvcGVydHlOYW1lLCBTIHN1YmplY3QpIHsKLQkJdGhpcyhuZXcgU3RyaW5nW10ge3Byb3BlcnR5TmFtZX0sIHN1YmplY3QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgcHJvcGVydGllcy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFN0cmluZ1tdIHByb3BlcnR5TmFtZXMsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8Uz4oc3ViamVjdCksIHByb3BlcnR5TmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHN1YmplY3RIb2xkZXIpOwotCQl0aGlzLnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFByb3BlcnR5QXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXRoaXMoc3ViamVjdEhvbGRlciwgcHJvcGVydHlOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbcHJvcGVydHlOYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgYXNwZWN0IGFkYXB0ZXIgZm9yIGFuICJ1bmNoYW5naW5nIiBwcm9wZXJ0eSBpbgotCSAqIHRoZSBzcGVjaWZpZWQgc3ViamVjdC4gVGhpcyBpcyB1c2VmdWwgZm9yIGEgcHJvcGVydHkgYXNwZWN0IHRoYXQgZG9lcyBub3QKLQkgKiBjaGFuZ2UgZm9yIGEgcGFydGljdWxhciBzdWJqZWN0OyBidXQgdGhlIHN1YmplY3Qgd2lsbCBjaGFuZ2UsIHJlc3VsdGluZyBpbgotCSAqIGEgbmV3IHByb3BlcnR5LiAoQSB7QGxpbmsgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWx9IGNvdWxkIGFsc28gYmUKLQkgKiB1c2VkIGluIHRoaXMgc2l0dWF0aW9uLikKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIEVNUFRZX1BST1BFUlRZX05BTUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgcHJvcGVydHkgY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlci50aGlzLnByb3BlcnR5Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFByb3BlcnR5QXNwZWN0QWRhcHRlci50aGlzLnByb3BlcnR5TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIHByb3BlcnR5TmFtZSA6IHRoaXMucHJvcGVydHlOYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByb3BlcnR5TmFtZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotICAgIAlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDQzMmFlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBbiBhZGFwdGVyIHRoYXQgYWxsb3dzIHVzIHRvIG1ha2UgYSB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSBiZWhhdmUgbGlrZQotICogYSByZWFkLW9ubHksIHNpbmdsZS1lbGVtZW50IHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0sIHNvcnRhLgotICogPHA+Ci0gKiBJZiB0aGUgcHJvcGVydHkncyB2YWx1ZSBpcyBudWxsLCBhbiBlbXB0eSBpdGVyYXRvciBpcyByZXR1cm5lZAotICogKGkuZS4geW91IGNhbid0IGhhdmUgYSBjb2xsZWN0aW9uIHdpdGggYSA8Y29kZT5udWxsPC9jb2RlPiBlbGVtZW50KS4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb25WYWx1ZU1vZGVsCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgZm9yd2FyZHMgYW55IGV2ZW50cyBmaXJlZCBieSB0aGUgdmFsdWUgaG9sZGVyLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKiogQ2FjaGUgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBFIHZhbHVlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwgdG8gYSBjb2xsZWN0aW9uCi0JICogdmFsdWUgbW9kZWwuCi0JICovCi0JcHVibGljIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gdmFsdWVIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHZhbHVlSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JCS8vIHBvc3Rwb25lIGJ1aWxkaW5nIHRoZSB2YWx1ZSBhbmQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHZhbHVlIGhhcyBjaGFuZ2VkLCBmb3J3YXJkIGFuIGVxdWl2YWxlbnQKLQkgKiBjb2xsZWN0aW9uIGNoYW5nZSBldmVudCB0byBvdXIgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCQlFIGV2ZW50TmV3VmFsdWUgPSAoRSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJCQlQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci50aGlzLnZhbHVlQ2hhbmdlZChldmVudE5ld1ZhbHVlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhdG9yLjxFPmluc3RhbmNlKCkgOiB0aGlzLml0ZXJhdG9yXygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxFPiBpdGVyYXRvcl8oKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPEU+KHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIHN5bmNoIG91ciB2YWx1ZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLnZhbHVlID0gdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkvLyBjbGVhciBvdXQgdGhlIHZhbHVlIHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlcgotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogc3luY2hyb25pemUgb3VyIGludGVybmFsIHZhbHVlIHdpdGggdGhlIHdyYXBwZWQgdmFsdWUKLQkgKiBhbmQgZmlyZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKEUgbmV3VmFsdWUpIHsKLQkJRSBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKLQkJaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLQkJCS8vIHdlIHdvdWxkbid0IGdldCB0aGUgZXZlbnQgaWYgdGhlIG5ldyB2YWx1ZSB3ZXJlIG51bGwgdG9vCi0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVkFMVUVTLCBuZXdWYWx1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZBTFVFUywgb2xkVmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyB3ZSB3b3VsZG4ndCBnZXQgdGhlIGV2ZW50IGlmIHRoZSBuZXcgdmFsdWUgd2FzIHRoZSBzYW1lIGFzIHRoZSBvbGQKLQkJCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXdWYWx1ZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZmEzY2MuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IGJlaGF2ZSBsaWtlCi0gKiBhIHJlYWQtb25seSwgc2luZ2xlLWVsZW1lbnQge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSwgc29ydGEuCi0gKiA8cD4KLSAqIElmIHRoZSBwcm9wZXJ0eSdzIHZhbHVlIGlzIG51bGwsIGFuIGVtcHR5IGl0ZXJhdG9yIGlzIHJldHVybmVkCi0gKiAoaS5lLiB5b3UgY2FuJ3QgaGF2ZSBhIGNvbGxlY3Rpb24gd2l0aCBhIDxjb2RlPm51bGw8L2NvZGU+IGVsZW1lbnQpLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIEFic3RyYWN0TGlzdFZhbHVlTW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHByb3BlcnR5IHZhbHVlIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBmb3J3YXJkcyBhbnkgZXZlbnRzIGZpcmVkIGJ5IHRoZSB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLQotCS8qKiBDYWNoZSB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIEUgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIGxpc3QKLQkgKiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcigpOwotCQlpZiAodmFsdWVIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWx1ZUhvbGRlciA9IHZhbHVlSG9sZGVyOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgdmFsdWUgYW5kIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCB2YWx1ZSBoYXMgY2hhbmdlZCwgZm9yd2FyZCBhbiBlcXVpdmFsZW50Ci0JICogbGlzdCBjaGFuZ2UgZXZlbnQgdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQkJRSBldmVudE5ld1ZhbHVlID0gKEUpIGV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQkJUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnROZXdWYWx1ZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/Ci0JCQkJCUVtcHR5TGlzdEl0ZXJhdG9yLjxFPmluc3RhbmNlKCkKLQkJCQk6Ci0JCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPEU+KHRoaXMudmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlpZiAodGhpcy52YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyB0aGlzLmJ1aWxkSU9PQkUoaW5kZXgsIDApOwotCQl9Ci0JCWlmIChpbmRleCA+IDApIHsKLQkJCXRocm93IHRoaXMuYnVpbGRJT09CRShpbmRleCwgMSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBFTVBUWV9PQkpFQ1RfQVJSQVkgOiBuZXcgT2JqZWN0W10ge3RoaXMudmFsdWV9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBidWlsZElPT0JFKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJcmV0dXJuIG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJJbmRleDogIiArIGluZGV4ICsgIiwgU2l6ZTogIiArIHNpemUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJLy8gc3luY2ggb3VyIHZhbHVlICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB2YWx1ZSBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudmFsdWUgPSB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCS8vIGNsZWFyIG91dCB0aGUgdmFsdWUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgdmFsdWUgaG9sZGVyCi0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN5bmNocm9uaXplIG91ciBpbnRlcm5hbCB2YWx1ZSB3aXRoIHRoZSB3cmFwcGVkIHZhbHVlCi0JICogYW5kIGZpcmUgdGhlIGFwcHJvcHJpYXRlIGV2ZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChFIG5ld1ZhbHVlKSB7Ci0JCUUgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9WQUxVRVMsIDAsIG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9WQUxVRVMsIDAsIG9sZFZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfVkFMVUVTLCAwLCBuZXdWYWx1ZSwgb2xkVmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDFiODVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFic3RyYWN0IGNsYXNzIHByb3ZpZGVzIHRoZSBpbmZyYXN0cnVjdHVyZSBuZWVkZWQgdG8gd3JhcAotICogYW5vdGhlciBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCwgImxhemlseSIgbGlzdGVuIHRvIGl0LCBhbmQgcHJvcGFnYXRlCi0gKiBpdHMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlCi0gKiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfS4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGUgZm9sbG93aW5nIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQpfTxwPgotICogICAgIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBwcm9wYWdhdGUgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSBub3RpZmljYXRpb24KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFY+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbAotewotCS8qKiBUaGUgd3JhcHBlZCBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBWPiB2YWx1ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNoIHdpdGggY2hhbmdlcyB0byB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiBwcm9wZXJ0eSB2YWx1ZSBtb2RlbC4gVGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh2YWx1ZUhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnZhbHVlSG9sZGVyID0gdmFsdWVIb2xkZXI7Ci0JCXRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyLnRoaXMudmFsdWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNoYW5nZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBCZWdpbiBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHZhbHVlIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnR5IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgd3JhcHBlZCB2YWx1ZSBob2xkZXIgaGFzIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmN2I5Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9SZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgYWN0dWFsbHkKLSAqIC4uLiA8ZW0+aXNuJ3Q8L2VtPiAuLi4gd3JpdGFibGUuICBJdCBjYW4gaG93ZXZlciBiZSB1c2VkIGluIHBsYWNlcyB0aGF0IHJlcXVpcmUgYSAKLSAqIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHdoZXJlIHRoZSBkZXZlbG9wZXIgaXMgc3VyZSB0aGF0IG5vIAotICogYXR0ZW1wdCB3aWxsIGJlIG1hZGUgdG8gd3JpdGUgdG8gaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxUPgotCWV4dGVuZHMgUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxUPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQlwdWJsaWMgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChldmVudC5jbG9uZSh0aGlzKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ3MjJmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlNldENvbGxlY3Rpb25WYWx1ZU1vZGVsPC9jb2RlPiB3cmFwcyBhbm90aGVyCi0gKiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IGFuZCByZXR1cm5zIHRoZSBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbgotICogb25seSBvbmNlLgotICovCi1wdWJsaWMgY2xhc3MgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4KLXsKLQlwcml2YXRlIGZpbmFsIEhhc2hCYWc8RT4gYmFnID0gbmV3IEhhc2hCYWc8RT4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgd3JhcHBlZAotCSAqIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIGEgZmlsdGVyIHRoYXQgc2ltcGx5IGFjY2VwdHMgZXZlcnkgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbkhvbGRlcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCB3cmFwcGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgYSBmaWx0ZXIgdGhhdCBzaW1wbHkgYWNjZXB0cyBldmVyeSBvYmplY3QuCi0JICovCi0JcHVibGljIFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFPihsaXN0SG9sZGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25WYWx1ZU1vZGVsV3JhcHBlciBvdmVycmlkZXMvaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmVuZ2FnZU1vZGVsKCk7Ci0JCS8vIHN5bmNoIG91ciBjYWNoZSAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIGNvbGxlY3Rpb24sCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5iYWcsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCS8vIGNsZWFyIG91dCB0aGUgY2FjaGUgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgbmVzdGVkIGNvbGxlY3Rpb24KLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlBcnJheUxpc3Q8RT4gYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8RT4oZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCQlpbnQgdW5pcXVlQ291bnQgPSB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQlmb3IgKEUgaXRlbSA6IHRoaXMuZ2V0SXRlbXMoZXZlbnQpKSB7Ci0JCQl0aGlzLmJhZy5hZGQoaXRlbSk7Ci0JCQlpZiAodGhpcy5iYWcudW5pcXVlQ291bnQoKSA+IHVuaXF1ZUNvdW50KSB7Ci0JCQkJdW5pcXVlQ291bnQgPSB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQkJCWFkZGVkSXRlbXMuYWRkKGl0ZW0pOwotCQkJfQotCQl9Ci0JCXRoaXMuZmlyZUl0ZW1zQWRkZWQoVkFMVUVTLCBhZGRlZEl0ZW1zKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCUFycmF5TGlzdDxFPiByZW1vdmVkSXRlbXMgPSBuZXcgQXJyYXlMaXN0PEU+KGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQkJaW50IHVuaXF1ZUNvdW50ID0gdGhpcy5iYWcudW5pcXVlQ291bnQoKTsKLQkJZm9yIChFIGl0ZW0gOiB0aGlzLmdldEl0ZW1zKGV2ZW50KSkgewotCQkJaWYgKHRoaXMuYmFnLnJlbW92ZShpdGVtKSkgewotCQkJCWlmICh0aGlzLmJhZy51bmlxdWVDb3VudCgpIDwgdW5pcXVlQ291bnQpIHsKLQkJCQkJdW5pcXVlQ291bnQgPSB0aGlzLmJhZy51bmlxdWVDb3VudCgpOwotCQkJCQlyZW1vdmVkSXRlbXMuYWRkKGl0ZW0pOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibWlzc2luZyBpdGVtOiAiICsgaXRlbSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoVkFMVUVTLCByZW1vdmVkSXRlbXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuYmFnLCBWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuYmFnLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIG5ldyBIYXNoU2V0PEU+KHRoaXMuYmFnKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NGVlYzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsfSBhbmQge0BsaW5rIENvbGxlY3Rpb259Ci0gKiB0aGF0IHNpbXBseSBob2xkcyBhIGNvbGxlY3Rpb24gYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBvZiBhbnkgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+LCBDb2xsZWN0aW9uPEU+Ci17Ci0JLyoqIFRoZSBjb2xsZWN0aW9uLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPEU+IGNvbGxlY3Rpb247Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwoQ29sbGVjdGlvbjxFPiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCB3aXRoIGFuIGVtcHR5IGluaXRpYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWwoKSB7Ci0JCXRoaXMobmV3IEhhc2hCYWc8RT4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzLCBWQUxVRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxJdGVyYXRvcjxFPih0aGlzLmNvbGxlY3Rpb24uaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgY29sbGVjdGlvbidzIGVsZW1lbnRzIHRvIGJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb24uY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmNvbGxlY3Rpb24sIHZhbHVlcyk7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgdGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBPYmplY3Q+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb24udG9BcnJheShhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24obywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24obywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKGMsIHRoaXMuY29sbGVjdGlvbiwgVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oYywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24oYywgdGhpcy5jb2xsZWN0aW9uLCBWQUxVRVMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLmNvbGxlY3Rpb24sIFZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgobyBpbnN0YW5jZW9mIENvbGxlY3Rpb248Pz4pICYmIChvIGluc3RhbmNlb2YgQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4pKSB7Ci0JCQlDb2xsZWN0aW9uPEU+IGMxID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5jb2xsZWN0aW9uKTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQ29sbGVjdGlvbjxFPiBjMiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKCgoQ29sbGVjdGlvbjxFPikgbykuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gYzEuZXF1YWxzKGMyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuY29sbGVjdGlvbikuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbGxlY3Rpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsSXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7Ci0JCXByaXZhdGUgZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3I7Ci0JCXByaXZhdGUgVCBuZXh0OwotCi0JCUxvY2FsSXRlcmF0b3IoSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IuaGFzTmV4dCgpOwotCQl9Ci0KLQkJcHVibGljIFQgbmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJdGhpcy5pdGVyYXRvci5yZW1vdmUoKTsKLQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZBTFVFUywgdGhpcy5uZXh0KTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA5NDNmOS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLlNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSBhbmQge0BsaW5rIExpc3R9IHRoYXQgc2ltcGx5IGhvbGRzIGEKLSAqIGxpc3QgYW5kIG5vdGlmaWVzIGxpc3RlbmVycyBvZiBhbnkgY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsPEU+LCBMaXN0PEU+Ci17Ci0JLyoqIFRoZSBsaXN0LiAqLwotCXByb3RlY3RlZCBMaXN0PEU+IGxpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoTGlzdDxFPiBsaXN0KSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIGFuIGVtcHR5IGluaXRpYWwgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXRoaXMobmV3IEFycmF5TGlzdDxFPigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBMaXN0Q2hhbmdlTGlzdGVuZXIuY2xhc3MsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsSXRlcmF0b3I8RT4odGhpcy5saXN0Lml0ZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEl0ZXJhdG9yPEU+KHRoaXMubGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVMaXN0VmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyB0aGUgbGlzdCdzIGVsZW1lbnRzIHRvIGJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RWYWx1ZXMoSXRlcmFibGU8RT4gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmxpc3QsIGxpc3QpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChMSVNUX1ZBTFVFUywgdGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmNvbnRhaW5zKG8pOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQgZXh0ZW5kcyBPYmplY3Q+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheShhKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoRSBvKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0xpc3QobywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChvLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5jb250YWluc0FsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvTGlzdChjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0JCXJldHVybiB0aGlzLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCBjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoYywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5yZXRhaW5JdGVtc0luTGlzdChjLCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJdGhpcy5jbGVhckxpc3QodGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICgobyBpbnN0YW5jZW9mIExpc3Q8Pz4pICYmIChvIGluc3RhbmNlb2YgTGlzdFZhbHVlTW9kZWw8Pz4pKSB7Ci0JCQlMaXN0PEU+IGwxID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5saXN0KTsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJTGlzdDxFPiBsMiA9IENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdDxFPikgbykuaXRlcmF0b3IoKSk7Ci0JCQlyZXR1cm4gbDEuZXF1YWxzKGwyKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5oYXNoQ29kZSgpOwotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5zZXRJdGVtSW5MaXN0KGluZGV4LCBlbGVtZW50LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBlbGVtZW50LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGFzdEluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0SXRlcmF0b3I8RT4odGhpcy5saXN0Lmxpc3RJdGVyYXRvcihpbmRleCkpOwotCX0KLQotCXB1YmxpYyBMaXN0PEU+IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKLQkJLy8gVE9ETyBobW1tICB+Ymp2Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGRpdGlvbmFsIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIE1vdmUgYSBzaW5nbGUgZWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtb3ZlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBNb3ZlIGEgc3ViLWxpc3Qgb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgbW92ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLm1vdmVJdGVtc0luTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIGxlbmd0aCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGEgcmFuZ2Ugb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoaW5kZXgsIGxlbmd0aCwgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgcmFuZ2Ugb2YgZWxlbWVudHMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgTGlzdDxFPiBlbGVtZW50cykgewotCQl0aGlzLnNldEl0ZW1zSW5MaXN0KGluZGV4LCBlbGVtZW50cywgdGhpcy5saXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaXRlcmF0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgTG9jYWxJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKLQkJcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBUIG5leHQ7Ci0KLQkJTG9jYWxJdGVyYXRvcihJdGVyYXRvcjxUPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBuZXh0KCkgewotCQkJdGhpcy5uZXh0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7Ci0JCQl0aGlzLmluZGV4Kys7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0OwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInN5bnRoZXRpYy1hY2Nlc3MiKQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWwudGhpcy5maXJlSXRlbVJlbW92ZWQoTElTVF9WQUxVRVMsIHRoaXMuaW5kZXgsIHRoaXMubmV4dCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgTG9jYWxMaXN0SXRlcmF0b3I8VD4gaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8VD4gewotCQlwcml2YXRlIGZpbmFsIExpc3RJdGVyYXRvcjxUPiBpdGVyYXRvcjsKLQkJcHJpdmF0ZSBpbnQgbGFzdCA9IC0xOwotCQlwcml2YXRlIGludCBuZXh0ID0gMDsKLQkJcHJpdmF0ZSBUIGN1cnJlbnQ7Ci0KLQkJTG9jYWxMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBUIG5leHQoKSB7Ci0JCQl0aGlzLmN1cnJlbnQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJCXRoaXMubGFzdCA9IHRoaXMubmV4dCsrOwotCQkJcmV0dXJuIHRoaXMuY3VycmVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmV4dEluZGV4KCkgewotCQkJcmV0dXJuIHRoaXMuaXRlcmF0b3IubmV4dEluZGV4KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLmhhc1ByZXZpb3VzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVCBwcmV2aW91cygpIHsKLQkJCXRoaXMuY3VycmVudCA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJCXRoaXMubGFzdCA9IC0tdGhpcy5uZXh0OwotCQkJcmV0dXJuIHRoaXMuY3VycmVudDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLml0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgc2V0KFQgbykgewotCQkJdGhpcy5pdGVyYXRvci5zZXQobyk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVwbGFjZWQoTElTVF9WQUxVRVMsIHRoaXMubGFzdCwgbywgdGhpcy5jdXJyZW50KTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJzeW50aGV0aWMtYWNjZXNzIikKLQkJcHVibGljIHZvaWQgYWRkKFQgbykgewotCQkJdGhpcy5pdGVyYXRvci5hZGQobyk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9WQUxVRVMsIHRoaXMubmV4dCwgbyk7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygic3ludGhldGljLWFjY2VzcyIpCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCXRoaXMuaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQlTaW1wbGVMaXN0VmFsdWVNb2RlbC50aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX1ZBTFVFUywgdGhpcy5sYXN0LCB0aGlzLmN1cnJlbnQpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NGQxYzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9IHRoYXQgc2ltcGx5IGhvbGRzIG9uIHRvIGFuCi0gKiBvYmplY3QgYW5kIHVzZXMgaXQgYXMgdGhlIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPgotewotCS8qKiBUaGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIFQgdmFsdWU7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWwoVCB2YWx1ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCBhIHN0YXJ0aW5nIHZhbHVlIG9mIG51bGwuCi0JICovCi0JcHVibGljIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbCgpIHsKLQkJdGhpcyhudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBWQUxVRSk7Ci0JfQotCi0KLQlwdWJsaWMgVCBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVCB2YWx1ZSkgewotCQlUIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMWZmNGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0KLSAqIChvciB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9KSBiZWhhdmUgbGlrZSBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0KLSAqIHRoYXQga2VlcHMgaXRzIGNvbnRlbnRzIHNvcnRlZCBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIGFwcHJvcHJpYXRlbHkuCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgQ29tcGFyYXRvcn0gY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWU7IGFsbG93aW5nIHRoZSBzYW1lCi0gKiBhZGFwdGVyIHRvIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgc29ydCBjcml0ZXJpYSAoZS5nLiB3aGVuIHRoZSB1c2VyCi0gKiB3YW50cyB0byBzb3J0IGEgbGlzdCBvZiBmaWxlcyBmaXJzdCBieSBuYW1lLCB0aGVuIGJ5IGRhdGUsIHRoZW4gYnkgc2l6ZSkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQKLSAqIGNvbGxlY3Rpb24gd2hpbGUgd2UgYXJlIGxpc3RlbmluZyB0byBpdCwgcmVzdWx0cyB0byB2YXJpb3VzIG1ldGhvZHMKLSAqIChlLmcuIHtAbGluayAjc2l6ZSgpfSwge0BsaW5rICNnZXQoaW50KX0pIHdpbGwgYmUKLSAqIHVucHJlZGljdGFibGUgd2hlbmV2ZXIKLSAqIHdlIGRvIG5vdCBoYXZlIGFueSBsaXN0ZW5lcnMuIFRoaXMgc2hvdWxkIG5vdCBiZSB0b28gcGFpbmZ1bCBzaW5jZSwKLSAqIG1vc3QgbGlrZWx5LCBjbGllbnQgb2JqZWN0cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICogCi0gKiBAc2VlIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcgotICovCi1wdWJsaWMgY2xhc3MgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci17Ci0JLyoqCi0JICogQSBjb21wYXJhdG9yIHVzZWQgZm9yIHNvcnRpbmcgdGhlIGVsZW1lbnRzOwotCSAqIGlmIGl0IGlzIG51bGwsIHdlIHVzZSAibmF0dXJhbCBvcmRlcmluZyIuCi0JICovCi0JcHJvdGVjdGVkIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdmFsdWUgbW9kZWwgYW5kIHNvcnQgaXRzIGNvbnRlbnRzCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBjb21wYXJhdG9yLgotCSAqLwotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIsIENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcikgewotCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgc29ydCBpdHMgY29udGVudHMKLQkgKiBiYXNlZCBvbiB0aGUgZWxlbWVudHMnICJuYXR1cmFsIG9yZGVyaW5nIi4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMoY29sbGVjdGlvbkhvbGRlciwgbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2Vzc29ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRDb21wYXJhdG9yKENvbXBhcmF0b3I8RT4gY29tcGFyYXRvcikgewotCQl0aGlzLmNvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwotCQl0aGlzLnNvcnRMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFNvcnQgdGhlIGludGVybmFsIGxpc3QgYmVmb3JlIHRoZSBzdXBlcmNsYXNzCi0JICogc2VuZHMgb3V0IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRMaXN0KGludCBzaXplKSB7Ci0JCXN1cGVyLmJ1aWxkTGlzdChzaXplKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0aGlzLmxpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JfQotCi0JLyoqCi0JICogU29ydCB0aGUgbGlzdCBhZnRlciBhZGRpbmcgdGhlIGl0ZW1zLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlBcnJheUxpc3Q8RT4gbmV3TGlzdCA9IChBcnJheUxpc3Q8RT4pIHRoaXMubGlzdC5jbG9uZSgpOwotCQluZXdMaXN0LmVuc3VyZUNhcGFjaXR5KG5ld0xpc3Quc2l6ZSgpICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKG5ld0xpc3QsIHRoaXMuZ2V0SXRlbXMoZXZlbnQpKTsKLQkJQ29sbGVjdGlvbnMuc29ydChuZXdMaXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCQl0aGlzLnN5bmNocm9uaXplTGlzdChuZXdMaXN0LCB0aGlzLmxpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIEU+IGJ1aWxkU3luY0xpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc29ydGVkU2V0KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGhpcy5jb21wYXJhdG9yLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBzb3J0IHRoZSBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycywgaWYgbmVjZXNzYXJ5OwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNvcnRMaXN0KCkgewotCQkvLyBzYXZlIHRoZSB1bnNvcnRlZCBzdGF0ZSBvZiB0aGUgc29ydGVkIGxpc3Qgc28gd2UgY2FuIG1pbmltaXplIHRoZSBudW1iZXIgb2YgInJlcGxhY2VkIiBpdGVtcwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJQXJyYXlMaXN0PEU+IHVuc29ydGVkTGlzdCA9IChBcnJheUxpc3Q8RT4pIHRoaXMubGlzdC5jbG9uZSgpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHRoaXMubGlzdCwgdGhpcy5jb21wYXJhdG9yKTsKLQkJUmFuZ2UgZGlmZlJhbmdlID0gQ29sbGVjdGlvblRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKHVuc29ydGVkTGlzdCwgdGhpcy5saXN0KTsKLQkJaWYgKGRpZmZSYW5nZS5zaXplID4gMCkgewotCQkJTGlzdDxFPiB1bnNvcnRlZEl0ZW1zID0gdW5zb3J0ZWRMaXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQlMaXN0PEU+IHNvcnRlZEl0ZW1zID0gdGhpcy5saXN0LnN1Ykxpc3QoZGlmZlJhbmdlLnN0YXJ0LCBkaWZmUmFuZ2UuZW5kICsgMSk7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlcGxhY2VkKExJU1RfVkFMVUVTLCBkaWZmUmFuZ2Uuc3RhcnQsIHNvcnRlZEl0ZW1zLCB1bnNvcnRlZEl0ZW1zKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUxNGYzNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEEgd3JhcHBlciB0aGF0IGtlZXBzIHRoZSBjb250ZW50cyBvZiBhIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gc29ydGVkCi0gKiBhbmQgbm90aWZpZXMgbGlzdGVuZXJzIGFwcHJvcHJpYXRlbHkuCi0gKiA8cD4KLSAqIFRoZSB7QGxpbmsgQ29tcGFyYXRvcn0gY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWU7IGFsbG93aW5nIHRoZSBzYW1lCi0gKiBhZGFwdGVyIHRvIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgc29ydCBjcml0ZXJpYSAoZS5nLiB3aGVuIHRoZSB1c2VyCi0gKiB3YW50cyB0byBzb3J0IGEgbGlzdCBvZiBmaWxlcyBmaXJzdCBieSBuYW1lLCB0aGVuIGJ5IGRhdGUsIHRoZW4gYnkgc2l6ZSkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNpbmNlIHdlIG9ubHkgbGlzdGVuIHRvIHRoZSB3cmFwcGVkIGNvbGxlY3Rpb24gd2hlbiB3ZSBoYXZlCi0gKiBsaXN0ZW5lcnMgb3Vyc2VsdmVzIGFuZCB3ZSBjYW4gb25seSBzdGF5IGluIHN5bmNoIHdpdGggdGhlIHdyYXBwZWQKLSAqIGNvbGxlY3Rpb24gd2hpbGUgd2UgYXJlIGxpc3RlbmluZyB0byBpdCwgcmVzdWx0cyB0byB2YXJpb3VzIG1ldGhvZHMKLSAqIChlLmcuIHtAbGluayAjc2l6ZSgpfSwge0BsaW5rICNnZXQoaW50KX0pIHdpbGwgYmUgdW5wcmVkaWN0YWJsZSB3aGVuZXZlcgotICogd2UgZG8gbm90IGhhdmUgYW55IGxpc3RlbmVycy4gVGhpcyBzaG91bGQgbm90IGJlIHRvbyBwYWluZnVsIHNpbmNlLAotICogbW9zdCBsaWtlbHksIGNsaWVudCBvYmplY3RzIHdpbGwgYWxzbyBiZSBsaXN0ZW5lcnMuCi0gKiAKLSAqIEBzZWUgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8RT4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFPgotCWltcGxlbWVudHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQkvKioKLQkgKiBBIGNvbXBhcmF0b3IgdXNlZCBmb3Igc29ydGluZyB0aGUgZWxlbWVudHM7Ci0JICogaWYgaXQgaXMgbnVsbCwgd2UgdXNlICJuYXR1cmFsIG9yZGVyaW5nIi4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxFPiBjb21wYXJhdG9yOwotCi0JLyoqCi0JICogT3VyIGludGVybmFsIGxpc3QsIHdoaWNoIGhvbGRzIHRoZSBzYW1lIGVsZW1lbnRzIGFzCi0JICogdGhlIHdyYXBwZWQgbGlzdCwgYnV0IGtlZXBzIHRoZW0gc29ydGVkLgotCSAqLwotCS8vIHdlIGRlY2xhcmUgdGhpcyBhbiBBcnJheUxpc3Qgc28gd2UgY2FuIHVzZSAjY2xvbmUoKSBhbmQgI2Vuc3VyZUNhcGFjaXR5KGludCkKLQlwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PEU+IHNvcnRlZExpc3Q7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBsaXN0IHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvci4KLQkgKi8KLQlwdWJsaWMgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCXRoaXMuY29tcGFyYXRvciA9IGNvbXBhcmF0b3I7Ci0JCXRoaXMuc29ydGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RT4obGlzdEhvbGRlci5zaXplKCkpOwotCQkvLyBwb3N0cG9uZSBidWlsZGluZyB0aGUgc29ydGVkIGxpc3QgYW5kIGxpc3RlbmluZyB0byB0aGUgd3JhcHBlZCBsaXN0Ci0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCX0KLQotCS8qKgotCSAqIFdyYXAgdGhlIHNwZWNpZmllZCBsaXN0IHZhbHVlIG1vZGVsIGFuZCBzb3J0IGl0cyBjb250ZW50cwotCSAqIGJhc2VkIG9uIHRoZSBlbGVtZW50cycgIm5hdHVyYWwgb3JkZXJpbmciLgotCSAqLwotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXIpIHsKLQkJdGhpcyhsaXN0SG9sZGVyLCBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFPih0aGlzLnNvcnRlZExpc3QpOwotCX0KLQotCXB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc29ydGVkTGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc29ydGVkTGlzdC5zaXplKCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCXJldHVybiB0aGlzLnNvcnRlZExpc3QudG9BcnJheSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3NvcnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0Q29tcGFyYXRvcihDb21wYXJhdG9yPEU+IGNvbXBhcmF0b3IpIHsKLQkJdGhpcy5jb21wYXJhdG9yID0gY29tcGFyYXRvcjsKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJLy8gc3luY2ggdGhlIHNvcnRlZCBsaXN0ICphZnRlciogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLAotCQkvLyBzaW5jZSBpdHMgdmFsdWUgbWlnaHQgY2hhbmdlIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZAotCQl0aGlzLmJ1aWxkU29ydGVkTGlzdCgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIHNvcnRlZCBsaXN0IHdoZW4gd2UgYXJlIG5vdCBsaXN0ZW5pbmcgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIKLQkJdGhpcy5zb3J0ZWRMaXN0LmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRTb3J0ZWRMaXN0KCkgewotCQkvLyBpZiB0aGUgbmV3IGxpc3QgaXMgZW1wdHksIGRvIG5vdGhpbmcKLQkJaW50IHNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmJ1aWxkU29ydGVkTGlzdChzaXplKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1aWxkU29ydGVkTGlzdChpbnQgc2l6ZSkgewotCQl0aGlzLnNvcnRlZExpc3QuZW5zdXJlQ2FwYWNpdHkoc2l6ZSk7Ci0JCWZvciAoRSBlYWNoIDogdGhpcy5saXN0SG9sZGVyKSB7Ci0JCQl0aGlzLnNvcnRlZExpc3QuYWRkKGVhY2gpOwotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQodGhpcy5zb3J0ZWRMaXN0LCB0aGlzLmNvbXBhcmF0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdC4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyBmaXJzdCBhZGQgdGhlIGl0ZW1zIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4uLgotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KHRoaXMuZ2V0SXRlbXMoZXZlbnQpLCB0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQkJLy8gLi4udGhlbiBzb3J0IHRoZSBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycwotCQl0aGlzLnNvcnRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdC4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbXNGcm9tTGlzdCh0aGlzLmdldEl0ZW1zKGV2ZW50KSwgdGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCS8vIG5vIHNvcnRpbmcgbmVlZGVkCi0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgd3JhcHBlZCBsaXN0LgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkvLyBmaXJzdCByZW1vdmUgdGhlIG9sZCBpdGVtcyBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuLi4KLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KHRoaXMuZ2V0T2xkSXRlbXMoZXZlbnQpLCB0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQkJLy8gdGhlbiBhZGQgdGhlIG5ldyBpdGVtcyBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuLi4KLQkJdGhpcy5hZGRJdGVtc1RvTGlzdCh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgdGhpcy5zb3J0ZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JCS8vIC4uLnRoZW4gc29ydCB0aGUgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMKLQkJdGhpcy5zb3J0TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHdyYXBwZWQgbGlzdC4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLSAgICAJLy8gZG8gbm90aGluZyAtIHNvcnQgb3JkZXIgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCBsaXN0IHdhcyBjbGVhcmVkLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0gICAgCXRoaXMuY2xlYXJMaXN0KHRoaXMuc29ydGVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaGFzIGNoYW5nZWQgaW4gc29tZSBkcmFtYXRpYyBmYXNoaW9uLgotCSAqIFJlYnVpbGQgb3VyIHNvcnRlZCBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlpZiAodGhpcy5zb3J0ZWRMaXN0LmlzRW1wdHkoKSkgewotCQkJCS8vIG5vIGNoYW5nZQotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnNvcnRlZExpc3QsIExJU1RfVkFMVUVTKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLnNvcnRlZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkJdGhpcy5idWlsZFNvcnRlZExpc3Qoc2l6ZSk7Ci0JCQkJdGhpcy5maXJlSXRlbXNBZGRlZChMSVNUX1ZBTFVFUywgMCwgdGhpcy5zb3J0ZWRMaXN0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zb3J0ZWRMaXN0LmNsZWFyKCk7Ci0JCQkJdGhpcy5idWlsZFNvcnRlZExpc3Qoc2l6ZSk7Ci0JCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTElTVF9WQUxVRVMsIHRoaXMuc29ydGVkTGlzdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBzb3J0IHRoZSBzb3J0ZWQgbGlzdCBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMsIGlmIG5lY2Vzc2FyeTsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzb3J0TGlzdCgpIHsKLQkJLy8gc2F2ZSB0aGUgdW5zb3J0ZWQgc3RhdGUgb2YgdGhlIHNvcnRlZCBsaXN0IHNvIHdlIGNhbiBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mICJyZXBsYWNlZCIgaXRlbXMKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUFycmF5TGlzdDxFPiB1bnNvcnRlZExpc3QgPSAoQXJyYXlMaXN0PEU+KSB0aGlzLnNvcnRlZExpc3QuY2xvbmUoKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0aGlzLnNvcnRlZExpc3QsIHRoaXMuY29tcGFyYXRvcik7Ci0JCVJhbmdlIGRpZmZSYW5nZSA9IENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZSYW5nZSh1bnNvcnRlZExpc3QsIHRoaXMuc29ydGVkTGlzdCk7Ci0JCWlmIChkaWZmUmFuZ2Uuc2l6ZSA+IDApIHsKLQkJCUxpc3Q8RT4gdW5zb3J0ZWRJdGVtcyA9IHVuc29ydGVkTGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJTGlzdDxFPiBzb3J0ZWRJdGVtcyA9IHRoaXMuc29ydGVkTGlzdC5zdWJMaXN0KGRpZmZSYW5nZS5zdGFydCwgZGlmZlJhbmdlLmVuZCArIDEpOwotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChMSVNUX1ZBTFVFUywgZGlmZlJhbmdlLnN0YXJ0LCBzb3J0ZWRJdGVtcywgdW5zb3J0ZWRJdGVtcyk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnNvcnRlZExpc3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQxNzlmZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0ZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIG1vZGVsLCAibGF6aWx5IiBsaXN0ZW4gdG8gaXQsIGFuZCBjb252ZXJ0Ci0gKiBpdHMgc3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbnMgaW50byBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBjaGFuZ2UKLSAqIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQ6PHVsPgotICogPGxpPntAbGluayAjYnVpbGRWYWx1ZSgpfTxwPgotICogICAgIHRvIHJldHVybiB0aGUgY3VycmVudCBwcm9wZXJ0eSB2YWx1ZSwgYXMgZGVyaXZlZCBmcm9tIHRoZQotICogICAgIGN1cnJlbnQgbW9kZWwKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RhdGVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8VD4KLXsKLQkvKiogVGhlIHdyYXBwZWQgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIE1vZGVsIG1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2ggd2l0aCBjaGFuZ2VzIHRvIHRoZSB3cmFwcGVkIG1vZGVsLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQgbW9kZWwuCi0JICovCi0JcHJvdGVjdGVkIFN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0YXRlQ2hhbmdlTGlzdGVuZXIgYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVN0YXRlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnN0YXRlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLm1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRlIGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBtb2RlbCdzIHN0YXRlIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RhdGVDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQ1Mjg2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29sbGVjdGlvblZhbHVlTW9kZWx9IHRoYXQgY2FuIGJlIHVzZWQgZm9yCi0gKiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb24gYSBzdGF0aWMgY29sbGVjdGlvbiwgYnV0IHN0aWxsIGFsbG93cyBsaXN0ZW5lcnMgdG8gYmUgYWRkZWQuCi0gKiBMaXN0ZW5lcnMgd2lsbCA8ZW0+bmV2ZXI8L2VtPiBiZSBub3RpZmllZCBvZiBhbnkgY2hhbmdlcywgYmVjYXVzZSB0aGVyZSBzaG91bGQgYmUgbm9uZS4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRpY0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCS8qKiBUaGUgZWxlbWVudHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIE9iamVjdFtdIGVsZW1lbnRzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGFycmF5LgotCSAqLwotCXB1YmxpYyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbChFLi4uIGVsZW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZWxlbWVudHMgPSBlbGVtZW50cy5jbG9uZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gZWxlbWVudHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IEFycmF5VG9vbHMuYXJyYXkoZWxlbWVudHMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmxlbmd0aDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCS8vIHdlIGNhbiBjYXN0IGhlcmUgc2luY2Ugb3VyIGNvbnN0cnVjdG9ycyByZXF1aXJlIHRoZSBlbGVtZW50cyB0byBiZQotCQkvLyBvZiB0eXBlIEUgYW5kIEFycmF5SXRlcmF0b3IgaXMgcmVhZC1vbmx5Ci0JCXJldHVybiAoSXRlcmF0b3I8RT4pIG5ldyBBcnJheUl0ZXJhdG9yPE9iamVjdD4odGhpcy5lbGVtZW50cyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKHRoaXMuZWxlbWVudHMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNMaXN0VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhiNmY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3RWYWx1ZU1vZGVsfSB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGEgbGlzdCBpdGVyYXRvciBvbiBhIHN0YXRpYyBsaXN0LCBidXQgc3RpbGwgYWxsb3dzIGxpc3RlbmVycyB0byBiZSBhZGRlZC4KLSAqIExpc3RlbmVycyB3aWxsIDxlbT5uZXZlcjwvZW0+IGJlIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBub25lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljTGlzdFZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0JLyoqIFRoZSBlbGVtZW50cy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gZWxlbWVudHM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGxpc3QgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIFN0YXRpY0xpc3RWYWx1ZU1vZGVsKEUuLi4gZWxlbWVudHMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50cyA9IGVsZW1lbnRzLmNsb25lKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgc3RhdGljIGxpc3QgdmFsdWUgbW9kZWwgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMuCi0JICovCi0JcHVibGljIFN0YXRpY0xpc3RWYWx1ZU1vZGVsKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBlbGVtZW50cykgewotCQlzdXBlcigpOwotCQl0aGlzLmVsZW1lbnRzID0gQXJyYXlUb29scy5hcnJheShlbGVtZW50cyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLQkJLy8gd2UgY2FuIGNhc3QgaGVyZSBzaW5jZSBvdXIgY29uc3RydWN0b3JzIHJlcXVpcmUgdGhlIGVsZW1lbnRzIHRvIGJlCi0JCS8vIG9mIHR5cGUgRSBhbmQgQXJyYXlJdGVyYXRvciBpcyByZWFkLW9ubHkKLQkJcmV0dXJuIChJdGVyYXRvcjxFPikgbmV3IEFycmF5SXRlcmF0b3I8T2JqZWN0Pih0aGlzLmVsZW1lbnRzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPEU+IGxpc3RJdGVyYXRvcigpIHsKLQkJLy8gd2UgY2FuIGNhc3QgaGVyZSBzaW5jZSBvdXIgY29uc3RydWN0b3JzIHJlcXVpcmUgdGhlIGVsZW1lbnRzIHRvIGJlCi0JCS8vIG9mIHR5cGUgRSBhbmQgQXJyYXlMaXN0SXRlcmF0b3IgaXMgcmVhZC1vbmx5Ci0JCXJldHVybiAoTGlzdEl0ZXJhdG9yPEU+KSBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8T2JqZWN0Pih0aGlzLmVsZW1lbnRzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRzLmxlbmd0aDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgRSBnZXQoaW50IGluZGV4KSB7Ci0JCS8vIHdlIGNhbiBjYXN0IGhlcmUgc2luY2Ugb3VyIGNvbnN0cnVjdG9ycyByZXF1aXJlIHRoZSBlbGVtZW50cyB0byBiZQotCQkvLyBvZiB0eXBlIEUKLQkJcmV0dXJuIChFKSB0aGlzLmVsZW1lbnRzW2luZGV4XTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudHMuY2xvbmUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT2JqZWN0IG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZChBcnJheXMudG9TdHJpbmcodGhpcy5lbGVtZW50cykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc4ZjVhYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUHJvcGVydHlWYWx1ZU1vZGVsfSB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGEgc3RhdGljIHZhbHVlLCBidXQgc3RpbGwgYWxsb3dzIGxpc3RlbmVycyB0byBiZSBhZGRlZC4KLSAqIExpc3RlbmVycyB3aWxsIDxlbT5uZXZlcjwvZW0+IGJlIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzLCBiZWNhdXNlIHRoZXJlIHNob3VsZCBiZSBub25lLgotICovCi1wdWJsaWMgY2xhc3MgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQkvKiogVGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBUIHZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRpYyBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsKFQgdmFsdWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY1RyZWVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmU2MDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVHJlZVZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFRyZWVWYWx1ZU1vZGVsfSB0aGF0IGNhbiBiZSB1c2VkIGZvcgotICogcmV0dXJuaW5nIGFuIGl0ZXJhdG9yIG9uIGEgc3RhdGljIHRyZWUsIGJ1dCBzdGlsbCBhbGxvd3MgbGlzdGVuZXJzIHRvIGJlIGFkZGVkLgotICogTGlzdGVuZXJzIHdpbGwgPGVtPm5ldmVyPC9lbT4gYmUgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMsIGJlY2F1c2UgdGhlcmUgc2hvdWxkIGJlIG5vbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0aWNUcmVlVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgVHJlZVZhbHVlTW9kZWw8RT4KLXsKLQkvKiogVGhlIHRyZWUncyBub2Rlcy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIEU+IG5vZGVzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHJlYWQtb25seSB0cmVlIHZhbHVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIG5vZGVzLgotCSAqLwotCXB1YmxpYyBTdGF0aWNUcmVlVmFsdWVNb2RlbChJdGVyYWJsZTw/IGV4dGVuZHMgRT4gbm9kZXMpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKG5vZGVzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMubm9kZXMgPSBub2RlczsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRyZWVWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFPiBub2RlcygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUl0ZXJhdG9yPEU+KHRoaXMubm9kZXMuaXRlcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5ub2Rlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzQwNTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gdHJhbnNmb3JtIGEge0BsaW5rIExpc3RWYWx1ZU1vZGVsfQotICogKG9yIGFkYXB0ZWQge0BsaW5rIENvbGxlY3Rpb25WYWx1ZU1vZGVsfSkgaW50byBhIHJlYWQtb25seSB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9Ci0gKiB3aG9zZSBpdGVtcyBhcmUgdHJhbmZvcm1hdGlvbnMgb2YgdGhlIGl0ZW1zIGluIHRoZSB3cmFwcGVkCi0gKiB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9LiBJdCB3aWxsIGtlZXAgaXRzIGNvbnRlbnRzIGluIHN5bmNoIHdpdGgKLSAqIHRoZSBjb250ZW50cyBvZiB0aGUgd3JhcHBlZCB7QGxpbmsgTGlzdFZhbHVlTW9kZWx9IGFuZCBub3RpZmllcyBpdHMKLSAqIGxpc3RlbmVycyBvZiBhbnkgY2hhbmdlcy4KLSAqIDxwPgotICogVGhlIHtAbGluayBUcmFuc2Zvcm1lcn0gY2FuIGJlIGNoYW5nZWQgYXQgYW55IHRpbWU7IGFsbG93aW5nIHRoZSBzYW1lCi0gKiBhZGFwdGVyIHRvIGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgdHJhbnNmb3JtYXRpb25zLgotICogPHA+Ci0gKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBidWlsZGluZyBhIHtAbGluayBUcmFuc2Zvcm1lcn0sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPC9jb2RlPiBjYW4KLSAqIGVpdGhlciBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybUl0ZW1fKE9iamVjdCl9IG9yLAotICogaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlCi0gKiB3cmFwcGVkIGl0ZW0gaXMgPGNvZGU+bnVsbDwvY29kZT4sIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU2luY2Ugd2Ugb25seSBsaXN0ZW4gdG8gdGhlIHdyYXBwZWQgbGlzdCB3aGVuIHdlIGhhdmUKLSAqIGxpc3RlbmVycyBvdXJzZWx2ZXMgYW5kIHdlIGNhbiBvbmx5IHN0YXkgaW4gc3luY2ggd2l0aCB0aGUgd3JhcHBlZAotICogbGlzdCB3aGlsZSB3ZSBhcmUgbGlzdGVuaW5nIHRvIGl0LCByZXN1bHRzIHRvIHZhcmlvdXMgbWV0aG9kcwotICogKGUuZy4ge0BsaW5rICNzaXplKCl9LCB7QGxpbmsgI2dldChpbnQpfSkgd2lsbCBiZSB1bnByZWRpY3RhYmxlIHdoZW5ldmVyCi0gKiB3ZSBkbyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzLiBUaGlzIHNob3VsZCBub3QgYmUgdG9vIHBhaW5mdWwgc2luY2UsCi0gKiBtb3N0IGxpa2VseSwgY2xpZW50cyB3aWxsIGFsc28gYmUgbGlzdGVuZXJzLgotICogCi0gKiBAc2VlIFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsPEUxLCBFMj4KLQlleHRlbmRzIExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxFMT4KLQlpbXBsZW1lbnRzIExpc3RWYWx1ZU1vZGVsPEUyPgotewotCi0JLyoqIFRoaXMgdHJhbnNmb3JtcyB0aGUgaXRlbXMsIHVubGVzcyB0aGUgc3ViY2xhc3Mgb3ZlcnJpZGVzIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfSkuICovCi0JcHJvdGVjdGVkIFRyYW5zZm9ybWVyPEUxLCBFMj4gdHJhbnNmb3JtZXI7Ci0KLQkvKiogVGhlIGxpc3Qgb2YgdHJhbnNmb3JtZWQgaXRlbXMuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8RTI+IHRyYW5zZm9ybWVkTGlzdDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogbGlzdCB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsaXN0SG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXN1cGVyKGxpc3RIb2xkZXIpOwotCQl0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxFMj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHZhbHVlIG1vZGVsIHdpdGggdGhlIHNwZWNpZmllZCBuZXN0ZWQKLQkgKiBsaXN0IHZhbHVlIG1vZGVsIGFuZCB0aGUgZGVmYXVsdCB0cmFuc2Zvcm1lci4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZQotCSAqIHtAbGluayAjdHJhbnNmb3JtSXRlbV8oT2JqZWN0KX0gb3Ige0BsaW5rICN0cmFuc2Zvcm1JdGVtKE9iamVjdCl9Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFMT4gbGlzdEhvbGRlcikgewotCQlzdXBlcihsaXN0SG9sZGVyKTsKLQkJdGhpcy50cmFuc2Zvcm1lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8RTI+KCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBjb2xsZWN0aW9uSG9sZGVyLCBUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RTE+KGNvbGxlY3Rpb25Ib2xkZXIpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBhbmQgdGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybUl0ZW1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtSXRlbShPYmplY3QpfQotCSAqIG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfS4KLQkgKi8KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgRTE+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJdGhpcyhuZXcgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxFMT4oY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxFMSwgRTI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFRyYW5zZm9ybWVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYXRvcjxFMj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8RTI+IGxpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxFMj4odGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCXB1YmxpYyBFMiBnZXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVkTGlzdC5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtZWRMaXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkvLyBzeW5jaCB0aGUgdHJhbnNmb3JtZWQgbGlzdCAqYWZ0ZXIqIHdlIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgbGlzdCBob2xkZXIsCi0JCS8vIHNpbmNlIGl0cyB2YWx1ZSBtaWdodCBjaGFuZ2Ugd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0LmFkZEFsbCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlcikpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5kaXNlbmdhZ2VNb2RlbCgpOwotCQkvLyBjbGVhciBvdXQgdGhlIGxpc3Qgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3QuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGluIHRoZSBzcGVjaWZpZWQgbGlzdCB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtSXRlbXMoTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEUxPiBsdm0pIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXMobHZtLCBsdm0uc2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1JdGVtcyhMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtSXRlbXModGhpcy5nZXRJdGVtcyhldmVudCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIG5ldyBpdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBldmVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxFMj4gdHJhbnNmb3JtTmV3SXRlbXMoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1JdGVtcyh0aGlzLmdldE5ld0l0ZW1zKGV2ZW50KSwgZXZlbnQuZ2V0SXRlbXNTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgb2xkIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBMaXN0PEUyPiB0cmFuc2Zvcm1PbGRJdGVtcyhMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMuZ2V0T2xkSXRlbXMoZXZlbnQpLCBldmVudC5nZXRJdGVtc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbXMuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8RTI+IHRyYW5zZm9ybUl0ZW1zKEl0ZXJhYmxlPD8gZXh0ZW5kcyBFMT4gaXRlbXMsIGludCBzaXplKSB7Ci0JCUxpc3Q8RTI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RTI+KHNpemUpOwotCQlmb3IgKEUxIGl0ZW0gOiBpdGVtcykgewotCQkJcmVzdWx0LmFkZCh0aGlzLnRyYW5zZm9ybUl0ZW0oaXRlbSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgaXRlbS4KLQkgKi8KLQlwcm90ZWN0ZWQgRTIgdHJhbnNmb3JtSXRlbShFMSBpdGVtKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybWVyLnRyYW5zZm9ybShpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm0gdGhlIHNwZWNpZmllZCwgbm9uLW51bGwsIGl0ZW0gYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBFMiB0cmFuc2Zvcm1JdGVtXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRTEgaXRlbSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ2hhbmdlIHRoZSB0cmFuc2Zvcm1lciBhbmQgcmVidWlsZCB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2Zvcm1lcihUcmFuc2Zvcm1lcjxFMSwgRTI+IHRyYW5zZm9ybWVyKSB7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQkJdGhpcy5yZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGNhY2hlIHdpdGggdGhlIHdyYXBwZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCkgewotCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0aGlzLnRyYW5zZm9ybUl0ZW1zKHRoaXMubGlzdEhvbGRlciksIHRoaXMudHJhbnNmb3JtZWRMaXN0LCBMSVNUX1ZBTFVFUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy50cmFuc2Zvcm1lZExpc3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0IGNoYW5nZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogVHJhbnNmb3JtIHRoZW0sIGFkZCB0aGVtIHRvIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0LAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KGV2ZW50LmdldEluZGV4KCksIHRoaXMudHJhbnNmb3JtSXRlbXMoZXZlbnQpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIFJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0Ci0JICogYW5kIG5vdGlmeSBvdXIgbGlzdGVuZXJzLgotCSAqLwotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIHdyYXBwZWQgbGlzdCBob2xkZXIuCi0JICogUmVwbGFjZSB0aGUgY29ycmVzcG9uZGluZyBpdGVtcyBpbiBvdXIgdHJhbnNmb3JtYXRpb24gbGlzdAotCSAqIGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRJdGVtc0luTGlzdChldmVudC5nZXRJbmRleCgpLCB0aGlzLnRyYW5zZm9ybU5ld0l0ZW1zKGV2ZW50KSwgdGhpcy50cmFuc2Zvcm1lZExpc3QsIExJU1RfVkFMVUVTKTsKLQl9Ci0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIG1vdmVkIGluIHRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyLgotCSAqIE1vdmUgdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgaW4gb3VyIHRyYW5zZm9ybWF0aW9uIGxpc3QKLQkgKiBhbmQgbm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0gICAgCXRoaXMubW92ZUl0ZW1zSW5MaXN0KGV2ZW50LmdldFRhcmdldEluZGV4KCksIGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldExlbmd0aCgpLCB0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIHdhcyBjbGVhcmVkLgotCSAqIENsZWFyIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotICAgIAl0aGlzLmNsZWFyTGlzdCh0aGlzLnRyYW5zZm9ybWVkTGlzdCwgTElTVF9WQUxVRVMpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIGxpc3QgaG9sZGVyIGhhcyBjaGFuZ2VkIGluIHNvbWUgZHJhbWF0aWMgZmFzaGlvbi4KLQkgKiBSZWJ1aWxkIG91ciB0cmFuc2Zvcm1hdGlvbiBsaXN0IGFuZCBub3RpZnkgb3VyIGxpc3RlbmVycy4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5yZWJ1aWxkVHJhbnNmb3JtZWRMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdHJhbnNmb3JtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgd3JhcHBlZCBpdGVtIGlzIG51bGwuCi0JICogSWYgdGhlIHdyYXBwZWQgaXRlbSBpcyBub3QgbnVsbCwgaXQgaXMgdHJhbnNmb3JtZWQgYnkgYSBzdWJjbGFzcwotCSAqIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsI3RyYW5zZm9ybUl0ZW1fKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0VHJhbnNmb3JtZXIgaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxFMSwgRTI+IHsKLQkJcHVibGljIEUyIHRyYW5zZm9ybShFMSBpdGVtKSB7Ci0JCQlyZXR1cm4gKGl0ZW0gPT0gbnVsbCkgPyBudWxsIDogVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbC50aGlzLnRyYW5zZm9ybUl0ZW1fKGl0ZW0pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3ZGFkYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogQSA8Y29kZT5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDwvY29kZT4gd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIFByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9Ci0gKiB0byB0cmFuc2Zvcm0gdGhlIHdyYXBwZWQgdmFsdWUgYmVmb3JlIGl0IGlzIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VmFsdWUoKX0uCi0gKiA8cD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIFRyYW5zZm9ybWVyfSwKLSAqIGEgc3ViY2xhc3Mgb2YgPGNvZGU+VHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogZWl0aGVyIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtXyhPYmplY3QpfSBvciwKLSAqIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwsIG92ZXJyaWRlIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotICogCi0gKiBAc2VlIFRyYW5zZm9ybWVyCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxUMSwgVDI+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFQxPgotCWltcGxlbWVudHMgUHJvcGVydHlWYWx1ZU1vZGVsPFQyPgotewotCXByb3RlY3RlZCBmaW5hbCBUcmFuc2Zvcm1lcjxUMSwgVDI+IHRyYW5zZm9ybWVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IHRyYW5zZm9ybWVyLgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9Ci0JICogbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSB7QGxpbmsgVHJhbnNmb3JtZXJ9LgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRyYW5zZm9ybWVyLgotCSAqLwotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQxPiB2YWx1ZUhvbGRlciwgVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRUcmFuc2Zvcm1lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFQyIGdldFZhbHVlKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIG9iamVjdCByZXR1cm5lZCBieSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsIGJlZm9yZSByZXR1cm5pbmcgaXQKLQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSB2YWx1ZXMgYmVmb3JlIHByb3BhZ2F0aW5nIHRoZSBjaGFuZ2UgZXZlbnQKLQkgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JICAgIFQxIGV2ZW50T2xkVmFsdWUgPSAoVDEpIGV2ZW50LmdldE9sZFZhbHVlKCk7Ci0JCU9iamVjdCBvbGRWYWx1ZSA9IHRoaXMudHJhbnNmb3JtT2xkKGV2ZW50T2xkVmFsdWUpOwotCSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkgICAgVDEgZXZlbnROZXdWYWx1ZSA9IChUMSkgZXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy50cmFuc2Zvcm1OZXcoZXZlbnROZXdWYWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5Ci0JICoge0BsaW5rICNnZXRWYWx1ZSgpfSwKLQkgKiB7QGxpbmsgI3RyYW5zZm9ybU9sZChPYmplY3QpfSwgYW5kCi0JICoge0BsaW5rICN0cmFuc2Zvcm1OZXcoT2JqZWN0KX0uCi0JICovCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybShUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm1lci50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkLCBub24tbnVsbCwgdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBUMiB0cmFuc2Zvcm1fKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUMSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgd2FzIG5vdCBvdmVycmlkZGVuLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVHJhbnNmb3JtIHRoZSBzcGVjaWZpZWQgb2xkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBCeSBkZWZhdWx0LCBjYWxsIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9LgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayAjdmFsdWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgVDIgdHJhbnNmb3JtT2xkKFQxIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCQotCS8qKgotCSAqIFRyYW5zZm9ybSB0aGUgc3BlY2lmaWVkIG5ldyB2YWx1ZSBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCi0JICogQnkgZGVmYXVsdCwgY2FsbCB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfS4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI3ZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50KX0uCi0JICovCi0JcHJvdGVjdGVkIFQyIHRyYW5zZm9ybU5ldyhUMSB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odmFsdWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdHJhbnNmb3JtZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBudWxsLgotCSAqIElmIHRoZSB3cmFwcGVkIHZhbHVlIGlzIG5vdCBudWxsLCBpdCBpcyB0cmFuc2Zvcm1lZCBieSBhIHN1YmNsYXNzCi0JICogaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsI3RyYW5zZm9ybV8oT2JqZWN0KX0uCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIERlZmF1bHRUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPFQxLCBUMj4gewotCQlwdWJsaWMgVDIgdHJhbnNmb3JtKFQxIHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMudHJhbnNmb3JtXyh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ0MmQ0Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBBIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYW5kIHVzZXMgYSB7QGxpbmsgQmlkaVRyYW5zZm9ybWVyfQotICogdG86PHVsPgotICogPGxpPnRyYW5zZm9ybSB0aGUgd3JhcHBlZCB2YWx1ZSBiZWZvcmUgaXQgaXMgcmV0dXJuZWQgYnkge0BsaW5rICNnZXRWYWx1ZSgpfQotICogPGxpPiJyZXZlcnNlLXRyYW5zZm9ybSIgdGhlIG5ldyB2YWx1ZSB0aGF0IGNvbWVzIGluIHZpYQotICoge0BsaW5rICNzZXRWYWx1ZShPYmplY3QpfQotICogPC91bD4KLSAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0sCi0gKiBhIHN1YmNsYXNzIG9mIDxjb2RlPlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8L2NvZGU+IGNhbgotICogb3ZlcnJpZGUge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9OwotICogb3IsIGlmIHNvbWV0aGluZyBvdGhlciB0aGFuIG51bGwgc2hvdWxkIGJlIHJldHVybmVkIHdoZW4gdGhlIHdyYXBwZWQgdmFsdWUKLSAqIGlzIG51bGwgb3IgdGhlIG5ldyB2YWx1ZSBpcyBudWxsLCBvdmVycmlkZSB7QGxpbmsgI3RyYW5zZm9ybShPYmplY3QpfQotICogYW5kIHtAbGluayAjcmV2ZXJzZVRyYW5zZm9ybShPYmplY3QpfS4KLSAqLwotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VDEsIFQyPgotCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDI+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIHRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIuCi0JICogVXNlIHRoaXMgY29uc3RydWN0b3IgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCi0JICoge0BsaW5rICN0cmFuc2Zvcm1fKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm1fKE9iamVjdCl9Ci0JICogKG9yIHtAbGluayAjdHJhbnNmb3JtKE9iamVjdCl9IGFuZCB7QGxpbmsgI3JldmVyc2VUcmFuc2Zvcm0oT2JqZWN0KX0pCi0JICogbWV0aG9kcyBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEge0BsaW5rIEJpZGlUcmFuc2Zvcm1lcn0uCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmVzdGVkCi0JICogd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWwgYW5kIGJpZGkgdHJhbnNmb3JtZXIuCi0JICovCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+IHZhbHVlSG9sZGVyLCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiB0cmFuc2Zvcm1lcikgewotCQlzdXBlcih2YWx1ZUhvbGRlciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRCaWRpVHJhbnNmb3JtZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVDIgdmFsdWUpIHsKLQkJLy8gInJldmVyc2UtdHJhbnNmb3JtIiB0aGUgb2JqZWN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSB0aGUgbmVzdGVkIHZhbHVlIG1vZGVsCi0JCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZSh0aGlzLnJldmVyc2VUcmFuc2Zvcm0odmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkIHZhbHVlIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB7QGxpbmsgI3NldFZhbHVlKE9iamVjdCl9LgotCSAqLwotCXByb3RlY3RlZCBUMSByZXZlcnNlVHJhbnNmb3JtKFQyIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldFRyYW5zZm9ybWVyKCkucmV2ZXJzZVRyYW5zZm9ybSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogIlJldmVyc2UtdHJhbnNmb3JtIiB0aGUgc3BlY2lmaWVkLCBub24tPGNvZGU+bnVsbDwvY29kZT4sCi0JICogdmFsdWUgYW5kIHJldHVybiB0aGUgcmVzdWx0LgotCSAqLwotCXByb3RlY3RlZCBUMSByZXZlcnNlVHJhbnNmb3JtXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVDIgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoaXMgbWV0aG9kIHdhcyBub3Qgb3ZlcnJpZGRlbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvcnMgYWNjZXB0IG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VDE+fSwKLQkgKiBzbyB0aGlzIGNhc3Qgc2hvdWxkIGJlIHNhZmUuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQxPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUMT4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogT3VyIGNvbnN0cnVjdG9ycyBhY2NlcHQgb25seSBhIHtAbGluayBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPn0sCi0JICogc28gdGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlLgotCSAqLwotCXByb3RlY3RlZCBCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPiBnZXRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIChCaWRpVHJhbnNmb3JtZXI8VDEsIFQyPikgdGhpcy50cmFuc2Zvcm1lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBiaWRpIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGJpZGkgdHJhbnNmb3JtZXIgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogd3JhcHBlZCB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgd3JhcHBlZCB2YWx1ZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4sIGl0IGlzIHRyYW5zZm9ybWVkIGJ5IGEgc3ViY2xhc3MKLQkgKiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgI3RyYW5zZm9ybV8oT2JqZWN0KX0uCi0JICogVGhlIGRlZmF1bHQgYmlkaSB0cmFuc2Zvcm1lciB3aWxsIGFsc28gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhlIG5ldyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBJZiB0aGUgbmV3IHZhbHVlIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgaXQgaXMgcmV2ZXJzZS10cmFuc2Zvcm1lZAotCSAqIGJ5IGEgc3ViY2xhc3MgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rICNyZXZlcnNlVHJhbnNmb3JtXyhPYmplY3QpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdEJpZGlUcmFuc2Zvcm1lcgotCQlleHRlbmRzIERlZmF1bHRUcmFuc2Zvcm1lcgotCQlpbXBsZW1lbnRzIEJpZGlUcmFuc2Zvcm1lcjxUMSwgVDI+Ci0JewotCQlwdWJsaWMgVDEgcmV2ZXJzZVRyYW5zZm9ybShUMiB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMucmV2ZXJzZVRyYW5zZm9ybV8odmFsdWUpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc4ZDFlZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIHtAbGluayBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXJ9IHByb3ZpZGVzCi0gKiBiYXNpYyB0cmVlIGNoYW5nZSBzdXBwb3J0LgotICogVGhpcyBjb252ZXJ0cyBhIHNldCBvZiBvbmUgb3IgbW9yZSB0cmVlcyBpbnRvCi0gKiBhIHNpbmdsZSB7QGxpbmsgI05PREVTfSB0cmVlLgotICogPHA+Ci0gKiBUaGUgdHlwaWNhbCBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyAoc2VlIHRoZSBkZXNjcmlwdGlvbnMKLSAqIGluIHtAbGluayBBc3BlY3RUcmVlVmFsdWVNb2RlbEFkYXB0ZXJ9KTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNub2Rlc18oKX0KLSAqIDxsaT57QGxpbmsgI25vZGVzKCl9Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJlZUFzcGVjdEFkYXB0ZXI8UyBleHRlbmRzIE1vZGVsLCBFPgotCWV4dGVuZHMgQXNwZWN0VHJlZVZhbHVlTW9kZWxBZGFwdGVyPFMsIEU+Ci17Ci0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIHN1YmplY3QncyB0cmVlcyB0aGF0IHdlIHVzZSBmb3IgdGhlIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSB0cmVlTmFtZXM7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfVFJFRV9OQU1FUyA9IG5ldyBTdHJpbmdbMF07Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHN1YmplY3QncyB0cmVlIGFzcGVjdHMuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB0cmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHRyZWUgYXNwZWN0IGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgc3ViamVjdAotCSAqIGFuZCB0cmVlLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihTdHJpbmcgdHJlZU5hbWUsIFMgc3ViamVjdCkgewotCQl0aGlzKG5ldyBTdHJpbmdbXSB7dHJlZU5hbWV9LCBzdWJqZWN0KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QKLQkgKiBhbmQgdHJlZXMuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVBc3BlY3RBZGFwdGVyKFN0cmluZ1tdIHRyZWVOYW1lcywgUyBzdWJqZWN0KSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTPihzdWJqZWN0KSwgdHJlZU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHRyZWVzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIFN0cmluZy4uLiB0cmVlTmFtZXMpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCXRoaXMudHJlZU5hbWVzID0gdHJlZU5hbWVzOwotCQl0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGFzcGVjdCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHN1YmplY3QgaG9sZGVyCi0JICogYW5kIHRyZWVzLgotCSAqLwotCXByb3RlY3RlZCBUcmVlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFM+IHN1YmplY3RIb2xkZXIsIENvbGxlY3Rpb248U3RyaW5nPiB0cmVlTmFtZXMpIHsKLQkJdGhpcyhzdWJqZWN0SG9sZGVyLCB0cmVlTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3RyZWVOYW1lcy5zaXplKCldKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBhc3BlY3QgYWRhcHRlciBmb3IgYW4gInVuY2hhbmdpbmciIHRyZWUgaW4KLQkgKiB0aGUgc3BlY2lmaWVkIHN1YmplY3QuIFRoaXMgaXMgdXNlZnVsIGZvciBhIHRyZWUgYXNwZWN0IHRoYXQgZG9lcyBub3QKLQkgKiBjaGFuZ2UgZm9yIGEgcGFydGljdWxhciBzdWJqZWN0OyBidXQgdGhlIHN1YmplY3Qgd2lsbCBjaGFuZ2UsIHJlc3VsdGluZyBpbgotCSAqIGEgbmV3IHRyZWUuCi0JICovCi0JcHJvdGVjdGVkIFRyZWVBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUz4gc3ViamVjdEhvbGRlcikgewotCQl0aGlzKHN1YmplY3RIb2xkZXIsIEVNUFRZX1RSRUVfTkFNRVMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyB0cmVlIGNoYW5nZSBldmVudHMgaW50byBWQUxVRSB0cmVlIGNoYW5nZSBldmVudHMKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy5ub2RlQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy5ub2RlUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0cmVlIGNoYW5nZSBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVHJlZUFzcGVjdEFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0gICAgCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCSgoTW9kZWwpIHRoaXMuc3ViamVjdCkuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLSAgICAJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJKChNb2RlbCkgdGhpcy5zdWJqZWN0KS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudHJlZUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZU5vZGVBZGRlZChldmVudC5jbG9uZSh0aGlzLCBOT0RFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmZpcmVOb2RlUmVtb3ZlZChldmVudC5jbG9uZSh0aGlzLCBOT0RFUykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVRyZWVDbGVhcmVkKGV2ZW50LmNsb25lKHRoaXMsIE5PREVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKGV2ZW50LmNsb25lKHRoaXMsIE5PREVTKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZVByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyNThjMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlRyZWVWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgY2xhc3MgcHJvdmlkZXMgdGhlIGluZnJhc3RydWN0dXJlIG5lZWRlZCB0byB3cmFwCi0gKiBhIHRyZWUgdmFsdWUgbW9kZWwsICJsYXppbHkiIGxpc3RlbiB0byBpdCwgYW5kIGNvbnZlcnQKLSAqIGl0cyBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBpbnRvIHByb3BlcnR5IHZhbHVlIG1vZGVsIGNoYW5nZQotICogbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlOjx1bD4KLSAqIDxsaT57QGxpbmsgI2J1aWxkVmFsdWUoKX08cD4KLSAqICAgICB0byByZXR1cm4gdGhlIGN1cnJlbnQgcHJvcGVydHkgdmFsdWUsIGFzIGRlcml2ZWQgZnJvbSB0aGUKLSAqICAgICBjdXJyZW50IGNvbGxlY3Rpb24gdmFsdWUKLSAqIDwvdWw+Ci0gKiBTdWJjbGFzc2VzIG1pZ2h0IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGZvbGxvd2luZyBtZXRob2RzCi0gKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIChieSBub3QgcmVjYWxjdWxhdGluZyB0aGUgdmFsdWUsIGlmIHBvc3NpYmxlKTo8dWw+Ci0gKiA8bGk+e0BsaW5rICNub2RlQWRkZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDxsaT57QGxpbmsgI25vZGVSZW1vdmVkKFRyZWVDaGFuZ2VFdmVudCBldmVudCl9Ci0gKiA8bGk+e0BsaW5rICN0cmVlQ2xlYXJlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpfQotICogPGxpPntAbGluayAjdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KX0KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPFQ+Ci17Ci0JLyoqIFRoZSB3cmFwcGVkIHRyZWUgdmFsdWUgbW9kZWwuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVWYWx1ZU1vZGVsPD8+IHRyZWVIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaCB3aXRoIGNoYW5nZXMgdG8gdGhlIHdyYXBwZWQgdHJlZSBob2xkZXIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFRyZWVDaGFuZ2VMaXN0ZW5lciB0cmVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgcHJvcGVydHkgdmFsdWUgbW9kZWwgd2l0aCB0aGUgc3BlY2lmaWVkIHdyYXBwZWQKLQkgKiB0cmVlIHZhbHVlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcihUcmVlVmFsdWVNb2RlbDw/PiB0cmVlSG9sZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudHJlZUhvbGRlciA9IHRyZWVIb2xkZXI7Ci0JCXRoaXMudHJlZUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZUFkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlci50aGlzLnRyZWVDbGVhcmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyLnRoaXMudHJlZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidHJlZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdHJlZSBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWxfKCkgewotCQl0aGlzLnRyZWVIb2xkZXIuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLnRyZWVDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHRyZWUgaG9sZGVyLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsXygpIHsKLQkJdGhpcy50cmVlSG9sZGVyLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy50cmVlQ2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudHJlZUhvbGRlcik7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyOwotCSAqIHByb3BhZ2F0ZSB0aGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vZGVBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgd3JhcHBlZCB0cmVlIGhvbGRlcjsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIHNpbXBseSByZWNhbGN1bGF0ZSB0aGUgdmFsdWUgYW5kIGZpcmUgYW4gZXZlbnQKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgd3JhcHBlZCB0cmVlIGhvbGRlciB3YXMgY2xlYXJlZDsKLQkgKiBwcm9wYWdhdGUgdGhlIGNoYW5nZSBub3RpZmljYXRpb24gYXBwcm9wcmlhdGVseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJLy8gYnkgZGVmYXVsdCwgc2ltcGx5IHJlY2FsY3VsYXRlIHRoZSB2YWx1ZSBhbmQgZmlyZSBhbiBldmVudAotCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB3cmFwcGVkIHRyZWUgaG9sZGVyIGNoYW5nZWQ7Ci0JICogcHJvcGFnYXRlIHRoZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFwcHJvcHJpYXRlbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBieSBkZWZhdWx0LCBzaW1wbHkgcmVjYWxjdWxhdGUgdGhlIHZhbHVlIGFuZCBmaXJlIGFuIGV2ZW50Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUFzcGVjdEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODc2ZDVlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQXNwZWN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9Ci0gKiBhbmQgbGlzdGVuaW5nIGZvciBjaGFuZ2VzIHRvIDxlbT5hc3BlY3RzPC9lbT4gb2YgdGhlIDxlbT52YWx1ZTwvZW0+IGNvbnRhaW5lZAotICogYnkgdGhlIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0uIENoYW5nZXMgdG8gdGhlIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0ncwotICogdmFsdWUgYXJlIGFsc28gbW9uaXRvcmVkLgotICogPHA+Ci0gKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHZhbHVlIHRoYXQgbWF5IGNoYW5nZSwgYnV0IHdob3NlIGFzcGVjdHMgY2FuIGFsc28KLSAqIGNoYW5nZSBpbiBhIGZhc2hpb24gdGhhdCBtaWdodCBiZSBvZiBpbnRlcmVzdCB0byB0aGUgY2xpZW50LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBDbGllbnRzIHdpbGwgbmVlZCB0byBsaXN0ZW4gZm9yIHR3byBkaWZmZXJlbnQgY2hhbmdlIG5vdGlmaWNhdGlvbnM6Ci0gKiBhIHByb3BlcnR5IGNoYW5nZSBldmVudCB3aWxsIGJlIGJlIGZpcmVkIHdoZW4gdGhlIDxlbT52YWx1ZTwvZW0+IGNoYW5nZXM7Ci0gKiBhIHN0YXRlIGNoYW5nZSBldmVudCB3aWxsIGJlIGZpcmVkIHdoZW4gYW4gPGVtPmFzcGVjdDwvZW0+IG9mIHRoZSB2YWx1ZSBjaGFuZ2VzLgotICogPHA+Ci0gKiBTdWJjbGFzc2VzIG5lZWQgdG8gb3ZlcnJpZGUgdHdvIG1ldGhvZHM6PHVsPgotICogPGxpPntAbGluayAjZW5nYWdlVmFsdWVfKCl9PHA+Ci0gKiAgICAgYmVnaW4gbGlzdGVuaW5nIHRvIHRoZSBhcHByb3ByaWF0ZSBhc3BlY3Qgb2YgdGhlIHZhbHVlIGFuZCBjYWxsCi0gKiAgICAge0BsaW5rICN2YWx1ZUFzcGVjdENoYW5nZWQoKX0gd2hlbmV2ZXIgdGhlIGFzcGVjdCBjaGFuZ2VzCi0gKiAgICAgKHRoaXMgd2lsbCBmaXJlIGEgc3RhdGUgY2hhbmdlIGV2ZW50KQotICogPGxpPntAbGluayAjZGlzZW5nYWdlVmFsdWVfKCl9PHA+Ci0gKiAgICAgc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGFwcHJvcHJpYXRlIGFzcGVjdCBvZiB0aGUgdmFsdWUKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLQlleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8Vj4KLQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+Ci17Ci0JLyoqIENhY2hlIHRoZSB2YWx1ZSBzbyB3ZSBjYW4gZGlzZW5nYWdlLiBOdWxsIHVudGlsIHdlIGhhdmUgYSBsaXN0ZW5lciovCi0JcHJvdGVjdGVkIFYgdmFsdWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsdWVBc3BlY3RBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gYWxsb3cgYm90aCBwcm9wZXJ0eSBhbmQgc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlU3VwcG9ydCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBWIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoViB2YWx1ZSkgewotCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJdGhpcy5lbmdhZ2VWYWx1ZSgpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoZXZlbnQuY2xvbmUodGhpcykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlbmQgY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoU3RhdGVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RQcm9wZXJ0eVZhbHVlTW9kZWwgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBjaGVjayBmb3Igc3RhdGUgY2hhbmdlIGxpc3RlbmVycy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgfHwgc3VwZXIuaGFzTGlzdGVuZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXIgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB0byBlbmdhZ2UgYW4gYXNwZWN0IG9mIHRoZSB2YWx1ZSBtb2RlbCdzIHZhbHVlLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQl0aGlzLmVuZ2FnZVZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGRpc2VuZ2FnZSBhbiBhc3BlY3Qgb2YgdGhlIHZhbHVlIG1vZGVsJ3MgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlVmFsdWUoKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RhcnQgbGlzdGVuaW5nIHRvIGFuIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZSgpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5lbmdhZ2VWYWx1ZV8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0YXJ0IGxpc3RlbmluZyB0byBzb21lIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKiBBdCB0aGlzIHBvaW50IHdlIGNhbiBiZSBzdXJlIHRoZSB2YWx1ZSBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBlbmdhZ2VWYWx1ZV8oKTsKLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIGFuIGFzcGVjdCBvZiB0aGUgY3VycmVudCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5kaXNlbmdhZ2VWYWx1ZV8oKTsKLQkJCXRoaXMudmFsdWUgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RvcCBsaXN0ZW5pbmcgdG8gYW4gYXNwZWN0IG9mIHRoZSBjdXJyZW50IHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhlIHZhbHVlIGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpOwotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCB3aGVuZXZlciB0aGUgdmFsdWUncyBhc3BlY3QgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUFzcGVjdENoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIE91ciBjb25zdHJ1Y3RvciBhY2NlcHRzIG9ubHkgYSB7QGxpbmsgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWx9e0Bjb2RlPFY+fS4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gZ2V0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiAoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGNhOGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TaW1wbGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBhbGwgdGhlIGFzcGVjdHMKLSAqIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlQ2hhbmdlQWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlTGlzdGVuZXIgdmFsdWVBc3BlY3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2hhbmdlIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICovCi0JcHVibGljIFZhbHVlQ2hhbmdlQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudmFsdWVBc3BlY3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUFzcGVjdExpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQXNwZWN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIG1vZGVsQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ2hhbmdlQWRhcHRlci50aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ2YWx1ZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVBc3BlY3RMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVBc3BlY3RMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdmFsdWVBc3BlY3RDaGFuZ2VkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDZkZmJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUgY29sbGVjdGlvbgotICogYXNwZWN0cyBvZiB0aGUgdmFsdWUgaW4gdGhlIHdyYXBwZWQgdmFsdWUgbW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyPFYgZXh0ZW5kcyBNb2RlbD4KLQlleHRlbmRzIFZhbHVlQXNwZWN0QWRhcHRlcjxWPgotewotCS8qKiBUaGUgbmFtZXMgb2YgdGhlIHZhbHVlJ3MgY29sbGVjdGlvbnMgdGhhdCB3ZSBsaXN0ZW4gdG8uICovCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIGNvbGxlY3Rpb25OYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgdmFsdWVDb2xsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIGNvbGxlY3Rpb25zLgotCSAqLwotCXB1YmxpYyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyLCBTdHJpbmcuLi4gY29sbGVjdGlvbk5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5jb2xsZWN0aW9uTmFtZXMgPSBjb2xsZWN0aW9uTmFtZXM7Ci0JCXRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLml0ZW1zQWRkZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5pdGVtc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyLnRoaXMuY29sbGVjdGlvbkNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVDb2xsZWN0aW9uQWRhcHRlci50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIGNvbGxlY3Rpb24gbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXIudGhpcy5jb2xsZWN0aW9uTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIGNvbGxlY3Rpb25OYW1lIDogdGhpcy5jb2xsZWN0aW9uTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKGNvbGxlY3Rpb25OYW1lLCB0aGlzLnZhbHVlQ29sbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgY29sbGVjdGlvbk5hbWUgOiB0aGlzLmNvbGxlY3Rpb25OYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoY29sbGVjdGlvbk5hbWUsIHRoaXMudmFsdWVDb2xsZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNBZGRlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZW1vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUxpc3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjlhMTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byBvbmUgb3IgbW9yZSBsaXN0Ci0gKiBhc3BlY3RzIG9mIHRoZSB2YWx1ZSBpbiB0aGUgd3JhcHBlZCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIFZhbHVlTGlzdEFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBsaXN0cyB0aGF0IHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gbGlzdE5hbWVzOwotCi0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB0aGUgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciB2YWx1ZUxpc3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgbGlzdHMuCi0JICovCi0JcHVibGljIFZhbHVlTGlzdEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBsaXN0TmFtZXMpIHsKLQkJc3VwZXIodmFsdWVIb2xkZXIpOwotCQl0aGlzLmxpc3ROYW1lcyA9IGxpc3ROYW1lczsKLQkJdGhpcy52YWx1ZUxpc3RMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUxpc3RMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVMaXN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMuaXRlbXNBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVMaXN0QWRhcHRlci50aGlzLml0ZW1zUmVtb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMuaXRlbXNSZXBsYWNlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMuaXRlbXNNb3ZlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCVZhbHVlTGlzdEFkYXB0ZXIudGhpcy5saXN0Q2xlYXJlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZUxpc3RBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdCBsaXN0ZW5lcjogIiArIEFycmF5cy5hc0xpc3QoVmFsdWVMaXN0QWRhcHRlci50aGlzLmxpc3ROYW1lcyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVmFsdWVBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgbGlzdE5hbWUgOiB0aGlzLmxpc3ROYW1lcykgewotCQkJdGhpcy52YWx1ZS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIobGlzdE5hbWUsIHRoaXMudmFsdWVMaXN0TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBsaXN0TmFtZSA6IHRoaXMubGlzdE5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihsaXN0TmFtZSwgdGhpcy52YWx1ZUxpc3RMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc1JlbW92ZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVwbGFjZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc01vdmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlUHJvcGVydHlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYjZiZTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEV4dGVuZCB7QGxpbmsgVmFsdWVBc3BlY3RBZGFwdGVyfSB0byBsaXN0ZW4gdG8gb25lIG9yIG1vcmUKLSAqIHByb3BlcnRpZXMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVQcm9wZXJ0eUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIFRoZSBuYW1lcyBvZiB0aGUgdmFsdWUncyBwcm9wZXJ0aWVzIHdlIGxpc3RlbiB0by4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nW10gcHJvcGVydHlOYW1lczsKLQotCS8qKiBMaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlUHJvcGVydHlMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVQcm9wZXJ0eUFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Vj4gdmFsdWVIb2xkZXIsIFN0cmluZy4uLiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy5wcm9wZXJ0eU5hbWVzID0gcHJvcGVydHlOYW1lczsKLQkJdGhpcy52YWx1ZVByb3BlcnR5TGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVQcm9wZXJ0eUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlUHJvcGVydHlBZGFwdGVyLnRoaXMucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHByb3BlcnR5IGxpc3RlbmVyOiAiICsgQXJyYXlzLmFzTGlzdChWYWx1ZVByb3BlcnR5QWRhcHRlci50aGlzLnByb3BlcnR5TmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQlmb3IgKFN0cmluZyBwcm9wZXJ0eU5hbWUgOiB0aGlzLnByb3BlcnR5TmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eU5hbWUsIHRoaXMudmFsdWVQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgcHJvcGVydHlOYW1lIDogdGhpcy5wcm9wZXJ0eU5hbWVzKSB7Ci0JCQl0aGlzLnZhbHVlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJvcGVydHlOYW1lLCB0aGlzLnZhbHVlUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDllNjM3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlU3RhdGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBWYWx1ZUFzcGVjdEFkYXB0ZXJ9IHRvIGxpc3RlbiB0byB0aGUKLSAqICJzdGF0ZSIgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVTdGF0ZUFkYXB0ZXI8ViBleHRlbmRzIE1vZGVsPgotCWV4dGVuZHMgVmFsdWVBc3BlY3RBZGFwdGVyPFY+Ci17Ci0JLyoqIExpc3RlbmVyIHRoYXQgbGlzdGVucyB0byB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciB2YWx1ZVN0YXRlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgdmFsdWUgc3RhdGUuCi0JICovCi0JcHVibGljIFZhbHVlU3RhdGVBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFY+IHZhbHVlSG9sZGVyKSB7Ci0JCXN1cGVyKHZhbHVlSG9sZGVyKTsKLQkJdGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVTdGF0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVZhbHVlU3RhdGVBZGFwdGVyLnRoaXMuc3RhdGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBWYWx1ZUFzcGVjdEFkYXB0ZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlVmFsdWVfKCkgewotCQl0aGlzLnZhbHVlLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy52YWx1ZVN0YXRlTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJdGhpcy52YWx1ZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMudmFsdWVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIGV2ZW50cyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlVHJlZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlYzBhZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVRyZWVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFZhbHVlQXNwZWN0QWRhcHRlcn0gdG8gbGlzdGVuIHRvIG9uZSBvciBtb3JlCi0gKiB0cmVlIGFzcGVjdHMgb2YgdGhlIHZhbHVlIGluIHRoZSB3cmFwcGVkIHZhbHVlIG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgVmFsdWVUcmVlQWRhcHRlcjxWIGV4dGVuZHMgTW9kZWw+Ci0JZXh0ZW5kcyBWYWx1ZUFzcGVjdEFkYXB0ZXI8Vj4KLXsKLQkvKiogVGhlIG5hbWVzIG9mIHRoZSB2YWx1ZSdzIHRyZWVzIHRoYXQgd2UgbGlzdGVuIHRvLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdbXSB0cmVlTmFtZXM7Ci0KLQkvKiogTGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSB2YWx1ZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgVHJlZUNoYW5nZUxpc3RlbmVyIHZhbHVlVHJlZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSB0cmVlcy4KLQkgKi8KLQlwdWJsaWMgVmFsdWVUcmVlQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxWPiB2YWx1ZUhvbGRlciwgU3RyaW5nLi4uIHRyZWVOYW1lcykgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JCXRoaXMudHJlZU5hbWVzID0gdHJlZU5hbWVzOwotCQl0aGlzLnZhbHVlVHJlZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbHVlVHJlZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBUcmVlQ2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZVRyZWVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLm5vZGVBZGRlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZVRyZWVBZGFwdGVyLnRoaXMubm9kZVJlbW92ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlWYWx1ZVRyZWVBZGFwdGVyLnRoaXMudHJlZUNsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgdHJlZUNoYW5nZWQoVHJlZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmFsdWVUcmVlQWRhcHRlci50aGlzLnRyZWVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInZhbHVlIHRyZWUgbGlzdGVuZXI6ICIgKyBBcnJheXMuYXNMaXN0KFZhbHVlVHJlZUFkYXB0ZXIudGhpcy50cmVlTmFtZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlQXNwZWN0QWRhcHRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZV8oKSB7Ci0JCWZvciAoU3RyaW5nIHRyZWVOYW1lIDogdGhpcy50cmVlTmFtZXMpIHsKLQkJCXRoaXMudmFsdWUuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKHRyZWVOYW1lLCB0aGlzLnZhbHVlVHJlZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVZhbHVlXygpIHsKLQkJZm9yIChTdHJpbmcgdHJlZU5hbWUgOiB0aGlzLnRyZWVOYW1lcykgewotCQkJdGhpcy52YWx1ZS5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIodHJlZU5hbWUsIHRoaXMudmFsdWVUcmVlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNoYW5nZSBldmVudHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgbm9kZUFkZGVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUcmVlQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy52YWx1ZUFzcGVjdENoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub2RlUmVtb3ZlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMudmFsdWVBc3BlY3RDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJlZUNoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLnZhbHVlQXNwZWN0Q2hhbmdlZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTYxZDQ5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgc2luZ2xlLWVsZW1lbnQge0BsaW5rIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgbnVsbCwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgY29sbGVjdGlvbiB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCkuCi0gKiBBbHNvLCBvbmx5IGEgc2luZ2xlLWVsZW1lbnQgY29sbGVjdGlvbiBjYW4gYmUgd3JpdHRlbiB0byB0aGUgYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIFdyaXRhYmxlUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JaW1wbGVtZW50cyBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIHdyaXRhYmxlCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0VmFsdWVzKEl0ZXJhYmxlPEU+IHZhbHVlcykgewotCQlJdGVyYXRvcjxFPiBzdHJlYW0gPSB2YWx1ZXMuaXRlcmF0b3IoKTsKLQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCUUgbmV3VmFsdWUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tc2luZ2xldG9uIGNvbGxlY3Rpb246ICIgKyB2YWx1ZXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQl0aGlzLmdldFZhbHVlSG9sZGVyKCkuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG51bGwpOwotCQl9Ci0JfQotCi0JLy8gb3VyIGNvbnN0cnVjdG9yIHRha2VzIG9ubHkgd3JpdGFibGUgcHJvcGVydHkgdmFsdWUgbW9kZWxzCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+IGdldFZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEU+KSB0aGlzLnZhbHVlSG9sZGVyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYzMDg0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL1dyaXRhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgdGhhdCBhbGxvd3MgdXMgdG8gbWFrZSBhIHtAbGluayBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbH0gYmVoYXZlIGxpa2UKLSAqIGEgc2luZ2xlLWVsZW1lbnQge0BsaW5rIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWx9LCBzb3J0YS4KLSAqIDxwPgotICogSWYgdGhlIHByb3BlcnR5J3MgdmFsdWUgaXMgbnVsbCwgYW4gZW1wdHkgaXRlcmF0b3IgaXMgcmV0dXJuZWQKLSAqIChpLmUuIHlvdSBjYW4ndCBoYXZlIGEgbGlzdCB3aXRoIGEgPGNvZGU+bnVsbDwvY29kZT4gZWxlbWVudCkuCi0gKiBBbHNvLCBvbmx5IGEgc2luZ2xlLWVsZW1lbnQgbGlzdCBjYW4gYmUgd3JpdHRlbiB0byB0aGUgYWRhcHRlci4KLSAqLwotcHVibGljIGNsYXNzIFdyaXRhYmxlUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8RT4KLQlleHRlbmRzIFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+Ci0JaW1wbGVtZW50cyBXcml0YWJsZUxpc3RWYWx1ZU1vZGVsPEU+Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCB3cml0YWJsZSBwcm9wZXJ0eSB2YWx1ZSBtb2RlbCB0byBhIHdyaXRhYmxlCi0JICogY29sbGVjdGlvbiB2YWx1ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiB2YWx1ZUhvbGRlcikgewotCQlzdXBlcih2YWx1ZUhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFdyaXRhYmxlTGlzdFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0TGlzdFZhbHVlcyhJdGVyYWJsZTxFPiBsaXN0VmFsdWVzKSB7Ci0JCUl0ZXJhdG9yPEU+IHN0cmVhbSA9IGxpc3RWYWx1ZXMuaXRlcmF0b3IoKTsKLQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCUUgbmV3VmFsdWUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJub24tc2luZ2xldG9uIGxpc3Q6ICIgKyBsaXN0VmFsdWVzKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJdGhpcy5nZXRWYWx1ZUhvbGRlcigpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZ2V0VmFsdWVIb2xkZXIoKS5zZXRWYWx1ZShudWxsKTsKLQkJfQotCX0KLQotCS8vIG91ciBjb25zdHJ1Y3RvciB0YWtlcyBvbmx5IHdyaXRhYmxlIHByb3BlcnR5IHZhbHVlIG1vZGVscwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBnZXRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPikgdGhpcy52YWx1ZUhvbGRlcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NjcwYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlTdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGFkYXB0ZXIgd3JhcHMgYSBQcmVmZXJlbmNlIGFuZCBjb252ZXJ0cyBpdCBpbnRvIGEgUHJvcGVydHlWYWx1ZU1vZGVsLgotICogSXQgbGlzdGVucyBmb3IgdGhlIGFwcHJvcHJpYXRlICJwcmVmZXJlbmNlIiBjaGFuZ2VzIGFuZCBjb252ZXJ0cyB0aGVtIGludG8KLSAqIFZBTFVFIHByb3BlcnR5IGNoYW5nZXMuIEl0IGFsc28gYWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGEgZGVmYXVsdCB2YWx1ZQotICogZm9yIHRoZSBQcmVmZXJlbmNlLCB3aGljaCwgYnkgZGVmYXVsdCwgaXMgbnVsbCAoYW5kIGlzIHByb2JhYmx5ICpub3QqIGEgdmVyeQotICogZ29vZCBkZWZhdWx0KS4KLSAqIAotICogWW91IGNhbiBjb25maWd1cmUgd2hldGhlciB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlIGlzIHJldHVybmVkLAotICogdW5jaGFuZ2VkLCBhcyBhIHN0cmluZyBvciBhcyBzb21lIG90aGVyIG9iamVjdCAoZS5nLiBhbiBJbnRlZ2VyKSBieQotICogc2V0dGluZyB0aGUgYWRhcHRlcidzIGNvbnZlcnRlci4gSW50ZXJuYWxseSwgdGhlIHByZWZlcmVuY2UncyB2YWx1ZQotICogaXMgc3RvcmVkIGFzIHRoZSBjb252ZXJ0ZWQgb2JqZWN0OyBhbmQgdGhlIGNvbnZlcnNpb25zIHRha2UgcGxhY2UKLSAqIHdoZW4gcmVhZGluZyBvciB3cml0aW5nIGZyb20gdGhlIHByZWZlcmVuY2VzIG5vZGUgb3IgcmV0cmlldmluZyB0aGUKLSAqIHZhbHVlIGZyb20gYW4gZXZlbnQgZmlyZWQgYnkgdGhlIHByZWZlcmVuY2VzIG5vZGUuCi0gKiAKLSAqIFRoaXMgYWRhcHRlciBpcyBhIGJpdCBkaWZmZXJlbnQgZnJvbSBtb3N0IG90aGVyIGFkYXB0ZXJzIGJlY2F1c2UgdGhlCi0gKiBjaGFuZ2UgZXZlbnRzIGZpcmVkIG9mZiBieSBhIFByZWZlcmVuY2VzIG5vZGUgYXJlIGFzeW5jaHJvbm91cyBmcm9tCi0gKiB0aGUgY2hhbmdlIGl0c2VsZi4gKEFic3RyYWN0UHJlZmVyZW5jZXMgdXNlcyBhbiBldmVudCBkaXNwYXRjaCBkYWVtb24uKQotICogQXMgYSByZXN1bHQsIGEgY2xpZW50IGNhbiBzZXQgb3VyIHZhbHVlIHdpdGggI3NldFZhbHVlKE9iamVjdCkgYW5kIHdlCi0gKiB3aWxsIHJldHVybiBmcm9tIHRoYXQgbWV0aG9kIGJlZm9yZSB3ZSBldmVyIHJlY2VpdmUgbm90aWZpY2F0aW9uIGZyb20KLSAqIHRoZSBQcmVmZXJlbmNlcyBub2RlIHRoYXQgKml0KiBoYXMgY2hhbmdlZC4gVGhpcyBtZWFucyB3ZSBjYW5ub3QKLSAqIHJlbHkgb24gdGhhdCBldmVudCB0byBrZWVwIG91ciBpbnRlcm5hbGx5IGNhY2hlZCB2YWx1ZSBpbiBzeW5jaC4KLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4KLQlleHRlbmRzIEFzcGVjdEFkYXB0ZXI8UHJlZmVyZW5jZXM+Ci0JaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQPgotewotCS8qKiBUaGUga2V5IHRvIHRoZSBwcmVmZXJlbmNlIHdlIHVzZSBmb3IgdGhlIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcga2V5OwotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGN1cnJlbnQgKG9iamVjdCkgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugc28gd2UKLQkgKiBjYW4gcGFzcyBhbiAib2xkIHZhbHVlIiB3aGVuIHdlIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgdmFsdWU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCAob2JqZWN0KSB2YWx1ZSByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUCBkZWZhdWx0VmFsdWU7Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnZlcnRlciBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlIHByZWZlcmVuY2UncwotCSAqIHN0cmluZyB2YWx1ZSB0byBhbmQgZnJvbSBhbiBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlIHdpbGwgYmUgbnVsbC4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSkgewotCQl0aGlzKHByZWZlcmVuY2VzLCBrZXksIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2Ugd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwoUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMsIFN0cmluZyBrZXksIFAgZGVmYXVsdFZhbHVlKSB7Ci0JCXRoaXMocHJlZmVyZW5jZXMsIGtleSwgZGVmYXVsdFZhbHVlLCBCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFA+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXI8UD4gY29udmVydGVyKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpLCBrZXksIGRlZmF1bHRWYWx1ZSwgY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmb3JCb29sZWFuKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcga2V5LCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCWRlZmF1bHRWYWx1ZSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0UsCi0JCQkJQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkKLQkJCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gZm9ySW50ZWdlcihQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIGtleSwgaW50IGRlZmF1bHRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oCi0JCQkJcHJlZmVyZW5jZXMsCi0JCQkJa2V5LAotCQkJCUludGVnZXIudmFsdWVPZihkZWZhdWx0VmFsdWUpLAotCQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpCi0JCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIHByZWZlcmVuY2UuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHByZWZlcmVuY2Ugd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5KSB7Ci0JCXRoaXMocHJlZmVyZW5jZXNIb2xkZXIsIGtleSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZSB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByZWZlcmVuY2VzPiBwcmVmZXJlbmNlc0hvbGRlciwgU3RyaW5nIGtleSwgUCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhwcmVmZXJlbmNlc0hvbGRlciwga2V5LCBkZWZhdWx0VmFsdWUsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC48UD5pbnN0YW5jZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5LCBQIGRlZmF1bHRWYWx1ZSwgQmlkaVN0cmluZ0NvbnZlcnRlcjxQPiBjb252ZXJ0ZXIpIHsKLQkJc3VwZXIocHJlZmVyZW5jZXNIb2xkZXIpOwotCQl0aGlzLmtleSA9IGtleTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJLy8gb3VyIHZhbHVlIGlzIG51bGwgd2hlbiB3ZSBhcmUgbm90IGxpc3RlbmluZyB0byB0aGUgcHJlZmVyZW5jZQotCQl0aGlzLnZhbHVlID0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQSBwcmVmZXJlbmNlIGhhcyBjaGFuZ2VkLCBub3RpZnkgdGhlIGxpc3RlbmVycyBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJLy8gdHJhbnNmb3JtIHRoZSBwcmVmZXJlbmNlIGNoYW5nZSBldmVudHMgaW50byBWQUxVRSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzCi0JCXJldHVybiBuZXcgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJlZmVyZW5jZUNoYW5nZShQcmVmZXJlbmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsLnRoaXMucHJlZmVyZW5jZUNoYW5nZWQoZXZlbnQuZ2V0S2V5KCksIGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicHJlZmVyZW5jZSBjaGFuZ2UgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYWNoZWQgKGNvbnZlcnRlZCkgdmFsdWUuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBQIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUHJvcGVydHlWYWx1ZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgY2FjaGVkIHZhbHVlLCB0aGVuIHNldCB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0VmFsdWUoUCB2YWx1ZSkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQlyZXR1cm47CQkvLyBubyBjaGFuZ2VzIGFsbG93ZWQgd2hlbiB3ZSBoYXZlIG5vIGxpc3RlbmVycwotCQl9Ci0KLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHZhbHVlKTsKLQotCQlpZiAoKHRoaXMuc3ViamVjdCAhPSBudWxsKSAmJiB0aGlzLnByZWZlcmVuY2VJc1RvQmVTZXQob2xkLCB2YWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJDbGFzcygpIHsKLQkJcmV0dXJuIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCXJldHVybiBWQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFZBTFVFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQl0aGlzLnN1YmplY3QuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuc3ViamVjdC5yZW1vdmVQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGZvciBzb21lIG9kZCByZWFzb24sIHdlIGFyZSBub3QgYWxsb3dlZCB0byByZW1vdmUgYSBsaXN0ZW5lciBmcm9tIGEgImRlYWQiCi0JCQkvLyBwcmVmZXJlbmNlcyBub2RlOyBzbyBoYW5kbGUgdGhlIGV4Y2VwdGlvbiB0aGF0IGdldHMgdGhyb3duIGhlcmUKLQkJCWlmICggISBleC5nZXRNZXNzYWdlKCkuZXF1YWxzKCJOb2RlIGhhcyBiZWVuIHJlbW92ZWQuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGlmIGl0IGlzIG5vdCB0aGUgZXhwZWN0ZWQgZXhjZXB0aW9uLCByZS10aHJvdyBpdAotCQkJCXRocm93IGV4OwotCQkJfQotCQl9Ci0JCXRoaXMudmFsdWUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMua2V5KTsKLQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZSdzIHZhbHVlLgotCSAqIEF0IHRoaXMgcG9pbnQgdGhlIHN1YmplY3QgbWF5IGJlIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIFAgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFZhbHVlXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSwgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBvYmplY3QuCi0JICogQXQgdGhpcyBwb2ludCB3ZSBjYW4gYmUgc3VyZSB0aGF0IHRoZSBzdWJqZWN0IGlzIG5vdCBudWxsLgotCSAqLwotCXByb3RlY3RlZCBQIGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9PYmplY3QodGhpcy5zdWJqZWN0LmdldCh0aGlzLmtleSwgdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5kZWZhdWx0VmFsdWUpKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBhcHByb3ByaWF0ZSBwcmVmZXJlbmNlIGFmdGVyIGNvbnZlcnRpbmcgdGhlIHZhbHVlIHRvIGEgc3RyaW5nLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oUCB2YWx1ZSkgewotCQl0aGlzLnN1YmplY3QucHV0KHRoaXMua2V5LCB0aGlzLmNvbnZlcnRUb1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbmV3IHZhbHVlIHNob3VsZCBiZSBwYXNzZWQKLQkgKiB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBCeSBkZWZhdWx0LCBvbmx5IGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwKLQkgKiB3aWxsIGl0IGJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBwcmVmZXJlbmNlLiBUaGlzIGFsc28gaGFzIHRoZQotCSAqIGVmZmVjdCBvZiBub3QgY3JlYXRpbmcgbmV3IHByZWZlcmVuY2VzIGluIHRoZSAiYmFja2luZyBzdG9yZSIKLQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJldHVybiB0cnVlIGlmIHRoZXkKLQkgKiB3b3VsZCBsaWtlIHRvIEFMV0FZUyBwYXNzIHRocm91Z2ggdGhlIG5ldyB2YWx1ZSB0byB0aGUgcHJlZmVyZW5jZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmZXJlbmNlSXNUb0JlU2V0KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZChvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gYSBzdHJpbmcgdGhhdCBjYW4gYmUgc3RvcmVkIGFzCi0JICogdGhlIHZhbHVlIG9mIHRoZSBwcmVmZXJlbmNlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvU3RyaW5nKFAgbykgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKG8pOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlIHZhbHVlIHN0cmluZyB0byBhbgotCSAqIGFwcHJvcHJpYXRlbHktdHlwZWQgb2JqZWN0IHRvIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCi0JICovCi0JcHJvdGVjdGVkIFAgY29udmVydFRvT2JqZWN0KFN0cmluZyBzKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlci5jb252ZXJ0VG9PYmplY3Qocyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlZmVyZW5jZUNoYW5nZWQoU3RyaW5nIHByZWZLZXksIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKHByZWZLZXkuZXF1YWxzKHRoaXMua2V5KSkgewotCQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgcHJlZmVyZW5jZSBjaGFuZ2VkOyBlaXRoZXIgYmVjYXVzZSB3ZSBjaGFuZ2VkIGl0Ci0JICogaW4gI3NldFZhbHVlXyhPYmplY3QpIG9yIGEgdGhpcmQtcGFydHkgY2hhbmdlZCBpdC4KLQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBiZWNhdXNlIG9mIG91ciBvd24gY2hhbmdlLCB0aGUgZXZlbnQgd2lsbCBiZQotCSAqIHN3YWxsb3dlZCBiZWNhdXNlIHRoZSBvbGQgYW5kIG5ldyB2YWx1ZXMgYXJlIHRoZSBzYW1lLgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZCgpIHsKLQkJT2JqZWN0IG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQkJdGhpcy5maXJlQXNwZWN0Q2hhbmdlZChvbGQsIHRoaXMudmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTJhODRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYWRhcHRlciB3cmFwcyBhIFByZWZlcmVuY2VzIG5vZGUgYW5kIGNvbnZlcnRzIGl0cyBwcmVmZXJlbmNlcyBpbnRvIGEKLSAqIENvbGxlY3Rpb25WYWx1ZU1vZGVsIG9mIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxzLiBJdCBsaXN0ZW5zIGZvcgotICogInByZWZlcmVuY2UiIGNoYW5nZXMgYW5kIGNvbnZlcnRzIHRoZW0gaW50byBWQUxVRSBjb2xsZWN0aW9uIGNoYW5nZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFA+Ci0JZXh0ZW5kcyBBc3BlY3RBZGFwdGVyPFByZWZlcmVuY2VzPgotCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4KLXsKLQotCS8qKiBDYWNoZSB0aGUgY3VycmVudCBwcmVmZXJlbmNlcywgc3RvcmVkIGluIG1vZGVscyBhbmQga2V5ZWQgYnkgbmFtZS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4+IHByZWZlcmVuY2VzOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIHRoZSBwcmVmZXJlbmNlcyBub2RlIGZvciBhZGRlZCBvciByZW1vdmVkIHByZWZlcmVuY2VzLiAqLwotCXByb3RlY3RlZCBmaW5hbCBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgcHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKSB7Ci0JCXRoaXMobmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBwcmVmZXJlbmNlcyBub2RlLgotCSAqLwotCXB1YmxpYyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyKSB7Ci0JCXN1cGVyKHByZWZlcmVuY2VzSG9sZGVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4oKTsKLQkJdGhpcy5wcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgcHJlZmVyZW5jZXMgaGF2ZSBjaGFuZ2VkLCBub3RpZnkgdGhlIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKCkgewotCQkvLyB0cmFuc2Zvcm0gdGhlIHByZWZlcmVuY2UgY2hhbmdlIGV2ZW50cyBpbnRvIFZBTFVFIGNvbGxlY3Rpb24gY2hhbmdlIGV2ZW50cwotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByZWZlcmVuY2VDaGFuZ2UoUHJlZmVyZW5jZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbC50aGlzLnByZWZlcmVuY2VDaGFuZ2VkKGV2ZW50LmdldEtleSgpLCBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInByZWZlcmVuY2UgY2hhbmdlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnByZWZlcmVuY2VzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZmVyZW5jZXMuc2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLml0ZXJhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmNsYXNzOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGlzdGVuZXJBc3BlY3ROYW1lKCkgewotCQlyZXR1cm4gVkFMVUVTOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhWQUxVRVMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGZpcmVBc3BlY3RDaGFuZ2VkKE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0gICAgCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PiBpdGVyYXRvciA9IChJdGVyYXRvcjxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PikgbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlcmF0b3IpKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJdGhpcy5zdWJqZWN0LmFkZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCWZvciAoSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gc3RyZWFtID0gdGhpcy5wcmVmZXJlbmNlTW9kZWxzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSBzdHJlYW0ubmV4dCgpOwotCQkJdGhpcy5wcmVmZXJlbmNlcy5wdXQocHJlZmVyZW5jZU1vZGVsLmdldEtleSgpLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN1YmplY3QucmVtb3ZlUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMucHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBmb3Igc29tZSBvZGQgcmVhc29uLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZnJvbSBhICJkZWFkIgotCQkJLy8gcHJlZmVyZW5jZXMgbm9kZTsgc28gaGFuZGxlIHRoZSBleGNlcHRpb24gdGhhdCBnZXRzIHRocm93biBoZXJlCi0JCQlpZiAoICEgZXguZ2V0TWVzc2FnZSgpLmVxdWFscygiTm9kZSBoYXMgYmVlbiByZW1vdmVkLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBpZiBpdCBpcyBub3QgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiwgcmUtdGhyb3cgaXQKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQl0aGlzLnByZWZlcmVuY2VzLmNsZWFyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaXRlcmF0b3Igb24gdGhlIHByZWZlcmVuY2UgbW9kZWxzLgotCSAqIEF0IHRoaXMgcG9pbnQgd2UgY2FuIGJlIHN1cmUgdGhhdCB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8UHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPj4gcHJlZmVyZW5jZU1vZGVscygpIHsKLQkJU3RyaW5nW10ga2V5czsKLQkJdHJ5IHsKLQkJCWtleXMgPSB0aGlzLnN1YmplY3Qua2V5cygpOwotCQl9IGNhdGNoIChCYWNraW5nU3RvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+PihuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGtleXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IHRyYW5zZm9ybShTdHJpbmcga2V5KSB7Ci0JCQkJcmV0dXJuIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWwudGhpcy5idWlsZFByZWZlcmVuY2VNb2RlbChrZXkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHR3ZWFrIHRoZSBtb2RlbCB1c2VkIHRvIHdyYXAgdGhlCi0JICogc3BlY2lmaWVkIHByZWZlcmVuY2UgKGUuZy4gdG8gY3VzdG9taXplIHRoZSBtb2RlbCdzIGNvbnZlcnRlcikuCi0JICovCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4gYnVpbGRQcmVmZXJlbmNlTW9kZWwoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8UD4odGhpcy5zdWJqZWN0SG9sZGVyLCBrZXkpOwotCX0KLQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlZChTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCS8vIGEgcHJlZmVyZW5jZSB3YXMgcmVtb3ZlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLnByZWZlcmVuY2VzLnJlbW92ZShrZXkpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgaWYgKCAhIHRoaXMucHJlZmVyZW5jZXMuY29udGFpbnNLZXkoa2V5KSkgewotCQkJLy8gYSBwcmVmZXJlbmNlIHdhcyBhZGRlZAotCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiBwcmVmZXJlbmNlTW9kZWwgPSB0aGlzLmJ1aWxkUHJlZmVyZW5jZU1vZGVsKGtleSk7Ci0JCQl0aGlzLnByZWZlcmVuY2VzLnB1dChrZXksIHByZWZlcmVuY2VNb2RlbCk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVkFMVUVTLCBwcmVmZXJlbmNlTW9kZWwpOwotCQl9IGVsc2UgewotCQkJLy8gYSBwcmVmZXJlbmNlJ3MgdmFsdWUgY2hhbmdlZCAtIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0Fic3RyYWN0VHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2FiNDIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQWJzdHJhY3RUcmVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU1vZGVsOwotCi0vKioKLSAqIEFic3RyYWN0IGNsYXNzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZCBieSB0aGUgSkRLCi0gKiAo4CBsYSBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbCkuIFRoaXMgY2xhc3MgcHJvdmlkZXM6Ci0gKiAtIHN1cHBvcnQgZm9yIGEgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMKLSAqIC0gYSBudW1iZXIgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmlyaW5nIGV2ZW50cyBmb3IgdGhvc2UgbGlzdGVuZXJzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyZWVNb2RlbAotCWltcGxlbWVudHMgVHJlZU1vZGVsLCBTZXJpYWxpemFibGUKLXsKLQkvKiogT3VyIGxpc3RlbmVycy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlTW9kZWwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubGlzdGVuZXJMaXN0ID0gbmV3IEV2ZW50TGlzdGVuZXJMaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBhcnRpYWwgVHJlZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKFRyZWVNb2RlbExpc3RlbmVyLmNsYXNzLCBsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcywgbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtb2RlbCdzIGN1cnJlbnQgY29sbGVjdGlvbiBvZiBsaXN0ZW5lcnMuCi0JICogKFRoZXJlIHNlZW1zIHRvIGJlIGEgcGF0dGVybiBvZiBtYWtpbmcgdGhpcyB0eXBlIG9mIG1ldGhvZCBwdWJsaWM7Ci0JICogYWx0aG91Z2ggaXQgc2hvdWxkIHByb2JhYmx5IGJlIHByb3RlY3RlZC4uLi4pCi0JICovCi0JcHVibGljIFRyZWVNb2RlbExpc3RlbmVyW10gdHJlZU1vZGVsTGlzdGVuZXJzKCkgewotIAkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vVHJlZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBhbnkgbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc1RyZWVNb2RlbExpc3RlbmVycygpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGVzIGNoYW5nZWQsIGJ1dCB0aGUgbm9kZXMgdGhlbXNlbHZlcwotCSAqIGFyZSBzdGlsbCB0aGUgc2FtZSBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc0NoYW5nZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEEgc2lnbmlmaWNhbnQgcHJvcGVydHkgb2YgdGhlIG5vZGUgY2hhbmdlZCwgYnV0IHRoZSBub2RlIGl0c2VsZiBpcyB0aGUgc2FtZSBvYmplY3QuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVDaGFuZ2VkKE9iamVjdFtdIHBhdGgsIGludCBjaGlsZEluZGV4LCBPYmplY3QgY2hpbGQpIHsKLQkJdGhpcy5maXJlVHJlZU5vZGVzQ2hhbmdlZChwYXRoLCBuZXcgaW50W10ge2NoaWxkSW5kZXh9LCBuZXcgT2JqZWN0W10ge2NoaWxkfSk7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBBIHNpZ25pZmljYW50IHByb3BlcnR5IG9mIHRoZSByb290IGNoYW5nZWQsIGJ1dCB0aGUgcm9vdCBpdHNlbGYgaXMgdGhlIHNhbWUgb2JqZWN0LgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290Q2hhbmdlZChPYmplY3Qgcm9vdCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNDaGFuZ2VkKG5ldyBPYmplY3RbXSB7cm9vdH0sIG51bGwsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVzSW5zZXJ0ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc0luc2VydGVkKGV2ZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgYSBtb2RlbCBjaGFuZ2UuCi0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudAotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsTGlzdGVuZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlVHJlZU5vZGVJbnNlcnRlZChPYmplY3RbXSBwYXRoLCBpbnQgY2hpbGRJbmRleCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXRoaXMuZmlyZVRyZWVOb2Rlc0luc2VydGVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVOb2Rlc1JlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBPYmplY3RbXSBjaGlsZHJlbikgewotCQkvLyBndWFyYW50ZWVkIHRvIHJldHVybiBhIG5vbi1udWxsIGFycmF5Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpOwotCQlUcmVlTW9kZWxFdmVudCBldmVudCA9IG51bGw7Ci0JCS8vIHByb2Nlc3MgdGhlIGxpc3RlbmVycyBsYXN0IHRvIGZpcnN0LCBub3RpZnlpbmcKLQkJLy8gdGhvc2UgdGhhdCBhcmUgaW50ZXJlc3RlZCBpbiB0aGlzIGV2ZW50Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoLTI7IGk+PTA7IGktPTIpIHsKLQkJCWlmIChsaXN0ZW5lcnNbaV09PVRyZWVNb2RlbExpc3RlbmVyLmNsYXNzKSB7Ci0JCQkJLy8gbGF6aWx5IGNyZWF0ZSB0aGUgZXZlbnQKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkgewotCQkJCQlldmVudCA9IG5ldyBUcmVlTW9kZWxFdmVudCh0aGlzLCBwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJCQl9Ci0JCQkJKChUcmVlTW9kZWxMaXN0ZW5lcikgbGlzdGVuZXJzW2krMV0pLnRyZWVOb2Rlc1JlbW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiBhIG1vZGVsIGNoYW5nZS4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbEV2ZW50Ci0JICogQHNlZSBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVUcmVlTm9kZVJlbW92ZWQoT2JqZWN0W10gcGF0aCwgaW50IGNoaWxkSW5kZXgsIE9iamVjdCBjaGlsZCkgewotCQl0aGlzLmZpcmVUcmVlTm9kZXNSZW1vdmVkKHBhdGgsIG5ldyBpbnRbXSB7Y2hpbGRJbmRleH0sIG5ldyBPYmplY3RbXSB7Y2hpbGR9KTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKE9iamVjdFtdIHBhdGgpIHsKLQkJLy8gZ3VhcmFudGVlZCB0byByZXR1cm4gYSBub24tbnVsbCBhcnJheQotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKTsKLQkJVHJlZU1vZGVsRXZlbnQgZXZlbnQgPSBudWxsOwotCQkvLyBwcm9jZXNzIHRoZSBsaXN0ZW5lcnMgbGFzdCB0byBmaXJzdCwgbm90aWZ5aW5nCi0JCS8vIHRob3NlIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gdGhpcyBldmVudAotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aC0yOyBpPj0wOyBpLT0yKSB7Ci0JCQlpZiAobGlzdGVuZXJzW2ldPT1UcmVlTW9kZWxMaXN0ZW5lci5jbGFzcykgewotCQkJCS8vIGxhemlseSBjcmVhdGUgdGhlIGV2ZW50Ci0JCQkJaWYgKGV2ZW50ID09IG51bGwpIHsKLQkJCQkJZXZlbnQgPSBuZXcgVHJlZU1vZGVsRXZlbnQodGhpcywgcGF0aCk7Ci0JCQkJfQotCQkJCSgoVHJlZU1vZGVsTGlzdGVuZXIpIGxpc3RlbmVyc1tpKzFdKS50cmVlU3RydWN0dXJlQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIGEgbW9kZWwgY2hhbmdlLgotCSAqIEBzZWUgamF2YXguc3dpbmcuZXZlbnQuVHJlZU1vZGVsRXZlbnQKLQkgKiBAc2VlIGphdmF4LnN3aW5nLmV2ZW50LlRyZWVNb2RlbExpc3RlbmVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVRyZWVSb290UmVwbGFjZWQoT2JqZWN0IG5ld1Jvb3QpIHsKLQkJdGhpcy5maXJlVHJlZVN0cnVjdHVyZUNoYW5nZWQobmV3IE9iamVjdFtdIHtuZXdSb290fSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwNjljZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5CdXR0b25Nb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgSkNoZWNrQm94KSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQKLSAqIGhvbGRzIGEgYm9vbGVhbi4KLSAqIAotICogTWF5YmUgbm90IHRoZSByaWNoZXN0IGNsYXNzIGluIG91ciB0b29sYm94LCBidXQgaXQgd2FzIHRoZQotICogdmljdGltIG9mIHJlZmFjdG9yaW5nLi4uLiAgfmJqdgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotewotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIENoZWNrQm94TW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKGJvb2xlYW5Ib2xkZXIsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgYm9vbGVhbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlcikgewotCQlzdXBlcihib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbHVtbkFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbHVtbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwMTgyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db2x1bW5BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFRoaXMgYWRhcHRlciBpcyB1c2VkIGJ5IHRoZSB0YWJsZSBtb2RlbCBhZGFwdGVyIHRvCi0gKiBjb252ZXJ0IGEgbW9kZWwgb2JqZWN0IGludG8gdGhlIG1vZGVscyB1c2VkIGZvciBlYWNoIG9mCi0gKiB0aGUgY2VsbHMgZm9yIHRoZSBvYmplY3QncyBjb3JyZXNwb25kaW5nIHJvdyBpbiB0aGUgdGFibGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uQWRhcHRlciB7Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgdGFibGUuCi0JICogVHlwaWNhbGx5IHRoaXMgaXMgc3RhdGljLgotCSAqLwotCWludCBjb2x1bW5Db3VudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgotCSAqLwotCVN0cmluZyBjb2x1bW5OYW1lKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLgotCSAqLwotCUNsYXNzPD8+IGNvbHVtbkNsYXNzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNvbHVtbiBpcyBlZGl0YWJsZS4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgc2FtZSBmb3IgZXZlcnkgcm93LgotCSAqLwotCWJvb2xlYW4gY29sdW1uSXNFZGl0YWJsZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsIG1vZGVscyBmb3IgdGhlIHNwZWNpZmllZCBzdWJqZWN0Ci0JICogdGhhdCBjb3JyZXNwb25kcyB0byBhIHNpbmdsZSByb3cgaW4gdGhlIHRhYmxlLgotCSAqLwotCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSBjZWxsTW9kZWxzKE9iamVjdCBzdWJqZWN0KTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2I1ZjdkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBMaXN0RGF0YUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpDb21ib0JveCkgaW4gc3luY2ggd2l0aCBhIExpc3RWYWx1ZU1vZGVsIChvciBhIENvbGxlY3Rpb25WYWx1ZU1vZGVsKS4KLSAqIEZvciBjb21ibyBib3hlcywgdGhlIG1vZGVsIG9iamVjdCB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBpcwotICogdHlwaWNhbGx5IGEgZGlmZmVyZW50IG1vZGVsIG9iamVjdCB0aGFuIHRoZSBvbmUgdGhhdCBob2xkcyB0aGUgY29sbGVjdGlvbgotICogb2YgY2hvaWNlcy4KLSAqIAotICogRm9yIGV4YW1wbGUsIGEgTVdSZWZlcmVuY2UgKHRoZSBzZWxlY3Rpb25Pd25lcikgaGFzIGFuIGF0dHJpYnV0ZQotICogInNvdXJjZVRhYmxlIiAodGhlIGNvbGxlY3Rpb25Pd25lcikKLSAqIHdoaWNoIGhvbGRzIG9uIHRvIGEgY29sbGVjdGlvbiBvZiBNV0RhdGFiYXNlRmllbGRzLiBXaGVuIHRoZSBzZWxlY3Rpb24KLSAqIGlzIGNoYW5nZWQgdGhpcyBtb2RlbCB3aWxsIGtlZXAgdGhlIGxpc3RlbmVycyBhd2FyZSBvZiB0aGUgY2hhbmdlcy4KLSAqIFRoZSBpbmhlcml0ZWQgbGlzdCBtb2RlbCB3aWxsIGtlZXAgaXRzIGxpc3RlbmVycyBhd2FyZSBvZiBjaGFuZ2VzIHRvIHRoZQotICogY29sbGVjdGlvbiBtb2RlbAotICogCi0gKiBJbiBhZGRpdGlvbiB0byB0aGUgY29sbGVjdGlvbiBob2xkZXIgcmVxdWlyZWQgYnkgdGhlIHN1cGVyY2xhc3MsCi0gKiBhbiBpbnN0YW5jZSBvZiB0aGlzIENvbWJvQm94TW9kZWwgbXVzdCBiZSBzdXBwbGllZCB3aXRoIGEKLSAqIHNlbGVjdGlvbiBob2xkZXIsIHdoaWNoIGlzIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgcHJvdmlkZXMgYWNjZXNzCi0gKiB0byB0aGUgc2VsZWN0aW9uICh0eXBpY2FsbHkgYSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIpLgotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIExpc3RNb2RlbEFkYXB0ZXIKLQlpbXBsZW1lbnRzIENvbWJvQm94TW9kZWwKLXsKLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGFuZCBzZWxlY3Rpb24gaG9sZGVyIGFyZSByZXF1aXJlZDsKLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlciwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIpIHsKLQkJc3VwZXIobGlzdEhvbGRlcik7Ci0JCWlmIChzZWxlY3Rpb25Ib2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIgPSBzZWxlY3Rpb25Ib2xkZXI7Ci0JCXRoaXMuc2VsZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBjb2xsZWN0aW9uIGhvbGRlciBhbmQgc2VsZWN0aW9uIGhvbGRlciBhcmUgcmVxdWlyZWQ7Ci0JICovCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsPD8+IGNvbGxlY3Rpb25Ib2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXN1cGVyKGNvbGxlY3Rpb25Ib2xkZXIpOwotCQlpZiAoc2VsZWN0aW9uSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyID0gc2VsZWN0aW9uSG9sZGVyOwotCQl0aGlzLnNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBub3RpZnkgbGlzdGVuZXJzIHRoYXQgdGhlIHNlbGVjdGlvbiBoYXMgY2hhbmdlZAotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyLnRoaXMuZmlyZVNlbGVjdGlvbkNoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0aW9uSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKE9iamVjdCBzZWxlY3RlZEl0ZW0pIHsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIuc2V0VmFsdWUoc2VsZWN0ZWRJdGVtKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGVuZ2FnZSB0aGUgc2VsZWN0aW9uIGhvbGRlci4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJdGhpcy5zZWxlY3Rpb25Ib2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBkaXNlbmdhZ2UgdGhlIHNlbGVjdGlvbiBob2xkZXIuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZnkgdGhlIGxpc3RlbmVycyB0aGF0IHRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCS8vIEkgZ3Vlc3MgdGhpcyB3aWxsIHdvcmsuLi4KLQkJdGhpcy5maXJlQ29udGVudHNDaGFuZ2VkKHRoaXMsIC0xLCAtMSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zZWxlY3Rpb25Ib2xkZXIgKyAiOiIgKyB0aGlzLmxpc3RIb2xkZXIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZjhjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJEYXRlTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyRGF0ZU1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgZGF0ZS4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IGJlIGEgc3ViLWNsYXNzIG9mIFNwaW5uZXJEYXRlTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcgotICovCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJEYXRlTW9kZWwKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWU7IHVzZWQgd2hlbiB0aGUgdW5kZXJseWluZyBtb2RlbCBkYXRlIHZhbHVlIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgaXMgdGhlIGN1cnJlbnQgZGF0ZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIERhdGUgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgZGF0ZS4gKi8KLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlcjsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGggY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUuICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGRhdGVDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBuZXcgRGF0ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBkYXRlIGhvbGRlciBhbmQgZGVmYXVsdCB2YWx1ZSBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gZGF0ZUhvbGRlciwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhkYXRlSG9sZGVyLCBudWxsLCBudWxsLCBDYWxlbmRhci5EQVlfT0ZfTU9OVEgsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgZGF0ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZSBpcyB0aGUgY3VycmVudCBkYXRlLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCkgewotCQl0aGlzKGRhdGVIb2xkZXIsIHN0YXJ0LCBlbmQsIGNhbGVuZGFyRmllbGQsIG5ldyBEYXRlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGRhdGUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGRhdGVIb2xkZXIsIENvbXBhcmFibGU8Pz4gc3RhcnQsIENvbXBhcmFibGU8Pz4gZW5kLCBpbnQgY2FsZW5kYXJGaWVsZCwgRGF0ZSBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoZGF0ZUhvbGRlci5nZXRWYWx1ZSgpID09IG51bGwgPyBkZWZhdWx0VmFsdWUgOiAoRGF0ZSkgZGF0ZUhvbGRlci5nZXRWYWx1ZSgpLCBzdGFydCwgZW5kLCBjYWxlbmRhckZpZWxkKTsKLQkJdGhpcy5kYXRlSG9sZGVyID0gZGF0ZUhvbGRlcjsKLQkJdGhpcy5kYXRlQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlCi0JCS8vIHVudGlsIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcy4uLgotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREYXRlQ2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCURhdGVTcGlubmVyTW9kZWxBZGFwdGVyLnRoaXMuc3luY2hyb25pemUoZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkYXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMuZGF0ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBkYXRlIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZShPYmplY3QpLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuZGF0ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBkYXRlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5kYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLnN5bmNocm9uaXplKHRoaXMuZGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGRhdGUgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5kYXRlSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRGF0ZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgc3Bpbm5lciBkYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRhdGVIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY3ZjQwNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Eb2N1bWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRXZlbnRMaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVW5kb2FibGVFZGl0RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVW5kb2FibGVFZGl0TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuRWxlbWVudDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlBsYWluRG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LlNlZ21lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLnRleHQuRG9jdW1lbnQgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIERvY3VtZW50TGlzdGVuZXIKLSAqIChlLmcuIGEgSlRleHRGaWVsZCkgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgc3RyaW5nLgotICogCi0gKiBOQjogVGhpcyBtb2RlbCBzaG91bGQgb25seSBiZSB1c2VkIGZvciAic21hbGwiIGRvY3VtZW50czsKLSAqIGkuZS4gZG9jdW1lbnRzIHVzZWQgYnkgdGV4dCBmaWVsZHMsIG5vdCB0ZXh0IHBhbmVzLgotICogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShTdHJpbmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXIKLQlpbXBsZW1lbnRzIERvY3VtZW50LCBTZXJpYWxpemFibGUKLXsKLQotCS8qKiBUaGUgZGVsZWdhdGUgZG9jdW1lbnQgd2hvc2UgYmVoYXZpb3Igd2UgImVuaGFuY2UiLiAqLwotCXByb3RlY3RlZCBmaW5hbCBEb2N1bWVudCBkZWxlZ2F0ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgZGVsZWdhdGUgZG9jdW1lbnQuICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbWJpbmVkTGlzdGVuZXIgZGVsZWdhdGVMaXN0ZW5lcjsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXI7Ci0KLQkvKiogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoIGNoYW5nZXMgbWFkZSB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcuICovCi0JcHJvdGVjdGVkIHRyYW5zaWVudCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHN0cmluZ0xpc3RlbmVyOwotCi0gICAgLyoqIFRoZSBldmVudCBsaXN0ZW5lciBsaXN0IGZvciB0aGUgZG9jdW1lbnQuICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIEV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IG5ldyBFdmVudExpc3RlbmVyTGlzdCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHN0cmluZyBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIsIERvY3VtZW50IGRlbGVnYXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzdHJpbmdIb2xkZXIgPT0gbnVsbCB8fCBkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnN0cmluZ0hvbGRlciA9IHN0cmluZ0hvbGRlcjsKLQkJLy8gcG9zdHBvbmUgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZwotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQl0aGlzLnN0cmluZ0xpc3RlbmVyID0gdGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZWxlZ2F0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgc3RyaW5nIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBXcmFwIGEgcGxhaW4gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIERvY3VtZW50QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHN0cmluZ0hvbGRlcikgewotCQl0aGlzKHN0cmluZ0hvbGRlciwgbmV3IFBsYWluRG9jdW1lbnQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZFN0cmluZ0xpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN0cmluZ0xpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5zdHJpbmdDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInN0cmluZyBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYmluZWRMaXN0ZW5lciBidWlsZERlbGVnYXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSW50ZXJuYWxMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEb2N1bWVudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbHMgaWYgbmVjZXNzYXJ5LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZERvY3VtZW50TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJCXRoaXMuZW5nYWdlU3RyaW5nSG9sZGVyKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKERvY3VtZW50TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWxzIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5yZW1vdmUoRG9jdW1lbnRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChEb2N1bWVudExpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVN0cmluZ0hvbGRlcigpOwotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBkZWxlZ2F0ZSBkb2N1bWVudCBpZiBuZWNlc3NhcnkuCi0JICovCi0JcHVibGljIHZvaWQgYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIoVW5kb2FibGVFZGl0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVyQ291bnQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MpID09IDApIHsKLQkJCXRoaXMuZGVsZWdhdGUuYWRkVW5kb2FibGVFZGl0TGlzdGVuZXIodGhpcy5kZWxlZ2F0ZUxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQoVW5kb2FibGVFZGl0TGlzdGVuZXIuY2xhc3MsIGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIGRlbGVnYXRlIGRvY3VtZW50IGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVVuZG9hYmxlRWRpdExpc3RlbmVyKFVuZG9hYmxlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcywgbGlzdGVuZXIpOwotCQlpZiAodGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcykgPT0gMCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmVVbmRvYWJsZUVkaXRMaXN0ZW5lcih0aGlzLmRlbGVnYXRlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0UHJvcGVydHkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXRoaXMuZGVsZWdhdGUucHV0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBzdHJpbmcgZGlyZWN0bHkuCi0JICogVGhlIHJlc3VsdGluZyBldmVudCB3aWxsIGJlIGlnbm9yZWQ6IEBzZWUgI3N5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoaW50IG9mZnNldCwgaW50IGxlbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUob2Zmc2V0LCBsZW4pOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbW9kZWwgc3RyaW5nIGRpcmVjdGx5LgotCSAqIFRoZSByZXN1bHRpbmcgZXZlbnQgd2lsbCBiZSBpZ25vcmVkOiBAc2VlICNzeW5jaHJvbml6ZURlbGVnYXRlKFN0cmluZykuCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0U3RyaW5nKGludCBvZmZzZXQsIFN0cmluZyBpbnNlcnRlZFN0cmluZywgQXR0cmlidXRlU2V0IGEpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRoaXMuZGVsZWdhdGUuaW5zZXJ0U3RyaW5nKG9mZnNldCwgaW5zZXJ0ZWRTdHJpbmcsIGEpOwotCQl0aGlzLnN0cmluZ0hvbGRlci5zZXRWYWx1ZSh0aGlzLmRlbGVnYXRlLmdldFRleHQoMCwgdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXRUZXh0KGludCBvZmZzZXQsIGludCBsZW5ndGgsIFNlZ21lbnQgdHh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aGlzLmRlbGVnYXRlLmdldFRleHQob2Zmc2V0LCBsZW5ndGgsIHR4dCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGdldFN0YXJ0UG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFN0YXJ0UG9zaXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgUG9zaXRpb24gZ2V0RW5kUG9zaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldEVuZFBvc2l0aW9uKCk7Ci0JfQotCi0JcHVibGljIFBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5jcmVhdGVQb3NpdGlvbihvZmZzKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFtdIGdldFJvb3RFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Um9vdEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0RGVmYXVsdFJvb3RFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXREZWZhdWx0Um9vdEVsZW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW5kZXIoUnVubmFibGUgcikgewotCQl0aGlzLmRlbGVnYXRlLnJlbmRlcihyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcltdIGRvY3VtZW50TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKERvY3VtZW50TGlzdGVuZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBVbmRvYWJsZUVkaXRMaXN0ZW5lcltdIHVuZG9hYmxlRWRpdExpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycyhVbmRvYWJsZUVkaXRMaXN0ZW5lci5jbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQotCS8qKgotCSAqIEEgdGhpcmQgcGFydHkgaGFzIG1vZGlmaWVkIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHN0cmluZy4KLQkgKiBTeW5jaHJvbml6ZSB0aGUgZGVsZWdhdGUgZG9jdW1lbnQgYWNjb3JkaW5nbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RyaW5nQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSBkb2N1bWVudCdzIGVudGlyZSB0ZXh0IHN0cmluZyB3aXRoIHRoZSBuZXcgc3RyaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplRGVsZWdhdGUoU3RyaW5nIHMpIHsKLQkJdHJ5IHsKLQkJCWludCBsZW4gPSB0aGlzLmRlbGVnYXRlLmdldExlbmd0aCgpOwotCQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCQkvLyAodmlhICNpbnNlcnRTdHJpbmcoKSBvciAjcmVtb3ZlKCkpCi0JCQlpZiAoICEgdGhpcy5kZWxlZ2F0ZS5nZXRUZXh0KDAsIGxlbikuZXF1YWxzKHMpKSB7Ci0JCQkJdGhpcy5kZWxlZ2F0ZS5yZW1vdmUoMCwgbGVuKTsKLQkJCQl0aGlzLmRlbGVnYXRlLmluc2VydFN0cmluZygwLCBzLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpKTsJLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3RyaW5nSG9sZGVyKCkgewotCQl0aGlzLnN0cmluZ0hvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zdHJpbmdMaXN0ZW5lcik7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZSh0aGlzLnN0cmluZ0hvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdHJpbmdIb2xkZXIoKSB7Ci0JCXRoaXMuc3RyaW5nSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnN0cmluZ0xpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUNoYW5nZWRVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0uY2hhbmdlZFVwZGF0ZShlZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxlZ2F0ZUluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG5vIG5lZWQgdG8gbGF6eS1pbml0aWFsaXplIHRoZSBldmVudDsKLQkJLy8gd2Ugd291bGRuJ3QgZ2V0IGhlcmUgaWYgd2UgZGlkIG5vdCBoYXZlIGxpc3RlbmVycy4uLgotCQlEb2N1bWVudEV2ZW50IGVlID0gbmV3IEludGVybmFsRG9jdW1lbnRFdmVudCh0aGlzLCBldmVudCk7Ci0JCURvY3VtZW50TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSB0aGlzLmRvY3VtZW50TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSBsaXN0ZW5lcnMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWxpc3RlbmVyc1tpXS5pbnNlcnRVcGRhdGUoZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZWdhdGVSZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkvLyBubyBuZWVkIHRvIGxhenktaW5pdGlhbGl6ZSB0aGUgZXZlbnQ7Ci0JCS8vIHdlIHdvdWxkbid0IGdldCBoZXJlIGlmIHdlIGRpZCBub3QgaGF2ZSBsaXN0ZW5lcnMuLi4KLQkJRG9jdW1lbnRFdmVudCBlZSA9IG5ldyBJbnRlcm5hbERvY3VtZW50RXZlbnQodGhpcywgZXZlbnQpOwotCQlEb2N1bWVudExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy5kb2N1bWVudExpc3RlbmVycygpOwotCQlmb3IgKGludCBpID0gbGlzdGVuZXJzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlsaXN0ZW5lcnNbaV0ucmVtb3ZlVXBkYXRlKGVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGVnYXRlVW5kb2FibGVFZGl0SGFwcGVuZWQoVW5kb2FibGVFZGl0RXZlbnQgZXZlbnQpIHsKLQkJLy8gbm8gbmVlZCB0byBsYXp5LWluaXRpYWxpemUgdGhlIGV2ZW50OwotCQkvLyB3ZSB3b3VsZG4ndCBnZXQgaGVyZSBpZiB3ZSBkaWQgbm90IGhhdmUgbGlzdGVuZXJzLi4uCi0JCVVuZG9hYmxlRWRpdEV2ZW50IGVlID0gbmV3IFVuZG9hYmxlRWRpdEV2ZW50KHRoaXMsIGV2ZW50LmdldEVkaXQoKSk7Ci0JCVVuZG9hYmxlRWRpdExpc3RlbmVyW10gbGlzdGVuZXJzID0gdGhpcy51bmRvYWJsZUVkaXRMaXN0ZW5lcnMoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RlbmVycy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbGlzdGVuZXJzW2ldLnVuZG9hYmxlRWRpdEhhcHBlbmVkKGVlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnN0cmluZ0hvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gcykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy8gcmVhZCBpbiBhbnkgaGlkZGVuIHN0dWZmCi0JCXMuZGVmYXVsdFJlYWRPYmplY3QoKTsKLQkJdGhpcy5zdHJpbmdMaXN0ZW5lciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcigpOwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBpbnRlcmZhY2UgQ29tYmluZWRMaXN0ZW5lciBleHRlbmRzIERvY3VtZW50TGlzdGVuZXIsIFVuZG9hYmxlRWRpdExpc3RlbmVyLCBTZXJpYWxpemFibGUgewotCQkvLyBqdXN0IGNvbnNvbGlkYXRlIHRoZSB0d28gaW50ZXJmYWNlcwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbExpc3RlbmVyIGltcGxlbWVudHMgQ29tYmluZWRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwdWJsaWMgdm9pZCBjaGFuZ2VkVXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlQ2hhbmdlZFVwZGF0ZShldmVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaW5zZXJ0VXBkYXRlKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURvY3VtZW50QWRhcHRlci50aGlzLmRlbGVnYXRlSW5zZXJ0VXBkYXRlKGV2ZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRG9jdW1lbnRBZGFwdGVyLnRoaXMuZGVsZWdhdGVSZW1vdmVVcGRhdGUoZXZlbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHVuZG9hYmxlRWRpdEhhcHBlbmVkKFVuZG9hYmxlRWRpdEV2ZW50IGV2ZW50KSB7Ci0JCQlEb2N1bWVudEFkYXB0ZXIudGhpcy5kZWxlZ2F0ZVVuZG9hYmxlRWRpdEhhcHBlbmVkKGV2ZW50KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEludGVybmFsRG9jdW1lbnRFdmVudAotCQlleHRlbmRzIEV2ZW50T2JqZWN0Ci0JCWltcGxlbWVudHMgRG9jdW1lbnRFdmVudAotCXsKLQkJcHJvdGVjdGVkIERvY3VtZW50RXZlbnQgZGVsZWdhdGU7Ci0JCi0JCXByb3RlY3RlZCBJbnRlcm5hbERvY3VtZW50RXZlbnQoRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50RXZlbnQgZGVsZWdhdGUpIHsKLQkJCXN1cGVyKGRvY3VtZW50KTsKLQkJCXRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQkJfQotCQlwdWJsaWMgRWxlbWVudENoYW5nZSBnZXRDaGFuZ2UoRWxlbWVudCBlbGVtKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRDaGFuZ2UoZWxlbSk7Ci0JCX0KLQkJcHVibGljIERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJcmV0dXJuIChEb2N1bWVudCkgdGhpcy5zb3VyY2U7Ci0JCX0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXRMZW5ndGgoKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE9mZnNldCgpOwotCQl9Ci0JCXB1YmxpYyBFdmVudFR5cGUgZ2V0VHlwZSgpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFR5cGUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTGlzdE1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDFjMWU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3REYXRhTGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5MaXN0TW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIExpc3REYXRhTGlzdGVuZXIKLSAqIChlLmcuIGEgSkxpc3QpIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCAob3IgYSBDb2xsZWN0aW9uVmFsdWVNb2RlbCkuCi0gKiAKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgTGlzdE1vZGVsICptdXN0KiBiZSBzdXBwbGllZCB3aXRoIGEgdmFsdWUgbW9kZWwsCi0gKiB3aGljaCBpcyBhIExpc3RWYWx1ZU1vZGVsIG9uIHRoZSBib3VuZCBsaXN0IG9yIGEgQ29sbGVjdGlvblZhbHVlTW9kZWwKLSAqIG9uIHRoZSBib3VuZCBjb2xsZWN0aW9uLiBUaGlzIGlzIHJlcXVpcmVkIC0gdGhlIGxpc3QgKG9yIGNvbGxlY3Rpb24pCi0gKiBpdHNlbGYgY2FuIGJlIG51bGwsIGJ1dCB0aGUgdmFsdWUgbW9kZWwgdGhhdCBob2xkcyBpdCBjYW5ub3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0TW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdExpc3RNb2RlbAotewotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuICovCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXI7Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgc2l6ZSBvZiB0aGUgbGlzdCBmb3IgImRyYW1hdGljIiBjaGFuZ2VzLgotCSAqIEBzZWUgI2xpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGxpc3RTaXplOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gZm9yd2FyZCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3RvciAtIGluaXRpYWxpemUgc3R1ZmYuCi0JICovCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbGlzdCBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXIoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwobGlzdEhvbGRlcik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgY29sbGVjdGlvbiBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8Pz4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzKCk7Ci0JCXRoaXMuc2V0TW9kZWwoY29sbGVjdGlvbkhvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMuaXRlbXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc1JlcGxhY2VkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXIudGhpcy5pdGVtc01vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlci50aGlzLmxpc3RDbGVhcmVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0TW9kZWxBZGFwdGVyLnRoaXMubGlzdENoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImxpc3QgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0RWxlbWVudEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldChpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMubGlzdFNpemUgPSB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3REYXRhTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCQl0aGlzLmxpc3RTaXplID0gMDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/PiBtb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlcjsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzTGlzdERhdGFMaXN0ZW5lcnMoKTsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXRoaXMubGlzdEhvbGRlciA9IGxpc3RIb2xkZXI7Ci0JCWlmIChoYXNMaXN0ZW5lcnMpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMubGlzdENoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIG1vZGVsLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJyYXd0eXBlcyIgfSkKLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDw/PiBjb2xsZWN0aW9uSG9sZGVyKSB7Ci0JCXRoaXMuc2V0TW9kZWwobmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXIoY29sbGVjdGlvbkhvbGRlcikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIG5vIGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOb0xpc3REYXRhTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbW9kZWwgaGFzIGFueSBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTGlzdERhdGFMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzTm9MaXN0RGF0YUxpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2Ugc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJdGVtcyB3ZXJlIGFkZGVkIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGxpc3QuCi0JICogTm90aWZ5IGxpc3RlbmVycyBvZiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBldmVudC5nZXRJbmRleCgpOwotCQlpbnQgZW5kID0gc3RhcnQgKyBldmVudC5nZXRJdGVtc1NpemUoKSAtIDE7Ci0JCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgKz0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZW1vdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJaW50IHN0YXJ0ID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJaW50IGVuZCA9IHN0YXJ0ICsgZXZlbnQuZ2V0SXRlbXNTaXplKCkgLSAxOwotCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JCXRoaXMubGlzdFNpemUgLT0gZXZlbnQuZ2V0SXRlbXNTaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSXRlbXMgd2VyZSByZXBsYWNlZCBpbiB0aGUgdW5kZXJseWluZyBtb2RlbCBsaXN0LgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBzdGFydCA9IGV2ZW50LmdldEluZGV4KCk7Ci0JCWludCBlbmQgPSBzdGFydCArIGV2ZW50LmdldEl0ZW1zU2l6ZSgpIC0gMTsKLQkJdGhpcy5maXJlQ29udGVudHNDaGFuZ2VkKHRoaXMsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIEl0ZW1zIHdlcmUgbW92ZWQgaW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbihldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRUYXJnZXRJbmRleCgpKTsKLQkJaW50IGVuZCA9IE1hdGgubWF4KGV2ZW50LmdldFNvdXJjZUluZGV4KCksIGV2ZW50LmdldFRhcmdldEluZGV4KCkpICsgZXZlbnQuZ2V0TGVuZ3RoKCkgLSAxOwotCQl0aGlzLmZpcmVDb250ZW50c0NoYW5nZWQodGhpcywgc3RhcnQsIGVuZCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHVuZGVybHlpbmcgbW9kZWwgbGlzdCB3YXMgY2xlYXJlZC4KLQkgKiBOb3RpZnkgbGlzdGVuZXJzIG9mIHRoZSBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RDbGVhcmVkKCkgewotCQlpZiAodGhpcy5saXN0U2l6ZSAhPSAwKSB7Ci0JCQl0aGlzLmZpcmVJbnRlcnZhbFJlbW92ZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQkJdGhpcy5saXN0U2l6ZSA9IDA7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBsaXN0IGhhcyBjaGFuZ2VkICJkcmFtYXRpY2FsbHkiLgotCSAqIE5vdGlmeSBsaXN0ZW5lcnMgb2YgdGhlIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbGlzdENoYW5nZWQoKSB7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsUmVtb3ZlZCh0aGlzLCAwLCB0aGlzLmxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJdGhpcy5saXN0U2l6ZSA9IHRoaXMubGlzdEhvbGRlci5zaXplKCk7Ci0JCWlmICh0aGlzLmxpc3RTaXplICE9IDApIHsKLQkJCXRoaXMuZmlyZUludGVydmFsQWRkZWQodGhpcywgMCwgdGhpcy5saXN0U2l6ZSAtIDEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9iamVjdCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5saXN0SG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjNlMGIwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJMaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTGlzdE1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBDaGFuZ2VMaXN0ZW5lcgotICogKGUuZy4gYSBKU3Bpbm5lcikgaW4gc3luY2ggd2l0aCBhIFByb3BlcnR5VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgdmFsdWUKLSAqIGluIHRoZSBsaXN0LgotICogCi0gKiBUaGlzIGNsYXNzIG11c3QgYmUgYSBzdWItY2xhc3Mgb2YgU3Bpbm5lckxpc3RNb2RlbCBiZWNhdXNlIG9mIHNvbWUKLSAqIGNyYXBweSBqZGsgY29kZS4uLi4gIH5ianYKLSAqIEBzZWUgamF2YXguc3dpbmcuSlNwaW5uZXIjY3JlYXRlRWRpdG9yKGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbCkKLSAqIAotICogTkI6IFRoaXMgbW9kZWwgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdmFsdWVzIHRoYXQgaGF2ZSBhIHJlYXNvbmFibHkKLSAqIGluZXhwZW5zaXZlICNlcXVhbHMoKSBpbXBsZW1lbnRhdGlvbi4KLSAqIEBzZWUgI3N5bmNocm9uaXplKE9iamVjdCkKLSAqIAotICogSWYgdGhpcyBjbGFzcyBuZWVkcyB0byBiZSBtb2RpZmllZCwgaXQgd291bGQgYmVob292ZSB1cyB0byByZXZpZXcgdGhlCi0gKiBvdGhlciwgc2ltaWxhciBjbGFzc2VzOgotICogQHNlZSBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcgotICogQHNlZSBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcgotCWV4dGVuZHMgU3Bpbm5lckxpc3RNb2RlbAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZTsgdXNlZCB3aGVuIHRoZSB1bmRlcmx5aW5nIG1vZGVsIHZhbHVlIGlzIG51bGwuCi0JICogVGhlIGRlZmF1bHQgaXMgdGhlIGZpcnN0IGl0ZW0gb24gdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHZhbHVlQ2hhbmdlTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1vZGVsIHZhbHVlIGl0c2VsZiBhcyB0aGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlLgotCSAqLwotCXB1YmxpYyBMaXN0U3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBuZXcgT2JqZWN0W10ge2RlZmF1bHRWYWx1ZX0sIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgT2JqZWN0W10gdmFsdWVzKSB7Ci0JCXRoaXModmFsdWVIb2xkZXIsIHZhbHVlcywgdmFsdWVzWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdFtdIHZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKHZhbHVlSG9sZGVyLCBBcnJheXMuYXNMaXN0KHZhbHVlcyksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFVzZSB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgbGlzdCBvZiB2YWx1ZXMgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgTGlzdDxPYmplY3Q+IHZhbHVlcykgewotCQl0aGlzKHZhbHVlSG9sZGVyLCB2YWx1ZXMsIHZhbHVlcy5nZXQoMCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIHZhbHVlIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgTGlzdDxPYmplY3Q+IHZhbHVlcywgT2JqZWN0IGRlZmF1bHRWYWx1ZSkgewotCQlzdXBlcih2YWx1ZXMpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gdmFsdWVIb2xkZXI7Ci0JCXRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZQotCQkvLyB1bnRpbCB3ZSBoYXZlIGxpc3RlbmVycyBvdXJzZWx2ZXMuLi4KLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnN5bmNocm9uaXplKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNwaW5uZXJNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFeHRlbmQgdG8gY2hlY2sgd2hldGhlciB0aGlzIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYmVmb3JlIHdlIAotCSAqIGhhdmUgYW55IGxpc3RlbmVycy4KLQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgY3JhcHB5IGpkayBjb2RlIGdldHMgdGhlIHZhbHVlCi0JICogZnJvbSB0aGUgbW9kZWwgKmJlZm9yZSogbGlzdGVuaW5nIHRvIHRoZSBtb2RlbC4gIH5ianYKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyLkRlZmF1bHRFZGl0b3IoamF2YXguc3dpbmcuSlNwaW5uZXIpCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCS8vIHNvcnJ5IGFib3V0IHRoaXMgImxhdGVyYWwiIGNhbGwgdG8gc3VwZXIgIH5ianYKLQkJCXN1cGVyLnNldFZhbHVlKHRoaXMuc3Bpbm5lclZhbHVlT2YodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemUoT2JqZWN0KS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJc3VwZXIuc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlzdXBlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIHZhbHVlIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gYSBub24tbnVsbCB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IHNwaW5uZXJWYWx1ZU9mKE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gdGhpcy5nZXREZWZhdWx0VmFsdWUoKSA6IHZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIHNwaW5uZXIgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZShPYmplY3QgdmFsdWUpIHsKLQkJT2JqZWN0IG5ld1ZhbHVlID0gdGhpcy5zcGlubmVyVmFsdWVPZih2YWx1ZSk7Ci0JCS8vIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBzcGlubmVyIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmdldFZhbHVlKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJdGhpcy5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnZhbHVlSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE2MjQ2My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy5TcGlubmVyTnVtYmVyTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIENoYW5nZUxpc3RlbmVyCi0gKiAoZS5nLiBhIEpTcGlubmVyKSBpbiBzeW5jaCB3aXRoIGEgUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgYSBudW1iZXIuCi0gKiAKLSAqIFRoaXMgY2xhc3MgbXVzdCBiZSBhIHN1Yi1jbGFzcyBvZiBTcGlubmVyTnVtYmVyTW9kZWwgYmVjYXVzZSBvZiBzb21lCi0gKiBjcmFwcHkgamRrIGNvZGUuLi4uICB+Ymp2Ci0gKiBAc2VlIGphdmF4LnN3aW5nLkpTcGlubmVyI2NyZWF0ZUVkaXRvcihqYXZheC5zd2luZy5TcGlubmVyTW9kZWwpCi0gKiAKLSAqIElmIHRoaXMgY2xhc3MgbmVlZHMgdG8gYmUgbW9kaWZpZWQsIGl0IHdvdWxkIGJlaG9vdmUgdXMgdG8gcmV2aWV3IHRoZQotICogb3RoZXIsIHNpbWlsYXIgY2xhc3NlczoKLSAqIEBzZWUgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIEBzZWUgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIKLQlleHRlbmRzIFNwaW5uZXJOdW1iZXJNb2RlbAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZTsgdXNlZCB3aGVuIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwgbnVtYmVyIHZhbHVlIGlzIG51bGwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOdW1iZXIgZGVmYXVsdFZhbHVlOwotCi0JLyoqIEEgdmFsdWUgbW9kZWwgb24gdGhlIHVuZGVybHlpbmcgbnVtYmVyLiAqLwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIHN5bmNocm9uaXplIHdpdGgKLQkgKiBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgbnVtYmVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBudW1iZXJDaGFuZ2VMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBUaGUgZGVmYXVsdCBzcGlubmVyIHZhbHVlIGlzIHplcm8uCi0JICogVGhlIHN0ZXAgc2l6ZSBpcyBvbmUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIDApOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVGhlIHN0ZXAgc2l6ZSBpcyBvbmUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG51bGwsIG51bGwsIEludGVnZXIudmFsdWVPZigxKSwgSW50ZWdlci52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICogVXNlIHRoZSBtaW5pbXVtIHZhbHVlIGFzIHRoZSBkZWZhdWx0IHNwaW5uZXIgdmFsdWUuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIGludCBtaW5pbXVtLCBpbnQgbWF4aW11bSwgaW50IHN0ZXBTaXplKSB7Ci0JCXRoaXMobnVtYmVySG9sZGVyLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSwgbWluaW11bSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgaW50IG1pbmltdW0sIGludCBtYXhpbXVtLCBpbnQgc3RlcFNpemUsIGludCBkZWZhdWx0VmFsdWUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIEludGVnZXIudmFsdWVPZihtaW5pbXVtKSwgSW50ZWdlci52YWx1ZU9mKG1heGltdW0pLCBJbnRlZ2VyLnZhbHVlT2Yoc3RlcFNpemUpLCBJbnRlZ2VyLnZhbHVlT2YoZGVmYXVsdFZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgbnVtYmVyIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKiBVc2UgdGhlIG1pbmltdW0gdmFsdWUgYXMgdGhlIGRlZmF1bHQgc3Bpbm5lciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+IG51bWJlckhvbGRlciwgZG91YmxlIG1pbmltdW0sIGRvdWJsZSBtYXhpbXVtLCBkb3VibGUgc3RlcFNpemUpIHsKLQkJdGhpcyhudW1iZXJIb2xkZXIsIG1pbmltdW0sIG1heGltdW0sIHN0ZXBTaXplLCBtaW5pbXVtKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBudW1iZXIgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gbnVtYmVySG9sZGVyLCBkb3VibGUgbWluaW11bSwgZG91YmxlIG1heGltdW0sIGRvdWJsZSBzdGVwU2l6ZSwgZG91YmxlIGRlZmF1bHRWYWx1ZSkgewotCQl0aGlzKG51bWJlckhvbGRlciwgRG91YmxlLnZhbHVlT2YobWluaW11bSksIERvdWJsZS52YWx1ZU9mKG1heGltdW0pLCBEb3VibGUudmFsdWVPZihzdGVwU2l6ZSksIERvdWJsZS52YWx1ZU9mKGRlZmF1bHRWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIG51bWJlciBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBudW1iZXJIb2xkZXIsIENvbXBhcmFibGU8Pz4gbWluaW11bSwgQ29tcGFyYWJsZTw/PiBtYXhpbXVtLCBOdW1iZXIgc3RlcFNpemUsIE51bWJlciBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIobnVtYmVySG9sZGVyLmdldFZhbHVlKCkgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZSA6IChOdW1iZXIpIG51bWJlckhvbGRlci5nZXRWYWx1ZSgpLCBtaW5pbXVtLCBtYXhpbXVtLCBzdGVwU2l6ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyID0gbnVtYmVySG9sZGVyOwotCQl0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE51bWJlckNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlci50aGlzLnN5bmNocm9uaXplKGV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibnVtYmVyIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTcGlubmVyTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGJlZm9yZSB3ZSAKLQkgKiBoYXZlIGFueSBsaXN0ZW5lcnMuCi0JICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzb21lIGNyYXBweSBqZGsgY29kZSBnZXRzIHRoZSB2YWx1ZQotCSAqIGZyb20gdGhlIG1vZGVsICpiZWZvcmUqIGxpc3RlbmluZyB0byB0aGUgbW9kZWwuICB+Ymp2Ci0JICogQHNlZSBqYXZheC5zd2luZy5KU3Bpbm5lci5EZWZhdWx0RWRpdG9yKGphdmF4LnN3aW5nLkpTcGlubmVyKQotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdldENoYW5nZUxpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQkvLyBzb3JyeSBhYm91dCB0aGlzICJsYXRlcmFsIiBjYWxsIHRvIHN1cGVyICB+Ymp2Ci0JCQlzdXBlci5zZXRWYWx1ZSh0aGlzLnNwaW5uZXJWYWx1ZU9mKHRoaXMubnVtYmVySG9sZGVyLmdldFZhbHVlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG51bWJlciBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlzdXBlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMubnVtYmVySG9sZGVyLnNldFZhbHVlKChOdW1iZXIpIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG51bWJlciBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKHRoaXMuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubnVtYmVySG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm51bWJlckNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemUodGhpcy5udW1iZXJIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBudW1iZXIgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2hhbmdlTGlzdGVuZXIoQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAodGhpcy5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCkgewotCQkJdGhpcy5udW1iZXJIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubnVtYmVyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE51bWJlciBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRvIGEgbm9uLW51bGwgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIE9iamVjdCBzcGlubmVyVmFsdWVPZihPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkgOiB2YWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyIHZhbHVlIGlmIGl0IGhhcyBjaGFuZ2VkLgotCSAqLwotCXZvaWQgc3luY2hyb25pemUoT2JqZWN0IHZhbHVlKSB7Ci0JCU9iamVjdCBuZXdWYWx1ZSA9IHRoaXMuc3Bpbm5lclZhbHVlT2YodmFsdWUpOwotCQkvLyBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgZGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN5bmNocm9uaXplZAotCQkvLyAodmlhICNzZXRWYWx1ZSgpKQotCQlpZiAoICEgdGhpcy5nZXRWYWx1ZSgpLmVxdWFscyhuZXdWYWx1ZSkpIHsKLQkJCXRoaXMuc2V0VmFsdWUobmV3VmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5udW1iZXJIb2xkZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MzhlNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotCi0vKioKLSAqIFRoaXMgTGlzdFNlbGVjdGlvbk1vZGVsIGlzIGF3YXJlIG9mIHRoZSBMaXN0TW9kZWwgYW5kCi0gKiBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIGFjY2VzcyBhbmQgc2V0IHRoZQotICogc2VsZWN0ZWQgKm9iamVjdHMqLCBhcyBvcHBvc2VkIHRvIHRoZSBzZWxlY3RlZCAqaW5kZXhlcyouCi0gKi8KLXB1YmxpYyBjbGFzcyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwKLQlleHRlbmRzIERlZmF1bHRMaXN0U2VsZWN0aW9uTW9kZWwKLXsKLQkvKiogVGhlIGxpc3QgbW9kZWwgcmVmZXJlbmNlZCBieSB0aGUgbGlzdCBzZWxlY3Rpb24gbW9kZWwuICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0TW9kZWwgbGlzdE1vZGVsOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gY2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIHRoZSBsaXN0IG1vZGVsIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgZmluYWwgTGlzdERhdGFMaXN0ZW5lciBsaXN0RGF0YUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBsaXN0IHNlbGVjdGlvbiBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwoTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmxpc3RNb2RlbCA9IGxpc3RNb2RlbDsKLQkJdGhpcy5saXN0RGF0YUxpc3RlbmVyID0gdGhpcy5idWlsZExpc3REYXRhTGlzdGVuZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0RGF0YUxpc3RlbmVyIGJ1aWxkTGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0RGF0YUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaW50ZXJ2YWxBZGRlZChMaXN0RGF0YUV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gdGhpcyBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbGVjdGlvbgotCQkJfQotCQkJcHVibGljIHZvaWQgaW50ZXJ2YWxSZW1vdmVkKExpc3REYXRhRXZlbnQgZXZlbnQpIHsKLQkJCQkvLyB0aGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgc2VsZWN0aW9uCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb250ZW50c0NoYW5nZWQoTGlzdERhdGFFdmVudCBldmVudCkgewotCQkJCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbC50aGlzLmxpc3RNb2RlbENvbnRlbnRzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGRhdGEgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogVHlwaWNhbGx5LCB0aGUgc2VsZWN0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgY2xlYXJlZCB3aGVuIHRoZQotCSAqIGNvbnRlbnRzIG9mIHRoZSBsaXN0IGhhdmUgY2hhbmdlZC4gTW9zdCBvZiB0aGUgdGltZSB0aGlzIGp1c3QKLQkgKiBtZWFucyBhbiBpdGVtIGhhcyBjaGFuZ2VkIGluIGEgd2F5IHRoYXQgYWZmZWN0cyBpdHMgZGlzcGxheSBzdHJpbmcKLQkgKiBvciBpY29uLiBXZSB0eXBpY2FsbHkgb25seSB1c2UgdGhlIGNsYXNzIGZvciBlZGl0cyBpbnZvbHZpbmcKLQkgKiBzaW5nbGUgc2VsZWN0aW9uLgotCSAqIEEgc3ViY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBzZWxlY3Rpb24KLQkgKiBzaG91bGQgYmUgY2xlYXJlZCBiZWNhdXNlIGEgY2hhbmdlIGNvdWxkIG1lYW4gdGhlIHNlbGVjdGlvbiBpcyBpbnZhbGlkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxpc3RNb2RlbENvbnRlbnRzQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdERhdGFFdmVudCBldmVudCkgewotCQkvKip0aGlzLmNsZWFyU2VsZWN0aW9uKCk7Ki8KLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdFNlbGVjdGlvbk1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihMaXN0U2VsZWN0aW9uTGlzdGVuZXIgbCkgewotCQlpZiAodGhpcy5oYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5saXN0TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lcih0aGlzLmxpc3REYXRhTGlzdGVuZXIpOwotCQl9Ci0JCXN1cGVyLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0U2VsZWN0aW9uTGlzdGVuZXIoTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RTZWxlY3Rpb25MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcih0aGlzLmxpc3REYXRhTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgbm8gbGlzdGVuZXJzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGhhc05vTGlzdFNlbGVjdGlvbkxpc3RlbmVycygpIHsJLy8gcHJpdmF0ZS1wcm90ZWN0ZWQKLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdFNlbGVjdGlvbkxpc3RlbmVycygpLmxlbmd0aCA9PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCBtb2RlbCByZWZlcmVuY2VkIGJ5IHRoZSBsaXN0IHNlbGVjdGlvbiBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vZGVsIGdldExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdE1vZGVsOwotCX0KLQotCXB1YmxpYyBpbnQgc2VsZWN0ZWRWYWx1ZXNTaXplKCkgewotCQlpbnQgbWluID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpbnQgbWF4ID0gdGhpcy5nZXRNYXhTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmICgobWluIDwgMCkgfHwgKG1heCA8IDApKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCW4rKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IHNlbGVjdGVkIHZhbHVlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBzZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldE1pblNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0U2l6ZSgpIDw9IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgdmFsdWVzLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBzZWxlY3RlZFZhbHVlcygpIHsKLQkJaW50IG1pbiA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaW50IG1heCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoKG1pbiA8IDApIHx8IChtYXggPCAwKSkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JCX0KLQotCQlpbnQgbWF4U2l6ZSA9IChtYXggLSBtaW4pICsgMTsKLQkJT2JqZWN0W10gdGVtcCA9IG5ldyBPYmplY3RbbWF4U2l6ZV07Ci0JCWludCBuID0gMDsKLQkJaW50IGNvdW50ID0gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRTaXplKCk7Ci0JCWZvciAoaW50IGkgPSBtaW47IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmICh0aGlzLmlzU2VsZWN0ZWRJbmRleChpKSAmJiAoaSA8IGNvdW50KSkgewotCQkJCXRlbXBbbisrXSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGkpOwotCQkJfQotCQl9Ci0JCWlmIChuID09IG1heFNpemUpIHsKLQkJCS8vIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCS8vIG9ubHkgc29tZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFtuXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIG4pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgc2VsZWN0ZWQgaW5kaWNlcyBpbiBvcmRlci4KLQkgKi8KLQlwdWJsaWMgaW50W10gc2VsZWN0ZWRJbmRpY2VzKCkgewotCQlpbnQgbWluID0gdGhpcy5nZXRNaW5TZWxlY3Rpb25JbmRleCgpOwotCQlpbnQgbWF4ID0gdGhpcy5nZXRNYXhTZWxlY3Rpb25JbmRleCgpOwotCi0JCWlmICgobWluIDwgMCkgfHwgKG1heCA8IDApKSB7Ci0JCQlyZXR1cm4gbmV3IGludFswXTsKLQkJfQotCi0JCWludCBtYXhTaXplID0gKG1heCAtIG1pbikgKyAxOwotCQlpbnRbXSB0ZW1wID0gbmV3IGludFttYXhTaXplXTsKLQkJaW50IG4gPSAwOwotCQlpbnQgY291bnQgPSB0aGlzLmdldExpc3RNb2RlbCgpLmdldFNpemUoKTsKLQkJZm9yIChpbnQgaSA9IG1pbjsgaSA8PSBtYXg7IGkrKykgewotCQkJaWYgKHRoaXMuaXNTZWxlY3RlZEluZGV4KGkpICYmIChpIDwgY291bnQpKSB7Ci0JCQkJdGVtcFtuKytdID0gaTsKLQkJCX0KLQkJfQotCQlpZiAobiA9PSBtYXhTaXplKSB7Ci0JCQkvLyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSB3ZXJlIHNlbGVjdGVkCi0JCQlBcnJheXMuc29ydCh0ZW1wKTsKLQkJCXJldHVybiB0ZW1wOwotCQl9Ci0JCS8vIG9ubHkgc29tZSBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIHdlcmUgc2VsZWN0ZWQKLQkJaW50W10gcmVzdWx0ID0gbmV3IGludFtuXTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wLCAwLCByZXN1bHQsIDAsIG4pOwotCQlBcnJheXMuc29ydChyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgc2VsZWN0ZWQgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0U2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCXRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKG9iamVjdHMpOwotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cyB0byB0aGUgc3BlY2lmaWVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjc2V0U2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMgdG8gdGhlIHNwZWNpZmllZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3NldFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkVmFsdWVzKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJdGhpcy5zZXRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3Iob2JqZWN0cykpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuc2luZ2xldG9uSXRlcmF0b3Iob2JqZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgb2JqZWN0cyB0byB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNhZGRTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3RlZFZhbHVlcyhJdGVyYXRvcjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuc2V0VmFsdWVJc0FkanVzdGluZyh0cnVlKTsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKG9iamVjdHMpOwotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG9iamVjdHMgdG8gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjYWRkU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvbjw/PiBvYmplY3RzKSB7Ci0JCXRoaXMuYWRkU2VsZWN0ZWRWYWx1ZXMob2JqZWN0cy5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2FkZFNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGVkVmFsdWVzKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJdGhpcy5hZGRTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3Iob2JqZWN0cykpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdCBmcm9tIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI3JlbW92ZVNlbGVjdGlvbkludGVydmFsKGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkVmFsdWUoT2JqZWN0IG9iamVjdCkgewotCQl0aGlzLnJlbW92ZVNlbGVjdGVkVmFsdWVzKENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBvYmplY3RzIGZyb20gdGhlIGN1cnJlbnQgc2V0IG9mIHNlbGVjdGVkIG9iamVjdHMuCi0JICogQHNlZSBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWwjcmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoSXRlcmF0b3I8Pz4gb2JqZWN0cykgewotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcodHJ1ZSk7Ci0JCUxpc3RNb2RlbCBsbSA9IHRoaXMuZ2V0TGlzdE1vZGVsKCk7Ci0JCWludCBsbVNpemUgPSBsbS5nZXRTaXplKCk7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleE9mKG9iamVjdHMubmV4dCgpLCBsbSwgbG1TaXplKTsKLQkJCXRoaXMucmVtb3ZlU2VsZWN0aW9uSW50ZXJ2YWwoaW5kZXgsIGluZGV4KTsKLQkJfQotCQl0aGlzLnNldFZhbHVlSXNBZGp1c3RpbmcoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlcyhDb2xsZWN0aW9uPD8+IG9iamVjdHMpIHsKLQkJdGhpcy5yZW1vdmVTZWxlY3RlZFZhbHVlcyhvYmplY3RzLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG9iamVjdHMgZnJvbSB0aGUgY3VycmVudCBzZXQgb2Ygc2VsZWN0ZWQgb2JqZWN0cy4KLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNyZW1vdmVTZWxlY3Rpb25JbnRlcnZhbChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZFZhbHVlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCXRoaXMucmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoQ29sbGVjdGlvblRvb2xzLml0ZXJhdG9yKG9iamVjdHMpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNnZXRBbmNob3JTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFuY2hvciBzZWxlY3Rpb24gaXMgZW1wdHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkgewotCQlpbnQgaW5kZXggPSB0aGlzLmdldEFuY2hvclNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRBbmNob3JTZWxlY3Rpb25JbmRleChpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QW5jaG9yU2VsZWN0ZWRWYWx1ZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXRoaXMuc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgodGhpcy5pbmRleE9mKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldExlYWRTZWxlY3Rpb25JbmRleCgpCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGxlYWQgc2VsZWN0aW9uIGlzIGVtcHR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TGVhZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TGVhZFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0TGlzdE1vZGVsKCkuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmF4LnN3aW5nLkxpc3RTZWxlY3Rpb25Nb2RlbCNzZXRMZWFkU2VsZWN0aW9uSW5kZXgoaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlYWRTZWxlY3RlZFZhbHVlKE9iamVjdCBvYmplY3QpIHsKLQkJdGhpcy5zZXRMZWFkU2VsZWN0aW9uSW5kZXgodGhpcy5pbmRleE9mKG9iamVjdCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldE1heFNlbGVjdGlvbkluZGV4KCkKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbWF4IHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1heFNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2dldE1pblNlbGVjdGlvbkluZGV4KCkKLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgbWluIHNlbGVjdGlvbiBpcyBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldE1pblNlbGVjdGVkVmFsdWUoKSB7Ci0JCWludCBpbmRleCA9IHRoaXMuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRMaXN0TW9kZWwoKS5nZXRFbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsI2lzU2VsZWN0ZWRJbmRleChpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsdWVJc1NlbGVjdGVkKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHRoaXMuaXNTZWxlY3RlZEluZGV4KHRoaXMuaW5kZXhPZihvYmplY3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBvYmplY3RzIHRvIHRoZSBjdXJyZW50IHNldCBvZiBzZWxlY3RlZCBvYmplY3RzLAotCSAqIHdpdGhvdXQgd3JhcHBpbmcgdGhlIGFjdGlvbnMgaW4gImFkanVzdGluZyIgZXZlbnRzLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZFZhbHVlc0ludGVybmFsKEl0ZXJhdG9yPD8+IG9iamVjdHMpIHsKLQkJTGlzdE1vZGVsIGxtID0gdGhpcy5nZXRMaXN0TW9kZWwoKTsKLQkJaW50IGxpc3RNb2RlbFNpemUgPSBsbS5nZXRTaXplKCk7Ci0JCXdoaWxlIChvYmplY3RzLmhhc05leHQoKSkgewotCQkJaW50IGluZGV4ID0gdGhpcy5pbmRleE9mKG9iamVjdHMubmV4dCgpLCBsbSwgbGlzdE1vZGVsU2l6ZSk7Ci0JCQl0aGlzLmFkZFNlbGVjdGlvbkludGVydmFsKGluZGV4LCBpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGluZGV4IGluIHRoZSBsaXN0IG1vZGVsIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFJldHVybiAtMSBpZiB0aGUgb2JqZWN0IGlzIG5vdCBpbiB0aGUgbGlzdCBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGludCBpbmRleE9mKE9iamVjdCBvYmplY3QpIHsKLQkJTGlzdE1vZGVsIGxtID0gdGhpcy5nZXRMaXN0TW9kZWwoKTsKLQkJcmV0dXJuIHRoaXMuaW5kZXhPZihvYmplY3QsIGxtLCBsbS5nZXRTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggaW4gdGhlIGxpc3QgbW9kZWwgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogUmV0dXJuIC0xIGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZSBsaXN0IG1vZGVsLgotCSAqLwotCS8vIHdlJ3JlIGp1c3QgamVya2luZyBhcm91bmQgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGhlcmUKLQkvLyAoaW4gbWVtb3J5IG9mIFBoaWwuLi4pOwotCS8vIGNhbGwgdGhpcyBtZXRob2QgaW5zaWRlIGxvb3BzIHRoYXQgZG8gbm90IG1vZGlmeSB0aGUgbGlzdE1vZGVsCi0JcHJpdmF0ZSBpbnQgaW5kZXhPZihPYmplY3Qgb2JqZWN0LCBMaXN0TW9kZWwgbG0sIGludCBsaXN0TW9kZWxTaXplKSB7Ci0JCWZvciAoaW50IGkgPSBsaXN0TW9kZWxTaXplOyBpLS0gPiAwOyApIHsKLQkJCWlmIChsbS5nZXRFbGVtZW50QXQoaSkuZXF1YWxzKG9iamVjdCkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTlmY2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5EZWZhdWx0VHJlZU1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuTXV0YWJsZVRyZWVOb2RlOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlUGF0aDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgYSB0cmVlIHdpdGggYSAibnVsbCIgcm9vdCB0aGF0Ci0gKiBoYXMgYSBzZXQgb2YgInByaW1pdGl2ZSIgY2hpbGRyZW4uIFRoZXNlICJwcmltaXRpdmUiIGNoaWxkcmVuIGRvIG5vdCBoYXZlCi0gKiBjaGlsZHJlbiB0aGVtc2VsdmVzLCBtYWtpbmcgdGhlIHRyZWUgYSBtYXhpbXVtIG9mIDIgbGV2ZWxzIGRlZXAuCi0gKiBUaGlzIG1vZGVsIGF1dG9tYXRpY2FsbHkgc3luY2hyb25pemVzIHRoZSByb290J3MgY2hpbGRyZW4gd2l0aCBhCi0gKiBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBwcmltaXRpdmUgKG5vbi1tb2RlbCkgb2JqZWN0cwotICogKGUuZy4gU3RyaW5ncykuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBwcm92aWRpbmcgYW4gImVkaXRhYmxlIiBsaXN0IG9mIHByaW1pdGl2ZXMuIFNpbmNlIHRoZSBKREsKLSAqIGRvZXMgbm90IHByb3ZpZGUgdXMgd2l0aCBhbiBlZGl0YWJsZSBsaXN0Ym94LCB3ZSBtdXN0IHVzZSBhbiBlZGl0YWJsZSB0cmVlLgotICogV2Ugd3JhcCBldmVyeXRoaW5nIGluIERlZmF1bHRNdXRhYmxlVHJlZU5vZGVzLgotICogCi0gKiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50ICNwcmltaXRpdmVDaGFuZ2VkKGludCwgT2JqZWN0KSBhbmQgdXBkYXRlCi0gKiB0aGUgbW9kZWwgYXBwcm9wcmlhdGVseS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgZWRpdHMgdGhlCi0gKiBsaXN0IGRpcmVjdGx5IGFuZCBwcmVzc2VzIDxFbnRlcj4uCi0gKiAKLSAqIFRoZSBKVHJlZSB1c2luZyB0aGlzIG1vZGVsIG11c3QgYmUgY29uZmlndXJlZCBhcyAiZWRpdGFibGUiOgotICogCXRyZWUuc2V0RWRpdGFibGUodHJ1ZSk7Ci0gKi8KLS8vIFRPRE8gY29udmVydCB0byB1c2UgYW4gYWRhcHRlciBpbnN0ZWFkIG9mIHJlcXVpcmluZyBzdWJjbGFzcwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwKLQlleHRlbmRzIERlZmF1bHRUcmVlTW9kZWwKLXsKLQkvKiogYSBtb2RlbCBvbiB0aGUgbGlzdCBvZiBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyOwotCi0JLyoqIGEgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIHRoZSBhZGRpbmcsIHJlbW92aW5nLCBhbmQgcmVwbGFjaW5nIG9mIHRoZSBwcmltaXRpdmVzICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIC0gdGhlIGxpc3QgaG9sZGVyIGlzIHJlcXVpcmVkCi0JICovCi0JcHVibGljIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwoTGlzdFZhbHVlTW9kZWw8Pz4gbGlzdEhvbGRlcikgewotCQlzdXBlcihuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShudWxsLCB0cnVlKSk7ICAvLyB0cnVlID0gdGhlIHJvb3QgY2FuIGhhdmUgY2hpbGRyZW4KLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCS8vIHBvc3Rwb25lIGxpc3RlbmluZyB0byB0aGUgbW9kZWwgdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzCi0JfQotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByaW1pdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byB1cGRhdGUgdGhlIAotCSAqIG1vZGVsIGFwcHJvcHJpYXRlbHkuIFRoZSBwcmltaXRpdmUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB3YXMKLQkgKiBlZGl0ZWQgZGlyZWN0bHkgYnkgdGhlIHVzZXIgYW5kIHRoZSBuZXcgdmFsdWUgaXMgYXMgc3BlY2lmaWVkLgotCSAqIENvbnZlcnQgdGhlIHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHBsYWNlIGl0IGluIHRoZSBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwcmltaXRpdmVDaGFuZ2VkKGludCBpbmRleCwgT2JqZWN0IG5ld1ZhbHVlKTsKLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGluc3RlYWQgb2YgY2hhbmdpbmcgdGhlIG5vZGUgZGlyZWN0bHkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsdWVGb3JQYXRoQ2hhbmdlZChUcmVlUGF0aCBwYXRoLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJVHJlZU5vZGUgbm9kZSA9IChUcmVlTm9kZSkgcGF0aC5nZXRMYXN0UGF0aENvbXBvbmVudCgpOwotCQlpbnQgaW5kZXggPSAoKFRyZWVOb2RlKSB0aGlzLmdldFJvb3QoKSkuZ2V0SW5kZXgobm9kZSk7Ci0JCXRoaXMucHJpbWl0aXZlQ2hhbmdlZChpbmRleCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuZ2V0VHJlZU1vZGVsTGlzdGVuZXJzKCkubGVuZ3RoID09IDApIHsKLQkJCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuc3luY2hyb25pemVMaXN0KCk7Ci0JCX0KLQkJc3VwZXIuYWRkVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJc3VwZXIucmVtb3ZlVHJlZU1vZGVsTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmdldFRyZWVNb2RlbExpc3RlbmVycygpLmxlbmd0aCA9PSAwKSB7Ci0JCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgb3VyIGxpc3Qgb2Ygbm9kZXMgd2l0aCB0aGUgbGlzdCBvZiBwcmltaXRpdmVzCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZUxpc3QoKSB7Ci0JCXRoaXMuY2xlYXJMaXN0KCk7Ci0JCXRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0Jdm9pZCBjbGVhckxpc3QoKSB7Ci0JCWludCBjaGlsZGNvdW50ID0gdGhpcy5yb290LmdldENoaWxkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IGNoaWxkY291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudCgoTXV0YWJsZVRyZWVOb2RlKXRoaXMucm9vdC5nZXRDaGlsZEF0KGkpKTsKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTGlzdCgpIHsKLQkJZm9yIChJdGVyYXRvcjw/PiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZFByaW1pdGl2ZShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHByaW1pdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcmltaXRpdmUoT2JqZWN0IHByaW1pdGl2ZSkgewotCQl0aGlzLmluc2VydFByaW1pdGl2ZSh0aGlzLnJvb3QuZ2V0Q2hpbGRDb3VudCgpLCBwcmltaXRpdmUpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJpbWl0aXZlCi0JICogYW5kIGluc2VydCBpdCBhcyBhIGNoaWxkIG9mIHRoZSByb290LgotCSAqLwotCXZvaWQgaW5zZXJ0UHJpbWl0aXZlKGludCBpbmRleCwgT2JqZWN0IHByaW1pdGl2ZSkgewotCQlEZWZhdWx0TXV0YWJsZVRyZWVOb2RlIG5vZGUgPSBuZXcgRGVmYXVsdE11dGFibGVUcmVlTm9kZShwcmltaXRpdmUsIGZhbHNlKTsgLy8gZG9uJ3QgYWxsb3cgY2hpbGRyZW4gb24gdGhlIGNoaWxkIG5vZGUKLQkJdGhpcy5pbnNlcnROb2RlSW50byhub2RlLCAoTXV0YWJsZVRyZWVOb2RlKSB0aGlzLnJvb3QsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgbm9kZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCU11dGFibGVUcmVlTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChNdXRhYmxlVHJlZU5vZGUpIHRoaXMucm9vdC5nZXRDaGlsZEF0KGluZGV4KTsKLQkJdGhpcy5yZW1vdmVOb2RlRnJvbVBhcmVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgdXNlciBvYmplY3Qgb2YgdGhlIG5vZGUgYXQgY2hpbGRJbmRleC4KLQkgKi8KLQl2b2lkIHJlcGxhY2VQcmltaXRpdmUoaW50IGluZGV4LCBPYmplY3QgcHJpbWl0aXZlKSB7Ci0JCU11dGFibGVUcmVlTm9kZSBub2RlID0gKE11dGFibGVUcmVlTm9kZSkgdGhpcy5yb290LmdldENoaWxkQXQoaW5kZXgpOwotCQlub2RlLnNldFVzZXJPYmplY3QocHJpbWl0aXZlKTsKLQkJdGhpcy5ub2RlQ2hhbmdlZChub2RlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlQcmltaXRpdmVMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLmluc2VydFByaW1pdGl2ZShpKyssIGl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBldmVudC5nZXRJdGVtc1NpemUoKTsgaSsrKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnJlbW92ZU5vZGUoZXZlbnQuZ2V0SW5kZXgoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpID0gZXZlbnQuZ2V0SW5kZXgoKTsKLQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXROZXdJdGVtcygpKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbC50aGlzLnJlcGxhY2VQcmltaXRpdmUoaSsrLCBpdGVtKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJQXJyYXlMaXN0PE11dGFibGVUcmVlTm9kZT4gdGVtcCA9IG5ldyBBcnJheUxpc3Q8TXV0YWJsZVRyZWVOb2RlPihldmVudC5nZXRMZW5ndGgoKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQl0ZW1wLmFkZChQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMucmVtb3ZlTm9kZShldmVudC5nZXRTb3VyY2VJbmRleCgpKSk7Ci0JCQl9Ci0JCQlpbnQgaSA9IGV2ZW50LmdldFRhcmdldEluZGV4KCk7Ci0JCQlmb3IgKE11dGFibGVUcmVlTm9kZSBub2RlIDogdGVtcCkgewotCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5pbnNlcnRQcmltaXRpdmUoaSsrLCBub2RlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsLnRoaXMuY2xlYXJMaXN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWwudGhpcy5zeW5jaHJvbml6ZUxpc3QoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkMzExMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFRoaXMgamF2YXguc3dpbmcuQnV0dG9uTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIGxpc3RlbmVyCi0gKiAoZS5nLiBhIEpSYWRpb0J1dHRvbikgaW4gc3luY2ggd2l0aCBhICh0eXBpY2FsbHkgc2hhcmVkKQotICogUHJvcGVydHlWYWx1ZU1vZGVsIHRoYXQgaG9sZHMgb25lIHZhbHVlIG91dCBvZiBhIHNldCBvZiB2YWx1ZXMuCi0gKiAKLSAqIE5PVEU6IERvICpub3QqIHVzZSB0aGlzIG1vZGVsIHdpdGggYSBCdXR0b25Hcm91cCwgc2luY2UgdGhlCi0gKiBzaGFyZWQgdmFsdWUgaG9sZGVyIGFuZCB0aGUgd3JhcHBlcnMgYnVpbHQgYnkgdGhpcyBhZGFwdGVyIHdpbGwKLSAqIGtlZXAgdGhlIGFwcHJvcHJpYXRlIHJhZGlvIGJ1dHRvbiBjaGVja2VkLiBBbHNvLCB0aGlzIGFsbG93cwotICogdXMgdG8gdW5jaGVjayBhbGwgdGhlIHJhZGlvIGJ1dHRvbnMgaW4gYSBncm91cCB3aGVuIHRoZSBzaGFyZWQKLSAqIHZhbHVlIGlzIG51bGwuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSB2YWx1ZSBob2xkZXIgaXMgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJc3VwZXIoYnVpbGRCb29sZWFuSG9sZGVyKHZhbHVlSG9sZGVyLCBidXR0b25WYWx1ZSksIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIsIE9iamVjdCBidXR0b25WYWx1ZSkgewotCQlzdXBlcihidWlsZEJvb2xlYW5Ib2xkZXIodmFsdWVIb2xkZXIsIGJ1dHRvblZhbHVlKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ1aWxkIHVwIGEgc2V0IG9mIHdyYXBwZXJzIHRoYXQgd2lsbCBjb252ZXJ0IHRoZQotCSAqIHNwZWNpZmllZCB2YWx1ZSBob2xkZXIgYW5kIGJ1dHRvbiB2YWx1ZSB0by9mcm9tIGEgYm9vbGVhbi4KLQkgKiAKLQkgKiBJZiB0aGUgdmFsdWUgaG9sZGVyJ3MgdmFsdWUgbWF0Y2hlcyB0aGUgYnV0dG9uIHZhbHVlLAotCSAqIHRoZSB3cmFwcGVyIHdpbGwgcmV0dXJuIHRydWUuIExpa2V3aXNlLCBpZiB0aGUgdmFsdWUgaG9sZGVyJ3MKLQkgKiB2YWx1ZSBpcyBzZXQgdG8gdHJ1ZSwgdGhlIHdyYXBwZXIgd2lsbCBzZXQgdGhlIHZhbHVlIGhvbGRlcidzCi0JICogdmFsdWUgdG8gdGhlIGJ1dHRvbiB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBmaWx0ZXJpbmdQVk0gPSBuZXcgRmlsdGVyaW5nV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0Pih2YWx1ZUhvbGRlciwgbmV3IFJhZGlvQnV0dG9uRmlsdGVyKGJ1dHRvblZhbHVlKSk7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3QsIEJvb2xlYW4+KGZpbHRlcmluZ1BWTSwgbmV3IFJhZGlvQnV0dG9uVHJhbnNmb3JtZXIoYnV0dG9uVmFsdWUpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSB1c2VyIGNhbm5vdCBkZS1zZWxlY3QgYSByYWRpbyBidXR0b24gLSB0aGUgdXNlcgotCSAqIGNhbiBvbmx5ICpzZWxlY3QqIGEgcmFkaW8gYnV0dG9uLiBPbmx5IHRoZSBtb2RlbCBjYW4KLQkgKiBjYXVzZSBhIHJhZGlvIGJ1dHRvbiB0byBiZSBkZS1zZWxlY3RlZC4gV2UgdXNlIHRoZQotCSAqIEFSTUVEIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgYmVpbmcgZGUtc2VsZWN0ZWQKLQkgKiBieSB0aGUgdXNlci4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZChib29sZWFuIGIpIHsKLQkJLy8gZG8gbm90IGFsbG93IHRoZSB1c2VyIHRvIGRlLXNlbGVjdCBhIHJhZGlvIGJ1dHRvbgotCQkvLyByYWRpbyBidXR0b25zIGNhbgotCQlpZiAoKGIgPT0gZmFsc2UpICYmIHRoaXMuaXNBcm1lZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuc2V0U2VsZWN0ZWQoYik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBmaWx0ZXIgd2lsbCBvbmx5IHBhc3MgdGhyb3VnaCBhIG5ldyB2YWx1ZSB0byB0aGUgd3JhcHBlZAotCSAqIHZhbHVlIGhvbGRlciB3aGVuIGl0IG1hdGNoZXMgdGhlIGNvbmZpZ3VyZWQgYnV0dG9uIHZhbHVlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmFkaW9CdXR0b25GaWx0ZXIgaW1wbGVtZW50cyBCaWRpRmlsdGVyPE9iamVjdD4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25GaWx0ZXIoT2JqZWN0IGJ1dHRvblZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5idXR0b25WYWx1ZSA9IGJ1dHRvblZhbHVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGFsd2F5cyByZXR1cm4gdGhlIHdyYXBwZWQgdmFsdWUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3QgdmFsdWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHBhc3MgdGhyb3VnaCB0aGUgdmFsdWUgdG8gdGhlIHdyYXBwZWQgcHJvcGVydHkgdmFsdWUgbW9kZWwKLQkJICogKm9ubHkqIHdoZW4gaXQgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiByZXZlcnNlQWNjZXB0KE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKSAmJiB2YWx1ZS5lcXVhbHModGhpcy5idXR0b25WYWx1ZSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgdHJhbnNmb3JtZXIgd2lsbCBjb252ZXJ0IHRoZSB3cmFwcGVkIHZhbHVlIHRvIEJvb2xlYW4uVFJVRQotCSAqIHdoZW4gaXQgbWF0Y2hlcyB0aGUgY29uZmlndXJlZCBidXR0b24gdmFsdWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBSYWRpb0J1dHRvblRyYW5zZm9ybWVyIGltcGxlbWVudHMgQmlkaVRyYW5zZm9ybWVyPE9iamVjdCwgQm9vbGVhbj4gewotCQlwcml2YXRlIE9iamVjdCBidXR0b25WYWx1ZTsKLQotCQlwdWJsaWMgUmFkaW9CdXR0b25UcmFuc2Zvcm1lcihPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1dHRvblZhbHVlID0gYnV0dG9uVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogaWYgdGhlIHdyYXBwZWQgdmFsdWUgbWF0Y2hlcyBvdXIgYnV0dG9uIHZhbHVlIHJldHVybiB0cnVlLAotCQkgKiBpZiBpdCBpcyBzb21lIG90aGVyIHZhbHVlIHJldHVybiBmYWxzZTsKLQkJICogYnV0IGlmIGl0IGlzIG51bGwgc2ltcGx5IHBhc3MgaXQgdGhyb3VnaCBiZWNhdXNlIGl0IHdpbGwgY2F1c2UgdGhlCi0JCSAqIGJ1dHRvbiBtb2RlbCdzIGRlZmF1bHQgdmFsdWUgdG8gYmUgdXNlZAotCQkgKi8KLQkJcHVibGljIEJvb2xlYW4gdHJhbnNmb3JtKE9iamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBCb29sZWFuLnZhbHVlT2YodmFsdWUuZXF1YWxzKHRoaXMuYnV0dG9uVmFsdWUpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBpZiB0aGUgbmV3IHZhbHVlIGlzIHRydWUsIHBhc3MgdGhyb3VnaCB0aGUgb3VyIGJ1dHRvbiB2YWx1ZTsKLQkJICogb3RoZXJ3aXNlIHBhc3MgdGhyb3VnaCBudWxsCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IHJldmVyc2VUcmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJcmV0dXJuICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgPyB0aGlzLmJ1dHRvblZhbHVlIDogbnVsbDsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OTBjYWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvU3Bpbm5lck1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RTcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJOdW1iZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgQ2hhbmdlTGlzdGVuZXIKLSAqIChlLmcuIGEgSlNwaW5uZXIpIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwgdGhhdCBob2xkcyBhIHZhbHVlLgotICogCi0gKiBOb3RlOiBpdCBpcyBsaWtlbHkgeW91IHdhbnQgdG8gdXNlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXMgaW5zdGVhZCBvZgotICogdGhpcyBvbmU6Ci0gKiAgICAgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqICAgICBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyCi0gKiAgICAgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIKLSAqIAotICogTkI6IFRoaXMgbW9kZWwgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdmFsdWVzIHRoYXQgaGF2ZSBhIGZhaXJseQotICogaW5leHBlbnNpdmUgI2VxdWFscygpIGltcGxlbWVudGF0aW9uLgotICogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpCi0gKi8KLXB1YmxpYyBjbGFzcyBTcGlubmVyTW9kZWxBZGFwdGVyCi0JZXh0ZW5kcyBBYnN0cmFjdFNwaW5uZXJNb2RlbAotewotCS8qKiBUaGUgZGVsZWdhdGUgc3Bpbm5lciBtb2RlbCB3aG9zZSBiZWhhdmlvciB3ZSAiZW5oYW5jZSIuICovCi0JcHJvdGVjdGVkIGZpbmFsIFNwaW5uZXJNb2RlbCBkZWxlZ2F0ZTsKLQotCS8qKiBBIGxpc3RlbmVyIHRoYXQgYWxsb3dzIHVzIHRvIGZvcndhcmQgYW55IGNoYW5nZXMgbWFkZSB0byB0aGUgZGVsZWdhdGUgc3Bpbm5lciBtb2RlbC4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ2hhbmdlTGlzdGVuZXIgZGVsZWdhdGVMaXN0ZW5lcjsKLQotCS8qKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIHZhbHVlLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JLyoqIEEgbGlzdGVuZXIgdGhhdCBhbGxvd3MgdXMgdG8gc3luY2hyb25pemUgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUuICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdmFsdWVMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGFuZCBkZWxlZ2F0ZSBhcmUgcmVxdWlyZWQuCi0JICovCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlciwgU3Bpbm5lck1vZGVsIGRlbGVnYXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICh2YWx1ZUhvbGRlciA9PSBudWxsIHx8IGRlbGVnYXRlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSB2YWx1ZUhvbGRlcjsKLQkJdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMudmFsdWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZWxlZ2F0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgLSB0aGUgdmFsdWUgaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoaXMgd2lsbCB3cmFwIGEgc2ltcGxlIG51bWJlciBzcGlubmVyIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTcGlubmVyTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXIpIHsKLQkJdGhpcyh2YWx1ZUhvbGRlciwgbmV3IFNwaW5uZXJOdW1iZXJNb2RlbCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRWYWx1ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy52YWx1ZUNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidmFsdWUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogZXhwYW5kIGFjY2VzcyBhIGJpdCBmb3IgaW5uZXIgY2xhc3MKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBmaXJlU3RhdGVDaGFuZ2VkKCkgewotCQlzdXBlci5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENoYW5nZUxpc3RlbmVyIGJ1aWxkRGVsZWdhdGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCS8vIGZvcndhcmQgdGhlIGV2ZW50LCB3aXRoIHRoaXMgYXMgdGhlIHNvdXJjZQotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXIudGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJkZWxlZ2F0ZSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3Bpbm5lck1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB2YWx1ZSBkaXJlY3RseS4KLQkgKiBUaGUgcmVzdWx0aW5nIGV2ZW50IHdpbGwgYmUgaWdub3JlZDogQHNlZSAjc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QpLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQl0aGlzLmRlbGVnYXRlLnNldFZhbHVlKHZhbHVlKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXROZXh0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldE5leHRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJldmlvdXNWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0UHJldmlvdXNWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KENoYW5nZUxpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRlbGVnYXRlLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCQl0aGlzLmVuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCX0KLQkJc3VwZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyB2YWx1ZSBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KENoYW5nZUxpc3RlbmVyLmNsYXNzKSA9PSAwKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVZhbHVlSG9sZGVyKCk7Ci0JCQl0aGlzLmRlbGVnYXRlLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuZGVsZWdhdGVMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQSB0aGlyZCBwYXJ0eSBoYXMgbW9kaWZpZWQgdGhlIHVuZGVybHlpbmcgdmFsdWUuCi0JICogU3luY2hyb25pemUgdGhlIGRlbGVnYXRlIG1vZGVsIGFjY29yZGluZ2x5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuc3luY2hyb25pemVEZWxlZ2F0ZShldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlbGVnYXRlJ3MgdmFsdWUgaWYgaXQgaGFzIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVEZWxlZ2F0ZShPYmplY3QgdmFsdWUpIHsKLQkJLy8gY2hlY2sgdG8gc2VlIHdoZXRoZXIgdGhlIGRlbGVnYXRlIGhhcyBhbHJlYWR5IGJlZW4gc3luY2hyb25pemVkCi0JCS8vICh2aWEgI3NldFZhbHVlKCkpCi0JCWlmICggISB0aGlzLmRlbGVnYXRlLmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlKSkgewotCQkJdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VWYWx1ZUhvbGRlcigpIHsKLQkJdGhpcy52YWx1ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy52YWx1ZUxpc3RlbmVyKTsKLQkJdGhpcy5zeW5jaHJvbml6ZURlbGVnYXRlKHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWVIb2xkZXIoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudmFsdWVMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy52YWx1ZUhvbGRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyOWMxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UYWJsZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuQWJzdHJhY3RUYWJsZU1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIFRhYmxlTW9kZWwgY2FuIGJlIHVzZWQgdG8ga2VlcCBhIFRhYmxlTW9kZWxMaXN0ZW5lciAoZS5nLiBhIEpUYWJsZSkKLSAqIGluIHN5bmNoIHdpdGggYSBMaXN0VmFsdWVNb2RlbCB0aGF0IGhvbGRzIGEgY29sbGVjdGlvbiBvZiBtb2RlbCBvYmplY3RzLAotICogZWFjaCBvZiB3aGljaCBjb3JyZXNwb25kcyB0byBhIHJvdyBpbiB0aGUgdGFibGUuCi0gKiBUeXBpY2FsbHksIGVhY2ggY29sdW1uIG9mIHRoZSB0YWJsZSB3aWxsIGJlIGJvdW5kIHRvIGEgZGlmZmVyZW50IGFzcGVjdAotICogb2YgdGhlIGNvbnRhaW5lZCBtb2RlbCBvYmplY3RzLgotICogCi0gKiBGb3IgZXhhbXBsZSwgYSBNV1RhYmxlIGhhcyBhbiBhdHRyaWJ1dGUgJ2RhdGFiYXNlRmllbGRzJyB0aGF0IGhvbGRzCi0gKiBhIGNvbGxlY3Rpb24gb2YgTVdEYXRhYmFzZUZpZWxkcyB0aGF0IHdvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIHJvd3Mgb2YKLSAqIGEgSlRhYmxlOyBhbmQgZWFjaCBNV0RhdGFiYXNlRmllbGQgaGFzIGEgbnVtYmVyCi0gKiBvZiBhdHRyaWJ1dGVzIChlLmcuIG5hbWUsIHR5cGUsIHNpemUpIHRoYXQgY2FuIGJlIGJvdW5kIHRvIHRoZSBjb2x1bW5zIG9mCi0gKiBhIHJvdyBpbiB0aGUgSlRhYmxlLiBBcyB0aGVzZSBkYXRhYmFzZSBmaWVsZHMgYXJlIGFkZGVkLCByZW1vdmVkLCBhbmQKLSAqIGNoYW5nZWQsIHRoaXMgbW9kZWwgd2lsbCBrZWVwIHRoZSBsaXN0ZW5lcnMgYXdhcmUgb2YgdGhlIGNoYW5nZXMuCi0gKiAKLSAqIEFuIGluc3RhbmNlIG9mIHRoaXMgVGFibGVNb2RlbCBtdXN0IGJlIHN1cHBsaWVkIHdpdGggYQotICogbGlzdCBob2xkZXIgKGUuZy4gdGhlICdkYXRhYmFzZUZpZWxkcycpLCB3aGljaCBpcyBhIHZhbHVlCi0gKiBtb2RlbCBvbiB0aGUgYm91bmQgY29sbGVjdGlvbiBUaGlzIGlzIHJlcXVpcmVkIC0gdGhlCi0gKiBjb2xsZWN0aW9uIGl0c2VsZiBjYW4gYmUgbnVsbCwgYnV0IHRoZSBsaXN0IHZhbHVlIG1vZGVsIHRoYXQKLSAqIGhvbGRzIGl0IGlzIHJlcXVpcmVkLiBUeXBpY2FsbHkgdGhpcyBsaXN0IHdpbGwgYmUgc29ydGVkIChAc2VlCi0gKiBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXIpLgotICogCi0gKiBUaGlzIFRhYmxlTW9kZWwgbXVzdCBhbHNvIGJlIHN1cHBsaWVkIHdpdGggYSBDb2x1bW5BZGFwdGVyIHRoYXQKLSAqIHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGhlYWRlcnMsIHJlbmRlcmVycywgZWRpdG9ycywgYW5kIGNvbnRlbnRzCi0gKiBvZiB0aGUgdmFyaW91cyBjb2x1bW5zLgotICogCi0gKiBEZXNpZ24gZGVjaXNpb246Ci0gKiBDZWxsIGxpc3RlbmVyIG9wdGlvbnMgKGZyb20gbG93IHNwYWNlL2hpZ2ggdGltZSB0byBoaWdoIHNwYWNlL2xvdyB0aW1lKToKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBsaXN0ZW5pbmcgdG8gZXZlcnkgY2VsbCAodGhpcyBpcyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikKLSAqIAktIDEgY2VsbCBsaXN0ZW5lciBwZXIgcm93Ci0gKiAJLSAxIGNlbGwgbGlzdGVuZXIgcGVyIGNlbGwKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyPEU+Ci0JZXh0ZW5kcyBBYnN0cmFjdFRhYmxlTW9kZWwKLXsKLQkvKioKLQkgKiBhIGxpc3Qgb2YgdXNlciBvYmplY3RzIHRoYXQgYXJlIGNvbnZlcnRlZCB0bwotCSAqIHJvd3MgdmlhIHRoZSBjb2x1bW4gYWRhcHRlcgotCSAqLwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdENoYW5nZUxpc3RlbmVyOwotCi0JLyoqCi0JICogZWFjaCByb3cgaXMgYW4gYXJyYXkgb2YgY2VsbCBtb2RlbHMKLQkgKi8KLQkvLyBkZWNsYXJlIGFzIEFycmF5TGlzdCBzbyB3ZSBjYW4gdXNlICNlbnN1cmVDYXBhY2l0eShpbnQpCi0JcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiByb3dzOwotCi0JLyoqCi0JICogY2xpZW50LXN1cHBsaWVkIGFkYXB0ZXIgdGhhdCBwcm92aWRlcyB3aXRoIHRoZSB2YXJpb3VzIGNvbHVtbgotCSAqIHNldHRpbmdzIGFuZCBjb252ZXJ0cyB0aGUgb2JqZWN0cyBpbiB0aGUgTFZNCi0JICogaW50byBhbiBhcnJheSBvZiBjZWxsIG1vZGVscwotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sdW1uQWRhcHRlciBjb2x1bW5BZGFwdGVyOwotCi0JLyoqCi0JICogdGhlIHNpbmdsZSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gZXZlcnkgY2VsbCdzIG1vZGVsCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNlbGxMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdGFibGUgbW9kZWwgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3RzCi0JICogYW5kIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIFRhYmxlTW9kZWxBZGFwdGVyKExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFPiBsaXN0SG9sZGVyLCBDb2x1bW5BZGFwdGVyIGNvbHVtbkFkYXB0ZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGxpc3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJdGhpcy5jb2x1bW5BZGFwdGVyID0gY29sdW1uQWRhcHRlcjsKLQkJdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucm93cyA9IG5ldyBBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPigpOwotCQl0aGlzLmNlbGxMaXN0ZW5lciA9IHRoaXMuYnVpbGRDZWxsTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0YWJsZSBtb2RlbCBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdHMKLQkgKiBhbmQgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXIoQ29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEU+IGNvbGxlY3Rpb25Ib2xkZXIsIENvbHVtbkFkYXB0ZXIgY29sdW1uQWRhcHRlcikgewotCQl0aGlzKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpLCBjb2x1bW5BZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RMaXN0Q2hhbmdlTGlzdGVuZXJXcmFwcGVyKHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5hZGRSb3dzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpLCB0aGlzLmdldEl0ZW1zKGV2ZW50KSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVSb3dzKGV2ZW50LmdldEluZGV4KCksIGV2ZW50LmdldEl0ZW1zU2l6ZSgpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMucmVwbGFjZVJvd3MoZXZlbnQuZ2V0SW5kZXgoKSwgdGhpcy5nZXROZXdJdGVtcyhldmVudCkpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5tb3ZlUm93cyhldmVudC5nZXRUYXJnZXRJbmRleCgpLCBldmVudC5nZXRTb3VyY2VJbmRleCgpLCBldmVudC5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyLnRoaXMuY2xlYXJUYWJsZSgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5yZWJ1aWxkVGFibGUoKTsKLQkJCX0KLQkJCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxPYmplY3Q+IGdldEl0ZW1zKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCXJldHVybiAoSXRlcmFibGU8T2JqZWN0PikgZXZlbnQuZ2V0SXRlbXMoKTsKLQkJCX0KLQkJCS8vIG1pbmltaXplZCBzY29wZSBvZiBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxPYmplY3Q+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQlyZXR1cm4gKEl0ZXJhYmxlPE9iamVjdD4pIGV2ZW50LmdldE5ld0l0ZW1zKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJsaXN0IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENlbGxMaXN0ZW5lcl8oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDZWxsTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXIudGhpcy5jZWxsQ2hhbmdlZCgoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgZXZlbnQuZ2V0U291cmNlKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2VsbCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNvdW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb3dDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMucm93cy5zaXplKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQWRhcHRlci5jb2x1bW5OYW1lKGNvbHVtbik7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIENsYXNzPD8+IGdldENvbHVtbkNsYXNzKGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbkNsYXNzKGNvbHVtbkluZGV4KTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0NlbGxFZGl0YWJsZShpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5BZGFwdGVyLmNvbHVtbklzRWRpdGFibGUoY29sdW1uSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChpbnQgcm93SW5kZXgsIGludCBjb2x1bW5JbmRleCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5yb3dzLmdldChyb3dJbmRleCk7Ci0JCXJldHVybiByb3dbY29sdW1uSW5kZXhdLmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmFsdWVBdChPYmplY3QgdmFsdWUsIGludCByb3dJbmRleCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KHJvd0luZGV4KTsKLQkJcm93W2NvbHVtbkluZGV4XS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmVuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJc3VwZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKFRhYmxlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRhYmxlTW9kZWxMaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5kZXJseWluZyBsaXN0IG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgRT4gZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RIb2xkZXI7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGxpc3QgbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoTGlzdFZhbHVlTW9kZWw8RT4gbGlzdEhvbGRlcikgewotCQlpZiAobGlzdEhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9IHRoaXMuaGFzVGFibGVNb2RlbExpc3RlbmVycygpOwotCQlpZiAoaGFzTGlzdGVuZXJzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQkJdGhpcy5saXN0SG9sZGVyID0gbGlzdEhvbGRlcjsKLQkJaWYgKGhhc0xpc3RlbmVycykgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy5maXJlVGFibGVEYXRhQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gbW9kZWwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gY29sbGVjdGlvbkhvbGRlcikgewotCQl0aGlzLnNldE1vZGVsKG5ldyBDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEU+KGNvbGxlY3Rpb25Ib2xkZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1vZGVsIGhhcyBubyBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9UYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJDb3VudChUYWJsZU1vZGVsTGlzdGVuZXIuY2xhc3MpID09IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtb2RlbCBoYXMgYW55IGxpc3RlbmVycy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNUYWJsZU1vZGVsTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc05vVGFibGVNb2RlbExpc3RlbmVycygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdGFydCBsaXN0ZW5pbmcgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0cyBhbmQgdGhlIHZhcmlvdXMgYXNwZWN0cwotCSAqIG9mIHRoZSBvYmplY3RzIHRoYXQgbWFrZSB1cCB0aGUgcm93cy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5lbmdhZ2VBbGxDZWxscygpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIG9iamVjdHMgaW50byByb3dzIGFuZCBsaXN0ZW4gdG8gdGhlIGNlbGxzLgotCSAqLwotCXByaXZhdGUgdm9pZCBlbmdhZ2VBbGxDZWxscygpIHsKLQkJdGhpcy5yb3dzLmVuc3VyZUNhcGFjaXR5KHRoaXMubGlzdEhvbGRlci5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yPD8gZXh0ZW5kcyBFPiBzdHJlYW0gPSB0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93ID0gdGhpcy5jb2x1bW5BZGFwdGVyLmNlbGxNb2RlbHMoc3RyZWFtLm5leHQoKSk7Ci0JCQl0aGlzLmVuZ2FnZVJvdyhyb3cpOwotCQkJdGhpcy5yb3dzLmFkZChyb3cpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBjZWxscyBpbiB0aGUgc3BlY2lmaWVkIHJvdy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlUm93KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cpIHsKLQkJZm9yIChpbnQgaSA9IHJvdy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJcm93W2ldLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNlbGxMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuZGlzZW5nYWdlQWxsQ2VsbHMoKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5saXN0Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VBbGxDZWxscygpIHsKLQkJZm9yIChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gcm93IDogdGhpcy5yb3dzKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZVJvdyhyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VSb3coV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdykgewotCQlmb3IgKGludCBpID0gcm93Lmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlyb3dbaV0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2VsbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGJydXRlLWZvcmNlIHNlYXJjaCBmb3IgdGhlIGNlbGwocykgdGhhdCBjaGFuZ2VkLi4uCi0JICovCi0Jdm9pZCBjZWxsQ2hhbmdlZChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNlbGxIb2xkZXIpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMucm93cy5zaXplKCk7IGktLSA+IDA7ICkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdIHJvdyA9IHRoaXMucm93cy5nZXQoaSk7Ci0JCQlmb3IgKGludCBqID0gcm93Lmxlbmd0aDsgai0tID4gMDsgKSB7Ci0JCQkJaWYgKHJvd1tqXSA9PSBjZWxsSG9sZGVyKSB7Ci0JCQkJCXRoaXMuZmlyZVRhYmxlQ2VsbFVwZGF0ZWQoaSwgaik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY29udmVydCB0aGUgaXRlbXMgdG8gcm93cwotCSAqLwotCXZvaWQgYWRkUm93cyhpbnQgaW5kZXgsIGludCBzaXplLCBJdGVyYWJsZTxPYmplY3Q+IGl0ZW1zKSB7Ci0JCUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiBuZXdSb3dzID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KHNpemUpOwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLmNvbHVtbkFkYXB0ZXIuY2VsbE1vZGVscyhpdGVtKTsKLQkJCXRoaXMuZW5nYWdlUm93KHJvdyk7Ci0JCQluZXdSb3dzLmFkZChyb3cpOwotCQl9Ci0JCXRoaXMucm93cy5hZGRBbGwoaW5kZXgsIG5ld1Jvd3MpOwotCQl0aGlzLmZpcmVUYWJsZVJvd3NJbnNlcnRlZChpbmRleCwgaW5kZXggKyBzaXplIC0gMSk7Ci0JfQotCi0Jdm9pZCByZW1vdmVSb3dzKGludCBpbmRleCwgaW50IHNpemUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXRoaXMuZGlzZW5nYWdlUm93KHRoaXMucm93cy5yZW1vdmUoaW5kZXgpKTsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NEZWxldGVkKGluZGV4LCBpbmRleCArIHNpemUgLSAxKTsKLQl9Ci0KLQl2b2lkIHJlcGxhY2VSb3dzKGludCBpbmRleCwgSXRlcmFibGU8T2JqZWN0PiBpdGVtcykgewotCQlpbnQgaSA9IGluZGV4OwotCQlmb3IgKE9iamVjdCBpdGVtIDogaXRlbXMpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByb3cgPSB0aGlzLnJvd3MuZ2V0KGkpOwotCQkJdGhpcy5kaXNlbmdhZ2VSb3cocm93KTsKLQkJCXJvdyA9IHRoaXMuY29sdW1uQWRhcHRlci5jZWxsTW9kZWxzKGl0ZW0pOwotCQkJdGhpcy5lbmdhZ2VSb3cocm93KTsKLQkJCXRoaXMucm93cy5zZXQoaSwgcm93KTsKLQkJCWkrKzsKLQkJfQotCQl0aGlzLmZpcmVUYWJsZVJvd3NVcGRhdGVkKGluZGV4LCBpIC0gMSk7Ci0JfQotCi0Jdm9pZCBtb3ZlUm93cyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlBcnJheUxpc3Q8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PltdPiB0ZW1wID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKHRoaXMucm93cy5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQl0aGlzLnJvd3MuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQlpbnQgc3RhcnQgPSBNYXRoLm1pbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KSArIGxlbmd0aCAtIDE7Ci0JCXRoaXMuZmlyZVRhYmxlUm93c1VwZGF0ZWQoc3RhcnQsIGVuZCk7Ci0JfQotCi0Jdm9pZCBjbGVhclRhYmxlKCkgewotCQl0aGlzLmRpc2VuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLQl2b2lkIHJlYnVpbGRUYWJsZSgpIHsKLQkJdGhpcy5kaXNlbmdhZ2VBbGxDZWxscygpOwotCQl0aGlzLmVuZ2FnZUFsbENlbGxzKCk7Ci0JCXRoaXMuZmlyZVRhYmxlRGF0YUNoYW5nZWQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGIyNjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRvZ2dsZUJ1dHRvbi5Ub2dnbGVCdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLmxpc3RlbmVyLmF3dC5BV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsIGNhbiBiZSB1c2VkIHRvIGtlZXAgYSBsaXN0ZW5lcgotICogKGUuZy4gYSBKQ2hlY2tCb3ggb3IgYSBKUmFkaW9CdXR0b24pIGluIHN5bmNoIHdpdGggYSBQcm9wZXJ0eVZhbHVlTW9kZWwKLSAqIG9uIGEgYm9vbGVhbi4KLSAqLwotcHVibGljIGNsYXNzIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcgotCWV4dGVuZHMgVG9nZ2xlQnV0dG9uTW9kZWwKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzZXR0aW5nIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbjsgZm9yIHdoZW4gdGhlIHVuZGVybHlpbmcgbW9kZWwgaXMgbnVsbC4KLQkgKiBUaGUgZGVmYXVsdCBbZGVmYXVsdCB2YWx1ZV0gaXMgZmFsc2UgKGkuZS4gdGhlIHRvZ2dsZSBidXR0b24gaXMgdW5jaGVja2VkL2VtcHR5KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBkZWZhdWx0VmFsdWU7Ci0KLQkvKiogQSB2YWx1ZSBtb2RlbCBvbiB0aGUgdW5kZXJseWluZyBtb2RlbCBib29sZWFuLiAqLwotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IGFsbG93cyB1cyB0byBzeW5jaHJvbml6ZSB3aXRoCi0JICogY2hhbmdlcyBtYWRlIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGJvb2xlYW4uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYm9vbGVhbkNoYW5nZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciAtIHRoZSBib29sZWFuIGhvbGRlciBpcyByZXF1aXJlZC4KLQkgKi8KLQlwdWJsaWMgVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChib29sZWFuSG9sZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IGJvb2xlYW5Ib2xkZXI7Ci0JCXRoaXMuYm9vbGVhbkNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpOwotCQkvLyBwb3N0cG9uZSBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwKLQkJLy8gdW50aWwgd2UgaGF2ZSBsaXN0ZW5lcnMgb3Vyc2VsdmVzLi4uCi0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIC0gdGhlIGJvb2xlYW4gaG9sZGVyIGlzIHJlcXVpcmVkLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgZmFsc2UuCi0JICovCi0JcHVibGljIFRvZ2dsZUJ1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXRoaXMoYm9vbGVhbkhvbGRlciwgZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEJvb2xlYW5DaGFuZ2VMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVG9nZ2xlQnV0dG9uTW9kZWxBZGFwdGVyLnRoaXMuYm9vbGVhbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQkgICAgQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiYm9vbGVhbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQnV0dG9uTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQoYm9vbGVhbiBiKSB7Ci0JCWlmICh0aGlzLmlzU2VsZWN0ZWQoKSAhPSBiKSB7CS8vIHN0b3AgdGhlIHJlY3Vyc2lvbiEKLQkJCXN1cGVyLnNldFNlbGVjdGVkKGIpOy8vcHV0IHRoZSBzdXBlciBjYWxsIGZpcnN0LCBvdGhlcndpc2UgdGhlIGZvbGxvd2luZyBnZXRzIGNhbGxlZCB0d2ljZQotCQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZihiKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRBY3Rpb25MaXN0ZW5lcihBY3Rpb25MaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRBY3Rpb25MaXN0ZW5lcihsKTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRlbmQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcmVtb3ZlQWN0aW9uTGlzdGVuZXIoQWN0aW9uTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVBY3Rpb25MaXN0ZW5lcihsKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5kaXNlbmdhZ2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0YXJ0IGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBuZWNlc3NhcnkuCi0JICovCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkSXRlbUxpc3RlbmVyKEl0ZW1MaXN0ZW5lciBsKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZW5nYWdlTW9kZWwoKTsKLQkJfQotCQlzdXBlci5hZGRJdGVtTGlzdGVuZXIobCk7Ci0JfQotCi0JLyoqCi0JICogRXh0ZW5kIHRvIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUl0ZW1MaXN0ZW5lcihJdGVtTGlzdGVuZXIgbCkgewotCQlzdXBlci5yZW1vdmVJdGVtTGlzdGVuZXIobCk7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsKLQkJCXRoaXMuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVDaGFuZ2VMaXN0ZW5lcihDaGFuZ2VMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb0xpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBoYXZlIG5vIGxpc3RlbmVycyBhdCBhbGwuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckNvdW50KCkgPT0gMDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIElmIGl0IGlzIG51bGwsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZSAod2hpY2ggaXMgdHlwaWNhbGx5IGZhbHNlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3RlZChCb29sZWFuIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFNlbGVjdGVkKHRoaXMuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRTZWxlY3RlZCh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgdW5kZXJseWluZyBtb2RlbCBoYXMgY2hhbmdlZCAtIHN5bmNocm9uaXplIGFjY29yZGluZ2x5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJvb2xlYW5DaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5zZXRTZWxlY3RlZCgoQm9vbGVhbikgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ib29sZWFuQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNldFNlbGVjdGVkKHRoaXMuYm9vbGVhbkhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJvb2xlYW5DaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5ib29sZWFuSG9sZGVyKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmMGZhZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUTGlzdENoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwubGlzdGVuZXIuYXd0LkFXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5hd3QuQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci0KLS8qKgotICogVGhpcyBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbCBjYW4gYmUgdXNlZCB0byBrZWVwIGEgVHJlZU1vZGVsTGlzdGVuZXIKLSAqIChlLmcuIGEgSlRyZWUpIGluIHN5bmNoIHdpdGggYSB0cmVlIG9mIFRyZWVOb2RlVmFsdWVNb2RlbCBvYmplY3RzLiBVbmxpa2UKLSAqIGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVNb2RlbCwgeW91IGRvIG5vdCBhZGQgYW5kIHJlbW92ZSBub2RlcyB3aXRoCi0gKiBtZXRob2RzIGltcGxlbWVudGVkIGhlcmUuIFlvdSBjYW4gYWRkIGFuZCByZW1vdmUgbm9kZXMgYnkgYWRkaW5nIGFuZAotICogcmVtb3ZpbmcgdGhlbSBkaXJlY3RseSB0by9mcm9tIHRoZSBub2RlcyAob3IsIG1vcmUgdHlwaWNhbGx5LCB0aGUgZG9tYWluCi0gKiBvYmplY3RzIHRoZSBub2RlcyBhcmUgd3JhcHBpbmcgYW5kIGxpc3RlbmluZyB0bykuCi0gKiAKLSAqIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKVHJlZSwgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgY2FuIG5ldmVyIGJlIG51bGwsCi0gKiB3aGljaCwgdHlwaWNhbGx5LCBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4gKElmIHlvdSB3YW50IHRvIGRpc3BsYXkgYW4gZW1wdHkKLSAqIHRyZWUgeW91IGNhbiBzZXQgdGhlIEpUcmVlJ3MgdHJlZU1vZGVsIHRvIG51bGwuKQotICovCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlcjxUPgotCWV4dGVuZHMgQWJzdHJhY3RUcmVlTW9kZWwKLXsKLQkvKioKLQkgKiBBIHZhbHVlIG1vZGVsIG9uIHRoZSB1bmRlcmx5aW5nIHRyZWUncyByb290IG5vZGUgYW5kIGl0cwotCSAqIGNvcnJlc3BvbmRpbmcgbGlzdGVuZXIuIFRoaXMgYWxsb3dzIGNsaWVudHMgdG8gc3dhcCBvdXQKLQkgKiB0aGUgZW50aXJlIHRyZWUuIER1ZSB0byBsaW1pdGF0aW9ucyBpbiBKVHJlZSwgdGhlIHJvb3Qgc2hvdWxkCi0JICogbmV2ZXIgYmUgc2V0IHRvIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiByb290SG9sZGVyOwotCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciByb290TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBBIGxpc3RlbmVyIHRoYXQgbm90aWZpZXMgdXMgd2hlbiBhIG5vZGUncyBpbnRlcm5hbAotCSAqICJzdGF0ZSIgY2hhbmdlcyAoYXMgb3Bwb3NlZCB0byB0aGUgbm9kZSdzIHZhbHVlIG9yIGxpc3Qgb2YKLQkgKiBjaGlsZHJlbiksIGFsbG93aW5nIHVzIHRvIGZvcndhcmQgbm90aWZpY2F0aW9uIHRvIG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdGF0ZUNoYW5nZUxpc3RlbmVyIG5vZGVTdGF0ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYSBub2RlJ3MgInZhbHVlIgotCSAqIGNoYW5nZXMgKGFzIG9wcG9zZWQgdG8gdGhlIG5vZGUncyBzdGF0ZSBvciBsaXN0IG9mCi0JICogY2hpbGRyZW4pLCBhbGxvd2luZyB1cyB0byBmb3J3YXJkIG5vdGlmaWNhdGlvbiB0byBvdXIgbGlzdGVuZXJzLgotCSAqIFR5cGljYWxseSwgdGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdpdGggbm9kZXMgdGhhdCBob2xkCi0JICogcHJpbWl0aXZlIGRhdGEuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIG5vZGVWYWx1ZUxpc3RlbmVyOwotCi0JLyoqCi0JICogQSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gYW4gdW5kZXJseWluZyBub2RlJ3MKLQkgKiAibGlzdCIgb2YgY2hpbGRyZW4gY2hhbmdlcywgYWxsb3dpbmcgdXMgdG8ga2VlcCBvdXIKLQkgKiBpbnRlcm5hbCB0cmVlIGluIHN5bmNoIHdpdGggdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIExpc3RDaGFuZ2VMaXN0ZW5lciBjaGlsZHJlbkxpc3RlbmVyOwotCi0JLyogdGhlc2UgYXR0cmlidXRlcyBtYWtlIHVwIG91ciBpbnRlcm5hbCB0cmVlICovCi0JLyoqCi0JICogVGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMsIHdoaWNoIGlzCi0JICogbW9zdCBvZiB0aGUgdGltZS4gVGhlIHJvb3QgaXMgY2FjaGVkIHNvIHdlIGNhbiBkaXNlbmdhZ2UKLQkgKiBmcm9tIGl0IHdoZW4gaXQgaGFzIGJlZW4gc3dhcHBlZCBvdXQuCi0JICovCi0JcHJpdmF0ZSBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcm9vdDsKLQotCS8qKgotCSAqIE1hcCB0aGUgbm9kZXMgdG8gdGhlaXIgbGlzdHMgb2YgY2hpbGRyZW4uCi0JICogV2UgY2FjaGUgdGhlc2Ugc28gd2UgY2FuIHN3YXAgb3V0IHRoZSBlbnRpcmUgbGlzdCBvZiBjaGlsZHJlbgotCSAqIHdoZW4gd2UgcmVjZWl2ZSBhICNsaXN0Q2hhbmdlZCgpIGV2ZW50ICh3aGljaCBkb2VzIG5vdCBpbmNsdWRlCi0JICogdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZmZlY3RlZCkuCi0JICogQHNlZSBFdmVudENoYW5nZVBvbGljeSNyZWJ1aWxkQ2hpbGRyZW4oKQotCSAqLwotCWZpbmFsIElkZW50aXR5SGFzaE1hcDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4sIExpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+Pj4gY2hpbGRyZW5MaXN0czsKLQotCS8qKgotCSAqIE1hcCB0aGUgY2hpbGRyZW4gbW9kZWxzIHRvIHRoZWlyIHBhcmVudHMuCi0JICogV2UgY2FjaGUgdGhlc2Ugc28gd2UgY2FuIGZpZ3VyZSBvdXQgdGhlICJyZWFsIiBzb3VyY2Ugb2YgdGhlCi0JICogbGlzdCBjaGFuZ2UgZXZlbnRzICh0aGUgcGFyZW50KS4KLQkgKiBAc2VlIEV2ZW50Q2hhbmdlUG9saWN5I3BhcmVudCgpCi0JICovCi0JZmluYWwgSWRlbnRpdHlIYXNoTWFwPExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4sIFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gcGFyZW50czsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCByb290LgotCSAqLwotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHJvb3RIb2xkZXIpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKHJvb3RIb2xkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5yb290SG9sZGVyID0gcm9vdEhvbGRlcjsKLQkJdGhpcy5yb290TGlzdGVuZXIgPSB0aGlzLmJ1aWxkUm9vdExpc3RlbmVyKCk7Ci0JCXRoaXMubm9kZVN0YXRlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKTsKLQkJdGhpcy5ub2RlVmFsdWVMaXN0ZW5lciA9IHRoaXMuYnVpbGROb2RlVmFsdWVMaXN0ZW5lcigpOwotCQl0aGlzLmNoaWxkcmVuTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2hpbGRyZW5MaXN0ZW5lcigpOwotCQl0aGlzLmNoaWxkcmVuTGlzdHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPFRyZWVOb2RlVmFsdWVNb2RlbDxUPiwgTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+PigpOwotCQl0aGlzLnBhcmVudHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4sIFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIG1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIHJvb3QuCi0JICovCi0JcHVibGljIFRyZWVNb2RlbEFkYXB0ZXIoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHJvb3QpIHsKLQkJdGhpcyhuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4ocm9vdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkUm9vdExpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFJvb3RMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJvb3RDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJyb290IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVZhbHVlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVWYWx1ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHZhbHVlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVN0YXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQVdUU3RhdGVDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVTdGF0ZUxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBTdGF0ZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5ub2RlQ2hhbmdlZCgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJub2RlIHN0YXRlIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFXVExpc3RDaGFuZ2VMaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENoaWxkcmVuTGlzdGVuZXJfKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRDaGlsZHJlbkxpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJCW5ldyBBZGRFdmVudENoYW5nZVBvbGljeShldmVudCkuYWRkQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgUmVtb3ZlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgUmVwbGFjZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZXBsYWNlQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJCW5ldyBNb3ZlRXZlbnRDaGFuZ2VQb2xpY3koZXZlbnQpLm1vdmVDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQluZXcgQ2xlYXJFdmVudENoYW5nZVBvbGljeShldmVudCkuY2xlYXJDaGlsZHJlbigpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJbmV3IENoYW5nZUV2ZW50Q2hhbmdlUG9saWN5KGV2ZW50KS5yZWJ1aWxkQ2hpbGRyZW4oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImNoaWxkcmVuIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUcmVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGQoT2JqZWN0IHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5jaGlsZChpbmRleCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRDaGlsZENvdW50KE9iamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuICgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXJlbnQpLmNoaWxkcmVuU2l6ZSgpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBib29sZWFuIGlzTGVhZihPYmplY3Qgbm9kZSkgewotCQlyZXR1cm4gKChUcmVlTm9kZVZhbHVlTW9kZWw8VD4pIG5vZGUpLmlzTGVhZigpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyB2b2lkIHZhbHVlRm9yUGF0aENoYW5nZWQoVHJlZVBhdGggcGF0aCwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCSgoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+KSBwYXRoLmdldExhc3RQYXRoQ29tcG9uZW50KCkpLnNldFZhbHVlKChUKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIGludCBnZXRJbmRleE9mQ2hpbGQoT2JqZWN0IHBhcmVudCwgT2JqZWN0IGNoaWxkKSB7Ci0JCXJldHVybiAoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgcGFyZW50KS5pbmRleE9mQ2hpbGQoKFRyZWVOb2RlVmFsdWVNb2RlbDxUPikgY2hpbGQpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdGFydCBsaXN0ZW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgbW9kZWwgaWYgbmVjZXNzYXJ5LgotCSAqLwotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFRyZWVNb2RlbExpc3RlbmVyKFRyZWVNb2RlbExpc3RlbmVyIGwpIHsKLQkJaWYgKHRoaXMuaGFzTm9UcmVlTW9kZWxMaXN0ZW5lcnMoKSkgewotCQkJdGhpcy5lbmdhZ2VNb2RlbCgpOwotCQl9Ci0JCXN1cGVyLmFkZFRyZWVNb2RlbExpc3RlbmVyKGwpOwotCX0KLQotCS8qKgotCSAqIEV4dGVuZCB0byBzdG9wIGxpc3RlbmluZyB0byB0aGUgdW5kZXJseWluZyBtb2RlbCBpZiBhcHByb3ByaWF0ZS4KLQkgKi8KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVUcmVlTW9kZWxMaXN0ZW5lcihUcmVlTW9kZWxMaXN0ZW5lciBsKSB7Ci0JCXN1cGVyLnJlbW92ZVRyZWVNb2RlbExpc3RlbmVyKGwpOwotCQlpZiAodGhpcy5oYXNOb1RyZWVNb2RlbExpc3RlbmVycygpKSB7Ci0JCQl0aGlzLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyIG5vZGVzCi0JICogaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucm9vdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5yb290TGlzdGVuZXIpOwotCQl0aGlzLnJvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKHRoaXMucm9vdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsJLy8gdGhlIHJvb3QgY2Fubm90IGJlIG51bGwgd2hpbGUgd2UgaGF2ZSBsaXN0ZW5lcnMKLQkJfQotCQl0aGlzLmVuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5hZGRSb290KCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIHRvIHRoZSB1bmRlcmx5aW5nIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJvb3QoKSB7Ci0JCXRoaXMuYWRkTm9kZSgwLCB0aGlzLnJvb3QpOwotCX0KLQotCS8qKgotCSAqIFN0b3AgbGlzdGVuaW5nIHRvIHRoZSByb290IGFuZCBhbGwgdGhlIG90aGVyCi0JICogbm9kZXMgaW4gdGhlIHVuZGVybHlpbmcgdHJlZSBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCXRoaXMucmVtb3ZlUm9vdCgpOwotCQl0aGlzLmRpc2VuZ2FnZU5vZGUodGhpcy5yb290KTsKLQkJdGhpcy5yb290ID0gbnVsbDsKLQkJdGhpcy5yb290SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnJvb3RMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSByb290IGFuZCBhbGwgb2YgdGhlIG5vZGVzIGZyb20gdGhlIHVuZGVybHlpbmcgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUm9vdCgpIHsKLQkJdGhpcy5yZW1vdmVOb2RlKDAsIHRoaXMucm9vdCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJvb3QgaGFzIGJlZW4gc3dhcHBlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBhIGJpdCBnbmFybHkgYmVjYXVzZSB0aGUgQVBJIGZvciBub3RpZnlpbmcgbGlzdGVuZXJzCi0JICogdGhhdCB0aGUgcm9vdCBoYXMgY2hhbmdlZCBpcyBhIGJpdCBpbmNvbnNpc3RlbnQgd2l0aCB0aGF0IHVzZWQgZm9yCi0JICogbm9uLXJvb3Qgbm9kZXMuCi0JICovCi0Jdm9pZCByb290Q2hhbmdlZCgpIHsKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5ld1Jvb3QgPSB0aGlzLnJvb3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJaWYgKG5ld1Jvb3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CS8vIHRoZSByb290IGNhbm5vdCBiZSBudWxsIHdoaWxlIHdlIGhhdmUgbGlzdGVuZXJzCi0JCX0KLQkJLy8gcmVtb3ZlIGFsbCB0aGUgY3VycmVudCByb290J3MgY2hpbGRyZW4gZnJvbSB0aGUgdHJlZQotCQkvLyBhbmQgcmVtb3ZlIHRoZSBpdCBmcm9tIHRoZSBpbnRlcm5hbCB0cmVlCi0JCXRoaXMucmVtb3ZlUm9vdCgpOyAKLQotCQkvLyBzYXZlIHRoZSBvbGQgcm9vdCBhbmQgc3dhcCBpbiB0aGUgbmV3IHJvb3QKLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG9sZFJvb3QgPSB0aGlzLnJvb3Q7Ci0JCXRoaXMucm9vdCA9IG5ld1Jvb3Q7Ci0KLQkJLy8gd2UgbXVzdCBiZSBsaXN0ZW5pbmcgdG8gYm90aCB0aGUgb2xkIGFuZCBuZXcgcm9vdHMgd2hlbiB3ZSBmaXJlIHRoZSBldmVudAotCQkvLyBiZWNhdXNlIHRoZWlyIHZhbHVlcyBjYW4gYmUgYWZmZWN0ZWQgYnkgd2hldGhlciB0aGV5IGhhdmUgbGlzdGVuZXJzCi0JCXRoaXMuZW5nYWdlTm9kZSh0aGlzLnJvb3QpOwotCQl0aGlzLmZpcmVUcmVlUm9vdFJlcGxhY2VkKHRoaXMucm9vdCk7Ci0JCS8vIG5vdyB3ZSBjYW4gc3RvcCBsaXN0ZW5pbmcgdG8gdGhlIG9sZCByb290Ci0JCXRoaXMuZGlzZW5nYWdlTm9kZShvbGRSb290KTsKLQotCQkvLyBhZGQgdGhlIG5ldyByb290IHRvIHRoZSBpbnRlcm5hbCB0cmVlIGFuZAotCQkvLyBhZGQgYWxsIGl0cyBjaGlsZHJlbiB0byB0aGUgdHJlZSBhbHNvCi0JCXRoaXMuYWRkUm9vdCgpOwotCX0KLQotCS8qKgotCSAqIEVpdGhlciB0aGUgInZhbHVlIiBvciB0aGUgInN0YXRlIiBvZiB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGNoYW5nZWQsCi0JICogZm9yd2FyZCBub3RpZmljYXRpb24gdG8gb3VyIGxpc3RlbmVycy4KLQkgKi8KLQl2b2lkIG5vZGVDaGFuZ2VkKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSBub2RlLnBhcmVudCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXRoaXMuZmlyZVRyZWVSb290Q2hhbmdlZChub2RlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZmlyZVRyZWVOb2RlQ2hhbmdlZChwYXJlbnQucGF0aCgpLCBwYXJlbnQuaW5kZXhPZkNoaWxkKG5vZGUpLCBub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbiB0byB0aGUgbm9kZXMsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlIG5vZGVzIHdlcmUgYWRkZWQsCi0JICogYW5kIHRoZW4gYWRkIHRoZSBub2RlcyB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgYmVmb3JlIG5vdGlmeWluZyBhbnlib2R5LCBiZWNhdXNlCi0JICogYWRkaW5nIGEgbGlzdGVuZXIgY2FuIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBub2RlLgotCSAqLwotCXZvaWQgYWRkQ2hpbGRyZW4oVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGF0aCwgaW50W10gY2hpbGRJbmRpY2VzLCBUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBjaGlsZHJlbikgewotCQlpbnQgbGVuID0gY2hpbGRJbmRpY2VzLmxlbmd0aDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5lbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCQl0aGlzLmZpcmVUcmVlTm9kZXNJbnNlcnRlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5hZGROb2RlKGNoaWxkSW5kaWNlc1tpXSwgY2hpbGRyZW5baV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVuIHRvIHRoZSBub2RlIGFuZCBpdHMgY2hpbGRyZW4gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZU5vZGUoVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUpIHsKLQkJbm9kZS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMubm9kZVN0YXRlTGlzdGVuZXIpOwotCQlub2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLm5vZGVWYWx1ZUxpc3RlbmVyKTsKLQkJbm9kZS5jaGlsZHJlbk1vZGVsKCkuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmNoaWxkcmVuTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlY3Vyc2UgZG93biB0aHJvdWdoIHRoZSBub2RlJ3MgY2hpbGRyZW4sCi0JICogYWRkaW5nIHRoZW0gdG8gdGhlIGludGVybmFsIHRyZWUgYWxzby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCXRoaXMuYWRkTm9kZVRvSW50ZXJuYWxUcmVlKG5vZGUucGFyZW50KCksIGluZGV4LCBub2RlLCBub2RlLmNoaWxkcmVuTW9kZWwoKSk7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLmFkZENoaWxkcmVuKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbm9kZSB0byBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkTm9kZVRvSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IG5vZGUsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5Nb2RlbCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gc2libGluZ3MgPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCWlmIChzaWJsaW5ncyA9PSBudWxsKSB7Ci0JCQlzaWJsaW5ncyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PigpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChwYXJlbnQsIHNpYmxpbmdzKTsKLQkJfQotCQlzaWJsaW5ncy5hZGQoaW5kZXgsIG5vZGUpOwotCi0JCXRoaXMucGFyZW50cy5wdXQoY2hpbGRyZW5Nb2RlbCwgbm9kZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIG5vZGVzIGZyb20gb3VyIGludGVybmFsIHRyZWUsIG5vdGlmeSBvdXIgbGlzdGVuZXJzIHRoYXQgdGhlCi0JICogbm9kZXMgd2VyZSByZW1vdmVkLCB0aGVuIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2Rlcy4KLQkgKiBXZSBtdXN0IGxpc3RlbiB0byB0aGUgbm9kZXMgdW50aWwgYWZ0ZXIgbm90aWZ5aW5nIGFueWJvZHksIGJlY2F1c2UKLQkgKiByZW1vdmluZyBhIGxpc3RlbmVyIGNhbiBjaGFuZ2UgdGhlIHZhbHVlIG9mIGEgbm9kZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoaWxkcmVuKFRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgsIGludFtdIGNoaWxkSW5kaWNlcywgVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRyZW4pIHsKLQkJaW50IGxlbiA9IGNoaWxkSW5kaWNlcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCS8vIHRoZSBpbmRpY2VzIHNsaWRlIGRvd24gYSBub3RjaCBlYWNoIHRpbWUgd2UgcmVtb3ZlIGEgY2hpbGQKLQkJCXRoaXMucmVtb3ZlTm9kZShjaGlsZEluZGljZXNbaV0gLSBpLCBjaGlsZHJlbltpXSk7Ci0JCX0KLQkJdGhpcy5maXJlVHJlZU5vZGVzUmVtb3ZlZChwYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkcmVuKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJdGhpcy5kaXNlbmdhZ2VOb2RlKGNoaWxkcmVuW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEZpcnN0LCByZWN1cnNlIGRvd24gdGhyb3VnaCB0aGUgbm9kZSdzIGNoaWxkcmVuLAotCSAqIHJlbW92aW5nIHRoZW0gZnJvbSBvdXIgaW50ZXJuYWwgdHJlZTsKLQkgKiB0aGVuIHJlbW92ZSB0aGUgbm9kZSBpdHNlbGYgZnJvbSBvdXIgaW50ZXJuYWwgdHJlZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTm9kZShpbnQgaW5kZXgsIFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5ldyBOb2RlQ2hhbmdlUG9saWN5KG5vZGUpLnJlbW92ZUNoaWxkcmVuKCk7Ci0JCXRoaXMucmVtb3ZlTm9kZUZyb21JbnRlcm5hbFRyZWUobm9kZS5wYXJlbnQoKSwgaW5kZXgsIG5vZGUuY2hpbGRyZW5Nb2RlbCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gb3VyIGludGVybmFsIHRyZWUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGVGcm9tSW50ZXJuYWxUcmVlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQsIGludCBpbmRleCwgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbk1vZGVsKSB7Ci0JCXRoaXMucGFyZW50cy5yZW1vdmUoY2hpbGRyZW5Nb2RlbCk7Ci0KLQkJTGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IHNpYmxpbmdzID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQlzaWJsaW5ncy5yZW1vdmUoaW5kZXgpOwotCQlpZiAoc2libGluZ3MuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucmVtb3ZlKHBhcmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgbm9kZSBhbmQgaXRzIGNoaWxkcmVuIG1vZGVsLgotCSAqLwotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VOb2RlKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCW5vZGUuY2hpbGRyZW5Nb2RlbCgpLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5jaGlsZHJlbkxpc3RlbmVyKTsKLQkJbm9kZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ub2RlVmFsdWVMaXN0ZW5lcik7Ci0JCW5vZGUucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLm5vZGVTdGF0ZUxpc3RlbmVyKTsKLQl9Ci0KLQl2b2lkIG1vdmVDaGlsZHJlbihUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50LCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCwgaW50IGxlbmd0aCkgewotCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQlBcnJheUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiB0ZW1wID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KGxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXRlbXAuYWRkKGNoaWxkcmVuTGlzdC5yZW1vdmUoc291cmNlSW5kZXgpKTsKLQkJfQotCQljaGlsZHJlbkxpc3QuYWRkQWxsKHRhcmdldEluZGV4LCB0ZW1wKTsKLQotCQl0aGlzLmZpcmVUcmVlU3RydWN0dXJlQ2hhbmdlZChwYXJlbnQucGF0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLnJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvYWxlc2NlIHNvbWUgb2YgdGhlIGNvbW1vbiBjaGFuZ2UgcG9saWN5IGJlaGF2aW9yLgotCSAqLwotCWFic3RyYWN0IGNsYXNzIENoYW5nZVBvbGljeSB7Ci0KLQkJQ2hhbmdlUG9saWN5KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIGN1cnJlbnQgc2V0IG9mIGNoaWxkcmVuLgotCQkgKi8KLQkJdm9pZCBhZGRDaGlsZHJlbigpIHsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbih0aGlzLnBhcmVudCgpLnBhdGgoKSwgdGhpcy5jaGlsZEluZGljZXMoKSwgdGhpcy5jaGlsZEFycmF5KCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQl2b2lkIHJlbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHRoaXMucGFyZW50KCkucGF0aCgpLCB0aGlzLmNoaWxkSW5kaWNlcygpLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBpbmRpY2VzIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbiwKLQkJICogd2hpY2ggc2hvdWxkIGJlIGNvbnRpZ3VvdXMuCi0JCSAqLwotCQlpbnRbXSBjaGlsZEluZGljZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEluZGljZXModGhpcy5jaGlsZHJlblN0YXJ0SW5kZXgoKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZEFycmF5KHRoaXMuZ2V0Q2hpbGRyZW4oKSwgdGhpcy5jaGlsZHJlblNpemUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGQgYW4gYXJyYXkgdG8gaG9sZCB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBpdGVyYXRvci4KLQkJICogSWYgdGhleSBhcmUgZGlmZmVyZW50IHNpemVzLCBzb21ldGhpbmcgaXMgc2NyZXdlZCB1cC4uLgotCQkgKi8KLQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gYnVpbGRBcnJheShJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGVsZW1lbnRzLCBpbnQgc2l6ZSkgewotCQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBhcnJheSA9IG5ldyBUcmVlTm9kZVZhbHVlTW9kZWxbc2l6ZV07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBlbGVtZW50IDogZWxlbWVudHMpIHsKLQkJCQlhcnJheVtpKytdID0gZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gYSBzZXQgb2YgaW5kaWNlcywgc3RhcnRpbmcgYXQgemVybyBhbmQKLQkJICogY29udGludWluZyBmb3IgdGhlIHNwZWNpZmllZCBzaXplLgotCQkgKi8KLQkJaW50W10gYnVpbGRJbmRpY2VzKGludCBzaXplKSB7Ci0JCQlyZXR1cm4gYnVpbGRJbmRpY2VzKDAsIHNpemUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIHNldCBvZiBpbmRpY2VzLCBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGFuZAotCQkgKiBjb250aW51aW5nIGZvciB0aGUgc3BlY2lmaWVkIHNpemUuCi0JCSAqLwotCQlpbnRbXSBidWlsZEluZGljZXMoaW50IHN0YXJ0LCBpbnQgc2l6ZSkgewotCQkJaW50W10gaW5kaWNlcyA9IG5ldyBpbnRbc2l6ZV07Ci0JCQlpbnQgaW5kZXggPSBzdGFydDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJaW5kaWNlc1tpXSA9IGluZGV4Kys7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5kaWNlczsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBzZXQgb2YgY2hpbGRyZW4uCi0JCSAqLwotCQlhYnN0cmFjdCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc3RhcnRpbmcgaW5kZXggZm9yIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblN0YXJ0SW5kZXgoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IGludCBjaGlsZHJlblNpemUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjdXJyZW50IHNldCBvZiBjaGlsZHJlbi4KLQkJICovCi0JCWFic3RyYWN0IEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKTsKLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0RXZlbnQgZm9yIGFkZGluZywgcmVtb3ZpbmcsIHJlcGxhY2luZywKLQkgKiBhbmQgY2hhbmdpbmcgY2hpbGRyZW4uCi0JICovCi0JYWJzdHJhY3QgY2xhc3MgRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBDaGFuZ2VQb2xpY3kgewotCQlmaW5hbCBMaXN0RXZlbnQgZXZlbnQ7Ci0KLQkJRXZlbnRDaGFuZ2VQb2xpY3koTGlzdEV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1hcCB0aGUgTGlzdENoYW5nZUV2ZW50J3Mgc291cmNlIHRvIHRoZSBjb3JyZXNwb25kaW5nIHBhcmVudC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCkgewotCQkJcmV0dXJuIFRyZWVNb2RlbEFkYXB0ZXIudGhpcy5wYXJlbnRzLmdldCh0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RBZGRFdmVudCBmb3IgYWRkaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIEFkZEV2ZW50Q2hhbmdlUG9saWN5IGV4dGVuZHMgRXZlbnRDaGFuZ2VQb2xpY3kgewotCi0JCUFkZEV2ZW50Q2hhbmdlUG9saWN5KExpc3RBZGRFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0QWRkRXZlbnQgZ2V0RXZlbnQoKSB7Ci0JCQlyZXR1cm4gKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3Mgc2l6ZSBpcyB0aGUgY2hpbGRyZW4gc2l6ZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtc1NpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdEFkZEV2ZW50J3MgaXRlbXMgYXJlIHRoZSBjaGlsZHJlbi4KLQkJICovCi0JCUBPdmVycmlkZQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiAoSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PikgdGhpcy5nZXRFdmVudCgpLmdldEl0ZW1zKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0UmVtb3ZlRXZlbnQgZm9yIGFkZGluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBSZW1vdmVFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlSZW1vdmVFdmVudENoYW5nZVBvbGljeShMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdFJlbW92ZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIGl0ZW0gaW5kZXggaXMgdGhlIGNoaWxkcmVuIHN0YXJ0IGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFdmVudCgpLmdldEluZGV4KCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIHNpemUgaXMgdGhlIGNoaWxkcmVuIHNpemUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZW1vdmVFdmVudCdzIGl0ZW1zIGFyZSB0aGUgY2hpbGRyZW4uCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gZ2V0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gKEl0ZXJhYmxlPFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4pIHRoaXMuZ2V0RXZlbnQoKS5nZXRJdGVtcygpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdFJlcGxhY2VFdmVudCBmb3IgcmVwbGFjaW5nIGNoaWxkcmVuLgotCSAqLwotCWNsYXNzIFJlcGxhY2VFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlSZXBsYWNlRXZlbnRDaGFuZ2VQb2xpY3koTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJc3VwZXIoZXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0UmVwbGFjZUV2ZW50IGdldEV2ZW50KCkgewotCQkJcmV0dXJuIChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBMaXN0UmVwbGFjZUV2ZW50J3MgaXRlbSBpbmRleCBpcyB0aGUgY2hpbGRyZW4gc3RhcnQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SW5kZXgoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgTGlzdFJlcGxhY2VFdmVudCdzIHNpemUgaXMgdGhlIGNoaWxkcmVuIHNpemUuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIExpc3RSZXBsYWNlRXZlbnQncyBpdGVtcyBhcmUgdGhlIGNoaWxkcmVuLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0TmV3SXRlbXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIG9sZCBub2RlcyBhbmQgYWRkIHRoZSBuZXcgb25lcy4KLQkJICovCi0JCXZvaWQgcmVwbGFjZUNoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHRoaXMucGFyZW50KCkucGF0aCgpOwotCQkJaW50W10gY2hpbGRJbmRpY2VzID0gdGhpcy5jaGlsZEluZGljZXMoKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIHRoaXMuZ2V0T2xkQ2hpbGRyZW4oKSk7Ci0JCQlUcmVlTW9kZWxBZGFwdGVyLnRoaXMuYWRkQ2hpbGRyZW4ocGFyZW50UGF0aCwgY2hpbGRJbmRpY2VzLCB0aGlzLmNoaWxkQXJyYXkoKSk7Ci0JCX0KLQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBnZXRPbGRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkQXJyYXkodGhpcy5nZXRPbGRJdGVtcygpLCB0aGlzLmdldEV2ZW50KCkuZ2V0SXRlbXNTaXplKCkpOwotCQl9Ci0KLQkJLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldE9sZEl0ZW1zKCkgewotCQkJcmV0dXJuIChJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+KSB0aGlzLmdldEV2ZW50KCkuZ2V0T2xkSXRlbXMoKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBXcmFwcyBhIExpc3RNb3ZlRXZlbnQgZm9yIG1vdmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBNb3ZlRXZlbnRDaGFuZ2VQb2xpY3kgZXh0ZW5kcyBFdmVudENoYW5nZVBvbGljeSB7Ci0KLQkJTW92ZUV2ZW50Q2hhbmdlUG9saWN5KExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCXByaXZhdGUgTGlzdE1vdmVFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiAoTGlzdE1vdmVFdmVudCkgdGhpcy5ldmVudDsKLQkJfQotCi0JCXZvaWQgbW92ZUNoaWxkcmVuKCkgewotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLm1vdmVDaGlsZHJlbih0aGlzLnBhcmVudCgpLCB0aGlzLmdldEV2ZW50KCkuZ2V0VGFyZ2V0SW5kZXgoKSwgdGhpcy5nZXRFdmVudCgpLmdldFNvdXJjZUluZGV4KCksIHRoaXMuZ2V0RXZlbnQoKS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJaW50IGNoaWxkcmVuU3RhcnRJbmRleCgpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCX0KLQotCi0JLyoqCi0JICogV3JhcHMgYSBMaXN0Q2xlYXJFdmVudCBmb3IgY2xlYXJpbmcgY2hpbGRyZW4uCi0JICovCi0JY2xhc3MgQ2xlYXJFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlDbGVhckV2ZW50Q2hhbmdlUG9saWN5KExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlcihldmVudCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2xlYXIgYWxsIHRoZSBub2Rlcy4KLQkJICovCi0JCXZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPiBwYXJlbnQgPSB0aGlzLnBhcmVudCgpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gcGFyZW50UGF0aCA9IHBhcmVudC5wYXRoKCk7Ci0JCQlMaXN0PFRyZWVOb2RlVmFsdWVNb2RlbDxUPj4gY2hpbGRyZW5MaXN0ID0gVHJlZU1vZGVsQWRhcHRlci50aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KHBhcmVudCk7Ci0JCQlpbnRbXSBjaGlsZEluZGljZXMgPSB0aGlzLmJ1aWxkSW5kaWNlcyhjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIGNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkoY2hpbGRyZW5MaXN0LCBjaGlsZHJlbkxpc3Quc2l6ZSgpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5yZW1vdmVDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkQXJyYXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgTGlzdENoYW5nZUV2ZW50IGZvciBjbGVhcmluZyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBDaGFuZ2VFdmVudENoYW5nZVBvbGljeSBleHRlbmRzIEV2ZW50Q2hhbmdlUG9saWN5IHsKLQotCQlDaGFuZ2VFdmVudENoYW5nZVBvbGljeShMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN1cGVyKGV2ZW50KTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgYWxsIHRoZSBvbGQgbm9kZXMgYW5kIGFkZCBhbGwgdGhlIG5ldyBub2Rlcy4KLQkJICovCi0JCXZvaWQgcmVidWlsZENoaWxkcmVuKCkgewotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCA9IHRoaXMucGFyZW50KCk7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD5bXSBwYXJlbnRQYXRoID0gcGFyZW50LnBhdGgoKTsKLQkJCUxpc3Q8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBjaGlsZHJlbkxpc3QgPSBUcmVlTW9kZWxBZGFwdGVyLnRoaXMuY2hpbGRyZW5MaXN0cy5nZXQocGFyZW50KTsKLQkJCWludFtdIGNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+W10gY2hpbGRBcnJheSA9IHRoaXMuYnVpbGRBcnJheShjaGlsZHJlbkxpc3QsIGNoaWxkcmVuTGlzdC5zaXplKCkpOwotCQkJVHJlZU1vZGVsQWRhcHRlci50aGlzLnJlbW92ZUNoaWxkcmVuKHBhcmVudFBhdGgsIGNoaWxkSW5kaWNlcywgY2hpbGRBcnJheSk7Ci0KLQkJCWNoaWxkSW5kaWNlcyA9IHRoaXMuYnVpbGRJbmRpY2VzKHBhcmVudC5jaGlsZHJlbk1vZGVsKCkuc2l6ZSgpKTsKLQkJCWNoaWxkQXJyYXkgPSB0aGlzLmJ1aWxkQXJyYXkocGFyZW50LmNoaWxkcmVuTW9kZWwoKSwgcGFyZW50LmNoaWxkcmVuU2l6ZSgpKTsKLQkJCVRyZWVNb2RlbEFkYXB0ZXIudGhpcy5hZGRDaGlsZHJlbihwYXJlbnRQYXRoLCBjaGlsZEluZGljZXMsIGNoaWxkQXJyYXkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblN0YXJ0SW5kZXgoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJSXRlcmFibGU8VHJlZU5vZGVWYWx1ZU1vZGVsPFQ+PiBnZXRDaGlsZHJlbigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFdyYXBzIGEgVHJlZU5vZGVWYWx1ZU1vZGVsIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGl0cyBjaGlsZHJlbi4KLQkgKi8KLQljbGFzcyBOb2RlQ2hhbmdlUG9saWN5IGV4dGVuZHMgQ2hhbmdlUG9saWN5IHsKLQkJcHJpdmF0ZSBmaW5hbCBUcmVlTm9kZVZhbHVlTW9kZWw8VD4gbm9kZTsKLQotCQlOb2RlQ2hhbmdlUG9saWN5KFRyZWVOb2RlVmFsdWVNb2RlbDxUPiBub2RlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5ub2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBUaGUgbm9kZSBpdHNlbGYgaXMgdGhlIHBhcmVudC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlUcmVlTm9kZVZhbHVlTW9kZWw8VD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMubm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBTaW5jZSB3ZSB3aWxsIGFsd2F5cyBiZSBkZWFsaW5nIHdpdGggYWxsIG9mIHRoZSBub2RlJ3MKLQkJICogY2hpbGRyZW4sIHRoZSBjaGlsZHJlbiBzdGFydCBpbmRleCBpcyBhbHdheXMgemVyby4KLQkJICovCi0JCUBPdmVycmlkZQotCQlpbnQgY2hpbGRyZW5TdGFydEluZGV4KCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKioKLQkJICogU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZGVhbGluZyB3aXRoIGFsbCBvZiB0aGUgbm9kZSdzCi0JCSAqIGNoaWxkcmVuLCB0aGUgY2hpbGRyZW4gc2l6ZSBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIHNpemUKLQkJICogb2YgdGhlIGNoaWxkcmVuIG1vZGVsLgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCWludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub2RlLmNoaWxkcmVuTW9kZWwoKS5zaXplKCk7Ci0JCX0KLQotCQkvKioKLQkJICogU2luY2Ugd2Ugd2lsbCBhbHdheXMgYmUgZGVhbGluZyB3aXRoIGFsbCBvZiB0aGUgbm9kZSdzCi0JCSAqIGNoaWxkcmVuLCB0aGUgY2hpbGRyZW4gYXJlIGFsbCB0aGUgb2JqZWN0cyBoZWxkIGJ5Ci0JCSAqIHRoZSBjaGlsZHJlbiBtb2RlbC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlJdGVyYWJsZTxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGdldENoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMubm9kZS5jaGlsZHJlbk1vZGVsKCk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvQWJzdHJhY3ROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzJhNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5Bc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIE5vZGUgY2xhc3Nlcy4KLSAqIFByb3ZpZGVzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6Ci0gKiAgICAgaW5pdGlhbGl6YXRpb24KLSAqICAgICBlbmZvcmNlZCBvYmplY3QgaWRlbnRpdHkgd3J0ICNlcXVhbHMoKS8jaGFzaENvZGUoKQotICogICAgIGNvbnRhaW5tZW50IGhpZXJhcmNoeSAocGFyZW50L2NoaWxkKQotICogICAgIHVzZXIgY29tbWVudAotICogICAgIGRpcnR5IGZsYWcKLSAqICAgICBwcm9ibGVtcwotICogICAgIHNvcnRpbmcKLSAqIAotICogVHlwaWNhbGx5LCBzdWJjbGFzc2VzIHNob3VsZCBjb25zaWRlciBpbXBsZW1lbnRpbmcgdGhlIGZvbGxvd2luZyBtZXRob2RzOgotICogICAgIHRoZSBhcHByb3ByaWF0ZSBjb25zdHJ1Y3RvcnMKLSAqICAgICAgICAgKHdpdGggdGhlIGFwcHJvcHJpYXRlbHktcmVzdHJpY3RpdmUgdHlwZSBkZWNsYXJhdGlvbiBmb3IgcGFyZW50KQotICogICAgICNpbml0aWFsaXplKCkKLSAqICAgICAjaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpCi0gKiAgICAgI2NoZWNrUGFyZW50KE5vZGUgcGFyZW50Tm9kZSkKLSAqICAgICAjYWRkQ2hpbGRyZW5UbyhMaXN0IGxpc3QpCi0gKiAgICAgI25vZGVSZW1vdmVkKE5vZGUpCi0gKiAgICAgI3ZhbGlkYXRvcigpCi0gKiAgICAgI3RyYW5zaWVudEFzcGVjdE5hbWVzKCkgb3IKLSAqICAgICAgICAgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0IHRyYW5zaWVudEFzcGVjdE5hbWVzKQotICogICAgICNhZGRQcm9ibGVtc1RvKExpc3QgY3VycmVudFByb2JsZW1zKQotICogICAgICNub25WYWxpZGF0ZWRBc3BlY3ROYW1lcygpCi0gKiAgICAgICAgICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykKLSAqICAgICAjZGlzcGxheVN0cmluZygpCi0gKiAgICAgI3RvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBOb2RlCi17Ci0KLQkvKiogQ29udGFpbm1lbnQgaGllcmFyY2h5LiAqLwotCXByaXZhdGUgTm9kZSBwYXJlbnQ7ICAvLyBwc2V1ZG8tZmluYWwKLQotCS8qKiBUcmFjayB3aGV0aGVyIHRoZSBub2RlIGhhcyBjaGFuZ2VkLiAqLwotCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBkaXJ0eTsKLQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gZGlydHlCcmFuY2g7Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSdzIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICovCi0JcHJpdmF0ZSBWZWN0b3I8UHJvYmxlbT4gcHJvYmxlbXM7CQkvLyBwc2V1ZG8tZmluYWwKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gRU1QVFlfUFJPQkxFTV9NRVNTQUdFX0FSR1VNRU5UUyA9IG5ldyBPYmplY3RbMF07Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zLCBhcyBjYWxjdWxhdGVkIGR1cmluZyB2YWxpZGF0aW9uLgotCSAqIFRoaXMgbGlzdCBzaG91bGQgb25seSBiZSBtb2RpZmllZCB2aWEgYSBQcm9ibGVtU3luY2hyb25pemVyLAotCSAqIGFsbG93aW5nIGZvciBhc3luY2hyb25vdXMgbW9kaWZpY2F0aW9uIGZyb20gYW5vdGhlciB0aHJlYWQuCi0JICogVGhpcyBtdXN0IGJlIHJlY2FsY3VsYXRlZCBldmVyeSB0aW1lIHRoaXMgbm9kZSBvciBvbmUgb2YgaXRzCi0JICogZGVzY2VuZGFudHMgY2hhbmdlcyBpdCBwcm9ibGVtcy4KLQkgKi8KLQlwcml2YXRlIFZlY3RvcjxQcm9ibGVtPiBicmFuY2hQcm9ibGVtczsJCS8vIHBzZXVkby1maW5hbAotCi0JLyoqIFVzZXIgY29tbWVudC4gKi8KLQlwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBjb21tZW50OwotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBmaWVsZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0cyBvZiB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLCBrZXllZCBieSBjbGFzcy4KLQkgKiBUaGlzIGlzIGJ1aWx0IHVwIGxhemlseSwgYXMgdGhlIG9iamVjdHMgYXJlIG1vZGlmaWVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4gdHJhbnNpZW50QXNwZWN0TmFtZVNldHMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3ROb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0JLyoqCi0JICogU2V0cyBvZiBub24tdmFsaWRhdGVkIGFzcGVjdCBuYW1lcywga2V5ZWQgYnkgY2xhc3MuCi0JICogVGhpcyBpcyBidWlsdCB1cCBsYXppbHksIGFzIHRoZSBvYmplY3RzIGFyZSBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdE5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0Tm9kZT4sIEhhc2hTZXQ8U3RyaW5nPj4oKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogTW9zdCBvYmplY3RzIG11c3QgaGF2ZSBhIHBhcmVudC4KLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBuZXcgbm9kZS4KLQkgKiBAc2VlICNpbml0aWFsaXplKE5vZGUpCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZShOb2RlIHBhcmVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEluaXRpYWxpemUgYSBuZXdseS1jcmVhdGVkIGluc3RhbmNlLgotCSAqIEBzZWUgI2luaXRpYWxpemUoTm9kZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmNvbW1lbnQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGEgbmV3IG9iamVjdCBpcyBkaXJ0eSwgYnkgZGVmaW5pdGlvbgotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5kaXJ0eUJyYW5jaCA9IHRydWU7Ci0KLQkJdGhpcy5wcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcyA9IG5ldyBWZWN0b3I8UHJvYmxlbT4oKTsKLQotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UuCi0JICogQHNlZSAjaW5pdGlhbGl6ZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnROb2RlKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnROb2RlOwotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5pbml0aWFsaXplKHBhcmVudE5vZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzcGVjdENoYW5nZVN1cHBvcnQuTGlzdGVuZXIgYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQXNwZWN0Q2hhbmdlU3VwcG9ydC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCQlBYnN0cmFjdE5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlcXVhbGl0eSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMgPT0gbzsKLQl9Ci0KLQkvKioKLQkgKiBFbmZvcmNlIG9iamVjdCBpZGVudGl0eSAtIGRvIG5vdCBhbGxvdyBvYmplY3RzIHRvIGJlIGVxdWFsIHVubGVzcwotCSAqIHRoZXkgYXJlIHRoZSBzYW1lIG9iamVjdC4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgLSB3ZSByZWx5IG9uIG9iamVjdCBpZGVudGl0eSBleHRlbnNpdmVseS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaHJvdyBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHBhcmVudCBpcyBub3QgdmFsaWQKLQkgKiBmb3IgdGhlIG5vZGUuCi0JICogQnkgZGVmYXVsdCByZXF1aXJlIGEgbm9uLW51bGwgcGFyZW50LiBPdmVycmlkZSBpZiBvdGhlciByZXN0cmljdGlvbnMgZXhpc3QKLQkgKiBvciB0aGUgcGFyZW50IHNob3VsZCBiZSBudWxsLgotCSAqIE5COiBSb290IG5vZGUgbW9kZWwgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHBhcmVudCBub2RlIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBEbyBOT1Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICogT3ZlcnJpZGUgI2FkZENoaWxkcmVuVG8oTGlzdCkuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKiBAc2VlICNhZGRDaGlsZHJlblRvKGphdmEudXRpbC5MaXN0KQotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYXRvcjxOb2RlPiBjaGlsZHJlbigpIHsKLQkJTGlzdDxOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKLQkJdGhpcy5hZGRDaGlsZHJlblRvKGNoaWxkcmVuKTsKLQkJcmV0dXJuIGNoaWxkcmVuLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWRkIHRoZWlyIGNoaWxkcmVuCi0JICogdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlblRvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PE5vZGU+IGxpc3QpIHsKLQkJLy8gdGhpcyBjbGFzcyBoYXMgbm8gY2hpbGRyZW4sIHN1YmNsYXNzZXMgd2lsbC4uLgotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGRDaGlsZHJlblRvKGxpc3QpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5J3Mgcm9vdCBub2RlLgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcm9vdC4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqIE5COiBBc3N1bWUgdGhlIHJvb3QgaGFzIG5vIHBhcmVudC4KLQkgKi8KLQlwdWJsaWMgTm9kZSByb290KCkgewotCQlOb2RlIHAgPSB0aGlzLnBhcmVudDsKLQkJcmV0dXJuIChwID09IG51bGwpID8gdGhpcyA6IHAucm9vdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZXNjZW5kYW50T2YoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAodGhpcyA9PSBub2RlKSB8fCB0aGlzLnBhcmVudElzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHBhcmVudElzRGVzY2VuZGFudE9mKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKHRoaXMucGFyZW50ICE9IG51bGwpICYmIHRoaXMucGFyZW50LmlzRGVzY2VuZGFudE9mKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvbGxlY3Rpb24gaG9sZGluZyBhbGwgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwKLQkgKiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzJyAicmVmZXJlbmNlcyIuICJSZWZlcmVuY2VzIiBhcmUKLQkgKiBvYmplY3RzIHRoYXQgYXJlICJyZWZlcmVuY2VkIiBieSBhbm90aGVyIG9iamVjdCwgYXMgb3Bwb3NlZAotCSAqIHRvICJvd25lZCIgYnkgYW5vdGhlciBvYmplY3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKCkgewotCQlDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzID0gbmV3IEFycmF5TGlzdDxOb2RlLlJlZmVyZW5jZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRCcmFuY2hSZWZlcmVuY2VzVG8oYnJhbmNoUmVmZXJlbmNlcyk7Ci0JCXJldHVybiBicmFuY2hSZWZlcmVuY2VzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRCcmFuY2hSZWZlcmVuY2VzVG8oQ29sbGVjdGlvbjxOb2RlLlJlZmVyZW5jZT4gYnJhbmNoUmVmZXJlbmNlcykgewotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJY2hpbGQuYWRkQnJhbmNoUmVmZXJlbmNlc1RvKGJyYW5jaFJlZmVyZW5jZXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLiBUaGUgbm9kZXMgd2lsbCBwcm9iYWJseSByZXR1cm5lZAotCSAqIGluICJkZXB0aC1maXJzdCIgb3JkZXIuCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvcjxOb2RlPiBhbGxOb2RlcygpIHsKLQkJQ29sbGVjdGlvbjxOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oMTAwMCk7CQkvLyBzdGFydCBiaWcKLQkJdGhpcy5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJcmV0dXJuIG5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEk/Ci0JICogQWRkIGFsbCB0aGUgbm9kZXMgaW4gdGhlIG9iamVjdCdzIGJyYW5jaCBvZiB0aGUgdHJlZSwKLQkgKiBpbmNsdWRpbmcgdGhlIG5vZGUgaXRzZWxmLCB0byB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24uCi0JICogT25seSByZWFsbHkgdXNlZCBmb3IgdGVzdGluZyBhbmQgZGVidWdnaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2RlcykgewotCQlub2Rlcy5hZGQodGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRBbGxOb2Rlc1RvKG5vZGVzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb2RlbCBzeW5jaHJvbml6YXRpb24gc3VwcG9ydCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFRoaXMgaXMgYSBnZW5lcmFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzcGVjaWZpZWQgbm9kZSBoYXMgYmVlbgotCSAqIHJlbW92ZWQgZnJvbSB0aGUgdHJlZS4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uCi0JICogc2hvdWxkIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSB1cGRhdGVzIHRvIHJlbWFpbiBpbiBzeW5jaAotCSAqIHdpdGggdGhlIHRyZWUgKGUuZy4gY2xlYXJpbmcgb3V0IG9yIHJlcGxhY2luZyBhbnkgcmVmZXJlbmNlcwotCSAqIHRvIHRoZSByZW1vdmVkIG5vZGUgb3IgYW55IG9mIHRoZSByZW1vdmVkIG5vZGUncyBkZXNjZW5kYW50cykuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW1vdmVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW1vdmVkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqIHJldHVybiB3aGV0aGVyIG5vZGUxIGlzIGEgZGVzY2VuZGFudCBvZiBub2RlMjsKLQkgKiBub2RlMSBjYW4gYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG5vZGVJc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUxLCBOb2RlIG5vZGUyKSB7Ci0JCXJldHVybiAobm9kZTEgIT0gbnVsbCkgJiYgbm9kZTEuaXNEZXNjZW5kYW50T2Yobm9kZTIpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVGhpcyBpcyBhIGdlbmVyYWwgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuCi0JICogcmVuYW1lZC4gVGhlIG5vZGUgcmVjZWl2aW5nIHRoaXMgbm90aWZpY2F0aW9uIHNob3VsZCBtYXJrIGl0cwotCSAqIGJyYW5jaCBkaXJ0eSBpZiBuZWNlc3NhcnkgKGkuZS4gaXQgcmVmZXJlbmNlcyB0aGUgcmVuYW1lZCBub2RlCi0JICogb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cykuIFRoaXMgbWV0aG9kIGlzIG9mIHBhcnRpY3VsYXIgY29uY2VybgotCSAqIHRvIEhhbmRsZXMuCi0JICogQHNlZSAjaXNEZXNjZW5kYW50T2YoTm9kZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUmVuYW1lZChOb2RlIG5vZGUpIHsKLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWNoaWxkLm5vZGVSZW5hbWVkKG5vZGUpOwotCQl9Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLm5vZGVSZW5hbWVkKG5vZGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHVzZXIgY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9iamVjdCdzIHVzZXIgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGNvbW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBvYmplY3QncyB1c2VyIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQlPYmplY3Qgb2xkID0gdGhpcy5jb21tZW50OwotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09NTUVOVF9QUk9QRVJUWSwgb2xkLCBjb21tZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2hhbmdlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogQW4gYXNwZWN0IG9mIHRoZSBub2RlIGhhcyBjaGFuZ2VkOgotCSAqIAktIGlmIGl0IGlzIGEgcGVyc2lzdGVudCBhc3BlY3QsIG1hcmsgdGhlIG9iamVjdCBkaXJ0eQotCSAqIAktIGlmIGl0IGlzIGEgc2lnbmlmaWNhbnQgYXNwZWN0LCB2YWxpZGF0ZSB0aGUgb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlpZiAodGhpcy5hc3BlY3RJc1BlcnNpc3RlbnQoYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBkaXJ0eSBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWUpOwotCQkJdGhpcy5tYXJrRGlydHkoKTsKLQkJfQotCQlpZiAodGhpcy5hc3BlY3RDaGFuZ2VSZXF1aXJlc1ZhbGlkYXRpb24oYXNwZWN0TmFtZSkpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiB2YWxpZGF0aW9uIGNoYW5nZTogIiArIHRoaXMgKyAiOiAiICsgYXNwZWN0TmFtZSk7Ci0JCQl0aGlzLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy5nZXRWYWxpZGF0b3IoKS52YWxpZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogUmV0dXJuIGEgdmFsaWRhdG9yIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW5ldmVyIGEKLQkgKiAidmFsaWRhdGVkIiBhc3BlY3Qgb2YgdGhlIG5vZGUgdHJlZSBjaGFuZ2VzLgotCSAqIFR5cGljYWxseSBvbmx5IHRoZSByb290IG5vZGUgZGlyZWN0bHkgaG9sZHMgYSB2YWxpZGF0b3IuCi0JICogTkI6IFJvb3Qgbm9kZSBtb2RlbCBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyBOb2RlLlZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIG5vZGUgc2hvdWxkIG5vdCBiZSBmaXJpbmcgY2hhbmdlIGV2ZW50cyBkdXJpbmcgaXRzIGNvbnN0cnVjdGlvbi4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRWYWxpZGF0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSB2YWxpZGF0b3IgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIgYQotCSAqICJ2YWxpZGF0ZWQiIGFzcGVjdCBvZiB0aGUgbm9kZSB0cmVlIGNoYW5nZXMuCi0JICogVHlwaWNhbGx5IG9ubHkgdGhlIHJvb3Qgbm9kZSBkaXJlY3RseSBob2xkcyBhIHZhbGlkYXRvci4KLQkgKiBOQjogUm9vdCBub2RlIG1vZGVsIGltcGxlbWVudGF0aW9ucyB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQlpZiAodGhpcy5wYXJlbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyByb290IG5vZGUgc2hvdWxkIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiT25seSByb290IG5vZGVzIGltcGxlbWVudCAjc2V0VmFsaWRhdG9yKE5vZGUuVmFsaWRhdG9yKS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXJ0eSBmbGFnIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvYmplY3Qgd2FzIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgY2hhbmdlcyB0byB0aGUgb2JqZWN0J3MgZGVzY2VuZGFudHMuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEaXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlydHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IHBlcnNpc3RlbnQgYXNwZWN0cyBvZiB0aGUgb2JqZWN0LAotCSAqIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMsIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RpcnR5QnJhbmNoKCkgewotCQlyZXR1cm4gdGhpcy5kaXJ0eUJyYW5jaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgb2JqZWN0IGlzIHVubW9kaWZpZWQKLQkgKiBzaW5jZSBpdCB3YXMgbGFzdCByZWFkIG9yIHNhdmVkLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSBjaGFuZ2VzIHRvIHRoZSBvYmplY3QncyBkZXNjZW5kYW50cy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMKLQkgKiBhcmUgdW5tb2RpZmllZCBzaW5jZSB0aGUgb2JqZWN0IGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NsZWFuQnJhbmNoKCkgewotCQlyZXR1cm4gISB0aGlzLmRpcnR5QnJhbmNoOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGlydHkgYnJhbmNoIGZsYWcgc2V0dGluZy4gVGhpcyBpcyBzZXQgdG8gdHJ1ZQotCSAqIHdoZW4gZWl0aGVyIHRoZSBvYmplY3Qgb3Igb25lIG9mIGl0cyBkZXNjZW5kYW50cyBiZWNvbWVzIGRpcnR5LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJc0RpcnR5QnJhbmNoKGJvb2xlYW4gZGlydHlCcmFuY2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRpcnR5QnJhbmNoOwotCQl0aGlzLmRpcnR5QnJhbmNoID0gZGlydHlCcmFuY2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVJUWV9CUkFOQ0hfUFJPUEVSVFksIG9sZCwgZGlydHlCcmFuY2gpOwotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhcyBkaXJ0eSBhbmQgYXMgYSBkaXJ0eSBicmFuY2guCi0JICogQW4gb2JqZWN0IGlzIG1hcmtlZCBkaXJ0eSB3aGVuIGVpdGhlciBhICJwZXJzaXN0ZW50IiBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCBvciBpdHMgc2F2ZSBsb2NhdGlvbiBoYXMgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbWFya0RpcnR5KCkgewotCQl0aGlzLmRpcnR5ID0gdHJ1ZTsKLQkJdGhpcy5tYXJrQnJhbmNoRGlydHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGl0cyBwYXJlbnQgYXMgZGlydHkgYnJhbmNoZXMuCi0JICogVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgZGlydHkuCi0JICovCi0JcHVibGljIHZvaWQgbWFya0JyYW5jaERpcnR5KCkgewotCQkvLyBzaG9ydC1jaXJjdWl0IGFueSB1bm5lY2Vzc2FyeSBwcm9wYWdhdGlvbgotCQlpZiAodGhpcy5kaXJ0eUJyYW5jaCkgewotCQkJLy8gaWYgdGhpcyBpcyBhbHJlYWR5IGEgZGlydHkgYnJhbmNoLCB0aGUgcGFyZW50IG11c3QgYmUgYWxzbwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5zZXRJc0RpcnR5QnJhbmNoKHRydWUpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hEaXJ0eSgpIHsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50Lm1hcmtCcmFuY2hEaXJ0eSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFyayB0aGUgb2JqZWN0IGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGRpcnR5LgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBzYXZlIGxvY2F0aW9uIG9mIHNvbWUKLQkgKiB0b3AtbGV2ZWwgb2JqZWN0IGlzIGNoYW5nZWQgYW5kIHRoZSBlbnRpcmUKLQkgKiBjb250YWlubWVudCB0cmVlIG11c3QgYmUgbWFya2VkIGRpcnR5IHNvIGl0Ci0JICogd2lsbCBiZSB3cml0dGVuIG91dC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBtYXJrRW50aXJlQnJhbmNoRGlydHkoKSB7Ci0JCXRoaXMubWFya0RpcnR5KCk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1hcmsgdGhlIG9iamVjdCBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBjbGVhbi4KLQkgKiBUaGVuIG5vdGlmeSB0aGUgb2JqZWN0J3MgcGFyZW50IHRoYXQgaXQgKHRoZSBwYXJlbnQpCi0JICogbWlnaHQgbm93IGJlIGEgY2xlYW4gYnJhbmNoIGFsc28uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgb2JqZWN0IGhhcyBqdXN0IGJlZW4KLQkgKiByZWFkIGluIG9yIHdyaXR0ZW4gb3V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIG1hcmtFbnRpcmVCcmFuY2hDbGVhbigpIHsKLQkJdGhpcy5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCXRoaXMubWFya1BhcmVudEJyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5tYXJrQnJhbmNoQ2xlYW5JZlBvc3NpYmxlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIE1hcmsgdGhlIG5vZGUgYW5kIGFsbCBpdHMgZGVzY2VuZGFudHMgYXMgY2xlYW4uCi0JICogVHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgbm9kZSBoYXMganVzdCBiZWVuCi0JICogcmVhZCBpbiBvciB3cml0dGVuIG91dC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqIE5vdCB0aGUgYmVzdCBvZiBtZXRob2QgbmFtZXMuLi4uIDotKAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKSB7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5jYXNjYWRlTWFya0VudGlyZUJyYW5jaENsZWFuKCk7Ci0JCX0KLQkJdGhpcy5kaXJ0eSA9IGZhbHNlOwotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQSBjaGlsZCBub2RlJ3MgYnJhbmNoIGhhcyBiZWVuIG1hcmtlZCBjbGVhbi4gSWYgdGhlIG5vZGUKLQkgKiBpdHNlbGYgaXMgY2xlYW4gYW5kIGlmIGFsbCBvZiBpdHMgY2hpbGRyZW4gYXJlIGFsc28gY2xlYW4sIHRoZQotCSAqIG5vZGUncyBicmFuY2ggY2FuIGJlIG1hcmtlZCBjbGVhbi4gVGhlbiwgaWYgdGhlIG5vZGUncwotCSAqIGJyYW5jaCBpcyBjbGVhbiwgdGhlIG5vZGUgd2lsbCBub3RpZnkgaXRzIHBhcmVudCB0aGF0IGl0IG1pZ2h0Ci0JICogYmUgY2xlYW4gYWxzby4gVGhpcyBtZXNzYWdlIGlzIHByb3BhZ2F0ZWQgdXAgdGhlIGNvbnRhaW5tZW50Ci0JICogdHJlZSB3aGVuIGEgcGFydGljdWxhciBub2RlIGJlY29tZXMgY2xlYW4uCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpIHsKLQkJLy8gc2hvcnQtY2lyY3VpdCBhbnkgdW5uZWNlc3NhcnkgcHJvcGFnYXRpb24KLQkJaWYgKHRoaXMuZGlydHkpIHsKLQkJCS8vIGlmIHRoZSBvYmplY3QgaXMgImxvY2FsbHkiIGRpcnR5LCBpdCBpcyBzdGlsbCBhIGRpcnR5IGJyYW5jaAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxOb2RlPiBzdHJlYW0gPSB0aGlzLmNoaWxkcmVuKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTm9kZSBjaGlsZCA9IHN0cmVhbS5uZXh0KCk7CQkvLyBwdWxsIG91dCB0aGUgY2hpbGQgdG8gZWFzZSBkZWJ1Z2dpbmcKLQkJCWlmIChjaGlsZC5pc0RpcnR5QnJhbmNoKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnNldElzRGlydHlCcmFuY2goZmFsc2UpOwotCQl0aGlzLm1hcmtQYXJlbnRCcmFuY2hDbGVhbklmUG9zc2libGUoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0SXNQZXJzaXN0ZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiAhIHRoaXMuYXNwZWN0SXNUcmFuc2llbnQoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdElzVHJhbnNpZW50KFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zaWVudEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyB0cmFuc2llbnQgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgdG8gYmUgbWFya2VkIGRpcnR5LgotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgdHJhbnNpZW50IGFzcGVjdHMsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgI2FkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0KS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAodHJhbnNpZW50QXNwZWN0TmFtZVNldHMpIHsKLQkJCUhhc2hTZXQ8U3RyaW5nPiB0cmFuc2llbnRBc3BlY3ROYW1lcyA9IHRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKHRyYW5zaWVudEFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQl0cmFuc2llbnRBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8odHJhbnNpZW50QXNwZWN0TmFtZXMpOwotCQkJCXRyYW5zaWVudEFzcGVjdE5hbWVTZXRzLnB1dCh0aGlzLmdldENsYXNzKCksIHRyYW5zaWVudEFzcGVjdE5hbWVzKTsKLQkJCX0KLQkJCXJldHVybiB0cmFuc2llbnRBc3BlY3ROYW1lczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgb2JqZWN0J3MgdHJhbnNpZW50IGFzcGVjdCBuYW1lcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIGFzcGVjdHMgdGhhdCwgd2hlbiB0aGV5IGNoYW5nZSwgd2lsbCBOT1QgY2F1c2UgdGhlCi0JICogb2JqZWN0IHRvIGJlIG1hcmtlZCBkaXJ0eS4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyIHRyYW5zaWVudCBhc3BlY3RzIGlzIHN1ZmZpY2llbnQsCi0JICogb3ZlcnJpZGUgdGhpcyBtZXRob2QuIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uLAotCSAqIG92ZXJyaWRlICN0cmFuc2llbnRBc3BlY3ROYW1lcygpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFRyYW5zaWVudEFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gdHJhbnNpZW50QXNwZWN0TmFtZXMpIHsKLQkJdHJhbnNpZW50QXNwZWN0TmFtZXMuYWRkKERJUlRZX0JSQU5DSF9QUk9QRVJUWSk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChCUkFOQ0hfUFJPQkxFTVNfTElTVCk7Ci0JCXRyYW5zaWVudEFzcGVjdE5hbWVzLmFkZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZKTsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkVHJhbnNpZW50QXNwZWN0TmFtZXNUbyh0cmFuc2llbnRBc3BlY3ROYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkaXJ0eSBub2RlcyBpbiB0aGUgb2JqZWN0J3MgYnJhbmNoIG9mIHRoZSB0cmVlLAotCSAqIGluY2x1ZGluZyB0aGUgbm9kZSBpdHNlbGYgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBPbmx5IHJlYWxseSB1c2VkIGZvciB0ZXN0aW5nIGFuZCBkZWJ1Z2dpbmcuCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPE5vZGU+IGFsbERpcnR5Tm9kZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8Tm9kZT4odGhpcy5hbGxOb2RlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChOb2RlIG5vZGUpIHsKLQkJCQlyZXR1cm4gKG5vZGUgaW5zdGFuY2VvZiBBYnN0cmFjdE5vZGUpICYmICgoQWJzdHJhY3ROb2RlKSBub2RlKS5pc0RpcnR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2JsZW1zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHByb2JsZW1zLgotCSAqIFRoaXMgZG9lcyBOT1QgaW5jbHVkZSB0aGUgcHJvYmxlbXMgb2YgdGhlIG5vZGUncyBkZXNjZW5kYW50cy4KLQkgKiBAc2VlICNicmFuY2hQcm9ibGVtcygpCi0JICovCi0JcHVibGljIGZpbmFsIEl0ZXJhdG9yPFByb2JsZW0+IHByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8UHJvYmxlbT4odGhpcy5wcm9ibGVtcyk7CS8vIHJlbW92ZXMgYXJlIG5vdCBhbGxvd2VkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub2RlJ3MgcHJvYmxlbXMuCi0JICogVGhpcyBkb2VzIE5PVCBpbmNsdWRlIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSdzIGRlc2NlbmRhbnRzLgotCSAqIEBzZWUgI2JyYW5jaFByb2JsZW1zU2l6ZSgpCi0JICovCi0JcHVibGljIGZpbmFsIGludCBwcm9ibGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2JsZW1zLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbm9kZSBoYXMgcHJvYmxlbXMKLQkgKiBUaGlzIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHByb2JsZW1zIG9mIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMuCi0JICogQHNlZSAjaGFzQnJhbmNoUHJvYmxlbXMoKQotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1Byb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLnByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBub2RlJ3MgcHJvYmxlbXMgYWxvbmcgd2l0aCBhbGwgdGhlCi0JICogbm9kZSdzIGRlc2NlbmRhbnRzJyBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwkvLyByZW1vdmVzIGFyZSBub3QgYWxsb3dlZAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgYnJhbmNoUHJvYmxlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cyBoYXZlIHByb2JsZW1zLgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCkgewotCQlyZXR1cm4gISB0aGlzLmJyYW5jaFByb2JsZW1zLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0JyYW5jaFByb2JsZW0oUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCXJldHVybiB0aGlzLmJyYW5jaFByb2JsZW1zLmNvbnRhaW5zKHByb2JsZW0pOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm9ibGVtIGJ1aWxkUHJvYmxlbShTdHJpbmcgbWVzc2FnZUtleSwgaW50IG1lc3NhZ2VUeXBlLCBPYmplY3QuLi4gbWVzc2FnZUFyZ3VtZW50cykgewotCQlyZXR1cm4gbmV3IERlZmF1bHRQcm9ibGVtKHRoaXMsIG1lc3NhZ2VLZXksIG1lc3NhZ2VUeXBlLCBtZXNzYWdlQXJndW1lbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJvYmxlbSBidWlsZFByb2JsZW0oU3RyaW5nIG1lc3NhZ2VLZXksIGludCBtZXNzYWdlVHlwZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByb2JsZW0obWVzc2FnZUtleSwgbWVzc2FnZVR5cGUsIEVNUFRZX1BST0JMRU1fTUVTU0FHRV9BUkdVTUVOVFMpOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGVCcmFuY2goKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKSkgewotCQkJLy8gaWYgb3VyICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwgdGhlbgotCQkJLy8gb3VyIHBhcmVudCBtdXN0IHJlYnVpbGQgaXRzICJicmFuY2giIHByb2JsZW1zIGFsc28KLQkJCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWJ1aWxkUGFyZW50QnJhbmNoUHJvYmxlbXMoKSB7Ci0JCWlmICh0aGlzLnBhcmVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhcmVudC5yZWJ1aWxkQnJhbmNoUHJvYmxlbXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGFsbCBvZiBpdHMgZGVzY2VuZGFudHMsCi0JICogYW5kIHVwZGF0ZSB0aGVpciBzZXRzIG9mICJicmFuY2giIHByb2JsZW1zLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpIHsKLQkJLy8gcmVidWlsZCAiYnJhbmNoIiBwcm9ibGVtcyBpbiBjaGlsZHJlbiBmaXJzdAotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gcmVidWlsZCBvdXIgImJyYW5jaCIKLQkJCS8vIHByb2JsZW1zIG5vIG1hdHRlciB3aGF0LCB0byBzZWUgaWYgdGhleSBoYXZlIGNoYW5nZWQKLQkJCWNoaWxkLnZhbGlkYXRlQnJhbmNoSW50ZXJuYWwoKTsKLQkJfQotCi0JCXRoaXMucHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5hZGRQcm9ibGVtc1RvKHRoaXMucHJvYmxlbXMpOwotCi0JCXJldHVybiB0aGlzLmNoZWNrQnJhbmNoUHJvYmxlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBmb3IgYW55IHByb2JsZW1zIGFuZCBhZGQgdGhlbSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIE9OTFkgYWRkIHByb2JsZW1zIGZvciB0aGlzIHBhcnRpY3VsYXIgbm9kZTsKLQkgKiBpdCBzaG91bGQgTk9UIGFkZCBwcm9ibGVtcyBmb3IgYW55IG9mIHRoaXMgbm9kZSdzIGRlc2NlbmRhbnRzCi0JICogb3IgYW5jZXN0b3JzLiAoQWx0aG91Z2ggdGhlcmUgd2lsbCBiZSB0aW1lcyB3aGVuIGl0IGlzIGRlYmF0YWJsZQotCSAqIGFzIHRvIHdoaWNoIG5vZGUgYSBwcm9ibGVtICJiZWxvbmdzIiB0by4uLi4pCi0JICogCi0JICogTkI6IFRoaXMgbWV0aG9kIHNob3VsZCBOT1QgbW9kaWZ5IEFOWSBwYXJ0IG9mIHRoZSBub2RlJ3Mgc3RhdGUhCi0JICogSXQgaXMgYSBSRUFELU9OTFkgYmVoYXZpb3IuIE9OTFkgdGhlIGxpc3Qgb2YgY3VycmVudCBwcm9ibGVtcwotCSAqIHBhc3NlZCBpbiB0byB0aGUgbWV0aG9kIHNob3VsZCBiZSBtb2RpZmllZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQkvLyBUaGUgZGVmYXVsdCBpcyB0byBkbyBub3RoaW5nLgotCQkvLyBXaGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCS8qKgotCSAqIFJlYnVpbGQgdGhlICJicmFuY2giIHByb2JsZW1zIGFuZCByZXR1cm4gd2hldGhlciB0aGV5IGhhdmUKLQkgKiBjaGFuZ2VkLgotCSAqIE5COiBUaGUgZW50aXJlIGNvbGxlY3Rpb24gb2YgImJyYW5jaCIgcHJvYmxlbXMgbXVzdCBiZSByZS1jYWxjdWxhdGVkCi0JICogd2l0aCBFVkVSWSAic2lnbmlmaWNhbnQiIGNoYW5nZSAtIHdlIGNhbm5vdCBrZWVwIGl0IGluIHN5bmNoIHZpYQotCSAqIGNoYW5nZSBub3RpZmljYXRpb25zIGJlY2F1c2UgaWYgYSBkZXNjZW5kYW50IHdpdGggcHJvYmxlbXMgaXMKLQkgKiByZW1vdmVkIG9yIHJlcGxhY2VkIHdlIHdpbGwgbm90IHJlY2VpdmUgbm90aWZpY2F0aW9uIHRoYXQgaXRzCi0JICogcHJvYmxlbXMgd2VyZSByZW1vdmVkIGZyb20gb3VyICJicmFuY2giIHByb2JsZW1zLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja0JyYW5jaFByb2JsZW1zKCkgewotCQlWZWN0b3I8UHJvYmxlbT4gb2xkQnJhbmNoUHJvYmxlbXMgPSBuZXcgVmVjdG9yPFByb2JsZW0+KHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQlpbnQgb2xkU2l6ZSA9IHRoaXMuYnJhbmNoUHJvYmxlbXMuc2l6ZSgpOwotCi0JCXRoaXMuYnJhbmNoUHJvYmxlbXMuY2xlYXIoKTsKLQkJdGhpcy5icmFuY2hQcm9ibGVtcy5hZGRBbGwodGhpcy5wcm9ibGVtcyk7Ci0JCWZvciAoSXRlcmF0b3I8Tm9kZT4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCU5vZGUgY2hpbGQgPSBzdHJlYW0ubmV4dCgpOwkJLy8gcHVsbCBvdXQgdGhlIGNoaWxkIHRvIGVhc2UgZGVidWdnaW5nCi0JCQljaGlsZC5hZGRCcmFuY2hQcm9ibGVtc1RvKHRoaXMuYnJhbmNoUHJvYmxlbXMpOwotCQl9Ci0KLQkJLy8gaWYgdGhlIHNpemUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB6ZXJvLCBvdXIgdmlydHVhbCBmbGFnIGhhcyBjaGFuZ2VkCi0JCWludCBuZXdTaXplID0gdGhpcy5icmFuY2hQcm9ibGVtcy5zaXplKCk7Ci0JCWlmICgob2xkU2l6ZSA9PSAwKSAmJiAobmV3U2l6ZSAhPSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIGZhbHNlLCB0cnVlKTsKLQkJfSBlbHNlIGlmICgob2xkU2l6ZSAhPSAwKSAmJiAobmV3U2l6ZSA9PSAwKSkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEhBU19CUkFOQ0hfUFJPQkxFTVNfUFJPUEVSVFksIHRydWUsIGZhbHNlKTsKLQkJfQotCi0JCWlmIChvbGRCcmFuY2hQcm9ibGVtcy5lcXVhbHModGhpcy5icmFuY2hQcm9ibGVtcykpIHsKLQkJCXJldHVybiBmYWxzZTsJCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBkaWQgbm90IGNoYW5nZQotCQl9Ci0JCS8vIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBjaGFuZ2VkCi0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgYWxsIHRoZSBwcm9ibGVtcyBvZiB0aGUgbm9kZSBhbmQgYWxsCi0JICogdGhlIHByb2JsZW1zIG9mIGl0cyBkZXNjZW5kYW50cyB0byB0aGUKLQkgKiBzcGVjaWZpZWQgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gbGlzdCkgewotCQlsaXN0LmFkZEFsbCh0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGNoYW5nZWQ7Ci0JICogdGhlcmVmb3JlIHRoZSBub2RlJ3MgImJyYW5jaCIgcHJvYmxlbXMgaGF2ZSBjaGFuZ2VkIGFsc28gYW5kCi0JICogbXVzdCBiZSByZWJ1aWx0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlYnVpbGRCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKCAhIHRoaXMuY2hlY2tCcmFuY2hQcm9ibGVtcygpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ3ZSBzaG91bGQgbm90IGdldCBoZXJlIHVubGVzcyBvdXIgXCJicmFuY2hcIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucmVidWlsZFBhcmVudEJyYW5jaFByb2JsZW1zKCk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBJZiB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGhhdmUgY2hhbmdlZCwKLQkgKiBub3RpZnkgdGhlIG5vZGUncyBwYXJlbnQuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJaWYgKHRoaXMuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkpIHsKLQkJCS8vIGlmIG91ciAiYnJhbmNoIiBwcm9ibGVtcyBoYXZlIGNoYW5nZWQsIHRoZW4KLQkJCS8vIG91ciBwYXJlbnQgbXVzdCByZWJ1aWxkIGl0cyAiYnJhbmNoIiBwcm9ibGVtcyBhbHNvCi0JCQl0aGlzLnJlYnVpbGRQYXJlbnRCcmFuY2hQcm9ibGVtcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBDbGVhciB0aGUgbm9kZSdzICJicmFuY2giIHByb2JsZW1zIGFuZCB0aGUgImJyYW5jaCIKLQkgKiBwcm9ibGVtcyBvZiBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0aW9uIG9mICJicmFuY2giIHByb2JsZW1zIGhhcyBjaGFuZ2VkLgotCSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2Ugb25seTsgaXQgaXMgbm90IGZvcgotCSAqIGNsaWVudCB1c2UuCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCkgewotCQlpZiAodGhpcy5icmFuY2hQcm9ibGVtcy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yPE5vZGU+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW4oKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlOb2RlIGNoaWxkID0gc3RyZWFtLm5leHQoKTsJCS8vIHB1bGwgb3V0IHRoZSBjaGlsZCB0byBlYXNlIGRlYnVnZ2luZwotCQkJLy8gaWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gY2xlYXIgb3VyICJicmFuY2giCi0JCQkvLyBwcm9ibGVtcyBubyBtYXR0ZXIgd2hhdAotCQkJY2hpbGQuY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0JCX0KLQkJdGhpcy5wcm9ibGVtcy5jbGVhcigpOwotCQl0aGlzLmJyYW5jaFByb2JsZW1zLmNsZWFyKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZLCB0cnVlLCBmYWxzZSk7Ci0JCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKEJSQU5DSF9QUk9CTEVNU19MSVNULCB0aGlzLmJyYW5jaFByb2JsZW1zKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBjaGFuZ2UgdG8gc3BlY2lmaWVkIGFzcGVjdCByZXF1aXJlcyBhIHJlLXZhbGlkYXRpb24KLQkgKiBvZiB0aGUgbm9kZSdzIHRyZWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFzcGVjdENoYW5nZVJlcXVpcmVzVmFsaWRhdGlvbihTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdENoYW5nZURvZXNOb3RSZXF1aXJlVmFsaWRhdGlvbihhc3BlY3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXNwZWN0Q2hhbmdlRG9lc05vdFJlcXVpcmVWYWxpZGF0aW9uKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLm5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyAibm9uLXZhbGlkYXRlZCIgYXNwZWN0IG5hbWVzLgotCSAqIFRoZXNlIGFyZSB0aGUgYXNwZWN0cyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgKG9yIGl0cyBjb250YWluaW5nIHRyZWUpIHRvIGJlIHZhbGlkYXRlZCwgaS5lLiBjaGVja2VkIGZvciBwcm9ibGVtcy4KLQkgKiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyICJub24tdmFsaWRhdGVkIiBhc3BlY3RzLAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlICNhZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKFNldCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVTZXRzKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyA9PSBudWxsKSB7Ci0JCQkJbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJdGhpcy5hZGROb25WYWxpZGF0ZWRBc3BlY3ROYW1lc1RvKG5vblZhbGlkYXRlZEFzcGVjdE5hbWVzKTsKLQkJCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVmFsaWRhdGVkQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG9iamVjdCdzICJub24tdmFsaWRhdGVkIiBhc3BlY3QgbmFtZXMgdG8gdGhlIHNwZWNpZmllZCBzZXQuCi0JICogVGhlc2UgYXJlIHRoZSBhc3BlY3RzIHRoYXQsIHdoZW4gdGhleSBjaGFuZ2UsIHdpbGwgTk9UIGNhdXNlIHRoZQotCSAqIG9iamVjdCAob3IgaXRzIGNvbnRhaW5pbmcgdHJlZSkgdG8gYmUgdmFsaWRhdGVkLCBpLmUuIGNoZWNrZWQgZm9yIHByb2JsZW1zLgotCSAqIElmIGNsYXNzLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgIm5vbi12YWxpZGF0ZWQiIGFzcGVjdHMgaXMgc3VmZmljaWVudCwKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSWYgeW91IG5lZWQgaW5zdGFuY2UtYmFzZWQgY2FsY3VsYXRpb24sCi0JICogb3ZlcnJpZGUgI25vblZhbGlkYXRlZEFzcGVjdE5hbWVzKCkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVmFsaWRhdGVkQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25WYWxpZGF0ZWRBc3BlY3ROYW1lcykgewotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQ09NTUVOVF9QUk9QRVJUWSk7Ci0JCW5vblZhbGlkYXRlZEFzcGVjdE5hbWVzLmFkZChESVJUWV9CUkFOQ0hfUFJPUEVSVFkpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoQlJBTkNIX1BST0JMRU1TX0xJU1QpOwotCQlub25WYWxpZGF0ZWRBc3BlY3ROYW1lcy5hZGQoSEFTX0JSQU5DSF9QUk9CTEVNU19QUk9QRVJUWSk7Ci0JLy8gd2hlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QsIGRvbid0IGZvcmdldCB0byBpbmNsdWRlOgotCS8vCXN1cGVyLmFkZE5vblZhbGlkYXRlZEFzcGVjdE5hbWVzVG8obm9uVmFsaWRhdGVkQXNwZWN0TmFtZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNwbGF5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgZGV2ZWxvcGVyLWZyaWVuZGx5IFN0cmluZy4gSWYgeW91IHdhbnQgc29tZXRoaW5nIHVzZWZ1bCBmb3IKLQkgKiBkaXNwbGF5aW5nIGluIGEgdXNlciBpbnRlcmZhY2UsIHVzZSAjZGlzcGxheVN0cmluZygpLgotCSAqIElmIHlvdSB3YW50IHRvIGdpdmUgbW9yZSBpbmZvcm1hdGlvbiBpbiB5b3VyICN0b1N0cmluZygpLAotCSAqIG92ZXJyaWRlICN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKS4gCi0JICogV2hhdGV2ZXIgeW91IGFkZCB0byB0aGF0IHN0cmluZyBidWZmZXIgd2lsbCBzaG93IHVwIGJldHdlZW4gdGhlIHBhcmVudGhlc2VzLgotCSAqIEBzZWUgQWJzdHJhY3RNb2RlbCN0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKQotCSAqIEBzZWUgI2Rpc3BsYXlTdHJpbmcoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvQXN5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTA2ZjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Bc3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGx1Z2dhYmxlVmFsaWRhdG9yLkRlbGVnYXRlIGludGVyZmFjZQotICogc2ltcGx5IHNldHMgYSBzaGFyZWQgInZhbGlkYXRlIiBmbGFnIHRvIHRydWUuIFRoaXMgc2hvdWxkIHRyaWdnZXIgYQotICogc2VwYXJhdGUgInZhbGlkYXRpb24iIHRocmVhZCB0byBiZWdpbiB2YWxpZGF0aW5nIHRoZSBhcHByb3ByaWF0ZQotICogYnJhbmNoIG9mIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnOwotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdmFsaWRhdG9yIGRlbGVnYXRlIHdpdGggdGhlIHNwZWNpZmllZCBzaGFyZWQKLQkgKiAidmFsaWRhdGUiIGZsYWcuIFRoaXMgZmxhZyBzaG91bGQgYmUgc2hhcmVkIHdpdGgKLQkgKiBhbm90aGVyIHRocmVhZCB0aGF0IHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIHZhbGlkYXRpb24uCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1ZhbGlkYXRvcihTeW5jaHJvbml6ZWRCb29sZWFuIHZhbGlkYXRlRmxhZykgewotCQlzdXBlcigpOwotCQl0aGlzLnZhbGlkYXRlRmxhZyA9IHZhbGlkYXRlRmxhZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHNoYXJlZCAidmFsaWRhdGUiIGZsYWcgdG8gdHJ1ZSwgdHJpZ2dlcmluZwotCSAqIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIG9mIHRoZSBhcHByb3ByaWF0ZQotCSAqIGJyYW5jaCBvZiBub2Rlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJdGhpcy52YWxpZGF0ZUZsYWcuc2V0VHJ1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMudmFsaWRhdGVGbGFnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvRGVmYXVsdFByb2JsZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJhMmYzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL0RlZmF1bHRQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvYmxlbSBpbnRlcmZhY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0UHJvYmxlbQotCWltcGxlbWVudHMgUHJvYmxlbQotewotCXByaXZhdGUgZmluYWwgTm9kZSBzb3VyY2U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZUtleTsKLQlwcml2YXRlIGZpbmFsIGludCBtZXNzYWdlVHlwZTsKLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHM7Ci0KLQotCURlZmF1bHRQcm9ibGVtKE5vZGUgc291cmNlLCBTdHJpbmcgbWVzc2FnZUtleSwgaW50IG1lc3NhZ2VUeXBlLCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc291cmNlID0gc291cmNlOwotCQl0aGlzLm1lc3NhZ2VLZXkgPSBtZXNzYWdlS2V5OwotCQl0aGlzLm1lc3NhZ2VUeXBlID0gbWVzc2FnZVR5cGU7Ci0JCXRoaXMubWVzc2FnZUFyZ3VtZW50cyA9IG1lc3NhZ2VBcmd1bWVudHM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb2JsZW0gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIE5vZGUgc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5zb3VyY2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBtZXNzYWdlS2V5KCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlS2V5OwotCX0KLQotCXB1YmxpYyBpbnQgbWVzc2FnZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1lc3NhZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5tZXNzYWdlQXJndW1lbnRzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPYmplY3Qgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFdlIGltcGxlbWVudCAjZXF1YWxzKE9iamVjdCkgYmVjYXVzZSBwcm9ibGVtcyBhcmUgcmVwZWF0ZWRseQotCSAqIHJlLWNhbGN1bGF0ZWQgYW5kIHRoZSByZXN1bHRpbmcgcHJvYmxlbXMgbWVyZ2VkIHdpdGggdGhlIGV4aXN0aW5nCi0JICogc2V0IG9mIHByb2JsZW1zOyBhbmQgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBwcm9ibGVtcyBhbmQKLQkgKiBpZ25vcmUgYW55IGZyZXNobHktZ2VuZXJhdGVkIGR1cGxpY2F0ZXMuCi0JICogQWxzbywgcHJvYmxlbXMgYXJlIG5vdCBzYXZlZCB0byBkaXNrLi4uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAoICEgKG8gaW5zdGFuY2VvZiBQcm9ibGVtKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVByb2JsZW0gb3RoZXIgPSAoUHJvYmxlbSkgbzsKLQkJcmV0dXJuIHRoaXMuc291cmNlID09IG90aGVyLnNvdXJjZSgpCi0JCQkJJiYgdGhpcy5tZXNzYWdlS2V5LmVxdWFscyhvdGhlci5tZXNzYWdlS2V5KCkpCi0JCQkJJiYgQXJyYXlzLmVxdWFscyh0aGlzLm1lc3NhZ2VBcmd1bWVudHMsIG90aGVyLm1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlLmhhc2hDb2RlKCkgXiB0aGlzLm1lc3NhZ2VLZXkuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm1lc3NhZ2VLZXkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvbm9kZS9Ob2RlLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVhYjIwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIG1ldGhvZHMgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkCi0gKiBieSBhbnkgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSB0byBiZSBwYXJ0IG9mIGEgY29udGFpbm1lbnQgaGllcmFyY2h5Ci0gKiB0aGF0IHN1cHBvcnRzIGEgImRpcnR5IiBzdGF0ZSBhbmQgdmFsaWRhdGlvbiAicHJvYmxlbXMiLgotICogCi0gKiBOb3RlOiBNZXRob2RzIG1hcmtlZCAiSU5UUkEtVFJFRSBBUEkiIGFyZSB0eXBpY2FsbHkgb25seSB1c2VkIGJ5Ci0gKiB0aGUgbm9kZXMgdGhlbXNlbHZlcywgYXMgb3Bwb3NlZCB0byBjbGllbnRzIG9mIHRoZSBub2Rlcy4gVGhlc2UKLSAqIG1ldGhvZHMgYXJlIGNhbGxlZCBieSBhIG5vZGUgb24gZWl0aGVyIGl0cyBwYXJlbnQgb3IgaXRzIGNoaWxkcmVuLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGUgZXh0ZW5kcyBNb2RlbCB7Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5IChwYXJlbnQvY2hpbGRyZW4pICoqKioqKioqKioKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBpbiB0aGUgY29udGFpbm1lbnQgaGllcmFyY2h5LgotCSAqIE1vc3Qgbm9kZXMgbXVzdCBoYXZlIGEgcGFyZW50LiBUaGUgcGFyZW50IGlzIGltbXV0YWJsZS4KLQkgKiBAc2VlICNjaGlsZHJlbigpCi0JICovCi0JTm9kZSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkcmVuLCB3aGljaCBhcmUgYWxzbyBub2Rlcy4KLQkgKiBAc2VlICNnZXRQYXJlbnQoKQotCSAqLwotCUl0ZXJhdG9yPE5vZGU+IGNoaWxkcmVuKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQST8KLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5tZW50IGhpZXJhcmNoeSdzIHJvb3Qgbm9kZS4KLQkgKiBNb3N0IG5vZGVzIG11c3QgaGF2ZSBhIHJvb3QuCi0JICogQHNlZSAjZ2V0UGFyZW50KCkKLQkgKi8KLQlOb2RlIHJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogQnkgZGVmaW5pdGlvbiwgYSBub2RlIGlzIGEgZGVzY2VuZGFudCBvZiBpdHNlbGYuCi0JICovCi0JYm9vbGVhbiBpc0Rlc2NlbmRhbnRPZihOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBBZGQgdGhlIG5vZGUncyAicmVmZXJlbmNlcyIsIGFuZCBhbGwgdGhlIG5vZGUncyBkZXNjZW5kYW50cycKLQkgKiAicmVmZXJlbmNlcyIsIHRvIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbi4gIlJlZmVyZW5jZXMiIGFyZQotCSAqIG9iamVjdHMgdGhhdCBhcmUgInJlZmVyZW5jZWQiIGJ5IGFub3RoZXIgb2JqZWN0LCBhcyBvcHBvc2VkCi0JICogdG8gIm93bmVkIiBieSBhbm90aGVyIG9iamVjdC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBvZiBwYXJ0aWN1bGFyIGNvbmNlcm4gdG8gSGFuZGxlcywgc2luY2UgbW9zdAotCSAqIChob3BlZnVsbHkgYWxsKSAicmVmZXJlbmNlcyIgYXJlIGhlbGQgYnkgSGFuZGxlcy4KLQkgKiBAc2VlIFJlZmVyZW5jZQotCSAqIEBzZWUgI2NoaWxkcmVuKCkKLQkgKi8KLQl2b2lkIGFkZEJyYW5jaFJlZmVyZW5jZXNUbyhDb2xsZWN0aW9uPE5vZGUuUmVmZXJlbmNlPiBicmFuY2hSZWZlcmVuY2VzKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJPwotCSAqIEFkZCBhbGwgdGhlIG5vZGVzIGluIHRoZSBvYmplY3QncyBicmFuY2ggb2YgdGhlIHRyZWUsCi0JICogaW5jbHVkaW5nIHRoZSBub2RlIGl0c2VsZiwgdG8gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uLgotCSAqIE9ubHkgcmVhbGx5IHVzZWQgZm9yIHRlc3RpbmcgYW5kIGRlYnVnZ2luZy4KLQkgKi8KLQl2b2lkIGFkZEFsbE5vZGVzVG8oQ29sbGVjdGlvbjxOb2RlPiBub2Rlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW1vdmVkIGZyb20gdGhlIHRyZWUuIFRoZSBub2RlIHJlY2VpdmluZyB0aGlzIG5vdGlmaWNhdGlvbgotCSAqIHNob3VsZCBwZXJmb3JtIGFueSBuZWNlc3NhcnkgdXBkYXRlcyB0byByZW1haW4gaW4gc3luY2gKLQkgKiB3aXRoIHRoZSB0cmVlIChlLmcuIGNsZWFyaW5nIG91dCBvciByZXBsYWNpbmcgYW55IHJlZmVyZW5jZXMKLQkgKiB0byB0aGUgcmVtb3ZlZCBub2RlIG9yIGFueSBvZiB0aGUgcmVtb3ZlZCBub2RlJ3MgZGVzY2VuZGFudHMpLgotCSAqIEBzZWUgI2lzRGVzY2VuZGFudE9mKE5vZGUpCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBUaGlzIGlzIGEgZ2VuZXJhbCBub3RpZmljYXRpb24gdGhhdCB0aGUgc3BlY2lmaWVkIG5vZGUgaGFzIGJlZW4KLQkgKiByZW5hbWVkLiBUaGUgbm9kZSByZWNlaXZpbmcgdGhpcyBub3RpZmljYXRpb24gc2hvdWxkIG1hcmsgaXRzCi0JICogYnJhbmNoIGRpcnR5IGlmIG5lY2Vzc2FyeSAoaS5lLiBpdCByZWZlcmVuY2VzIHRoZSByZW5hbWVkIG5vZGUKLQkgKiBvciBvbmUgb2YgaXRzIGRlc2NlbmRhbnRzKS4gVGhpcyBtZXRob2QgaXMgb2YgcGFydGljdWxhciBjb25jZXJuCi0JICogdG8gSGFuZGxlcy4KLQkgKiBAc2VlICNpc0Rlc2NlbmRhbnRPZihOb2RlKQotCSAqLwotCXZvaWQgbm9kZVJlbmFtZWQoTm9kZSBub2RlKTsKLQkKLQotCS8vICoqKioqKioqKiogZGlydHkgZmxhZyBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBwZXJzaXN0ZW50IGFzcGVjdHMgb2YgdGhlIG5vZGUsCi0JICogb3IgYW55IG9mIGl0cyBkZXNjZW5kYW50cywgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBub2RlIGFuZAotCSAqIGl0cyBkZXNjZW5kYW50cyB3ZXJlIGxhc3QgcmVhZCBvciBzYXZlZC4KLQkgKi8KLQlib29sZWFuIGlzRGlydHlCcmFuY2goKTsKLQkJU3RyaW5nIERJUlRZX0JSQU5DSF9QUk9QRVJUWSA9ICJkaXJ0eUJyYW5jaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogTWFyayB0aGUgbm9kZSBhbmQgaXRzIHBhcmVudCBhcyBkaXJ0eSBicmFuY2hlcy4KLQkgKiBUaGlzIG1lc3NhZ2UgaXMgcHJvcGFnYXRlZCB1cCB0aGUgY29udGFpbm1lbnQKLQkgKiB0cmVlIHdoZW4gYSBwYXJ0aWN1bGFyIG5vZGUgYmVjb21lcyBkaXJ0eS4KLQkgKi8KLQl2b2lkIG1hcmtCcmFuY2hEaXJ0eSgpOwotCi0JLyoqCi0JICogTWFyayB0aGUgbm9kZSBhbmQgYWxsIGl0cyBkZXNjZW5kYW50cyBhcyBkaXJ0eS4KLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgc2F2ZSBsb2NhdGlvbiBvZiBzb21lCi0JICogdG9wLWxldmVsIG5vZGUgaXMgY2hhbmdlZCBhbmQgdGhlIGVudGlyZQotCSAqIGNvbnRhaW5tZW50IHRyZWUgbXVzdCBiZSBtYXJrZWQgZGlydHkgc28gaXQKLQkgKiB3aWxsIGJlIHdyaXR0ZW4gb3V0LgotCSAqLwotCXZvaWQgbWFya0VudGlyZUJyYW5jaERpcnR5KCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEEgY2hpbGQgbm9kZSdzIGJyYW5jaCBoYXMgYmVlbiBtYXJrZWQgY2xlYW4uIElmIHRoZSBub2RlCi0JICogaXRzZWxmIGlzIGNsZWFuIGFuZCBpZiBhbGwgb2YgaXRzIGNoaWxkcmVuIGFyZSBhbHNvIGNsZWFuLCB0aGUKLQkgKiBub2RlJ3MgYnJhbmNoIGNhbiBiZSBtYXJrZWQgY2xlYW4uIFRoZW4sIGlmIHRoZSBub2RlJ3MKLQkgKiBicmFuY2ggaXMgY2xlYW4sIHRoZSBub2RlIHdpbGwgbm90aWZ5IGl0cyBwYXJlbnQgdGhhdCBpdCBtaWdodAotCSAqIGJlIGNsZWFuIGFsc28uIFRoaXMgbWVzc2FnZSBpcyBwcm9wYWdhdGVkIHVwIHRoZSBjb250YWlubWVudAotCSAqIHRyZWUgd2hlbiBhIHBhcnRpY3VsYXIgbm9kZSBiZWNvbWVzIGNsZWFuLgotCSAqLwotCXZvaWQgbWFya0JyYW5jaENsZWFuSWZQb3NzaWJsZSgpOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBNYXJrIHRoZSBub2RlIGFuZCBhbGwgaXRzIGRlc2NlbmRhbnRzIGFzIGNsZWFuLgotCSAqIFR5cGljYWxseSB1c2VkIHdoZW4gdGhlIG5vZGUgaGFzIGp1c3QgYmVlbgotCSAqIHJlYWQgaW4gb3Igd3JpdHRlbiBvdXQuCi0JICogVGhpcyBtZXRob2QgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OyBpdCBpcyBub3QgZm9yCi0JICogY2xpZW50IHVzZS4KLQkgKiBOb3QgdGhlIGJlc3Qgb2YgbWV0aG9kIG5hbWVzLi4uLiA6LSgKLQkgKi8KLQl2b2lkIGNhc2NhZGVNYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9ibGVtcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFJldHVybiBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCVZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLQotCS8qKgotCSAqIFNldCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciBhCi0JICogInZhbGlkYXRlZCIgYXNwZWN0IG9mIHRoZSBub2RlIHRyZWUgY2hhbmdlcy4KLQkgKiBUeXBpY2FsbHkgb25seSB0aGUgcm9vdCBub2RlIGRpcmVjdGx5IGhvbGRzIGEgdmFsaWRhdG9yLgotCSAqLwotCXZvaWQgc2V0VmFsaWRhdG9yKFZhbGlkYXRvciB2YWxpZGF0b3IpOwotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBUaGlzIGlzIGFuIGV4cGxpY2l0IHJlcXVlc3QgaW52b2tlZCBieSBhIGNsaWVudDsgYW5kIGl0IHdpbGwKLQkgKiB0eXBpY2FsbHkgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6Ci0JICogCSNicmFuY2hQcm9ibGVtcygpCi0JICogCSNoYXNCcmFuY2hQcm9ibGVtcygpCi0JICogV2hldGhlciB0aGUgbm9kZSBtYWludGFpbnMgaXRzIHByb2JsZW1zIG9uIHRoZSBmbHkKLQkgKiBvciB3YWl0cyB1bnRpbCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUKLQkgKiBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIFByb2JsZW0KLQkgKi8KLQl2b2lkIHZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIFZhbGlkYXRlIHRoZSBub2RlIGFuZCBhbGwgb2YgaXRzIGRlc2NlbmRhbnRzLAotCSAqIGFuZCB1cGRhdGUgdGhlaXIgc2V0cyBvZiAiYnJhbmNoIiBwcm9ibGVtcy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gdmFsaWRhdGVCcmFuY2hJbnRlcm5hbCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbm9kZSdzIHByb2JsZW1zIGFsb25nIHdpdGggYWxsIHRoZQotCSAqIG5vZGUncyBkZXNjZW5kYW50cycgcHJvYmxlbXMuCi0JICovCi0JTGlzdEl0ZXJhdG9yPFByb2JsZW0+IGJyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBCUkFOQ0hfUFJPQkxFTVNfTElTVCA9ICJicmFuY2hQcm9ibGVtcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiBhbGwgdGhlIG5vZGUncyBwcm9ibGVtcyBhbG9uZyB3aXRoIGFsbCB0aGUKLQkgKiBub2RlJ3MgZGVzY2VuZGFudHMnIHByb2JsZW1zLgotCSAqLwotCWludCBicmFuY2hQcm9ibGVtc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBub2RlIG9yIGFueSBvZiBpdHMgZGVzY2VuZGFudHMgaGF2ZSBwcm9ibGVtcy4KLQkgKi8KLQlib29sZWFuIGhhc0JyYW5jaFByb2JsZW1zKCk7Ci0JCVN0cmluZyBIQVNfQlJBTkNIX1BST0JMRU1TX1BST1BFUlRZID0gImhhc0JyYW5jaFByb2JsZW1zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBicmFuY2ggcHJvYmxlbS4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zQnJhbmNoUHJvYmxlbShQcm9ibGVtIHByb2JsZW0pOwotCi0JLyoqCi0JICogSU5UUkEtVFJFRSBBUEkKLQkgKiBTb21ldGhpbmcgY2hhbmdlZCwgcmVidWlsZCB0aGUgbm9kZSdzIGNvbGxlY3Rpb24gb2YgYnJhbmNoIHByb2JsZW1zLgotCSAqLwotCXZvaWQgcmVidWlsZEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkvKioKLQkgKiBJTlRSQS1UUkVFIEFQSQotCSAqIEFkZCB0aGUgbm9kZSdzIHByb2JsZW1zLCBhbmQgYWxsIHRoZSBub2RlJ3MgZGVzY2VuZGFudHMnCi0JICogcHJvYmxlbXMsIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKiBBIGNhbGwgdG8gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHByZWNlZGVkIGJ5IGEgY2FsbCB0bwotCSAqICN2YWxpZGF0ZUJyYW5jaCgpIG9yIGFsbCBvZiB0aGUgcHJvYmxlbXMgbWlnaHQgbm90IGJlCi0JICogYWRkZWQgdG8gdGhlIGxpc3QuCi0JICogQHNlZSBQcm9ibGVtCi0JICovCi0Jdm9pZCBhZGRCcmFuY2hQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gYnJhbmNoUHJvYmxlbXMpOwotCi0JLyoqCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKi8KLQl2b2lkIGNsZWFyQWxsQnJhbmNoUHJvYmxlbXMoKTsKLQotCS8qKgotCSAqIElOVFJBLVRSRUUgQVBJCi0JICogQ2xlYXIgdGhlIG5vZGUncyAiYnJhbmNoIiBwcm9ibGVtcyBhbmQgdGhlICJicmFuY2giCi0JICogcHJvYmxlbXMgb2YgYWxsIG9mIGl0cyBkZXNjZW5kYW50cy4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29sbGVjdGlvbiBvZiAiYnJhbmNoIiBwcm9ibGVtcyBoYXMgY2hhbmdlZC4KLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk7IGl0IGlzIG5vdCBmb3IKLQkgKiBjbGllbnQgdXNlLgotCSAqLwotCWJvb2xlYW4gY2xlYXJBbGxCcmFuY2hQcm9ibGVtc0ludGVybmFsKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29tbWVudCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCVN0cmluZyBjb21tZW50KCk7Ci0JCVN0cmluZyBDT01NRU5UX1BST1BFUlRZID0gImNvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIHVzZXIgY29tbWVudCBjb25jZXJuaW5nIHRoZSBub2RlLgotCSAqLwotCXZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCk7Ci0KLQotCS8vICoqKioqKioqKiogZGlzcGxheWluZy9zb3J0aW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwsIHN1aXRhYmxlIGZvciBzb3J0aW5nLgotCSAqLwotCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWludGVyZmFjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2ltcGxlIGludGVyZmFjZSBkZWZpbmluZyBhICJyZWZlcmVuY2UiIGJldHdlZW4gdHdvIG5vZGVzLgotCSAqIEBzZWUgTm9kZSNhZGRCcmFuY2hSZWZlcmVuY2VzVG8oamF2YS51dGlsLkNvbGxlY3Rpb24pCi0JICovCi0JaW50ZXJmYWNlIFJlZmVyZW5jZSB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInNvdXJjZSIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogcmVmZXJlbmNlcyB0aGUgInRhcmdldCIgbm9kZS4KLQkJICovCi0JCU5vZGUgc291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgInRhcmdldCIgbm9kZSBvZiB0aGUgcmVmZXJlbmNlLCBpLmUuIHRoZSBub2RlIHRoYXQKLQkJICogaXMgcmVmZXJlbmNlZCBieSB0aGUgInNvdXJjZSIgbm9kZS4KLQkJICovCi0JCU5vZGUgdGFyZ2V0KCk7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIEEgdmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgYSBub2RlIGFzIGFwcHJvcHJpYXRlLgotCSAqIFR5cGljYWxseSB0aGUgdmFsaWRhdGlvbiB3aWxsCi0JICogCS0gb2NjdXIgd2hlbmV2ZXIgYSBub2RlIGhhcyBjaGFuZ2VkCi0JICogCS0gZW5jb21wYXNzIHRoZSBlbnRpcmUgdHJlZSBjb250YWluaW5nIHRoZSBub2RlCi0JICogCS0gZXhlY3V0ZSBhc3luY2hyb25vdXNseQotCSAqLwotCWludGVyZmFjZSBWYWxpZGF0b3IgewotCi0JCS8qKgotCQkgKiBBICJzaWduaWZpY2FudCIgYXNwZWN0IGhhcyBjaGFuZ2VkOwotCQkgKiB2YWxpZGF0ZSB0aGUgbm9kZSBhcyBhcHByb3ByaWF0ZQotCQkgKi8KLQkJdm9pZCB2YWxpZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBTdG9wIGFsbCB2YWxpZGF0aW9uIG9mIHRoZSBub2RlIHVudGlsICNyZXN1bWUoKSBpcyBjYWxsZWQuCi0JCSAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW1wcm92ZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYW55IGxvbmctcnVubmluZwotCQkgKiBhY3Rpb24gdGhhdCB0cmlnZ2VycyBudW1lcm91cyBjaGFuZ2VzIHRvIHRoZSBub2RlLiBCZSBzdXJlIHRvCi0JCSAqIG1hdGNoIGEgY2FsbCB0byB0aGlzIG1ldGhvZCB3aXRoIGEgY29ycmVzcG9uZGluZyBjYWxsIHRvCi0JCSAqICNyZXN1bWUoKS4KLQkJICovCi0JCXZvaWQgcGF1c2UoKTsKLQotCQkvKioKLQkJICogUmVzdW1lIHZhbGlkYXRpb24gb2YgdGhlIG5vZGUuIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlCi0JCSAqIGNhbGxlZCBhZnRlciBhIG1hdGNoaW5nIGNhbGwgdG8gI3BhdXNlKCkuCi0JCSAqLwotCQl2b2lkIHJlc3VtZSgpOwotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBSZWZlcmVuY2UgaW50ZXJmYWNlCi0JICogZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgU2ltcGxlUmVmZXJlbmNlIGltcGxlbWVudHMgUmVmZXJlbmNlIHsKLQkJcHJpdmF0ZSBOb2RlIHNvdXJjZTsKLQkJcHJpdmF0ZSBOb2RlIHRhcmdldDsKLQkJcHVibGljIFNpbXBsZVJlZmVyZW5jZShOb2RlIHNvdXJjZSwgTm9kZSB0YXJnZXQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoc291cmNlID09IG51bGwgfHwgdGFyZ2V0ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCX0KLQkJcHVibGljIE5vZGUgc291cmNlKCkgewotCQkJcmV0dXJuIHRoaXMuc291cmNlOwotCQl9Ci0JCXB1YmxpYyBOb2RlIHRhcmdldCgpIHsKLQkJCXJldHVybiB0aGlzLnRhcmdldDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc291cmNlICsgIiA9PiAiICsgdGhpcy50YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgdmFsaWRhdG9yIGRvZXMgbm90aGluZyB0byB2YWxpZGF0ZSB0aGUgbm9kZS4KLQkgKi8KLQlWYWxpZGF0b3IgTlVMTF9WQUxJREFUT1IgPQotCQluZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZS5OdWxsLmluc3RhbmNlKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk5vZGUuTlVMTF9WQUxJREFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1BsdWdnYWJsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EyODNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUGx1Z2dhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBWYWxpZGF0b3IgaW50ZXJmYWNlIGltcGxlbWVudHMgdGhlCi0gKiBwYXVzZS9yZXN1bWUgcG9ydGlvbiBvZiB0aGUgcHJvdG9jb2wsIGJ1dCBkZWxlZ2F0ZXMgdGhlIGFjdHVhbAotICogdmFsaWRhdGlvbiB0byBhICJwbHVnZ2FibGUiIGRlbGVnYXRlLgotICovCi1wdWJsaWMgY2xhc3MgUGx1Z2dhYmxlVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBOb2RlLlZhbGlkYXRvcgotewotCXByaXZhdGUgYm9vbGVhbiBwYXVzZTsKLQlwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVPblJlc3VtZTsKLQlwcml2YXRlIGZpbmFsIERlbGVnYXRlIGRlbGVnYXRlOwotCi0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBmYWN0b3J5IG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5vZGUuVmFsaWRhdG9yIGJ1aWxkQXN5bmNocm9ub3VzVmFsaWRhdG9yKFN5bmNocm9uaXplZEJvb2xlYW4gdmFsaWRhdGVGbGFnKSB7Ci0JCXJldHVybiBuZXcgUGx1Z2dhYmxlVmFsaWRhdG9yKG5ldyBBc3luY2hyb25vdXNWYWxpZGF0b3IodmFsaWRhdGVGbGFnKSk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgZmFjdG9yeSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyBOb2RlLlZhbGlkYXRvciBidWlsZFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbmV3IFBsdWdnYWJsZVZhbGlkYXRvcihuZXcgU3luY2hyb25vdXNWYWxpZGF0b3Iobm9kZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB3aXRoIHRoZSBzcGVjaWZpZWQgZGVsZWdhdGUuCi0JICovCi0JcHVibGljIFBsdWdnYWJsZVZhbGlkYXRvcihEZWxlZ2F0ZSBkZWxlZ2F0ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhdXNlID0gZmFsc2U7Ci0JCXRoaXMudmFsaWRhdGVPblJlc3VtZSA9IGZhbHNlOwotCQl0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHZhbGlkYXRlKCkgewotCQlpZiAodGhpcy5wYXVzZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZGVsZWdhdGUudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXVzZSgpIHsKLQkJaWYgKHRoaXMucGF1c2UpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImFscmVhZHkgcGF1c2VkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLnBhdXNlID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzdW1lKCkgewotCQlpZiAoICEgdGhpcy5wYXVzZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IHBhdXNlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5wYXVzZSA9IGZhbHNlOwotCQkvLyB2YWxpZGF0ZSBhbnkgY2hhbmdlcyB0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSB2YWxpZGF0aW9uIHdhcyBwYXVzZWQKLQkJaWYgKHRoaXMudmFsaWRhdGVPblJlc3VtZSkgewotCQkJdGhpcy52YWxpZGF0ZU9uUmVzdW1lID0gZmFsc2U7Ci0JCQl0aGlzLmRlbGVnYXRlLnZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmRlbGVnYXRlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYW55IGRlbGVnYXRlcyBvZiBhIHBsdWdnYWJsZSB2YWxpZGF0b3IuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBEZWxlZ2F0ZSB7Ci0KLQkJLyoqCi0JCSAqIFRoZSB2YWxpZGF0b3IgaXMgbm90ICJwYXVzZWQiIC0gcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgdmFsaWRhdGlvbi4KLQkJICovCi0JCXZvaWQgdmFsaWRhdGUoKTsKLQotCi0JCS8qKgotCQkgKiBUaGlzIGRlbGVnYXRlIGRvZXMgbm90aGluZy4KLQkJICovCi0JCWZpbmFsIGNsYXNzIE51bGwgaW1wbGVtZW50cyBEZWxlZ2F0ZSB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERlbGVnYXRlIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJCXB1YmxpYyBzdGF0aWMgRGVsZWdhdGUgaW5zdGFuY2UoKSB7Ci0JCQkJcmV0dXJuIElOU1RBTkNFOwotCQkJfQotCQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUuTnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1Byb2JsZW0uamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2I0Nzc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvUHJvYmxlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZTsKLQotLyoqCi0gKiBEZWZpbmUgYW4gaW50ZXJmYWNlIGRlc2NyaWJpbmcgdGhlIHByb2JsZW1zIGFzc29jaWF0ZWQgd2l0aCBhIG5vZGUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvYmxlbSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5vZGUgbW9zdCBjbG9zZWx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvYmxlbS4KLQkgKi8KLQlOb2RlIHNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEga2V5IHRoYXQgY2FuIGJlIHVzZWQgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHByb2JsZW0ncyBtZXNzYWdlLgotCSAqLwotCVN0cmluZyBtZXNzYWdlS2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFyZ3VtZW50cyBhc3NvY2lhdGUgd2l0aCB0aGUgcHJvYmxlbSdzIG1lc3NhZ2UuCi0JICovCi0JT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgaWRlbnRpZmllZCBwcm9ibGVtJ3MgbWVzc2FnZQotCSAqLwotCWludCBtZXNzYWdlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2JsZW0gaXMgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogSXQgaXMgZXF1YWwgaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgYSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQkgKiBQcm9ibGVtIGludGVyZmFjZSBhbmQgaXRzIHNvdXJjZSwgbWVzc2FnZSBrZXksIGFuZCBtZXNzYWdlCi0JICogYXJndW1lbnRzIGFyZSBhbGwgZXF1YWwgdG8gdGhpcyBwcm9ibGVtJ3MuCi0JICovCi0JYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ibGVtJ3MgaGFzaCBjb2RlLCB3aGljaCBzaG91bGQgY2FsY3VsYXRlZCBhcyBhbgotCSAqIFhPUiBvZiB0aGUgc291cmNlJ3MgaGFzaCBjb2RlIGFuZCB0aGUgbWVzc2FnZSBrZXkncyBoYXNoIGNvZGUuCi0JICovCi0JaW50IGhhc2hDb2RlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL25vZGUvU3luY2hyb25vdXNWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3NjY4NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9ub2RlL1N5bmNocm9ub3VzVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFBsdWdnYWJsZVZhbGlkYXRvci5EZWxlZ2F0ZSBpbnRlcmZhY2UKLSAqIHdpbGwgdmFsaWRhdGUgdGhlIG5vZGUgaW1tZWRpYXRlbHkuCi0gKiAKLSAqIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgaW4gYSBzaW5nbGUgdGhyZWFkIG9yIGdlbmVyYXRpbmcKLSAqIHByb2JsZW0gcmVwb3J0cy4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9ub3VzVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBQbHVnZ2FibGVWYWxpZGF0b3IuRGVsZWdhdGUKLXsKLQlwcml2YXRlIGZpbmFsIE5vZGUgbm9kZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHZhbGlkYXRvciB0aGF0IHdpbGwgaW1tZWRpYXRlbHkgdmFsaWRhdGUgdGhlCi0JICogc3BlY2lmaWVkIG5vZGUuCi0JICovCi0JcHVibGljIFN5bmNocm9ub3VzVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCQl0aGlzLm5vZGUgPSBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgewotCQl0aGlzLm5vZGUudmFsaWRhdGVCcmFuY2goKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5vZGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NhY2hpbmdDb21ib0JveE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNjQxMmUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ2FjaGluZ0NvbWJvQm94TW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgYSBjbGllbnQgdG8gYmV0dGVyIGNvbnRyb2wgdGhlIHBlcmZvcm1hbmNlIG9mCi0gKiBhIGNvbWJvIGJveCBtb2RlbCBieSBhbGxvd2luZyB0aGUgY2xpZW50IHRvIHNwZWNpZnkgd2hlbiBpdCBpcwotICogYWNjZXB0YWJsZSBmb3IgdGhlIG1vZGVsIHRvICJjYWNoZSIgYW5kICJ1bmNhY2hlIiBpdHMgbGlzdCBvZiBlbGVtZW50cy4KLSAqIFRoZSBtb2RlbCBtYXkgaWdub3JlIHRoZXNlIGhpbnRzIGlmIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhY2hpbmdDb21ib0JveE1vZGVsIGV4dGVuZHMgQ29tYm9Cb3hNb2RlbCB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ2FjaGUgdGhlIGNvbWJvQm94TW9kZWwgTGlzdC4gIElmIHlvdSBjYWxsIHRoaXMsIHlvdQotICAgICAqIG11c3QgbWFrZSBzdXJlIHRvIGNhbGwgdW5jYWNoZUxpc3QoKSBhcyB3ZWxsLiAgT3RoZXJ3aXNlCi0gICAgICogc3RhbGUgZGF0YSB3aWxsIGJlIGluIHRoZSBDb21ib0JveCB1bnRpbCBjYWNoZUxpc3QoKSBpcyAKLSAgICAgKiBjYWxsZWQgYWdhaW4gb3IgdW5jYWNoZUxpc3QoKSBpcyBjYWxsZWQuCi0gICAgICovCi0gICAgdm9pZCBjYWNoZUxpc3QoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDbGVhciB0aGUgY2FjaGVkIGxpc3QuICBOZXh0IHRpbWUgdGhlIGxpc3QgaXMgbmVlZGVkIGl0IHdpbGwKLSAgICAgKiBiZSBidWlsdCB3aGVuIGl0IGlzIG5vdCBjYWNoZWQuCi0gICAgICovCi0gICAgdm9pZCB1bmNhY2hlTGlzdCgpOwotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBsaXN0IGlzIGFscmVhZHkgY2FjaGVkLiAgVGhpcyBjYW4gYmUgdXNlZCBmb3IgCi0gICAgICogTW91c2VFdmVudHMsIHNpbmNlIHRoZXkgYXJlIG5vdCB0ZXJyaWJseSBwcmVkaWN0YWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzQ2FjaGVkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0NoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhMmIyZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9DaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDaGVja0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0vKioKLSAqIE1ha2UgdGhlIGNlbGwgbG9vayBsaWtlIGEgY2hlY2sgYm94LgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRzIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuUmVuZGVyZXIgewotCi0JLyoqIHRoZSBjb21wb25lbnQgdXNlZCB0byBwYWludCB0aGUgY2VsbCAqLwotCXByaXZhdGUgZmluYWwgSkNoZWNrQm94IGNoZWNrQm94OwotCQotCS8qKiB0aGUgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgb24gYW4gaW1tZWRpYXRlIGVkaXQgKi8KLQlwcm90ZWN0ZWQgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5JbW1lZGlhdGVFZGl0TGlzdGVuZXIgaW1tZWRpYXRlRWRpdExpc3RlbmVyOwotCi0JLyoqICJub3JtYWwiIGJvcmRlciAtIGFzc3VtZSB0aGUgZGVmYXVsdCB0YWJsZSAiZm9jdXMiIGJvcmRlciBpcyAxIHBpeGVsIHRoaWNrICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9yZGVyIE5PX0ZPQ1VTX0JPUkRFUiA9IEJvcmRlckZhY3RvcnkuY3JlYXRlRW1wdHlCb3JkZXIoMSwgMSwgMSwgMSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCBubyBsYWJlbCBvciBpY29uLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmNoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KCk7Ci0JCS8vIGJ5IGRlZmF1bHQsIGNoZWNrIGJveGVzIGRvIG5vdCBwYWludCB0aGVpciBib3JkZXJzCi0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyUGFpbnRlZCh0cnVlKTsKLQkJLy8gdGhpcyBzZXR0aW5nIGlzIHJlY29tbWVuZGVkIGZvciBjaGVjayBib3hlcyBpbnNpZGUgb2YgdHJlZXMgYW5kIHRhYmxlcwotCQl0aGlzLmNoZWNrQm94LnNldEJvcmRlclBhaW50ZWRGbGF0KHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQgYW5kIGljb24sCi0JICogZWl0aGVyIG9mIHdoaWNoIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0LCBJY29uIGljb24pIHsKLQkJdGhpcygpOwotCQl0aGlzLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHdpdGggdGhlIHNwZWNpZmllZCB0ZXh0LgotCSAqLwotCXB1YmxpYyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXModGV4dCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB3aXRoIHRoZSBzcGVjaWZpZWQgaWNvbi4KLQkgKi8KLQlwdWJsaWMgQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcihJY29uIGljb24pIHsKLQkJdGhpcyhudWxsLCBpY29uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkNoZWNrQm94IGJ1aWxkQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjYiA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2IuYWRkQWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZEFjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2I7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uTGlzdGVuZXIgYnVpbGRBY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkgICAgdGhpcy5jaGVja0JveC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KFN3aW5nQ29uc3RhbnRzLkNFTlRFUik7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Q29tcG9uZW50T3JpZW50YXRpb24odGFibGUuZ2V0Q29tcG9uZW50T3JpZW50YXRpb24oKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLmNoZWNrQm94LnNldEVuYWJsZWQodGFibGUuaXNFbmFibGVkKCkpOwotCi0JCXRoaXMuY2hlY2tCb3guc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJdGhpcy5jaGVja0JveC5zZXRCYWNrZ3JvdW5kKHRoaXMuYmFja2dyb3VuZENvbG9yKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCQkvLyBvbmNlIHRoZSBjb2xvcnMgYXJlIHNldCwgY2FsY3VsYXRlIG9wYXF1ZSBzZXR0aW5nCi0JCXRoaXMuY2hlY2tCb3guc2V0T3BhcXVlKHRoaXMuY2VsbElzT3BhcXVlSW4odGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuY2hlY2tCb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWx1ZSwgc2VsZWN0ZWQsIGhhc0ZvY3VzLCByb3csIGNvbHVtbikpOwotCi0JCXRoaXMuc2V0VmFsdWUodmFsdWUpOwotCQlyZXR1cm4gdGhpcy5jaGVja0JveDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBmb3JlZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBmb3JlZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEZvcmVncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Rm9yZWdyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJhY2tncm91bmQgY29sb3IuCi0JICovCi0JcHJvdGVjdGVkIENvbG9yIGJhY2tncm91bmRDb2xvcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIFVJTWFuYWdlci5nZXRDb2xvcigiVGFibGUuZm9jdXNDZWxsQmFja2dyb3VuZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gdGFibGUuZ2V0U2VsZWN0aW9uQmFja2dyb3VuZCgpOwotCQl9Ci0JCXJldHVybiB0YWJsZS5nZXRCYWNrZ3JvdW5kKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IHJvdywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIGhhc0ZvY3VzID8gIFVJTWFuYWdlci5nZXRCb3JkZXIoIlRhYmxlLmZvY3VzQ2VsbEhpZ2hsaWdodEJvcmRlciIpIDogTk9fRk9DVVNfQk9SREVSOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNlbGwgc2hvdWxkIGJlIG9wYXF1ZSBpbiB0aGUgdGFibGUuCi0JICogSWYgdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGlzIHRoZSBzYW1lIGFzIHRoZSB0YWJsZSdzIGJhY2tncm91bmQKLQkgKiBhbmQgdGFibGUgaXMgb3BhcXVlLCB3ZSBkb24ndCBuZWVkIHRvIHBhaW50IHRoZSBiYWNrZ3JvdW5kIC0KLQkgKiB0aGUgdGFibGUgd2lsbCBkbyBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjZWxsSXNPcGFxdWVJbihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIHNlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBoYXNGb2N1cywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByb3csIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY29sdW1uKSB7Ci0JCUNvbG9yIGNlbGxCYWNrZ3JvdW5kID0gdGhpcy5jaGVja0JveC5nZXRCYWNrZ3JvdW5kKCk7Ci0JCUNvbG9yIHRhYmxlQmFja2dyb3VuZCA9IHRhYmxlLmdldEJhY2tncm91bmQoKTsKLQkJcmV0dXJuICEgKHRhYmxlLmlzT3BhcXVlKCkgJiYgY2VsbEJhY2tncm91bmQuZXF1YWxzKHRhYmxlQmFja2dyb3VuZCkpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgY2hlY2sgYm94J3MgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCS8vIENSIzM5OTkzMTggLSBUaGlzIG51bGwgY2hlY2sgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIEpESyBidWcgaXMgZml4ZWQKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXZhbHVlID0gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQl0aGlzLmNoZWNrQm94LnNldFNlbGVjdGVkKCgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY2hlY2tCb3guaXNTZWxlY3RlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogcHVibGljIEFQSSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNoZWNrIGJveCdzIHRleHQ7IHdoaWNoIGJ5IGRlZmF1bHQgaXMgYmxhbmsuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdGV4dCkgewotCQl0aGlzLmNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBjaGVjayBib3gncyBpY29uOyB3aGljaCBieSBkZWZhdWx0IGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEljb24oSWNvbiBpY29uKSB7Ci0JCXRoaXMuY2hlY2tCb3guc2V0SWNvbihpY29uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlbmRlcmVyJ3MgcHJlZmVycmVkIGhlaWdodC4gVGhpcyBhbGxvd3MgeW91Ci0JICogdG8gc2V0IHRoZSB0YWJsZSdzIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBjaGVjayBib3gKLQkgKiB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJLy8gYWRkIGluIHNwYWNlIGZvciB0aGUgYm9yZGVyIHRvcCBhbmQgYm90dG9tCi0JCXJldHVybiAoaW50KSB0aGlzLmNoZWNrQm94LmdldFByZWZlcnJlZFNpemUoKS5nZXRIZWlnaHQoKSArIDI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Db21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Db21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWE0M2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29sb3I7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkJvcmRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tYm9Cb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLlN3aW5nQ29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLlVJTWFuYWdlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlBvcHVwTWVudUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBjb21iby1ib3guCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiBjYWNoaW5nIHRoZSBjb21ibyBib3ggYmVjYXVzZSB3ZSBhcmUgY2FjaGluZyB0aGUgY29tYm9Cb3hNb2RlbC4KLQkgKiBFdmVyeXRpbWUgd2UgcmVidWlsdCB0aGUgY29tYm9Cb3ggd2Ugd291bGQgc2V0IHRoZSBtb2RlbCBvbiBpdCBhbmQgbm90Ci0JICogcmVtb3ZlIHRoZSBtb2RlbCBmcm9tIHRoZSBvbGQgY29tYm8gYm94LiAgVGhpcyBtZWFudCB0aGF0IG5ldyBsaXN0ZW5lcnMKLQkgKiBrZXB0IGJlaW5nIGFkZGVkIHRvIHRoZSBjb21ib0JveE1vZGVsIGZvciBldmVyeSBjb21ib0JveCBidWlsZC4KLQkgKiBOb3Qgc3VyZSBpZiB0aGVyZSBpcyBhIHdheSB0byBjbGVhciBvdXQgdGhlIG9sZCBjb21ibyBib3gsIG9yIHdoeQotCSAqIHdlIHdlcmUgYnVpbGRpZyBhIG5ldyBjb21ibyBib3ggZXZlcnkgdGltZSBzbyBJIHdlbnQgd2l0aCBjYWNoaW5nIGl0LgotCSAqLwotCXByaXZhdGUgSkNvbWJvQm94IGNvbWJvQm94OwotCQotCS8qKiB0aGUgaXRlbXMgdXNlZCB0byBwb3B1bGF0ZSB0aGUgY29tYm8gYm94ICovCi0JcHJpdmF0ZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbDsKLQlwcml2YXRlIExpc3RDZWxsUmVuZGVyZXIgcmVuZGVyZXI7Ci0JT2JqZWN0IHZhbHVlOwotCXByaXZhdGUgc3RhdGljIGludCBoZWlnaHQgPSAtMTsKLQlib29sZWFuIGZha2VGb2N1c0ZsYWc7Ci0KLQkvKiogdGhlIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkIG9uIGFuIGltbWVkaWF0ZSBlZGl0ICovCi0JcHJvdGVjdGVkIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGltbWVkaWF0ZUVkaXRMaXN0ZW5lcjsKLQkKLQkvKiogaG9sZCB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3ggKi8KLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0Rm9yZWdyb3VuZDsKLQlwcml2YXRlIHN0YXRpYyBDb2xvciBkZWZhdWx0QmFja2dyb3VuZDsKLQotCS8qKiAibm9ybWFsIiBib3JkZXIgLSBhc3N1bWUgdGhlIGRlZmF1bHQgdGFibGUgImZvY3VzIiBib3JkZXIgaXMgMSBwaXhlbCB0aGljayAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBOT19GT0NVU19CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDEsIDEsIDEsIDEpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcigpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tYm8tYm94IG1vZGVsLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENvbWJvQm94TW9kZWwgbW9kZWwpIHsKLQkJdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjYWNoaW5nIGNvbWJvLWJveCBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDYWNoaW5nQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQl0aGlzKCk7Ci0JCXRoaXMubW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tYm8tYm94IG1vZGVsIGFuZCByZW5kZXJlci4KLQkgKi8KLQlwdWJsaWMgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcihDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobmV3IE5vbkNhY2hpbmdDb21ib0JveE1vZGVsKG1vZGVsKSwgcmVuZGVyZXIpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIHJlbmRlcmVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY2FjaGluZyBjb21iby1ib3ggbW9kZWwgYW5kIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsLCBMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMobW9kZWwpOwotCQl0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gc2F2ZSB0aGUgb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBjb21iby1ib3gsIHNvIHdlCi0JCS8vIGNhbiB1c2UgdGhlbSB0byBwYWludCBub24tc2VsZWN0ZWQgY2VsbHMKLQkJaWYgKGhlaWdodCA9PSAtMSkgewotCQkJSkNvbWJvQm94IGNiID0gbmV3IEpDb21ib0JveCgpOwotCQkJY2IuYWRkSXRlbSgibSIpOyAvLyROT04tTkxTLTEkCi0KLQkJCS8vIGFkZCBpbiBzcGFjZSBmb3IgdGhlIGJvcmRlciB0b3AgYW5kIGJvdHRvbQotCQkJaGVpZ2h0ID0gY2IuZ2V0UHJlZmVycmVkU2l6ZSgpLmhlaWdodCArIDI7Ci0KLQkJCWRlZmF1bHRGb3JlZ3JvdW5kID0gY2IuZ2V0Rm9yZWdyb3VuZCgpOwotCQkJZGVmYXVsdEJhY2tncm91bmQgPSBjYi5nZXRCYWNrZ3JvdW5kKCk7Ci0JCX0KLQl9Ci0KLSAgICBzdGF0aWMgSkxhYmVsIHByb3RvdHlwZUxhYmVsID0gbmV3IEpMYWJlbCgiUHJvdG90eXBlIiwgbmV3IEVtcHR5SWNvbigxNiksIFN3aW5nQ29uc3RhbnRzLkxFQURJTkcpOyAvLyROT04tTkxTLTEkCi0KLSAgICBwcm90ZWN0ZWQgSkNvbWJvQm94IGJ1aWxkQ29tYm9Cb3goKSB7Ci0KLQkJZmluYWwgSkNvbWJvQm94IHJlc3VsdCA9IG5ldyBKQ29tYm9Cb3goKSB7Ci0JCQlwcml2YXRlIGJvb2xlYW4gZmFrZUZvY3VzOwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNGb2N1cygpIHsKLQkJCQlyZXR1cm4gZmFrZUZvY3VzIHx8IHN1cGVyLmhhc0ZvY3VzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHBhaW50KEdyYXBoaWNzIGcpIHsKLQkJCQlmYWtlRm9jdXMgPSBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuZmFrZUZvY3VzRmxhZzsKLQkJCQlzdXBlci5wYWludChnKTsKLQkJCQlmYWtlRm9jdXMgPSBmYWxzZTsKLQkJCX0KLQkJCS8vd3JhcCB0aGUgcmVuZGVyZXIgdG8gZGVhbCB3aXRoIHRoZSBwcm90b3R5cGVEaXNwbGF5VmFsdWUKLQkJICAgIEBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0UmVuZGVyZXIoZmluYWwgTGlzdENlbGxSZW5kZXJlciBhUmVuZGVyZXIpIHsKLQkJICAgICAgICBzdXBlci5zZXRSZW5kZXJlcihuZXcgTGlzdENlbGxSZW5kZXJlcigpewotCQkgICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHYsIGludCBpbmRleCwgYm9vbGVhbiBpc1NlbGVjdGVkLCBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQkgICAgICAgICAgICAgICAgaWYgKHYgPT0gcHJvdG90eXBlTGFiZWwpIHsKLQkJICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvdG90eXBlTGFiZWw7Ci0JCSAgICAgICAgICAgICAgICB9Ci0JCSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdiwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cyk7Ci0JCSAgICAgICAgICAgIH0KLQkJICAgICAgICB9KTsKLQkJICAgIH0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGludCBnZXRTZWxlY3RlZEluZGV4KCkgewotCQkgICAgICAgIGJvb2xlYW4gbGlzdE5vdENhY2hlZCA9ICFsaXN0SXNDYWNoZWQoKTsKLQkJICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotCQkgICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJICAgICAgICB9Ci0JCSAgICAgICAgCi0JCQkJaW50IGluZGV4ID0gc3VwZXIuZ2V0U2VsZWN0ZWRJbmRleCgpOwotCi0JCSAgICAgICAgaWYgKGxpc3ROb3RDYWNoZWQpIHsKLQkJICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLQkJICAgICAgICB9Ci0JCQkJcmV0dXJuIGluZGV4OwotCQkgICB9Ci0KLQkJfTsKLQkJLy8gc3RvbGUgdGhpcyBjb2RlIGZyb20gamF2YXguc3dpbmcuRGVmYXVsdENlbGxFZGl0b3IKLQkJcmVzdWx0LnB1dENsaWVudFByb3BlcnR5KCJKQ29tYm9Cb3guaXNUYWJsZUNlbGxFZGl0b3IiLCBCb29sZWFuLlRSVUUpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hZGRBY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXJlc3VsdC5hZGRQb3B1cE1lbnVMaXN0ZW5lcih0aGlzLmJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSk7Ci0JCQotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHJlc3VsdC5zZXRQcm90b3R5cGVEaXNwbGF5VmFsdWUocHJvdG90eXBlTGFiZWwpOwotICAgICAgICBnZXRMaXN0Qm94KHJlc3VsdCkuc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHByb3RvdHlwZUxhYmVsKTsKLSAgICAgICAgCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotICAgIAotICAgIHByaXZhdGUgSkxpc3QgZ2V0TGlzdEJveChKQ29tYm9Cb3ggcmVzdWx0KSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHJlc3VsdC5nZXRVSSgpLCAibGlzdEJveCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0JCi0JcHJpdmF0ZSBBY3Rpb25MaXN0ZW5lciBidWlsZEFjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEFjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGUpIHsKLQkJCQlKQ29tYm9Cb3ggY2IgPSAoSkNvbWJvQm94KSBlLmdldFNvdXJjZSgpOwotCQkJCU9iamVjdCBzZWxlY3RlZEl0ZW0gPSBjYi5nZXRTZWxlY3RlZEl0ZW0oKTsKLQotCQkJCS8vIE9ubHkgdXBkYXRlIHRoZSBzZWxlY3RlZCBpdGVtIGFuZCBpbnZva2UgaW1tZWRpYXRlRWRpdCgpIGlmIHRoZQotCQkJCS8vIHNlbGVjdGVkIGl0ZW0gYWN0dWFsbHkgY2hhbmdlZCwgZHVyaW5nIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUKLQkJCQkvLyBlZGl0aW5nLCB0aGUgbW9kZWwgY2hhbmdlcyBhbmQgY2F1c2VzIHRoaXMgbWV0aG9kIHRvIGJlIGludm9rZWQsCi0JCQkJLy8gaXQgY2F1c2VzIENSIzM5NjM2NzUgdG8gb2NjdXIgYmVjYXVzZSBpbW1lZGlhdGVFZGl0KCkgc3RvcCB0aGUKLQkJCQkvLyBlZGl0aW5nLCB3aGljaCBpcyBkb25lIGF0IHRoZSB3cm9uZyB0aW1lCi0JCQkJaWYgKENvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy52YWx1ZSAhPSBzZWxlY3RlZEl0ZW0pIHsKLQkJCQkJQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlci50aGlzLnZhbHVlID0gY2IuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JCQkJCUNvbWJvQm94VGFibGVDZWxsUmVuZGVyZXIudGhpcy5pbW1lZGlhdGVFZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgaW1tZWRpYXRlRWRpdCgpIHsKLQkJaWYgKHRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyICE9IG51bGwpIHsKLQkJCXRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFBvcHVwTWVudUxpc3RlbmVyIGJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCQotCQkJcHVibGljIHZvaWQgcG9wdXBNZW51V2lsbEJlY29tZVZpc2libGUoUG9wdXBNZW51RXZlbnQgZSkgewotCQkJCWlmIChsaXN0SXNDYWNoZWQoKSkgewotCQkJCQl1bmNhY2hlTGlzdCgpOwotCQkJCX0KLQkJCQljYWNoZUxpc3QoKTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkgICAgICAgICAgICBpZiAobGlzdElzQ2FjaGVkKCkpIHsKLQkgICAgICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLQkgICAgICAgICAgICB9Ci0KLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVDYW5jZWxlZChQb3B1cE1lbnVFdmVudCBlKSB7Ci0JICAgICAgICAgICAgaWYgKGxpc3RJc0NhY2hlZCgpKSB7Ci0JICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0JICAgICAgICAgICAgfQotCQkJfQotCQl9OwotCX0KLQotCQotCXZvaWQgY2FjaGVMaXN0KCkgewotCQl0aGlzLm1vZGVsLmNhY2hlTGlzdCgpOwotCX0KLQkKLQl2b2lkIHVuY2FjaGVMaXN0KCkgewotCQl0aGlzLm1vZGVsLnVuY2FjaGVMaXN0KCk7Ci0JfQkKLQkKLQlib29sZWFuIGxpc3RJc0NhY2hlZCgpIHsKLQkJcmV0dXJuIHRoaXMubW9kZWwuaXNDYWNoZWQoKTsKLQl9Ci0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxSZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQ29tcG9uZW50IGdldFRhYmxlQ2VsbFJlbmRlcmVyQ29tcG9uZW50KEpUYWJsZSB0YWJsZSwgT2JqZWN0IHZhbCwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQl0aGlzLmZha2VGb2N1c0ZsYWcgPSBzZWxlY3RlZCB8fCBoYXNGb2N1czsKLQkJaWYgKHRoaXMuY29tYm9Cb3ggPT0gbnVsbCkgewotCQkJdGhpcy5jb21ib0JveCA9IHRoaXMuYnVpbGRDb21ib0JveCgpOwotCQotCQkJdGhpcy5jb21ib0JveC5zZXRDb21wb25lbnRPcmllbnRhdGlvbih0YWJsZS5nZXRDb21wb25lbnRPcmllbnRhdGlvbigpKTsKLQkJCXRoaXMuY29tYm9Cb3guc2V0TW9kZWwodGhpcy5tb2RlbCk7Ci0JCQlpZiAodGhpcy5yZW5kZXJlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb21ib0JveC5zZXRSZW5kZXJlcih0aGlzLnJlbmRlcmVyKTsKLQkJCX0KLQkJCXRoaXMuY29tYm9Cb3guc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQkJdGhpcy5jb21ib0JveC5zZXRFbmFibGVkKHRhYmxlLmlzRW5hYmxlZCgpKTsKLQkJCXRoaXMuY29tYm9Cb3guc2V0Qm9yZGVyKHRoaXMuYm9yZGVyKHRhYmxlLCB2YWwsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJfQotCi0JCS8vIFdlIG5lZWQgdG8gZ28gdGhyb3VnaCB0aGUgbW9kZWwgc2luY2UgSkNvbWJvQm94IG1pZ2h0IHByZXZlbnQgdXMgZnJvbQotCQkvLyBzZWxlY3RpbmcgdGhlIHZhbHVlLiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB0aGUgdmFsdWUgaXMgbm90IGNvbnRhaW5lZAotCQkvLyBpbiB0aGUgbW9kZWwsIHNlZSBDUiMzOTUwMDQ0IGZvciBhbiBleGFtcGxlCi0JCXRoaXMubW9kZWwuc2V0U2VsZWN0ZWRJdGVtKHZhbCk7Ci0KLQkJcmV0dXJuIHRoaXMuY29tYm9Cb3g7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRGb3JlZ3JvdW5kOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkZvcmVncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEZvcmVncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYmFja2dyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgYmFja2dyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWwsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQlpZiAoaGFzRm9jdXMgJiYgdGFibGUuaXNDZWxsRWRpdGFibGUocm93LCBjb2x1bW4pKSB7Ci0JCQkJcmV0dXJuIGRlZmF1bHRCYWNrZ3JvdW5kOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdEJhY2tncm91bmQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgYm9yZGVyLgotCSAqLwotCXByb3RlY3RlZCBCb3JkZXIgYm9yZGVyKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCByb3csIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgY29sdW1uKSB7Ci0JCXJldHVybiBoYXNGb2N1cyA/Ci0JCQlVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKSAvLyROT04tTkxTLTEkCi0JCToKLQkJCU5PX0ZPQ1VTX0JPUkRFUjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW1tZWRpYXRlRWRpdExpc3RlbmVyKFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuSW1tZWRpYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZW5kZXJlcidzIHByZWZlcnJlZCBoZWlnaHQuIFRoaXMgYWxsb3dzIHlvdQotCSAqIHRvIHNldCB0aGUgcm93IGhlaWdodCB0byBzb21ldGhpbmcgdGhlIGNvbWJvLWJveCB3aWxsIGxvb2sgZ29vZCBpbi4uLi4KLQkgKi8KLQlwdWJsaWMgaW50IHByZWZlcnJlZEhlaWdodCgpIHsKLQkJcmV0dXJuIGhlaWdodDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9EaXNwbGF5YWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRGlzcGxheWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzYWRiNy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9EaXNwbGF5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIFVzZWQgYnkgZ2VuZXJhbC1wdXJwb3NlIFVJIG1vZGVscyBhbmQgcmVuZGVyZXJzIHRvIGNhc3QKLSAqIGFwcGxpY2F0aW9uIG1vZGVsIG9iamVjdHMgdG8gc29tZXRoaW5nIGRpc3BsYXlhYmxlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc3BsYXlhYmxlCi0JZXh0ZW5kcyBNb2RlbAotewotCi0JLyoqCi0JICogUmV0dXJuIGEgc3RyaW5nIHRoYXQgY2FuIGJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGVsCi0JICogaW4gYSB0ZXh0dWFsIFVJIHNldHRpbmcgKHR5cGljYWxseSB0aGUgb2JqZWN0J3MgbmFtZSkuCi0JICogV2hlbiB0aGUgZGlzcGxheSBzdHJpbmcgY2hhbmdlcywgdGhlIG1vZGVsIHNob3VsZCBmaXJlCi0JICogdGhlIGFwcHJvcHJpYXRlIGNoYW5nZSBub3RpZmljYXRpb246Ci0JICogICAgIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkRGlzcGxheVN0cmluZywgdGhpcy5kaXNwbGF5U3RyaW5nKCkpOwotCSAqLwotCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCVN0cmluZyBESVNQTEFZX1NUUklOR19QUk9QRVJUWSA9ICJkaXNwbGF5U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIGFuIGljb24gdGhhdCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kZWwKLQkgKiBpbiBhIFVJIGNvbXBvbmVudCB0aGF0IHN1cHBvcnRzIGljb25zICh0aGUgaWNvbiBjYW4gYmUgbnVsbCkuCi0JICogV2hlbiB0aGUgaWNvbiBjaGFuZ2VzLCB0aGUgbW9kZWwgc2hvdWxkIGZpcmUKLQkgKiB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbjoKLQkgKiAgICAgdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElDT05fUFJPUEVSVFksIG9sZEljb24sIHRoaXMuaWNvbigpKTsKLQkgKi8KLQlJY29uIGljb24oKTsKLQkJU3RyaW5nIElDT05fUFJPUEVSVFkgPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRW1wdHlJY29uLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9FbXB0eUljb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0ZmJjZi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9FbXB0eUljb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyYXBoaWNzOwotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLS8qKgotICogSW1wbGVtZW50IHRoZSBJY29uIGludGVyZmFjZSB3aXRoIGFuIGljb24gdGhhdCBoYXMgYSBzaXplIGJ1dAotICogZG9lcyBub3QgcGFpbnQgYW55dGhpbmcgb24gdGhlIGdyYXBoaWNzIGNvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbXB0eUljb24KLQlpbXBsZW1lbnRzIEljb24KLXsKLQlwcml2YXRlIGZpbmFsIGludCB3aWR0aDsKLQlwcml2YXRlIGZpbmFsIGludCBoZWlnaHQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVtcHR5SWNvbiBOVUxMX0lOU1RBTkNFID0gbmV3IEVtcHR5SWNvbigwKTsKLQotCi0JcHVibGljIEVtcHR5SWNvbihpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy53aWR0aCA9IHdpZHRoOwotCQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQl9Ci0KLQlwdWJsaWMgRW1wdHlJY29uKGludCBzaXplKSB7Ci0JCXRoaXMoc2l6ZSwgc2l6ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEljb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgcGFpbnRJY29uKENvbXBvbmVudCBjLCBHcmFwaGljcyBnLCBpbnQgeCwgaW50IHkpIHsKLQkJLy8gZG9uJ3QgcGFpbnQgYW55dGhpbmcgZm9yIGFuIGVtcHR5IGljb24KLQl9Ci0KLQlwdWJsaWMgaW50IGdldEljb25XaWR0aCgpIHsgCi0JCXJldHVybiB0aGlzLndpZHRoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SWNvbkhlaWdodCgpIHsKLQkJcmV0dXJuIHRoaXMuaGVpZ2h0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdEJyb3dzZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RCcm93c2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZWU5YWEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdEJyb3dzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpPcHRpb25QYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIExvbmdMaXN0Q29tcG9uZW50LkJyb3dzZXIgdXNlcyBhCi0gKiBKT3B0aW9uUGFuZSB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIHRoZSBzZWxlY3Rpb24uIFRoZSBKT1B0aW9uUGFuZQotICogaXMgcGFzc2VkIGEgRmlsdGVyaW5nTGlzdFBhbmVsIHRvIGFzc2lzdCB0aGUgdXNlciBpbiBtYWtpbmcKLSAqIGEgc2VsZWN0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nTGlzdEJyb3dzZXI8VD4gCi0JaW1wbGVtZW50cyBMaXN0Q2hvb3Nlci5MaXN0QnJvd3NlciAKLXsKLQlwcml2YXRlIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBwYW5lbDsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEZpbHRlcmluZ0xpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBhbmVsID0gdGhpcy5idWlsZFBhbmVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBidWlsZFBhbmVsKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFQ+KCk7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0IHRoZSB1c2VyIHVzaW5nIGEgSk9wdGlvblBhbmUgd2l0aCBhIGZpbHRlcmluZwotCSAqIGxpc3QgcGFuZWwuCi0JICovCi0JcHVibGljIHZvaWQgYnJvd3NlKExpc3RDaG9vc2VyIGNob29zZXIpIHsJCi0JCXRoaXMuaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihjaG9vc2VyKTsKLQkJCi0JCWludCBvcHRpb24gPSAKLQkJCUpPcHRpb25QYW5lLnNob3dPcHRpb25EaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm9wdGlvblR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMubWVzc2FnZVR5cGUoY2hvb3NlciksIAotCQkJCXRoaXMuaWNvbihjaG9vc2VyKSwgCi0JCQkJdGhpcy5zZWxlY3Rpb25WYWx1ZXMoY2hvb3NlciksIAotCQkJCXRoaXMuaW5pdGlhbFNlbGVjdGlvblZhbHVlKGNob29zZXIpCi0JCSk7Ci0JCQotCQlpZiAob3B0aW9uID09IEpPcHRpb25QYW5lLk9LX09QVElPTikgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbSh0aGlzLnBhbmVsLnNlbGVjdGlvbigpKTsKLQkJfQotCQkKLQkJLy8gY2xlYXIgdGhlIHRleHQgZmllbGQgc28gdGhlIGxpc3QgYm94IGlzIHJlLWZpbHRlcmVkCi0JCXRoaXMucGFuZWwudGV4dEZpZWxkKCkuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNlbGxSZW5kZXJlcihKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJLy8gZGVmYXVsdCBiZWhhdmlvciBzaG91bGQgYmUgdG8gdXNlIHRoZSBjZWxsIHJlbmRlcmVyIGZyb20gdGhlIGNvbWJvYm94LgotCQl0aGlzLnBhbmVsLmxpc3RCb3goKS5zZXRDZWxsUmVuZGVyZXIoY29tYm9Cb3guZ2V0UmVuZGVyZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIG1lc3NhZ2UgY2FuIGJlIGFueXRoaW5nIC0gaGVyZSB3ZSBidWlsZCBhIGNvbXBvbmVudAotCSAqLwotCXByb3RlY3RlZCBPYmplY3QgbWVzc2FnZShKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJdGhpcy5wYW5lbC5zZXRDb21wbGV0ZUxpc3QodGhpcy5jb252ZXJ0VG9BcnJheShjb21ib0JveC5nZXRNb2RlbCgpKSk7Ci0JCXRoaXMucGFuZWwuc2V0U2VsZWN0aW9uKGNvbWJvQm94LmdldE1vZGVsKCkuZ2V0U2VsZWN0ZWRJdGVtKCkpOwotCQlyZXR1cm4gdGhpcy5wYW5lbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcHRpb25UeXBlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIEpPcHRpb25QYW5lLk9LX0NBTkNFTF9PUFRJT047Ci0JfQotCi0JcHJvdGVjdGVkIGludCBtZXNzYWdlVHlwZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBKT3B0aW9uUGFuZS5RVUVTVElPTl9NRVNTQUdFOwotCX0KLQotCXByb3RlY3RlZCBJY29uIGljb24oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uVmFsdWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBsaXN0IG9mIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsCi0JICogaW50byBhbiBhcnJheS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gY29udmVydFRvQXJyYXkoTGlzdE1vZGVsIG1vZGVsKSB7Ci0JCWludCBzaXplID0gbW9kZWwuZ2V0U2l6ZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzdWx0W2ldID0gbW9kZWwuZ2V0RWxlbWVudEF0KGkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY3VzdG9tIHBhbmVsICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsPFM+IGV4dGVuZHMgRmlsdGVyaW5nTGlzdFBhbmVsPFM+IHsKLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQkJcHJvdGVjdGVkIExvY2FsRmlsdGVyaW5nTGlzdFBhbmVsKCkgewotCQkJc3VwZXIoRU1QVFlfQVJSQVksIG51bGwpOwotCQl9Ci0JCi0JCS8qKgotCQkgKiBEaXNhYmxlIHRoZSBwZXJmb3JtYW5jZSB0d2VhayBiZWNhdXNlIEpPcHRpb25QYW5lCi0JCSAqIHdpbGwgdHJ5IG9wZW4gd2lkZSBlbm91Z2ggdG8gZGlzYWJsZSB0aGUgaG9yaXpvbnRhbCBzY3JvbGwgYmFyOwotCQkgKiBhbmQgaXQgbG9va3MgYSBiaXQgY2x1bXN5LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgcHJvdG90eXBlQ2VsbFZhbHVlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL0ZpbHRlcmluZ0xpc3RQYW5lbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODYwOGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvRmlsdGVyaW5nTGlzdFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuRm9udDsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdExpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KTGlzdDsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNjcm9sbFBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlRleHRGaWVsZDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0cmluZ01hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nTWF0Y2hlcjsKLQotLyoqCi0gKiBUaGlzIHBhbmVsIHByZXNlbnRzIGFuIGVudHJ5IGZpZWxkIGFuZCBhIGxpc3QgYm94IG9mIGNob2ljZXMgdGhhdAotICogYWxsb3dzIHRoZSB1c2VyIHRvIGZpbHRlciB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBib3ggYnkgZW50ZXJpbmcKLSAqIGEgcGF0dGVybiBpbiB0aGUgZW50cnkgZmllbGQuCi0gKiAKLSAqIEJ5IGRlZmF1bHQsIHR3byB3aWxkY2FyZHMgYXJlIGFsbG93ZWQgaW4gdGhlIHBhdHRlcm46Ci0gKiAJJyonIHdpbGwgbWF0Y2ggYW55IHNldCBvZiB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycwotICogCSc/JyB3aWxsIG1hdGNoIGFueSBzaW5nbGUgY2hhcmFjdGVyCi0gKiAKLSAqIFRoZSBwYW5lbCBjb25zaXN0cyBvZiA0IGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgY3VzdG9taXplZDoKLSAqIAktIDEgdGV4dCBmaWVsZAotICogCS0gMSBsaXN0IGJveAotICogCS0gMiBsYWJlbHMsIG9uZSBmb3IgZWFjaCBvZiB0aGUgYWJvdmUKLSAqIAotICogT3RoZXIgYXNwZWN0cyBvZiB0aGUgcGFuZWwncyBiZWhhdmlvciBjYW4gYmUgY2hhbmdlZDoKLSAqIAktIHRoZSBzdHJpbmcgY29udmVydGVyIGRldGVybWluZXMgaG93IHRoZSBvYmplY3RzIGluIHRoZQotICogCQlsaXN0IGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgY29tcGFyZWQgdG8gdGhlIHBhdHRlcm4KLSAqIAkJZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZDsgYnkgZGVmYXVsdCB0aGUgY29udmVydGVyIHNpbXBseQotICogCQl1c2VzIHRoZSByZXN1bHQgb2YgdGhlIG9iamVjdCdzICN0b1N0cmluZygpIG1ldGhvZAotICogCQkoaWYgeW91IHJlcGxhY2UgdGhlIHN0cmluZyBjb252ZXJ0ZXIsIHlvdSB3aWxsIHByb2JhYmx5Ci0gKiAJCXdhbnQgdG8gcmVwbGFjZSB0aGUgbGlzdCBib3gncyBjZWxsIHJlbmRlcmVyIGFsc28pCi0gKiAJLSB0aGUgc3RyaW5nIG1hdGNoZXIgY2FuIGFsc28gYmUgY2hhbmdlZCBpZiB5b3Ugd291bGQKLSAqIAkJbGlrZSBkaWZmZXJlbnQgcGF0dGVybiBtYXRjaGluZyBiZWhhdmlvciB0aGFuIHRoYXQKLSAqIAkJZGVzY3JpYmVkIGFib3ZlCi0gKiAJLSB5b3UgY2FuIHNwZWNpZnkgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbGlzdCAtIHRoaXMgbWF5Ci0gKiAJCWZvcmNlIHRoZSB1c2VyIHRvIGVudGVyIGEgcGF0dGVybiByZXN0cmljdGl2ZSBlbm91Z2gKLSAqIAkJdG8gcmVzdWx0IGluIGEgbGlzdCBzbWFsbGVyIHRoYW4gdGhlIG1heGltdW0gc2l6ZTsgdGhlCi0gKiAJCWRlZmF1bHQgaXMgLTEsIHdoaWNoIGRpc2FibGVzIHRoZSByZXN0cmljdGlvbgotICogCi0gKiBUaGlzIHBhbmVsIGlzIG5vdCBhIHR5cGljYWwgcGFuZWwsIGluIHRoZSBzZW5zZSB0aGF0IGl0IGRvZXMgbm90IHNoYXJlCi0gKiBpdHMgbW9kZWwgd2l0aCBjbGllbnRzIHZpYSB2YWx1ZSBtb2RlbHMuIEluc3RlYWQsIHRoaXMgcGFuZWwncyBtb2RlbAotICogaXMgc2V0IGFuZCBxdWVyaWVkIGRpcmVjdGx5IGJlY2F1c2UgaXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBpbiBhCi0gKiBkaWFsb2cgdGhhdCBkaXJlY3RzIHRoZSB1c2VyJ3MgYmVoYXZpb3IgKGFzIG9wcG9zZWQgdG8gYSAibm9ybWFsIgotICogd2luZG93KS4KLSAqLwotcHVibGljIGNsYXNzIEZpbHRlcmluZ0xpc3RQYW5lbDxUPiBleHRlbmRzIEpQYW5lbCB7Ci0KLQkvKioKLQkgKiBUaGUgY29tcGxldGUgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcwotCSAqIChhcyBvcHBvc2VkIHRvIHRoZSBwYXJ0aWFsIGxpc3QgaGVsZCBieSB0aGUgbGlzdCBib3gpLgotCSAqLwotCXByaXZhdGUgT2JqZWN0W10gY29tcGxldGVMaXN0OwotCi0JLyoqCi0JICogQW4gYWRhcHRlciB1c2VkIHRvIGNvbnZlcnQgdGhlIG9iamVjdHMgaW4gdGhlIGxpc3QKLQkgKiB0byBzdHJpbmdzIHNvIHRoZXkgY2FuIGJlIHJ1biB0aHJvdWdoIHRoZSBtYXRjaGVyCi0JICogYW5kIGRpc3BsYXllZCBpbiB0aGUgdGV4dCBmaWVsZC4KLQkgKi8KLQlTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyOwotCi0JLyoqIFRoZSB0ZXh0IGZpZWxkLiAqLwotCXByaXZhdGUgSlRleHRGaWVsZCB0ZXh0RmllbGQ7Ci0JcHJpdmF0ZSBKTGFiZWwgdGV4dEZpZWxkTGFiZWw7Ci0JcHJpdmF0ZSBEb2N1bWVudExpc3RlbmVyIHRleHRGaWVsZExpc3RlbmVyOwotCi0JLyoqIFRoZSBsaXN0IGJveC4gKi8KLQlwcml2YXRlIEpMaXN0IGxpc3RCb3g7Ci0JcHJpdmF0ZSBKTGFiZWwgbGlzdEJveExhYmVsOwotCi0JLyoqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIGRpc3BsYXllZCBpbiB0aGUgbGlzdCBib3guICovCi0JcHJpdmF0ZSBpbnQgbWF4TGlzdFNpemU7Ci0KLQkvKioKLQkgKiBUaGUgbWF0Y2hlciB1c2VkIHRvIGZpbHRlciB0aGUgbGlzdCBhZ2FpbnN0Ci0JICogdGhlIHBhdHRlcm4gZW50ZXJlZCBpbiB0aGUgdGV4dCBmaWVsZC4gQnkgZGVmYXVsdCwKLQkgKiB0aGlzIGFsbG93cyB0aGUgdHdvIHdpbGRjYXJkIGNoYXJhY3RlcnMgZGVzY3JpYmVkIGluCi0JICogdGhlIGNsYXNzIGNvbW1lbnQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdNYXRjaGVyIHN0cmluZ01hdGNoZXI7Ci0KLQkvKioKLQkgKiBQZXJmb3JtYW5jZSB0d2VhazogV2UgdXNlIHRoaXMgYnVmZmVyIGluc3RlYWQgb2YKLQkgKiBhIHRlbXBvcmFyeSB2YXJpYWJsZSBkdXJpbmcgZmlsdGVyaW5nIHNvIHdlIGRvbid0IGhhdmUKLQkgKiB0byBrZWVwIHJlLWFsbG9jYXRpbmcgaXQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBidWZmZXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb3JkZXIgVEVYVF9GSUVMRF9MQUJFTF9CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDAsIDAsIDUsIDApOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEJvcmRlciBMSVNUX0JPWF9MQUJFTF9CT1JERVIgPSBCb3JkZXJGYWN0b3J5LmNyZWF0ZUVtcHR5Qm9yZGVyKDUsIDAsIDUsIDApOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBGaWx0ZXJpbmdMaXN0UGFuZWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgY2hvaWNlcwotCSAqIGFuZCBpbml0aWFsIHNlbGVjdGlvbi4gVXNlIHRoZSBkZWZhdWx0IHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUKLQkgKiBjaG9pY2VzIGFuZCBzZWxlY3Rpb24gdG8gc3RyaW5ncyAod2hpY2ggc2ltcGx5IGNhbGxzICN0b1N0cmluZygpIG9uCi0JICogdGhlIG9iamVjdHMpLgotCSAqLwotCXB1YmxpYyBGaWx0ZXJpbmdMaXN0UGFuZWwoT2JqZWN0W10gY29tcGxldGVMaXN0LCBPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQl0aGlzKGNvbXBsZXRlTGlzdCwgaW5pdGlhbFNlbGVjdGlvbiwgU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuPFQ+aW5zdGFuY2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgRmlsdGVyaW5nTGlzdFBhbmVsIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNob2ljZXMKLQkgKiBhbmQgaW5pdGlhbCBzZWxlY3Rpb24uIFVzZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBjb252ZXJ0ZXIgdG8gY29udmVydCB0aGUKLQkgKiBjaG9pY2VzIGFuZCBzZWxlY3Rpb24gdG8gc3RyaW5ncy4KLQkgKi8KLQlwdWJsaWMgRmlsdGVyaW5nTGlzdFBhbmVsKE9iamVjdFtdIGNvbXBsZXRlTGlzdCwgT2JqZWN0IGluaXRpYWxTZWxlY3Rpb24sIFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIpIHsKLQkJc3VwZXIobmV3IEJvcmRlckxheW91dCgpKTsKLQkJdGhpcy5jb21wbGV0ZUxpc3QgPSBjb21wbGV0ZUxpc3Q7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCQl0aGlzLmluaXRpYWxpemUoaW5pdGlhbFNlbGVjdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKE9iamVjdCBpbml0aWFsU2VsZWN0aW9uKSB7Ci0JCXRoaXMubWF4TGlzdFNpemUgPSB0aGlzLmRlZmF1bHRNYXhMaXN0U2l6ZSgpOwotCQl0aGlzLmJ1ZmZlciA9IHRoaXMuYnVpbGRCdWZmZXIoKTsKLQotCQl0aGlzLnRleHRGaWVsZExpc3RlbmVyID0gdGhpcy5idWlsZFRleHRGaWVsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5zdHJpbmdNYXRjaGVyID0gdGhpcy5idWlsZFN0cmluZ01hdGNoZXIoKTsKLQotCQl0aGlzLmluaXRpYWxpemVMYXlvdXQoaW5pdGlhbFNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZEJ1ZmZlcigpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbdGhpcy5tYXgoKV07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG1heCBudW1iZXIgb2YgZW50cmllcyBhbGxvd2VkIGluIHRoZSBsaXN0IGJveC4KLQkgKi8KLQlwcml2YXRlIGludCBtYXgoKSB7Ci0JCWlmICh0aGlzLm1heExpc3RTaXplID09IC0xKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb21wbGV0ZUxpc3QubGVuZ3RoOwotCQl9Ci0JCXJldHVybiBNYXRoLm1pbih0aGlzLm1heExpc3RTaXplLCB0aGlzLmNvbXBsZXRlTGlzdC5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbGlzdGVuZXIgdGhhdCB3aWxsIGxpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSB0ZXh0IGZpZWxkCi0JICogYW5kIGZpbHRlciB0aGUgbGlzdCBhcHByb3ByaWF0ZWx5LgotCSAqLwotCXByaXZhdGUgRG9jdW1lbnRMaXN0ZW5lciBidWlsZFRleHRGaWVsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5maWx0ZXJMaXN0KCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmVVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nTGlzdFBhbmVsLnRoaXMuZmlsdGVyTGlzdCgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAidGV4dCBmaWVsZCBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGludCBkZWZhdWx0TWF4TGlzdFNpemUoKSB7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ01hdGNoZXIgYnVpbGRTdHJpbmdNYXRjaGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVN0cmluZ01hdGNoZXI8VD4oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUxheW91dChPYmplY3QgaW5pdGlhbFNlbGVjdGlvbikgewotCQkvLyB0ZXh0IGZpZWxkCi0JCUpQYW5lbCB0ZXh0RmllbGRQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbCA9IG5ldyBKTGFiZWwoKTsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRCb3JkZXIoVEVYVF9GSUVMRF9MQUJFTF9CT1JERVIpOwotCQl0ZXh0RmllbGRQYW5lbC5hZGQodGhpcy50ZXh0RmllbGRMYWJlbCwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQotCQl0aGlzLnRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKCk7Ci0JCXRoaXMudGV4dEZpZWxkLmdldERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzLnRleHRGaWVsZExpc3RlbmVyKTsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRMYWJlbEZvcih0aGlzLnRleHRGaWVsZCk7Ci0JCXRleHRGaWVsZFBhbmVsLmFkZCh0aGlzLnRleHRGaWVsZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0KLQkJdGhpcy5hZGQodGV4dEZpZWxkUGFuZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJLy8gbGlzdCBib3gKLQkJSlBhbmVsIGxpc3RCb3hQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJdGhpcy5saXN0Qm94TGFiZWwgPSBuZXcgSkxhYmVsKCk7Ci0JCXRoaXMubGlzdEJveExhYmVsLnNldEJvcmRlcihMSVNUX0JPWF9MQUJFTF9CT1JERVIpOwotCQlsaXN0Qm94UGFuZWwuYWRkKHRoaXMubGlzdEJveExhYmVsLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCi0JCXRoaXMubGlzdEJveCA9IG5ldyBKTGlzdCgpOwotCQl0aGlzLmxpc3RCb3guc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCXRoaXMubGlzdEJveC5zZXRNb2RlbCh0aGlzLmJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKHRoaXMuY29tcGxldGVMaXN0LCB0aGlzLm1heCgpKSk7Ci0JCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOwotCQkvLyBwZXJmb3JtYW5jZSB0d2Vhayg/KQotCQl0aGlzLmxpc3RCb3guc2V0UHJvdG90eXBlQ2VsbFZhbHVlKHRoaXMucHJvdG90eXBlQ2VsbFZhbHVlKCkpOwotCQl0aGlzLmxpc3RCb3guc2V0UHJvdG90eXBlQ2VsbFZhbHVlKG51bGwpOwotCQl0aGlzLmxpc3RCb3guc2V0Q2VsbFJlbmRlcmVyKHRoaXMuYnVpbGREZWZhdWx0Q2VsbFJlbmRlcmVyKCkpOwotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRMYWJlbEZvcih0aGlzLmxpc3RCb3gpOwotCQkvLyBidWcgMjc3NzgwMiAtIHNjcm9sbCBiYXJzIHNob3VsZG4ndCBiZSBvbiB0aGUgdGFiIHNlcXVlbmNlCi0JCUpTY3JvbGxQYW5lIGxpc3RCb3hTY3JvbGxQYW5lID0gbmV3IEpTY3JvbGxQYW5lKHRoaXMubGlzdEJveCk7Ci0JCWxpc3RCb3hTY3JvbGxQYW5lLmdldEhvcml6b250YWxTY3JvbGxCYXIoKS5zZXRGb2N1c2FibGUoZmFsc2UpOwotCQlsaXN0Qm94U2Nyb2xsUGFuZS5nZXRWZXJ0aWNhbFNjcm9sbEJhcigpLnNldEZvY3VzYWJsZShmYWxzZSk7Ci0JCWxpc3RCb3hQYW5lbC5hZGQobGlzdEJveFNjcm9sbFBhbmUsIEJvcmRlckxheW91dC5DRU5URVIpOwotCi0JCS8vIGluaXRpYWxpemUgdGhlIHdpZGdldHMKLQkJdGhpcy5saXN0Qm94LnNldFNlbGVjdGVkVmFsdWUoaW5pdGlhbFNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCXRoaXMudGV4dEZpZWxkLnNlbGVjdCgwLCB0aGlzLnRleHRGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkpOwotCi0JCXRoaXMuYWRkKGxpc3RCb3hQYW5lbCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBBUEkgKioqKioqKioqKgotCi0JcHVibGljIE9iamVjdCBzZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RCb3guZ2V0U2VsZWN0ZWRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCXRoaXMubGlzdEJveC5zZXRTZWxlY3RlZFZhbHVlKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGNvbXBsZXRlTGlzdCgpIHsKLQkJcmV0dXJuIHRoaXMuY29tcGxldGVMaXN0OwotCX0KLQotCS8qKgotCSAqIHJlYnVpbGQgdGhlIGZpbHRlcmluZyBidWZmZXIgYW5kIHJlLWFwcGx5IHRoZSBmaWx0ZXIKLQkgKiB0byB0aGUgbmV3IGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wbGV0ZUxpc3QoT2JqZWN0W10gY29tcGxldGVMaXN0KSB7Ci0JCXRoaXMuY29tcGxldGVMaXN0ID0gY29tcGxldGVMaXN0OwotCQlpZiAodGhpcy5idWZmZXIubGVuZ3RoIDwgdGhpcy5tYXgoKSkgewotCQkJLy8gdGhlIGJ1ZmZlciB3aWxsIG5ldmVyIHNocmluayAtIG1pZ2h0IHdhbnQgdG8gcmUtY29uc2lkZXIuLi4gIH5ianYKLQkJCXRoaXMuYnVmZmVyID0gdGhpcy5idWlsZEJ1ZmZlcigpOwotCQl9Ci0JCXRoaXMuZmlsdGVyTGlzdCgpOwotCX0KLQotCXB1YmxpYyBpbnQgbWF4TGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLm1heExpc3RTaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1heExpc3RTaXplKGludCBtYXhMaXN0U2l6ZSkgewotCQl0aGlzLm1heExpc3RTaXplID0gbWF4TGlzdFNpemU7Ci0JCWlmICh0aGlzLmJ1ZmZlci5sZW5ndGggPCB0aGlzLm1heCgpKSB7Ci0JCQkvLyB0aGUgYnVmZmVyIHdpbGwgbmV2ZXIgc2hyaW5rIC0gbWlnaHQgd2FudCB0byByZS1jb25zaWRlci4uLiAgfmJqdgotCQkJdGhpcy5idWZmZXIgPSB0aGlzLmJ1aWxkQnVmZmVyKCk7Ci0JCX0KLQkJdGhpcy5maWx0ZXJMaXN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ0NvbnZlcnRlcjxUPiBzdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmluZ0NvbnZlcnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBhcHBseSB0aGUgbmV3IGZpbHRlciB0byB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmluZ0NvbnZlcnRlcihTdHJpbmdDb252ZXJ0ZXI8VD4gc3RyaW5nQ29udmVydGVyKSB7Ci0JCXRoaXMuc3RyaW5nQ29udmVydGVyID0gc3RyaW5nQ29udmVydGVyOwotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIHRleHQgZmllbGQKLQkgKiAoc28gd2UgY2FuIHNldCB0aGUgZm9jdXMpCi0JICovCi0JcHVibGljIEpUZXh0RmllbGQgdGV4dEZpZWxkKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0RmllbGQ7Ci0JfQotCi0JLyoqCi0JICogYWxsb3cgY2xpZW50IGNvZGUgdG8gYWNjZXNzIHRoZSB0ZXh0IGZpZWxkIGxhYmVsCi0JICovCi0JcHVibGljIEpMYWJlbCB0ZXh0RmllbGRMYWJlbCgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dEZpZWxkTGFiZWw7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEZpZWxkTGFiZWxUZXh0KFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMudGV4dEZpZWxkTGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBhbGxvdyBjbGllbnQgY29kZSB0byBhY2Nlc3MgdGhlIGxpc3QgYm94Ci0JICogKHNvIHdlIGNhbiBhZGQgbW91c2UgbGlzdGVuZXJzIGZvciBkb3VibGUtY2xpY2tpbmcpCi0JICovCi0JcHVibGljIEpMaXN0IGxpc3RCb3goKSB7Ci0JCXJldHVybiB0aGlzLmxpc3RCb3g7Ci0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdEJveENlbGxSZW5kZXJlcihMaXN0Q2VsbFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMubGlzdEJveC5zZXRDZWxsUmVuZGVyZXIocmVuZGVyZXIpOwotCX0KLQotCS8qKgotCSAqIGFsbG93IGNsaWVudCBjb2RlIHRvIGFjY2VzcyB0aGUgbGlzdCBib3ggbGFiZWwKLQkgKi8KLQlwdWJsaWMgSkxhYmVsIGxpc3RCb3hMYWJlbCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEJveExhYmVsOwotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RCb3hMYWJlbFRleHQoU3RyaW5nIHRleHQpIHsKLQkJdGhpcy5saXN0Qm94TGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRzRm9udChGb250IGZvbnQpIHsKLQkJdGhpcy50ZXh0RmllbGRMYWJlbC5zZXRGb250KGZvbnQpOwotCQl0aGlzLnRleHRGaWVsZC5zZXRGb250KGZvbnQpOwotCQl0aGlzLmxpc3RCb3hMYWJlbC5zZXRGb250KGZvbnQpOwotCQl0aGlzLmxpc3RCb3guc2V0Rm9udChmb250KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nTWF0Y2hlciBzdHJpbmdNYXRjaGVyKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpbmdNYXRjaGVyOwotCX0KLQotCS8qKgotCSAqIHJlLWFwcGx5IHRoZSBmaWx0ZXIgdG8gdGhlIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJpbmdNYXRjaGVyKFN0cmluZ01hdGNoZXIgc3RyaW5nTWF0Y2hlcikgewotCQl0aGlzLnN0cmluZ01hdGNoZXIgPSBzdHJpbmdNYXRjaGVyOwotCQl0aGlzLmZpbHRlckxpc3QoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvdyBzdWJjbGFzc2VzIHRvIGRpc2FibGUgcGVyZm9ybWFuY2UgdHdlYWsKLQkgKiBieSByZXR1cm5pbmcgbnVsbCBoZXJlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvdG90eXBlQ2VsbFZhbHVlKCkgewotCQlyZXR1cm4gIj09PT09PT09PT0+IEFfU1RSSU5HX1RIQVRfSVNfREVGSU5JVEVMWV9MT05HRVJfVEhBTl9FVkVSWV9TVFJJTkdfSU5fVEhFX0xJU1QgPD09PT09PT09PT0iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgdXNlIHRoZSBzdHJpbmcgY29udmVydGVyIHRvIGJ1aWxkIHRoZSB0ZXh0Ci0JICogdXNlZCBieSB0aGUgbGlzdCBib3gncyBjZWxsIHJlbmRlcmVyLgotCSAqLwotCXByb3RlY3RlZCBMaXN0Q2VsbFJlbmRlcmVyIGJ1aWxkRGVmYXVsdENlbGxSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0Q2VsbFJlbmRlcmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBGaWx0ZXJpbmdMaXN0UGFuZWwudGhpcy5zdHJpbmdDb252ZXJ0ZXIuY29udmVydFRvU3RyaW5nKChUKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogU29tZXRoaW5nIGhhcyBjaGFuZ2VkIHRoYXQgcmVxdWlyZXMgdXMgdG8gZmlsdGVyIHRoZSBsaXN0LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIHN5bmNocm9uaXplZCBiZWNhdXNlIGEgZmFzdCB0eXBpc3QgY2FuCi0JICogZ2VuZXJhdGUgZXZlbnRzIHF1aWNrZXIgdGhhbiB3ZSBjYW4gZmlsdGVyIHRoZSBsaXN0LiAoPyAgfmJqdikKLQkgKi8KLQlzeW5jaHJvbml6ZWQgdm9pZCBmaWx0ZXJMaXN0KCkgewotCQkvLyB0ZW1wb3JhcmlseSBzdG9wIGxpc3RlbmluZyB0byB0aGUgbGlzdCBib3ggc2VsZWN0aW9uLCBzaW5jZSB3ZSB3aWxsCi0JCS8vIGJlIGNoYW5naW5nIHRoZSBzZWxlY3Rpb24gZHVyaW5nIHRoZSBmaWx0ZXJpbmcgYW5kIGRvbid0IHdhbnQKLQkJLy8gdGhhdCB0byBhZmZlY3QgdGhlIHRleHQgZmllbGQKLQkJdGhpcy5maWx0ZXJMaXN0KHRoaXMudGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JfQotCi0JLyoqCi0JICogRmlsdGVyIHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCBib3ggdG8gbWF0Y2ggdGhlCi0JICogc3BlY2lmaWVkIHBhdHRlcm4uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpbHRlckxpc3QoU3RyaW5nIHBhdHRlcm4pIHsKLQkJaWYgKHBhdHRlcm4ubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LnNldE1vZGVsKHRoaXMuYnVpbGRQYXJ0aWFsQXJyYXlMaXN0TW9kZWwodGhpcy5jb21wbGV0ZUxpc3QsIHRoaXMubWF4KCkpKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc3RyaW5nTWF0Y2hlci5zZXRQYXR0ZXJuU3RyaW5nKHBhdHRlcm4pOwotCQkJaW50IGogPSAwOwotCQkJaW50IGxlbiA9IHRoaXMuY29tcGxldGVMaXN0Lmxlbmd0aDsKLQkJCWludCBtYXggPSB0aGlzLm1heCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWlmICh0aGlzLnN0cmluZ01hdGNoZXIubWF0Y2hlcyh0aGlzLnN0cmluZ0NvbnZlcnRlci5jb252ZXJ0VG9TdHJpbmcodGhpcy5lbnRyeShpKSkpKSB7Ci0JCQkJCXRoaXMuYnVmZmVyW2orK10gPSB0aGlzLmNvbXBsZXRlTGlzdFtpXTsKLQkJCQl9Ci0JCQkJaWYgKGogPT0gbWF4KSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXRoaXMubGlzdEJveC5zZXRNb2RlbCh0aGlzLmJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKHRoaXMuYnVmZmVyLCBqKSk7Ci0JCX0KLQotCQkvLyBhZnRlciBmaWx0ZXJpbmcgdGhlIGxpc3QsIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgc2VsZWN0aW9uCi0JCWlmICh0aGlzLmxpc3RCb3guZ2V0TW9kZWwoKS5nZXRTaXplKCkgPT0gMCkgewotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuY2xlYXJTZWxlY3Rpb24oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMubGlzdEJveC5nZXRTZWxlY3Rpb25Nb2RlbCgpLnNldEFuY2hvclNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmdldFNlbGVjdGlvbk1vZGVsKCkuc2V0TGVhZFNlbGVjdGlvbkluZGV4KDApOwotCQkJdGhpcy5saXN0Qm94LmVuc3VyZUluZGV4SXNWaXNpYmxlKDApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgVCBlbnRyeShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChUKSB0aGlzLmNvbXBsZXRlTGlzdFtpbmRleF07Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBsaXN0IG1vZGVsIHRoYXQgd3JhcHMgb25seSBhIHBvcnRpb24gb2YgdGhlIHNwZWNpZmllZCBhcnJheS4KLQkgKiBUaGUgbW9kZWwgd2lsbCBpbmNsdWRlIHRoZSBhcnJheSBlbnRyaWVzIGZyb20gMCB0byAoc2l6ZSAtIDEpLgotCSAqLwotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkUGFydGlhbEFycmF5TGlzdE1vZGVsKGZpbmFsIE9iamVjdFtdIGFycmF5LCBmaW5hbCBpbnQgc2l6ZSkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0TGlzdE1vZGVsKCkgewotCQkJcHVibGljIGludCBnZXRTaXplKCkgewotCQkJCXJldHVybiBzaXplOwotCQkJfQotCQkJcHVibGljIE9iamVjdCBnZXRFbGVtZW50QXQoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGFycmF5W2luZGV4XTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTGlzdENob29zZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRiYWQyMy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9MaXN0Q2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQVdURXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuQVdURXhjZXB0aW9uOwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOwotaW1wb3J0IGphdmEuYXd0LlBvaW50OwotaW1wb3J0IGphdmEuYXd0LlJvYm90OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LktleUFkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuTW91c2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNvbWJvQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxhYmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3dpbmdDb25zdGFudHM7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuUG9wdXBNZW51TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcucGxhZi5iYXNpYy5CYXNpY0NvbWJvQm94VUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLQotLyoqCi0gKiBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhIHdheSB0byBoYW5kbGUgc2VsZWN0aW5nIGFuIGl0ZW0gZnJvbSBhCi0gKiBsaXN0IHRoYXQgbWF5IGdyb3cgdG9vIGxhcmdlIHRvIGJlIGhhbmRsZWQgY29udmVuaWVudGx5IGJ5IGEgY29tYm8tYm94LiAKLSAqIElmIHRoZSBsaXN0J3Mgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGRlc2lnbmF0ZWQgImxvbmciIGxpc3Qgc2l6ZSwgCi0gKiB0aGUgY2hvaWNlIGxpc3Qgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gYSBub3JtYWwgY29tYm8tYm94IHBvcHVwOyAKLSAqIG90aGVyd2lzZSwgYSBkaWFsb2cgd2lsbCBiZSB1c2VkIHRvIHByb21wdCB0aGUgdXNlciB0byBjaG9vc2UgYSBzZWxlY3Rpb24uCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgYnJvd3NlIG1lY2hhbmlzbSwgc3ViY2xhc3NlcyBtYXkgCi0gKiAJLSBvdmVycmlkZSB0aGUgbWV0aG9kICNidWlsZEJyb3dzZXIoKQotICogIC0gb3ZlcnJpZGUgdGhlIG1ldGhvZCAjYnJvd3NlKCksIGluIHdoaWNoIGNhc2UgdGhlIG1ldGhvZCAKLSAqIAkJI2J1aWxkQnJvd3NlcigpIG1heSBiZSBpZ25vcmVkLgotICovCi1wdWJsaWMgY2xhc3MgTGlzdENob29zZXIgCi0JZXh0ZW5kcyBKQ29tYm9Cb3gKLXsKLQkKLQkvKiogdGhlIHNpemUgb2YgYSAibG9uZyIgbGlzdCAtIGFueXRoaW5nIHNtYWxsZXIgaXMgYSAic2hvcnQiIGxpc3QgKi8KLQlpbnQgbG9uZ0xpc3RTaXplID0gREVGQVVMVF9MT05HX0xJU1RfU0laRTsKLQkKLQkvKiogdGhlIGRlZmF1bHQgc2l6ZSBvZiBhICJsb25nIiBsaXN0LCB3aGljaCBpcyAyMCAodG8gbWF0Y2ggSk9wdGlvblBhbmUncyBiZWhhdmlvcikgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0xPTkdfTElTVF9TSVpFID0gMjA7Ci0JCi0JLyoqIHByb3BlcnR5IGNoYW5nZSBhc3NvY2lhdGVkIHdpdGggbG9uZyBsaXN0IHNpemUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT05HX0xJU1RfU0laRV9QUk9QRVJUWSA9ICJsb25nTGlzdFNpemUiOyAvLyROT04tTkxTLTEkCi0JCi0gICAgc3RhdGljIEpMYWJlbCBwcm90b3R5cGVMYWJlbCA9IG5ldyBKTGFiZWwoIlByb3RvdHlwZSIsIG5ldyBFbXB0eUljb24oMTcpLCBTd2luZ0NvbnN0YW50cy5MRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqIAotCSAqIHdoZXRoZXIgdGhlIGNob29zZXIgaXMgY2hvb3NhYmxlLiAgaWYgYSBjaG9vc2VyIGlzIG5vdCBjaG9vc2FibGUsCi0JICogaXQgb25seSBzZXJ2ZXMgYXMgYSBkaXNwbGF5IHdpZGdldC4gIGEgdXNlciBtYXkgbm90IGNoYW5nZSBpdHMgCi0JICogc2VsZWN0ZWQgdmFsdWUuCi0JICovCi0JYm9vbGVhbiBjaG9vc2FibGUgPSB0cnVlOwotCQotCS8qKiBwcm9wZXJ0eSBjaGFuZ2UgYXNzb2NpYXRlZCB3aXRoIGNob29zYWJsZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TQUJMRV9QUk9QRVJUWSA9ICJjaG9vc2FibGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIHRoZSBicm93c2VyIHVzZWQgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBsb25nIGxpc3QgLSB0eXBpY2FsbHkgdmlhIGEgZGlhbG9nICovCi0JcHJpdmF0ZSBMaXN0QnJvd3NlciBicm93c2VyOwotCQotICAgIHByaXZhdGUgTm9kZVNlbGVjdG9yIG5vZGVTZWxlY3RvcjsKLSAgICAKLQkvKiogSU5URVJOQUwgLSBUaGUgcG9wdXAgaXMgYmVpbmcgc2hvd24uICBVc2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcC4gKi8KLQlib29sZWFuIHBvcHVwQWxyZWFkeUluUHJvZ3Jlc3M7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBDb25zdHJ1Y3RvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaG9vc2VyIGZvciB0aGUgc3BlY2lmaWVkIG1vZGVsLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hvb3NlcihDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLQl9Ci0JCi0gICAgcHVibGljIExpc3RDaG9vc2VyKENhY2hpbmdDb21ib0JveE1vZGVsIG1vZGVsKSB7Ci0gICAgICAgIHRoaXMobW9kZWwsIG5ldyBOb2RlU2VsZWN0b3IuRGVmYXVsdE5vZGVTZWxlY3RvcigpKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIExpc3RDaG9vc2VyKENvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgdGhpcyhuZXcgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwobW9kZWwpLCBub2RlU2VsZWN0b3IpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgTGlzdENob29zZXIoQ2FjaGluZ0NvbWJvQm94TW9kZWwgbW9kZWwsIE5vZGVTZWxlY3RvciBub2RlU2VsZWN0b3IpIHsKLSAgICAgICAgc3VwZXIobW9kZWwpOwotICAgICAgICB0aGlzLmluaXRpYWxpemUoKTsKLSAgICAgICAgdGhpcy5ub2RlU2VsZWN0b3IgPSBub2RlU2VsZWN0b3I7Ci0gICAgfQotCS8vICoqKioqKioqKioqKioqKiogSW5pdGlhbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuYWRkUG9wdXBNZW51TGlzdGVuZXIodGhpcy5idWlsZFBvcHVwTWVudUxpc3RlbmVyKCkpOwotCQl0aGlzLnNldFJlbmRlcmVyKG5ldyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlcigpKTsKLSAgICAgICAgdGhpcy5hZGRLZXlMaXN0ZW5lcihidWlsZEYzS2V5TGlzdGVuZXIoKSk7Ci0gICAgICAgIAotICAgICAgICAvL1RoZXNlIGFyZSB1c2VkIHRvIHdvcmthcm91bmQgcHJvYmxlbXMgd2l0aCBTd2luZyB0cnlpbmcgdG8gCi0gICAgICAgIC8vZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGEgY29tYm9Cb3ggd2l0aCBhIGxhcmdlIG1vZGVsCi0gICAgICAgIHNldFByb3RvdHlwZURpc3BsYXlWYWx1ZShwcm90b3R5cGVMYWJlbCk7Ci0gICAgICAgIGxpc3RCb3goKS5zZXRQcm90b3R5cGVDZWxsVmFsdWUocHJvdG90eXBlTGFiZWwpOwotCX0KLQkKLSAgICAKLSAgICBwcml2YXRlIEpMaXN0IGxpc3RCb3goKSB7Ci0gICAgICAgIHJldHVybiAoSkxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHRoaXMudWksICJsaXN0Qm94Iik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgCi0JLyoqIAotCSAqIFdoZW4gdGhlIHBvcHVwIGlzIGFib3V0IHRvIGJlIHNob3duLCB0aGUgZXZlbnQgaXMgY29uc3VtZWQsIGFuZCAKLQkgKiBQb3B1cEhhbmRsZXIgZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIHJlc2hvdyB0aGUgcG9wdXAgb3IgdG8gc2hvdwotCSAqIHRoZSBsb25nIGxpc3QgYnJvd3Nlci4KLQkgKi8KLQlwcml2YXRlIFBvcHVwTWVudUxpc3RlbmVyIGJ1aWxkUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUG9wdXBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lVmlzaWJsZShQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJTGlzdENob29zZXIudGhpcy5hYm91dFRvU2hvd1BvcHVwKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVXaWxsQmVjb21lSW52aXNpYmxlKFBvcHVwTWVudUV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBwb3B1cE1lbnVDYW5jZWxlZChQb3B1cE1lbnVFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAicG9wLXVwIG1lbnUgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIElmIHRoaXMgY29kZSBpcyBiZWluZyByZWFjaGVkIGR1ZSB0byB0aGUgUG9wdXBIYW5kbGVyIGFscmVhZHkgYmVpbmcgaW4gcHJvZ3Jlc3MsCi0JICogdGhlbiBkbyBub3RoaW5nLiAgT3RoZXJ3aXNlLCBzZXQgdGhlIGZsYWcgdG8gdHJ1ZSBhbmQgbGF1bmNoIHRoZSBQb3B1cEhhbmRsZXIuCi0JICovCi0Jdm9pZCBhYm91dFRvU2hvd1BvcHVwKCkgewotCQlpZiAodGhpcy5wb3B1cEFscmVhZHlJblByb2dyZXNzKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IHRydWU7Ci0JCUV2ZW50UXVldWUuaW52b2tlTGF0ZXIobmV3IFBvcHVwSGFuZGxlcigpKTsKLQl9Ci0gCi0gICAgCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBidWlsZEYzS2V5TGlzdGVuZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgS2V5QWRhcHRlcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGUuZ2V0S2V5Q29kZSgpID09IEtleUV2ZW50LlZLX0YzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdvVG9TZWxlY3RlZEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRjMga2V5IGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotICAgICAgICB9OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBnb1RvU2VsZWN0ZWRJdGVtKCkgewotICAgICAgICBpZiAoZ2V0U2VsZWN0ZWRJdGVtKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgTGlzdENob29zZXIudGhpcy5ub2RlU2VsZWN0b3Iuc2VsZWN0Tm9kZUZvcihnZXRTZWxlY3RlZEl0ZW0oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBCcm93c2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqIAotCSAqIExhemlseSBpbml0aWFsaXplIGJlY2F1c2Ugc3ViY2xhc3NlcyBtYXkgaGF2ZSBmdXJ0aGVyIGluaXRpYWxpemF0aW9uIHRvIGRvCi0JICogYmVmb3JlIGJyb3dzZXIgY2FuIGJlIGJ1aWx0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJyb3dzZSgpIHsKLQkJaWYgKHRoaXMuYnJvd3NlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmJyb3dzZXIgPSB0aGlzLmJ1aWxkQnJvd3NlcigpOwotCQl9Ci0JCQotCQl0aGlzLmJyb3dzZXIuYnJvd3NlKHRoaXMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlICJicm93c2VyIiB1c2VkIHRvIG1ha2UgYSBzZWxlY3Rpb24gZnJvbSB0aGUgbG9uZyBsaXN0LAotCSAqIHR5cGljYWxseSB2aWEgYSBkaWFsb2cuCi0JICovCi0JcHJvdGVjdGVkIExpc3RDaG9vc2VyLkxpc3RCcm93c2VyIGJ1aWxkQnJvd3NlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0QnJvd3NlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIENob29zYWJsZSBmdW5jdGlvbmFsaXR5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKiogb3ZlcnJpZGUgYmVoYXZpb3IgLSBjb25zdW1lIHNlbGVjdGlvbiBpZiBjaG9vc2VyIGlzIG5vdCBjaG9vc2FibGUgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEluZGV4KGludCBhbkluZGV4KSB7Ci0JCWlmICh0aGlzLmNob29zYWJsZSkgewotCQkJc3VwZXIuc2V0U2VsZWN0ZWRJbmRleChhbkluZGV4KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQXJyb3dCdXR0b24oKSB7Ci0JCXRyeSB7Ci0JCQlCYXNpY0NvbWJvQm94VUkgY29tYm9Cb3hVaSA9IChCYXNpY0NvbWJvQm94VUkpIExpc3RDaG9vc2VyLnRoaXMuZ2V0VUkoKTsKLQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY29tYm9Cb3hVaSwgImFycm93QnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFycm93QnV0dG9uLnNldEVuYWJsZWQodGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLmNob29zYWJsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIGEgaHVnZSBoYWNrIHRvIHRyeSBhbmQgbWFrZSB0aGUgY29tYm8gYm94IGxvb2sgcmlnaHQsCi0JCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0JCi0JCi0gICAgLy8gKioqKioqKioqKioqKioqKiBMaXN0IENhY2hpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0gICAgdm9pZCBjYWNoZUxpc3QoKSB7Ci0gICAgICAgICgoQ2FjaGluZ0NvbWJvQm94TW9kZWwpIGdldE1vZGVsKCkpLmNhY2hlTGlzdCgpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIHVuY2FjaGVMaXN0KCkgewotICAgICAgICAoKENhY2hpbmdDb21ib0JveE1vZGVsKSBnZXRNb2RlbCgpKS51bmNhY2hlTGlzdCgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gbGlzdElzQ2FjaGVkKCkgewotICAgICAgICByZXR1cm4gKChDYWNoaW5nQ29tYm9Cb3hNb2RlbCkgZ2V0TW9kZWwoKSkuaXNDYWNoZWQoKTsKLSAgICB9Ci0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBQdWJsaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGludCBsb25nTGlzdFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmxvbmdMaXN0U2l6ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9uZ0xpc3RTaXplKGludCBuZXdMb25nTGlzdFNpemUpIHsKLQkJaW50IG9sZExvbmdMaXN0U2l6ZSA9IHRoaXMubG9uZ0xpc3RTaXplOwotCQl0aGlzLmxvbmdMaXN0U2l6ZSA9IG5ld0xvbmdMaXN0U2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2UoTE9OR19MSVNUX1NJWkVfUFJPUEVSVFksIG9sZExvbmdMaXN0U2l6ZSwgbmV3TG9uZ0xpc3RTaXplKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDaG9vc2FibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNob29zYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hvb3NhYmxlKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuY2hvb3NhYmxlOwotCQl0aGlzLmNob29zYWJsZSA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZShDSE9PU0FCTEVfUFJPUEVSVFksIG9sZFZhbHVlLCBuZXdWYWx1ZSk7Ci0JCXRoaXMudXBkYXRlQXJyb3dCdXR0b24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBIYW5kbGUgc2VsZWN0aW5nIG51bGwgYXMgYSB2YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gc2VsZWN0ZWRJbmRleElzTm9uZVNlbGVjdGVkSXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIGluZGV4ID09IC0xICYmCi0JCQkJIGdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gMCAmJgotCQkJCSBnZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSA9PSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZ2V0U2VsZWN0ZWRJbmRleCgpIHsKLSAgICAgICAgYm9vbGVhbiBsaXN0Tm90Q2FjaGVkID0gIWxpc3RJc0NhY2hlZCgpOwotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgY2FjaGVMaXN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0JCWludCBpbmRleCA9IHN1cGVyLmdldFNlbGVjdGVkSW5kZXgoKTsKLQotCQkvLyBVc2UgaW5kZXggMCB0byBzaG93IHRoZSA8bm9uZSBzZWxlY3RlZD4gaXRlbSBzaW5jZSB0aGUgYWN0dWFsIHZhbHVlIGlzCi0JCS8vIG51bGwgYW5kIEpDb21ib0JveCBkb2VzIG5vdCBoYW5kbGUgbnVsbCB2YWx1ZXMKLQkJaWYgKHNlbGVjdGVkSW5kZXhJc05vbmVTZWxlY3RlZEl0ZW0oaW5kZXgpKSB7Ci0JCQlpbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdE5vdENhY2hlZCkgewotICAgICAgICAgICAgdW5jYWNoZUxpc3QoKTsKLSAgICAgICAgfQotCQlyZXR1cm4gaW5kZXg7Ci0gICB9Ci0JCi0JLy93cmFwIHRoZSByZW5kZXJlciB0byBkZWFsIHdpdGggdGhlIHByb3RvdHlwZURpc3BsYXlWYWx1ZQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFJlbmRlcmVyKGZpbmFsIExpc3RDZWxsUmVuZGVyZXIgYVJlbmRlcmVyKSB7Ci0gICAgICAgIHN1cGVyLnNldFJlbmRlcmVyKG5ldyBMaXN0Q2VsbFJlbmRlcmVyKCl7Ci0gICAgICAgICAgICBwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gcHJvdG90eXBlTGFiZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3RvdHlwZUxhYmVsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYVJlbmRlcmVyLmdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0gICAgCi0gICAgCi0JLy8gKioqKioqKioqKioqKioqKiBNZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogRGVmaW5lIHRoZSBBUEkgcmVxdWlyZWQgYnkgdGhpcyBMaXN0Q2hvb3NlciB3aGVuIGl0IG11c3QKLQkgKiBwcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGl0ZW0gZnJvbSB0aGUgImxvbmciIGxpc3QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0QnJvd3NlciAKLQl7Ci0JCS8qKgotCQkgKiBQcm9tcHQgdGhlIHVzZXIgdG8gbWFrZSBhIHNlbGVjdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQKLQkJICogY29tYm8tYm94J3MgbW9kZWwuCi0JCSAqLwotCQl2b2lkIGJyb3dzZShMaXN0Q2hvb3NlciBwYXJlbnRDaG9vc2VyKTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUnVubmFibGUgY2xhc3MgdGhhdCBjb25zdW1lcyBwb3B1cCB3aW5kb3cgYW5kIGRldGVybWluZXMgd2hldGhlcgotCSAqIHRvIHJlc2hvdyBwb3B1cCBvciB0byBsYXVuY2ggYnJvd3NlciwgYmFzZWQgb24gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3B1cEhhbmRsZXIKLQkJaW1wbGVtZW50cyBSdW5uYWJsZQotCXsKLQkJLyoqIFRoZSBtb3VzZSBldmVudCAqLwotCQlwcml2YXRlIE1vdXNlRXZlbnQgbGFzdE1vdXNlRXZlbnQ7Ci0JCQotCQkvKiogVGhlIGNvbXBvbmVudCBmcm9tIHdoaWNoIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBKQ29tcG9uZW50IGV2ZW50Q29tcG9uZW50OwotCQkKLQkJLyoqIFRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9uZW50IGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBjb21wb25lbnRMb2NhdGlvbjsKLQkJCi0JCS8qKiBUaGUgbG9jYXRpb24gb2YgdGhlIG1vdXNlIGF0IHRoZSB0aW1lIHRoZSBsYXN0IG1vdXNlIGV2ZW50IHdhcyB0aHJvd24gKi8KLQkJcHJpdmF0ZSBQb2ludCBtb3VzZUxvY2F0aW9uOwotCQkKLQkJCi0JCVBvcHVwSGFuZGxlcigpIHsKLQkJCXRoaXMuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJCUFXVEV2ZW50IGV2ZW50ID0gRXZlbnRRdWV1ZS5nZXRDdXJyZW50RXZlbnQoKTsKLQkJCQotCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCkgewotCQkJCXRoaXMubGFzdE1vdXNlRXZlbnQgPSAoTW91c2VFdmVudCkgZXZlbnQ7Ci0JCQkJdGhpcy5ldmVudENvbXBvbmVudCA9IChKQ29tcG9uZW50KSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFNvdXJjZSgpOwotCQkJCXRoaXMuY29tcG9uZW50TG9jYXRpb24gPSB0aGlzLmV2ZW50Q29tcG9uZW50LmdldExvY2F0aW9uT25TY3JlZW4oKTsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSB0aGlzLmxhc3RNb3VzZUV2ZW50LmdldFBvaW50KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmV2ZW50Q29tcG9uZW50ID0gbnVsbDsKLQkJCQl0aGlzLmNvbXBvbmVudExvY2F0aW9uID0gbnVsbDsKLQkJCQl0aGlzLm1vdXNlTG9jYXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlMaXN0Q2hvb3Nlci50aGlzLmhpZGVQb3B1cCgpOwotCQkJCi0gICAgICAgICAgICBjYWNoZUxpc3QoKTsKLQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmNob29zYWJsZSA9PSB0cnVlKSB7Ci0JCQkJLy8gSWYgdGhlIGNvbWJvIGJveCBtb2RlbCBpcyBvZiBzdWZmaWNpZW50IGxlbmd0aCwgdGhlIGJyb3dzZXIgd2lsbCBiZSBzaG93bi4KLQkJCQkvLyBBc2tpbmcgdGhlIGNvbWJvIGJveCBtb2RlbCBmb3IgaXRzIHNpemUgc2hvdWxkIGJlIGVub3VnaCB0byBlbnN1cmUgdGhhdCAKLQkJCQkvLyAgaXRzIHNpemUgaXMgcmVjYWxjdWxhdGVkLgotCQkJCWlmIChMaXN0Q2hvb3Nlci50aGlzLmdldE1vZGVsKCkuZ2V0U2l6ZSgpID4gTGlzdENob29zZXIudGhpcy5sb25nTGlzdFNpemUpIHsKLQkJCQkJdGhpcy5jaGVja0NvbWJvQm94QnV0dG9uKCk7Ci0JCQkJCUxpc3RDaG9vc2VyLnRoaXMuYnJvd3NlKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMaXN0Q2hvb3Nlci50aGlzLnNob3dQb3B1cCgpOwotCQkJCQl0aGlzLmNoZWNrTW91c2VQb3NpdGlvbigpOwotCQkJCX0KLQkJCX0KLSAgICAgICAgICAgIGlmIChsaXN0SXNDYWNoZWQoKSkgewotICAgICAgICAgICAgICAgIHVuY2FjaGVMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0JCQkKLQkJCUxpc3RDaG9vc2VyLnRoaXMucG9wdXBBbHJlYWR5SW5Qcm9ncmVzcyA9IGZhbHNlOwotCQl9Ci0JCQotCQkvKiogSWYgdGhpcyBpcyBub3QgZG9uZSwgdGhlIGJ1dHRvbiBuZXZlciBiZWNvbWVzIHVuLXByZXNzZWQgKi8KLQkJcHJpdmF0ZSB2b2lkIGNoZWNrQ29tYm9Cb3hCdXR0b24oKSB7Ci0JCQl0cnkgewotCQkJCUJhc2ljQ29tYm9Cb3hVSSBjb21ib0JveFVpID0gKEJhc2ljQ29tYm9Cb3hVSSkgTGlzdENob29zZXIudGhpcy5nZXRVSSgpOwotCQkJCUpCdXR0b24gYXJyb3dCdXR0b24gPSAoSkJ1dHRvbikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY29tYm9Cb3hVaSwgImFycm93QnV0dG9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlhcnJvd0J1dHRvbi5nZXRNb2RlbCgpLnNldFByZXNzZWQoZmFsc2UpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHRoaXMgaXMgYSBodWdlIGhhY2sgdG8gdHJ5IGFuZCBtYWtlIHRoZSBjb21ibyBib3ggbG9vayByaWdodCwKLQkJCQkvLyBzbyBpZiBpdCBkb2Vzbid0IHdvcmssIGp1c3Qgc3dhbGxvdyB0aGUgZXhjZXB0aW9uCi0JCQkJdGhpcy5oYW5kbGVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBkbyBub3RoaW5nIGZvciBub3cKLQkJfQotCQkKLQkJLyoqCi0JCSAqIE1vdmVzIHRoZSBtb3VzZSBiYWNrIHRvIGl0cyBvcmlnaW5hbCBwb3NpdGlvbiBiZWZvcmUgYW55IGppZ2dlcnkgcG9rZXJ5IHRoYXQgd2UndmUgZG9uZS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCBjaGVja01vdXNlUG9zaXRpb24oKSB7Ci0JCQlpZiAodGhpcy5ldmVudENvbXBvbmVudCA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlmaW5hbCBQb2ludCBuZXdDb21wb25lbnRMb2NhdGlvbiA9IHRoaXMuZXZlbnRDb21wb25lbnQuZ2V0TG9jYXRpb25PblNjcmVlbigpOwotCQkJYm9vbGVhbiBjb21wb25lbnRNb3ZlZCA9IAotCQkJCW5ld0NvbXBvbmVudExvY2F0aW9uLnggLSB0aGlzLmNvbXBvbmVudExvY2F0aW9uLnggIT0gMAotCQkJCXx8IG5ld0NvbXBvbmVudExvY2F0aW9uLnkgLSB0aGlzLmNvbXBvbmVudExvY2F0aW9uLnkgIT0gMDsKLQkJCQotCQkJaWYgKGNvbXBvbmVudE1vdmVkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbmV3IFJvYm90KCkubW91c2VNb3ZlKAotCQkJCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueCArIHRoaXMubW91c2VMb2NhdGlvbi54LAotCQkJCQkJbmV3Q29tcG9uZW50TG9jYXRpb24ueSArIHRoaXMubW91c2VMb2NhdGlvbi55Ci0JCQkJCSk7Ci0JCQkJfQotCQkJCWNhdGNoIChBV1RFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gbW92ZSBmYWlsZWQgLSBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvTm9kZVNlbGVjdG9yLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob2RlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwNzliZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob2RlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi0vKioKLSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBwcmVzc2VzIEYzIG9yIGNob29zZXMKLSAqICdHbyBUbycgaW4gdGhlIGNvbnRleHQgbWVudQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGVTZWxlY3RvciAKLXsgICAgICAgCi0gICAgLyoqCi0gICAgICogU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBOb2RlIGluIHRoZSB0cmVlIG9yIHRoZSBlZGl0b3IgcGFuZWwuCi0gICAgICovCi0gICAgdm9pZCBzZWxlY3ROb2RlRm9yKE9iamVjdCBpdGVtKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGlzIE5vZGVTZWxlY3RvciB3aWxsIGRvIG5vdGhpbmcgd2hlbiBzZWxlY3ROb2RlRm9yKE9iamVjdCkgaXMgY2FsbGVkCi0gICAgICovCi0gICAgY2xhc3MgRGVmYXVsdE5vZGVTZWxlY3RvciBpbXBsZW1lbnRzIE5vZGVTZWxlY3RvciB7Ci0gICAgICAgIAotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3ROb2RlRm9yKE9iamVjdCBpdGVtKSB7Ci0gICAgICAgICAgICAvL2RlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vbkNhY2hpbmdDb21ib0JveE1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9Ob25DYWNoaW5nQ29tYm9Cb3hNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWY5YTdjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL05vbkNhY2hpbmdDb21ib0JveE1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFMaXN0ZW5lcjsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbnRlcmZhY2UgY2FuIGJlIHVzZWQKLSAqIHdoZW5ldmVyIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNhY2hpbmcgKGkuZS4gdGhlIGNvbnRlbnRzIG9mIHRoZSBzZWxlY3Rpb24KLSAqIGxpc3QgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIGxpdHRsZSBsYXRlbmN5KS4gQWxsIHRoZSBub3JtYWwgQ29tYm9Cb3hNb2RlbAotICogYmVoYXZpb3IgaXMgZGVsZWdhdGVkIHRvIGEgY2xpZW50LXN1cHBsaWVkIENvbWJvQm94TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25DYWNoaW5nQ29tYm9Cb3hNb2RlbCBpbXBsZW1lbnRzIENhY2hpbmdDb21ib0JveE1vZGVsIHsKLQlwcml2YXRlIENvbWJvQm94TW9kZWwgd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0KLQlwdWJsaWMgTm9uQ2FjaGluZ0NvbWJvQm94TW9kZWwoQ29tYm9Cb3hNb2RlbCB3cmFwcGVkQ29tYm9Cb3hNb2RlbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsID0gd3JhcHBlZENvbWJvQm94TW9kZWw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hpbmdDb21ib0JveE1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNhY2hlTGlzdCgpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgdW5jYWNoZUxpc3QoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2FjaGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbWJvQm94TW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWRJdGVtKE9iamVjdCBhbkl0ZW0pIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5zZXRTZWxlY3RlZEl0ZW0oYW5JdGVtKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFNlbGVjdGVkSXRlbSgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0U2VsZWN0ZWRJdGVtKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3RNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCXJldHVybiB0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmdldFNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMud3JhcHBlZENvbWJvQm94TW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0RGF0YUxpc3RlbmVyKExpc3REYXRhTGlzdGVuZXIgbCkgewotCQl0aGlzLndyYXBwZWRDb21ib0JveE1vZGVsLmFkZExpc3REYXRhTGlzdGVuZXIobCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihMaXN0RGF0YUxpc3RlbmVyIGwpIHsKLQkJdGhpcy53cmFwcGVkQ29tYm9Cb3hNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKGwpOwotCX0gIAotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlRGlzcGxheWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwYjZiNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVEaXNwbGF5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIERpc3BsYXlhYmxlIGNvbnZlcnRzIGFueSBPYmplY3QKLSAqIHRvIGEgRGlzcGxheWFibGUuIFN1YmNsYXNzIGl0IHRvIG92ZXJyaWRlICNkaXNwbGF5U3RyaW5nKCkgYW5kCi0gKiAjaWNvbigpIGlmIG5lY2Vzc2FyeS4gQ2hhbmdlIG5vdGlmaWNhdGlvbiB3aWxsIGJlIGZpcmVkIGlmIHRoZQotICogb2JqZWN0IGlzIGNoYW5nZWQuCi0gKiAKLSAqIFRoaXMgY2FuIGJlIHVzZWQgZm9yIFN0cmluZ3MgLSB0aGUgZGlzcGxheSBzdHJpbmcKLSAqIHdpbGwgc2ltcGx5IGJlIHRoZSBTdHJpbmcgaXRzZWxmLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlRGlzcGxheWFibGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIERpc3BsYXlhYmxlCi17Ci0JLyoqIFRoZSBvYmplY3QgdG8gYmUgY29udmVydGVkIHRvIGEgRGlzcGxheWFibGUuICovCi0JcHJvdGVjdGVkIE9iamVjdCBvYmplY3Q7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGRpc3BsYXlhYmxlIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoT2JqZWN0IG9iamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9iamVjdCA9IG9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoYm9vbGVhbiBiKSB7Ci0JCXRoaXMoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoY2hhciBjKSB7Ci0JCXRoaXMoQ2hhcmFjdGVyLnZhbHVlT2YoYykpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShieXRlIGIpIHsKLQkJdGhpcyhCeXRlLnZhbHVlT2YoYikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShzaG9ydCBzKSB7Ci0JCXRoaXMoU2hvcnQudmFsdWVPZihzKSk7Ci0JfQotCi0JcHVibGljIFNpbXBsZURpc3BsYXlhYmxlKGludCBpKSB7Ci0JCXRoaXMoSW50ZWdlci52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUobG9uZyBsKSB7Ci0JCXRoaXMoTG9uZy52YWx1ZU9mKGwpKTsKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlRGlzcGxheWFibGUoZmxvYXQgZikgewotCQl0aGlzKEZsb2F0LnZhbHVlT2YoZikpOwotCX0KLQotCXB1YmxpYyBTaW1wbGVEaXNwbGF5YWJsZShkb3VibGUgZCkgewotCQl0aGlzKERvdWJsZS52YWx1ZU9mKGQpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGlzcGxheWFibGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3QudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gdGhpcy5vYmplY3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nIG9sZERpc3BsYXlTdHJpbmcgPSB0aGlzLmRpc3BsYXlTdHJpbmcoKTsKLQkJSWNvbiBvbGRJY29uID0gdGhpcy5pY29uKCk7Ci0JCXRoaXMub2JqZWN0ID0gb2JqZWN0OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIG9sZERpc3BsYXlTdHJpbmcsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElDT05fUFJPUEVSVFksIG9sZEljb24sIHRoaXMuaWNvbigpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKCkgewotCQlyZXR1cm4gKChCb29sZWFuKSB0aGlzLm9iamVjdCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhbihib29sZWFuIGIpIHsKLQkJdGhpcy5zZXRPYmplY3QoQm9vbGVhbi52YWx1ZU9mKGIpKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRDaGFyKCkgewotCQlyZXR1cm4gKChDaGFyYWN0ZXIpIHRoaXMub2JqZWN0KS5jaGFyVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFyKGNoYXIgYykgewotCQl0aGlzLnNldE9iamVjdChDaGFyYWN0ZXIudmFsdWVPZihjKSk7Ci0JfQotCi0JcHVibGljIGJ5dGUgZ2V0Qnl0ZSgpIHsKLQkJcmV0dXJuICgoQnl0ZSkgdGhpcy5vYmplY3QpLmJ5dGVWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJ5dGUoYnl0ZSBiKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KEJ5dGUudmFsdWVPZihiKSk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFNob3J0KCkgewotCQlyZXR1cm4gKChTaG9ydCkgdGhpcy5vYmplY3QpLnNob3J0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaG9ydChzaG9ydCBzKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KFNob3J0LnZhbHVlT2YocykpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW50KCkgewotCQlyZXR1cm4gKChJbnRlZ2VyKSB0aGlzLm9iamVjdCkuaW50VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnQoaW50IGkpIHsKLQkJdGhpcy5zZXRPYmplY3QoSW50ZWdlci52YWx1ZU9mKGkpKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBnZXRMb25nKCkgewotCQlyZXR1cm4gKChMb25nKSB0aGlzLm9iamVjdCkubG9uZ1ZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9uZyhsb25nIGwpIHsKLQkJdGhpcy5zZXRPYmplY3QoTG9uZy52YWx1ZU9mKGwpKTsKLQl9Ci0KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoKSB7Ci0JCXJldHVybiAoKEZsb2F0KSB0aGlzLm9iamVjdCkuZmxvYXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsb2F0KGZsb2F0IGYpIHsKLQkJdGhpcy5zZXRPYmplY3QoRmxvYXQudmFsdWVPZihmKSk7Ci0JfQotCi0JcHVibGljIGRvdWJsZSBnZXREb3VibGUoKSB7Ci0JCXJldHVybiAoKERvdWJsZSkgdGhpcy5vYmplY3QpLmRvdWJsZVZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG91YmxlKGRvdWJsZSBkKSB7Ci0JCXRoaXMuc2V0T2JqZWN0KERvdWJsZS52YWx1ZU9mKGQpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm9iamVjdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0QnJvd3Nlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdEJyb3dzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwMDUzMi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zd2luZy9TaW1wbGVMaXN0QnJvd3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KT3B0aW9uUGFuZTsKLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBMaXN0Q2hvb3Nlci5Ccm93c2VyIHVzZXMgYQotICogSk9wdGlvblBhbmUgdG8gcHJvbXB0IHRoZSB1c2VyIGZvciB0aGUgc2VsZWN0aW9uLiBTdWJjbGFzc2VzIAotICogY2FuIGNoYW5nZSB0aGUgZGlhbG9nJ3MgdGl0bGUsIG1lc3NhZ2UsIGFuZC9vciBpY29uLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlTGlzdEJyb3dzZXIKLQlpbXBsZW1lbnRzIExpc3RDaG9vc2VyLkxpc3RCcm93c2VyIAotewotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yICovCi0JcHJvdGVjdGVkIFNpbXBsZUxpc3RCcm93c2VyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBQcm9tcHQgdGhlIHVzZXIgdXNpbmcgYSBKT3B0aW9uUGFuZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBicm93c2UoTGlzdENob29zZXIgY2hvb3NlcikgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gCi0JCQlKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coCi0JCQkJY2hvb3NlciwgCi0JCQkJdGhpcy5tZXNzYWdlKGNob29zZXIpLCAKLQkJCQl0aGlzLnRpdGxlKGNob29zZXIpLCAKLQkJCQl0aGlzLm1lc3NhZ2VUeXBlKGNob29zZXIpLCAKLQkJCQl0aGlzLmljb24oY2hvb3NlciksIAotCQkJCXRoaXMuc2VsZWN0aW9uVmFsdWVzKGNob29zZXIpLCAKLQkJCQl0aGlzLmluaXRpYWxTZWxlY3Rpb25WYWx1ZShjaG9vc2VyKQotCQkJKTsKLQkJCi0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJY2hvb3Nlci5nZXRNb2RlbCgpLnNldFNlbGVjdGVkSXRlbShzZWxlY3Rpb24pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBPYmplY3QgbWVzc2FnZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKQ29tYm9Cb3ggY29tYm9Cb3gpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBpbnQgbWVzc2FnZVR5cGUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gSk9wdGlvblBhbmUuUVVFU1RJT05fTUVTU0FHRTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEljb24gaWNvbihAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgT2JqZWN0W10gc2VsZWN0aW9uVmFsdWVzKEpDb21ib0JveCBjb21ib0JveCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9BcnJheShjb21ib0JveC5nZXRNb2RlbCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9iamVjdCBpbml0aWFsU2VsZWN0aW9uVmFsdWUoSkNvbWJvQm94IGNvbWJvQm94KSB7Ci0JCXJldHVybiBjb21ib0JveC5nZXRNb2RlbCgpLmdldFNlbGVjdGVkSXRlbSgpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBsaXN0IG9mIG9iamVjdHMgaW4gdGhlIHNwZWNpZmllZCBsaXN0IG1vZGVsCi0JICogaW50byBhbiBhcnJheS4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0W10gY29udmVydFRvQXJyYXkoTGlzdE1vZGVsIG1vZGVsKSB7Ci0JCWludCBzaXplID0gbW9kZWwuZ2V0U2l6ZSgpOwotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0W3NpemVdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJcmVzdWx0W2ldID0gbW9kZWwuZ2V0RWxlbWVudEF0KGkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU2ltcGxlTGlzdENlbGxSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJkMjkwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NpbXBsZUxpc3RDZWxsUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBqYXZheC5zd2luZy5JY29uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi0vKioKLSAqIFRoaXMgcmVuZGVyZXIgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyB0aGUgRGVmYXVsdExpc3RDZWxsUmVuZGVyZXI7Ci0gKiBidXQgaXQgc2xpZ2h0bHkgcmVmYWN0b3JzIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgaWNvbiBhbmQgdGV4dCBvZiB0aGUgbGlzdAotICogY2VsbCBzbyB0aGF0IHN1YmNsYXNzZXMgY2FuIGVhc2lseSBvdmVycmlkZSB0aGUgbWV0aG9kcyB0aGF0IGJ1aWxkCi0gKiB0aGUgaWNvbiBhbmQgdGV4dC4KLSAqIAotICogSW4gbW9zdCBjYXNlcywgeW91IG5lZWQgb25seSBvdmVycmlkZToKLSAqICAgICAjYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkKLSAqICAgICAjYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIKLQlleHRlbmRzIERlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyCi17Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzaW1wbGUgcmVuZGVyZXIuCi0JICovCi0JcHVibGljIFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbXBvbmVudCBnZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KEpMaXN0IGxpc3QsIE9iamVjdCB2YWx1ZSwgaW50IGluZGV4LCBib29sZWFuIGlzU2VsZWN0ZWQsIGJvb2xlYW4gY2VsbEhhc0ZvY3VzKSB7Ci0JCS8vIHN1YnN0aXR1dGUgbnVsbCBmb3IgdGhlIGNlbGwgdmFsdWUgc28gbm90aGluZyBpcyBkcmF3biBpbml0aWFsbHkuLi4KLQkJc3VwZXIuZ2V0TGlzdENlbGxSZW5kZXJlckNvbXBvbmVudChsaXN0LCBudWxsLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJdGhpcy5zZXRPcGFxdWUodHJ1ZSk7Ci0KLQkJLy8gLi4udGhlbiBzZXQgdGhlIGljb24gYW5kIHRleHQgbWFudWFsbHkKLQkJdGhpcy5zZXRJY29uKHRoaXMuYnVpbGRJY29uKGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0JCXRoaXMuc2V0VGV4dCh0aGlzLmJ1aWxkVGV4dChsaXN0LCB2YWx1ZSwgaW5kZXgsIGlzU2VsZWN0ZWQsIGNlbGxIYXNGb2N1cykpOwotCi0JCXRoaXMuc2V0VG9vbFRpcFRleHQodGhpcy5idWlsZFRvb2xUaXBUZXh0KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKSk7Ci0KLQkJLy8gdGhlIGNvbnRleHQgd2lsbCBiZSBpbml0aWFsaXplZCBvbmx5IGlmIGEgcmVhZGVyIGlzIHJ1bm5pbmcKLQkJaWYgKHRoaXMuYWNjZXNzaWJsZUNvbnRleHQgIT0gbnVsbCkgewotCQkJdGhpcy5hY2Nlc3NpYmxlQ29udGV4dC5zZXRBY2Nlc3NpYmxlTmFtZSh0aGlzLmJ1aWxkQWNjZXNzaWJsZU5hbWUobGlzdCwgdmFsdWUsIGluZGV4LCBpc1NlbGVjdGVkLCBjZWxsSGFzRm9jdXMpKTsKLQkJfQotCi0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZSBhbmQgb3RoZXIgc2V0dGluZ3MuIChFdmVuIG1vcmUgc2V0dGluZ3MgYXJlCi0JICogYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZEljb24odmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaWNvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSBubyBpY29uIGF0IGFsbCB1bmxlc3MgdGhlCi0JICogdmFsdWUgaXRzZWxmIGlzIGFuIGljb24uCi0JICovCi0JcHJvdGVjdGVkIEljb24gYnVpbGRJY29uKE9iamVjdCB2YWx1ZSkgewotCQkvLyByZXBsaWNhdGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IKLQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIEljb24pID8gKEljb24pIHZhbHVlIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBjZWxsCi0JICogdmFsdWUgYW5kIG90aGVyIHNldHRpbmdzLiAoRXZlbiBtb3JlIHNldHRpbmdzIGFyZQotCSAqIGFjY2Vzc2libGUgdmlhIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRleHQodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNlbGwKLQkgKiB2YWx1ZS4gVGhlIGRlZmF1bHQgaXMgdG8gZGlzcGxheSB0aGUgb2JqZWN0J3MgZGVmYXVsdCBzdHJpbmcKLQkgKiByZXByZXNlbnRhdGlvbiAoYXMgcmV0dXJuZWQgYnkgI3RvU3RyaW5nKCkpOyB1bmxlc3MgdGhlCi0JICogdmFsdWUgaXRzZWxmIGlzIGFuIGljb24sIGluIHdoaWNoIGNhc2Ugbm8gdGV4dCBpcyBkaXNwbGF5ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBJY29uKSA/ICIiIDogKCh2YWx1ZSA9PSBudWxsKSA/ICIiIDogdmFsdWUudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCBkaXNwbGF5ZWQgd2hlbiB0aGUgY3Vyc29yIGxpbmdlcnMgb3ZlciB0aGUgc3BlY2lmaWVkIGNlbGwuCi0JICogKEV2ZW4gbW9yZSBzZXR0aW5ncyBhcmUgYWNjZXNzaWJsZSB2aWEgaW5oZXJpdGVkIGdldHRlcnM6IGhhc0ZvY3VzLCBpc0VuYWJsZWQsIGV0Yy4pCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRvb2xUaXBUZXh0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBKTGlzdCBsaXN0LCBPYmplY3QgdmFsdWUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgaW5kZXgsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGlzU2VsZWN0ZWQsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIGNlbGxIYXNGb2N1cykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRvb2xUaXBUZXh0KHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgZGlzcGxheWVkIHdoZW4gdGhlIGN1cnNvciBsaW5nZXJzIG92ZXIgdGhlIHNwZWNpZmllZCBjZWxsLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUb29sVGlwVGV4dChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzaWJsZSBuYW1lIHRvIGJlIGdpdmVuIHRvIHRoZSBjb21wb25lbnQgdXNlZCB0byByZW5kZXIKLQkgKiB0aGUgZ2l2ZW4gdmFsdWUgYW5kIG90aGVyIHNldHRpbmdzLiAoRXZlbiBtb3JlIHNldHRpbmdzIGFyZSBhY2Nlc3NpYmxlIHZpYQotCSAqIGluaGVyaXRlZCBnZXR0ZXJzOiBoYXNGb2N1cywgaXNFbmFibGVkLCBldGMuKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRBY2Nlc3NpYmxlTmFtZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGluZGV4LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBpc1NlbGVjdGVkLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBY2Nlc3NpYmxlTmFtZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3NpYmxlIG5hbWUgdG8gYmUgZ2l2ZW4gdG8gdGhlIGNvbXBvbmVudCB1c2VkIHRvIHJlbmRlcgotCSAqIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQWNjZXNzaWJsZU5hbWUoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1NwaW5uZXJUYWJsZUNlbGxSZW5kZXJlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5N2FkYTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Db2xvcjsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5TcGlubmVyTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuQ2hhbmdlTGlzdGVuZXI7Ci0KLS8qKgotICogTWFrZSB0aGUgY2VsbCBsb29rIGxpa2UgYSBzcGlubmVyLgotICovCi1wdWJsaWMgY2xhc3MgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciB7Ci0KLQkvKiogdGhlIGNvbXBvbmVudCB1c2VkIHRvIHBhaW50IHRoZSBjZWxsICovCi0JcHJvdGVjdGVkIEpTcGlubmVyIHNwaW5uZXI7Ci0JCi0JLyoqIHRoZSBsaXN0ZW5lciB0byBiZSBub3RpZmllZCBvbiBhbiBpbW1lZGlhdGUgZWRpdCAqLwotCXByb3RlY3RlZCBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBpbW1lZGlhdGVFZGl0TGlzdGVuZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2VsbCByZW5kZXJlciB0aGF0IHVzZXMgdGhlIGRlZmF1bHQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCBpcyBhICJudW1iZXIiIG1vZGVsLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNlbGwgcmVuZGVyZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBzcGlubmVyIG1vZGVsLCB3aGljaCB3aWxsIGRldGVybWluZSBob3cgdGhlIHZhbHVlcyBhcmUgZGlzcGxheWVkLgotCSAqLwotCXB1YmxpYyBTcGlubmVyVGFibGVDZWxsUmVuZGVyZXIoU3Bpbm5lck1vZGVsIG1vZGVsKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5zZXRNb2RlbChtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zcGlubmVyID0gdGhpcy5idWlsZFNwaW5uZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlNwaW5uZXIgYnVpbGRTcGlubmVyKCkgewotCQlKU3Bpbm5lciBzID0gbmV3IEpTcGlubmVyKCk7Ci0JCXMuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gczsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyICE9IG51bGwpIHsKLQkJCQkJU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyLnRoaXMuaW1tZWRpYXRlRWRpdExpc3RlbmVyLmltbWVkaWF0ZUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlQ2VsbFJlbmRlcmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb21wb25lbnQgZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJdGhpcy5zcGlubmVyLnNldENvbXBvbmVudE9yaWVudGF0aW9uKHRhYmxlLmdldENvbXBvbmVudE9yaWVudGF0aW9uKCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0Rm9udCh0YWJsZS5nZXRGb250KCkpOwotCQl0aGlzLnNwaW5uZXIuc2V0RW5hYmxlZCh0YWJsZS5pc0VuYWJsZWQoKSk7Ci0KLQkJSkNvbXBvbmVudCBlZGl0b3IgPSB0aGlzLmVkaXRvcigpOwotCQllZGl0b3Iuc2V0Rm9yZWdyb3VuZCh0aGlzLmZvcmVncm91bmRDb2xvcih0YWJsZSwgdmFsdWUsIHNlbGVjdGVkLCBoYXNGb2N1cywgcm93LCBjb2x1bW4pKTsKLQkJZWRpdG9yLnNldEJhY2tncm91bmQodGhpcy5iYWNrZ3JvdW5kQ29sb3IodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0JCXRoaXMuc3Bpbm5lci5zZXRCb3JkZXIodGhpcy5ib3JkZXIodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgaGFzRm9jdXMsIHJvdywgY29sdW1uKSk7Ci0KLQkJdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiB0aGlzLnNwaW5uZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjZWxsJ3MgZm9yZWdyb3VuZCBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29sb3IgZm9yZWdyb3VuZENvbG9yKEpUYWJsZSB0YWJsZSwgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBzZWxlY3RlZCwgYm9vbGVhbiBoYXNGb2N1cywgaW50IHJvdywgaW50IGNvbHVtbikgewotCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCWlmIChoYXNGb2N1cyAmJiB0YWJsZS5pc0NlbGxFZGl0YWJsZShyb3csIGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gVUlNYW5hZ2VyLmdldENvbG9yKCJUYWJsZS5mb2N1c0NlbGxGb3JlZ3JvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiB0YWJsZS5nZXRTZWxlY3Rpb25Gb3JlZ3JvdW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlLmdldEZvcmVncm91bmQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNlbGwncyBiYWNrZ3JvdW5kIGNvbG9yLgotCSAqLwotCXByb3RlY3RlZCBDb2xvciBiYWNrZ3JvdW5kQ29sb3IoSlRhYmxlIHRhYmxlLCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgT2JqZWN0IHZhbHVlLCBib29sZWFuIHNlbGVjdGVkLCBib29sZWFuIGhhc0ZvY3VzLCBpbnQgcm93LCBpbnQgY29sdW1uKSB7Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJaWYgKGhhc0ZvY3VzICYmIHRhYmxlLmlzQ2VsbEVkaXRhYmxlKHJvdywgY29sdW1uKSkgewotCQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Q29sb3IoIlRhYmxlLmZvY3VzQ2VsbEJhY2tncm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHRhYmxlLmdldFNlbGVjdGlvbkJhY2tncm91bmQoKTsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0QmFja2dyb3VuZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2VsbCdzIGJvcmRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9yZGVyIGJvcmRlcihKVGFibGUgdGFibGUsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gaGFzRm9jdXMsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBpbnQgcm93LCBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IGNvbHVtbikgewotCQlpZiAoaGFzRm9jdXMpIHsKLQkJCXJldHVybiBVSU1hbmFnZXIuZ2V0Qm9yZGVyKCJUYWJsZS5mb2N1c0NlbGxIaWdobGlnaHRCb3JkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChzZWxlY3RlZCkgewotCQkJcmV0dXJuIEJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcih0YWJsZS5nZXRTZWxlY3Rpb25CYWNrZ3JvdW5kKCksIDEpOwotCQl9Ci0JCXJldHVybiBCb3JkZXJGYWN0b3J5LmNyZWF0ZUxpbmVCb3JkZXIodGFibGUuZ2V0QmFja2dyb3VuZCgpLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVkaXRvciBjb21wb25lbnQgd2hvc2UgY29sb3JzIHNob3VsZCBiZSBzZXQKLQkgKiBieSB0aGUgcmVuZGVyZXIuCi0JICovCi0JcHJvdGVjdGVkIEpDb21wb25lbnQgZWRpdG9yKCkgewotCQlKQ29tcG9uZW50IGVkaXRvciA9IHRoaXMuc3Bpbm5lci5nZXRFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIEpTcGlubmVyLkRlZmF1bHRFZGl0b3IpIHsKLQkJCS8vIHR5cGljYWxseSwgdGhlIGVkaXRvciB3aWxsIGJlIHRoZSBkZWZhdWx0IG9yIG9uZSBvZiBpdHMgc3ViY2xhc3Nlcy4uLgotCQkJZWRpdG9yID0gKChKU3Bpbm5lci5EZWZhdWx0RWRpdG9yKSBlZGl0b3IpLmdldFRleHRGaWVsZCgpOwotCQl9Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBzcGlubmVyJ3MgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJLy8gQ1IjMzk5OTMxOCAtIFRoaXMgbnVsbCBjaGVjayBuZWVkcyB0byBiZSByZW1vdmVkIG9uY2UgSkRLIGJ1ZyBpcyBmaXhlZAotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCX0KLQkJdGhpcy5zcGlubmVyLnNldFZhbHVlKHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGFibGVDZWxsRWRpdG9yQWRhcHRlci5SZW5kZXJlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGlubmVyLmdldFZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcihUYWJsZUNlbGxFZGl0b3JBZGFwdGVyLkltbWVkaWF0ZUVkaXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmltbWVkaWF0ZUVkaXRMaXN0ZW5lciA9IGxpc3RlbmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3Bpbm5lcidzIG1vZGVsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1vZGVsKFNwaW5uZXJNb2RlbCBtb2RlbCkgewotCQl0aGlzLnNwaW5uZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVuZGVyZXIncyBwcmVmZXJyZWQgaGVpZ2h0LiBUaGlzIGFsbG93cyB5b3UKLQkgKiB0byBzZXQgdGhlIHJvdyBoZWlnaHQgdG8gc29tZXRoaW5nIHRoZSBzcGlubmVyIHdpbGwgbG9vayBnb29kIGluLi4uLgotCSAqLwotCXB1YmxpYyBpbnQgcHJlZmVycmVkSGVpZ2h0KCkgewotCQkvLyBhZGQgaW4gc3BhY2UgZm9yIHRoZSBib3JkZXIgdG9wIGFuZCBib3R0b20KLQkJcmV0dXJuIChpbnQpIHRoaXMuc3Bpbm5lci5nZXRQcmVmZXJyZWRTaXplKCkuZ2V0SGVpZ2h0KCkgKyAyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvVGFibGVDZWxsRWRpdG9yQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3dpbmcvVGFibGVDZWxsRWRpdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmU4MmJiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N3aW5nL1RhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0Q2VsbEVkaXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5KVGFibGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDZWxsRWRpdG9yOwotaW1wb3J0IGphdmF4LnN3aW5nLnRhYmxlLlRhYmxlQ2VsbFJlbmRlcmVyOwotCi0vKioKLSAqIEEgdGFibGUgY2VsbCBlZGl0b3IgdGhhdCB3cmFwcyBhIHRhYmxlIGNlbGwgcmVuZGVyZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RDZWxsRWRpdG9yIGltcGxlbWVudHMgVGFibGVDZWxsRWRpdG9yIHsKLQotCS8qKiBkZWxlZ2F0ZSB0byBhIHJlbmRlcmVyICovCi0JcHJpdmF0ZSBSZW5kZXJlciByZW5kZXJlcjsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjZWxsIGVkaXRvciB0aGF0IGJlaGF2ZXMgbGlrZSB0aGUgc3BlY2lmaWVkIHJlbmRlcmVyLgotCSAqLwotCXB1YmxpYyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXRoaXMoKTsKLQkJdGhpcy5pbml0aWFsaXplKHJlbmRlcmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShSZW5kZXJlciByKSB7Ci0JCXRoaXMucmVuZGVyZXIgPSByOwotCQlyLnNldEltbWVkaWF0ZUVkaXRMaXN0ZW5lcih0aGlzLmJ1aWxkSW1tZWRpYXRlRWRpdExpc3RlbmVyKCkpOwotCX0KLQkKLQlwcml2YXRlIEltbWVkaWF0ZUVkaXRMaXN0ZW5lciBidWlsZEltbWVkaWF0ZUVkaXRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJbW1lZGlhdGVFZGl0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpbW1lZGlhdGVFZGl0KCkgewotCQkJCVRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIudGhpcy5zdG9wQ2VsbEVkaXRpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBDZWxsRWRpdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgT2JqZWN0IGdldENlbGxFZGl0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBUYWJsZUNlbGxFZGl0b3IgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxFZGl0b3JDb21wb25lbnQoSlRhYmxlIHRhYmxlLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGludCByb3csIGludCBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VGFibGVDZWxsUmVuZGVyZXJDb21wb25lbnQodGFibGUsIHZhbHVlLCBzZWxlY3RlZCwgdHJ1ZSwgcm93LCBjb2x1bW4pOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIE1lbWJlciBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBkZWZpbmVzIHRoZSBtZXRob2RzIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHJlbmRlcmVyCi0JICogdGhhdCBjYW4gYmUgd3JhcHBlZCBieSBhIFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBSZW5kZXJlciBleHRlbmRzIFRhYmxlQ2VsbFJlbmRlcmVyIHsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlbmRlcmVyLgotCQkgKi8KLQkJT2JqZWN0IGdldFZhbHVlKCk7Ci0JCQotCQkvKioKLQkJICogU2V0IHRoZSBpbW1lZGlhdGUgZWRpdCBsaXN0ZW5lcgotCQkgKi8KLQkJdm9pZCBzZXRJbW1lZGlhdGVFZGl0TGlzdGVuZXIoSW1tZWRpYXRlRWRpdExpc3RlbmVyIGxpc3RlbmVyKTsKLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBJbW1lZGlhdGVFZGl0TGlzdGVuZXIgewotCQkKLQkJLyoqCi0JCSAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJlciBkb2VzIGFuICJpbW1lZGlhdGUgZWRpdCIKLQkJICovCi0JCXZvaWQgaW1tZWRpYXRlRWRpdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTRhMjM0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkQm9vbGVhbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci0KLS8qKgotICogVGhpcyBzeW5jaHJvbml6ZXIgd2lsbCBwZXJmb3JtIHN5bmNocm9uaXphdGlvbnMgaW4gYSBzZXBhcmF0ZSB0aHJlYWQsCi0gKiBhbGxvd2luZyBjYWxscyB0byB7QGxpbmsgU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9IHRvIHJldHVybiBpbW1lZGlhdGVseS4KLSAqIDxwPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGNsaWVudC1zdXBwbGllZCBjb21tYW5kIHNob3VsZCBoYW5kbGUgYW55IGV4Y2VwdGlvbnMKLSAqIGFwcHJvcHJpYXRlbHkgKGUuZy4gbG9nIHRoZSBleGNlcHRpb24gYW5kIHJldHVybiBncmFjZWZ1bGx5IHNvIHRoZSB0aHJlYWQKLSAqIGNhbiBjb250aW51ZSB0aGUgc3luY2hyb25pemF0aW9uIHByb2Nlc3MpLgotICovCi1wdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBTeW5jaHJvbml6ZXIKLXsKLQkvKioKLQkgKiBUaGlzIGZsYWcgaXMgc2hhcmVkIHdpdGggdGhlIHN5bmNocm9uaXphdGlvbi9jb25zdW1lciB0aHJlYWQuIFNldHRpbmcgaXQgdG8gdHJ1ZQotCSAqIHdpbGwgdHJpZ2dlciB0aGUgc3luY2hyb25pemF0aW9uIHRvIGJlZ2luIG9yLCBpZiB0aGUgc3luY2hyb25pemF0aW9uIGlzCi0JICogY3VycmVudGx5IGV4ZWN1dGluZywgdG8gZXhlY3V0ZSBhZ2Fpbiwgb25jZSB0aGUgY3VycmVudCBleGVjdXRpb24gaXMKLQkgKiBjb21wbGV0ZS4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNocm9uaXplRmxhZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQotCS8qKgotCSAqIE1vc3Qgb2YgdGhlIHRocmVhZC1yZWxhdGVkIGJlaGF2aW9yIGlzIGRlbGVnYXRlZCB0byB0aGlzIGNvb3JkaW5hdG9yLgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvciBjb25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqIFVzZSBzaW1wbGUgSkRLIHRocmVhZChzKSBmb3IgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQKLQkgKiBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXRoaXMoY29tbWFuZCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCB0aHJlYWQgZmFjdG9yeSB0byBjb25zdHJ1Y3QgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykuCi0JICogQWxsb3cgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdG8gYmUgYXNzaWduZWQKLQkgKiBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kLCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkpIHsKLQkJdGhpcyhjb21tYW5kLCB0aHJlYWRGYWN0b3J5LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICogVXNlIHNpbXBsZSBKREsgdGhyZWFkKHMpIGZvciB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKS4KLQkgKi8KLQlwdWJsaWMgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJdGhpcyhjb21tYW5kLCBudWxsLCB0aHJlYWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZCBjb21tYW5kIHRvCi0JICogcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIHRocmVhZCBmYWN0b3J5IHRvIGNvbnN0cnVjdCB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZChzKS4KLQkgKiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykgdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuCi0JICovCi0JcHVibGljIEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5jb25zdW1lclRocmVhZENvb3JkaW5hdG9yID0gbmV3IENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IodGhpcy5idWlsZENvbnN1bWVyKGNvbW1hbmQpLCB0aHJlYWRGYWN0b3J5LCB0aHJlYWROYW1lKTsKLQl9Ci0KLQlDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyIGJ1aWxkQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXJldHVybiBuZXcgQ29uc3VtZXIoY29tbWFuZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBCdWlsZCBhbmQgc3RhcnQgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQsIGJ1dCBwb3N0cG9uZSB0aGUgZmlyc3QKLQkgKiBzeW5jaHJvbml6YXRpb24gdW50aWwgcmVxdWVzdGVkLCBpLmUuIHZpYSBhIGNhbGwgdG8KLQkgKiB7QGxpbmsgI3N5bmNocm9uaXplKCl9LgotCSAqIDxwPgotCSAqIE5vdGU6IFdlIGRvbid0IGNsZWFyIHRoZSAic3luY2hyb25pemUiIGZsYWcgaGVyZTsgc28gaWYgdGhlIGZsYWcgaGFzCi0JICogYmVlbiBzZXQgPGVtPmJlZm9yZTwvZW0+IGdldHRpbmcgaGVyZSwgdGhlIGZpcnN0IHN5bmNocm9uaXphdGlvbiB3aWxsCi0JICogc3RhcnQgcHJvbXB0bHkgKGFsYmVpdCwgYXN5bmNocm9ub3VzbHkpLgotCSAqIFRoZSAic3luY2hyb25pemUiIGZsYWcgd2lsbCBiZSBzZXQgaWY6PHVsPgotCSAqIDxsaT57QGxpbmsgI3N5bmNocm9uaXplKCl9IHdhcyBjYWxsZWQgYWZ0ZXIgdGhlIHN5bmNocm9uaXplciB3YXMKLQkgKiAgICAgY29uc3RydWN0ZWQgYnV0IGJlZm9yZSB7QGxpbmsgI3N0YXJ0KCl9IHdhcyBjYWxsZWQ7IG9yCi0JICogPGxpPntAbGluayAjc3luY2hyb25pemUoKX0gd2FzIGNhbGxlZCBhZnRlciB7QGxpbmsgI3N0b3AoKX0gd2FzIGNhbGxlZAotCSAqICAgICBidXQgYmVmb3JlIHtAbGluayAjc3RhcnQoKX0gd2FzIGNhbGxlZCAodG8gcmVzdGFydCB0aGUgc3luY2hyb25pemVyKTsgb3IKLQkgKiA8bGk+e0BsaW5rICNzdG9wKCl9IHdhcyBjYWxsZWQgd2hlbiB0aGVyZSB3YXMgYW4gb3V0c3RhbmRpbmcgcmVxdWVzdAotCSAqICAgICBmb3IgYSBzeW5jaHJvbml6YXRpb24gKGkuZS4gdGhlICJzeW5jaHJvbml6YXRpb24iIGZsYWcgd2FzIHNldCBhdAotCSAqICAgICB0aGUgdGltZSB7QGxpbmsgI3N0b3AoKX0gd2FzIGNhbGxlZCkKLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Iuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlICJzeW5jaHJvbml6ZSIgZmxhZyBzbyB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZCB3aWxsIGVpdGhlcjx1bD4KLQkgKiA8bGk+aWYgdGhlIHRocmVhZCBpcyBxdWllc2NlZCwgc3RhcnQgYSBzeW5jaHJvbml6YXRpb24gaW1tZWRpYXRlbHksIG9yCi0JICogPGxpPmlmIHRoZSB0aHJlYWQgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBhIHN5bmNocm9uaXphdGlvbiwgZXhlY3V0ZSBhbm90aGVyCi0JICogICAgIHN5bmNocm9uaXphdGlvbiBvbmNlIHRoZSBjdXJyZW50IHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCXRoaXMuc3luY2hyb25pemVGbGFnLnNldFRydWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcnJ1cHQgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQgc28gdGhhdCBpdCBzdG9wcyBleGVjdXRpbmcgYXQgdGhlCi0JICogZW5kIG9mIHRoZSBjdXJyZW50IHN5bmNocm9uaXphdGlvbi4gU3VzcGVuZCB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwKLQkgKiB0aGUgc3luY2hyb25pemF0aW9uIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQgd2FzIGV4ZWN1dGluZywKLQkgKiB3cmFwIHRoZW0gaW4gYSBjb21wb3NpdGUgZXhjZXB0aW9uIGFuZCB0aHJvdyB0aGUgY29tcG9zaXRlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQl0aGlzLmNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3Iuc3RvcCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdW1lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb25zdW1lclRocmVhZENvb3JkaW5hdG9yLkNvbnN1bWVyfQotCSAqIHdpbGwgZXhlY3V0ZSB0aGUgY2xpZW50LXN1cHBsaWVkICJzeW5jaHJvbml6ZSIgY29tbWFuZC4KLQkgKiBJdCB3aWxsIHdhaXQgdW50aWwgdGhlIHNoYXJlZCAic3luY2hyb25pemUiIGZsYWcgaXMgc2V0IHRvIGV4ZWN1dGUgdGhlCi0JICogY29tbWFuZC4gT25jZSB0aGUgY29tYW5kIGlzIGV4ZWN1dGVkLCB0aGUgdGhyZWFkIHdpbGwgcXVpZXNjZSB1bnRpbAotCSAqIHRoZSBmbGFnIGlzIHNldCBhZ2Fpbi4gSWYgdGhlIGZsYWcgd2FzIHNldCBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGUKLQkgKiBjb21tYW5kIChlaXRoZXIgcmVjdXJzaXZlbHkgYnkgdGhlIGNvbW1hbmQgaXRzZWxmIG9yIGJ5IGFub3RoZXIgdGhyZWFkKSwKLQkgKiB0aGUgY29tbWFuZCB3aWxsIGJlIHJlLWV4ZWN1dGVkIGltbWVkaWF0ZWx5LiBTdG9wIHRoZSB0aHJlYWQgYnkgY2FsbGluZwotCSAqIHtAbGluayBUaHJlYWQjaW50ZXJydXB0KCl9LgotCSAqLwotCWNsYXNzIENvbnN1bWVyCi0JCWltcGxlbWVudHMgQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvci5Db25zdW1lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IGV4ZWN1dGVzIG9uIHRoZQotCQkgKiBzeW5jaHJvbml6YXRpb24vY29uc3VtZXIgdGhyZWFkLgotCQkgKi8KLQkJcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkJQ29uc3VtZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJfQotCi0JCS8qKgotCQkgKiBXYWl0IHVudGlsIHRoZSAic3luY2hyb25pemUiIGZsYWcgaXMgc2V0LAotCQkgKiB0aGVuIGNsZWFyIGl0IGFuZCBhbGxvdyB0aGUgInN5bmNocm9uaXplIiBjb21tYW5kIHRvIGV4ZWN1dGUuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YWl0Rm9yUHJvZHVjZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJQXN5bmNocm9ub3VzU3luY2hyb25pemVyLnRoaXMuc3luY2hyb25pemVGbGFnLndhaXRUb1NldEZhbHNlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogRXhlY3V0ZSB0aGUgY2xpZW50LXN1cHBsaWVkIGNvbW1hbmQuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0NhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWY4MTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29uc3VtZXJUaHJlYWRDb29yZGluYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25pemVyOwotCi0vKioKLSAqIEV4dGVuZCB0aGUgYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgaGFuZGxlZCBldmVyeSBvdXRzdGFuZGluZyAic3luY2hyb25pemUiIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogc3luY2hyb25pemF0aW9uICJjeWNsZSI7IHNpbmNlIG90aGVyLCB1bnJlbGF0ZWQsIHN5bmNocm9uaXphdGlvbnMgY2FuIGJlCi0gKiB0cmlnZ2VyZWQgY29uY3VycmVudGx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBMaXN0ZW5lcnMgc2hvdWxkIGhhbmRsZSBhbnkgZXhjZXB0aW9ucwotICogYXBwcm9wcmlhdGVseSAoZS5nLiBsb2cgdGhlIGV4Y2VwdGlvbiBhbmQgcmV0dXJuIGdyYWNlZnVsbHkgc28gdGhlIHRocmVhZAotICogY2FuIGNvbnRpbnVlIHRoZSBzeW5jaHJvbml6YXRpb24gcHJvY2VzcykuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWV4dGVuZHMgQXN5bmNocm9ub3VzU3luY2hyb25pemVyCi0JaW1wbGVtZW50cyBDYWxsYmFja1N5bmNocm9uaXplcgotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNhbGxiYWNrIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQKLQkgKiBjb21tYW5kIHRvIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4gQWxsb3cgdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykKLQkgKiB0byBiZSBhc3NpZ25lZCBKREstZ2VuZXJhdGVkIG5hbWVzLgotCSAqLwotCXB1YmxpYyBDYWxsYmFja0FzeW5jaHJvbm91c1N5bmNocm9uaXplcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoY29tbWFuZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgYXN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0aGF0IHVzZXMgdGhlIHNwZWNpZmllZAotCSAqIGNvbW1hbmQgdG8gcGVyZm9ybSB0aGUgc3luY2hyb25pemF0aW9uLiBBc3NpZ24gdGhlIHN5bmNocm9uaXphdGlvbiB0aHJlYWQocykKLQkgKiB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JcHVibGljIENhbGxiYWNrQXN5bmNocm9ub3VzU3luY2hyb25pemVyKENvbW1hbmQgY29tbWFuZCwgU3RyaW5nIHRocmVhZE5hbWUpIHsKLQkJc3VwZXIoY29tbWFuZCwgdGhyZWFkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBjb25zdW1lciB0aGF0IHdpbGwgbGV0IHVzIGtub3cgd2hlbiB0aGUgc3luY2hyb25pemF0aW9uIGhhcwotCSAqIHF1aWVzY2VkLgotCSAqLwotCUBPdmVycmlkZQotCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IuQ29uc3VtZXIgYnVpbGRDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0NvbnN1bWVyKGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6YXRpb25RdWllc2NlZCgpIHsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5zeW5jaHJvbml6YXRpb25RdWllc2NlZCh0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6YXRpb24gdGhyZWFkIHJ1bm5hYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIEV4dGVuZCB7QGxpbmsgQXN5bmNocm9ub3VzU3luY2hyb25pemVyLkNvbnN1bWVyfQotCSAqIHRvIG5vdGlmeSB0aGUgc3luY2hyb25pemVyIHdoZW4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMgcXVpZXNjZWQKLQkgKiAoaS5lLiB0aGUgY29tbWFuZCBoYXMgZmluaXNoZWQgZXhlY3V0aW5nIGFuZCB0aGVyZSBhcmUgbm8gZnVydGhlcgotCSAqIHJlcXVlc3RzIGZvciBzeW5jaHJvbml6YXRpb24pLgotCSAqIEJlY2F1c2Ugc3luY2hyb25pemF0aW9uIGlzIGFzeW5jaHJvbm91cywgbm8gb3RoZXIgdGhyZWFkIHdpbGwgYmUgYWJsZSB0bwotCSAqIGluaXRpYXRlIGFub3RoZXIgc3luY2hyb25pemF0aW9uIHVudGlsIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgaGF2ZSBiZWVuCi0JICogbm90aWZpZWQuIE5vdGUgYWxzbywgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyBjYW4sIHRoZW1zZWx2ZXMsCi0JICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSk7Ci0JICogYnV0IHRoaXMgc3luY2hyb25pemF0aW9uIHdpbGwgbm90IG9jY3VyIHVudGlsIDxlbT5hZnRlcjwvZW0+IGFsbCB0aGUKLQkgKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotCSAqLwotCWNsYXNzIENhbGxiYWNrQ29uc3VtZXIKLQkJZXh0ZW5kcyBDb25zdW1lcgotCXsKLQkJQ2FsbGJhY2tDb25zdW1lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJCXN1cGVyKGNvbW1hbmQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlzdXBlci5leGVjdXRlKCk7Ci0JCQkvLyBobW1tIC0gd2Ugd2lsbCBub3RpZnkgbGlzdGVuZXJzIGV2ZW4gd2hlbiB3ZSBvdXIgdGhyZWFkIGlzICJpbnRlcnJ1cHRlZCI7Ci0JCQkvLyB0aGF0IHNlZW1zIG9rLi4uICB+Ymp2Ci0JCQlpZiAoQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIudGhpcy5zeW5jaHJvbml6ZUZsYWcuaXNGYWxzZSgpKSB7Ci0JCQkJQ2FsbGJhY2tBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIudGhpcy5zeW5jaHJvbml6YXRpb25RdWllc2NlZCgpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L2ludGVybmFsL3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MTEwNjcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLQotLyoqCi0gKiBFeHRlbmQgdGhlIHN5bmNocm9ub3VzIHN5bmNocm9uaXplciB0byBub3RpZnkgbGlzdGVuZXJzCi0gKiB3aGVuIGEgc3luY2hyb25pemF0aW9uICJjeWNsZSIgaXMgY29tcGxldGU7IGkuZS4gdGhlIHN5bmNocm9uaXphdGlvbiBoYXMsCi0gKiBmb3IgdGhlIG1vbWVudCwgaGFuZGxlZCBldmVyeSAic3luY2hyb25pemUiIHJlcXVlc3QgYW5kIHF1aWVzY2VkLgotICogVGhpcyBub3RpZmljYXRpb24gaXMgPGVtPm5vdDwvZW0+IGd1YXJhbnRlZWQgdG8gb2NjdXIgd2l0aCA8ZW0+ZXZlcnk8L2VtPgotICogc3luY2hyb25pemF0aW9uICJjeWNsZSI7Ci0gKiBzaW5jZSBvdGhlciwgdW5yZWxhdGVkLCBzeW5jaHJvbml6YXRpb25zIGNhbiBiZSB0cmlnZ2VyZWQgY29uY3VycmVudGx5LgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJZiBhbm90aGVyIHN5bmNocm9uaXphdGlvbiBpcyBpbml0aWF0ZWQgd2hpbGUgd2UgYXJlCi0gKiBub3RpZnlpbmcgdGhlIHN5bmNocm9uaXplcidzIGxpc3RlbmVycyAoaS5lLiB0aGUgJ2FnYWluJyBmbGFnIGlzIHNldCksIGl0IHdpbGwgbm90Ci0gKiBzdGFydCB1bnRpbCBhbGwgdGhlIGxpc3RlbmVycyBhcmUgbm90aWZpZWQuCi0gKiBOb3RlIGFsc28sIHRoZSBzeW5jaHJvbml6ZXIncyBsaXN0ZW5lcnMgY2FuLCB0aGVtc2VsdmVzLAotICogdHJpZ2dlciBhbm90aGVyIHN5bmNocm9uaXphdGlvbiAoYnkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBjYWxsaW5nCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyI3N5bmNocm9uaXplKCl9KTsKLSAqIGJ1dCB0aGlzIHN5bmNocm9uaXphdGlvbiB3aWxsIG5vdCBvY2N1ciB1bnRpbCA8ZW0+YWZ0ZXI8L2VtPiBhbGwgdGhlCi0gKiBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcgotCWV4dGVuZHMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIENhbGxiYWNrU3luY2hyb25pemVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY2FsbGJhY2sgc3luY2hyb25vdXMgc3luY2hyb25pemVyIHRoYXQgdXNlcyB0aGUgc3BlY2lmaWVkCi0JICogY29tbWFuZCB0byBwZXJmb3JtIHRoZSBzeW5jaHJvbml6YXRpb24uCi0JICovCi0JcHVibGljIENhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKGNvbW1hbmQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWxsYmFja1N5bmNocm9uaXplciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTm90aWZ5IG91ciBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKCkgewotCQlmb3IgKExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCWxpc3RlbmVyLnN5bmNocm9uaXphdGlvblF1aWVzY2VkKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCXN1cGVyLmV4ZWN1dGVfKCk7Ci0JCWlmICh0aGlzLnN0YXRlLmdldFZhbHVlKCkgIT0gU3RhdGUuUkVQRUFUKSB7Ci0JCQkvLyBobW1tIC0gd2Ugd2lsbCBub3RpZnkgbGlzdGVuZXJzIGV2ZW4gd2hlbiB3ZSBhcmUgInN0b3BwZWQiOwotCQkJLy8gdGhhdCBzZWVtcyBvay4uLiAgfmJqdgotCQkJdGhpcy5zeW5jaHJvbml6YXRpb25RdWllc2NlZCgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjMyZjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotCi0vKioKLSAqIFRoaXMgc3luY2hyb25pemVyIHdpbGwgc3luY2hyb25pemUgaW1tZWRpYXRlbHkgYW5kIG5vdCByZXR1cm4gdW50aWwgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24gYW5kIGFueSBuZXN0ZWQgKHJlY3Vyc2l2ZSkgc3luY2hyb25pemF0aW9ucyBhcmUgY29tcGxldGUuCi0gKiBJbiBzb21lIHNpdHVhdGlvbnMgdGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHksIGFuZCBmb3IgYXMKLSAqIHNob3J0IGEgdGltZSBhcyBwb3NzaWJsZSwgYXMgaXQgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBvZiBkZWFkbG9ja3MuIEEKLSAqIGRlYWRsb2NrIGNhbiBvY2N1ciB3aGVuIHtAbGluayBTeW5jaHJvbml6ZXIjc3luY2hyb25pemUoKX0gaXMgY2FsbGVkIGZyb20gbXVsdGlwbGUKLSAqIHRocmVhZHMgYW5kIG11bHRpcGxlIHJlc291cmNlcyBhcmUgbG9ja2VkIGJ5IHRoZSBzeW5jaHJvbml6YXRpb24gaW4gdmFyeWluZwotICogb3JkZXJzLgotICogPHA+Ci0gKiBBcyBkZWZpbmVkIGluIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UsIHtAbGluayBTeW5jaHJvbml6ZXIjc3RhcnQoKX0KLSAqIGFuZCB7QGxpbmsgU3luY2hyb25pemVyI3N0b3AoKX0KLSAqIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkLgotICoge0BsaW5rIFN5bmNocm9uaXplciNzeW5jaHJvbml6ZSgpfSBzaG91bGQKLSAqIGFsd2F5cyBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgdGhyZWFkIChpLmUuIG9ubHkgcmVjdXJzaXZlbHksIGJleW9uZCB0aGUKLSAqIGluaXRpYWwgY2FsbCk7IGFsdGhvdWdoLCB0aGlzIHRvbyBpcyBub3QgcmVxdWlyZWQuCi0gKiBUaGlzIHRocmVhZCBuZWVkIG5vdCBiZSB0aGUgc2FtZSB0aHJlYWQgdGhhdCBleGVjdXRlcwotICoge0BsaW5rIFN5bmNocm9uaXplciNzdGFydCgpfSBhbmQge0BsaW5rIFN5bmNocm9uaXplciNzdG9wKCl9LgotICovCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIKLQlpbXBsZW1lbnRzIFN5bmNocm9uaXplcgotewotCS8qKgotCSAqIFRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZCB0aGF0IHBlcmZvcm1zIHRoZSBzeW5jaHJvbml6YXRpb24uIEl0IG1heQotCSAqIHRyaWdnZXIgZnVydGhlciBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9IChpLmUuIHRoZQotCSAqIHN5bmNocm9uaXphdGlvbiBtYXkgcmVjdXJzZSkuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBUaGUgc3luY2hyb25pemVyJ3MgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBTeW5jaHJvbml6ZWRPYmplY3Q8U3RhdGU+IHN0YXRlOwotCi0JLyoqCi0JICogVGhlIHN5bmNocm9uaXplcidzIGluaXRpYWwgc3RhdGUgaXMge0BsaW5rICNTVE9QUEVEfS4KLQkgKi8KLQllbnVtIFN0YXRlIHsKLQkJU1RPUFBFRCwKLQkJUkVBRFksCi0JCUVYRUNVVElORywKLQkJUkVQRUFULAotCQlTVE9QUElORwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiB0aGUgdW5jYXVnaHQgZXhjZXB0aW9ucyB0aHJvd24gYnkgdGhlIGNvbW1hbmQuCi0JICovCi0JZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIgdGhhdCB1c2VzIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB0bwotCSAqIHBlcmZvcm0gdGhlIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChjb21tYW5kID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCS8vIHVzZSB0aGUgc3luY2hyb25pemVyIGFzIHRoZSBtdXRleCBzbyBpdCBpcyBmcmVlZCB1cCBieSB0aGUgd2FpdCBpbiAjc3RvcCgpCi0JCXRoaXMuc3RhdGUgPSBuZXcgU3luY2hyb25pemVkT2JqZWN0PFN0YXRlPihTdGF0ZS5TVE9QUEVELCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU3luY2hyb25pemVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFNldCB0aGUgc3luY2hyb25pemVyJ3Mge0BsaW5rICNzdGF0ZX0gdG8ge0BsaW5rIFN0YXRlI1JFQURZIFJFQURZfQotCSAqIGFuZCBleGVjdXRlIHRoZSBmaXJzdCBzeW5jaHJvbml6YXRpb24uIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUKLQkgKiBzeW5jaHJvbml6ZXIgaXMgbm90IHtAbGluayBTdGF0ZSNTVE9QUEVEIFNUT1BQRUR9LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJc3dpdGNoICh0aGlzLnN0YXRlLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgU1RPUFBFRDoKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFQURZKTsKLQkJCQl0aGlzLnN5bmNocm9uaXplKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFQURZOgotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCWNhc2UgU1RPUFBJTkc6Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEl0J3MgcG9zc2libGUgdG8gY29tZSBiYWNrIGhlcmUgaWYgdGhlIHN5bmNocm9uaXphdGlvbiBjb21tYW5kIHJlY3Vyc2VzCi0JICogYW5kIHRyaWdnZXJzIGFub3RoZXIgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQlpZiAodGhpcy5iZWdpblN5bmNocm9uaXphdGlvbigpKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplXygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBjbGllbnQgaGFzIHJlcXVlc3RlZCBhIHN5bmNocm9uaXphdGlvbi4KLQkgKiBSZXR1cm4gd2hldGhlciB3ZSBjYW4gYmVnaW4gYSBuZXcgc3luY2hyb25pemF0aW9uLgotCSAqIElmIGEgc3luY2hyb25pemF0aW9uIGlzIGFscmVhZHkgdW5kZXIgd2F5LCByZXR1cm4gPGNvZGU+ZmFsc2U8L2NvZGU+OwotCSAqIGJ1dCBzZXQgdGhlIHtAbGluayAjc3RhdGV9IHRvIHtAbGluayBTdGF0ZSNSRVBFQVQgUkVQRUFUfQotCSAqIHNvIGFub3RoZXIgc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudAotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZS4KLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBib29sZWFuIGJlZ2luU3luY2hyb25pemF0aW9uKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCS8vIHN5bmNocm9uaXphdGlvbiBpcyBub3QgYWxsb3dlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWNhc2UgUkVBRFk6Ci0JCQkJLy8gYmVnaW4gYSBuZXcgc3luY2hyb25pemF0aW9uCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5FWEVDVVRJTkcpOwotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQkJLy8gc2V0IGZsYWcgc28gYSBuZXcgc3luY2hyb25pemF0aW9uIHdpbGwgb2NjdXIgb25jZSB0aGUgY3VycmVudCBvbmUgaXMgZmluaXNoZWQKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlJFUEVBVCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gdGhlICJyZXBlYXQiIGZsYWcgaXMgYWxyZWFkeSBzZXQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIFNUT1BQSU5HOgotCQkJCS8vIG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBhcmUgYWxsb3dlZAotCQkJCXJldHVybiBmYWxzZTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgdGhpcy5idWlsZElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgcGVyIHNldCBvZiAicmVjdXJzaW5nIgotCSAqIHN5bmNocm9uaXphdGlvbnMuIEFueSByZWN1cnNpdmUgY2FsbCB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9IHdpbGwKLQkgKiBzaW1wbHkgc2V0IHRoZSB7QGxpbmsgI3N0YXRlfSB0byB7QGxpbmsgU3RhdGUjUkVQRUFUIFJFUEVBVH0sCi0JICogY2F1c2luZyB0aGUgY29tbWFuZCB0byBleGVjdXRlIGFnYWluLgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZV8oKSB7Ci0JCWRvIHsKLQkJCXRoaXMuZXhlY3V0ZSgpOwotCQl9IHdoaWxlICh0aGlzLnJlcGVhdFN5bmNocm9uaXphdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBjbGllbnQtc3VwcGxpZWQgY29tbWFuZC4gRG8gbm90IGFsbG93IGFueSB1bmhhbmRsZWQKLQkgKiBleGNlcHRpb25zIHRvIGtpbGwgdGhlIHRocmVhZC4gU3RvcmUgdGhlbSB1cCBmb3IgbGF0ZXIgcGFpbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZSgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMuZXhlY3V0ZV8oKTsKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQl0aGlzLmV4Y2VwdGlvbnMuYWRkKGV4KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGp1c3QgZXhlY3V0ZSB0aGUgY29tbWFuZC4KLQkgKi8KLQl2b2lkIGV4ZWN1dGVfKCkgewotCQl0aGlzLmNvbW1hbmQuZXhlY3V0ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IHN5bmNocm9uaXphdGlvbiBoYXMgZmluaXNoZWQuCi0JICogUmV0dXJuIHdoZXRoZXIgd2Ugc2hvdWxkIGJlZ2luIGFub3RoZXIgc3luY2hyb25pemF0aW9uLgotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIGJvb2xlYW4gcmVwZWF0U3luY2hyb25pemF0aW9uKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJY2FzZSBSRUFEWToKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQljYXNlIEVYRUNVVElORzoKLQkJCQkvLyBzeW5jaHJvbml6YXRpb24gaGFzIGZpbmlzaGVkIGFuZCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGFub3RoZXI7IHJldHVybiB0byAicmVhZHkiCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5SRUFEWSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJY2FzZSBSRVBFQVQ6Ci0JCQkJLy8gdGhlICJyZXBlYXQiIGZsYWcgd2FzIHNldDsgY2xlYXIgaXQgYW5kIHN0YXJ0IGFub3RoZXIgc3luY2hyb25pemF0aW9uCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5FWEVDVVRJTkcpOwotCQkJCXJldHVybiB0cnVlOwotCQkJY2FzZSBTVE9QUElORzoKLQkJCQkvLyBhIGNsaWVudCBoYXMgaW5pdGlhdGVkIGEgInN0b3AiOyBtYXJrIHRoZSAic3RvcCIgY29tcGxldGUgYW5kIHBlcmZvcm0gbm8gbW9yZSBzeW5jaHJvbml6YXRpb25zCi0JCQkJdGhpcy5zdGF0ZS5zZXRWYWx1ZShTdGF0ZS5TVE9QUEVEKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZmxhZ3Mgc28gdGhhdCBubyBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuIElmIGFueSB1bmNhdWdodAotCSAqIGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gd2hpbGUgdGhlIHN5bmNocm9uaXphdGlvbiB3YXMgZXhlY3V0aW5nLAotCSAqIHdyYXAgdGhlbSBpbiBhIGNvbXBvc2l0ZSBleGNlcHRpb24gYW5kIHRocm93IHRoZSBjb21wb3NpdGUgZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlzd2l0Y2ggKHRoaXMuc3RhdGUuZ2V0VmFsdWUoKSkgewotCQkJY2FzZSBTVE9QUEVEOgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCWNhc2UgUkVBRFk6Ci0JCQkJLy8gc2ltcGx5IHJldHVybiB0byAic3RvcHBlZCIgc3RhdGUKLQkJCQl0aGlzLnN0YXRlLnNldFZhbHVlKFN0YXRlLlNUT1BQRUQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFWEVDVVRJTkc6Ci0JCQljYXNlIFJFUEVBVDoKLQkJCQkvLyBzZXQgdGhlICJzdG9wcGluZyIgZmxhZyBhbmQgd2FpdCB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGhhcyBmaW5pc2hlZAotCQkJCXRoaXMuc3RhdGUuc2V0VmFsdWUoU3RhdGUuU1RPUFBJTkcpOwotCQkJCXRoaXMud2FpdFVudGlsU3RvcHBlZCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVE9QUElORzoKLQkJCQl0aHJvdyB0aGlzLmJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IHRoaXMuYnVpbGRJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCi0JCWlmICh0aGlzLmV4Y2VwdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJVGhyb3dhYmxlW10gdGVtcCA9IHRoaXMuZXhjZXB0aW9ucy50b0FycmF5KG5ldyBUaHJvd2FibGVbdGhpcy5leGNlcHRpb25zLnNpemUoKV0pOwotCQkJdGhpcy5leGNlcHRpb25zLmNsZWFyKCk7Ci0JCQl0aHJvdyBuZXcgQ29tcG9zaXRlRXhjZXB0aW9uKHRlbXApOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3YWl0IHdpbGwgZnJlZSB1cCB0aGUgc3luY2hyb25pemVyJ3Mgc3luY2hyb25pemVkIG1ldGhvZHMKLQkgKiAoc2luY2UgdGhlIHN5bmNocm9uaXplciBpcyB0aGUgc3RhdGUncyBtdXRleCkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRVbnRpbFN0b3BwZWQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnN0YXRlLndhaXRVbnRpbFZhbHVlSXMoU3RhdGUuU1RPUFBFRCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkICNzdG9wKCkgd2FzIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKLQkJCS8vIGZvciB0aGUgc3luY2hyb25pemF0aW9uIHRvIGZpbmlzaCAtIGlnbm9yZTsKLQkJCS8vICdzdGF0ZScgaXMgc3RpbGwgc2V0IHRvICdTVE9QUElORycsIHNvIHRoZSAjc3luY2hyb25pemVfKCkgbG9vcAotCQkJLy8gd2lsbCBzdGlsbCBzdG9wIC0gd2UganVzdCB3b24ndCB3YWl0IGFyb3VuZCBmb3IgaXQuLi4KLQkJfQotCX0KLQotCXByaXZhdGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGJ1aWxkSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic3RhdGU6ICIgKyB0aGlzLnN0YXRlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuc3RhdGUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL01vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MGNiMjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYmUgaW1wbGVtZW50ZWQgYnkgbW9kZWxzIHRoYXQgbm90aWZ5IGxpc3RlbmVycyBvZgotICogY2hhbmdlcyB0byBib3VuZCBwcm9wZXJ0aWVzLCBjb2xsZWN0aW9ucywgbGlzdHMsIGFuZC9vciB0cmVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgQ2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgU3RhdGVDaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcgotICogQHNlZSBMaXN0Q2hhbmdlTGlzdGVuZXIKLSAqIEBzZWUgVHJlZUNoYW5nZUxpc3RlbmVyCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsCi0gKi8KLS8vIFRPRE8gdXNlIG9iamVjdHMgKElEcz8pIGluc3RlYWQgb2Ygc3RyaW5ncyB0byBpZGVudGlmeSBhc3BlY3RzPwotcHVibGljIGludGVyZmFjZSBNb2RlbCB7Ci0KLQkvLyAqKioqKioqKioqIGNoYW5nZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIGNoYW5nZSBldmVudHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZENoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNoYW5nZSBsaXN0ZW5lci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGxpc3RlbmVyIGlzIG51bGwgb3IgaWYgdGhlIGxpc3RlbmVyIHdhcyBuZXZlciBhZGRlZC4KLQkgKi8KLQl2b2lkIHJlbW92ZUNoYW5nZUxpc3RlbmVyKENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBzdGF0ZSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBzdGF0ZSBjaGFuZ2UgZXZlbnRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2FtZSBsaXN0ZW5lciBpcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLQkgKiBUaGUgbGlzdGVuZXIgY2Fubm90IGJlIG51bGwuCi0JICovCi0Jdm9pZCBhZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKFN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc3RhdGUgY2hhbmdlIGxpc3RlbmVyLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbGlzdGVuZXIgaXMgbnVsbCBvciBpZiB0aGUgbGlzdGVuZXIgd2FzIG5ldmVyIGFkZGVkLgotCSAqLwotCXZvaWQgcmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIGEgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGFsbCBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBzYW1lIGxpc3RlbmVyIGlzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLgotCSAqIFRoZSBsaXN0ZW5lciBjYW5ub3QgYmUgbnVsbC4KLQkgKi8KLQl2b2lkIGFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIHByb3BlcnR5TmFtZSwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYSBsaXN0ZW5lciB0aGF0IGxpc3RlbnMgdG8gYWxsIHByb3BlcnR5IGNoYW5nZSBldmVudHMsCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIGxpc3QgbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkTGlzdENoYW5nZUxpc3RlbmVyKFN0cmluZyBsaXN0TmFtZSwgTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgbGlzdCBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBsaXN0IG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoU3RyaW5nIGxpc3ROYW1lLCBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHRyZWUgY2hhbmdlICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzIHdpdGgKLQkgKiB0aGUgc3BlY2lmaWVkIHRyZWUgbmFtZS4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIHNhbWUgbGlzdGVuZXIgaXMgYWRkZWQgbW9yZSB0aGFuIG9uY2UuCi0JICogVGhlIGxpc3RlbmVyIGNhbm5vdCBiZSBudWxsLgotCSAqLwotCXZvaWQgYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFN0cmluZyB0cmVlTmFtZSwgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSBhIGxpc3RlbmVyIHRoYXQgbGlzdGVucyB0byBhbGwgdHJlZSBjaGFuZ2UgZXZlbnRzLAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCB0cmVlIG5hbWUuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBsaXN0ZW5lciBpcyBudWxsIG9yIGlmIHRoZSBsaXN0ZW5lciB3YXMgbmV2ZXIgYWRkZWQuCi0JICovCi0Jdm9pZCByZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoU3RyaW5nIHRyZWVOYW1lLCBUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIyNDdlYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgYWxsIHRoZSBjaGFuZ2UgZXZlbnRzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IG1vZGVscy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYW5nZUV2ZW50IGV4dGVuZHMgRXZlbnRPYmplY3QgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBNb2RlbCBnZXRTb3VyY2UoKSB7Ci0JCXJldHVybiAoTW9kZWwpIHN1cGVyLmdldFNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5hcHBlbmRTaW1wbGVUb1N0cmluZyhzYiwgdGhpcyk7Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbGVuID0gc2IubGVuZ3RoKCk7Ci0JCXRoaXMudG9TdHJpbmcoc2IpOwotCQlpZiAoc2IubGVuZ3RoKCkgPT0gbGVuKSB7Ci0JCQlzYi5kZWxldGVDaGFyQXQobGVuIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nQnVpbGRlciBzYikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGRvIHNvbWV0aGluZyBhIGJpdCBtb3JlIGhlbHBmdWwKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25BZGRFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkFkZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTJlN2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgImNvbGxlY3Rpb24gYWRkIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGFkZHMgaXRlbXMgdG8gYQotICogImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24uIEEgPGNvZGU+Q29sbGVjdGlvbkFkZEV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi0vKiAKLSAqIERlc2lnbiBvcHRpb25zOgotICogLSBjcmVhdGUgYSBjb2xsZWN0aW9uIHRvIHdyYXAgYSBzaW5nbGUgYWRkZWQgb3IgcmVtb3ZlZCBpdGVtCi0gKiAJKHRoaXMgaXMgdGhlIG9wdGlvbiB3ZSBpbXBsZW1lbnRlZCBiZWxvdyBhbmQgaW4gY29sbGFib3JhdGluZyBjb2RlKQotICogCXNpbmNlIHRoZXJlIGlzIG5vIHdheSB0byBvcHRpbWl6ZSBkb3duc3RyZWFtIGNvZGUgZm9yCi0gKiAJc2luZ2xlIGl0ZW1zLCB3ZSB0YWtlIGFub3RoZXIgcGVyZm9ybWFuY2UgaGl0IGJ5IGJ1aWxkaW5nCi0gKiAJYSBjb2xsZWN0aW9uIGVhY2ggdGltZSAgKEBzZWUgQ29sbGVjdGlvbnMjc2luZ2xldG9uKE9iamVjdCkpCi0gKiAJYW5kIGZvcmNpbmcgZG93bnN0cmVhbSBjb2RlIHRvIHVzZSBhbiBpdGVyYXRvciBldmVyeSB0aW1lCi0gKiAKLSAqIC0gZmlyZSBhIHNlcGFyYXRlIGV2ZW50IGZvciBlYWNoIGl0ZW0gYWRkZWQgb3IgcmVtb3ZlZAotICogCWVsaW1pbmF0ZXMgYW55IHBvdGVudGlhbCBmb3Igb3B0aW1pemF0aW9ucyB0byBkb3duc3RyZWFtIGNvZGUKLSAqIAotICogLSBhZGQgcHJvdG9jb2wgdG8gc3VwcG9ydCBib3RoIHNpbmdsZSBpdGVtcyBhbmQgY29sbGVjdGlvbnMKLSAqIAlhZGRzIGNvbmRpdGlvbmFsIGxvZ2ljIHRvIGRvd25zdHJlYW0gY29kZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29sbGVjdGlvbkFkZEV2ZW50IGV4dGVuZHMgQ29sbGVjdGlvbkV2ZW50IHsKLQotCS8qKiBUaGUgaXRlbXMgYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBpdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gYWRkZWQgdG8gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25BZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcyhzb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBuZXcgT2JqZWN0W10ge2l0ZW19KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lLCBDb2xsZWN0aW9uPD8+IGl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgaXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnaXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25BZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0W10gaXRlbXMpIHsKLQkJc3VwZXIoc291cmNlLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXRoaXMuaXRlbXMgPSBpdGVtczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtcyBhZGRlZCB0byB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIHRvIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuaXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3Q29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2hhbmdlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25DaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJjNzU5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25DaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJjb2xsZWN0aW9uIGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uIGluIGEgbWFubmVyIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5Ci0gKiB0aGUgb3RoZXIgY29sbGVjdGlvbiBldmVudHMuCi0gKiBBIDxjb2RlPkNvbGxlY3Rpb25DaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfS4KLSAqIEEgPGNvZGU+Q29sbGVjdGlvbkNoYW5nZUV2ZW50PC9jb2RlPiBpcyBhY2NvbXBhbmllZCBieSB0aGUgY29sbGVjdGlvbiBuYW1lIGFuZAotICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGNvbGxlY3Rpb24uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDb2xsZWN0aW9uRXZlbnQgewotCi0JLyoqCi0JICogVGhlIHRoZSBjb2xsZWN0aW9uIGluIGl0cyBjdXJyZW50IHN0YXRlLgotCSAqIENsaWVudHMgd2lsbCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gc3luY2hyb25pemUKLQkgKiB3aXRoIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gY29sbGVjdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7Ci0JCXRoaXMoc291cmNlLCBjb2xsZWN0aW9uTmFtZSwgY29sbGVjdGlvbi50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdjb2xsZWN0aW9uJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdFtdIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoc291cmNlLCBjb2xsZWN0aW9uTmFtZSk7Ci0JCXRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0Q29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbGxlY3Rpb25TaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2xsZWN0aW9uLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5jb2xsZWN0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGNvbGxlY3Rpb24gbmFtZS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3Q29sbGVjdGlvbk5hbWUsIHRoaXMuY29sbGVjdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2xlYXJFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvbkNsZWFyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZiMmFkYy4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uQ2xlYXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAiY29sbGVjdGlvbiBjbGVhciIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjbGVhcnMKLSAqIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGNvbGxlY3Rpb24uIEEgPGNvZGU+Q29sbGVjdGlvbkNsZWFyRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb2xsZWN0aW9uQ2xlYXJFdmVudCBleHRlbmRzIENvbGxlY3Rpb25FdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGNvbGxlY3Rpb24gY2xlYXIgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DbGVhckV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLmNvbGxlY3Rpb25OYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25DbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNsZWFyRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2UwYmRhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0NvbGxlY3Rpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0vLyBUT0RPIGFkZCAiaXRlbS9vcmlnaW5hbC9uZXN0ZWQgZXZlbnQiIGZvciBpdGVtIGNoYW5nZWQ/Ci0vKioKLSAqIEEgImNvbGxlY3Rpb24iIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgY29sbGVjdGlvbi4gQSA8Y29kZT5Db2xsZWN0aW9uRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0uCi0gKiBUaGUgaW50ZW50IGlzIHRoYXQgYW55IGxpc3RlbmVyCi0gKiBjYW4ga2VlcCBpdHNlbGYgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsJ3MgY29sbGVjdGlvbiB2aWEgdGhlIGNvbGxlY3Rpb24KLSAqIGV2ZW50cyBpdCByZWNlaXZlcyBhbmQgbmVlZCBub3QgbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsCi0gKiBjb2xsZWN0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkV2ZW50IGV4dGVuZHMgQ2hhbmdlRXZlbnQgewotCi0JLyoqIE5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLiAqLwotCWZpbmFsIFN0cmluZyBjb2xsZWN0aW9uTmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGNvbGxlY3Rpb25OYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWlmIChjb2xsZWN0aW9uTmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbGxlY3Rpb25OYW1lID0gY29sbGVjdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sbGVjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb25OYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sbGVjdGlvbk5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvQ29sbGVjdGlvblJlbW92ZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uUmVtb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyMjE4ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Db2xsZWN0aW9uUmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAiY29sbGVjdGlvbiByZW1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVtb3ZlcyBpdGVtcwotICogZnJvbSBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBjb2xsZWN0aW9uLiBBIDxjb2RlPkNvbGxlY3Rpb25SZW1vdmVFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotLyoKLSAqIFNlZSBkZXNpZ24gZGlzY3Vzc2lvbiBpbiBDb2xsZWN0aW9uQWRkRXZlbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbGxlY3Rpb25SZW1vdmVFdmVudCBleHRlbmRzIENvbGxlY3Rpb25FdmVudCB7Ci0KLQkvKiogVGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgY29sbGVjdGlvbi4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGl0ZW1zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBjb2xsZWN0aW9uIHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaXRlbSBUaGUgaXRlbSByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25SZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcyhzb3VyY2UsIGNvbGxlY3Rpb25OYW1lLCBuZXcgT2JqZWN0W10ge2l0ZW19KTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgY29sbGVjdGlvbiByZW1vdmUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyByZW1vdmVkIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25SZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBjb2xsZWN0aW9uTmFtZSwgQ29sbGVjdGlvbjw/PiBpdGVtcykgewotCQl0aGlzKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUsIGl0ZW1zLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ2l0ZW1zJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIE9iamVjdFtdIGl0ZW1zKSB7Ci0JCXN1cGVyKHNvdXJjZSwgY29sbGVjdGlvbk5hbWUpOwotCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5pdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuaXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5jb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgY29sbGVjdGlvbiBuYW1lLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3Q29sbGVjdGlvbk5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0QWRkRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RBZGRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDA3NDBhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RBZGRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IGFkZCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBhZGRzIGl0ZW1zIHRvIGEKLSAqICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RBZGRFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotLyoKLSAqIFNlZSBkZXNpZ24gZGlzY3Vzc2lvbiBpbiBDb2xsZWN0aW9uQWRkRXZlbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RBZGRFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQkvKiogVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0JLyoqIFRoZSBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGl0ZW1zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IGFkZCBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIGFkZGVkLgotCSAqIEBwYXJhbSBpdGVtIFRoZSBpdGVtIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgYWRkIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGxpc3ROYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQuCi0JICogQHBhcmFtIGl0ZW1zIFRoZSBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdEFkZEV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIExpc3Q8Pz4gaXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgaXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnaXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIExpc3RBZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3RbXSBpdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgYWRkZWQgdG8gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpdGVtcyBhZGRlZCB0byB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0SXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxPYmplY3Q+KHRoaXMuaXRlbXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIHRvIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuaXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lIGFuZCBkaXNwbGFjaW5nCi0JICogdGhlIGluZGV4IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgotCSAqLwotCXB1YmxpYyBMaXN0QWRkRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QWRkRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgdGhpcy5pbmRleCArIG9mZnNldCwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2hhbmdlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmNmMjkxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBsaXN0IGluIGEgbWFubmVyIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5Ci0gKiB0aGUgb3RoZXIgbGlzdCBldmVudHMuCi0gKiBBIDxjb2RlPkxpc3RDaGFuZ2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIEEgPGNvZGU+TGlzdENoYW5nZUV2ZW50PC9jb2RlPiBpcyBhY2NvbXBhbmllZCBieSB0aGUgbGlzdCBuYW1lIGFuZAotICogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxpc3QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q2hhbmdlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqCi0JICogVGhlIHRoZSBsaXN0IGluIGl0cyBjdXJyZW50IHN0YXRlLgotCSAqIENsaWVudHMgd2lsbCBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gc3luY2hyb25pemUKLQkgKiB3aXRoIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0W10gbGlzdDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgTGlzdDw/PiBsaXN0KSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgbGlzdC50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdsaXN0JyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIE9iamVjdFtdIGxpc3QpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JCXRoaXMubGlzdCA9IGxpc3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0TGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5saXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpc3RTaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5saXN0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUV2ZW50KG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIHRoaXMubGlzdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2xlYXJFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdENsZWFyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhZjU1OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0Q2xlYXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBjbGVhciIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjbGVhcnMKLSAqIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdENsZWFyRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q2xlYXJFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCBjbGVhciBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdENsZWFyRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUpIHsKLQkJc3VwZXIoc291cmNlLCBsaXN0TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RDbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMubGlzdE5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdENsZWFyRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2xlYXJFdmVudChuZXdTb3VyY2UsIG5ld0xpc3ROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDM0NTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLy8gVE9ETyBhZGQgIml0ZW0vb3JpZ2luYWwvbmVzdGVkIGV2ZW50IiBmb3IgaXRlbSBjaGFuZ2VkPwotLyoqCi0gKiBBICJsaXN0IiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdEV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogVGhlIGludGVudCBpcyB0aGF0IGFueSBsaXN0ZW5lcgotICogY2FuIGtlZXAgaXRzZWxmIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb2RlbCdzIGxpc3QgdmlhIHRoZSBsaXN0Ci0gKiBldmVudHMgaXQgcmVjZWl2ZXMgYW5kIG5lZWQgbm90IG1haW50YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbAotICogbGlzdC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIExpc3RFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4gKi8KLQlmaW5hbCBTdHJpbmcgbGlzdE5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIExpc3RFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAobGlzdE5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5saXN0TmFtZSA9IGxpc3ROYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3ROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5saXN0TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmxpc3ROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RNb3ZlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L0xpc3RNb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyN2VkYi4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0TW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCBtb3ZlIiBldmVudCBnZXRzIGRlbGl2ZXJlZCB3aGVuZXZlciBhIG1vZGVsIG1vdmVzIHRoZSBlbGVtZW50cyBpbgotICogYSAiYm91bmQiIG9yICJjb25zdHJhaW5lZCIgbGlzdC4gQSA8Y29kZT5MaXN0TW92ZUV2ZW50PC9jb2RlPiBpcyBzZW50Ci0gKiBhcyBhbiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTGlzdE1vdmVFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQkvKiogVGhlIGluZGV4IHRvIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IHRhcmdldEluZGV4OwotCi0JLyoqIFRoZSBpbmRleCBmcm9tIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLiAqLwotCXByaXZhdGUgZmluYWwgaW50IHNvdXJjZUluZGV4OwotCi0JLyoqIFRoZSBudW1iZXIgb2YgaXRlbXMgbW92ZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gdGFyZ2V0SW5kZXggVGhlIGluZGV4IHRvIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLgotCSAqIEBwYXJhbSBzb3VyY2VJbmRleCBUaGUgaW5kZXggZnJvbSB3aGljaCB0aGUgaXRlbXMgd2VyZSBtb3ZlZC4KLQkgKiBAcGFyYW0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgaXRlbXMgbW92ZWQuCi0JICovCi0JcHVibGljIExpc3RNb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQl0aGlzLnRhcmdldEluZGV4ID0gdGFyZ2V0SW5kZXg7Ci0JCXRoaXMuc291cmNlSW5kZXggPSBzb3VyY2VJbmRleDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggdG8gd2hpY2ggdGhlIGl0ZW1zIHdlcmUgbW92ZWQuCi0JICovCi0JcHVibGljIGludCBnZXRUYXJnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCBmcm9tIHdoaWNoIHRoZSBpdGVtcyB3ZXJlIG1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U291cmNlSW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLnNvdXJjZUluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZW1zIG1vdmVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5zb3VyY2VJbmRleCk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLnRhcmdldEluZGV4KTsKLQkJc2IuYXBwZW5kKCIgbGVuZ3RoPSIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLmxlbmd0aCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RNb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0TW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdE1vdmVFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gbmV3IExpc3RNb3ZlRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgdGhpcy50YXJnZXRJbmRleCArIG9mZnNldCwgdGhpcy5zb3VyY2VJbmRleCArIG9mZnNldCwgdGhpcy5sZW5ndGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlbW92ZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVtb3ZlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiODJkOC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVtb3ZlRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAibGlzdCByZW1vdmUiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVtb3ZlcyBpdGVtcwotICogZnJvbSBhICJib3VuZCIgb3IgImNvbnN0cmFpbmVkIiBsaXN0LiBBIDxjb2RlPkxpc3RSZW1vdmVFdmVudDwvY29kZT4gaXMgc2VudAotICogYXMgYW4gYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotLyoKLSAqIFNlZSBkZXNpZ24gZGlzY3Vzc2lvbiBpbiBDb2xsZWN0aW9uQWRkRXZlbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RSZW1vdmVFdmVudCBleHRlbmRzIExpc3RFdmVudCB7Ci0KLQkvKiogVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0KLQkvKiogVGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGl0ZW1zOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBjb2xsZWN0aW9uTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQuCi0JICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBMaXN0UmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgbmV3IE9iamVjdFtdIHtpdGVtfSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IGxpc3QgcmVtb3ZlIGV2ZW50LgotCSAqCi0JICogQHBhcmFtIHNvdXJjZSBUaGUgb2JqZWN0IG9uIHdoaWNoIHRoZSBldmVudCBpbml0aWFsbHkgb2NjdXJyZWQuCi0JICogQHBhcmFtIGNvbGxlY3Rpb25OYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgbGlzdCB0aGF0IHdhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVtb3ZlZC4KLQkgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIGxpc3ROYW1lLCBpbnQgaW5kZXgsIENvbGxlY3Rpb248Pz4gaXRlbXMpIHsKLQkJdGhpcyhzb3VyY2UsIGxpc3ROYW1lLCBpbmRleCwgaXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAnaXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIExpc3RSZW1vdmVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBPYmplY3RbXSBpdGVtcykgewotCQlzdXBlcihzb3VyY2UsIGxpc3ROYW1lKTsKLQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl0aGlzLml0ZW1zID0gaXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7Ci0JCXJldHVybiB0aGlzLmluZGV4OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXRJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5pdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgaXRlbXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SXRlbXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pdGVtcy5sZW5ndGg7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdUb29scy5hcHBlbmQoc2IsIHRoaXMuaXRlbXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBMaXN0UmVtb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0UmVtb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lIGFuZCBkaXNwbGFjaW5nCi0JICogdGhlIGluZGV4IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LgotCSAqLwotCXB1YmxpYyBMaXN0UmVtb3ZlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3TGlzdE5hbWUsIGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIG5ldyBMaXN0UmVtb3ZlRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgdGhpcy5pbmRleCArIG9mZnNldCwgdGhpcy5pdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVwbGFjZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9MaXN0UmVwbGFjZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNmYzNzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvTGlzdFJlcGxhY2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJsaXN0IHJlcGxhY2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgcmVwbGFjZXMgaXRlbXMgaW4gYQotICogImJvdW5kIiBvciAiY29uc3RyYWluZWQiIGxpc3QuIEEgPGNvZGU+TGlzdFJlcGxhY2VFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExpc3RSZXBsYWNlRXZlbnQgZXh0ZW5kcyBMaXN0RXZlbnQgewotCi0JLyoqIFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSByZXBsYWNlZC4gKi8KLQlwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLQotCS8qKiBUaGUgbmV3IGl0ZW1zIHRoYXQgcmVwbGFjZWQgdGhlIG9sZCBpdGVtcyBpbiB0aGUgbGlzdC4gKi8KLQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIG5ld0l0ZW1zOwotCi0JLyoqIFRoZSBvbGQgaXRlbXMgdGhhdCB3ZXJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgaXRlbXMgaW4gdGhlIGxpc3QuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBvbGRJdGVtczsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgbGlzdCByZXBsYWNlIGV2ZW50IGZvciBhIGxpc3Qgb2YgcmVwbGFjZWQgaXRlbXMuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gbGlzdE5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSBsaXN0IHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBhdCB3aGljaCB0aGUgaXRlbSBpbiB0aGUgbGlzdCB3YXMgcmVwbGFjZWQuCi0JICogQHBhcmFtIG5ld0l0ZW0gVGhlIG5ldyBpdGVtIGluIHRoZSBsaXN0LgotCSAqIEBwYXJhbSBvbGRJdGVtIFRoZSBvbGQgaXRlbSBpbiB0aGUgbGlzdCB0aGF0IHdlcmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0IG5ld0l0ZW0sIE9iamVjdCBvbGRJdGVtKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ldyBPYmplY3RbXSB7bmV3SXRlbX0sIG5ldyBPYmplY3RbXSB7b2xkSXRlbX0pOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0IHJlcGxhY2UgZXZlbnQgZm9yIGEgbGlzdCBvZiByZXBsYWNlZCBpdGVtcy4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSBsaXN0TmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIGxpc3QgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyBpbiB0aGUgbGlzdCB3ZXJlIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdJdGVtcyBUaGUgbmV3IGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqIEBwYXJhbSBvbGRJdGVtcyBUaGUgb2xkIGl0ZW1zIGluIHRoZSBsaXN0IHRoYXQgd2VyZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyBsaXN0TmFtZSwgaW50IGluZGV4LCBMaXN0PD8+IG5ld0l0ZW1zLCBMaXN0PD8+IG9sZEl0ZW1zKSB7Ci0JCXRoaXMoc291cmNlLCBsaXN0TmFtZSwgaW5kZXgsIG5ld0l0ZW1zLnRvQXJyYXkoKSwgb2xkSXRlbXMudG9BcnJheSgpKTsgIC8vIE5QRSBpZiBlaXRoZXIgJ25ld0l0ZW1zJyBvciAnb2xkSXRlbXMnIGlzIG51bGwKLQl9Ci0KLQlwcml2YXRlIExpc3RSZXBsYWNlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgbGlzdE5hbWUsIGludCBpbmRleCwgT2JqZWN0W10gbmV3SXRlbXMsIE9iamVjdFtdIG9sZEl0ZW1zKSB7Ci0JCXN1cGVyKHNvdXJjZSwgbGlzdE5hbWUpOwotCQlpZiAobmV3SXRlbXMubGVuZ3RoICE9IG9sZEl0ZW1zLmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2l6ZXMgbXVzdCBtYXRjaCAtIG5ldyBpdGVtcyBzaXplOiAiICsgbmV3SXRlbXMubGVuZ3RoIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiIG9sZCBpdGVtcyBzaXplOiAiICsgb2xkSXRlbXMubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJdGhpcy5uZXdJdGVtcyA9IG5ld0l0ZW1zOwotCQl0aGlzLm9sZEl0ZW1zID0gb2xkSXRlbXM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGl0ZW1zIHdlcmUgcmVwbGFjZWQgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBnZXRJbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMuaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgaXRlbXMgdGhhdCByZXBsYWNlZCB0aGUgb2xkIGl0ZW1zIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTw/PiBnZXROZXdJdGVtcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5uZXdJdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvbGQgaXRlbXMgdGhhdCB3ZXJlIHJlcGxhY2VkIGJ5IHRoZSBuZXcgaXRlbXMgaW4gdGhlIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldE9sZEl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLm9sZEl0ZW1zKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyB0aGF0IHdlcmUgcmVwbGFjZWQuCi0JICovCi0JcHVibGljIGludCBnZXRJdGVtc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLm5ld0l0ZW1zLmxlbmd0aDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5vbGRJdGVtcyk7Ci0JCXNiLmFwcGVuZCgiID0+ICIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rvb2xzLmFwcGVuZChzYiwgdGhpcy5uZXdJdGVtcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsb25pbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UuCi0JICovCi0JcHVibGljIExpc3RSZXBsYWNlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy5saXN0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgbGlzdCBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgbGlzdCBuYW1lLgotCSAqLwotCXB1YmxpYyBMaXN0UmVwbGFjZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0xpc3ROYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgbmV3TGlzdE5hbWUsIDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIGxpc3QgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIGxpc3QgbmFtZSBhbmQgZGlzcGxhY2luZwotCSAqIHRoZSBpbmRleCBieSB0aGUgc3BlY2lmaWVkIGFtb3VudC4KLQkgKi8KLQlwdWJsaWMgTGlzdFJlcGxhY2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UsIFN0cmluZyBuZXdMaXN0TmFtZSwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gbmV3IExpc3RSZXBsYWNlRXZlbnQobmV3U291cmNlLCBuZXdMaXN0TmFtZSwgdGhpcy5pbmRleCArIG9mZnNldCwgdGhpcy5uZXdJdGVtcywgdGhpcy5vbGRJdGVtcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9Qcm9wZXJ0eUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Yzc0NzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvUHJvcGVydHlDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEEgInByb3BlcnR5IGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiBwcm9wZXJ0eS4gQSA8Y29kZT5Qcm9wZXJ0eUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyfS4KLSAqIEEgPGNvZGU+UHJvcGVydHlDaGFuZ2VFdmVudDwvY29kZT4gaXMgYWNjb21wYW5pZWQgYnkgdGhlIG9sZCBhbmQgbmV3IHZhbHVlcwotICogb2YgdGhlIHByb3BlcnR5LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydHlDaGFuZ2VFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNoYW5nZWQuICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lOwotCi0JLyoqIFRoZSBwcm9wZXJ0eSdzIG9sZCB2YWx1ZSwgYmVmb3JlIHRoZSBjaGFuZ2UuICovCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0KLQkvKiogVGhlIHByb3BlcnR5J3MgbmV3IHZhbHVlLCBhZnRlciB0aGUgY2hhbmdlLiAqLwotCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lIFRoZSBwcm9ncmFtbWF0aWMgbmFtZSBvZiB0aGUgcHJvcGVydHkgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb2xkVmFsdWUgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJdGhpcy5vbGRWYWx1ZSA9IG9sZFZhbHVlOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMub2xkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXcgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0TmV3VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLm5ld1ZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMucHJvcGVydHlOYW1lKTsKLQkJc2IuYXBwZW5kKCI6ICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZCh0aGlzLm9sZFZhbHVlKTsKLQkJc2IuYXBwZW5kKCIgPT4gIik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKHRoaXMubmV3VmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQobmV3U291cmNlLCB0aGlzLnByb3BlcnR5TmFtZSwgdGhpcy5vbGRWYWx1ZSwgdGhpcy5uZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgcHJvcGVydHkgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3UHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VFdmVudChuZXdTb3VyY2UsIG5ld1Byb3BlcnR5TmFtZSwgdGhpcy5vbGRWYWx1ZSwgdGhpcy5uZXdWYWx1ZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9TdGF0ZUNoYW5nZUV2ZW50LmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9TdGF0ZUNoYW5nZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYWMzOTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvU3RhdGVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSBnZW5lcmljICJzdGF0ZSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyB0bwotICogc3VjaCBleHRlbnQgdGhhdCBpdCBjYW5ub3QgYmUgZGVsaW5lYXRlZCBhbGwgYXNwZWN0cyBvZiBpdCB0aGF0IGhhdmUgY2hhbmdlZC4KLSAqIEFueSBsaXN0ZW5lciBjYW4gc3luY2hyb25pemUgd2l0aCB0aGUgbW9kZWwgYXMgbmVjZXNzYXJ5IHNpbmNlIHRoZSBtb2RlbCBpcwotICogYXZhaWxhYmxlIGFzIHRoZSBldmVudCdzICdzb3VyY2UnLgotICogQSA8Y29kZT5TdGF0ZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuIGFyZ3VtZW50IHRvIHRoZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFN0YXRlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqLwotCXB1YmxpYyBTdGF0ZUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdGF0ZUNoYW5nZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlRXZlbnQobmV3U291cmNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVBZGRFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUFkZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NTAyNzEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUFkZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIGFkZCIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBhZGRzIGEgbm9kZSB0byBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgdHJlZS4gQSA8Y29kZT5UcmVlQ2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmVlQWRkRXZlbnQgZXh0ZW5kcyBUcmVlRXZlbnQgewotCi0JLyoqCi0gICAgICogUGF0aCB0byB0aGUgbm9kZSBhZGRlZCB0byB0aGUgdHJlZS4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gcGF0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgdHJlZSBhZGQgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgYWRkZWQuCi0JICovCi0JcHVibGljIFRyZWVBZGRFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgTGlzdDw/PiBwYXRoKSB7Ci0JCXRoaXMoc291cmNlLCB0cmVlTmFtZSwgcGF0aC50b0FycmF5KCkpOyAgLy8gTlBFIGlmICdwYXRoJyBpcyBudWxsCi0JfQotCi0JcHJpdmF0ZSBUcmVlQWRkRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIE9iamVjdFtdIHBhdGgpIHsKLQkJc3VwZXIoc291cmNlLCB0cmVlTmFtZSk7Ci0JCXRoaXMucGF0aCA9IHBhdGg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YW5kYXJkIHN0YXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGF0aCB0byB0aGUgcGFydCBvZiB0aGUgdHJlZSB0aGF0IHdhcyBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5wYXRoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgVHJlZUFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMudHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRyZWUgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZUFkZEV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1RyZWVOYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZUFkZEV2ZW50KG5ld1NvdXJjZSwgbmV3VHJlZU5hbWUsIHRoaXMucGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2hhbmdlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDaGFuZ2VFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWQ3ZTAzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVDaGFuZ2VFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSBjaGFuZ2UiIGV2ZW50IGdldHMgZGVsaXZlcmVkIHdoZW5ldmVyIGEgbW9kZWwgY2hhbmdlcyBhICJib3VuZCIKLSAqIG9yICJjb25zdHJhaW5lZCIgdHJlZSBpbiBhIG1hbm5lciB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieQotICogdGhlIG90aGVyIHRyZWUgZXZlbnRzLgotICogQSA8Y29kZT5UcmVlQ2hhbmdlRXZlbnQ8L2NvZGU+IGlzIHNlbnQgYXMgYW4KLSAqIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmVlQ2hhbmdlRXZlbnQgZXh0ZW5kcyBUcmVlRXZlbnQgewotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgbm9kZXMgaW4gdGhlIGNoYW5nZWQgdHJlZS4KLSAgICAgKi8KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0W10gbm9kZXM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBuZXcgdHJlZSBjaGFuZ2UgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICogQHBhcmFtIG5vZGVzIFRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0JICovCi0JcHVibGljIFRyZWVDaGFuZ2VFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSwgQ29sbGVjdGlvbjw/PiBub2RlcykgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIG5vZGVzLnRvQXJyYXkoKSk7ICAvLyBOUEUgaWYgJ25vZGVzJyBpcyBudWxsCi0JfQotCQotCXByaXZhdGUgVHJlZUNoYW5nZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBub2RlcykgewotCQlzdXBlcihzb3VyY2UsIHRyZWVOYW1lKTsKLQkJdGhpcy5ub2RlcyA9IG5vZGVzOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc3RhbmRhcmQgc3RhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IG5vZGVzIGluIHRoZSBjaGFuZ2VkIHRyZWUuCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPD8+IGdldE5vZGVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8T2JqZWN0Pih0aGlzLm5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgbm9kZXMgaW4gdGhlIGNoYW5nZWQgdHJlZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9kZXMubGVuZ3RoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmNsb25lKG5ld1NvdXJjZSwgdGhpcy50cmVlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgY29weSBvZiB0aGUgZXZlbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBhbmQgdHJlZSBuYW1lCi0JICogcmVwbGFjaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBhbmQgdHJlZSBuYW1lLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlRXZlbnQgY2xvbmUoTW9kZWwgbmV3U291cmNlLCBTdHJpbmcgbmV3VHJlZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBUcmVlQ2hhbmdlRXZlbnQobmV3U291cmNlLCBuZXdUcmVlTmFtZSwgdGhpcy5ub2Rlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2xlYXJFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZUNsZWFyRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NjU2OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlQ2xlYXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSBjbGVhciIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjbGVhcnMKLSAqIGEgImJvdW5kIiBvciAiY29uc3RyYWluZWQiIHRyZWUuIEEgPGNvZGU+VHJlZUNsZWFyRXZlbnQ8L2NvZGU+IGlzIHNlbnQKLSAqIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUcmVlQ2xlYXJFdmVudCBleHRlbmRzIFRyZWVFdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgY2xlYXIgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gY29sbGVjdGlvbk5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFRyZWVDbGVhckV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lKSB7Ci0JCXN1cGVyKHNvdXJjZSwgdHJlZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9uaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlLgotCSAqLwotCXB1YmxpYyBUcmVlQ2xlYXJFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuY2xvbmUobmV3U291cmNlLCB0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb3B5IG9mIHRoZSBldmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUKLQkgKiByZXBsYWNpbmcgdGhlIGN1cnJlbnQgc291cmNlIGFuZCBjb2xsZWN0aW9uIG5hbWUuCi0JICovCi0JcHVibGljIFRyZWVDbGVhckV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld0NvbGxlY3Rpb25OYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZUNsZWFyRXZlbnQobmV3U291cmNlLCBuZXdDb2xsZWN0aW9uTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9ldmVudC9UcmVlRXZlbnQuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTc3NzdhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogQSAidHJlZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogb3IgImNvbnN0cmFpbmVkIiB0cmVlLiBBIDxjb2RlPlRyZWVFdmVudDwvY29kZT4gaXMgc2VudCBhcyBhbgotICogYXJndW1lbnQgdG8gdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyfS4KLSAqIFRoZSBpbnRlbnQgaXMgdGhhdCBhbnkgbGlzdGVuZXIKLSAqIGNhbiBrZWVwIGl0c2VsZiBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgbW9kZWwncyB0cmVlIHZpYSB0aGUgdHJlZSBldmVudHMKLSAqIGl0IHJlY2VpdmVzIGFuZCBuZWVkIG5vdCBtYWludGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdHJlZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyZWVFdmVudCBleHRlbmRzIENoYW5nZUV2ZW50IHsKLQotCS8qKiBOYW1lIG9mIHRoZSB0cmVlIHRoYXQgY2hhbmdlZC4gKi8KLQlmaW5hbCBTdHJpbmcgdHJlZU5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbmV3IHRyZWUgZXZlbnQuCi0JICoKLQkgKiBAcGFyYW0gc291cmNlIFRoZSBvYmplY3Qgb24gd2hpY2ggdGhlIGV2ZW50IGluaXRpYWxseSBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gdHJlZU5hbWUgVGhlIHByb2dyYW1tYXRpYyBuYW1lIG9mIHRoZSB0cmVlIHRoYXQgd2FzIGNoYW5nZWQuCi0JICovCi0JcHVibGljIFRyZWVFdmVudChNb2RlbCBzb3VyY2UsIFN0cmluZyB0cmVlTmFtZSkgewotCQlzdXBlcihzb3VyY2UpOwotCQlpZiAodHJlZU5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy50cmVlTmFtZSA9IHRyZWVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRyZWVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy50cmVlTmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnRyZWVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2V2ZW50L1RyZWVSZW1vdmVFdmVudC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZVJlbW92ZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTMxNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvZXZlbnQvVHJlZVJlbW92ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBBICJ0cmVlIHJlbW92ZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCByZW1vdmVzIGEgbm9kZSByb20gYQotICogImJvdW5kIiBvciAiY29uc3RyYWluZWQiIHRyZWUuIEEgPGNvZGU+VHJlZUNoYW5nZUV2ZW50PC9jb2RlPiBpcyBzZW50IGFzIGFuCi0gKiBhcmd1bWVudCB0byB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5UcmVlQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJlZVJlbW92ZUV2ZW50IGV4dGVuZHMgVHJlZUV2ZW50IHsKLQotCS8qKgotICAgICAqIFBhdGggdG8gdGhlIG5vZGUgcmVtb3ZlZCBmcm9tIHRoZSB0cmVlLgotICAgICAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBwYXRoOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIG5ldyB0cmVlIHJlbW92ZSBldmVudC4KLQkgKgotCSAqIEBwYXJhbSBzb3VyY2UgVGhlIG9iamVjdCBvbiB3aGljaCB0aGUgZXZlbnQgaW5pdGlhbGx5IG9jY3VycmVkLgotCSAqIEBwYXJhbSB0cmVlTmFtZSBUaGUgcHJvZ3JhbW1hdGljIG5hbWUgb2YgdGhlIHRyZWUgdGhhdCB3YXMgY2hhbmdlZC4KLQkgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byB0aGUgcGFydCBvZiB0aGUgdHJlZSB0aGF0IHdhcyByZW1vdmVkLgotCSAqLwotCXB1YmxpYyBUcmVlUmVtb3ZlRXZlbnQoTW9kZWwgc291cmNlLCBTdHJpbmcgdHJlZU5hbWUsIExpc3Q8Pz4gcGF0aCkgewotCQl0aGlzKHNvdXJjZSwgdHJlZU5hbWUsIHBhdGgudG9BcnJheSgpKTsgIC8vIE5QRSBpZiAncGF0aCcgaXMgbnVsbAotCX0KLQotCXByaXZhdGUgVHJlZVJlbW92ZUV2ZW50KE1vZGVsIHNvdXJjZSwgU3RyaW5nIHRyZWVOYW1lLCBPYmplY3RbXSBwYXRoKSB7Ci0JCXN1cGVyKHNvdXJjZSwgdHJlZU5hbWUpOwotCQl0aGlzLnBhdGggPSBwYXRoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBzdGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggdG8gdGhlIHBhcnQgb2YgdGhlIHRyZWUgdGhhdCB3YXMgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8Pz4gZ2V0UGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPE9iamVjdD4odGhpcy5wYXRoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xvbmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgVHJlZVJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSkgewotCQlyZXR1cm4gdGhpcy5jbG9uZShuZXdTb3VyY2UsIHRoaXMudHJlZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGNvcHkgb2YgdGhlIGV2ZW50IHdpdGggdGhlIHNwZWNpZmllZCBzb3VyY2UgYW5kIHRyZWUgbmFtZQotCSAqIHJlcGxhY2luZyB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHRyZWUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgVHJlZVJlbW92ZUV2ZW50IGNsb25lKE1vZGVsIG5ld1NvdXJjZSwgU3RyaW5nIG5ld1RyZWVOYW1lKSB7Ci0JCXJldHVybiBuZXcgVHJlZVJlbW92ZUV2ZW50KG5ld1NvdXJjZSwgbmV3VHJlZU5hbWUsIHRoaXMucGF0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9DaGFuZ2VBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9DaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZGNiZDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENoYW5nZUxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvLyAqKioqKiBzdGF0ZQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBwcm9wZXJ0eQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvLyAqKioqKiBjb2xsZWN0aW9uCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqIGxpc3QKLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqIHRyZWUKLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YzYyMDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi0vKioKLSAqIEdlbmVyYWwgcHVycG9zZSBjaGFuZ2UgbGlzdGVuZXIuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBTdGF0ZUNoYW5nZUxpc3RlbmVyLCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIsIExpc3RDaGFuZ2VMaXN0ZW5lciwgVHJlZUNoYW5nZUxpc3RlbmVyCi17Ci0JLy8gY29tYmluZSB0aGUgb3RoZXIgbGlzdGVuZXIgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL0NvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5Y2E4ODEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCi0JLyoqCi0JICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThmZjY2NC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQSAiY29sbGVjdGlvbiBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogY29sbGVjdGlvbi4gWW91IGNhbiByZWdpc3RlciBhIDxjb2RlPkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIGNvbGxlY3Rpb24gdXBkYXRlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGFyZSBhZGRlZCB0byBhIGJvdW5kIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgaXRlbXMgdGhhdCB3ZXJlIGFkZGVkLgotCSAqLwotCXZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBpdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIGEgYm91bmQgY29sbGVjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBjb2xsZWN0aW9uIHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBpdGVtcyB0aGF0IHdlcmUgcmVtb3ZlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIGNvbGxlY3Rpb24gaXMgY2xlYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlIAotCSAqIGFuZCB0aGUgY29sbGVjdGlvbiB0aGF0IGNoYW5nZWQuCi0JICovCi0Jdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgY29sbGVjdGlvbiBpcyBjaGFuZ2VkIGluIGEgbWFubmVyCi0JICogdGhhdCBpcyBub3QgZWFzaWx5IGNoYXJhY3Rlcml6ZWQgYnkgdGhlIG90aGVyIG1ldGhvZHMgaW4gdGhpcyBpbnRlcmZhY2UuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGNvbGxlY3Rpb24gdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvQ29tbWFuZENoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db21tYW5kQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzZmQ0YS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Db21tYW5kQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENoYW5nZUxpc3RlbmVyfS4KLSAqIEFsbCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhcmUgZnVubmVsZWQgdGhyb3VnaCBhIHNpbmdsZSBjb21tYW5kLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZENoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBTaW1wbGVDaGFuZ2VMaXN0ZW5lcgotewotCXByb3RlY3RlZCBmaW5hbCBDb21tYW5kIGNvbW1hbmQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCBleGVjdXRlcyB0aGUgc3BlY2lmaWVkIGNvbW1hbmQgd2hlbmV2ZXIKLQkgKiBpdCByZWNlaXZlcyBhbnkgY2hhbmdlIG5vdGlmaWNhdGlvbiBmcm9tIHRoZSBtb2RlbCB0byB3aGljaCBpdCBpcyBhZGRlZAotCSAqIGFzIGEgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIENvbW1hbmRDaGFuZ2VMaXN0ZW5lcihDb21tYW5kIGNvbW1hbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoKSB7Ci0JCXRoaXMuY29tbWFuZC5leGVjdXRlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiODViNC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3RDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXN0Q2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBMaXN0Q2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTGlzdENoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4MGM1NS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9MaXN0Q2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci0KLS8qKgotICogQSAibGlzdCBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogbGlzdC4gWW91IGNhbiByZWdpc3RlciBhIDxjb2RlPkxpc3RDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIGxpc3QgdXBkYXRlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGlzdENoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGl0ZW1zIGFyZSBhZGRlZCB0byBhIGJvdW5kIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUgYWRkZWQsIGFuZCB0aGUgaW5kZXgKLQkgKiBhdCB3aGljaCB0aGUgaXRlbXMgd2VyZSBhZGRlZC4KLQkgKi8KLQl2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBhIGJvdW5kIGxpc3QuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgbGlzdCB0aGF0IGNoYW5nZWQsIHRoZSBpdGVtcyB0aGF0IHdlcmUgcmVtb3ZlZCwgYW5kIHRoZSBpbmRleAotCSAqIGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgaW4gYSBib3VuZCBsaXN0IGFyZSByZXBsYWNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZSBhZGRlZCwgdGhlIGl0ZW1zIHRoYXQgd2VyZQotCSAqIHJlcGxhY2VkLCBhbmQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSBpdGVtcyB3ZXJlIHJlcGxhY2VkLgotCSAqLwotCXZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gaXRlbXMgaW4gYSBib3VuZCBsaXN0IGFyZSBtb3ZlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSBsaXN0IHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBpbmRpY2VzIG9mIHdoZXJlIGl0ZW1zIHdlcmUgbW92ZWQKLQkgKiBmcm9tIGFuZCB0by4KLQkgKi8KLQl2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgYm91bmQgbGlzdCBpcyBjbGVhcmVkLgotCSAqIAotCSAqIEBwYXJhbSBldmVudCBBIExpc3RDbGVhckV2ZW50IG9iamVjdCBkZXNjcmliaW5nIHRoZSBldmVudCBzb3VyY2UgCi0JICogYW5kIHRoZSBsaXN0IHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGV2ZW50KTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBib3VuZCBsaXN0IGlzIGNoYW5nZWQgaW4gYSBtYW5uZXIKLQkgKiB0aGF0IGlzIG5vdCBlYXNpbHkgY2hhcmFjdGVyaXplZCBieSB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQSBMaXN0Q2hhbmdlRXZlbnQgb2JqZWN0IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSAKLQkgKiBhbmQgdGhlIGxpc3QgdGhhdCBjaGFuZ2VkLgotCSAqLwotCXZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL011bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzYyYmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IHtAbGluayBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXJ9IHdoZW4gdGhlIHJlcXVlc3RlZCBsaXN0ZW5lcgotICogbmVlZHMgdG8gaW1wbGVtZW50IG11bHRpcGxlIG1ldGhvZHMgKGkuZS4ge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcn0sCi0gKiB7QGxpbmsgTGlzdENoYW5nZUxpc3RlbmVyfSwgb3Ige0BsaW5rIFRyZWVDaGFuZ2VMaXN0ZW5lcn0pLgotICovCi1jbGFzcyBNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcgotCWV4dGVuZHMgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyIAotCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyLCBMaXN0Q2hhbmdlTGlzdGVuZXIsIFRyZWVDaGFuZ2VMaXN0ZW5lcgotewotCS8qKiB0aGUgbWV0aG9kcyB3ZSB3aWxsIGludm9rZSBvbiB0aGUgdGFyZ2V0IG9iamVjdCAqLwotCXByaXZhdGUgZmluYWwgTWV0aG9kIGFkZE1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCByZW1vdmVNZXRob2Q7Ci0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgcmVwbGFjZU1ldGhvZDsJLy8gdGhpcyBjYW4gYmUgbnVsbAotCXByaXZhdGUgZmluYWwgTWV0aG9kIG1vdmVNZXRob2Q7CS8vIHRoaXMgY2FuIGJlIG51bGwKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBjbGVhck1ldGhvZDsKLQlwcml2YXRlIGZpbmFsIE1ldGhvZCBjaGFuZ2VNZXRob2Q7Ci0KLQotCS8qKgotCSAqIFRoZSAicmVwbGFjZSIgYW5kICJtb3ZlIiBtZXRob2RzIGFyZSBvcHRpb25hbC4KLQkgKi8KLQlNdWx0aU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgcmVwbGFjZU1ldGhvZCwgTWV0aG9kIG1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQlzdXBlcih0YXJnZXQpOwotCQl0aGlzLmFkZE1ldGhvZCA9IGFkZE1ldGhvZDsKLQkJdGhpcy5yZW1vdmVNZXRob2QgPSByZW1vdmVNZXRob2Q7Ci0JCXRoaXMucmVwbGFjZU1ldGhvZCA9IHJlcGxhY2VNZXRob2Q7Ci0JCXRoaXMubW92ZU1ldGhvZCA9IG1vdmVNZXRob2Q7Ci0JCXRoaXMuY2xlYXJNZXRob2QgPSBjbGVhck1ldGhvZDsKLQkJdGhpcy5jaGFuZ2VNZXRob2QgPSBjaGFuZ2VNZXRob2Q7Ci0JfQotCi0JLyoqCi0JICogTm8gInJlcGxhY2UiIG9yICJtb3ZlIiBtZXRob2RzLgotCSAqLwotCU11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBhZGRNZXRob2QsIE1ldGhvZCByZW1vdmVNZXRob2QsIE1ldGhvZCBjbGVhck1ldGhvZCwgTWV0aG9kIGNoYW5nZU1ldGhvZCkgewotCQl0aGlzKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIG51bGwsIG51bGwsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBDb2xsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IENvbGxlY3Rpb25FdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGludm9rZShNZXRob2QgbWV0aG9kLCBMaXN0RXZlbnQgZXZlbnQpIHsKLQkJaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBFTVBUWV9PQkpFQ1RfQVJSQVkpOwotCQl9IGVsc2UgewotCQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IExpc3RFdmVudFtdIHtldmVudH0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5hZGRNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVwbGFjZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLm1vdmVNZXRob2QsIGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNsZWFyTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuY2hhbmdlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRyZWVDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgaW52b2tlKE1ldGhvZCBtZXRob2QsIFRyZWVFdmVudCBldmVudCkgewotCQlpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKG1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChtZXRob2QsIHRoaXMudGFyZ2V0LCBuZXcgVHJlZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMuYWRkTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuaW52b2tlKHRoaXMucmVtb3ZlTWV0aG9kLCBldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5pbnZva2UodGhpcy5jbGVhck1ldGhvZCwgZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLmludm9rZSh0aGlzLmNoYW5nZU1ldGhvZCwgZXZlbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VBZGFwdGVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5MjM1My4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9LgotICogVGhpcyBpcyBwcm9iYWJseSBvZiBsaW1pdGVkIHVzZSwgc2luY2UgdGhlcmUgb25seSBhIHNpbmdsZSBtZXRob2QgdG8gaW1wbGVtZW50OwotICogbWF5YmUgYXMgYSBudWxsIGltcGxlbWVudGF0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VBZGFwdGVyIGltcGxlbWVudHMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjQ4OGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIEEgInByb3BlcnR5IGNoYW5nZSIgZXZlbnQgZ2V0cyBmaXJlZCB3aGVuZXZlciBhIG1vZGVsIGNoYW5nZXMgYSAiYm91bmQiCi0gKiBwcm9wZXJ0eS4gWW91IGNhbiByZWdpc3RlciBhIDxjb2RlPlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI8L2NvZGU+IHdpdGggYSBzb3VyY2UKLSAqIG1vZGVsIHNvIGFzIHRvIGJlIG5vdGlmaWVkIG9mIGFueSBib3VuZCBwcm9wZXJ0eSB1cGRhdGVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbW9kZWwgaGFzIGNoYW5nZWQgYSBib3VuZCBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlCi0JICogYW5kIHRoZSBwcm9wZXJ0eSdzIG9sZCBhbmQgbmV3IHZhbHVlcy4KLQkgKi8KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyNGNkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgZmFjdG9yeSBidWlsZHMgbGlzdGVuZXJzIHRoYXQgcmVmbGVjdGl2ZWx5IGZvcndhcmQgY2hhbmdlIGV2ZW50cy4KLSAqIElmIHlvdSBhcmUgd29ycmllZCBhYm91dCBoYXZpbmcgdG9vIG1hbnkgbGl0dGxlIGNsYXNzZXMgdGhhdCBoYXZlIHRvIGJlCi0gKiBsb2FkZWQgYW5kIG1haW50YWluZWQgYnkgdGhlIGNsYXNzIGxvYWRlciwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZXNlLgotICogT2YgY291cnNlLCB0aGlzIGNvbWVzIHdpdGggdGhlIGFkZGl0aW9uYWwgb3ZlcmhlYWQgb2YgcmVmbGVjdGlvbi4uLi4KLSAqIEFsc28gbm90ZSB0aGF0IHRoZSB2YWxpZGl0eSBvZiB0aGUgbWV0aG9kIG5hbWUgaXMgbm90IGNoZWNrZWQgYXQgY29tcGlsZQotICogdGltZSwgYnV0IGF0IHJ1bnRpbWU7IGFsdGhvdWdoIHdlIDxlbT5kbzwvZW0+IGNoZWNrIHRoZSBtZXRob2QgYXMgc29vbiBhcyB0aGUKLSAqIGxpc3RlbmVyIGlzIGluc3RhbnRpYXRlZC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKiogdGhlIHRhcmdldCBvYmplY3Qgb24gd2hpY2ggd2Ugd2lsbCBpbnZva2UgdGhlIG1ldGhvZCAqLwotCXByb3RlY3RlZCBmaW5hbCBPYmplY3QgdGFyZ2V0OwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFN0YXRlQ2hhbmdlRXZlbnQ+IFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTUyA9IFN0YXRlQ2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxTdGF0ZUNoYW5nZUV2ZW50PltdIFNUQVRFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtTVEFURV9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFByb3BlcnR5Q2hhbmdlRXZlbnQ+IFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTUyA9IFByb3BlcnR5Q2hhbmdlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxQcm9wZXJ0eUNoYW5nZUV2ZW50PltdIFBST1BFUlRZX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtQUk9QRVJUWV9DSEFOR0VfRVZFTlRfQ0xBU1N9OwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25FdmVudD4gQ09MTEVDVElPTl9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25FdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25FdmVudD5bXSBDT0xMRUNUSU9OX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0NPTExFQ1RJT05fRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQWRkRXZlbnQ+IENPTExFQ1RJT05fQUREX0VWRU5UX0NMQVNTID0gQ29sbGVjdGlvbkFkZEV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkFkZEV2ZW50PltdIENPTExFQ1RJT05fQUREX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0NPTExFQ1RJT05fQUREX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvblJlbW92ZUV2ZW50PiBDT0xMRUNUSU9OX1JFTU9WRV9FVkVOVF9DTEFTUyA9IENvbGxlY3Rpb25SZW1vdmVFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25SZW1vdmVFdmVudD5bXSBDT0xMRUNUSU9OX1JFTU9WRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtDT0xMRUNUSU9OX1JFTU9WRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPENvbGxlY3Rpb25DbGVhckV2ZW50PiBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTID0gQ29sbGVjdGlvbkNsZWFyRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2xlYXJFdmVudD5bXSBDT0xMRUNUSU9OX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0NPTExFQ1RJT05fQ0xFQVJfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxDb2xsZWN0aW9uQ2hhbmdlRXZlbnQ+IENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTID0gQ29sbGVjdGlvbkNoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8Q29sbGVjdGlvbkNoYW5nZUV2ZW50PltdIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0NPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0RXZlbnQ+IExJU1RfRVZFTlRfQ0xBU1MgPSBMaXN0RXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0RXZlbnQ+W10gTElTVF9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdEFkZEV2ZW50PiBMSVNUX0FERF9FVkVOVF9DTEFTUyA9IExpc3RBZGRFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RBZGRFdmVudD5bXSBMSVNUX0FERF9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtMSVNUX0FERF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RSZW1vdmVFdmVudD4gTElTVF9SRU1PVkVfRVZFTlRfQ0xBU1MgPSBMaXN0UmVtb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0UmVtb3ZlRXZlbnQ+W10gTElTVF9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9SRU1PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0UmVwbGFjZUV2ZW50PiBMSVNUX1JFUExBQ0VfRVZFTlRfQ0xBU1MgPSBMaXN0UmVwbGFjZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdFJlcGxhY2VFdmVudD5bXSBMSVNUX1JFUExBQ0VfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7TElTVF9SRVBMQUNFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdE1vdmVFdmVudD4gTElTVF9NT1ZFX0VWRU5UX0NMQVNTID0gTGlzdE1vdmVFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RNb3ZlRXZlbnQ+W10gTElTVF9NT1ZFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfTU9WRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPExpc3RDbGVhckV2ZW50PiBMSVNUX0NMRUFSX0VWRU5UX0NMQVNTID0gTGlzdENsZWFyRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2xlYXJFdmVudD5bXSBMSVNUX0NMRUFSX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfQ0xFQVJfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxMaXN0Q2hhbmdlRXZlbnQ+IExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTID0gTGlzdENoYW5nZUV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8TGlzdENoYW5nZUV2ZW50PltdIExJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZID0gbmV3IENsYXNzW10ge0xJU1RfQ0hBTkdFX0VWRU5UX0NMQVNTfTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlRXZlbnQ+IFRSRUVfRVZFTlRfQ0xBU1MgPSBUcmVlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlRXZlbnQ+W10gVFJFRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtUUkVFX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUFkZEV2ZW50PiBUUkVFX0FERF9FVkVOVF9DTEFTUyA9IFRyZWVBZGRFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVBZGRFdmVudD5bXSBUUkVFX0FERF9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtUUkVFX0FERF9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVSZW1vdmVFdmVudD4gVFJFRV9SRU1PVkVfRVZFTlRfQ0xBU1MgPSBUcmVlUmVtb3ZlRXZlbnQuY2xhc3M7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlUmVtb3ZlRXZlbnQ+W10gVFJFRV9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkgPSBuZXcgQ2xhc3NbXSB7VFJFRV9SRU1PVkVfRVZFTlRfQ0xBU1N9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDbGFzczxUcmVlQ2xlYXJFdmVudD4gVFJFRV9DTEVBUl9FVkVOVF9DTEFTUyA9IFRyZWVDbGVhckV2ZW50LmNsYXNzOwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNsZWFyRXZlbnQ+W10gVFJFRV9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtUUkVFX0NMRUFSX0VWRU5UX0NMQVNTfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2xhc3M8VHJlZUNoYW5nZUV2ZW50PiBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyA9IFRyZWVDaGFuZ2VFdmVudC5jbGFzczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPFRyZWVDaGFuZ2VFdmVudD5bXSBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU19BUlJBWSA9IG5ldyBDbGFzc1tdIHtUUkVFX0NIQU5HRV9FVkVOVF9DTEFTU307Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX09CSkVDVF9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0KLQotCS8vICoqKioqKioqKiogaGVscGVyIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogRmluZCBhbmQgcmV0dXJuIGEgbWV0aG9kIGltcGxlbWVudGVkIGJ5IHRoZSB0YXJnZXQgdGhhdCBjYW4gYmUgaW52b2tlZAotCSAqIHJlZmxlY3RpdmVseSB3aGVuIGEgY2hhbmdlIGV2ZW50IG9jY3Vycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBNZXRob2QgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/IGV4dGVuZHMgQ2hhbmdlRXZlbnQ+W10gZXZlbnRDbGFzc0FycmF5KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGV2ZW50Q2xhc3NBcnJheSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgxKSB7Ci0JCQlyZXR1cm4gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGUgc3BlY2lmaWVkIG1ldGhvZCBpcyBzdWl0YWJsZSBmb3IgYmVpbmcgaW52b2tlZCB3aGVuIGEKLQkgKiBjaGFuZ2UgZXZlbnQgaGFzIG9jY3VycmVkLiBUaHJvdyBhbiBleGNlcHRpb24gaWYgaXQgaXMgbm90IHN1aXRhYmxlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChNZXRob2QgbWV0aG9kLCBDbGFzczw/IGV4dGVuZHMgQ2hhbmdlRXZlbnQ+IGV2ZW50Q2xhc3MpIHsKLQkJQ2xhc3M8Pz5bXSBwYXJtVHlwZXMgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJaW50IHBhcm1UeXBlc0xlbmd0aCA9IHBhcm1UeXBlcy5sZW5ndGg7Ci0JCWlmIChwYXJtVHlwZXNMZW5ndGggPT0gMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgocGFybVR5cGVzTGVuZ3RoID09IDEpICYmIHBhcm1UeXBlc1swXS5pc0Fzc2lnbmFibGVGcm9tKGV2ZW50Q2xhc3MpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXRob2QudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogU3RhdGVDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBzdGF0ZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKG1ldGhvZCwgU1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBTaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHN0YXRlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOyBvdGhlcndpc2UsCi0JICogYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgU1RBVEVfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBwcm9wZXJ0eSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIG1ldGhvZCkgewotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKG1ldGhvZCwgUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTKTsKLQkJcmV0dXJuIG5ldyBTaW5nbGVNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIHByb3BlcnR5IGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOyBvdGhlcndpc2UsCi0JICogYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgbWV0aG9kTmFtZSwgUFJPUEVSVFlfQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIGNsZWFyTWV0aG9kLCBNZXRob2QgY2hhbmdlTWV0aG9kKSB7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoYWRkTWV0aG9kLCBDT0xMRUNUSU9OX0FERF9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QocmVtb3ZlTWV0aG9kLCBDT0xMRUNUSU9OX1JFTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIENPTExFQ1RJT05fQ0xFQVJfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNoYW5nZU1ldGhvZCwgQ09MTEVDVElPTl9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgY29sbGVjdGlvbiBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgY2hhbmdlIGV2ZW50cy4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgYWRkTWV0aG9kTmFtZSwgU3RyaW5nIHJlbW92ZU1ldGhvZE5hbWUsIFN0cmluZyBjbGVhck1ldGhvZE5hbWUsIFN0cmluZyBjaGFuZ2VNZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigKLQkJCQl0YXJnZXQsCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgYWRkTWV0aG9kTmFtZSwgQ09MTEVDVElPTl9BRERfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlbW92ZU1ldGhvZE5hbWUsIENPTExFQ1RJT05fUkVNT1ZFX0VWRU5UX0NMQVNTX0FSUkFZKSwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBjbGVhck1ldGhvZE5hbWUsIENPTExFQ1RJT05fQ0xFQVJfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNoYW5nZU1ldGhvZE5hbWUsIENPTExFQ1RJT05fQ0hBTkdFX0VWRU5UX0NMQVNTX0FSUkFZKQotCQkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGNvbGxlY3Rpb24gY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4gSWYgYSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYW5kIGFwcHJvcHJpYXRlIGFyZ3VtZW50IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGludm9rZWQ7Ci0JICogb3RoZXJ3aXNlLCBhIHplcm8tYXJndW1lbnQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHdpbGwgYmUgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlyZXR1cm4gYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBtZXRob2ROYW1lLCBDT0xMRUNUSU9OX0VWRU5UX0NMQVNTX0FSUkFZKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgbWV0aG9kczogTGlzdENoYW5nZUxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgTWV0aG9kIGFkZE1ldGhvZCwgTWV0aG9kIHJlbW92ZU1ldGhvZCwgTWV0aG9kIHJlcGxhY2VNZXRob2QsIE1ldGhvZCBtb3ZlTWV0aG9kLCBNZXRob2QgY2xlYXJNZXRob2QsIE1ldGhvZCBjaGFuZ2VNZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChhZGRNZXRob2QsIExJU1RfQUREX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChyZW1vdmVNZXRob2QsIExJU1RfUkVNT1ZFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChyZXBsYWNlTWV0aG9kLCBMSVNUX1JFUExBQ0VfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKG1vdmVNZXRob2QsIExJU1RfTU9WRV9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2xlYXJNZXRob2QsIExJU1RfQ0xFQVJfRVZFTlRfQ0xBU1MpOwotCQljaGVja0NoYW5nZUxpc3RlbmVyTWV0aG9kKGNoYW5nZU1ldGhvZCwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1MpOwotCQlyZXR1cm4gbmV3IE11bHRpTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgYWRkTWV0aG9kLCByZW1vdmVNZXRob2QsIHJlcGxhY2VNZXRob2QsIG1vdmVNZXRob2QsIGNsZWFyTWV0aG9kLCBjaGFuZ2VNZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2QKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldCBmb3IgYW55IGNoYW5nZSBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kLCBtZXRob2QpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIGxpc3QgY2hhbmdlIGxpc3RlbmVyIHRoYXQgd2lsbCBpbnZva2UgdGhlIHNwZWNpZmllZCBtZXRob2RzCi0JICogb24gdGhlIHNwZWNpZmllZCB0YXJnZXQgZm9yIGNoYW5nZSBldmVudHMuIElmIGEgc2luZ2xlLWFyZ3VtZW50IG1ldGhvZAotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBhcHByb3ByaWF0ZSBhcmd1bWVudCBpcyBmb3VuZCwgaXQgd2lsbCBiZSBpbnZva2VkOwotCSAqIG90aGVyd2lzZSwgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB3aWxsIGJlIGludm9rZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCwgU3RyaW5nIGFkZE1ldGhvZE5hbWUsIFN0cmluZyByZW1vdmVNZXRob2ROYW1lLCBTdHJpbmcgcmVwbGFjZU1ldGhvZE5hbWUsIFN0cmluZyBtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIGNsZWFyTWV0aG9kTmFtZSwgU3RyaW5nIGNoYW5nZU1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKAotCQkJCXRhcmdldCwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBhZGRNZXRob2ROYW1lLCBMSVNUX0FERF9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgcmVtb3ZlTWV0aG9kTmFtZSwgTElTVF9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIHJlcGxhY2VNZXRob2ROYW1lLCBMSVNUX1JFUExBQ0VfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1vdmVNZXRob2ROYW1lLCBMSVNUX01PVkVfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNsZWFyTWV0aG9kTmFtZSwgTElTVF9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2hhbmdlTWV0aG9kTmFtZSwgTElTVF9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdCBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIExJU1RfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSBtZXRob2RzOiBUcmVlQ2hhbmdlTGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKLQkgKiBvbiB0aGUgc3BlY2lmaWVkIHRhcmdldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgYWRkTWV0aG9kLCBNZXRob2QgcmVtb3ZlTWV0aG9kLCBNZXRob2QgY2xlYXJNZXRob2QsIE1ldGhvZCBjaGFuZ2VNZXRob2QpIHsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChhZGRNZXRob2QsIFRSRUVfQUREX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChyZW1vdmVNZXRob2QsIFRSRUVfUkVNT1ZFX0VWRU5UX0NMQVNTKTsKLQkJY2hlY2tDaGFuZ2VMaXN0ZW5lck1ldGhvZChjbGVhck1ldGhvZCwgVFJFRV9DTEVBUl9FVkVOVF9DTEFTUyk7Ci0JCWNoZWNrQ2hhbmdlTGlzdGVuZXJNZXRob2QoY2hhbmdlTWV0aG9kLCBUUkVFX0NIQU5HRV9FVkVOVF9DTEFTUyk7Ci0JCXJldHVybiBuZXcgTXVsdGlNZXRob2RSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBhZGRNZXRob2QsIHJlbW92ZU1ldGhvZCwgY2xlYXJNZXRob2QsIGNoYW5nZU1ldGhvZCk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIE1ldGhvZCBtZXRob2QpIHsKLQkJcmV0dXJuIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kLCBtZXRob2QsIG1ldGhvZCwgbWV0aG9kKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSB0cmVlIGNoYW5nZSBsaXN0ZW5lciB0aGF0IHdpbGwgaW52b2tlIHRoZSBzcGVjaWZpZWQgbWV0aG9kcwotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBjaGFuZ2UgZXZlbnRzLiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBhZGRNZXRob2ROYW1lLCBTdHJpbmcgcmVtb3ZlTWV0aG9kTmFtZSwgU3RyaW5nIGNsZWFyTWV0aG9kTmFtZSwgU3RyaW5nIGNoYW5nZU1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKAotCQkJCXRhcmdldCwKLQkJCQlmaW5kQ2hhbmdlTGlzdGVuZXJNZXRob2QodGFyZ2V0LCBhZGRNZXRob2ROYW1lLCBUUkVFX0FERF9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgcmVtb3ZlTWV0aG9kTmFtZSwgVFJFRV9SRU1PVkVfRVZFTlRfQ0xBU1NfQVJSQVkpLAotCQkJCWZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIGNsZWFyTWV0aG9kTmFtZSwgVFJFRV9DTEVBUl9FVkVOVF9DTEFTU19BUlJBWSksCi0JCQkJZmluZENoYW5nZUxpc3RlbmVyTWV0aG9kKHRhcmdldCwgY2hhbmdlTWV0aG9kTmFtZSwgVFJFRV9DSEFOR0VfRVZFTlRfQ0xBU1NfQVJSQVkpCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgdHJlZSBjaGFuZ2UgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGZvciBhbnkgY2hhbmdlIGV2ZW50LiBJZiBhIHNpbmdsZS1hcmd1bWVudCBtZXRob2QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgYXBwcm9wcmlhdGUgYXJndW1lbnQgaXMgZm91bmQsIGl0IHdpbGwgYmUgaW52b2tlZDsKLQkgKiBvdGhlcndpc2UsIGEgemVyby1hcmd1bWVudCBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgd2lsbCBiZSBpbnZva2VkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUNoYW5nZUxpc3RlbmVyIGJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKE9iamVjdCB0YXJnZXQsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBidWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIGZpbmRDaGFuZ2VMaXN0ZW5lck1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIFRSRUVfRVZFTlRfQ0xBU1NfQVJSQVkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29uc3RydWN0IGEgbGlzdGVuZXIgdGhhdCB3aWxsIGludm9rZSB0aGUgc3BlY2lmaWVkIG1ldGhvZAotCSAqIG9uIHRoZSBzcGVjaWZpZWQgdGFyZ2V0LgotCSAqLwotCXByb3RlY3RlZCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlzdXBlcigpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbXBsZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9TaW1wbGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzgyYjc3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbXBsZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENoYW5nZUxpc3RlbmVyfS4KLSAqIEFsbCBjaGFuZ2Ugbm90aWZpY2F0aW9ucyBhcmUgZnVubmVsZWQgdGhyb3VnaCBhIHNpbmdsZSBtZXRob2QuCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGJ5Ci0gKiBzdWJjbGFzc2luZyBpdCBhbmQgb3ZlcnJpZGluZyBlaXRoZXIge0BsaW5rICNtb2RlbENoYW5nZWQoQ2hhbmdlRXZlbnQpfQotICogKGlmIGFjY2VzcyB0byB0aGUgZXZlbnQgaXMgcmVxdWlyZWQpIG9yIHtAbGluayAjbW9kZWxDaGFuZ2VkKCl9IChpZiBhY2Nlc3MKLSAqIHRvIHRoZSBldmVudCBpcyBub3QgcmVxdWlyZWQpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2ltcGxlQ2hhbmdlTGlzdGVuZXIKLQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi17Ci0JcHVibGljIFNpbXBsZUNoYW5nZUxpc3RlbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBldmVudCkgewotCQl0aGlzLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5tb2RlbENoYW5nZWQoZXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgaGFzIG5vdGlmaWVkIHRoZSBsaXN0ZW5lciBvZiB0aGUgY2hhbmdlIGRlc2NyaWJlZCBieSB0aGUKLQkgKiBzcGVjaWZpZWQgY2hhbmdlIGV2ZW50LiBCeSBkZWZhdWx0IHRoZSBsaXN0ZW5lciBleGVjdXRlcyB7QGxpbmsgI21vZGVsQ2hhbmdlZCgpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMubW9kZWxDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1vZGVsIGhhcyBub3RpZmllZCB0aGUgbGlzdGVuZXIgb2YgYSBjaGFuZ2UuCi0JICogQnkgZGVmYXVsdCB0aGUgbGlzdGVuZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBtb2RlbENoYW5nZWQoKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGlzIG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1NpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NmU3NWYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB7QGxpbmsgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyfSB3aGVuIHRoZSByZXF1ZXN0ZWQgbGlzdGVuZXIKLSAqIG5lZWQgb25seSBpbXBsZW1lbnQgYSBzaW5nbGUgbWV0aG9kIChpLmUuIHtAbGluayBTdGF0ZUNoYW5nZUxpc3RlbmVyfSBvcgotICoge0BsaW5rIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJ9KS4KLSAqLwotY2xhc3MgU2luZ2xlTWV0aG9kUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyCi0JZXh0ZW5kcyBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIKLQlpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIKLXsKLQotCS8qKiB0aGUgbWV0aG9kIHdlIHdpbGwgaW52b2tlIG9uIHRoZSB0YXJnZXQgb2JqZWN0ICovCi0JcHJpdmF0ZSBmaW5hbCBNZXRob2QgbWV0aG9kOwotCS8qKiBjYWNoZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXRob2RJc1plcm9Bcmd1bWVudDsKLQotCVNpbmdsZU1ldGhvZFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcihPYmplY3QgdGFyZ2V0LCBNZXRob2QgbWV0aG9kKSB7Ci0JCXN1cGVyKHRhcmdldCk7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCQl0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50ID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YXRlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKHRoaXMubWV0aG9kSXNaZXJvQXJndW1lbnQpIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHRoaXMubWV0aG9kLCB0aGlzLnRhcmdldCwgRU1QVFlfT0JKRUNUX0FSUkFZKTsKLQkJfSBlbHNlIHsKLQkJCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHRoaXMubWV0aG9kLCB0aGlzLnRhcmdldCwgbmV3IFN0YXRlQ2hhbmdlRXZlbnRbXSB7ZXZlbnR9KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLm1ldGhvZElzWmVyb0FyZ3VtZW50KSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIEVNUFRZX09CSkVDVF9BUlJBWSk7Ci0JCX0gZWxzZSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh0aGlzLm1ldGhvZCwgdGhpcy50YXJnZXQsIG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50W10ge2V2ZW50fSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzVmMTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotCi0vKioKLSAqIENvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBTdGF0ZUNoYW5nZUxpc3RlbmVyfS4KLSAqIFRoaXMgaXMgcHJvYmFibHkgb2YgbGltaXRlZCB1c2UsIHNpbmNlIHRoZXJlIG9ubHkgYSBzaW5nbGUgbWV0aG9kIHRvIGltcGxlbWVudDsKLSAqIG1heWJlIGFzIGEgbnVsbCBpbXBsZW1lbnRhdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIFN0YXRlQ2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvU3RhdGVDaGFuZ2VMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWM1OTllLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL2xpc3RlbmVyL1N0YXRlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBIGdlbmVyaWMgInN0YXRlIGNoYW5nZSIgZXZlbnQgZ2V0cyBkZWxpdmVyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIHRvIAotICogc3VjaCBleHRlbnQgdGhhdCBpdCBjYW5ub3QgYmUgZGVsaW5lYXRlZCBhbGwgYXNwZWN0cyBvZiBpdCB0aGF0IGhhdmUgY2hhbmdlZC4gCi0gKiBZb3UgY2FuIHJlZ2lzdGVyIGEgPGNvZGU+U3RhdGVDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHNvdXJjZSBtb2RlbCBzbyBhcyB0byBiZSBub3RpZmllZCAKLSAqIG9mIGFueSBzdWNoIGNoYW5nZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdldHMgY2FsbGVkIHdoZW4gYSBtb2RlbCBoYXMgY2hhbmdlZCBpbiBzb21lIGdlbmVyYWwgZmFzaGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLgotCSAqLwotCXZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlQWRhcHRlci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3Y2NlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFRyZWVDaGFuZ2VMaXN0ZW5lcn0uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmVlQ2hhbmdlQWRhcHRlciBpbXBsZW1lbnRzIFRyZWVDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBUcmVlQ2hhbmdlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRyZWVDbGVhcmVkKFRyZWVDbGVhckV2ZW50IGV2ZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvbGlzdGVuZXIvVHJlZUNoYW5nZUxpc3RlbmVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4Yzg5OC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC9saXN0ZW5lci9UcmVlQ2hhbmdlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci0KLS8qKgotICogQSAidHJlZSBjaGFuZ2UiIGV2ZW50IGdldHMgZmlyZWQgd2hlbmV2ZXIgYSBtb2RlbCBjaGFuZ2VzIGEgImJvdW5kIgotICogdHJlZS4gWW91IGNhbiByZWdpc3RlciBhIDxjb2RlPlRyZWVDaGFuZ2VMaXN0ZW5lcjwvY29kZT4gd2l0aCBhIHNvdXJjZQotICogbW9kZWwgc28gYXMgdG8gYmUgbm90aWZpZWQgb2YgYW55IGJvdW5kIHRyZWUgdXBkYXRlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJlZUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgbm9kZSBpcyBhZGRlZCB0byBhIGJvdW5kIHRyZWUuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgcGF0aCB0byB0aGUgbm9kZSB0aGF0IHdhcyBhZGRlZC4KLQkgKi8KLQl2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIGEgYm91bmQgdHJlZS4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSB0cmVlIHRoYXQgY2hhbmdlZCwgYW5kIHRoZSBwYXRoIHRvIHRoZSBub2RlIHRoYXQgd2FzIHJlbW92ZWQuCi0JICovCi0Jdm9pZCBub2RlUmVtb3ZlZChUcmVlUmVtb3ZlRXZlbnQgZXZlbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBjYWxsZWQgd2hlbiBhIGJvdW5kIHRyZWUgaXMgY2xlYXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQgQW4gZXZlbnQgZGVzY3JpYmluZyB0aGUgZXZlbnQgc291cmNlLAotCSAqIHRoZSB0cmVlIHRoYXQgY2hhbmdlZCwgYW5kIGFuIGVtcHR5IHBhdGguCi0JICovCi0Jdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBnZXRzIGNhbGxlZCB3aGVuIGEgcG9ydGlvbiBvZiBhIGJvdW5kIHRyZWUgaXMgY2hhbmdlZCBpbgotCSAqIGEgbWFubmVyIHRoYXQgaXMgbm90IGVhc2lseSBjaGFyYWN0ZXJpemVkIGJ5IHRoZSBvdGhlciBtZXRob2RzIGluIHRoaXMKLQkgKiBpbnRlcmZhY2UuCi0JICogCi0JICogQHBhcmFtIGV2ZW50IEFuIGV2ZW50IGRlc2NyaWJpbmcgdGhlIGV2ZW50IHNvdXJjZSwKLQkgKiB0aGUgdHJlZSB0aGF0IGNoYW5nZWQsIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUKLQkgKiB0cmVlIHRoYXQgY2hhbmdlZC4KLQkgKi8KLQl2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FkZjUwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gYWJzdHJhY3QgY29sbGVjdGlvbiBhY2Nlc3NpbmcgYW5kCi0gKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIGFuZCBtYWtlIGl0IG1vcmUgcGx1Z2dhYmxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiB2YWx1ZXMgaGVsZCBieSB0aGUgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwsIEl0ZXJhYmxlPEU+Ci17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbGxlY3Rpb24ncyB2YWx1ZXMuCi0JICovCi0JSXRlcmF0b3I8RT4gaXRlcmF0b3IoKTsKLQkJU3RyaW5nIFZBTFVFUyA9ICJ2YWx1ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbGxlY3Rpb24uCi0JICovCi0JaW50IHNpemUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL0xpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDg4MjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvTGlzdFZhbHVlTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IGxpc3QgYWNjZXNzaW5nIGFuZAotICogY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBpdCBtb3JlIHBsdWdnYWJsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIGxpc3QgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTW9kZWwsIEl0ZXJhYmxlPEU+Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBsaXN0J3MgdmFsdWVzLgotCSAqLwotCUl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBMSVNUX1ZBTFVFUyA9ICJsaXN0IHZhbHVlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGlzdCdzIHZhbHVlcy4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8RT4gbGlzdEl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JaW50IHNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IG9mIHRoZSBsaXN0LgotCSAqLwotCUUgZ2V0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxpc3QncyB2YWx1ZXMuCi0JICovCi0JT2JqZWN0W10gdG9BcnJheSgpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Qcm9wZXJ0eVZhbHVlTW9kZWwuamF2YSBiL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODBiZTQzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1Byb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgdG8gYWJzdHJhY3QgcHJvcGVydHkgYWNjZXNzaW5nIGFuZAotICogY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBpdCBtb3JlIHBsdWdnYWJsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdmFsdWUgaGVsZCBieSB0aGUgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLQlleHRlbmRzIE1vZGVsCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByb3BlcnR5J3MgdmFsdWUuCi0JICovCi0JVCBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L21vZGVsL3ZhbHVlL1RyZWVOb2RlVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MjgxYjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZU5vZGVWYWx1ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZTsKLQotLyoqCi0gKiBFeHRlbmQge0BsaW5rIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsfSB0byBiZXR0ZXIgc3VwcG9ydAotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyfS4KLSAqIDxwPgotICogSW1wbGVtZW50b3JzIG9mIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBmaXJlIGEgInN0YXRlIGNoYW5nZSIgZXZlbnQKLSAqIHdoZW5ldmVyIHRoZSBub2RlJ3MgaW50ZXJuYWwgc3RhdGUgY2hhbmdlcyBpbiBhIHdheSB0aGF0IHRoZQotICogdHJlZSBsaXN0ZW5lcnMgc2hvdWxkIGJlIG5vdGlmaWVkLgotICogPHA+Ci0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIGFsc28gZmlyZSBhICJ2YWx1ZSBwcm9wZXJ0eSBjaGFuZ2UiCi0gKiBldmVudCB3aGVuZXZlciB0aGUgbm9kZSdzIHZhbHVlIGNoYW5nZXMuIFR5cGljYWxseSwgb25seSBub2RlcyB0aGF0Ci0gKiBob2xkICJwcmltaXRpdmUiIGRhdGEgd2lsbCBmaXJlIHRoaXMgZXZlbnQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHZhbHVlcyBoZWxkIGJ5IHRoZSBtb2RlbAotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyZWVOb2RlVmFsdWVNb2RlbDxUPgotCWV4dGVuZHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIHBhcmVudCBub2RlOyBudWxsIGlmIHRoZSBub2RlCi0JICogaXMgdGhlIHJvb3QuCi0JICovCi0JVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IHBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBub2RlLgotCSAqLwotCVRyZWVOb2RlVmFsdWVNb2RlbDxUPltdIHBhdGgoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3QgdmFsdWUgbW9kZWwgb2YgdGhlIG5vZGUncyBjaGlsZCBub2Rlcy4KLQkgKi8KLQlMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8VD4+IGNoaWxkcmVuTW9kZWwoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9kZSdzIGNoaWxkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JVHJlZU5vZGVWYWx1ZU1vZGVsPFQ+IGNoaWxkKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vZGUncyBsaXN0IG9mIGNoaWxkcmVuLgotCSAqLwotCWludCBjaGlsZHJlblNpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgaW5kZXggaW4gdGhlIG5vZGUncyBsaXN0IG9mIGNoaWxkcmVuIG9mIHRoZSBzcGVjaWZpZWQgY2hpbGQuCi0JICovCi0JaW50IGluZGV4T2ZDaGlsZChUcmVlTm9kZVZhbHVlTW9kZWw8VD4gY2hpbGQpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG5vZGUgaXMgYSBsZWFmIChpLmUuIGl0IGhhcyBubyBjaGlsZHJlbikKLQkgKi8KLQlib29sZWFuIGlzTGVhZigpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9UcmVlVmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvVHJlZVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzZTQ0ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9UcmVlVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIHRvIGFic3RyYWN0IHRyZWUgYWNjZXNzaW5nIGFuZAotICogY2hhbmdlIG5vdGlmaWNhdGlvbiBhbmQgbWFrZSBpdCBtb3JlIHBsdWdnYWJsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHJlZVZhbHVlTW9kZWw8RT4KLQlleHRlbmRzIE1vZGVsCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0cmVlJ3Mgbm9kZXMuCi0JICovCi0JSXRlcmF0b3I8RT4gbm9kZXMoKTsKLQkJU3RyaW5nIE5PREVTID0gIm5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTVmYTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBDb2xsZWN0aW9uVmFsdWVNb2RlbH0gdG8gYWxsb3cgdGhlIHNldHRpbmcgb2YgdGhlCi0gKiBjb2xsZWN0aW9uJ3MgdmFsdWVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiB2YWx1ZXMgaGVsZCBieSB0aGUgbW9kZWwKLSAqLwotcHVibGljIGludGVyZmFjZSBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEU+Ci0JZXh0ZW5kcyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPgotewotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZXMgYW5kIGZpcmUgYSBjb2xsZWN0aW9uIGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogQHNlZSBDb2xsZWN0aW9uVmFsdWVNb2RlbCNWQUxVRVMKLQkgKi8KLQl2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUxpc3RWYWx1ZU1vZGVsLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZUxpc3RWYWx1ZU1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmOGU1MzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVMaXN0VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBMaXN0VmFsdWVNb2RlbH0gdG8gYWxsb3cgdGhlIHNldHRpbmcgb2YgdGhlCi0gKiBsaXN0cydzIHZhbHVlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgdmFsdWVzIGhlbGQgYnkgdGhlIG1vZGVsCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgV3JpdGFibGVMaXN0VmFsdWVNb2RlbDxFPgotCWV4dGVuZHMgTGlzdFZhbHVlTW9kZWw8RT4KLXsKLQotCS8qKgotCSAqIFNldCB0aGUgbGlzdCB2YWx1ZXMgYW5kIGZpcmUgYSBsaXN0IGNoYW5nZSBub3RpZmljYXRpb24uCi0JICogQHNlZSBMaXN0VmFsdWVNb2RlbCNMSVNUX1ZBTFVFUwotCSAqLwotCXZvaWQgc2V0TGlzdFZhbHVlcyhJdGVyYWJsZTxFPiB2YWx1ZXMpOwotCi19CmRpZmYgLS1naXQgYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvbW9kZWwvdmFsdWUvV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzNWMzNS4uMDAwMDAwMAotLS0gYS9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9tb2RlbC92YWx1ZS9Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWU7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBQcm9wZXJ0eVZhbHVlTW9kZWx9IHRvIGFsbG93IHRoZSBzZXR0aW5nIG9mIHRoZSBwcm9wZXJ0eSdzIHZhbHVlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB2YWx1ZSBoZWxkIGJ5IHRoZSBtb2RlbAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+Ci0JZXh0ZW5kcyBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4KLXsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgYW5kIGZpcmUgYSBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIEBzZWUgUHJvcGVydHlWYWx1ZU1vZGVsI1ZBTFVFCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShUIHZhbHVlKTsKLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9uaXplci5qYXZhIGIvY29tbW9uL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5L3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvc3luY2hyb25pemVycy9DYWxsYmFja1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE2NjJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvQ2FsbGJhY2tTeW5jaHJvbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRXh0ZW5kIHtAbGluayBTeW5jaHJvbml6ZXJ9IHRvIG5vdGlmeSBsaXN0ZW5lcnMKLSAqIHdoZW4gYSBzeW5jaHJvbml6YXRpb24gImN5Y2xlIiBpcyBjb21wbGV0ZTsgaS5lLiB0aGUgc3luY2hyb25pemF0aW9uIGhhcywKLSAqIGZvciB0aGUgbW9tZW50LCBxdWllc2NlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBDYWxsYmFja1N5bmNocm9uaXplcgotCWV4dGVuZHMgU3luY2hyb25pemVyCi17Ci0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbGlzdGVuZXIgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlIHN5bmNocm9uaXplciBoYXMKLQkgKiBxdWllc2NlZC4KLQkgKiBAc2VlICNyZW1vdmVMaXN0ZW5lcihMaXN0ZW5lcikKLQkgKi8KLQl2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGxpc3RlbmVyLgotCSAqIEBzZWUgI2FkZExpc3RlbmVyKExpc3RlbmVyKQotCSAqLwotCXZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBsaXN0ZW5lcnMgdG8gYmUgbm90aWZpZWQgd2hlbmV2ZXIgdGhlCi0JICogc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyCi0JCWV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBzcGVjaWZpZWQgc3luY2hyb25pemVyIGhhcyBxdWllc2NlZC4KLQkJICovCi0JCXZvaWQgc3luY2hyb25pemF0aW9uUXVpZXNjZWQoQ2FsbGJhY2tTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIENhbGxiYWNrU3luY2hyb25pemVyfSBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIsIFNlcmlhbGl6YWJsZQotCXsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBDYWxsYmFja1N5bmNocm9uaXplciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCX0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCXByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgewotCQkJLy8gcmVwbGFjZSB0aGlzIG9iamVjdCB3aXRoIHRoZSBzaW5nbGV0b24KLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyLmphdmEgYi9jb21tb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjQ1ZDc4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGRlZmluZXMgdGhlIHByb3RvY29sIGZvciBzdGFydGluZywgc3RvcHBpbmcsIGFuZCBleGVjdXRpbmcgYQotICogbG9uZy1ydW5uaW5nLCByZXBlYXRhYmxlLCBhbmQgcG9zc2libHkgcmVjdXJzaXZlICJzeW5jaHJvbml6YXRpb24iIHByb2Nlc3MuCi0gKiBUaGUgaW50ZW50IGlzIGZvciB0aGUgc3luY2hyb25pemVyIHRvIHN5bmNocm9uaXplIGEgInNlY29uZGFyeSIgbW9kZWwgd2l0aAotICogYSAicHJpbWFyeSIgbW9kZWwuIEFueSBjaGFuZ2UgdG8gdGhlICJwcmltYXJ5IiBtb2RlbCB3aWxsIHRyaWdnZXIgdGhlCi0gKiBzeW5jaHJvbml6YXRpb24uIFRoZSBzeW5jaHJvbml6ZXIgaW1wbGVtZW50YXRpb24gd2lsbCBkZXRlcm1pbmUgd2hldGhlciB0aGUKLSAqICJzZWNvbmRhcnkiIG1vZGVsIHJlbWFpbnMgaW4gc3luYyBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LgotICogPHA+Ci0gKiBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSB7QGxpbmsgI3N0YXJ0KCl9IGFuZCB7QGxpbmsgI3N0b3AoKX0gbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCBmcm9tCi0gKiBhIHNpbmdsZSBtYXN0ZXIgdGhyZWFkIHRoYXQgd291bGQgY29udHJvbCB0aGUgc3luY2hyb25pemVyJ3MgbGlmZWN5Y2xlIGFuZAotICogdGhlIHtAbGluayAjc3luY2hyb25pemUoKX0gbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLCBwb3NzaWJseSBmcm9tCi0gKiBtdWx0aXBsZSB0aHJlYWRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFN5bmNocm9uaXplciB7Ci0KLQkvKioKLQkgKiBFbmFibGUgdGhlIHN5bmNocm9uaXplciB0byBhbGxvdyBmdXR1cmUgc3luY2hyb25pemF0aW9ucyBhcyByZXF1ZXN0ZWQKLQkgKiBieSBjYWxscyB0byB7QGxpbmsgI3N5bmNocm9uaXplKCl9LgotCSAqLwotCXZvaWQgc3RhcnQoKTsKLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBkZXBlbmRlbnQgbW9kZWwgd2l0aCB0aGUgcHJpbWFyeSBtb2RlbC4gRG8gbm90aGluZyBpZgotCSAqIHtAbGluayAjc3RhcnQoKX0gaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gY2FsbGVkLiBEbyBub3RoaW5nIGlmIHtAbGluayAjc3RvcH0KLQkgKiBoYXMgYmVlbiBjYWxsZWQgKHdpdGhvdXQgYW55IGludGVybWVkaWF0ZSBjYWxsIHRvIHtAbGluayAjc3RhcnQoKX0uCi0JICovCi0Jdm9pZCBzeW5jaHJvbml6ZSgpOwotCi0JLyoqCi0JICogU3RvcCB0aGUgc3luY2hyb25pemVyIGltbWVkaWF0ZWx5IG9yLCBpZiBhIHN5bmNocm9uaXphdGlvbiBpcyBjdXJyZW50bHkKLQkgKiBpbiBwcm9ncmVzcywgd2hlbiBpdCBjb21wbGV0ZXMuIFJldHVybiB3aGVuIHRoZSBzeW5jaHJvbml6ZXIgaXMgc3RvcHBlZC4KLQkgKiBObyBmdXJ0aGVyIHN5bmNob25pemF0aW9ucyB3aWxsIHBlcmZvcm1lZCB1bnRpbCB7QGxpbmsgI3N0YXJ0KCl9IGlzIGNhbGxlZC4KLQkgKi8KLQl2b2lkIHN0b3AoKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU3luY2hyb25pemVyfSBpbnRlcmZhY2UgdGhhdCB3aWxsIGRvCi0JICogbm90aGluZy4KLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgU3luY2hyb25pemVyLCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3luY2hyb25pemVyIElOU1RBTkNFID0gbmV3IE51bGwoKTsKLQkJcHVibGljIHN0YXRpYyBTeW5jaHJvbml6ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIE51bGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTUzMDM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY3ZzaWdub3JlIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8ucHJvamVjdCBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MzlkMTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQwOTBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDY6MjQgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2ZTIxNy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNkMjliYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIyYjgyMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIENvcmUgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdENvbW1vbkNvcmVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdENvbW1vbkNvcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTMyNTNhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25Db3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcHRDb21tb25Db3JlUmVzb3VyY2VKYXZhVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkpwdENvbW1vbkNvcmVVdGlsaXR5SmR0VGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25Db3JlVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvbW1vbkNvcmVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRDb21tb25Db3JlUmVzb3VyY2VKYXZhVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdENvbW1vbkNvcmVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RGYWNldGVkUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmJhNzRiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0RmFjZXRlZFByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJmYWNldGVkIiBwcm9qZWN0LgotICogU3VwcG9ydCBmb3IgaW5zdGFsbGluZyBmYWNldHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0RmFjZXRlZFByb2plY3QgZXh0ZW5kcyBUZXN0UGxhdGZvcm1Qcm9qZWN0IHsKLQlwcml2YXRlIGZpbmFsIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdDsKLQotCi0JLy8gKioqKioqKioqKiBidWlsZGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVGVzdEZhY2V0ZWRQcm9qZWN0IGJ1aWxkRmFjZXRlZFByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEZhY2V0ZWRQcm9qZWN0KGJhc2VQcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRlc3RGYWNldGVkUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0TmFtZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBUZXN0RmFjZXRlZFByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcihwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQkJdGhpcy5mYWNldGVkUHJvamVjdCA9IHRoaXMuY3JlYXRlRmFjZXRlZFByb2plY3QoKTsKLQl9Ci0KLQlwcml2YXRlIElGYWNldGVkUHJvamVjdCBjcmVhdGVGYWNldGVkUHJvamVjdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZSh0aGlzLmdldFByb2plY3QoKSwgdHJ1ZSwgbnVsbCk7CQkvLyB0cnVlID0gImNvbnZlcnQgaWYgbmVjZXNzYXJ5IgotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSUZhY2V0ZWRQcm9qZWN0IGdldEZhY2V0ZWRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5mYWNldGVkUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsRmFjZXQoU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuaW5zdGFsbEZhY2V0KGZhY2V0TmFtZSwgdmVyc2lvbk5hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbEZhY2V0KFN0cmluZyBmYWNldE5hbWUsIFN0cmluZyB2ZXJzaW9uTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLnVuaW5zdGFsbEZhY2V0KGZhY2V0TmFtZSwgdmVyc2lvbk5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIGlmICdjb25maWcnIGlzIG51bGwgKGFuZCAnZmFjZXROYW1lJyBpcyAianB0LmpwYSIpLCB0aGUgSlBBIHByb2plY3Qgd2lsbCBiZSBidWlsdCB3aXRoIHRoZSBkZWZhdWx0cwotCSAqIGRlZmluZWQgaW4gSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiBJbiBKUEEgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBhbiBJRGF0YU1vZGVsCi0JICogSW4gSkFYQiB0aGUgY29uZmlnIG9iamVjdCB3aWxsIGJlIGEgSmF4YkZhY2V0SW5zdGFsbENvbmZpZwotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxGYWNldChTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUsIE9iamVjdCBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5mYWNldGVkUHJvamVjdC5pbnN0YWxsUHJvamVjdEZhY2V0KHRoaXMuZmFjZXRWZXJzaW9uKGZhY2V0TmFtZSwgdmVyc2lvbk5hbWUpLCBjb25maWcsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEluIEpQQSB0aGUgY29uZmlnIG9iamVjdCB3aWxsIGJlIGFuIElEYXRhTW9kZWwKLQkgKiBJbiBKQVhCIHRoZSBjb25maWcgb2JqZWN0IHdpbGwgYmUgYSBKYXhiRmFjZXRVbmluc3RhbGxDb25maWcKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxGYWNldChTdHJpbmcgZmFjZXROYW1lLCBTdHJpbmcgdmVyc2lvbk5hbWUsIE9iamVjdCBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcy5mYWNldGVkUHJvamVjdC51bmluc3RhbGxQcm9qZWN0RmFjZXQodGhpcy5mYWNldFZlcnNpb24oZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSksIGNvbmZpZywgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24oU3RyaW5nIGZhY2V0TmFtZSwgU3RyaW5nIHZlcnNpb25OYW1lKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoZmFjZXROYW1lKS5nZXRWZXJzaW9uKHZlcnNpb25OYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SmF2YVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhN2UzOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEphdmFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci0KLS8qKgotICogVGhpcyBidWlsZHMgYW5kIGhvbGRzIGEgIkphdmEiIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBhZGRpbmcgcGFja2FnZXMgYW5kIHR5cGVzLgotICogCi0gKiAiSmF2YSIgcHJvamVjdHMgYXJlbid0IHJlcXVpcmVkIHRvIGJlICJmYWNldGVkIiBwcm9qZWN0cywgYnV0IGZvciBKUEEKLSAqIHRlc3RpbmcgdGhleSBhcmUuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRlc3RKYXZhUHJvamVjdCBleHRlbmRzIFRlc3RGYWNldGVkUHJvamVjdCB7Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBzb3VyY2VGb2xkZXI7Ci0KLQotCS8vICoqKioqKioqKiogYnVpbGRlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhUHJvamVjdChiYXNlUHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXN0SmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMocHJvamVjdE5hbWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEphdmFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJc3VwZXIocHJvamVjdE5hbWUsIGF1dG9CdWlsZCk7Ci0JCXRoaXMuaW5zdGFsbEZhY2V0KCJqc3QuamF2YSIsICI1LjAiKTsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZSh0aGlzLmdldFByb2plY3QoKSk7Ci0JCXRoaXMuc291cmNlRm9sZGVyID0gdGhpcy5qYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEphcihTdHJpbmcgamFyUGF0aCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRoaXMuYWRkQ2xhc3NwYXRoRW50cnkoSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGphclBhdGgpLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aEVudHJ5KElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKEFycmF5VG9vbHMuYWRkKHRoaXMuamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCksIGVudHJ5KSwgbnVsbCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVBhY2thZ2VGcmFnbWVudCBjcmVhdGVQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5zb3VyY2VGb2xkZXIuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCBmYWxzZSwgbnVsbCk7CS8vIGZhbHNlID0gIm5vIGZvcmNlIgotCX0KLQotCS8qKgotCSAqIFRoZSBzb3VyY2Ugc2hvdWxkIE5PVCBjb250YWluIGEgcGFja2FnZSBkZWNsYXJhdGlvbjsKLQkgKiBpdCB3aWxsIGJlIGFkZGVkIGhlcmUuCi0JICovCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUsIFN0cmluZyBzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHRoaXMuY3JlYXRlUGFja2FnZShwYWNrYWdlTmFtZSksIGNvbXBpbGF0aW9uVW5pdE5hbWUsIG5ldyBTaW1wbGVTb3VyY2VXcml0ZXIoc291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHNvdXJjZSBzaG91bGQgTk9UIGNvbnRhaW4gYSBwYWNrYWdlIGRlY2xhcmF0aW9uOwotCSAqIGl0IHdpbGwgYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY29tcGlsYXRpb25Vbml0TmFtZSwgU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVDb21waWxhdGlvblVuaXQodGhpcy5jcmVhdGVQYWNrYWdlKHBhY2thZ2VOYW1lKSwgY29tcGlsYXRpb25Vbml0TmFtZSwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc291cmNlIHNob3VsZCBOT1QgY29udGFpbiBhIHBhY2thZ2UgZGVjbGFyYXRpb247Ci0JICogaXQgd2lsbCBiZSBhZGRlZCBoZXJlLgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCwgU3RyaW5nIGNvbXBpbGF0aW9uVW5pdE5hbWUsIFNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMDApOwotCQlzb3VyY2VXcml0ZXIuYXBwZW5kU291cmNlVG8oc2IpOwotCQlTdHJpbmcgc291cmNlID0gc2IudG9TdHJpbmcoKTsKLQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoY29tcGlsYXRpb25Vbml0TmFtZSwgc291cmNlLCBmYWxzZSwgbnVsbCk7CS8vIGZhbHNlID0gIm5vIGZvcmNlIgotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50ZXJmYWNlIFNvdXJjZVdyaXRlciB7Ci0JCXZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JfQotCi0JcHVibGljIGNsYXNzIFNpbXBsZVNvdXJjZVdyaXRlciBpbXBsZW1lbnRzIFNvdXJjZVdyaXRlciB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHNvdXJjZTsKLQkJcHVibGljIFNpbXBsZVNvdXJjZVdyaXRlcihTdHJpbmcgc291cmNlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMuc291cmNlKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RQbGF0Zm9ybVByb2plY3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0UGxhdGZvcm1Qcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWMyZGYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RQbGF0Zm9ybVByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3REZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiZ2VuZXJhbCIgRWNsaXBzZSBwcm9qZWN0LgotICogU3VwcG9ydCBmb3IgYWRkaW5nIG5hdHVyZXMsIGZvbGRlcnMsIGFuZCBmaWxlcy4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RQbGF0Zm9ybVByb2plY3QgewotCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQotCS8qKiBjYXJyaWFnZSByZXR1cm4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN0cmluZ1Rvb2xzLkNSOwotCi0JCi0JLy8gKioqKioqKioqKiBidWlsZGVycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUZXN0UGxhdGZvcm1Qcm9qZWN0IGJ1aWxkUGxhdGZvcm1Qcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RQbGF0Zm9ybVByb2plY3QoYmFzZVByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIFRlc3RQbGF0Zm9ybVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQl0aGlzLnNldEF1dG9CdWlsZChhdXRvQnVpbGQpOyAgLy8gd29ya3NwYWNlLXdpZGUgc2V0dGluZwotCQl0aGlzLnByb2plY3QgPSB0aGlzLmJ1aWxkUGxhdGZvcm1Qcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QXV0b0J1aWxkKGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlXb3Jrc3BhY2VEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXRBdXRvQnVpbGRpbmcoYXV0b0J1aWxkKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGJ1aWxkUGxhdGZvcm1Qcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUHJvamVjdCBwID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcC5jcmVhdGUobnVsbCk7Ci0JCXAub3BlbihudWxsKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2plY3ROYXR1cmUoU3RyaW5nIG5hdHVyZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB0aGlzLnByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKEFycmF5VG9vbHMuYWRkKGRlc2NyaXB0aW9uLmdldE5hdHVyZUlkcygpLCBuYXR1cmVJRCkpOwotCQl0aGlzLnByb2plY3Quc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24sIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb2plY3ROYXR1cmUoU3RyaW5nIG5hdHVyZUlEKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSB0aGlzLnByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0TmF0dXJlSWRzKEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCksIG5hdHVyZUlEKSk7Ci0JCXRoaXMucHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjM2JkNDYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkdlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaXRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi0JCWV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcjsKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLQkKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyID0gbmV3IEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIoKTsKLQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcgotCQkJaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCQotCQlKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS50aGlzLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBqYXZhRWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAodGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuc3luY1dpdGhKYXZhRGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JfQotCQotCS8qKgotCSAqIE5COiB0aGlzIGlzIGNvcGllZCBmcm9tIEdlbmVyaWNKcGFQcm9qZWN0LCBzbyBpdCBtaWdodCBuZWVkIHRvIGJlCi0JICoga2VwdCBpbiBzeW5jaCB3aXRoIHRoYXQgY29kZSBpZiBpdCBjaGFuZ2VzLi4uIHllY2guLi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jV2l0aEphdmFEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQkJdGhpcy5zeW5jV2l0aEphdmFEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJCXRoaXMuamF2YUNvbXBpbGF0aW9uVW5pdENoYW5nZWQoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7IC8vIGlnbm9yZSB0aGUgZWxlbWVudHMgaW5zaWRlIGEgY29tcGlsYXRpb24gdW5pdAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1dpdGhKYXZhRGVsdGFDaGlsZHJlbihJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlmb3IgKElKYXZhRWxlbWVudERlbHRhIGNoaWxkIDogZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpKSB7Ci0JCQl0aGlzLnN5bmNXaXRoSmF2YURlbHRhKGNoaWxkKTsgLy8gcmVjdXJzZQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgamF2YUNvbXBpbGF0aW9uVW5pdENoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKHRoaXMuZGVsdGFJc1JlbGV2YW50KGRlbHRhKSkgewotCQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVsdGFJc1JlbGV2YW50KElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmIChCaXRUb29scy5vbmx5RmxhZ0lzU2V0KGRlbHRhLmdldEZsYWdzKCksIElKYXZhRWxlbWVudERlbHRhLkZfUFJJTUFSWV9XT1JLSU5HX0NPUFkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycyhTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGVudW1OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBlbnVtICIgKyBlbnVtTmFtZSArICIgeyAiICsgZW51bUJvZHkgKyAiIH0iKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2UgYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQgcGtnQ3UgPSAKLQkJCQluZXcgU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQoCi0JCQkJCQljdSwKLQkJCQkJCXRoaXMuYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCQkJCU51bGxBbm5vdGF0aW9uRWRpdEZvcm1hdHRlci5pbnN0YW5jZSgpLAotCQkJCQkJQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JCXRoaXMuamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0ID0gcGtnQ3U7Ci0JCXJldHVybiBwa2dDdS5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgYnVpbGRKYXZhUmVzb3VyY2VUeXBlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VUeXBlKSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZV8oY3UpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VFbnVtIGJ1aWxkSmF2YVJlc291cmNlRW51bShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlRW51bSkgdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGVfKGN1KTsKLQl9Ci0KLQlwcml2YXRlIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBidWlsZEphdmFSZXNvdXJjZVR5cGVfKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KGN1KTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQucmVzb2x2ZVR5cGVzKCk7Ci0JCXJldHVybiB0aGlzLmhhY2tKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUZpZWxkIGdldEZpZWxkKEphdmFSZXNvdXJjZVR5cGUgdHlwZSwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuZ2V0KHR5cGUuZ2V0RmllbGRzKCksIGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTWV0aG9kIGdldE1ldGhvZChKYXZhUmVzb3VyY2VUeXBlIHR5cGUsIGludCBpbmRleCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmdldCh0eXBlLmdldE1ldGhvZHMoKSwgaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZ2V0RW51bUNvbnN0YW50KEphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VFbnVtLmdldEVudW1Db25zdGFudHMoKSwgaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgaGFja0phdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgInByaW1hcnlUeXBlIik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBidWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmICh0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0KAotCQkJCWN1LAotCQkJCXRoaXMuYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCQlOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSwKLQkJCQlDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXIodGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSwgdGhpcy5uZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb25EZWZpbml0aW9uW10gYW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSnB0Q29tbW9uQ29yZVJlc291cmNlSmF2YVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRDb21tb25Db3JlUmVzb3VyY2VKYXZhVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRmNmE2OC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRDb21tb25Db3JlUmVzb3VyY2VKYXZhVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25Db3JlUmVzb3VyY2VKYXZhVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb21tb25Db3JlUmVzb3VyY2VKYXZhVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTb3VyY2VBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRDb21tb25Db3JlUmVzb3VyY2VKYXZhVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NvdXJjZUF0dHJpYnV0ZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Tb3VyY2VBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWNmYzg5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NvdXJjZUF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBTb3VyY2VBdHRyaWJ1dGVUZXN0cwotCQlleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBURVNUX0NMQVNTX05BTUUgPSAiVGVzdENsYXNzIjsKLQkKLQkKLQlwdWJsaWMgU291cmNlQXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0aW9uRGVmaW5pdGlvblswXTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uWzBdOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENsYXNzV2l0aFZhcmlvdXNBdHRyaWJ1dGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVEVTVF9DTEFTU19OQU1FKS5hcHBlbmQoIjxUIGV4dGVuZHMgTnVtYmVyPiAiKS5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmcgc3RyaW5nOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFN0cmluZ1tdIHN0cmluZ0FycmF5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFN0cmluZ1tdW10gc3RyaW5nRG91YmxlQXJyYXk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgVCBnZW5lcmljOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIExpc3Q8VD4gZ2VuZXJpY0xpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgVFtdIGdlbmVyaWNBcnJheTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PD8+IHdpbGRjYXJkTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRFU1RfQ0xBU1NfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVUeXBlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHRlc3RDbGFzc0NVID0gY3JlYXRlVGVzdENsYXNzV2l0aFZhcmlvdXNBdHRyaWJ1dGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdGVzdENsYXNzID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKHRlc3RDbGFzc0NVKTsKLQkJCi0JCS8vIFN0cmluZyBzdHJpbmcKLQkJSmF2YVJlc291cmNlRmllbGQgYXR0ID0gZ2V0RmllbGQodGVzdENsYXNzLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJpbmciLCBhdHQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgYXR0LmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dC50eXBlSXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGF0dC5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dC5nZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkpOwotCQkKLQkJLy8gTGlzdDxTdHJpbmc+IHN0cmluZ0xpc3QKLQkJYXR0ID0gZ2V0RmllbGQodGVzdENsYXNzLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJpbmdMaXN0IiwgYXR0LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLkxpc3QiLCBhdHQuZ2V0VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0LnR5cGVJc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYXR0LmdldFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0LmdldFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIGF0dC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZSgwKSk7Ci0JCQotCQkvLyBTdHJpbmdbXSBzdHJpbmdBcnJheQotCQlhdHQgPSBnZXRGaWVsZCh0ZXN0Q2xhc3MsIDIpOwotCQlhc3NlcnRFcXVhbHMoInN0cmluZ0FycmF5IiwgYXR0LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdIiwgYXR0LmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0LnR5cGVJc0FycmF5KCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBhdHQuZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHQuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpKTsKLQkJCi0JCS8vIFN0cmluZ1tdIHN0cmluZ0RvdWJsZUFycmF5Ci0JCWF0dCA9IGdldEZpZWxkKHRlc3RDbGFzcywgMyk7Ci0JCWFzc2VydEVxdWFscygic3RyaW5nRG91YmxlQXJyYXkiLCBhdHQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nW11bXSIsIGF0dC5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dC50eXBlSXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgYXR0LmdldFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0LmdldFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSk7Ci0JCQotCQkvLyBUIGdlbmVyaWMKLQkJYXR0ID0gZ2V0RmllbGQodGVzdENsYXNzLCA0KTsKLQkJYXNzZXJ0RXF1YWxzKCJnZW5lcmljIiwgYXR0LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bWJlciIsIGF0dC5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHQudHlwZUlzQXJyYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhdHQuZ2V0VHlwZUFycmF5Q29tcG9uZW50VHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHQuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpKTsKLQkJCi0JCS8vIExpc3Q8VD4gZ2VuZXJpY0xpc3QKLQkJYXR0ID0gZ2V0RmllbGQodGVzdENsYXNzLCA1KTsKLQkJYXNzZXJ0RXF1YWxzKCJnZW5lcmljTGlzdCIsIGF0dC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgYXR0LmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dC50eXBlSXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGF0dC5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dC5nZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdW1iZXIiLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoMCkpOwotCQkKLQkJLy8gVFtdIGdlbmVyaWNBcnJheQotCQlhdHQgPSBnZXRGaWVsZCh0ZXN0Q2xhc3MsIDYpOwotCQlhc3NlcnRFcXVhbHMoImdlbmVyaWNBcnJheSIsIGF0dC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5OdW1iZXJbXSIsIGF0dC5nZXRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dC50eXBlSXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyIiwgYXR0LmdldFR5cGVBcnJheUNvbXBvbmVudFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0LmdldFR5cGVBcnJheURpbWVuc2lvbmFsaXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSk7Ci0JCQotCQkvLyBMaXN0PD8+IHdpbGRjYXJkTGlzdAotCQlhdHQgPSBnZXRGaWVsZCh0ZXN0Q2xhc3MsIDcpOwotCQlhc3NlcnRFcXVhbHMoIndpbGRjYXJkTGlzdCIsIGF0dC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5MaXN0IiwgYXR0LmdldFR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dC50eXBlSXNBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGF0dC5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dC5nZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhdHQuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoMCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQVNUVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQyNjEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9BU1RUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBU1RUb29sc1Rlc3RzCi0JCWV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQVNUVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUNsYXNzQW5kTWVtYmVycyhTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgY2xhc3NCb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImNsYXp6IiwgY2xhc3NOYW1lICsgIi5qYXZhIiwgInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiB7ICIgKyBjbGFzc0JvZHkgKyAiIH0iKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudW1BbmRNZW1iZXJzKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImVudW1zIiwgZW51bU5hbWUgKyAiLmphdmEiLCAicHVibGljIGVudW0gIiArIGVudW1OYW1lICsgIiB7ICIgKyBlbnVtQm9keSArICIgfSIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZShmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMsIGZpbmFsIFN0cmluZyBpZEZpZWxkQW5ub3RhdGlvbikKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFR5cGUoCi0JCQkJbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQkJCXJldHVybiBpbXBvcnRzOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJCXNiLmFwcGVuZChpZEZpZWxkQW5ub3RhdGlvbik7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUVudW0xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoIlRlc3RFbnVtIiwgIkZPTywgQkFSLCBCQVoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5UZXN0QW5ub3RhdGlvbihmb289ZW51bXMuVGVzdEVudW0uQkFaKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5UZXN0QW5ub3RhdGlvbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKLQkJSkRURmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoY3UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBBU1RUb29scy5yZXNvbHZlRW51bSgoTmFtZSkgZGFlYS5nZXRFeHByZXNzaW9uKGZpZWxkLmdldE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSkpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVFbnVtMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJUZXN0RW51bSIsICJGT08sIEJBUiwgQkFaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlc3RBbm5vdGF0aW9uIiwgIlRlc3RFbnVtIGZvbygpOyIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0uQkFaIiwgIkBhbm5vdC5UZXN0QW5ub3RhdGlvbihmb289QkFaKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5UZXN0QW5ub3RhdGlvbiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJmb28iKTsKLQkJSkRURmllbGRBdHRyaWJ1dGUgZmllbGQgPSB0aGlzLmlkRmllbGQoY3UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBBU1RUb29scy5yZXNvbHZlRW51bSgoTmFtZSkgZGFlYS5nZXRFeHByZXNzaW9uKGZpZWxkLmdldE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSkpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVFbnVtMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJUZXN0RW51bSIsICJGT08sIEJBUiwgQkFaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlc3RBbm5vdGF0aW9uIiwgIlRlc3RFbnVtIGZvbygpOyIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0uKiIsICJAYW5ub3QuVGVzdEFubm90YXRpb24oZm9vPUJBWikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuVGVzdEFubm90YXRpb24iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiZm9vIik7Ci0JCUpEVEZpZWxkQXR0cmlidXRlIGZpZWxkID0gdGhpcy5pZEZpZWxkKGN1KTsKLQotCQlTdHJpbmcgYWN0dWFsID0gQVNUVG9vbHMucmVzb2x2ZUVudW0oKE5hbWUpZGFlYS5nZXRFeHByZXNzaW9uKGZpZWxkLmdldE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSkpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLkJBWiIsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVFbnVtNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJUZXN0RW51bSIsICJGT08sIEJBUiwgQkFaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRlc3RBbm5vdGF0aW9uIiwgIlRlc3RFbnVtIGZvbygpOyIpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJlbnVtcy5UZXN0RW51bSIsICJAYW5ub3QuVGVzdEFubm90YXRpb24oZm9vPVRlc3RFbnVtLkJBWikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuVGVzdEFubm90YXRpb24iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiZm9vIik7Ci0JCUpEVEZpZWxkQXR0cmlidXRlIGZpZWxkID0gdGhpcy5pZEZpZWxkKGN1KTsKLQotCQlTdHJpbmcgYWN0dWFsID0gQVNUVG9vbHMucmVzb2x2ZUVudW0oKE5hbWUpIGRhZWEuZ2V0RXhwcmVzc2lvbihmaWVsZC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5CQVoiLCBhY3R1YWwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIG90aGVyQ2xhc3NOYW1lID0gIk90aGVyQ2xhc3MiOwotCQlmaW5hbCBTdHJpbmcgb3RoZXJDbGFzc05hbWUyID0gIk90aGVyQ2xhc3MyIjsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUgPSAiY2xhenouT3RoZXJDbGFzcyI7Ci0JCWZpbmFsIFN0cmluZyBmcU90aGVyQ2xhc3NOYW1lMiA9ICJjbGF6ei5PdGhlckNsYXNzMiI7Ci0JCWZpbmFsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSA9ICJUZXN0QW5ub3RhdGlvbiI7Ci0JCWZpbmFsIFN0cmluZyBmcUFubm90YXRpb25OYW1lID0gImFubm90LlRlc3RBbm5vdGF0aW9uIjsKLQkJCi0JCWNyZWF0ZUNsYXNzQW5kTWVtYmVycyhvdGhlckNsYXNzTmFtZSwgIiIpOwotCQljcmVhdGVDbGFzc0FuZE1lbWJlcnMob3RoZXJDbGFzc05hbWUyLCAiIik7Ci0JCWNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKGFubm90YXRpb25OYW1lLCAiQ2xhc3NbXSBmb28oKTsiKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZSgKLQkJCQluZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KG5ldyBTdHJpbmdbXSB7ZnFPdGhlckNsYXNzTmFtZSwgZnFPdGhlckNsYXNzTmFtZTIsIGZxQW5ub3RhdGlvbk5hbWV9KSwKLQkJCQkiQFRlc3RBbm5vdGF0aW9uKGZvbz17IiArIG90aGVyQ2xhc3NOYW1lICsgIi5jbGFzcywgIiArIG90aGVyQ2xhc3NOYW1lMiArICIuY2xhc3N9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGZxQW5ub3RhdGlvbk5hbWUpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IAotCQkJCW5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KAotCQkJCQkJZGFhLCAiZm9vIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JUeXBlcygpKTsKLQkJSkRURmllbGRBdHRyaWJ1dGUgZmllbGQgPSBpZEZpZWxkKGN1KTsKLQkJCi0JCUl0ZXJhYmxlPFN0cmluZz4gYWN0dWFsID0gQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZXMoZGFlYS5nZXRFeHByZXNzaW9uKGZpZWxkLmdldE1vZGlmaWVkRGVjbGFyYXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKAotCQkJCUNvbGxlY3Rpb25Ub29scy5saXN0KG5ldyBTdHJpbmdbXSB7ZnFPdGhlckNsYXNzTmFtZSwgZnFPdGhlckNsYXNzTmFtZTJ9KSwKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChhY3R1YWwpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcgb3RoZXJDbGFzc05hbWUgPSAiT3RoZXJDbGFzcyI7Ci0JCWZpbmFsIFN0cmluZyBvdGhlckNsYXNzTmFtZTIgPSAiT3RoZXJDbGFzczIiOwotCQlmaW5hbCBTdHJpbmcgZnFPdGhlckNsYXNzTmFtZSA9ICJjbGF6ei5PdGhlckNsYXNzIjsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUyID0gImNsYXp6Lk90aGVyQ2xhc3MyIjsKLQkJZmluYWwgU3RyaW5nIGFubm90YXRpb25OYW1lID0gIlRlc3RBbm5vdGF0aW9uIjsKLQkJZmluYWwgU3RyaW5nIGZxQW5ub3RhdGlvbk5hbWUgPSAiYW5ub3QuVGVzdEFubm90YXRpb24iOwotCQkKLQkJY3JlYXRlQ2xhc3NBbmRNZW1iZXJzKG90aGVyQ2xhc3NOYW1lLCAiIik7Ci0JCWNyZWF0ZUNsYXNzQW5kTWVtYmVycyhvdGhlckNsYXNzTmFtZTIsICIiKTsKLQkJY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoYW5ub3RhdGlvbk5hbWUsICJDbGFzc1tdIGZvbygpOyIpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKAotCQkJCW5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4obmV3IFN0cmluZ1tdIHtmcU90aGVyQ2xhc3NOYW1lLCBmcU90aGVyQ2xhc3NOYW1lMiwgZnFBbm5vdGF0aW9uTmFtZX0pLAotCQkJCSJAVGVzdEFubm90YXRpb24oZm9vPXsxLCAiICsgb3RoZXJDbGFzc05hbWUgKyAiLmNsYXNzfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihmcUFubm90YXRpb25OYW1lKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSAKLQkJCQluZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPigKLQkJCQkJCWRhYSwgImZvbyIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yVHlwZXMoKSk7Ci0JCUpEVEZpZWxkQXR0cmlidXRlIGZpZWxkID0gaWRGaWVsZChjdSk7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IGFjdHVhbCA9IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzKGRhZWEuZ2V0RXhwcmVzc2lvbihmaWVsZC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU3RyaW5nW10ge251bGwsIGZxT3RoZXJDbGFzc05hbWV9KSwKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChhY3R1YWwpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBTdHJpbmcgb3RoZXJDbGFzc05hbWUgPSAiT3RoZXJDbGFzcyI7Ci0JCWZpbmFsIFN0cmluZyBvdGhlckNsYXNzTmFtZTIgPSAiT3RoZXJDbGFzczIiOwotCQlmaW5hbCBTdHJpbmcgZnFPdGhlckNsYXNzTmFtZSA9ICJjbGF6ei5PdGhlckNsYXNzIjsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUyID0gImNsYXp6Lk90aGVyQ2xhc3MyIjsKLQkJZmluYWwgU3RyaW5nIGFubm90YXRpb25OYW1lID0gIlRlc3RBbm5vdGF0aW9uIjsKLQkJZmluYWwgU3RyaW5nIGZxQW5ub3RhdGlvbk5hbWUgPSAiYW5ub3QuVGVzdEFubm90YXRpb24iOwotCQkKLQkJY3JlYXRlQ2xhc3NBbmRNZW1iZXJzKG90aGVyQ2xhc3NOYW1lLCAiIik7Ci0JCWNyZWF0ZUNsYXNzQW5kTWVtYmVycyhvdGhlckNsYXNzTmFtZTIsICIiKTsKLQkJY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoYW5ub3RhdGlvbk5hbWUsICJDbGFzc1tdIGZvbygpOyIpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKAotCQkJCW5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4obmV3IFN0cmluZ1tdIHtmcU90aGVyQ2xhc3NOYW1lLCBmcU90aGVyQ2xhc3NOYW1lMiwgZnFBbm5vdGF0aW9uTmFtZX0pLAotCQkJCSJAVGVzdEFubm90YXRpb24oZm9vPXtAVGVzdEFubm90YXRpb24oKSwgIiArIG90aGVyQ2xhc3NOYW1lICsgIi5jbGFzc30iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihmcUFubm90YXRpb25OYW1lKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSAKLQkJCQluZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPigKLQkJCQkJCWRhYSwgImZvbyIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yVHlwZXMoKSk7Ci0JCUpEVEZpZWxkQXR0cmlidXRlIGZpZWxkID0gaWRGaWVsZChjdSk7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IGFjdHVhbCA9IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzKGRhZWEuZ2V0RXhwcmVzc2lvbihmaWVsZC5nZXRNb2RpZmllZERlY2xhcmF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpKTsKLQkJCi0JCWFzc2VydEVxdWFscygKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU3RyaW5nW10ge251bGwsIGZxT3RoZXJDbGFzc05hbWV9KSwKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdChhY3R1YWwpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvQW5ub3RhdGlvblRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlY2E1ZTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0Fubm90YXRpb25UZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQXJyYXlJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb29sZWFuTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWVtYmVyVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5QYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbXBsZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlR5cGVMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRURmllbGRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVE1ldGhvZEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSkRUVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi0vKioKLSAqIFByb3ZpZGUgYW4gZWFzeSg/KSB3YXkgdG8gYnVpbGQgYW4gYW5ub3RhdGVkIHNvdXJjZSBmaWxlLgotICogVGhlIHR5cGUgbXVzdCBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgb25lIG9mIHRoZSB7QGxpbmsgI2NyZWF0ZVRlc3RUeXBlKCl9Ci0gKiBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIGFueSBvZiB0aGUgdmFyaW91cyBoZWxwZXIgbWV0aG9kcyAoaS5lLiB0aGUgdHlwZSBpcwotICogPGVtPm5vdDwvZW0+IGNyZWF0ZWQgZHVyaW5nIHtAbGluayAjc2V0VXAoKX0pLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbm5vdGF0aW9uVGVzdENhc2UKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUCA9IEZpbGUuc2VwYXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFByb2plY3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUVfID0gUEFDS0FHRV9OQU1FICsgJy4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfSU5GT19GSUxFX05BTUUgPSAicGFja2FnZS1pbmZvLmphdmEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggUEFDS0FHRV9JTkZPX0ZJTEVfUEFUSCA9IG5ldyBQYXRoKCJzcmMiICsgU0VQICsgUEFDS0FHRV9OQU1FICsgU0VQICsgUEFDS0FHRV9JTkZPX0ZJTEVfTkFNRSk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRV8gKyBUWVBFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9OQU1FID0gVFlQRV9OQU1FICsgIi5qYXZhIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIEZJTEVfUEFUSCA9IG5ldyBQYXRoKCJzcmMiICsgU0VQICsgUEFDS0FHRV9OQU1FICsgU0VQICsgRklMRV9OQU1FKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1swXTsKLQotCi0JLy8gKioqKioqKioqKiBUZXN0Q2FzZSBiZWhhdmlvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLmJ1aWxkSmF2YVByb2plY3QoZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSmF2YVByb2plY3QoUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJdGhpcy5kdW1wU291cmNlKCk7Ci0JCXRoaXMuZGVsZXRlUHJvamVjdCgpOwotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW50IGkgPSAxOwotCQlib29sZWFuIGRlbGV0ZWQgPSBmYWxzZTsKLQkJd2hpbGUgKCAhIGRlbGV0ZWQpIHsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCWRlbGV0ZWQgPSB0cnVlOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCWlmIChpID09IDQpIHsKLQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhpcy5nZXROYW1lKCkgKyAiIC0gdW5hYmxlIHRvIGRlbGV0ZSBwcm9qZWN0IiwgZXgpOwotCQkJCX0KLQkJCQlUaHJlYWQuc2xlZXAoMTAwMCk7Ci0JCQkJaSsrOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNvdXJjZShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIHRoaXMuZ2V0TmFtZSgpICsgIiAqKioqIik7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldFNvdXJjZShjdSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwYWNrYWdlIGNyZWF0aW9uICoqKioqKioqKgotCQotCS8qKiAKLQkgKiBjcmVhdGUgYW4gdW4tYW5ub3RhdGVkIHBhY2thZ2UtaW5mbwotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFBhY2thZ2VJbmZvKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpKTsKLQl9Ci0JCi0JLyoqIAotCSAqIGNyZWF0ZSBhbiB1bi1hbm5vdGF0ZWQgcGFja2FnZS1pbmZvIGluIGEgcGFja2FnZSB0aGUgZ2l2ZW4gbmFtZQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQYWNrYWdlSW5mbyhTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFBhY2thZ2VJbmZvKHBhY2thZ2VOYW1lLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIHNob3J0Y3V0IGZvciBzaW1wbHkgYWRkaW5nIGFuIGFubm90YXRpb24gdG8gdGhlIHBhY2thZ2UgZGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQlmaW5hbCBTdHJpbmcgcGFja2FnZUFubm90YXRpb24sIGZpbmFsIFN0cmluZyAuLi4gaW1wb3J0cykgCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCW5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihpbXBvcnRzKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQkJc2IuYXBwZW5kKHBhY2thZ2VBbm5vdGF0aW9uKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RQYWNrYWdlSW5mbyhQQUNLQUdFX05BTUUsIGFubm90YXRpb25Xcml0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UGFja2FnZUluZm8oU3RyaW5nIHBhY2thZ2VOYW1lLCBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KAotCQkJcGFja2FnZU5hbWUsIFBBQ0tBR0VfSU5GT19GSUxFX05BTUUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHBhY2thZ2VOYW1lLCBudWxsKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHlwZSBjcmVhdGlvbiAqKioqKioqKioqCi0JCi0JLyoqCi0JICogY3JlYXRlIGFuIHVuLWFubm90YXRlZCB0eXBlCi0JICovCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpKTsKLQl9Ci0JCi0JLyoqCi0JICogc2hvcnRjdXQgZm9yIHNpbXBseSBhZGRpbmcgYW4gYW5ub3RhdGlvbiB0byB0aGUgJ2lkJyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uSW1wb3J0LCBmaW5hbCBTdHJpbmcgaWRGaWVsZEFubm90YXRpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiAoYW5ub3RhdGlvbkltcG9ydCA9PSBudWxsKSA/Ci0JCQkJCUVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpIDoKLQkJCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYXRvcjxTdHJpbmc+KGFubm90YXRpb25JbXBvcnQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoaWRGaWVsZEFubm90YXRpb24pOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JLyoqCi0JICogc2hvcnRjdXQgZm9yIHNpbXBseSBhZGRpbmcgYSBmdWxseS1xdWFsaWZpZWQgYW5ub3RhdGlvbiB0byB0aGUgJ2lkJyBmaWVsZAotCSAqLwotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKGZpbmFsIFN0cmluZyBpZEZpZWxkQW5ub3RhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShudWxsLCBpZEZpZWxkQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGUoU3RyaW5nIHR5cGVOYW1lLCBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgdHlwZU5hbWUgKyAiLmphdmEiLCBjcmVhdGVTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlciwgdHlwZU5hbWUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGUoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZmlsZU5hbWUsIFN0cmluZyB0eXBlTmFtZSwgQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZmlsZU5hbWUsIHRoaXMuY3JlYXRlU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHR5cGVOYW1lKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTb3VyY2VXcml0ZXIgY3JlYXRlU291cmNlV3JpdGVyKEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNvdXJjZVdyaXRlciBjcmVhdGVTb3VyY2VXcml0ZXIoQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlciwgdHlwZU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU291cmNlV3JpdGVyIGNyZWF0ZVNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIHBhY2thZ2VOYW1lLCB0eXBlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnVtKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCB0aGlzLmNyZWF0ZUVudW1Tb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlcikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW51bShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGVudW1OYW1lLCBFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZmlsZU5hbWUsIHRoaXMuY3JlYXRlRW51bVNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCBlbnVtTmFtZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU291cmNlV3JpdGVyIGNyZWF0ZUVudW1Tb3VyY2VXcml0ZXIoRW51bUFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcikgewotCQlyZXR1cm4gbmV3IEVudW1Bbm5vdGF0ZWRTb3VyY2VXcml0ZXIoYW5ub3RhdGlvbldyaXRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBTb3VyY2VXcml0ZXIgY3JlYXRlRW51bVNvdXJjZVdyaXRlcihFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgZW51bU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBFbnVtQW5ub3RhdGVkU291cmNlV3JpdGVyKGFubm90YXRpb25Xcml0ZXIsIGVudW1OYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNvdXJjZVdyaXRlciBjcmVhdGVFbnVtU291cmNlV3JpdGVyKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudW1OYW1lKSB7Ci0JCXJldHVybiBuZXcgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcihhbm5vdGF0aW9uV3JpdGVyLCBwYWNrYWdlTmFtZSwgZW51bU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBbm5vdGF0ZWRFbnVtQW5kTWVtYmVycyhTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKFBBQ0tBR0VfTkFNRSkuYXBwZW5kKCI7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtOyIpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIkBYbWxFbnVtIik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgicHVibGljIGVudW0gIikuYXBwZW5kKGVudW1OYW1lKS5hcHBlbmQoIiB7ICIpLmFwcGVuZChlbnVtQm9keSkuYXBwZW5kKCIgfSIpOwotCQkKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgZW51bU5hbWUgKyAiLmphdmEiLCBzYi50b1N0cmluZygpKTsKLQl9Ci0JCi0JLyoqCi0JICogd3JpdGVzIHNvdXJjZSBmb3IgcGFja2FnZS1pbmZvIGphdmEgZmlsZXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTb3VyY2VUbygKLQkJCVN0cmluZ0J1aWxkZXIgc2IsIEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCQotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoInBhY2thZ2UgIikuYXBwZW5kKHBhY2thZ2VOYW1lKS5hcHBlbmQoIjsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gYW5ub3RhdGlvbldyaXRlci5pbXBvcnRzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKHN0cmVhbS5uZXh0KCkpLmFwcGVuZCgiOyIpLmFwcGVuZChDUik7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogd3JpdGVzIHNvdXJjZSBmb3IgdHlwaWNhbCBqYXZhIGZpbGVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXBwZW5kU291cmNlVG8oCi0JCQlTdHJpbmdCdWlsZGVyIHNiLCBBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIAotCQkJU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJCi0JCXNiLmFwcGVuZCgicGFja2FnZSAiKS5hcHBlbmQocGFja2FnZU5hbWUpLmFwcGVuZCgiOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBhbm5vdGF0aW9uV3JpdGVyLmltcG9ydHMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCXNiLmFwcGVuZChzdHJlYW0ubmV4dCgpKTsKLQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJc2IuYXBwZW5kKENSKTsKLQkJfQotCQlzYi5hcHBlbmQoQ1IpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQodHlwZU5hbWUpLmFwcGVuZCgiICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oc2IpOwotCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRTZXRJZE1ldGhvZEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldElkKGludCBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEdldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLm5hbWU7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRUZXN0RmllbGQoU3RyaW5nIHRlc3RGaWVsZCkgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLnRlc3RGaWVsZCA9IHRlc3RGaWVsZDsiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJYW5ub3RhdGlvbldyaXRlci5hcHBlbmRNZW1iZXJUeXBlVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwkJCi0JCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kVG9wTGV2ZWxUeXBlc1RvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQl9Ci0KLQkKLQkvKioKLQkgKiB3cml0ZXMgc291cmNlIGZvciB0eXBpY2FsIGphdmEgZW51bSBmaWxlcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZEVudW1Tb3VyY2VUbygKLQkJCVN0cmluZ0J1aWxkZXIgc2IsIEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIAotCQkJU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUpIHsKLQkJCi0JCXNiLmFwcGVuZCgicGFja2FnZSAiKS5hcHBlbmQocGFja2FnZU5hbWUpLmFwcGVuZCgiOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBhbm5vdGF0aW9uV3JpdGVyLmltcG9ydHMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCXNiLmFwcGVuZChzdHJlYW0ubmV4dCgpKTsKLQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJc2IuYXBwZW5kKENSKTsKLQkJfQotCQlzYi5hcHBlbmQoQ1IpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZEVudW1Bbm5vdGF0aW9uVG8oc2IpOwotCQlzYi5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoInB1YmxpYyBlbnVtICIpLmFwcGVuZChlbnVtTmFtZSkuYXBwZW5kKCIgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgICIpOwotCQlhbm5vdGF0aW9uV3JpdGVyLmFwcGVuZFN1bmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhzYik7Ci0JCXNiLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIFNVTkRBWSwgIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCWFubm90YXRpb25Xcml0ZXIuYXBwZW5kTW9uZGF5RW51bUNvbnN0YW50QW5ub3RhdGlvblRvKHNiKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgTU9OREFZIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKENSKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUVHlwZSB0ZXN0VHlwZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHlwZShUWVBFX05BTUUsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUVHlwZSBidWlsZFR5cGUoU3RyaW5nIG5hbWUsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUeXBlKG5hbWUsIDEsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRUVHlwZSBidWlsZFR5cGUoU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHlwZShudWxsLCBuYW1lLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVFR5cGUgYnVpbGRUeXBlKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBuZXcgSkRUVHlwZShkZWNsYXJpbmdUeXBlLCBuYW1lLCBvY2N1cnJlbmNlLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVEZpZWxkQXR0cmlidXRlIGlkRmllbGQoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpZWxkKCJpZCIsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgbmFtZUZpZWxkKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWVsZCgibmFtZSIsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgYnVpbGRGaWVsZChTdHJpbmcgbmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZEZpZWxkKG5hbWUsIDEsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSkRURmllbGRBdHRyaWJ1dGUgYnVpbGRGaWVsZChTdHJpbmcgbmFtZSwgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWVsZCh0aGlzLnRlc3RUeXBlKGN1KSwgbmFtZSwgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRGaWVsZEF0dHJpYnV0ZSBidWlsZEZpZWxkKFR5cGUgZGVjbGFyaW5nVHlwZSwgU3RyaW5nIG5hbWUsIGludCBvY2N1cnJlbmNlLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBuZXcgSkRURmllbGRBdHRyaWJ1dGUoZGVjbGFyaW5nVHlwZSwgbmFtZSwgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgaWRHZXRNZXRob2QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZCgiZ2V0SWQiLCBjdSk7Ci0JfQotCQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgaWRTZXRNZXRob2QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZCgic2V0SWQiLCBuZXcgU3RyaW5nW10geyJpbnQifSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgbmFtZUdldE1ldGhvZChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKCJnZXROYW1lIiwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgYnVpbGRNZXRob2QoU3RyaW5nIG5hbWUsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNZXRob2QobmFtZSwgRU1QVFlfU1RSSU5HX0FSUkFZLCBjdSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpEVE1ldGhvZEF0dHJpYnV0ZSBidWlsZE1ldGhvZChTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWV0aG9kKG5hbWUsIHBhcmFtZXRlclR5cGVOYW1lcywgMSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgYnVpbGRNZXRob2QoU3RyaW5nIG5hbWUsIFN0cmluZ1tdIHBhcmFtZXRlclR5cGVOYW1lcywgaW50IG9jY3VycmVuY2UsIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIG5ldyBKRFRNZXRob2RBdHRyaWJ1dGUodGhpcy50ZXN0VHlwZShjdSksIG5hbWUsIHBhcmFtZXRlclR5cGVOYW1lcywgb2NjdXJyZW5jZSwgY3UpOwotCX0KLQotCXByb3RlY3RlZCBKRFRNZXRob2RBdHRyaWJ1dGUgYnVpbGRNZXRob2QoVHlwZSBkZWNsYXJpbmdUeXBlLCBTdHJpbmcgbmFtZSwgU3RyaW5nW10gcGFyYW1ldGVyVHlwZU5hbWVzLCBpbnQgb2NjdXJyZW5jZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gbmV3IEpEVE1ldGhvZEF0dHJpYnV0ZShkZWNsYXJpbmdUeXBlLCBuYW1lLCBwYXJhbWV0ZXJUeXBlTmFtZXMsIG9jY3VycmVuY2UsIGN1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNvdXJjZShJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGN1LmdldEJ1ZmZlcigpLmdldENvbnRlbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gQVNUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdCB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydFNvdXJjZUNvbnRhaW5zKFN0cmluZyBzLCBJQ29tcGlsYXRpb25Vbml0IGN1KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2V0U291cmNlKGN1KTsKLQkJYm9vbGVhbiBmb3VuZCA9IHNvdXJjZS5pbmRleE9mKHMpID4gLTE7Ci0JCWlmICggISBmb3VuZCkgewotCQkJU3RyaW5nIG1zZyA9ICJzb3VyY2UgZG9lcyBub3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgc3RyaW5nOiAiICsgcyArICIgKHNlZSBTeXN0ZW0gY29uc29sZSkiOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiogIiArIHRoaXMuZ2V0TmFtZSgpICsgIiAqKioqIik7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzb3VyY2UpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlmYWlsKG1zZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihTdHJpbmcgcywgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzb3VyY2UgPSB0aGlzLmdldFNvdXJjZShjdSk7Ci0JCWludCBwb3MgPSBzb3VyY2UuaW5kZXhPZihzKTsKLQkJaWYgKHBvcyAhPSAtMSkgewotCQkJU3RyaW5nIG1zZyA9ICJ1bmV4cGVjdGVkIHN0cmluZyBpbiBzb3VyY2UgKHBvc2l0aW9uOiAiICsgcG9zICsgIik6ICIgKyBzICsgIiAoc2VlIFN5c3RlbSBjb25zb2xlKSI7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiAiICsgdGhpcy5nZXROYW1lKCkgKyAiICoqKioiKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZSk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCWZhaWwobXNnKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYW5pcHVsYXRlIGFubm90YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgKmZpcnN0KiBtZW1iZXIgdmFsdWUgcGFpciBmb3IgdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uIGVsZW1lbnQKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgYW5ub3RhdGlvbiBoYXMgbm8gc3VjaCBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWZvciAoTWVtYmVyVmFsdWVQYWlyIHBhaXIgOiB0aGlzLnZhbHVlcyhhbm5vdGF0aW9uKSkgewotCQkJaWYgKHBhaXIuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQlyZXR1cm4gcGFpcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHVlcyhOb3JtYWxBbm5vdGF0aW9uIG5hKSB7Ci0JCXJldHVybiBuYS52YWx1ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50cyhFbnVtRGVjbGFyYXRpb24gZWQpIHsKLQkJcmV0dXJuIGVkLmVudW1Db25zdGFudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGVjayBmb3IgbnVsbCBtZW1iZXIgdmFsdWUgcGFpcgotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIHZhbHVlXyhNZW1iZXJWYWx1ZVBhaXIgcGFpcikgewotCQlyZXR1cm4gKHBhaXIgPT0gbnVsbCkgPyBudWxsIDogcGFpci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBhbm5vdGF0aW9uRWxlbWVudFZhbHVlKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlXyh0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgRXhwcmVzc2lvbiBhbm5vdGF0aW9uRWxlbWVudFZhbHVlKFNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZS5lcXVhbHMoInZhbHVlIikgPyBhbm5vdGF0aW9uLmdldFZhbHVlKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlICpmaXJzdCogYW5ub3RhdGlvbiBlbGVtZW50Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGFubm90YXRpb24gaGFzIG5vIHN1Y2ggZWxlbWVudC4KLQkgKiAoQW4gZWxlbWVudCBuYW1lIG9mICJ2YWx1ZSIgd2lsbCByZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlCi0JICogbWVtYmVyIGFubm90YXRpb24uKQotCSAqLwotCXByb3RlY3RlZCBFeHByZXNzaW9uIGFubm90YXRpb25FbGVtZW50VmFsdWUoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgQXJyYXlJbml0aWFsaXplciBuZXdBcnJheUluaXRpYWxpemVyKEFTVCBhc3QsIEV4cHJlc3Npb24uLi4gZXhwcmVzc2lvbnMpIHsKLQkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gYXN0Lm5ld0FycmF5SW5pdGlhbGl6ZXIoKTsKLQkJZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gOiBleHByZXNzaW9ucykgewotCQkJYXJyYXlJbml0aWFsaXplci5leHByZXNzaW9ucygpLmFkZChleHByZXNzaW9uKTsKLQkJfQotCQlyZXR1cm4gYXJyYXlJbml0aWFsaXplcjsKLQl9Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBudW1iZXIgbGl0ZXJhbCBhbmQgc2V0IGl0cyBpbml0aWFsIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbC4KLQkgKi8KLQlwcm90ZWN0ZWQgTnVtYmVyTGl0ZXJhbCBuZXdOdW1iZXJMaXRlcmFsKEFTVCBhc3QsIGludCB2YWx1ZSkgewotCQlyZXR1cm4gYXN0Lm5ld051bWJlckxpdGVyYWwoSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgbnVtYmVyIGxpdGVyYWwgYW5kIHNldCBpdHMgaW5pdGlhbCB2YWx1ZSB0byB0aGUgc3BlY2lmaWVkIGxpdGVyYWwuCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW5MaXRlcmFsIG5ld0Jvb2xlYW5MaXRlcmFsKEFTVCBhc3QsIGJvb2xlYW4gdmFsdWUpIHsKLQkJcmV0dXJuIGFzdC5uZXdCb29sZWFuTGl0ZXJhbCh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBzdHJpbmcgbGl0ZXJhbCBhbmQgc2V0IGl0cyBpbml0aWFsIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdMaXRlcmFsIG5ld1N0cmluZ0xpdGVyYWwoQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFzdC5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKHZhbHVlKTsKLQkJcmV0dXJuIHN0cmluZ0xpdGVyYWw7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGVMaXRlcmFsIG5ld1R5cGVMaXRlcmFsKEFTVCBhc3QsIFN0cmluZyB0eXBlTmFtZSkgewotCQlUeXBlTGl0ZXJhbCB0eXBlTGl0ZXJhbCA9IGFzdC5uZXdUeXBlTGl0ZXJhbCgpOwotCQl0eXBlTGl0ZXJhbC5zZXRUeXBlKHRoaXMubmV3U2ltcGxlVHlwZShhc3QsIHR5cGVOYW1lKSk7Ci0JCXJldHVybiB0eXBlTGl0ZXJhbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2ltcGxlVHlwZSBuZXdTaW1wbGVUeXBlKEFTVCBhc3QsIFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5uZXdTaW1wbGVUeXBlKGFzdCwgYXN0Lm5ld05hbWUodHlwZU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2ltcGxlVHlwZSBuZXdTaW1wbGVUeXBlKEFTVCBhc3QsIE5hbWUgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIGFzdC5uZXdTaW1wbGVUeXBlKHR5cGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTaW1wbGVOYW1lIG5hbWUsIEV4cHJlc3Npb24gdmFsdWUpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSBhc3QubmV3TWVtYmVyVmFsdWVQYWlyKCk7Ci0JCXBhaXIuc2V0TmFtZShuYW1lKTsKLQkJcGFpci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiBwYWlyOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhc3QsIGFzdC5uZXdTaW1wbGVOYW1lKG5hbWUpLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1lbWJlclZhbHVlUGFpciBuZXdNZW1iZXJWYWx1ZVBhaXIoQVNUIGFzdCwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCB0aGlzLm5ld1N0cmluZ0xpdGVyYWwoYXN0LCB2YWx1ZSkpOwotCX0KLQotCXByb3RlY3RlZCBNZW1iZXJWYWx1ZVBhaXIgbmV3TWVtYmVyVmFsdWVQYWlyKEFTVCBhc3QsIFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFzdCwgbmFtZSwgdGhpcy5uZXdOdW1iZXJMaXRlcmFsKGFzdCwgdmFsdWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVtYmVyVmFsdWVQYWlyIG5ld01lbWJlclZhbHVlUGFpcihBU1QgYXN0LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB2YWx1ZSkgewotCQlyZXR1cm4gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYXN0LCBuYW1lLCB0aGlzLm5ld0Jvb2xlYW5MaXRlcmFsKGFzdCwgdmFsdWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW51bUNvbnN0YW50RGVjbGFyYXRpb24gbmV3RW51bUNvbnN0YW50RGVjbGFyYXRpb24oQVNUIGFzdCwgU3RyaW5nIGVudW1Db25zdGFudE5hbWUpIHsKLQkJRW51bUNvbnN0YW50RGVjbGFyYXRpb24gZW51bUNvbnN0YW50RGVjbGFyYXRpb24gPSBhc3QubmV3RW51bUNvbnN0YW50RGVjbGFyYXRpb24oKTsKLQkJZW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0TmFtZShhc3QubmV3U2ltcGxlTmFtZShlbnVtQ29uc3RhbnROYW1lKSk7Ci0JCXJldHVybiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLQl9Ci0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlIHNwZWNpZmllZCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyIHBhaXIpIHsKLQkJdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikuYWRkKHBhaXIpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBtZW1iZXIgdmFsdWUgcGFpciB0byB0aGUgc3BlY2lmaWVkIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSwgaW50IHZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCBuYW1lLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksIG5hbWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHZhbHVlIHBhaXIgdG8gdGhlIG1hcmtlciBhbm5vdGF0aW9uCi0JICogYnkgZmlyc3QgcmVwbGFjaW5nIGl0IHdpdGggYSBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGRNZW1iZXJWYWx1ZVBhaXIoTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IHRoaXMucmVwbGFjZU1hcmtlckFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKG5vcm1hbEFubm90YXRpb24sIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksIG5hbWUsIHZhbHVlKSk7Ci0JCXJldHVybiBub3JtYWxBbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIGFkZE1lbWJlclZhbHVlUGFpcihNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IHRoaXMucmVwbGFjZU1hcmtlckFubm90YXRpb24oYW5ub3RhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKG5vcm1hbEFubm90YXRpb24sIHRoaXMubmV3TWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24uZ2V0QVNUKCksIG5hbWUsIHZhbHVlKSk7Ci0JCXJldHVybiBub3JtYWxBbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIG1lbWJlciB2YWx1ZSBwYWlyIHRvIHRoZSBtYXJrZXIgYW5ub3RhdGlvbgotCSAqIGJ5IGZpcnN0IHJlcGxhY2luZyBpdCB3aXRoIGEgbm9ybWFsIGFubm90YXRpb24uCi0JICogUmV0dXJuIHRoZSByZXN1bHRpbmcgbm9ybWFsIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gYWRkTWVtYmVyVmFsdWVQYWlyKE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbiwgTWVtYmVyVmFsdWVQYWlyIHBhaXIpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBub3JtYWxBbm5vdGF0aW9uID0gdGhpcy5yZXBsYWNlTWFya2VyQW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKLQkJcmV0dXJuIHRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKG5vcm1hbEFubm90YXRpb24sIHBhaXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJc2V0TWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBhbm5vdGF0aW9uTmFtZSwgInZhbHVlIiwgdmFsdWUpOwotCX0KLQkJCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKGFubm90YXRpb25OYW1lKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJYW5ub3RhdGlvbiA9IGFkZE5vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgYW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQlhbm5vdGF0aW9uID0gcmVwbGFjZU1hcmtlckFubm90YXRpb24oKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pOwotCQl9Ci0JCXNldE1lbWJlclZhbHVlUGFpcigoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJaWYgKG1lbWJlclZhbHVlUGFpciA9PSBudWxsKSB7Ci0JCQlhZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQkJfQotCQllbHNlIHsKLQkJCW1lbWJlclZhbHVlUGFpci5zZXRWYWx1ZShuZXdTdHJpbmdMaXRlcmFsKGFubm90YXRpb24uZ2V0QVNUKCksIHZhbHVlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZW1vdmVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIGFubm90YXRpb25OYW1lLCAidmFsdWUiKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoYW5ub3RhdGlvbk5hbWUpOwotCQl2YWx1ZXMoYW5ub3RhdGlvbikucmVtb3ZlKG1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRFbnVtTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGVudW1WYWx1ZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKGFubm90YXRpb25OYW1lKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJYW5ub3RhdGlvbiA9IGFkZE5vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgYW5ub3RhdGlvbk5hbWUpOwotCQl9Ci0JCXRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAidmFsdWUiLCBlbnVtVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVudW1NZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBlbnVtVmFsdWUpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIG1lbWJlclZhbHVlUGFpciA9IHRoaXMubWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIGVsZW1lbnROYW1lKTsKLQkJaWYgKG1lbWJlclZhbHVlUGFpciA9PSBudWxsKSB7Ci0JCQl0aGlzLmFkZEVudW1NZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUsIGVudW1WYWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQltZW1iZXJWYWx1ZVBhaXIuc2V0VmFsdWUoYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOYW1lKGVudW1WYWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW51bU1lbWJlclZhbHVlUGFpcihNYXJrZXJBbm5vdGF0aW9uIG1hcmtlckFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkRW51bU1lbWJlclZhbHVlUGFpcih0aGlzLnJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKG1hcmtlckFubm90YXRpb24pLCBlbGVtZW50TmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVudW1NZW1iZXJWYWx1ZVBhaXIoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSwgYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOYW1lKHZhbHVlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWVtYmVyVmFsdWVQYWlyKE5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uIHZhbHVlKSB7Ci0JCU1lbWJlclZhbHVlUGFpciBtZW1iZXJWYWx1ZVBhaXIgPSB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCBlbGVtZW50TmFtZSwgdmFsdWUpOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBtZW1iZXJWYWx1ZVBhaXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1lbWJlclZhbHVlUGFpcihNYXJrZXJBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbiB2YWx1ZSkgewotCQlNZW1iZXJWYWx1ZVBhaXIgbWVtYmVyVmFsdWVQYWlyID0gdGhpcy5uZXdNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbi5nZXRBU1QoKSwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgbWVtYmVyVmFsdWVQYWlyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW51bUNvbnN0YW50KEVudW1EZWNsYXJhdGlvbiBlbnVtRGVjbGFyYXRpb24sIFN0cmluZyBlbnVtQ29uc3RhbnROYW1lKSB7Ci0JCUVudW1Db25zdGFudERlY2xhcmF0aW9uIGVudW1Db25zdGFudERlY2xhcmF0aW9uID0gdGhpcy5uZXdFbnVtQ29uc3RhbnREZWNsYXJhdGlvbihlbnVtRGVjbGFyYXRpb24uZ2V0QVNUKCksIGVudW1Db25zdGFudE5hbWUpOwotCQl0aGlzLmVudW1Db25zdGFudHMoZW51bURlY2xhcmF0aW9uKS5hZGQoZW51bUNvbnN0YW50RGVjbGFyYXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFbnVtQ29uc3RhbnQoRW51bURlY2xhcmF0aW9uIGVudW1EZWNsYXJhdGlvbiwgU3RyaW5nIGVudW1Db25zdGFudE5hbWUpIHsKLQkJTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50c0xpc3QgPSB0aGlzLmVudW1Db25zdGFudHMoZW51bURlY2xhcmF0aW9uKTsKLQkJZm9yIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBjb25zdGFudCA6IGVudW1Db25zdGFudHNMaXN0KSB7Ci0JCQlpZiAoY29uc3RhbnQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhlbnVtQ29uc3RhbnROYW1lKSkgewotCQkJCWVudW1Db25zdGFudHNMaXN0LnJlbW92ZShjb25zdGFudCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2hhbmdlRW51bUNvbnN0YW50TmFtZShFbnVtRGVjbGFyYXRpb24gZW51bURlY2xhcmF0aW9uLCBTdHJpbmcgb2xkRW51bUNvbnN0YW50TmFtZSwgU3RyaW5nIG5ld0VudW1Db25zdGFudE5hbWUpIHsKLQkJTGlzdDxFbnVtQ29uc3RhbnREZWNsYXJhdGlvbj4gZW51bUNvbnN0YW50c0xpc3QgPSB0aGlzLmVudW1Db25zdGFudHMoZW51bURlY2xhcmF0aW9uKTsKLQkJZm9yIChFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBjb25zdGFudCA6IGVudW1Db25zdGFudHNMaXN0KSB7Ci0JCQlpZiAoY29uc3RhbnQuZ2V0TmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhvbGRFbnVtQ29uc3RhbnROYW1lKSkgewotCQkJCXRoaXMuY2hhbmdlRW51bUNvbnN0YW50TmFtZShjb25zdGFudCwgbmV3RW51bUNvbnN0YW50TmFtZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2hhbmdlRW51bUNvbnN0YW50TmFtZShFbnVtQ29uc3RhbnREZWNsYXJhdGlvbiBlbnVtQ29uc3RhbnREZWNsYXJhdGlvbiwgU3RyaW5nIG5ld0VudW1Db25zdGFudE5hbWUpIHsKLQkJZW51bUNvbnN0YW50RGVjbGFyYXRpb24uc2V0TmFtZShlbnVtQ29uc3RhbnREZWNsYXJhdGlvbi5nZXRBU1QoKS5uZXdTaW1wbGVOYW1lKG5ld0VudW1Db25zdGFudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGFycmF5IGVsZW1lbnQgdG8gYW4gYW5ub3RhdGlvbiB0aGF0IGlzIGVpdGhlciBhIG5vcm1hbCBhbm5vdGF0aW9uIG9yIGEgbWFya2VyIGFubm90YXRpb24uCi0JICogSWYgaXQgaXMgYSBtYXJrZXIgYW5ub3RhdGlvbiBmaXJzdCBtYWtlIGl0IGEgbm9ybWFsIGFubm90YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXJyYXlFbGVtZW50KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb24gYXJyYXlFbGVtZW50KSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChhbm5vdGF0aW9uTmFtZSk7Ci0JCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbjsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJbm9ybWFsQW5ub3RhdGlvbiA9IHRoaXMuYWRkTm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBhbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuTUFSS0VSX0FOTk9UQVRJT04pIHsKLQkJCW5vcm1hbEFubm90YXRpb24gPSB0aGlzLnJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLQkJfQotCQl0aGlzLmFkZEFycmF5RWxlbWVudChub3JtYWxBbm5vdGF0aW9uLCBpbmRleCwgZWxlbWVudE5hbWUsIGFycmF5RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBhcnJheSBlbGVtZW50IHRvIHRoZSBnaXZlbiBub3JtYWwgYW5ub3RhdGlvbidzIGVsZW1lbnQgbmFtZWQgZWxlbWVudE5hbWUuCi0JICogQWRkIGEgbmV3IG1lbWJlciB2YWx1ZSBwYWlyIGlmIG9uZSBkb2VzIG5vdCBleGlzdC4KLQkgKiBJZiB0aGUgbWVtYmVyIHZhbHVlIHBhaXIgZXhpc3RzIGJ1dCB0aGUgdmFsdWUgaXMgbm90IHlldCBhbiBhcnJheSwgbWFrZSBpdCBhbiBhcnJheS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBcnJheUVsZW1lbnQoTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbiBhcnJheUVsZW1lbnQpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSk7Ci0JCWlmIChwYWlyID09IG51bGwpIHsKLQkJCXBhaXIgPSB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCBlbGVtZW50TmFtZSwgYXJyYXlFbGVtZW50KTsKLQkJCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIHBhaXIpOwotCQl9Ci0JCWVsc2UgewotCQkJRXhwcmVzc2lvbiB2YWx1ZSA9IHBhaXIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZS5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIpIHsKLQkJCQl0aGlzLmV4cHJlc3Npb25zKChBcnJheUluaXRpYWxpemVyKSB2YWx1ZSkuYWRkKGluZGV4LCBhcnJheUVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQXJyYXlJbml0aWFsaXplciBhcnJheUluaXRpYWxpemVyID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdBcnJheUluaXRpYWxpemVyKCk7Ci0JCQkJcGFpci5zZXRWYWx1ZShhcnJheUluaXRpYWxpemVyKTsKLQkJCQl0aGlzLmV4cHJlc3Npb25zKGFycmF5SW5pdGlhbGl6ZXIpLmFkZCh2YWx1ZSk7Ci0JCQkJdGhpcy5leHByZXNzaW9ucyhhcnJheUluaXRpYWxpemVyKS5hZGQoaW5kZXgsIGFycmF5RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFzc3VtZXMgYW4gZWxlbWVudCB3aXRoIG5hbWUgZWxlbWVudE5hbWUgZXhpc3RzIHdpdGggYW4gYXJyYXkgYXMgaXRzIHZhbHVlLgotCSAqIE1vdmUgdGhlIGFycmF5IGVsZW1lbnQgYXQgc291cmNlSW5kZXggdG8gdGhlIHRhcmdldEluZGV4Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUFycmF5RWxlbWVudChOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJTWVtYmVyVmFsdWVQYWlyIHBhaXIgPSB0aGlzLm1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBlbGVtZW50TmFtZSk7Ci0JCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXkgPSAoQXJyYXlJbml0aWFsaXplcikgcGFpci5nZXRWYWx1ZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmV4cHJlc3Npb25zKGFycmF5KSwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGFzc3VtZXMgYW4gZWxlbWVudCB3aXRoIG5hbWUgZWxlbWVudE5hbWUgZXhpc3RzIHdpdGggcG90ZW50aWFsbHkgYW4gYXJyYXkgYXMgaXRzIHZhbHVlLgotCSAqIElmIHRoZSB2YWx1ZSBpcyBub3QgYW4gYXJyYXksIHRoZW4gdGhlIG1lbWJlciB2YWx1ZSBwYWlyIGlzIHJlbW92ZWQuCi0JICogSWYgdGhlIGFycmF5IGVsZW1lbnQgaXMgcmVtb3ZlZCBhbmQgdGhlcmUgaXMgb25seSAxIGFycmF5IGVsZW1lbnQgbGVmdCwgdGhlIGFycmF5IGl0c2VsZiBpcyByZW1vdmVkCi0JICogYW5kIHRoZSByZW1haW5pbmcgZWxlbWVudCBpcyBzZXQgYXMgdGhlIHZhbHVlIG9mIHRoZSBtZW1iZXIgdmFsdWUgcGFpcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFycmF5RWxlbWVudChOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgaW50IGluZGV4KSB7Ci0JCU1lbWJlclZhbHVlUGFpciBwYWlyID0gdGhpcy5tZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgZWxlbWVudE5hbWUpOwotCQlpZiAocGFpci5nZXRWYWx1ZSgpLmdldE5vZGVUeXBlKCkgPT0gQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUikgewotCQkJQXJyYXlJbml0aWFsaXplciBhcnJheSA9IChBcnJheUluaXRpYWxpemVyKSBwYWlyLmdldFZhbHVlKCk7Ci0JCQl0aGlzLmV4cHJlc3Npb25zKGFycmF5KS5yZW1vdmUoaW5kZXgpOwotCQkJaWYgKHRoaXMuZXhwcmVzc2lvbnMoYXJyYXkpLnNpemUoKSA9PSAxKSB7Ci0JCQkJcGFpci5zZXRWYWx1ZSh0aGlzLmV4cHJlc3Npb25zKGFycmF5KS5yZW1vdmUoMCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikucmVtb3ZlKHBhaXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSB0aGUgZ2l2ZW4gbWFya2VyIGFubm90YXRpb24gd2l0aCBhIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiB0aGUgcmVzdWx0aW5nIG5vcm1hbCBhbm5vdGF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIHJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKE1hcmtlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBhbm5vdGF0aW9ucyA9IHRoaXMuYW5ub3RhdGlvbnMoYW5ub3RhdGlvbi5nZXRQYXJlbnQoKSk7Ci0JCWludCBpbmRleCA9IGFubm90YXRpb25zLmluZGV4T2YoYW5ub3RhdGlvbik7Ci0JCU5vcm1hbEFubm90YXRpb24gbm9ybWFsQW5ub3RhdGlvbiA9IG5ld05vcm1hbEFubm90YXRpb24oYW5ub3RhdGlvbi5nZXRBU1QoKSwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYW5ub3RhdGlvbnMuc2V0KGluZGV4LCBub3JtYWxBbm5vdGF0aW9uKTsKLQkJcmV0dXJuIG5vcm1hbEFubm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBub3JtYWwgYW5ub3RhdGlvbiBhbmQgc2V0IGl0cyBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld05vcm1hbEFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhc3QubmV3TmFtZShuYW1lKSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9ybWFsIGFubm90YXRpb24gdG8gdGhlIGdpdmVuIEFTVCBub2RlLiAKLQkgKiBUaGlzIHNob3VsZCBiZSBhIFBhY2thZ2VEZWNsYXJhdGlvbiBvciBhIEJvZHlEZWNsYXJhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBhZGROb3JtYWxBbm5vdGF0aW9uKEFTVE5vZGUgYXN0Tm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGFzdE5vZGUuZ2V0QVNUKCksIG5hbWUpOwotCQl0aGlzLmFkZEFubm90YXRpb24oYXN0Tm9kZSwgYW5ub3RhdGlvbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgYW5ub3RhdGlvbiB0byB0aGUgZ2l2ZW4gQVNUIG5vZGUuIAotCSAqIFRoaXMgc2hvdWxkIGJlIGEgUGFja2FnZURlY2xhcmF0aW9uIG9yIGEgQm9keURlY2xhcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb24oQVNUTm9kZSBhc3ROb2RlLCBBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJdGhpcy5hbm5vdGF0aW9ucyhhc3ROb2RlKS5hZGQoYW5ub3RhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBtYXJrZXIgYW5ub3RhdGlvbiBhbmQgc2V0IGl0cyBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBNYXJrZXJBbm5vdGF0aW9uIG5ld01hcmtlckFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXN0Lm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJYW5ub3RhdGlvbi5zZXRUeXBlTmFtZShhc3QubmV3TmFtZShuYW1lKSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgbm9ybWFsIGFubm90YXRpb24gdG8gdGhlIGdpdmVuIEFTVCBub2RlLiAKLQkgKiBUaGlzIHNob3VsZCBiZSBhIFBhY2thZ2VEZWNsYXJhdGlvbiBvciBhIEJvZHlEZWNsYXJhdGlvbi4KLQkgKiBSZXR1cm4gdGhlIHJlc3VsdGluZyBub3JtYWwgYW5ub3RhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFya2VyQW5ub3RhdGlvbiBhZGRNYXJrZXJBbm5vdGF0aW9uKEFTVE5vZGUgYXN0Tm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJTWFya2VyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5uZXdNYXJrZXJBbm5vdGF0aW9uKGFzdE5vZGUuZ2V0QVNUKCksIG5hbWUpOwotCQl0aGlzLmFkZEFubm90YXRpb24oYXN0Tm9kZSwgYW5ub3RhdGlvbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgYW5ub3RhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYW5ub3RhdGlvbiBmcm9tIHRoZSBBU1Qgbm9kZS4KLQkgKiBUaGlzIHNob3VsZCBiZSBhIFBhY2thZ2VEZWNsYXJhdGlvbiBvciBhIEJvZHlEZWNsYXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKEFTVE5vZGUgYXN0Tm9kZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXRoaXMuYW5ub3RhdGlvbnMoYXN0Tm9kZSkucmVtb3ZlKGFubm90YXRpb24pOwotCX0KLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PElFeHRlbmRlZE1vZGlmaWVyPiBhbm5vdGF0aW9ucyhBU1ROb2RlIGFzdE5vZGUpIHsKLQkJaWYgKGFzdE5vZGUgaW5zdGFuY2VvZiBCb2R5RGVjbGFyYXRpb24pIHsKLQkJCXJldHVybiAoKEJvZHlEZWNsYXJhdGlvbikgYXN0Tm9kZSkubW9kaWZpZXJzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoYXN0Tm9kZSBpbnN0YW5jZW9mIFBhY2thZ2VEZWNsYXJhdGlvbikgewotCQkJcmV0dXJuICgoUGFja2FnZURlY2xhcmF0aW9uKSBhc3ROb2RlKS5hbm5vdGF0aW9ucygpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxFeHByZXNzaW9uPiBleHByZXNzaW9ucyhBcnJheUluaXRpYWxpemVyIGFycmF5SW5pdGlhbGl6ZXIpIHsKLQkJcmV0dXJuIGFycmF5SW5pdGlhbGl6ZXIuZXhwcmVzc2lvbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIGludGVyZmFjZSBBbm5vdGF0aW9uV3JpdGVyIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCk7Ci0JCXZvaWQgYXBwZW5kUGFja2FnZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JCXZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRTZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZE1lbWJlclR5cGVUbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRUb3BMZXZlbFR5cGVzVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlciBpbXBsZW1lbnRzIEFubm90YXRpb25Xcml0ZXIgewotCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkge3JldHVybiBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRQYWNrYWdlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRTZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCQlwdWJsaWMgdm9pZCBhcHBlbmRUb3BMZXZlbFR5cGVzVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uV3JpdGVyV3JhcHBlciBpbXBsZW1lbnRzIEFubm90YXRpb25Xcml0ZXIgewotCQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25Xcml0ZXIgYXc7Ci0JCXB1YmxpYyBBbm5vdGF0aW9uV3JpdGVyV3JhcHBlcihBbm5vdGF0aW9uV3JpdGVyIGF3KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5hdyA9IGF3OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7cmV0dXJuIHRoaXMuYXcuaW1wb3J0cygpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kUGFja2FnZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7dGhpcy5hdy5hcHBlbmRQYWNrYWdlQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kVHlwZUFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHt0aGlzLmF3LmFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7dGhpcy5hdy5hcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7dGhpcy5hdy5hcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kU2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oc2IpO30KLQkJcHVibGljIHZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7dGhpcy5hdy5hcHBlbmRHZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFNldE5hbWVNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kU2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhzYik7fQotCQlwdWJsaWMgdm9pZCBhcHBlbmRNZW1iZXJUeXBlVG8oU3RyaW5nQnVpbGRlciBzYikge3RoaXMuYXcuYXBwZW5kTWVtYmVyVHlwZVRvKHNiKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFRvcExldmVsVHlwZXNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7dGhpcy5hdy5hcHBlbmRUb3BMZXZlbFR5cGVzVG8oc2IpO30KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQW5ub3RhdGVkU291cmNlV3JpdGVyCi0JCQlpbXBsZW1lbnRzIFNvdXJjZVdyaXRlciB7Ci0JCQotCQlwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlcjsKLQkJcHJpdmF0ZSBTdHJpbmcgcGFja2FnZU5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIHR5cGVOYW1lOwotCQkKLQkJcHVibGljIEFubm90YXRlZFNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHsKLQkJCXRoaXMoYW5ub3RhdGlvbldyaXRlciwgVFlQRV9OQU1FKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRlZFNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyB0eXBlTmFtZSkgewotCQkJdGhpcyhhbm5vdGF0aW9uV3JpdGVyLCBQQUNLQUdFX05BTUUsIHR5cGVOYW1lKTsKLQkJfQotCQkKLQkJcHVibGljIEFubm90YXRlZFNvdXJjZVdyaXRlcihBbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5hbm5vdGF0aW9uV3JpdGVyID0gYW5ub3RhdGlvbldyaXRlcjsKLQkJCXRoaXMucGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLQkJCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJaWYgKHRoaXMudHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCUFubm90YXRpb25UZXN0Q2FzZS50aGlzLmFwcGVuZFNvdXJjZVRvKHNiLCB0aGlzLmFubm90YXRpb25Xcml0ZXIsIHRoaXMucGFja2FnZU5hbWUsIHRoaXMudHlwZU5hbWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJQW5ub3RhdGlvblRlc3RDYXNlLnRoaXMuYXBwZW5kU291cmNlVG8oc2IsIHRoaXMuYW5ub3RhdGlvbldyaXRlciwgdGhpcy5wYWNrYWdlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIEVudW1Bbm5vdGF0aW9uV3JpdGVyIHsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCk7Ci0JCXZvaWQgYXBwZW5kUGFja2FnZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRFbnVtQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpOwotCQl2b2lkIGFwcGVuZFN1bmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKTsKLQkJdm9pZCBhcHBlbmRNb25kYXlFbnVtQ29uc3RhbnRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0RW51bUFubm90YXRpb25Xcml0ZXIgaW1wbGVtZW50cyBFbnVtQW5ub3RhdGlvbldyaXRlciB7Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7cmV0dXJuIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTt9Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFBhY2thZ2VBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZEVudW1Bbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgey8qIGRvIG5vdGhpbmcgKi99Ci0JCXB1YmxpYyB2b2lkIGFwcGVuZFN1bmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7LyogZG8gbm90aGluZyAqL30KLQkJcHVibGljIHZvaWQgYXBwZW5kTW9uZGF5RW51bUNvbnN0YW50QW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsvKiBkbyBub3RoaW5nICovfQotCX0KLQotCXB1YmxpYyBjbGFzcyBFbnVtQW5ub3RhdGVkU291cmNlV3JpdGVyCi0JCQlpbXBsZW1lbnRzIFNvdXJjZVdyaXRlciB7Ci0JCQotCQlwcml2YXRlIEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXI7Ci0JCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VOYW1lOwotCQlwcml2YXRlIFN0cmluZyBlbnVtTmFtZTsKLQkJCi0JCXB1YmxpYyBFbnVtQW5ub3RhdGVkU291cmNlV3JpdGVyKEVudW1Bbm5vdGF0aW9uV3JpdGVyIGFubm90YXRpb25Xcml0ZXIpIHsKLQkJCXRoaXMoYW5ub3RhdGlvbldyaXRlciwgVFlQRV9OQU1FKTsKLQkJfQotCQkKLQkJcHVibGljIEVudW1Bbm5vdGF0ZWRTb3VyY2VXcml0ZXIoRW51bUFubm90YXRpb25Xcml0ZXIgYW5ub3RhdGlvbldyaXRlciwgU3RyaW5nIGVudW1OYW1lKSB7Ci0JCQl0aGlzKGFubm90YXRpb25Xcml0ZXIsIFBBQ0tBR0VfTkFNRSwgZW51bU5hbWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgRW51bUFubm90YXRlZFNvdXJjZVdyaXRlcihFbnVtQW5ub3RhdGlvbldyaXRlciBhbm5vdGF0aW9uV3JpdGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnVtTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYW5ub3RhdGlvbldyaXRlciA9IGFubm90YXRpb25Xcml0ZXI7Ci0JCQl0aGlzLnBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0JCQl0aGlzLmVudW1OYW1lID0gZW51bU5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCUFubm90YXRpb25UZXN0Q2FzZS50aGlzLmFwcGVuZEVudW1Tb3VyY2VUbyhzYiwgdGhpcy5hbm5vdGF0aW9uV3JpdGVyLCB0aGlzLnBhY2thZ2VOYW1lLCB0aGlzLmVudW1OYW1lKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0NvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGY5MmZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TdHJpbmdMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMCk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuSm9pbkNvbHVtbiIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc05vcm1hbEFubm90YXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSURcIikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Kb2luQ29sdW1uIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Kb2luQ29sdW1uIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKLQkJU3RyaW5nIHZhbHVlID0gKChTdHJpbmdMaXRlcmFsKSB0aGlzLnZhbHVlcygoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0KDApLmdldFZhbHVlKCkpLmdldExpdGVyYWxWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfSUQyIiwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Kb2luQ29sdW1uIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTm9ybWFsQW5ub3RhdGlvbigpKTsKLQkJU3RyaW5nIHZhbHVlID0gKChTdHJpbmdMaXRlcmFsKSB0aGlzLnZhbHVlcygoKE5vcm1hbEFubm90YXRpb24pIGFubm90YXRpb24pKS5nZXQoMCkuZ2V0VmFsdWUoKSkuZ2V0TGl0ZXJhbFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19JRDIiLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRFwiKSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJBRERSRVNTX0lEIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkFERFJFU1NfSUQyIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQUREUkVTU19JRDIiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJTdHJpbmcgY29tbWVudCgpOyBKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbW1lbnQ9XCJ0ZXN0XCIsY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbW1lbnQ9XCJ0ZXN0XCIsY29sdW1ucz1AYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKG51bGwpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKG51bGwpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIjsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe251bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1uIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJBRERSRVNTX0lEIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIG51bGx9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIjsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoe0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpfSkiOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBudWxsLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAzKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe251bGwsIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1uIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJBRERSRVNTX0lEMiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1uIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkpvaW5Db2x1bW4iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbiIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJKb2luQ29sdW1ucyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoY29sdW1ucyA9IHsgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4sIEBhbm5vdC5Kb2luQ29sdW1ufSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4sIEBhbm5vdC5Kb2luQ29sdW1uLCIgKyBDUiArICIgICAgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4oNzcpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiSm9pbkNvbHVtbiIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiSm9pbkNvbHVtbnMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIjc3IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz1AYW5ub3QuSm9pbkNvbHVtbig3NykpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9QEpvaW5Db2x1bW4pIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCI3NyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9QGFubm90LkpvaW5Db2x1bW4oNzcpKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbig3NyksQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4oNzcpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uKDc3KSwgQEpvaW5Db2x1bW4gfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbig3NyksQGFubm90LkpvaW5Db2x1bW4oODgpfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMSk7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4oNzcpLEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHRleHQoKTsgaW50IG51bSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4odGV4dD1cImJsYWhcIixudW09NDIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKGNvbHVtbnMgPSB7IEBKb2luQ29sdW1uKHRleHQgPSBcImJsYWhcIiwgbnVtID0gNDIpLCBASm9pbkNvbHVtbiB9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsgU3RyaW5nIHRleHQoKTsgaW50IG51bSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4odGV4dD1cImJcIixudW09NCkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJASm9pbkNvbHVtbnMoY29sdW1ucyA9IHsgQEpvaW5Db2x1bW4odGV4dCA9IFwiYlwiLCBudW0gPSA0KSwgbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1uIH0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyB0ZXh0KCk7IGludCBudW0oKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbih0ZXh0PVwiYmxhaFwiLG51bT00MikiKTsJCi0JCQotCQkvL1VzZSBvbGQgZm9ybWF0dGluZyBpZiBqZHQgY29yZSB2ZXJzaW9uIGlzIDMuNSBvciBiZWxvdyAtIHNlZSBidWcgMjg1NjA0Ci0JCVZlcnNpb24gdmVyc2lvbiA9IFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuamR0LmNvcmUiKS5nZXRWZXJzaW9uKCk7Ci0JCWludCBtYWpvclZlcnNpb24gPSB2ZXJzaW9uLmdldE1ham9yKCk7Ci0JCWludCBtaW5vclZlcnNpb24gPSB2ZXJzaW9uLmdldE1pbm9yKCk7Ci0JCS8vVGhpcyBjb25kaXRpb24gc2hvdWxkIGJlIHJlbW92ZWQgYW5kIHRlc3QgdXBkYXRlZCBhZnRlciBEYWxpIDMuMCBicmFuY2hlcyAKLQkJU3RyaW5nIGV4cGVjdGVkMTsKLQkJaWYgKG1ham9yVmVyc2lvbiA9PSAzICYmIG1pbm9yVmVyc2lvbiA8PSA1KSB7Ci0JCQlleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKCB7IjsKLQkJfQotCQllbHNlIGV4cGVjdGVkMSA9ICJASm9pbkNvbHVtbnMoeyI7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1uKHRleHQgPSBcImJsYWhcIiwgbnVtID0gNDIpLCBudWxsLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEpvaW5Db2x1bW4gIiArIENSICsgIiAgICB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQzLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAyKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBudWxsLCBudWxsLCI7ICAvLyB0aGUgbGluZSBnZXRzIHNwbGl0Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW59KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDQpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBhbm5vdC5Kb2luQ29sdW1ucyh7QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIG51bGwsIG51bGwsIjsgIC8vIHRoZSBsaW5lIGdldHMgc3BsaXQKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZDIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJ2YWx1ZSIsIDQpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbnMoY29sdW1ucyA9IHsgbnVsbCwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQUREUkVTU19JRDBcIikgfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDApOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtudWxsLEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAxKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjJhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoe251bGwsQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAidmFsdWUiLCAxKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDRcIil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEM1wiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lENFwiKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAyKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDMpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDMpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17QGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDFcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lENFwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIiksIG51bGwsIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lENFwiKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAzKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSBjb2x1bW5zKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuSm9pbkNvbHVtbnMoY29sdW1ucz17bnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpLCBAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDJcIil9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGV4cGVjdGVkKTsgIC8vIHRoZSBzb3VyY2Ugc2hvdWxkIGJlIHVuY2hhbmdlZAotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgImNvbHVtbnMiLCAwKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSAgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBjaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDMpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQxXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEwYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1uIiwgIlN0cmluZyBuYW1lKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW5zIiwgIkpvaW5Db2x1bW5bXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKHtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJASm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIikiOwotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBjaWRhYSA9IG5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCSJhbm5vdC5Kb2luQ29sdW1uIiwgImFubm90LkpvaW5Db2x1bW5zIiwgInZhbHVlIiwgMik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigxKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuSm9pbkNvbHVtbnMiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQwXCIpIik7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDEpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbiIsICJTdHJpbmcgbmFtZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJKb2luQ29sdW1ucyIsICJKb2luQ29sdW1uW10gY29sdW1ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkpvaW5Db2x1bW5zKGNvbHVtbnM9e0Bhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMFwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQyXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBKb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMlwiKSI7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGNpZGFhID0gbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJImFubm90LkpvaW5Db2x1bW4iLCAiYW5ub3QuSm9pbkNvbHVtbnMiLCAiY29sdW1ucyIsIDIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhICA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGNpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGFubm90LkpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkpvaW5Db2x1bW4iLCAiU3RyaW5nIG5hbWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiSm9pbkNvbHVtbnMiLCAiSm9pbkNvbHVtbltdIGNvbHVtbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDBcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKSwgbnVsbCwgQGFubm90LkpvaW5Db2x1bW4obmFtZT1cIkFERFJFU1NfSUQzXCIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Kb2luQ29sdW1ucyhjb2x1bW5zPXtAYW5ub3QuSm9pbkNvbHVtbihuYW1lPVwiQUREUkVTU19JRDNcIiksIEBhbm5vdC5Kb2luQ29sdW1uKG5hbWU9XCJBRERSRVNTX0lEMVwiKX0pIjsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgY2lkYWEgPSBuZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQkiYW5ub3QuSm9pbkNvbHVtbiIsICJhbm5vdC5Kb2luQ29sdW1ucyIsICJjb2x1bW5zIiwgMyk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgY2lkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L0RlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzN2NjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkRlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQotCS8vICoqKioqKioqKiogVGVzdENhc2UgYmVoYXZpb3IgKioqKioqKioqKgotCi0JcHVibGljIERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbWFMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuY29tbWFMZW5ndGgoIiwiKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbW1hTGVuZ3RoKCIsICIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuY29tbWFMZW5ndGgoIiwgICAiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29tbWFMZW5ndGgoIiAsIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5jb21tYUxlbmd0aCgiICwgIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5jb21tYUxlbmd0aCgiICwgICAiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCAiKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbW1hTGVuZ3RoKCIgICwgICAiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLCwsIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb21tYUxlbmd0aCgiICAsLCwgIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb21tYUxlbmd0aCgiICAsICAgLCIpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb21tYUxlbmd0aCgiICAseCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoIiAgLHggIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb21tYUxlbmd0aCgiICAsICAgeCIpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb21tYUxlbmd0aCgieCAgLCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuY29tbWFMZW5ndGgoInggICwgIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb21tYUxlbmd0aCgieCAgLCAgICIpKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21tYUxlbmd0aChTdHJpbmcgcykgewotCQlJbnRlZ2VyIGxlbiA9IChJbnRlZ2VyKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChEZWZhdWx0QW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSwgImNvbW1hTGVuZ3RoIiwgU3RyaW5nLmNsYXNzLCBzKTsKLQkJcmV0dXJuIGxlbi5pbnRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbigiQEYiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkBGb28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkBvcmcuYmFyLkZvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbigiIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN0cmluZ0lzQW5ub3RhdGlvbigiQCIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdHJpbmdJc0Fubm90YXRpb24oIkZvb0AiKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0cmluZ0lzQW5ub3RhdGlvbihTdHJpbmcgcykgewotCQlCb29sZWFuIGIgPSAoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCksICJzdHJpbmdJc0Fubm90YXRpb24iLCBTdHJpbmcuY2xhc3MsIHMpOwotCQlyZXR1cm4gYi5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSkRUVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmRkY2NlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9KRFRUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLQotCi1wdWJsaWMgY2xhc3MgSkRUVG9vbHNUZXN0cwotCQlleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEpEVFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNTdWJ0eXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUphdmFQcm9qZWN0IGpQcm9qID0gZ2V0SmF2YVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkKLQkJLy8gc2FtZSB0eXBlCi0JCWFzc2VydFRydWUoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgQXJyYXlMaXN0LmNsYXNzLmdldE5hbWUoKSwgQXJyYXlMaXN0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIExpc3QuY2xhc3MuZ2V0TmFtZSgpLCBMaXN0LmNsYXNzLmdldE5hbWUoKSkpOwotCQkKLQkJLy8gY29uY3JldGUgdHlwZSBpcyBzdWJ0eXBlIG9mIGludGVyZmFjZQotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIEFycmF5TGlzdC5jbGFzcy5nZXROYW1lKCksIExpc3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgVHJlZVNldC5jbGFzcy5nZXROYW1lKCksIEl0ZXJhYmxlLmNsYXNzLmdldE5hbWUoKSkpOwotCQkKLQkJLy8gY29uY3JldGUgdHlwZSBpcyBub3Qgc3VidHlwZSBvZiBpbnRlcmZhY2UKLQkJYXNzZXJ0RmFsc2UoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgQXJyYXlMaXN0LmNsYXNzLmdldE5hbWUoKSwgTWFwLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShKRFRUb29scy50eXBlSXNTdWJUeXBlKGpQcm9qLCBUcmVlU2V0LmNsYXNzLmdldE5hbWUoKSwgTWFwLmNsYXNzLmdldE5hbWUoKSkpOwotCQkKLQkJLy8gaW50ZXJmYWNlIGlzIHN1YnR5cGUgb2YgaW50ZXJmYWNlCi0JCWFzc2VydFRydWUoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgTGlzdC5jbGFzcy5nZXROYW1lKCksIENvbGxlY3Rpb24uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgU29ydGVkU2V0LmNsYXNzLmdldE5hbWUoKSwgSXRlcmFibGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCQotCQkvLyBpbnRlcmZhY2UgaXMgbm90IHN1YnR5cGUgb2YgaW50ZXJmYWNlCi0JCWFzc2VydEZhbHNlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIExpc3QuY2xhc3MuZ2V0TmFtZSgpLCBNYXAuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIFNvcnRlZFNldC5jbGFzcy5nZXROYW1lKCksIE1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJCi0JCS8vIGNvbmNyZXRlIHR5cGUgaXMgc3VidHlwZSBvZiBjb25jcmV0ZSB0eXBlCi0JCWFzc2VydFRydWUoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgQXJyYXlMaXN0LmNsYXNzLmdldE5hbWUoKSwgQWJzdHJhY3RMaXN0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoalByb2osIExpbmtlZExpc3QuY2xhc3MuZ2V0TmFtZSgpLCBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCQotCQkvLyBjb25jcmV0ZSB0eXBlIGlzIG5vdCBzdWJ0eXBlIG9mIGNvbmNyZXRlIHR5cGUKLQkJYXNzZXJ0RmFsc2UoSkRUVG9vbHMudHlwZUlzU3ViVHlwZShqUHJvaiwgQXJyYXlMaXN0LmNsYXNzLmdldE5hbWUoKSwgVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShKRFRUb29scy50eXBlSXNTdWJUeXBlKGpQcm9qLCBMaW5rZWRMaXN0LmNsYXNzLmdldE5hbWUoKSwgVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9KcHRDb21tb25Db3JlVXRpbGl0eUpkdFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ4NTk1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9KcHRDb21tb25Db3JlVXRpbGl0eUpkdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25Db3JlVXRpbGl0eUpkdFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRDb21tb25Db3JlVXRpbGl0eUpkdFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERlZmF1bHRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFTVFRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkRUVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHlwZVRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0Q29tbW9uQ29yZVV0aWxpdHlKZHRUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGYyZmE3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5DaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkluZGV4ZWRDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuUHJpbWl0aXZlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5UeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRFeHByZXNzaW9uQ29udmVydGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNZW1iZXJBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXJUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWVtYmVyQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoImFubm90IiwgYW5ub3RhdGlvbk5hbWUgKyAiLmphdmEiLCAicHVibGljIEBpbnRlcmZhY2UgIiArIGFubm90YXRpb25OYW1lICsgIiB7ICIgKyBhbm5vdGF0aW9uQm9keSArICIgfSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnVtKFN0cmluZyBlbnVtTmFtZSwgU3RyaW5nIGVudW1Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtcyIsIGVudW1OYW1lLCBlbnVtQm9keSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVudW0oU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KHBhY2thZ2VOYW1lLCBlbnVtTmFtZSArICIuamF2YSIsICJwdWJsaWMgZW51bSAiICsgZW51bU5hbWUgKyAiIHsgIiArIGVudW1Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInh4eCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJpbnQgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj00OCkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KGRhYSwgImJhciIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDgpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPSdjJykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBDaGFyYWN0ZXJTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImMiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYm9vbGVhbiBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWZhbHNlKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhLCAiYmFyIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheihmcmVkPWZhbHNlKSkpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGZhbHNlKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnROdWxsKGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdWxsMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoamltbXk9QGFubm90LkJheikpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYTMsICJmcmVkIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0NvbmNhdGVuYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIgKyBcInl5eVwiICsgXCJ6enpcIikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInh4eHl5eXp6eiIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdDb25zdGFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQkvLyBqdXN0IGEgYml0IGhhY2t5OgotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgicHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPT19CQVIgPSBcInh4eFwiOyBAYW5ub3QuRm9vKGJhcj1GT09fQkFSICsgXCJ5eXlcIiArIFwienp6XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJ4eHh5eXl6enoiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVtYmVyQXJpdGhtZXRpYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiaW50IGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NDcgLSA3ICsgMiAqIDEgLyAxKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JOdW1iZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDIpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVtYmVyU2hpZnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPTIgPDwgMikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yTnVtYmVycyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVtYmVyQ29uc3RhbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImludCBiYXIoKTsiKTsKLQkJLy8ganVzdCBhIGJpdCBoYWNreToKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT09fQkFSID0gNzc7IEBhbm5vdC5Gb28oYmFyPUZPT19CQVIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvck51bWJlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3NyksIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVDaGFyYWN0ZXJDb25zdGFudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJLy8ganVzdCBhIGJpdCBoYWNreToKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRk9PX0JBUiA9ICdRJzsgQGFubm90LkZvbyhiYXI9Rk9PX0JBUikiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JDaGFyYWN0ZXJzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoIlEiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQ2hhcmFjdGVyQ2FzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiY2hhciBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPShjaGFyKSAweDQxKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckNoYXJhY3RlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiQSIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVCb29sZWFuT3BlcmF0b3IxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NyA+IDIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVCb29sZWFuT3BlcmF0b3IyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NyA9PSAyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUJvb2xlYW5PcGVyYXRvcjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj0oNyAhPSAyKSAmJiBmYWxzZSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yQm9vbGVhbnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVCb29sZWFuT3BlcmF0b3I0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJib29sZWFuIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9KDcgIT0gMikgPyBmYWxzZSA6IHRydWUpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9NzcpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9YmF6enp6KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImJvb2xlYW4gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1iYXp6enopIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImNoYXIgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cImJhenp6elwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckNoYXJhY3RlcnMoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJqYXZhLmxhbmcuT2JqZWN0XCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWVudW1zLlRlc3RFbnVtLmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiXCJmYWxzZVwiIjsKLQkJU3RyaW5nIGVsZW1lbnQgPSAiZnJlZD0iICsgdmFsdWU7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KCIgKyBlbGVtZW50ICsgIikpKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEzID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihkYWEzLCAiZnJlZCIsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUludmFsaWRWYWx1ZTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9e3RydWUsIGZhbHNlfSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7bnVsbCwgbnVsbH0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSW52YWxpZFZhbHVlOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj03NykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFTVE5vZGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyB2YWx1ZSA9ICJcInh4eFwiIjsKLQkJU3RyaW5nIGVsZW1lbnQgPSAiYmFyPSIgKyB2YWx1ZTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbygiICsgZWxlbWVudCArICIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gQVNUVG9vbHMuYnVpbGRUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZih2YWx1ZSksIHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCWFzc2VydEVxdWFscyh2YWx1ZS5sZW5ndGgoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBU1ROb2RlMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiYm9vbGVhbiBmcmVkKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogamltbXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgdmFsdWUgPSAiZmFsc2UiOwotCQlTdHJpbmcgZWxlbWVudCA9ICJmcmVkPSIgKyB2YWx1ZTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooIiArIGVsZW1lbnQgKyAiKSkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGFlYS5nZXRWYWx1ZSgpKTsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IEFTVFRvb2xzLmJ1aWxkVGV4dFJhbmdlKGFlYS5nZXRBc3ROb2RlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCQlhc3NlcnRFcXVhbHModmFsdWUubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFTVE5vZGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGVsZW1lbnQgPSAiXCJ4eHhcIiI7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oIiArIGVsZW1lbnQgKyAiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gQVNUVG9vbHMuYnVpbGRUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZihlbGVtZW50KSwgdGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGVsZW1lbnQubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFTVE5vZGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gQVNUVG9vbHMuYnVpbGRUZXh0UmFuZ2UoYWVhLmdldEFzdE5vZGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFNvdXJjZShjdSkuaW5kZXhPZihhbm5vdGF0aW9uKSwgdGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFubm90YXRpb24ubGVuZ3RoKCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiYmFyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhiYXI9XCJ4eHhcIikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD1mYWxzZSkpKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZyZWQiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlM2EoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgImJvb2xlYW4gZnJlZCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PUBhbm5vdC5CYXooZnJlZD1mYWxzZSkpKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJqaW1teSIsICJhbm5vdC5CYXoiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZGFhMywgImZyZWQiLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZyZWQiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AQmF6KSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ4eHgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBcInh4eFwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9ZmFsc2UpKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT1AYW5ub3QuQmF6KGZyZWQ9dHJ1ZSkpKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJheiIsICJib29sZWFuIGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheiBqaW1teSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAiamltbXkiLCAiYW5ub3QuQmF6Iik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGRhYTMsICJmcmVkIiwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKGppbW15ID0gQEJheihmcmVkID0gdHJ1ZSkpKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWU3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28oYmFyPVwieHh4XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYWVhLnNldFZhbHVlKCJ5eXkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oYmFyPVwieXl5XCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IFN0cmluZyBiYXIoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhcInp6elwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKHZhbHVlID0gXCJ6enpcIiwgYmFyID0gXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyBiYXIoKTsgU3RyaW5nIGJheigpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKGJhcj1cInh4eFwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGFubm90YXRpb24sIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKGRhYSwgImJheiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieXl5Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oYW5ub3RhdGlvbiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKGJhcj1cInh4eFwiLCBiYXogPSBcInl5eVwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUxMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiaW50IGZyZWQoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheltdIGppbW15KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGFubm90YXRpb24gPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKGppbW15PXtAYW5ub3QuQmF6KGZyZWQ9MCksIEBhbm5vdC5CYXooZnJlZD0xKSwgQGFubm90LkJheihmcmVkPTIpLCBAYW5ub3QuQmF6KGZyZWQ9Myl9KSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgImppbW15IiwgMiwgImFubm90LkJheiIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPihkYWEzLCAiZnJlZCIsIE51bWJlckludGVnZXJFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyKSwgYWVhLmdldFZhbHVlKCkpOwotCQlhZWEuc2V0VmFsdWUoSW50ZWdlci52YWx1ZU9mKDQ4KSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oQGFubm90LkJhcihqaW1teT17QGFubm90LkJheihmcmVkPTApLCBAYW5ub3QuQmF6KGZyZWQ9MSksIEBhbm5vdC5CYXooZnJlZD00OCksIEBhbm5vdC5CYXooZnJlZD0zKX0pKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUxMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBhbm5vdC5Gb28iOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsICJ2YWx1ZSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCi0JCWFlYS5zZXRWYWx1ZSgieHh4Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oXCJ4eHhcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQlTdHJpbmcgYW5ub3RhdGlvbiA9ICJAYW5ub3QuRm9vKFwienp6XCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCAidmFsdWUiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQotCQlhZWEuc2V0VmFsdWUoInh4eCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGFubm90YXRpb24sIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhcInh4eFwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUxpdGVyYWwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWphdmEubGFuZy5PYmplY3QuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVHlwZUxpdGVyYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJqYXZhLmxhbmcuT2JqZWN0Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gamF2YS5sYW5nLk9iamVjdC5jbGFzcykiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZVR5cGVMaXRlcmFsMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1pbnQuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVUeXBlTGl0ZXJhbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlTGl0ZXJhbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9aW50LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlVHlwZUxpdGVyYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJpbnQiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhiYXIgPSBpbnQuY2xhc3MpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS5sYW5nLk9iamVjdC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBQcmltaXRpdmVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0TnVsbChhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZVR5cGVMaXRlcmFsNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj12b2lkLmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFByaW1pdGl2ZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1qYXZhLmxhbmcuT2JqZWN0LmNsYXNzKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIFR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5PYmplY3QiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiamF2YS5sYW5nLk9iamVjdCIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IGphdmEubGFuZy5PYmplY3QuY2xhc3MpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIkNsYXNzIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9amF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5IiwgYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlTGl0ZXJhbDE0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPWludC5jbGFzcykiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFR5cGVMaXRlcmFsNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiQ2xhc3MgYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZSgiaW50Iik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oYmFyID0gaW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUxpdGVyYWw2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJDbGFzcyBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXZvaWQuY2xhc3MpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9ZW51bXMuVGVzdEVudW0uWFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5YWFgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFgiLCAiQGFubm90LkZvbyhiYXI9WFhYKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbnVtcy5UZXN0RW51bS5YWFgiLCBhZWEuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydE51bGwoYWVhLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW00KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJlbnVtcy5UZXN0RW51bSIsICJAYW5ub3QuRm9vKGJhcj1UZXN0RW51bS5YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRFcXVhbHMoImVudW1zLlRlc3RFbnVtLlhYWCIsIGFlYS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhiYXI9WFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMuVGVzdEVudW0uWFhYIiwgZXhwZWN0ZWQpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImJhciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSBYWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bS5YWFgiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW0gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtLlhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFlYTEuc2V0VmFsdWUoImVudW1zMS5UZXN0RW51bS5YWFgiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZSgiZW51bXMyLlRlc3RFbnVtLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtczIuVGVzdEVudW07IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW0gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oYmFyMT1YWFgsIGJhcjIgPSBUZXN0RW51bS5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtczEuVGVzdEVudW0uKiIsICJAYW5ub3QuRm9vKGJhcjE9WFhYKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFzc2VydE5vdE51bGwoYWVhMS5nZXRWYWx1ZSgpKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZSgiZW51bXMyLlRlc3RFbnVtLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1JbXBvcnRDb2xsaXNpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0xIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTIiLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0xIGJhcjEoKTsgIGVudW1zLlRlc3RFbnVtMiBiYXIyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhcjEgPSBYWFgsIGJhcjIgPSBUZXN0RW51bTIuWFhYKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWExID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWExKTsKLQkJYWVhMS5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0xLlhYWCIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTIgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bTIuWFhYIik7Ci0KLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zLlRlc3RFbnVtMjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtSW1wb3J0Q29sbGlzaW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMSBiYXIxKCk7ICBlbnVtcy5UZXN0RW51bTIgYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhiYXIxPVhYWCwgYmFyMiA9IFRlc3RFbnVtMi5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoInN0YXRpYyBlbnVtcy5UZXN0RW51bTEuKiIsICJAYW5ub3QuRm9vKGJhcjE9WFhYKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMSA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWExID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFzc2VydE5vdE51bGwoYWVhMS5nZXRWYWx1ZSgpKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZSgiZW51bXMuVGVzdEVudW0yLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMuVGVzdEVudW0yOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCS8qKgotCSAqIG5vdCBzdXJlIHRoaXMgaXMgZXhhY3RseSB3aGF0IHdlIHdhbnQuLi4KLQkgKiBpdCB3b3VsZCBiZSBuaWNlIGlmIHdlIGp1c3Qgc2tpcCB0aGUgc3RhdGljIGltcG9ydDsgYnV0IGl0J3MgYSBtYXR0ZXIgb2YgdGFzdGUuLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtSW1wb3J0Q29sbGlzaW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMSBiYXIxKCk7ICBlbnVtcy5UZXN0RW51bTIgYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0gWFhYLCBiYXIyID0gVGVzdEVudW0yLlhYWCkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiZW51bXMuKiIsICIiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKCJlbnVtcy5UZXN0RW51bTEuWFhYIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUoImVudW1zLlRlc3RFbnVtMi5YWFgiKTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMuKjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUltcG9ydENvbGxpc2lvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMzIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zMS5UZXN0RW51bSBiYXIxKCk7ICBlbnVtczIuVGVzdEVudW0gYmFyMigpOyAgZW51bXMzLlRlc3RFbnVtIGJhcjMoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyMSA9IFhYWCwgYmFyMiA9IFRlc3RFbnVtLlhYWCwgYmFyMyA9IGVudW1zMy5UZXN0RW51bS5YWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYTEgPSBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjEiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKCJlbnVtczEuVGVzdEVudW0uWFhYIik7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhMiA9IG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUoImVudW1zMi5UZXN0RW51bS5YWFgiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEzID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIzIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGFlYTMgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEzKTsKLQkJYWVhMy5zZXRWYWx1ZSgiZW51bXMzLlRlc3RFbnVtLlhYWCIpOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtczIuVGVzdEVudW07IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGVudW1zMyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZVN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtcInN0cmluZzBcIiwgXCJzdHJpbmcxXCJ9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsic3RyaW5nMCIsICJzdHJpbmcxIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlU3RyaW5nQXJyYXlDb25jYXRlbmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXtcInN0cmlcIiArIFwibmcwXCIsIFwic1wiICsgXCJ0cmluZzFcIn0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJzdHJpbmcwIiwgInN0cmluZzEifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdBcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oYmFyPXt9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVTdHJpbmdBcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhiYXI9XCJzdHJpbmcwXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJzdHJpbmcwIn0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlTnVsbFN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgImJhciIsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nWzBdLCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZ0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0geyBcInN0cmluZzBcIiwgXCJzdHJpbmcxXCIgfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7InN0cmluZzAiLCAic3RyaW5nMSJ9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZ0FycmF5RW1wdHlSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEluZGV4ZWRDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBBbm5vdGF0aW9uU3RyaW5nQXJyYXlFeHByZXNzaW9uQ29udmVydGVyLmZvclN0cmluZ3MoKSk7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTdHJpbmdBcnJheUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmdbXSBiYXIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oYmFyID0ge30pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBleHByZXNzaW9uQ29udmVydGVyID0gbmV3IEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIoU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpLCBmYWxzZSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEluZGV4ZWRDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihkYWEsICJiYXIiLCBleHByZXNzaW9uQ29udmVydGVyKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZ0FycmF5U2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBhbm5vdGF0aW9uID0gIkBGb28oYmFyID0gXCJzdHJpbmcwXCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihhbm5vdGF0aW9uLCBjdSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZGFhLCAiYmFyIiwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYWVhLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7InN0cmluZzAifSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoYW5ub3RhdGlvbiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW1BcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17ZW51bXMuVGVzdEVudW0uWFhYLCBlbnVtcy5UZXN0RW51bS5ZWVl9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgImVudW1zLlRlc3RFbnVtLllZWSJ9LCBhZWEuZ2V0VmFsdWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUVudW1BcnJheUludmFsaWRFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17ZW51bXMuVGVzdEVudW0uWFhYLCA4OH0pIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgiLCBudWxsfSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj17fSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIGFlYS5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRW51bUFycmF5U2luZ2xlRWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1lbnVtcy5UZXN0RW51bS5YWFgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bS5YWFgifSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVFbnVtQXJyYXlTaW5nbGVFbGVtZW50SW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKGJhcj1cIlwiKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHtudWxsfSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVOdWxsRW51bUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW1bXSBiYXIoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgYWVhLmdldFZhbHVlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSB7IFhYWCwgWVlZIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIiwgImVudW1zLlRlc3RFbnVtLllZWSJ9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1swXSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtW10gYmFyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKGJhciA9IHt9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhciIsIGZhbHNlKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYSk7Ci0JCWFlYS5zZXRWYWx1ZShuZXcgU3RyaW5nWzBdKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheVNpbmdsZUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtcy5UZXN0RW51bVtdIGJhcigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIgPSBYWFgpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEpOwotCQlhZWEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0uWFhYIn0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlJbXBvcnRDb2xsaXNpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMxIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczIiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtW10gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtW10gYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0geyBYWFgsIFlZWSB9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhZWExLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMS5UZXN0RW51bS5YWFgiLCAiZW51bXMxLlRlc3RFbnVtLllZWSJ9KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTIgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMi5UZXN0RW51bS5YWFgiLCAiZW51bXMyLlRlc3RFbnVtLllZWSJ9KTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5YWFg7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgc3RhdGljIGVudW1zMi5UZXN0RW51bS5ZWVk7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUVudW1BcnJheUltcG9ydENvbGxpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczEiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMiIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJlbnVtczEuVGVzdEVudW1bXSBiYXIxKCk7ICBlbnVtczIuVGVzdEVudW1bXSBiYXIyKCk7Iik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKGJhcjE9e1hYWCxZWVl9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJzdGF0aWMgZW51bXMxLlRlc3RFbnVtLioiLCAiQGFubm90LkZvbyhiYXIxPXtYWFgsWVlZfSkiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFzc2VydE5vdE51bGwoYWVhMS5nZXRWYWx1ZSgpKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTIgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMiIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTIpOwotCQlhZWEyLnNldFZhbHVlKG5ldyBTdHJpbmdbXSB7ImVudW1zMi5UZXN0RW51bS5YWFgiLCAiZW51bXMyLlRlc3RFbnVtLllZWSJ9KTsKLQotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgc3RhdGljIGVudW1zMS5UZXN0RW51bS4qOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWFhYOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczIuVGVzdEVudW0uWVlZOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGVudW1zMi5UZXN0RW51bTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVFbnVtQXJyYXlJbXBvcnRDb2xsaXNpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0xIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJUZXN0RW51bTIiLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMuVGVzdEVudW0xW10gYmFyMSgpOyAgZW51bXMuVGVzdEVudW0yW10gYmFyMigpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0geyBYWFgsIFlZWSB9LCBiYXIyID0geyBUZXN0RW51bTIuWFhYLCBUZXN0RW51bTIuWVlZIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFlYTEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0xLlhYWCIsICJlbnVtcy5UZXN0RW51bTEuWVlZIn0pOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMuVGVzdEVudW0yLlhYWCIsICJlbnVtcy5UZXN0RW51bTIuWVlZIn0pOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0xLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oIlRlc3RFbnVtMSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiVGVzdEVudW0yIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImVudW1zLlRlc3RFbnVtMVtdIGJhcjEoKTsgIGVudW1zLlRlc3RFbnVtMltdIGJhcjIoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oYmFyMT17WFhYLFlZWX0sIGJhcjIgPSB7IFRlc3RFbnVtMi5YWFgsIFRlc3RFbnVtMi5ZWVkgfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgic3RhdGljIGVudW1zLlRlc3RFbnVtMS4qIiwgIkBhbm5vdC5Gb28oYmFyMT17WFhYLFlZWX0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYTEgPSBuZXcgRW51bUFycmF5RGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCAiYmFyMSIpOwotCQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGFlYTEgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5pZEZpZWxkKGN1KSwgZGFlYTEpOwotCQlhc3NlcnROb3ROdWxsKGFlYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGRhZWEyID0gbmV3IEVudW1BcnJheURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgImJhcjIiKTsKLQkJQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBhZWEyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuaWRGaWVsZChjdSksIGRhZWEyKTsKLQkJYWVhMi5zZXRWYWx1ZShuZXcgU3RyaW5nW10geyJlbnVtcy5UZXN0RW51bTIuWFhYIiwgImVudW1zLlRlc3RFbnVtMi5ZWVkifSk7Ci0KLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IHN0YXRpYyBlbnVtcy5UZXN0RW51bTEuKjsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMuVGVzdEVudW0yLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBlbnVtcy5UZXN0RW51bTI7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRW51bUFycmF5SW1wb3J0Q29sbGlzaW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUVudW0oImVudW1zMSIsICJUZXN0RW51bSIsICJYWFgsIFlZWSwgWlpaIik7Ci0JCXRoaXMuY3JlYXRlRW51bSgiZW51bXMyIiwgIlRlc3RFbnVtIiwgIlhYWCwgWVlZLCBaWloiKTsKLQkJdGhpcy5jcmVhdGVFbnVtKCJlbnVtczMiLCAiVGVzdEVudW0iLCAiWFhYLCBZWVksIFpaWiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiZW51bXMxLlRlc3RFbnVtW10gYmFyMSgpOyAgZW51bXMyLlRlc3RFbnVtW10gYmFyMigpOyAgZW51bXMzLlRlc3RFbnVtW10gYmFyMygpOyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhiYXIxID0geyBYWFgsIFlZWSB9LCBiYXIyID0geyBUZXN0RW51bS5YWFgsIFRlc3RFbnVtLllZWSB9LCBiYXIzID0geyBlbnVtczMuVGVzdEVudW0uWFhYLCBlbnVtczMuVGVzdEVudW0uWVlZIH0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMSA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIxIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMSA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMSk7Ci0JCWFlYTEuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMxLlRlc3RFbnVtLlhYWCIsICJlbnVtczEuVGVzdEVudW0uWVlZIn0pOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMiA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIyIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMiA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMik7Ci0JCWFlYTIuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMyLlRlc3RFbnVtLlhYWCIsICJlbnVtczIuVGVzdEVudW0uWVlZIn0pOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhMyA9IG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsICJiYXIzIik7Ci0JCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYWVhMyA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPih0aGlzLmlkRmllbGQoY3UpLCBkYWVhMyk7Ci0JCWFlYTMuc2V0VmFsdWUobmV3IFN0cmluZ1tdIHsiZW51bXMzLlRlc3RFbnVtLlhYWCIsICJlbnVtczMuVGVzdEVudW0uWVlZIn0pOwotCi0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLlhYWDsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBzdGF0aWMgZW51bXMxLlRlc3RFbnVtLllZWTsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBzdGF0aWMgZW51bXMyIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgZW51bXMyLlRlc3RFbnVtOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IHN0YXRpYyBlbnVtczMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBlbnVtczMiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NaXNjVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9NaXNjVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZjUzYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTWlzY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1pc2NUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWlzY1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogU2lnbmF0dXJlLnRvU3RyaW5nKC4uLikgcmV0dXJucyBhIGRvdC1xdWFsaWZpZWQgbmFtZSBmb3IgbWVtYmVyIHR5cGVzCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpZ25hdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJVHlwZSBoYXNoVGFibGVUeXBlID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5IYXNodGFibGUiKTsKLQkJSUZpZWxkIHRhYmxlRmllbGQgPSBoYXNoVGFibGVUeXBlLmdldEZpZWxkKCJ0YWJsZSIpOwotCQlTdHJpbmcgdGFibGVGaWVsZFR5cGVTaWduYXR1cmUgPSB0YWJsZUZpZWxkLmdldFR5cGVTaWduYXR1cmUoKTsKLQkJU3RyaW5nIHRhYmxlRmllbGRUeXBlTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyh0YWJsZUZpZWxkVHlwZVNpZ25hdHVyZSk7Ci0JCWFzc2VydEVxdWFscyh0YWJsZUZpZWxkVHlwZU5hbWUsICJqYXZhLnV0aWwuSGFzaHRhYmxlLkVudHJ5W10iKTsKLQl9Ci0KLQkvKgotCSAqIElUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIHJldHVybnMgYSBkb2xsYXItcXVhbGlmaWVkIG5hbWUgZm9yIG1lbWJlciB0eXBlcwotCSAqIChidXQgdGhlIGxvb2t1cCBvbiBJSmF2YVByb2plY3QgdGFrZXMgYSBkb3QtcXVhbGlmaWVkIG5hbWUhKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJVHlwZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVR5cGUgaGFzaFRhYmxlRW50cnlUeXBlID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5IYXNodGFibGUuRW50cnkiKTsKLQkJYXNzZXJ0RXF1YWxzKGhhc2hUYWJsZUVudHJ5VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSwgImphdmEudXRpbC5IYXNodGFibGUkRW50cnkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SVR5cGVQYXJhbWV0ZXJpemVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJVHlwZSBtYXBUeXBlID0gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoImphdmEudXRpbC5NYXAiKTsKLQkJYXNzZXJ0RXF1YWxzKG1hcFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWRQYXJhbWV0ZXJpemVkTmFtZSgpLCAiamF2YS51dGlsLk1hcDxLIGV4dGVuZHMgamF2YS5sYW5nLk9iamVjdCwgViBleHRlbmRzIGphdmEubGFuZy5PYmplY3Q+Iik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MmUyZDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L05lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiKTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmFyIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmF6IiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6IHlhbmEoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcih5YW5hPUBhbm5vdC5CYXopKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTIsICJ5YW5hIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMyk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXoiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1cImFubm90LkJhclwiKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyMiIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcjIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uPUBhbm5vdC5CYXIyKSIpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1AYW5ub3QuQmFyKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibmVzdGVkQW5ub3RhdGlvbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjFhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbj1cImFubm90LkJhclwiKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyMiBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb249QGFubm90LkJhcjIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogbmVzdGVkQW5ub3RhdGlvbjIoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uMSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AYW5ub3QuQmFyKG5lc3RlZEFubm90YXRpb24yPUBhbm5vdC5CYXopKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhRm9vID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUJhciA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUZvbywgIm5lc3RlZEFubm90YXRpb24xIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUJhciwgIm5lc3RlZEFubm90YXRpb24yIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXoiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241YSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXoiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXogbmVzdGVkQW5ub3RhdGlvbjIoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uMSgpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9uMT1AYW5ub3QuQmFyKG5lc3RlZEFubm90YXRpb24yPUBhbm5vdC5CYXopKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhRm9vID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYUJhciA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUZvbywgIm5lc3RlZEFubm90YXRpb24xIiwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYUJhciwgIm5lc3RlZEFubm90YXRpb24yIiwgImFubm90LkJheiIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb24xPUBCYXIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb24gPSBAQmFyKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb24iLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3QgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJU3RyaW5nTGl0ZXJhbCBzdHJpbmdMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdTdHJpbmdMaXRlcmFsKCk7Ci0JCXN0cmluZ0xpdGVyYWwuc2V0TGl0ZXJhbFZhbHVlKCJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoc3RyaW5nTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciBuZXN0ZWRBbm5vdGF0aW9uKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcihcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld1N0cmluZ0xpdGVyYWwoKTsKLQkJc3RyaW5nTGl0ZXJhbC5zZXRMaXRlcmFsVmFsdWUoInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShzdHJpbmdMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIHZhbHVlKCk7IFN0cmluZyB4eHgoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCB2YWx1ZSA9IEBCYXIoXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhciB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ5eXkiLCAidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiU3RyaW5nIHl5eSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbiA9IEBCYXIoeXl5ID0gXCJ0ZXN0IHN0cmluZyBsaXRlcmFsXCIpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24zKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbiIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb240KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInl5eSIsICJ0ZXN0IHN0cmluZyBsaXRlcmFsIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgeXl5KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXIgbmVzdGVkQW5ub3RhdGlvbigpOyBTdHJpbmcgdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb241KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdCB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjYoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIG5lc3RlZEFubm90YXRpb24oKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9uID0gQEJhcih5eXkgPSBcInRlc3Qgc3RyaW5nIGxpdGVyYWxcIikpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9uIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB5eXkoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB4eHgoKTsgYW5ub3QuQmFyIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKHl5eSA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uOChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieXl5IiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTRmMGY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5OdW1iZXJMaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5TaW5nbGVNZW1iZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzIGV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQotCXB1YmxpYyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoYW5ub3RhdGlvbk5hbWUsICIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCgiYW5ub3QiLCBhbm5vdGF0aW9uTmFtZSArICIuamF2YSIsICJwdWJsaWMgQGludGVyZmFjZSAiICsgYW5ub3RhdGlvbk5hbWUgKyAiIHsgIiArIGFubm90YXRpb25Cb2R5ICsgIiB9Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJTdHJpbmcgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyLCBAYW5ub3QuQmFyKFwidHdvXCIpfSkiKTsKLQkJLy8gMAotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImFubm90LkJhciIsIGFubm90YXRpb24uZ2V0VHlwZU5hbWUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSk7Ci0KLQkJLy8gMQotCQlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCWFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXIiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkJheiIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiYW5ub3QuQmF6W10geWFuYSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcih5YW5hPUBhbm5vdC5CYXopKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuQmF6IiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXoiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImFubm90LkJheltdIHlhbmEoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoeWFuYT17QGFubm90LkJhen0pKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5CYXoiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5CYXoiLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNNYXJrZXJBbm5vdGF0aW9uKCkpOwotCi0JCS8vIG5hbWUgbWlzbWF0Y2gKLQkJZGFhMyA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWEyLCAieWFuYSIsIDAsICJhbm5vdC5YeXoiKTsKLQkJYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTMpOwotCQlhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmFyIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbygpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJOb3RCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJCYXIiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5Ob3RCYXIpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgIlN0cmluZyB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIsIEBhbm5vdC5CYXIoXCJ0d29cIil9KSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGw2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiWHl6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiQmF6Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJhbm5vdC5CYXpbXSB5YW5hKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKHlhbmE9e0Bhbm5vdC5CYXp9KSkiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoIkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTMgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMiwgInlhbmEiLCAwLCAiYW5ub3QuWHl6Iik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEzKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e251bGwsIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcImFubm90LkJhcjFcIiwgXCJhbm5vdC5CYXIyXCIsIFwiYW5ub3QuQmFyM1wifSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5Ob3RCYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcigwKSwgQGFubm90Lk5vdEJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydE51bGwoYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuZXN0ZWRBbm5vdGF0aW9ucyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjVhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKS5pc01hcmtlckFubm90YXRpb24oKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZ1tdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwiYW5ub3QuQmFyXCIpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuTm90QmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSksIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydFRydWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCkuaXNOb3JtYWxBbm5vdGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpLCBudWxsLCBAYW5ub3QuQmFyKDMpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRUcnVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLmlzU2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuQVJSQVlfSU5JVElBTElaRVIsIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbihhc3RSb290KSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgQGFubm90LkJhcigxKSwgbnVsbCwgQGFubm90LkJhcigzKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIEBhbm5vdC5CYXIoMSl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDApKSI7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5hKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTEpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgInZhbHVlIiwgMiwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLlNJTkdMRV9NRU1CRVJfQU5OT1RBVElPTiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDEpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIG51bGx9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMCkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSwgInZhbHVlIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBudWxsLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCksICJ2YWx1ZSIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAidmFsdWUiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90LkJhcigwKSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5TSU5HTEVfTUVNQkVSX0FOTk9UQVRJT04sIHRoaXMuYW5ub3RhdGlvbkVsZW1lbnRWYWx1ZShhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlTdHJpbmcgbmEgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17bnVsbCwgQGFubm90LkJhcigxKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKG5hLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoZGFhMSwgIm5lc3RlZEFubm90YXRpb25zIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5lc3RlZEFubm90YXRpb25zIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMTkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIG51bGx9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoMCkpIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEyLnJlbW92ZUFubm90YXRpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKEFTVE5vZGUuU0lOR0xFX01FTUJFUl9BTk5PVEFUSU9OLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSwgIm5lc3RlZEFubm90YXRpb25zIikuZ2V0Tm9kZVR5cGUoKSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4obmEsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJU3RyaW5nIG5hID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoMCksIG51bGwsIEBhbm5vdC5CYXIoMiksIEBhbm5vdC5CYXIoMyl9KSI7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBudWxsLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZShuYSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhuYSwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWExID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWExKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEyID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGRhYTEsICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDIsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEyID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEyKTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhMi5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhMi5yZW1vdmVBbm5vdGF0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyhBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSLCB0aGlzLmFubm90YXRpb25FbGVtZW50VmFsdWUoYWExLmdldEFubm90YXRpb24oYXN0Um9vdCksICJuZXN0ZWRBbm5vdGF0aW9ucyIpLmdldE5vZGVUeXBlKCkpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKG5hLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCVN0cmluZyBuYSA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDApLCBudWxsLCBAYW5ub3QuQmFyKDIpLCBAYW5ub3QuQmFyKDMpfSkiOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcigwKSwgbnVsbCwgQGFubm90LkJhcigyKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUobmEpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMobmEsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhMiA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihkYWExLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhMiA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMik7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYTIuZ2V0QW5ub3RhdGlvbihhc3RSb290KTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYTIucmVtb3ZlQW5ub3RhdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5BUlJBWV9JTklUSUFMSVpFUiwgdGhpcy5hbm5vdGF0aW9uRWxlbWVudFZhbHVlKGFhMS5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpLCAibmVzdGVkQW5ub3RhdGlvbnMiKS5nZXROb2RlVHlwZSgpKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihuYSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkZvbyIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiRm9vIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb241KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIlN0cmluZyB2YWx1ZSgpOyBhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb242KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHh4eCgpOyBhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb245KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhc3NlcnROdWxsKGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBAQmFyIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAibnVsbCwgQEJhciB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAQmFyLCBcInR3b1wifSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkJhcn0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyg3KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKHs3LG51bGwsbnVsbCxudWxsLG51bGwsQEJhcn0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoNTUpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig1NSksQEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QEJhcn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMTgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJCYXJ9KSIsIGN1KTsgIC8vIHNwbGl0IGxpbmUKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5Ob3RCYXIsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuQmFyKDg4KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcikiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoODgpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90LkJhcig4OCksbnVsbCxAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoODgpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksbnVsbCxAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtAYW5ub3QuQmFyKDg4KSwgQGFubm90LkJhcig3Nyl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0Bhbm5vdC5CYXIoODgpLCBAYW5ub3QuQmFyKDc3KSwgbnVsbCwgbnVsbCwiOyAgLy8gdGhlIGxpbmUgZ2V0cyBzcGxpdAotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBCYXJ9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQyLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA0LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlhYS5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld01hcmtlckFubm90YXRpb24yNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcig4OCksIEBhbm5vdC5CYXIoNzcpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDg4KSwgQGFubm90LkJhcig3NyksIG51bGwsIG51bGwsIjsgIC8vIHRoZSBsaW5lIGdldHMgc3BsaXQKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQmFyfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkMiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNCwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhAQmFyKDg4KSkiLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24zKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBGb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb240KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKHZhbHVlID0gXCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb241KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb242KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgbmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjcoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb243KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJTdHJpbmcgeHh4KCk7IGFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHh4eD1cInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIiwgdmFsdWUgPSBAQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjgoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb244KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQEJhcihNSVNTSU5HKSB9KSIsIGN1KTsgIC8vID8/PwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiU3RyaW5nIHZhbHVlKCk7IGFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKFwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAibnVsbCwgQEJhcihNSVNTSU5HKSB9KSI7ICAvLyA/Pz8KLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7XCJvbmVcIiwgXCJ0d29cIn0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAQmFyKDg4KSwgXCJ0d29cIn0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjExKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcihNSVNTSU5HKX0pIiwgY3UpOyAgLy8gc3BsaXQgbGluZQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjEzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oezcsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKE1JU1NJTkcpfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJOb3RCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5Ob3RCYXIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTUoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoNTUpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcig1NSksQEJhcig4OCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTYoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPXtcInNvbWV0aGluZ1wifSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e0BCYXIoODgpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE3KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTcoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNpbmdsZU1lbWJlckFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJTnVtYmVyTGl0ZXJhbCBudW1iZXJMaXRlcmFsID0gYW5ub3RhdGlvbi5nZXRBU1QoKS5uZXdOdW1iZXJMaXRlcmFsKCk7Ci0JCW51bWJlckxpdGVyYWwuc2V0VG9rZW4oIjg4Iik7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUobnVtYmVyTGl0ZXJhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17XCJzb21ldGhpbmdcIn0pIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQmFyKE1JU1NJTkcpfSkiLCBjdSk7ICAvLyA/Pz8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPVwic29tZXRoaW5nXCIpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBCYXIoODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMTkoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24xOShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlTaW5nbGVNZW1iZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2luZ2xlTWVtYmVyQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9QEJhcig4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld1NpbmdsZU1lbWJlckFubm90YXRpb24yMChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIwKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU51bWJlckxpdGVyYWwgbnVtYmVyTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3TnVtYmVyTGl0ZXJhbCgpOwotCQludW1iZXJMaXRlcmFsLnNldFRva2VuKCI4OCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bWJlckxpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcixudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoTUlTU0lORyl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zPUBhbm5vdC5CYXIoNzcpKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AQmFyKDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbjIyKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uMjIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJU2luZ2xlTWVtYmVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZGFhLm5ld1NpbmdsZU1lbWJlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlOdW1iZXJMaXRlcmFsIG51bWJlckxpdGVyYWwgPSBhbm5vdGF0aW9uLmdldEFTVCgpLm5ld051bWJlckxpdGVyYWwoKTsKLQkJbnVtYmVyTGl0ZXJhbC5zZXRUb2tlbigiODgiKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShudW1iZXJMaXRlcmFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28oQEJhcih4eHggPSA4OCkpIiwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24yKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjMoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJARm9vKEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNChkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQEZvbyh2YWx1ZSA9IFwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb241KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oXCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb242KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsgU3RyaW5nIHh4eCgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb243KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uNyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsgU3RyaW5nIHh4eCgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh4eHg9XCJzb21ldGhpbmdcIikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oeHh4PVwic29tZXRoaW5nXCIsIHZhbHVlID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb244KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uOChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gbmVzdGVkQW5ub3RhdGlvbnMoKTsgU3RyaW5nIHh4eCgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgQEJhcigpIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIG5lc3RlZEFubm90YXRpb25zKCk7IFN0cmluZyB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBGb28odmFsdWUgPSBcInNvbWV0aGluZ1wiLCBuZXN0ZWRBbm5vdGF0aW9ucyA9IHsgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIm51bGwsIEBCYXIoKSB9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXIiLCBjdSk7Ci0KLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCA1LCAiYW5ub3QuQmFyIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3Tm9ybWFsQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHsgXCJvbmVcIiwgXCJ0d29cIiB9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7IEBCYXIoeHh4ID0gODgpLCBcInR3b1wiIH0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xMShkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjExKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe1wib25lXCIsIFwidHdvXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcigpfSkiLCBjdSk7ICAvLyBzcGxpdCBsaW5lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xMyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjEzKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oNykiKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEJhciIsIGN1KTsKLQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDUsICJhbm5vdC5CYXIiKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oezcsbnVsbCxudWxsLG51bGwsbnVsbCxAQmFyKCl9KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuTm90QmFyKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE1KGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhAYW5ub3QuQmFyKDU1KSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoNTUpLEBCYXIoeHh4PTg4KX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xNihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE2KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAxLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xNygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSB7IFwic29tZXRoaW5nXCIgfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSB7IEBCYXIoeHh4ID0gODgpIH0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24xNyhkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjE3KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sICJ4eHgiLCA4OCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xOCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnM9e1wic29tZXRoaW5nXCJ9KSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEJhcigpfSkiLCBjdSk7ICAvLyBzcGxpdCBsaW5lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld05vcm1hbEFubm90YXRpb24xOSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHh4eCgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiT2JqZWN0W10gbmVzdGVkQW5ub3RhdGlvbnMoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBcInNvbWV0aGluZ1wiKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucyA9IEBCYXIoeHh4ID0gODgpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQkJdGhpcy5pZEZpZWxkKGN1KS5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMTkoZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXZvaWQgZWRpdE5ld05vcm1hbEFubm90YXRpb24xOShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgMCwgImFubm90LkJhciIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgZGFhLmdldEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCQlhbm5vdGF0aW9uID0gZGFhLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCAieHh4IiwgODgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiTm90QmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQGFubm90Lk5vdEJhcikiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28obmVzdGVkQW5ub3RhdGlvbnMgPSBAQmFyKHh4eCA9IDg4KSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMudGhpcy5lZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIwKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uMjAoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJuZXN0ZWRBbm5vdGF0aW9ucyIsIDAsICJhbm5vdC5CYXIiKTsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIGRhYS5nZXRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3Tm9ybWFsQW5ub3RhdGlvbjIxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIk5vdEJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgeHh4KCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJPYmplY3RbXSBuZXN0ZWRBbm5vdGF0aW9ucygpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz1AYW5ub3QuTm90QmFyKSIpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQmFyIiwgY3UpOwotCi0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgIm5lc3RlZEFubm90YXRpb25zIiwgNSwgImFubm90LkJhciIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld05vcm1hbEFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyhuZXN0ZWRBbm5vdGF0aW9ucz17QGFubm90Lk5vdEJhcixudWxsLG51bGwsbnVsbCxudWxsLEBCYXIoKX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uMjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB4eHgoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgIk9iamVjdFtdIG5lc3RlZEFubm90YXRpb25zKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQGFubm90LkJhcig3NykpIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKG5lc3RlZEFubm90YXRpb25zID0gQEJhcih4eHggPSA4OCkpIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCQl0aGlzLmlkRmllbGQoY3UpLmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlclRlc3RzLnRoaXMuZWRpdE5ld05vcm1hbEFubm90YXRpb24yMihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0Jdm9pZCBlZGl0TmV3Tm9ybWFsQW5ub3RhdGlvbjIyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAibmVzdGVkQW5ub3RhdGlvbnMiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGRhYS5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgInh4eCIsIDg4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMDApKSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCxAYW5ub3QuQmFyKDAwKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKEBhbm5vdC5CYXIoMTEpKSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMSwgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgQGFubm90LkJhcigzMyl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb240KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBAYW5ub3QuQmFyKDMzKSwgQGFubm90LkJhcig0NCl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7QGFubm90LkJhcigzMyksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKSwgbnVsbCwgQGFubm90LkJhcig0NCl9KSI7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oZXhwZWN0ZWQsIGN1KTsKLQotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCW5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKSwgInZhbHVlIiwgMywgImFubm90LkJhciIpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgaWRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGlhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDApOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uNSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIG51bGwsIEBhbm5vdC5CYXIoMjIpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDIsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oe0Bhbm5vdC5CYXIoMDApLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyh7bnVsbCwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBAYW5ub3QuQmFyKDAwKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAwLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMyk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb243KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpfSkiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbihleHBlY3RlZCwgY3UpOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAzLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb244KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSksIEBhbm5vdC5CYXIoMjIpLCBudWxsLCBAYW5ub3QuQmFyKDQ0KX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtudWxsLCBAYW5ub3QuQmFyKDExKSwgQGFubm90LkJhcigyMiksIG51bGwsIEBhbm5vdC5CYXIoNDQpfSkiOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKGV4cGVjdGVkLCBjdSk7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIkBhbm5vdC5Gb28oe251bGwsIEBhbm5vdC5CYXIoMTEpLCBAYW5ub3QuQmFyKDIyKX0pIjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoZXhwZWN0ZWQpOyAgLy8gdGhlIHNvdXJjZSBzaG91bGQgYmUgdW5jaGFuZ2VkCi0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDAsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigzKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgQGFubm90LkJhcigxMSl9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDAwKSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJaWFhLm1vdmVBbm5vdGF0aW9uKDEpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVBbm5vdGF0aW9uMTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiQmFyIiwgImludCB2YWx1ZSgpOyIpOwotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJGb28iLCAiYW5ub3QuQmFyW10gdmFsdWUoKTsiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oQGFubm90LkJhcigwMCkpIik7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDEsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQmFyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQW5ub3RhdGlvbjEyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkJhciIsICJpbnQgdmFsdWUoKTsiKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRm9vIiwgImFubm90LkJhcltdIHZhbHVlKCk7Iik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDAwKSwgbnVsbCwgQGFubm90LkJhcigyMil9KSIpOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiQGFubm90LkZvbyhAYW5ub3QuQmFyKDIyKSkiOwotCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpLCAidmFsdWUiLCAyLCAiYW5ub3QuQmFyIik7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBpZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gaWFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQotCQlpYWEubW92ZUFubm90YXRpb24oMCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUFubm90YXRpb24xMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJCYXIiLCAiaW50IHZhbHVlKCk7Iik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIkZvbyIsICJhbm5vdC5CYXJbXSB2YWx1ZSgpOyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyh7QGFubm90LkJhcigwMCksIEBhbm5vdC5CYXIoMTEpLCBudWxsLCBAYW5ub3QuQmFyKDMzKX0pIik7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJAYW5ub3QuRm9vKHtAYW5ub3QuQmFyKDMzKSwgQGFubm90LkJhcigxMSl9KSI7Ci0KLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQluZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIiksICJ2YWx1ZSIsIDMsICJhbm5vdC5CYXIiKTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGlkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBpYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWlhYS5tb3ZlQW5ub3RhdGlvbigwKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZCwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvamR0L1NpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzg2YjkzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1lbWJlclZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTnVtYmVyTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlTWVtYmVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU3RyaW5nTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCi0JcHVibGljIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oImFubm90IiwgYW5ub3RhdGlvbk5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIge30iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiYW5ub3QuRm9vIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oMSkgQGFubm90LkZvbygyKSIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJhbm5vdC5Gb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbm5vdC5Gb28iLCBhbm5vdGF0aW9uLmdldFR5cGVOYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkpOwotCQlFeHByZXNzaW9uIHZhbHVlID0gKChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoQVNUTm9kZS5OVU1CRVJfTElURVJBTCwgdmFsdWUuZ2V0Tm9kZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiMSIsICgoTnVtYmVyTGl0ZXJhbCkgdmFsdWUpLmdldFRva2VuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiYW5ub3QuRm9vIiwgIkBGb28iKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYW5ub3RhdGlvbi5nZXRUeXBlTmFtZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzTWFya2VyQW5ub3RhdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbk51bGwxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uTnVsbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb3AiKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb3AiKTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb3AiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFubm90YXRpb25OdWxsMygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbyIpOwotCQkvLyB1bi1xdWFsaWZpZWQgbmFtZQotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKCJGb28iKTsKLQkJQW5ub3RhdGlvbkFkYXB0ZXIgYWEgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFhLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQW5ub3RhdGlvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28iKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90LkZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiQGFubm90LkZvbygxKSBAYW5ub3QuRm9vKDIpIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBhbm5vdC5Gb28oMSkgQGFubm90LkZvbygyKSIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEucmVtb3ZlQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAYW5ub3QuRm9vKDEpIiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QuRm9vKDIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdNYXJrZXJBbm5vdGF0aW9uMSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUFubm90YXRpb24oIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCUFubm90YXRpb25BZGFwdGVyIGFhID0gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmlkRmllbGQoY3UpLCBkYWEpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhYS5nZXRBbm5vdGF0aW9uKHRoaXMuYnVpbGRBU1RSb290KGN1KSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0KLQkJYWEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3TWFya2VyQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoIkBhbm5vdC5Gb28oODgpIik7Ci0JCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCQlBbm5vdGF0aW9uQWRhcHRlciBhYSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhKTsKLQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCi0JCWFhLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90LkZvbzsiLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoIkBGb28iLCBjdSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBhbm5vdC5Gb28oODgpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCVNpbmdsZU1lbWJlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3U2luZ2xlTWVtYmVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCVN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IGFubm90YXRpb24uZ2V0QVNUKCkubmV3U3RyaW5nTGl0ZXJhbCgpOwotCQlzdHJpbmdMaXRlcmFsLnNldExpdGVyYWxWYWx1ZSgidGVzdCBzdHJpbmcgbGl0ZXJhbCIpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKHN0cmluZ0xpdGVyYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdOb3JtYWxBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiRm9vIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBGb28iLCBjdSk7Ci0JCXRoaXMuaWRGaWVsZChjdSkuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXJUZXN0cy50aGlzLmVkaXROZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vKGJhciA9IFwidGVzdCBzdHJpbmcgbGl0ZXJhbFwiKSIsIGN1KTsKLQl9Ci0KLQl2b2lkIGVkaXROZXdOb3JtYWxBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QuRm9vIik7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkYWEuZ2V0QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCWFubm90YXRpb24gPSBkYWEubmV3Tm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCU1lbWJlclZhbHVlUGFpciBtdnAgPSB0aGlzLm5ld01lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLmdldEFTVCgpLCAiYmFyIiwgInRlc3Qgc3RyaW5nIGxpdGVyYWwiKTsKLQkJdGhpcy52YWx1ZXMoYW5ub3RhdGlvbikuYWRkKG12cCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydENvbGxpc2lvbjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdDEiLCAiRm9vIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3QyIiwgIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJARm9vIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QxLkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QyLkZvbyIpOwotCi0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24xKTsKLQotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24yID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uMik7Ci0KLQkJYWExLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiaW1wb3J0IGFubm90MS5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCi0JCWFhMi5uZXdNYXJrZXJBbm5vdGF0aW9uKCk7Ci0JCXRoaXMuYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImltcG9ydCBhbm5vdDIuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQGFubm90Mi5Gb28iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcG9ydENvbGxpc2lvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJhbm5vdDEiLCAiRm9vIik7Ci0JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbigiYW5ub3QyIiwgIkZvbyIpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgiYW5ub3QxLioiLCAiQEZvbyIpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJpbXBvcnQgYW5ub3QxLio7IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJARm9vIiwgY3UpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTEgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QxLkZvbyIpOwotCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYTIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigiYW5ub3QyLkZvbyIpOwotCi0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24xKTsKLQotCQlBbm5vdGF0aW9uQWRhcHRlciBhYTIgPSBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuaWRGaWVsZChjdSksIGRhYTIpOwotCQlBbm5vdGF0aW9uIGFubm90YXRpb24yID0gYWEyLmdldEFubm90YXRpb24odGhpcy5idWlsZEFTVFJvb3QoY3UpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uMik7Ci0KLQkJYWEyLm5ld01hcmtlckFubm90YXRpb24oKTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiaW1wb3J0IGFubm90Mi5Gb287IiwgY3UpOwotCQl0aGlzLmFzc2VydFNvdXJjZUNvbnRhaW5zKCJAYW5ub3QyLkZvbyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0V2lsZENhcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uKCJGb28iKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGUoImFubm90LioiLCAiIik7Ci0JCXRoaXMuYXNzZXJ0U291cmNlQ29udGFpbnMoImltcG9ydCBhbm5vdC4qOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEZvbyIsIGN1KTsKLQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWExID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoImFubm90LkZvbyIpOwotCi0JCUFubm90YXRpb25BZGFwdGVyIGFhMSA9IG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5pZEZpZWxkKGN1KSwgZGFhMSk7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbjEgPSBhYTEuZ2V0QW5ub3RhdGlvbih0aGlzLmJ1aWxkQVNUUm9vdChjdSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24xKTsKLQotCQlhYTEubmV3TWFya2VyQW5ub3RhdGlvbigpOwotCQl0aGlzLmFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJpbXBvcnQgYW5ub3QuRm9vOyIsIGN1KTsKLQkJdGhpcy5hc3NlcnRTb3VyY2VDb250YWlucygiQEZvbyIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L2pkdC9UeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJkODBhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9qZHQvVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFR5cGVUZXN0cyBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0KFN0cmluZyBzb3VyY2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCBzb3VyY2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBqZHRDb21waWxhdGlvblVuaXQgPSB0aGlzLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdCh0aGlzLmJ1aWxkVGVzdDFTb3VyY2UoKSk7Ci0JCWFzc2VydE5vdE51bGwoamR0Q29tcGlsYXRpb25Vbml0KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRlc3QxU291cmNlKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgeyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7IikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvdGVzdC54bWwgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDM0Njg1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uY2xhc3NwYXRoIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkZDE1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5jdnNpZ25vcmUgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5wcm9qZWN0IGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMDYzM2UuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhMWNkMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowNjo0NCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYTRmYTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cwotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSI0LjMuMSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy42LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSJbMy41LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaDtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy41LjAsNC4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLmpmYWNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0O3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNlNjc2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I4MTk5Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIENvbW1vbiBVSSBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9KcHRDb21tb25VaVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9KcHRDb21tb25VaVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2I3MmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvSnB0Q29tbW9uVWlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0LkpwdFVpU1dUVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsLkpwdFVpVXRpbFRlc3RzOwotCi0vKioKLSAqIFJ1bnMgYWxsIEpQVCBVSSBUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0Q29tbW9uVWlUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29tbW9uVWlUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVaVNXVFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpVXRpbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRDb21tb25VaVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjNiOGU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL2pmYWNlL0RlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5QYWxldHRlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgRGVsZWdhdGluZ0xhYmVsUHJvdmlkZXJVaVRlc3QgZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlOwotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VmVoaWNsZT4gc2VsZWN0ZWRWZWhpY2xlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBEZWxlZ2F0aW5nTGFiZWxQcm92aWRlclVpVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQkKLQkKLQlwcml2YXRlIERlbGVnYXRpbmdMYWJlbFByb3ZpZGVyVWlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMuc2VsZWN0ZWRWZWhpY2xlID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxWZWhpY2xlPigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCA0MDApOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFRyZWVQYW5lbChtYWluUGFuZWwpOwotCQlidWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlsYWJlbC5zZXRUZXh0KCJNeSBWZWhpY2xlcyIpOwotCQkKLQkJdHJlZSA9IG5ldyBUcmVlVmlld2VyKHBhbmVsLCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXRyZWUuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyID0gCi0JCQluZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcigKLQkJCQluZXcgVmVoaWNsZUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwKLQkJCQluZXcgVmVoaWNsZUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkpOwotCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0TGFiZWxQcm92aWRlcihjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0SW5wdXQobmV3IFJvb3QoKSk7Ci0JCXRyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlzZWxlY3RlZFZlaGljbGUuc2V0VmFsdWUoKFZlaGljbGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFVwcGVyQ29udHJvbFBhbmVsKHBhbmVsKTsKLQkJYnVpbGRMb3dlckNvbnRyb2xQYW5lbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFVwcGVyQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlidWlsZFZlaGljbGVDb21ibyhwYW5lbCk7Ci0JCWJ1aWxkQ29sb3JDb21ibyhwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZFZlaGljbGVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbWJvVmlld2VyIGNvbWJvID0gbmV3IENvbWJvVmlld2VyKHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWNvbWJvLmdldENvbWJvKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQljb21iby5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQljb21iby5zZXRMYWJlbFByb3ZpZGVyKG5ldyBWZWhpY2xlVHlwZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldElucHV0KAotCQkJbmV3IFZlaGljbGVUeXBlW10gewotCQkJCVZlaGljbGVUeXBlLkJJQ1lDTEUsIFZlaGljbGVUeXBlLkNBUiwgCi0JCQkJVmVoaWNsZVR5cGUuVFJVQ0ssIFZlaGljbGVUeXBlLkJPQVQKLQkJCX0pOwotCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQoZmFsc2UpOwotCQljb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRWZWhpY2xlVHlwZSgoVmVoaWNsZVR5cGUpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsgCi0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCh2ZWhpY2xlID09IG51bGwpID8gbnVsbCA6IHZlaGljbGUudmVoaWNsZVR5cGUoKSkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRDb2xvckNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tYm9WaWV3ZXIgY29tYm8gPSBuZXcgQ29tYm9WaWV3ZXIocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJY29tYm8uZ2V0Q29tYm8oKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNvbWJvLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCWNvbWJvLnNldExhYmVsUHJvdmlkZXIobmV3IENvbG9yTGFiZWxQcm92aWRlcigpKTsKLQkJY29tYm8uc2V0SW5wdXQobmV3IENvbG9yW10ge0NvbG9yLlJFRCwgQ29sb3IuQkxVRSwgQ29sb3IuWUVMTE9XLCBDb2xvci5HUkVFTn0pOwotCQljb21iby5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoCi0JCQluZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlzZWxlY3RlZFZlaGljbGUoKS5zZXRDb2xvcigoQ29sb3IpICgoU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldEZpcnN0RWxlbWVudCgpKTsgCi0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQljb21iby5nZXRDb21ibygpLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJY29tYm8uc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKCh2ZWhpY2xlID09IG51bGwpID8gbnVsbCA6IHZlaGljbGUuY29sb3IoKSkpOwotCQkJCX0KLQkJCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRMb3dlckNvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWJ1aWxkRWZmZWN0c0xhYmVsKHBhbmVsKTsKLQkJYnVpbGRHcmV5ZWRDaGVja0JveChwYW5lbCk7Ci0JCWJ1aWxkVHJhbnNsdWNlbnRDaGVja0JveChwYW5lbCk7Ci0JCWJ1aWxkQWN0aW9uUGFuZWwocGFuZWwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRFZmZlY3RzTGFiZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCgiQ29sb3IgZWZmZWN0czogIik7Ci0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UsIDMsIDEpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkR3JleWVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5CRUdJTk5JTkcsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJncmV5ZWQiKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldEdyZXllZChidXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX0pOwotCQlzZWxlY3RlZFZlaGljbGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgCi0JCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQlWZWhpY2xlIHZlaGljbGUgPSBzZWxlY3RlZFZlaGljbGUoKTsKLQkJCQkJYnV0dG9uLnNldEVuYWJsZWQodmVoaWNsZSAhPSBudWxsKTsKLQkJCQkJYnV0dG9uLnNldFNlbGVjdGlvbih2ZWhpY2xlICE9IG51bGwgJiYgdmVoaWNsZS5pc0dyZXllZCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJhbnNsdWNlbnRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJYnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkJFR0lOTklORywgR3JpZERhdGEuQ0VOVEVSLCB0cnVlLCBmYWxzZSkpOwotCQlidXR0b24uc2V0VGV4dCgidHJhbnNsdWNlbnQiKTsKLQkJYnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlidXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXNlbGVjdGVkVmVoaWNsZSgpLnNldFRyYW5zbHVjZW50KGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCXNlbGVjdGVkVmVoaWNsZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAKLQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCVZlaGljbGUgdmVoaWNsZSA9IHNlbGVjdGVkVmVoaWNsZSgpOwotCQkJCQlidXR0b24uc2V0RW5hYmxlZCh2ZWhpY2xlICE9IG51bGwpOwotCQkJCQlidXR0b24uc2V0U2VsZWN0aW9uKHZlaGljbGUgIT0gbnVsbCAmJiB2ZWhpY2xlLmlzVHJhbnNsdWNlbnQoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZEFjdGlvblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRU5ELCBHcmlkRGF0YS5GSUxMLCBmYWxzZSwgZmFsc2UpKTsKLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlidWlsZFJlZnJlc2hUcmVlQUNJKCkuZmlsbChwYW5lbCk7Ci0JfQotCQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlZnJlc2hUcmVlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVmcmVzaCB0cmVlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVmcmVzaFRyZWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJSZWZyZXNoIHRoZSB0cmVlJ3MgbGFiZWxzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQkKLQl2b2lkIHJlZnJlc2hUcmVlKCkgewotCQl0cmVlLnJlZnJlc2goKTsKLQl9Ci0JCi0JcHJpdmF0ZSBWZWhpY2xlIHNlbGVjdGVkVmVoaWNsZSgpIHsKLQkJcmV0dXJuIHNlbGVjdGVkVmVoaWNsZS5nZXRWYWx1ZSgpOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBWZWhpY2xlVHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNlTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElMYWJlbFByb3ZpZGVyCi0JewotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiAoKFZlaGljbGVUeXBlKSBlbGVtZW50KS5kZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENvbG9yTGFiZWxQcm92aWRlciBleHRlbmRzIEJhc2VMYWJlbFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUxhYmVsUHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoQ29sb3IpIGVsZW1lbnQpLmRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQkJaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQl7Ci0JCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBSb290KSB7Ci0JCQkJcmV0dXJuIG5ldyBSb290Q29udGVudFByb3ZpZGVyKAotCQkJCQkoUm9vdCkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgVmVoaWNsZUNvbnRlbnRQcm92aWRlcigKLQkJCQkoVmVoaWNsZSkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBSb290Q29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxWZWhpY2xlPgotCXsKLQkJcHVibGljIFJvb3RDb250ZW50UHJvdmlkZXIoUm9vdCBpdGVtLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUm9vdCBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoUm9vdCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VmVoaWNsZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBTdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDxWZWhpY2xlPih0aGlzLmdldE1vZGVsKCkudmVoaWNsZXMoKSk7Ci0JCX0KLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXIKLQl7Ci0JCXB1YmxpYyBWZWhpY2xlQ29udGVudFByb3ZpZGVyKFZlaGljbGUgaXRlbSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJc3VwZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFZlaGljbGUgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFZlaGljbGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBnZXRNb2RlbCgpLnBhcmVudCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsIGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVmVoaWNsZUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcihPYmplY3QgZWxlbWVudCwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXJldHVybiBuZXcgVmVoaWNsZUxhYmVsUHJvdmlkZXIoKFZlaGljbGUpIGVsZW1lbnQsIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIFZlaGljbGVMYWJlbFByb3ZpZGVyKFZlaGljbGUgdmVoaWNsZSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKHZlaGljbGUsIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVoaWNsZSwgSW1hZ2U+KAotCQkJCQluZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+KChWZWhpY2xlKSBnZXRNb2RlbCgpKSwgCi0JCQkJCVZlaGljbGUuQ09MT1JfUFJPUEVSVFksIFZlaGljbGUuR1JFWUVEX1BST1BFUlRZLCBWZWhpY2xlLlRSQU5TTFVDRU5UX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEltYWdlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5pbWFnZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxWZWhpY2xlLCBTdHJpbmc+KAotCQkJCQluZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFZlaGljbGU+KChWZWhpY2xlKSBnZXRNb2RlbCgpKSwgCi0JCQkJCVZlaGljbGUuVkVISUNMRV9UWVBFX1BST1BFUlRZLCBWZWhpY2xlLkNPTE9SX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuY29sb3IoKS5kZXNjcmlwdGlvbigpICsgJyAnICsgc3ViamVjdC52ZWhpY2xlVHlwZSgpLmRlc2NyaXB0aW9uKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCQlyZXR1cm4gYnVpbGRUZXh0TW9kZWwoKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBUcmVlTm9kZSBleHRlbmRzIEFic3RyYWN0TW9kZWwKLQl7Ci0JCXByaXZhdGUgVHJlZU5vZGUgcGFyZW50OwotCQkKLQkJCi0JCXB1YmxpYyBUcmVlTm9kZShUcmVlTm9kZSBwYXJlbnQpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQl9Ci0JCQotCQkKLQkJcHVibGljIFRyZWVOb2RlIHBhcmVudCgpIHsKLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdCBleHRlbmRzIFRyZWVOb2RlCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgVmVoaWNsZVtdIHZlaGljbGVzOwotCQkKLQkJCi0JCXB1YmxpYyBSb290KCkgewotCQkJc3VwZXIobnVsbCk7Ci0JCQl2ZWhpY2xlcyA9IG5ldyBWZWhpY2xlW10gewotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLkJJQ1lDTEUsIENvbG9yLkJMVUUpLAotCQkJCW5ldyBWZWhpY2xlKHRoaXMsIFZlaGljbGVUeXBlLkNBUiwgQ29sb3IuWUVMTE9XKSwKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5UUlVDSywgQ29sb3IuUkVEKSwKLQkJCQluZXcgVmVoaWNsZSh0aGlzLCBWZWhpY2xlVHlwZS5CT0FULCBDb2xvci5HUkVFTil9OwotCQl9Ci0JCQotCQlwdWJsaWMgVmVoaWNsZVtdIHZlaGljbGVzKCkgewotCQkJcmV0dXJuIHZlaGljbGVzOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZlaGljbGUgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHJpdmF0ZSBWZWhpY2xlVHlwZSB2ZWhpY2xlVHlwZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkVISUNMRV9UWVBFX1BST1BFUlRZID0gInZlaGljbGVUeXBlIjsKLQkJCi0JCXByaXZhdGUgQ29sb3IgY29sb3I7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTE9SX1BST1BFUlRZID0gImNvbG9yIjsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiBncmV5ZWQgPSBmYWxzZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR1JFWUVEX1BST1BFUlRZID0gImdyZXllZCI7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gdHJhbnNsdWNlbnQgPSBmYWxzZTsKLQkJcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVFJBTlNMVUNFTlRfUFJPUEVSVFkgPSAidHJhbnNsdWNlbnQiOwotCQkKLQkJcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQkJCi0JCQkKLQkJcHVibGljIFZlaGljbGUoVHJlZU5vZGUgcGFyZW50LCBWZWhpY2xlVHlwZSB2ZWhpY2xlVHlwZSwgQ29sb3IgY29sb3IpIHsKLQkJCXN1cGVyKHBhcmVudCk7Ci0JCQl0aGlzLnZlaGljbGVUeXBlID0gdmVoaWNsZVR5cGU7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCX0KLQkJCi0JCXB1YmxpYyBWZWhpY2xlVHlwZSB2ZWhpY2xlVHlwZSgpIHsKLQkJCXJldHVybiB2ZWhpY2xlVHlwZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VmVoaWNsZVR5cGUoVmVoaWNsZVR5cGUgbmV3VmVoaWNsZVR5cGUpIHsKLQkJCVZlaGljbGVUeXBlIG9sZFZlaGljbGVUeXBlID0gdmVoaWNsZVR5cGU7Ci0JCQl2ZWhpY2xlVHlwZSA9IG5ld1ZlaGljbGVUeXBlOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWRUhJQ0xFX1RZUEVfUFJPUEVSVFksIG9sZFZlaGljbGVUeXBlLCBuZXdWZWhpY2xlVHlwZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDb2xvciBjb2xvcigpIHsKLQkJCXJldHVybiBjb2xvcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgbmV3Q29sb3IpIHsKLQkJCUNvbG9yIG9sZENvbG9yID0gY29sb3I7Ci0JCQljb2xvciA9IG5ld0NvbG9yOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xPUl9QUk9QRVJUWSwgb2xkQ29sb3IsIG5ld0NvbG9yKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNHcmV5ZWQoKSB7Ci0JCQlyZXR1cm4gZ3JleWVkOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRHcmV5ZWQoYm9vbGVhbiBuZXdHcmV5ZWQpIHsKLQkJCWJvb2xlYW4gb2xkR3JleWVkID0gZ3JleWVkOwotCQkJZ3JleWVkID0gbmV3R3JleWVkOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHUkVZRURfUFJPUEVSVFksIG9sZEdyZXllZCwgbmV3R3JleWVkKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNUcmFuc2x1Y2VudCgpIHsKLQkJCXJldHVybiB0cmFuc2x1Y2VudDsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0VHJhbnNsdWNlbnQoYm9vbGVhbiBuZXdUcmFuc2x1Y2VudCkgewotCQkJYm9vbGVhbiBvbGRUcmFuc2x1Y2VudCA9IHRyYW5zbHVjZW50OwotCQkJdHJhbnNsdWNlbnQgPSBuZXdUcmFuc2x1Y2VudDsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVFJBTlNMVUNFTlRfUFJPUEVSVFksIG9sZFRyYW5zbHVjZW50LCBuZXdUcmFuc2x1Y2VudCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJbWFnZSBpbWFnZSgpIHsKLQkJCWlmIChpbWFnZSAhPSBudWxsKSB7Ci0JCQkJaW1hZ2UuZGlzcG9zZSgpOwotCQkJfQotCQkJCi0JCQlyZXR1cm4gSW1hZ2VGYWN0b3J5LmltYWdlKGNvbG9yKCksIGdyZXllZCwgdHJhbnNsdWNlbnQpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGVudW0gVmVoaWNsZVR5cGUKLQl7Ci0JCUJJQ1lDTEUoImJpY3ljbGUiKSwKLQkJQ0FSKCJjYXIiKSwKLQkJVFJVQ0soInRydWNrIiksCi0JCUJPQVQoImJvYXQiKTsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQkKLQkJcHJpdmF0ZSBWZWhpY2xlVHlwZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBkZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBkZXNjcmlwdGlvbjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBlbnVtIENvbG9yCi0JewotCQlSRUQoInJlZCIsIG5ldyBSR0IoMjU1LCAwLCAwKSksCi0JCUJMVUUoImJsdWUiLCBuZXcgUkdCKDAsIDAsIDI1NSkpLAotCQlZRUxMT1coInllbGxvdyIsIG5ldyBSR0IoMjU1LCAyNTUsIDApKSwKLQkJR1JFRU4oImdyZWVuIiwgbmV3IFJHQigwLCAyNTUsIDApKTsKLQkJCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBSR0IgcmdiOwotCQkKLQkJcHJpdmF0ZSBDb2xvcihTdHJpbmcgZGVzY3JpcHRpb24sIFJHQiByZ2IpIHsKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJCXRoaXMucmdiID0gcmdiOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgUkdCIHJnYigpIHsKLQkJCXJldHVybiByZ2I7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW1hZ2VGYWN0b3J5Ci0JewotCQlwcml2YXRlIHN0YXRpYyBSR0IgcmdiKENvbG9yIGNvbG9yLCBib29sZWFuIGdyZXllZCwgYm9vbGVhbiB0cmFuc2x1Y2VudCkgewotCQkJUkdCIHJnYiA9IChncmV5ZWQpID8gbmV3IFJHQigxMjcsIDEyNywgMTI3KSA6IGNvbG9yLnJnYigpOwotCQkJaWYgKHRyYW5zbHVjZW50KSB7Ci0JCQkJcmdiID0gbmV3IFJHQih0cmFuc2x1Y2lmeShyZ2IucmVkKSwgdHJhbnNsdWNpZnkocmdiLmdyZWVuKSwgdHJhbnNsdWNpZnkocmdiLmJsdWUpKTsKLQkJCX0KLQkJCXJldHVybiByZ2I7Ci0JCX0KLQkJCi0JCXByaXZhdGUgc3RhdGljIGludCB0cmFuc2x1Y2lmeShpbnQgY29sb3IpIHsKLQkJCXJldHVybiAyNTUgLSAoaW50KSAoKDI1NSAtIGNvbG9yKSAqIDAuMyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBzdGF0aWMgSW1hZ2UgaW1hZ2UoQ29sb3IgY29sb3IsIGJvb2xlYW4gZ3JleWVkLCBib29sZWFuIHRyYW5zbHVjZW50KSB7Ci0JCQlQYWxldHRlRGF0YSBwZCA9IG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge3JnYihjb2xvciwgZ3JleWVkLCB0cmFuc2x1Y2VudCl9KTsKLQkJCUltYWdlRGF0YSBpZCA9IG5ldyBJbWFnZURhdGEoMjAsIDIwLCAxLCBwZCk7Ci0JCQlmb3IgKGludCB4ID0gMDsgeCA8IDIwOyB4ICsrKSB7Ci0JCQkJZm9yIChpbnQgeSA9IDA7IHkgPCAyMDsgeSArKykgewotCQkJCQlpZC5zZXRQaXhlbCh4LCB5LCAwKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEltYWdlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBpZCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvamZhY2UvRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhZjRiZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9qZmFjZS9EZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC5qZmFjZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRmlsdGVyaW5nSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRQcm92aWRlclVpVGVzdCBleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBSb290IHJvb3Q7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlPiBzZWxlY3RlZE5vZGU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgY29udHJvbFRyZWU7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdmlld1RyZWU7Ci0KLQlwcml2YXRlIFRleHQgbm9kZU5hbWVUZXh0OwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50UHJvdmlkZXJVaVRlc3QoYXJncyk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIERlbGVnYXRpbmdUcmVlQ29udGVudFByb3ZpZGVyVWlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMucm9vdCA9IG5ldyBSb290KCk7Ci0JCXRoaXMucm9vdC5hZGRDaGlsZCgiUGFyZW50XzEiKTsKLQkJdGhpcy5zZWxlY3RlZE5vZGUgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlPih0aGlzLnJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1aWxkVHJlZVBhbmVsKG1haW5QYW5lbCk7Ci0JCWJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVHJlZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCB0cnVlKSk7Ci0JCWJ1aWxkQ29udHJvbFRyZWVQYW5lbChwYW5lbCk7Ci0JCWJ1aWxkVmlld1RyZWVQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFRyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRyb2xUcmVlID0gYnVpbGRUcmVlUGFuZWwoCi0JCQkJcGFyZW50LCAiQ29udHJvbCB0cmVlIiwKLQkJCQluZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcihuZXcgQ29udHJvbFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpKSwKLQkJCQluZXcgTGFiZWxQcm92aWRlcigpKTsKLQkJY29udHJvbFRyZWUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJY29udHJvbFRyZWUuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGV2ZW50LmdldE5ld1ZhbHVlKCkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVmlld1RyZWVQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXZpZXdUcmVlID0gYnVpbGRUcmVlUGFuZWwoCi0JCQkJcGFyZW50LCAiVmlldyB0cmVlIiwKLQkJCQluZXcgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcihuZXcgVmlld1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpKSwKLQkJCQluZXcgTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgYnVpbGRUcmVlUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsVGV4dCwgSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuQkVHSU5OSU5HLCBHcmlkRGF0YS5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQlsYWJlbC5zZXRUZXh0KGxhYmVsVGV4dCk7Ci0KLQkJZmluYWwgVHJlZVZpZXdlciB0cmVlID0gbmV3IFRyZWVWaWV3ZXIocGFuZWwsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJdHJlZS5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQl0cmVlLnNldExhYmVsUHJvdmlkZXIobGFiZWxQcm92aWRlcik7Ci0JCXRyZWUuc2V0SW5wdXQocm9vdCk7Ci0KLQkJcmV0dXJuIHRyZWU7Ci0JfQotCi0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGJ1aWxkVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTm9kZSBzZWxlY3Rpb24gPSAoVHJlZU5vZGUpICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlzZWxlY3RlZE5vZGUuc2V0VmFsdWUoKHNlbGVjdGlvbiA9PSBudWxsKSA/IHJvb3QgOiBzZWxlY3Rpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgR3JpZExheW91dCg2LCBmYWxzZSkpOwotCQlidWlsZE5vZGVOYW1lVGV4dChwYW5lbCk7Ci0JCWJ1aWxkQWRkQ2hpbGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRBZGROZXN0ZWRDaGlsZEFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlidWlsZENsZWFyTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQkJYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROb2RlTmFtZVRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlub2RlTmFtZVRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJbm9kZU5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRDaGlsZEFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkFkZCBjaGlsZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFkZENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiQWRkIGEgY2hpbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSIpOwotCQlzZWxlY3RlZE5vZGUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsCi0JCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlhY3Rpb24uc2V0RW5hYmxlZCgoKFRyZWVOb2RlKSBldmVudC5nZXROZXdWYWx1ZSgpKS5jYW5IYXZlQ2hpbGRyZW4oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGROZXN0ZWRDaGlsZEFDSSgpIHsKLQkJZmluYWwgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oIkFkZCBuZXN0ZWQgY2hpbGQiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlhZGROZXN0ZWRDaGlsZCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIkFkZCBhIG5lc3RlZCBjaGlsZCB3aXRoIHRoZSBnaXZlbiBuYW1lIik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoKChUcmVlTm9kZSkgZXZlbnQuZ2V0TmV3VmFsdWUoKSkuY2FuSGF2ZU5lc3RlZENoaWxkcmVuKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlmaW5hbCBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcmVtb3ZlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiUmVtb3ZlIHRoZSBzZWxlY3RlZCBub2RlIik7Ci0JCWFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJc2VsZWN0ZWROb2RlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCW5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJYWN0aW9uLnNldEVuYWJsZWQoZXZlbnQuZ2V0TmV3VmFsdWUoKSAhPSByb290KTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJDbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJDbGVhciB0aGUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiUmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoIlJlc3RvcmUgdGhlIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgYWRkQ2hpbGQoKSB7Ci0JCVN0cmluZyBub2RlTmFtZSA9IG5vZGVOYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCWlmIChub2RlTmFtZS5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKS5hZGRDaGlsZChub2RlTmFtZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZE5lc3RlZENoaWxkKCkgewotCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlTmFtZVRleHQuZ2V0VGV4dCgpOwotCQlpZiAobm9kZU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJc2VsZWN0ZWROb2RlLmdldFZhbHVlKCkuYWRkTmVzdGVkQ2hpbGQobm9kZU5hbWUpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmUoKSB7Ci0JCVRyZWVOb2RlIG5vZGUgPSBzZWxlY3RlZE5vZGUuZ2V0VmFsdWUoKTsKLQkJbm9kZS5wYXJlbnQoKS5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCWNvbnRyb2xUcmVlLnNldElucHV0KG51bGwpOwotCQl2aWV3VHJlZS5zZXRJbnB1dChudWxsKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJY29udHJvbFRyZWUuc2V0SW5wdXQocm9vdCk7Ci0JCXZpZXdUcmVlLnNldElucHV0KHJvb3QpOwotCX0KLQotCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkJcmV0dXJuIG5ldyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJKFRyZWVOb2RlKSBpdGVtLCAoRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcikgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgQ29udHJvbFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCi0JfQotCi0KLQlzdGF0aWMgY2xhc3MgVmlld1RyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBhcmVudCkgewotCQkJCXJldHVybiBuZXcgVmlld1RyZWVQYXJlbnRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCQkJKFBhcmVudCkgaXRlbSwgKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgR2VuZXJpY1RyZWVJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxUcmVlTm9kZT4KLQl7Ci0JCXB1YmxpYyBHZW5lcmljVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJVHJlZU5vZGUgdHJlZU5vZGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCQlzdXBlcih0cmVlTm9kZSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBUcmVlTm9kZSB0cmVlTm9kZSgpIHsKLQkJCXJldHVybiAoVHJlZU5vZGUpIGdldE1vZGVsKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFRyZWVOb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0cmVlTm9kZSgpLnBhcmVudCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUcmVlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxUcmVlTm9kZSwgVHJlZU5vZGU+KFRyZWVOb2RlLkNISUxEUkVOX0xJU1QsIHRyZWVOb2RlKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gdHJlZU5vZGUoKS5jaGlsZHJlbigpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFZpZXdUcmVlUGFyZW50SXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEdlbmVyaWNUcmVlSXRlbUNvbnRlbnRQcm92aWRlcgotCXsKLQkJcHVibGljIFZpZXdUcmVlUGFyZW50SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlUcmVlTm9kZSB0cmVlTm9kZSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCXN1cGVyKHRyZWVOb2RlLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUcmVlTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlUcmVlTm9kZSBwYXJlbnQgPSBzdXBlci5nZXRQYXJlbnQoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LnBhcmVudCgpOwotCQkJfQotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlLCBUcmVlTm9kZT4oc3VwZXIuYnVpbGRDaGlsZHJlbk1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFRyZWVOb2RlPiB0cmFuc2Zvcm0oVHJlZU5vZGUgdmFsdWUpIHsKLQkJCQkJCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBOZXN0KSB7Ci0JCQkJCQkJCWZpbmFsIE5lc3QgbmVzdCA9IChOZXN0KSB2YWx1ZTsKLQkJCQkJCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFRyZWVOb2RlPigKLQkJCQkJCQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VHJlZU5vZGUsIFRyZWVOb2RlPihUcmVlTm9kZS5DSElMRFJFTl9MSVNULCBuZXN0KSB7Ci0JCQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRyZWVOb2RlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCQkJCQkJCQkJcmV0dXJuIG5lc3QuY2hpbGRyZW4oKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCSk7Ci0JCQkJCQkJfQotCQkJCQkJCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8VHJlZU5vZGU+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHZhbHVlKSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzZUxhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlcgotCXsKLQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuICgoVHJlZU5vZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGFic3RyYWN0IGNsYXNzIFRyZWVOb2RlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCXsKLQkJcHJpdmF0ZSBUcmVlTm9kZSBwYXJlbnQ7Ci0KLQkJcHJvdGVjdGVkIGZpbmFsIExpc3Q8VHJlZU5vZGU+IGNoaWxkcmVuOwotCQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSElMRFJFTl9MSVNUID0gImNoaWxkcmVuIjsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGUgcGFyZW50KCkgewotCQkJcmV0dXJuIHBhcmVudDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxUcmVlTm9kZT4oY2hpbGRyZW4pOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCWFkZEl0ZW1Ub0xpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQlyZW1vdmVJdGVtRnJvbUxpc3QoY2hpbGQsIGNoaWxkcmVuLCBDSElMRFJFTl9MSVNUKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkKGludCBpbmRleCkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCBjaGlsZHJlbiwgQ0hJTERSRU5fTElTVCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJCW5hbWUgPSBuZXdOYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIFJvb3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIFJvb3QoKSB7Ci0JCQlzdXBlcihudWxsLCBudWxsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBjYW5IYXZlQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhZGRDaGlsZChTdHJpbmcgbmFtZSkgewotCQkJYWRkQ2hpbGQobmV3IFBhcmVudCh0aGlzLCBuYW1lKSk7Ci0JCX0KLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBQYXJlbnQgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIFBhcmVudChUcmVlTm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgQ2hpbGQodGhpcywgbmFtZSkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGNhbkhhdmVOZXN0ZWRDaGlsZHJlbigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZE5lc3RlZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlUcmVlTm9kZSBuZXN0ID0gbmV3IE5lc3QodGhpcyk7Ci0JCQlhZGRDaGlsZChuZXN0KTsKLQkJCW5lc3QuYWRkQ2hpbGQobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8Q2hpbGQ+IG5lc3RsZXNzQ2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPENoaWxkPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8VHJlZU5vZGUsIENoaWxkPihjaGlsZHJlbigpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBDaGlsZCB0cmFuc2Zvcm0oVHJlZU5vZGUgbmV4dCkgewotCQkJCQkJCWlmIChuZXh0IGluc3RhbmNlb2YgTmVzdCkgewotCQkJCQkJCQlyZXR1cm4gKChOZXN0KSBuZXh0KS5jaGlsZCgpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gKENoaWxkKSBuZXh0OwotCQkJCQkJfQotCQkJCQl9LAotCQkJCQlOb3ROdWxsRmlsdGVyLjxDaGlsZD5pbnN0YW5jZSgpCi0JCQkJKTsKLQkJfQotCX0KLQotCi0Jc3RhdGljIGNsYXNzIE5lc3QgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIE5lc3QoVHJlZU5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsICJuZXN0Iik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgewotCQkJcmV0dXJuIGNoaWxkcmVuLnNpemUoKSA9PSAwOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFkZENoaWxkKFN0cmluZyBuYW1lKSB7Ci0JCQlhZGRDaGlsZChuZXcgQ2hpbGQodGhpcywgbmFtZSkpOwotCQl9Ci0KLQkJLyogY2FuIG9ubHkgaGF2ZSBvbmUgY2hpbGQgKi8KLQkJcHVibGljIENoaWxkIGNoaWxkKCkgewotCQkJcmV0dXJuIChjaGlsZHJlbi5pc0VtcHR5KCkpID8gbnVsbCA6IChDaGlsZCkgY2hpbGRyZW4uZ2V0KDApOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBUcmVlTm9kZQotCXsKLQkJcHVibGljIENoaWxkKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg3ZDllLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlci5TZWxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5BYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZEVtcHR5TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+KCk7Ci0JCXBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8TW9kZWwsIFNpbXBsZURpc3BsYXlhYmxlPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5JVEVNU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U2ltcGxlRGlzcGxheWFibGU+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXRlbXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0Lml0ZW1zU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBBYnN0cmFjdENvbWJvTW9kZWxBZGFwdGVyPFNpbXBsZURpc3BsYXlhYmxlPiBidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgU2ltcGxlRGlzcGxheWFibGUgYnVpbGRTZWxlY3RlZEl0ZW0oKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRGlzcGxheWFibGUoImJheiIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNb2RlbCwgU2ltcGxlRGlzcGxheWFibGU+KHN1YmplY3RIb2xkZXIsIE1vZGVsLklURU1fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNpbXBsZURpc3BsYXlhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEl0ZW0oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU2ltcGxlRGlzcGxheWFibGUgdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldEl0ZW0odmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxTaW1wbGVEaXNwbGF5YWJsZT4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTaW1wbGVEaXNwbGF5YWJsZSB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgPT0gbnVsbCkgPyAiIiA6IHZhbHVlLmRpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBidWlsZFN1YmplY3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPigpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY29tYm9TZWxlY3RlZEl0ZW0oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBpdGVtQXQoaW50IGluZGV4KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgaXRlbUNvdW50cygpOwotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFNpbXBsZURpc3BsYXlhYmxlPiBjKSB7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiZm9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImJhciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXoiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiam9vIikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImphciIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXoiKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNpbXBsZURpc3BsYXlhYmxlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBzZWxlY3RlZEl0ZW1Ib2xkZXI7Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJbW9kZWwgICAgICAgICAgICAgID0gbmV3IE1vZGVsKCk7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCQlzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTaGVsbCBzaGVsbCgpIHsKLQkJcmV0dXJuIHNoZWxsOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gc3ViamVjdEhvbGRlcigpIHsKLQkJcmV0dXJuIHN1YmplY3RIb2xkZXI7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbnVsbDsKLQkJc3ViamVjdEhvbGRlciAgICAgID0gbnVsbDsKLQkJc2VsZWN0ZWRJdGVtSG9sZGVyID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdEl0ZW1zKCkgewotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgY291bnQgb2YgaXRlbXMgaXMgbm90IGluIHN5bmMgd2l0aCB0aGUgbW9kZWwiLAotCQkJbW9kZWwuaXRlbXNTaXplKCksCi0JCQlpdGVtQ291bnRzKCkKLQkJKTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbW9kZWwuaXRlbXNTaXplKCk7IGluZGV4KyspIHsKLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGl0ZW0gYXQgaW5kZXggIiArIGluZGV4ICsgIiBpcyBub3QgdGhlIHNhbWUgYmV0d2VlbiB0aGUgbW9kZWwgYW5kIHRoZSBjb21ibyIsCi0JCQkJbW9kZWwuaXRlbUF0KGluZGV4KS5kaXNwbGF5U3RyaW5nKCksCi0JCQkJaXRlbUF0KGluZGV4KQotCQkJKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRBZnRlcl9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRBZnRlcl9SZW1vdmVJdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfQWRkZWRCZWZvcmVfUmVtb3ZlSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQotCQlBcnJheUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGl0ZW1zID0gbmV3IEFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4oKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgwKSk7Ci0JCWl0ZW1zLmFkZChtb2RlbC5pdGVtQXQoMykpOwotCQltb2RlbC5yZW1vdmVJdGVtcyhpdGVtcy5pdGVyYXRvcigpKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9BZGRlZEJlZm9yZV9SZW1vdmVJdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckFmdGVyX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckFmdGVyX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEFmdGVyX051bGxTZWxlY3RlZEl0ZW1fSXRlbXNBZnRlckJlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RBZnRlcl9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zQWZ0ZXJCZWZvcmVfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0JlZm9yZV9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc0JlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfTnVsbFNlbGVjdGVkSXRlbV9Ob0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QWZ0ZXJfU2VsZWN0ZWRJdGVtQ2hhbmdlZF9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDApOwotCi0JCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGFkYXB0ZXIgPSBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBidWlsZFNlbGVjdGVkSXRlbSgpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1BZnRlcl9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGJ1aWxkU2VsZWN0ZWRJdGVtKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUFmdGVyX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gbGlzdCA9IGJ1aWxkTGlzdCgpOwotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBsaXN0LmdldCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9Ob25OdWxsU2VsZWN0ZWRJdGVtQWZ0ZXJfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQltb2RlbC5hZGRJdGVtcyhidWlsZExpc3QoKSk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IG1vZGVsLml0ZW1BdCgwKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0KLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX05vbk51bGxTZWxlY3RlZEl0ZW1CZWZvcmVfSXRlbXNfUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPiBsaXN0ID0gYnVpbGRMaXN0KCk7Ci0JCVNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSA9IGxpc3QuZ2V0KDApOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCWJ1aWxkUmVhZE9ubHlDb21ib01vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRGYWxzZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfTm9uTnVsbFNlbGVjdGVkSXRlbUJlZm9yZV9SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxpc3Q8U2ltcGxlRGlzcGxheWFibGU+IGxpc3QgPSBidWlsZExpc3QoKTsKLQkJU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtID0gbGlzdC5nZXQoMCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCi0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0KLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX1JlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtb2RlbCk7Ci0KLQkJYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gaXMgc3VwcG9zZWQgdG8gcmVtYWluIG51bGwiLCBtb2RlbC5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROb25OdWxsU3ViamVjdEJlZm9yZV9OdWxsU2VsZWN0ZWRJdGVtX05vSXRlbXNfRWRpdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnROdWxsKCJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byByZW1haW4gbnVsbCIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE5vbk51bGxTdWJqZWN0QmVmb3JlX051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCi0JCWFzc2VydEZhbHNlKCJUaGUgaXRlbSB3YXNuJ3Qgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBzZWxlY3RlZCBpdGVtIGlzIHN1cHBvc2VkIHRvIHJlbWFpbiBudWxsIiwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uTnVsbFN1YmplY3RCZWZvcmVfU2VsZWN0ZWRJdGVtQ2hhbmdlZF9FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCW1vZGVsLmFkZEl0ZW1zKGJ1aWxkTGlzdCgpKTsKLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMyk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCUFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI8U2ltcGxlRGlzcGxheWFibGU+IGFkYXB0ZXIgPSBidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJYWRhcHRlci5hZGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0RmFsc2UoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShudWxsKTsKLQotCQl0ZXN0U2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdE51bGxTdWJqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gc2hvdWxkIGJlIG51bGwiLCBzZWxlY3RlZEl0ZW1Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJc2VsZWN0ZWRJdGVtSG9sZGVyLnNldFZhbHVlKGJ1aWxkU2VsZWN0ZWRJdGVtKCkpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGl0ZW0gd2Fzbid0IHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCi0JCS8vIE51bGwgYmVjYXVzZSB0aGUgc3ViamVjdCBob2xkZXIgZG9lc24ndCBoYXZlIHRoZSBzdWJqZWN0IHNldAotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCQl0ZXN0SXRlbXMoKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3ViamVjdF9OdWxsU2VsZWN0ZWRJdGVtX0l0ZW1zX0VkaXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1aWxkRWRpdGFibGVDb21ib01vZGVsQWRhcHRlcigpOwotCQl0ZXN0TnVsbFN1YmplY3QoKTsKLQkJdGVzdEl0ZW1zKCk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN1YmplY3RfTnVsbFNlbGVjdGVkSXRlbV9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19FZGl0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZEVkaXRhYmxlQ29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdE51bGxTdWJqZWN0X051bGxTZWxlY3RlZEl0ZW1fTm9JdGVtc19SZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlidWlsZFJlYWRPbmx5Q29tYm9Nb2RlbEFkYXB0ZXIoKTsKLQkJdGVzdE51bGxTdWJqZWN0KCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfQWRkZWRBZnRlcigpIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQkJbW9kZWwuYWRkSXRlbXMoYnVpbGRMaXN0KCkpOwotCi0JCXRlc3RTZWxlY3RlZEl0ZW0obnVsbCk7Ci0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCi0JCUFycmF5TGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlpdGVtcy5hZGQobW9kZWwuaXRlbUF0KDApKTsKLQkJaXRlbXMuYWRkKG1vZGVsLml0ZW1BdCgzKSk7Ci0JCW1vZGVsLnJlbW92ZUl0ZW1zKGl0ZW1zLml0ZXJhdG9yKCkpOwotCi0JCXRlc3RJdGVtcygpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtKFNpbXBsZURpc3BsYXlhYmxlIHNlbGVjdGVkSXRlbSkgewotCi0JCWlmIChzZWxlY3RlZEl0ZW0gPT0gbnVsbCkgewotCi0JCQlhc3NlcnROdWxsKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSBpcyBzdXBwb3NlZCB0byBiZSBudWxsIiwKLQkJCQltb2RlbC5nZXRJdGVtKCkKLQkJCSk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIGNvbWJvJ3Mgc2VsZWN0ZWQgaXRlbSBzaG91bGQgYmUgbnVsbCIsCi0JCQkJIiIsCi0JCQkJY29tYm9TZWxlY3RlZEl0ZW0oKQotCQkJKTsKLQkJfQotCQllbHNlIGlmICghZW1wdHlDb21ib0NhbkhhdmVTZWxlY3RlZFZhbHVlKCkpIHsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IGNvcnJlY3RseSIsCi0JCQkJc2VsZWN0ZWRJdGVtLAotCQkJCW1vZGVsLmdldEl0ZW0oKQotCQkJKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgY29tYm8ncyBzZWxlY3RlZCBpdGVtIHNob3VsZCBiZSBudWxsIiwKLQkJCQkiIiwKLQkJCQljb21ib1NlbGVjdGVkSXRlbSgpCi0JCQkpOwotCQl9Ci0JCWVsc2UgewotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0sCi0JCQkJbW9kZWwuZ2V0SXRlbSgpCi0JCQkpOwotCi0JCQlhc3NlcnRFcXVhbHMoCi0JCQkJIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgY29ycmVjdGx5IiwKLQkJCQlzZWxlY3RlZEl0ZW0uZGlzcGxheVN0cmluZygpLAotCQkJCWNvbWJvU2VsZWN0ZWRJdGVtKCkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFNlbGVjdGVkSXRlbUNoYW5nZWQoU2ltcGxlRGlzcGxheWFibGUgc2VsZWN0ZWRJdGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lcikgewotCi0JCS8vIFRlc3QgMQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIHNlbGVjdGVkSXRlbSwgbW9kZWwuZ2V0SXRlbSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGlvbkxpc3RlbmVyLmlzTGlzdGVuZXJOb3RpZmllZCgpKTsKLQkJYXNzZXJ0U2FtZSgiVGhlIFNlbGVjdGlvbkxpc3RlbmVyIHdhcyBzdXBwb3NlZCB0byBiZSBub3RpZmllZCIsIHNlbGVjdGVkSXRlbSwgc2VsZWN0aW9uTGlzdGVuZXIuZ2V0SXRlbSgpKTsKLQkJdGVzdFNlbGVjdGVkSXRlbShzZWxlY3RlZEl0ZW0pOwotCi0JCS8vIFRlc3QgMgotCQlzZWxlY3RlZEl0ZW0gPSBtb2RlbC5pdGVtQXQoMSk7Ci0JCW1vZGVsLmNsZWFySXRlbUNhbGxlZEZsYWcoKTsKLQkJc2VsZWN0aW9uTGlzdGVuZXIuY2xlYXJJbmZvKCk7Ci0KLQkJbW9kZWwuc2V0SXRlbShzZWxlY3RlZEl0ZW0pOwotCQlhc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXMgc3VwcG9zZWQgdG8gYmUgbW9kaWZpZWQiLCBtb2RlbC5pc1NldEl0ZW1DYWxsZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhc24ndCBzZXQgcHJvcGVybHkiLCBzZWxlY3RlZEl0ZW0sIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDMKLQkJc2VsZWN0ZWRJdGVtID0gbnVsbDsKLQkJbW9kZWwuY2xlYXJJdGVtQ2FsbGVkRmxhZygpOwotCQlzZWxlY3Rpb25MaXN0ZW5lci5jbGVhckluZm8oKTsKLQotCQltb2RlbC5zZXRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JCWFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtIHdhcyBzdXBwb3NlZCB0byBiZSBtb2RpZmllZCIsIG1vZGVsLmlzU2V0SXRlbUNhbGxlZCgpKTsKLQkJYXNzZXJ0TnVsbCgiVGhlIHNlbGVjdGVkIGl0ZW0gd2Fzbid0IHNldCBwcm9wZXJseSIsIG1vZGVsLmdldEl0ZW0oKSk7Ci0JCWFzc2VydFRydWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3Rpb25MaXN0ZW5lci5pc0xpc3RlbmVyTm90aWZpZWQoKSk7Ci0JCWFzc2VydFNhbWUoIlRoZSBTZWxlY3Rpb25MaXN0ZW5lciB3YXMgc3VwcG9zZWQgdG8gYmUgbm90aWZpZWQiLCBzZWxlY3RlZEl0ZW0sIHNlbGVjdGlvbkxpc3RlbmVyLmdldEl0ZW0oKSk7Ci0JCXRlc3RTZWxlY3RlZEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQotCQkvLyBUZXN0IDMKLQkJc2VsZWN0ZWRJdGVtID0gbW9kZWwuaXRlbUF0KDIpOwotCQltb2RlbC5jbGVhckl0ZW1DYWxsZWRGbGFnKCk7Ci0JCXNlbGVjdGlvbkxpc3RlbmVyLmNsZWFySW5mbygpOwotCi0JCW1vZGVsLnNldEl0ZW0oc2VsZWN0ZWRJdGVtKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIHNlbGVjdGVkIGl0ZW0gd2FzIHN1cHBvc2VkIHRvIGJlIG1vZGlmaWVkIiwgbW9kZWwuaXNTZXRJdGVtQ2FsbGVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgc2VsZWN0ZWQgaXRlbSB3YXNuJ3Qgc2V0IHByb3Blcmx5Iiwgc2VsZWN0ZWRJdGVtLCBtb2RlbC5nZXRJdGVtKCkpOwotCQlhc3NlcnRUcnVlKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0aW9uTGlzdGVuZXIuaXNMaXN0ZW5lck5vdGlmaWVkKCkpOwotCQlhc3NlcnRTYW1lKCJUaGUgU2VsZWN0aW9uTGlzdGVuZXIgd2FzIHN1cHBvc2VkIHRvIGJlIG5vdGlmaWVkIiwgc2VsZWN0ZWRJdGVtLCBzZWxlY3Rpb25MaXN0ZW5lci5nZXRJdGVtKCkpOwotCQl0ZXN0U2VsZWN0ZWRJdGVtKHNlbGVjdGVkSXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGl0ZW07Ci0JCXByaXZhdGUgTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PFNpbXBsZURpc3BsYXlhYmxlPigpOwotCQlwcml2YXRlIGJvb2xlYW4gc2V0SXRlbUNhbGxlZDsKLQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIElURU1fUFJPUEVSVFkgPSAiaXRlbSI7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgSVRFTVNfTElTVCA9ICJpdGVtcyI7Ci0KLQkJdm9pZCBhZGRJdGVtcyhJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMpIHsKLQkJCWFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCB0aGlzLml0ZW1zLCBJVEVNU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgYWRkSXRlbXMoTGlzdDxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMpIHsKLQkJCWFkZEl0ZW1zVG9MaXN0KGl0ZW1zLCB0aGlzLml0ZW1zLCBJVEVNU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgY2xlYXJJdGVtQ2FsbGVkRmxhZygpIHsKLQkJCXNldEl0ZW1DYWxsZWQgPSBmYWxzZTsKLQkJfQotCi0JCVNpbXBsZURpc3BsYXlhYmxlIGdldEl0ZW0oKSB7Ci0JCQlyZXR1cm4gaXRlbTsKLQkJfQotCi0JCWJvb2xlYW4gaXNTZXRJdGVtQ2FsbGVkKCkgewotCQkJcmV0dXJuIHNldEl0ZW1DYWxsZWQ7Ci0JCX0KLQotCQlTaW1wbGVEaXNwbGF5YWJsZSBpdGVtQXQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5pdGVtcy5nZXQoaW5kZXgpOwotCQl9Ci0KLQkJTGlzdEl0ZXJhdG9yPFNpbXBsZURpc3BsYXlhYmxlPiBpdGVtcygpIHsKLQkJCXJldHVybiBpdGVtcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCi0JCWludCBpdGVtc1NpemUoKSB7Ci0JCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVJdGVtcyhJdGVyYXRvcjxTaW1wbGVEaXNwbGF5YWJsZT4gaXRlbXMpIHsKLQkJCXJlbW92ZUl0ZW1zRnJvbUxpc3QoaXRlbXMsIHRoaXMuaXRlbXMsIElURU1TX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCBzZXRJdGVtKFNpbXBsZURpc3BsYXlhYmxlIGl0ZW0pIHsKLQkJCXNldEl0ZW1DYWxsZWQgPSB0cnVlOwotCi0JCQlTaW1wbGVEaXNwbGF5YWJsZSBvbGRJdGVtID0gdGhpcy5pdGVtOwotCQkJdGhpcy5pdGVtID0gaXRlbTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoSVRFTV9QUk9QRVJUWSwgb2xkSXRlbSwgaXRlbSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvbkxpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXI8U2ltcGxlRGlzcGxheWFibGU+IHsKLQotCQlwcml2YXRlIFNpbXBsZURpc3BsYXlhYmxlIGl0ZW07Ci0JCXByaXZhdGUgYm9vbGVhbiBsaXN0ZW5lck5vdGlmaWVkOwotCi0JCXZvaWQgY2xlYXJJbmZvKCkgewotCQkJdGhpcy5saXN0ZW5lck5vdGlmaWVkID0gZmFsc2U7Ci0JCQl0aGlzLml0ZW0gPSBudWxsOwotCQl9Ci0KLQkJU2ltcGxlRGlzcGxheWFibGUgZ2V0SXRlbSgpIHsKLQkJCXJldHVybiBpdGVtOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMaXN0ZW5lck5vdGlmaWVkKCkgewotCQkJcmV0dXJuIGxpc3RlbmVyTm90aWZpZWQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PFNpbXBsZURpc3BsYXlhYmxlPiBlKSB7Ci0JCQlsaXN0ZW5lck5vdGlmaWVkID0gdHJ1ZTsKLQkJCWl0ZW0gPSBlLnNlbGVjdGVkSXRlbSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0NvbWJvTW9kZWxBZGFwdGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjM3OTMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9Db21ib01vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkFic3RyYWN0Q29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29tYm9Nb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotCi1wdWJsaWMgY2xhc3MgQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBDb21ibyBjb21ibzsKLQlwcml2YXRlIGJvb2xlYW4gZWRpdGFibGU7Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRFZGl0YWJsZUNvbWJvTW9kZWxBZGFwdGVyKCkgewotCi0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsKCksIFNXVC5OVUxMKTsKLQkJZWRpdGFibGUgPSB0cnVlOwotCi0JCXJldHVybiBDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RDb21ib01vZGVsQWRhcHRlcjxTaW1wbGVEaXNwbGF5YWJsZT4gYnVpbGRSZWFkT25seUNvbWJvTW9kZWxBZGFwdGVyKCkgewotCi0JCWNvbWJvID0gbmV3IENvbWJvKHNoZWxsKCksIFNXVC5SRUFEX09OTFkpOwotCQllZGl0YWJsZSA9IGZhbHNlOwotCi0JCXJldHVybiBDb21ib01vZGVsQWRhcHRlci5hZGFwdCgKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQljb21ibywKLQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbWJvU2VsZWN0ZWRJdGVtKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGVtcHR5Q29tYm9DYW5IYXZlU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIGVkaXRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgaXRlbUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb21iby5nZXRJdGVtKGluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGl0ZW1Db3VudHMoKSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtQ291bnQoKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQljb21ibyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9KcHRVaVNXVFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2Y1ZDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L0pwdFVpU1dUVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnN3dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5KVW5pdDRUZXN0QWRhcHRlcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKLWltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZS5TdWl0ZUNsYXNzZXM7Ci0KLUBTdWl0ZUNsYXNzZXMKLSh7Ci0JQ29tYm9Nb2RlbEFkYXB0ZXJUZXN0LmNsYXNzLAotCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmNsYXNzLAotCVRhYmxlTW9kZWxBZGFwdGVyVGVzdC5jbGFzcwotfSkKLUBSdW5XaXRoKFN1aXRlLmNsYXNzKQotcHVibGljIGZpbmFsIGNsYXNzIEpwdFVpU1dUVGVzdHMgewotCi0JcHJpdmF0ZSBKcHRVaVNXVFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoKTsKLQkJc3VpdGUuYWRkVGVzdChuZXcgSlVuaXQ0VGVzdEFkYXB0ZXIoSnB0VWlTV1RUZXN0cy5jbGFzcykpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3OTJhNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvU3Bpbm5lck1vZGVsQWRhcHRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0IHsKLQotCXByaXZhdGUgTW9kZWwgbW9kZWw7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1vZGVsPiBzdWJqZWN0SG9sZGVyOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNb2RlbD4oKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1vZGVsLCBJbnRlZ2VyPihzdWJqZWN0SG9sZGVyLCBNb2RlbC5WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJc2hlbGwgICAgICAgICAgICAgID0gbmV3IFNoZWxsKERpc3BsYXkuZ2V0Q3VycmVudCgpKTsKLQkJbW9kZWwgICAgICAgICAgICAgID0gbmV3IE1vZGVsKCk7Ci0JCXN1YmplY3RIb2xkZXIgICAgICA9IGJ1aWxkU3ViamVjdEhvbGRlcigpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXNoZWxsLmRpc3Bvc2UoKTsKLQkJfQotCi0JCXNoZWxsICAgICAgICAgPSBudWxsOwotCQlzdWJqZWN0SG9sZGVyID0gbnVsbDsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REaXNwb3NlZCgpIHsKLQotCQlpbnQgdmFsdWUgPSAyOwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCW1vZGVsLmNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgbW9kZWwncyB2YWx1ZSIsCi0JCQltb2RlbC5nZXRWYWx1ZSgpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgbW9kZWwKLQkJc3Bpbm5lci5kaXNwb3NlKCk7Ci0KLQkJdmFsdWUgPSA0OwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzb21laG93IGNoYW5nZWQiLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW1vZGVsLmdldFZhbHVlKCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbl8xKCkgewotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgdmFsdWUiLAotCQkJZGVmYXVsdFZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydE51bGwoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgbnVsbCIsCi0JCQludW1iZXJIb2xkZXIuZ2V0VmFsdWUoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uXzIoKSB7Ci0KLQkJU3Bpbm5lciBzcGlubmVyID0gbmV3IFNwaW5uZXIoc2hlbGwsIFNXVC5OVUxMKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gbnVtYmVySG9sZGVyID0gYnVpbGRWYWx1ZUhvbGRlcigpOwotCQlpbnQgZGVmYXVsdFZhbHVlID0gMTsKLQotCQlTcGlubmVyTW9kZWxBZGFwdGVyLmFkYXB0KAotCQkJbnVtYmVySG9sZGVyLAotCQkJc3Bpbm5lciwKLQkJCWRlZmF1bHRWYWx1ZQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgc3Bpbm5lcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgZGVmYXVsdCB2YWx1ZSIsCi0JCQlkZWZhdWx0VmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0TnVsbCgKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSBudWxsIiwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fMygpIHsKLQotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1vZGVsKTsKLQotCQlTcGlubmVyIHNwaW5uZXIgPSBuZXcgU3Bpbm5lcihzaGVsbCwgU1dULk5VTEwpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBudW1iZXJIb2xkZXIgPSBidWlsZFZhbHVlSG9sZGVyKCk7Ci0JCWludCBkZWZhdWx0VmFsdWUgPSAxOwotCi0JCVNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRhcHQoCi0JCQludW1iZXJIb2xkZXIsCi0JCQlzcGlubmVyLAotCQkJZGVmYXVsdFZhbHVlCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnROdWxsKAotCQkJIlRoZSBudW1iZXIgaG9sZGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwiLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6YXRpb25fNCgpIHsKLQotCQlpbnQgdmFsdWUgPSAyOwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCW1vZGVsLmNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIHZhbHVlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG51bWJlciBob2xkZXIncyB2YWx1ZSBzaG91bGQgYmUgIiArIHZhbHVlLAotCQkJSW50ZWdlci52YWx1ZU9mKHZhbHVlKSwKLQkJCW51bWJlckhvbGRlci5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIG1vZGVsIHNob3VsZCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgdmFsdWUgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwKLQkJCW1vZGVsLmlzU2V0VmFsdWVDYWxsZWQoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFZhbHVlQ2hhbmdlZCgpIHsKLQotCQlpbnQgdmFsdWUgPSAyOwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCW1vZGVsLmNsZWFyU2V0VmFsdWVDYWxsZWRGbGFnKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobW9kZWwpOwotCi0JCVNwaW5uZXIgc3Bpbm5lciA9IG5ldyBTcGlubmVyKHNoZWxsLCBTV1QuTlVMTCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IG51bWJlckhvbGRlciA9IGJ1aWxkVmFsdWVIb2xkZXIoKTsKLQkJaW50IGRlZmF1bHRWYWx1ZSA9IDE7Ci0KLQkJU3Bpbm5lck1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCW51bWJlckhvbGRlciwKLQkJCXNwaW5uZXIsCi0JCQlkZWZhdWx0VmFsdWUKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgY29taW5nIGZyb20gdGhlIG1vZGVsIiwKLQkJCXZhbHVlLAotCQkJc3Bpbm5lci5nZXRTZWxlY3Rpb24oKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbnVtYmVyIGhvbGRlcidzIHZhbHVlIHNob3VsZCBiZSB0aGUgbW9kZWwncyB2YWx1ZSIsCi0JCQltb2RlbC5nZXRWYWx1ZSgpLAotCQkJbnVtYmVySG9sZGVyLmdldFZhbHVlKCkKLQkJKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgbW9kZWwgc2hvdWxkIG5vdCBoYXZlIHJlY2VpdmVkIHRoZSB2YWx1ZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLAotCQkJbW9kZWwuaXNTZXRWYWx1ZUNhbGxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB2YWx1ZSBpbiB0aGUgbW9kZWwKLQkJdmFsdWUgPSA0OwotCQltb2RlbC5zZXRWYWx1ZSh2YWx1ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIGNvbWluZyBmcm9tIHRoZSBtb2RlbCIsCi0JCQl2YWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIG1vZGVsJ3MgdmFsdWUgd2FzIHNvbWVob3cgY2hhbmdlZCIsCi0JCQlJbnRlZ2VyLnZhbHVlT2YodmFsdWUpLAotCQkJbW9kZWwuZ2V0VmFsdWUoKQotCQkpOwotCi0JCS8vIENoYW5nZSB0aGUgdmFsdWUgZnJvbSB0aGUgc3Bpbm5lcgotCQl2YWx1ZSA9IDY7Ci0JCXNwaW5uZXIuc2V0U2VsZWN0aW9uKHZhbHVlKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHNwaW5uZXIncyB2YWx1ZSBzaG91bGQgYmUgdGhlIG5ldyB2YWx1ZSBzZXQiLAotCQkJdmFsdWUsCi0JCQlzcGlubmVyLmdldFNlbGVjdGlvbigpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBtb2RlbCdzIHZhbHVlIHdhcyBzdXBwb3NlZCB0byBiZSB1cGRhdGVkIiwKLQkJCUludGVnZXIudmFsdWVPZih2YWx1ZSksCi0JCQltb2RlbC5nZXRWYWx1ZSgpCi0JCSk7Ci0KLQkJLy8gRGlzY29ubmVjdCBmcm9tIG1vZGVsCi0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGlubmVyJ3MgdmFsdWUgc2hvdWxkIGJlIHRoZSBkZWZhdWx0IHZhbHVlIiwKLQkJCWRlZmF1bHRWYWx1ZSwKLQkJCXNwaW5uZXIuZ2V0U2VsZWN0aW9uKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgYm9vbGVhbiBzZXRWYWx1ZUNhbGxlZDsKLQkJcHJpdmF0ZSBJbnRlZ2VyIHZhbHVlOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOwotCi0JCXZvaWQgY2xlYXJTZXRWYWx1ZUNhbGxlZEZsYWcoKSB7Ci0JCQlzZXRWYWx1ZUNhbGxlZCA9IGZhbHNlOwotCQl9Ci0KLQkJSW50ZWdlciBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCWJvb2xlYW4gaXNTZXRWYWx1ZUNhbGxlZCgpIHsKLQkJCXJldHVybiBzZXRWYWx1ZUNhbGxlZDsKLQkJfQotCi0JCXZvaWQgc2V0VmFsdWUoSW50ZWdlciB2YWx1ZSkgewotCQkJc2V0VmFsdWVDYWxsZWQgPSB0cnVlOwotCi0JCQlJbnRlZ2VyIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZFZhbHVlLCB2YWx1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC9zd3QvVGFibGVNb2RlbEFkYXB0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZTZkZDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RhYmxlTW9kZWxBZGFwdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC5zd3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LlRhYmxlTW9kZWxBZGFwdGVyLlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclRlc3QgewotCi0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hbmFnZXI+IHN1YmplY3RIb2xkZXI7Ci0KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlSG9sZGVycygpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4oKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxNYW5hZ2VyLCBFbXBsb3llZT4oc3ViamVjdEhvbGRlciwgTWFuYWdlci5FTVBMT1lFRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPEVtcGxveWVlPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmVtcGxveWVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZW1wbG95ZWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSVRhYmxlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4gYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihmaW5hbCBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjxFbXBsb3llZT4oKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZUV2ZW50PEVtcGxveWVlPiBlKSB7Ci0JCQkJZW1wbG95ZWVzLmNsZWFyKCk7Ci0JCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChlbXBsb3llZXMsIGUuc2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFuYWdlcj4gYnVpbGRTdWJqZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNYW5hZ2VyPigpOwotCX0KLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCXNoZWxsICAgICAgICAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzdWJqZWN0SG9sZGVyID0gYnVpbGRTdWJqZWN0SG9sZGVyKCk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlpZiAoIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJc2hlbGwuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc2hlbGwgICAgICAgICA9IG51bGw7Ci0JCXN1YmplY3RIb2xkZXIgPSBudWxsOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZSB3YXMgcG9wdWxhdGVkCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtcyBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBDaGFuZ2UgdGhlIGxpc3Qgb2YgRW1wbG95ZWVzCi0JCUFycmF5TGlzdDxFbXBsb3llZT4gZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oMyk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuY2hhbmdlRW1wbG95ZWVzKGVtcGxveWVlcyk7Ci0KLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAwLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAxLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCAyLCBleHBlY3RlZE5hbWUxLCBleHBlY3RlZE1hbmFnZXIxLCBleHBlY3RlZFRpdGxlMSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQluZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIFRhYmxlIHdhcyBwb3B1bGF0ZWQKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW1zIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIFRlc3QgcmVtb3ZpbmcgdGhlbSBhbGwKLQkJbWFuYWdlci5yZW1vdmVBbGxFbXBsb3llZXMoKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbGlzdCBob2xkZXIgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgbGlzdEhvbGRlci5zaXplKCkpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgVGFibGUgc2hvdWxkIGhhdmUgYmVlbiBjbGVhcmVkIiwgMCwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgYSBuZXcgRW1wbG95ZWUKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZSAgICA9ICJEYWxpIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlciA9ICJXVFAiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZSAgID0gInBsdWctaW4iOwotCi0JCUVtcGxveWVlIGVtcGxveWVlID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUsIGV4cGVjdGVkVGl0bGUsIGV4cGVjdGVkTWFuYWdlcik7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtIHJlcHJlc2VudGluZyB0aGUgbmV3IEVtcGxveWVlCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIEVtcGxveWVlcyB3ZXJlIGFkZGVkIHRvIHRoZSBUYWJsZQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIHVwIHRoZSBsaXN0Ci0JCW1hbmFnZXIubW92ZUVtcGxveWVlVXAoZW1wbG95ZWUyKTsKLQotCQlpbnQgaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMSwgaW5kZXgxKTsKLQotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbnQgaW5kZXgzID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4Myk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDMsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQotCQkvLyBNb3ZlIGFuIEVtcGxveWVlIGRvd24gdGhlIGxpc3QKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVEb3duKGVtcGxveWVlMSk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAxIHNob3VsZCBub3QgaGF2ZSBiZWVuIG1vdmVkIGluIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4MSk7Ci0KLQkJaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAyIHdhcyBub3QgbW92ZWQgaW4gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgyKTsKLQotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBtb3ZlZCBpbiB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleDMpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAxIiwgMSwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1ha2Ugc3VyZSBpdCB3YXMgYWRkZWQgdG8gdGhlIG1vZGVsCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBuZXcgRW1wbG95ZWUgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleCwgZXhwZWN0ZWROYW1lLCBleHBlY3RlZE1hbmFnZXIsIGV4cGVjdGVkVGl0bGUpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW0gcmVwcmVzZW50aW5nIHRoZSBuZXcgRW1wbG95ZWUKLQkJVGFibGVJdGVtIHRhYmxlSXRlbSA9IHRhYmxlLmdldEl0ZW0oaW5kZXgpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJLy8gTm93IHRlc3QgdGhlIGl0ZW0gYmVpbmcgcmVtb3ZlZAotCQltYW5hZ2VyLnJlbW92ZUVtcGxveWVlKGVtcGxveWVlKTsKLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgd2FzIG5vdCByZW1vdmVkIGZyb20gdGhlIHRhYmxlIG1vZGVsIiwgLTEsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDAiLCAwLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBhIG5ldyBFbXBsb3llZQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbWFuYWdlci5hZGRFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgY3JlYXRlZCIsIGVtcGxveWVlMSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbmV3IEVtcGxveWVlIHdhcyBub3QgYWRkZWQgdG8gdGhlIHRhYmxlIG1vZGVsIiwgMCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleDEpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiTm8gVGFibGVJdGVtIHdhcyBmb3VuZCBmb3IgdGhlIG5ldyBFbXBsb3llZSIsIHRhYmxlSXRlbSk7Ci0KLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MSwgZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRNYW5hZ2VyMSwgZXhwZWN0ZWRUaXRsZTEpOwotCi0JCS8vIFJlcGxhY2UgdGhlIEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQltYW5hZ2VyLnJlcGxhY2UoZW1wbG95ZWUxLCBlbXBsb3llZTIpOwotCi0JCWludCBpbmRleDIgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydFNhbWUoIlRoZSBFbXBsb3llZSB0aGF0IGdvdCByZXBsYWNlZCBzaG91bGQgYmUgYXQgaW5kZXggIiArIGluZGV4MSwgaW5kZXgxLCBpbmRleDIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgyLCBleHBlY3RlZE5hbWUyLCBleHBlY3RlZE1hbmFnZXIyLCBleHBlY3RlZFRpdGxlMik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNBZGRlZCgpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciA9IGJ1aWxkRW1wbG95ZWVMaXN0SG9sZGVyKCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBzZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZEVtcGxveWVlSG9sZGVyKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQl0YWJsZSwKLQkJCWJ1aWxkQ29sdW1uQWRhcHRlcigpLAotCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgVGFibGVJdGVtcyByZXByZXNlbnRpbmcgdGhlIGVtcGxveWVlcwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMyIsIDMsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQotCQlpbnQgaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDEgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAwLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUyKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAxLCBpbmRleCk7Ci0KLQkJaW5kZXggPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDMgd2FzIG5vdCBhZGRlZCB0byB0aGUgdGFibGUgbW9kZWwiLCAyLCBpbmRleCk7Ci0KLQkJLy8gTWFrZSBzdXJlIHRoZSBUYWJsZUl0ZW0gd2FzIGNvcnJlY3RseSBwb3B1bGF0ZWQKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDAsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDEsIGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkTWFuYWdlcjIsIGV4cGVjdGVkVGl0bGUyKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIDIsIGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkTWFuYWdlcjMsIGV4cGVjdGVkVGl0bGUzKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RJdGVtc01vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTQgICAgPSAiRGFsaV80IjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjQgPSAiV1RQXzQiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTQgICA9ICJwbHVnLWluXzQiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWU1ICAgID0gIkRhbGlfNSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXI1ID0gIldUUF81IjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGU1ICAgPSAicGx1Zy1pbl81IjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lNiAgICA9ICJEYWxpXzYiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyNiA9ICJXVFBfNiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlNiAgID0gInBsdWctaW5fNiI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU0ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkVGl0bGU0LCBleHBlY3RlZE1hbmFnZXI0KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU1ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTUsIGV4cGVjdGVkVGl0bGU1LCBleHBlY3RlZE1hbmFnZXI1KTsKLQkJRW1wbG95ZWUgZW1wbG95ZWU2ID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTYsIGV4cGVjdGVkVGl0bGU2LCBleHBlY3RlZE1hbmFnZXI2KTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlNCk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTYpOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgRW1wbG95ZWVzIHdlcmUgYWRkZWQgdG8gdGhlIFRhYmxlCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSA2IiwgNiwgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCS8vIE1vdmUgYW4gRW1wbG95ZWUgdXAgdGhlIGxpc3QKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigzKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTMpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlNCk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWU1KTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgMCk7Ci0KLQkJaW50IGluZGV4MSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlpbnQgaW5kZXgyID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMik7Ci0JCWludCBpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW50IGluZGV4NCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTQpOwotCQlpbnQgaW5kZXg1ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNSk7Ci0JCWludCBpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMywgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDQsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCA1LCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0KLQkJLy8gTW92ZSBhbiBFbXBsb3llZSBkb3duIHRoZSBsaXN0Ci0JCWVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5tb3ZlRW1wbG95ZWVzKGVtcGxveWVlcywgNCk7Ci0KLQkJaW5kZXgxID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlMSk7Ci0JCWluZGV4MiA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlpbmRleDMgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWUzKTsKLQkJaW5kZXg0ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlNCk7Ci0JCWluZGV4NSA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTUpOwotCQlpbmRleDYgPSB0YWJsZU1vZGVsLmluZGV4T2YoZW1wbG95ZWU2KTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgNCwgaW5kZXgxKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDIgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDUsIGluZGV4Mik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSAzIGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAwLCBpbmRleDMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgNCBpcyBub3QgYXQgdGhlIHJpZ2h0IGluZGV4IiwgMSwgaW5kZXg0KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIEVtcGxveWVlIDUgaXMgbm90IGF0IHRoZSByaWdodCBpbmRleCIsIDIsIGluZGV4NSk7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBFbXBsb3llZSA2IGlzIG5vdCBhdCB0aGUgcmlnaHQgaW5kZXgiLCAzLCBpbmRleDYpOwotCi0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDEsIGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkTWFuYWdlcjEsIGV4cGVjdGVkVGl0bGUxKTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4MiwgZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRNYW5hZ2VyMiwgZXhwZWN0ZWRUaXRsZTIpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXgzLCBleHBlY3RlZE5hbWUzLCBleHBlY3RlZE1hbmFnZXIzLCBleHBlY3RlZFRpdGxlMyk7Ci0JCXRlc3RUYWJsZUl0ZW1Qcm9wZXJ0aWVzKHRhYmxlLCBpbmRleDQsIGV4cGVjdGVkTmFtZTQsIGV4cGVjdGVkTWFuYWdlcjQsIGV4cGVjdGVkVGl0bGU0KTsKLQkJdGVzdFRhYmxlSXRlbVByb3BlcnRpZXModGFibGUsIGluZGV4NSwgZXhwZWN0ZWROYW1lNSwgZXhwZWN0ZWRNYW5hZ2VyNSwgZXhwZWN0ZWRUaXRsZTUpOwotCQl0ZXN0VGFibGVJdGVtUHJvcGVydGllcyh0YWJsZSwgaW5kZXg2LCBleHBlY3RlZE5hbWU2LCBleHBlY3RlZE1hbmFnZXI2LCBleHBlY3RlZFRpdGxlNik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbXNSZW1vdmVkKCkgewotCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKHNoZWxsLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEVtcGxveWVlPiBsaXN0SG9sZGVyID0gYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKTsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RW1wbG95ZWU+IHNlbGVjdGVkSXRlbUhvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXIoKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJbGlzdEhvbGRlciwKLQkJCXNlbGVjdGVkSXRlbUhvbGRlciwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCS8vIENyZWF0ZSBFbXBsb3llZXMKLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTEgICAgPSAiRGFsaV8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjEgPSAiV1RQXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTEgICA9ICJwbHVnLWluXzEiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUyICAgID0gIkRhbGlfMiI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIyID0gIldUUF8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUyICAgPSAicGx1Zy1pbl8yIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMyAgICA9ICJEYWxpXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMyA9ICJXVFBfMyI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMyAgID0gInBsdWctaW5fMyI7Ci0KLQkJRW1wbG95ZWUgZW1wbG95ZWUxID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTEsIGV4cGVjdGVkVGl0bGUxLCBleHBlY3RlZE1hbmFnZXIxKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUyID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTIsIGV4cGVjdGVkVGl0bGUyLCBleHBlY3RlZE1hbmFnZXIyKTsKLQkJRW1wbG95ZWUgZW1wbG95ZWUzID0gbmV3IEVtcGxveWVlKGV4cGVjdGVkTmFtZTMsIGV4cGVjdGVkVGl0bGUzLCBleHBlY3RlZE1hbmFnZXIzKTsKLQotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMSk7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUyKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTMpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBUYWJsZUl0ZW1zIHJlcHJlc2VudGluZyB0aGUgZW1wbG95ZWVzCi0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRoZSBudW1iZXIgb2YgVGFibGVJdGVtIHNob3VsZCBiZSAzIiwgMywgdGFibGUuZ2V0SXRlbUNvdW50KCkpOwotCi0JCWludCBpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTEpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTIpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMiB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDEsIGluZGV4KTsKLQotCQlpbmRleCA9IHRhYmxlTW9kZWwuaW5kZXhPZihlbXBsb3llZTMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgRW1wbG95ZWUgMyB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDIsIGluZGV4KTsKLQotCQkvLyBSZW1vdmUgMiBpdGVtcwotCQlBcnJheUxpc3Q8RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KDIpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJbWFuYWdlci5yZW1vdmVFbXBsb3llZXMoZW1wbG95ZWVzKTsKLQotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgbnVtYmVyIG9mIFRhYmxlSXRlbSBzaG91bGQgYmUgMSIsIDEsIHRhYmxlLmdldEl0ZW1Db3VudCgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRFbXBsb3llZUhvbGRlcigpOwotCi0JCU1hbmFnZXIgbWFuYWdlciA9IG5ldyBNYW5hZ2VyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUobWFuYWdlcik7Ci0KLQkJVGFibGVNb2RlbCB0YWJsZU1vZGVsID0gbmV3IFRhYmxlTW9kZWwoCi0JCQlsaXN0SG9sZGVyLAotCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIGEgbmV3IEVtcGxveWVlCi0JCVN0cmluZyBleHBlY3RlZE5hbWUgICAgPSAiRGFsaSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIgPSAiV1RQIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUgICA9ICJwbHVnLWluIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZSA9IG1hbmFnZXIuYWRkRW1wbG95ZWUoZXhwZWN0ZWROYW1lLCBleHBlY3RlZFRpdGxlLCBleHBlY3RlZE1hbmFnZXIpOwotCQlBc3NlcnQuYXNzZXJ0Tm90TnVsbCgiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGNyZWF0ZWQiLCBlbXBsb3llZSk7Ci0KLQkJLy8gTWFrZSBzdXJlIGl0IHdhcyBhZGRlZCB0byB0aGUgbW9kZWwKLQkJaW50IGluZGV4ID0gdGFibGVNb2RlbC5pbmRleE9mKGVtcGxveWVlKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG5ldyBFbXBsb3llZSB3YXMgbm90IGFkZGVkIHRvIHRoZSB0YWJsZSBtb2RlbCIsIDAsIGluZGV4KTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIG51bWJlciBvZiBUYWJsZUl0ZW0gc2hvdWxkIGJlIDEiLCAxLCB0YWJsZS5nZXRJdGVtQ291bnQoKSk7Ci0KLQkJLy8gUmV0cmlldmUgdGhlIFRhYmxlSXRlbSByZXByZXNlbnRpbmcgdGhlIG5ldyBFbXBsb3llZQotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgbmV3IEVtcGxveWVlIiwgdGFibGVJdGVtKTsKLQotCQkvLyBOYW1lIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCWV4cGVjdGVkTmFtZSA9ICJKcHQiOwotCQllbXBsb3llZS5zZXROYW1lKGV4cGVjdGVkTmFtZSk7Ci0KLQkJYWN0dWFsTmFtZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtOQU1FX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKLQotCQkvLyBNYW5hZ2VyIHByb3BlcnR5Ci0JCVN0cmluZyBhY3R1YWxNYW5hZ2VyID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk1BTkFHRVJfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW01BTkFHRVJfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE1hbmFnZXIsIGFjdHVhbE1hbmFnZXIpOwotCi0JCWV4cGVjdGVkTWFuYWdlciA9ICJib3NzIjsKLQkJZW1wbG95ZWUuc2V0TWFuYWdlcihleHBlY3RlZE1hbmFnZXIpOwotCi0JCWFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0KLQkJLy8gVGl0bGUgcHJvcGVydHkKLQkJU3RyaW5nIGFjdHVhbFRpdGxlID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLlRJVExFX0NPTFVNTik7Ci0JCUFzc2VydC5hc3NlcnRFcXVhbHMoIlRhYmxlSXRlbVtUSVRMRV9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkVGl0bGUsIGFjdHVhbFRpdGxlKTsKLQotCQlleHBlY3RlZFRpdGxlID0gIkVjbGlwc2VMaW5rIjsKLQkJZW1wbG95ZWUuc2V0VGl0bGUoZXhwZWN0ZWRUaXRsZSk7Ci0KLQkJYWN0dWFsVGl0bGUgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuVElUTEVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW1RJVExFX0NPTFVNTl0gd2FzIG5vdCBzZXQgY29ycmVjdGx5IiwgZXhwZWN0ZWRUaXRsZSwgYWN0dWFsVGl0bGUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGVkSXRlbXNBZGRlZFJlbW92ZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0KLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBhY3R1YWxFbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IHJlbW92aW5nIHNlbGVjdGVkIGl0ZW1zCi0JCXNlbGVjdGVkSXRlbXNIb2xkZXIucmVtb3ZlKGVtcGxveWVlMSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAxIiwgMSwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTMpOwotCi0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZWN0ZWRJdGVtc0NsZWFyZWQoKSB7Ci0KLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoc2hlbGwsIFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8RW1wbG95ZWU+IGxpc3RIb2xkZXIgPSBidWlsZEVtcGxveWVlTGlzdEhvbGRlcigpOwotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciA9IGJ1aWxkRW1wbG95ZWVIb2xkZXJzKCk7Ci0KLQkJTWFuYWdlciBtYW5hZ2VyID0gbmV3IE1hbmFnZXIoKTsKLQkJc3ViamVjdEhvbGRlci5zZXRWYWx1ZShtYW5hZ2VyKTsKLQotCQlUYWJsZU1vZGVsIHRhYmxlTW9kZWwgPSBuZXcgVGFibGVNb2RlbCgKLQkJCWxpc3RIb2xkZXIsCi0JCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLAotCQkJdGFibGUsCi0JCQlidWlsZENvbHVtbkFkYXB0ZXIoKSwKLQkJCWJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSk7Ci0KLQkJLy8gQ3JlYXRlIEVtcGxveWVlcwotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMSAgICA9ICJEYWxpXzEiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMSA9ICJXVFBfMSI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMSAgID0gInBsdWctaW5fMSI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTIgICAgPSAiRGFsaV8yIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjIgPSAiV1RQXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTIgICA9ICJwbHVnLWluXzIiOwotCi0JCVN0cmluZyBleHBlY3RlZE5hbWUzICAgID0gIkRhbGlfMyI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIzID0gIldUUF8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUzICAgPSAicGx1Zy1pbl8zIjsKLQotCQlFbXBsb3llZSBlbXBsb3llZTEgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMSwgZXhwZWN0ZWRUaXRsZTEsIGV4cGVjdGVkTWFuYWdlcjEpOwotCQlFbXBsb3llZSBlbXBsb3llZTIgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMiwgZXhwZWN0ZWRUaXRsZTIsIGV4cGVjdGVkTWFuYWdlcjIpOwotCQlFbXBsb3llZSBlbXBsb3llZTMgPSBuZXcgRW1wbG95ZWUoZXhwZWN0ZWROYW1lMywgZXhwZWN0ZWRUaXRsZTMsIGV4cGVjdGVkTWFuYWdlcjMpOwotCi0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUxKTsKLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTIpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMyk7Ci0KLQkJLy8gVGVzdCBhZGRpbmcgc2VsZWN0ZWQgaXRlbXMKLQkJQXJyYXlMaXN0PEVtcGxveWVlPiBlbXBsb3llZXMgPSBuZXcgQXJyYXlMaXN0PEVtcGxveWVlPigyKTsKLQkJZW1wbG95ZWVzLmFkZChlbXBsb3llZTEpOwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMyk7Ci0JCXNlbGVjdGVkSXRlbXNIb2xkZXIuYWRkQWxsKGVtcGxveWVlcyk7Ci0KLQkJQ29sbGVjdGlvbjxFbXBsb3llZT4gYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAyIiwgMiwgYWN0dWFsRW1wbG95ZWVzLnNpemUoKSk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzLnJlbW92ZShlbXBsb3llZTEpOwotCQlhY3R1YWxFbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMyk7Ci0JCUFzc2VydC5hc3NlcnRUcnVlKCJUaGUgc2VsZWN0ZWQgaXRlbXMgd2FzIG5vdCByZXRyaWV2ZWQgY29ycmVjdGx5IiwgYWN0dWFsRW1wbG95ZWVzLmlzRW1wdHkoKSk7Ci0KLQkJLy8gVGVzdCByZW1vdmluZyBzZWxlY3RlZCBpdGVtcwotCQlzZWxlY3RlZEl0ZW1zSG9sZGVyLmNsZWFyKCk7Ci0KLQkJYWN0dWFsRW1wbG95ZWVzID0gdGFibGVNb2RlbC5zZWxlY3RlZEl0ZW1zKCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJUaGUgY29sbGVjdGlvbiBvZiBzZWxlY3RlZCBpdGVtcyBjYW4ndCBiZSBudWxsIiwgYWN0dWFsRW1wbG95ZWVzKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGhlIGNvdW50IG9mIHNlbGVjdGVkIGl0ZW1zIHNob3VsZCBiZSAiLCAwLCBhY3R1YWxFbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShzaGVsbCwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJKTsKLQotCQlNYW5hZ2VyIG1hbmFnZXIgPSBuZXcgTWFuYWdlcigpOwotCQlzdWJqZWN0SG9sZGVyLnNldFZhbHVlKG1hbmFnZXIpOwotCi0JCVRhYmxlTW9kZWwgdGFibGVNb2RlbCA9IG5ldyBUYWJsZU1vZGVsKAotCQkJYnVpbGRFbXBsb3llZUxpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkRW1wbG95ZWVIb2xkZXIoKSwKLQkJCXRhYmxlLAotCQkJYnVpbGRDb2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZExhYmVsUHJvdmlkZXIoKQotCQkpOwotCi0JCUNvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcyA9IG5ldyBBcnJheUxpc3Q8RW1wbG95ZWU+KCk7Ci0JCXRhYmxlTW9kZWwuYWRkU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoYnVpbGRTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihlbXBsb3llZXMpKTsKLQotCQkvLyBDcmVhdGUgRW1wbG95ZWVzCi0JCVN0cmluZyBleHBlY3RlZE5hbWUxICAgID0gIkRhbGlfMSI7Ci0JCVN0cmluZyBleHBlY3RlZE1hbmFnZXIxID0gIldUUF8xIjsKLQkJU3RyaW5nIGV4cGVjdGVkVGl0bGUxICAgPSAicGx1Zy1pbl8xIjsKLQotCQlTdHJpbmcgZXhwZWN0ZWROYW1lMiAgICA9ICJEYWxpXzIiOwotCQlTdHJpbmcgZXhwZWN0ZWRNYW5hZ2VyMiA9ICJXVFBfMiI7Ci0JCVN0cmluZyBleHBlY3RlZFRpdGxlMiAgID0gInBsdWctaW5fMiI7Ci0KLQkJU3RyaW5nIGV4cGVjdGVkTmFtZTMgICAgPSAiRGFsaV8zIjsKLQkJU3RyaW5nIGV4cGVjdGVkTWFuYWdlcjMgPSAiV1RQXzMiOwotCQlTdHJpbmcgZXhwZWN0ZWRUaXRsZTMgICA9ICJwbHVnLWluXzMiOwotCi0JCUVtcGxveWVlIGVtcGxveWVlMSA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUxLCBleHBlY3RlZFRpdGxlMSwgZXhwZWN0ZWRNYW5hZ2VyMSk7Ci0JCUVtcGxveWVlIGVtcGxveWVlMiA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUyLCBleHBlY3RlZFRpdGxlMiwgZXhwZWN0ZWRNYW5hZ2VyMik7Ci0JCUVtcGxveWVlIGVtcGxveWVlMyA9IG5ldyBFbXBsb3llZShleHBlY3RlZE5hbWUzLCBleHBlY3RlZFRpdGxlMywgZXhwZWN0ZWRNYW5hZ2VyMyk7Ci0KLQkJbWFuYWdlci5hZGRFbXBsb3llZShlbXBsb3llZTEpOwotCQltYW5hZ2VyLmFkZEVtcGxveWVlKGVtcGxveWVlMik7Ci0JCW1hbmFnZXIuYWRkRW1wbG95ZWUoZW1wbG95ZWUzKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQl0YWJsZS5zZXRTZWxlY3Rpb24obmV3IGludFtdIHsgMCwgMiB9KTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDIiLCAyLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQotCQllbXBsb3llZXMucmVtb3ZlKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5yZW1vdmUoZW1wbG95ZWUzKTsKLQkJQXNzZXJ0LmFzc2VydFRydWUoIlRoZSBzZWxlY3RlZCBpdGVtcyB3YXMgbm90IHJldHJpZXZlZCBjb3JyZWN0bHkiLCBlbXBsb3llZXMuaXNFbXB0eSgpKTsKLQotCQkvLyBUZXN0IGFkZGluZyBzZWxlY3RlZCBpdGVtcwotCQllbXBsb3llZXMuYWRkKGVtcGxveWVlMSk7Ci0JCWVtcGxveWVlcy5hZGQoZW1wbG95ZWUzKTsKLQkJdGFibGUuZGVzZWxlY3RBbGwoKTsKLQotCQkvLyBJdCBzZWVtcyBhIG1hbnVhbCBzZWxlY3Rpb24gZG9lc24ndCBzZW5kIGFueSBzZWxlY3Rpb24gZXZlbnQKLQkJdGFibGVNb2RlbC50YWJsZVNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0KLQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoIlRoZSBjb2xsZWN0aW9uIG9mIHNlbGVjdGVkIGl0ZW1zIGNhbid0IGJlIG51bGwiLCBlbXBsb3llZXMpOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUaGUgY291bnQgb2Ygc2VsZWN0ZWQgaXRlbXMgc2hvdWxkIGJlIDAiLCAwLCBlbXBsb3llZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdGVzdFRhYmxlSXRlbVByb3BlcnRpZXMoVGFibGUgdGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTWFuYWdlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkVGl0bGUpCi0JewotCQlUYWJsZUl0ZW0gdGFibGVJdGVtID0gdGFibGUuZ2V0SXRlbShpbmRleCk7Ci0JCUFzc2VydC5hc3NlcnROb3ROdWxsKCJObyBUYWJsZUl0ZW0gd2FzIGZvdW5kIGZvciB0aGUgRW1wbG95ZWUiLCB0YWJsZUl0ZW0pOwotCi0JCVN0cmluZyBhY3R1YWxOYW1lID0gdGFibGVJdGVtLmdldFRleHQoVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKTsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiVGFibGVJdGVtW05BTUVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOwotCi0JCVN0cmluZyBhY3R1YWxUaXRsZSA9IHRhYmxlSXRlbS5nZXRUZXh0KFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bVElUTEVfQ09MVU1OXSB3YXMgbm90IHNldCBjb3JyZWN0bHkiLCBleHBlY3RlZFRpdGxlLCBhY3R1YWxUaXRsZSk7Ci0KLQkJU3RyaW5nIGFjdHVhbE1hbmFnZXIgPSB0YWJsZUl0ZW0uZ2V0VGV4dChUYWJsZUNvbHVtbkFkYXB0ZXIuTUFOQUdFUl9DT0xVTU4pOwotCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUYWJsZUl0ZW1bTUFOQUdFUl9DT0xVTU5dIHdhcyBub3Qgc2V0IGNvcnJlY3RseSIsIGV4cGVjdGVkTWFuYWdlciwgYWN0dWFsTWFuYWdlcik7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBFbXBsb3llZSBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCXByaXZhdGUgU3RyaW5nIG1hbmFnZXI7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgU3RyaW5nIHRpdGxlOwotCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOQUdFUl9QUk9QRVJUWSA9ICJtYW5hZ2VyIjsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFX1BST1BFUlRZID0gInRpdGxlIjsKLQotCQlFbXBsb3llZShTdHJpbmcgbmFtZSwgU3RyaW5nIHRpdGxlLCBTdHJpbmcgbWFuYWdlcikgewotCQkJc3VwZXIoKTsKLQotCQkJdGhpcy5uYW1lICAgID0gbmFtZTsKLQkJCXRoaXMudGl0bGUgICA9IHRpdGxlOwotCQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJfQotCi0JCVN0cmluZyBnZXRNYW5hZ2VyKCkgewotCQkJcmV0dXJuIG1hbmFnZXI7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBuYW1lOwotCQl9Ci0KLQkJU3RyaW5nIGdldFRpdGxlKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0KLQkJdm9pZCBzZXRNYW5hZ2VyKFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlTdHJpbmcgb2xkTWFuYWdlciA9IHRoaXMubWFuYWdlcjsKLQkJCXRoaXMubWFuYWdlciA9IG1hbmFnZXI7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE1BTkFHRVJfUFJPUEVSVFksIG9sZE1hbmFnZXIsIG1hbmFnZXIpOwotCQl9Ci0KLQkJdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5hbWUpOwotCQl9Ci0KLQkJdm9pZCBzZXRUaXRsZShTdHJpbmcgdGl0bGUpIHsKLQkJCVN0cmluZyBvbGRUaXRsZSA9IHRoaXMudGl0bGU7Ci0JCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFRJVExFX1BST1BFUlRZLCBvbGRUaXRsZSwgdGl0bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBMaXN0PEVtcGxveWVlPiBlbXBsb3llZXM7Ci0KLQkJc3RhdGljIGZpbmFsIFN0cmluZyBFTVBMT1lFRVNfTElTVCA9ICJlbXBsb3llZXMiOwotCi0JCU1hbmFnZXIoKSB7Ci0JCQlzdXBlcigpOwotCQkJZW1wbG95ZWVzID0gbmV3IEFycmF5TGlzdDxFbXBsb3llZT4oKTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlhZGRJdGVtVG9MaXN0KGVtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJCXJldHVybiBlbXBsb3llZTsKLQkJfQotCi0JCUVtcGxveWVlIGFkZEVtcGxveWVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGl0bGUsIFN0cmluZyBtYW5hZ2VyKSB7Ci0JCQlFbXBsb3llZSBlbXBsb3llZSA9IG5ldyBFbXBsb3llZShuYW1lLCB0aXRsZSwgbWFuYWdlcik7Ci0JCQlyZXR1cm4gYWRkRW1wbG95ZWUoZW1wbG95ZWUpOwotCQl9Ci0KLQkJdm9pZCBjaGFuZ2VFbXBsb3llZXMoTGlzdDxFbXBsb3llZT4gbmV3RW1wbG95ZWVzKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplTGlzdChuZXdFbXBsb3llZXMsIHRoaXMuZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQotCQlMaXN0SXRlcmF0b3I8RW1wbG95ZWU+IGVtcGxveWVlcygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8RW1wbG95ZWU+KGVtcGxveWVlcyk7Ci0JCX0KLQotCQlpbnQgZW1wbG95ZWVzU2l6ZSgpIHsKLQkJCXJldHVybiBlbXBsb3llZXMuc2l6ZSgpOwotCQl9Ci0KLQkJdm9pZCBtb3ZlRW1wbG95ZWVEb3duKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlpbnQgaW5kZXggPSBlbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSk7Ci0JCQltb3ZlSXRlbUluTGlzdChpbmRleCArIDEsIGluZGV4LCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgbW92ZUVtcGxveWVlcyhDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXMsIGludCB0YXJnZXRJbmRleCkgewotCi0JCQlpbnQgc291cmNlSW5kZXggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCQkJZm9yIChFbXBsb3llZSBlbXBsb3llZSA6IGVtcGxveWVlcykgewotCQkJCXNvdXJjZUluZGV4ID0gTWF0aC5taW4oc291cmNlSW5kZXgsIHRoaXMuZW1wbG95ZWVzLmluZGV4T2YoZW1wbG95ZWUpKTsKLQkJCX0KLQotCQkJbW92ZUl0ZW1zSW5MaXN0KAotCQkJCXRhcmdldEluZGV4LAotCQkJCXNvdXJjZUluZGV4LAotCQkJCWVtcGxveWVlcy5zaXplKCksCi0JCQkJdGhpcy5lbXBsb3llZXMsCi0JCQkJRU1QTE9ZRUVTX0xJU1QKLQkJCSk7Ci0JCX0KLQotCQl2b2lkIG1vdmVFbXBsb3llZVVwKEVtcGxveWVlIGVtcGxveWVlKSB7Ci0JCQlpbnQgaW5kZXggPSBlbXBsb3llZXMuaW5kZXhPZihlbXBsb3llZSk7Ci0JCQltb3ZlSXRlbUluTGlzdChpbmRleCAtIDEsIGluZGV4LCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlQWxsRW1wbG95ZWVzKCkgewotCQkJY2xlYXJMaXN0KGVtcGxveWVlcywgRU1QTE9ZRUVTX0xJU1QpOwotCQl9Ci0KLQkJdm9pZCByZW1vdmVFbXBsb3llZShFbXBsb3llZSBlbXBsb3llZSkgewotCQkJcmVtb3ZlSXRlbUZyb21MaXN0KGVtcGxveWVlLCBlbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVtb3ZlRW1wbG95ZWVzKENvbGxlY3Rpb248RW1wbG95ZWU+IGVtcGxveWVlcykgewotCQkJcmVtb3ZlSXRlbXNGcm9tTGlzdChlbXBsb3llZXMuaXRlcmF0b3IoKSwgdGhpcy5lbXBsb3llZXMsIEVNUExPWUVFU19MSVNUKTsKLQkJfQotCi0JCXZvaWQgcmVwbGFjZShFbXBsb3llZSBvbGRFbXBsb3llZSwgRW1wbG95ZWUgbmV3RW1wbG95ZWUpIHsKLQkJCXJlcGxhY2VJdGVtSW5MaXN0KG9sZEVtcGxveWVlLCBuZXdFbXBsb3llZSwgZW1wbG95ZWVzLCBFTVBMT1lFRVNfTElTVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlQ29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IHsKLQotCQlzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDM7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTUFOQUdFUl9DT0xVTU4gPSAyOwotCQlzdGF0aWMgZmluYWwgaW50IE5BTUVfQ09MVU1OID0gMDsKLQkJc3RhdGljIGZpbmFsIGludCBUSVRMRV9DT0xVTU4gPSAxOwotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE1hbmFnZXJIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuTUFOQUdFUl9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE1hbmFnZXIoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TWFuYWdlcih2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoRW1wbG95ZWUgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1wbG95ZWUsIFN0cmluZz4oRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRpdGxlSG9sZGVyKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KEVtcGxveWVlLlRJVExFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGl0bGUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0VGl0bGUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKEVtcGxveWVlIHN1YmplY3QpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gaG9sZGVycyA9IG5ldyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PlszXTsKLQkJCWhvbGRlcnNbTkFNRV9DT0xVTU5dID0gYnVpbGROYW1lSG9sZGVyKHN1YmplY3QpOwotCQkJaG9sZGVyc1tUSVRMRV9DT0xVTU5dID0gYnVpbGRUaXRsZUhvbGRlcihzdWJqZWN0KTsKLQkJCWhvbGRlcnNbTUFOQUdFUl9DT0xVTU5dID0gYnVpbGRNYW5hZ2VySG9sZGVyKHN1YmplY3QpOwotCQkJcmV0dXJuIGhvbGRlcnM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihjb2x1bW5JbmRleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUVtcGxveWVlIGVtcGxveWVlID0gKEVtcGxveWVlKSBlbGVtZW50OwotCi0JCQlpZiAoY29sdW1uSW5kZXggPT0gVGFibGVDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVtcGxveWVlLmdldE5hbWUoKTsKLQkJCX0KLQotCQkJaWYgKGNvbHVtbkluZGV4ID09IFRhYmxlQ29sdW1uQWRhcHRlci5USVRMRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW1wbG95ZWUuZ2V0VGl0bGUoKTsKLQkJCX0KLQotCQkJcmV0dXJuIGVtcGxveWVlLmdldE1hbmFnZXIoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgVGFibGVNb2RlbCBleHRlbmRzIFRhYmxlTW9kZWxBZGFwdGVyPEVtcGxveWVlPiB7Ci0KLQkJVGFibGVNb2RlbChMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciwKLQkJICAgICAgICAgICBDb2xsZWN0aW9uVmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJICAgICAgICAgICBUYWJsZSB0YWJsZSwKLQkJICAgICAgICAgICBDb2x1bW5BZGFwdGVyPEVtcGxveWVlPiBjb2x1bW5BZGFwdGVyLAotCQkgICAgICAgICAgIElUYWJsZUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCi0JCQlzdXBlcihsaXN0SG9sZGVyLAotCQkJICAgICAgc2VsZWN0ZWRJdGVtc0hvbGRlciwKLQkJCSAgICAgIHRhYmxlLAotCQkJICAgICAgY29sdW1uQWRhcHRlciwKLQkJCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJVGFibGVNb2RlbChMaXN0VmFsdWVNb2RlbDxFbXBsb3llZT4gbGlzdEhvbGRlciwKLQkJICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkgICAgICAgICAgIFRhYmxlIHRhYmxlLAotCQkgICAgICAgICAgIENvbHVtbkFkYXB0ZXI8RW1wbG95ZWU+IGNvbHVtbkFkYXB0ZXIsCi0JCSAgICAgICAgICAgSVRhYmxlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0KLQkJCXN1cGVyKGxpc3RIb2xkZXIsCi0JCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxFbXBsb3llZT4oc2VsZWN0ZWRJdGVtSG9sZGVyKSwKLQkJCSAgICAgIHRhYmxlLAotCQkJICAgICAgY29sdW1uQWRhcHRlciwKLQkJCSAgICAgIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaW5kZXhPZihFbXBsb3llZSBpdGVtKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaW5kZXhPZihpdGVtKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxFbXBsb3llZT4gc2VsZWN0ZWRJdGVtcygpIHsKLQkJCXJldHVybiBzdXBlci5zZWxlY3RlZEl0ZW1zKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdGFibGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlzdXBlci50YWJsZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3N3dC9UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMGMxNTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvc3d0L1RyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EZWZhdWx0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuVHJpU3RhdGVDaGVja0JveDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHRyaS1zdGF0ZSBjaGVjayBib3hlcy4KLSAqLwotcHVibGljIGNsYXNzIFRyaVN0YXRlQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0KFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChCb29sZWFuLlRSVUUsIEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuZmxhZzFIb2xkZXIgPSB0aGlzLmJ1aWxkRmxhZzFIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmZsYWcySG9sZGVyID0gdGhpcy5idWlsZEZsYWcySG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuRkxBRzFfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5pc0ZsYWcxKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcxKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzRmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb3RGbGFnMkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLk5PVF9GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJKChTaGVsbCkgcGFyZW50KS5zZXRUZXh0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQlwYXJlbnQuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCUNvbXBvc2l0ZSBtYWluUGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQltYWluUGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGNoZWNrQm94UGFuZWwgPSB0aGlzLmJ1aWxkQ2hlY2tCb3hQYW5lbChtYWluUGFuZWwpOwotCQl0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKG1haW5QYW5lbCwgY2hlY2tCb3hQYW5lbCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkQ2hlY2tCb3hQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxhZzFDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KHBhbmVsKTsKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzFDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDEiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcxSG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJmbGFnIDIiLCBEZWZhdWx0V2lkZ2V0RmFjdG9yeS5pbnN0YW5jZSgpKTsKLQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlci5hZGFwdCh0aGlzLmZsYWcySG9sZGVyLCBjaGVja0JveCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTm90RmxhZzJDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVRyaVN0YXRlQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgVHJpU3RhdGVDaGVja0JveChwYXJlbnQsICJuZXh0IGZsYWcgMiIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyLmFkYXB0KHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmlTdGF0ZUNoZWNrQm94IGNoZWNrQm94ID0gbmV3IFRyaVN0YXRlQ2hlY2tCb3gocGFyZW50LCAidW5hdHRhY2hlZCIsIERlZmF1bHRXaWRnZXRGYWN0b3J5Lmluc3RhbmNlKCkpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigibmV4dCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMubmV4dEZsYWcxKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgibmV4dCBmbGFnIDEiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCBuZXh0RmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLm5leHRGbGFnMSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUcmlTdGF0ZUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgY2xlYXJNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVHJpU3RhdGVDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBCb29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIEJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgQm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoQm9vbGVhbiBmbGFnMSwgQm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCX0KLQkJcHJpdmF0ZSBCb29sZWFuIG5leHQoQm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gKGIgPT0gbnVsbCkgPyBCb29sZWFuLlRSVUUgOiBiLmJvb2xlYW5WYWx1ZSgpID8gQm9vbGVhbi5GQUxTRSA6IG51bGw7Ci0JCX0KLQkJcHVibGljIEJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKEJvb2xlYW4gZmxhZzEpIHsKLQkJCUJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbmV4dEZsYWcxKCkgewotCQkJdGhpcy5zZXRGbGFnMSh0aGlzLm5leHQodGhpcy5mbGFnMSkpOwotCQl9Ci0JCXB1YmxpYyBCb29sZWFuIGlzRmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRGbGFnMihCb29sZWFuIGZsYWcyKSB7Ci0JCQlCb29sZWFuIG9sZCA9IHRoaXMuZmxhZzI7Ci0JCQl0aGlzLmZsYWcyID0gZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkxBRzJfUFJPUEVSVFksIG9sZCwgZmxhZzIpOwotCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9IHRoaXMubmV4dChmbGFnMik7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG5leHRGbGFnMigpIHsKLQkJCXRoaXMuc2V0RmxhZzIodGhpcy5uZXh0KHRoaXMuZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgQm9vbGVhbiBpc05vdEZsYWcyKCkgewotCQkJcmV0dXJuIHRoaXMubm90RmxhZzI7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Tm90RmxhZzIoQm9vbGVhbiBub3RGbGFnMikgewotCQkJdGhpcy5zZXRGbGFnMih0aGlzLm5leHQoZmxhZzIpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBuZXh0Tm90RmxhZzIoKSB7Ci0JCQl0aGlzLnNldE5vdEZsYWcyKHRoaXMubmV4dCh0aGlzLm5vdEZsYWcyKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbCgiICsgdGhpcy5pc0ZsYWcxKCkgKyAiIC0gIiArIHRoaXMuaXNGbGFnMigpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sQWxpZ25lclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyOTA0ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xBbGlnbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sQWxpZ25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbEFsaWduZXJUZXN0IHsKLQotCXByaXZhdGUgQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXI7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCXByaXZhdGUgU2hlbGwgc2hlbGw7Ci0KLQlwcml2YXRlIExheW91dCBidWlsZFNwYWNlckxheW91dCgpIHsKLQkJcmV0dXJuIG5ldyBMYXlvdXQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQb2ludCBjb21wdXRlU2l6ZShDb21wb3NpdGUgY29tcG9zaXRlLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodEhpbnQsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaENhY2hlKSB7Ci0KLQkJCQlyZXR1cm4gbmV3IFBvaW50KHdpZHRoSGludCwgaGVpZ2h0SGludCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQkJCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpIGNvbXBvc2l0ZS5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJY29tcG9zaXRlLnNldEJvdW5kcygwLCAwLCBkYXRhLndpZHRoSGludCwgZGF0YS5oZWlnaHRIaW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0KLQkJY29udHJvbEFsaWduZXIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQotCQlzaGVsbCAgPSBuZXcgU2hlbGwoRGlzcGxheS5nZXRDdXJyZW50KCkpOwotCQlzaGVsbC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHNoZWxsLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0KLQkJaWYgKGNvbnRyb2xBbGlnbmVyICE9IG51bGwpIHsKLQkJCWNvbnRyb2xBbGlnbmVyLmRpc3Bvc2UoKTsKLQkJCWNvbnRyb2xBbGlnbmVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChzaGVsbCAhPSBudWxsKSB7Ci0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCQlzaGVsbCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb250cm9sMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJcGFuZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgbWF4aW11bSB3aWR0aCBzaG91bGQgYmUgMCwiLAotCQkJMCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplID0gbGFiZWwuZ2V0U2l6ZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplLnggKyAiLCIsCi0JCQlzaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhbmUsIFNXVC5OVUxMKTsKLQkJYnV0dG9uLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplLnggKyAiLCIsCi0JCQlzaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2wzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiU2hvcnQgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotCi0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQljb250cm9sQWxpZ25lci5hZGQobGFiZWwpOwotCQljb250cm9sQWxpZ25lci5hZGQoYnV0dG9uKTsKLQotCQlQb2ludCBsYWJlbFNpemUgID0gbGFiZWwuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBtYXggKyAiLCIsCi0JCQltYXgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyMSgpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZENvbnRyb2xBbGlnbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQobGFiZWwyKTsKLQotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCWxhYmVsMi5zZXRUZXh0KCJUaGlzIGlzIGEgdmVyeSBsb25nIENvbnRyb2xBbGlnbmVyIik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQlQb2ludCBzaXplMSA9IGxhYmVsMS5nZXRTaXplKCk7Ci0JCVBvaW50IHNpemUyID0gbGFiZWwyLmdldFNpemUoKTsKLQkJaW50IHdpZHRoID0gTWF0aC5tYXgoc2l6ZTEueCwgc2l6ZTIueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QoZXhwZWN0ZWQ9SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb250cm9sQWxpZ25lclRvSXRzZWxmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcik7Ci0JCWZhaWwoIkEgQ29udHJvbEFsaWduZXIgY2FuJ3QgYmUgYWRkZWQgdG8gaXRzZWxmIik7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RGlhbG9nX0FkZENvbnRyb2wxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJZmluYWwgaW50W10gbWF4aW11bVdpZHRoID0gbmV3IGludFsxXTsKLQkJZmluYWwgaW50W10gc2l6ZSA9IG5ldyBpbnRbMV07Ci0KLQkJVGl0bGVBcmVhRGlhbG9nIGRpYWxvZyA9IG5ldyBUaXRsZUFyZWFEaWFsb2coU1dUVXRpbC5nZXRTaGVsbCgpKSB7Ci0KLQkJCXByaXZhdGUgTGFiZWwgbGFiZWw7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQkJcGFuZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCQkJbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULkxFRlQpOwotCQkJCWxhYmVsLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQkJCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQkJCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCb3VuZHMoKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZUJvdW5kcygpOwotCQkJCXNpemVbMF0gPSBsYWJlbC5nZXRTaXplKCkueDsKLQkJCQltYXhpbXVtV2lkdGhbMF0gPSBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKTsKLQkJCX0KLQkJfTsKLQotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5jbG9zZSgpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyBzaXplWzBdICsgIiwiLAotCQkJc2l6ZVswXSwKLQkJCW1heGltdW1XaWR0aFswXQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpYWxvZ19BZGRDb250cm9sMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCWZpbmFsIGludFtdIG1heGltdW1XaWR0aCA9IG5ldyBpbnRbMV07Ci0JCWZpbmFsIGludFtdIHNpemVzID0gbmV3IGludFsyXTsKLQotCQlUaXRsZUFyZWFEaWFsb2cgZGlhbG9nID0gbmV3IFRpdGxlQXJlYURpYWxvZyhTV1RVdGlsLmdldFNoZWxsKCkpIHsKLQotCQkJcHJpdmF0ZSBCdXR0b24gYnV0dG9uOwotCQkJcHJpdmF0ZSBMYWJlbCBsYWJlbDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJCUNvbXBvc2l0ZSBwYW5lID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQkJCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlsYWJlbCA9IG5ldyBMYWJlbChwYW5lLCBTV1QuTlVMTCk7Ci0JCQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCQkJdXBkYXRlR3JpZERhdGEobGFiZWwpOwotCi0JCQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQotCQkJCWJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQkJCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCQkJdXBkYXRlR3JpZERhdGEoYnV0dG9uKTsKLQotCQkJCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQm91bmRzKCkgewotCQkJCXN1cGVyLmluaXRpYWxpemVCb3VuZHMoKTsKLQkJCQlzaXplc1swXSA9IGxhYmVsLmdldFNpemUoKS54OwotCQkJCXNpemVzWzFdID0gYnV0dG9uLmdldFNpemUoKS54OwotCQkJCW1heGltdW1XaWR0aFswXSA9IGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpOwotCQkJfQotCQl9OwotCi0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmNsb3NlKCk7Ci0KLQkJaW50IGxhYmVsU2l6ZSAgPSBzaXplc1swXTsKLQkJaW50IGJ1dHRvblNpemUgPSBzaXplc1sxXTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZSwgYnV0dG9uU2l6ZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCW1heGltdW1XaWR0aFswXQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERpc3Bvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZSwgU1dULk5VTEwpOwotCQlsYWJlbC5zZXRUZXh0KCJUaGlzIGlzIHZlcnkgbG9uZyB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsKTsKLQotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXggPSBNYXRoLm1heChsYWJlbFNpemUueCwgYnV0dG9uU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlsYWJlbC5kaXNwb3NlKCk7Ci0KLQkJUG9pbnQgbmV3QnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZSgKLQkJCSJUaGUgb2xkIG1heCBhbmQgbmV3IG1heCBzaG91bGQgbm90IGJlIHRoZSBzYW1lIiwKLQkJCW1heCwKLQkJCW5ld0J1dHRvblNpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgQ29udHJvbEFsaWduZXIgZG9lc24ndCBoYXZlIHRoZSByaWdodCBtYXhpbXVtIHdpZHRoIiwKLQkJCW5ld0J1dHRvblNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SGllcmFyY2h5T2ZDb250cm9sQWxpZ25lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQkvLyBBbGlnbmVyMQotCQkvLyAgXgotCQkvLyAgfC1BbGlnbmVyMgotCQkvLyAgICAgXgotCQkvLyAgICAgfC1BbGlnbmVyMwotCQlDb250cm9sQWxpZ25lciBjb250cm9sQWxpZ25lcjIgPSBuZXcgQ29udHJvbEFsaWduZXIoKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGNvbnRyb2xBbGlnbmVyMik7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIzID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyMi5hZGQoY29udHJvbEFsaWduZXIzKTsKLQotCQkvLyBUZXN0IDEKLQkJTGFiZWwgbGFiZWwxID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDEuc2V0VGV4dCgiVGhpcyBpcyBhIGxhYmVsIHdpZGdldCIpOwotCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCWludCBsYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJY29udHJvbEFsaWduZXIzLmFkZChsYWJlbDEpOwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGxhYmVsV2lkdGgxKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgbGFiZWxXaWR0aDEpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCksIGxhYmVsV2lkdGgxKTsKLQotCQkvLyBUZXN0IDIKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlsYWJlbDIuc2V0VGV4dCgiU2hvcnRMYWJlbCIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJaW50IG5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQlpbnQgbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0KLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMy5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSwgY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIG5ld0xhYmVsV2lkdGgyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0KLQkJLy8gVGVzdCAzCi0JCUxhYmVsIGxhYmVsMyA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbGFiZWwzLnNldFRleHQoIkEgdmVyeSBsb25nIGxhYmVsIHRoYXQgdGFrZXMgYSBsb3Qgb2YgaG9yaXpvbnRhbCBzcGFjZSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbDMpOwotCi0JCW5ld0xhYmVsV2lkdGgxID0gbGFiZWwxLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMiA9IGxhYmVsMi5nZXRTaXplKCkueDsKLQkJaW50IG5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQkvLyBNYWtlIHN1cmUgYWxsIHRoZSBsb2NrZWQgYXJlIHJlbW92ZWQKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lciwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIzLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCi0JCS8vIENoYW5nZSB0aGUgdGV4dCBvZiBsYWJlbDIKLQkJbGFiZWwyLnNldFRleHQoIm1tIik7Ci0vLwkJcGFyZW50LmxheW91dCh0cnVlKTsKLQotCQluZXdMYWJlbFdpZHRoMSA9IGxhYmVsMS5nZXRTaXplKCkueDsKLQkJbmV3TGFiZWxXaWR0aDIgPSBsYWJlbDIuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgzID0gbGFiZWwzLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjMuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCksIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBuZXdMYWJlbFdpZHRoMik7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMiwgbmV3TGFiZWxXaWR0aDMpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDEsIGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0KLQkJLy8gQ2hhbmdlIHRoZSB0ZXh0IG9mIGxhYmVsMQotCQlsYWJlbDEuc2V0VGV4dCgiYSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJQ29tcG9zaXRlIHBhcmVudDEgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5VTEwpOwotCQlwYXJlbnQxLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlMYWJlbCB0ZW1wTGFiZWwgPSBuZXcgTGFiZWwocGFyZW50MSwgU1dULk5VTEwpOwotCQl0ZW1wTGFiZWwuc2V0VGV4dCgiYSIpOwotLy8JCXBhcmVudDEubGF5b3V0KHRydWUpOwotCi0JCWludCByZWFsV2lkdGggPSB0ZW1wTGFiZWwuZ2V0U2l6ZSgpLng7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMyA9IGxhYmVsMy5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDIsIG5ld0xhYmVsV2lkdGgzKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0xhYmVsV2lkdGgxLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEZhbHNlKG5ld0xhYmVsV2lkdGgxID09IHJlYWxXaWR0aCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lciwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjIsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZV8oY29udHJvbEFsaWduZXIzLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCi0JCS8vIENoYW5nZSB0aGUgdGV4dCBvZiBsYWJlbDEKLQkJbGFiZWwxLnNldFRleHQoIlllcyBhbm90aGVyIGJpZyBsb25nIGxvbmcgdGV4dCBzbyB0aGF0IGFsbCB0aGUgbGFiZWxzIHdpbGwgaGF2ZSB0byB0YWtlIHRoZSBzaXplIG9mIHRoaXMgbGFiZWwgdG8gbWFrZSBzdXJlIENvbnRyb2xBbGlnbmVyIHdvcmtzIGNvcnJlY3RseSIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSk7Ci0KLQkJLy8gV2VpcmQ6IEl0IHNlZW1zIG5vIG5vdGlmaWNhdGlvbiBpcyBzZW50LCBmaXJlIG9uZSBtYW51YWxseQotCQlFdmVudCBldmVudCAgPSBuZXcgRXZlbnQoKTsKLQkJZXZlbnQud2lkZ2V0ID0gbGFiZWwxOwotCQlldmVudC50eXBlICAgPSBTV1QuUmVzaXplOwotCQlsYWJlbDEubm90aWZ5TGlzdGVuZXJzKFNXVC5SZXNpemUsIGV2ZW50KTsKLQotCQlDb21wb3NpdGUgcGFyZW50MiA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTlVMTCk7Ci0JCXBhcmVudDIuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRlbXBMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQyLCBTV1QuTlVMTCk7Ci0JCXRlbXBMYWJlbC5zZXRUZXh0KGxhYmVsMS5nZXRUZXh0KCkpOwotCQlwYXJlbnQyLmxheW91dCh0cnVlKTsKLQotCQlyZWFsV2lkdGggPSB0ZW1wTGFiZWwuZ2V0U2l6ZSgpLng7Ci0KLQkJbmV3TGFiZWxXaWR0aDEgPSBsYWJlbDEuZ2V0U2l6ZSgpLng7Ci0JCW5ld0xhYmVsV2lkdGgyID0gbGFiZWwyLmdldFNpemUoKS54OwotCQluZXdMYWJlbFdpZHRoMyA9IGxhYmVsMy5nZXRTaXplKCkueDsKLQotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIzLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkpOwotCQlhc3NlcnRFcXVhbHMoY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpLCBjb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdMYWJlbFdpZHRoMSwgbmV3TGFiZWxXaWR0aDIpOwotCQlhc3NlcnRFcXVhbHMobmV3TGFiZWxXaWR0aDIsIG5ld0xhYmVsV2lkdGgzKTsKLQkJYXNzZXJ0RXF1YWxzKGNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpLCBuZXdMYWJlbFdpZHRoMSk7Ci0JCWFzc2VydEVxdWFscyhyZWFsV2lkdGgsIG5ld0xhYmVsV2lkdGgxKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyLCAibG9ja2VkIiksIEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWVfKGNvbnRyb2xBbGlnbmVyMiwgImxvY2tlZCIpLCBCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlXyhjb250cm9sQWxpZ25lcjMsICJsb2NrZWQiKSwgQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udHJvbDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlDb21wb3NpdGUgcGFuZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhbmUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCXBhbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiVGhpcyBpcyBhIENvbnRyb2xBbGlnbmVyIik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHNpemUueCArICIsIiwKLQkJCXNpemUueCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGJ1dHRvbik7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgMCwgIiwKLQkJCTAsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2wyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0KLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZSwgU1dULk5VTEwpOwotCQlidXR0b24uc2V0VGV4dCgiU2hvcnQgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShidXR0b24pOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsKTsKLQkJY29udHJvbEFsaWduZXIuYWRkKGJ1dHRvbik7Ci0KLQkJUG9pbnQgbGFiZWxTaXplICA9IGxhYmVsLmdldFNpemUoKTsKLQkJUG9pbnQgYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXggPSBNYXRoLm1heChsYWJlbFNpemUueCwgYnV0dG9uU2l6ZS54KTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgbWF4ICsgIiwiLAotCQkJbWF4LAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQljb250cm9sQWxpZ25lci5yZW1vdmUobGFiZWwpOwotCi0JCVBvaW50IG5ld0J1dHRvblNpemUgPSBidXR0b24uZ2V0U2l6ZSgpOwotCi0JCWFzc2VydE5vdFNhbWUoCi0JCQkiVGhlIG9sZCBtYXggYW5kIG5ldyBtYXggc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsCi0JCQltYXgsCi0JCQluZXdCdXR0b25TaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIENvbnRyb2xBbGlnbmVyIGRvZXNuJ3QgaGF2ZSB0aGUgcmlnaHQgbWF4aW11bSB3aWR0aCIsCi0JCQluZXdCdXR0b25TaXplLngsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2w0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcG9zaXRlIHBhbmUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlwYW5lLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlwYW5lLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCi0JCS8vIFdpZGdldCAxCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhbmUsIFNXVC5OVUxMKTsKLQkJbGFiZWwuc2V0VGV4dCgiVGhpcyBpcyB2ZXJ5IGxvbmcgdGV4dCIpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbCk7Ci0KLQkJLy8gV2lkZ2V0IDIKLQkJQ29tcG9zaXRlIHNwYWNlciA9IG5ldyBDb21wb3NpdGUocGFuZSwgU1dULk5VTEwpOwotCQlzcGFjZXIuc2V0TGF5b3V0KGJ1aWxkU3BhY2VyTGF5b3V0KCkpOwotCQl1cGRhdGVHcmlkRGF0YShzcGFjZXIpOwotCQljb250cm9sQWxpZ25lci5hZGQoc3BhY2VyKTsKLQotCQkvLyBXaWRnZXQgMwotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYW5lLCBTV1QuTlVMTCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KCJTaG9ydCB0ZXh0Iik7Ci0JCXVwZGF0ZUdyaWREYXRhKGJ1dHRvbik7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChidXR0b24pOwotCi0vLwkJcGFyZW50LmxheW91dCh0cnVlLCB0cnVlKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIDMgd2lkZ2V0cyBoYXZlIHRoZSBzYW1lIHdpZHRoCi0JCVBvaW50IGxhYmVsU2l6ZSAgPSBsYWJlbC5nZXRTaXplKCk7Ci0JCVBvaW50IHNwYWNlclNpemUgPSBzcGFjZXIuZ2V0U2l6ZSgpOwotCQlQb2ludCBidXR0b25TaXplID0gYnV0dG9uLmdldFNpemUoKTsKLQkJaW50IG1heCA9IE1hdGgubWF4KGxhYmVsU2l6ZS54LCBidXR0b25TaXplLngpOwotCQltYXggPSBNYXRoLm1heChtYXgsIHNwYWNlclNpemUueCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGFjZXIncyB3aWR0aCBzaG91bGQgYmUgIiArIG1heCArICIsIiwKLQkJCW1heCwKLQkJCXNwYWNlclNpemUueAotCQkpOwotCi0JCS8vIFJlbW92ZSB0aGUgbGFiZWwgKHRoZSB3aWRlc3Qgd2lkZ2V0KSBhbmQgbWFrZSBzdXJlIHRoZSB3aWR0aCB3YXMKLQkJLy8gY29ycmVjdGx5IGNhbGN1bGF0ZWQKLQkJY29udHJvbEFsaWduZXIucmVtb3ZlKGxhYmVsKTsKLQotCQlzcGFjZXJTaXplID0gc3BhY2VyLmdldFNpemUoKTsKLQkJYnV0dG9uU2l6ZSA9IGJ1dHRvbi5nZXRTaXplKCk7Ci0JCWludCBtYXgyID0gTWF0aC5tYXgoc3BhY2VyU2l6ZS54LCBidXR0b25TaXplLngpOwotCi0JCWFzc2VydE5vdFNhbWUoCi0JCQkiVGhlIG9sZCBtYXggYW5kIG5ldyBtYXggc2hvdWxkIG5vdCBiZSB0aGUgc2FtZSIsCi0JCQltYXgsCi0JCQltYXgyCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBDb250cm9sQWxpZ25lciBkb2Vzbid0IGhhdmUgdGhlIHJpZ2h0IG1heGltdW0gd2lkdGgiLAotCQkJbWF4MiwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBzcGFjZXIncyB3aWR0aCBzaG91bGQgaGF2ZSBiZWVuIGFkanVzdGVkIiwKLQkJCW1heDIsCi0JCQlzcGFjZXJTaXplLngKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb250cm9sQWxpZ25lcjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQlMYWJlbCBsYWJlbDEgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsIGxhYmVsMiA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQl1cGRhdGVHcmlkRGF0YShsYWJlbDEpOwotCQl1cGRhdGVHcmlkRGF0YShsYWJlbDIpOwotCi0JCWNvbnRyb2xBbGlnbmVyLmFkZChsYWJlbDEpOwotCi0JCUNvbnRyb2xBbGlnbmVyIGNvbnRyb2xBbGlnbmVyMiA9IG5ldyBDb250cm9sQWxpZ25lcigpOwotCQljb250cm9sQWxpZ25lci5hZGQoY29udHJvbEFsaWduZXIyKTsKLQkJY29udHJvbEFsaWduZXIyLmFkZChsYWJlbDIpOwotCi0JCWxhYmVsMS5zZXRUZXh0KCJUaGlzIGlzIGEgQ29udHJvbEFsaWduZXIiKTsKLQkJbGFiZWwyLnNldFRleHQoIlRoaXMgaXMgYSB2ZXJ5IGxvbmcgQ29udHJvbEFsaWduZXIiKTsKLS8vCQlwYXJlbnQubGF5b3V0KHRydWUsIHRydWUpOwotCi0JCVBvaW50IHNpemUxID0gbGFiZWwxLmdldFNpemUoKTsKLQkJUG9pbnQgc2l6ZTIgPSBsYWJlbDIuZ2V0U2l6ZSgpOwotCQlpbnQgd2lkdGggPSBNYXRoLm1heChzaXplMS54LCBzaXplMi54KTsKLQotCQkvLyBUZXN0IDEKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lci5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJLy8gVGVzdCAyCi0JCWNvbnRyb2xBbGlnbmVyLnJlbW92ZShsYWJlbDEpOwotCi0JCXdpZHRoID0gbGFiZWwyLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbnRyb2xBbGlnbmVyMigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCUxhYmVsIGxhYmVsMSA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWwgbGFiZWwyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMSk7Ci0JCXVwZGF0ZUdyaWREYXRhKGxhYmVsMik7Ci0KLQkJY29udHJvbEFsaWduZXIuYWRkKGxhYmVsMSk7Ci0KLQkJQ29udHJvbEFsaWduZXIgY29udHJvbEFsaWduZXIyID0gbmV3IENvbnRyb2xBbGlnbmVyKCk7Ci0JCWNvbnRyb2xBbGlnbmVyLmFkZChjb250cm9sQWxpZ25lcjIpOwotCQljb250cm9sQWxpZ25lcjIuYWRkKGxhYmVsMik7Ci0KLQkJbGFiZWwxLnNldFRleHQoIlRoaXMgaXMgYSBDb250cm9sQWxpZ25lciIpOwotCQlsYWJlbDIuc2V0VGV4dCgiVGhpcyBpcyBhIHZlcnkgbG9uZyBDb250cm9sQWxpZ25lciIpOwotLy8JCXBhcmVudC5sYXlvdXQodHJ1ZSwgdHJ1ZSk7Ci0KLQkJUG9pbnQgc2l6ZTEgPSBsYWJlbDEuZ2V0U2l6ZSgpOwotCQlQb2ludCBzaXplMiA9IGxhYmVsMi5nZXRTaXplKCk7Ci0JCWludCB3aWR0aCA9IE1hdGgubWF4KHNpemUxLngsIHNpemUyLngpOwotCi0JCS8vIFRlc3QgMQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyLmdldE1heGltdW1XaWR0aCgpCi0JCSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSB3aWR0aCBzaG91bGQgYmUgIiArIHdpZHRoICsgIiwiLAotCQkJd2lkdGgsCi0JCQljb250cm9sQWxpZ25lcjIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQkvLyBUZXN0IDIKLQkJY29udHJvbEFsaWduZXIyLnJlbW92ZShsYWJlbDIpOwotCi0JCXdpZHRoID0gbGFiZWwxLmdldFNpemUoKS54OwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggc2hvdWxkIGJlICIgKyB3aWR0aCArICIsIiwKLQkJCXdpZHRoLAotCQkJY29udHJvbEFsaWduZXIuZ2V0TWF4aW11bVdpZHRoKCkKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIHNob3VsZCBiZSAiICsgd2lkdGggKyAiLCIsCi0JCQl3aWR0aCwKLQkJCWNvbnRyb2xBbGlnbmVyMi5nZXRNYXhpbXVtV2lkdGgoKQotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVHcmlkRGF0YShDb250cm9sIGNvbnRyb2wpIHsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSBmYWxzZTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sRW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDZhMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0NvbnRyb2xFbmFibGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbEVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKGJvb2xlYW5Ib2xkZXIsIGNvbWJvKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSBlbmFibGVkIiwKLQkJCWNvbWJvLmlzRW5hYmxlZCgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQljb21iby5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJY29tYm8uZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFN3aXRjaGVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTExYmQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sU3dpdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udHJvbFN3aXRjaGVyVGVzdCB7Ci0KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhbmUxOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhbmUyOwotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGJ1aWxkUGFuZTEoKSB7Ci0KLQkJaWYgKHBhbmUxID09IG51bGwpIHsKLQotCQkJcGFuZTEgPSBuZXcgQ29tcG9zaXRlKHBhZ2VCb29rLCBTV1QuTlVMTCk7Ci0JCQlwYW5lMS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFuZTEsIFNXVC5OVUxMKTsKLQkJCWxhYmVsLnNldFRleHQoIiZUZXN0MjoiKTsKLQotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFuZTEsIFNXVC5CT1JERVIpOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFuZTEsIFNXVC5CT1JERVIpOwotCi0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCX0KLQotCQlyZXR1cm4gcGFuZTE7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgYnVpbGRQYW5lMigpIHsKLQotCQlpZiAocGFuZTIgPT0gbnVsbCkgewotCi0JCQlwYW5lMiA9IG5ldyBDb21wb3NpdGUocGFnZUJvb2ssIFNXVC5OVUxMKTsKLQkJCXBhbmUyLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYW5lMiwgU1dULk5VTEwpOwotCQkJbGFiZWwuc2V0VGV4dCgiJlRlc3QxOiIpOwotCi0JCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYW5lMiwgU1dULkJPUkRFUik7Ci0JCQl0ZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl9Ci0KLQkJcmV0dXJuIHBhbmUyOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiAodmFsdWUgPyBwYW5lMSA6IHBhbmUyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2socGFyZW50LCBTV1QuTlVMTCk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCi0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCi0JCQlwYXJlbnQgICA9IG51bGw7Ci0JCQlwYWdlQm9vayA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2goKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHN3aXRjaEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oKTsKLQkJVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4gdHJhbnNmb3JtZXIgPSBidWlsZFRyYW5zZm9ybWVyKCk7Ci0KLQkJcGFuZTEgPSBidWlsZFBhbmUxKCk7Ci0JCXBhbmUxLnNldFZpc2libGUoZmFsc2UpOwotCi0JCXBhbmUyID0gYnVpbGRQYW5lMigpOwotCQlwYW5lMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQotCQluZXcgQ29udHJvbFN3aXRjaGVyKAotCQkJc3dpdGNoSG9sZGVyLAotCQkJdHJhbnNmb3JtZXIsCi0JCQlwYWdlQm9vawotCQkpOwotCi0JCS8vIFRlc3QgMQotCQlzd2l0Y2hIb2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShwYWdlQm9vaywgImN1cnJlbnRQYWdlIik7Ci0KLQkJYXNzZXJ0Tm90TnVsbCgKLQkJCSJUaGUgcGFnZSBib29rJ3MgcGFnZSBzaG91bGRuJ3QgYmUgbnVsbCIsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJYXNzZXJ0U2FtZSgKLQkJCSJUaGUgY3VycmVudCBwYW5lIHNob3VsZCBiZSBwYW5lMSIsCi0JCQlwYW5lMSwKLQkJCWNvbnRyb2wKLQkJKTsKLQotCQlQb2ludCBwYW5lMVNpemUgPSBwYW5lMS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlQb2ludCBwYWdlQm9va1NpemUgPSBwYWdlQm9vay5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgd2lkdGggb2YgdGhlIFBhZ2VCb29rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgd2lkdGggb2YgcGFuZTEiLAotCQkJcGFuZTFTaXplLngsCi0JCQlwYWdlQm9va1NpemUueAotCQkpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgaGVpZ2h0IG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIGhlaWdodCBvZiBwYW5lMSIsCi0JCQlwYW5lMVNpemUueSwKLQkJCXBhZ2VCb29rU2l6ZS55Ci0JCSk7Ci0KLQkJLy8gVGVzdCAyCi0JCXN3aXRjaEhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0JCWNvbnRyb2wgPSAoQ29udHJvbCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUocGFnZUJvb2ssICJjdXJyZW50UGFnZSIpOwotCi0JCWFzc2VydE5vdE51bGwoCi0JCQkiVGhlIHBhZ2UgYm9vaydzIHBhZ2Ugc2hvdWxkbid0IGJlIG51bGwiLAotCQkJY29udHJvbAotCQkpOwotCi0JCWFzc2VydFNhbWUoCi0JCQkiVGhlIGN1cnJlbnQgcGFuZSBzaG91bGQgYmUgcGFuZTIiLAotCQkJcGFuZTIsCi0JCQljb250cm9sCi0JCSk7Ci0KLQkJUG9pbnQgcGFuZTJTaXplID0gcGFuZTIuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJcGFnZUJvb2tTaXplID0gcGFnZUJvb2suY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIHdpZHRoIG9mIHRoZSBQYWdlQm9vayBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIHdpZHRoIG9mIHBhbmUyIiwKLQkJCXBhbmUyU2l6ZS54LAotCQkJcGFnZUJvb2tTaXplLngKLQkJKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIGhlaWdodCBvZiB0aGUgUGFnZUJvb2sgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBoZWlnaHQgb2YgcGFuZTIiLAotCQkJcGFuZTJTaXplLnksCi0JCQlwYWdlQm9va1NpemUueQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzhlZDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9Db250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250cm9sVmlzaWJpbGl0eUVuYWJsZXJUZXN0IHsKLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFN3aXRjaFN0YXRlKCkgewotCi0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyID0KLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4odHJ1ZSk7Ci0KLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSKTsKLQotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKGJvb2xlYW5Ib2xkZXIsIGNvbWJvKTsKLQotCQlhc3NlcnRUcnVlKAotCQkJIlRoZSBDb21ibyBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQljb21iby5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgQ29tYm8gc2hvdWxkIG5vdCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlICh0cnVlKQotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCi0JCWFzc2VydFRydWUoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBiZSB2aXNpYmxlIiwKLQkJCWNvbWJvLmlzVmlzaWJsZSgpCi0JCSk7Ci0KLQkJLy8gQ2hhbmdlIHN0YXRlIChmYWxzZSkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RmFsc2UoCi0JCQkiVGhlIENvbWJvIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQljb21iby5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJY29tYm8uZGlzcG9zZSgpOwotCQlib29sZWFuSG9sZGVyLnNldFZhbHVlKHRydWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnB0VWlVdGlsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmMDBkMi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwdFVpVXRpbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkpVbml0NFRlc3RBZGFwdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotQFN1aXRlQ2xhc3NlcwotKHsKLQlDb250cm9sQWxpZ25lclRlc3QuY2xhc3MsCi0JQ29udHJvbFN3aXRjaGVyVGVzdC5jbGFzcywKLQlDb250cm9sRW5hYmxlclRlc3QuY2xhc3MsCi0JQ29udHJvbFZpc2liaWxpdHlFbmFibGVyVGVzdC5jbGFzcywKLQlMYWJlbGVkQnV0dG9uVGVzdC5jbGFzcywKLQlMYWJlbGVkTGFiZWxUZXN0LmNsYXNzLAotCUxhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuY2xhc3MsCi0JUGFuZUVuYWJsZXJUZXN0LmNsYXNzLAotCVBhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuY2xhc3MsCi19KQotQFJ1bldpdGgoU3VpdGUuY2xhc3MpCi1wdWJsaWMgZmluYWwgY2xhc3MgSnB0VWlVdGlsVGVzdHMgewotCi0JcHJpdmF0ZSBKcHRVaVV0aWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCk7Ci0JCXN1aXRlLmFkZFRlc3QobmV3IEpVbml0NFRlc3RBZGFwdGVyKEpwdFVpVXRpbFRlc3RzLmNsYXNzKSk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRCdXR0b25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTE1YWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQnV0dG9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuTGFiZWxlZEJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZEJ1dHRvblRlc3QgewotCi0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjEoKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQluZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCX0KLQotCUBUZXN0KGV4cGVjdGVkPUFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5jbGFzcykKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjIoKSB7Ci0JCW5ldyBMYWJlbGVkQnV0dG9uKG51bGwpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQkJbGFiZWxlZEJ1dHRvbi5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIEJ1dHRvbiBkaWRuJ3QgcmVjZWl2ZSB0aGUgSW1hZ2UiLAotCQkJCWV4cGVjdGVkLAotCQkJCWJ1dHRvbi5nZXRJbWFnZSgpCi0JCQkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2VEaXNwb3NlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZEJ1dHRvbiBsYWJlbGVkQnV0dG9uID0gbmV3IExhYmVsZWRCdXR0b24oYnV0dG9uKTsKLQotCQkJYnV0dG9uLmRpc3Bvc2UoKTsKLQotCQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCQlsYWJlbGVkQnV0dG9uLnNldEltYWdlKGV4cGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHQoKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRCdXR0b24uc2V0VGV4dChleHBlY3RlZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKAotCQkJIlRoZSBCdXR0b24gZGlkbid0IHJlY2VpdmUgdGhlIHRleHQiLAotCQkJZXhwZWN0ZWQsCi0JCQlidXR0b24uZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkQnV0dG9uIGxhYmVsZWRCdXR0b24gPSBuZXcgTGFiZWxlZEJ1dHRvbihidXR0b24pOwotCi0JCWJ1dHRvbi5kaXNwb3NlKCk7Ci0KLQkJLy8gVGhpcyBzaG91bGQgbm90IGZhaWwgYnV0IHNpbXBseSBkbyBub3RoaW5nCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRCdXR0b24uc2V0VGV4dChleHBlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzOGRjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0xhYmVsZWRDb250cm9sVXBkYXRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkQ29udHJvbFVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkxhYmVsZWRMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMYWJlbGVkQ29udHJvbFVwZGF0ZXJUZXN0IHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQkJcGFyZW50ID0gbnVsbDsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPigpOwotCQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIG51bGwsIGltYWdlSG9sZGVyKTsKLQotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIEltYWdlIiwKLQkJCQlleHBlY3RlZCwKLQkJCQlsYWJlbC5nZXRJbWFnZSgpCi0JCQkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZXhwZWN0ZWQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2VEaXNwb3NlKCkgewotCi0JCUltYWdlIGV4cGVjdGVkID0gbmV3IEltYWdlKHBhcmVudC5nZXREaXNwbGF5KCksIDE2LCAxNik7Ci0KLQkJdHJ5IHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gaW1hZ2VIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPigpOwotCQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIG51bGwsIGltYWdlSG9sZGVyKTsKLQotCQkJbGFiZWwuZGlzcG9zZSgpOwotCQkJbGFiZWxlZExhYmVsLnNldEltYWdlKGV4cGVjdGVkKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldFRleHQoKSB7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbmV3IExhYmVsZWRDb250cm9sVXBkYXRlcihsYWJlbGVkTGFiZWwsIHRleHRIb2xkZXIpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCXRleHRIb2xkZXIuc2V0VmFsdWUoZXhwZWN0ZWQpOwotCi0JCWFzc2VydEVxdWFscygKLQkJCSJUaGUgTGFiZWwgZGlkbid0IHJlY2VpdmUgdGhlIHRleHQiLAotCQkJZXhwZWN0ZWQsCi0JCQlsYWJlbC5nZXRUZXh0KCkKLQkJKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0RGlzcG9zZSgpIHsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGV4dEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQluZXcgTGFiZWxlZENvbnRyb2xVcGRhdGVyKGxhYmVsZWRMYWJlbCwgdGV4dEhvbGRlcik7Ci0KLQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCXRleHRIb2xkZXIuc2V0VmFsdWUoZXhwZWN0ZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvTGFiZWxlZExhYmVsVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2JjZWUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9MYWJlbGVkTGFiZWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5MYWJlbGVkTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgTGFiZWxlZExhYmVsVGVzdCB7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBwYXJlbnQ7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoU1dUVXRpbC5nZXRTaGVsbCgpLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRpc3Bvc2UoKTsKLQkJCXBhcmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RMYWJlbGVkQnV0dG9uMSgpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCW5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCX0KLQotCUBUZXN0KGV4cGVjdGVkPUFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbi5jbGFzcykKLQlwdWJsaWMgdm9pZCB0ZXN0TGFiZWxlZEJ1dHRvbjIoKSB7Ci0JCW5ldyBMYWJlbGVkTGFiZWwobnVsbCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW1hZ2UoKSB7Ci0KLQkJSW1hZ2UgZXhwZWN0ZWQgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgMTYsIDE2KTsKLQotCQl0cnkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0KLQkJCWFzc2VydEVxdWFscygKLQkJCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSBJbWFnZSIsCi0JCQkJZXhwZWN0ZWQsCi0JCQkJbGFiZWwuZ2V0SW1hZ2UoKQotCQkJKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWV4cGVjdGVkLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEltYWdlRGlzcG9zZSgpIHsKLQotCQlJbWFnZSBleHBlY3RlZCA9IG5ldyBJbWFnZShwYXJlbnQuZ2V0RGlzcGxheSgpLCAxNiwgMTYpOwotCi0JCXRyeSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUxhYmVsZWRMYWJlbCBsYWJlbGVkTGFiZWwgPSBuZXcgTGFiZWxlZExhYmVsKGxhYmVsKTsKLQotCQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCQkvLyBUaGlzIHNob3VsZCBub3QgZmFpbCBidXQgc2ltcGx5IGRvIG5vdGhpbmcKLQkJCWxhYmVsZWRMYWJlbC5zZXRJbWFnZShleHBlY3RlZCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlleHBlY3RlZC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZXh0KCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJTGFiZWxlZExhYmVsIGxhYmVsZWRMYWJlbCA9IG5ldyBMYWJlbGVkTGFiZWwobGFiZWwpOwotCi0JCVN0cmluZyBleHBlY3RlZCA9ICJUaGlzIGlzIGEgdGVzdCI7Ci0JCWxhYmVsZWRMYWJlbC5zZXRUZXh0KGV4cGVjdGVkKTsKLQotCQlhc3NlcnRFcXVhbHMoCi0JCQkiVGhlIExhYmVsIGRpZG4ndCByZWNlaXZlIHRoZSB0ZXh0IiwKLQkJCWV4cGVjdGVkLAotCQkJbGFiZWwuZ2V0VGV4dCgpCi0JCSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGV4dERpc3Bvc2UoKSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5VTEwpOwotCQlMYWJlbGVkTGFiZWwgbGFiZWxlZExhYmVsID0gbmV3IExhYmVsZWRMYWJlbChsYWJlbCk7Ci0KLQkJbGFiZWwuZGlzcG9zZSgpOwotCi0JCS8vIFRoaXMgc2hvdWxkIG5vdCBmYWlsIGJ1dCBzaW1wbHkgZG8gbm90aGluZwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiVGhpcyBpcyBhIHRlc3QiOwotCQlsYWJlbGVkTGFiZWwuc2V0VGV4dChleHBlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvUGFuZUVuYWJsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGZkOTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lRW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRGlhbG9nUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBQYW5lRW5hYmxlclRlc3QgewotCXByaXZhdGUgQ29tcG9zaXRlIHBhcmVudDsKLQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHsKLQkJcGFyZW50ID0gbmV3IENvbXBvc2l0ZShTV1RVdGlsLmdldFNoZWxsKCksIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQl9Ci0KLQlAQWZ0ZXIKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwYXJlbnQuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0U3dpdGNoU3RhdGUoKSB7Ci0KLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJvb2xlYW5Ib2xkZXIgPQotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPih0cnVlKTsKLQotCQlEaWFsb2dQYW5lPE5vZGU+IHBhbmUgPSBuZXcgRGlhbG9nUGFuZTxOb2RlPigKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Tm9kZT4oKSwKLQkJCXBhcmVudCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCX0KLQkJfTsKLQotCQluZXcgUGFuZUVuYWJsZXIoYm9vbGVhbkhvbGRlciwgcGFuZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIGVuYWJsZWQiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNFbmFibGVkKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgZW5hYmxlZCIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc0VuYWJsZWQoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJcGFuZS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9QYW5lVmlzaWJpbGl0eUVuYWJsZXJUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTBhYzNjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsL1BhbmVWaXNpYmlsaXR5RW5hYmxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lVmlzaWJpbGl0eUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgZmluYWwgY2xhc3MgUGFuZVZpc2liaWxpdHlFbmFibGVyVGVzdCB7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgcGFyZW50OwotCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgewotCQlwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKFNXVFV0aWwuZ2V0U2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCX0KLQotCUBBZnRlcgotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgewotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTd2l0Y2hTdGF0ZSgpIHsKLQotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYm9vbGVhbkhvbGRlciA9Ci0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KHRydWUpOwotCi0JCURpYWxvZ1BhbmU8Tm9kZT4gcGFuZSA9IG5ldyBEaWFsb2dQYW5lPE5vZGU+KAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOb2RlPigpLAotCQkJcGFyZW50KQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJfQotCQl9OwotCi0JCW5ldyBQYW5lVmlzaWJpbGl0eUVuYWJsZXIoYm9vbGVhbkhvbGRlciwgcGFuZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAobnVsbCkKLQkJYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQotCQlhc3NlcnRGYWxzZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgbm90IGJlIHZpc2libGUiLAotCQkJcGFuZS5nZXRDb250cm9sKCkuaXNWaXNpYmxlKCkKLQkJKTsKLQotCQkvLyBDaGFuZ2Ugc3RhdGUgKHRydWUpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgKLQkJCSJUaGUgcGFuZSBzaG91bGQgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIENoYW5nZSBzdGF0ZSAoZmFsc2UpCi0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoZmFsc2UpOwotCi0JCWFzc2VydEZhbHNlKAotCQkJIlRoZSBwYW5lIHNob3VsZCBub3QgYmUgdmlzaWJsZSIsCi0JCQlwYW5lLmdldENvbnRyb2woKS5pc1Zpc2libGUoKQotCQkpOwotCi0JCS8vIERpc3Bvc2UKLQkJcGFuZS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTU2OGJkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Jvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5zd3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5BcHBsaWNhdGlvbldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBib29sZWFuIHN0YXRlIGNvbnRyb2xsZXJzICgnZW5hYmxlZCcgYW5kICd2aXNpYmxlJykuCi0gKiA8cD4KLSAqIE5vdGUgdGhlIGJlaGF2aW9yIG9mIGNvbXBvc2l0ZXM6PHVsPgotICogPGxpPldoZW4gYSBjb21wb3NpdGUgaXMgZGlzYWJsZWQsIGl0cyBjaGlsZHJlbiBhcmUgZGlzYWJsZWQgYnV0IDxlbT5ub3Q8L2VtPgotICogICAgIGdyYXllZCBvdXQuCi0gKiA8bGk+V2hlbiBhIGNvbXBvc2l0ZSBpcyBtYWRlIGludmlzaWJsZSwgaXRzIGNoaWxkcmVuIGFyZSBhbHNvIG1hZGUKLSAqICAgICBpbnZpc2libGUuCi0gKiA8L3VsPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZW5hYmxlZEhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHZpc2libGVIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RTZWxlY3Rpb25Ib2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuU3RhdGVDb250cm9sbGVyVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLmVuYWJsZWRIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMudmlzaWJsZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KG51bGwpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gcmVzdWx0ID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiemVybyIpOwotCQlyZXN1bHQuYWRkKCJvbmUiKTsKLQkJcmVzdWx0LmFkZCgidHdvIik7Ci0JCXJlc3VsdC5hZGQoInRocmVlIik7Ci0JCXJlc3VsdC5hZGQoImZvdXIiKTsKLQkJcmVzdWx0LmFkZCgiZml2ZSIpOwotCQlyZXN1bHQuYWRkKCJzaXgiKTsKLQkJcmVzdWx0LmFkZCgic2V2ZW4iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNTAwLCAxNTApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB3aWRnZXRQYW5lbCA9IHRoaXMuYnVpbGRXaWRnZXRQYW5lbHMobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHdpZGdldFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRXaWRnZXRQYW5lbHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuVkVSVElDQUwpKTsKLQotCQl0aGlzLmJ1aWxkV2lkZ2V0UGFuZWwxKHBhbmVsKTsKLQkJdGhpcy5idWlsZFdpZGdldFBhbmVsMihwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFdpZGdldFBhbmVsMShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCi0JCUJ1dHRvbiBlbmFibGVkQ29tYm9Cb3hDaGVja0JveCA9IHRoaXMuYnVpbGRFbmFibGVkQ29tYm9Cb3hDaGVja0JveChwYW5lbCk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5lbmFibGVkSG9sZGVyLCBlbmFibGVkQ29tYm9Cb3hDaGVja0JveCk7Ci0KLQkJQnV0dG9uIHZpc2libGVDb21ib0JveENoZWNrQm94ID0gdGhpcy5idWlsZFZpc2libGVDb21ib0JveENoZWNrQm94KHBhbmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLnZpc2libGVIb2xkZXIsIHZpc2libGVDb21ib0JveENoZWNrQm94KTsKLQotCQlMYWJlbCBjb21ib0JveExhYmVsID0gdGhpcy5idWlsZENvbWJvQm94TGFiZWwocGFuZWwpOwotCQlDb21ibyBjb21ib0JveCA9IHRoaXMuYnVpbGRDb21ib0JveChwYW5lbCk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5saXN0SG9sZGVyLCB0aGlzLmxpc3RTZWxlY3Rpb25Ib2xkZXIsIGNvbWJvQm94KTsKLQkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZSh0aGlzLmVuYWJsZWRIb2xkZXIsIGNvbWJvQm94TGFiZWwsIGNvbWJvQm94KTsKLQkJU1dUVG9vbHMuY29udHJvbFZpc2libGVTdGF0ZSh0aGlzLnZpc2libGVIb2xkZXIsIGNvbWJvQm94TGFiZWwsIGNvbWJvQm94KTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZEVuYWJsZWRDb21ib0JveENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDaGVja0JveChwYXJlbnQsICJlbmFibGVkIik7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRWaXNpYmxlQ29tYm9Cb3hDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2hlY2tCb3gocGFyZW50LCAidmlzaWJsZSIpOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGJ1aWxkQ29tYm9Cb3hMYWJlbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KCJsaXN0OiIpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBidWlsZENvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFdpZGdldFBhbmVsMihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCi0JCUJ1dHRvbiBjaGVja0JveDEgPSB0aGlzLmJ1aWxkQ2hlY2tCb3gocGFuZWwsICJvbmUiKTsKLQkJdGhpcy5idWlsZENoZWNrQm94KHBhbmVsLCAidHdvIik7Ci0JCXRoaXMuYnVpbGRDaGVja0JveChwYW5lbCwgInRocmVlIik7Ci0JCXRoaXMuYnVpbGRDaGVja0JveChwYW5lbCwgImZvdXIiKTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMuZW5hYmxlZEhvbGRlciwgcGFuZWwsIGNoZWNrQm94MSk7Ci0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUodGhpcy52aXNpYmxlSG9sZGVyLCBwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgd2lkZ2V0UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh3aWRnZXRQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRDbGVhckVuYWJsZWRNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhclZpc2libGVNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkTmV4dEJ1dHRvbihwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJFbmFibGVkTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJFbmFibGVkTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJFbmFibGVkTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBlbmFibGVkIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLmNsZWFyRW5hYmxlZE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgZW5hYmxlZCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyRW5hYmxlZE1vZGVsKCkgewotCQl0aGlzLmVuYWJsZWRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJWaXNpYmxlTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJWaXNpYmxlTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJWaXNpYmxlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciB2aXNpYmxlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQm9vbGVhblN0YXRlQ29udHJvbGxlclVJVGVzdC50aGlzLmNsZWFyVmlzaWJsZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdmlzaWJsZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyVmlzaWJsZU1vZGVsKCkgewotCQl0aGlzLnZpc2libGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkTnVsbFNlbGVjdGlvbk1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZE51bGxTZWxlY3Rpb25Nb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGROdWxsU2VsZWN0aW9uTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJudWxsIHNlbGVjdGlvbiBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QudGhpcy5zZXRTZWxlY3Rpb25Nb2RlbE51bGwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJudWxsIHNlbGVjdGlvbiBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdGlvbk1vZGVsTnVsbCgpIHsKLQkJdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5leHRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTmV4dEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGROZXh0QUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigibmV4dCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJvb2xlYW5TdGF0ZUNvbnRyb2xsZXJVSVRlc3QudGhpcy5uZXh0KCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgibmV4dCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIG5leHQoKSB7Ci0JCXRoaXMubGlzdFNlbGVjdGlvbkhvbGRlci5zZXRWYWx1ZSh0aGlzLmdldE5leHRMaXN0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5leHRMaXN0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SG9sZGVyLmdldCh0aGlzLmdldE5leHRMaXN0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TmV4dExpc3RTZWxlY3Rpb25JbmRleCgpIHsKLQkJaW50IGluZGV4ID0gdGhpcy5nZXRMaXN0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlpbmRleCsrOwotCQlyZXR1cm4gKGluZGV4ID09IHRoaXMubGlzdEhvbGRlci5zaXplKCkpID8gMCA6IGluZGV4OwotCX0KLQotCXByaXZhdGUgaW50IGdldExpc3RTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKHRoaXMuZ2V0TGlzdFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMaXN0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5saXN0U2VsZWN0aW9uSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQyMTEwMS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9DaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogUGxheSBhcm91bmQgd2l0aCBhIHNldCBvZiBjaGVjayBib3hlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBmbGFnMUhvbGRlcjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcySG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbm90RmxhZzJIb2xkZXI7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdChhcmdzKTsKLQkJd2luZG93LnNldEJsb2NrT25PcGVuKHRydWUpOwotCQl3aW5kb3cub3BlbigpOwotCQlEaXNwbGF5LmdldEN1cnJlbnQoKS5kaXNwb3NlKCk7Ci0JCVN5c3RlbS5leGl0KDApOwotCX0KLQotCXByaXZhdGUgQ2hlY2tCb3hNb2RlbEJpbmRpbmdVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCh0cnVlLCB0cnVlKTsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4odGhpcy50ZXN0TW9kZWwpOwotCQl0aGlzLmZsYWcxSG9sZGVyID0gdGhpcy5idWlsZEZsYWcxSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5mbGFnMkhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJIb2xkZXIgPSB0aGlzLmJ1aWxkTm90RmxhZzJIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRGbGFnMUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgVGVzdE1vZGVsLkZMQUcxX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRmxhZzEoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEZsYWcxKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRmxhZzJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vdEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBCb29sZWFuPihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuTk9UX0ZMQUcyX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzTm90RmxhZzIoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vdEZsYWcyKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoNDAwLCAxMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBjaGVja0JveFBhbmVsID0gdGhpcy5idWlsZENoZWNrQm94UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIGNoZWNrQm94UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZENoZWNrQm94UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzUpOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEZsYWcxQ2hlY2tCb3gocGFuZWwpOwotCQl0aGlzLmJ1aWxkRmxhZzJDaGVja0JveChwYW5lbCk7Ci0JCXRoaXMuYnVpbGROb3RGbGFnMkNoZWNrQm94KHBhbmVsKTsKLQkJdGhpcy5idWlsZFVuYXR0YWNoZWRDaGVja0JveChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcxQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZmxhZyAxIik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5mbGFnMUhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZmxhZyAyIik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5mbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vdEZsYWcyQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgibm90IGZsYWcgMiIpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubm90RmxhZzJIb2xkZXIsIGNoZWNrQm94KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRVbmF0dGFjaGVkQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgidW5hdHRhY2hlZCIpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVW5hdHRhY2hlZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidW5hdHRhY2hlZCBkZWZhdWx0IHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJ1bmF0dGFjaGVkIHNlbGVjdGVkOiAiICsgZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ29udHJvbFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2hlY2tCb3hQYW5lbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNoZWNrQm94UGFuZWwpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkRmxpcEZsYWcxQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZE5vdEZsYWcyVG9nZ2xlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24ocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEZsaXBGbGFnMUJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRGbGlwRmxhZzFBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkRmxpcEZsYWcxQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiZmxpcCBmbGFnIDEiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmZsaXBGbGFnMSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImZsaXAgZmxhZyAxIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgZmxpcEZsYWcxKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXRGbGFnMSggISB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcxKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZE5vdEZsYWcyVG9nZ2xlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5UT0dHTEUpOwotCQljaGVja0JveC5zZXRUZXh0KCJub3QgZmxhZyAyIik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5ub3RGbGFnMkhvbGRlciwgY2hlY2tCb3gpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENsZWFyTW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhck1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUNoZWNrQm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucmVzdG9yZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgicmVzdG9yZSBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW50TW9kZWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUHJpbnRNb2RlbEFDSSgpLmZpbGwocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRQcmludE1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicHJpbnQgbW9kZWwiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlDaGVja0JveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJwcmludCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIGJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgYm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoYm9vbGVhbiBmbGFnMSwgYm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKGJvb2xlYW4gZmxhZzEpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcyKGJvb2xlYW4gZmxhZzIpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMjsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMl9QUk9QRVJUWSwgb2xkLCBmbGFnMik7Ci0JCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzTm90RmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub3RGbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROb3RGbGFnMihib29sZWFuIG5vdEZsYWcyKSB7Ci0JCQl0aGlzLnNldEZsYWcyKCAhIG5vdEZsYWcyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmlzRmxhZzEoKSArICIgLSAiICsgdGhpcy5pc0ZsYWcyKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L0Ryb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZDM3ZDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgamF2YS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIHJlYWQtb25seSBjb21iby1ib3hlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCWZpbmFsIFRhc2tMaXN0IHRhc2tMaXN0OwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+IHRhc2tMaXN0SG9sZGVyOwotCXByaXZhdGUgVGV4dCB0YXNrVGV4dEZpZWxkOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGFza0xpc3QgPSBuZXcgVGFza0xpc3QoKTsKLQkJdGhpcy50YXNrTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+KHRoaXMudGFza0xpc3QpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInN3aW0iKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJiaWtlIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygicnVuIik7Ci0JCVRhc2sgcmVzdCA9IHRoaXMudGFza0xpc3QuYWRkVGFzaygicmVzdCIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlcGVhdCIpOwotCQl0aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFzayhyZXN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoODAwLCAzMDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0YXNrTGlzdFBhbmVsID0gdGhpcy5idWlsZFRhc2tMaXN0UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHRhc2tMaXN0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdGhpcy5idWlsZFRhc2tMaXN0UGFuZWxfKHBhbmVsKTsgIC8vIGZhbHNlID0gbmF0aXZlIChDb21ibykKLQotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVGFza0xpc3RQYW5lbF8oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gInByaW1pdGl2ZSB1bnNvcnRlZCI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTdHJpbmcgbGFiZWwgPSAicHJpbWl0aXZlIHNvcnRlZCI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gInByaW1pdGl2ZSByZXZlcnNlIHNvcnRlZCI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza05hbWVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGxhYmVsID0gIm9iamVjdCB1bnNvcnRlZCI7Ci0JCXRoaXMuYnVpbGRDb21ib0JveFBhbmVsKHBhcmVudCwgbGFiZWwsIHRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RNb2RlbCgpLCB0aGlzLmJ1aWxkUHJpb3JpdHlUYXNrQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJvYmplY3Qgc29ydGVkIjsKLQkJdGhpcy5idWlsZENvbWJvQm94UGFuZWwocGFyZW50LCBsYWJlbCwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEN1c3RvbVNvcnRlZE9iamVjdExpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBsYWJlbCA9ICJvYmplY3QgcmV2ZXJzZSBzb3J0ZWQiOwotCQl0aGlzLmJ1aWxkQ29tYm9Cb3hQYW5lbChwYXJlbnQsIGxhYmVsLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIDxFPiB2b2lkIGJ1aWxkQ29tYm9Cb3hQYW5lbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIExpc3RWYWx1ZU1vZGVsPEU+IG1vZGVsLCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxFPiBzZWxlY3RlZEl0ZW1Nb2RlbCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0KLQkJTGFiZWwgY29tYm9Cb3hMYWJlbCA9IG5ldyBMYWJlbChwYW5lbCwgU1dULkxFRlQgfCBTV1QuVkVSVElDQUwpOwotCQljb21ib0JveExhYmVsLnNldFRleHQobGFiZWwpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDIwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQljb21ib0JveExhYmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCUNvbWJvIGNvbWJvQm94ID0gdGhpcy5idWlsZENvbWJvQm94KHBhbmVsKTsKLQkJZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjb21ib0JveExhYmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCWNvbWJvQm94LnNldExheW91dERhdGEoZmQpOwotCQlTV1RUb29scy5iaW5kKG1vZGVsLCBzZWxlY3RlZEl0ZW1Nb2RlbCwgY29tYm9Cb3gpOyAgLy8gdXNlICN0b1N0cmluZygpCi0JfQotCi0JcHJpdmF0ZSBDb21ibyBidWlsZENvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuY29tcGFyZVRvKHRvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkUHJpb3JpdHlUYXNrQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmlvcml0eVRhc2tBZGFwdGVyKHRoaXMudGFza0xpc3RIb2xkZXIpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBQcmlvcml0eVRhc2tBZGFwdGVyCi0JCWV4dGVuZHMgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBUYXNrPgotCXsKLQkJUHJpb3JpdHlUYXNrQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXIpIHsKLQkJCXN1cGVyKHRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5QUklPUklUWV9UQVNLX1BST1BFUlRZKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRhc2sgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFByaW9yaXR5VGFzaygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oVGFzayB2YWx1ZSkgewotCQkJdGhpcy5zdWJqZWN0LnNldFByaW9yaXR5VGFzayh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmlvcml0eVRhc2tOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmlvcml0eVRhc2tOYW1lQWRhcHRlcih0aGlzLnRhc2tMaXN0SG9sZGVyKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJpb3JpdHlUYXNrTmFtZUFkYXB0ZXIKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4KLQl7Ci0JCVByaW9yaXR5VGFza05hbWVBZGFwdGVyKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0PiB0YXNrTGlzdEhvbGRlcikgewotCQkJc3VwZXIodGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlBSSU9SSVRZX1RBU0tfTkFNRV9QUk9QRVJUWSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFByaW9yaXR5VGFza05hbWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB0YXNrTGlzdFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFza0xpc3RQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgbWlzYyA9IHRoaXMuYnVpbGRNaXNjVGFza1BhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFkZFJlbW92ZVRhc2tQYW5lbChwYW5lbCwgbWlzYyk7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkTWlzY1Rhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNDAwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyTGlzdEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDaGFuZ2VQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZENsZWFyUHJpb3JpdHlUYXNrQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckxpc3RBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBsaXN0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJUYXNrcygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIGFsbCB0aGUgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImNsZWFyIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImNsZWFyIHRoZSB0YXNrIGxpc3QgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDaGFuZ2VQcmlvcml0eVRhc2tBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjaGFuZ2UgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlEcm9wRG93bkxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jaGFuZ2VQcmlvcml0eVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjaGFuZ2UgdGhlIHByaW9yaXR5IHRhc2siKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBwcmlvcml0eSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyUHJpb3JpdHlUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHByaW9yaXR5IHRhc2siKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQWRkUmVtb3ZlVGFza1BhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIENvbnRyb2wgY2xlYXJCdXR0b24pIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNsZWFyQnV0dG9uKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGb3JtTGF5b3V0KCkpOwotCQlDb250cm9sIGFkZEJ1dHRvbiA9IHRoaXMuYnVpbGRBZGRCdXR0b24ocGFuZWwpOwotCQlDb250cm9sIHJlbW92ZUJ1dHRvbiA9IHRoaXMuYnVpbGRSZW1vdmVCdXR0b24ocGFuZWwpOwotCQl0aGlzLmJ1aWxkVGFza1RleHRGaWVsZChwYW5lbCwgYWRkQnV0dG9uLCByZW1vdmVCdXR0b24pOwotCX0KLQotCS8vIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBhc3NvY2lhdGUgYW4gQUNJIHdpdGggZm9ybSBkYXRhPwotCXByaXZhdGUgQ29udHJvbCBidWlsZEFkZEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCA1MCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZEFkZEFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQWRkQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiYWRkIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJRHJvcERvd25MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuYWRkVGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoImFkZCBhIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkUmVtb3ZlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC01MCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRSZW1vdmVBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlbW92ZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlbW92ZSIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCURyb3BEb3duTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlbW92ZVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgdGhlIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVGFza1RleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGFkZEJ1dHRvbiwgQ29udHJvbCByZW1vdmVCdXR0b24pIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbW92ZUJ1dHRvbik7Ci0JCXRoaXMudGFza1RleHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0YXNrVGV4dEZpZWxkVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0Jdm9pZCBhZGRUYXNrKCkgewotCQlTdHJpbmcgdGFza1RleHQgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrVGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2sodGFza1RleHQpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyVGFza3MoKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUodGhpcy50YXNrTGlzdCk7Ci0JfQotCi0Jdm9pZCBjaGFuZ2VQcmlvcml0eVRhc2soKSB7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChUYXNrIHRhc2sgOiB0aGlzLnRhc2tMaXN0LmdldFRhc2tzKCkpIHsKLQkJCWlmICh0aGlzLnRhc2tMaXN0LmdldFByaW9yaXR5VGFzaygpID09IHRhc2spIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmb3VuZCkgewotCQkJCQl0aGlzLnRhc2tMaXN0LnNldFByaW9yaXR5VGFzayh0YXNrKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQlJdGVyYXRvcjxUYXNrPiB0YXNrcyA9IHRoaXMudGFza0xpc3QudGFza3MoKTsKLQkJaWYgKHRhc2tzLmhhc05leHQoKSkgewotCQkJdGhpcy50YXNrTGlzdC5zZXRQcmlvcml0eVRhc2sodGFza3MubmV4dCgpKTsKLQkJfQotCX0KLQotCXZvaWQgY2xlYXJQcmlvcml0eVRhc2soKSB7Ci0JCXRoaXMudGFza0xpc3Quc2V0UHJpb3JpdHlUYXNrKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYXNrTGlzdCAqKioqKioqKioqCi0KLQkvLyBub3RlIGFic2VuY2Ugb2YgdmFsaWRhdGlvbi4uLgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFza0xpc3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gdGFza05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX05BTUVTX0xJU1QgPSAidGFza05hbWVzIjsKLQkJcHJpdmF0ZSBmaW5hbCBMaXN0PFRhc2s+IHRhc2tzID0gbmV3IEFycmF5TGlzdDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS1NfTElTVCA9ICJ0YXNrcyI7Ci0JCXByaXZhdGUgU3RyaW5nIHByaW9yaXR5VGFza05hbWUgPSBudWxsOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS19OQU1FX1BST1BFUlRZID0gInByaW9yaXR5VGFza05hbWUiOwotCQlwcml2YXRlIFRhc2sgcHJpb3JpdHlUYXNrID0gbnVsbDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU9SSVRZX1RBU0tfUFJPUEVSVFkgPSAicHJpb3JpdHlUYXNrIjsKLQkJcHVibGljIFRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYWJsZTxUYXNrPiBnZXRUYXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tzOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldFByaW9yaXR5VGFza05hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmlvcml0eVRhc2tOYW1lOwotCQl9Ci0JCXB1YmxpYyBUYXNrIGdldFByaW9yaXR5VGFzaygpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFzazsKLQkJfQotCQlwdWJsaWMgVGFzayBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2tOYW1lLCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCVRhc2sgdGFzayA9IG5ldyBUYXNrKHRhc2tOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrLCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCXJldHVybiB0YXNrOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJVGFzayB0YXNrID0gdGhpcy50YXNrcy5nZXQoaW5kZXgpOwotCQkJCWlmICh0YXNrID09IHRoaXMucHJpb3JpdHlUYXNrKSB7Ci0JCQkJCXRoaXMuc2V0UHJpb3JpdHlUYXNrKG51bGwpOwotCQkJCX0KLQkJCQkvLyBhc3N1bWUgdGhlIGluZGV4ZXMgbWF0Y2guLi4KLQkJCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrTmFtZXMsIFRBU0tfTkFNRVNfTElTVCk7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGNsZWFyVGFza3MoKSB7Ci0JCQl0aGlzLnNldFByaW9yaXR5VGFzayhudWxsKTsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJdGhpcy5jbGVhckxpc3QodGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCX0KLQkJcHJpdmF0ZSB2b2lkIHNldFByaW9yaXR5VGFza05hbWUoU3RyaW5nIHByaW9yaXR5VGFza05hbWUpIHsKLQkJCVN0cmluZyBvbGQgPSB0aGlzLnByaW9yaXR5VGFza05hbWU7Ci0JCQl0aGlzLnByaW9yaXR5VGFza05hbWUgPSBwcmlvcml0eVRhc2tOYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSSU9SSVRZX1RBU0tfTkFNRV9QUk9QRVJUWSwgb2xkLCBwcmlvcml0eVRhc2tOYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eVRhc2soVGFzayBwcmlvcml0eVRhc2spIHsKLQkJCVRhc2sgb2xkID0gdGhpcy5wcmlvcml0eVRhc2s7Ci0JCQl0aGlzLnByaW9yaXR5VGFzayA9IHByaW9yaXR5VGFzazsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUklPUklUWV9UQVNLX1BST1BFUlRZLCBvbGQsIHByaW9yaXR5VGFzayk7Ci0JCQl0aGlzLnNldFByaW9yaXR5VGFza05hbWUoKHByaW9yaXR5VGFzayA9PSBudWxsKSA/IG51bGwgOiBwcmlvcml0eVRhc2suZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYXNrICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGFzayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXByaXZhdGUgaW50IGluc3RhbmNlQ291bnQ7Ci0JCXByaXZhdGUgc3RhdGljIGludCBJTlNUQU5DRV9DT1VOVCA9IDE7Ci0JCXB1YmxpYyBUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5pbnN0YW5jZUNvdW50ID0gSU5TVEFOQ0VfQ09VTlQrKzsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lICsgIjogIiArIHRoaXMuaW5zdGFuY2VDb3VudDsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhEaXNwbGF5YWJsZSBvKSB7Ci0JCQlyZXR1cm4gREVGQVVMVF9DT01QQVJBVE9SLmNvbXBhcmUodGhpcywgbyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnRlcmZhY2UgRGlzcGxheWFibGUgZXh0ZW5kcyBNb2RlbCwgQ29tcGFyYWJsZTxEaXNwbGF5YWJsZT4gewotCQotCQlTdHJpbmcgZGlzcGxheVN0cmluZygpOwotCQkJU3RyaW5nIERJU1BMQVlfU1RSSU5HX1BST1BFUlRZID0gImRpc3BsYXlTdHJpbmciOwotCQotCQotCQkvLyAqKioqKioqKioqIGhlbHBlciBpbXBsZW1lbnRhdGlvbnMgKioqKioqKioqKgotCQotCQlDb2xsYXRvciBERUZBVUxUX0NPTExBVE9SID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQkKLQkJQ29tcGFyYXRvcjxEaXNwbGF5YWJsZT4gREVGQVVMVF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERpc3BsYXlhYmxlPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlzcGxheWFibGUgZDEsIERpc3BsYXlhYmxlIGQyKSB7Ci0JCQkJCS8vIGRpc2FsbG93IGR1cGxpY2F0ZXMgYmFzZWQgb24gb2JqZWN0IGlkZW50aXR5Ci0JCQkJCWlmIChkMSA9PSBkMikgewotCQkJCQkJcmV0dXJuIDA7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gZmlyc3QgY29tcGFyZSBkaXNwbGF5IHN0cmluZ3MgdXNpbmcgdGhlIGRlZmF1bHQgY29sbGF0b3IKLQkJCQkJaW50IHJlc3VsdCA9IERFRkFVTFRfQ09MTEFUT1IuY29tcGFyZShkMS5kaXNwbGF5U3RyaW5nKCksIGQyLmRpc3BsYXlTdHJpbmcoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkgewotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJfQotCQotCQkJCQkvLyB0aGVuIGNvbXBhcmUgdXNpbmcgb2JqZWN0LWlkCi0JCQkJCXJlc3VsdCA9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQxKSAtIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGQyKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIEl0J3MgdW5saWtlbHkgdGhhdCB3ZSBnZXQgdG8gdGhpcyBwb2ludDsgYnV0LCBqdXN0IGluIGNhc2UsIHdlIHdpbGwgcmV0dXJuIC0xLgotCQkJCQkvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIGludHJvZHVjZXMgc29tZSBtaWxkIHVucHJlZGljdGFiaWxpdHkgdG8gdGhlIHNvcnQgb3JkZXIKLQkJCQkJLy8gKHVubGVzcyB0aGUgb2JqZWN0cyBhcmUgYWx3YXlzIHBhc3NlZCBpbnRvIHRoaXMgbWV0aG9kIGluIHRoZSBzYW1lIG9yZGVyKS4KLQkJCQkJcmV0dXJuIC0xOwkJLy8gaWYgYWxsIGVsc2UgZmFpbHMsIGluZGljYXRlIHRoYXQgbzEgPCBvMgotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRpc3BsYXlhYmxlLkRFRkFVTFRfQ09NUEFSQVRPUiI7Ci0JCQkJfQotCQkJfTsKLQkKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS90ZXN0cy9pbnRlcm5hbC91dGlsaXR5L3N3dC9MaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjBkNTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LnN3dDsKLQotaW1wb3J0IGphdmEudGV4dC5Db2xsYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LkFwcGxpY2F0aW9uV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGxpc3QgYm94ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QKLQlleHRlbmRzIEFwcGxpY2F0aW9uV2luZG93Ci17Ci0JZmluYWwgVGFza0xpc3QgdGFza0xpc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0IHRhc2tUZXh0RmllbGQ7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJV2luZG93IHdpbmRvdyA9IG5ldyBMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KGFyZ3MpOwotCQl3aW5kb3cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXdpbmRvdy5vcGVuKCk7Ci0JCURpc3BsYXkuZ2V0Q3VycmVudCgpLmRpc3Bvc2UoKTsKLQkJU3lzdGVtLmV4aXQoMCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnRhc2tMaXN0ID0gbmV3IFRhc2tMaXN0KCk7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRhc2tMaXN0Pih0aGlzLnRhc2tMaXN0KTsKLQkJdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJzd2ltIik7Ci0JCXRoaXMudGFza0xpc3QuYWRkVGFzaygiYmlrZSIpOwotCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJ1biIpOwotCQlUYXNrIHJlc3QgPSB0aGlzLnRhc2tMaXN0LmFkZFRhc2soInJlc3QiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVzdCk7Ci0JCVRhc2sgcmVwZWF0ID0gdGhpcy50YXNrTGlzdC5hZGRUYXNrKCJyZXBlYXQiKTsKLQkJdGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2socmVwZWF0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCSgoU2hlbGwpIHBhcmVudCkuc2V0VGV4dCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJcGFyZW50LnNldFNpemUoODAwLCA0MDApOwotCQlDb21wb3NpdGUgbWFpblBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJbWFpblBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCB0YXNrTGlzdFBhbmVsID0gdGhpcy5idWlsZFRhc2tMaXN0UGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHRhc2tMaXN0UGFuZWwpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtMzApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwocGFuZWwpOwotCQl0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChwYW5lbCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoNTApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEN1c3RvbVNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbChwYW5lbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT2JqZWN0VGFza0xpc3RQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCg1MCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRVbnNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RQYW5lbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwocGFuZWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgInByaW1pdGl2ZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSwgbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJwcmltaXRpdmUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCksIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFVuc29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJvYmplY3QgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZExpc3RQYW5lbChwYXJlbnQsICJvYmplY3Qgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkT2JqZWN0TGlzdE1vZGVsKCksIHRoaXMuYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkTGlzdFBhbmVsKHBhcmVudCwgIm9iamVjdCByZXZlcnNlIHNvcnRlZCIsIHRoaXMuYnVpbGRDdXN0b21Tb3J0ZWRPYmplY3RMaXN0TW9kZWwoKSwgdGhpcy5idWlsZFByaW9yaXR5VGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFVuc29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVN0cmluZ0NvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUYXNrPiBidWlsZFVuc29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRTdGFuZGFyZFNvcnRlZE9iamVjdExpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZE9iamVjdFRhc2tMaXN0QWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkQ3VzdG9tU29ydGVkT2JqZWN0TGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkT2JqZWN0VGFza0xpc3RBZGFwdGVyKCksIHRoaXMuYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIDxFPiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0IGJ1aWxkTGlzdFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgTGlzdFZhbHVlTW9kZWw8RT4gbW9kZWwsIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8RT4gc2VsZWN0ZWRJdGVtc01vZGVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQotCQlMYWJlbCBsaXN0TGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5MRUZUIHwgU1dULlZFUlRJQ0FMKTsKLQkJbGlzdExhYmVsLnNldFRleHQobGFiZWwpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDMpOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDIwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNSk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0TGFiZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdCBsaXN0Qm94ID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3QocGFuZWwsIFNXVC5NVUxUSSB8IFNXVC5CT1JERVIpOwotCQlmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxpc3RMYWJlbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlsaXN0Qm94LnNldExheW91dERhdGEoZmQpOwotCQlTV1RUb29scy5iaW5kKG1vZGVsLCBzZWxlY3RlZEl0ZW1zTW9kZWwsIGxpc3RCb3gpOyAgLy8gdXNlICN0b1N0cmluZygpCi0JCXJldHVybiBsaXN0Qm94OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuY29tcGFyZVRvKHRvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFRhc2tMaXN0LCBTdHJpbmc+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tfTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnRhc2tOYW1lcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VGFzaz4gYnVpbGRPYmplY3RUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KHRoaXMudGFza0xpc3RIb2xkZXIsIFRhc2tMaXN0LlRBU0tTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxUYXNrPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudGFza3MoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlQ29sbGVjdGlvblZhbHVlTW9kZWw8VGFzaz4gYnVpbGRQcmlvcml0eVRhc2tMaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmlvcml0eVRhc2tMaXN0QWRhcHRlcih0aGlzLnRhc2tMaXN0SG9sZGVyKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJpb3JpdHlUYXNrTGlzdEFkYXB0ZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUYXNrTGlzdCwgVGFzaz4KLQkJaW1wbGVtZW50cyBXcml0YWJsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRhc2s+Ci0JewotCQlQcmlvcml0eVRhc2tMaXN0QWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXIpIHsKLQkJCXN1cGVyKHRhc2tMaXN0SG9sZGVyLCBUYXNrTGlzdC5QUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRhc2s+IGl0ZXJhdG9yXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QucHJpb3JpdHlUYXNrcygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFZhbHVlcyhJdGVyYWJsZTxUYXNrPiB2YWx1ZXMpIHsKLQkJCXRoaXMuc3ViamVjdC5zZXRQcmlvcml0eVRhc2tzKHZhbHVlcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRDb250cm9sUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgQ29udHJvbCB0YXNrTGlzdFBhbmVsKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodGFza0xpc3RQYW5lbCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgbWlzYyA9IHRoaXMuYnVpbGRNaXNjVGFza1BhbmVsKHBhbmVsKTsKLQkJdGhpcy5idWlsZEFkZFJlbW92ZVRhc2tQYW5lbChwYW5lbCwgbWlzYyk7Ci0JfQotCi0JLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGFzc29jaWF0ZSBhbiBBQ0kgd2l0aCBmb3JtIGRhdGE/Ci0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkTWlzY1Rhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAtNDAwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZENsZWFyTGlzdEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKS5maWxsKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlbW92ZVByaW9yaXR5VGFza0FDSSgpLmZpbGwocGFuZWwpOwotCQl0aGlzLmJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkuZmlsbChwYW5lbCk7Ci0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRDbGVhckxpc3RBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBsaXN0IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBhbGwgdGhlIHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5jbGVhck1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRSZXN0b3JlTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJyZXN0b3JlIG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgdGhlIHRhc2sgbGlzdCBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gYnVpbGRBZGRQcmlvcml0eVRhc2tBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJhZGQgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuYWRkUHJpb3JpdHlUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB0byB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlUHJpb3JpdHlUYXNrQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIHByaW9yaXR5IiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlbW92ZVByaW9yaXR5VGFzaygpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlbW92ZSBhIHRhc2sgZnJvbSB0aGUgcHJpb3JpdHkgdGFza3MiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkQ2xlYXJQcmlvcml0eVRhc2tzQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiY2xlYXIgcHJpb3JpdHkiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlMaXN0Qm94TW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiY2xlYXIgdGhlIHByaW9yaXR5IHRhc2tzIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNsZWFyQnV0dG9uKSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudChjbGVhckJ1dHRvbik7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRm9ybUxheW91dCgpKTsKLQkJQ29udHJvbCBhZGRCdXR0b24gPSB0aGlzLmJ1aWxkQWRkQnV0dG9uKHBhbmVsKTsKLQkJQ29udHJvbCByZW1vdmVCdXR0b24gPSB0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFRhc2tUZXh0RmllbGQocGFuZWwsIGFkZEJ1dHRvbiwgcmVtb3ZlQnV0dG9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRBZGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgNTApOwotCQlwYW5lbC5zZXRMYXlvdXREYXRhKGZkKTsKLQotCQlwYW5lbC5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoKSk7Ci0JCXRoaXMuYnVpbGRBZGRBQ0koKS5maWxsKHBhbmVsKTsKLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZEFkZEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oImFkZCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUxpc3RCb3hNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRUb29sVGlwVGV4dCgiYWRkIGEgdGFzayB3aXRoIHRoZSBuYW1lIGluIHRoZSBlbnRyeSBmaWVsZCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQkvLyBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gYXNzb2NpYXRlIGFuIEFDSSB3aXRoIGZvcm0gZGF0YT8KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRSZW1vdmVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlGb3JtRGF0YSBmZCA9IG5ldyBGb3JtRGF0YSgpOwotCQkJZmQudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgLTUwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlbW92ZUFDSSgpLmZpbGwocGFuZWwpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVtb3ZlQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVtb3ZlIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJTGlzdEJveE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlbW92ZVRhc2soKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZW1vdmUgdGhlIHRhc2sgd2l0aCB0aGUgbmFtZSBpbiB0aGUgZW50cnkgZmllbGQiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkVGFza1RleHRGaWVsZChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGFkZEJ1dHRvbiwgQ29udHJvbCByZW1vdmVCdXR0b24pIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCUZvcm1EYXRhIGZkID0gbmV3IEZvcm1EYXRhKCk7Ci0JCQlmZC50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCk7Ci0JCQlmZC5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJCWZkLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoYWRkQnV0dG9uKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KHJlbW92ZUJ1dHRvbik7Ci0JCXRoaXMudGFza1RleHRGaWVsZC5zZXRMYXlvdXREYXRhKGZkKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyB0YXNrVGV4dEZpZWxkVGV4dCgpIHsKLQkJcmV0dXJuIHRoaXMudGFza1RleHRGaWVsZC5nZXRUZXh0KCk7Ci0JfQotCi0Jdm9pZCBhZGRUYXNrKCkgewotCQlTdHJpbmcgdGFza1RleHQgPSB0aGlzLnRhc2tUZXh0RmllbGRUZXh0KCk7Ci0JCWlmICh0YXNrVGV4dC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQl0aGlzLnRhc2tMaXN0LmFkZFRhc2sodGFza1RleHQpOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVUYXNrKCkgewotCQlTdHJpbmcgdGFzayA9IHRoaXMudGFza1RleHRGaWVsZFRleHQoKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdC5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0LmNsZWFyVGFza3MoKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGFza0xpc3RIb2xkZXIuc2V0VmFsdWUodGhpcy50YXNrTGlzdCk7Ci0JfQotCi0Jdm9pZCBhZGRQcmlvcml0eVRhc2soKSB7Ci0JCUl0ZXJhdG9yPFRhc2s+IHRhc2tzID0gdGhpcy50YXNrTGlzdC50YXNrcygpOwotCQl3aGlsZSAodGFza3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAodGhpcy50YXNrTGlzdC5hZGRQcmlvcml0eVRhc2sodGFza3MubmV4dCgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlUHJpb3JpdHlUYXNrKCkgewotCQlJdGVyYXRvcjxUYXNrPiBwVGFza3MgPSB0aGlzLnRhc2tMaXN0LnByaW9yaXR5VGFza3MoKTsKLQkJaWYgKHBUYXNrcy5oYXNOZXh0KCkpIHsKLQkJCXRoaXMudGFza0xpc3QucmVtb3ZlUHJpb3JpdHlUYXNrKHBUYXNrcy5uZXh0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclByaW9yaXR5VGFza3MoKSB7Ci0JCXRoaXMudGFza0xpc3QuY2xlYXJQcmlvcml0eVRhc2tzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2tMaXN0ICoqKioqKioqKioKLQotCS8vIG5vdGUgYWJzZW5jZSBvZiB2YWxpZGF0aW9uLi4uCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrTGlzdCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB0YXNrTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwcml2YXRlIGZpbmFsIExpc3Q8VGFzaz4gdGFza3MgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRhc2s+IHByaW9yaXR5VGFza3MgPSBuZXcgSGFzaFNldDxUYXNrPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTiA9ICJwcmlvcml0eVRhc2tzIjsKLQkJcHVibGljIFRhc2tMaXN0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFza05hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMudGFza05hbWVzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8VGFzaz4gdGFza3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrcy5saXN0SXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmF0b3I8VGFzaz4gcHJpb3JpdHlUYXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnByaW9yaXR5VGFza3MuaXRlcmF0b3IoKTsKLQkJfQotCQlwdWJsaWMgVGFzayBhZGRUYXNrKFN0cmluZyB0YXNrTmFtZSkgewotCQkJdGhpcy5hZGRJdGVtVG9MaXN0KHRhc2tOYW1lLCB0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCVRhc2sgdGFzayA9IG5ldyBUYXNrKHRhc2tOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdCh0YXNrLCB0aGlzLnRhc2tzLCBUQVNLU19MSVNUKTsKLQkJCXJldHVybiB0YXNrOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMudGFza05hbWVzLCBUQVNLX05BTUVTX0xJU1QpOwotCQkJCS8vIGFzc3VtZSB0aGUgaW5kZXhlcyBtYXRjaC4uLgotCQkJCVRhc2sgcmVtb3ZlZFRhc2sgPSB0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy50YXNrcywgVEFTS1NfTElTVCk7Ci0JCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24ocmVtb3ZlZFRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnRhc2tOYW1lcywgVEFTS19OQU1FU19MSVNUKTsKLQkJCXRoaXMuY2xlYXJMaXN0KHRoaXMudGFza3MsIFRBU0tTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFkZFByaW9yaXR5VGFzayhUYXNrIHRhc2spIHsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24odGFzaywgdGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVByaW9yaXR5VGFzayhUYXNrIHRhc2spIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKHRhc2ssIHRoaXMucHJpb3JpdHlUYXNrcywgUFJJT1JJVFlfVEFTS1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJQcmlvcml0eVRhc2tzKCkgewotCQkJdGhpcy5jbGVhckNvbGxlY3Rpb24odGhpcy5wcmlvcml0eVRhc2tzLCBQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRQcmlvcml0eVRhc2tzKEl0ZXJhYmxlPFRhc2s+IHRhc2tzKSB7Ci0JCQl0aGlzLnByaW9yaXR5VGFza3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5wcmlvcml0eVRhc2tzLCB0YXNrcyk7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChQUklPUklUWV9UQVNLU19DT0xMRUNUSU9OLCB0aGlzLnByaW9yaXR5VGFza3MpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhc2sgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBUYXNrIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBpbnQgaW5zdGFuY2VDb3VudDsKLQkJcHJpdmF0ZSBzdGF0aWMgaW50IElOU1RBTkNFX0NPVU5UID0gMTsKLQkJcHVibGljIFRhc2soU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmluc3RhbmNlQ291bnQgPSBJTlNUQU5DRV9DT1VOVCsrOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAiOiAiICsgdGhpcy5pbnN0YW5jZUNvdW50OwotCQl9Ci0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKERpc3BsYXlhYmxlIG8pIHsKLQkJCXJldHVybiBERUZBVUxUX0NPTVBBUkFUT1IuY29tcGFyZSh0aGlzLCBvKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZygpOwotCQl9Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBEaXNwbGF5YWJsZSBleHRlbmRzIE1vZGVsLCBDb21wYXJhYmxlPERpc3BsYXlhYmxlPiB7Ci0JCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nKCk7Ci0JCQlTdHJpbmcgRElTUExBWV9TVFJJTkdfUFJPUEVSVFkgPSAiZGlzcGxheVN0cmluZyI7Ci0JCi0JCi0JCS8vICoqKioqKioqKiogaGVscGVyIGltcGxlbWVudGF0aW9ucyAqKioqKioqKioqCi0JCi0JCUNvbGxhdG9yIERFRkFVTFRfQ09MTEFUT1IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCQlDb21wYXJhdG9yPERpc3BsYXlhYmxlPiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGlzcGxheWFibGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEaXNwbGF5YWJsZSBkMSwgRGlzcGxheWFibGUgZDIpIHsKLQkJCQkJLy8gZGlzYWxsb3cgZHVwbGljYXRlcyBiYXNlZCBvbiBvYmplY3QgaWRlbnRpdHkKLQkJCQkJaWYgKGQxID09IGQyKSB7Ci0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJfQotCQotCQkJCQkvLyBmaXJzdCBjb21wYXJlIGRpc3BsYXkgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdCBjb2xsYXRvcgotCQkJCQlpbnQgcmVzdWx0ID0gREVGQVVMVF9DT0xMQVRPUi5jb21wYXJlKGQxLmRpc3BsYXlTdHJpbmcoKSwgZDIuZGlzcGxheVN0cmluZygpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCQl9Ci0JCi0JCQkJCS8vIHRoZW4gY29tcGFyZSB1c2luZyBvYmplY3QtaWQKLQkJCQkJcmVzdWx0ID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDEpIC0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoZDIpOwotCQkJCQlpZiAocmVzdWx0ICE9IDApIHsKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkKLQkJCQkJLy8gSXQncyB1bmxpa2VseSB0aGF0IHdlIGdldCB0byB0aGlzIHBvaW50OyBidXQsIGp1c3QgaW4gY2FzZSwgd2Ugd2lsbCByZXR1cm4gLTEuCi0JCQkJCS8vIFVuZm9ydHVuYXRlbHksIHRoaXMgaW50cm9kdWNlcyBzb21lIG1pbGQgdW5wcmVkaWN0YWJpbGl0eSB0byB0aGUgc29ydCBvcmRlcgotCQkJCQkvLyAodW5sZXNzIHRoZSBvYmplY3RzIGFyZSBhbHdheXMgcGFzc2VkIGludG8gdGhpcyBtZXRob2QgaW4gdGhlIHNhbWUgb3JkZXIpLgotCQkJCQlyZXR1cm4gLTE7CQkvLyBpZiBhbGwgZWxzZSBmYWlscywgaW5kaWNhdGUgdGhhdCBvMSA8IG8yCi0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGlzcGxheWFibGUuREVGQVVMVF9DT01QQVJBVE9SIjsKLQkJCQl9Ci0JCQl9OwotCQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpL3Rlc3RzL2ludGVybmFsL3V0aWxpdHkvc3d0L1RleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDZmMTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdWkvdGVzdHMvaW50ZXJuYWwvdXRpbGl0eS9zd3QvVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLnRlc3RzLmludGVybmFsLnV0aWxpdHkuc3d0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuQXBwbGljYXRpb25XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGVudHJ5IGZpZWxkcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0Ci0JZXh0ZW5kcyBBcHBsaWNhdGlvbldpbmRvdwotewotCXByaXZhdGUgZmluYWwgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRSA9ICJTY29vYnkgRG9vIjsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lSG9sZGVyOwotCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBhbGxDYXBzTmFtZUhvbGRlcjsKLQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVdpbmRvdyB3aW5kb3cgPSBuZXcgVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0KCk7Ci0JCXdpbmRvdy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJd2luZG93Lm9wZW4oKTsKLQkJRGlzcGxheS5nZXRDdXJyZW50KCkuZGlzcG9zZSgpOwotCQlTeXN0ZW0uZXhpdCgwKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdCgpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbChERUZBVUxUX05BTUUpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMubmFtZUhvbGRlciA9IHRoaXMuYnVpbGROYW1lSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5hbGxDYXBzTmFtZUhvbGRlciA9IHRoaXMuYnVpbGRBbGxDYXBzTmFtZUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFN0cmluZz4odm0sIFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQWxsQ2Fwc05hbWVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KHZtLCBUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QubmFtZSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkoKFNoZWxsKSBwYXJlbnQpLnNldFRleHQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCXBhcmVudC5zZXRTaXplKDQwMCwgMTAwKTsKLQkJQ29tcG9zaXRlIG1haW5QYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCW1haW5QYW5lbC5zZXRMYXlvdXQobmV3IEZvcm1MYXlvdXQoKSk7Ci0JCUNvbnRyb2wgdGV4dEZpZWxkUGFuZWwgPSB0aGlzLmJ1aWxkVGV4dEZpZWxkUGFuZWwobWFpblBhbmVsKTsKLQkJdGhpcy5idWlsZENvbnRyb2xQYW5lbChtYWluUGFuZWwsIHRleHRGaWVsZFBhbmVsKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUZXh0RmllbGRQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIC0zNSk7Ci0JCQlmZC5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDApOwotCQkJZmQucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJcGFuZWwuc2V0TGF5b3V0RGF0YShmZCk7Ci0KLQkJcGFuZWwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLmJ1aWxkTmFtZVRleHRGaWVsZChwYW5lbCk7Ci0JCXRoaXMuYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQocGFuZWwpOwotCQl0aGlzLmJ1aWxkQWxsQ2Fwc05hbWVUZXh0RmllbGQocGFuZWwpOwotCi0JCXJldHVybiBwYW5lbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGROYW1lVGV4dEZpZWxkKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJVGV4dCB0ZXh0RmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUpOwotCQlTV1RUb29scy5iaW5kKHRoaXMubmFtZUhvbGRlciwgdGV4dEZpZWxkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCXRleHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLm5hbWVIb2xkZXIsIHRleHRGaWVsZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQWxsQ2Fwc05hbWVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHRGaWVsZCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSk7Ci0JCXRleHRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmFsbENhcHNOYW1lSG9sZGVyLCB0ZXh0RmllbGQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZENvbnRyb2xQYW5lbChDb21wb3NpdGUgcGFyZW50LCBDb250cm9sIGNoZWNrQm94UGFuZWwpIHsKLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZmQgPSBuZXcgRm9ybURhdGEoKTsKLQkJCWZkLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjaGVja0JveFBhbmVsKTsKLQkJCWZkLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQkJZmQubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwKTsKLQkJCWZkLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCk7Ci0JCXBhbmVsLnNldExheW91dERhdGEoZmQpOwotCi0JCXBhbmVsLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsKLQkJdGhpcy5idWlsZFJlc2V0TmFtZUJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKHBhbmVsKTsKLQkJdGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihwYW5lbCk7Ci0JCXRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKHBhbmVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRSZXNldE5hbWVCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmJ1aWxkUmVzZXROYW1lQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZFJlc2V0TmFtZUFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInJlc2V0IG5hbWUiLCBJQWN0aW9uLkFTX1BVU0hfQlVUVE9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXh0RmllbGRNb2RlbEJpbmRpbmdVSVRlc3QudGhpcy5yZXNldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJyZXNldCBuYW1lIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcmVzZXROYW1lKCkgewotCQl0aGlzLnRlc3RNb2RlbC5zZXROYW1lKERFRkFVTFRfTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRDbGVhck1vZGVsQUNJKCkuZmlsbChwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBidWlsZENsZWFyTW9kZWxBQ0koKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJjbGVhciBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KCJjbGVhciBtb2RlbCIpOwotCQlyZXR1cm4gbmV3IEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oYWN0aW9uKTsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUmVzdG9yZU1vZGVsQUNJKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigicmVzdG9yZSBtb2RlbCIsIElBY3Rpb24uQVNfUFVTSF9CVVRUT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRleHRGaWVsZE1vZGVsQmluZGluZ1VJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInJlc3RvcmUgbW9kZWwiKTsKLQkJcmV0dXJuIG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRQcmludE1vZGVsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5idWlsZFByaW50TW9kZWxBQ0koKS5maWxsKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGJ1aWxkUHJpbnRNb2RlbEFDSSgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oInByaW50IG1vZGVsIiwgSUFjdGlvbi5BU19QVVNIX0JVVFRPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGV4dEZpZWxkTW9kZWxCaW5kaW5nVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoInByaW50IG1vZGVsIik7Ci0JCXJldHVybiBuZXcgQWN0aW9uQ29udHJpYnV0aW9uSXRlbShhY3Rpb24pOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJuYW1lOiAiICsgdGhpcy50ZXN0TW9kZWwubmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW9kZWwgY2xhc3MgKioqKioqKioqKgotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBuYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzEyOGYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5wcm9qZWN0IGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ZTIzMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMjE1ODYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowNjo1NyBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWIyMDMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMi4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9hYm91dC5odG1sIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTljMDguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYTQ0N2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gQ29tbW9uIFV0aWxpdHkgVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvcmVzb3VyY2UvQ2xhc3NUb29scy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzE3YjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9yZXNvdXJjZS9DbGFzc1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2UgdGVzdDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLS8qKgotICogQ29udmVuaWVuY2UgbWV0aG9kcyByZWxhdGVkIHRvIHRoZSBqYXZhLmxhbmcucmVmbGVjdCBwYWNrYWdlLgotICogVGhlc2UgbWV0aG9kcyBwcm92aWRlIHNob3J0Y3V0cyBmb3IgbWFuaXB1bGF0aW5nIG9iamVjdHMgdmlhCi0gKiByZWZsZWN0aW9uOyBwYXJ0aWN1bGFybHkgd2hlbiBkZWFsaW5nIHdpdGggZmllbGRzIGFuZC9vciBtZXRob2RzIHRoYXQKLSAqIGFyZSBub3QgcHVibGljbHkgYWNjZXNzaWJsZSBvciBhcmUgaW5oZXJpdGVkLgotICogCi0gKiBJbiBtb3N0IGNhc2VzLCBhbGwgdGhlIGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYW5kCi0gKiB3cmFwcGVkIGluIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uczsgc28gdGhlc2UgbWV0aG9kcyBzaG91bGQKLSAqIGJlIHVzZWQgd2hlbiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IHlvdSB3aWxsIG5vdCBoYXZpbmcgYW55IHByb2JsZW1zCi0gKiB1c2luZyByZWZsZWN0aW9uLgotICogCi0gKiBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZiBtZXRob2RzIHdob3NlIG5hbWVzCi0gKiBiZWdpbiB3aXRoICJhdHRlbXB0Ii4gVGhlc2UgbWV0aG9kcyB3aWxsIHRocm93IGEgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0gKiBvciBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB3aGVuIGFwcHJvcHJpYXRlLCBhbGxvd2luZyB5b3UgdG8gcHJvYmUKLSAqIGZvciBtZXRob2RzIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgYnV0IG1pZ2h0IG5vdC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIFpFUk9fUEFSQU1FVEVSX1RZUEVTID0gbmV3IENsYXNzWzBdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0W10gWkVST19QQVJBTUVURVJTID0gbmV3IE9iamVjdFswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTdHJpbmdUb29scy5DUjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IgPSAnJCc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQVJSQVlfSU5ESUNBVE9SID0gJ1snOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4gPSAnWyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFRZUEVfREVDTEFSQVRJT05fQVJSQVlfQ0xPU0UgPSAnXSc7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgUkVGRVJFTkNFX0NMQVNTX0NPREUgPSAnTCc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUiA9ICc7JzsKLQkKLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBQUklNSVRJVkVTOyAgLy8gcHNldWRvLSdmaW5hbCcgLSBsYXp5LWluaXRpYWxpemVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIEJZVEVfQ09ERSA9ICdCJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQ0hBUl9DT0RFID0gJ0MnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBET1VCTEVfQ09ERSA9ICdEJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgRkxPQVRfQ09ERSA9ICdGJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgSU5UX0NPREUgPSAnSSc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIExPTkdfQ09ERSA9ICdKJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0hPUlRfQ09ERSA9ICdTJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgQk9PTEVBTl9DT0RFID0gJ1onOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBWT0lEX0NPREUgPSAnVic7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCXByaXZhdGUgc3RhdGljIGludCBNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSAtMTsgIC8vIHBzZXVkby0nZmluYWwnIC0gbGF6eS1pbml0aWFsaXplZAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9DTEFTU19OQU1FID0gdm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUgPSBqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGZpZWxkcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLCBpbmNsdWRpbmcgaW5oZXJpdGVkIGZpZWxkcy4KLQkgKiBDbGFzcyNhbGxGaWVsZHMoKQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGFsbEZpZWxkcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RhY2s8RmllbGQ+IHN0YWNrID0gbmV3IFN0YWNrPEZpZWxkPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZEZpZWxkcyh0ZW1wQ2xhc3MsIHN0YWNrKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKHN0YWNrKTsKLQkJcmV0dXJuIHN0YWNrLnRvQXJyYXkobmV3IEZpZWxkW3N0YWNrLnNpemUoKV0pOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBtZXRob2RzIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY2xhc3MsIGluY2x1ZGluZyBpbmhlcml0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNhbGxNZXRob2RzKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZFtdIGFsbE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCVN0YWNrPE1ldGhvZD4gc3RhY2sgPSBuZXcgU3RhY2s8TWV0aG9kPigpOwotCQlmb3IgKENsYXNzPD8+IHRlbXBDbGFzcyA9IGphdmFDbGFzczsgdGVtcENsYXNzICE9IG51bGw7IHRlbXBDbGFzcyA9IHRlbXBDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCXB1c2hEZWNsYXJlZE1ldGhvZHModGVtcENsYXNzLCBzdGFjayk7Ci0JCX0KLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShzdGFjayk7Ci0JCXJldHVybiBzdGFjay50b0FycmF5KG5ldyBNZXRob2Rbc3RhY2suc2l6ZSgpXSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIDxUPiBUIGF0dGVtcHROZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdE5ld0luc3RhbmNlKGphdmFDbGFzcywgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKS5uZXdJbnN0YW5jZShwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcyksIGllKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRDb25zdHJ1Y3RvclNpZ25hdHVyZShqYXZhQ2xhc3MsIHBhcmFtZXRlclR5cGVzKSwgaWFlKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGZ1bGx5UXVhbGlmaWVkQ29uc3RydWN0b3JTaWduYXR1cmUoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcykgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBhdHRlbXB0TmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGF0dGVtcHROZXdJbnN0YW5jZShqYXZhQ2xhc3MsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlIGNvbnRhaW5pbmcgb2JqZWN0IGFuZCBmaWVsZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBPYmplY3QjZ2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRGaWVsZFZhbHVlKE9iamVjdCBvYmplY3QsIFN0cmluZyBmaWVsZE5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmllbGQob2JqZWN0LCBmaWVsZE5hbWUpLmdldChvYmplY3QpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBnZXQgYSBzdGF0aWMgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgaXMgbm90IGRlZmluZWQuCi0JICogQ2xhc3MjZ2V0U3RhdGljRmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9HZXRTdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWVsZChqYXZhQ2xhc3MsIGZpZWxkTmFtZSkuZ2V0KG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIGlhZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgbWV0aG9kLAotCSAqIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogT2JqZWN0I2V4ZWN1dGUoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZU1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9LCBuZXcgT2JqZWN0W10ge3BhcmFtZXRlcn0pOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgcGFyYW1ldGVycy4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1ldGhvZCBpcyBub3QgZm91bmQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlTWV0aG9kKG1ldGhvZChyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCByZWNlaXZlciwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBJZiB0aGUgZXhlY3V0ZWQgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24obWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyksIHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEF0dGVtcHQgdG8gZXhlY3V0ZSBhIHplcm8tYXJndW1lbnQgc3RhdGljIG1ldGhvZCwKLQkgKiBnaXZlbiB0aGUgY2xhc3MgYW5kIG1ldGhvZCBuYW1lLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXRob2QgaXMgbm90IGZvdW5kLgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgcGFyYW1ldGVycyk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBBdHRlbXB0IHRvIGV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWV0aG9kIGlzIG5vdCBmb3VuZC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBhdHRlbXB0VG9FeGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gYXR0ZW1wdFRvRXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQXR0ZW1wdCB0byBzZXQgYSBmaWVsZCB2YWx1ZSwgZ2l2ZW4gdGhlCi0JICogY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBUaHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGlzIG5vdCBkZWZpbmVkLgotCSAqIE9iamVjdCNzZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWZpZWxkKG9iamVjdCwgZmllbGROYW1lKS5zZXQob2JqZWN0LCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUob2JqZWN0LCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEF0dGVtcHQgdG8gc2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUKLQkgKiBjb250YWluaW5nIGNsYXNzLCBmaWVsZCBuYW1lLCBhbmQgbmV3IGZpZWxkIHZhbHVlLgotCSAqIFVzZWZ1bCBmb3IgYWNjZXNzaW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBmaWVsZHMuCi0JICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBpcyBub3QgZGVmaW5lZC4KLQkgKiBDbGFzcyNzZXRTdGF0aWNGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBmaWVsZE5hbWUsIE9iamVjdCBmaWVsZFZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQl0cnkgewotCQkJZmllbGQoamF2YUNsYXNzLCBmaWVsZE5hbWUpLnNldChudWxsLCBmaWVsZFZhbHVlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgZnVsbHlRdWFsaWZpZWRGaWVsZE5hbWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpLCBpYWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2NvbnN0cnVjdG9yKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGNvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJhbWV0ZXJUeXBlcyk7Ci0JCWNvbnN0cnVjdG9yLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcjsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIGNvbnN0cnVjdG9ycy4KLQkgKiBDbGFzcyNjb25zdHJ1Y3RvcihDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IoQ2xhc3M8VD4gamF2YUNsYXNzLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yKGphdmFDbGFzcywgbmV3IENsYXNzW10ge3BhcmFtZXRlclR5cGV9KTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2FjY2Vzc2libGVEZWNsYXJlZEZpZWxkcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWVsZFtdIGRlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlGaWVsZFtdIGZpZWxkcyA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOwotCQlmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7Ci0JCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBmaWVsZHM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIGNsYXNzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjYWNjZXNzaWJsZURlY2xhcmVkTWV0aG9kcygpCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2RbXSBkZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCU1ldGhvZFtdIG1ldGhvZHMgPSBqYXZhQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCk7Ci0JCWZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKLQkJCW1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQl9Ci0JCXJldHVybiBtZXRob2RzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yCi0JICogZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgY29uc3RydWN0b3JzLgotCSAqIENsYXNzI2RlZmF1bHRDb25zdHJ1Y3RvcigpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gQ29uc3RydWN0b3I8VD4gZGVmYXVsdENvbnN0cnVjdG9yKENsYXNzPFQ+IGphdmFDbGFzcykgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25zdHJ1Y3RvcihqYXZhQ2xhc3MpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBmaWVsZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlGaWVsZCBmaWVsZCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWVsZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZEZpZWxkKGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0JCQlDbGFzczw/PiBzdXBlcmNsYXNzID0gamF2YUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCWlmIChzdXBlcmNsYXNzID09IG51bGwpIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJCS8vIHJlY3Vyc2UKLQkJCXJldHVybiBmaWVsZChzdXBlcmNsYXNzLCBmaWVsZE5hbWUpOwotCQl9Ci0JCWZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0JCXJldHVybiBmaWVsZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIGZpZWxkIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBkZWZpbmUgdGhlIGZpZWxkLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgZmllbGRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmllbGQgZmllbGQoT2JqZWN0IG9iamVjdCwgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZpZWxkKG9iamVjdC5nZXRDbGFzcygpLCBmaWVsZE5hbWUpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcykgewotCQlyZXR1cm4gZnVsbHlRdWFsaWZpZWRNZXRob2RTaWduYXR1cmUoamF2YUNsYXNzLCBudWxsLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JfQotCQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJy4nKTsKLQkJc2IuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQkKLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGZpZWxkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXJldHVybiBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShvYmplY3QuZ2V0Q2xhc3MoKSwgZmllbGROYW1lKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJLy8gdGhpcyBjaGVjayBhbGxvd3MgdXMgdG8gdXNlIHRoaXMgY29kZSBmb3IgY29uc3RydWN0b3JzLCB3aGVyZSB0aGUgbWV0aG9kTmFtZSBpcyBudWxsCi0JCWlmIChtZXRob2ROYW1lICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQkJc2IuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKCcpOwotCQlpbnQgbWF4ID0gcGFyYW1ldGVyVHlwZXMubGVuZ3RoIC0gMTsKLQkJaWYgKG1heCAhPSAtMSkgewotCQkJLy8gc3RvcCBvbmUgc2hvcnQgb2YgdGhlIGVuZCBvZiB0aGUgYXJyYXkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbaV0uZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIiwgIik7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQocGFyYW1ldGVyVHlwZXNbbWF4XS5nZXROYW1lKCkpOwotCQl9Ci0JCXNiLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHsKLQkJcmV0dXJuIGZ1bGx5UXVhbGlmaWVkTWV0aG9kU2lnbmF0dXJlKHJlY2VpdmVyLmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgZmllbGQgdmFsdWUsIGdpdmVuIHRoZSBjb250YWluaW5nIG9iamVjdCBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIE9iamVjdCNnZXRGaWVsZFZhbHVlKFN0cmluZyBmaWVsZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gYXR0ZW1wdFRvR2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogR2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcyBhbmQgZmllbGQgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI2dldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBzdGF0aWNGaWVsZFZhbHVlKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIGZpZWxkTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0dldFN0YXRpY0ZpZWxkVmFsdWUoamF2YUNsYXNzLCBmaWVsZE5hbWUpOwotCQl9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBuc2ZlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc2ZlICsgQ1IgKyBmdWxseVF1YWxpZmllZEZpZWxkTmFtZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSksIG5zZmUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBFeGVjdXRlIGEgemVyby1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciBhbmQgbWV0aG9kIG5hbWUuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIGEgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0VG9FeGVjdXRlTWV0aG9kKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogRXhlY3V0ZSBhIG9uZS1hcmd1bWVudCBtZXRob2QsIGdpdmVuIHRoZSByZWNlaXZlciwKLQkgKiBtZXRob2QgbmFtZSwgcGFyYW1ldGVyIHR5cGUsIGFuZCBwYXJhbWV0ZXIuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBJZiB0aGUgbWV0aG9kIHRocm93cyBhbiBleGNlcHRpb24sIHJldGhyb3cgdGhhdCBleGNlcHRpb24uCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBPYmplY3QjZXhlY3V0ZShTdHJpbmcgbWV0aG9kTmFtZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kV2l0aEV4Y2VwdGlvbihPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBtZXRob2ROYW1lKSAKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBaRVJPX1BBUkFNRVRFUl9UWVBFUywgWkVST19QQVJBTUVURVJTKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBvbmUtYXJndW1lbnQgbWV0aG9kLCBnaXZlbiB0aGUgcmVjZWl2ZXIsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQlyZXR1cm4gZXhlY3V0ZU1ldGhvZFdpdGhFeGNlcHRpb24ocmVjZWl2ZXIsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSwgbmV3IE9iamVjdFtdIHtwYXJhbWV0ZXJ9KTsKLQl9Ci0JCi0JLyoqCi0JICogRXhlY3V0ZSBhIG1ldGhvZCwgZ2l2ZW4gdGhlIHJlY2VpdmVyLAotCSAqIG1ldGhvZCBuYW1lLCBwYXJhbWV0ZXIgdHlwZXMsIGFuZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIE9iamVjdCNleGVjdXRlKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE9iamVjdCByZWNlaXZlciwgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIAotCQl0aHJvd3MgVGhyb3dhYmxlCi0JewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKHJlY2VpdmVyLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShyZWNlaXZlciwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIG1ldGhvZC5pbnZva2UocmVjZWl2ZXIsIHBhcmFtZXRlcnMpOwotCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGlhZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaWFlICsgQ1IgKyBtZXRob2QsIGlhZSk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXRob2QgKyBDUiArIGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSwgaXRlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFeGVjdXRlIHRoZSBzcGVjaWZpZWQgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIElmIHRoZSBtZXRob2QgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmV0aHJvdyB0aGF0IGV4Y2VwdGlvbi4KLQkgKiBDb252ZXJ0IGFsbCBvdGhlciBleGNlcHRpb25zIHRvIFJ1bnRpbWVFeGNlcHRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVNZXRob2RXaXRoRXhjZXB0aW9uKE1ldGhvZCBtZXRob2QsIE9iamVjdCByZWNlaXZlciwgT2JqZWN0W10gcGFyYW1ldGVycykKLQkJdGhyb3dzIFRocm93YWJsZQotCXsKLQkJdHJ5IHsKLQkJCXJldHVybiBtZXRob2QuaW52b2tlKHJlY2VpdmVyLCBwYXJhbWV0ZXJzKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBpYWUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlhZSArIENSICsgbWV0aG9kLCBpYWUpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGl0ZSkgewotCQkJVGhyb3dhYmxlIGNhdXNlID0gaXRlLmdldENhdXNlKCk7Ci0JCQlpZiAoY2F1c2UgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG1ldGhvZC50b1N0cmluZygpLCBpdGUpOwotCQkJfQotCQkJdGhyb3cgY2F1c2U7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSB6ZXJvLWFyZ3VtZW50IHN0YXRpYyBtZXRob2QsCi0JICogZ2l2ZW4gdGhlIGNsYXNzIGFuZCBtZXRob2QgbmFtZS4KLQkgKiBSZXR1cm4gaXRzIHJlc3VsdC4KLQkgKiBVc2VmdWwgZm9yIGludm9raW5nIHByaXZhdGUsIHBhY2thZ2UsIG9yIHByb3RlY3RlZCBtZXRob2RzLgotCSAqIENsYXNzI2V4ZWN1dGVTdGF0aWNNZXRob2QoU3RyaW5nIG1ldGhvZE5hbWUpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZXhlY3V0ZVN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lKSB7Ci0JCXJldHVybiBleGVjdXRlU3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMsIFpFUk9fUEFSQU1FVEVSUyk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlcywgYW5kIHBhcmFtZXRlcnMuCi0JICogUmV0dXJuIGl0cyByZXN1bHQuCi0JICogVXNlZnVsIGZvciBpbnZva2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKiBDbGFzcyNleGVjdXRlU3RhdGljTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGV4ZWN1dGVTdGF0aWNNZXRob2QoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgewotCQl0cnkgewotCQkJcmV0dXJuIGF0dGVtcHRUb0V4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSwgbnNtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEV4ZWN1dGUgYSBzdGF0aWMgbWV0aG9kLCBnaXZlbiB0aGUgY2xhc3MsCi0JICogbWV0aG9kIG5hbWUsIHBhcmFtZXRlciB0eXBlLCBhbmQgcGFyYW1ldGVyLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIFVzZWZ1bCBmb3IgaW52b2tpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIG1ldGhvZHMuCi0JICogQ2xhc3MjZXhlY3V0ZVN0YXRpY01ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpIHsKLQkJcmV0dXJuIGV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YUNsYXNzLCBtZXRob2ROYW1lLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIEV4ZWN1dGUgdGhlIHNwZWNpZmllZCBzdGF0aWMgbWV0aG9kIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgotCSAqIFJldHVybiBpdHMgcmVzdWx0LgotCSAqIENvbnZlcnQgZXhjZXB0aW9ucyB0byBSdW50aW1lRXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBleGVjdXRlU3RhdGljTWV0aG9kKE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIGV4ZWN1dGVNZXRob2QobWV0aG9kLCBudWxsLCBwYXJhbWV0ZXJzKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIHplcm8tYXJndW1lbnQgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlNZXRob2QgbWV0aG9kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IGphdmFDbGFzcy5nZXREZWNsYXJlZE1ldGhvZChtZXRob2ROYW1lLCBwYXJhbWV0ZXJUeXBlcyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotCQkJQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGphdmFDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgZXg7Ci0JCQl9Ci0JCQkvLyByZWN1cnNlCi0JCQlyZXR1cm4gbWV0aG9kKHN1cGVyY2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJfQotCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJcmV0dXJuIG1ldGhvZDsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcywgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PiBwYXJhbWV0ZXJUeXBlKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlfSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QKLQkgKiBhbmQgbWV0aG9kIG5hbWUuIElmIHRoZSBvYmplY3QncyBjbGFzcyBkb2VzIG5vdCBkaXJlY3RseQotCSAqIGltcGxlbWVudCB0aGUgbWV0aG9kLCBsb29rIGZvciBpdCBpbiB0aGUgY2xhc3MncyBzdXBlcmNsYXNzZXMuCi0JICogU2V0IGFjY2Vzc2libGUgdG8gdHJ1ZSwgc28gd2UgY2FuIGFjY2VzcwotCSAqIHByaXZhdGUvcGFja2FnZS9wcm90ZWN0ZWQgbWV0aG9kcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE1ldGhvZCBtZXRob2QoT2JqZWN0IG9iamVjdCwgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gbWV0aG9kKG9iamVjdC5nZXRDbGFzcygpLCBtZXRob2ROYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIFJldHVybiBhIG1ldGhvZCBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QsIG1ldGhvZCBuYW1lLAotCSAqIGFuZCBmb3JtYWwgcGFyYW1ldGVyIHR5cGVzLiBJZiB0aGUgb2JqZWN0J3MgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2QgbWV0aG9kKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG1ldGhvZChvYmplY3QuZ2V0Q2xhc3MoKSwgbWV0aG9kTmFtZSwgcGFyYW1ldGVyVHlwZXMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCwgbWV0aG9kIG5hbWUsCi0JICogYW5kIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZS4gSWYgdGhlIG9iamVjdCdzIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIG1ldGhvZChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWV0aG9kTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBtZXRob2Qob2JqZWN0LmdldENsYXNzKCksIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGUpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2xhc3MgKHdpdGhvdXQgdGhlIGNoZWNrZWQgZXhjZXB0aW9uKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjbGFzc05hbWUsIGV4KTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgPFQ+IFQgbmV3SW5zdGFuY2UoQ2xhc3M8VD4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShqYXZhQ2xhc3MsIFpFUk9fUEFSQU1FVEVSX1RZUEVTLCBaRVJPX1BBUkFNRVRFUlMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogdXNpbmcgdGhlIGNsYXNzJ3MgZGVmYXVsdCAoemVyby1hcmd1bWVudCkgY29uc3RydWN0b3IuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKGNsYXNzTmFtZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiB1c2luZyB0aGUgY2xhc3MncyBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ld0luc3RhbmNlKENsYXNzLmZvck5hbWUoY2xhc3NOYW1lLCB0cnVlLCBjbGFzc0xvYWRlcikpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBuZXdJbnN0YW5jZShDbGFzczxUPiBqYXZhQ2xhc3MsIENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBhdHRlbXB0TmV3SW5zdGFuY2UoamF2YUNsYXNzLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycyk7Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBuc21lKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihuc21lICsgQ1IgKyBmdWxseVF1YWxpZmllZENvbnN0cnVjdG9yU2lnbmF0dXJlKGphdmFDbGFzcywgcGFyYW1ldGVyVHlwZXMpLCBuc21lKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzIGFuZCBwYXJhbWV0ZXJzLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+W10gcGFyYW1ldGVyVHlwZXMsIE9iamVjdFtdIHBhcmFtZXRlcnMpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlcywgcGFyYW1ldGVycywgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZXMgYW5kIHBhcmFtZXRlcnMuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz5bXSBwYXJhbWV0ZXJUeXBlcywgT2JqZWN0W10gcGFyYW1ldGVycykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzLCBPYmplY3RbXSBwYXJhbWV0ZXJzLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUsIHRydWUsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZXMsIHBhcmFtZXRlcnMpOwotCX0KLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuCi0JICogUmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MsCi0JICogZ2l2ZW4gdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciB0eXBlIGFuZCBwYXJhbWV0ZXIuCi0JICogQ2xhc3MjbmV3SW5zdGFuY2UoQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIDxUPiBUIG5ld0luc3RhbmNlKENsYXNzPFQ+IGphdmFDbGFzcywgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoamF2YUNsYXNzLCBuZXcgQ2xhc3NbXSB7cGFyYW1ldGVyVHlwZX0sIG5ldyBPYmplY3RbXSB7cGFyYW1ldGVyfSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLAotCSAqIGdpdmVuIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgdHlwZSBhbmQgcGFyYW1ldGVyLgotCSAqIENsYXNzI25ld0luc3RhbmNlKENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgbmV3SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgQ2xhc3M8Pz4gcGFyYW1ldGVyVHlwZSwgT2JqZWN0IHBhcmFtZXRlcikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3SW5zdGFuY2UoY2xhc3NOYW1lLCBwYXJhbWV0ZXJUeXBlLCBwYXJhbWV0ZXIsIG51bGwpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBjbGFzcywKLQkgKiBnaXZlbiB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGUgYW5kIHBhcmFtZXRlci4KLQkgKiBDbGFzcyNuZXdJbnN0YW5jZShDbGFzczw/PiBwYXJhbWV0ZXJUeXBlLCBPYmplY3QgcGFyYW1ldGVyKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKFN0cmluZyBjbGFzc05hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGUsIE9iamVjdCBwYXJhbWV0ZXIsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXdJbnN0YW5jZShDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSwgZmFsc2UsIGNsYXNzTG9hZGVyKSwgcGFyYW1ldGVyVHlwZSwgcGFyYW1ldGVyKTsKLQl9Ci0JCi0JLyoKLQkgKiBQdXNoIHRoZSBkZWNsYXJlZCBmaWVsZHMgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MKLQkgKiBvbnRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcHVzaERlY2xhcmVkRmllbGRzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8RmllbGQ+IHN0YWNrKSB7Ci0JCUZpZWxkW10gZmllbGRzID0gZGVjbGFyZWRGaWVsZHMoamF2YUNsYXNzKTsKLQkJZm9yIChpbnQgaSA9IGZpZWxkcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJc3RhY2sucHVzaChmaWVsZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qCi0JICogUHVzaCB0aGUgZGVjbGFyZWQgbWV0aG9kcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcwotCSAqIG9udG8gdGhlIHRvcCBvZiB0aGUgc3RhY2suCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXNoRGVjbGFyZWRNZXRob2RzKENsYXNzPD8+IGphdmFDbGFzcywgU3RhY2s8TWV0aG9kPiBzdGFjaykgewotCQlNZXRob2RbXSBtZXRob2RzID0gZGVjbGFyZWRNZXRob2RzKGphdmFDbGFzcyk7Ci0JCWZvciAoaW50IGkgPSBtZXRob2RzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlzdGFjay5wdXNoKG1ldGhvZHNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFNldCBhIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBvYmplY3QsIGZpZWxkIG5hbWUsIGFuZCBuZXcgZmllbGQgdmFsdWUuCi0JICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgcHJpdmF0ZSwgcGFja2FnZSwgb3IgcHJvdGVjdGVkIGZpZWxkcy4KLQkgKiBPYmplY3Qjc2V0RmllbGRWYWx1ZShTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RmllbGRWYWx1ZShPYmplY3Qgb2JqZWN0LCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0RmllbGRWYWx1ZShvYmplY3QsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKG9iamVjdCwgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU2V0IGEgc3RhdGljIGZpZWxkIHZhbHVlLCBnaXZlbiB0aGUgY29udGFpbmluZyBjbGFzcywgZmllbGQgbmFtZSwgYW5kIG5ldyBmaWVsZCB2YWx1ZS4KLQkgKiBVc2VmdWwgZm9yIGFjY2Vzc2luZyBwcml2YXRlLCBwYWNrYWdlLCBvciBwcm90ZWN0ZWQgZmllbGRzLgotCSAqIENsYXNzI3NldFN0YXRpY0ZpZWxkVmFsdWUoU3RyaW5nIGZpZWxkTmFtZSwgT2JqZWN0IGZpZWxkVmFsdWUpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXRpY0ZpZWxkVmFsdWUoQ2xhc3M8Pz4gamF2YUNsYXNzLCBTdHJpbmcgZmllbGROYW1lLCBPYmplY3QgZmllbGRWYWx1ZSkgewotCQl0cnkgewotCQkJYXR0ZW1wdFRvU2V0U3RhdGljRmllbGRWYWx1ZShqYXZhQ2xhc3MsIGZpZWxkTmFtZSwgZmllbGRWYWx1ZSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIG5zZmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG5zZmUgKyBDUiArIGZ1bGx5UXVhbGlmaWVkRmllbGROYW1lKGphdmFDbGFzcywgZmllbGROYW1lKSwgbnNmZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBvYmplY3QncyBjbGFzcy4KLQkgKiBDbGFzcyNnZXRTaG9ydE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0Q2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIHNob3J0TmFtZUZvcihvYmplY3QuZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gIk9iamVjdCIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnROYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gc2hvcnROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuZXN0ZWQgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICogQ2xhc3MjZ2V0TmVzdGVkTmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbmVzdGVkQ2xhc3NOYW1lRm9yT2JqZWN0KE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIG5lc3RlZE5hbWVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5lc3RlZCBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiRW50cnkiKS4KLQkgKiBDbGFzcyNnZXROZXN0ZWROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmVzdGVkIG5hbWUgb2YgdGhlIGNsYXNzIChlLmcuICJFbnRyeSIpLgotCSAqIENsYXNzI2dldE5lc3RlZE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5lc3RlZE5hbWVGb3IoQ2xhc3M8Pz4gamF2YUNsYXNzKSB7Ci0JCXJldHVybiBuZXN0ZWROYW1lRm9yQ2xhc3NOYW1lZChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgb2JqZWN0J3MgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdDbGFzc05hbWVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gdG9TdHJpbmdOYW1lRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAidG9TdHJpbmcoKSIgbmFtZSBvZiB0aGUgY2xhc3MuCi0JICogIk1lbWJlciIgY2xhc3NlcyB3aWxsIHJldHVybiBvbmx5IHRoZSBmaW5hbCBuYW1lOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyRNZW1iZXJDbGFzcyROZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAgICAgICAgID0+ICJOZXN0ZWRNZW1iZXJDbGFzcyIKLQkgKiAiTG9jYWwiIGFuZCAiYW5vbnltb3VzIiBjbGFzc2VzIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBlbWJlZGRlZCAnJCdzOgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIKLQkgKiAgICAgICAgID0+ICJUb3BMZXZlbENsYXNzJDFMb2NhbENsYXNzIgotCSAqICAgICAiY29tLmZvby5iYXIuVG9wTGV2ZWxDbGFzcyQxIgotCSAqICAgICAgICAgPT4gIlRvcExldmVsQ2xhc3MkMSIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ05hbWVGb3JDbGFzc05hbWVkKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc01lbWJlcihjbGFzc05hbWUpID8KLQkJCWNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUikgKyAxKQotCQk6Ci0JCQljbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgInRvU3RyaW5nKCkiIG5hbWUgb2YgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIHRvU3RyaW5nTmFtZUZvckNsYXNzTmFtZWQoamF2YUNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBjbGFzcyAoZS5nLiAiamF2YS5sYW5nIikuCi0JICogQ2xhc3MjZ2V0UGFja2FnZU5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2thZ2VOYW1lRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gcGFja2FnZU5hbWVGb3JDbGFzc05hbWVkKGphdmFDbGFzcy5nZXROYW1lKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgY2xhc3MgKGUuZy4gImphdmEubGFuZyIpLgotCSAqIENsYXNzI2dldFBhY2thZ2VOYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrYWdlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgbGFzdFBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdFBlcmlvZCA9PSAtMSkgewotCQkJcmV0dXJuICIiOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgb2YgdGhlIGNsYXNzLAotCSAqIGZvbGxvd2VkIGJ5IGl0cyBwYWNrYWdlIG5hbWUgKGUuZy4gIk9iamVjdCAoamF2YS5sYW5nKSIpLgotCSAqIENsYXNzI2dldFNob3J0TmFtZVdpdGhQYWNrYWdlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydE5hbWVXaXRoUGFja2FnZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZChzaG9ydE5hbWVGb3IoamF2YUNsYXNzKSk7Ci0JCWlmICggISBqYXZhQ2xhc3MuaXNQcmltaXRpdmUoKSkgewotCQkJc2IuYXBwZW5kKCIgKCIpOwotCQkJc2IuYXBwZW5kKHBhY2thZ2VOYW1lRm9yKGphdmFDbGFzcykpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSB6ZXJvLWFyZ3VtZW50LCBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzCi0JICogYW5kIG1ldGhvZCBuYW1lLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gewotCQlyZXR1cm4gc3RhdGljTWV0aG9kKGphdmFDbGFzcywgbWV0aG9kTmFtZSwgWkVST19QQVJBTUVURVJfVFlQRVMpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlcy4gSWYgdGhlIGNsYXNzIGRvZXMgbm90IGRpcmVjdGx5Ci0JICogaW1wbGVtZW50IHRoZSBtZXRob2QsIGxvb2sgZm9yIGl0IGluIHRoZSBjbGFzcydzIHN1cGVyY2xhc3Nlcy4KLQkgKiBTZXQgYWNjZXNzaWJsZSB0byB0cnVlLCBzbyB3ZSBjYW4gYWNjZXNzCi0JICogcHJpdmF0ZS9wYWNrYWdlL3Byb3RlY3RlZCBtZXRob2RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTWV0aG9kIHN0YXRpY01ldGhvZChDbGFzczw/PiBqYXZhQ2xhc3MsIFN0cmluZyBtZXRob2ROYW1lLCBDbGFzczw/PltdIHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJTWV0aG9kIG1ldGhvZCA9IG1ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkpIHsKLQkJCXJldHVybiBtZXRob2Q7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbihmdWxseVF1YWxpZmllZE1ldGhvZFNpZ25hdHVyZShqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIHBhcmFtZXRlclR5cGVzKSk7Ci0JfQotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKiBSZXR1cm4gYSBzdGF0aWMgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLCBtZXRob2QgbmFtZSwKLQkgKiBhbmQgZm9ybWFsIHBhcmFtZXRlciB0eXBlLiBJZiB0aGUgY2xhc3MgZG9lcyBub3QgZGlyZWN0bHkKLQkgKiBpbXBsZW1lbnQgdGhlIG1ldGhvZCwgbG9vayBmb3IgaXQgaW4gdGhlIGNsYXNzJ3Mgc3VwZXJjbGFzc2VzLgotCSAqIFNldCBhY2Nlc3NpYmxlIHRvIHRydWUsIHNvIHdlIGNhbiBhY2Nlc3MKLQkgKiBwcml2YXRlL3BhY2thZ2UvcHJvdGVjdGVkIG1ldGhvZHMuCi0JICovCi0JcHVibGljIHN0YXRpYyBNZXRob2Qgc3RhdGljTWV0aG9kKENsYXNzPD8+IGphdmFDbGFzcywgU3RyaW5nIG1ldGhvZE5hbWUsIENsYXNzPD8+IHBhcmFtZXRlclR5cGVzKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHN0YXRpY01ldGhvZChqYXZhQ2xhc3MsIG1ldGhvZE5hbWUsIG5ldyBDbGFzc1tdIHtwYXJhbWV0ZXJUeXBlc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgY2FuIGJlICJkZWNsYXJlZCIgaW4gY29kZTsKLQkgKiBpLmUuIGl0IGlzIGVpdGhlciBhICJ0b3AtbGV2ZWwiIGNsYXNzIG9yIGEgIm1lbWJlciIgY2xhc3MsIGJ1dCBpdAotCSAqIGlzIG5vdCBhbiAiYXJyYXkiIGNsYXNzLiBUaGlzIG1ldGhvZCByb2xscyB0b2dldGhlciBhbGwgdGhlIGNoZWNrcwotCSAqIGZyb20gdGhlIG90aGVyIG1ldGhvZHMgZm9yIGEgYml0IG9mIGEgcGVyZm9ybWFuY2UgdHdlYWsuCi0JICogQ2xhc3MjaXNEZWNsYXJhYmxlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzRGVjbGFyYWJsZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KDApID09IEFSUkFZX0lORElDQVRPUikgewotCQkJcmV0dXJuIGZhbHNlOwkJLy8gaXQgaXMgYW4gImFycmF5IiBjbGFzcwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIHRydWU7CQkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidG9wLWxldmVsIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgIm1lbWJlciIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgZG9lcyBOT1QgY29udGFpbiBhICckJzogIlRvcExldmVsQ2xhc3MiKS4KLQkgKiBDbGFzcyNpc1RvcExldmVsKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzVG9wTGV2ZWwoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpID09IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAibWVtYmVyIiBjbGFzcywKLQkgKiBhcyBvcHBvc2VkIHRvIGEgInRvcC1sZXZlbCIsICJsb2NhbCIsIG9yICJhbm9ueW1vdXMiIGNsYXNzLAotCSAqIHVzaW5nIHRoZSBzdGFuZGFyZCBqZGsgbmFtaW5nIGNvbnZlbnRpb25zIChpLmUuIHRoZSBjbGFzcwotCSAqIG5hbWUgY29udGFpbnMgYXQgbGVhc3Qgb25lICckJyBhbmQgYWxsIHRoZSBuYW1lcyBiZXR3ZWVuCi0JICogZWFjaCAnJCcgYXJlIGxlZ2FsIGNsYXNzIG5hbWVzOgotCSAqICJUb3BMZXZlbENsYXNzJE1lbWJlckNsYXNzJE5lc3RlZE1lbWJlckNsYXNzIikuCi0JICogQ2xhc3MjaXNNZW1iZXIoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNNZW1iZXIoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBpbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJcmV0dXJuIGZhbHNlOwkvLyBpdCBpcyBhICJ0b3AtbGV2ZWwiIGNsYXNzCi0JCX0KLQkJZG8gewotCQkJLy8gdGhlIGNoYXJhY3RlciBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGRvbGxhciBzaWduIGNhbm5vdCBiZSBhIGRpZ2l0Ci0JCQlpbmRleCsrOwotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaW5kZXgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWluZGV4ID0gY2xhc3NOYW1lLmluZGV4T2YoTkVTVEVEX0NMQVNTX05BTUVfU0VQQVJBVE9SLCBpbmRleCk7Ci0JCX0gd2hpbGUgKGluZGV4ICE9IC0xKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJsb2NhbCIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImFub255bW91cyIgY2xhc3MsCi0JICogdXNpbmcgdGhlIHN0YW5kYXJkIGpkayAob3IgRWNsaXBzZSkgbmFtaW5nIGNvbnZlbnRpb25zLgotCSAqIEluIHRoZSBqZGssIHRoZSBjbGFzcyBuYW1lIGVuZHMgd2l0aCAnJG5ublhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBmb2xsb3dlZCBieSB0aGUKLQkgKiBsb2NhbCBjbGFzcyBuYW1lOiAiVG9wTGV2ZWxDbGFzcyQxTG9jYWxDbGFzcyIuCi0JICogSW4gRWNsaXBzZSwgdGhlIGNsYXNzIG5hbWUgZW5kcyB3aXRoICckbm5uJFhYWCcgd2hlcmUgdGhlICckJyBpcwotCSAqIGZvbGxvd2VkIGJ5IGEgc2VyaWVzIG9mIG51bWVyaWMgZGlnaXRzIHdoaWNoIGFyZSBzZXBhcmF0ZWQgZnJvbQotCSAqIHRoZSBsb2NhbCBjbGFzcyBuYW1lIGJ5IGFub3RoZXIgJyQnOiAiVG9wTGV2ZWxDbGFzcyQxJExvY2FsQ2xhc3MiLgotCSAqIENsYXNzI2lzTG9jYWwoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNMb2NhbChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChjbGFzc05hbWVkSXNBcnJheShjbGFzc05hbWUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IGRvbGxhciA9IGNsYXNzTmFtZS5pbmRleE9mKE5FU1RFRF9DTEFTU19OQU1FX1NFUEFSQVRPUik7Ci0JCWlmIChkb2xsYXIgPT0gLTEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoICEgQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NOYW1lLmNoYXJBdChkb2xsYXIgKyAxKSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbGVuID0gY2xhc3NOYW1lLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gZG9sbGFyICsgMjsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjbGFzc05hbWUuY2hhckF0KGkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMgKGFub255bW91cykKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYW4gImFub255bW91cyIgY2xhc3MsCi0JICogYXMgb3Bwb3NlZCB0byBhICJ0b3AtbGV2ZWwiLCAibWVtYmVyIiwgb3IgImxvY2FsIiBjbGFzcywKLQkgKiB1c2luZyB0aGUgc3RhbmRhcmQgamRrIG5hbWluZyBjb252ZW50aW9ucyAoaS5lLiB0aGUgY2xhc3MKLQkgKiBuYW1lIGVuZHMgd2l0aCAnJG5ubicgd2hlcmUgYWxsIHRoZSBjaGFyYWN0ZXJzIHBhc3QgdGhlCi0JICogbGFzdCAnJCcgYXJlIG51bWVyaWMgZGlnaXRzOiAiVG9wTGV2ZWxDbGFzcyQxIikuCi0JICogQ2xhc3MjaXNBbm9ueW1vdXMoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNBbm9ueW1vdXMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWludCBkb2xsYXIgPSBjbGFzc05hbWUuaW5kZXhPZihORVNURURfQ0xBU1NfTkFNRV9TRVBBUkFUT1IpOwotCQlpZiAoZG9sbGFyID09IC0xKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaW50IHN0YXJ0ID0gZG9sbGFyICsgMTsKLQkJZm9yIChpbnQgaSA9IGNsYXNzTmFtZS5sZW5ndGgoKTsgaS0tID4gc3RhcnQ7ICkgewotCQkJaWYgKCAhIENoYXJhY3Rlci5pc0RpZ2l0KGNsYXNzTmFtZS5jaGFyQXQoaSkpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCS8vIGFsbCB0aGUgY2hhcmFjdGVycyBwYXN0IHRoZSAkIGFyZSBkaWdpdHMKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaW50IGRlcHRoID0gMDsKLQkJd2hpbGUgKGphdmFDbGFzcy5pc0FycmF5KCkpIHsKLQkJCWRlcHRoKys7Ci0JCQlqYXZhQ2xhc3MgPSBqYXZhQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIFRoZSBkZXB0aCBpcyB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgZm9yIGFuIGFycmF5LgotCSAqIE5vbi1hcnJheXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvck9iamVjdChPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yKG9iamVjdC5nZXRDbGFzcygpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYXJyYXkgZGVwdGgiIG9mIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogVGhlIGRlcHRoIGlzIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBmb3IgYW4gYXJyYXkgdHlwZS4KLQkgKiBOb24tYXJyYXkgdHlwZXMgaGF2ZSBhIGRlcHRoIG9mIHplcm8uCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0QXJyYXlEZXB0aCgpCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSAwOwotCQl3aGlsZSAoY2xhc3NOYW1lLmNoYXJBdChkZXB0aCkgPT0gQVJSQVlfSU5ESUNBVE9SKSB7Ci0JCQlkZXB0aCsrOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGFuIGFycmF5IHR5cGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc0FycmF5KFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZS5jaGFyQXQoMCkgPT0gQVJSQVlfSU5ESUNBVE9SOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIEEgbm9uLWFycmF5IHR5cGUgc2ltcGx5IHJldHVybnMgaXRzZWxmLgotCSAqIENsYXNzI2dldEVsZW1lbnRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGVsZW1lbnRUeXBlRm9yKENsYXNzPD8+IGphdmFDbGFzcykgewotCQl3aGlsZSAoamF2YUNsYXNzLmlzQXJyYXkoKSkgewotCQkJamF2YUNsYXNzID0gamF2YUNsYXNzLmdldENvbXBvbmVudFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gamF2YUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogVGhlIGVsZW1lbnQgdHlwZSBpcyB0aGUgYmFzZSB0eXBlIGhlbGQgYnkgYW4gYXJyYXkuCi0JICogQSBub24tYXJyYXkgc2ltcGx5IHJldHVybnMgaXRzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZWxlbWVudFR5cGVGb3JPYmplY3QoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZWxlbWVudFR5cGVGb3Iob2JqZWN0LmdldENsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvcihDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJcmV0dXJuIGVsZW1lbnRUeXBlRm9yKGphdmFDbGFzcykuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImVsZW1lbnQgdHlwZSIgb2YgdGhlIHNwZWNpZmllZCBjbGFzcy4KLQkgKiBUaGUgZWxlbWVudCB0eXBlIGlzIHRoZSBiYXNlIHR5cGUgaGVsZCBieSBhbiBhcnJheSB0eXBlLgotCSAqIE5vbi1hcnJheSB0eXBlcyBzaW1wbHkgcmV0dXJuIHRoZW1zZWx2ZXMuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICogQ2xhc3MjZ2V0RWxlbWVudFR5cGUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVsZW1lbnRUeXBlTmFtZUZvckNsYXNzTmFtZWQoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpbnQgZGVwdGggPSBhcnJheURlcHRoRm9yQ2xhc3NOYW1lZChjbGFzc05hbWUpOwotCQlpZiAoZGVwdGggPT0gMCkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJqYXZhLmxhbmcuT2JqZWN0IiBvciAiaW50IgotCQkJcmV0dXJuIGNsYXNzTmFtZTsKLQkJfQotCQlpbnQgbGFzdCA9IGNsYXNzTmFtZS5sZW5ndGgoKSAtIDE7Ci0JCWlmIChjbGFzc05hbWUuY2hhckF0KGRlcHRoKSA9PSBSRUZFUkVOQ0VfQ0xBU1NfQ09ERSkgewotCQkJLy8gdGhlIG5hbWUgaXMgaW4gdGhlIGZvcm06ICJbW1tMamF2YS5sYW5nLk9iamVjdDsiCi0JCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZyhkZXB0aCArIDEsIGxhc3QpOwkvLyBkcm9wIHRoZSB0cmFpbGluZyAnOycKLQkJfQotCQkvLyB0aGUgbmFtZSBpcyBpbiB0aGUgZm9ybTogIltbW0kiCi0JCXJldHVybiBjbGFzc05hbWVGb3JDb2RlKGNsYXNzTmFtZS5jaGFyQXQobGFzdCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInJlZmVyZW5jZSIKLQkgKiBjbGFzcyAoaS5lLiBuZWl0aGVyICd2b2lkJyBub3Igb25lIG9mIHRoZSBwcmltaXRpdmUgdmFyaWFibGUgY2xhc3NlcywKLQkgKiBbJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLl0pLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNSZWZlcmVuY2UoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gISBjbGFzc05hbWVkSXNQcmltaXRpdmUoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ3ZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIGNsYXNzZXMsCi0JICogWydib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpKSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJfQotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoY29kZXNbaV0uamF2YUNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgInZhcmlhYmxlIiBwcmltaXRpdmUKLQkgKiBjbGFzcyAoaS5lLiAnYm9vbGVhbicsICdpbnQnLCAnZmxvYXQnLCBldGMuLCBidXQgbm90ICd2b2lkJykuCi0JICogTkI6IHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSA9PSB0cnVlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNsYXNzTmFtZWRJc1ZhcmlhYmxlUHJpbWl0aXZlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIGNsYXNzTmFtZWRJc1ByaW1pdGl2ZShjbGFzc05hbWUpCi0JCQkmJiAoICEgY2xhc3NOYW1lLmVxdWFscyhWT0lEX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NOYW1lZElzUHJpbWl0aXZlV3JhcHBlckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKGNsYXNzTmFtZWRJc0FycmF5KGNsYXNzTmFtZSkgfHwgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IG1heFByaW1pdGl2ZVdyYXBwZXJDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHBlcmZvcm1hbmNlIHR3ZWFrCi0JCX0KLQkJUHJpbWl0aXZlW10gY29kZXMgPSBwcmltaXRpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSBjb2Rlcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJaWYgKGNvZGVzW2ldLndyYXBwZXJDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjbGFzcyBpcyBhICJ2YXJpYWJsZSIgcHJpbWl0aXZlCi0JICogY2xhc3MgKGkuZS4gJ2Jvb2xlYW4nLCAnaW50JywgJ2Zsb2F0JywgZXRjLiwgYnV0IG5vdCAndm9pZCcpLgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGFzc05hbWVkSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBjbGFzc05hbWVkSXNQcmltaXRpdmVXcmFwcGVyQ2xhc3MoY2xhc3NOYW1lKQotCQkJJiYgKCAhIGNsYXNzTmFtZS5lcXVhbHMoVk9JRF9XUkFQUEVSX0NMQVNTX05BTUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGNsYXNzIGlzIGEgcHJpbWl0aXZlIHdyYXBwZXIKLQkgKiBjbGFzcyAoaS5lLiAnamF2YS5sYW5nLlZvaWQnIG9yIG9uZSBvZiB0aGUgcHJpbWl0aXZlIHZhcmlhYmxlIHdyYXBwZXIgY2xhc3NlcywKLQkgKiBbJ2phdmEubGFuZy5Cb29sZWFuJywgJ2phdmEubGFuZy5JbnRlZ2VyJywgJ2phdmEubGFuZy5GbG9hdCcsIGV0Yy5dKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKGphdmFDbGFzcy5pc0FycmF5KCkgfHwgKGphdmFDbGFzcy5nZXROYW1lKCkubGVuZ3RoKCkgPiBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBwZXJmb3JtYW5jZSB0d2VhawotCQl9Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS53cmFwcGVyQ2xhc3MgPT0gamF2YUNsYXNzKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgYSAidmFyaWFibGUiIHByaW1pdGl2ZQotCSAqIGNsYXNzIChpLmUuICdib29sZWFuJywgJ2ludCcsICdmbG9hdCcsIGV0Yy4sIGJ1dCBub3QgJ3ZvaWQnKS4KLQkgKiBOQjogdm9pZC5jbGFzcy5pc1ByaW1pdGl2ZSgpID09IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlckNsYXNzKENsYXNzPD8+IGphdmFDbGFzcykgewotCQlyZXR1cm4gY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXJDbGFzcyhqYXZhQ2xhc3MpCi0JCQkmJiAoamF2YUNsYXNzICE9IGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgY29kZS4KLQkgKiBAc2VlIGphdmEubGFuZy5DbGFzcyNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjbGFzc05hbWVGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCXJldHVybiBjbGFzc0ZvckNvZGUoY2xhc3NDb2RlKS5nZXROYW1lKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NOYW1lRm9yQ29kZSgoY2hhcikgY2xhc3NDb2RlKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBjb2RlLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JDb2RlKGNoYXIgY2xhc3NDb2RlKSB7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWlmIChjb2Rlc1tpXS5jb2RlID09IGNsYXNzQ29kZSkgewotCQkJCXJldHVybiBjb2Rlc1tpXS5qYXZhQ2xhc3M7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihjbGFzc0NvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIGNvZGUuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBDbGFzczw/PiBjbGFzc0ZvckNvZGUoaW50IGNsYXNzQ29kZSkgewotCQlyZXR1cm4gY2xhc3NGb3JDb2RlKChjaGFyKSBjbGFzc0NvZGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGNvZGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MuCi0JICogQHNlZSBqYXZhLmxhbmcuQ2xhc3MjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBjaGFyIGNvZGVGb3JDbGFzcyhDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJaWYgKCggISBqYXZhQ2xhc3MuaXNBcnJheSgpKSAmJiAoamF2YUNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcyA9PSBqYXZhQ2xhc3MpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF2YUNsYXNzLmdldE5hbWUoKSk7CQkKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBjb2RlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciBjb2RlRm9yQ2xhc3NOYW1lZChTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmICgoICEgY2xhc3NOYW1lZElzQXJyYXkoY2xhc3NOYW1lKSkgJiYgKGNsYXNzTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkpIHsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQkJcmV0dXJuIGNvZGVzW2ldLmNvZGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2xhc3NOYW1lKTsJCQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIHR5cGVEZWNsYXJhdGlvbikgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odHlwZURlY2xhcmF0aW9uLCBDbGFzc1Rvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkICJ0eXBlIGRlY2xhcmF0aW9uIiwKLQkgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGNsYXNzIGxvYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24sIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odGQuZWxlbWVudFR5cGVOYW1lLCB0ZC5hcnJheURlcHRoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdHlwZURlY2xhcmF0aW9uID0gU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZSh0eXBlRGVjbGFyYXRpb24pOwotCQlpbnQgYXJyYXlEZXB0aCA9IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKHR5cGVEZWNsYXJhdGlvbik7Ci0JCVN0cmluZyBlbGVtZW50VHlwZU5hbWUgPSB0eXBlRGVjbGFyYXRpb24uc3Vic3RyaW5nKDAsIHR5cGVEZWNsYXJhdGlvbi5sZW5ndGgoKSAtIChhcnJheURlcHRoICogMikpOwotCQlyZXR1cm4gbmV3IFR5cGVEZWNsYXJhdGlvbihlbGVtZW50VHlwZU5hbWUsIGFycmF5RGVwdGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNsYXNzRm9yVHlwZURlY2xhcmF0aW9uKGVsZW1lbnRUeXBlTmFtZSwgYXJyYXlEZXB0aCwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLAotCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgotCSAqLwotCS8vIHNlZSB0aGUgIkV2YWx1YXRpb24iIG9mIGpkayBidWcgNjQ0NjYyNyBmb3IgYSBkaXNjdXNzaW9uIG9mIGxvYWRpbmcgY2xhc3NlcwotCXB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gY2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCS8vIHByaW1pdGl2ZXMgY2Fubm90IGJlIGxvYWRlZCB2aWEgQ2xhc3MjZm9yTmFtZSgpLAotCQkvLyBzbyBjaGVjayBmb3IgYSBwcmltaXRpdmUgY2xhc3MgbmFtZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIG5vbi1hcnJheQotCQlpZiAoYXJyYXlEZXB0aCA9PSAwKSB7Ci0JCQlyZXR1cm4gKHBjYyA9PSBudWxsKSA/IENsYXNzLmZvck5hbWUoZWxlbWVudFR5cGVOYW1lLCBmYWxzZSwgY2xhc3NMb2FkZXIpIDogcGNjLmphdmFDbGFzczsKLQkJfQotCi0JCS8vIGFycmF5Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOwotCQlmb3IgKGludCBpID0gYXJyYXlEZXB0aDsgaS0tID4gMDsgKSB7Ci0JCQlzYi5hcHBlbmQoQVJSQVlfSU5ESUNBVE9SKTsKLQkJfQotCQlpZiAocGNjID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfQ09ERSk7Ci0JCQlzYi5hcHBlbmQoZWxlbWVudFR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChSRUZFUkVOQ0VfQ0xBU1NfTkFNRV9ERUxJTUlURVIpOwotCQl9IGVsc2UgewotCQkJc2IuYXBwZW5kKHBjYy5jb2RlKTsKLQkJfQotCQlyZXR1cm4gQ2xhc3MuZm9yTmFtZShzYi50b1N0cmluZygpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iOyBlLmcuCi0JICogICAgICJpbnRbXSIgLT4gIltJIgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCVR5cGVEZWNsYXJhdGlvbiB0ZCA9IHR5cGVEZWNsYXJhdGlvbih0eXBlRGVjbGFyYXRpb24pOwotCQlyZXR1cm4gY2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKHRkLmVsZW1lbnRUeXBlTmFtZSwgdGQuYXJyYXlEZXB0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnJheSBkZXB0aCBmb3IgdGhlIHNwZWNpZmllZCAidHlwZSBkZWNsYXJhdGlvbiI7IGUuZy4KLQkgKiAgICAgImludFtdIiAtPiAxCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgYXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBhcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uXyhTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlKHR5cGVEZWNsYXJhdGlvbikpOwotCX0KLQotCS8qCi0JICogQXNzdW1lIG5vIHdoaXRlc3BhY2UgaW4gdGhlIHR5cGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb25fKFN0cmluZyB0eXBlRGVjbGFyYXRpb24pIHsKLQkJaW50IGxhc3QgPSB0eXBlRGVjbGFyYXRpb24ubGVuZ3RoKCkgLSAxOwotCQlpbnQgZGVwdGggPSAwOwotCQlpbnQgY2xvc2UgPSBsYXN0OwotCQl3aGlsZSAodHlwZURlY2xhcmF0aW9uLmNoYXJBdChjbG9zZSkgPT0gVFlQRV9ERUNMQVJBVElPTl9BUlJBWV9DTE9TRSkgewotCQkJaWYgKHR5cGVEZWNsYXJhdGlvbi5jaGFyQXQoY2xvc2UgLSAxKSA9PSBUWVBFX0RFQ0xBUkFUSU9OX0FSUkFZX09QRU4pIHsKLQkJCQlkZXB0aCsrOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIHR5cGUgZGVjbGFyYXRpb246ICIgKyB0eXBlRGVjbGFyYXRpb24pOwotCQkJfQotCQkJY2xvc2UgPSBsYXN0IC0gKGRlcHRoICogMik7Ci0JCX0KLQkJcmV0dXJuIGRlcHRoOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsYXNzIG5hbWUgZm9yIHRoZSBzcGVjaWZpZWQgInR5cGUgZGVjbGFyYXRpb24iLgotCSAqIEBzZWUgamF2YS5sYW5nLkNsYXNzI2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudFR5cGVOYW1lLCBpbnQgYXJyYXlEZXB0aCkgewotCQkvLyBub24tYXJyYXkKLQkJaWYgKGFycmF5RGVwdGggPT0gMCkgewotCQkJcmV0dXJuIGVsZW1lbnRUeXBlTmFtZTsKLQkJfQotCi0JCWlmIChlbGVtZW50VHlwZU5hbWUuZXF1YWxzKFZPSURfQ0xBU1NfTkFNRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIiciICsgVk9JRF9DTEFTU19OQU1FICsgIicgbXVzdCBoYXZlIGFuIGFycmF5IGRlcHRoIG9mIHplcm86ICIgKyBhcnJheURlcHRoICsgJy4nKTsKLQkJfQotCQkvLyBhcnJheQotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMTAwKTsKLQkJZm9yIChpbnQgaSA9IGFycmF5RGVwdGg7IGktLSA+IDA7ICkgewotCQkJc2IuYXBwZW5kKEFSUkFZX0lORElDQVRPUik7Ci0JCX0KLQotCQkvLyBsb29rIGZvciBhIHByaW1pdGl2ZSBmaXJzdAotCQlQcmltaXRpdmUgcGNjID0gbnVsbDsKLQkJaWYgKGVsZW1lbnRUeXBlTmFtZS5sZW5ndGgoKSA8PSBtYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKSkgeyAgLy8gcGVyZm9ybWFuY2UgdHdlYWsKLQkJCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQkJaWYgKGNvZGVzW2ldLmphdmFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnRUeXBlTmFtZSkpIHsKLQkJCQkJcGNjID0gY29kZXNbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChwY2MgPT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19DT0RFKTsKLQkJCXNiLmFwcGVuZChlbGVtZW50VHlwZU5hbWUpOwotCQkJc2IuYXBwZW5kKFJFRkVSRU5DRV9DTEFTU19OQU1FX0RFTElNSVRFUik7Ci0JCX0gZWxzZSB7Ci0JCQlzYi5hcHBlbmQocGNjLmNvZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IG1heFByaW1pdGl2ZUNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaWYgKE1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPT0gLTEpIHsKLQkJCU1BWF9QUklNSVRJVkVfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVDbGFzc05hbWVMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gTUFYX1BSSU1JVElWRV9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpbnQgbWF4ID0gLTE7Ci0JCVByaW1pdGl2ZVtdIGNvZGVzID0gcHJpbWl0aXZlcygpOwotCQlmb3IgKGludCBpID0gY29kZXMubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWludCBsZW4gPSBjb2Rlc1tpXS5qYXZhQ2xhc3MuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJaWYgKGxlbiA+IG1heCkgewotCQkJCW1heCA9IGxlbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbWF4OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCkgewotCQlpZiAoTUFYX1BSSU1JVElWRV9XUkFQUEVSX0NMQVNTX05BTUVfTEVOR1RIID09IC0xKSB7Ci0JCQlNQVhfUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NfTkFNRV9MRU5HVEggPSBjYWxjdWxhdGVNYXhQcmltaXRpdmVXcmFwcGVyQ2xhc3NOYW1lTGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIE1BWF9QUklNSVRJVkVfV1JBUFBFUl9DTEFTU19OQU1FX0xFTkdUSDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgY2FsY3VsYXRlTWF4UHJpbWl0aXZlV3JhcHBlckNsYXNzTmFtZUxlbmd0aCgpIHsKLQkJaW50IG1heCA9IC0xOwotCQlQcmltaXRpdmVbXSBjb2RlcyA9IHByaW1pdGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IGNvZGVzLmxlbmd0aDsgaS0tID4gMDsgKSB7Ci0JCQlpbnQgbGVuID0gY29kZXNbaV0ud3JhcHBlckNsYXNzLmdldE5hbWUoKS5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiBtYXgpIHsKLQkJCQltYXggPSBsZW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1heDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVbXSBwcmltaXRpdmVzKCkgewotCQlpZiAoUFJJTUlUSVZFUyA9PSBudWxsKSB7Ci0JCQlQUklNSVRJVkVTID0gYnVpbGRQcmltaXRpdmVzKCk7Ci0JCX0KLQkJcmV0dXJuIFBSSU1JVElWRVM7Ci0JfQotCQotCS8qKgotCSAqIE5COiB2b2lkLmNsYXNzLmlzUHJpbWl0aXZlKCkgPT0gdHJ1ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFByaW1pdGl2ZVtdIGJ1aWxkUHJpbWl0aXZlcygpIHsKLQkJUHJpbWl0aXZlW10gcmVzdWx0ID0gbmV3IFByaW1pdGl2ZVs5XTsKLQkJcmVzdWx0WzBdID0gbmV3IFByaW1pdGl2ZShCWVRFX0NPREUsIGphdmEubGFuZy5CeXRlLmNsYXNzKTsKLQkJcmVzdWx0WzFdID0gbmV3IFByaW1pdGl2ZShDSEFSX0NPREUsIGphdmEubGFuZy5DaGFyYWN0ZXIuY2xhc3MpOwotCQlyZXN1bHRbMl0gPSBuZXcgUHJpbWl0aXZlKERPVUJMRV9DT0RFLCBqYXZhLmxhbmcuRG91YmxlLmNsYXNzKTsKLQkJcmVzdWx0WzNdID0gbmV3IFByaW1pdGl2ZShGTE9BVF9DT0RFLCBqYXZhLmxhbmcuRmxvYXQuY2xhc3MpOwotCQlyZXN1bHRbNF0gPSBuZXcgUHJpbWl0aXZlKElOVF9DT0RFLCBqYXZhLmxhbmcuSW50ZWdlci5jbGFzcyk7Ci0JCXJlc3VsdFs1XSA9IG5ldyBQcmltaXRpdmUoTE9OR19DT0RFLCBqYXZhLmxhbmcuTG9uZy5jbGFzcyk7Ci0JCXJlc3VsdFs2XSA9IG5ldyBQcmltaXRpdmUoU0hPUlRfQ09ERSwgamF2YS5sYW5nLlNob3J0LmNsYXNzKTsKLQkJcmVzdWx0WzddID0gbmV3IFByaW1pdGl2ZShCT09MRUFOX0NPREUsIGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKTsKLQkJcmVzdWx0WzhdID0gbmV3IFByaW1pdGl2ZShWT0lEX0NPREUsIGphdmEubGFuZy5Wb2lkLmNsYXNzKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgQ2xhc3NUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1pdGl2ZSB7Ci0JCWZpbmFsIGNoYXIgY29kZTsKLQkJZmluYWwgQ2xhc3M8Pz4gamF2YUNsYXNzOwotCQlmaW5hbCBDbGFzczw/PiB3cmFwcGVyQ2xhc3M7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUEVSX0NMQVNTX1RZUEVfRklFTERfTkFNRSA9ICJUWVBFIjsKLQkJLy8gZS5nLiBqYXZhLmxhbmcuQm9vbGVhbi5UWVBFID0+IGJvb2xlYW4uY2xhc3MKLQkJUHJpbWl0aXZlKGNoYXIgY29kZSwgQ2xhc3M8Pz4gd3JhcHBlckNsYXNzKSB7Ci0JCQl0aGlzLmNvZGUgPSBjb2RlOwotCQkJdGhpcy53cmFwcGVyQ2xhc3MgPSB3cmFwcGVyQ2xhc3M7Ci0JCQl0aGlzLmphdmFDbGFzcyA9IChDbGFzczw/Pikgc3RhdGljRmllbGRWYWx1ZSh3cmFwcGVyQ2xhc3MsIFdSQVBQRVJfQ0xBU1NfVFlQRV9GSUVMRF9OQU1FKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFR5cGVEZWNsYXJhdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBlbGVtZW50VHlwZU5hbWU7Ci0JCWZpbmFsIGludCBhcnJheURlcHRoOwotCQlUeXBlRGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnRUeXBlTmFtZSwgaW50IGFycmF5RGVwdGgpIHsKLQkJCXRoaXMuZWxlbWVudFR5cGVOYW1lID0gZWxlbWVudFR5cGVOYW1lOwotCQkJdGhpcy5hcnJheURlcHRoID0gYXJyYXlEZXB0aDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0FycmF5VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWY4NDA3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9BcnJheVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5VG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBBcnJheVRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc3RhbnRpYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbMl07Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMubmV3QXJyYXkoYXJyYXkxKTsKLQkJYXJyYXkyWzBdID0gImZvbyI7Ci0JCWFycmF5MlsxXSA9ICJiYXIiOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IG5ldyBTdHJpbmdbMl07Ci0JCVN0cmluZ1tdIGFycmF5MiA9IEFycmF5VG9vbHMubmV3QXJyYXkoYXJyYXkxLCA1KTsKLQkJYXJyYXkyWzBdID0gImZvbyI7Ci0JCWFycmF5Mls0XSA9ICJiYXIiOwotCQlhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcnJheTIuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXJyYXkyLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5T2JqZWN0QXJyYXlJbnRfRXhjZXB0aW9uKCkgewotCQlTdHJpbmdbXSBhcnJheTEgPSBuZXcgU3RyaW5nWzJdOwotCQlPYmplY3RbXSBhcnJheTIgPSBBcnJheVRvb2xzLm5ld0FycmF5KGFycmF5MSwgNSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFycmF5MlsxXSA9IEludGVnZXIudmFsdWVPZig3KTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGFycmF5MikpOwotCQl9IGNhdGNoIChBcnJheVN0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBvbmVudFR5cGUoKSB7Ci0JCVN0cmluZ1tdIGFycmF5ID0gbmV3IFN0cmluZ1syXTsKLQkJQ2xhc3M8PyBleHRlbmRzIFN0cmluZz4gamF2YUNsYXNzID0gQXJyYXlUb29scy5jb21wb25lbnRUeXBlKGFycmF5KTsKLQkJYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3QXJyYXlDbGFzc0ludCgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLm5ld0FycmF5KFN0cmluZy5jbGFzcywgNSk7Ci0JCWFycmF5WzBdID0gImZvbyI7Ci0JCWFycmF5WzRdID0gImJhciI7Ci0JCWFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFycmF5LmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGFycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5Q2xhc3NJbnRfRXhjZXB0aW9uKCkgewotCQlPYmplY3RbXSBhcnJheSA9IEFycmF5VG9vbHMubmV3QXJyYXkoU3RyaW5nLmNsYXNzLCA1KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXJyYXlbMV0gPSBJbnRlZ2VyLnZhbHVlT2YoNyk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhhcnJheSkpOwotCQl9IGNhdGNoIChBcnJheVN0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0FycmF5Q2xhc3NJbnRfUHJpbWl0aXZlKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IEFycmF5VG9vbHMubmV3QXJyYXkoaW50LmNsYXNzLCA1KTsKLQkJCWZhaWwoImJvZ3VzIGFycmF5OiAiICsgQXJyYXlzLnRvU3RyaW5nKGFycmF5KSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmFibGVPYmplY3RBcnJheV9TdHJpbmcoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYXJyYXkoaXRlcmFibGUsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhYmxlT2JqZWN0QXJyYXlfT2JqZWN0KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCBuZXcgT2JqZWN0WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYWJsZUludE9iamVjdEFycmF5KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KGl0ZXJhYmxlLCAzLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvcigpIHsKLQkJT2JqZWN0W10gYSA9IEFycmF5VG9vbHMuYXJyYXkodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlPYmplY3RbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9yT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGEsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlJdGVyYXRvck9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9FbXB0eV9DbGVhckFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gQXJyYXlUb29scy5hcnJheShFbXB0eUl0ZXJhdG9yLjxTdHJpbmc+aW5zdGFuY2UoKSwgbmV3IFN0cmluZ1s1XSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydE51bGwoYVswXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5SXRlcmF0b3JPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIG5ldyBPYmplY3RbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheUl0ZXJhdG9ySW50T2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBBcnJheVRvb2xzLmFycmF5KEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzLCBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheU9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksICJ0d2VudHkiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d2VudHkiKSk7Ci0JCWFzc2VydEVxdWFscygidHdlbnR5IiwgYVthLmxlbmd0aC0xXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSwgInR3ZW50eSIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3ZW50eSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d2VudHkiLCBhW2EubGVuZ3RoLTFdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAidHdlbnR5Iik7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidHdlbnR5IikpOwotCQlhc3NlcnRFcXVhbHMoInR3ZW50eSIsIGFbMF0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsICJYIik7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0QXJyYXlJbnRPYmplY3RfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAyLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0VuZCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNCwgIlgiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiLCAiWCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRPYmplY3RBcnJheUludE9iamVjdF9aZXJvKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCAiWCIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWCIsICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE9iamVjdEFycmF5SW50T2JqZWN0X0V4Y2VwdGlvbigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzMsICJYIik7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZCh0aGlzLmJ1aWxkQ2hhckFycmF5KCksICdkJyk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyKCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsICdYJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnWCcpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ1gnLCAnYycsICdkJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENoYXJBcnJheUludENoYXJfWmVybygpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCAnWCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnYScsICdiJywgJ2MnLCAnZCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDaGFyQXJyYXlJbnRDaGFyX0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0LCAnWCcpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnWCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkKHRoaXMuYnVpbGRJbnRBcnJheSgpLCAzMCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludF9FbXB0eSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAzMCk7Ci0JCWFzc2VydEVxdWFscygxLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMzAgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDIsIDk5KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgMywgNCB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludEFycmF5SW50SW50X1plcm8oKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAwLCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgOTksIDEsIDIsIDMsIDQgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnRBcnJheUludEludF9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA0LCA5OSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA5OSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMSwgMiwgMywgNCwgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGMpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludENvbGxlY3Rpb25fU3RyaW5nX0VuZCgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAzLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBjKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUFycmF5X0V4Y2VwdGlvbigpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMywgYyk7Ci0JCQlmYWlsKCJib2d1cyBhcnJheTogIiArIEFycmF5cy50b1N0cmluZyhuZXdBcnJheSkpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50Q29sbGVjdGlvbl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgYyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVfRW1wdHlBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMSwgaXRlcmFibGUpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhYmxlSW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgaXRlcmFibGUsIDMpOwotCi0JCWFzc2VydEVxdWFscygzLCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50SXRlcmFibGVJbnRfRW1wdHlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhYmxlLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9yX0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvcl9FbXB0eUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvckludF9TdHJpbmcoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludEl0ZXJhdG9ySW50X0VtcHR5QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmFibGUsIDMzKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9yX1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZ1tdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYSwgaXRlcmF0b3IpOwotCi0JCWFzc2VydEVxdWFscyg2LCBuZXdBcnJheS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SXRlcmF0b3JfT2JqZWN0KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvcik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUl0ZXJhdG9ySW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhLCBpdGVyYXRvciwgMyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgdGhpcy5idWlsZE9iamVjdExpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIGl0ZXJhdG9yLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYTEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCU9iamVjdFtdIGEyID0gdGhpcy5idWlsZE9iamVjdEFycmF5MigpOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYTEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVN0cmluZ1tdIGEyID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MigpOwotCQlTdHJpbmdbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgKE9iamVjdFtdKSBhMSkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwobmV3QXJyYXksIChPYmplY3RbXSkgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PYmplY3RTdHJpbmcoKSB7Ci0JCU9iamVjdFtdIGExID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTIoKTsKLQkJT2JqZWN0W10gbmV3QXJyYXkgPSBBcnJheVRvb2xzLmFkZEFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCAoT2JqZWN0W10pIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IE9iamVjdFswXTsKLQkJT2JqZWN0W10gYTIgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCk7Ci0JCU9iamVjdFtdIG5ld0FycmF5ID0gQXJyYXlUb29scy5hZGRBbGwoYTEsIGEyKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbmV3QXJyYXkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKG5ld0FycmF5LCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlPYmplY3RbXSBhMSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0WzBdOwotCQlPYmplY3RbXSBuZXdBcnJheSA9IEFycmF5VG9vbHMuYWRkQWxsKGExLCBhMik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG5ld0FycmF5Lmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChuZXdBcnJheSwgYTEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiWCIsICJYIiwgIlgiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X09iamVjdFN0cmluZygpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgIlgiLCAiWCIsICJYIiwgImMiLCAiZCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X0VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiLCAiZCIsICJYIiwgIlgiLCAiWCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxPYmplY3RBcnJheUludE9iamVjdEFycmF5X1plcm8oKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsT2JqZWN0QXJyYXlJbnRPYmplY3RBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgNCwgKE9iamVjdFtdKSBuZXcgU3RyaW5nWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJhIiwgImIiLCAiYyIsICJkIiB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbE9iamVjdEFycmF5SW50T2JqZWN0QXJyYXlfRW1wdHlBcnJheTEoKSB7Ci0JCU9iamVjdFtdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMCwgbmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNCwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgImEiLCAiYiIsICJjIiwgImQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5QXJyYXkyKCkgewotCQljaGFyW10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgbmV3IGNoYXJbMF0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDaGFyQXJyYXlDaGFyQXJyYXlFbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBBcnJheVRvb2xzLmFkZEFsbChuZXcgY2hhclswXSwgbmV3IGNoYXJbXSB7ICdkJywgJ2UnIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDIsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdYJywgJ1gnLCAnWCcsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ2hhckFycmF5SW50Q2hhckFycmF5X0VuZCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCBuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdYJykpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkQWxsKGEsIDAsIG5ldyBjaGFyW10geyAnWCcsICdYJywgJ1gnIH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ1gnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1gnLCAnWCcsICdYJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENoYXJBcnJheUludENoYXJBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAyLCBuZXcgY2hhclswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50W10geyAzMCwgNDAgfSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MigpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKHRoaXMuYnVpbGRJbnRBcnJheSgpLCBuZXcgaW50WzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IEFycmF5VG9vbHMuYWRkQWxsKG5ldyBpbnRbMF0sIG5ldyBpbnRbXSB7IDMwLCA0MCB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA0MCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGludFtdIHsgOTksIDk5LCA5OSB9KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDk5KSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCA5OSwgOTksIDk5LCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbmQoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyAxLCAyLCAzLCA0IH07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCA0LCBuZXcgaW50W10geyA5OSwgOTksIDk5IH0pOwotCQlhc3NlcnRFcXVhbHMoNywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDEsIDIsIDMsIDQsIDk5LCA5OSwgOTkgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRBcnJheUludEludEFycmF5X0VtcHR5QXJyYXkyKCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgMSwgMiwgMywgNCB9OwotCQlhID0gQXJyYXlUb29scy5hZGRBbGwoYSwgMiwgbmV3IGludFswXSk7Ci0JCWFzc2VydEVxdWFscyg0LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAyLCAzLCA0IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsSW50QXJyYXlJbnRJbnRBcnJheV9FbXB0eUFycmF5MSgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbMF07Ci0JCWEgPSBBcnJheVRvb2xzLmFkZEFsbChhLCAwLCBuZXcgaW50W10geyA5OSwgOTksIDk5IH0pOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgOTkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDk5LCA5OSwgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMuY2xlYXIoYSk7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5jbGVhcihhKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uY2F0ZW5hdGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlT2JqZWN0QXJyYXlBcnJheSgpIHsKLQkJU3RyaW5nW10gYUFycmF5ID0gbmV3IFN0cmluZ1tdIHsgImEiLCAiYiIsICJjIiwgImQiIH07Ci0JCVN0cmluZ1tdIGVBcnJheSA9IG5ldyBTdHJpbmdbXSB7ICJlIiwgImYiLCAiZyIsICJoIiB9OwotCQlTdHJpbmdbXSBpQXJyYXkgPSBuZXcgU3RyaW5nW10geyAiaSIsICJqIiwgImsiLCAibCIgfTsKLQotCQlTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIgfTsKLQkJU3RyaW5nW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVPYmplY3RBcnJheUFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhQXJyYXkgPSBuZXcgU3RyaW5nW10geyAgfTsKLQkJU3RyaW5nW10gZUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gaUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQotCQlTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3R1YWwubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVDaGFyQXJyYXlBcnJheSgpIHsKLQkJY2hhcltdIGFBcnJheSA9IG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnLCAnZCcgfTsKLQkJY2hhcltdIGVBcnJheSA9IG5ldyBjaGFyW10geyAnZScsICdmJywgJ2cnLCAnaCcgfTsKLQkJY2hhcltdIGlBcnJheSA9IG5ldyBjaGFyW10geyAnaScsICdqJywgJ2snLCAnbCcgfTsKLQotCQljaGFyW10gZXhwZWN0ZWQgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnaycsICdsJyB9OwotCQljaGFyW10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVDaGFyQXJyYXlBcnJheV9FbXB0eSgpIHsKLQkJY2hhcltdIGFBcnJheSA9IG5ldyBjaGFyW10geyAgfTsKLQkJY2hhcltdIGVBcnJheSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gaUFycmF5ID0gbmV3IGNoYXJbMF07Ci0KLQkJY2hhcltdIGV4cGVjdGVkID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhY3R1YWwgPSBBcnJheVRvb2xzLmNvbmNhdGVuYXRlKGFBcnJheSwgZUFycmF5LCBpQXJyYXkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWN0dWFsLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmNhdGVuYXRlSW50QXJyYXlBcnJheSgpIHsKLQkJaW50W10gYUFycmF5ID0gbmV3IGludFtdIHsgJ2EnLCAnYicsICdjJywgJ2QnIH07Ci0JCWludFtdIGVBcnJheSA9IG5ldyBpbnRbXSB7ICdlJywgJ2YnLCAnZycsICdoJyB9OwotCQlpbnRbXSBpQXJyYXkgPSBuZXcgaW50W10geyAnaScsICdqJywgJ2snLCAnbCcgfTsKLQotCQlpbnRbXSBleHBlY3RlZCA9IG5ldyBpbnRbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcgfTsKLQkJaW50W10gYWN0dWFsID0gQXJyYXlUb29scy5jb25jYXRlbmF0ZShhQXJyYXksIGVBcnJheSwgaUFycmF5KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0ZW5hdGVJbnRBcnJheUFycmF5X0VtcHR5KCkgewotCQlpbnRbXSBhQXJyYXkgPSBuZXcgaW50W10geyAgfTsKLQkJaW50W10gZUFycmF5ID0gbmV3IGludFswXTsKLQkJaW50W10gaUFycmF5ID0gbmV3IGludFswXTsKLQotCQlpbnRbXSBleHBlY3RlZCA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGFjdHVhbCA9IEFycmF5VG9vbHMuY29uY2F0ZW5hdGUoYUFycmF5LCBlQXJyYXksIGlBcnJheSk7Ci0JCWFzc2VydEVxdWFscygwLCBhY3R1YWwubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIG51bGwpKTsKLQkJT2JqZWN0W10gYTIgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zT2JqZWN0QXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbMF07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQ2hhckFycmF5Q2hhcigpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnYScpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAneicpKTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5hZGQoYSwgJ3onKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCAneicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNDaGFyQXJyYXlPYmplY3RfRW1wdHlBcnJheSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCAnYScpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgMTApKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWlucyhhLCA1NSkpOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMuYWRkKGEsIDU1KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEyLCA1NSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0ludEFycmF5T2JqZWN0X0VtcHR5QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50WzBdOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdhJykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSwgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbE9iamVjdEFycmF5SXRlcmF0b3IoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZE9iamVjdEFycmF5MSgpLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRDaGFyQXJyYXkoKSwgdGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZENoYXJBcnJheSgpLCBuZXcgY2hhcltdIHsgJ3gnLCAneScgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgdGhpcy5idWlsZEludEFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkSW50QXJyYXkoKSwgbmV3IGludFtdIHsgNDQ0LCA4ODggfSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaWZmICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmRW5kKCkgewotCQlTdHJpbmcgYSA9ICJhIjsKLQkJU3RyaW5nIGIgPSAiYiI7Ci0JCVN0cmluZyBjID0gImMiOwotCQlTdHJpbmcgZCA9ICJkIjsKLQkJU3RyaW5nIGUgPSAiZSI7Ci0JCVN0cmluZyBhXyA9IG5ldyBTdHJpbmcoImEiKTsKLQkJU3RyaW5nIGJfID0gbmV3IFN0cmluZygiYiIpOwotCQlTdHJpbmcgY18gPSBuZXcgU3RyaW5nKCJjIik7Ci0JCVN0cmluZyBkXyA9IG5ldyBTdHJpbmcoImQiKTsKLQkJU3RyaW5nIGVfID0gbmV3IFN0cmluZygiZSIpOwotCQlhc3NlcnRUcnVlKChhICE9IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiICE9IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkICE9IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlICE9IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuZGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5kaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1swXTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCA0KSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGJfLCBjXywgYV8sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDIpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgwLCAwKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjXykpOwotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY19fLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuZGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgyLCAyKSwgQXJyYXlUb29scy5kaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoNSwgLTEpLCBBcnJheVRvb2xzLmRpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gbmV3IFN0cmluZygiYSIpOwotCQlTdHJpbmcgYl8gPSBuZXcgU3RyaW5nKCJiIik7Ci0JCVN0cmluZyBjXyA9IG5ldyBTdHJpbmcoImMiKTsKLQkJU3RyaW5nIGRfID0gbmV3IFN0cmluZygiZCIpOwotCQlTdHJpbmcgZV8gPSBuZXcgU3RyaW5nKCJlIik7Ci0JCWFzc2VydFRydWUoKGEgIT0gYV8pICYmIGEuZXF1YWxzKGFfKSk7Ci0JCWFzc2VydFRydWUoKGIgIT0gYl8pICYmIGIuZXF1YWxzKGJfKSk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFzc2VydFRydWUoKGQgIT0gZF8pICYmIGQuZXF1YWxzKGRfKSk7Ci0JCWFzc2VydFRydWUoKGUgIT0gZV8pICYmIGUuZXF1YWxzKGVfKSk7Ci0JCVN0cmluZ1tdIGFycmF5MTsKLQkJU3RyaW5nW10gYXJyYXkyOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgZV8sIGNfLCBkXyB9OwotCQlhc3NlcnRFcXVhbHMoMiwgQXJyYXlUb29scy5kaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJU3RyaW5nIGNfXyA9IG5ldyBTdHJpbmcoYyk7Ci0JCWFzc2VydFRydWUoKGMgIT0gY19fKSAmJiBjLmVxdWFscyhjX18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmRpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuZGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aXR5IGRpZmYgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZkVuZCgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXyB9OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoNCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGFfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmRW5kKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZFbmQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZkVuZChhcnJheTEsIGFycmF5MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZSgpIHsKLQkJU3RyaW5nIGEgPSAiYSI7Ci0JCVN0cmluZyBiID0gImIiOwotCQlTdHJpbmcgYyA9ICJjIjsKLQkJU3RyaW5nIGQgPSAiZCI7Ci0JCVN0cmluZyBlID0gImUiOwotCQlTdHJpbmcgYV8gPSBhOwotCQlTdHJpbmcgYl8gPSBiOwotCQlTdHJpbmcgY18gPSBjOwotCQlTdHJpbmcgZF8gPSBkOwotCQlTdHJpbmcgZV8gPSBlOwotCQlhc3NlcnRUcnVlKChhID09IGFfKSAmJiBhLmVxdWFscyhhXykpOwotCQlhc3NlcnRUcnVlKChiID09IGJfKSAmJiBiLmVxdWFscyhiXykpOwotCQlhc3NlcnRUcnVlKChjID09IGNfKSAmJiBjLmVxdWFscyhjXykpOwotCQlhc3NlcnRUcnVlKChkID09IGRfKSAmJiBkLmVxdWFscyhkXykpOwotCQlhc3NlcnRUcnVlKChlID09IGVfKSAmJiBlLmVxdWFscyhlXykpOwotCQlTdHJpbmdbXSBhcnJheTE7Ci0JCVN0cmluZ1tdIGFycmF5MjsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDUsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgxLCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBiXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIDQpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgNCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nWzBdOwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDAsIC0xKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYl8sIGNfLCBhXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMiksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMCwgMCksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgMyksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlTdHJpbmcgY19fID0gbmV3IFN0cmluZyhjKTsKLQkJYXNzZXJ0VHJ1ZSgoYyAhPSBjX18pICYmIGMuZXF1YWxzKGNfKSk7Ci0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIGMsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjX18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMobmV3IFJhbmdlKDIsIDIpLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlJhbmdlKGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSgyLCAyKSwgQXJyYXlUb29scy5pZGVudGl0eURpZmZSYW5nZShhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbXSB7IGEsIGIsIG51bGwsIGQsIGUgfTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBudWxsLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBSYW5nZSg1LCAtMSksIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmU3RhcnQoKSB7Ci0JCVN0cmluZyBhID0gImEiOwotCQlTdHJpbmcgYiA9ICJiIjsKLQkJU3RyaW5nIGMgPSAiYyI7Ci0JCVN0cmluZyBkID0gImQiOwotCQlTdHJpbmcgZSA9ICJlIjsKLQkJU3RyaW5nIGFfID0gYTsKLQkJU3RyaW5nIGJfID0gYjsKLQkJU3RyaW5nIGNfID0gYzsKLQkJU3RyaW5nIGRfID0gZDsKLQkJU3RyaW5nIGVfID0gZTsKLQkJYXNzZXJ0VHJ1ZSgoYSA9PSBhXykgJiYgYS5lcXVhbHMoYV8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYiA9PSBiXykgJiYgYi5lcXVhbHMoYl8pKTsKLQkJYXNzZXJ0VHJ1ZSgoYyA9PSBjXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXNzZXJ0VHJ1ZSgoZCA9PSBkXykgJiYgZC5lcXVhbHMoZF8pKTsKLQkJYXNzZXJ0VHJ1ZSgoZSA9PSBlXykgJiYgZS5lcXVhbHMoZV8pKTsKLQkJU3RyaW5nW10gYXJyYXkxOwotCQlTdHJpbmdbXSBhcnJheTI7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfIH07Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscyg0LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1swXTsKLQkJYXJyYXkyID0gbmV3IFN0cmluZ1tdIHsgYV8sIGJfLCBjXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCWFycmF5MSA9IG5ldyBTdHJpbmdbMF07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGVfLCBjXywgZF8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBjLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgY18sIGRfIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgY18sIGRfLCBlXyB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pZGVudGl0eURpZmZTdGFydChhcnJheTEsIGFycmF5MikpOwotCi0JCVN0cmluZyBjX18gPSBuZXcgU3RyaW5nKGMpOwotCQlhc3NlcnRUcnVlKChjICE9IGNfXykgJiYgYy5lcXVhbHMoY18pKTsKLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgYywgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfXywgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0KLQkJYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgYSwgYiwgbnVsbCwgZCwgZSB9OwotCQlhcnJheTIgPSBuZXcgU3RyaW5nW10geyBhXywgYl8sIGNfLCBkXywgZV8gfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaWRlbnRpdHlEaWZmU3RhcnQoYXJyYXkxLCBhcnJheTIpKTsKLQotCQlhcnJheTEgPSBuZXcgU3RyaW5nW10geyBhLCBiLCBudWxsLCBkLCBlIH07Ci0JCWFycmF5MiA9IG5ldyBTdHJpbmdbXSB7IGFfLCBiXywgbnVsbCwgZF8sIGVfIH07Ci0JCWFzc2VydEVxdWFscyg1LCBBcnJheVRvb2xzLmlkZW50aXR5RGlmZlN0YXJ0KGFycmF5MSwgYXJyYXkyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVsZW1lbnRzIGFyZSBpZGVudGljYWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJT2JqZWN0W10gYTEgPSBuZXcgT2JqZWN0WzRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlhMVtpXSA9IFN0cmluZy52YWx1ZU9mKGkgKiAxMDAwKTsKLQkJfQotCi0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFthMS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGEyLmxlbmd0aDsgaSsrKSB7Ci0JCQlhMltpXSA9IGExW2ldOwotCQl9Ci0KLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGExLCBhMikpOwotCQlhMlsyXSA9ICIyMDAwIjsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUlkZW50aWNhbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfQm90aE51bGwoKSB7Ci0JCU9iamVjdFtdIGExID0gbnVsbDsKLQkJT2JqZWN0W10gYTIgPSBudWxsOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9PbmVOdWxsKCkgewotCQlPYmplY3RbXSBhMSA9IG51bGw7Ci0JCU9iamVjdFtdIGEyID0gbmV3IE9iamVjdFswXTsKLQkJYXNzZXJ0RmFsc2UoQXJyYXlUb29scy5lbGVtZW50c0FyZUlkZW50aWNhbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxPYmplY3RBcnJheU9iamVjdEFycmF5X0RpZmZlcmVudExlbmd0aHMoKSB7Ci0JCU9iamVjdFtdIGExID0gbmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciJ9OwotCQlPYmplY3RbXSBhMiA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X05vdEZvdW5kKCkgewotCQlPYmplY3RbXSBhID0gdGhpcy5idWlsZE9iamVjdEFycmF5MSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAidHdlbnR5IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eUluZGV4T2ZPYmplY3RBcnJheU9iamVjdCgpIHsKLQkJU3RyaW5nIGZvbyA9ICJmb28iOwotCQlTdHJpbmcgYmFyID0gImJhciI7Ci0JCVN0cmluZyBiYXogPSAiYmF6IjsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbM107Ci0JCWFbMF0gPSBmb287Ci0JCWFbMV0gPSBiYXI7Ci0JCWFbMl0gPSBiYXo7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmlkZW50aXR5SW5kZXhPZihhLCBiYXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTm90Rm91bmQoKSB7Ci0JCVN0cmluZyBmb28gPSAiZm9vIjsKLQkJU3RyaW5nIGJhciA9ICJiYXIiOwotCQlTdHJpbmcgYmF6ID0gImJheiI7Ci0JCU9iamVjdFtdIGEgPSBuZXcgT2JqZWN0WzNdOwotCQlhWzBdID0gZm9vOwotCQlhWzFdID0gYmFyOwotCQlhWzJdID0gYmF6OwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaWRlbnRpdHlJbmRleE9mKGEsIG5ldyBTdHJpbmcoImJhciIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAnYicpKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyhhLmxlbmd0aCAtIDEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAnZCcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYXJBcnJheUNoYXJfTm90Rm91bmQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAneicpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmluZGV4T2YoYSwgMTApKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5pbmRleE9mKGEsIDMwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4T2ZJbnRBcnJheUludF9Ob3RGb3VuZCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMuaW5kZXhPZihhLCAxMDAwKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZk9iamVjdEFycmF5Q29tcGFyYWJsZSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfTsKLQkJYXNzZXJ0RXF1YWxzKDQsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoNiwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkIiLCAiQyIsICJEIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIikpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH07Ci0JCWFzc2VydEVxdWFscygyLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZPYmplY3RBcnJheU9iamVjdENvbXBhcmF0b3IoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDIsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscygzLCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkIiLCBjKSk7Ci0KLQkJYSA9IG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfTsKLQkJYXNzZXJ0RXF1YWxzKDUsIEFycmF5VG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihhLCAiQiIsIGMpKTsKLQotCQlhID0gbmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9OwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJFIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiB9OwotCQlhc3NlcnRFcXVhbHMoNSwgQXJyYXlUb29scy5pbnNlcnRpb25JbmRleE9mKGEsICJBIiwgYykpOwotCi0JCWEgPSBuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH07Ci0JCWFzc2VydEVxdWFscyg2LCBBcnJheVRvb2xzLmluc2VydGlvbkluZGV4T2YoYSwgIkEiLCBjKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICJvbmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTm90Rm91bmQoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAidHdlbnR5IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdEFycmF5T2JqZWN0X051bGwoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mT2JqZWN0QXJyYXlPYmplY3RfTnVsbF9Ob3RGb3VuZCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgJ2InKSk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoYS5sZW5ndGggLSAxLCBBcnJheVRvb2xzLmxhc3RJbmRleE9mKGEsICdkJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkNoYXJBcnJheUNoYXJfTm90Rm91bmQoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoLTEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgJ3onKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEFycmF5VG9vbHMubGFzdEluZGV4T2YoYSwgMTApKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIDMwKTsKLQkJYXNzZXJ0RXF1YWxzKGEubGVuZ3RoIC0gMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAzMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZkludEFycmF5SW50X05vdEZvdW5kKCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQXJyYXlUb29scy5sYXN0SW5kZXhPZihhLCAxMDAwKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pbi9tYXggKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE1pbkNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgQXJyYXlUb29scy5taW4odGhpcy5idWlsZENoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkNoYXJBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyWzBdOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljaGFyIGMgPSBBcnJheVRvb2xzLm1pbihhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBjaGFyOiAiICsgYyk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWluSW50QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBBcnJheVRvb2xzLm1pbih0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaW5JbnRBcnJheV9FeGNlcHRpb24oKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaW50IGkgPSBBcnJheVRvb2xzLm1pbihhcnJheSk7Ci0JCQlmYWlsKCJib2d1cyBpbnQ6ICIgKyBpKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXkxKCkgewotCQlhc3NlcnRFcXVhbHMoJ2MnLCBBcnJheVRvb2xzLm1heCh0aGlzLmJ1aWxkQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4Q2hhckFycmF5MigpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICd4JywgJ2EnLCAnYicsICdjJyB9OwotCQlhc3NlcnRFcXVhbHMoJ3gnLCBBcnJheVRvb2xzLm1heChhcnJheSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhDaGFyQXJyYXlfRXhjZXB0aW9uKCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhclswXTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY2hhciBjID0gQXJyYXlUb29scy5tYXgoYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgY2hhcjogIiArIGMpOwotCQl9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1heEludEFycmF5MSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBBcnJheVRvb2xzLm1heCh0aGlzLmJ1aWxkSW50QXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXhJbnRBcnJheTIoKSB7Ci0JCWludFtdIGFycmF5ID0gbmV3IGludFtdIHsgNzcsIDMsIDEsIC0zIH07Ci0JCWFzc2VydEVxdWFscyg3NywgQXJyYXlUb29scy5tYXgoYXJyYXkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4SW50QXJyYXlfRXhjZXB0aW9uKCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbMF07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWludCBpID0gQXJyYXlUb29scy5tYXgoYXJyYXkpOwotCQkJZmFpbCgiYm9ndXMgaW50OiAiICsgaSk7Ci0JCX0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbW92ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU9iamVjdEFycmF5SW50SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIgfTsKLQotCQlTdHJpbmdbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIxIiwgIjMiLCAiNCIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMyIsICIyIiwgIjQiLCAiNSIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMSwgMywgNCwgMiwgNSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludEFycmF5SW50SW50SW50KCkgewotCQlpbnRbXSBhcnJheSA9IG5ldyBpbnRbXSB7IDAsIDEsIDIsIDMsIDQsIDUgfTsKLQotCQlpbnRbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMSwgMywgNCwgMiwgNSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMSwgMywgNCwgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgNCwgMSwgMywgMiB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMCwgMywgMiwgNCwgNSwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNSwgMCwgMywgMiwgNCwgMSB9LCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUNoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKLQotCQljaGFyW10gcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdiJywgJ2QnLCAnZScsICdjJywgJ2YnIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMCwgNSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2YnLCAnYScsICdiJywgJ2QnLCAnZScsICdjJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdmJywgJ2EnLCAnZScsICdiJywgJ2QnLCAnYycgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZicsICdhJywgJ2UnLCAnYicsICdkJywgJ2MnIH0sIHJlc3VsdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ2hhckFycmF5SW50SW50SW50KCkgewotCQljaGFyW10gYXJyYXkgPSBuZXcgY2hhcltdIHsgJ2EnLCAnYicsICdiJywgJ2MnLCAnZCcsICdlJyB9OwotCi0JCWNoYXJbXSByZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDQsIDIsIDEpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycsICdkJywgJ2InLCAnZScgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCA1LCAxKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2InLCAnYycsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMiwgNCwgMSk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdkJywgJ2InLCAnYycsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDIsIDQsIDIpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAwLCAxLCA0KTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnYScsICdjJywgJ2InLCAnZCcsICdlJywgJ2InIH0sIHJlc3VsdCkpOwotCi0JCXJlc3VsdCA9IEFycmF5VG9vbHMubW92ZShhcnJheSwgMSwgMCwgNCk7Ci0JCWFzc2VydFNhbWUoYXJyYXksIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ2UnLCAnYScsICdjJywgJ2InLCAnZCcsICdiJyB9LCByZXN1bHQpKTsKLQotCQlyZXN1bHQgPSBBcnJheVRvb2xzLm1vdmUoYXJyYXksIDEsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGFycmF5LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGNoYXJbXSB7ICdlJywgJ2EnLCAnYycsICdiJywgJ2QnLCAnYicgfSwgcmVzdWx0KSk7Ci0KLQkJcmVzdWx0ID0gQXJyYXlUb29scy5tb3ZlKGFycmF5LCAxLCAwLCAwKTsKLQkJYXNzZXJ0U2FtZShhcnJheSwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnZScsICdhJywgJ2MnLCAnYicsICdkJywgJ2InIH0sIHJlc3VsdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9iamVjdEFycmF5T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU9iamVjdEFycmF5T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJ0aHJlZSIpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZvdXIiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2QnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdlJyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZicpOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZCcpKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlKGEsICdkJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWFzc2VydEZhbHNlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgJ2QnKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAnZScpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICdmJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgMzApOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNDApOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgNTApOwotCi0JCWFzc2VydEVxdWFscyg2LCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAzMCkpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmUoYSwgMzApOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhc3NlcnRGYWxzZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIDMwKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCA0MCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgNTApKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgKE9iamVjdFtdKSBhMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheU9iamVjdEFycmF5X05vTWF0Y2hlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEyID0gbmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCAoT2JqZWN0W10pIGEyKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRiIsICJGIiB9LCBhMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPYmplY3RBcnJheUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8Pz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBpdGVyYWJsZS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JfRW1wdHkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnQoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTw/PiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIgfSk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGl0ZXJhYmxlLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkYiLCAiRiIgfSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJGIiwgIkYiIH0sIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGNvbGxlY3Rpb24pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9FbXB0eUFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9iamVjdEFycmF5Q29sbGVjdGlvbl9Ob01hdGNoZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlDb2xsZWN0aW9uPFN0cmluZz4gY29sbGVjdGlvbiA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWSIsICJaIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5KCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQScsICdCJywgJ0InLCAnQycsICdDJywgJ0QnLCAnRCcsICdFJywgJ0UnLCAnRicsICdGJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBjaGFyW10geyAnQScsICdBJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRicsICdGJyB9LCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eTEoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENoYXJBcnJheUNoYXJBcnJheV9FbXB0eTIoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnRScsICdGJywgJ0YnIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ2hhckFycmF5Q2hhckFycmF5X05vTWF0Y2hlcygpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdYJywgJ1onIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyAxLCAxLCAzLCAzLCA0LCA0LCA2LCA2IH0sIEFycmF5VG9vbHMucmVtb3ZlQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eTEoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZW1vdmVBbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxJbnRBcnJheUludEFycmF5X0VtcHR5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2IH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbEludEFycmF5SW50QXJyYXlfTm9NYXRjaGVzKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYgfTsKLQkJaW50W10gYTIgPSBuZXcgaW50W10geyA1MiwgNjcgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBBcnJheVRvb2xzLnJlbW92ZUFsbChhMSwgYTIpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBhbGwgb2NjdXJyZW5jZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAidHdvIik7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0d28iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgImZpdmUiKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICJmaXZlIik7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCBudWxsKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsIG51bGwpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPYmplY3RBcnJheU9iamVjdF9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMF07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICJ0aHJlZSIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheUNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnZCcpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYicpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCAnYicpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCAnZycpOwotCQlhID0gQXJyYXlUb29scy5hZGQoYSwgJ2cnKTsKLQkJYSA9IEFycmF5VG9vbHMuYWRkKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsICdnJyk7Ci0JCWFzc2VydEVxdWFscygyLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5Q2hhcl9FbXB0eSgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhclswXTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgJ2EnKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYS5sZW5ndGgpOwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhhLCA1NSk7Ci0JCWFzc2VydEVxdWFscygzLCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDEwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMTApOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCi0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWEgPSBBcnJheVRvb2xzLmFkZChhLCA3Nyk7Ci0JCWFzc2VydEVxdWFscyg1LCBhLmxlbmd0aCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGEsIDc3KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGEubGVuZ3RoKTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgNzcpOwotCQlhc3NlcnRFcXVhbHMoMiwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc0ludEFycmF5SW50X0VtcHR5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFswXTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYSwgMjIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFycmF5W2krK10pOwotCQlhc3NlcnRFcXVhbHMoaSwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJU3RyaW5nW10gYXJyYXkgPSBBcnJheVRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKG5ldyBTdHJpbmdbMF0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNPYmplY3RBcnJheV9TaW5nbGVFbGVtZW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IEFycmF5VG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobmV3IFN0cmluZ1tdIHsgImZvbyIgfSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c09iamVjdEFycmF5X05vRHVwbGljYXRlcygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vIiwgImJhciIsICJiYXoiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhhMSk7Ci0JCWFzc2VydEVxdWFscygzLCBhMi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSBlbGVtZW50IGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleE9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50QXRJbmRleChhLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudEF0SW5kZXhDaGFyQXJyYXlJbnQoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudEF0SW5kZXgoYSwgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0EnLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50QXRJbmRleEludEFycmF5SW50KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhLCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVGaXJzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlyc3RDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRmlyc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdEludEFycmF5KCkgewotCQlpbnRbXSBhID0gbmV3IGludFtdIHsgOCwgNiwgNywgMzMsIDIsIDExIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUZpcnN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgNiwgNywgMzMsIDIsIDExIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTGFzdE9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVMYXN0KGEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2hhckFycmF5KCkgewotCQljaGFyW10gYSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlbW92ZUxhc3QoYSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0SW50QXJyYXkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlTGFzdChhKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyIH0sIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhPYmplY3RBcnJheUludEludCgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDMsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4T2JqZWN0QXJyYXlJbnRJbnRfWmVyb0xlbmd0aCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiQyIsICJBIiwgIkQiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYTEsIDMsIDApOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleE9iamVjdEFycmF5SW50SW50X0VtcHR5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJBIiwgIkMiLCAiQSIsICJEIiB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNik7Ci0JCWFzc2VydEVxdWFscygwLCBhLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVsZW1lbnRzQXRJbmRleENoYXJBcnJheUludEludCgpIHsKLQkJY2hhcltdIGEgPSBuZXcgY2hhcltdIHsgJ0EnLCAnQicsICdBJywgJ0MnLCAnQScsICdEJyB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMCwgNSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0QnIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4Q2hhckFycmF5SW50SW50X1plcm9MZW5ndGgoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnQScsICdCJywgJ0EnLCAnQycsICdBJywgJ0QnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGExLCAzLCAwKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhDaGFyQXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDgsIDYsIDcsIDMzLCAyLCAxMSB9OwotCQlhID0gQXJyYXlUb29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgoYSwgMywgMyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgaW50W10geyA4LCA2LCA3IH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4SW50QXJyYXlJbnRJbnRfWmVyb0xlbmd0aCgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChhMSwgMywgMCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxlbWVudHNBdEluZGV4SW50QXJyYXlJbnRJbnRfRW1wdHkoKSB7Ci0JCWludFtdIGEgPSBuZXcgaW50W10geyA4LCA2LCA3LCAzMywgMiwgMTEgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGEsIDAsIDYpOwotCQlhc3NlcnRFcXVhbHMoMCwgYS5sZW5ndGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXBsYWNlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X09iamVjdCgpIHsKLQkJT2JqZWN0W10gYSA9IG5ldyBPYmplY3RbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAiQSIsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X1N0cmluZygpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAiQSIsICJaIik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiWiIsICJCIiwgIloiLCAiQyIsICJaIiwgIkQiIH0sIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUFsbE9iamVjdEFycmF5T2JqZWN0T2JqZWN0X051bGwoKSB7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyBudWxsLCAiQiIsIG51bGwsICJDIiwgbnVsbCwgIkQiIH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgbnVsbCwgIloiKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJaIiwgIkIiLCAiWiIsICJDIiwgIloiLCAiRCIgfSwgYSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsQ2hhckFycmF5Q2hhckNoYXIoKSB7Ci0JCWNoYXJbXSBhID0gbmV3IGNoYXJbXSB7ICdBJywgJ0InLCAnQScsICdDJywgJ0EnLCAnRCcgfTsKLQkJYSA9IEFycmF5VG9vbHMucmVwbGFjZUFsbChhLCAnQScsICdaJyk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ1onLCAnQicsICdaJywgJ0MnLCAnWicsICdEJyB9LCBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VBbGxJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYSA9IG5ldyBpbnRbXSB7IDAsIDEsIDAsIDcsIDAsIDk5IH07Ci0JCWEgPSBBcnJheVRvb2xzLnJlcGxhY2VBbGwoYSwgMCwgMTMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsgMTMsIDEsIDEzLCA3LCAxMywgOTkgfSwgYSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXRhaW4gYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJT2JqZWN0W10gYTIgPSBuZXcgT2JqZWN0W10geyAiRSIsICJCIiwgbmV3IEludGVnZXIoNykgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5T2JqZWN0QXJyYXlfRW1wdHlPYmplY3RBcnJheTEoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlPYmplY3RBcnJheV9FbXB0eU9iamVjdEFycmF5MigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfTsKLQkJU3RyaW5nW10gYTIgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheU9iamVjdEFycmF5X0JvdGhFbXB0eSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGEzLmxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmFibGUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQiIsICJCIiwgIkUiLCAiRSIgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGl0ZXJhYmxlKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhYmxlSW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkUiLCAiQiIsICIiIH0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYWJsZSwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYWJsZUludF9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvcl9FbXB0eU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgIkEiLCAiQSIsICJCIiwgIkIiLCAiQyIsICJDIiwgIkQiLCAiRCIsICJFIiwgIkUiLCAiRiIsICJGIiB9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1swXSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkMiLCAiRCIsICJEIiwgIkUiLCAiRSIsICJGIiwgIkYiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJFIiwgIkUiIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBpdGVyYXRvciwgMykpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlJdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbMF0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDMpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbE9iamVjdEFycmF5SXRlcmF0b3JJbnRfRW1wdHlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRSIsICJCIiwgIiIgfSkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgaXRlcmF0b3IsIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYTMubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJCIiwgIkIiLCAiRSIsICJFIiB9LCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsT2JqZWN0QXJyYXlDb2xsZWN0aW9uX0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1swXTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJFIiwgIkIiLCAiIiB9KTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fRW1wdHlDb2xsZWN0aW9uKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJU3RyaW5nW10gYTMgPSBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgY29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygwLCBhMy5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxPYmplY3RBcnJheUNvbGxlY3Rpb25fQWxsKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbXSB7ICJBIiwgIkEiLCAiQiIsICJCIiwgIkMiLCAiQyIsICJEIiwgIkQiLCAiRSIsICJFIiwgIkYiLCAiRiIgfTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGNvbGxlY3Rpb24pKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdBJywgJ0EnLCAnQicsICdCJywgJ0MnLCAnQycsICdEJywgJ0QnLCAnRScsICdFJywgJ0YnLCAnRicgfTsKLQkJY2hhcltdIGEyID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgY2hhcltdIHsgJ0InLCAnQicsICdFJywgJ0UnIH0sIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5Q2hhckFycmF5MSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbMF07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyW10geyAnRScsICdCJyB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ2hhckFycmF5Q2hhckFycmF5X0VtcHR5Q2hhckFycmF5MigpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdFJywgJ0InIH07Ci0JCWNoYXJbXSBhMiA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRFcXVhbHMoMCwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDaGFyQXJyYXlDaGFyQXJyYXlfUmV0YWluQWxsKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicsICdFJywgJ0InLCAnRScsICdCJywgJ0UnLCAnQicsICdFJyB9OwotCQljaGFyW10gYTIgPSBuZXcgY2hhcltdIHsgJ0UnLCAnQicgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbEludEFycmF5SW50QXJyYXkoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7IDIsIDIsIDUsIDUgfSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxJbnRBcnJheUludEFycmF5X0VtcHR5SW50QXJyYXkxKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gbmV3IGludFtdIHsgNSwgMiB9OwotCQlhc3NlcnRTYW1lKGExLCBBcnJheVRvb2xzLnJldGFpbkFsbChhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9FbXB0eUludEFycmF5MigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA1LCAyIH07Ci0JCWludFtdIGEyID0gbmV3IGludFswXTsKLQkJYXNzZXJ0RXF1YWxzKDAsIEFycmF5VG9vbHMucmV0YWluQWxsKGExLCBhMikubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsSW50QXJyYXlJbnRBcnJheV9SZXRhaW5BbGwoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFtdIHsgNSwgMiwgNSwgMiwgNSwgMiwgNSwgMiwgNSwgMiwgNSB9OwotCQlpbnRbXSBhMiA9IG5ldyBpbnRbXSB7IDUsIDIgfTsKLQkJYXNzZXJ0U2FtZShhMSwgQXJyYXlUb29scy5yZXRhaW5BbGwoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldmVyc2UgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VPYmplY3RBcnJheV9PYmplY3QoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlT2JqZWN0QXJyYXlfU3RyaW5nKCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yZXZlcnNlKGEpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZU9iamVjdEFycmF5X1NpbmdsZXRvbigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucmV2ZXJzZShhMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUNoYXJBcnJheSgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2InLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdhJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VDaGFyQXJyYXlfU2luZ2xldG9uKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcltdIHsgJ2YnIH07Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMucmV2ZXJzZShhMSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhhMSwgYTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJldmVyc2UoYSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUludEFycmF5X1NpbmdsZXRvbigpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA3IH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yZXZlcnNlKGExKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGExLCBhMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByb3RhdGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheV9aZXJvKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5X09uZSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nW10geyAiZm9vICAiIH07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZU9iamVjdEFycmF5SW50KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygib25lIiwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9aZXJvRGlzdGFuY2UoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCAwKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9OZWdhdGl2ZURpc3RhbmNlKCkgewotCQlTdHJpbmdbXSBhMSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgLTEpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGEyWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBhMlsxXSk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGEyWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlT2JqZWN0QXJyYXlJbnRfWmVybygpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCA3KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVPYmplY3RBcnJheUludF9PbmUoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1tdIHsgImZvbyAgIiB9OwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExLCA4KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzFdKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheV9aZXJvKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhclswXTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheV9PbmUoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyW10geyAnYScgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludCgpIHsKLQkJY2hhcltdIGEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X1plcm9EaXN0YW5jZSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdhJywgJ2InLCAnYycgfTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDApOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUNoYXJBcnJheUludF9OZWdhdGl2ZURpc3RhbmNlKCkgewotCQljaGFyW10gYSA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYSA9IEFycmF5VG9vbHMucm90YXRlKGEsIC0xKTsKLQkJYXNzZXJ0RXF1YWxzKCdiJywgYVswXSk7Ci0JCWFzc2VydEVxdWFscygnYycsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X1plcm8oKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzBdOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMjAwMSk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlQ2hhckFycmF5SW50X09uZSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbXSB7ICdhJyB9OwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMjIpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5KCkgewotCQlpbnRbXSBhID0gdGhpcy5idWlsZEludEFycmF5KCk7Ci0JCWEgPSBBcnJheVRvb2xzLnJvdGF0ZShhKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheV9aZXJvKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbMF07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEpOwotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5X09uZSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50W10geyA3NyB9OwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMucm90YXRlKGExKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVJbnRBcnJheUludCgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgMik7Ci0JCWFzc2VydEVxdWFscygxMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygwLCBhWzJdKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfWmVyb0Rpc3RhbmNlKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDMsIDIsIDEgfTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMCk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfTmVnYXRpdmVEaXN0YW5jZSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5yb3RhdGUoYSwgLTEpOwotCQlhc3NlcnRFcXVhbHMoMTAsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoMjAsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdGF0ZUludEFycmF5SW50X1plcm8oKSB7Ci0JCWludFtdIGExID0gbmV3IGludFswXTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLnJvdGF0ZShhMSwgMyk7Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um90YXRlSW50QXJyYXlJbnRfT25lKCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbXSB7IDc3IH07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5yb3RhdGUoYTEsIDQ0KTsKLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaHVmZmxlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGFycmF5MSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyhhcnJheTEubGVuZ3RoLCBhcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zQWxsKGFycmF5MSwgKE9iamVjdFtdKSBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZU9iamVjdEFycmF5X1NpbmdsZXRvbigpIHsKLQkJU3RyaW5nW10gYXJyYXkxID0gbmV3IFN0cmluZ1tdIHsgImZvbyIgfTsKLQkJU3RyaW5nW10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKG5ldyBTdHJpbmdbXSB7ICJmb28iIH0pOwotCQlhc3NlcnRFcXVhbHMoYXJyYXkxLmxlbmd0aCwgYXJyYXkyLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWluc0FsbChhcnJheTEsIChPYmplY3RbXSkgYXJyYXkyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNodWZmbGVDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUodGhpcy5idWlsZENoYXJBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUNoYXJBcnJheV9TaW5nbGV0b24oKSB7Ci0JCWNoYXJbXSBhcnJheTEgPSBuZXcgY2hhcltdIHsgJ2YnIH07Ci0JCWNoYXJbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUobmV3IGNoYXJbXSB7ICdmJyB9KTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUludEFycmF5KCkgewotCQlpbnRbXSBhcnJheTEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJaW50W10gYXJyYXkyID0gQXJyYXlUb29scy5zaHVmZmxlKHRoaXMuYnVpbGRJbnRBcnJheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUludEFycmF5X1NpbmdsZXRvbigpIHsKLQkJaW50W10gYXJyYXkxID0gbmV3IGludFtdIHsgNyB9OwotCQlpbnRbXSBhcnJheTIgPSBBcnJheVRvb2xzLnNodWZmbGUobmV3IGludFtdIHsgNyB9KTsKLQkJYXNzZXJ0RXF1YWxzKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnNBbGwoYXJyYXkxLCBhcnJheTIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3ViLWFycmF5ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJBcnJheU9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhcnJheSA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6IiwgImpvbyIsICJqYXIiLCAiamF6In07Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6IiwgImpvbyJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbXSB7ImphciJ9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBTdHJpbmdbMF07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDUsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IFN0cmluZ1tdIHsiam9vIiwgImphciIsICJqYXoifTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMywgNikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlJbnRBcnJheUludEludCgpIHsKLQkJaW50W10gYXJyYXkgPSBuZXcgaW50W10gezc3LCA5OSwgMzMzLCA0LCA5MDkwLCA0Mn07Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbXSB7NzcsIDk5LCAzMzMsIDR9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAwLCA0KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBpbnRbXSB7OTA5MH07Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIEFycmF5VG9vbHMuc3ViQXJyYXkoYXJyYXksIDQsIDUpKSk7Ci0KLQkJcmVzdWx0ID0gbmV3IGludFswXTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgNSwgNSkpKTsKLQotCQlyZXN1bHQgPSBuZXcgaW50W10gezQsIDkwOTAsIDQyfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMywgNikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViQXJyYXlDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhcnJheSA9IG5ldyBjaGFyW10geydhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZid9OwotCQljaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbXSB7J2EnLCAnYicsICdjJywgJ2QnfTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHJlc3VsdCwgQXJyYXlUb29scy5zdWJBcnJheShhcnJheSwgMCwgNCkpKTsKLQotCQlyZXN1bHQgPSBuZXcgY2hhcltdIHsnZSd9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA0LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyWzBdOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCA1LCA1KSkpOwotCi0JCXJlc3VsdCA9IG5ldyBjaGFyW10geydkJywgJ2UnLCAnZid9OwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMocmVzdWx0LCBBcnJheVRvb2xzLnN1YkFycmF5KGFycmF5LCAzLCA2KSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzd2FwICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWEgPSBBcnJheVRvb2xzLnN3YXAoYSwgMSwgMik7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGFbMF0pOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGFbMV0pOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwT2JqZWN0QXJyYXlfU2FtZUluZGljZXMoKSB7Ci0JCVN0cmluZ1tdIGExID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlTdHJpbmdbXSBhMiA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBDaGFyQXJyYXkoKSB7Ci0JCWNoYXJbXSBhID0gdGhpcy5idWlsZENoYXJBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoJ2EnLCBhWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKCdjJywgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygnYicsIGFbMl0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwQ2hhckFycmF5X1NhbWVJbmRpY2VzKCkgewotCQljaGFyW10gYTEgPSB0aGlzLmJ1aWxkQ2hhckFycmF5KCk7Ci0JCWNoYXJbXSBhMiA9IHRoaXMuYnVpbGRDaGFyQXJyYXkoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBJbnRBcnJheSgpIHsKLQkJaW50W10gYSA9IHRoaXMuYnVpbGRJbnRBcnJheSgpOwotCQlhID0gQXJyYXlUb29scy5zd2FwKGEsIDEsIDIpOwotCQlhc3NlcnRFcXVhbHMoMCwgYVswXSk7Ci0JCWFzc2VydEVxdWFscygyMCwgYVsxXSk7Ci0JCWFzc2VydEVxdWFscygxMCwgYVsyXSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBJbnRBcnJheV9TYW1lSW5kaWNlcygpIHsKLQkJaW50W10gYTEgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJaW50W10gYTIgPSB0aGlzLmJ1aWxkSW50QXJyYXkoKTsKLQkJYTEgPSBBcnJheVRvb2xzLnN3YXAoYTEsIDEsIDEpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYTEsIGEyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFycmF5cyBlbmhhbmNlbWVudHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxCb29sZWFuQXJyYXlCb29sZWFuKCkgewotCQlib29sZWFuW10gYTEgPSBuZXcgYm9vbGVhbls5XTsKLQkJYm9vbGVhbltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCB0cnVlKTsKLQkJZm9yIChib29sZWFuIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZSh4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxCb29sZWFuQXJyYXlJbnRJbnRCb29sZWFuKCkgewotCQlib29sZWFuW10gYTEgPSBuZXcgYm9vbGVhbls5XTsKLQkJYm9vbGVhbltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCBmYWxzZSk7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJYm9vbGVhbltdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgdHJ1ZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4geCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRGYWxzZSh4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZSh4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEJ5dGVBcnJheUJ5dGUoKSB7Ci0JCWJ5dGVbXSBhMSA9IG5ldyBieXRlWzldOwotCQlieXRlW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIChieXRlKSA3Nyk7Ci0JCWZvciAoYnl0ZSB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsQnl0ZUFycmF5SW50SW50Qnl0ZSgpIHsKLQkJYnl0ZVtdIGExID0gbmV3IGJ5dGVbOV07Ci0JCWJ5dGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKGJ5dGUpIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWJ5dGVbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIChieXRlKSA3Nyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWJ5dGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydEVxdWFscyg3NywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxDaGFyQXJyYXlDaGFyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcls5XTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAnYycpOwotCQlmb3IgKGNoYXIgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoJ2MnLCB4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxDaGFyQXJyYXlJbnRJbnRDaGFyKCkgewotCQljaGFyW10gYTEgPSBuZXcgY2hhcls5XTsKLQkJY2hhcltdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAnYScpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWNoYXJbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sICdjJyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoJ2EnLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCdjJywgeCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxEb3VibGVBcnJheURvdWJsZSgpIHsKLQkJZG91YmxlW10gYTEgPSBuZXcgZG91YmxlWzldOwotCQlkb3VibGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgNzcuNzcpOwotCQlmb3IgKGRvdWJsZSB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscyg3Ny43NywgeCwgMC4wKTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxEb3VibGVBcnJheUludEludERvdWJsZSgpIHsKLQkJZG91YmxlW10gYTEgPSBuZXcgZG91YmxlWzldOwotCQlkb3VibGVbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlkb3VibGVbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3Ljc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJZG91YmxlIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMuMywgeCwgMC4wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDc3Ljc3LCB4LCAwLjApOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsRmxvYXRBcnJheUZsb2F0KCkgewotCQlmbG9hdFtdIGExID0gbmV3IGZsb2F0WzldOwotCQlmbG9hdFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCA3Ny43N2YpOwotCQlmb3IgKGZsb2F0IHggOiBhMSkgewotCQkJYXNzZXJ0RXF1YWxzKDc3Ljc3ZiwgeCwgMC4wKTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxGbG9hdEFycmF5SW50SW50RmxvYXQoKSB7Ci0JCWZsb2F0W10gYTEgPSBuZXcgZmxvYXRbOV07Ci0JCWZsb2F0W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMuM2YpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWZsb2F0W10gYTMgPSBBcnJheVRvb2xzLmZpbGwoYTIsIGZyb20sIHRvLCA3Ny43N2YpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlmbG9hdCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLjNmLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcuNzdmLCB4LCAwLjApOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsSW50QXJyYXlJbnQoKSB7Ci0JCWludFtdIGExID0gbmV3IGludFs5XTsKLQkJaW50W10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDc3KTsKLQkJZm9yIChpbnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbEludEFycmF5SW50SW50SW50KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbOV07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlpbnRbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJaW50IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsT2JqZWN0QXJyYXlPYmplY3QoKSB7Ci0JCVN0cmluZ1tdIGExID0gbmV3IFN0cmluZ1s5XTsKLQkJU3RyaW5nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICI3NyIpOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydEVxdWFscygiNzciLCB4KTsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGxPYmplY3RBcnJheUludEludE9iamVjdCgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzldOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgIjMiKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlTdHJpbmdbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sICI3NyIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoIjMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCI3NyIsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxsTG9uZ0FycmF5TG9uZygpIHsKLQkJbG9uZ1tdIGExID0gbmV3IGxvbmdbOV07Ci0JCWxvbmdbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgNzcpOwotCQlmb3IgKGxvbmcgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbExvbmdBcnJheUludEludExvbmcoKSB7Ci0JCWxvbmdbXSBhMSA9IG5ldyBsb25nWzldOwotCQlsb25nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWxvbmdbXSBhMyA9IEFycmF5VG9vbHMuZmlsbChhMiwgZnJvbSwgdG8sIDc3KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJbG9uZyB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDc3LCB4KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbFNob3J0QXJyYXlTaG9ydCgpIHsKLQkJc2hvcnRbXSBhMSA9IG5ldyBzaG9ydFs5XTsKLQkJc2hvcnRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKHNob3J0KSA3Nyk7Ci0JCWZvciAoc2hvcnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbFNob3J0QXJyYXlJbnRJbnRTaG9ydCgpIHsKLQkJc2hvcnRbXSBhMSA9IG5ldyBzaG9ydFs5XTsKLQkJc2hvcnRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgKHNob3J0KSAzKTsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlzaG9ydFtdIGEzID0gQXJyYXlUb29scy5maWxsKGEyLCBmcm9tLCB0bywgKHNob3J0KSA3Nyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCXNob3J0IHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRFcXVhbHMoNzcsIHgpOwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0Qnl0ZUFycmF5KCkgewotCQlieXRlW10gYTEgPSBuZXcgYnl0ZVszXTsKLQkJYTFbMF0gPSAoYnl0ZSkgMzM7Ci0JCWExWzFdID0gKGJ5dGUpIDExOwotCQlhMVsyXSA9IChieXRlKSAyMjsKLQkJYnl0ZVtdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJYnl0ZSBsYXN0ID0gKGJ5dGUpIDA7Ci0JCWZvciAoYnl0ZSB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0Qnl0ZUFycmF5SW50SW50KCkgewotCQlieXRlW10gYTEgPSBuZXcgYnl0ZVs5XTsKLQkJYnl0ZVtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoYnl0ZSkgMyk7Ci0JCWEyWzNdID0gKGJ5dGUpIDMzOwotCQlhMls0XSA9IChieXRlKSAxMTsKLQkJYTJbNV0gPSAoYnl0ZSkgMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJYnl0ZVtdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWJ5dGUgbGFzdCA9IChieXRlKSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlieXRlIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydENoYXJBcnJheSgpIHsKLQkJY2hhcltdIGExID0gbmV3IGNoYXJbM107Ci0JCWExWzBdID0gJ3onOwotCQlhMVsxXSA9ICdiJzsKLQkJYTFbMl0gPSAnbSc7Ci0JCWNoYXJbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCWNoYXIgbGFzdCA9ICdhJzsKLQkJZm9yIChjaGFyIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRDaGFyQXJyYXlJbnRJbnQoKSB7Ci0JCWNoYXJbXSBhMSA9IG5ldyBjaGFyWzldOwotCQljaGFyW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsICdjJyk7Ci0JCWEyWzNdID0gJ3onOwotCQlhMls0XSA9ICdiJzsKLQkJYTJbNV0gPSAnbSc7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJY2hhcltdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCWNoYXIgbGFzdCA9ICdhJzsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJY2hhciB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygnYycsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydERvdWJsZUFycmF5KCkgewotCQlkb3VibGVbXSBhMSA9IG5ldyBkb3VibGVbM107Ci0JCWExWzBdID0gMzMuMzM7Ci0JCWExWzFdID0gMTEuMTE7Ci0JCWExWzJdID0gMjIuMjI7Ci0JCWRvdWJsZVtdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJZG91YmxlIGxhc3QgPSAwOwotCQlmb3IgKGRvdWJsZSB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RG91YmxlQXJyYXlJbnRJbnQoKSB7Ci0JCWRvdWJsZVtdIGExID0gbmV3IGRvdWJsZVs5XTsKLQkJZG91YmxlW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMuMyk7Ci0JCWEyWzNdID0gMzMuMzM7Ci0JCWEyWzRdID0gMTEuMTE7Ci0JCWEyWzVdID0gMjIuMjI7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJZG91YmxlW10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJZG91YmxlIGxhc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlkb3VibGUgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMy4zLCB4LCAwLjApOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEZsb2F0QXJyYXkoKSB7Ci0JCWZsb2F0W10gYTEgPSBuZXcgZmxvYXRbM107Ci0JCWExWzBdID0gMzMuMzNmOwotCQlhMVsxXSA9IDExLjExZjsKLQkJYTFbMl0gPSAyMi4yMmY7Ci0JCWZsb2F0W10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlmbG9hdCBsYXN0ID0gMDsKLQkJZm9yIChmbG9hdCB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJbGFzdCA9IHg7Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0RmxvYXRBcnJheUludEludCgpIHsKLQkJZmxvYXRbXSBhMSA9IG5ldyBmbG9hdFs5XTsKLQkJZmxvYXRbXSBhMiA9IEFycmF5VG9vbHMuZmlsbChhMSwgMy4zZik7Ci0JCWEyWzNdID0gMzMuMzNmOwotCQlhMls0XSA9IDExLjExZjsKLQkJYTJbNV0gPSAyMi4yMmY7Ci0JCWludCBmcm9tID0gMzsKLQkJaW50IHRvID0gNjsKLQkJZmxvYXRbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlmbG9hdCBsYXN0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJZmxvYXQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMy4zZiwgeCwgMC4wKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJbnRBcnJheSgpIHsKLQkJaW50W10gYTEgPSBuZXcgaW50WzNdOwotCQlhMVswXSA9IDMzOwotCQlhMVsxXSA9IDExOwotCQlhMVsyXSA9IDIyOwotCQlpbnRbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCWludCBsYXN0ID0gMDsKLQkJZm9yIChpbnQgeCA6IGExKSB7Ci0JCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydEludEFycmF5SW50SW50KCkgewotCQlpbnRbXSBhMSA9IG5ldyBpbnRbOV07Ci0JCWludFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAzKTsKLQkJYTJbM10gPSAzMzsKLQkJYTJbNF0gPSAxMTsKLQkJYTJbNV0gPSAyMjsKLQkJaW50IGZyb20gPSAzOwotCQlpbnQgdG8gPSA2OwotCQlpbnRbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlpbnQgbGFzdCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKLQkJCWludCB4ID0gYTFbaV07Ci0JCQlpZiAoaSA8IGZyb20gfHwgaSA+PSB0bykgewotCQkJCWFzc2VydEVxdWFscygzLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQkJbGFzdCA9IHg7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0U2FtZShhMSwgYTIpOwotCQlhc3NlcnRTYW1lKGExLCBhMyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzNdOwotCQlhMVswXSA9ICJ5IjsKLQkJYTFbMV0gPSAiYiI7Ci0JCWExWzJdID0gIm0iOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSk7Ci0JCVN0cmluZyBsYXN0ID0gImEiOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdC5jb21wYXJlVG8oeCkgPCAwKTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydE9iamVjdEFycmF5Q29tcGFyYXRvcigpIHsKLQkJU3RyaW5nW10gYTEgPSBuZXcgU3RyaW5nWzNdOwotCQlhMVswXSA9ICJ5IjsKLQkJYTFbMV0gPSAiYiI7Ci0JCWExWzJdID0gIm0iOwotCQlTdHJpbmdbXSBhMiA9IEFycmF5VG9vbHMuc29ydChhMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCVN0cmluZyBsYXN0ID0gInoiOwotCQlmb3IgKFN0cmluZyB4IDogYTEpIHsKLQkJCWFzc2VydFRydWUobGFzdC5jb21wYXJlVG8oeCkgPiAwKTsKLQkJCWxhc3QgPSB4OwotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydE9iamVjdEFycmF5SW50SW50KCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbOV07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAiYyIpOwotCQlhMlszXSA9ICJ5IjsKLQkJYTJbNF0gPSAiYiI7Ci0JCWEyWzVdID0gIm0iOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0byk7Ci0JCVN0cmluZyBsYXN0ID0gImEiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoImMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA8IDApOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0T2JqZWN0QXJyYXlJbnRJbnRDb21wYXJhdG9yKCkgewotCQlTdHJpbmdbXSBhMSA9IG5ldyBTdHJpbmdbOV07Ci0JCVN0cmluZ1tdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAiYyIpOwotCQlhMlszXSA9ICJ5IjsKLQkJYTJbNF0gPSAiYiI7Ci0JCWEyWzVdID0gIm0iOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCVN0cmluZ1tdIGEzID0gQXJyYXlUb29scy5zb3J0KGEyLCBmcm9tLCB0bywgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCVN0cmluZyBsYXN0ID0gInoiOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoImMiLCB4KTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0VHJ1ZShsYXN0LmNvbXBhcmVUbyh4KSA+IDApOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0TG9uZ0FycmF5KCkgewotCQlsb25nW10gYTEgPSBuZXcgbG9uZ1szXTsKLQkJYTFbMF0gPSAzMzsKLQkJYTFbMV0gPSAxMTsKLQkJYTFbMl0gPSAyMjsKLQkJbG9uZ1tdIGEyID0gQXJyYXlUb29scy5zb3J0KGExKTsKLQkJbG9uZyBsYXN0ID0gMDsKLQkJZm9yIChsb25nIHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRMb25nQXJyYXlJbnRJbnQoKSB7Ci0JCWxvbmdbXSBhMSA9IG5ldyBsb25nWzldOwotCQlsb25nW10gYTIgPSBBcnJheVRvb2xzLmZpbGwoYTEsIDMpOwotCQlhMlszXSA9IDMzOwotCQlhMls0XSA9IDExOwotCQlhMls1XSA9IDIyOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCWxvbmdbXSBhMyA9IEFycmF5VG9vbHMuc29ydChhMiwgZnJvbSwgdG8pOwotCQlsb25nIGxhc3QgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGExLmxlbmd0aDsgaSsrKSB7Ci0JCQlsb25nIHggPSBhMVtpXTsKLQkJCWlmIChpIDwgZnJvbSB8fCBpID49IHRvKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKDMsIHgpOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnRUcnVlKGxhc3QgPCB4KTsKLQkJCQlsYXN0ID0geDsKLQkJCX0KLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JCWFzc2VydFNhbWUoYTEsIGEzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydFNob3J0QXJyYXkoKSB7Ci0JCXNob3J0W10gYTEgPSBuZXcgc2hvcnRbM107Ci0JCWExWzBdID0gKHNob3J0KSAzMzsKLQkJYTFbMV0gPSAoc2hvcnQpIDExOwotCQlhMVsyXSA9IChzaG9ydCkgMjI7Ci0JCXNob3J0W10gYTIgPSBBcnJheVRvb2xzLnNvcnQoYTEpOwotCQlzaG9ydCBsYXN0ID0gKHNob3J0KSAwOwotCQlmb3IgKHNob3J0IHggOiBhMSkgewotCQkJYXNzZXJ0VHJ1ZShsYXN0IDwgeCk7Ci0JCQlsYXN0ID0geDsKLQkJfQotCQlhc3NlcnRTYW1lKGExLCBhMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRTaG9ydEFycmF5SW50SW50KCkgewotCQlzaG9ydFtdIGExID0gbmV3IHNob3J0WzldOwotCQlzaG9ydFtdIGEyID0gQXJyYXlUb29scy5maWxsKGExLCAoc2hvcnQpIDMpOwotCQlhMlszXSA9IChzaG9ydCkgMzM7Ci0JCWEyWzRdID0gKHNob3J0KSAxMTsKLQkJYTJbNV0gPSAoc2hvcnQpIDIyOwotCQlpbnQgZnJvbSA9IDM7Ci0JCWludCB0byA9IDY7Ci0JCXNob3J0W10gYTMgPSBBcnJheVRvb2xzLnNvcnQoYTIsIGZyb20sIHRvKTsKLQkJc2hvcnQgbGFzdCA9IChzaG9ydCkgMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewotCQkJc2hvcnQgeCA9IGExW2ldOwotCQkJaWYgKGkgPCBmcm9tIHx8IGkgPj0gdG8pIHsKLQkJCQlhc3NlcnRFcXVhbHMoMywgeCk7Ci0JCQl9IGVsc2UgewotCQkJCWFzc2VydFRydWUobGFzdCA8IHgpOwotCQkJCWxhc3QgPSB4OwotCQkJfQotCQl9Ci0JCWFzc2VydFNhbWUoYTEsIGEyKTsKLQkJYXNzZXJ0U2FtZShhMSwgYTMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShBcnJheVRvb2xzLmNsYXNzKTsKLQkJCWZhaWwoImJvZ3VzOiAiICsgYXQpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIGNoYXJbXSBidWlsZENoYXJBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBjaGFyW10geyAnYScsICdiJywgJ2MnIH07Ci0JfQotCi0JcHJpdmF0ZSBpbnRbXSBidWlsZEludEFycmF5KCkgewotCQlyZXR1cm4gbmV3IGludFtdIHsgMCwgMTAsIDIwIH07Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBidWlsZE9iamVjdEFycmF5MigpIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7ICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiIH07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZFN0cmluZ0FycmF5MigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiIH07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8T2JqZWN0PiBidWlsZE9iamVjdExpc3QxKCkgewotCQlMaXN0PE9iamVjdD4gbCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEobCk7Ci0JCXJldHVybiBsOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUb0NvbGxlY3Rpb24xKENvbGxlY3Rpb248PyBzdXBlciBTdHJpbmc+IGMpIHsKLQkJYy5hZGQoInplcm8iKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidHdvIik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRTdHJpbmdMaXN0MigpIHsKLQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24yKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMihDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQljLmFkZCgiZm91ciIpOwotCQljLmFkZCgiZml2ZSIpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRTdHJpbmdWZWN0b3IxKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMSh2KTsKLQkJcmV0dXJuIHY7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGIzMmRjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlwdWJsaWMgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0Q29tbWFuZCBjb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCVN0YXRlZnVsQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IG5ldyBBc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3IodGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSk7Ci0JCWNvbW1hbmRFeGVjdXRvci5zdGFydCgpOwotCQljb21tYW5kRXhlY3V0b3IuZXhlY3V0ZShjb21tYW5kKTsKLQkJY29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUoY29tbWFuZCk7Ci0JCWNvbW1hbmRFeGVjdXRvci5leGVjdXRlKGNvbW1hbmQpOwotCQlUaHJlYWQuc2xlZXAoVFdPX1RJQ0tTKTsgIC8vIHdhaXQgZm9yIHRoZSBjb21tYW5kIHRvIGV4ZWN1dGUKLQkJY29tbWFuZEV4ZWN1dG9yLnN0b3AoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmFnVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE4ZGZhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CYWdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCYWdUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfaXRlcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19zaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBCYWcuRW1wdHkuaW5zdGFuY2UoKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ191bmlxdWVJdGVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS51bmlxdWVJdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3VuaXF1ZUNvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBCYWcuRW1wdHkuaW5zdGFuY2UoKS51bmlxdWVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfY291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIEJhZy5FbXB0eS5pbnN0YW5jZSgpLmNvdW50KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2VudHJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZW50cmllcygpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3JlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS5yZW1vdmUoImZvbyIsIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCYWdfYWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJhZy5FbXB0eS5pbnN0YW5jZSgpLmFkZCgiZm9vIiwgMyk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX2VxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKEJhZy5FbXB0eS5pbnN0YW5jZSgpLmVxdWFscyhCYWcuRW1wdHkuaW5zdGFuY2UoKSkpOwotCQlhc3NlcnRGYWxzZShCYWcuRW1wdHkuaW5zdGFuY2UoKS5lcXVhbHMoImZvbyIpKTsKLQotCQlCYWc8T2JqZWN0PiBiYWcgPSBuZXcgSGFzaEJhZzxPYmplY3Q+KCk7Ci0JCWFzc2VydFRydWUoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZXF1YWxzKGJhZykpOwotCQliYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UoQmFnLkVtcHR5Lmluc3RhbmNlKCkuZXF1YWxzKGJhZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUJhZ19oYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgQmFnLkVtcHR5Lmluc3RhbmNlKCkuaGFzaENvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5QmFnX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQmFnPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmFnLkVtcHR5Lmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJhZy5FbXB0eS5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlGaWx0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0JpZGlGaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQxNTY0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpRmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlGaWx0ZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEJpZGlGaWx0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaWRpRmlsdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxCaWRpRmlsdGVyX2FjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKEJpZGlGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpLmFjY2VwdCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl9yZXZlcnNlQWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCkucmV2ZXJzZUFjY2VwdCgiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlGaWx0ZXIuTnVsbC5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlGaWx0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpRmlsdGVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaUZpbHRlci5OdWxsLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfYWNjZXB0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKEJpZGlGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCkuYWNjZXB0KCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfcmV2ZXJzZUFjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShCaWRpRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpLnJldmVyc2VBY2NlcHQoImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlQmlkaUZpbHRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlGaWx0ZXIuT3BhcXVlLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUJpZGlGaWx0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpRmlsdGVyPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaUZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpRmlsdGVyX2FjY2VwdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkuYWNjZXB0KCJmb28iKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRCaWRpRmlsdGVyX3JldmVyc2VBY2NlcHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQmlkaUZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpLnJldmVyc2VBY2NlcHQoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlGaWx0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlGaWx0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwNDAwYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVN0cmluZ0NvbnZlcnRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmlkaVN0cmluZ0NvbnZlcnRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpZGlTdHJpbmdDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRlZmF1bHQuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJpZGlTdHJpbmdDb252ZXJ0ZXJfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCaWRpU3RyaW5nQ29udmVydGVyPD8+IHh4eCA9IFRlc3RUb29scy5zZXJpYWxpemUoQmlkaVN0cmluZ0NvbnZlcnRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGVmYXVsdC5pbnN0YW5jZSgpLCB4eHgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QoImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlTdHJpbmdDb252ZXJ0ZXJfdG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkRpc2FibGVkLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlTdHJpbmdDb252ZXJ0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLlRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmYWxzZSIsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb1N0cmluZyhCb29sZWFuLkZBTFNFKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgidHJ1ZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJUUlVFIikpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvT2JqZWN0KCJmYWxzZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgieHh4eCIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuQm9vbGVhbkNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb29sZWFuQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkJvb2xlYW5Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5Cb29sZWFuQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJCaWRpU3RyaW5nQ29udmVydGVyX2NvbnZlcnRUb1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIjciLCBCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9TdHJpbmcoSW50ZWdlci52YWx1ZU9mKDcpKSk7Ci0JCWFzc2VydE51bGwoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCkuY29udmVydFRvU3RyaW5nKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlckJpZGlTdHJpbmdDb252ZXJ0ZXJfY29udmVydFRvT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLmNvbnZlcnRUb09iamVjdCgiNyIpKTsKLQkJYXNzZXJ0TnVsbChCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKS5jb252ZXJ0VG9PYmplY3QobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlTdHJpbmdDb252ZXJ0ZXIuSW50ZWdlckNvbnZlcnRlci5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyQmlkaVN0cmluZ0NvbnZlcnRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlTdHJpbmdDb252ZXJ0ZXI8Pz4geHh4ID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShCaWRpU3RyaW5nQ29udmVydGVyLkludGVnZXJDb252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JCWFzc2VydFNhbWUoQmlkaVN0cmluZ0NvbnZlcnRlci5JbnRlZ2VyQ29udmVydGVyLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQmlkaVRyYW5zZm9ybWVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzNmMTUzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaWRpVHJhbnNmb3JtZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmlkaVRyYW5zZm9ybWVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCaWRpVHJhbnNmb3JtZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBCaWRpVHJhbnNmb3JtZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl90cmFuc2Zvcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBCaWRpVHJhbnNmb3JtZXIuTnVsbC5pbnN0YW5jZSgpLnRyYW5zZm9ybSgiZm9vIikpOwotCQlhc3NlcnROdWxsKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkudHJhbnNmb3JtKG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl9yZXZlcnNlVHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS5yZXZlcnNlVHJhbnNmb3JtKCJmb28iKSk7Ci0JCWFzc2VydE51bGwoQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS50cmFuc2Zvcm0obnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQmlkaVRyYW5zZm9ybWVyX3RvU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoQmlkaVRyYW5zZm9ybWVyLk51bGwuaW5zdGFuY2UoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEJpZGlUcmFuc2Zvcm1lcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlUcmFuc2Zvcm1lcjw/LCA/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCkpOwotCQlhc3NlcnRTYW1lKEJpZGlUcmFuc2Zvcm1lci5OdWxsLmluc3RhbmNlKCksIHh4eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQmlkaVRyYW5zZm9ybWVyX3RyYW5zZm9ybSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKS50cmFuc2Zvcm0oImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl9yZXZlcnNlVHJhbnNmb3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpLnJldmVyc2VUcmFuc2Zvcm0oImZvbyIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKEJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJpZGlUcmFuc2Zvcm1lcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJpZGlUcmFuc2Zvcm1lcjw/LCA/PiB4eHggPSBUZXN0VG9vbHMuc2VyaWFsaXplKEJpZGlUcmFuc2Zvcm1lci5EaXNhYmxlZC5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0U2FtZShCaWRpVHJhbnNmb3JtZXIuRGlzYWJsZWQuaW5zdGFuY2UoKSwgeHh4KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQml0VG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE5NDEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9CaXRUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCaXRUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEJpdFRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsYWdJc09mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuZmxhZ0lzT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgyMjA0LCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5mbGFnSXNPZmYoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25seUZsYWdJc1NldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAxLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAwMDEsIDB4MDAwMSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc1NldCgweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMTAzLCAweDAxMDMpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdJc1NldCgweDExMDMsIDB4MTEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoMHgwMDAwLCAweDExMDMpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ0lzU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnSXNPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkZGRSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MDEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRkVGQywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdJc09mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnSXNPZmYoMHhGRkZGRUVGQywgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlU2V0SW50SW50KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAzMDMsIDB4MDEwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCAweDExMDMpKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMDAwLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDIyMDQsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMCwgMHgxMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMDAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgMHgwMDAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAxKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MTEwMywgMHgxMTAzKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMCwgMHgxMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgMHgwMTAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZU9mZkludEludCgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgMHgwMDAxKSk7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZGRkZFLCAweDAwMDEpKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCAweDAxMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHhGRkZGRkVGRSwgMHgwMTAxKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDMwMywgMHgwMTAzKSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIDB4MDEwMykpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweDAzMDMsIDB4MTEwMykpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCAweDExMDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVTZXRJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAzLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMDAwLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW55RmxhZ3NBcmVPZmZJbnRJbnQoKSB7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHgzMzNFLCAweDAwMDEpKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweEZGRkUsIDB4MDAwMSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgMHhGRkZGKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHg3MzczLCAweDEwMTApKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCAweEZGRkYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsRmxhZ3NBcmVTZXRJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDMsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDEwMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbEZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYWxsRmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFsbEZsYWdzQXJlT2ZmKDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDA0MDAsIDB4MDAyMCwgMHgwMDAwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbGxGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4MTAwMCwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9ubHlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDAwMSwgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMDAxLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAxMDEsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlU2V0KDB4MDEwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgxMTAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4MDExLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5vbmx5RmxhZ3NBcmVTZXQoMHgwMTAzLCBuZXcgaW50W10geyAweDAxMDEsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmx5RmxhZ3NBcmVPZmZJbnRJbnRBcnJheSgpIHsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDEsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZGRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDAsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkUsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMCwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDAwMSwgMHgwMTAwLCAweDAwMDIsIDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMub25seUZsYWdzQXJlT2ZmKDB4RkZGRkZFRkMsIG5ldyBpbnRbXSB7IDB4MDAxLCAweDAxMDAsIDB4MDAwMiwgMHgwMDAxIH0pKTsKLQotCQlhc3NlcnRGYWxzZShCaXRUb29scy5vbmx5RmxhZ3NBcmVPZmYoMHgwMzAzLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLm9ubHlGbGFnc0FyZU9mZigweEZGRkZFRUZDLCBuZXcgaW50W10geyAweDExMDAsIDB4MDEwMCwgMHgwMDAyLCAweDAwMDEgfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbnlGbGFnc0FyZVNldEludEludEFycmF5KCkgewotCQlhc3NlcnRUcnVlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweEZGRkYsIG5ldyBpbnRbXSB7IDB4MDAwMSB9KSk7Ci0JCWFzc2VydFRydWUoQml0VG9vbHMuYW55RmxhZ3NBcmVTZXQoMHgwMzAzLCBuZXcgaW50W10geyAweEYwMDAsIDB4MEYwMCwgMHgwMEYwLCAweDAwMEYgfSkpOwotCi0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlU2V0KDB4MDMwMywgbmV3IGludFtdIHsgMHgxMDAwLCAweDAwMTAgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZVNldCgweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFueUZsYWdzQXJlT2ZmSW50SW50QXJyYXkoKSB7Ci0JCWFzc2VydEZhbHNlKEJpdFRvb2xzLmFueUZsYWdzQXJlT2ZmKDB4MDAwMywgbmV3IGludFtdIHsgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RmFsc2UoQml0VG9vbHMuYW55RmxhZ3NBcmVPZmYoMHhGRkZGLCBuZXcgaW50W10geyAweDAwMDEgfSkpOwotCQlhc3NlcnRGYWxzZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMjAwLCAweDAwMDMsIDB4MDAwMiB9KSk7Ci0KLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAzMDMsIG5ldyBpbnRbXSB7IDB4MDEwMCwgMHgwMDEwIH0pKTsKLQkJYXNzZXJ0VHJ1ZShCaXRUb29scy5hbnlGbGFnc0FyZU9mZigweDAwMDAsIG5ldyBpbnRbXSB7IDB4RjAwMCwgMHgwRjAwLCAweDAwRjAsIDB4MDAwRiB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLm9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMDAgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDExLCBCaXRUb29scy5vckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMSwgQml0VG9vbHMub3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5kRmxhZ3MoKSB7Ci0JCWFzc2VydEVxdWFscygweDAwMDEsIEJpdFRvb2xzLmFuZEZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDAxIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEgfSkpOwotCQlhc3NlcnRFcXVhbHMoMHgwMDAwLCBCaXRUb29scy5hbmRGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAxMSwgMHhGMDAwIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4MDAwMSwgQml0VG9vbHMuYW5kRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMSB9KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFhvckZsYWdzKCkgewotCQlhc3NlcnRFcXVhbHMoMHgwMDAxLCBCaXRUb29scy54b3JGbGFncyhuZXcgaW50W10geyAweDAwMDEsIDB4MDAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweDAwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDB4RjAxMCwgQml0VG9vbHMueG9yRmxhZ3MobmV3IGludFtdIHsgMHgwMDAxLCAweDAwMTEsIDB4RjAwMCB9KSk7Ci0JCWFzc2VydEVxdWFscygweEZGMTEsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSB9KSk7Ci0JCWFzc2VydEVxdWFscygweEYwMTAsIEJpdFRvb2xzLnhvckZsYWdzKG5ldyBpbnRbXSB7IDB4MDAwMSwgMHgwMDExLCAweEYwMDAsIDB4MEYwMSwgMHgwRjAxIH0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShCaXRUb29scy5jbGFzcyk7Ci0JCQlmYWlsKCJib2d1czogIiArIGF0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Cb29sZWFuVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzRhNzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0Jvb2xlYW5Ub29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQm9vbGVhblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBCb29sZWFuVG9vbHNUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRSVUUgPSBCb29sZWFuLlRSVUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhbiBGQUxTRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgQm9vbGVhblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5PVCgpIHsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm90KFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5ub3QoRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QU5EKCkgewotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLmFuZChUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLmFuZChUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5hbmQoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMuYW5kKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPUigpIHsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5vcihUUlVFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMub3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5vcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5vcihGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WE9SKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54b3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhvcihUUlVFLCBGQUxTRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhvcihGQUxTRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54b3IoRkFMU0UsIEZBTFNFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5BTkQoKSB7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLm5hbmQoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLm5hbmQoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy5uYW5kKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubmFuZChGQUxTRSwgRkFMU0UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tk9SKCkgewotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy5ub3IoVFJVRSwgRkFMU0UpKTsKLQkJYXNzZXJ0RXF1YWxzKEZBTFNFLCBCb29sZWFuVG9vbHMubm9yKEZBTFNFLCBUUlVFKSk7Ci0JCWFzc2VydEVxdWFscyhUUlVFLCBCb29sZWFuVG9vbHMubm9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYTk9SKCkgewotCQlhc3NlcnRFcXVhbHMoVFJVRSwgQm9vbGVhblRvb2xzLnhub3IoVFJVRSwgVFJVRSkpOwotCQlhc3NlcnRFcXVhbHMoRkFMU0UsIEJvb2xlYW5Ub29scy54bm9yKFRSVUUsIEZBTFNFKSk7Ci0JCWFzc2VydEVxdWFscyhGQUxTRSwgQm9vbGVhblRvb2xzLnhub3IoRkFMU0UsIFRSVUUpKTsKLQkJYXNzZXJ0RXF1YWxzKFRSVUUsIEJvb2xlYW5Ub29scy54bm9yKEZBTFNFLCBGQUxTRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJT2JqZWN0IGF0ID0gUmVmbGVjdGlvblRvb2xzLm5ld0luc3RhbmNlKEJvb2xlYW5Ub29scy5jbGFzcyk7Ci0JCQlmYWlsKCJib2d1czogIiArIGF0KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIHsKLQkJCQlpZiAoZXguZ2V0Q2F1c2UoKS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24pIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc05hbWVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMDcwYjYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NsYXNzTmFtZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENsYXNzTmFtZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENsYXNzTmFtZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBcnJheShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQXJyYXkoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQXJyYXkoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0FycmF5KGphdmEubGFuZy5TdHJpbmdbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBcnJheShqYXZhLmxhbmcuU3RyaW5nW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudFR5cGVOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHModm9pZC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0RWxlbWVudFR5cGVOYW1lKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRFbGVtZW50VHlwZU5hbWUoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShqYXZhLnV0aWwuVmVjdG9yW11bXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldEVsZW1lbnRUeXBlTmFtZShpbnRbXVtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFycmF5RGVwdGgoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDbGFzc05hbWUuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ2xhc3NOYW1lLmdldEFycmF5RGVwdGgoamF2YS51dGlsLlZlY3RvcltdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENsYXNzTmFtZS5nZXRBcnJheURlcHRoKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcG9uZW50VHlwZU5hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGphdmEubGFuZy5PYmplY3RbXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldENvbXBvbmVudFR5cGVOYW1lKGludFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoaW50W10uY2xhc3MuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0Q29tcG9uZW50VHlwZU5hbWUoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2ltcGxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoIk9iamVjdCIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0W10iLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiT2JqZWN0W11bXSIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGphdmEubGFuZy5PYmplY3RbXVtdLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuTWFwLmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydEVxdWFscygiaW50IiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludFtdIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoaW50W10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKGludFtdW10uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJT2JqZWN0IGFub25PYmplY3QgPSBuZXcgT2JqZWN0KCkgewotCQkJLy8gYW5vbnltb3VzIGNsYXNzCi0JCX07Ci0JCWFzc2VydEVxdWFscygiIiwgQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoYW5vbk9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCWNsYXNzIExvY2FsIHsKLQkJCS8vIGFub255bW91cyBjbGFzcwotCQl9Ci0JCUxvY2FsIGxvY2FsT2JqZWN0ID0gbmV3IExvY2FsKCk7Ci0JCWFzc2VydEVxdWFscygiTG9jYWwiLCBDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZShsb2NhbE9iamVjdC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQYWNrYWdlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShqYXZhLmxhbmcuT2JqZWN0W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLk1hcC5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoamF2YS51dGlsLk1hcC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFBhY2thZ2VOYW1lKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShpbnRbXS5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUoaW50W11bXS5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRFcXVhbHMoIiIsIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZSh2b2lkLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCU9iamVjdCBhbm9uT2JqZWN0ID0gbmV3IE9iamVjdCgpIHsKLQkJCS8vIGFub255bW91cyBjbGFzcwotCQl9OwotCQlhc3NlcnRFcXVhbHMoYW5vbk9iamVjdC5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQYWNrYWdlTmFtZShhbm9uT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVG9wTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNUb3BMZXZlbChqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKS5nZXROYW1lKCkpKTsgLy8gbG9jYWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVG9wTGV2ZWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNUb3BMZXZlbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1RvcExldmVsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTWVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKS5nZXROYW1lKCkpKTsgLy8gYW5vbnltb3VzCi0KLQkJT2JqZWN0W10gYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcFswXTsgLy8gdG9wLWxldmVsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcihhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGFub25DbGFzcyA9IENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpOyAvLyBsb2NhbAotCQlhcnJheSA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoYW5vbkNsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gdGVzdCBhIGZldyBlZGdlIGNhc2VzCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxYWEkYWFhIikpOyAgLy8gbWVtYmVyIGluc2lkZSBsb2NhbAotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxJGFhYSIpKTsgIC8vIG1lbWJlciBpbnNpZGUgYW5vbnltb3VzCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJGExJGFhYSRiYmIiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7ICAvLyBtZW1iZXIgaW5zaWRlIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc01lbWJlcigiamF2YS51dGlsLk1hcCQxYSIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNNZW1iZXIoImphdmEudXRpbC5NYXAkYTEyMzQ1JGIxMjM0NSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDEyMzQ1YSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTWVtYmVyKCJqYXZhLnV0aWwuTWFwMyQzMzMiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTG9jYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY2xhc3MgTG9jYWxDbGFzcyB7Ci0JCQl2b2lkIGZvbygpIHsKLQkJCQlTeXN0ZW0uZ2V0UHJvcGVydHkoImZvbyIpOwotCQkJfQotCQl9Ci0JCW5ldyBMb2NhbENsYXNzKCkuZm9vKCk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzLmdldE5hbWUoKSkpOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNMb2NhbChDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJYXJyYXkgPSBuZXcgamF2YS51dGlsLk1hcC5FbnRyeVswXTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCUNsYXNzPD8+IGxvY2FsQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShsb2NhbENsYXNzLCAwKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbChhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCi0JCS8vIHRlc3QgYSBmZXcgZWRnZSBjYXNlcwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNMb2NhbCgiamF2YS51dGlsLk1hcCRhMSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkYTEkYWFhJGJiYiIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMTEkYWFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDFhIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDJhYmMiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMmFiYzEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAkMTIzNDUkMTIzNGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0xvY2FsKCJqYXZhLnV0aWwuTWFwJDMzMyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzTG9jYWwoImphdmEudXRpbC5NYXAzJDMzMyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbm9ueW1vdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGphdmEudXRpbC5NYXAuY2xhc3MuZ2V0TmFtZSgpKSk7IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cyhDbGFzcy5mb3JOYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJDFMb2NhbENsYXNzIikuZ2V0TmFtZSgpKSk7IC8vIGxvY2FsCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKENsYXNzLmZvck5hbWUoImphdmEudXRpbC5WZWN0b3IkMSIpLmdldE5hbWUoKSkpOyAvLyBhbm9ueW1vdXMKLQotCQlPYmplY3RbXSBhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwWzBdOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JCWFycmF5ID0gbmV3IGphdmEudXRpbC5NYXAuRW50cnlbMF07IC8vIG1lbWJlcgotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gYW5vbkNsYXNzID0gQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIik7IC8vIGxvY2FsCi0JCWFycmF5ID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShhbm9uQ2xhc3MsIDApOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQotCQkvLyB0ZXN0IGEgZmV3IGVkZ2UgY2FzZXMKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExIikpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkYTEkYWFhJGJiYiIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJDFhMSRhYWEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxJGEiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxYSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzQW5vbnltb3VzKCJqYXZhLnV0aWwuTWFwJGExMjM0NSRiMTIzNDUiKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcCQxMjM0NSRhMTIzNCIpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNBbm9ueW1vdXMoImphdmEudXRpbC5NYXAkMzMzIikpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc0Fub255bW91cygiamF2YS51dGlsLk1hcDMkMzMzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1JlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoaW50LmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShqYXZhLnV0aWwuTWFwLmNsYXNzLmdldE5hbWUoKSkpOyAvLyB0b3AtbGV2ZWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcy5nZXROYW1lKCkpKTsgLy8gbWVtYmVyCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKS5nZXROYW1lKCkpKTsgLy8gbG9jYWwKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoQ2xhc3MuZm9yTmFtZSgiamF2YS51dGlsLlZlY3RvciQxIikuZ2V0TmFtZSgpKSk7IC8vIGFub255bW91cwotCi0JCU9iamVjdFtdIGFycmF5ID0gbmV3IGphdmEudXRpbC5NYXBbMF07IC8vIHRvcC1sZXZlbAotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlhcnJheSA9IG5ldyBqYXZhLnV0aWwuTWFwLkVudHJ5WzBdOyAvLyBtZW1iZXIKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNSZWZlcmVuY2UoYXJyYXkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKLQkJQ2xhc3M8Pz4gbG9jYWxDbGFzcyA9IENsYXNzLmZvck5hbWUodGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIkMUxvY2FsQ2xhc3MiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGxvY2FsQ2xhc3MsIDApOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1JlZmVyZW5jZShhcnJheS5nZXRDbGFzcygpLmdldE5hbWUoKSkpOwotCQlDbGFzczw/PiBhbm9uQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKCJqYXZhLnV0aWwuVmVjdG9yJDEiKTsgLy8gbG9jYWwKLQkJYXJyYXkgPSAoT2JqZWN0W10pIEFycmF5Lm5ld0luc3RhbmNlKGFub25DbGFzcywgMCk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUmVmZXJlbmNlKGFycmF5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUHJpbWl0aXZlKCkgewotCQlhc3NlcnRUcnVlKHZvaWQuY2xhc3MuaXNQcmltaXRpdmUoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShmbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmUoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmUoamF2YS5sYW5nLk51bWJlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZShqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZVdyYXBwZXIoKSB7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ByaW1pdGl2ZVdyYXBwZXIoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZhcmlhYmxlUHJpbWl0aXZlKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZSh2b2lkLmNsYXNzLmdldE5hbWUoKSkpOwotCi0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRUcnVlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLk51bWJlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmUoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKCkgewotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlZvaWQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5GbG9hdC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ2xhc3NOYW1lLmlzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5OdW1iZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEZhbHNlKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0V3JhcHBlckNsYXNzTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5Wb2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUodm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUoaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFdyYXBwZXJDbGFzc05hbWUoZmxvYXQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRXcmFwcGVyQ2xhc3NOYW1lKGJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0TnVsbChDbGFzc05hbWUuZ2V0V3JhcHBlckNsYXNzTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcmltaXRpdmVDbGFzc05hbWUoKSB7Ci0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLmdldE5hbWUoKSwgQ2xhc3NOYW1lLmdldFByaW1pdGl2ZUNsYXNzTmFtZShqYXZhLmxhbmcuVm9pZC5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscyhmbG9hdC5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkZsb2F0LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRFcXVhbHMoYm9vbGVhbi5jbGFzcy5nZXROYW1lKCksIENsYXNzTmFtZS5nZXRQcmltaXRpdmVDbGFzc05hbWUoamF2YS5sYW5nLkJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0KLQkJYXNzZXJ0TnVsbChDbGFzc05hbWUuZ2V0UHJpbWl0aXZlQ2xhc3NOYW1lKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBcmVBdXRvYm94RXF1aXZhbGVudHMoKSB7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgSW50ZWdlci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDbGFzc05hbWUuYXJlQXV0b2JveEVxdWl2YWxlbnRzKGludC5jbGFzcy5nZXROYW1lKCksIEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhJbnRlZ2VyLmNsYXNzLmdldE5hbWUoKSwgaW50LmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnRGYWxzZShDbGFzc05hbWUuYXJlQXV0b2JveEVxdWl2YWxlbnRzKGludC5jbGFzcy5nZXROYW1lKCksIEJvb2xlYW4uY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydFRydWUoQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cyhTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpLCBTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGb3JDb2RlKCkgewotCQlhc3NlcnRFcXVhbHMoImJ5dGUiLCBDbGFzc05hbWUuZm9yQ29kZSgnQicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaGFyIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0MnKSk7Ci0JCWFzc2VydEVxdWFscygiZG91YmxlIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0QnKSk7Ci0JCWFzc2VydEVxdWFscygiZmxvYXQiLCBDbGFzc05hbWUuZm9yQ29kZSgnRicpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBDbGFzc05hbWUuZm9yQ29kZSgnSScpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb25nIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ0onKSk7Ci0JCWFzc2VydEVxdWFscygic2hvcnQiLCBDbGFzc05hbWUuZm9yQ29kZSgnUycpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib29sZWFuIiwgQ2xhc3NOYW1lLmZvckNvZGUoJ1onKSk7Ci0JCWFzc2VydEVxdWFscygidm9pZCIsIENsYXNzTmFtZS5mb3JDb2RlKCdWJykpOwotCi0JCWFzc2VydE51bGwoQ2xhc3NOYW1lLmZvckNvZGUoJ1gnKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJieXRlIiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0InKSk7Ci0JCWFzc2VydEVxdWFscygiY2hhciIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdDJykpOwotCQlhc3NlcnRFcXVhbHMoImRvdWJsZSIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdEJykpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0YnKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ0knKSk7Ci0JCWFzc2VydEVxdWFscygibG9uZyIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdKJykpOwotCQlhc3NlcnRFcXVhbHMoInNob3J0IiwgQ2xhc3NOYW1lLmZvckNvZGUoKGludCkgJ1MnKSk7Ci0JCWFzc2VydEVxdWFscygiYm9vbGVhbiIsIENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdaJykpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBDbGFzc05hbWUuZm9yQ29kZSgoaW50KSAnVicpKTsKLQotCQlhc3NlcnROdWxsKENsYXNzTmFtZS5mb3JDb2RlKChpbnQpICdYJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2RlRm9yQ2xhc3NOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoJ0knLCBDbGFzc05hbWUuZ2V0Q29kZUZvckNsYXNzTmFtZShpbnQuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnSScsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKCJpbnQiKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKGJ5dGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JCWFzc2VydEVxdWFscygnQicsIENsYXNzTmFtZS5nZXRDb2RlRm9yQ2xhc3NOYW1lKCJieXRlIikpOwotCi0JCWFzc2VydEVxdWFscygoY2hhcikgMCwgQ2xhc3NOYW1lLmdldENvZGVGb3JDbGFzc05hbWUoamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShDbGFzc05hbWUuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ2xhc3NwYXRoVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTQyNjYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9DbGFzc3BhdGhUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzcGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xhc3NwYXRoVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfSE9NRSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7Ci0KLQlwdWJsaWMgQ2xhc3NwYXRoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzZWQoKSB7Ci0JCVN0cmluZyBwYXRoID0gIiI7Ci0KLQkJLy8gbm8gY2hhbmdlcwotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSkuY29tcHJlc3NlZCgpLmdldFBhdGgoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpLCBwYXRoKTsKLQotCQlwYXRoID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGpka1xccnQuamFyOzs7O0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0Lmphcjs7OyIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCS8vIG5vIGNoYW5nZXMKLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcamF3cy5qYXIiKSwgcGF0aCk7Ci0KLQkJcGF0aCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFwuLlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphciIpKS5jb21wcmVzc2VkKCkuZ2V0UGF0aCgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JCXBhdGggPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGsxXFxqZGsyXFxqZGszXFxpMThuLmphcjtDOlxcamRrXFxydC5qYXI7QzpcXGpkazFcXGpkazJcXGpkazNcXC4uXFwuLlxcLi5cXGpkazFcXGpkazJcXGpkazNcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyIikpLmNvbXByZXNzZWQoKS5nZXRQYXRoKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrMVxcamRrMlxcamRrM1xcaTE4bi5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGphd3MuamFyIiksIHBhdGgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gImphdmEvbGFuZy9TdHJpbmcuY2xhc3MiOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCksIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSAiamF2YS9sYW5nL1N0cmluZy5jbGFzcyI7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0NsYXNzKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgamF2YUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUNsYXNzRmlsZUVudHJ5TmFtZSgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0FyY2hpdmVDbGFzc0ZpbGVFbnRyeU5hbWUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS9sYW5nL1N0cmluZy5jbGFzcyIsIGZpbGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvQXJjaGl2ZUVudHJ5TmFtZUJhc2UoKSB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9BcmNoaXZlRW50cnlOYW1lQmFzZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhL2xhbmcvU3RyaW5nIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVOYW1lKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmNsYXNzIiwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9DbGFzc0ZpbGVTdHJpbmcoKSB7Ci0JCWNoYXIgc2MgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCUZpbGUgZmlsZSA9IENsYXNzcGF0aC5jb252ZXJ0VG9DbGFzc0ZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuY2xhc3MiLCBmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0NsYXNzRmlsZUNsYXNzKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIGZpbGUgPSBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuY2xhc3MiLCBmaWxlLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFGaWxlTmFtZSgpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJU3RyaW5nIGZpbGVOYW1lID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0phdmFGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhIiArIHNjICsgImxhbmciICsgc2MgKyAiU3RyaW5nLmphdmEiLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFGaWxlU3RyaW5nKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIGZpbGUgPSBDbGFzc3BhdGguY29udmVydFRvSmF2YUZpbGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YUZpbGVDbGFzcygpIHsKLQkJY2hhciBzYyA9IEZpbGUuc2VwYXJhdG9yQ2hhcjsKLQkJRmlsZSBmaWxlID0gQ2xhc3NwYXRoLmNvbnZlcnRUb0phdmFGaWxlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmcuamF2YSIsIGZpbGUuZ2V0UGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvRmlsZU5hbWVCYXNlKCkgewotCQljaGFyIHNjID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBDbGFzc3BhdGguY29udmVydFRvRmlsZU5hbWVCYXNlKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEiICsgc2MgKyAibGFuZyIgKyBzYyArICJTdHJpbmciLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VSTHMoKSB7Ci0JCUl0ZXJhdG9yPFVSTD4gZW50cmllcyA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRVUkxzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9qZGsvcnQuamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2kxOG4uamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovamRrL2phd3MuamFyIiksIGVudHJpZXMubmV4dCgpLmdldFBhdGgoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoVVJMKCIvQzovZm9vL2NsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGhVUkwoIi9DOi9iYXIvYmFyLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRQYXRoKCkpOwotCQlhc3NlcnRGYWxzZShlbnRyaWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVudHJpZXMoKSB7Ci0JCUNsYXNzcGF0aCBjcCA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyOzsuO0M6XFxqZGtcXGkxOG4uamFyOzs7QzpcXGpka1xcamF3cy5qYXI7O0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcYmFyXFxiYXIuamFyOyIpKTsKLQkJSXRlcmF0b3I8Q2xhc3NwYXRoLkVudHJ5PiBlbnRyaWVzID0gY3AuZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGJhclxcYmFyLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50cmllcy5oYXNOZXh0KCkpOwotCi0JCWNwID0gY3AuY29tcHJlc3NlZCgpOwotCQllbnRyaWVzID0gY3AuZ2V0RW50cmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCIuIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXIiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxqYXdzLmphciIpLCBlbnRyaWVzLm5leHQoKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxmb29cXGNsYXNzZXMiKSwgZW50cmllcy5uZXh0KCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcYmFyXFxiYXIuamFyIiksIGVudHJpZXMubmV4dCgpLmdldEZpbGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbnRyaWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEVudHJ5Rm9yRmlsZU5hbWVkKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBudWxsOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSBxdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGluIHRoZSBtaWRkbGUgLSB1bnF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7cnQuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHF1YWxpZmllZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gYXQgdGhlIGJlZ2lubmluZyAtIHVucXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJydC5qYXIiLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnQuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyBhdCB0aGUgZW5kIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKHRoaXMubW9ycGgoIkM6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHMoInJ0LmphciIsIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gcXVhbGlmaWVkCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSkuZ2V0RW50cnlGb3JGaWxlTmFtZWQoInJ0LmphciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb3JwaCgiQzpcXGpka1xccnQuamFyIiksIGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCi0JCS8vIGFsb25lIC0gdW5xdWFsaWZpZWQKLQkJZW50cnkgPSBuZXcgQ2xhc3NwYXRoKCJydC5qYXIiKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscygicnQuamFyIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGJlZ2lubmluZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydC5qYXI7QzpcXGpka1xcaTE4bi5qYXI7QzpcXGpka1xcamF3cy5qYXI7QzpcXGZvb1xcY2xhc3NlcztDOlxcYmFyXFxiYXIuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9ycGgoIkM6XFxqZGtcXHJ0LmphciIpLCBlbnRyeS5nZXRGaWxlTmFtZSgpKTsKLQotCQkvLyB0cmljayBlbnRyeSBpbiB0aGUgbWlkZGxlCi0JCWVudHJ5ID0gbmV3IENsYXNzcGF0aCh0aGlzLm1vcnBoKCJydC5qYXIubmV3O0M6XFxqZGtcXHJ0cnRydC5qYXI7QzpcXGpka1xccnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gdHJpY2sgZW50cnkgYXQgdGhlIGVuZAotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXHJ0LmphcjtDOlxcamRrXFxpMThuLmphcjtDOlxcamRrXFxqYXdzLmphcjtDOlxcZm9vXFxjbGFzc2VzO0M6XFxiYXJcXGJhci5qYXI7QzpcXGpka1xccnRydHJ0LmphciIpKS5nZXRFbnRyeUZvckZpbGVOYW1lZCgicnQuamFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vcnBoKCJDOlxcamRrXFxydC5qYXIiKSwgZW50cnkuZ2V0RmlsZU5hbWUoKSk7Ci0KLQkJLy8gbWlzc2luZwotCQllbnRyeSA9IG5ldyBDbGFzc3BhdGgodGhpcy5tb3JwaCgicnQuamFyLm5ldztDOlxcamRrXFxydHJ0cnQuamFyO0M6XFxqZGtcXGkxOG4uamFyO0M6XFxqZGtcXGphd3MuamFyO0M6XFxmb29cXGNsYXNzZXM7QzpcXGJhclxcYmFyLmphcjtDOlxcamRrXFxydHJ0cnQuamFyIikpLmdldEVudHJ5Rm9yRmlsZU5hbWVkKCJydC5qYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXRoIGVudHJ5IHNob3VsZCBub3QgYmUgZm91bmQiLCBudWxsLCBlbnRyeSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RW50cnlGb3JDbGFzc05hbWVkKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5jb21wbGV0ZUNsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCQlhc3NlcnROdWxsKENsYXNzcGF0aC5jb21wbGV0ZUNsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZCgiZm9vLmJhci5CYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvY2F0aW9uRm9yQ2xhc3MoKSB7Ci0JCUNsYXNzPD8+IGphdmFDbGFzcyA9IENsYXNzcGF0aC5jbGFzczsKLQkJRmlsZSBlbnRyeSA9IG5ldyBGaWxlKENsYXNzcGF0aC5sb2NhdGlvbkZvcihqYXZhQ2xhc3MpKTsKLQkJaWYgKGVudHJ5LmlzRmlsZSgpIHx8IGVudHJ5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWFzc2VydFRydWUoZW50cnkuZXhpc3RzKCkpOwotCQl9Ci0JCWlmIChlbnRyeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5ldyBGaWxlKGVudHJ5LCBDbGFzc3BhdGguY29udmVydFRvQ2xhc3NGaWxlTmFtZShqYXZhQ2xhc3MpKS5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnRKYXJOYW1lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBydEZpbGUgPSBuZXcgRmlsZShDbGFzc3BhdGgucnRKYXJOYW1lKCkpOwotCQlhc3NlcnRUcnVlKCJydC5qYXIgZG9lcyBub3QgZXhpc3QiLCBydEZpbGUuZXhpc3RzKCkpOwotCi0JCUphckZpbGUgcnRKYXJGaWxlID0gbmV3IEphckZpbGUocnRGaWxlKTsKLQkJSmFyRW50cnkgZW50cnkgPSBydEphckZpbGUuZ2V0SmFyRW50cnkoImphdmEvbGFuZy9PYmplY3QuY2xhc3MiKTsKLQkJcnRKYXJGaWxlLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoImJvZ3VzIHJ0LmphciIsIGVudHJ5ICE9IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKUkVDbGFzc05hbWVzKCkgewotCQlhc3NlcnRUcnVlKCJWZWN0b3IgaXMgbWlzc2luZyBmcm9tIEpSRSBjbGFzcyBuYW1lcyIsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldENsYXNzTmFtZXMoKSwgamF2YS51dGlsLlZlY3Rvci5jbGFzcy5nZXROYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlsZSBpcyBtaXNzaW5nIGZyb20gSlJFIGNsYXNzIG5hbWVzIiwgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0Q2xhc3NOYW1lcygpLCBqYXZhLmlvLkZpbGUuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFFeHRlbnNpb25EaXJlY3RvcnlOYW1lcygpIHsKLQkJY2hhciBzZXAgPSBGaWxlLnNlcGFyYXRvckNoYXI7Ci0JCVN0cmluZyBzdGRFeHREaXJOYW1lID0gSkFWQV9IT01FICsgc2VwICsgImxpYiIgKyBzZXAgKyAiZXh0IjsKLQkJYXNzZXJ0VHJ1ZSgic3RhbmRhcmQgZXh0ZW5zaW9uIGRpciBuYW1lIG1pc3Npbmc6ICIgKyBzdGRFeHREaXJOYW1lLCBBcnJheVRvb2xzLmNvbnRhaW5zKENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uRGlyZWN0b3J5TmFtZXMoKSwgc3RkRXh0RGlyTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uRGlyZWN0b3JpZXMoKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlGaWxlIHN0ZEV4dERpciA9IG5ldyBGaWxlKEpBVkFfSE9NRSArIHNlcCArICJsaWIiICsgc2VwICsgImV4dCIpOwotCQlhc3NlcnRUcnVlKCJzdGFuZGFyZCBleHRlbnNpb24gZGlyIG1pc3Npbmc6ICIgKyBzdGRFeHREaXIuZ2V0UGFyZW50KCksIEFycmF5VG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFFeHRlbnNpb25EaXJlY3RvcmllcygpLCBzdGRFeHREaXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUV4dGVuc2lvbkNsYXNzcGF0aEVudHJpZXMoKSB7Ci0JCWNoYXIgc2VwID0gRmlsZS5zZXBhcmF0b3JDaGFyOwotCQlTdHJpbmcgamRrID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKTsKLQkJaWYgKGpkay5zdGFydHNXaXRoKCIxLjQiKSB8fCBqZGsuc3RhcnRzV2l0aCgiMS41IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNiIpKSB7Ci0JCQlDb2xsZWN0aW9uPFN0cmluZz4gamFyTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUl0ZXJhYmxlPENsYXNzcGF0aC5FbnRyeT4gZW50cmllcyA9IENsYXNzcGF0aC5qYXZhRXh0ZW5zaW9uQ2xhc3NwYXRoKCkuZ2V0RW50cmllcygpOwotCQkJZm9yIChDbGFzc3BhdGguRW50cnkgZW50cnkgOiBlbnRyaWVzKSB7Ci0JCQkJamFyTmFtZXMuYWRkKGVudHJ5LmdldEZpbGVOYW1lKCkpOwotCQkJfQotCQkJU3RyaW5nIHN0ZEV4dEphck5hbWUgPSBKQVZBX0hPTUUgKyBzZXAgKyAibGliIiArIHNlcCArICJleHQiICsgc2VwICsgImRuc25zLmphciI7Ci0JCQlTdHJpbmcgbXNnID0gImpkayAxLjQueCBzdGFuZGFyZCBleHRlbnNpb24gamFyIG1pc3Npbmc6ICIgKyBzdGRFeHRKYXJOYW1lOwotCQkJYm9vbGVhbiBqYXJQcmVzZW50ID0gamFyTmFtZXMuY29udGFpbnMoc3RkRXh0SmFyTmFtZSk7Ci0JCQlpZiAoVG9vbHMuanZtSXNTdW4oKSB8fCAoVG9vbHMuanZtSXNJQk0oKSAmJiBqZGsuc3RhcnRzV2l0aCgiMS42IikpKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShtc2csIGphclByZXNlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZmFpbCgid2UgbmVlZCB0byB1cGRhdGUgdGhpcyB0ZXN0IGZvciB0aGUgY3VycmVudCBqZGsiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhRXh0ZW5zaW9uQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGpkayA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7Ci0JCWlmIChqZGsuc3RhcnRzV2l0aCgiMS40IikgfHwgamRrLnN0YXJ0c1dpdGgoIjEuNSIpIHx8IGpkay5zdGFydHNXaXRoKCIxLjYiKSkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9ICJzdW4ubmV0LnNwaS5uYW1lc2VydmljZS5kbnMuRE5TTmFtZVNlcnZpY2UiOwotCQkJU3RyaW5nIG1zZyA9ICJqZGsgMS40Lnggc3RhbmRhcmQgZXh0ZW5zaW9uIGNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWU7Ci0JCQlib29sZWFuIGNsYXNzUHJlc2VudCA9IENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguamF2YUV4dGVuc2lvbkNsYXNzcGF0aCgpLmNsYXNzTmFtZXMoKSwgY2xhc3NOYW1lKTsKLQkJCWlmIChUb29scy5qdm1Jc1N1bigpIHx8IChUb29scy5qdm1Jc0lCTSgpICYmIGpkay5zdGFydHNXaXRoKCIxLjYiKSkpIHsKLQkJCQlhc3NlcnRUcnVlKG1zZywgY2xhc3NQcmVzZW50KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZhaWwoIndlIG5lZWQgdG8gdXBkYXRlIHRoaXMgdGVzdCBmb3IgdGhlIGN1cnJlbnQgamRrIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzcGF0aENsYXNzTmFtZXMoKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlDbGFzc0xvYWRlciBjbCA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOwotCQkvLyBtYWtlIHN1cmUgd2UgYXJlIHJ1bm5pbmcgdW5kZXIgdGhlICJub3JtYWwiIGNsYXNzIGxvYWRlcjsKLQkJLy8gd2hlbiB0aGUgdGVzdHMgYXJlIGV4ZWN1dGVkIGFzIGFuIEFOVCB0YXNrLCB0aGV5IGFyZSBydW4gdW5kZXIKLQkJLy8gYW4gQU5UIGNsYXNzIGxvYWRlciBhbmQgdGhlICJKYXZhIiBjbGFzc3BhdGggZG9lcyBub3QgaW5jbHVkZSB0aGlzIGNsYXNzCi0JCWlmIChjbC5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzdW4ubWlzYyIpKSB7Ci0JCQlhc3NlcnRUcnVlKCJjbGFzcyBtaXNzaW5nOiAiICsgY2xhc3NOYW1lLCBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQ2xhc3NwYXRoLmphdmFDbGFzc3BhdGgoKS5nZXRDbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlQ2xhc3NwYXRoQ2xhc3NOYW1lcygpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCUNsYXNzTG9hZGVyIGNsID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7Ci0JCS8vIG1ha2Ugc3VyZSB3ZSBhcmUgcnVubmluZyB1bmRlciB0aGUgIm5vcm1hbCIgY2xhc3MgbG9hZGVyOwotCQkvLyB3aGVuIHRoZSB0ZXN0cyBhcmUgZXhlY3V0ZWQgYXMgYW4gQU5UIHRhc2ssIHRoZXkgYXJlIHJ1biB1bmRlcgotCQkvLyBhbiBBTlQgY2xhc3MgbG9hZGVyIGFuZCB0aGUgIkphdmEiIGNsYXNzcGF0aCBkb2VzIG5vdCBpbmNsdWRlIHRoaXMgY2xhc3MKLQkJaWYgKGNsLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInN1bi5taXNjIikpIHsKLQkJCWFzc2VydFRydWUoImNsYXNzIG1pc3Npbmc6ICIgKyBjbGFzc05hbWUsIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhDbGFzc3BhdGguY29tcGxldGVDbGFzc3BhdGgoKS5nZXRDbGFzc05hbWVzKCksIGNsYXNzTmFtZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzcGF0aEZvckNsYXNzKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5jbGFzc3BhdGhGb3IoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDbGFzc05hbWVzVG8oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDEwMDApOwotCQlDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmFkZENsYXNzTmFtZXNUbyhjbGFzc05hbWVzKTsKLQkJYXNzZXJ0VHJ1ZShjbGFzc05hbWVzLmNvbnRhaW5zKGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2dldENhbm9uaWNhbEZpbGUoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRyeS5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGF0aCgpLmVuZHNXaXRoKCIuamFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeV9nZXRDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldENhbm9uaWNhbEZpbGVOYW1lKCk7Ci0JCWlmIChUb29scy5qdm1Jc1N1bigpKSB7Ci0JCQlhc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInJ0LmphciIpKTsKLQkJfSBlbHNlIGlmIChUb29scy5qdm1Jc0lCTSgpKSB7Ci0JCQlhc3NlcnRUcnVlKG5hbWUuZW5kc1dpdGgoInZtLmphciIpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbnRyeV9lcXVhbHMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50cnkuZXF1YWxzKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zQ2xhc3MoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRyeS5jb250YWlucyhqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NvbnRhaW5zU3RyaW5nKCkgewotCQlDbGFzc3BhdGguRW50cnkgZW50cnkgPSBDbGFzc3BhdGguYm9vdENsYXNzcGF0aCgpLmdldEVudHJ5Rm9yQ2xhc3NOYW1lZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoZW50cnkuY29udGFpbnMoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cnlfZ2V0Q2xhc3NOYW1lcygpIHsKLQkJQ2xhc3NwYXRoLkVudHJ5IGVudHJ5ID0gQ2xhc3NwYXRoLmJvb3RDbGFzc3BhdGgoKS5nZXRFbnRyeUZvckNsYXNzTmFtZWQoamF2YS5sYW5nLlN0cmluZy5jbGFzcy5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhlbnRyeS5nZXRDbGFzc05hbWVzKCksIGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVudHJ5X2NsYXNzTmFtZXMoKSB7Ci0JCUNsYXNzcGF0aC5FbnRyeSBlbnRyeSA9IENsYXNzcGF0aC5ib290Q2xhc3NwYXRoKCkuZ2V0RW50cnlGb3JDbGFzc05hbWVkKGphdmEubGFuZy5TdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZW50cnkuY2xhc3NOYW1lcygpLCBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLmdldE5hbWUoKSkpOwotCX0KLQotCS8qKgotCSAqIG1vcnBoIHRoZSBzcGVjaWZpZWQgcGF0aCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaChTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gcGF0aDsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJ1xcJywgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoJzsnLCBGaWxlLnBhdGhTZXBhcmF0b3JDaGFyKTsKLQkJaWYgKCFBcnJheVRvb2xzLmNvbnRhaW5zKEZpbGUubGlzdFJvb3RzKCksIG5ldyBGaWxlKCJDOlxcIikpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUFsbCgiQzoiLCAiIik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBtb3JwaCB0aGUgc3BlY2lmaWVkIFVSTCB0byBhIHBsYXRmb3JtLWluZGVwZW5kZW50IHBhdGgKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtb3JwaFVSTChTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyByZXN1bHQgPSB1cmw7Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhGaWxlLmxpc3RSb290cygpLCBuZXcgRmlsZSgiQzpcXCIpKSkgewotCQkJcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoIi9DOiIsICIiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbGxlY3Rpb25Ub29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJiMDIyMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29sbGVjdGlvblRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuZW51bWVyYXRpb25zLkVtcHR5RW51bWVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbGxlY3Rpb25Ub29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYWxsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfU3RyaW5nTW9kaWZpZWQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGl0ZXJhYmxlMi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQxID0gdGhpcy5idWlsZFN0cmluZ1NldDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QxLmNvbnRhaW5zQWxsKChMaXN0PFN0cmluZz4pIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uSXRlcmFibGVfT2JqZWN0VW5tb2RpZmllZCgpIHsKLQkJU2V0PE9iamVjdD4gc2V0MSA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7IC8vIHNhbWUgZWxlbWVudHMgYXMgc2V0MQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGl0ZXJhYmxlMykpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0MS5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHNldDEuY29udGFpbnNBbGwoKExpc3Q8U3RyaW5nPikgaXRlcmFibGUzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYWJsZV9FbXB0eUl0ZXJhYmxlKCkgewotCQlTZXQ8T2JqZWN0PiBzZXQxID0gdGhpcy5idWlsZE9iamVjdFNldDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQxLCBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X01vZGlmaWVkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgaXRlcmFibGUyLCBsaXN0Mi5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QyKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzZXQxCi0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUzID0gbGlzdDE7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0MSwgaXRlcmFibGUzLCBsaXN0MS5zaXplKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZ1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QxID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVNldDxPYmplY3Q+IHNldDEgPSB0aGlzLmJ1aWxkT2JqZWN0U2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9Nb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdDEsIGxpc3QyLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdDEuY29udGFpbnNBbGwobGlzdDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X1VubW9kaWZpZWQoKSB7Ci0JCVNldDxTdHJpbmc+IHNldDEgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsgLy8gc2FtZSBlbGVtZW50cyBhcyBzMQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldDEsIGxpc3QzLml0ZXJhdG9yKCksIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNldDEuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQxLmNvbnRhaW5zQWxsKGxpc3QzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0MSwgRW1wdHlJdGVyYXRvci48U3RyaW5nPmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3QxLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdNb2RpZmllZCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdMaXN0RW1wdHlBcnJheSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9TdHJpbmdVbm1vZGlmaWVkKCkgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHNldCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2V0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoc2V0LmNvbnRhaW5zQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGEpKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmFkZEFsbChzZXQsIG5ldyBTdHJpbmdbMF0pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X1N0cmluZ1NldEVtcHR5QXJyYXkoKSB7Ci0JCVNldDxTdHJpbmc+IHNldCA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBuZXcgU3RyaW5nWzBdKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9PYmplY3RNb2RpZmllZCgpIHsKLQkJTGlzdDxPYmplY3Q+IGxpc3QgPSB0aGlzLmJ1aWxkT2JqZWN0TGlzdDEoKTsKLQkJU3RyaW5nW10gYSA9IHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgYSkpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X09iamVjdFVubW9kaWZpZWQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCVNldDxPYmplY3Q+IHNldCA9IHRoaXMuYnVpbGRPYmplY3RTZXQxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5hZGRBbGwoc2V0LCBhKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZXQuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzZXQuY29udGFpbnNBbGwoQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oYSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJYIiwgIlgiLCAiWCIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRPYmplY3RBcnJheV9aZXJvKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludE9iamVjdEFycmF5X0VtcHR5QXJyYXkoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgbmV3IFN0cmluZ1swXSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmFibGVfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlX0VtcHR5SXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhYmxlSW50X1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMCwgaXRlcmFibGUsIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiWCIsICJYIiwgIlgiIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYWJsZUludF9FbXB0eUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhYmxlLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJ6ZXJvIiwgIm9uZSIsICJ0d28iIH0sIGxpc3QudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbExpc3RJbnRJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDIsIGl0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgIlgiLCAiWCIsICJYIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX1plcm8oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJYIiwgIlgiLCAiWCIgfSkuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAwLCBpdGVyYXRvcik7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUobGlzdC5jb250YWlucygiWCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBPYmplY3RbXSB7ICJYIiwgIlgiLCAiWCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9yX0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IpOwotCQlhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsTGlzdEludEl0ZXJhdG9ySW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiWCIsICJYIiwgIlgiIH0pLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgMiwgaXRlcmF0b3IsIDMpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxpc3QuY29udGFpbnMoIlgiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAiWCIsICJYIiwgIlgiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfWmVybygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIlgiLCAiWCIsICJYIiB9KS5pdGVyYXRvcigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGxpc3QsIDAsIGl0ZXJhdG9yLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0LmNvbnRhaW5zKCJYIikpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IE9iamVjdFtdIHsgIlgiLCAiWCIsICJYIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxMaXN0SW50SXRlcmF0b3JJbnRfRW1wdHlJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCAyLCBpdGVyYXRvciwgMCk7Ci0JCWFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgT2JqZWN0W10geyAiemVybyIsICJvbmUiLCAidHdvIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBiYWcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX1N0cmluZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnRW51bWVyYXRpb25fT2JqZWN0KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uX0VtcHR5KCkgewotCQlCYWc8T2JqZWN0PiBiID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+YmFnKEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ0VudW1lcmF0aW9uSW50KCkgewotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdFbnVtZXJhdGlvbkludF9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoRW1wdHlFbnVtZXJhdGlvbi48U3RyaW5nPmluc3RhbmNlKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMCwgYi5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlCYWc8U3RyaW5nPiBiID0gQ29sbGVjdGlvblRvb2xzLmJhZyhpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfU3RyaW5nT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCUJhZzxPYmplY3Q+IGIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5iYWcoYy5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGIuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnQoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMpOwotCQlhc3NlcnRFcXVhbHMoMywgYi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGIuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnSXRlcmF0b3JJbnRfRW1wdHkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKEVtcHR5SXRlcmF0b3IuPFN0cmluZz5pbnN0YW5jZSgpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGIuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFnT2JqZWN0QXJyYXkoKSB7Ci0JCUJhZzxTdHJpbmc+IGIgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIChPYmplY3RbXSkgdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZ09iamVjdEFycmF5X1ZhcmFyZygpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoImZvbyIsICJiYXIiLCAiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCBiLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGIsIG5ldyBPYmplY3RbXXsiZm9vIiwgImJhciIsICJiYXoifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWdPYmplY3RBcnJheV9FbXB0eSgpIHsKLQkJQmFnPFN0cmluZz4gYiA9IENvbGxlY3Rpb25Ub29scy5iYWcoQmFnLkVtcHR5LjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiLnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25FbnVtZXJhdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpLmVsZW1lbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uRW51bWVyYXRpb25fT2JqZWN0U3RyaW5nKCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYyA9IENvbGxlY3Rpb25Ub29scy48T2JqZWN0PmNvbGxlY3Rpb24odGhpcy5idWlsZFN0cmluZ1ZlY3RvcjEoKS5lbGVtZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkVudW1lcmF0aW9uSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCkuZWxlbWVudHMoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGl0ZXJhYmxlLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+Y29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25JdGVyYXRvckludCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25PYmplY3RBcnJheSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjLCAoT2JqZWN0W10pIHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250YWlucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNFbnVtZXJhdGlvbk9iamVjdF9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSB0aGlzLmJ1aWxkU3RyaW5nVmVjdG9yMSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksICJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh2LmVsZW1lbnRzKCksIG51bGwpKTsKLQkJdi5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHYuZWxlbWVudHMoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0VudW1lcmF0aW9uT2JqZWN0X09iamVjdCgpIHsKLQkJVmVjdG9yPE9iamVjdD4gYyA9IG5ldyBWZWN0b3I8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuZWxlbWVudHMoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5lbGVtZW50cygpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zSXRlcmFibGVPYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBjOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGl0ZXJhYmxlLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhpdGVyYWJsZSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0l0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCAib25lIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWMuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjLml0ZXJhdG9yKCksIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNJdGVyYXRvck9iamVjdF9PYmplY3QoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEhhc2hCYWc8T2JqZWN0PigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCVN0cmluZyBvbmUgPSAib25lIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBvbmUpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGMuaXRlcmF0b3IoKSwgbnVsbCkpOwotCQljLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYy5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5zIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uSXRlcmF0b3JfT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPE9iamVjdD4gYzEgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJYzEuYWRkKCJ6ZXJvIik7Ci0JCWMxLmFkZCgib25lIik7Ci0JCWMxLmFkZCgidHdvIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoInR3byIpOwotCQljMi5hZGQoInplcm8iKTsKLQkJYzIuYWRkKCJvbmUiKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoYzEsIGMyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfU3RyaW5nT2JqZWN0KCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5KCkgewotCQlPYmplY3RbXSBhID0gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRDb2xsZWN0aW9uKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCAzLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTIgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUxLCAzLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGl0ZXJhYmxlLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmFibGVJbnRJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChpdGVyYWJsZSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhYmxlSW50T2JqZWN0QXJyYXkoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoaXRlcmFibGUsIDMsIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9TdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yQ29sbGVjdGlvbl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySW50Q29sbGVjdGlvbigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSwgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDUsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCBpdGVyYWJsZSkpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNBbGxJdGVyYXRvckludEl0ZXJhYmxlKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDMsIGl0ZXJhYmxlKSk7Ci0JCWl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCBpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9ySXRlcmF0b3JfU3RyaW5nU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjMSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQljMS5hZGQoInplcm8iKTsKLQkJYzEuYWRkKCJvbmUiKTsKLQkJYzEuYWRkKCJ0d28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjMS5pdGVyYXRvcigpLCBjMi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRJdGVyYXRvcigpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZFN0cmluZ0xpc3QyKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIHRoaXMuYnVpbGRPYmplY3RBcnJheTEoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsSXRlcmF0b3JJbnRPYmplY3RBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkVuZExpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmRpZmZFbmQobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJhIikpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYiIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImMiKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuZGlmZlJhbmdlKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaWZmU3RhcnRMaXN0TGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiYSIpOwotCQlsaXN0MS5hZGQoImIiKTsKLQkJbGlzdDEuYWRkKCJjIik7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0Mi5hZGQobmV3IFN0cmluZygiYSIpKTsKLQkJbGlzdDIuYWRkKG5ldyBTdHJpbmcoImIiKSk7Ci0JCWxpc3QyLmFkZChuZXcgU3RyaW5nKCJjIikpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLmRpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWRlbnRpdHkgZGlmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRlbnRpdHlEaWZmRW5kTGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmRW5kKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZGVudGl0eURpZmZSYW5nZUxpc3RMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCJhIik7Ci0JCWxpc3QxLmFkZCgiYiIpOwotCQlsaXN0MS5hZGQoImMiKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QyLmFkZCgiYSIpOwotCQlsaXN0Mi5hZGQoImIiKTsKLQkJbGlzdDIuYWRkKCJjIik7Ci0JCWFzc2VydEVxdWFscyhuZXcgUmFuZ2UoMywgLTEpLCBDb2xsZWN0aW9uVG9vbHMuaWRlbnRpdHlEaWZmUmFuZ2UobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElkZW50aXR5RGlmZlN0YXJ0TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoImEiKTsKLQkJbGlzdDEuYWRkKCJiIik7Ci0JCWxpc3QxLmFkZCgiYyIpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDIuYWRkKCJhIik7Ci0JCWxpc3QyLmFkZCgiYiIpOwotCQlsaXN0Mi5hZGQoImMiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5pZGVudGl0eURpZmZTdGFydChsaXN0MSwgbGlzdDIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGVxdWFsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZURpZmZlcmVudEl0ZXJhYmxlSXRlcmFibGUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjEwMDAiKTsKLQkJbGlzdDEuYWRkKCIyMDAwIik7Ci0JCWxpc3QxLmFkZCgiMzAwMCIpOwotCQlsaXN0MS5hZGQoIjQwMDAiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZURpZmZlcmVudChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRGlmZmVyZW50SXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEsIGxpc3QyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRXF1YWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIxMDAwIik7Ci0JCWxpc3QxLmFkZCgiMjAwMCIpOwotCQlsaXN0MS5hZGQoIjMwMDAiKTsKLQkJbGlzdDEuYWRkKCI0MDAwIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdDEuc2l6ZSgpOyBpKyspIHsKLQkJCWxpc3QyLmFkZChTdHJpbmcudmFsdWVPZigoaSArIDEpICogMTAwMCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MSwgbGlzdDIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KGxpc3QxLCBsaXN0MikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLCBsaXN0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZUVxdWFsSXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMTAwMCIpOwotCQlsaXN0MS5hZGQoIjIwMDAiKTsKLQkJbGlzdDEuYWRkKCIzMDAwIik7Ci0JCWxpc3QxLmFkZCgiNDAwMCIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QxLnNpemUoKTsgaSsrKSB7Ci0JCQlsaXN0Mi5hZGQoU3RyaW5nLnZhbHVlT2YoKGkgKyAxKSAqIDEwMDApKTsKLQkJfQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVEaWZmZXJlbnQobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZWxlbWVudHMgYXJlIGlkZW50aWNhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDE7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoaXRlcmFibGUxLCBpdGVyYWJsZTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVJZGVudGljYWxJdGVyYXRvckl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlSWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlSWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcl9EaWZmZXJlbnRTaXplcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlsaXN0Mi5yZW1vdmUoMyk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVOb3RJZGVudGljYWxJdGVyYWJsZUl0ZXJhYmxlKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdDEuYWRkKCIwIik7Ci0JCWxpc3QxLmFkZCgiMSIpOwotCQlsaXN0MS5hZGQoIjIiKTsKLQkJbGlzdDEuYWRkKCIzIik7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUxID0gbGlzdDE7Ci0KLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoU3RyaW5nIHMgOiBsaXN0MSkgewotCQkJbGlzdDIuYWRkKHMpOwotCQl9Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gbGlzdDI7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZU5vdElkZW50aWNhbChpdGVyYWJsZTEsIGl0ZXJhYmxlMikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGl0ZXJhYmxlMSwgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlTm90SWRlbnRpY2FsSXRlcmF0b3JJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVOb3RJZGVudGljYWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVOb3RJZGVudGljYWxJdGVyYXRvckl0ZXJhdG9yX05vdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QxLmFkZCgiMCIpOwotCQlsaXN0MS5hZGQoIjEiKTsKLQkJbGlzdDEuYWRkKCIyIik7Ci0JCWxpc3QxLmFkZCgiMyIpOwotCi0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKFN0cmluZyBzIDogbGlzdDEpIHsKLQkJCWxpc3QyLmFkZChzKTsKLQkJfQotCQlsaXN0Mi5yZW1vdmUoMCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlTm90SWRlbnRpY2FsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwobGlzdDEuaXRlcmF0b3IoKSwgbGlzdDIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50c0FyZU5vdElkZW50aWNhbEl0ZXJhdG9ySXRlcmF0b3JfRGlmZmVyZW50U2l6ZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QxKSB7Ci0JCQlsaXN0Mi5hZGQocyk7Ci0JCX0KLQkJbGlzdDIucmVtb3ZlKDMpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZU5vdElkZW50aWNhbChsaXN0MS5pdGVyYXRvcigpLCBsaXN0Mi5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKGxpc3QxLml0ZXJhdG9yKCksIGxpc3QyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVyYWJsZUludCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVN0cmluZyBvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChpdGVyYWJsZSwgMyk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJU3RyaW5nIG8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGxpc3QuaXRlcmF0b3IoKSwgMSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbyk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlvID0gQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpIC0gMSk7Ci0JCWFzc2VydE51bGwobyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEl0ZXJhdG9ySW50MigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ29sbGVjdGlvblRvb2xzLmdldChsaXN0Lml0ZXJhdG9yKCksIGxpc3Quc2l6ZSgpKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXNoIGNvZGUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlSXRlcmFibGUxKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbnVsbDsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZUl0ZXJhYmxlMigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWludCBoYXNoQ29kZSA9IENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZShpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscyhsaXN0Lmhhc2hDb2RlKCksIGhhc2hDb2RlKTsKLQotCQlsaXN0LmFkZChudWxsKTsKLQkJaGFzaENvZGUgPSBDb2xsZWN0aW9uVG9vbHMuaGFzaENvZGUoaXRlcmFibGUpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5oYXNoQ29kZSgpLCBoYXNoQ29kZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluZGV4IG9mICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmFibGVPYmplY3RfU3RyaW5nKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihpdGVyYWJsZSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgIm9uZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkl0ZXJhdG9yT2JqZWN0X1N0cmluZ19Ob3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCAic2hhemFtIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfTnVsbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGxpc3QuaXRlcmF0b3IoKSwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfT2JqZWN0KCkgewotCQlMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMSIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCi0JCVN0cmluZyBvbmUgPSAiMSI7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIG9uZSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGlvbiBpbmRleCBvZiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0aW9uSW5kZXhPZkxpc3RDb21wYXJhYmxlUmFuZG9tQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJCIikpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoNiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkUiKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQSIpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydGlvbkluZGV4T2ZMaXN0Q29tcGFyYWJsZU5vblJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQyIsICJEIiB9KSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiB9KSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIikpOwotCi0JCWxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkIiLCAiQiIsICJCIiwgIkMiLCAiRCIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiQSIsICJBIiwgIkIiLCAiQiIsICJDIiwgIkQiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mTGlzdE9iamVjdENvbXBhcmF0b3JSYW5kb21BY2Nlc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQSIgfSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIiwgYykpOwotCi0JCWxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiIH0pOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0KLQkJbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQSIsICJBIiB9KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIiwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnNlcnRpb25JbmRleE9mTGlzdE9iamVjdENvbXBhcmF0b3JOb25SYW5kb21BY2Nlc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiBjID0gbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJBIiB9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJBIiB9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZihsaXN0LCAiQiIsIGMpKTsKLQotCQlsaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJEIiwgIkMiLCAiQiIsICJCIiwgIkIiLCAiQSIgfSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkIiLCBjKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJCIiwgIkEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJFIiwgYykpOwotCi0JCWxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkQiLCAiQyIsICJCIiwgIkIiLCAiQiIgfSkpOwotCQlhc3NlcnRFcXVhbHMoNSwgQ29sbGVjdGlvblRvb2xzLmluc2VydGlvbkluZGV4T2YobGlzdCwgIkEiLCBjKSk7Ci0KLQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiRCIsICJDIiwgIkIiLCAiQiIsICJBIiwgIkEiIH0pKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKGxpc3QsICJBIiwgYykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpcyBlbXB0eSAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHlJdGVyYWJsZSgpIHsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYnVpbGRPYmplY3RMaXN0MSgpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGJ1aWxkT2JqZWN0TGlzdDEoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogaXRlcmFibGUvaXRlcmF0b3IgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhYmxlT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIHN0cmluZ3MgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHN0cmluZ3MpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyaW5nc1tpKytdLCBzdHJpbmcpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGFzdCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEl0ZXJhYmxlMSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgQ29sbGVjdGlvblRvb2xzLmxhc3QoaXRlcmFibGUpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBDb2xsZWN0aW9uVG9vbHMubGFzdChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmFibGUyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNvbGxlY3Rpb25Ub29scy5sYXN0KGl0ZXJhYmxlKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIENvbGxlY3Rpb25Ub29scy5sYXN0KGxpc3QuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SXRlcmF0b3IyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uVG9vbHMubGFzdChsaXN0Lml0ZXJhdG9yKCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxhc3QgaW5kZXggb2YgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAib25lIikpOwotCQlsaXN0LmFkZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGxpc3Quc2l6ZSgpIC0gMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmFibGVJbnRPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBsaXN0OwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKGl0ZXJhYmxlLCAyMywgIm9uZSIpKTsKLQkJbGlzdC5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsaXN0LnNpemUoKSAtIDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihpdGVyYWJsZSwgNDIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvck9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGFzdEluZGV4T2ZJdGVyYXRvckludE9iamVjdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5sYXN0SW5kZXhPZihsaXN0Lml0ZXJhdG9yKCksIDMsICJvbmUiKSk7Ci0JCWxpc3QuYWRkKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobGlzdC5zaXplKCkgLSAxLCBDb2xsZWN0aW9uVG9vbHMubGFzdEluZGV4T2YobGlzdC5pdGVyYXRvcigpLCA0LCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhc3RJbmRleE9mSXRlcmF0b3JJbnRPYmplY3RfRW1wdHkoKSB7Ci0JCWFzc2VydEVxdWFscygtMSwgQ29sbGVjdGlvblRvb2xzLmxhc3RJbmRleE9mKEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNDIsICJmb28iKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlLCAzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvcl9TdHJpbmdPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0MS5hZGQoIjAiKTsKLQkJbGlzdDEuYWRkKCIxIik7Ci0JCWxpc3QxLmFkZCgiMiIpOwotCQlsaXN0MS5hZGQoIjMiKTsKLQotCQlMaXN0PE9iamVjdD4gbGlzdDIgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5saXN0KGxpc3QxLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMobGlzdDEsIGxpc3QyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yX0VtcHR5KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLmxpc3QoRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMyk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvckludF9FbXB0eSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5saXN0KEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgNSkuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdE9iamVjdEFycmF5KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RJdGVyYXRvck9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gdGhpcy5idWlsZFN0cmluZ0FycmF5MSgpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLmxpc3RJdGVyYXRvcihhKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoYVtpXSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yT2JqZWN0QXJyYXlJbnQoKSB7Ci0JCVN0cmluZ1tdIGEgPSB0aGlzLmJ1aWxkU3RyaW5nQXJyYXkxKCk7Ci0JCWludCBpID0gMTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMubGlzdEl0ZXJhdG9yKGEsIDEpOyBzdHJlYW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhhW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3ZlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChsaXN0LCBuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pOwotCi0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCA0LCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIsICI1IiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMCwgNSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMSIsICIzIiwgIjQiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDIsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjQiLCAiMSIsICIzIiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCAyKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVMaXN0SW50SW50U2VxdWVudGlhbEFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwobGlzdCwgbmV3IFN0cmluZ1tdIHsgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiB9KTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiNCIsICIxIiwgIjMiLCAiMiIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTGlzdEludEludEludFJhbmRvbUFjY2VzcygpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUxpc3RJbnRJbnRJbnRTZXF1ZW50aWFsQWNjZXNzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiIH0pKTsKLQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgNCwgMiwgMSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiLCAiNSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDUsIDEpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjEiLCAiMyIsICI0IiwgIjIiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAyLCA0LCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICI0IiwgIjEiLCAiMyIsICIyIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMiwgNCwgMik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDAsIDEsIDQpOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiMCIsICIzIiwgIjIiLCAiNCIsICI1IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQotCQlyZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMubW92ZShsaXN0LCAxLCAwLCA0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOyAgLy8gdGhlIGFycmF5IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZAotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIjUiLCAiMCIsICIzIiwgIjIiLCAiNCIsICIxIiB9LCByZXN1bHQudG9BcnJheSgpKSk7Ci0KLQkJcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLm1vdmUobGlzdCwgMSwgMSwgNCk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsgIC8vIHRoZSBhcnJheSBpcyBtb2RpZmllZCBpbiBwbGFjZSBhbmQgcmV0dXJuZWQKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICI1IiwgIjAiLCAiMyIsICIyIiwgIjQiLCAiMSIgfSwgcmVzdWx0LnRvQXJyYXkoKSkpOwotCi0JCXJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5tb3ZlKGxpc3QsIDEsIDAsIDApOwotCQlhc3NlcnRTYW1lKGxpc3QsIHJlc3VsdCk7ICAvLyB0aGUgYXJyYXkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiNSIsICIwIiwgIjMiLCAiMiIsICI0IiwgIjEiIH0sIHJlc3VsdC50b0FycmF5KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhYmxlSW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYWJsZSwgNCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhYmxlLCA1NSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQljID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgNSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidGhyZWUiKSk7Ci0KLQkJYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpLml0ZXJhdG9yKCksIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uSXRlcmF0b3JfRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgaXRlcmF0b3IpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJaXRlcmF0b3IgPSBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25JdGVyYXRvcl9PYmplY3RTdHJpbmcoKSB7Ci0JCUNvbGxlY3Rpb248T2JqZWN0PiBjID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsKGMsIGl0ZXJhdG9yKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWl0ZXJhdG9yID0gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihhKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBpdGVyYXRvcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXlfRW1wdHkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkxKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCB0aGlzLmJ1aWxkT2JqZWN0QXJyYXkyKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0R1cGxpY2F0ZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJhIik7Ci0JCWMuYWRkKCJiIik7Ci0JCWMuYWRkKCJjIik7Ci0JCWMuYWRkKCJkIik7Ci0JCWMuYWRkKCJkIik7Ci0JCVN0cmluZ1tdIGEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJkIiB9OwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywgKE9iamVjdFtdKSBhKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImEiKSk7Ci0JCWFzc2VydFRydWUoYy5jb250YWlucygiYiIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJjIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJkIikpOwotCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGwoYywoT2JqZWN0W10pICBhKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9Nb3JlRHVwbGljYXRlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImIiKTsKLQkJYy5hZGQoImMiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImQiKTsKLQkJYy5hZGQoImEiKTsKLQkJYy5hZGQoImMiKTsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbXSB7ICJhIiwgImQiIH07Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygiYSIpKTsKLQkJYXNzZXJ0VHJ1ZShjLmNvbnRhaW5zKCJiIikpOwotCQlhc3NlcnRUcnVlKGMuY29udGFpbnMoImMiKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoImQiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbChjLCAoT2JqZWN0W10pIGEpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGFsbCBvY2N1cnJlbmNlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNDb2xsZWN0aW9uT2JqZWN0KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgYy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAidHdvIikpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoYywgInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQljLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRFcXVhbHMoNSwgYy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVBbGxPY2N1cnJlbmNlcyhjLCAiZml2ZSIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsICJmaXZlIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgYy5zaXplKCkpOwotCi0JCWMuYWRkKG51bGwpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscyg1LCBjLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGMsIG51bGwpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGVsZW1lbnRzIGF0IGluZGV4ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVFbGVtZW50c0F0SW5kZXhMaXN0SW50SW50KCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQSIsICJDIiwgIkEiLCAiRCIgfSkpOwotCQlMaXN0PFN0cmluZz4gcmVtb3ZlZCA9IENvbGxlY3Rpb25Ub29scy5yZW1vdmVFbGVtZW50c0F0SW5kZXgobGlzdCwgMywgMik7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgU3RyaW5nW10geyAiQSIsICJCIiwgIkEiLCAiRCIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJDIiwgIkEiIH0sIHJlbW92ZWQudG9BcnJheSgpKSk7Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIsICJEIiwgIkUiLCAiRiIgfSkpOwotCQlyZW1vdmVkID0gQ29sbGVjdGlvblRvb2xzLnJlbW92ZUVsZW1lbnRzQXRJbmRleChsaXN0LCAzLCAzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJBIiwgIkIiLCAiQyIgfSwgbGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBTdHJpbmdbXSB7ICJEIiwgIkUiLCAiRiIgfSwgcmVtb3ZlZC50b0FycmF5KCkpKTsKLQotCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiwgIkQiLCAiRSIsICJGIiB9KSk7Ci0JCXJlbW92ZWQgPSBDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRWxlbWVudHNBdEluZGV4KGxpc3QsIDAsIDMpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkQiLCAiRSIsICJGIiB9LCBsaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IFN0cmluZ1tdIHsgIkEiLCAiQiIsICJDIiB9LCByZW1vdmVkLnRvQXJyYXkoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgZHVwbGljYXRlIGVsZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJ0d28iKTsKLQkJbGlzdC5hZGQoInplcm8iKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmVtb3ZlRHVwbGljYXRlRWxlbWVudHMobGlzdCkpOwotCQlpbnQgaSA9IDA7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIGxpc3QuZ2V0KGkrKykpOwotCQlhc3NlcnRFcXVhbHMoaSwgbGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEdXBsaWNhdGVFbGVtZW50c0xpc3QyKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IHRoaXMuYnVpbGRTdHJpbmdWZWN0b3IxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWludCBpID0gMDsKLQkJYXNzZXJ0RXF1YWxzKCJ6ZXJvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgbGlzdC5nZXQoaSsrKSk7Ci0JCWFzc2VydEVxdWFscyhpLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzTGlzdF9FbXB0eSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJlbW92ZUR1cGxpY2F0ZUVsZW1lbnRzKGxpc3QpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRHVwbGljYXRlRWxlbWVudHNMaXN0X1NpbmdsZUVsZW1lbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZW1vdmVEdXBsaWNhdGVFbGVtZW50cyhsaXN0KSk7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJldGFpbiBhbGwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYWJsZSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MigpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgaXRlcmFibGUpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmFibGVJbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBpdGVyYWJsZSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuc2l6ZSgpLCBjLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSwgYyk7Ci0KLQkJaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIGl0ZXJhYmxlLCA3KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9yX09iamVjdFN0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxPYmplY3Q+IGMxID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCWMxLmFkZCgiemVybyIpOwotCQljMS5hZGQoIm9uZSIpOwotCQljMS5hZGQoInR3byIpOwotCQkKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiemVybyIpOwotCQljMi5hZGQoIm9uZSIpOwotCQljMi5hZGQoInR3byIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjMSwgYzIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoYzIuc2l6ZSgpLCBjMS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoYzIsIGMxKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzMuYWRkKCJ0aHJlZSIpOwotCQljMy5hZGQoImZvdXIiKTsKLQkJYzMuYWRkKCJmaXZlIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvcl9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uSXRlcmF0b3JfRW1wdHlDb2xsZWN0aW9uRW1wdHlJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLnNpemUoKSwgYy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ0xpc3QxKCksIGMpOwotCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDIoKS5pdGVyYXRvcigpLCA5KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCksIDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbkl0ZXJhdG9ySW50X0VtcHR5Q29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpLCAzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25JdGVyYXRvckludF9FbXB0eUNvbGxlY3Rpb25FbXB0eUl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKSwgMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5BbGxDb2xsZWN0aW9uT2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MSgpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5zaXplKCksIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLCBjKTsKLQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgdGhpcy5idWlsZE9iamVjdEFycmF5MigpKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKGMuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UoYy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZShjLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluQWxsQ29sbGVjdGlvbk9iamVjdEFycmF5X0VtcHR5T2JqZWN0QXJyYXkoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnJldGFpbkFsbChjLCBuZXcgT2JqZWN0WzBdKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5yZXRhaW5BbGwoYywgKE9iamVjdFtdKSBuZXcgU3RyaW5nW10geyAiZm9vIiB9KSk7Ci0JCWFzc2VydEVxdWFscygwLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbENvbGxlY3Rpb25PYmplY3RBcnJheV9FbXB0eUNvbGxlY3Rpb25FbXB0eU9iamVjdEFycmF5KCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMucmV0YWluQWxsKGMsIChPYmplY3RbXSkgbmV3IFN0cmluZ1swXSkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYy5zaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXZlcnNlIGxpc3QgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbCA9IENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdChpdGVyYWJsZSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yZXZlcnNlKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXZlcnNlTGlzdEl0ZXJhYmxlSW50KCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QoaXRlcmFibGUsIDEwKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JfU3RyaW5nKCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJldmVyc2VMaXN0KHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV2ZXJzZUxpc3RJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8T2JqZWN0PiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKS5pdGVyYXRvcigpKTsKLQkJTGlzdDxPYmplY3Q+IGV4cGVjdGVkID0gdGhpcy5idWlsZE9iamVjdExpc3QxKCk7Ci0JCUNvbGxlY3Rpb25zLnJldmVyc2UoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldmVyc2VMaXN0SXRlcmF0b3JJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZUxpc3QodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkuaXRlcmF0b3IoKSwgMzMpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJQ29sbGVjdGlvbnMucmV2ZXJzZShleHBlY3RlZCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm90YXRlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSb3RhdGVMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYWN0dWFsID0gQ29sbGVjdGlvblRvb2xzLnJvdGF0ZSh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZCA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlDb2xsZWN0aW9ucy5yb3RhdGUoZXhwZWN0ZWQsIDEpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNldCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SXRlcmFibGUoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldChpdGVyYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdTZXQxKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KGl0ZXJhYmxlLCAyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVyYXRvcl9PYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCVNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJc2V0LmFkZEFsbChsaXN0KTsKLQotCQlhc3NlcnRFcXVhbHMoc2V0LCBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zZXQobGlzdC5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCksIDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0QXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLCBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuYnVpbGRTdHJpbmdTZXQxKCkudG9BcnJheSgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiBpdGVyYXRvciAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uSXRlcmF0b3JfU3RyaW5nKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IENvbGxlY3Rpb25Ub29scy5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX09iamVjdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBDb2xsZWN0aW9uVG9vbHMuPE9iamVjdD5zaW5nbGV0b25JdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkl0ZXJhdG9yX0Nhc3QoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkl0ZXJhdG9yKChPYmplY3QpICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShzdHJlYW0uaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uTGlzdEl0ZXJhdG9yX1N0cmluZygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gQ29sbGVjdGlvblRvb2xzLnNpbmdsZXRvbkxpc3RJdGVyYXRvcigiZm9vIik7Ci0JCWFzc2VydFRydWUoc3RyZWFtLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHN0cmVhbS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKHN0cmVhbS5oYXNQcmV2aW91cygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNpemUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNpemVJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8T2JqZWN0PiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRPYmplY3RMaXN0MSgpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmFibGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZUl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5idWlsZE9iamVjdExpc3QxKCkuaXRlcmF0b3IoKSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHNvcnQgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MsIGl0ZXJhYmxlMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmFibGVDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCkpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZTEgPSBsaXN0OwotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmFibGUxLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYWJsZUNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlMSA9IGxpc3Q7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYWJsZTEsIG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCksIDc3KTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbChzcywgaXRlcmFibGUyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjEgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydChpdGVyYXRvcjEpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0SXRlcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MuYWRkQWxsKGxpc3QpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IxID0gbGlzdC5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnQoaXRlcmF0b3IxLCA3Nyk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoc3MuaXRlcmF0b3IoKSwgaXRlcmF0b3IyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRJdGVyYXRvckNvbXBhcmF0b3JJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yMSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcjIgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zb3J0KGl0ZXJhdG9yMSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNzcpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLml0ZXJhdG9yKCksIGl0ZXJhdG9yMikpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzb3J0ZWQgc2V0ICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYWJsZSgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gbGlzdDsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MyID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c29ydGVkU2V0KGl0ZXJhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKHNzMSwgc3MyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmFibGVJbnQoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoIjAiKTsKLQkJbGlzdC5hZGQoIjIiKTsKLQkJbGlzdC5hZGQoIjMiKTsKLQkJbGlzdC5hZGQoIjEiKTsKLQotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzczEgPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvcigpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhYmxlQ29tcGFyYXRvckludCgpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMCIpOwotCQlsaXN0LmFkZCgiMiIpOwotCQlsaXN0LmFkZCgiMyIpOwotCQlsaXN0LmFkZCgiMSIpOwotCi0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMSA9IG5ldyBUcmVlU2V0PFN0cmluZz4obmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXNzMS5hZGRBbGwobGlzdCk7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IGxpc3Q7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChpdGVyYWJsZSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSwgNSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0SXRlcmF0b3JfVHJlZVNldCgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzczEuYWRkKCIwIik7Ci0JCXNzMS5hZGQoIjIiKTsKLQkJc3MxLmFkZCgiMyIpOwotCQlzczEuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc2V0MiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChzczEuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNldDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXRJdGVyYXRvckludCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRTb3J0ZWRTdHJpbmdTZXQxKCksIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQodGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKS5pdGVyYXRvcigpLCA4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldE9iamVjdEFycmF5KCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNvcnRlZFN0cmluZ1NldDEoKSwgQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmJ1aWxkU3RyaW5nU2V0MSgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2JqZWN0QXJyYXlDb21wYXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCIwIik7Ci0JCWxpc3QuYWRkKCIyIik7Ci0JCWxpc3QuYWRkKCIzIik7Ci0JCWxpc3QuYWRkKCIxIik7Ci0KLQkJU29ydGVkU2V0PFN0cmluZz4gc3MxID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJc3MxLmFkZEFsbChsaXN0KTsKLQotCQlTdHJpbmdbXSBhcnJheSA9IGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzMiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNvcnRlZFNldChhcnJheSwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyhzczEsIHNzMik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9sZCBTY2hvb2wgVmVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZSgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYWJsZUludCgpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpOwotCQlWZWN0b3I8U3RyaW5nPiB2ID0gQ29sbGVjdGlvblRvb2xzLnZlY3RvcihpdGVyYWJsZSwgOCk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZWN0b3JJdGVyYXRvcl9TdHJpbmcoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JfT2JqZWN0KCkgewotCQlWZWN0b3I8T2JqZWN0PiB2ID0gQ29sbGVjdGlvblRvb2xzLjxPYmplY3Q+dmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9ySXRlcmF0b3JJbnQoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdMaXN0MSgpLml0ZXJhdG9yKCksIDcpOwotCQlhc3NlcnRFcXVhbHMoMywgdi5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnNBbGwodGhpcy5idWlsZFN0cmluZ0xpc3QxKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVjdG9yT2JqZWN0QXJyYXkoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKHRoaXMuYnVpbGRTdHJpbmdBcnJheTEoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB2LnNpemUoKSk7Ci0JCWFzc2VydFRydWUodi5jb250YWluc0FsbCh0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzaW5nbGUtdXNlIGl0ZXJhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVtcHR5SXRlcmFibGUuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWVtcHR5SXRlcmF0b3IgPSBlbXB0eUl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGl0ZXJhdG9yOiAiICsgZW1wdHlJdGVyYXRvcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24uIiwgZXhjZXB0aW9uVGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmFibGVJdGVyYXRvcl9OUEUoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gbnVsbEl0ZXJhdG9yID0gbnVsbDsKLQkJYm9vbGVhbiBleGNlcHRpb25UaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShudWxsSXRlcmF0b3IpOwotCQkJZmFpbCgiaW52YWxpZCBpdGVyYWJsZTogIiArIGVtcHR5SXRlcmFibGUpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBpc2UpIHsKLQkJCWV4Y2VwdGlvblRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleGNlcHRpb25UaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYWJsZUl0ZXJhdG9yX1RvU3RyaW5nKCkgewotCQlJdGVyYXRvcjxPYmplY3Q+IGVtcHR5SXRlcmF0b3IgPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gZW1wdHlJdGVyYWJsZSA9IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShlbXB0eUl0ZXJhdG9yKTsKLQkJYXNzZXJ0Tm90TnVsbChlbXB0eUl0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMgZW5oYW5jZW1lbnRzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5TGlzdExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzcmMgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGRlc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgcyA6IHNyYykgewotCQkJZGVzdC5hZGQocy50b1VwcGVyQ2FzZSgpKTsKLQkJfQotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLmNvcHkoZGVzdCwgc3JjKTsKLQkJYXNzZXJ0U2FtZShkZXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUlkZW50aWNhbChzcmMsIGRlc3QpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsbExpc3RPYmplY3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuZmlsbChsaXN0LCAiZm9vIik7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogcmVzdWx0KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0cmluZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2h1ZmZsZUxpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc2h1ZmZsZShsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaHVmZmxlTGlzdFJhbmRvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5zaHVmZmxlKGxpc3QsIG5ldyBSYW5kb20oKSk7Ci0JCWFzc2VydFNhbWUobGlzdCwgcmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U29ydExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCVNvcnRlZFNldDxTdHJpbmc+IHNzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOwotCQlzcy5hZGRBbGwobGlzdCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc29ydChsaXN0KTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5lbGVtZW50c0FyZUVxdWFsKHNzLCByZXN1bHQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3dhcExpc3RJbnRJbnQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gdGhpcy5idWlsZFN0cmluZ0xpc3QxKCk7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBDb2xsZWN0aW9uVG9vbHMuc3dhcChsaXN0LCAwLCAxKTsKLQkJYXNzZXJ0U2FtZShsaXN0LCByZXN1bHQpOwotCQlMaXN0PFN0cmluZz4gb3JpZ2luYWwgPSB0aGlzLmJ1aWxkU3RyaW5nTGlzdDEoKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmdldCgwKSwgcmVzdWx0LmdldCgxKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5nZXQoMSksIHJlc3VsdC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuZ2V0KDIpLCByZXN1bHQuZ2V0KDIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU9iamVjdCBhdCA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShDb2xsZWN0aW9uVG9vbHMuY2xhc3MpOwotCQkJZmFpbCgiYm9ndXM6ICIgKyBhdCk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRlc3QgaGFybmVzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGJ1aWxkU3RyaW5nQXJyYXkxKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgInplcm8iLCAib25lIiwgInR3byIgfTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGJ1aWxkT2JqZWN0QXJyYXkyKCkgewotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHsgInRocmVlIiwgImZvdXIiLCAiZml2ZSIgfTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxTdHJpbmc+IGJ1aWxkU3RyaW5nVmVjdG9yMSgpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl0aGlzLmFkZFRvQ29sbGVjdGlvbjEodik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDEoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMShsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PE9iamVjdD4gYnVpbGRPYmplY3RMaXN0MSgpIHsKLQkJTGlzdDxPYmplY3Q+IGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKGwpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9Db2xsZWN0aW9uMShDb2xsZWN0aW9uPD8gc3VwZXIgU3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJ6ZXJvIik7Ci0JCWMuYWRkKCJvbmUiKTsKLQkJYy5hZGQoInR3byIpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3RyaW5nTGlzdDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRkVG9Db2xsZWN0aW9uMihsKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQ29sbGVjdGlvbjIoQ29sbGVjdGlvbjw/IHN1cGVyIFN0cmluZz4gYykgewotCQljLmFkZCgidGhyZWUiKTsKLQkJYy5hZGQoImZvdXIiKTsKLQkJYy5hZGQoImZpdmUiKTsKLQl9Ci0KLQlwcml2YXRlIFNldDxTdHJpbmc+IGJ1aWxkU3RyaW5nU2V0MSgpIHsKLQkJU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNldDxPYmplY3Q+IGJ1aWxkT2JqZWN0U2V0MSgpIHsKLQkJU2V0PE9iamVjdD4gcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkU3RyaW5nU2V0MSgpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gcyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGRUb0NvbGxlY3Rpb24xKHMpOwotCQlyZXR1cm4gczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kRXhlY3V0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5M2I5YzkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRFeGVjdXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcjsKLQotcHVibGljIGNsYXNzIENvbW1hbmRFeGVjdXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQotCXB1YmxpYyBDb21tYW5kRXhlY3V0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRFeGVjdXRvcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yID0gQ29tbWFuZEV4ZWN1dG9yLkRlZmF1bHQuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21tYW5kRXhlY3V0b3IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRDb21tYW5kRXhlY3V0b3Jfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yMSA9IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCUNvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShjb21tYW5kRXhlY3V0b3IxKTsKLQkJYXNzZXJ0U2FtZShjb21tYW5kRXhlY3V0b3IxLCBjb21tYW5kRXhlY3V0b3IyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbW1hbmRFeGVjdXRvcigpIHsKLQkJVGVzdENvbW1hbmQgdGVzdENvbW1hbmQgPSBuZXcgVGVzdENvbW1hbmQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlc3RDb21tYW5kLmNvdW50KTsKLQkJQ29tbWFuZEV4ZWN1dG9yIGNvbW1hbmRFeGVjdXRvciA9IENvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JCWNvbW1hbmRFeGVjdXRvci5leGVjdXRlKHRlc3RDb21tYW5kKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RDb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcl90b1N0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yID0gbmV3IFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZEV4ZWN1dG9yLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciB0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciA9IG5ldyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpOwotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMSA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIDEpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMSk7Ci0JCXRocmVhZDEucnVuKCk7Ci0KLQkJVGVzdFJ1bm5hYmxlIHRlc3RSdW5uYWJsZTIgPSBuZXcgVGVzdFJ1bm5hYmxlKHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCAyKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHRlc3RSdW5uYWJsZTIpOwotCQl0aHJlYWQyLnJ1bigpOwotCi0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUzID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciwgMywgbnVsbCk7Ci0JCVRocmVhZCB0aHJlYWQzID0gdGhpcy5idWlsZFRocmVhZCh0ZXN0UnVubmFibGUzKTsKLQkJdGhyZWFkMy5ydW4oKTsKLQotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0JCXRocmVhZDMuam9pbigpOwotCi0JCWFzc2VydEVxdWFscygxLCB0ZXN0UnVubmFibGUxLnRlc3RDb21tYW5kLmNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RSdW5uYWJsZTEudGVzdENvbW1hbmRFeGVjdXRvci5jb3VudCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHRlc3RSdW5uYWJsZTIudGVzdENvbW1hbmQuY291bnQpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGVzdFJ1bm5hYmxlMi50ZXN0Q29tbWFuZEV4ZWN1dG9yLmNvdW50KTsKLQotCQlhc3NlcnRFcXVhbHMoMywgdGVzdFJ1bm5hYmxlMy50ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCWFzc2VydE51bGwodGVzdFJ1bm5hYmxlMy50ZXN0Q29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdENvbW1hbmRFeGVjdXRvciBpbXBsZW1lbnRzIENvbW1hbmRFeGVjdXRvciB7Ci0JCWludCBjb3VudCA9IDA7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCQl0aGlzLmNvdW50Kys7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yOwotCQlmaW5hbCBpbnQgZXhlY3V0aW9uQ291bnQ7Ci0JCWZpbmFsIFRlc3RDb21tYW5kIHRlc3RDb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCWZpbmFsIFRlc3RDb21tYW5kRXhlY3V0b3IgdGVzdENvbW1hbmRFeGVjdXRvcjsKLQkJVGVzdFJ1bm5hYmxlKFRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yIHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLCBpbnQgZXhlY3V0aW9uQ291bnQpIHsKLQkJCXRoaXModGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIGV4ZWN1dGlvbkNvdW50LCBuZXcgVGVzdENvbW1hbmRFeGVjdXRvcigpKTsKLQkJfQotCQlUZXN0UnVubmFibGUoVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgdGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IsIGludCBleGVjdXRpb25Db3VudCwgVGVzdENvbW1hbmRFeGVjdXRvciB0ZXN0Q29tbWFuZEV4ZWN1dG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50aHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciA9IHRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yOwotCQkJdGhpcy5leGVjdXRpb25Db3VudCA9IGV4ZWN1dGlvbkNvdW50OwotCQkJdGhpcy50ZXN0Q29tbWFuZEV4ZWN1dG9yID0gdGVzdENvbW1hbmRFeGVjdXRvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLnNldCh0aGlzLnRlc3RDb21tYW5kRXhlY3V0b3IpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmV4ZWN1dGlvbkNvdW50OyBpKyspIHsKLQkJCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yLmV4ZWN1dGUodGhpcy50ZXN0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kUnVubmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyM2IyYjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbW1hbmRSdW5uYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kUnVubmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbW1hbmRSdW5uYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCWJvb2xlYW4gY29tbWFuZEV4ZWN1dGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgQ29tbWFuZFJ1bm5hYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb21tYW5kKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUobnVsbCk7Ci0JCQlmYWlsKCJib2d1czogIiArIHJ1bm5hYmxlKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVuKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUodGhpcy5idWlsZENvbW1hbmQoKSk7Ci0JCXJ1bm5hYmxlLnJ1bigpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tbWFuZEV4ZWN1dGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0aGlzLmJ1aWxkQ29tbWFuZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChydW5uYWJsZS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCUNvbW1hbmRSdW5uYWJsZVRlc3RzLnRoaXMuY29tbWFuZEV4ZWN1dGVkID0gdHJ1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21tYW5kVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViODM5Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvQ29tbWFuZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21tYW5kUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJ1bm5hYmxlQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVGhyZWFkTG9jYWxDb21tYW5kOwotCi1wdWJsaWMgY2xhc3MgQ29tbWFuZFRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlwdWJsaWMgQ29tbWFuZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZCgpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5OdWxsLmluc3RhbmNlKCk7Ci0JCWNvbW1hbmQuZXhlY3V0ZSgpOyAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG93IHVwPwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29tbWFuZF90b1N0cmluZygpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoY29tbWFuZC50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbW1hbmRfc2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlDb21tYW5kIGNvbW1hbmQxID0gQ29tbWFuZC5OdWxsLmluc3RhbmNlKCk7Ci0JCUNvbW1hbmQgY29tbWFuZDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGNvbW1hbmQxKTsKLQkJYXNzZXJ0U2FtZShjb21tYW5kMSwgY29tbWFuZDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZENvbW1hbmQoKSB7Ci0JCUNvbW1hbmQgY29tbWFuZCA9IENvbW1hbmQuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQ29tbWFuZF90b1N0cmluZygpIHsKLQkJQ29tbWFuZCBjb21tYW5kID0gQ29tbWFuZC5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKGNvbW1hbmQudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkQ29tbWFuZF9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUNvbW1hbmQgY29tbWFuZDEgPSBDb21tYW5kLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCUNvbW1hbmQgY29tbWFuZDIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGNvbW1hbmQxKTsKLQkJYXNzZXJ0U2FtZShjb21tYW5kMSwgY29tbWFuZDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSdW5uYWJsZUNvbW1hbmQoKSB7Ci0JCVNpbXBsZVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUgPSBuZXcgU2ltcGxlVGVzdFJ1bm5hYmxlKCk7Ci0JCWFzc2VydEZhbHNlKHRlc3RSdW5uYWJsZS5yYW4pOwotCQlDb21tYW5kIGNvbW1hbmQgPSBuZXcgUnVubmFibGVDb21tYW5kKHRlc3RSdW5uYWJsZSk7Ci0JCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQlhc3NlcnRUcnVlKHRlc3RSdW5uYWJsZS5yYW4pOwotCX0KLQotCXN0YXRpYyBjbGFzcyBTaW1wbGVUZXN0UnVubmFibGUgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWJvb2xlYW4gcmFuID0gZmFsc2U7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMucmFuID0gdHJ1ZTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21tYW5kUnVubmFibGUoKSB7Ci0JCVRlc3RDb21tYW5kIHRlc3RDb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCWFzc2VydEVxdWFscygwLCB0ZXN0Q29tbWFuZC5jb3VudCk7Ci0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IENvbW1hbmRSdW5uYWJsZSh0ZXN0Q29tbWFuZCk7Ci0JCXJ1bm5hYmxlLnJ1bigpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdENvbW1hbmQuY291bnQpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBUZXN0Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRocmVhZExvY2FsQ29tbWFuZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUaHJlYWRMb2NhbENvbW1hbmQgdGhyZWFkTG9jYWxDb21tYW5kID0gbmV3IFRocmVhZExvY2FsQ29tbWFuZCgpOwotCQlUZXN0UnVubmFibGUgdGVzdFJ1bm5hYmxlMSA9IG5ldyBUZXN0UnVubmFibGUodGhyZWFkTG9jYWxDb21tYW5kLCAxKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHRlc3RSdW5uYWJsZTEpOwotCQl0aHJlYWQxLnJ1bigpOwotCi0JCVRlc3RSdW5uYWJsZSB0ZXN0UnVubmFibGUyID0gbmV3IFRlc3RSdW5uYWJsZSh0aHJlYWRMb2NhbENvbW1hbmQsIDIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQodGVzdFJ1bm5hYmxlMik7Ci0JCXRocmVhZDIucnVuKCk7Ci0KLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCWFzc2VydEVxdWFscygxLCB0ZXN0UnVubmFibGUxLnRlc3RDb21tYW5kLmNvdW50KTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgdGVzdFJ1bm5hYmxlMi50ZXN0Q29tbWFuZC5jb3VudCk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFRlc3RDb21tYW5kRXhlY3V0b3IgaW1wbGVtZW50cyBDb21tYW5kRXhlY3V0b3IgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKENvbW1hbmQgY29tbWFuZCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJY29tbWFuZC5leGVjdXRlKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVGVzdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBUaHJlYWRMb2NhbENvbW1hbmQgdGhyZWFkTG9jYWxDb21tYW5kOwotCQlmaW5hbCBpbnQgZXhlY3V0aW9uQ291bnQ7Ci0JCWZpbmFsIFRlc3RDb21tYW5kIHRlc3RDb21tYW5kID0gbmV3IFRlc3RDb21tYW5kKCk7Ci0JCVRlc3RSdW5uYWJsZShUaHJlYWRMb2NhbENvbW1hbmQgdGhyZWFkTG9jYWxDb21tYW5kLCBpbnQgZXhlY3V0aW9uQ291bnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZCA9IHRocmVhZExvY2FsQ29tbWFuZDsKLQkJCXRoaXMuZXhlY3V0aW9uQ291bnQgPSBleGVjdXRpb25Db3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLnRocmVhZExvY2FsQ29tbWFuZC5zZXQodGhpcy50ZXN0Q29tbWFuZCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuZXhlY3V0aW9uQ291bnQ7IGkrKykgewotCQkJCXRoaXMudGhyZWFkTG9jYWxDb21tYW5kLmV4ZWN1dGUoKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0NvbXBvc2l0ZUNvbW1hbmRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmFiYzU0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Db21wb3NpdGVDb21tYW5kVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbW1hbmRSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlQ29tbWFuZDsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUNvbW1hbmRUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlib29sZWFuIGNvbW1hbmQxRXhlY3V0ZWQgPSBmYWxzZTsKLQlib29sZWFuIGNvbW1hbmQyRXhlY3V0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBDb21wb3NpdGVDb21tYW5kVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJ1bigpIHsKLQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgQ29tbWFuZFJ1bm5hYmxlKHRoaXMuYnVpbGRDb21wb3NpdGVDb21tYW5kKCkpOwotCQlydW5uYWJsZS5ydW4oKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbW1hbmQxRXhlY3V0ZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tbWFuZDJFeGVjdXRlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBDb21tYW5kUnVubmFibGUodGhpcy5idWlsZENvbXBvc2l0ZUNvbW1hbmQoKSk7Ci0JCWFzc2VydE5vdE51bGwocnVubmFibGUudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkQ29tcG9zaXRlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb21tYW5kKAotCQkJCQl0aGlzLmJ1aWxkQ29tbWFuZDEoKSwKLQkJCQkJdGhpcy5idWlsZENvbW1hbmQyKCkKLQkJCQkpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZENvbW1hbmQxKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCUNvbXBvc2l0ZUNvbW1hbmRUZXN0cy50aGlzLmNvbW1hbmQxRXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZENvbW1hbmQyKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJCUNvbXBvc2l0ZUNvbW1hbmRUZXN0cy50aGlzLmNvbW1hbmQyRXhlY3V0ZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0V4Y2VwdGlvbkhhbmRsZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzA5N2YzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9FeGNlcHRpb25IYW5kbGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkV4Y2VwdGlvbkhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBFeGNlcHRpb25IYW5kbGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRXhjZXB0aW9uSGFuZGxlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRXhjZXB0aW9uSGFuZGxlcigpIHsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbEV4Y2VwdGlvbkhhbmRsZXJUb1N0cmluZygpIHsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZXhjZXB0aW9uSGFuZGxlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkhhbmRsZXIoKSB7Ci0JCUV4Y2VwdGlvbiBucGUgPSBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5SdW50aW1lLmluc3RhbmNlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXhjZXB0aW9uKG5wZSk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWFzc2VydFNhbWUobnBlLCBleC5nZXRDYXVzZSgpKTsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkhhbmRsZXJUb1N0cmluZygpIHsKLQkJRXhjZXB0aW9uSGFuZGxlciBleGNlcHRpb25IYW5kbGVyID0gRXhjZXB0aW9uSGFuZGxlci5SdW50aW1lLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZXhjZXB0aW9uSGFuZGxlci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9GaWxlVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ODNiODUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbGVUb29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5GaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbGVUb29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgRmlsZSB0ZW1wRGlyOwotCi0JcHVibGljIEZpbGVUb29sc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVtcERpciA9IHRoaXMuYnVpbGRUZW1wRGlyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdGhpcy5kZWxldGVEaXIodGhpcy50ZW1wRGlyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJbigpIHsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWxlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKEZpbGVUb29scy5maWxlc0luKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGZpbGUgY291bnQiLCAzLCBmaWxlcy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3Rvcmllc0luKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW4odGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZGlyZWN0b3J5IGNvdW50IiwgMiwgZmlsZXMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsZXNJblRyZWUoKSB7Ci0JCUNvbGxlY3Rpb248RmlsZT4gZmlsZXMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihGaWxlVG9vbHMuZmlsZXNJblRyZWUodGhpcy50ZW1wRGlyLmdldFBhdGgoKSkpOwotCQlhc3NlcnRFcXVhbHMoImludmFsaWQgZmlsZSBjb3VudCIsIDksIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yaWVzSW5UcmVlKCkgewotCQlDb2xsZWN0aW9uPEZpbGU+IGZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oRmlsZVRvb2xzLmRpcmVjdG9yaWVzSW5UcmVlKHRoaXMudGVtcERpci5nZXRQYXRoKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIGRpcmVjdG9yeSBjb3VudCIsIDMsIGZpbGVzLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGV0ZURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIuZ2V0UGF0aCgpKTsKLQkJYXNzZXJ0RmFsc2UoInRlbXBvcmFyeSBkaXJlY3Rvcnkgbm90IGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxldGVEaXJlY3RvcnlDb250ZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGJ1aWxkIGFub3RoZXIgdGVtcG9yYXJ5IGRpcmVjdG9yeSBqdXN0IGZvciB0aGlzIHRlc3QKLQkJRmlsZSBkaXIgPSB0aGlzLmJ1aWxkVGVtcERpcigpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IG5vdCBjcmVhdGVkIiwgZGlyLmV4aXN0cygpKTsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeUNvbnRlbnRzKGRpci5nZXRQYXRoKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IHNob3VsZCBub3QgaGF2ZSBiZWVuIGRlbGV0ZWQiLCBkaXIuZXhpc3RzKCkpOwotCQlhc3NlcnRUcnVlKCJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGNvbnRlbnRzIG5vdCBkZWxldGVkIiwgZGlyLmxpc3RGaWxlcygpLmxlbmd0aCA9PSAwKTsKLQkJZGlyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgImRlc3RmaWxlLnR4dCIpOwotCQl0aGlzLmNvcHlUb0ZpbGUoZGVzdEZpbGUsICJ0ZXN0Q29weVRvRmlsZSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9QcmVFeGlzdGluZ0ZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGZpbGUudHh0Iik7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXdyaXRlci53cml0ZSgidGhpcyB0ZXh0IHNob3VsZCBiZSByZXBsYWNlZC4uLiIpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQkJdGhpcy5jb3B5VG9GaWxlKGRlc3RGaWxlLCAidGVzdENvcHlUb1ByZUV4aXN0aW5nRmlsZSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb3B5VG9GaWxlKEZpbGUgZGVzdEZpbGUsIFN0cmluZyB3cml0ZVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBzb3VyY2VGaWxlID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRmlsZShzb3VyY2VGaWxlLCBkZXN0RmlsZSk7Ci0KLQkJUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGRlc3RGaWxlKSk7Ci0JCXJlYWRlci5yZWFkKHJlYWRCdWZmZXIpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlYWRTdHJpbmcgPSBuZXcgU3RyaW5nKHJlYWRCdWZmZXIpOwotCQlhc3NlcnRFcXVhbHMod3JpdGVTdHJpbmcsIHJlYWRTdHJpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb3B5VG9EaXJlY3RvcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZSh0aGlzLnRlbXBEaXIsICJzb3VyY2VmaWxlLnR4dCIpOwotCQlTdHJpbmcgd3JpdGVTdHJpbmcgPSAidGVzdENvcHlUb0RpcmVjdG9yeSI7Ci0KLQkJRmlsZSBkZXN0RGlyID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCAiZGVzdGRpciIpOwotCQlkZXN0RGlyLm1rZGlyKCk7Ci0JCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShkZXN0RGlyLCAic291cmNlZmlsZS50eHQiKTsKLQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclt3cml0ZVN0cmluZy5sZW5ndGgoKV07Ci0KLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0oc291cmNlRmlsZSkpOwotCQl3cml0ZXIud3JpdGUod3JpdGVTdHJpbmcpOwotCQl3cml0ZXIuY2xvc2UoKTsKLQotCQlGaWxlVG9vbHMuY29weVRvRGlyZWN0b3J5KHNvdXJjZUZpbGUsIGRlc3REaXIpOwotCi0JCVJlYWRlciByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShkZXN0RmlsZSkpOwotCQlyZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCVN0cmluZyByZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQkJCi0JCUZpbGVUb29scy5jb3B5VG9EaXJlY3Rvcnkoc291cmNlRmlsZSwgZGVzdERpcik7IC8vVHJ5IGFnYWluIHdpdGggdGhlIGRpcmVjdG9yeSBpcyBhbHJlYWR5IGNyZWF0ZWQKLQkJcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oZGVzdEZpbGUpKTsKLQkJcmVhZGVyLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlyZWFkU3RyaW5nID0gbmV3IFN0cmluZyhyZWFkQnVmZmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHdyaXRlU3RyaW5nLCByZWFkU3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHByZWZpeCA9ICJYWFh0ZXN0RmlsZVhYWCI7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGhpcy50ZW1wRGlyLCBwcmVmaXggKyAiMSIpOwotCQl0ZXN0RmlsZTEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIHRlc3RGaWxlMiA9IG5ldyBGaWxlKHRoaXMudGVtcERpciwgcHJlZml4ICsgIjIiKTsKLQkJdGVzdEZpbGUyLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlRmlsdGVyIGZpbHRlciA9IHRoaXMuYnVpbGRGaWxlRmlsdGVyKHByZWZpeCk7Ci0JCUl0ZXJhdG9yPEZpbGU+IGZpbHRlcmVkRmlsZXNJdGVyYXRvciA9IEZpbGVUb29scy5maWx0ZXIoRmlsZVRvb2xzLmZpbGVzSW4odGhpcy50ZW1wRGlyKSwgZmlsdGVyKTsKLQkJQ29sbGVjdGlvbjxGaWxlPiBmaWx0ZXJlZEZpbGVzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZmlsdGVyZWRGaWxlc0l0ZXJhdG9yKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbHRlcmVkRmlsZXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXJlZEZpbGVzLmNvbnRhaW5zKHRlc3RGaWxlMSkpOwotCQlhc3NlcnRUcnVlKGZpbHRlcmVkRmlsZXMuY29udGFpbnModGVzdEZpbGUyKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlRmlsdGVyIGJ1aWxkRmlsZUZpbHRlcihmaW5hbCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgRmlsZUZpbHRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGZpbGUpIHsKLQkJCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpcEV4dGVuc2lvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vLmJhciIsIEZpbGVUb29scy5zdHJpcEV4dGVuc2lvbigiZm9vLmJhci54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRmlsZVRvb2xzLnN0cmlwRXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb24oKSB7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby54bWwiKSk7Ci0JCWFzc2VydEVxdWFscygiLnhtbCIsIEZpbGVUb29scy5leHRlbnNpb24oImZvby5iYXIueG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIiIsIEZpbGVUb29scy5leHRlbnNpb24oImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28seG1sIikpOwotCQlhc3NlcnRFcXVhbHMoIi4iLCBGaWxlVG9vbHMuZXh0ZW5zaW9uKCJmb28uIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcERpcjEgPSBGaWxlVG9vbHMudGVtcG9yYXJ5RGlyZWN0b3J5KCk7Ci0JCUZpbGUgdGVzdEZpbGUxID0gbmV3IEZpbGUodGVtcERpcjEsICJqdW5rIik7Ci0JCXRlc3RGaWxlMS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSB0ZW1wRGlyMiA9IEZpbGVUb29scy5lbXB0eVRlbXBvcmFyeURpcmVjdG9yeSgpOwotCQlhc3NlcnRFcXVhbHModGVtcERpcjEsIHRlbXBEaXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wRGlyMi5pc0RpcmVjdG9yeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRlbXBEaXIyLmxpc3RGaWxlcygpLmxlbmd0aCk7Ci0JCXRlbXBEaXIyLmRlbGV0ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5vbmljYWxGaWxlTmFtZSgpIHsKLQkJRmlsZSBmaWxlMSA9IG5ldyBGaWxlKCJmb28iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCWZpbGUxID0gbmV3IEZpbGUoZmlsZTEsICIuLiIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiLi4iKTsKLQkJZmlsZTEgPSBuZXcgRmlsZShmaWxlMSwgImJhciIpOwotCQlmaWxlMSA9IG5ldyBGaWxlKGZpbGUxLCAiYmF6Iik7Ci0JCUZpbGUgZmlsZTIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIikpOwotCQlmaWxlMiA9IG5ldyBGaWxlKGZpbGUyLCAiZm9vIik7Ci0JCWZpbGUyID0gbmV3IEZpbGUoZmlsZTIsICJiYXIiKTsKLQkJZmlsZTIgPSBuZXcgRmlsZShmaWxlMiwgImJheiIpOwotCQlGaWxlIGZpbGUzID0gRmlsZVRvb2xzLmNhbm9uaWNhbEZpbGUoZmlsZTEpOwotCQlhc3NlcnRFcXVhbHMoZmlsZTIsIGZpbGUzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGF0aEZpbGVzKCkgewotCQlGaWxlW10gZXhwZWN0ZWQ7Ci0JCUZpbGVbXSBhY3R1YWw7Ci0KLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCWV4cGVjdGVkID0gbmV3IEZpbGVbXSB7IG5ldyBGaWxlKCJDOi8iKSwgbmV3IEZpbGUoIkM6L2ZvbyIpLCBuZXcgRmlsZSgiQzovZm9vL2JhciIpLCBuZXcgRmlsZSgiQzovZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJCWFjdHVhbCA9IHRoaXMucGF0aEZpbGVzKG5ldyBGaWxlKCJDOi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCkpOwotCQl9Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoIi8iKSwgbmV3IEZpbGUoIi9mb28iKSwgbmV3IEZpbGUoIi9mb28vYmFyIiksIG5ldyBGaWxlKCIvZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0KLQkJZXhwZWN0ZWQgPSBuZXcgRmlsZVtdIHsgbmV3IEZpbGUoImZvbyIpLCBuZXcgRmlsZSgiZm9vL2JhciIpLCBuZXcgRmlsZSgiZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoImZvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLi4iKSwgbmV3IEZpbGUoIi4uL2ZvbyIpLCBuZXcgRmlsZSgiLi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi4vZm9vL2Jhci9iYXoudHh0IikgfTsKLQkJYWN0dWFsID0gdGhpcy5wYXRoRmlsZXMobmV3IEZpbGUoIi4uL2Zvby9iYXIvYmF6LnR4dCIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpKTsKLQotCQlleHBlY3RlZCA9IG5ldyBGaWxlW10geyBuZXcgRmlsZSgiLiIpLCBuZXcgRmlsZSgiLi9mb28iKSwgbmV3IEZpbGUoIi4vZm9vL2JhciIpLCBuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSB9OwotCQlhY3R1YWwgPSB0aGlzLnBhdGhGaWxlcyhuZXcgRmlsZSgiLi9mb28vYmFyL2Jhei50eHQiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgYWN0dWFsKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlW10gcGF0aEZpbGVzKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gKEZpbGVbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoRmlsZVRvb2xzLmNsYXNzLCAicGF0aEZpbGVzIiwgRmlsZS5jbGFzcywgZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbGF0aXZlUGFyZW50RmlsZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLiIpLCB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgxKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4iKSwgdGhpcy5yZWxhdGl2ZVBhcmVudEZpbGUoMikpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uIiksIHRoaXMucmVsYXRpdmVQYXJlbnRGaWxlKDMpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSB0aGlzLnJlbGF0aXZlUGFyZW50RmlsZSgwKTsKLQkJCWZhaWwoImludmFsaWQgcmV0dXJuOiAiICsgZmlsZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgewotCQkJCUludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gaXRlID0gKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24pIGV4LmdldENhdXNlKCk7Ci0JCQkJaWYgKGl0ZS5nZXRUYXJnZXRFeGNlcHRpb24oKSBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbikgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgRmlsZSByZWxhdGl2ZVBhcmVudEZpbGUoaW50IGxlbikgewotCQlyZXR1cm4gKEZpbGUpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKEZpbGVUb29scy5jbGFzcywgInJlbGF0aXZlUGFyZW50RmlsZSIsIGludC5jbGFzcywgbmV3IEludGVnZXIobGVuKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1JlbGF0aXZlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IFRvb2xzLm9zSXNXaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgcmVsYXRpdmVGaWxlOwotCi0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRSZWxhdGl2ZUZpbGUoIi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCQkvLyBkaWZmZXJlbnQgZHJpdmVzCi0JCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiRDovZGlyMS9kaXIyL2ZpbGUudHh0IiwgIkM6L2RpcjEvZGlyMiIpOwotCQl9Ci0JCXRoaXMudmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKCJkaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZFJlbGF0aXZlRmlsZSgiLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4iKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyLy4uL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoImZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1L2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMyIpOwotCQlyZWxhdGl2ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvUmVsYXRpdmVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZSgiLi4vZmlsZS50eHQiKSwgcmVsYXRpdmVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyQS9kaXJCL2RpckMvZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJcmVsYXRpdmVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb1JlbGF0aXZlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUoIi4uLy4uLy4uL2RpckEvZGlyQi9kaXJDL2ZpbGUudHh0IiksIHJlbGF0aXZlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2RpcjMvZGlyNC9kaXI1Iik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCIuLi8uLi8uLiIpLCByZWxhdGl2ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxL2xpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCXJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKCJsaWIvdG9wbGluay5qYXIiKSwgcmVsYXRpdmVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jaGFuZ2VkUmVsYXRpdmVGaWxlKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIGRpck5hbWUpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOwotCQlGaWxlIHJlbGF0aXZlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9SZWxhdGl2ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKGZpbGUsIHJlbGF0aXZlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0Fic29sdXRlRmlsZSgpIHsKLQkJU3RyaW5nIHByZWZpeCA9IFRvb2xzLm9zSXNXaW5kb3dzKCkgPyAiQzoiIDogIiI7Ci0JCUZpbGUgZmlsZTsKLQkJRmlsZSBkaXI7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlOwotCi0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQkvLyBvbiBXaW5kb3dzLCBhIGRyaXZlIG11c3QgYmUgc3BlY2lmaWVkIGZvciBhIGZpbGUgdG8gYmUgYWJzb2x1dGUgKGkuZS4gbm90IHJlbGF0aXZlKQotCQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoIkM6L2RpcjEvZGlyMi9maWxlLnR4dCIsICJDOi9kaXIxL2RpcjIiKTsKLQkJCS8vIGRpZmZlcmVudCBkcml2ZXMKLQkJCXRoaXMudmVyaWZ5VW5jaGFuZ2VkQWJzb2x1dGVGaWxlKCJEOi9kaXIxL2RpcjIvZmlsZS50eHQiLCAiQzovZGlyMS9kaXIyIik7Ci0JCX0KLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiLCBwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQl0aGlzLnZlcmlmeVVuY2hhbmdlZEFic29sdXRlRmlsZShwcmVmaXggKyAiLy4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJdGhpcy52ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvLi4vLi4vZGlyMS9kaXIyL2ZpbGUudHh0IiwgcHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9kaXIyL2ZpbGUudHh0Iik7Ci0JCWRpciA9IG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCJkaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNS9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4vZmlsZS50eHQiKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZmlsZS50eHQiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQkvLyB0b28gbWFueSAiLi4iIGRpcmVjdG9yaWVzIHdpbGwgcmVzb2x2ZSB0byB0aGUgcm9vdDsKLQkJLy8gdGhpcyBpcyBjb25zaXN0ZW50IHdpdGggV2luZG93cyBhbmQgTGludXggY29tbWFuZCBzaGVsbHMKLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMiIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvZGlyMS9kaXIyL2ZpbGUudHh0IiksIGFic29sdXRlRmlsZSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIuLi8uLi8uLi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXIzL2RpcjQvZGlyNSIpOwotCQlhYnNvbHV0ZUZpbGUgPSBGaWxlVG9vbHMuY29udmVydFRvQWJzb2x1dGVGaWxlKGZpbGUsIGRpcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShwcmVmaXggKyAiL2RpcjEvZGlyMi9kaXJBL2RpckIvZGlyQy9maWxlLnR4dCIpLCBhYnNvbHV0ZUZpbGUpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiLi4vLi4vLi4iKTsKLQkJZGlyID0gbmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIvZGlyMy9kaXI0L2RpcjUiKTsKLQkJYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMobmV3IEZpbGUocHJlZml4ICsgIi9kaXIxL2RpcjIiKSwgYWJzb2x1dGVGaWxlKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoImxpYi90b3BsaW5rLmphciIpOwotCQlkaXIgPSBuZXcgRmlsZShwcmVmaXggKyAiL015IERvY3VtZW50cy9NeSBXb3Jrc3BhY2UvUHJvamVjdCAxIik7Ci0JCWFic29sdXRlRmlsZSA9IEZpbGVUb29scy5jb252ZXJ0VG9BYnNvbHV0ZUZpbGUoZmlsZSwgZGlyKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHByZWZpeCArICIvTXkgRG9jdW1lbnRzL015IFdvcmtzcGFjZS9Qcm9qZWN0IDEvbGliL3RvcGxpbmsuamFyIiksIGFic29sdXRlRmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbGVOYW1lSXNSZXNlcnZlZCgpIHsKLQkJYm9vbGVhbiBleHBlY3RlZCA9IFRvb2xzLm9zSXNXaW5kb3dzKCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQ09OIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoImNvbiIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJjT04iKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiQVVYIikpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlTmFtZUlzUmVzZXJ2ZWQoIkNPTTMiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiTFBUMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZU5hbWVJc1Jlc2VydmVkKCJuVUwiKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVOYW1lSXNSZXNlcnZlZCgiUHJuIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKCkgewotCQlib29sZWFuIGV4cGVjdGVkID0gVG9vbHMub3NJc1dpbmRvd3MoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiQzovQ09OIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiL2Nvbi9mb28iKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJjOi90ZW1wL2NPTiIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImJhci8vYmF6Ly9BVVgiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJDT00zLy90dHQiKSkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIEZpbGVUb29scy5maWxlSGFzQW55UmVzZXJ2ZWRDb21wb25lbnRzKG5ldyBGaWxlKCJkOi9MUFQzL3h4eCIpKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgRmlsZVRvb2xzLmZpbGVIYXNBbnlSZXNlcnZlZENvbXBvbmVudHMobmV3IEZpbGUoImM6L215IGRvY3MgYW5kIHN0dWZmL3R1ZXNkYXkvblVMIikpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBGaWxlVG9vbHMuZmlsZUhhc0FueVJlc2VydmVkQ29tcG9uZW50cyhuZXcgRmlsZSgiUHJuIikpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lRmlsZSgpIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVGaWxlTm9uV2luKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZVdpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFxBZG1pbmlzdHJhdG9yXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKGZpbGUpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIkM6LyIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVOb25XaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvYWRtaW5pc3RyYXRvci8uLi4vZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQotCQlmaWxlID0gbmV3IEZpbGUoIi9ob21lIik7Ci0JCWZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZSIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0VHJ1ZShmaWxlTmFtZS5sZW5ndGgoKSA8PSBGaWxlVG9vbHMuTUFYSU1VTV9TSE9SVEVORURfRklMRV9OQU1FX0xFTkdUSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNob3J0ZW5GaWxlTmFtZUZpbGVJbnQoKSB7Ci0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZUZpbGVJbnRXaW4oKSB7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKCJDOlxcRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1xcQWRtaW5pc3RyYXRvclxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiQzpcXC4uLlxcRGVza3RvcFxcUHJvamVjdFxcVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzMSwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCi0JCWZpbGUgPSBuZXcgRmlsZSgiQzovVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxUaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjgsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lRmlsZUludE5vbldpbigpIHsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoIi9ob21lL2FkbWluaXN0cmF0b3IvZG9jdW1lbnRzIGFuZCBzZXR0aW5ncy9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZShmaWxlLCAzMSk7Ci0JCWFzc2VydEVxdWFscygiL2hvbWUvLi4uL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDM0LCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0KLQkJZmlsZSA9IG5ldyBGaWxlKCIvVGhpcyBpcyB0aGUgZmlsZSBuYW1lLnR4dCIpOwotCQlmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUoZmlsZSwgMTApOwotCQlhc3NlcnRFcXVhbHMoIi9UaGlzIGlzIHRoZSBmaWxlIG5hbWUudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRFcXVhbHMoMjYsIGZpbGVOYW1lLmxlbmd0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2hvcnRlbkZpbGVOYW1lVVJMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChUb29scy5vc0lzV2luZG93cygpKSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTFdpbigpOwotCQl9IGVsc2UgewotCQkJdGhpcy52ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxOb25XaW4oKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTaG9ydGVuRmlsZU5hbWVVUkxXaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVVJMIHVybCA9IG5ldyBVUkwoImZpbGUiLCAiIiwgIkM6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwpOwotCQlhc3NlcnRFcXVhbHMoIkM6XFxEb2N1bWVudHMgYW5kIFNldHRpbmdzXFwuLi5cXERlc2t0b3BcXFByb2plY3RcXFRleHQudHh0IiwgZmlsZU5hbWUpOwotCQlhc3NlcnRUcnVlKGZpbGVOYW1lLmxlbmd0aCgpIDw9IEZpbGVUb29scy5NQVhJTVVNX1NIT1JURU5FRF9GSUxFX05BTUVfTEVOR1RIKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMTm9uV2luKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlIiwgIiIsICIvaG9tZS9hZG1pbmlzdHJhdG9yL2RvY3VtZW50cyBhbmQgc2V0dGluZ3MvZGVza3RvcC9Qcm9qZWN0L1RleHQudHh0Iik7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEZpbGVUb29scy5zaG9ydGVuRmlsZU5hbWUodXJsKTsKLQkJYXNzZXJ0RXF1YWxzKCIvaG9tZS9hZG1pbmlzdHJhdG9yLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydFRydWUoZmlsZU5hbWUubGVuZ3RoKCkgPD0gRmlsZVRvb2xzLk1BWElNVU1fU0hPUlRFTkVEX0ZJTEVfTkFNRV9MRU5HVEgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaG9ydGVuRmlsZU5hbWVVUkxJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXRoaXMudmVyaWZ5U2hvcnRlbkZpbGVOYW1lVVJMSW50V2luKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludFdpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL0M6L0RvY3VtZW50cyBhbmQgU2V0dGluZ3MvQWRtaW5pc3RyYXRvci9EZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gRmlsZVRvb2xzLnNob3J0ZW5GaWxlTmFtZSh1cmwsIDMxKTsKLQkJYXNzZXJ0RXF1YWxzKCJDOlxcLi4uXFxEZXNrdG9wXFxQcm9qZWN0XFxUZXh0LnR4dCIsIGZpbGVOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKDMxLCBmaWxlTmFtZS5sZW5ndGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNob3J0ZW5GaWxlTmFtZVVSTEludE5vbldpbigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgdXJsID0gbmV3IFVSTCgiZmlsZSIsICIiLCAiL2hvbWUvYWRtaW5pc3RyYXRvci9kb2N1bWVudHMgYW5kIHNldHRpbmdzL2Rlc2t0b3AvUHJvamVjdC9UZXh0LnR4dCIpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBGaWxlVG9vbHMuc2hvcnRlbkZpbGVOYW1lKHVybCwgMzEpOwotCQlhc3NlcnRFcXVhbHMoIi9ob21lLy4uLi9kZXNrdG9wL1Byb2plY3QvVGV4dC50eHQiLCBmaWxlTmFtZSk7Ci0JCWFzc2VydEVxdWFscygzNCwgZmlsZU5hbWUubGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNoYW5nZWRBYnNvbHV0ZUZpbGUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgZGlyTmFtZSkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCUZpbGUgZGlyID0gbmV3IEZpbGUoZGlyTmFtZSk7Ci0JCUZpbGUgYWJzb2x1dGVGaWxlID0gRmlsZVRvb2xzLmNvbnZlcnRUb0Fic29sdXRlRmlsZShmaWxlLCBkaXIpOwotCQlhc3NlcnRFcXVhbHMoZmlsZSwgYWJzb2x1dGVGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIEZpbGUgYnVpbGRUZW1wRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gYnVpbGQgYSBuZXcgZGlyZWN0b3J5IGZvciBlYWNoIHRlc3QsIHRvIHByZXZlbnQgYW55IGNyb3NzLXRlc3QgZWZmZWN0cwotCQlGaWxlIGRpciA9IEZpbGVUb29scy5uZXdUZW1wb3JhcnlEaXJlY3RvcnkodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSArICIuIiArIHRoaXMuZ2V0TmFtZSgpKTsKLQotCQlGaWxlIGZpbGUwYSA9IG5ldyBGaWxlKGRpciwgImZpbGUwYSIpOwotCQlmaWxlMGEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYiA9IG5ldyBGaWxlKGRpciwgImZpbGUwYiIpOwotCQlmaWxlMGIuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUwYyA9IG5ldyBGaWxlKGRpciwgImZpbGUwYyIpOwotCQlmaWxlMGMuY3JlYXRlTmV3RmlsZSgpOwotCi0JCUZpbGUgc3ViZGlyMSA9IG5ldyBGaWxlKGRpciwgInN1YmRpcjEiKTsKLQkJc3ViZGlyMS5ta2RpcigpOwotCQlGaWxlIGZpbGUxYSA9IG5ldyBGaWxlKHN1YmRpcjEsICJmaWxlMWEiKTsKLQkJZmlsZTFhLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJRmlsZSBmaWxlMWIgPSBuZXcgRmlsZShzdWJkaXIxLCAiZmlsZTFiIik7Ci0JCWZpbGUxYi5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJRmlsZSBzdWJkaXIyID0gbmV3IEZpbGUoZGlyLCAic3ViZGlyMiIpOwotCQlzdWJkaXIyLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTJhID0gbmV3IEZpbGUoc3ViZGlyMiwgImZpbGUyYSIpOwotCQlmaWxlMmEuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUyYiA9IG5ldyBGaWxlKHN1YmRpcjIsICJmaWxlMmIiKTsKLQkJZmlsZTJiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlGaWxlIHN1YmRpcjMgPSBuZXcgRmlsZShzdWJkaXIyLCAic3ViZGlyMyIpOwotCQlzdWJkaXIzLm1rZGlyKCk7Ci0JCUZpbGUgZmlsZTNhID0gbmV3IEZpbGUoc3ViZGlyMywgImZpbGUzYSIpOwotCQlmaWxlM2EuY3JlYXRlTmV3RmlsZSgpOwotCQlGaWxlIGZpbGUzYiA9IG5ldyBGaWxlKHN1YmRpcjMsICJmaWxlM2IiKTsKLQkJZmlsZTNiLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQlyZXR1cm4gZGlyOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxldGVEaXIoRmlsZSBkaXIpIHsKLQkJRmlsZVRvb2xzLmRlbGV0ZURpcmVjdG9yeShkaXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0ZpbHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3YTBhMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvRmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRmlsdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxGaWx0ZXIoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiIikpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShmaWx0ZXIuYWNjZXB0KCJiYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxGaWx0ZXJfdG9TdHJpbmcoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5OdWxsLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZmlsdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsRmlsdGVyX3NlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk51bGwuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShmaWx0ZXIsIFRlc3RUb29scy5zZXJpYWxpemUoZmlsdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUZpbHRlcigpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLk9wYXF1ZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRGYWxzZShmaWx0ZXIuYWNjZXB0KCIiKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlci5hY2NlcHQoImZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdCgiYmFyIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcGFxdWVGaWx0ZXJfdG9TdHJpbmcoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWx0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wYXF1ZUZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5PcGFxdWUuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0U2FtZShmaWx0ZXIsIFRlc3RUb29scy5zZXJpYWxpemUoZmlsdGVyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2FibGVkRmlsdGVyKCkgewotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSBGaWx0ZXIuRGlzYWJsZWQuaW5zdGFuY2UoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdCgiZm9vIikpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEZpbHRlcl90b1N0cmluZygpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gRmlsdGVyLkRpc2FibGVkLmluc3RhbmNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZmlsdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEZpbHRlcl9zZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IEZpbHRlci5EaXNhYmxlZC5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGZpbHRlciwgVGVzdFRvb2xzLnNlcmlhbGl6ZShmaWx0ZXIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9IYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyYTEwYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSGFzaEJhZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBIYXNoQmFnPFN0cmluZz4gYmFnOwotCi0JcHVibGljIEhhc2hCYWdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmJhZyA9IHRoaXMuYnVpbGRCYWcoKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSGFzaEJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWIuYWRkKG51bGwpOwotCQliLmFkZChuZXcgU3RyaW5nKCJvbmUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInR3byIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidHdvIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJ0aHJlZSIpKTsKLQkJYi5hZGQobmV3IFN0cmluZygidGhyZWUiKSk7Ci0JCWIuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQliLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlyZXR1cm4gYjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImZvbyIpKTsKLQkJYy5hZGQobmV3IFN0cmluZygiYmFyIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoImJhciIpKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JDb2xsZWN0aW9uKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCUJhZzxTdHJpbmc+IGIgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KGMpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZShiLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdG9ySW50RmxvYXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQ7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigtMjAsIDAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigyMCwgLTAuNjZmKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJLy8gdGhlIG90aGVyIGFkZHMgdG9vayBwbGFjZSBpbiBzZXRVcAotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZCgiZml2ZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZENvdW50KCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCXRoaXMuYmFnLmFkZCgibWludXMzIiwgLTMpOwotCQl0aGlzLmJhZy5hZGQoInplcm8iLCAwKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIiwgNSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm1pbnVzMyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0KLQkJdGhpcy5iYWcuYWRkKCJ0aHJlZSIsIDIpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5hZGRBbGwoYykpOwotCQlmb3IgKFN0cmluZyBzIDogYykgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhzKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJhZy5jbG9uZSgpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnICE9IGJhZzIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmhhc2hDb2RlKCkgPT0gYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucygidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvdXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMobmV3IFN0cmluZygiZm91ciIpKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoImZvIiArICJ1ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZChudWxsKTsKLQkJYy5hZGQobmV3IFN0cmluZygib25lIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJ0d28iKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcoInRocmVlIikpOwotCQljLmFkZChuZXcgU3RyaW5nKCJmb3VyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q291bnQoKSB7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiemVybyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuYmFnLmNvdW50KCJvbmUiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmJhZy5jb3VudCgidHdvIikpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5iYWcuY291bnQoInRocmVlIikpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5iYWcuY291bnQoImZvdXIiKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmJhZy5jb3VudCgiZml2ZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQliYWcyLmFkZCgiZml2ZSIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5lcXVhbHMoYmFnMikpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJhZyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCQl0aGlzLmJhZy5hZGQoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUl0ZXJhdG9yKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLml0ZXJhdG9yKCk7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUl0ZXJhdG9yKCkgewotCQlpbnQgaSA9IDA7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSAmJiAhImZvdXIiLmVxdWFscyhuZXh0KSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxCYWcuRW50cnk8U3RyaW5nPj4gaXRlcmF0b3IgPSB0aGlzLmJhZy5lbnRyaWVzKCk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg1LCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlCYWcuRW50cnk8U3RyaW5nPiBuZXh0ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmdldEVsZW1lbnQoKS5lcXVhbHMoImZvdXIiKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaGluZ0Rpc3RyaWJ1dGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiaWdCYWcgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotCQl9Ci0KLQkJamF2YS5sYW5nLnJlZmxlY3QuRmllbGQgZmllbGQgPSBiaWdCYWcuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJ0YWJsZSIpOwotCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQlPYmplY3RbXSB0YWJsZSA9IChPYmplY3RbXSkgZmllbGQuZ2V0KGJpZ0JhZyk7Ci0JCWludCBidWNrZXRDb3VudCA9IHRhYmxlLmxlbmd0aDsKLQkJaW50IGZpbGxlZEJ1Y2tldENvdW50ID0gMDsKLQkJZm9yIChPYmplY3QgbyA6IHRhYmxlKSB7Ci0JCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJZmlsbGVkQnVja2V0Q291bnQrKzsKLQkJCX0KLQkJfQotCQlmbG9hdCBsb2FkRmFjdG9yID0gKChmbG9hdCkgZmlsbGVkQnVja2V0Q291bnQpIC8gKChmbG9hdCkgYnVja2V0Q291bnQpOwotCQlpZiAoKGxvYWRGYWN0b3IgPCAwLjIwKSB8fCAobG9hZEZhY3RvciA+IDAuODApKSB7Ci0JCQlTdHJpbmcgbXNnID0gInBvb3IgbG9hZCBmYWN0b3I6ICIgKyBsb2FkRmFjdG9yOwotCQkJaWYgKFRvb2xzLmp2bUlzU3VuKCkpIHsKLQkJCQlmYWlsKG1zZyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHBvb3IgbG9hZCBmYWN0b3IgaXMgc2VlbiBpbiB0aGUgRWNsaXBzZSBidWlsZCBlbnZpcm9ubWVudCBmb3Igc29tZSByZWFzb24uLi4KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpICsgIiAtICIgKyBtc2cpOwotCQkJCVRlc3RUb29scy5wcmludFN5c3RlbVByb3BlcnRpZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgib25lIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidHdvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb3VudCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiLCAwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoIm9uZSIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgib25lIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygib25lIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoIm9uZSIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIsIC0zKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKCJ0d28iLCAxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidHdvIiwgMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUoInR3byIpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiLCAzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0aHJlZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0aHJlZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJvbmUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgidGhyZWUiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIm9uZSIpOwotCQljLmFkZCgidGhyZWUiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKCJvbmUiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygidHdvIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucygiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKCJ0d28iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSgiZm91ciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmV0YWluQWxsKGMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCXRoaXMuYmFnLmFkZCgiZml2ZSIpOwotCQl0aGlzLmJhZy5hZGQoImZpdmUiKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlCYWc8U3RyaW5nPiBiYWcyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZSh0aGlzLmJhZyk7Ci0KLQkJYXNzZXJ0VHJ1ZSgic2FtZSBvYmplY3Q/IiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygxMSwgYmFnMi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcsIGJhZzIpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUoYmFnMi5jb250YWlucygib25lIikpOwotCQlhc3NlcnRUcnVlKGJhZzIuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShiYWcyLmNvbnRhaW5zKCJmb3VyIikpOwotCi0JCWludCBudWxsQ291bnQgPSAwLCBvbmVDb3VudCA9IDAsIHR3b0NvdW50ID0gMCwgdGhyZWVDb3VudCA9IDAsIGZvdXJDb3VudCA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBiYWcyKSB7Ci0JCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJbnVsbENvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJvbmUiKSkgewotCQkJCW9uZUNvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0d28iKSkgewotCQkJCXR3b0NvdW50Kys7Ci0JCQl9IGVsc2UgaWYgKHMuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdGhyZWVDb3VudCsrOwotCQkJfSBlbHNlIGlmIChzLmVxdWFscygiZm91ciIpKSB7Ci0JCQkJZm91ckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIG51bGxDb3VudCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVDb3VudCk7Ci0JCWFzc2VydEVxdWFscygyLCB0d29Db3VudCk7Ci0JCWFzc2VydEVxdWFscygzLCB0aHJlZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGZvdXJDb3VudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0d28iKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAidGhyZWUiKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAiZm91ciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheU9iamVjdEFycmF5KCkgewotCQlTdHJpbmdbXSBhID0gbmV3IFN0cmluZ1sxMl07Ci0JCWFbMTFdID0gIm5vdCBudWxsIjsKLQkJU3RyaW5nW10gYiA9IHRoaXMuYmFnLnRvQXJyYXkoYSk7Ci0JCWFzc2VydEVxdWFscyhhLCBiKTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCAib25lIikpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJ0aHJlZSIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsICJmb3VyIikpOwotCQlhc3NlcnRUcnVlKGFbMTFdID09IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJU3RyaW5nIHMgPSB0aGlzLmJhZy50b1N0cmluZygpOwotCQlhc3NlcnRUcnVlKHMuc3RhcnRzV2l0aCgiWyIpKTsKLQkJYXNzZXJ0VHJ1ZShzLmVuZHNXaXRoKCJdIikpOwotCQlpbnQgY29tbWFDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAocy5jaGFyQXQoaSkgPT0gJywnKSB7Ci0JCQkJY29tbWFDb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygxMCwgY29tbWFDb3VudCk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJvbmUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0d28iKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0aHJlZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoImZvdXIiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJudWxsIikgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0lkZW50aXR5SGFzaEJhZ1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3MzhiZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSWRlbnRpdHlIYXNoQmFnVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSWRlbnRpdHlIYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSWRlbnRpdHlIYXNoQmFnVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWc7Ci0JcHJpdmF0ZSBTdHJpbmcgb25lID0gIm9uZSI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHdvID0gInR3byI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGhyZWUgPSAidGhyZWUiOwotCXByaXZhdGUgU3RyaW5nIGZvdXIgPSAiZm91ciI7Ci0JcHJpdmF0ZSBTdHJpbmcgZm9vID0gImZvbyI7Ci0JcHJpdmF0ZSBTdHJpbmcgYmFyID0gImJhciI7Ci0KLQlwdWJsaWMgSWRlbnRpdHlIYXNoQmFnVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5iYWcgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBidWlsZEJhZygpIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQobnVsbCk7Ci0JCXJlc3VsdC5hZGQodGhpcy5vbmUpOwotCQlyZXN1bHQuYWRkKHRoaXMudHdvKTsKLQkJcmVzdWx0LmFkZCh0aGlzLnR3byk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy50aHJlZSk7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmVzdWx0LmFkZCh0aGlzLmZvdXIpOwotCQlyZXN1bHQuYWRkKHRoaXMuZm91cik7Ci0JCXJlc3VsdC5hZGQodGhpcy5mb3VyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCXJldHVybiBjOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckNvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gbG9jYWxCYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oYyk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKGxvY2FsQmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3RvckludEZsb2F0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0OwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oLTIwLCAwLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5iYWcgPSBuZXcgSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4oMjAsIC0wLjY2Zik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQkvLyB0aGUgb3RoZXIgYWRkcyB0b29rIHBsYWNlIGluIHNldFVwCi0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZChmaXZlKSk7Ci0JCi0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhmaXZlKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb3VudCgpIHsKLQkJU3RyaW5nIG1pbnVzMyA9ICJtaW51czMiOwotCQlTdHJpbmcgemVybyA9ICJ6ZXJvIjsKLQkJU3RyaW5nIGZpdmUgPSAiZml2ZSI7Ci0JCS8vIHRoZSBvdGhlciBhZGRzIHRvb2sgcGxhY2UgaW4gc2V0VXAKLQkJdGhpcy5iYWcuYWRkKG1pbnVzMywgLTMpOwotCQl0aGlzLmJhZy5hZGQoemVybywgMCk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlLCA1KTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhtaW51czMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoemVybykpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5iYWcuY291bnQodGhpcy5vbmUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuYmFnLmNvdW50KHRoaXMudHdvKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmJhZy5jb3VudCh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHRoaXMuYmFnLmNvdW50KGZpdmUpKTsKLQotCQl0aGlzLmJhZy5hZGQodGhpcy50aHJlZSwgMik7Ci0JCWFzc2VydEVxdWFscyg1LCB0aGlzLmJhZy5jb3VudCh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmFkZEFsbChjKSk7Ci0JCWZvciAoU3RyaW5nIHMgOiBjKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHMpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgdGhpcy5iYWcuc2l6ZSgpKTsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMobnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5iYWcuY2xvbmUoKTsKLQkJYXNzZXJ0VHJ1ZSgiYmFkIGNsb25lIiwgdGhpcy5iYWcgIT0gYmFnMik7Ci0JCWFzc2VydEVxdWFscygiYmFkIGNsb25lIiwgdGhpcy5iYWcsIGJhZzIpOwotCQlhc3NlcnRUcnVlKCJiYWQgY2xvbmUiLCB0aGlzLmJhZy5oYXNoQ29kZSgpID09IGJhZzIuaGFzaENvZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWlucygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLmZvdXIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyhuZXcgU3RyaW5nKCJmb3VyIikpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnMoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc0FsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQobnVsbCk7Ci0JCWMuYWRkKHRoaXMub25lKTsKLQkJYy5hZGQodGhpcy50d28pOwotCQljLmFkZCh0aGlzLnRocmVlKTsKLQkJYy5hZGQodGhpcy5mb3VyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWluc0FsbChjKSk7Ci0JCWMuYWRkKG5ldyBTdHJpbmcodGhpcy5mb3VyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvdW50KCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoInplcm8iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmJhZy5jb3VudCgib25lIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5iYWcuY291bnQoInR3byIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMuYmFnLmNvdW50KCJ0aHJlZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuYmFnLmNvdW50KCJmb3VyIikpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5iYWcuY291bnQoImZpdmUiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUlkZW50aXR5SGFzaEJhZzxTdHJpbmc+IGJhZzIgPSB0aGlzLmJ1aWxkQmFnKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZywgYmFnMik7Ci0JCWJhZzIuYWRkKCJmaXZlIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmVxdWFscyhiYWcyKSk7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYmFnKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuZXF1YWxzKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotCQlJZGVudGl0eUhhc2hCYWc8U3RyaW5nPiBiYWcyID0gdGhpcy5idWlsZEJhZygpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYWcuaGFzaENvZGUoKSwgYmFnMi5oYXNoQ29kZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmlzRW1wdHkoKSk7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQkJdGhpcy5iYWcuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYmFnLmNsZWFyKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJhZy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBlbGVtZW50LCBleENhdWdodCk7Ci0JCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDExLCBpKTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCQotCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmJhZy5zaXplKCkpOwotCQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQkJdGhpcy5iYWcuYWRkKCJmaXZlIik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVJdGVyYXRvcigpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5iYWcudW5pcXVlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDUsIGkpOwotCQlhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoZWxlbWVudC50b1N0cmluZygpKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCS8vIHN0YXJ0IG92ZXIKLQkJaXRlcmF0b3IgPSB0aGlzLmJhZy51bmlxdWVJdGVyYXRvcigpOwotCQlPYmplY3QgbmV4dCA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgJiYgIXRoaXMuZm91ci5lcXVhbHMobmV4dCkpIHsKLQkJCW5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCWFzc2VydEVxdWFscyg3LCB0aGlzLmJhZy5zaXplKCkpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBmaXZlID0gImZpdmUiOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5uZXh0KCk7Ci0JCX0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW50cmllcygpIHsKLQkJaW50IGkgPSAwOwotCQlJdGVyYXRvcjxvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnLkVudHJ5PFN0cmluZz4+IGl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNSwgaSk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgZWxlbWVudCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJZmFpbChlbGVtZW50LnRvU3RyaW5nKCkpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJLy8gc3RhcnQgb3ZlcgotCQlpdGVyYXRvciA9IHRoaXMuYmFnLmVudHJpZXMoKTsKLQkJb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZy5FbnRyeTxTdHJpbmc+IG5leHQgPSBudWxsOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQluZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZ2V0RWxlbWVudCgpLmVxdWFscyh0aGlzLmZvdXIpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDcsIHRoaXMuYmFnLnNpemUoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQkvLyBzdGFydCBvdmVyCi0JCWl0ZXJhdG9yID0gdGhpcy5iYWcuZW50cmllcygpOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc2hpbmdEaXN0cmlidXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmlnQmFnID0gbmV3IElkZW50aXR5SGFzaEJhZzxTdHJpbmc+KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotCQkJYmlnQmFnLmFkZCgib2JqZWN0IiArIGkpOwotCQl9Ci0JCi0JCWphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGZpZWxkID0gYmlnQmFnLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRGaWVsZCgidGFibGUiKTsKLQkJZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJT2JqZWN0W10gdGFibGUgPSAoT2JqZWN0W10pIGZpZWxkLmdldChiaWdCYWcpOwotCQlpbnQgYnVja2V0Q291bnQgPSB0YWJsZS5sZW5ndGg7Ci0JCWludCBmaWxsZWRCdWNrZXRDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVja2V0Q291bnQ7IGkrKykgewotCQkJaWYgKHRhYmxlW2ldICE9IG51bGwpIHsKLQkJCQlmaWxsZWRCdWNrZXRDb3VudCsrOwotCQkJfQotCQl9Ci0JCWZsb2F0IGxvYWRGYWN0b3IgPSAoKGZsb2F0KSBmaWxsZWRCdWNrZXRDb3VudCkgLyAoKGZsb2F0KSBidWNrZXRDb3VudCk7Ci0JCWlmICgobG9hZEZhY3RvciA8IDAuMjApIHx8IChsb2FkRmFjdG9yID4gMC44MCkpIHsKLQkJCVN0cmluZyBtc2cgPSAicG9vciBsb2FkIGZhY3RvcjogIiArIGxvYWRGYWN0b3I7Ci0JCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJCWZhaWwobXNnKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gcG9vciBsb2FkIGZhY3RvciBpcyBzZWVuIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IGZvciBzb21lIHJlYXNvbi4uLgotCQkJCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKyAiIC0gIiArIG1zZyk7Ci0JCQkJVGVzdFRvb2xzLnByaW50U3lzdGVtUHJvcGVydGllcygpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSkpOwotCQotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnR3bykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUobmV3IFN0cmluZyh0aGlzLnRocmVlKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ291bnQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLm9uZSwgMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUsIDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMub25lKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvLCAtMykpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnR3bywgMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28sIDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudHdvKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50aHJlZSwgMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLnJlbW92ZSh0aGlzLnRocmVlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZChuZXcgU3RyaW5nKHRoaXMudHdvKSk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJlbW92ZUFsbChjKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMub25lKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50aHJlZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMudGhyZWUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlQWxsKGMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJldGFpbkFsbCgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQodGhpcy5vbmUpOwotCQljLmFkZChuZXcgU3RyaW5nKHRoaXMudHdvKSk7Ci0JCWMuYWRkKHRoaXMudGhyZWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnLnJldGFpbkFsbChjKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWcuY29udGFpbnModGhpcy5vbmUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcuY29udGFpbnModGhpcy50d28pKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5jb250YWlucyh0aGlzLnRocmVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnLmNvbnRhaW5zKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZW1vdmUodGhpcy50d28pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWcucmVtb3ZlKHRoaXMuZm91cikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZy5yZXRhaW5BbGwoYykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZy5zaXplKCkgPT0gMTEpOwotCQlTdHJpbmcgZml2ZSA9ICJmaXZlIjsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQoZml2ZSk7Ci0JCXRoaXMuYmFnLmFkZChmaXZlKTsKLQkJdGhpcy5iYWcuYWRkKGZpdmUpOwotCQl0aGlzLmJhZy5hZGQobmV3IFN0cmluZyhmaXZlKSk7Ci0JCWFzc2VydEVxdWFscygxNiwgdGhpcy5iYWcuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSWRlbnRpdHlIYXNoQmFnPFN0cmluZz4gYmFnMiA9IFRlc3RUb29scy5zZXJpYWxpemUodGhpcy5iYWcpOwotCQotCQlhc3NlcnRUcnVlKCJzYW1lIG9iamVjdD8iLCB0aGlzLmJhZyAhPSBiYWcyKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBiYWcyLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYmFnLml0ZXJhdG9yKCkpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkpOwotCQkvLyBsb29rIGZvciBzaW1pbGFyIGVsZW1lbnRzCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmJhZyhiYWcyLml0ZXJhdG9yKCkpLmNvbnRhaW5zKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoIm9uZSIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoInR3byIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuYmFnKGJhZzIuaXRlcmF0b3IoKSkuY29udGFpbnMoInRocmVlIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5iYWcoYmFnMi5pdGVyYXRvcigpKS5jb250YWlucygiZm91ciIpKTsKLQkKLQkJaW50IG51bGxDb3VudCA9IDAsIG9uZUNvdW50ID0gMCwgdHdvQ291bnQgPSAwLCB0aHJlZUNvdW50ID0gMCwgZm91ckNvdW50ID0gMDsKLQkJZm9yIChTdHJpbmcgbmV4dCA6IGJhZzIpIHsKLQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJbnVsbENvdW50Kys7Ci0JCQllbHNlIGlmIChuZXh0LmVxdWFscygib25lIikpCi0JCQkJb25lQ291bnQrKzsKLQkJCWVsc2UgaWYgKG5leHQuZXF1YWxzKCJ0d28iKSkKLQkJCQl0d29Db3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoInRocmVlIikpCi0JCQkJdGhyZWVDb3VudCsrOwotCQkJZWxzZSBpZiAobmV4dC5lcXVhbHMoImZvdXIiKSkKLQkJCQlmb3VyQ291bnQrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgbnVsbENvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHR3b0NvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRocmVlQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoNCwgZm91ckNvdW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXkoKSB7Ci0JCU9iamVjdFtdIGEgPSB0aGlzLmJhZy50b0FycmF5KCk7Ci0JCWFzc2VydEVxdWFscygxMSwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnRocmVlKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJU3RyaW5nW10gYSA9IG5ldyBTdHJpbmdbMTJdOwotCQlhWzExXSA9ICJub3QgbnVsbCI7Ci0JCVN0cmluZ1tdIGIgPSB0aGlzLmJhZy50b0FycmF5KGEpOwotCQlhc3NlcnRFcXVhbHMoYSwgYik7Ci0JCWFzc2VydEVxdWFscygxMiwgYS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgbnVsbCkpOwotCQlhc3NlcnRUcnVlKEFycmF5VG9vbHMuY29udGFpbnMoYSwgdGhpcy5vbmUpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKGEsIHRoaXMudHdvKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLnRocmVlKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlUb29scy5jb250YWlucyhhLCB0aGlzLmZvdXIpKTsKLQkJYXNzZXJ0VHJ1ZShhWzExXSA9PSBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTdHJpbmcgcyA9IHRoaXMuYmFnLnRvU3RyaW5nKCk7Ci0JCWFzc2VydFRydWUocy5zdGFydHNXaXRoKCJbIikpOwotCQlhc3NlcnRUcnVlKHMuZW5kc1dpdGgoIl0iKSk7Ci0JCWludCBjb21tYUNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChzLmNoYXJBdChpKSA9PSAnLCcpIHsKLQkJCQljb21tYUNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbnZhbGlkIG51bWJlciBvZiBjb21tYXMiLCAxMCwgY29tbWFDb3VudCk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJvbmUiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0d28iKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJ0aHJlZSIpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShzLmluZGV4T2YoImZvdXIiKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocy5pbmRleE9mKCJudWxsIikgIT0gLTEpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9JbmRlbnRpbmdQcmludFdyaXRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDMzMWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL0luZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSW5kZW50aW5nUHJpbnRXcml0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlTdHJpbmdXcml0ZXIgc3cxOwotCVN0cmluZ1dyaXRlciBzdzI7Ci0JSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3MTsKLQlJbmRlbnRpbmdQcmludFdyaXRlciBpcHcyOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXB1YmxpYyBJbmRlbnRpbmdQcmludFdyaXRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3cxID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl0aGlzLmlwdzEgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIodGhpcy5zdzEpOwotCQl0aGlzLnN3MiA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJdGhpcy5pcHcyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHRoaXMuc3cyLCAiICAgICIpOyAvLyBpbmRlbnQgd2l0aCA0IHNwYWNlcyBpbnN0ZWFkIG9mIGEgdGFiCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbnQoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMSwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNyZW1lbnRJbmRlbnRMZXZlbCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAwLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5pbmNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDEsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVjcmVtZW50SW5kZW50TGV2ZWwoKSB7Ci0JCWFzc2VydEVxdWFscygid3JvbmcgaW5kZW50IGxldmVsIiwgMCwgdGhpcy5pcHcxLmdldEluZGVudExldmVsKCkpOwotCQl0aGlzLmlwdzEuaW5jcmVtZW50SW5kZW50TGV2ZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3cm9uZyBpbmRlbnQgbGV2ZWwiLCAxLCB0aGlzLmlwdzEuZ2V0SW5kZW50TGV2ZWwoKSk7Ci0JCXRoaXMuaXB3MS5kZWNyZW1lbnRJbmRlbnRMZXZlbCgpOwotCQlhc3NlcnRFcXVhbHMoIndyb25nIGluZGVudCBsZXZlbCIsIDAsIHRoaXMuaXB3MS5nZXRJbmRlbnRMZXZlbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUYWIoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJcdGZvbzEiICsgQ1IgKyAiXHRcdGZvbzIiICsgQ1IgKyAiXHRmb28xIiArIENSICsgIlx0Zm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3MS5pbmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcxLmluZGVudCgpOwotCQl0aGlzLmlwdzEucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzEudW5kZW50KCk7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3MS51bmRlbnQoKTsKLQkJdGhpcy5pcHcxLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3MS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbnRTcGFjZXMoKSB7Ci0JCVN0cmluZyBleHBlY3RlZCA9ICJmb28wIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICBmb28xIiArIENSICsgIiAgICAgICAgZm9vMiIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICIgICAgZm9vMSIgKyBDUiArICJmb28wIiArIENSOwotCi0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28wIik7Ci0JCXRoaXMuaXB3Mi5pbmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzEiKTsKLQkJdGhpcy5pcHcyLmluZGVudCgpOwotCQl0aGlzLmlwdzIucHJpbnRsbigiZm9vMiIpOwotCQl0aGlzLmlwdzIudW5kZW50KCk7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi5wcmludGxuKCJmb28xIik7Ci0JCXRoaXMuaXB3Mi51bmRlbnQoKTsKLQkJdGhpcy5pcHcyLnByaW50bG4oImZvbzAiKTsKLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIG91dHB1dCIsIGV4cGVjdGVkLCB0aGlzLnN3Mi50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSkRCQ1R5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUzNDYzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KREJDVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLlR5cGVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSkRCQ1R5cGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpEQkNUeXBlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSkRCQ1R5cGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZXNTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoVHlwZXMuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGgsIEpEQkNUeXBlLnR5cGVzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJSkRCQ1R5cGUgamRiY1R5cGU7Ci0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5WQVJDSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgamRiY1R5cGUubmFtZSgpKTsKLQotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuSU5URUdFUik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGpkYmNUeXBlLm5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvZGUoKSB7Ci0JCUpEQkNUeXBlIGpkYmNUeXBlOwotCQlqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoVHlwZXMuVkFSQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhUeXBlcy5WQVJDSEFSLCBqZGJjVHlwZS5jb2RlKCkpOwotCi0JCWpkYmNUeXBlID0gSkRCQ1R5cGUudHlwZShUeXBlcy5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKFR5cGVzLklOVEVHRVIsIGpkYmNUeXBlLmNvZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoNTUpOwotCQkJZmFpbCgiaW52YWxpZCBKREJDVHlwZTogIiArIGpkYmNUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKREJDVHlwZSBqZGJjVHlwZSA9IEpEQkNUeXBlLnR5cGUoIlZBUkNIQVIyIik7Ci0JCQlmYWlsKCJpbnZhbGlkIEpEQkNUeXBlOiAiICsgamRiY1R5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSmF2YVR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTA3YTAyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KYXZhVHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBKYXZhVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKG51bGwsIDApOwotCQkJZmFpbCgiaW52YWxpZCBKYXZhVHlwZTogIiArIGphdmFUeXBlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRFbGVtZW50VHlwZUVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKCIiLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRWxlbWVudFR5cGVBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MuZ2V0TmFtZSgpLCAwKTsKLQkJCWZhaWwoImludmFsaWQgSmF2YVR5cGU6ICIgKyBqYXZhVHlwZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQXJyYXlEZXB0aE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0TmFtZSgpLCAtMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFZvaWRBcnJheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlKYXZhVHlwZSBqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSwgMik7Ci0JCQlmYWlsKCJpbnZhbGlkIEphdmFUeXBlOiAiICsgamF2YVR5cGUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0RWxlbWVudFR5cGVOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRFbGVtZW50VHlwZU5hbWUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCRFbnRyeSIsIGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXJyYXlEZXB0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludFtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFUeXBlLmdldEFycmF5RGVwdGgoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUodm9pZC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoMCwgamF2YVR5cGUuZ2V0QXJyYXlEZXB0aCgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygyLCBqYXZhVHlwZS5nZXRBcnJheURlcHRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0FycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRUcnVlKGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNBcnJheSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5W11bXS5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNBcnJheSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhpbnRbXS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5SmF2YUNsYXNzKHZvaWQuY2xhc3MpOwotCQl0aGlzLnZlcmlmeUphdmFDbGFzcyhqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlKYXZhQ2xhc3MoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlKYXZhQ2xhc3MoQ2xhc3M8Pz4gamF2YUNsYXNzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YUNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFDbGFzcywgamF2YVR5cGUuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQ2xhc3NOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlOwotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLmxhbmcuT2JqZWN0W10uY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIltMamF2YS5sYW5nLk9iamVjdDsiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgamF2YVR5cGUuZ2V0SmF2YUNsYXNzTmFtZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiW0kiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKHZvaWQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoInZvaWQiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5NYXAkRW50cnkiLCBqYXZhVHlwZS5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJbW0xqYXZhLnV0aWwuTWFwJEVudHJ5OyIsIGphdmFUeXBlLmdldEphdmFDbGFzc05hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2NyaWJlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyhqYXZhLmxhbmcuT2JqZWN0LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS5sYW5nLk9iamVjdFtdLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50LmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoaW50W10uY2xhc3MpOwotCQl0aGlzLnZlcmlmeURlc2NyaWJlcyh2b2lkLmNsYXNzKTsKLQkJdGhpcy52ZXJpZnlEZXNjcmliZXMoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCXRoaXMudmVyaWZ5RGVzY3JpYmVzKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVzY3JpYmVzKENsYXNzPD8+IGphdmFDbGFzcykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUphdmFUeXBlIGphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmFDbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuZGVzY3JpYmVzKGphdmFDbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdFtdIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShpbnRbXS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiaW50W10iLCBqYXZhVHlwZS5kZWNsYXJhdGlvbigpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgamF2YVR5cGUuZGVjbGFyYXRpb24oKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeS5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcC5FbnRyeSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5NYXAuRW50cnlbXVtdLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwuTWFwLkVudHJ5W11bXSIsIGphdmFUeXBlLmRlY2xhcmF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1ByaW1pdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqYXZhVHlwZTsKLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3RbXS5jbGFzcyk7Ci0JCWFzc2VydEZhbHNlKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpOwotCi0JCWphdmFUeXBlID0gbmV3IFNpbXBsZUphdmFUeXBlKGludC5jbGFzcyk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoaW50W10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQotCQlqYXZhVHlwZSA9IG5ldyBTaW1wbGVKYXZhVHlwZShqYXZhLnV0aWwuTWFwLkVudHJ5LmNsYXNzKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVR5cGUuaXNQcmltaXRpdmUoKSk7Ci0KLQkJamF2YVR5cGUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS51dGlsLk1hcC5FbnRyeVtdW10uY2xhc3MpOwotCQlhc3NlcnRGYWxzZShqYXZhVHlwZS5pc1ByaW1pdGl2ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25VdGlsaXR5VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9KcHRDb21tb25VdGlsaXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzNjA3ZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvSnB0Q29tbW9uVXRpbGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLmVudW1lcmF0aW9ucy5KcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlcy5KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9ycy5KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLkpwdFV0aWxpdHlNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlLkpwdFV0aWxpdHlOb2RlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnMuSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0czsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRDb21tb25VdGlsaXR5VGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdENvbW1vblV0aWxpdHlUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlOb2RlVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5zdWl0ZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJpZGlGaWx0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCaWRpU3RyaW5nQ29udmVydGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQmlkaVRyYW5zZm9ybWVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQml0VG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVCb29sZWFuUmVmZXJlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQm9vbGVhblRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NwYXRoVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xhc3NOYW1lVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvblRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZEV4ZWN1dG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZFJ1bm5hYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tbWFuZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUNvbW1hbmRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeGNlcHRpb25IYW5kbGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsZVRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElkZW50aXR5SGFzaEJhZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEluZGVudGluZ1ByaW50V3JpdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlSW50UmVmZXJlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKREJDVHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEtleWVkU2V0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdGVuZXJMaXN0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWV0aG9kU2lnbmF0dXJlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmFtZVRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTm90TnVsbEZpbHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJhbmdlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGlvblRvb2xzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVBc3NvY2lhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZVF1ZXVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlU3RhY2tUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdHJpbmdUb29sc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRJbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZFN0YWNrVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVG9vbHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWZXJzaW9uQ29tcGFyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhNTFN0cmluZ0VuY29kZXJUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0Q29tbW9uVXRpbGl0eVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9LZXllZFNldFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvS2V5ZWRTZXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI3ZTVkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9LZXllZFNldFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLktleWVkU2V0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBLZXllZFNldFRlc3RzCi0JCWV4dGVuZHMgVGVzdENhc2UgewotCQotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBTdHJpbmc+IG5pY2tuYW1lczsKLQkKLQkKLQlwdWJsaWMgS2V5ZWRTZXRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uaWNrbmFtZXMgPSB0aGlzLmJ1aWxkTmlja25hbWVzKCk7Ci0JfQotCQotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkTmlja25hbWVzKCkgewotCQlLZXllZFNldDxTdHJpbmcsIFN0cmluZz4ga3MgPSBuZXcgS2V5ZWRTZXQ8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWtzLmFkZEl0ZW0oIkppbW15IiwgIkphbWVzIFN1bGxpdmFuIik7Ci0JCWtzLmFkZEtleSgiU3VsbHkiLCAiSmFtZXMgU3VsbGl2YW4iKTsKLQkJa3MuYWRkSXRlbSgiQm9iIiwgIlJvYmVydCBNY0tlbm5hIik7Ci0JCWtzLmFkZEtleSgiTWFjIiwgIlJvYmVydCBNY0tlbm5hIik7Ci0JCXJldHVybiBrczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbSgpIHsKLQkJLy8gaXRlbXMgYWRkZWQgaW4gc2V0dXAKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiUm9iZXJ0IE1jS2VubmEiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkpvaG4gVGVhc2RhbGUiKSk7Ci0JCXRoaXMubmlja25hbWVzLmFkZEl0ZW0oIkphY2siLCAiSm9obiBUZWFzZGFsZSIpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSm9obiBUZWFzZGFsZSIpKTsKLQkJCi0JCXRoaXMubmlja25hbWVzLmFkZEl0ZW0oIlRlYXNlciIsICJKb2huIFRlYXNkYWxlIik7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKb2huIFRlYXNkYWxlIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJUZWFzZXIiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRLZXkoKSB7Ci0JCS8vIGl0ZW1zIGFkZGVkIGluIHNldHVwCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIkppbW15IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiQm9iIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJNYWMiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiUm9iYmllIikpOwotCQl0aGlzLm5pY2tuYW1lcy5hZGRLZXkoIlJvYmJpZSIsICJSb2JlcnQgTWNLZW5uYSIpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJSb2JiaWUiKSk7Ci0JCQotCQlib29sZWFuIGV4Y2VwdGlvbkNhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5uaWNrbmFtZXMuYWRkS2V5KCJUZWFzZXIiLCAiSm9obiBUZWFzZGFsZSIpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlleGNlcHRpb25DYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhjZXB0aW9uQ2F1Z2h0KTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJdGVtKCkgewotCQkvLyBpdGVtcyBhZGRlZCBpbiBzZXR1cAotCQlhc3NlcnRFcXVhbHModGhpcy5uaWNrbmFtZXMuZ2V0SXRlbSgiSmltbXkiKSwgIkphbWVzIFN1bGxpdmFuIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm5pY2tuYW1lcy5nZXRJdGVtKCJTdWxseSIpLCAiSmFtZXMgU3VsbGl2YW4iKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubmlja25hbWVzLmdldEl0ZW0oIkJvYiIpLCAiUm9iZXJ0IE1jS2VubmEiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubmlja25hbWVzLmdldEl0ZW0oIk1hYyIpLCAiUm9iZXJ0IE1jS2VubmEiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm5pY2tuYW1lcy5nZXRJdGVtKCJKYWNrIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJLy8gaXRlbXMgYWRkZWQgaW4gc2V0dXAKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCQotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLnJlbW92ZUl0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0l0ZW0oIkphbWVzIFN1bGxpdmFuIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJTdWxseSIpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLnJlbW92ZUl0ZW0oIldpbGxpYW0gR29sZGJlcmciKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVLZXkoKSB7Ci0JCS8vIGl0ZW1zIGFkZGVkIGluIHNldHVwCi0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNJdGVtKCJKYW1lcyBTdWxsaXZhbiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiSmltbXkiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5yZW1vdmVLZXkoIkppbW15IikpOwotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5pY2tuYW1lcy5jb250YWluc0tleSgiU3VsbHkiKSk7Ci0JCQotCQlhc3NlcnRUcnVlKHRoaXMubmlja25hbWVzLnJlbW92ZUtleSgiU3VsbHkiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zSXRlbSgiSmFtZXMgU3VsbGl2YW4iKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubmlja25hbWVzLmNvbnRhaW5zS2V5KCJKaW1teSIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMuY29udGFpbnNLZXkoIlN1bGx5IikpOwotCQkKLQkJYXNzZXJ0RmFsc2UodGhpcy5uaWNrbmFtZXMucmVtb3ZlS2V5KCJCaWxseSIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTGlzdGVuZXJMaXN0VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9MaXN0ZW5lckxpc3RUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQwZjUyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9MaXN0ZW5lckxpc3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXN0ZW5lckxpc3RUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBMaXN0ZW5lckxpc3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlJdGVyYWJsZTxMaXN0ZW5lcj4gbGlzdGVuZXJzID0gbGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUobGlzdGVuZXJzKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGxpc3RlbmVycykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lcnMsIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lcnMsIGxpc3RlbmVyMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjEgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbGlzdGVuZXJMaXN0LnNpemUoKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lckxpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0ZW5lckxpc3QuaXNFbXB0eSgpKTsKLQotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMSk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJMaXN0LmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZF9udWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QuYWRkKG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBsaXN0ZW5lciBsaXN0OiAiICsgbGlzdGVuZXJMaXN0KTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkX2R1cGxpY2F0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQkJCWZhaWwoImludmFsaWQgbGlzdGVuZXIgbGlzdDogIiArIGxpc3RlbmVyTGlzdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMSA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCUxpc3RlbmVyIGxpc3RlbmVyMiA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIxKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMikpOwotCi0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIxKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlX251bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWxpc3RlbmVyTGlzdC5yZW1vdmUobnVsbCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGxpc3RlbmVyIGxpc3Q6ICIgKyBsaXN0ZW5lckxpc3QpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVfdW5yZWdpc3RlcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUxpc3RlbmVyTGlzdDxMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxMaXN0ZW5lcj4oTGlzdGVuZXIuY2xhc3MpOwotCQlMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlsaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJCWZhaWwoImludmFsaWQgbGlzdGVuZXIgbGlzdDogIiArIGxpc3RlbmVyTGlzdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIxKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSwgbGlzdGVuZXIyKSk7Ci0KLQkJbGlzdGVuZXJMaXN0LmNsZWFyKCk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCksIGxpc3RlbmVyMSkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMobGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpLCBsaXN0ZW5lcjIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUaGlzIHRlc3QgZG9lc24ndCBwYXNzIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IChMaW51eC9JQk0gVk0pIGZvciBzb21lIHJlYXNvbgotCQlpZiAoVG9vbHMuanZtSXNTdW4oKSkgewotCQkJdGhpcy52ZXJpZnlTZXJpYWxpemF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8TGlzdGVuZXI+KExpc3RlbmVyLmNsYXNzKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIxID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcjEpOwotCQlsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyMik7Ci0KLQkJTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShsaXN0ZW5lckxpc3QpOwotCQlhc3NlcnROb3RTYW1lKGxpc3RlbmVyTGlzdCwgbGlzdGVuZXJMaXN0Mik7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lckxpc3QyLnNpemUoKSk7Ci0KLQkJTGlzdGVuZXIgbGlzdGVuZXIzID0gbmV3IE5vblNlcmlhbGl6YWJsZUxpc3RlbmVyKCk7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIzKTsKLQotCQlsaXN0ZW5lckxpc3QyID0gVGVzdFRvb2xzLnNlcmlhbGl6ZShsaXN0ZW5lckxpc3QpOwotCQlhc3NlcnROb3RTYW1lKGxpc3RlbmVyTGlzdCwgbGlzdGVuZXJMaXN0Mik7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lckxpc3QyLnNpemUoKSk7Ci0KLQl9Ci0KLQlpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpOwotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTG9jYWxMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RlbmVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgdm9pZCBzb21ldGhpbmdIYXBwZW5lZCgpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTm9uU2VyaWFsaXphYmxlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHNvbWV0aGluZ0hhcHBlbmVkKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL01ldGhvZFNpZ25hdHVyZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1OGUyZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTWV0aG9kU2lnbmF0dXJlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZU1ldGhvZFNpZ25hdHVyZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWV0aG9kU2lnbmF0dXJlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWV0aG9kU2lnbmF0dXJlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgoU3RyaW5nKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoIiIpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlNZXRob2RTaWduYXR1cmUgbWV0aG9kU2lnbmF0dXJlID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSgiZm9vIiwgKEphdmFUeXBlW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVzTnVsbEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIG5ldyBKYXZhVHlwZVsxXSk7Ci0JCQlmYWlsKCJpbnZhbGlkIE1ldGhvZFNpZ25hdHVyZTogIiArIG1ldGhvZFNpZ25hdHVyZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUGFyYW1ldGVyVHlwZXNWb2lkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKYXZhVHlwZSBqdCA9IG5ldyBTaW1wbGVKYXZhVHlwZSh2b2lkLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgSmF2YVR5cGVbXSB7anR9KTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJUeXBlTmFtZXNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCAoU3RyaW5nW10pIG51bGwpOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhcmFtZXRlclR5cGVOYW1lc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgU3RyaW5nWzFdKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUoImZvbyIsIChDbGFzczw/PltdKSBudWxsKTsKLQkJCWZhaWwoImludmFsaWQgTWV0aG9kU2lnbmF0dXJlOiAiICsgbWV0aG9kU2lnbmF0dXJlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbWV0ZXJKYXZhQ2xhc3Nlc051bGxJdGVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCU1ldGhvZFNpZ25hdHVyZSBtZXRob2RTaWduYXR1cmUgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKCJmb28iLCBuZXcgQ2xhc3NbMV0pOwotCQkJZmFpbCgiaW52YWxpZCBNZXRob2RTaWduYXR1cmU6ICIgKyBtZXRob2RTaWduYXR1cmUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMCgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QwIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDAoKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QxIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDEoaW50KSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDIoaW50LCBqYXZhLmxhbmcuU3RyaW5nKSIsIG1zLmdldFNpZ25hdHVyZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2lnbmF0dXJlMygpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRob2RTaWduYXR1cmUgbXMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlhc3NlcnRFcXVhbHMoIm1ldGhvZDMoaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W11bXSkiLCBtcy5nZXRTaWduYXR1cmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtZXRob2QyIiwgbXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGFyYW1ldGVyVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0aG9kU2lnbmF0dXJlIG1zID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJSmF2YVR5cGVbXSBleHBlY3RlZCA9IG5ldyBKYXZhVHlwZVszXTsKLQkJZXhwZWN0ZWRbMF0gPSBuZXcgU2ltcGxlSmF2YVR5cGUoImludCIpOwotCQlleHBlY3RlZFsxXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLlN0cmluZyIpOwotCQlleHBlY3RlZFsyXSA9IG5ldyBTaW1wbGVKYXZhVHlwZSgiamF2YS5sYW5nLk9iamVjdCIsIDIpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIG1zLmdldFBhcmFtZXRlclR5cGVzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtczEgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QzIikpOwotCQlPYmplY3QgbXMyID0gbmV3IFNpbXBsZU1ldGhvZFNpZ25hdHVyZSh0aGlzLmdldE1ldGhvZCgibWV0aG9kMyIpKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMSk7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEuaGFzaENvZGUoKSwgbXMyLmhhc2hDb2RlKCkpOwotCi0JCU9iamVjdCBtczMgPSBuZXcgU2ltcGxlTWV0aG9kU2lnbmF0dXJlKHRoaXMuZ2V0TWV0aG9kKCJtZXRob2QyIikpOwotCQlhc3NlcnROb3RTYW1lKG1zMSwgbXMzKTsKLQkJYXNzZXJ0RmFsc2UobXMxLmVxdWFscyhtczMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSAoU2ltcGxlTWV0aG9kU2lnbmF0dXJlKSBtczEuY2xvbmUoKTsKLQkJYXNzZXJ0Tm90U2FtZShtczEsIG1zMik7Ci0JCWFzc2VydEVxdWFscyhtczEsIG1zMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTWV0aG9kU2lnbmF0dXJlIG1zMSA9IG5ldyBTaW1wbGVNZXRob2RTaWduYXR1cmUodGhpcy5nZXRNZXRob2QoIm1ldGhvZDMiKSk7Ci0JCVNpbXBsZU1ldGhvZFNpZ25hdHVyZSBtczIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKG1zMSk7Ci0JCWFzc2VydE5vdFNhbWUobXMxLCBtczIpOwotCQlhc3NlcnRFcXVhbHMobXMxLCBtczIpOwotCX0KLQotCXByaXZhdGUgTWV0aG9kIGdldE1ldGhvZChTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlmb3IgKE1ldGhvZCBtZXRob2QgOiB0aGlzLmdldENsYXNzKCkuZ2V0TWV0aG9kcygpKSB7Ci0JCQlpZiAobWV0aG9kLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1ldGhvZCBub3QgZm91bmQ6ICIgKyBtZXRob2ROYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtZXRob2QwKCkgeyAvKiB1c2VkIGJ5IHRlc3RzICovIH0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kMShpbnQgZm9vKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2QyKGludCBmb28sIFN0cmluZyBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIHB1YmxpYyB2b2lkIG1ldGhvZDMoaW50IGZvbywgU3RyaW5nIGJhciwgT2JqZWN0W11bXSBiYXopIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQShpbnQgZm9vLCBTdHJpbmcgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2RBKGludCBmb28sIFN0cmluZyBiYXIsIFN0cmluZyBiYXopIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgcHVibGljIHZvaWQgbWV0aG9kQihpbnQgZm9vLCBPYmplY3QgYmFyKSB7IC8qIHVzZWQgYnkgdGVzdHMgKi8gfQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBwdWJsaWMgdm9pZCBtZXRob2RCKGludCBmb28sIFN0cmluZyBiYXIpIHsgLyogdXNlZCBieSB0ZXN0cyAqLyB9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NdWx0aVRocmVhZGVkVGVzdENhc2UuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9NdWx0aVRocmVhZGVkVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhYzMxMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTXVsdGlUaHJlYWRlZFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGNhc2UgaGVscHMgc2ltcGxpZnkgdGhlIHRlc3Rpbmcgb2YgbXVsdGktdGhyZWFkZWQgY29kZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFRocmVhZD4gdGhyZWFkcyA9IG5ldyBBcnJheUxpc3Q8VGhyZWFkPigpOwotCS8qIHByaXZhdGUgKi8gZmluYWwgVmVjdG9yPFRocm93YWJsZT4gZXhjZXB0aW9ucyA9IG5ldyBWZWN0b3I8VGhyb3dhYmxlPigpOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgInRpY2siIGlzIG9uZSBzZWNvbmQuCi0JICogU3BlY2lmeSB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIHByb3BlcnR5IHRvIG92ZXJyaWRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJQ0tfU1lTVEVNX1BST1BFUlRZX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLnRpY2siOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSUNLID0gTG9uZy5nZXRMb25nKFRJQ0tfU1lTVEVNX1BST1BFUlRZX05BTUUsIDEwMDApLmxvbmdWYWx1ZSgpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUV09fVElDS1MgPSAyICogVElDSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVEhSRUVfVElDS1MgPSAzICogVElDSzsKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIE11bHRpVGhyZWFkZWRUZXN0Q2FzZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JfQotCi0JLyoqCi0JICogU3RvcCBhbGwgdGhlIHRocmVhZHMgY29uc3RydWN0ZWQgZHVyaW5nIHRoZSB0ZXN0IGNhc2UuCi0JICogSWYgYW55IGV4Y2VwdGlvbnMgd2VyZSB0aHJvd24gYnkgdGhlIHRocmVhZHMsIHJlLXRocm93IHRoZW0gaGVyZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlmb3IgKFRocmVhZCB0aHJlYWQgOiB0aGlzLnRocmVhZHMpIHsKLQkJCWlmICh0aHJlYWQuaXNBbGl2ZSgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGhyZWFkIGlzIHN0aWxsIGFsaXZlOiAiICsgdGhyZWFkKTsKLQkJCX0KLQkJfQotCQlpZiAoICEgdGhpcy5leGNlcHRpb25zLmlzRW1wdHkoKSkgewotCQkJdGhyb3cgbmV3IENvbXBvc2l0ZUV4Y2VwdGlvbih0aGlzLmV4Y2VwdGlvbnMpOwotCQl9Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkIGJ1aWxkVGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkIGJ1aWxkVGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlLCBTdHJpbmcgbmFtZSkgewotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChuZXcgUnVubmFibGVXcmFwcGVyKHJ1bm5hYmxlKSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXRocmVhZC5zZXROYW1lKG5hbWUpOwotCQl9Ci0JCXRoaXMudGhyZWFkcy5hZGQodGhyZWFkKTsKLQkJcmV0dXJuIHRocmVhZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkRmFjdG9yeSBidWlsZFRocmVhZEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFRocmVhZEZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoYW5kbGVzIHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0uCi0JICovCi0JcHVibGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJVGVzdFRvb2xzLnNsZWVwKG1pbGxpcyk7Ci0JfQotCi0KLQkvKioKLQkgKiBXcmFwIGEgcnVubmFibGUgYW5kIGxvZyBhbnkgZXhjZXB0aW9uIGl0IHRocm93cy4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgVGVzdFRocmVhZEZhY3RvcnkgaW1wbGVtZW50cyBUaHJlYWRGYWN0b3J5IHsKLQkJcHVibGljIFRocmVhZCBuZXdUaHJlYWQoUnVubmFibGUgcikgewotCQkJcmV0dXJuIE11bHRpVGhyZWFkZWRUZXN0Q2FzZS50aGlzLmJ1aWxkVGhyZWFkKHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2ltcGxpZnkgcnVubmFibGVzIHRoYXQgZXhlY3V0ZSBjYWxsIHRoYXQgdGhyb3dzIGNoZWNrZWQgZXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdFJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMucnVuXygpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJ1bl8oKSB0aHJvd3MgVGhyb3dhYmxlOwotCX0KLQotCS8qKgotCSAqIFdyYXAgYSBydW5uYWJsZSBhbmQgbG9nIGFueSBleGNlcHRpb24gaXQgdGhyb3dzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUnVubmFibGVXcmFwcGVyIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIHJ1bm5hYmxlOwotCQlSdW5uYWJsZVdyYXBwZXIoUnVubmFibGUgcnVubmFibGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLnJ1bm5hYmxlLnJ1bigpOwotCQkJfSBjYXRjaCAoVGhyb3dhYmxlIGV4KSB7Ci0JCQkJTXVsdGlUaHJlYWRlZFRlc3RDYXNlLnRoaXMuZXhjZXB0aW9ucy5hZGQoZXgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05hbWVUb29sc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTmFtZVRvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4NmFhYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvTmFtZVRvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTmFtZVRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTmFtZVRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0Fic2VudElnbm9yZUNhc2UoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGF1cGUiLCBjb2xvckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoIlRhdXBlIiwgcmV0dXJuZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQcmVzZW50Q2FzZURpZmZlcnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjb2xvckNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sb3JDb2xsZWN0aW9uKCk7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJncmVlbiIsIGNvbG9yQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZ3JlZW4iLCByZXR1cm5lZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1ByZXNlbnRJZ25vcmVDYXNlKCkgewotCQlMaXN0PFN0cmluZz4gY29sb3JDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbG9yQ29sbGVjdGlvbigpOwotCQlTdHJpbmcgcmV0dXJuZWQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoImdyZWVuIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJncmVlbjIiLCByZXR1cm5lZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ1ByZXNlbnRXaXRoQXBwZW5kaWNlcygpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IHRoaXMuYnVpbGRDb2xvckNvbGxlY3Rpb24oKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiUmVkMSIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJyZWQyIik7Ci0JCVN0cmluZyByZXR1cm5lZCA9IE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgicmVkIiwgY29sb3JDb2xsZWN0aW9uKTsKLQkJY29sb3JDb2xsZWN0aW9uLnJlbW92ZSgiUmVkMSIpOwotCQljb2xvckNvbGxlY3Rpb24ucmVtb3ZlKCJyZWQyIik7Ci0JCWFzc2VydEVxdWFscygicmVkMyIsIHJldHVybmVkKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZENvbG9yQ29sbGVjdGlvbigpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbG9yQ29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJSZWQiKTsKLQkJY29sb3JDb2xsZWN0aW9uLmFkZCgiT3JhbmdlIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIlllbGxvdyIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJHcmVlbiIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJCbHVlIik7Ci0JCWNvbG9yQ29sbGVjdGlvbi5hZGQoIkluZGlnbyIpOwotCQljb2xvckNvbGxlY3Rpb24uYWRkKCJWaW9sZXQiKTsKLQkJcmV0dXJuIGNvbG9yQ29sbGVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckNvbGxlY3Rpb24xKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZTEiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJPcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncykpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZU5hbWVGb3JDb2xsZWN0aW9uMigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgib3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0IiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIlRlc3QiLCBzdHJpbmdzKSk7Ci0KLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3JJZ25vcmVDYXNlKCJvcmFjbGUiLCBzdHJpbmdzKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckNvbGxlY3Rpb24zKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9ySXRlcmF0b3IxKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUgQ29ycG9yYXRpb24iKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIm9yYWNsZTEiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCi0JCWFzc2VydEVxdWFscygiT3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygib3JhY2xlMyIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgib3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9ySWdub3JlQ2FzZSgiVGVzdCIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVOYW1lRm9ySXRlcmF0b3IyKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJvcmFjbGUiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTIiKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZTEiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcigiT3JhY2xlIiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIE5hbWVUb29scy51bmlxdWVOYW1lRm9yKCJUZXN0Iiwgc3RyaW5ncy5pdGVyYXRvcigpKSk7Ci0KLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSBDb3Jwb3JhdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIk9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9yYWNsZTMiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIm9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UoIlRlc3QiLCBzdHJpbmdzLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlTmFtZUZvckl0ZXJhdG9yMygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJc3RyaW5ncy5hZGQoIk9yYWNsZSIpOwotCQlzdHJpbmdzLmFkZCgiT3JhY2xlIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUyIik7Ci0JCXN0cmluZ3MuYWRkKCJPcmFjbGUxIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJPcmFjbGUzIiwgTmFtZVRvb2xzLnVuaXF1ZU5hbWVGb3IoIk9yYWNsZSIsIHN0cmluZ3MuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJjYXRhbG9nLnNjaGVtYS5uYW1lIiwgTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKCJjYXRhbG9nIiwgInNjaGVtYSIsICJuYW1lIikpOwotCQlhc3NlcnRFcXVhbHMoImNhdGFsb2cuLm5hbWUiLCBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUoImNhdGFsb2ciLCBudWxsLCAibmFtZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzY2hlbWEubmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZShudWxsLCAic2NoZW1hIiwgIm5hbWUiKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZShudWxsLCBudWxsLCAibmFtZSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVJlc2VydmVkV29yZHMoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKE5hbWVUb29scy5qYXZhUmVzZXJ2ZWRXb3JkcygpLCAiY2xhc3MiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhOYW1lVG9vbHMuamF2YVJlc2VydmVkV29yZHMoKSwgIkNsYXNzIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhOYW1lVG9vbHMuamF2YVJlc2VydmVkV29yZHMoKSwgInByaXZhdGUiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdGNvbnZlcnRUb0phdmFJZGVudGlmaWVyU3RyaW5nKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoImZvbzEiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbzEiKSk7Ci0JCWFzc2VydEVxdWFscygicHJpdmF0ZV8iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoInByaXZhdGUiKSk7Ci0JCWFzc2VydEVxdWFscygidGhyb3dfIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJ0aHJvdyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyUiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vX19iYXJfXyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vICBiYXIgICIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Y29udmVydFRvSmF2YUlkZW50aWZpZXJTdHJpbmdDaGFyKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMSIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vMSIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoInByaXZhdGUkIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCJwcml2YXRlIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygidGhyb3dzcyIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigidGhyb3ciLCAncycpKTsKLQkJYXNzZXJ0RXF1YWxzKCIkZm9vIiwgTmFtZVRvb2xzLmNvbnZlcnRUb0phdmFJZGVudGlmaWVyKCIxZm9vIiwgJyQnKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vJCIsIE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIsICckJykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyQkYmFyJCQiLCBOYW1lVG9vbHMuY29udmVydFRvSmF2YUlkZW50aWZpZXIoImZvbyAgYmFyICAiLCAnJCcpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiMWZvbyIsICc3Jyk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogXCIiICsgcyArICJcIiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuaW5kZXhPZignNycpICE9IC0xKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigiZm9vJSIsICdeJyk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogXCIiICsgcyArICJcIiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuaW5kZXhPZignXicpICE9IC0xKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgcyA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcigicHJpdmF0ZSIsICdeJyk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogXCIiICsgcyArICJcIiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuaW5kZXhPZignXicpICE9IC0xKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcigpIHsKLQkJYXNzZXJ0RmFsc2UoTmFtZVRvb2xzLnN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcigiY2xhc3MiKSk7Ci0JCWFzc2VydFRydWUoTmFtZVRvb2xzLnN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcigiY2xhc1MiKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoTmFtZVRvb2xzLnN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcigiN2ZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UoTmFtZVRvb2xzLnN0cmluZ0lzTGVnYWxKYXZhSWRlbnRpZmllcigiZm9vQGJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShOYW1lVG9vbHMuc3RyaW5nSXNMZWdhbEphdmFJZGVudGlmaWVyKCJfZm9vIikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05vdE51bGxGaWx0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL05vdE51bGxGaWx0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWYwNjcwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9Ob3ROdWxsRmlsdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm90TnVsbEZpbHRlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTm90TnVsbEZpbHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIE5vdE51bGxGaWx0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90TnVsbEZpbHRlcigpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gTm90TnVsbEZpbHRlci5pbnN0YW5jZSgpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoIiIpKTsKLQkJYXNzZXJ0RmFsc2UoZmlsdGVyLmFjY2VwdChudWxsKSk7Ci0JCWFzc2VydFRydWUoZmlsdGVyLmFjY2VwdCgiZm9vIikpOwotCQlhc3NlcnRUcnVlKGZpbHRlci5hY2NlcHQoImJhciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9IE5vdE51bGxGaWx0ZXIuaW5zdGFuY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChmaWx0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JhbmdlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkOTU5Mi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvUmFuZ2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJhbmdlOwotCi1wdWJsaWMgY2xhc3MgUmFuZ2VUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSYW5nZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmNsdWRlcygpIHsKLQkJUmFuZ2UgcmFuZ2UgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcygtNTUpKTsKLQkJYXNzZXJ0RmFsc2UocmFuZ2UuaW5jbHVkZXMoMCkpOwotCQlhc3NlcnRGYWxzZShyYW5nZS5pbmNsdWRlcyg0KSk7Ci0JCWFzc2VydFRydWUocmFuZ2UuaW5jbHVkZXMoNSkpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDYpKTsKLQkJYXNzZXJ0VHJ1ZShyYW5nZS5pbmNsdWRlcygxNikpOwotCQlhc3NlcnRUcnVlKHJhbmdlLmluY2x1ZGVzKDE3KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDE4KSk7Ci0JCWFzc2VydEZhbHNlKHJhbmdlLmluY2x1ZGVzKDIwMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCVJhbmdlIHJhbmdlMSA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCVJhbmdlIHJhbmdlMiA9IG5ldyBSYW5nZSg1LCAxNyk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoMTcsIDUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCQkvLyBhbHRob3VnaCB0aGV5IGFyZSB1bmVxdWFsLCB0aGV5IGNhbiBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZQotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQotCQlyYW5nZTIgPSBuZXcgUmFuZ2UoNSwgMTUpOwotCQlhc3NlcnRGYWxzZShyYW5nZTEuZXF1YWxzKHJhbmdlMikpOwotCQlhc3NlcnRGYWxzZShyYW5nZTIuZXF1YWxzKHJhbmdlMSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJUmFuZ2UgcmFuZ2UxID0gbmV3IFJhbmdlKDUsIDE3KTsKLQkJUmFuZ2UgcmFuZ2UyID0gcmFuZ2UxLmNsb25lKCk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlSYW5nZSByYW5nZTEgPSBuZXcgUmFuZ2UoNSwgMTcpOwotCQlSYW5nZSByYW5nZTIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKHJhbmdlMSk7Ci0JCWFzc2VydE5vdFNhbWUocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLCByYW5nZTIpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UyLCByYW5nZTEpOwotCQlhc3NlcnRFcXVhbHMocmFuZ2UxLmhhc2hDb2RlKCksIHJhbmdlMi5oYXNoQ29kZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZWZsZWN0aW9uVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JlZmxlY3Rpb25Ub29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMTBjYjAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JlZmxlY3Rpb25Ub29sc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3Rpb25Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRlc3RTdGF0aWNGaWVsZDsKLQotCXB1YmxpYyBSZWZsZWN0aW9uVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLS8vIHRoaXMgaXMgbm8gbG9uZ2VyIHRydWUgLSBpdCBhcHBlYXJzIHRoZSBKTFMgbm93IGRlZmluZXMgdGhlIGdlbmVyYXRlZCBuYW1lcy4uLgotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIGNvbXBpbGVyLWdlbmVyYXRlZCBjbGFzcyBuYW1lLiBUaGUgRWNsaXBzZSBjb21waWxlciBnZW5lcmF0ZXMKLS8vCSAqICJsb2NhbCIgY2xhc3NlcyB3aXRoIG5hbWVzIGluIHRoZSBmb3JtICJjb20uZm9vLk91dGVyJDEkTG9jYWwiOyB3aGlsZSB0aGUKLS8vCSAqIEpESyBjb21waWxlciBnZW5lcmF0ZXMgImNvbS5mb28uT3V0ZXIkMUxvY2FsIi4gVGhlcmUgbWlnaHQgYmUgb3RoZXIKLS8vCSAqIGRpZmZlcmVuY2VzLi4uLiB+Ymp2Ci0vLwkgKi8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbXBpbGVyRGVwZW5kZW50Q2xhc3NOYW1lRm9yKFN0cmluZyBjbGFzc05hbWUpIHsKLS8vCQlpbnQgaW5kZXggPSBjbGFzc05hbWUuaW5kZXhPZigiJDEkIik7Ci0vLwkJaWYgKGluZGV4ID09IC0xKSB7Ci0vLwkJCXJldHVybiBjbGFzc05hbWU7Ci0vLwkJfQotLy8JCXRyeSB7Ci0vLwkJCUNsYXNzLmZvck5hbWUoY2xhc3NOYW1lKTsKLS8vCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCXJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGluZGV4ICsgMikgKyBjbGFzc05hbWUuc3Vic3RyaW5nKGluZGV4ICsgMyk7Ci0vLwkJfQotLy8JCXJldHVybiBjbGFzc05hbWU7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG11bmdlKFN0cmluZyBjbGFzc05hbWUpIHsKLS8vCQlyZXR1cm4gY29tcGlsZXJEZXBlbmRlbnRDbGFzc05hbWVGb3IoY2xhc3NOYW1lKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxGaWVsZHMoKSB7Ci0JCWludCBmaWVsZENvdW50ID0gMDsKLQkJZmllbGRDb3VudCArPSBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlmaWVsZENvdW50ICs9IGphdmEudXRpbC5BYnN0cmFjdExpc3QuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZHMoKS5sZW5ndGg7Ci0JCWZpZWxkQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpLmxlbmd0aDsKLQkJZmllbGRDb3VudCArPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkubGVuZ3RoOwotCQlJdGVyYWJsZTxGaWVsZD4gZmllbGRzID0gUmVmbGVjdGlvblRvb2xzLmdldEFsbEZpZWxkcyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKGZpZWxkQ291bnQsIENvbGxlY3Rpb25Ub29scy5zaXplKGZpZWxkcykpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZpZWxkTmFtZXMoZmllbGRzKSwgIm1vZENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZpZWxkTmFtZXMoZmllbGRzKSwgInNlcmlhbFZlcnNpb25VSUQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZmllbGROYW1lcyhmaWVsZHMpLCAiY2FwYWNpdHlJbmNyZW1lbnQiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZmllbGROYW1lcyhmaWVsZHMpLCAiZWxlbWVudENvdW50IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmZpZWxkTmFtZXMoZmllbGRzKSwgImVsZW1lbnREYXRhIikpOwotCQlhc3NlcnRUcnVlKGZpZWxkcy5pdGVyYXRvcigpLm5leHQoKS5pc0FjY2Vzc2libGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE1ldGhvZHMoKSB7Ci0JCWludCBtZXRob2RDb3VudCA9IDA7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQltZXRob2RDb3VudCArPSBqYXZhLnV0aWwuQWJzdHJhY3RMaXN0LmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpLmxlbmd0aDsKLQkJbWV0aG9kQ291bnQgKz0gamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZHMoKS5sZW5ndGg7Ci0JCW1ldGhvZENvdW50ICs9IGphdmEubGFuZy5PYmplY3QuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkubGVuZ3RoOwotCQlJdGVyYWJsZTxNZXRob2Q+IG1ldGhvZHMgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0QWxsTWV0aG9kcyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKG1ldGhvZENvdW50LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShtZXRob2RzKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubWV0aG9kTmFtZXMobWV0aG9kcyksICJ3YWl0IikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLm1ldGhvZE5hbWVzKG1ldGhvZHMpLCAiYWRkRWxlbWVudCIpKTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RzLml0ZXJhdG9yKCkubmV4dCgpLmlzQWNjZXNzaWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV3SW5zdGFuY2VDbGFzcygpIHsKLQkJVmVjdG9yPD8+IHYgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5ld0luc3RhbmNlQ2xhc3NDbGFzc09iamVjdCgpIHsKLQkJaW50IGluaXRpYWxDYXBhY2l0eSA9IDIwMDsKLQkJVmVjdG9yPD8+IHYgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgaW50LmNsYXNzLCBuZXcgSW50ZWdlcihpbml0aWFsQ2FwYWNpdHkpKTsKLQkJYXNzZXJ0Tm90TnVsbCh2KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKLQkJT2JqZWN0W10gZWxlbWVudERhdGEgPSAoT2JqZWN0W10pIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50RGF0YSIpOwotCQlhc3NlcnRFcXVhbHMoaW5pdGlhbENhcGFjaXR5LCBlbGVtZW50RGF0YS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXdJbnN0YW5jZUNsYXNzQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlpbnQgaW5pdGlhbENhcGFjaXR5ID0gMjAwOwotCQlDbGFzczw/PltdIHBhcm1UeXBlcyA9IG5ldyBDbGFzc1sxXTsKLQkJcGFybVR5cGVzWzBdID0gaW50LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gbmV3IEludGVnZXIoaW5pdGlhbENhcGFjaXR5KTsKLQkJVmVjdG9yPD8+IHYgPSBSZWZsZWN0aW9uVG9vbHMubmV3SW5zdGFuY2UoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCWFzc2VydE5vdE51bGwodik7Ci0JCWFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7Ci0JCU9iamVjdFtdIGVsZW1lbnREYXRhID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiKTsKLQkJYXNzZXJ0RXF1YWxzKGluaXRpYWxDYXBhY2l0eSwgZWxlbWVudERhdGEubGVuZ3RoKTsKLQotCQlwYXJtc1swXSA9IG5ldyBJbnRlZ2VyKC0xKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdiA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIlJ1bnRpbWVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuU3RyaW5nLmNsYXNzOwotCQlwYXJtc1swXSA9ICJmb28iOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdiA9IFJlZmxlY3Rpb25Ub29scy5uZXdJbnN0YW5jZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBOb1N1Y2hNZXRob2RFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkVmFsdWUoKSB7Ci0JCWludCBpbml0aWFsQ2FwYWNpdHkgPSAyMDA7Ci0JCVZlY3Rvcjw/PiB2ID0gbmV3IFZlY3RvcjxPYmplY3Q+KGluaXRpYWxDYXBhY2l0eSk7Ci0JCU9iamVjdFtdIGVsZW1lbnREYXRhID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiKTsKLQkJYXNzZXJ0RXF1YWxzKGluaXRpYWxDYXBhY2l0eSwgZWxlbWVudERhdGEubGVuZ3RoKTsKLQotCQkvLyB0ZXN0IGluaGVyaXRlZCBmaWVsZAotCQlJbnRlZ2VyIG1vZENvdW50SW50ZWdlciA9IChJbnRlZ2VyKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh2LCAibW9kQ291bnQiKTsKLQkJaW50IG1vZENvdW50ID0gbW9kQ291bnRJbnRlZ2VyLmludFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBtb2RDb3VudCk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgYm9ndXNGaWVsZFZhbHVlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvZ3VzRmllbGRWYWx1ZSA9IFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHYsICJib2d1c0ZpZWxkIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoRmllbGRFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRmllbGRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGJvZ3VzRmllbGRWYWx1ZSwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTWV0aG9kT2JqZWN0U3RyaW5nKCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCWludCBzaXplID0gKChJbnRlZ2VyKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAic2l6ZSIpKS5pbnRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgc2l6ZSk7Ci0KLQkJdi5hZGRFbGVtZW50KCJmb28iKTsKLQkJc2l6ZSA9ICgoSW50ZWdlcikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgInNpemUiKSkuaW50VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHNpemUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTWV0aG9kT2JqZWN0U3RyaW5nQ2xhc3NPYmplY3QoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJYm9vbGVhbiBib29sZWFuUmVzdWx0ID0gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAiYWRkIiwgT2JqZWN0LmNsYXNzLCAiZm9vIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGJvb2xlYW5SZXN1bHQpOwotCQlhc3NlcnRUcnVlKHYuY29udGFpbnMoImZvbyIpKTsKLQkJT2JqZWN0IHZvaWRSZXN1bHQgPSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZCh2LCAiYWRkRWxlbWVudCIsIE9iamVjdC5jbGFzcywgImJhciIpOwotCQlhc3NlcnROdWxsKHZvaWRSZXN1bHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlTWV0aG9kT2JqZWN0U3RyaW5nQ2xhc3NBcnJheU9iamVjdEFycmF5KCkgewotCQlWZWN0b3I8U3RyaW5nPiB2ID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCUNsYXNzPD8+W10gcGFybVR5cGVzID0gbmV3IENsYXNzWzFdOwotCQlwYXJtVHlwZXNbMF0gPSBqYXZhLmxhbmcuT2JqZWN0LmNsYXNzOwotCQlPYmplY3RbXSBwYXJtcyA9IG5ldyBPYmplY3RbMV07Ci0JCXBhcm1zWzBdID0gImZvbyI7Ci0JCWJvb2xlYW4gYm9vbGVhblJlc3VsdCA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgImFkZCIsIHBhcm1UeXBlcywgcGFybXMpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShib29sZWFuUmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKCJmb28iKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c01ldGhvZFJldHVyblZhbHVlID0gUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QodiwgImJvZ3VzTWV0aG9kIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlU3RhdGljTWV0aG9kQ2xhc3NTdHJpbmcoKSB7Ci0JCURvdWJsZSByYW5kb21PYmplY3QgPSAoRG91YmxlKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuTWF0aC5jbGFzcywgInJhbmRvbSIpOwotCQlhc3NlcnROb3ROdWxsKHJhbmRvbU9iamVjdCk7Ci0JCWRvdWJsZSByYW5kb20gPSByYW5kb21PYmplY3QuZG91YmxlVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShyYW5kb20gPj0gMCk7Ci0JCWFzc2VydFRydWUocmFuZG9tIDwgMSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZ0NsYXNzT2JqZWN0KCkgewotCQlTdHJpbmcgcyA9IChTdHJpbmcpIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKGphdmEubGFuZy5TdHJpbmcuY2xhc3MsICJ2YWx1ZU9mIiwgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbChzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVTdGF0aWNNZXRob2RDbGFzc1N0cmluZ0NsYXNzQXJyYXlPYmplY3RBcnJheSgpIHsKLQkJQ2xhc3M8Pz5bXSBwYXJtVHlwZXMgPSBuZXcgQ2xhc3NbMV07Ci0JCXBhcm1UeXBlc1swXSA9IGJvb2xlYW4uY2xhc3M7Ci0JCU9iamVjdFtdIHBhcm1zID0gbmV3IE9iamVjdFsxXTsKLQkJcGFybXNbMF0gPSBCb29sZWFuLlRSVUU7Ci0JCVN0cmluZyBzID0gKFN0cmluZykgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgInZhbHVlT2YiLCBwYXJtVHlwZXMsIHBhcm1zKTsKLQkJYXNzZXJ0Tm90TnVsbChzKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcyk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlPYmplY3QgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlID0gUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoamF2YS5sYW5nLlN0cmluZy5jbGFzcywgImJvZ3VzU3RhdGljTWV0aG9kIiwgcGFybVR5cGVzLCBwYXJtcyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgYm9ndXNTdGF0aWNNZXRob2RSZXR1cm5WYWx1ZSwgZXhDYXVnaHQpOwotCi0JCS8vIHRlc3Qgbm9uLXN0YXRpYyBtZXRob2QKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWJvZ3VzU3RhdGljTWV0aG9kUmV0dXJuVmFsdWUgPSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChqYXZhLmxhbmcuU3RyaW5nLmNsYXNzLCAidG9TdHJpbmciKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBOb1N1Y2hNZXRob2RFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBib2d1c1N0YXRpY01ldGhvZFJldHVyblZhbHVlLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZpZWxkVmFsdWUoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJT2JqZWN0W10gbmV3RWxlbWVudERhdGEgPSBuZXcgT2JqZWN0WzVdOwotCQluZXdFbGVtZW50RGF0YVswXSA9ICJmb28iOwotCQlSZWZsZWN0aW9uVG9vbHMuc2V0RmllbGRWYWx1ZSh2LCAiZWxlbWVudERhdGEiLCBuZXdFbGVtZW50RGF0YSk7Ci0JCVJlZmxlY3Rpb25Ub29scy5zZXRGaWVsZFZhbHVlKHYsICJlbGVtZW50Q291bnQiLCBuZXcgSW50ZWdlcigxKSk7Ci0JCS8vIHRlc3QgaW5oZXJpdGVkIGZpZWxkCi0JCVJlZmxlY3Rpb25Ub29scy5zZXRGaWVsZFZhbHVlKHYsICJtb2RDb3VudCIsIG5ldyBJbnRlZ2VyKDEpKTsKLQkJYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKCJmb28iKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJUmVmbGVjdGlvblRvb2xzLnNldEZpZWxkVmFsdWUodiwgImJvZ3VzRmllbGQiLCAiZm9vIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgTm9TdWNoRmllbGRFeGNlcHRpb24pIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRmllbGRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3RhdGljRmllbGRWYWx1ZSgpIHsKLQkJUmVmbGVjdGlvblRvb2xzLnNldFN0YXRpY0ZpZWxkVmFsdWUodGhpcy5nZXRDbGFzcygpLCAidGVzdFN0YXRpY0ZpZWxkIiwgIm5ldyB2YWx1ZSIpOwotCQlhc3NlcnRFcXVhbHModGVzdFN0YXRpY0ZpZWxkLCAibmV3IHZhbHVlIik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJUmVmbGVjdGlvblRvb2xzLnNldFN0YXRpY0ZpZWxkVmFsdWUodGhpcy5nZXRDbGFzcygpLCAiYm9ndXNTdGF0aWNGaWVsZCIsICJuZXcgdmFsdWUiKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkgaW5zdGFuY2VvZiBOb1N1Y2hGaWVsZEV4Y2VwdGlvbikgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVOYW1lKCkgewotCQlhc3NlcnRFcXVhbHMoIlZlY3RvciIsIGphdmEudXRpbC5WZWN0b3IuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFbnRyeSIsIGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpbnQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnRbXSIsIGludFtdLmNsYXNzLmdldFNpbXBsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50W11bXSIsIGludFtdW10uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2b2lkIiwgdm9pZC5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlTmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLnV0aWwiLCBqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbCIsIGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFycmF5RGVwdGhGb3IoKSB7Ci0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aChpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKGphdmEudXRpbC5WZWN0b3JbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoMSwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGgoaW50W10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoKGludFtdW11bXS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50VHlwZUZvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEudXRpbC5WZWN0b3IuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShqYXZhLnV0aWwuVmVjdG9yLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZSh2b2lkLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLnV0aWwuVmVjdG9yLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGUoamF2YS51dGlsLlZlY3RvcltdLmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZShpbnRbXS5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS51dGlsLlZlY3Rvci5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKGphdmEudXRpbC5WZWN0b3JbXVtdW10uY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlKGludFtdW11bXS5jbGFzcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGFzc0lzUHJpbWl0aXZlV3JhcHBlckNsYXNzKCkgewotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuVm9pZC5jbGFzcykpOwotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcykpOwotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuSW50ZWdlci5jbGFzcykpOwotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlN0cmluZy5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIodm9pZC5jbGFzcykpOwotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ByaW1pdGl2ZVdyYXBwZXIoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXJDbGFzcygpIHsKLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLlZvaWQuY2xhc3MpKTsKLQotCQlhc3NlcnRUcnVlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKGphdmEubGFuZy5Cb29sZWFuLmNsYXNzKSk7Ci0JCWFzc2VydFRydWUoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoamF2YS5sYW5nLkludGVnZXIuY2xhc3MpKTsKLQkJYXNzZXJ0VHJ1ZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuRmxvYXQuY2xhc3MpKTsKLQotCQlhc3NlcnRGYWxzZShSZWZsZWN0aW9uVG9vbHMuY2xhc3NJc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcihqYXZhLmxhbmcuU3RyaW5nLmNsYXNzKSk7Ci0JCWFzc2VydEZhbHNlKFJlZmxlY3Rpb25Ub29scy5jbGFzc0lzVmFyaWFibGVQcmltaXRpdmVXcmFwcGVyKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RmFsc2UoUmVmbGVjdGlvblRvb2xzLmNsYXNzSXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoaW50LmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZXJDbGFzcygpIHsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5Wb2lkLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0V3JhcHBlckNsYXNzKHZvaWQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmEubGFuZy5JbnRlZ2VyLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0V3JhcHBlckNsYXNzKGludC5jbGFzcykpOwotCQlhc3NlcnRFcXVhbHMoamF2YS5sYW5nLkZsb2F0LmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0V3JhcHBlckNsYXNzKGZsb2F0LmNsYXNzKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhLmxhbmcuQm9vbGVhbi5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldFdyYXBwZXJDbGFzcyhib29sZWFuLmNsYXNzKSk7Ci0KLQkJYXNzZXJ0TnVsbChSZWZsZWN0aW9uVG9vbHMuZ2V0V3JhcHBlckNsYXNzKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb25TdHJpbmdJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKGludC5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhpbnRbXS5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAxKSk7Ci0JCWFzc2VydEVxdWFscyhpbnRbXVtdW10uY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiaW50IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyhPYmplY3QuY2xhc3MsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc0ZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKE9iamVjdFtdW11bXS5jbGFzcywgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0IiwgMykpOwotCi0JCWFzc2VydEVxdWFscyh2b2lkLmNsYXNzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24oInZvaWQiLCAwKSk7Ci0JCXRyeSB7Ci0JCQlSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NGb3JUeXBlRGVjbGFyYXRpb24odm9pZC5jbGFzcy5nZXROYW1lKCksIDEpOwotCQkJZmFpbCgic2hvdWxkIG5vdCBnZXQgaGVyZS4uLiIpOwotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBleHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvZGVGb3JDbGFzcygpIHsKLQkJYXNzZXJ0RXF1YWxzKCdJJywgUmVmbGVjdGlvblRvb2xzLmdldENvZGVGb3JDbGFzcyhpbnQuY2xhc3MpKTsKLQkJYXNzZXJ0RXF1YWxzKCdCJywgUmVmbGVjdGlvblRvb2xzLmdldENvZGVGb3JDbGFzcyhieXRlLmNsYXNzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvblN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoImludCIsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJbSSIsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbSSIsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCBbIF0gWyBdIikpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiKSk7Ci0JCWFzc2VydEVxdWFscygiW0xqYXZhLmxhbmcuT2JqZWN0OyIsIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RcdFtdIikpOwotCQlhc3NlcnRFcXVhbHMoIltbTGphdmEubGFuZy5PYmplY3Q7IiwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdFx0W11cdFtdIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJqYXZhLmxhbmcuT2JqZWN0W10iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdFtdW11bXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24oImludCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlZmxlY3Rpb25Ub29scy5nZXRBcnJheURlcHRoRm9yVHlwZURlY2xhcmF0aW9uKCJmbG9hdCBbIF0iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXRbXSBbXSBbXSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3RbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdFtdW11bXSIpKTsKLQotCQlhc3NlcnRFcXVhbHMoImludCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBSZWZsZWN0aW9uVG9vbHMuZ2V0RWxlbWVudFR5cGVOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnRbXVtdW10iKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmbG9hdCIsIFJlZmxlY3Rpb25Ub29scy5nZXRFbGVtZW50VHlwZU5hbWVGb3JUeXBlRGVjbGFyYXRpb24oImZsb2F0IikpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXQgWyBdIikpOwotCQlhc3NlcnRFcXVhbHMoImZsb2F0IiwgUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiZmxvYXRbXSBbXSBbXSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uU3RyaW5nSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhpbnQuY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJpbnQiLCAwKSk7Ci0JCWFzc2VydEVxdWFscyhpbnRbXS5jbGFzcy5nZXROYW1lKCksIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDEpKTsKLQkJYXNzZXJ0RXF1YWxzKGludFtdW11bXS5jbGFzcy5nZXROYW1lKCksIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImludCIsIDMpKTsKLQotCQlhc3NlcnRFcXVhbHMoT2JqZWN0LmNsYXNzLmdldE5hbWUoKSwgUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbigiamF2YS5sYW5nLk9iamVjdCIsIDApKTsKLQkJYXNzZXJ0RXF1YWxzKE9iamVjdFtdW11bXS5jbGFzcy5nZXROYW1lKCksIFJlZmxlY3Rpb25Ub29scy5nZXRDbGFzc05hbWVGb3JUeXBlRGVjbGFyYXRpb24oImphdmEubGFuZy5PYmplY3QiLCAzKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKHZvaWQuY2xhc3MuZ2V0TmFtZSgpLCBSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKCJ2b2lkIiwgMCkpOwotCQl0cnkgewotCQkJUmVmbGVjdGlvblRvb2xzLmdldENsYXNzTmFtZUZvclR5cGVEZWNsYXJhdGlvbih2b2lkLmNsYXNzLmdldE5hbWUoKSwgMSk7Ci0JCQlmYWlsKCJzaG91bGQgbm90IGdldCBoZXJlLi4uIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBmaWVsZE5hbWVzKEl0ZXJhYmxlPEZpZWxkPiBmaWVsZHMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEZpZWxkLCBTdHJpbmc+KGZpZWxkcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShGaWVsZCBmaWVsZCkgewotCQkJCXJldHVybiBmaWVsZC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IG1ldGhvZE5hbWVzKEl0ZXJhYmxlPE1ldGhvZD4gbWV0aG9kcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TWV0aG9kLCBTdHJpbmc+KG1ldGhvZHMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWV0aG9kIG1ldGhvZCkgewotCQkJCXJldHVybiBtZXRob2QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9SZXZlcnNlQ29tcGFyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyODc4NjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1JldmVyc2VDb21wYXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJldmVyc2VDb21wYXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gbmF0dXJhbFJldmVyc2VDb21wYXJhdG9yOwotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGN1c3RvbUNvbXBhcmF0b3I7Ci0JcHJpdmF0ZSBDb21wYXJhdG9yPFN0cmluZz4gY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3I7Ci0KLQlwdWJsaWMgUmV2ZXJzZUNvbXBhcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm5hdHVyYWxSZXZlcnNlQ29tcGFyYXRvciA9IG5ldyBSZXZlcnNlQ29tcGFyYXRvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuY3VzdG9tQ29tcGFyYXRvciA9IHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCk7Ci0JCXRoaXMuY3VzdG9tUmV2ZXJzZUNvbXBhcmF0b3IgPSBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPih0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlTdHJpbmcgbG93ZXIxID0gczEudG9Mb3dlckNhc2UoKTsKLQkJCQlTdHJpbmcgbG93ZXIyID0gczIudG9Mb3dlckNhc2UoKTsKLQkJCQlpbnQgcmVzdWx0ID0gbG93ZXIxLmNvbXBhcmVUbyhsb3dlcjIpOwotCQkJCWlmIChyZXN1bHQgPT0gMCkgewotCQkJCQlyZXR1cm4gczEuY29tcGFyZVRvKHMyKTsgLy8gdXNlIGNhc2UgdG8gZGlmZmVyZW50aWF0ZSAiZXF1YWwiIHN0cmluZ3MKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFVuc29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJUIik7Ci0JCXJlc3VsdC5hZGQoIloiKTsKLQkJcmVzdWx0LmFkZCgiWSIpOwotCQlyZXN1bHQuYWRkKCJNIik7Ci0JCXJlc3VsdC5hZGQoIm0iKTsKLQkJcmVzdWx0LmFkZCgiYSIpOwotCQlyZXN1bHQuYWRkKCJCIik7Ci0JCXJlc3VsdC5hZGQoImIiKTsKLQkJcmVzdWx0LmFkZCgiQSIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTmF0dXJhbGx5U29ydGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRDdXN0b21Tb3J0ZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRoaXMuYnVpbGRVbnNvcnRlZExpc3QoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocmVzdWx0LCB0aGlzLmN1c3RvbUNvbXBhcmF0b3IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmF0dXJhbCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5uYXR1cmFsUmV2ZXJzZUNvbXBhcmF0b3IpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5idWlsZE5hdHVyYWxseVNvcnRlZExpc3QoKSwgbGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRMaXN0KCk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobGlzdCwgdGhpcy5jdXN0b21SZXZlcnNlQ29tcGFyYXRvcik7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkTGlzdCgpLCBsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChMaXN0PFN0cmluZz4gbm9ybWFsLCBMaXN0PFN0cmluZz4gcmV2ZXJzZSkgewotCQlpbnQgc2l6ZSA9IG5vcm1hbC5zaXplKCk7Ci0JCWludCBtYXggPSBzaXplIC0gMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhub3JtYWwuZ2V0KGkpLCByZXZlcnNlLmdldChtYXggLSBpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUFzc29jaWF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmZTE2My4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVBc3NvY2lhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlQXNzb2NpYXRpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoU2ltcGxlQXNzb2NpYXRpb25UZXN0cy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBTaW1wbGVBc3NvY2lhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYXNzb2MgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KCJmb28iLCAiYmFyIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRLZXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hc3NvYy5nZXRLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYXNzb2MuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYXNzb2MuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMuYXNzb2Muc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYXNzb2MuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hc3NvYy5lcXVhbHMoImZvbyIpKTsKLQotCQlhc3NlcnRFcXVhbHModGhpcy5hc3NvYywgdGhpcy5jb3B5KHRoaXMuYXNzb2MpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPigiZm9vIiwgImJheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFzc29jLmVxdWFscyhhc3NvYzIpKTsKLQotCQlhc3NvYzIgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KCJmb3AiLCAiYmFyIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYXNzb2MuZXF1YWxzKGFzc29jMikpOwotCi0JCVNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzMgPSBuZXcgU2ltcGxlQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KG51bGwsIG51bGwpOwotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2M0ID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFzc29jMywgYXNzb2M0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLmhhc2hDb2RlKCksIHRoaXMuY29weSh0aGlzLmFzc29jKS5oYXNoQ29kZSgpKTsKLQotCQlTaW1wbGVBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYXNzb2MyID0gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFzc29jMi5oYXNoQ29kZSgpLCB0aGlzLmNvcHkoYXNzb2MyKS5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5hc3NvYy50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCXRoaXMudmVyaWZ5Q2xvbmUodGhpcy5hc3NvYywgdGhpcy5hc3NvYy5jbG9uZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xvbmUoQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkLCBBc3NvY2lhdGlvbjxTdHJpbmcsIFN0cmluZz4gYWN0dWFsKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQkJYXNzZXJ0Tm90U2FtZShleHBlY3RlZCwgYWN0dWFsKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldEtleSgpLCBhY3R1YWwuZ2V0S2V5KCkpOwotCQlhc3NlcnRTYW1lKGV4cGVjdGVkLmdldEtleSgpLCBhY3R1YWwuZ2V0S2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0VmFsdWUoKSwgYWN0dWFsLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTYW1lKGV4cGVjdGVkLmdldFZhbHVlKCksIGFjdHVhbC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlAU3VwcHJlc3NXYXJuaW5ncygiY2FzdCIpCi0JCUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBhc3NvYzIgPSAoQXNzb2NpYXRpb248U3RyaW5nLCBTdHJpbmc+KSBUZXN0VG9vbHMuc2VyaWFsaXplKHRoaXMuYXNzb2MpOwotCi0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLCBhc3NvYzIpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2MsIGFzc29jMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLmdldEtleSgpLCBhc3NvYzIuZ2V0S2V5KCkpOwotCQlhc3NlcnROb3RTYW1lKHRoaXMuYXNzb2MuZ2V0S2V5KCksIGFzc29jMi5nZXRLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFzc29jLmdldFZhbHVlKCksIGFzc29jMi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZSh0aGlzLmFzc29jLmdldFZhbHVlKCksIGFzc29jMi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBjb3B5KFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPiBzYSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUFzc29jaWF0aW9uPFN0cmluZywgU3RyaW5nPihzYS5nZXRLZXkoKSwgc2EuZ2V0VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQm9vbGVhblJlZmVyZW5jZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlQm9vbGVhblJlZmVyZW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YzA2ZGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUJvb2xlYW5SZWZlcmVuY2VUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVCb29sZWFuUmVmZXJlbmNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2ltcGxlQm9vbGVhblJlZmVyZW5jZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZURlZmF1bHQoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXMoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5pcyh0cnVlKSk7Ci0JCWFzc2VydEZhbHNlKGJyLmlzKGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90KCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmlzTm90KHRydWUpKTsKLQkJYXNzZXJ0VHJ1ZShici5pc05vdChmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1RydWUoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShici5pc1RydWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRmFsc2UoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UoYnIuaXNGYWxzZSgpKTsKLQkJYnIuc2V0RmFsc2UoKTsKLQkJYXNzZXJ0VHJ1ZShici5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCQlici5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGlwKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYnIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJyLmZsaXAoKSk7Ci0JCWFzc2VydEZhbHNlKGJyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKGJyLmZsaXAoKSk7Ci0JCWFzc2VydFRydWUoYnIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5vdEJvb2xlYW4oKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmdldFZhbHVlKCkpOwotCQlici5zZXROb3QodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmdldFZhbHVlKCkpOwotCQlici5zZXROb3QodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKGJyLmdldFZhbHVlKCkpOwotCQlici5zZXROb3QoZmFsc2UpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUcnVlKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyID0gbmV3IFNpbXBsZUJvb2xlYW5SZWZlcmVuY2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQkJYnIuc2V0VHJ1ZSgpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGYWxzZSgpIHsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBiciA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRUcnVlKGJyLmdldFZhbHVlKCkpOwotCQlici5zZXRGYWxzZSgpOwotCQlhc3NlcnRGYWxzZShici5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZUJvb2xlYW5SZWZlcmVuY2UgYnIgPSBuZXcgU2ltcGxlQm9vbGVhblJlZmVyZW5jZSh0cnVlKTsKLQkJU2ltcGxlQm9vbGVhblJlZmVyZW5jZSBjbG9uZSA9IGJyLmNsb25lKCk7Ci0JCWFzc2VydFRydWUoY2xvbmUuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlTaW1wbGVCb29sZWFuUmVmZXJlbmNlIGJyMSA9IG5ldyBTaW1wbGVCb29sZWFuUmVmZXJlbmNlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoIlt0cnVlXSIsIGJyMS50b1N0cmluZygpKTsKLQkJYnIxLnNldEZhbHNlKCk7Ci0JCWFzc2VydEVxdWFscygiW2ZhbHNlXSIsIGJyMS50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVJbnRSZWZlcmVuY2VUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUludFJlZmVyZW5jZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NjU3MGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZUludFJlZmVyZW5jZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUludFJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlSW50UmVmZXJlbmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2ltcGxlSW50UmVmZXJlbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN0b3JzKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGlyLmdldFZhbHVlKCkpOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoLTcpOwotCQlhc3NlcnRFcXVhbHMoLTcsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHNJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuZXF1YWxzKDApKTsKLQkJYXNzZXJ0RmFsc2UoaXIuZXF1YWxzKDcpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydFRydWUoaXIuZXF1YWxzKDcpKTsKLQkJYXNzZXJ0RmFsc2UoaXIuZXF1YWxzKDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLm5vdEVxdWFsKDApKTsKLQkJYXNzZXJ0VHJ1ZShpci5ub3RFcXVhbCg3KSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRGYWxzZShpci5ub3RFcXVhbCg3KSk7Ci0JCWFzc2VydFRydWUoaXIubm90RXF1YWwoMCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1plcm8oKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydFRydWUoaXIuaXNaZXJvKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdFplcm8oKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTm90WmVybygpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOb3RaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0dyZWF0ZXJUaGFuSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzR3JlYXRlclRoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNHcmVhdGVyVGhhbigwKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzR3JlYXRlclRoYW4oNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0dyZWF0ZXJUaGFuT3JFcXVhbEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKGlyLmlzR3JlYXRlclRoYW5PckVxdWFsKDApKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNHcmVhdGVyVGhhbk9yRXF1YWwoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlc3NUaGFuSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRGYWxzZShpci5pc0xlc3NUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTGVzc1RoYW4oMCkpOwotCQlhc3NlcnRUcnVlKGlyLmlzTGVzc1RoYW4oNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlc3NUaGFuT3JFcXVhbEludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNMZXNzVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc0xlc3NUaGFuT3JFcXVhbCgwKSk7Ci0JCWFzc2VydFRydWUoaXIuaXNMZXNzVGhhbk9yRXF1YWwoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1Bvc2l0aXZlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzUG9zaXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzUG9zaXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRUcnVlKGlyLmlzUG9zaXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90UG9zaXRpdmUoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdFBvc2l0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgpOwotCQlhc3NlcnRUcnVlKGlyLmlzTm90UG9zaXRpdmUoKSk7Ci0KLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDcpOwotCQlhc3NlcnRGYWxzZShpci5pc05vdFBvc2l0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05lZ2F0aXZlKCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgtMyk7Ci0JCWFzc2VydFRydWUoaXIuaXNOZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNyk7Ci0JCWFzc2VydEZhbHNlKGlyLmlzTmVnYXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTm90TmVnYXRpdmUoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RmFsc2UoaXIuaXNOb3ROZWdhdGl2ZSgpKTsKLQotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdE5lZ2F0aXZlKCkpOwotCi0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg3KTsKLQkJYXNzZXJ0VHJ1ZShpci5pc05vdE5lZ2F0aXZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLnNldFZhbHVlKDQpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnMoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmFicygpKTsKLQotCQlpci5zZXRWYWx1ZSgzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIuYWJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWcoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKC0zKTsKLQkJYXNzZXJ0RXF1YWxzKC0zLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLm5lZygpKTsKLQotCQlpci5zZXRWYWx1ZSgzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLm5lZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0WmVybygpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoLTMpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGlyLnNldFplcm8oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCB2YWx1ZTsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQl2YWx1ZSA9IGlyLmFkZCgzKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHZhbHVlKTsKLQotCQlpci5zZXRWYWx1ZSgzKTsKLQkJdmFsdWUgPSBpci5hZGQoLTcpOwotCQlhc3NlcnRFcXVhbHMoLTQsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jcmVtZW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCB2YWx1ZTsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQl2YWx1ZSA9IGlyLmluY3JlbWVudCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmFsdWUpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YnRyYWN0SW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWludCBjb3VudDsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBpci5nZXRWYWx1ZSgpKTsKLQotCQljb3VudCA9IGlyLnN1YnRyYWN0KDMpOwotCQlhc3NlcnRFcXVhbHMoLTMsIGNvdW50KTsKLQotCQlpci5zZXRWYWx1ZSgtMyk7Ci0JCWNvdW50ID0gaXIuc3VidHJhY3QoLTcpOwotCQlhc3NlcnRFcXVhbHMoNCwgY291bnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWNyZW1lbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaW50IGNvdW50OwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlyLmdldFZhbHVlKCkpOwotCi0JCWNvdW50ID0gaXIuZGVjcmVtZW50KCk7Ci0JCWFzc2VydEVxdWFscygtMSwgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoLTEsIGlyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBseUludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoMyk7Ci0JCWFzc2VydEVxdWFscygzLCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDksIGlyLm11bHRpcGx5KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGl2aWRlSW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgyNCk7Ci0JCWFzc2VydEVxdWFscygyNCwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBpci5kaXZpZGUoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1haW5kZXJJbnQoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDI1KTsKLQkJYXNzZXJ0RXF1YWxzKDI1LCBpci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGlyLnJlbWFpbmRlcigzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pbkludCgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyOwotCQlpciA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoMjUpOwotCQlhc3NlcnRFcXVhbHMoMjUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgaXIubWluKDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1LCBpci5taW4oMzMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWF4SW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSgyNSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyNSwgaXIubWF4KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKDMwLCBpci5tYXgoMzApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UG93SW50KCkgewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXI7Ci0JCWlyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGlyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKGlyLnBvdygyKSA9PSAyNUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21wYXJlVG9JbnRSZWZlcmVuY2UoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjEgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDQ0KTsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyMiA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNDQpOwotCQlhc3NlcnRUcnVlKGlyMS5jb21wYXJlVG8oaXIyKSA9PSAwKTsKLQkJaXIyID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg1NSk7Ci0JCWFzc2VydFRydWUoaXIxLmNvbXBhcmVUbyhpcjIpIDwgMCk7Ci0JCWlyMiA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoMzMpOwotCQlhc3NlcnRUcnVlKGlyMS5jb21wYXJlVG8oaXIyKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJU2ltcGxlSW50UmVmZXJlbmNlIGlyMSA9IG5ldyBTaW1wbGVJbnRSZWZlcmVuY2UoNDQpOwotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXIyID0gaXIxLmNsb25lKCk7Ci0JCWFzc2VydEVxdWFscyg0NCwgaXIyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3RTYW1lKGlyMSwgaXIyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVJbnRSZWZlcmVuY2UgaXIxID0gbmV3IFNpbXBsZUludFJlZmVyZW5jZSg0NCk7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjIgPSBUZXN0VG9vbHMuc2VyaWFsaXplKGlyMSk7Ci0JCWFzc2VydEVxdWFscyg0NCwgaXIyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3RTYW1lKGlyMSwgaXIyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCVNpbXBsZUludFJlZmVyZW5jZSBpcjsKLQkJaXIgPSBuZXcgU2ltcGxlSW50UmVmZXJlbmNlKDUpOwotCQlhc3NlcnRFcXVhbHMoIls1XSIsIGlyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZU9iamVjdFJlZmVyZW5jZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlT2JqZWN0UmVmZXJlbmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE5MWFjOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU2ltcGxlT2JqZWN0UmVmZXJlbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZU9iamVjdFJlZmVyZW5jZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlT2JqZWN0UmVmZXJlbmNlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU2ltcGxlT2JqZWN0UmVmZXJlbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnROdWxsKG9yLmdldFZhbHVlKCkpOwotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlRXF1YWxzT2JqZWN0KCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRUcnVlKG9yLnZhbHVlRXF1YWxzKG51bGwpKTsKLQkJYXNzZXJ0RmFsc2Uob3IudmFsdWVFcXVhbHMoImZvbyIpKTsKLQotCQlvci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9yLnZhbHVlRXF1YWxzKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZUVxdWFscygiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZU5vdEVxdWFsT2JqZWN0KCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZU5vdEVxdWFsKG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShvci52YWx1ZU5vdEVxdWFsKCJmb28iKSk7Ci0KLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKG9yLnZhbHVlTm90RXF1YWwobnVsbCkpOwotCQlhc3NlcnRGYWxzZShvci52YWx1ZU5vdEVxdWFsKCJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTnVsbCgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0VHJ1ZShvci5pc051bGwoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3IuaXNOdWxsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdE51bGwoKSB7Ci0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydEZhbHNlKG9yLmlzTm90TnVsbCgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKG9yLmlzTm90TnVsbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbCgpIHsKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gb3IgPSBuZXcgU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4oKTsKLQkJYXNzZXJ0TnVsbChvci5nZXRWYWx1ZSgpKTsKLQkJb3Iuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9yLmdldFZhbHVlKCkpOwotCQlvci5zZXROdWxsKCk7Ci0JCWFzc2VydE51bGwob3IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPiBvciA9IG5ldyBTaW1wbGVPYmplY3RSZWZlcmVuY2U8U3RyaW5nPigiZm9vIik7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJjYXN0IikKLQkJU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4gY2xvbmUgPSAoU2ltcGxlT2JqZWN0UmVmZXJlbmNlPFN0cmluZz4pIG9yLmNsb25lKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xvbmUuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUob3IsIGNsb25lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCVNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+IG9yID0gbmV3IFNpbXBsZU9iamVjdFJlZmVyZW5jZTxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiW251bGxdIiwgb3IudG9TdHJpbmcoKSk7Ci0JCW9yLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJbZm9vXSIsIG9yLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVF1ZXVlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVRdWV1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjk5ZGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVF1ZXVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVRdWV1ZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlUXVldWVUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgU2ltcGxlUXVldWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlRdWV1ZTxTdHJpbmc+IGJ1aWxkUXVldWUoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUXVldWU8U3RyaW5nPigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCWFzc2VydFRydWUocXVldWUuaXNFbXB0eSgpKTsKLQkJcXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJYXNzZXJ0RmFsc2UocXVldWUuaXNFbXB0eSgpKTsKLQkJcXVldWUuZW5xdWV1ZSgic2Vjb25kIik7Ci0JCWFzc2VydEZhbHNlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JCXF1ZXVlLmRlcXVldWUoKTsKLQkJYXNzZXJ0RmFsc2UocXVldWUuaXNFbXB0eSgpKTsKLQkJcXVldWUuZGVxdWV1ZSgpOwotCQlhc3NlcnRUcnVlKHF1ZXVlLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVucXVldWVBbmREZXF1ZXVlKCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlxdWV1ZS5lbnF1ZXVlKGZpcnN0KTsKLQkJcXVldWUuZW5xdWV1ZShzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVucXVldWVBbmRQZWVrKCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlxdWV1ZS5lbnF1ZXVlKGZpcnN0KTsKLQkJcXVldWUuZW5xdWV1ZShzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5kZXF1ZXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBxdWV1ZS5kZXF1ZXVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVF1ZXVlRXhjZXB0aW9uUGVlaygpIHsKLQkJUXVldWU8U3RyaW5nPiBxdWV1ZSA9IHRoaXMuYnVpbGRRdWV1ZSgpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJcXVldWUuZW5xdWV1ZShmaXJzdCk7Ci0JCXF1ZXVlLmVucXVldWUoc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBxdWV1ZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLmRlcXVldWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHF1ZXVlLmRlcXVldWUoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcXVldWUucGVlaygpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UXVldWVFeGNlcHRpb25EZXF1ZXVlKCkgewotCQlRdWV1ZTxTdHJpbmc+IHF1ZXVlID0gdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlxdWV1ZS5lbnF1ZXVlKGZpcnN0KTsKLQkJcXVldWUuZW5xdWV1ZShzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHF1ZXVlLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgcXVldWUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgcXVldWUuZGVxdWV1ZSgpKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlxdWV1ZS5kZXF1ZXVlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZVF1ZXVlPFN0cmluZz4gcXVldWUgPSAoU2ltcGxlUXVldWU8U3RyaW5nPikgdGhpcy5idWlsZFF1ZXVlKCk7Ci0JCXF1ZXVlLmVucXVldWUoImZpcnN0Iik7Ci0JCXF1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCQlxdWV1ZS5lbnF1ZXVlKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUocXVldWUsIHF1ZXVlLmNsb25lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVF1ZXVlPFN0cmluZz4gcXVldWUgPSB0aGlzLmJ1aWxkUXVldWUoKTsKLQkJcXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJcXVldWUuZW5xdWV1ZSgic2Vjb25kIik7Ci0JCXF1ZXVlLmVucXVldWUoInRoaXJkIik7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShxdWV1ZSwgVGVzdFRvb2xzLnNlcmlhbGl6ZShxdWV1ZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShRdWV1ZTxTdHJpbmc+IG9yaWdpbmFsLCBRdWV1ZTxTdHJpbmc+IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmRlcXVldWUoKSwgY2xvbmUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmRlcXVldWUoKSwgY2xvbmUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmlzRW1wdHkoKSwgY2xvbmUuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLmRlcXVldWUoKSwgY2xvbmUuZGVxdWV1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCi0JCW9yaWdpbmFsLmVucXVldWUoImZvdXJ0aCIpOwotCQlhc3NlcnRGYWxzZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQkvLyBjbG9uZSBzaG91bGQgc3RpbGwgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5pc0VtcHR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVN0YWNrVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TaW1wbGVTdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3M2Q4NjMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1NpbXBsZVN0YWNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RhY2tUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHVibGljIFNpbXBsZVN0YWNrVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JU3RhY2s8U3RyaW5nPiBidWlsZFN0YWNrKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVN0YWNrPFN0cmluZz4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlhc3NlcnRUcnVlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCWFzc2VydEZhbHNlKHN0YWNrLmlzRW1wdHkoKSk7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlhc3NlcnRGYWxzZShzdGFjay5pc0VtcHR5KCkpOwotCQlzdGFjay5wb3AoKTsKLQkJYXNzZXJ0RmFsc2Uoc3RhY2suaXNFbXB0eSgpKTsKLQkJc3RhY2sucG9wKCk7Ci0JCWFzc2VydFRydWUoc3RhY2suaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHVzaEFuZFBvcCgpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBvcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHVzaEFuZFBlZWsoKSB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJU3RyaW5nIGZpcnN0ID0gImZpcnN0IjsKLQkJU3RyaW5nIHNlY29uZCA9ICJzZWNvbmQiOwotCi0JCXN0YWNrLnB1c2goZmlyc3QpOwotCQlzdGFjay5wdXNoKHNlY29uZCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmQsIHN0YWNrLnBvcCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0YWNrRXhjZXB0aW9uUGVlaygpIHsKLQkJU3RhY2s8U3RyaW5nPiBzdGFjayA9IHRoaXMuYnVpbGRTdGFjaygpOwotCQlTdHJpbmcgZmlyc3QgPSAiZmlyc3QiOwotCQlTdHJpbmcgc2Vjb25kID0gInNlY29uZCI7Ci0KLQkJc3RhY2sucHVzaChmaXJzdCk7Ci0JCXN0YWNrLnB1c2goc2Vjb25kKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZCwgc3RhY2sucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMoZmlyc3QsIHN0YWNrLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucG9wKCkpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0YWNrLnBlZWsoKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVN0YWNrRXhjZXB0aW9uUG9wKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gdGhpcy5idWlsZFN0YWNrKCk7Ci0JCVN0cmluZyBmaXJzdCA9ICJmaXJzdCI7Ci0JCVN0cmluZyBzZWNvbmQgPSAic2Vjb25kIjsKLQotCQlzdGFjay5wdXNoKGZpcnN0KTsKLQkJc3RhY2sucHVzaChzZWNvbmQpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kLCBzdGFjay5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhmaXJzdCwgc3RhY2sucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZpcnN0LCBzdGFjay5wb3AoKSk7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RhY2sucG9wKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKEVtcHR5U3RhY2tFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCVNpbXBsZVN0YWNrPFN0cmluZz4gc3RhY2sgPSAoU2ltcGxlU3RhY2s8U3RyaW5nPikgdGhpcy5idWlsZFN0YWNrKCk7Ci0JCXN0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXN0YWNrLnB1c2goInNlY29uZCIpOwotCQlzdGFjay5wdXNoKCJ0aGlyZCIpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUoc3RhY2ssIHN0YWNrLmNsb25lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0YWNrPFN0cmluZz4gc3RhY2sgPSB0aGlzLmJ1aWxkU3RhY2soKTsKLQkJc3RhY2sucHVzaCgiZmlyc3QiKTsKLQkJc3RhY2sucHVzaCgic2Vjb25kIik7Ci0JCXN0YWNrLnB1c2goInRoaXJkIik7Ci0KLQkJdGhpcy52ZXJpZnlDbG9uZShzdGFjaywgVGVzdFRvb2xzLnNlcmlhbGl6ZShzdGFjaykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShTdGFjazxTdHJpbmc+IG9yaWdpbmFsLCBTdGFjazxTdHJpbmc+IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBlZWsoKSwgY2xvbmUucGVlaygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLnBvcCgpLCBjbG9uZS5wb3AoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wZWVrKCksIGNsb25lLnBlZWsoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbC5wb3AoKSwgY2xvbmUucG9wKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucGVlaygpLCBjbG9uZS5wZWVrKCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwucG9wKCksIGNsb25lLnBvcCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwuaXNFbXB0eSgpLCBjbG9uZS5pc0VtcHR5KCkpOwotCi0JCW9yaWdpbmFsLnB1c2goImZvdXJ0aCIpOwotCQlhc3NlcnRGYWxzZShvcmlnaW5hbC5pc0VtcHR5KCkpOwotCQkvLyBjbG9uZSBzaG91bGQgc3RpbGwgYmUgZW1wdHkKLQkJYXNzZXJ0VHJ1ZShjbG9uZS5pc0VtcHR5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TdHJpbmdUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNGJhYjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N0cmluZ1Rvb2xzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0cmluZ1Rvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU3RyaW5nVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBhY3R1YWwpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKGFjdHVhbCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcGFkZGluZy90cnVuY2F0aW5nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RQYWQoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIFN0cmluZ1Rvb2xzLnBhZCgiZnJlZCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCA2KSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWQoImZyZWQiLCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIFN0cmluZ1Rvb2xzLnBhZChuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBTdHJpbmdUb29scy5wYWQobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA2KSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiZnIiLCBTdHJpbmdUb29scy5wYWQobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCAyKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPbldyaXRlcigpIHsKLQkJV3JpdGVyIHdyaXRlcjsKLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9uKCJmcmVkIiwgNiwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDIsIHdyaXRlcik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPblN0cmluZ0J1ZmZlcigpIHsKLQkJU3RyaW5nQnVmZmVyIHNiOwotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkICAiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCAyLCBzYik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2I7Ci0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucGFkT24oImZyZWQiLCA2LCBzYik7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmdUb29scy5wYWRPbigiZnJlZCIsIDIsIHNiKTsKLQkJCWZhaWwoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGUoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZSgiZnJlZCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmciIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUoImZyZWQiLCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydEVxdWFscygiZnJlZCIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCA0KSk7Ci0JCWFzc2VydEVxdWFscygiZnJlZCAgIiwgU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJ2YnLCAncicsICdlJywgJ2QnIH0sIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmciIsIFN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGUobmV3IGNoYXJbXSB7ICdmJywgJ3InLCAnZScsICdkJyB9LCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhZE9yVHJ1bmNhdGVPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyZWQiLCAiZnJlZCIsIDQpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPbldyaXRlcigiZnJlZCAgIiwgImZyZWQiLCA2KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25Xcml0ZXIoImZyIiwgImZyZWQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UGFkT3JUcnVuY2F0ZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoImZyZWQgICIsICJmcmVkIiwgNik7Ci0JCXRoaXMudmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCJmciIsICJmcmVkIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5wYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmcmVkIiwgImZyZWQiLCA0KTsKLQkJdGhpcy52ZXJpZnlQYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCJmcmVkICAiLCAiZnJlZCIsIDYpOwotCQl0aGlzLnZlcmlmeVBhZE9yVHJ1bmNhdGVPblN0cmluZ0J1aWxkZXIoImZyIiwgImZyZWQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnBhZE9yVHJ1bmNhdGVPbihzdHJpbmcsIGxlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkKCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWQoIjEyMzQiLCA2KSk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydEVxdWFscygiMTIiLCBTdHJpbmdUb29scy56ZXJvUGFkKCIxMjM0IiwgMikpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZENoYXJBcnJheSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZChuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgNikpOwotCQlib29sZWFuIGV4VGhyb3duID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjEyIiwgU3RyaW5nVG9vbHMuemVyb1BhZChuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleFRocm93biA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleFRocm93bik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPbldyaXRlcigpIHsKLQkJV3JpdGVyIHdyaXRlcjsKLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA2LCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIHdyaXRlci50b1N0cmluZygpKTsKLQotCQl3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCWJvb2xlYW4gZXhUaHJvd24gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDIsIHdyaXRlcik7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhUaHJvd24gPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhUaHJvd24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT25TdHJpbmdCdWZmZXIoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMjM0Iiwgc2IudG9TdHJpbmcoKSk7Ci0KLQkJc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPbigiMTIzNCIsIDYsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9uU3RyaW5nQnVpbGRlcigpIHsKLQkJU3RyaW5nQnVpbGRlciBzYjsKLQkJc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT24oIjEyMzQiLCA0LCBzYik7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgNiwgc2IpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJYm9vbGVhbiBleFRocm93biA9IGZhbHNlOwotCQl0cnkgewotCQkJU3RyaW5nVG9vbHMuemVyb1BhZE9uKCIxMjM0IiwgMiwgc2IpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4VGhyb3duID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4VGhyb3duKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGUoKSB7Ci0JCWFzc2VydEVxdWFscygiMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgNCkpOwotCQlhc3NlcnRFcXVhbHMoIjAwMTIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKCIxMjM0IiwgNikpOwotCQlhc3NlcnRFcXVhbHMoIjM0IiwgU3RyaW5nVG9vbHMuemVyb1BhZE9yVHJ1bmNhdGUoIjEyMzQiLCAyKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlQ2hhckFycmF5KCkgewotCQlhc3NlcnRFcXVhbHMoIjEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCIwMDEyMzQiLCBTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZShuZXcgY2hhcltdIHsgJzEnLCAnMicsICczJywgJzQnIH0sIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzNCIsIFN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlKG5ldyBjaGFyW10geyAnMScsICcyJywgJzMnLCAnNCcgfSwgMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjEyMzQiLCAiMTIzNCIsIDQpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25Xcml0ZXIoIjAwMTIzNCIsICIxMjM0IiwgNik7Ci0JCXRoaXMudmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPbldyaXRlcigiMzQiLCAiMTIzNCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uV3JpdGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVmZmVyKCIwMDEyMzQiLCAiMTIzNCIsIDYpOwotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWZmZXIoIjM0IiwgIjEyMzQiLCAyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5WmVyb1BhZE9yVHJ1bmNhdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy56ZXJvUGFkT3JUcnVuY2F0ZU9uKHN0cmluZywgbGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVplcm9QYWRPclRydW5jYXRlT25TdHJpbmdCdWlsZGVyKCIxMjM0IiwgIjEyMzQiLCA0KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMDAxMjM0IiwgIjEyMzQiLCA2KTsKLQkJdGhpcy52ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcigiMzQiLCAiMTIzNCIsIDIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlaZXJvUGFkT3JUcnVuY2F0ZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnplcm9QYWRPclRydW5jYXRlT24oc3RyaW5nLCBsZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNlcGFyYXRpbmcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFNlcGFyYXRlU3RyaW5nQ2hhckludCgpIHsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZSgiMDEyMzQ1IiwgJy0nLCAyMiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICA2LCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGUoIjAxMjM0NSIsICctJywgIDUsICIwMTIzNC01Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGUoIjAxMjM0NSIsICctJywgIDQsICIwMTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGUoIjAxMjM0NSIsICctJywgIDMsICIwMTItMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGUoIjAxMjM0NSIsICctJywgIDIsICIwMS0yMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlKCIwMTIzNDUiLCAnLScsICAxLCAiMC0xLTItMy00LTUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VwYXJhdGUoU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50TGVuZ3RoLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5zZXBhcmF0ZShzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZU9uU3RyaW5nQ2hhckludFdyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDUsICIwMTIzNC01Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDIsICIwMS0yMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnNlcGFyYXRlT24oc3RyaW5nLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZU9uU3RyaW5nQ2hhckludFN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsIDIyLCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDUsICIwMTIzNC01Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgNCwgIjAxMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDIsICIwMS0yMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDEsICIwLTEtMi0zLTQtNSIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuc2VwYXJhdGVPbihzdHJpbmcsIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZU9uU3RyaW5nQ2hhckludFN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5zZXBhcmF0ZU9uKHN0cmluZywgc2VwYXJhdG9yLCBzZWdtZW50TGVuZ3RoLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcGFyYXRlQ2hhckFycmF5Q2hhckludCgpIHsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheSgiMDEyMzQ1IiwgJy0nLCAyMiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICA2LCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXkoIjAxMjM0NSIsICctJywgIDUsICIwMTIzNC01Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXkoIjAxMjM0NSIsICctJywgIDQsICIwMTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXkoIjAxMjM0NSIsICctJywgIDMsICIwMTItMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXkoIjAxMjM0NSIsICctJywgIDIsICIwMS0yMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5KCIwMTIzNDUiLCAnLScsICAxLCAiMC0xLTItMy00LTUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXkoU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50TGVuZ3RoLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy5zZXBhcmF0ZShzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50TGVuZ3RoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcGFyYXRlT25DaGFyQXJyYXlDaGFySW50V3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICA2LCAiMDEyMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgNSwgIjAxMjM0LTUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uV3JpdGVyKCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoIjAxMjM0NSIsICctJywgIDMsICIwMTItMzQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgMiwgIjAxLTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPbldyaXRlcigiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25Xcml0ZXIoU3RyaW5nIHN0cmluZywgY2hhciBzZXBhcmF0b3IsIGludCBzZWdtZW50TGVuZ3RoLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuc2VwYXJhdGVPbihzdHJpbmcudG9DaGFyQXJyYXkoKSwgc2VwYXJhdG9yLCBzZWdtZW50TGVuZ3RoLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVPbkNoYXJBcnJheUNoYXJJbnRTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAyMiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDYsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWZmZXIoIjAxMjM0NSIsICctJywgIDQsICIwMTIzLTQ1Iik7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcigiMDEyMzQ1IiwgJy0nLCAgMywgIjAxMi0zNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVmZmVyKCIwMTIzNDUiLCAnLScsICAxLCAiMC0xLTItMy00LTUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBjaGFyIHNlcGFyYXRvciwgaW50IHNlZ21lbnRMZW5ndGgsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnNlcGFyYXRlT24oc3RyaW5nLnRvQ2hhckFycmF5KCksIHNlcGFyYXRvciwgc2VnbWVudExlbmd0aCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXBhcmF0ZU9uQ2hhckFycmF5Q2hhckludFN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5U2VwYXJhdGVDaGFyQXJyYXlPblN0cmluZ0J1aWxkZXIoIjAxMjM0NSIsICctJywgMjIsICIwMTIzNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgNiwgIjAxMjM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICA1LCAiMDEyMzQtNSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICA0LCAiMDEyMy00NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICAzLCAiMDEyLTM0NSIpOwotCQl0aGlzLnZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWlsZGVyKCIwMTIzNDUiLCAnLScsICAyLCAiMDEtMjMtNDUiKTsKLQkJdGhpcy52ZXJpZnlTZXBhcmF0ZUNoYXJBcnJheU9uU3RyaW5nQnVpbGRlcigiMDEyMzQ1IiwgJy0nLCAgMSwgIjAtMS0yLTMtNC01Iik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcGFyYXRlQ2hhckFycmF5T25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgc2VwYXJhdG9yLCBpbnQgc2VnbWVudExlbmd0aCwgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5zZXBhcmF0ZU9uKHN0cmluZy50b0NoYXJBcnJheSgpLCBzZXBhcmF0b3IsIHNlZ21lbnRMZW5ndGgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGRlbGltaXRpbmcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdERlbGltaXQoKSB7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdCgiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdCgiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0KCIiLCAiMTIzIiwgIjEyMzEyMyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEZWxpbWl0KFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLmRlbGltaXQoc3RyaW5nLCBkZWxpbWl0ZXIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVsaW1pdE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeURlbGltaXRPbldyaXRlcigiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uV3JpdGVyKCIxMjMiLCAiMTIzIiwgIjEyMzEyMzEyMyIpOwotCQl0aGlzLnZlcmlmeURlbGltaXRPbldyaXRlcigiIiwgIjEyMyIsICIxMjMxMjMiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RGVsaW1pdE9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5kZWxpbWl0T24oc3RyaW5nLCBkZWxpbWl0ZXIsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWxpbWl0T25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSIsICIxMjMiLCAiMTIzRW1wbG95ZWUxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWZmZXIoIjEyMyIsICIxMjMiLCAiMTIzMTIzMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVmZmVyKCIiLCAiMTIzIiwgIjEyMzEyMyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWZmZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGRlbGltaXRlciwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlbGltaXRPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUiLCAiMTIzIiwgIjEyM0VtcGxveWVlMTIzIik7Ci0JCXRoaXMudmVyaWZ5RGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiMTIzIiwgIjEyMyIsICIxMjMxMjMxMjMiKTsKLQkJdGhpcy52ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWlsZGVyKCIiLCAiMTIzIiwgIjEyMzEyMyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlEZWxpbWl0T25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBkZWxpbWl0ZXIsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMuZGVsaW1pdE9uKHN0cmluZywgZGVsaW1pdGVyLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFF1b3RlKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlKCJFbXBsb3llZSIsICJcIkVtcGxveWVlXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiMTIzIiwgIlwiMTIzXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZSgiRW1wXCJsb3llZSIsICJcIkVtcFwiXCJsb3llZVwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVF1b3RlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnF1b3RlKHN0cmluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25Xcml0ZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPbldyaXRlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uV3JpdGVyKCJFbXBcImxveWVlIiwgIlwiRW1wXCJcImxveWVlXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucXVvdGVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIiwgIlwiRW1wbG95ZWVcIiIpOwotCQl0aGlzLnZlcmlmeVF1b3RlT25TdHJpbmdCdWZmZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVmZmVyKCJFbXBcImxveWVlIiwgIlwiRW1wXCJcImxveWVlXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UXVvdGVPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5xdW90ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RRdW90ZU9uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUiLCAiXCJFbXBsb3llZVwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIjEyMyIsICJcIjEyM1wiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5UXVvdGVPblN0cmluZ0J1aWxkZXIoIkVtcFwibG95ZWUiLCAiXCJFbXBcIlwibG95ZWVcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlRdW90ZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnF1b3RlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmluZyBjaGFyYWN0ZXJzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2UoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlKCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZSgiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2UoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZShTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlKHN0cmluZywgY2hhclRvUmVtb3ZlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VDaGFyQXJyYXkoIkVtcGxvJnllZSIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsbyZ5ZWUmIiwgJyYnLCAiRW1wbG95ZWUmIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsb3llZSAmRm9vIiwgJyYnLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KCJFbXBsb3llZSYiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZUNoYXJBcnJheSgiJkVtcGxveWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2Uoc3RyaW5nLnRvQ2hhckFycmF5KCksIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPbldyaXRlcigiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKCJFbXBsb3llZSAmRm9vIiwgJyYnLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25Xcml0ZXIoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uV3JpdGVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlRmlyc3RPY2N1cnJlbmNlT24oc3RyaW5nLCBjaGFyVG9SZW1vdmUsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG8meWVlIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1ZmZlcigiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSAmRm9vIiwgJyYnLCAiRW1wbG95ZWUgRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlJiIsICcmJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWZmZXIoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlRmlyc3RPY2N1cnJlbmNlT25TdHJpbmdCdWlsZGVyKCJFbXBsbyZ5ZWUiLCAnJicsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiRW1wbG8meWVlJiIsICcmJywgIkVtcGxveWVlJiIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgJkZvbyIsICcmJywgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUmIiwgJyYnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVGaXJzdE9jY3VycmVuY2VPblN0cmluZ0J1aWxkZXIoIiZFbXBsb3llZSIsICcmJywgIkVtcGxveWVlIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUZpcnN0T2NjdXJyZW5jZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVGaXJzdE9jY3VycmVuY2VPbihzdHJpbmcsIGNoYXJUb1JlbW92ZSwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlcygpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiRW1wbG95ZWUgRnJlZCIsICcgJywgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlcygiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzKCIgRW1wIGxveWVlICAgRm9vIiwgJyAnLCAiRW1wbG95ZWVGb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXMoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKHN0cmluZywgY2hhclRvUmVtb3ZlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzQ2hhckFycmF5KCJFbXBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNDaGFyQXJyYXkoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc0NoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgU3RyaW5nVG9vbHMucmVtb3ZlQWxsT2NjdXJyZW5jZXMoc3RyaW5nLnRvQ2hhckFycmF5KCksIGNoYXJUb1JlbW92ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoIkVtcGxveWVlIEZyZWQiLCAnICcsICJFbXBsb3llZUZyZWQiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCIgRW1wbG95ZWUgIiwgJyAnLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uV3JpdGVyKCJFbXBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPbldyaXRlcigiIEVtcCBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgY2hhciBjaGFyVG9SZW1vdmUsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgY2hhclRvUmVtb3ZlLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiIEVtcGxveWVlICIsICcgJywgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWZmZXIoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVmZmVyKFN0cmluZyBzdHJpbmcsIGNoYXIgY2hhclRvUmVtb3ZlLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgY2hhclRvUmVtb3ZlLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSBGcmVkIiwgJyAnLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoIiBFbXBsb3llZSAiLCAnICcsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbE9jY3VycmVuY2VzT25TdHJpbmdCdWlsZGVyKCJFbXBsb3llZSAgIEZvbyIsICcgJywgIkVtcGxveWVlRm9vIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsT2NjdXJyZW5jZXNPblN0cmluZ0J1aWxkZXIoIiBFbXAgbG95ZWUgICBGb28iLCAnICcsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxPY2N1cnJlbmNlc09uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBjaGFyIGNoYXJUb1JlbW92ZSwgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxPY2N1cnJlbmNlc09uKHN0cmluZywgY2hhclRvUmVtb3ZlLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2UoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZSgiRW1wbG95ZWUgRnJlZFx0IiwgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2UoIiBFbXBcdGxveWVlIFxuIEZvbyIsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2Uoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZUNoYXJBcnJheSgiRW1wbG95ZWUgRnJlZFx0IiwgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VDaGFyQXJyYXkoIiBFbXBcdGxveWVlIFxuIEZvbyIsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlQ2hhckFycmF5KFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2Uoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiRW1wbG95ZWUgRnJlZFx0IiwgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPbldyaXRlcigiXHRFbXBsb3llZVxuIiwgIkVtcGxveWVlIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uV3JpdGVyKCJFbXBsb3llZSBcdCBGb28iLCAiRW1wbG95ZWVGb28iKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoIiBFbXBcdGxveWVlIFxuIEZvbyIsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25Xcml0ZXIoU3RyaW5nIHN0cmluZywgU3RyaW5nIGV4cGVjdGVkU3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnJlbW92ZUFsbFdoaXRlc3BhY2VPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJFbXBsb3llZSBGcmVkXHQiLCAiRW1wbG95ZWVGcmVkIik7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCJcdEVtcGxveWVlXG4iLCAiRW1wbG95ZWUiKTsKLQkJdGhpcy52ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiIEVtcFx0bG95ZWUgXG4gRm9vIiwgIkVtcGxveWVlRm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5yZW1vdmVBbGxXaGl0ZXNwYWNlT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFN0cmluZywgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQWxsV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgRnJlZFx0IiwgIkVtcGxveWVlRnJlZCIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIlx0RW1wbG95ZWVcbiIsICJFbXBsb3llZSIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZUZvbyIpOwotCQl0aGlzLnZlcmlmeVJlbW92ZUFsbFdoaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIiBFbXBcdGxveWVlIFxuIEZvbyIsICJFbXBsb3llZUZvbyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlSZW1vdmVBbGxXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMucmVtb3ZlQWxsV2hpdGVzcGFjZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCXB1YmxpYyB2b2lkIHRlc3RDb21wcmVzc1doaXRlc3BhY2UoKSB7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlKCJFbXBsb3llZSAgICAgIEZyZWRcdCIsICJFbXBsb3llZSBGcmVkICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZSgiXHRFbXBsb3llZSAgXG4iLCAiIEVtcGxveWVlICIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZSgiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZSgiIEVtcFx0bG95ZWUgXG4gRm9vICIsICIgRW1wIGxveWVlIEZvbyAiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlKFN0cmluZyBzdHJpbmcsIFN0cmluZyBleHBlY3RlZFN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIFN0cmluZ1Rvb2xzLmNvbXByZXNzV2hpdGVzcGFjZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NXaGl0ZXNwYWNlQ2hhckFycmF5KCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheSgiRW1wbG95ZWUgICAgICBGcmVkXHQiLCAiRW1wbG95ZWUgRnJlZCAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoIlx0RW1wbG95ZWUgIFxuIiwgIiBFbXBsb3llZSAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VDaGFyQXJyYXkoIiBFbXBcdGxveWVlIFxuIEZvbyAiLCAiIEVtcCBsb3llZSBGb28gIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZUNoYXJBcnJheShTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2Uoc3RyaW5nLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25Xcml0ZXIoIlx0RW1wbG95ZWUgIFxuIiwgIiBFbXBsb3llZSAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uV3JpdGVyKCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPbldyaXRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29tcHJlc3NXaGl0ZXNwYWNlT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIkVtcGxveWVlICAgICAgRnJlZFx0IiwgIkVtcGxveWVlIEZyZWQgIik7Ci0JCXRoaXMudmVyaWZ5Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWZmZXIoIlx0RW1wbG95ZWUgIFxuIiwgIiBFbXBsb3llZSAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcigiRW1wbG95ZWUgXHQgRm9vIiwgIkVtcGxveWVlIEZvbyIpOwotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVmZmVyKCIgRW1wXHRsb3llZSBcbiBGb28gIiwgIiBFbXAgbG95ZWUgRm9vICIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1ZmZlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb21wcmVzc1doaXRlc3BhY2VPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyaW5nLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NXaGl0ZXNwYWNlT25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcigiRW1wbG95ZWUgICAgICBGcmVkXHQiLCAiRW1wbG95ZWUgRnJlZCAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIlx0RW1wbG95ZWUgIFxuIiwgIiBFbXBsb3llZSAiKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIkVtcGxveWVlIFx0IEZvbyIsICJFbXBsb3llZSBGb28iKTsKLQkJdGhpcy52ZXJpZnlDb21wcmVzc1doaXRlc3BhY2VPblN0cmluZ0J1aWxkZXIoIiBFbXBcdGxveWVlIFxuIEZvbyAiLCAiIEVtcCBsb3llZSBGb28gIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbXByZXNzV2hpdGVzcGFjZU9uU3RyaW5nQnVpbGRlcihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgZXhwZWN0ZWRTdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbXByZXNzV2hpdGVzcGFjZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdHJpbmcsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogY29tbW9uIHByZWZpeCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbW9uUHJlZml4TGVuZ3RoKCkgewotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vQkJCIikpOwotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vQkJCIikpOwotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb29aWloiLCAiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMywgU3RyaW5nVG9vbHMuY29tbW9uUHJlZml4TGVuZ3RoKCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21tb25QcmVmaXhMZW5ndGhNYXgoKSB7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb29CQkIiLCAyKSk7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb29CQkIiLCAyKSk7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvb1paWiIsICJmb28iLCAyKSk7Ci0JCWFzc2VydEVxdWFscygyLCBTdHJpbmdUb29scy5jb21tb25QcmVmaXhMZW5ndGgoImZvbyIsICJmb28iLCAyKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjYXBpdGFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZUNoYXJBcnJheSgiXHUwMEM5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEU5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplQ2hhckFycmF5KFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVTdHJpbmcoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiT3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIk9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZVN0cmluZygiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVTdHJpbmcoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJBIiwgImEiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplU3RyaW5nKCJcdTAwQzljb2xlIiwgIlx1MDBFOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplU3RyaW5nKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiQSIsIG5ldyBjaGFyW10geyAnYScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJcdTAwQzljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwRTknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIkEiLCBuZXcgY2hhcltdIHsgJ2EnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiT3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJcdTAwQzljb2xlIiwgIlx1MDBFOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIk9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCJPcmFjbGUiLCAib3JhY2xlIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiXHUwMEM5Y29sZSIsICJcdTAwRTljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdPJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJPcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiT1JBQ0xFIiwgbmV3IGNoYXJbXSB7ICdPJywgJ1InLCAnQScsICdDJywgJ0wnLCAnRScgfSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJBIiwgbmV3IGNoYXJbXSB7ICdhJyB9KTsKLQkJdGhpcy52ZXJpZnlDYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIlx1MDBDOWNvbGUiLCBuZXcgY2hhcltdIHsgJ1x1MDBFOScsICdjJywgJ28nLCAnbCcsICdlJyB9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT3JhY2xlIiwgIk9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiICAgIiwgIiAgICIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiT1JBQ0xFIiwgIk9SQUNMRSIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeUNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiQSIsICJhIik7Ci0JCXRoaXMudmVyaWZ5Q2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJcdTAwQzljb2xlIiwgIlx1MDBFOWNvbGUiKTsgLy8g77+9Y29sZS0+77+9Q09MRQotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNhcGl0YWxpemVPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmFwaXRhbGl6ZUNoYXJBcnJheSgpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCIgICAiLCBuZXcgY2hhcltdIHsgJyAnLCAnICcsICcgJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVDaGFyQXJyYXkoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheSgiYSIsIG5ldyBjaGFyW10geyAnQScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplQ2hhckFycmF5KCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZUNoYXJBcnJheShTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmNhcGl0YWxpemUoc3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZVN0cmluZygpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIm9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVTdHJpbmcoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZVN0cmluZygiXHUwMEU5Y29sZSIsICJcdTAwQzljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplU3RyaW5nKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShzdHJpbmcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnTycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ28nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1ZmZlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoIk9SQUNMRSIsIG5ldyBjaGFyW10geyAnTycsICdSJywgJ0EnLCAnQycsICdMJywgJ0UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCIiLCBuZXcgY2hhclswXSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWZmZXIoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKCJcdTAwRTljb2xlIiwgbmV3IGNoYXJbXSB7ICdcdTAwQzknLCAnYycsICdvJywgJ2wnLCAnZScgfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgY2hhcltdIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIm9yYWNsZSIsIG5ldyBjaGFyW10geyAnbycsICdyJywgJ2EnLCAnYycsICdsJywgJ2UnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiICAgIiwgbmV3IGNoYXJbXSB7ICcgJywgJyAnLCAnICcgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlTdHJpbmdCdWlsZGVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoIiIsIG5ldyBjaGFyWzBdKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoImEiLCBuZXcgY2hhcltdIHsgJ0EnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5U3RyaW5nQnVpbGRlcigiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVN0cmluZ0J1aWxkZXIoU3RyaW5nIGV4cGVjdGVkLCBjaGFyW10gc3RyaW5nKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy51bmNhcGl0YWxpemVPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIm9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigib3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVmZmVyKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1ZmZlcigiXHUwMEU5Y29sZSIsICJcdTAwQzljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIm9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIm9yYWNsZSIsICJvcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiAgICIsICIgICAiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1N0cmluZ0J1aWxkZXIoImEiLCAiQSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nU3RyaW5nQnVpbGRlcigiXHUwMEU5Y29sZSIsICJcdTAwQzljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdTdHJpbmdCdWlsZGVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJvcmFjbGUiLCBuZXcgY2hhcltdIHsgJ08nLCAncicsICdhJywgJ2MnLCAnbCcsICdlJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigib3JhY2xlIiwgbmV3IGNoYXJbXSB7ICdvJywgJ3InLCAnYScsICdjJywgJ2wnLCAnZScgfSk7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25DaGFyQXJyYXlXcml0ZXIoIiAgICIsIG5ldyBjaGFyW10geyAnICcsICcgJywgJyAnIH0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJPUkFDTEUiLCBuZXcgY2hhcltdIHsgJ08nLCAnUicsICdBJywgJ0MnLCAnTCcsICdFJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiIiwgbmV3IGNoYXJbMF0pOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uQ2hhckFycmF5V3JpdGVyKCJhIiwgbmV3IGNoYXJbXSB7ICdBJyB9KTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcigiXHUwMEU5Y29sZSIsIG5ldyBjaGFyW10geyAnXHUwMEM5JywgJ2MnLCAnbycsICdsJywgJ2UnIH0pOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmNhcGl0YWxpemVPbkNoYXJBcnJheVdyaXRlcihTdHJpbmcgZXhwZWN0ZWQsIGNoYXJbXSBzdHJpbmcpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5jYXBpdGFsaXplT24oc3RyaW5nLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIm9yYWNsZSIsICJPcmFjbGUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigib3JhY2xlIiwgIm9yYWNsZSIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCIgICAiLCAiICAgIik7Ci0JCXRoaXMudmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoIk9SQUNMRSIsICJPUkFDTEUiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuY2FwaXRhbGl6ZU9uU3RyaW5nV3JpdGVyKCJhIiwgIkEiKTsKLQkJdGhpcy52ZXJpZnlVbmNhcGl0YWxpemVPblN0cmluZ1dyaXRlcigiXHUwMEU5Y29sZSIsICJcdTAwQzljb2xlIik7IC8vIO+/vWNvbGUtPu+/vUNPTEUKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5jYXBpdGFsaXplT25TdHJpbmdXcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZU9uKHN0cmluZywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiAjdG9TdHJpbmcoKSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRUb1N0cmluZ0NsYXNzTmFtZV9hbm9ueW1vdXMoKSB7Ci0JCU9iamVjdCBvID0gbmV3IE9iamVjdCgpey8qYW5vbnltb3VzIHN1YmNsYXNzIG9mIE9iamVjdCovfTsKLQkJYXNzZXJ0RXF1YWxzKCJPYmplY3QiLCBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nQ2xhc3NOYW1lKG8uZ2V0Q2xhc3MoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZFRvU3RyaW5nQ2xhc3NOYW1lX21lbWJlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKCJNYXAuRW50cnkiLCBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nQ2xhc3NOYW1lKGphdmEudXRpbC5NYXAuRW50cnkuY2xhc3MpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVpbGRUb1N0cmluZ0NsYXNzTmFtZV9sb2NhbCgpIHsKLQkJY2xhc3MgRm9vIHsKLQkJCUJhciBiYXIgPSBuZXcgQmFyKCk7Ci0JCQljbGFzcyBCYXIgewotCQkJCUJhcigpIHsKLQkJCQkJc3VwZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlGb28oKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJfQotCQlGb28gZm9vID0gbmV3IEZvbygpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZ1Rvb2xzVGVzdHMuRm9vIiwgU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0NsYXNzTmFtZShmb28uZ2V0Q2xhc3MoKSkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZ1Rvb2xzVGVzdHMuRm9vLkJhciIsIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdDbGFzc05hbWUoZm9vLmJhci5nZXRDbGFzcygpKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0VtcHR5U3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoKFN0cmluZykgbnVsbCkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoIiIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIgICAgICAiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgiICAgICAgXHRcdCAgICIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KCIgICAgICBcdFx0ICAgIiArIFN0cmluZ1Rvb2xzLkNSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSgoY2hhcltdKSBudWxsKSk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNFbXB0eUNoYXJBcnJheSgiICAgICAgXHRcdCAgICIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoIiAgICAgICIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRW1wdHlDaGFyQXJyYXkoIiAgICAgIFx0XHQgICAiICsgU3RyaW5nVG9vbHMuQ1IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0VtcHR5Q2hhckFycmF5KFN0cmluZyBzdHJpbmcpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHN0cmluZy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBcmVFcXVhbFN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoKFN0cmluZykgbnVsbCwgKFN0cmluZykgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwobnVsbCwgImFzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCgiYXNkZiIsIG51bGwpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLCAiYXNkZiIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIiwgIkFTREYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBcmVFcXVhbENoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoKGNoYXJbXSkgbnVsbCwgKGNoYXJbXSkgbnVsbCkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoKGNoYXJbXSkgbnVsbCwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIi50b0NoYXJBcnJheSgpLCAoY2hhcltdKSBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoImFzZGYiLnRvQ2hhckFycmF5KCksICJBU0RGIi50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2VTdHJpbmdTdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgoU3RyaW5nKSBudWxsLCAoU3RyaW5nKSBudWxsKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UobnVsbCwgImFzZGYiKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLCBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RmIikpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbElnbm9yZUNhc2UoImFzZGYiLCAiQVNERiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZUNoYXJBcnJheUNoYXJBcnJheSgpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKChjaGFyW10pIG51bGwsIChjaGFyW10pIG51bGwpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgoY2hhcltdKSBudWxsLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAoY2hhcltdKSBudWxsKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImFzZGYiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWxJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiQVNERiIudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZVN0cmluZ1N0cmluZygpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhcyIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhUyIpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICIiKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiQSIpKTsKLQotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJic2RmIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJnIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RnIikpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIsICJhc2RmZyIpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLCAiYXNkZmdnZ2dnZyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2VDaGFyQXJyYXlDaGFyQXJyYXkoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhcyIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYVMiLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgIiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiQSIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiQVNERiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZiIudG9DaGFyQXJyYXkoKSkpOwotCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYnNkZiIudG9DaGFyQXJyYXkoKSkpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdTdGFydHNXaXRoSWdub3JlQ2FzZSgiYXNkZiIudG9DaGFyQXJyYXkoKSwgImciLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RnIi50b0NoYXJBcnJheSgpKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKCJhc2RmIi50b0NoYXJBcnJheSgpLCAiYXNkZmciLnRvQ2hhckFycmF5KCkpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2UoImFzZGYiLnRvQ2hhckFycmF5KCksICJhc2RmZ2dnZ2dnIi50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnYScsICdhJykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ2EnLCAnQScpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5jaGFyYWN0ZXJzQXJlRXF1YWxJZ25vcmVDYXNlKCdBJywgJ2EnKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnQScsICdBJykpOwotCi0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLmNoYXJhY3RlcnNBcmVFcXVhbElnbm9yZUNhc2UoJ2EnLCAnYicpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuY2hhcmFjdGVyc0FyZUVxdWFsSWdub3JlQ2FzZSgnQScsICdiJykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc1VwcGVyY2FzZSgpIHsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc1VwcGVyY2FzZSgiRk9PIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNVcHBlcmNhc2UoIkZPTzIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc1VwcGVyY2FzZSgiRiBPIE8iKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNVcHBlcmNhc2UoIkZvbyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1VwcGVyY2FzZSgiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzVXBwZXJjYXNlKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2UocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNVcHBlcmNhc2UoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNVcHBlcmNhc2UocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNMb3dlcmNhc2UoKSB7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNMb3dlcmNhc2UoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzTG93ZXJjYXNlKCJmb28yIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNMb3dlcmNhc2UoImYgbyBvIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzTG93ZXJjYXNlKCJGb28iKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNMb3dlcmNhc2UoIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0xvd2VyY2FzZShTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzTG93ZXJjYXNlKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTG93ZXJjYXNlKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2Uocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0IGNhbWVsLWNhc2UgdG8gYWxsLWNhcHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoKSB7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVGVzdFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VEVTVFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VEVTVFRlc3QiKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1RfVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1QiLCAidGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVCIsICJURVNUIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbldyaXRlcigiVEVTVF9URVNUX1RFU1QiLCAidGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uV3JpdGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAiVEVTVCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF9URVNUIiwgInRlc3RURVNUVGVzdCIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0Iik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVmZmVyKFN0cmluZyBleHBlY3RlZCwgU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUIiwgInRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUIiwgIlRFU1QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1QiLCAidGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1RfVEVTVCIsICJ0ZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1RfVEVTVCIsICJUZXN0VEVTVFRlc3QiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT25TdHJpbmdCdWlsZGVyKCJURVNUX1RFU1RfVEVTVF9UIiwgIlRlc3RURVNUVGVzdFQiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc09uU3RyaW5nQnVpbGRlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aCgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIsIDQ0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3QiLCA0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdCIsIDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygiVEVTVCIsIDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURSIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRFU1QiLCAyKSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRlc3QiLCA5KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVMiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoInRlc3RUZXN0IiwgNSkpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJ0ZXN0VGVzdCIsIDQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VGVzdCIsIDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1QiLCBTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzKCJUZXN0VGVzdCIsIDExMDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfIiwgU3RyaW5nVG9vbHMuY29udmVydENhbWVsQ2FzZVRvQWxsQ2FwcygidGVzdFRFU1RUZXN0IiwgMTApKTsKLQkJYXNzZXJ0RXF1YWxzKCJURVNUX1RFU1RfVEVTVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdCIsIDE0KSk7Ci0JCWFzc2VydEVxdWFscygiVEVTVF9URVNUX1RFU1RfVCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiLCAxNikpOwotCQlhc3NlcnRFcXVhbHMoIlRFU1RfVEVTVF9URVNUXyIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHMoIlRlc3RURVNUVGVzdFQiLCAxNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3QiLCA0NCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgInRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFUyIsICJ0ZXN0IiwgMyk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUIiwgIlRFU1QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFIiwgIlRFU1QiLCAyKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJ0ZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVMiLCAidGVzdFRlc3QiLCA4KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVCIsICJ0ZXN0VGVzdCIsIDYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF8iLCAidGVzdFRlc3QiLCA1KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1QiLCAidGVzdFRlc3QiLCA0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVCIsICJUZXN0VGVzdCIsIDkpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPbldyaXRlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgMTEwMCk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uV3JpdGVyKCJURVNUX1RFU1RfIiwgInRlc3RURVNUVGVzdCIsIDEwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUIiwgIlRlc3RURVNUVGVzdCIsIDE0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUX1QiLCAiVGVzdFRFU1RUZXN0VCIsIDE2KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoIlRFU1RfVEVTVF9URVNUXyIsICJUZXN0VEVTVFRlc3RUIiwgMTUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBpbnQgbWF4KSB7Ci0JCVdyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNPbihzdHJpbmcsIG1heCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdCIsIDQ0KTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAidGVzdCIsIDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTIiwgInRlc3QiLCAzKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1QiLCAiVEVTVCIsIDUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEUiLCAiVEVTVCIsIDIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgInRlc3RUZXN0IiwgOSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFUyIsICJ0ZXN0VGVzdCIsIDgpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9UIiwgInRlc3RUZXN0IiwgNik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUXyIsICJ0ZXN0VGVzdCIsIDUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVCIsICJ0ZXN0VGVzdCIsIDQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUIiwgIlRlc3RUZXN0IiwgOSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydENhbWVsQ2FzZVRvQWxsQ2Fwc01heExlbmd0aE9uU3RyaW5nQnVmZmVyKCJURVNUX1RFU1QiLCAiVGVzdFRlc3QiLCAxMTAwKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzTWF4TGVuZ3RoT25TdHJpbmdCdWZmZXIoIlRFU1RfVEVTVF8iLCAidGVzdFRFU1RUZXN0IiwgMTApOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1QiLCAiVGVzdFRFU1RUZXN0IiwgMTQpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfVCIsICJUZXN0VEVTVFRlc3RUIiwgMTYpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcigiVEVTVF9URVNUX1RFU1RfIiwgIlRlc3RURVNUVGVzdFQiLCAxNSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRDYW1lbENhc2VUb0FsbENhcHNNYXhMZW5ndGhPblN0cmluZ0J1ZmZlcihTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZyBzdHJpbmcsIGludCBtYXgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0Q2FtZWxDYXNlVG9BbGxDYXBzT24oc3RyaW5nLCBtYXgsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnQgdW5kZXJzY29yZXMgdG8gYWxsLWNhcHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCkgewotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUXyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX19fXyIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVGVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX19fVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJURVNUX1RFU1RfVEVTVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIlRFU1RfVEVTVF9URVNUIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfX1RFU1RfVEVTVF9URVNUX1QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX19URVNUX1RFU1RfVEVTVF9UIiwgdHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZUxvd2VyY2FzZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF8iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF9fX18iLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdCIsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF9fX3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0IiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3QiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgidGVzdF90ZXN0X3Rlc3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3RUZXN0VGVzdCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJ0ZXN0X3Rlc3RfdGVzdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RUZXN0VGVzdFQiLCBTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgiX190ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoInRlc3RfdGVzdF90ZXN0X3QiLCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiVGVzdFRlc3RUZXN0VCIsIFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKCJfdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUZXN0VGVzdFRlc3RUIiwgU3RyaW5nVG9vbHMuY29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoIl9fdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJURVNUXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgIlRFU1RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3QiLCAiVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAiVGVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJURVNUX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3QiLCAiVEVTVF9fX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0IiwgIlRFU1RfVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX19URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyTG93ZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0IiwgInRlc3RfIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3QiLCAidGVzdF9fX18iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdCIsICJ0ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdCIsICJ0ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0IiwgInRlc3RfdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X19fdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJUZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uV3JpdGVyKCJ0ZXN0VGVzdFRlc3QiLCAidGVzdF90ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJ0ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoInRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigidGVzdFRlc3RUZXN0VCIsICJfX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJ0ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPbldyaXRlcigiVGVzdFRlc3RUZXN0VCIsICJfdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoIlRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25Xcml0ZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uKHN0cmluZywgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyLCB3cml0ZXIpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHdyaXRlci50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJURVNUXyIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgIlRFU1RfX19fIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3QiLCAiVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAiVGVTVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJURVNUX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3QiLCAiVEVTVF9fX1RFU1QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3QiLCAiVEVTVF9URVNUIiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0IiwgIlRFU1RfVEVTVF9URVNUIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdCIsICJURVNUX1RFU1RfVEVTVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiVEVTVF9URVNUX1RFU1RfVCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3RUIiwgIl9URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX19URVNUX1RFU1RfVEVTVF9UIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX1RFU1RfVEVTVF9URVNUX1QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdFRlc3RUIiwgIl9fVEVTVF9URVNUX1RFU1RfVCIsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyTG93ZXJjYXNlKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0IiwgInRlc3RfIiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3QiLCAidGVzdF9fX18iLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdCIsICJ0ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdCIsICJ0ZXN0IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0IiwgInRlc3RfdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdCIsICJ0ZXN0X19fdGVzdCIsIGZhbHNlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJUZXN0VGVzdCIsICJ0ZXN0X3Rlc3QiLCB0cnVlKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VW5kZXJzY29yZXNUb0NhbWVsQ2FzZU9uU3RyaW5nQnVmZmVyKCJ0ZXN0VGVzdFRlc3QiLCAidGVzdF90ZXN0X3Rlc3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0IiwgInRlc3RfdGVzdF90ZXN0IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJ0ZXN0X3Rlc3RfdGVzdF90IiwgZmFsc2UpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoInRlc3RUZXN0VGVzdFQiLCAiX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigidGVzdFRlc3RUZXN0VCIsICJfX3Rlc3RfdGVzdF90ZXN0X3QiLCBmYWxzZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJ0ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFVuZGVyc2NvcmVzVG9DYW1lbENhc2VPblN0cmluZ0J1ZmZlcigiVGVzdFRlc3RUZXN0VCIsICJfdGVzdF90ZXN0X3Rlc3RfdCIsIHRydWUpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoIlRlc3RUZXN0VGVzdFQiLCAiX190ZXN0X3Rlc3RfdGVzdF90IiwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT25TdHJpbmdCdWZmZXIoU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgc3RyaW5nLCBib29sZWFuIGNhcGl0YWxpemVGaXJzdExldHRlcikgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlT24oc3RyaW5nLCBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGRlbGltaXRpbmcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzUXVvdGVkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNRdW90ZWQoIlwiZm9vXCIiKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNRdW90ZWQoIlwiXCIiKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc1F1b3RlZCgiXCIiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNRdW90ZWQoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUXVvdGVkKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc1F1b3RlZChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1F1b3RlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzUXVvdGVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzUGFyZW50aGV0aWNhbCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc1BhcmVudGhldGljYWwoIihmb28pIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc1BhcmVudGhldGljYWwoIigpIik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNQYXJlbnRoZXRpY2FsKCIoIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzUGFyZW50aGV0aWNhbCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNQYXJlbnRoZXRpY2FsKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNQYXJlbnRoZXRpY2FsKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc1BhcmVudGhldGljYWwocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc1BhcmVudGhldGljYWwoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNQYXJlbnRoZXRpY2FsKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNQYXJlbnRoZXRpY2FsKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0JyYWNrZXRlZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoImZvbyIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQnJhY2tldGVkKCJbZm9vXSIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2tldGVkKCIiKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0JyYWNrZXRlZCgiW10iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiWyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiICIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNrZXRlZCgiJyciKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFja2V0ZWQoIidmb28nIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzQnJhY2tldGVkKFN0cmluZyBzKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQocykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNCcmFja2V0ZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQocykpOwotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNrZXRlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nSXNCcmFjZWQoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0JyYWNlZCgie2Zvb30iKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0JyYWNlZCgiIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNCcmFjZWQoInt9Iik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoInsiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoIiAiKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNCcmFjZWQoIicnIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQnJhY2VkKCInZm9vJyIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0JyYWNlZChTdHJpbmcgcykgewotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2VkKHMpKTsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0JyYWNlZChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVueVN0cmluZ0lzQnJhY2VkKFN0cmluZyBzKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2VkKHMpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFjZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0cmluZ0lzQ2hldnJvbmVkKCkgewotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNDaGV2cm9uZWQoIjxmb28+Iik7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNDaGV2cm9uZWQoIiIpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzQ2hldnJvbmVkKCI8PiIpOwotCi0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCJ7Iik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCIgIik7Ci0JCXRoaXMuZGVueVN0cmluZ0lzQ2hldnJvbmVkKCInJyIpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0NoZXZyb25lZCgiJ2ZvbyciKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U3RyaW5nSXNDaGV2cm9uZWQoU3RyaW5nIHMpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0NoZXZyb25lZChzKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNDaGV2cm9uZWQocy50b0NoYXJBcnJheSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0NoZXZyb25lZChTdHJpbmcgcykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0NoZXZyb25lZChzKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzQ2hldnJvbmVkKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0RlbGltaXRlZCgpIHsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoImZvbyIsICc/Jyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoIj9mb28/IiwgJz8nKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZCgiIiwgJz8nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZCgiXCJcIiIsICciJyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQoIj94eD8iLCAnPycpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZCgiP3h4XSIsICc/Jyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIlwiIiwgJyInKTsKLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQoIiAiLCAnICcpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZCgiJyciLCAnIicpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZCgiJ2ZvbyciLCAnPycpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTdHJpbmdJc0RlbGltaXRlZChTdHJpbmcgcywgY2hhciBjKSB7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocywgYykpOwotCQlhc3NlcnRUcnVlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgYykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZW55U3RyaW5nSXNEZWxpbWl0ZWQoU3RyaW5nIHMsIGNoYXIgYykgewotCQlhc3NlcnRGYWxzZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLCBjKSk7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMudG9DaGFyQXJyYXkoKSwgYykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdHJpbmdJc0RlbGltaXRlZDIoKSB7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiZm9vIiwgJ1snLCAnXScpOwotCQl0aGlzLnZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkMigie2Zvb30iLCAneycsICd9Jyk7Ci0KLQkJdGhpcy5kZW55U3RyaW5nSXNEZWxpbWl0ZWQyKCIiLCAnWycsICddJyk7Ci0JCXRoaXMudmVyaWZ5U3RyaW5nSXNEZWxpbWl0ZWQyKCJbXSIsICdbJywgJ10nKTsKLQkJdGhpcy52ZXJpZnlTdHJpbmdJc0RlbGltaXRlZDIoIlt4eF0iLCAnWycsICddJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiP3h4XSIsICdbJywgJ10nKTsKLQotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIlwiIiwgJ1snLCAnXScpOwotCQl0aGlzLmRlbnlTdHJpbmdJc0RlbGltaXRlZDIoIiAiLCAnWycsICddJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiJyciLCAnWycsICddJyk7Ci0JCXRoaXMuZGVueVN0cmluZ0lzRGVsaW1pdGVkMigiJ2ZvbyciLCAnWycsICddJyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN0cmluZ0lzRGVsaW1pdGVkMihTdHJpbmcgcywgY2hhciBzdGFydCwgY2hhciBlbmQpIHsKLQkJYXNzZXJ0VHJ1ZShTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChzLCBzdGFydCwgZW5kKSk7Ci0JCWFzc2VydFRydWUoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocy50b0NoYXJBcnJheSgpLCBzdGFydCwgZW5kKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlTdHJpbmdJc0RlbGltaXRlZDIoU3RyaW5nIHMsIGNoYXIgc3RhcnQsIGNoYXIgZW5kKSB7Ci0JCWFzc2VydEZhbHNlKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRGVsaW1pdGVkKHMsIHN0YXJ0LCBlbmQpKTsKLQkJYXNzZXJ0RmFsc2UoU3RyaW5nVG9vbHMuc3RyaW5nSXNEZWxpbWl0ZWQocy50b0NoYXJBcnJheSgpLCBzdGFydCwgZW5kKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB1bmRlbGltaXRpbmcgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdCgpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiZm9vXCIiLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcImZvXCJcIm9cIiIsICJmb1wibyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb29cIlwiXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJbZm9vXSIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXQoIlwiXCJcIiIsICJcIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdCgiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0KCJcImZvb1wiXCIiLCAiZm9vXCIiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0KFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBTdHJpbmdUb29scy51bmRlbGltaXQocykpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuZGVsaW1pdChzLnRvQ2hhckFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0SW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdEludCgiXCJmb29cIiIsIDIsICJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0SW50KCJcIlwiZm9vXCJcIiIsIDIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRJbnQoIidmb28nIiwgMiwgIm8iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0SW50KFN0cmluZyBzLCBpbnQgY291bnQsIFN0cmluZyBleHBlY3RlZCkgewotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuZGVsaW1pdChzLCBjb3VudCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLnVuZGVsaW1pdChzLnRvQ2hhckFycmF5KCksIGNvdW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdEludEV4Y2VwdGlvbigpIHsKLQkJdGhpcy5kZW55VW5kZWxpbWl0SW50KCJcIlwiIiwgMik7Ci0JCXRoaXMuZGVueVVuZGVsaW1pdEludCgiJ28nIiwgMik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbnlVbmRlbGltaXRJbnQoU3RyaW5nIHMsIGludCBjb3VudCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgYm9ndXMgPSBTdHJpbmdUb29scy51bmRlbGltaXQocywgY291bnQpOwotCQkJZmFpbCgiaW52YWxpZCBzdHJpbmc6ICIgKyBib2d1cyk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQljaGFyW10gYm9ndXMgPSBTdHJpbmdUb29scy51bmRlbGltaXQocy50b0NoYXJBcnJheSgpLCBjb3VudCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogIiArIG5ldyBTdHJpbmcoYm9ndXMpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uV3JpdGVyKCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcImZvb1wiIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcIlwiIiwgIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCInZm9vJyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb1wiXCJvXCIiLCAiZm9cIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cIlwiXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJcIlwiZm9vXCIiLCAiXCJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiW2Zvb10iLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXIoIlwiXCJcIiIsICJcIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKCJcImZvb1wiYmFyXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPbldyaXRlcigiXCJmb29cIlwiIiwgImZvb1wiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uV3JpdGVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0KLQkJd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigpIHsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJmb29cIiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJcIiIsICIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiJ2ZvbyciLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9cIlwib1wiIiwgImZvXCJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCJcIlwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiXCJcImZvb1wiIiwgIlwiZm9vIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIltmb29dIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyKCJcIlwiXCIiLCAiXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcigiXCJmb29cImJhclwiIiwgImZvb1wiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXIoIlwiZm9vXCJcIiIsICJmb29cIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1ZmZlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJmb29cIiIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiXCIiLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCInZm9vJyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiZm9cIlwib1wiIiwgImZvXCJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvb1wiXCJcIiIsICJmb29cIiIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJcIlwiZm9vXCIiLCAiXCJmb28iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIltmb29dIiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlcigiXCJcIlwiIiwgIlwiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyKCJcImZvb1wiYmFyXCIiLCAiZm9vXCIiKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoIlwiZm9vXCJcIiIsICJmb29cIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uV3JpdGVyQ291bnQoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXJDb3VudCgiXCJmb29cIiIsIDIsICJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXJDb3VudCgiXCJcIlwiXCIiLCAyLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXJDb3VudCgiWFhmb29YWCIsIDIsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25Xcml0ZXJDb3VudChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgY291bnQsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocy50b0NoYXJBcnJheSgpLCBjb3VudCwgd3JpdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB3cml0ZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uU3RyaW5nQnVmZmVyQ291bnQoKSB7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXJDb3VudCgiXCJmb29cIiIsIDIsICJvIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXJDb3VudCgiXCJcIlwiXCIiLCAyLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXJDb3VudCgiWFhmb29YWCIsIDIsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWZmZXJDb3VudChTdHJpbmcgcywgaW50IGNvdW50LCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLCBjb3VudCwgc2IpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNiLnRvU3RyaW5nKCkpOwotCi0JCXNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy51bmRlbGltaXRPbihzLnRvQ2hhckFycmF5KCksIGNvdW50LCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlckNvdW50KCkgewotCQl0aGlzLnZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlckNvdW50KCJcImZvb1wiIiwgMiwgIm8iKTsKLQkJdGhpcy52ZXJpZnlVbmRlbGltaXRPblN0cmluZ0J1aWxkZXJDb3VudCgiXCJcIlwiXCIiLCAyLCAiIik7Ci0JCXRoaXMudmVyaWZ5VW5kZWxpbWl0T25TdHJpbmdCdWlsZGVyQ291bnQoIlhYZm9vWFgiLCAyLCAiZm9vIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVVuZGVsaW1pdE9uU3RyaW5nQnVpbGRlckNvdW50KFN0cmluZyBzLCBpbnQgY291bnQsIFN0cmluZyBleHBlY3RlZCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJU3RyaW5nVG9vbHMudW5kZWxpbWl0T24ocywgY291bnQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLnVuZGVsaW1pdE9uKHMudG9DaGFyQXJyYXkoKSwgY291bnQsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRpbmcgdG8gSmF2YSBzdHJpbmcgbGl0ZXJhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoIlwiXCIiLCAiXCJcXFwiXFxcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoIidmb28nIiwgIlwiJ2ZvbydcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJmb29cYmJhciIsICJcImZvb1xcYmJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoImZvb1xuXHRiYXIiLCAiXCJmb29cXG5cXHRiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJmb29cImJhciIsICJcImZvb1xcXCJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCJmb29cXGJhciIsICJcImZvb1xcXFxiYXJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwocykpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKHMudG9DaGFyQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCkgewotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWZmZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiXCJcIiIsICJcIlxcXCJcXFwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCInZm9vJyIsICJcIidmb28nXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJmb29cYmJhciIsICJcImZvb1xcYmJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXG5cdGJhciIsICJcImZvb1xcblxcdGJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1ZmZlcigiZm9vXCJiYXIiLCAiXCJmb29cXFwiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKCJmb29cXGJhciIsICJcImZvb1xcXFxiYXJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVmZmVyKFN0cmluZyBzLCBTdHJpbmcgZXhwZWN0ZWQpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLnRvQ2hhckFycmF5KCksIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoIiIsICJcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoIlwiXCIiLCAiXCJcXFwiXFxcIlwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoIidmb28nIiwgIlwiJ2ZvbydcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJmb29cYmJhciIsICJcImZvb1xcYmJhclwiIik7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPblN0cmluZ0J1aWxkZXIoImZvb1xuXHRiYXIiLCAiXCJmb29cXG5cXHRiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJmb29cImJhciIsICJcImZvb1xcXCJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25TdHJpbmdCdWlsZGVyKCJmb29cXGJhciIsICJcImZvb1xcXFxiYXJcIiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uU3RyaW5nQnVpbGRlcihTdHJpbmcgcywgU3RyaW5nIGV4cGVjdGVkKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMsIHNiKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzYi50b1N0cmluZygpKTsKLQotCQlzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCVN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT24ocy50b0NoYXJBcnJheSgpLCBzYik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoKSB7Ci0JCXRoaXMudmVyaWZ5Q29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbldyaXRlcigiIiwgIlwiXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJcIlwiIiwgIlwiXFxcIlxcXCJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoIidmb28nIiwgIlwiJ2ZvbydcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoImZvb1xiYmFyIiwgIlwiZm9vXFxiYmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cblx0YmFyIiwgIlwiZm9vXFxuXFx0YmFyXCIiKTsKLQkJdGhpcy52ZXJpZnlDb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uV3JpdGVyKCJmb29cImJhciIsICJcImZvb1xcXCJiYXJcIiIpOwotCQl0aGlzLnZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoImZvb1xcYmFyIiwgIlwiZm9vXFxcXGJhclwiIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsT25Xcml0ZXIoU3RyaW5nIHMsIFN0cmluZyBleHBlY3RlZCkgewotCQlXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbE9uKHMsIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCi0JCXdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxPbihzLnRvQ2hhckFycmF5KCksIHdyaXRlcik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgd3JpdGVyLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEJvb2xlYW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWYzMWY4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkQm9vbGVhblRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlwcml2YXRlIHZvbGF0aWxlIFN5bmNocm9uaXplZEJvb2xlYW4gc2I7Ci0Jdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0Jdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0Jdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkQm9vbGVhblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc2IgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbigpOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pcyhmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNOb3QodHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc1RydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGbGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5mbGlwKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmZsaXAoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhbHNlQW5kVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmFuZCh0cnVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRydWVBbmRUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5hbmQodHJ1ZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhbHNlQW5kRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5hbmQoZmFsc2UpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ1ZUFuZEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuYW5kKGZhbHNlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhbHNlT3JUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5vcih0cnVlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ1ZU9yVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2Iub3IodHJ1ZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhbHNlT3JGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLm9yKGZhbHNlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRydWVPckZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5vcihmYWxzZSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhbHNlWG9yVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2IueG9yKHRydWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcnVlWG9yVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNiLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLnhvcih0cnVlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhbHNlWG9yRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi54b3IoZmFsc2UpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJ1ZVhvckZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi54b3IoZmFsc2UpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb3RUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0Tm90KHRydWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzVHJ1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5vdEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0Tm90KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuaXNUcnVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmlzRmFsc2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0RmFsc2UoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc0ZhbHNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2Iuc2V0VHJ1ZSgpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5pc1RydWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuaXNGYWxzZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0RmFsc2VTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5jb21taXQoZmFsc2UsIGZhbHNlKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbW1pdFRydWVTdWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zYi5jb21taXQoZmFsc2UsIHRydWUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb21taXRGYWxzZUZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5jb21taXQodHJ1ZSwgZmFsc2UpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tbWl0VHJ1ZUZhaWx1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5jb21taXQodHJ1ZSwgdHJ1ZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwU2FtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLnN3YXAodGhpcy5zYikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTd2FwU2FtZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gc2IyID0gbmV3IFN5bmNocm9uaXplZEJvb2xlYW4oKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zYi5zd2FwKHNiMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShzYjIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN3YXBEaWZmZXJlbnRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTeW5jaHJvbml6ZWRCb29sZWFuIHNiMiA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKHRydWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2Iuc3dhcChzYjIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNiLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShzYjIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE11dGV4VGhpcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRTYW1lKHRoaXMuc2IsIHRoaXMuc2IuZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE11dGV4T2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtdXRleCA9IG5ldyBPYmplY3QoKTsKLQkJU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKG11dGV4KTsKLQkJYXNzZXJ0U2FtZShtdXRleCwgc3luY0Jvb2wuZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byB0cnVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxUcnVlKDApOyAgLy8gMCA9IGluZGVmaW5pdGUgd2FpdAotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byB0cnVlIGJ5IHQyCi0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byB0cnVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFRydWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsVHJ1ZShUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byB0cnVlIGJ5IHQxCi0JCWFzc2VydFRydWUodGhpcy5zYi5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsVHJ1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFRydWVDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIGZhbHNlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldEZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoMCk7ICAvLyAwID0gaW5kZWZpbml0ZSB3YWl0Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGZhbHNlIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPiBUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHRpbWUgb3V0IHdhaXRpbmcgZm9yIHQxIHRvIHNldCB0aGUgdmFsdWUgdG8gZmFsc2UKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0RmFsc2VUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0RmFsc2UoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gdHJ1ZSBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2IuZ2V0VmFsdWUoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1NldEZhbHNlKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRUb1NldEZhbHNlQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmVhZHMoQ29tbWFuZCB0MUNvbW1hbmQsIENvbW1hbmQgdDJDb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zYi5zZXRGYWxzZSgpOwotCQlSdW5uYWJsZSByMSA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MUNvbW1hbmQsIHRoaXMuc2IsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQyQ29tbWFuZCwgdGhpcy5zYiwgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkU2V0VHJ1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkQm9vbGVhbiBzeW5jQm9vbCkgewotCQkJCXN5bmNCb29sLnNldFRydWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxUcnVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRCb29sZWFuIHN5bmNCb29sKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEJvb2xlYW5UZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc3luY0Jvb2wud2FpdFVudGlsVHJ1ZSh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRCb29sZWFuVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvU2V0RmFsc2VDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gICEgc3luY0Jvb2wud2FpdFRvU2V0RmFsc2UodGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkQm9vbGVhblRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wsIGZpbmFsIGxvbmcgZGVsYXkpIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJ1bl8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCWlmIChkZWxheSAhPSAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChkZWxheSk7Ci0JCQkJfQotCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jQm9vbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEJvb2xlYW4gc3luY0Jvb2wpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRJbnRUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEludFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZGY5NTUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZEludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkSW50OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRJbnRUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRJbnQgc2k7Ci0Jdm9sYXRpbGUgYm9vbGVhbiB0aW1lb3V0T2NjdXJyZWQ7Ci0Jdm9sYXRpbGUgaW50IHZhbHVlID0gNzsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0Jdm9sYXRpbGUgaW50IHNJbnRWYWx1ZTsKLQotCi0JcHVibGljIFN5bmNocm9uaXplZEludFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc2kgPSBuZXcgU3luY2hyb25pemVkSW50KCk7Ci0JCXRoaXMudGltZW91dE9jY3VycmVkID0gZmFsc2U7Ci0JCXRoaXMuc3RhcnRUaW1lID0gMDsKLQkJdGhpcy5lbmRUaW1lID0gMDsKLQkJdGhpcy5zSW50VmFsdWUgPSAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzSW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5lcXVhbHMoMCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuZXF1YWxzKDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RXF1YWxJbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLm5vdEVxdWFsKDcpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLm5vdEVxdWFsKDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc1plcm8oKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc05vdFplcm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc05vdFplcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzR3JlYXRlclRoYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW4oLTEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDcpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuKDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNHcmVhdGVyVGhhbk9yRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoMSkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNHcmVhdGVyVGhhbk9yRXF1YWwoLTEpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzR3JlYXRlclRoYW5PckVxdWFsKDcpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0dyZWF0ZXJUaGFuT3JFcXVhbCg4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTGVzc1RoYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbigwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuKDEpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuKC0xKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNMZXNzVGhhbig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuKDgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNMZXNzVGhhbk9yRXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCgtMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoMCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNMZXNzVGhhbk9yRXF1YWwoMSkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTGVzc1RoYW5PckVxdWFsKC0xKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCg3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5zaS5pc0xlc3NUaGFuT3JFcXVhbCg4KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc1Bvc2l0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtMyk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNQb3NpdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3RQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RQb3NpdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05vdFBvc2l0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC0zKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90UG9zaXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc05lZ2F0aXZlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTmVnYXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLTMpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOZWdhdGl2ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNOb3ROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3ROZWdhdGl2ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90TmVnYXRpdmUoKSk7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoLTMpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTm90TmVnYXRpdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzWmVybygpKTsKLQotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNpLmlzTm90WmVybygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zaS5pc1plcm8oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFicygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5hYnMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKHRoaXMudmFsdWUpOwotCQlhc3NlcnRFcXVhbHModGhpcy52YWx1ZSwgdGhpcy5zaS5hYnMoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQl0aGlzLnNpLnNldFZhbHVlKC10aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudmFsdWUsIHRoaXMuc2kuYWJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kubmVnKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJYXNzZXJ0RXF1YWxzKC10aGlzLnZhbHVlLCB0aGlzLnNpLm5lZygpKTsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgtdGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNpLm5lZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0WmVybygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNpLnNldFplcm8oKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2kuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNdXRleFRoaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0U2FtZSh0aGlzLnNpLCB0aGlzLnNpLmdldE11dGV4KCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gMAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VW50aWxaZXJvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsWmVybygwKTsgIC8vIDAgPSBpbmRlZmluaXRlIHdhaXQKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHNob3VsZCBiZSBzZXQgdG8gMCBieSB0MgotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byAwCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbFplcm9UaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsWmVybyhUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byAwIGJ5IHQxCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNpLmdldFZhbHVlKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VW50aWxaZXJvKGxvbmcgdDJUaW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVGhyZWFkcyh0aGlzLmJ1aWxkU2V0WmVyb0NvbW1hbmQoKSwgdGhpcy5idWlsZFdhaXRVbnRpbFplcm9Db21tYW5kKHQyVGltZW91dCkpOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgd2FpdCBpbmRlZmluaXRlbHkgdW50aWwgdDEgc2V0cyB0aGUgdmFsdWUgdG8gMDsKLQkgKiB0aGVuIHQyIHdpbGwgc2V0IHRoZSB2YWx1ZSB0byA3Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMCk7ICAvLyAwID0gaW5kZWZpbml0ZSB3YWl0Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGFuIG9iamVjdCBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNOb3RaZXJvKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+ICIgKyBUSUNLICsgIik6ICIgKyB0aW1lLCB0aW1lID4gVElDSyk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIDAKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gemVybyBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc2kuaXNaZXJvKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRWYWx1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldFplcm9Db21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IHVudGlsIHQxIGlzIGZpbmlzaGVkICJpbml0aWFsaXppbmciIHRoZSB2YWx1ZTsKLQkgKiB0aGVuIHQyIHdpbGwgZ2V0IHRoZSBuZXdseS1pbml0aWFsaXplZCB2YWx1ZSAoNDIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zaS5zZXRWYWx1ZSgwKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zaSwgMCk7Ci0JCS8vIGdpdmUgdDEgYSBoZWFkIHN0YXJ0Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRHZXRWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zaSwgVElDSyk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JCWFzc2VydEVxdWFscyg0MiwgdGhpcy5zaS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQyLCB0aGlzLnNJbnRWYWx1ZSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJbG9uZyB0aW1lID0gdGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpOwotCQlhc3NlcnRUcnVlKCJ0MiBmaW5pc2hlZCBhIGJpdCBlYXJseSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlID4gIiArIFRXT19USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA+IFRXT19USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVUaHJlYWRzKENvbW1hbmQgdDFDb21tYW5kLCBDb21tYW5kIHQyQ29tbWFuZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2kuc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHQxQ29tbWFuZCwgdGhpcy5zaSwgVFdPX1RJQ0tTKTsKLQkJUnVubmFibGUgcjIgPSB0aGlzLmJ1aWxkUnVubmFibGUodDJDb21tYW5kLCB0aGlzLnNpLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRTZXRaZXJvQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgewotCQkJCXNJbnQuc2V0WmVybygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFdhaXRVbnRpbFplcm9Db21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHNJbnQud2FpdFVudGlsWmVybyh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkSW50VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc0ludC53YWl0VG9TZXRWYWx1ZShTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnZhbHVlLCB0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRJbml0aWFsaXplVmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKGZpbmFsIFN5bmNocm9uaXplZEludCBzSW50KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCXNJbnQuZXhlY3V0ZSgKLQkJCQkJbmV3IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kKCkgewotCQkJCQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCQkJCQkvLyBwcmV0ZW5kIHRvIHBlcmZvcm0gc29tZSBsb25nIGluaXRpYWxpemF0aW9uIHByb2Nlc3MKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKLQkJCQkJCQl9Ci0JCQkJCQkJc0ludC5zZXRWYWx1ZSg0Mik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEdldFZhbHVlQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRJbnQgc0ludCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRJbnRUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuc0ludFZhbHVlID0gc0ludC5nZXRWYWx1ZSgpOwotCQkJCVN5bmNocm9uaXplZEludFRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZShmaW5hbCBDb21tYW5kIGNvbW1hbmQsIGZpbmFsIFN5bmNocm9uaXplZEludCBzSW50LCBmaW5hbCBsb25nIHNsZWVwKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlpZiAoc2xlZXAgIT0gMCkgewotCQkJCQlUaHJlYWQuc2xlZXAoc2xlZXApOwotCQkJCX0KLQkJCQljb21tYW5kLmV4ZWN1dGUoc0ludCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkSW50IHNJbnQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRPYmplY3RUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmZmU5OTYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZE9iamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3luY2hyb25pemVkT2JqZWN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRPYmplY3RUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzbzsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBPYmplY3QgdmFsdWUgPSBuZXcgT2JqZWN0KCk7Ci0Jdm9sYXRpbGUgbG9uZyBzdGFydFRpbWU7Ci0Jdm9sYXRpbGUgbG9uZyBlbmRUaW1lOwotCXZvbGF0aWxlIE9iamVjdCBzb1ZhbHVlOwotCi0KLQlwdWJsaWMgU3luY2hyb25pemVkT2JqZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zbyA9IG5ldyBTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PigpOwotCQl0aGlzLnRpbWVvdXRPY2N1cnJlZCA9IGZhbHNlOwotCQl0aGlzLnN0YXJ0VGltZSA9IDA7Ci0JCXRoaXMuZW5kVGltZSA9IDA7Ci0JCXRoaXMuc29WYWx1ZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNvLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCi0JCXRoaXMuc28uc2V0VmFsdWUodGhpcy52YWx1ZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnZhbHVlLCB0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQl0aGlzLnNvLnNldE51bGwoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNvLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNvLmlzTm90TnVsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNvLmlzTnVsbCgpKTsKLQotCQlhc3NlcnRTYW1lKHRoaXMuc28sIHRoaXMuc28uZ2V0TXV0ZXgoKSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IGluZGVmaW5pdGVseSB1bnRpbCB0MSBzZXRzIHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VW50aWxOdWxsKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgc2hvdWxkIGJlIHNldCB0byBudWxsIGJ5IHQyCi0JCWFzc2VydE51bGwodGhpcy5zby5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVElDSyArICIpOiAiICsgdGltZSwgdGltZSA+IFRJQ0spOwotCX0KLQotCS8qKgotCSAqIHQyIHdpbGwgdGltZSBvdXQgd2FpdGluZyBmb3IgdDEgdG8gc2V0IHRoZSB2YWx1ZSB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRVbnRpbE51bGxUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFVudGlsTnVsbChUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgdmFsdWUgd2lsbCBldmVudHVhbGx5IGJlIHNldCB0byBudWxsIGJ5IHQxCi0JCWFzc2VydE51bGwodGhpcy5zby5nZXRWYWx1ZSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGxhdGUgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA8ICIgKyBUSFJFRV9USUNLUyArICIpOiAiICsgdGltZSwgdGltZSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFVudGlsTnVsbChsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldE51bGxDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VW50aWxOdWxsQ29tbWFuZCh0MlRpbWVvdXQpKTsKLQl9Ci0KLQkvKioKLQkgKiB0MiB3aWxsIHdhaXQgaW5kZWZpbml0ZWx5IHVudGlsIHQxIHNldHMgdGhlIHZhbHVlIHRvIG51bGw7Ci0JICogdGhlbiB0MiB3aWxsIHNldCB0aGUgdmFsdWUgdG8gYW4gb2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1NldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIGFuIG9iamVjdCBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOb3ROdWxsKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgZWFybHkgKGV4cGVjdGVkIHZhbHVlIHNob3VsZCBiZSA+ICIgKyBUSUNLICsgIik6ICIgKyB0aW1lLCB0aW1lID4gVElDSyk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB0aW1lIG91dCB3YWl0aW5nIGZvciB0MSB0byBzZXQgdGhlIHZhbHVlIHRvIG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvU2V0VmFsdWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvU2V0VmFsdWUoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHZhbHVlIHdpbGwgZXZlbnR1YWxseSBiZSBzZXQgdG8gbnVsbCBieSB0MQotCQlhc3NlcnRUcnVlKHRoaXMuc28uaXNOdWxsKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWxvbmcgdGltZSA9IHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKTsKLQkJYXNzZXJ0VHJ1ZSgidDIgZmluaXNoZWQgYSBiaXQgbGF0ZSAoZXhwZWN0ZWQgdmFsdWUgc2hvdWxkIGJlIDwgIiArIFRIUkVFX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9TZXRWYWx1ZShsb25nIHQyVGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVRocmVhZHModGhpcy5idWlsZFNldE51bGxDb21tYW5kKCksIHRoaXMuYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQodDJUaW1lb3V0KSk7Ci0JfQotCi0JLyoqCi0JICogdDIgd2lsbCB3YWl0IHVudGlsIHQxIGlzIGZpbmlzaGVkICJpbml0aWFsaXppbmciIHRoZSB2YWx1ZTsKLQkgKiB0aGVuIHQyIHdpbGwgZ2V0IHRoZSBuZXdseS1pbml0aWFsaXplZCB2YWx1ZSAoImZvbyIpCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZShudWxsKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSwgdGhpcy5zbywgMCk7Ci0JCS8vIGdpdmUgdDEgYSBoZWFkIHN0YXJ0IG9mIDEwMCBtcwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkR2V0VmFsdWVDb21tYW5kKCksIHRoaXMuc28sIFRJQ0spOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc28uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zb1ZhbHVlKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlsb25nIHRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCk7Ci0JCWFzc2VydFRydWUoInQyIGZpbmlzaGVkIGEgYml0IGVhcmx5IChleHBlY3RlZCB2YWx1ZSBzaG91bGQgYmUgPiAiICsgVFdPX1RJQ0tTICsgIik6ICIgKyB0aW1lLCB0aW1lID4gVFdPX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlY3V0ZVRocmVhZHMoQ29tbWFuZCB0MUNvbW1hbmQsIENvbW1hbmQgdDJDb21tYW5kKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zby5zZXRWYWx1ZSh0aGlzLnZhbHVlKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodDFDb21tYW5kLCB0aGlzLnNvLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0MkNvbW1hbmQsIHRoaXMuc28sIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFNldE51bGxDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHsKLQkJCQlzT2JqZWN0LnNldE51bGwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VW50aWxOdWxsQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRPYmplY3Q8T2JqZWN0PiBzT2JqZWN0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy50aW1lb3V0T2NjdXJyZWQgPSAhIHNPYmplY3Qud2FpdFVudGlsTnVsbCh0aW1lb3V0KTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9TZXRWYWx1ZUNvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gISBzT2JqZWN0LndhaXRUb1NldFZhbHVlKFN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMudmFsdWUsIHRpbWVvdXQpOwotCQkJCVN5bmNocm9uaXplZE9iamVjdFRlc3RzLnRoaXMuZW5kVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEluaXRpYWxpemVWYWx1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlzT2JqZWN0LmV4ZWN1dGUoCi0JCQkJCW5ldyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZCgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQkJCQkJLy8gcHJldGVuZCB0byBwZXJmb3JtIHNvbWUgbG9uZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQkJCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJCQkJCX0KLQkJCQkJCQlzT2JqZWN0LnNldFZhbHVlKCJmb28iKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkR2V0VmFsdWVDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNPYmplY3QpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRPYmplY3RUZXN0cy50aGlzLnNvVmFsdWUgPSBzT2JqZWN0LmdldFZhbHVlKCk7Ci0JCQkJU3luY2hyb25pemVkT2JqZWN0VGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkT2JqZWN0PE9iamVjdD4gc09iamVjdCwgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9Ci0JCQkJY29tbWFuZC5leGVjdXRlKHNPYmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZE9iamVjdDxPYmplY3Q+IHNvKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFF1ZXVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJkNzY4Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvU3luY2hyb25pemVkUXVldWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVF1ZXVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRRdWV1ZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkUXVldWVUZXN0cyBleHRlbmRzIFNpbXBsZVF1ZXVlVGVzdHMgewotCXByaXZhdGUgdm9sYXRpbGUgU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzcTsKLQl2b2xhdGlsZSBib29sZWFuIHRpbWVvdXRPY2N1cnJlZDsKLQl2b2xhdGlsZSBsb25nIHN0YXJ0VGltZTsKLQl2b2xhdGlsZSBsb25nIGVuZFRpbWU7Ci0Jdm9sYXRpbGUgT2JqZWN0IGRlcXVldWVkT2JqZWN0OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzEgPSBuZXcgU3RyaW5nKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzIgPSBuZXcgU3RyaW5nKCk7Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkUXVldWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlRdWV1ZTxTdHJpbmc+IGJ1aWxkUXVldWUoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkUXVldWU8U3RyaW5nPigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJLy8gc3luY2hyb25pemVkIHF1ZXVlIGlzIG5vdCBjbG9uZWFibGUKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNxID0gbmV3IFN5bmNocm9uaXplZFF1ZXVlPFN0cmluZz4oKTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLmRlcXVldWVkT2JqZWN0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0ZXN0IGZpcnN0IHdpdGggYW4gdW5zeW5jaHJvbml6ZWQgcXVldWUsCi0JICogdGhlbiB3aXRoIGEgc3luY2hyb25pemVkIHF1ZXVlCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U2ltcGxlUXVldWU8U3RyaW5nPigpLCAiZmlyc3QiKTsKLQkJdGhpcy52ZXJpZnlDb25jdXJyZW50QWNjZXNzKG5ldyBTbG93U3luY2hyb25pemVkUXVldWU8U3RyaW5nPigpLCAic2Vjb25kIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MoU2xvd1F1ZXVlPFN0cmluZz4gc2xvd1F1ZXVlLCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24gewotCQlzbG93UXVldWUuZW5xdWV1ZSgiZmlyc3QiKTsKLQkJc2xvd1F1ZXVlLmVucXVldWUoInNlY29uZCIpOwotCi0JCVRocmVhZCB0aHJlYWQgPSB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRSdW5uYWJsZShzbG93UXVldWUpKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JCVRocmVhZC5zbGVlcChUV09fVElDS1MpOwotCi0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgc2xvd1F1ZXVlLmRlcXVldWUoKSk7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCWFzc2VydFRydWUoc2xvd1F1ZXVlLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFNsb3dRdWV1ZTxTdHJpbmc+IHNsb3dRdWV1ZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNsb3dRdWV1ZS5zbG93RGVxdWV1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgU2xvd1F1ZXVlPEU+IGV4dGVuZHMgUXVldWU8RT4gewotCQlPYmplY3Qgc2xvd0RlcXVldWUoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNsb3dTaW1wbGVRdWV1ZTxFPiBleHRlbmRzIFNpbXBsZVF1ZXVlPEU+IGltcGxlbWVudHMgU2xvd1F1ZXVlPEU+IHsKLQkJU2xvd1NpbXBsZVF1ZXVlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0IHNsb3dEZXF1ZXVlKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlKCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgY2xhc3MgU2xvd1N5bmNocm9uaXplZFF1ZXVlPEU+IGV4dGVuZHMgU3luY2hyb25pemVkUXVldWU8RT4gaW1wbGVtZW50cyBTbG93UXVldWU8RT4gewotCQlTbG93U3luY2hyb25pemVkUXVldWUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IHNsb3dEZXF1ZXVlKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5kZXF1ZXVlKCk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiB3YWl0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvRGVxdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb0RlcXVldWUoMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIGFuIGl0ZW0gc2hvdWxkIGhhdmUgYmVlbiBkZXF1ZXVlZCBieSB0Mi4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgc2hvdWxkIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUodGhpcy5zcS5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpID4gVElDSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb0RlcXVldWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRGVxdWV1ZShUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgd2FzIG5ldmVyIGRlcXVldWVkLi4uCi0JCWFzc2VydE51bGwodGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCBpdCBzdGlsbCBob2xkcyB0aGUgaXRlbQotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5zcS5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9EZXF1ZXVlKGxvbmcgdGltZW91dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRFbnF1ZXVlQ29tbWFuZCgpLCB0aGlzLnNxLCBUV09fVElDS1MpOwotCQlSdW5uYWJsZSByMiA9IHRoaXMuYnVpbGRSdW5uYWJsZSh0aGlzLmJ1aWxkV2FpdFRvRGVxdWV1ZUNvbW1hbmQodGltZW91dCksIHRoaXMuc3EsIDApOwotCQlUaHJlYWQgdDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHIxKTsKLQkJVGhyZWFkIHQyID0gdGhpcy5idWlsZFRocmVhZChyMik7Ci0JCXQxLnN0YXJ0KCk7Ci0JCXQyLnN0YXJ0KCk7Ci0JCXQxLmpvaW4oKTsKLQkJdDIuam9pbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9FbnF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRW5xdWV1ZSgwKTsKLQkJLy8gbm8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0RmFsc2UodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHF1ZXVlIGdldHMgZGVxdWV1ZWQgYnkgdDEuLi4KLQkJYXNzZXJ0U2FtZShJVEVNXzEsIHRoaXMuZGVxdWV1ZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBpcyBlbnF1ZXVlZCBvbiB0byB0aGUgcXVldWUgYnkgdDIKLQkJYXNzZXJ0RmFsc2UodGhpcy5zcS5pc0VtcHR5KCkpOwotCQlhc3NlcnRTYW1lKElURU1fMiwgdGhpcy5zcS5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpID4gVElDSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb0VucXVldWVUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvRW5xdWV1ZShUSUNLKTsKLQkJLy8gdGltZW91dCBvY2N1cnMuLi4KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCB0aGUgcXVldWUgaXMgZXZlbnR1YWxseSBkZXF1ZXVlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5kZXF1ZXVlZE9iamVjdCk7Ci0JCS8vIC4uLmJ1dCBub3RoaW5nIGlzIGVucXVldWVkIG9uIHRvIHRoZSBxdWV1ZSBieSB0MgotCQlhc3NlcnRUcnVlKHRoaXMuc3EuaXNFbXB0eSgpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA8IFRIUkVFX1RJQ0tTKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5V2FpdFRvRW5xdWV1ZShsb25nIHRpbWVvdXQpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnNxLmVucXVldWUoSVRFTV8xKTsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZERlcXVldWVDb21tYW5kKCksIHRoaXMuc3EsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9FbnF1ZXVlQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcSwgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkRW5xdWV1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgewotCQkJCXN5bmNocm9uaXplZFF1ZXVlLmVucXVldWUoSVRFTV8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9EZXF1ZXVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl0cnkgewotCQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMuZGVxdWV1ZWRPYmplY3QgPSBzeW5jaHJvbml6ZWRRdWV1ZS53YWl0VG9EZXF1ZXVlKHRpbWVvdXQpOwotCQkJCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9IHRydWU7Ci0JCQkJfQotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkRGVxdWV1ZUNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgewotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5kZXF1ZXVlZE9iamVjdCA9IHN5bmNocm9uaXplZFF1ZXVlLmRlcXVldWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9FbnF1ZXVlQ29tbWFuZChmaW5hbCBsb25nIHRpbWVvdXQpIHsKLQkJcmV0dXJuIG5ldyBDb21tYW5kKCkgewotCQkJcHVibGljIHZvaWQgZXhlY3V0ZShTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQkJCVN5bmNocm9uaXplZFF1ZXVlVGVzdHMudGhpcy5zdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeW5jaHJvbml6ZWRRdWV1ZVRlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gISBzeW5jaHJvbml6ZWRRdWV1ZS53YWl0VG9FbnF1ZXVlKElURU1fMiwgdGltZW91dCk7Ci0JCQkJU3luY2hyb25pemVkUXVldWVUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoZmluYWwgQ29tbWFuZCBjb21tYW5kLCBmaW5hbCBTeW5jaHJvbml6ZWRRdWV1ZTxTdHJpbmc+IHN5bmNocm9uaXplZFF1ZXVlLCBmaW5hbCBsb25nIHNsZWVwKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJaWYgKHNsZWVwICE9IDApIHsKLQkJCQkJVGhyZWFkLnNsZWVwKHNsZWVwKTsKLQkJCQl9Ci0JCQkJY29tbWFuZC5leGVjdXRlKHN5bmNocm9uaXplZFF1ZXVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlsb25nIGNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgewotCQlyZXR1cm4gdGhpcy5lbmRUaW1lIC0gdGhpcy5zdGFydFRpbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbW1hbmQgaW50ZXJmYWNlICoqKioqKioqKioKLQotCXByaXZhdGUgaW50ZXJmYWNlIENvbW1hbmQgewotCQl2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkUXVldWU8U3RyaW5nPiBzeW5jaHJvbml6ZWRRdWV1ZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9TeW5jaHJvbml6ZWRTdGFja1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2Y2I2MmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1N5bmNocm9uaXplZFN0YWNrVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZFN0YWNrOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRTdGFja1Rlc3RzCi0JZXh0ZW5kcyBTaW1wbGVTdGFja1Rlc3RzCi17Ci0JcHJpdmF0ZSB2b2xhdGlsZSBTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+IHNzOwotCXZvbGF0aWxlIGJvb2xlYW4gdGltZW91dE9jY3VycmVkOwotCXZvbGF0aWxlIGxvbmcgc3RhcnRUaW1lOwotCXZvbGF0aWxlIGxvbmcgZW5kVGltZTsKLQl2b2xhdGlsZSBPYmplY3QgcG9wcGVkT2JqZWN0OwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzEgPSBuZXcgU3RyaW5nKCk7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBJVEVNXzIgPSBuZXcgU3RyaW5nKCk7Ci0KLQlwdWJsaWMgU3luY2hyb25pemVkU3RhY2tUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdGFjazxTdHJpbmc+IGJ1aWxkU3RhY2soKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RDbG9uZSgpIHsKLQkJLy8gc3luY2hyb25pemVkIHN0YWNrIGlzIG5vdCBjbG9uZWFibGUKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNzID0gbmV3IFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4oKTsKLQkJdGhpcy50aW1lb3V0T2NjdXJyZWQgPSBmYWxzZTsKLQkJdGhpcy5zdGFydFRpbWUgPSAwOwotCQl0aGlzLmVuZFRpbWUgPSAwOwotCQl0aGlzLnBvcHBlZE9iamVjdCA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBmaXJzdCB3aXRoIGFuIHVuc3luY2hyb25pemVkIHN0YWNrLAotCSAqIHRoZW4gd2l0aCBhIHN5bmNocm9uaXplZCBzdGFjawotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5Q29uY3VycmVudEFjY2VzcyhuZXcgU2xvd1NpbXBsZVN0YWNrPFN0cmluZz4oKSwgInNlY29uZCIpOwotCQl0aGlzLnZlcmlmeUNvbmN1cnJlbnRBY2Nlc3MobmV3IFNsb3dTeW5jaHJvbml6ZWRTdGFjazxTdHJpbmc+KCksICJmaXJzdCIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb25jdXJyZW50QWNjZXNzKFNsb3dTdGFjazxTdHJpbmc+IHNsb3dTdGFjaywgU3RyaW5nIGV4cGVjdGVkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2xvd1N0YWNrLnB1c2goImZpcnN0Iik7Ci0JCXNsb3dTdGFjay5wdXNoKCJzZWNvbmQiKTsKLQotCQlUaHJlYWQgdGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoc2xvd1N0YWNrKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQlUaHJlYWQuc2xlZXAoVFdPX1RJQ0tTKTsKLQotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHNsb3dTdGFjay5wb3AoKSk7Ci0JCXRocmVhZC5qb2luKCk7Ci0JCWFzc2VydFRydWUoc2xvd1N0YWNrLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIFNsb3dTdGFjazxTdHJpbmc+IHNsb3dTdGFjaykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXNsb3dTdGFjay5zbG93UG9wKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIGludGVyZmFjZSBTbG93U3RhY2s8RT4gZXh0ZW5kcyBTdGFjazxFPiB7Ci0JCU9iamVjdCBzbG93UG9wKCk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U2ltcGxlU3RhY2s8RT4gZXh0ZW5kcyBTaW1wbGVTdGFjazxFPiBpbXBsZW1lbnRzIFNsb3dTdGFjazxFPiB7Ci0JCVNsb3dTaW1wbGVTdGFjaygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIE9iamVjdCBzbG93UG9wKCkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoNSAqIFRJQ0spOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5wb3AoKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTbG93U3luY2hyb25pemVkU3RhY2s8RT4gZXh0ZW5kcyBTeW5jaHJvbml6ZWRTdGFjazxFPiBpbXBsZW1lbnRzIFNsb3dTdGFjazxFPiB7Ci0JCVNsb3dTeW5jaHJvbml6ZWRTdGFjaygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2xvd1BvcCgpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUgKiBUSUNLKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQkJcmV0dXJuIHRoaXMucG9wKCk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiB3YWl0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5V2FpdFRvUG9wKDApOwotCQkvLyBubyB0aW1lb3V0IG9jY3Vycy4uLgotCQlhc3NlcnRGYWxzZSh0aGlzLnRpbWVvdXRPY2N1cnJlZCk7Ci0JCS8vIC4uLmFuZCBhbiBpdGVtIHNob3VsZCBoYXZlIGJlZW4gcG9wcGVkIGJ5IHQyLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCB0aGUgc3RhY2sgc2hvdWxkIGJlIGVtcHR5Ci0JCWFzc2VydFRydWUodGhpcy5zcy5pc0VtcHR5KCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpID4gVElDSyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdhaXRUb1BvcFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlXYWl0VG9Qb3AoVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIHdhcyBuZXZlciBwb3BwZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmFuZCBpdCBzdGlsbCBob2xkcyB0aGUgaXRlbQotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5zcy5wZWVrKCkpOwotCQkvLyBtYWtlIGEgcmVhc29uYWJsZSBndWVzcyBhYm91dCBob3cgbG9uZyB0MiB0b29rCi0JCWFzc2VydFRydWUodGhpcy5jYWxjdWxhdGVFbGFwc2VkVGltZSgpIDwgVEhSRUVfVElDS1MpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlXYWl0VG9Qb3AobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUnVubmFibGUgcjEgPSB0aGlzLmJ1aWxkUnVubmFibGUodGhpcy5idWlsZFB1c2hDb21tYW5kKCksIHRoaXMuc3MsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9Qb3BDb21tYW5kKHRpbWVvdXQpLCB0aGlzLnNzLCAwKTsKLQkJVGhyZWFkIHQxID0gdGhpcy5idWlsZFRocmVhZChyMSk7Ci0JCVRocmVhZCB0MiA9IHRoaXMuYnVpbGRUaHJlYWQocjIpOwotCQl0MS5zdGFydCgpOwotCQl0Mi5zdGFydCgpOwotCQl0MS5qb2luKCk7Ci0JCXQyLmpvaW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2FpdFRvUHVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1B1c2goMCk7Ci0JCS8vIG5vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydEZhbHNlKHRoaXMudGltZW91dE9jY3VycmVkKTsKLQkJLy8gLi4uYW5kIHRoZSBzdGFjayBnZXRzIHBvcHBlZCBieSB0MS4uLgotCQlhc3NlcnRTYW1lKElURU1fMSwgdGhpcy5wb3BwZWRPYmplY3QpOwotCQkvLyAuLi5hbmQgYW4gaXRlbSBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrIGJ5IHQyCi0JCWFzc2VydEZhbHNlKHRoaXMuc3MuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0U2FtZShJVEVNXzIsIHRoaXMuc3MucGVlaygpKTsKLQkJLy8gbWFrZSBhIHJlYXNvbmFibGUgZ3Vlc3MgYWJvdXQgaG93IGxvbmcgdDIgdG9vawotCQlhc3NlcnRUcnVlKHRoaXMuY2FsY3VsYXRlRWxhcHNlZFRpbWUoKSA+IFRJQ0spOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXYWl0VG9QdXNoVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVdhaXRUb1B1c2goVElDSyk7Ci0JCS8vIHRpbWVvdXQgb2NjdXJzLi4uCi0JCWFzc2VydFRydWUodGhpcy50aW1lb3V0T2NjdXJyZWQpOwotCQkvLyAuLi5hbmQgdGhlIHN0YWNrIGlzIGV2ZW50dWFsbHkgcG9wcGVkIGJ5IHQxLi4uCi0JCWFzc2VydFNhbWUoSVRFTV8xLCB0aGlzLnBvcHBlZE9iamVjdCk7Ci0JCS8vIC4uLmJ1dCBub3RoaW5nIGlzIHB1c2hlZCBvbiB0byB0aGUgc3RhY2sgYnkgdDIKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNzLmlzRW1wdHkoKSk7Ci0JCS8vIG1ha2UgYSByZWFzb25hYmxlIGd1ZXNzIGFib3V0IGhvdyBsb25nIHQyIHRvb2sKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNhbGN1bGF0ZUVsYXBzZWRUaW1lKCkgPCBUSFJFRV9USUNLUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVdhaXRUb1B1c2gobG9uZyB0aW1lb3V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5zcy5wdXNoKElURU1fMSk7Ci0JCVJ1bm5hYmxlIHIxID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRQb3BDb21tYW5kKCksIHRoaXMuc3MsIFRXT19USUNLUyk7Ci0JCVJ1bm5hYmxlIHIyID0gdGhpcy5idWlsZFJ1bm5hYmxlKHRoaXMuYnVpbGRXYWl0VG9QdXNoQ29tbWFuZCh0aW1lb3V0KSwgdGhpcy5zcywgMCk7Ci0JCVRocmVhZCB0MSA9IHRoaXMuYnVpbGRUaHJlYWQocjEpOwotCQlUaHJlYWQgdDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHIyKTsKLQkJdDEuc3RhcnQoKTsKLQkJdDIuc3RhcnQoKTsKLQkJdDEuam9pbigpOwotCQl0Mi5qb2luKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkUHVzaENvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgewotCQkJCXN5bmNocm9uaXplZFN0YWNrLnB1c2goSVRFTV8xKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRXYWl0VG9Qb3BDb21tYW5kKGZpbmFsIGxvbmcgdGltZW91dCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCXRyeSB7Ci0JCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5wb3BwZWRPYmplY3QgPSBzeW5jaHJvbml6ZWRTdGFjay53YWl0VG9Qb3AodGltZW91dCk7Ci0JCQkJfSBjYXRjaCAoRW1wdHlTdGFja0V4Y2VwdGlvbiBleCkgewotCQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMudGltZW91dE9jY3VycmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLmVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRQb3BDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IENvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMucG9wcGVkT2JqZWN0ID0gc3luY2hyb25pemVkU3RhY2sucG9wKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkV2FpdFRvUHVzaENvbW1hbmQoZmluYWwgbG9uZyB0aW1lb3V0KSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyB2b2lkIGV4ZWN1dGUoU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCQlTeW5jaHJvbml6ZWRTdGFja1Rlc3RzLnRoaXMuc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3luY2hyb25pemVkU3RhY2tUZXN0cy50aGlzLnRpbWVvdXRPY2N1cnJlZCA9ICEgc3luY2hyb25pemVkU3RhY2sud2FpdFRvUHVzaChJVEVNXzIsIHRpbWVvdXQpOwotCQkJCVN5bmNocm9uaXplZFN0YWNrVGVzdHMudGhpcy5lbmRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFJ1bm5hYmxlKGZpbmFsIENvbW1hbmQgY29tbWFuZCwgZmluYWwgU3luY2hyb25pemVkU3RhY2s8U3RyaW5nPiBzeW5jaHJvbml6ZWRTdGFjaywgZmluYWwgbG9uZyBzbGVlcCkgewotCQlyZXR1cm4gbmV3IFRlc3RSdW5uYWJsZSgpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcnVuXygpIHRocm93cyBUaHJvd2FibGUgewotCQkJCWlmIChzbGVlcCAhPSAwKSB7Ci0JCQkJCVRocmVhZC5zbGVlcChzbGVlcCk7Ci0JCQkJfQotCQkJCWNvbW1hbmQuZXhlY3V0ZShzeW5jaHJvbml6ZWRTdGFjayk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JbG9uZyBjYWxjdWxhdGVFbGFwc2VkVGltZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb21tYW5kIGludGVyZmFjZSAqKioqKioqKioqCi0KLQlwcml2YXRlIGludGVyZmFjZSBDb21tYW5kIHsKLQkJdm9pZCBleGVjdXRlKFN5bmNocm9uaXplZFN0YWNrPFN0cmluZz4gc3luY2hyb25pemVkU3RhY2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9UZXN0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZjMxYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVGVzdFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dDsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0RmFpbHVyZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFJlc3VsdDsKLQotLyoqCi0gKiB2YXJpb3VzIHRvb2xzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGVzdCBjYXNlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFRvb2xzIHsKLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGhhbmRsZXMge0BsaW5rIEludGVycnVwdGVkRXhjZXB0aW9ufS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKLQkJdHJ5IHsKLQkJCVRocmVhZC5zbGVlcChtaWxsaXMpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhbiBvYmplY3QncyBpbXBsZW1lbnRhdGlvbiBvZiBTZXJpYWxpemFibGUgYnkgc2VyaWFsaXppbmcgdGhlCi0JICogc3BlY2lmaWVkIG9iamVjdCB0byBhIGJ5dGUgYXJyYXk7IHRoZW4gZGUtc2VyaWFsaXppbmcgdGhlIGJ5dGUgYXJyYXkgYW5kCi0JICogcmV0dXJuaW5nIHRoZSByZXN1bHRhbnQgb2JqZWN0Ci0JICovCi0JcHVibGljIHN0YXRpYyA8VD4gVCBzZXJpYWxpemUoVCBvKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFPdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDIwMDApOwotCQlPYmplY3RPdXRwdXRTdHJlYW0gb3V0U3RyZWFtID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShiYU91dFN0cmVhbSk7Ci0JCW91dFN0cmVhbS53cml0ZU9iamVjdChvKTsKLQkJb3V0U3RyZWFtLmNsb3NlKCk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFJblN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYU91dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gaW5TdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFJblN0cmVhbSk7Ci0JCVQgbzIgPSByZWFkT2JqZWN0KGluU3RyZWFtKTsKLQkJaW5TdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gbzI7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgcmVhZE9iamVjdChPYmplY3RJbnB1dCBvYmplY3RJbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChUKSBvYmplY3RJbnB1dC5yZWFkT2JqZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogcmVkaXJlY3Qgc3RkIG91dCBhbmQgc3RkIGVyciB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWRpcmVjdFN5c3RlbVN0cmVhbXNUbyhPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7Ci0JCXJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKG5ldyBQcmludFN0cmVhbShvdXRwdXRTdHJlYW0pKTsKLQl9Ci0KLQkvKioKLQkgKiByZWRpcmVjdCBzdGQgb3V0IGFuZCBzdGQgZXJyIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZGlyZWN0U3lzdGVtU3RyZWFtc1RvKFByaW50U3RyZWFtIHByaW50U3RyZWFtKSB7Ci0JCVN5c3RlbS5zZXRPdXQocHJpbnRTdHJlYW0pOwotCQlTeXN0ZW0uc2V0RXJyKHByaW50U3RyZWFtKTsKLQl9Ci0KLQkvKioKLQkgKiBTb3J0IGFuZCBwcmludCBvdXQgYWxsIHRoZSBjdXJyZW50IEphdmEgU3lzdGVtIHByb3BlcnRpZXMgb24gdGhlCi0JICogY29uc29sZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTeXN0ZW1Qcm9wZXJ0aWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKFN5c3RlbS5vdXQpIHsKLQkJCXByaW50U3lzdGVtUHJvcGVydGllc09uKFN5c3RlbS5vdXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU29ydCBhbmQgcHJpbnQgb3V0IGFsbCB0aGUgY3VycmVudCBKYXZhIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHRoZQotCSAqIHNwZWNpZmllZCBwcmludCBzdHJlYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHByaW50U3lzdGVtUHJvcGVydGllc09uKFByaW50U3RyZWFtIHN0cmVhbSkgewotCQlTb3J0ZWRTZXQ8U3RyaW5nPiBzb3J0ZWRLZXlzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihTdHJpbmcuQ0FTRV9JTlNFTlNJVElWRV9PUkRFUik7Ci0JCWZvciAoT2JqZWN0IGtleSA6IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkua2V5U2V0KCkpIHsKLQkJCXNvcnRlZEtleXMuYWRkKChTdHJpbmcpIGtleSk7Ci0JCX0KLQkJZm9yIChTdHJpbmcga2V5IDogc29ydGVkS2V5cykgewotCQkJc3RyZWFtLnByaW50KGtleSk7Ci0JCQlzdHJlYW0ucHJpbnQoIiA9PiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3RyZWFtLnByaW50KFN5c3RlbS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJCXN0cmVhbS5wcmludGxuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgdGVzdCBhbmQgcmV0dXJuIGEgdGV4dCBvdXRwdXQgb2YgaXRzIHJlc3VsdHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGVjdXRlKFRlc3RDYXNlIHRlc3RDYXNlKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJVGVzdFJlc3VsdCByZXN1bHQgPSB0ZXN0Q2FzZS5ydW4oKTsKLQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlTdHJpbmdXcml0ZXIgc3RyaW5nV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoc3RyaW5nV3JpdGVyKTsKLQkJd3JpdGVyLnByaW50KHRlc3RDYXNlLmdldE5hbWUoKSk7Ci0JCXdyaXRlci5wcmludCgiOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkgewotCQkJd3JpdGVyLnByaW50bG4oIk9LIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVRlc3RGYWlsdXJlIGZhaWx1cmUgPSBudWxsOwotCQkJaWYgKHJlc3VsdC5mYWlsdXJlcygpLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJZmFpbHVyZSA9IHJlc3VsdC5mYWlsdXJlcygpLm5leHRFbGVtZW50KCk7Ci0JCQl9IGVsc2UgewotCQkJCWZhaWx1cmUgPSByZXN1bHQuZXJyb3JzKCkubmV4dEVsZW1lbnQoKTsKLQkJCX0KLQkJCWZhaWx1cmUudGhyb3duRXhjZXB0aW9uKCkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7Ci0JCX0KLQkJd3JpdGVyLnByaW50KCJlbGFwc2VkIHRpbWU6ICIpOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgZWxhcHNlZCA9IGVuZCAtIHN0YXJ0OwotCQl3cml0ZXIucHJpbnQoZWxhcHNlZCAvIDEwMDBMKTsKLQkJd3JpdGVyLnByaW50bG4oIiBzZWMuIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN0cmluZ1dyaXRlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIENsZWFyIG91dCBhbGwgdGhlIGluc3RhbmNlIHZhcmlhYmxlIG9mIHRoZSBzcGVjaWZpZWQgdGVzdCBjYXNlLCBhbGxvd2luZwotCSAqIHRoZSB2YXJpb3VzIHRlc3QgZml4dHVyZXMgdG8gYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuIFR5cGljYWxseSB0aGlzIGlzCi0JICogY2FsbGVkIGluIHRoZSAjdGVhckRvd24oKSBtZXRob2QuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyKFRlc3RDYXNlIHRlc3RDYXNlKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7Ci0JCWZvciAoQ2xhc3M8Pz4gY2xhenogPSB0ZXN0Q2FzZS5nZXRDbGFzcygpOyBjbGF6eiAhPSBUZXN0Q2FzZV9jbGFzczsgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCkpIHsKLQkJCWZvciAoRmllbGQgZmllbGQgOiBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpKSB7Ci0JCQkJLy8gbGVhdmUgcHJpbWl0aXZlcyBhbG9uZSAtIHRoZXkgZG9uJ3QgZ2V0IGdhcmJhZ2UtY29sbGVjdGVkLCBhbmQgd2UgY2FuJ3Qgc2V0IHRoZW0gdG8gbnVsbC4uLgotCQkJCWlmIChmaWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJLy8gbGVhdmUgc3RhdGljIGZpZWxkcyBhbG9uZSAoPykKLQkJCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJCWZpZWxkLnNldCh0ZXN0Q2FzZSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczxUZXN0Q2FzZT4gVGVzdENhc2VfY2xhc3MgPSBUZXN0Q2FzZS5jbGFzczsKLQotCS8qKgotCSAqIFdvcmthcm91bmQgZm9yIGEgSlVuaXQgYnVnOiBKVW5pdCBkb2VzIG5vdCBjb25maWd1cmUgdGhlIHRlc3RpbmcgVGhyZWFkCi0JICogd2l0aCBhIGNvbnRleHQgY2xhc3MgbG9hZGVyLiBUaGlzIHNob3VsZCBwcm9iYWJseSBoYXBwZW4gaW4KLQkgKiBUZXN0UnVubmVyLmRvUnVuVGVzdChUZXN0KSwganVzdCBiZWZvcmUgc3RhcnRpbmcgdGhlIHRocmVhZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBKVW5pdFRocmVhZENvbnRleHRDbGFzc0xvYWRlcigpIHsKLQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoVGVzdFRvb2xzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIHN1cHByZXNzZWQgY29uc3RydWN0b3IKLQkgKi8KLQlwcml2YXRlIFRlc3RUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVG9vbHNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1Rvb2xzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3ZmNiYS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRvb2xzVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWwxKCkgewotCQlhc3NlcnRUcnVlKFRvb2xzLnZhbHVlc0FyZUVxdWFsKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWwyKCkgewotCQlhc3NlcnRGYWxzZShUb29scy52YWx1ZXNBcmVFcXVhbChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNBcmVFcXVhbDMoKSB7Ci0JCWFzc2VydEZhbHNlKFRvb2xzLnZhbHVlc0FyZUVxdWFsKCJmb28iLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlc0FyZUVxdWFsNCgpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVFcXVhbCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRXF1YWw1KCkgewotCQlhc3NlcnRGYWxzZShUb29scy52YWx1ZXNBcmVFcXVhbCgiZm9vIiwgImJhciIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MSgpIHsKLQkJYXNzZXJ0RmFsc2UoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MigpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50MygpIHsKLQkJYXNzZXJ0VHJ1ZShUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQoImZvbyIsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzQXJlRGlmZmVyZW50NCgpIHsKLQkJYXNzZXJ0RmFsc2UoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQ1KCkgewotCQlhc3NlcnRUcnVlKFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCgiZm9vIiwgImJhciIpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9WZXJzaW9uQ29tcGFyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvVmVyc2lvbkNvbXBhcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTdlZmYxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9WZXJzaW9uQ29tcGFyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlZlcnNpb25Db21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5WZXJzaW9uQ29tcGFyYXRvci5TZWdtZW50UGFyc2VyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWZXJzaW9uQ29tcGFyYXRvclRlc3RzCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBWZXJzaW9uQ29tcGFyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNFcXVhbF9pbnRlZ2VyKCkgewotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wIiwgIjIuMC4wIikgPT0gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjAuMCIpID09IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wLjAuMC4wLjAwMDAiLCAiMi4wIikgPT0gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi4wLi0xIiwgIjIuMC4tMSIpID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNMZXNzX2ludGVnZXIoKSB7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjEiKSA8IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuNS4wIiwgIjIuMTQiKSA8IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuNS4wIiwgIjIuNS4wLjAuMS4wIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZShWZXJzaW9uQ29tcGFyYXRvci5JTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKCIyLjUuMC4wLjAuLTEiLCAiMi41IikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZShWZXJzaW9uQ29tcGFyYXRvci5JTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKCIyLjAuLTEiLCAiMi4wLjAiKSA8IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4tMSIsICIyIikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzR3JlYXRlcl9pbnRlZ2VyKCkgewotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4yIiwgIjIuMC4xIikgPiAwKTsKLQkJYXNzZXJ0VHJ1ZShWZXJzaW9uQ29tcGFyYXRvci5JTlRFR0VSX1ZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKCIyLjAuMiIsICIyLjAuMSIpID4gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMi41LjAuMC4xLjAiLCAiMi41LjAiKSA+IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuNSIsICIyLjUuMC4wLjAuLTEiKSA+IDApOwotCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wIiwgIjIuMC4tMSIpID4gMCk7Ci0JCWFzc2VydFRydWUoVmVyc2lvbkNvbXBhcmF0b3IuSU5URUdFUl9WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSgiMiIsICIyLjAuLTEiKSA+IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNFcXVhbF9pbnRlZ2VyX2NvbW1hKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gdmVyc2lvbkNvbXBhcmF0b3IgPSBuZXcgVmVyc2lvbkNvbXBhcmF0b3I8QmlnRGVjaW1hbD4oIiwiLCBEZWNpbWFsU2VnbWVudFBhcnNlci5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAsMCIsICIyLDAsMCIpID09IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIsMC4wLDAiLCAiMiwwLDAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAuMCwwIiwgIjIsMCwwLjAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAsMC4wLDAiLCAiMiwwLDAuMCIpID09IDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uSXNMZXNzX2ludGVnZXJfY29tbWEoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiB2ZXJzaW9uQ29tcGFyYXRvciA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxCaWdEZWNpbWFsPigiLCIsIERlY2ltYWxTZWdtZW50UGFyc2VyLmluc3RhbmNlKCkpOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIsMCwwIiwgIjIsMCwxIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAuMCwwIiwgIjIsMCwxIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAsMCIsICIyLDAsMS4wIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAsMCwwIiwgIjIsMCwxIikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzR3JlYXRlcl9pbnRlZ2VyX2NvbW1hKCkgewotCQlDb21wYXJhdG9yPFN0cmluZz4gdmVyc2lvbkNvbXBhcmF0b3IgPSBuZXcgVmVyc2lvbkNvbXBhcmF0b3I8QmlnRGVjaW1hbD4oIiwiLCBEZWNpbWFsU2VnbWVudFBhcnNlci5pbnN0YW5jZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLDAsMiIsICIyLDAsMSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMiwwLDIuMSIsICIyLDAsMSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMiwwLDIiLCAiMiwwLDEuOSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wMDAsMCwyIiwgIjIsMCwxIikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzRXF1YWxfc3ViY2xhc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiB2ZXJzaW9uQ29tcGFyYXRvciA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxJbnRlZ2VyPigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBwYXJzZVNlZ21lbnQoaW50IGluZGV4LCBTdHJpbmcgcykgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHMpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRaZXJvKCkgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKDApOwotCQkJCX0KLQkJCX07Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMCIsICIyLjAuMC4wIikgPT0gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAuMCIsICIyLjAiKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuLTEiLCAiMi4wLi0xIikgPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Jc0xlc3Nfc3ViY2xhc3MoKSB7Ci0JCUNvbXBhcmF0b3I8U3RyaW5nPiB2ZXJzaW9uQ29tcGFyYXRvciA9IG5ldyBWZXJzaW9uQ29tcGFyYXRvcjxJbnRlZ2VyPigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBwYXJzZVNlZ21lbnQoaW50IGluZGV4LCBTdHJpbmcgcykgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHMpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRaZXJvKCkgewotCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKDApOwotCQkJCX0KLQkJCX07Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjEiKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuNS4wIiwgIjIuMTQiKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuNS4wIiwgIjIuNS4wLjAuMS4wIikgPCAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuLTEiLCAiMi4wLjAiKSA8IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuMC4tMSIsICIyIikgPCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbklzR3JlYXRlcl9zdWJjbGFzcygpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IHZlcnNpb25Db21wYXJhdG9yID0gbmV3IFZlcnNpb25Db21wYXJhdG9yPEludGVnZXI+KCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIHBhcnNlU2VnbWVudChpbnQgaW5kZXgsIFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGdldFplcm8oKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCQkJfQotCQkJfTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMiIsICIyLjAuMSIpID4gMCk7Ci0JCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjIiLCAiMi4wLjEiKSA+IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIuNS4wLjAuMS4wIiwgIjIuNS4wIikgPiAwKTsKLQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMCIsICIyLjAuLTEiKSA+IDApOwotCQlhc3NlcnRUcnVlKHZlcnNpb25Db21wYXJhdG9yLmNvbXBhcmUoIjIiLCAiMi4wLi0xIikgPiAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFkU3RyaW5nKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvLyBub3RlIHRoZSBsZXR0ZXIgJ08nIGluc3RlYWQgb2YgdGhlIG51bWVyYWwgJzAnCi0JCQlhc3NlcnRUcnVlKFZlcnNpb25Db21wYXJhdG9yLklOVEVHRVJfVkVSU0lPTl9DT01QQVJBVE9SLmNvbXBhcmUoIjIuMC4wIiwgIjIuTy5PIikgPT0gMCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c1N1YmNsYXNzMSgpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IHZlcnNpb25Db21wYXJhdG9yID0gbmV3IFZlcnNpb25Db21wYXJhdG9yPEludGVnZXI+KCkgewotCQkJCS8vIGJvZ3VzIC0gbXVzdCBvdmVycmlkZSBwYXJzZVNlZ21lbnQoLi4uKQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGdldFplcm8oKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2YoMCk7Ci0JCQkJfQotCQkJfTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJYXNzZXJ0VHJ1ZSh2ZXJzaW9uQ29tcGFyYXRvci5jb21wYXJlKCIyLjAuMCIsICIyLjAuMCIpID09IDApOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c1N1YmNsYXNzMigpIHsKLQkJQ29tcGFyYXRvcjxTdHJpbmc+IHZlcnNpb25Db21wYXJhdG9yID0gbmV3IFZlcnNpb25Db21wYXJhdG9yPEludGVnZXI+KCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIHBhcnNlU2VnbWVudChpbnQgaW5kZXgsIFN0cmluZyBzKSB7Ci0JCQkJCXJldHVybiBJbnRlZ2VyLnZhbHVlT2Yocyk7Ci0JCQkJfQotCQkJCS8vIGJvZ3VzIC0gbXVzdCBnZXRaZXJvKCkKLQkJCX07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWFzc2VydFRydWUodmVyc2lvbkNvbXBhcmF0b3IuY29tcGFyZSgiMi4wLjAiLCAiMi4wLjAuMC4wIikgPT0gMCk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQlzdGF0aWMgZmluYWwgY2xhc3MgRGVjaW1hbFNlZ21lbnRQYXJzZXIKLQkJaW1wbGVtZW50cyBTZWdtZW50UGFyc2VyPEJpZ0RlY2ltYWw+LCBTZXJpYWxpemFibGUKLQl7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU2VnbWVudFBhcnNlcjxCaWdEZWNpbWFsPiBJTlNUQU5DRSA9IG5ldyBEZWNpbWFsU2VnbWVudFBhcnNlcigpOwotCQlwdWJsaWMgc3RhdGljIFNlZ21lbnRQYXJzZXI8QmlnRGVjaW1hbD4gaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIERlY2ltYWxTZWdtZW50UGFyc2VyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkvLyBzaW1wbHkgcGFyc2UgdGhlIHNlZ21lbnQgYXMgYW4gaW50ZWdlcgotCQlwdWJsaWMgQmlnRGVjaW1hbCBwYXJzZShpbnQgc2VnbWVudEluZGV4LCBTdHJpbmcgc2VnbWVudCkgewotCQkJcmV0dXJuIG5ldyBCaWdEZWNpbWFsKHNlZ21lbnQpOwotCQl9Ci0JCXB1YmxpYyBCaWdEZWNpbWFsIGdldFplcm8oKSB7Ci0JCQlyZXR1cm4gWkVSTzsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIFpFUk8gPSBuZXcgQmlnRGVjaW1hbCgwKTsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL1hNTFN0cmluZ0VuY29kZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjEzMTNjLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9YTUxTdHJpbmdFbmNvZGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuRmlsZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5YTUxTdHJpbmdFbmNvZGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYTUxTdHJpbmdFbmNvZGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWE1MU3RyaW5nRW5jb2RlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbmNvZGVOb0NoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiZm9vIjsKLQkJYXNzZXJ0RXF1YWxzKHMsIGVuY29kZXIuZW5jb2RlKHMpKTsKLQotCQlzID0gIjEyM2ZvbzEyMyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVuY29kZUNoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiP2Zvbz8iOwotCQlTdHJpbmcgZXhwZWN0ZWQgPSAiJiN4M2Y7Zm9vJiN4M2Y7IjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmVuY29kZShzKSk7Ci0KLQkJcyA9ICI/Zm9vJjEyMyI7Ci0JCWV4cGVjdGVkID0gIiYjeDNmO2ZvbyYjeDI2OzEyMyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5lbmNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZW5vcm1hbGl6ZVZhbGlkRmlsZU5hbWUoKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCi0JCVN0cmluZyBzID0gImZvbyI7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0KLQkJcyA9ICIxMjNmb28xMjMiOwotCQlhc3NlcnRFcXVhbHMocywgZW5jb2Rlci5kZWNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZW5vcm1hbGl6ZUludmFsaWRGaWxlTmFtZSgpIHsKLQkJWE1MU3RyaW5nRW5jb2RlciBlbmNvZGVyID0gbmV3IFhNTFN0cmluZ0VuY29kZXIoRmlsZVRvb2xzLklOVkFMSURfRklMRU5BTUVfQ0hBUkFDVEVSUyk7Ci0KLQkJU3RyaW5nIHMgPSAiJiN4M2Y7Zm9vJiN4M2Y7IjsKLQkJU3RyaW5nIGV4cGVjdGVkID0gIj9mb28/IjsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBlbmNvZGVyLmRlY29kZShzKSk7Ci0KLQkJcyA9ICImI3gzZjtmb28mI3gyNjsxMjMiOwotCQlleHBlY3RlZCA9ICI/Zm9vJjEyMyI7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgZW5jb2Rlci5kZWNvZGUocykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBOb0NoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoImZvbyIpOwotCQl0aGlzLnZlcmlmeVJvdW5kVHJpcCgiMTIzZm9vNDU2Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJvdW5kVHJpcENoYXJhY3RlclNlcXVlbmNlcygpIHsKLQkJdGhpcy52ZXJpZnlSb3VuZFRyaXAoIj9mb28/Iik7Ci0JCXRoaXMudmVyaWZ5Um91bmRUcmlwKCI/Zm9vJjEyMyYmJiYmJj4+Pj4iKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Um91bmRUcmlwKFN0cmluZyBzKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCQlTdHJpbmcgYWN0dWFsID0gZW5jb2Rlci5lbmNvZGUocyk7Ci0JCWFzc2VydEVxdWFscyhzLCBlbmNvZGVyLmRlY29kZShhY3R1YWwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlMSgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlMigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTMoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI3giKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNCgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjeDMiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNSgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyYjeDsiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlNigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImZvbyZBIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRDaGFyYWN0ZXJTZXF1ZW5jZTcoKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJmb28mI0EiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZyBzKSB7Ci0JCVhNTFN0cmluZ0VuY29kZXIgZW5jb2RlciA9IG5ldyBYTUxTdHJpbmdFbmNvZGVyKEZpbGVUb29scy5JTlZBTElEX0ZJTEVOQU1FX0NIQVJBQ1RFUlMpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzID0gZW5jb2Rlci5kZWNvZGUocyk7Ci0JCQlmYWlsKHMpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENoYXJhY3RlclNlcXVlbmNlOCgpIHsKLQkJU3RyaW5nIHMgPSAiZm9vJiN4WlpaWjsiOwotCQlYTUxTdHJpbmdFbmNvZGVyIGVuY29kZXIgPSBuZXcgWE1MU3RyaW5nRW5jb2RlcihGaWxlVG9vbHMuSU5WQUxJRF9GSUxFTkFNRV9DSEFSQUNURVJTKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJcyA9IGVuY29kZXIuZGVjb2RlKHMpOwotCQkJZmFpbChzKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb25UZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2VudW1lcmF0aW9ucy9FbXB0eUVudW1lcmF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmYzljOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0VtcHR5RW51bWVyYXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5lbnVtZXJhdGlvbnMuRW1wdHlFbnVtZXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1wdHlFbnVtZXJhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5RW51bWVyYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCXN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEVsZW1lbnQoKSB7Ci0JCWZvciAoRW51bWVyYXRpb248T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUVudW1lcmF0aW9uLmluc3RhbmNlKCk7IHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5RW51bWVyYXRpb24uaW5zdGFuY2UoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0l0ZXJhdG9yRW51bWVyYXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDZjYmFhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuZW51bWVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5lbnVtZXJhdGlvbnMuSXRlcmF0b3JFbnVtZXJhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEl0ZXJhdG9yRW51bWVyYXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTW9yZUVsZW1lbnRzKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNNb3JlRWxlbWVudHNVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChFbnVtZXJhdGlvbjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvblVwY2FzdCgpOyBzdHJlYW0uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlzdHJlYW0ubmV4dEVsZW1lbnQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFZlY3RvcigpLnNpemUoKSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRFbGVtZW50KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCWZvciAoRW51bWVyYXRpb248U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkRW51bWVyYXRpb24oKTsgc3RyZWFtLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgaXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlFbnVtZXJhdGlvbjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHRFbGVtZW50KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0RWxlbWVudCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtZXJhdGlvbjxTdHJpbmc+IGJ1aWxkRW51bWVyYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRW51bWVyYXRpb24odGhpcy5idWlsZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248T2JqZWN0PiBidWlsZEVudW1lcmF0aW9uVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEVudW1lcmF0aW9uVXBjYXN0KHRoaXMuYnVpbGRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPFN0cmluZz4gYnVpbGRFbnVtZXJhdGlvbihJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3JFbnVtZXJhdGlvbjxTdHJpbmc+KGl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1lcmF0aW9uPE9iamVjdD4gYnVpbGRFbnVtZXJhdGlvblVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgSXRlcmF0b3JFbnVtZXJhdGlvbjxPYmplY3Q+KGl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvZW51bWVyYXRpb25zL0pwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRmYjBmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9lbnVtZXJhdGlvbnMvSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5lbnVtZXJhdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlFbnVtZXJhdGlvbnNUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eUVudW1lcmF0aW9uc1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUVudW1lcmF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlcmF0b3JFbnVtZXJhdGlvblRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5RW51bWVyYXRpb25zVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNmUyZGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9BcnJheUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogdGhpcy5idWlsZEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIEludGVnZXIucGFyc2VJbnQoc3RyaW5nKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViSXRlcmF0b3IoKSB7Ci0JCWludCBpID0gMzsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogdGhpcy5idWlsZEl0ZXJhYmxlKDIpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZykpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpIHsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKC0xLCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDgsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgLTEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgOSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoc3RhcnQsIGxlbmd0aCk7Ci0JCQlmYWlsKCJib2d1cyBpdGVyYWJsZTogIiArIGl0ZXJhYmxlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmFibGUoMCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoaW50IHN0YXJ0KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmFibGUodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KGFycmF5LCBzdGFydCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmFibGUodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKFN0cmluZ1tdIGFycmF5LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0FycmF5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2NkNDBmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQXJyYXlMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFycmF5TGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQXJyYXlMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWludCBpID0gMTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoKTsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogaXRlcmFibGUpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIEludGVnZXIucGFyc2VJbnQoc3RyaW5nKSk7Ci0JCX0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5wcmV2aW91cygpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViSXRlcmF0b3IoKSB7Ci0JCWludCBpID0gMzsKLQkJZm9yIChTdHJpbmcgc3RyaW5nIDogdGhpcy5idWlsZEl0ZXJhYmxlKDIpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmluZykpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpIHsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKC0xLCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDgsIDEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgLTEpOwotCQl0aGlzLnRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oMCwgOSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSB0aGlzLmJ1aWxkSXRlcmFibGUoc3RhcnQsIGxlbmd0aCk7Ci0JCQlmYWlsKCJib2d1cyBpdGVyYWJsZTogIiArIGl0ZXJhYmxlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhYmxlKDApOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShpbnQgc3RhcnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYWJsZSh0aGlzLmJ1aWxkQXJyYXkoKSwgc3RhcnQpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0KSB7Ci0JCXJldHVybiAoc3RhcnQgPT0gMCkgPwotCQkJCW5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KGFycmF5KSA6Ci0JCQkJbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oYXJyYXksIHN0YXJ0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmFibGUodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmFibGU8U3RyaW5nPihhcnJheSwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIgfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NoYWluSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg0MjNiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ2hhaW5JdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNoYWluSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DaGFpbkl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFpbkl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBWRUNUT1JfSElFUkFSQ0hZID0geyBWZWN0b3IuY2xhc3MsIEFic3RyYWN0TGlzdC5jbGFzcywgQWJzdHJhY3RDb2xsZWN0aW9uLmNsYXNzLCBPYmplY3QuY2xhc3MgfTsKLQotCXB1YmxpYyBDaGFpbkl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dExpbmsoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChDbGFzczw/PiBjbGF6eiA6IHRoaXMuYnVpbGRJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoVkVDVE9SX0hJRVJBUkNIWVtpKytdLCBjbGF6eik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlua2VyKCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoQ2xhc3M8Pz4gY2xhenogOiBuZXcgQ2hhaW5JdGVyYWJsZTxDbGFzczw/Pj4oVmVjdG9yLmNsYXNzLCB0aGlzLmJ1aWxkTGlua2VyKCkpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoVkVDVE9SX0hJRVJBUkNIWVtpKytdLCBjbGF6eik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgewotCQlJdGVyYWJsZTxDbGFzczw/Pj4gaXRlcmFibGUgPSBuZXcgQ2hhaW5JdGVyYWJsZTxDbGFzczw/Pj4oVmVjdG9yLmNsYXNzKTsKLQkJSXRlcmF0b3I8Q2xhc3M8Pz4+IGl0ZXJhdG9yID0gaXRlcmFibGUuaXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJQ2xhc3M8Pz4gY2xhenogPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJib2d1cyBjbGFzczogIiArIGNsYXp6KTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkSXRlcmFibGUoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPENsYXNzPD8+PiBidWlsZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENoYWluSXRlcmFibGUoVmVjdG9yLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPENsYXNzPD8+PiBidWlsZENoYWluSXRlcmFibGUoQ2xhc3M8Pz4gc3RhcnRMaW5rKSB7Ci0JCS8vIGNoYWluIHVwIHRoZSBjbGFzcydzIGhpZXJhcmNoeQotCQlyZXR1cm4gbmV3IENoYWluSXRlcmFibGU8Q2xhc3M8Pz4+KHN0YXJ0TGluaykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhaW5JdGVyYXRvci5MaW5rZXI8Q2xhc3M8Pz4+IGJ1aWxkTGlua2VyKCkgewotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PigpIHsKLQkJCXB1YmxpYyBDbGFzczw/PiBuZXh0TGluayhDbGFzczw/PiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9DbG9uZUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyOTJlYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0Nsb25lSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xvbmVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGU7Ci0KLQlwdWJsaWMgQ2xvbmVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoIjAiKTsKLQkJYy5hZGQoIjEiKTsKLQkJYy5hZGQoIjIiKTsKLQkJYy5hZGQoIjMiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGMuc2l6ZSgpKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5pdGVyYWJsZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQkJYy5yZW1vdmUoIjMiKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNCwgaSk7Ci0JCWFzc2VydEVxdWFscygzLCBjLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJZmluYWwgTGlzdDxTdHJpbmc+IGNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQl0aGlzLml0ZXJhYmxlID0gdGhpcy5idWlsZFJlbW92aW5nSXRlcmFibGUoY29sbGVjdGlvbik7Ci0KLQkJT2JqZWN0IHJlbW92ZWQgPSAidGhyZWUiOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCByZW1vdmVkKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKHJlbW92ZWQpKSB7Ci0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RmFsc2UoY29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZXIoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZVdpdGhSZW1vdmVyKGNvbGxlY3Rpb24pOwotCi0JCU9iamVjdCByZW1vdmVkID0gInRocmVlIjsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgcmVtb3ZlZCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMocmVtb3ZlZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUmVtb3ZlcigpIHsKLQkJZmluYWwgTGlzdDxTdHJpbmc+IGNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQl0aGlzLml0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0KLQkJT2JqZWN0IHJlbW92ZWQgPSAidGhyZWUiOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCByZW1vdmVkKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJZmFpbCgpOwotCQkJCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbChpdGVyYWJsZS50b1N0cmluZygpKTsKLQl9Ci0KLQlhYnN0cmFjdCBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoTGlzdDxTdHJpbmc+IGMpOwotCi0JYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlbW92aW5nSXRlcmFibGUoTGlzdDxTdHJpbmc+IGMpOwotCi0JYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlV2l0aFJlbW92ZXIoTGlzdDxTdHJpbmc+IGMpOwotCi0JQ2xvbmVJdGVyYXRvci5SZW1vdmVyPFN0cmluZz4gYnVpbGRSZW1vdmVyKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvci5SZW1vdmVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQljLnJlbW92ZShjdXJyZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlDbG9uZUxpc3RJdGVyYXRvci5NdXRhdG9yPFN0cmluZz4gYnVpbGRNdXRhdG9yKGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotCQkJCWxpc3QuYWRkKGluZGV4LCBzdHJpbmcpOwotCQkJfQotCQkJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgU3RyaW5nIHN0cmluZykgewotCQkJCWxpc3Quc2V0KGluZGV4LCBzdHJpbmcpOwotCQkJfQotCQkJcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQkJCWxpc3QucmVtb3ZlKGluZGV4KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlMaXN0PFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJzaXgiKTsKLQkJYy5hZGQoInNldmVuIik7Ci0JCWMuYWRkKCJlaWdodCIpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTUxNmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9Db21wb3NpdGVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oYzEsIGMyKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MSgpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oYzEsICI0Iik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDIoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oIjAiLCBjMSk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25PZkl0ZXJhYmxlcygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQotCQlDb2xsZWN0aW9uPEl0ZXJhYmxlPFN0cmluZz4+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PEl0ZXJhYmxlPFN0cmluZz4+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKGMxKTsKLQkJY29sbGVjdGlvbi5hZGQoYzIpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KGNvbGxlY3Rpb24pOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMi5hZGQoIjQiKTsKLQkJYzIuYWRkKCI1Iik7Ci0JCWMyLmFkZCgiNiIpOwotCQljMi5hZGQoIjciKTsKLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihjMSwgYzIpOwotCQlhc3NlcnROb3ROdWxsKGNvbXBvc2l0ZS50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvQ29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmMDZjZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0NvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdExpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihjMSwgYzIpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHRyYUVsZW1lbnQxKCkgewotCQlMaXN0PFN0cmluZz4gYzEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzEuYWRkKCIwIik7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0KLQkJSXRlcmFibGU8U3RyaW5nPiBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEsICI0Iik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IGNvbXBvc2l0ZSkgewotCQkJYXNzZXJ0RXF1YWxzKFN0cmluZy52YWx1ZU9mKGkrKyksIHMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4dHJhRWxlbWVudDIoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KCIwIiwgYzEpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uT2ZJdGVyYWJsZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0KLQkJTGlzdDxMaXN0SXRlcmFibGU8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8TGlzdEl0ZXJhYmxlPFN0cmluZz4+KCk7Ci0JCWNvbGxlY3Rpb24uYWRkKG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEpKTsKLQkJY29sbGVjdGlvbi5hZGQobmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMikpOwotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8U3RyaW5nPihjb2xsZWN0aW9uKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQotCQlMaXN0PFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMxLCBjMik7Ci0JCWFzc2VydE5vdE51bGwoY29tcG9zaXRlLnRvU3RyaW5nKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmUyMzAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJZm9yIChTdHJpbmcgcyA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwoRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCWFzc2VydFNhbWUoaXRlcmFibGUsIFRlc3RUb29scy5zZXJpYWxpemUoaXRlcmFibGUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRW1wdHlMaXN0SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTU1NWMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9FbXB0eUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5TGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1wdHlMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWZvciAoU3RyaW5nIHMgOiBFbXB0eUxpc3RJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbChFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gaXRlcmFibGUgPSBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQlhc3NlcnRTYW1lKGl0ZXJhYmxlLCBUZXN0VG9vbHMuc2VyaWFsaXplKGl0ZXJhYmxlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0ZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTFiNTYxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9ICJwcmVmaXgiOwotCi0JcHVibGljIEZpbHRlcmluZ0l0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2VwdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydFRydWUocy5jb250YWlucyhQUkVGSVgpKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpbHRlcigpIHsKLQkJRmlsdGVyPFN0cmluZz4gZmlsdGVyID0gdGhpcy5idWlsZEZpbHRlcigpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSwgZmlsdGVyKSkgewotCQkJYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKFBSRUZJWCkpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdGaWx0ZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGROZXN0ZWRJdGVyYWJsZSgpKTsKLQkJdHJ5IHsKLQkJCUl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBpdGVyYWJsZS5pdGVyYXRvcigpOwotCQkJZmFpbCgiYm9ndXMgaXRlcmF0b3I6ICIgKyBpdGVyYXRvcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJpbmdJdGVyYWJsZSh0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkRmlsdGVyaW5nSXRlcmFibGUoSXRlcmFibGU8U3RyaW5nPiBuZXN0ZWRJdGVyYWJsZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4obmVzdGVkSXRlcmFibGUpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChQUkVGSVgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKFBSRUZJWCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmFibGUoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKFBSRUZJWCArICIxIik7Ci0JCWMuYWRkKFBSRUZJWCArICIyIik7Ci0JCWMuYWRkKFBSRUZJWCArICIzIik7Ci0JCWMuYWRkKCI0Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI1Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI2Iik7Ci0JCWMuYWRkKFBSRUZJWCArICI3Iik7Ci0JCWMuYWRkKCI4Iik7Ci0JCXJldHVybiBjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9HcmFwaEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvR3JhcGhJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMzljNDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9HcmFwaEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5HcmFwaEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuR3JhcGhJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHcmFwaEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JLyoqIHRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbGwgdGhlIG5vZGVzIGNyZWF0ZWQgZm9yIHRoZSB0ZXN0ICovCi0JQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxHcmFwaE5vZGU+KCk7Ci0KLQlwdWJsaWMgR3JhcGhJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVpZ2hib3JzMSgpIHsKLQkJZm9yIChHcmFwaE5vZGUgZ24gOiB0aGlzLmJ1aWxkR3JhcGhJdGVyYWJsZTEoKSkgewotCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhYmxlMSgpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhYmxlPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWlnaGJvcnMyKCkgewotCQlmb3IgKEdyYXBoTm9kZSBnbiA6IHRoaXMuYnVpbGRHcmFwaEl0ZXJhYmxlMigpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnMoZ24pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmFibGUyKCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmFibGU8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCksIHRoaXMuYnVpbGRNaXN0ZXJSb2dlcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5laWdoYm9yczMoKSB7Ci0JCWZvciAoR3JhcGhOb2RlIGduIDogdGhpcy5idWlsZEdyYXBoSXRlcmFibGUzKCkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyhnbikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYWJsZTMoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYWJsZTxHcmFwaE5vZGU+KG5ldyBHcmFwaE5vZGVbXSB7IHRoaXMuYnVpbGRHcmFwaFJvb3QoKSB9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZWlnaGJvcnM0KCkgewotCQlmb3IgKEdyYXBoTm9kZSBnbiA6IHRoaXMuYnVpbGRHcmFwaEl0ZXJhYmxlNCgpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnMoZ24pKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8R3JhcGhOb2RlPiBidWlsZEdyYXBoSXRlcmFibGU0KCkgewotCQlyZXR1cm4gbmV3IEdyYXBoSXRlcmFibGU8R3JhcGhOb2RlPihuZXcgR3JhcGhOb2RlW10geyB0aGlzLmJ1aWxkR3JhcGhSb290KCkgfSwgdGhpcy5idWlsZE1pc3RlclJvZ2VycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEdyYXBoSXRlcmFibGUxKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pc3NpbmdNaXN0ZXJSb2dlcnMoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZvciAoR3JhcGhOb2RlIGduIDogbmV3IEdyYXBoSXRlcmFibGU8R3JhcGhOb2RlPih0aGlzLmJ1aWxkR3JhcGhSb290KCkpKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKGduKSk7Ci0JCQl9Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoSXRlcmF0b3IuTWlzdGVyUm9nZXJzPEdyYXBoTm9kZT4gYnVpbGRNaXN0ZXJSb2dlcnMoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxHcmFwaE5vZGU+IG5laWdoYm9ycyhHcmFwaE5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0Lm5laWdoYm9ycygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgR3JhcGhOb2RlIGJ1aWxkR3JhcGhSb290KCkgewotCQlHcmFwaE5vZGUgbmNOb2RlID0gbmV3IEdyYXBoTm9kZSgiTm9ydGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIHZhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlZpcmdpbmlhIik7Ci0JCUdyYXBoTm9kZSBzY05vZGUgPSBuZXcgR3JhcGhOb2RlKCJTb3V0aCBDYXJvbGluYSIpOwotCQlHcmFwaE5vZGUgZ2FOb2RlID0gbmV3IEdyYXBoTm9kZSgiR2VvcmdpYSIpOwotCQlHcmFwaE5vZGUgZmxOb2RlID0gbmV3IEdyYXBoTm9kZSgiRmxvcmlkYSIpOwotCQlHcmFwaE5vZGUgYWxOb2RlID0gbmV3IEdyYXBoTm9kZSgiQWxhYmFtYSIpOwotCQlHcmFwaE5vZGUgbXNOb2RlID0gbmV3IEdyYXBoTm9kZSgiTWlzc2lzc2lwcGkiKTsKLQkJR3JhcGhOb2RlIHRuTm9kZSA9IG5ldyBHcmFwaE5vZGUoIlRlbm5lc3NlZSIpOwotCi0JCW5jTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgdmFOb2RlLCBzY05vZGUsIGdhTm9kZSwgdG5Ob2RlIH0pOwotCQl2YU5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgdG5Ob2RlIH0pOwotCQlzY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgZ2FOb2RlIH0pOwotCQlnYU5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IG5jTm9kZSwgc2NOb2RlLCBmbE5vZGUsIGFsTm9kZSwgdG5Ob2RlIH0pOwotCQlmbE5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGdhTm9kZSB9KTsKLQkJYWxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUsIG1zTm9kZSwgdG5Ob2RlIH0pOwotCQltc05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IGFsTm9kZSwgdG5Ob2RlIH0pOwotCQl0bk5vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgbmNOb2RlLCBnYU5vZGUsIGFsTm9kZSwgbXNOb2RlIH0pOwotCi0JCXJldHVybiBuY05vZGU7Ci0JfQotCi0JcHVibGljIGNsYXNzIEdyYXBoTm9kZSB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPEdyYXBoTm9kZT4gbmVpZ2hib3JzID0gbmV3IEFycmF5TGlzdDxHcmFwaE5vZGU+KCk7Ci0KLQkJcHVibGljIEdyYXBoTm9kZShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCUdyYXBoSXRlcmFibGVUZXN0cy50aGlzLm5vZGVzLmFkZCh0aGlzKTsgLy8gbG9nIG5vZGUKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0KLQkJdm9pZCBzZXROZWlnaGJvcnMoR3JhcGhOb2RlW10gbmVpZ2hib3JzKSB7Ci0JCQl0aGlzLm5laWdoYm9ycyA9IENvbGxlY3Rpb25Ub29scy5saXN0KG5laWdoYm9ycyk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZWlnaGJvcnMuaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgbmVpZ2hib3JzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm5laWdoYm9ycy5zaXplKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiR3JhcGhOb2RlKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0pwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9KcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRhNTYwZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0pwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBkZWNlbnRyYWxpemUgdGVzdCBjcmVhdGlvbiBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5SXRlcmFibGVzVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlJdGVyYWJsZXNUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXJyYXlJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5TGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhaW5JdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW1wdHlJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5TGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdyYXBoSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXZlQ2xvbmVJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExpdmVDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlZWthYmxlSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShRdWV1ZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlMaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YWNrSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlSXRlcmFibGVUZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VXRpbGl0eUl0ZXJhYmxlc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvTGl2ZUNsb25lSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmRlN2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGl2ZUNsb25lSXRlcmFibGVUZXN0cyBleHRlbmRzIENsb25lSXRlcmFibGVUZXN0cyB7Ci0KLQlwdWJsaWMgTGl2ZUNsb25lSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXN1cGVyLnRlc3RJdGVyYXRvcigpOwotCQkvLyBpdGVyYWJsZSBzaG91bGQgbm93IHJldHVybiBvbmx5IDMgc3RyaW5ncyAoc2luY2UgaXQncyAibGl2ZSIpCi0JCWludCBpID0gMDsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuaXRlcmFibGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMywgaSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJc3VwZXIudGVzdFJlbW92ZSgpOwotCQkvLyAibGl2ZSIgY2xvbmUgaXRlcmFibGUgd2lsbCBubyBsb25nZXIgY29udGFpbiB0aGUgZWxlbWVudCByZW1vdmVkIGZyb20gdGhlCi0JCS8vIG9yaWdpbmFsIGNvbGxlY3Rpb24KLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0aHJlZSIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlcigpIHsKLQkJc3VwZXIudGVzdFJlbW92ZXIoKTsKLQkJLy8gImxpdmUiIGNsb25lIGl0ZXJhYmxlIHdpbGwgbm8gbG9uZ2VyIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidGhyZWUiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFN0cmluZz4oYykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgY3VycmVudCkgewotCQkJCQljLnJlbW92ZShjdXJyZW50KTsKLQkJCQl9Ci0JCQl9OwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZVdpdGhSZW1vdmVyKExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8U3RyaW5nPihjLCB0aGlzLmJ1aWxkUmVtb3ZlcihjKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL0xpdmVDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzBjMDAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9MaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBMaXZlQ2xvbmVMaXN0SXRlcmFibGVUZXN0cyBleHRlbmRzIExpdmVDbG9uZUl0ZXJhYmxlVGVzdHMgewotCi0JcHVibGljIExpdmVDbG9uZUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0d28iKSkgewotCQkJCWl0ZXJhdG9yLmFkZChhZGRlZCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShjb2xsZWN0aW9uLmNvbnRhaW5zKGFkZGVkKSk7Ci0JCS8vICJsaXZlIiBjbG9uZSBpdGVyYWJsZSB3aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgYWRkZWQgdG8gdGhlCi0JCS8vIG9yaWdpbmFsIGNvbGxlY3Rpb24KLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ011dGF0b3JBZGQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJCQlmYWlsKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0d28iKSkgewotCQkJCWl0ZXJhdG9yLnNldChhZGRlZCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShjb2xsZWN0aW9uLmNvbnRhaW5zKGFkZGVkKSk7Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMoInR3byIpKTsKLQkJLy8gImxpdmUiIGNsb25lIGl0ZXJhYmxlIHdpbGwgY29udGFpbiB0aGUgZWxlbWVudCBhZGRlZCB0byB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgInR3byIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ011dGF0b3JTZXQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5zZXQoYWRkZWQpOwotCQkJCQlmYWlsKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZShMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGZpbmFsIExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4oYykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBlbGVtZW50KSB7Ci0JCQkJCWMuYWRkKGluZGV4LCBlbGVtZW50KTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQkJCQljLnJlbW92ZShpbmRleCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBlbGVtZW50KSB7Ci0JCQkJCWMuc2V0KGluZGV4LCBlbGVtZW50KTsKLQkJCQl9Ci0JCQl9OwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZVdpdGhSZW1vdmVyKExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4oYywgdGhpcy5idWlsZE11dGF0b3IoYykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9QZWVrYWJsZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUGVla2FibGVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDk5MmUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9QZWVrYWJsZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlBlZWthYmxlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZWVrYWJsZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUGVla2FibGVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJUGVla2FibGVJdGVyYWJsZTxTdHJpbmc+IGl0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKCk7Ci0JCVBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IGl0ZXJhYmxlLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygib25lIiwgaXRlcmF0b3IucGVlaygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsib25lIiwgInR3byIsICJ0aHJlZSJ9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9RdWV1ZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUXVldWVJdGVyYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWYzMzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9RdWV1ZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5RdWV1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlUXVldWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5RdWV1ZUl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBRdWV1ZUl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUXVldWVJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBpdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZSgpOwotCQlmb3IgKFN0cmluZyBzIDogaXRlcmFibGUpIHsKLQkJCWFzc2VydE5vdE51bGwocyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUXVldWVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGRRdWV1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFF1ZXVlPFN0cmluZz4gYnVpbGRRdWV1ZSgpIHsKLQkJUXVldWU8U3RyaW5nPiBxID0gbmV3IFNpbXBsZVF1ZXVlPFN0cmluZz4oKTsKLQkJcS5lbnF1ZXVlKCJmb28iKTsKLQkJcS5lbnF1ZXVlKCJiYXIiKTsKLQkJcS5lbnF1ZXVlKCJiYXoiKTsKLQkJcmV0dXJuIHE7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjE3YjM5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTEgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKTsKLQotCQlMaXN0PFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGxpMiA9IG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGxpMSwgbGkyKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MSgpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTEgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGxpMSwgIjQiKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFN0cmluZyBzIDogY29tcG9zaXRlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXh0cmFFbGVtZW50MigpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMSIpOwotCQljMS5hZGQoIjIiKTsKLQkJYzEuYWRkKCIzIik7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGxpMSA9IG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzEpOwotCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4oIjAiLCBsaTEpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uT2ZJdGVyYWJsZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoIjAiKTsKLQkJYzEuYWRkKCIxIik7Ci0JCWMxLmFkZCgiMiIpOwotCQljMS5hZGQoIjMiKTsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gbGkxID0gbmV3IExpc3RMaXN0SXRlcmFibGU8U3RyaW5nPihjMSk7Ci0KLQkJTGlzdDxTdHJpbmc+IGMyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMyLmFkZCgiNCIpOwotCQljMi5hZGQoIjUiKTsKLQkJYzIuYWRkKCI2Iik7Ci0JCWMyLmFkZCgiNyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTIgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMyKTsKLQotCQlMaXN0PExpc3RJdGVyYWJsZTxTdHJpbmc+PiBjb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxMaXN0SXRlcmFibGU8U3RyaW5nPj4oKTsKLQkJY29sbGVjdGlvbi5hZGQobGkxKTsKLQkJY29sbGVjdGlvbi5hZGQobGkyKTsKLQkJTGlzdEl0ZXJhYmxlPExpc3RJdGVyYWJsZTxTdHJpbmc+PiBsaSA9IG5ldyBMaXN0TGlzdEl0ZXJhYmxlPExpc3RJdGVyYWJsZTxTdHJpbmc+Pihjb2xsZWN0aW9uKTsKLQkJCi0JCUl0ZXJhYmxlPFN0cmluZz4gY29tcG9zaXRlID0gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhYmxlPFN0cmluZz4obGkpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiBjb21wb3NpdGUpIHsKLQkJCWFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihpKyspLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJTGlzdDxTdHJpbmc+IGMxID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMxLmFkZCgiMCIpOwotCQljMS5hZGQoIjEiKTsKLQkJYzEuYWRkKCIyIik7Ci0JCWMxLmFkZCgiMyIpOwotCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBsaTEgPSBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KGMxKTsKLQotCQlMaXN0PFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCI0Iik7Ci0JCWMyLmFkZCgiNSIpOwotCQljMi5hZGQoIjYiKTsKLQkJYzIuYWRkKCI3Iik7Ci0JCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGxpMiA9IG5ldyBMaXN0TGlzdEl0ZXJhYmxlPFN0cmluZz4oYzIpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYWJsZTxTdHJpbmc+IGNvbXBvc2l0ZSA9IG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGxpMSwgbGkyKTsKLQkJYXNzZXJ0Tm90TnVsbChjb21wb3NpdGUudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5OTg1MS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5SXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlJlYWRPbmx5SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFZlY3RvcigpLml0ZXJhdG9yKCk7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMobmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYWJsZSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZFJlYWRPbmx5SXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGRWZWN0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9SZWFkT25seUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE5MjNmZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1JlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuUmVhZE9ubHlMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5TGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUmVhZE9ubHlMaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVmVjdG9yKCkuaXRlcmF0b3IoKTsKLQkJZm9yIChTdHJpbmcgcyA6IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYWJsZSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMobmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYWJsZSgpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhYmxlKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhYmxlKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhYmxlPFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0SXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgTGlzdExpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYnVpbGRWZWN0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TaW5nbGVFbGVtZW50SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTA2MWQzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhYmxlKCkpIHsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSwgcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmFibGUoKS5pdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyaW5nKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmFibGUoKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscyh0aGlzLnNpbmdsZUVsZW1lbnQoKSkpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhYmxlKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTE1MjBmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlmb3IgKFN0cmluZyBzIDogdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKSkgewotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpLCBzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKS5pdGVyYXRvcigpOwotCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyaW5nKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHModGhpcy5zaW5nbGVFbGVtZW50KCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGUoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMuc2luZ2xlRWxlbWVudCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNpbmdsZUVsZW1lbnQoKSB7Ci0JCXJldHVybiAic2luZ2xlIGVsZW1lbnQiOwotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0MDA2Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNuYXBzaG90Q2xvbmVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgQ2xvbmVJdGVyYWJsZVRlc3RzIHsKLQotCXB1YmxpYyBTbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXN1cGVyLnRlc3RJdGVyYXRvcigpOwotCQkvLyAic25hcHNob3QiIGl0ZXJhYmxlIHNob3VsZCBzdGlsbCByZXR1cm4gNCBzdHJpbmdzIChzaW5jZSB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbiB3YXMgY2xvbmVkKQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoU3RyaW5nIHMgOiB0aGlzLml0ZXJhYmxlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoU3RyaW5nLnZhbHVlT2YoaSsrKSwgcyk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDQsIGkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCXN1cGVyLnRlc3RSZW1vdmUoKTsKLQkJLy8gInNuYXBzaG90IiBjbG9uZSBpdGVyYWJsZSB3aWxsIHN0aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0aHJlZSIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlcigpIHsKLQkJc3VwZXIudGVzdFJlbW92ZXIoKTsKLQkJLy8gInNuYXBzaG90IiBjbG9uZSBpdGVyYWJsZSB3aWxsIHN0aWxsIGNvbnRhaW4gdGhlIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIHRoZQotCQkvLyBvcmlnaW5hbCBjb2xsZWN0aW9uCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0aHJlZSIpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGUoTGlzdDxTdHJpbmc+IGMpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPihjKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkUmVtb3ZpbmdJdGVyYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCByZW1vdmUoU3RyaW5nIGN1cnJlbnQpIHsKLQkJCQkJYy5yZW1vdmUoY3VycmVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxTdHJpbmc+KGMsIHRoaXMuYnVpbGRSZW1vdmVyKGMpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1NuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmM1YzEzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTbmFwc2hvdENsb25lTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBTbmFwc2hvdENsb25lSXRlcmFibGVUZXN0cyB7Ci0KLQlwdWJsaWMgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0d28iKSkgewotCQkJCWl0ZXJhdG9yLmFkZChhZGRlZCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShjb2xsZWN0aW9uLmNvbnRhaW5zKGFkZGVkKSk7Ci0JCS8vICJzbmFwc2hvdCIgY2xvbmUgaXRlcmFibGUgbm90IHdpbGwgY29udGFpbiB0aGUgZWxlbWVudCBhZGRlZCB0byB0aGUKLQkJLy8gb3JpZ2luYWwgY29sbGVjdGlvbgotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ011dGF0b3JBZGQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRJdGVyYWJsZShjb2xsZWN0aW9uKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLml0ZXJhYmxlLnRvU3RyaW5nKCkpOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5pdGVyYWJsZS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJCQlmYWlsKCk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWZpbmFsIExpc3Q8U3RyaW5nPiBjb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJdGhpcy5pdGVyYWJsZSA9IHRoaXMuYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCi0JCVN0cmluZyBhZGRlZCA9ICJ4eHh4IjsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsIGFkZGVkKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuaXRlcmFibGUsICJ0d28iKSk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuaXRlcmFibGUuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKLQkJCWlmIChpdGVyYXRvci5uZXh0KCkuZXF1YWxzKCJ0d28iKSkgewotCQkJCWl0ZXJhdG9yLnNldChhZGRlZCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShjb2xsZWN0aW9uLmNvbnRhaW5zKGFkZGVkKSk7Ci0JCWFzc2VydEZhbHNlKGNvbGxlY3Rpb24uY29udGFpbnMoInR3byIpKTsKLQkJLy8gInNuYXBzaG90IiBjbG9uZSBpdGVyYWJsZSB3aWxsIG5vdCBiZSBjaGFuZ2VkCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCBhZGRlZCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLml0ZXJhYmxlLCAidHdvIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTXV0YXRvclNldCgpIHsKLQkJZmluYWwgTGlzdDxTdHJpbmc+IGNvbGxlY3Rpb24gPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpOwotCQl0aGlzLml0ZXJhYmxlID0gdGhpcy5idWlsZEl0ZXJhYmxlKGNvbGxlY3Rpb24pOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0KLQkJU3RyaW5nIGFkZGVkID0gInh4eHgiOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5pdGVyYWJsZSwgYWRkZWQpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLml0ZXJhYmxlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAoaXRlcmF0b3IubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnNldChhZGRlZCk7Ci0JCQkJCWZhaWwoKTsKLQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmFibGU8U3RyaW5nPiBidWlsZEl0ZXJhYmxlKExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhYmxlPFN0cmluZz4gYnVpbGRSZW1vdmluZ0l0ZXJhYmxlKGZpbmFsIExpc3Q8U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgU25hcHNob3RDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KGMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLmFkZChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQkJYy5yZW1vdmUoaW5kZXgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotCQkJCQljLnNldChpbmRleCwgZWxlbWVudCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkSXRlcmFibGVXaXRoUmVtb3ZlcihMaXN0PFN0cmluZz4gYykgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPihjLCB0aGlzLmJ1aWxkTXV0YXRvcihjKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9TdGFja0l0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhOTViYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N0YWNrSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZVN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN0YWNrSXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN0YWNrSXRlcmFibGVUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTdGFja0l0ZXJhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZEl0ZXJhYmxlKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidHdvIiwgaXRlcmF0b3IubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBpdGVyYXRvci5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkSXRlcmFibGUoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gYnVpbGRJdGVyYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBTdGFja0l0ZXJhYmxlPFN0cmluZz4odGhpcy5idWlsZFN0YWNrKCkpOwotCX0KLQotCXByaXZhdGUgU3RhY2s8U3RyaW5nPiBidWlsZFN0YWNrKCkgewotCQlTdGFjazxTdHJpbmc+IHN0YWNrID0gbmV3IFNpbXBsZVN0YWNrPFN0cmluZz4oKTsKLQkJc3RhY2sucHVzaCgib25lIik7Ci0JCXN0YWNrLnB1c2goInR3byIpOwotCQlzdGFjay5wdXNoKCJ0aHJlZSIpOwotCQlyZXR1cm4gc3RhY2s7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1N1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjU2MDhlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvU3VwZXJJdGVyYWJsZVdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmFibGVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVySXRlcmFibGVXcmFwcGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdXBlckl0ZXJhYmxlV3JhcHBlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFN1cGVySXRlcmFibGVXcmFwcGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWxpc3QuYWRkKCJmb28iKTsKLQkJbGlzdC5hZGQoImJhciIpOwotCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCVN0cmluZyBjb25jYXQgPSAiIjsKLQkJZm9yIChTdHJpbmcgcyA6IGxpc3QpIHsKLQkJCWNvbmNhdCArPSBzOwotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyYmF6IiwgY29uY2F0KTsKLQotCQlJdGVyYWJsZTxPYmplY3Q+IGl0ZXJhYmxlID0gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPE9iamVjdD4obGlzdCk7Ci0JCWNvbmNhdCA9ICIiOwotCQlmb3IgKE9iamVjdCBzIDogaXRlcmFibGUpIHsKLQkJCWNvbmNhdCArPSBzOwotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyYmF6IiwgY29uY2F0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCUl0ZXJhYmxlPE9iamVjdD4gaXRlcmFibGUgPSBuZXcgU3VwZXJJdGVyYWJsZVdyYXBwZXI8T2JqZWN0PihDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoaXRlcmFibGUudG9TdHJpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExNmRlNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uSXRlcmFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhYmxlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm0xKCkgewotCQlpbnQgaSA9IDE7Ci0JCWZvciAoSW50ZWdlciBpbnRlZ2VyIDogdGhpcy5idWlsZEl0ZXJhYmxlMSgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSsrLCBpbnRlZ2VyLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZEl0ZXJhYmxlMSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlMSh0aGlzLmJ1aWxkTmVzdGVkSXRlcmFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmFibGUxKEl0ZXJhYmxlPFN0cmluZz4gbmVzdGVkSXRlcmFibGUpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYWJsZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybTIoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiB0aGlzLmJ1aWxkSXRlcmFibGUyKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkSXRlcmFibGUyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmFibGUyKHRoaXMuYnVpbGROZXN0ZWRJdGVyYWJsZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYWJsZTIoSXRlcmFibGU8U3RyaW5nPiBuZXN0ZWRJdGVyYWJsZSkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhYmxlLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhYmxlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZTEoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1RyYW5zZm9ybWVyKCkgewotCQlJdGVyYWJsZTxJbnRlZ2VyPiBpdGVyYWJsZSA9IG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgSW50ZWdlcj4odGhpcy5idWlsZE5lc3RlZEl0ZXJhYmxlKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpbnQgaSA9IDE7Ci0JCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IGl0ZXJhYmxlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFjNmExNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmFibGVzL1RyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtMSgpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IHRoaXMuYnVpbGRJdGVyYWJsZTEoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRJdGVyYWJsZTEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUxKHRoaXMuYnVpbGROZXN0ZWRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTEoTGlzdDxTdHJpbmc+IG5lc3RlZExpc3QpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlPFN0cmluZywgSW50ZWdlcj4obmVzdGVkTGlzdCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybTIoKSB7Ci0JCWludCBpID0gMTsKLQkJZm9yIChJbnRlZ2VyIGludGVnZXIgOiB0aGlzLmJ1aWxkSXRlcmFibGUyKCkpIHsKLQkJCWFzc2VydEVxdWFscyhpKyssIGludGVnZXIuaW50VmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkSXRlcmFibGUyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhYmxlMih0aGlzLmJ1aWxkTmVzdGVkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmFibGUyKExpc3Q8U3RyaW5nPiBuZXN0ZWRMaXN0KSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KG5lc3RlZExpc3QsIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGROZXN0ZWRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiMSIpOwotCQljLmFkZCgiMjIiKTsKLQkJYy5hZGQoIjMzMyIpOwotCQljLmFkZCgiNDQ0NCIpOwotCQljLmFkZCgiNTU1NTUiKTsKLQkJYy5hZGQoIjY2NjY2NiIpOwotCQljLmFkZCgiNzc3Nzc3NyIpOwotCQljLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuYnVpbGRJdGVyYWJsZTEoKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1RyYW5zZm9ybWVyKCkgewotCQlJdGVyYWJsZTxJbnRlZ2VyPiBpdGVyYWJsZSA9IG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYWJsZTxTdHJpbmcsIEludGVnZXI+KHRoaXMuYnVpbGROZXN0ZWRMaXN0KCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpbnQgaSA9IDE7Ci0JCQlmb3IgKEludGVnZXIgaW50ZWdlciA6IGl0ZXJhYmxlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKGkrKywgaW50ZWdlci5pbnRWYWx1ZSgpKTsKLQkJCX0KLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGVUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhYmxlcy9UcmVlSXRlcmFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGEzNTMzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYWJsZXMvVHJlZUl0ZXJhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYWJsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJlZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJlZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyZWVJdGVyYWJsZVRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCS8qKiB0aGlzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYWxsIHRoZSBub2RlcyBjcmVhdGVkIGZvciB0aGUgdGVzdCAqLwotCUNvbGxlY3Rpb248VHJlZU5vZGU+IG5vZGVzID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQotCXB1YmxpYyBUcmVlSXRlcmFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yMSgpIHsKLQkJZm9yIChUcmVlTm9kZSB0biA6IHRoaXMuYnVpbGRUcmVlSXRlcmFibGUxKCkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyh0bikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yMigpIHsKLQkJZm9yIChUcmVlTm9kZSB0biA6IHRoaXMuYnVpbGRUcmVlSXRlcmFibGUyKCkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyh0bikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pZHdpZmUxKCkgewotCQlmb3IgKFRyZWVOb2RlIHRuIDogbmV3IFRyZWVJdGVyYWJsZTxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSwgdGhpcy5idWlsZE1pZHdpZmUoKSkpIHsKLQkJCWFzc2VydFRydWUodGhpcy5ub2Rlcy5jb250YWlucyh0bikpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1pZHdpZmUyKCkgewotCQlmb3IgKFRyZWVOb2RlIHRuIDogbmV3IFRyZWVJdGVyYWJsZTxUcmVlTm9kZT4obmV3IFRyZWVOb2RlW10geyB0aGlzLmJ1aWxkVHJlZSgpIH0sIHRoaXMuYnVpbGRNaWR3aWZlKCkpKSB7Ci0JCQlhc3NlcnRUcnVlKHRoaXMubm9kZXMuY29udGFpbnModG4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmJ1aWxkVHJlZUl0ZXJhYmxlMSgpLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nTWlkd2lmZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJZm9yIChUcmVlTm9kZSB0biA6IG5ldyBUcmVlSXRlcmFibGU8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCkpKSB7Ci0JCQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVzLmNvbnRhaW5zKHRuKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFRyZWVOb2RlPiBidWlsZFRyZWVJdGVyYWJsZTEoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhYmxlPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmFibGUyKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYWJsZTxUcmVlTm9kZT4obmV3IFRyZWVOb2RlW10geyB0aGlzLmJ1aWxkVHJlZSgpIH0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbihUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVJdGVyYXRvci5NaWR3aWZlPFRyZWVOb2RlPiBidWlsZE1pZHdpZmUoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yLk1pZHdpZmU8VHJlZU5vZGU+KCkgewotCQkJcHVibGljIEl0ZXJhdG9yPFRyZWVOb2RlPiBjaGlsZHJlbihUcmVlTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVOb2RlIGJ1aWxkVHJlZSgpIHsKLQkJVHJlZU5vZGUgcm9vdCA9IG5ldyBUcmVlTm9kZSgicm9vdCIpOwotCQlUcmVlTm9kZSBjaGlsZDEgPSBuZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDEiKTsKLQkJbmV3IFRyZWVOb2RlKGNoaWxkMSwgImdyYW5kY2hpbGQgMUEiKTsKLQkJVHJlZU5vZGUgY2hpbGQyID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAyIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJBIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQiA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJCIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkIsICJncmVhdC1ncmFuZGNoaWxkIDJCMSIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjIiKTsKLQkJVHJlZU5vZGUgZ3JhbmRjaGlsZDJDID0gbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkMiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQywgImdyZWF0LWdyYW5kY2hpbGQgMkMxIik7Ci0JCW5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMyIpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVHJlZU5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIENvbGxlY3Rpb248VHJlZU5vZGU+IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxUcmVlTm9kZT4oKTsKLQotCQlwdWJsaWMgVHJlZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlUcmVlSXRlcmFibGVUZXN0cy50aGlzLm5vZGVzLmFkZCh0aGlzKTsgLy8gbG9nIG5vZGUKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGUoVHJlZU5vZGUgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcyhuYW1lKTsKLQkJCXBhcmVudC5hZGRDaGlsZCh0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQ2hpbGQoVHJlZU5vZGUgY2hpbGQpIHsKLQkJCXRoaXMuY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBjaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbi5zaXplKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVHJlZU5vZGUoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOGNkYTAuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXJyYXlJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEFycmF5SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEFycmF5KCkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAxOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgaSsrLCBJbnRlZ2VyLnBhcnNlSW50KHN0cmVhbS5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigtMSwgMSk7Ci0JCXRoaXMudHJpZ2dlcklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbig4LCAxKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIC0xKTsKLQkJdGhpcy50cmlnZ2VySWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKDAsIDkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmljcygpIHsKLQkJSW50ZWdlcltdIGludGVnZXJzID0gbmV3IEludGVnZXJbM107Ci0JCWludGVnZXJzWzBdID0gbmV3IEludGVnZXIoMCk7Ci0JCWludGVnZXJzWzFdID0gbmV3IEludGVnZXIoMSk7Ci0JCWludGVnZXJzWzJdID0gbmV3IEludGVnZXIoMik7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRHZW5lcmljSXRlcmF0b3IoaW50ZWdlcnMpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoaW50ZWdlcnMubGVuZ3RoLCBpKTsKLQl9Ci0KLQlJdGVyYXRvcjxOdW1iZXI+IGJ1aWxkR2VuZXJpY0l0ZXJhdG9yKEludGVnZXJbXSBpbnRlZ2VycykgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihpbnRlZ2Vycyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhcmFyZ3MoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxOdW1iZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRWYXJBcmdJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKGkrKywgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMywgaSk7Ci0JfQotCi0JSXRlcmF0b3I8TnVtYmVyPiBidWlsZFZhckFyZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TnVtYmVyPihuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMSksIG5ldyBJbnRlZ2VyKDIpKTsKLQl9Ci0KLQl2b2lkIHRyaWdnZXJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKHN0YXJ0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmVhbSwgZXhDYXVnaHQpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJdGVyYXRvcih0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKFN0cmluZ1tdIGFycmF5KSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcihTdHJpbmdbXSBhcnJheSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KGFycmF5LCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlTdHJpbmdbXSBidWlsZEFycmF5KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIgfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQXJyYXlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZTE3NjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9BcnJheUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5TGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBcnJheUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgQXJyYXlJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBBcnJheUxpc3RJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRBcnJheSgpLmxlbmd0aCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWludCBpID0gdGhpcy5idWlsZEFycmF5KCkubGVuZ3RoOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGktLSwgSW50ZWdlci5wYXJzZUludChzdHJlYW0ucHJldmlvdXMoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleCgpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZExpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25BZGQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoIjMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5hZGQoIjMuNSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25TZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkTGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoIjMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoInRocmVlIik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCUl0ZXJhdG9yPE51bWJlcj4gYnVpbGRHZW5lcmljSXRlcmF0b3IoSW50ZWdlcltdIGludGVnZXJzKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8TnVtYmVyPihpbnRlZ2Vycyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JSXRlcmF0b3I8TnVtYmVyPiBidWlsZFZhckFyZ0l0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPE51bWJlcj4obmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEpLCBuZXcgSW50ZWdlcigyKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0SXRlcmF0b3IodGhpcy5idWlsZEFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRMaXN0SXRlcmF0b3IoU3RyaW5nW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXkpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxTdHJpbmc+KGFycmF5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoU3RyaW5nW10gYXJyYXksIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFN0cmluZz4oYXJyYXksIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2hhaW5JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0Y2RjZjEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DaGFpbkl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2hhaW5JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2hhaW5JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgZmluYWwgc3RhdGljIENsYXNzPD8+W10gVkVDVE9SX0hJRVJBUkNIWSA9IHsgVmVjdG9yLmNsYXNzLCBBYnN0cmFjdExpc3QuY2xhc3MsIEFic3RyYWN0Q29sbGVjdGlvbi5jbGFzcywgT2JqZWN0LmNsYXNzIH07Ci0KLQlwdWJsaWMgQ2hhaW5JdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoVkVDVE9SX0hJRVJBUkNIWS5sZW5ndGgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKFZFQ1RPUl9ISUVSQVJDSFkubGVuZ3RoLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGxpbmsiLCBWRUNUT1JfSElFUkFSQ0hZW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGxpbmsiLCBWRUNUT1JfSElFUkFSQ0hZW2ldLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPENsYXNzPD8+PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJQ2xhc3M8Pz4gamF2YUNsYXNzID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWphdmFDbGFzcyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWphdmFDbGFzcyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBqYXZhQ2xhc3MsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvcjxDbGFzczw/Pj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKSA9PSBBYnN0cmFjdENvbGxlY3Rpb24uY2xhc3MpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2hhaW5JdGVyYXRvcihWZWN0b3IuY2xhc3MsIHRoaXMuYnVpbGRMaW5rZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRJbm5lckl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZElubmVyQ2hhaW5JdGVyYXRvcihWZWN0b3IuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8Q2xhc3M8Pz4+IGJ1aWxkQ2hhaW5JdGVyYXRvcihDbGFzczw/PiBzdGFydExpbmssIENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PiBsaW5rZXIpIHsKLQkJcmV0dXJuIG5ldyBDaGFpbkl0ZXJhdG9yPENsYXNzPD8+PihzdGFydExpbmssIGxpbmtlcik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFpbkl0ZXJhdG9yLkxpbmtlcjxDbGFzczw/Pj4gYnVpbGRMaW5rZXIoKSB7Ci0JCS8vIGNoYWluIHVwIHRoZSBjbGFzcydzIGhpZXJhcmNoeQotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3IuTGlua2VyPENsYXNzPD8+PigpIHsKLQkJCXB1YmxpYyBDbGFzczw/PiBuZXh0TGluayhDbGFzczw/PiBjdXJyZW50TGluaykgewotCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxDbGFzczw/Pj4gYnVpbGRJbm5lckNoYWluSXRlcmF0b3IoQ2xhc3M8Pz4gc3RhcnRMaW5rKSB7Ci0JCS8vIGNoYWluIHVwIHRoZSBjbGFzcydzIGhpZXJhcmNoeQotCQlyZXR1cm4gbmV3IENoYWluSXRlcmF0b3I8Q2xhc3M8Pz4+KHN0YXJ0TGluaykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2xhc3M8Pz4gbmV4dExpbmsoQ2xhc3M8Pz4gY3VycmVudExpbmspIHsKLQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0U3VwZXJjbGFzcygpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ2hhaW5JdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8Q2xhc3M8Pz4+IGl0ZXJhdG9yID0gbmV3IENoYWluSXRlcmF0b3I8Q2xhc3M8Pz4+KFZlY3Rvci5jbGFzcyk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNsYXNzPD8+IGMgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGNsYXNzOiAiICsgYy5nZXROYW1lKCkpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0Nsb25lSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWM0NWRmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ2xvbmVJdGVyYXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlDb2xsZWN0aW9uPFN0cmluZz4gb3JpZ2luYWxDb2xsZWN0aW9uOwotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gY29uY3VycmVudENvbGxlY3Rpb247Ci0KLQlwdWJsaWMgQ2xvbmVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IG9yaWdpbmFsU2l6ZSA9IHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnNpemUoKTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVEZWZhdWx0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRWxpbWluYXRvcigpIHsKLQkJQ2xvbmVJdGVyYXRvci5SZW1vdmVyPFN0cmluZz4gZWxpbWluYXRvciA9IG5ldyBDbG9uZUl0ZXJhdG9yLlJlbW92ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgZWxlbWVudCkgewotCQkJCUNsb25lSXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5yZW1vdmUoZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbENvbGxlY3Rpb24sIGVsaW1pbmF0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3ViY2xhc3MoKSB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlKG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbENvbGxlY3Rpb24pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBjdXJyZW50KSB7Ci0JCQkJQ2xvbmVJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLnJlbW92ZShjdXJyZW50KTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBjb25jdXJyZW50IGFjY2VzczogRmlyc3QgYnVpbGQgYSBjbG9uZSBpdGVyYXRvciBpbiBhIHNlcGFyYXRlIHRocmVhZAotCSAqIHRoYXQgaGFuZ3MgbW9tZW50YXJpbHkgZHVyaW5nIGl0cyBjb25zdHJ1Y3Rpb247IHRoZW4gbW9kaWZ5IHRoZSBzaGFyZWQKLQkgKiBjb2xsZWN0aW9uIGluIHRoaXMgdGhyZWFkLiBUaGlzIHdvdWxkIGNhdXNlIGEKLQkgKiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGluIHRoZSBvdGhlciB0aHJlYWQgaWYgdGhlIGNsb25lIGl0ZXJhdG9yCi0JICogd2VyZSBub3Qgc3luY2hyb25pemVkIG9uIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDb25jdXJyZW50QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNsb3dDb2xsZWN0aW9uPFN0cmluZz4gc2xvdyA9IG5ldyBTbG93Q29sbGVjdGlvbjxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKHNsb3cpOwotCQkvLyB1c2luZyB0aGUgdW5zeW5jaHJvbml6ZWQgY29sbGVjdGlvbiB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKLQkJLy8JCXRoaXMub3JpZ2luYWxDb2xsZWN0aW9uID0gc2xvdzsKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24gPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRDb2xsZWN0aW9uKHNsb3cpOwotCi0JCXRoaXMuY29uY3VycmVudENvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJVGhyZWFkIHRocmVhZCA9IHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFJ1bm5hYmxlKCkpOwotCQl0aHJlYWQuc3RhcnQoKTsKLQkJd2hpbGUgKCAhIHNsb3cuaGFzU3RhcnRlZENsb25lKCkpIHsKLQkJCS8vIHdhaXQgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gc3RhcnQgdGhlIGNsb25lLi4uCi0JCQlUaHJlYWQueWllbGQoKTsKLQkJfQotCQkvLyAuLi50aGVuIHNuZWFrIGluIGFuIGV4dHJhIGVsZW1lbnQKLQkJdGhpcy5vcmlnaW5hbENvbGxlY3Rpb24uYWRkKCJzZXZlbnRlZW4iKTsKLQkJdGhyZWFkLmpvaW4oKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGV4cGVjdGVkID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGV4cGVjdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbmN1cnJlbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFJ1bm5hYmxlKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBydW5fKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0JCQkJQ2xvbmVJdGVyYXRvclRlc3RzLnRoaXMubG9vcFdpdGhDbG9uZUl0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogdXNlIGEgY2xvbmUgaXRlcmF0b3IgdG8gbG9vcCBvdmVyIHRoZSAic2xvdyIgY29sbGVjdGlvbiBhbmQgY29weSBpdHMKLQkgKiBjb250ZW50cyB0byB0aGUgY29uY3VycmVudCBjb2xsZWN0aW9uCi0JICovCi0Jdm9pZCBsb29wV2l0aENsb25lSXRlcmF0b3IoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJdGhpcy5jb25jdXJyZW50Q29sbGVjdGlvbi5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UmVtb3ZlKEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJT2JqZWN0IHJlbW92ZWQgPSAidGhyZWUiOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uLmNvbnRhaW5zKHJlbW92ZWQpKTsKLQkJLy8gdHJ5IHRvIHJlbW92ZSBiZWZvcmUgY2FsbGluZyAjbmV4dCgpCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaWYgKGl0ZXJhdG9yLm5leHQoKS5lcXVhbHMocmVtb3ZlZCkpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkvLyB0cnkgdG8gcmVtb3ZlIHR3aWNlCi0JCQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJCQl0cnkgewotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsQ29sbGVjdGlvbi5jb250YWlucyhyZW1vdmVkKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDbG9uZUl0ZXJhdG9yKHRoaXMub3JpZ2luYWxDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUl0ZXJhdG9yKENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KGMpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSB0aGlzLmJ1aWxkRW1wdHlDb2xsZWN0aW9uKCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGMpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkRW1wdHlDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCWMuYWRkKCJzaXgiKTsKLQkJYy5hZGQoInNldmVuIik7Ci0JCWMuYWRkKCJlaWdodCIpOwotCX0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIGNvbGxlY3Rpb24gKioqKioqKioqKgotCXN0YXRpYyBjbGFzcyBTbG93Q29sbGVjdGlvbjxFPiBleHRlbmRzIEFycmF5TGlzdDxFPiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIGJvb2xlYW4gaGFzU3RhcnRlZENsb25lID0gZmFsc2U7Ci0KLQkJcHVibGljIFNsb3dDb2xsZWN0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJCXRoaXMuc2V0SGFzU3RhcnRlZENsb25lKHRydWUpOwotCQkJLy8gdGFrZSBhIGxpdHRsZSBzbm9vemUgYmVmb3JlIHJldHVybmluZyB0aGUgYXJyYXkKLQkJCVRlc3RUb29scy5zbGVlcCgxMDApOwotCQkJcmV0dXJuIHN1cGVyLnRvQXJyYXkoKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIHNldEhhc1N0YXJ0ZWRDbG9uZShib29sZWFuIGhhc1N0YXJ0ZWRDbG9uZSkgewotCQkJdGhpcy5oYXNTdGFydGVkQ2xvbmUgPSBoYXNTdGFydGVkQ2xvbmU7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNTdGFydGVkQ2xvbmUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5oYXNTdGFydGVkQ2xvbmU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmM2E4NDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9DbG9uZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLk11bHRpVGhyZWFkZWRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDbG9uZUxpc3RJdGVyYXRvclRlc3RzCi0JZXh0ZW5kcyBNdWx0aVRocmVhZGVkVGVzdENhc2UKLXsKLQlMaXN0PFN0cmluZz4gb3JpZ2luYWxMaXN0OwotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gY29uY3VycmVudExpc3Q7Ci0KLQlwdWJsaWMgQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9yaWdpbmFsTGlzdCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBvcmlnaW5hbFNpemUgPSB0aGlzLm9yaWdpbmFsTGlzdC5zaXplKCk7Ci0JCWludCBpID0gMDsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQkvLyBzaG91bGQgYWxsb3cgY29uY3VycmVudCBtb2RpZmljYXRpb24KLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGV4KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBjbG9uZUxpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJY2xvbmVMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQljbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgY2xvbmVMaXN0SXRlcmF0b3IubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQotCQl3aGlsZSAobmVzdGVkTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWNsb25lTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dEluZGV4KCksIGNsb25lTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBjbG9uZUxpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1ByZXZpb3VzKCkgewotCQlpbnQgb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCXRoaXMub3JpZ2luYWxMaXN0LmFkZCgiZm9vIik7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShvcmlnaW5hbFNpemUgIT0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpKTsKLQkJb3JpZ2luYWxTaXplID0gdGhpcy5vcmlnaW5hbExpc3Quc2l6ZSgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJLy8gc2hvdWxkIGFsbG93IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uCi0JCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoImJhciIpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydFRydWUob3JpZ2luYWxTaXplICE9IHRoaXMub3JpZ2luYWxMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZENsb25lTGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQluZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLmFkZCgidGhyZWUgYW5kIGEgaGFsZiIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRDbG9uZUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnNldCgiYW5vdGhlciB0aHJlZSIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TXV0YXRvck5leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dChuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm9yaWdpbmFsTGlzdCwgdGhpcy5idWlsZE11dGF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhdG9yUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXMobmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5vcmlnaW5hbExpc3QsIHRoaXMuYnVpbGRNdXRhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENsb25lTGlzdEl0ZXJhdG9yLk11dGF0b3I8U3RyaW5nPiBidWlsZE11dGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3IuTXV0YXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgU3RyaW5nIG8pIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LmFkZChpbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShpbmRleCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIFN0cmluZyBvKSB7Ci0JCQkJQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy50aGlzLm9yaWdpbmFsTGlzdC5zZXQoaW5kZXgsIG8pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJjbGFzc05leHQoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5TmV4dCh0aGlzLmJ1aWxkU3ViY2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN1YmNsYXNzUHJldmlvdXMoKSB7Ci0JCXRoaXMudmVyaWZ5TW9kaWZ5UHJldmlvdXModGhpcy5idWlsZFN1YmNsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTdWJjbGFzcygpIHsKLQkJcmV0dXJuIG5ldyBDbG9uZUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMub3JpZ2luYWxMaXN0KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3QuYWRkKGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKGludCBjdXJyZW50SW5kZXgpIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMub3JpZ2luYWxMaXN0LnJlbW92ZShjdXJyZW50SW5kZXgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldChpbnQgY3VycmVudEluZGV4LCBTdHJpbmcgbykgewotCQkJCUNsb25lTGlzdEl0ZXJhdG9yVGVzdHMudGhpcy5vcmlnaW5hbExpc3Quc2V0KGN1cnJlbnRJbmRleCwgbyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU1vZGlmeU5leHQoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRBZnRlciA9ICJmaXZlIjsKLQkJU3RyaW5nIGFkZGVkID0gImZpdmUgYW5kIGEgaGFsZiI7Ci0JCVN0cmluZyByZXBsYWNlZCA9ICJzZXZlbiI7Ci0JCVN0cmluZyByZXBsYWNlbWVudCA9ICJhbm90aGVyIHNldmVuIjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMoYWRkZWRBZnRlcikpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCS8vIHRyeSB0byByZW1vdmUgYmVmb3JlIGNhbGxpbmcgI25leHQoKQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBuZXh0ID0gaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKGFkZGVkQWZ0ZXIpKSB7Ci0JCQkJaXRlcmF0b3IuYWRkKGFkZGVkKTsKLQkJCX0KLQkJCWlmIChuZXh0LmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlleENhdWdodCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQkJfQotCQkJaWYgKG5leHQuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TW9kaWZ5UHJldmlvdXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHJlbW92ZWQgPSAidGhyZWUiOwotCQlTdHJpbmcgYWRkZWRCZWZvcmUgPSAiZml2ZSI7Ci0JCVN0cmluZyBhZGRlZCA9ICJmb3VyIGFuZCBhIGhhbGYiOwotCQlTdHJpbmcgcmVwbGFjZWQgPSAic2V2ZW4iOwotCQlTdHJpbmcgcmVwbGFjZW1lbnQgPSAiYW5vdGhlciBzZXZlbiI7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVtb3ZlZCkpOwotCQlhc3NlcnRUcnVlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKGFkZGVkQmVmb3JlKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZWQpKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBpdGVyYXRvci5wcmV2aW91cygpOwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhhZGRlZEJlZm9yZSkpIHsKLQkJCQlpdGVyYXRvci5hZGQoYWRkZWQpOwotCQkJfQotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhyZW1vdmVkKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJCS8vIHRyeSB0byByZW1vdmUgdHdpY2UKLQkJCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCQkJdHJ5IHsKLQkJCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKHJlcGxhY2VkKSkgewotCQkJCWl0ZXJhdG9yLnNldChyZXBsYWNlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhhZGRlZCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm9yaWdpbmFsTGlzdC5jb250YWlucyhyZW1vdmVkKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMub3JpZ2luYWxMaXN0LmNvbnRhaW5zKHJlcGxhY2VkKSk7Ci0JCWFzc2VydFRydWUodGhpcy5vcmlnaW5hbExpc3QuY29udGFpbnMocmVwbGFjZW1lbnQpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IodGhpcy5vcmlnaW5hbExpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDbG9uZUxpc3RJdGVyYXRvcihMaXN0PFN0cmluZz4gbGlzdCkgewotCQlyZXR1cm4gbmV3IENsb25lTGlzdEl0ZXJhdG9yPFN0cmluZz4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMub3JpZ2luYWxMaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSB0aGlzLmJ1aWxkRW1wdHlMaXN0KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaXN0KExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCWxpc3QuYWRkKCJ6ZXJvIik7Ci0JCWxpc3QuYWRkKCJvbmUiKTsKLQkJbGlzdC5hZGQoInR3byIpOwotCQlsaXN0LmFkZCgidGhyZWUiKTsKLQkJbGlzdC5hZGQoImZvdXIiKTsKLQkJbGlzdC5hZGQoImZpdmUiKTsKLQkJbGlzdC5hZGQoInNpeCIpOwotCQlsaXN0LmFkZCgic2V2ZW4iKTsKLQkJbGlzdC5hZGQoImVpZ2h0Iik7Ci0JCWxpc3QuYWRkKCJuaW5lIik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZEVtcHR5TGlzdCgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgY29uY3VycmVudCBhY2Nlc3M6IEZpcnN0IGJ1aWxkIGEgY2xvbmUgaXRlcmF0b3IgaW4gYSBzZXBhcmF0ZSB0aHJlYWQKLQkgKiB0aGF0IGhhbmdzIG1vbWVudGFyaWx5IGR1cmluZyBpdHMgY29uc3RydWN0aW9uOyB0aGVuIG1vZGlmeSB0aGUgc2hhcmVkCi0JICogY29sbGVjdGlvbiBpbiB0aGlzIHRocmVhZC4gVGhpcyB3b3VsZCBjYXVzZSBhCi0JICogQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBpbiB0aGUgb3RoZXIgdGhyZWFkIGlmIHRoZSBjbG9uZSBpdGVyYXRvcgotCSAqIHdlcmUgbm90IHN5bmNocm9uaXplZCBvbiB0aGUgb3JpZ2luYWwgY29sbGVjdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29uY3VycmVudEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlDbG9uZUl0ZXJhdG9yVGVzdHMuU2xvd0NvbGxlY3Rpb248U3RyaW5nPiBzbG93ID0gbmV3IENsb25lSXRlcmF0b3JUZXN0cy5TbG93Q29sbGVjdGlvbjxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVMaXN0KHNsb3cpOwotCQkvLyB1c2luZyB0aGUgdW5zeW5jaHJvbml6ZWQgbGlzdCB3aWxsIGNhdXNlIHRoZSB0ZXN0IHRvIGZhaWwKLQkJLy8gdGhpcy5vcmlnaW5hbExpc3QgPSBzbG93OwotCQl0aGlzLm9yaWdpbmFsTGlzdCA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZExpc3Qoc2xvdyk7Ci0KLQkJdGhpcy5jb25jdXJyZW50TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlUaHJlYWQgdGhyZWFkID0gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkUnVubmFibGUoKSk7Ci0JCXRocmVhZC5zdGFydCgpOwotCQl3aGlsZSAoICEgc2xvdy5oYXNTdGFydGVkQ2xvbmUoKSkgewotCQkJLy8gd2FpdCBmb3IgdGhlIG90aGVyIHRocmVhZCB0byBzdGFydCB0aGUgY2xvbmUuLi4KLQkJCVRocmVhZC55aWVsZCgpOwotCQl9Ci0JCS8vIC4uLnRoZW4gc25lYWsgaW4gYW4gZXh0cmEgZWxlbWVudAotCQl0aGlzLm9yaWdpbmFsTGlzdC5hZGQoInNldmVudGVlbiIpOwotCQl0aHJlYWQuam9pbigpOwotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUxpc3QoZXhwZWN0ZWQpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29uY3VycmVudExpc3QpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRSdW5uYWJsZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0UnVubmFibGUoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHJ1bl8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJCQlDbG9uZUxpc3RJdGVyYXRvclRlc3RzLnRoaXMubG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHVzZSBhIGNsb25lIGl0ZXJhdG9yIHRvIGxvb3Agb3ZlciB0aGUgInNsb3ciIGNvbGxlY3Rpb24gYW5kIGNvcHkgaXRzCi0JICogY29udGVudHMgdG8gdGhlIGNvbmN1cnJlbnQgY29sbGVjdGlvbgotCSAqLwotCXZvaWQgbG9vcFdpdGhDbG9uZUxpc3RJdGVyYXRvcigpIHsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ2xvbmVMaXN0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXRoaXMuY29uY3VycmVudExpc3QuYWRkKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTdkYmQ3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvQ29tcG9zaXRlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0Fub3RoZXIyKCkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW5vdGhlcjMoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzQW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5SGFzQW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIoOCwgc3RyZWFtKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUhhc0Fub3RoZXIoaW50IGV4cGVjdGVkLCBJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIoKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFub3RoZXIyKCkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIodGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yMigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QW5vdGhlcjMoKSB7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcih0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IzKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5QW5vdGhlcihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQl0aGlzLnZlcmlmeUFub3RoZXIoMSwgc3RyZWFtKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUFub3RoZXIoaW50IHN0YXJ0LCBJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlpbnQgaW5kZXggPSBzdGFydDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIFN0cmluZy52YWx1ZU9mKGluZGV4KyspLCBzdHJlYW0ubmV4dCgpLnN1YnN0cmluZygwLCAxKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QxID0gdGhpcy5idWlsZExpc3QxKCk7Ci0JCU9iamVjdCBsYXN0RWxlbWVudDEgPSBsaXN0MS5nZXQobGlzdDEuc2l6ZSgpIC0gMSk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MiA9IHRoaXMuYnVpbGRMaXN0MigpOwotCQlMaXN0PFN0cmluZz4gbGlzdDMgPSB0aGlzLmJ1aWxkTGlzdDMoKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChuZXh0LmVxdWFscyhsYXN0RWxlbWVudDEpKSB7Ci0JCQkJLy8gdGhpcyB3aWxsIHRyaWdnZXIgdGhlIG5leHQgaXRlcmF0b3IgdG8gYmUgbG9hZGVkCi0JCQkJc3RyZWFtLmhhc05leHQoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0ucmVtb3ZlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCkgLSAyLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMzMzIikpOwotCQlhc3NlcnRGYWxzZSgibGFzdCBlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMSIsIGxpc3QxLmNvbnRhaW5zKGxhc3RFbGVtZW50MSkpOwotCQlhc3NlcnRUcnVlKCJ3cm9uZyBlbGVtZW50IHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMjIiKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDMiLCB0aGlzLmJ1aWxkTGlzdDMoKS5zaXplKCkgLSAxLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDMiLCBsaXN0My5jb250YWlucygiODg4ODg4ODgiKSk7Ci0JCWFzc2VydFRydWUoIndyb25nIGVsZW1lbnQgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKCI2NjY2NjYiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUVsZW1lbnQoKSB7Ci0JCVN0cmluZyBpdGVtID0gIjAiOwotCQl0aGlzLnZlcmlmeUhhc0Fub3RoZXIoOSwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKGl0ZW0sIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKSk7Ci0JCXRoaXMudmVyaWZ5QW5vdGhlcigwLCB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoaXRlbSwgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlTdHJpbmcgc3RyaW5nID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBzdHJpbmcsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24odGhpcy5idWlsZFVubW9kaWZpYWJsZUNvbXBvc2l0ZUl0ZXJhdG9yKCkpOwotCX0KLQotCXZvaWQgdmVyaWZ5VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAoc3RyaW5nLmVxdWFscygiMzMzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCXRoaXMudmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUhhc0Fub3RoZXIxKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SGFzQW5vdGhlcih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSk7Ci0JfQotCi0Jdm9pZCB2ZXJpZnlFbXB0eUhhc0Fub3RoZXIoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjEoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUhhc0Fub3RoZXIyKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SGFzQW5vdGhlcih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkRW1wdHlDb21wb3NpdGVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24odGhpcy5idWlsZEVtcHR5Q29tcG9zaXRlSXRlcmF0b3IyKCkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcih0aGlzLmJ1aWxkSXRlcmF0b3JzKCkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcih0aGlzLmJ1aWxkRW1wdHlJdGVyYXRvcnMxKCkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRFbXB0eUNvbXBvc2l0ZUl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcih0aGlzLmJ1aWxkRW1wdHlJdGVyYXRvcnMyKCkpOwotCX0KLQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVDb21wb3NpdGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcih0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3JzKCkpOwotCX0KLQotCS8vIGxlYXZlIHVuY2hlY2tlZCBzbyB3ZSBjYW4gb3ZlcnJpZGUgaW4gc3ViY2xhc3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3JzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihpdGVyYXRvcnMpOwotCX0KLQotCS8vIHVzZSB2YXJhcmcgY29uc3RydWN0b3IKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JfQotCi0JLy8gdXNlIHZhcmFyZyBjb25zdHJ1Y3RvcgotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8U3RyaW5nPihuZXcgSXRlcmF0b3JbXSB7IHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkgfSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxTdHJpbmc+KHN0cmluZywgaXRlcmF0b3IpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZEl0ZXJhdG9ycygpIHsKLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkSXRlcmF0b3IxKCkpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkSXRlcmF0b3IyKCkpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkSXRlcmF0b3IzKCkpOwotCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRFbXB0eUl0ZXJhdG9yczEoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRW1wdHlJdGVyYXRvckl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPEl0ZXJhdG9yPFN0cmluZz4+IGJ1aWxkRW1wdHlJdGVyYXRvcnMyKCkgewotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKHRoaXMuYnVpbGRFbXB0eVN0cmluZ0l0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkRW1wdHlTdHJpbmdJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQodGhpcy5idWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSk7Ci0JCXJldHVybiBsaXN0Lmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxJdGVyYXRvcjxTdHJpbmc+PiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9ycygpIHsKLQkJTGlzdDxJdGVyYXRvcjxTdHJpbmc+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IxKCkpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IyKCkpOwotCQlsaXN0LmFkZCh0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IzKCkpOwotCQlyZXR1cm4gbGlzdC5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0MSgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3QyKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdDMoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0MSgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFVubW9kaWZpYWJsZUxpc3QyKCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcjMoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVW5tb2RpZmlhYmxlTGlzdDMoKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8SXRlcmF0b3I8U3RyaW5nPj4gYnVpbGRFbXB0eUl0ZXJhdG9ySXRlcmF0b3IoKSB7Ci0JCXJldHVybiAobmV3IEFycmF5TGlzdDxJdGVyYXRvcjxTdHJpbmc+PigpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZEVtcHR5U3RyaW5nSXRlcmF0b3IoKSB7Ci0JCXJldHVybiAobmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZExpc3QxKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiMSIpOwotCQlsaXN0LmFkZCgiMjIiKTsKLQkJbGlzdC5hZGQoIjMzMyIpOwotCQlsaXN0LmFkZCgiNDQ0NCIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRMaXN0MigpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZExpc3QzKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsaXN0LmFkZCgiNTU1NTUiKTsKLQkJbGlzdC5hZGQoIjY2NjY2NiIpOwotCQlsaXN0LmFkZCgiNzc3Nzc3NyIpOwotCQlsaXN0LmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JTGlzdDxTdHJpbmc+IGJ1aWxkVW5tb2RpZmlhYmxlTGlzdDEoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRoaXMuYnVpbGRMaXN0MSgpKTsKLQl9Ci0KLQlMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0MigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodGhpcy5idWlsZExpc3QyKCkpOwotCX0KLQotCUxpc3Q8U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUxpc3QzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdDMoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0NvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDRlODYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9Db21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyB7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJc3VwZXIudGVzdFJlbW92ZSgpOwotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCS8vIHBvc2l0aW9uIHRvIGVuZCBvZiBzdHJlYW0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCQlzdHJlYW0ucmVtb3ZlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQgZnJvbSBjb2xsZWN0aW9uIDEiLCB0aGlzLmJ1aWxkTGlzdDEoKS5zaXplKCkgLSAyLCBsaXN0MS5zaXplKCkpOwotCQlhc3NlcnRGYWxzZSgiZWxlbWVudCBzdGlsbCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucygiMSIpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQotCQlhc3NlcnRFcXVhbHMoIm5vdGhpbmcgcmVtb3ZlZCBmcm9tIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSAtIDEsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEZhbHNlKCJmaXJzdCBlbGVtZW50IHN0aWxsIGluIGNvbGxlY3Rpb24gMyIsIGxpc3QzLmNvbnRhaW5zKGZpcnN0RWxlbWVudDMpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIGZyb20gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoIjY2NjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlMaXN0PFN0cmluZz4gbGlzdDEgPSB0aGlzLmJ1aWxkTGlzdDEoKTsKLQkJT2JqZWN0IGxhc3RFbGVtZW50MSA9IGxpc3QxLmdldChsaXN0MS5zaXplKCkgLSAxKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QyID0gdGhpcy5idWlsZExpc3QyKCk7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MyA9IHRoaXMuYnVpbGRMaXN0MygpOwotCQlPYmplY3QgZmlyc3RFbGVtZW50MyA9IGxpc3QzLmdldCgwKTsKLQotCQlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEl0ZXJhdG9yPFN0cmluZz4+KCk7Ci0JCWxpc3QuYWRkKGxpc3QxLmxpc3RJdGVyYXRvcigpKTsKLQkJbGlzdC5hZGQobGlzdDIubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0My5saXN0SXRlcmF0b3IoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IobGlzdC5saXN0SXRlcmF0b3IoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjMzMyIpKSB7Ci0JCQkJc3RyZWFtLmFkZCgiMy41Iik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKG5leHQuZXF1YWxzKGxhc3RFbGVtZW50MSkpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzTmV4dCgpOwotCQkJCS8vIG5vdyB0cnkgdG8gYWRkIHRvIHRoZSBpdGVyYXRvcgotCQkJCXN0cmVhbS5hZGQoInNvbWV0aGluZyBpbiAzIik7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLmFkZCgiZmluYWxlIik7Ci0JCWJvb2xlYW4gY2hlY2tGb3JGaW5hbGUgPSB0cnVlOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCU9iamVjdCBwcmV2aW91cyA9IHN0cmVhbS5wcmV2aW91cygpOwotCQkJaWYgKGNoZWNrRm9yRmluYWxlKSB7Ci0JCQkJY2hlY2tGb3JGaW5hbGUgPSBmYWxzZTsKLQkJCQlhc3NlcnRFcXVhbHMoImFkZGVkIGVsZW1lbnQgZHJvcHBlZCIsICJmaW5hbGUiLCBwcmV2aW91cyk7Ci0JCQl9Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5hZGQoIjIuNSIpOwotCQkJfQotCQkJLy8gdGVzdCBzcGVjaWFsIGNhc2UgLSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiBpdGVyYXRvcnMKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoZmlyc3RFbGVtZW50MykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgbmV4dCBpdGVyYXRvciB0byBiZSBsb2FkZWQKLQkJCQlzdHJlYW0uaGFzUHJldmlvdXMoKTsKLQkJCQkvLyBub3cgdHJ5IHRvIHJlbW92ZSBmcm9tIHRoZSBwcmV2aW91cyBpdGVyYXRvcgotCQkJCXN0cmVhbS5hZGQoIm9sZCBzdGFydCBvZiAzIik7Ci0JCQl9Ci0JCX0KLQkJc3RyZWFtLmFkZCgicHJlbHVkZSIpOwotCQlhc3NlcnRFcXVhbHMoImFkZGVkIGVsZW1lbnQgZHJvcHBlZCIsICJwcmVsdWRlIiwgc3RyZWFtLnByZXZpb3VzKCkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudHMgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSArIDMsIGxpc3QxLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAxIiwgInByZWx1ZGUiLCBsaXN0MS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICIyLjUiLCBsaXN0MS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsICIzLjUiLCBsaXN0MS5nZXQoNSkpOwotCi0JCWFzc2VydEVxdWFscygiZWxlbWVudHMgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsIHRoaXMuYnVpbGRMaXN0MygpLnNpemUoKSArIDMsIGxpc3QzLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZWxlbWVudCBub3QgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgInNvbWV0aGluZyBpbiAzIiwgbGlzdDMuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBhZGRlZCB0byBjb2xsZWN0aW9uIDMiLCAib2xkIHN0YXJ0IG9mIDMiLCBsaXN0My5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IGFkZGVkIHRvIGNvbGxlY3Rpb24gMyIsICJmaW5hbGUiLCBsaXN0My5nZXQobGlzdDMuc2l6ZSgpIC0gMSkpOwotCi0JCS8vIGFkZCB0byB0aGUgZnJvbnQKLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRGYWxzZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0RmFsc2UoImFkZGVkIGVsZW1lbnQgc2hvdWxkIGJlIHBsYWNlZCBCRUZPUkUgdGhlIFwiY3Vyc29yXCIiLCBzdHJlYW0ubmV4dCgpLmVxdWFscygiYmxhaCIpKTsKLQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQkvLyBhZGQgdG8gdGhlIG1pZGRsZQotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQlzdHJlYW0ubmV4dCgpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJc3RyZWFtLm5leHQoKTsKLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCi0JCXN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXN0cmVhbS5wcmV2aW91cygpOwotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLm5leHQoKS5lcXVhbHMoImJsYWgiKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCXN0cmVhbS5hZGQoImJsYWgiKTsKLQkJYXNzZXJ0VHJ1ZSgiYWRkZWQgZWxlbWVudCBzaG91bGQgYmUgcGxhY2VkIEJFRk9SRSB0aGUgXCJjdXJzb3JcIiIsIHN0cmVhbS5wcmV2aW91cygpLmVxdWFscygiYmxhaCIpKTsKLQotCQkvLyBhZGQgdG8gdGhlIGVuZAotCQlzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcigpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlzdHJlYW0uYWRkKCJibGFoIik7Ci0JCWFzc2VydEZhbHNlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLmhhc05leHQoKSk7Ci0KLQkJc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJc3RyZWFtLmFkZCgiYmxhaCIpOwotCQlhc3NlcnRUcnVlKCJhZGRlZCBlbGVtZW50IHNob3VsZCBiZSBwbGFjZWQgQkVGT1JFIHRoZSBcImN1cnNvclwiIiwgc3RyZWFtLnByZXZpb3VzKCkuZXF1YWxzKCJibGFoIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0MSA9IHRoaXMuYnVpbGRMaXN0MSgpOwotCQlPYmplY3QgbGFzdEVsZW1lbnQxID0gbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpOwotCQlMaXN0PFN0cmluZz4gbGlzdDIgPSB0aGlzLmJ1aWxkTGlzdDIoKTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QzID0gdGhpcy5idWlsZExpc3QzKCk7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQzID0gbGlzdDMuZ2V0KDApOwotCi0JCUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SXRlcmF0b3I8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobGlzdDEubGlzdEl0ZXJhdG9yKCkpOwotCQlsaXN0LmFkZChsaXN0Mi5saXN0SXRlcmF0b3IoKSk7Ci0JCWxpc3QuYWRkKGxpc3QzLmxpc3RJdGVyYXRvcigpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRDb21wb3NpdGVJdGVyYXRvcihsaXN0Lmxpc3RJdGVyYXRvcigpKTsKLQkJLy8gcG9zaXRpb24gdG8gZW5kIG9mIHN0cmVhbQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5zZXQoIjMzM2EiKTsKLQkJCX0KLQkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIC0gd2hlcmUgd2UgYXJlIGJldHdlZW4gaXRlcmF0b3JzCi0JCQlpZiAobmV4dC5lcXVhbHMobGFzdEVsZW1lbnQxKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNOZXh0KCk7Ci0JCQkJLy8gbm93IHRyeSB0byByZW1vdmUgZnJvbSB0aGUgcHJldmlvdXMgaXRlcmF0b3IKLQkJCQlzdHJlYW0uc2V0KCJlbmQgb2YgMSIpOwotCQkJfQotCQl9Ci0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHByZXZpb3VzID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpZiAocHJldmlvdXMuZXF1YWxzKCIyMiIpKSB7Ci0JCQkJc3RyZWFtLnNldCgiMjJhIik7Ci0JCQl9Ci0JCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSAtIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIGl0ZXJhdG9ycwotCQkJaWYgKHByZXZpb3VzLmVxdWFscyhmaXJzdEVsZW1lbnQzKSkgewotCQkJCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBuZXh0IGl0ZXJhdG9yIHRvIGJlIGxvYWRlZAotCQkJCXN0cmVhbS5oYXNQcmV2aW91cygpOwotCQkJCS8vIG5vdyB0cnkgdG8gcmVtb3ZlIGZyb20gdGhlIHByZXZpb3VzIGl0ZXJhdG9yCi0JCQkJc3RyZWFtLnNldCgic3RhcnQgb2YgMyIpOwotCQkJfQotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50KHMpIGFkZGVkIHRvIGNvbGxlY3Rpb24gMSIsIHRoaXMuYnVpbGRMaXN0MSgpLnNpemUoKSwgbGlzdDEuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgIjIyYSIsIGxpc3QxLmdldCgxKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjIyIikpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCAiMzMzYSIsIGxpc3QxLmdldCgyKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgbGlzdDEuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAxIiwgImVuZCBvZiAxIiwgbGlzdDEuZ2V0KGxpc3QxLnNpemUoKSAtIDEpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDEiLCBsaXN0MS5jb250YWlucyhsYXN0RWxlbWVudDEpKTsKLQotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQocykgYWRkZWQgdG8gY29sbGVjdGlvbiAzIiwgdGhpcy5idWlsZExpc3QzKCkuc2l6ZSgpLCBsaXN0My5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImVsZW1lbnQgbm90IHNldCBpbiBjb2xsZWN0aW9uIDMiLCAic3RhcnQgb2YgMyIsIGxpc3QzLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKCJlbGVtZW50IG5vdCBzZXQgaW4gY29sbGVjdGlvbiAzIiwgbGlzdDMuY29udGFpbnMoZmlyc3RFbGVtZW50MykpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhQcmV2aW91c0luZGV4KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgdGhpcy5idWlsZENvbXBvc2l0ZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5leHQgPSBzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQkJaWYgKG5leHQuZXF1YWxzKCIzMzMiKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQlpLS07Ci0JCQl9Ci0JCQlpZiAobmV4dC5lcXVhbHMoIjc3Nzc3NzciKSkgewotCQkJCXN0cmVhbS5hZGQoIjcuNSIpOwotCQkJCWkrKzsKLQkJCX0KLQkJCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImluZGV4IGlzIGNvcnJ1cHQiLCA4LCBpKTsKLQotCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGkgLSAxLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlPYmplY3QgcHJldmlvdXMgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjY2NjY2NiIpKSB7Ci0JCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCS8vIHJlbW92aW5nIGEgcHJldmlvdXMgZWxlbWVudCwgZG9lcyBub3QgY2hhbmdlIHRoZSBjdXJzb3IKLQkJCX0KLQkJCWlmIChwcmV2aW91cy5lcXVhbHMoIjIyIikpIHsKLQkJCQlzdHJlYW0uYWRkKCIxLjUiKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlhc3NlcnRFcXVhbHMoaSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJpbmRleCBpcyBjb3JydXB0IiwgMCwgaSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHsKLQkJdGhpcy52ZXJpZnlJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgewotCQl0aGlzLnZlcmlmeUVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5RW1wdHlJbGxlZ2FsU3RhdGVFeGNlcHRpb24yKCk7Ci0JfQotCi0JLy8gdW5jaGVja2VkIHNvIHdlIGNhbiBvdmVycmlkZSB0aGUgdW5jaGVja2VkIG1ldGhvZCBpbiBzdXBlcmNsYXNzCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKEl0ZXJhdG9yIGl0ZXJhdG9ycykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KChMaXN0SXRlcmF0b3I8TGlzdEl0ZXJhdG9yPFN0cmluZz4+KSBpdGVyYXRvcnMpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRDb21wb3NpdGVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXcgTGlzdEl0ZXJhdG9yW10geyB0aGlzLmJ1aWxkSXRlcmF0b3IxKCksIHRoaXMuYnVpbGRJdGVyYXRvcjIoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMygpIH0pOwotCX0KLQotCUBPdmVycmlkZQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4oc3RyaW5nLCBpdGVyYXRvcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTExZTQ4NC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtcHR5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbXB0eUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gRW1wdHlJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJZmFpbCgiYm9ndXMgZWxlbWVudDogIiArIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8TnVtYmVyPiBzdHJlYW0gPSBFbXB0eUl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCU9iamVjdCBlbGVtZW50ID0gbnVsbDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVtcHR5SXRlcmF0b3IuaW5zdGFuY2UoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbXB0eUxpc3RJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5MjQxNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0VtcHR5TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkVtcHR5TGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbXB0eUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVtcHR5TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWFzc2VydEVxdWFscygwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlpID0gMDsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzKCkgewotCQlMaXN0SXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWZhaWwoImJvZ3VzIGVsZW1lbnQ6ICIgKyBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlmYWlsKCJib2d1cyBlbGVtZW50OiAiICsgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IEVtcHR5TGlzdEl0ZXJhdG9yLmluc3RhbmNlKCk7Ci0JCWFzc2VydEVxdWFscygtMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQkJT2JqZWN0IGVsZW1lbnQgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJZWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIChuZXh0KTogIiArIGVsZW1lbnQsIGV4Q2F1Z2h0KTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQllbGVtZW50ID0gc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSBzdHJlYW0ucHJldmlvdXMoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biAocHJldmlvdXMpOiAiICsgZWxlbWVudCwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIChyZW1vdmUpIiwgZXhDYXVnaHQpOwotCQl0cnkgewotCQkJRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKS5zZXQobmV3IE9iamVjdCgpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIChzZXQpIiwgZXhDYXVnaHQpOwotCQl0cnkgewotCQkJRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKS5hZGQobmV3IE9iamVjdCgpKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIChhZGQpIiwgZXhDYXVnaHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRW51bWVyYXRpb25JdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzdkMjguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9FbnVtZXJhdGlvbkl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW51bWVyYXRpb25JdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRpb25JdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dCgpIHsKLQkJRW51bWVyYXRpb248U3RyaW5nPiBlbnVtZXJhdGlvbiA9IHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uID0gdGhpcy5idWlsZEVudW1lcmF0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSXRlcmF0b3IodGhpcy5idWlsZEVudW1lcmF0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEl0ZXJhdG9yKEVudW1lcmF0aW9uPFN0cmluZz4gZW51bWVyYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbkl0ZXJhdG9yPFN0cmluZz4oZW51bWVyYXRpb24pOwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRpb248U3RyaW5nPiBidWlsZEVudW1lcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZlY3RvcigpLmVsZW1lbnRzKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8U3RyaW5nPiBidWlsZFZlY3RvcigpIHsKLQkJVmVjdG9yPFN0cmluZz4gdiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQl2LmFkZEVsZW1lbnQoIm9uZSIpOwotCQl2LmFkZEVsZW1lbnQoInR3byIpOwotCQl2LmFkZEVsZW1lbnQoInRocmVlIik7Ci0JCXYuYWRkRWxlbWVudCgiZm91ciIpOwotCQl2LmFkZEVsZW1lbnQoImZpdmUiKTsKLQkJdi5hZGRFbGVtZW50KCJzaXgiKTsKLQkJdi5hZGRFbGVtZW50KCJzZXZlbiIpOwotCQl2LmFkZEVsZW1lbnQoImVpZ2h0Iik7Ci0JCXJldHVybiB2OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGRFbnVtZXJhdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdChFbnVtZXJhdGlvbjxTdHJpbmc+IGVudW1lcmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRpb25JdGVyYXRvcjxPYmplY3Q+KGVudW1lcmF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZTkyMGIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9GaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRmlsdGVyaW5nSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAicHJlZml4IjsKLQotCXB1YmxpYyBGaWx0ZXJpbmdJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKFBSRUZJWCArICIzIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtLm5leHQoKTsKLQkJfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93bjogIiArIHN0cmluZywgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHRIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkQWNjZXB0SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2NlcHROZXh0KCkgewotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEFjY2VwdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlamVjdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygyLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVqZWN0TmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWplY3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RmFsc2UoImJvZ3VzIHJlamVjdCIsIHN0cmVhbS5uZXh0KCkuc3RhcnRzV2l0aChQUkVGSVgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb3RoSGFzTmV4dCgpIHsKLQkJLy8gaWYgYm90aCBhY2NlcHQoKSBhbmQgcmVqZWN0KCkgYXJlIG92ZXJyaWRkZW4sIGFjY2VwdCgpIGlzIHVzZWQKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEJvdGhJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoNiwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExvYWROZXh0KCkgewotCQkvLyBsb2FkTmV4dCgpIHVzZWQgdG8gY2F1c2UgYSBOUEUgd2hlbiBleGVjdXRpbmcgZHVyaW5nIHRoZQotCQkvLyBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZSAib3V0ZXIiIGNsYXNzIGlzIG5vdCBib3VuZCB1bnRpbCBjb21wbGV0aW9uCi0JCS8vIG9mIHRoZSBjb25zdHJ1Y3RvcgotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IyKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBhY2NlcHQiLCBzdHJlYW0ubmV4dCgpLnN0YXJ0c1dpdGgoUFJFRklYKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVySGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZEZpbHRlckl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyTmV4dCgpIHsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRGaWx0ZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0VHJ1ZSgiYm9ndXMgYWNjZXB0Iiwgc3RyZWFtLm5leHQoKS5zdGFydHNXaXRoKFBSRUZJWCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkRmlsdGVyZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yLCBmaWx0ZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZElubmVyRmlsdGVyZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKFBSRUZJWCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIFBSRUZJWDsKLQl9Ci0KLQkvLyB0aGlzIGlubmVyIGl0ZXJhdG9yIHdpbGwgY2FsbCB0aGUgIm91dGVyIiBvYmplY3QKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IyKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgoRmlsdGVyaW5nSXRlcmF0b3JUZXN0cy50aGlzLmdldFByZWZpeCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoUFJFRklYICsgIjEiKTsKLQkJYy5hZGQoUFJFRklYICsgIjIiKTsKLQkJYy5hZGQoUFJFRklYICsgIjMiKTsKLQkJYy5hZGQoIjQiKTsKLQkJYy5hZGQoUFJFRklYICsgIjUiKTsKLQkJYy5hZGQoUFJFRklYICsgIjYiKTsKLQkJYy5hZGQoUFJFRklYICsgIjciKTsKLQkJYy5hZGQoIjgiKTsKLQkJcmV0dXJuIGMuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRBY2NlcHRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkQWNjZXB0RmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZElubmVySXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW5uZXJGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQkvLyB0aGlzIGlubmVyIGl0ZXJhdG9yIHdpbGwgY2FsbCB0aGUgIm91dGVyIiBvYmplY3QKLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRJbm5lckl0ZXJhdG9yMigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lckZpbHRlcmVkSXRlcmF0b3IyKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRGaWx0ZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkRmlsdGVyRmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRBY2NlcHRGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRSZWplY3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkUmVqZWN0RmlsdGVyKFBSRUZJWCkpOwotCX0KLQotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRSZWplY3RGaWx0ZXIoU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUZpbHRlcjxTdHJpbmcsIFN0cmluZz4ocHJlZml4KSB7Ci0JCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiByZWplY3QoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gcy5zdGFydHNXaXRoKHRoaXMuY3JpdGVyaW9uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyB1c2UgYW5vbnltb3VzIGlubmVyIEZpbHRlcgotCXByaXZhdGUgRmlsdGVyPFN0cmluZz4gYnVpbGRGaWx0ZXJGaWx0ZXIoZmluYWwgU3RyaW5nIHByZWZpeCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aChwcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZEJvdGhJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWx0ZXJlZEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkQm90aEZpbHRlcihQUkVGSVgpKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkQm90aEZpbHRlcihTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlRmlsdGVyPFN0cmluZywgU3RyaW5nPihwcmVmaXgpIHsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHJlamVjdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnN0YXJ0c1dpdGgodGhpcy5jcml0ZXJpb24pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRmlsdGVyaW5nSXRlcmF0b3IoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCQkJU3RyaW5nIHMgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIHN0cmluZzogIiArIHMpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL0dyYXBoSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzIwZjI4Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvR3JhcGhJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5HcmFwaEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdyYXBoSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPEdyYXBoTm9kZT4gbm9kZXMgPSBuZXcgQXJyYXlMaXN0PEdyYXBoTm9kZT4oKTsKLQotCXB1YmxpYyBHcmFwaEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5SGFzTmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05leHQoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5ub2Rlcy5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dDIoKSB7Ci0JCXRoaXMudmVyaWZ5TmV4dCh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5leHQoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBlbGVtZW50IiwgdGhpcy5ub2Rlcy5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbjIoKSB7Ci0JCXRoaXMudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbih0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplMSgpIHsKLQkJdGhpcy52ZXJpZnlTaXplKHRoaXMuYnVpbGRHcmFwaEl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZTIoKSB7Ci0JCXRoaXMudmVyaWZ5U2l6ZSh0aGlzLmJ1aWxkR3JhcGhJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNpemUoSXRlcmF0b3I8R3JhcGhOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaXRlcmF0b3JTaXplID0gQ29sbGVjdGlvblRvb2xzLnNpemUoaXRlcmF0b3IpOwotCQlpbnQgYWN0dWFsU2l6ZSA9IHRoaXMubm9kZXMuc2l6ZSgpOwotCQlhc3NlcnRUcnVlKCJUb28gZmV3IGl0ZW1zIGluIGl0ZXJhdG9yLiIsIGl0ZXJhdG9yU2l6ZSA+PSBhY3R1YWxTaXplKTsKLQkJYXNzZXJ0VHJ1ZSgiVG9vIG1hbnkgaXRlbXMgaW4gaXRlcmF0b3IuIiwgaXRlcmF0b3JTaXplIDw9IGFjdHVhbFNpemUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkR3JhcGhJdGVyYXRvcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJCUl0ZXJhdG9yPEdyYXBoTm9kZT4gaXRlcmF0b3IgPSBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSk7Ci0JCQlHcmFwaE5vZGUgZ24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGdyYXBoIG5vZGU6ICIgKyBnbik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCS8qKgotCSAqIGJ1aWxkIGEgZ3JhcGggaXRlcmF0b3Igd2l0aCBhbiBleHBsaWNpdCBtaXN0ZXJSb2dlcnMKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPEdyYXBoTm9kZT4gYnVpbGRHcmFwaEl0ZXJhdG9yMSgpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yPEdyYXBoTm9kZT4odGhpcy5idWlsZEdyYXBoUm9vdCgpLCB0aGlzLmJ1aWxkTWlzdGVyUm9nZXJzKCkpOwotCX0KLQotCXByaXZhdGUgR3JhcGhJdGVyYXRvci5NaXN0ZXJSb2dlcnM8R3JhcGhOb2RlPiBidWlsZE1pc3RlclJvZ2VycygpIHsKLQkJcmV0dXJuIG5ldyBHcmFwaEl0ZXJhdG9yLk1pc3RlclJvZ2VyczxHcmFwaE5vZGU+KCkgewotCQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKEdyYXBoTm9kZSBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5leHQubmVpZ2hib3JzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSBncmFwaCBpdGVyYXRvciB3aXRoIGFuIG92ZXJyaWRlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxHcmFwaE5vZGU+IGJ1aWxkR3JhcGhJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgR3JhcGhJdGVyYXRvcjxHcmFwaE5vZGU+KHRoaXMuYnVpbGRHcmFwaFJvb3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8R3JhcGhOb2RlPiBuZWlnaGJvcnMoR3JhcGhOb2RlIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5uZWlnaGJvcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEdyYXBoTm9kZSBidWlsZEdyYXBoUm9vdCgpIHsKLQkJR3JhcGhOb2RlIG5jTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk5vcnRoIENhcm9saW5hIik7Ci0JCUdyYXBoTm9kZSB2YU5vZGUgPSBuZXcgR3JhcGhOb2RlKCJWaXJnaW5pYSIpOwotCQlHcmFwaE5vZGUgc2NOb2RlID0gbmV3IEdyYXBoTm9kZSgiU291dGggQ2Fyb2xpbmEiKTsKLQkJR3JhcGhOb2RlIGdhTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkdlb3JnaWEiKTsKLQkJR3JhcGhOb2RlIGZsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkZsb3JpZGEiKTsKLQkJR3JhcGhOb2RlIGFsTm9kZSA9IG5ldyBHcmFwaE5vZGUoIkFsYWJhbWEiKTsKLQkJR3JhcGhOb2RlIG1zTm9kZSA9IG5ldyBHcmFwaE5vZGUoIk1pc3Npc3NpcHBpIik7Ci0JCUdyYXBoTm9kZSB0bk5vZGUgPSBuZXcgR3JhcGhOb2RlKCJUZW5uZXNzZWUiKTsKLQotCQluY05vZGUuc2V0TmVpZ2hib3JzKG5ldyBHcmFwaE5vZGVbXSB7IHZhTm9kZSwgc2NOb2RlLCBnYU5vZGUsIHRuTm9kZSB9KTsKLQkJdmFOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHRuTm9kZSB9KTsKLQkJc2NOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIGdhTm9kZSB9KTsKLQkJZ2FOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBuY05vZGUsIHNjTm9kZSwgZmxOb2RlLCBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJZmxOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBnYU5vZGUgfSk7Ci0JCWFsTm9kZS5zZXROZWlnaGJvcnMobmV3IEdyYXBoTm9kZVtdIHsgZ2FOb2RlLCBtc05vZGUsIHRuTm9kZSB9KTsKLQkJbXNOb2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyBhbE5vZGUsIHRuTm9kZSB9KTsKLQkJdG5Ob2RlLnNldE5laWdoYm9ycyhuZXcgR3JhcGhOb2RlW10geyB2YU5vZGUsIG5jTm9kZSwgZ2FOb2RlLCBhbE5vZGUsIG1zTm9kZSB9KTsKLQotCQlyZXR1cm4gbmNOb2RlOwotCX0KLQotCXB1YmxpYyBjbGFzcyBHcmFwaE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JCXByaXZhdGUgQ29sbGVjdGlvbjxHcmFwaE5vZGU+IG5laWdoYm9ycyA9IG5ldyBBcnJheUxpc3Q8R3JhcGhOb2RlPigpOwotCi0JCXB1YmxpYyBHcmFwaE5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlHcmFwaEl0ZXJhdG9yVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXZvaWQgc2V0TmVpZ2hib3JzKEdyYXBoTm9kZVtdIG5laWdoYm9ycykgewotCQkJdGhpcy5uZWlnaGJvcnMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChuZWlnaGJvcnMpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPEdyYXBoTm9kZT4gbmVpZ2hib3JzKCkgewotCQkJcmV0dXJuIHRoaXMubmVpZ2hib3JzLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5laWdoYm9yc1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZWlnaGJvcnMuc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkdyYXBoTm9kZSgiICsgdGhpcy5uYW1lICsgIikiOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZmIyNzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9KcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICovCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eUl0ZXJhdG9yc1Rlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFycmF5SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBcnJheUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENoYWluSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDbG9uZUl0ZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2xvbmVMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtcHR5SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbXB0eUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVudW1lcmF0aW9uSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR3JhcGhJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlZWthYmxlSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkT25seUxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeW5jaHJvbml6ZWRJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplZExpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyZWVJdGVyYXRvclRlc3RzLmNsYXNzKTsKLQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVdGlsaXR5SXRlcmF0b3JzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUGVla2FibGVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTA1NmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9QZWVrYWJsZUl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5QZWVrYWJsZUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZWVrYWJsZUl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUGVla2FibGVJdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKHN0cmluZy5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg2LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDYsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiemVybyIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInR3byIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInRocmVlIiwgc3RyZWFtLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm91ciIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZpdmUiLCBzdHJlYW0ubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dFVwY2FzdCgpIHsKLQkJSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpOwotCQlhc3NlcnRFcXVhbHMoInplcm8iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmUiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0d28iLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0aHJlZSIsIHN0cmVhbS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvdXIiLCBzdHJlYW0ubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmaXZlIiwgc3RyZWFtLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlZWsoKSB7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJZm9yIChQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwZWVrID0gc3RyZWFtLnBlZWsoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIHByZW1hdHVyZWx5IGlkZW50aWNhbCIsIHBlZWsgIT0gbmV4dCk7Ci0JCQluZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIG5vdCBpZGVudGljYWwiLCBwZWVrID09IG5leHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlZWtVcGNhc3QoKSB7Ci0JCU9iamVjdCBuZXh0ID0gbnVsbDsKLQkJZm9yIChQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBwZWVrID0gc3RyZWFtLnBlZWsoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIHByZW1hdHVyZWx5IGlkZW50aWNhbCIsIHBlZWsgIT0gbmV4dCk7Ci0JCQluZXh0ID0gc3RyZWFtLm5leHQoKTsKLQkJCWFzc2VydFRydWUoInBlZWsgYW5kIG5leHQgYXJlIG5vdCBpZGVudGljYWwiLCBwZWVrID09IG5leHQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPFN0cmluZz4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBlZWthYmxlSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgUGVla2FibGVJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUGVla2FibGVJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPiBidWlsZFBlZWthYmxlSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFBlZWthYmxlSXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4gYnVpbGRQZWVrYWJsZUl0ZXJhdG9yVXBjYXN0KEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBQZWVrYWJsZUl0ZXJhdG9yPE9iamVjdD4obmVzdGVkSXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZEl0ZXJhdG9yKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljLmFkZCgiemVybyIpOwotCQljLmFkZCgib25lIik7Ci0JCWMuYWRkKCJ0d28iKTsKLQkJYy5hZGQoInRocmVlIik7Ci0JCWMuYWRkKCJmb3VyIik7Ci0JCWMuYWRkKCJmaXZlIik7Ci0JCXJldHVybiBjLml0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDFlZWE2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIENvbXBvc2l0ZUl0ZXJhdG9yVGVzdHMgewotCi0JcHVibGljIFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUhhc0Fub3RoZXIoc3RyZWFtKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IChMaXN0SXRlcmF0b3I8U3RyaW5nPikgc3RyZWFtOwotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUFub3RoZXIoc3RyZWFtKTsKLQkJaW50IGkgPSA4OwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIFN0cmluZy52YWx1ZU9mKGktLSksIHN0cmVhbTIucHJldmlvdXMoKS5zdWJzdHJpbmcoMCwgMSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSB0aGlzLmJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhpIC0gMSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDgsIGkpOwotCi0JCWFzc2VydEVxdWFscyhpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQkJYXNzZXJ0RXF1YWxzKGksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaSAtIDEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiaW5kZXggaXMgY29ycnVwdCIsIDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91c0luZGV4KCkgewotCQkvLyBUT0RPCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQkvLyAjcmVtb3ZlKCkgaXMgbm90IHN1cHBvcnRlZAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbjEoKSB7Ci0JCS8vICNyZW1vdmUoKSBpcyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5SWxsZWdhbFN0YXRlRXhjZXB0aW9uMigpIHsKLQkJLy8gI3JlbW92ZSgpIGlzIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQl2b2lkIHZlcmlmeU5vU3VjaEVsZW1lbnRFeGNlcHRpb24oSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0pIHsKLQkJc3VwZXIudmVyaWZ5Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbihzdHJlYW0pOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0yLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJfQotCQl0cnkgewotCQkJc3RyaW5nID0gc3RyZWFtMi5wcmV2aW91cygpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCB2ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSkgewotCQlzdXBlci52ZXJpZnlVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihzdHJlYW0pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTIgPSAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHN0cmVhbTsKLQkJd2hpbGUgKHN0cmVhbTIuaGFzUHJldmlvdXMoKSkgewotCQkJT2JqZWN0IHN0cmluZyA9IHN0cmVhbTIucHJldmlvdXMoKTsKLQkJCWlmIChzdHJpbmcuZXF1YWxzKCIzMzMiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbTIucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5SWxsZWdhbFN0YXRlRXhjZXB0aW9uKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUlsbGVnYWxTdGF0ZUV4Y2VwdGlvbihzdHJlYW0pOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXN0cmVhbTIuc2V0KCJqdW5rIik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgdmVyaWZ5RW1wdHlIYXNBbm90aGVyKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtKSB7Ci0JCXN1cGVyLnZlcmlmeUVtcHR5SGFzQW5vdGhlcihzdHJlYW0pOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0yID0gKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBzdHJlYW07Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKHN0cmVhbTIuaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtMi5wcmV2aW91cygpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQkvLyB1bmNoZWNrZWQgc28gd2UgY2FuIG92ZXJyaWRlIHRoZSB1bmNoZWNrZWQgbWV0aG9kIGluIHN1cGVyY2xhc3MKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IoSXRlcmF0b3IgaXRlcmF0b3JzKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPigoTGlzdEl0ZXJhdG9yPExpc3RJdGVyYXRvcjxTdHJpbmc+PikgaXRlcmF0b3JzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlSXRlcmF0b3IyKCkgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5Q29tcG9zaXRlTGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5idWlsZEl0ZXJhdG9yMSgpLCB0aGlzLmJ1aWxkSXRlcmF0b3IyKCksIHRoaXMuYnVpbGRJdGVyYXRvcjMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yMygpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUNvbXBvc2l0ZUxpc3RJdGVyYXRvcjxTdHJpbmc+KG5ldyBMaXN0SXRlcmF0b3JbXSB7IHRoaXMuYnVpbGRJdGVyYXRvcjEoKSwgdGhpcy5idWlsZEl0ZXJhdG9yMigpLCB0aGlzLmJ1aWxkSXRlcmF0b3IzKCkgfSk7Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZENvbXBvc2l0ZUl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKHN0cmluZywgaXRlcmF0b3IpOwotCX0KLQotCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkQ29tcG9zaXRlTGlzdEl0ZXJhdG9yKFN0cmluZyBzdHJpbmcsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8U3RyaW5nPihzdHJpbmcsIGl0ZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFyaWVkTmVzdGVkSXRlcmF0b3JzKCkgewotCQlMaXN0PEludGVnZXI+IGludGVnZXJMaXN0ID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOwotCQlpbnRlZ2VyTGlzdC5hZGQobmV3IEludGVnZXIoNDIpKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDQyKSk7Ci0JCWludGVnZXJMaXN0LmFkZChuZXcgSW50ZWdlcigxMTEpKTsKLQkJaW50ZWdlckxpc3QuYWRkKG5ldyBJbnRlZ2VyKDc3KSk7Ci0KLQkJTGlzdDxGbG9hdD4gZmxvYXRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKLQkJZmxvYXRMaXN0LmFkZChuZXcgRmxvYXQoNDIuNDJmKSk7Ci0JCWZsb2F0TGlzdC5hZGQobmV3IEZsb2F0KDIyLjIyZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCgxMTEuMTExZikpOwotCQlmbG9hdExpc3QuYWRkKG5ldyBGbG9hdCg3Ny43N2YpKTsKLQotCQlMaXN0PExpc3Q8PyBleHRlbmRzIE51bWJlcj4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3Q8PyBleHRlbmRzIE51bWJlcj4+KCk7Ci0JCWxpc3QuYWRkKGludGVnZXJMaXN0KTsKLQkJbGlzdC5hZGQoZmxvYXRMaXN0KTsKLQkJTGlzdEl0ZXJhdG9yPE51bWJlcj4gbGkgPSBuZXcgUmVhZE9ubHlDb21wb3NpdGVMaXN0SXRlcmF0b3I8TnVtYmVyPihsaXN0KTsKLQkJd2hpbGUgKGxpLmhhc05leHQoKSkgewotCQkJYXNzZXJ0VHJ1ZShsaS5uZXh0KCkuaW50VmFsdWUoKSA+IDApOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwNDE3MC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1JlYWRPbmx5SXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBSZWFkT25seUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVmVjdG9yKCkuc2l6ZSgpLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRWZWN0b3IoKS5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0VXBjYXN0KCkgewotCQlJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCk7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkSXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCWlmIChzdHJlYW0ubmV4dCgpLmVxdWFscygidGhyZWUiKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRSZWFkT25seUl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFJlYWRPbmx5SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFJlYWRPbmx5SXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlJdGVyYXRvclVwY2FzdChJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRWZWN0b3IoKS5pdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWZWN0b3IoKSB7Ci0JCVZlY3RvcjxTdHJpbmc+IHYgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJdi5hZGRFbGVtZW50KCJvbmUiKTsKLQkJdi5hZGRFbGVtZW50KCJ0d28iKTsKLQkJdi5hZGRFbGVtZW50KCJ0aHJlZSIpOwotCQl2LmFkZEVsZW1lbnQoImZvdXIiKTsKLQkJdi5hZGRFbGVtZW50KCJmaXZlIik7Ci0JCXYuYWRkRWxlbWVudCgic2l4Iik7Ci0JCXYuYWRkRWxlbWVudCgic2V2ZW4iKTsKLQkJdi5hZGRFbGVtZW50KCJlaWdodCIpOwotCQlyZXR1cm4gdjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvUmVhZE9ubHlMaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODFhMmEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9SZWFkT25seUxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkT25seUxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBpKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQkJaS0tOwotCQl9Ci0JCWFzc2VydEVxdWFscygwLCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dEFuZEhhc1ByZXZpb3VzVXBjYXN0KCkgewotCQlpbnQgaSA9IDA7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZExpc3QoKS5zaXplKCksIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0QW5kUHJldmlvdXMoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IubmV4dCgpLCBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpLCBzdHJlYW0ucHJldmlvdXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmV4dEFuZFByZXZpb3VzVXBjYXN0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXMoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZExpc3RJdGVyYXRvciA9IHRoaXMuYnVpbGROZXN0ZWRMaXN0SXRlcmF0b3IoKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLm5leHQoKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIHRoaXMuYnVpbGRMaXN0KCkuc2l6ZSgpLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgZWxlbWVudCIsIG5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91c0luZGV4KCksIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJbmVzdGVkTGlzdEl0ZXJhdG9yLnByZXZpb3VzKCk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0SW5kZXhBbmRQcmV2aW91c0luZGV4VXBjYXN0KCkgewotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IgPSB0aGlzLmJ1aWxkTmVzdGVkTGlzdEl0ZXJhdG9yKCk7Ci0JCUxpc3RJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdCgpOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIG5lc3RlZExpc3RJdGVyYXRvci5uZXh0SW5kZXgoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5uZXh0KCk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCBuZXN0ZWRMaXN0SXRlcmF0b3IucHJldmlvdXNJbmRleCgpLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCW5lc3RlZExpc3RJdGVyYXRvci5wcmV2aW91cygpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIC0xLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKCJ0aHJlZSIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uc2V0KCJib2d1cyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFJlYWRPbmx5TGlzdEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5lcXVhbHMoInRocmVlIikpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0uYWRkKCJib2d1cyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZExpc3RJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkUmVhZE9ubHlMaXN0SXRlcmF0b3IoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkTGlzdEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPihuZXN0ZWRMaXN0SXRlcmF0b3IpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRSZWFkT25seUxpc3RJdGVyYXRvclVwY2FzdChMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRMaXN0SXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxPYmplY3Q+KG5lc3RlZExpc3RJdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZE5lc3RlZExpc3RJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsLmFkZCgib25lIik7Ci0JCWwuYWRkKCJ0d28iKTsKLQkJbC5hZGQoInRocmVlIik7Ci0JCWwuYWRkKCJmb3VyIik7Ci0JCWwuYWRkKCJmaXZlIik7Ci0JCWwuYWRkKCJzaXgiKTsKLQkJbC5hZGQoInNldmVuIik7Ci0JCWwuYWRkKCJlaWdodCIpOwotCQlyZXR1cm4gbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZTVhNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1NpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMSwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHQoKSB7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsKLQkJU3RyaW5nIHN0cmluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCXRyeSB7Ci0JCQlzdHJpbmcgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgc3RyaW5nLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zaW5nbGVFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc2luZ2xlRWxlbWVudCgpIHsKLQkJcmV0dXJuICJzaW5nbGUgZWxlbWVudCI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTNhNjUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3JUZXN0cyBleHRlbmRzIFNpbmdsZUVsZW1lbnRJdGVyYXRvclRlc3RzIHsKLQotCXB1YmxpYyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleCgpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgMSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJldmlvdXMoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDIsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmV2aW91cygpIHsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBlbGVtZW50IiwgdGhpcy5zaW5nbGVFbGVtZW50KCksIHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGVsZW1lbnQiLCB0aGlzLnNpbmdsZUVsZW1lbnQoKSwgc3RyZWFtLnByZXZpb3VzKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZXZpb3VzSW5kZXgoKSB7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygiYm9ndXMgaW5kZXgiLCAwLCBzdHJlYW0ubmV4dEluZGV4KCkpOwotCQkJc3RyZWFtLm5leHQoKTsKLQkJfQotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyBpbmRleCIsIDAsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCX0KLQotCQlhc3NlcnRFcXVhbHMoImJvZ3VzIGluZGV4IiwgLTEsIHN0cmVhbS5wcmV2aW91c0luZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gdGhpcy5idWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKTsKLQotCQl0cnkgewotCQkJc3RyZWFtLmFkZCgiZm9vIik7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSB0aGlzLmJ1aWxkU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaWYgKHN0cmVhbS5uZXh0KCkuZXF1YWxzKHRoaXMuc2luZ2xlRWxlbWVudCgpKSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS5zZXQoImZvbyIpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4odGhpcy5zaW5nbGVFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBidWlsZFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiAoTGlzdEl0ZXJhdG9yPFN0cmluZz4pIHRoaXMuYnVpbGRTaW5nbGVFbGVtZW50SXRlcmF0b3IoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckl0ZXJhdG9yV3JhcHBlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjZkYzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9TdXBlckl0ZXJhdG9yV3JhcHBlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5pdGVyYXRvcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU3VwZXJJdGVyYXRvcldyYXBwZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFN1cGVySXRlcmF0b3JXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU3VwZXJJdGVyYXRvcldyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImZvbyIpOwotCQlsaXN0LmFkZCgiYmFyIik7Ci0JCWxpc3QuYWRkKCJiYXoiKTsKLQkJU3RyaW5nIGNvbmNhdCA9ICIiOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWNvbmNhdCArPSBzdHJlYW0ubmV4dCgpOwotCQl9Ci0JCWFzc2VydEVxdWFscygiZm9vYmFyYmF6IiwgY29uY2F0KTsKLQotCQlJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yID0gbmV3IFN1cGVySXRlcmF0b3JXcmFwcGVyPE9iamVjdD4obGlzdCk7Ci0JCWNvbmNhdCA9ICIiOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbmV4dCA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuZXh0LmVxdWFscygiYmFyIikpIHsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uY2F0ICs9IG5leHQ7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJmb29iYXoiLCBjb25jYXQpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShsaXN0LmNvbnRhaW5zKCJiYXIiKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzAyMzhmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN5bmNocm9uaXplZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JcHVibGljIFN5bmNocm9uaXplZEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCB0aGF0IGFuIHVuc3luY2hyb25pemVkIGl0ZXJhdG9yIHdpbGwgcHJvZHVjZSBjb3JydXB0IG91dHB1dDsKLQkgKiB0aHJlYWQgMSB3aWxsIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IKLQkgKiBhbmQgdGhlbiBzbGVlcCBmb3IgYSBiaXQsIGFsbG93aW5nIHRocmVhZCAyIHRvIHNuZWFrIGluIGFuZAotCSAqIHJlYWQgdGhlIHNhbWUgZWxlbWVudCBmcm9tIHRoZSBpdGVyYXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZE5leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyBib3RoIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgc2FtZSBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yIDotKAotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTIubmV4dCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCB0aGF0IGEgc3luY2hyb25pemVkIGl0ZXJhdG9yIHdpbGwgcHJvZHVjZSB2YWxpZCBvdXRwdXQ7Ci0JICogdGhyZWFkIDEgd2lsbCByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gdGhlIGl0ZXJhdG9yCi0JICogYW5kIHRoZW4gc2xlZXAgZm9yIGEgYml0LCBidXQgdGhyZWFkIDIgd2lsbCBiZSBsb2NrZWQgb3V0IGFuZAotCSAqIHdhaXQgdG8gcmVhZCB0aGUgc2Vjb25kIGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkTmV4dCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgdGhyZWFkcyBzaG91bGQgaGF2ZSByZWFkIHRoZSBjb3JyZWN0IGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhdG9yIDotKQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTIubmV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkSGFzTmV4dCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJSGFzTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBIYXNOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGxhc3QgZWxlbWVudCwKLQkJLy8gYnV0IHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgb24gdGhlIGl0ZXJhdG9yIDotKAotCQlhc3NlcnRFcXVhbHMoImJheiIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJ1bm5hYmxlMi5oYXNOZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkSGFzTmV4dCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUhhc05leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgSGFzTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBsYXN0IGVsZW1lbnQsCi0JCS8vIGFuZCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZXJlIGFyZSBubyBtb3JlIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcnVubmFibGUyLmhhc05leHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCVJlbW92ZVRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBSZW1vdmVUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSB3cm9uZyBlbGVtZW50IHdhcyByZW1vdmVkIDotKAotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0RmFsc2UoaXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplZFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlSZW1vdmVUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUmVtb3ZlVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgY29ycmVjdCBlbGVtZW50IHdhcyByZW1vdmVkIDotKQotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JVGVzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRUZXN0SXRlcmF0b3IobG9uZyBkZWxheSkgewotCQlyZXR1cm4gbmV3IFRlc3RJdGVyYXRvcjxTdHJpbmc+KGRlbGF5LCB0aGlzLmJ1aWxkQXJyYXkoKSk7Ci0JfQotCi0JU3RyaW5nW10gYnVpbGRBcnJheSgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7ImZvbyIsICJiYXIiLCAiYmF6In07Ci0JfQotCi0JSXRlcmF0b3I8U3RyaW5nPiBidWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbml6ZWRJdGVyYXRvcjxTdHJpbmc+KG5lc3RlZEl0ZXJhdG9yKTsKLQl9Ci0KLQotCS8qKgotCSAqIG5leHQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBOZXh0VGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJRSBuZXh0OwotCi0JCU5leHRUZXN0UnVubmFibGUoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLm5leHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogaGFzIG5leHQgcnVubmFibGUKLQkgKi8KLQljbGFzcyBIYXNOZXh0VGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJYm9vbGVhbiBoYXNOZXh0OwotCi0JCUhhc05leHRUZXN0UnVubmFibGUoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLmhhc05leHQgPSB0aGlzLml0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogcmVtb3ZlIHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgUmVtb3ZlVGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQotCQlSZW1vdmVUZXN0UnVubmFibGUoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLml0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGl0ZXJhdG9yOiBJZiB7QGxpbmsgI25leHQoKX0gaXMgY2FsbGVkIHdoaWxlIGV4ZWN1dGluZyBvbiB0aGUKLQkgKiB7QGxpbmsgc2xvd1RocmVhZH0sIHRoZSBpdGVyYXRvciB3aWxsIGRlbGF5IGZvciB0aGUgY29uZmlndXJlZCB0aW1lLgotCSAqLwotCXN0YXRpYyBjbGFzcyBUZXN0SXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7Ci0JCWZpbmFsIGxvbmcgZGVsYXk7Ci0JCWZpbmFsIEFycmF5TGlzdDxFPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxFPigpOwotCQlpbnQgbmV4dEluZGV4ID0gMDsKLQkJaW50IGxhc3RJbmRleCA9IC0xOwotCQlUaHJlYWQgc2xvd1RocmVhZDsKLQotCQlUZXN0SXRlcmF0b3IobG9uZyBkZWxheSwgRS4uLiBhcnJheSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZGVsYXkgPSBkZWxheTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5saXN0LCBhcnJheSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICE9IHRoaXMubGlzdC5zaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgRSBuZXh0KCkgewotCQkJaWYgKHRoaXMuaGFzTmV4dCgpKSB7Ci0JCQkJRSBuZXh0ID0gdGhpcy5saXN0LmdldCh0aGlzLm5leHRJbmRleCk7Ci0JCQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gdGhpcy5zbG93VGhyZWFkKSB7Ci0JCQkJCVRlc3RUb29scy5zbGVlcCh0aGlzLmRlbGF5KTsKLQkJCQl9Ci0JCQkJdGhpcy5sYXN0SW5kZXggPSB0aGlzLm5leHRJbmRleCsrOwotCQkJCXJldHVybiBuZXh0OwotCQkJfQotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCWlmICh0aGlzLmxhc3RJbmRleCA9PSAtMSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubGlzdC5yZW1vdmUodGhpcy5sYXN0SW5kZXgpOwotCQkJaWYgKHRoaXMubGFzdEluZGV4IDwgdGhpcy5uZXh0SW5kZXgpIHsgIC8vIGNoZWNrIG5lY2Vzc2FyeSBmb3IgTGlzdEl0ZXJhdG9yCi0JCQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJCX0KLQkJCXRoaXMubGFzdEluZGV4ID0gLTE7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmMGFjNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1N5bmNocm9uaXplZExpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlN5bmNocm9uaXplZExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cwotCWV4dGVuZHMgU3luY2hyb25pemVkSXRlcmF0b3JUZXN0cwotewotCXB1YmxpYyBTeW5jaHJvbml6ZWRMaXN0SXRlcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIGJvdGggdGhyZWFkcyBzaG91bGQgaGF2ZSByZWFkIHRoZSBzYW1lIGVsZW1lbnQgZnJvbSB0aGUgaXRlcmF0b3IgOi0oCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTIucHJldmlvdXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZWRQcmV2aW91cygpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCW5lc3RlZEl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIHRocmVhZHMgc2hvdWxkIGhhdmUgcmVhZCB0aGUgY29ycmVjdCBlbGVtZW50cyBmcm9tIHRoZSBpdGVyYXRvciA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMi5wcmV2aW91cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkSGFzUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgUHJldmlvdXNUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhyZWFkIDEgd2lsbCBoYXZlIHRoZSBmaXJzdCBlbGVtZW50LAotCQkvLyBidXQgdGhyZWFkIDIgd2lsbCB0aGluayB0aGVyZSBhcmUgbW9yZSAicHJldmlvdXMiIGVsZW1lbnRzIG9uIHRoZSBpdGVyYXRvciA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEucHJldmlvdXMpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcnVubmFibGUyLmhhc1ByZXZpb3VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkSGFzUHJldmlvdXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihuZXN0ZWRJdGVyYXRvcik7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBQcmV2aW91c1Rlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUhhc1ByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IEhhc1ByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGFuZCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZXJlIGFyZSBubyBtb3JlICJwcmV2aW91cyIgZWxlbWVudHMgb24gdGhlIGl0ZXJhdG9yIDotKQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcnVubmFibGUyLmhhc1ByZXZpb3VzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWROZXh0SW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFRlc3RJdGVyYXRvcihUV09fVElDS1MpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQlpdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYnV0IHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlIG5leHQgaW5kZXggaXMgc3RpbGwgMCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygwLCBydW5uYWJsZTIubmV4dEluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkTmV4dEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCU5leHRJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBOZXh0SW5kZXhUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRocmVhZCAxIHdpbGwgaGF2ZSB0aGUgZmlyc3QgZWxlbWVudCwKLQkJLy8gYW5kIHRocmVhZCAyIHdpbGwgdGhpbmsgdGhlIG5leHQgaW5kZXggaXMgMSA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEVxdWFscygxLCBydW5uYWJsZTIubmV4dEluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5zeW5jaHJvbml6ZWRQcmV2aW91c0luZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBQcmV2aW91c0luZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGJ1dCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIHN0aWxsIDAgOi0oCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcnVubmFibGUxLnByZXZpb3VzKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJ1bm5hYmxlMi5wcmV2aW91c0luZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkUHJldmlvdXNJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5idWlsZFN5bmNocm9uaXplZEl0ZXJhdG9yKG5lc3RlZEl0ZXJhdG9yKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCVByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IFByZXZpb3VzVGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJUHJldmlvdXNJbmRleFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBQcmV2aW91c0luZGV4VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJbmVzdGVkSXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aHJlYWQgMSB3aWxsIGhhdmUgdGhlIGZpcnN0IGVsZW1lbnQsCi0JCS8vIGFuZCB0aHJlYWQgMiB3aWxsIHRoaW5rIHRoZSBuZXh0IGluZGV4IGlzIC0xIDotKQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJ1bm5hYmxlMS5wcmV2aW91cyk7Ci0JCWFzc2VydEVxdWFscygtMSwgcnVubmFibGUyLnByZXZpb3VzSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkVGVzdEl0ZXJhdG9yKFRXT19USUNLUyk7Ci0JCWl0ZXJhdG9yLm5leHQoKTsKLQotCQlOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUxID0gbmV3IE5leHRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvcik7Ci0JCVRocmVhZCB0aHJlYWQxID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTEpOwotCQlTZXRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTIgPSBuZXcgU2V0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IsICJ4eHgiKTsKLQkJVGhyZWFkIHRocmVhZDIgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMik7Ci0JCWl0ZXJhdG9yLnNsb3dUaHJlYWQgPSB0aHJlYWQxOwotCi0JCXRocmVhZDEuc3RhcnQoKTsKLQotCQkvLyBhbGxvdyB0aHJlYWQgMSB0byByZWFkIHRoZSBmaXJzdCBlbGVtZW50IGFuZCBnZXQgYm9nZ2VkIGRvd24KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhyZWFkMi5zdGFydCgpOwotCi0JCS8vIHdhaXQgZm9yIHRoZSB0aHJlYWRzIHRvIGZpbmlzaAotCQl0aHJlYWQxLmpvaW4oKTsKLQkJdGhyZWFkMi5qb2luKCk7Ci0KLQkJLy8gdGhlIHdyb25nIGVsZW1lbnQgd2FzIHNldCA6LSgKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydEZhbHNlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJU2V0VGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IFNldFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yLCAieHh4Iik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSByaWdodCBlbGVtZW50IHdhcyBzZXQgOi0pCi0JCWFzc2VydEVxdWFscygiYmFyIiwgcnVubmFibGUxLm5leHQpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoInh4eCIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3luY2hyb25pemVkQWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJaXRlcmF0b3IubmV4dCgpOwotCi0JCU5leHRUZXN0UnVubmFibGU8U3RyaW5nPiBydW5uYWJsZTEgPSBuZXcgTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yKTsKLQkJVGhyZWFkIHRocmVhZDEgPSB0aGlzLmJ1aWxkVGhyZWFkKHJ1bm5hYmxlMSk7Ci0JCUFkZFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMiA9IG5ldyBBZGRUZXN0UnVubmFibGU8U3RyaW5nPihpdGVyYXRvciwgInh4eCIpOwotCQlUaHJlYWQgdGhyZWFkMiA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUyKTsKLQkJaXRlcmF0b3Iuc2xvd1RocmVhZCA9IHRocmVhZDE7Ci0KLQkJdGhyZWFkMS5zdGFydCgpOwotCi0JCS8vIGFsbG93IHRocmVhZCAxIHRvIHJlYWQgdGhlIGZpcnN0IGVsZW1lbnQgYW5kIGdldCBib2dnZWQgZG93bgotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQl0aHJlYWQyLnN0YXJ0KCk7Ci0KLQkJLy8gd2FpdCBmb3IgdGhlIHRocmVhZHMgdG8gZmluaXNoCi0JCXRocmVhZDEuam9pbigpOwotCQl0aHJlYWQyLmpvaW4oKTsKLQotCQkvLyB0aGUgZWxlbWVudCB3YXMgYWRkZWQgYXQgdGhlIHdyb25nIGluZGV4IDotKAotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJ1bm5hYmxlMS5uZXh0KTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpdGVyYXRvci5saXN0LmluZGV4T2YoInh4eCIpKTsKLQkJYXNzZXJ0VHJ1ZShpdGVyYXRvci5saXN0LmNvbnRhaW5zKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUoaXRlcmF0b3IubGlzdC5jb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKGl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY2hyb25pemVkQWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciA9IHRoaXMuYnVpbGRUZXN0SXRlcmF0b3IoVFdPX1RJQ0tTKTsKLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLmJ1aWxkU3luY2hyb25pemVkSXRlcmF0b3IobmVzdGVkSXRlcmF0b3IpOwotCQlpdGVyYXRvci5uZXh0KCk7Ci0KLQkJTmV4dFRlc3RSdW5uYWJsZTxTdHJpbmc+IHJ1bm5hYmxlMSA9IG5ldyBOZXh0VGVzdFJ1bm5hYmxlPFN0cmluZz4oaXRlcmF0b3IpOwotCQlUaHJlYWQgdGhyZWFkMSA9IHRoaXMuYnVpbGRUaHJlYWQocnVubmFibGUxKTsKLQkJQWRkVGVzdFJ1bm5hYmxlPFN0cmluZz4gcnVubmFibGUyID0gbmV3IEFkZFRlc3RSdW5uYWJsZTxTdHJpbmc+KGl0ZXJhdG9yLCAieHh4Iik7Ci0JCVRocmVhZCB0aHJlYWQyID0gdGhpcy5idWlsZFRocmVhZChydW5uYWJsZTIpOwotCQluZXN0ZWRJdGVyYXRvci5zbG93VGhyZWFkID0gdGhyZWFkMTsKLQotCQl0aHJlYWQxLnN0YXJ0KCk7Ci0KLQkJLy8gYWxsb3cgdGhyZWFkIDEgdG8gcmVhZCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgZ2V0IGJvZ2dlZCBkb3duCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRocmVhZDIuc3RhcnQoKTsKLQotCQkvLyB3YWl0IGZvciB0aGUgdGhyZWFkcyB0byBmaW5pc2gKLQkJdGhyZWFkMS5qb2luKCk7Ci0JCXRocmVhZDIuam9pbigpOwotCi0JCS8vIHRoZSBlbGVtZW50IHdhcyBhZGRlZCBhdCB0aGUgY29ycmVjdCBpbmRleCA6LSkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBydW5uYWJsZTEubmV4dCk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgbmVzdGVkSXRlcmF0b3IubGlzdC5pbmRleE9mKCJ4eHgiKSk7Ci0JCWFzc2VydFRydWUobmVzdGVkSXRlcmF0b3IubGlzdC5jb250YWlucygieHh4IikpOwotCQlhc3NlcnRUcnVlKG5lc3RlZEl0ZXJhdG9yLmxpc3QuY29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZShuZXN0ZWRJdGVyYXRvci5saXN0LmNvbnRhaW5zKCJiYXoiKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRTeW5jaHJvbml6ZWRJdGVyYXRvcihJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25pemVkTGlzdEl0ZXJhdG9yPFN0cmluZz4oKExpc3RJdGVyYXRvcjxTdHJpbmc+KSBuZXN0ZWRJdGVyYXRvcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JVGVzdExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkVGVzdEl0ZXJhdG9yKGxvbmcgZGVsYXkpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TGlzdEl0ZXJhdG9yPFN0cmluZz4oZGVsYXksIHRoaXMuYnVpbGRBcnJheSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmV2aW91cyBydW5uYWJsZQotCSAqLwotCWNsYXNzIFByZXZpb3VzVGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCUUgcHJldmlvdXM7Ci0KLQkJUHJldmlvdXNUZXN0UnVubmFibGUoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5wcmV2aW91cyA9IHRoaXMuaXRlcmF0b3IucHJldmlvdXMoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogaGFzIHByZXZpb3VzIHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgSGFzUHJldmlvdXNUZXN0UnVubmFibGU8RT4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCWZpbmFsIExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcjsKLQkJYm9vbGVhbiBoYXNQcmV2aW91czsKLQotCQlIYXNQcmV2aW91c1Rlc3RSdW5uYWJsZShMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0aGlzLmhhc1ByZXZpb3VzID0gdGhpcy5pdGVyYXRvci5oYXNQcmV2aW91cygpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBuZXh0IGluZGV4IHJ1bm5hYmxlCi0JICovCi0JY2xhc3MgTmV4dEluZGV4VGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWludCBuZXh0SW5kZXg7Ci0KLQkJTmV4dEluZGV4VGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMubmV4dEluZGV4ID0gdGhpcy5pdGVyYXRvci5uZXh0SW5kZXgoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogcHJldmlvdXMgaW5kZXggcnVubmFibGUKLQkgKi8KLQljbGFzcyBQcmV2aW91c0luZGV4VGVzdFJ1bm5hYmxlPEU+IGltcGxlbWVudHMgUnVubmFibGUgewotCQlmaW5hbCBMaXN0SXRlcmF0b3I8RT4gaXRlcmF0b3I7Ci0JCWludCBwcmV2aW91c0luZGV4OwotCi0JCVByZXZpb3VzSW5kZXhUZXN0UnVubmFibGUoTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdGhpcy5wcmV2aW91c0luZGV4ID0gdGhpcy5pdGVyYXRvci5wcmV2aW91c0luZGV4KCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHNldCBydW5uYWJsZQotCSAqLwotCWNsYXNzIFNldFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlmaW5hbCBFIGVsZW1lbnQ7Ci0KLQkJU2V0VGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgRSBlbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMuaXRlcmF0b3Iuc2V0KHRoaXMuZWxlbWVudCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIGFkZCBydW5uYWJsZQotCSAqLwotCWNsYXNzIEFkZFRlc3RSdW5uYWJsZTxFPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJZmluYWwgTGlzdEl0ZXJhdG9yPEU+IGl0ZXJhdG9yOwotCQlmaW5hbCBFIGVsZW1lbnQ7Ci0KLQkJQWRkVGVzdFJ1bm5hYmxlKExpc3RJdGVyYXRvcjxFPiBpdGVyYXRvciwgRSBlbGVtZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRoaXMuaXRlcmF0b3IuYWRkKHRoaXMuZWxlbWVudCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFRlc3QgaXRlcmF0b3I6IElmIHtAbGluayAjbmV4dCgpfSBvciB7QGxpbmsgI3ByZXZpb3VzKCl9IGlzIGNhbGxlZAotCSAqIHdoaWxlIGV4ZWN1dGluZyBvbiB0aGUge0BsaW5rIHNsb3dUaHJlYWR9LCB0aGUgaXRlcmF0b3Igd2lsbCBkZWxheQotCSAqIGZvciB0aGUgY29uZmlndXJlZCB0aW1lLgotCSAqLwotCXN0YXRpYyBjbGFzcyBUZXN0TGlzdEl0ZXJhdG9yPEU+IGV4dGVuZHMgVGVzdEl0ZXJhdG9yPEU+IGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPEU+IHsKLQotCQlUZXN0TGlzdEl0ZXJhdG9yKGxvbmcgZGVsYXksIEUuLi4gYXJyYXkpIHsKLQkJCXN1cGVyKGRlbGF5LCBhcnJheSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLQkJCXJldHVybiB0aGlzLm5leHRJbmRleDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQkJcmV0dXJuIHRoaXMubmV4dEluZGV4ICE9IDA7Ci0JCX0KLQotCQlwdWJsaWMgRSBwcmV2aW91cygpIHsKLQkJCWlmICh0aGlzLmhhc1ByZXZpb3VzKCkpIHsKLQkJCQlFIHByZXZpb3VzID0gdGhpcy5saXN0LmdldCh0aGlzLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gdGhpcy5zbG93VGhyZWFkKSB7Ci0JCQkJCVRlc3RUb29scy5zbGVlcCh0aGlzLmRlbGF5KTsKLQkJCQl9Ci0JCQkJdGhpcy5uZXh0SW5kZXgtLTsKLQkJCQl0aGlzLmxhc3RJbmRleCA9IHRoaXMubmV4dEluZGV4OwotCQkJCXJldHVybiBwcmV2aW91czsKLQkJCX0KLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uZXh0SW5kZXggLSAxOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0KEUgZSkgewotCQkJaWYgKHRoaXMubGFzdEluZGV4ID09IC0xKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5saXN0LnNldCh0aGlzLmxhc3RJbmRleCwgZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoRSBlKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKHRoaXMubGFzdEluZGV4LCBlKTsKLQkJCXRoaXMubGFzdEluZGV4Kys7Ci0JCQl0aGlzLmxhc3RJbmRleCA9IC0xOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyYW5zZm9ybWF0aW9uSXRlcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjcxODVhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNmb3JtYXRpb25JdGVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTmV4dFVwY2FzdCgpIHsKLQkJaW50IGkgPSAwOwotCQlmb3IgKEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQkJaSsrOwotCQl9Ci0JCWFzc2VydEVxdWFscyg4LCBpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5uZXJIYXNOZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0KCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlhc3NlcnRFcXVhbHMoImJvZ3VzIHRyYW5zZm9ybWF0aW9uIiwgKytpLCBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxPYmplY3Q+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvclVwY2FzdCgpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgKChJbnRlZ2VyKSBzdHJlYW0ubmV4dCgpKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHQoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJYXNzZXJ0RXF1YWxzKCJib2d1cyB0cmFuc2Zvcm1hdGlvbiIsICsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gdGhpcy5idWlsZENvbGxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSW5uZXJUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKGMuaXRlcmF0b3IoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpID09IDMpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQiLCB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLnNpemUoKSAtIDEsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiIsIGMuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIiwgYy5jb250YWlucygiMjIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyUmVtb3ZlKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gYyA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uKCk7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoYy5pdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpID09IDMpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQiLCB0aGlzLmJ1aWxkQ29sbGVjdGlvbigpLnNpemUoKSAtIDEsIGMuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gY29sbGVjdGlvbiIsIGMuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIiwgYy5jb250YWlucygiMjIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0JCUludGVnZXIgaW50ZWdlciA9IG51bGw7Ci0JCXdoaWxlIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlpbnRlZ2VyID0gc3RyZWFtLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd246ICIgKyBpbnRlZ2VyLCBleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpbnQgaSA9IHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKTsKLQkJCWlmIChpID09IDMpIHsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMuYnVpbGRJdGVyYXRvcigpLnJlbW92ZSgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25JdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZEl0ZXJhdG9yVXBjYXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JVcGNhc3QodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCksIHRoaXMuYnVpbGRUcmFuc2Zvcm1lclVwY2FzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uSXRlcmF0b3IodGhpcy5idWlsZE5lc3RlZEl0ZXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVOZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8U3RyaW5nLCBJbnRlZ2VyPihuZXN0ZWRJdGVyYXRvciwgdHJhbnNmb3JtZXIpOwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8T2JqZWN0PiBidWlsZFRyYW5zZm9ybWF0aW9uSXRlcmF0b3JVcGNhc3QoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8T2JqZWN0LCBPYmplY3Q+KG5lc3RlZEl0ZXJhdG9yLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKFN0cmluZyBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKG5leHQubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPiBidWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8T2JqZWN0LCBJbnRlZ2VyPigpIHsKLQkJCXB1YmxpYyBJbnRlZ2VyIHRyYW5zZm9ybShPYmplY3QgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcigoKFN0cmluZykgbmV4dCkubGVuZ3RoKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uSXRlcmF0b3IoSXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvcikgewotCQkvLyB0cmFuc2Zvcm0gZWFjaCBzdHJpbmcgaW50byBhbiBpbnRlZ2VyIHdpdGggYSB2YWx1ZSBvZiB0aGUgc3RyaW5nJ3MgbGVuZ3RoCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGROZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVOZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWMuYWRkKCIxIik7Ci0JCWMuYWRkKCIyMiIpOwotCQljLmFkZCgiMzMzIik7Ci0JCWMuYWRkKCI0NDQ0Iik7Ci0JCWMuYWRkKCI1NTU1NSIpOwotCQljLmFkZCgiNjY2NjY2Iik7Ci0JCWMuYWRkKCI3Nzc3Nzc3Iik7Ci0JCWMuYWRkKCI4ODg4ODg4OCIpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBidWlsZFVubW9kaWZpYWJsZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVHJhbnNmb3JtYXRpb25JdGVyYXRvcigpIHsKLQkJLy8gbWlzc2luZyBtZXRob2Qgb3ZlcnJpZGUKLQkJSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkuaXRlcmF0b3IoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUludGVnZXIgaW50ZWdlciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgaW50ZWdlcjogIiArIGludGVnZXIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9pdGVyYXRvcnMvVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDM4MDkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuaXRlcmF0b3JzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc05leHRBbmRIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0QW5kSGFzUHJldmlvdXNVcGNhc3QoKSB7Ci0JCWludCBpID0gMDsKLQkJTGlzdEl0ZXJhdG9yPE9iamVjdD4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yVXBjYXN0KCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCQlpKys7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDgsIGkpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJc3RyZWFtLnByZXZpb3VzKCk7Ci0JCQlpLS07Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lckhhc05leHRBbmRIYXNQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJc3RyZWFtLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHMoOCwgaSk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJCWktLTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoMCwgaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRBbmRQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZEl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0KCkuaW50VmFsdWUoKSk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXMoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbm5lck5leHRBbmRQcmV2aW91cygpIHsKLQkJaW50IGkgPSAwOwotCQlMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVySXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCsraSwgc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCSsraTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc1ByZXZpb3VzKCkpIHsKLQkJCWFzc2VydEVxdWFscygtLWksIHN0cmVhbS5wcmV2aW91cygpLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5leHRJbmRleEFuZFByZXZpb3VzSW5kZXgoKSB7Ci0JCWludCBpID0gLTE7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKCsraSwgc3RyZWFtLm5leHRJbmRleCgpKTsKLQkJCXN0cmVhbS5uZXh0KCk7Ci0JCX0KLQotCQkrK2k7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNQcmV2aW91cygpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoLS1pLCBzdHJlYW0ucHJldmlvdXNJbmRleCgpKTsKLQkJCXN0cmVhbS5wcmV2aW91cygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyTmV4dEluZGV4QW5kUHJldmlvdXNJbmRleCgpIHsKLQkJaW50IGkgPSAtMTsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJbm5lckl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCWFzc2VydEVxdWFscygrK2ksIHN0cmVhbS5uZXh0SW5kZXgoKSk7Ci0JCQlzdHJlYW0ubmV4dCgpOwotCQl9Ci0KLQkJKytpOwotCi0JCXdoaWxlIChzdHJlYW0uaGFzUHJldmlvdXMoKSkgewotCQkJYXNzZXJ0RXF1YWxzKC0taSwgc3RyZWFtLnByZXZpb3VzSW5kZXgoKSk7Ci0JCQlzdHJlYW0ucHJldmlvdXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsID0gdGhpcy5idWlsZExpc3QoKTsKLQkJZm9yIChMaXN0SXRlcmF0b3I8SW50ZWdlcj4gc3RyZWFtID0gdGhpcy5idWlsZElubmVyVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3IobC5saXN0SXRlcmF0b3IoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpID09IDMpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSAtIDEsIGwuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gbGlzdCIsIGwuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIiwgbC5jb250YWlucygiMjIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElubmVyUmVtb3ZlKCkgewotCQlMaXN0PFN0cmluZz4gbCA9IHRoaXMuYnVpbGRMaXN0KCk7Ci0JCWZvciAoTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihsLmxpc3RJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAoc3RyZWFtLm5leHQoKS5pbnRWYWx1ZSgpID09IDMpIHsKLQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCJub3RoaW5nIHJlbW92ZWQiLCB0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSAtIDEsIGwuc2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoImVsZW1lbnQgc3RpbGwgaW4gbGlzdCIsIGwuY29udGFpbnMoIjMzMyIpKTsKLQkJYXNzZXJ0VHJ1ZSgid3JvbmcgZWxlbWVudCByZW1vdmVkIiwgbC5jb250YWlucygiMjIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uT25BZGQoKSB7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RyZWFtLmFkZChuZXcgSW50ZWdlcigwKSk7Ci0JCQlmYWlsKCJleGNlcHRpb24gbm90IHRocm93biIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uT25TZXQoKSB7Ci0JCUxpc3RJdGVyYXRvcjxJbnRlZ2VyPiBzdHJlYW0gPSB0aGlzLmJ1aWxkSXRlcmF0b3IoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJc3RyZWFtLnNldChuZXcgSW50ZWdlcigwKSk7Ci0JCQlmYWlsKCJleGNlcHRpb24gbm90IHRocm93biIpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRJdGVyYXRvcigpOwotCQlJbnRlZ2VyIGludGVnZXIgPSBudWxsOwotCQl3aGlsZSAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJaW50ZWdlciA9IHN0cmVhbS5uZXh0KCk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludGVnZXIgPSBzdHJlYW0ubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duOiAiICsgaW50ZWdlciwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yPEludGVnZXI+IHN0cmVhbSA9IHRoaXMuYnVpbGRVbm1vZGlmaWFibGVJdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJaW50IGkgPSBzdHJlYW0ubmV4dCgpLmludFZhbHVlKCk7Ci0JCQlpZiAoaSA9PSAzKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSXRlcmF0b3IoKS5yZW1vdmUoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcih0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPE9iamVjdD4gYnVpbGRJdGVyYXRvclVwY2FzdCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvclVwY2FzdCh0aGlzLmJ1aWxkTmVzdGVkSXRlcmF0b3IoKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyVXBjYXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPEludGVnZXI+IGJ1aWxkSW5uZXJJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGROZXN0ZWRJdGVyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxJbnRlZ2VyPiBidWlsZFVubW9kaWZpYWJsZUl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKHRoaXMuYnVpbGRVbm1vZGlmaWFibGVOZXN0ZWRJdGVyYXRvcigpLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcihMaXN0SXRlcmF0b3I8U3RyaW5nPiBuZXN0ZWRJdGVyYXRvciwgVHJhbnNmb3JtZXI8U3RyaW5nLCBJbnRlZ2VyPiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yPFN0cmluZywgSW50ZWdlcj4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxPYmplY3Q+IGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0SXRlcmF0b3JVcGNhc3QoTGlzdEl0ZXJhdG9yPFN0cmluZz4gbmVzdGVkSXRlcmF0b3IsIFRyYW5zZm9ybWVyPE9iamVjdCwgSW50ZWdlcj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxPYmplY3QsIE9iamVjdD4obmVzdGVkSXRlcmF0b3IsIHRyYW5zZm9ybWVyKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJLy8gdHJhbnNmb3JtIGVhY2ggc3RyaW5nIGludG8gYW4gaW50ZWdlciB3aXRoIGEgdmFsdWUgb2YgdGhlIHN0cmluZydzIGxlbmd0aAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFN0cmluZywgSW50ZWdlcj4oKSB7Ci0JCQlwdWJsaWMgSW50ZWdlciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIobmV4dC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxPYmplY3QsIEludGVnZXI+IGJ1aWxkVHJhbnNmb3JtZXJVcGNhc3QoKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxPYmplY3QsIEludGVnZXI+KCkgewotCQkJcHVibGljIEludGVnZXIgdHJhbnNmb3JtKE9iamVjdCBuZXh0KSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKCgoU3RyaW5nKSBuZXh0KS5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0SXRlcmF0b3I8SW50ZWdlcj4gYnVpbGRJbm5lclRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCS8vIHRyYW5zZm9ybSBlYWNoIHN0cmluZyBpbnRvIGFuIGludGVnZXIgd2l0aCBhIHZhbHVlIG9mIHRoZSBzdHJpbmcncyBsZW5ndGgKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KG5lc3RlZEl0ZXJhdG9yKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbnRlZ2VyIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCXJldHVybiBuZXcgSW50ZWdlcihuZXh0Lmxlbmd0aCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RJdGVyYXRvcjxTdHJpbmc+IGJ1aWxkTmVzdGVkSXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdCgpLmxpc3RJdGVyYXRvcigpOwotCX0KLQotCXByaXZhdGUgTGlzdEl0ZXJhdG9yPFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVOZXN0ZWRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRVbm1vZGlmaWFibGVMaXN0KCkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gbCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlsLmFkZCgiMSIpOwotCQlsLmFkZCgiMjIiKTsKLQkJbC5hZGQoIjMzMyIpOwotCQlsLmFkZCgiNDQ0NCIpOwotCQlsLmFkZCgiNTU1NTUiKTsKLQkJbC5hZGQoIjY2NjY2NiIpOwotCQlsLmFkZCgiNzc3Nzc3NyIpOwotCQlsLmFkZCgiODg4ODg4ODgiKTsKLQkJcmV0dXJuIGw7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRVbm1vZGlmaWFibGVMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyYW5zZm9ybWF0aW9uTGlzdEl0ZXJhdG9yKCkgewotCQkvLyBtaXNzaW5nIG1ldGhvZCBvdmVycmlkZQotCQlJdGVyYXRvcjxJbnRlZ2VyPiBpdGVyYXRvciA9IG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RJdGVyYXRvcjxTdHJpbmcsIEludGVnZXI+KHRoaXMuYnVpbGRMaXN0KCkubGlzdEl0ZXJhdG9yKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlJbnRlZ2VyIGludGVnZXIgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmYWlsKCJpbnZhbGlkIGludGVnZXI6ICIgKyBpbnRlZ2VyKTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKCJOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5vdCB0aHJvd24iLCBleENhdWdodCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvaXRlcmF0b3JzL1RyZWVJdGVyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MDBlMTIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL2l0ZXJhdG9ycy9UcmVlSXRlcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLml0ZXJhdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmVlSXRlcmF0b3JUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkvKiogdGhpcyB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIGFsbCB0aGUgbm9kZXMgY3JlYXRlZCBmb3IgdGhlIHRlc3QgKi8KLQlDb2xsZWN0aW9uPFRyZWVOb2RlPiBub2RlcyA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQlwdWJsaWMgVHJlZUl0ZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNOZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlIYXNOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOZXh0KEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlhc3NlcnRFcXVhbHModGhpcy5ub2Rlcy5zaXplKCksIGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MSgpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXh0MigpIHsKLQkJdGhpcy52ZXJpZnlOZXh0KHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOZXh0KEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlhc3NlcnRUcnVlKCJib2d1cyBlbGVtZW50IiwgdGhpcy5ub2Rlcy5jb250YWlucyhpdGVyYXRvci5uZXh0KCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMSgpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IxKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hFbGVtZW50RXhjZXB0aW9uMigpIHsKLQkJdGhpcy52ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKHRoaXMuYnVpbGRUcmVlSXRlcmF0b3IyKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKEl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvcikgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCQl0cnkgewotCQkJaXRlcmF0b3IubmV4dCgpOwotCQl9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBub3QgdGhyb3duIiwgZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUxKCkgewotCQl0aGlzLnZlcmlmeVJlbW92ZSh0aGlzLmJ1aWxkVHJlZUl0ZXJhdG9yMSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMigpIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmUodGhpcy5idWlsZFRyZWVJdGVyYXRvcjIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVJlbW92ZShJdGVyYXRvcjxUcmVlTm9kZT4gaXRlcmF0b3IpIHsKLQkJU3RyaW5nIHBhcmVudE5hbWUgPSAiY2hpbGQgMiI7Ci0JCVN0cmluZyBjaGlsZE5hbWUgPSAiZ3JhbmRjaGlsZCAyQSI7Ci0JCWludCBzdGFydFNpemUgPSB0aGlzLmNoaWxkcmVuU2l6ZShwYXJlbnROYW1lKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJVHJlZU5vZGUgbm9kZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JCWludCBlbmRTaXplID0gdGhpcy5jaGlsZHJlblNpemUocGFyZW50TmFtZSk7Ci0JCWFzc2VydEVxdWFscyhzdGFydFNpemUgLSAxLCBlbmRTaXplKTsKLQl9Ci0KLQlwcml2YXRlIGludCBjaGlsZHJlblNpemUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWZvciAoSXRlcmF0b3I8VHJlZU5vZGU+IHN0cmVhbSA9IHRoaXMubm9kZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCVRyZWVOb2RlIG5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFscyhub2RlTmFtZSkpIHsKLQkJCQlyZXR1cm4gbm9kZS5jaGlsZHJlblNpemUoKTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5vZGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBidWlsZCBhIHRyZWUgaXRlcmF0b3Igd2l0aCBhbiBleHBsaWNpdCBtaWR3aWZlCi0JICovCi0JcHJpdmF0ZSBJdGVyYXRvcjxUcmVlTm9kZT4gYnVpbGRUcmVlSXRlcmF0b3IxKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUcmVlTm9kZT4odGhpcy5idWlsZFRyZWUoKSwgdGhpcy5idWlsZE1pZHdpZmUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlSXRlcmF0b3IuTWlkd2lmZTxUcmVlTm9kZT4gYnVpbGRNaWR3aWZlKCkgewotCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvci5NaWR3aWZlPFRyZWVOb2RlPigpIHsKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogYnVpbGQgYSB0cmVlIGl0ZXJhdG9yIHdpdGggYW4gb3ZlcnJpZGUKLQkgKi8KLQlwcml2YXRlIEl0ZXJhdG9yPFRyZWVOb2RlPiBidWlsZFRyZWVJdGVyYXRvcjIoKSB7Ci0JCXJldHVybiBuZXcgVHJlZUl0ZXJhdG9yPFRyZWVOb2RlPih0aGlzLmJ1aWxkVHJlZSgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxUcmVlTm9kZT4gY2hpbGRyZW4oVHJlZU5vZGUgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmNoaWxkcmVuKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmVlSXRlcmF0b3IoKSB7Ci0JCS8vIG1pc3NpbmcgbWV0aG9kIG92ZXJyaWRlCi0JCUl0ZXJhdG9yPFRyZWVOb2RlPiBpdGVyYXRvciA9IG5ldyBUcmVlSXRlcmF0b3I8VHJlZU5vZGU+KHRoaXMuYnVpbGRUcmVlKCkpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlUcmVlTm9kZSB0biA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZhaWwoImludmFsaWQgdHJlZSBub2RlOiAiICsgdG4pOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoIk5vU3VjaEVsZW1lbnRFeGNlcHRpb24gbm90IHRocm93biIsIGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVOb2RlIGJ1aWxkVHJlZSgpIHsKLQkJVHJlZU5vZGUgcm9vdCA9IG5ldyBUcmVlTm9kZSgicm9vdCIpOwotCQlUcmVlTm9kZSBjaGlsZDEgPSBuZXcgVHJlZU5vZGUocm9vdCwgImNoaWxkIDEiKTsKLQkJbmV3IFRyZWVOb2RlKGNoaWxkMSwgImdyYW5kY2hpbGQgMUEiKTsKLQkJVHJlZU5vZGUgY2hpbGQyID0gbmV3IFRyZWVOb2RlKHJvb3QsICJjaGlsZCAyIik7Ci0JCW5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJBIik7Ci0JCVRyZWVOb2RlIGdyYW5kY2hpbGQyQiA9IG5ldyBUcmVlTm9kZShjaGlsZDIsICJncmFuZGNoaWxkIDJCIik7Ci0JCW5ldyBUcmVlTm9kZShncmFuZGNoaWxkMkIsICJncmVhdC1ncmFuZGNoaWxkIDJCMSIpOwotCQluZXcgVHJlZU5vZGUoZ3JhbmRjaGlsZDJCLCAiZ3JlYXQtZ3JhbmRjaGlsZCAyQjIiKTsKLQkJVHJlZU5vZGUgZ3JhbmRjaGlsZDJDID0gbmV3IFRyZWVOb2RlKGNoaWxkMiwgImdyYW5kY2hpbGQgMkMiKTsKLQkJbmV3IFRyZWVOb2RlKGdyYW5kY2hpbGQyQywgImdyZWF0LWdyYW5kY2hpbGQgMkMxIik7Ci0JCW5ldyBUcmVlTm9kZShyb290LCAiY2hpbGQgMyIpOwotCQlyZXR1cm4gcm9vdDsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRyZWVOb2RlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFRyZWVOb2RlPiBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3Q8VHJlZU5vZGU+KCk7Ci0KLQkJcHVibGljIFRyZWVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJVHJlZUl0ZXJhdG9yVGVzdHMudGhpcy5ub2Rlcy5hZGQodGhpcyk7IC8vIGxvZyBub2RlCi0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFRyZWVOb2RlKFRyZWVOb2RlIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMobmFtZSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQodGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZENoaWxkKFRyZWVOb2RlIGNoaWxkKSB7Ci0JCQl0aGlzLmNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmF0b3I8VHJlZU5vZGU+IGNoaWxkcmVuKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY2hpbGRyZW5TaXplKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRyZWVOb2RlKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9DaGFuZ2VTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2NjgyNy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvQ2hhbmdlU3VwcG9ydFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoYW5nZVN1cHBvcnRUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9UT19TVFJJTkcgPSAidGhpcyBpcyBhIHRlc3QiOwotCi0JQ2hhbmdlTGlzdGVuZXIgY2hhbmdlTGlzdGVuZXIgPSBuZXcgQWRhcHRlcigpOwotCi0JU3RhdGVDaGFuZ2VFdmVudCBzdGF0ZUNoYW5nZUV2ZW50OwotCWJvb2xlYW4gc3RhdGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0KLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci0JYm9vbGVhbiBwcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9ICJwcm9wZXJ0eU5hbWUiOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgT0xEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgT2JqZWN0IE5FV19PQkpFQ1RfVkFMVUUgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIEludGVnZXIgT0xEX0lOVF9WQUxVRSA9IG5ldyBJbnRlZ2VyKDI3KTsKLQlzdGF0aWMgZmluYWwgQm9vbGVhbiBPTERfQk9PTEVBTl9WQUxVRSA9IEJvb2xlYW4uVFJVRTsKLQlzdGF0aWMgZmluYWwgSW50ZWdlciBORVdfSU5UX1ZBTFVFID0gbmV3IEludGVnZXIoNDIpOwotCXN0YXRpYyBmaW5hbCBCb29sZWFuIE5FV19CT09MRUFOX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQotCUNvbGxlY3Rpb25FdmVudCBjb2xsZWN0aW9uRXZlbnQ7Ci0JYm9vbGVhbiBpdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX05BTUUgPSAiY29sbGVjdGlvbk5hbWUiOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgQURERURfT0JKRUNUX1ZBTFVFID0gbmV3IE9iamVjdCgpOwotCXN0YXRpYyBmaW5hbCBPYmplY3QgQURERURfT0JKRUNUX1ZBTFVFXzIgPSBuZXcgT2JqZWN0KCk7Ci0Jc3RhdGljIGZpbmFsIE9iamVjdCBSRU1PVkVEX09CSkVDVF9WQUxVRSA9IG5ldyBPYmplY3QoKTsKLQlzdGF0aWMgZmluYWwgaW50IFRBUkdFVF9JTkRFWCA9IDc7Ci0Jc3RhdGljIGZpbmFsIGludCBTT1VSQ0VfSU5ERVggPSAyMjsKLQotCUxpc3RFdmVudCBsaXN0RXZlbnQ7Ci0JYm9vbGVhbiBpdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIGl0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gbGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfTkFNRSA9ICJsaXN0TmFtZSI7Ci0Jc3RhdGljIGZpbmFsIGludCBBRERfSU5ERVggPSAzOwotCXN0YXRpYyBmaW5hbCBpbnQgUkVNT1ZFX0lOREVYID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IFJFUExBQ0VfSU5ERVggPSAyOwotCi0JVHJlZUV2ZW50IHRyZWVFdmVudDsKLQlib29sZWFuIG5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCWJvb2xlYW4gbm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQlib29sZWFuIHRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JYm9vbGVhbiB0cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFJFRV9OQU1FID0gInRyZWVOYW1lIjsKLQlzdGF0aWMgZmluYWwgTGlzdDxPYmplY3Q+IE9CSkVDVF9QQVRIID0gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W10ge25ldyBPYmplY3QoKSwgbmV3IE9iamVjdCgpLCBuZXcgU3RyaW5nKCl9KTsKLQotCi0JcHVibGljIENoYW5nZVN1cHBvcnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYWwgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTb3VyY2UoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUNoYW5nZVN1cHBvcnQgY3MgPSBuZXcgQ2hhbmdlU3VwcG9ydChudWxsKTsKLQkJCWZhaWwoImJvZ3VzIGNoYW5nZSBzdXBwb3J0OiAiICsgY3MpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGUgY2hhbmdlIHRlc3RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlU3RhdGVDaGFuZ2UoKSB7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVN0YXRlQ2hhbmdlKCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zdGF0ZUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLnN0YXRlQ2hhbmdlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3RhdGVDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9TdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzRHVwbGljYXRlKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxTdGF0ZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1N0YXRlTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobmV3IEFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKG5ldyBTdGF0ZUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0eSBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdE5vQ2hhbmdlKCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCkgewotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQobnVsbCwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChudWxsLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRJbnRJbnQoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9MRF9JTlRfVkFMVUUsIE5FV19JTlRfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0lOVF9WQUxVRSwgTkVXX0lOVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludCgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEludEludE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX0JPT0xFQU5fVkFMVUUsIE5FV19CT09MRUFOX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuKCk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VFdmVudChPTERfQk9PTEVBTl9WQUxVRSwgTkVXX0JPT0xFQU5fVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZEJvb2xlYW5Cb29sZWFuTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQotCQl0aGlzLnByb3BlcnR5Q2hhbmdlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUFJPUEVSVFlfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkQm9vbGVhbkJvb2xlYW5Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBST1BFUlRZX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQUk9QRVJUWV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTnVsbFByb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsUHJvcGVydHlMaXN0ZW5lck5hbWUoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c1Byb3BlcnR5TGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBQcm9wZXJ0eUNoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgUHJvcGVydHlDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMudGVzdE1vZGVsLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBST1BFUlRZX05BTUUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIHRoaXMucHJvcGVydHlDaGFuZ2VFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sbGVjdGlvbiBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50KCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uRXZlbnROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbk5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25Ob0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZW1vdmVkQ29sbGVjdGlvbigpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZENvbGxlY3Rpb24oKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNsZWFyZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTWl4ZWQoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFXzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQoQURERURfT0JKRUNUX1ZBTFVFXzIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0NvbGxlY3Rpb25NaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VFdmVudDIoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUsICJmb28iLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50MihSRU1PVkVEX09CSkVDVF9WQUxVRSwgImZvbyIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UyKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UyKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMygpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UzKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25FdmVudChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24xKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkKTsKLQl9Ci0KLQkvLyBjb2xsZWN0aW9uIGNsZWFyZWQuLi4KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb24yKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uMigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRDb2xsZWN0aW9uQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZENvbGxlY3Rpb25DYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQ29sbGVjdGlvbigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb24oKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMuY29sbGVjdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuY29sbGVjdGlvbkV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDT0xMRUNUSU9OX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJDb2xsZWN0aW9uTm9DaGFuZ2UoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckNvbGxlY3Rpb25Ob0NoYW5nZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkNsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24xKCkgewotCQlDb2xsZWN0aW9uU3luY2hMaXN0ZW5lciBjc2wgPSBuZXcgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIoY3NsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMSgpKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuaXRlbXNBZGRlZCk7Ci0JCWFzc2VydFRydWUoY3NsLml0ZW1zUmVtb3ZlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5jb2xsZWN0aW9uQ2hhbmdlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5jb2xsZWN0aW9uQ2xlYXJlZCk7Ci0JCWFzc2VydEVxdWFscygyLCBjc2wuYWRkZWRJdGVtcy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbChjc2wuYWRkZWRJdGVtcywgbmV3IE9iamVjdFtdIHsiam9vIiwgImphciJ9KSk7Ci0JCWFzc2VydEVxdWFscygyLCBjc2wucmVtb3ZlZEl0ZW1zLnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKGNzbC5yZW1vdmVkSXRlbXMsIG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIifSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24yKCkgewotCQlDb2xsZWN0aW9uU3luY2hMaXN0ZW5lciBjc2wgPSBuZXcgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIoY3NsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMigpKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLml0ZW1zQWRkZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuaXRlbXNSZW1vdmVkKTsKLQkJYXNzZXJ0RmFsc2UoY3NsLmNvbGxlY3Rpb25DaGFuZ2VkKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuY29sbGVjdGlvbkNsZWFyZWQpOwotCQlhc3NlcnRUcnVlKGNzbC5hZGRlZEl0ZW1zLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoY3NsLnJlbW92ZWRJdGVtcy5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24zKCkgewotCQlDb2xsZWN0aW9uU3luY2hMaXN0ZW5lciBjc2wgPSBuZXcgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIoKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIoY3NsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMygpKTsKLQkJYXNzZXJ0VHJ1ZShjc2wuaXRlbXNBZGRlZCk7Ci0JCWFzc2VydEZhbHNlKGNzbC5pdGVtc1JlbW92ZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNoYW5nZWQpOwotCQlhc3NlcnRGYWxzZShjc2wuY29sbGVjdGlvbkNsZWFyZWQpOwotCQlhc3NlcnRFcXVhbHMoMywgY3NsLmFkZGVkSXRlbXMuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwoY3NsLmFkZGVkSXRlbXMsIG5ldyBPYmplY3RbXSB7ImpvbyIsICJqYXIiLCAiYmF6In0pKTsKLQkJYXNzZXJ0VHJ1ZShjc2wucmVtb3ZlZEl0ZW1zLmlzRW1wdHkoKSk7Ci0JfQotCi0JY2xhc3MgQ29sbGVjdGlvblN5bmNoTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VBZGFwdGVyIHsKLQkJYm9vbGVhbiBpdGVtc0FkZGVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbXNSZW1vdmVkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkNoYW5nZWQgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZCA9IGZhbHNlOwotCQlDb2xsZWN0aW9uPE9iamVjdD4gYWRkZWRJdGVtcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotCQlDb2xsZWN0aW9uPE9iamVjdD4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZCA9IHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLml0ZW1zQWRkZWQgPSB0cnVlOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmFkZGVkSXRlbXMsIGV2ZW50LmdldEl0ZW1zKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLml0ZW1zUmVtb3ZlZCA9IHRydWU7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMucmVtb3ZlZEl0ZW1zLCBldmVudC5nZXRJdGVtcygpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDT0xMRUNUSU9OX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENPTExFQ1RJT05fTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ09MTEVDVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxDb2xsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzQ29sbGVjdGlvbkxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkV2ZW50KE9iamVjdCBpdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5jb2xsZWN0aW9uRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMuY29sbGVjdGlvbkV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENPTExFQ1RJT05fTkFNRSwgdGhpcy5jb2xsZWN0aW9uRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCB0aGlzLmdldENvbGxlY3Rpb25FdmVudEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTw/PiBnZXRDb2xsZWN0aW9uRXZlbnRJdGVtcygpIHsKLQkJaWYgKHRoaXMuY29sbGVjdGlvbkV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuY29sbGVjdGlvbkV2ZW50KS5nZXRJdGVtcygpOwotCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbkV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuY29sbGVjdGlvbkV2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZUV2ZW50MihPYmplY3QuLi4gaXRlbXMpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNvbGxlY3Rpb25FdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5jb2xsZWN0aW9uRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ09MTEVDVElPTl9OQU1FLCB0aGlzLmNvbGxlY3Rpb25FdmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLmxlbmd0aCwgdGhpcy5nZXRDb2xsZWN0aW9uRXZlbnRJdGVtc1NpemUoKSk7Ci0JCWZvciAoT2JqZWN0IGl0ZW0gOiBpdGVtcykgewotCQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRDb2xsZWN0aW9uRXZlbnRJdGVtcygpLCBpdGVtKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDb2xsZWN0aW9uRXZlbnRJdGVtc1NpemUoKSB7Ci0JCWlmICh0aGlzLmNvbGxlY3Rpb25FdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25BZGRFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbkFkZEV2ZW50KSB0aGlzLmNvbGxlY3Rpb25FdmVudCkuZ2V0SXRlbXNTaXplKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5jb2xsZWN0aW9uRXZlbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5jb2xsZWN0aW9uRXZlbnQpLmdldEl0ZW1zU2l6ZSgpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdCBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc0FkZGVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNBZGRlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtQWRkZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudChBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtQWRkZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KEFERF9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbUFkZGVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudChSRU1PVkVfSU5ERVgsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZW1vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlbW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0RXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudChSRVBMQUNFX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUsIFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zUmVwbGFjZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbVJlcGxhY2VkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1SZXBsYWNlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdEV2ZW50Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RNb3ZlRXZlbnQoVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtc01vdmVkTGlzdE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVJdGVtTW92ZWRMaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudChUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENsZWFyZWRFdmVudCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDbGVhckV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENsZWFyZWQoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDbGVhckV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZUxpc3RDbGVhcmVkKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENsZWFyZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZEV2ZW50KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDaGFuZ2VkKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlRXZlbnQoKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTGlzdENoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2VFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVMaXN0Q2hhbmdlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2hhbmdlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdEluZGV4KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDIsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtVG9MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbVRvTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0QWRkRXZlbnQoMiwgImpvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXgoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RBZGRFdmVudCgzLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0QWRkSXRlbXNUb0xpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdEFkZEV2ZW50KDMsICJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zQWRkZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RBZGRJdGVtc1RvTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc0FkZGVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEFkZEl0ZW1zVG9MaXN0Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdEluZGV4KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbUZyb21MaXN0SW5kZXgoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMSwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbUZyb21MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXhOb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3RJbmRleE5vQ2hhbmdlKCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZW1vdmVFdmVudCgxLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDEsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdE5vQ2hhbmdlKCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJlbW92ZUl0ZW1zRnJvbUxpc3ROb0NoYW5nZSgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmV0YWluSXRlbXNJbkxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVtb3ZlRXZlbnQoMCwgImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXRhaW5JdGVtc0luTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFJldGFpbkl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlbW92ZUV2ZW50KDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmV0YWluSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtSW5MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXBsYWNlSXRlbUluTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoMSwgInh4eCIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RSZXBsYWNlSXRlbUluTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KDEsICJ4eHgiLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0UmVwbGFjZUl0ZW1Jbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVtc0luTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U2V0SXRlbXNJbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0UmVwbGFjZUV2ZW50KDEsICJ4eHgiLCAiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U2V0SXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdFJlcGxhY2VFdmVudCgxLCAieHh4IiwgImJhciIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFNldEl0ZW1zSW5MaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zSW5MaXN0KCkgewotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RNb3ZlSXRlbXNJbkxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KDIsIDQsIDIpOwotCQlhc3NlcnRUcnVlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdE1vdmVJdGVtc0luTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc01vdmVkTGlzdENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0TW92ZUl0ZW1zSW5MaXN0KCk7Ci0JCXRoaXMudmVyaWZ5TGlzdE1vdmVFdmVudCgyLCA0LCAyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zTW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RNb3ZlSXRlbXNJbkxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckxpc3QoKSB7Ci0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdENsZWFyTGlzdCgpOwotCQl0aGlzLnZlcmlmeUxpc3RDbGVhckV2ZW50KCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0Q2xlYXJMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMubGlzdENsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RDbGVhckxpc3QoKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2xlYXJFdmVudCgpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTElTVF9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdENsZWFyTGlzdCgpOwotCQlhc3NlcnROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplTGlzdCgpIHsKLQkJdGhpcy5saXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMuaXRlbXNSZW1vdmVkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdFN5bmNocm9uaXplTGlzdCgpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTeW5jaHJvbml6ZUxpc3QoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQpOwotCi0JCXRoaXMubGlzdEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RTeW5jaHJvbml6ZUxpc3QoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlcGxhY2VkTGlzdENhbGxlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQotCQl0aGlzLmxpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMSVNUX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0U3luY2hyb25pemVMaXN0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLml0ZW1zUmVwbGFjZWRMaXN0Q2FsbGVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5pdGVtc1JlbW92ZWRMaXN0Q2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzQW55TGlzdENoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTElTVF9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMSVNUX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExJU1RfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExJU1RfTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGROdWxsTGlzdExpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG51bGwpOwotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVCb2d1c0xpc3RMaXN0ZW5lcigpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKCJmb28iLCBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBMaXN0Q2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RBZGRFdmVudChpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0QWRkRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdEFkZEV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RSZW1vdmVFdmVudChpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5saXN0RXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0TW9kZWwsIHRoaXMubGlzdEV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExJU1RfTkFNRSwgdGhpcy5saXN0RXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RSZXBsYWNlRXZlbnQoaW50IGluZGV4LCBPYmplY3QgbmV3SXRlbSwgT2JqZWN0IG9sZEl0ZW0pIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld0l0ZW0sICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5saXN0RXZlbnQpLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMob2xkSXRlbSwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0T2xkSXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RNb3ZlRXZlbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0TW92ZUV2ZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgMSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RNb3ZlRXZlbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgsIGludCBsZW5ndGgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRhcmdldEluZGV4LCAoKExpc3RNb3ZlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRUYXJnZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZUluZGV4LCAoKExpc3RNb3ZlRXZlbnQpIHRoaXMubGlzdEV2ZW50KS5nZXRTb3VyY2VJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGxlbmd0aCwgKChMaXN0TW92ZUV2ZW50KSB0aGlzLmxpc3RFdmVudCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0Q2xlYXJFdmVudCgpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmxpc3RFdmVudCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRlc3RNb2RlbCwgdGhpcy5saXN0RXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTElTVF9OQU1FLCB0aGlzLmxpc3RFdmVudC5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RDbGVhckV2ZW50LmNsYXNzLCB0aGlzLmxpc3RFdmVudC5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZUV2ZW50KCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMubGlzdEV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLmxpc3RFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMSVNUX05BTUUsIHRoaXMubGlzdEV2ZW50LmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdENoYW5nZUV2ZW50LmNsYXNzLCB0aGlzLmxpc3RFdmVudC5nZXRDbGFzcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJlZSBjaGFuZ2UgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlKCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVBZGRlZFRyZWVFdmVudCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZUFkZGVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVBZGRlZFRyZWVFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlQWRkZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlQWRkZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZUFkZGVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVBZGRlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVBZGRlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUFkZGVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQoT0JKRUNUX1BBVEgpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlUmVtb3ZlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVOb2RlUmVtb3ZlZFRyZWVFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ub2RlUmVtb3ZlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZVJlbW92ZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KE9CSkVDVF9QQVRIKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMubm9kZVJlbW92ZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlTm9kZVJlbW92ZWRUcmVlKCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVSZW1vdmVkQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDbGVhcmVkRXZlbnQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCk7Ci0JCWFzc2VydE51bGwodGhpcy50cmVlRXZlbnQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNsZWFyZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZCgpIHsKLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDbGVhcmVkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDbGVhcmVkKCk7Ci0JCXRoaXMudmVyaWZ5VHJlZUV2ZW50KG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJlZUNsZWFyZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2xlYXJlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2xlYXJlZCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2xlYXJlZENhbGxlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2hhbmdlZEV2ZW50KCkgewotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWRFdmVudCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWRFdmVudCgpOwotCQlhc3NlcnROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlUcmVlRXZlbnQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmVlQ2hhbmdlZENhbGxlZCk7Ci0KLQkJdGhpcy50cmVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0JCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcihUUkVFX05BTUUsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWQoKSB7Ci0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCi0JCXRoaXMudHJlZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmVlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy50ZXN0TW9kZWwudGVzdEZpcmVUcmVlQ2hhbmdlZCgpOwotCQl0aGlzLnZlcmlmeVRyZWVFdmVudChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRyZWVDaGFuZ2VkQ2FsbGVkKTsKLQotCQl0aGlzLnRyZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRSRUVfTkFNRSwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMudGVzdE1vZGVsLnRlc3RGaXJlVHJlZUNoYW5nZWQoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyZWVFdmVudCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJlZUNoYW5nZWRDYWxsZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc05vVHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUUkVFX05BTUUpKTsKLQkJdGhpcy50ZXN0TW9kZWwucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwuaGFzTm9UcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRSRUVfTkFNRSkpOwotCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoVFJFRV9OQU1FLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC5oYXNOb1RyZWVDaGFuZ2VMaXN0ZW5lcnMoVFJFRV9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE51bGxUcmVlTGlzdGVuZXIoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJvZ3VzVHJlZUxpc3RlbmVyKCkgewotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQotCQl0aGlzLnRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCJmb28iLCB0aGlzLmNoYW5nZUxpc3RlbmVyKTsKLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCi0JCXRoaXMudGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgdGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVUcmVlQ2hhbmdlTGlzdGVuZXIoImZvbyIsIG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0KLQkJZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMudGVzdE1vZGVsLnJlbW92ZVRyZWVDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbmV3IFRyZWVDaGFuZ2VBZGFwdGVyKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5VHJlZUV2ZW50KExpc3Q8Pz4gcGF0aCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMudHJlZUV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudGVzdE1vZGVsLCB0aGlzLnRyZWVFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUUkVFX05BTUUsIHRoaXMudHJlZUV2ZW50LmdldFRyZWVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMocGF0aCwgdGhpcy5nZXRMaXN0UGF0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8Pz4gZ2V0TGlzdFBhdGgoKSB7Ci0JCUl0ZXJhYmxlPD8+IGl0ZXJhYmxlID0gdGhpcy5nZXRQYXRoKCk7Ci0JCXJldHVybiAoaXRlcmFibGUgPT0gbnVsbCkgID8gbnVsbCA6IENvbGxlY3Rpb25Ub29scy5saXN0KGl0ZXJhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldFBhdGgoKSB7Ci0JCWlmICh0aGlzLnRyZWVFdmVudCBpbnN0YW5jZW9mIFRyZWVBZGRFdmVudCkgewotCQkJcmV0dXJuICgoVHJlZUFkZEV2ZW50KSB0aGlzLnRyZWVFdmVudCkuZ2V0UGF0aCgpOwotCQl9Ci0JCWlmICh0aGlzLnRyZWVFdmVudCBpbnN0YW5jZW9mIFRyZWVSZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoVHJlZVJlbW92ZUV2ZW50KSB0aGlzLnRyZWVFdmVudCkuZ2V0UGF0aCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2QgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRzQXJlRXF1YWwoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoImZvbyIpOwotCQljMS5hZGQoImJhciIpOwotCQljMS5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJmb28iKTsKLQkJYzIuYWRkKCJiYXIiKTsKLQkJYzIuYWRkKCJiYXoiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0RWxlbWVudHNBcmVFcXVhbChjMSwgYzIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnQoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBjMSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQljMS5hZGQoImZvbyIpOwotCQljMS5hZGQoImJhciIpOwotCQljMS5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYzIgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYzIuYWRkKCJiYXoiKTsKLQkJYzIuYWRkKCJiYXIiKTsKLQkJYzIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0RWxlbWVudHNBcmVEaWZmZXJlbnQoYzEsIGMyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0TW9kZWwgdGVzdHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDEoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKG51bGwsIG51bGwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZUVxdWFsMigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRXF1YWwoImZvbyIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVFcXVhbDMoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVFcXVhbCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRXF1YWw0KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRXF1YWwobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZUVxdWFsNSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZUVxdWFsKCJiYXIiLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50MSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudChudWxsLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVEaWZmZXJlbnQyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRGlmZmVyZW50KCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsVmFsdWVzQXJlRGlmZmVyZW50MygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0VmFsdWVzQXJlRGlmZmVyZW50KCJmb28iLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxWYWx1ZXNBcmVEaWZmZXJlbnQ0KCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RWYWx1ZXNBcmVEaWZmZXJlbnQobnVsbCwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFZhbHVlc0FyZURpZmZlcmVudDUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdFZhbHVlc0FyZURpZmZlcmVudCgiYmFyIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDEoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQobnVsbCwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkMigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCgiZm9vIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZDMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkNCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKG51bGwsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQ1KCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoImJhciIsICJmb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0TW9kZWxBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQxKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQobnVsbCwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkMigpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnRlc3RNb2RlbC50ZXN0QXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKCJmb28iLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkMygpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCgiZm9vIiwgbnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkNCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZChudWxsLCAiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdE1vZGVsQXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkNSgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy50ZXN0TW9kZWwudGVzdEF0dHJpYnV0ZVZhbHVlSGFzTm90Q2hhbmdlZCgiYmFyIiwgImZvbyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbENsb25lKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnRlc3RNb2RlbC5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQUk9QRVJUWV9OQU1FKSk7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuY2hhbmdlTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQotCQkvLyB2ZXJpZnkgdGhhdCB0aGUgY2xvbmUgZG9lcyBub3QgaGF2ZSBhbnkgbGlzdGVuZXJzCi0JCVRlc3RNb2RlbCBjbG9uZSA9IHRoaXMudGVzdE1vZGVsLmNsb25lKCk7Ci0JCWFzc2VydEZhbHNlKGNsb25lLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQkJY2xvbmUuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5jaGFuZ2VMaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoY2xvbmUuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUFJPUEVSVFlfTkFNRSkpOwotCQkvLyBjaGVjayBvcmlnaW5hbAotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBST1BFUlRZX05BTUUpKTsKLQotCQkvLyBub3cgdGVzdCBldmVudHMgZmlyZWQgYnkgb3JpZ2luYWwKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IGZhbHNlOwotCQl0aGlzLnRlc3RNb2RlbC50ZXN0RmlyZVByb3BlcnR5Q2hhbmdlZE9iamVjdE9iamVjdCgpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlRXZlbnQoT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSk7Ci0JCWFzc2VydFRydWUodGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCk7Ci0KLQkJLy8gbm93IHRlc3QgZXZlbnRzIGZpcmVkIGJ5IGNsb25lCi0JCXRoaXMucHJvcGVydHlDaGFuZ2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VDYWxsZWQgPSBmYWxzZTsKLQkJY2xvbmUudGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3QoKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZUV2ZW50KGNsb25lLCBPTERfT0JKRUNUX1ZBTFVFLCBORVdfT0JKRUNUX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByb3BlcnR5Q2hhbmdlQ2FsbGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RNb2RlbFRvU3RyaW5nKCkgewotCQlhc3NlcnRUcnVlKHRoaXMudGVzdE1vZGVsLnRvU3RyaW5nKCkuY29udGFpbnMoJygnICsgVEVTVF9UT19TVFJJTkcgKyAnKScpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgaW1wbGVtZW50YXRpb25zICoqKioqKioqKioKLQotCWNsYXNzIEFkYXB0ZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnN0YXRlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5zdGF0ZUNoYW5nZUV2ZW50ID0gZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5wcm9wZXJ0eUNoYW5nZUNhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5wcm9wZXJ0eUNoYW5nZUV2ZW50ID0gZTsKLQkJfQotCQotCQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5pdGVtc0FkZGVkQ29sbGVjdGlvbkNhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNSZW1vdmVkQ29sbGVjdGlvbkNhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5jb2xsZWN0aW9uRXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25FdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLmNvbGxlY3Rpb25FdmVudCA9IGU7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNBZGRlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLml0ZW1zUmVtb3ZlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNSZXBsYWNlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMuaXRlbXNNb3ZlZExpc3RDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubGlzdEV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0Q2xlYXJlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0RXZlbnQgPSBlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0Q2hhbmdlZENhbGxlZCA9IHRydWU7Ci0JCQlDaGFuZ2VTdXBwb3J0VGVzdHMudGhpcy5saXN0RXZlbnQgPSBlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMubm9kZUFkZGVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGUpIHsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLm5vZGVSZW1vdmVkQ2FsbGVkID0gdHJ1ZTsKLQkJCUNoYW5nZVN1cHBvcnRUZXN0cy50aGlzLnRyZWVFdmVudCA9IGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUNsZWFyZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUV2ZW50ID0gZTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotCQkJQ2hhbmdlU3VwcG9ydFRlc3RzLnRoaXMudHJlZUV2ZW50ID0gZTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ2xvbmVhYmxlIHsKLQkJVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8vICoqKioqIHN0YXRlCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlU3RhdGVDaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCi0JCS8vICoqKioqIHByb3BlcnR5Ci0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQobmV3IFByb3BlcnR5Q2hhbmdlRXZlbnQodGhpcywgUFJPUEVSVFlfTkFNRSwgT0xEX09CSkVDVF9WQUxVRSwgTkVXX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKG5ldyBQcm9wZXJ0eUNoYW5nZUV2ZW50KHRoaXMsIFBST1BFUlRZX05BTUUsIE9MRF9PQkpFQ1RfVkFMVUUsIE9MRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0T2JqZWN0KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9PQkpFQ1RfVkFMVUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3RPYmplY3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfT0JKRUNUX1ZBTFVFLCBPTERfT0JKRUNUX1ZBTFVFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkT2JqZWN0KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE5FV19PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRPYmplY3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBudWxsKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50KCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9JTlRfVkFMVUUuaW50VmFsdWUoKSwgTkVXX0lOVF9WQUxVRS5pbnRWYWx1ZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlUHJvcGVydHlDaGFuZ2VkSW50SW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPUEVSVFlfTkFNRSwgT0xEX0lOVF9WQUxVRS5pbnRWYWx1ZSgpLCBPTERfSU5UX1ZBTFVFLmludFZhbHVlKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbigpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUk9QRVJUWV9OQU1FLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSwgTkVXX0JPT0xFQU5fVkFMVUUuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVQcm9wZXJ0eUNoYW5nZWRCb29sZWFuQm9vbGVhbk5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBST1BFUlRZX05BTUUsIE9MRF9CT09MRUFOX1ZBTFVFLmJvb2xlYW5WYWx1ZSgpLCBPTERfQk9PTEVBTl9WQUxVRS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQotCQkvLyAqKioqKiBjb2xsZWN0aW9uCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25FdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQobmV3IENvbGxlY3Rpb25BZGRFdmVudCh0aGlzLCBDT0xMRUNUSU9OX05BTUUsIEFEREVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKG5ldyBDb2xsZWN0aW9uQWRkRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChDT0xMRUNUSU9OX05BTUUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihBRERFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZENvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbUFkZGVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChDT0xMRUNUSU9OX05BTUUsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZENvbGxlY3Rpb25FdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgQ29sbGVjdGlvblJlbW92ZUV2ZW50KHRoaXMsIENPTExFQ1RJT05fTkFNRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbkV2ZW50Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQobmV3IENvbGxlY3Rpb25SZW1vdmVFdmVudCh0aGlzLCBDT0xMRUNUSU9OX05BTUUsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZW1vdmVkQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChDT0xMRUNUSU9OX05BTUUsIENvbGxlY3Rpb25zLnNpbmdsZXRvbihSRU1PVkVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRDb2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc1JlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbVJlbW92ZWRDb2xsZWN0aW9uKCkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoQ09MTEVDVElPTl9OQU1FLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DbGVhcmVkKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNsZWFyZWQoQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlQ29sbGVjdGlvbkNoYW5nZWRFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKG5ldyBDb2xsZWN0aW9uQ2hhbmdlRXZlbnQodGhpcywgQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoQ09MTEVDVElPTl9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtVG9Db2xsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihBRERFRF9PQkpFQ1RfVkFMVUUsIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdEFkZEl0ZW1Ub0NvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoQURERURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oQURERURfT0JKRUNUX1ZBTFVFLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKEFEREVEX09CSkVDVF9WQUxVRSksIG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdEFkZEl0ZW1zVG9Db2xsZWN0aW9uTm9DaGFuZ2UoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5hZGRJdGVtc1RvQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5zaW5nbGV0b24oQURERURfT0JKRUNUX1ZBTFVFKSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBZGRJdGVtc1RvQ29sbGVjdGlvbk1peGVkKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChBRERFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMuYWRkSXRlbXNUb0NvbGxlY3Rpb24obmV3IE9iamVjdFtdIHtBRERFRF9PQkpFQ1RfVkFMVUUsIEFEREVEX09CSkVDVF9WQUxVRV8yfSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihSRU1PVkVEX09CSkVDVF9WQUxVRSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZSgpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKCJmb28iLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24obmV3IE9iamVjdFtdIHsiZm9vIiwgImJhciIsIFJFTU9WRURfT0JKRUNUX1ZBTFVFfSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uTm9DaGFuZ2UxKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZChSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJcmV0dXJuIHRoaXMucmVtb3ZlSXRlbXNGcm9tQ29sbGVjdGlvbihDb2xsZWN0aW9ucy5zaW5nbGV0b24oImZvbyIpLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb25Ob0NoYW5nZTMoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCXJldHVybiB0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24oQ29sbGVjdGlvbnMuc2luZ2xldG9uKCJmb28iKSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjEoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIifSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbjIoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0UmV0YWluSXRlbXNJbkNvbGxlY3Rpb25Ob0NoYW5nZTEoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCXJldHVybiB0aGlzLnJldGFpbkl0ZW1zSW5Db2xsZWN0aW9uKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXIifSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RSZXRhaW5JdGVtc0luQ29sbGVjdGlvbk5vQ2hhbmdlMigpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJhciIpOwotCQkJcmV0dXJuIHRoaXMucmV0YWluSXRlbXNJbkNvbGxlY3Rpb24obmV3IE9iamVjdFtdIHsiZm9vIiwgImJhciIsIFJFTU9WRURfT0JKRUNUX1ZBTFVFfSwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RDbGVhckNvbGxlY3Rpb24oKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCWNvbGxlY3Rpb24uYWRkKFJFTU9WRURfT0JKRUNUX1ZBTFVFKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJmb28iKTsKLQkJCWNvbGxlY3Rpb24uYWRkKCJiYXIiKTsKLQkJCXJldHVybiB0aGlzLmNsZWFyQ29sbGVjdGlvbihjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdENsZWFyQ29sbGVjdGlvbk5vQ2hhbmdlKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlyZXR1cm4gdGhpcy5jbGVhckNvbGxlY3Rpb24oY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RTeW5jaHJvbml6ZUNvbGxlY3Rpb24xKCkgewotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IGNvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCQljb2xsZWN0aW9uLmFkZCgiYmF6Iik7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gbmV3Q29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqb28iKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJqYXIiKTsKLQkJCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gdGhpcy5zeW5jaHJvbml6ZUNvbGxlY3Rpb24obmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbiwgQ09MTEVDVElPTl9OQU1FKTsKLQkJCWFzc2VydEVxdWFscyhuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0ZXN0U3luY2hyb25pemVDb2xsZWN0aW9uMigpIHsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBjb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJhciIpOwotCQkJY29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkJQ29sbGVjdGlvbjxPYmplY3Q+IG5ld0NvbGxlY3Rpb24gPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7Ci0JCQlib29sZWFuIHJlc3VsdCA9IHRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24sIENPTExFQ1RJT05fTkFNRSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3Q29sbGVjdGlvbiwgY29sbGVjdGlvbik7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFN5bmNocm9uaXplQ29sbGVjdGlvbjMoKSB7Ci0JCQlDb2xsZWN0aW9uPE9iamVjdD4gY29sbGVjdGlvbiA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKLQkJCUNvbGxlY3Rpb248T2JqZWN0PiBuZXdDb2xsZWN0aW9uID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOwotCQkJbmV3Q29sbGVjdGlvbi5hZGQoImpvbyIpOwotCQkJbmV3Q29sbGVjdGlvbi5hZGQoImphciIpOwotCQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkJYm9vbGVhbiByZXN1bHQgPSB0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihuZXdDb2xsZWN0aW9uLCBjb2xsZWN0aW9uLCBDT0xMRUNUSU9OX05BTUUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ld0NvbGxlY3Rpb24sIGNvbGxlY3Rpb24pOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8vICoqKioqIGxpc3QKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdEV2ZW50KCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgTGlzdEFkZEV2ZW50KHRoaXMsIExJU1RfTkFNRSwgQUREX0lOREVYLCBBRERFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNBZGRlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNBZGRlZChuZXcgTGlzdEFkZEV2ZW50KHRoaXMsIExJU1RfTkFNRSwgQUREX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc0FkZGVkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zQWRkZWQoTElTVF9OQU1FLCBBRERfSU5ERVgsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQURERURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zQWRkZWRMaXN0Tm9DaGFuZ2UoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc0FkZGVkKExJU1RfTkFNRSwgQUREX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1BZGRlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoTElTVF9OQU1FLCBBRERfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3RFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgUkVNT1ZFX0lOREVYLCBSRU1PVkVEX09CSkVDVF9WQUxVRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0RXZlbnROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChuZXcgTGlzdFJlbW92ZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgUkVNT1ZFX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlbW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbXNSZW1vdmVkKExJU1RfTkFNRSwgUkVNT1ZFX0lOREVYLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFJFTU9WRURfT0JKRUNUX1ZBTFVFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zUmVtb3ZlZExpc3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVtb3ZlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChMSVNUX05BTUUsIFJFTU9WRV9JTkRFWCwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdEV2ZW50KCkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIEFEREVEX09CSkVDVF9WQUxVRSwgUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNSZXBsYWNlZChuZXcgTGlzdFJlcGxhY2VFdmVudCh0aGlzLCBMSVNUX05BTUUsIFJFUExBQ0VfSU5ERVgsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtc1JlcGxhY2VkTGlzdCgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KEFEREVEX09CSkVDVF9WQUxVRSksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoUkVNT1ZFRF9PQkpFQ1RfVkFMVUUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNSZXBsYWNlZExpc3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zUmVwbGFjZWQoTElTVF9OQU1FLCBSRVBMQUNFX0lOREVYLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVJdGVtUmVwbGFjZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbVJlcGxhY2VkKExJU1RfTkFNRSwgUkVQTEFDRV9JTkRFWCwgQURERURfT0JKRUNUX1ZBTFVFLCBSRU1PVkVEX09CSkVDVF9WQUxVRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0RXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtc01vdmVkKG5ldyBMaXN0TW92ZUV2ZW50KHRoaXMsIExJU1RfTkFNRSwgVEFSR0VUX0lOREVYLCBTT1VSQ0VfSU5ERVgsIDEpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3RFdmVudE5vQ2hhbmdlKCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChuZXcgTGlzdE1vdmVFdmVudCh0aGlzLCBMSVNUX05BTUUsIFNPVVJDRV9JTkRFWCwgU09VUkNFX0lOREVYLCAxKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1zTW92ZWRMaXN0KCkgewotCQkJdGhpcy5maXJlSXRlbXNNb3ZlZChMSVNUX05BTUUsIFRBUkdFVF9JTkRFWCwgU09VUkNFX0lOREVYLCAxKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlSXRlbXNNb3ZlZExpc3ROb0NoYW5nZSgpIHsKLQkJCXRoaXMuZmlyZUl0ZW1zTW92ZWQoTElTVF9OQU1FLCBTT1VSQ0VfSU5ERVgsIFNPVVJDRV9JTkRFWCwgMSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUl0ZW1Nb3ZlZExpc3QoKSB7Ci0JCQl0aGlzLmZpcmVJdGVtTW92ZWQoTElTVF9OQU1FLCBUQVJHRVRfSU5ERVgsIFNPVVJDRV9JTkRFWCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2xlYXJlZChuZXcgTGlzdENsZWFyRXZlbnQodGhpcywgTElTVF9OQU1FKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZUxpc3RDbGVhcmVkKCkgewotCQkJdGhpcy5maXJlTGlzdENsZWFyZWQoTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlTGlzdENoYW5nZWRFdmVudCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKG5ldyBMaXN0Q2hhbmdlRXZlbnQodGhpcywgTElTVF9OQU1FLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVMaXN0Q2hhbmdlZCgpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfTkFNRSwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1Ub0xpc3RJbmRleCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoMiwgImpvbyIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbVRvTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoImpvbyIsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3RJbmRleCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KDIsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoImpvbyIpLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zVG9MaXN0SW5kZXhOb0NoYW5nZSgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KDIsIENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNUb0xpc3QoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5hZGRJdGVtc1RvTGlzdChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJqb28iKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtc1RvTGlzdE5vQ2hhbmdlKCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtRnJvbUxpc3RJbmRleCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCgxLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1Gcm9tTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCgiYmFyIiwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc0Zyb21MaXN0SW5kZXgoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KDEsIDEsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdEluZGV4Tm9DaGFuZ2UoKSB7Ci0JCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbGlzdC5hZGQoImZvbyIpOwotCQkJbGlzdC5hZGQoImJhciIpOwotCQkJbGlzdC5hZGQoImJheiIpOwotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KDIsIDAsIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUxpc3QoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgiYmFyIiksIGxpc3QsIExJU1RfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNGcm9tTGlzdE5vQ2hhbmdlKCkgewotCQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWxpc3QuYWRkKCJmb28iKTsKLQkJCWxpc3QuYWRkKCJiYXIiKTsKLQkJCWxpc3QuYWRkKCJiYXoiKTsKLQkJCXRoaXMuYWRkSXRlbXNUb0xpc3QoQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eUxpc3QoKSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZXRhaW5JdGVtc0luTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJldGFpbkl0ZW1zSW5MaXN0KG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbUluTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnJlcGxhY2VJdGVtSW5MaXN0KCJiYXIiLCAieHh4IiwgbGlzdCwgTElTVF9OQU1FKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RTZXRJdGVtc0luTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLnNldEl0ZW1zSW5MaXN0KDEsIG5ldyBTdHJpbmdbXSB7Inh4eCJ9LCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtc0luTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQlsaXN0LmFkZCgieHh4Iik7Ci0JCQlsaXN0LmFkZCgieXl5Iik7Ci0JCQlsaXN0LmFkZCgienp6Iik7Ci0JCQl0aGlzLm1vdmVJdGVtc0luTGlzdCgyLCA0LCAyLCBsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdENsZWFyTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlsaXN0LmFkZCgiZm9vIik7Ci0JCQlsaXN0LmFkZCgiYmFyIik7Ci0JCQlsaXN0LmFkZCgiYmF6Iik7Ci0JCQl0aGlzLmNsZWFyTGlzdChsaXN0LCBMSVNUX05BTUUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplTGlzdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBvbGRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlvbGRMaXN0LmFkZCgiZm9vIik7Ci0JCQlvbGRMaXN0LmFkZCgiYmFyIik7Ci0JCQlvbGRMaXN0LmFkZCgiYmF6Iik7Ci0JCQlvbGRMaXN0LmFkZCgieHh4Iik7Ci0JCQlvbGRMaXN0LmFkZCgieXl5Iik7Ci0JCQlvbGRMaXN0LmFkZCgienp6Iik7Ci0JCQlMaXN0PFN0cmluZz4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJbmV3TGlzdC5hZGQoImZvbyIpOwotCQkJbmV3TGlzdC5hZGQoInBwcCIpOwotCQkJbmV3TGlzdC5hZGQoImJheiIpOwotCQkJbmV3TGlzdC5hZGQoInh4eCIpOwotCQkJbmV3TGlzdC5hZGQoInFxcSIpOwotCQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QobmV3TGlzdCwgb2xkTGlzdCwgTElTVF9OQU1FKTsKLQkJCWFzc2VydEVxdWFscyhuZXdMaXN0LCBvbGRMaXN0KTsKLQkJfQotCi0JCS8vICoqKioqIHRyZWUKLQkJcHVibGljIHZvaWQgdGVzdEZpcmVOb2RlQWRkZWRUcmVlRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQobmV3IFRyZWVBZGRFdmVudCh0aGlzLCBUUkVFX05BTUUsIE9CSkVDVF9QQVRIKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVBZGRlZFRyZWUoKSB7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoVFJFRV9OQU1FLCBPQkpFQ1RfUEFUSCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZUV2ZW50KCkgewotCQkJdGhpcy5maXJlTm9kZVJlbW92ZWQobmV3IFRyZWVSZW1vdmVFdmVudCh0aGlzLCBUUkVFX05BTUUsIE9CSkVDVF9QQVRIKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZU5vZGVSZW1vdmVkVHJlZSgpIHsKLQkJCXRoaXMuZmlyZU5vZGVSZW1vdmVkKFRSRUVfTkFNRSwgT0JKRUNUX1BBVEgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZEV2ZW50KCkgewotCQkJdGhpcy5maXJlVHJlZUNsZWFyZWQobmV3IFRyZWVDbGVhckV2ZW50KHRoaXMsIFRSRUVfTkFNRSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdGVzdEZpcmVUcmVlQ2xlYXJlZCgpIHsKLQkJCXRoaXMuZmlyZVRyZWVDbGVhcmVkKFRSRUVfTkFNRSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB0ZXN0RmlyZVRyZWVDaGFuZ2VkRXZlbnQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChuZXcgVHJlZUNoYW5nZUV2ZW50KHRoaXMsIFRSRUVfTkFNRSwgT0JKRUNUX1BBVEgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHRlc3RGaXJlVHJlZUNoYW5nZWQoKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChUUkVFX05BTUUsIE9CSkVDVF9QQVRIKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RBdHRyaWJ1dGVWYWx1ZUhhc05vdENoYW5nZWQoT2JqZWN0IHZhbHVlMSwgT2JqZWN0IHZhbHVlMikgewotCQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlVmFsdWVIYXNOb3RDaGFuZ2VkKHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCS8vICoqKioqIG1pc2MKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBUZXN0TW9kZWwgY2xvbmUoKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoVGVzdE1vZGVsKSBzdXBlci5jbG9uZSgpOwotCQkJfSBjYXRjaCAoQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQl0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcigpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFZhbHVlc0FyZURpZmZlcmVudChPYmplY3QgdmFsdWUxLCBPYmplY3QgdmFsdWUyKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodmFsdWUxLCB2YWx1ZTIpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGVzdFZhbHVlc0FyZUVxdWFsKE9iamVjdCB2YWx1ZTEsIE9iamVjdCB2YWx1ZTIpIHsKLQkJCXJldHVybiB0aGlzLnZhbHVlc0FyZUVxdWFsKHZhbHVlMSwgdmFsdWUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RFbGVtZW50c0FyZURpZmZlcmVudChJdGVyYWJsZTw/PiBpdGVyYWJsZTEsIEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMikgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLmVsZW1lbnRzQXJlRGlmZmVyZW50KGl0ZXJhYmxlMSwgaXRlcmFibGUyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRlc3RFbGVtZW50c0FyZUVxdWFsKEl0ZXJhYmxlPD8+IGl0ZXJhYmxlMSwgSXRlcmFibGU8Pz4gaXRlcmFibGUyKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDaGFuZ2VTdXBwb3J0KCkuZWxlbWVudHNBcmVFcXVhbChpdGVyYWJsZTEsIGl0ZXJhYmxlMik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKFRFU1RfVE9fU1RSSU5HKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlcmlhbGl6YXRpb24gdGVzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmIChUb29scy5qdm1Jc1N1bigpKSB7Ci0JCQkvLyBUaGlzIHRlc3QgZG9lc24ndCBwYXNzIGluIHRoZSBFY2xpcHNlIGJ1aWxkIGVudmlyb25tZW50IChMaW51eC9JQk0gSlZNKSBmb3Igc29tZSByZWFzb24KLQkJCXRoaXMudmVyaWZ5U2VyaWFsaXphdGlvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUxvY2FsTW9kZWwgbW9kZWwxID0gbmV3IExvY2FsTW9kZWwoKTsKLQkJRm9vIGZvbzEgPSBuZXcgRm9vKCk7Ci0JCUJhciBiYXIxID0gbmV3IEJhcigpOwotCQlKb28gam9vMSA9IG5ldyBKb28oKTsKLQkJSmFyIGphcjEgPSBuZXcgSmFyKCk7Ci0JCW1vZGVsMS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGZvbzEpOwotCQltb2RlbDEuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihiYXIxKTsKLQkJbW9kZWwxLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgam9vMSk7Ci0JCW1vZGVsMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImZvbyIsIGphcjEpOwotCi0JCUl0ZXJhYmxlPEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyczEgPSB0aGlzLmdldExpc3RlbmVycyhtb2RlbDEsIFN0YXRlQ2hhbmdlTGlzdGVuZXIuY2xhc3MsIG51bGwpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnNBcnJheTEgPSBBcnJheVRvb2xzLmFycmF5KGxpc3RlbmVyczEpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdGVuZXJzQXJyYXkxLmxlbmd0aCk7Ci0JCS8vIHRoZSBvcmRlciBvZiB0aGVzZSBjb3VsZCBjaGFuZ2UuLi4KLQkJYXNzZXJ0RXF1YWxzKEZvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkxWzBdLmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQmFyLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTFbMV0uZ2V0Q2xhc3MoKSk7Ci0KLQkJbGlzdGVuZXJzMSA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMSwgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCWxpc3RlbmVyc0FycmF5MSA9IEFycmF5VG9vbHMuYXJyYXkobGlzdGVuZXJzMSk7Ci0JCWFzc2VydEVxdWFscygyLCBsaXN0ZW5lcnNBcnJheTEubGVuZ3RoKTsKLQkJLy8gdGhlIG9yZGVyIG9mIHRoZXNlIGNvdWxkIGNoYW5nZS4uLgotCQlhc3NlcnRFcXVhbHMoSm9vLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTFbMF0uZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhKYXIuY2xhc3MsIGxpc3RlbmVyc0FycmF5MVsxXS5nZXRDbGFzcygpKTsKLQotCQlMb2NhbE1vZGVsIG1vZGVsMiA9IFRlc3RUb29scy5zZXJpYWxpemUobW9kZWwxKTsKLQotCQlJdGVyYWJsZTxFdmVudExpc3RlbmVyPiBsaXN0ZW5lcnMyID0gdGhpcy5nZXRMaXN0ZW5lcnMobW9kZWwyLCBTdGF0ZUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBudWxsKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzQXJyYXkyID0gQXJyYXlUb29scy5hcnJheShsaXN0ZW5lcnMyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxpc3RlbmVyc0FycmF5Mi5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoRm9vLmNsYXNzLCBsaXN0ZW5lcnNBcnJheTJbMF0uZ2V0Q2xhc3MoKSk7Ci0KLQkJbGlzdGVuZXJzMiA9IHRoaXMuZ2V0TGlzdGVuZXJzKG1vZGVsMiwgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCWxpc3RlbmVyc0FycmF5MiA9IEFycmF5VG9vbHMuYXJyYXkobGlzdGVuZXJzMik7Ci0JCWFzc2VydEVxdWFscygxLCBsaXN0ZW5lcnNBcnJheTIubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKEpvby5jbGFzcywgbGlzdGVuZXJzQXJyYXkyWzBdLmdldENsYXNzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RXZlbnRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXJzKExvY2FsTW9kZWwgbW9kZWwsIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzLCBTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRMaXN0ZW5lckxpc3QobW9kZWwsIGxpc3RlbmVyQ2xhc3MsIGFzcGVjdE5hbWUpLmdldExpc3RlbmVycygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdGVuZXJMaXN0PEV2ZW50TGlzdGVuZXI+IGdldExpc3RlbmVyTGlzdChMb2NhbE1vZGVsIG1vZGVsLCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJDbGFzcywgU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJQ2hhbmdlU3VwcG9ydCBjaGFuZ2VTdXBwb3J0ID0gKENoYW5nZVN1cHBvcnQpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG1vZGVsLCAiY2hhbmdlU3VwcG9ydCIpOwotCQlyZXR1cm4gKExpc3RlbmVyTGlzdDxFdmVudExpc3RlbmVyPikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoY2hhbmdlU3VwcG9ydCwgImdldExpc3RlbmVyTGlzdF8iLCBuZXcgQ2xhc3M8Pz5bXSB7Q2xhc3MuY2xhc3MsIFN0cmluZy5jbGFzc30sIG5ldyBPYmplY3RbXSB7bGlzdGVuZXJDbGFzcywgYXNwZWN0TmFtZX0pOwotCX0KLQotCS8vIHdlIGhhdmUgdG8gbWFudWFsbHkgaGFuZGxlICdjaGFuZ2VTdXBwb3J0JyBzaW5jZSBBYnN0cmFjdE1vZGVsIGlzIG5vdCBTZXJpYWxpemFibGUKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0JCUxvY2FsTW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzLmRlZmF1bHRXcml0ZU9iamVjdCgpOwotCQkJcy53cml0ZU9iamVjdCh0aGlzLmNoYW5nZVN1cHBvcnQpOwotCSAgICB9Ci0JCXByaXZhdGUgdm9pZCByZWFkT2JqZWN0KE9iamVjdElucHV0U3RyZWFtIHMpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCQlzLmRlZmF1bHRSZWFkT2JqZWN0KCk7Ci0JCQl0aGlzLmNoYW5nZVN1cHBvcnQgPSAoQ2hhbmdlU3VwcG9ydCkgcy5yZWFkT2JqZWN0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBGb28gaW1wbGVtZW50cyBTZXJpYWxpemFibGUsIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCQlGb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBCYXIgaW1wbGVtZW50cyBTdGF0ZUNoYW5nZUxpc3RlbmVyIHsKLQkJQmFyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSm9vIGV4dGVuZHMgTGlzdENoYW5nZUFkYXB0ZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCQlKb28oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmFyIGV4dGVuZHMgTGlzdENoYW5nZUFkYXB0ZXIgewotCQlKYXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGJ1Zyg/KSB0ZXN0ICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJU0VfTUVTU0FHRSA9ICJ0aGlzIG9iamVjdCBpcyBubyBsb25nZXIgbGlzdGVuaW5nIHRvIGxvY2FsQSI7Ci0KLQkvKioKLQkgKiBUZXN0IHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uOgotCSAqIAktIGJvdGggQiBhbmQgQyBhcmUgbGlzdGVuaW5nIHRvIEEKLQkgKiAJLSBDIGlzIGFsc28gbGlzdGVuaW5nIHRvIEIKLQkgKiAJLSB3aGVuIEIgcmVjZWl2ZXMgYW4gZXZlbnQgZnJvbSBBLCBpdCB3aWxsIGZpcmUgYW4gZXZlbnQgdG8gQwotCSAqIAktIHdoZW4gQyByZWNlaXZlcyBhbiBldmVudCBmcm9tIEIsIGl0IHdpbGwgU1RPUCBsaXN0ZW5pbmcgdG8gQQotCSAqIAktIHRoZSBldmVudCBmcm9tIEIgdG8gQyBtYXkgYmUgcHJlY2VkZWQgb3IgZm9sbG93ZWQgKGRlcGVuZGluZyBvbgotCSAqIAkJdGhlIGhhc2ggcG9zaXRpb25zIG9mIGxpc3RlbmVycykgYnkgYW4gZXZlbnQgZnJvbSBBIHRvIEM6Ci0JICogCQktIGlmIHRoZSBBIHRvIEMgZXZlbnQgY29tZXMgZmlyc3QsIG5vIHByb2JsZW0KLQkgKiAJCS0gYnV0IGlmIHRoZSBBIHRvIEIgZXZlbnQgY29tZXMgZmlyc3QsIHRoZSBBIHRvIEMgZXZlbnQgc2hvdWxkIE5PVCBoYXBwZW4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVTdGF0ZUxpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5U3RhdGVMaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlUHJvcGVydHlMaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeVByb3BlcnR5TGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmRpcmVjdFJlbW92ZUNvbGxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJdGhpcy52ZXJpZnlJbmRpcmVjdFJlbW92ZUxpc3RlbmVyKAotCQkJbmV3IE5vdGlmeUNvbW1hbmQoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5TGlzdGVuZXJzKExvY2FsQSBsb2NhbEEpIHsKLQkJCQkJbG9jYWxBLm5vdGlmeUNvbGxlY3Rpb25MaXN0ZW5lcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluZGlyZWN0UmVtb3ZlTGlzdExpc3RlbmVyKCkgewotCQl0aGlzLnZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoCi0JCQluZXcgTm90aWZ5Q29tbWFuZCgpIHsKLQkJCQlwdWJsaWMgdm9pZCBub3RpZnlMaXN0ZW5lcnMoTG9jYWxBIGxvY2FsQSkgewotCQkJCQlsb2NhbEEubm90aWZ5TGlzdExpc3RlbmVycygpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kaXJlY3RSZW1vdmVUcmVlTGlzdGVuZXIoKSB7Ci0JCXRoaXMudmVyaWZ5SW5kaXJlY3RSZW1vdmVMaXN0ZW5lcigKLQkJCW5ldyBOb3RpZnlDb21tYW5kKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKSB7Ci0JCQkJCWxvY2FsQS5ub3RpZnlUcmVlTGlzdGVuZXJzKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZlcmlmeUluZGlyZWN0UmVtb3ZlTGlzdGVuZXIoTm90aWZ5Q29tbWFuZCBjb21tYW5kKSB7Ci0JCUxvY2FsQSBsb2NhbEEgPSBuZXcgTG9jYWxBKCk7Ci0JCUxvY2FsQiBsb2NhbEIgPSBuZXcgTG9jYWxCKGxvY2FsQSk7Ci0KLQkJLy8gYnVpbGQgYSBidW5jaCBvZiBMb2NhbENzIHNvIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIG5vdGlmaWVkIEFGVEVSIHRoZSBMb2NhbEI7Ci0JCS8vIHVzaW5nIDEwMDAgc2VlbWVkIHRvIGZhaWwgdmVyeSBjb25zaXN0ZW50bHkgYmVmb3JlIENoYW5nZVN1cHBvcnQgd2FzIGZpeGVkCi0JCUxvY2FsQ1tdIGxvY2FsQ3MgPSBuZXcgTG9jYWxDWzEwMDBdOwotCQlmb3IgKGludCBpID0gbG9jYWxDcy5sZW5ndGg7IGktLSA+IDA7ICkgewotCQkJbG9jYWxDc1tpXSA9IG5ldyBMb2NhbEMobG9jYWxBLCBsb2NhbEIpOwotCQl9Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJY29tbWFuZC5ub3RpZnlMaXN0ZW5lcnMobG9jYWxBKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpID09IElTRV9NRVNTQUdFKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBleDsKLQkJCX0KLQkJfQotCQlhc3NlcnRGYWxzZShleENhdWdodCk7Ci0KLQkJZm9yIChpbnQgaSA9IGxvY2FsQ3MubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCWFzc2VydEZhbHNlKGxvY2FsQ3NbaV0uaXNMaXN0ZW5pbmdUb0xvY2FsQSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeUNvbW1hbmQgewotCQl2b2lkIG5vdGlmeUxpc3RlbmVycyhMb2NhbEEgbG9jYWxBKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG9iamVjdCBzaW1wbHkgZmlyZXMgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQuIEJvdGggTG9jYWxCIGFuZCBMb2NhbEMKLQkgKiB3aWxsIGJlIGxpc3RlbmVycy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEEgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJTG9jYWxBKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQl2b2lkIG5vdGlmeVN0YXRlTGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJdm9pZCBub3RpZnlQcm9wZXJ0eUxpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZCgiZm9vIiwgMSwgMik7Ci0JCX0KLQkJdm9pZCBub3RpZnlDb2xsZWN0aW9uTGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImZvbyIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JCXZvaWQgbm90aWZ5TGlzdExpc3RlbmVycygpIHsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKCJmb28iLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSk7Ci0JCX0KLQkJdm9pZCBub3RpZnlUcmVlTGlzdGVuZXJzKCkgewotCQkJdGhpcy5maXJlVHJlZUNoYW5nZWQoImZvbyIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBvYmplY3Qgd2lsbCBmaXJlIHN0YXRlIGNoYW5nZSBldmVudHMgd2hlbmV2ZXIgaXQgcmVjZWl2ZXMKLQkgKiBhIHN0YXRlIGNoYW5nZSBldmVudCBmcm9tIGxvY2FsQS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbEIKLQkJZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JCWltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIKLQl7Ci0JCUxvY2FsQihMb2NhbEEgbG9jYWxBKSB7Ci0JCQlzdXBlcigpOwotCQkJbG9jYWxBLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZCgiYmFyIiwgMSwgMik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoImJhciIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoImJhciIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZCgiYmFyIiwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVBZGRlZChUcmVlQWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIG5vZGVSZW1vdmVkKFRyZWVSZW1vdmVFdmVudCBlKSB7LyppZ25vcmUqL30KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgb2JqZWN0IHdpbGwgbGlzdGVuIHRvIHR3byBvdGhlciBvYmplY3RzLCBsb2NhbEEgYW5kIGxvY2FsQi4KLQkgKiBJZiB0aGlzIG9iamVjdCByZWNlaXZlcyBub3RpZmljYXRpb24gZnJvbSBsb2NhbEIsIGl0IHdpbGwgc3RvcCBsaXN0ZW5pbmcgdG8KLQkgKiBsb2NhbEEuIElmIHRoaXMgb2JqZWN0IHJlY2VpdmVzIG5vdGlmaWNhdGlvbiBmcm9tIGxvY2FsQSwgaXQgd2lsbCBjaGVjayB0bwotCSAqIHNlZSB3aGV0aGVyIGl0IHN0aWxsIGxpc3RlbmluZyB0byBsb2NhbEEuIElmIHRoaXMgb2JqZWN0IGlzIG5vIGxvbmdlcgotCSAqIGxpc3RlbmluZyB0byBsb2NhbEEsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgcmVjZWl2aW5nIHRoZSBldmVudCBhbmQKLQkgKiB0aHJvdyBhbiBleGNlcHRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxDCi0JCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQlpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyCi0JewotCQlwcml2YXRlIExvY2FsQSBsb2NhbEE7Ci0JCXByaXZhdGUgTG9jYWxCIGxvY2FsQjsKLQkJcHJpdmF0ZSBib29sZWFuIGxpc3RlbmluZ1RvTG9jYWxBOwotCi0JCUxvY2FsQyhMb2NhbEEgbG9jYWxBLCBMb2NhbEIgbG9jYWxCKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5sb2NhbEEgPSBsb2NhbEE7Ci0JCQl0aGlzLmxvY2FsQiA9IGxvY2FsQjsKLQotCQkJbG9jYWxBLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IHRydWU7Ci0KLQkJCWxvY2FsQi5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlib29sZWFuIGlzTGlzdGVuaW5nVG9Mb2NhbEEoKSB7Ci0JCQlyZXR1cm4gdGhpcy5saXN0ZW5pbmdUb0xvY2FsQTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBlLmdldFNvdXJjZSgpOwotCQkJaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQSkgewotCQkJCWlmICggISB0aGlzLmxpc3RlbmluZ1RvTG9jYWxBKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSVNFX01FU1NBR0UpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoc291cmNlID09IHRoaXMubG9jYWxCKSB7Ci0JCQkJdGhpcy5sb2NhbEEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCQkJdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJib2d1cyBldmVudCBzb3VyY2U6ICIgKyBzb3VyY2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJT2JqZWN0IHNvdXJjZSA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc291cmNlID09IHRoaXMubG9jYWxBKSB7Ci0JCQkJaWYgKCAhIHRoaXMubGlzdGVuaW5nVG9Mb2NhbEEpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihJU0VfTUVTU0FHRSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEIpIHsKLQkJCQl0aGlzLmxvY2FsQS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQl0aGlzLmxpc3RlbmluZ1RvTG9jYWxBID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImJvZ3VzIGV2ZW50IHNvdXJjZTogIiArIHNvdXJjZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKmlnbm9yZSovfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgey8qaWdub3JlKi99Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JCXB1YmxpYyB2b2lkIHRyZWVDaGFuZ2VkKFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gZS5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgPT0gdGhpcy5sb2NhbEEpIHsKLQkJCQlpZiAoICEgdGhpcy5saXN0ZW5pbmdUb0xvY2FsQSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKElTRV9NRVNTQUdFKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNvdXJjZSA9PSB0aGlzLmxvY2FsQikgewotCQkJCXRoaXMubG9jYWxBLnJlbW92ZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJCXRoaXMubGlzdGVuaW5nVG9Mb2NhbEEgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiYm9ndXMgZXZlbnQgc291cmNlOiAiICsgc291cmNlKTsKLQkJCX0KLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlQ2xlYXJlZChUcmVlQ2xlYXJFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgbm9kZUFkZGVkKFRyZWVBZGRFdmVudCBlKSB7LyppZ25vcmUqL30KLQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGUpIHsvKmlnbm9yZSovfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnB0VXRpbGl0eU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGY2NGVmLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRVdGlsaXR5TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC5saXN0ZW5lci5KcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3QoSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLnN1aXRlKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGFuZ2VTdXBwb3J0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmV3RXZlbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9OZXdFdmVudFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvTmV3RXZlbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2U0YWMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9OZXdFdmVudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLS8qKgotICogdGVzdCB3aGF0IGl0IHRha2VzIHRvIGFkZCBhIG5ldyB0eXBlIG9mIGV2ZW50IHRvCi0gKiBtb2RlbCBhbmQgY2hhbmdlIHN1cHBvcnQKLSAqLwotcHVibGljIGNsYXNzIE5ld0V2ZW50VGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBGb28gZm9vOwotCi0JcHVibGljIE5ld0V2ZW50VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEZvbygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCUxvY2FsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTG9jYWxMaXN0ZW5lcigpOwotCQl0aGlzLmZvby5hZGRGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc05vRm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmZvby5yZW1vdmVGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzTm9Gb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlMb2NhbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExvY2FsTGlzdGVuZXIoKTsKLQkJdGhpcy5mb28uYWRkRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5mb28ucmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZpcmVGb29DaGFuZ2VFdmVudCgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbExpc3RlbmVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVyLnJlY2VpdmVkRm9vRXZlbnQpOwotCQl0aGlzLmZvby5hZGRGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuZm9vLmZvbygpOwotCQlhc3NlcnRUcnVlKGxpc3RlbmVyLnJlY2VpdmVkRm9vRXZlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoYXJuZXNzIGNsYXNzZXMgKioqKioqKioqKgotCi0JY2xhc3MgRm9vIGV4dGVuZHMgQWJzdHJhY3RGb29Nb2RlbCB7Ci0JCUZvbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBmb28oKSB7Ci0JCQl0aGlzLmZpcmVGb29DaGFuZ2VFdmVudCgpOwotCQl9Ci0JfQotCi0JY2xhc3MgTG9jYWxMaXN0ZW5lciBpbXBsZW1lbnRzIEZvb0NoYW5nZUxpc3RlbmVyIHsKLQkJYm9vbGVhbiByZWNlaXZlZEZvb0V2ZW50ID0gZmFsc2U7Ci0JCUxvY2FsTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvb0NoYW5nZWQoRm9vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMucmVjZWl2ZWRGb29FdmVudCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlpbnRlcmZhY2UgRm9vTW9kZWwgZXh0ZW5kcyBNb2RlbCB7Ci0JCXZvaWQgYWRkRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpOwotCQl2b2lkIHJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQl9Ci0KLQlpbnRlcmZhY2UgRm9vQ2hhbmdlTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBmb29DaGFuZ2VkKEZvb0NoYW5nZUV2ZW50IGV2ZW50KTsKLQl9Ci0KLQlzdGF0aWMgY2xhc3MgRm9vQ2hhbmdlRXZlbnQgZXh0ZW5kcyBDaGFuZ2VFdmVudCB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwdWJsaWMgRm9vQ2hhbmdlRXZlbnQoRm9vTW9kZWwgc291cmNlKSB7Ci0JCQlzdXBlcihzb3VyY2UpOwotCQl9Ci0JCXB1YmxpYyBGb29DaGFuZ2VFdmVudCBjbG9uZShNb2RlbCBuZXdTb3VyY2UpIHsKLQkJCXJldHVybiBuZXcgRm9vQ2hhbmdlRXZlbnQoKEZvb01vZGVsKSBuZXdTb3VyY2UpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIEFic3RyYWN0Rm9vTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRm9vTW9kZWwgewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCBGb29DaGFuZ2VTdXBwb3J0IGdldENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gKEZvb0NoYW5nZVN1cHBvcnQpIHN1cGVyLmdldENoYW5nZVN1cHBvcnQoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBGb29DaGFuZ2VTdXBwb3J0KHRoaXMpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZEZvb0NoYW5nZUxpc3RlbmVyKEZvb0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5hZGRGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMuZ2V0Q2hhbmdlU3VwcG9ydCgpLnJlbW92ZUZvb0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlRm9vQ2hhbmdlRXZlbnQoKSB7Ci0JCQl0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5maXJlRm9vQ2hhbmdlZCgpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJCXJldHVybiB0aGlzLmdldENoYW5nZVN1cHBvcnQoKS5oYXNBbnlGb29DaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOb0Zvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJCXJldHVybiAhIHRoaXMuaGFzQW55Rm9vQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgRm9vQ2hhbmdlU3VwcG9ydCBleHRlbmRzIENoYW5nZVN1cHBvcnQgewotCQlGb29DaGFuZ2VTdXBwb3J0KEZvb01vZGVsIHNvdXJjZSkgewotCQkJc3VwZXIoc291cmNlKTsKLQkJfQotCQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENsYXNzPEZvb0NoYW5nZUxpc3RlbmVyPiBGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTID0gRm9vQ2hhbmdlTGlzdGVuZXIuY2xhc3M7Ci0JCXZvaWQgYWRkRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMuYWRkTGlzdGVuZXIoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCQl9Ci0JCXZvaWQgcmVtb3ZlRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMucmVtb3ZlTGlzdGVuZXIoRk9PX0NIQU5HRV9MSVNURU5FUl9DTEFTUywgbGlzdGVuZXIpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGhhc0FueUZvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJCXJldHVybiB0aGlzLmhhc0FueUxpc3RlbmVycyhGT09fQ0hBTkdFX0xJU1RFTkVSX0NMQVNTKTsKLQkJfQotCQlwcml2YXRlIExpc3RlbmVyTGlzdDxGb29DaGFuZ2VMaXN0ZW5lcj4gZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJMaXN0KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0TGlzdGVuZXJMaXN0KEZPT19DSEFOR0VfTElTVEVORVJfQ0xBU1MpOwotCQl9Ci0JCXByaXZhdGUgSXRlcmFibGU8Rm9vQ2hhbmdlTGlzdGVuZXI+IGdldEZvb0NoYW5nZUxpc3RlbmVycygpIHsKLQkJCUxpc3RlbmVyTGlzdDxGb29DaGFuZ2VMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gdGhpcy5nZXRGb29DaGFuZ2VMaXN0ZW5lckxpc3QoKTsKLQkJCXJldHVybiAobGlzdGVuZXJMaXN0ID09IG51bGwpID8gbnVsbCA6IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gaGFzRm9vQ2hhbmdlTGlzdGVuZXIoRm9vQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRGb29DaGFuZ2VMaXN0ZW5lcnMoKSwgbGlzdGVuZXIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZpcmVGb29DaGFuZ2VkKCkgewotCQkJSXRlcmFibGU8Rm9vQ2hhbmdlTGlzdGVuZXI+IGxpc3RlbmVycyA9IHRoaXMuZ2V0Rm9vQ2hhbmdlTGlzdGVuZXJzKCk7Ci0JCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlGb29DaGFuZ2VFdmVudCBldmVudCA9IG51bGw7Ci0JCQkJZm9yIChGb29DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA6IGxpc3RlbmVycykgewotCQkJCQlpZiAodGhpcy5oYXNGb29DaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikpIHsKLQkJCQkJCWlmIChldmVudCA9PSBudWxsKSB7Ci0JCQkJCQkJLy8gaGVyZSdzIHRoZSByZWFzb24gZm9yIHRoZSBkdXBsaWNhdGUgY29kZS4uLgotCQkJCQkJCWV2ZW50ID0gbmV3IEZvb0NoYW5nZUV2ZW50KChGb29Nb2RlbCkgdGhpcy5zb3VyY2UpOwotCQkJCQkJfQotCQkJCQkJbGlzdGVuZXIuZm9vQ2hhbmdlZChldmVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9TaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkYWUwNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQ2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuU3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lckludmFsaWRDbGFzcygpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgU3RhdGVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVySW52YWxpZEFzcGVjdCgpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgUHJvcGVydHlUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigiYmFyIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJJbnZhbGlkQ2xhc3MoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFN0YXRlVGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImZvbyIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVySW52YWxpZEFzcGVjdCgpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgQ29sbGVjdGlvblRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDb2xsZWN0aW9uQ2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJiYXIiLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZExpc3RDaGFuZ2VMaXN0ZW5lckludmFsaWRDbGFzcygpIHsKLQkJTW9kZWwgbW9kZWwgPSBuZXcgU3RhdGVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgTGlzdENoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcigiZm9vIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRMaXN0Q2hhbmdlTGlzdGVuZXJJbnZhbGlkQXNwZWN0KCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBMaXN0VGVzdE1vZGVsKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IExpc3RDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRyeSB7Ci0JCQltb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoImJhciIsIGxpc3RlbmVyKTsKLQkJCWZhaWwoImJvZ3VzIGxpc3RlbmVyOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVHJlZUNoYW5nZUxpc3RlbmVySW52YWxpZENsYXNzKCkgewotCQlNb2RlbCBtb2RlbCA9IG5ldyBTdGF0ZVRlc3RNb2RlbCgpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCVRyZWVDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUcmVlQ2hhbmdlQWRhcHRlcigpOwotCQl0cnkgewotCQkJbW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKCJmb28iLCBsaXN0ZW5lcik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFRyZWVDaGFuZ2VMaXN0ZW5lckludmFsaWRBc3BlY3QoKSB7Ci0JCU1vZGVsIG1vZGVsID0gbmV3IFRyZWVUZXN0TW9kZWwoKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQlUcmVlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVHJlZUNoYW5nZUFkYXB0ZXIoKTsKLQkJdHJ5IHsKLQkJCW1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcigiYmFyIiwgbGlzdGVuZXIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0IG1vZGVscyAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgU3RhdGVUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJU3RhdGVUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgU3RhdGVDaGFuZ2VMaXN0ZW5lci5jbGFzcywgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgUHJvcGVydHlUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJUHJvcGVydHlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIENvbGxlY3Rpb25UZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJQ29sbGVjdGlvblRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJCXJldHVybiBuZXcgU2luZ2xlQXNwZWN0Q2hhbmdlU3VwcG9ydCh0aGlzLCBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIuY2xhc3MsICJmb28iKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBMaXN0VGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCUxpc3RUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhbmdlU3VwcG9ydCBidWlsZENoYW5nZVN1cHBvcnQoKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgTGlzdENoYW5nZUxpc3RlbmVyLmNsYXNzLCAiZm9vIik7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgVHJlZVRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlUcmVlVGVzdE1vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIFRyZWVDaGFuZ2VMaXN0ZW5lci5jbGFzcywgImZvbyIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL0pwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRlM2Y3NS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwubGlzdGVuZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsTGlzdGVuZXJUZXN0cyB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlNb2RlbExpc3RlbmVyVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWZsZWN0aXZlU3RhdGVDaGFuZ2VMaXN0ZW5lclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5jbGFzcyk7Ci0JCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRVdGlsaXR5TW9kZWxMaXN0ZW5lclRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YWU1YzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgUmVmbGVjdGl2ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFplcm9Bcmd1bWVudCIsICJpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudCIsICJjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudCIsICJjb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudCIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkU2luZ2xlQXJndW1lbnQiLCAiaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudCIsICJjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50IiwgImNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtQWRkZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFplcm9Bcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnROYW1lZENvbGxlY3Rpb24oKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJTdHJpbmdzKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5jb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyU3RyaW5ncygpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5jb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50TmFtZWRDb2xsZWN0aW9uKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRTaW5nbGVBcmd1bWVudE5hbWVkQ29sbGVjdGlvbigpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJdGVzdE1vZGVsLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19DT0xMRUNUSU9OLCBzdHJpbmcpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudCIpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRDYXVzZSgpLmdldENsYXNzKCkgPT0gTm9TdWNoTWV0aG9kRXhjZXB0aW9uLmNsYXNzKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfQ09MTEVDVElPTiwgc3RyaW5nKTsKLQkJTWV0aG9kIG1ldGhvZCA9IFJlZmxlY3Rpb25Ub29scy5nZXRNZXRob2QodGFyZ2V0LCAiY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtDb2xsZWN0aW9uQ2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0NPTExFQ1RJT04sIHN0cmluZyk7Ci0JCS8vIGJ1aWxkIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIExJU1QgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJjb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKCJib2d1cyBsaXN0IiwgKExpc3RDaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VMaXN0KCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HU19DT0xMRUNUSU9OID0gInN0cmluZ3MiOwotCQlUZXN0TW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShTdHJpbmcgcykgewotCQkJCQlUZXN0TW9kZWwudGhpcy5yZW1vdmVTdHJpbmcocyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQl2b2lkIGFkZFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZW1vdmVTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3RyaW5nLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCBjbGVhclN0cmluZ3MoKSB7Ci0JCQl0aGlzLmNsZWFyQ29sbGVjdGlvbih0aGlzLnN0cmluZ3MsIFNUUklOR1NfQ09MTEVDVElPTik7Ci0JCX0KLQkJdm9pZCByZXBsYWNlU3RyaW5ncyhTdHJpbmdbXSBuZXdTdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFNUUklOR1NfQ09MTEVDVElPTiwgdGhpcy5zdHJpbmdzKTsKLQkJfQotCQl2b2lkIGNoYW5nZUxpc3QoKSB7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZCgiYm9ndXMgbGlzdCIsIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLQkJfQotCX0KLQotCWNsYXNzIFRhcmdldCB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCVN0cmluZyBjb2xsZWN0aW9uTmFtZTsKLQkJU3RyaW5nIHN0cmluZzsKLQkJYm9vbGVhbiBpdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBjb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29sbGVjdGlvbkV2ZW50U2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgY29sbGVjdGlvbk5hbWUsIFN0cmluZyBzdHJpbmcpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMuY29sbGVjdGlvbk5hbWUgPSBjb2xsZWN0aW9uTmFtZTsKLQkJCXRoaXMuc3RyaW5nID0gc3RyaW5nOwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGl0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DbGVhcmVkU2luZ2xlQXJndW1lbnQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmNvbGxlY3Rpb25OYW1lLCBlLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuY29sbGVjdGlvbk5hbWUsIGUuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJdm9pZCBjb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudChDb2xsZWN0aW9uRXZlbnQgZSkgewotCQkJdGhpcy5jb2xsZWN0aW9uRXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5jb2xsZWN0aW9uTmFtZSwgZS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJfQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkRG91YmxlQXJndW1lbnQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUsIE9iamVjdCBvKSB7Ci0JCQlmYWlsKCJib2d1cyBldmVudDogIiArIGUgKyAiIG9iamVjdDogIiArIG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjZjOWIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVMaXN0Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmVmbGVjdGl2ZUxpc3RDaGFuZ2VMaXN0ZW5lclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWZsZWN0aXZlTGlzdENoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcihPYmplY3QgdGFyZ2V0KSB7Ci0JCXJldHVybiBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAiaXRlbUFkZGVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50IiwgIml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudCIsICJpdGVtTW92ZWRaZXJvQXJndW1lbnQiLCAibGlzdENsZWFyZWRaZXJvQXJndW1lbnQiLCAibGlzdENoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgIml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50IiwgIml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAiaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnQiLCAiaXRlbU1vdmVkU2luZ2xlQXJndW1lbnQiLCAibGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1BZGRlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbUFkZGVkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlU3RyaW5nKHN0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZVN0cmluZyhzdHJpbmcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIG9sZFN0cmluZyA9ICJmb28iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gImJhciI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcob2xkU3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBuZXdTdHJpbmcsIDAsIG9sZFN0cmluZyk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBvbGRTdHJpbmcgPSAiZm9vIjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICJiYXIiOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKG9sZFN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbmV3U3RyaW5nLCAwLCBvbGRTdHJpbmcpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZVN0cmluZyhvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlbU1vdmVkWmVyb0FyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5tb3ZlU3RyaW5nKDAsIDIpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ6ZXJvIik7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoIm9uZSIpOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKCJ0d28iKTsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZygidGhyZWUiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCAwLCAyKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLm1vdmVTdHJpbmcoMCwgMik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENsZWFyZWRaZXJvQXJndW1lbnROYW1lZExpc3QoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJdGVzdE1vZGVsLmFkZFN0cmluZyhzdHJpbmcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIG51bGwsIC0xKTsKLQkJdGVzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19MSVNULCB0aGlzLmJ1aWxkWmVyb0FyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0Lmxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50TmFtZWRMaXN0KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCXRlc3RNb2RlbC5hZGRTdHJpbmcoc3RyaW5nKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBudWxsLCAtMSk7Ci0JCXRlc3RNb2RlbC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgdGhpcy5idWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIodGFyZ2V0KSk7Ci0JCXRlc3RNb2RlbC5jbGVhclN0cmluZ3MoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5saXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFplcm9Bcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VBbGxTdHJpbmdzKG5ldyBTdHJpbmdbXSB7ImJhciIsICJiYXoifSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbVJlcGxhY2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lmxpc3RDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudE5hbWVkTGlzdCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQl0ZXN0TW9kZWwuYWRkU3RyaW5nKHN0cmluZyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgbnVsbCwgLTEpOwotCQl0ZXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHRoaXMuYnVpbGRTaW5nbGVBcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVwbGFjZUFsbFN0cmluZ3MobmV3IFN0cmluZ1tdIHsiYmFyIiwgImJheiJ9KTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtUmVwbGFjZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5pdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lml0ZW1Nb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubGlzdENoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJU3RyaW5nIHN0cmluZyA9ICJmb28iOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX0xJU1QsIHN0cmluZywgMCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJsaXN0Q2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVN0cmluZyBzdHJpbmcgPSAiZm9vIjsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19MSVNULCBzdHJpbmcsIDApOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJsaXN0Q2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge0xpc3RDaGFuZ2VFdmVudC5jbGFzcywgT2JqZWN0LmNsYXNzfSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlTdHJpbmcgc3RyaW5nID0gImZvbyI7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfTElTVCwgc3RyaW5nLCAwKTsKLQkJLy8gYnVpbGQgYSBMSVNUIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgQ09MTEVDVElPTiBjaGFuZ2UgbGlzdGVuZXIKLQkJT2JqZWN0IGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkTGlzdENoYW5nZUxpc3RlbmVyKHRhcmdldCwgImxpc3RFdmVudFNpbmdsZUFyZ3VtZW50Iik7Ci0JCXRlc3RNb2RlbC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoImJvZ3VzIGNvbGxlY3Rpb24iLCAoQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKSBsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGVzdE1vZGVsLmNoYW5nZUNvbGxlY3Rpb24oKTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdTX0xJU1QgPSAic3RyaW5ncyI7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5ncygpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLnN0cmluZ3MpOwotCQl9Ci0JCXZvaWQgYWRkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuYWRkSXRlbVRvTGlzdChzdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIHJlbW92ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdCh0aGlzLnN0cmluZ3MuaW5kZXhPZihzdHJpbmcpLCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlU3RyaW5nKFN0cmluZyBvbGRTdHJpbmcsIFN0cmluZyBuZXdTdHJpbmcpIHsKLQkJCXRoaXMuc2V0SXRlbUluTGlzdCh0aGlzLnN0cmluZ3MuaW5kZXhPZihvbGRTdHJpbmcpLCBuZXdTdHJpbmcsIHRoaXMuc3RyaW5ncywgU1RSSU5HU19MSVNUKTsKLQkJfQotCQl2b2lkIG1vdmVTdHJpbmcoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCBjbGVhclN0cmluZ3MoKSB7Ci0JCQl0aGlzLmNsZWFyTGlzdCh0aGlzLnN0cmluZ3MsIFNUUklOR1NfTElTVCk7Ci0JCX0KLQkJdm9pZCByZXBsYWNlQWxsU3RyaW5ncyhTdHJpbmdbXSBuZXdTdHJpbmdzKSB7Ci0JCQl0aGlzLnN0cmluZ3MuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdHJpbmdzLCBuZXdTdHJpbmdzKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFNUUklOR1NfTElTVCwgdGhpcy5zdHJpbmdzKTsKLQkJfQotCQl2b2lkIGNoYW5nZUNvbGxlY3Rpb24oKSB7Ci0JCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZCgiYm9ndXMgY29sbGVjdGlvbiIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOwotCQl9Ci0JfQotCi0JY2xhc3MgVGFyZ2V0IHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJU3RyaW5nIGxpc3ROYW1lOwotCQlTdHJpbmcgc3RyaW5nOwotCQlpbnQgaW5kZXg7Ci0JCVN0cmluZyByZXBsYWNlZFN0cmluZzsKLQkJaW50IHNvdXJjZUluZGV4OwotCQlib29sZWFuIGl0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGl0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtUmVwbGFjZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBpdGVtTW92ZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2hhbmdlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBsaXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIGxpc3RFdmVudFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCwgU3RyaW5nIGxpc3ROYW1lLCBTdHJpbmcgc3RyaW5nLCBpbnQgaW5kZXgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMubGlzdE5hbWUgPSBsaXN0TmFtZTsKLQkJCXRoaXMuc3RyaW5nID0gc3RyaW5nOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQl9Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIFN0cmluZyBzdHJpbmcsIGludCBpbmRleCwgU3RyaW5nIHJlcGxhY2VkU3RyaW5nKSB7Ci0JCQl0aGlzKHRlc3RNb2RlbCwgbGlzdE5hbWUsIHN0cmluZywgaW5kZXgpOwotCQkJdGhpcy5yZXBsYWNlZFN0cmluZyA9IHJlcGxhY2VkU3RyaW5nOwotCQl9Ci0JCVRhcmdldChUZXN0TW9kZWwgdGVzdE1vZGVsLCBTdHJpbmcgbGlzdE5hbWUsIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLmxpc3ROYW1lID0gbGlzdE5hbWU7Ci0JCQl0aGlzLmluZGV4ID0gdGFyZ2V0SW5kZXg7Ci0JCQl0aGlzLnNvdXJjZUluZGV4ID0gc291cmNlSW5kZXg7Ci0JCX0KLQkJdm9pZCBpdGVtQWRkZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1BZGRlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbUFkZGVkU2luZ2xlQXJndW1lbnQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zdHJpbmcsIGUuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1SZW1vdmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbVJlbW92ZWRTaW5nbGVBcmd1bWVudChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJdGhpcy5pdGVtUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuaW5kZXgsIGUuZ2V0SW5kZXgoKSk7Ci0JCX0KLQkJdm9pZCBpdGVtUmVwbGFjZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLml0ZW1SZXBsYWNlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgaXRlbVJlcGxhY2VkU2luZ2xlQXJndW1lbnQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQl0aGlzLml0ZW1SZXBsYWNlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3RyaW5nLCBlLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMucmVwbGFjZWRTdHJpbmcsIGUuZ2V0T2xkSXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRJbmRleCgpKTsKLQkJfQotCQl2b2lkIGl0ZW1Nb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMuaXRlbU1vdmVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBpdGVtTW92ZWRTaW5nbGVBcmd1bWVudChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCXRoaXMuaXRlbU1vdmVkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdE5hbWUsIGUuZ2V0TGlzdE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5pbmRleCwgZS5nZXRUYXJnZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZUluZGV4LCBlLmdldFNvdXJjZUluZGV4KCkpOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLmxpc3RDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBsaXN0Q2xlYXJlZFNpbmdsZUFyZ3VtZW50KExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCXRoaXMubGlzdENsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5saXN0TmFtZSwgZS5nZXRMaXN0TmFtZSgpKTsKLQkJfQotCQl2b2lkIGxpc3RDbGVhcmVkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy5saXN0Q2xlYXJlZFplcm9Bcmd1bWVudEZsYWcgPSB0cnVlOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWRTaW5nbGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5saXN0Q2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQl9Ci0JCXZvaWQgbGlzdENoYW5nZWREb3VibGVBcmd1bWVudChMaXN0Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCQl2b2lkIGxpc3RFdmVudFNpbmdsZUFyZ3VtZW50KExpc3RFdmVudCBlKSB7Ci0JCQl0aGlzLmxpc3RFdmVudFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmxpc3ROYW1lLCBlLmdldExpc3ROYW1lKCkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIyN2Q1Ny4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlZmxlY3RpdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9Bcmd1bWVudE5hbWVkUHJvcGVydHkoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQl0ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkWmVyb0FyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRUcnVlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBtZXRob2QgdGhhdCBoYXMgbW9yZSBnZW5lcmFsIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCU1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0TWV0aG9kKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgbWV0aG9kKSk7Ci0JCXRlc3RNb2RlbC5zZXRWYWx1ZSg5OSk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQuc2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnROYW1lZFByb3BlcnR5KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCg3KTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuVkFMVUVfUFJPUEVSVFksIDcsIDk5KTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBtZXRob2QgdGhhdCBoYXMgbW9yZSBnZW5lcmFsIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVBcmd1bWVudE5hbWVkUHJvcGVydHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWRTaW5nbGVBcmd1bWVudDIiLCBuZXcgQ2xhc3NbXSB7T2JqZWN0LmNsYXNzfSk7Ci0JCXRlc3RNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQuemVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RlbmVyTWlzbWF0Y2goKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQkvLyBidWlsZCBhIFBST1BFUlRZIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgU1RBVEUgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAicHJvcGVydHlDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKFN0YXRlQ2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuc2V0VmFsdWUoOTkpOwotCQkJZmFpbCgibGlzdGVuZXIgbWlzbWF0Y2g6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCb2d1c0RvdWJsZUFyZ3VtZW50MSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoNyk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlZBTFVFX1BST1BFUlRZLCA3LCA5OSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKDcpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5WQUxVRV9QUk9QRVJUWSwgNywgOTkpOwotCQlNZXRob2QgbWV0aG9kID0gUmVmbGVjdGlvblRvb2xzLmdldE1ldGhvZCh0YXJnZXQsICJwcm9wZXJ0eUNoYW5nZWREb3VibGVBcmd1bWVudCIsIG5ldyBDbGFzc1tdIHtQcm9wZXJ0eUNoYW5nZUV2ZW50LmNsYXNzLCBPYmplY3QuY2xhc3N9KTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGFyZ2V0LCBtZXRob2QpOwotCQkJZmFpbCgiYm9ndXMgbGlzdGVuZXI6ICIgKyBsaXN0ZW5lcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChleC5nZXRNZXNzYWdlKCkuZXF1YWxzKG1ldGhvZC50b1N0cmluZygpKSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGludCB2YWx1ZSA9IDA7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7Ci0JCVRlc3RNb2RlbChpbnQgdmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQkJdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsKLQkJCWludCBvbGQgPSB0aGlzLnZhbHVlOwotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQkJCWlmIChvbGQgIT0gdmFsdWUpIHsKLQkJCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFRhcmdldCB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0JCU9iamVjdCBvbGRWYWx1ZTsKLQkJT2JqZWN0IG5ld1ZhbHVlOwotCQlib29sZWFuIHplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBzaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50ZXN0TW9kZWwgPSB0ZXN0TW9kZWw7Ci0JCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBuZXcgSW50ZWdlcihvbGRWYWx1ZSk7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3IEludGVnZXIobmV3VmFsdWUpOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy56ZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5zaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5wcm9wZXJ0eU5hbWUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCQl2b2lkIHByb3BlcnR5Q2hhbmdlZFNpbmdsZUFyZ3VtZW50MihPYmplY3QgbykgewotCQkJUHJvcGVydHlDaGFuZ2VFdmVudCBlID0gKFByb3BlcnR5Q2hhbmdlRXZlbnQpIG87Ci0JCQl0aGlzLnNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnByb3BlcnR5TmFtZSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JCXZvaWQgcHJvcGVydHlDaGFuZ2VkRG91YmxlQXJndW1lbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBlLCBPYmplY3QgbykgewotCQkJZmFpbCgiYm9ndXMgZXZlbnQ6ICIgKyBlICsgIiAtIG9iamVjdDogIiArIG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE3OTllMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVN0YXRlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5SZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlZmxlY3RpdmVTdGF0ZUNoYW5nZUxpc3RlbmVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9Bcmd1bWVudCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsKTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJzdGF0ZUNoYW5nZWRaZXJvQXJndW1lbnQiKSk7Ci0JCXRlc3RNb2RlbC5jaGFuZ2VTdGF0ZSgpOwotCQlhc3NlcnRUcnVlKHRhcmdldC56ZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUFyZ3VtZW50KCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQl0ZXN0TW9kZWwuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50IikpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgbWV0aG9kIHRoYXQgaGFzIG1vcmUgZ2VuZXJhbCBtZXRob2QgcGFyYW1ldGVyIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0TWV0aG9kKHRhcmdldCwgInN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50MiIsIG5ldyBDbGFzc1tdIHtPYmplY3QuY2xhc3N9KTsKLQkJdGVzdE1vZGVsLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIoUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCkpOwotCQl0ZXN0TW9kZWwuY2hhbmdlU3RhdGUoKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lnplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5zaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lck1pc21hdGNoKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwpOwotCQkvLyBidWlsZCBhIFNUQVRFIGNoYW5nZSBsaXN0ZW5lciBhbmQgaGFjayBpdCBzbyB3ZQotCQkvLyBjYW4gYWRkIGl0IGFzIGEgUFJPUEVSVFkgY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIodGFyZ2V0LCAic3RhdGVDaGFuZ2VkU2luZ2xlQXJndW1lbnQiKTsKLQkJdGVzdE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoInZhbHVlIiwgKFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxpc3RlbmVyKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0ZXN0TW9kZWwuY2hhbmdlUHJvcGVydHkoKTsKLQkJCWZhaWwoImxpc3RlbmVyIG1pc21hdGNoOiAiICsgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Qm9ndXNEb3VibGVBcmd1bWVudDEoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN0YXRlQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBSZWZsZWN0aXZlQ2hhbmdlTGlzdGVuZXIuYnVpbGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgInN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50Iik7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSA9PSBOb1N1Y2hNZXRob2RFeGNlcHRpb24uY2xhc3MpIHsKLQkJCQlleENhdWdodCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJvZ3VzRG91YmxlQXJndW1lbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCk7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCk7Ci0JCU1ldGhvZCBtZXRob2QgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0TWV0aG9kKHRhcmdldCwgInN0YXRlQ2hhbmdlZERvdWJsZUFyZ3VtZW50IiwgbmV3IENsYXNzW10ge1N0YXRlQ2hhbmdlRXZlbnQuY2xhc3MsIE9iamVjdC5jbGFzc30pOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsIG1ldGhvZCk7Ci0JCQlmYWlsKCJib2d1cyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJaWYgKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMobWV0aG9kLnRvU3RyaW5nKCkpKSB7Ci0JCQkJZXhDYXVnaHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCi0JY2xhc3MgVGVzdE1vZGVsIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJdm9pZCBjaGFuZ2VTdGF0ZSgpIHsKLQkJCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JCXZvaWQgY2hhbmdlUHJvcGVydHkoKSB7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoInZhbHVlIiwgNTUsIDQyKTsKLQkJfQotCX0KLQotCWNsYXNzIFRhcmdldCB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JCWJvb2xlYW4gemVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlUYXJnZXQoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkWmVyb0FyZ3VtZW50KCkgewotCQkJdGhpcy56ZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIHN0YXRlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KFN0YXRlQ2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5zaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJdm9pZCBzdGF0ZUNoYW5nZWRTaW5nbGVBcmd1bWVudDIoT2JqZWN0IGUpIHsKLQkJCXRoaXMuc2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsICgoU3RhdGVDaGFuZ2VFdmVudCkgZSkuZ2V0U291cmNlKCkpOwotCQl9Ci0JCXZvaWQgc3RhdGVDaGFuZ2VkRG91YmxlQXJndW1lbnQoU3RhdGVDaGFuZ2VFdmVudCBlLCBPYmplY3QgbykgewotCQkJZmFpbCgiYm9ndXMgZXZlbnQ6ICIgKyBlICsgIiAtIG9iamVjdDogIiArIG8pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvbGlzdGVuZXIvUmVmbGVjdGl2ZVRyZWVDaGFuZ2VMaXN0ZW5lclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZGJmZTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL2xpc3RlbmVyL1JlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLmxpc3RlbmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZVJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuVHJlZUNoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWZsZWN0aXZlVHJlZUNoYW5nZUxpc3RlbmVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFJlZmxlY3RpdmVUcmVlQ2hhbmdlTGlzdGVuZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKE9iamVjdCB0YXJnZXQpIHsKLQkJcmV0dXJuIFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJub2RlQWRkZWRaZXJvQXJndW1lbnQiLCAibm9kZVJlbW92ZWRaZXJvQXJndW1lbnQiLCAidHJlZUNsZWFyZWRaZXJvQXJndW1lbnQiLCAidHJlZUNoYW5nZWRaZXJvQXJndW1lbnQiKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVDaGFuZ2VMaXN0ZW5lciBidWlsZFNpbmdsZUFyZ3VtZW50TGlzdGVuZXIoT2JqZWN0IHRhcmdldCkgewotCQlyZXR1cm4gUmVmbGVjdGl2ZUNoYW5nZUxpc3RlbmVyLmJ1aWxkVHJlZUNoYW5nZUxpc3RlbmVyKHRhcmdldCwgIm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50IiwgIm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnQiLCAidHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudCIsICJ0cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50Iik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVBZGRlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlUmVtb3ZlZFplcm9Bcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwucmVtb3ZlTm9kZSgiY2hpbGQiKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlbW92ZU5vZGUoImNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC5ub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZUNsZWFyZWRaZXJvQXJndW1lbnROYW1lZFRyZWUoKSB7Ci0JCVRlc3RNb2RlbCB0ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKCJyb290Iik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJyb290IiwgImNoaWxkIik7Ci0JCXRlc3RNb2RlbC5hZGROb2RlKCJjaGlsZCIsICJncmFuZGNoaWxkIik7Ci0JCVRhcmdldCB0YXJnZXQgPSBuZXcgVGFyZ2V0KHRlc3RNb2RlbCwgVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgbmV3IFN0cmluZ1swXSk7Ci0JCXRlc3RNb2RlbC5hZGRUcmVlQ2hhbmdlTGlzdGVuZXIoVGVzdE1vZGVsLlNUUklOR1NfVFJFRSwgdGhpcy5idWlsZFplcm9Bcmd1bWVudExpc3RlbmVyKHRhcmdldCkpOwotCQl0ZXN0TW9kZWwuY2xlYXJUcmVlKCk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRUcnVlKHRhcmdldC50cmVlQ2xlYXJlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZUNsZWFyZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoImNoaWxkIiwgImdyYW5kY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nWzBdKTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLmNsZWFyVHJlZSgpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50TmFtZWRUcmVlKCkgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQl0ZXN0TW9kZWwuYWRkTm9kZSgicm9vdCIsICJjaGlsZCIpOwotCQlUYXJnZXQgdGFyZ2V0ID0gbmV3IFRhcmdldCh0ZXN0TW9kZWwsIFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIG5ldyBTdHJpbmdbXXsicm9vdCIsICJhbm90aGVyIGNoaWxkIn0pOwotCQl0ZXN0TW9kZWwuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5TVFJJTkdTX1RSRUUsIHRoaXMuYnVpbGRaZXJvQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VOb2RlKCJjaGlsZCIsICJhbm90aGVyIGNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0VHJ1ZSh0YXJnZXQudHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudE5hbWVkVHJlZSgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiYW5vdGhlciBjaGlsZCJ9KTsKLQkJdGVzdE1vZGVsLmFkZFRyZWVDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCB0aGlzLmJ1aWxkU2luZ2xlQXJndW1lbnRMaXN0ZW5lcih0YXJnZXQpKTsKLQkJdGVzdE1vZGVsLnJlcGxhY2VOb2RlKCJjaGlsZCIsICJhbm90aGVyIGNoaWxkIik7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlQWRkZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0Lm5vZGVBZGRlZFNpbmdsZUFyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydEZhbHNlKHRhcmdldC5ub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcpOwotCQlhc3NlcnRGYWxzZSh0YXJnZXQudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQkJYXNzZXJ0RmFsc2UodGFyZ2V0LnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyk7Ci0JCWFzc2VydFRydWUodGFyZ2V0LnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdGVuZXJNaXNtYXRjaCgpIHsKLQkJVGVzdE1vZGVsIHRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwoInJvb3QiKTsKLQkJdGVzdE1vZGVsLmFkZE5vZGUoInJvb3QiLCAiY2hpbGQiKTsKLQkJVGFyZ2V0IHRhcmdldCA9IG5ldyBUYXJnZXQodGVzdE1vZGVsLCBUZXN0TW9kZWwuU1RSSU5HU19UUkVFLCBuZXcgU3RyaW5nW117InJvb3QiLCAiY2hpbGQifSk7Ci0JCS8vIGJ1aWxkIGEgVFJFRSBjaGFuZ2UgbGlzdGVuZXIgYW5kIGhhY2sgaXQgc28gd2UKLQkJLy8gY2FuIGFkZCBpdCBhcyBhIENPTExFQ1RJT04gY2hhbmdlIGxpc3RlbmVyCi0JCU9iamVjdCBsaXN0ZW5lciA9IFJlZmxlY3RpdmVDaGFuZ2VMaXN0ZW5lci5idWlsZFRyZWVDaGFuZ2VMaXN0ZW5lcih0YXJnZXQsICJ0cmVlRXZlbnRTaW5nbGVBcmd1bWVudCIpOwotCQl0ZXN0TW9kZWwuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJib2d1cyBjb2xsZWN0aW9uIiwgKENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikgbGlzdGVuZXIpOwotCi0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRlc3RNb2RlbC5jaGFuZ2VDb2xsZWN0aW9uKCk7Ci0JCQlmYWlsKCJsaXN0ZW5lciBtaXNtYXRjaDogIiArIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0KLQljbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcm9vdDsKLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPFN0cmluZz4+IGNoaWxkcmVuTGlzdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248U3RyaW5nPj4oKTsKLQkJcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR1NfVFJFRSA9ICJzdHJpbmdzIjsKLQkJVGVzdE1vZGVsKFN0cmluZyByb290KSB7Ci0JCQlzdXBlcigpOwotCQkJaWYgKHJvb3QgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5yb290ID0gcm9vdDsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5wdXQocm9vdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChyb290LCBudWxsKTsKLQkJfQotCQlTdHJpbmcgZ2V0Um9vdCgpIHsKLQkJCXJldHVybiB0aGlzLnJvb3Q7Ci0JCX0KLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gcGF0aChTdHJpbmcgbm9kZSkgewotCQkJU3RyaW5nIHRlbXAgPSBub2RlOwotCQkJTGlzdDxTdHJpbmc+IHJldmVyc2VQYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlkbyB7Ci0JCQkJcmV2ZXJzZVBhdGguYWRkKHRlbXApOwotCQkJCXRlbXAgPSB0aGlzLnBhcmVudHMuZ2V0KHRlbXApOwotCQkJfSB3aGlsZSAodGVtcCAhPSBudWxsKTsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMucmV2ZXJzZShyZXZlcnNlUGF0aCk7Ci0JCX0KLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPFN0cmluZz4odGhpcy5jaGlsZHJlbkxpc3RzLmtleVNldCgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFN0cmluZyBzKSB7Ci0JCQkJCVRlc3RNb2RlbC50aGlzLnJlbW92ZU5vZGUocyk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQl2b2lkIGFkZE5vZGUoU3RyaW5nIHBhcmVudCwgU3RyaW5nIGNoaWxkKSB7Ci0JCQlpZiAoKHBhcmVudCA9PSBudWxsKSB8fCAoY2hpbGQgPT0gbnVsbCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQotCQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbkxpc3RzLmdldChwYXJlbnQpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYW5ub3QgYWRkIGEgY2hpbGQgdG8gYSBub24tZXhpc3RlbnQgcGFyZW50Iik7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KGNoaWxkKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiY2Fubm90IGFkZCBhIGNoaWxkIHRoYXQgaXMgYWxyZWFkeSBpbiB0aGUgdHJlZSIpOwotCQkJfQotCQkJCi0JCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChjaGlsZCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwotCQkJdGhpcy5wYXJlbnRzLnB1dChjaGlsZCwgcGFyZW50KTsKLQkJCXRoaXMuZmlyZU5vZGVBZGRlZChTVFJJTkdTX1RSRUUsIHRoaXMucGF0aChjaGlsZCkpOwotCQl9Ci0JCXZvaWQgcmVtb3ZlTm9kZShTdHJpbmcgbm9kZSkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCi0JCQlDb2xsZWN0aW9uPFN0cmluZz4gY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuTGlzdHMuZ2V0KG5vZGUpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub2RlIGlzIG5vdCBpbiB0cmVlIik7Ci0JCQl9Ci0JCQlMaXN0PFN0cmluZz4gcGF0aCA9IHRoaXMucGF0aChub2RlKTsKLQkJCWZvciAoU3RyaW5nIHMgOiBjaGlsZHJlbikgewotCQkJCXRoaXMucmVtb3ZlTm9kZShzKTsKLQkJCX0KLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5yZW1vdmUobm9kZSk7Ci0JCQl0aGlzLnBhcmVudHMucmVtb3ZlKG5vZGUpOwotCQkJdGhpcy5maXJlTm9kZVJlbW92ZWQoU1RSSU5HU19UUkVFLCBwYXRoKTsKLQkJfQotCQl2b2lkIHJlcGxhY2VOb2RlKFN0cmluZyBvbGROb2RlLCBTdHJpbmcgbmV3Tm9kZSkgewotCQkJaWYgKChvbGROb2RlID09IG51bGwpIHx8IChuZXdOb2RlID09IG51bGwpKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW5MaXN0cy5yZW1vdmUob2xkTm9kZSk7Ci0JCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9sZCBub2RlIGlzIG5vdCBpbiB0cmVlIik7Ci0JCQl9Ci0JCQl0aGlzLmNoaWxkcmVuTGlzdHMucHV0KG5ld05vZGUsIGNoaWxkcmVuKTsKLQkJCWZvciAoU3RyaW5nIGNoaWxkIDogY2hpbGRyZW4pIHsKLQkJCQl0aGlzLnBhcmVudHMucHV0KGNoaWxkLCBuZXdOb2RlKTsKLQkJCX0KLQotCQkJU3RyaW5nIHBhcmVudCA9IHRoaXMucGFyZW50cy5yZW1vdmUob2xkTm9kZSk7Ci0JCQl0aGlzLnBhcmVudHMucHV0KG5ld05vZGUsIHBhcmVudCk7Ci0KLQkJCXRoaXMuZmlyZVRyZWVDaGFuZ2VkKFNUUklOR1NfVFJFRSwgdGhpcy5wYXRoKG5ld05vZGUpKTsKLQkJfQotCQl2b2lkIGNsZWFyVHJlZSgpIHsKLQkJCXRoaXMuY2hpbGRyZW5MaXN0cy5jbGVhcigpOwotCQkJdGhpcy5jaGlsZHJlbkxpc3RzLnB1dChyb290LCBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCQl0aGlzLnBhcmVudHMuY2xlYXIoKTsKLQkJCXRoaXMucGFyZW50cy5wdXQocm9vdCwgbnVsbCk7Ci0JCQl0aGlzLmZpcmVUcmVlQ2xlYXJlZChTVFJJTkdTX1RSRUUpOwotCQl9Ci0JCXZvaWQgY2hhbmdlQ29sbGVjdGlvbigpIHsKLQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKCJib2d1cyBjb2xsZWN0aW9uIiwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUYXJnZXQgewotCQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQlTdHJpbmcgdHJlZU5hbWU7Ci0JCUxpc3Q8U3RyaW5nPiBwYXRoOwotCQlib29sZWFuIG5vZGVBZGRlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBub2RlUmVtb3ZlZFplcm9Bcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBub2RlUmVtb3ZlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDbGVhcmVkWmVyb0FyZ3VtZW50RmxhZyA9IGZhbHNlOwotCQlib29sZWFuIHRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUNoYW5nZWRaZXJvQXJndW1lbnRGbGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gdHJlZUNoYW5nZWRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiB0cmVlRXZlbnRTaW5nbGVBcmd1bWVudEZsYWcgPSBmYWxzZTsKLQkJVGFyZ2V0KFRlc3RNb2RlbCB0ZXN0TW9kZWwsIFN0cmluZyB0cmVlTmFtZSwgU3RyaW5nW10gcGF0aCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudGVzdE1vZGVsID0gdGVzdE1vZGVsOwotCQkJdGhpcy50cmVlTmFtZSA9IHRyZWVOYW1lOwotCQkJdGhpcy5wYXRoID0gQXJyYXlzLmFzTGlzdChwYXRoKTsKLQkJfQotCQl2b2lkIG5vZGVBZGRlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMubm9kZUFkZGVkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCBub2RlQWRkZWRTaW5nbGVBcmd1bWVudChUcmVlQWRkRXZlbnQgZSkgewotCQkJdGhpcy5ub2RlQWRkZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnBhdGgsIENvbGxlY3Rpb25Ub29scy5saXN0KGUuZ2V0UGF0aCgpKSk7Ci0JCX0KLQkJdm9pZCBub2RlUmVtb3ZlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIG5vZGVSZW1vdmVkU2luZ2xlQXJndW1lbnQoVHJlZVJlbW92ZUV2ZW50IGUpIHsKLQkJCXRoaXMubm9kZVJlbW92ZWRTaW5nbGVBcmd1bWVudEZsYWcgPSB0cnVlOwotCQkJYXNzZXJ0U2FtZSh0aGlzLnRlc3RNb2RlbCwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy50cmVlTmFtZSwgZS5nZXRUcmVlTmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnBhdGgsIENvbGxlY3Rpb25Ub29scy5saXN0KGUuZ2V0UGF0aCgpKSk7Ci0JCX0KLQkJdm9pZCB0cmVlQ2xlYXJlZFplcm9Bcmd1bWVudCgpIHsKLQkJCXRoaXMudHJlZUNsZWFyZWRaZXJvQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJfQotCQl2b2lkIHRyZWVDbGVhcmVkU2luZ2xlQXJndW1lbnQoVHJlZUNsZWFyRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2xlYXJlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQl9Ci0JCXZvaWQgdHJlZUNoYW5nZWRaZXJvQXJndW1lbnQoKSB7Ci0JCQl0aGlzLnRyZWVDaGFuZ2VkWmVyb0FyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCX0KLQkJdm9pZCB0cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50KFRyZWVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLnRyZWVDaGFuZ2VkU2luZ2xlQXJndW1lbnRGbGFnID0gdHJ1ZTsKLQkJCWFzc2VydFNhbWUodGhpcy50ZXN0TW9kZWwsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU5hbWUsIGUuZ2V0VHJlZU5hbWUoKSk7Ci0JCX0KLQkJdm9pZCB0cmVlRXZlbnRTaW5nbGVBcmd1bWVudChUcmVlRXZlbnQgZSkgewotCQkJdGhpcy50cmVlQ2hhbmdlZFNpbmdsZUFyZ3VtZW50RmxhZyA9IHRydWU7Ci0JCQlhc3NlcnRTYW1lKHRoaXMudGVzdE1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnRyZWVOYW1lLCBlLmdldFRyZWVOYW1lKCkpOwotCQl9Ci0JCXZvaWQgY29sbGVjdGlvbkNoYW5nZWREb3VibGVBcmd1bWVudChUcmVlQ2hhbmdlRXZlbnQgZSwgT2JqZWN0IG8pIHsKLQkJCWZhaWwoImJvZ3VzIGV2ZW50OiAiICsgZSArICIgLSBvYmplY3Q6ICIgKyBvKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0J1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmVlNDBiLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBFbXBsb3llZSBlbXBsb3llZTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBlbXBsb3llZUhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGVtcGxveWVlRXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGlkQWRhcHRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPiBoaXJlRGF0ZUFkYXB0ZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBhZGFwdGVyRXZlbnQ7Ci0KLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuVHJpZ2dlciB0cmlnZ2VyOwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWZmZXJlZElESG9sZGVyOwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1ZmZlcmVkTmFtZUhvbGRlcjsKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGF0ZT4gYnVmZmVyZWRIaXJlRGF0ZUhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGJ1ZmZlcmVkRXZlbnQ7Ci0KLQlwdWJsaWMgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0KLQkJdGhpcy5lbXBsb3llZSA9IG5ldyBFbXBsb3llZSgxNywgIkZyZWRkeSIsIG5ldyBEYXRlKCkpOwotCQl0aGlzLmVtcGxveWVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4odGhpcy5lbXBsb3llZSk7Ci0KLQkJdGhpcy50cmlnZ2VyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWwuVHJpZ2dlcigpOwotCi0JCXRoaXMuaWRBZGFwdGVyID0gdGhpcy5idWlsZElEQWRhcHRlcih0aGlzLmVtcGxveWVlSG9sZGVyKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4odGhpcy5pZEFkYXB0ZXIsIHRoaXMudHJpZ2dlcik7Ci0KLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcih0aGlzLmVtcGxveWVlSG9sZGVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMubmFtZUFkYXB0ZXIsIHRoaXMudHJpZ2dlcik7Ci0KLQkJdGhpcy5oaXJlRGF0ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkSGlyZURhdGVBZGFwdGVyKHRoaXMuZW1wbG95ZWVIb2xkZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIgPSBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxEYXRlPih0aGlzLmhpcmVEYXRlQWRhcHRlciwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkSURBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgSW50ZWdlcj4oZUhvbGRlciwgRW1wbG95ZWUuSURfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRJRCgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0SUQodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEVtcGxveWVlPiBlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtcGxveWVlLCBTdHJpbmc+KGVIb2xkZXIsIEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPERhdGU+IGJ1aWxkSGlyZURhdGVBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxFbXBsb3llZT4gZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbXBsb3llZSwgRGF0ZT4oZUhvbGRlciwgRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SGlyZURhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKERhdGUgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0SGlyZURhdGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDE3KSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSB0ZW1wID0gdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWRJREhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcigzMjMpKTsKLQkJYXNzZXJ0RXF1YWxzKDE3LCB0aGlzLmVtcGxveWVlLmdldElEKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmlkQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuYnVmZmVyZWRJREhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmlnZ2VyQWNjZXB0KCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDMyMykpOwotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlEYXRlIHRlbXAgPSB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCk7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyaWdnZXIuYWNjZXB0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMyMywgdGhpcy5lbXBsb3llZS5nZXRJRCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDMyMyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJpZ2dlclJlc2V0KCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDMyMykpOwotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzIzKSwgdGhpcy5idWZmZXJlZElESG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlEYXRlIHRlbXAgPSB0aGlzLmVtcGxveWVlLmdldEhpcmVEYXRlKCk7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuZW1wbG95ZWUuZ2V0SGlyZURhdGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW1wLCB0aGlzLmhpcmVEYXRlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyaWdnZXIucmVzZXQoKTsKLQotCQlhc3NlcnRFcXVhbHMoMTcsIHRoaXMuZW1wbG95ZWUuZ2V0SUQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxNyksIHRoaXMuaWRBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTcpLCB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5lbXBsb3llZS5nZXRIaXJlRGF0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbXAsIHRoaXMuaGlyZURhdGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHModGVtcCwgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZElESG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaWRBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5uYW1lQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuaGlyZURhdGVBZGFwdGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLklEX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRW1wbG95ZWUuSElSRV9EQVRFX1BST1BFUlRZKSk7Ci0KLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZElESG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkSGlyZURhdGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmJ1ZmZlcmVkSURIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5pZEFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5uYW1lQWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmhpcmVEYXRlQWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmVtcGxveWVlLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLklEX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5ISVJFX0RBVEVfUFJPUEVSVFkpKTsKLQotCQl0aGlzLmJ1ZmZlcmVkSURIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0JCXRoaXMuYnVmZmVyZWRIaXJlRGF0ZUhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWRJREhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5idWZmZXJlZEhpcmVEYXRlSG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmlkQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubmFtZUFkYXB0ZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmhpcmVEYXRlQWRhcHRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5JRF9QUk9QRVJUWSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZW1wbG95ZWUuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhFbXBsb3llZS5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5lbXBsb3llZS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEVtcGxveWVlLkhJUkVfREFURV9QUk9QRVJUWSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGFkYXB0ZXJMaXN0ZW5lciA9IHRoaXMuYnVpbGRBZGFwdGVyTGlzdGVuZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYWRhcHRlckxpc3RlbmVyKTsKLQotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGVtcGxveWVlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW1wbG95ZWVMaXN0ZW5lcigpOwotCQl0aGlzLmVtcGxveWVlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoRW1wbG95ZWUuTkFNRV9QUk9QRVJUWSwgZW1wbG95ZWVMaXN0ZW5lcik7Ci0KLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIoYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgYWRhcHRlckxpc3RlbmVyID0gdGhpcy5idWlsZEFkYXB0ZXJMaXN0ZW5lcigpOwotCQl0aGlzLm5hbWVBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGFkYXB0ZXJMaXN0ZW5lcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgZW1wbG95ZWVMaXN0ZW5lciA9IHRoaXMuYnVpbGRFbXBsb3llZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZW1wbG95ZWUuYWRkQ2hhbmdlTGlzdGVuZXIoZW1wbG95ZWVMaXN0ZW5lcik7Ci0KLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmJ1ZmZlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmFkYXB0ZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMuZW1wbG95ZWVFdmVudCA9IG51bGw7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmJ1ZmZlcmVkRXZlbnQsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsICJGcmVkZHkiLCAiUmlwbGV5Iik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiQ2hhcmxpZSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYnVmZmVyZWRFdmVudCwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgIlJpcGxleSIsICJDaGFybGllIik7Ci0JCWFzc2VydE51bGwodGhpcy5hZGFwdGVyRXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuZW1wbG95ZWVFdmVudCk7Ci0KLQkJdGhpcy5idWZmZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5hZGFwdGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLmVtcGxveWVlRXZlbnQgPSBudWxsOwotCQl0aGlzLnRyaWdnZXIuYWNjZXB0KCk7Ci0JCWFzc2VydE51bGwodGhpcy5idWZmZXJlZEV2ZW50KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkYXB0ZXJFdmVudCwgdGhpcy5uYW1lQWRhcHRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiRnJlZGR5IiwgIkNoYXJsaWUiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmVtcGxveWVlRXZlbnQsIHRoaXMuZW1wbG95ZWUsIEVtcGxveWVlLk5BTUVfUFJPUEVSVFksICJGcmVkZHkiLCAiQ2hhcmxpZSIpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIkphc29uIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiQ2hhcmxpZSIsICJKYXNvbiIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCi0JCXRoaXMuYnVmZmVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuYWRhcHRlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5lbXBsb3llZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5idWZmZXJlZEV2ZW50LCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCAiSmFzb24iLCAiQ2hhcmxpZSIpOwotCQlhc3NlcnROdWxsKHRoaXMuYWRhcHRlckV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmVtcGxveWVlRXZlbnQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5naW5nIHRoZSB2YWx1ZSBzaG91bGQgdHJpZ2dlciBidWZmZXJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nMSgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIHNldHRpbmcgdG8gdGhlIHNhbWUgdmFsdWUgc2hvdWxkIG5vdCB0cmlnZ2VyIGJ1ZmZlcmluZyAoPykKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyaW5nMigpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJGcmVkZHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5pc0J1ZmZlcmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR0aW5nIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBzaG91bGQgbm90IHRyaWdnZXIgYnVmZmVyaW5nICg/KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RCdWZmZXJpbmczKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1ZmZlcmVkTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQnVmZmVyZWRMaXN0ZW5lcigpOwotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgYnVmZmVyZWRMaXN0ZW5lcik7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIlJpcGxleSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0KLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuc2V0VmFsdWUoIkZyZWRkeSIpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGJhY2stZG9vciBjaGFuZ2VzIGFyZSBpZ25vcmVkIC0gIkxhc3QgT25lIEluIFdpbnMiCi0JICovCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUNvbmZsaWN0MSgpIHsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWZmZXJlZExpc3RlbmVyID0gdGhpcy5idWlsZEJ1ZmZlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGJ1ZmZlcmVkTGlzdGVuZXIpOwotCi0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLnNldFZhbHVlKCJSaXBsZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGcmVkZHkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKCJKYXNvbiIpOwotCQlhc3NlcnRFcXVhbHMoIkphc29uIiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkphc29uIiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyaWdnZXIuYWNjZXB0KCk7Ci0JCS8vICJKYXNvbiIgaXMgZHJvcHBlZCBvbiB0aGUgZmxvb3IuLi4KLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmVtcGxveWVlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSaXBsZXkiLCB0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBiYWNrLWRvb3IgY2hhbmdlcyBjYW4gZGUtYWN0aXZhdGUgYnVmZmVyaW5nICg/KQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDb25mbGljdDIoKSB7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVmZmVyZWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRCdWZmZXJlZExpc3RlbmVyKCk7Ci0JCXRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBidWZmZXJlZExpc3RlbmVyKTsKLQotCQl0aGlzLmJ1ZmZlcmVkTmFtZUhvbGRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiRnJlZGR5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZyZWRkeSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuaXNCdWZmZXJpbmcoKSk7Ci0KLQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZSgiUmlwbGV5Iik7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5lbXBsb3llZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJpcGxleSIsIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUmlwbGV5IiwgdGhpcy5idWZmZXJlZE5hbWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnVmZmVyZWROYW1lSG9sZGVyLmlzQnVmZmVyaW5nKCkpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRCdWZmZXJlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5idWZmZXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQWRhcHRlckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGFwdGVyRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRFbXBsb3llZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5lbXBsb3llZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMocHJvcGVydHlOYW1lLCBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCWNsYXNzIEVtcGxveWVlIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgaW50IGlkOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfUFJPUEVSVFkgPSAiaWQiOwotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBEYXRlIGhpcmVEYXRlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElSRV9EQVRFX1BST1BFUlRZID0gImhpcmVEYXRlIjsKLQotCQlFbXBsb3llZShpbnQgaWQsIFN0cmluZyBuYW1lLCBEYXRlIGhpcmVEYXRlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5pZCA9IGlkOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuaGlyZURhdGUgPSBoaXJlRGF0ZTsKLQkJfQotCQlpbnQgZ2V0SUQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pZDsKLQkJfQotCQl2b2lkIHNldElEKGludCBpZCkgewotCQkJaW50IG9sZCA9IHRoaXMuaWQ7Ci0JCQl0aGlzLmlkID0gaWQ7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSURfUFJPUEVSVFksIG9sZCwgaWQpOwotCQl9Ci0JCVN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJRGF0ZSBnZXRIaXJlRGF0ZSgpIHsKLQkJCXJldHVybiB0aGlzLmhpcmVEYXRlOwotCQl9Ci0JCXZvaWQgc2V0SGlyZURhdGUoRGF0ZSBoaXJlRGF0ZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMuaGlyZURhdGU7Ci0JCQl0aGlzLmhpcmVEYXRlID0gaGlyZURhdGU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSElSRV9EQVRFX1BST1BFUlRZLCBvbGQsIGhpcmVEYXRlKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdmMjY1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpZGlUcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPiBvYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gdHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCB0cmFuc2Zvcm1hdGlvbkV2ZW50OwotCi0JcHVibGljIENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+KG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyID0gbmV3IENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24sIFBlcnNvbj4odGhpcy5vYmplY3RIb2xkZXIsIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcml2YXRlIEJpZGlUcmFuc2Zvcm1lcjxQZXJzb24sIFBlcnNvbj4gYnVpbGRUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBCaWRpVHJhbnNmb3JtZXI8UGVyc29uLCBQZXJzb24+KCkgewotCQkJcHVibGljIFBlcnNvbiB0cmFuc2Zvcm0oUGVyc29uIHApIHsKLQkJCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRQYXJlbnQoKTsKLQkJCX0KLQkJCXB1YmxpYyBQZXJzb24gcmV2ZXJzZVRyYW5zZm9ybShQZXJzb24gcCkgewotCQkJCXJldHVybiAocCA9PSBudWxsKSA/IG51bGwgOiBwLmdldENoaWxkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCi0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJUGVyc29uIHBlcnNvbjEgPSBuZXcgUGVyc29uKCJNYXR0IiwgIk1pdGNoIiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjEpOwotCQlQZXJzb24gcGFyZW50MiA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjEuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQyLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMS5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24zID0gbmV3IFBlcnNvbigiS2FyZW4iLCAiUGVnZ3kiLCBudWxsKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uMyk7Ci0JCWFzc2VydEVxdWFscygiS2FyZW4iLCBwZXJzb24zLmdldE5hbWUoKSk7Ci0JCVBlcnNvbiBwYXJlbnQzID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uMy5nZXRQYXJlbnQoKS5nZXROYW1lKCksIHBhcmVudDMuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24zLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50MywgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQlQZXJzb24ga2FyZW4gPSB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlQZXJzb24gcGVnZ3lQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCVBlcnNvbiBwZWdneSA9IG5ldyBQZXJzb24oIlBlZ2d5IiwgIk1hcmlhbiIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShwZWdneSk7Ci0JCVBlcnNvbiBtYXJpYW5QYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIGthcmVuLCBwZWdneSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBwZWdneVBhcmVudCwgbWFyaWFuUGFyZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJUGVyc29uIG1hdHQgPSBuZXcgUGVyc29uKCJNYXR0IiwgIk1pdGNoIiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG1hdHQpOwotCQlQZXJzb24gbWl0Y2hQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIHBlZ2d5LCBtYXR0KTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG1hcmlhblBhcmVudCwgbWl0Y2hQYXJlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbWF0dCwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBtaXRjaFBhcmVudCwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG1hdHQpOwotCQltaXRjaFBhcmVudCA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbnVsbCwgbWF0dCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBudWxsLCBtaXRjaFBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmFuc2Zvcm1hdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi0JCi0JY2xhc3MgUGVyc29uIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBwYXJlbnROYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX05BTUVfUFJPUEVSVFkgPSAicGFyZW50TmFtZSI7Ci0JCQotCQlwcml2YXRlIFBlcnNvbiBjaGlsZDsKLQkJCi0JCXB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnROYW1lLCBQZXJzb24gY2hpbGQpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotCQkJdGhpcy5jaGlsZCA9IGNoaWxkOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCQlTdHJpbmcgb2xkTmFtZSA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5ld05hbWU7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgUGVyc29uIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBuZXcgUGVyc29uKHRoaXMucGFyZW50TmFtZSwgbnVsbCwgdGhpcyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudE5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIG5ld1BhcmVudE5hbWUpIHsKLQkJCVN0cmluZyBvbGRQYXJlbnROYW1lID0gdGhpcy5wYXJlbnROYW1lOwotCQkJdGhpcy5wYXJlbnROYW1lID0gbmV3UGFyZW50TmFtZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUEFSRU5UX05BTUVfUFJPUEVSVFksIG9sZFBhcmVudE5hbWUsIG5ld1BhcmVudE5hbWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgUGVyc29uIGdldENoaWxkKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGQ7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9DYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NjBmNGEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IG9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+IHRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgdHJhbnNmb3JtYXRpb25FdmVudDsKLQotCXB1YmxpYyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzb24+KG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyID0gbmV3IENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbiwgUGVyc29uPih0aGlzLm9iamVjdEhvbGRlciwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgQmlkaVRyYW5zZm9ybWVyPFBlcnNvbiwgUGVyc29uPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IEJpZGlUcmFuc2Zvcm1lcjxQZXJzb24sIFBlcnNvbj4oKSB7Ci0JCQlwdWJsaWMgUGVyc29uIHRyYW5zZm9ybShQZXJzb24gcCkgewotCQkJCXJldHVybiAocCA9PSBudWxsKSA/IG51bGwgOiBwLmdldFBhcmVudCgpOwotCQkJfQotCQkJcHVibGljIFBlcnNvbiByZXZlcnNlVHJhbnNmb3JtKFBlcnNvbiBwKSB7Ci0JCQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHAuZ2V0Q2hpbGQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCQotCQlQZXJzb24gcGVyc29uID0gdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJLYXJlbiIsIHBlcnNvbi5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGFyZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCVBlcnNvbiBwZXJzb24xID0gbmV3IFBlcnNvbigiTWF0dCIsICJNaXRjaCIsIG51bGwpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShwZXJzb24xKTsKLQkJUGVyc29uIHBhcmVudDIgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24xLmdldFBhcmVudCgpLmdldE5hbWUoKSwgcGFyZW50Mi5nZXROYW1lKCkpOwotCQlhc3NlcnROb3RTYW1lKHBlcnNvbjEuZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwYXJlbnQyLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQlQZXJzb24gcGVyc29uMyA9IG5ldyBQZXJzb24oIkthcmVuIiwgIlBlZ2d5IiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbjMpOwotCQlhc3NlcnRFcXVhbHMoIkthcmVuIiwgcGVyc29uMy5nZXROYW1lKCkpOwotCQlQZXJzb24gcGFyZW50MyA9IHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCBwYXJlbnQzLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uMy5nZXRQYXJlbnQoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBhcmVudDMsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCVBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uKCJDaHJpcyIsICJOb2VsIiwgbnVsbCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24uZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24uZ2V0UGFyZW50KCksIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJUGVyc29uIHBlcnNvbjIgPSBuZXcgUGVyc29uKCJKb24iLCAiRWxpemFiZXRoIiwgbnVsbCk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUocGVyc29uMi5nZXRQYXJlbnQoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24yLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNvbjIuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZShwZXJzb24yLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKHBlcnNvbi5nZXRQYXJlbnQoKSk7Ci0JCWFzc2VydEVxdWFscyhwZXJzb24sIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMocGVyc29uLmdldFBhcmVudCgpLmdldE5hbWUoKSwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE5vdFNhbWUocGVyc29uLmdldFBhcmVudCgpLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZFRyYW5zZm9ybWF0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCVBlcnNvbiBvbGRQZXJzb24gPSB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlQZXJzb24gb2xkUGFyZW50ID0gdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5nZXRWYWx1ZSgpOwotCQlQZXJzb24gbmV3UGVyc29uID0gbmV3IFBlcnNvbigiS2FyZW4iICwgIlBlZ2d5IiwgbnVsbCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG5ld1BlcnNvbik7Ci0JCVBlcnNvbiBuZXdQYXJlbnQgPSB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG9sZFBlcnNvbiwgbmV3UGVyc29uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsIG9sZFBhcmVudCwgbmV3UGFyZW50KTsKLQotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJGb28iKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmF6IiwgIkZvbyIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiQkFaIiwgIkZPTyIpOwotLy8KLS8vCQl0aGlzLmV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBudWxsOwotLy8JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJGT08iKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRm9vIiwgIkZPTyIpOwotLy8JCWFzc2VydE51bGwodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50KTsKLS8vCi0vLwkJdGhpcy5ldmVudCA9IG51bGw7Ci0vLwkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLS8vCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIsICJGT08iLCBudWxsKTsKLS8vCi0vLwkJdGhpcy5ldmVudCA9IG51bGw7Ci0vLwkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLS8vCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0vLwkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbnVsbCwgImJhciIpOwotLy8JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCBudWxsLCAiQkFSIik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRUcmFuc2Zvcm1hdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQkKLQljbGFzcyBQZXJzb24gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJCi0JCXByaXZhdGUgU3RyaW5nIHBhcmVudE5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJFTlRfTkFNRV9QUk9QRVJUWSA9ICJwYXJlbnROYW1lIjsKLQkJCi0JCXByaXZhdGUgUGVyc29uIGNoaWxkOwotCQkKLQkJcHVibGljIFBlcnNvbihTdHJpbmcgbmFtZSwgU3RyaW5nIHBhcmVudE5hbWUsIFBlcnNvbiBjaGlsZCkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7Ci0JCQl0aGlzLmNoaWxkID0gY2hpbGQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmV3TmFtZTsKLQkJCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmV3TmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBQZXJzb24gZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIG5ldyBQZXJzb24odGhpcy5wYXJlbnROYW1lLCBudWxsLCB0aGlzKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRQYXJlbnROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50TmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgbmV3UGFyZW50TmFtZSkgewotCQkJU3RyaW5nIG9sZFBhcmVudE5hbWUgPSB0aGlzLnBhcmVudE5hbWU7Ci0JCQl0aGlzLnBhcmVudE5hbWUgPSBuZXdQYXJlbnROYW1lOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQQVJFTlRfTkFNRV9QUk9QRVJUWSwgb2xkUGFyZW50TmFtZSwgbmV3UGFyZW50TmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBQZXJzb24gZ2V0Q2hpbGQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTU0MmY5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIExvY2FsQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIgYWExOwotCXByaXZhdGUgQ29sbGVjdGlvbkV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0JcHJpdmF0ZSBTdHJpbmcgZXZlbnQxVHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWVzKHRoaXMuc3ViamVjdDFOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MURlc2NyaXB0aW9ucygpKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5ldmVudDFUeXBlID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZXModGhpcy5zdWJqZWN0Mk5hbWVzKCkpOwotCQl0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9ucyh0aGlzLnN1YmplY3QyRGVzY3JpcHRpb25zKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0MURlc2NyaXB0aW9ucygpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MSBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBzdWJqZWN0Mk5hbWVzKCkgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJiYXoiKTsKLQkJcmVzdWx0LmFkZCgiYmFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3ViamVjdDJEZXNjcmlwdGlvbnMoKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24xIik7Ci0JCXJlc3VsdC5hZGQoInRoaXMuc3ViamVjdDIgZGVzY3JpcHRpb24yIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyIGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKHN1YmplY3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIEFERCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlDb2xsZWN0aW9uQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlLCBSRU1PVkUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUsIENMRUFSKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSwgQ0hBTkdFKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoQ29sbGVjdGlvbkV2ZW50IGUsIFN0cmluZyBldmVudFR5cGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBldmVudFR5cGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmV2ZW50MVR5cGUgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5ldmVudDFUeXBlLCBDSEFOR0UpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5ldmVudDEuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKCJqYW0iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYW0iLCAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNQbHVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzUGx1cy5hZGQoImphbSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuYWExLmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oImpheiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXoiLCAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc1BsdXMuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1cywgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmFhMS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5yZW1vdmVOYW1lKCJmb28iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIFJFTU9WRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNNaW51cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc01pbnVzLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuZXZlbnQxVHlwZSA9IG51bGw7Ci0JCXRoaXMuYWExLnJlbW92ZUFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oImJhciIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV2ZW50MVR5cGUsIFJFTU9WRSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKENvbGxlY3Rpb25SZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc01pbnVzLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuYWExLml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGRUd29OYW1lcygiamFtIiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZXZlbnQxVHlwZSwgQ0hBTkdFKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuZXZlbnQxLmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmFtZXNQbHVzMiA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMyLmFkZCgiamFtIik7Ci0JCW5hbWVzUGx1czIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1czIsIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnN1YmplY3QxLm5hbWVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5hYTEuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5hYTEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTikpOwotCQl0aGlzLmFhMS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCXRoaXMuYWExLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQkKLQlwcml2YXRlIGNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IG5hbWVzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19DT0xMRUNUSU9OID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gZGVzY3JpcHRpb25zOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfQ09MTEVDVElPTiA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQkJdGhpcy5kZXNjcmlwdGlvbnMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gbmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlpZiAodGhpcy5uYW1lcy5hZGQobmFtZSkpIHsKLQkJCQl0aGlzLmZpcmVJdGVtQWRkZWQoTkFNRVNfQ09MTEVDVElPTiwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoSXRlcmF0b3I8U3RyaW5nPiBuZXdOYW1lcykgewotCQkJd2hpbGUgKG5ld05hbWVzLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkTmFtZShuZXdOYW1lcy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBuZXdOYW1lcykgewotCQkJdGhpcy5hZGROYW1lcyhuZXdOYW1lcy5pdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUd29OYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJaWYgKHRoaXMubmFtZXMuYWRkKG5hbWUxKSB8IHRoaXMubmFtZXMuYWRkKG5hbWUyKSkgewotCQkJCXRoaXMuZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKE5BTUVTX0NPTExFQ1RJT04sIHRoaXMubmFtZXMpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCWlmICh0aGlzLm5hbWVzLnJlbW92ZShuYW1lKSkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKE5BTUVTX0NPTExFQ1RJT04sIG5hbWUpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGRlc2NyaXB0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxTdHJpbmc+KHRoaXMuZGVzY3JpcHRpb25zKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCWlmICh0aGlzLmRlc2NyaXB0aW9ucy5hZGQoZGVzY3JpcHRpb24pKSB7Ci0JCQkJdGhpcy5maXJlSXRlbUFkZGVkKERFU0NSSVBUSU9OU19DT0xMRUNUSU9OLCBkZXNjcmlwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKEl0ZXJhdG9yPFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl3aGlsZSAobmV3RGVzY3JpcHRpb25zLmhhc05leHQoKSkgewotCQkJCXRoaXMuYWRkRGVzY3JpcHRpb24obmV3RGVzY3JpcHRpb25zLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKENvbGxlY3Rpb248U3RyaW5nPiBuZXdEZXNjcmlwdGlvbnMpIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb25zKG5ld0Rlc2NyaXB0aW9ucy5pdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCWlmICh0aGlzLmRlc2NyaXB0aW9ucy5yZW1vdmUoZGVzY3JpcHRpb24pKSB7Ci0JCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoREVTQ1JJUFRJT05TX0NPTExFQ1RJT04sIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vIHRoaXMgaXMgbm90IGEgdHlwaWNhbCBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCXByaXZhdGUgY2xhc3MgTG9jYWxDb2xsZWN0aW9uQXNwZWN0QWRhcHRlciBleHRlbmRzIENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IHsKLQotCQlMb2NhbENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRVNfQ09MTEVDVElPTik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JfKCkgewotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzKCk7Ci0JCQl9Ci0JCQlpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0NPTExFQ1RJT04pIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmRlc2NyaXB0aW9ucygpOwotCQkJfQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZChTdHJpbmcgaXRlbSkgewotCQkJaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0NPTExFQ1RJT04pIHsKLQkJCQl0aGlzLnN1YmplY3QuYWRkTmFtZShpdGVtKTsKLQkJCX0gZWxzZSBpZiAodGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuREVTQ1JJUFRJT05TX0NPTExFQ1RJT04pIHsKLQkJCQl0aGlzLnN1YmplY3QuYWRkRGVzY3JpcHRpb24oaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoT2JqZWN0IGl0ZW0pIHsKLQkJCWlmICh0aGlzLmNvbGxlY3Rpb25OYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnJlbW92ZU5hbWUoKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMuY29sbGVjdGlvbk5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19DT0xMRUNUSU9OKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnJlbW92ZURlc2NyaXB0aW9uKChTdHJpbmcpIGl0ZW0pOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5jb2xsZWN0aW9uTmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMucmVtb3ZlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwYTE1NC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb247Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb24gPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IHRoaXMuYWRhcHRlckNvbGxlY3Rpb24oKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gdGhpcy5hZGFwdGVyQ29sbGVjdGlvbigpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oc3luY2hMaXN0Lml0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSB0aGlzLmFkYXB0ZXJDb2xsZWN0aW9uKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJSGFzaEJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJYmFnLmFkZCgiZm9vIik7Ci0JCWJhZy5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhiYWcpOwotCQlhc3NlcnRFcXVhbHMoMiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCUpMaXN0IGpMaXN0ID0gbmV3IEpMaXN0KG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuYWRhcHRlcikpOwotCQkKLQkJSGFzaEJhZzxTdHJpbmc+IGJhZyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMoYmFnKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQotCWNsYXNzIFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU5YzEyNi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQotCXB1YmxpYyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgTG9jYWxBZGFwdGVyKHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIsICI2NjYiKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFkYXB0ZXIuZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIxMTEiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjIyMiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoIjY2NiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuY2xlYXIoKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJvb2xlYW5WYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCkuY29udGFpbnMoIjY2NiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXZlbnRGaXJpbmcoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjExMSIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCIyMjIiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCI2NjYiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0cnVlLCBmYWxzZSk7Ci0KLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoIjY2NiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHJ1ZSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi52YWx1ZU9mKG9sZFZhbHVlKSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX07Ci0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiNjY2Iik7Ci0JCWFzc2VydFRydWUodGhpcy5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLmNvbnRhaW5zKCI2NjYiKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCi0JCXRoaXMuYWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKS5jb250YWlucygiNjY2IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogdGhlIHZhbHVlIGlzIHRydWUgaWYgdGhlIHdyYXBwZWQgY29sbGVjdGlvbiBjb250YWlucyB0aGUgc3BlY2lmaWVkIGl0ZW0sCi0JICogb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyBmYWxzZQotCSAqLwotCXN0YXRpYyBjbGFzcyBMb2NhbEFkYXB0ZXIKLQkJZXh0ZW5kcyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Ci0JewotCQlwcml2YXRlIFN0cmluZyBpdGVtOwotCi0JCUxvY2FsQWRhcHRlcihDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIsIFN0cmluZyBpdGVtKSB7Ci0JCQlzdXBlcihjb2xsZWN0aW9uSG9sZGVyKTsKLQkJCXRoaXMuaXRlbSA9IGl0ZW07Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25Qcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkJLyoqCi0JCSAqIGFsd2F5cyByZXR1cm4gYSBCb29sZWFuCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCQlCb29sZWFuIHJlc3VsdCA9IHN1cGVyLmdldFZhbHVlKCk7Ci0JCQlyZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOiByZXN1bHQ7Ci0JCX0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCWlmICh0aGlzLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKCAhIHRoaXMuYm9vbGVhblZhbHVlT2YodmFsdWUpKSB7Ci0JCQkJCS8vIHRoZSB2YWx1ZSBpcyBjaGFuZ2luZyBmcm9tIHRydWUgdG8gZmFsc2UKLQkJCQkJKChTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KSB0aGlzLmNvbGxlY3Rpb25Nb2RlbCkucmVtb3ZlKHRoaXMuaXRlbSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAodGhpcy5ib29sZWFuVmFsdWVPZih2YWx1ZSkpIHsKLQkJCQkJLy8gdGhlIHZhbHVlIGlzIGNoYW5naW5nIGZyb20gZmFsc2UgdG8gdHJ1ZQotCQkJCQkoKFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuY29sbGVjdGlvbk1vZGVsKS5hZGQodGhpcy5pdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNvbGxlY3Rpb25Nb2RlbC5pdGVyYXRvcigpLCB0aGlzLml0ZW0pKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0JCXByaXZhdGUgYm9vbGVhbiBib29sZWFuVmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ib29sZWFuVmFsdWVPZih0aGlzLnZhbHVlKTsKLQkJfQotCQlwcml2YXRlIGJvb2xlYW4gYm9vbGVhblZhbHVlT2YoT2JqZWN0IGIpIHsKLQkJCXJldHVybiAoYiA9PSBudWxsKSA/IGZhbHNlIDogKChCb29sZWFuKSBiKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQm9vbGVhblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDRiYjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0NvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBwdm0xOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gcHZtMjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bTM7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBwdm00OwotCXByaXZhdGUgQ29sbGVjdGlvbjxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gY29sbGVjdGlvbjsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PiBjdm07Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gY29tcG9zaXRlUFZNOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQotCXB1YmxpYyBDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wdm0xID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLnB2bTIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSk7Ci0JCXRoaXMucHZtMyA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5wdm00ID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PigpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMSk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0yKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTMpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtNCk7Ci0JCXRoaXMuY3ZtID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+Pih0aGlzLmNvbGxlY3Rpb24pOwotCQkKLQkJdGhpcy5jb21wb3NpdGVQVk0gPSB0aGlzLmJ1aWxkQ29tcG9zaXRlUFZNKGN2bSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb21wb3NpdGVQVk0oQ29sbGVjdGlvblZhbHVlTW9kZWw8V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4+IHB2bXMpIHsKLQkJcmV0dXJuIENvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWwuYW5kKHB2bXMpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWVBbmRMaXN0ZW5lcnMxKCkgewotCQlhc3NlcnROdWxsKHRoaXMuY29tcG9zaXRlUFZNLmdldFZhbHVlKCkpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlQW5kTGlzdGVuZXJzMigpIHsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0xLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0yLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOyAgLy8gbm8gY2hhbmdlCi0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOyAgLy8gbm8gY2hhbmdlCi0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMucHZtMS5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGZhbHNlLCB0cnVlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm00LnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHB2bSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSk7Ci0JCXRoaXMuY3ZtLmFkZChwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRydWUsIGZhbHNlKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0ucmVtb3ZlKHB2bSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoZmFsc2UsIHRydWUpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5jbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEJvb2xlYW4uVFJVRSwgbnVsbCk7Ci0KLQkJQ29sbGVjdGlvbjxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPj4gYzIgPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+PigpOwotCQljMi5hZGQodGhpcy5wdm0xKTsKLQkJYzIuYWRkKHRoaXMucHZtMik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmN2bS5zZXRWYWx1ZXMoYzIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIEJvb2xlYW4uVFJVRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcxKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9CQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcyKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0JCi0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNvbXBvc2l0ZUJvb2xlYW5Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoYm9vbGVhbiBvbGRWYWx1ZSwgYm9vbGVhbiBuZXdWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KEJvb2xlYW4udmFsdWVPZihvbGRWYWx1ZSksIEJvb2xlYW4udmFsdWVPZihuZXdWYWx1ZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChCb29sZWFuIG9sZFZhbHVlLCBCb29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNvbXBvc2l0ZVBWTSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjBjNzQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTmVpZ2hib3Job29kIG5laWdoYm9yaG9vZDsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gbmVpZ2hib3Job29kSG9sZGVyOwotCi0JcHVibGljIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5uZWlnaGJvcmhvb2QgPSBuZXcgTmVpZ2hib3Job29kKCJIYW5uYS1CYXJiZXJhIik7Ci0JCXRoaXMubmVpZ2hib3Job29kSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+KHRoaXMubmVpZ2hib3Job29kKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNoMSgpIHsKLQkJdGhpcy52ZXJpZnlTeW5jaCh0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jaDIoKSB7Ci0JCXRoaXMudmVyaWZ5U3luY2godGhpcy5idWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVN5bmNoKENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1lbWJlcj4gY29tcG9zaXRlQ1ZNKSB7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCQlCYWc8RmFtaWx5PiBmYW1pbGllc1N5bmNoID0gbmV3IENvb3JkaW5hdGVkQmFnPEZhbWlseT4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcih0aGlzLm5laWdoYm9yaG9vZEhvbGRlcikpOwotCQlCYWc8TWVtYmVyPiBtZW1iZXJzU3luY2ggPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQotCQlGYW1pbHkgamV0c29ucyA9IHRoaXMubmVpZ2hib3Job29kLmZhbWlseU5hbWVkKCJKZXRzb24iKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5yZW1vdmVNZW1iZXIoamV0c29ucy5tZW1iZXJOYW1lZCgiQXN0cm8iKSk7Ci0JCWFzc2VydEVxdWFscygzLCBmYW1pbGllc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlqZXRzb25zLnJlbW92ZU1lbWJlcihqZXRzb25zLm1lbWJlck5hbWVkKCJKdWR5IikpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0KLQkJamV0c29ucy5hZGRNZW1iZXIoIkZpZG8iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLm5laWdoYm9yaG9vZC5hbGxNZW1iZXJzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCXRoaXMubmVpZ2hib3Job29kLnJlbW92ZUZhbWlseShqZXRzb25zKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZhbWlsaWVzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoNywgbWVtYmVyc1N5bmNoLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMubmVpZ2hib3Job29kLmFsbE1lbWJlcnMoKSksIG1lbWJlcnNTeW5jaCk7Ci0JCWFzc2VydEVxdWFscyhtZW1iZXJzU3luY2gsIENvbGxlY3Rpb25Ub29scy5iYWcoY29tcG9zaXRlQ1ZNLml0ZXJhdG9yKCkpKTsKLQotCQlGYW1pbHkgYmVhcnMgPSB0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkoIkJlYXIiKTsKLQkJCWJlYXJzLmFkZE1lbWJlcigiWW9naSIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOCwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg4LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCWJlYXJzLmFkZE1lbWJlcigiQm9vLUJvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoOSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSk7Ci0JCWFzc2VydEVxdWFscyg5LCBtZW1iZXJzU3luY2guc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5uZWlnaGJvcmhvb2QuYWxsTWVtYmVycygpKSwgbWVtYmVyc1N5bmNoKTsKLQkJYXNzZXJ0RXF1YWxzKG1lbWJlcnNTeW5jaCwgQ29sbGVjdGlvblRvb2xzLmJhZyhjb21wb3NpdGVDVk0uaXRlcmF0b3IoKSkpOwotCi0JCU5laWdoYm9yaG9vZCBuMiA9IG5ldyBOZWlnaGJvcmhvb2QoIkhhbm5hLUJhcmJlcmEgMiIpOwotCQl0aGlzLm5laWdoYm9yaG9vZEhvbGRlci5zZXRWYWx1ZShuMik7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QobjIpOwotCQlhc3NlcnRFcXVhbHMoMywgZmFtaWxpZXNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIENvbGxlY3Rpb25Ub29scy5zaXplKG4yLmFsbE1lbWJlcnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMTIsIG1lbWJlcnNTeW5jaC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhuMi5hbGxNZW1iZXJzKCkpLCBtZW1iZXJzU3luY2gpOwotCQlhc3NlcnRFcXVhbHMobWVtYmVyc1N5bmNoLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGNvbXBvc2l0ZUNWTS5pdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vVHJhbnNmb3JtZXIoKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMSA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc3ViQ1ZNMiA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCUNvbGxlY3Rpb248Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4gY29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJY29sbGVjdGlvbi5hZGQoc3ViQ1ZNMSk7Ci0JCWNvbGxlY3Rpb24uYWRkKHN1YkNWTTIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KGNvbGxlY3Rpb24pKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgc3luY2hCYWcuc2l6ZSgpKTsKLQotCQlzdWJDVk0xLmFkZCgiZm9vIik7Ci0JCXN1YkNWTTEuYWRkKCJiYXIiKTsKLQkJc3ViQ1ZNMS5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgc3luY2hCYWcuc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzeW5jaEJhZy5jb250YWlucygiZm9vIikpOwotCi0JCXN1YkNWTTIuYWRkKCJqb28iKTsKLQkJc3ViQ1ZNMi5hZGQoImphciIpOwotCQlzdWJDVk0yLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRUcnVlKHN5bmNoQmFnLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydFRydWUoc3luY2hCYWcuY29udGFpbnMoImpheiIpKTsKLQotCQlzdWJDVk0xLnJlbW92ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaEJhZy5zaXplKCkpOwotCQlhc3NlcnRGYWxzZShzeW5jaEJhZy5jb250YWlucygiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVJdGVtKCkgewotCQlCYWc8TWVtYmVyPiBzeW5jaEJhZyA9IG5ldyBDb29yZGluYXRlZEJhZzxNZW1iZXI+KHRoaXMuYnVpbGRBbGxNZW1iZXJzQ29tcG9zaXRlKHRoaXMubmVpZ2hib3Job29kSG9sZGVyKSk7Ci0JCXRoaXMucG9wdWxhdGVOZWlnaGJvcmhvb2QodGhpcy5uZWlnaGJvcmhvb2QpOwotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQl0aGlzLm5laWdoYm9yaG9vZC5hZGRGYW1pbHkodGhpcy5uZWlnaGJvcmhvb2QuZmFtaWx5TmFtZWQoIkpldHNvbiIpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7Ci0JCQlpZiAoZXguZ2V0TWVzc2FnZSgpLmluZGV4T2YoImR1cGxpY2F0ZSBjb21wb25lbnQiKSAhPSAtMSkgewotCQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJYXNzZXJ0RXF1YWxzKDEyLCBzeW5jaEJhZy5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBjb21wb3NpdGVDVk0gPSB0aGlzLmJ1aWxkQWxsTWVtYmVyc0NvbXBvc2l0ZSh0aGlzLm5laWdoYm9yaG9vZEhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkQmFnPE1lbWJlcj4gc3luY2hCYWcgPSBuZXcgQ29vcmRpbmF0ZWRCYWc8TWVtYmVyPihjb21wb3NpdGVDVk0pOwotCQl0aGlzLnBvcHVsYXRlTmVpZ2hib3Job29kKHRoaXMubmVpZ2hib3Job29kKTsKLQkJRmFtaWx5IGpldHNvbnMgPSB0aGlzLm5laWdoYm9yaG9vZC5mYW1pbHlOYW1lZCgiSmV0c29uIik7Ci0KLQkJYXNzZXJ0VHJ1ZShjb21wb3NpdGVDVk0uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydEZhbHNlKGNvbXBvc2l0ZUNWTS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRGYWxzZShqZXRzb25zLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTikpOwotCi0JCWNvbXBvc2l0ZUNWTS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaEJhZyk7Ci0JCWFzc2VydFRydWUoY29tcG9zaXRlQ1ZNLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUoamV0c29ucy5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEZhbWlseS5NRU1CRVJTX0NPTExFQ1RJT04pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVOZWlnaGJvcmhvb2QoTmVpZ2hib3Job29kIG4pIHsKLQkJRmFtaWx5IGZhbWlseTEgPSBuLmFkZEZhbWlseSgiRmxpbnRzdG9uZSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIkZyZWQiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJXaWxtYSIpOwotCQkJZmFtaWx5MS5hZGRNZW1iZXIoIlBlYmJsZXMiKTsKLQkJCWZhbWlseTEuYWRkTWVtYmVyKCJEaW5vIik7Ci0JCUZhbWlseSBmYW1pbHkyID0gbi5hZGRGYW1pbHkoIlJ1YmJsZSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJhcm5leSIpOwotCQkJZmFtaWx5Mi5hZGRNZW1iZXIoIkJldHR5Iik7Ci0JCQlmYW1pbHkyLmFkZE1lbWJlcigiQmFtbS1CYW1tIik7Ci0JCUZhbWlseSBmYW1pbHkzID0gbi5hZGRGYW1pbHkoIkpldHNvbiIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkdlb3JnZSIpOwotCQkJZmFtaWx5My5hZGRNZW1iZXIoIkphbmUiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJKdWR5Iik7Ci0JCQlmYW1pbHkzLmFkZE1lbWJlcigiRWxyb3kiKTsKLQkJCWZhbWlseTMuYWRkTWVtYmVyKCJBc3RybyIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8RmFtaWx5PiBidWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8TmVpZ2hib3Job29kPiBjb21tdW5lSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8TmVpZ2hib3Job29kLCBGYW1pbHk+KGNvbW11bmVIb2xkZXIsIE5laWdoYm9yaG9vZC5GQU1JTElFU19DT0xMRUNUSU9OKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxGYW1pbHk+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmZhbWlsaWVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZE1lbWJlcnNBZGFwdGVyKEZhbWlseSBmYW1pbHkpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxGYW1pbHksIE1lbWJlcj4oRmFtaWx5Lk1FTUJFUlNfQ09MTEVDVElPTiwgZmFtaWx5KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IGl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm1lbWJlcnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEZhbWlseSwgTWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPE5laWdoYm9yaG9vZD4gY29tbXVuZUhvbGRlcikgewotCQkvLyBvdmVycmlkZSAjdHJhbnNmb3JtKE9iamVjdCkKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiBidWlsZEFsbE1lbWJlcnNDb21wb3NpdGUyKFByb3BlcnR5VmFsdWVNb2RlbDxOZWlnaGJvcmhvb2Q+IGNvbW11bmVIb2xkZXIpIHsKLQkJLy8gYnVpbGQgYSBjdXN0b20gVHJhbnNmb3JtZXIKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxGYW1pbHksIE1lbWJlcj4odGhpcy5idWlsZEZhbWlsaWVzQXNwZWN0QWRhcHRlcihjb21tdW5lSG9sZGVyKSwgdGhpcy5idWlsZFRyYW5zZm9ybWVyKCkpOwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8RmFtaWx5LCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxNZW1iZXI+PiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEZhbWlseSwgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPj4oKSB7Ci0JCQlwdWJsaWMgQ29sbGVjdGlvblZhbHVlTW9kZWw8TWVtYmVyPiB0cmFuc2Zvcm0oRmFtaWx5IGZhbWlseSkgewotCQkJCXJldHVybiBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYnVpbGRNZW1iZXJzQWRhcHRlcihmYW1pbHkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiTG9jYWwgVHJhbnNmb3JtZXIiOwotCQkJfQotCQl9OwotCX0KLQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTmVpZ2hib3Job29kIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCQlwcml2YXRlIENvbGxlY3Rpb248RmFtaWx5PiBmYW1pbGllcyA9IG5ldyBBcnJheUxpc3Q8RmFtaWx5PigpOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFNSUxJRVNfQ09MTEVDVElPTiA9ICJmYW1pbGllcyI7Ci0JCi0JCXB1YmxpYyBOZWlnaGJvcmhvb2QoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPEZhbWlseT4gZmFtaWxpZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mYW1pbGllcy5pdGVyYXRvcigpOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KFN0cmluZyBmYW1pbHlOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRGYW1pbHkobmV3IEZhbWlseShmYW1pbHlOYW1lKSk7Ci0JCX0KLQotCQkvLyBiYWNrZG9vciB0byBhbGxvdyBkdXBsaWNhdGVzCi0JCXB1YmxpYyBGYW1pbHkgYWRkRmFtaWx5KEZhbWlseSBmYW1pbHkpIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIGZhbWlseTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUZhbWlseShGYW1pbHkgZmFtaWx5KSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihmYW1pbHksIHRoaXMuZmFtaWxpZXMsIEZBTUlMSUVTX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyBGYW1pbHkgZmFtaWx5TmFtZWQoU3RyaW5nIGZhbWlseU5hbWUpIHsKLQkJCWZvciAoRmFtaWx5IGZhbWlseSA6IHRoaXMuZmFtaWxpZXMpIHsKLQkJCQlpZiAoZmFtaWx5LmdldE5hbWUoKS5lcXVhbHMoZmFtaWx5TmFtZSkpIHsKLQkJCQkJcmV0dXJuIGZhbWlseTsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZhbWlseU5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBJdGVyYXRvcjxNZW1iZXI+IGFsbE1lbWJlcnMoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPE1lbWJlcj4odGhpcy5tZW1iZXJzSXRlcmF0b3JzKCkpOwotCQl9Ci0JCi0JCXByaXZhdGUgSXRlcmF0b3I8SXRlcmF0b3I8TWVtYmVyPj4gbWVtYmVyc0l0ZXJhdG9ycygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxGYW1pbHksIEl0ZXJhdG9yPE1lbWJlcj4+KHRoaXMuZmFtaWxpZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxNZW1iZXI+IHRyYW5zZm9ybShGYW1pbHkgZmFtaWx5KSB7Ci0JCQkJCXJldHVybiBmYW1pbHkubWVtYmVycygpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIE1lbWJlciBtZW1iZXJOYW1lZChTdHJpbmcgZmFtaWx5TmFtZSwgU3RyaW5nIG1lbWJlck5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmZhbWlseU5hbWVkKGZhbWlseU5hbWUpLm1lbWJlck5hbWVkKG1lbWJlck5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBpbm5lciBjbGFzcwotCSAqLwotCXB1YmxpYyBjbGFzcyBGYW1pbHkgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxNZW1iZXI+IG1lbWJlcnMgPSBuZXcgQXJyYXlMaXN0PE1lbWJlcj4oKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FTUJFUlNfQ09MTEVDVElPTiA9ICJtZW1iZXJzIjsKLQkKLQkJcHVibGljIEZhbWlseShTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJT2JqZWN0IG9sZCA9IHRoaXMubmFtZTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8TWVtYmVyPiBtZW1iZXJzKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVycy5pdGVyYXRvcigpOwotCQl9Ci0JCi0JCXB1YmxpYyBNZW1iZXIgYWRkTWVtYmVyKFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlNZW1iZXIgbWVtYmVyID0gbmV3IE1lbWJlcihtZW1iZXJOYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihtZW1iZXIsIHRoaXMubWVtYmVycywgTUVNQkVSU19DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBtZW1iZXI7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZU1lbWJlcihNZW1iZXIgbWVtYmVyKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihtZW1iZXIsIHRoaXMubWVtYmVycywgTUVNQkVSU19DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgTWVtYmVyIG1lbWJlck5hbWVkKFN0cmluZyBtZW1iZXJOYW1lKSB7Ci0JCQlmb3IgKE1lbWJlciBtZW1iZXIgOiB0aGlzLm1lbWJlcnMpIHsKLQkJCQlpZiAobWVtYmVyLmdldE5hbWUoKS5lcXVhbHMobWVtYmVyTmFtZSkpIHsKLQkJCQkJcmV0dXJuIG1lbWJlcjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lbWJlck5hbWUpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCQotCX0KLQotCi0JLyoqCi0JICogaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgY2xhc3MgTWVtYmVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBNZW1iZXIoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNmNTMxLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0wOwotCXByaXZhdGUgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTE7Ci0JcHJpdmF0ZSBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtMjsKLQlwcml2YXRlIExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0zOwotCXByaXZhdGUgTG9jYWxMaXN0VmFsdWVNb2RlbDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IHViZXJMVk07Ci0JcHJpdmF0ZSBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4gY29tcG9zaXRlTFZNOwotCi0JcHVibGljIENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0aGlzLmx2bTAgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMC5hZGQoImFhYSIpOwotCQl0aGlzLmx2bTAuYWRkKCJiYmIiKTsKLQkJdGhpcy5sdm0wLmFkZCgiY2NjIik7Ci0KLQkJdGhpcy5sdm0xID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTEuYWRkKCJkZGQiKTsKLQkJdGhpcy5sdm0xLmFkZCgiZWVlIik7Ci0KLQkJdGhpcy5sdm0yID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmx2bTIuYWRkKCJmZmYiKTsKLQotCQl0aGlzLmx2bTMgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMubHZtMy5hZGQoImdnZyIpOwotCQl0aGlzLmx2bTMuYWRkKCJoaGgiKTsKLQkJdGhpcy5sdm0zLmFkZCgiaWlpIik7Ci0JCXRoaXMubHZtMy5hZGQoImpqaiIpOwotCQl0aGlzLmx2bTMuYWRkKCJra2siKTsKLQotCQl0aGlzLnViZXJMVk0gPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0wKTsKLQkJdGhpcy51YmVyTFZNLmFkZCh0aGlzLmx2bTEpOwotCQl0aGlzLnViZXJMVk0uYWRkKHRoaXMubHZtMik7Ci0JCXRoaXMudWJlckxWTS5hZGQodGhpcy5sdm0zKTsKLQotCQl0aGlzLmNvbXBvc2l0ZUxWTSA9IG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oKExpc3RWYWx1ZU1vZGVsPExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4pIHRoaXMudWJlckxWTSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYWEiLCBjb29yZExpc3QuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYmIiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImJiYiIsIGNvb3JkTGlzdC5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImNjYyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgyKSk7Ci0JCWFzc2VydEVxdWFscygiY2NjIiwgY29vcmRMaXN0LmdldCgyKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIGNvb3JkTGlzdC5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg0KSk7Ci0JCWFzc2VydEVxdWFscygiZWVlIiwgY29vcmRMaXN0LmdldCg0KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCi0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0JCWFzc2VydEVxdWFscygiYWFhIiwgdGhpcy5jb21wb3NpdGVMVk0uaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFhYSIsIGNvb3JkTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMSA9IGNvb3JkTGlzdC5pdGVyYXRvcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtMiA9IHRoaXMuY29tcG9zaXRlTFZNLml0ZXJhdG9yKCk7IHN0cmVhbTIuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JCWFzc2VydEZhbHNlKHN0cmVhbTEuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQkJYXNzZXJ0RXF1YWxzKDExLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTEsIGNvb3JkTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5KCkgewotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCWFzc2VydFRydWUodGhpcy5jb21wb3NpdGVMVk0uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubHZtMC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVMVk0ucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBjb29yZExpc3QpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbXBvc2l0ZUxWTS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubHZtMC5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBjb29yZExpc3QpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29tcG9zaXRlTFZNLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmx2bTAuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VfQmVnaW4oKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtLmFkZCgieHh4Iik7Ci0JCWx2bS5hZGQoInl5eSIpOwotCQlsdm0uYWRkKCJ6enoiKTsKLQkJdGhpcy51YmVyTFZNLmFkZCgwLCBsdm0pOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJ5eXkiLCAienp6IiwgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTb3VyY2VfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0gPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bS5hZGQoInh4eCIpOwotCQlsdm0uYWRkKCJ5eXkiKTsKLQkJbHZtLmFkZCgienp6Iik7Ci0JCXRoaXMudWJlckxWTS5hZGQoMiwgbHZtKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgInh4eCIsICJ5eXkiLCAienp6IiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU291cmNlX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm0uYWRkKCJ4eHgiKTsKLQkJbHZtLmFkZCgieXl5Iik7Ci0JCWx2bS5hZGQoInp6eiIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiLCAieXl5IiwgInp6eiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNvdXJjZXMoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bUEgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bUEuYWRkKCJ4eHgiKTsKLQkJbHZtQS5hZGQoInl5eSIpOwotCQlsdm1BLmFkZCgienp6Iik7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm1CID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1CLmFkZCgicHBwIik7Ci0JCWx2bUIuYWRkKCJxcXEiKTsKLQkJbHZtQi5hZGQoInJyciIpOwotCQlDb2xsZWN0aW9uPExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gYyA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQljLmFkZChsdm1BKTsKLQkJYy5hZGQobHZtQik7Ci0JCXRoaXMudWJlckxWTS5hZGRBbGwoMiwgYyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJwcHAiLCAicXFxIiwgInJyciIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxMikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMTIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU291cmNlX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5yZW1vdmUoMCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNvdXJjZV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLnJlbW92ZSgyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5yZW1vdmUoMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTb3VyY2VzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5yZW1vdmUoMiwgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImVlZSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg0KSk7Ci0JCWFzc2VydEVxdWFscygiZWVlIiwgY29vcmRMaXN0LmdldCg0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VTb3VyY2VzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm1BID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm1BLmFkZCgieHh4Iik7Ci0JCWx2bUEuYWRkKCJ5eXkiKTsKLQkJbHZtQS5hZGQoInp6eiIpOwotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtQiA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtQi5hZGQoInBwcCIpOwotCQlsdm1CLmFkZCgicXFxIik7Ci0JCWx2bUIuYWRkKCJycnIiKTsKLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJbGlzdC5hZGQobHZtQSk7Ci0JCWxpc3QuYWRkKGx2bUIpOwotCQl0aGlzLnViZXJMVk0uc2V0KDIsIGxpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgInl5eSIsICJ6enoiLCAicHBwIiwgInFxcSIsICJycnIiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxcXEiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoInFxcSIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0ubW92ZSgwLCAyLCAyKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNvdXJjZXNfTWlkZGxlKCkgewotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCXRoaXMudWJlckxWTS5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5tb3ZlKDEsIDMsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAibGxsIiwgIm1tbSIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJubm4iLCAib29vIiwgInBwcCIsICJxcXEiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU291cmNlc19FbmQoKSB7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm00KTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMywgMCwgMyk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCgwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTb3VyY2UoKSB7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJdGhpcy51YmVyTFZNLmFkZChsdm00KTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQl0aGlzLnViZXJMVk0uYWRkKGx2bTUpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLm1vdmUoMywgMSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siLCAiZGRkIiwgImVlZSIsICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgxNCkpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIGNvb3JkTGlzdC5nZXQoMTQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJTb3VyY2VzKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5jbGVhcigpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFswXTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzMSgpIHsKLQkJTGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oKTsKLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQluZXdMaXN0LmFkZChsdm00KTsKLQotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNSA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNS5hZGQoIm5ubiIpOwotCQlsdm01LmFkZCgib29vIik7Ci0JCWx2bTUuYWRkKCJwcHAiKTsKLQkJbHZtNS5hZGQoInFxcSIpOwotCQluZXdMaXN0LmFkZChsdm01KTsKLQotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMudWJlckxWTS5zZXRMaXN0VmFsdWVzKG5ld0xpc3QpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImxsbCIsICJtbW0iLCAibm5uIiwgIm9vbyIsICJwcHAiLCAicXFxIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvb28iLCBjb29yZExpc3QuZ2V0KDMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlU291cmNlczIoKSB7Ci0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm00ID0gbmV3IExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQlsdm00LmFkZCgibGxsIik7Ci0JCWx2bTQuYWRkKCJtbW0iKTsKLQkJbmV3TGlzdC5hZGQobHZtNCk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTUgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTUuYWRkKCJubm4iKTsKLQkJbHZtNS5hZGQoIm9vbyIpOwotCQlsdm01LmFkZCgicHBwIik7Ci0JCWx2bTUuYWRkKCJxcXEiKTsKLQkJbmV3TGlzdC5hZGQobHZtNSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2hhbmdlTGlzdFZhbHVlcyhuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJsbGwiLCAibW1tIiwgIm5ubiIsICJvb28iLCAicHBwIiwgInFxcSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoIm9vbyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygib29vIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXMzKCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpOwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTApOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTEpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTIpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTMpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNoYW5nZUxpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCgzKSk7Ci0JCWFzc2VydEVxdWFscygiZGRkIiwgY29vcmRMaXN0LmdldCgzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVNvdXJjZXM0KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTApOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTEpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTIpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTMpOwotCQlMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbHZtNCA9IG5ldyBMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJbHZtNC5hZGQoImxsbCIpOwotCQlsdm00LmFkZCgibW1tIik7Ci0JCW5ld0xpc3QuYWRkKGx2bTQpOwotCi0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLnViZXJMVk0uY2hhbmdlTGlzdFZhbHVlcyhuZXdMaXN0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgImxsbCIsICJtbW0iIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzNSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQotCQlMaXN0PExvY2FsTGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PigpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTApOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTEpOwotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTIpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNoYW5nZUxpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VTb3VyY2VzNigpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCi0JCUxpc3Q8TG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxMb2NhbExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMCk7Ci0JCW5ld0xpc3QuYWRkKHRoaXMubHZtMSk7Ci0KLQkJTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bTQgPSBuZXcgTG9jYWxMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCWx2bTQuYWRkKCJsbGwiKTsKLQkJbHZtNC5hZGQoIm1tbSIpOwotCQluZXdMaXN0LmFkZChsdm00KTsKLQotCQluZXdMaXN0LmFkZCh0aGlzLmx2bTMpOwotCi0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy51YmVyTFZNLmNoYW5nZUxpc3RWYWx1ZXMobmV3TGlzdCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJsbGwiLCAibW1tIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJkZGQiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImRkZCIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5hZGQoMCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgInh4eCIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0yLmFkZCgxLCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAieHh4IiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuYWRkKDUsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgInh4eCIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5hZGRBbGwoMCwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIsICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMi5hZGRBbGwoMSwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5hZGRBbGwoNSwgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgInh4eCIsICJ5eXkiLCAienp6IiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAucmVtb3ZlKDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMi5yZW1vdmUoMCk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnJlbW92ZSg0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAucmVtb3ZlKDAsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnJlbW92ZSgxLCAzKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygia2trIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJra2siLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5yZW1vdmUoMywgMik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbV9CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuc2V0KDAsICJ4eHgiKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJ4eHgiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDYpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZUl0ZW1fTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMi5zZXQoMCwgInh4eCIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSXRlbV9FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnNldCg0LCAieHh4Iik7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgInh4eCIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtc19CZWdpbigpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuc2V0KDAsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtc19NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnNldCgxLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiwgInp6eiIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJra2siLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMTApKTsKLQkJYXNzZXJ0RXF1YWxzKCJra2siLCBjb29yZExpc3QuZ2V0KDEwKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtc19FbmQoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnNldCgzLCBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJ4eHgiLCAieXl5IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAieHh4IiwgInl5eSIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5tb3ZlKDIsIDApOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImJiYiIsICJjY2MiLCAiYWFhIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbV9NaWRkbGUoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLm1vdmUoMCwgMSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZWVlIiwgImRkZCIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVJdGVtX0VuZCgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMubW92ZSgwLCA0KTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJra2siLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5tb3ZlKDEsIDAsIDIpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImNjYyIsICJhYWEiLCAiYmJiIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbXNfTWlkZGxlKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5hZGQoImVlZS4xIik7Ci0JCXRoaXMubHZtMS5hZGQoImVlZS4yIik7Ci0JCXRoaXMubHZtMS5hZGQoImVlZS4zIik7Ci0JCXRoaXMubHZtMS5tb3ZlKDEsIDIsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUuMSIsICJlZWUuMiIsICJlZWUuMyIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5tb3ZlKDAsIDIsIDMpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImlpaSIsICJqamoiLCAia2trIiwgImdnZyIsICJoaGgiIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoOSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoOSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckl0ZW1zX0JlZ2luKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5jbGVhcigpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoMykpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoMykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhckl0ZW1zX01pZGRsZSgpIHsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuY2xlYXIoKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg0KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENsZWFySXRlbXNfRW5kKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMy5jbGVhcigpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfQmVnaW4xKCkgewotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5zZXRMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgInh4eCIsICJ5eXkiLCAienp6IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAieHh4IiwgInl5eSIsICJ6enoiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX01pZGRsZTEoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLnNldExpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJ4eHgiLCAieXl5IiwgInp6eiIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDEoKSB7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLnNldExpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAieHh4IiwgInl5eSIsICJ6enoiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJ4eHgiLCAieXl5IiwgInp6eiIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luMigpIHsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgRXJyb3JMaXN0ZW5lcigpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGUyKCkgewotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBFcnJvckxpc3RlbmVyKCkpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMS5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImRkZCIsICJlZWUiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiaGhoIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJoaGgiLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfRW5kMigpIHsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgRXJyb3JMaXN0ZW5lcigpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luMygpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgeyAvKiBPSyAqLyB9Ci0JCX07Ci0JCXRoaXMuY29tcG9zaXRlTFZNLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBjb29yZExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5jb21wb3NpdGVMVk0pOwotCi0JCXRoaXMubHZtMC5jaGFuZ2VMaXN0VmFsdWVzKEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsgImFhYSIsICJiYmIiLCAieHh4IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJ4eHgiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImdnZyIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX01pZGRsZTMoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJkZGQiLCAieHh4IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgInh4eCIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImhoaCIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg3KSk7Ci0JCWFzc2VydEVxdWFscygiaGhoIiwgY29vcmRMaXN0LmdldCg3KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0VuZDMoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJnZ2ciLCAiaGhoIiwgImlpaSIsICJ4eHgiLCAia2trIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAieHh4IiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luNCgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0wLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAieHh4IiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAieHh4IiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiwgImpqaiIsICJra2siIH07Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIHRoaXMuY29tcG9zaXRlTFZNLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGNvb3JkTGlzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIHRoaXMuY29tcG9zaXRlTFZNLnRvQXJyYXkoKSkpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQsIGNvb3JkTGlzdC50b0FycmF5KCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCB0aGlzLmNvbXBvc2l0ZUxWTS5nZXQoNikpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIGNvb3JkTGlzdC5nZXQoNikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJdGVtc19NaWRkbGU0KCkgewotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXJyb3JMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTEuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJkZGQiLCAiZWVlIiwgInh4eCIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAieHh4IiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZ2dnIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZ2ciLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfRW5kNCgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0zLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIsICJ4eHgiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiYmJiIiwgImNjYyIsICJkZGQiLCAiZWVlIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiwgInh4eCIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImZmZiIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgY29vcmRMaXN0LmdldCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX0JlZ2luNSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTAuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJhYWEiIH0pKTsKLQotCQlPYmplY3RbXSBleHBlY3RlZCA9IG5ldyBPYmplY3RbXSB7ICJhYWEiLCAiZGRkIiwgImVlZSIsICJmZmYiLCAiZ2dnIiwgImhoaCIsICJpaWkiLCAiampqIiwgImtrayIgfTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgdGhpcy5jb21wb3NpdGVMVk0uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgY29vcmRMaXN0LnNpemUoKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgdGhpcy5jb21wb3NpdGVMVk0udG9BcnJheSgpKSk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZCwgY29vcmRMaXN0LnRvQXJyYXkoKSkpOwotCQlhc3NlcnRFcXVhbHMoImlpaSIsIHRoaXMuY29tcG9zaXRlTFZNLmdldCg2KSk7Ci0JCWFzc2VydEVxdWFscygiaWlpIiwgY29vcmRMaXN0LmdldCg2KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUl0ZW1zX01pZGRsZTUoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBFcnJvckxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7IC8qIE9LICovIH0KLQkJfTsKLQkJdGhpcy5jb21wb3NpdGVMVk0uYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IGNvb3JkTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmNvbXBvc2l0ZUxWTSk7Ci0KLQkJdGhpcy5sdm0xLmNoYW5nZUxpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyAiZGRkIiB9KSk7Ci0KLQkJT2JqZWN0W10gZXhwZWN0ZWQgPSBuZXcgT2JqZWN0W10geyAiYWFhIiwgImJiYiIsICJjY2MiLCAiZGRkIiwgImZmZiIsICJnZ2ciLCAiaGhoIiwgImlpaSIsICJqamoiLCAia2trIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiaWlpIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDcpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpaWkiLCBjb29yZExpc3QuZ2V0KDcpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlSXRlbXNfRW5kNSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IEVycm9yTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZXZlbnQpIHsgLyogT0sgKi8gfQotCQl9OwotCQl0aGlzLmNvbXBvc2l0ZUxWTS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gY29vcmRMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuY29tcG9zaXRlTFZNKTsKLQotCQl0aGlzLmx2bTMuY2hhbmdlTGlzdFZhbHVlcyhBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7ICJnZ2ciLCAiaGhoIiwgImlpaSIgfSkpOwotCi0JCU9iamVjdFtdIGV4cGVjdGVkID0gbmV3IE9iamVjdFtdIHsgImFhYSIsICJiYmIiLCAiY2NjIiwgImRkZCIsICJlZWUiLCAiZmZmIiwgImdnZyIsICJoaGgiLCAiaWlpIiB9OwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCB0aGlzLmNvbXBvc2l0ZUxWTS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBjb29yZExpc3Quc2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCB0aGlzLmNvbXBvc2l0ZUxWTS50b0FycmF5KCkpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGV4cGVjdGVkLCBjb29yZExpc3QudG9BcnJheSgpKSk7Ci0JCWFzc2VydEVxdWFscygiZmZmIiwgdGhpcy5jb21wb3NpdGVMVk0uZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZmYiLCBjb29yZExpc3QuZ2V0KDUpKTsKLQl9Ci0KLQljbGFzcyBFcnJvckxpc3RlbmVyIGltcGxlbWVudHMgTGlzdENoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoKTsKLQkJfQotCX0KLQotCWNsYXNzIExvY2FsTGlzdFZhbHVlTW9kZWw8RT4gZXh0ZW5kcyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxFPiB7Ci0JCUxvY2FsTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXZvaWQgY2hhbmdlTGlzdFZhbHVlcyhJdGVyYWJsZTxFPiBsaXN0VmFsdWVzKSB7Ci0JCQlpZiAobGlzdFZhbHVlcyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5saXN0LCBsaXN0VmFsdWVzKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKExJU1RfVkFMVUVTLCB0aGlzLmxpc3QpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmEyNDEzLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtMTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bTI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBwdm0zOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gcHZtNDsKLQlwcml2YXRlIENvbGxlY3Rpb248V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGNvbGxlY3Rpb247Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4gY3ZtOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGNvbXBvc2l0ZVBWTTsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0KLQlwdWJsaWMgQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wdm0xID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoMSkpOwotCQl0aGlzLnB2bTIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+KEludGVnZXIudmFsdWVPZigyKSk7Ci0JCXRoaXMucHZtMyA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDMpKTsKLQkJdGhpcy5wdm00ID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPihJbnRlZ2VyLnZhbHVlT2YoNCkpOwotCQl0aGlzLmNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+PigpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtMSk7Ci0JCXRoaXMuY29sbGVjdGlvbi5hZGQodGhpcy5wdm0yKTsKLQkJdGhpcy5jb2xsZWN0aW9uLmFkZCh0aGlzLnB2bTMpOwotCQl0aGlzLmNvbGxlY3Rpb24uYWRkKHRoaXMucHZtNCk7Ci0JCXRoaXMuY3ZtID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+Pih0aGlzLmNvbGxlY3Rpb24pOwotCQkKLQkJdGhpcy5jb21wb3NpdGVQVk0gPSB0aGlzLmJ1aWxkQ29tcG9zaXRlUFZNKGN2bSk7Ci0JfQotCi0JcHJpdmF0ZSA8VCBleHRlbmRzIFByb3BlcnR5VmFsdWVNb2RlbDw/Pj4gUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkQ29tcG9zaXRlUFZNKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFQ+IHB2bXMpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4ocHZtcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlKCkgewotCQkJCWludCBzdW0gPSAwOwotCQkJCWZvciAoUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGVhY2ggOiB0aGlzLmdldENvbGxlY3Rpb25Nb2RlbCgpKSB7Ci0JCQkJCXN1bSArPSBlYWNoLmdldFZhbHVlKCkuaW50VmFsdWUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZihzdW0pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGdldENvbGxlY3Rpb25Nb2RlbCgpIHsKLQkJCQlyZXR1cm4gKENvbGxlY3Rpb25WYWx1ZU1vZGVsPFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4pIHN1cGVyLmdldENvbGxlY3Rpb25Nb2RlbCgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUFuZExpc3RlbmVyczEoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZUFuZExpc3RlbmVyczIoKSB7Ci0JCWFzc2VydE51bGwodGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RlbmVyKCk7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxMCwgdGhpcy5jb21wb3NpdGVQVk0uZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKLQkJdGhpcy5jb21wb3NpdGVQVk0ucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmNvbXBvc2l0ZVBWTS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm0xLnNldFZhbHVlKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTAsIDE0KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wdm00LnNldFZhbHVlKEludGVnZXIudmFsdWVPZigwKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTQsIDEwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvbkNoYW5nZTEoKSB7Ci0JCXRoaXMuY29tcG9zaXRlUFZNLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UyKCkgewotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25DaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q29sbGVjdGlvbkNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IHB2bSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4oSW50ZWdlci52YWx1ZU9mKDc3KSk7Ci0JCXRoaXMuY3ZtLmFkZChwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KDEwLCA4Nyk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLnJlbW92ZShwdm0pOwotCQl0aGlzLnZlcmlmeUV2ZW50KDg3LCAxMCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuY3ZtLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoMTAsIDApOwotCi0JCUNvbGxlY3Rpb248V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4+IGMyID0gbmV3IEFycmF5TGlzdDxXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPj4oKTsKLQkJYzIuYWRkKHRoaXMucHZtMSk7Ci0JCWMyLmFkZCh0aGlzLnB2bTIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jdm0uc2V0VmFsdWVzKGMyKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgwLCAzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZzEoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuY29tcG9zaXRlUFZNLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wdm0xLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZzIoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHRoaXMucHZtMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmNvbXBvc2l0ZVBWTS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnB2bTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQkKLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KGludCBvbGRWYWx1ZSwgaW50IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNvbXBvc2l0ZVBWTSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKG9sZFZhbHVlKSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZihuZXdWYWx1ZSksIHRoaXMuZXZlbnQuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvQ29vcmRpbmF0ZWRCYWcuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZEJhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDhhNGQ2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZEJhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdGhhdCBrZWVwcyBhbiBpbnRlcm5hbCBjb2xsZWN0aW9uIGluIHN5bmNoIHdpdGggdGhlCi0gKiBjb2xsZWN0aW9uIGhlbGQgYnkgYSBjb2xsZWN0aW9uIHZhbHVlIG1vZGVsLgotICovCi1jbGFzcyBDb29yZGluYXRlZEJhZzxFPiBpbXBsZW1lbnRzIEJhZzxFPiwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgQmFnPEU+IGJhZyA9IG5ldyBIYXNoQmFnPEU+KCk7Ci0KLQlDb29yZGluYXRlZEJhZyhDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPiBjdm0pIHsKLQkJY3ZtLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmFkZChvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcuYWRkQWxsKGMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQl0aGlzLmJhZy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5jb250YWlucyhvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmNvbnRhaW5zQWxsKGMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5pc0VtcHR5KCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5iYWcuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnJlbW92ZShvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZW1vdmVBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5iYWcucmV0YWluQWxsKGMpOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmJhZy50b0FycmF5KGEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCYWcgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBjb3VudChPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuY291bnQobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEUgbywgaW50IGNvdW50KSB7Ci0JCXJldHVybiB0aGlzLmJhZy5hZGQobywgY291bnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbywgaW50IGNvdW50KSB7Ci0JCXJldHVybiB0aGlzLmJhZy5yZW1vdmUobywgY291bnQpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxFPiB1bmlxdWVJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIGludCB1bmlxdWVDb3VudCgpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLnVuaXF1ZUNvdW50KCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yPEJhZy5FbnRyeTxFPj4gZW50cmllcygpIHsKLQkJcmV0dXJuIHRoaXMuYmFnLmVudHJpZXMoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQlmb3IgKEUgaXRlbSA6IChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJdGhpcy5iYWcuYWRkKGl0ZW0pOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlmb3IgKEUgaXRlbSA6IChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJdGhpcy5iYWcucmVtb3ZlKGl0ZW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5iYWcuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmJhZywgKChDb2xsZWN0aW9uVmFsdWVNb2RlbDxFPikgZXZlbnQuZ2V0U291cmNlKCkpLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5iYWcuZXF1YWxzKG8pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy5oYXNoQ29kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmJhZy50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0Nvb3JkaW5hdGVkTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNmMDI0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Db29yZGluYXRlZExpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdERhdGFFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0RGF0YUxpc3RlbmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRoYXQga2VlcHMgYW4gaW50ZXJuYWwgbGlzdCBpbiBzeW5jaCB3aXRoIHRoZQotICogbGlzdCBoZWxkIGJ5IGEgbGlzdCB2YWx1ZSBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIENvb3JkaW5hdGVkTGlzdDxFPiBpbXBsZW1lbnRzIExpc3Q8RT4sIExpc3RDaGFuZ2VMaXN0ZW5lciwgTGlzdERhdGFMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBMaXN0PEU+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEU+KCk7Ci0KLQlwdWJsaWMgQ29vcmRpbmF0ZWRMaXN0KExpc3RWYWx1ZU1vZGVsPEU+IGxpc3RWYWx1ZU1vZGVsKSB7Ci0JCWxpc3RWYWx1ZU1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcyk7Ci0JCWZvciAoSXRlcmF0b3I8RT4gc3RyZWFtID0gbGlzdFZhbHVlTW9kZWwuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmFkZChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb29yZGluYXRlZExpc3QoTGlzdE1vZGVsIGxpc3RNb2RlbCkgewotCQlsaXN0TW9kZWwuYWRkTGlzdERhdGFMaXN0ZW5lcih0aGlzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0TW9kZWwuZ2V0U2l6ZSgpOyBpKyspIHsKLQkJCXRoaXMuYWRkKGksIHRoaXMuZ2V0RWxlbWVudEF0KGxpc3RNb2RlbCwgaSkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIExpc3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7Ci0JCXRoaXMubGlzdC5hZGQoaW5kZXgsIGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZChFIG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGQobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5hZGRBbGwoYyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LmFkZEFsbChpbmRleCwgYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMubGlzdC5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnMobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuY29udGFpbnNBbGwoYyk7Ci0JfQotCi0JcHVibGljIEUgZ2V0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaW5kZXhPZihvKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGFzdEluZGV4T2Yobyk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3RJdGVyYXRvcjxFPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QubGlzdEl0ZXJhdG9yKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLQkJcmV0dXJuIHRoaXMubGlzdC5yZW1vdmUobyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotCQlyZXR1cm4gdGhpcy5saXN0LnJlbW92ZUFsbChjKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QucmV0YWluQWxsKGMpOwotCX0KLQotCXB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNldChpbmRleCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxFPiBzdWJMaXN0KGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7Ci0JCXJldHVybiB0aGlzLmxpc3Quc3ViTGlzdChmcm9tSW5kZXgsIHRvSW5kZXgpOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotCQlyZXR1cm4gdGhpcy5saXN0LnRvQXJyYXkoKTsKLQl9Ci0KLQlwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0JCXJldHVybiB0aGlzLmxpc3QudG9BcnJheShhKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTGlzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXRJdGVtcyhlKSkgewotCQkJdGhpcy5saXN0LmFkZChpKyssIGl0ZW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCWludCBiYXNlID0gZS5nZXRJbmRleCgpOwotCQlmb3IgKGludCBpID0gZS5nZXRJdGVtc1NpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKGJhc2UgKyBpKTsgIC8vIHJlbW92ZSBmcm9tIGVuZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJaW50IGkgPSBlLmdldEluZGV4KCk7Ci0JCWZvciAoRSBpdGVtIDogdGhpcy5nZXROZXdJdGVtcyhlKSkgewotCQkJdGhpcy5saXN0LnNldChpKyssIGl0ZW0pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5saXN0LCBlLmdldFRhcmdldEluZGV4KCksIGUuZ2V0U291cmNlSW5kZXgoKSwgZS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQl0aGlzLmxpc3QuY2xlYXIoKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0aGlzLmxpc3QsIHRoaXMuZ2V0U291cmNlKGUpLml0ZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBMaXN0RGF0YUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGNvbnRlbnRzQ2hhbmdlZChMaXN0RGF0YUV2ZW50IGUpIHsKLQkJdGhpcy5saXN0LmNsZWFyKCk7Ci0JCUxpc3RNb2RlbCBsbSA9IChMaXN0TW9kZWwpIGUuZ2V0U291cmNlKCk7Ci0JCWludCBzaXplID0gbG0uZ2V0U2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJdGhpcy5saXN0LmFkZChpLCB0aGlzLmdldEVsZW1lbnRBdChsbSwgaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW50ZXJ2YWxBZGRlZChMaXN0RGF0YUV2ZW50IGUpIHsKLQkJTGlzdE1vZGVsIGxtID0gKExpc3RNb2RlbCkgZS5nZXRTb3VyY2UoKTsKLQkJaW50IHN0YXJ0ID0gTWF0aC5taW4oZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWludCBlbmQgPSBNYXRoLm1heChlLmdldEluZGV4MCgpLCBlLmdldEluZGV4MSgpKTsKLQkJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDw9IGVuZDsgaSsrKSB7Ci0JCQl0aGlzLmxpc3QuYWRkKGksIHRoaXMuZ2V0RWxlbWVudEF0KGxtLCBpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnRlcnZhbFJlbW92ZWQoTGlzdERhdGFFdmVudCBlKSB7Ci0JCWludCBzdGFydCA9IE1hdGgubWluKGUuZ2V0SW5kZXgwKCksIGUuZ2V0SW5kZXgxKCkpOwotCQlpbnQgZW5kID0gTWF0aC5tYXgoZS5nZXRJbmRleDAoKSwgZS5nZXRJbmRleDEoKSk7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBzdGFydCArIDE7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDw9IGxlbmd0aDsgaSsrKSB7Ci0JCQl0aGlzLmxpc3QucmVtb3ZlKHN0YXJ0KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlyZXR1cm4gdGhpcy5saXN0LmVxdWFscyhvKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gdGhpcy5saXN0Lmhhc2hDb2RlKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMubGlzdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncy49Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBFIGdldEVsZW1lbnRBdChMaXN0TW9kZWwgbGlzdE1vZGVsLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChFKSBsaXN0TW9kZWwuZ2V0RWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvLyBtaW5pbWl6ZWQgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgSXRlcmFibGU8RT4gZ2V0SXRlbXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCXJldHVybiAoSXRlcmFibGU8RT4pIGV2ZW50LmdldEl0ZW1zKCk7Ci0JfQotCi0JLy8gbWluaW1pemVkIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIEl0ZXJhYmxlPEU+IGdldE5ld0l0ZW1zKExpc3RSZXBsYWNlRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIChJdGVyYWJsZTxFPikgZXZlbnQuZ2V0TmV3SXRlbXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBtaW5pbWl6ZSB0aGUgc2NvcGUgb2YgdGhlIHN1cHByZXNzZWQgd2FybmluZ3MuPQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8RT4gZ2V0U291cmNlKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQlyZXR1cm4gKExpc3RWYWx1ZU1vZGVsPEU+KSBldmVudC5nZXRTb3VyY2UoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmUxYTI1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGV4dGVuZGVkTGlzdEhvbGRlcjsKLQlMaXN0RXZlbnQgZXZlbnQ7Ci0JU3RyaW5nIGV2ZW50VHlwZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBREQgPSAiYWRkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFID0gInJlbW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUExBQ0UgPSAicmVwbGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PVkUgPSAibW92ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0KLQlwdWJsaWMgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0SG9sZGVyKHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoIkEiKTsKLQkJcmVzdWx0LmFkZCgiQiIpOwotCQlyZXN1bHQuYWRkKCJDIik7Ci0JCXJlc3VsdC5hZGQoIkQiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZEV4dGVuZGVkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGV4dGVuZGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlleHRlbmRlZExpc3QuYWRkQWxsKHRoaXMuYnVpbGRQcmVmaXgoKSk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZExpc3QoKSk7Ci0JCWV4dGVuZGVkTGlzdC5hZGRBbGwodGhpcy5idWlsZFN1ZmZpeCgpKTsKLQkJcmV0dXJuIGV4dGVuZGVkTGlzdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFByZWZpeCgpIHsKLQkJTGlzdDxTdHJpbmc+IHByZWZpeCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwcmVmaXguYWRkKCJ4Iik7Ci0JCXByZWZpeC5hZGQoInkiKTsKLQkJcHJlZml4LmFkZCgieiIpOwotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkU3VmZml4KCkgewotCQlMaXN0PFN0cmluZz4gc3VmZml4ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXN1ZmZpeC5hZGQoImkiKTsKLQkJc3VmZml4LmFkZCgiaiIpOwotCQlyZXR1cm4gc3VmZml4OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEV4dGVuZGVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByZWZpeCgpLCBsdm0sIHRoaXMuYnVpbGRTdWZmaXgoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkRXh0ZW5kZWRMaXN0KCkuc2l6ZSgpLCB0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5zaXplKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZExpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRlZExpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkTGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlMaXN0PFN0cmluZz4gZXh0ZW5kZWRMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5leHRlbmRlZExpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBpdGVtcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWlmIChleHRlbmRlZExpc3QuY29udGFpbnMoc3RyZWFtLm5leHQoKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0vLwlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotLy8JCUxpc3Q8U3RyaW5nPiBleHRlbmRlZExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSk7Ci0vLwkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotLy8JCQlpZiAoZXh0ZW5kZWRMaXN0LmNvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0vLwkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gZmFsc2U7Ci0vLwl9Ci0vLwotCXB1YmxpYyB2b2lkIHRlc3RBZGQxKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJFIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDQsICJFIik7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiRSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiRSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkMigpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoNCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5leHRlbmRlZExpc3RDb250YWlucyhudWxsKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkQWRkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IGFkZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYWRkTGlzdC5hZGQoIkUiKTsKLQkJYWRkTGlzdC5hZGQoIkYiKTsKLQkJcmV0dXJuIGFkZExpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbDEoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnNBbnkodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDQsIHRoaXMuYnVpbGRBZGRMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXh0ZW5kZWRMaXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zQWxsKHRoaXMuYnVpbGRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlMSgpIHsKLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV4dGVuZGVkTGlzdENvbnRhaW5zKCJCIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiQiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5leHRlbmRlZExpc3RDb250YWlucygiQiIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoIkIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VHZW5lcmljKCkgewotCQl0aGlzLmV4dGVuZGVkTGlzdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlTmFtZWQoKSB7Ci0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdENoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCg0LCAiRSIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgNywgIkUiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDUsIG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgOCwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDgsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVNT1ZFLCA3LCAiRSIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiQUEiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRVBMQUNFKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgIkEiKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgIkFBIikpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFUExBQ0U7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCUV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENIQU5HRTsKLQkJCQlFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSkgewotCQlhc3NlcnRFcXVhbHModHlwZSwgdGhpcy5ldmVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5leHRlbmRlZExpc3RIb2xkZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQuZ2V0TGlzdE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyB0eXBlLCBpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodHlwZSk7Ci0JCWlmICh0eXBlID09IEFERCkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gUkVNT1ZFKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQkvKgotCQkgKiBhZGRpbmcgbGlzdGVuZXJzIHRvIHRoZSBleHRlbmRlZCBsaXN0IHdpbGwgY2F1c2UgbGlzdGVuZXJzCi0JCSAqIHRvIGJlIGFkZGVkIHRvIHRoZSB3cmFwcGVkIGxpc3Q7Ci0JCSAqIGxpa2V3aXNlLCByZW1vdmluZyBsaXN0ZW5lcnMgZnJvbSB0aGUgZXh0ZW5kZWQgbGlzdCB3aWxsCi0JCSAqIGNhdXNlIGxpc3RlbmVycyB0byBiZSByZW1vdmVkIGZyb20gdGhlIHdyYXBwZWQgbGlzdAotCQkgKi8KLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCi0JCXRoaXMuZXh0ZW5kZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJdGhpcy5leHRlbmRlZExpc3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMDc4N2YuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyOwotCUNvbGxlY3Rpb25BZGRFdmVudCBhZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgcmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgY29sbGVjdGlvbkNsZWFyZWRFdmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgY29sbGVjdGlvbkNoYW5nZWRFdmVudDsKLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBmaWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXI7Ci0JQ29sbGVjdGlvbkFkZEV2ZW50IGZpbHRlcmVkQWRkRXZlbnQ7Ci0JQ29sbGVjdGlvblJlbW92ZUV2ZW50IGZpbHRlcmVkUmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgZmlsdGVyZWRDb2xsZWN0aW9uQ2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBmaWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwdWJsaWMgRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPihidWlsZENvbGxlY3Rpb24oKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyID0gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIHMuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlclZhbHVlID0gdGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvbkhvbGRlclZhbHVlLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29sbGVjdGlvbkhvbGRlclZhbHVlLm5leHQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJheiIpOwotCQkKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGNvbGxlY3Rpb25WYWx1ZXMgPSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb3giLCBjb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgY29sbGVjdGlvblZhbHVlcy5uZXh0KCkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcyA9IHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgZmlsdGVyZWRDb2xsZWN0aW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGZpbHRlcmVkQ29sbGVjdGlvblZhbHVlcy5oYXNOZXh0KCkpOwotCX0JCQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkRmlsdGVyZWRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkRmlsdGVyZWRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uQ2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvbkNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJFdmVudHMoKSB7Ci0JCXRoaXMuYWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLnJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25DaGFuZ2VzKCkgewotCQljbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHRlbXBDb2xsZWN0aW9uID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5hZGRFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5maWx0ZXJlZEFkZEV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQkKLQkJY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRlbXBDb2xsZWN0aW9uLnJlbW92ZSgiYmFyIik7Ci0JCXRlbXBDb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCB0ZW1wQ29sbGVjdGlvbik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50KTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCwgdGhpcy5maWx0ZXJlZENvbGxlY3Rpb25Ib2xkZXIsIHRlbXBDb2xsZWN0aW9uKTsKLQotCi0JCWNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImJhciIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuYWRkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgdGVtcENvbGxlY3Rpb24pOwotCQlhc3NlcnROdWxsKHRoaXMuZmlsdGVyZWRBZGRFdmVudCk7Ci0KLQotCQljbGVhckV2ZW50cygpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXoiKTsKLQkJCi0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMobmV3Q29sbGVjdGlvbik7Ci0KLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlcik7Ci0JCQotCQl0ZW1wQ29sbGVjdGlvbi5yZW1vdmUoImZvbyIpOwotCQl0ZW1wQ29sbGVjdGlvbi5hZGQoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRDb2xsZWN0aW9uQ2hhbmdlZEV2ZW50LCB0aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkhvbGRlcik7Ci0JCQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucmVtb3ZlRXZlbnQgPSBlOwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRBZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRSZW1vdmVFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkQ29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZmlsdGVyZWRBZGRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZFJlbW92ZUV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5maWx0ZXJlZENvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QgaXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLCBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QgaXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLCBDb2xsZWN0aW9uVG9vbHMudmVjdG9yKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlRmlsdGVyZWRJdGVtKCkgewotCQkvLyBidWlsZCBjb2xsZWN0aW9uIHdpdGggVGVzdEl0ZW1zCi0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFRlc3RJdGVtPiB0aUhvbGRlciA9IG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4odGhpcy5idWlsZENvbGxlY3Rpb24yKCkpOwotCQlDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4gZmlsdGVyZWRUSUhvbGRlciA9IG5ldyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0SXRlbT4odGlIb2xkZXIsIHRoaXMuYnVpbGRGaWx0ZXIyKCkpOwotCQkvLyBhZGQgYSBsaXN0ZW5lciB0byAiYWN0aXZhdGUiIHRoZSB3cmFwcGVyCi0JCWZpbHRlcmVkVElIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aUhvbGRlci5hZGQobmV3IFRlc3RJdGVtKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygxLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0KLQkJVGVzdEl0ZW0gYmF6ID0gbmV3IFRlc3RJdGVtKCJiYXoiKTsKLQkJdGlIb2xkZXIuYWRkKGJheik7Ci0JCWFzc2VydEVxdWFscygyLCBmaWx0ZXJlZFRJSG9sZGVyLnNpemUoKSk7Ci0JCS8vIGJlZm9yZSByZW1vdmluZyBpdCwgY2hhbmdlIHRoZSBpdGVtIHNvIHRoYXQgaXQgaXMgZmlsdGVyZWQKLQkJYmF6Lm5hbWUgPSAiamF6IjsKLQkJdGlIb2xkZXIucmVtb3ZlKGJheik7Ci0JCS8vIHRoaXMgd291bGQgZmFpbCBiZWNhdXNlIHRoZSBpdGVtIHdhcyBub3QgcmVtb3ZlZCBmcm9tCi0JCS8vIHRoZSBmaWx0ZXJlZCBjb2xsZWN0aW9uIGNhY2hlLi4uIGJ1dCB3ZSd2ZSBmaXhlZCBpdCBub3cKLQkJYXNzZXJ0RXF1YWxzKDEsIGZpbHRlcmVkVElIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248VGVzdEl0ZW0+IGJ1aWxkQ29sbGVjdGlvbjIoKSB7Ci0JCUNvbGxlY3Rpb248VGVzdEl0ZW0+IGNvbGxlY3Rpb24gPSBuZXcgVmVjdG9yPFRlc3RJdGVtPigpOwotCQljb2xsZWN0aW9uLmFkZChuZXcgVGVzdEl0ZW0oImZvbyIpKTsKLQkJcmV0dXJuIGNvbGxlY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8VGVzdEl0ZW0+IGJ1aWxkRmlsdGVyMigpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8VGVzdEl0ZW0+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFRlc3RJdGVtIHRpKSB7Ci0JCQkJcmV0dXJuIHRpLm5hbWUuc3RhcnRzV2l0aCgiYiIpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUZXN0SXRlbSBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RJdGVtIHsKLQkJU3RyaW5nIG5hbWU7Ci0JCVRlc3RJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0ZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwZGI3Zi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaWRpRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZmlsdGVyZWRPYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBmaWx0ZXJlZEV2ZW50OwotCi0JcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciA9IG5ldyBGaWx0ZXJpbmdXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkRmlsdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQmlkaUZpbHRlcjxTdHJpbmc+IGJ1aWxkRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEJpZGlGaWx0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJCXJldHVybiAocyAhPSBudWxsKSAmJiBzLnN0YXJ0c1dpdGgoImIiKTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIHJldmVyc2VBY2NlcHQoU3RyaW5nIHMpIHsKLQkJCQlyZXR1cm4gKHMgIT0gbnVsbCkgJiYgcy5zdGFydHNXaXRoKCJiIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLmZpbHRlcmVkT2JqZWN0SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UxKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZEZpbHRlcmVkTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmFyIiwgImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgImJhciIsICJiYXoiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmF6IiwgImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZmlsdGVyZWRFdmVudCwgdGhpcy5maWx0ZXJlZE9iamVjdEhvbGRlciwgImJheiIsIG51bGwpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9wIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb28iLCAiZm9wIik7Ci0JCWFzc2VydE51bGwodGhpcy5maWx0ZXJlZEV2ZW50KTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5maWx0ZXJlZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsICJmb3AiLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmZpbHRlcmVkRXZlbnQpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmZpbHRlcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5ldmVudCwgdGhpcy5vYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmZpbHRlcmVkRXZlbnQsIHRoaXMuZmlsdGVyZWRPYmplY3RIb2xkZXIsIG51bGwsICJiYXIiKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCUZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRGaWx0ZXJlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmZpbHRlcmVkRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkZTlmYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgSnVuayBmb287Ci0JcHJpdmF0ZSBKdW5rIGJhcjsKLQlwcml2YXRlIEp1bmsgYmF6OwotCXByaXZhdGUgSnVuayBqb287Ci0JcHJpdmF0ZSBKdW5rIGphcjsKLQlwcml2YXRlIEp1bmsgamF6OwotCi0JcHJpdmF0ZSBKdW5rIHRvbTsKLQlwcml2YXRlIEp1bmsgZGljazsKLQlwcml2YXRlIEp1bmsgaGFycnk7Ci0KLQlwdWJsaWMgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmZvbyA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5iYXIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoImJheiIpOwotCQl0aGlzLmpvbyA9IG5ldyBKdW5rKCJqb28iKTsKLQkJdGhpcy5qYXIgPSBuZXcgSnVuaygiamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoImpheiIpOwotCi0JCXRoaXMudG9tID0gbmV3IEp1bmsoInRvbSIpOwotCQl0aGlzLmRpY2sgPSBuZXcgSnVuaygiZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoImhhcnJ5Iik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbUNvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCi0JCWxpc3RWYWx1ZU1vZGVsLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0NPTExFQ1RJT04pOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGxpc3RWYWx1ZU1vZGVsLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obmV3IEl0ZW1Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5yZW1vdmVTdHVmZigiYmFyIik7Ci0JCXRoaXMuYmFyLmFkZFN0dWZmKCJ6enoiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJ6enoiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTm9MaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgbGlzdFZhbHVlTW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248SnVuaz4gYnVpbGRDb2xsZWN0aW9uKCkgewotCQlCYWc8SnVuaz4gYmFnID0gbmV3IEhhc2hCYWc8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24oYmFnKTsKLQkJcmV0dXJuIGJhZzsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SnVuaz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PEp1bms+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248SnVuaz4gYykgewotCQljLmFkZCh0aGlzLmZvbyk7Ci0JCWMuYWRkKHRoaXMuYmFyKTsKLQkJYy5hZGQodGhpcy5iYXopOwotCQljLmFkZCh0aGlzLmpvbyk7Ci0JCWMuYWRkKHRoaXMuamFyKTsKLQkJYy5hZGQodGhpcy5qYXopOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgaW1wbGVtZW50cyBEaXNwbGF5YWJsZSwgQ29tcGFyYWJsZTxKdW5rPiB7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfQ09MTEVDVElPTiA9ICJzdHVmZiI7Ci0JCQkKLQkKLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdG9TdHJpbmcoKTsKLQkJfQotCQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKdW5rIG8pIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8oby5kaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMuc3R1ZmYgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTY2ZWNlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGZvbzsKLQlwcml2YXRlIEp1bmsgYmFyOwotCXByaXZhdGUgSnVuayBiYXo7Ci0JcHJpdmF0ZSBKdW5rIGpvbzsKLQlwcml2YXRlIEp1bmsgamFyOwotCXByaXZhdGUgSnVuayBqYXo7Ci0KLQlwcml2YXRlIEp1bmsgdG9tOwotCXByaXZhdGUgSnVuayBkaWNrOwotCXByaXZhdGUgSnVuayBoYXJyeTsKLQotCXB1YmxpYyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoImZvbyIpOwotCQl0aGlzLmJhciA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJdGhpcy5iYXogPSBuZXcgSnVuaygiYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoImpvbyIpOwotCQl0aGlzLmphciA9IG5ldyBKdW5rKCJqYXIiKTsKLQkJdGhpcy5qYXogPSBuZXcgSnVuaygiamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidG9tIik7Ci0JCXRoaXMuZGljayA9IG5ldyBKdW5rKCJkaWNrIik7Ci0JCXRoaXMuaGFycnkgPSBuZXcgSnVuaygiaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihjb2xsZWN0aW9uSG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtTGlzdExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDYsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoNywgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoOCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuZ2V0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmphei5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0KLQkJbGlzdFZhbHVlTW9kZWwucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIEp1bmsuU1RVRkZfTElTVCk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbUxpc3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlciwgSnVuay5TVFVGRl9MSVNUKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCgwKSk7Ci0JCXRoaXMuYmFyLnJlbW92ZVN0dWZmKCJiYXIiKTsKLQkJdGhpcy5iYXIuYWRkU3R1ZmYoInp6eiIpOwotCQl0aGlzLmJhci5hZGRTdHVmZigiYmFyIik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgbGlzdFZhbHVlTW9kZWwuZ2V0KDUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBzeW5jaExpc3QuZ2V0KDUpKTsKLQkJdGhpcy5iYXIucmVtb3ZlU3R1ZmYoInp6eiIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEp1bmsgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCBpbXBsZW1lbnRzIERpc3BsYXlhYmxlLCBDb21wYXJhYmxlPEp1bms+IHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3R1ZmY7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVGRl9MSVNUID0gInN0dWZmIjsKLQkJCQotCQotCQlwdWJsaWMgSnVuayhTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuc3R1ZmYuYWRkKHN0dWZmSXRlbSk7Ci0JCQlmaXJlSXRlbUFkZGVkKFNUVUZGX0xJU1QsIHRoaXMuc3R1ZmYuaW5kZXhPZihzdHVmZkl0ZW0pLCBzdHVmZkl0ZW0pOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnN0dWZmLmluZGV4T2Yoc3R1ZmZJdGVtKTsKLQkJCXRoaXMuc3R1ZmYucmVtb3ZlKHN0dWZmSXRlbSk7Ci0JCQlmaXJlSXRlbVJlbW92ZWQoU1RVRkZfTElTVCwgaW5kZXgsIHN0dWZmSXRlbSk7Ci0JCX0KLQkKLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRvU3RyaW5nKCk7Ci0JCX0KLQkKLQkJcHVibGljIEljb24gaWNvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBjb21wYXJlVG8oSnVuayBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWZjZTJhLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkljb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoInRoaXMuZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoInRoaXMuYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoInRoaXMuYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoInRoaXMuam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoInRoaXMuamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoInRoaXMuamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidGhpcy50b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoInRoaXMuZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoInRoaXMuaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuZm9vKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5qYXIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQkvLyB0ZXN0IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbgotCQlsaXN0SG9sZGVyLnNldExpc3RWYWx1ZXModGhpcy5idWlsZExpc3QoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsLCBMaXN0PEp1bms+IGxpc3QpIHsKLQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLnNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlhc3NlcnRFcXVhbHMobGlzdFZhbHVlTW9kZWwuZ2V0KGkpLCBsaXN0LmdldChpKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21Db2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPEp1bms+IGJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpIHsKLQkJLy8gc29ydCB3aXRoIHJldmVyc2Ugb3JkZXIKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPEp1bms+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKEp1bmsgbzEsIEp1bmsgbzIpIHsKLQkJCQlyZXR1cm4gbzIuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyhvMS5kaXNwbGF5U3RyaW5nKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDb2xsZWN0aW9uU29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGNvbGxlY3Rpb25Ib2xkZXIsIGNvbXBhcmF0b3IpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMudG9tKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5kaWNrKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmZvbyk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuamFyKTsKLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIsIGNvbXBhcmF0b3IpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMudG9tKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy5kaWNrKTsKLQkJbGlzdEhvbGRlci5hZGQoMCwgdGhpcy5oYXJyeSk7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg1KTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RWYWx1ZU1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlU29ydChMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0LCBDb21wYXJhdG9yPEp1bms+IGNvbXBhcmF0b3IpIHsKLQkJU29ydGVkU2V0PEp1bms+IHNzID0gbmV3IFRyZWVTZXQ8SnVuaz4oY29tcGFyYXRvcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpOyBpKyspIHsKLQkJCXNzLmFkZChsaXN0VmFsdWVNb2RlbC5nZXQoaSkpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhzcy5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxKdW5rPiBzdHJlYW0xID0gc3MuaXRlcmF0b3IoKSwgc3RyZWFtMiA9IGxpc3QuaXRlcmF0b3IoKTsgc3RyZWFtMS5oYXNOZXh0KCk7ICkgewotCQkJYXNzZXJ0RXF1YWxzKHN0cmVhbTEubmV4dCgpLCBzdHJlYW0yLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0KLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obGlzdEhvbGRlciksIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoRGlzcGxheWFibGUuRElTUExBWV9TVFJJTkdfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmphei5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKERpc3BsYXlhYmxlLklDT05fUFJPUEVSVFkpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpLCBEaXNwbGF5YWJsZS5ESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgRGlzcGxheWFibGUuSUNPTl9QUk9QRVJUWSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdFZhbHVlTW9kZWwuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxKdW5rPihuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KGxpc3RIb2xkZXIsIERpc3BsYXlhYmxlLkRJU1BMQVlfU1RSSU5HX1BST1BFUlRZLCBEaXNwbGF5YWJsZS5JQ09OX1BST1BFUlRZKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMobGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCgwKSk7Ci0JCXRoaXMuYmFyLnNldE5hbWUoInp6eiIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIGxpc3RWYWx1ZU1vZGVsLmdldCg1KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhciwgc3luY2hMaXN0LmdldCg1KSk7Ci0JCXRoaXMuYmFyLnNldE5hbWUoInRoaXMuYmFyIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZENvbGxlY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPEp1bms+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPEp1bms+IGJhZyA9IG5ldyBIYXNoQmFnPEp1bms+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGJhZyk7Ci0JCXJldHVybiBiYWc7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PEp1bms+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxKdW5rPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihsaXN0KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlQ29sbGVjdGlvbihDb2xsZWN0aW9uPEp1bms+IGMpIHsKLQkJYy5hZGQodGhpcy5mb28pOwotCQljLmFkZCh0aGlzLmJhcik7Ci0JCWMuYWRkKHRoaXMuYmF6KTsKLQkJYy5hZGQodGhpcy5qb28pOwotCQljLmFkZCh0aGlzLmphcik7Ci0JCWMuYWRkKHRoaXMuamF6KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnVuayBjbGFzcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8SnVuaz4gewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKdW5rIG8pIHsKLQkJCXJldHVybiB0aGlzLmRpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8oby5kaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9JdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NzMwNzMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0l0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsgZm9vOwotCXByaXZhdGUgSnVuayBiYXI7Ci0JcHJpdmF0ZSBKdW5rIGJhejsKLQlwcml2YXRlIEp1bmsgam9vOwotCXByaXZhdGUgSnVuayBqYXI7Ci0JcHJpdmF0ZSBKdW5rIGphejsKLQotCXByaXZhdGUgSnVuayB0b207Ci0JcHJpdmF0ZSBKdW5rIGRpY2s7Ci0JcHJpdmF0ZSBKdW5rIGhhcnJ5OwotCi0JcHVibGljIEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZm9vID0gbmV3IEp1bmsoInRoaXMuZm9vIik7Ci0JCXRoaXMuYmFyID0gbmV3IEp1bmsoInRoaXMuYmFyIik7Ci0JCXRoaXMuYmF6ID0gbmV3IEp1bmsoInRoaXMuYmF6Iik7Ci0JCXRoaXMuam9vID0gbmV3IEp1bmsoInRoaXMuam9vIik7Ci0JCXRoaXMuamFyID0gbmV3IEp1bmsoInRoaXMuamFyIik7Ci0JCXRoaXMuamF6ID0gbmV3IEp1bmsoInRoaXMuamF6Iik7Ci0KLQkJdGhpcy50b20gPSBuZXcgSnVuaygidGhpcy50b20iKTsKLQkJdGhpcy5kaWNrID0gbmV3IEp1bmsoInRoaXMuZGljayIpOwotCQl0aGlzLmhhcnJ5ID0gbmV3IEp1bmsoInRoaXMuaGFycnkiKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25TeW5jaHJvbml6YXRpb24oKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+IGNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCQlMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCA9IG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxKdW5rPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PEp1bms+KGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQodGhpcy50b20pOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmRpY2spOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLmhhcnJ5KTsKLQkJYXNzZXJ0RXF1YWxzKDksIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihsaXN0SG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg4KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCwgTGlzdDxKdW5rPiBsaXN0KSB7Ci0JCWFzc2VydEVxdWFscyhsaXN0VmFsdWVNb2RlbC5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0VmFsdWVNb2RlbC5zaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RWYWx1ZU1vZGVsLmdldChpKSwgbGlzdC5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQ29sbGVjdGlvblNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5Q29sbGVjdGlvblNvcnQodGhpcy5idWlsZEN1c3RvbUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUxpc3RTb3J0KCkgewotCQl0aGlzLnZlcmlmeUxpc3RTb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxKdW5rPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxKdW5rPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShKdW5rIG8xLCBKdW5rIG8yKSB7Ci0JCQkJcmV0dXJuIG8yLmNvbXBhcmVUbyhvMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25Tb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxKdW5rPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4oY29sbGVjdGlvbkhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCh0aGlzLnRvbSk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuZGljayk7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUodGhpcy5mb28pOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSh0aGlzLmphcik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RTb3J0KENvbXBhcmF0b3I8SnVuaz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEp1bms+KG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8SnVuaz4obGlzdEhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCB0aGlzLnRvbSk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuZGljayk7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsIHRoaXMuaGFycnkpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdFZhbHVlTW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoNSk7Ci0JCWFzc2VydEVxdWFscyg1LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0VmFsdWVNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZVNvcnQoTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwsIExpc3Q8SnVuaz4gbGlzdCwgQ29tcGFyYXRvcjxKdW5rPiBjb21wYXJhdG9yKSB7Ci0JCVNvcnRlZFNldDxKdW5rPiBzcyA9IG5ldyBUcmVlU2V0PEp1bms+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RWYWx1ZU1vZGVsLnNpemUoKTsgaSsrKSB7Ci0JCQlzcy5hZGQobGlzdFZhbHVlTW9kZWwuZ2V0KGkpKTsKLQkJfQotCQlhc3NlcnRFcXVhbHMoc3Muc2l6ZSgpLCBsaXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3I8SnVuaz4gc3RyZWFtMSA9IHNzLml0ZXJhdG9yKCksIHN0cmVhbTIgPSBsaXN0Lml0ZXJhdG9yKCk7IHN0cmVhbTEuaGFzTmV4dCgpOyApIHsKLQkJCWFzc2VydEVxdWFscyhzdHJlYW0xLm5leHQoKSwgc3RyZWFtMi5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZm9vLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qYXouaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQotCQlsaXN0VmFsdWVNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmZvby5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5mb28uaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuamF6Lmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmphei5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RWYWx1ZU1vZGVsPEp1bms+IGxpc3RWYWx1ZU1vZGVsID0gbmV3IEl0ZW1TdGF0ZUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKdW5rPihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KGxpc3RIb2xkZXIpKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PEp1bms+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8SnVuaz4obGlzdFZhbHVlTW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0VmFsdWVNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0VmFsdWVNb2RlbC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJTGlzdFZhbHVlTW9kZWw8SnVuaz4gbGlzdFZhbHVlTW9kZWwgPSBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPEp1bms+KG5ldyBJdGVtU3RhdGVMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8SnVuaz4obGlzdEhvbGRlcikpOwotCQlDb29yZGluYXRlZExpc3Q8SnVuaz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxKdW5rPihsaXN0VmFsdWVNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RWYWx1ZU1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ6enoiKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYmFyLCBsaXN0VmFsdWVNb2RlbC5nZXQoNSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5iYXIsIHN5bmNoTGlzdC5nZXQoNSkpOwotCQl0aGlzLmJhci5zZXROYW1lKCJ0aGlzLmJhciIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDxKdW5rPiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8SnVuaz4gYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxKdW5rPiBidWlsZENvbGxlY3Rpb24oKSB7Ci0JCUJhZzxKdW5rPiBiYWcgPSBuZXcgSGFzaEJhZzxKdW5rPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8SnVuaz4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPEp1bms+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxKdW5rPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8SnVuaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8SnVuaz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxKdW5rPiBjKSB7Ci0JCWMuYWRkKHRoaXMuZm9vKTsKLQkJYy5hZGQodGhpcy5iYXIpOwotCQljLmFkZCh0aGlzLmJheik7Ci0JCWMuYWRkKHRoaXMuam9vKTsKLQkJYy5hZGQodGhpcy5qYXIpOwotCQljLmFkZCh0aGlzLmpheik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKdW5rIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ29tcGFyYWJsZTxKdW5rPiB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhKdW5rIGopIHsKLQkJCXJldHVybiB0aGlzLm5hbWUuY29tcGFyZVRvKGoubmFtZSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMubmFtZSArICIpIjsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0pwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9KcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MTJkZDMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL0pwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUucHJlZnMuSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5KcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxWYWx1ZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQotCQlzdWl0ZS5hZGRUZXN0KEpwdFV0aWxpdHlNb2RlbFZhbHVlUHJlZnNUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRVdGlsaXR5TW9kZWxWYWx1ZVN3aW5nVGVzdHMuc3VpdGUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVCb29sZWFuUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb21wb3NpdGVMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbXBvc2l0ZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShGaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJdGVtQ29sbGVjdGlvbkxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEl0ZW1MaXN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSXRlbVN0YXRlTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdEN1cmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsTGlzdFZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlBc3BlY3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN0YXRpY1ZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLlRyYW5zZm9ybWVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmVlQXNwZWN0QWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZUxpc3RBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmYzZmQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RBc3BlY3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQlwcml2YXRlIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgYWExOwotCXByaXZhdGUgTGlzdEV2ZW50IGV2ZW50MTsKLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjE7Ci0KLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIExpc3RBc3BlY3RBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCgpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWVzKHRoaXMuc3ViamVjdDFOYW1lcygpKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbnModGhpcy5zdWJqZWN0MURlc2NyaXB0aW9ucygpKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KHRoaXMuc3ViamVjdDEpOwotCQl0aGlzLmFhMSA9IHRoaXMuYnVpbGRBc3BlY3RBZGFwdGVyKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QoKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lcyh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb25zKHRoaXMuc3ViamVjdDJEZXNjcmlwdGlvbnMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDFOYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJlc3VsdC5hZGQoImJheiIpOwotCQlyZXN1bHQuYWRkKCJiYW0iKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBzdWJqZWN0MURlc2NyaXB0aW9ucygpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QxIGRlc2NyaXB0aW9uMSIpOwotCQlyZXN1bHQuYWRkKCJ0aGlzLnN1YmplY3QxIGRlc2NyaXB0aW9uMiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyTmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiam9vIik7Ci0JCXJlc3VsdC5hZGQoImphciIpOwotCQlyZXN1bHQuYWRkKCJqYXoiKTsKLQkJcmVzdWx0LmFkZCgiamFtIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3ViamVjdDJEZXNjcmlwdGlvbnMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MiBkZXNjcmlwdGlvbjEiKTsKLQkJcmVzdWx0LmFkZCgidGhpcy5zdWJqZWN0MiBkZXNjcmlwdGlvbjIiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIgYnVpbGRBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExvY2FsTGlzdEFzcGVjdEFkYXB0ZXIoc3ViamVjdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJTGlzdEFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUxpc3RBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoTGlzdEV2ZW50IGUpIHsKLQkJdGhpcy5ldmVudDEgPSBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QyTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0MSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKCJqYW0iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImphbSIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLmFkZCgiamFtIik7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0KLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLmFhMS5hZGQoMiwgImpheiIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoImpheiIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCW5hbWVzUGx1cy5hZGQoMiwgImpheiIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QWRkKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpdGVtcy5hZGQoImpvbyIpOwotCQlpdGVtcy5hZGQoImphciIpOwotCQlpdGVtcy5hZGQoImpheiIpOwotCQlpdGVtcy5hZGQoImphbSIpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5hYTEuYWRkQWxsKDIsIGl0ZW1zKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsJCS8vIG9ubHkgdGhlIGxhc3QgImFkZCIgZXZlbnQgd2lsbCBzdGlsbCBiZSB0aGVyZQotCQlhc3NlcnRFcXVhbHMoImphbSIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc1BsdXMgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNQbHVzLmFkZEFsbCgyLCBpdGVtcyk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc1BsdXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQlTdHJpbmcgcmVtb3ZlZE5hbWUgPSB0aGlzLnN1YmplY3QxLnJlbW92ZU5hbWUoMCk7CS8vIHNob3VsZCBiZSAiZm9vIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMocmVtb3ZlZE5hbWUsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lc01pbnVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCW5hbWVzTWludXMucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMobmFtZXNNaW51cywgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5hYTEubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCU9iamVjdCByZW1vdmVkSXRlbSA9IHRoaXMuYWExLnJlbW92ZSgwKTsJCi0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkSXRlbSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJbmFtZXNNaW51cy5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lc01pbnVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TGVuZ3RoKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCUxpc3Q8U3RyaW5nPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpdGVtcy5hZGQoImJhciIpOwotCQlpdGVtcy5hZGQoImJheiIpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5hYTEucmVtb3ZlKDEsIDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwkJLy8gb25seSB0aGUgbGFzdCAicmVtb3ZlIiBldmVudCB3aWxsIHN0aWxsIGJlIHRoZXJlCi0JCWFzc2VydEVxdWFscygiYmF6IiwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMucmVtb3ZlKDEpOwotCQluYW1lc1BsdXMucmVtb3ZlKDEpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCVN0cmluZyByZXBsYWNlZE5hbWUgPSB0aGlzLnN1YmplY3QxLnNldE5hbWUoMCwgImplbGx5Iik7CS8vIHNob3VsZCBiZSAiZm9vIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqZWxseSIsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldE5ld0l0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocmVwbGFjZWROYW1lLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRPbGRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzQ2hhbmdlZCA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc0NoYW5nZWQuc2V0KDAsICJqZWxseSIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNDaGFuZ2VkLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJcmVwbGFjZWROYW1lID0gdGhpcy5zdWJqZWN0MS5zZXROYW1lKDEsICJyb2xsIik7CS8vIHNob3VsZCBiZSAiYmFyIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCAoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb2xsIiwgKChMaXN0UmVwbGFjZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0TmV3SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyZXBsYWNlZE5hbWUsICgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudDEpLmdldE9sZEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQluYW1lc0NoYW5nZWQgPSB0aGlzLnN1YmplY3QxTmFtZXMoKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgwLCAiamVsbHkiKTsKLQkJbmFtZXNDaGFuZ2VkLnNldCgxLCAicm9sbCIpOwotCQlhc3NlcnRFcXVhbHMobmFtZXNDaGFuZ2VkLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFhMS5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkVHdvTmFtZXMoImphbSIsICJqYXoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlMaXN0PFN0cmluZz4gbmFtZXNQbHVzMiA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQluYW1lc1BsdXMyLmFkZCgwLCAiamF6Iik7Ci0JCW5hbWVzUGx1czIuYWRkKDAsICJqYW0iKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVzUGx1czIsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc3ViamVjdDEubmFtZXMoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5hYTEuZ2V0KDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zdWJqZWN0MS5uYW1lcygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuYWExLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpKTsKLQkJdGhpcy5hYTEucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFhMS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRVNfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFhMS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCWNsYXNzIFRlc3RTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IG5hbWVzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU19MSVNUID0gIm5hbWVzIjsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVzY3JpcHRpb25zOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTlNfTElTVCA9ICJkZXNjcmlwdGlvbnMiOwotCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoKSB7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLmRlc2NyaXB0aW9ucyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLm5hbWVzKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lcy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lcy5hZGQoaW5kZXgsIG5hbWUpOwotCQkJdGhpcy5maXJlSXRlbUFkZGVkKE5BTUVTX0xJU1QsIGluZGV4LCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZE5hbWUodGhpcy5uYW1lcy5zaXplKCksIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWVzKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl3aGlsZSAobmV3TmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQkJdGhpcy5hZGROYW1lKG5ld05hbWVzLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZXMoTGlzdDxTdHJpbmc+IG5ld05hbWVzKSB7Ci0JCQl0aGlzLmFkZE5hbWVzKG5ld05hbWVzLmxpc3RJdGVyYXRvcigpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUd29OYW1lcyhTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJdGhpcy5uYW1lcy5hZGQoMCwgbmFtZTIpOwotCQkJdGhpcy5uYW1lcy5hZGQoMCwgbmFtZTEpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoTkFNRVNfTElTVCwgdGhpcy5uYW1lcyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyByZW1vdmVOYW1lKGludCBpbmRleCkgewotCQkJU3RyaW5nIHJlbW92ZWROYW1lID0gdGhpcy5uYW1lcy5yZW1vdmUoaW5kZXgpOwotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoTkFNRVNfTElTVCwgaW5kZXgsIHJlbW92ZWROYW1lKTsKLQkJCXJldHVybiByZW1vdmVkTmFtZTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHNldE5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQkJU3RyaW5nIHJlcGxhY2VkTmFtZSA9IHRoaXMubmFtZXMuc2V0KGluZGV4LCBuYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChOQU1FU19MSVNULCBpbmRleCwgbmFtZSwgcmVwbGFjZWROYW1lKTsKLQkJCXJldHVybiByZXBsYWNlZE5hbWU7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGRlc2NyaXB0aW9ucygpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlMaXN0SXRlcmF0b3I8U3RyaW5nPih0aGlzLmRlc2NyaXB0aW9ucyk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmRlc2NyaXB0aW9ucy5nZXQoaW5kZXgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9uKGludCBpbmRleCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQl0aGlzLmRlc2NyaXB0aW9ucy5hZGQoaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMuYWRkRGVzY3JpcHRpb24odGhpcy5kZXNjcmlwdGlvbnMuc2l6ZSgpLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkRGVzY3JpcHRpb25zKExpc3RJdGVyYXRvcjxTdHJpbmc+IG5ld0Rlc2NyaXB0aW9ucykgewotCQkJd2hpbGUgKG5ld0Rlc2NyaXB0aW9ucy5oYXNOZXh0KCkpIHsKLQkJCQl0aGlzLmFkZERlc2NyaXB0aW9uKG5ld0Rlc2NyaXB0aW9ucy5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0aW9ucyhMaXN0PFN0cmluZz4gbmV3RGVzY3JpcHRpb25zKSB7Ci0JCQl0aGlzLmFkZERlc2NyaXB0aW9ucyhuZXdEZXNjcmlwdGlvbnMubGlzdEl0ZXJhdG9yKCkpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlRGVzY3JpcHRpb24oaW50IGluZGV4KSB7Ci0JCQlTdHJpbmcgcmVtb3ZlZERlc2NyaXB0aW9uID0gdGhpcy5kZXNjcmlwdGlvbnMucmVtb3ZlKGluZGV4KTsKLQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKERFU0NSSVBUSU9OU19MSVNULCBpbmRleCwgcmVtb3ZlZERlc2NyaXB0aW9uKTsKLQkJCXJldHVybiByZW1vdmVkRGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIFN0cmluZyBzZXREZXNjcmlwdGlvbihpbnQgaW5kZXgsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkJU3RyaW5nIHJlcGxhY2VkRGVzY3JpcHRpb24gPSB0aGlzLmRlc2NyaXB0aW9ucy5zZXQoaW5kZXgsIGRlc2NyaXB0aW9uKTsKLQkJCXRoaXMuZmlyZUl0ZW1SZXBsYWNlZChERVNDUklQVElPTlNfTElTVCwgaW5kZXgsIGRlc2NyaXB0aW9uLCByZXBsYWNlZERlc2NyaXB0aW9uKTsKLQkJCXJldHVybiByZXBsYWNlZERlc2NyaXB0aW9uOwotCQl9Ci0JfQotCi0KLQkvLyB0aGlzIGlzIG5vdCBhIHR5cGljYWwgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQljbGFzcyBMb2NhbExpc3RBc3BlY3RBZGFwdGVyIGV4dGVuZHMgTGlzdEFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gewotCi0JCUxvY2FsTGlzdEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FU19MSVNUKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCWlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lcygpOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZGVzY3JpcHRpb25zKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmxpc3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQkJaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQl0aGlzLnN1YmplY3QuYWRkTmFtZShpbmRleCwgKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19MSVNUKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LmFkZERlc2NyaXB0aW9uKGluZGV4LCAoU3RyaW5nKSBpdGVtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMubGlzdE5hbWVzWzBdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEFsbChpbnQgaW5kZXgsIExpc3Q8U3RyaW5nPiBpdGVtcykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgewotCQkJCXRoaXMuYWRkKGluZGV4ICsgaSwgaXRlbXMuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlKGludCBpbmRleCkgewotCQkJaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX0xJU1QpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnJlbW92ZU5hbWUoaW5kZXgpOwotCQkJfSBlbHNlIGlmICh0aGlzLmxpc3ROYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTlNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucmVtb3ZlRGVzY3JpcHRpb24oaW5kZXgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy5saXN0TmFtZXNbMF0pOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIExpc3Q8U3RyaW5nPiByZW1vdmUoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCQlMaXN0PFN0cmluZz4gcmVtb3ZlZEl0ZW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJcmVtb3ZlZEl0ZW1zLmFkZCh0aGlzLnJlbW92ZShpbmRleCkpOwotCQkJfQotCQkJcmV0dXJuIHJlbW92ZWRJdGVtczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgcmVwbGFjZShpbnQgaW5kZXgsIE9iamVjdCBpdGVtKSB7Ci0JCQlpZiAodGhpcy5saXN0TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRVNfTElTVCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3Quc2V0TmFtZShpbmRleCwgKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgaWYgKHRoaXMubGlzdE5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19MSVNUKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zZXREZXNjcmlwdGlvbihpbmRleCwgKFN0cmluZykgaXRlbSk7Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLmxpc3ROYW1lc1swXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5OWFkMy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYWRhcHRlcjsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlZExpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gd3JhcHBlZExpc3Q7Ci0KLQlwdWJsaWMgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3QpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZExpc3RIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy53cmFwcGVkTGlzdC5pdGVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZXMoKSB7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoQmFnPFN0cmluZz4oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCi0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBsaXN0ZW5lcik7Ci0JCWFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgzLCAiam9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDQsICJqYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNSwgImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy53cmFwcGVkTGlzdC5zaXplKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy53cmFwcGVkTGlzdEhvbGRlcik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCWFzc2VydEVxdWFscygiamF6IiwgdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoNSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVkTGlzdEhvbGRlci5yZW1vdmUoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIHN5bmNoQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCS8vIG92ZXJyaWRlIGZhaWx1cmUKLQkJCX0KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDAsICJmb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMSwgImJhciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgyLCAiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDMsICJqb28iKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoNCwgImphciIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCg1LCAiamF6Iik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJqYXoiKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRMaXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRMaXN0LnNpemUoKSk7Ci0KLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2UoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJLy8gb3ZlcnJpZGUgZmFpbHVyZQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQkvLyBvdmVycmlkZSBmYWlsdXJlCi0JCQl9Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgwLCAiZm9vIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDEsICJiYXIiKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMiwgImJheiIpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5hZGFwdGVyLml0ZXJhdG9yKCksICJqb28iKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDIsIExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmFkYXB0ZXIuc2l6ZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscygiam9vIiwgZS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCQlhc3NlcnRFcXVhbHMoMywgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYWRhcHRlci5zaXplKCkpOwotCQkJfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5zZXQoMCwgImpvbyIpOwotCQlhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgc3luY2hDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5hZGQoMCwgImZvbyIpOwotCQl0aGlzLndyYXBwZWRMaXN0SG9sZGVyLmFkZCgxLCAiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuYWRkKDIsICJiYXoiKTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImZvbyIpOwotCQlsaXN0LmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZExpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhsaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5VG9FbXB0eSgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy53cmFwcGVkTGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKGxpc3QpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLQljbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTGlzdEN1cmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWEyNTczLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9MaXN0Q3VyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlYWRPbmx5TGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q3VyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBMaXN0Q3VyYXRvclRlc3RzIAotCWV4dGVuZHMgVGVzdENhc2UgCi17Ci0JcHJpdmF0ZSBUZXN0U3ViamVjdCBzdWJqZWN0MTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyMTsKLQkKLQlwcml2YXRlIExpc3RDdXJhdG9yPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGN1cmF0b3I7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIxOwotCXByaXZhdGUgTGlzdEV2ZW50IGV2ZW50MTsKLQkKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QyOwotCi0JcHVibGljIExpc3RDdXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0MSA9IG5ldyBUZXN0U3ViamVjdCh0aGlzLnN1YmplY3QxTmFtZXMoKSk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5jdXJhdG9yID0gdGhpcy5idWlsZExpc3RDdXJhdG9yKHRoaXMuc3ViamVjdEhvbGRlcjEpOwotCQl0aGlzLmxpc3RlbmVyMSA9IHRoaXMuYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIxKCk7Ci0JCXRoaXMuY3VyYXRvci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQkKLQkJdGhpcy5zdWJqZWN0MiA9IG5ldyBUZXN0U3ViamVjdCh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QxTmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImFscGhhIik7Ci0JCWxpc3QuYWRkKCJicmF2byIpOwotCQlsaXN0LmFkZCgiY2hhcmxpZSIpOwotCQlsaXN0LmFkZCgiZGVsdGEiKTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN1YmplY3QyTmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbGlzdC5hZGQoImVjaG8iKTsKLQkJbGlzdC5hZGQoImZveHRyb3QiKTsKLQkJbGlzdC5hZGQoImdsb3ZlIik7Ci0JCWxpc3QuYWRkKCJob3RlbCIpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0Q3VyYXRvcjxUZXN0U3ViamVjdCwgU3RyaW5nPiBidWlsZExpc3RDdXJhdG9yKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RDdXJhdG9yPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3JGb3JSZWNvcmQoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5zdHJpbmdzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0Q2hhbmdlTGlzdGVuZXIxKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlMaXN0Q3VyYXRvclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChMaXN0RXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0Mk5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmN1cmF0b3IuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDEpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuYWRkU3RyaW5nKCJlY2hvIik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5zaXplKCksICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygiZWNobyIsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBzdHJpbmdzUGx1cyA9IHRoaXMuc3ViamVjdDFOYW1lcygpOwotCQlzdHJpbmdzUGx1cy5hZGQoImVjaG8iKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdDEuYWRkU3RyaW5nKDAsICJ6dWx1Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoInp1bHUiLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlzdHJpbmdzUGx1cy5hZGQoMCwgInp1bHUiKTsKLQkJYXNzZXJ0RXF1YWxzKHN0cmluZ3NQbHVzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MSk7Ci0KLQkJU3RyaW5nIHJlbW92ZWRTdHJpbmcgPSB0aGlzLnN1YmplY3QxLnJlbW92ZVN0cmluZygwKTsJLy8gc2hvdWxkIGJlICJhbHBoYSIKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscyhyZW1vdmVkU3RyaW5nLCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudDEpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlMaXN0PFN0cmluZz4gc3RyaW5nc01pbnVzID0gdGhpcy5zdWJqZWN0MU5hbWVzKCk7Ci0JCXN0cmluZ3NNaW51cy5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQkKLQkJcmVtb3ZlZFN0cmluZyA9IHRoaXMuc3ViamVjdDEucmVtb3ZlU3RyaW5nKDIpOwkvLyBzaG91bGQgYmUgImRlbHRhIgotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3VyYXRvciwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuZXZlbnQxLmdldExpc3ROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQxKS5nZXRJbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJlbW92ZWRTdHJpbmcsICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50MSkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCXN0cmluZ3NNaW51cy5yZW1vdmUoMik7Ci0JCWFzc2VydEVxdWFscyhzdHJpbmdzTWludXMsIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVMaXN0Q2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuY3VyYXRvci5saXN0SXRlcmF0b3IoKSkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQkJCi0JCXRoaXMuc3ViamVjdDEuc2V0U3RyaW5ncyh0aGlzLnN1YmplY3QyTmFtZXMoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jdXJhdG9yLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudDEuZ2V0TGlzdE5hbWUoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBuZXdTdHJpbmdzID0gdGhpcy5zdWJqZWN0Mk5hbWVzKCk7Ci0JCWFzc2VydEVxdWFscyhuZXdTdHJpbmdzLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFBhcnRpYWxMaXN0Q2hhbmdlKCkgewotCQlMaXN0PFN0cmluZz4gc3RhcnRpbmdMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLCBzdGFydGluZ0xpc3QpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQkJCi0JCVN0cmluZyBpZGVudGljYWxTdHJpbmcgPSBzdGFydGluZ0xpc3QuZ2V0KDEpOyAgLy8gc2hvdWxkIGJlICJicmF2byIKLQkJU3RyaW5nIG5vbmlkZW50aWNhbFN0cmluZyA9IHN0YXJ0aW5nTGlzdC5nZXQoMCk7IC8vIHNob3VsZCBiZSAiYWxwaGEiCi0JCUxpc3Q8U3RyaW5nPiBuZXdTdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QobmV3IFN0cmluZ1tdIHtuZXcgU3RyaW5nKCJicmF2byIpLCBuZXcgU3RyaW5nKCJhbHBoYSIpLCAiZWNobyIsICJkZWx0YSIsICJmb3h0cm90In0pOwotCQl0aGlzLnN1YmplY3QxLnNldFN0cmluZ3MobmV3U3RyaW5ncyk7Ci0JCQotCQlMaXN0PFN0cmluZz4gZmluYWxMaXN0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmN1cmF0b3IsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50MS5nZXRMaXN0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1N0cmluZ3MsIGZpbmFsTGlzdCk7Ci0JCWFzc2VydFRydWUoaWRlbnRpY2FsU3RyaW5nID09IGZpbmFsTGlzdC5nZXQoMCkpOwotCQlhc3NlcnRUcnVlKG5vbmlkZW50aWNhbFN0cmluZyAhPSBmaW5hbExpc3QuZ2V0KDEpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc3ViamVjdDEuc3RyaW5ncygpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5jdXJhdG9yLmxpc3RJdGVyYXRvcigpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnN1YmplY3QxTmFtZXMoKS5nZXQoMCksIHRoaXMuc3ViamVjdDEuZ2V0U3RyaW5nKDApKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLmdldCgwKSwgdGhpcy5jdXJhdG9yLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLnN1YmplY3QxLnN0cmluZ3MoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5zdWJqZWN0MU5hbWVzKCkuc2l6ZSgpLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0aGlzLmN1cmF0b3IubGlzdEl0ZXJhdG9yKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuc3ViamVjdDFOYW1lcygpLnNpemUoKSwgdGhpcy5jdXJhdG9yLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5jdXJhdG9yLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQl0aGlzLmN1cmF0b3IucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIyID0gdGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY3VyYXRvci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJdGhpcy5jdXJhdG9yLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY3VyYXRvci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUxpc3RDdXJhdG9yVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTGlzdEN1cmF0b3JUZXN0cy50aGlzLnZhbHVlMUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJbm5lciBDbGFzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBMaXN0PFN0cmluZz4gc3RyaW5nczsKLQkJCi0JCXB1YmxpYyBUZXN0U3ViamVjdCgpIHsKLQkJCXRoaXMuc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGVzdFN1YmplY3QoTGlzdDxTdHJpbmc+IHN0cmluZ3MpIHsKLQkJCXRoaXMoKTsKLQkJCXRoaXMuc2V0U3RyaW5ncyhzdHJpbmdzKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRTdHJpbmcoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5zdHJpbmdzLmdldChpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBzdHJpbmdzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMuc3RyaW5ncyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFkZFN0cmluZyhpbnQgaW5kZXgsIFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuc3RyaW5ncy5hZGQoaW5kZXgsIHN0cmluZyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgYWRkU3RyaW5nKFN0cmluZyBzdHJpbmcpIHsKLQkJCXRoaXMuYWRkU3RyaW5nKHRoaXMuc3RyaW5ncy5zaXplKCksIHN0cmluZyk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgcmVtb3ZlU3RyaW5nKGludCBpbmRleCkgewotCQkJU3RyaW5nIHN0cmluZyA9IHRoaXMuc3RyaW5ncy5nZXQoaW5kZXgpOwotCQkJdGhpcy5yZW1vdmVTdHJpbmcoc3RyaW5nKTsKLQkJCXJldHVybiBzdHJpbmc7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQl0aGlzLnN0cmluZ3MucmVtb3ZlKHN0cmluZyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0U3RyaW5ncyhMaXN0PFN0cmluZz4gc3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHN0cmluZ3MpOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldFN0cmluZ3MoU3RyaW5nW10gc3RyaW5ncykgewotCQkJdGhpcy5zdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qoc3RyaW5ncyk7Ci0JCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmJkOTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1wdWJsaWMgY2xhc3MgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+IGNvbGxlY3Rpb25Ib2xkZXI7Ci0KLQlwdWJsaWMgTnVsbENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyID0gbmV3IE51bGxDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNiYTRhYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvTnVsbExpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsTGlzdFZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9iamVjdD4gbGlzdEhvbGRlcjsKLQotCXB1YmxpYyBOdWxsTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgTnVsbExpc3RWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5saXN0SG9sZGVyLmdldCgwKTsKLQkJfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL051bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWY2NDIyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9OdWxsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5OdWxsUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotcHVibGljIGNsYXNzIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JcHVibGljIE51bGxQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IE51bGxQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydE51bGwodGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YTRlYzYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDE7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gc3ViamVjdEhvbGRlcjE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4gYWExOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDE7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgbXVsdGlwbGVWYWx1ZUV2ZW50OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGN1c3RvbVZhbHVlRXZlbnQ7Ci0KLQotCXB1YmxpYyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KCJmb28iLCAidGVzdCBzdWJqZWN0IDEiKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMSA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+ICh0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCi0JCXRoaXMuc3ViamVjdDIgPSBuZXcgVGVzdFN1YmplY3QoImJhciIsICJ0ZXN0IHN1YmplY3QgMiIpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+IGJ1aWxkQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJLy8gdGhpcyBpcyBub3QgYSBhc3BlY3QgYWRhcHRlciAtIHRoZSB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhc3BlY3QgbmFtZQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnByb3BlcnR5TmFtZXNbMF0gPT0gVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9IGVsc2UgaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTl9QUk9QRVJUWSkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW52YWxpZCBhc3BlY3QgbmFtZTogIiArIHRoaXMucHJvcGVydHlOYW1lc1swXSk7Ci0JCQkJfQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCQl9IGVsc2UgaWYgKHRoaXMucHJvcGVydHlOYW1lc1swXSA9PSBUZXN0U3ViamVjdC5ERVNDUklQVElPTl9QUk9QRVJUWSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImludmFsaWQgYXNwZWN0IG5hbWU6ICIgKyB0aGlzLnByb3BlcnR5TmFtZXNbMF0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHZhbHVlMUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCXRoaXMuZXZlbnQxID0gZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1YmplY3RIb2xkZXIoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUodGhpcy5zdWJqZWN0Mik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQxLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudDEpOwotCi0JCXRoaXMuc3ViamVjdDEuc2V0TmFtZSgiYmF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZXZlbnQxLmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudDEgPSBudWxsOwotCQl0aGlzLnN1YmplY3QxLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudDEuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMuZXZlbnQxLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5ldmVudDEuZ2V0TmV3VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0MS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV2ZW50MS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0aGlzLmV2ZW50MS5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmV2ZW50MS5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5zdWJqZWN0MS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuYWExLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdGFsZVZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc3ViamVjdDEuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmFhMS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcjEpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGhpcy5hYTEuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5hYTEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCXRoaXMuYWExLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLmFhMS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLnN1YmplY3QxLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJdGhpcy5hYTEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpOwotCQl0aGlzLmFhMS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRUcnVlKHRoaXMuYWExLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc3ViamVjdDEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSkpOwotCQl0aGlzLmFhMS5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnN1YmplY3QxLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXNwZWN0QWRhcHRlcigpIHsKLQkJVGVzdFN1YmplY3QgdGVzdFN1YmplY3QgPSBuZXcgVGVzdFN1YmplY3QoImZyZWQiLCAiaHVzYmFuZCIpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gdGVzdFN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0ZXN0U3ViamVjdCk7Ci0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdGVzdEFBID0gdGhpcy5idWlsZE11bHRpcGxlQXNwZWN0QWRhcHRlcih0ZXN0U3ViamVjdEhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGVzdExpc3RlbmVyID0gdGhpcy5idWlsZE11bHRpcGxlVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0ZXN0QUEuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRlc3RMaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygiZnJlZDpodXNiYW5kIiwgdGVzdEFBLmdldFZhbHVlKCkpOwotCi0JCXRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50ID0gbnVsbDsKLQkJdGVzdFN1YmplY3Quc2V0TmFtZSgid2lsbWEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTpodXNiYW5kIiwgdGVzdEFBLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQ6aHVzYmFuZCIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hOmh1c2JhbmQiLCB0aGlzLm11bHRpcGxlVmFsdWVFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQotCQl0aGlzLm11bHRpcGxlVmFsdWVFdmVudCA9IG51bGw7Ci0JCXRlc3RTdWJqZWN0LnNldERlc2NyaXB0aW9uKCJ3aWZlIik7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6d2lmZSIsIHRlc3RBQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ3aWxtYTpodXNiYW5kIiwgdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWE6d2lmZSIsIHRoaXMubXVsdGlwbGVWYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE11bHRpcGxlQXNwZWN0QWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIFN0cmluZz4oc3ViamVjdEhvbGRlciwgVGVzdFN1YmplY3QuTkFNRV9QUk9QRVJUWSwgVGVzdFN1YmplY3QuREVTQ1JJUFRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKSArICI6IiArIHRoaXMuc3ViamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZE11bHRpcGxlVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVByb3BlcnR5QXNwZWN0QWRhcHRlclRlc3RzLnRoaXMubXVsdGlwbGVWYWx1ZUNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBtdWx0aXBsZVZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5tdWx0aXBsZVZhbHVlRXZlbnQgPSBlOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBidWcgd2hlcmUgd2Ugd291bGQgY2FsbCAjYnVpbGRWYWx1ZSgpIGluCi0JICogI2VuZ2FnZU5vbk51bGxTdWJqZWN0KCksIHdoZW4gd2UgbmVlZGVkIHRvIGNhbGwKLQkgKiBpdCBpbiAjZW5nYWdlU3ViamVjdCgpLCBzbyB0aGUgY2FjaGVkIHZhbHVlIHdvdWxkCi0JICogYmUgcmVidWlsdCB3aGVuIHRoZSB0aGlzLnN1YmplY3Qgd2FzIHNldCB0byBudWxsCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUJ1aWxkVmFsdWVXaXRoTnVsbFN1YmplY3QoKSB7Ci0JCVRlc3RTdWJqZWN0IGN1c3RvbVN1YmplY3QgPSBuZXcgVGVzdFN1YmplY3QoImZyZWQiLCAibGFib3JlciIpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0U3ViamVjdD4gY3VzdG9tU3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+KGN1c3RvbVN1YmplY3QpOwotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGN1c3RvbUFBID0gdGhpcy5idWlsZEN1c3RvbUFzcGVjdEFkYXB0ZXIoY3VzdG9tU3ViamVjdEhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY3VzdG9tTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ3VzdG9tVmFsdWVDaGFuZ2VMaXN0ZW5lcigpOwotCQljdXN0b21BQS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgY3VzdG9tTGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoImZyZWQiLCBjdXN0b21BQS5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmN1c3RvbVZhbHVlRXZlbnQgPSBudWxsOwotCQljdXN0b21TdWJqZWN0LnNldE5hbWUoIndpbG1hIik7Ci0JCWFzc2VydEVxdWFscygid2lsbWEiLCBjdXN0b21BQS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmcmVkIiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIndpbG1hIiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCi0JCXRoaXMuY3VzdG9tVmFsdWVFdmVudCA9IG51bGw7Ci0JCWN1c3RvbVN1YmplY3RIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRoaXMgd291bGQgZmFpbCAtIHRoZSB2YWx1ZSB3b3VsZCBiZSBudWxsLi4uCi0JCWFzc2VydEVxdWFscygiPHVubmFtZWQ+IiwgY3VzdG9tQUEuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygid2lsbWEiLCB0aGlzLmN1c3RvbVZhbHVlRXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiPHVubmFtZWQ+IiwgdGhpcy5jdXN0b21WYWx1ZUV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgYSBidWc6Ci0JICogSWYgdHdvIGxpc3RlbmVycyB3ZXJlIGFkZGVkIHRvIGFuIGFzcGVjdCBhZGFwdGVyLCBvbmUgd2l0aCBhbgotCSAqIGFzcGVjdCBuYW1lIGFuZCBvbmUgd2l0aG91dCwgdGhlIGFzcGVjdCBhZGFwdGVyIHdvdWxkIGFkZCBpdHMKLQkgKiAnc3ViamVjdENoYW5nZUxpc3RlbmVyJyB0byBpdHMgJ3N1YmplY3RIb2xkZXInIHR3aWNlLiBBcyBhIHJlc3VsdCwKLQkgKiB0aGUgZm9sbG93aW5nIGNvZGUgd2lsbCB0cmlnZ2VyIGFuIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIGlmIHRoZSBidWcgaXMgcHJlc2VudDsgb3RoZXJ3aXNlLCBpdCBjb21wbGV0ZXMgc2lsZW50bHkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUxpc3RlbmVyKCkgewotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFhMS5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEN1c3RvbUFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RTdWJqZWN0LCBTdHJpbmc+KHN1YmplY3RIb2xkZXIsIFRlc3RTdWJqZWN0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gIjx1bm5hbWVkPiIgOiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEN1c3RvbVZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXJUZXN0cy50aGlzLmN1c3RvbVZhbHVlQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGN1c3RvbVZhbHVlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJdGhpcy5jdXN0b21WYWx1ZUV2ZW50ID0gZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVzdCBtb2RlbCAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1BST1BFUlRZID0gImRlc2NyaXB0aW9uIjsKLQkKLQkJcHVibGljIFRlc3RTdWJqZWN0KFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmRlc2NyaXB0aW9uOwotCQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFU0NSSVBUSU9OX1BST1BFUlRZLCBvbGQsIGRlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZjRjZGQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5MaXN0TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRWYWx1ZUhvbGRlcjsKLQotCXB1YmxpYyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCXRoaXMuYWRhcHRlciA9IG5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZFZhbHVlSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiB3cmFwcGVkQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKG5ldyBTaW5nbGVFbGVtZW50SXRlcmF0b3I8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5nZXRWYWx1ZSgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGFkYXB0ZXJDb2xsZWN0aW9uID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5hZGFwdGVyLml0ZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYWRhcHRlckNvbGxlY3Rpb24uc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24oKSwgYWRhcHRlckNvbGxlY3Rpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFkYXB0ZXJDb2xsZWN0aW9uLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9OwotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBhZGFwdGVyQ29sbGVjdGlvbiA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJDb2xsZWN0aW9uLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uKCksIGFkYXB0ZXJDb2xsZWN0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyQ29sbGVjdGlvbi5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEhhc2hCYWc8U3RyaW5nPigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0KLQkJdGhpcy5hZGFwdGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckNvbGxlY3Rpb24gPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyQ29sbGVjdGlvbi5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbigpLCBhZGFwdGVyQ29sbGVjdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckNvbGxlY3Rpb24uaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDb29yZGluYXRlZEJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBzeW5jaENvbGxlY3Rpb24pOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuYWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmFkYXB0ZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlZFRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlZEZyb21FbXB0eVRvRW1wdHkoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCQotCXN0YXRpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1Byb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwY2ZlNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhZGFwdGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB3cmFwcGVkVmFsdWVIb2xkZXI7Ci0KLQlwdWJsaWMgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCQl0aGlzLmFkYXB0ZXIgPSBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLndyYXBwZWRWYWx1ZUhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gd3JhcHBlZExpc3QoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdChuZXcgU2luZ2xlRWxlbWVudEl0ZXJhdG9yPFN0cmluZz4odGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlhc3NlcnRGYWxzZSh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUxpc3Q8U3RyaW5nPiBhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRMaXN0KCksIGFkYXB0ZXJMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEludCgpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLmFkYXB0ZXIuZ2V0KDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9BcnJheTEoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCU9iamVjdFtdIGFycmF5ID0gdGhpcy5hZGFwdGVyLnRvQXJyYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhcnJheVswXSk7Ci0JCWFzc2VydEVxdWFscygxLCBhcnJheS5sZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb0FycmF5MigpIHsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpKTsKLQkJT2JqZWN0W10gYXJyYXkgPSB0aGlzLmFkYXB0ZXIudG9BcnJheSgpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXJyYXkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZSgpIHsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZXZlbnQpIHsvKiBPSyAqL30KLQkJfTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCUxpc3Q8U3RyaW5nPiBhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRMaXN0KCksIGFkYXB0ZXJMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhZGFwdGVyTGlzdC5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdGhpcy5hZGFwdGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhZGFwdGVyTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuYWRhcHRlci5pdGVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGFkYXB0ZXJMaXN0LnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgYWRhcHRlckxpc3QpOwotCi0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYWRhcHRlckxpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmFkYXB0ZXIuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhZGFwdGVyTGlzdC5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkTGlzdCgpLCBhZGFwdGVyTGlzdCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYWRhcHRlckxpc3QuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgY2wgPSBuZXcgQ2hhbmdlQWRhcHRlcigpOwotCQl0aGlzLmFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuYWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihjbCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5hZGFwdGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkVG9FbXB0eSgpIHsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJdGhpcy53cmFwcGVkVmFsdWVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2VkRnJvbUVtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgey8qIE9LICovfQotCQl9KTsKLQkJSkxpc3Qgakxpc3QgPSBuZXcgSkxpc3QobmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5hZGFwdGVyKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlbUNoYW5nZWQoKSB7Ci0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKCJmb28iKTsKLQkJdGhpcy5hZGFwdGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGV2ZW50KSB7LyogT0sgKi99Ci0JCX0pOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpMaXN0LmdldE1vZGVsKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqTGlzdC5nZXRNb2RlbCgpLmdldEVsZW1lbnRBdCgwKSk7Ci0JCQotCQl0aGlzLndyYXBwZWRWYWx1ZUhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygxLCBqTGlzdC5nZXRNb2RlbCgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgakxpc3QuZ2V0TW9kZWwoKS5nZXRFbGVtZW50QXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZWRGcm9tRW1wdHlUb0VtcHR5KCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RlbmVyKCkpOwotCQlKTGlzdCBqTGlzdCA9IG5ldyBKTGlzdChuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmFkYXB0ZXIpKTsKLQkJCi0JCXRoaXMud3JhcHBlZFZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgakxpc3QuZ2V0TW9kZWwoKS5nZXRTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3MgKioqKioqKioqKgotCQotCXN0YXRpYyBjbGFzcyBUZXN0TGlzdGVuZXIgaW1wbGVtZW50cyBMaXN0Q2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBldmVudCkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1JlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4ZjZlOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMgCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBvYmplY3RIb2xkZXI7Ci0JCi0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gd3JhcHBlck9iamVjdEhvbGRlcjsKLQkKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IHdyYXBwZXJFdmVudDsKLQkKLQkKLQlwdWJsaWMgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCQl0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIgPSBuZXcgUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLm9iamVjdEhvbGRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB7Ci0JCWJvb2xlYW4gZXhjZXB0aW9uT2NjdXJyZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmFyIik7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHVvZSkgewotCQkJZXhjZXB0aW9uT2NjdXJyZWQgPSB0cnVlOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGV4Y2VwdGlvbk9jY3VycmVkKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5TGlzdGVuaW5nKCkgewotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gYnVpbGRXcmFwcGVyTGlzdGVuZXIoKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQkKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5vYmplY3RIb2xkZXIpLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRXcmFwcGVyTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTIoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCXRoaXMud3JhcHBlck9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZFdyYXBwZXJMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVByb3BlcnR5Q2hhbmdlcygpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMud3JhcHBlckV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl2ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJdmVyaWZ5RXZlbnQodGhpcy53cmFwcGVyRXZlbnQsIHRoaXMud3JhcHBlck9iamVjdEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLndyYXBwZXJFdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl2ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgImJhciIsIG51bGwpOwotCQl2ZXJpZnlFdmVudCh0aGlzLndyYXBwZXJFdmVudCwgdGhpcy53cmFwcGVyT2JqZWN0SG9sZGVyLCAiYmFyIiwgbnVsbCk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy53cmFwcGVyRXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCBudWxsLCAiZm9vIik7Ci0JCXZlcmlmeUV2ZW50KHRoaXMud3JhcHBlckV2ZW50LCB0aGlzLndyYXBwZXJPYmplY3RIb2xkZXIsIG51bGwsICJmb28iKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCVJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFdyYXBwZXJMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy50aGlzLndyYXBwZXJFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KFByb3BlcnR5Q2hhbmdlRXZlbnQgZSwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkZmI3ZC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlcjsKLQlDb2xsZWN0aW9uQWRkRXZlbnQgYWRkRXZlbnQ7Ci0JQ29sbGVjdGlvblJlbW92ZUV2ZW50IHJlbW92ZUV2ZW50OwotCUNvbGxlY3Rpb25DbGVhckV2ZW50IGNvbGxlY3Rpb25DbGVhcmVkRXZlbnQ7Ci0JQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc2V0SG9sZGVyOwotCUNvbGxlY3Rpb25BZGRFdmVudCBzZXRBZGRFdmVudDsKLQlDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgc2V0UmVtb3ZlRXZlbnQ7Ci0JQ29sbGVjdGlvbkNsZWFyRXZlbnQgc2V0Q2xlYXJlZEV2ZW50OwotCUNvbGxlY3Rpb25DaGFuZ2VFdmVudCBzZXRDaGFuZ2VkRXZlbnQ7Ci0KLQlwdWJsaWMgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkQ29sbGVjdGlvbigpKTsKLQkJdGhpcy5zZXRIb2xkZXIgPSBuZXcgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJY29sbGVjdGlvbi5hZGQoImZvbyIpOwotCQljb2xsZWN0aW9uLmFkZCgiZm9vIik7Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCi0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iLCAiYmFyIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeSh0aGlzLnNldEhvbGRlciwgImZvbyIsICJiYXIiKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIiwgImZvbyIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iLCAiYmFyIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb28iKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJmb28iKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCXRoaXMudmVyaWZ5KHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMuY29sbGVjdGlvbkhvbGRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJLy8gYWRkIGEgbGlzdGVuZXIgdG8gImFjdGl2YXRlIiB0aGUgd3JhcHBlcgotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkU2V0Q2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuY29sbGVjdGlvbkhvbGRlci5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5zZXRIb2xkZXIuc2l6ZSgpKTsKLQotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2V0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bGtDaGFuZ2UoKSB7Ci0JCS8vIGFkZCBhIGxpc3RlbmVyIHRvICJhY3RpdmF0ZSIgdGhlIHdyYXBwZXIKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldENoYW5nZUxpc3RlbmVyKCkpOwotCi0JCUNvbGxlY3Rpb248U3RyaW5nPiBuZXdDb2xsZWN0aW9uID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImZveCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0KLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm94IiwgImZveCIsICJiYXQiKTsKLQkJdGhpcy52ZXJpZnkodGhpcy5zZXRIb2xkZXIsICJmb3giLCAiYmF0Iik7Ci0JfQkJCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RlbmluZygpIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNldEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzTm9Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuY29sbGVjdGlvbkhvbGRlcikuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQkJdGhpcy5zZXRIb2xkZXIucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5jb2xsZWN0aW9uSG9sZGVyKS5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV2ZW50czEoKSB7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRTZXRDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlFdmVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXZlbnRzMigpIHsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRTZXRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnRzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRXZlbnRzKCkgewotCQl0aGlzLmFkZEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5yZW1vdmVFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNsZWFyZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0QWRkRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldFJlbW92ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRDbGVhcmVkRXZlbnQgPSBudWxsOwotCQl0aGlzLnNldENoYW5nZWRFdmVudCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50cygpIHsKLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldEFkZEV2ZW50LCB0aGlzLnNldEhvbGRlciwgImJhciIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5yZW1vdmVFdmVudCwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLCAiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRSZW1vdmVFdmVudCk7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJiYXIiKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEFkZEV2ZW50KTsKLQotCQl0aGlzLmNsZWFyRXZlbnRzKCk7Ci0JCXRoaXMuY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMucmVtb3ZlRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0UmVtb3ZlRXZlbnQsIHRoaXMuc2V0SG9sZGVyLCAiZm9vIik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmFkZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIsICJmb28iKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldEFkZEV2ZW50LCB0aGlzLnNldEhvbGRlciwgImZvbyIpOwotCi0JCXRoaXMuY2xlYXJFdmVudHMoKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLmNsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50LCB0aGlzLmNvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuc2V0Q2xlYXJlZEV2ZW50LCB0aGlzLnNldEhvbGRlcik7Ci0KLQkJdGhpcy5jbGVhckV2ZW50cygpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gbmV3Q29sbGVjdGlvbiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiZm94Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJmb3giKTsKLQkJbmV3Q29sbGVjdGlvbi5hZGQoImJhdCIpOwotCQluZXdDb2xsZWN0aW9uLmFkZCgiYmF0Iik7Ci0JCW5ld0NvbGxlY3Rpb24uYWRkKCJiYXQiKTsKLQkJdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNldFZhbHVlcyhuZXdDb2xsZWN0aW9uKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQsIHRoaXMuY29sbGVjdGlvbkhvbGRlciwgImZveCIsICJmb3giLCAiYmF0IiwgImJhdCIsICJiYXQiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnNldENoYW5nZWRFdmVudCwgdGhpcy5zZXRIb2xkZXIsICJmb3giLCAiYmF0Iik7Ci0JCQotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5jb2xsZWN0aW9uQ2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuY29sbGVjdGlvbkNoYW5nZWRFdmVudCA9IGV2ZW50OwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5hZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnJlbW92ZUV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DbGVhcmVkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFNldENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRBZGRFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRSZW1vdmVFdmVudCA9IGV2ZW50OwotCQkJfQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2hhbmdlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFNldENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJU2V0Q29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEFkZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0UmVtb3ZlRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZXZlbnQpIHsKLQkJCQlTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0Q2xlYXJlZEV2ZW50ID0gZXZlbnQ7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCVNldENvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRDaGFuZ2VkRXZlbnQgPSBldmVudDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5KENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY3ZtLCBTdHJpbmcuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlCYWc8U3RyaW5nPiBhY3R1YWwgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKGN2bSk7Ci0JCUJhZzxTdHJpbmc+IGV4cGVjdGVkID0gQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQsIE9iamVjdCBzb3VyY2UsIE9iamVjdC4uLiBleHBlY3RlZEl0ZW1zKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMuYmFnKGV4cGVjdGVkSXRlbXMpLCBDb2xsZWN0aW9uVG9vbHMuYmFnKGV2ZW50LmdldEl0ZW1zKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlLCBPYmplY3QuLi4gZXhwZWN0ZWRJdGVtcykgewotCQlhc3NlcnRFcXVhbHMoc291cmNlLCBldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIGV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmJhZyhleHBlY3RlZEl0ZW1zKSwgQ29sbGVjdGlvblRvb2xzLmJhZyhldmVudC5nZXRJdGVtcygpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50LCBPYmplY3Qgc291cmNlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgZXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCwgT2JqZWN0IHNvdXJjZSwgT2JqZWN0Li4uIGV4cGVjdGVkSXRlbXMpIHsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBldmVudC5nZXRDb2xsZWN0aW9uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5iYWcoZXhwZWN0ZWRJdGVtcyksIENvbGxlY3Rpb25Ub29scy5iYWcoZXZlbnQuZ2V0Q29sbGVjdGlvbigpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNlNGE3MC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBiYWdIb2xkZXI7Ci0JQ29sbGVjdGlvbkV2ZW50IGJhZ0V2ZW50OwotCVN0cmluZyBiYWdFdmVudFR5cGU7Ci0KLQlwcml2YXRlIFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gc2V0SG9sZGVyOwotCUNvbGxlY3Rpb25FdmVudCBzZXRFdmVudDsKLQlTdHJpbmcgc2V0RXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hBTkdFID0gImNoYW5nZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSID0gImNsZWFyIjsKLQotCQotCXB1YmxpYyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYmFnSG9sZGVyID0gbmV3IFNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZEJhZygpKTsKLQkJdGhpcy5zZXRIb2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkU2V0KCkpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRCYWcoKSB7Ci0JCUJhZzxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJdGhpcy5hZGRJdGVtc1RvKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBidWlsZFNldCgpIHsKLQkJU2V0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQl0aGlzLmFkZEl0ZW1zVG8ocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSXRlbXNUbyhDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgiZm9vIik7Ci0JCWMuYWRkKCJiYXIiKTsKLQkJYy5hZGQoImJheiIpOwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRBZGRJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJqb28iKTsKLQkJcmVzdWx0LmFkZCgiamFyIik7Ci0JCXJlc3VsdC5hZGQoImpheiIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQmFnPFN0cmluZz4gYnVpbGRSZW1vdmVJdGVtcygpIHsKLQkJQmFnPFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZyh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkU2V0KCksIENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZEJhZygpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5idWlsZFNldCgpLnNpemUoKSwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5zZXRIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuYmFnSG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzZXRIb2xkZXJDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBiYWdIb2xkZXJDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmJhZ0hvbGRlci5pdGVyYXRvcigpLCBpdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQWxsKENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zQWxsKHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYmFnSG9sZGVyQ29udGFpbnNBbnkoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCUJhZzxTdHJpbmc+IGJhZyA9IENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5iYWdIb2xkZXIuaXRlcmF0b3IoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGl0ZW1zKSB7Ci0JCQlpZiAoYmFnLmNvbnRhaW5zKHN0cmluZykpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNldEhvbGRlckNvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMuc2V0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKFN0cmluZyBzdHJpbmcgOiBpdGVtcykgewotCQkJaWYgKHNldC5jb250YWlucyhzdHJpbmcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0KLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqb28iKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnNBbGwodGhpcy5idWlsZEFkZEl0ZW1zKCkpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRBZGRJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZEFsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkQWRkSXRlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5iYWdIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImJhciIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBbGwoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWluc0FsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSkpOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmVBbGwodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zQW55KHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zQWxsKHRoaXMuYnVpbGRSZW1vdmVJdGVtcygpKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZUFsbCh0aGlzLmJ1aWxkUmVtb3ZlSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnNBbnkodGhpcy5idWlsZFJlbW92ZUl0ZW1zKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVzKCkgewotCQlhc3NlcnRUcnVlKHRoaXMuYmFnSG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXModGhpcy5idWlsZEFkZEl0ZW1zKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCXRoaXMuYmFnSG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5iYWdIb2xkZXIucmVtb3ZlKG51bGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJhZ0hvbGRlckNvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLmJhZ0hvbGRlci5zZXRWYWx1ZXMobmV3IEhhc2hCYWc8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5iYWdIb2xkZXJDb250YWlucygiamFyIikpOwotCi0JCWFzc2VydFRydWUodGhpcy5zZXRIb2xkZXJDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQWRkSXRlbXMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUobnVsbCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2V0SG9sZGVyQ29udGFpbnMobnVsbCkpOwotCi0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyhuZXcgSGFzaEJhZzxTdHJpbmc+KCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNldEhvbGRlckNvbnRhaW5zKCJqYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb25DaGFuZ2UxKCkgewotCQl0aGlzLmJhZ0hvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkQmFnTGlzdGVuZXIoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnQ2hhbmdlKCk7Ci0KLQkJdGhpcy5zZXRIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFNldExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVNldENoYW5nZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlMigpIHsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5idWlsZEJhZ0xpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0NoYW5nZSgpOwotCi0JCXRoaXMuc2V0SG9sZGVyLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYnVpbGRTZXRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlTZXRDaGFuZ2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnQ2hhbmdlKCkgewotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQoImZvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KEFERCwgImZvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCAiZm9vIik7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChBREQsICJqb28iKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5hZGQobnVsbCk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQURELCBudWxsKTsKLQotCQl0aGlzLmJhZ0V2ZW50ID0gbnVsbDsKLQkJdGhpcy5iYWdFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmJhZ0hvbGRlci5yZW1vdmUoImpvbyIpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KFJFTU9WRSwgImpvbyIpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLnJlbW92ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlCYWdFdmVudChSRU1PVkUsIG51bGwpOwotCi0JCXRoaXMuYmFnRXZlbnQgPSBudWxsOwotCQl0aGlzLmJhZ0V2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuYmFnSG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkQmFnKCkpOwotCQl0aGlzLnZlcmlmeUJhZ0V2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5iYWdFdmVudCA9IG51bGw7Ci0JCXRoaXMuYmFnRXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5iYWdIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRCYWcoKSk7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRCYWcoKSwgQ29sbGVjdGlvblRvb2xzLmJhZygoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5iYWdFdmVudCkuZ2V0SXRlbXMoKSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlTZXRDaGFuZ2UoKSB7Ci0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoQURELCAiam9vIik7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnNldEV2ZW50VHlwZSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KEFERCwgbnVsbCk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMuc2V0RXZlbnRUeXBlKTsKLQotCQl0aGlzLnNldEV2ZW50ID0gbnVsbDsKLQkJdGhpcy5zZXRFdmVudFR5cGUgPSBudWxsOwotCQl0aGlzLnNldEhvbGRlci5yZW1vdmUoImpvbyIpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KFJFTU9WRSwgImpvbyIpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZSgiam9vIik7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnJlbW92ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlTZXRFdmVudChSRU1PVkUsIG51bGwpOwotCi0JCXRoaXMuc2V0RXZlbnQgPSBudWxsOwotCQl0aGlzLnNldEV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMuc2V0SG9sZGVyLnNldFZhbHVlcyh0aGlzLmJ1aWxkU2V0KCkpOwotCQl0aGlzLnZlcmlmeVNldEV2ZW50KENIQU5HRSk7Ci0KLQkJdGhpcy5zZXRFdmVudCA9IG51bGw7Ci0JCXRoaXMuc2V0RXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5zZXRIb2xkZXIuYWRkQWxsKHRoaXMuYnVpbGRTZXQoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5zZXRFdmVudFR5cGUpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRCYWdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBlKSB7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50VHlwZSA9IEFERDsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0xFQVI7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmJhZ0V2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuYmFnRXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5iYWdFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZFNldExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBSRU1PVkU7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2V0RXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMudGhpcy5zZXRFdmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnNldEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5QmFnRXZlbnQoU3RyaW5nIGV2ZW50VHlwZSkgewotCQlhc3NlcnRFcXVhbHMoZXZlbnRUeXBlLCB0aGlzLmJhZ0V2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJhZ0hvbGRlciwgdGhpcy5iYWdFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuYmFnRXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUJhZ0V2ZW50KFN0cmluZyBldmVudFR5cGUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5QmFnRXZlbnQoZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZ2V0QmFnRXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldEJhZ0V2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLmJhZ0V2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuYmFnRXZlbnQpLmdldEl0ZW1zKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5iYWdFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLmJhZ0V2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5U2V0RXZlbnQoU3RyaW5nIGV2ZW50VHlwZSkgewotCQlhc3NlcnRFcXVhbHMoZXZlbnRUeXBlLCB0aGlzLnNldEV2ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnNldEhvbGRlciwgdGhpcy5zZXRFdmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMuc2V0RXZlbnQuZ2V0Q29sbGVjdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeVNldEV2ZW50KFN0cmluZyBldmVudFR5cGUsIE9iamVjdCBpdGVtKSB7Ci0JCXRoaXMudmVyaWZ5U2V0RXZlbnQoZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW0sIHRoaXMuZ2V0U2V0RXZlbnRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPD8+IGdldFNldEV2ZW50SXRlbXMoKSB7Ci0JCWlmICh0aGlzLnNldEV2ZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbkFkZEV2ZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuc2V0RXZlbnQpLmdldEl0ZW1zKCk7Ci0JCX0gZWxzZSBpZiAodGhpcy5zZXRFdmVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb25SZW1vdmVFdmVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvblJlbW92ZUV2ZW50KSB0aGlzLnNldEV2ZW50KS5nZXRJdGVtcygpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGRiODExLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0JTGlzdEV2ZW50IGV2ZW50OwotCVN0cmluZyBldmVudFR5cGU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREID0gImFkZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTU9WRSA9ICJyZW1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBMQUNFID0gInJlcGxhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNT1ZFID0gIm1vdmUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBUiA9ICJjbGVhciI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQU5HRSA9ICJjaGFuZ2UiOwotCi0JCi0JcHVibGljIFNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5saXN0SG9sZGVyID0gbmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5idWlsZExpc3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImpvbyIpOwotCQlyZXN1bHQuYWRkKCJqYXIiKTsKLQkJcmVzdWx0LmFkZCgiamF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFJlbW92ZUxpc3QoKSB7Ci0vLwkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotLy8JCXJlc3VsdC5hZGQoImZvbyIpOwotLy8JCXJlc3VsdC5hZGQoImJhciIpOwotLy8JCXJldHVybiByZXN1bHQ7Ci0vLwl9Ci0vLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9ySW50KCkgewotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5idWlsZExpc3QoKS5saXN0SXRlcmF0b3IoMSkpLCBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKDEpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkTGlzdCgpLnNpemUoKSwgdGhpcy5saXN0SG9sZGVyLnNpemUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWlucyhPYmplY3QgaXRlbSkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSwgaXRlbSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxpc3RDb250YWluc0FsbChDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWluc0FsbCh0aGlzLmxpc3RIb2xkZXIubGlzdEl0ZXJhdG9yKCksIGl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGlzdENvbnRhaW5zQW55KENvbGxlY3Rpb248U3RyaW5nPiBpdGVtcykgewotCQlTZXQ8U3RyaW5nPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KHRoaXMubGlzdEhvbGRlci5pdGVyYXRvcigpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IGl0ZW1zLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJaWYgKHNldC5jb250YWlucyhzdHJlYW0ubmV4dCgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT2JqZWN0KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKCJqb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiam9vIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEludE9iamVjdCgpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMoImpvbyIpKTsKLQotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMCwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwodGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGxJbnRDb2xsZWN0aW9uKCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWluc0FueSh0aGlzLmJ1aWxkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMiwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnNBbGwodGhpcy5idWlsZEFkZExpc3QoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5jbGVhcigpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdEhvbGRlci5pc0VtcHR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluc09iamVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RIb2xkZXIuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zKCJqb28iKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5zQWxsQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJYy5hZGQoImZvbyIpOwotCQljLmFkZCgiYmFyIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmNvbnRhaW5zQWxsKGMpKTsKLQotCQljLmFkZCgiam9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5jb250YWluc0FsbChjKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpLCB0aGlzLmxpc3RIb2xkZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRBZGRMaXN0KCkpKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdEhvbGRlci5lcXVhbHModGhpcy5idWlsZExpc3QoKSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuZXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMubGlzdEhvbGRlci5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMubGlzdEhvbGRlci5nZXQoMSkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMubGlzdEhvbGRlci5nZXQoMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRMaXN0KCkpLmhhc2hDb2RlKCksIHRoaXMubGlzdEhvbGRlci5oYXNoQ29kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZk9iamVjdCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5pbmRleE9mKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5saXN0SG9sZGVyLmluZGV4T2YoImJheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmxpc3RIb2xkZXIuaW5kZXhPZigiam9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXN0SW5kZXhPZk9iamVjdCgpIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiZm9vIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5saXN0SG9sZGVyLmxhc3RJbmRleE9mKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImJheiIpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB0aGlzLmxpc3RIb2xkZXIubGFzdEluZGV4T2YoImpvbyIpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRoaXMubGlzdEhvbGRlci5sYXN0SW5kZXhPZigiZm9vIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RIb2xkZXIuaXNFbXB0eSgpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0SG9sZGVyLmlzRW1wdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKHRoaXMuYnVpbGRMaXN0KCkuaW5kZXhPZigiYmFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlcygpIHsKLQkJTGlzdDxTdHJpbmc+IG5ld0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJbmV3TGlzdC5hZGQoImpvbyIpOwotCQluZXdMaXN0LmFkZCgiamFyIik7Ci0JCW5ld0xpc3QuYWRkKCJqYXoiKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5zZXRMaXN0VmFsdWVzKG5ld0xpc3QpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3RDb250YWlucygiYmFyIikpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0KLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgxLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKG51bGwpKTsKLQotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyhuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdENvbnRhaW5zKCJqYXIiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RDaGFuZ2UxKCkgewotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZENoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZTIoKSB7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgImpvbyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsICJqb28iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuc2V0TGlzdFZhbHVlcyh0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChDSEFOR0UpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMCwgdGhpcy5idWlsZExpc3QoKSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQUREKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgImpvbyIpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQUREOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBNT1ZFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IENMRUFSOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBBREQ7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBSRVBMQUNFOwotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IE1PVkU7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlTaW1wbGVMaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCVNpbXBsZUxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDSEFOR0U7Ci0JCQkJU2ltcGxlTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUpIHsKLQkJYXNzZXJ0RXF1YWxzKGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdEhvbGRlciwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5ldmVudC5nZXRMaXN0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIGUsIGludCBpbmRleCwgT2JqZWN0IGl0ZW0pIHsKLQkJdGhpcy52ZXJpZnlFdmVudChlKTsKLQkJaWYgKGUgPT0gQUREKSB7Ci0JCQlhc3NlcnRFcXVhbHMoaW5kZXgsICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJbmRleCgpKTsKLQkJCWFzc2VydEVxdWFscyhpdGVtLCAoKExpc3RBZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCX0gZWxzZSBpZiAoZSA9PSBSRU1PVkUpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdFJlbW92ZUV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmNjFkNS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG9iamVjdEhvbGRlcjsKLQlQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50OwotCi0JCi0JcHVibGljIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMub2JqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCJmb28iKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZSgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5vYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMSgpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeVByb3BlcnR5Q2hhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnR5Q2hhbmdlMigpIHsKLQkJdGhpcy5vYmplY3RIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcm9wZXJ0eUNoYW5nZSgpIHsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgiZm9vIiwgImJhciIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgiYmFyIiwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCAiYmF6Iik7Ci0JfQotCi0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5ldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhvbGRWYWx1ZSwgdGhpcy5ldmVudC5nZXRPbGRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLmV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2MDdlOC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmV2ZXJzZUNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXI7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uSG9sZGVyOwotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHdyYXBwZWRDb2xsZWN0aW9uOwotCi0JCi0JcHVibGljIFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb24gPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uKTsKLQkJdGhpcy5hZGFwdGVyID0gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdChleHBlY3RlZCwgYWN0dWFsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdChDb2xsZWN0aW9uPFN0cmluZz4gZXhwZWN0ZWQsIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYWN0dWFsLCBDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlDb2xsZWN0aW9uPFN0cmluZz4gc29ydGVkU2V0ID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihjb21wYXJhdG9yKTsKLQkJc29ydGVkU2V0LmFkZEFsbChleHBlY3RlZCk7Ci0JCUxpc3Q8U3RyaW5nPiBleHBlY3RlZExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc29ydGVkU2V0KTsKLQkJTGlzdDxTdHJpbmc+IGFjdHVhbExpc3QgPSBDb2xsZWN0aW9uVG9vbHMubGlzdChhY3R1YWwuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZExpc3QsIGFjdHVhbExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCXRoaXMuYWRhcHRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIG5ldyBUZXN0TGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7LyogT0sgKi99Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7LyogT0sgKi99Ci0JCX0pOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoMywgdGhpcy5hZGFwdGVyLnNpemUoKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCB0aGlzLmFkYXB0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiZm9vIikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXoiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpvbyIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamFyIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHN5bmNoTGlzdC5pdGVyYXRvcigpKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBzeW5jaENvbGxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuYWRhcHRlcik7Ci0JCUJhZzxTdHJpbmc+IHN5bmNoQ29sbGVjdGlvbiA9IG5ldyBDb29yZGluYXRlZEJhZzxTdHJpbmc+KHRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZm9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJiYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiam9vIik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqYXIiKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImpheiIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFN5bmNoKCkgewotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJmb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJqYXoiKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy53cmFwcGVkQ29sbGVjdGlvbi5jb250YWlucygiamF6IikpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMud3JhcHBlZENvbGxlY3Rpb24uc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgdGhpcy5hZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGFyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmFkYXB0ZXIpOwotCQlCYWc8U3RyaW5nPiBzeW5jaENvbGxlY3Rpb24gPSBuZXcgQ29vcmRpbmF0ZWRCYWc8U3RyaW5nPih0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMud3JhcHBlZENvbGxlY3Rpb24uY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImJhciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiYmF6Iik7Ci0JCXRoaXMud3JhcHBlZENvbGxlY3Rpb25Ib2xkZXIuYWRkKCJqb28iKTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5hZGQoImphciIpOwotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLndyYXBwZWRDb2xsZWN0aW9uLnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQotCQl0aGlzLmFkYXB0ZXIuc2V0Q29tcGFyYXRvcihuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlciwgbmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLndyYXBwZWRDb2xsZWN0aW9uLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzeW5jaExpc3QuaXRlcmF0b3IoKSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy53cmFwcGVkQ29sbGVjdGlvbiwgc3luY2hDb2xsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5hZGFwdGVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBzeW5jaExpc3QpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGNsID0gbmV3IENoYW5nZUFkYXB0ZXIoKTsKLQkJdGhpcy5hZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLmFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIoY2wpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuYWRhcHRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQ2hhbmdlKCkgewotCQl0aGlzLndyYXBwZWRDb2xsZWN0aW9uSG9sZGVyLmFkZCgiZnJlZCIpOwotCQl0aGlzLmFkYXB0ZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgey8qIE9LICovfQotCQl9KTsKLQkJdGhpcy53cmFwcGVkQ29sbGVjdGlvbkhvbGRlci5zZXRWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9KSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLmFkYXB0ZXIuc2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMud3JhcHBlZENvbGxlY3Rpb24sIHRoaXMuYWRhcHRlcik7Ci0JfQotCi0JY2xhc3MgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNGY5NDUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1NvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZXZlcnNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgTGlzdDxTdHJpbmc+IGxpc3Q7Ci0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RNb2RlbDsKLQlwcml2YXRlIFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+IHNvcnRlZExpc3RNb2RlbDsKLQotCQotCXB1YmxpYyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5saXN0TW9kZWwgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmxpc3QpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbCA9IG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0KENvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhY3R1YWwpIHsKLQkJdGhpcy52ZXJpZnlMaXN0KGV4cGVjdGVkLCBhY3R1YWwsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0KENvbGxlY3Rpb248U3RyaW5nPiBleHBlY3RlZCwgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBhY3R1YWwsIENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiBzb3J0ZWRTZXQgPSBuZXcgVHJlZVNldDxTdHJpbmc+KGNvbXBhcmF0b3IpOwotCQlzb3J0ZWRTZXQuYWRkQWxsKGV4cGVjdGVkKTsKLQkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihzb3J0ZWRTZXQpOwotCQlMaXN0PFN0cmluZz4gYWN0dWFsTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KGFjdHVhbCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZExpc3QsIGFjdHVhbExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbmV3IFRlc3RMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnNvcnRlZExpc3RNb2RlbC5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZEl0ZW0oKSB7Ci0JCUxpc3Q8U3RyaW5nPiBzb3J0ZWRTeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMubGlzdE1vZGVsKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJiYXoiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkKCJqYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHRoaXMubGlzdC5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuc29ydGVkTGlzdE1vZGVsKSwgc29ydGVkU3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSXRlbSgpIHsKLQkJTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmUoImpheiIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3QuY29udGFpbnMoImpheiIpKTsKLQkJdGhpcy5saXN0TW9kZWwucmVtb3ZlKCJmb28iKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNvcnRlZExpc3RNb2RlbCksIHNvcnRlZFN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlcGxhY2VJdGVtKCkgewotCQlMaXN0PFN0cmluZz4gc29ydGVkU3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQkJTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLmxpc3RNb2RlbCk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCWFzc2VydFRydWUodGhpcy5saXN0LmNvbnRhaW5zKCJmb28iKSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCWFzc2VydEVxdWFscyg2LCB0aGlzLmxpc3Quc2l6ZSgpKTsKLQkJdGhpcy5saXN0TW9kZWwuc2V0KDMsICJ0dHQiKTsKLQkJdGhpcy5saXN0TW9kZWwuc2V0KDQsICJ4eHgiKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmxpc3QuY29udGFpbnMoInh4eCIpKTsKLQotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmxpc3QsIHN5bmNoTGlzdCk7Ci0JCWFzc2VydEVxdWFscyhDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLnNvcnRlZExpc3RNb2RlbCksIHNvcnRlZFN5bmNoTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RTeW5jaCgpIHsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgey8qIE9LICovfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiZm9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiYmF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZCgiamF6Iik7Ci0JCXRoaXMubGlzdE1vZGVsLnJlbW92ZSgiamF6Iik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubGlzdC5jb250YWlucygiamF6IikpOwotCQl0aGlzLmxpc3RNb2RlbC5yZW1vdmUoImZvbyIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmxpc3QuY29udGFpbnMoImZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMubGlzdC5zaXplKCkpOwotCi0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29tcGFyYXRvcigpIHsKLQkJTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCUxpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4odGhpcy5saXN0TW9kZWwpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMubGlzdC5jb250YWlucygiZm9vIikpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJhciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImJheiIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImpheiIpOwotCQlhc3NlcnRFcXVhbHMoNiwgdGhpcy5saXN0LnNpemUoKSk7Ci0KLQkJdGhpcy52ZXJpZnlMaXN0KHRoaXMubGlzdCwgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHModGhpcy5saXN0LCBzeW5jaExpc3QpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5zb3J0ZWRMaXN0TW9kZWwpLCBzb3J0ZWRTeW5jaExpc3QpOwotCi0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLnNldENvbXBhcmF0b3IobmV3IFJldmVyc2VDb21wYXJhdG9yPFN0cmluZz4oKSk7Ci0JCXRoaXMudmVyaWZ5TGlzdCh0aGlzLmxpc3QsIHRoaXMuc29ydGVkTGlzdE1vZGVsLCBuZXcgUmV2ZXJzZUNvbXBhcmF0b3I8U3RyaW5nPigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubGlzdCwgc3luY2hMaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHNvcnRlZFN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPih0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnNvcnRlZExpc3RNb2RlbC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHNvcnRlZFN5bmNoTGlzdCk7Ci0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5zb3J0ZWRMaXN0TW9kZWwpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBjbCA9IG5ldyBDaGFuZ2VBZGFwdGVyKCk7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLmFkZENoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMuc29ydGVkTGlzdE1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMuc29ydGVkTGlzdE1vZGVsLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGNsKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLnNvcnRlZExpc3RNb2RlbCkuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGQoImZyZWQiKTsKLQkJdGhpcy5zb3J0ZWRMaXN0TW9kZWwuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCBuZXcgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsvKiBPSyAqL30KLQkJfSk7Ci0JCXRoaXMubGlzdE1vZGVsLnNldExpc3RWYWx1ZXMoQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9KSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnNvcnRlZExpc3RNb2RlbC5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUxpc3QodGhpcy5saXN0LCB0aGlzLnNvcnRlZExpc3RNb2RlbCk7Ci0JfQotCi0JY2xhc3MgVGVzdExpc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjBmNTdkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBDT0xMRUNUSU9OID0gYnVpbGRDb2xsZWN0aW9uKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJcmVzdWx0LmFkZCgiZm9vIik7Ci0JCXJlc3VsdC5hZGQoImJhciIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyOwotCi0KLQlwdWJsaWMgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbGxlY3Rpb25Ib2xkZXIgPSB0aGlzLmJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbGxlY3Rpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPihDT0xMRUNUSU9OKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRDb2xsZWN0aW9uKCksIENvbGxlY3Rpb25Ub29scy5iYWcodGhpcy5jb2xsZWN0aW9uSG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGJ1aWxkQ29sbGVjdGlvbigpLnNpemUoKSwgdGhpcy5jb2xsZWN0aW9uSG9sZGVyLnNpemUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1N0YXRpY0xpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIwYTRhYi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3RhdGljTGlzdFZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBMSVNUID0gYnVpbGRMaXN0KCk7Ci0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGJ1aWxkTGlzdCgpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlyZXN1bHQuYWRkKCJmb28iKTsKLQkJcmVzdWx0LmFkZCgiYmFyIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXI7Ci0KLQotCXB1YmxpYyBTdGF0aWNMaXN0VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdEhvbGRlciA9IG5ldyBTdGF0aWNMaXN0VmFsdWVNb2RlbDxTdHJpbmc+KExJU1QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotCQlMaXN0PFN0cmluZz4gZXhwZWN0ZWQgPSBidWlsZExpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5nZXQoaSksIHRoaXMubGlzdEhvbGRlci5nZXQoaSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMubGlzdEhvbGRlci5saXN0SXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQlhc3NlcnRFcXVhbHMoYnVpbGRMaXN0KCkuc2l6ZSgpLCB0aGlzLmxpc3RIb2xkZXIuc2l6ZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9TdGF0aWNWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM1YTcwMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvU3RhdGljVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3RhdGljVmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IE9CSkVDVF9IT0xERVIgPSBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCi0JCi0JcHVibGljIFN0YXRpY1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9iamVjdEhvbGRlciA9IE9CSkVDVF9IT0xERVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7Ci0JCWFzc2VydFRydWUodGhpcy5vYmplY3RIb2xkZXIudG9TdHJpbmcoKS5pbmRleE9mKCJmb28iKSA+PSAwKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg5NjNiYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gdHJhbnNmb3JtZWRMaXN0SG9sZGVyOwotCUxpc3RFdmVudCBldmVudDsKLQlTdHJpbmcgZXZlbnRUeXBlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFERCA9ICJhZGQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkUgPSAicmVtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQTEFDRSA9ICJyZXBsYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9WRSA9ICJtb3ZlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVIgPSAiY2xlYXIiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFOR0UgPSAiY2hhbmdlIjsKLQotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxpc3RIb2xkZXIgPSBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0SG9sZGVyKHRoaXMubGlzdEhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImZvbyIpOwotCQlyZXN1bHQuYWRkKCJiYXIiKTsKLQkJcmVzdWx0LmFkZCgiYmF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB0cmFuc2Zvcm0oTGlzdDxTdHJpbmc+IGxpc3QpIHsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihsaXN0LnNpemUoKSk7Ci0JCWZvciAoU3RyaW5nIHN0cmluZyA6IGxpc3QpIHsKLQkJCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJCXJlc3VsdC5hZGQobnVsbCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hZGQoc3RyaW5nLnRvVXBwZXJDYXNlKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRBZGRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXJlc3VsdC5hZGQoImpvbyIpOwotCQlyZXN1bHQuYWRkKCJqYXIiKTsKLQkJcmVzdWx0LmFkZCgiamF6Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZEFkZExpc3QoKSB7Ci0JCXJldHVybiB0aGlzLnRyYW5zZm9ybSh0aGlzLmJ1aWxkQWRkTGlzdCgpKTsKLQl9Ci0KLS8vCXByaXZhdGUgTGlzdDxTdHJpbmc+IGJ1aWxkUmVtb3ZlTGlzdCgpIHsKLS8vCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0vLwkJcmVzdWx0LmFkZCgiZm9vIik7Ci0vLwkJcmVzdWx0LmFkZCgiYmFyIik7Ci0vLwkJcmV0dXJuIHJlc3VsdDsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkUmVtb3ZlTGlzdCgpIHsKLS8vCQlyZXR1cm4gdGhpcy50cmFuc2Zvcm0odGhpcy5idWlsZFJlbW92ZUxpc3QoKSk7Ci0vLwl9Ci0vLwotCUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUcmFuc2Zvcm1lZExpc3RIb2xkZXIoTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsdm0pIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsPFN0cmluZywgU3RyaW5nPihsdm0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1JdGVtXyhTdHJpbmcgcykgewotCQkJCXJldHVybiBzLnRvVXBwZXJDYXNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkTGlzdENoYW5nZUxpc3RlbmVyKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmJ1aWxkTGlzdGVuZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RhbGVWYWx1ZXMoKSB7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRMaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKSwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYnVpbGRUcmFuc2Zvcm1lZExpc3QoKS5zaXplKCksIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoT2JqZWN0IGl0ZW0pIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5pdGVyYXRvcigpLCBpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbGwoQ29sbGVjdGlvbjxTdHJpbmc+IGl0ZW1zKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnNBbGwodGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuaXRlcmF0b3IoKSwgaXRlbXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmFuc2Zvcm1lZExpc3RDb250YWluc0FueShDb2xsZWN0aW9uPFN0cmluZz4gaXRlbXMpIHsKLQkJTGlzdDxTdHJpbmc+IHRyYW5zZm9ybWVkTGlzdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLml0ZXJhdG9yKCkpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gc3RyZWFtID0gaXRlbXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlpZiAodHJhbnNmb3JtZWRMaXN0LmNvbnRhaW5zKHN0cmVhbS5uZXh0KCkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkpPTyIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLmFkZCgyLCAiam9vIik7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiSk9PIikpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkKDAsIG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCi0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnNBbnkodGhpcy5idWlsZFRyYW5zZm9ybWVkQWRkTGlzdCgpKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGRBbGwoMiwgdGhpcy5idWlsZEFkZExpc3QoKSk7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWluc0FsbCh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRBZGRMaXN0KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMoIkJBUiIpKTsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSh0aGlzLmJ1aWxkTGlzdCgpLmluZGV4T2YoImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucygiQkFSIikpOwotCi0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCWFzc2VydFRydWUodGhpcy50cmFuc2Zvcm1lZExpc3RDb250YWlucyhudWxsKSk7Ci0JCXRoaXMubGlzdEhvbGRlci5yZW1vdmUoMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudHJhbnNmb3JtZWRMaXN0Q29udGFpbnMobnVsbCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0Q2hhbmdlR2VuZXJpYygpIHsKLQkJdGhpcy50cmFuc2Zvcm1lZExpc3RIb2xkZXIuYWRkQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnZlcmlmeUxpc3RDaGFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdENoYW5nZU5hbWVkKCkgewotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlMaXN0Q2hhbmdlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUxpc3RDaGFuZ2UoKSB7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgImpvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCwgMSwgIkpPTyIpOwotCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV2ZW50VHlwZSA9IG51bGw7Ci0JCXRoaXMubGlzdEhvbGRlci5hZGQoMSwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQURELCAxLCBudWxsKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIucmVtb3ZlKDEpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFJFTU9WRSwgMSwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnJlbW92ZSgxKTsKLQkJdGhpcy52ZXJpZnlFdmVudChSRU1PVkUsIDEsICJKT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ldmVudFR5cGUgPSBudWxsOwotCQl0aGlzLmxpc3RIb2xkZXIuYWRkQWxsKDAsIHRoaXMuYnVpbGRMaXN0KCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KEFERCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmJ1aWxkVHJhbnNmb3JtZWRMaXN0KCksIENvbGxlY3Rpb25Ub29scy5saXN0KCgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpKSk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMuZXZlbnRUeXBlID0gbnVsbDsKLQkJdGhpcy5saXN0SG9sZGVyLnNldCgwLCAiam9vIik7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoUkVQTEFDRSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucygoKExpc3RSZXBsYWNlRXZlbnQpIHRoaXMuZXZlbnQpLmdldE5ld0l0ZW1zKCksICJGT08iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKCgoTGlzdFJlcGxhY2VFdmVudCkgdGhpcy5ldmVudCkuZ2V0TmV3SXRlbXMoKSwgIkpPTyIpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IEFERDsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50VHlwZSA9IFJFTU9WRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gUkVQTEFDRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gTU9WRTsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudFR5cGUgPSBDTEVBUjsKLQkJCQlUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnRUeXBlID0gQ0hBTkdFOwotCQkJCVRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoU3RyaW5nIHR5cGUpIHsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIHRoaXMuZXZlbnRUeXBlKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLCB0aGlzLmV2ZW50LmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTLCB0aGlzLmV2ZW50LmdldExpc3ROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChTdHJpbmcgdHlwZSwgaW50IGluZGV4LCBPYmplY3QgaXRlbSkgewotCQl0aGlzLnZlcmlmeUV2ZW50KHR5cGUpOwotCQlpZiAodHlwZSA9PSBBREQpIHsKLQkJCWFzc2VydEVxdWFscyhpbmRleCwgKChMaXN0QWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEluZGV4KCkpOwotCQkJYXNzZXJ0RXF1YWxzKGl0ZW0sICgoTGlzdEFkZEV2ZW50KSB0aGlzLmV2ZW50KS5nZXRJdGVtcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IFJFTU9WRSkgewotCQkJYXNzZXJ0RXF1YWxzKGluZGV4LCAoKExpc3RSZW1vdmVFdmVudCkgdGhpcy5ldmVudCkuZ2V0SW5kZXgoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoaXRlbSwgKChMaXN0UmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJLyoKLQkJICogYWRkaW5nIGxpc3RlbmVycyB0byB0aGUgdHJhbnNmb3JtZWQgbGlzdCB3aWxsIGNhdXNlIGxpc3RlbmVycwotCQkgKiB0byBiZSBhZGRlZCB0byB0aGUgd3JhcHBlZCBsaXN0OwotCQkgKiBsaWtld2lzZSwgcmVtb3ZpbmcgbGlzdGVuZXJzIGZyb20gdGhlIHRyYW5zZm9ybWVkIGxpc3Qgd2lsbAotCQkgKiBjYXVzZSBsaXN0ZW5lcnMgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSB3cmFwcGVkIGxpc3QKLQkJICovCi0JCWFzc2VydEZhbHNlKCgoQWJzdHJhY3RNb2RlbCkgdGhpcy5saXN0SG9sZGVyKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkTGlzdGVuZXIoKTsKLQotCQl0aGlzLnRyYW5zZm9ybWVkTGlzdEhvbGRlci5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUywgbGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMubGlzdEhvbGRlcikuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCi0JCXRoaXMudHJhbnNmb3JtZWRMaXN0SG9sZGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UoKChBYnN0cmFjdE1vZGVsKSB0aGlzLmxpc3RIb2xkZXIpLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQotCS8qKgotCSAqIGV4ZWN1dGUgdGhlIHNhbWUgc2V0IG9mIHRlc3RzIGFnYWluLCBidXQgYnkgcGFzc2luZyBhIFRyYW5zZm9ybWVyIHRvIHRoZSBhZGFwdGVyCi0JICogKGFzIG9wcG9zZWQgdG8gb3ZlcnJpZGluZyAjdHJhbnNmb3JtSXRlbShPYmplY3QpKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhbnNmb3JtZXJUZXN0cyBleHRlbmRzIFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWxUZXN0cyB7Ci0JCXB1YmxpYyBUcmFuc2Zvcm1lclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcihuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRyYW5zZm9ybWVkTGlzdEhvbGRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGx2bSkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsPFN0cmluZywgU3RyaW5nPihsdm0sIHRoaXMuYnVpbGRUcmFuc2Zvcm1lcigpKTsKLQkJfQotCQlwcml2YXRlIFRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPiBidWlsZFRyYW5zZm9ybWVyKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIFN0cmluZyB0cmFuc2Zvcm0oU3RyaW5nIHMpIHsKLQkJCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9VcHBlckNhc2UoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNDQ5MTkuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaWRpVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gb2JqZWN0SG9sZGVyOwotCVByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCB0cmFuc2Zvcm1hdGlvbkV2ZW50OwotCi0JcHVibGljIFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vYmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oImZvbyIpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyID0gbmV3IFRyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nLCBTdHJpbmc+KHRoaXMub2JqZWN0SG9sZGVyLCB0aGlzLmJ1aWxkVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBCaWRpVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgQmlkaVRyYW5zZm9ybWVyPFN0cmluZywgU3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzKSB7Ci0JCQkJcmV0dXJuIChzID09IG51bGwpID8gbnVsbCA6IHMudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgcmV2ZXJzZVRyYW5zZm9ybShTdHJpbmcgcykgewotCQkJCXJldHVybiAocyA9PSBudWxsKSA/IG51bGwgOiBzLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgewotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLnNldFZhbHVlKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLm9iamVjdEhvbGRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHRoaXMub2JqZWN0SG9sZGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExhenlMaXN0ZW5pbmcoKSB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSB0aGlzLm9iamVjdEhvbGRlcikuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25PYmplY3RIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHRoaXMub2JqZWN0SG9sZGVyKS5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eUNoYW5nZTEoKSB7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRMaXN0ZW5lcigpKTsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlDaGFuZ2UyKCkgewotCQl0aGlzLm9iamVjdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5idWlsZExpc3RlbmVyKCkpOwotCQl0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy52ZXJpZnlQcm9wZXJ0eUNoYW5nZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5UHJvcGVydHlDaGFuZ2VzKCkgewotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiZm9vIiwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkZPTyIsICJCQVIiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmFyIiwgImJheiIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkJBUiIsICJCQVoiKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiYmF6IiwgIkZvbyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgIkJBWiIsICJGT08iKTsKLQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50ID0gbnVsbDsKLQkJdGhpcy5vYmplY3RIb2xkZXIuc2V0VmFsdWUoIkZPTyIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRm9vIiwgIkZPTyIpOwotCQlhc3NlcnROdWxsKHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMuZXZlbnQsIHRoaXMub2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQodGhpcy50cmFuc2Zvcm1hdGlvbkV2ZW50LCB0aGlzLnRyYW5zZm9ybWF0aW9uT2JqZWN0SG9sZGVyLCAiRk9PIiwgbnVsbCk7Ci0KLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudHJhbnNmb3JtYXRpb25FdmVudCA9IG51bGw7Ci0JCXRoaXMub2JqZWN0SG9sZGVyLnNldFZhbHVlKCJiYXIiKTsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLmV2ZW50LCB0aGlzLm9iamVjdEhvbGRlciwgbnVsbCwgImJhciIpOwotCQl0aGlzLnZlcmlmeUV2ZW50KHRoaXMudHJhbnNmb3JtYXRpb25FdmVudCwgdGhpcy50cmFuc2Zvcm1hdGlvbk9iamVjdEhvbGRlciwgbnVsbCwgIkJBUiIpOwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkVHJhbnNmb3JtYXRpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy50aGlzLnRyYW5zZm9ybWF0aW9uRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUsIE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydEVxdWFscyhzb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBlLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9sZFZhbHVlLCBlLmdldE9sZFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3VmFsdWUsIGUuZ2V0TmV3VmFsdWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1RyZWVBc3BlY3RBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmZmI1OS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNoYWluSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlRyZWVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmVlQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuVHJlZUFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5UcmVlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlRyZWVSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlRyZWVDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFRlc3RTdWJqZWN0IHN1YmplY3QxOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdFN1YmplY3Q+IHN1YmplY3RIb2xkZXIxOwotCXByaXZhdGUgVHJlZUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIExpc3Q8VGVzdE5vZGU+PiBhYTE7Ci0JcHJpdmF0ZSBUcmVlRXZlbnQgZXZlbnQxOwotCXByaXZhdGUgVHJlZUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMTsKLQotCXByaXZhdGUgVGVzdFN1YmplY3Qgc3ViamVjdDI7Ci0KLQkKLQlwdWJsaWMgVHJlZUFzcGVjdEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QxID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0JCVRlc3ROb2RlIHJvb3QsIG5vZGU7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDEuZ2V0Um9vdE5hbWVOb2RlKCk7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZE5hbWUocm9vdCwgIm5hbWUgMS4xIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkTmFtZShub2RlLCAibmFtZSAxLjEuMSIpOwotCQl0aGlzLnN1YmplY3QxLmFkZE5hbWUobm9kZSwgIm5hbWUgMS4xLjIiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkTmFtZShyb290LCAibmFtZSAxLjIiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGROYW1lKG5vZGUsICJuYW1lIDEuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZE5hbWUocm9vdCwgIm5hbWUgMS4zIik7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDEuZ2V0Um9vdERlc2NyaXB0aW9uTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMS4xIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDEuMS4xIik7Ci0JCXRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDEuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QxLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAxLjIiKTsKLQkJdGhpcy5zdWJqZWN0MS5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMS4yLjEiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDEuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDEuMyIpOwotCi0JCXRoaXMuc3ViamVjdEhvbGRlcjEgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0Pih0aGlzLnN1YmplY3QxKTsKLQkJdGhpcy5hYTEgPSB0aGlzLmJ1aWxkQXNwZWN0QWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIxKTsKLQkJdGhpcy5saXN0ZW5lcjEgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQotCQl0aGlzLnN1YmplY3QyID0gbmV3IFRlc3RTdWJqZWN0KCk7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDIuZ2V0Um9vdE5hbWVOb2RlKCk7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZE5hbWUocm9vdCwgIm5hbWUgMi4xIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkTmFtZShub2RlLCAibmFtZSAyLjEuMSIpOwotCQl0aGlzLnN1YmplY3QyLmFkZE5hbWUobm9kZSwgIm5hbWUgMi4xLjIiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkTmFtZShyb290LCAibmFtZSAyLjIiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGROYW1lKG5vZGUsICJuYW1lIDIuMi4xIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZE5hbWUocm9vdCwgIm5hbWUgMi4zIik7Ci0KLQkJcm9vdCA9IHRoaXMuc3ViamVjdDIuZ2V0Um9vdERlc2NyaXB0aW9uTm9kZSgpOwotCQlub2RlID0gdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihyb290LCAiZGVzY3JpcHRpb24gMi4xIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDIuMS4xIik7Ci0JCXRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24obm9kZSwgImRlc2NyaXB0aW9uIDIuMS4yIik7Ci0JCW5vZGUgPSB0aGlzLnN1YmplY3QyLmFkZERlc2NyaXB0aW9uKHJvb3QsICJkZXNjcmlwdGlvbiAyLjIiKTsKLQkJdGhpcy5zdWJqZWN0Mi5hZGREZXNjcmlwdGlvbihub2RlLCAiZGVzY3JpcHRpb24gMi4yLjEiKTsKLQkJbm9kZSA9IHRoaXMuc3ViamVjdDIuYWRkRGVzY3JpcHRpb24ocm9vdCwgImRlc2NyaXB0aW9uIDIuMyIpOwotCX0KLQotCXByaXZhdGUgVHJlZUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIExpc3Q8VGVzdE5vZGU+PiBidWlsZEFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RTdWJqZWN0PiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJlZUFzcGVjdEFkYXB0ZXI8VGVzdFN1YmplY3QsIExpc3Q8VGVzdE5vZGU+PihzdWJqZWN0SG9sZGVyLCBUZXN0U3ViamVjdC5OQU1FU19UUkVFKSB7Ci0JCQkvLyB0aGlzIGlzIG5vdCBhIHR5cGljYWwgYXNwZWN0IGFkYXB0ZXIgLSB0aGUgdmFsdWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYXNwZWN0IG5hbWUKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPExpc3Q8VGVzdE5vZGU+PiBub2Rlc18oKSB7Ci0JCQkJaWYgKHRoaXMudHJlZU5hbWVzWzBdID09IFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5uYW1lUGF0aHMoKTsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMudHJlZU5hbWVzWzBdID09IFRlc3RTdWJqZWN0LkRFU0NSSVBUSU9OU19UUkVFKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZGVzY3JpcHRpb25QYXRocygpOwotCQkJCX0KLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnZhbGlkIGFzcGVjdCBuYW1lOiAiICsgdGhpcy50cmVlTmFtZXNbMF0pOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyMSgpIHsKLQkJcmV0dXJuIG5ldyBDaGFuZ2VBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBub2RlQWRkZWQoVHJlZUFkZEV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgbm9kZVJlbW92ZWQoVHJlZVJlbW92ZUV2ZW50IGUpIHsKLQkJCQlUcmVlQXNwZWN0QWRhcHRlclRlc3RzLnRoaXMudmFsdWUxQ2hhbmdlZChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZUNsZWFyZWQoVHJlZUNsZWFyRXZlbnQgZSkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlQ2hhbmdlZChUcmVlQ2hhbmdlRXZlbnQgZSkgewotCQkJCVRyZWVBc3BlY3RBZGFwdGVyVGVzdHMudGhpcy52YWx1ZTFDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgdmFsdWUxQ2hhbmdlZChUcmVlRXZlbnQgZSkgewotCQl0aGlzLmV2ZW50MSA9IGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3RIb2xkZXIxLnNldFZhbHVlKHRoaXMuc3ViamVjdDIpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQxKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuYWExLCB0aGlzLmV2ZW50MS5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhUcmVlVmFsdWVNb2RlbC5OT0RFUywgdGhpcy5ldmVudDEuZ2V0VHJlZU5hbWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50MSA9IG51bGw7Ci0JCXRoaXMuc3ViamVjdEhvbGRlcjEuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQxID0gbnVsbDsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyMS5zZXRWYWx1ZSh0aGlzLnN1YmplY3QxKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50MSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmFhMSwgdGhpcy5ldmVudDEuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoVHJlZVZhbHVlTW9kZWwuTk9ERVMsIHRoaXMuZXZlbnQxLmdldFRyZWVOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlU3RydWN0dXJlQ2hhbmdlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQxKTsKLQotCQl0aGlzLnN1YmplY3QxLmFkZFR3b05hbWVzKHRoaXMuc3ViamVjdDEuZ2V0Um9vdE5hbWVOb2RlKCksICJqYW0iLCAiamF6Iik7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudDEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5hYTEsIHRoaXMuZXZlbnQxLmdldFNvdXJjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmV2ZW50MS5nZXRUcmVlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmNvbnRhaW5zTmFtZU5vZGUoImphbSIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnN1YmplY3QxLmNvbnRhaW5zTmFtZU5vZGUoImpheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9kZXMoKSB7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmNvbnZlcnRUb05hbWVzKHRoaXMuc3ViamVjdDEubmFtZVBhdGhzKCkpLCB0aGlzLmNvbnZlcnRUb05hbWVzKHRoaXMuYWExLm5vZGVzKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBjb252ZXJ0VG9OYW1lcyhJdGVyYXRvcjxMaXN0PFRlc3ROb2RlPj4gbmFtZVBhdGhzKSB7Ci0JCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCXdoaWxlIChuYW1lUGF0aHMuaGFzTmV4dCgpKSB7Ci0JCQlMaXN0PFRlc3ROb2RlPiBwYXRoID0gbmFtZVBhdGhzLm5leHQoKTsKLQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCXNiLmFwcGVuZCgnWycpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLnNpemUoKTsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKHBhdGguZ2V0KGkpLmdldFRleHQoKSk7Ci0JCQkJaWYgKGkgPCBwYXRoLnNpemUoKSAtIDEpIHsKLQkJCQkJc2IuYXBwZW5kKCc6Jyk7Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKCddJyk7Ci0JCQlyZXN1bHQuYWRkKHNiLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRyZWVWYWx1ZU1vZGVsLk5PREVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpKTsKLQkJdGhpcy5hYTEucmVtb3ZlVHJlZUNoYW5nZUxpc3RlbmVyKFRyZWVWYWx1ZU1vZGVsLk5PREVTLCB0aGlzLmxpc3RlbmVyMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc3ViamVjdDEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUZXN0U3ViamVjdC5OQU1FU19UUkVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYWExLmhhc0FueVRyZWVDaGFuZ2VMaXN0ZW5lcnMoVHJlZVZhbHVlTW9kZWwuTk9ERVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkVmFsdWVDaGFuZ2VMaXN0ZW5lcjEoKTsKLQkJdGhpcy5hYTEuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmFhMS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRyZWVWYWx1ZU1vZGVsLk5PREVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zdWJqZWN0MS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpKTsKLQkJdGhpcy5hYTEucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zdWJqZWN0MS5oYXNBbnlUcmVlQ2hhbmdlTGlzdGVuZXJzKFRlc3RTdWJqZWN0Lk5BTUVTX1RSRUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5hYTEuaGFzQW55VHJlZUNoYW5nZUxpc3RlbmVycyhUcmVlVmFsdWVNb2RlbC5OT0RFUykpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JY2xhc3MgVGVzdFN1YmplY3QgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBUZXN0Tm9kZSByb290TmFtZU5vZGU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX1RSRUUgPSAibmFtZXMiOwotCQlwcml2YXRlIFRlc3ROb2RlIHJvb3REZXNjcmlwdGlvbk5vZGU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OU19UUkVFID0gImRlc2NyaXB0aW9ucyI7Ci0JCi0JCXB1YmxpYyBUZXN0U3ViamVjdCgpIHsKLQkJCXRoaXMucm9vdE5hbWVOb2RlID0gbmV3IFRlc3ROb2RlKCJyb290IG5hbWUiKTsKLQkJCXRoaXMucm9vdERlc2NyaXB0aW9uTm9kZSA9IG5ldyBUZXN0Tm9kZSgicm9vdCBkZXNjcmlwdGlvbiIpOwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBnZXRSb290TmFtZU5vZGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yb290TmFtZU5vZGU7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBuYW1lTm9kZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyZWVJdGVyYXRvcjxUZXN0Tm9kZT4odGhpcy5yb290TmFtZU5vZGUpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgSXRlcmF0b3I8VGVzdE5vZGU+IGNoaWxkcmVuKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuY2hpbGRyZW4oKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCXB1YmxpYyBJdGVyYXRvcjxMaXN0PFRlc3ROb2RlPj4gbmFtZVBhdGhzKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRlc3ROb2RlLCBMaXN0PFRlc3ROb2RlPj4odGhpcy5uYW1lTm9kZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0PFRlc3ROb2RlPiB0cmFuc2Zvcm0oVGVzdE5vZGUgbmV4dCkgewotCQkJCQlyZXR1cm4gbmV4dC5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgYWRkTmFtZShUZXN0Tm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlUZXN0Tm9kZSBjaGlsZCA9IG5ldyBUZXN0Tm9kZShuYW1lKTsKLQkJCXBhcmVudC5hZGRDaGlsZChjaGlsZCk7Ci0JCQl0aGlzLmZpcmVOb2RlQWRkZWQoTkFNRVNfVFJFRSwgY2hpbGQuZ2V0UGF0aCgpKTsKLQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRUd29OYW1lcyhUZXN0Tm9kZSBwYXJlbnQsIFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQobmV3IFRlc3ROb2RlKG5hbWUxKSk7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQobmV3IFRlc3ROb2RlKG5hbWUyKSk7Ci0JCQl0aGlzLmZpcmVUcmVlQ2hhbmdlZChOQU1FU19UUkVFLCBwYXJlbnQuZ2V0UGF0aCgpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVOYW1lTm9kZShUZXN0Tm9kZSBuYW1lTm9kZSkgewotCQkJbmFtZU5vZGUuZ2V0UGFyZW50KCkucmVtb3ZlQ2hpbGQobmFtZU5vZGUpOwotCQkJdGhpcy5maXJlTm9kZVJlbW92ZWQoTkFNRVNfVFJFRSwgbmFtZU5vZGUuZ2V0UGF0aCgpKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWluc05hbWVOb2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lTm9kZShuYW1lKSAhPSBudWxsOwotCQl9Ci0JCXB1YmxpYyBUZXN0Tm9kZSBuYW1lTm9kZShTdHJpbmcgbmFtZSkgewotCQkJZm9yIChJdGVyYXRvcjxUZXN0Tm9kZT4gc3RyZWFtID0gdGhpcy5uYW1lTm9kZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJVGVzdE5vZGUgbm9kZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0VGV4dCgpLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZXR1cm4gbm9kZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgVGVzdE5vZGUgZ2V0Um9vdERlc2NyaXB0aW9uTm9kZSgpIHsKLQkJCXJldHVybiB0aGlzLnJvb3REZXNjcmlwdGlvbk5vZGU7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBkZXNjcmlwdGlvbk5vZGVzKCkgewotCQkJcmV0dXJuIG5ldyBUcmVlSXRlcmF0b3I8VGVzdE5vZGU+KHRoaXMucm9vdERlc2NyaXB0aW9uTm9kZSkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBJdGVyYXRvcjxUZXN0Tm9kZT4gY2hpbGRyZW4oVGVzdE5vZGUgbmV4dCkgewotCQkJCQlyZXR1cm4gbmV4dC5jaGlsZHJlbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPExpc3Q8VGVzdE5vZGU+PiBkZXNjcmlwdGlvblBhdGhzKCkgewotCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yPFRlc3ROb2RlLCBMaXN0PFRlc3ROb2RlPj4odGhpcy5kZXNjcmlwdGlvbk5vZGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdDxUZXN0Tm9kZT4gdHJhbnNmb3JtKFRlc3ROb2RlIG5leHQpIHsKLQkJCQkJcmV0dXJuIG5leHQuZ2V0UGF0aCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGFkZERlc2NyaXB0aW9uKFRlc3ROb2RlIHBhcmVudCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCQlUZXN0Tm9kZSBjaGlsZCA9IG5ldyBUZXN0Tm9kZShkZXNjcmlwdGlvbik7Ci0JCQlwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCQkJdGhpcy5maXJlTm9kZUFkZGVkKERFU0NSSVBUSU9OU19UUkVFLCBjaGlsZC5nZXRQYXRoKCkpOwotCQkJcmV0dXJuIGNoaWxkOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0aW9uTm9kZShUZXN0Tm9kZSBkZXNjcmlwdGlvbk5vZGUpIHsKLQkJCWRlc2NyaXB0aW9uTm9kZS5nZXRQYXJlbnQoKS5yZW1vdmVDaGlsZChkZXNjcmlwdGlvbk5vZGUpOwotCQkJdGhpcy5maXJlTm9kZVJlbW92ZWQoREVTQ1JJUFRJT05TX1RSRUUsIGRlc2NyaXB0aW9uTm9kZS5nZXRQYXRoKCkpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zRGVzY3JpcHRpb25Ob2RlKFN0cmluZyBuYW1lKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPFRlc3ROb2RlPiBzdHJlYW0gPSB0aGlzLmRlc2NyaXB0aW9uTm9kZXMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJVGVzdE5vZGUgbm9kZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0VGV4dCgpLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JY2xhc3MgVGVzdE5vZGUgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyB0ZXh0OwotCQlwcml2YXRlIFRlc3ROb2RlIHBhcmVudDsKLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRlc3ROb2RlPiBjaGlsZHJlbjsKLQkKLQkJcHVibGljIFRlc3ROb2RlKFN0cmluZyB0ZXh0KSB7Ci0JCQl0aGlzLnRleHQgPSB0ZXh0OwotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3ROb2RlPigpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiB0aGlzLnRleHQ7Ci0JCX0KLQkJcHVibGljIFRlc3ROb2RlIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiB0aGlzLnBhcmVudDsKLQkJfQotCQlwcml2YXRlIHZvaWQgc2V0UGFyZW50KFRlc3ROb2RlIHBhcmVudCkgewotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCX0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3ROb2RlPiBjaGlsZHJlbigpIHsKLQkJCXJldHVybiBuZXcgUmVhZE9ubHlJdGVyYXRvcjxUZXN0Tm9kZT4odGhpcy5jaGlsZHJlbik7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkQ2hpbGQoVGVzdE5vZGUgY2hpbGQpIHsKLQkJCXRoaXMuY2hpbGRyZW4uYWRkKGNoaWxkKTsKLQkJCWNoaWxkLnNldFBhcmVudCh0aGlzKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChUZXN0Tm9kZSBjaGlsZCkgewotCQkJdGhpcy5jaGlsZHJlbi5yZW1vdmUoY2hpbGQpOwotCQl9Ci0JCXB1YmxpYyBMaXN0PFRlc3ROb2RlPiBnZXRQYXRoKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5yZXZlcnNlTGlzdCh0aGlzLmJ1aWxkQW50aVBhdGgoKSk7Ci0JCX0KLQkJcHJpdmF0ZSBJdGVyYXRvcjxUZXN0Tm9kZT4gYnVpbGRBbnRpUGF0aCgpIHsKLQkJCXJldHVybiBuZXcgQ2hhaW5JdGVyYXRvcjxUZXN0Tm9kZT4odGhpcykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBUZXN0Tm9kZSBuZXh0TGluayhUZXN0Tm9kZSBjdXJyZW50TGluaykgewotCQkJCQlyZXR1cm4gY3VycmVudExpbmsuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE5vZGUoIiArIHRoaXMudGV4dCArICIpIjsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZUNvbGxlY3Rpb25BZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YzJjNC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVDb2xsZWN0aW9uQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIEp1bmsganVuazsKLQlwcml2YXRlIFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPiBqdW5rSG9sZGVyOwotCXByaXZhdGUgVmFsdWVDb2xsZWN0aW9uQWRhcHRlcjxKdW5rPiBqdW5rSG9sZGVyMjsKLQotCi0JcHVibGljIFZhbHVlQ29sbGVjdGlvbkFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZUNvbGxlY3Rpb25BZGFwdGVyPEp1bms+KHRoaXMuanVua0hvbGRlciwgSnVuay5TVFVGRl9DT0xMRUNUSU9OKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdyYXBwZWRQVk0oKSB7Ci0JCUp1bmsganVuazIgPSBuZXcgSnVuaygiYmFyIik7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIHRoaXMuanVuaywganVuazIpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIuc2V0VmFsdWUoanVuazIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNTdGF0ZUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0NPTExFQ1RJT04pKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9DT0xMRUNUSU9OKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfQ09MTEVDVElPTikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uQWRkKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmsuYWRkU3R1ZmYoImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblJlbW92ZSgpIHsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnJlbW92ZVN0dWZmKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIEp1bmsgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gc3R1ZmY7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFVGRl9DT0xMRUNUSU9OID0gInN0dWZmIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnN0dWZmID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQl0aGlzLnN0dWZmLmFkZChzdHVmZkl0ZW0pOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIGFkZFN0dWZmKFN0cmluZyBzdHVmZkl0ZW0pIHsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0NPTExFQ1RJT04pOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZW1vdmVTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihzdHVmZkl0ZW0sIHRoaXMuc3R1ZmYsIFNUVUZGX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLnN0dWZmICsgIikiOwotCQl9Ci0JCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVMaXN0QWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDQ3YTQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL1ZhbHVlTGlzdEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWYWx1ZUxpc3RBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlTGlzdEFkYXB0ZXI8SnVuaz4ganVua0hvbGRlcjI7Ci0KLQkKLQlwdWJsaWMgVmFsdWVMaXN0QWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuanVuayA9IG5ldyBKdW5rKCJmb28iKTsKLQkJdGhpcy5qdW5rSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxKdW5rPih0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyID0gbmV3IFZhbHVlTGlzdEFkYXB0ZXI8SnVuaz4odGhpcy5qdW5rSG9sZGVyLCBKdW5rLlNUVUZGX0xJU1QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKEp1bmsuU1RVRkZfTElTVCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmsuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhKdW5rLlNUVUZGX0xJU1QpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoSnVuay5TVFVGRl9MSVNUKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RBZGQoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLmFkZFN0dWZmKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdmUoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnJlbW92ZVN0dWZmKCJmb28iKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpc3RSZXBsYWNlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5yZXBsYWNlU3R1ZmYoImZvbyIsICJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHN0dWZmOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RVRkZfTElTVCA9ICJzdHVmZiI7Ci0KLQkJcHVibGljIEp1bmsoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5zdHVmZiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJdGhpcy5zdHVmZi5hZGQoc3R1ZmZJdGVtKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBhZGRTdHVmZihTdHJpbmcgc3R1ZmZJdGVtKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3Qoc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9MSVNUKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlU3R1ZmYoU3RyaW5nIHN0dWZmSXRlbSkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3Qoc3R1ZmZJdGVtLCB0aGlzLnN0dWZmLCBTVFVGRl9MSVNUKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZXBsYWNlU3R1ZmYoU3RyaW5nIG9sZFN0dWZmSXRlbSwgU3RyaW5nIG5ld1N0dWZmSXRlbSkgewotCQkJdGhpcy5yZXBsYWNlSXRlbUluTGlzdChvbGRTdHVmZkl0ZW0sIG5ld1N0dWZmSXRlbSwgdGhpcy5zdHVmZiwgU1RVRkZfTElTVCk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIkp1bmsoIiArIHRoaXMuc3R1ZmYgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2Y1YmU2Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVByb3BlcnR5QWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZVByb3BlcnR5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFZhbHVlUHJvcGVydHlBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlUHJvcGVydHlBZGFwdGVyPEp1bms+IGp1bmtIb2xkZXIyOwotCi0KLQlwdWJsaWMgVmFsdWVQcm9wZXJ0eUFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZVByb3BlcnR5QWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIsIEp1bmsuTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcmFwcGVkUFZNKCkgewotCQlKdW5rIGp1bmsyID0gbmV3IEp1bmsoImJhciIpOwotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCB0aGlzLmp1bmssIGp1bmsyKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rSG9sZGVyLnNldFZhbHVlKGp1bmsyKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCXRoaXMuanVua0hvbGRlcjIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzU3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEp1bmsuTkFNRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIyLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCi0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmsuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoSnVuay5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhKdW5rLk5BTUVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlUHJvcGVydHkoKSB7Ci0JCUxvY2FsTGlzdGVuZXIgbCA9IG5ldyBMb2NhbExpc3RlbmVyKHRoaXMuanVua0hvbGRlcjIsIG51bGwsIHRoaXMuanVuayk7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJdGhpcy5qdW5rLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRUcnVlKGwuZXZlbnRSZWNlaXZlZCgpKTsKLQl9Ci0KLQotCWNsYXNzIExvY2FsTGlzdGVuZXIgZXh0ZW5kcyBDaGFuZ2VBZGFwdGVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGV2ZW50UmVjZWl2ZWQgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc291cmNlOwotCQlwcml2YXRlIGZpbmFsIE9iamVjdCBvbGRWYWx1ZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3QgbmV3VmFsdWU7Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSkgewotCQkJdGhpcyhzb3VyY2UsIG51bGwsIG51bGwpOwotCQl9Ci0JCUxvY2FsTGlzdGVuZXIoT2JqZWN0IHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJdGhpcy5ldmVudFJlY2VpdmVkID0gdHJ1ZTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLnNvdXJjZSwgZS5nZXRTb3VyY2UoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5vbGRWYWx1ZSwgZS5nZXRPbGRWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyh0aGlzLm5ld1ZhbHVlLCBlLmdldE5ld1ZhbHVlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQl9Ci0JCWJvb2xlYW4gZXZlbnRSZWNlaXZlZCgpIHsKLQkJCXJldHVybiB0aGlzLmV2ZW50UmVjZWl2ZWQ7Ci0JCX0KLQl9Ci0KLQljbGFzcyBKdW5rIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOwotCi0JCXB1YmxpYyBKdW5rKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjM1ODEyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9WYWx1ZVN0YXRlQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZVN0YXRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFZhbHVlU3RhdGVBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBKdW5rIGp1bms7Ci0JcHJpdmF0ZSBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4ganVua0hvbGRlcjsKLQlwcml2YXRlIFZhbHVlU3RhdGVBZGFwdGVyPEp1bms+IGp1bmtIb2xkZXIyOwotCi0KLQlwdWJsaWMgVmFsdWVTdGF0ZUFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmp1bmsgPSBuZXcgSnVuaygiZm9vIik7Ci0JCXRoaXMuanVua0hvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnVuaz4odGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMiA9IG5ldyBWYWx1ZVN0YXRlQWRhcHRlcjxKdW5rPih0aGlzLmp1bmtIb2xkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFBWTSgpIHsKLQkJSnVuayBqdW5rMiA9IG5ldyBKdW5rKCJiYXIiKTsKLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgdGhpcy5qdW5rLCBqdW5rMik7Ci0JCXRoaXMuanVua0hvbGRlcjIuYWRkQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVua0hvbGRlci5zZXRWYWx1ZShqdW5rMik7Ci0JCWFzc2VydFRydWUobC5ldmVudFJlY2VpdmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0KLQkJTG9jYWxMaXN0ZW5lciBsID0gbmV3IExvY2FsTGlzdGVuZXIodGhpcy5qdW5rSG9sZGVyMiwgbnVsbCwgdGhpcy5qdW5rKTsKLQkJdGhpcy5qdW5rSG9sZGVyMi5hZGRDaGFuZ2VMaXN0ZW5lcihsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQl0aGlzLmp1bmtIb2xkZXIyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmtIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc1N0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVuay5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5qdW5rSG9sZGVyMi5oYXNBbnlTdGF0ZUNoYW5nZUxpc3RlbmVycygpKTsKLQotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCWFzc2VydFRydWUodGhpcy5qdW5rLmhhc0FueVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0KLQkJdGhpcy5qdW5rSG9sZGVyMi5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKGwpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmp1bmsuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuanVua0hvbGRlcjIuaGFzQW55U3RhdGVDaGFuZ2VMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVN0YXRlKCkgewotCQlMb2NhbExpc3RlbmVyIGwgPSBuZXcgTG9jYWxMaXN0ZW5lcih0aGlzLmp1bmtIb2xkZXIyLCBudWxsLCB0aGlzLmp1bmspOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZENoYW5nZUxpc3RlbmVyKGwpOwotCQl0aGlzLmp1bmtIb2xkZXIyLmFkZFN0YXRlQ2hhbmdlTGlzdGVuZXIobCk7Ci0JCXRoaXMuanVuay5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0VHJ1ZShsLmV2ZW50UmVjZWl2ZWQoKSk7Ci0JfQotCi0KLQljbGFzcyBMb2NhbExpc3RlbmVyIGV4dGVuZHMgQ2hhbmdlQWRhcHRlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBldmVudFJlY2VpdmVkID0gZmFsc2U7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKLQkJcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2xkVmFsdWU7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0IG5ld1ZhbHVlOwotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UpIHsKLQkJCXRoaXMoc291cmNlLCBudWxsLCBudWxsKTsKLQkJfQotCQlMb2NhbExpc3RlbmVyKE9iamVjdCBzb3VyY2UsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCQl0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7Ci0JCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnRSZWNlaXZlZCA9IHRydWU7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5zb3VyY2UsIGUuZ2V0U291cmNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMub2xkVmFsdWUsIGUuZ2V0T2xkVmFsdWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHModGhpcy5uZXdWYWx1ZSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQl0aGlzLmV2ZW50UmVjZWl2ZWQgPSB0cnVlOwotCQkJYXNzZXJ0RXF1YWxzKHRoaXMuc291cmNlLCBlLmdldFNvdXJjZSgpKTsKLQkJfQotCQlib29sZWFuIGV2ZW50UmVjZWl2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ldmVudFJlY2VpdmVkOwotCQl9Ci0JfQotCi0JY2xhc3MgSnVuayBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQotCQlwdWJsaWMgSnVuayhTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKdW5rKCIgKyB0aGlzLm5hbWUgKyAiKSI7Ci0JCX0KLQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9KcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5NjZhOS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5TW9kZWxWYWx1ZVByZWZzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU1vZGVsVmFsdWVQcmVmc1Rlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWE2ZTcuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLnByZWZzLk5vZGVDaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5QcmVmZXJlbmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLlByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzIGV4dGVuZHMgUHJlZmVyZW5jZXNUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gbm9kZUhvbGRlcjsKLQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gcHJlZmVyZW5jZUFkYXB0ZXI7Ci0JUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudDsKLQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyOwotCWJvb2xlYW4gbGlzdGVuZXJSZW1vdmVkID0gZmFsc2U7Ci0JUHJlZmVyZW5jZUNoYW5nZUV2ZW50IHByZWZlcmVuY2VFdmVudDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAiZm9vIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSI7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMubm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+KHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FKTsKLQkJdGhpcy5saXN0ZW5lciA9IHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0SG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQlQcmVmZXJlbmNlcyBhbm90aGVyTm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoImFub3RoZXIgdGVzdCBub2RlIik7Ci0JCWFub3RoZXJOb2RlLnB1dChLRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShhbm90aGVyTm9kZSk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLm5vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByZWZlcmVuY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFICsgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSArIFNUUklOR19WQUxVRSwgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJdGhpcy52ZXJpZnlFdmVudChudWxsLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoQU5PVEhFUl9TVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBTk9USEVSX1NUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsICI8bWlzc2luZyBwcmVmZXJlbmNlPiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyMiA9IHRoaXMuYnVpbGRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyMik7Ci0JCWFzc2VydFRydWUodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlQWRhcHRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCAhPSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJCX0KLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5ldmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUFuZFJlQWRkUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCS8vIHJlbW92ZSB0aGUgcHJlZmVyZW5jZSBlbnRpcmVseS4uLgotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCWFzc2VydE51bGwodGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChTVFJJTkdfVkFMVUUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJLy8gLi4udGhlbiByZS1hZGQgaXQgd2l0aCB0aGUgc2FtZSBrZXkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KG51bGwsIFNUUklOR19WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyByZWJ1aWxkIHRoZSBhZGFwdGVyIHdpdGggYSBkZWZhdWx0IHZhbHVlCi0JCVN0cmluZyBERUZBVUxUX1ZBTFVFID0gImRlZmF1bHQgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSwgREVGQVVMVF9WQUxVRSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMudGVzdE5vZGUuZ2V0KEtFWV9OQU1FLCBudWxsKSk7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSBwcmVmZXJlbmNlIGVudGlyZWx5Li4uCi0JCXRoaXMudGVzdE5vZGUucmVtb3ZlKEtFWV9OQU1FKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgbnVsbCkpOwotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgREVGQVVMVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIC4uLnRoZW4gcmUtYWRkIGl0IHdpdGggdGhlIHNhbWUga2V5Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFNUUklOR19WQUxVRSwgdGhpcy50ZXN0Tm9kZS5nZXQoS0VZX05BTUUsIG51bGwpKTsKLQkJdGhpcy52ZXJpZnlFdmVudChERUZBVUxUX1ZBTFVFLCBTVFJJTkdfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoU1RSSU5HX1ZBTFVFLCB0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnN5bmNocm9uaXplZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJLy8gcmVtb3ZlIHRoZSB0aGlzLmxpc3RlbmVyIHNvIHRoZSBhZGFwdGVyIG5vIGxvbmdlciBsaXN0ZW5zIHRvIHRoZSBwcmVmZXJlbmNlCi0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FLCBTVFJJTkdfVkFMVUUgKyBTVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQkvLyBubyB0aGlzLmV2ZW50IHNob3VsZCBoYXZlIGJlZW4gZmlyZWQuLi4KLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJLy8gLi4uYW5kIHRoZSBhZGFwdGVyJ3MgdmFsdWUgc2hvdWxkIGJlIG51bGwKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmUoS0VZX05BTUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRSwgU1RSSU5HX1ZBTFVFKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vIGFkZCB0aGUgdGhpcy5saXN0ZW5lciBzbyB0aGUgYWRhcHRlciBzeW5jaHMKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhTVFJJTkdfVkFMVUUsIHRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEludGVnZXJQcmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVuaW5nIHRvIHRoZSBub2RlIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGludGVnZXIKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0KLQkJUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIgPSBuZXcgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPih0aGlzLm5vZGVIb2xkZXIsIEtFWV9OQU1FKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXRJbnQoS0VZX05BTUUsIDEyMyk7Ci0JCWludGVnZXJQcmVmZXJlbmNlQWRhcHRlciA9IFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWwuZm9ySW50ZWdlcih0aGlzLnRlc3ROb2RlLCBLRVlfTkFNRSwgMCk7Ci0JCWludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5saXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMjMpLCBpbnRlZ2VyUHJlZmVyZW5jZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0KLQkJdGhpcy50ZXN0Tm9kZS5wdXRJbnQoS0VZX05BTUUsIDI0Nik7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLCBuZXcgSW50ZWdlcigxMjMpLCBuZXcgSW50ZWdlcigyNDYpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDI0NiksIGludGVnZXJQcmVmZXJlbmNlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLCBuZXcgSW50ZWdlcigyNDYpLCBuZXcgSW50ZWdlcigwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCQkKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRoaXMudGVzdE5vZGUucHV0SW50KEtFWV9OQU1FLCAxMjMpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGludGVnZXJQcmVmZXJlbmNlQWRhcHRlciwgbmV3IEludGVnZXIoMCksIG5ldyBJbnRlZ2VyKDEyMykpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIzKSwgaW50ZWdlclByZWZlcmVuY2VBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCS8qKgotCSAqIHRlc3QgYSBzaXR1YXRpb24gd2hlcmUKLQkgKiAtIHdlIGFyZSBsaXN0ZW5pbmcgdG8gdGhlIG5vZGUgd2hlbiBpdCBnZXRzIHJlbW92ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMgInJlcG9zaXRvcnkiCi0JICogLSB3ZSBnZXQgbm90aWZpY2F0aW9uIHRoYXQgaXQgaGFzIGJlZW4gcmVtb3ZlZAotCSAqIC0gd2UgdHJ5IHRvIHJlbW92ZSBvdXIgdGhpcy5saXN0ZW5lcgotCSAqIC0gdGhlIG5vZGUgd2lsbCB0aHJvdyBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSB0aGUgYWRhcHRlciBzaG91bGQgaGFuZGxlIGl0IE9LLi4uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCi0JCVByZWZlcmVuY2VzIHBhcmVudCA9IHRoaXMudGVzdE5vZGUucGFyZW50KCk7Ci0JCXBhcmVudC5hZGROb2RlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFBhcmVudE5vZGVDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJdGhpcy50ZXN0Tm9kZS5yZW1vdmVOb2RlKCk7Ci0JCXRoaXMudGVzdE5vZGUuZmx1c2goKTsJCS8vIHRoaXMgc2VlbXMgdG8gYmUgcmVxdWlyZWQgZm9yIHRoZSB0aGlzLmV2ZW50IHRvIHRyaWdnZXIuLi4KLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMubGlzdGVuZXJSZW1vdmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlQ2hhbmdlTGlzdGVuZXIgYnVpbGRQYXJlbnROb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY2hpbGRBZGRlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgdGhpcy5ldmVudDogIiArIGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgY2hpbGRSZW1vdmVkKE5vZGVDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0Q2hpbGQoKSA9PSBQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy50ZXN0Tm9kZSkgewotCQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5wcmVmZXJlbmNlQWRhcHRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXIpOwotCQkJCQkvLyB0aGlzIGxpbmUgb2YgY29kZSB3aWxsIG5vdCBleGVjdXRlIGlmIHRoZSBsaW5lIGFib3ZlIHRyaWdnZXJzIGFuIGV4Y2VwdGlvbgotCQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5saXN0ZW5lclJlbW92ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2FtZVZhbHVlKCkgewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQkJdGhpcy50ZXN0Tm9kZS5hZGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcy5idWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpKTsKLQotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUUgPSAic29tZSBvdGhlciB2YWx1ZSI7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCXRoaXMudmVyaWZ5RXZlbnQoU1RSSU5HX1ZBTFVFLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5UHJlZmVyZW5jZUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQkvLyBub3cgc2V0IHRvICpzYW1lKiB2YWx1ZSAtIG5vdGhpbmcgc2hvdWxkIGhhcHBlbi4uLgotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2FtZVZhbHVlRm9yY2VQYXNzVGhyb3VnaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnROdWxsKHRoaXMucHJlZmVyZW5jZUV2ZW50KTsKLQotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmxpc3RlbmVyKTsKLQkJdGhpcy5wcmVmZXJlbmNlQWRhcHRlciA9IG5ldyBBbHdheXNVcGRhdGVQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4odGhpcy5ub2RlSG9sZGVyLCBLRVlfTkFNRSk7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubGlzdGVuZXIpOwotCi0JCXRoaXMudGVzdE5vZGUuYWRkUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyKHRoaXMuYnVpbGRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gInNvbWUgb3RoZXIgdmFsdWUiOwotCQl0aGlzLnByZWZlcmVuY2VBZGFwdGVyLnNldFZhbHVlKEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQotCQl0aGlzLnZlcmlmeUV2ZW50KFNUUklOR19WQUxVRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQl0aGlzLnZlcmlmeVByZWZlcmVuY2VFdmVudChBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0KLQkJLy8gbm93IHNldCB0byAqc2FtZSogdmFsdWUgLSBvbmx5IG9uZSB0aGlzLmV2ZW50IHNob3VsZCBmaXJlCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLnByZWZlcmVuY2VFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJlZmVyZW5jZUFkYXB0ZXIuc2V0VmFsdWUoQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCi0JCWFzc2VydE51bGwodGhpcy5ldmVudCk7Ci0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCXRoaXMudmVyaWZ5UHJlZmVyZW5jZUV2ZW50KEFOT1RIRVJfU1RSSU5HX1ZBTFVFKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcmVmZXJlbmNlQ2hhbmdlKFByZWZlcmVuY2VDaGFuZ2VFdmVudCBldnQpIHsKLQkJCQlQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMudGhpcy5wcmVmZXJlbmNlRXZlbnQgPSBldnQ7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KE1vZGVsIHNvdXJjZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKHNvdXJjZSwgdGhpcy5ldmVudC5nZXRTb3VyY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXZlbnQuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMob2xkVmFsdWUsIHRoaXMuZXZlbnQuZ2V0T2xkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXdWYWx1ZSwgdGhpcy5ldmVudC5nZXROZXdWYWx1ZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5RXZlbnQoT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlFdmVudCh0aGlzLnByZWZlcmVuY2VBZGFwdGVyLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlQcmVmZXJlbmNlRXZlbnQoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcmVmZXJlbmNlRXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy50ZXN0Tm9kZSwgdGhpcy5wcmVmZXJlbmNlRXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoS0VZX05BTUUsIHRoaXMucHJlZmVyZW5jZUV2ZW50LmdldEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnByZWZlcmVuY2VFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ld1ZhbHVlLCB0aGlzLnRlc3ROb2RlLmdldChLRVlfTkFNRSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSGFzQW55UHJlZkxpc3RlbmVycyhQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10gcHJlZkxpc3RlbmVycyA9IChQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobm9kZSwgInByZWZMaXN0ZW5lcnMiKTsKLQkJcmV0dXJuIHByZWZMaXN0ZW5lcnMubGVuZ3RoID4gMDsKLQl9Ci0KLQotCS8qKgotCSAqIFVzZSB0aGlzIGFkYXB0ZXIgdG8gdGVzdCBvdXQgYWx3YXlzIHBhc3NpbmcgdGhyb3VnaCB0aGUgbmV3IHZhbHVlCi0JICogdG8gdGhlIHByZWZlcmVuY2UuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBBbHdheXNVcGRhdGVQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFA+IGV4dGVuZHMgUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxQPiB7Ci0KLQkJQWx3YXlzVXBkYXRlUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8UHJlZmVyZW5jZXM+IHByZWZlcmVuY2VzSG9sZGVyLCBTdHJpbmcga2V5KSB7Ci0JCQlzdXBlcihwcmVmZXJlbmNlc0hvbGRlciwga2V5KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBwcmVmZXJlbmNlSXNUb0JlU2V0KE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkN2U2ZmYuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3ByZWZzL1ByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuTm9kZUNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmEudXRpbC5wcmVmcy5Ob2RlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLnByZWZzLlByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLlByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnByZWZzLlByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBQcmVmZXJlbmNlc1Rlc3RDYXNlIHsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWRWYWx1ZXM7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4gbm9kZUhvbGRlcjsKLQlQcmVmZXJlbmNlc0NvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gcHJlZmVyZW5jZXNBZGFwdGVyOwotCUNvbGxlY3Rpb25FdmVudCBldmVudDsKLQlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGl0ZW1MaXN0ZW5lcjsKLQlib29sZWFuIGxpc3RlbmVyUmVtb3ZlZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRV8xID0gImZvbyAxIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUVfMiA9ICJmb28gMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FXzMgPSAiZm9vIDMiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkdfVkFMVUVfMSA9ICJvcmlnaW5hbCBzdHJpbmcgdmFsdWUgMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19WQUxVRV8yID0gIm9yaWdpbmFsIHN0cmluZyB2YWx1ZSAyIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX1ZBTFVFXzMgPSAib3JpZ2luYWwgc3RyaW5nIHZhbHVlIDMiOwotCi0JcHVibGljIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCXRoaXMudGVzdE5vZGUucHV0KEtFWV9OQU1FXzEsIFNUUklOR19WQUxVRV8xKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMSwgU1RSSU5HX1ZBTFVFXzEpOwotCQl0aGlzLnRlc3ROb2RlLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzIsIFNUUklOR19WQUxVRV8yKTsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMywgU1RSSU5HX1ZBTFVFXzMpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8zLCBTVFJJTkdfVkFMVUVfMyk7Ci0KLQkJdGhpcy5ub2RlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmVmZXJlbmNlcz4odGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyID0gbmV3IFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLm5vZGVIb2xkZXIpOwotCQl0aGlzLmxpc3RlbmVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLml0ZW1MaXN0ZW5lciA9IHRoaXMuYnVpbGRJdGVtTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUywgdGhpcy5saXN0ZW5lcik7Ci0JCXRoaXMuZXZlbnQgPSBudWxsOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJcHJpdmF0ZSB2b2lkIGxvZ0V2ZW50KENvbGxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ICE9IG51bGwpIHsKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5leHBlY3RlZCB0aGlzLmV2ZW50OiAiICsgZSk7Ci0JCQkJfQotCQkJCVByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJdGVtTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3ViamVjdEhvbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FXzEgPSAiYW5vdGhlciBrZXkgMSI7Ci0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FXzIgPSAiYW5vdGhlciBrZXkgMiI7Ci0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FXzMgPSAiYW5vdGhlciBrZXkgMyI7Ci0JCVN0cmluZyBBTk9USEVSX1NUUklOR19WQUxVRV8xID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIDEiOwotCQlTdHJpbmcgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMiA9ICJhbm90aGVyIHN0cmluZyB2YWx1ZSAyIjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzMgPSAiYW5vdGhlciBzdHJpbmcgdmFsdWUgMyI7Ci0JCVByZWZlcmVuY2VzIGFub3RoZXJOb2RlID0gdGhpcy5jbGFzc05vZGUubm9kZSgiYW5vdGhlciB0ZXN0IG5vZGUiKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5jbGVhcigpOwotCQlhbm90aGVyTm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRV8xLCBBTk9USEVSX1NUUklOR19WQUxVRV8xKTsJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoQU5PVEhFUl9LRVlfTkFNRV8xLCBBTk9USEVSX1NUUklOR19WQUxVRV8xKTsKLQkJYW5vdGhlck5vZGUucHV0KEFOT1RIRVJfS0VZX05BTUVfMiwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMik7CXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEFOT1RIRVJfS0VZX05BTUVfMiwgQU5PVEhFUl9TVFJJTkdfVkFMVUVfMik7Ci0JCWFub3RoZXJOb2RlLnB1dChBTk9USEVSX0tFWV9OQU1FXzMsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzMpOwl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FXzMsIEFOT1RIRVJfU1RSSU5HX1ZBTFVFXzMpOwotCi0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShhbm90aGVyTm9kZSk7Ci0JCS8vIGNvbGxlY3Rpb25DaGFuZ2VkIGRvZXMgbm90IHBhc3MgYW55IGl0ZW1zIGluIHRoZSB0aGlzLmV2ZW50Ci0JCXRoaXMudmVyaWZ5RXZlbnQoKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJCi0JCXRoaXMuZXZlbnQgPSBudWxsOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLmNsZWFyKCk7Ci0JCXRoaXMubm9kZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy52ZXJpZnlFdmVudCgpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGhpcy5ub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE5vZGUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KCk7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMuY2xlYXIoKTsKLQkJdGhpcy5leHBlY3RlZFZhbHVlcy5wdXQoS0VZX05BTUVfMSwgU1RSSU5HX1ZBTFVFXzEpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChLRVlfTkFNRV8yLCBTVFJJTkdfVkFMVUVfMik7Ci0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzMsIFNUUklOR19WQUxVRV8zKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBBTk9USEVSX0tFWV9OQU1FID0gImFub3RoZXIga2V5IjsKLQkJU3RyaW5nIEFOT1RIRVJfU1RSSU5HX1ZBTFVFID0gImFub3RoZXIgc3RyaW5nIHZhbHVlIjsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkSXRlbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZXhwZWN0ZWRJdGVtcy5wdXQoQU5PVEhFUl9LRVlfTkFNRSwgQU5PVEhFUl9TVFJJTkdfVkFMVUUpOwotCQl0aGlzLnZlcmlmeUV2ZW50KGV4cGVjdGVkSXRlbXMpOwotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnB1dChBTk9USEVSX0tFWV9OQU1FLCBBTk9USEVSX1NUUklOR19WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmV2ZW50KTsKLQotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZShLRVlfTkFNRV8yKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zU2l6ZSgpKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCVN0cmluZyBrZXkgPSAoKFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPikgKChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zKCkuaXRlcmF0b3IoKS5uZXh0KCkpLmdldEtleSgpOwotCQlhc3NlcnRFcXVhbHMoS0VZX05BTUVfMiwga2V5KTsKLQotCQl0aGlzLmV4cGVjdGVkVmFsdWVzLnJlbW92ZShLRVlfTkFNRV8yKTsKLQkJdGhpcy52ZXJpZnlBZGFwdGVyKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlUHJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkYXB0ZXIodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIpOwotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCVN0cmluZyBESUZGRVJFTlQgPSAic29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IjsKLQkJdGhpcy50ZXN0Tm9kZS5wdXQoS0VZX05BTUVfMiwgRElGRkVSRU5UKTsKLQkJdGhpcy53YWl0Rm9yRXZlbnRRdWV1ZVRvQ2xlYXIoKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZXZlbnQpOwotCi0JCXRoaXMuZXhwZWN0ZWRWYWx1ZXMucHV0KEtFWV9OQU1FXzIsIERJRkZFUkVOVCk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU5vZGUodGhpcy50ZXN0Tm9kZSk7Ci0JCXRoaXMudmVyaWZ5QWRhcHRlcih0aGlzLnByZWZlcmVuY2VzQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHNpdHVhdGlvbiB3aGVyZQotCSAqIC0gd2UgYXJlIGxpc3RlbmluZyB0byB0aGUgbm9kZSB3aGVuIGl0IGdldHMgcmVtb3ZlZCBmcm9tIHRoZSBwcmVmZXJlbmNlcyAicmVwb3NpdG9yeSIKLQkgKiAtIHdlIGdldCBub3RpZmljYXRpb24gdGhhdCBpdCBoYXMgYmVlbiByZW1vdmVkCi0JICogLSB3ZSB0cnkgdG8gcmVtb3ZlIG91ciB0aGlzLmxpc3RlbmVyCi0JICogLSB0aGUgbm9kZSB3aWxsIHRocm93IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAtIHRoZSBhZGFwdGVyIHNob3VsZCBoYW5kbGUgaXQgT0suLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0KLQkJUHJlZmVyZW5jZXMgcGFyZW50ID0gdGhpcy50ZXN0Tm9kZS5wYXJlbnQoKTsKLQkJcGFyZW50LmFkZE5vZGVDaGFuZ2VMaXN0ZW5lcih0aGlzLmJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkpOwotCQl0aGlzLnRlc3ROb2RlLnJlbW92ZU5vZGUoKTsKLQkJdGhpcy50ZXN0Tm9kZS5mbHVzaCgpOwkJLy8gdGhpcyBzZWVtcyB0byBiZSByZXF1aXJlZCBmb3IgdGhlIHRoaXMuZXZlbnQgdG8gdHJpZ2dlci4uLgotCQl0aGlzLndhaXRGb3JFdmVudFF1ZXVlVG9DbGVhcigpOwotCi0JCWFzc2VydFRydWUodGhpcy5saXN0ZW5lclJlbW92ZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCX0KLQotCXByaXZhdGUgTm9kZUNoYW5nZUxpc3RlbmVyIGJ1aWxkUGFyZW50Tm9kZUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE5vZGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoaWxkQWRkZWQoTm9kZUNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGNoaWxkUmVtb3ZlZChOb2RlQ2hhbmdlRXZlbnQgZSkgewotCQkJCWlmIChlLmdldENoaWxkKCkgPT0gUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMudGVzdE5vZGUpIHsKLQkJCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIFByZWZlcmVuY2VzQ29sbGVjdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLmxpc3RlbmVyKTsKLQkJCQkJLy8gdGhpcyBsaW5lIG9mIGNvZGUgd2lsbCBub3QgZXhlY3V0ZSBpZiB0aGUgbGluZSBhYm92ZSB0cmlnZ2VycyBhbiBleGNlcHRpb24KLQkJCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMubGlzdGVuZXJSZW1vdmVkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ub2RlSGFzQW55UHJlZkxpc3RlbmVycyh0aGlzLnRlc3ROb2RlKSk7Ci0JCXRoaXMucHJlZmVyZW5jZXNBZGFwdGVyLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIHRoaXMubGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQotCQlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcjIgPSB0aGlzLmJ1aWxkQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5oYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKENvbGxlY3Rpb25WYWx1ZU1vZGVsLlZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHRoaXMubm9kZUhhc0FueVByZWZMaXN0ZW5lcnModGhpcy50ZXN0Tm9kZSkpOwotCQl0aGlzLnByZWZlcmVuY2VzQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcjIpOwotCQlhc3NlcnRGYWxzZSh0aGlzLm5vZGVIYXNBbnlQcmVmTGlzdGVuZXJzKHRoaXMudGVzdE5vZGUpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIuaGFzQW55Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJ1aWxkQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2hhbmdlQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGUpIHsKLQkJCQl0aGlzLmxvZ0V2ZW50KGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBlKSB7Ci0JCQkJdGhpcy5sb2dFdmVudChlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZSkgewotCQkJCXRoaXMubG9nRXZlbnQoZSk7Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgbG9nRXZlbnQoQ29sbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgIT0gbnVsbCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHRoaXMuZXZlbnQ6ICIgKyBlKTsKLQkJCQl9Ci0JCQkJUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlFdmVudChNYXA8U3RyaW5nLCBTdHJpbmc+IGl0ZW1zKSB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQoKTsKLQkJYXNzZXJ0RXF1YWxzKGl0ZW1zLnNpemUoKSwgKChDb2xsZWN0aW9uQWRkRXZlbnQpIHRoaXMuZXZlbnQpLmdldEl0ZW1zU2l6ZSgpKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4gZXZlbnRJdGVtcyA9IChJdGVyYWJsZTxQcmVmZXJlbmNlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4+KSAoKENvbGxlY3Rpb25BZGRFdmVudCkgdGhpcy5ldmVudCkuZ2V0SXRlbXMoKTsKLQkJdGhpcy52ZXJpZnlJdGVtcyhpdGVtcywgZXZlbnRJdGVtcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUV2ZW50KCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHModGhpcy5wcmVmZXJlbmNlc0FkYXB0ZXIsIHRoaXMuZXZlbnQuZ2V0U291cmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCB0aGlzLmV2ZW50LmdldENvbGxlY3Rpb25OYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlOb2RlKFByZWZlcmVuY2VzIG5vZGUpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmdbXSBrZXlzID0gbm9kZS5rZXlzKCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmV4cGVjdGVkVmFsdWVzLnNpemUoKSwga2V5cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWFzc2VydEVxdWFscyh0aGlzLmV4cGVjdGVkVmFsdWVzLmdldChrZXlzW2ldKSwgbm9kZS5nZXQoa2V5c1tpXSwgIjxtaXNzaW5nIHByZWZlcmVuY2U+IikpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUFkYXB0ZXIoUHJlZmVyZW5jZXNDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGN2bSkgewotCQlhc3NlcnRFcXVhbHModGhpcy5leHBlY3RlZFZhbHVlcy5zaXplKCksIGN2bS5zaXplKCkpOwotCQl0aGlzLnZlcmlmeUl0ZW1zKHRoaXMuZXhwZWN0ZWRWYWx1ZXMsIGN2bSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUl0ZW1zKE1hcDxTdHJpbmcsIFN0cmluZz4gZXhwZWN0ZWQsIEl0ZXJhYmxlPFByZWZlcmVuY2VQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPj4gYWN0dWFsKSB7Ci0JCWZvciAoUHJlZmVyZW5jZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG1vZGVsIDogYWN0dWFsKSB7Ci0JCQltb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5pdGVtTGlzdGVuZXIpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldChtb2RlbC5nZXRLZXkoKSksIG1vZGVsLmdldFZhbHVlKCkpOwotCQkJbW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaXRlbUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSGFzQW55UHJlZkxpc3RlbmVycyhQcmVmZXJlbmNlcyBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUHJlZmVyZW5jZUNoYW5nZUxpc3RlbmVyW10gcHJlZkxpc3RlbmVycyA9IChQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXJbXSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobm9kZSwgInByZWZMaXN0ZW5lcnMiKTsKLQkJcmV0dXJuIHByZWZMaXN0ZW5lcnMubGVuZ3RoID4gMDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvcHJlZnMvUHJlZmVyZW5jZXNUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWUyYzc0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9wcmVmcy9QcmVmZXJlbmNlc1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuQWJzdHJhY3RQcmVmZXJlbmNlczsKLWltcG9ydCBqYXZhLnV0aWwucHJlZnMuUHJlZmVyZW5jZXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotLyoqCi0gKiBzZXQgdXAgYW5kIHRlYXIgZG93biBhIHRlc3Qgbm9kZSBmb3IgYW55IHN1YmNsYXNzIHRoYXQKLSAqIG5lZWRzIHRvIHRlc3QgcHJlZmVyZW5jZXMtcmVsYXRlZCBzdHVmZgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcmVmZXJlbmNlc1Rlc3RDYXNlIGV4dGVuZHMgVGVzdENhc2UgewotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBjbGFzc05vZGU7Ci0JcHVibGljIFByZWZlcmVuY2VzIHRlc3ROb2RlOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTk9ERV9OQU1FID0gInRlc3Qgbm9kZSI7Ci0KLQlwdWJsaWMgUHJlZmVyZW5jZXNUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlQcmVmZXJlbmNlcyBwYWNrYWdlTm9kZSA9IFByZWZlcmVuY2VzLnVzZXJOb2RlRm9yUGFja2FnZSh0aGlzLmdldENsYXNzKCkpOwotCQl0aGlzLmNsYXNzTm9kZSA9IHBhY2thZ2VOb2RlLm5vZGUodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCS8vIGNsZWFuIG91dCBhbnkgbGVmdG92ZXIgY3JhcC4uLgotCQlpZiAoKHRoaXMuY2xhc3NOb2RlLmtleXMoKS5sZW5ndGggPiAwKSB8fCAodGhpcy5jbGFzc05vZGUuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCA+IDApKSB7Ci0JCQl0aGlzLmNsYXNzTm9kZS5yZW1vdmVOb2RlKCk7Ci0JCQkvLyAuLi5hbmQgcmUtY3JlYXRlIHRoZSBub2RlCi0JCQl0aGlzLmNsYXNzTm9kZSA9IHBhY2thZ2VOb2RlLm5vZGUodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCX0KLQkJdGhpcy50ZXN0Tm9kZSA9IHRoaXMuY2xhc3NOb2RlLm5vZGUoVEVTVF9OT0RFX05BTUUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHdhaXQgZm9yIGFsbCB0aGUgZXZlbnRzIHRvIGJlIGRlbGl2ZXJlZCBiZWZvcmUgdGVhcmluZyBkb3duCi0JCXRoaXMud2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCk7Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSB0aGlzLmNsYXNzTm9kZS5wYXJlbnQoKTsKLQkJdGhpcy5jbGFzc05vZGUucmVtb3ZlTm9kZSgpOwotCQl3aGlsZSAodGhpcy5ub2RlSXNWZXN0aWdpYWwobm9kZSkpIHsKLQkJCVByZWZlcmVuY2VzIHBhcmVudCA9IG5vZGUucGFyZW50KCk7Ci0JCQlub2RlLnJlbW92ZU5vZGUoKTsKLQkJCW5vZGUgPSBwYXJlbnQ7Ci0JCX0KLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBub2RlSXNWZXN0aWdpYWwoUHJlZmVyZW5jZXMgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsKQotCQkJJiYgKG5vZGUua2V5cygpLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vZGUuY2hpbGRyZW5OYW1lcygpLmxlbmd0aCA9PSAwKQotCQkJJiYgKG5vZGUgIT0gUHJlZmVyZW5jZXMudXNlclJvb3QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd2FpdEZvckV2ZW50UXVldWVUb0NsZWFyKCkgewotCQl3aGlsZSAoICEgdGhpcy5wcmVmZXJlbmNlc0V2ZW50UXVldWUoKS5pc0VtcHR5KCkpIHsKLQkJCVRlc3RUb29scy5zbGVlcCgxMDApOwotCQl9Ci0JCVRlc3RUb29scy5zbGVlcCgxMDApOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxFdmVudE9iamVjdD4gcHJlZmVyZW5jZXNFdmVudFF1ZXVlKCkgewotCQlyZXR1cm4gKExpc3Q8RXZlbnRPYmplY3Q+KSBSZWZsZWN0aW9uVG9vbHMuZ2V0U3RhdGljRmllbGRWYWx1ZShBYnN0cmFjdFByZWZlcmVuY2VzLmNsYXNzLCAiZXZlbnRRdWV1ZSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTdjOGUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnV0dG9uTW9kZWxBZGFwdGVyOwotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIgPSBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5ib29sZWFuSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB0aGlzLmJvb2xlYW5Ib2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydFRydWUodGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJdGhpcy5ib29sZWFuSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRUcnVlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCXRoaXMuYm9vbGVhbkhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJvb2xlYW5Ib2xkZXIuc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gbG9jYWxCb29sZWFuSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPikgdGhpcy5ib29sZWFuSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbEJvb2xlYW5Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxCb29sZWFuSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbEJvb2xlYW5Ib2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5idXR0b25Nb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhPYmplY3QgbW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlFdmVudExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QgPSAoRXZlbnRMaXN0ZW5lckxpc3QpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKG1vZGVsLCAibGlzdGVuZXJMaXN0Iik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RmFsc2UobGlzdGVuZXJMaXN0LmdldExpc3RlbmVyTGlzdCgpLmxlbmd0aCA9PSAwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIGNsYXNzICoqKioqKioqKioKLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzc0NjRlLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9DaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50Lkl0ZW1FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5JdGVtTGlzdGVuZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQnV0dG9uTW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQ2hlY2tCb3g7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5DaGVja0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNoZWNrIGJveGVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCB7Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCB0ZXN0TW9kZWw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHRlc3RNb2RlbEhvbGRlcjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGZsYWcxSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZmxhZzJIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBub3RGbGFnMkhvbGRlcjsKLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGZsYWcxQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBmbGFnMkJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgbm90RmxhZzJCdXR0b25Nb2RlbDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhlYygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RNb2RlbCA9IG5ldyBUZXN0TW9kZWwodHJ1ZSwgdHJ1ZSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5mbGFnMUhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMUhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzFCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmZsYWcxSG9sZGVyKTsKLQkJdGhpcy5mbGFnMkhvbGRlciA9IHRoaXMuYnVpbGRGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMuZmxhZzJCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLmZsYWcySG9sZGVyKTsKLQkJdGhpcy5ub3RGbGFnMkhvbGRlciA9IHRoaXMuYnVpbGROb3RGbGFnMkhvbGRlcih0aGlzLnRlc3RNb2RlbEhvbGRlcik7Ci0JCXRoaXMubm90RmxhZzJCdXR0b25Nb2RlbCA9IHRoaXMuYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcih0aGlzLm5vdEZsYWcySG9sZGVyKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcxSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4odm0sIFRlc3RNb2RlbC5GTEFHMV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcxKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4odm0sIFRlc3RNb2RlbC5GTEFHMl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0ZsYWcyKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRGbGFnMih2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vdEZsYWcySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+IHZtKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgQm9vbGVhbj4odm0sIFRlc3RNb2RlbC5OT1RfRkxBRzJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNOb3RGbGFnMigpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Tm90RmxhZzIodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRDaGVja0JveE1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBib29sZWFuSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIoYm9vbGVhbkhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg0MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDaGVja0JveFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ2hlY2tCb3hQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEZsYWcxQ2hlY2tCb3goKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRGbGFnMkNoZWNrQm94KCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkTm90RmxhZzJDaGVja0JveCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFVuYXR0YWNoZWRDaGVja0JveCgpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGRGbGFnMUNoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMSIpOwotCQljaGVja0JveC5zZXRNb2RlbCh0aGlzLmZsYWcxQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGRGbGFnMkNoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoImZsYWcgMiIpOwotCQljaGVja0JveC5zZXRNb2RlbCh0aGlzLmZsYWcyQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGROb3RGbGFnMkNoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCk7Ci0JCWNoZWNrQm94LnNldFRleHQoIm5vdCBmbGFnIDIiKTsKLQkJY2hlY2tCb3guc2V0TW9kZWwodGhpcy5ub3RGbGFnMkJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgSkNoZWNrQm94IGJ1aWxkVW5hdHRhY2hlZENoZWNrQm94KCkgewotCQlKQ2hlY2tCb3ggY2hlY2tCb3ggPSBuZXcgSkNoZWNrQm94KCJ1bmF0dGFjaGVkIik7Ci0JCWNoZWNrQm94LmdldE1vZGVsKCkuYWRkSXRlbUxpc3RlbmVyKHRoaXMuYnVpbGRVbmF0dGFjaGVkSXRlbUxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJpdmF0ZSBJdGVtTGlzdGVuZXIgYnVpbGRVbmF0dGFjaGVkSXRlbUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1TdGF0ZUNoYW5nZWQoSXRlbUV2ZW50IGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuYXR0YWNoZWQgc3RhdGUgY2hhbmdlZDogIiArIGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEZsaXBGbGFnMUJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludE1vZGVsQnV0dG9uKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEZsaXBGbGFnMUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRGbGlwRmxhZzFBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRGbGlwRmxhZzFBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImZsaXAgZmxhZyAxIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5mbGlwRmxhZzEoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBmbGlwRmxhZzEoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldEZsYWcxKCAhIHRoaXMudGVzdE1vZGVsLmlzRmxhZzEoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkQ2xlYXJNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigiY2xlYXIgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDaGVja0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ2hlY2tCb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNoZWNrQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiZmxhZyAxOiAiICsgdGhpcy50ZXN0TW9kZWwuaXNGbGFnMSgpKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc0ZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBmbGFnIDI6ICIgKyB0aGlzLnRlc3RNb2RlbC5pc05vdEZsYWcyKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiIpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZsYWcxOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBRzFfUFJPUEVSVFkgPSAiZmxhZzEiOwotCQlwcml2YXRlIGJvb2xlYW4gZmxhZzI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHMl9QUk9QRVJUWSA9ICJmbGFnMiI7Ci0JCXByaXZhdGUgYm9vbGVhbiBub3RGbGFnMjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9GTEFHMl9QUk9QRVJUWSA9ICJub3RGbGFnMiI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoYm9vbGVhbiBmbGFnMSwgYm9vbGVhbiBmbGFnMikgewotCQkJdGhpcy5mbGFnMSA9IGZsYWcxOwotCQkJdGhpcy5mbGFnMiA9IGZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMSgpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcxOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcxKGJvb2xlYW4gZmxhZzEpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMTsKLQkJCXRoaXMuZmxhZzEgPSBmbGFnMTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMV9QUk9QRVJUWSwgb2xkLCBmbGFnMSk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gaXNGbGFnMigpIHsKLQkJCXJldHVybiB0aGlzLmZsYWcyOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldEZsYWcyKGJvb2xlYW4gZmxhZzIpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5mbGFnMjsKLQkJCXRoaXMuZmxhZzIgPSBmbGFnMjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGTEFHMl9QUk9QRVJUWSwgb2xkLCBmbGFnMik7Ci0JCi0JCQlvbGQgPSB0aGlzLm5vdEZsYWcyOwotCQkJdGhpcy5ub3RGbGFnMiA9ICEgZmxhZzI7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9UX0ZMQUcyX1BST1BFUlRZLCBvbGQsIHRoaXMubm90RmxhZzIpOwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGlzTm90RmxhZzIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5ub3RGbGFnMjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROb3RGbGFnMihib29sZWFuIG5vdEZsYWcyKSB7Ci0JCQl0aGlzLnNldEZsYWcyKCAhIG5vdEZsYWcyKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmlzRmxhZzEoKSArICIgLSAiICsgdGhpcy5pc0ZsYWcyKCkgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTE2MTE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmF4LnN3aW5nLkNvbWJvQm94TW9kZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdE1vZGVsOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db21ib0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLlNpbXBsZURpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db29yZGluYXRlZExpc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxEaXNwbGF5YWJsZT4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBzZWxlY3Rpb25Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4obGlzdEhvbGRlci5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQotCQlDb21ib0JveE1vZGVsIGNvbWJvQm94TW9kZWwgPSBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIobGlzdEhvbGRlciwgc2VsZWN0aW9uSG9sZGVyKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCWFzc2VydEZhbHNlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhjb21ib0JveE1vZGVsKTsKLQotCQlDb29yZGluYXRlZExpc3Q8RGlzcGxheWFibGU+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8RGlzcGxheWFibGU+KGNvbWJvQm94TW9kZWwpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZFNlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCXNlbGVjdGlvbkhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKHNlbGVjdGlvbkhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMoY29tYm9Cb3hNb2RlbCk7Ci0KLQkJY29tYm9Cb3hNb2RlbC5yZW1vdmVMaXN0RGF0YUxpc3RlbmVyKHN5bmNoTGlzdCk7Ci0JCXNlbGVjdGlvbkhvbGRlci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsaXN0SG9sZGVyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VsZWN0aW9uSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldnQpIHsKLQkJCQkvLyBkbyBub3RoaW5nLi4uCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzID0gKChCb29sZWFuKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChsaXN0TW9kZWwsICJoYXNOb0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc05vTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RNb2RlbCBsaXN0TW9kZWwpIHRocm93cyBFeGNlcHRpb24gewotCQlib29sZWFuIGhhc0xpc3RlbmVycyA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTGlzdERhdGFMaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JCWFzc2VydFRydWUoaGFzTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPERpc3BsYXlhYmxlPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8RGlzcGxheWFibGU+KHRoaXMuYnVpbGRMaXN0KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdDxEaXNwbGF5YWJsZT4gYnVpbGRMaXN0KCkgewotCQlMaXN0PERpc3BsYXlhYmxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxEaXNwbGF5YWJsZT4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24obGlzdCk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxEaXNwbGF5YWJsZT4gYykgewotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImZvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJiYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiYmF6IikpOwotCQljLmFkZChuZXcgU2ltcGxlRGlzcGxheWFibGUoImpvbyIpKTsKLQkJYy5hZGQobmV3IFNpbXBsZURpc3BsYXlhYmxlKCJqYXIiKSk7Ci0JCWMuYWRkKG5ldyBTaW1wbGVEaXNwbGF5YWJsZSgiamF6IikpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0NvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1MGJkZi4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQ29tYm9Cb3hNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuVUlNYW5hZ2VyOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuQ29tYm9Cb3hNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkZpbHRlcmluZ0xpc3RCcm93c2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5MaXN0Q2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU2ltcGxlTGlzdENlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci0KLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGNvbWJvLWJveGVzLgotICogCi0gKiBEZWZhdWx0TG9uZ0xpc3RCcm93c2VyRGlhbG9nVUlUZXN0IHN1YmNsYXNzZXMgdGhpcyBjbGFzczsgc28gYmUKLSAqIGNhcmVmdWwgd2hlbiBtYWtpbmcgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJvdGVjdGVkIEpGcmFtZSB3aW5kb3c7Ci0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9ySG9sZGVyOwotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBjb2xvckxpc3RIb2xkZXI7Ci0JcHJvdGVjdGVkIENvbWJvQm94TW9kZWwgY29sb3JDb21ib0JveE1vZGVsOwotCXByaXZhdGUgaW50IG5leHRDb2xvck51bWJlciA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0KCkuZXhlYygpOwotCX0KLQotCXByb3RlY3RlZCBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChVSU1hbmFnZXIuZ2V0U3lzdGVtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKFVJTWFuYWdlci5nZXRDcm9zc1BsYXRmb3JtTG9va0FuZEZlZWxDbGFzc05hbWUoKSk7CS8vIE1ldGFsIExBRgotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChjb20uc3VuLmphdmEuc3dpbmcucGxhZi53aW5kb3dzLldpbmRvd3NMb29rQW5kRmVlbC5jbGFzcy5nZXROYW1lKCkpOwotLy8JCVVJTWFuYWdlci5zZXRMb29rQW5kRmVlbChjb20uc3VuLmphdmEuc3dpbmcucGxhZi5tb3RpZi5Nb3RpZkxvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0vLwkJVUlNYW5hZ2VyLnNldExvb2tBbmRGZWVsKG9yYWNsZS5iYWxpLmV3dC5vbGFmLk9yYWNsZUxvb2tBbmRGZWVsLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRoaXMudGVzdE1vZGVsID0gdGhpcy5idWlsZFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuY29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmNvbG9yTGlzdEhvbGRlciA9IHRoaXMuYnVpbGRDb2xvckxpc3RIb2xkZXIoKTsKLQkJdGhpcy5jb2xvckNvbWJvQm94TW9kZWwgPSB0aGlzLmJ1aWxkQ29tYm9Cb3hNb2RlbEFkYXB0ZXIodGhpcy5jb2xvckxpc3RIb2xkZXIsIHRoaXMuY29sb3JIb2xkZXIpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5DT0xPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sb3IoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwoKTsKLQl9Ci0KLQlwcml2YXRlIFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihUZXN0TW9kZWwudmFsaWRDb2xvcnMoKSk7Ci0vLwkJcmV0dXJuIG5ldyBBYnN0cmFjdFJlYWRPbmx5TGlzdFZhbHVlTW9kZWwoKSB7Ci0vLwkJCXB1YmxpYyBPYmplY3QgdmFsdWUoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yKFRlc3RNb2RlbC5WQUxJRF9DT0xPUlMpOwotLy8JCQl9Ci0vLwkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLS8vCQkJCXJldHVybiBUZXN0TW9kZWwuVkFMSURfQ09MT1JTLmxlbmd0aDsKLS8vCQkJfQotLy8JCX07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gdWlDb2xvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbG9yTGlzdEhvbGRlcjsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRDb21ib0JveE1vZGVsQWRhcHRlcihMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gc2VsZWN0aW9uSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tYm9Cb3hNb2RlbEFkYXB0ZXIobGlzdEhvbGRlciwgc2VsZWN0aW9uSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbldpbmRvdygpIHsKLQkJdGhpcy53aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQl0aGlzLndpbmRvdy5zZXREZWZhdWx0Q2xvc2VPcGVyYXRpb24oV2luZG93Q29uc3RhbnRzLkRPX05PVEhJTkdfT05fQ0xPU0UpOwotCQl0aGlzLndpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXRoaXMud2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl0aGlzLndpbmRvdy5zZXRMb2NhdGlvbigzMDAsIDMwMCk7Ci0JCXRoaXMud2luZG93LnNldFNpemUoNDAwLCAxNTApOwotCQl0aGlzLndpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveFBhbmVsKCksIEJvcmRlckxheW91dC5OT1JUSCk7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByb3RlY3RlZCBKUGFuZWwgYnVpbGRDb21ib0JveFBhbmVsKCkgewotCQlKUGFuZWwgcGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveCgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRDb21ib0JveCgpKTsKLQkJcGFuZWwuYWRkKHRoaXMuYnVpbGRMaXN0Q2hvb3NlcjEoKSk7Ci0JCXBhbmVsLmFkZCh0aGlzLmJ1aWxkTGlzdENob29zZXIyKCkpOwotCQlyZXR1cm4gcGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggYnVpbGRDb21ib0JveCgpIHsKLQkJSkNvbWJvQm94IGNvbWJvQm94ID0gbmV3IEpDb21ib0JveCh0aGlzLmNvbG9yQ29tYm9Cb3hNb2RlbCk7Ci0JCWNvbWJvQm94LnNldFJlbmRlcmVyKHRoaXMuYnVpbGRDb21ib0JveFJlbmRlcmVyKCkpOwotCQlyZXR1cm4gY29tYm9Cb3g7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RDZWxsUmVuZGVyZXIgYnVpbGRDb21ib0JveFJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZUxpc3RDZWxsUmVuZGVyZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRUZXh0KE9iamVjdCB2YWx1ZSkgewotCQkJCXJldHVybiBzdXBlci5idWlsZFRleHQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdENob29zZXIgYnVpbGRMaXN0Q2hvb3NlcjEoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0Q2hvb3NlcjEodGhpcy5jb2xvckNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgTGlzdENob29zZXIgYnVpbGRMaXN0Q2hvb3NlcjIoKSB7Ci0JCXJldHVybiBuZXcgTG9jYWxMaXN0Q2hvb3NlcjIodGhpcy5jb2xvckNvbWJvQm94TW9kZWwpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgyLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0Q29sb3JCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkVGVuQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZW1vdmVUZW5CdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZXNldCBjb2xvciBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0Q29sb3JCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRDb2xvckFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0Q29sb3JBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IGNvbG9yIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldENvbG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRDb2xvcigpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0Q29sb3IoVGVzdE1vZGVsLkRFRkFVTFRfQ09MT1IpOwotCX0KLQotCS8vICoqKioqKioqKiogY2xlYXIgbW9kZWwgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogcmVzdG9yZSBtb2RlbCBidXR0b24gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc3RvcmUgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpbnQgbW9kZWwgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucHJpbnRNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHByaW50TW9kZWwoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0aGlzLnRlc3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGQgMjAgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRUZW5CdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkVGVuQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkVGVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQgMjAiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZFRlbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGFkZFRlbigpIHsKLQkJZm9yIChpbnQgaSA9IHRoaXMubmV4dENvbG9yTnVtYmVyOyBpIDwgdGhpcy5uZXh0Q29sb3JOdW1iZXIgKyAyMDsgaSsrKSB7Ci0JCQl0aGlzLmNvbG9yTGlzdEhvbGRlci5hZGQodGhpcy5jb2xvckxpc3RIb2xkZXIuc2l6ZSgpLCAiY29sb3IiICsgaSk7Ci0JCX0KLQkJdGhpcy5uZXh0Q29sb3JOdW1iZXIgKz0gMjA7Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW1vdmUgMjAgYnV0dG9uICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVUZW5CdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlVGVuQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlVGVuQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZW1vdmUgMjAiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZVRlbigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlbW92ZVRlbigpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5jb2xvckxpc3RIb2xkZXIuc2l6ZSgpID4gMCkgewotCQkJCXRoaXMuY29sb3JMaXN0SG9sZGVyLnJlbW92ZSh0aGlzLmNvbG9yTGlzdEhvbGRlci5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgY29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUl9QUk9QRVJUWSA9ICJjb2xvciI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SQU5HRSA9ICJvcmFuZ2UiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUVMTE9XID0gInllbGxvdyI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVFTiA9ICJncmVlbiI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ESUdPID0gImluZGlnbyI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSU9MRVQgPSAidmlvbGV0IjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09MT1IgPSBSRUQ7Ci0JCQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiB2YWxpZENvbG9yczsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gREVGQVVMVF9WQUxJRF9DT0xPUlMgPSB7Ci0JCQkJUkVELAotCQkJCU9SQU5HRSwKLQkJCQlZRUxMT1csCi0JCQkJR1JFRU4sCi0JCQkJQkxVRSwKLQkJCQlJTkRJR08sCi0JCQkJVklPTEVUCi0JCQl9OwotCQotCQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiB2YWxpZENvbG9ycygpIHsKLQkJCWlmICh2YWxpZENvbG9ycyA9PSBudWxsKSB7Ci0JCQkJdmFsaWRDb2xvcnMgPSBidWlsZERlZmF1bHRWYWxpZENvbG9ycygpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkQ29sb3JzOwotCQl9Ci0JCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFZhbGlkQ29sb3JzKCkgewotCQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyZXN1bHQsIERFRkFVTFRfVkFMSURfQ09MT1JTKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkKLQkJcHVibGljIFRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuY29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQl0aGlzLmNoZWNrQ29sb3IoY29sb3IpOwotCQkJT2JqZWN0IG9sZCA9IHRoaXMuY29sb3I7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZCwgY29sb3IpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNoZWNrQ29sb3IoU3RyaW5nIGMpIHsKLQkJCWlmICggISB2YWxpZENvbG9ycygpLmNvbnRhaW5zKGMpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjKTsKLQkJCX0KLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGVzdE1vZGVsKCIgKyB0aGlzLmNvbG9yICsgIikiOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdENob29zZXIxIGV4dGVuZHMgTGlzdENob29zZXIgewotCQlwdWJsaWMgTG9jYWxMaXN0Q2hvb3NlcjEoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIobW9kZWwpOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIExvY2FsTGlzdENob29zZXIyIGV4dGVuZHMgTGlzdENob29zZXIgewotCQlwdWJsaWMgTG9jYWxMaXN0Q2hvb3NlcjIoQ29tYm9Cb3hNb2RlbCBtb2RlbCkgewotCQkJc3VwZXIobW9kZWwpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEJyb3dzZXIgYnVpbGRCcm93c2VyKCkgewotCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdMaXN0QnJvd3NlcjxTdHJpbmc+KCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9Db21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwMGY0Yy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5TaW1wbGVMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QyIGV4dGVuZHMgQ29tYm9Cb3hNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBDb21ib0JveE1vZGVsQWRhcHRlclVJVGVzdDIoKS5leGVjKCk7Ci0JfQotCi0JcHVibGljIENvbWJvQm94TW9kZWxBZGFwdGVyVUlUZXN0MigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2UgYSBkaWZmZXJlbnQgbW9kZWwgdGhhdCBhbGxvd3MgdGhlIGNvbG9yIHRvIGJlIHNldCB0byBudWxsCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RNb2RlbCBidWlsZFRlc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0TW9kZWwyKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkIGEgbnVsbCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiB1aUNvbG9yTGlzdEhvbGRlcigpIHsKLQkJLy8gdGhlIGRlZmF1bHQgaXMgdG8gcHJlcGVuZCB0aGUgd3JhcHBlZCBsaXN0IHdpdGggYSBudWxsIGl0ZW0KLQkJcmV0dXJuIG5ldyBFeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxTdHJpbmc+KHN1cGVyLnVpQ29sb3JMaXN0SG9sZGVyKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZlcnQgbnVsbCB0byBzb21lIHRleHQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdENlbGxSZW5kZXJlciBidWlsZENvbWJvQm94UmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdENlbGxSZW5kZXJlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoT2JqZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/ICI8bm9uZSBzZWxlY3RlZD4iIDogc3VwZXIuYnVpbGRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGVzdE1vZGVsMiBleHRlbmRzIFRlc3RNb2RlbCB7Ci0JCS8qKgotCQkgKiBudWxsIGlzIE9LIGhlcmUKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjaGVja0NvbG9yKFN0cmluZyBjb2xvcikgewotCQkJaWYgKGNvbG9yID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzdXBlci5jaGVja0NvbG9yKGNvbG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9EYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDljNzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RhdGVTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBEYXRlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnNldFZhbHVlKG5ld0RhdGUpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyg3Nzc3NzcsICgoRGF0ZSkgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlEYXRlIG5ld0RhdGUgPSBuZXcgRGF0ZSgpOwotCQluZXdEYXRlLnNldFRpbWUoNzc3Nzc3KTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXdEYXRlKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlEYXRlU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKCgoRGF0ZSkgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpLmdldFRpbWUoKSA9PSA3Nzc3NzcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKERhdGVTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxJbml0aWFsVmFsdWUoKSB7Ci0JCURhdGUgdG9kYXkgPSBuZXcgRGF0ZSgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciA9IG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCB0b2RheSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZERhdGVDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKHRvZGF5LCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJRGF0ZSBuZXdEYXRlID0gbmV3IERhdGUoKTsKLQkJbmV3RGF0ZS5zZXRUaW1lKDc3Nzc3Nyk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUobmV3RGF0ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoNzc3Nzc3LCAoKERhdGUpIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKS5nZXRUaW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMDZkMC4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5Eb2N1bWVudEV2ZW50LkV2ZW50VHlwZTsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyOwotCURvY3VtZW50IGRvY3VtZW50QWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgRG9jdW1lbnRBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdHJpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oIjAxMjM0NTY3ODkiKTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIgPSBuZXcgRG9jdW1lbnRBZGFwdGVyKHRoaXMuc3RyaW5nSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RyaW5nTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuUkVNT1ZFLCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgcmVtb3ZhbCBvZiAiMjM0NTYiCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscyg1LCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLnJlbW92ZSgyLCA1KTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoIjAxNzg5IiwgdGhpcy5zdHJpbmdIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc2VydCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuSU5TRVJULCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgaW5zZXJ0IG9mICJ4eHh4eHgiCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscyg1LCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLmluc2VydFN0cmluZygyLCAieHh4eHgiLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoIjAxeHh4eHgyMzQ1Njc4OSIsIHRoaXMuc3RyaW5nSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy5kb2N1bWVudEFkYXB0ZXIuYWRkRG9jdW1lbnRMaXN0ZW5lcihuZXcgVGVzdERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuSU5TRVJULCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgaW5zZXJ0IG9mICJmb28iCi0JCQkJYXNzZXJ0RXF1YWxzKDAsIGUuZ2V0T2Zmc2V0KCkpOwotCQkJCWFzc2VydEVxdWFscygzLCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQkJCWFzc2VydEVxdWFscyhFdmVudFR5cGUuUkVNT1ZFLCBlLmdldFR5cGUoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKERvY3VtZW50QWRhcHRlclRlc3RzLnRoaXMuZG9jdW1lbnRBZGFwdGVyLCBlLmdldERvY3VtZW50KCkpOwotCQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgcmVtb3ZhbCBvZiAiMDEyMzQ1Njc4OSIKLQkJCQlhc3NlcnRFcXVhbHMoMCwgZS5nZXRPZmZzZXQoKSk7Ci0JCQkJYXNzZXJ0RXF1YWxzKDEwLCBlLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiMDEyMzQ1Njc4OSIsIHRoaXMuZG9jdW1lbnRBZGFwdGVyLmdldFRleHQoMCwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0TGVuZ3RoKCkpKTsKLQkJdGhpcy5zdHJpbmdIb2xkZXIuc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGhpcy5kb2N1bWVudEFkYXB0ZXIuZ2V0VGV4dCgwLCB0aGlzLmRvY3VtZW50QWRhcHRlci5nZXRMZW5ndGgoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbG9jYWxTdHJpbmdIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4pIHRoaXMuc3RyaW5nSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmRvY3VtZW50QWRhcHRlcik7Ci0KLQkJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0RG9jdW1lbnRMaXN0ZW5lcigpOwotCQl0aGlzLmRvY3VtZW50QWRhcHRlci5hZGREb2N1bWVudExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5kb2N1bWVudEFkYXB0ZXIpOwotCi0JCXRoaXMuZG9jdW1lbnRBZGFwdGVyLnJlbW92ZURvY3VtZW50TGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFN0cmluZ0hvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLmRvY3VtZW50QWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBkb2N1bWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGRvY3VtZW50LCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldERvY3VtZW50TGlzdGVuZXJzIik7Ci0JCWFzc2VydEVxdWFscygwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBkb2N1bWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBkZWxlZ2F0ZSA9IFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGRvY3VtZW50LCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldERvY3VtZW50TGlzdGVuZXJzIik7Ci0JCWFzc2VydEZhbHNlKGxpc3RlbmVycy5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLXByaXZhdGUgY2xhc3MgVGVzdERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBEb2N1bWVudExpc3RlbmVyIHsKLQlUZXN0RG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JcHVibGljIHZvaWQgY2hhbmdlZFVwZGF0ZShEb2N1bWVudEV2ZW50IGUpIHsKLQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCX0KLQlwdWJsaWMgdm9pZCBpbnNlcnRVcGRhdGUoRG9jdW1lbnRFdmVudCBlKSB7Ci0JCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQl9Ci0JcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlKERvY3VtZW50RXZlbnQgZSkgewotCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JfQotfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvRG9jdW1lbnRBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOTlmNTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0RvY3VtZW50QWRhcHRlclVJVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YS5hd3QuQm9yZGVyTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LkNvbXBvbmVudDsKLWltcG9ydCBqYXZhLmF3dC5HcmlkTGF5b3V0OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkFic3RyYWN0RG9jdW1lbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgamF2YXguc3dpbmcudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLnRleHQuUGxhaW5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBQbGF5IGFyb3VuZCB3aXRoIGEgc2V0IG9mIGVudHJ5IGZpZWxkcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRBZGFwdGVyVUlUZXN0IHsKLQotCXByaXZhdGUgVGVzdE1vZGVsIHRlc3RNb2RlbDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfTkFNRSA9ICJTY29vYnkgRG9vIjsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdGVzdE1vZGVsSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBuYW1lSG9sZGVyOwotCXByaXZhdGUgRG9jdW1lbnQgbmFtZURvY3VtZW50OwotCXByaXZhdGUgRG9jdW1lbnQgdXBwZXJDYXNlTmFtZURvY3VtZW50OwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBEb2N1bWVudEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0TW9kZWwgPSBuZXcgVGVzdE1vZGVsKERFRkFVTFRfTkFNRSk7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxUZXN0TW9kZWw+KHRoaXMudGVzdE1vZGVsKTsKLQkJdGhpcy5uYW1lSG9sZGVyID0gdGhpcy5idWlsZE5hbWVIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLm5hbWVEb2N1bWVudCA9IHRoaXMuYnVpbGROYW1lRG9jdW1lbnQodGhpcy5uYW1lSG9sZGVyKTsKLQkJdGhpcy51cHBlckNhc2VOYW1lRG9jdW1lbnQgPSB0aGlzLmJ1aWxkVXBwZXJDYXNlTmFtZURvY3VtZW50KHRoaXMubmFtZUhvbGRlcik7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPFRlc3RNb2RlbD4gdm0pIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KHZtLCBUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRG9jdW1lbnQgYnVpbGROYW1lRG9jdW1lbnQoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBzdHJpbmdIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIoc3RyaW5nSG9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGJ1aWxkVXBwZXJDYXNlTmFtZURvY3VtZW50KFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gc3RyaW5nSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRG9jdW1lbnRBZGFwdGVyKHN0cmluZ0hvbGRlciwgdGhpcy5idWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudERlbGVnYXRlKCkpOwotCX0KLQotCXByaXZhdGUgQWJzdHJhY3REb2N1bWVudCBidWlsZFVwcGVyQ2FzZU5hbWVEb2N1bWVudERlbGVnYXRlKCkgewotCQlyZXR1cm4gbmV3IFBsYWluRG9jdW1lbnQoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGluc2VydFN0cmluZyhpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nLCBBdHRyaWJ1dGVTZXQgYSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJCQlpZiAoc3RyaW5nID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQljaGFyW10gdXBwZXIgPSBzdHJpbmcudG9DaGFyQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHVwcGVyLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXVwcGVyW2ldID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHVwcGVyW2ldKTsKLQkJCQl9Ci0JCQkJc3VwZXIuaW5zZXJ0U3RyaW5nKG9mZnNldCwgbmV3IFN0cmluZyh1cHBlciksIGEpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVGV4dEZpZWxkUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRUZXh0RmllbGRQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZE5hbWVUZXh0RmllbGQoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRSZWFkT25seU5hbWVUZXh0RmllbGQoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVcHBlckNhc2VOYW1lVGV4dEZpZWxkKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpUZXh0RmllbGQgYnVpbGROYW1lVGV4dEZpZWxkKCkgewotCQlyZXR1cm4gbmV3IEpUZXh0RmllbGQodGhpcy5uYW1lRG9jdW1lbnQsIG51bGwsIDApOwotCX0KLQotCXByaXZhdGUgSlRleHRGaWVsZCBidWlsZFJlYWRPbmx5TmFtZVRleHRGaWVsZCgpIHsKLQkJSlRleHRGaWVsZCBuYW1lVGV4dEZpZWxkID0gdGhpcy5idWlsZE5hbWVUZXh0RmllbGQoKTsKLQkJbmFtZVRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXJldHVybiBuYW1lVGV4dEZpZWxkOwotCX0KLQotCXByaXZhdGUgSlRleHRGaWVsZCBidWlsZFVwcGVyQ2FzZU5hbWVUZXh0RmllbGQoKSB7Ci0JCXJldHVybiBuZXcgSlRleHRGaWVsZCh0aGlzLnVwcGVyQ2FzZU5hbWVEb2N1bWVudCwgbnVsbCwgMCk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDb250cm9sUGFuZWwoKSB7Ci0JCUpQYW5lbCBjb250cm9sUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVzZXROYW1lQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFByaW50TW9kZWxCdXR0b24oKSk7Ci0JCXJldHVybiBjb250cm9sUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXROYW1lQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0TmFtZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlc2V0TmFtZUFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQgbmFtZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLnJlc2V0TmFtZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0TmFtZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0TmFtZShERUZBVUxUX05BTUUpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRG9jdW1lbnRBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc3RvcmUgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEb2N1bWVudEFkYXB0ZXJVSVRlc3QudGhpcy5yZXN0b3JlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCByZXN0b3JlTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRQcmludE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRQcmludE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJwcmludCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCURvY3VtZW50QWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5hbWU6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXROYW1lKCkpOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0JCi0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuZ2V0TmFtZSgpICsgIikiOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYzZiNDEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0pwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VXRpbGl0eU1vZGVsVmFsdWVTd2luZ1Rlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDaGVja0JveE1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENvbWJvQm94TW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEb2N1bWVudEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaXN0TW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHJlZU1vZGVsQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdFV0aWxpdHlNb2RlbFZhbHVlU3dpbmdUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmU0MjZkLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5MaXN0TW9kZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db29yZGluYXRlZExpc3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBMaXN0TW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8gbm90aGluZyB5ZXQuLi4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHlldC4uLgotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsQWRhcHRlciBidWlsZExpc3RNb2RlbChMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKGxpc3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZExpc3RNb2RlbChDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKGNvbGxlY3Rpb25Ib2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sbGVjdGlvblN5bmNocm9uaXphdGlvbigpIHsKLQkJU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBjb2xsZWN0aW9uSG9sZGVyID0gdGhpcy5idWlsZENvbGxlY3Rpb25Ib2xkZXIoKTsKLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwoY29sbGVjdGlvbkhvbGRlcik7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoInRvbSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiZGljayIpOwotCQljb2xsZWN0aW9uSG9sZGVyLmFkZCgiaGFycnkiKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQobnVsbCk7Ci0JCWFzc2VydEVxdWFscygxMCwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZShsaXN0TW9kZWwsIHN5bmNoTGlzdCk7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamFyIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJoYXJyeSIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMaXN0U3luY2hyb25pemF0aW9uKCkgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyKTsKLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLmFkZCg2LCAidG9tIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDcsICJkaWNrIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDgsICJoYXJyeSIpOwotCQlsaXN0SG9sZGVyLmFkZCg5LCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQotCQlsaXN0SG9sZGVyLnJlbW92ZSg5KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoOCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDQpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNb2RlbCgpIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyMSA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbEFkYXB0ZXIgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyMSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIxLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCi0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlcjIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcjIoKTsKLQkJbGlzdE1vZGVsLnNldE1vZGVsKGxpc3RIb2xkZXIyKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmUobGlzdE1vZGVsLCBzeW5jaExpc3QpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIxLmhhc05vTGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQlhc3NlcnRUcnVlKGxpc3RIb2xkZXIyLmhhc0FueUxpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQotCQlsaXN0TW9kZWwuc2V0TW9kZWwobmV3IFNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlKGxpc3RNb2RlbCwgc3luY2hMaXN0KTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMS5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQkJYXNzZXJ0VHJ1ZShsaXN0SG9sZGVyMi5oYXNOb0xpc3RDaGFuZ2VMaXN0ZW5lcnMoTGlzdFZhbHVlTW9kZWwuTElTVF9WQUxVRVMpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcGFyZShMaXN0TW9kZWwgbGlzdE1vZGVsLCBMaXN0PFN0cmluZz4gbGlzdCkgewotCQlhc3NlcnRFcXVhbHMobGlzdE1vZGVsLmdldFNpemUoKSwgbGlzdC5zaXplKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RNb2RlbC5nZXRTaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKGxpc3RNb2RlbC5nZXRFbGVtZW50QXQoaSksIGxpc3QuZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2xsZWN0aW9uU29ydCgpIHsKLQkJdGhpcy52ZXJpZnlDb2xsZWN0aW9uU29ydChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdFNvcnQoKSB7Ci0JCXRoaXMudmVyaWZ5TGlzdFNvcnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbGxlY3Rpb25Tb3J0KCkgewotCQl0aGlzLnZlcmlmeUNvbGxlY3Rpb25Tb3J0KHRoaXMuYnVpbGRDdXN0b21Db21wYXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21MaXN0U29ydCgpIHsKLQkJdGhpcy52ZXJpZnlMaXN0U29ydCh0aGlzLmJ1aWxkQ3VzdG9tQ29tcGFyYXRvcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8U3RyaW5nPiBidWlsZEN1c3RvbUNvbXBhcmF0b3IoKSB7Ci0JCS8vIHNvcnQgd2l0aCByZXZlcnNlIG9yZGVyCi0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbGxlY3Rpb25Tb3J0KENvbXBhcmF0b3I8U3RyaW5nPiBjb21wYXJhdG9yKSB7Ci0JCVNpbXBsZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gY29sbGVjdGlvbkhvbGRlciA9IHRoaXMuYnVpbGRDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPihjb2xsZWN0aW9uSG9sZGVyLCBjb21wYXJhdG9yKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWNvbGxlY3Rpb25Ib2xkZXIuYWRkKCJ0b20iKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImRpY2siKTsKLQkJY29sbGVjdGlvbkhvbGRlci5hZGQoImhhcnJ5Iik7Ci0JCWFzc2VydEVxdWFscyg5LCBzeW5jaExpc3Quc2l6ZSgpKTsKLQkJdGhpcy5jb21wYXJlU29ydChsaXN0TW9kZWwsIHN5bmNoTGlzdCwgY29tcGFyYXRvcik7Ci0KLQkJY29sbGVjdGlvbkhvbGRlci5yZW1vdmUoImZvbyIpOwotCQljb2xsZWN0aW9uSG9sZGVyLnJlbW92ZSgiamFyIik7Ci0JCWNvbGxlY3Rpb25Ib2xkZXIucmVtb3ZlKCJoYXJyeSIpOwotCQlhc3NlcnRFcXVhbHMoNiwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlMaXN0U29ydChDb21wYXJhdG9yPFN0cmluZz4gY29tcGFyYXRvcikgewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4obGlzdEhvbGRlciwgY29tcGFyYXRvcikpOwotCQlDb29yZGluYXRlZExpc3Q8U3RyaW5nPiBzeW5jaExpc3QgPSBuZXcgQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4obGlzdE1vZGVsKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHN5bmNoTGlzdC5zaXplKCkpOwotCQl0aGlzLmNvbXBhcmVTb3J0KGxpc3RNb2RlbCwgc3luY2hMaXN0LCBjb21wYXJhdG9yKTsKLQotCQlsaXN0SG9sZGVyLmFkZCgwLCAidG9tIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsICJkaWNrIik7Ci0JCWxpc3RIb2xkZXIuYWRkKDAsICJoYXJyeSIpOwotCQlhc3NlcnRFcXVhbHMoOSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCi0JCWxpc3RIb2xkZXIucmVtb3ZlKDgpOwotCQlsaXN0SG9sZGVyLnJlbW92ZSg0KTsKLQkJbGlzdEhvbGRlci5yZW1vdmUoMCk7Ci0JCWxpc3RIb2xkZXIucmVtb3ZlKDUpOwotCQlhc3NlcnRFcXVhbHMoNSwgc3luY2hMaXN0LnNpemUoKSk7Ci0JCXRoaXMuY29tcGFyZVNvcnQobGlzdE1vZGVsLCBzeW5jaExpc3QsIGNvbXBhcmF0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wYXJlU29ydChMaXN0TW9kZWwgbGlzdE1vZGVsLCBMaXN0PFN0cmluZz4gbGlzdCwgQ29tcGFyYXRvcjxTdHJpbmc+IGNvbXBhcmF0b3IpIHsKLQkJU29ydGVkU2V0PFN0cmluZz4gc3MgPSBuZXcgVHJlZVNldDxTdHJpbmc+KGNvbXBhcmF0b3IpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RNb2RlbC5nZXRTaXplKCk7IGkrKykgewotCQkJc3MuYWRkKChTdHJpbmcpIGxpc3RNb2RlbC5nZXRFbGVtZW50QXQoaSkpOwotCQl9Ci0JCWFzc2VydEVxdWFscyhzcy5zaXplKCksIGxpc3Quc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbTEgPSBzcy5pdGVyYXRvcigpLCBzdHJlYW0yID0gbGlzdC5pdGVyYXRvcigpOyBzdHJlYW0xLmhhc05leHQoKTsgKSB7Ci0JCQlhc3NlcnRFcXVhbHMoc3RyZWFtMS5uZXh0KCksIHN0cmVhbTIubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBsaXN0SG9sZGVyID0gdGhpcy5idWlsZExpc3RIb2xkZXIoKTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0KLQkJTGlzdE1vZGVsIGxpc3RNb2RlbCA9IHRoaXMuYnVpbGRMaXN0TW9kZWwobGlzdEhvbGRlcik7Ci0JCWFzc2VydEZhbHNlKGxpc3RIb2xkZXIuaGFzQW55TGlzdENoYW5nZUxpc3RlbmVycyhMaXN0VmFsdWVNb2RlbC5MSVNUX1ZBTFVFUykpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCWFzc2VydFRydWUobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0KLQkJbGlzdE1vZGVsLnJlbW92ZUxpc3REYXRhTGlzdGVuZXIoc3luY2hMaXN0KTsKLQkJYXNzZXJ0RmFsc2UobGlzdEhvbGRlci5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnMobGlzdE1vZGVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGxpc3RIb2xkZXIgPSB0aGlzLmJ1aWxkTGlzdEhvbGRlcigpOwotCQlMaXN0TW9kZWwgbGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbChsaXN0SG9sZGVyKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoNiwgbGlzdE1vZGVsLmdldFNpemUoKSk7Ci0KLQkJQ29vcmRpbmF0ZWRMaXN0PFN0cmluZz4gc3luY2hMaXN0ID0gbmV3IENvb3JkaW5hdGVkTGlzdDxTdHJpbmc+KGxpc3RNb2RlbCk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0TW9kZWwuZ2V0U2l6ZSgpKTsKLQotCQlsaXN0TW9kZWwucmVtb3ZlTGlzdERhdGFMaXN0ZW5lcihzeW5jaExpc3QpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKGxpc3RNb2RlbCk7Ci0JCWFzc2VydEVxdWFscyg2LCBsaXN0TW9kZWwuZ2V0U2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudEF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZUxpc3RWYWx1ZU1vZGVsPFN0cmluZz4gbGlzdEhvbGRlciA9IHRoaXMuYnVpbGRMaXN0SG9sZGVyKCk7Ci0JCUxpc3RNb2RlbCBsaXN0TW9kZWwgPSB0aGlzLmJ1aWxkTGlzdE1vZGVsKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPihsaXN0SG9sZGVyKSk7Ci0JCUNvb3JkaW5hdGVkTGlzdDxTdHJpbmc+IHN5bmNoTGlzdCA9IG5ldyBDb29yZGluYXRlZExpc3Q8U3RyaW5nPihsaXN0TW9kZWwpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyhsaXN0TW9kZWwpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGxpc3RNb2RlbC5nZXRFbGVtZW50QXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHN5bmNoTGlzdC5nZXQoMCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNOb0xpc3RlbmVycyA9ICgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobGlzdE1vZGVsLCAiaGFzTm9MaXN0RGF0YUxpc3RlbmVycyIpKS5ib29sZWFuVmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShoYXNOb0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhMaXN0TW9kZWwgbGlzdE1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBoYXNMaXN0ZW5lcnMgPSAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGxpc3RNb2RlbCwgImhhc0xpc3REYXRhTGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCQlhc3NlcnRUcnVlKGhhc0xpc3RlbmVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRDb2xsZWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGJ1aWxkQ29sbGVjdGlvbigpIHsKLQkJQmFnPFN0cmluZz4gYmFnID0gbmV3IEhhc2hCYWc8U3RyaW5nPigpOwotCQl0aGlzLnBvcHVsYXRlQ29sbGVjdGlvbihiYWcpOwotCQlyZXR1cm4gYmFnOwotCX0KLQotCXByaXZhdGUgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdCgpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBidWlsZExpc3QoKSB7Ci0JCUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMucG9wdWxhdGVDb2xsZWN0aW9uKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uKENvbGxlY3Rpb248U3RyaW5nPiBjKSB7Ci0JCWMuYWRkKCJmb28iKTsKLQkJYy5hZGQoImJhciIpOwotCQljLmFkZCgiYmF6Iik7Ci0JCWMuYWRkKCJqb28iKTsKLQkJYy5hZGQoImphciIpOwotCQljLmFkZCgiamF6Iik7Ci0JfQotCi0JcHJpdmF0ZSBTaW1wbGVMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTGlzdEhvbGRlcjIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8U3RyaW5nPih0aGlzLmJ1aWxkTGlzdDIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gYnVpbGRMaXN0MigpIHsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5wb3B1bGF0ZUNvbGxlY3Rpb24yKGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDb2xsZWN0aW9uMihDb2xsZWN0aW9uPFN0cmluZz4gYykgewotCQljLmFkZCgidG9tIik7Ci0JCWMuYWRkKCJkaWNrIik7Ci0JCWMuYWRkKCJoYXJyeSIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0TW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZmQ3NjIuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5UZXh0RmllbGQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KTGFiZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuRGlzcGxheWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotLyoqCi0gKiBhbiBleGFtcGxlIFVJIGZvciB0ZXN0aW5nIHZhcmlvdXMgcGVybXV0YXRpb25zIG9mIHRoZSBMaXN0TW9kZWxBZGFwdGVyCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExpc3RNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYXNrTGlzdD4gdGFza0xpc3RIb2xkZXI7Ci0JcHJpdmF0ZSBUZXh0RmllbGQgdGFza1RleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgTGlzdE1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50YXNrTGlzdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGFza0xpc3Q+KG5ldyBUYXNrTGlzdCgpKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg4MDAsIDQwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRUYXNrTGlzdFBhbmVsKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRhc2tMaXN0UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgwLCAxKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRQcmltaXRpdmVUYXNrTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdFBhbmVsKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFByaW1pdGl2ZVRhc2tMaXN0UGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRVbnNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFN0YW5kYXJkU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdFBhbmVsKCkpOwotCQlyZXR1cm4gdGFza0xpc3RQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZERpc3BsYXlhYmxlVGFza0xpc3RQYW5lbCgpIHsKLQkJSlBhbmVsIHRhc2tMaXN0UGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkRGlzcGxheWFibGVMaXN0UGFuZWwoKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJwcmltaXRpdmUgdW5zb3J0ZWQiLCB0aGlzLmJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRTdGFuZGFyZFNvcnRlZFByaW1pdGl2ZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoInByaW1pdGl2ZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0UGFuZWwoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTGlzdFBhbmVsKCJwcmltaXRpdmUgcmV2ZXJzZSBzb3J0ZWQiLCB0aGlzLmJ1aWxkQ3VzdG9tU29ydGVkUHJpbWl0aXZlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVW5zb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoImRpc3BsYXlhYmxlIHVuc29ydGVkIiwgdGhpcy5idWlsZFVuc29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRTdGFuZGFyZFNvcnRlZERpc3BsYXlhYmxlTGlzdFBhbmVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZExpc3RQYW5lbCgiZGlzcGxheWFibGUgc29ydGVkIiwgdGhpcy5idWlsZFN0YW5kYXJkU29ydGVkRGlzcGxheWFibGVMaXN0TW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRDdXN0b21Tb3J0ZWREaXNwbGF5YWJsZUxpc3RQYW5lbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRMaXN0UGFuZWwoImRpc3BsYXlhYmxlIHJldmVyc2Ugc29ydGVkIiwgdGhpcy5idWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkVW5zb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkUHJpbWl0aXZlVGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkU3RhbmRhcmRTb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRDdXN0b21Tb3J0ZWRQcmltaXRpdmVMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdE1vZGVsQWRhcHRlcihuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4odGhpcy5idWlsZFByaW1pdGl2ZVRhc2tMaXN0QWRhcHRlcigpLCB0aGlzLmJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpKSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0TW9kZWwgYnVpbGRVbnNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIodGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgTGlzdE1vZGVsIGJ1aWxkU3RhbmRhcmRTb3J0ZWREaXNwbGF5YWJsZUxpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0TW9kZWxBZGFwdGVyKG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VGFzaz4odGhpcy5idWlsZERpc3BsYXlhYmxlVGFza0xpc3RBZGFwdGVyKCkpKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RNb2RlbCBidWlsZEN1c3RvbVNvcnRlZERpc3BsYXlhYmxlTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RNb2RlbEFkYXB0ZXIobmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjxUYXNrPih0aGlzLmJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSwgdGhpcy5idWlsZEN1c3RvbVRhc2tPYmplY3RDb21wYXJhdG9yKCkpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZExpc3RQYW5lbChTdHJpbmcgbGFiZWwsIExpc3RNb2RlbCBsaXN0TW9kZWwpIHsKLQkJSlBhbmVsIGxpc3RQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJSkxhYmVsIGxpc3RMYWJlbCA9IG5ldyBKTGFiZWwoIiAgIiArIGxhYmVsKTsKLQkJbGlzdFBhbmVsLmFkZChsaXN0TGFiZWwsIEJvcmRlckxheW91dC5OT1JUSCk7Ci0KLQkJSkxpc3QgbGlzdEJveCA9IG5ldyBKTGlzdCgpOwotCQlsaXN0Qm94LnNldE1vZGVsKGxpc3RNb2RlbCk7Ci0JCWxpc3RCb3guc2V0RG91YmxlQnVmZmVyZWQodHJ1ZSk7Ci0JCWxpc3RMYWJlbC5zZXRMYWJlbEZvcihsaXN0Qm94KTsKLQkJbGlzdFBhbmVsLmFkZChuZXcgSlNjcm9sbFBhbmUobGlzdEJveCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQlyZXR1cm4gbGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxTdHJpbmc+IGJ1aWxkQ3VzdG9tU3RyaW5nQ29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoU3RyaW5nIHMxLCBTdHJpbmcgczIpIHsKLQkJCQlyZXR1cm4gczIuY29tcGFyZVRvKHMxKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBhcmF0b3I8VGFzaz4gYnVpbGRDdXN0b21UYXNrT2JqZWN0Q29tcGFyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBDb21wYXJhdG9yPFRhc2s+KCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFRhc2sgdG8xLCBUYXNrIHRvMikgewotCQkJCXJldHVybiB0bzIuZGlzcGxheVN0cmluZygpLmNvbXBhcmVUbyh0bzEuZGlzcGxheVN0cmluZygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmltaXRpdmVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFN0cmluZz4oVGFza0xpc3QuVEFTS19OQU1FU19MSVNULCB0aGlzLnRhc2tMaXN0KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrTmFtZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFRhc2s+IGJ1aWxkRGlzcGxheWFibGVUYXNrTGlzdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGFza0xpc3QsIFRhc2s+KFRhc2tMaXN0LlRBU0tTX0xJU1QsIHRoaXMudGFza0xpc3QoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFRhc2s+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YXNrcygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRSZW1vdmVUYXNrUGFuZWwoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyQnV0dG9uKCksIEJvcmRlckxheW91dC5FQVNUKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEFkZFJlbW92ZVRhc2tQYW5lbCgpIHsKLQkJSlBhbmVsIGFkZFJlbW92ZVRhc2tQYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkQWRkQnV0dG9uKCksIEJvcmRlckxheW91dC5XRVNUKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkVGFza1RleHRGaWVsZCgpLCBCb3JkZXJMYXlvdXQuQ0VOVEVSKTsKLQkJYWRkUmVtb3ZlVGFza1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKCksIEJvcmRlckxheW91dC5FQVNUKTsKLQkJcmV0dXJuIGFkZFJlbW92ZVRhc2tQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRUYXNrKCkgewotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQlwcml2YXRlIFRhc2tMaXN0IHRhc2tMaXN0KCkgewotCQlyZXR1cm4gdGhpcy50YXNrTGlzdEhvbGRlci5nZXRWYWx1ZSgpOwotCX0KLQotCXZvaWQgYWRkVGFzaygpIHsKLQkJU3RyaW5nIHRhc2sgPSB0aGlzLmdldFRhc2soKTsKLQkJaWYgKHRhc2subGVuZ3RoKCkgIT0gMCkgewotCQkJdGhpcy50YXNrTGlzdCgpLmFkZFRhc2sodGFzayk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlbW92ZVRhc2soKSB7Ci0JCVN0cmluZyB0YXNrID0gdGhpcy5nZXRUYXNrKCk7Ci0JCWlmICh0YXNrLmxlbmd0aCgpICE9IDApIHsKLQkJCXRoaXMudGFza0xpc3QoKS5yZW1vdmVUYXNrKHRhc2spOwotCQl9Ci0JfQotCi0Jdm9pZCBjbGVhclRhc2tzKCkgewotCQl0aGlzLnRhc2tMaXN0KCkuY2xlYXJUYXNrcygpOwotCX0KLQotCXByaXZhdGUgVGV4dEZpZWxkIGJ1aWxkVGFza1RleHRGaWVsZCgpIHsKLQkJdGhpcy50YXNrVGV4dEZpZWxkID0gbmV3IFRleHRGaWVsZCgpOwotCQlyZXR1cm4gdGhpcy50YXNrVGV4dEZpZWxkOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5hZGRUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbW92ZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW1vdmVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW1vdmVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbW92ZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCUxpc3RNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVUYXNrKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQ2xlYXJBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJTGlzdE1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyVGFza3MoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JcHVibGljIGNsYXNzIFRhc2tMaXN0IGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgTGlzdDxTdHJpbmc+IHRhc2tOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlwcml2YXRlIExpc3Q8VGFzaz4gdGFza09iamVjdHMgPSBuZXcgQXJyYXlMaXN0PFRhc2s+KCk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfTkFNRVNfTElTVCA9ICJ0YXNrTmFtZXMiOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLU19MSVNUID0gInRhc2tzIjsKLQkJVGFza0xpc3QoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YXNrTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy50YXNrTmFtZXMubGlzdEl0ZXJhdG9yKCk7Ci0JCX0KLQkJcHVibGljIExpc3RJdGVyYXRvcjxUYXNrPiB0YXNrcygpIHsKLQkJCXJldHVybiB0aGlzLnRhc2tPYmplY3RzLmxpc3RJdGVyYXRvcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZFRhc2soU3RyaW5nIHRhc2tOYW1lKSB7Ci0JCQlpbnQgaW5kZXggPSB0aGlzLnRhc2tOYW1lcy5zaXplKCk7Ci0JCQl0aGlzLnRhc2tOYW1lcy5hZGQoaW5kZXgsIHRhc2tOYW1lKTsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChUQVNLX05BTUVTX0xJU1QsIGluZGV4LCB0YXNrTmFtZSk7Ci0JCi0JCQlUYXNrIHRhc2tPYmplY3QgPSBuZXcgVGFzayh0YXNrTmFtZSk7Ci0JCQl0aGlzLnRhc2tPYmplY3RzLmFkZChpbmRleCwgdGFza09iamVjdCk7Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoVEFTS1NfTElTVCwgaW5kZXgsIHRhc2tPYmplY3QpOwotCQl9CQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlVGFzayhTdHJpbmcgdGFza05hbWUpIHsKLQkJCWludCBpbmRleCA9IHRoaXMudGFza05hbWVzLmluZGV4T2YodGFza05hbWUpOwotCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJT2JqZWN0IHJlbW92ZWRUYXNrID0gdGhpcy50YXNrTmFtZXMucmVtb3ZlKGluZGV4KTsKLQkJCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChUQVNLX05BTUVTX0xJU1QsIGluZGV4LCByZW1vdmVkVGFzayk7Ci0JCQkJLy8gYXNzdW1lIHRoZSBpbmRleGVzIG1hdGNoLi4uCi0JCQkJT2JqZWN0IHJlbW92ZWRUYXNrT2JqZWN0ID0gdGhpcy50YXNrT2JqZWN0cy5yZW1vdmUoaW5kZXgpOwotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFRBU0tTX0xJU1QsIGluZGV4LCByZW1vdmVkVGFza09iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJUYXNrcygpIHsKLQkJCXRoaXMudGFza05hbWVzLmNsZWFyKCk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChUQVNLX05BTUVTX0xJU1QsIHRoaXMudGFza05hbWVzKTsKLQkJCXRoaXMudGFza09iamVjdHMuY2xlYXIoKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFRBU0tTX0xJU1QsIHRoaXMudGFza09iamVjdHMpOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFRhc2sgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgRGlzcGxheWFibGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQlwcml2YXRlIERhdGUgY3JlYXRpb25UaW1lU3RhbXA7Ci0JCXB1YmxpYyBUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jcmVhdGlvblRpbWVTdGFtcCA9IG5ldyBEYXRlKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZSArICI6ICIgKyB0aGlzLmNyZWF0aW9uVGltZVN0YW1wLmdldFRpbWUoKTsKLQkJfQotCQlwdWJsaWMgSWNvbiBpY29uKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNQTEFZX1NUUklOR19QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZGlzcGxheVN0cmluZygpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9MaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjA2OTguLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL0xpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkFMVUVfTElTVCA9IHsicmVkIiwgImdyZWVuIiwgImJsdWUifTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRSA9IFZBTFVFX0xJU1RbMF07Ci0KLQlwdWJsaWMgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KERFRkFVTFRfVkFMVUUpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTGlzdFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgVkFMVUVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlVmFsdWVIb2xkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCUxpc3RTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhERUZBVUxUX1ZBTFVFLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlMaXN0U3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoREVGQVVMVF9WQUxVRSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoVkFMVUVfTElTVFsyXSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKFZBTFVFX0xJU1RbMl0sIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoVkFMVUVfTElTVFswXSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gbG9jYWxWYWx1ZUhvbGRlciA9IChTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PikgdGhpcy52YWx1ZUhvbGRlcjsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCi0JCUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLnJlbW92ZUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2UobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNOb0xpc3RlbmVycyh0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhTcGlubmVyTW9kZWwgYWRhcHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCAoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZSgoKExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRlc3RDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIENoYW5nZUxpc3RlbmVyIHsKLQkJVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNWQ4ZTEuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL051bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nOwotCi1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gdmFsdWVIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgc3Bpbm5lck1vZGVsQWRhcHRlcjsKLQlib29sZWFuIGV2ZW50RmlyZWQ7Ci0KLQlwdWJsaWMgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4obmV3IEludGVnZXIoMCkpOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIgPSBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLnZhbHVlSG9sZGVyLCAtMzMsIDMzLCAxKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTnVtYmVyQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlU3Bpbm5lck1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig1KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigtMzMpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxOdW1iZXI+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKFNwaW5uZXJNb2RlbCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsICgoTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcikgYWRhcHRlcikuZ2V0Q2hhbmdlTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoKChOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKSBhZGFwdGVyKS5nZXRDaGFuZ2VMaXN0ZW5lcnMoKS5sZW5ndGggPT0gMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxJbml0aWFsVmFsdWUoKSB7Ci0JCXRoaXMudmFsdWVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4oKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlciwgbmV3IEludGVnZXIoLTMzKSwgbmV3IEludGVnZXIoMzMpLCBuZXcgSW50ZWdlcigxKSwgbmV3IEludGVnZXIoMCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGROdW1iZXJDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZE51bWJlckNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigwKSwgdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLmdldFZhbHVlKCkpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKG5ldyBJbnRlZ2VyKDcpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNyksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCXByaXZhdGUgY2xhc3MgVGVzdENoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgQ2hhbmdlTGlzdGVuZXIgewotCQlUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTU4NjQuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL09iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuTGlzdFNlbGVjdGlvbkxpc3RlbmVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuVGVzdFRvb2xzOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIERlZmF1bHRMaXN0TW9kZWwgbGlzdE1vZGVsOwotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIHNlbGVjdGlvbk1vZGVsOwotCi0JcHVibGljIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubGlzdE1vZGVsID0gdGhpcy5idWlsZExpc3RNb2RlbCgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsID0gdGhpcy5idWlsZFNlbGVjdGlvbk1vZGVsKHRoaXMubGlzdE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIERlZmF1bHRMaXN0TW9kZWwgYnVpbGRMaXN0TW9kZWwoKSB7Ci0JCURlZmF1bHRMaXN0TW9kZWwgbG0gPSBuZXcgRGVmYXVsdExpc3RNb2RlbCgpOwotCQlsbS5hZGRFbGVtZW50KCJmb28iKTsKLQkJbG0uYWRkRWxlbWVudCgiYmFyIik7Ci0JCWxtLmFkZEVsZW1lbnQoImJheiIpOwotCQlyZXR1cm4gbG07Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgYnVpbGRTZWxlY3Rpb25Nb2RlbChMaXN0TW9kZWwgbG0pIHsKLQkJcmV0dXJuIG5ldyBPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwobG0pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGlzdERhdGFMaXN0ZW5lcigpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRMaXN0U2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25JbnRlcnZhbCgwLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKSk7Ci0JCXRoaXMubGlzdE1vZGVsLnNldCgwLCAiamFyIik7Ci0JCWFzc2VydEVxdWFscygiamFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZWxlY3RlZFZhbHVlKCkgewotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGlvbkludGVydmFsKDAsIDApOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0aW9uSW50ZXJ2YWwoMCwgMCk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0aW9uSW50ZXJ2YWwoMiwgMik7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSwgImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheVRvb2xzLmNvbnRhaW5zKHRoaXMuc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSwgImJheiIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZFZhbHVlcygpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6In0pOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNaW5TZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWF4U2VsZWN0aW9uSW5kZXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZSgiZm9vIik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuYWRkU2VsZWN0ZWRWYWx1ZSgiamF6Iik7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDEpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDQpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlbGVjdGVkVmFsdWVzKCkgewotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqb28iKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamFyIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpheiIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoImZvbyIpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImJhciIsICJqYXIifSk7Ci0JCWFzc2VydEVxdWFscygwLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgwKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgyKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDMpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJmb28iLCAiYmF6IiwgImphciJ9KTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5yZW1vdmVTZWxlY3RlZFZhbHVlKCJqYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0aW9uSW5kZXgoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDApKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDIpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMykpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg0KSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZEluZGV4KDUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VsZWN0ZWRWYWx1ZXMoKSB7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImpvbyIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXIiKTsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiamF6Iik7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZXMobmV3IE9iamVjdFtdIHsiZm9vIiwgImJheiIsICJqb28iLCAiamFyIn0pOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnJlbW92ZVNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJqb28ifSk7Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1pblNlbGVjdGlvbkluZGV4KCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRNYXhTZWxlY3Rpb25JbmRleCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgxKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoMikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCgzKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkSW5kZXgoNCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWRJbmRleCg1KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFuY2hvclNlbGVjdGVkVmFsdWUoKSB7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwuc2V0QW5jaG9yU2VsZWN0aW9uSW5kZXgoMSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRBbmNob3JTZWxlY3RlZFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldExlYWRTZWxlY3RlZFZhbHVlKCkpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWVzKG5ldyBPYmplY3RbXSB7ImZvbyIsICJiYXoifSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgdGhpcy5zZWxlY3Rpb25Nb2RlbC5nZXRMZWFkU2VsZWN0ZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWluTWF4U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRoaXMuc2VsZWN0aW9uTW9kZWwuZ2V0TWluU2VsZWN0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXIiLCB0aGlzLnNlbGVjdGlvbk1vZGVsLmdldE1heFNlbGVjdGVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlSXNTZWxlY3RlZCgpIHsKLQkJdGhpcy5saXN0TW9kZWwuYWRkRWxlbWVudCgiam9vIik7Ci0JCXRoaXMubGlzdE1vZGVsLmFkZEVsZW1lbnQoImphciIpOwotCQl0aGlzLmxpc3RNb2RlbC5hZGRFbGVtZW50KCJqYXoiKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKCJmb28iKTsKLQkJdGhpcy5zZWxlY3Rpb25Nb2RlbC5hZGRTZWxlY3RlZFZhbHVlcyhuZXcgT2JqZWN0W10geyJiYXIiLCAiamFyIn0pOwotCQlhc3NlcnRUcnVlKHRoaXMuc2VsZWN0aW9uTW9kZWwudmFsdWVJc1NlbGVjdGVkKCJmb28iKSk7Ci0JCWFzc2VydFRydWUodGhpcy5zZWxlY3Rpb25Nb2RlbC52YWx1ZUlzU2VsZWN0ZWQoImJhciIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiamFyIikpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnNlbGVjdGlvbk1vZGVsLnZhbHVlSXNTZWxlY3RlZCgiYmF6IikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gdGhpcy5idWlsZExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5saXN0TW9kZWwuZ2V0TGlzdERhdGFMaXN0ZW5lcnMoKS5sZW5ndGgpOwotCQl0aGlzLnNlbGVjdGlvbk1vZGVsLmFkZExpc3RTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLmxpc3RNb2RlbC5nZXRMaXN0RGF0YUxpc3RlbmVycygpLmxlbmd0aCk7Ci0JCXRoaXMuc2VsZWN0aW9uTW9kZWwucmVtb3ZlTGlzdFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMubGlzdE1vZGVsLmdldExpc3REYXRhTGlzdGVuZXJzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RTZWxlY3Rpb25MaXN0ZW5lciBidWlsZExpc3RTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoTGlzdFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nIGZvciBub3cuLi4KLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9QcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhMWJlZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLkRlZmF1bHRNdXRhYmxlVHJlZU5vZGU7Ci1pbXBvcnQgamF2YXguc3dpbmcudHJlZS5UcmVlTW9kZWw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVhZE9ubHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5QcmltaXRpdmVMaXN0VHJlZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgVHJlZU1vZGVsIHRyZWVNb2RlbDsKLQotCXB1YmxpYyBQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0TW9kZWwgPSB0aGlzLmJ1aWxkVGVzdE1vZGVsKCk7Ci0JCXRoaXMudHJlZU1vZGVsID0gdGhpcy5idWlsZFRyZWVNb2RlbCgpOwotCX0KLQotCXByaXZhdGUgVGVzdE1vZGVsIGJ1aWxkVGVzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRlc3RNb2RlbCgpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByaW1pdGl2ZUxpc3RUcmVlTW9kZWwodGhpcy5idWlsZExpc3RWYWx1ZU1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJpbWl0aXZlQ2hhbmdlZChpbnQgaW5kZXgsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJCWlmICggISBuZXdWYWx1ZS5lcXVhbHMoIiIpKSB7Ci0JCQkJCVByaW1pdGl2ZUxpc3RUcmVlTW9kZWxUZXN0cy50aGlzLnRlc3RNb2RlbC5yZXBsYWNlTmFtZShpbmRleCwgKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPD8+IGJ1aWxkTGlzdFZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KFRlc3RNb2RlbC5OQU1FU19MSVNULCB0aGlzLnRlc3RNb2RlbCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBpbmRleCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZShpbmRleCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0Lm5hbWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWl0aXZlKCkgewotCQl0aGlzLnRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudmVyaWZ5VHJlZU1vZGVsRXZlbnQoZSwgbmV3IGludFtdIHswfSwgbmV3IFN0cmluZ1tdIHsiZm9vIn0pOwotCQkJfQotCQl9KTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiZm9vIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByaW1pdGl2ZSgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiZm9vIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJhciIpOwotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJiYXoiKTsKLQkJdGhpcy50cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJUHJpbWl0aXZlTGlzdFRyZWVNb2RlbFRlc3RzLnRoaXMudmVyaWZ5VHJlZU1vZGVsRXZlbnQoZSwgbmV3IGludFtdIHsxfSwgbmV3IFN0cmluZ1tdIHsiYmFyIn0pOwotCQkJfQotCQl9KTsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLnRlc3RNb2RlbC5yZW1vdmVOYW1lKDEpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUHJpbWl0aXZlKCkgewotCQl0aGlzLnRlc3RNb2RlbC5hZGROYW1lKCJmb28iKTsKLQkJdGhpcy50ZXN0TW9kZWwuYWRkTmFtZSgiYmFyIik7Ci0JCXRoaXMudGVzdE1vZGVsLmFkZE5hbWUoImJheiIpOwotCQl0aGlzLnRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlQcmltaXRpdmVMaXN0VHJlZU1vZGVsVGVzdHMudGhpcy52ZXJpZnlUcmVlTW9kZWxFdmVudChlLCBuZXcgaW50W10gezF9LCBuZXcgU3RyaW5nW10geyJqYXIifSk7Ci0JCQl9Ci0JCX0pOwotCQlTdHJpbmcgbmFtZSA9IHRoaXMudGVzdE1vZGVsLnJlcGxhY2VOYW1lKDEsICJqYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBuYW1lKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeVRyZWVNb2RlbEV2ZW50KFRyZWVNb2RlbEV2ZW50IGUsIGludFtdIGV4cGVjdGVkQ2hpbGRJbmRpY2VzLCBTdHJpbmdbXSBleHBlY3RlZE5hbWVzKSB7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZENoaWxkSW5kaWNlcywgZS5nZXRDaGlsZEluZGljZXMoKSkpOwotCQlPYmplY3RbXSBhY3R1YWxDaGlsZHJlbiA9IGUuZ2V0Q2hpbGRyZW4oKTsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTmFtZXMubGVuZ3RoLCBhY3R1YWxDaGlsZHJlbi5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCURlZmF1bHRNdXRhYmxlVHJlZU5vZGUgbm9kZSA9IChEZWZhdWx0TXV0YWJsZVRyZWVOb2RlKSBhY3R1YWxDaGlsZHJlbltpXTsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZE5hbWVzW2ldLCBub2RlLmdldFVzZXJPYmplY3QoKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDEsIGUuZ2V0UGF0aCgpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLnRyZWVNb2RlbC5nZXRSb290KCksIGUuZ2V0UGF0aCgpWzBdKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMudHJlZU1vZGVsLCBlLmdldFNvdXJjZSgpKTsKLQl9Ci0KLQotLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCWNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBuYW1lczsKLQkJCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNfTElTVCA9ICJuYW1lcyI7Ci0JCi0JCVRlc3RNb2RlbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCX0KLQkKLQkJcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IG5hbWVzKCkgewotCQkJcmV0dXJuIG5ldyBSZWFkT25seUxpc3RJdGVyYXRvcjxTdHJpbmc+KHRoaXMubmFtZXMpOwotCQl9Ci0JCXB1YmxpYyBpbnQgbmFtZXNTaXplKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZXMuc2l6ZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzLmdldChpbmRleCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkTmFtZShpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG5hbWUsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkTmFtZSh0aGlzLm5hbWVzU2l6ZSgpLCBuYW1lKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhpbnQgaW5kZXgsIExpc3Q8U3RyaW5nPiBsaXN0KSB7Ci0JCQl0aGlzLmFkZEl0ZW1zVG9MaXN0KGluZGV4LCB0aGlzLm5hbWVzLCBsaXN0LCBOQU1FU19MSVNUKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGROYW1lcyhMaXN0PFN0cmluZz4gbGlzdCkgewotCQkJdGhpcy5hZGROYW1lcyh0aGlzLm5hbWVzU2l6ZSgpLCBsaXN0KTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZU5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyBMaXN0PFN0cmluZz4gcmVtb3ZlTmFtZXMoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZW1vdmVJdGVtc0Zyb21MaXN0KGluZGV4LCBsZW5ndGgsIHRoaXMubmFtZXMsIE5BTUVTX0xJU1QpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgcmVwbGFjZU5hbWUoaW50IGluZGV4LCBTdHJpbmcgbmV3TmFtZSkgewotCQkJcmV0dXJuIHRoaXMuc2V0SXRlbUluTGlzdChpbmRleCwgbmV3TmFtZSwgdGhpcy5uYW1lcywgTkFNRVNfTElTVCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGNsYXNzIFRlc3RUcmVlTW9kZWxMaXN0ZW5lciBpbXBsZW1lbnRzIFRyZWVNb2RlbExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc1JlbW92ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDllOTMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyOwotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCByZWRCdXR0b25Nb2RlbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBDaGFuZ2VMaXN0ZW5lciByZWRMaXN0ZW5lcjsKLQlib29sZWFuIHJlZEV2ZW50RmlyZWQ7Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyOwotCXByaXZhdGUgQ2hhbmdlTGlzdGVuZXIgZ3JlZW5MaXN0ZW5lcjsKLQlib29sZWFuIGdyZWVuRXZlbnRGaXJlZDsKLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcjsKLQlwcml2YXRlIENoYW5nZUxpc3RlbmVyIGJsdWVMaXN0ZW5lcjsKLQlib29sZWFuIGJsdWVFdmVudEZpcmVkOwotCi0vLwlwcml2YXRlIEJ1dHRvbkdyb3VwIGJ1dHRvbkdyb3VwOwkvLyBETyBOT1QgdXNlIGEgQnV0dG9uR3JvdXAKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUQgPSAicmVkIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU4gPSAiZ3JlZW4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCTFVFID0gImJsdWUiOwotCi0JcHVibGljIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy52YWx1ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PihudWxsKTsKLS8vCQlidXR0b25Hcm91cCA9IG5ldyBCdXR0b25Hcm91cCgpOwotCi0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIFJFRCk7Ci0vLwkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0R3JvdXAoYnV0dG9uR3JvdXApOwotCQl0aGlzLnJlZExpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMucmVkRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlciA9IHRoaXMuYnVpbGRCdXR0b25Nb2RlbCh0aGlzLnZhbHVlSG9sZGVyLCBHUkVFTik7Ci0vLwkJdGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuZ3JlZW5MaXN0ZW5lciA9IG5ldyBUZXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmdyZWVuRXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0KLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyID0gdGhpcy5idWlsZEJ1dHRvbk1vZGVsKHRoaXMudmFsdWVIb2xkZXIsIEJMVUUpOwotLy8JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5zZXRHcm91cChidXR0b25Hcm91cCk7Ci0JCXRoaXMuYmx1ZUxpc3RlbmVyID0gbmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclRlc3RzLnRoaXMuYmx1ZUV2ZW50RmlyZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCQkKLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBidWlsZEJ1dHRvbk1vZGVsKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gcHZtLCBPYmplY3QgYnV0dG9uVmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihwdm0sIGJ1dHRvblZhbHVlKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkNoYW5nZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBsaXN0ZW5Ub01vZGVsQWRhcHRlcnMoKSB7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMucmVkTGlzdGVuZXIpOwotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKHRoaXMuZ3JlZW5MaXN0ZW5lcik7Ci0JCXRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcih0aGlzLmJsdWVMaXN0ZW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyRmxhZ3MoKSB7Ci0JCXRoaXMucmVkRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmdyZWVuRXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLmJsdWVFdmVudEZpcmVkID0gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZWxlY3RlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKEdSRUVOLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoQkxVRSwgdGhpcy52YWx1ZUhvbGRlci5nZXRWYWx1ZSgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRFcXVhbHMoUkVELCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmxpc3RlblRvTW9kZWxBZGFwdGVycygpOwotCi0JCXRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuc2V0U2VsZWN0ZWQodHJ1ZSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoQkxVRSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkV2ZW50RmlyZWQpOwotCQlhc3NlcnRUcnVlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0KLQkJdGhpcy5jbGVhckZsYWdzKCk7Ci0JCXRoaXMudmFsdWVIb2xkZXIuc2V0VmFsdWUoUkVEKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubGlzdGVuVG9Nb2RlbEFkYXB0ZXJzKCk7Ci0KLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShHUkVFTik7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQotCQl0aGlzLmNsZWFyRmxhZ3MoKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5yZWRFdmVudEZpcmVkKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlci5pc1NlbGVjdGVkKCkpOwotCi0JCXRoaXMuY2xlYXJGbGFncygpOwotCQl0aGlzLnZhbHVlSG9sZGVyLnNldFZhbHVlKEJMVUUpOwotCQlhc3NlcnRGYWxzZSh0aGlzLnJlZEV2ZW50RmlyZWQpOwotCQlhc3NlcnRGYWxzZSh0aGlzLmdyZWVuRXZlbnRGaXJlZCk7Ci0JCWFzc2VydFRydWUodGhpcy5ibHVlRXZlbnRGaXJlZCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmlzU2VsZWN0ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmJsdWVCdXR0b25Nb2RlbEFkYXB0ZXIuaXNTZWxlY3RlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGxvY2FsVmFsdWVIb2xkZXIgPSAoU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4pIHRoaXMudmFsdWVIb2xkZXI7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMucmVkQnV0dG9uTW9kZWxBZGFwdGVyLmFkZENoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ncmVlbkJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5ibHVlQnV0dG9uTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsQWRhcHRlci5yZW1vdmVDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKGxvY2FsVmFsdWVIb2xkZXIuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCXRoaXMudmVyaWZ5SGFzTm9MaXN0ZW5lcnModGhpcy5yZWRCdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbEFkYXB0ZXIpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBtb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUV2ZW50TGlzdGVuZXJMaXN0IGxpc3RlbmVyTGlzdCA9IChFdmVudExpc3RlbmVyTGlzdCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUobW9kZWwsICJsaXN0ZW5lckxpc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lckxpc3QoKS5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IG1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRXZlbnRMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0ID0gKEV2ZW50TGlzdGVuZXJMaXN0KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShtb2RlbCwgImxpc3RlbmVyTGlzdCIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJMaXN0KCkubGVuZ3RoID09IDApOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1JhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0ZmY1OS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotCi1pbXBvcnQgamF2YXguc3dpbmcuQWJzdHJhY3RBY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuQWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkJ1dHRvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkZyYW1lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpQYW5lbDsKLWltcG9ydCBqYXZheC5zd2luZy5KUmFkaW9CdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5SYWRpb0J1dHRvbk1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2YgcmFkaW8gYnV0dG9ucy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9ySG9sZGVyOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgcmVkQnV0dG9uTW9kZWw7Ci0JcHJpdmF0ZSBCdXR0b25Nb2RlbCBncmVlbkJ1dHRvbk1vZGVsOwotCXByaXZhdGUgQnV0dG9uTW9kZWwgYmx1ZUJ1dHRvbk1vZGVsOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoKTsKLQl9Ci0KLQlwcml2YXRlIFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0JCXRoaXMuY29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLnJlZEJ1dHRvbk1vZGVsID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyKHRoaXMuY29sb3JIb2xkZXIsIFRlc3RNb2RlbC5SRUQpOwotCQl0aGlzLmdyZWVuQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIodGhpcy5jb2xvckhvbGRlciwgVGVzdE1vZGVsLkdSRUVOKTsKLQkJdGhpcy5ibHVlQnV0dG9uTW9kZWwgPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXIodGhpcy5jb2xvckhvbGRlciwgVGVzdE1vZGVsLkJMVUUpOwotCQl0aGlzLm9wZW5XaW5kb3coKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFRlc3RNb2RlbCwgT2JqZWN0PihzdWJqZWN0SG9sZGVyLCBUZXN0TW9kZWwuQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQnV0dG9uTW9kZWwgYnVpbGRSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGNvbG9yUFZNLCBTdHJpbmcgY29sb3IpIHsKLQkJcmV0dXJuIG5ldyBSYWRpb0J1dHRvbk1vZGVsQWRhcHRlcihjb2xvclBWTSwgY29sb3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCAxMDApOwotCQl3aW5kb3cuc2V0TG9jYXRpb24oMjAwLCAyMDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmFkaW9CdXR0b25QYW5lbCgpLCBCb3JkZXJMYXlvdXQuTk9SVEgpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFJhZGlvQnV0dG9uUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRSZWRSYWRpb0J1dHRvbigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEdyZWVuUmFkaW9CdXR0b24oKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRCbHVlUmFkaW9CdXR0b24oKSk7Ci0JCXJldHVybiB0YXNrTGlzdFBhbmVsOwotCX0KLQotCXByaXZhdGUgSlJhZGlvQnV0dG9uIGJ1aWxkUmVkUmFkaW9CdXR0b24oKSB7Ci0JCUpSYWRpb0J1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBKUmFkaW9CdXR0b24oKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCgicmVkIik7Ci0JCXJhZGlvQnV0dG9uLnNldE1vZGVsKHRoaXMucmVkQnV0dG9uTW9kZWwpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJpdmF0ZSBKUmFkaW9CdXR0b24gYnVpbGRHcmVlblJhZGlvQnV0dG9uKCkgewotCQlKUmFkaW9CdXR0b24gcmFkaW9CdXR0b24gPSBuZXcgSlJhZGlvQnV0dG9uKCk7Ci0JCXJhZGlvQnV0dG9uLnNldFRleHQoImdyZWVuIik7Ci0JCXJhZGlvQnV0dG9uLnNldE1vZGVsKHRoaXMuZ3JlZW5CdXR0b25Nb2RlbCk7Ci0JCXJldHVybiByYWRpb0J1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIEpSYWRpb0J1dHRvbiBidWlsZEJsdWVSYWRpb0J1dHRvbigpIHsKLQkJSlJhZGlvQnV0dG9uIHJhZGlvQnV0dG9uID0gbmV3IEpSYWRpb0J1dHRvbigpOwotCQlyYWRpb0J1dHRvbi5zZXRUZXh0KCJibHVlIik7Ci0JCXJhZGlvQnV0dG9uLnNldE1vZGVsKHRoaXMuYmx1ZUJ1dHRvbk1vZGVsKTsKLQkJcmV0dXJuIHJhZGlvQnV0dG9uOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0Q29sb3JCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldENvbG9yQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0Q29sb3JBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldENvbG9yQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCBjb2xvciIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMucmVzZXRDb2xvcigpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc2V0Q29sb3IoKSB7Ci0JCXRoaXMudGVzdE1vZGVsLnNldENvbG9yKFRlc3RNb2RlbC5ERUZBVUxUX0NPTE9SKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRDbGVhck1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZENsZWFyTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRDbGVhck1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJjbGVhciBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVJhZGlvQnV0dG9uTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuY2xlYXJNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIGNsZWFyTW9kZWwoKSB7Ci0JCXRoaXMudGVzdE1vZGVsSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXN0b3JlTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc3RvcmUgbW9kZWwiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlSYWRpb0J1dHRvbk1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJUmFkaW9CdXR0b25Nb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRNb2RlbCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMudGVzdE1vZGVsKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCQlwcml2YXRlIFN0cmluZyBjb2xvcjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9SX1BST1BFUlRZID0gImNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRCA9ICJyZWQiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRU4gPSAiZ3JlZW4iOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxVRSA9ICJibHVlIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09MT1IgPSBSRUQ7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZBTElEX0NPTE9SUyA9IHsKLQkJCQlSRUQsCi0JCQkJR1JFRU4sCi0JCQkJQkxVRQotCQkJfTsKLQkKLQkJcHVibGljIFRlc3RNb2RlbCgpIHsKLQkJCXRoaXMoREVGQVVMVF9DT0xPUik7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbChTdHJpbmcgY29sb3IpIHsKLQkJCXRoaXMuY29sb3IgPSBjb2xvcjsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuY29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7Ci0JCQlpZiAoICEgQXJyYXlUb29scy5jb250YWlucyhWQUxJRF9DT0xPUlMsIGNvbG9yKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29sb3IpOwotCQkJfQotCQkJT2JqZWN0IG9sZCA9IHRoaXMuY29sb3I7Ci0JCQl0aGlzLmNvbG9yID0gY29sb3I7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MT1JfUFJPUEVSVFksIG9sZCwgY29sb3IpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJUZXN0TW9kZWwoIiArIHRoaXMuY29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmNiMWQyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9SZWFkT25seVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLlBlcnNvbkNvbHVtbkFkYXB0ZXI7Ci0KLS8qKgotICogTWFrZSBpdCBlYXN5IHRvIHRlc3QgdGhlIHRhYmxlIG1vZGVsIGFkYXB0ZXIgYW5kCi0gKiByZW5kZXJlcnMgd2l0aG91dCBhbnkgZWRpdGluZyBhbGxvd2VkLgotICovCi1wdWJsaWMgY2xhc3MgUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCBleHRlbmRzIFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgUmVhZE9ubHlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5VGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGNvbHVtbklzRWRpdGFibGUoaW50IGluZGV4KSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmExYzE1Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5TcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gdmFsdWVIb2xkZXI7Ci0JU3Bpbm5lck1vZGVsIHNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci0JYm9vbGVhbiBldmVudEZpcmVkOwotCi0JcHVibGljIFNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnZhbHVlSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBJbnRlZ2VyKDApKTsKLQkJdGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyID0gbmV3IFNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy52YWx1ZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFZhbHVlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWx1ZUxpc3RlbmVyXygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RUb29scy5jbGVhcih0aGlzKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVTcGlubmVyTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoQ2hhbmdlRXZlbnQgZSkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50RmlyZWQgPSB0cnVlOwotCQkJCWFzc2VydEVxdWFscyhTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyLCBlLmdldFNvdXJjZSgpKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig1KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUpLCB0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVZhbHVlSG9sZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuYWRkQ2hhbmdlTGlzdGVuZXIobmV3IFRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCQlTcGlubmVyTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCQlhc3NlcnRFcXVhbHMoU3Bpbm5lck1vZGVsQWRhcHRlclRlc3RzLnRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlciwgZS5nZXRTb3VyY2UoKSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMCksIHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJdGhpcy52YWx1ZUhvbGRlci5zZXRWYWx1ZShuZXcgSW50ZWdlcig3KSk7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDcpLCB0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBsb2NhbFZhbHVlSG9sZGVyID0gKFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KSB0aGlzLnZhbHVlSG9sZGVyOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0KLQkJQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlci5hZGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUobG9jYWxWYWx1ZUhvbGRlci5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5zcGlubmVyTW9kZWxBZGFwdGVyKTsKLQotCQl0aGlzLnNwaW5uZXJNb2RlbEFkYXB0ZXIucmVtb3ZlQ2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShsb2NhbFZhbHVlSG9sZGVyLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQl0aGlzLnZlcmlmeUhhc05vTGlzdGVuZXJzKHRoaXMuc3Bpbm5lck1vZGVsQWRhcHRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUhhc05vTGlzdGVuZXJzKE9iamVjdCBhZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGRlbGVnYXRlID0gUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoYWRhcHRlciwgImRlbGVnYXRlIik7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IChPYmplY3RbXSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoZGVsZWdhdGUsICJnZXRDaGFuZ2VMaXN0ZW5lcnMiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxpc3RlbmVycy5sZW5ndGgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlIYXNMaXN0ZW5lcnMoT2JqZWN0IGFkYXB0ZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlPYmplY3QgZGVsZWdhdGUgPSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShhZGFwdGVyLCAiZGVsZWdhdGUiKTsKLQkJT2JqZWN0W10gbGlzdGVuZXJzID0gKE9iamVjdFtdKSBSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChkZWxlZ2F0ZSwgImdldENoYW5nZUxpc3RlbmVycyIpOwotCQlhc3NlcnRGYWxzZShsaXN0ZW5lcnMubGVuZ3RoID09IDApOwotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBDaGFuZ2VMaXN0ZW5lciB7Ci0JCVRlc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKENoYW5nZUV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9TcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTc2Y2EuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1NwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuYXd0LkJvcmRlckxheW91dDsKLWltcG9ydCBqYXZhLmF3dC5Db21wb25lbnQ7Ci1pbXBvcnQgamF2YS5hd3QuR3JpZExheW91dDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dBZGFwdGVyOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0V2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0xpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KQnV0dG9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkpGcmFtZTsKLWltcG9ydCBqYXZheC5zd2luZy5KUGFuZWw7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlNwaW5uZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuU3Bpbm5lck1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkxpc3RTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5OdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotCi0vKioKLSAqIFBsYXkgYXJvdW5kIHdpdGggYSBzZXQgb2Ygc3Bpbm5lcnMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QgewotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB0ZXN0TW9kZWxIb2xkZXI7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYmlydGhEYXRlSG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJpcnRoRGF0ZVNwaW5uZXJNb2RlbDsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBhZ2VIb2xkZXI7Ci0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYWdlU3Bpbm5lck1vZGVsOwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGV5ZUNvbG9ySG9sZGVyOwotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGV5ZUNvbG9yU3Bpbm5lck1vZGVsOwotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbmV3IFNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QoKS5leGVjKCk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdE1vZGVsID0gbmV3IFRlc3RNb2RlbCgpOwotCQl0aGlzLnRlc3RNb2RlbEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPih0aGlzLnRlc3RNb2RlbCk7Ci0KLQkJdGhpcy5iaXJ0aERhdGVIb2xkZXIgPSB0aGlzLmJ1aWxkQmlydGhEYXRlSG9sZGVyKHRoaXMudGVzdE1vZGVsSG9sZGVyKTsKLQkJdGhpcy5iaXJ0aERhdGVTcGlubmVyTW9kZWwgPSB0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lck1vZGVsKHRoaXMuYmlydGhEYXRlSG9sZGVyKTsKLQotCQl0aGlzLmFnZUhvbGRlciA9IHRoaXMuYnVpbGRBZ2VIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmFnZVNwaW5uZXJNb2RlbCA9IHRoaXMuYnVpbGRBZ2VTcGlubmVyTW9kZWwodGhpcy5hZ2VIb2xkZXIpOwotCi0JCXRoaXMuZXllQ29sb3JIb2xkZXIgPSB0aGlzLmJ1aWxkRXllQ29sb3JIb2xkZXIodGhpcy50ZXN0TW9kZWxIb2xkZXIpOwotCQl0aGlzLmV5ZUNvbG9yU3Bpbm5lck1vZGVsID0gdGhpcy5idWlsZEV5ZUNvbG9yU3Bpbm5lck1vZGVsKHRoaXMuZXllQ29sb3JIb2xkZXIpOwotCi0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5CSVJUSF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRCaXJ0aERhdGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRCaXJ0aERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEJpcnRoRGF0ZVNwaW5uZXJNb2RlbChXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IHZhbHVlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodmFsdWVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBidWlsZEFnZUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE51bWJlcj4odm0sIFRlc3RNb2RlbC5BR0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE51bWJlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldEFnZSgpKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE51bWJlciB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRBZ2UodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRBZ2VTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IE51bWJlclNwaW5uZXJNb2RlbEFkYXB0ZXIodmFsdWVIb2xkZXIsIHZhbHVlSG9sZGVyLmdldFZhbHVlKCkuaW50VmFsdWUoKSwgVGVzdE1vZGVsLk1JTl9BR0UsIFRlc3RNb2RlbC5NQVhfQUdFLCAxKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8VGVzdE1vZGVsPiB2bSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIE9iamVjdD4odm0sIFRlc3RNb2RlbC5FWUVfQ09MT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9iamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEV5ZUNvbG9yKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0RXllQ29sb3IoKFN0cmluZykgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkRXllQ29sb3JTcGlubmVyTW9kZWwoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiB2YWx1ZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RTcGlubmVyTW9kZWxBZGFwdGVyKHZhbHVlSG9sZGVyLCBUZXN0TW9kZWwuVkFMSURfRVlFX0NPTE9SUyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5XaW5kb3coKSB7Ci0JCUpGcmFtZSB3aW5kb3cgPSBuZXcgSkZyYW1lKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQl3aW5kb3cuc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKFdpbmRvd0NvbnN0YW50cy5ET19OT1RISU5HX09OX0NMT1NFKTsKLQkJd2luZG93LmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMuYnVpbGRXaW5kb3dMaXN0ZW5lcigpKTsKLQkJd2luZG93LmdldENvbnRlbnRQYW5lKCkuYWRkKHRoaXMuYnVpbGRNYWluUGFuZWwoKSwgIkNlbnRlciIpOwotCQl3aW5kb3cuc2V0U2l6ZSg2MDAsIDEwMCk7Ci0JCXdpbmRvdy5zZXRWaXNpYmxlKHRydWUpOwotCX0KLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgYnVpbGRXaW5kb3dMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBXaW5kb3dBZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKLQkJCQllLmdldFdpbmRvdygpLnNldFZpc2libGUoZmFsc2UpOwotCQkJCVN5c3RlbS5leGl0KDApOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkTWFpblBhbmVsKCkgewotCQlKUGFuZWwgbWFpblBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRTcGlubmVyUGFuZWwoKSwgQm9yZGVyTGF5b3V0Lk5PUlRIKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkQ29udHJvbFBhbmVsKCksIEJvcmRlckxheW91dC5TT1VUSCk7Ci0JCXJldHVybiBtYWluUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRTcGlubmVyUGFuZWwoKSB7Ci0JCUpQYW5lbCB0YXNrTGlzdFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCXRhc2tMaXN0UGFuZWwuYWRkKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkpOwotCQl0YXNrTGlzdFBhbmVsLmFkZCh0aGlzLmJ1aWxkQWdlU3Bpbm5lcigpKTsKLQkJdGFza0xpc3RQYW5lbC5hZGQodGhpcy5idWlsZEV5ZUNvbG9yU3Bpbm5lcigpKTsKLQkJcmV0dXJuIHRhc2tMaXN0UGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEJpcnRoRGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5iaXJ0aERhdGVTcGlubmVyTW9kZWwpOwotCX0KLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRBZ2VTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYWdlU3Bpbm5lck1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIEpTcGlubmVyIGJ1aWxkRXllQ29sb3JTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuZXllQ29sb3JTcGlubmVyTW9kZWwpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgxLCAwKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc2V0TW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZENsZWFyTW9kZWxCdXR0b24oKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZFJlc3RvcmVNb2RlbEJ1dHRvbigpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkUHJpbnRNb2RlbEJ1dHRvbigpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXNldE1vZGVsQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0TW9kZWxBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldE1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXNldCBtb2RlbCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVNwaW5uZXJNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZXNldE1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXRNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWwuc2V0QmlydGhEYXRlKFRlc3RNb2RlbC5ERUZBVUxUX0JJUlRIX0RBVEUpOwotCQl0aGlzLnRlc3RNb2RlbC5zZXRFeWVDb2xvcihUZXN0TW9kZWwuREVGQVVMVF9FWUVfQ09MT1IpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyTW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBjbGVhck1vZGVsKCkgewotCQl0aGlzLnRlc3RNb2RlbEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZXN0b3JlTW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzdG9yZU1vZGVsQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJyZXN0b3JlIG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc3RvcmVNb2RlbCgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlc3RvcmVNb2RlbCgpIHsKLQkJdGhpcy50ZXN0TW9kZWxIb2xkZXIuc2V0VmFsdWUodGhpcy50ZXN0TW9kZWwpOwotCX0KLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50TW9kZWxCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUHJpbnRNb2RlbEFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFByaW50TW9kZWxBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IG1vZGVsIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU3Bpbm5lck1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnByaW50TW9kZWwoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0Jdm9pZCBwcmludE1vZGVsKCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJpcnRoIGRhdGU6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXRCaXJ0aERhdGUoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWdlOiAiICsgdGhpcy50ZXN0TW9kZWwuZ2V0QWdlKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oImV5ZXM6ICIgKyB0aGlzLnRlc3RNb2RlbC5nZXRFeWVDb2xvcigpKTsKLQl9Ci0KLQotCXN0YXRpYyBjbGFzcyBUZXN0TW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIHsKLQkJcHJpdmF0ZSBDYWxlbmRhciBiaXJ0aENhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQkvLyAidmlydHVhbCIgcHJvcGVydGllcwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklSVEhfREFURV9QUk9QRVJUWSA9ICJiaXJ0aERhdGUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUdFX1BST1BFUlRZID0gImFnZSI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIERhdGUgREVGQVVMVF9CSVJUSF9EQVRFID0gbmV3IERhdGUoKTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQUdFID0gMDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1JTl9BR0UgPSAwOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FHRSA9IDE1MDsKLQkJcHJpdmF0ZSBTdHJpbmcgZXllQ29sb3I7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfUFJPUEVSVFkgPSAiZXllQ29sb3IiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWQUxJRF9FWUVfQ09MT1JTID0geyJibHVlIiwgImJyb3duIiwgImdyZWVuIiwgImhhemVsIiwgInBpbmsifTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVlFX0NPTE9SID0gVkFMSURfRVlFX0NPTE9SU1szXTsKLQkKLQkJVGVzdE1vZGVsKCkgewotCQkJdGhpcyhERUZBVUxUX0JJUlRIX0RBVEUsIERFRkFVTFRfRVlFX0NPTE9SKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsKERhdGUgYmlydGhEYXRlLCBTdHJpbmcgZXllQ29sb3IpIHsKLQkJCXRoaXMuc2V0QmlydGhEYXRlKGJpcnRoRGF0ZSk7Ci0JCQl0aGlzLnNldEV5ZUNvbG9yKGV5ZUNvbG9yKTsKLQkJfQotCQlwdWJsaWMgRGF0ZSBnZXRCaXJ0aERhdGUoKSB7Ci0JCQlyZXR1cm4gKERhdGUpIHRoaXMuYmlydGhDYWwuZ2V0VGltZSgpLmNsb25lKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QmlydGhEYXRlKERhdGUgYmlydGhEYXRlKSB7Ci0JCQlEYXRlIG9sZEJpcnRoRGF0ZSA9IHRoaXMuZ2V0QmlydGhEYXRlKCk7Ci0JCQlpbnQgb2xkQWdlID0gdGhpcy5nZXRBZ2UoKTsKLQkJCXRoaXMuYmlydGhDYWwuc2V0VGltZUluTWlsbGlzKGJpcnRoRGF0ZS5nZXRUaW1lKCkpOwotCQkJaW50IG5ld0FnZSA9IHRoaXMuZ2V0QWdlKCk7Ci0JCQlpZiAobmV3QWdlIDwgTUlOX0FHRSB8fCBuZXdBZ2UgPiBNQVhfQUdFKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihiaXJ0aERhdGUudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQklSVEhfREFURV9QUk9QRVJUWSwgb2xkQmlydGhEYXRlLCB0aGlzLmdldEJpcnRoRGF0ZSgpKTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBR0VfUFJPUEVSVFksIG9sZEFnZSwgbmV3QWdlKTsKLQkJfQotCQlwdWJsaWMgaW50IGdldEFnZSgpIHsKLQkJCUNhbGVuZGFyIGN1cnJlbnRDYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwotCQkJaW50IGFnZSA9IGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLllFQVIpIC0gdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuWUVBUik7Ci0JCQlpZiAoY3VycmVudENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpIDwgdGhpcy5iaXJ0aENhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpKSB7Ci0JCQkJYWdlLS07Ci0JCQl9IGVsc2UgaWYgKGN1cnJlbnRDYWwuZ2V0KENhbGVuZGFyLk1PTlRIKSA9PSB0aGlzLmJpcnRoQ2FsLmdldChDYWxlbmRhci5NT05USCkpIHsKLQkJCQlpZiAoY3VycmVudENhbC5nZXQoQ2FsZW5kYXIuREFZX09GX01PTlRIKSA8IHRoaXMuYmlydGhDYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpIHsKLQkJCQkJYWdlLS07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGFnZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRBZ2UoaW50IG5ld0FnZSkgewotCQkJaWYgKG5ld0FnZSA8IE1JTl9BR0UgfHwgbmV3QWdlID4gTUFYX0FHRSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLnZhbHVlT2YobmV3QWdlKSk7Ci0JCQl9Ci0JCi0JCQlpbnQgb2xkQWdlID0gdGhpcy5nZXRBZ2UoKTsKLQkJCWludCBkZWx0YSA9IG5ld0FnZSAtIG9sZEFnZTsKLQkKLQkJCUNhbGVuZGFyIG5ld0JpcnRoQ2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJCW5ld0JpcnRoQ2FsLnNldFRpbWVJbk1pbGxpcyh0aGlzLmJpcnRoQ2FsLmdldFRpbWUoKS5nZXRUaW1lKCkpOwotCQkJLy8gaWYgdGhlIGFnZSBpbmNyZWFzZWQsIHRoZSBiaXJ0aCBkYXRlIG11c3QgYmUgImRlY3JlYXNlZCI7IGFuZCB2aWNlIHZlcnNhCi0JCQluZXdCaXJ0aENhbC5zZXQoQ2FsZW5kYXIuWUVBUiwgbmV3QmlydGhDYWwuZ2V0KENhbGVuZGFyLllFQVIpIC0gZGVsdGEpOwotCQkJdGhpcy5zZXRCaXJ0aERhdGUobmV3QmlydGhDYWwuZ2V0VGltZSgpKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldEV5ZUNvbG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZXllQ29sb3I7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXllQ29sb3IoU3RyaW5nIGV5ZUNvbG9yKSB7Ci0JCQlpZiAoICEgQXJyYXlUb29scy5jb250YWlucyhWQUxJRF9FWUVfQ09MT1JTLCBleWVDb2xvcikpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV5ZUNvbG9yKTsKLQkJCX0KLQkJCU9iamVjdCBvbGQgPSB0aGlzLmV5ZUNvbG9yOwotCQkJdGhpcy5leWVDb2xvciA9IGV5ZUNvbG9yOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEVZRV9DT0xPUl9QUk9QRVJUWSwgb2xkLCBleWVDb2xvcik7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRlc3RNb2RlbChiaXJ0aDogIiArIHRoaXMuZ2V0QmlydGhEYXRlKCkgKyAiIC0gZXllczogIiArIHRoaXMuZXllQ29sb3IgKyAiKSI7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzEyNWE0Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5DYWxlbmRhcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVGFibGVNb2RlbEV2ZW50OwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50LlRhYmxlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5UZXN0VG9vbHM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRhYmxlTW9kZWxBZGFwdGVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBDcm93ZCBjcm93ZDsKLQlUYWJsZU1vZGVsRXZlbnQgZXZlbnQ7Ci0KLQlwdWJsaWMgVGFibGVNb2RlbEFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNyb3dkID0gdGhpcy5idWlsZENyb3dkKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdFRvb2xzLmNsZWFyKHRoaXMpOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSb3dDb3VudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Um93Q291bnQoKSk7Ci0JCS8vIHdlIG5lZWQgdG8gYWRkIGEgbGlzdGVuZXIgdG8gd2FrZSB1cCB0aGUgYWRhcHRlcgotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuY3Jvd2QucGVvcGxlU2l6ZSgpLCB0YWJsZU1vZGVsQWRhcHRlci5nZXRSb3dDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbkNvbHVtbkFkYXB0ZXIuQ09MVU1OX0NPVU5ULCB0YWJsZU1vZGVsQWRhcHRlci5nZXRDb2x1bW5Db3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVBdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0YWJsZU1vZGVsQWRhcHRlci5hZGRUYWJsZU1vZGVsTGlzdGVuZXIodGhpcy5idWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpKTsKLQotCQlMaXN0PFN0cmluZz4gc29ydGVkTmFtZXMgPSB0aGlzLnNvcnRlZE5hbWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5jcm93ZC5wZW9wbGVTaXplKCk7IGkrKykgewotCQkJYXNzZXJ0RXF1YWxzKHNvcnRlZE5hbWVzLmdldChpKSwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0VmFsdWVBdChpLCBQZXJzb25Db2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVBdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VGFibGVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoVGFibGVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnQgPSBlOwotCQkJfQotCQl9KTsKLQotCQlQZXJzb24gcGVyc29uID0gdGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIik7Ci0JCWFzc2VydEVxdWFscyhQZXJzb24uRVlFX0NPTE9SX0JMVUUsIHBlcnNvbi5nZXRFeWVDb2xvcigpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc29uLmlzRXZpbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNvbi5nZXRSYW5rKCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVNb2RlbEFkYXB0ZXIuZ2V0Um93Q291bnQoKTsgaSsrKSB7Ci0JCQlpZiAodGFibGVNb2RlbEFkYXB0ZXIuZ2V0VmFsdWVBdChpLCBQZXJzb25Db2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OKS5lcXVhbHMoIkdvbGx1bSIpKSB7Ci0JCQkJdGFibGVNb2RlbEFkYXB0ZXIuc2V0VmFsdWVBdChQZXJzb24uRVlFX0NPTE9SX0hBWkVMLCBpLCBQZXJzb25Db2x1bW5BZGFwdGVyLkVZRV9DT0xPUl9DT0xVTU4pOwotCQkJCXRhYmxlTW9kZWxBZGFwdGVyLnNldFZhbHVlQXQoQm9vbGVhbi5UUlVFLCBpLCBQZXJzb25Db2x1bW5BZGFwdGVyLkVWSUxfQ09MVU1OKTsKLQkJCQl0YWJsZU1vZGVsQWRhcHRlci5zZXRWYWx1ZUF0KG5ldyBJbnRlZ2VyKC0xKSwgaSwgUGVyc29uQ29sdW1uQWRhcHRlci5SQU5LX0NPTFVNTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFBlcnNvbi5FWUVfQ09MT1JfSEFaRUwsIHBlcnNvbi5nZXRFeWVDb2xvcigpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaXNFdmlsKCkpOwotCQlhc3NlcnRFcXVhbHMoLTEsIHBlcnNvbi5nZXRSYW5rKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiB0YWJsZU1vZGVsQWRhcHRlciA9ICB0aGlzLmJ1aWxkVGFibGVNb2RlbEFkYXB0ZXIoKTsKLQkJdGhpcy5ldmVudCA9IG51bGw7Ci0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcih0aGlzLmJ1aWxkU2luZ2xlRXZlbnRMaXN0ZW5lcigpKTsKLQkJLy8gYWRkIGEgcGVyc29uIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgc28gd2Ugb25seSB0cmlnZ2VyIG9uZSBldmVudAotCQl0aGlzLmNyb3dkLmFkZFBlcnNvbigiWnp6enoiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV2ZW50KTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5JTlNFUlQsIHRoaXMuZXZlbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRhYmxlTW9kZWxFdmVudC5BTExfQ09MVU1OUywgdGhpcy5ldmVudC5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVJvdygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkpOwotCQkvLyByZW1vdmluZyBhIHBlcnNvbiBzaG91bGQgb25seSB0cmlnZ2VyIG9uZSBldmVudCwgc2luY2UgYSByZS1zb3J0IGlzIG5vdCBuZWVkZWQKLQkJdGhpcy5jcm93ZC5yZW1vdmVQZXJzb24odGhpcy5jcm93ZC5wZXJzb25OYW1lZCgiR29sbHVtIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZXZlbnQpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LkRFTEVURSwgdGhpcy5ldmVudC5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGFibGVNb2RlbEV2ZW50LkFMTF9DT0xVTU5TLCB0aGlzLmV2ZW50LmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlQ2VsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQl0aGlzLmV2ZW50ID0gbnVsbDsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKHRoaXMuYnVpbGRTaW5nbGVFdmVudExpc3RlbmVyKCkpOwotCQkvLyBhZGQgYSBwZXJzb24gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBzbyB3ZSBvbmx5IHRyaWdnZXIgb25lIGV2ZW50Ci0JCVBlcnNvbiBwZXJzb24gPSB0aGlzLmNyb3dkLnBlcnNvbk5hbWVkKCJHb2xsdW0iKTsKLQkJcGVyc29uLnNldEV2aWwodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5ldmVudCk7Ci0JCWFzc2VydEVxdWFscyhUYWJsZU1vZGVsRXZlbnQuVVBEQVRFLCB0aGlzLmV2ZW50LmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhQZXJzb25Db2x1bW5BZGFwdGVyLkVWSUxfQ09MVU1OLCB0aGlzLmV2ZW50LmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TGF6eUxpc3RMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZU1vZGVsQWRhcHRlcjxQZXJzb24+IHRhYmxlTW9kZWxBZGFwdGVyID0gIHRoaXMuYnVpbGRUYWJsZU1vZGVsQWRhcHRlcigpOwotCQlUYWJsZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGFibGVNb2RlbExpc3RlbmVyKCk7Ci0JCWFzc2VydFRydWUodGhpcy5jcm93ZC5oYXNOb0NvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pKTsKLQkJdGFibGVNb2RlbEFkYXB0ZXIuYWRkVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNyb3dkLmhhc0FueUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcnMoQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04pKTsKLQkJdGFibGVNb2RlbEFkYXB0ZXIucmVtb3ZlVGFibGVNb2RlbExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNyb3dkLmhhc05vQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVycyhDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RMYXp5Q2VsbExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4gdGFibGVNb2RlbEFkYXB0ZXIgPSAgdGhpcy5idWlsZFRhYmxlTW9kZWxBZGFwdGVyKCk7Ci0JCVRhYmxlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA9IHRoaXMuYnVpbGRUYWJsZU1vZGVsTGlzdGVuZXIoKTsKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuY3Jvd2QucGVyc29uTmFtZWQoIkdvbGx1bSIpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVWSUxfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uUkFOS19QUk9QRVJUWSkpOwotCi0JCXRhYmxlTW9kZWxBZGFwdGVyLmFkZFRhYmxlTW9kZWxMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5FWUVfQ09MT1JfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVWSUxfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLlJBTktfUFJPUEVSVFkpKTsKLQotCQl0YWJsZU1vZGVsQWRhcHRlci5yZW1vdmVUYWJsZU1vZGVsTGlzdGVuZXIobGlzdGVuZXIpOwotCQlhc3NlcnRUcnVlKHBlcnNvbi5oYXNOb1Byb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFBlcnNvbi5OQU1FX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkJJUlRIX0RBVEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSk7Ci0JCWFzc2VydFRydWUocGVyc29uLmhhc05vUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUGVyc29uLkVWSUxfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzb24uaGFzTm9Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQZXJzb24uUkFOS19QUk9QRVJUWSkpOwotCX0KLQotCXByaXZhdGUgVGFibGVNb2RlbEFkYXB0ZXI8UGVyc29uPiBidWlsZFRhYmxlTW9kZWxBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5idWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSwgdGhpcy5idWlsZENvbHVtbkFkYXB0ZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZENlbGxMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZENlbGxMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlyZXR1cm4gdGhpcy5idWlsZExpc3RDaGFuZ2VMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTb3J0ZWRQZW9wbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxQZXJzb24+KHRoaXMuYnVpbGRQZW9wbGVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8Q3Jvd2QsIFBlcnNvbj4oQ3Jvd2QuUEVPUExFX0NPTExFQ1RJT04sIHRoaXMuY3Jvd2QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFBlcnNvbj4gaXRlcmF0b3JfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QucGVvcGxlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGVTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDcm93ZCBidWlsZENyb3dkKCkgewotCQlDcm93ZCByZXN1bHQgPSBuZXcgQ3Jvd2QoKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiQmlsYm8iKTsKLQkJcmVzdWx0LmFkZFBlcnNvbigiR29sbHVtIik7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIkZyb2RvIik7Ci0JCXJlc3VsdC5hZGRQZXJzb24oIlNhbXdpc2UiKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFkYXB0ZXIgYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFBlcnNvbkNvbHVtbkFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWxMaXN0ZW5lciBidWlsZFRhYmxlTW9kZWxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUZXN0VGFibGVNb2RlbExpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gc29ydGVkTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQ29sbGVjdGlvblRvb2xzLnNvcnRlZFNldCh0aGlzLmNyb3dkLnBlb3BsZU5hbWVzKCkpKTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWxMaXN0ZW5lciBidWlsZFNpbmdsZUV2ZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFRhYmxlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlTW9kZWxFdmVudCBlKSB7Ci0JCQkJLy8gd2UgZXhwZWN0IG9ubHkgYSBzaW5nbGUgZXZlbnQKLQkJCQlpZiAoVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID09IG51bGwpIHsKLQkJCQkJVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy50aGlzLmV2ZW50ID0gZTsKLQkJCQl9IGVsc2UgewotCQkJCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGFzc2VzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uQ29sdW1uQWRhcHRlciBpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSA3OwotCQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJJUlRIX0RBVEVfQ09MVU1OID0gMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgR09ORV9XRVNUX0RBVEVfQ09MVU1OID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVlFX0NPTE9SX0NPTFVNTiA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWSUxfQ09MVU1OID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkFOS19DT0xVTU4gPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBRFZFTlRVUkVfQ09VTlRfQ09MVU1OID0gNjsKLQkKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OX05BTUVTID0gbmV3IFN0cmluZ1tdIHsKLQkJCSJOYW1lIiwKLQkJCSJCaXJ0aCIsCi0JCQkiR29uZSBXZXN0IiwKLQkJCSJFeWVzIiwKLQkJCSJFdmlsIiwKLQkJCSJSYW5rIiwKLQkJCSJBZHZlbnR1cmVzIgotCQl9OwotCQotCQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gQ09MVU1OX05BTUVTW2luZGV4XTsKLQkJfQotCQotCQlwdWJsaWMgQ2xhc3M8Pz4gY29sdW1uQ2xhc3MoaW50IGluZGV4KSB7Ci0JCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQkJY2FzZSBOQU1FX0NPTFVNTjoJCQkJCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JCQkJY2FzZSBCSVJUSF9EQVRFX0NPTFVNTjoJCQlyZXR1cm4gRGF0ZS5jbGFzczsKLQkJCQljYXNlIEdPTkVfV0VTVF9EQVRFX0NPTFVNTjoJcmV0dXJuIERhdGUuY2xhc3M7Ci0JCQkJY2FzZSBFWUVfQ09MT1JfQ09MVU1OOgkJCXJldHVybiBPYmplY3QuY2xhc3M7Ci0JCQkJY2FzZSBFVklMX0NPTFVNTjoJCQkJCXJldHVybiBCb29sZWFuLmNsYXNzOwotCQkJCWNhc2UgUkFOS19DT0xVTU46CQkJCQlyZXR1cm4gSW50ZWdlci5jbGFzczsKLQkJCQljYXNlIEFEVkVOVFVSRV9DT1VOVF9DT0xVTU46cmV0dXJuIEludGVnZXIuY2xhc3M7Ci0JCQkJZGVmYXVsdDogCQkJCQkJCQkJcmV0dXJuIE9iamVjdC5jbGFzczsKLQkJCX0KLQkJfQotCQotCQlwdWJsaWMgYm9vbGVhbiBjb2x1bW5Jc0VkaXRhYmxlKGludCBpbmRleCkgewotCQkJcmV0dXJuIGluZGV4ICE9IE5BTUVfQ09MVU1OOwotCQl9Ci0JCi0JCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+W10gY2VsbE1vZGVscyhPYmplY3Qgc3ViamVjdCkgewotCQkJUGVyc29uIHBlcnNvbiA9IChQZXJzb24pIHN1YmplY3Q7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD5bXSByZXN1bHQgPSBuZXcgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxbQ09MVU1OX0NPVU5UXTsKLQkKLQkJCXJlc3VsdFtOQU1FX0NPTFVNTl0gPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIocGVyc29uKTsKLQkJCXJlc3VsdFtCSVJUSF9EQVRFX0NPTFVNTl0gPSB0aGlzLmJ1aWxkQmlydGhEYXRlQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0dPTkVfV0VTVF9EQVRFX0NPTFVNTl0gPSB0aGlzLmJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0VZRV9DT0xPUl9DT0xVTU5dID0gdGhpcy5idWlsZEV5ZUNvbG9yQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0VWSUxfQ09MVU1OXSA9IHRoaXMuYnVpbGRFdmlsQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W1JBTktfQ09MVU1OXSA9IHRoaXMuYnVpbGRSYW5rQWRhcHRlcihwZXJzb24pOwotCQkJcmVzdWx0W0FEVkVOVFVSRV9DT1VOVF9DT0xVTU5dID0gdGhpcy5idWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcihwZXJzb24pOwotCQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGROYW1lQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLk5BTUVfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKChTdHJpbmcpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEJpcnRoRGF0ZUFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZLCBwZXJzb24pIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgRGF0ZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRCaXJ0aERhdGUoKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE9iamVjdCB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0QmlydGhEYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKFBlcnNvbiBwZXJzb24pIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0PihQZXJzb24uR09ORV9XRVNUX0RBVEVfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEdvbmVXZXN0RGF0ZSgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRHb25lV2VzdERhdGUoKERhdGUpIHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV5ZUNvbG9yQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkVZRV9DT0xPUl9QUk9QRVJUWSwgcGVyc29uKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeWVDb2xvcigpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRFeWVDb2xvcigoU3RyaW5nKSB2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFdmlsQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLkVWSUxfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0V2aWwoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldEV2aWwoKChCb29sZWFuKXZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRSYW5rQWRhcHRlcihQZXJzb24gcGVyc29uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4oUGVyc29uLlJBTktfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldFJhbmsoKSk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldFJhbmsoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRBZHZlbnR1cmVDb3VudEFkYXB0ZXIoUGVyc29uIHBlcnNvbikgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KFBlcnNvbi5BRFZFTlRVUkVfQ09VTlRfUFJPUEVSVFksIHBlcnNvbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldEFkdmVudHVyZUNvdW50KCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRBZHZlbnR1cmVDb3VudCgoKEludGVnZXIpIHZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIENyb3dkIGV4dGVuZHMgQWJzdHJhY3RNb2RlbCB7Ci0JCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxQZXJzb24+IHBlb3BsZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFT1BMRV9DT0xMRUNUSU9OID0gInBlb3BsZSI7Ci0JCi0JCXB1YmxpYyBDcm93ZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBlb3BsZSA9IG5ldyBBcnJheUxpc3Q8UGVyc29uPigpOwotCQl9Ci0JCi0JCi0JCXB1YmxpYyBJdGVyYXRvcjxQZXJzb24+IHBlb3BsZSgpIHsKLQkJCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxQZXJzb24+KHRoaXMucGVvcGxlKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKFBlcnNvbiBwZXJzb24pIHsKLQkJCQkJQ3Jvd2QudGhpcy5yZW1vdmVQZXJzb24ocGVyc29uKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgcGVvcGxlU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnBlb3BsZS5zaXplKCk7Ci0JCX0KLQkKLQkJcHVibGljIFBlcnNvbiBhZGRQZXJzb24oU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuY2hlY2tQZXJzb25OYW1lKG5hbWUpOwotCQkJcmV0dXJuIHRoaXMuYWRkUGVyc29uKG5ldyBQZXJzb24odGhpcywgbmFtZSkpOwotCQl9Ci0JCi0JCXByaXZhdGUgUGVyc29uIGFkZFBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24ocGVyc29uLCB0aGlzLnBlb3BsZSwgUEVPUExFX0NPTExFQ1RJT04pOwotCQkJcmV0dXJuIHBlcnNvbjsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzb24oUGVyc29uIHBlcnNvbikgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24ocGVyc29uLCB0aGlzLnBlb3BsZSwgUEVPUExFX0NPTExFQ1RJT04pOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBlb3BsZShDb2xsZWN0aW9uPFBlcnNvbj4gcGVyc29ucykgewotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHBlcnNvbnMsIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJcHVibGljIHZvaWQgcmVtb3ZlUGVvcGxlKEl0ZXJhdG9yPFBlcnNvbj4gcGVyc29ucykgewotCQkJdGhpcy5yZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHBlcnNvbnMsIHRoaXMucGVvcGxlLCBQRU9QTEVfQ09MTEVDVElPTik7Ci0JCX0KLQkKLQkJdm9pZCBjaGVja1BlcnNvbk5hbWUoU3RyaW5nIHBlcnNvbk5hbWUpIHsKLQkJCWlmIChwZXJzb25OYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5wZW9wbGVOYW1lcygpLCBwZXJzb25OYW1lKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24ocGVyc29uTmFtZSk7Ci0JCQl9Ci0JCX0KLQkKLQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gcGVvcGxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmF0b3I8UGVyc29uLCBTdHJpbmc+KHRoaXMucGVvcGxlLml0ZXJhdG9yKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzb24gcGVyc29uKSB7Ci0JCQkJCXJldHVybiBwZXJzb24uZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkKLQkJcHVibGljIFBlcnNvbiBwZXJzb25OYW1lZChTdHJpbmcgbmFtZSkgewotCQkJZm9yIChJdGVyYXRvcjxQZXJzb24+IHN0cmVhbSA9IHRoaXMucGVvcGxlLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCVBlcnNvbiBwZXJzb24gPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChwZXJzb24uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCQlyZXR1cm4gcGVyc29uOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgU3RyaW5nLnZhbHVlT2YodGhpcy5wZW9wbGUuc2l6ZSgpKSArICIgcGVvcGxlIik7Ci0JCX0KLQkKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzb24gZXh0ZW5kcyBBYnN0cmFjdE1vZGVsIGltcGxlbWVudHMgQ29tcGFyYWJsZTxQZXJzb24+IHsKLQkJcHJpdmF0ZSBDcm93ZCBjcm93ZDsKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFk9ICJuYW1lIjsKLQkJcHJpdmF0ZSBEYXRlIGJpcnRoRGF0ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJUlRIX0RBVEVfUFJPUEVSVFk9ICJiaXJ0aERhdGUiOwotCQlwcml2YXRlIERhdGUgZ29uZVdlc3REYXRlOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR09ORV9XRVNUX0RBVEVfUFJPUEVSVFk9ICJnb25lV2VzdERhdGUiOwotCQlwcml2YXRlIFN0cmluZyBleWVDb2xvcjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9QUk9QRVJUWT0gImV5ZUNvbG9yIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9CTFVFID0gImJsdWUiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX0dSRUVOID0gImdyZWVuIjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVZRV9DT0xPUl9CUk9XTiA9ICJicm93biI7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWUVfQ09MT1JfSEFaRUwgPSAiaGF6ZWwiOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVlFX0NPTE9SX1BJTksgPSAicGluayI7Ci0JCQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gdmFsaWRFeWVDb2xvcnM7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VZRV9DT0xPUiA9IEVZRV9DT0xPUl9CTFVFOwotCQlwcml2YXRlIGJvb2xlYW4gZXZpbDsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWSUxfUFJPUEVSVFk9ICJldmlsIjsKLQkJcHJpdmF0ZSBpbnQgcmFuazsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBTktfUFJPUEVSVFk9ICJyYW5rIjsKLQkJcHJpdmF0ZSBpbnQgYWR2ZW50dXJlQ291bnQ7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRFZFTlRVUkVfQ09VTlRfUFJPUEVSVFk9ICJhZHZlbnR1cmVDb3VudCI7Ci0JCi0JCVBlcnNvbihDcm93ZCBjcm93ZCwgU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNyb3dkID0gY3Jvd2Q7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5iaXJ0aERhdGUgPSBuZXcgRGF0ZSgpOwotCQkJQ2FsZW5kYXIgYyA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7Ci0JCQljLmFkZChDYWxlbmRhci5ZRUFSLCAyNTApOwotCQkJdGhpcy5nb25lV2VzdERhdGUgPSBuZXcgRGF0ZShjLmdldFRpbWVJbk1pbGxpcygpKTsKLQkJCXRoaXMuZXllQ29sb3IgPSBERUZBVUxUX0VZRV9DT0xPUjsKLQkJCXRoaXMuZXZpbCA9IGZhbHNlOwotCQkJdGhpcy5yYW5rID0gMDsKLQkJCXRoaXMuYWR2ZW50dXJlQ291bnQgPSAwOwotCQl9Ci0JCi0JCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFZhbGlkRXllQ29sb3JzKCkgewotCQkJaWYgKHZhbGlkRXllQ29sb3JzID09IG51bGwpIHsKLQkJCQl2YWxpZEV5ZUNvbG9ycyA9IGJ1aWxkVmFsaWRFeWVDb2xvcnMoKTsKLQkJCX0KLQkJCXJldHVybiB2YWxpZEV5ZUNvbG9yczsKLQkJfQotCQotCQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFN0cmluZz4gYnVpbGRWYWxpZEV5ZUNvbG9ycygpIHsKLQkJCUNvbGxlY3Rpb248U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXJlc3VsdC5hZGQoRVlFX0NPTE9SX0JMVUUpOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfR1JFRU4pOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfQlJPV04pOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfSEFaRUwpOwotCQkJcmVzdWx0LmFkZChFWUVfQ09MT1JfUElOSyk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCi0JCXB1YmxpYyBDcm93ZCBnZXRDcm93ZCgpIHsKLQkJCXJldHVybiB0aGlzLmNyb3dkOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQkJdGhpcy5jcm93ZC5jaGVja1BlcnNvbk5hbWUobmFtZSk7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBEYXRlIGdldEJpcnRoRGF0ZSgpIHsKLQkJCXJldHVybiB0aGlzLmJpcnRoRGF0ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRCaXJ0aERhdGUoRGF0ZSBiaXJ0aERhdGUpIHsKLQkJCU9iamVjdCBvbGQgPSB0aGlzLmJpcnRoRGF0ZTsKLQkJCXRoaXMuYmlydGhEYXRlID0gYmlydGhEYXRlOwotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEJJUlRIX0RBVEVfUFJPUEVSVFksIG9sZCwgYmlydGhEYXRlKTsKLQkJfQotCQotCQlwdWJsaWMgRGF0ZSBnZXRHb25lV2VzdERhdGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nb25lV2VzdERhdGU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0R29uZVdlc3REYXRlKERhdGUgZ29uZVdlc3REYXRlKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5nb25lV2VzdERhdGU7Ci0JCQl0aGlzLmdvbmVXZXN0RGF0ZSA9IGdvbmVXZXN0RGF0ZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChHT05FX1dFU1RfREFURV9QUk9QRVJUWSwgb2xkLCBnb25lV2VzdERhdGUpOwotCQl9Ci0JCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RXllQ29sb3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5leWVDb2xvcjsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRFeWVDb2xvcihTdHJpbmcgZXllQ29sb3IpIHsKLQkJCWlmICghIGdldFZhbGlkRXllQ29sb3JzKCkuY29udGFpbnMoZXllQ29sb3IpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleWVDb2xvcik7Ci0JCQl9Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5leWVDb2xvcjsKLQkJCXRoaXMuZXllQ29sb3IgPSBleWVDb2xvcjsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFWUVfQ09MT1JfUFJPUEVSVFksIG9sZCwgZXllQ29sb3IpOwotCQl9Ci0JCi0JCXB1YmxpYyBib29sZWFuIGlzRXZpbCgpIHsKLQkJCXJldHVybiB0aGlzLmV2aWw7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0RXZpbChib29sZWFuIGV2aWwpIHsKLQkJCWJvb2xlYW4gb2xkID0gdGhpcy5ldmlsOwotCQkJdGhpcy5ldmlsID0gZXZpbDsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChFVklMX1BST1BFUlRZLCBvbGQsIGV2aWwpOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgZ2V0UmFuaygpIHsKLQkJCXJldHVybiB0aGlzLnJhbms7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0UmFuayhpbnQgcmFuaykgewotCQkJaW50IG9sZCA9IHRoaXMucmFuazsKLQkJCXRoaXMucmFuayA9IHJhbms7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkFOS19QUk9QRVJUWSwgb2xkLCByYW5rKTsKLQkJfQotCQotCQlwdWJsaWMgaW50IGdldEFkdmVudHVyZUNvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuYWR2ZW50dXJlQ291bnQ7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0QWR2ZW50dXJlQ291bnQoaW50IGFkdmVudHVyZUNvdW50KSB7Ci0JCQlpbnQgb2xkID0gdGhpcy5hZHZlbnR1cmVDb3VudDsKLQkJCXRoaXMuYWR2ZW50dXJlQ291bnQgPSBhZHZlbnR1cmVDb3VudDsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBRFZFTlRVUkVfQ09VTlRfUFJPUEVSVFksIG9sZCwgYWR2ZW50dXJlQ291bnQpOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKFBlcnNvbiBwKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lLmNvbXBhcmVUb0lnbm9yZUNhc2UocC5uYW1lKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWUgKyAKLQkJCQkJCSJcdGJvcm46ICIgKyBEYXRlRm9ybWF0LmdldERhdGVJbnN0YW5jZSgpLmZvcm1hdCh0aGlzLmJpcnRoRGF0ZSkgKyAKLQkJCQkJCSJcdGdvbmUgd2VzdDogIiArIERhdGVGb3JtYXQuZ2V0RGF0ZUluc3RhbmNlKCkuZm9ybWF0KHRoaXMuZ29uZVdlc3REYXRlKSArIAotCQkJCQkJIlx0ZXllczogIiArIHRoaXMuZXllQ29sb3IgKyAKLQkJCQkJCSJcdGV2aWw6ICIgKyB0aGlzLmV2aWwgKyAKLQkJCQkJCSJcdHJhbms6ICIgKyB0aGlzLnJhbmsgKwotCQkJCQkJIlx0YWR2ZW50dXJlczogIiArIHRoaXMuYWR2ZW50dXJlQ291bnQKLQkJCTsKLQkJfQotCQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBUZXN0VGFibGVNb2RlbExpc3RlbmVyIGltcGxlbWVudHMgVGFibGVNb2RlbExpc3RlbmVyIHsKLQkJVGVzdFRhYmxlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UYWJsZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YTYxNGMuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93QWRhcHRlcjsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dFdmVudDsKLWltcG9ydCBqYXZhLmF3dC5ldmVudC5XaW5kb3dMaXN0ZW5lcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnN3aW5nLkFic3RyYWN0QWN0aW9uOwotaW1wb3J0IGphdmF4LnN3aW5nLkFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5CdXR0b25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5Db21ib0JveE1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkRlZmF1bHRMaXN0Q2VsbFJlbmRlcmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpCdXR0b247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkNoZWNrQm94OwotaW1wb3J0IGphdmF4LnN3aW5nLkpDb21ib0JveDsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSkxpc3Q7Ci1pbXBvcnQgamF2YXguc3dpbmcuSk9wdGlvblBhbmU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTcGlubmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUYWJsZTsKLWltcG9ydCBqYXZheC5zd2luZy5KVGV4dEZpZWxkOwotaW1wb3J0IGphdmF4LnN3aW5nLkxpc3RDZWxsUmVuZGVyZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuTGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IGphdmF4LnN3aW5nLlNwaW5uZXJNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy5VSU1hbmFnZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcuV2luZG93Q29uc3RhbnRzOwotaW1wb3J0IGphdmF4LnN3aW5nLmV2ZW50Lkxpc3RTZWxlY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5MaXN0U2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVDb2x1bW47Ci1pbXBvcnQgamF2YXguc3dpbmcudGFibGUuVGFibGVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50ZXh0LkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkNoZWNrQm94TW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5Db21ib0JveE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTGlzdE1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuQ2hlY2tCb3hUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3dpbmcuU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5UYWJsZUNlbGxFZGl0b3JBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLkNyb3dkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UYWJsZU1vZGVsQWRhcHRlclRlc3RzLlBlcnNvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVGFibGVNb2RlbEFkYXB0ZXJUZXN0cy5QZXJzb25Db2x1bW5BZGFwdGVyOwotCi0vKioKLSAqIGFuIGV4YW1wbGUgVUkgZm9yIHRlc3RpbmcgdGhlIFRhYmxlTW9kZWxBZGFwdGVyCi0gKiAJIm5hbWUiIGNvbHVtbiBpcyByZWFkLW9ubHkgdGV4dCBmaWVsZAotICogCSJiaXJ0aCBkYXRlIiBjb2x1bW4gaXMgZGF0ZSB0ZXh0IGZpZWxkCi0gKiAJImdvbmUgd2VzdCBkYXRlIiBjb2x1bW4gaXMgZGF0ZSBzcGlubmVyCi0gKiAJImV5ZSBjb2xvciIgY29sdW1uIGlzIGNvbWJvLWJveAotICogCSJldmlsIiBjb2x1bW4gaXMgY2hlY2sgYm94Ci0gKiAJInJhbmsiIGNvbHVtbiBpcyBudW1iZXIgdGV4dCBmaWVsZAotICogCSJhZHZlbnR1cmUgY291bnQiIGNvbHVtbiBpcyBudW1iZXIgc3Bpbm5lcgotICogCi0gKiBOb3RlIHRoYXQgdGhlIHRhYmxlIG1vZGVsIGFuZCByb3cgc2VsZWN0aW9uIG1vZGVsIHNoYXJlIHRoZSBzYW1lCi0gKiBsaXN0IHZhbHVlIG1vZGVsICh0aGUgc29ydGVkIHBlb3BsZSBhZGFwdGVyKQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCB7Ci0JcHJpdmF0ZSBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+IGV5ZUNvbG9yc0hvbGRlcjsgIC8vIE9iamVjdCBiZWNhdXNlIGl0IGFkYXB0cyB0byBhIGNvbWJvLWJveAotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3Jvd2Q+IGNyb3dkSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPiBzZWxlY3RlZFBlcnNvbkhvbGRlcjsKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gc29ydGVkUGVvcGxlQWRhcHRlcjsKLQlwcml2YXRlIFRhYmxlTW9kZWwgdGFibGVNb2RlbDsKLQlwcml2YXRlIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCByb3dTZWxlY3Rpb25Nb2RlbDsKLQlwcml2YXRlIEFjdGlvbiByZW1vdmVBY3Rpb247Ci0JcHJpdmF0ZSBBY3Rpb24gcmVuYW1lQWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW5ldyBUYWJsZU1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoYXJncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWMoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlVSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoVUlNYW5hZ2VyLmdldFN5c3RlbUxvb2tBbmRGZWVsQ2xhc3NOYW1lKCkpOwotCQl0aGlzLmV5ZUNvbG9yc0hvbGRlciA9IHRoaXMuIGJ1aWxkRXllQ29sb3JDb2xsZWN0aW9uSG9sZGVyKCk7Ci0JCXRoaXMuY3Jvd2RIb2xkZXIgPSB0aGlzLmJ1aWxkQ3Jvd2RIb2xkZXIoKTsKLQkJdGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciA9IHRoaXMuYnVpbGRTZWxlY3RlZFBlcnNvbkhvbGRlcigpOwotCQl0aGlzLnNvcnRlZFBlb3BsZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU29ydGVkUGVvcGxlQWRhcHRlcigpOwotCQl0aGlzLnRhYmxlTW9kZWwgPSB0aGlzLmJ1aWxkVGFibGVNb2RlbCgpOwotCQl0aGlzLnJvd1NlbGVjdGlvbk1vZGVsID0gdGhpcy5idWlsZFJvd1NlbGVjdGlvbk1vZGVsKCk7Ci0JCXRoaXMub3BlbldpbmRvdygpOwotCX0KLQotCXByaXZhdGUgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8T2JqZWN0PiBidWlsZEV5ZUNvbG9yQ29sbGVjdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxPYmplY3Q+KG5ldyBBcnJheUxpc3Q8T2JqZWN0PihQZXJzb24uZ2V0VmFsaWRFeWVDb2xvcnMoKSkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q3Jvd2Q+IGJ1aWxkQ3Jvd2RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPENyb3dkPih0aGlzLmJ1aWxkQ3Jvd2QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDcm93ZCBidWlsZENyb3dkKCkgewotCQlDcm93ZCBjcm93ZCA9IG5ldyBDcm93ZCgpOwotCi0JCVBlcnNvbiBwID0gY3Jvd2QuYWRkUGVyc29uKCJCaWxibyIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfQlJPV04pOwotCQlwLnNldFJhbmsoMjIpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXAgPSBjcm93ZC5hZGRQZXJzb24oIkdvbGx1bSIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfUElOSyk7Ci0JCXAuc2V0RXZpbCh0cnVlKTsKLQkJcC5zZXRSYW5rKDIpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDUwKTsKLQotCQlwID0gY3Jvd2QuYWRkUGVyc29uKCJGcm9kbyIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfQkxVRSk7Ci0JCXAuc2V0UmFuaygzNCk7Ci0JCXAuc2V0QWR2ZW50dXJlQ291bnQoMSk7Ci0KLQkJcCA9IGNyb3dkLmFkZFBlcnNvbigiU2Ftd2lzZSIpOwotCQlwLnNldEV5ZUNvbG9yKFBlcnNvbi5FWUVfQ09MT1JfR1JFRU4pOwotCQlwLnNldFJhbmsoMTkpOwotCQlwLnNldEFkdmVudHVyZUNvdW50KDEpOwotCi0JCXJldHVybiBjcm93ZDsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRTZWxlY3RlZFBlcnNvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc29uPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UGVyc29uPiBidWlsZFNvcnRlZFBlb3BsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFBlcnNvbj4odGhpcy5idWlsZFBlb3BsZU5hbWVBZGFwdGVyKCkpOwotCX0KLQotCS8vIHRoZSBsaXN0IHdpbGwgbmVlZCB0byBiZSByZS1zb3J0ZWQgaWYgYSBuYW1lIGNoYW5nZXMKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNvbj4gYnVpbGRQZW9wbGVOYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UGVyc29uPih0aGlzLmJ1aWxkUGVvcGxlQWRhcHRlcigpLCBQZXJzb24uTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzb24+IGJ1aWxkUGVvcGxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxDcm93ZCwgUGVyc29uPih0aGlzLmNyb3dkSG9sZGVyLCBDcm93ZC5QRU9QTEVfQ09MTEVDVElPTikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmF0b3I8UGVyc29uPiBpdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5wZW9wbGUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LnBlb3BsZVNpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlTW9kZWwgYnVpbGRUYWJsZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTW9kZWxBZGFwdGVyPFBlcnNvbj4odGhpcy5zb3J0ZWRQZW9wbGVBZGFwdGVyLCB0aGlzLmJ1aWxkQ29sdW1uQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUGVyc29uQ29sdW1uQWRhcHRlcigpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGJ1aWxkUm93U2VsZWN0aW9uTW9kZWwoKSB7Ci0JCU9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCByc20gPSBuZXcgT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsKG5ldyBMaXN0TW9kZWxBZGFwdGVyKHRoaXMuc29ydGVkUGVvcGxlQWRhcHRlcikpOwotCQlyc20uYWRkTGlzdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRSb3dTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJcnNtLnNldFNlbGVjdGlvbk1vZGUoTGlzdFNlbGVjdGlvbk1vZGVsLlNJTkdMRV9TRUxFQ1RJT04pOwotCQlyZXR1cm4gcnNtOwotCX0KLQotCXByaXZhdGUgTGlzdFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkUm93U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgdmFsdWVDaGFuZ2VkKExpc3RTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUuZ2V0VmFsdWVJc0FkanVzdGluZygpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yb3dTZWxlY3Rpb25DaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgcm93U2VsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgTGlzdFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCVBlcnNvbiBzZWxlY3Rpb24gPSAoUGVyc29uKSB0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQkJdGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlci5zZXRWYWx1ZShzZWxlY3Rpb24pOwotCQlib29sZWFuIHBlcnNvblNlbGVjdGVkID0gKHNlbGVjdGlvbiAhPSBudWxsKTsKLQkJdGhpcy5yZW1vdmVBY3Rpb24uc2V0RW5hYmxlZChwZXJzb25TZWxlY3RlZCk7Ci0JCXRoaXMucmVuYW1lQWN0aW9uLnNldEVuYWJsZWQocGVyc29uU2VsZWN0ZWQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldExvY2F0aW9uKDIwMCwgMjAwKTsKLQkJd2luZG93LnNldFNpemUoNjAwLCA0MDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVGFibGVQYW5lKCksIEJvcmRlckxheW91dC5DRU5URVIpOwotCQltYWluUGFuZWwuYWRkKHRoaXMuYnVpbGRDb250cm9sUGFuZWwoKSwgQm9yZGVyTGF5b3V0LlNPVVRIKTsKLQkJcmV0dXJuIG1haW5QYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZFRhYmxlUGFuZSgpIHsKLQkJcmV0dXJuIG5ldyBKU2Nyb2xsUGFuZSh0aGlzLmJ1aWxkVGFibGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKVGFibGUgYnVpbGRUYWJsZSgpIHsKLQkJSlRhYmxlIHRhYmxlID0gbmV3IEpUYWJsZSh0aGlzLnRhYmxlTW9kZWwpOwotCQl0YWJsZS5wdXRDbGllbnRQcm9wZXJ0eSgidGVybWluYXRlRWRpdE9uRm9jdXNMb3N0IiwgQm9vbGVhbi5UUlVFKTsJLy8gc2VlIEphdmEgYnVnIDUwMDc2NTIKLQkJdGFibGUuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy5yb3dTZWxlY3Rpb25Nb2RlbCk7Ci0JCXRhYmxlLnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQl0YWJsZS5zZXRBdXRvUmVzaXplTW9kZShKVGFibGUuQVVUT19SRVNJWkVfTkVYVF9DT0xVTU4pOwotCQlpbnQgcm93SGVpZ2h0ID0gMjA7CS8vIHN0YXJ0IHdpdGggbWluaW11bSBvZiAyMAotCi0JCS8vIGdvbmUgd2VzdCBjb2x1bW4gKHNwaW5uZXIpCi0JCVRhYmxlQ29sdW1uIGNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuR09ORV9XRVNUX0RBVEVfQ09MVU1OKTsKLQkJU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIHNwaW5uZXJSZW5kZXJlciA9IHRoaXMuYnVpbGREYXRlU3Bpbm5lclJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoc3Bpbm5lclJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIodGhpcy5idWlsZERhdGVTcGlubmVyUmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIHNwaW5uZXJSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJLy8gZXllIGNvbG9yIGNvbHVtbiAoY29tYm8tYm94KQotCQkvLyB0aGUgamRrIGNvbWJvLWJveCByZW5kZXJlciBsb29rcyBsaWtlIGEgdGV4dCBmaWVsZAotCQkvLyB1bnRpbCB0aGUgdXNlciBzdGFydHMgYW4gZWRpdCAtIHVzZSBhIGN1c3RvbSBvbmUKLQkJY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5FWUVfQ09MT1JfQ09MVU1OKTsKLQkJQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlciBleWVDb2xvclJlbmRlcmVyID0gdGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3hSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKGV5ZUNvbG9yUmVuZGVyZXIpOwotCQljb2x1bW4uc2V0Q2VsbEVkaXRvcihuZXcgVGFibGVDZWxsRWRpdG9yQWRhcHRlcih0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveFJlbmRlcmVyKCkpKTsKLQkJcm93SGVpZ2h0ID0gTWF0aC5tYXgocm93SGVpZ2h0LCBleWVDb2xvclJlbmRlcmVyLnByZWZlcnJlZEhlaWdodCgpKTsKLQotCQkvLyBldmlsIChjaGVjayBib3gpCi0JCS8vIHRoZSBqZGsgY2hlY2sgYm94IHJlbmRlcmVyIGFuZCBlZGl0b3Igc3VjayAtIHVzZSBhIGN1c3RvbSBvbmVzCi0JCWNvbHVtbiA9IHRhYmxlLmdldENvbHVtbk1vZGVsKCkuZ2V0Q29sdW1uKFBlcnNvbkNvbHVtbkFkYXB0ZXIuRVZJTF9DT0xVTU4pOwotCQlDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyIGV2aWxSZW5kZXJlciA9IG5ldyBDaGVja0JveFRhYmxlQ2VsbFJlbmRlcmVyKCk7Ci0JCWNvbHVtbi5zZXRDZWxsUmVuZGVyZXIoZXZpbFJlbmRlcmVyKTsKLQkJY29sdW1uLnNldENlbGxFZGl0b3IobmV3IFRhYmxlQ2VsbEVkaXRvckFkYXB0ZXIobmV3IENoZWNrQm94VGFibGVDZWxsUmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIGV2aWxSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJLy8gYWR2ZW50dXJlIGNvdW50IGNvbHVtbiAoc3Bpbm5lcikKLQkJY29sdW1uID0gdGFibGUuZ2V0Q29sdW1uTW9kZWwoKS5nZXRDb2x1bW4oUGVyc29uQ29sdW1uQWRhcHRlci5BRFZFTlRVUkVfQ09VTlRfQ09MVU1OKTsKLQkJc3Bpbm5lclJlbmRlcmVyID0gdGhpcy5idWlsZE51bWJlclNwaW5uZXJSZW5kZXJlcigpOwotCQljb2x1bW4uc2V0Q2VsbFJlbmRlcmVyKHNwaW5uZXJSZW5kZXJlcik7Ci0JCWNvbHVtbi5zZXRDZWxsRWRpdG9yKG5ldyBUYWJsZUNlbGxFZGl0b3JBZGFwdGVyKHRoaXMuYnVpbGROdW1iZXJTcGlubmVyUmVuZGVyZXIoKSkpOwotCQlyb3dIZWlnaHQgPSBNYXRoLm1heChyb3dIZWlnaHQsIHNwaW5uZXJSZW5kZXJlci5wcmVmZXJyZWRIZWlnaHQoKSk7Ci0KLQkJdGFibGUuc2V0Um93SGVpZ2h0KHJvd0hlaWdodCk7Ci0JCXJldHVybiB0YWJsZTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlciBidWlsZERhdGVTcGlubmVyUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyKG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcihuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKSkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lclRhYmxlQ2VsbFJlbmRlcmVyIGJ1aWxkTnVtYmVyU3Bpbm5lclJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IFNwaW5uZXJUYWJsZUNlbGxSZW5kZXJlcihuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcihuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4oKSkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hUYWJsZUNlbGxSZW5kZXJlciBidWlsZEV5ZUNvbG9yQ29tYm9Cb3hSZW5kZXJlcigpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveFRhYmxlQ2VsbFJlbmRlcmVyKHRoaXMuYnVpbGRSZWFkT25seUV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpLCB0aGlzLmJ1aWxkRXllQ29sb3JSZW5kZXJlcigpKTsKLQl9Ci0KLQlwcml2YXRlIENvbWJvQm94TW9kZWwgYnVpbGRSZWFkT25seUV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmV5ZUNvbG9yc0hvbGRlciwgbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+KCkpOwotCX0KLQotCXByaXZhdGUgTGlzdENlbGxSZW5kZXJlciBidWlsZEV5ZUNvbG9yUmVuZGVyZXIoKSB7Ci0JCXJldHVybiBuZXcgRXllQ29sb3JSZW5kZXJlcigpOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgwLCAxKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEJ1dHRvblBhbmVsKCkpOwotCQljb250cm9sUGFuZWwuYWRkKHRoaXMuYnVpbGRQZXJzb25QYW5lbCgpKTsKLQkJcmV0dXJuIGNvbnRyb2xQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZEJ1dHRvblBhbmVsKCkgewotCQlKUGFuZWwgYnV0dG9uUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRCdXR0b24oKSk7Ci0JCWJ1dHRvblBhbmVsLmFkZCh0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKCkpOwotCQlidXR0b25QYW5lbC5hZGQodGhpcy5idWlsZFJlbmFtZUJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRFeWVDb2xvckJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRQcmludEJ1dHRvbigpKTsKLQkJYnV0dG9uUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldEJ1dHRvbigpKTsKLQkJcmV0dXJuIGJ1dHRvblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkUGVyc29uUGFuZWwoKSB7Ci0JCUpQYW5lbCBwZXJzb25QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEdyaWRMYXlvdXQoMSwgMCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZE5hbWVUZXh0RmllbGQoKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkQmlydGhEYXRlU3Bpbm5lcigpKTsKLQkJcGVyc29uUGFuZWwuYWRkKHRoaXMuYnVpbGRHb25lV2VzdERhdGVTcGlubmVyKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEV5ZUNvbG9yQ29tYm9Cb3goKSk7Ci0JCXBlcnNvblBhbmVsLmFkZCh0aGlzLmJ1aWxkRXZpbENoZWNrQm94KCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZFJhbmtTcGlubmVyKCkpOwotCQlwZXJzb25QYW5lbC5hZGQodGhpcy5idWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lcigpKTsKLQkJcmV0dXJuIHBlcnNvblBhbmVsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhZGQgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRBZGRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRBZGRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRhYmxlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkUGVyc29uKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgYWRkUGVyc29uKCkgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZUZyb21Vc2VyKCk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U2VsZWN0ZWRQZXJzb24odGhpcy5jcm93ZCgpLmFkZFBlcnNvbihuYW1lKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVtb3ZlIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW1vdmVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVtb3ZlQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVtb3ZlQWN0aW9uKCkgewotCQl0aGlzLnJlbW92ZUFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVtb3ZlIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW1vdmVQZXJzb24oKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5yZW1vdmVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJldHVybiB0aGlzLnJlbW92ZUFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlbW92ZVBlcnNvbigpIHsKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuc2VsZWN0ZWRQZXJzb24oKTsKLQkJaWYgKHBlcnNvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLmNyb3dkKCkucmVtb3ZlUGVyc29uKHBlcnNvbik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVuYW1lIGJ1dHRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIEpCdXR0b24gYnVpbGRSZW5hbWVCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVuYW1lQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVuYW1lQWN0aW9uKCkgewotCQl0aGlzLnJlbmFtZUFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVuYW1lIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW5hbWVQZXJzb24oKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5yZW5hbWVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXJldHVybiB0aGlzLnJlbmFtZUFjdGlvbjsKLQl9Ci0KLQl2b2lkIHJlbmFtZVBlcnNvbigpIHsKLQkJUGVyc29uIHBlcnNvbiA9IHRoaXMuc2VsZWN0ZWRQZXJzb24oKTsKLQkJaWYgKHBlcnNvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHRoaXMucHJvbXB0VXNlckZvck5hbWUocGVyc29uLmdldE5hbWUoKSk7Ci0JCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJcGVyc29uLnNldE5hbWUobmFtZSk7Ci0JCQkJdGhpcy5zZXRTZWxlY3RlZFBlcnNvbihwZXJzb24pOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkZCBleWUgY29sb3IgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZEFkZEV5ZUNvbG9yQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZEFkZEV5ZUNvbG9yQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkRXllQ29sb3JBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImFkZCBleWUgY29sb3IiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmFkZEV5ZUNvbG9yKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgYWRkRXllQ29sb3IoKSB7Ci0JCVN0cmluZyBjb2xvciA9IHRoaXMucHJvbXB0VXNlckZvckV5ZUNvbG9yKCk7Ci0JCWlmIChjb2xvciAhPSBudWxsKSB7Ci0JCQl0aGlzLmV5ZUNvbG9yc0hvbGRlci5hZGQoY29sb3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvbXB0VXNlckZvckV5ZUNvbG9yKCkgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIGV5ZUNvbG9yID0gSk9wdGlvblBhbmUuc2hvd0lucHV0RGlhbG9nKCJFeWUgQ29sb3IiKTsKLQkJCWlmIChleWVDb2xvciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyB1c2VyIHByZXNzZWQgPENhbmNlbD4KLQkJCX0KLQkJCWlmICgoZXllQ29sb3IubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIGV5ZSBjb2xvciBpcyByZXF1aXJlZC4iLCAiSW52YWxpZCBFeWUgQ29sb3IiLCBKT3B0aW9uUGFuZS5FUlJPUl9NRVNTQUdFKTsKLQkJCX0gZWxzZSBpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZXllQ29sb3JzSG9sZGVyLml0ZXJhdG9yKCksIGV5ZUNvbG9yKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgZXllIGNvbG9yIGFscmVhZHkgZXhpc3RzLiIsICJJbnZhbGlkIEV5ZSBDb2xvciIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZXllQ29sb3I7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbnQgYnV0dG9uICoqKioqKioqKioKLQotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFByaW50QnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFByaW50QWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUHJpbnRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInByaW50IikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFibGVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5wcmludENyb3dkKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcHJpbnRDcm93ZCgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRoaXMuY3Jvd2QoKSk7Ci0JCWZvciAoSXRlcmF0b3I8UGVyc29uPiBzdHJlYW0gPSB0aGlzLmNyb3dkKCkucGVvcGxlKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNldCBidXR0b24gKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVzZXRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkUmVzZXRBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZXNldEFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVzZXQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUYWJsZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0KCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCXZvaWQgcmVzZXQoKSB7Ci0JCXRoaXMuY3Jvd2RIb2xkZXIuc2V0VmFsdWUodGhpcy5idWlsZENyb3dkKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuZXcgbmFtZSBkaWFsb2cgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZUZyb21Vc2VyKCkgewotCQlyZXR1cm4gdGhpcy5wcm9tcHRVc2VyRm9yTmFtZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9tcHRVc2VyRm9yTmFtZShAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU3RyaW5nIG9yaWdpbmFsTmFtZSkgewotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIG5hbWUgPSBKT3B0aW9uUGFuZS5zaG93SW5wdXREaWFsb2coIlBlcnNvbiBOYW1lIik7Ci0JCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyB1c2VyIHByZXNzZWQgPENhbmNlbD4KLQkJCX0KLQkJCWlmICgobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJCUpPcHRpb25QYW5lLnNob3dNZXNzYWdlRGlhbG9nKG51bGwsICJUaGUgbmFtZSBpcyByZXF1aXJlZC4iLCAiSW52YWxpZCBOYW1lIiwgSk9wdGlvblBhbmUuRVJST1JfTUVTU0FHRSk7Ci0JCQl9IGVsc2UgaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNyb3dkKCkucGVvcGxlTmFtZXMoKSwgbmFtZSkpIHsKLQkJCQlKT3B0aW9uUGFuZS5zaG93TWVzc2FnZURpYWxvZyhudWxsLCAiVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMuIiwgIkludmFsaWQgTmFtZSIsIEpPcHRpb25QYW5lLkVSUk9SX01FU1NBR0UpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lIHRleHQgZmllbGQgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGROYW1lVGV4dEZpZWxkKCkgewotCQlKVGV4dEZpZWxkIHRleHRGaWVsZCA9IG5ldyBKVGV4dEZpZWxkKHRoaXMuYnVpbGROYW1lRG9jdW1lbnQoKSwgbnVsbCwgMCk7Ci0JCXRleHRGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCXJldHVybiB0ZXh0RmllbGQ7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudCBidWlsZE5hbWVEb2N1bWVudCgpIHsKLQkJcmV0dXJuIG5ldyBEb2N1bWVudEFkYXB0ZXIodGhpcy5idWlsZE5hbWVBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIFN0cmluZz4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmlydGggZGF0ZSBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRCaXJ0aERhdGVTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTcGlubmVyTW9kZWwgYnVpbGRCaXJ0aERhdGVTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGF0ZVNwaW5uZXJNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEJpcnRoRGF0ZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPYmplY3Q+IGJ1aWxkQmlydGhEYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBPYmplY3Q+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5CSVJUSF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QmlydGhEYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0QmlydGhEYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdvbmUgd2VzdCBkYXRlIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXJNb2RlbCgpKTsKLQl9Ci0KLQlwcml2YXRlIFNwaW5uZXJNb2RlbCBidWlsZEdvbmVXZXN0RGF0ZVNwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBEYXRlU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkR29uZVdlc3REYXRlQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRHb25lV2VzdERhdGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzb24sIE9iamVjdD4odGhpcy5zZWxlY3RlZFBlcnNvbkhvbGRlciwgUGVyc29uLkdPTkVfV0VTVF9EQVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEYXRlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R29uZVdlc3REYXRlKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhPYmplY3QgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0R29uZVdlc3REYXRlKChEYXRlKSB2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV5ZSBjb2xvciBjb21iby1ib3ggKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQ29tYm9Cb3ggYnVpbGRFeWVDb2xvckNvbWJvQm94KCkgewotCQlyZXR1cm4gbmV3IEpDb21ib0JveCh0aGlzLmJ1aWxkRXllQ29sb3JDb21ib0JveE1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgQ29tYm9Cb3hNb2RlbCBidWlsZEV5ZUNvbG9yQ29tYm9Cb3hNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb21ib0JveE1vZGVsQWRhcHRlcih0aGlzLmV5ZUNvbG9yc0hvbGRlciwgdGhpcy5idWlsZEV5ZUNvbG9yQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4gYnVpbGRFeWVDb2xvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNvbiwgT2JqZWN0Pih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uRVlFX0NPTE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPYmplY3QgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRFeWVDb2xvcigpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oT2JqZWN0IHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV5ZUNvbG9yKChTdHJpbmcpIHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXZpbCBjaGVjayBib3ggKioqKioqKioqKgotCi0JcHJpdmF0ZSBKQ2hlY2tCb3ggYnVpbGRFdmlsQ2hlY2tCb3goKSB7Ci0JCUpDaGVja0JveCBjaGVja0JveCA9IG5ldyBKQ2hlY2tCb3goKTsKLQkJY2hlY2tCb3guc2V0VGV4dCgiZXZpbCIpOwotCQljaGVja0JveC5zZXRNb2RlbCh0aGlzLmJ1aWxkRXZpbENoZWNrQm94TW9kZWwoKSk7Ci0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbk1vZGVsIGJ1aWxkRXZpbENoZWNrQm94TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ2hlY2tCb3hNb2RlbEFkYXB0ZXIodGhpcy5idWlsZEV2aWxBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFdmlsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBCb29sZWFuPih0aGlzLnNlbGVjdGVkUGVyc29uSG9sZGVyLCBQZXJzb24uRVZJTF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0V2aWwoKSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV2aWwodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiByYW5rIHNwaW5uZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBKU3Bpbm5lciBidWlsZFJhbmtTcGlubmVyKCkgewotCQlyZXR1cm4gbmV3IEpTcGlubmVyKHRoaXMuYnVpbGRSYW5rU3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkUmFua1NwaW5uZXJNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBOdW1iZXJTcGlubmVyTW9kZWxBZGFwdGVyKHRoaXMuYnVpbGRSYW5rQWRhcHRlcigpKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE51bWJlcj4gYnVpbGRSYW5rQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBOdW1iZXI+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5SQU5LX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOdW1iZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKHRoaXMuc3ViamVjdC5nZXRSYW5rKCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oTnVtYmVyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFJhbmsodmFsdWUuaW50VmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFkdmVudHVyZSBjb3VudCBzcGlubmVyICoqKioqKioqKioKLQotCXByaXZhdGUgSlNwaW5uZXIgYnVpbGRBZHZlbnR1cmVDb3VudFNwaW5uZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNwaW5uZXIodGhpcy5idWlsZEFkdmVudHVyZUNvdW50U3Bpbm5lck1vZGVsKCkpOwotCX0KLQotCXByaXZhdGUgU3Bpbm5lck1vZGVsIGJ1aWxkQWR2ZW50dXJlQ291bnRTcGlubmVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgTnVtYmVyU3Bpbm5lck1vZGVsQWRhcHRlcih0aGlzLmJ1aWxkQWR2ZW50dXJlQ291bnRBZGFwdGVyKCkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TnVtYmVyPiBidWlsZEFkdmVudHVyZUNvdW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc29uLCBOdW1iZXI+KHRoaXMuc2VsZWN0ZWRQZXJzb25Ib2xkZXIsIFBlcnNvbi5BRFZFTlRVUkVfQ09VTlRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE51bWJlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIodGhpcy5zdWJqZWN0LmdldEFkdmVudHVyZUNvdW50KCkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oTnVtYmVyIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEFkdmVudHVyZUNvdW50KHZhbHVlLmludFZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXByaXZhdGUgQ3Jvd2QgY3Jvd2QoKSB7Ci0JCXJldHVybiB0aGlzLmNyb3dkSG9sZGVyLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBQZXJzb24gc2VsZWN0ZWRQZXJzb24oKSB7Ci0JCWlmICh0aGlzLnJvd1NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChQZXJzb24pIHRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFBlcnNvbihQZXJzb24gcGVyc29uKSB7Ci0JCXRoaXMucm93U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShwZXJzb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b20gcmVuZGVyZXIgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoaXMgaXMgc2ltcGx5IGFuIGV4YW1wbGUgb2YgYSByZW5kZXJlciBmb3IgdGhlIGVtYmVkZGVkIGNvbWJvLWJveC4KLQkgKiBJdCBkb2VzIG5vdGhpbmcgc3BlY2lhbCB1bmxlc3MgeW91IHVuY29tbWVudCB0aGUgY29kZSBiZWxvdy4uLi4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEV5ZUNvbG9yUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0TGlzdENlbGxSZW5kZXJlciB7Ci0JCUV5ZUNvbG9yUmVuZGVyZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29tcG9uZW50IGdldExpc3RDZWxsUmVuZGVyZXJDb21wb25lbnQoSkxpc3QgbGlzdCwgT2JqZWN0IHZhbHVlLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNTZWxlY3RlZCwgYm9vbGVhbiBjZWxsSGFzRm9jdXMpIHsKLQkJCS8vIGp1c3QgZG8gc29tZXRoaW5nIHRvIHNob3cgdGhlIHJlbmRlcmVyIGlzIHdvcmtpbmcuLi4KLQkvLwkJdmFsdWUgPSAiPiIgKyB2YWx1ZTsKLQkJCXJldHVybiBzdXBlci5nZXRMaXN0Q2VsbFJlbmRlcmVyQ29tcG9uZW50KGxpc3QsIHZhbHVlLCBpbmRleCwgaXNTZWxlY3RlZCwgY2VsbEhhc0ZvY3VzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL21vZGVsL3ZhbHVlL3N3aW5nL1RyZWVNb2RlbEFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2Q2YWMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZzsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgamF2YXguc3dpbmcuSWNvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KVHJlZTsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxFdmVudDsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5JbmRlbnRpbmdQcmludFdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZWFkT25seUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5BYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTnVsbExpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zd2luZy5EaXNwbGF5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuVHJlZU5vZGVWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJlZU1vZGVsQWRhcHRlclRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCWJvb2xlYW4gZXZlbnRGaXJlZDsKLQotCXB1YmxpYyBUcmVlTW9kZWxBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJvb3QoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJyb290Iiwgcm9vdC5nZXROYW1lKCkpOwotLy8JCXJvb3QuZHVtcCgpOwotLy8JCXJvb3ROb2RlLmR1bXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGQoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQotCQlUZXN0Tm9kZSBleHBlY3RlZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0Tm9kZSBhY3R1YWwgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRDaGlsZChyb290Tm9kZSwgMSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQotCQlleHBlY3RlZCA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQlhY3R1YWwgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRDaGlsZChyb290Tm9kZSwgMik7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hpbGRDb3VudCgpIHsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRTb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdHJlZU1vZGVsLmFkZFRyZWVNb2RlbExpc3RlbmVyKG5ldyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIoKSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCi0JCWFzc2VydEVxdWFscyg1LCB0cmVlTW9kZWwuZ2V0Q2hpbGRDb3VudChyb290Tm9kZSkpOwotCi0JCVRlc3ROb2RlIG5vZGUgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRyZWVNb2RlbC5nZXRDaGlsZENvdW50KG5vZGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5kZXhPZkNoaWxkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFNvcnRlZFRyZWVNb2RlbCgpOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpKTsKLQkJVGVzdE5vZGUgcm9vdE5vZGUgPSAoVGVzdE5vZGUpIHRyZWVNb2RlbC5nZXRSb290KCk7Ci0KLQkJVGVzdE5vZGUgY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDAiKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0KLQkJY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDEiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0KLQkJY2hpbGQgPSByb290Tm9kZS5jaGlsZE5hbWVkKCJub2RlIDIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRyZWVNb2RlbC5nZXRJbmRleE9mQ2hpbGQocm9vdE5vZGUsIGNoaWxkKSk7Ci0JCVRlc3ROb2RlIGdyYW5kY2hpbGQgPSBjaGlsZC5jaGlsZE5hbWVkKCJub2RlIDIuMiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgdHJlZU1vZGVsLmdldEluZGV4T2ZDaGlsZChjaGlsZCwgZ3JhbmRjaGlsZCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0xlYWYoKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJYXNzZXJ0RmFsc2UodHJlZU1vZGVsLmlzTGVhZihyb290Tm9kZSkpOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCWFzc2VydEZhbHNlKHRyZWVNb2RlbC5pc0xlYWYobm9kZSkpOwotCQlub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAzIik7Ci0JCWFzc2VydFRydWUodHJlZU1vZGVsLmlzTGVhZihub2RlKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzQ2hhbmdlZCgpIHsKLQkJLy8gdGhlIG9ubHkgd2F5IHRvIHRyaWdnZXIgYSAibm9kZSBjaGFuZ2VkIiBldmVudCBpcyB0byB1c2UgYW4gdW5zb3J0ZWQgdHJlZTsKLQkJLy8gYSBzb3J0ZWQgdHJlZSB3aWxsIHdpbGwgdHJpZ2dlciBvbmx5ICJub2RlIHJlbW92ZWQiIGFuZCAibm9kZSBpbnNlcnRlZCIgZXZlbnRzCi0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNDaGFuZ2VkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVGVzdHMudGhpcy5ldmVudEZpcmVkID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCVRlc3ROb2RlIHJvb3ROb2RlID0gKFRlc3ROb2RlKSB0cmVlTW9kZWwuZ2V0Um9vdCgpOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCVRlc3RNb2RlbCB0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLnNldE5hbWUoIm5vZGUgMSsrIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJbm9kZSA9IG5vZGUuY2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5zZXROYW1lKCJub2RlIDEuMSsrIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJlZU5vZGVzSW5zZXJ0ZWQoKSB7Ci0JCS8vIHVzZSBhbiB1bnNvcnRlZCB0cmVlIHNvIHRoZSBub2RlcyBhcmUgbm90IHJlLXNodWZmbGVkLi4uCi0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkVW5zb3J0ZWRUcmVlTW9kZWwoKTsKLQkJdGhpcy5ldmVudEZpcmVkID0gZmFsc2U7Ci0JCXRyZWVNb2RlbC5hZGRUcmVlTW9kZWxMaXN0ZW5lcihuZXcgVGVzdFRyZWVNb2RlbExpc3RlbmVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNJbnNlcnRlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE5vZGUgbm9kZSA9IHJvb3ROb2RlLmNoaWxkTmFtZWQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5hZGRDaGlsZCgibmV3IGNoaWxkLi4uIik7Ci0JCWFzc2VydFRydWUodGhpcy5ldmVudEZpcmVkKTsKLQotCQl0aGlzLmV2ZW50RmlyZWQgPSBmYWxzZTsKLQkJbm9kZSA9IG5vZGUuY2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJdG0gPSBub2RlLmdldFRlc3RNb2RlbCgpOwotCQl0bS5hZGRDaGlsZCgiYW5vdGhlciBuZXcgY2hpbGQuLi4iKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUcmVlTm9kZXNSZW1vdmVkKCkgewotCQlUcmVlTW9kZWwgdHJlZU1vZGVsID0gdGhpcy5idWlsZFVuc29ydGVkVHJlZU1vZGVsKCk7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJcm9vdC5yZW1vdmVDaGlsZChyb290LmNoaWxkTmFtZWQoIm5vZGUgMyIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmV2ZW50RmlyZWQpOwotCi0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQlUZXN0Tm9kZSBub2RlID0gcm9vdE5vZGUuY2hpbGROYW1lZCgibm9kZSAyIik7Ci0JCVRlc3RNb2RlbCB0bSA9IG5vZGUuZ2V0VGVzdE1vZGVsKCk7Ci0JCXRtLnJlbW92ZUNoaWxkKHRtLmNoaWxkTmFtZWQoIm5vZGUgMi4yIikpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyZWVTdHJ1Y3R1cmVDaGFuZ2VkKCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gbm9kZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQkJVHJlZU1vZGVsIHRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwobm9kZUhvbGRlcik7Ci0JCXRoaXMuZXZlbnRGaXJlZCA9IGZhbHNlOwotCQl0cmVlTW9kZWwuYWRkVHJlZU1vZGVsTGlzdGVuZXIobmV3IFRlc3RUcmVlTW9kZWxMaXN0ZW5lcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzSW5zZXJ0ZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgdHJlZU5vZGVzUmVtb3ZlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclRlc3RzLnRoaXMuZXZlbnRGaXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0pOwotCQlub2RlSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuZXZlbnRGaXJlZCk7Ci0JfQotCi0JLyoqCi0JICogdGVzdCBhIHByb2JsZW0gd2UgaGFkIHdoZXJlIHJlbW92aW5nIGEgY2hpbGQgZnJvbSBhIHRyZWUgd291bGQgY2F1c2UKLQkgKiB0aGUgSlRyZWUgdG8gY2FsbCAjZXF1YWxzKE9iamVjdCkgb24gZWFjaCBub2RlIHJlbW92ZWQgKGFjdHVhbGx5LCBpdCB3YXMKLQkgKiBUcmVlUGF0aCwgYnV0IHRoYXQgd2FzIGJlY2F1c2UgaXRzIG93biAjZXF1YWxzKE9iamVjdCkgd2FzIGNhbGxlZCBieQotCSAqIEpUcmVlKTsgYW5kIHNpbmNlIHdlIGhhZCBhbHJlYWR5IHJlbW92ZWQgdGhlIGxhc3QgbGlzdGVuZXIgZnJvbSB0aGUKLQkgKiBhc3BlY3QgYWRhcHRlciwgdGhlIGFzcGVjdCBhZGFwdGVyIHdvdWxkIHNheSBpdHMgdmFsdWUgd2FzIG51bGw7IHRoaXMKLQkgKiB3b3VsZCBjYXVzZSBhIE5QRSB1bnRpbCB3ZSB0d2Vha2VkIFRyZWVNb2RlbEFkYXB0ZXIgdG8gcmVtb3ZlIGl0cwotCSAqIGxpc3RlbmVycyBmcm9tIGEgbm9kZSBvbmx5ICphZnRlciogdGhlIG5vZGUgaGFkIGJlZW4gY29tcGxldGVseQotCSAqIHJlbW92ZWQgZnJvbSB0aGUgSlRyZWUKLQkgKiBAc2VlIFRyZWVNb2RlbEFkYXB0ZXIjcmVtb3ZlTm9kZShPYmplY3RbXSwgaW50LCBUcmVlTm9kZVZhbHVlTW9kZWwpCi0JICogQHNlZSBUcmVlTW9kZWxBZGFwdGVyI2FkZE5vZGUoT2JqZWN0W10sIGludCwgVHJlZU5vZGVWYWx1ZU1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RMYXp5SW5pdGlhbGl6YXRpb24oKSB7Ci0JCVRyZWVNb2RlbCB0cmVlTW9kZWwgPSB0aGlzLmJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpOwotCQlKVHJlZSBqVHJlZSA9IG5ldyBKVHJlZSh0cmVlTW9kZWwpOwotCQlUZXN0Tm9kZSByb290Tm9kZSA9IChUZXN0Tm9kZSkgdHJlZU1vZGVsLmdldFJvb3QoKTsKLQkJVGVzdE1vZGVsIHJvb3QgPSByb290Tm9kZS5nZXRUZXN0TW9kZWwoKTsKLQkJLy8gdGhpcyB3b3VsZCBjYXVzZSBhIE5QRToKLQkJcm9vdC5yZW1vdmVDaGlsZChyb290LmNoaWxkTmFtZWQoIm5vZGUgMyIpKTsKLQkJYXNzZXJ0RXF1YWxzKHRyZWVNb2RlbCwgalRyZWUuZ2V0TW9kZWwoKSk7Ci0JfQotCi0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFNvcnRlZFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNvcnRlZFJvb3ROb2RlKCkpOwotCX0KLQotCXByaXZhdGUgVGVzdE5vZGUgYnVpbGRTb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbCBidWlsZFVuc29ydGVkVHJlZU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyZWVNb2RlbCh0aGlzLmJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkVW5zb3J0ZWRSb290Tm9kZSgpIHsKLQkJcmV0dXJuIG5ldyBVbnNvcnRlZFRlc3ROb2RlKHRoaXMuYnVpbGRSb290KCkpOwotCX0KLQotCXByaXZhdGUgVHJlZU1vZGVsIGJ1aWxkU3BlY2lhbFRyZWVNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUcmVlTW9kZWwodGhpcy5idWlsZFNwZWNpYWxSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU3BlY2lhbFJvb3ROb2RlKCkgewotCQlyZXR1cm4gbmV3IFNwZWNpYWxUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RNb2RlbCByb290ID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCQkvKk5vZGUgbm9kZV8wID0gKi9yb290LmFkZENoaWxkKCJub2RlIDAiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMSA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8xXzEgPSBub2RlXzEuYWRkQ2hpbGQoIm5vZGUgMS4xIik7Ci0JCS8qTm9kZSBub2RlXzFfMV8xID0gKi9ub2RlXzFfMS5hZGRDaGlsZCgibm9kZSAxLjEuMSIpOwotCQlUZXN0TW9kZWwgbm9kZV8yID0gcm9vdC5hZGRDaGlsZCgibm9kZSAyIik7Ci0JCS8qTm9kZSBub2RlXzJfMCA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMCIpOwotCQkvKk5vZGUgbm9kZV8yXzEgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjEiKTsKLQkJLypOb2RlIG5vZGVfMl8yID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMyA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMyIpOwotCQkvKk5vZGUgbm9kZV8yXzQgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjQiKTsKLQkJLypOb2RlIG5vZGVfMl81ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi41Iik7Ci0JCS8qTm9kZSBub2RlXzMgPSAqL3Jvb3QuYWRkQ2hpbGQoIm5vZGUgMyIpOwotCQkvKk5vZGUgbm9kZV80ID0gKi9yb290LmFkZENoaWxkKCJub2RlIDQiKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgYSB0eXBpY2FsIG1vZGVsIGNsYXNzIHdpdGggdGhlIHR5cGljYWwgY2hhbmdlIG5vdGlmaWNhdGlvbnMKLQkgKiBmb3IgI25hbWUgYW5kICNjaGlsZHJlbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNb2RlbCBleHRlbmRzIEFic3RyYWN0TW9kZWwgewotCi0JCS8vIHRoZSAgcGFyZW50IGlzIGltbXV0YWJsZTsgdGhlIHJvb3QncyBwYXJlbnQgaXMgbnVsbAotCQlwcml2YXRlIGZpbmFsIFRlc3RNb2RlbCBwYXJlbnQ7Ci0KLQkJLy8gdGhlIG5hbWUgaXMgbXV0YWJsZTsgc28gSSBndWVzcyBpdCBpc24ndCB0aGUgInByaW1hcnkga2V5IiA6LSkKLQkJcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFRlc3RNb2RlbD4gY2hpbGRyZW47Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTl9DT0xMRUNUSU9OID0gImNoaWxkcmVuIjsKLQotCi0JCXB1YmxpYyBUZXN0TW9kZWwoU3RyaW5nIG5hbWUpIHsJLy8gcm9vdCBjdG9yCi0JCQl0aGlzKG51bGwsIG5hbWUpOwotCQl9Ci0JCXByaXZhdGUgVGVzdE1vZGVsKFRlc3RNb2RlbCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5jaGlsZHJlbiA9IG5ldyBIYXNoQmFnPFRlc3RNb2RlbD4oKTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yPFRlc3RNb2RlbD4gY2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IFJlYWRPbmx5SXRlcmF0b3I8VGVzdE1vZGVsPih0aGlzLmNoaWxkcmVuKTsKLQkJfQotCQlwdWJsaWMgaW50IGNoaWxkcmVuU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLmNoaWxkcmVuLnNpemUoKTsKLQkJfQotCQlwdWJsaWMgVGVzdE1vZGVsIGFkZENoaWxkKFN0cmluZyBjaGlsZE5hbWUpIHsKLQkJCVRlc3RNb2RlbCBjaGlsZCA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lKTsKLQkJCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihjaGlsZCwgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCQlyZXR1cm4gY2hpbGQ7Ci0JCX0KLQkJcHVibGljIFRlc3RNb2RlbFtdIGFkZENoaWxkcmVuKFN0cmluZ1tdIGNoaWxkTmFtZXMpIHsKLQkJCVRlc3RNb2RlbFtdIG5ld0NoaWxkcmVuID0gbmV3IFRlc3RNb2RlbFtjaGlsZE5hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQluZXdDaGlsZHJlbltpXSA9IG5ldyBUZXN0TW9kZWwodGhpcywgY2hpbGROYW1lc1tpXSk7Ci0JCQl9Ci0JCQl0aGlzLmFkZEl0ZW1zVG9Db2xsZWN0aW9uKG5ld0NoaWxkcmVuLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiBuZXdDaGlsZHJlbjsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZChUZXN0TW9kZWwgY2hpbGQpIHsKLQkJCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGNoaWxkLCB0aGlzLmNoaWxkcmVuLCBDSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZHJlbihUZXN0TW9kZWxbXSB0ZXN0TW9kZWxzKSB7Ci0JCQl0aGlzLnJlbW92ZUl0ZW1zRnJvbUNvbGxlY3Rpb24odGVzdE1vZGVscywgdGhpcy5jaGlsZHJlbiwgQ0hJTERSRU5fQ09MTEVDVElPTik7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXJDaGlsZHJlbigpIHsKLQkJCXRoaXMuY2xlYXJDb2xsZWN0aW9uKHRoaXMuY2hpbGRyZW4sIENISUxEUkVOX0NPTExFQ1RJT04pOwotCQl9Ci0JCXB1YmxpYyBUZXN0TW9kZWwgY2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQlpZiAoY2hpbGQuZ2V0TmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKSB7Ci0JCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiY2hpbGQgbm90IGZvdW5kOiAiICsgY2hpbGROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZHVtcFN0cmluZygpIHsKLQkJCVN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQkJCUluZGVudGluZ1ByaW50V3JpdGVyIGlwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihzdyk7Ci0JCQl0aGlzLmR1bXBPbihpcHcpOwotCQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcE9uKEluZGVudGluZ1ByaW50V3JpdGVyIHdyaXRlcikgewotCQkJd3JpdGVyLnByaW50bG4odGhpcyk7Ci0JCQl3cml0ZXIuaW5kZW50KCk7Ci0JCQlmb3IgKFRlc3RNb2RlbCBjaGlsZCA6IHRoaXMuY2hpbGRyZW4pIHsKLQkJCQljaGlsZC5kdW1wT24od3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci51bmRlbnQoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkdW1wT24oT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKSk7Ci0JCQl0aGlzLmR1bXBPbih3cml0ZXIpOwotCQkJd3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgZHVtcCgpIHsKLQkJCXRoaXMuZHVtcE9uKFN5c3RlbS5vdXQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLm5hbWUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgTm9kZSB3cmFwcyBhIFRlc3RNb2RlbCBhbmQgY29udmVydHMgaW50byBzb21ldGhpbmcgdGhhdCBjYW4KLQkgKiBiZSB1c2VkIGJ5IFRyZWVNb2RlbEFkYXB0ZXIuIEl0IGNvbnZlcnRzIGNoYW5nZXMgdG8gdGhlIFRlc3RNb2RlbCdzCi0JICogbmFtZSBpbnRvICJzdGF0ZSBjaGFuZ2VzIiB0byB0aGUgTm9kZTsgYW5kIGNvbnZlcnRzIHRoZQotCSAqIFRlc3RNb2RlbCdzIGNoaWxkcmVuIGludG8gYSBMaXN0VmFsdWVNb2RlbCBvZiBOb2RlcyB3aG9zZSBvcmRlciBpcwotCSAqIGRldGVybWluZWQgYnkgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgVGVzdE5vZGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IGltcGxlbWVudHMgRGlzcGxheWFibGUsIENvbXBhcmFibGU8VGVzdE5vZGU+IHsKLQkJLyoqIHRoZSBtb2RlbCBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIG5vZGUgKi8KLQkJcHJpdmF0ZSBmaW5hbCBUZXN0TW9kZWwgdGVzdE1vZGVsOwotCQkvKiogdGhpcyBub2RlJ3MgcGFyZW50IG5vZGU7IG51bGwgZm9yIHRoZSByb290IG5vZGUgKi8KLQkJcHJpdmF0ZSBmaW5hbCBUZXN0Tm9kZSBwYXJlbnQ7Ci0JCS8qKiB0aGlzIG5vZGUncyBjaGlsZCBub2RlcyAqLwotCQlwcml2YXRlIGZpbmFsIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsOwotCQkvKiogYSBsaXN0ZW5lciB0aGF0IG5vdGlmaWVzIHVzIHdoZW4gdGhlIG1vZGVsIG9iamVjdCdzICJpbnRlcm5hbCBzdGF0ZSIgY2hhbmdlcyAqLwotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGVzdE1vZGVsTGlzdGVuZXI7Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIHJvb3Qgbm9kZSBjb25zdHJ1Y3RvcgotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlKFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXRoaXMobnVsbCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8qKgotCQkgKiBicmFuY2ggb3IgbGVhZiBub2RlIGNvbnN0cnVjdG9yCi0JCSAqLwotCQlwdWJsaWMgVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLnRlc3RNb2RlbCA9IHRlc3RNb2RlbDsKLQkJCXRoaXMuY2hpbGRyZW5Nb2RlbCA9IHRoaXMuYnVpbGRDaGlsZHJlbk1vZGVsKHRlc3RNb2RlbCk7Ci0JCQl0aGlzLnRlc3RNb2RlbExpc3RlbmVyID0gdGhpcy5idWlsZFRlc3RNb2RlbExpc3RlbmVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRUZXN0TW9kZWxMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCVRlc3ROb2RlLnRoaXMudGVzdE1vZGVsQ2hhbmdlZChlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLyoqCi0JCSAqIHN1YmNsYXNzZXMgZGVjaWRlIHRoZSBvcmRlciBvZiB0aGUgY2hpbGQgbm9kZXMKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRDaGlsZHJlbk1vZGVsKFRlc3RNb2RlbCBtb2RlbCk7Ci0KLQkJLyoqCi0JCSAqIHVzZWQgYnkgc3ViY2xhc3NlczsKLQkJICogdHJhbnNmb3JtIHRoZSB0ZXN0IG1vZGVsIGNoaWxkcmVuIGludG8gbm9kZXMKLQkJICovCi0JCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGROb2RlQWRhcHRlcihUZXN0TW9kZWwgbW9kZWwpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDxUZXN0TW9kZWwsIFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pih0aGlzLmJ1aWxkQ2hpbGRyZW5BZGFwdGVyKG1vZGVsKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBUZXN0Tm9kZSB0cmFuc2Zvcm1JdGVtKFRlc3RNb2RlbCBpdGVtKSB7Ci0JCQkJCXJldHVybiBUZXN0Tm9kZS50aGlzLmJ1aWxkQ2hpbGROb2RlKGl0ZW0pOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICogc3ViY2xhc3NlcyBtdXN0IGJ1aWxkIGEgY29uY3JldGUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCB0ZXN0IG1vZGVsCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGVzdE5vZGUgYnVpbGRDaGlsZE5vZGUoVGVzdE1vZGVsIGNoaWxkVGVzdE1vZGVsKTsKLQotCQkvKioKLQkJICogcmV0dXJuIGEgY29sbGVjdGlvbiB2YWx1ZSBtb2RlbCBvbiB0aGUgc3BlY2lmaWVkIG1vZGVsJ3MgY2hpbGRyZW4KLQkJICovCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxUZXN0TW9kZWw+IGJ1aWxkQ2hpbGRyZW5BZGFwdGVyKFRlc3RNb2RlbCBtb2RlbCkgewotCQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxUZXN0TW9kZWwsIFRlc3RNb2RlbD4oVGVzdE1vZGVsLkNISUxEUkVOX0NPTExFQ1RJT04sIG1vZGVsKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhdG9yPFRlc3RNb2RlbD4gaXRlcmF0b3JfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmNoaWxkcmVuKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuY2hpbGRyZW5TaXplKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBUZXN0TW9kZWwgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0TW9kZWw7Ci0JCX0KLQotCQlwdWJsaWMgVHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4gcGFyZW50KCkgewotCQkJcmV0dXJuIHRoaXMucGFyZW50OwotCQl9Ci0KLQkJcHVibGljIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBjaGlsZHJlbk1vZGVsKCkgewotCQkJcmV0dXJuIHRoaXMuY2hpbGRyZW5Nb2RlbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy50ZXN0TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihUZXN0TW9kZWwuTkFNRV9QUk9QRVJUWSwgdGhpcy50ZXN0TW9kZWxMaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlVmFsdWUoKSB7Ci0JCQl0aGlzLnRlc3RNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZLCB0aGlzLnRlc3RNb2RlbExpc3RlbmVyKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBEaXNwbGF5YWJsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIHRoaXMudGVzdE1vZGVsLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJY29uIGljb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBkZWJ1Z2dpbmcgc3VwcG9ydCAqKioqKioqKioqCi0KLQkJcHVibGljIFN0cmluZyBkdW1wU3RyaW5nKCkgewotCQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQkJSW5kZW50aW5nUHJpbnRXcml0ZXIgaXB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKHN3KTsKLQkJCXRoaXMuZHVtcE9uKGlwdyk7Ci0JCQlyZXR1cm4gc3cudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXBPbihJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIpIHsKLQkJCXdyaXRlci5wcmludGxuKHRoaXMpOwotCQkJd3JpdGVyLmluZGVudCgpOwotCQkJZm9yIChJdGVyYXRvcjxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gc3RyZWFtID0gdGhpcy5jaGlsZHJlbk1vZGVsLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCS8vIGNhc3QgdG8gYSBUZXN0Tm9kZSAoaS5lLiB0aGlzIHdvbid0IHdvcmsgd2l0aCBhIE5hbWVUZXN0Tm9kZSBpbiB0aGUgdHJlZSkKLQkJCQkoKFRlc3ROb2RlKSBzdHJlYW0ubmV4dCgpKS5kdW1wT24od3JpdGVyKTsKLQkJCX0KLQkJCXdyaXRlci51bmRlbnQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXBPbihPdXRwdXRTdHJlYW0gc3RyZWFtKSB7Ci0JCQlJbmRlbnRpbmdQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgSW5kZW50aW5nUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihzdHJlYW0pKTsKLQkJCXRoaXMuZHVtcE9uKHdyaXRlcik7Ci0JCQl3cml0ZXIuZmx1c2goKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGR1bXAoKSB7Ci0JCQl0aGlzLmR1bXBPbihTeXN0ZW0ub3V0KTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQkJLyoqCi0JCSAqIHRoZSBtb2RlbCdzIG5hbWUgaGFzIGNoYW5nZWQsIGZvcndhcmQgdGhlIGV2ZW50IHRvIG91ciBsaXN0ZW5lcnMKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHRlc3RNb2RlbENoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkvLyB3ZSBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcnMgdGhhdCBvdXIgImludGVybmFsIHN0YXRlIiBoYXMgY2hhbmdlZAotCQkJdGhpcy5maXJlU3RhdGVDaGFuZ2VkKCk7Ci0JCQkvLyBvdXIgZGlzcGxheSBzdHJpbmcgc3RheXMgaW4gc3luY2ggd2l0aCB0aGUgbW9kZWwncyBuYW1lCi0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTUExBWV9TVFJJTkdfUFJPUEVSVFksIGUuZ2V0T2xkVmFsdWUoKSwgZS5nZXROZXdWYWx1ZSgpKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFRlc3RNb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLnRlc3RNb2RlbDsKLQkJfQotCi0JCS8qKgotCQkgKiB0ZXN0aW5nIGNvbnZlbmllbmNlIG1ldGhvZAotCQkgKi8KLQkJcHVibGljIFRlc3ROb2RlIGNoaWxkTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJCWZvciAoSXRlcmF0b3I8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IHN0cmVhbSA9IHRoaXMuY2hpbGRyZW5Nb2RlbC5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBjaGlsZE5vZGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChjaGlsZE5vZGUgaW5zdGFuY2VvZiBUZXN0Tm9kZSkgewotCQkJCQlpZiAoKChUZXN0Tm9kZSkgY2hpbGROb2RlKS5nZXRUZXN0TW9kZWwoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCQlyZXR1cm4gKFRlc3ROb2RlKSBjaGlsZE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjaGlsZCBub3QgZm91bmQ6ICIgKyBuYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBzdGFuZGFyZCBtZXRob2RzICoqKioqKioqKioKLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhUZXN0Tm9kZSBvKSB7Ci0JCQlyZXR1cm4gdGhpcy5kaXNwbGF5U3RyaW5nKCkuY29tcGFyZVRvKG8uZGlzcGxheVN0cmluZygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJOb2RlKCIgKyB0aGlzLnRlc3RNb2RlbCArICIpIjsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogY29uY3JldGUgaW1wbGVtZW50YXRpb24gdGhhdCBrZWVwcyBpdHMgY2hpbGRyZW4gc29ydGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTb3J0ZWRUZXN0Tm9kZSBleHRlbmRzIFRlc3ROb2RlIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCXB1YmxpYyBTb3J0ZWRUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBTb3J0ZWRUZXN0Tm9kZShUZXN0Tm9kZSBwYXJlbnQsIFRlc3RNb2RlbCB0ZXN0TW9kZWwpIHsKLQkJCXN1cGVyKHBhcmVudCwgdGVzdE1vZGVsKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQkvKiogdGhlIGxpc3Qgc2hvdWxkIGJlIHNvcnRlZCAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGREaXNwbGF5U3RyaW5nQWRhcHRlcih0ZXN0TW9kZWwpKTsKLQkJfQotCQkvKiogdGhlIGRpc3BsYXkgc3RyaW5nIChuYW1lKSBvZiBlYWNoIG5vZGUgY2FuIGNoYW5nZSAqLwotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkRGlzcGxheVN0cmluZ0FkYXB0ZXIoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGROb2RlQWRhcHRlcih0ZXN0TW9kZWwpLCBESVNQTEFZX1NUUklOR19QUk9QRVJUWSk7Ci0JCX0KLQkJLyoqIGNoaWxkcmVuIGFyZSBhbHNvIHNvcnRlZCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgU29ydGVkVGVzdE5vZGUodGhpcywgY2hpbGROb2RlKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxlYXZlcyBpdHMgY2hpbGRyZW4gdW5zb3J0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFVuc29ydGVkVGVzdE5vZGUgZXh0ZW5kcyBUZXN0Tm9kZSB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQlwdWJsaWMgVW5zb3J0ZWRUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBVbnNvcnRlZFRlc3ROb2RlKFRlc3ROb2RlIHBhcmVudCwgVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJc3VwZXIocGFyZW50LCB0ZXN0TW9kZWwpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCS8qKiB0aGUgbGlzdCBzaG91bGQgTk9UIGJlIHNvcnRlZCAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGROb2RlQWRhcHRlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCS8qKiBjaGlsZHJlbiBhcmUgYWxzbyB1bnNvcnRlZCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgVW5zb3J0ZWRUZXN0Tm9kZSh0aGlzLCBjaGlsZE5vZGUpOwotCQl9Ci0KLQl9Ci0KLQotCS8qKgotCSAqIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRoYXQgbGVhdmVzIGl0cyBjaGlsZHJlbiB1bnNvcnRlZAotCSAqIGFuZCBoYXMgYSBzcGVjaWFsIHNldCBvZiBjaGlsZHJlbiBmb3IgIm5vZGUgMyIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNwZWNpYWxUZXN0Tm9kZSBleHRlbmRzIFVuc29ydGVkVGVzdE5vZGUgewotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkJcHVibGljIFNwZWNpYWxUZXN0Tm9kZShUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcih0ZXN0TW9kZWwpOwotCQl9Ci0JCXB1YmxpYyBTcGVjaWFsVGVzdE5vZGUoVGVzdE5vZGUgcGFyZW50LCBUZXN0TW9kZWwgdGVzdE1vZGVsKSB7Ci0JCQlzdXBlcihwYXJlbnQsIHRlc3RNb2RlbCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJLyoqIHJldHVybiBhIGRpZmZlcmVudCBsaXN0IG9mIGNoaWxkcmVuIGZvciAibm9kZSAzIiAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiBidWlsZENoaWxkcmVuTW9kZWwoVGVzdE1vZGVsIHRlc3RNb2RlbCkgewotCQkJaWYgKHRlc3RNb2RlbC5nZXROYW1lKCkuZXF1YWxzKCJub2RlIDMiKSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkU3BlY2lhbENoaWxkcmVuTW9kZWwoKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5idWlsZENoaWxkcmVuTW9kZWwodGVzdE1vZGVsKTsKLQkJfQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGJ1aWxkU3BlY2lhbENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PltdIGNoaWxkcmVuID0gbmV3IE5hbWVUZXN0Tm9kZVsxXTsKLQkJCWNoaWxkcmVuWzBdID0gbmV3IE5hbWVUZXN0Tm9kZSh0aGlzKTsKLQkJCXJldHVybiBuZXcgU2ltcGxlTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KEFycmF5cy5hc0xpc3QoY2hpbGRyZW4pKTsKLQkJfQotCQkvKiogY2hpbGRyZW4gYXJlIGFsc28gc3BlY2lhbCBub2RlcyAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFRlc3ROb2RlIGJ1aWxkQ2hpbGROb2RlKFRlc3RNb2RlbCBjaGlsZE5vZGUpIHsKLQkJCXJldHVybiBuZXcgU3BlY2lhbFRlc3ROb2RlKHRoaXMsIGNoaWxkTm9kZSk7Ci0JCX0KLQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lVGVzdE5vZGUgZXh0ZW5kcyBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+IHsKLQkJcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCQlwcml2YXRlIGZpbmFsIFNwZWNpYWxUZXN0Tm9kZSBzcGVjaWFsTm9kZTsJCS8vIHBhcmVudCBub2RlCi0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBuYW1lTGlzdGVuZXI7Ci0JCXByaXZhdGUgZmluYWwgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGNoaWxkcmVuTW9kZWw7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBOYW1lVGVzdE5vZGUoU3BlY2lhbFRlc3ROb2RlIHNwZWNpYWxOb2RlKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lTGlzdGVuZXIgPSB0aGlzLmJ1aWxkTmFtZUxpc3RlbmVyKCk7Ci0JCQl0aGlzLnNwZWNpYWxOb2RlID0gc3BlY2lhbE5vZGU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKCk7Ci0JCQl0aGlzLmNoaWxkcmVuTW9kZWwgPSBuZXcgTnVsbExpc3RWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PigpOwotCQl9Ci0JCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTmFtZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQkJTmFtZVRlc3ROb2RlLnRoaXMubmFtZUNoYW5nZWQoZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVzdE1vZGVsLCBTdHJpbmc+KFRlc3RNb2RlbC5OQU1FX1BST1BFUlRZLCB0aGlzLmdldFRlc3RNb2RlbCgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgVGVzdE1vZGVsIGdldFRlc3RNb2RlbCgpIHsKLQkJCXJldHVybiB0aGlzLnNwZWNpYWxOb2RlLmdldFRlc3RNb2RlbCgpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBUcmVlTm9kZVZhbHVlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0JCXB1YmxpYyBUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0PiBwYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWFsTm9kZTsKLQkJfQotCQlwdWJsaWMgTGlzdFZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+IGNoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jaGlsZHJlbk1vZGVsOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBBYnN0cmFjdFRyZWVOb2RlVmFsdWVNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVZhbHVlKCkgewotCQkJdGhpcy5uYW1lQWRhcHRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5uYW1lTGlzdGVuZXIpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VWYWx1ZSgpIHsKLQkJCXRoaXMubmFtZUFkYXB0ZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMubmFtZUxpc3RlbmVyKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCi0JCXByb3RlY3RlZCB2b2lkIG5hbWVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJLy8gd2UgbmVlZCB0byBub3RpZnkgbGlzdGVuZXJzIHRoYXQgb3VyICJ2YWx1ZSIgaGFzIGNoYW5nZWQKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgZS5nZXRPbGRWYWx1ZSgpLCBlLmdldE5ld1ZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRUcmVlTW9kZWwoVGVzdE5vZGUgcm9vdCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRyZWVNb2RlbChuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+Pihyb290KSk7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRUcmVlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiByb290SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJlZU1vZGVsQWRhcHRlcjxPYmplY3Q+KHJvb3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RDaGFuZ2VMaXN0ZW5lciBidWlsZENoaWxkcmVuTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRDaGlsZHJlbkxpc3RlbmVyXygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZE5vZGVTdGF0ZUxpc3RlbmVyKCkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkTm9kZVN0YXRlTGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTm9kZVZhbHVlTGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGROb2RlVmFsdWVMaXN0ZW5lcl8oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRSb290TGlzdGVuZXIoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRSb290TGlzdGVuZXJfKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQotCS8qKgotCSAqIGxpc3RlbmVyIHRoYXQgd2lsbCBibG93IHVwIHdpdGggYW55IGV2ZW50OwotCSAqIG92ZXJyaWRlIGFuZCBpbXBsZW1lbnQgZXhwZWN0ZWQgZXZlbnQgbWV0aG9kcwotCSAqLwotCXB1YmxpYyBjbGFzcyBUZXN0VHJlZU1vZGVsTGlzdGVuZXIgaW1wbGVtZW50cyBUcmVlTW9kZWxMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0NoYW5nZWQoVHJlZU1vZGVsRXZlbnQgZSkgewotCQkJZmFpbCgidW5leHBlY3RlZCBldmVudCIpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRyZWVOb2Rlc0luc2VydGVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlTm9kZXNSZW1vdmVkKFRyZWVNb2RlbEV2ZW50IGUpIHsKLQkJCWZhaWwoInVuZXhwZWN0ZWQgZXZlbnQiKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0cmVlU3RydWN0dXJlQ2hhbmdlZChUcmVlTW9kZWxFdmVudCBlKSB7Ci0JCQlmYWlsKCJ1bmV4cGVjdGVkIGV2ZW50Iik7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbW9kZWwvdmFsdWUvc3dpbmcvVHJlZU1vZGVsQWRhcHRlclVJVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjdhMDI3Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9tb2RlbC92YWx1ZS9zd2luZy9UcmVlTW9kZWxBZGFwdGVyVUlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmc7Ci0KLWltcG9ydCBqYXZhLmF3dC5Cb3JkZXJMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuQ29tcG9uZW50OwotaW1wb3J0IGphdmEuYXd0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgamF2YS5hd3QuVGV4dEZpZWxkOwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50OwotaW1wb3J0IGphdmEuYXd0LmV2ZW50LldpbmRvd0FkYXB0ZXI7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93RXZlbnQ7Ci1pbXBvcnQgamF2YS5hd3QuZXZlbnQuV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKLWltcG9ydCBqYXZheC5zd2luZy5BY3Rpb247Ci1pbXBvcnQgamF2YXguc3dpbmcuSkJ1dHRvbjsKLWltcG9ydCBqYXZheC5zd2luZy5KRnJhbWU7Ci1pbXBvcnQgamF2YXguc3dpbmcuSlBhbmVsOwotaW1wb3J0IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lOwotaW1wb3J0IGphdmF4LnN3aW5nLkpUcmVlOwotaW1wb3J0IGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50czsKLWltcG9ydCBqYXZheC5zd2luZy5ldmVudC5UcmVlU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgamF2YXguc3dpbmcuZXZlbnQuVHJlZVNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuRGVmYXVsdFRyZWVTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVNb2RlbDsKLWltcG9ydCBqYXZheC5zd2luZy50cmVlLlRyZWVQYXRoOwotaW1wb3J0IGphdmF4LnN3aW5nLnRyZWUuVHJlZVNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbnVtZXJhdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN3aW5nLkRpc3BsYXlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5UcmVlTm9kZVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5UcmVlTW9kZWxBZGFwdGVyVGVzdHMuU29ydGVkVGVzdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5UZXN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLlRyZWVNb2RlbEFkYXB0ZXJUZXN0cy5UZXN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuVHJlZU1vZGVsQWRhcHRlclRlc3RzLlVuc29ydGVkVGVzdE5vZGU7Ci0KLS8qKgotICogYW4gZXhhbXBsZSBVSSBmb3IgdGVzdGluZyB0aGUgVHJlZU1vZGVsQWRhcHRlcgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUcmVlTW9kZWxBZGFwdGVyVUlUZXN0IHsKLQotCS8vIGhvbGQgdGhlIHRyZWUgc28gd2UgY2FuIHJlc3RvcmUgaXRzIGV4cGFuc2lvbiBzdGF0ZQotCXByaXZhdGUgSlRyZWUgdHJlZTsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFRyZWVOb2RlVmFsdWVNb2RlbDxPYmplY3Q+PiByb290Tm9kZUhvbGRlcjsKLQlwcml2YXRlIGJvb2xlYW4gc29ydGVkOwotCXByaXZhdGUgVHJlZU1vZGVsIHRyZWVNb2RlbDsKLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25Nb2RlbCB0cmVlU2VsZWN0aW9uTW9kZWw7Ci0JcHJpdmF0ZSBUZXh0RmllbGQgbmFtZVRleHRGaWVsZDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQluZXcgVHJlZU1vZGVsQWRhcHRlclVJVGVzdCgpLmV4ZWMoKTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4ZWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5yb290Tm9kZUhvbGRlciA9IHRoaXMuYnVpbGRSb290Tm9kZUhvbGRlcigpOwotCQl0aGlzLnNvcnRlZCA9IHRoaXMucm9vdE5vZGVIb2xkZXIuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFNvcnRlZFRlc3ROb2RlOwotCQl0aGlzLnRyZWVNb2RlbCA9IHRoaXMuYnVpbGRUcmVlTW9kZWwoKTsKLQkJdGhpcy50cmVlU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmJ1aWxkVHJlZVNlbGVjdGlvbk1vZGVsKCk7Ci0JCXRoaXMubmFtZVRleHRGaWVsZCA9IG5ldyBUZXh0RmllbGQoKTsKLQkJdGhpcy5vcGVuV2luZG93KCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUcmVlTm9kZVZhbHVlTW9kZWw8T2JqZWN0Pj4gYnVpbGRSb290Tm9kZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VHJlZU5vZGVWYWx1ZU1vZGVsPE9iamVjdD4+KHRoaXMuYnVpbGRTb3J0ZWRSb290Tm9kZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIGJ1aWxkU29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkVGVzdE5vZGUodGhpcy5idWlsZFJvb3QoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0Tm9kZSBidWlsZFVuc29ydGVkUm9vdE5vZGUoKSB7Ci0JCXJldHVybiBuZXcgVW5zb3J0ZWRUZXN0Tm9kZSh0aGlzLmJ1aWxkUm9vdCgpKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBidWlsZFJvb3QoKSB7Ci0JCVRlc3RNb2RlbCByb290ID0gbmV3IFRlc3RNb2RlbCgicm9vdCIpOwotCi0JCVRlc3RNb2RlbCBub2RlXzEgPSByb290LmFkZENoaWxkKCJub2RlIDEiKTsKLQkJLypOb2RlIG5vZGVfMV8xID0gKi9ub2RlXzEuYWRkQ2hpbGQoIm5vZGUgMS4xIik7Ci0KLQkJVGVzdE1vZGVsIG5vZGVfMiA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMiIpOwotCQkvKk5vZGUgbm9kZV8yXzEgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjEiKTsKLQkJVGVzdE1vZGVsIG5vZGVfMl8yID0gbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMiIpOwotCQkvKk5vZGUgbm9kZV8yXzJfMSA9ICovbm9kZV8yXzIuYWRkQ2hpbGQoIm5vZGUgMi4yLjEiKTsKLQkJLypOb2RlIG5vZGVfMl8yXzIgPSAqL25vZGVfMl8yLmFkZENoaWxkKCJub2RlIDIuMi4yIik7Ci0JCS8qTm9kZSBub2RlXzJfMyA9ICovbm9kZV8yLmFkZENoaWxkKCJub2RlIDIuMyIpOwotCQkvKk5vZGUgbm9kZV8yXzQgPSAqL25vZGVfMi5hZGRDaGlsZCgibm9kZSAyLjQiKTsKLQkJLypOb2RlIG5vZGVfMl81ID0gKi9ub2RlXzIuYWRkQ2hpbGQoIm5vZGUgMi41Iik7Ci0KLQkJVGVzdE1vZGVsIG5vZGVfMyA9IHJvb3QuYWRkQ2hpbGQoIm5vZGUgMyIpOwotCQlUZXN0TW9kZWwgbm9kZV8zXzEgPSBub2RlXzMuYWRkQ2hpbGQoIm5vZGUgMy4xIik7Ci0JCVRlc3RNb2RlbCBub2RlXzNfMV8xID0gbm9kZV8zXzEuYWRkQ2hpbGQoIm5vZGUgMy4xLjEiKTsKLQkJLypOb2RlIG5vZGVfM18xXzFfMSA9ICovbm9kZV8zXzFfMS5hZGRDaGlsZCgibm9kZSAzLjEuMS4xIik7Ci0KLQkJLypOb2RlIG5vZGVfNCA9ICovcm9vdC5hZGRDaGlsZCgibm9kZSA0Iik7Ci0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBUcmVlTW9kZWwgYnVpbGRUcmVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVHJlZU1vZGVsQWRhcHRlcjxPYmplY3Q+KHRoaXMucm9vdE5vZGVIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgVHJlZVNlbGVjdGlvbk1vZGVsIGJ1aWxkVHJlZVNlbGVjdGlvbk1vZGVsKCkgewotCQlUcmVlU2VsZWN0aW9uTW9kZWwgdHNtID0gbmV3IERlZmF1bHRUcmVlU2VsZWN0aW9uTW9kZWwoKTsKLQkJdHNtLmFkZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVHJlZVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl0c20uc2V0U2VsZWN0aW9uTW9kZShUcmVlU2VsZWN0aW9uTW9kZWwuU0lOR0xFX1RSRUVfU0VMRUNUSU9OKTsKLQkJcmV0dXJuIHRzbTsKLQl9Ci0KLQlwcml2YXRlIFRyZWVTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRyZWVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmVlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB2YWx1ZUNoYW5nZWQoVHJlZVNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMudHJlZVNlbGVjdGlvbkNoYW5nZWQoZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCB0cmVlU2VsZWN0aW9uQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgVHJlZVNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lVGV4dEZpZWxkLnNldFRleHQoc2VsZWN0ZWRUZXN0TW9kZWwuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuV2luZG93KCkgewotCQlKRnJhbWUgd2luZG93ID0gbmV3IEpGcmFtZSh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQkJd2luZG93LnNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRE9fTk9USElOR19PTl9DTE9TRSk7Ci0JCXdpbmRvdy5hZGRXaW5kb3dMaXN0ZW5lcih0aGlzLmJ1aWxkV2luZG93TGlzdGVuZXIoKSk7Ci0JCXdpbmRvdy5nZXRDb250ZW50UGFuZSgpLmFkZCh0aGlzLmJ1aWxkTWFpblBhbmVsKCksICJDZW50ZXIiKTsKLQkJd2luZG93LnNldExvY2F0aW9uKDMwMCwgMzAwKTsKLQkJd2luZG93LnNldFNpemUoNDAwLCA0MDApOwotCQl3aW5kb3cuc2V0VmlzaWJsZSh0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIFdpbmRvd0xpc3RlbmVyIGJ1aWxkV2luZG93TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgV2luZG93QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhXaW5kb3dFdmVudCBlKSB7Ci0JCQkJZS5nZXRXaW5kb3coKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlTeXN0ZW0uZXhpdCgwKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvbmVudCBidWlsZE1haW5QYW5lbCgpIHsKLQkJSlBhbmVsIG1haW5QYW5lbCA9IG5ldyBKUGFuZWwobmV3IEJvcmRlckxheW91dCgpKTsKLQkJbWFpblBhbmVsLmFkZCh0aGlzLmJ1aWxkVHJlZVBhbmUoKSwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCW1haW5QYW5lbC5hZGQodGhpcy5idWlsZENvbnRyb2xQYW5lbCgpLCBCb3JkZXJMYXlvdXQuU09VVEgpOwotCQlyZXR1cm4gbWFpblBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkVHJlZVBhbmUoKSB7Ci0JCXJldHVybiBuZXcgSlNjcm9sbFBhbmUodGhpcy5idWlsZFRyZWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKVHJlZSBidWlsZFRyZWUoKSB7Ci0JCXRoaXMudHJlZSA9IG5ldyBKVHJlZSh0aGlzLnRyZWVNb2RlbCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRWYWx1ZVRvVGV4dChPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2VsZWN0ZWQsIGJvb2xlYW4gZXhwYW5kZWQsIGJvb2xlYW4gbGVhZiwgaW50IHJvdywgYm9vbGVhbiBoYXNGb2N1cykgewotCQkJCXJldHVybiAoKERpc3BsYXlhYmxlKSB2YWx1ZSkuZGlzcGxheVN0cmluZygpOwotCQkJfQotCQl9OwotCQl0aGlzLnRyZWUuc2V0U2VsZWN0aW9uTW9kZWwodGhpcy50cmVlU2VsZWN0aW9uTW9kZWwpOwotCQl0aGlzLnRyZWUuc2V0Um9vdFZpc2libGUodHJ1ZSk7Ci0JCXRoaXMudHJlZS5zZXRTaG93c1Jvb3RIYW5kbGVzKHRydWUpOwotCQl0aGlzLnRyZWUuc2V0Um93SGVpZ2h0KDIwKTsKLQkJdGhpcy50cmVlLnNldERvdWJsZUJ1ZmZlcmVkKHRydWUpOwotCQlyZXR1cm4gdGhpcy50cmVlOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQ29udHJvbFBhbmVsKCkgewotCQlKUGFuZWwgY29udHJvbFBhbmVsID0gbmV3IEpQYW5lbChuZXcgR3JpZExheW91dCgwLCAxKSk7Ci0JCWNvbnRyb2xQYW5lbC5hZGQodGhpcy5idWlsZEFkZFJlbmFtZU5vZGVQYW5lbCgpKTsKLQkJY29udHJvbFBhbmVsLmFkZCh0aGlzLmJ1aWxkTWlzY1BhbmVsKCkpOwotCQlyZXR1cm4gY29udHJvbFBhbmVsOwotCX0KLQotCXByaXZhdGUgQ29tcG9uZW50IGJ1aWxkQWRkUmVuYW1lTm9kZVBhbmVsKCkgewotCQlKUGFuZWwgYWRkUmVuYW1lTm9kZVBhbmVsID0gbmV3IEpQYW5lbChuZXcgQm9yZGVyTGF5b3V0KCkpOwotCQlhZGRSZW5hbWVOb2RlUGFuZWwuYWRkKHRoaXMuYnVpbGRBZGRCdXR0b24oKSwgQm9yZGVyTGF5b3V0LldFU1QpOwotCQlhZGRSZW5hbWVOb2RlUGFuZWwuYWRkKHRoaXMubmFtZVRleHRGaWVsZCwgQm9yZGVyTGF5b3V0LkNFTlRFUik7Ci0JCWFkZFJlbmFtZU5vZGVQYW5lbC5hZGQodGhpcy5idWlsZFJlbmFtZUJ1dHRvbigpLCBCb3JkZXJMYXlvdXQuRUFTVCk7Ci0JCXJldHVybiBhZGRSZW5hbWVOb2RlUGFuZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb25lbnQgYnVpbGRNaXNjUGFuZWwoKSB7Ci0JCUpQYW5lbCBtaXNjUGFuZWwgPSBuZXcgSlBhbmVsKG5ldyBHcmlkTGF5b3V0KDEsIDApKTsKLQkJbWlzY1BhbmVsLmFkZCh0aGlzLmJ1aWxkQ2xlYXJDaGlsZHJlbkJ1dHRvbigpKTsKLQkJbWlzY1BhbmVsLmFkZCh0aGlzLmJ1aWxkUmVtb3ZlQnV0dG9uKCkpOwotCQltaXNjUGFuZWwuYWRkKHRoaXMuYnVpbGRSZXNldEJ1dHRvbigpKTsKLQkJcmV0dXJuIG1pc2NQYW5lbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lVGV4dEZpZWxkLmdldFRleHQoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCXByaXZhdGUgVGVzdE5vZGUgc2VsZWN0ZWROb2RlKCkgewotCQlpZiAodGhpcy50cmVlU2VsZWN0aW9uTW9kZWwuaXNTZWxlY3Rpb25FbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFRlc3ROb2RlKSB0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5nZXRTZWxlY3Rpb25QYXRoKCkuZ2V0TGFzdFBhdGhDb21wb25lbnQoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCgpIHsKLQkJaWYgKHRoaXMudHJlZVNlbGVjdGlvbk1vZGVsLmlzU2VsZWN0aW9uRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIFRlc3ROb2RlIHJvb3ROb2RlKCkgewotCQlyZXR1cm4gKFRlc3ROb2RlKSB0aGlzLnRyZWVNb2RlbC5nZXRSb290KCk7Ci0JfQotCi0JcHJpdmF0ZSBUZXN0TW9kZWwgcm9vdCgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdE5vZGUoKS5nZXRWYWx1ZSgpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxUcmVlUGF0aD4gZXhwYW5kZWRQYXRocygpIHsKLQkJRW51bWVyYXRpb248VHJlZVBhdGg+IHN0cmVhbSA9IHRoaXMudHJlZS5nZXRFeHBhbmRlZERlc2NlbmRhbnRzKG5ldyBUcmVlUGF0aCh0aGlzLnJvb3ROb2RlKCkpKTsKLQkJaWYgKHN0cmVhbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5saXN0KG5ldyBFbnVtZXJhdGlvbkl0ZXJhdG9yPFRyZWVQYXRoPihzdHJlYW0pKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlwcml2YXRlIHZvaWQgc2V0U2VsZWN0ZWROb2RlKFRlc3ROb2RlIHNlbGVjdGVkTm9kZSkgewotCQl0aGlzLnRyZWVTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3Rpb25QYXRoKG5ldyBUcmVlUGF0aChzZWxlY3RlZE5vZGUucGF0aCgpKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFBhdGhzKENvbGxlY3Rpb248VHJlZVBhdGg+IHBhdGhzKSB7Ci0JCWZvciAoVHJlZVBhdGggcGF0aCA6IHBhdGhzKSB7Ci0JCQl0aGlzLnRyZWUuZXhwYW5kUGF0aChwYXRoKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogYWRkICoqKioqKioqKioKLQlwcml2YXRlIEpCdXR0b24gYnVpbGRBZGRCdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQWRkQWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkQWRkQWN0aW9uKCkgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFic3RyYWN0QWN0aW9uKCJhZGQiKSB7Ci0JCQlwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlUcmVlTW9kZWxBZGFwdGVyVUlUZXN0LnRoaXMuYWRkTm9kZSgpOwotCQkJfQotCQl9OwotCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBhZGRpbmcgY2F1c2VzIHRoZSB0cmVlIHRvIGJlIHNvcnRlZCBhbmQgbm9kZXMgdG8gYmUKLQkgKiByZW1vdmVkIGFuZCByZS1hZGRlZDsgc28gd2UgaGF2ZSB0byBmaWRkbGUgd2l0aCB0aGUgZXhwYW5zaW9uIHN0YXRlCi0JICovCi0Jdm9pZCBhZGROb2RlKCkgewotCQlUZXN0TW9kZWwgc2VsZWN0ZWRUZXN0TW9kZWwgPSB0aGlzLnNlbGVjdGVkVGVzdE1vZGVsKCk7Ci0JCWlmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0TmFtZSgpOwotCQkJLy8gc2F2ZSB0aGUgZXhwYW5zaW9uIHN0YXRlIGFuZCByZXN0b3JlIGl0IGFmdGVyIHRoZSBhZGQKLQkJCUNvbGxlY3Rpb248VHJlZVBhdGg+IHBhdGhzID0gdGhpcy5leHBhbmRlZFBhdGhzKCk7Ci0KLQkJCXNlbGVjdGVkVGVzdE1vZGVsLmFkZENoaWxkKG5hbWUpOwotCi0JCQl0aGlzLmV4cGFuZFBhdGhzKHBhdGhzKTsKLQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKHRoaXMuc2VsZWN0ZWROb2RlKCkuY2hpbGROYW1lZChuYW1lKSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAqKioqKioqKioqCi0JcHJpdmF0ZSBKQnV0dG9uIGJ1aWxkUmVtb3ZlQnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlbW92ZUFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZFJlbW92ZUFjdGlvbigpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG5ldyBBYnN0cmFjdEFjdGlvbigicmVtb3ZlIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlbW92ZU5vZGUoKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIG5vZGUgdG8gc2VsZWN0IGFmdGVyCi0JICogdGhlIHNlbGVjdGVkIG5vZGUgaXMgZGVsZXRlZAotCSAqLwotCXZvaWQgcmVtb3ZlTm9kZSgpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQkvLyBkbyBub3QgYWxsb3cgdGhlIHJvb3QgdG8gYmUgcmVtb3ZlZAotCQlpZiAoKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpICYmIChzZWxlY3RlZFRlc3RNb2RlbCAhPSB0aGlzLnJvb3QoKSkpIHsKLQkJCS8vIHNhdmUgdGhlIHBhcmVudCBhbmQgaW5kZXgsIHNvIHdlIGNhbiBzZWxlY3QgYW5vdGhlciwgbmVhcmJ5LCBub2RlCi0JCQkvLyBvbmNlIHRoZSBzZWxlY3RlZCBub2RlIGlzIHJlbW92ZWQKLQkJCVRlc3ROb2RlIHBhcmVudE5vZGUgPSAoVGVzdE5vZGUpIHRoaXMuc2VsZWN0ZWROb2RlKCkucGFyZW50KCk7Ci0JCQlpbnQgY2hpbGRJbmRleCA9IHBhcmVudE5vZGUuaW5kZXhPZkNoaWxkKHRoaXMuc2VsZWN0ZWROb2RlKCkpOwotCi0JCQlzZWxlY3RlZFRlc3RNb2RlbC5nZXRQYXJlbnQoKS5yZW1vdmVDaGlsZChzZWxlY3RlZFRlc3RNb2RlbCk7Ci0KLQkJCWludCBjaGlsZHJlblNpemUgPSBwYXJlbnROb2RlLmNoaWxkcmVuU2l6ZSgpOwotCQkJaWYgKGNoaWxkSW5kZXggPCBjaGlsZHJlblNpemUpIHsKLQkJCQkvLyBzZWxlY3QgdGhlIGNoaWxkIHRoYXQgbW92ZWQgdXAgYW5kIHJlcGxhY2VkIHRoZSBqdXN0LWRlbGV0ZWQgY2hpbGQKLQkJCQl0aGlzLnNldFNlbGVjdGVkTm9kZSgoVGVzdE5vZGUpIHBhcmVudE5vZGUuY2hpbGQoY2hpbGRJbmRleCkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoY2hpbGRyZW5TaXplID09IDApIHsKLQkJCQkJLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgY2hpbGRyZW4sIHNlbGVjdCB0aGUgcGFyZW50Ci0JCQkJCXRoaXMuc2V0U2VsZWN0ZWROb2RlKHBhcmVudE5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmIHRoZSBjaGlsZCBhdCB0aGUgYm90dG9tIG9mIHRoZSBsaXN0IHdhcyBkZWxldGVkLCBzZWxlY3QgdGhlIG5leHQgY2hpbGQgdXAKLQkJCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUoKFRlc3ROb2RlKSBwYXJlbnROb2RlLmNoaWxkKGNoaWxkSW5kZXggLSAxKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiByZW5hbWUgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlbmFtZUJ1dHRvbigpIHsKLQkJcmV0dXJuIG5ldyBKQnV0dG9uKHRoaXMuYnVpbGRSZW5hbWVBY3Rpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYnVpbGRSZW5hbWVBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlbmFtZSIpIHsKLQkJCXB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChBY3Rpb25FdmVudCBldmVudCkgewotCQkJCVRyZWVNb2RlbEFkYXB0ZXJVSVRlc3QudGhpcy5yZW5hbWVOb2RlKCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHJlbmFtaW5nIGNhdXNlcyB0aGUgdHJlZSB0byBiZSBzb3J0ZWQgYW5kIG5vZGVzIHRvIGJlCi0JICogcmVtb3ZlZCBhbmQgcmUtYWRkZWQ7IHNvIHdlIGhhdmUgdG8gZmlkZGxlIHdpdGggdGhlIGV4cGFuc2lvbiBzdGF0ZQotCSAqLwotCXZvaWQgcmVuYW1lTm9kZSgpIHsKLQkJVGVzdE1vZGVsIHNlbGVjdGVkVGVzdE1vZGVsID0gdGhpcy5zZWxlY3RlZFRlc3RNb2RlbCgpOwotCQlpZiAoc2VsZWN0ZWRUZXN0TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gc2F2ZSB0aGUgbm9kZSBhbmQgcmUtc2VsZWN0IGl0IGFmdGVyIHRoZSByZW5hbWUKLQkJCVRlc3ROb2RlIHNlbGVjdGVkTm9kZSA9IHRoaXMuc2VsZWN0ZWROb2RlKCk7Ci0JCQkvLyBzYXZlIHRoZSBleHBhbnNpb24gc3RhdGUgYW5kIHJlc3RvcmUgaXQgYWZ0ZXIgdGhlIHJlbmFtZQotCQkJQ29sbGVjdGlvbjxUcmVlUGF0aD4gcGF0aHMgPSB0aGlzLmV4cGFuZGVkUGF0aHMoKTsKLQotCQkJc2VsZWN0ZWRUZXN0TW9kZWwuc2V0TmFtZSh0aGlzLmdldE5hbWUoKSk7Ci0KLQkJCXRoaXMuZXhwYW5kUGF0aHMocGF0aHMpOwotCQkJdGhpcy5zZXRTZWxlY3RlZE5vZGUoc2VsZWN0ZWROb2RlKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogY2xlYXIgY2hpbGRyZW4gKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZENsZWFyQ2hpbGRyZW5CdXR0b24oKSB7Ci0JCXJldHVybiBuZXcgSkJ1dHRvbih0aGlzLmJ1aWxkQ2xlYXJDaGlsZHJlbkFjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIEFjdGlvbiBidWlsZENsZWFyQ2hpbGRyZW5BY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oImNsZWFyIGNoaWxkcmVuIikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLmNsZWFyQ2hpbGRyZW4oKTsKLQkJCX0KLQkJfTsKLQkJYWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0JLyoqCi0JICogbm90aGluZyBzcGVjaWFsLCB3ZSBqdXN0IHdhbnQgdG8gdGVzdCAjZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFN0cmluZykKLQkgKi8KLQl2b2lkIGNsZWFyQ2hpbGRyZW4oKSB7Ci0JCVRlc3RNb2RlbCBzZWxlY3RlZFRlc3RNb2RlbCA9IHRoaXMuc2VsZWN0ZWRUZXN0TW9kZWwoKTsKLQkJaWYgKHNlbGVjdGVkVGVzdE1vZGVsICE9IG51bGwpIHsKLQkJCXNlbGVjdGVkVGVzdE1vZGVsLmNsZWFyQ2hpbGRyZW4oKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogcmVzZXQgKioqKioqKioqKgotCXByaXZhdGUgSkJ1dHRvbiBidWlsZFJlc2V0QnV0dG9uKCkgewotCQlyZXR1cm4gbmV3IEpCdXR0b24odGhpcy5idWlsZFJlc2V0QWN0aW9uKCkpOwotCX0KLQotCXByaXZhdGUgQWN0aW9uIGJ1aWxkUmVzZXRBY3Rpb24oKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWJzdHJhY3RBY3Rpb24oInJlc2V0IikgewotCQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVHJlZU1vZGVsQWRhcHRlclVJVGVzdC50aGlzLnJlc2V0KCk7Ci0JCQl9Ci0JCX07Ci0JCWFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCS8qKgotCSAqIHRlc3QgdGhlIGFkYXB0ZXIncyByb290IG5vZGUgaG9sZGVyOwotCSAqIHRvZ2dsZSBiZXR3ZWVuIHNvcnRlZCBhbmQgdW5zb3J0ZWQgbGlzdHMKLQkgKi8KLQl2b2lkIHJlc2V0KCkgewotCQl0aGlzLnNvcnRlZCA9ICEgdGhpcy5zb3J0ZWQ7Ci0JCWlmICh0aGlzLnNvcnRlZCkgewotCQkJdGhpcy5yb290Tm9kZUhvbGRlci5zZXRWYWx1ZSh0aGlzLmJ1aWxkU29ydGVkUm9vdE5vZGUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnJvb3ROb2RlSG9sZGVyLnNldFZhbHVlKHRoaXMuYnVpbGRVbnNvcnRlZFJvb3ROb2RlKCkpOwotCQl9Ci0JCXRoaXMudHJlZS5leHBhbmRQYXRoKG5ldyBUcmVlUGF0aCh0aGlzLnJvb3ROb2RlKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZVRlc3RzLmphdmEgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9BYnN0cmFjdE5vZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGNkNjI5Li4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0Fic3RyYWN0Tm9kZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwubm9kZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLkFic3RyYWN0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLlByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3ROb2RlVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBUZXN0V29ya2JlbmNoTW9kZWwgcm9vdDsKLQotCXB1YmxpYyBBYnN0cmFjdE5vZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnJvb3QgPSB0aGlzLmJ1aWxkUm9vdCgpOwotCX0KLQotCXByaXZhdGUgVGVzdFdvcmtiZW5jaE1vZGVsIGJ1aWxkUm9vdCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHIgPSBuZXcgUm9vdFRlc3RXb3JrYmVuY2hNb2RlbCgicm9vdCIpOwotCQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUxID0gci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxIik7Ci0JCQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUxXzEgPSBub2RlMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEiKTsKLQkJCQkJbm9kZTFfMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjEuMSIpOwotCQkJCQlub2RlMV8xLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDEuMS4yIik7Ci0JCQkJCW5vZGUxXzEuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJCQlub2RlMS5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAxLjIiKTsKLQkJCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlMiA9IHIuYWRkVGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpOwotCQkJCW5vZGUyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDIuMSIpOwotCQkJCW5vZGUyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDIuMiIpOwotCQkJci5hZGRUZXN0Q2hpbGROYW1lZCgibm9kZSAzIik7Ci0JCQlyLmFkZFRlc3RDaGlsZE5hbWVkKCJub2RlIDQiKTsKLQotCQkvLyBtYXJrIHRoZSBlbnRpcmUgdHJlZSBjbGVhbgotCQlyLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlyZXR1cm4gcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0VG9vbHMuY2xlYXIodGhpcyk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRlc3RXb3JrYmVuY2hNb2RlbCgpIHsKLQkJLy8gbWFrZSBzdXJlIG91ciB0ZXN0IGNsYXNzIHdvcmtzIE9LLi4uCi0JCWFzc2VydE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDEiKS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAxIikuaXNDbGVhbkJyYW5jaCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdENoaWxkTmFtZWQoIm5vZGUgMiIpLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3RDaGlsZE5hbWVkKCJub2RlIDIiKS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnROdWxsKHRoaXMucm9vdC50ZXN0Q2hpbGROYW1lZCgibm9kZSAyLjEiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgiIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyLjEiKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMi4xIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAyLjEiKS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIikpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIikuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpLmlzQ2xlYW5CcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhcmVudEFuZENoaWxkcmVuKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCWFzc2VydEVxdWFscygibm9kZSAxLjEuMyIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRFcXVhbHMoIm5vZGUgMS4xIiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygibm9kZSAxIiwgbm9kZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUobm9kZS5jaGlsZHJlbigpKSk7Ci0KLQkJbm9kZSA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydEVxdWFscygicm9vdCIsIG5vZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuY2hpbGRyZW4oKSkpOwotCi0JCW5vZGUgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnROdWxsKG5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eSgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNDbGVhbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlVbmNoYW5nZWRBdHRyaWJ1dGUoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzQ2xlYW4oKSk7Ci0KLQkJdGhpcy5yb290Lm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQkvLyBzZXQgc2l6ZSB0byBzYW1lIG51bWJlciAtIHNob3VsZCBzdGF5IGNsZWFuCi0JCW5vZGUuc2V0U2l6ZSg0Mik7Ci0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaCgpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldFNpemUoNDIpOwotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnJvb3QuaXNEaXJ0eUJyYW5jaCgpKTsKLQotCQlwYXJlbnQuc2V0U2l6ZSg3Nyk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0KLQkJbm9kZS5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2hDbGVhbkNoaWxkRGlydHlQYXJlbnQoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXRTaXplKDQyKTsKLQotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldFNpemUoNzcpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCS8vIG5vdywgY2xlYW4gdGhlIGNoaWxkLCBidXQgbGVhdmUgdGhlIHBhcmVudCBkaXJ0eQotCQlub2RlLm1hcmtFbnRpcmVCcmFuY2hDbGVhbigpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5KCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REaXJ0eUJyYW5jaENsZWFuQ2hpbGREaXJ0eUNoaWxkKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZTEgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMSIpOwotCQlub2RlMS5zZXRTaXplKDQxKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUyID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjIiKTsKLQkJbm9kZTIuc2V0U2l6ZSg0Mik7Ci0KLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUxLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCS8vIG5vdywgY2xlYW4gdGhlIGZpcnN0IGNoaWxkLCBidXQgbGVhdmUgdGhlIHNlY29uZCBjaGlsZCBkaXJ0eQotCQlub2RlMS5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNDbGVhbigpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuaXNEaXJ0eUJyYW5jaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlydHlCcmFuY2hGb3JjZWQoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIHBhcmVudCA9IChUZXN0V29ya2JlbmNoTW9kZWwpIG5vZGUuZ2V0UGFyZW50KCk7Ci0KLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuQnJhbmNoKCkpOwotCi0JCXRoaXMucm9vdC5tYXJrRW50aXJlQnJhbmNoRGlydHkoKTsKLQotCQlhc3NlcnRUcnVlKG5vZGUuaXNEaXJ0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmlzRGlydHlCcmFuY2goKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHkoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5yb290LmlzRGlydHlCcmFuY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcnR5VHJhbnNpZW50QXR0cmlidXRlKCkgewotCQlUZXN0V29ya2JlbmNoTW9kZWwgbm9kZSA9IHRoaXMucm9vdC50ZXN0RGVzY2VuZGFudE5hbWVkKCJub2RlIDEuMS4zIik7Ci0JCW5vZGUuc2V0TmFtZSgiQk9HVVMiKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmlzRGlydHkoKSk7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0RpcnR5QnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0RpcnR5QnJhbmNoKCkpOwotCi0JCXRoaXMucm9vdC5tYXJrRW50aXJlQnJhbmNoQ2xlYW4oKTsKLQotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQucHJvYmxlbXNTaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLnByb2JsZW1zU2l6ZSgpID4gMCk7Ci0KLQkJLy8gc2luY2UgcHJvYmxlbXMgYXJlIHRyYW5zaWVudCwgZXZlcnl0aGluZyBzaG91bGQgc3RpbGwgYmUgY2xlYW4KLQkJYXNzZXJ0VHJ1ZShub2RlLmlzQ2xlYW4oKSk7Ci0JCWFzc2VydFRydWUobm9kZS5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5pc0NsZWFuQnJhbmNoKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMucm9vdC5pc0NsZWFuQnJhbmNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygwLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKG5vZGUuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnQuYnJhbmNoUHJvYmxlbXMoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCVByb2JsZW0gcHJvYmxlbTEgPSBub2RlLnByb2JsZW1zKCkubmV4dCgpOwotCi0JCS8vIG5vdyBjcmVhdGUgYW5vdGhlciBwcm9ibGVtIHRoYXQgc2hvdWxkIHJlbW92ZSB0aGUgb2xkIHByb2JsZW0KLQkJbm9kZS5zZXROYW1lKCJTVElMTCBCT0dVUyIpOwotCQl0aGlzLnJvb3QudmFsaWRhdGVCcmFuY2goKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5yb290LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShub2RlLmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUocGFyZW50LmJyYW5jaFByb2JsZW1zKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUucHJvYmxlbXNTaXplKCkpOwotCQlQcm9ibGVtIHByb2JsZW0yID0gbm9kZS5wcm9ibGVtcygpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UocHJvYmxlbTEgPT0gcHJvYmxlbTIpOwotCQlwcm9ibGVtMSA9IHByb2JsZW0yOwotCi0JCS8vIG5vdyBjcmVhdGUgYW5vdGhlciBwcm9ibGVtIHRoYXQgc2hvdWxkIHJlcGxhY2UgdGhlIG9sZCBwcm9ibGVtCi0JCW5vZGUuc2V0TmFtZSgiU1RJTEwgQk9HVVMiKTsKLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydFRydWUobm9kZS5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwYXJlbnQucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKHBhcmVudC5icmFuY2hQcm9ibGVtcygpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJcHJvYmxlbTIgPSBub2RlLnByb2JsZW1zKCkubmV4dCgpOwotCQkvLyB0aGUgc2FtZSBwcm9ibGVtIHNob3VsZCBiZSB0aGVyZQotCQlhc3NlcnRUcnVlKHByb2JsZW0xLmVxdWFscyhwcm9ibGVtMikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCcmFuY2hQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0TmFtZSgiQk9HVVMgVE9PIik7Ci0JCXRoaXMucm9vdC5zZXROYW1lKCJCT0dVUyBUT08gVE9PIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCi0JCW5vZGUuc2V0TmFtZSgib2tpZS1kb2tpZSIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGhpcy5yb290LmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBub2RlLmJyYW5jaFByb2JsZW1zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJBbGxCcmFuY2hQcm9ibGVtcygpIHsKLQkJVGVzdFdvcmtiZW5jaE1vZGVsIG5vZGUgPSB0aGlzLnJvb3QudGVzdERlc2NlbmRhbnROYW1lZCgibm9kZSAxLjEuMyIpOwotCQlub2RlLnNldE5hbWUoIkJPR1VTIik7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBwYXJlbnQgPSAoVGVzdFdvcmtiZW5jaE1vZGVsKSBub2RlLmdldFBhcmVudCgpOwotCQlwYXJlbnQuc2V0TmFtZSgiQk9HVVMgVE9PIik7Ci0JCXRoaXMucm9vdC5zZXROYW1lKCJCT0dVUyBUT08gVE9PIik7Ci0KLQkJdGhpcy5yb290LnZhbGlkYXRlQnJhbmNoKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5vZGUuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCi0JCXBhcmVudC5jbGVhckFsbEJyYW5jaFByb2JsZW1zKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMucm9vdC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGFyZW50LnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBhcmVudC5icmFuY2hQcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBub2RlLnByb2JsZW1zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG5vZGUuYnJhbmNoUHJvYmxlbXMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVkQnJhbmNoUHJvYmxlbXMoKSB7Ci0JCVRlc3RXb3JrYmVuY2hNb2RlbCBub2RlID0gdGhpcy5yb290LnRlc3REZXNjZW5kYW50TmFtZWQoIm5vZGUgMS4xLjMiKTsKLQkJbm9kZS5zZXROYW1lKCJCT0dVUyIpOwotCQlUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50ID0gKFRlc3RXb3JrYmVuY2hNb2RlbCkgbm9kZS5nZXRQYXJlbnQoKTsKLQkJcGFyZW50LnNldE5hbWUoIkJPR1VTIFRPTyIpOwotCQl0aGlzLnJvb3Quc2V0TmFtZSgiQk9HVVMgVE9PIFRPTyIpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5yb290LmJyYW5jaFByb2JsZW1zKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbm9kZS5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShub2RlLmJyYW5jaFByb2JsZW1zKCkpKTsKLQotCQkvLyBjb21wbGV0ZWx5IHJlbW92ZSBhIG5vZGUgdGhhdCBoYXMgcHJvYmxlbXMgLQotCQkvLyB0aGUgZW50aXJlIHRyZWUgc2hvdWxkIHJlY2FsY3VsYXRlIGl0cyAiYnJhbmNoIiBwcm9ibGVtcwotCQlwYXJlbnQucmVtb3ZlVGVzdENoaWxkKG5vZGUpOwotCi0JCXRoaXMucm9vdC52YWxpZGF0ZUJyYW5jaCgpOwotCi0JCWFzc2VydEVxdWFscygxLCB0aGlzLnJvb3QucHJvYmxlbXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5yb290LmJyYW5jaFByb2JsZW1zKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBhcmVudC5wcm9ibGVtc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwYXJlbnQuYnJhbmNoUHJvYmxlbXNTaXplKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzc2VzICoqKioqKioqKioKLQotCXB1YmxpYyBjbGFzcyBUZXN0V29ya2JlbmNoTW9kZWwgZXh0ZW5kcyBBYnN0cmFjdE5vZGUgewotCQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsKLQkJcHJpdmF0ZSBpbnQgc2l6ZTsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJWkVfUFJPUEVSVFkgPSAic2l6ZSI7Ci0JCXByaXZhdGUgQ29sbGVjdGlvbjxUZXN0V29ya2JlbmNoTW9kZWw+IHRlc3RDaGlsZHJlbjsKLQkJCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ0hJTERSRU5fQ09MTEVDVElPTiA9ICJjaGlsZHJlbiI7Ci0JCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbChUZXN0V29ya2JlbmNoTW9kZWwgcGFyZW50LCBTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCQl0aGlzLnNpemUgPSAwOwotCQkJdGhpcy50ZXN0Q2hpbGRyZW4gPSBuZXcgSGFzaEJhZzxUZXN0V29ya2JlbmNoTW9kZWw+KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCi0JCi0JCS8vICoqKioqKioqKiogYWNjZXNzb3JzICoqKioqKioqKioKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCQlPYmplY3Qgb2xkID0gdGhpcy5uYW1lOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JCi0JCXB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnNpemU7Ci0JCX0KLQkJcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgc2l6ZSkgewotCQkJaW50IG9sZCA9IHRoaXMuc2l6ZTsKLQkJCXRoaXMuc2l6ZSA9IHNpemU7Ci0JCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0laRV9QUk9QRVJUWSwgb2xkLCBzaXplKTsKLQkJfQotCQotCQlwdWJsaWMgSXRlcmF0b3I8VGVzdFdvcmtiZW5jaE1vZGVsPiB0ZXN0Q2hpbGRyZW4oKSB7Ci0JCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8VGVzdFdvcmtiZW5jaE1vZGVsPih0aGlzLnRlc3RDaGlsZHJlbikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHJlbW92ZShUZXN0V29ya2JlbmNoTW9kZWwgY3VycmVudCkgewotCQkJCQlUZXN0V29ya2JlbmNoTW9kZWwudGhpcy5yZW1vdmVUZXN0Q2hpbGQoY3VycmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlwdWJsaWMgaW50IHRlc3RDaGlsZHJlblNpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy50ZXN0Q2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0JCXByaXZhdGUgVGVzdFdvcmtiZW5jaE1vZGVsIGFkZFRlc3RDaGlsZChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkKSB7Ci0JCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24odGVzdENoaWxkLCB0aGlzLnRlc3RDaGlsZHJlbiwgVEVTVF9DSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJCXJldHVybiB0ZXN0Q2hpbGQ7Ci0JCX0KLQkJcHVibGljIFRlc3RXb3JrYmVuY2hNb2RlbCBhZGRUZXN0Q2hpbGROYW1lZChTdHJpbmcgY2hpbGROYW1lKSB7Ci0JCQlpZiAodGhpcy50ZXN0Q2hpbGROYW1lZChjaGlsZE5hbWUpICE9IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNoaWxkTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5hZGRUZXN0Q2hpbGQobmV3IFRlc3RXb3JrYmVuY2hNb2RlbCh0aGlzLCBjaGlsZE5hbWUpKTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVUZXN0Q2hpbGQoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3RDaGlsZCkgewotCQkJdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24odGVzdENoaWxkLCB0aGlzLnRlc3RDaGlsZHJlbiwgVEVTVF9DSElMRFJFTl9DT0xMRUNUSU9OKTsKLQkJfQotCQotCQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkTmFtZWQoU3RyaW5nIGNoaWxkTmFtZSkgewotCQkJZm9yIChUZXN0V29ya2JlbmNoTW9kZWwgdGVzdENoaWxkIDogdGhpcy50ZXN0Q2hpbGRyZW4pIHsKLQkJCQlpZiAodGVzdENoaWxkLmdldE5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCQlyZXR1cm4gdGVzdENoaWxkOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXB1YmxpYyBUZXN0V29ya2JlbmNoTW9kZWwgdGVzdERlc2NlbmRhbnROYW1lZChTdHJpbmcgZGVzY2VuZGFudE5hbWUpIHsKLQkJCWZvciAoVGVzdFdvcmtiZW5jaE1vZGVsIHRlc3REZXNjZW5kYW50IDogdGhpcy50ZXN0Q2hpbGRyZW4pIHsKLQkJCQlpZiAodGVzdERlc2NlbmRhbnQuZ2V0TmFtZSgpLmVxdWFscyhkZXNjZW5kYW50TmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRlc3REZXNjZW5kYW50OwotCQkJCX0KLQkJCQkvLyByZWN1cnNlLi4uCi0JCQkJdGVzdERlc2NlbmRhbnQgPSB0ZXN0RGVzY2VuZGFudC50ZXN0RGVzY2VuZGFudE5hbWVkKGRlc2NlbmRhbnROYW1lKTsKLQkJCQlpZiAodGVzdERlc2NlbmRhbnQgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdGVzdERlc2NlbmRhbnQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkKLQkJLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZHJlblRvKExpc3Q8Tm9kZT4gY2hpbGRyZW4pIHsKLQkJCXN1cGVyLmFkZENoaWxkcmVuVG8oY2hpbGRyZW4pOwotCQkJY2hpbGRyZW4uYWRkQWxsKHRoaXMudGVzdENoaWxkcmVuKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvYmxlbXNUbyhMaXN0PFByb2JsZW0+IGN1cnJlbnRQcm9ibGVtcykgewotCQkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQkJLy8gbmFtZXMgbXVzdCBiZSBhbGwgbG93ZXJjYXNlLi4uCi0JCQlmb3IgKGludCBpID0gdGhpcy5uYW1lLmxlbmd0aCgpOyBpLS0gPiAwOyApIHsKLQkJCQljaGFyIGMgPSB0aGlzLm5hbWUuY2hhckF0KGkpOwotCQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXIoYykgJiYgISBDaGFyYWN0ZXIuaXNMb3dlckNhc2UoYykpIHsKLQkJCQkJY3VycmVudFByb2JsZW1zLmFkZCh0aGlzLmJ1aWxkUHJvYmxlbSgiTkFNRV9NVVNUX0JFX0xPV0VSQ0FTRSIsIDMgLHRoaXMubmFtZSkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBjbGFzcyBSb290VGVzdFdvcmtiZW5jaE1vZGVsIGV4dGVuZHMgVGVzdFdvcmtiZW5jaE1vZGVsIHsKLQkJcHVibGljIFJvb3RUZXN0V29ya2JlbmNoTW9kZWwoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKG51bGwsIG5hbWUpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJCXJldHVybiBOb2RlLk5VTExfVkFMSURBVE9SOwotCQl9Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9ub2RlL0pwdFV0aWxpdHlOb2RlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZmNmRjZS4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvbm9kZS9KcHRVdGlsaXR5Tm9kZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5ub2RlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlOb2RlVGVzdHMgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVdGlsaXR5Tm9kZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWJzdHJhY3ROb2RlVGVzdHMuY2xhc3MpOwotCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0VXRpbGl0eU5vZGVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9Bc3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkYmFkYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9Bc3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29tcG9zaXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db25zdW1lclRocmVhZENvb3JkaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuQXN5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuTXVsdGlUaHJlYWRlZFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWwxOwotCVNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbDE7Ci0JQ29tbWFuZCBjb21tYW5kMTsKLQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMTsKLQotCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMjsKLQlTZWNvbmRhcnlNb2RlbDIgc2Vjb25kYXJ5TW9kZWwyOwotCUNvbW1hbmQgY29tbWFuZDI7Ci0JU3luY2hyb25pemVyIHN5bmNocm9uaXplcjI7Ci0KLQlwdWJsaWMgQXN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxID0gbmV3IFByaW1hcnlNb2RlbDEoKTsKLQkJdGhpcy5zZWNvbmRhcnlNb2RlbDEgPSBuZXcgU2Vjb25kYXJ5TW9kZWwxKHRoaXMucHJpbWFyeU1vZGVsMSk7Ci0JCXRoaXMuY29tbWFuZDEgPSBuZXcgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxKHRoaXMuc2Vjb25kYXJ5TW9kZWwxKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxID0gbmV3IEFzeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmNvbW1hbmQxLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjEpOwotCi0JCXRoaXMucHJpbWFyeU1vZGVsMiA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCXRoaXMuc2Vjb25kYXJ5TW9kZWwyID0gbmV3IFNlY29uZGFyeU1vZGVsMih0aGlzLnByaW1hcnlNb2RlbDIpOwotCQl0aGlzLmNvbW1hbmQyID0gbmV3IFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMih0aGlzLnByaW1hcnlNb2RlbDIsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIyID0gbmV3IEFzeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmNvbW1hbmQyLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3luY2hyb25pemVyMS5zdG9wKCk7Ci0JCXRoaXMuc3luY2hyb25pemVyMi5zdG9wKCk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemF0aW9uKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotCQlhc3NlcnROb3ROdWxsKHRoaXMuc3luY2hyb25pemVyMS50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRoaXMuc3luY2hyb25pemVyMS5zdG9wKCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyByZS1zdGFydCBzbyB0ZWFyLWRvd24gd29ya3MKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIxKTsKLQkJLy8gdGhlIGFzeW5jIHN5bmNocm9uaXplciBkb2VzIG5vdCBzeW5jaHJvbml6ZSBhdCBzdGFydC11cAotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDgpOwotCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCXRoaXMuc3luY2hyb25pemVyMS5zdG9wKCk7Ci0JCXRoaXMuc2xlZXAoVElDSyk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDE2LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyByZS1zdGFydCBzbyB0ZWFyLWRvd24gd29ya3MKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuZGlzcG9zZSgpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyByZS1zdGFydCBzbyB0ZWFyLWRvd24gd29ya3MKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVN0YXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJdGhpcy5wcmltYXJ5TW9kZWwxLnN0YXJ0U3luY2hyb25pemVyKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0KLQkJdGhpcy5zbGVlcChUSUNLKTsKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0b3AoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHJlLXN0YXJ0IHNvIHRlYXItZG93biB3b3JrcwotCQl0aGlzLnN5bmNocm9uaXplcjEuc3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RG91YmxlU3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQotCQkvLyByZS1zdGFydCBzbyB0ZWFyLWRvd24gd29ya3MKLQkJdGhpcy5zeW5jaHJvbml6ZXIxLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZUNoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMi5zZXRDb3VudCg3KTsKLQotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQlhc3NlcnRFcXVhbHMoMTAsIHRoaXMucHJpbWFyeU1vZGVsMi5nZXRDb3VudFBsdXMzKCkpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwyLmdldERvdWJsZUNvdW50KCkpOwotCi0JCXRoaXMuc2xlZXAoVElDSyk7Ci0JCWFzc2VydEVxdWFscygyMCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbW1hbmQoKSB7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCVN5bmNocm9uaXplciBzID0gbmV3IEFzeW5jaHJvbm91c1N5bmNocm9uaXplcihudWxsLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpKTsKLQkJCWZhaWwoImJvZ3VzOiAiICsgcyk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7Ci0JCQlleENhdWdodCA9IHRydWU7Ci0JCX0KLQkJYXNzZXJ0VHJ1ZShleENhdWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRocmVhZE5hbWUoKSB7Ci0JCVN5bmNocm9uaXplciBzID0gbmV3IEFzeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmNvbW1hbmQxLCB0aGlzLmJ1aWxkVGhyZWFkRmFjdG9yeSgpLCAic3luYyIpOwotCQlzLnN0YXJ0KCk7Ci0JCUNvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IgY3RjID0gKENvbnN1bWVyVGhyZWFkQ29vcmRpbmF0b3IpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHMsICJjb25zdW1lclRocmVhZENvb3JkaW5hdG9yIik7Ci0JCVRocmVhZCB0ID0gKFRocmVhZCkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY3RjLCAidGhyZWFkIik7Ci0JCWFzc2VydEVxdWFscygic3luYyIsIHQuZ2V0TmFtZSgpKTsKLQkJcy5zdG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN5bmNocm9uaXplQ2FsbGVkQmVmb3JlU3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlQ29tbWFuZCBjb21tYW5kID0gbmV3IFNpbXBsZUNvbW1hbmQoKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IG5ldyBBc3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZCwgdGhpcy5idWlsZFRocmVhZEZhY3RvcnkoKSk7Ci0KLQkJc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCQl0aGlzLnNsZWVwKFRJQ0spOwotCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29tbWFuZC5jb3VudCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIFNpbXBsZUNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQm9ndXNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQm9ndXNDb21tYW5kKCk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBuZXcgQXN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQsIHRoaXMuYnVpbGRUaHJlYWRGYWN0b3J5KCkpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQotCQlzeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlzeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJdGhpcy5zbGVlcChUSUNLKTsKLQotCQlib29sZWFuIGV4Q2F1Z2h0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChDb21wb3NpdGVFeGNlcHRpb24gZXgpIHsKLQkJCWFzc2VydEVxdWFscygyLCBleC5nZXRFeGNlcHRpb25zKCkubGVuZ3RoKTsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbW1hbmQuY291bnQpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBCb2d1c0NvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJaW50IGNvdW50ID0gMDsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplIGNvbW1hbmRzICoqKioqKioqKioKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFN5bmNocm9uaXplU2Vjb25kYXJ5TW9kZWxDb21tYW5kMSBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlwcml2YXRlIGZpbmFsIFNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbDsKLQotCQlwdWJsaWMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxKFNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2Vjb25kYXJ5TW9kZWwgPSBzZWNvbmRhcnlNb2RlbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQl0aGlzLnNlY29uZGFyeU1vZGVsLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHRoZSBwcmltYXJ5IG1vZGVsIChzdWJjbGFzcykgaGFzIHRvIHN5bmNocm9uaXplIHdpdGggaXRzZWxmIChzdXBlcmNsYXNzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyIGV4dGVuZHMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxIHsKLQkJcHJpdmF0ZSBmaW5hbCBQcmltYXJ5TW9kZWwyIHByaW1hcnlNb2RlbDsKLQotCQlwdWJsaWMgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQyKFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsLCBTZWNvbmRhcnlNb2RlbDIgc2Vjb25kYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKHNlY29uZGFyeU1vZGVsKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsID0gcHJpbWFyeU1vZGVsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlzdXBlci5leGVjdXRlKCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbC5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaW1hcnkgbW9kZWxzICoqKioqKioqKioKLQkvKioKLQkgKiB0aGlzIG9iamVjdCB3aWxsIGNhbGwgdGhlIHN5bmNocm9uaXplciB3aGVuZXZlciBpdHMgY291bnQgY2hhbmdlcywKLQkgKiBhbGxvd2luZyBpbnRlcmVzdGVkIHBhcnRpZXMgdG8gc3luY2hyb25pemUgd2l0aCB0aGUgY2hhbmdlCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcmltYXJ5TW9kZWwxIHsKLQkJcHJvdGVjdGVkIFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXI7Ci0JCXByb3RlY3RlZCBpbnQgY291bnQgPSAyOwotCi0JCXB1YmxpYyBQcmltYXJ5TW9kZWwxKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuc2V0U3luY2hyb25pemVyXyhTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb3VudDsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXRDb3VudChpbnQgY291bnQpIHsKLQkJCWlmIChjb3VudCAhPSB0aGlzLmNvdW50KSB7Ci0JCQkJdGhpcy5jb3VudCA9IGNvdW50OwotCQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U3luY2hyb25pemVyKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJCWlmIChzeW5jaHJvbml6ZXIgPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJdGhpcy5zZXRTeW5jaHJvbml6ZXJfKHN5bmNocm9uaXplcik7Ci0JCX0KLQkJCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTeW5jaHJvbml6ZXJfKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyID0gc3luY2hyb25pemVyOwotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0U3luY2hyb25pemVyKCkgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIuc3RhcnQoKTsgIC8vIHRoaXMgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbgotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdG9wKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKCcoJyk7Ci0JCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKCJjb3VudD0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmNvdW50KTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtb2RlbCBzeW5jaHJvbml6ZXMgd2l0aCBpdHNlbGYsIHRyaWdnZXJpbmcgYSByZWN1cnNpdmUgc3luY2hyb25pemF0aW9uCi0JICogd2l0aCB0aGUgY2hhbmdlLiBXaGVuZXZlciB0aGUgW2luaGVyaXRlZF0gJ2NvdW50JyBjaGFuZ2VzLCAnY291bnRQbHVzMycKLQkgKiBpcyB1cGRhdGVkIGFwcHJvcHJpYXRlbHkgYW5kIGFub3RoZXIgc3luY2hyb25pemUgaXMgaW5pdGlhdGVkIGlmIGFwcHJvcHJpYXRlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJpbWFyeU1vZGVsMiBleHRlbmRzIFByaW1hcnlNb2RlbDEgewotCQlwcml2YXRlIGludCBjb3VudFBsdXMzID0gMDsKLQotCQlwdWJsaWMgUHJpbWFyeU1vZGVsMigpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmNvdW50UGx1czMgPSB0aGlzLmNvdW50ICsgMzsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Q291bnRQbHVzMygpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50UGx1czM7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgc2V0Q291bnRQbHVzMyhpbnQgY291bnRQbHVzMykgewotCQkJaWYgKGNvdW50UGx1czMgIT0gdGhpcy5jb3VudFBsdXMzKSB7Ci0JCQkJdGhpcy5jb3VudFBsdXMzID0gY291bnRQbHVzMzsKLQkJCQl0aGlzLnN0YXRlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJLy8gc3luY2hyb25pemUgd2l0aCBpdHNlbGYsIHNvIHRvIHNwZWFrCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5zZXRDb3VudFBsdXMzKHRoaXMuY291bnQgKyAzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoIiwgY291bnRQbHVzMz0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmNvdW50UGx1czMpOwotCQl9Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHNlY29uZGFyeSBtb2RlbHMgKioqKioqKioqKgotCS8qKgotCSAqIFRoaXMgZGVwZW5kZW50IG9iamVjdCB1cGRhdGVzIGl0cyAnZG91YmxlQ291bnQnIHdoZW5ldmVyIHRoZQotCSAqIFByaW1hcnlNb2RlbDEncyAnY291bnQnIGNoYW5nZXMsIHZpYSB0aGUgJ3N5bmNocm9uaXplcicuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDEgewotCQlwcm90ZWN0ZWQgZmluYWwgUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWw7Ci0JCXByb3RlY3RlZCBpbnQgZG91YmxlQ291bnQgPSAwOwotCi0JCXB1YmxpYyBTZWNvbmRhcnlNb2RlbDEoUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByaW1hcnlNb2RlbCA9IHByaW1hcnlNb2RlbDsKLQkJCXRoaXMuc3luY2hyb25pemUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplKCkgewotCQkJdGhpcy5kb3VibGVDb3VudCA9IHRoaXMucHJpbWFyeU1vZGVsLmdldENvdW50KCkgKiAyOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXREb3VibGVDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmRvdWJsZUNvdW50OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJCXNiLmFwcGVuZCgnKCcpOwotCQkJdGhpcy50b1N0cmluZyhzYik7Ci0JCQlzYi5hcHBlbmQoJyknKTsKLQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXNiLmFwcGVuZCgiZG91YmxlQ291bnQ9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5kb3VibGVDb3VudCk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2Vjb25kYXJ5TW9kZWwyIGV4dGVuZHMgU2Vjb25kYXJ5TW9kZWwxIHsKLQkJcHJpdmF0ZSBpbnQgZG91YmxlQ291bnRQbHVzMyA9IDA7Ci0KLQkJcHVibGljIFNlY29uZGFyeU1vZGVsMihQcmltYXJ5TW9kZWwyIGV4dGVuZGVkUHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcihleHRlbmRlZFByaW1hcnlNb2RlbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgUHJpbWFyeU1vZGVsMiBnZXRFeHRlbmRlZFByaW1hcnlNb2RlbCgpIHsKLQkJCXJldHVybiAoUHJpbWFyeU1vZGVsMikgdGhpcy5wcmltYXJ5TW9kZWw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQlzdXBlci5zeW5jaHJvbml6ZSgpOwotCQkJaW50IHRlbXAgPSB0aGlzLmdldEV4dGVuZGVkUHJpbWFyeU1vZGVsKCkuZ2V0Q291bnRQbHVzMygpICogMjsKLQkJCWlmICh0aGlzLmRvdWJsZUNvdW50UGx1czMgIT0gdGVtcCkgewotCQkJCXRoaXMuZG91YmxlQ291bnRQbHVzMyA9IHRlbXA7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERvdWJsZUNvdW50UGx1czMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kb3VibGVDb3VudFBsdXMzOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgiLCBkb3VibGVDb3VudFBsdXMzPSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuZG91YmxlQ291bnRQbHVzMyk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5qYXZhIGIvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvSnB0VXRpbGl0eVN5bmNocm9uaXplcnNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFjZjMwLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL0pwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9uaXplclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFN5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuY2xhc3MpOwotCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdFV0aWxpdHlTeW5jaHJvbml6ZXJzVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9uaXplclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmN2M2N2IuLjAwMDAwMDAKLS0tIGEvY29tbW9uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5L3Rlc3RzL2ludGVybmFsL3N5bmNocm9uaXplcnMvU3luY2hyb25pemVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLnN5bmNocm9uaXplcnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotCi1wdWJsaWMgY2xhc3MgU3luY2hyb25pemVyVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgU3luY2hyb25pemVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTeW5jaHJvbml6ZXJTdGFydCgpIHsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOyAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG93IHVwPwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3luY2hyb25pemVyU3luY2hyb25pemUoKSB7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlzeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsgIC8vIGp1c3QgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYmxvdyB1cD8KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFN5bmNocm9uaXplclN0b3AoKSB7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlzeW5jaHJvbml6ZXIuc3RvcCgpOyAgLy8ganVzdCBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG93IHVwPwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsU3luY2hyb25pemVyVG9TdHJpbmcoKSB7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpOwotCQlhc3NlcnROb3ROdWxsKHN5bmNocm9uaXplci50b1N0cmluZygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YSBiL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS90ZXN0cy9pbnRlcm5hbC9zeW5jaHJvbml6ZXJzL1N5bmNocm9ub3VzU3luY2hyb25pemVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc2MDFiYy4uMDAwMDAwMAotLS0gYS9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvdGVzdHMvaW50ZXJuYWwvc3luY2hyb25pemVycy9TeW5jaHJvbm91c1N5bmNocm9uaXplclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMuaW50ZXJuYWwuc3luY2hyb25pemVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db21wb3NpdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuU3luY2hyb25vdXNTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cy5pbnRlcm5hbC5NdWx0aVRocmVhZGVkVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzLmludGVybmFsLlRlc3RUb29sczsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cwotCWV4dGVuZHMgTXVsdGlUaHJlYWRlZFRlc3RDYXNlCi17Ci0JUHJpbWFyeU1vZGVsMSBwcmltYXJ5TW9kZWwxOwotCVNlY29uZGFyeU1vZGVsMSBzZWNvbmRhcnlNb2RlbDE7Ci0JQ29tbWFuZCBjb21tYW5kMTsKLQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyMTsKLQotCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMjsKLQlTZWNvbmRhcnlNb2RlbDIgc2Vjb25kYXJ5TW9kZWwyOwotCUNvbW1hbmQgY29tbWFuZDI7Ci0JU3luY2hyb25pemVyIHN5bmNocm9uaXplcjI7Ci0KLQlwdWJsaWMgU3luY2hyb25vdXNTeW5jaHJvbml6ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEgPSBuZXcgUHJpbWFyeU1vZGVsMSgpOwotCQl0aGlzLnNlY29uZGFyeU1vZGVsMSA9IG5ldyBTZWNvbmRhcnlNb2RlbDEodGhpcy5wcmltYXJ5TW9kZWwxKTsKLQkJdGhpcy5jb21tYW5kMSA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEodGhpcy5zZWNvbmRhcnlNb2RlbDEpOwotCQl0aGlzLnN5bmNocm9uaXplcjEgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5jb21tYW5kMSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIodGhpcy5zeW5jaHJvbml6ZXIxKTsKLQotCQl0aGlzLnByaW1hcnlNb2RlbDIgPSBuZXcgUHJpbWFyeU1vZGVsMigpOwotCQl0aGlzLnNlY29uZGFyeU1vZGVsMiA9IG5ldyBTZWNvbmRhcnlNb2RlbDIodGhpcy5wcmltYXJ5TW9kZWwyKTsKLQkJdGhpcy5jb21tYW5kMiA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIodGhpcy5wcmltYXJ5TW9kZWwyLCB0aGlzLnNlY29uZGFyeU1vZGVsMik7Ci0JCXRoaXMuc3luY2hyb25pemVyMiA9IG5ldyBTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmNvbW1hbmQyKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwyLnNldFN5bmNocm9uaXplcih0aGlzLnN5bmNocm9uaXplcjIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXphdGlvbigpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnN5bmNocm9uaXplcjEudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YXJ0KCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0U3luY2hyb25pemVyKHRoaXMuc3luY2hyb25pemVyMSk7Ci0JCWFzc2VydEVxdWFscygxNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0b3AoKSB7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLmRpc3Bvc2UoKTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERvdWJsZVN0YXJ0KCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMucHJpbWFyeU1vZGVsMS5zdGFydFN5bmNocm9uaXplcigpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJdGhpcy5wcmltYXJ5TW9kZWwxLnNldENvdW50KDcpOwotCQlhc3NlcnRFcXVhbHMoMTQsIHRoaXMuc2Vjb25kYXJ5TW9kZWwxLmdldERvdWJsZUNvdW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVTdG9wKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDEuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCWJvb2xlYW4gZXhDYXVnaHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXRoaXMucHJpbWFyeU1vZGVsMS5kaXNwb3NlKCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJZXhDYXVnaHQgPSB0cnVlOwotCQl9Ci0JCWFzc2VydFRydWUoZXhDYXVnaHQpOwotCQl0aGlzLnByaW1hcnlNb2RlbDEuc2V0Q291bnQoNyk7Ci0JCWFzc2VydEVxdWFscyg0LCB0aGlzLnNlY29uZGFyeU1vZGVsMS5nZXREb3VibGVDb3VudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlQ2hhbmdlKCkgewotCQlhc3NlcnRFcXVhbHMoNCwgdGhpcy5zZWNvbmRhcnlNb2RlbDIuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCXRoaXMucHJpbWFyeU1vZGVsMi5zZXRDb3VudCg3KTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCB0aGlzLnByaW1hcnlNb2RlbDIuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIwLCB0aGlzLnNlY29uZGFyeU1vZGVsMi5nZXREb3VibGVDb3VudFBsdXMzKCkpOwotCX0KLQotCS8qKgotCSAqIENhbGwgI3N0b3AoKSBmcm9tIGFub3RoZXIgdGhyZWFkLgotCSAqIFZlcmlmeSB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4KLQkgKiBWZXJpZnkgdGhlIGNhbGwgdG8gI3N0b3AoKSBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIHBlbmRpbmcKLQkgKiBzeW5jaHJvbml6YXRpb24gaXMgY29tcGxldGUgKG11c3Qgc2V0IHtAbGluayAjREVCVUd9IHRvIHRydWUgYW5kCi0JICogbG9vayBhdCB0aGUgY29uc29sZSkuCi0JICogCi0JICogdGlja3M6Ci0JICogMCAtIHN0YXJ0ICJzeW5jIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDEgdGljayk7Ci0JICogICAgICBzdGFydCAic3RvcCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAyIHRpY2tzKQotCSAqIDEgLSAic3luYyIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBQcmltYXJ5TW9kZWwxLnNldENvdW50KGludCkKLQkgKiAgICAgIHdoaWNoIHRyaWdnZXJzIGNhbGwgdG8gU3luY2hyb25pemVyLnN5bmNocm9uaXplKCkgdG8gYmVnaW4KLQkgKiAgICAgIHN5bmNocm9uaXphdGlvbiBvZiBTZWNvbmRhcnlNb2RlbCAod2hpY2ggd2lsbCBydW4gZm9yIDIgdGlja3M7Ci0JICogICAgICBpLmUuIGl0IHdpbGwgZmluaXNoIG9uIHRpY2sgMykKLQkgKiAyIC0gInN0b3AiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0b3AoKSBhbmQgc2hvdWxkCi0JICogICAgICB3YWl0IHVudGlsIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZQotCSAqIDMgLSBzeW5jaHJvbml6YXRpb24gY29tcGxldGVzIGZpcnN0IGV4ZWN1dGlvbiBhbmQgc2hvdWxkIHN0b3A7Ci0JICogICAgICAic3RvcCIgdGhyZWFkIHNob3VsZCBydW4gdG8gY29tcGxldGlvbiBvbmNlIHRoZSBzeW5jaHJvbml6YXRpb24gaGFzIHN0b3BwZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FsbFN0b3BGcm9tQW5vdGhlclRocmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2coIj09PT09IiArIHRoaXMuZ2V0TmFtZSgpICsgIj09PT09Iik7Ci0JCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMyA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCS8vIGEgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlTZWNvbmRhcnlNb2RlbDMgc2Vjb25kYXJ5TW9kZWwzID0gbmV3IFNlY29uZGFyeU1vZGVsMyhwcmltYXJ5TW9kZWwzKTsKLQkJQ29tbWFuZCBjb21tYW5kMyA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIocHJpbWFyeU1vZGVsMywgc2Vjb25kYXJ5TW9kZWwzKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplcjMgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZDMpOwotCQkvLyBhbm90aGVyIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJcHJpbWFyeU1vZGVsMy5zZXRTeW5jaHJvbml6ZXIoc3luY2hyb25pemVyMyk7Ci0JCXNlY29uZGFyeU1vZGVsMy5zZXRUaWNrcygyKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQocHJpbWFyeU1vZGVsMywgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyMywgMik7Ci0KLQkJbG9nKCJBTEwgdGhyZWFkcyBzdGFydCIpOwotCQlzdG9wVGhyZWFkLnN0YXJ0KCk7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQotCQlzdG9wVGhyZWFkLmpvaW4oKTsKLQkJc3luY1RocmVhZC5qb2luKCk7Ci0KLQkJLy8gJ2RvdWJsZUNvdW50JyBpcyBzeW5jaHJvbml6ZWQ7IGJ1dCB0aGUgc3luY2hyb25pemF0aW9uIGlzIHN0b3BwZWQKLQkJLy8gd2hpbGUgdGhhdCBpcyBoYXBwZW5pbmcgKGJ5IHRoZSAnc3RvcFRocmVhZCcpLCBzbyAnZG91YmxlQ291bnRQbHVzMycKLQkJLy8gZG9lcyBub3QgZ2V0IHN5bmNocm9uaXplZAotCQlhc3NlcnRFcXVhbHMoNywgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0JCWFzc2VydEVxdWFscygxNCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50KCkpOwotCi0JCS8vIHRoaXMgZG9lcyBub3QgZ2V0IHVwZGF0ZWQgYmVjYXVzZSBpdCB3b3VsZCd2ZSBiZWVuIHVwZGF0ZWQgYnkgdGhlCi0JCS8vIHJlY3Vyc2l2ZSBjYWxsIHRvICNzeW5jaHJvbml6ZSgpLCBidXQgYnkgdGhhdCB0aW1lICNzdG9wKCkgaGFkIGJlZW4gY2FsbGVkCi0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQoUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwsIGxvbmcgdGlja3MpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRUaHJlYWQodGhpcy5idWlsZFRyaWdnZXJTeW5jaHJvbml6ZVJ1bm5hYmxlKHByaW1hcnlNb2RlbCwgdGlja3MpLCAidHJpZ2dlciBzeW5jIik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFRyaWdnZXJTeW5jaHJvbml6ZVJ1bm5hYmxlKGZpbmFsIFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJcHJpbWFyeU1vZGVsLnNldENvdW50KDcpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkU3RvcFRocmVhZChTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRTdG9wUnVubmFibGUoc3luY2hyb25pemVyLCB0aWNrcyksICJzdG9wIik7Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFN0b3BSdW5uYWJsZShmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJbG9nKCJTVE9QIHRocmVhZCBTeW5jaHJvbml6ZXIuc3RvcCgpIik7Ci0JCQkJc3luY2hyb25pemVyLnN0b3AoKTsKLQkJCQlsb2coIlNUT1AgdGhyZWFkIHN0b3AiKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBDb2RlIGNsb25lZCBmcm9tIHtAbGluayAjdGVzdFN0b3BDYWxsZWRGcm9tQW5vdGhlclRocmVhZCgpfS4KLQkgKiAKLQkgKiBJbnRlcnJ1cHQgdGhlICJzdG9wIiB0aHJlYWQgd2hpbGUgaXQgaXMgd2FpdGluZyBmb3IgdGhlICJzeW5jaCIgdGhyZWFkIHRvIGZpbmlzaC4KLQkgKiBWZXJpZnkgdGhhdCBubyBmdXJ0aGVyIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuCi0JICogVmVyaWZ5IHRoZSBjYWxsIHRvICNzdG9wKCkgcmV0dXJucyAqYmVmb3JlKgotCSAqIHN5bmNocm9uaXphdGlvbiBpcyBjb21wbGV0ZSAobXVzdCBzZXQge0BsaW5rICNERUJVR30gdG8gdHJ1ZSBhbmQKLQkgKiBsb29rIGF0IHRoZSBjb25zb2xlKS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKTsKLQkgKiAgICAgIHN0YXJ0ICJzdG9wIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDIgdGlja3MpOwotCSAqICAgICAgc3RhcnQgImludGVycnVwdCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAzIHRpY2tzKQotCSAqIDEgLSAic3luYyIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBQcmltYXJ5TW9kZWwxLnNldENvdW50KGludCkKLQkgKiAgICAgIHdoaWNoIHRyaWdnZXJzIGNhbGwgdG8gU3luY2hyb25pemVyLnN5bmNocm9uaXplKCkgdG8gYmVnaW4KLQkgKiAgICAgIHN5bmNocm9uaXphdGlvbiBvZiBTZWNvbmRhcnlNb2RlbCAod2hpY2ggd2lsbCBydW4gZm9yIDMgdGlja3M7Ci0JICogICAgICBpLmUuIGl0IHdpbGwgZmluaXNoIG9uIHRpY2sgNCkKLQkgKiAyIC0gInN0b3AiIHRocmVhZCB3YWtlcyB1cCBhbmQgY2FsbHMgU3luY2hyb25pemVyLnN0b3AoKSBhbmQgc2hvdWxkCi0JICogICAgICB3YWl0IHVudGlsIGl0IGlzIGludGVycnVwdGVkCi0JICogMyAtICJpbnRlcnJ1cHQiIHRocmVhZCB3YWtlcyB1cCBhbmQgaW50ZXJydXB0cyAic3RvcCIgdGhyZWFkOwotCSAqICAgICAgIGJvdGggd2lsbCBydW4gdG8gY29tcGxldGlvbiBhdCB0aGF0IHBvaW50Ci0JICogNCAtIHN5bmNocm9uaXphdGlvbiBjb21wbGV0ZXMgZmlyc3QgZXhlY3V0aW9uIGFuZCBzaG91bGQgc3RvcCBzaW5jZSB0aGUKLQkgKiAgICAgICJzdG9wIiB0aHJlYWQsIGJlZm9yZSBpdCB3YXMgaW50ZXJydXB0ZWQsIHRvbGQgdGhlICJzeW5jaCIgdGhyZWFkIHRvIHN0b3AKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0U3RvcFRocmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2coIj09PT09IiArIHRoaXMuZ2V0TmFtZSgpICsgIj09PT09Iik7Ci0JCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMyA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCS8vIGEgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlTZWNvbmRhcnlNb2RlbDMgc2Vjb25kYXJ5TW9kZWwzID0gbmV3IFNlY29uZGFyeU1vZGVsMyhwcmltYXJ5TW9kZWwzKTsKLQkJQ29tbWFuZCBjb21tYW5kMyA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIocHJpbWFyeU1vZGVsMywgc2Vjb25kYXJ5TW9kZWwzKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplcjMgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZDMpOwotCQkvLyBhbm90aGVyIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJcHJpbWFyeU1vZGVsMy5zZXRTeW5jaHJvbml6ZXIoc3luY2hyb25pemVyMyk7Ci0JCXNlY29uZGFyeU1vZGVsMy5zZXRUaWNrcygzKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQocHJpbWFyeU1vZGVsMywgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyMywgMik7Ci0JCVRocmVhZCBpbnRlcnJ1cHRUaHJlYWQgPSB0aGlzLmJ1aWxkSW50ZXJydXB0VGhyZWFkKHN0b3BUaHJlYWQsIDMpOwotCi0JCWxvZygiQUxMIHRocmVhZHMgc3RhcnQiKTsKLQkJc3RvcFRocmVhZC5zdGFydCgpOwotCQlzeW5jVGhyZWFkLnN0YXJ0KCk7Ci0JCWludGVycnVwdFRocmVhZC5zdGFydCgpOwotCi0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzeW5jVGhyZWFkLmpvaW4oKTsKLQkJaW50ZXJydXB0VGhyZWFkLmpvaW4oKTsKLQotCQkvLyAnZG91YmxlQ291bnQnIGlzIHN5bmNocm9uaXplZDsgYnV0IHRoZSBzeW5jaHJvbml6YXRpb24gaXMgc3RvcHBlZAotCQkvLyB3aGlsZSB0aGF0IGlzIGhhcHBlbmluZyAoYnkgdGhlICdzdG9wVGhyZWFkJyksIHNvICdkb3VibGVDb3VudFBsdXMzJwotCQkvLyBkb2VzIG5vdCBnZXQgc3luY2hyb25pemVkCi0JCWFzc2VydEVxdWFscyg3LCBwcmltYXJ5TW9kZWwzLmdldENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDE0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0KLQkJLy8gdGhpcyBkb2VzIG5vdCBnZXQgdXBkYXRlZCBiZWNhdXNlIGl0IHdvdWxkJ3ZlIGJlZW4gdXBkYXRlZCBieSB0aGUKLQkJLy8gcmVjdXJzaXZlIGNhbGwgdG8gI3N5bmNocm9uaXplKCksIGJ1dCBieSB0aGF0IHRpbWUgI3N0b3AoKSBoYWQgYmVlbiBjYWxsZWQKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2RlIGNsb25lZCBmcm9tIHtAbGluayAjdGVzdFN0b3BDYWxsZWRGcm9tQW5vdGhlclRocmVhZCgpfS4KLQkgKiAKLQkgKiBJbnRlcnJ1cHQgdGhlICJzeW5jIiB0aHJlYWQgd2hpbGUgaXQgaXMgc3luY2hyb25pemluZywgY3V0dGluZyBzaG9ydCB0aGUgc3luY2hyb25pemF0aW9uLgotCSAqIFZlcmlmeSB0aGF0IG5vIGZ1cnRoZXIgc3luY2hyb25pemF0aW9ucyBvY2N1ci4KLQkgKiBWZXJpZnkgdGhlIGNhbGwgdG8gI3N0b3AoKSBkb2VzIG5vdCByZXR1cm4gdW50aWwgdGhlIHBlbmRpbmcKLQkgKiBzeW5jaHJvbml6YXRpb24gaXMgc3RvcHMgYWZ0ZXIgaXQgaXMgaW50ZXJydXB0ZWQgKG11c3Qgc2V0IHtAbGluayAjREVCVUd9IHRvIHRydWUgYW5kCi0JICogbG9vayBhdCB0aGUgY29uc29sZSkuCi0JICogCi0JICogdGlja3M6Ci0JICogMCAtIHN0YXJ0ICJzeW5jIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDEgdGljaykKLQkgKiAgICAgIHN0YXJ0ICJzdG9wIiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDIgdGlja3MpCi0JICogICAgICBzdGFydCAiaW50ZXJydXB0IiB0aHJlYWQgKHdoaWNoIHdpbGwgc2xlZXAgZm9yIDMgdGlja3MpCi0JICogMSAtICJzeW5jIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFByaW1hcnlNb2RlbDEuc2V0Q291bnQoaW50KQotCSAqICAgICAgd2hpY2ggdHJpZ2dlcnMgY2FsbCB0byBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uIG9mIFNlY29uZGFyeU1vZGVsICh3aGljaCB3aWxsIHJ1biBmb3IgNCB0aWNrczsKLQkgKiAgICAgIGkuZS4gaXQgd2lsbCBmaW5pc2ggb24gdGljayA1KQotCSAqIDIgLSAic3RvcCIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3RvcCgpIGFuZCBzaG91bGQKLQkgKiAgICAgIHdhaXQgdW50aWwgdGhlIHN5bmNocm9uaXphdGlvbiBpcyBpbnRlcnJ1cHRlZAotCSAqIDMgLSAiaW50ZXJydXB0IiB0aHJlYWQgd2FrZXMgdXAgYW5kIGludGVycnVwdHMgInN5bmMiIHRocmVhZDsKLQkgKiAgICAgIHRoZSAiaW50ZXJydXB0IiB0aHJlYWQgcnVucyB0byBjb21wbGV0aW9uLCB3aGlsZSB0aGUgInN5bmMiIHRocmVhZCBrZWVwcwotCSAqICAgICAgZ29pbmcgZm9yIGFub3RoZXIgdGljayBiZWZvcmUgaXQgc3RvcHMgaW4gIm1pZC1zeW5jaHJvbml6ZSIKLQkgKiA0IC0gdGhlICJzeW5jIiB0aHJlYWQgYWNrbm93bGVkZ2VzIHRoZSBpbnRlcnJ1cHQgYW5kIHN0b3BzIGluCi0JICogICAgICAibWlkLXN5bmNocm9uaXplIjsgaXQgd2lsbCBzdG9wIHNpbmNlIHRoZSAic3RvcCIgdGhyZWFkIHRvbGQgaXQgdG8gYXQgdGljayAyOwotCSAqICAgICAgdGhlICJzeW5jIiBhbmQgInN0b3AiIHRocmVhZHMgcnVuIHRvIGNvbXBsZXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0U3luY1RocmVhZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlsb2coIj09PT09IiArIHRoaXMuZ2V0TmFtZSgpICsgIj09PT09Iik7Ci0JCVByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsMyA9IG5ldyBQcmltYXJ5TW9kZWwyKCk7Ci0JCS8vIGEgc3luY2hyb25pemUgd2lsbCBvY2N1ciBoZXJlOgotCQlTZWNvbmRhcnlNb2RlbDMgc2Vjb25kYXJ5TW9kZWwzID0gbmV3IFNlY29uZGFyeU1vZGVsMyhwcmltYXJ5TW9kZWwzKTsKLQkJQ29tbWFuZCBjb21tYW5kMyA9IG5ldyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIocHJpbWFyeU1vZGVsMywgc2Vjb25kYXJ5TW9kZWwzKTsKLQkJU3luY2hyb25pemVyIHN5bmNocm9uaXplcjMgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZDMpOwotCQkvLyBhbm90aGVyIHN5bmNocm9uaXplIHdpbGwgb2NjdXIgaGVyZToKLQkJcHJpbWFyeU1vZGVsMy5zZXRTeW5jaHJvbml6ZXIoc3luY2hyb25pemVyMyk7Ci0JCXNlY29uZGFyeU1vZGVsMy5zZXRUaWNrcyg0KTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHByaW1hcnlNb2RlbDMuZ2V0Q291bnRQbHVzMygpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIHNlY29uZGFyeU1vZGVsMy5nZXREb3VibGVDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnRQbHVzMygpKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRUcmlnZ2VyU3luY2hyb25pemVUaHJlYWQocHJpbWFyeU1vZGVsMywgMSk7Ci0JCVRocmVhZCBzdG9wVGhyZWFkID0gdGhpcy5idWlsZFN0b3BUaHJlYWQoc3luY2hyb25pemVyMywgMik7Ci0JCVRocmVhZCBpbnRlcnJ1cHRUaHJlYWQgPSB0aGlzLmJ1aWxkSW50ZXJydXB0VGhyZWFkKHN5bmNUaHJlYWQsIDMpOwotCi0JCWxvZygiQUxMIHRocmVhZHMgc3RhcnQiKTsKLQkJc3RvcFRocmVhZC5zdGFydCgpOwotCQlzeW5jVGhyZWFkLnN0YXJ0KCk7Ci0JCWludGVycnVwdFRocmVhZC5zdGFydCgpOwotCi0JCXN0b3BUaHJlYWQuam9pbigpOwotCQlzeW5jVGhyZWFkLmpvaW4oKTsKLQkJaW50ZXJydXB0VGhyZWFkLmpvaW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoNywgcHJpbWFyeU1vZGVsMy5nZXRDb3VudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwLCBwcmltYXJ5TW9kZWwzLmdldENvdW50UGx1czMoKSk7Ci0KLQkJLy8gbm9uZSBvZiB0aGUgc2Vjb25kYXJ5IG1vZGVsIGlzIHN5bmNocm9uaXplZCBiZWNhdXNlIHRoZSBzeW5jaHJvbml6ZSgpCi0JCS8vIG1ldGhvZCB3YXMgaW50ZXJydXB0ZWQgYmVmb3JlIGFueSBzeW5jaHJvbml6YXRpb24gaGFkIG9jY3VycmVkCi0JCWFzc2VydEVxdWFscyg0LCBzZWNvbmRhcnlNb2RlbDMuZ2V0RG91YmxlQ291bnQoKSk7Ci0JCWFzc2VydEVxdWFscygxMCwgc2Vjb25kYXJ5TW9kZWwzLmdldERvdWJsZUNvdW50UGx1czMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRJbnRlcnJ1cHRUaHJlYWQoVGhyZWFkIHRocmVhZCwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkSW50ZXJydXB0UnVubmFibGUodGhyZWFkLCB0aWNrcyksICJpbnRlcnJ1cHQiKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkSW50ZXJydXB0UnVubmFibGUoZmluYWwgVGhyZWFkIHRocmVhZCwgZmluYWwgbG9uZyB0aWNrcykgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVRlc3RUb29scy5zbGVlcCh0aWNrcyAqIFRJQ0spOwotCQkJCWxvZygiSU5URVJSVVBUIHRocmVhZCBUaHJlYWQuaW50ZXJydXB0KCkiKTsKLQkJCQl0aHJlYWQuaW50ZXJydXB0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ2FsbCAjc3RvcCgpIGR1cmluZyBhIGxvbmctcnVubmluZyAic3luY2hyb25pemUiOyB0aGVuIGNhbGwgI3N0YXJ0KCkKLQkgKiB3aGlsZSB0aGUgI3N0b3AoKSBpcyB3YWl0aW5nIGZvciB0aGUgInN5bmNocm9uaXplIiB0byBjb21wbGV0ZS4KLQkgKiAKLQkgKiB0aWNrczoKLQkgKiAwIC0gc3RhcnQgInN5bmMiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMSB0aWNrKQotCSAqICAgICAgc3RhcnQgInN0b3AiIHRocmVhZCAod2hpY2ggd2lsbCBzbGVlcCBmb3IgMiB0aWNrcykKLQkgKiAgICAgIHN0YXJ0ICJzdGFydCIgdGhyZWFkICh3aGljaCB3aWxsIHNsZWVwIGZvciAzIHRpY2tzKQotCSAqIDEgLSAic3luYyIgdGhyZWFkIHdha2VzIHVwIGFuZCBjYWxscyBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSB0byBiZWdpbgotCSAqICAgICAgc3luY2hyb25pemF0aW9uICh3aGljaCB3aWxsIHJ1biBmb3IgMyB0aWNrczsgaS5lLiBpdCB3aWxsIGZpbmlzaCBvbiB0aWNrIDQpCi0JICogMiAtICJzdG9wIiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdG9wKCkgYW5kIHNob3VsZAotCSAqICAgICAgd2FpdCB1bnRpbCB0aGUgc3luY2hyb25pemF0aW9uIGlzIGZpbmlzaGVkIChpLmUuIHRpY2sgNCkKLQkgKiAzIC0gInN0YXJ0IiB0aHJlYWQgd2FrZXMgdXAgYW5kIGNhbGxzIFN5bmNocm9uaXplci5zdGFydCgpCi0JICogICAgICB3aGljaCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbgotCSAqIDQgLSB0aGUgInN5bmMiIHRocmVhZCBmaW5pc2hlcyBleGVjdXRpb247Ci0JICogICAgICBpdCB3aWxsIHN0b3Agc2luY2UgdGhlICJzdG9wIiB0aHJlYWQgdG9sZCBpdCB0byBhdCB0aWNrIDI7Ci0JICogICAgICB0aGUgInN5bmMiIGFuZCAic3RvcCIgdGhyZWFkcyBydW4gdG8gY29tcGxldGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RDYWxsU3RhcnREdXJpbmdTdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvZygiPT09PT0iICsgdGhpcy5nZXROYW1lKCkgKyAiPT09PT0iKTsKLQkJRGVsYXlDb21tYW5kIGNvbW1hbmQgPSB0aGlzLmJ1aWxkRGVsYXlDb21tYW5kKDMpOwotCQlTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKGNvbW1hbmQpOwotCQlzeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQotCQlUaHJlYWQgc3luY1RocmVhZCA9IHRoaXMuYnVpbGRTeW5jaHJvbml6ZVRocmVhZChzeW5jaHJvbml6ZXIsIDEpOwotCQlUaHJlYWQgc3RvcFRocmVhZCA9IHRoaXMuYnVpbGRTdG9wVGhyZWFkKHN5bmNocm9uaXplciwgMik7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gZXhDYXVnaHQgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihmYWxzZSk7Ci0JCVRocmVhZCBzdGFydFRocmVhZCA9IHRoaXMuYnVpbGRTdGFydFRocmVhZChzeW5jaHJvbml6ZXIsIDMsIGV4Q2F1Z2h0KTsKLQotCQlsb2coIkFMTCB0aHJlYWRzIHN0YXJ0Iik7Ci0JCXN5bmNUaHJlYWQuc3RhcnQoKTsKLQkJc3RvcFRocmVhZC5zdGFydCgpOwotCQlzdGFydFRocmVhZC5zdGFydCgpOwotCi0JCXN5bmNUaHJlYWQuam9pbigpOwotCQlzdG9wVGhyZWFkLmpvaW4oKTsKLQkJc3RhcnRUaHJlYWQuam9pbigpOwotCi0JCWFzc2VydFRydWUoZXhDYXVnaHQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb21tYW5kLmNvdW50KTsKLQl9Ci0KLQlwcml2YXRlIERlbGF5Q29tbWFuZCBidWlsZERlbGF5Q29tbWFuZChpbnQgdGlja3MpIHsKLQkJcmV0dXJuIG5ldyBEZWxheUNvbW1hbmQodGlja3MpOwotCX0KLQotCWNsYXNzIERlbGF5Q29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlmaW5hbCBsb25nIHRpY2tzOwotCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJaW50IGNvdW50ID0gMDsKLQotCQlEZWxheUNvbW1hbmQoaW50IHRpY2tzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy50aWNrcyA9IHRpY2tzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuY291bnQrKzsKLQkJCS8vIGRvIG5vdGhpbmcgZm9yIHRoZSBmaXJzdCBjYWxsIChmcm9tICNzdGFydCgpKQotCQkJaWYgKHRoaXMuZmlyc3QpIHsKLQkJCQlsb2coIkVYRUMgZmlyc3QiKTsKLQkJCQl0aGlzLmZpcnN0ID0gZmFsc2U7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJbG9nKCJFWEVDIHN0YXJ0ICIgKyB0aGlzLmNvdW50KTsKLQkJCVRlc3RUb29scy5zbGVlcCh0aGlzLnRpY2tzICogVElDSyk7Ci0JCQlsb2coIkVYRUMgc3RvcCAiICsgdGhpcy5jb3VudCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgVGhyZWFkIGJ1aWxkU3RhcnRUaHJlYWQoU3luY2hyb25pemVyIHN5bmNocm9uaXplciwgbG9uZyB0aWNrcywgU3luY2hyb25pemVkQm9vbGVhbiBleENhdWdodCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFRocmVhZCh0aGlzLmJ1aWxkU3RhcnRSdW5uYWJsZShzeW5jaHJvbml6ZXIsIHRpY2tzLCBleENhdWdodCksICJzdGFydCIpOwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTdGFydFJ1bm5hYmxlKGZpbmFsIFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIsIGZpbmFsIGxvbmcgdGlja3MsIGZpbmFsIFN5bmNocm9uaXplZEJvb2xlYW4gZXhDYXVnaHQpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlUZXN0VG9vbHMuc2xlZXAodGlja3MgKiBUSUNLKTsKLQkJCQlsb2coIlNUQVJUIHRocmVhZCBTeW5jaHJvbml6ZXIuc3RhcnQoKSIpOwotCQkJCXRyeSB7Ci0JCQkJCXN5bmNocm9uaXplci5zdGFydCgpOwotCQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgewotCQkJCQlleENhdWdodC5zZXRUcnVlKCk7Ci0JCQkJCWxvZygiU1RBUlQgdGhyZWFkIGV4Y2VwdGlvbiIpOwotCQkJCX0KLQkJCQlsb2coIlNUQVJUIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUaHJlYWQgYnVpbGRTeW5jaHJvbml6ZVRocmVhZChTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGhyZWFkKHRoaXMuYnVpbGRTeW5jaHJvbml6ZVJ1bm5hYmxlKHN5bmNocm9uaXplciwgdGlja3MpLCAic3luY2hyb25pemUiKTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkU3luY2hyb25pemVSdW5uYWJsZShmaW5hbCBTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyLCBmaW5hbCBsb25nIHRpY2tzKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGVzdFRvb2xzLnNsZWVwKHRpY2tzICogVElDSyk7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKSIpOwotCQkJCXN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQkJCWxvZygiU1lOQyB0aHJlYWQgc3RvcCIpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQm9ndXNDb21tYW5kIGNvbW1hbmQgPSBuZXcgQm9ndXNDb21tYW5kKCk7Ci0JCVN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIoY29tbWFuZCk7Ci0JCXN5bmNocm9uaXplci5zdGFydCgpOwotCi0JCXRyeSB7Ci0JCQlzeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0KLQkJYm9vbGVhbiBleENhdWdodCA9IGZhbHNlOwotCQl0cnkgewotCQkJLy8gd2UgdXNlZCB0byBoYW5nIGhlcmUsIGJlZm9yZSB3ZSBiZWdhbiBoYW5kbGluZyBleGNlcHRpb25zCi0JCQlzeW5jaHJvbml6ZXIuc3RvcCgpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChDb21wb3NpdGVFeGNlcHRpb24gZXgpIHsKLQkJCWFzc2VydEVxdWFscygxLCBleC5nZXRFeGNlcHRpb25zKCkubGVuZ3RoKTsKLQkJCWV4Q2F1Z2h0ID0gdHJ1ZTsKLQkJfQotCQlhc3NlcnRUcnVlKGV4Q2F1Z2h0KTsKLQkJLy8gc3RhcnQgKyBzeW5jaHJvbml6ZQotCQlhc3NlcnRFcXVhbHMoMiwgY29tbWFuZC5jb3VudCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIEJvZ3VzQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlpbnQgY291bnQgPSAwOwotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJdGhpcy5jb3VudCsrOwotCQkJaWYgKHRoaXMuY291bnQgPiAxKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUgY29tbWFuZHMgKioqKioqKioqKgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU3luY2hyb25pemVTZWNvbmRhcnlNb2RlbENvbW1hbmQxIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCXByaXZhdGUgZmluYWwgU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsOwotCi0JCXB1YmxpYyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEoU2Vjb25kYXJ5TW9kZWwxIHNlY29uZGFyeU1vZGVsKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZWNvbmRhcnlNb2RlbCA9IHNlY29uZGFyeU1vZGVsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuc2Vjb25kYXJ5TW9kZWwuc3luY2hyb25pemUoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogdGhlIHByaW1hcnkgbW9kZWwgKHN1YmNsYXNzKSBoYXMgdG8gc3luY2hyb25pemUgd2l0aCBpdHNlbGYgKHN1cGVyY2xhc3MpCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIgZXh0ZW5kcyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDEgewotCQlwcml2YXRlIGZpbmFsIFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsOwotCi0JCXB1YmxpYyBTeW5jaHJvbml6ZVNlY29uZGFyeU1vZGVsQ29tbWFuZDIoUHJpbWFyeU1vZGVsMiBwcmltYXJ5TW9kZWwsIFNlY29uZGFyeU1vZGVsMiBzZWNvbmRhcnlNb2RlbCkgewotCQkJc3VwZXIoc2Vjb25kYXJ5TW9kZWwpOwotCQkJdGhpcy5wcmltYXJ5TW9kZWwgPSBwcmltYXJ5TW9kZWw7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXN1cGVyLmV4ZWN1dGUoKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCX0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBtb2RlbHMgKioqKioqKioqKgotCS8qKgotCSAqIHRoaXMgb2JqZWN0IHdpbGwgY2FsbCB0aGUgc3luY2hyb25pemVyIHdoZW5ldmVyIGl0cyBjb3VudCBjaGFuZ2VzLAotCSAqIGFsbG93aW5nIGludGVyZXN0ZWQgcGFydGllcyB0byBzeW5jaHJvbml6ZSB3aXRoIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByaW1hcnlNb2RlbDEgewotCQlwcm90ZWN0ZWQgU3luY2hyb25pemVyIHN5bmNocm9uaXplcjsKLQkJcHJvdGVjdGVkIGludCBjb3VudCA9IDI7Ci0KLQkJcHVibGljIFByaW1hcnlNb2RlbDEoKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZXRTeW5jaHJvbml6ZXJfKFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudCgpIHsKLQkJCXJldHVybiB0aGlzLmNvdW50OwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldENvdW50KGludCBjb3VudCkgewotCQkJaWYgKGNvdW50ICE9IHRoaXMuY291bnQpIHsKLQkJCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHN0YXRlQ2hhbmdlZCgpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJaWYgKHN5bmNocm9uaXplciA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdG9wKCk7Ci0JCQl0aGlzLnNldFN5bmNocm9uaXplcl8oc3luY2hyb25pemVyKTsKLQkJfQotCQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN5bmNocm9uaXplcl8oU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJdGhpcy5zeW5jaHJvbml6ZXIgPSBzeW5jaHJvbml6ZXI7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdGFydCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRTeW5jaHJvbml6ZXIoKSB7Ci0JCQl0aGlzLnN5bmNocm9uaXplci5zdGFydCgpOyAgLy8gdGhpcyBzaG91bGQgY2F1c2UgYW4gZXhjZXB0aW9uCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCXRoaXMuc3luY2hyb25pemVyLnN0b3AoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7Ci0JCQlzYi5hcHBlbmQoJygnKTsKLQkJCXRoaXMudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCcpJyk7Ci0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQoImNvdW50PSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnQpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1vZGVsIHN5bmNocm9uaXplcyB3aXRoIGl0c2VsZiwgdHJpZ2dlcmluZyBhIHJlY3Vyc2l2ZSBzeW5jaHJvbml6YXRpb24KLQkgKiB3aXRoIHRoZSBjaGFuZ2UuIFdoZW5ldmVyIHRoZSBbaW5oZXJpdGVkXSAnY291bnQnIGNoYW5nZXMsICdjb3VudFBsdXMzJwotCSAqIGlzIHVwZGF0ZWQgYXBwcm9wcmlhdGVseSBhbmQgYW5vdGhlciBzeW5jaHJvbml6ZSBpcyBpbml0aWF0ZWQgaWYgYXBwcm9wcmlhdGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQcmltYXJ5TW9kZWwyIGV4dGVuZHMgUHJpbWFyeU1vZGVsMSB7Ci0JCXByaXZhdGUgaW50IGNvdW50UGx1czMgPSAwOwotCi0JCXB1YmxpYyBQcmltYXJ5TW9kZWwyKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY291bnRQbHVzMyA9IHRoaXMuY291bnQgKyAzOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3VudFBsdXMzKCkgewotCQkJcmV0dXJuIHRoaXMuY291bnRQbHVzMzsKLQkJfQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRDb3VudFBsdXMzKGludCBjb3VudFBsdXMzKSB7Ci0JCQlpZiAoY291bnRQbHVzMyAhPSB0aGlzLmNvdW50UGx1czMpIHsKLQkJCQl0aGlzLmNvdW50UGx1czMgPSBjb3VudFBsdXMzOwotCQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzeW5jaHJvbml6ZSB3aXRoIGl0c2VsZiwgc28gdG8gc3BlYWsKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLnNldENvdW50UGx1czModGhpcy5jb3VudCArIDMpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgiLCBjb3VudFBsdXMzPSIpOwotCQkJc2IuYXBwZW5kKHRoaXMuY291bnRQbHVzMyk7Ci0JCX0KLQotCX0KLQotCS8vICoqKioqKioqKiogc2Vjb25kYXJ5IG1vZGVscyAqKioqKioqKioqCi0JLyoqCi0JICogVGhpcyBkZXBlbmRlbnQgb2JqZWN0IHVwZGF0ZXMgaXRzICdkb3VibGVDb3VudCcgd2hlbmV2ZXIgdGhlCi0JICogUHJpbWFyeU1vZGVsMSdzICdjb3VudCcgY2hhbmdlcywgdmlhIHRoZSAnc3luY2hyb25pemVyJy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNlY29uZGFyeU1vZGVsMSB7Ci0JCXByb3RlY3RlZCBmaW5hbCBQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbDsKLQkJcHJvdGVjdGVkIGludCBkb3VibGVDb3VudCA9IDA7Ci0KLQkJcHVibGljIFNlY29uZGFyeU1vZGVsMShQcmltYXJ5TW9kZWwxIHByaW1hcnlNb2RlbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucHJpbWFyeU1vZGVsID0gcHJpbWFyeU1vZGVsOwotCQkJdGhpcy5zeW5jaHJvbml6ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemUoKSB7Ci0JCQl0aGlzLmRvdWJsZUNvdW50ID0gdGhpcy5wcmltYXJ5TW9kZWwuZ2V0Q291bnQoKSAqIDI7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERvdWJsZUNvdW50KCkgewotCQkJcmV0dXJuIHRoaXMuZG91YmxlQ291bnQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOwotCQkJc2IuYXBwZW5kKCcoJyk7Ci0JCQl0aGlzLnRvU3RyaW5nKHNiKTsKLQkJCXNiLmFwcGVuZCgnKScpOwotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc2IuYXBwZW5kKCJkb3VibGVDb3VudD0iKTsKLQkJCXNiLmFwcGVuZCh0aGlzLmRvdWJsZUNvdW50KTsKLQkJfQotCi0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDIgZXh0ZW5kcyBTZWNvbmRhcnlNb2RlbDEgewotCQlwcml2YXRlIGludCBkb3VibGVDb3VudFBsdXMzID0gMDsKLQotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwyKFByaW1hcnlNb2RlbDIgZXh0ZW5kZWRQcmltYXJ5TW9kZWwpIHsKLQkJCXN1cGVyKGV4dGVuZGVkUHJpbWFyeU1vZGVsKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQcmltYXJ5TW9kZWwyIGdldEV4dGVuZGVkUHJpbWFyeU1vZGVsKCkgewotCQkJcmV0dXJuIChQcmltYXJ5TW9kZWwyKSB0aGlzLnByaW1hcnlNb2RlbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQlpbnQgdGVtcCA9IHRoaXMuZ2V0RXh0ZW5kZWRQcmltYXJ5TW9kZWwoKS5nZXRDb3VudFBsdXMzKCkgKiAyOwotCQkJaWYgKHRoaXMuZG91YmxlQ291bnRQbHVzMyAhPSB0ZW1wKSB7Ci0JCQkJdGhpcy5kb3VibGVDb3VudFBsdXMzID0gdGVtcDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RG91YmxlQ291bnRQbHVzMygpIHsKLQkJCXJldHVybiB0aGlzLmRvdWJsZUNvdW50UGx1czM7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQkJc3VwZXIudG9TdHJpbmcoc2IpOwotCQkJc2IuYXBwZW5kKCIsIGRvdWJsZUNvdW50UGx1czM9Iik7Ci0JCQlzYi5hcHBlbmQodGhpcy5kb3VibGVDb3VudFBsdXMzKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQWxsb3cgdGhlIHRpbWUgcmVxdWlyZWQgdG8gc3luY2hyb25pemUgdG8gYmUgc3BlY2lmaWVkLgotCSAqIEEgKG5vbi1kZWxheWVkKSBzeW5jaHJvbml6ZSB3aWxsIGV4ZWN1dGUgYmVmb3JlIHdlIGhhdmUgYSBjaGFuY2UgdG8KLQkgKiBjaGFuZ2UgdGhlIHRpY2sgY291bnQuIChJdCBpcyBjYWxsZWQgaW4gdGhlIFNlY29uZGFyeU1vZGVsMSBjb25zdHJ1Y3Rvci4pCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRhcnlNb2RlbDMgZXh0ZW5kcyBTZWNvbmRhcnlNb2RlbDIgewotCQlwcml2YXRlIGxvbmcgZGVsYXkgPSAwOwotCQlwdWJsaWMgU2Vjb25kYXJ5TW9kZWwzKFByaW1hcnlNb2RlbDIgcHJpbWFyeU1vZGVsKSB7Ci0JCQlzdXBlcihwcmltYXJ5TW9kZWwpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VGlja3MobG9uZyB0aWNrcykgewotCQkJdGhpcy5kZWxheSA9IHRpY2tzICogVElDSzsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZSgpIHsKLQkJCS8vIGRvbid0IGxvZyBhbnl0aGluZyB1bnRpbCAndGlja3MnIGlzIHNldAotCQkJaWYgKHRoaXMuZGVsYXkgPT0gMCkgewotCQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQl9IGVsc2UgewotCQkJCWxvZygiU1lOQyB0aHJlYWQgc3RhcnQgLSBzeW5jIGR1cmF0aW9uIHdpbGwgYmU6ICIgKyAodGhpcy5kZWxheSAvIFRJQ0spICsgIiB0aWNrcyIpOwotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCh0aGlzLmRlbGF5KTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJCQlsb2coIlNZTkMgdGhyZWFkIGludGVycnVwdGVkIik7Ci0JCQkJCVRlc3RUb29scy5zbGVlcChUSUNLKTsKLQkJCQkJcmV0dXJuOyAgLy8gc3RvcCBzeW5jaHJvbml6ZSAoaS5lLiBkb24ndCBjYWxsIHN1cGVyLnN5bmNocm9uaXplKCkpCi0JCQkJfQotCQkJCXN1cGVyLnN5bmNocm9uaXplKCk7Ci0JCQkJbG9nKCJTWU5DIHRocmVhZCBzdG9wIik7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RERUJVRygpIHsKLQkJYXNzZXJ0RmFsc2UoREVCVUcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlsb2dfKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dfKFN0cmluZyBtZXNzYWdlKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnQodGltZXN0YW1wKCkpOwotCQlTeXN0ZW0ub3V0LnByaW50KCcgJyk7Ci0JCVN5c3RlbS5vdXQucHJpbnQobWVzc2FnZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIFN0cmluZy52YWx1ZU9mKChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlIDEwMDAwKSAvIDEwMDBmKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvdGVzdC54bWwgYi9jb21tb24vdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDYzNWYyLi4wMDAwMDAwCi0tLSBhL2NvbW1vbi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNjRjYmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNzIxYTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM1YzExLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgREJXUyBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBEQldTIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDVmYmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUiIHZlcnNpb249IjEuMS4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImphdmF4LndzZGwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS42LjIucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGJ3cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5kYndzLmJ1aWxkZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi40LjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGY5M2QwLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTAsIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzNlMmViLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDI5YTUzLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODM5Zi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjMThjZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEVjbGlwc2VMaW5rIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThjOWRhMy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gREJXUyBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDEwLCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjZmNkNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQyOWE1My4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGUxMTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGJhOTcyLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxOTQ1ZS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNTAzMzkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIERCV1MgU3VwcG9ydCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgLSBFY2xpcHNlTGluayBEQldTIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmYzY5MC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuZmVhdHVyZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YxZDliLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk5MDZkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyNzUwMi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIEpBWEIgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSkFYQiBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTYxYzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmciCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZSIgdmVyc2lvbj0iMS4xLjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5mZWF0dXJlIiB2ZXJzaW9uPSIxLjEuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1veHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi40LjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMWYxOTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydCBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGFlYmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTc4MzlmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ0MDJiLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFmMTk0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2RhZWJmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgRWNsaXBzZUxpbmsgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjYzY5NC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWI4NGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MTcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZGU3NC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGUxNWU0Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIENvcmUgSlVuaXQgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFY2xpcHNlTGluayBKQVhCIENvcmUgSlVuaXQgVGVzdHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMTY3NTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udGVzdHMuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZTExNC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MWQ0MTguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGRjODI2Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZT1vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmMzEwYS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSkFYQiBTdXBwb3J0IFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEVjbGlwc2VMaW5rIEpBWEIgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzA1ZThjLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGlua19zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2UxNDUuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTkwNmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWFiZTdkLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MjI3ZWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZyIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmZlYXR1cmUiIHZlcnNpb249IjEuMS4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzRiNjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2UgLSBKQVhCIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNDkxNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhM2VmMC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExMmJjZS4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMzIwNzMuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBTb3VyY2UgLSBKQVhCIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwOCwgMjAxMC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjNDkxNi4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4ZGVlNy4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZGU3NC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThmNzllLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIENvcmUgSlVuaXQgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBKQVhCIEpVbml0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yi50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzI2ZTVmLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGIudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnRlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMGUxMTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmY2MGJlLi4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5NjcyZC4uMDAwMDAwMAotLS0gYS9qYXhiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmpheGIuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDJiNjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydCBTREsKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKQVhCIFN1cHBvcnQgCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pheGIvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpheGJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhY2M4MWYuLjAwMDAwMDAKLS0tIGEvamF4Yi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuamF4Yl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3MzFhYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0ZjY1Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzEwN2Q0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZDliZjIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIERCV1MgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyMGUzYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0YWU5MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZyI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5IiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMDljMmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuYnJhbmRpbmcvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZjY1N2UuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgREJXUyBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRjNWUzMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjU3YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZDg4YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA3OjAzIEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTE4MmFjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuZGJ3cy5idWlsZGVyO2J1bmRsZS12ZXJzaW9uPSJbMi4zLjAsMy4wLjApIiwKLSBqYXZheC53c2RsO2J1bmRsZS12ZXJzaW9uPSJbMS42LjIsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLAotIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMj5BYm91dCBUaGlzIENvbnRlbnQ8L0gyPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IAotICBvdXQgYmVsb3cuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgCi0gIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayAKLSAgdG8gdGhlIFJlZGlzdHJpYnV0b3ImIzgyMTc7cyBsaWNlbnNlIGZvciB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi08aDQ+PGEgbmFtZT0iSlBBIiBpZD0iSlBBIj48L2E+SmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgdjEuMDwvaDQ+Ci0KLTxibG9ja3F1b3RlPgotICA8cD5UaGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgd2hpY2ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgPGEgaHJlZj0iaHR0cHM6Ly9nbGFzc2Zpc2guZGV2LmphdmEubmV0L3B1YmxpYy9DRERMdjEuMC5odG1sIj5DRERMIAotICAgIHYxLjA8L2E+IGlzIHJlcXVpcmVkIGJ5IHRoZSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgUHJvamVjdCBpbiBvcmRlciAKLSAgICB0byBzdXBwb3J0IHRoaXMgc3RhbmRhcmQuPC9wPgotPC9ibG9ja3F1b3RlPgotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4MzhhYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1MzdmYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBEQldTIFN1cHBvcnQgLSBXZWIgU2VydmljZXMgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vTWFpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNmY0NDUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuOwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5sb2dnaW5nLkxldmVsLklORk87Ci1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5sb2dnaW5nLkxldmVsLlNFVkVSRTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTUGFja2FnZXIuQXJjaGl2ZVVzZS5pZ25vcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci0KLWltcG9ydCBqYXZheC53c2RsLldTRExFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi5pbnRlcm5hbC5KcHREYndzQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5YTUxDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5YTUxVbm1hcnNoYWxsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkRCV1NCdWlsZGVyTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UudG9vbHMuZGJ3cy5EQldTQnVpbGRlck1vZGVsUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkRCV1NQYWNrYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkVjbGlwc2VQYWNrYWdlcjsKLQotLyoqCi0gKiAgR2VuZXJhdGUgREJXUyBjb250ZW50Ci0gKiAgCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1idWlsZGVyRmlsZSBkYndzLWJ1aWxkZXIueG1sXSAtIHNwZWNpZmllcyBzb3VyY2UgYnVpbGRlciBmaWxlCi0gKiAgICAgWy1zdGFnZURpciAuXE91dHB1dF9EaXJdIC0gc3BlY2lmaWVzIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQotICogICAgIFstcGFja2FnZUFzIGVjbGlwc2VdIC0gc3BlY2lmaWVzIHRoZSBzb3VyY2UgcGFja2FnZQotICovCi1wdWJsaWMgY2xhc3MgTWFpbgotewotCXByaXZhdGUgU3RyaW5nIGJ1aWxkZXJGaWxlOwotCXByaXZhdGUgU3RyaW5nIHN0YWdlRGlyOwotCXByaXZhdGUgU3RyaW5nIHBhY2thZ2VBczsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z01vZGU7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkuZXhlY3V0ZShhcmdzKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBNYWluKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgewotCQkKLQkJdGhpcy5pbml0aWFsaXplV2l0aChhcmdzKTsKLQkJCi0JCXRoaXMuZ2VuZXJhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGUoKSB7Ci0KLQkJREJXU0J1aWxkZXIgYnVpbGRlciA9IG5ldyBEQldTQnVpbGRlcigpOwotCi0gICAgCURCV1NCdWlsZGVyTW9kZWwgbW9kZWwgPSB0aGlzLmJ1aWxkQnVpbGRlck1vZGVsKHRoaXMuYnVpbGRlckZpbGUpOwotCQlpZihtb2RlbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmxvZ01lc3NhZ2UoSU5GTywgSnB0RGJ3c0NvcmVNZXNzYWdlcy5OT19HRU5FUkFUSU9OX1BFUkZPUk1FRCk7Ci0JICAgICAgICByZXR1cm47Ci0JCX0KLQotICAgICAgICBidWlsZGVyLnNldFByb3BlcnRpZXMobW9kZWwucHJvcGVydGllcyk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0T3BlcmF0aW9ucyhtb2RlbC5vcGVyYXRpb25zKTsKLQotICAgICAgICBpZiggISB0aGlzLmpkYmNEcml2ZXJJc09uQ2xhc3NwYXRoKGJ1aWxkZXIuZ2V0RHJpdmVyKCkpKSB7Ci0gICAgICAgIAlyZXR1cm47Ci0gICAgICAgIH0KLQkJCi0gICAgICAgIERCV1NQYWNrYWdlciBwYWNrYWdlciA9IHRoaXMuYnVpbGRFY2xpcHNlUGFja2FnZXIoKTsKLSAgICAgICAgCi0gICAgCXRoaXMuaW5pdGlhbGl6ZVBhY2thZ2VyKHBhY2thZ2VyLCBidWlsZGVyLCB0aGlzLmJ1aWxkU3RhZ2VEaXIodGhpcy5zdGFnZURpcikpOwotICAgIAlidWlsZGVyLnNldFBhY2thZ2VyKHBhY2thZ2VyKTsKLSAgICAJCi0gICAgICAgIHRyeSB7Ci0JCQlidWlsZGVyLnN0YXJ0KCk7Ci0JCX0KLQkJY2F0Y2goV1NETEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCBKcHREYndzQ29yZU1lc3NhZ2VzLldTRExfRVhDRVBUSU9OLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBDbGVhbi11cCBTdGFnZSBkaXIuID8KLQkJCXRoaXMubG9nTWVzc2FnZShTRVZFUkUsIEpwdERid3NDb3JlTWVzc2FnZXMuR0VORVJBVElPTl9GQUlMRUQsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0JCX0KLQkJdGhpcy5sb2dNZXNzYWdlKElORk8sIEpwdERid3NDb3JlTWVzc2FnZXMuR0VORVJBVElPTl9DT01QTEVURUQpOwotICAgICAgICByZXR1cm47Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplV2l0aChTdHJpbmdbXSBhcmdzKSB7Ci0JCQotICAgIAl0aGlzLmJ1aWxkZXJGaWxlID0gdGhpcy5nZXRBcmd1bWVudEJ1aWxkZXJGaWxlKGFyZ3MpOwotICAgIAl0aGlzLnN0YWdlRGlyID0gdGhpcy5nZXRBcmd1bWVudFN0YWdlRGlyKGFyZ3MpOwotICAgIAl0aGlzLnBhY2thZ2VBcyA9IHRoaXMuZ2V0QXJndW1lbnRQYWNrYWdlQXMoYXJncyk7Ci0KLQkJdGhpcy5pc0RlYnVnTW9kZSA9IHRoaXMuZ2V0QXJndW1lbnREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCSAgICAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VyKERCV1NQYWNrYWdlciBwYWNrYWdlciwgREJXU0J1aWxkZXIgYnVpbGRlciwgRmlsZSBzdGFnZURpcikgewotCi0gICAgICAgIHBhY2thZ2VyLnNldERCV1NCdWlsZGVyKGJ1aWxkZXIpOwotICAgICAgICBwYWNrYWdlci5zZXRBcmNoaXZlVXNlKGlnbm9yZSk7Ci0gICAgICAgIHBhY2thZ2VyLnNldEFkZGl0aW9uYWxBcmdzKG51bGwpOwotICAgICAgICBwYWNrYWdlci5zZXRTdGFnZURpcihzdGFnZURpcik7Ci0gICAgICAgIHBhY2thZ2VyLnNldFNlc3Npb25zRmlsZU5hbWUoYnVpbGRlci5nZXRTZXNzaW9uc0ZpbGVOYW1lKCkpOwotCX0KLSAgICAKLQlwcml2YXRlIERCV1NCdWlsZGVyTW9kZWwgYnVpbGRCdWlsZGVyTW9kZWwoU3RyaW5nIGJ1aWxkZXJGaWxlTmFtZSkgewotCQkKLSAgICAJRmlsZSBidWlsZGVyRmlsZSA9IHRoaXMuZ2V0QnVpbGRlckZpbGUoYnVpbGRlckZpbGVOYW1lKTsKLQkJcmV0dXJuIHRoaXMudW5tYXJzaGFsKGJ1aWxkZXJGaWxlKTsKLQl9Ci0KLQlwcml2YXRlIERCV1NCdWlsZGVyTW9kZWwgdW5tYXJzaGFsKEZpbGUgYnVpbGRlckZpbGUpIHsKLSAgICAgICAgaWYoKGJ1aWxkZXJGaWxlID09IG51bGwpIHx8ICggISBidWlsZGVyRmlsZS5leGlzdHMoKSkpIHsKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICB9Ci0JCVhNTENvbnRleHQgY29udGV4dCA9IG5ldyBYTUxDb250ZXh0KG5ldyBEQldTQnVpbGRlck1vZGVsUHJvamVjdCgpKTsKLSAgICAgICAgWE1MVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciA9IGNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCk7Ci0gICAgICAgIAotICAgICAgICBEQldTQnVpbGRlck1vZGVsIG1vZGVsID0gKERCV1NCdWlsZGVyTW9kZWwpdW5tYXJzaGFsbGVyLnVubWFyc2hhbChidWlsZGVyRmlsZSk7Ci0gICAgICAgIGlmKG1vZGVsLnByb3BlcnRpZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgCXRoaXMubG9nTWVzc2FnZShTRVZFUkUsIEpwdERid3NDb3JlTWVzc2FnZXMuTk9fT1BFUkFUSU9OU19TUEVDSUZJRUQpOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRCdWlsZGVyRmlsZShTdHJpbmcgYnVpbGRlckZpbGVOYW1lKSB7Ci0KLSAgICAgICAgRmlsZSBidWlsZGVyRmlsZSA9IG5ldyBGaWxlKGJ1aWxkZXJGaWxlTmFtZSk7Ci0gICAgICAgIGlmKCAhIChidWlsZGVyRmlsZS5leGlzdHMoKSAmJiBidWlsZGVyRmlsZS5pc0ZpbGUoKSkpIHsKLSAgICAgICAgCXRoaXMubG9nTWVzc2FnZShTRVZFUkUsIAotICAgICAgICAJCUpwdERid3NDb3JlTWVzc2FnZXMuVU5BQkxFX1RPX0xPQ0FURV9CVUlMREVSX1hNTCwgYnVpbGRlckZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXJGaWxlOwotCX0KLQkKLQlwcml2YXRlIEZpbGUgYnVpbGRTdGFnZURpcihTdHJpbmcgc3RhZ2VEaXJOYW1lKSB7Ci0gICAgCUZpbGUgZGlyID0gbmV3IEZpbGUoc3RhZ2VEaXJOYW1lKTsKLSAgICAgICAgaWYoKCAhIGRpci5leGlzdHMoKSkgfHwgKCAhIGRpci5pc0RpcmVjdG9yeSgpKSkgewotICAgICAgICAJZGlyID0gVG9vbHMuYnVpbGREaXJlY3Rvcnkoc3RhZ2VEaXJOYW1lKTsKLSAgICAgICAgfQotCQlyZXR1cm4gZGlyOwotCX0KLQkKLQlwcml2YXRlIEVjbGlwc2VQYWNrYWdlciBidWlsZEVjbGlwc2VQYWNrYWdlcigpIHsKLQkJcmV0dXJuIG5ldyBFY2xpcHNlUGFja2FnZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQkJCSAgLy8gbm8gbmVlZCB0byBjaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBzdGFnZURpciwgZXZlcnl0aGluZyBpcyBpbi1tZW1vcnkKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gamRiY0RyaXZlcklzT25DbGFzc3BhdGgoU3RyaW5nIGpkYmNEcml2ZXJOYW1lKSB7Ci0JICAgIHRyeSB7Ci0JCQlDbGFzcy5mb3JOYW1lKGpkYmNEcml2ZXJOYW1lKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQl0aGlzLmxvZ01lc3NhZ2UoU0VWRVJFLCBKcHREYndzQ29yZU1lc3NhZ2VzLkRSSVZFUl9OT1RfT05fQ0xBU1NQQVRILCBqZGJjRHJpdmVyTmFtZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dNZXNzYWdlKExldmVsIGxldmVsLCBTdHJpbmcga2V5LCBPYmplY3QgYXJndW1lbnQpIHsKLQkJVG9vbHMubG9nTWVzc2FnZShsZXZlbCwgVG9vbHMuYmluZChrZXksIGFyZ3VtZW50KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBsb2dNZXNzYWdlKExldmVsIGxldmVsLCBTdHJpbmcga2V5KSB7Ci0JCVRvb2xzLmxvZ01lc3NhZ2UobGV2ZWwsIFRvb2xzLmdldFN0cmluZyhrZXkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFyZ3VtZW50IHF1ZXJpZXMgKioqKioqKioqKgotCQotCXByaXZhdGUgU3RyaW5nIGdldEFyZ3VtZW50QnVpbGRlckZpbGUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1idWlsZGVyRmlsZSIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRTdGFnZURpcihTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXN0YWdlRGlyIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudFBhY2thZ2VBcyhTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXBhY2thZ2VBcyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGdldEFyZ3VtZW50RGVidWdNb2RlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5hcmd1bWVudEV4aXN0cygiLWRlYnVnIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudFZhbHVlKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhcmd1bWVudEV4aXN0cyhTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvSnB0RGJ3c0NvcmVNZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9pbnRlcm5hbC9KcHREYndzQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2ZhOWIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9pbnRlcm5hbC9KcHREYndzQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIERCV1MgZ2VuZXJhdGlvbiBjb3JlLgotICovCi1wdWJsaWMgY2xhc3MgSnB0RGJ3c0NvcmVNZXNzYWdlcwotewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRJT05fQ09NUExFVEVEID0gIkdFTkVSQVRJT05fQ09NUExFVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUSU9OX0ZBSUxFRCA9ICJHRU5FUkFUSU9OX0ZBSUxFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9fR0VORVJBVElPTl9QRVJGT1JNRUQgPSAiTk9fR0VORVJBVElPTl9QRVJGT1JNRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdTRExfRVhDRVBUSU9OID0gIldTRExfRVhDRVBUSU9OIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19PUEVSQVRJT05TX1NQRUNJRklFRCA9ICJOT19PUEVSQVRJT05TX1NQRUNJRklFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5BQkxFX1RPX0xPQ0FURV9CVUlMREVSX1hNTCA9ICJVTkFCTEVfVE9fTE9DQVRFX0JVSUxERVJfWE1MIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfTk9UX09OX0NMQVNTUEFUSCA9ICJEUklWRVJfTk9UX09OX0NMQVNTUEFUSCI7Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi5pbnRlcm5hbC5qcHRfZGJ3c19jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEpwdERid3NDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvVG9vbHMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E0OWQ3YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL2NvcmUvZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5sb2dnaW5nLkxldmVsLlNFVkVSRTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKLQotLyoqCi0gKiAgVG9vbHMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRvb2xzCi17Ci0JLyoqIGVtcHR5IHN0cmluZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9ESVJFQ1RPUlkgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7CS8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbik7Ci0JfQkKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eV8oY2hhcltdIHMsIGludCBsZW4pIHsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNob3J0IG5hbWUgbWFuaXB1bGF0aW9uICoqKioqKioqKioKLQotCQotCXB1YmxpYyBzdGF0aWMgRmlsZSBidWlsZERpcmVjdG9yeShTdHJpbmcgZGlyTmFtZSkgewotICAgIAlGaWxlIGN1cnJlbnREaXIgPSBjdXJyZW50V29ya2luZ0RpcmVjdG9yeSgpOwotICAgIAlGaWxlIGRpciA9IG5ldyBGaWxlKGN1cnJlbnREaXIsIGRpck5hbWUpOwotICAgIAlkaXIubWtkaXIoKTsKLQkJcmV0dXJuIGRpcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZmlsZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGN1cnJlbnRXb3JraW5nRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoVVNFUl9ESVJFQ1RPUlkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFN0cmlwIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0RGlyZWN0b3J5KFN0cmluZyBwYXRoKSB7Ci0JCWlmKCAhIHBhdGguY29udGFpbnMoRmlsZS5zZXBhcmF0b3IpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwkKLQkJfQotCQlyZXR1cm4gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sYXN0SW5kZXhPZihGaWxlLnNlcGFyYXRvcikpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nTWVzc2FnZShMZXZlbCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYobGV2ZWwgPT0gU0VWRVJFKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oJ1xuJyArIG1lc3NhZ2UpOwotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCdcbicgKyBtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQkvLyAqKioqKioqKioqIE5MUyB1dGlsaXRpZXMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIEpwdERid3NDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJndW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9nZW4vaW50ZXJuYWwvanB0X2Rid3NfY29yZS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9pbnRlcm5hbC9qcHRfZGJ3c19jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OWQ3MGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2dlbi9pbnRlcm5hbC9qcHRfZGJ3c19jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotR0VORVJBVElPTl9DT01QTEVURUQgPSAgREJXU0J1aWxkZXIgZ2VuZXJhdGlvbiBjb21wbGV0ZWQKLUdFTkVSQVRJT05fRkFJTEVEID0gIERCV1NCdWlsZGVyIGdlbmVyYXRpb24gZmFpbGVkOiB7MH0KLU5PX0dFTkVSQVRJT05fUEVSRk9STUVEID0gIERCV1NCdWlsZGVyIG5vIGdlbmVyYXRpb24gcGVyZm9ybWVkCi1XU0RMX0VYQ0VQVElPTiA9ICBXU0RMRXhjZXB0aW9uOiB7MH0KLU5PX09QRVJBVElPTlNfU1BFQ0lGSUVEID0gIE5vIG9wZXJhdGlvbnMgc3BlY2lmaWVkCi1VTkFCTEVfVE9fTE9DQVRFX0JVSUxERVJfWE1MID0gIERCV1NCdWlsZGVyIHVuYWJsZSB0byBsb2NhdGUgYnVpbGRlciBYTUwgZmlsZTogIHswfQotRFJJVkVSX05PVF9PTl9DTEFTU1BBVEggPSAgSkRCQyBkcml2ZXIgbm90IG9uIGNsYXNzcGF0aDogezB9CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmY1ZGE4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91aS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzYjU3Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZhNzVlMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDc6MDggRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmNiMDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5KcHREYndzVWlQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5nZW47YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjMuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmRid3MuYnVpbGRlcjtidW5kbGUtdmVyc2lvbj0iWzIuMy4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWksCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5hY3Rpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47eC1pbnRlcm5hbDo9dHJ1ZQotSW1wb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0iNC4wLjEiCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3N2ViNWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgICAgICBwcm9wZXJ0eV9maWxlcy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvY29tcG9uZW50LnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmYyZGI4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVlMDVmYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2NsaWVudF93ZWJzZXJ2X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBlZWI3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwYWNhZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYTdhMzguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvd2l6YmFuL3dlYnNlcnZpY2VzY2xpZW50X3dpei5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdjMTZhMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhYjFiMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERCV1MgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1nZW5lcmF0ZURCV1MgPSBHZW5lcmF0ZSBEYXRhYmFzZSBXZWIgU2VydmljZXMKLQotZGJ3c1dpemFyZENhdGVnb3J5TmFtZSA9IERhdGFiYXNlIFdlYiBTZXJ2aWNlcwotCi1nZW5lcmF0ZURid3NGcm9tWG1sTmFtZSA9IFdlYiBTZXJ2aWNlcyBmcm9tIEJ1aWxkZXIgWE1MCi1nZW5lcmF0ZURid3NGcm9tWG1sRGVzYyA9IEdlbmVyYXRlIFdlYiBTZXJ2aWNlcyBmcm9tIEJ1aWxkZXIgWE1MCi0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNTJkODYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPCEtLQotICAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gICAgIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICAgCi0gICAgIENvbnRyaWJ1dG9yczogCi0gICAgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPHBsdWdpbj4KLQkKLSAJPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgotCQkKLQkJPCEtLSBjb250cmlidXRpb25zIGZvciBhbnkgcG9wdXAgLS0+Ci0JCTxtZW51Q29udHJpYnV0aW9uCi0JCQlsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UudWkucG9wdXAuYW55Ij4KLQkJCQkJCQotCQkJPG1lbnUKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MudWkubWVudS5XZWJTZXJ2aWNlcyIKLQkJCQlsYWJlbD0iJWRid3NXaXphcmRDYXRlZ29yeU5hbWUiPgotCQkJPC9tZW51PgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCQotIAk8L2V4dGVuc2lvbj4KLQotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0KLQkJPGNhdGVnb3J5Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MiCi0JCQluYW1lPSIlZGJ3c1dpemFyZENhdGVnb3J5TmFtZSIvPgotCi0gCQk8d2l6YXJkCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRid3MudWkud2l6YXJkLmdlbmVyYXRlRGJ3cyIKLQkJCW5hbWU9IiVnZW5lcmF0ZURid3NGcm9tWG1sTmFtZSIKLSAJCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmRid3MiCi0gCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuLkRid3NHZW5lcmF0b3JXaXphcmQiCi0JCQlpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3Y2xpZW50X3dlYnNlcnZfd2l6LmdpZiI+Ci0JCQkJPGRlc2NyaXB0aW9uPiVnZW5lcmF0ZURid3NGcm9tWG1sRGVzYzwvZGVzY3JpcHRpb24+Ci0JCTwvd2l6YXJkPgotCi0JPC9leHRlbnNpb24+Ci0JCQkKLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCi0JCTwhLS0gY29udHJpYnV0aW9ucyB0byB0aGUgIkdlbmVyYXRlIiBzdWJtZW51IC0tPgotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLnhzZEZpbGVBY3Rpb25zIgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJbmFtZUZpbHRlcj0iKmJ1aWxkZXIueG1sIj4KLQkJCQotCQkJPGZpbHRlcgotCQkJCW5hbWU9InByb2plY3ROYXR1cmUiCi0JCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianN0LndlYiIvPgotCQkJPC9lbmFibGVtZW50PgotCQkJPGFjdGlvbgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy51aS5nZW5lcmF0ZURid3MiIAotCQkJCWxhYmVsPSIlZ2VuZXJhdGVEQldTIgotCQkJCW1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qcHQuZGJ3cy51aS5tZW51LldlYlNlcnZpY2VzL2NvbnRlbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmFjdGlvbnMuR2VuZXJhdGVEYndzQWN0aW9uIj4gCi0JCQk8L2FjdGlvbj4gCi0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCQkKLQk8L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9wcm9wZXJ0eV9maWxlcy9qcHRfZGJ3c191aS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF9kYndzX3VpLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNjJjNjcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF9kYndzX3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0jIERid3NHZW5lcmF0b3IKLURid3NHZW5lcmF0b3JXaXphcmRfdGl0bGUgPSBOZXcgRGF0YWJhc2UgV2ViIFNlcnZpY2VzIGZyb20gQnVpbGRlciBYTUwKLURid3NHZW5lcmF0b3JXaXphcmRfZ2VuZXJhdGluZ0Rid3MgPSBHZW5lcmF0aW5nIERhdGFiYXNlIFdlYiBTZXJ2aWNlcwotCi1XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfdGl0bGUgPSBXZWIgRHluYW1pYyBQcm9qZWN0Ci1XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfZGVzYyA9IFNwZWNpZnkgcHJvamVjdCBmb3IgRGF0YWJhc2UgV2ViIFNlcnZpY2VzCi1XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfZGVzdGluYXRpb25Qcm9qZWN0ID0gU2VsZWN0IGRlc3RpbmF0aW9uIHByb2plY3Q6Ci0KLUJ1aWxkZXJYbWxXaXphcmRQYWdlX3RpdGxlID0gU2VsZWN0IEJ1aWxkZXIgWE1MIEZpbGUKLUJ1aWxkZXJYbWxXaXphcmRQYWdlX2Rlc2MgPSBTcGVjaWZ5IFhNTCBmaWxlIHRvIGdlbmVyYXRlIERhdGFiYXNlIFdlYiBTZXJ2aWNlcyBmcm9tCi0KLUJ1aWxkZXJYbWxXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkID0gVGhlIHNlbGVjdGVkIGNhdGFsb2cgZW50cnkgc3BlY2lmaWVzIGEgVVJJIHRoYXQgY2FuIG5vdCBiZSBsb2NhdGVkLgotCi1KZGJjRHJpdmVyV2l6YXJkUGFnZV90aXRsZSA9IERyaXZlciBmaWxlcwotSmRiY0RyaXZlcldpemFyZFBhZ2VfZGVzYyA9IFNwZWNpZnkgZHJpdmVyIEpBUiBmaWxlcwotCi1KZGJjRHJpdmVyV2l6YXJkUGFnZV9kcml2ZXJGaWxlcyA9IERyaXZlciBmaWxlczoKLQotSmRiY0RyaXZlcldpemFyZFBhZ2VfYWRkQnV0dG9uID0gQWRkLi4uCi1KZGJjRHJpdmVyV2l6YXJkUGFnZV9yZW1vdmVCdXR0b24gPSBSZW1vdmUKLQotSmRiY0RyaXZlcldpemFyZFBhZ2VfY2hvb3NlQURyaXZlckZpbGUgPSBEcml2ZXIgRmlsZSBTZWxlY3Rpb24KLQotRGJ3c0dlbmVyYXRvclVpX3J1bm5pbmdEYndzV2FybmluZ1RpdGxlID0gR2VuZXJhdGluZyBEYXRhYmFzZSBXZWIgU2VydmljZXMKLURid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdNZXNzYWdlID0gXAotCQlXYXJuaW5nOiBSdW5uaW5nIERCV1MgQnVpbGRlciB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBpbiB5b3VyIHByb2plY3QuXAotCQlcblxuQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbnRpbnVlPwotCi1EYndzR2VuZXJhdG9yVWlfZGJ3c05vdE9uQ2xhc3NwYXRoTWVzc2FnZSA9IFwKLQkJV2FybmluZzogREJXUyBCdWlsZGVyIGlzIG5vdCBvbiB5b3VyIHByb2plY3QgY2xhc3NwYXRoLlwKLQkJXG5cbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotRGJ3c0dlbmVyYXRvclVpX25vdEphdmFQcm9qZWN0ID0gTm90IGEgamF2YSBwcm9qZWN0Ci1EYndzR2VuZXJhdG9yVWlfbm90V2ViRHluYW1pY1Byb2plY3QgPSBOb3QgYSBXZWJEeW5hbWljIHByb2plY3QKLQotQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1RhYmxlVGl0bGUgPSBYTUwgQ2F0YWxvZwotQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ0tleUNvbHVtbiA9IEtleQotQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbiA9IFVSSQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9nZW4vRGJ3c0dlbmVyYXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2dlbi9EYndzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTNhZDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2dlbi9EYndzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JUnVudGltZUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5nZW4uQWJzdHJhY3RKcHRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotCi0vKioKLSAqICBEYndzR2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBEYndzR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKcHRHZW5lcmF0b3IKLXsKLQlzdGF0aWMgcHVibGljIFN0cmluZyBMQVVOQ0hfQ09ORklHX05BTUUgPSAiREJXUyBHZW4gUnVuIENvbmZpZyI7ICAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIERCV1NfR0VOX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay5jb3JlLmdlbiI7ICAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIERCV1NfR0VOX0NMQVNTID0gREJXU19HRU5fUEFDS0FHRV9OQU1FICsgIi5NYWluIjsJICAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBEQldTX0dFTl9KQVJfUFJFRklYID0gREJXU19HRU5fUEFDS0FHRV9OQU1FICsgIl8iOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYnVpbGRlckZpbGVOYW1lOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0YWdlRGlyTmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBkcml2ZXJKYXJMaXN0OwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKAotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCAKLQkJCVN0cmluZyBidWlsZGVyRmlsZU5hbWUsIAotCQkJU3RyaW5nIHN0YWdlRGlyTmFtZSwgCi0JCQlTdHJpbmcgZHJpdmVySmFyTGlzdCwKLQkJCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IERid3NHZW5lcmF0b3IoamF2YVByb2plY3QsIAotCQkJYnVpbGRlckZpbGVOYW1lLCAKLQkJCXN0YWdlRGlyTmFtZSwgCi0JCQlkcml2ZXJKYXJMaXN0KS5nZW5lcmF0ZShtb25pdG9yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcml2YXRlIERid3NHZW5lcmF0b3IoCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsIAotCQkJU3RyaW5nIGJ1aWxkZXJGaWxlTmFtZSwgCi0JCQlTdHJpbmcgc3RhZ2VEaXJOYW1lLCAKLQkJCVN0cmluZyBkcml2ZXJKYXJMaXN0KSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQkJdGhpcy5idWlsZGVyRmlsZU5hbWUgPSBidWlsZGVyRmlsZU5hbWU7Ci0JCXRoaXMuc3RhZ2VEaXJOYW1lID0gc3RhZ2VEaXJOYW1lOwotCQl0aGlzLmRyaXZlckphckxpc3QgPSBkcml2ZXJKYXJMaXN0OwotCX0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1haW5UeXBlKCkgewotCQlyZXR1cm4gREJXU19HRU5fQ0xBU1M7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hDb25maWdOYW1lKCkgewotCQlyZXR1cm4gTEFVTkNIX0NPTkZJR19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9vdHN0cmFwSmFyUHJlZml4KCkgewotCQlyZXR1cm4gREJXU19HRU5fSkFSX1BSRUZJWDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVHZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZG8gbm90aGluZwotCQkKLQl9Ci0KLQkvLyAqKioqKioqKioqIExhdW5jaCBDb25maWd1cmF0aW9uIFNldHVwICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRDbGFzc3BhdGgoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUxpc3Q8U3RyaW5nPiBjbGFzc3BhdGggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJLy8gREJXU19HZW4gamFyCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRCb290c3RyYXBKYXJDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIERlZmF1bHQgUHJvamVjdCBjbGFzc3BhdGgKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldERlZmF1bHRQcm9qZWN0Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBKREJDIGphcgotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZHJpdmVySmFyTGlzdCkpIHsKLQkJCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRKZGJjSmFyQ2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCS8vIFN5c3RlbSBMaWJyYXJ5ICAKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldFN5c3RlbUxpYnJhcnlDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCXJldHVybiBjbGFzc3BhdGg7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCkgewotCi0JCVN0cmluZ0J1ZmZlciBwcm9ncmFtQXJndW1lbnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCS8vIGJ1aWxkZXJGaWxlCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWJ1aWxkZXJGaWxlIFwiIik7CSAgLy8kTk9OLU5MUy0xJAotCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmJ1aWxkZXJGaWxlTmFtZSk7Ci0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCciJyk7Ci0KLQkJLy8gc3RhZ2VEaXIKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtc3RhZ2VEaXIgXCIiKTsJICAvLyROT04tTkxTLTEkCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKHRoaXMuc3RhZ2VEaXJOYW1lKTsKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoJyInKTsKLQotCQkvLyBwYWNrYWdlQXMKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtcGFja2FnZUFzIGVjbGlwc2UiKTsJICAvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5sYXVuY2hDb25maWcuc2V0QXR0cmlidXRlKElKYXZhTGF1bmNoQ29uZmlndXJhdGlvbkNvbnN0YW50cy5BVFRSX1BST0dSQU1fQVJHVU1FTlRTLCBwcm9ncmFtQXJndW1lbnRzLnRvU3RyaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRKZGJjSmFyQ2xhc3NwYXRoRW50cnkoKSB7Ci0JCXJldHVybiBnZXRBcmNoaXZlQ2xhc3NwYXRoRW50cnkodGhpcy5idWlsZEpkYmNKYXJQYXRoKCkpOwotCX0KLQkKLQlwcml2YXRlIElQYXRoIGJ1aWxkSmRiY0phclBhdGgoKSB7Ci0JCXJldHVybiBuZXcgUGF0aCh0aGlzLmRyaXZlckphckxpc3QpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvSnB0RGJ3c1VpUGx1Z2luLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL0pwdERid3NVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWIwZjc0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvSnB0RGJ3c1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdERid3NVaVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0NBVEFMT0dfSUQgPSBYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19JRCA9IFhNTENvcmVQbHVnaW4uREVGQVVMVF9DQVRBTE9HX0lEOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0NBVEFMT0dfSUQgPSBYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lEOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIEpwdERid3NVaVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdERid3NVaVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKLQkJCWtleSA9ICJpY29ucy8iICsga2V5OwotCQl9Ci0JCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLCAKLQkvL3doaWNoIG1lYW5zIHVudGlsIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiBiZWZvcmUgd2hlcmUgd2UgY29uc3RhbnRseSAKLQkvL2NyZWF0ZWQgbmV3IGltYWdlcy4gQnVnIDMwNjQzNyBpcyBhYm91dCBjbGVhbmluZyB0aGlzIHVwIGFuZCB1c2luZyBMb2NhbCBSZXNvdXJjZSBNYW5hZ2VycyAKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogWE1MQ29yZVBsdWdpbiBBUEkgKioqKioqKioqKgotCQotCXB1YmxpYyBJQ2F0YWxvZyBnZXREZWZhdWx0WE1MQ2F0YWxvZygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCi0JcHVibGljIEpwdERid3NVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0Rid3NHZW5lcmF0b3JVaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9EYndzR2VuZXJhdG9yVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAwMGJmMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0Rid3NHZW5lcmF0b3JVaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuV29ya3NwYWNlSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5nZW4uRGJ3c0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5EYndzR2VuZXJhdG9yV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MVW5tYXJzaGFsbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLnRvb2xzLmRid3MuREJXU0J1aWxkZXJNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkRCV1NCdWlsZGVyTW9kZWxQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLkNvbXBvbmVudENvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiAgRGJ3c0dlbmVyYXRvclVpCi0gKi8KLXB1YmxpYyBjbGFzcyBEYndzR2VuZXJhdG9yVWkKLXsKLQlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBidWlsZGVyWG1sRmlsZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXRUJfRkFDRVRfSUQgPSAianN0LndlYiI7CQkvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9QUk9QRVJUWSA9ICJkcml2ZXIiOwkJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQldTX0JVSUxERVJfQ0xBU1NfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS50b29scy5kYndzLkRCV1NCdWlsZGVyIjsJCS8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKElGaWxlIHhtbEZpbGUpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IHhtbEZpbGUuZ2V0UHJvamVjdCgpOwotCQkKLQkJaWYoICEgcHJvamVjdElzV2ViRHluYW1pYyhwcm9qZWN0KSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvclVpX25vdFdlYkR5bmFtaWNQcm9qZWN0KTsKLQkJfQotCQlJUGF0aCB4bWxQYXRoID0geG1sRmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCk7Ci0JCQotCQluZXcgRGJ3c0dlbmVyYXRvclVpKHByb2plY3QsIHhtbFBhdGgudG9PU1N0cmluZygpKS5nZW5lcmF0ZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9qZWN0SXNXZWJEeW5hbWljKElQcm9qZWN0IHByb2plY3QpIHsKLQotCQkgSVByb2plY3RGYWNldCBwcm9qZWN0RmFjZXQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoV0VCX0ZBQ0VUX0lEKTsKLSAgICAgICAgIElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIGZhY2V0ZWRQcm9qZWN0ID0gUHJvamVjdEZhY2V0c01hbmFnZXIuY3JlYXRlKHByb2plY3QpOwotICAgICAgICAgfSAKLSAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gKGZhY2V0ZWRQcm9qZWN0ID09IG51bGwpID8gZmFsc2UgOiBmYWNldGVkUHJvamVjdC5oYXNQcm9qZWN0RmFjZXQocHJvamVjdEZhY2V0KTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCUlQYXRoIG1vZHVsZVBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJcmV0dXJuIG1vZHVsZVBhdGg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc3BsYXlEQldTTm90T25DbGFzc3BhdGhXYXJuaW5nKFNoZWxsIHNoZWxsKSB7Ci0KLQkJU3RyaW5nIG1zZyA9IEpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JVaV9kYndzTm90T25DbGFzc3BhdGhNZXNzYWdlOwotCi0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbigKLQkJCXNoZWxsLAotCQkJSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvclVpX3J1bm5pbmdEYndzV2FybmluZ1RpdGxlLAotCQkJbXNnKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzcGxheU92ZXJyaWRpbmdXZWJDb250ZW50V2FybmluZyhTaGVsbCBzaGVsbCkgewotCi0JCVN0cmluZyBtc2cgPSBKcHREYndzVWlNZXNzYWdlcy5EYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nTWVzc2FnZTsKLQotCQlyZXR1cm4gTWVzc2FnZURpYWxvZy5vcGVuUXVlc3Rpb24oCi0JCQlzaGVsbCwKLQkJCUpwdERid3NVaU1lc3NhZ2VzLkRid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdUaXRsZSwKLQkJCW1zZyk7Ci0JfQotICAgIAotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIERid3NHZW5lcmF0b3JVaShJUHJvamVjdCB3ZWJQcm9qZWN0LCBTdHJpbmcgYnVpbGRlclhtbEZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYod2ViUHJvamVjdCA9PSBudWxsIHx8IFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoYnVpbGRlclhtbEZpbGUpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFQcm9qZWN0ID0gdGhpcy5nZXRKYXZhUHJvamVjdEZyb20od2ViUHJvamVjdCk7Ci0JCWlmKHRoaXMuamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvclVpX25vdEphdmFQcm9qZWN0KTsKLQkJfQotCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gYnVpbGRlclhtbEZpbGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSAqKioqKioqKioqCi0JLyoqCi0JICogcHJvbXB0IHRoZSB1c2VyIHdpdGggYSB3aXphcmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZSgpIHsKLQotCQlpZiggISB0aGlzLmRid3NJc09uQ2xhc3NwYXRoKCkpIHsKLQkJCWlmKCAhIGRpc3BsYXlEQldTTm90T25DbGFzc3BhdGhXYXJuaW5nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCkpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmKHRoaXMuY2xhc3NJc09uUHJvamVjdHNDbGFzc3BhdGgoCi0JCQkJCQkJdGhpcy5nZXREcml2ZXJOYW1lRnJvbSh0aGlzLmJ1aWxkZXJYbWxGaWxlKSkpIHsKLQotCQkJaWYoZGlzcGxheU92ZXJyaWRpbmdXZWJDb250ZW50V2FybmluZyh0aGlzLmdldEN1cnJlbnRTaGVsbCgpKSkgewotCQkJCXRoaXMuc2NoZWR1bGVHZW5lcmF0ZURid3NKb2IoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLm9wZW5XaXphcmREaWFsb2coKTsKLQkJcmV0dXJuOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgb3BlbldpemFyZERpYWxvZygpIHsKLQotCQlEYndzR2VuZXJhdG9yV2l6YXJkIHdpemFyZCA9IG5ldyBEYndzR2VuZXJhdG9yV2l6YXJkKHRoaXMuamF2YVByb2plY3QsIHRoaXMuYnVpbGRlclhtbEZpbGUpOwotCQl3aXphcmQuc2V0V2luZG93VGl0bGUoSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZSk7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZihyZXR1cm5Db2RlICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldERyaXZlck5hbWVGcm9tKFN0cmluZyBidWlsZGVyWG1sRmlsZSkgewotCQl0cnkgewotCQkJREJXU0J1aWxkZXJNb2RlbCBtb2RlbCA9IHRoaXMuYnVpbGRCdWlsZGVyTW9kZWwoYnVpbGRlclhtbEZpbGUpOwotCQkJTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbW9kZWwuZ2V0UHJvcGVydGllcygpOwotCQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0KERSSVZFUl9QUk9QRVJUWSk7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBEQldTQnVpbGRlck1vZGVsIGJ1aWxkQnVpbGRlck1vZGVsKFN0cmluZyBidWlsZGVyRmlsZU5hbWUpIHsKLQkJU3RyaW5nIHByb2plY3REaXJOYW1lID0gdGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0gICAgCUZpbGUgYnVpbGRlckZpbGUgPSB0aGlzLmdldEJ1aWxkZXJGaWxlKHByb2plY3REaXJOYW1lICsgRmlsZS5zZXBhcmF0b3IgKyBidWlsZGVyRmlsZU5hbWUpOwotCQlyZXR1cm4gdGhpcy51bm1hcnNoYWwoYnVpbGRlckZpbGUpOwotCX0KLQotCXByaXZhdGUgREJXU0J1aWxkZXJNb2RlbCB1bm1hcnNoYWwoRmlsZSBidWlsZGVyRmlsZSkgewotICAgICAgICBpZigoYnVpbGRlckZpbGUgPT0gbnVsbCkgfHwgKCAhIGJ1aWxkZXJGaWxlLmV4aXN0cygpKSkgewotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQkJWE1MQ29udGV4dCBjb250ZXh0ID0gbmV3IFhNTENvbnRleHQobmV3IERCV1NCdWlsZGVyTW9kZWxQcm9qZWN0KCkpOwotICAgICAgICBYTUxVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyID0gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKLSAgICAgICAgCi0gICAgICAgIERCV1NCdWlsZGVyTW9kZWwgbW9kZWwgPSAoREJXU0J1aWxkZXJNb2RlbCl1bm1hcnNoYWxsZXIudW5tYXJzaGFsKGJ1aWxkZXJGaWxlKTsKLSAgICAgICAgaWYobW9kZWwgPT0gbnVsbCB8fCBtb2RlbC5wcm9wZXJ0aWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldEJ1aWxkZXJGaWxlKFN0cmluZyBidWlsZGVyRmlsZU5hbWUpIHsKLQotICAgICAgICBGaWxlIGJ1aWxkZXJGaWxlID0gbmV3IEZpbGUoYnVpbGRlckZpbGVOYW1lKTsKLSAgICAgICAgaWYoICEgKGJ1aWxkZXJGaWxlLmV4aXN0cygpICYmIGJ1aWxkZXJGaWxlLmlzRmlsZSgpKSkgewotICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXJGaWxlOwotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIG9uIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjbGFzc0lzT25Qcm9qZWN0c0NsYXNzcGF0aChTdHJpbmcgZHJpdmVyTmFtZSkgewotCQl0cnkgewotCQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkcml2ZXJOYW1lKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy5qYXZhUHJvamVjdC5maW5kVHlwZShkcml2ZXJOYW1lKTsKLQkJCXJldHVybiAoZ2VuQ2xhc3MgIT0gbnVsbCk7Ci0JCX0gCi0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgREJXUyBidWlsZGVyIGlzIG9uIHRoZSBwcm9qZWN0J3MgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBkYndzSXNPbkNsYXNzcGF0aCgpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy5qYXZhUHJvamVjdC5maW5kVHlwZShEQldTX0JVSUxERVJfQ0xBU1NfTkFNRSk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9IAotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKElKYXZhUHJvamVjdCkoKElKYXZhRWxlbWVudCkoKElBZGFwdGFibGUpcHJvamVjdCkuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpKTsKLQl9Ci0KLQlwcml2YXRlIFNoZWxsIGdldEN1cnJlbnRTaGVsbCgpIHsKLQkgICAgcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNjaGVkdWxlR2VuZXJhdGVEYndzSm9iKCkgewotCi0JCVN0cmluZyBzdGFnZURpck5hbWUgPSB0aGlzLmphdmFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCi0JCVdvcmtzcGFjZUpvYiBnZW5lcmF0ZUpvYiA9IG5ldyBHZW5lcmF0ZURid3NKb2IoCi0JCQl0aGlzLmphdmFQcm9qZWN0LAotCQkJdGhpcy5idWlsZGVyWG1sRmlsZSwKLQkJCXN0YWdlRGlyTmFtZSwKLQkJCW51bGwJCS8vIGRyaXZlckphckxpc3QKLQkJKTsKLQkJZ2VuZXJhdGVKb2Iuc2NoZWR1bGUoKTsJCi0JfQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSBEQldTIGpvYiAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyYXRlRGJ3c0pvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IHByb2plY3Q7Ci0JCWZpbmFsIFN0cmluZyBidWlsZGVyRmlsZU5hbWU7Ci0JCWZpbmFsIFN0cmluZyBzdGFnZURpck5hbWU7Ci0JCWZpbmFsIFN0cmluZyBkcml2ZXJKYXJMaXN0OwotCi0JCXB1YmxpYyBHZW5lcmF0ZURid3NKb2IoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBidWlsZGVyRmlsZU5hbWUsIFN0cmluZyBzdGFnZURpck5hbWUsIFN0cmluZyBkcml2ZXJKYXJMaXN0KSB7Ci0JCQlzdXBlcihKcHREYndzVWlNZXNzYWdlcy5EYndzR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdEYndzKTsKLQotCQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdCA7Ci0JCQl0aGlzLmJ1aWxkZXJGaWxlTmFtZSA9IGJ1aWxkZXJGaWxlTmFtZTsKLQkJCXRoaXMuc3RhZ2VEaXJOYW1lID0gc3RhZ2VEaXJOYW1lOwotCQkJdGhpcy5kcml2ZXJKYXJMaXN0ID0gZHJpdmVySmFyTGlzdDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCURid3NHZW5lcmF0b3IuZ2VuZXJhdGUodGhpcy5wcm9qZWN0LCB0aGlzLmJ1aWxkZXJGaWxlTmFtZSwgdGhpcy5zdGFnZURpck5hbWUsIHRoaXMuZHJpdmVySmFyTGlzdCwgbW9uaXRvcik7Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaUljb25zLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaUljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmVkYTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9KcHREYndzVWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHREYndzVWlJY29ucwotewotCS8vICoqKioqKioqKioqKioqKiogV2l6YXJkIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERCV1NfR0VOX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vd2Vic2VydmljZXNjbGllbnRfd2l6IjsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0RGJ3c1VpTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0RGJ3c1VpTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxMGVhYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdERid3NVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgREJXUyBVSS4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqLwotcHVibGljIGNsYXNzIEpwdERid3NVaU1lc3NhZ2VzIHsKLQkKLQkvLyBEYndzR2VuZXJhdG9yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdEYndzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZV9kZXN0aW5hdGlvblByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZGVyWG1sV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdWlsZGVyWG1sV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX2Rlc2M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRHJpdmVyV2l6YXJkUGFnZV9kcml2ZXJGaWxlczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjRHJpdmVyV2l6YXJkUGFnZV9hZGRCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0RyaXZlcldpemFyZFBhZ2VfcmVtb3ZlQnV0dG9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNEcml2ZXJXaXphcmRQYWdlX2Nob29zZUFEcml2ZXJGaWxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERid3NHZW5lcmF0b3JVaV9ydW5uaW5nRGJ3c1dhcm5pbmdUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfcnVubmluZ0Rid3NXYXJuaW5nTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfZGJ3c05vdE9uQ2xhc3NwYXRoTWVzc2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYndzR2VuZXJhdG9yVWlfbm90SmF2YVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGJ3c0dlbmVyYXRvclVpX25vdFdlYkR5bmFtaWNQcm9qZWN0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbjsKLQotCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9kYndzX3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdERid3NVaU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHREYndzVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVEYndzQWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVEYndzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZmVlNmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRGJ3c0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5EYndzR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIEdlbmVyYXRlRGJ3c0FjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVEYndzQWN0aW9uIGV4dGVuZHMgT2JqZWN0QWN0aW9uCi17Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElGaWxlIHhtbEZpbGUpIHsKLQotCQlEYndzR2VuZXJhdG9yVWkuZ2VuZXJhdGUoeG1sRmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTBmMWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9hY3Rpb25zL09iamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiAgR2VuZXJhdGVFbnRpdGllc0FjdGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgCi17Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwdWJsaWMgT2JqZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9ICgoSVRyZWVTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5leGVjdXRlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCQotCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdGhpcy5leGVjdXRlKChJRmlsZSlzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJRmlsZSBmaWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9CdWlsZGVyWG1sV2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9CdWlsZGVyWG1sV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWIyM2ZjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQnVpbGRlclhtbFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHMuSmF2YVByb2plY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdERid3NVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci0KLS8qKgotICogIEJ1aWxkZXJYbWxXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBCdWlsZGVyWG1sV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQotCXByaXZhdGUgZmluYWwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQlwcml2YXRlIElQcm9qZWN0IHRhcmdldFByb2plY3Q7Ci0JCi0JcHJvdGVjdGVkIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFNvdXJjZVBhbmVsOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBicm93c2VYTUxGaWx0ZXJFeHRlbnNpb25zID0geyIueG1sIn07IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZCAqKioqKioqKioqCi0JCi0gICAgcHVibGljIHN0YXRpYyBJRmlsZSBnZXRCdWlsZGVyWG1sRnJvbVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUZpbGUpIHsKLQkJCVN0cmluZyBlbGVtZW50RXh0ZW5zaW9uID0gKChJRmlsZSlmaXJzdEVsZW1lbnQpLmdldEZpbGVFeHRlbnNpb24oKTsKLQkJCWlmKGVsZW1lbnRFeHRlbnNpb24gIT0gbnVsbCkgewotCQkJCWlmKGJyb3dzZVhNTEZpbHRlckV4dGVuc2lvbnNbMF0uZW5kc1dpdGgoZWxlbWVudEV4dGVuc2lvbikpIHsKLQkJCQkJcmV0dXJuICgoSUZpbGUpZmlyc3RFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0gICAgCi0JQnVpbGRlclhtbFdpemFyZFBhZ2UoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCJCdWlsZGVyWG1sV2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0aGlzLmluaXRpYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCS8vICoqKioqKioqKiogSURpYWxvZ1BhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEhFTFBfQ09OVEVYVF9JRCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGhpcy5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbCA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbChjb21wb3NpdGUsIHRoaXMuaW5pdGlhbFNlbGVjdGlvbik7Ci0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQotCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5QYW5lbExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLlBhbmVsTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCXNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpOwotCQkJfQotCQl9OwotCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCWlmKHZpc2libGUpIHsKLQotCSAgICAJaWYodGhpcy5nZXRCdWlsZGVyWG1sKCkgIT0gbnVsbCkgewotCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMuZ2V0QnVpbGRlclhtbCgpKSk7Ci0JICAgIAl9Ci0JICAgIAllbHNlIHsKLQkgICAgCQl0aGlzLnVwZGF0ZVRhcmdldFByb2plY3QoKTsKLQkJICAgIAlJRmlsZSBzY2hlbWEgPSBnZXRCdWlsZGVyWG1sRnJvbVNlbGVjdGlvbih0aGlzLmluaXRpYWxTZWxlY3Rpb24pOwotCQkgICAgCWlmKHNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNjaGVtYSkpOwotCQkgICAgCX0KLQkJICAgIAllbHNlIHsKLQkJICAgIAkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhpcy50YXJnZXRQcm9qZWN0KSk7Ci0JCSAgICAJfQotCSAgICAJfQotCSAgICAJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC51cGRhdGUoKTsKLQkJCQotCQkJdGhpcy5zZXRUaXRsZShKcHREYndzVWlNZXNzYWdlcy5CdWlsZGVyWG1sV2l6YXJkUGFnZV90aXRsZSk7Ci0JCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX2Rlc2MpOwotCQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRGaWx0ZXJFeHRlbnNpb25zKGJyb3dzZVhNTEZpbHRlckV4dGVuc2lvbnMpOwotCQl9Ci0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0VmlzaWJsZUhlbHBlcih2aXNpYmxlKTsKLQl9Ci0gICAgCi0JLy8gKioqKioqKioqKiBJV2l6YXJkUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCi0JCXJldHVybiB0aGlzLnNjaGVtYU9yVXJpU2VsZWN0ZWQoKSAmJiAodGhpcy5nZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSUZpbGUgZ2V0QnVpbGRlclhtbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0RmlsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlVVJJKCkgewotCQlTdHJpbmcgdXJpID0gdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5nZXRYTUxDYXRhbG9nVVJJKCk7Ci0JCWlmKHVyaSA9PSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5nZXRGaWxlKCk7Ci0JCQlpZihmaWxlICE9IG51bGwpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UGxhdGZvcm1VUkkoZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVyaTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhcmdldFByb2plY3QoKSB7Ci0gICAgCUlXaXphcmRQYWdlIHByZXZpb3VzUGFnZSA9IHRoaXMuZ2V0UHJldmlvdXNQYWdlKCk7Ci0gICAgCQotCQlpZihwcmV2aW91c1BhZ2UgaW5zdGFuY2VvZiBKYXZhUHJvamVjdFdpemFyZFBhZ2UpIHsKLQkJCS8vIGdldCBwcm9qZWN0IGZyb20gcHJldmlvdXNQYWdlCi0JCQl0aGlzLnRhcmdldFByb2plY3QgPSAoKChKYXZhUHJvamVjdFdpemFyZFBhZ2UpcHJldmlvdXNQYWdlKS5nZXRKYXZhUHJvamVjdCgpKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJZWxzZSBpZihpbml0aWFsU2VsZWN0aW9uICE9IG51bGwgJiYgISB0aGlzLmluaXRpYWxTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkvLyBubyBwcmV2aW91c1BhZ2UgLSBnZXQgcHJvamVjdCBmcm9tIGluaXRpYWxTZWxlY3Rpb24KLQkJCXRoaXMudGFyZ2V0UHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCk7Ci0JCX0JCQotCX0KLQkKLSAgICBwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbigpIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IGluaXRpYWxTZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElQcm9qZWN0KWZpcnN0RWxlbWVudDsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmV0dXJuICgoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJcmV0dXJuICgoSUphdmFFbGVtZW50KWZpcnN0RWxlbWVudCkuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotCi0JcHJpdmF0ZSBib29sZWFuIHNjaGVtYU9yVXJpU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAoKHRoaXMuZ2V0QnVpbGRlclhtbCgpICE9IG51bGwpIHx8ICh0aGlzLmdldFNvdXJjZVVSSSgpICE9IG51bGwpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nIHVyaSA9IHRoaXMuZ2V0U291cmNlVVJJKCk7Ci0JCWlmKHVyaSAhPSBudWxsKSB7Ci0JCQlpZiggISBVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCQkJfQotCQl9Ci0JCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHRoaXMuY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQl0aGlzLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0aGlzLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vRGJ3c0dlbmVyYXRvcldpemFyZC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYndzR2VuZXJhdG9yV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzc5OGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYndzR2VuZXJhdG9yV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkRid3NHZW5lcmF0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5KcHREYndzVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQ7Ci0KLS8qKgotICogIERid3NHZW5lcmF0b3JXaXphcmQKLSAqLwotcHVibGljIGNsYXNzIERid3NHZW5lcmF0b3JXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJV29ya2JlbmNoV2l6YXJkIHsKLQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgU3RyaW5nIGJ1aWxkZXJYbWxGaWxlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCXByaXZhdGUgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlIHByb2plY3RXaXphcmRQYWdlOwotCXByaXZhdGUgQnVpbGRlclhtbFdpemFyZFBhZ2UgYnVpbGRlclhtbFdpemFyZFBhZ2U7Ci0KLQkvLyBEaWFsb2cgc3RvcmUgaWQgY29uc3RhbnQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0laQVJEX05BTUUgPSBEYndzR2VuZXJhdG9yV2l6YXJkLmNsYXNzLmdldE5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJXU19TRUNUSU9OX05BTUUgPSAiRGJ3c1NldHRpbmdzIjsJCS8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSmRiY0RyaXZlcldpemFyZFBhZ2UgamRiY0RyaXZlcnNQYWdlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIERid3NHZW5lcmF0b3JXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCQotCXB1YmxpYyBEYndzR2VuZXJhdG9yV2l6YXJkKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgU3RyaW5nIGJ1aWxkZXJYbWxGaWxlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gYnVpbGRlclhtbEZpbGU7Ci0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZih0aGlzLmdldERpYWxvZ1NldHRpbmdzKCkgPT0gbnVsbCkgewotCQkJSURpYWxvZ1NldHRpbmdzIGRid3NTZXR0aW5ncyA9IEpwdERid3NVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgd2l6YXJkU2V0dGluZ3MgPSBkYndzU2V0dGluZ3MuZ2V0U2VjdGlvbihEQldTX1NFQ1RJT05fTkFNRSk7Ci0JCQlpZih3aXphcmRTZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJd2l6YXJkU2V0dGluZ3MgPSBkYndzU2V0dGluZ3MuYWRkTmV3U2VjdGlvbihEQldTX1NFQ1RJT05fTkFNRSk7Ci0JCQl9Ci0JCQl0aGlzLnNldERpYWxvZ1NldHRpbmdzKHdpemFyZFNldHRpbmdzKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogSVdvcmtiZW5jaFdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCi0JCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0RGJ3c1VpTWVzc2FnZXMuRGJ3c0dlbmVyYXRvcldpemFyZF90aXRsZSk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdERid3NVaUljb25zLkRCV1NfR0VOX1dJWl9CQU5ORVIpKTsKLQkJdGhpcy5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIElXaXphcmQgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQotCQlpZih0aGlzLnNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UKLQkJCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0RnJvbVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbik7Ci0KLQkJCXRoaXMucHJvamVjdFdpemFyZFBhZ2UgPSB0aGlzLmJ1aWxkV2ViRHluYW1pY1Byb2plY3RQYWdlKHRoaXMuamF2YVByb2plY3QpOwotCQkJdGhpcy5hZGRQYWdlKHRoaXMucHJvamVjdFdpemFyZFBhZ2UpOwotCi0JCQkvLyBCdWlsZGVyWG1sV2l6YXJkUGFnZQotCQkJSUZpbGUgYnVpbGRlclhtbFNlbGVjdGVkID0gQnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0QnVpbGRlclhtbEZyb21TZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pOwotCQkJaWYoYnVpbGRlclhtbFNlbGVjdGVkID09IG51bGwpIHsKLQkJCQl0aGlzLmJ1aWxkZXJYbWxXaXphcmRQYWdlID0gdGhpcy5idWlsZEJ1aWxkZXJYbWxQYWdlKHRoaXMuc2VsZWN0aW9uKTsKLQkJCQl0aGlzLmFkZFBhZ2UodGhpcy5idWlsZGVyWG1sV2l6YXJkUGFnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmJ1aWxkZXJYbWxGaWxlID0gdGhpcy5tYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKGJ1aWxkZXJYbWxTZWxlY3RlZC5nZXRGdWxsUGF0aCgpKTsKLQkJCX0KLQkJfQotCQkvLyBKZGJjRHJpdmVyV2l6YXJkUGFnZQotCQl0aGlzLmpkYmNEcml2ZXJzUGFnZSA9IHRoaXMuYnVpbGRKZGJjRHJpdmVyc1BhZ2UoKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMuamRiY0RyaXZlcnNQYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJCi0JCVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSAoV2l6YXJkUGFnZSlnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQlpZihjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQlpZiggISBjdXJyZW50UGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGRyaXZlckphckxpc3QgPSB0aGlzLmpkYmNEcml2ZXJzUGFnZS5nZXREcml2ZXJKYXJMaXN0KCk7Ci0JCXRoaXMuamRiY0RyaXZlcnNQYWdlLmZpbmlzaCgpOwkvLyBwZXJzaXN0IHNldHRpbmdzCi0KLQkJaWYoRGJ3c0dlbmVyYXRvclVpLmRpc3BsYXlPdmVycmlkaW5nV2ViQ29udGVudFdhcm5pbmcodGhpcy5nZXRTaGVsbCgpKSkgewotCQkJdGhpcy5nZW5lcmF0ZURid3MoZHJpdmVySmFyTGlzdCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotICAgIAotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCWlmKHRoaXMucHJvamVjdFdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJdGhpcy5qYXZhUHJvamVjdCA9IHRoaXMucHJvamVjdFdpemFyZFBhZ2UuZ2V0SmF2YVByb2plY3QoKTsKLQkJfQotICAgIAlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLSAgICB9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEJ1aWxkZXJYbWxQYXRoT3JVcmkoKSB7Ci0JCWlmKHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UgIT0gbnVsbCkgewotCQkJSUZpbGUgeG1sRmlsZSA9IHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0QnVpbGRlclhtbCgpOwotCQkJaWYoeG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMubWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aCh4bWxGaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIHRoaXMuYnVpbGRlclhtbFdpemFyZFBhZ2UuZ2V0U291cmNlVVJJKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVpbGRlclhtbEZpbGU7Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZSBidWlsZFdlYkR5bmFtaWNQcm9qZWN0UGFnZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJCi0JCVdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZSBwcm9qZWN0V2l6YXJkUGFnZSA9IG5ldyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UoamF2YVByb2plY3QpOwotCQlwcm9qZWN0V2l6YXJkUGFnZS5zZXRUaXRsZShKcHREYndzVWlNZXNzYWdlcy5XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfdGl0bGUpOwotCQlwcm9qZWN0V2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihKcHREYndzVWlNZXNzYWdlcy5XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2VfZGVzYyk7Ci0JCXByb2plY3RXaXphcmRQYWdlLnNldERlc3RpbmF0aW9uTGFiZWwoSnB0RGJ3c1VpTWVzc2FnZXMuV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlX2Rlc3RpbmF0aW9uUHJvamVjdCk7Ci0KLQkJcmV0dXJuIHByb2plY3RXaXphcmRQYWdlOwotCX0KLQotCXByaXZhdGUgQnVpbGRlclhtbFdpemFyZFBhZ2UgYnVpbGRCdWlsZGVyWG1sUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBCdWlsZGVyWG1sV2l6YXJkUGFnZShzZWxlY3Rpb24pOwotCX0KLQkKLQlwcml2YXRlIEpkYmNEcml2ZXJXaXphcmRQYWdlIGJ1aWxkSmRiY0RyaXZlcnNQYWdlKCkgewotCQlyZXR1cm4gbmV3IEpkYmNEcml2ZXJXaXphcmRQYWdlKFdJWkFSRF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBtYWtlUmVsYXRpdmVUb1Byb2plY3RQYXRoKElQYXRoIHBhdGgpIHsKLQkJSVBhdGggcmVsYXRpdmVQYXRoID0gcGF0aC5tYWtlUmVsYXRpdmVUbyh0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZ1bGxQYXRoKCkpOwotCQlyZXR1cm4gcmVsYXRpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlRGJ3cyhTdHJpbmcgZHJpdmVySmFyTGlzdCkgewotCi0JCVN0cmluZyBzdGFnZURpck5hbWUgPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0JCVdvcmtzcGFjZUpvYiBnZW5lcmF0ZUpvYiA9IG5ldyBEYndzR2VuZXJhdG9yVWkuR2VuZXJhdGVEYndzSm9iKAotCQkJdGhpcy5nZXRKYXZhUHJvamVjdCgpLAotCQkJdGhpcy5nZXRCdWlsZGVyWG1sUGF0aE9yVXJpKCksCi0JCQlzdGFnZURpck5hbWUsCi0JCQlkcml2ZXJKYXJMaXN0Ci0JCSk7Ci0JCWdlbmVyYXRlSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAlpZihzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElKYXZhUHJvamVjdClmaXJzdEVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3RGcm9tKHByb2plY3QpOwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChJSmF2YUVsZW1lbnQpZmlyc3RFbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotICAgIAlyZXR1cm4gKElKYXZhUHJvamVjdCkoKElKYXZhRWxlbWVudCkoKElBZGFwdGFibGUpcHJvamVjdCkuZ2V0QWRhcHRlcihJSmF2YUVsZW1lbnQuY2xhc3MpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pkYmNEcml2ZXJXaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pkYmNEcml2ZXJXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWM5ZDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9KZGJjRHJpdmVyV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5UYWJsZUxheW91dENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5KcHREYndzVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuSnB0RGJ3c1VpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuSnB0RGJ3c1VpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotCi0vKioKLSAqICBKZGJjRHJpdmVyc1dpemFyZFBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEpkYmNEcml2ZXJXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN0b3JlZERyaXZlckNsYXNzcGF0aElkOwotCXByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gamFyUGF0aHM7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQklORElOR1NfRklMRV9GSUxURVIgPSAiKi5qYXI7Ki56aXAiOyAgIC8vJE5PTi1OTFMtMSQKLQkvLyBkaWFsb2cgc3RvcmUgaWQgY29uc3RhbnRzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0VfSUQgPSAiRFJJVkVSX0NMQVNTUEFUSF9JRCI7CS8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9TRVBBUkFUT1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIik7CS8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEpkYmNEcml2ZXJXaXphcmRQYWdlKFN0cmluZyB3aXphcmROYW1lKSB7Ci0JCXN1cGVyKCJKZGJjIERyaXZlciIpOyAvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JCQotCQl0aGlzLmphclBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXRoaXMuc3RvcmVkRHJpdmVyQ2xhc3NwYXRoSWQgPSB3aXphcmROYW1lICsgIi4iICsgUEFHRV9JRDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuc2V0VGl0bGUoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfdGl0bGUpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdERid3NVaU1lc3NhZ2VzLkpkYmNEcml2ZXJXaXphcmRQYWdlX2Rlc2MpOwotCQl0aGlzLnNldEltYWdlRGVzY3JpcHRvcihKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdERid3NVaUljb25zLkRCV1NfR0VOX1dJWl9CQU5ORVIpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHsKLQkJdGhpcy5zYXZlV2lkZ2V0VmFsdWVzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJKYXJMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5idWlsZERyaXZlckphckxpc3RTdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICoJSW5pdGlhbGl6ZXMgdGhlIEpBUiBwYWNrYWdlIGZyb20gbGFzdCB1c2VkIHdpemFyZCBwYWdlIHZhbHVlcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUphclBhdGhzKCkgewotCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3M9IHRoaXMuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJaWYoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJLy8gZGVzdGluYXRpb24KLQkJCVN0cmluZ1tdIGRyaXZlclBhdGhzID0gc2V0dGluZ3MuZ2V0QXJyYXkodGhpcy5zdG9yZWREcml2ZXJDbGFzc3BhdGhJZCk7Ci0JCQlpZihkcml2ZXJQYXRocyA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOyAvLyBpZS4tIG5vIHNldHRpbmdzIHN0b3JlZAotCQkJfQotCQkJdGhpcy5qYXJQYXRocyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkJCi0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuamFyUGF0aHMsIGRyaXZlclBhdGhzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2F2ZVdpZGdldFZhbHVlcygpIHsKLQkJSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzPSB0aGlzLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0KLQkJaWYoc2V0dGluZ3MgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gZHJpdmVyUGF0aHMgPSB0aGlzLmphclBhdGhzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCQlzZXR0aW5ncy5wdXQodGhpcy5zdG9yZWREcml2ZXJDbGFzc3BhdGhJZCwgZHJpdmVyUGF0aHMpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREcml2ZXJKYXJMaXN0U3RyaW5nKCkgewotCQlpZih0aGlzLmphclBhdGhzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklORzsKLQkJfQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IoU3RyaW5nIGphciA6IHRoaXMuamFyUGF0aHMpIHsKLQkJCXJlc3VsdC5hcHBlbmQoamFyKS5hcHBlbmQoUEFUSF9TRVBBUkFUT1IpOwotCQl9Ci0JCXJlc3VsdC5kZWxldGVDaGFyQXQocmVzdWx0Lmxlbmd0aCgpIC0gMSk7CS8vIHJlbW92ZSBsYXN0IHNlcGFyYXRvcgotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5pbml0aWFsaXplSmFyUGF0aHMoKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCW5ldyBKYXJzR3JvdXAoY29tcG9zaXRlKTsKLQkJCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUphckZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCXRoaXMuamFyUGF0aHMucmVtb3ZlKGZpbGVQYXRoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEphckZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCWlmKCAhIHRoaXMuamFyUGF0aHMuY29udGFpbnMoZmlsZVBhdGgpKSB7Ci0JCQl0aGlzLmphclBhdGhzLmFkZChmaWxlUGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLy8gKioqKioqKioqKiBKYXJzR3JvdXAgY2xhc3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBKYXJzR3JvdXAgewotCi0JCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlwcml2YXRlIEphcnNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsgLy9tdXN0IGJlIDQgZm9yIHRoZSBwYWNrYWdlIGNvbnRyb2xzCi0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkvLyBUT0RPIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcy5ncm91cCwgSEVMUF9DT05URVhUX0lEKTsKLQotCQkJdGhpcy5idWlsZExhYmVsKGNvbXBvc2l0ZSwgMiwgSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfZHJpdmVyRmlsZXMpOwotCQkJCi0JCQl0aGlzLmJ1aWxkRHJpdmVyRmlsZXNUYWJsZShjb21wb3NpdGUpOwotCQl9Ci0JICAgIAotCQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQkgICAgCi0JCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQlJV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCSAgICAJCi0JCQlpZiggISAod2l6YXJkIGluc3RhbmNlb2YgRGJ3c0dlbmVyYXRvcldpemFyZCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXJldHVybiAoKERid3NHZW5lcmF0b3JXaXphcmQpd2l6YXJkKS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBnZXRKYXJQYXRocygpIHsKLQkJCXJldHVybiBqYXJQYXRoczsKLQkJfQotCi0JCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCQlwcml2YXRlIFRhYmxlVmlld2VyIGJ1aWxkRHJpdmVyRmlsZXNUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkKLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gdGhpcy5idWlsZFRhYmxlVmlld2VyKHBhcmVudCwgdGhpcy5nZXRKYXJQYXRocygpKTsKLQkJCQotCQkJdGhpcy5idWlsZEFkZFJlbW92ZUJ1dHRvbnMocGFyZW50LCB0YWJsZVZpZXdlcik7Ci0JCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JCX0KLQkJCi0JCXByaXZhdGUgVGFibGVWaWV3ZXIgYnVpbGRUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBBcnJheUxpc3Q8U3RyaW5nPiB0YWJsZURhdGFNb2RlbCkgewkKLQkJCQotCQkJVGFibGVMYXlvdXRDb21wb3NpdGUgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQl0aGlzLmFkZENvbHVtbnNEYXRhKHRhYmxlTGF5b3V0KTsKLQkJCQotCQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUodGFibGVMYXlvdXQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JCQkKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQotCQkJR3JpZERhdGEgZ3JpZERhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQkJZ3JpZERhdGEuaGVpZ2h0SGludD0gU1dUVXRpbC5nZXRUYWJsZUhlaWdodEhpbnQodGFibGUsIDcpOwotCQkJdGFibGVMYXlvdXQuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCXRhYmxlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHRoaXMuYnVpbGRMYWJlbFByb3ZpZGVyKCkpOwotCQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQkKLQkJCXRhYmxlVmlld2VyLnNldElucHV0KHRhYmxlRGF0YU1vZGVsKTsKLQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCXJldHVybiB0YWJsZVZpZXdlcjsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGJ1aWxkQWRkUmVtb3ZlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50LCBmaW5hbCBUYWJsZVZpZXdlciB0YWJsZVZpZXdlcikgewotCQkJCi0JCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25MYXlvdXQpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJLy8gQWRkIGJ1dHRvbnMKLQkJCUJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYWRkQnV0dG9uLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfYWRkQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JCQlhZGRCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCi0JCQkJCUFycmF5TGlzdDxTdHJpbmc+IGphckZpbGVzID0gcHJvbXB0SmFyRmlsZXMoKTsKLQkJCQkJZm9yKFN0cmluZyBqYXJGaWxlIDogamFyRmlsZXMpIHsKLQkJCQkJCWFkZEphckZpbGUoamFyRmlsZSk7Ci0JCQkJCX0KLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQkJLy8gUmVtb3ZlIGJ1dHRvbnMKLQkJCUJ1dHRvbiByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfcmVtb3ZlQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQkJcmVtb3ZlQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQkKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlTdHJpbmcgamFyRmlsZSA9IChTdHJpbmcpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlyZW1vdmVKYXJGaWxlKGphckZpbGUpOwotCQkJCQkKLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQkJYWRkQnV0dG9uLnNldEZvY3VzKCk7Ci0JCX0KLQotCQlwcml2YXRlIElCYXNlTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigpOwotCQl9Ci0JCQotCQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFRhYmxlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IHByb21wdEphckZpbGVzKCkgewotCQkJU3RyaW5nIHByb2plY3RQYXRoPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQotCQkJRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBTV1QuTVVMVEkpOwotCQkJZGlhbG9nLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuSmRiY0RyaXZlcldpemFyZFBhZ2VfY2hvb3NlQURyaXZlckZpbGUpOwotCQkJZGlhbG9nLnNldEZpbHRlclBhdGgocHJvamVjdFBhdGgpOwotCQkJZGlhbG9nLnNldEZpbHRlckV4dGVuc2lvbnMobmV3IFN0cmluZ1tdIHtCSU5ESU5HU19GSUxFX0ZJTFRFUn0pOwotCi0JCQlkaWFsb2cub3BlbigpOwotCQkJU3RyaW5nIHBhdGggPSBkaWFsb2cuZ2V0RmlsdGVyUGF0aCgpOwotCQkJU3RyaW5nW10gZmlsZU5hbWVzID0gZGlhbG9nLmdldEZpbGVOYW1lcygpOwotCQkJQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihmaWxlTmFtZXMubGVuZ3RoKTsKLQkJCWZvcihTdHJpbmcgZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKLQkJCQlyZXN1bHRzLmFkZChwYXRoICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0czsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRDb2x1bW5zRGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCX0KLQotCQkvKioKLQkJICogQnVpbGQgYW5kIHJldHVybiBhIGxhYmVsCi0JCSAqLwotCQlwcml2YXRlIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQkJCi0JCXByaXZhdGUgY2xhc3MgVGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJCXJldHVybiAoU3RyaW5nKWVsZW1lbnQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgY2xhc3MgVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJCVRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCQotCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkKLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzZjYzMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JcHVibGljIGludGVyZmFjZSBQYW5lbExpc3RlbmVyIHsKLQkJdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBhbmVsTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JcHJvdGVjdGVkIFNlbGVjdEZpbGVQYW5lbCBzZWxlY3RGaWxlUGFuZWw7Ci0JcHJvdGVjdGVkIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCS8vIGNvbnRhaW5lciBncm91cAotCQlzZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSA0MDA7Ci0JCWdkLndpZHRoSGludCA9IDQwMDsKLQkJc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlzZWxlY3RGaWxlUGFuZWwgPSBuZXcgU2VsZWN0RmlsZVBhbmVsKHBhZ2VCb29rLCBzZWxlY3Rpb24pOwotCQl0aGlzLnNldFNpbmdsZUZpbGVWaWV3RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkKLQkJLy8gQ2F0YWxvZwotCQlJQ2F0YWxvZyB4bWxDYXRhbG9nID0gSnB0RGJ3c1VpUGx1Z2luLmluc3RhbmNlKCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwocGFnZUJvb2ssIHhtbENhdGFsb2cpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JCQl9Ci0JCX0pOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdEZpbGVQYW5lbC5nZXRDb250cm9sKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3RGaWxlUGFuZWwuc2V0RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gc2VsZWN0RmlsZVBhbmVsLmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dVUkkoKSB7Ci0JCXJldHVybiBudWxsOwkJLy8gWE1MQ2F0YWxvZyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5zZXRDYXRhbG9nRW50cnlUeXBlKGNhdGFsb2dFbnRyeVR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzZWxlY3RGaWxlUGFuZWwucmVzZXRGaWx0ZXJzKCk7Ci0JCXNlbGVjdEZpbGVQYW5lbC5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCi0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihQYW5lbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlSGVscGVyKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0JCXNlbGVjdEZpbGVQYW5lbC5zZXRWaXNpYmxlSGVscGVyKGlzVmlzaWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCkgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbGlzdGVuZXIuY29tcGxldGlvblN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdEZpbGVQYW5lbC5nZXRDb250cm9sKCkpOwotCi0JCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBjbGFzcyBTZWxlY3RGaWxlUGFuZWwgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZSBpbXBsZW1lbnRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgU2VsZWN0RmlsZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc2VsZWN0aW9uLCB0cnVlKTsKLQkJCS8vIFN0cmluZ1tdIGV4dCA9IHsiLmR0ZCJ9OwotCQkJLy8gYWRkRmlsdGVyRXh0ZW5zaW9ucyhleHQpOwotCQkJY29udHJvbCA9IGNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQkJCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlTZWxlY3RGaWxlUGFuZWwudGhpcy5zZXRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpIHsKLQkJCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTM2M2Q1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2VsZWN0U2luZ2xlRmlsZVZpZXcKLSAqICAKLSAqICBGYedhZGUgY2xhc3MgdG8gY2hhbmdlIGFjY2Vzc2liaWxpdHkgb2YgU2VsZWN0U2luZ2xlRmlsZVZpZXcuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIKLQl7fQotCi0JcHVibGljIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzdXBlci5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkgewotCQlzdXBlci5yZXNldEZpbHRlcnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlSGVscGVyKGlzVmlzaWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2V0RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMWVjNDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuSnB0RGJ3c1VpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkpwdERid3NVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JcHJvdGVjdGVkIGludCBjYXRhbG9nRW50cnlUeXBlOwotCXByb3RlY3RlZCBib29sZWFuIGRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgSUNhdGFsb2cgZlhtbENhdGFsb2c7Ci0KLQlwdWJsaWMgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgeG1sQ2F0YWxvZykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5mWG1sQ2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0KLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJdGhpcy5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLmhlaWdodEhpbnQgPSAyMDA7Ci0JCWdkLndpZHRoSGludCA9IDcwMDsKLQkJdGhpcy5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSnB0RGJ3c1VpTWVzc2FnZXMuQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1RhYmxlVGl0bGUpOwotCi0JCXRhYmxlVmlld2VyID0gY3JlYXRlVGFibGVWaWV3ZXIodGhpcyk7Ci0JCXRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQoImR1bW15Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGNyZWF0ZVRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU3RyaW5nIGhlYWRpbmdzW10gPSBuZXcgU3RyaW5nWzJdOwotCQloZWFkaW5nc1swXSA9IEpwdERid3NVaU1lc3NhZ2VzLkJ1aWxkZXJYbWxXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47Ci0JCWhlYWRpbmdzWzFdID0gSnB0RGJ3c1VpTWVzc2FnZXMuQnVpbGRlclhtbFdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbjsKLQotCQlYTUxDYXRhbG9nVGFibGVWaWV3ZXIgdGhlVGFibGVWaWV3ZXIgPSBuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyKHBhcmVudCwgaGVhZGluZ3MpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkWE1MQ2F0YWxvZ0VudHJpZXMoTGlzdCBsaXN0LCBJQ2F0YWxvZ0VudHJ5W10gZW50cmllcykgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeVR5cGUgPT0gMCkgewotCQkJCQkJbGlzdC5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNhdGFsb2dFbnRyeVR5cGUgPT0gZW50cnkuZ2V0RW50cnlUeXBlKCkpIHsKLQkJCQkJCWxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIENvbGxlY3Rpb24gZ2V0WE1MQ2F0YWxvZ0VudHJpZXMoKSB7Ci0JCQkJTGlzdCByZXN1bHQgPSBudWxsOwotCi0JCQkJaWYgKChmWG1sQ2F0YWxvZyA9PSBudWxsKSB8fCBkb1RhYmxlU2l6ZUhhY2spIHsKLQkJCQkJLy8gdGhpcyBsZXRzIHVzIGNyZWF0ZSBhIHRhYmxlIHdpdGggYW4gaW5pdGlhbCBoZWlnaHQgb2YKLQkJCQkJLy8gMTAgcm93cwotCQkJCQkvLyBvdGhlcndpc2Ugd2UgZ2V0IHN0dWNrIHdpdGggMCByb3cgaGVpZ2ggdGFibGUuLi4gdGhhdCdzCi0JCQkJCS8vIHRvbyBzbWFsbAotCQkJCQlkb1RhYmxlU2l6ZUhhY2sgPSBmYWxzZTsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotCQkJCQkJcmVzdWx0LmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBmWG1sQ2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlOZXh0Q2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2dzW2ldOwotCQkJCQkJSUNhdGFsb2cgcmVmZXJlbmNlZENhdGFsb2cgPSBjYXRhbG9nLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJCQlpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkgewotCQkJCQkJCWlmIChKcHREYndzVWlQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCQkJCUlDYXRhbG9nIHN5c3RlbUNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCQkJYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCBzeXN0ZW1DYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCkpOwotCi0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKEpwdERid3NVaVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKSB7Ci0JCQkJCQkJCUlDYXRhbG9nIHVzZXJDYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0JCQkJCQkJCWFkZFhNTENhdGFsb2dFbnRyaWVzKHJlc3VsdCwgdXNlckNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIHRoZVRhYmxlVmlld2VyOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldEtleSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgZW50cnkgPSBnZXRYTUxDYXRhbG9nRW50cnkoKTsKLQkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRVUkkoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJcmVzdWx0ID0gKElDYXRhbG9nRW50cnkpIHNlbGVjdGVkT2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VudHJ5VHlwZShpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQl0aGlzLmNhdGFsb2dFbnRyeVR5cGUgPSBjYXRhbG9nRW50cnlUeXBlOwotCQl0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2Rid3MvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzJiZmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9XZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpemFyZHMuSmF2YVByb2plY3RXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuZGJ3cy5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5EYndzR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIFdlYkR5bmFtaWNQcm9qZWN0V2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgV2ViRHluYW1pY1Byb2plY3RXaXphcmRQYWdlIGV4dGVuZHMgSmF2YVByb2plY3RXaXphcmRQYWdlIHsKLQotCXB1YmxpYyBXZWJEeW5hbWljUHJvamVjdFdpemFyZFBhZ2UoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SVByb2plY3Q+IGdldEphdmFQcm9qZWN0cygpIHsKLQkgICByZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElQcm9qZWN0PihDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFByb2plY3RzKCkpKSB7Ci0JICAgICAgQE92ZXJyaWRlCi0JICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KElQcm9qZWN0IG5leHQpIHsKLQkJCQlyZXR1cm4gRGJ3c0dlbmVyYXRvclVpLnByb2plY3RJc1dlYkR5bmFtaWMobmV4dCk7Ci0JICAgICAgfQotCSAgIH07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvZGJ3cy9lY2xpcHNlbGluay91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU1NjU2MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9kYndzL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmRid3MuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5kYndzLmVjbGlwc2VsaW5rLnVpLkpwdERid3NVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlciBleHRlbmRzIFRhYmxlVmlld2VyIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEVSUk9SX1NUQVRFX0tFWSA9ICJlcnJvcnN0YXRla2V5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBkdGRGaWxlSW1hZ2UgPSBKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgdW5rbm93bkZpbGVJbWFnZSA9IEpwdERid3NVaVBsdWdpbi5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB4c2RGaWxlSW1hZ2UgPSBKcHREYndzVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZXJyb3JJbWFnZSA9IEpwdERid3NVaVBsdWdpbi5nZXRJbWFnZSgiaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFhNTENhdGFsb2dUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmdbXSBjb2x1bW5Qcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtblByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgaSk7Ci0JCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzW2ldKTsKLQkJCWNvbHVtbi5zZXRBbGlnbm1lbnQoU1dULkxFRlQpOwotCQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJfQotCQl0YWJsZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKGZhbHNlKTsKLQotCQlzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXMpOwotCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKCJoZWxsbyIpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicnVuISIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JCW1lbnVNYW5hZ2VyLmFkZChhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQlyZXNldEZpbHRlcnMoKTsKLQkJYWRkRmlsdGVyKG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoZXh0ZW5zaW9ucykpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlPYmplY3RbXSBhcnJheSA9IGdldFhNTENhdGFsb2dFbnRyaWVzKCkudG9BcnJheSgpOwotCQkJQ29tcGFyYXRvciBjb21wYXJhdG9yID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCWludCByZXN1bHQgPSAwOwotCQkJCQlpZiAoKG8xIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgJiYgKG8yIGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkpIHsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8xID0gKElDYXRhbG9nRW50cnkpIG8xOwotCQkJCQkJSUNhdGFsb2dFbnRyeSBtYXBwaW5nSW5mbzIgPSAoSUNhdGFsb2dFbnRyeSkgbzI7Ci0JCQkJCQlyZXN1bHQgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUobWFwcGluZ0luZm8xLmdldEtleSgpLCBtYXBwaW5nSW5mbzIuZ2V0S2V5KCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfTsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCXJldHVybiBhcnJheTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkLCBPYmplY3QgbmV3b2JqKSB7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCQkJSW1hZ2UgYmFzZSA9IG51bGw7Ci0JCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCQlTdHJpbmcgdXJpID0gY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCQlpZiAodXJpLmVuZHNXaXRoKCJkdGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQliYXNlID0gZHRkRmlsZUltYWdlOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHVyaS5lbmRzV2l0aCgieHNkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IHhzZEZpbGVJbWFnZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJhc2UgPSB1bmtub3duRmlsZUltYWdlOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGJhc2UgIT0gbnVsbCkgewotCQkJCQkJaWYgKFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCQkJcmVzdWx0ID0gYmFzZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIFRPRE8uLi4gU1NFIHBvcnQKLQkJCQkJCQlyZXN1bHQgPSBiYXNlOy8vIGltYWdlRmFjdG9yeS5jcmVhdGVDb21wb3NpdGVJbWFnZShiYXNlLAotCQkJCQkJCS8vIGVycm9ySW1hZ2UsCi0JCQkJCQkJLy8gSW1hZ2VGYWN0b3J5LkJPVFRPTV9MRUZUKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCXJlc3VsdCA9IGNvbHVtbkluZGV4ID09IDAgPyBjYXRhbG9nRW50cnkuZ2V0S2V5KCkgOiBjYXRhbG9nRW50cnkuZ2V0VVJJKCk7Ci0JCQkJcmVzdWx0ID0gVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChyZXN1bHQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCWNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0JCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1NjA5Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA1MjRhZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E2MDZiMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5pbmkgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg4YjlkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDIyYzcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydFxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgT3JhY2xlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTAsIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhNGU0NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvY29tcG9uZW50LnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzI3NWE3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nIj4KLTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLTxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU0NzdmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVjYjNiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTI2NzJmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowNzoyOSBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwNTYyNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW47c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1JbXBvcnQtUGFja2FnZTogamF2YXgueG1sLmJpbmQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbiwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFmNTg2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MzVjNjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdkZmNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgU3VwcG9ydCAtIFNjaGVtYSBHZW5lcmF0aW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY2YTkyMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7Ci1pbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuYmluZC5TY2hlbWFPdXRwdXRSZXNvbHZlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsLlRvb2xzOwotCi0vKioKLSAqICBHZW5lcmF0ZSBhIEpBWEIgU2NoZW1hCi0gKiAgCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1zIHNjaGVtYS54c2RdIC0gc3BlY2lmaWVzIHRoZSB0YXJnZXQgc2NoZW1hCi0gKiAgICAgWy1jIGNsYXNzTmFtZV0gLSBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gKiAgICAgCi0gKiAgICAgWy1wIHBhY2thZ2VOYW1lXSAtIHNwZWNpZmllcyB0aGUgc291cmNlIHBhY2thZ2UgLy8gQGRlcHJlY2F0ZWQKLSAqLwotcHVibGljIGNsYXNzIE1haW4KLXsKLQlwcml2YXRlIFN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZTsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWJ1Z01vZGU7Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBOT19GQUNUT1JZX0NMQVNTID0gImRvZXNudCBjb250YWluIE9iamVjdEZhY3RvcnkuY2xhc3MiOyAgIC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJbmV3IE1haW4oKS5leGVjdXRlKGFyZ3MpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwcml2YXRlIE1haW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCQotCQl0aGlzLmluaXRpYWxpemVXaXRoKGFyZ3MpOwotCQkKLQkJdGhpcy5nZW5lcmF0ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXaXRoKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAJdGhpcy5zb3VyY2VDbGFzc05hbWVzID0gdGhpcy5nZXRTb3VyY2VDbGFzc05hbWVzKGFyZ3MpOwotICAgIAl0aGlzLnRhcmdldFNjaGVtYU5hbWUgPSB0aGlzLmdldFRhcmdldFNjaGVtYU5hbWUoYXJncyk7Ci0KLQkJdGhpcy5pc0RlYnVnTW9kZSA9IHRoaXMuZ2V0RGVidWdNb2RlKGFyZ3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZSgpIHsKLSAgICAgICAgLy8gQ3JlYXRlIHRoZSBKQVhCQ29udGV4dAotCQlKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IHRoaXMuYnVpbGRKYXhiQ29udGV4dCgpOwotCQkKLSAgICAgICAgLy8gR2VuZXJhdGUgYW4gWE1MIFNjaGVtYQotCQlpZihqYXhiQ29udGV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlU2NoZW1hKGpheGJDb250ZXh0KTsKLQkJfQotCQllbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihUb29scy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuU0NIRU1BX05PVF9DUkVBVEVELCB0aGlzLnRhcmdldFNjaGVtYU5hbWUpKTsKLQkJfQotICAgIH0KLQkKLQlwcml2YXRlIEpBWEJDb250ZXh0IGJ1aWxkSmF4YkNvbnRleHQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihUb29scy5nZXRTdHJpbmcoSnB0SmF4YkNvcmVNZXNzYWdlcy5MT0FESU5HX0NMQVNTRVMpKTsKLQkJSkFYQkNvbnRleHQgamF4YkNvbnRleHQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJCQotCQkJCUNsYXNzW10gc291cmNlQ2xhc3NlcyA9IHRoaXMuYnVpbGRTb3VyY2VDbGFzc2VzKHRoaXMuc291cmNlQ2xhc3NOYW1lcywgbG9hZGVyKTsKLQkJCQkKLQkJCQlqYXhiQ29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKHNvdXJjZUNsYXNzZXMpOwotCQkJfQotCQkJY2F0Y2goSkFYQkV4Y2VwdGlvbiBleCkgewotCQkJCXRoaXMuaGFuZGxlRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCXJldHVybiBqYXhiQ29udGV4dDsKLQkgfQotCQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNjaGVtYShKQVhCQ29udGV4dCBqYXhiQ29udGV4dCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oVG9vbHMuZ2V0U3RyaW5nKEpwdEpheGJDb3JlTWVzc2FnZXMuR0VORVJBVElOR19TQ0hFTUEpKTsKLQkJU3lzdGVtLm91dC5mbHVzaCgpOwotCQkKLQkJU2NoZW1hT3V0cHV0UmVzb2x2ZXIgc2NoZW1hT3V0cHV0UmVzb2x2ZXIgPSAKLQkJCW5ldyBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlcih0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotCi0JCXRyeSB7Ci0JCQlqYXhiQ29udGV4dC5nZW5lcmF0ZVNjaGVtYShzY2hlbWFPdXRwdXRSZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGJ1aWxkU291cmNlQ2xhc3NlcyhTdHJpbmdbXSBjbGFzc05hbWVzLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQotCQlBcnJheUxpc3Q8Q2xhc3M+IHNvdXJjZUNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPihjbGFzc05hbWVzLmxlbmd0aCk7Ci0JCWZvcihTdHJpbmcgY2xhc3NOYW1lOiBjbGFzc05hbWVzKSB7Ci0JCQl0cnkgewotCQkJCXNvdXJjZUNsYXNzZXMuYWRkKGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjbGFzc05hbWUpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihUb29scy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuTk9UX0ZPVU5ELCBjbGFzc05hbWUpKTsKLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0JCXJldHVybiBzb3VyY2VDbGFzc2VzLnRvQXJyYXkobmV3IENsYXNzWzBdKTsKLSAgICB9Ci0JCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihKQVhCRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQlUaHJvd2FibGUgbGlua2VkRXggPSBleC5nZXRMaW5rZWRFeGNlcHRpb24oKTsKLQkJaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuaW5kZXhPZihOT19GQUNUT1JZX0NMQVNTKSA+IC0xKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZihsaW5rZWRFeCAhPSBudWxsICYmIGxpbmtlZEV4IGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFRvb2xzLmJpbmQoSnB0SmF4YkNvcmVNZXNzYWdlcy5DT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5ELCBsaW5rZWRFeC5nZXRNZXNzYWdlKCkpOwotCQkJU3lzdGVtLmVyci5wcmludGxuKGVycm9yTWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogYXJndW1lbnQgcXVlcmllcyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb3VyY2VDbGFzc05hbWVzKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBbGxBcmd1bWVudFZhbHVlKCItYyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFyZ2V0U2NoZW1hTmFtZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0QXJndW1lbnRWYWx1ZSgiLXMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGdldERlYnVnTW9kZShTdHJpbmdbXSBhcmdzKSB7Ci0KLQkJcmV0dXJuIHRoaXMuYXJndW1lbnRFeGlzdHMoIi1kZWJ1ZyIsIGFyZ3MpOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIFN0cmluZyBnZXRBcmd1bWVudFZhbHVlKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBhcmdzW2pdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxBcmd1bWVudFZhbHVlKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCUxpc3Q8U3RyaW5nPiBhcmdWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJnTmFtZSkpIHsKLQkJCQlpbnQgaiA9IGkgKyAxOwotCQkJCWlmIChqIDwgYXJncy5sZW5ndGgpIHsKLQkJCQkJYXJnVmFsdWVzLmFkZChhcmdzW2pdKTsKLQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYXJnVmFsdWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBhcmd1bWVudEV4aXN0cyhTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KLQotLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0KLWNsYXNzIEpwdFNjaGVtYU91dHB1dFJlc29sdmVyIGV4dGVuZHMgU2NoZW1hT3V0cHV0UmVzb2x2ZXIgewotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRTY2hlbWFOYW1lOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEpwdFNjaGVtYU91dHB1dFJlc29sdmVyKFN0cmluZyBkZWZhdWx0U2NoZW1hTmFtZSkgewotCQl0aGlzLmRlZmF1bHRTY2hlbWFOYW1lID0gZGVmYXVsdFNjaGVtYU5hbWU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCQotCSBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmVzdWx0IGNyZWF0ZU91dHB1dChTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVQYXRoID0gKFRvb2xzLnN0cmluZ0lzRW1wdHkobmFtZXNwYWNlVVJJKSkgPyAKLSAgICAgICAgCQl0aGlzLmJ1aWxkRmlsZU5hbWVGcm9tKHRoaXMuZGVmYXVsdFNjaGVtYU5hbWUsIHN1Z2dlc3RlZEZpbGVOYW1lKSA6IAotICAgICAgICAJCXRoaXMubW9kaWZ5RmlsZU5hbWUobmFtZXNwYWNlVVJJKTsKLQkgICAgICAgIAkKLSAgICAgICAgZmlsZVBhdGggPSB0aGlzLmNhbm9uaWNhbEZpbGVOYW1lKGZpbGVQYXRoKTsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotCQlTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChmaWxlKTsKLQkJcmVzdWx0LnNldFN5c3RlbUlkKGZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQotCQlTeXN0ZW0ub3V0LnByaW50KFRvb2xzLmJpbmQoSnB0SmF4YkNvcmVNZXNzYWdlcy5TQ0hFTUFfR0VORVJBVEVELCBmaWxlKSk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JIHByaXZhdGUgU3RyaW5nIGJ1aWxkRmlsZU5hbWVGcm9tKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIHN1Z2dlc3RlZEZpbGVOYW1lKSB7Ci0KLQkJIGZpbGVOYW1lID0gVG9vbHMuc3RyaXBFeHRlbnNpb24oZmlsZU5hbWUpOwotCi0JCSBpZihUb29scy5zdHJpbmdJc0VtcHR5KGZpbGVOYW1lKSkgewotCQkJIHJldHVybiBzdWdnZXN0ZWRGaWxlTmFtZTsKLQkJIH0KLQkJIFN0cmluZyBudW1iZXIgPSBUb29scy5leHRyYWN0RmlsZU51bWJlcihzdWdnZXN0ZWRGaWxlTmFtZSk7Ci0KLQkJIGZpbGVOYW1lID0gdGhpcy5idWlsZEZpbGVOYW1lKGZpbGVOYW1lLCBudW1iZXIpOwotCQkgcmV0dXJuIFRvb2xzLmFwcGVuZFhzZEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JIH0KLQotCSBwcml2YXRlIFN0cmluZyBidWlsZEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSwgU3RyaW5nIG51bWJlcikgewotCi0JCSBpZihUb29scy5zdHJpbmdJc0VtcHR5KG51bWJlcikpIHsKLQkJCSByZXR1cm4gZmlsZU5hbWU7Ci0JCSB9Ci0JCSByZXR1cm4gKG51bWJlci5lcXVhbHMoIjAiKSkgPyBmaWxlTmFtZSA6IGZpbGVOYW1lICsgbnVtYmVyOyAgIC8vJE5PTi1OTFMtMSQKLQkgfQotCSAKLQkgcHJpdmF0ZSBTdHJpbmcgbW9kaWZ5RmlsZU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQkgU3RyaW5nIGRpciA9IFRvb2xzLmV4dHJhY3REaXJlY3RvcnkodGhpcy5kZWZhdWx0U2NoZW1hTmFtZSk7Ci0KLQkJIFN0cmluZyBmaWxlTmFtZSA9IFRvb2xzLnN0cmlwUHJvdG9jb2wobmFtZXNwYWNlVVJJKTsKLQkJIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZUFsbCgiLyIsICJfIik7CQkvLyROT04tTkxTLTEkCi0JCSBmaWxlTmFtZSA9IFRvb2xzLmFwcGVuZFhzZEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IChUb29scy5zdHJpbmdJc0VtcHR5KGRpcikpID8gZmlsZU5hbWUgOiBkaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQkgfQotCi0JIHByaXZhdGUgU3RyaW5nIGNhbm9uaWNhbEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5jYW5vbmljYWxGaWxlKG5ldyBGaWxlKGZpbGVOYW1lKSkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCQotCSBwcml2YXRlIEZpbGUgY2Fub25pY2FsRmlsZShGaWxlIGZpbGUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBmaWxlLmdldENhbm9uaWNhbEZpbGUoKTsKLQkJfSAKLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZXhjZXB0aW9uKSB7Ci0JCQlyZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZUZpbGUoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEpheGJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxNzA1My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEpheGJDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgSkFYQiBjb3JlLgotICovCi1wdWJsaWMgY2xhc3MgSnB0SmF4YkNvcmVNZXNzYWdlcwotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9BRElOR19DTEFTU0VTID0gIkxPQURJTkdfQ0xBU1NFUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVElOR19TQ0hFTUEgPSAiR0VORVJBVElOR19TQ0hFTUEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9HRU5FUkFURUQgPSAiU0NIRU1BX0dFTkVSQVRFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05PVF9DUkVBVEVEID0gIlNDSEVNQV9OT1RfQ1JFQVRFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UX0ZPVU5EID0gIk5PVF9GT1VORCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVF9GQUNUT1JZX05PVF9GT1VORCA9ICJDT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EIjsKLQkKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5qcHRfamF4Yl9jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlQnVuZGxlIFJFU09VUkNFX0JVTkRMRSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0KLQlwcml2YXRlIEpwdEpheGJDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyNzY2MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqICBUb29scwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVG9vbHMKLXsKLQkvKiogZGVmYXVsdCBmaWxlIG5hbWUgdXNlZCBieSB0aGUgc2NoZW1hZ2VuICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgR0VOX0RFRkFVTFRfTkFNRSA9ICJzY2hlbWEiOyAgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZW1wdHkgc3RyaW5nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbik7Ci0JfQkKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eV8oY2hhcltdIHMsIGludCBsZW4pIHsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNob3J0IG5hbWUgbWFuaXB1bGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmlwIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFByb3RvY29sKFN0cmluZyB1cmkpIHsKLQotCQkgcmV0dXJuIHVyaS5yZXBsYWNlRmlyc3QoImh0dHA6Ly8iLCBFTVBUWV9TVFJJTkcpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kWHNkRXh0ZW5zaW9uKFN0cmluZyBuYW1lKSB7Ci0KLQkJIHJldHVybiBuYW1lICsgIi54c2QiOwkJLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RGaWxlTnVtYmVyKFN0cmluZyBmaWxlTmFtZSkgewotCi0JCSBTdHJpbmcgcmVzdWx0ID0gc3RyaXBFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkgaWYoVG9vbHMuc3RyaW5nSXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkgcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJIH0KLQkJIHJldHVybiByZXN1bHQucmVwbGFjZUZpcnN0KEdFTl9ERUZBVUxUX05BTUUsIEVNUFRZX1NUUklORyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdERpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotCQlpZiggISBwYXRoLmNvbnRhaW5zKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsJCi0JCX0KLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBOTFMgdXRpbGl0aWVzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLmdldFN0cmluZyhrZXkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBrZXksIE9iamVjdCBhcmd1bWVudCkgewotCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoZ2V0U3RyaW5nKGtleSksIGFyZ3VtZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL2pwdF9qYXhiX2NvcmUucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvanB0X2pheGJfY29yZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTExMmNkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvanB0X2pheGJfY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUxPQURJTkdfQ0xBU1NFUyA9IGxvYWRpbmcuLi4KLUdFTkVSQVRJTkdfU0NIRU1BID0gXG5nZW5lcmF0aW5nIHNjaGVtYS4uLgotU0NIRU1BX0dFTkVSQVRFRCA9ICBcblNjaGVtYSB7MH0gZ2VuZXJhdGVkCi1TQ0hFTUFfTk9UX0NSRUFURUQgPSAgXG5TY2hlbWEgezB9IG5vdCBjcmVhdGVkCi1OT1RfRk9VTkQgPSAgXG5cdE5vdCBmb3VuZDogezB9Ci1DT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIFxuVGhlIEpBWEJDb250ZXh0RmFjdG9yeSB7MH0gXG5cCi1zcGVjaWZpZWQgaW4gdGhlIGpheGIucHJvcGVydGllcyBmaWxlIGNvdWxkIG5vdCBiZSBsb2NhdGVkIG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gXG5cCi1UaGUgSkFYQiBwcm92aWRlciB0aGF0IGRlZmluZXMgdGhpcyBmYWN0b3J5IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCBjbGFzc3BhdGgsIFxuXAotb3IgdGhlIGpheGIucHJvcGVydGllcyBmaWxlIHNob3VsZCBiZSByZW1vdmVkIHRvIHVzZSB0aGUgZGVmYXVsdCBwcm92aWRlci4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRmYjM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5jdnNpZ25vcmUgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5wcm9qZWN0IGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZWE5MjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2OTY1Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowNzoxOCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYTljMTkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMjAwLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy42LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmRlYnVnLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuNDAyLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMi4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjYwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnhzZDtidW5kbGUtdmVyc2lvbj0iWzIuNi4wLDMuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dCwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5nZW47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuamF4YjIyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJwcm92O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJ2YWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJpbmRleCwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJwcm9wcywKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3YsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhiaW5kZXgsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHMsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3N2ViNWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL2NvbXBvbmVudC54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmYzZGU1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiPgotCTxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVkNjVmYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgQ29yZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotSkFYQl9QTEFURk9STVMgPSBKQVhCIFBsYXRmb3JtcwotCi1KQVhCX0lOREVYX0NPTlRFTlQgPSBKQVhCIEluZGV4IEZpbGUKLUpBWEJfUFJPUEVSVElFU19DT05URU5UID0gSkFYQiBQcm9wZXJ0aWVzIEZpbGUKLQotSkFYQl9QUk9CTEVNX01BUktFUiA9IEpBWEIgUHJvYmxlbQotCi1HRU5FUklDX1BMQVRGT1JNX0dST1VQX0xBQkVMID0gR2VuZXJpYyBKQVhCCi1HRU5FUklDXzJfMl9QTEFURk9STV9MQUJFTCA9IEdlbmVyaWMgSkFYQiAyLjIKLUdFTkVSSUNfMl8xX1BMQVRGT1JNX0xBQkVMID0gR2VuZXJpYyBKQVhCIDIuMQotCi1KQVhCX0ZBQ0VUX0xBQkVMID0gSkFYQgotSkFYQl9GQUNFVF9ERVNDUklQVElPTiA9IEFkZHMgc3VwcG9ydCBmb3IgZGF0YSBiaW5kaW5nIHVzaW5nIHRoZSBKYXZhIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcgKEpBWEIpLgotSkFYQl9URU1QTEFURV9MQUJFTCA9IEpBWEIgUHJvamVjdAotCi1KQVhCX05PX09QX0xJQlJBUllfUFJPVklERVJfTUVTU0FHRSA9IFRoZSBKQVhCIGZhY2V0IHJlcXVpcmVzIGEgSkFYQiBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IHRvIGJlIHByZXNlbnQgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoLiBCeSBkaXNhYmxpbmcgbGlicmFyeSBjb25maWd1cmF0aW9uLCB0aGUgdXNlciB0YWtlcyBvbiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgZW5zdXJpbmcgdGhhdCB0aGUgY2xhc3NwYXRoIGlzIGNvbmZpZ3VyZWQgYXBwcm9wcmlhdGVseSB2aWEgYWx0ZXJuYXRlIG1lYW5zLgotCi1KQVhCX0pSRV9MSUJSQVJZX1BST1ZJREVSX0xBQkVMID0gSlJFCi1KQVhCX0pSRV9MSUJSQVJZX1BST1ZJREVSX01FU1NBR0UgPSBUaGUgcHJvamVjdCBKUkUgcHJvdmlkZXMgdGhlIGFubm90YXRpb25zIGFuZCBpbXBsZW1lbnRhdGlvbiB0byBzdXBwb3J0IHRoZSBjaG9zZW4gSkFYQiBwbGF0Zm9ybS4KLQotSkFYQl9WQUxJREFUT1IgPSBKQVhCIFZhbGlkYXRvcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcGx1Z2luLnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYjU3M2UuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuNCI/PgotPCEtLQotICAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gICAgIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgICAgCi0gICAgIENvbnRyaWJ1dG9yczogCi0gICAgIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPHBsdWdpbj4KLQkKLQk8IS0tICoqKioqIGV4dGVuc2lvbiBwb2ludHMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iamF4YlBsYXRmb3JtcyIKLQkJbmFtZT0iJUpBWEJfUExBVEZPUk1TIgotCQlzY2hlbWE9InNjaGVtYS9qYXhiUGxhdGZvcm1zLmV4c2QiLz4KLQkKLQkKLQk8IS0tICoqKioqIGV4dGVuc2lvbnMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgotCQkKLQkJPGNvbnRlbnQtdHlwZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGVudC5qYXhiSW5kZXgiCi0JCQluYW1lPSIlSkFYQl9JTkRFWF9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCIKLQkJCXByaW9yaXR5PSJoaWdoIgotCQkJZmlsZS1uYW1lcz0iamF4Yi5pbmRleCIvPgotCQkKLQkJPGNvbnRlbnQtdHlwZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGVudC5qYXhiUHJvcGVydGllcyIKLQkJCW5hbWU9IiVKQVhCX1BST1BFUlRJRVNfQ09OVEVOVCIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YVByb3BlcnRpZXMiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCWZpbGUtbmFtZXM9ImpheGIucHJvcGVydGllcyIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIAotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotCQkKLQkJPHByb3BlcnR5VGVzdGVyCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wcm9wZXJ0eVRlc3Rlci5wbGF0Zm9ybVJlc291cmNlIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIgotCQkJcHJvcGVydGllcz0iamF4YlBsYXRmb3JtLCBqYXhiUGxhdGZvcm1Hcm91cCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpheGJQbGF0Zm9ybVRlc3RlciIvPgotCQkKLQkJPHByb3BlcnR5VGVzdGVyCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wcm9wZXJ0eVRlc3Rlci5qYXZhRWxlbWVudCIKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudCIKLQkJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIKLQkJCXByb3BlcnRpZXM9ImpheGJQbGF0Zm9ybSwgamF4YlBsYXRmb3JtR3JvdXAiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KYXhiUGxhdGZvcm1UZXN0ZXIiLz4KLQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucHJvcGVydHlUZXN0ZXIuamF4YlBsYXRmb3JtRGVzY3JpcHRpb24iCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIgotCQkJcHJvcGVydGllcz0iamF4YlBsYXRmb3JtLCBqYXhiUGxhdGZvcm1Hcm91cCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpheGJQbGF0Zm9ybVRlc3RlciIvPgotCQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucHJvcGVydHlUZXN0ZXIuamF4YkxpYnJhcnlQcm92aWRlckNvbmZpZyIKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyIKLQkJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIKLQkJCXByb3BlcnRpZXM9ImpheGJQbGF0Zm9ybSwgamF4YlBsYXRmb3JtR3JvdXAiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KYXhiUGxhdGZvcm1UZXN0ZXIiLz4KLQkJCQotCTwvZXh0ZW5zaW9uPgotCQkJCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEV4dGVuc2lvbjogSkFYQiBQcm9ibGVtIE1hcmtlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICoqKiogRG8gTk9UIHF1YWxpZnkgdGhlIG1hcmtlciBpZCB3aXRoIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUsIHNlZSBidWcgMjUyODkxIAkJIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFya2VycyIKLQkJaWQ9ImpheGJQcm9ibGVtTWFya2VyIiAKLQkJbmFtZT0iJUpBWEJfUFJPQkxFTV9NQVJLRVIiPgotCi0JCTxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+Ci0JCQotCQk8IS0tIENhbid0IHVzZSB0ZXh0IG1hcmtlciB1bnRpbCB3ZSBoYXZlIHNwZWNpZmljIG1vZGVscyBmb3IgZWFjaCBpbnB1dCB0eXBlIChYTUwsIGphdmEpCi0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy50ZXh0bWFya2VyIi8+Ci0JCS0tPgotCQkKLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnByb2JsZW1tYXJrZXIyIi8+Ci0JCTxzdXBlciB0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5wcm9ibGVtIi8+Ci0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5qYXhiUGxhdGZvcm1zIj4KLQkJCi0JCTxqYXhiUGxhdGZvcm1Hcm91cAotICAgICAgICAJaWQ9ImdlbmVyaWMiCi0gICAgICAgIAlsYWJlbD0iJUdFTkVSSUNfUExBVEZPUk1fR1JPVVBfTEFCRUwiLz4KLQkJCi0JCTxqYXhiUGxhdGZvcm0KLQkJCWlkPSJnZW5lcmljXzJfMSIKLQkJCWxhYmVsPSIlR0VORVJJQ18yXzFfUExBVEZPUk1fTEFCRUwiCi0JCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuamF4YjIxLkdlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IgotCQkJZ3JvdXA9ImdlbmVyaWMiCi0JCQlqYXhiRmFjZXRWZXJzaW9uPSIyLjEiCi0JCQlkZWZhdWx0PSJmYWxzZSIvPgotCi0JCTxqYXhiUGxhdGZvcm0KLSAgICAgICAJIAlpZD0iZ2VuZXJpY18yXzIiCi0gICAgICAgCSAJbGFiZWw9IiVHRU5FUklDXzJfMl9QTEFURk9STV9MQUJFTCIKLSAgICAgICAJIAlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuamF4YjIyLkdlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IgotICAgICAgICAJZ3JvdXA9ImdlbmVyaWMiCi0gICAgICAgIAlqYXhiRmFjZXRWZXJzaW9uPSIyLjIiCi0gICAgICAgIAlkZWZhdWx0PSJmYWxzZSIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicmFyeVZhbGlkYXRvcnMiPgotCQkKLQkJPGxpYnJhcnlWYWxpZGF0b3IKLQkJCWlkPSJqYXhiSnJlTGlicmFyeVZhbGlkYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnZhbC5KYXhiSnJlTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5leHRlbmRzSWQiIHZhbHVlPSJqYXhiLWpyZS1saWJyYXJ5LXByb3ZpZGVyIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2xpYnJhcnlWYWxpZGF0b3I+Ci0JCQotCQk8bGlicmFyeVZhbGlkYXRvcgotCQkJaWQ9ImdlbmVyaWNKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJ2YWwuR2VuZXJpY0pheGJVc2VyTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5leHRlbmRzSWQiIHZhbHVlPSJqYXhiLXVzZXItbGlicmFyeS1wcm92aWRlciIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9saWJyYXJ5VmFsaWRhdG9yPgotCQkKLQkJPCEtLQotCQk8bGlicmFyeVZhbGlkYXRvcgotCQkJaWQ9ImdlbmVyaWNFY2xpcHNlbGlua0J1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmludGVybmFsLmxpYnZhbC5HZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb3JlLmV4dGVuZHNJZCIgdmFsdWU9ImVjbGlwc2VsaW5rLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9saWJyYXJ5VmFsaWRhdG9yPgotCQktLT4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnJhcnlQcm92aWRlcnMiPgotCQkKLQkJPHByb3ZpZGVyCi0JCQlpZD0iamF4Yi1uby1vcC1saWJyYXJ5LXByb3ZpZGVyIgotCQkJZXh0ZW5kcz0ianB0LW5vLW9wLWxpYnJhcnktcHJvdmlkZXIiPgotCQkJPHBhcmFtIG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSIlSkFYQl9OT19PUF9MSUJSQVJZX1BST1ZJREVSX01FU1NBR0UiLz4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPHRlc3QgCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCXZhbHVlPSJqcHQuamF4YiIgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyCi0JCQlpZD0iamF4Yi1qcmUtbGlicmFyeS1wcm92aWRlciI+Ci0JCQk8bGFiZWw+JUpBWEJfSlJFX0xJQlJBUllfUFJPVklERVJfTEFCRUw8L2xhYmVsPgotCQkJPHByaW9yaXR5PjkwMDwvcHJpb3JpdHk+Ci0JCQk8cGFyYW0gbmFtZT0ibWVzc2FnZSIgdmFsdWU9IiVKQVhCX0pSRV9MSUJSQVJZX1BST1ZJREVSX01FU1NBR0UiLz4KLSAgICAgIAkJPGVuYWJsZW1lbnQ+Ci0gICAgICAJCQk8YW5kPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCQl2YWx1ZT0ianB0LmpheGIiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC9hbmQ+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotCQkJCTxjb25maWcgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KYXhiSnJlTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyIvPgotCQkJCTxvcGVyYXRpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTm9PcExpYnJhcnlQcm92aWRlck9wZXJhdGlvbiIvPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uIHR5cGU9IlVOSU5TVEFMTCI+Ci0JCQkJPG9wZXJhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5Ob09wTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uIi8+Ci0JCQk8L2FjdGlvbj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTxwcm92aWRlcgotCQkJaWQ9ImpheGItdXNlci1saWJyYXJ5LXByb3ZpZGVyIgotCQkJZXh0ZW5kcz0id3RwLXVzZXItbGlicmFyeS1wcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJdmFsdWU9ImpwdC5qYXhiIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotCQkJCTxjb25maWcgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KYXhiVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWciLz4KLQkJCQk8b3BlcmF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uIi8+Ci0JCQk8L2FjdGlvbj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTwhLS0KLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpheGItb3NnaS1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiCi0JCQlleHRlbmRzPSJ3dHAtb3NnaS1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiCi0JCQlhYnN0cmFjdD0idHJ1ZSI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJdmFsdWU9ImpwdC5qYXhiIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8YWN0aW9uIHR5cGU9IklOU1RBTEwiPgotCQkJCTxjb25maWcgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KYXhiT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIi8+Ci0JCQkJPG9wZXJhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24iLz4KLQkJCTwvYWN0aW9uPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyCi0JCQlpZD0iamF4Yi1lY2xpcHNlbGluay1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiCi0JCQlleHRlbmRzPSJqYXhiLW9zZ2ktYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIgotCQkJYWJzdHJhY3Q9InRydWUiLz4KLQkJLS0+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lcyI+Ci0JCQotCQk8c3VwcG9ydGVkPgotCQkJPGZhY2V0IGlkPSJqcHQuamF4YiIvPgotCQkJPHJ1bnRpbWUtY29tcG9uZW50IGFueT0idHJ1ZSIvPgotCQk8L3N1cHBvcnRlZD4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZmFjZXRzIj4KLQkJCi0JCTxwcm9qZWN0LWZhY2V0IGlkPSJqcHQuamF4YiI+Ci0JCQk8bGFiZWw+JUpBWEJfRkFDRVRfTEFCRUw8L2xhYmVsPgotCQkJPGRlc2NyaXB0aW9uPiVKQVhCX0ZBQ0VUX0RFU0NSSVBUSU9OPC9kZXNjcmlwdGlvbj4KLQkJCTxkZWZhdWx0LXZlcnNpb24gdmVyc2lvbj0iMi4xIi8+Ci0JCTwvcHJvamVjdC1mYWNldD4KLQkJCi0JCTxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpwdC5qYXhiIiB2ZXJzaW9uPSIyLjEiPgotCQkJPGNvbnN0cmFpbnQ+Ci0JCQkJPHJlcXVpcmVzIGZhY2V0PSJqYXZhIiB2ZXJzaW9uPSJbNS4wIi8+Ci0JCQk8L2NvbnN0cmFpbnQ+Ci0JCTwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCQkKLQkJPHByb2plY3QtZmFjZXQtdmVyc2lvbiBmYWNldD0ianB0LmpheGIiIHZlcnNpb249IjIuMiI+Ci0JCQk8Y29uc3RyYWludD4KLQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImphdmEiIHZlcnNpb249Ils1LjAiLz4KLQkJCTwvY29uc3RyYWludD4KLQkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0JCQotCQk8dGVtcGxhdGUgaWQ9ImpwdC5qYXhiLnRlbXBsYXRlIj4KLQkJCTxsYWJlbD4lSkFYQl9URU1QTEFURV9MQUJFTDwvbGFiZWw+Ci0JCQk8Zml4ZWQgZmFjZXQ9ImpwdC5qYXhiIi8+Ci0JCQk8Zml4ZWQgZmFjZXQ9ImphdmEiLz4KLQkJPC90ZW1wbGF0ZT4KLQkJCi0JCTxhY3Rpb24gZmFjZXQ9ImpwdC5qYXhiIiB0eXBlPSJpbnN0YWxsIiBpZD0ianB0LmpheGIuaW5zdGFsbCI+Ci0JCQk8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZmFjZXQuSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIi8+Ci0JCQk8ZGVsZWdhdGUgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZmFjZXQuSmF4YkZhY2V0SW5zdGFsbERlbGVnYXRlIi8+Ci0JCTwvYWN0aW9uPgotCQkKLQkJPGFjdGlvbiBmYWNldD0ianB0LmpheGIiIHR5cGU9InZlcnNpb24tY2hhbmdlIiBpZD0ianB0LmpheGIudmVyc2lvbi1jaGFuZ2UiPgotCQkJPGNvbmZpZy1mYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlciIvPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZSIvPgotCQk8L2FjdGlvbj4KLQkJCi0JCTxhY3Rpb24gZmFjZXQ9ImpwdC5qYXhiIiB0eXBlPSJ1bmluc3RhbGwiIGlkPSJqcHQuamF4Yi51bmluc3RhbGwiPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldFVuaW5zdGFsbERlbGVnYXRlIi8+Ci0JCTwvYWN0aW9uPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3JWMiIKLQkJaWQ9ImpheGJWYWxpZGF0b3IiCi0JCW5hbWU9IiVKQVhCX1ZBTElEQVRPUiI+Ci0JCQotCQk8dmFsaWRhdG9yCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0b3IiCi0gICAgICAgIAltYXJrZXJJZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5qYXhiUHJvYmxlbU1hcmtlciI+Ci0JCQk8aW5jbHVkZT4KLQkJCQk8cnVsZXM+Ci0JCQkJCTxmYWNldCBpZD0ianB0LmpheGIiLz4KLQkJCQk8L3J1bGVzPgotCQkJPC9pbmNsdWRlPgotCQkJPGluY2x1ZGU+Ci0JCQkJPHJ1bGVzPgotCQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFTb3VyY2UiIGV4YWN0TWF0Y2g9ImZhbHNlIi8+Ci0JCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanB0LmNvcmUuY29udGVudC5qYXZhUGFja2FnZUluZm8iIGV4YWN0TWF0Y2g9ImZhbHNlIi8+Ci0JCQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZW50LmpheGJQcm9wZXJ0aWVzIiBleGFjdE1hdGNoPSJmYWxzZSIvPgotCQkJCTwvcnVsZXM+Ci0JCQk8L2luY2x1ZGU+Ci0JCTwvdmFsaWRhdG9yPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkJCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pheGJfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcHJvcGVydHlfZmlsZXMvamF4Yl92YWxpZGF0aW9uLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZjc1MmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcHJvcGVydHlfZmlsZXMvamF4Yl92YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTk9fSkFYQl9QUk9KRUNUID0gVGhpcyBwcm9qZWN0IGhhcyB0aGUgSkFYQiBmYWNldCwgYnV0IG5vIEpBWEIgY29udGVudCBjb3VsZCBiZSBjcmVhdGVkLiAgU2VlIHRoZSBlcnJvciBsb2cgZm9yIG1vcmUgZGV0YWlscy4KLVBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSID0gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBKQVhCIGxpYnJhcnkgcHJvdmlkZXIgaXMgaW52YWxpZC4KLVBST0pFQ1RfX1VOUkVTT0xWRURfU0NIRU1BID0gQ2Fubm90IHJlc29sdmUgdGhlIHNjaGVtYSB3aXRoIGxvY2F0aW9uICcnezB9JycuCi1QUk9KRUNUX19EVVBMSUNBVEVfTkFNRVNQQUNFID0gRHVwbGljYXRlIHNjaGVtYSBsaWJyYXJ5IGVudHJpZXMgd2l0aCB0aGUgbmFtZXNwYWNlICcnezB9JycuCi0KLVBBQ0tBR0VfTk9fU0NIRU1BX0ZPUl9OQU1FU1BBQ0UgPSBUaGVyZSBpcyBubyBzY2hlbWEgc3BlY2lmaWVkIG9uIHRoZSBwcm9qZWN0IGZvciB0aGUgbmFtZXNwYWNlICcnezB9Jycgb24gdGhlIHBhY2thZ2UgJyd7MX0nJy4gIE5vIHNjaGVtYS1zcGVjaWZpYyB2YWxpZGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLgotUEFDS0FHRV9YTUxfSkFWQV9UWVBFX0FEQVBURVJfVFlQRV9OT1RfU1BFQ0lGSUVEID0gVGhlIHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFuIFhNTCBKYXZhIHR5cGUgYWRhcHRlciBvbiBhIHBhY2thZ2UKLVhNTF9TQ0hFTUFfX01JU01BVENIRURfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCA9IFRoZSBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0IGNvbmZsaWN0cyB3aXRoIHdoYXQgaXMgc3BlY2lmaWVkIG9uIHRoZSBzY2hlbWEKLVhNTF9TQ0hFTUFfX01JU01BVENIRURfRUxFTUVOVF9GT1JNX0RFRkFVTFQgPSBUaGUgZWxlbWVudCBmb3JtIGRlZmF1bHQgY29uZmxpY3RzIHdpdGggd2hhdCBpcyBzcGVjaWZpZWQgb24gdGhlIHNjaGVtYQotCi1YTUxfRU5VTV9fTk9OX1NJTVBMRV9TQ0hFTUFfVFlQRSA9IFRoZSB0eXBlICcnezB9JycgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSBzaW1wbGUgc2NoZW1hIHR5cGUuCi0KLVhNTF9UWVBFX19VTk1BVENISU5HX05BTUVTUEFDRV9GT1JfQU5PTllNT1VTX1RZUEUgPSBUaGUgbmFtZXNwYWNlIGZvciBhbiBhbm9ueW1vdXMgdHlwZSBzaG91bGQgbm90IGJlIGRpZmZlcmVudCBmcm9tIGl0cyBwYWNrYWdlCi1YTUxfVFlQRV9fVU5TUEVDSUZJRURfRkFDVE9SWV9NRVRIT0QgPSBJZiBhIGZhY3RvcnkgY2xhc3MgaXMgc3BlY2lmaWVkLCBhIGZhY3RvcnkgbWV0aG9kIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQuCi1YTUxfVFlQRV9fTk9fUFVCTElDX09SX1BST1RFQ1RFRF9DT05TVFJVQ1RPUiA9IEEgY2xhc3MgbXVzdCBoYXZlIGEgcHVibGljIG9yIHByb3RlY3RlZCBuby1hcmcgY29uc3RydWN0b3IsIHVubGVzcyBhIGZhY3RvcnkgY2xhc3MvbWV0aG9kIGlzIHByb3ZpZGVkIG9yIHRoZSBjbGFzcyBpcyBhZGFwdGVkIHdpdGggYW4gWG1sQWRhcHRlci4KLVhNTF9UWVBFX19EVVBMSUNBVEVfUFJPUCA9IER1cGxpY2F0ZSBwcm9wZXJ0eSAnJ3swfScnLgotWE1MX1RZUEVfX01JU1NJTkdfUFJPUCA9IE1pc3NpbmcgcmVxdWlyZWQgcHJvcGVydHkgJyd7MH0nJy4KLVhNTF9UWVBFX19OT05FWElTVEVOVF9QUk9QID0gTm9uZXhpc3RlbnQgcHJvcGVydHkgJyd7MH0nJy4KLVhNTF9UWVBFX19UUkFOU0lFTlRfUFJPUCA9IFRoZSBwcm9wZXJ0eSAnJ3swfScnIGlzIHRyYW5zaWVudCBhbmQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcHJvcGVydHkgb3JkZXIuCi1YTUxfVFlQRV9fRkFDVE9SWV9DTEFTU19JR05PUkVEX0ZPUl9FTlVNID0gVGhlIGZhY3RvcnkgY2xhc3MgZWxlbWVudCBpcyBpZ25vcmVkIGZvciBlbnVtcy4KLVhNTF9UWVBFX19GQUNUT1JZX01FVEhPRF9JR05PUkVEX0ZPUl9FTlVNID0gVGhlIGZhY3RvcnkgbWV0aG9kIGVsZW1lbnQgaXMgaWdub3JlZCBmb3IgZW51bXMuCi1YTUxfVFlQRV9fUFJPUF9PUkRFUl9JR05PUkVEX0ZPUl9FTlVNID0gVGhlIHByb3Agb3JkZXIgZWxlbWVudCBpcyBpZ25vcmVkIGZvciBlbnVtcy4KLQotWE1MX1JPT1RfRUxFTUVOVF9UWVBFX0NPTkZMSUNUU19XSVRIX1hNTF9UWVBFID0gVGhlIHhtbCB0eXBlIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIHdpdGggbmFtZSAnJ3swfScnIGFuZCBuYW1lc3BhY2UgJyd7MX0nJyBjb25mbGljdHMgd2l0aCB0aGUgeG1sIHR5cGUgb2YgdGhlIGFzc29jaWF0ZWQgY2xhc3MKLQotWE1MX0VOVU1fVkFMVUVfX0lOVkFMSURfTEVYSUNBTF9WQUxVRSA9IEludmFsaWQgbGV4aWNhbCB2YWx1ZSBcInswfVwiIGZvciBzY2hlbWEgdHlwZSAnJ3sxfScnLgotCi1BVFRSSUJVVEVfTUFQUElOR19fVU5TVVBQT1JURURfQU5OT1RBVElPTiA9IFRoZSBhbm5vdGF0aW9uICcnezB9JycgaXMgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoICcnezF9JycuIAotQVRUUklCVVRFX01BUFBJTkdfWE1MX0pBVkFfVFlQRV9BREFQVEVSX1RZUEVfTk9UX0RFRklORUQgPSBUaGUgdHlwZSBmb3IgWE1MIEphdmEgdHlwZSBhZGFwdGVyIGlzIG5vdCBkZWZpbmVkLgotWE1MX0VMRU1FTlRfV1JBUFBFUl9ERUZJTkVEX09OX05PTl9BUlJBWV9OT05fQ09MTEVDVElPTiA9IEFuIFhNTCBlbGVtZW50IHdyYXBwZXIgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbiBhIGNvbGxlY3Rpb24gb3IgYXJyYXkgcHJvcGVydHkKLQotWE1MX0FOWV9BVFRSSUJVVEVfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQgPSBNdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBhbm5vdGF0ZWQgd2l0aCBAWG1sQW55QXR0cmlidXRlLiAgQXQgbW9zdCBvbmUgZmllbGQgb3IgcHJvcGVydHkgcGVyIGNsYXNzIGlzIGFsbG93ZWQuCi1YTUxfQU5ZX0FUVFJJQlVURV9fTk9OX01BUF9UWVBFID0gVGhlIHR5cGUgb2YgYSBmaWVsZCBvciBwcm9wZXJ0eSBhbm5vdGF0ZWQgd2l0aCBAWG1sQW55QXR0cmlidXRlIG11c3QgYmUgYXNzaWduYWJsZSB0byBqYXZhLnV0aWwuTWFwLgotCi1YTUxfQU5ZX0VMRU1FTlRfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQgPSBNdWx0aXBsZSBhdHRyaWJ1dGVzIGFyZSBhbm5vdGF0ZWQgd2l0aCBAWG1sQW55RWxlbWVudC4gIEF0IG1vc3Qgb25lIGZpZWxkIG9yIHByb3BlcnR5IHBlciBjbGFzcyBpcyBhbGxvd2VkLgotCi1YTUxfQVRUUklCVVRFX19JTlZBTElEX1NDSEVNQV9UWVBFID0gVGhlIGV4cGVjdGVkIFhNTCB0eXBlIGFzc29jaWF0ZWQgd2l0aCAnJ3swfScnIGlzIG5vdCB2YWxpZCBmb3IgWE1MIGF0dHJpYnV0ZSAnJ3sxfScnLgotCi1YTUxfRUxFTUVOVF9fVU5TUEVDSUZJRURfVFlQRSA9IFVuc3BlY2lmaWVkIFhNTCBlbGVtZW50IHR5cGUuCi1YTUxfRUxFTUVOVF9fSUxMRUdBTF9UWVBFID0gWE1MIGVsZW1lbnQgdHlwZSBtdXN0IGJlIGEgc3ViLXR5cGUgb2YgJyd7MH0nJy4KLVhNTF9FTEVNRU5UX19JTlZBTElEX1NDSEVNQV9UWVBFID0gVGhlIGV4cGVjdGVkIFhNTCB0eXBlIGFzc29jaWF0ZWQgd2l0aCAnJ3swfScnIGlzIG5vdCB2YWxpZCBmb3IgWE1MIGVsZW1lbnQgJyd7MX0nJy4KLQotWE1MX0VMRU1FTlRfREVDTF9fSU5WQUxJRF9NRVRIT0RfU0lHTkFUVVJFX1JFVFVSTl9UWVBFID0gQW4gZWxlbWVudCBmYWN0b3J5IG1ldGhvZCBtdXN0IGhhdmUgYSByZXR1cm4gdHlwZSBvZiAnJ2phdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50JycuCi1YTUxfRUxFTUVOVF9ERUNMX19JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfUEFSQU0gPSBBbiBlbGVtZW50IGZhY3RvcnkgbWV0aG9kIG11c3QgaGF2ZSBhIHNpbmdsZSBwYXJhbWV0ZXIgYXNzaWduYWJsZSB0byAnJ2phdmEubGFuZy5PYmplY3QnJy4KLVhNTF9FTEVNRU5UX0RFQ0xfX1NVQlNUX0hFQURfTkFNRV9FUVVBTFNfTkFNRSA9IFhNTCBlbGVtZW50IGRlY2wgc3Vic3RpdHV0aW9uIGhlYWQgbXVzdCBub3QgbWF0Y2ggaXRzIFhNTCBlbGVtZW50LgotWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OT19NQVRDSElOR19FTEVNRU5UX0RFQ0wgPSBYTUwgZWxlbWVudCBkZWNsIHN1YnN0aXR1dGlvbiBoZWFkIG11c3QgbWF0Y2ggYW5vdGhlciBYTUwgZWxlbWVudCBkZWNsLgotCi1YTUxfRUxFTUVOVF9SRUZfX1VOU1BFQ0lGSUVEX1RZUEUgPSBVbnNwZWNpZmllZCBYTUwgZWxlbWVudCByZWYgdHlwZS4KLVhNTF9FTEVNRU5UX1JFRl9fSUxMRUdBTF9UWVBFID0gWE1MIGVsZW1lbnQgcmVmIHR5cGUgbXVzdCBiZSBhIHN1Yi10eXBlIG9mICcnezB9JycuCi1YTUxfRUxFTUVOVF9SRUZfX05PX1JPT1RfRUxFTUVOVCA9IE5vIHJvb3QgZWxlbWVudCBzcGVjaWZpZWQgb24gdHlwZSAnJ3swfScnIG9yIGFueSBvZiBpdHMgc3ViLXR5cGVzLgotWE1MX0VMRU1FTlRfUkVGX19OT19SRUdJU1RSWSA9IE5vIFhNTCByZWdpc3RyeSBjb25maWd1cmVkIGZvciB0aGlzIHBhY2thZ2UuCi1YTUxfRUxFTUVOVF9SRUZfX05PX01BVENISU5HX0VMRU1FTlRfREVDTCA9IE5vIFhNTCBlbGVtZW50IGRlY2wgaW4gdGhlIFhNTCByZWdpc3RyeSBtYXRjaGluZyB0aGUgbmFtZXNwYWNlICcnezB9JycgYW5kIG5hbWUgJyd7MX0nJy4KLQotWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUgPSBEdXBsaWNhdGUgdHlwZSAnJ3swfScnIGluIFhNTCBlbGVtZW50IHJlZnMuCi1YTUxfRUxFTUVOVF9SRUZTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSBEdXBsaWNhdGUgZWxlbWVudCBuYW1lICcnezB9JycgaW4gWE1MIGVsZW1lbnQgcmVmcy4KLQkKLVhNTF9FTEVNRU5UU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUgPSBEdXBsaWNhdGUgdHlwZSAnJ3swfScnIGluIFhNTCBlbGVtZW50cy4KLVhNTF9FTEVNRU5UU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1FOQU1FID0gRHVwbGljYXRlIGVsZW1lbnQgbmFtZSAnJ3swfScnIGluIFhNTCBlbGVtZW50cy4KLQotWE1MX0lEX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEID0gTXVsdGlwbGUgYXR0cmlidXRlcyBhcmUgbWFwcGVkIGFzIFhtbElELiAgQXQgbW9zdCBvbmUgZmllbGQgb3IgcHJvcGVydHkgcGVyIGNsYXNzIGlzIGFsbG93ZWQuCi1YTUxfSURfX0FUVFJJQlVURV9UWVBFX05PVF9TVFJJTkcgPSBBbiBhdHRyaWJ1dGUgbWFwcGVkIGFzIFhtbElEIG11c3QgaGF2ZSB0eXBlICcnamF2YS5sYW5nLlN0cmluZycnLgotWE1MX0lEX19TQ0hFTUFfVFlQRV9OT1RfSUQgPSBJbiBvcmRlciB0byBiZSBtYXBwZWQgYXMgWG1sSUQsIHRoZSB0eXBlIG9mIHRoZSBzY2hlbWEgY29tcG9uZW50ICcnezB9JycgbXVzdCBiZSAnJ0lEJycuCi0KLVhNTF9JRF9SRUZfX1RZUEVfRE9FU19OT1RfQ09OVEFJTl9YTUxfSUQgPSAgSW4gb3JkZXIgdG8gYmUgdXNlZCB3aXRoIFhtbElEUkVGLCB0eXBlICcnezB9JycgbXVzdCBjb250YWluIGEgcHJvcGVydHkgb3IgZmllbGQgbWFwcGVkIGFzIGFuIFhtbElELgotWE1MX0lEX1JFRl9fU0NIRU1BX1RZUEVfTk9UX0lEUkVGID0gSW4gb3JkZXIgdG8gYmUgdXNlZCB3aXRoIFhtbElEUkVGLCB0aGUgaXRlbSB0eXBlIG9mIHRoZSBzY2hlbWEgY29tcG9uZW50ICcnezB9JycgbXVzdCBiZSAnJ0lEUkVGJycuCi0KLVhNTF9MSVNUX19BVFRSSUJVVEVfTk9UX0NPTExFQ1RJT05fVFlQRSA9IEluIG9yZGVyIHRvIGJlIG1hcHBlZCBhcyBYbWxMaXN0LCBhbiBhdHRyaWJ1dGUgbXVzdCBoYXZlIGEgY29sbGVjdGlvbiBvciBhcnJheSB0eXBlLgotWE1MX0xJU1RfX0lURU1fVFlQRV9OT1RfTUFQUEVEX1RPX1ZBTElEX1NDSEVNQV9UWVBFID0gSW4gb3JkZXIgdG8gYmUgbWFwcGVkIGFzIFhtbExpc3QsIHRoZSB0eXBlICcnezB9JycgbXVzdCBiZSBtYXBwZWQgdG8gYSBub24tbGlzdCBzaW1wbGUgc2NoZW1hIHR5cGUuCi0KLVhNTF9SRUdJU1RSWV9fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1FOQU1FID0gRHVwbGljYXRlIFhtbEVsZW1lbnREZWNsIG5hbWUgJyd7MH0nJyB7MX0uCi0KLVhNTF9WQUxVRV9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCA9IE11bHRpcGxlIGF0dHJpYnV0ZXMgYXJlIG1hcHBlZCBhcyBYbWxWYWx1ZS4gIEF0IG1vc3Qgb25lIGZpZWxkIG9yIHByb3BlcnR5IHBlciBjbGFzcyBpcyBhbGxvd2VkLgotWE1MX1ZBTFVFX19OT19URVhUX0NPTlRFTlQgPSBUaGVyZSBpcyBubyB0ZXh0IGNvbnRlbnQgZm9yIHRoZSBYTUwgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzcy4KLVhNTF9WQUxVRV9fSU5WQUxJRF9TQ0hFTUFfVFlQRSA9IFRoZSBleHBlY3RlZCBYTUwgdHlwZSBhc3NvY2lhdGVkIHdpdGggJyd7MH0nJyBpcyBub3QgdmFsaWQgZm9yIHRleHQgY29udGVudCBvZiB0aGUgWE1MIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MuCi0KLVhNTF9WQUxVRV9NQVBQSU5HX1dJVEhfTk9OX1hNTF9BVFRSSUJVVEVfTUFQUElOR19ERUZJTkVEID0gQXR0cmlidXRlICcnezB9JycgbXVzdCBiZSBtYXBwZWQgYXMgWG1sQXR0cmlidXRlIGJlY2F1c2UgYW5vdGhlciBhdHRyaWJ1dGUgJyd7MX0nJyBpcyBtYXBwZWQgYXMgWG1sVmFsdWUKLQotWE1MX1NDSEVNQV9UWVBFX19OT05fU0lNUExFX1RZUEUgPSBUaGUgc2NoZW1hIHR5cGUgJyd7MH0nJyBpcyBub3QgYSBzaW1wbGUgdHlwZS4KLVhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9OT1RfU1BFQ0lGSUVEX09OX1BBQ0tBR0UgPSBUaGUgJyd0eXBlJycgZWxlbWVudCBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gZGVmaW5pbmcgYSBzY2hlbWEgdHlwZSBvbiBhIHBhY2thZ2UuCi1YTUxfU0NIRU1BX1RZUEVfX1RZUEVfU1BFQ0lGSUVEX09OX0FUVFJJQlVURSA9IFRoZSAnJ3R5cGUnJyBlbGVtZW50IHNob3VsZCBub3QgYmUgc3BlY2lmaWVkIHdoZW4gZGVmaW5pbmcgYSBzY2hlbWEgdHlwZSBvbiBhIGZpZWxkIG9yIHByb3BlcnR5LgotCi1RTkFNRV9fTUlTU0lOR19OQU1FID0gezB9IG5hbWUgbm90IHNwZWNpZmllZAotUU5BTUVfX1VOUkVTT0xWRURfQ09NUE9ORU5UID0gQ2Fubm90IHJlc29sdmUgezB9IHdpdGggbmFtZXNwYWNlICcnezF9JycgYW5kIG5hbWUgJyd7Mn0nJyBpbiB0aGlzIGNvbnRleHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9wcm9wZXJ0eV9maWxlcy9qcHRfamF4Yl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2N2ZjZWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvcHJvcGVydHlfZmlsZXMvanB0X2pheGJfY29yZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUNPTlRFWFRfTU9ERUxfU1lOQ19KT0JfTkFNRT1TeW5jaHJvbml6ZSBKQVhCIHByb2plY3Q6ICcnezB9JycKLVVQREFURV9KT0JfTkFNRT1VcGRhdGUgSkFYQiBwcm9qZWN0OiAnJ3swfScnCi1QUkVGRVJFTkNFU19GTFVTSF9KT0JfTkFNRT1GbHVzaCBQcmVmZXJlbmNlczogezB9Ci0KLUNsYXNzZXNHZW5lcmF0b3JfZ2VuZXJhdGluZ0NsYXNzZXMgPSBHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIFNjaGVtYQotQ2xhc3Nlc0dlbmVyYXRvcl9nZW5lcmF0aW5nQ2xhc3Nlc1Rhc2sgPSBHZW5lcmF0aW5nIGNsYXNzZXMKLQotSmF4YkZhY2V0Q29uZmlnX3ZhbGlkYXRlUGxhdGZvcm1Ob3RTcGVjaWZpZWQgPSBQbGF0Zm9ybSBtdXN0IGJlIHNwZWNpZmllZAotSmF4YkZhY2V0Q29uZmlnX3ZhbGlkYXRlUGxhdGZvcm1Eb2VzTm90U3VwcG9ydEZhY2V0VmVyc2lvbiA9IFBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlIGN1cnJlbnQgSkFYQiBmYWNldCB2ZXJzaW9uCi0KLUpyZUxpYnJhcnlWYWxpZGF0b3JfaW52YWxpZFBsYXRmb3JtID0gVGhlIEpSRSBvbmx5IHByb3ZpZGVzIGltcGxlbWVudGF0aW9uIGZvciBhIEdlbmVyaWMgSkFYQiBwbGF0Zm9ybS4KLUpyZUxpYnJhcnlWYWxpZGF0b3JfaW52YWxpZEphdmFGYWNldCA9IFRoZSBzcGVjaWZpZWQgSmF2YSB2ZXJzaW9uIG9mIHswfSBpcyBpbnN1ZmZpY2llbnQgdG8gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgSkFYQiB2ZXJzaW9uIHsxfS4gIFRoZSBKQVhCIGltcGxlbWVudGF0aW9uIG9mIGEgSmF2YSB7MH0gcnVudGltZSBlbnZpcm9ubWVudCBtdXN0IGJlIG1hbnVhbGx5IG92ZXJyaWRkZW4gYnkgYW4gZW5kb3JzZW1lbnQgbWVjaGFuaXNtIG9mIHlvdXIgY2hvaWNlLgotSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkSmF2YUxpYnJhcnkgPSBUaGUgY29uZmlndXJlZCBydW50aW1lIGlzIGluc3VmZmljaWVudCB0byBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIGZvciBKQVhCIHswfS4KLQotU2NoZW1hR2VuZXJhdG9yX2NyZWF0aW5nSkFYQlByb3BlcnRpZXNGaWxlVGFzayA9IENyZWF0aW5nIGpheGIucHJvcGVydGllcyBmaWxlCi0KLVVzZXJMaWJyYXJ5VmFsaWRhdG9yX2luY29tcGF0aWJsZUphdmFGYWNldCA9IFRoZSBzcGVjaWZpZWQgSmF2YSB2ZXJzaW9uIG9mIHswfSBwcm92aWRlcyBhIEpBWEIgaW1wbGVtZW50YXRpb24gdGhhdCBjb25mbGljdHMgd2l0aCBKQVhCIHZlcnNpb24gezF9LiAgVGhlIEpBWEIgaW1wbGVtZW50YXRpb24gb2YgYSBKYXZhIHswfSBydW50aW1lIGVudmlyb25tZW50IG11c3QgYmUgbWFudWFsbHkgb3ZlcnJpZGRlbiBieSBhbiBlbmRvcnNlbWVudCBtZWNoYW5pc20gb2YgeW91ciBjaG9pY2UuCi1Vc2VyTGlicmFyeVZhbGlkYXRvcl9pbmNvbXBhdGlibGVKYXZhTGlicmFyeSA9IFRoZSBjb25maWd1cmVkIHJ1bnRpbWUgY29uZmxpY3RzIHdpdGggSkFYQiB2ZXJzaW9uIHswfS4KLQotWE1MX0FUVFJJQlVURV9ERVNDID0gWE1MIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotWE1MX0VMRU1FTlRfREVTQyA9IFhNTCBlbGVtZW50IGRlY2xhcmF0aW9uCi1YTUxfVFlQRV9ERVNDID0gWE1MIHR5cGUgZGVmaW5pdGlvbgotU1VCU1RJVFVUSU9OX0hFQURfREVTQyA9IFhNTCBlbGVtZW50IHN1YnN0aXR1dGlvbiBoZWFkCi0KLVhNTF9FTEVNRU5UX0RFQ0xfX1NDT1BFID0gaW4gdGhlIHNjb3BlIG9mICcnezB9JycKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NjaGVtYS9qYXhiUGxhdGZvcm1zLmV4c2QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zY2hlbWEvamF4YlBsYXRmb3Jtcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmI5MTk1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NjaGVtYS9qYXhiUGxhdGZvcm1zLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIiBpZD0iamF4YlBsYXRmb3JtcyIgbmFtZT0iSkFYQiBQbGF0Zm9ybXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBpcyB1c2VkIGZvciBkZWZpbmluZyBKQVhCIHBsYXRmb3JtcyBhbmQgSkFYQiBwbGF0Zm9ybSB2ZXJzaW9ucy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICA8bWV0YS5lbGVtZW50IC8+Ci0gICAgICAgICA8L2FwcGluZm8+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqYXhiUGxhdGZvcm1Hcm91cCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqYXhiUGxhdGZvcm0iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpheGJQbGF0Zm9ybUdyb3VwIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIEpBWEIgcGxhdGZvcm0gZ3JvdXAuICBBY3RzIGFzIGEgc29ydCBvZiAmcXVvdDtzdXBlciZxdW90OyBwbGF0Zm9ybS4gIE1vc3QgdXNlZnVsIGZvciBlbmFibGluZyBmdW5jdGlvbmFsaXR5IGZvciBhIHNldCBvZiBwbGF0Zm9ybXMgd2l0aG91dCBoYXZpbmcgdG8gZW5hYmxlIHRoZSBmdW5jdGlvbmFsaXR5IGZvciBlYWNoIHBsYXRmb3JtIHNlcGFyYXRlbHkuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBKQVhCIHBsYXRmb3JtIGdyb3VwLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdHJhbnNsYXRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgSkFYQiBwbGF0Zm9ybSBncm91cC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJqYXhiUGxhdGZvcm0iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgSkFYQiBwbGF0Zm9ybS4gIE9uZSBKQVhCIHBsYXRmb3JtIHdpbGwgYmUgc2VsZWN0ZWQgcGVyIEpBWEItZmFjZXRlZCBwcm9qZWN0LiBTZWUgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUGxhdGZvcm0mbHQ7L3NhbXAmZ3Q7IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEpBWEIgcGxhdGZvcm1zLiAgQWxzbyBzZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmpheGJQbGF0Zm9ybVVpcyBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdHJhbnNsYXRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcGxhdGZvcm0uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJmYWN0b3J5Q2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5Jmx0Oy9zYW1wJmd0Oy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249IjpvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZ3JvdXAiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgd2hpY2ggSkFYQiBwbGF0Zm9ybSBncm91cCB0aGlzIHBsYXRmb3JtIGJlbG9uZ3MgdG8uICBJZiBub25lIGlzIHNwZWNpZmllZCwgdGhpcyBwbGF0Zm9ybSB3aWxsIGJlIGFzc3VtZWQgdG8gYmVsb25nIHRvIGl0cyBvd24gZ3JvdXAgd2l0aCB0aGUgc2FtZSBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqYXhiRmFjZXRWZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIERlY2xhcmVzIHRoZSBKQVhCIGZhY2V0IHZlcnNpb24gZm9yIHdoaWNoIHRoaXMgcGxhdGZvcm0gbWF5IGJlIHVzZWQuIElmIG5vIGZhY2V0IHZlcnNpb24gaXMgc3BlY2lmaWVkLCB0aGlzIHBsYXRmb3JtIGlzIGF2YWlsYWJsZSBmb3IgYWxsIEpBWEIgZmFjZXQgdmVyc2lvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0iYm9vbGVhbiIgdXNlPSJkZWZhdWx0IiB2YWx1ZT0iZmFsc2UiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIERlY2xhcmVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBzaG91bGQgYmUgdXNlZCBhcyBhIGRlZmF1bHQgSkFYQiBwbGF0Zm9ybSBmb3IgbmV3IEpBWEIgcHJvamVjdCBjb250ZW50LiAgTm90ZSB0aGF0IGlmIGEgd29ya3NwYWNlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgZGVmYXVsdCBwbGF0Zm9ybSBmb3IgYSBKQVhCIGZhY2V0IHZlcnNpb24sIG9uZSBvZiB0aGVtIHdpbGwgYmUgY2hvc2VuIGF0IHJhbmRvbS4gIEJ5IGRlZmF1bHQsIGEgcGxhdGZvcm0gaXMgbm90IGEgZGVmYXVsdCBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgSlBUIDMuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YnImZ3Q7Ci0mbHQ7cCZndDsKLVRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyB0aGUgaW5jbHVkZWQgZ2VuZXJpYyBKQVhCIDIuMiBwbGF0Zm9ybSBhbmQgaXRzIHBsYXRmb3JtIGdyb3VwIAotJmx0O3AmZ3Q7Ci0mbHQ7cHJlJmd0OwotJmx0O2V4dGVuc2lvbiBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmpheGJQbGF0Zm9ybXMmcXVvdDsmZ3Q7Ci0KLSAgICZsdDtqYXhiUGxhdGZvcm1Hcm91cAotICAgICAgaWQ9JnF1b3Q7Z2VuZXJpYyZxdW90OwotICAgICAgbGFiZWw9JnF1b3Q7JUdFTkVSSUNfUExBVEZPUk1fR1JPVVBfTEFCRUwmcXVvdDsvJmd0OwotCi0gICAmbHQ7amF4YlBsYXRmb3JtCi0gICAgICBpZD0mcXVvdDtnZW5lcmljXzJfMiZxdW90OwotICAgICAgbGFiZWw9JnF1b3Q7JUdFTkVSSUNfMl8yX1BMQVRGT1JNX0xBQkVMJnF1b3Q7Ci0gICAgICBmYWN0b3J5Q2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjIuR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkmcXVvdDsKLSAgICAgIGdyb3VwPSZxdW90O2dlbmVyaWMmcXVvdDsKLSAgICAgIGpheGJGYWNldFZlcnNpb249JnF1b3Q7Mi4yJnF1b3Q7Ci0gICAgICBkZWZhdWx0PSZxdW90O2ZhbHNlJnF1b3Q7LyZndDsKLQotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaWluZm8iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2JyJmd0OwotUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLXVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLXN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi1waW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi13aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDticiZndDsKLSZsdDtwJmd0O1RoZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIHBsdWctaW4gcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBqYXhiIHBsYXRmb3JtczoKLSZsdDt1bCZndDsKLSZsdDtsaSZndDtnZW5lcmljXzJfMiZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotJmx0Oy9wJmd0OwotJmx0O3AmZ3Q7YW5kIHRoZSBmb2xsb3dpbmcgamF4YiBwbGF0Zm9ybSBncm91cHM6Ci0mbHQ7dWwmZ3Q7Ci0mbHQ7bGkmZ3Q7Z2VuZXJpYyZsdDsvbGkmZ3Q7Ci0mbHQ7L3VsJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLVRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLWFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gCi1Db250cmlidXRvcnM6Ci1PcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9HZW5lcmljSmF4YlBsYXRmb3JtLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9HZW5lcmljSmF4YlBsYXRmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Y2RhMzcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvR2VuZXJpY0pheGJQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci0KLS8qKgotICogQ29uc3RhbnRzIHBlcnRhaW5pbmcgdG8gdGhlIEdlbmVyaWMgSkFYQiBwbGF0Zm9ybXMgYW5kIHRoZWlyIGdyb3VwLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4YlBsYXRmb3JtIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gR1JPVVAgCi0JCQk9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm1Hcm91cCgiZ2VuZXJpYyIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfMSAKLQkJCT0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybSgiZ2VuZXJpY18yXzEiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzIgCi0JCQk9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm0oImdlbmVyaWNfMl8yIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQkvKioKLQkgKiBOb3QgZm9yIGluc3RhbnRpYXRpb24KLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNKYXhiUGxhdGZvcm0oKSB7fQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWY2Y2Q1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0dlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JSm9iTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRWxlbWVudENoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuSnB0Q29tbW9uQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkNhbGxiYWNrSm9iU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpvYkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSm9iU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Bc3luY2hyb25vdXNDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RhdGVmdWxDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TeW5jaHJvbml6ZWRCb29sZWFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLlNpbXBsZUpheGJQcm9qZWN0Q29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgSkFYQiBwcm9qZWN0IG1hbmFnZXIgbWFpbnRhaW5zIGEgbGlzdCBvZiBhbGwgSkFYQiBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotICogSXQga2VlcHMgdGhlIGxpc3QgKGFuZCB0aGUgc3RhdGUgb2YgdGhlIEpBWEIgcHJvamVjdHMgdGhlbXNlbHZlcykKLSAqIHN5bmNocm9uaXplZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnkgbGlzdGVuaW5nIGZvciB2YXJpb3VzCi0gKiBjaGFuZ2VzOjx1bD4KLSAqIDxsaT5SZXNvdXJjZQotICogPGxpPkphdmEKLSAqIDxsaT5GYWNldGVkIFByb2plY3QKLSAqIDwvdWw+Ci0gKiBXZSB1c2UgYW4gRWNsaXBzZSB7QGxpbmsgSUxvY2sgbG9ja30gdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBKQVhCCi0gKiBwcm9qZWN0cyB3aGVuIGRlYWxpbmcgd2l0aCB0aGVzZSBldmVudHMuIEluIGFuIGVmZm9ydCB0byByZWR1Y2UgZGVhZGxvY2tzLAotICogdGhlIHNpbXBsZSBSZXNvdXJjZSBhbmQgSmF2YSBjaGFuZ2UgZXZlbnRzIGFyZSBkaXNwYXRjaGVkIHRvIGEgYmFja2dyb3VuZAotICogdGhyZWFkLCBhbGxvd2luZyB1cyB0byBoYW5kbGUgdGhlIGV2ZW50cyBvdXRzaWRlIG9mIHRoZSB3b3Jrc3BhY2UgbG9jayBoZWxkCi0gKiBkdXJpbmcgcmVzb3VyY2UgYW5kIEphdmEgY2hhbmdlIG5vdGlmaWNhdGlvbnMuCi0gKiA8cD4KLSAqIEV2ZW50cyB0aGF0IHRyaWdnZXIgZWl0aGVyIHRoZSBhZGRpbmcgb3IgcmVtb3Zpbmcgb2YgYSBKQVhCIHByb2plY3QgKGUuZy4KLSAqIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0pIGFyZSBoYW5kbGVkICJzeW5jaHJvbm91c2x5IgotICogYnkgYWxsb3dpbmcgdGhlIGJhY2tncm91bmQgdGhyZWFkIHRvIGhhbmRsZSBhbnkgb3V0c3RhbmRpbmcgZXZlbnRzIGJlZm9yZQotICogdXBkYXRpbmcgdGhlIGxpc3Qgb2YgSkFYQiBwcm9qZWN0cyBhbmQgcmV0dXJuaW5nIGV4ZWN1dGlvbiB0byB0aGUgZXZlbnQKLSAqIHNvdXJjZS4KLSAqIDxwPgotICogVmFyaW91cyB0aGluZ3MgdGhhdCBjYXVzZSB1cyB0byBhZGQgb3IgcmVtb3ZlIGEgSkFYQiBwcm9qZWN0Ojx1bD4KLSAqIDxsaT5UaGUge0BsaW5rIEpwdEpheGJDb3JlUGx1Z2lufSB3aWxsICJsYXppbHkiIGluc3RhbnRpYXRlIGFuZCB7QGxpbmsgI3N0YXJ0KCkgc3RhcnR9Ci0gKiAgICAgYSBKQVhCIHByb2plY3QgbWFuYWdlciBhcyBhcHByb3ByaWF0ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIG1hbmFnZXIKLSAqICAgICB0byBmaW5kIGFuZCBhZGQgYWxsIHByZS1leGlzdGluZyBKQVhCIHByb2plY3RzLgotICogCi0gKiA8bGk+UHJvamVjdCBjcmVhdGVkIGFuZCBmYWNldCBpbnN0YWxsZWQ8cD4KLSAqICAgICB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9Ci0gKiA8bGk+UHJvamVjdCBmYWNldCB1bmluc3RhbGxlZDxwPgotICogICAgIHtAbGluayBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlI1BSRV9VTklOU1RBTEx9Ci0gKiAKLSAqIDxsaT5Qcm9qZWN0IG9wZW5lZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI0FEREVEfSBmYWNldCBzZXR0aW5ncyBmaWxlCi0gKiAgICAgKDxjb2RlPi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sPC9jb2RlPikKLSAqIDxsaT5Qcm9qZWN0IGNsb3NlZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI1JFTU9WRUR9IGZhY2V0IHNldHRpbmdzIGZpbGUKLSAqIAotICogPGxpPlByZS1leGlzdGluZyBwcm9qZWN0IGltcG9ydGVkIGZyb20gZGlyZWN0b3J5IG9yIGFyY2hpdmUgKGNyZWF0ZWQgYW5kIG9wZW5lZCk8cD4KLSAqICAgICB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZSNGSUxFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNBRERFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZQotICogPGxpPlByb2plY3QgcmVuYW1lZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI1JFTU9WRUR9IGZhY2V0IHNldHRpbmdzIGZpbGUgb2Ygb2xkIHByb2plY3QKLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjQURERUR9IGZhY2V0IHNldHRpbmdzIGZpbGUgb2YgbmV3IHByb2plY3QKLSAqIDxsaT5Qcm9qZWN0IGRlbGV0ZWQ8cD4KLSAqICAgICB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZSNGSUxFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNSRU1PVkVEfSBmYWNldCBzZXR0aW5ncyBmaWxlCi0gKiAKLSAqIDxsaT5Qcm9qZWN0IGZhY2V0IGluc3RhbGxlZCBieSBlZGl0aW5nIHRoZSBmYWNldHMgc2V0dGluZ3MgZmlsZSBkaXJlY3RseTxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI0NIQU5HRUR9IGZhY2V0IHNldHRpbmdzIGZpbGUKLSAqIDxsaT5Qcm9qZWN0IGZhY2V0IHVuaW5zdGFsbGVkIGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5PHA+Ci0gKiAgICAge0BsaW5rIElSZXNvdXJjZUNoYW5nZUV2ZW50I1BPU1RfQ0hBTkdFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2UjRklMRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjQ0hBTkdFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZQotICogPC91bD4KLSAqLwotLy9UT0RPIFN0aWxsIG5lZWQgdG8gbG9vayBhdCBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgZm9yIGZhY2V0IHVuaW5zdGFsbAotY2xhc3MgR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlcgotCQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQkJaW1wbGVtZW50cyBKYXhiUHJvamVjdE1hbmFnZXIgewotCQotCS8qKgotCSAqIEFsbCB0aGUgSkFYQiBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXByaXZhdGUgZmluYWwgVmVjdG9yPEpheGJQcm9qZWN0PiBqYXhiUHJvamVjdHMgPSBuZXcgVmVjdG9yPEpheGJQcm9qZWN0PigpOwotCi0JLyoqCi0JICogU3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBKQVhCIHByb2plY3RzLgotCSAqLwotCS8qIHByaXZhdGUgKi8gZmluYWwgSUxvY2sgbG9jayA9IHRoaXMuZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQotCS8qKgotCSAqIERldGVybWluZSBob3cgUmVzb3VyY2UgYW5kIEphdmEgY2hhbmdlIGV2ZW50cyBhcmUKLQkgKiBoYW5kbGVkIChpLmUuIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkpLgotCSAqLwotCXByaXZhdGUgdm9sYXRpbGUgU3RhdGVmdWxDb21tYW5kRXhlY3V0b3IgZXZlbnRIYW5kbGVyID0gbmV3IEFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcihKcHRDb21tb25Db3JlTWVzc2FnZXMuREFMSV9FVkVOVF9IQU5ETEVSX1RIUkVBRF9OQU1FKTsKLQotCS8qKgotCSAqIExpc3RlbiBmb3I8dWw+Ci0JICogPGxpPmNoYW5nZXMgdG8gcHJvamVjdHMgYW5kIGZpbGVzCi0JICogPGxpPmNsZWFuIGJ1aWxkcwotCSAqIDwvdWw+Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiByZXNvdXJjZSBjaGFuZ2UgZXZlbnRzIHRoYXQgaW50ZXJlc3QKLQkgKiB7QGxpbmsgI3Jlc291cmNlQ2hhbmdlTGlzdGVuZXJ9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9DSEFOR0VfRVZFTlRfVFlQRVMgPQotCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UgfAotCQkJSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRDsKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGlzIGZpbGUgdG8gZGV0ZXJtaW5lIHdoZW4gdGhlIEpBWEIgZmFjZXQgaXMKLQkgKiBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gYSAiZmFjZXRlZCIgcHJvamVjdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDRVRFRF9QUk9KRUNUX0ZSQU1FV09SS19TRVRUSU5HU19GSUxFX05BTUUgPSBGYWNldGVkUHJvamVjdEZyYW1ld29yay5QTFVHSU5fSUQgKyAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIExpc3RlbiBmb3IgdGhlIEpBWEIgZmFjZXQgYmVpbmcgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIGEgImZhY2V0ZWQiIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBmYWNldGVkUHJvamVjdExpc3RlbmVyID0gbmV3IEZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiBmYWNldGVkIHByb2plY3QgZXZlbnRzIHRoYXQgaW50ZXJlc3QKLQkgKiB7QGxpbmsgI2ZhY2V0ZWRQcm9qZWN0TGlzdGVuZXJ9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbXSBGQUNFVEVEX1BST0pFQ1RfRVZFTlRfVFlQRVMgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdIHsKLQkJCUlGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX1VOSU5TVEFMTAotCQl9OwotCi0JLyoqCi0JICogTGlzdGVuIGZvciBKYXZhIGNoYW5nZXMgKHVubGVzcyB0aGUgRGFsaSBVSSBpcyBhY3RpdmUpLgotCSAqIEBzZWUgI2phdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogVGhlIHR5cGVzIG9mIHJlc291cmNlIGNoYW5nZSBldmVudHMgdGhhdCBpbnRlcmVzdAotCSAqIHtAbGluayAjamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcn0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0hBTkdFX0VWRU5UX1RZUEVTID0KLQkJCUVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UgfAotCQkJRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKVWF4YkNvcmVQbHVnaW4gRGFsaSBwbHVnLWlufS4KLQkgKi8KLQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGNvbnRyb2xsZWQgbGlmZS1jeWNsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKYXhiQ29yZVBsdWdpbiBEYWxpIHBsdWctaW59LgotCSAqLwotCXZvaWQgc3RhcnQoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvY2suYWNxdWlyZSgpOwotCQkJdGhpcy5zdGFydF8oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRfKCkgewotCQlkZWJ1ZygiKioqIEpBWEIgcHJvamVjdCBtYW5hZ2VyIFNUQVJUICoqKiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSmF4YlByb2plY3RzKCk7Ci0JCQl0aGlzLmV2ZW50SGFuZGxlci5zdGFydCgpOwotCQkJdGhpcy5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgUkVTT1VSQ0VfQ0hBTkdFX0VWRU5UX1RZUEVTKTsKLQkJCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lciwgRkFDRVRFRF9QUk9KRUNUX0VWRU5UX1RZUEVTKTsKLQkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyLCBKQVZBX0NIQU5HRV9FVkVOVF9UWVBFUyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQl0aGlzLnN0b3BfKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTaWRlLWVmZmVjdDoge0BsaW5rICNqYXhiUHJvamVjdHN9IHBvcHVsYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnVpbGRKYXhiUHJvamVjdHMoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSmF4YlByb2plY3RzXygpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBpZiB3ZSBoYXZlIGEgcHJvYmxlbSwgbGVhdmUgdGhlIGN1cnJlbnRseSBidWlsdCBKQVhCIHByb2plY3RzIGluCi0JCQkvLyBwbGFjZSBhbmQga2VlcCBleGVjdXRpbmcgKHNob3VsZCBiZSBPSy4uLikKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRKYXhiUHJvamVjdHNfKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5hY2NlcHQobmV3IFJlc291cmNlUHJveHlWaXNpdG9yKCksIElSZXNvdXJjZS5OT05FKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKYXhiQ29yZVBsdWdpbiBEYWxpIHBsdWctaW59LgotCSAqLwotCXZvaWQgc3RvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXRoaXMuc3RvcF8oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcF8oKSB7Ci0JCWRlYnVnKCIqKiogSkFYQiBwcm9qZWN0IG1hbmFnZXIgU1RPUCAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lcik7Ci0JCXRoaXMuZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50SGFuZGxlci5zdG9wKCk7Ci0JCXRoaXMuY2xlYXJKYXhiUHJvamVjdHMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJKYXhiUHJvamVjdHMoKSB7Ci0JCS8vIGNsb25lIHRvIHByZXZlbnQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9ucwotCQlmb3IgKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0IDogdGhpcy5nZXRKYXhiUHJvamVjdHNfKCkpIHsKLQkJCXRoaXMucmVtb3ZlSmF4YlByb2plY3QoamF4YlByb2plY3QpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpheGJQcm9qZWN0TWFuYWdlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF4YlByb2plY3Q+IGdldEpheGJQcm9qZWN0cygpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXhiUHJvamVjdHNfKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmxvY2sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxKYXhiUHJvamVjdD4gZ2V0SmF4YlByb2plY3RzXygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXhiUHJvamVjdD4odGhpcy5qYXhiUHJvamVjdHMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SmF4YlByb2plY3RzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF4YlByb2plY3RzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXJldHVybiB0aGlzLmdldEpheGJQcm9qZWN0Xyhwcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEpheGJQcm9qZWN0IGdldEpheGJQcm9qZWN0XyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoSmF4YlByb2plY3QgamF4YlByb2plY3QgOiB0aGlzLmpheGJQcm9qZWN0cykgewotCQkJaWYgKGpheGJQcm9qZWN0LmdldFByb2plY3QoKS5lcXVhbHMocHJvamVjdCkpIHsKLQkJCQlyZXR1cm4gamF4YlByb2plY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEpheGJGaWxlIGdldEpheGJGaWxlKElGaWxlIGZpbGUpIHsKLQkJSmF4YlByb2plY3QgamF4YlByb2plY3QgPSB0aGlzLmdldEpheGJQcm9qZWN0KGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIChqYXhiUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqYXhiUHJvamVjdC5nZXRKYXhiRmlsZShmaWxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWJ1aWxkSmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXRoaXMucmVidWlsZEpheGJQcm9qZWN0Xyhwcm9qZWN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBhc3N1bXB0aW9uOiB0aGUgSkFYQiBwcm9qZWN0IGhvbGRlciBleGlzdHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVidWlsZEpheGJQcm9qZWN0XyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucmVtb3ZlSmF4YlByb2plY3QodGhpcy5nZXRKYXhiUHJvamVjdF8ocHJvamVjdCkpOwotCQl0aGlzLmFkZEpheGJQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lci5pc0FjdGl2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZShib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSkgewotCQl0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIuc2V0QWN0aXZlKGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSk7Ci0JfQotCi0JcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCXB1YmxpYyBJSm9iTWFuYWdlciBnZXRKb2JNYW5hZ2VyKCkgewotCQlyZXR1cm4gSm9iLmdldEpvYk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaW5nL3JlbW92aW5nIEpBWEIgcHJvamVjdHMgKioqKioqKioqKgotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGFkZEpheGJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5hZGRKYXhiUHJvamVjdCh0aGlzLmJ1aWxkSmF4YlByb2plY3QocHJvamVjdCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRKYXhiUHJvamVjdChKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQkvLyBmaWd1cmUgb3V0IGV4YWN0bHkgd2hlbiBKQVhCIHByb2plY3RzIGFyZSBhZGRlZAotCQlkdW1wU3RhY2tUcmFjZSgiYWRkOiAiLCBqYXhiUHJvamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdGhlIEpBWEIgcHJvamVjdCB3aWxsIGJlIG51bGwgaWYgd2UgaGF2ZSBhbnkgcHJvYmxlbXMgYnVpbGRpbmcgaXQuLi4KLQkJLy8gKGUuZy4gaWYgd2UgaGF2ZSBwcm9ibGVtcyBnZXR0aW5nIHRoZSBKQVhCIHBsYXRmb3JtKQotCQlpZiAoamF4YlByb2plY3QgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGpheGJQcm9qZWN0LCB0aGlzLmpheGJQcm9qZWN0cywgSkFYQl9QUk9KRUNUU19DT0xMRUNUSU9OKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybiBudWxsIGlmIHdlIGhhdmUgYW55IHByb2JsZW1zLi4uCi0JICovCi0JcHJpdmF0ZSBKYXhiUHJvamVjdCBidWlsZEpheGJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRKYXhiUHJvamVjdCh0aGlzLmJ1aWxkSmF4YlByb2plY3RDb25maWcocHJvamVjdCkpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBudWxsIGlmIHdlIGhhdmUgYW55IHByb2JsZW1zLi4uCi0JICovCi0JcHJpdmF0ZSBKYXhiUHJvamVjdCBidWlsZEpheGJQcm9qZWN0KEpheGJQcm9qZWN0LkNvbmZpZyBjb25maWcpIHsKLQkJSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBwbGF0Zm9ybURlZmluaXRpb24gPSBjb25maWcuZ2V0UGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCWlmIChwbGF0Zm9ybURlZmluaXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSmF4YlByb2plY3QgamF4YlByb2plY3QgPSB0aGlzLmJ1aWxkSmF4YlByb2plY3QocGxhdGZvcm1EZWZpbml0aW9uLCBjb25maWcpOwotCQlpZiAoamF4YlByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJamF4YlByb2plY3Quc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKGJ1aWxkSm9iQ29udGV4dE1vZGVsU3luY2hyb25pemVyKGpheGJQcm9qZWN0KSk7Ci0JCWpheGJQcm9qZWN0LnNldFVwZGF0ZVN5bmNocm9uaXplcihidWlsZEpvYlVwZGF0ZVN5bmNocm9uaXplcihqYXhiUHJvamVjdCkpOwotCQlyZXR1cm4gamF4YlByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBudWxsIGlmIHdlIGhhdmUgYW55IHByb2JsZW1zLi4uCi0JICovCi0JcHJpdmF0ZSBKYXhiUHJvamVjdCBidWlsZEpheGJQcm9qZWN0KEpheGJQbGF0Zm9ybURlZmluaXRpb24gcGxhdGZvcm1EZWZpbml0aW9uLCBKYXhiUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGxhdGZvcm1EZWZpbml0aW9uLmdldEZhY3RvcnkoKS5idWlsZEpheGJQcm9qZWN0KGNvbmZpZyk7Ci0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQlwcml2YXRlIEpheGJQcm9qZWN0LkNvbmZpZyBidWlsZEpheGJQcm9qZWN0Q29uZmlnKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU2ltcGxlSmF4YlByb2plY3RDb25maWcgY29uZmlnID0gbmV3IFNpbXBsZUpheGJQcm9qZWN0Q29uZmlnKCk7Ci0JCWNvbmZpZy5zZXRQcm9qZWN0KHByb2plY3QpOwotCQljb25maWcuc2V0UGxhdGZvcm1EZWZpbml0aW9uKEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5idWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24ocHJvamVjdCkpOwotCQlyZXR1cm4gY29uZmlnOwotCX0KLQkKLQlwcml2YXRlIFN5bmNocm9uaXplciBidWlsZEpvYkNvbnRleHRNb2RlbFN5bmNocm9uaXplcihKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEpvYlN5bmNocm9uaXplcigKLQkJCQlidWlsZENvbnRleHRNb2RlbEpvYk5hbWUoamF4YlByb2plY3QpLAotCQkJCWJ1aWxkQ29udGV4dE1vZGVsSm9iQ29tbWFuZChqYXhiUHJvamVjdCksCi0JCQkJamF4YlByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb250ZXh0TW9kZWxKb2JOYW1lKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCXJldHVybiBOTFMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLkNPTlRFWFRfTU9ERUxfU1lOQ19KT0JfTkFNRSwgamF4YlByb2plY3QuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKb2JDb21tYW5kIGJ1aWxkQ29udGV4dE1vZGVsSm9iQ29tbWFuZChmaW5hbCBKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEpvYkNvbW1hbmQoKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCXJldHVybiBqYXhiUHJvamVjdC5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbChtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBDYWxsYmFja1N5bmNocm9uaXplciBidWlsZEpvYlVwZGF0ZVN5bmNocm9uaXplcihKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IENhbGxiYWNrSm9iU3luY2hyb25pemVyKAotCQkJCWJ1aWxkVXBkYXRlSm9iTmFtZShqYXhiUHJvamVjdCksCi0JCQkJYnVpbGRVcGRhdGVKb2JDb21tYW5kKGpheGJQcm9qZWN0KSwKLQkJCQlqYXhiUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFVwZGF0ZUpvYk5hbWUoSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuVVBEQVRFX0pPQl9OQU1FLCBqYXhiUHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQkKLQlwcml2YXRlIEpvYkNvbW1hbmQgYnVpbGRVcGRhdGVKb2JDb21tYW5kKGZpbmFsIEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgSm9iQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJcmV0dXJuIGpheGJQcm9qZWN0LnVwZGF0ZShtb25pdG9yKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyogcHJpdmF0ZSAqLyB2b2lkIHJlbW92ZUpheGJQcm9qZWN0KEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCS8vIGZpZ3VyZSBvdXQgZXhhY3RseSB3aGVuIEpBWEIgcHJvamVjdHMgYXJlIHJlbW92ZWQKLQkJZHVtcFN0YWNrVHJhY2UoInJlbW92ZTogIiwgamF4YlByb2plY3QpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGpheGJQcm9qZWN0LCB0aGlzLmpheGJQcm9qZWN0cywgSkFYQl9QUk9KRUNUU19DT0xMRUNUSU9OKTsKLQkJamF4YlByb2plY3QuZGlzcG9zZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9qZWN0IFBPU1RfQ0hBTkdFICoqKioqKioqKioKLQotCS8qIHByaXZhdGUgKi8gdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlKHRoaXMuYnVpbGRQcm9qZWN0Q2hhbmdlZENvbW1hbmQoZGVsdGEpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRQcm9qZWN0Q2hhbmdlZENvbW1hbmQoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJQcm9qZWN0IFBPU1RfQ0hBTkdFIENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMucHJvamVjdENoYW5nZWRfKGRlbHRhKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgZGVsdGEgdG8gYWxsIG91ciBKQVhCIHByb2plY3RzOwotCSAqIHRoZXkgd2lsbCBlYWNoIGRldGVybWluZSB3aGV0aGVyIHRoZSBldmVudCBpcyBzaWduaWZpY2FudC4KLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgcHJvamVjdENoYW5nZWRfKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWZvciAoSmF4YlByb2plY3QgamF4YlByb2plY3QgOiB0aGlzLmpheGJQcm9qZWN0cykgewotCQkJamF4YlByb2plY3QucHJvamVjdENoYW5nZWQoZGVsdGEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb2plY3QgUE9TVF9CVUlMRCAoQ0xFQU5fQlVJTEQpICoqKioqKioqKioKLQotCS8qIHByaXZhdGUgKi8gdm9pZCBwcm9qZWN0UG9zdENsZWFuQnVpbGQoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLmV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQodGhpcy5idWlsZFByb2plY3RQb3N0Q2xlYW5CdWlsZENvbW1hbmQocHJvamVjdCkpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFByb2plY3RQb3N0Q2xlYW5CdWlsZENvbW1hbmQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoIlByb2plY3QgUE9TVF9CVUlMRCAoQ0xFQU5fQlVJTEQpIENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMucHJvamVjdFBvc3RDbGVhbkJ1aWxkXyhwcm9qZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiBwcml2YXRlICovIHZvaWQgcHJvamVjdFBvc3RDbGVhbkJ1aWxkXyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpheGJQcm9qZWN0IGpheGJQcm9qZWN0ID0gdGhpcy5nZXRKYXhiUHJvamVjdF8ocHJvamVjdCk7Ci0JCWlmIChqYXhiUHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUpheGJQcm9qZWN0KGpheGJQcm9qZWN0KTsKLQkJCXRoaXMuYWRkSmF4YlByb2plY3QocHJvamVjdCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogRmlsZSBQT1NUX0NIQU5HRSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgRmFjZXRlZCBQcm9qZWN0IHNldHRpbmdzIGZpbGUgaGFzIGNoYW5nZWQgaW4gc29tZSBmYXNoaW9uLCBjaGVjawotCSAqIHdoZXRoZXIgdGhlIEpBWEIgZmFjZXQgaGFzIGJlZW4gYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9qZWN0LgotCSAqLwotCS8qIHByaXZhdGUgKi8gdm9pZCBjaGVja0ZvckpheGJGYWNldFRyYW5zaXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlKYXhiUHJvamVjdCBqYXhiUHJvamVjdCA9IHRoaXMuZ2V0SmF4YlByb2plY3RfKHByb2plY3QpOwotCi0JCWlmIChKYXhiRmFjZXQuaXNJbnN0YWxsZWQocHJvamVjdCkpIHsKLQkJCWlmIChqYXhiUHJvamVjdCA9PSBudWxsKSB7ICAvLyBKQVhCIGZhY2V0IGFkZGVkCi0JCQkJdGhpcy5leGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKHRoaXMuYnVpbGRBZGRKYXhiUHJvamVjdENvbW1hbmQocHJvamVjdCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGpheGJQcm9qZWN0ICE9IG51bGwpIHsgIC8vIEpBWEIgZmFjZXQgcmVtb3ZlZAotCQkJCXRoaXMuZXhlY3V0ZUFmdGVyRXZlbnRzSGFuZGxlZCh0aGlzLmJ1aWxkUmVtb3ZlSmF4YlByb2plY3RDb21tYW5kKGpheGJQcm9qZWN0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRBZGRKYXhiUHJvamVjdENvbW1hbmQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoIkFkZCBKQVhCIFByb2plY3QgQ29tbWFuZCIpIHsgLy8kTk9OLU5MUy0xJAotCQkJQE92ZXJyaWRlCi0JCQl2b2lkIGV4ZWN1dGVfKCkgewotCQkJCUdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIudGhpcy5hZGRKYXhiUHJvamVjdChwcm9qZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRSZW1vdmVKYXhiUHJvamVjdENvbW1hbmQoZmluYWwgSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJSZW1vdmUgSkFYQiBQcm9qZWN0IENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMucmVtb3ZlSmF4YlByb2plY3QoamF4YlByb2plY3QpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogRmFjZXRlZFByb2plY3QgUFJFX1VOSU5TVEFMTCAqKioqKioqKioqCi0KLQkvKiBwcml2YXRlICovIHZvaWQgamF4YkZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZXZlbnQuZ2V0UHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJdGhpcy5leGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKHRoaXMuYnVpbGRKYXhiRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGxDb21tYW5kKHByb2plY3QpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRKYXhiRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGxDb21tYW5kKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJGYWNldGVkIFByb2plY3QgUFJFX1VOSU5TVEFMTCBDb21tYW5kIikgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLmpheGJGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbF8ocHJvamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGpheGJGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbF8oSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBhc3N1bWUoPykgdGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byByZW1vdmUgdGhlIEpBWEIgcHJvamVjdCBmcm9tIHRoZSBKQVhCIHByb2plY3QgbWFuYWdlcgotCQl0aGlzLnJlbW92ZUpheGJQcm9qZWN0KHRoaXMuZ2V0SmF4YlByb2plY3RfKHByb2plY3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBlbGVtZW50IGNoYW5nZWQgKioqKioqKioqKgotCi0JLyogcHJpdmF0ZSAqLyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGUodGhpcy5idWlsZEphdmFFbGVtZW50Q2hhbmdlZENvbW1hbmQoZXZlbnQpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRKYXZhRWxlbWVudENoYW5nZWRDb21tYW5kKGZpbmFsIEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJKYXZhIGVsZW1lbnQgY2hhbmdlZCBDb21tYW5kIikgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLmphdmFFbGVtZW50Q2hhbmdlZF8oZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIEphdmEgZWxlbWVudCBjaGFuZ2VkIGV2ZW50IHRvIGFsbCB0aGUgSkFYQiBwcm9qZWN0cwotCSAqIGJlY2F1c2UgdGhlIGV2ZW50IGNvdWxkIGFmZmVjdCBtdWx0aXBsZSBwcm9qZWN0cy4KLQkgKi8KLQkvKiBwcml2YXRlICovIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkXyhFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSmF4YlByb2plY3QgamF4YlByb2plY3QgOiB0aGlzLmpheGJQcm9qZWN0cykgewotCQkJamF4YlByb2plY3QuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjZWxsYW5lb3VzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuamF4YlByb2plY3RzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXZlbnQgaGFuZGxlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGUgZXZlbnQgaGFuZGxlciBpcyBleGVjdXRpbmcgYXN5bmNocm9ub3VzbHk6PGJyPgotCSAqIEFsbG93IGFsbCB0aGUgY29tbWFuZHMgY3VycmVudGx5IG9uIHRoZSBjb21tYW5kIGV4ZWN1dG9yJ3MgcXVldWUgdG8gZXhlY3V0ZS4KLQkgKiBPbmNlIHRoZXkgaGF2ZSBleGVjdXRlZCwgc3VzcGVuZCB0aGUgY29tbWFuZCBleGVjdXRvciBhbmQgcHJvY2VzcyB0aGUKLQkgKiBzcGVjaWZpZWQgY29tbWFuZCAob24gPGVtPnRoaXM8L2VtPiB0aHJlYWQsIDxlbT5ub3Q8L2VtPiB0aGUgY29tbWFuZAotCSAqIGV4ZWN1dG9yIHRocmVhZCkuIE9uY2UgdGhlIHNwZWNpZmllZCBjb21tYW5kIGlzIGZpbmlzaGVkLCBhbGxvdyB0aGUKLQkgKiBjb21tYW5kIGV4ZWN1dG9yIHRvIHJlc3VtZSBwcm9jZXNzaW5nIGl0cyBjb21tYW5kIHF1ZXVlLgotCSAqIDxwPgotCSAqIElmIHRoZSBldmVudCBoYW5kbGVyIGlzIGV4ZWN1dGluZyBzeW5jaHJvbm91c2x5Ojxicj4KLQkgKiBBbGwgdGhlIGV2ZW50cyBoYXZlIGFscmVhZHkgYmVlbiBoYW5kbGVkIHN5bmNocm9ub3VzbHksIHNvIHdlIHNpbXBseQotCSAqIGV4ZWN1dGUgdGhlIHNwZWNpZmllZCBjb21tYW5kIFtzb3J0YV0gZGlyZWN0bHkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQoQ29tbWFuZCBjb21tYW5kKSB7Ci0JCVN5bmNocm9uaXplZEJvb2xlYW4gZmxhZyA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQkJdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZShuZXcgUGF1c2VDb21tYW5kKGZsYWcpKTsKLQkJdHJ5IHsKLQkJCWZsYWcud2FpdFVudGlsVHJ1ZSgpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJLy8gaWdub3JlIC0gbm90IHN1cmUgd2h5IHRoaXMgdGhyZWFkIHdvdWxkIGJlIGludGVycnVwdGVkCi0JCX0KLQkJdHJ5IHsKLQkJCWNvbW1hbmQuZXhlY3V0ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJZmxhZy5zZXRGYWxzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyAicGF1c2UiIGNvbW1hbmQgaXMgZXhlY3V0aW5nIChhc3luY2hyb25vdXNseSkgb24gYSBkaWZmZXJlbnQKLQkgKiB0aHJlYWQgdGhhbiB0aGUgSkFYQiBwcm9qZWN0IG1hbmFnZXI6PG9sPgotCSAqIDxsaT5pdCB3aWxsIHNldCB0aGUgZmxhZyB0byA8Y29kZT50cnVlPC9jb2RlPiwgYWxsb3dpbmcgdGhlIEpBWEIgcHJvamVjdAotCSAqIG1hbmFnZXIgdG8gcmVzdW1lIGV4ZWN1dGluZyBvbiBpdHMgb3duIHRocmVhZAotCSAqIDxsaT50aGVuIGl0IHdpbGwgc3VzcGVuZCBpdHMgY29tbWFuZCBleGVjdXRvciB1bnRpbCB0aGUgSkFYQiBwcm9qZWN0Ci0JICogbWFuYWdlciBzZXRzIHRoZSBmbGFnIGJhY2sgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LgotCSAqIDwvb2w+Ci0JICogSWYgdGhpcyAicGF1c2UiIGNvbW1hbmQgaXMgZXhlY3V0aW5nIChzeW5jaHJvbm91c2x5KSBvbiB0aGUgc2FtZSB0aHJlYWQKLQkgKiBhcyB0aGUgSkFYQiBwcm9qZWN0IG1hbmFnZXIsIGl0IHdpbGwgc2ltcGx5IHNldCB0aGUgZmxhZyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGFuZCByZXR1cm4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF1c2VDb21tYW5kCi0JCWltcGxlbWVudHMgQ29tbWFuZAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBUaHJlYWQgcHJvZHVjZXJUaHJlYWQ7Ci0JCXByaXZhdGUgZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBmbGFnOwotCi0JCVBhdXNlQ29tbWFuZChTeW5jaHJvbml6ZWRCb29sZWFuIGZsYWcpIHsKLQkJCXRoaXMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgZmxhZyk7Ci0JCX0KLQotCQlQYXVzZUNvbW1hbmQoVGhyZWFkIHByb2R1Y2VyVGhyZWFkLCBTeW5jaHJvbml6ZWRCb29sZWFuIGZsYWcpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByb2R1Y2VyVGhyZWFkID0gcHJvZHVjZXJUaHJlYWQ7Ci0JCQl0aGlzLmZsYWcgPSBmbGFnOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuZmxhZy5zZXRUcnVlKCk7Ci0JCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSAhPSB0aGlzLnByb2R1Y2VyVGhyZWFkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhpcy5mbGFnLndhaXRVbnRpbEZhbHNlKCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlIC0gdGhlIGNvbW1hbmQgZXhlY3V0b3Igd2lsbCBjaGVjayBmb3IgaW50ZXJydXB0aW9ucwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAodmlhIHJlZmxlY3Rpb24pIHdoZW4gdGhlIHRlc3QgcGx1Zy1pbiBpcyBsb2FkZWQuCi0JICogQHNlZSBKcHRDb3JlVGVzdHNQbHVnaW4jc3RhcnQoQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudHNTeW5jaHJvbm91c2x5KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXRoaXMuaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKSB7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyLnN0b3AoKTsKLQkJdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgU2ltcGxlQ29tbWFuZEV4ZWN1dG9yKCk7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyLnN0YXJ0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIHByb3h5IHZpc2l0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVmlzaXQgdGhlIHdvcmtzcGFjZSByZXNvdXJjZSB0cmVlLCBhZGRpbmcgYSBKQVhCIHByb2plY3QgdG8gdGhlCi0JICogSkFYQiBwcm9qZWN0IG1hbmFnZXIgZm9yIGVhY2ggb3BlbiBFY2xpcHNlIHByb2plY3QgdGhhdCBoYXMgYSBKQVhCIGZhY2V0LgotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VQcm94eVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQlSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZVByb3h5KSB7Ci0JCQlzd2l0Y2ggKHJlc291cmNlUHJveHkuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gYWxsIHByb2plY3RzIGFyZSBpbiB0aGUgInJvb3QiCi0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Byb2plY3QocmVzb3VyY2VQcm94eSk7Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIG5lc3RlZCBwcm9qZWN0cwotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIGlnbm9yZQotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBpZ25vcmUKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQcm9qZWN0KElSZXNvdXJjZVByb3h5IHJlc291cmNlUHJveHkpIHsKLQkJCWlmIChyZXNvdXJjZVByb3h5LmlzQWNjZXNzaWJsZSgpKSB7ICAvLyB0aGUgcHJvamVjdCBleGlzdHMgYW5kIGlzIG9wZW4KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSByZXNvdXJjZVByb3h5LnJlcXVlc3RSZXNvdXJjZSgpOwotCQkJCWlmIChKYXhiRmFjZXQuaXNJbnN0YWxsZWQocHJvamVjdCkpIHsKLQkJCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLmFkZEpheGJQcm9qZWN0KHByb2plY3QpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBldmVudCBoYW5kbGVyIGNvbW1hbmQgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29tbWFuZCB0aGF0IGhvbGRzIHRoZSBKQVhCIHByb2plY3QgbWFuYWdlciBsb2NrIHdoaWxlCi0JICogZXhlY3V0aW5nLgotCSAqLwotCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgRXZlbnRIYW5kbGVyQ29tbWFuZAotCQlpbXBsZW1lbnRzIENvbW1hbmQKLQl7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkJRXZlbnRIYW5kbGVyQ29tbWFuZChTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKCkgewotCQkJdHJ5IHsKLQkJCQlHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyLnRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQkJdGhpcy5leGVjdXRlXygpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCUdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIudGhpcy5sb2NrLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCWFic3RyYWN0IHZvaWQgZXhlY3V0ZV8oKTsKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiB0aGlzLm5hbWU7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgY2hhbmdlIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQotCQlSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBQUkVfVU5JTlNUQUxMIGlzIHRoZSBvbmx5IGZhY2V0IGV2ZW50IHdlIHVzZSBmb3IgCi0JCSAqIHJlbW92aW5nIEpBWEIgcHJvamVjdHMuIFRoZXNlIGFyZSB0aGUgY2FzZXMgd2hlcmUgd2UgbGlzdGVuIGZvciByZXNvdXJjZSBldmVudHMuCi0JCSAqIDxwPgotCQkgKiBDaGVjayBmb3I6PHVsPgotCQkgKiA8bGk+ZmFjZXQgc2V0dGluZ3MgZmlsZSBhZGRlZC9yZW1vdmVkL2NoYW5nZWQKLQkJICogKDxjb2RlPi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sPC9jb2RlPikKLQkJICogPGxpPmZpbGUgYWRkL3JlbW92ZSAtIGZvcndhcmRlZCB0byB0aGUgaW5kaXZpZHVhbCBKQVhCIHByb2plY3RzCi0JCSAqIDxsaT5wcm9qZWN0IGNsZWFuCi0JCSAqIDwvdWw+Ci0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VFdmVudChldmVudCk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJLy8gd29ya3NwYWNlIG9yIHByb2plY3QgZXZlbnRzCi0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfUkVGUkVTSCA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQlVJTEQgOgotCQkJCQlicmVhazsgIC8vIGlnbm9yZQotCQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9CVUlMRCA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Bvc3RCdWlsZEV2ZW50KGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvLyBwcm9qZWN0LW9ubHkgZXZlbnRzCi0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOiAgCi0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIDoKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VFdmVudChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJZGVidWcoIlJlc291cmNlIFBPU1RfQ0hBTkdFIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YShldmVudC5nZXREZWx0YSgpKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZURlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZVJvb3REZWx0YShkZWx0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlUHJvamVjdERlbHRhKGRlbHRhKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZUZvbGRlckRlbHRhKChJRm9sZGVyKSByZXNvdXJjZSwgZGVsdGEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZUZpbGVEZWx0YSgoSUZpbGUpIHJlc291cmNlLCBkZWx0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vICoqKioqIFBPU1RfQ0hBTkdFIFJPT1QKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlUm9vdERlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0JCX0KLQotCQkvLyAqKioqKiBQT1NUX0NIQU5HRSBQUk9KRUNUCi0JCS8qKgotCQkgKiBQcm9jZXNzIHRoZSBwcm9qZWN0IGZpcnN0IGZvciB0aGUgT3BlbmluZyBwcm9qZWN0IGNhc2UuCi0JCSAqIFRoZSBKQVhCIHByb2plY3Qgd2lsbCBub3QgYmUgYnVpbHQgdW50aWwgdGhlIGNoaWxkcmVuIGFyZSBwcm9jZXNzZWQKLQkJICogYW5kIHdlIHNlZSB0aGF0IHRoZSBmYWNldCBtZXRhZGF0YSBmaWxlIGlzIGFkZGVkLgotCQkgKiBPdGhlcndpc2UgdGhlIEpBWEIgcHJvamVjdCB3b3VsZCBiZSBidWlsdCBhbmQgdGhlbiB3ZSB3b3VsZCBwcm9jZXNzCi0JCSAqIHRoZSBBRERFRCBkZWx0YXMgZm9yIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHByb2plY3QuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VQcm9qZWN0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCUdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIudGhpcy5wcm9qZWN0Q2hhbmdlZChkZWx0YSk7Ci0JCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0JCX0KLQotCQkvLyAqKioqKiBQT1NUX0NIQU5HRSBGT0xERVIKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlRm9sZGVyRGVsdGEoSUZvbGRlciBmb2xkZXIsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlpZiAoZm9sZGVyLmdldE5hbWUoKS5lcXVhbHMoIi5zZXR0aW5ncyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyAqKioqKiBQT1NUX0NIQU5HRSBGSUxFCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZUZpbGVEZWx0YShJRmlsZSBmaWxlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscyhGQUNFVEVEX1BST0pFQ1RfRlJBTUVXT1JLX1NFVFRJTkdTX0ZJTEVfTkFNRSkpIHsKLQkJCQl0aGlzLmNoZWNrRm9yRmFjZXRGaWxlQ2hhbmdlcyhmaWxlLCBkZWx0YSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBjaGVja0ZvckZhY2V0RmlsZUNoYW5nZXMoSUZpbGUgZmlsZSwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXN3aXRjaCAoZGVsdGEuZ2V0S2luZCgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRCA6Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOiAKLQkJCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLmNoZWNrRm9ySmF4YkZhY2V0VHJhbnNpdGlvbihmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT00gOgotCQkJCQlicmVhazsgIC8vIGlnbm9yZQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZURlbHRhQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWZvciAoSVJlc291cmNlRGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRGVsdGEoY2hpbGQpOyAgLy8gcmVjdXJzZQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEEgcG9zdCBidWlsZCBldmVudCBoYXMgb2NjdXJyZWQuCi0JCSAqIENoZWNrIGZvciB3aGV0aGVyIHRoZSBidWlsZCB3YXMgYSAiY2xlYW4iIGJ1aWxkIGFuZCB0cmlnZ2VyIHByb2plY3QgdXBkYXRlLgotCQkgKi8KLQkJLy8gKioqKiogUE9TVF9CVUlMRAotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RCdWlsZEV2ZW50KElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlkZWJ1ZygiUmVzb3VyY2UgUE9TVF9CVUlMRDogIiwgZXZlbnQuZ2V0UmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChldmVudC5nZXRCdWlsZEtpbmQoKSA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxEKSB7Ci0JCQkJdGhpcy5wcm9jZXNzUG9zdENsZWFuQnVpbGREZWx0YShldmVudC5nZXREZWx0YSgpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENsZWFuQnVpbGREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Bvc3RDbGVhbkJ1aWxkRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQl0aGlzLnByb2Nlc3NQcm9qZWN0UG9zdENsZWFuQnVpbGQoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2xlYW5CdWlsZERlbHRhQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWZvciAoSVJlc291cmNlRGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2xlYW5CdWlsZERlbHRhKGNoaWxkKTsgIC8vIHJlY3Vyc2UKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUHJvamVjdFBvc3RDbGVhbkJ1aWxkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWRlYnVnKCJcdFByb2plY3QgQ0xFQU46ICIsIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLnByb2plY3RQb3N0Q2xlYW5CdWlsZChwcm9qZWN0KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogRm9yd2FyZCB0aGUgRmFjZXRlZCBwcm9qZWN0IGNoYW5nZSBldmVudCBiYWNrIHRvIHRoZSBKQVhCIHByb2plY3QgbWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgaW1wbGVtZW50cyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciB7Ci0KLQkJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2sgZm9yOjx1bD4KLQkJICogPGxpPnVuLWluc3RhbGwgb2YgSkFYQiBmYWNldAotCQkgKiA8L3VsPgotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBQUkVfVU5JTlNUQUxMIDoKLQkJCQkJdGhpcy5wcm9jZXNzUHJlVW5pbnN0YWxsRXZlbnQoKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1ByZVVuaW5zdGFsbEV2ZW50KElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgewotCQkJZGVidWcoIkZhY2V0IFBSRV9VTklOU1RBTEw6ICIsIGV2ZW50LmdldFByb2plY3RGYWNldCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGV2ZW50LmdldFByb2plY3RGYWNldCgpLmVxdWFscyhKYXhiRmFjZXQuRkFDRVQpKSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLmpheGJGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBlbGVtZW50IGNoYW5nZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBKYXZhIGVsZW1lbnQgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpBWEIgcHJvamVjdCBtYW5hZ2VyLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQkJLyoqCi0JCSAqIEEgZmxhZyB0byBhY3RpdmF0ZS9kZWFjdGl2YXRlIHRoZSBsaXN0ZW5lcgotCQkgKiBzbyB3ZSBjYW4gaWdub3JlIEphdmEgZXZlbnRzIHdoZW5ldmVyIERhbGkgaXMgbWFuaXB1bGF0aW5nIHRoZSBKYXZhCi0JCSAqIHNvdXJjZSBjb2RlIHZpYSB0aGUgRGFsaSBtb2RlbC4gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSAwLjUgc2VjIGRlbGF5Ci0JCSAqIGJldHdlZW4gdGhlIEphdmEgc291cmNlIGJlaW5nIGNoYW5nZWQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50Ci0JCSAqIGJlaW5nIGZpcmVkIGNhdXNlcyB1cyBubyBlbmQgb2YgcGFpbi4KLQkJICovCi0JCXByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBhY3RpdmUgPSB0cnVlOwotCi0JCUphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudENoYW5nZWQoRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKHRoaXMuYWN0aXZlKSB7Ci0JCQkJR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlci50aGlzLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIHNldEFjdGl2ZShib29sZWFuIGFjdGl2ZSkgewotCQkJdGhpcy5hY3RpdmUgPSBhY3RpdmU7Ci0JCX0KLQotCQlib29sZWFuIGlzQWN0aXZlKCkgewotCQkJcmV0dXJuIHRoaXMuYWN0aXZlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIERFQlVHICoqKioqKioqKioKLQotCS8vIEBzZWUgSmF4YlByb2plY3RNYW5hZ2VyVGVzdHMjdGVzdERFQlVHKCkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQkvKioKLQkgKiB0cmlnZ2VyICN0b1N0cmluZygpIGNhbGwgYW5kIHN0cmluZyBjb25jYXRlbmF0aW9uIG9ubHkgaWYgREVCVUcgaXMgdHJ1ZQotCSAqLwotCS8qIHByaXZhdGUgKi8gc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlkZWJ1Z18obWVzc2FnZSArIG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKiBwcml2YXRlICovIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChERUJVRykgewotCQkJZGVidWdfKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWJ1Z18oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIjogIiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZSgpIHsKLQkJZHVtcFN0YWNrVHJhY2UobnVsbCk7Ci0JfQotCi0JLyogcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoREVCVUcpIHsKLQkJCWR1bXBTdGFja1RyYWNlXyhtZXNzYWdlICsgb2JqZWN0KTsKLQkJfQotCX0KLQotCS8qIHByaXZhdGUgKi8gc3RhdGljIHZvaWQgZHVtcFN0YWNrVHJhY2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlkdW1wU3RhY2tUcmFjZV8obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBTdGFja1RyYWNlXyhTdHJpbmcgbWVzc2FnZSkgewotCQkvLyBsb2NrIFN5c3RlbS5vdXQgc28gdGhlIHN0YWNrIGVsZW1lbnRzIGFyZSBwcmludGVkIG91dCBjb250aWd1b3VzbHkKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJZGVidWdfKG1lc3NhZ2UpOwotCQkJfQotCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCk7Ci0JCQkvLyBza2lwIHRoZSBmaXJzdCAzIGVsZW1lbnRzIC0gdGhvc2UgYXJlIHRoaXMgbWV0aG9kIGFuZCAyIG1ldGhvZHMgaW4gVGhyZWFkCi0JCQlmb3IgKGludCBpID0gMzsgaSA8IHN0YWNrVHJhY2UubGVuZ3RoOyBpKyspIHsKLQkJCQlTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50ID0gc3RhY2tUcmFjZVtpXTsKLQkJCQlpZiAoZWxlbWVudC5nZXRNZXRob2ROYW1lKCkuZXF1YWxzKCJpbnZva2UwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsgIC8vIHNraXAgYWxsIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIEpVbml0IHRlc3QKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiRmFjZXQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGYWNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY0N2NhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGYWNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXhiRmFjZXQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImpwdC5qYXhiIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBGQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJRCk7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBWRVJTSU9OXzJfMSA9IEZBQ0VULmdldFZlcnNpb24oIjIuMSIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0VmVyc2lvbiBWRVJTSU9OXzJfMiA9IEZBQ0VULmdldFZlcnNpb24oIjIuMiIpOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSW5zdGFsbGVkKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQocHJvamVjdCwgSUQpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBOb3QgZm9yIGluc3RhbnRpYXRpb24KLQkgKi8KLQlwcml2YXRlIEpheGJGYWNldCgpIHt9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3NjIzNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5BY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFueUVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudHNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFZhbHVlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci0KLS8qKgotICogVXNlIGEgSkFYQiBmYWN0b3J5IHRvIGJ1aWxkIGFueSBjb3JlIChlLmcuIHtAbGluayBKYXhiUHJvamVjdH0pCi0gKiBtb2RlbCBvYmplY3Qgb3IgYW55IEphdmEgKGUuZy4ge0BsaW5rIFhtbFR5cGV9KSBjb250ZXh0IG1vZGVsIG9iamVjdHMKLSAqIDxwPgotICogQXNzdW1lcyBhIGJhc2UgSkFYQiBwcm9qZWN0IGNvbnRleHQgc3RydWN0dXJlIAotICogY29ycmVzcG9uZGluZyB0byB0aGUgSkFYQiBzcGVjOgotICogPHByZT4KLSAqICAgICBSb290Q29udGV4dAotICogICAgICB8LSBqYXhiIHBhY2thZ2VzL3R5cGVzCi0gKiAgICAgICAgICB8LSBqYXhiIGF0dHJpYnV0ZXMvbWV0aG9kcwotICogPC9wcmU+Ci0gKiAgIC4uLiBhbmQgYXNzb2NpYXRlZCBvYmplY3RzLgotICo8cD4gCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuamF4YjIxLkdlbmVyaWNKYXhiXzJfMV9GYWN0b3J5Ci0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJGYWN0b3J5ICB7Ci0JCi0JLy8gKioqKioqKioqKiBDb3JlIE1vZGVsICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgYSBKYXhiUHJvamVjdCBmb3IgdGhlIHNwZWNpZmllZCBjb25maWcsIHRvIGJlCi0JICogYWRkZWQgdG8gdGhlIHNwZWNpZmllZCBKQVhCIHByb2plY3QuIFJldHVybiBudWxsIGlmIHVuYWJsZSB0byBjcmVhdGUKLQkgKiB0aGUgSkFYQiBmaWxlIChlLmcuIHRoZSBjb250ZW50IHR5cGUgaXMgdW5yZWNvZ25pemVkKS4KLQkgKi8KLQlKYXhiUHJvamVjdCBidWlsZEpheGJQcm9qZWN0KEpheGJQcm9qZWN0LkNvbmZpZyBjb25maWcpOwotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpBWEIgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBKQVhCIHByb2plY3QsIGZpbGUsIGNvbnRlbnQgdHlwZSwKLQkgKiBhbmQgcmVzb3VyY2UgbW9kZWwuCi0JICovCi0JSmF4YkZpbGUgYnVpbGRKYXhiRmlsZShKYXhiUHJvamVjdCBqYXhiUHJvamVjdCwgSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBKcHRSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpOwotCQotCQotCS8vICoqKioqKioqKiogTm9uLXJlc291cmNlLXNwZWNpZmljIGNvbnRleHQgbm9kZXMgKioqKioqKioqKgotCQotCS8qKgotCSAqIEJ1aWxkIGEgKC9hbiB1cGRhdGVkKSByb290IGNvbnRleHQgbm9kZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIAotCSAqIEpBWEIgcHJvamVjdC4KLQkgKiBUaGUgcm9vdCBjb250ZXh0IG5vZGUgd2lsbCBiZSBidWlsdCBvbmNlLCBidXQgdXBkYXRlZCBtYW55IHRpbWVzLgotCSAqIEBzZWUgSmF4YlByb2plY3QjdXBkYXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCUpheGJDb250ZXh0Um9vdCBidWlsZENvbnRleHRSb290KEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KTsKLQkKLQlKYXhiUGFja2FnZSBidWlsZFBhY2thZ2UoSmF4YkNvbnRleHRSb290IHBhcmVudCwgU3RyaW5nIHBhY2thZ2VOYW1lKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIEphdmEgY29udGV4dCBub2RlcyAqKioqKioqKioqCi0JCi0JSmF4YlBhY2thZ2VJbmZvIGJ1aWxkSmF2YVBhY2thZ2VJbmZvKEpheGJQYWNrYWdlIHBhcmVudCwgSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UpOwotCQotCVhtbFNjaGVtYSBidWlsZEphdmFYbWxTY2hlbWEoSmF4YlBhY2thZ2VJbmZvIHBhcmVudCk7Ci0JCi0JWG1sTnMgYnVpbGRKYXZhWG1sTnMoWG1sU2NoZW1hIHBhcmVudCwgWG1sTnNBbm5vdGF0aW9uIHhtbE5zQW5ub3RhdGlvbik7Ci0JCi0JSmF4YkNsYXNzIGJ1aWxkSmF4YkNsYXNzKEpheGJDb250ZXh0Um9vdCBwYXJlbnQsIEphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQkKLQlKYXhiRW51bSBidWlsZEpheGJFbnVtKEpheGJDb250ZXh0Um9vdCBwYXJlbnQsIEphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtKTsKLQkKLQlKYXhiQ2xhc3NNYXBwaW5nIGJ1aWxkSmF4YkNsYXNzTWFwcGluZyhKYXhiQ2xhc3MgcGFyZW50KTsKLQkKLQlKYXhiRW51bU1hcHBpbmcgYnVpbGRKYXhiRW51bU1hcHBpbmcoSmF4YkVudW0gcGFyZW50KTsKLQkKLQlYbWxSZWdpc3RyeSBidWlsZFhtbFJlZ2lzdHJ5KEpheGJDbGFzcyBwYXJlbnQpOwotCQotCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBidWlsZEphdmFFbGVtZW50RmFjdG9yeU1ldGhvZChYbWxSZWdpc3RyeSBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCk7Ci0JCi0JWG1sUm9vdEVsZW1lbnQgYnVpbGRKYXZhWG1sUm9vdEVsZW1lbnQoSmF4YlR5cGVNYXBwaW5nIHBhcmVudCwgWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbik7Ci0JCi0JSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgQWNjZXNzb3IgYWNjZXNzb3IpOwotCQotCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRGaWVsZChKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCk7Ci0JCi0JSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudFByb3BlcnR5KEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcik7Ci0JCi0JSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlYbWxBbnlFbGVtZW50TWFwcGluZyBidWlsZEphdmFYbWxBbnlFbGVtZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCVhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhWG1sQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCVhtbEVsZW1lbnRNYXBwaW5nIGJ1aWxkSmF2YVhtbEVsZW1lbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JWG1sRWxlbWVudFJlZk1hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlYbWxFbGVtZW50UmVmc01hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JWG1sRWxlbWVudHNNYXBwaW5nIGJ1aWxkSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCUpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVhtbFRyYW5zaWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlYbWxWYWx1ZU1hcHBpbmcgYnVpbGRKYXZhWG1sVmFsdWVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF4YkVudW1Db25zdGFudCBidWlsZEphdmFFbnVtQ29uc3RhbnQoSmF4YkVudW1NYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHJlc291cmNlRW51bUNvbnN0YW50KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGaWxlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2UxMzNhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci0KLS8qKgotICogQSBKQVhCIFByb2plY3QgY29udGFpbnMgSkFYQiBmaWxlcyBmb3IgYWxsIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRoYXQKLSAqIGFyZSByZWxldmFudCB0byB0aGUgSkFYQiBzcGVjLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkZpbGUKLQlleHRlbmRzIEpheGJOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBKQVhCIGZpbGUncyBFY2xpcHNlIGZpbGUuCi0JICovCi0JSUZpbGUgZ2V0RmlsZSgpOwotCQotCS8qKkpBWEIKLQkgKiBSZXR1cm4gdGhlIEpQQSBmaWxlJ3MgY29udGVudCB0eXBlLgotCSAqLwotCUlDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgSlBBIGZpbGU7IHR5cGljYWxseSBhIEpQQQotCSAqIGNvbXBpbGF0aW9uIHVuaXQsIGEgSlBBIFhNTCByZXNvdXJjZSwgb3IgYSBKUEEgcGFja2FnZSBmcmFnbWVudCByb290IChKQVIpLgotCSAqLwotCUpwdFJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4gUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBKUEEKLQkgKiBmaWxlIGlmIHRoZSBmaWxlJ3MgY29udGVudCBpcyBhICJraW5kLW9mIiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZTsKLQkgKiBvdGhlcndpc2UsIHJldHVybiBudWxsLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgY2xpZW50IGhhcyBsb29rZWQgdXAgdGhlCi0JICogSlBBIGZpbGUgdmlhIGEgZmlsZSBuYW1lIFthbmQgYXNzdW1lZCBjb250ZW50IHR5cGVdLgotCSAqIEBzZWUgI2dldFJlc291cmNlTW9kZWwoKQotCSAqLwotCUpwdFJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbChJQ29udGVudFR5cGUgY29udGVudFR5cGUpOwotCQotCQotCS8vICoqKioqKioqKiogcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgKioqKioqKioqKgotCi0vLwkvKioKLS8vCSAqIFJldHVybiB0aGUgSlBBIGZpbGUncyByb290IHN0cnVjdHVyZSBub2Rlcy4KLS8vCSAqLwotLy8JSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4gcm9vdFN0cnVjdHVyZU5vZGVzKCk7Ci0vLwkJU3RyaW5nIFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04gPSAicm9vdFN0cnVjdHVyZU5vZGVzIjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBjb3VudCBvZiB0aGUgSlBBIGZpbGUncyByb290IGNvbnRleHQgbW9kZWwgb2JqZWN0cy4KLS8vCSAqLwotLy8JaW50IHJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKTsKLS8vCi0vLwkvKioKLS8vCSAqIEFkZCBhIHJvb3Qgc3RydWN0dXJlIG5vZGUuCi0vLwkgKiBUaGVyZSBpcyB0aGUgcG90ZW50aWFsIGZvciBtdWx0aXBsZSByb290IHN0cnVjdHVyZSBub2RlcyAKLS8vCSAqIGZvciBhIHBhcnRpY3VsYXIga2V5LiBGb3IgZXhhbXBsZSwgYSBKYXZhIGZpbGUgdGhhdCBpcyBsaXN0ZWQKLS8vCSAqIGJvdGggYXMgYSA8Y2xhc3M+IGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgYW5kIGFzIGFuIDxlbnRpdHk+IGluCi0vLwkgKiBhbiBvcm0ueG1sIGZpbGUuIEluIHRoaXMgY2FzZSB0aGUgb3JtLnhtbCBmaWxlIG5lZWRzIHRvIHNldAotLy8JICogdGhlIHJvb3Qgc3RydWN0dXJlIG5vZGUgYWZ0ZXIgdGhlIEphdmEgY2xhc3MgcmVmZXJlbmNlLgotLy8JICogTGFzdCBvbmUgaW4gZHVyaW5nIHByb2plY3QgInVwZGF0ZSIgd2lucy4KLS8vCSAqLwotLy8Jdm9pZCBhZGRSb290U3RydWN0dXJlTm9kZShPYmplY3Qga2V5LCBKcGFTdHJ1Y3R1cmVOb2RlIHJvb3RTdHJ1Y3R1cmVOb2RlKTsKLS8vCi0vLwkvKioKLS8vCSAqIEBzZWUgI2FkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCwgSnBhU3RydWN0dXJlTm9kZSkKLS8vCSAqLwotLy8Jdm9pZCByZW1vdmVSb290U3RydWN0dXJlTm9kZShPYmplY3Qga2V5KTsKLS8vCi0vLwkvKioKLS8vCSAqIFJldHVybiB0aGUgc3RydWN0dXJlIG5vZGUgYmVzdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBsb2NhdGlvbiBpbiB0aGUgZmlsZS4KLS8vCSAqLwotLy8JSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KTsKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4Yk5vZGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWI2YzUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4Yk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5JUmVzb3VyY2VQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBKQVhCLXNwZWNpZmljIHByb3RvY29sLiBBbGwgSkFYQiBvYmplY3RzIGJlbG9uZyB0byBhIEpBWEIgcHJvamVjdCwgYXJlCi0gKiBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZSwgYW5kIGhhdmUgYSBwYXJlbnQgKGV4Y2VwdGluZyB0aGUgSkFYQiBwcm9qZWN0KS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJOb2RlCi0JZXh0ZW5kcyBNb2RlbCwgSUFkYXB0YWJsZSwgSVJlc291cmNlUGFydAotewotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwcm9qZWN0IHRoZSBub2RlIGJlbG9uZ3MgdG8uCi0JICovCi0JSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBub2RlJ3MgcGFyZW50LiBUaGUgSkFYQiBwcm9qZWN0IHdpbGwgbm90IGhhdmUgYSBwYXJlbnQuCi0JICovCi0JSmF4Yk5vZGUgZ2V0UGFyZW50KCk7Ci0KLQl2b2lkIHN0YXRlQ2hhbmdlZCgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlByb2plY3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzc5OWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlByb2plY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJwcm9wcy5KYXhiUHJvcGVydGllc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogQSBKQVhCIHByb2plY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVjbGlwc2UgcHJvamVjdCAoYW5kIGl0cyBjb3JyZXNwb25kaW5nCi0gKiBKYXZhIHByb2plY3QpLiBJdCBob2xkcyB0aGUgInJlc291cmNlIiBtb2RlbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB2YXJpb3VzCi0gKiBKUEEtcmVsYXRlZCByZXNvdXJjZXMgKHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUsIGl0cyBtYXBwaW5nIGZpbGVzCi0gKiBbPGNvZGU+b3JtLnhtbDwvY29kZT5dLAotICogYW5kIHRoZSBKYXZhIHNvdXJjZSBmaWxlcykuIEl0IGFsc28gaG9sZHMgdGhlICJjb250ZXh0IiBtb2RlbCB0aGF0IHJlcHJlc2VudHMKLSAqIHRoZSBKUEEgbWV0YWRhdGEsIGFzIGRlcml2ZWQgZnJvbSBzcGVjLWRlZmluZWQgZGVmYXVsdHMsIEphdmEgc291cmNlIGNvZGUKLSAqIGFubm90YXRpb25zLCBhbmQgWE1MIGRlc2NyaXB0b3JzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlByb2plY3QKLQlleHRlbmRzIEpheGJOb2RlCi17Ci0KLQkvLyAqKioqKioqKioqIGdlbmVyYWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKQVhCIHByb2plY3QncyBuYW1lLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgYXNzb2NpYXRlZAotCSAqIEVjbGlwc2UgcHJvamVjdCdzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRWNsaXBzZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFYQiBwcm9qZWN0LgotCSAqLwotCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFYQiBwcm9qZWN0LgotCSAqLwotCUlKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2ZW5kb3Itc3BlY2lmaWMgSkFYQiBwbGF0Zm9ybSB0aGF0IGJ1aWxkcyB0aGUgSkFYQiBwcm9qZWN0Ci0JICogYW5kIGl0cyBjb250ZW50cy4KLQkgKi8KLQlKYXhiUGxhdGZvcm0gZ2V0UGxhdGZvcm0oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSBsaWJyYXJ5IHVzZWQgZm9yIHZhbGlkYXRpbmcgYW5kIHVzZXIgYXNzaXN0Ci0JICovCi0JU2NoZW1hTGlicmFyeSBnZXRTY2hlbWFMaWJyYXJ5KCk7Ci0JCi0JLyoqCi0JICogVGhlIEpBWEIgcHJvamVjdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIEpKQVhCUEEgbW9kZWwuIENsZWFuIHVwIGFueQotCSAqIGhvb2tzIHRvIGV4dGVybmFsIHJlc291cmNlcyBldGMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLQotCS8vICoqKioqKioqKiogSkFYQiBmaWxlcyAqKioqKioqKioqCi0KLQkvKiogCi0JICogSUQgc3RyaW5nIHVzZWQgd2hlbiB0aGUgSkFYQiBwcm9qZWN0J3MgY29sbGVjdGlvbiBvZiBKQVhCIGZpbGVzIGNoYW5nZXMuCi0JICogQHNlZSAjYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlTdHJpbmcgSkFYQl9GSUxFU19DT0xMRUNUSU9OID0gImpheGJGaWxlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwcm9qZWN0J3MgSkFYQiBmaWxlcy4KLQkgKi8KLQlJdGVyYWJsZTxKYXhiRmlsZT4gZ2V0SmF4YkZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEpBWEIgcHJvamVjdCdzIEpBWEIgZmlsZXMuCi0JICovCi0JaW50IGdldEpheGJGaWxlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIEpBWEIgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqLwotCUpheGJGaWxlIGdldEpheGJGaWxlKElGaWxlIGZpbGUpOwotCi0KLS8vCS8vICoqKioqKioqKiogZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0cyAqKioqKioqKioqCi0vLwotLy8JLyoqIAotLy8JICogSUQgc3RyaW5nIHVzZWQgd2hlbiB0aGUgSlBBIHByb2plY3QncyBjb2xsZWN0aW9uIG9mIGV4dGVybmFsIEphdmEKLS8vCSAqIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzIGNoYW5nZXMuCi0vLwkgKiBAc2VlICNhZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoU3RyaW5nLCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKQotLy8JICovCi0vLwlTdHJpbmcgRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OID0gImV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cyI7IC8vJE5PTi1OTFMtMSQKLS8vCi0vLwkvKioKLS8vCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBleHRlcm5hbCBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzLgotLy8JICovCi0vLwlJdGVyYXRvcjxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+IGV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpOwotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBKUEEgcHJvamVjdCdzIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMuCi0vLwkgKi8KLS8vCWludCBleHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHNTaXplKCk7Ci0vLwotLy8KLS8vCS8vICoqKioqKioqKiogZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzICoqKioqKioqKioKLS8vCi0vLwkvKioKLS8vCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBleHRlcm5hbCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZSBjYWNoZS4KLS8vCSAqLwotLy8JSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUoKTsKLS8vCi0JCi0JLy8gKioqKioqKioqKiBKYXZhIHJlc291cmNlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHBhY2thZ2VzIGZvciB0aGUgcHJvamVjdC4KLQkgKiBSZXR1cm4gbnVsbCBpZiBpbnZhbGlkIG9yIGFic2VudC4gVGhlc2UgY29ycmVzcG9uZCB0byBwYWNrYWdlLWluZm8uamF2YSBmaWxlcwotCSAqLwotCUl0ZXJhYmxlPEphdmFSZXNvdXJjZVBhY2thZ2U+IGdldEphdmFSZXNvdXJjZVBhY2thZ2VzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHBhY2thZ2UgZm9yIHRoZSBzcGVjaWZpZWQgcGFja2FnZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiBpbnZhbGlkIG9yIGFic2VudC4KLQkgKi8KLQlKYXZhUmVzb3VyY2VQYWNrYWdlIGdldEphdmFSZXNvdXJjZVBhY2thZ2UoU3RyaW5nIHBhY2thZ2VOYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphdmEgcmVzb3VyY2UgcGFja2FnZXMgdGhhdCBhcmUgYW5ub3RhdGVkIHdpdGgKLQkgKiAxIG9yIG1vcmUgdmFsaWQgSkFYQiBwYWNrYWdlIGFubm90YXRpb25zCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZT4gZ2V0QW5ub3RhdGVkSmF2YVJlc291cmNlUGFja2FnZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGphdmEgcmVzb3VyY2UgcGFja2FnZSBmb3IgdGhlIHNwZWNpZmllZCBwYWNrYWdlIGlmIGFuZCBvbmx5IGlmIGl0IGhhcwotCSAqIHJlY29nbml6ZWQgYW5ub3RhdGlvbnMuCi0JICogUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCUphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0QW5ub3RhdGVkSmF2YVJlc291cmNlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCQotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIEphdmEgcmVzb3VyY2UgcGFja2FnZSBmcmFnZW1lbnQgcm9vdCBmb3IgdGhlIHNwZWNpZmllZCBKQVIuCi0vLwkgKiBSZXR1cm4gbnVsbCBpZiBhYnNlbnQuCi0vLwkgKi8KLS8vCUphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcgamFyRmlsZU5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiBhbGwge0BsaW5rIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZX1zIHRoYXQgYXJlIHJlcHJlc2VudGVkIGJ5IGphdmEgc291cmNlIHdpdGhpbiB0aGlzIHByb2plY3QKLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEphdmFTb3VyY2VSZXNvdXJjZVR5cGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCB7QGxpbmsgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlfXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgamF2YSBzb3VyY2Ugd2l0aGluIHRoaXMgcHJvamVjdCwKLQkgKiB0aGF0IGFyZSBhbHNvIGFubm90YXRlZCB3aXRoIGEgcmVjb2duaXplZCBhbm5vdGF0aW9uIChhbmQgYXJlIHBlcnNpc3RhYmxlKSAKLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEFubm90YXRlZEphdmFTb3VyY2VSZXNvdXJjZVR5cGVzKCk7Ci0JCi0vLwkvKioKLS8vCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIEpBWEIgcHJvamVjdCdzIGFubm90YXRlZCBKYXZhIGNsYXNzZXMKLS8vCSAqLwotLy8JSXRlcmFibGU8U3RyaW5nPiBnZXRBbm5vdGF0ZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUgbmFtZSwgcmVnYXJkbGVzcyBvZiAKLQkgKiB3aGF0IGtpbmQgaXQgaXMuCi0JICogUmV0dXJuIG51bGwgaWYgYWJzZW50LgotCSAqLwotCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKFN0cmluZyB0eXBlTmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlfSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGFuZCBraW5kLgotCSAqIFJldHVybiBudWxsIGlmIGludmFsaWQgb3IgYWJzZW50IG9yIGlmIHRoZSBraW5kIGRvZXMgbm90IG1hdGNoLgotCSAqLwotCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKFN0cmluZyB0eXBlTmFtZSwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlLktpbmQga2luZCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXhiLmluZGV4IHJlc291cmNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBqYXhiLmluZGV4IHJlc291cmNlIG1vZGVscyB3aXRoaW4gdGhlIHByb2plY3QKLQkgKi8KLQlJdGVyYWJsZTxKYXhiSW5kZXhSZXNvdXJjZT4gZ2V0SmF4YkluZGV4UmVzb3VyY2VzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBqYXhiLmluZGV4IHJlc291cmNlIG1vZGVsIChjb3VsZCBiZSBtdWx0aXBsZSBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgbG9jYXRpb25zCi0JICogZm9yIGEgZ2l2ZW4gcGFja2FnZSkgd2l0aCB0aGUgZ2l2ZW4gcGFja2FnZSBuYW1lCi0JICovCi0JSmF4YkluZGV4UmVzb3VyY2UgZ2V0SmF4YkluZGV4UmVzb3VyY2UoU3RyaW5nIHBhY2thZ2VOYW1lKTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGpheGIucHJvcGVydGllcyByZXNvdXJjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGpheGIucHJvcGVydGllcyByZXNvdXJjZSBtb2RlbHMgd2l0aGluIHRoZSBwcm9qZWN0Ci0JICovCi0JSXRlcmFibGU8SmF4YlByb3BlcnRpZXNSZXNvdXJjZT4gZ2V0SmF4YlByb3BlcnRpZXNSZXNvdXJjZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGpheGIucHJvcGVydGllcyByZXNvdXJjZSBtb2RlbCAoY291bGQgYmUgbXVsdGlwbGUgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGxvY2F0aW9ucwotCSAqIGZvciBhIGdpdmVuIHBhY2thZ2UpIHdpdGggdGhlIGdpdmVuIHBhY2thZ2UgbmFtZQotCSAqLwotCUpheGJQcm9wZXJ0aWVzUmVzb3VyY2UgZ2V0SmF4YlByb3BlcnRpZXNSZXNvdXJjZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogY29udGV4dCBtb2RlbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBvZiB0aGUgSkFYQiBwcm9qZWN0J3MgY29udGV4dCBtb2RlbC4KLQkgKi8KLQlKYXhiQ29udGV4dFJvb3QgZ2V0Q29udGV4dFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgdHlwZXMvcGFja2FnZSBpbmZvcyB0aGF0IGFyZSBwcmltYXJ5IGNvbnRleHQgb2JqZWN0cyBmb3IgdGhlIAotCSAqIGdpdmVuIGNvbXBpbGF0aW9uIHVuaXQKLQkgKi8KLQlJdGVyYWJsZTw/IGV4dGVuZHMgSmF2YUNvbnRleHROb2RlPiBnZXRQcmltYXJ5SmF2YU5vZGVzKElDb21waWxhdGlvblVuaXQgY3UpOwotCQotCQotCS8vICoqKioqKioqKiogbW9kZWwgc3luY2hyb25pemF0aW9uICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgSlBBIHByb2plY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHByb2plY3QgcmVzb3VyY2UKLQkgKiBkZWx0YSwgd2F0Y2hpbmcgZm9yIGFkZGVkIGFuZCByZW1vdmVkIGZpbGVzIGluIHBhcnRpY3VsYXIuCi0JICovCi0Jdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSk7Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgSlBBIHByb2plY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIEphdmEgY2hhbmdlLgotCSAqLwotCXZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpOwotCi0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUgY29udGV4dCBtb2RlbCB3aXRoIHJlc291cmNlIG1vZGVsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3luY2hyb25pemVyIHRoYXQgd2lsbCBzeW5jaHJvbml6ZSB0aGUgY29udGV4dCBtb2RlbCB3aXRoCi0JICogdGhlIHJlc291cmNlIG1vZGVsIHdoZW5ldmVyIHRoZSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCVN5bmNocm9uaXplciBnZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgc3luY2hyb25pemVyIHRoYXQgd2lsbCBrZWVwIHRoZSBjb250ZXh0IG1vZGVsIHN5bmNocm9uaXplZCB3aXRoCi0JICogdGhlIHJlc291cmNlIG1vZGVsIHdoZW5ldmVyIHRoZSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotCSAqIEJlZm9yZSBzZXR0aW5nIHRoZSBzeW5jaHJvbml6ZXIsIGNsaWVudHMgc2hvdWxkIHNhdmUgdGhlIGN1cnJlbnQKLQkgKiBzeW5jaHJvbml6ZXIgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGxhdGVyLgotCSAqIAotCSAqIEBzZWUgI2dldENvbnRleHRNb2RlbFN5bmNocm9uaXplcigpCi0JICovCi0Jdm9pZCBzZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyIHN5bmNocm9uaXplcik7Ci0KLQkvKioKLQkgKiBUaGUgSkFYQiBwcm9qZWN0J3MgcmVzb3VyY2UgbW9kZWwgaGFzIGNoYW5nZWQ7IHN5bmNocm9uaXplIHRoZSBKUEEKLQkgKiBwcm9qZWN0J3MgY29udGV4dCBtb2RlbCB3aXRoIGl0LiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgY2FsbGVkIHdoZW4gdGhlCi0JICogcmVzb3VyY2UgbW9kZWwgc3RhdGUgaGFzIGNoYW5nZWQgd2hlbiBpdCBpcyBzeW5jaHJvbml6ZWQgd2l0aCBpdHMKLQkgKiB1bmRlcmx5aW5nIEVjbGlwc2UgcmVzb3VyY2UgYXMgdGhlIHJlc3VsdCBvZiBhbiBFY2xpcHNlIHJlc291cmNlIGNoYW5nZQotCSAqIGV2ZW50LiBUaGlzIG1ldGhvZCBjYW4gYWxzbyBiZSBjYWxsZWQgd2hlbiBhIGNsaWVudCAoZS5nLiBhIEpVbml0IHRlc3QKLQkgKiBjYXNlKSBoYXMgbWFuaXB1bGF0ZWQgdGhlIHJlc291cmNlIG1vZGVsIHZpYSBpdHMgQVBJIChhcyBvcHBvc2VkIHRvCi0JICogbW9kaWZ5aW5nIHRoZSB1bmRlcmx5aW5nIEVjbGlwc2UgcmVzb3VyY2UgZGlyZWN0bHkpIGFuZCBuZWVkcyB0aGUgY29udGV4dAotCSAqIG1vZGVsIHRvIGJlIHN5bmNocm9uaXplZCBhY2NvcmRpbmdseSAoc2luY2UgbWFuaXB1bGF0aW5nIHRoZSByZXNvdXJjZQotCSAqIG1vZGVsIHZpYSBpdHMgQVBJIHdpbGwgbm90IHRyaWdnZXIgdGhpcyBtZXRob2QpLiBXaGV0aGVyIHRoZSBjb250ZXh0Ci0JICogbW9kZWwgaXMgc3luY2hyb25vdXNseSAob3IgYXN5bmNocm9ub3VzbHkpIGRlcGVuZHMgb24gdGhlIGN1cnJlbnQgY29udGV4dAotCSAqIG1vZGVsIHN5bmNocm9uaXplci4KLQkgKiAKLQkgKiBAc2VlICNzeW5jaHJvbml6ZUNvbnRleHRNb2RlbEFuZFdhaXQoKQotCSAqLwotCXZvaWQgc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCS8qKgotCSAqIEZvcmNlIHRoZSBKQVhCIHByb2plY3QncyBjb250ZXh0IG1vZGVsIHRvIHN5bmNocm9uaXplIHdpdGggaXQgcmVzb3VyY2UKLQkgKiBtb2RlbCA8ZW0+c3luY2hyb25vdXNseTwvZW0+LgotCSAqIAotCSAqIEBzZWUgI3N5bmNocm9uaXplQ29udGV4dE1vZGVsKCkKLQkgKiBAc2VlICN1cGRhdGVBbmRXYWl0KCkKLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplQ29udGV4dE1vZGVsQW5kV2FpdCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgY29udGV4dCBtb2RlbCBzeW5jaHJvbml6ZXIgdG8gcGVyZm9ybQotCSAqIHRoZSBhY3R1YWwgInN5bmNocm9uaXplIi4KLQkgKi8KLQlJU3RhdHVzIHN5bmNocm9uaXplQ29udGV4dE1vZGVsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvLyAqKioqKioqKioqIHByb2plY3QgInVwZGF0ZSIgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIHVwZGF0ZSB0aGUgY29udGV4dCBtb2RlbCB3aGVuZXZlcgotCSAqIGl0IGhhcyBhbnkgY2hhbmdlcy4gVGhpcyBhbGxvd3MgYW55IGludHJhLUpBWEIgcHJvamVjdCBkZXBlbmRlbmNpZXMgdG8KLQkgKiBiZSB1cGRhdGVkLgotCSAqLwotCUNhbGxiYWNrU3luY2hyb25pemVyIGdldFVwZGF0ZVN5bmNocm9uaXplcigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIHVwZGF0ZSB0aGUgY29udGV4dCBtb2RlbCB3aGVuZXZlcgotCSAqIGl0IGhhcyBhbnkgY2hhbmdlcy4gVGhpcyBhbGxvd3MgYW55IGludHJhLUpBWEIgcHJvamVjdCBkZXBlbmRlbmNpZXMgdG8KLQkgKiBiZSB1cGRhdGVkLgotCSAqIEJlZm9yZSBzZXR0aW5nIHRoZSB1cGRhdGUgc3luY2hyb25pemVyLCBjbGllbnRzIHNob3VsZCBzYXZlIHRoZSBjdXJyZW50Ci0JICogc3luY2hyb25pemVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlci4KLQkgKiAKLQkgKiBAc2VlICNnZXRVcGRhdGVTeW5jaHJvbml6ZXIoKQotCSAqLwotCXZvaWQgc2V0VXBkYXRlU3luY2hyb25pemVyKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcik7Ci0KLQkvKioKLQkgKiBGb3JjZSB0aGUgSkFYQiBwcm9qZWN0IHRvICJ1cGRhdGUiIDxlbT5zeW5jaHJvbm91c2x5PC9lbT4uCi0JICogCi0JICogQHNlZSAjc3luY2hyb25pemVDb250ZXh0TW9kZWxBbmRXYWl0KCkKLQkgKi8KLQl2b2lkIHVwZGF0ZUFuZFdhaXQoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHVzZWQgYnkgdGhlIHVwZGF0ZSBzeW5jaHJvbml6ZXIgdG8gcGVyZm9ybSB0aGUKLQkgKiBhY3R1YWwgInVwZGF0ZSIuCi0JICovCi0JSVN0YXR1cyB1cGRhdGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCi0KLQotLy8JLy8gKioqKioqKioqKiB1dGlsaXR5ICoqKioqKioqKioKLS8vCi0vLwkvKioKLS8vCSAqIFJldHVybiBhbiB7QGxpbmsgSUZpbGV9IHRoYXQgYmVzdCByZXByZXNlbnRzIHRoZSBnaXZlbiBydW50aW1lIGxvY2F0aW9uCi0vLwkgKi8KLS8vCUlGaWxlIGdldFBsYXRmb3JtRmlsZShJUGF0aCBydW50aW1lUGF0aCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gcHJvamVjdCdzIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0JICovCi0JSXRlcmFibGU8SU1lc3NhZ2U+IGdldFZhbGlkYXRpb25NZXNzYWdlcyhJUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCQotCQotCS8vICoqKioqKioqKiogbW9kaWZ5aW5nIHNoYXJlZCBkb2N1bWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IGEgdGhyZWFkLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yfQotCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIGEgY29tbWFuZCB0byBtb2RpZnkgYSBzaGFyZWQKLQkgKiBkb2N1bWVudC4gSWYgbmVjZXNzYXJ5LCB0aGUgY29tbWFuZCBleGVjdXRvciBjYW4gYmUgY2xlYXJlZCBieQotCSAqIHNldHRpbmcgaXQgdG8gbnVsbC4KLQkgKiBUaGlzIGFsbG93cyBiYWNrZ3JvdW5kIGNsaWVudHMgdG8gbW9kaWZ5IGRvY3VtZW50cyB0aGF0IGFyZQotCSAqIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgVUkuIFNlZSBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIENvbW1hbmRFeGVjdXRvcn0uCi0JICovCi0Jdm9pZCBzZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9qZWN0LXdpZGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0JICoge0BsaW5rIENvbW1hbmRFeGVjdXRvcn0gaW50ZXJmYWNlLgotCSAqLwotCUNvbW1hbmRFeGVjdXRvciBnZXRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiBjb25maWcgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHNldHRpbmdzIHVzZWQgdG8gY29uc3RydWN0IGEgSkFYQiBwcm9qZWN0LgotCSAqLwotCWludGVyZmFjZSBDb25maWcgewotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgRWNsaXBzZSBwcm9qZWN0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IEpBWEIgcHJvamVjdC4KLQkJICovCi0JCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIEpBWEIgcGxhdGZvcm0gZGVmaW5pdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBKQVhCIHByb2plY3QuCi0JCSAqLwotCQlKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGdldFBsYXRmb3JtRGVmaW5pdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pheGJQcm9qZWN0TWFuYWdlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlByb2plY3RNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjU4NTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlByb2plY3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci0KLQotLyoqCi0gKiBUaGUgSkFYQiBwcm9qZWN0IG1hbmFnZXIgaG9sZHMgYWxsIHRoZSBKQVhCIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUHJvamVjdE1hbmFnZXIKLQkJZXh0ZW5kcyBNb2RlbCB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKQVhCIG1vZGVsJ3MgSkFYQiBwcm9qZWN0cy4KLQkgKi8KLQlJdGVyYWJsZTxKYXhiUHJvamVjdD4gZ2V0SmF4YlByb2plY3RzKCk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfUFJPSkVDVFNfQ09MTEVDVElPTiA9ICJqYXhiUHJvamVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEpBWEIgbW9kZWwncyBsaXN0IG9mIEpBWEIgcHJvamVjdHMuCi0JICovCi0JaW50IGdldEpheGJQcm9qZWN0c1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICogUmV0dXJuIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdAotCSAqIHdpdGggYSBKQVhCIHByb2plY3QuCi0JICovCi0JSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpBWEIgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBmaWxlLAotCSAqIG9yIG51bGwgaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCBhIEpBWEIgZmlsZS4KLQkgKi8KLQlKYXhiRmlsZSBnZXRKYXhiRmlsZShJRmlsZSBmaWxlKTsKLQotCS8qKgotCSAqIFRoZSBKQVhCIHNldHRpbmdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdAotCSAqIGhhdmUgY2hhbmdlZCBpbiBzdWNoIGEgd2F5IGFzIHRvIHJlcXVpcmUgdGhlIGFzc29jaWF0ZWQKLQkgKiBKUEEgcHJvamVjdCB0byBiZSBjb21wbGV0ZWx5IHJlYnVpbHQKLQkgKiAoZS5nLiB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgYSBwcm9qZWN0J3MgSkFYQiBwbGF0Zm9ybSkuCi0JICovCi0Jdm9pZCByZWJ1aWxkSmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbW9kZWwncyBKYXZhIGNoYW5nZSBsaXN0ZW5lciBpcyBhY3RpdmUuCi0JICovCi0JYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoKTsKLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoZSBtb2RlbCdzIEphdmEgY2hhbmdlIGxpc3RlbmVyIGlzIGFjdGl2ZS4KLQkgKi8KLQl2b2lkIHNldEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZShib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSk7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhN2M1ZWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvSmF4YlJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotCi0vKioKLSAqIE1hcCBhIGNvbnRlbnQgdHlwZSB0byBhIEpBWEIgcmVzb3VyY2UgbW9kZWwuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIAotewotCS8qKgotCSAqIFJldHVybiB0aGUgZmlsZSBjb250ZW50IHR5cGUgdGhlIHByb3ZpZGVyIGlzIGZvci4KLQkgKi8KLQlJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgSkFYQiByZXNvdXJjZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBKQVhCIHByb2plY3QgYW5kIGZpbGUuCi0JICogVXNlIHRoZSBzcGVjaWZpZWQgZmFjdG9yeSBmb3IgY3JlYXRpb24gc28gZXh0ZW5kZXJzIGNhbiBzaW1wbHkgb3ZlcnJpZGUKLQkgKiB0aGUgYXBwcm9wcmlhdGUgY3JlYXRpb24gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBwcm92aWRlciBmb3IgdGhlCi0JICogc2FtZSBjb250ZW50LgotCSAqLwotCUpwdFJlc291cmNlTW9kZWwgYnVpbGRSZXNvdXJjZU1vZGVsKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pwdEpheGJDb3JlUGx1Z2luLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9KcHRKYXhiQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzAyNTM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL0pwdEpheGJDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnBsYXRmb3JtLkpheGJQbGF0Zm9ybU1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogVGhlIERhbGkgSkFYQiBjb3JlIHBsdWctaW4gbGlmZWN5Y2xlIGltcGxlbWVudGF0aW9uLgotICogQSBudW1iZXIgb2YgZ2xvYmFsbHktYXZhaWxhYmxlIGNvbnN0YW50cyBhbmQgbWV0aG9kcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKYXhiQ29yZVBsdWdpbgotCQlleHRlbmRzIFBsdWdpbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBmbHVzaFByZWZlcmVuY2VzID0gdHJ1ZTsKLQkKLQkvKioKLQkgKiBUaGUgcGx1Zy1pbiBpZGVudGlmaWVyIG9mIERhbGkgSkFYQiBjb3JlCi0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIjsgIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfID0gUExVR0lOX0lEICsgJy4nOwotCQotCS8qKgotCSAqIFRoZSBub2RlIGZvciBzdG9yaW5nIGEgSkFYQiBwcm9qZWN0J3MgcGxhdGZvcm0gaW4gdGhlIHByb2plY3QncyBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTEFURk9STV9QUkVGX05PREUgPSAicGxhdGZvcm0iOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIHBsYXRmb3JtIGlkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fSURfUFJFRl9LRVkgPSAicGxhdGZvcm0taWQiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBub2RlIGZvciBzdG9yaW5nIGEgSkFYQiBwcm9qZWN0J3Mgc2NoZW1hcyBpbiB0aGUgcHJvamVjdCdzIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQVNfUFJFRl9OT0RFID0gInNjaGVtYXMiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBub2RlIHByZWZpeCBmb3Igc3RvcmluZyBhIHBhcnRpY3VsYXIgSkFYQiBwcm9qZWN0IHNjaGVtYSBpbiB0aGUgcHJvamVjdCdzIHByZWZlcmVuY2VzLgotCSAqIFNwZWNpZmljIHNjaGVtYSBub2RlcyBhcmUgZm9sbG93ZWQgYnkgaW50ZWdlcnMgKCJzY2hlbWEtMSIsICJzY2hlbWEtMiIsIGV0Yy4pCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX1BSRUZfTk9ERV9QUkVGSVggPSAic2NoZW1hLSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSBmb3Igc3RvcmluZyBhIHNjaGVtYSBsb2NhdGlvbiAoc3VjaCBhcyBhIHVyaSBvciBjYXRhbG9nIGtleSkgaW4gdGhlIHByb2plY3QncyBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9MT0NBVElPTl9QUkVGX0tFWSA9ICJsb2NhdGlvbiI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSBmb3Igc3RvcmluZyB0aGUgZGVmYXVsdCBKQVhCIHBsYXRmb3JtIElEIGZvciBKQVhCIDIuMSBpbiB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSkFYQl9QTEFURk9STV8yXzFfUFJFRl9LRVkgPSAKLQkJCSJkZWZhdWx0SmF4YlBsYXRmb3JtXyIgKyBKYXhiRmFjZXQuVkVSU0lPTl8yXzEuZ2V0VmVyc2lvblN0cmluZygpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBzdG9yaW5nIHRoZSBkZWZhdWx0IEpBWEIgcGxhdGZvcm0gSUQgZm9yIEpBWEIgMi4yIGluIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KQVhCX1BMQVRGT1JNXzJfMl9QUkVGX0tFWSA9IAotCQkJImRlZmF1bHRKYXhiUGxhdGZvcm1fIiArIEpheGJGYWNldC5WRVJTSU9OXzJfMi5nZXRWZXJzaW9uU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEpBWEIgdmFsaWRhdGlvbiBtYXJrZXIKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlByb2JsZW1NYXJrZXIiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfSUQgPSBQTFVHSU5fSUQgKyAiLmpheGJQcm9ibGVtTWFya2VyIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb250ZW50IHR5cGUgZm9yIGpheGIuaW5kZXggZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVhCX0lOREVYX0NPTlRFTlRfVFlQRSA9IGdldEpheGJDb250ZW50VHlwZSgiamF4YkluZGV4Iik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIGpheGIuaW5kZXggZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBKQVhCX0lOREVYX1JFU09VUkNFX1RZUEUgPSBuZXcgSnB0UmVzb3VyY2VUeXBlKEpBWEJfSU5ERVhfQ09OVEVOVF9UWVBFKTsKLQkKLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIGZvciBqYXhiLnByb3BlcnRpZXMgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBKQVhCX1BST1BFUlRJRVNfQ09OVEVOVF9UWVBFID0gZ2V0SmF4YkNvbnRlbnRUeXBlKCJqYXhiUHJvcGVydGllcyIpOwotCQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIGZvciBqYXhiLnByb3BlcnRpZXMgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBKQVhCX1BST1BFUlRJRVNfUkVTT1VSQ0VfVFlQRSA9IG5ldyBKcHRSZXNvdXJjZVR5cGUoSkFYQl9QUk9QRVJUSUVTX0NPTlRFTlRfVFlQRSk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldEpheGJDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRUeXBlKENPTlRFTlRfUFJFRklYXyArIGNvbnRlbnRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QUkVGSVggPSBQTFVHSU5fSURfICsgImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9QUkVGSVhfID0gQ09OVEVOVF9QUkVGSVggKyAnLic7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGZpZWxkcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcml2YXRlIHZvbGF0aWxlIEdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIgcHJvamVjdE1hbmFnZXI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SmF4YkNvcmVQbHVnaW4gSU5TVEFOQ0U7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24gcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0SmF4YkNvcmVQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwdWJsaWMgc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5ndWxhciBKQVhCIHByb2plY3QgbWFuYWdlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheGJQcm9qZWN0TWFuYWdlciBnZXRQcm9qZWN0TWFuYWdlcigpIHsKLQkJcmV0dXJuIElOU1RBTkNFLmdldFByb2plY3RNYW5hZ2VyXygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHByb2plY3Qgd2l0aCBhCi0JICogSkFYQiBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlByb2plY3QgZ2V0SmF4YlByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0UHJvamVjdE1hbmFnZXIoKS5nZXRKYXhiUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1NYW5hZ2VyIGdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKSB7Ci0JCXJldHVybiBKYXhiUGxhdGZvcm1NYW5hZ2VySW1wbC5pbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgRGFsaSBwcmVmZXJlbmNlcwotCSAqIEBzZWUgSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKERlZmF1bHRTY29wZS5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEYWxpIHByZWZlcmVuY2VzIGZvciB0aGUgY3VycmVudCB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldFdvcmtzcGFjZVByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoSW5zdGFuY2VTY29wZS5JTlNUQU5DRSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgRGFsaSBwcmVmZXJlbmNlcyBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVNjb3BlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBjb250ZXh0LmdldE5vZGUoUExVR0lOX0lEKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya3NwYWNlUHJlZmVyZW5jZShTdHJpbmcgcHJlZmVyZW5jZUtleSwgU3RyaW5nIHByZWZlcmVuY2VWYWx1ZSkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKTsKLQkJcHJlZnMucHV0KHByZWZlcmVuY2VLZXksIHByZWZlcmVuY2VWYWx1ZSk7Ci0JCWZsdXNoKHByZWZzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKHZpYSByZWZsZWN0aW9uKSB3aGVuIHRoZSB0ZXN0IHBsdWctaW4gaXMgbG9hZGVkLgotCSAqIFRoZSBwcmVmZXJlbmNlcyBlbmQgdXAgZ2V0dGluZyBmbHVzaGVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgaGFzIGRlbGV0ZWQKLQkgKiBpdHMgcHJvamVjdCwgcmVzdWx0aW5nIGluIHJlc291cmNlIGV4Y2VwdGlvbnMgaW4gdGhlIGxvZywgZS5nLgotCSAqIDxwcmU+Ci0JICogICAgIFJlc291cmNlICcvSnBhUHJvamVjdE1hbmFnZXJUZXN0cycgaXMgbm90IG9wZW4uCi0JICogPC9wcmU+Ci0JICogU2VlIDxjb2RlPkpwdEpheGJDb3JlVGVzdHNQbHVnaW4uc3RhcnQoQnVuZGxlQ29udGV4dCk8L2NvZGU+Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkb05vdEZsdXNoUHJlZmVyZW5jZXMoKSB7Ci0JCWZsdXNoUHJlZmVyZW5jZXMgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBGbHVzaCBwcmVmZXJlbmNlcyBpbiBhbiBhc3luY2hyb25vdXMgSm9iIGJlY2F1c2UgdGhlIGZsdXNoIHJlcXVlc3Qgd2lsbAotCSAqIHRyaWdnZXIgYSBsb2NrIG9uIHRoZSBwcm9qZWN0LCB3aGljaCBjYW4gY2F1c2UgdXMgc29tZSBkZWFkbG9ja3MgKGUuZy4KLQkgKiB3aGVuIGRlbGV0aW5nIHRoZSBtZXRhbW9kZWwgc291cmNlIGZvbGRlcikuCi0JICogTm90ZTogdGhlIGZsdXNoIHdpbGwgYWxzbyByZW1vdmUgdGhlIHByZWZzIG5vZGUgaWYgaXQgaXMgZW1wdHkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZsdXNoKElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJaWYgKGZsdXNoUHJlZmVyZW5jZXMpIHsKLQkJCW5ldyBQcmVmZXJlbmNlc0ZsdXNoSm9iKHByZWZzKS5zY2hlZHVsZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJlZmVyZW5jZXNGbHVzaEpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgZmluYWwgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmczsKLQkJUHJlZmVyZW5jZXNGbHVzaEpvYihJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzKSB7Ci0JCQlzdXBlcihOTFMuYmluZChKcHRKYXhiQ29yZU1lc3NhZ2VzLlBSRUZFUkVOQ0VTX0ZMVVNIX0pPQl9OQU1FLCBwcmVmcy5hYnNvbHV0ZVBhdGgoKSkpOwotCQkJdGhpcy5wcmVmcyA9IHByZWZzOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0cnkgewotCQkJCXByZWZzLmZsdXNoKCk7Ci0JCQl9IGNhdGNoKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleCkgewotCQkJCWxvZyhleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFByZWZlcmVuY2VzIGdldFByb2plY3RQcmVmZXJlbmNlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlJRmFjZXRlZFByb2plY3QgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCQlyZXR1cm4gZnByb2ouZ2V0UHJlZmVyZW5jZXMoSmF4YkZhY2V0LkZBQ0VUKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGJzZSkgewotCQkJbG9nKGJzZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWxvZyhjZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCB7QGxpbmsgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb259IGZvciBuZXcgSkFYQiBwcm9qZWN0cyB3aXRoIHRoZSBnaXZlbgotCSAqIEpBWEIgZmFjZXQgdmVyc2lvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEpheGJQbGF0Zm9ybShJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXhiRmFjZXRWZXJzaW9uLCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybSkgewotCQlTdHJpbmcgcHJlZmVyZW5jZUtleSA9IG51bGw7Ci0JCWlmIChKYXhiRmFjZXQuVkVSU0lPTl8yXzEuZXF1YWxzKGpheGJGYWNldFZlcnNpb24pKSB7Ci0JCQlwcmVmZXJlbmNlS2V5ID0gREVGQVVMVF9KQVhCX1BMQVRGT1JNXzJfMV9QUkVGX0tFWTsKLQkJfQotCQllbHNlIGlmIChKYXhiRmFjZXQuVkVSU0lPTl8yXzIuZXF1YWxzKGpheGJGYWNldFZlcnNpb24pKSB7Ci0JCQlwcmVmZXJlbmNlS2V5ID0gREVGQVVMVF9KQVhCX1BMQVRGT1JNXzJfMl9QUkVGX0tFWTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSkFYQiBmYWNldCB2ZXJzaW9uOiAiICsgamF4YkZhY2V0VmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzZXRXb3Jrc3BhY2VQcmVmZXJlbmNlKHByZWZlcmVuY2VLZXksIHBsYXRmb3JtLmdldElkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQge0BsaW5rIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9ufSBmb3IgbmV3IEpBWEIgcHJvamVjdHMgd2l0aCB0aGUgZ2l2ZW4gCi0JICogSkFYQiBmYWNldCB2ZXJzaW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpheGJGYWNldFZlcnNpb24pIHsKLQkJCi0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGRlZmF1bHRQbGF0Zm9ybSA9IAotCQkJCWdldERlZmF1bHRQbGF0Zm9ybSgKLQkJCQkJamF4YkZhY2V0VmVyc2lvbiwgCi0JCQkJCWdldFdvcmtzcGFjZVByZWZlcmVuY2VzKCksIAotCQkJCQlnZXREZWZhdWx0UHJlZmVyZW5jZXMoKSk7Ci0JCWlmIChkZWZhdWx0UGxhdGZvcm0gPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIHBsYXRmb3JtIElEIHN0b3JlZCBpbiB0aGUgd29ya3NwYWNlIHByZWZzIGlzIGludmFsaWQgKGkuZS4gbnVsbCksIGxvb2sgaW4gdGhlIGRlZmF1bHQgcHJlZnMKLQkJCWRlZmF1bHRQbGF0Zm9ybSA9IGdldERlZmF1bHRQbGF0Zm9ybShqYXhiRmFjZXRWZXJzaW9uLCBnZXREZWZhdWx0UHJlZmVyZW5jZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRQbGF0Zm9ybTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKAotCQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGpheGJGYWNldFZlcnNpb24sIFByZWZlcmVuY2VzIC4uLiBub2RlcykgewotCQkKLQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVmYXVsdERlZmF1bHRQbGF0Zm9ybTsKLQkJU3RyaW5nIHByZWZlcmVuY2VLZXk7Ci0JCWlmIChqYXhiRmFjZXRWZXJzaW9uLmVxdWFscyhKYXhiRmFjZXQuVkVSU0lPTl8yXzEpKSB7Ci0JCQlkZWZhdWx0RGVmYXVsdFBsYXRmb3JtID0gR2VuZXJpY0pheGJQbGF0Zm9ybS5WRVJTSU9OXzJfMTsKLQkJCXByZWZlcmVuY2VLZXkgPSBERUZBVUxUX0pBWEJfUExBVEZPUk1fMl8xX1BSRUZfS0VZOyAKLQkJfQotCQllbHNlIGlmIChqYXhiRmFjZXRWZXJzaW9uLmVxdWFscyhKYXhiRmFjZXQuVkVSU0lPTl8yXzIpKSB7Ci0JCQlkZWZhdWx0RGVmYXVsdFBsYXRmb3JtID0gR2VuZXJpY0pheGJQbGF0Zm9ybS5WRVJTSU9OXzJfMjsKLQkJCXByZWZlcmVuY2VLZXkgPSBERUZBVUxUX0pBWEJfUExBVEZPUk1fMl8yX1BSRUZfS0VZOyAKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgSkFYQiBmYWNldCB2ZXJzaW9uOiAiICsgamF4YkZhY2V0VmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdFBsYXRmb3JtKGpheGJGYWNldFZlcnNpb24sIHByZWZlcmVuY2VLZXksIGRlZmF1bHREZWZhdWx0UGxhdGZvcm0sIG5vZGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKAotCQkJSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbiwgU3RyaW5nIHByZWZlcmVuY2VLZXksIAotCQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVmYXVsdERlZmF1bHQsIFByZWZlcmVuY2VzIC4uLiBub2RlcykgewkKLQkJCi0JCVN0cmluZyBkZWZhdWx0RGVmYXVsdElkID0gKGRlZmF1bHREZWZhdWx0ID09IG51bGwpID8gbnVsbCA6IGRlZmF1bHREZWZhdWx0LmdldElkKCk7Ci0JCVN0cmluZyBkZWZhdWx0UGxhdGZvcm1JZCA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldChwcmVmZXJlbmNlS2V5LCBkZWZhdWx0RGVmYXVsdElkLCBub2Rlcyk7Ci0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGRlZmF1bHRQbGF0Zm9ybSA9IGdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm0oZGVmYXVsdFBsYXRmb3JtSWQpOwotCQlpZiAoZGVmYXVsdFBsYXRmb3JtICE9IG51bGwgJiYgZGVmYXVsdFBsYXRmb3JtLnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihqYXhiRmFjZXRWZXJzaW9uKSkgewotCQkJcmV0dXJuIGRlZmF1bHRQbGF0Zm9ybTsKLQkJfQotCQllbHNlIGlmIChkZWZhdWx0RGVmYXVsdCAhPSBudWxsICYmIGRlZmF1bHREZWZhdWx0LnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihqYXhiRmFjZXRWZXJzaW9uKSkgewotCQkJcmV0dXJuIGRlZmF1bHREZWZhdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFYQiBwbGF0Zm9ybSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF4YlBsYXRmb3JtSWQoSVByb2plY3QgcHJvamVjdCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJUHJlZmVyZW5jZXMgcGxhdGZvcm1QcmVmcyA9IHByZWZzLm5vZGUoUExBVEZPUk1fUFJFRl9OT0RFKTsKLQkJcmV0dXJuIHBsYXRmb3JtUHJlZnMuZ2V0KFBMQVRGT1JNX0lEX1BSRUZfS0VZLCBHZW5lcmljSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8xLmdldElkKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9ufSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBqcGFQbGF0Zm9ybUlkID0gZ2V0SmF4YlBsYXRmb3JtSWQocHJvamVjdCk7Ci0JCXJldHVybiBnZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKGpwYVBsYXRmb3JtSWQpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHtAbGluayBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbn0gYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKYXhiUGxhdGZvcm0oSVByb2plY3QgcHJvamVjdCwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0pIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0JCVByZWZlcmVuY2VzIHBsYXRmb3JtUHJlZnMgPSBwcmVmcy5ub2RlKFBMQVRGT1JNX1BSRUZfTk9ERSk7Ci0JCXBsYXRmb3JtUHJlZnMucHV0KFBMQVRGT1JNX0lEX1BSRUZfS0VZLCBwbGF0Zm9ybS5nZXRJZCgpKTsKLQkJdHJ5IHsKLQkJCXBsYXRmb3JtUHJlZnMuZmx1c2goKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGJzZSkgewotCQkJbG9nKGJzZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gZ2V0U2NoZW1hTG9jYXRpb25zKElQcm9qZWN0IHByb2plY3QpIHsKLQkJTGlzdDxTdHJpbmc+IHNjaGVtYUxvY2F0aW9ucyA9IG5ldyBWZWN0b3I8U3RyaW5nPigpOwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJUHJlZmVyZW5jZXMgc2NoZW1hc1ByZWZzID0gcHJlZnMubm9kZShTQ0hFTUFTX1BSRUZfTk9ERSk7Ci0JCXRyeSB7Ci0JCQlib29sZWFuIGNoZWNrQW5vdGhlck5vZGUgPSB0cnVlOwotCQkJZm9yIChpbnQgaSA9IDE7IGNoZWNrQW5vdGhlck5vZGU7IGkrKyApIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBTQ0hFTUFfUFJFRl9OT0RFX1BSRUZJWCArIFN0cmluZy52YWx1ZU9mKGkpOwotCQkJCWlmIChzY2hlbWFzUHJlZnMubm9kZUV4aXN0cyhub2RlTmFtZSkpIHsKLQkJCQkJUHJlZmVyZW5jZXMgc2NoZW1hUHJlZnMgPSBzY2hlbWFzUHJlZnMubm9kZShub2RlTmFtZSk7Ci0JCQkJCVN0cmluZyBsb2NhdGlvbiA9IHNjaGVtYVByZWZzLmdldChTQ0hFTUFfTE9DQVRJT05fUFJFRl9LRVksIG51bGwpOwotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJc2NoZW1hTG9jYXRpb25zLmFkZChsb2NhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoZWNrQW5vdGhlck5vZGUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBic2UpIHsKLQkJCS8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgcHJlZnMgYXJlIGNvcnJ1cHRlZCwgaW4gd2hpY2ggY2FzZSByZWFkaW5nIGFueXRoaW5nIGlzIHVubGlrZWx5Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coYnNlKTsKLQkJfQotCQlyZXR1cm4gc2NoZW1hTG9jYXRpb25zOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0U2NoZW1hTG9jYXRpb25zKElQcm9qZWN0IHByb2plY3QsIExpc3Q8U3RyaW5nPiBzY2hlbWFMb2NhdGlvbnMpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0JCVByZWZlcmVuY2VzIHNjaGVtYXNQcmVmcyA9IHByZWZzLm5vZGUoU0NIRU1BU19QUkVGX05PREUpOwotCQl0cnkgewotCQkJaW50IGkgPSAxOwotCQkJZm9yIChTdHJpbmcgbG9jYXRpb24gOiBzY2hlbWFMb2NhdGlvbnMpIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBTQ0hFTUFfUFJFRl9OT0RFX1BSRUZJWCArIFN0cmluZy52YWx1ZU9mKGkpOwotCQkJCVByZWZlcmVuY2VzIHNjaGVtYVByZWYgPSBzY2hlbWFzUHJlZnMubm9kZShub2RlTmFtZSk7Ci0JCQkJc2NoZW1hUHJlZi5wdXQoU0NIRU1BX0xPQ0FUSU9OX1BSRUZfS0VZLCBsb2NhdGlvbik7Ci0JCQkJaSArKzsKLQkJCX0KLQkJCWJvb2xlYW4gY2hlY2tBbm90aGVyTm9kZSA9IHRydWU7Ci0JCQlmb3IgKCA7IGNoZWNrQW5vdGhlck5vZGU7IGkrKyApIHsKLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBTQ0hFTUFfUFJFRl9OT0RFX1BSRUZJWCArIFN0cmluZy52YWx1ZU9mKGkpOwotCQkJCWlmIChzY2hlbWFzUHJlZnMubm9kZUV4aXN0cyhub2RlTmFtZSkpIHsKLQkJCQkJc2NoZW1hc1ByZWZzLm5vZGUobm9kZU5hbWUpLnJlbW92ZU5vZGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoZWNrQW5vdGhlck5vZGUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlzY2hlbWFzUHJlZnMuZmx1c2goKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGJzZSkgewotCQkJLy8gdGhpcyBtZWFucyB0aGF0IHRoZSBwcmVmcyBhcmUgY29ycnVwdGVkLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgYW55dGhpbmcgaXMgdW5saWtlbHkKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhic2UpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgdGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0SmF4YkNvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQkvLyBub3RoaW5nIHlldC4uLgotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpZiAodGhpcy5wcm9qZWN0TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wcm9qZWN0TWFuYWdlci5zdG9wKCk7Ci0JCQkJdGhpcy5wcm9qZWN0TWFuYWdlciA9IG51bGw7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3luY2hyb25pemVkIEdlbmVyaWNKYXhiUHJvamVjdE1hbmFnZXIgZ2V0UHJvamVjdE1hbmFnZXJfKCkgewotCQlpZiAodGhpcy5wcm9qZWN0TWFuYWdlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnByb2plY3RNYW5hZ2VyID0gdGhpcy5idWlsZFByb2plY3RNYW5hZ2VyKCk7Ci0JCQl0aGlzLnByb2plY3RNYW5hZ2VyLnN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucHJvamVjdE1hbmFnZXI7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljSmF4YlByb2plY3RNYW5hZ2VyIGJ1aWxkUHJvamVjdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pheGJQcm9qZWN0TWFuYWdlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL01hcHBpbmdLZXlzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9NYXBwaW5nS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJjNzEyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL01hcHBpbmdLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7Ci0KLS8qKgotICogSWRlbnRpZmllcnMgZm9yIEpBWEIgY2xhc3MvYXR0cmlidXRlIG1hcHBpbmcgdHlwZXMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0tleXMgewotCi0JU3RyaW5nIFhNTF9BTllfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtYW55LWF0dHJpYnV0ZSI7Ci0JU3RyaW5nIFhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLWFueS1lbGVtZW50IjsKLQlTdHJpbmcgWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLWF0dHJpYnV0ZSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtZWxlbWVudCI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UU19BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAieG1sLWVsZW1lbnRzIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtZWxlbWVudC1yZWYiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZTX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtZWxlbWVudC1yZWZzIjsKLQlTdHJpbmcgWE1MX01JWEVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtbWl4ZWQiOwotCVN0cmluZyBYTUxfVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtdHJhbnNpZW50IjsKLQlTdHJpbmcgWE1MX1ZBTFVFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtdmFsdWUiOwotCQotCS8qKiBtYXBwaW5nIGtleSBmb3IgYXR0cmlidXRlIG1hcHBpbmdzIHRoYXQgYXJlIHVucmVjb2duaXplZCAqLwotCVN0cmluZyBOVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9IG51bGw7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9TY2hlbWFFbnRyeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvU2NoZW1hRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyNjg2Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9TY2hlbWFFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2NoZW1hOwotCi0vKioKLSAqIFNjaGVtYSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3Ige0BsaW5rIFNjaGVtYUxpYnJhcnl9Ci0gKiAKLSAqIEBub2ltcGxlbWVudAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKiAgCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTY2hlbWFFbnRyeSB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsb2NhdGlvbiBrZXkgb2YgdGhlIGVudHJ5LgotCSAqIFRoaXMgY291bGQgYmU6Ci0JICogIC0gYSB3ZWIgbG9jYXRpb24gKHRoYXQgdGhlbiByZWRpcmVjdHMgdG8gYSBwbHVnaW4gcmVzb3VyY2UgbG9jYXRpb24pCi0JICogIC0gYSB3b3Jrc3BhY2UgbG9jYXRpb24KLQkgKiAgLSBhIG5hbWVzcGFjZQotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXNwYWNlIG9mIHRoZSBzY2hlbWEgCi0JICovCi0JU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzY2hlbWEgcmVmZXJyZWQgdG8gYnkgdGhlIGVudHJ5IGlzIGxvYWRlZAotCSAqLwotCWJvb2xlYW4gaXNMb2FkZWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBYc2RTY2hlbWF9IGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50cnkuCi0JICogVGhlIHByb3ZpZGVkIG5hbWVzcGFjZSBpcyBhIGxhc3QgZmFpbHNhZmUgY2hlY2sgdGhhdCB0aGUgbG9hZGVkIHNjaGVtYSBkb2VzIGluIGZhY3QKLQkgKiBoYXZlIHRoZSBuYW1lc3BhY2UgaW4gcXVlc3Rpb24uCi0JICogKFNvbWV0aW1lcyBvbiBhIHJlZnJlc2ggdGhlIHNjaGVtYSB3aWxsIHR1cm4gb3V0IHRvIGhhdmUgYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gZXhwZWN0ZWQpCi0JICovCi0JWHNkU2NoZW1hIGdldFhzZFNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKTsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIHRoZSBhc3NvY2lhdGVkIHNjaGVtYQotCSAqLwotCXZvaWQgcmVmcmVzaCgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvU2NoZW1hTGlicmFyeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvU2NoZW1hTGlicmFyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmFiMGMxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL1NjaGVtYUxpYnJhcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLQotLyoqCi0gKiBFbnRyeSBwb2ludCBmb3IgYWNjZXNzaW5nIHByb2plY3Qgc2NoZW1hIHJlc291cmNlcwotICogCi0gKiBAbm9pbXBsZW1lbnQKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMAotICogIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hTGlicmFyeSB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgcHJvamVjdCBzZXR0aW5ncyBmb3IgdmFsaWRhdGlvbiBwdXJwb3NlcwotCSAqLwotCXB1YmxpYyBMaXN0PFNjaGVtYUVudHJ5PiBnZXRTY2hlbWFFbnRyaWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBsb2NhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzY2hlbWEgZW50cmllcwotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U2NoZW1hTG9jYXRpb25zKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzY2hlbWEgbG9jYXRpb25zCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hTG9jYXRpb25zKExpc3Q8U3RyaW5nPiBzY2hlbWFMb2NhdGlvbnMpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgWHNkU2NoZW1hIGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIG5hbWVzcGFjZSwgaWYgaXQgZXhpc3RzIGFuZCBpcyByZXNvbHZhYmxlLgotCSAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBzY2hlbWFzIHdpdGggdGhlIGdpdmVuIG5hbWVzcGFjZSwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgZm91bmQuCi0JICogUmV0dXJuIG51bGwgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBYc2RTY2hlbWEgZ2V0U2NoZW1hKFN0cmluZyBuYW1lc3BhY2UpOwotCQotCS8qKgotCSAqIFJlZnJlc2ggdGhlIHNjaGVtYSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UsIGlmIGl0IGV4aXN0cyBhbmQgaXMgcmVzb2x2YWJsZS4KLQkgKiBSZWZyZXNoIHRoZSBmaXJzdCBvbmUgZm91bmQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIHNjaGVtYXMgZm9yIHRoZSBuYW1lc3BhY2UuCi0JICogRG8gbm90aGluZyBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFNjaGVtYShTdHJpbmcgbmFtZXNwYWNlKTsKLQkKLQkvKioKLQkgKiBSZWZyZXNoIGFsbCBzY2hlbWFzIHdpdGhpbiB0aGUgbGlicmFyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsU2NoZW1hcygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9BY2Nlc3Nvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9BY2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWE4NGRiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvQWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIGFjY2Vzc29yIChmaWVsZC9wcm9wZXJ0eSkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBBY2Nlc3NvcgotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0KLQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQlib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpOwotCi0JYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgbmFtZSBvZiB0aGUgamF2YSBhdHRyaWJ1dGUsIG9yIHRoZSBpdGVtIHR5cGUgbmFtZSBvZiBhIGNvbGxlY3Rpb24gb3IgYXJyYXkuCi0JICovCi0JU3RyaW5nIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpOwotCQotCS8qKgotCSAqIChTZWUgSkFYQiAyLjIgU3BlYywgc2VjdC4gNS41LjIpCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIGphdmEgYXR0cmlidXRlIHR5cGUgaXMgYW4gZXh0ZW5zaW9uIG9mIGphdmEudXRpbC5Db2xsZWN0aW9uIG9yIGEgc2luZ2xlIAotCSAqIGRpbWVuc2lvbmFsIGFycmF5IChleGNlcHQgZm9yIGJ5dGVbXSwgd2hpY2ggaXMgdHJlYXRlZCBsaWtlIGEgbm9uLWFycmF5KQotCSAqLwotCWJvb2xlYW4gaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBqYXZhIHJlc291cmNlIGF0dHJpYnV0ZSB0eXBlIGlzIGEgc3VidHlwZSBvZiB0aGUgZ2l2ZW4gdHlwZQotCSAqIFRoaXMgbWlnaHQgbm90IHJldHVybiB0aGUgc2FtZSB0aGluZyBhcyBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS50eXBlSXNTdWJUeXBlT2YoU3RyaW5nKS4KLQkgKi8KLQlib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlVHlwZVN1YlR5cGVPZihTdHJpbmcgdHlwZU5hbWUpOwotCi0KLQkvLyoqKioqKioqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKioqKioqKioKLQotCWZpbmFsIGNsYXNzIEFjY2Vzc29yVG9vbHMgewotCQkKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQllURV9BUlJBWV9DTEFTU19OQU1FID0gImJ5dGVbXSI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fQ0xBU1NfTkFNRSA9IENvbGxlY3Rpb24uY2xhc3MuZ2V0TmFtZSgpOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQkpFQ1RfQ0xBU1NfTkFNRSA9IE9iamVjdC5jbGFzcy5nZXROYW1lKCk7Ci0JCQotCQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlVHlwZU5hbWUoSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJaWYgKGF0dHJpYnV0ZS50eXBlSXNBcnJheSgpKSB7Ci0JCQkJaWYgKEJZVEVfQVJSQVlfQ0xBU1NfTkFNRS5lcXVhbHMoYXR0cmlidXRlLmdldFR5cGVOYW1lKCkpKSB7Ci0JCQkJCXJldHVybiBCWVRFX0FSUkFZX0NMQVNTX05BTUU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGF0dHJpYnV0ZS5nZXRUeXBlQXJyYXlEaW1lbnNpb25hbGl0eSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHJpYnV0ZS50eXBlSXNTdWJUeXBlT2YoQ09MTEVDVElPTl9DTEFTU19OQU1FKSkgewotCQkJCWlmIChhdHRyaWJ1dGUuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpID09IDEpIHsKLQkJCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZSgwKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIE9CSkVDVF9DTEFTU19OQU1FOwotCQkJfQotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXRUeXBlTmFtZSgpOwotCQl9Ci0JCQotCQkvKioKLQkJICogQHNlZSBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSNpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbGxlY3Rpb25UeXBlKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCWlmIChhdHRyaWJ1dGUudHlwZUlzQXJyYXkoKSkgewotCQkJCWlmIChhdHRyaWJ1dGUuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSA9PSAxCi0JCQkJCQkmJiAhIEJZVEVfQVJSQVlfQ0xBU1NfTkFNRS5lcXVhbHMoYXR0cmlidXRlLmdldFR5cGVOYW1lKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGUudHlwZUlzU3ViVHlwZU9mKENPTExFQ1RJT05fQ0xBU1NfTkFNRSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWU4MzQwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgYXR0cmlidXRlIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiQXR0cmlidXRlTWFwcGluZwotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JU3RyaW5nIGdldEtleSgpOwotCQotCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkKLQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCi0JSmF4YkNsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoKTsKLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0ICoqKioqCi0JCi0JU3RyaW5nIERFRkFVTFRfUFJPUEVSVFkgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFwcGluZyBpcyBpdHMgYXR0cmlidXRlJ3MgPGVtPmRlZmF1bHQ8L2VtPiBtYXBwaW5nCi0JICogKGFzIG9wcG9zZWQgdG8gaXRzIDxlbT5zcGVjaWZpZWQ8L2VtPiBtYXBwaW5nKS4KLQkgKi8KLQlib29sZWFuIGlzRGVmYXVsdCgpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIChmdWxseSBxdWFsaWZpZWQpIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZQotCSAqIChvciB0aGUgaXRlbSB0eXBlIGlmIGluIGEgY29sbGVjdGlvbi9hcnJheSkKLQkgKi8KLQlTdHJpbmcgZ2V0Qm91bmRUeXBlTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgKGZ1bGx5IHF1YWxpZmllZCkgdHlwZSB1c2VkIHRvIG1hcCB0aGUgYm91bmQgdHlwZS4gCi0JICogKFVzdWFsbHkgdGhlIHNhbWUgYXMgdGhlIHZhbHVlIHR5cGUsIGV4Y2VwdCB3aGVuIGFuIFhtbEphdmFUeXBlQWRhcHRlciBpcyB1c2VkLikKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVUeXBlTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgKGZ1bGx5IHF1YWxpZmllZCkgdHlwZSBvZiB0aGUgZGF0YSBhY3R1YWxseSB3cml0dGVuIHRvIHhtbC4KLQkgKiAoVXN1YWxseSB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgdHlwZSwgZXhjZXB0IHdoZW4gYW4gWG1sSURSRUYgaXMgdXNlZC4pCi0JICovCi0JU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hIHR5cGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB2YWx1ZSB0eXBlLiAgTWF5IGJlIG51bGwuCi0JICovCi0JWHNkVHlwZURlZmluaXRpb24gZ2V0RGF0YVR5cGVYc2RUeXBlRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiBhbGwgZGlyZWN0bHkgcmVmZXJlbmNlZCB0eXBlcywgZnVsbHkgcXVhbGlmaWVkLgotCSAqIChVc2VkIGZvciBjb25zdHJ1Y3RpbmcgSmF4YiBjb250ZXh0KQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgbWFwcGVkIHRvIGEgcGFydGljbGUKLQkgKiAoZS5nLiBYbWxFbGVtZW50LCBYbWxFbGVtZW50cywgWG1sRWxlbWVudFJlZiwgWG1sRWxlbWVudFJlZnMpCi0JICovCi0JYm9vbGVhbiBpc1BhcnRpY2xlTWFwcGluZygpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUgaXMgc3BlY2lmaWNhbGx5IGV4Y2x1ZGVkIGZyb20gYmVpbmcgbWFwcGVkCi0JICogKGUuZy4gWG1sVHJhbnNpZW50KQotCSAqLwotCWJvb2xlYW4gaXNUcmFuc2llbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkF0dHJpYnV0ZXNDb250YWluZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkF0dHJpYnV0ZXNDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5ZTc1Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJBdHRyaWJ1dGVzQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0vKioKLSAqIEhvbGRzIHRoZSBhdHRyaWJ1dGVzIHJlcHJlc2VudGVkIGJ5IGEgcGFydGljdWxhciBKYXZhUmVzb3VyY2VUeXBlIGFuZCBYbWxBY2Nlc3NUeXBlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkF0dHJpYnV0ZXNDb250YWluZXIKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBKYXhiQXRyaWJ1dGVzQ29udGFpbmVyIGNvbnRhaW5zIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBKYXZhUmVzb3VyY2VUeXBlLgotCSAqLwotCWJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlVHlwZSBqYXZhUmVzb3VyY2VUeXBlKTsKLQotCi0JLyoqKioqKioqKiogYXR0cmlidXRlcyAqKioqKioqKioqLwotCi0JSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKTsKLQkKLQlpbnQgZ2V0QXR0cmlidXRlc1NpemUoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkNsYXNzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTg1YmYzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIDxpPmNsYXNzPC9pPiBpbiBhIEpBWEIgY29udGV4dC4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJDbGFzcwotCQlleHRlbmRzIEpheGJUeXBlIHsKLQkKLQkvLyAqKioqKiBvdmVycmlkZXMgKioqKioKLQkKLQlKYXZhUmVzb3VyY2VUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkKLQlwdWJsaWMgSmF4YkNsYXNzTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sUmVnaXN0cnkgKioqKioKLQkKLQlTdHJpbmcgWE1MX1JFR0lTVFJZX1BST1BFUlRZID0gInhtbFJlZ2lzdHJ5IjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxSZWdpc3RyeSBnZXRYbWxSZWdpc3RyeSgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ2xhc3NNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDbGFzc01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMyODZhOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDbGFzc01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkNsYXNzTWFwcGluZwotCQlleHRlbmRzIEpheGJUeXBlTWFwcGluZywgWG1sQWNjZXNzVHlwZUhvbGRlciwgWG1sQWNjZXNzT3JkZXJIb2xkZXIgewotCQotCS8vICoqKioqIG92ZXJyaWRlcyAqKioqKgotCQotCUpheGJDbGFzcyBnZXRKYXhiVHlwZSgpOwotCQotCQotCS8vICoqKioqIFhtbFR5cGUuZmFjdG9yeUNsYXNzICoqKioqCi0JCi0JU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpOwotCQotCVN0cmluZyBTUEVDSUZJRURfRkFDVE9SWV9DTEFTU19QUk9QRVJUWSA9ICJzcGVjaWZpZWRGYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogZmFjdG9yeSBjbGFzcyBjb3JyZXNwb25kcyB0byB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uIGZhY3RvcnlDbGFzcyBlbGVtZW50Ci0JICovCi0JU3RyaW5nIGdldFNwZWNpZmllZEZhY3RvcnlDbGFzcygpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkRmFjdG9yeUNsYXNzKFN0cmluZyBmYWN0b3J5Q2xhc3MpOwotCQotCQotCS8vICoqKioqIFhtbFR5cGUuZmFjdG9yeU1ldGhvZCAqKioqKgotCQotCVN0cmluZyBGQUNUT1JZX01FVEhPRF9QUk9QRVJUWSA9ICJmYWN0b3J5TWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIGZhY3RvcnkgbWV0aG9kIGNvcnJlc3BvbmRzIHRvIHRoZSBYbWxUeXBlIGFubm90YXRpb24gZmFjdG9yeU1ldGhvZCBlbGVtZW50Ci0JICovCi0JU3RyaW5nIGdldEZhY3RvcnlNZXRob2QoKTsKLQkKLQl2b2lkIHNldEZhY3RvcnlNZXRob2QoU3RyaW5nIGZhY3RvcnlNZXRob2QpOwotCQotCQotCS8vICoqKioqIFhtbFR5cGUucHJvcE9yZGVyICoqKioqCi0JCi0JU3RyaW5nIFBST1BfT1JERVJfTElTVCA9ICJwcm9wT3JkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogcHJvcE9yZGVyIGNvcnJlc3BvbmRzIHRvIHRoZSBYbWxUeXBlIGFubm90YXRpb24gcHJvcE9yZGVyIGVsZW1lbnQKLQkgKi8KLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRQcm9wT3JkZXIoKTsKLQkKLQlTdHJpbmcgZ2V0UHJvcChpbnQgaW5kZXgpOwotCQotCWludCBnZXRQcm9wT3JkZXJTaXplKCk7Ci0JCi0Jdm9pZCBhZGRQcm9wKGludCBpbmRleCwgU3RyaW5nIHByb3ApOwotCQotCXZvaWQgcmVtb3ZlUHJvcChpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlUHJvcChTdHJpbmcgcHJvcCk7Ci0JCi0Jdm9pZCBtb3ZlUHJvcChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JCi0JLy8gKioqKiogc3VwZXJjbGFzcyAqKioqKgotCQotCVN0cmluZyBTVVBFUkNMQVNTX1BST1BFUlRZID0gInN1cGVyY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JSmF4YkNsYXNzTWFwcGluZyBnZXRTdXBlcmNsYXNzKCk7Ci0JCi0JCi0JLy8gKioqKiogYXR0cmlidXRlcyAqKioqKgotCQotCVN0cmluZyBBVFRSSUJVVEVTX0NPTExFQ1RJT04gPSAiYXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpOwotCQotCWludCBnZXRBdHRyaWJ1dGVzU2l6ZSgpOwotCQotCQotCS8vICoqKioqIGluY2x1ZGVkIGF0dHJpYnV0ZXMgKioqKioKLQkKLQlTdHJpbmcgSU5DTFVERURfQVRUUklCVVRFU19DT0xMRUNUSU9OID0gImluY2x1ZGVkQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiA8aT5JbmNsdWRlZDwvaT4gYXR0cmlidXRlcyBjb21lIGZyb20gYW55IGRpcmVjdCBzdXBlcmNsYXNzZXMgdGhhdCBhcmUgbWFwcGVkIGFzIEBYbWxUcmFuc2llbnQuCi0JICogKEFzIG9wcG9zZWQgdG8gPGk+aW5oZXJpdGVkPC9pPiBhdHRyaWJ1dGVzLCB3aGljaCBhIGNsYXNzIGhhcyBieSB3YXkgb2YgPGk+YW55PC9pPiBtYXBwZWQgc3VwZXJjbGFzc2VzLikKLQkgKiBJZiB0aGVyZSBpcyBhbiBpbnRlcnZlbmluZyBjbGFzcyB0aGF0IGlzIG5vdCB0cmFuc2llbnQsIHRoZW4gdGhhdCBjbGFzcyB3aWxsIGhvbGQgYW55Ci0JICogaW5jbHVkZWQgYXR0cmlidXRlcyBmcm9tIGFueSBkaXJlY3Qgc3VwZXJjbGFzcyB0aGF0IGFyZSBtYXBwZWQgYXMgQFhtbFRyYW5zaWVudC4KLQkgKiBAc2VlIEpheGJDbGFzc01hcHBpbmcjZ2V0U3VwZXJjbGFzcygpCi0JICovCi0JSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEluY2x1ZGVkQXR0cmlidXRlcygpOwotCQotCWludCBnZXRJbmNsdWRlZEF0dHJpYnV0ZXNTaXplKCk7Ci0JCi0JCi0JLy8gKioqKiogIG1pc2MgYXR0cmlidXRlcyAqKioqKgotCQotCS8qKgotCSAqIFJldHVybiBhbGwgYXR0cmlidXRlcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MuICAKLQkgKiBUaGlzIGlzIHRoZSBjb21iaW5lZCBzZXQgb2YgI2dldEF0dHJpYnV0ZXMoKSBhbmQgI2dldEluY2x1ZGVkQXR0cmlidXRlcygpCi0JICovCi0JSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEFsbExvY2FsbHlEZWZpbmVkQXR0cmlidXRlcygpOwotCQotCS8qKgotCSAqIDxpPkluaGVyaXRlZDwvaT4gYXR0cmlidXRlcyBhcmUgYW55IGF0dHJpYnV0ZXMgdGhpcyBjbGFzcyBtYXBwaW5nIGhhcyB3aG9zZSBzb3VyY2UKLQkgKiBpcyBhIHN1cGVyY2xhc3MuCi0JICogSW5oZXJpdGVkIGF0dHJpYnV0ZXMgaW5jbHVkZSA8aT5pbmNsdWRlZDwvaT4gYXR0cmlidXRlcy4KLQkgKi8KLQlJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0SW5oZXJpdGVkQXR0cmlidXRlcygpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGlkIGF0dHJpYnV0ZSBtYXBwaW5nIGZvciB0aGlzIGNsYXNzIG1hcHBpbmcsIGlmIGl0IGhhcyBvbmUuCi0JICogKFdpbGwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgaXQgZmluZHMsIGlmIHRoaXMgY2xhc3MgaGFzIG1vcmUgdGhhbiBvbmUuKQotCSAqLwotCUpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldFhtbElkTWFwcGluZygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ29udGV4dE5vZGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkNvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MThmMDIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJOb2RlOwotCi0vKioKLSAqIENvbW1vbiBwcm90b2NvbCBmb3IgSkFYQiBvYmplY3RzIHRoYXQgaGF2ZSBhIGNvbnRleHQsIGFzIG9wcG9zZWQgdG8KLSAqIHJlc291cmNlIG9iamVjdHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiQ29udGV4dE5vZGUKLQkJZXh0ZW5kcyBKYXhiTm9kZSB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByb290IG9mIHRoZSBjb250ZXh0IG1vZGVsCi0JICovCi0JSmF4YkNvbnRleHRSb290IGdldENvbnRleHRSb290KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSB0eXBlIG9mIHRoZSBjb250ZXh0IG5vZGUncyByZXNvdXJjZS4KLQkgKi8KLQlKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCk7Ci0KLQotCS8vICoqKioqKioqKiogdXBkYXRpbmcgKioqKioqKioqKgotCi0Jdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIGNvbnRleHQgbW9kZWwgd2l0aCB0aGUgY29udGVudCBvZiB0aGUgSkFYQiByZXNvdXJjZSBtb2RlbC4KLQkgKi8KLQl2b2lkIHVwZGF0ZSgpOwotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDb250ZXh0Um9vdC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiQ29udGV4dFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIwM2EwMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJDb250ZXh0Um9vdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBSb290IG9mIHRoZSBKQVhCIGNvbnRleHQgbW9kZWwuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiQ29udGV4dFJvb3QKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCQotCS8vICoqKioqIHBhY2thZ2VzICoqKioqCi0JCi0Jc3RhdGljIFN0cmluZyBQQUNLQUdFU19DT0xMRUNUSU9OID0gInBhY2thZ2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBzZXQgb2YgcGFja2FnZXMuICBJbmNsdWRlcyBhbnkgcGFja2FnZSB3aXRoIGFueSBpbnRlcmVzdGluZyBKQVhCIGNvbnRlbnQuCi0JICovCi0JSXRlcmFibGU8SmF4YlBhY2thZ2U+IGdldFBhY2thZ2VzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUKLQkgKi8KLQlKYXhiUGFja2FnZSBnZXRQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSk7Ci0JCi0JaW50IGdldFBhY2thZ2VzU2l6ZSgpOwotCQotCQotCS8vICoqKioqIGpheGIgdHlwZXMgKioqKioKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFU19DT0xMRUNUSU9OID0gInR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2V0IG9mIGFsbCBKQVhCIHR5cGVzIHdpdGhpbiB0aGlzIGNvbnRleHQgcm9vdC4KLQkgKi8KLQlJdGVyYWJsZTxKYXhiVHlwZT4gZ2V0VHlwZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gKGZ1bGx5IHF1YWxpZmllZCkgdHlwZSBuYW1lCi0JICovCi0JSmF4YlR5cGUgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCQotCWludCBnZXRUeXBlc1NpemUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiB0eXBlcyB0aGF0IGFyZSBpbiB0aGUgZ2l2ZW4gcGFja2FnZQotCSAqLwotCUl0ZXJhYmxlPEpheGJUeXBlPiBnZXRUeXBlcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSk7Ci0JCi0JLyoqCi0JICogVGhlIHNldCBvZiBqYXhiIGNsYXNzZXMuICBUaGVzZSBtYXkgYmUgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5IGluY2x1ZGVkLgotCSAqLwotCUl0ZXJhYmxlPEpheGJDbGFzcz4gZ2V0Q2xhc3NlcygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2V0IG9mIGpheGIgY2xhc3NlcyB0aGF0IGFyZSBpbiB0aGUgZ2l2ZW4gcGFja2FnZQotCSAqLwotCUl0ZXJhYmxlPEpheGJDbGFzcz4gZ2V0Q2xhc3NlcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSk7Ci0JCi0JLyoqCi0JICogVGhlIHNldCBvZiBqYXhiIGVudW1zLiAgVGhlc2UgbWF5IGJlIGV4cGxpY2l0bHkgb3IgaW1wbGljaXRseSBpbmNsdWRlZC4KLQkgKi8KLQlJdGVyYWJsZTxKYXhiRW51bT4gZ2V0RW51bXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiBqYXhiIGVudW1zIHRoYXQgYXJlIGluIHRoZSBnaXZlbiBwYWNrYWdlCi0JICovCi0JSXRlcmFibGU8SmF4YkVudW0+IGdldEVudW1zKEpheGJQYWNrYWdlIGpheGJQYWNrYWdlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNldCBvZiB7QGxpbmsgWG1sUmVnaXN0cnl9KGllKXMgdGhhdCBhcmUgaW4gdGhlIGdpdmVuIHBhY2thZ2UKLQkgKi8KLQlJdGVyYWJsZTxYbWxSZWdpc3RyeT4gZ2V0WG1sUmVnaXN0cmllcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSmF4YlR5cGVNYXBwaW5nfSBmb3IgdGhlIGdpdmVuIChmdWxseSBxdWFsaWZpZWQpIHR5cGUgbmFtZQotCSAqLwotCUpheGJUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZyhTdHJpbmcgdHlwZU5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEpheGJDbGFzc01hcHBpbmd9IGZvciB0aGUgZ2l2ZW4gKGZ1bGx5IHF1YWxpZmllZCkgdHlwZSBuYW1lCi0JICovCi0JSmF4YkNsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoU3RyaW5nIHR5cGVOYW1lKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JCi0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCS8qKgotCSAqIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbGVtZW50RmFjdG9yeU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjM5MDdjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgZWxlbWVudCBmYWN0b3J5IG1ldGhvZCAgCi0gKiAoQSBtZXRob2QgaW5zaWRlIGFuIG9iamVjdCBmYWN0b3J5IChAWG1sUmVnaXN0cnkpIHdpdGggYW4gZXhwbGljaXQgQFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCUphdmFSZXNvdXJjZU1ldGhvZCBnZXRSZXNvdXJjZU1ldGhvZCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0aG9kIG5hbWUKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCQotCS8vICoqKioqIHNjb3BlICoqKioqCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24gJ3Njb3BlJyBlbGVtZW50Ci0JICovCi0JU3RyaW5nIFNDT1BFX1BST1BFUlRZID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRTY29wZSgpOwotCQotCXZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9TQ09QRV9DTEFTU19OQU1FID0gImphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wuR0xPQkFMIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFNjb3BlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHNjb3BlIGlzIGRlZmF1bHQgb3IgaXMgc3BlY2lmaWVkIHRvIGJlIFhtbEVsZW1lbnREZWNsLkdMT0JBTC4KLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsU2NvcGUoKTsKLQkKLQkKLQkvLyAqKioqKiBxTmFtZSAqKioqKgotCQotCUpheGJRTmFtZSBnZXRRTmFtZSgpOwotCQotCQotCS8vICoqKioqIHN1YnN0aXR1dGlvbiBoZWFkIHFOYW1lICoqKioqCi0JCi0JSmF4YlFOYW1lIGdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpOwotCQotCQotCS8vICoqKioqIGRlZmF1bHQgdmFsdWUgKioqKioKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbiAnZGVmYXVsdFZhbHVlJyBlbGVtZW50Ci0JICovCi0JU3RyaW5nIERFRkFVTFRfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLQkKLQl2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgZGVmYXVsdFZhbHVlKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9ERUZBVUxUX1ZBTFVFID0gIlx1MDAwMCI7IC8vJE5PTi1OTFMtMSQJCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbnVtLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOThhNjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiRW51bS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gPGk+ZW51bTwvaT4gaW4gYSBKQVhCIGNvbnRleHQuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiRW51bQotCQlleHRlbmRzIEpheGJUeXBlIHsKLQkKLQkvLyAqKioqKiBjb3ZhcmlhbnQgb3ZlcnJpZGVzICoqKioqCi0JCi0JSmF2YVJlc291cmNlRW51bSBnZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCi0JcHVibGljIEpheGJFbnVtTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJFbnVtQ29uc3RhbnQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVudW1Db25zdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ0MzlmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVudW1Db25zdGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIGVudW0gY29uc3RhbnQuICAKLSAqIChBIGNvbnN0YW50IGluc2lkZSBhbiBlbnVtIHdpdGggZWl0aGVyIGFuIGV4cGxpY2l0IG9yIGltcGxpY2l0IEBYbWxFbnVtVmFsdWUgYW5ub3RhdGlvbikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJFbnVtQ29uc3RhbnQKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCi0JSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGdldFJlc291cmNlRW51bUNvbnN0YW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQuIFRoaXMgd2lsbCBub3QgY2hhbmdlLCBhCi0JICogbmV3IEpheGJFbnVtQ29uc3RhbnQgd2lsbCBiZSBidWlsdCBpZiB0aGUgbmFtZSBjaGFuZ2VzLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW51bSBjb25zdGFudCdzIHZhbHVlLCB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB0aGUgbmFtZSBvZiB0aGUgZW51bSBjb25zdGFudC4KLQkgKiBJdCB3aWxsIGJlIHVzZWQgaWYgdGhlIFhtbEVudW1WYWx1ZSBhbm5vdGF0aW9uIGlzIG51bGwuCi0JICogQHNlZSBnZXROYW1lKCkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIFhtbEVudW1WYWx1ZSBhbm5vdGF0aW9uICd2YWx1ZScgZWxlbWVudAotCSAqLwotCVN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9WQUxVRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiRW51bU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YkVudW1NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkM2IxZGIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiRW51bU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBtYXBwaW5nIG1ldGFkYXRhIG9uIGFuIGVudW0gKHNwZWNpZmllZCBvciBpbXBsaWVkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJFbnVtTWFwcGluZwotCQlleHRlbmRzIEpheGJUeXBlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sRW51bS52YWx1ZSAqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBzcGVjaWZpZWQgZm9yIHRoZSBYbWxFbnVtLnZhbHVlLCBvciAiamF2YS5sYW5nLlN0cmluZyIgaWYgdW5zcGVjaWZpZWQKLQkgKi8KLQlTdHJpbmcgZ2V0WG1sRW51bVZhbHVlKCk7Ci0JCi0JU3RyaW5nIFNQRUNJRklFRF9YTUxfRU5VTV9WQUxVRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRYbWxFbnVtIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIFhtbEVudW0udmFsdWUgZWxlbWVudAotCSAqLwotCVN0cmluZyBnZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZFhtbEVudW1WYWx1ZShTdHJpbmcgeG1sRW51bVZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBYbWxFbnVtLnZhbHVlIGVsZW1lbnQsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gaW1wb3J0cwotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFhtbEVudW1WYWx1ZSgpOwotCQotCVN0cmluZyBERUZBVUxUX1hNTF9FTlVNX1ZBTFVFID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8gKioqKiogZW51bSBjb25zdGFudHMgKioqKioKLQkKLQlTdHJpbmcgRU5VTV9DT05TVEFOVFNfQ09MTEVDVElPTiA9ICJlbnVtQ29uc3RhbnRzIjsgLy8kTk9OLU5MUy0xJAotCQotCUl0ZXJhYmxlPEpheGJFbnVtQ29uc3RhbnQ+IGdldEVudW1Db25zdGFudHMoKTsKLQkKLQlpbnQgZ2V0RW51bUNvbnN0YW50c1NpemUoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JWHNkU2ltcGxlVHlwZURlZmluaXRpb24gZ2V0VmFsdWVYc2RUeXBlRGVmaW5pdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiUGFja2FnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzljYmU4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGFja2FnZQotCQlleHRlbmRzIEpheGJDb250ZXh0Tm9kZSB7Ci0JCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiBUaGlzIGlzIHVuY2hhbmdpbmcgaW4gdGhhdCwgaWYgYSBwYWNrYWdlIG5hbWUgY2hhbmdlcywgYSBuZXcgSmF4YlBhY2thZ2UgaXMgY3JlYXRlZC4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQotCS8qKgotCSAqIFRoZSBvcHRpb25hbCBwYWNrYWdlLWluZm8KLQkgKi8KLQlKYXhiUGFja2FnZUluZm8gZ2V0UGFja2FnZUluZm8oKTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQQUNLQUdFX0lORk9fUFJPUEVSVFkgPSAicGFja2FnZS1pbmZvIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHBhY2thZ2UsIGRlZmF1bHQgb3Igc3BlY2lmaWVkCi0JICovCi0JU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIGZvcm0gZGVmYXVsdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlCi0JICovCi0JWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbGVtZW50IGZvcm0gZGVmYXVsdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlCi0JICovCi0JWG1sTnNGb3JtIGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgcGFja2FnZSBoYXMgbm8gdXNlZnVsIGluZm9ybWF0aW9uLgotCSAqIFVzZWZ1bCBpbmZvcm1hdGlvbiBpbmNsdWRlczoKLQkgKiAJLSBhbm5vdGF0ZWQgcGFja2FnZS1pbmZvLmphdmEKLQkgKiAgLSBqYXhiLmluZGV4Ci0JICogIC0gb2JqZWN0IGZhY3RvcnkKLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBYbWxSZWdpc3RyeX0gZm9yIHRoaXMgcGFja2FnZSBpZiB0aGVyZSBpcyBvbmUuCi0JICogUmV0dXJuICpvbmUqIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lICh3aGljaCBpcyBhbiBlcnJvciBjYXNlIGF0IGFueSByYXRlKQotCSAqLwotCVhtbFJlZ2lzdHJ5IGdldFJlZ2lzdHJ5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgWHNkU2NoZW1hfSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwYWNrYWdlLCBpZiB0aGVyZSBpcyBvbmUsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JWHNkU2NoZW1hIGdldFhzZFNjaGVtYSgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIEFkZCB2YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlBhY2thZ2VJbmZvLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQYWNrYWdlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTNlMDE2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlBhY2thZ2VJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGFja2FnZUluZm8KLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUsIFhtbEFjY2Vzc1R5cGVIb2xkZXIsIFhtbEFjY2Vzc09yZGVySG9sZGVyIHsKLQkKLQlKYXZhUmVzb3VyY2VQYWNrYWdlIGdldFJlc291cmNlUGFja2FnZSgpOwotCQotCUpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sU2NoZW1hICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBYTUwgc2NoZW1hIGZvciB0aGlzIHBhY2thZ2UgaW5mbywgdGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCVhtbFNjaGVtYSBnZXRYbWxTY2hlbWEoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxTY2hlbWFUeXBlcyAqKioqKgotCQotCVN0cmluZyBYTUxfU0NIRU1BX1RZUEVTX0xJU1QgPSAieG1sU2NoZW1hVHlwZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JTGlzdEl0ZXJhYmxlPFhtbFNjaGVtYVR5cGU+IGdldFhtbFNjaGVtYVR5cGVzKCk7Ci0JCi0JaW50IGdldFhtbFNjaGVtYVR5cGVzU2l6ZSgpOwotCQotCVhtbFNjaGVtYVR5cGUgYWRkWG1sU2NoZW1hVHlwZShpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlWG1sU2NoZW1hVHlwZShpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlWG1sU2NoZW1hVHlwZShYbWxTY2hlbWFUeXBlIHhtbFNjaGVtYVR5cGUpOwotCQotCXZvaWQgbW92ZVhtbFNjaGVtYVR5cGUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQkKLQkKLQkvLyAqKioqKiBYbWxKYXZhVHlwZUFkYXB0ZXJzICoqKioqKgotCQotCVN0cmluZyBYTUxfSkFWQV9UWVBFX0FEQVBURVJTX0xJU1QgPSAieG1sSmF2YVR5cGVBZGFwdGVycyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlMaXN0SXRlcmFibGU8WG1sSmF2YVR5cGVBZGFwdGVyPiBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCi0JaW50IGdldFhtbEphdmFUeXBlQWRhcHRlcnNTaXplKCk7Ci0JCi0JWG1sSmF2YVR5cGVBZGFwdGVyIGFkZFhtbEphdmFUeXBlQWRhcHRlcihpbnQgaW5kZXgpOwotCQotCXZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlcik7Ci0JCi0Jdm9pZCBtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiByZXR1cm4gYW4ge0BsaW5rIFhtbEphdmFUeXBlQWRhcHRlcn0gZm9yIHRoZSBnaXZlbiBib3VuZCB0eXBlIG5hbWUsIGlmIG9uZSBleGlzdHMKLQkgKi8KLQlYbWxKYXZhVHlwZUFkYXB0ZXIgZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKFN0cmluZyBib3VuZFR5cGVOYW1lKTsKLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JLyoqCi0JICogQWRkIHZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdGhlIHNwZWNpZmllZCBsaXN0LgotCSAqLwotCXZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzIxYTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQlKYXhiQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpOwotCQotCQotCS8vICoqKioqIGRlY2xhcmluZyBjbGFzcy8gaW5oZXJpdGFuY2UgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHR5cGUgd2hlcmUgdGhlIHNvdXJjZSBvZiB0aGUgYXR0cmlidXRlIGlzIGRlY2xhcmVkLgotCSAqIFRoaXMgbWF5IG5vdCBiZSB3aGVyZSB0aGUgYXR0cmlidXRlIGlzIGZ1bGx5IGRlZmluZWQsIGFzIGl0IG1heSBiZSBpbmhlcml0ZWQKLQkgKi8KLQlKYXZhUmVzb3VyY2VUeXBlIGdldERlY2xhcmluZ0phdmFSZXNvdXJjZVR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc291cmNlIG9mIHRoZSBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBpbiBhIHN1cGVyY2xhc3MKLQkgKi8KLQlib29sZWFuIGlzSW5oZXJpdGVkKCk7Ci0JCi0JCi0JLy8gKioqKiogbmFtZSAqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSwgYQotCSAqIG5ldyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSB3aWxsIGJlIGJ1aWx0IGlmIHRoZSBuYW1lIGNoYW5nZXMuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiByZXNvdXJjZSBhdHRyaWJ1dGUgKioqKioKLQkKLQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG5hbWUgb2YgdGhlIGphdmEgYXR0cmlidXRlLCBvciB0aGUgaXRlbSB0eXBlIG5hbWUgb2YgYSBjb2xsZWN0aW9uIG9yIGFycmF5LgotCSAqLwotCVN0cmluZyBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKTsKLQkKLQkvKioKLQkgKiAoU2VlIEpBWEIgMi4yIFNwZWMsIHNlY3QuIDUuNS4yKQotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBqYXZhIGF0dHJpYnV0ZSB0eXBlIGlzIGFuIGV4dGVuc2lvbiBvZiBqYXZhLnV0aWwuQ29sbGVjdGlvbiBvciBhIHNpbmdsZSAKLQkgKiBkaW1lbnNpb25hbCBhcnJheSAoZXhjZXB0IGZvciBieXRlW10sIHdoaWNoIGlzIHRyZWF0ZWQgbGlrZSBhIG5vbi1hcnJheSkKLQkgKi8KLQlib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgdHlwZSBpcyBhIHN1YnR5cGUgb2YgdGhlIGdpdmVuIHR5cGUKLQkgKiBUaGlzIG1pZ2h0IG5vdCByZXR1cm4gdGhlIHNhbWUgdGhpbmcgYXMgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkudHlwZUlzU3ViVHlwZU9mKFN0cmluZykuCi0JICovCi0JYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZVR5cGVTdWJUeXBlT2YoU3RyaW5nIHR5cGVOYW1lKTsKLQkKLQlib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpOwotCQotCWJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpOwotCQotCQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nLiBUaGlzIGlzIG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogKGFsdGhvdWdoLCBpdCBtYXkgYmUgYSA8ZW0+bnVsbDwvZW0+IG1hcHBpbmcpLgotCSAqIFNldCB0aGUgbWFwcGluZyB2aWEge0BsaW5rIFBlcnNpc3RlbnRBdHRyaWJ1dGUjc2V0TWFwcGluZ0tleShTdHJpbmcpfS4KLQkgKi8KLQlKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci0JCVN0cmluZyBNQVBQSU5HX1BST1BFUlRZID0gIm1hcHBpbmciOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIGtleS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGluZ0tleSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgYXR0cmlidXRlJ3MgbWFwcGluZy4KLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGtleSBpcyA8Y29kZT5udWxsPC9jb2RlPiwgY2xlYXIgdGhlIHNwZWNpZmllZCBtYXBwaW5nLAotCSAqIGFsbG93aW5nIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIHRvIGRlZmF1bHQgKGlmIGFwcHJvcHJpYXRlKS4KLQkgKiBSZXR1cm4gdGhlIG5ldyBtYXBwaW5nICh3aGljaCBtYXkgYmUgYSA8ZW0+bnVsbDwvZW0+IG1hcHBpbmcpLgotCSAqLwotCUpheGJBdHRyaWJ1dGVNYXBwaW5nIHNldE1hcHBpbmdLZXkoU3RyaW5nIGtleSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBrZXkgZm9yIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IG1hcHBpbmcuCi0JICogVGhpcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gKGUuZy4gZm9yIDxlbT5zcGVjaWZpZWQ8L2VtPgotCSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZXMpLgotCSAqIEBzZWUgSmF4YkF0dHJpYnV0ZU1hcHBpbmcjaXNEZWZhdWx0KCkKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKTsKLQkJU3RyaW5nIERFRkFVTFRfTUFQUElOR19LRVlfUFJPUEVSVFkgPSAiZGVmYXVsdE1hcHBpbmdLZXkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJRTmFtZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiUU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNDE3OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJRTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgbmFtZXNwYWNlLCBuYW1lIHBhaXJpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuPwotICogQHNpbmNlIDMuPyAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUU5hbWUKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCS8vICoqKioqIG5hbWVzcGFjZSAqKioqKgotCQotCXN0YXRpYyBTdHJpbmcgU1BFQ0lGSUVEX05BTUVTUEFDRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldE5hbWVzcGFjZSgpOwotCQotCVN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCk7Ci0JCi0JU3RyaW5nIGdldFNwZWNpZmllZE5hbWVzcGFjZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkTmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCQotCQotCS8vICoqKioqIG5hbWUgKioqKioKLQkKLQlzdGF0aWMgU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCVRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlR5cGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvSmF4YlR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2YmVmOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGphdmEgY2xhc3MgKG9yIGVudW0gb3IgaW50ZXJmYWNlKSB3aXRoIEpBWEIgbWV0YWRhdGEgKHNwZWNpZmllZCBvciBpbXBsaWVkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJUeXBlCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlLCBYbWxBZGFwdGFibGUgewotCQotCS8vICoqKioqIGtpbmQgKioqKioKLQkKLQlLaW5kIGdldEtpbmQoKTsKLQkKLQkKLQkvLyAqKioqKiB0eXBlIG1hcHBpbmcgKioqKioKLQkKLQlmaW5hbCBTdHJpbmcgTUFQUElOR19QUk9QRVJUWSA9ICJtYXBwaW5nIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgb2YgdGhpcyB0eXBlLiAgCi0JICogTWF5IGJlIG51bGwuCi0JICogV2lsbCA8Yj5ub3Q8L2I+IGJlIG51bGwgaWYgdGhpcyB0eXBlIGhhcyBhbiBYbWxUeXBlIGFubm90YXRpb24gKG9yIG90aGVyIG1hcHBpbmcgYW5ub3RhdGlvbikKLQkgKiBvciBpZiB0aGlzIHR5cGUgaXMgZGVmYXVsdCBtYXBwZWQuCi0JICovCi0JSmF4YlR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IG1hcHBlZCAqKioqKgotCQotCWZpbmFsIFN0cmluZyBERUZBVUxUX01BUFBFRF9QUk9QRVJUWSA9ICJkZWZhdWx0TWFwcGVkIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgaXMgbWFwcGVkIGJ5IHJlZmVyZW5jZS4KLQkgKiAoSWYgdGhpcyB0eXBlIGhhcyBhIGRlZmF1bHQgbWFwcGluZyBieSB2aXJ0dWUgb2YgaXQgYmVpbmcgcmVmZXJlbmNlZCBieSBhbm90aGVyIG1hcHBlZCB0eXBlLikKLQkgKi8KLQlib29sZWFuIGlzRGVmYXVsdE1hcHBlZCgpOwotCQotCS8qKgotCSAqIFNldCB0aGlzIHRvIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgdHlwZSBpcyByZWZlcmVuY2VkIGJ5IGFub3RoZXIgbWFwcGVkIHR5cGUuCi0JICogKE5COiAgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHtAbGluayBKYXhiQ29udGV4dFJvb3R9IG9iamVjdC4pCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0TWFwcGVkKGJvb2xlYW4gbmV3VmFsdWUpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYXNzb2NpYXRlZCBqYXZhIHJlc291cmNlIHR5cGUKLQkgKi8KLQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSB3aXRob3V0IGFueSBwYWNrYWdlIG9yIHR5cGUgcXVhbGlmaWVycwotCSAqLwotCVN0cmluZyBnZXRTaW1wbGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHR5cGUsIGluY2x1ZGluZyBxdWFsaWZpY2F0aW9uIGZvciBhbnkgCi0JICogZW5jbG9zaW5nIHR5cGVzLCBidXQgbm90IGluY2x1ZGluZyBwYWNrYWdlIHF1YWxpZmljYXRpb24uCi0JICovCi0JU3RyaW5nIGdldFR5cGVRdWFsaWZpZWROYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyB0eXBlLCBpbmNsdWRpbmcgcXVhbGlmaWNhdGlvbiBmb3IgYW55IAotCSAqIGVuY2xvc2luZyB0eXBlcyBhbmQgcGFja2FnZXMuCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgdHlwZSdzIHBhY2thZ2UuICBFbXB0eSBzdHJpbmcgaWYgbm9uZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBKYXhiUGFja2FnZX0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHlwZQotCSAqIChOQjogIG1heSBiZSBudWxsIGluIHNvbWUgcGFydGlhbGx5IGJ1aWx0IGNhc2VzKQotCSAqLwotCUpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSmF4YlBhY2thZ2VJbmZvfSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlLCBpZiBpdCBleGlzdHMKLQkgKi8KLQlKYXhiUGFja2FnZUluZm8gZ2V0SmF4YlBhY2thZ2VJbmZvKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHR5cGVzLCBmdWxseSBxdWFsaWZpZWQuCi0JICogKFVzZWQgZm9yIGNvbnN0cnVjdGluZyBKYXhiIGNvbnRleHQpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCi0JCi0JLy8gKioqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQkvKioKLQkgKiBBZGQgdG8gdGhlIGxpc3Qgb2YgY3VycmVudCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0Jdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKTsKLQkKLQkKLQlwdWJsaWMgZW51bSBLaW5kIHsKLQkJCi0JCS8qKgotCQkgKiB7QGxpbmsgSmF4YlR5cGV9cyBvZiB7QGxpbmsgS2luZH0gQ0xBU1MgbWF5IHNhZmVseSBiZSBjYXN0IGFzIHtAbGluayBKYXhiQ2xhc3N9Ci0JCSAqLwotCQlDTEFTUywKLQkJCi0JCS8qKgotCQkgKiB7QGxpbmsgSmF4YlR5cGV9cyBvZiB7QGxpbmsgS2luZH0gRU5VTSBtYXkgc2FmZWx5IGJlIGNhc3QgYXMge0BsaW5rIEpheGJFbnVtfQotCQkgKi8KLQkJRU5VTTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJUeXBlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9KYXhiVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhNDExMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L0pheGJUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBtYXBwaW5nIG1ldGFkYXRhIG9uIGEgSmF4YlR5cGUgKHNwZWNpZmllZCBvciBpbXBsaWVkKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJUeXBlTWFwcGluZyAKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCS8vICoqKioqIEpheGJUeXBlICoqKioqCi0JCi0JSmF4YlR5cGUgZ2V0SmF4YlR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxUcmFuc2llbnQgKioqKioKLQkKLQlTdHJpbmcgWE1MX1RSQU5TSUVOVF9QUk9QRVJUWSA9ICJ4bWxUcmFuc2llbnQiOyAgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNYbWxUcmFuc2llbnQoKTsKLQkKLQl2b2lkIHNldFhtbFRyYW5zaWVudChib29sZWFuIG5ld1ZhbHVlKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxUeXBlLm5hbWUgYW5kIFhtbFR5cGUubmFtZXNwYWNlICoqKioqCi0JCi0JSmF4YlFOYW1lIGdldFFOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sUm9vdEVsZW1lbnQgKioqKioKLQkKLQlTdHJpbmcgWE1MX1JPT1RfRUxFTUVOVF9QUk9QRVJUWSA9ICJ4bWxSb290RWxlbWVudCI7ICAvLyROT04tTkxTLTEkCi0JCi0JWG1sUm9vdEVsZW1lbnQgZ2V0WG1sUm9vdEVsZW1lbnQoKTsKLQkKLQlYbWxSb290RWxlbWVudCBhZGRYbWxSb290RWxlbWVudCgpOwotCQotCXZvaWQgcmVtb3ZlWG1sUm9vdEVsZW1lbnQoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxTZWVBbHNvICoqKioqCi0JCi0JU3RyaW5nIFhNTF9TRUVfQUxTT19QUk9QRVJUWSA9ICJ4bWxTZWVBbHNvIjsgIC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxTZWVBbHNvIGdldFhtbFNlZUFsc28oKTsKLQkKLQlYbWxTZWVBbHNvIGFkZFhtbFNlZUFsc28oKTsKLQkKLQl2b2lkIHJlbW92ZVhtbFNlZUFsc28oKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHR5cGVzLCBmdWxseSBxdWFsaWZpZWQuCi0JICogKFVzZWQgZm9yIGNvbnN0cnVjdGluZyBKYXhiIGNvbnRleHQpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCi0JWHNkVHlwZURlZmluaXRpb24gZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNsYXNzIG9yIGEgc3ViY2xhc3MgKGlmIGl0IGNhbiBoYXZlIHN1YmNsYXNzZXMpIGhhcyBhIHJvb3QgZWxlbWVudCBkZWZpbmVkCi0JICovCi0JYm9vbGVhbiBoYXNSb290RWxlbWVudEluSGllcmFyY2h5KCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2E4ODcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBY2Nlc3NPcmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQWNjZXNzIE9yZGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGVudW0gWG1sQWNjZXNzT3JkZXIgewotCi0JQUxQSEFCRVRJQ0FMKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMCi0JCSksCi0JVU5ERUZJTkVEKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVECi0JCSk7Ci0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyIGphdmFBY2Nlc3NPcmRlcjsKLQotCVhtbEFjY2Vzc09yZGVyKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NPcmRlciBqYXZhQWNjZXNzT3JkZXIpIHsKLQkJaWYgKGphdmFBY2Nlc3NPcmRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBY2Nlc3NPcmRlciA9IGphdmFBY2Nlc3NPcmRlcjsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyIGdldEphdmFBY2Nlc3NPcmRlcigpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFjY2Vzc09yZGVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFhtbEFjY2Vzc09yZGVyIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXIgamF2YUFjY2Vzc09yZGVyKSB7Ci0JCXJldHVybiAoamF2YUFjY2Vzc09yZGVyID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUFjY2Vzc09yZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYbWxBY2Nlc3NPcmRlciBmcm9tSmF2YVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NPcmRlciBqYXZhQWNjZXNzT3JkZXIpIHsKLQkJZm9yIChYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlciA6IFhtbEFjY2Vzc09yZGVyLnZhbHVlcygpKSB7Ci0JCQlpZiAoYWNjZXNzT3JkZXIuZ2V0SmF2YUFjY2Vzc09yZGVyKCkgPT0gamF2YUFjY2Vzc09yZGVyKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc09yZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyIHRvSmF2YVJlc291cmNlTW9kZWwoWG1sQWNjZXNzT3JkZXIgYWNjZXNzT3JkZXIpIHsKLQkJcmV0dXJuIChhY2Nlc3NPcmRlciA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NPcmRlci5nZXRKYXZhQWNjZXNzT3JkZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVySG9sZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc09yZGVySG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTVlYWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBY2Nlc3NPcmRlckhvbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWNjZXNzT3JkZXJIb2xkZXIKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzIG9yZGVyLCB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuCi0JICogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuIG51bGwgc2luY2UgYXQgbGVhc3QgdGhlIGRlZmF1bHQgd2lsbCBiZSBzZXQKLQkgKi8KLQlYbWxBY2Nlc3NPcmRlciBnZXRBY2Nlc3NPcmRlcigpOwotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVmYXVsdCBhY2Nlc3Mgb3JkZXIKLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9BQ0NFU1NfT1JERVJfUFJPUEVSVFkgPSAiZGVmYXVsdEFjY2Vzc09yZGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBhY2Nlc3Mgb3JkZXIsIG5ldmVyIG51bGwKLQkgKi8KLQlYbWxBY2Nlc3NPcmRlciBnZXREZWZhdWx0QWNjZXNzT3JkZXIoKTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3Mgb3JkZXIKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX0FDQ0VTU19PUkRFUl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRBY2Nlc3NPcmRlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhY2Nlc3Mgb3JkZXI7Ci0JICovCi0JWG1sQWNjZXNzT3JkZXIgZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBhY2Nlc3Mgb3JkZXIuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihYbWxBY2Nlc3NPcmRlciBuZXdTcGVjaWZpZWRBY2Nlc3NPcmRlcik7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc1R5cGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWNjZXNzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmM4ZmQ2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWNjZXNzVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQWNjZXNzIFR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZW51bSBYbWxBY2Nlc3NUeXBlIHsKLQotCUZJRUxEKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5GSUVMRAotCQkpLAotCU5PTkUoCi0JCW9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlLk5PTkUKLQkJKSwKLQlQUk9QRVJUWSgKLQkJb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkKLQkJKSwKLQlQVUJMSUNfTUVNQkVSKAotCQlvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSCi0JCSk7Ci0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGUgamF2YUFjY2Vzc1R5cGU7Ci0KLQlYbWxBY2Nlc3NUeXBlKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlIGphdmFBY2Nlc3NUeXBlKSB7Ci0JCWlmIChqYXZhQWNjZXNzVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBY2Nlc3NUeXBlID0gamF2YUFjY2Vzc1R5cGU7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlIGdldEphdmFBY2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQWNjZXNzVHlwZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBYbWxBY2Nlc3NUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSkgewotCQlyZXR1cm4gKGphdmFBY2Nlc3NUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUFjY2Vzc1R5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhtbEFjY2Vzc1R5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSkgewotCQlmb3IgKFhtbEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA6IFhtbEFjY2Vzc1R5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChhY2Nlc3NUeXBlLmdldEphdmFBY2Nlc3NUeXBlKCkgPT0gamF2YUFjY2Vzc1R5cGUpIHsKLQkJCQlyZXR1cm4gYWNjZXNzVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoWG1sQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7Ci0JCXJldHVybiAoYWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NUeXBlLmdldEphdmFBY2Nlc3NUeXBlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBY2Nlc3NUeXBlSG9sZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc1R5cGVIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1NjI2NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFjY2Vzc1R5cGVIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFjY2Vzc1R5cGVIb2xkZXIKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzIHR5cGUsIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHRlZC4KLQkgKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4gbnVsbCBzaW5jZSBhdCBsZWFzdCB0aGUgZGVmYXVsdCB3aWxsIGJlIHNldAotCSAqLwotCVhtbEFjY2Vzc1R5cGUgZ2V0QWNjZXNzVHlwZSgpOwotCQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZQotCSAqLwotCVN0cmluZyBERUZBVUxUX0FDQ0VTU19UWVBFX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3NUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZSwgbmV2ZXIgbnVsbAotCSAqLwotCVhtbEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBhY2Nlc3MgdHlwZQotCSAqLwotCVN0cmluZyBTUEVDSUZJRURfQUNDRVNTX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQWNjZXNzVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBhY2Nlc3MgdHlwZTsKLQkgKi8KLQlYbWxBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0eXBlLgotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlIG5ld1NwZWNpZmllZEFjY2Vzc1R5cGUpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGFibGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWRhcHRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTdiNDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFkYXB0YWJsZQotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogWG1sSmF2YVR5cGVBZGFwdGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9KQVZBX1RZUEVfQURBUFRFUl9QUk9QRVJUWSA9ICJ4bWxKYXZhVHlwZUFkYXB0ZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sSmF2YVR5cGVBZGFwdGVyIGdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQotCVhtbEphdmFUeXBlQWRhcHRlciBhZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGFibGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFkYXB0YWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JhODlkNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFkYXB0YWJsZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gYXR0cmlidXRlIG1hcHBpbmcgdGhhdCBtYXkgYWxzbyBoYXZlIGFuIFhtbEphdmFUeXBlQWRhcHRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWRhcHRhYmxlTWFwcGluZwotCQlleHRlbmRzIFhtbEFkYXB0YWJsZSB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGVpdGhlciB0aGUge0BsaW5rIFhtbEFkYXB0ZXJ9IGRlZmluZWQgaGVyZSBvciBhbnkgWG1sQWRhcHRlciBkZWZpbmVkIGF0IGEgaGlnaGVyIGxldmVsCi0JICogdGhhdCBhbHNvIGFwcGxpZXMgaGVyZS4KLQkgKi8KLQlYbWxBZGFwdGVyIGdldFhtbEFkYXB0ZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQWRhcHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmMxNDQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIGphdmEgY2xhc3MgdXNlZCBhcyBhbiBYbWxBZGFwdGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBZGFwdGVyIAotCQlleHRlbmRzIEpheGJDb250ZXh0Tm9kZSB7Ci0JCi0Jc3RhdGljIFN0cmluZyBNQVJTSEFMX01FVEhPRF9OQU1FID0gIm1hcnNoYWwiOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqIGJvdW5kIHR5cGUgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlICJib3VuZFR5cGUiIHByb3BlcnR5Ci0JICovCi0Jc3RhdGljIFN0cmluZyBCT1VORF9UWVBFX1BST1BFUlRZID0gImJvdW5kVHlwZSI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgYm91bmQgdHlwZSBuYW1lICh0aGUgdHlwZSB1c2VkIGluIHRoZSBqYXZhIG1vZGVsKQotCSAqLwotCVN0cmluZyBnZXRCb3VuZFR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiB2YWx1ZSB0eXBlICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAidmFsdWVUeXBlIiBwcm9wZXJ0eQotCSAqLwotCXN0YXRpYyBTdHJpbmcgVkFMVUVfVFlQRV9QUk9QRVJUWSA9ICJ2YWx1ZVR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIHZhbHVlIHR5cGUgbmFtZSAodGhlIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgeG1sIHNjaGVtYSkKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVUeXBlKCk7Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExOGIwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiB4bWwgYW55IGF0dHJpYnV0ZSBtYXBwaW5nIChAWG1sQW55QXR0cmlidXRlKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQW55QXR0cmlidXRlTWFwcGluZwotCQlleHRlbmRzIEpheGJBdHRyaWJ1dGVNYXBwaW5nLCBYbWxBZGFwdGFibGVNYXBwaW5nIHsJCi0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2OTViMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEFueUVsZW1lbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGFueSBlbGVtZW50IG1hcHBpbmcgKEBYbWxBbnlFbGVtZW50KQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQW55RWxlbWVudE1hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZywgWG1sQWRhcHRhYmxlTWFwcGluZyB7CQotCQotCS8vICoqKioqIGxheCAqKioqKgotCQotCWJvb2xlYW4gaXNMYXgoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX0xBWF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRMYXgiOyAvLyROT04tTkxTLTEkCi0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRMYXgoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZExheChCb29sZWFuIHNwZWNpZmllZExheCk7Ci0JCi0JYm9vbGVhbiBpc0RlZmF1bHRMYXgoKTsKLQkKLQlib29sZWFuIERFRkFVTFRfTEFYID0gZmFsc2U7Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX1ZBTFVFX1BST1BFUlRZID0gInNwZWNpZmllZFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfVkFMVUUgPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5XM0NEb21IYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWZzICoqKioqCi0JCi0JWG1sRWxlbWVudFJlZnMgZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50V3JhcHBlciAqKioqKgotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX1BST1BFUlRZID0gInhtbEVsZW1lbnRXcmFwcGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbEVsZW1lbnRXcmFwcGVyIGdldFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCi0JWG1sRWxlbWVudFdyYXBwZXIgYWRkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sTWl4ZWQgKioqKioKLQkKLQlTdHJpbmcgWE1MX01JWEVEX1BST1BFUlRZID0gInhtbE1peGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbE1peGVkIGdldFhtbE1peGVkKCk7Ci0JCi0JWG1sTWl4ZWQgYWRkWG1sTWl4ZWQoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbE1peGVkKCk7CQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBdHRhY2htZW50UmVmLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dGFjaG1lbnRSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzZTNjMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dGFjaG1lbnRSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBYbWxBdHRhY2htZW50UmVmCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRhY2htZW50UmVmCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNmNhOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiB4bWwgYXR0cmlidXRlIG1hcHBpbmcgKEBYbWxBdHRyaWJ1dGUpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JCWV4dGVuZHMgWG1sTmFtZWROb2RlTWFwcGluZyB7CQotCQotCS8vICoqKioqIHFuYW1lICoqKioqCi0JCi0JSmF4YlFOYW1lIGdldFFOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQgKioqKioKLQkKLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLQkKLQlzdGF0aWMgU3RyaW5nIFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFJlcXVpcmVkKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIHNwZWNpZmllZFJlcXVpcmVkKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNjYmNmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RFbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBAWG1sRWxlbWVudCwgd2hldGhlciBhdCB0b3AgbGV2ZWwgb3IgbmVzdGVkIGluIEBYbWxFbGVtZW50cwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudAotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogYW5ub3RhdGlvbiAqKioqKgotCQotCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpOwotCQotCQotCS8vICoqKioqIHFuYW1lICoqKioqCi0JCi0JSmF4YlFOYW1lIGdldFFOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogbmlsbGFibGUgKioqKioKLQkKLQlib29sZWFuIGlzTmlsbGFibGUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX05JTExBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZE5pbGxhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTmlsbGFibGUoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZE5pbGxhYmxlKEJvb2xlYW4gc3BlY2lmaWVkTmlsbGFibGUpOwotCQotCVN0cmluZyBERUZBVUxUX05JTExBQkxFX1BST1BFUlRZID0gImRlZmF1bHROaWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzRGVmYXVsdE5pbGxhYmxlKCk7Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQgKioqKioKLQkKLQlib29sZWFuIGlzUmVxdWlyZWQoKTsKLQkKLQlzdGF0aWMgU3RyaW5nIFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFJlcXVpcmVkKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIHNwZWNpZmllZFJlcXVpcmVkKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCk7Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdCB2YWx1ZSAqKioqKgotCQotCVN0cmluZyBERUZBVUxUX1ZBTFVFX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCi0Jdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0JCi0JCi0JLy8gKioqKiogdHlwZSAqKioqKgotCQotCVN0cmluZyBnZXRUeXBlKCk7Ci0JCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQotCVN0cmluZyBTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRTcGVjaWZpZWRUeXBlKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRUeXBlKFN0cmluZyB0eXBlKTsKLQkKLQlTdHJpbmcgREVGQVVMVF9UWVBFX1BST1BFUlRZID0gImRlZmF1bHRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXREZWZhdWx0VHlwZSgpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIGRpcmVjdGx5IHJlZmVyZW5jZWQgeG1sIHR5cGVzLCBmdWxseSBxdWFsaWZpZWQuCi0JICogKFVzZWQgZm9yIGNvbnN0cnVjdGluZyBKYXhiIGNvbnRleHQpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbiByZWZlcmVuY2VkLCBpZiBpdCBjYW4gYmUgcmVzb2x2ZWQuCi0JICovCi0JWHNkRWxlbWVudERlY2xhcmF0aW9uIGdldFhzZEVsZW1lbnQoKTsKLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50TWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EyOTNmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnQgbWFwcGluZyAoQFhtbEVsZW1lbnQpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIFhtbE5hbWVkTm9kZU1hcHBpbmcgewotCQotCVhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpOwotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFkgPSAieG1sRWxlbWVudFdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFJlZi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzEzYmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBAWG1sRWxlbWVudFJlZiwgd2hldGhlciBhdCB0b3AgbGV2ZWwgb3IgbmVzdGVkIGluIEBYbWxFbGVtZW50UmVmcwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudFJlZgotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogYW5ub3RhdGlvbiAqKioqKgotCQotCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQkKLQkKLQkvLyAqKioqKiBxbmFtZSAqKioqKgotCQotCUpheGJRTmFtZSBnZXRRTmFtZSgpOwotCQotCQotCS8vICoqKioqIHJlcXVpcmVkICoqKioqCi0JCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0JCi0Jc3RhdGljIFN0cmluZyBTUEVDSUZJRURfUkVRVUlSRURfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRSZXF1aXJlZCgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkUmVxdWlyZWQoQm9vbGVhbiBzcGVjaWZpZWRSZXF1aXJlZCk7Ci0JCi0JYm9vbGVhbiBpc0RlZmF1bHRSZXF1aXJlZCgpOwotCQotCQotCS8vICoqKioqIHR5cGUgKioqKioKLQkKLQlTdHJpbmcgZ2V0VHlwZSgpOwotCQotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVHlwZSgpOwotCQotCXZvaWQgc2V0U3BlY2lmaWVkVHlwZShTdHJpbmcgdHlwZSk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHhtbCB0eXBlcywgZnVsbHkgcXVhbGlmaWVkLgotCSAqIChVc2VkIGZvciBjb25zdHJ1Y3RpbmcgSmF4YiBjb250ZXh0KQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzhjZDUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnQgcmVmIG1hcHBpbmcgKEBYbWxFbGVtZW50UmVmKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudFJlZk1hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZywgWG1sQWRhcHRhYmxlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZiAqKioqKgotCQotCVhtbEVsZW1lbnRSZWYgZ2V0WG1sRWxlbWVudFJlZigpOwotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFkgPSAieG1sRWxlbWVudFdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsJCi0JCi0JCi0JLy8gKioqKiogWG1sTWl4ZWQgKioqKioKLQkKLQlTdHJpbmcgWE1MX01JWEVEX1BST1BFUlRZID0gInhtbE1peGVkIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbE1peGVkIGdldFhtbE1peGVkKCk7Ci0JCi0JWG1sTWl4ZWQgYWRkWG1sTWl4ZWQoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbE1peGVkKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRSZWZzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDhmZGIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50UmVmcwotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZnMgKioqKioKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGU19MSVNUID0gInhtbEVsZW1lbnRSZWZzIjsgLy8kTk9OLU5MUy0xJAotCQotCUxpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmPiBnZXRYbWxFbGVtZW50UmVmcygpOwotCQotCWludCBnZXRYbWxFbGVtZW50UmVmc1NpemUoKTsKLQkKLQlYbWxFbGVtZW50UmVmIGFkZFhtbEVsZW1lbnRSZWYoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWYoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWYoWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmKTsKLQkKLQl2b2lkIG1vdmVYbWxFbGVtZW50UmVmKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHhtbCB0eXBlcywgZnVsbHkgcXVhbGlmaWVkLgotCSAqIChVc2VkIGZvciBjb25zdHJ1Y3RpbmcgSmF4YiBjb250ZXh0KQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFJlZnNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTRhNTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnQgcmVmcyBtYXBwaW5nIChAWG1sRWxlbWVudFJlZnMpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50UmVmc01hcHBpbmcKLQkJZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZywgWG1sQWRhcHRhYmxlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZnMgKioqKioKLQkKLQlYbWxFbGVtZW50UmVmcyBnZXRYbWxFbGVtZW50UmVmcygpOwotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFkgPSAieG1sRWxlbWVudFdyYXBwZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCXZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxNaXhlZCAqKioqKgotCQotCVN0cmluZyBYTUxfTUlYRURfUFJPUEVSVFkgPSAieG1sTWl4ZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JWG1sTWl4ZWQgZ2V0WG1sTWl4ZWQoKTsKLQkKLQlYbWxNaXhlZCBhZGRYbWxNaXhlZCgpOwotCQotCXZvaWQgcmVtb3ZlWG1sTWl4ZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFdyYXBwZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyMjc3Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEVsZW1lbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIFhNTCBlbGVtZW50IHdyYXBwZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRXcmFwcGVyCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQkvLyAqKioqKiBxbmFtZSAqKioqKgotCQotCUpheGJRTmFtZSBnZXRRTmFtZSgpOwotCQotCQotCS8vICoqKioqIG5pbGxhYmxlICoqKioqCi0JCi0JYm9vbGVhbiBpc05pbGxhYmxlKCk7Ci0JCi0JU3RyaW5nIFNQRUNJRklFRF9OSUxMQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROaWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZE5pbGxhYmxlKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWROaWxsYWJsZShCb29sZWFuIHNwZWNpZmllZE5pbGxhYmxlKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdE5pbGxhYmxlKCk7Ci0JCi0JYm9vbGVhbiBERUZBVUxUX05JTExBQkxFID0gZmFsc2U7Ci0JCQotCQotCS8vICoqKioqIHJlcXVpcmVkICoqKioqCi0JCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci0JCi0JU3RyaW5nIFNQRUNJRklFRF9SRVFVSVJFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRSZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZFJlcXVpcmVkKCk7Ci0JCi0Jdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIHNwZWNpZmllZFJlcXVpcmVkKTsKLQkKLQlib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCk7Ci0JCi0JYm9vbGVhbiBERUZBVUxUX1JFUVVJUkVEID0gZmFsc2U7Ci0JCQotCQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JWHNkRWxlbWVudERlY2xhcmF0aW9uIGdldFhzZEVsZW1lbnREZWNsYXJhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50c01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sRWxlbWVudHNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNGJkMjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxFbGVtZW50c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIGVsZW1lbnRzIG1hcHBpbmcgKEBYbWxFbGVtZW50cykKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRzTWFwcGluZwotCQlleHRlbmRzIEpheGJBdHRyaWJ1dGVNYXBwaW5nLCBYbWxBZGFwdGFibGVNYXBwaW5nIHsKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50cyAqKioqKgotCQotCVN0cmluZyBYTUxfRUxFTUVOVFNfTElTVCA9ICJ4bWxFbGVtZW50cyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlMaXN0SXRlcmFibGU8WG1sRWxlbWVudD4gZ2V0WG1sRWxlbWVudHMoKTsKLQkKLQlpbnQgZ2V0WG1sRWxlbWVudHNTaXplKCk7Ci0JCi0JWG1sRWxlbWVudCBhZGRYbWxFbGVtZW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50KGludCBpbmRleCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCk7Ci0JCi0Jdm9pZCBtb3ZlWG1sRWxlbWVudChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFdyYXBwZXIgKioqKioKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfV1JBUFBFUl9QUk9QRVJUWSA9ICJ4bWxFbGVtZW50V3JhcHBlciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxFbGVtZW50V3JhcHBlciBnZXRYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCVhtbEVsZW1lbnRXcmFwcGVyIGFkZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpOwotCQotCQotCS8vICoqKioqIFhtbElEUkVGICoqKioqCi0JCi0JU3RyaW5nIFhNTF9JRFJFRl9QUk9QRVJUWSA9ICJ4bWxJRFJFRiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxJRFJFRiBnZXRYbWxJRFJFRigpOwotCQotCVhtbElEUkVGIGFkZFhtbElEUkVGKCk7Ci0JCi0Jdm9pZCByZW1vdmVYbWxJRFJFRigpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxJRC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzE2OWY5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiBYTUwgSUQgKEBYbWxJRCkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElECi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbElEUkVGLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbElEUkVGLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYWVmZDMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxJRFJFRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIFhNTCBJRCByZWYgKEBYbWxJRFJFRikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbElEUkVGCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEphdmFUeXBlQWRhcHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxKYXZhVHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiMzQyYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbEphdmFUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxKYXZhVHlwZUFkYXB0ZXIKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpOwotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkKLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpOwotCQotCQotCS8vICoqKioqIHhtbEFkYXB0ZXIgKioqKioKLQkKLQlTdHJpbmcgWE1MX0FEQVBURVJfUFJPUEVSVFkgPSAieG1sQWRhcHRlciI7ICAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogT2JqZWN0IGJhc2VkIG9uIHNwZWNpZmllZCAidmFsdWUiCi0JICovCi0JWG1sQWRhcHRlciBnZXRYbWxBZGFwdGVyKCk7Ci0JCi0JCi0JLy8gKioqKiogdHlwZSAqKioqKgotCQotCVN0cmluZyBnZXRUeXBlKCk7Ci0JCi0JU3RyaW5nIFNQRUNJRklFRF9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldFNwZWNpZmllZFR5cGUoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZFR5cGUoU3RyaW5nIHR5cGUpOwotCQotCVN0cmluZyBERUZBVUxUX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIGdldERlZmF1bHRUeXBlKCk7Ci0JCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQotCVN0cmluZyBERUZBVUxUX1RZUEUgPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTWl4ZWQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTWl4ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNmRmOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE1peGVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBAWG1sTWl4ZWQgSkFYQiBhbm5vdGF0aW9uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNaXhlZAotCQlleHRlbmRzIEphdmFDb250ZXh0Tm9kZSB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5hbWVkTm9kZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWZjMzczLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEZlYXR1cmU7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgWG1sRWxlbWVudE1hcHBpbmcgYW5kIFhtbEF0dHJpYnV0ZU1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5hbWVkTm9kZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxOb2RlTWFwcGluZyB7Ci0JCi0JLy8gKioqKiogWG1sSUQgKioqKioKLQkKLQlTdHJpbmcgWE1MX0lEX1BST1BFUlRZID0gInhtbElEIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbElEIGdldFhtbElEKCk7Ci0JCi0JWG1sSUQgYWRkWG1sSUQoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbElEKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sSURSRUYgKioqKioKLQkKLQlTdHJpbmcgWE1MX0lEUkVGX1BST1BFUlRZID0gInhtbElEUkVGIjsgLy8kTk9OLU5MUy0xJAotCQotCVhtbElEUkVGIGdldFhtbElEUkVGKCk7Ci0JCi0JWG1sSURSRUYgYWRkWG1sSURSRUYoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbElEUkVGKCk7Ci0JCi0JCi0JLy8gKioqKiogWG1sQXR0YWNobWVudFJlZiAqKioqKgotCQotCVN0cmluZyBYTUxfQVRUQUNITUVOVF9SRUZfUFJPUEVSVFkgPSAieG1sQXR0YWNobWVudFJlZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxBdHRhY2htZW50UmVmIGdldFhtbEF0dGFjaG1lbnRSZWYoKTsKLQkKLQlYbWxBdHRhY2htZW50UmVmIGFkZFhtbEF0dGFjaG1lbnRSZWYoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbEF0dGFjaG1lbnRSZWYoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JWHNkRmVhdHVyZSBnZXRYc2RGZWF0dXJlKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5vZGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5vZGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjM0MTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxOb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgWG1sRWxlbWVudE1hcHBpbmcsIFhtbEF0dHJpYnV0ZU1hcHBpbmcsIGFuZCBYbWxWYWx1ZU1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5vZGVNYXBwaW5nCi0JCWV4dGVuZHMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcsIFhtbEFkYXB0YWJsZU1hcHBpbmcgewotCQotCS8vICoqKioqIHhtbCBzY2hlbWEgdHlwZSAqKioqKgotCQotCVN0cmluZyBYTUxfU0NIRU1BX1RZUEVfUFJPUEVSVFkgPSAieG1sU2NoZW1hVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlYbWxTY2hlbWFUeXBlIGdldFhtbFNjaGVtYVR5cGUoKTsKLQkKLQlYbWxTY2hlbWFUeXBlIGFkZFhtbFNjaGVtYVR5cGUoKTsKLQkKLQl2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBYbWxMaXN0ICoqKioqCi0JCi0JYm9vbGVhbiBpc1htbExpc3QoKTsKLQkKLQlTdHJpbmcgU1BFQ0lGSUVEX1hNTF9MSVNUX1BST1BFUlRZID0gInNwZWNpZmllZFhtbExpc3QiOyAvLyROT04tTkxTLTEkCi0JCi0JYm9vbGVhbiBpc1NwZWNpZmllZFhtbExpc3QoKTsKLQkKLQl2b2lkIHNldFNwZWNpZmllZFhtbExpc3QoYm9vbGVhbiBuZXdWYWx1ZSk7Ci0JCi0JU3RyaW5nIERFRkFVTFRfWE1MX0xJU1RfUFJPUEVSVFkgPSAiZGVmYXVsdFhtbExpc3QiOyAvLyROT04tTkxTLTEkCi0JCi0JYm9vbGVhbiBpc0RlZmF1bHRYbWxMaXN0KCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5zLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzA0OWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxOcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNBbm5vdGF0aW9uOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTnMKLQlleHRlbmRzIAotCQlKYXhiQ29udGV4dE5vZGUKLXsKLQlYbWxOc0Fubm90YXRpb24gZ2V0UmVzb3VyY2VYbWxOcygpOwotCi0JLy8gKioqKioqKioqKiBuYW1lc3BhY2VVUkkgKioqKioqKioqKgotCVN0cmluZyBnZXROYW1lc3BhY2VVUkkoKTsKLQl2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKTsKLQkJU3RyaW5nIE5BTUVTUEFDRV9VUklfUFJPUEVSVFkgPSAibmFtZXNwYWNlVVJJIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBwcmVmaXggKioqKioqKioqKgotCVN0cmluZyBnZXRQcmVmaXgoKTsKLQl2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KTsKLQkJU3RyaW5nIFBSRUZJWF9QUk9QRVJUWSA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5zRm9ybS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxOc0Zvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViOGViYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbE5zRm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBlbnVtIFhtbE5zRm9ybSB7Ci0KLQlRVUFMSUZJRUQoCi0JCW9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0uUVVBTElGSUVECi0JCSksCi0JVU5RVUFMSUZJRUQoCi0JCW9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0uVU5RVUFMSUZJRUQKLQkJKSwKLQlVTlNFVCgKLQkJb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybS5VTlNFVAotCQkpOwotCi0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0gamF2YU5zRm9ybTsKLQotCVhtbE5zRm9ybShvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtIGphdmFOc0Zvcm0pIHsKLQkJaWYgKGphdmFOc0Zvcm0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhTnNGb3JtID0gamF2YU5zRm9ybTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybSBnZXRKYXZhTnNGb3JtKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhTnNGb3JtOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFhtbE5zRm9ybSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybSBqYXZhTnNGb3JtKSB7Ci0JCXJldHVybiAoamF2YU5zRm9ybSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YVJlc291cmNlTW9kZWxfKGphdmFOc0Zvcm0pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFhtbE5zRm9ybSBmcm9tSmF2YVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm0gamF2YU5zRm9ybSkgewotCQlmb3IgKFhtbE5zRm9ybSBuc0Zvcm0gOiBYbWxOc0Zvcm0udmFsdWVzKCkpIHsKLQkJCWlmIChuc0Zvcm0uZ2V0SmF2YU5zRm9ybSgpID09IGphdmFOc0Zvcm0pIHsKLQkJCQlyZXR1cm4gbnNGb3JtOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybSB0b0phdmFSZXNvdXJjZU1vZGVsKFhtbE5zRm9ybSBuc0Zvcm0pIHsKLQkJcmV0dXJuIChuc0Zvcm0gPT0gbnVsbCkgPyBudWxsIDogbnNGb3JtLmdldEphdmFOc0Zvcm0oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFJlZ2lzdHJ5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGJlNTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgSkFYQiByZWdpc3RyeQotICogKEEgY2xhc3Mgd2l0aCBhbiBleHBsaWNpdCBAWG1sUmVnaXN0cnkgYW5ub3RhdGlvbikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJlZ2lzdHJ5Ci0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQkvLyAqKioqKiBlbGVtZW50IGZhY3RvcnkgbWV0aG9kcyAqKioqKioKLQkKLQlTdHJpbmcgRUxFTUVOVF9GQUNUT1JZX01FVEhPRFNfQ09MTEVDVElPTiA9ICJlbGVtZW50RmFjdG9yeU1ldGhvZHMiOyAvLyROT04tTkxTLTEkCi0JCi0JSXRlcmFibGU8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBnZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKTsKLQkKLQlpbnQgZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlKYXhiQ2xhc3MgZ2V0SmF4YkNsYXNzKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFJvb3RFbGVtZW50LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFJvb3RFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTc5NjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxSb290RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpBWEIgeG1sIHJvb3QgZWxlbWVudC4gIAotICogKEEgY2xhc3Mgd2l0aCBhbiBleHBsaWNpdCBAWG1sUm9vdEVsZW1lbnQgYW5ub3RhdGlvbikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJvb3RFbGVtZW50Ci0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQlKYXhiVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKLQkKLQlKYXhiUU5hbWUgZ2V0UU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sU2NoZW1hLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGMxMGQyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sU2NoZW1hLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxTY2hlbWEKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZSBvciAiIiAoZGVmYXVsdCB2YWx1ZSkKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLCBudWxsIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lc3BhY2UsIG51bGwgdG8gdW5zcGVjaWZ5Ci0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSk7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlCi0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9OQU1FU1BBQ0VfUFJPUEVSVFkgPSAic3BlY2lmaWVkTmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbiBsb2NhdGlvbiBlbGVtZW50Ci0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uKCk7Ci0Jdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pOwotCQlTdHJpbmcgTE9DQVRJT05fUFJPUEVSVFkgPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBERUZBVUxUX0xPQ0FUSU9OID0gIiMjZ2VuZXJhdGUiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGZvcm0gZGVmYXVsdCBvciBYbWxOc0Zvcm0uVU5TRVQgKGRlZmF1bHQgdmFsdWUpCi0JICovCi0JWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGZvcm0gZGVmYXVsdCwgbnVsbCBpZiBpdCBpcyBub3Qgc3BlY2lmaWVkCi0JICovCi0JWG1sTnNGb3JtIGdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0LCBudWxsIHRvIHVuc3BlY2lmeQotCSAqLwotCXZvaWQgc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0Ci0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9BVFRSSUJVVEVfRk9STV9ERUZBVUxUX1BST1BFUlRZID0gImF0dHJpYnV0ZUZvcm1EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZWxlbWVudCBmb3JtIGRlZmF1bHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBlbGVtZW50IGZvcm0gZGVmYXVsdCBvciBYbWxOc0Zvcm0uVU5TRVQgKGRlZmF1bHQgdmFsdWUpCi0JICovCi0JWG1sTnNGb3JtIGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgZm9ybSBkZWZhdWx0LCBudWxsIGlmIGl0IGlzIG5vdCBzcGVjaWZpZWQKLQkgKi8KLQlYbWxOc0Zvcm0gZ2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0KCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBlbGVtZW50IGZvcm0gZGVmYXVsdCwgbnVsbCB0byB1bnNwZWNpZnkKLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0gZWxlbWVudEZvcm1EZWZhdWx0KTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0Ci0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9FTEVNRU5UX0ZPUk1fREVGQVVMVF9QUk9QRVJUWSA9ICJlbGVtZW50Rm9ybURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JLy8gKioqKioqKioqKiB4bWwgbmFtZXNwYWNlIHByZWZpeGVzICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxYbWxOcz4gZ2V0WG1sTnNQcmVmaXhlcygpOwotCWludCBnZXRYbWxOc1ByZWZpeGVzU2l6ZSgpOwotCVhtbE5zIGFkZFhtbE5zUHJlZml4KGludCBpbmRleCk7Ci0Jdm9pZCByZW1vdmVYbWxOc1ByZWZpeChpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlWG1sTnNQcmVmaXgoWG1sTnMgeG1sTnNQcmVmaXgpOwotCXZvaWQgbW92ZVhtbE5zUHJlZml4KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFhNTF9OU19QUkVGSVhFU19MSVNUID0gInhtbE5zUHJlZml4ZXMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sU2NoZW1hVHlwZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxTY2hlbWFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YjVhNjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxTY2hlbWFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEVXRpbDsKLQotLyoqCi0gKiAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNjaGVtYVR5cGUKLQkJZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGUgewotCQotCVN0cmluZyBERUZBVUxUX05BTUVTUEFDRSA9IFhTRFV0aWwuU0NIRU1BX0ZPUl9TQ0hFTUFfVVJJXzIwMDE7Ci0JCi0JWG1sU2NoZW1hVHlwZUFubm90YXRpb24gZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKTsKLQkKLQlKYXhiUU5hbWUgZ2V0UU5hbWUoKTsKLQkKLQkKLQkvLyAqKioqKiB0eXBlICoqKioqCi0JCi0JU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgWG1sU2NoZW1hVHlwZSBhbm5vdGF0aW9uICd0eXBlJyBlbGVtZW50Ci0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQkKLQl2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpOwotCQotCVN0cmluZyBERUZBVUxUX1RZUEUgPSAiamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlLkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFNlZUFsc28uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sU2VlQWxzby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkxODk0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvWG1sU2VlQWxzby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogTWFpbnRhaW5zIGEgbGlzdCBvZiBjbGFzc2VzIChjbGFzcyBuYW1lcyBoZXJlKSB0byBiZSBhZGRlZCB0byB0aGUgSkFYQiBjb250ZXh0LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBYbWxTZWVBbHNvCi0JCWV4dGVuZHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0VTX0xJU1QgPSAiY2xhc3NlcyI7Ci0JCi0JTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NlcygpOwotCQotCWludCBnZXRDbGFzc2VzU2l6ZSgpOwotCQotCXZvaWQgYWRkQ2xhc3MoaW50IGluZGV4LCBTdHJpbmcgY2xhenopOwotCQotCXZvaWQgcmVtb3ZlQ2xhc3MoaW50IGluZGV4KTsKLQkKLQl2b2lkIG1vdmVDbGFzcyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBtaXNjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBkaXJlY3RseSByZWZlcmVuY2VkIHR5cGVzLCBmdWxseSBxdWFsaWZpZWQuCi0JICogKFVzZWQgZm9yIGNvbnN0cnVjdGluZyBKYXhiIGNvbnRleHQpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFZhbHVlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9YbWxWYWx1ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAxYzE4ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L1htbFZhbHVlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dDsKLQotCi0vKioKLSAqIFJlcHJlc2VudHMgYSBKQVhCIHhtbCB2YWx1ZSBtYXBwaW5nIChAWG1sVmFsdWUpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxWYWx1ZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxOb2RlTWFwcGluZyB7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvamF2YS9EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNmZkYzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvY29udGV4dC9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQotCi0vKioKLSAqIE1hcCBhIHN0cmluZyBrZXkgdG8gYW4gYXR0cmlidXRlIG1hcHBpbmcgYW5kIGl0cyBjb3JyZXNwb25kaW5nCi0gKiBKYXZhIGFubm90YXRpb24uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIG1hcHBpbmcgcHJvdmlkZXIgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiB7QGxpbmsgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGV9IAotCSAqIGluIHRoZSBkZWZhdWx0IChpZ25vcmluZyBhbGwgbWFwcGluZyBhbm5vdGF0aW9ucykgY2FzZS4KLQkgKi8KLQlib29sZWFuIGlzRGVmYXVsdChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyN2Q4ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0KLS8qKgotICogTWFwIGEgc3RyaW5nIGtleSB0byBhbiBhdHRyaWJ1dGUgbWFwcGluZyBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAqIEphdmEgYW5ub3RhdGlvbi4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiAKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBtYXBwaW5nJ3Mga2V5LgotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIG1hcHBpbmcncyBKYXZhIGFubm90YXRpb24gbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuIFVzZSB0aGUgc3BlY2lmaWVkCi0JICogZmFjdG9yeSBmb3IgY3JlYXRpb24gc28gZXh0ZW5kZXJzIGNhbiBzaW1wbHkgb3ZlcnJpZGUgdGhlIGFwcHJvcHJpYXRlCi0JICogY3JlYXRpb24gbWV0aG9kIGluc3RlYWQgb2YgYnVpbGRpbmcgYSBwcm92aWRlciBmb3IgdGhlIHNhbWUga2V5LgotCSAqLwotCUpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIEpheGJGYWN0b3J5IGZhY3RvcnkpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBuYW1lcyB0aGF0IGFyZSBzdXBwb3J0ZWQgd2l0aCB0aGlzIG1hcHBpbmcgdHlwZS4KLQkgKiBUaGlzIGluY2x1ZGVzIGFsbCBwb3NzaWJsZSBhbm5vdGF0aW9ucywgbm90IGp1c3QgdGhlIG9uZXMgdGhhdCBjdXJyZW50bHkgZXhpc3Qgb24gdGhlIGF0dHJpYnV0ZS4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgbWFwcGluZyBwcm92aWRlciBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHtAbGluayBQZXJzaXN0ZW50QXR0cmlidXRlfSAKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIChvYnNlcnZpbmcgYWxsIG1hcHBpbmcgYW5ub3RhdGlvbnMpIGNhc2UuCi0JICovCi0JYm9vbGVhbiBpc1NwZWNpZmllZChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29udGV4dE5vZGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4NTlmMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9jb250ZXh0L2phdmEvSmF2YUNvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBKYXZhQ29udGV4dE5vZGUKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE5vZGUgewotCQotCS8vICoqKioqKioqKioqKioqKiogY29udGVudCBhc3Npc3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSBjb2RlLWNvbXBsZXRpb24gcHJvcG9zYWxzIGZvciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIGxpc3Qgb2YgY3VycmVudCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0Jdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGZvciBoaWdobGlnaHRpbmcgZXJyb3JzIGZvciB0aGlzIG9iamVjdAotCSAqLwotCVRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0Fic3RyYWN0SmF4YkZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0Fic3RyYWN0SmF4YkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmZDllZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdC5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbGVtZW50RmFjdG9yeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQW55QXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZnNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5HZW5lcmljQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LkdlbmVyaWNQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbnVtTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbE5zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxSb290RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbFRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIENlbnRyYWwgY2xhc3MgdGhhdCBhbGxvd3MgZXh0ZW5kZXJzIHRvIGVhc2lseSByZXBsYWNlIGltcGxlbWVudGF0aW9ucyBvZgotICogdmFyaW91cyBEYWxpIGludGVyZmFjZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpheGJGYWN0b3J5Ci0JCWltcGxlbWVudHMgSmF4YkZhY3RvcnkgewotCQotCXByb3RlY3RlZCBBYnN0cmFjdEpheGJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgotCQotCXB1YmxpYyBKYXhiUHJvamVjdCBidWlsZEpheGJQcm9qZWN0KENvbmZpZyBjb25maWcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF4YlByb2plY3QoY29uZmlnKTsKLQl9Ci0JCi0JcHVibGljIEpheGJGaWxlIGJ1aWxkSmF4YkZpbGUoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSwgSnB0UmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pheGJGaWxlKGpheGJQcm9qZWN0LCBmaWxlLCBjb250ZW50VHlwZSwgcmVzb3VyY2VNb2RlbCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogTm9uLXJlc291cmNlLXNwZWNpZmljIGNvbnRleHQgbm9kZXMgKioqKioqKioqKgotCQotCXB1YmxpYyBKYXhiQ29udGV4dFJvb3QgYnVpbGRDb250ZXh0Um9vdChKYXhiUHJvamVjdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljQ29udGV4dFJvb3QocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEpheGJQYWNrYWdlIGJ1aWxkUGFja2FnZShKYXhiQ29udGV4dFJvb3QgcGFyZW50LCBTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljUGFja2FnZShwYXJlbnQsIHBhY2thZ2VOYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogSmF2YSBjb250ZXh0IG5vZGVzICoqKioqCi0JCi0JcHVibGljIEpheGJQYWNrYWdlSW5mbyBidWlsZEphdmFQYWNrYWdlSW5mbyhKYXhiUGFja2FnZSBwYXJlbnQsIEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQYWNrYWdlSW5mbyhwYXJlbnQsIHJlc291cmNlUGFja2FnZSk7Ci0JfQotCQotCXB1YmxpYyBYbWxTY2hlbWEgYnVpbGRKYXZhWG1sU2NoZW1hKEpheGJQYWNrYWdlSW5mbyBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbFNjaGVtYShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sTnMgYnVpbGRKYXZhWG1sTnMoWG1sU2NoZW1hIHBhcmVudCwgWG1sTnNBbm5vdGF0aW9uIHhtbE5zQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sTnMocGFyZW50LCB4bWxOc0Fubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgSmF4YkNsYXNzIGJ1aWxkSmF4YkNsYXNzKEpheGJDb250ZXh0Um9vdCBwYXJlbnQsIEphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFKYXhiQ2xhc3MocGFyZW50LCByZXNvdXJjZVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkVudW0gYnVpbGRKYXhiRW51bShKYXhiQ29udGV4dFJvb3QgcGFyZW50LCBKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhSmF4YkVudW0ocGFyZW50LCByZXNvdXJjZUVudW0pOwotCX0KLQkKLQlwdWJsaWMgSmF4YkNsYXNzTWFwcGluZyBidWlsZEpheGJDbGFzc01hcHBpbmcoSmF4YkNsYXNzIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiRW51bU1hcHBpbmcgYnVpbGRKYXhiRW51bU1hcHBpbmcoSmF4YkVudW0gcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFFbnVtTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sUmVnaXN0cnkgYnVpbGRYbWxSZWdpc3RyeShKYXhiQ2xhc3MgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxSZWdpc3RyeShwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGJ1aWxkSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kKFhtbFJlZ2lzdHJ5IHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZChwYXJlbnQsIHJlc291cmNlTWV0aG9kKTsKLQl9Ci0JCi0JcHVibGljIFhtbFJvb3RFbGVtZW50IGJ1aWxkSmF2YVhtbFJvb3RFbGVtZW50KEpheGJUeXBlTWFwcGluZyBwYXJlbnQsIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiB4bWxSb290RWxlbWVudEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50KHBhcmVudCwgeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF4YkNsYXNzTWFwcGluZyBwYXJlbnQsIEFjY2Vzc29yIGFjY2Vzc29yKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCwgYWNjZXNzb3IpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuYnVpbGRQZXJzaXN0ZW50RmllbGQocGFyZW50LCByZXNvdXJjZUZpZWxkKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRQcm9wZXJ0eShKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5idWlsZFBlcnNpc3RlbnRQcm9wZXJ0eShwYXJlbnQsIHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcik7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFOdWxsQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFYbWxUcmFuc2llbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sVHJhbnNpZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sQW55QXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sQW55RWxlbWVudE1hcHBpbmcgYnVpbGRKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudE1hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZk1hcHBpbmcgYnVpbGRKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZnNNYXBwaW5nIGJ1aWxkSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudHNNYXBwaW5nIGJ1aWxkSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgWG1sVmFsdWVNYXBwaW5nIGJ1aWxkSmF2YVhtbFZhbHVlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkVudW1Db25zdGFudCBidWlsZEphdmFFbnVtQ29uc3RhbnQoSmF4YkVudW1NYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHJlc291cmNlRW51bUNvbnN0YW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFFbnVtQ29uc3RhbnQocGFyZW50LCByZXNvdXJjZUVudW1Db25zdGFudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiTm9kZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWU1NmY0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0Fic3RyYWN0SmF4Yk5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpEVE1vZGlmaWVkRGVjbGFyYXRpb24uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5Bc3BlY3RDaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5DaGFuZ2VTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybTsKLQotLyoqCi0gKiBTb21lIGNvbW1vbiBEYWxpIGJlaGF2aW9yOjx1bD4KLSAqIDxsaT5jb250YWlubWVudCBoaWVyYXJjaHkKLSAqIDxsaT5FY2xpcHNlIGFkYXB0YWJsZQotICogPGxpPnVwZGF0ZSB0cmlnZ2VycwotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4Yk5vZGUKLQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQlpbXBsZW1lbnRzIEpheGJOb2RlCi17Ci0JcHJpdmF0ZSBmaW5hbCBKYXhiTm9kZSBwYXJlbnQ7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF4Yk5vZGUoSmF4Yk5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY2hlY2tQYXJlbnQocGFyZW50KTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoSmF4Yk5vZGUgcCkgewotCQlpZiAocCA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5yZXF1aXJlc1BhcmVudCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3BhcmVudCcgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuZm9yYmlkc1BhcmVudCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiJ3BhcmVudCcgbXVzdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmb3JiaWRzUGFyZW50KCkgewotCQlyZXR1cm4gISB0aGlzLnJlcXVpcmVzUGFyZW50KCk7ICAvLyBhc3N1bWUgJ3BhcmVudCcgaXMgbm90IG9wdGlvbmFsCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENoYW5nZVN1cHBvcnQgYnVpbGRDaGFuZ2VTdXBwb3J0KCkgewotCQlyZXR1cm4gbmV3IEFzcGVjdENoYW5nZVN1cHBvcnQodGhpcywgdGhpcy5idWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXNwZWN0Q2hhbmdlU3VwcG9ydC5MaXN0ZW5lciBidWlsZENoYW5nZVN1cHBvcnRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0Lkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgYXNwZWN0Q2hhbmdlZChTdHJpbmcgYXNwZWN0TmFtZSkgewotCQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJQWRhcHRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF4Yk5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpheGJOb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudC5nZXRSZXNvdXJjZSgpOwotCX0KLQotCXB1YmxpYyBKYXhiUHJvamVjdCBnZXRKYXhiUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50LmdldEpheGJQcm9qZWN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybSBnZXRQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF4YlByb2plY3QoKS5nZXRQbGF0Zm9ybSgpOwotCX0KLQotLy8JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybS5WZXJzaW9uIGdldEpheGJQbGF0Zm9ybVZlcnNpb24oKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZ2V0SmF4YlBsYXRmb3JtKCkuZ2V0SmF4YlBsYXRmb3JtVmVyc2lvbigpOwotLy8JfQotCi0JcHJvdGVjdGVkIEpheGJGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBsYXRmb3JtKCkuZ2V0RmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiRmlsZSBnZXRKYXhiRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiB0aGlzLmdldEpheGJQcm9qZWN0KCkuZ2V0SmF4YkZpbGUoZmlsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhbGxiYWNrQ2hhbmdlU3VwcG9ydC5MaXN0ZW5lciBzdXBwb3J0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJaWYgKHRoaXMuYXNwZWN0VHJpZ2dlcnNVcGRhdGUoYXNwZWN0TmFtZSkpIHsKLS8vCQkJU3RyaW5nIG1zZyA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIGFzcGVjdCBjaGFuZ2U6ICIgKyB0aGlzICsgIjogIiArIGFzcGVjdE5hbWU7Ci0vLwkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotLy8JCQluZXcgRXhjZXB0aW9uKG1zZykucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOwotCQkJdGhpcy5zdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBhc3BlY3RUcmlnZ2Vyc1VwZGF0ZShTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdERvZXNOb3RUcmlnZ2VyVXBkYXRlKGFzcGVjdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFzcGVjdERvZXNOb3RUcmlnZ2VyVXBkYXRlKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCS8vIGlnbm9yZSBzdGF0ZSBjaGFuZ2VzIHNvIHdlIGRvbid0IGdldCBhIHN0YWNrIG92ZXJmbG93IDotKQotCQkvLyAoYW5kIHdlIGRvbid0IHVzZSBzdGF0ZSBjaGFuZ2VzIGV4Y2VwdCBoZXJlKQotCQlyZXR1cm4gKGFzcGVjdE5hbWUgPT0gbnVsbCkgfHwKLQkJCQl0aGlzLm5vblVwZGF0ZUFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKG5vblVwZGF0ZUFzcGVjdE5hbWVTZXRzKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMgPSBub25VcGRhdGVBc3BlY3ROYW1lU2V0cy5nZXQodGhpcy5nZXRDbGFzcygpKTsKLQkJCWlmIChub25VcGRhdGVBc3BlY3ROYW1lcyA9PSBudWxsKSB7Ci0JCQkJbm9uVXBkYXRlQXNwZWN0TmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQkJdGhpcy5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQkJCQlub25VcGRhdGVBc3BlY3ROYW1lU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVXBkYXRlQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpheGJOb2RlPiwgSGFzaFNldDxTdHJpbmc+PiBub25VcGRhdGVBc3BlY3ROYW1lU2V0cyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpheGJOb2RlPiwgSGFzaFNldDxTdHJpbmc+PigpOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQl0aGlzLmZpcmVTdGF0ZUNoYW5nZWQoKTsKLQkJaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKLQkJCXRoaXMucGFyZW50LnN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBBZGFwdGVyIHVzZWQgdG8gc3luY2hyb25pemUgYSBjb250ZXh0IGNvbGxlY3Rpb24gY29udGFpbmVyIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiByZXNvdXJjZSBjb250YWluZXIuCi0JICogQHBhcmFtIDxDPiB0aGUgdHlwZSBvZiBjb250ZXh0IGVsZW1lbnRzCi0JICogQHBhcmFtIDxSPiB0aGUgdHlwZSBvZiByZXNvdXJjZSBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uQ29udGFpbmVyPEMsIFI+IHsKLQotCQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEM+IGNvbnRleHRFbGVtZW50cyA9IG5ldyBWZWN0b3I8Qz4oKTsKLQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb250YWluZXIncyBjdXJyZW50IHNldCBvZiByZXNvdXJjZSBlbGVtZW50cy4KLQkJICogVGhlc2UgYXJlIHdoYXQgdGhlIGNvbnRleHQgZWxlbWVudHMgd2lsbCBiZSBzeW5jaHJvbml6ZWQgdG8uCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8Uj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQKLQkJICogZWxlbWVudC4KLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBSIGdldFJlc291cmNlRWxlbWVudChDIGNvbnRleHRFbGVtZW50KTsKLQotCQkvKioKLQkJICogQnVpbGQgYW5kIHJldHVybiBhIGNvbnRleHQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGVsZW1lbnQKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBDIGJ1aWxkQ29udGV4dEVsZW1lbnQoUiByZXNvdXJjZUVsZW1lbnQpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHByb3BlcnR5IG5hbWUgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb2xsZWN0aW9uIGlzIGNoYW5nZWQuCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBjbGllbnRzIG5lZWRzIHRvIGNhbGwgaW5pdGlhbGl6ZSBpZiBuZWNlc3NhcnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlmb3IgKFIgcmVzb3VyY2VFbGVtZW50IDogdGhpcy5nZXRSZXNvdXJjZUVsZW1lbnRzKCkpIHsKLQkJCQl0aGlzLmNvbnRleHRFbGVtZW50cy5hZGQodGhpcy5idWlsZENvbnRleHRFbGVtZW50KHJlc291cmNlRWxlbWVudCkpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBJdGVyYWJsZSBvZiB0aGUgY29udGV4dCBlbGVtZW50cwotCQkgKi8KLQkJcHVibGljIEl0ZXJhYmxlPEM+IGdldENvbnRleHRFbGVtZW50cygpIHsKLQkJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8Qz4odGhpcy5jb250ZXh0RWxlbWVudHMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29udGV4dCBlbGVtZW50cyBjb2xsZWN0aW9uCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldENvbnRleHRFbGVtZW50c1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250ZXh0RWxlbWVudHMuc2l6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCBhIGNvbnRleHQgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBlbGVtZW50IGF0IHRoZQotCQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQlwdWJsaWMgQyBhZGRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIFIgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRDb250ZXh0RWxlbWVudF8oaW5kZXgsIHRoaXMuYnVpbGRDb250ZXh0RWxlbWVudChyZXNvdXJjZUVsZW1lbnQpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gaWdub3JpbmcKLQkJICogdGhlIHNwZWNpZmllZCBpbmRleCBhcyB3ZSBvbmx5IGhhdmUgYSBjb2xsZWN0aW9uCi0JCSAqLwotCQlwcm90ZWN0ZWQgQyBhZGRDb250ZXh0RWxlbWVudF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCwgQyBjb250ZXh0RWxlbWVudCkgewotCQkJQWJzdHJhY3RKYXhiTm9kZS50aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oY29udGV4dEVsZW1lbnQsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQgZnJvbSB0aGUgY29udGFpbmVyLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoQyBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEpheGJOb2RlLnRoaXMucmVtb3ZlSXRlbUZyb21Db2xsZWN0aW9uKGVsZW1lbnQsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAKLQkJcHJvdGVjdGVkIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgQyBlbGVtZW50KSB7Ci0JCQkvL25vLW9wLCBub3QgYSBsaXN0Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGFwdGVyIHVzZWQgdG8gc3luY2hyb25pemUgYSBjb250ZXh0IGNvbGxlY3Rpb24gY29udGFpbmVyIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiByZXNvdXJjZSBjb250YWluZXIuCi0JICogQHBhcmFtIDxDPiB0aGUgdHlwZSBvZiBjb250ZXh0IGVsZW1lbnRzCi0JICogQHBhcmFtIDxSPiB0aGUgdHlwZSBvZiByZXNvdXJjZSBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcjxDIGV4dGVuZHMgSmF4YkNvbnRleHROb2RlLCBSPiBleHRlbmRzIENvbGxlY3Rpb25Db250YWluZXI8QywgUj4gewotCi0JCXByb3RlY3RlZCBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVXNpbmcgdGhlIHNwZWNpZmllZCBhZGFwdGVyLCBzeW5jaHJvbml6ZSBhIGNvbnRleHQgY29udGFpbmVyIHdpdGggaXRzCi0JCSAqIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgY29udGFpbmVyOiBtb3ZpbmcsIHJlbW92aW5nLCBhbmQgYWRkaW5nIGVsZW1lbnRzCi0JCSAqIGFzIG5lY2Vzc2FyeS4KLQkJICogPHA+Ci0JCSAqIFdlIGNhbiBkbyB0aGlzIGJlY2F1c2U6PHVsPgotCQkgKiA8bGk+dGhlIFhNTCB0cmFuc2xhdG9ycyB3aWxsIDxlbT5tb3ZlPC9lbT4gdGhlIEVNRiBlbGVtZW50cyB3aGVuCi0JCSAqIGFwcHJvcHJpYXRlIChhcyBvcHBvc2VkIHRvIHNpbXBseSByZWJ1aWxkaW5nIHRoZW0gaW4gcGxhY2UpLgotCQkgKiA8bGk+dGhlIEphdmEgcmVzb3VyY2UgbW9kZWwgd2lsbCByZS11c2UgZXhpc3RpbmcgYW5ub3RhdGlvbnMgd2hlbgotCQkgKiBhcHByb3ByaWF0ZSAoYXMgb3Bwb3NlZCB0byBzaW1wbHkgcmVidWlsZGluZyB0aGVtIGluIHBsYWNlKS4KLQkJICogPC91bD4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCQlzeW5jKHRydWUpOyAgLy8gdHJ1ZSA9IHN5bmMKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlICNzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKEFkYXB0ZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlzeW5jKGZhbHNlKTsgIC8vIGZhbHNlID0gdXBkYXRlCi0JCX0KLQotCQkvKioKLQkJICogVGhlIHNwZWNpZmllZCA8Y29kZT5zeW5jPC9jb2RlPiBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYW55IHN1cnZpdmluZwotCQkgKiBjb250ZXh0IG5vZGVzIGFyZSBlaXRoZXIgPGVtPnN5bmNocm9uaXplZDwvZW0+ICg8Y29kZT50cnVlPC9jb2RlPikgb3IKLQkJICogPGVtPnVwZGF0ZWQ8L2VtPiAoPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHN5bmMoYm9vbGVhbiBzeW5jKSB7Ci0JCQlIYXNoU2V0PEM+IGNvbnRleHRFbGVtZW50cyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5nZXRDb250ZXh0RWxlbWVudHMoKSk7Ci0JCQlpbnQgcmVzb3VyY2VJbmRleCA9IDA7Ci0KLQkJCWZvciAoUiByZXNvdXJjZUVsZW1lbnQgOiB0aGlzLmdldFJlc291cmNlRWxlbWVudHMoKSkgewotCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEM+IHN0cmVhbSA9IGNvbnRleHRFbGVtZW50cy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQkJQyBjb250ZXh0RWxlbWVudCA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmdldFJlc291cmNlRWxlbWVudChjb250ZXh0RWxlbWVudCksIHJlc291cmNlRWxlbWVudCkpIHsKLQkJCQkJCS8vIHdlIGRvbid0IGtub3cgdGhlIHNvdXJjZSBpbmRleCBiZWNhdXNlIHRoZSBlbGVtZW50IGhhcyBiZWVuIG1vdmVkIGJ5IHByZXZpb3VzbHkgbW92ZWQgZWxlbWVudHMKLQkJCQkJCXRoaXMubW92ZUNvbnRleHRFbGVtZW50KHJlc291cmNlSW5kZXgsIGNvbnRleHRFbGVtZW50KTsKLQkJCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJCWlmIChzeW5jKSB7Ci0JCQkJCQkJY29udGV4dEVsZW1lbnQuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQljb250ZXh0RWxlbWVudC51cGRhdGUoKTsKLQkJCQkJCX0KLQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICggISBtYXRjaCkgewotCQkJCQkvLyBhZGRlZCBlbGVtZW50cyBhcmUgc3luYydlZCBkdXJpbmcgY29uc3RydWN0aW9uIG9yIHdpbGwgYmUKLQkJCQkJLy8gdXBkYXRlZCBkdXJpbmcgdGhlIG5leHQgInVwZGF0ZSIgKHdoaWNoIGlzIHRyaWdnZXJlZCBieQotCQkJCQkvLyB0aGVpciBhZGRpdGlvbiB0byB0aGUgbW9kZWwpCi0JCQkJCXRoaXMuYWRkQ29udGV4dEVsZW1lbnQocmVzb3VyY2VJbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmVzb3VyY2VJbmRleCsrOwotCQkJfQotCQkJLy8gcmVtb3ZlIGFueSBsZWZ0b3ZlciBjb250ZXh0IGVsZW1lbnRzCi0JCQlmb3IgKEMgY29udGV4dEVsZW1lbnQgOiBjb250ZXh0RWxlbWVudHMpIHsKLQkJCQl0aGlzLnJlbW92ZUNvbnRleHRFbGVtZW50KGNvbnRleHRFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCB0byBzeW5jaHJvbml6ZSBhIGNvbnRleHQgbGlzdCBjb250YWluZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZwotCSAqIHJlc291cmNlIGNvbnRhaW5lci4KLQkgKiBAcGFyYW0gPEM+IHRoZSB0eXBlIG9mIGNvbnRleHQgZWxlbWVudHMKLQkgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIHJlc291cmNlIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIExpc3RDb250YWluZXI8QywgUj4KLQkJZXh0ZW5kcyBDb2xsZWN0aW9uQ29udGFpbmVyPEMsIFI+IHsKLQotCQlwcm90ZWN0ZWQgTGlzdENvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIExpc3RJdGVyYWJsZTxDPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxDPih0aGlzLmNvbnRleHRFbGVtZW50cyk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGFic3RyYWN0IExpc3RJdGVyYWJsZTxSPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgaW50IGluZGV4T2ZDb250ZXh0RWxlbWVudChDIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250ZXh0RWxlbWVudHMuaW5kZXhPZihjb250ZXh0RWxlbWVudCk7Ci0JCX0KLQotCQlwdWJsaWMgQyBnZXRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRleHRFbGVtZW50cy5lbGVtZW50QXQoaW5kZXgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCBhIGNvbnRleHQgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBlbGVtZW50IGF0IHRoZQotCQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEMgYWRkQ29udGV4dEVsZW1lbnRfKGludCBpbmRleCwgQyBjb250ZXh0RWxlbWVudCkgewotCQkJQWJzdHJhY3RKYXhiTm9kZS50aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbnRleHRFbGVtZW50LCB0aGlzLmNvbnRleHRFbGVtZW50cywgdGhpcy5nZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSk7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQ7Ci0JCX0KLQotCQkvKioKLQkJICogTW92ZSB0aGUgY29udGV4dCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4IHRvIHRoZSAKLQkJICogc3BlY2lmaWVkIHNvdXJjZSBpbmRleC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJdGhpcy5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHRoaXMuY29udGV4dEVsZW1lbnRzLmdldChzb3VyY2VJbmRleCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBDIGVsZW1lbnQpIHsKLQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY29udGV4dCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgY29udGFpbmVyLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCQlBYnN0cmFjdEpheGJOb2RlLnRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmNvbnRleHRFbGVtZW50cywgdGhpcy5nZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQkJTGlzdEl0ZXJhYmxlPFI+IHJlc291cmNlRWxlbWVudHMgPSBnZXRSZXNvdXJjZUVsZW1lbnRzKCk7Ci0JCQkKLQkJCWludCBpbmRleCA9IDA7Ci0JCQlmb3IgKFIgcmVzb3VyY2VFbGVtZW50IDogcmVzb3VyY2VFbGVtZW50cykgewotCQkJCWlmICh0aGlzLmdldENvbnRleHRFbGVtZW50c1NpemUoKSA+IGluZGV4KSB7Ci0JCQkJCWlmICh0aGlzLmdldENvbnRleHRFbGVtZW50KGluZGV4KSAhPSByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCQkJCXRoaXMuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoaXMuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHJlc291cmNlRWxlbWVudCk7CQkJCi0JCQkJfQotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCQkKLQkJCWZvciAoIDsgaW5kZXggPCB0aGlzLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsgKSB7Ci0JCQkJdGhpcy5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGFwdGVyIHVzZWQgdG8gc3luY2hyb25pemUgYSBjb250ZXh0IGxpc3QgY29udGFpbmVyIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiByZXNvdXJjZSBjb250YWluZXIuCi0JICogQHBhcmFtIDxDPiB0aGUgdHlwZSBvZiBjb250ZXh0IGVsZW1lbnRzCi0JICogQHBhcmFtIDxSPiB0aGUgdHlwZSBvZiByZXNvdXJjZSBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBDb250ZXh0TGlzdENvbnRhaW5lcjxDIGV4dGVuZHMgSmF4YkNvbnRleHROb2RlLCBSPgotCQlleHRlbmRzIENvbnRleHRDb2xsZWN0aW9uQ29udGFpbmVyPEMsIFI+IHsKLQotCQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBMaXN0SXRlcmFibGU8Qz4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8Qz4odGhpcy5jb250ZXh0RWxlbWVudHMpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBMaXN0SXRlcmFibGU8Uj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY29udGV4dCBlbGVtZW50LgotCQkgKi8KLQkJcHVibGljIGludCBpbmRleE9mQ29udGV4dEVsZW1lbnQoQyBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIHRoaXMuY29udGV4dEVsZW1lbnRzLmluZGV4T2YoY29udGV4dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIEMgZ2V0Q29udGV4dEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250ZXh0RWxlbWVudHMuZWxlbWVudEF0KGluZGV4KTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgYSBjb250ZXh0IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgZWxlbWVudCBhdCB0aGUKLQkJICogc3BlY2lmaWVkIGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDIGFkZENvbnRleHRFbGVtZW50XyhpbnQgaW5kZXgsIEMgY29udGV4dEVsZW1lbnQpIHsKLQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBjb250ZXh0RWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1vdmUgdGhlIGNvbnRleHQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleCB0byB0aGUgCi0JCSAqIHNwZWNpZmllZCBzb3VyY2UgaW5kZXguCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXRoaXMubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCB0aGlzLmNvbnRleHRFbGVtZW50cy5nZXQoc291cmNlSW5kZXgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgY29udGV4dCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgQyBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEpheGJOb2RlLnRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIGVsZW1lbnQsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIGNvbnRleHQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIGNvbnRhaW5lci4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCkgewotCQkJQWJzdHJhY3RKYXhiTm9kZS50aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRFbGVtZW50KEMgY29udGV4dEVsZW1lbnQpIHsKLQkJCUFic3RyYWN0SmF4Yk5vZGUudGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoY29udGV4dEVsZW1lbnQsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0Fic3RyYWN0SmF4YlBsYXRmb3JtRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNzVlM2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKQVhCIHBsYXRmb3JtIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIAotICogKGkuZS4gdW5jaGFuZ2luZyBvbmNlIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4YlBsYXRmb3JtRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybURlZmluaXRpb24gewotCQotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBqYXZhVG9TY2hlbWFUeXBlczsKLQkKLQlwcml2YXRlIEFubm90YXRpb25EZWZpbml0aW9uW10gYW5ub3RhdGlvbkRlZmluaXRpb25zOwotCi0JcHJpdmF0ZSBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0JCi0JcHJpdmF0ZSBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gcmVzb3VyY2VNb2RlbFByb3ZpZGVyczsKLQotCXByaXZhdGUgQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zOwotCi0JcHJpdmF0ZSBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBzcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zOwotCi0vLwlwcml2YXRlIFJlc291cmNlRGVmaW5pdGlvbltdIHJlc291cmNlRGVmaW5pdGlvbnM7Ci0KLQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwbGF0Zm9ybS15IHRoaW5ncyAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hVHlwZU1hcHBpbmcoU3RyaW5nIGphdmFUeXBlTmFtZSkgewotCQlpZiAodGhpcy5qYXZhVG9TY2hlbWFUeXBlcyA9PSBudWxsKSB7Ci0JCQkgdGhpcy5qYXZhVG9TY2hlbWFUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQkJIHRoaXMuamF2YVRvU2NoZW1hVHlwZXMucHV0QWxsKGJ1aWxkSmF2YVRvU2NoZW1hVHlwZXMoKSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuamF2YVRvU2NoZW1hVHlwZXMuZ2V0KGphdmFUeXBlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkSmF2YVRvU2NoZW1hVHlwZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JcHVibGljIEFubm90YXRpb25EZWZpbml0aW9uW10gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25zOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBidWlsZEFubm90YXRpb25EZWZpbml0aW9ucygpOwotCi0KLQkvLyAqKioqKioqKioqIG5lc3RhYmxlIGFubm90YXRpb24gZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMubmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5uZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucyA9IHRoaXMuYnVpbGROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLm5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gYnVpbGROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpOwotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI+IGdldFJlc291cmNlTW9kZWxQcm92aWRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmFibGU8SmF4YlJlc291cmNlTW9kZWxQcm92aWRlcj4oZ2V0UmVzb3VyY2VNb2RlbFByb3ZpZGVyc18oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcltdIGdldFJlc291cmNlTW9kZWxQcm92aWRlcnNfKCkgewotCQlpZiAodGhpcy5yZXNvdXJjZU1vZGVsUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMucmVzb3VyY2VNb2RlbFByb3ZpZGVycyA9IHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VNb2RlbFByb3ZpZGVyczsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSBidWlsZFJlc291cmNlTW9kZWxQcm92aWRlcnMoKTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIEl0ZXJhYmxlPERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID0gdGhpcy5idWlsZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBidWlsZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+KCk7Ci0JCXRoaXMuYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCXJldHVybiBkZWZpbml0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBUbyB0aGUgc3BlY2lmaWVkIGxpc3QsIGFkZCBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgYW5hbHl6aW5nIHRoZQotCSAqIGRlZmF1bHQgbWFwcGluZyBvZiBhbiBhdHRyaWJ1dGUuIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQsCi0JICogYXMgb25jZSBhIG1hcHBpbmcgZGVmaW5pdGlvbiB0ZXN0cyBwb3NpdGl2ZSBmb3IgYW4gYXR0cmlidXRlLAotCSAqIGFsbCBmb2xsb3dpbmcgbWFwcGluZyBkZWZpbml0aW9ucyBhcmUgaWdub3JlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucyk7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIEl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGJ1aWxkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4oKTsKLQkJdGhpcy5hZGRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOwotCQlyZXR1cm4gZGVmaW5pdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVG8gdGhlIHNwZWNpZmllZCBsaXN0LCBhZGQgbWFwcGluZyBkZWZpbml0aW9ucyB0byB1c2UgZm9yIGFuYWx5emluZyB0aGUKLQkgKiBzcGVjaWZpZWQgbWFwcGluZyBvZiBhbiBhdHRyaWJ1dGUgZ2l2ZW4gYWxsIGFubm90YXRpb25zIG9uIGl0LiBUaGUgb3JkZXIKLQkgKiBpcyBpbXBvcnRhbnQsIGFzIG9uY2UgYSBtYXBwaW5nIGRlZmluaXRpb24gdGVzdHMgcG9zaXRpdmUgZm9yIGFuCi0JICogYXR0cmlidXRlLCBhbGwgZm9sbG93aW5nIG1hcHBpbmcgZGVmaW5pdGlvbnMgYXJlIGlnbm9yZWQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKTsKLQotCi0vLwkvLyAqKioqKioqKioqIE1hcHBpbmcgRmlsZXMgKioqKioqKioqKgotLy8JCi0vLwlwdWJsaWMgTGlzdEl0ZXJhdG9yPFJlc291cmNlRGVmaW5pdGlvbj4gcmVzb3VyY2VEZWZpbml0aW9ucygpIHsKLS8vCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhdG9yPFJlc291cmNlRGVmaW5pdGlvbj4oZ2V0UmVzb3VyY2VEZWZpbml0aW9ucygpKTsKLS8vCX0KLS8vCQotLy8JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZXNvdXJjZURlZmluaXRpb25bXSBnZXRSZXNvdXJjZURlZmluaXRpb25zKCkgewotLy8JCWlmICh0aGlzLnJlc291cmNlRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotLy8JCQl0aGlzLnJlc291cmNlRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkUmVzb3VyY2VEZWZpbml0aW9ucygpOwotLy8JCX0KLS8vCQlyZXR1cm4gdGhpcy5yZXNvdXJjZURlZmluaXRpb25zOwotLy8JfQotLy8JCi0vLwlwcm90ZWN0ZWQgYWJzdHJhY3QgUmVzb3VyY2VEZWZpbml0aW9uW10gYnVpbGRSZXNvdXJjZURlZmluaXRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJQcm9qZWN0LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpheGJQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZTcyY2UuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKYXhiUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQml0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRocmVhZExvY2FsQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TbmFwc2hvdENsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuU3luY2hyb25vdXNTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LnN5bmNocm9uaXplcnMuU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuU2NoZW1hTGlicmFyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJwcm9wcy5KYXhiUHJvcGVydGllc1Jlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSUxpYnJhcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEpBWEIgcHJvamVjdC4gSG9sZHMgYWxsIHRoZSBKQVhCIHN0dWZmLgotICogCi0gKiBUaGUgSkFYQiBwbGF0Zm9ybSBwcm92aWRlcyB0aGUgaG9va3MgZm9yIHZlbmRvci1zcGVjaWZpYyBzdHVmZi4KLSAqIAotICogVGhlIEpBWEIgZmlsZXMgYXJlIHRoZSAicmVzb3VyY2UiIG1vZGVsIChpLmUuIG9iamVjdHMgdGhhdCBjb3JyZXNwb25kIGRpcmVjdGx5Ci0gKiB0byBFY2xpcHNlIHJlc291cmNlczsgZS5nLiBKYXZhIHNvdXJjZSBjb2RlIGZpbGVzLCBYTUwgZmlsZXMsIEpBUiBmaWxlcykuCi0gKiAKLSAqIFRoZSByb290IGNvbnRleHQgbm9kZSBpcyB0aGUgImNvbnRleHQiIG1vZGVsIChpLmUuIG9iamVjdHMgdGhhdCBhdHRlbXB0IHRvCi0gKiBtb2RlbCB0aGUgSkFYQiBzcGVjLCB1c2luZyB0aGUgInJlc291cmNlIiBtb2RlbCBhcyBhbiBhZGFwdGVyIHRvIHRoZSBFY2xpcHNlCi0gKiByZXNvdXJjZXMpLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXhiUHJvamVjdAotCWV4dGVuZHMgQWJzdHJhY3RKYXhiTm9kZQotCWltcGxlbWVudHMgSmF4YlByb2plY3QgewotCQotCS8qKgotCSAqIFRoZSBFY2xpcHNlIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgSkFYQiBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0OwotCQotCS8qKgotCSAqIFRoZSB2ZW5kb3Itc3BlY2lmaWMgSkFYQiBwbGF0Zm9ybSB0aGF0IGJ1aWxkcyB0aGUgSkFYQiBwcm9qZWN0Ci0JICogYW5kIGFsbCBpdHMgY29udGVudHMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEpheGJQbGF0Zm9ybSBqYXhiUGxhdGZvcm07Ci0JCi0JLyoqCi0JICogVGhlIGxpYnJhcnkgb2Ygc2NoZW1hcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFNjaGVtYUxpYnJhcnlJbXBsIHNjaGVtYUxpYnJhcnk7Ci0JCi0JLyoqCi0JICogVGhlIEpBWEIgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVhCIHByb2plY3Q6Ci0JICogICAgIGphdmEKLQkgKiAgICAgamF4Yi5pbmRleAotCSAqICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlcwotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8SmF4YkZpbGU+IGpheGJGaWxlcyA9IG5ldyBWZWN0b3I8SmF4YkZpbGU+KCk7Ci0KLS8vCS8qKgotLy8JICogVGhlICJleHRlcm5hbCIgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0cyAoc291cmNlKS4gUG9wdWxhdGVkIHVwb24gZGVtYW5kLgotLy8JICovCi0vLwlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzID0gbmV3IFZlY3RvcjxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+KCk7Ci0vLwotLy8JLyoqCi0vLwkgKiBUaGUgImV4dGVybmFsIiBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgKGJpbmFyeSkuIFBvcHVsYXRlZCB1cG9uIGRlbWFuZC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIGZpbmFsIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUgZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlOwotCi0JLyoqCi0JICogUmVzb3VyY2UgbW9kZWxzIG5vdGlmeSB0aGlzIGxpc3RlbmVyIHdoZW4gdGhleSBjaGFuZ2UuIEEgcHJvamVjdCB1cGRhdGUKLQkgKiBzaG91bGQgb2NjdXIgYW55IHRpbWUgYSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgcmVzb3VyY2VNb2RlbExpc3RlbmVyOwotCi0JLyoqCi0JICogVGhlIHJvb3Qgb2YgdGhlIG1vZGVsIHJlcHJlc2VudGluZyB0aGUgY29sbGF0ZWQgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCAKLQkgKiB0aGUgSkFYQiBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKYXhiQ29udGV4dFJvb3QgY29udGV4dFJvb3Q7Ci0KLQkvKioKLQkgKiBBIHBsdWdnYWJsZSBzeW5jaHJvbml6ZXIgdGhhdCBrZWVwcyB0aGUgSkFYQgotCSAqIHByb2plY3QncyBjb250ZXh0IG1vZGVsIHN5bmNocm9uaXplZCB3aXRoIGl0cyByZXNvdXJjZSBtb2RlbCwgZWl0aGVyCi0JICogc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSAob3Igbm90IGF0IGFsbCkuIEEgc3luY2hyb25vdXMgc3luY2hyb25pemVyCi0JICogaXMgdGhlIGRlZmF1bHQuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhIFVJIHNob3VsZAotCSAqIGltbWVkaWF0ZWx5IGNoYW5nZSB0aGlzIHRvIGFuIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIuIEEgc3luY2hyb25vdXMKLQkgKiBzeW5jaHJvbml6ZXIgY2FuIGJlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBpcyBiZWluZyBtYW5pcHVsYXRlZCBieSBhICJiYXRjaCIKLQkgKiAob3Igbm9uLVVJKSBjbGllbnQgKGUuZy4gd2hlbiB0ZXN0aW5nICJzeW5jaHJvbml6YXRpb24iKS4gQSBudWxsIHVwZGF0ZXIKLQkgKiBjYW4gdXNlZCBkdXJpbmcgdGVzdHMgdGhhdCBkbyBub3QgY2FyZSB3aGV0aGVyICJzeW5jaHJvbml6YXRpb24iIG9jY3VyLgotCSAqIENsaWVudHMgd2lsbCBuZWVkIHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIHRoZSBzeW5jaHJvbml6ZXIgaWYgdGhleSByZXF1aXJlCi0JICogYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgU3luY2hyb25pemVyIGNvbnRleHRNb2RlbFN5bmNocm9uaXplcjsKLQlwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBzeW5jaHJvbml6aW5nQ29udGV4dE1vZGVsID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBBIHBsdWdnYWJsZSBzeW5jaHJvbml6ZXIgdGhhdCAidXBkYXRlcyIgdGhlIEpBWEIgcHJvamVjdCwgZWl0aGVyCi0JICogc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSAob3Igbm90IGF0IGFsbCkuIEEgc3luY2hyb25vdXMgdXBkYXRlcgotCSAqIGlzIHRoZSBkZWZhdWx0LCBhbGxvd2luZyBhIG5ld2x5LWNvbnN0cnVjdGVkIEpBWEIgcHJvamVjdCB0byBiZSAidXBkYXRlZCIKLQkgKiB1cG9uIHJldHVybiBmcm9tIHRoZSBjb25zdHJ1Y3Rvci4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGEgVUkgc2hvdWxkCi0JICogaW1tZWRpYXRlbHkgY2hhbmdlIHRoaXMgdG8gYW4gYXN5bmNocm9ub3VzIHVwZGF0ZXIuIEEgc3luY2hyb25vdXMKLQkgKiB1cGRhdGVyIGNhbiBiZSB1c2VkIHdoZW4gdGhlIHByb2plY3QgaXMgYmVpbmcgbWFuaXB1bGF0ZWQgYnkgYSAiYmF0Y2giCi0JICogKG9yIG5vbi1VSSkgY2xpZW50IChlLmcuIHdoZW4gdGVzdGluZyB0aGUgInVwZGF0ZSIgYmVoYXZpb3IpLiBBIG51bGwKLQkgKiB1cGRhdGVyIGNhbiB1c2VkIGR1cmluZyB0ZXN0cyB0aGF0IGRvIG5vdCBjYXJlIHdoZXRoZXIgInN5bmNocm9uaXphdGlvbiIKLQkgKiBvY2N1ci4KLQkgKiBDbGllbnRzIHdpbGwgbmVlZCB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSB0aGUgdXBkYXRlciBpZiB0aGV5IHJlcXVpcmUKLQkgKiBhbiBhc3luY2hyb25vdXMgdXBkYXRlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgdXBkYXRlU3luY2hyb25pemVyOwotCXByb3RlY3RlZCBmaW5hbCBDYWxsYmFja1N5bmNocm9uaXplci5MaXN0ZW5lciB1cGRhdGVTeW5jaHJvbml6ZXJMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFN1cHBvcnQgZm9yIG1vZGlmeWluZyBkb2N1bWVudHMgc2hhcmVkIHdpdGggdGhlIFVJLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvciBtb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXhiUHJvamVjdChKYXhiUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXN1cGVyKG51bGwpOyAgLy8gSlBBIHByb2plY3QgaXMgdGhlIHJvb3Qgb2YgdGhlIGNvbnRhaW5tZW50IHRyZWUKLQkJaWYgKChjb25maWcuZ2V0UHJvamVjdCgpID09IG51bGwpIHx8IChjb25maWcuZ2V0UGxhdGZvcm1EZWZpbml0aW9uKCkgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucHJvamVjdCA9IGNvbmZpZy5nZXRQcm9qZWN0KCk7Ci0JCXRoaXMuamF4YlBsYXRmb3JtID0gbmV3IEpheGJQbGF0Zm9ybUltcGwoY29uZmlnLmdldFBsYXRmb3JtRGVmaW5pdGlvbigpKTsKLQkJCi0JCXRoaXMuc2NoZW1hTGlicmFyeSA9IG5ldyBTY2hlbWFMaWJyYXJ5SW1wbCh0aGlzKTsKLQkJCi0JCXRoaXMubW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IgPSB0aGlzLmJ1aWxkTW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKTsKLQotCQl0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lciA9IHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKTsKLQkJLy8gYnVpbGQgdGhlIEpQQSBmaWxlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBFY2xpcHNlIHByb2plY3QncyBmaWxlcwotCQlJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IgdmlzaXRvciA9IHRoaXMuYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKTsKLQkJdmlzaXRvci52aXNpdFByb2plY3QodGhpcy5wcm9qZWN0KTsKLQotLy8JCXRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlID0gdGhpcy5idWlsZEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZSgpOwotCi0JCXRoaXMuY29udGV4dFJvb3QgPSB0aGlzLmJ1aWxkQ29udGV4dFJvb3QoKTsKLQotCQkvLyB0aGVyZSAqc2hvdWxkbid0KiBiZSBhbnkgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UgbW9kZWwuLi4KLQkJdGhpcy5zZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJfKHRoaXMuYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpKTsKLQotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyID0gdGhpcy5idWlsZFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyKCk7Ci0JCS8vICJ1cGRhdGUiIHRoZSBwcm9qZWN0IGJlZm9yZSByZXR1cm5pbmcKLQkJdGhpcy5zZXRVcGRhdGVTeW5jaHJvbml6ZXJfKHRoaXMuYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplcigpKTsKLQotLy8JCS8vIHN0YXJ0IGxpc3RlbmluZyB0byB0aGlzIGNhY2hlIG9uY2UgdGhlIGNvbnRleHQgbW9kZWwgaGFzIGJlZW4gYnVpbHQKLS8vCQkvLyBhbmQgYWxsIHRoZSBleHRlcm5hbCB0eXBlcyBhcmUgZmF1bHRlZCBpbgotLy8JCXRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlLmFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgYnVpbGRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IgYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCk7Ci0JfQotLy8KLS8vCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlIGJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlKCkgewotLy8JCXJldHVybiBuZXcgQmluYXJ5UGVyc2lzdGVudFR5cGVDYWNoZSh0aGlzLmpwYVBsYXRmb3JtLmdldEFubm90YXRpb25Qcm92aWRlcigpKTsKLS8vCX0KLQotCXByb3RlY3RlZCBKYXhiQ29udGV4dFJvb3QgYnVpbGRDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJ1aWxkQ29udGV4dFJvb3QodGhpcyk7Ci0JfQotCi0JLy8gKioqKiogaW5uZXIgY2xhc3MKLQlwcm90ZWN0ZWQgY2xhc3MgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJcHJvdGVjdGVkIEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHJvdGVjdGVkIHZvaWQgdmlzaXRQcm9qZWN0KElQcm9qZWN0IHApIHsKLQkJCXRyeSB7Ci0JCQkJcC5hY2NlcHQodGhpcywgSVJlc291cmNlLk5PTkUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4gLSB3ZSBkb24ndCB0aHJvdyBhbnkgQ29yZUV4Y2VwdGlvbnMKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIGEgSlBBIGZpbGUgZm9yIGV2ZXJ5IFthcHByb3ByaWF0ZV0gZmlsZSBlbmNvdW50ZXJlZCBieSB0aGUgdmlzaXRvcgotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSByZXNvdXJjZSkgewotCQkJc3dpdGNoIChyZXNvdXJjZS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDogIC8vIHNob3VsZG4ndCBoYXBwZW4KLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQlBYnN0cmFjdEpheGJQcm9qZWN0LnRoaXMuYWRkSmF4YkZpbGVfKChJRmlsZSkgcmVzb3VyY2UucmVxdWVzdFJlc291cmNlKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJfQotCQl9Ci0JfQotCi0KLS8vCS8vICoqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqCi0vLwotLy8JLyoqCi0vLwkgKiBJZ25vcmUgY2hhbmdlcyB0byB0aGlzIGNvbGxlY3Rpb24uIEFkZHMgY2FuIGJlIGlnbm9yZWQgc2luY2UgdGhleSBhcmUgdHJpZ2dlcmVkCi0vLwkgKiBieSByZXF1ZXN0cyB0aGF0IHdpbGwsIHRoZW1zZWx2ZXMsIHRyaWdnZXIgdXBkYXRlcyAodHlwaWNhbGx5IGR1cmluZyB0aGUKLS8vCSAqIHVwZGF0ZSBvZiBhbiBvYmplY3QgdGhhdCBjYWxscyBhIHNldHRlciB3aXRoIHRoZSBuZXdseS1jcmVhdGVkIHJlc291cmNlCi0vLwkgKiB0eXBlKS4gRGVsZXRlcyB3aWxsIGJlIGFjY29tcGFuaWVkIGJ5IG1hbnVhbCB1cGRhdGVzLgotLy8JICovCi0vLwlAT3ZlcnJpZGUKLS8vCXByb3RlY3RlZCB2b2lkIGFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKLS8vCQlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLS8vCQlub25VcGRhdGVBc3BlY3ROYW1lcy5hZGQoRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmFsIHF1ZXJpZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJQcm9qZWN0IGdldEpheGJQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3QuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3Q7Ci0JfQotCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUGxhdGZvcm0gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQbGF0Zm9ybTsKLQl9Ci0JCi0JcHVibGljIFNjaGVtYUxpYnJhcnkgZ2V0U2NoZW1hTGlicmFyeSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hTGlicmFyeTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBnZXRDb21iaW5lZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpOwotLy8JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PigKLS8vCQkJCQl0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpLAotLy8JCQkJCXRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkKLS8vCQkJCSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSkFYQiBmaWxlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF4YkZpbGU+IGdldEpheGJGaWxlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXhiRmlsZT4odGhpcy5qYXhiRmlsZXMpOyAgLy8gcmVhZC1vbmx5Ci0JfQotCi0JcHVibGljIGludCBnZXRKYXhiRmlsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5qYXhiRmlsZXMuc2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiRmlsZT4gZ2V0SmF4YkZpbGVzKGZpbmFsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJGaWxlPih0aGlzLmdldEpheGJGaWxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXhiRmlsZSBqYXhiRmlsZSkgewotCQkJCXJldHVybiBqYXhiRmlsZS5nZXRDb250ZW50VHlwZSgpLmlzS2luZE9mKGNvbnRlbnRUeXBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkZpbGUgZ2V0SmF4YkZpbGUoSUZpbGUgZmlsZSkgewotCQlmb3IgKEpheGJGaWxlIGpheGJGaWxlIDogdGhpcy5nZXRKYXhiRmlsZXMoKSkgewotCQkJaWYgKGpheGJGaWxlLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpIHsKLQkJCQlyZXR1cm4gamF4YkZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgSkFYQiBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUsIGlmIGFwcHJvcHJpYXRlLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSkFYQiBGaWxlIHdhcyBjcmVhdGVkIGFuZCBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkSmF4YkZpbGUoSUZpbGUgZmlsZSkgewotCQlKYXhiRmlsZSBqYXhiRmlsZSA9IHRoaXMuYWRkSmF4YkZpbGVfKGZpbGUpOwotCQlpZiAoamF4YkZpbGUgIT0gbnVsbCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKEpBWEJfRklMRVNfQ09MTEVDVElPTiwgamF4YkZpbGUpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBBZGQgYSBKQVhCIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSwgaWYgYXBwcm9wcmlhdGUsIHdpdGhvdXQgZmlyaW5nCi0JICogYW4gZXZlbnQ7IHVzZWZ1bCBkdXJpbmcgY29uc3RydWN0aW9uLgotCSAqIFJldHVybiB0aGUgbmV3IEpBWEIgZmlsZSwgbnVsbCBpZiBpdCB3YXMgbm90IGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIEpheGJGaWxlIGFkZEpheGJGaWxlXyhJRmlsZSBmaWxlKSB7Ci0JCWlmIChpc0phdmFGaWxlKGZpbGUpKSB7Ci0JCQlpZiAoISBnZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgoZmlsZSkpIHsKLQkJCQkvLyBhIGphdmEgKC5qYXIgb3IgLmphdmEpIGZpbGUgbXVzdCBiZSBvbiB0aGUgSmF2YSBjbGFzc3BhdGgKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQllbHNlIGlmICghIGlzSW5BY2NlcHRhYmxlUmVzb3VyY2VMb2NhdGlvbihmaWxlKSkgewotCQkJcmV0dXJuIG51bGw7ICAKLQkJfQotCi0JCUpheGJGaWxlIGpheGJGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWpheGJGaWxlID0gdGhpcy5nZXRQbGF0Zm9ybSgpLmJ1aWxkSmF4YkZpbGUodGhpcywgZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2xvZyBhbnkgZGV2ZWxvcGVyIGV4Y2VwdGlvbnMgYW5kIGRvbid0IGJ1aWxkIGEgSmF4YkZpbGUgcmF0aGVyCi0JCQkvL3RoYW4gY29tcGxldGVseSBmYWlsaW5nIHRvIGJ1aWxkIHRoZSBKYXhiUHJvamVjdAotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCWlmIChqYXhiRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlqYXhiRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkuYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLQkJdGhpcy5qYXhiRmlsZXMuYWRkKGpheGJGaWxlKTsKLQkJcmV0dXJuIGpheGJGaWxlOwotCX0KLQkKLQkvKiBmaWxlIGlzIC5qYXZhIG9yIC5qYXIgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0phdmFGaWxlKElGaWxlIGZpbGUpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm1Ub29scy5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJcmV0dXJuIGNvbnRlbnRUeXBlICE9IG51bGwgCi0JCQkJJiYgKGNvbnRlbnRUeXBlLmlzS2luZE9mKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKQotCQkJCQl8fCBjb250ZW50VHlwZS5pc0tpbmRPZihKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKTsKLQl9Ci0JCi0JLyogKG5vbi1qYXZhIHJlc291cmNlKSBmaWxlIGlzIGluIGFjY2VwdGFibGUgcmVzb3VyY2UgbG9jYXRpb24gKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luQWNjZXB0YWJsZVJlc291cmNlTG9jYXRpb24oSUZpbGUgZmlsZSkgewotCQlSZXNvdXJjZUxvY2F0b3IgcmVzb3VyY2VMb2NhdG9yID0gSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IoZ2V0UHJvamVjdCgpKTsKLQkJcmV0dXJuIHJlc291cmNlTG9jYXRvci5hY2NlcHRSZXNvdXJjZUxvY2F0aW9uKGdldFByb2plY3QoKSwgZmlsZS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgSkFYQiBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBJRmlsZSwgaWYgaXQgZXhpc3RzLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSkFYQiBGaWxlIHdhcyByZW1vdmVkLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVKYXhiRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpheGJGaWxlIGpheGJGaWxlID0gdGhpcy5nZXRKYXhiRmlsZShmaWxlKTsKLQkJaWYgKGpheGJGaWxlICE9IG51bGwpIHsgIC8vIGEgSnBhRmlsZSBpcyBub3QgYWRkZWQgZm9yIGV2ZXJ5IElGaWxlCi0JCQl0aGlzLnJlbW92ZUpheGJGaWxlKGpheGJGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgSkFYQiBmaWxlIGFuZCByZW1vdmUgaXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSmF4YkZpbGUoSmF4YkZpbGUgamF4YkZpbGUpIHsKLQkJamF4YkZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpLnJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0JCWlmICggISB0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqYXhiRmlsZSwgdGhpcy5qYXhiRmlsZXMsIEpBWEJfRklMRVNfQ09MTEVDVElPTikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF4YkZpbGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQotLy8JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgKHNvdXJjZSBvciBiaW5hcnkpICoqKioqKioqKioKLS8vCi0vLwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0YWJsZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0vLwkJSVR5cGUgamR0VHlwZSA9IHRoaXMuZmluZFR5cGUodHlwZU5hbWUpOwotLy8JCXJldHVybiAoamR0VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkUGVyc2lzdGFibGVFeHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlKGpkdFR5cGUpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLS8vCQl0cnkgewotLy8JCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLS8vCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLS8vCQkJcmV0dXJuIG51bGw7ICAvLyBpZ25vcmUgZXhjZXB0aW9uPwotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUgYnVpbGRQZXJzaXN0YWJsZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgewotLy8JCUphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGpycHQgPSB0aGlzLmJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShqZHRUeXBlKTsKLS8vCQlyZXR1cm4gKChqcnB0ICE9IG51bGwpICYmIGpycHQuaXNQZXJzaXN0YWJsZSgpKSA/IGpycHQgOiBudWxsOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZEV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgewotLy8JCXJldHVybiBqZHRUeXBlLmlzQmluYXJ5KCkgPwotLy8JCQkJdGhpcy5idWlsZEJpbmFyeUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoamR0VHlwZSkgOgotLy8JCQkJdGhpcy5idWlsZFNvdXJjZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoamR0VHlwZSk7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlIGJ1aWxkQmluYXJ5RXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShJVHlwZSBqZHRUeXBlKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlLmFkZFBlcnNpc3RlbnRUeXBlKGpkdFR5cGUpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBidWlsZFNvdXJjZUV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUoSVR5cGUgamR0VHlwZSkgewotLy8JCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gdGhpcy5nZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqZHRUeXBlLmdldENvbXBpbGF0aW9uVW5pdCgpKTsKLS8vCQlTdHJpbmcgamR0VHlwZU5hbWUgPSBqZHRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOyAgLy8gSkRUIG1lbWJlciB0eXBlIG5hbWVzIHVzZSAnJCcKLS8vCQlmb3IgKEl0ZXJhdG9yPEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlPiBzdHJlYW0gPSBqcmN1LnBlcnNpc3RlbnRUeXBlcygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLS8vCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGUganJwdCA9IHN0cmVhbS5uZXh0KCk7Ci0vLwkJCWlmIChqcnB0LmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHMoamR0VHlwZU5hbWUpKSB7Ci0vLwkJCQlyZXR1cm4ganJwdDsKLS8vCQkJfQotLy8JCX0KLS8vCQkvLyB3ZSBjYW4gZ2V0IGhlcmUgaWYgdGhlIHByb2plY3QgSlJFIGlzIHJlbW92ZWQ7Ci0vLwkJLy8gc2VlIFNvdXJjZUNvbXBpbGF0aW9uVW5pdCNnZXRQcmltYXJ5VHlwZShDb21waWxhdGlvblVuaXQpCi0vLwkJLy8gYnVnIDIyNTMzMgotLy8JCXJldHVybiBudWxsOwotLy8JfQotLy8KLS8vCi0vLwkvLyAqKioqKioqKioqIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlcyAoYmluYXJ5KSAqKioqKioqKioqCi0vLwotLy8JcHVibGljIEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUgZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZUNhY2hlKCkgewotLy8JCXJldHVybiB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZTsKLS8vCX0KLS8vCi0vLwotLy8JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzIChzb3VyY2UpICoqKioqKioqKioKLS8vCi0vLwlwdWJsaWMgSXRlcmF0b3I8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBleHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7Ci0vLwkJcmV0dXJuIHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkuaXRlcmF0b3IoKTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7Ci0vLwkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+KHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKTsgIC8vIHJlYWQtb25seQotLy8JfQotLy8KLS8vCXB1YmxpYyBpbnQgZXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzU2l6ZSgpIHsKLS8vCQlyZXR1cm4gdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMuc2l6ZSgpOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBjb21waWxhdGlvbiB1bml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZAotLy8JICogSkRUIGNvbXBpbGF0aW9uIHVuaXQuIElmIGl0IGRvZXMgbm90IGV4aXN0LCBidWlsZCBpdC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgewotLy8JCWZvciAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgOiB0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKSB7Ci0vLwkJCWlmIChqcmN1LmdldENvbXBpbGF0aW9uVW5pdCgpLmVxdWFscyhqZHRDb21waWxhdGlvblVuaXQpKSB7Ci0vLwkJCQkvLyB3ZSB3aWxsIGdldCBoZXJlIGlmIHRoZSBKUkNVIGNvdWxkIG5vdCBidWlsZCBpdHMgcGVyc2lzdGVudCB0eXBlLi4uCi0vLwkJCQlyZXR1cm4ganJjdTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gdGhpcy5hZGRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqZHRDb21waWxhdGlvblVuaXQpOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogQWRkIGFuIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBhZGRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgewotLy8JCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqZHRDb21waWxhdGlvblVuaXQpOwotLy8JCXRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihqcmN1LCB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cywgRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OKTsKLS8vCQlqcmN1LmFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcih0aGlzLnJlc291cmNlTW9kZWxMaXN0ZW5lcik7Ci0vLwkJcmV0dXJuIGpyY3U7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBidWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgewotLy8JCXJldHVybiBuZXcgU291cmNlVHlwZUNvbXBpbGF0aW9uVW5pdCgKLS8vCQkJCQlqZHRDb21waWxhdGlvblVuaXQsCi0vLwkJCQkJdGhpcy5qcGFQbGF0Zm9ybS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLS8vCQkJCQl0aGlzLmpwYVBsYXRmb3JtLmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCksCi0vLwkJCQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcgotLy8JCQkJKTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJRmlsZSBmaWxlKSB7Ci0vLwkJZm9yIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA6IHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpIHsKLS8vCQkJaWYgKGpyY3UuZ2V0RmlsZSgpLmVxdWFscyhmaWxlKSkgewotLy8JCQkJdGhpcy5yZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqcmN1KTsKLS8vCQkJCXJldHVybiB0cnVlOwotLy8JCQl9Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCByZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSkgewotLy8JCWpyY3UucmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLS8vCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqcmN1LCB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cywgRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBjb250ZXh0IG1vZGVsICoqKioqKioqKioKLQkKLQlwdWJsaWMgSmF4YkNvbnRleHRSb290IGdldENvbnRleHRSb290KCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0Um9vdDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXZhQ29udGV4dE5vZGU+IGdldFByaW1hcnlKYXZhTm9kZXMoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlJRmlsZSBmaWxlID0gZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKGN1KTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewkKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlpZiAoY29udGVudFR5cGUuaXNLaW5kT2YoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJQYWNrYWdlSW5mbz4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJUGFja2FnZURlY2xhcmF0aW9uLCBKYXhiUGFja2FnZUluZm8+KAotCQkJCQkJCQluZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZURlY2xhcmF0aW9uPihjdS5nZXRQYWNrYWdlRGVjbGFyYXRpb25zKCkpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIEpheGJQYWNrYWdlSW5mbyB0cmFuc2Zvcm0oSVBhY2thZ2VEZWNsYXJhdGlvbiBvKSB7Ci0JCQkJCQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlKG8uZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJCQkJCXJldHVybiAoamF4YlBhY2thZ2UgIT0gbnVsbCkgPyBqYXhiUGFja2FnZS5nZXRQYWNrYWdlSW5mbygpIDogbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9LAotCQkJCQkJTm90TnVsbEZpbHRlci48SmF4YlBhY2thZ2VJbmZvPmluc3RhbmNlKCkpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmlzS2luZE9mKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElUeXBlLCBKYXhiVHlwZT4oCi0JCQkJCQkJCW5ldyBBcnJheUl0ZXJhYmxlPElUeXBlPihjdS5nZXRBbGxUeXBlcygpKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBKYXhiVHlwZSB0cmFuc2Zvcm0oSVR5cGUgbykgewotCQkJCQkJCQlKYXhiVHlwZSBqYXhiVHlwZSA9IGdldENvbnRleHRSb290KCkuZ2V0VHlwZShvLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKTsKLQkJCQkJCQkJcmV0dXJuIGpheGJUeXBlOwotCQkJCQkJCX0KLQkJCQkJCX0sCi0JCQkJCQlOb3ROdWxsRmlsdGVyLjxKYXhiVHlwZT5pbnN0YW5jZSgpKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiAoSUZpbGUpIGN1LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLQkKLS8vCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCi0vLwotLy8JcHVibGljIElGaWxlIGdldFBsYXRmb3JtRmlsZShJUGF0aCBydW50aW1lUGF0aCkgewotLy8JCXJldHVybiBKcHRDb3JlUGx1Z2luLmdldFBsYXRmb3JtRmlsZSh0aGlzLnByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLS8vCX0KLQotCi0vLwotLy8JLyoqCi0vLwkgKiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgZXhpc3RzLCBpcyBzaWduaWZpY2FudCB0byB0aGUgSlBBIHByb2plY3QsIGFuZCBpdHMKLS8vCSAqIGNvbnRlbnQgaXMgYSAia2luZCBvZiIgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUsIHJldHVybiB0aGUgSlBBCi0vLwkgKiByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlOyBvdGhlcndpc2UsIHJldHVybiBudWxsLgotLy8JICovCi0vLwlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKElQYXRoIHJ1bnRpbWVQYXRoLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLS8vCQlJRmlsZSBmaWxlID0gdGhpcy5nZXRQbGF0Zm9ybUZpbGUocnVudGltZVBhdGgpOwotLy8JCXJldHVybiBmaWxlLmV4aXN0cygpID8gdGhpcy5nZXRSZXNvdXJjZU1vZGVsKGZpbGUsIGNvbnRlbnRUeXBlKSA6ICBudWxsOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogSWYgdGhlIHNwZWNpZmllZCBmaWxlIGlzIHNpZ25pZmljYW50IHRvIHRoZSBKUEEgcHJvamVjdCBhbmQgaXRzIGNvbnRlbnQKLS8vCSAqIGlzIGEgImtpbmQgb2YiIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlLCByZXR1cm4gdGhlIEpQQSByZXNvdXJjZSBtb2RlbAotLy8JICogY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZTsgb3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIEpwYVJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbChJRmlsZSBmaWxlLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLS8vCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0vLwkJcmV0dXJuIChqcGFGaWxlID09IG51bGwpID8gbnVsbCA6IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbChjb250ZW50VHlwZSk7Ci0vLwl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGVkIEphdmEgc291cmNlIGNsYXNzZXMgKioqKioqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEphdmFTb3VyY2VSZXNvdXJjZVR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5nZXRJbnRlcm5hbEphdmFTb3VyY2VSZXNvdXJjZVR5cGVTZXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRBbm5vdGF0ZWRKYXZhU291cmNlUmVzb3VyY2VUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+KGdldEphdmFTb3VyY2VSZXNvdXJjZVR5cGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlKSB7Ci0JCQkJcmV0dXJuIHR5cGUuaXNBbm5vdGF0ZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0vLwlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbm5vdGF0ZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpIHsKLS8vCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlVHlwZSwgU3RyaW5nPih0aGlzLmdldEludGVybmFsQW5ub3RhdGVkU291cmNlSmF2YVJlc291cmNlVHlwZXMoKSkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YVJlc291cmNlVHlwZSB0eXBlKSB7Ci0vLwkJCQlyZXR1cm4gdHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0vLwkJCX0KLS8vCQl9OwotLy8JfQotCQotCS8qCi0JICogUmV0dXJuIHRoZSBzZXRzIG9mIHtAbGluayBKYXZhUmVzb3VyY2VUeXBlfXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgamF2YSBzb3VyY2Ugd2l0aGluIHRoaXMgcHJvamVjdAotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+PiBnZXRJbnRlcm5hbEphdmFTb3VyY2VSZXNvdXJjZVR5cGVTZXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+PigKLQkJCQl0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHRyYW5zZm9ybShKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCQkJcmV0dXJuIGNvbXBpbGF0aW9uVW5pdC5nZXRUeXBlcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBnZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiRmlsZSwgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0Pih0aGlzLmdldEphdmFTb3VyY2VKYXhiRmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IHRyYW5zZm9ybShKYXhiRmlsZSBqYXhiRmlsZSkgewotCQkJCXJldHVybiAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KSBqYXhiRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIHJldHVybiBKQVhCIGZpbGVzIHdpdGggSmF2YSBzb3VyY2UgImNvbnRlbnQiCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJGaWxlPiBnZXRKYXZhU291cmNlSmF4YkZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiRmlsZXMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHJlc291cmNlIHBhY2thZ2UgbG9vay11cCAqKioqKioqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVBhY2thZ2U+IGdldEphdmFSZXNvdXJjZVBhY2thZ2VzKCl7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZT4oIAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJGaWxlLCBKYXZhUmVzb3VyY2VQYWNrYWdlPih0aGlzLmdldFBhY2thZ2VJbmZvU291cmNlSmF4YkZpbGVzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlIHRyYW5zZm9ybShKYXhiRmlsZSBqYXhiRmlsZSkgewotCQkJCQkJcmV0dXJuICgoSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQpIGpheGJGaWxlLmdldFJlc291cmNlTW9kZWwoKSkuZ2V0UGFja2FnZSgpOwotCQkJCQl9Ci0JCQkJfSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSkgewotCQkJCXJldHVybiByZXNvdXJjZVBhY2thZ2UgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0SmF2YVJlc291cmNlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VQYWNrYWdlIGpycCA6IHRoaXMuZ2V0SmF2YVJlc291cmNlUGFja2FnZXMoKSkgewotCQkJaWYgKGpycC5nZXROYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKSkgewotCQkJCXJldHVybiBqcnA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlPiBnZXRBbm5vdGF0ZWRKYXZhUmVzb3VyY2VQYWNrYWdlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlPih0aGlzLmdldEphdmFSZXNvdXJjZVBhY2thZ2VzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlUGFja2FnZS5pc0Fubm90YXRlZCgpOyAgLy8gaS5lLiB0aGUgcGFja2FnZSBoYXMgYSB2YWxpZCBwYWNrYWdlIGFubm90YXRpb24KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0QW5ub3RhdGVkSmF2YVJlc291cmNlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBqcnAgPSBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLQkJcmV0dXJuIChqcnAgIT0gbnVsbCAmJiBqcnAuaXNBbm5vdGF0ZWQoKSkgPyBqcnAgOiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gSlBBIGZpbGVzIHdpdGggcGFja2FnZS1pbmZvIHNvdXJjZSAiY29udGVudCIKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF4YkZpbGU+IGdldFBhY2thZ2VJbmZvU291cmNlSmF4YkZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiRmlsZXMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIEphdmEgcmVzb3VyY2UgdHlwZSBsb29rLXVwICoqKioqKioqKioKLQkKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHR5cGUgOiB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGVzKCkpIHsKLQkJCWlmICh0eXBlLmdldFF1YWxpZmllZE5hbWUoKS5lcXVhbHModHlwZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0vLwkJLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHR5cGUgYWxyZWFkeSwgdHJ5IHRvIGJ1aWxkIG5ldyBvbmUgZnJvbSB0aGUgcHJvamVjdCBjbGFzc3BhdGgKLS8vCQlyZXR1cm4gdGhpcy5idWlsZFBlcnNpc3RhYmxlRXh0ZXJuYWxKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZShTdHJpbmcgdHlwZU5hbWUsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5LaW5kIGtpbmQpIHsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGdldEphdmFSZXNvdXJjZVR5cGUodHlwZU5hbWUpOwotCQlpZiAocmVzb3VyY2VUeXBlID09IG51bGwgfHwgcmVzb3VyY2VUeXBlLmdldEtpbmQoKSAhPSBraW5kKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VUeXBlOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEphdmFSZXNvdXJjZVR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlU2V0cygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4+IGdldEphdmFSZXNvdXJjZVR5cGVTZXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlTm9kZS5Sb290LCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+PigKLQkJCQl0aGlzLmdldEphdmFSZXNvdXJjZU5vZGVSb290cygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHRyYW5zZm9ybShKYXZhUmVzb3VyY2VOb2RlLlJvb3Qgcm9vdCkgewotCQkJCXJldHVybiByb290LmdldFR5cGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VOb2RlLlJvb3Q+IGdldEphdmFSZXNvdXJjZU5vZGVSb290cygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXZhUmVzb3VyY2VOb2RlLlJvb3Q+KAotCQkJCQl0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpLyosCi0JCQkJCXRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpLAotCQkJCQl0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpLAotCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b24odGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZVBlcnNpc3RlbnRUeXBlQ2FjaGUpKi8KLQkJCQkpOwotCX0KLQotCQotLy8JLy8gKioqKioqKioqKiBKQVJzICoqKioqKioqKioKLS8vCi0vLwkvLyBUT0RPCi0vLwlwdWJsaWMgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KFN0cmluZyBqYXJGaWxlTmFtZSkgewotLy8vLwkJcmV0dXJuIHRoaXMuZ2V0SmFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KHRoaXMuY29udmVydFRvUGxhdGZvcm1GaWxlKGphckZpbGVOYW1lKSk7Ci0vLwkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmdldFByb2plY3QoKS5nZXRGaWxlKGphckZpbGVOYW1lKSk7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdChJRmlsZSBqYXJGaWxlKSB7Ci0vLwkJZm9yIChKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IHBmciA6IHRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpKSB7Ci0vLwkJCWlmIChwZnIuZ2V0RmlsZSgpLmVxdWFscyhqYXJGaWxlKSkgewotLy8JCQkJcmV0dXJuIHBmcjsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpIHsKLS8vCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SnBhRmlsZSwgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRKYXJKcGFGaWxlcygpKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCB0cmFuc2Zvcm0oSnBhRmlsZSBqcGFGaWxlKSB7Ci0vLwkJCQlyZXR1cm4gKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QpIGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIHJldHVybiBKUEEgZmlsZXMgd2l0aCBKQVIgImNvbnRlbnQiCi0vLwkgKi8KLS8vCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFGaWxlPiBnZXRKYXJKcGFGaWxlcygpIHsKLS8vCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlcyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpOwotLy8JfQotCi0KLQotLy8KLS8vCS8vICoqKioqKioqKiogSmF2YSBzb3VyY2UgZm9sZGVyIG5hbWVzICoqKioqKioqKioKLS8vCi0vLwlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhU291cmNlRm9sZGVyTmFtZXMoKSB7Ci0vLwkJdHJ5IHsKLS8vCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVNvdXJjZUZvbGRlck5hbWVzXygpOwotLy8JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotLy8JCQlKcHRDb3JlUGx1Z2luLmxvZyhleCk7Ci0vLwkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0vLwkJfQotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFTb3VyY2VGb2xkZXJOYW1lc18oKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLS8vCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3QsIFN0cmluZz4odGhpcy5nZXRKYXZhU291cmNlRm9sZGVycygpKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtXyhwZnIpOwotLy8JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCQkJcmV0dXJuICJFcnJvcjogIiArIHBmci5nZXRQYXRoKCk7IC8vJE5PTi1OTFMtMSQKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlwcml2YXRlIFN0cmluZyB0cmFuc2Zvcm1fKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJCQlyZXR1cm4gcGZyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGdldEphdmFTb3VyY2VGb2xkZXJzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4oCi0vLwkJCQl0aGlzLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCksCi0vLwkJCQlTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUgotLy8JCQkpOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmlsdGVyPElQYWNrYWdlRnJhZ21lbnRSb290PiBTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUiA9Ci0vLwkJbmV3IEZpbHRlcjxJUGFja2FnZUZyYWdtZW50Um9vdD4oKSB7Ci0vLwkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIpIHsKLS8vCQkJCXRyeSB7Ci0vLwkJCQkJcmV0dXJuIHRoaXMuYWNjZXB0XyhwZnIpOwotLy8JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCQkJcmV0dXJuIGZhbHNlOwotLy8JCQkJfQotLy8JCQl9Ci0vLwkJCXByaXZhdGUgYm9vbGVhbiBhY2NlcHRfKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0vLwkJCQlyZXR1cm4gcGZyLmV4aXN0cygpICYmIChwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKTsKLS8vCQkJfQotLy8JCX07Ci0vLwotLy8JcHJvdGVjdGVkIEl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnRSb290PiBnZXRQYWNrYWdlRnJhZ21lbnRSb290cygpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotLy8JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOwotLy8JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogamF4Yi5pbmRleCByZXNvdXJjZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiSW5kZXhSZXNvdXJjZT4gZ2V0SmF4YkluZGV4UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YkZpbGUsIEpheGJJbmRleFJlc291cmNlPihnZXRKYXhiRmlsZXMoSnB0SmF4YkNvcmVQbHVnaW4uSkFYQl9JTkRFWF9DT05URU5UX1RZUEUpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXhiSW5kZXhSZXNvdXJjZSB0cmFuc2Zvcm0oSmF4YkZpbGUgbykgewotCQkJCXJldHVybiAoSmF4YkluZGV4UmVzb3VyY2UpIG8uZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSmF4YkluZGV4UmVzb3VyY2UgZ2V0SmF4YkluZGV4UmVzb3VyY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCWZvciAoSmF4YkluZGV4UmVzb3VyY2UgamlyIDogZ2V0SmF4YkluZGV4UmVzb3VyY2VzKCkpIHsKLQkJCWlmIChwYWNrYWdlTmFtZS5lcXVhbHMoamlyLmdldFBhY2thZ2VOYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIGppcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXhiLnByb3BlcnRpZXMgcmVzb3VyY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQcm9wZXJ0aWVzUmVzb3VyY2U+IGdldEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YkZpbGUsIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2U+KGdldEpheGJGaWxlcyhKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX1BST1BFUlRJRVNfQ09OVEVOVF9UWVBFKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF4YlByb3BlcnRpZXNSZXNvdXJjZSB0cmFuc2Zvcm0oSmF4YkZpbGUgbykgewotCQkJCXJldHVybiAoSmF4YlByb3BlcnRpZXNSZXNvdXJjZSkgby5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBKYXhiUHJvcGVydGllc1Jlc291cmNlIGdldEpheGJQcm9wZXJ0aWVzUmVzb3VyY2UoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0JCWZvciAoSmF4YlByb3BlcnRpZXNSZXNvdXJjZSBqcHIgOiBnZXRKYXhiUHJvcGVydGllc1Jlc291cmNlcygpKSB7Ci0JCQlpZiAocGFja2FnZU5hbWUuZXF1YWxzKGpwci5nZXRQYWNrYWdlTmFtZSgpKSkgewotCQkJCXJldHVybiBqcHI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSmF2YSBldmVudHMgKioqKioqKioqKgotCi0JLy8gVE9ETyBoYW5kbGUgY2hhbmdlcyB0byBleHRlcm5hbCBwcm9qZWN0cwotCXB1YmxpYyB2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCXRoaXMucHJvY2Vzc0phdmFEZWx0YShldmVudC5nZXREZWx0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSByZWN1cnNlIGJhY2sgaGVyZSBmcm9tIHtAbGluayAjcHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhKX0uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlzd2l0Y2ggKGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpKSB7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX01PREVMIDoKLQkJCQl0aGlzLnByb2Nlc3NKYXZhTW9kZWxEZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJCXRoaXMucHJvY2Vzc0phdmFQcm9qZWN0RGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCQl0aGlzLnByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50Um9vdERlbHRhKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCXRoaXMucHJvY2Vzc0phdmFQYWNrYWdlRnJhZ21lbnREZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5DT01QSUxBVElPTl9VTklUIDoKLQkJCQl0aGlzLnByb2Nlc3NKYXZhQ29tcGlsYXRpb25Vbml0RGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7IC8vIGlnbm9yZSB0aGUgZWxlbWVudHMgaW5zaWRlIGEgY29tcGlsYXRpb24gdW5pdAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCXRoaXMucHJvY2Vzc0phdmFEZWx0YShjaGlsZCk7IC8vIHJlY3Vyc2UKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSmF2YSBlbGVtZW50IGRlbHRhIGlzIGZvciBhCi0JICoge0BsaW5rIElKYXZhRWxlbWVudERlbHRhI0NIQU5HRUQgQ0hBTkdFRH0KLQkgKiAoYXMgb3Bwb3NlZCB0byB7QGxpbmsgSUphdmFFbGVtZW50RGVsdGEjQURERUQgQURERUR9IG9yCi0JICoge0BsaW5rIElKYXZhRWxlbWVudERlbHRhI1JFTU9WRUQgUkVNT1ZFRH0pIEphdmEgZWxlbWVudAotCSAqIGFuZCB0aGUgc3BlY2lmaWVkIGZsYWcgaXMgc2V0LgotCSAqIChUaGUgZGVsdGEgZmxhZ3MgYXJlIG9ubHkgc2lnbmlmaWNhbnQgaWYgdGhlIGRlbHRhCi0JICoge0BsaW5rIElKYXZhRWxlbWVudERlbHRhI2dldEtpbmQoKSBraW5kfSBpcwotCSAqIHtAbGluayBJSmF2YUVsZW1lbnREZWx0YSNDSEFOR0VEIENIQU5HRUR9LikKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWx0YUZsYWdJc1NldChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgaW50IGZsYWcpIHsKLQkJcmV0dXJuIChkZWx0YS5nZXRLaW5kKCkgPT0gSUphdmFFbGVtZW50RGVsdGEuQ0hBTkdFRCkgJiYKLQkJCQlCaXRUb29scy5mbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgZmxhZyk7Ci0JfQotCi0JLy8gKioqKiogbW9kZWwKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YU1vZGVsRGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gcHJvY2VzcyB0aGUgSmF2YSBtb2RlbCdzIHByb2plY3RzCi0JCXRoaXMucHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQl9Ci0KLQkvLyAqKioqKiBwcm9qZWN0Ci0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0phdmFQcm9qZWN0RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gcHJvY2VzcyB0aGUgSmF2YSBwcm9qZWN0J3MgcGFja2FnZSBmcmFnbWVudCByb290cwotCQl0aGlzLnByb2Nlc3NKYXZhRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0KLQkJLy8gYSBjbGFzc3BhdGggY2hhbmdlIGNhbiBoYXZlIHByZXR0eSBmYXItcmVhY2hpbmcgZWZmZWN0cy4uLgotCQlpZiAodGhpcy5jbGFzc3BhdGhIYXNDaGFuZ2VkKGRlbHRhKSkgewotCQkJdGhpcy5yZWJ1aWxkKChJSmF2YVByb2plY3QpIGRlbHRhLmdldEVsZW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIEphdmEgcHJvamVjdCdzIGNsYXNzcGF0aCBjaGFuZ2VkLiBSZWJ1aWxkIHRoZSBKUEEgcHJvamVjdAotCSAqIGFzIGFwcHJvcHJpYXRlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGQoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCS8vIGlmIHRoZSBjbGFzc3BhdGggaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gdXBkYXRlIGV2ZXJ5dGhpbmcgc2luY2UKLQkJLy8gY2xhc3MgcmVmZXJlbmNlcyBjb3VsZCBub3cgYmUgcmVzb2x2ZWQgKG9yIG5vdCkgZXRjLgotCQlpZiAoamF2YVByb2plY3QuZXF1YWxzKHRoaXMuZ2V0SmF2YVByb2plY3QoKSkpIHsKLQkJCXRoaXMucmVtb3ZlRGVhZEpwYUZpbGVzKCk7Ci0JCQl0aGlzLnN5bmNocm9uaXplV2l0aEphdmFTb3VyY2UodGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIHNlZSBpZiBjaGFuZ2VkIHByb2plY3QgaXMgb24gb3VyIGNsYXNzcGF0aD8KLQkJCS8vdGhpcy5zeW5jaHJvbml6ZVdpdGhKYXZhU291cmNlKHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTG9vcCB0aHJvdWdoIGFsbCBvdXIgSlBBIGZpbGVzLCByZW1vdmUgYW55IHRoYXQgYXJlIG5vIGxvbmdlciBvbiB0aGUKLQkgKiBjbGFzc3BhdGguCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVhZEpwYUZpbGVzKCkgewotCQlmb3IgKEpheGJGaWxlIGpheGJGaWxlIDogdGhpcy5nZXRKYXhiRmlsZXMoKSkgewotCQkJaWYgKHRoaXMuamF4YkZpbGVJc0RlYWQoamF4YkZpbGUpKSB7Ci0JCQkJdGhpcy5yZW1vdmVKYXhiRmlsZShqYXhiRmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBqYXhiRmlsZUlzRGVhZChKYXhiRmlsZSBqYXhiRmlsZSkgewotCQlyZXR1cm4gISB0aGlzLmpheGJGaWxlSXNBbGl2ZShqYXhiRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogU29tZXRpbWVzIChlLmcuIGR1cmluZyB0ZXN0cyksIHdoZW4gYSBwcm9qZWN0IGhhcyBiZWVuIGRlbGV0ZWQsIHdlIGdldCBhCi0JICogSmF2YSBjaGFuZ2UgZXZlbnQgdGhhdCBpbmRpY2F0ZXMgdGhlIEphdmEgcHJvamVjdCBpcyBDSEFOR0VEIChhcwotCSAqIG9wcG9zZWQgdG8gUkVNT1ZFRCwgd2hpY2ggaXMgd2hhdCB0eXBpY2FsbHkgaGFwcGVucykuIFRoZSBldmVudCdzIGRlbHRhCi0JICogaW5kaWNhdGVzIHRoYXQgZXZlcnl0aGluZyBpbiB0aGUgSmF2YSBwcm9qZWN0IGhhcyBiZWVuIGRlbGV0ZWQgYW5kIHRoZQotCSAqIGNsYXNzcGF0aCBoYXMgY2hhbmdlZC4gQWxsIGVudHJpZXMgaW4gdGhlIGNsYXNzcGF0aCBoYXZlIGJlZW4gcmVtb3ZlZDsKLQkgKiBidXQgc2luZ2xlIGVudHJ5IGZvciB0aGUgSmF2YSBwcm9qZWN0J3Mgcm9vdCBmb2xkZXIgaGFzIGJlZW4gYWRkZWQuICghKQotCSAqIFRoaXMgbWVhbnMgYW55IGZpbGUgaW4gdGhlIHByb2plY3QgaXMgb24gdGhlIEphdmEgcHJvamVjdCdzIGNsYXNzcGF0aC4KLQkgKiBUaGlzIGNsYXNzcGF0aCBjaGFuZ2UgaXMgd2hhdCB0cmlnZ2VycyB1cyB0byByZWJ1aWxkIHRoZSBKUEEgcHJvamVjdDsgc28KLQkgKiB3ZSBwdXQgYW4gZXh0cmEgY2hlY2sgaGVyZSB0byBtYWtlIHN1cmUgdGhlIEpQQSBmaWxlJ3MgcmVzb3VyY2UgZmlsZSBpcwotCSAqIHN0aWxsIHByZXNlbnQuCi0JICogPHA+Ci0JICogVGhpcyB3b3VsZCBub3QgYmUgYSBwcm9ibGVtIGlmIERhbGkgcmVjZWl2ZWQgdGhlIHJlc291cmNlIGNoYW5nZSBldmVudAotCSAqIDxlbT5iZWZvcmU8L2VtPiBKRFQgYW5kIHNpbXBseSByZW1vdmVkIHRoZSBKUEEgcHJvamVjdDsgYnV0IEpEVCByZWNlaXZlcwotCSAqIHRoZSByZXNvdXJjZSBjaGFuZ2UgZXZlbnQgZmlyc3QgYW5kIGNvbnZlcnRzIGl0IGludG8gdGhlIHByb2JsZW1hdGljCi0JICogSmF2YSBjaGFuZ2UgZXZlbnQuLi4uIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGpheGJGaWxlSXNBbGl2ZShKYXhiRmlsZSBqYXhiRmlsZSkgewotCQlJRmlsZSBmaWxlID0gamF4YkZpbGUuZ2V0RmlsZSgpOwotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgoZmlsZSkgJiYKLQkJCQlmaWxlLmV4aXN0cygpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246Ci0JICogZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzcGF0aEhhc0NoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuIHRoaXMuZGVsdGFGbGFnSXNTZXQoZGVsdGEsIElKYXZhRWxlbWVudERlbHRhLkZfUkVTT0xWRURfQ0xBU1NQQVRIX0NIQU5HRUQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplV2l0aEphdmFTb3VyY2UoSXRlcmFibGU8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PiBqYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCA6IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMpIHsKLQkJCWphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5zeW5jaHJvbml6ZVdpdGhKYXZhU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50Um9vdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCS8vIHByb2Nlc3MgdGhlIEphdmEgcGFja2FnZSBmcmFnbWVudCByb290J3MgcGFja2FnZSBmcmFnbWVudHMKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCi0JCWlmICh0aGlzLmNsYXNzcGF0aEVudHJ5SGFzQmVlbkFkZGVkKGRlbHRhKSkgewotCQkJLy8gVE9ETyBidWcgMjc3MjE4Ci0JCX0gZWxzZSBpZiAodGhpcy5jbGFzc3BhdGhFbnRyeUhhc0JlZW5SZW1vdmVkKGRlbHRhKSkgeyAgLy8gc2hvdWxkIGJlIG11dHVhbGx5LWV4Y2x1c2l2ZSB3L2FkZGVkICg/KQotCQkJLy8gVE9ETyBidWcgMjc3MjE4Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOgotCSAqIGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc3BhdGhFbnRyeUhhc0JlZW5BZGRlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246Ci0JICogZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzcGF0aEVudHJ5SGFzQmVlblJlbW92ZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuIHRoaXMuZGVsdGFGbGFnSXNTZXQoZGVsdGEsIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCk7Ci0JfQotCi0JLy8gKioqKiogcGFja2FnZSBmcmFnbWVudAotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gcHJvY2VzcyB0aGUgamF2YSBwYWNrYWdlIGZyYWdtZW50J3MgY29tcGlsYXRpb24gdW5pdHMKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCX0KLQotCS8vICoqKioqIGNvbXBpbGF0aW9uIHVuaXQKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUNvbXBpbGF0aW9uVW5pdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmICh0aGlzLmphdmFDb21waWxhdGlvblVuaXREZWx0YUlzUmVsZXZhbnQoZGVsdGEpKSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRDb21iaW5lZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgewotCQkJCWlmIChqcmN1LmdldENvbXBpbGF0aW9uVW5pdCgpLmVxdWFscyhjb21waWxhdGlvblVuaXQpKSB7Ci0JCQkJCWpyY3Uuc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSgpOwotCQkJCQkvLyBUT0RPID8gdGhpcy5yZXNvbHZlSmF2YVR5cGVzKCk7ICAvLyBtaWdodCBoYXZlIG5ldyBtZW1iZXIgdHlwZXMgbm93Li4uCi0JCQkJCWJyZWFrOyAgLy8gdGhlcmUgKnNob3VsZG4ndCogYmUgYW55IG1vcmUuLi4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWdub3JlIHRoZSBqYXZhIGNvbXBpbGF0aW9uIHVuaXQncyBjaGlsZHJlbgotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGphdmFDb21waWxhdGlvblVuaXREZWx0YUlzUmVsZXZhbnQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gaWdub3JlIGNoYW5nZXMgdG8vZnJvbSBwcmltYXJ5IHdvcmtpbmcgY29weSAtIG5vIGNvbnRlbnQgaGFzIGNoYW5nZWQ7Ci0JCS8vIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGZsYWdzIHNldCB0aGF0IGluZGljYXRlICpib3RoKiBhCi0JCS8vIGNoYW5nZSB0by9mcm9tIHByaW1hcnkgd29ya2luZyBjb3B5ICphbmQqIGNvbnRlbnQgaGFzIGNoYW5nZWQKLQkJaWYgKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGlnbm9yZSBqYXZhIG5vdGlmaWNhdGlvbiBmb3IgQURERUQgb3IgUkVNT1ZFRDsKLQkJLy8gdGhlc2UgYXJlIGhhbmRsZWQgdmlhIHJlc291cmNlIG5vdGlmaWNhdGlvbgotCQlyZXR1cm4gZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxJTWVzc2FnZT4gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKElSZXBvcnRlciByZXBvcnRlcikgewotCQlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8SU1lc3NhZ2U+KCk7Ci0JCXRoaXMudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8SU1lc3NhZ2U+KG1lc3NhZ2VzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJZ2V0U2NoZW1hTGlicmFyeSgpLnJlZnJlc2hBbGxTY2hlbWFzKCk7Ci0JCQotCQl2YWxpZGF0ZUxpYnJhcnlQcm92aWRlcihtZXNzYWdlcyk7Ci0JCXZhbGlkYXRlU2NoZW1hTGlicmFyeShtZXNzYWdlcyk7Ci0JCXRoaXMuY29udGV4dFJvb3QudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVMaWJyYXJ5UHJvdmlkZXIoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJdHJ5IHsKLQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwotCQkJSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uID0gZmFjZXRlZFByb2plY3QuZ2V0SW5zdGFsbGVkVmVyc2lvbihKYXhiRmFjZXQuRkFDRVQpOwotCQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQgPSBuZXcgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShmYWNldGVkUHJvamVjdCwgZmFjZXRWZXJzaW9uKTsKLQkJCUlMaWJyYXJ5UHJvdmlkZXIgbHAgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyKCk7Ci0JCQlpZiAobGlkLmdldExpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZygpIGluc3RhbmNlb2YgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIHsKLQkJCQkoKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKCkpLnNldEpheGJQbGF0Zm9ybShnZXRQbGF0Zm9ybSgpLmdldERlc2NyaXB0aW9uKCkpOwotCQkJfQotCQkJaWYgKCEgbHAuaXNFbmFibGVkRm9yKGZhY2V0ZWRQcm9qZWN0LCBmYWNldFZlcnNpb24pIHx8ICEgbGlkLnZhbGlkYXRlKCkuaXNPSygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSLAotCQkJCQkJCXRoaXMpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2NoZW1hTGlicmFyeShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQl0aGlzLnNjaGVtYUxpYnJhcnkudmFsaWRhdGUobWVzc2FnZXMpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGRpc3Bvc2UgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIuc3RvcCgpOwotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplci5zdG9wKCk7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnJlbW92ZUxpc3RlbmVyKHRoaXMudXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUxpYnJhcnkuZGlzcG9zZSgpOwotCQkvLyB0aGUgWE1MIHJlc291cmNlcyBhcmUgaGVsZCBpbmRlZmluaXRlbHkgYnkgdGhlIFdUUCB0cmFuc2xhdG9yIGZyYW1ld29yaywKLQkJLy8gc28gd2UgYmV0dGVyIHJlbW92ZSBvdXIgbGlzdGVuZXIgb3IgdGhlIEpBWEIgcHJvamVjdCB3aWxsIG5vdCBiZSBHQ2VkCi0JCWZvciAoSmF4YkZpbGUgamF4YkZpbGUgOiB0aGlzLmdldEpheGJGaWxlcygpKSB7Ci0JCQlqYXhiRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkucmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCQotCQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWwgbGlzdGVuZXIgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgYnVpbGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFJlc291cmNlTW9kZWxMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBEZWZhdWx0UmVzb3VyY2VNb2RlbExpc3RlbmVyIAotCQlpbXBsZW1lbnRzIEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciAKLQl7Ci0JCXByb3RlY3RlZCBEZWZhdWx0UmVzb3VyY2VNb2RlbExpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKSB7Ci0vLwkJCVN0cmluZyBtc2cgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiByZXNvdXJjZSBtb2RlbCBjaGFuZ2U6ICIgKyBqcGFSZXNvdXJjZU1vZGVsOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLS8vCQkJbmV3IEV4Y2VwdGlvbihtc2cpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJCUFic3RyYWN0SmF4YlByb2plY3QudGhpcy5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbChqcGFSZXNvdXJjZU1vZGVsKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbFJldmVydGVkKEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCkgewotLy8JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoSnBhWG1sUmVzb3VyY2UpanBhUmVzb3VyY2VNb2RlbCk7Ci0vLwkJCUFic3RyYWN0SmF4YlByb2plY3QudGhpcy5yZW1vdmVKYXhiRmlsZShmaWxlKTsKLS8vCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLmFkZEpheGJGaWxlKGZpbGUpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZU1vZGVsVW5sb2FkZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKSB7Ci0vLwkJCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKChKcGFYbWxSZXNvdXJjZSlqcGFSZXNvdXJjZU1vZGVsKTsKLS8vCQkJQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLnJlbW92ZUpheGJGaWxlKGZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVDb250ZXh0TW9kZWwoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGV2ZW50cyAqKioqKioqKioqCi0KLQkvLyBUT0RPIG5lZWQgdG8gZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGV4dGVybmFsIHByb2plY3RzIGFuZCBjb21waWxhdGlvbiB1bml0cwotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmVxdWFscyh0aGlzLmdldFByb2plY3QoKSkpIHsKLQkJCXRoaXMuaW50ZXJuYWxQcm9qZWN0Q2hhbmdlZChkZWx0YSk7Ci0JCX0gZWxzZSB7Ci0vLwkJCXRoaXMuZXh0ZXJuYWxQcm9qZWN0Q2hhbmdlZChkZWx0YSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCVJlc291cmNlRGVsdGFWaXNpdG9yIHJlc291cmNlRGVsdGFWaXNpdG9yID0gdGhpcy5idWlsZEludGVybmFsUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQkJcmVzb3VyY2VEZWx0YVZpc2l0b3IudmlzaXREZWx0YShkZWx0YSk7Ci0JCS8vIGF0IHRoaXMgcG9pbnQsIGlmIHdlIGhhdmUgYWRkZWQgYW5kL29yIHJlbW92ZWQgSnBhRmlsZXMsIGFuICJ1cGRhdGUiIHdpbGwgaGF2ZSBiZWVuIHRyaWdnZXJlZDsKLQkJLy8gYW55IGNoYW5nZXMgdG8gdGhlIHJlc291cmNlIG1vZGVsIGR1cmluZyB0aGUgInJlc29sdmUiIHdpbGwgdHJpZ2dlciBmdXJ0aGVyICJ1cGRhdGVzIjsKLQkJLy8gdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQgdG8gInJlc29sdmUiIGV4dGVybmFsIEphdmEgdHlwZXMgKHRoZXkgY2FuJ3QgaGF2ZSByZWZlcmVuY2VzIHRvCi0JCS8vIHRoZSBpbnRlcm5hbCBKYXZhIHR5cGVzKQotCQlpZiAocmVzb3VyY2VEZWx0YVZpc2l0b3IuZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSgpKSB7Ci0JCQl0aGlzLnJlc29sdmVJbnRlcm5hbEphdmFUeXBlcygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yIGJ1aWxkSW50ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gZmlsZUNoYW5nZUlzU2lnbmlmaWNhbnQoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgewotCQkJCXJldHVybiBBYnN0cmFjdEpheGJQcm9qZWN0LnRoaXMuc3luY2hyb25pemVKYXhiRmlsZXMoZmlsZSwgZGVsdGFLaW5kKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCByZXNvdXJjZSBkZWx0YSB2aXNpdG9yIGNhbGxiYWNrLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSmF4YkZpbGUgd2FzIGVpdGhlciBhZGRlZCBvciByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN5bmNocm9uaXplSmF4YkZpbGVzKElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKLQkJc3dpdGNoIChkZWx0YUtpbmQpIHsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCXJldHVybiB0aGlzLmFkZEpheGJGaWxlKGZpbGUpOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQlyZXR1cm4gdGhpcy5yZW1vdmVKYXhiRmlsZShmaWxlKTsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQkJcmV0dXJuIHRoaXMuY2hlY2tGb3JDaGFuZ2VkRmlsZUNvbnRlbnQoZmlsZSk7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT00gOgotCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0JCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOyAgLy8gb25seSB3b3JyaWVkIGFib3V0IGFkZGVkL3JlbW92ZWQvY2hhbmdlZCBmaWxlcwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrRm9yQ2hhbmdlZEZpbGVDb250ZW50KElGaWxlIGZpbGUpIHsKLQkJSmF4YkZpbGUgamF4YkZpbGUgPSB0aGlzLmdldEpheGJGaWxlKGZpbGUpOwotCQlpZiAoamF4YkZpbGUgPT0gbnVsbCkgewotCQkJLy8gdGhlIGZpbGUgbWlnaHQgaGF2ZSBjaGFuZ2VkIGl0cyBjb250ZW50IHRvIHNvbWV0aGluZyB0aGF0IHdlIGFyZSBpbnRlcmVzdGVkIGluCi0JCQlyZXR1cm4gdGhpcy5hZGRKYXhiRmlsZShmaWxlKTsKLQkJfQotCi0JCWlmIChqYXhiRmlsZS5nZXRDb250ZW50VHlwZSgpLmVxdWFscyhQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpKSkgewotCQkJLy8gY29udGVudCBoYXMgbm90IGNoYW5nZWQgLSBpZ25vcmUKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIHRoZSBjb250ZW50IHR5cGUgY2hhbmdlZCwgd2UgbmVlZCB0byBidWlsZCBhIG5ldyBKUEEgZmlsZQotCQkvLyAoZS5nLiB0aGUgc2NoZW1hIG9mIGFuIG9ybS54bWwgZmlsZSBjaGFuZ2VkIGZyb20gSlBBIHRvIEVjbGlwc2VMaW5rKQotCQl0aGlzLnJlbW92ZUpheGJGaWxlKGpheGJGaWxlKTsKLQkJdGhpcy5hZGRKYXhiRmlsZShmaWxlKTsKLQkJcmV0dXJuIHRydWU7ICAvLyBhdCB0aGUgbGVhc3QsIHdlIGhhdmUgcmVtb3ZlZCBhIEpQQSBmaWxlCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUludGVybmFsSmF2YVR5cGVzKCkgewotCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgewotCQkJanJjdS5yZXNvbHZlVHlwZXMoKTsKLQkJfQotCX0KLQotLy8JcHJvdGVjdGVkIHZvaWQgZXh0ZXJuYWxQcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotLy8JCWlmICh0aGlzLmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aChkZWx0YS5nZXRSZXNvdXJjZSgpKSkgewotLy8JCQlSZXNvdXJjZURlbHRhVmlzaXRvciByZXNvdXJjZURlbHRhVmlzaXRvciA9IHRoaXMuYnVpbGRFeHRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0vLwkJCXJlc291cmNlRGVsdGFWaXNpdG9yLnZpc2l0RGVsdGEoZGVsdGEpOwotLy8JCQkvLyBmb3JjZSBhbiAidXBkYXRlIiBoZXJlIHNpbmNlIGFkZGluZyBhbmQvb3IgcmVtb3ZpbmcgYW4gZXh0ZXJuYWwgSmF2YSB0eXBlCi0vLwkJCS8vIHdpbGwgb25seSB0cmlnZ2VyIGFuICJ1cGRhdGUiIGlmIHRoZSAicmVzb2x2ZSIgY2F1c2VzIHNvbWV0aGluZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwgdG8gY2hhbmdlCi0vLwkJCWlmIChyZXNvdXJjZURlbHRhVmlzaXRvci5lbmNvdW50ZXJlZFNpZ25pZmljYW50Q2hhbmdlKCkpIHsKLS8vCQkJCXRoaXMudXBkYXRlKCk7Ci0vLwkJCQl0aGlzLnJlc29sdmVFeHRlcm5hbEphdmFUeXBlcygpOwotLy8JCQkJdGhpcy5yZXNvbHZlSW50ZXJuYWxKYXZhVHlwZXMoKTsKLS8vCQkJfQotLy8JCX0KLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgUmVzb3VyY2VEZWx0YVZpc2l0b3IgYnVpbGRFeHRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotLy8JCXJldHVybiBuZXcgUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgYm9vbGVhbiBmaWxlQ2hhbmdlSXNTaWduaWZpY2FudChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0vLwkJCQlyZXR1cm4gQWJzdHJhY3RKYXhiUHJvamVjdC50aGlzLnN5bmNocm9uaXplRXh0ZXJuYWxGaWxlcyhmaWxlLCBkZWx0YUtpbmQpOwotLy8JCQl9Ci0vLwkJfTsKLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIGV4dGVybmFsIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgY2FsbGJhY2sKLS8vCSAqIFJldHVybiB0cnVlIGlmIGFuICJleHRlcm5hbCIgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0Ci0vLwkgKiB3YXMgYWRkZWQgb3IgcmVtb3ZlZC4KLS8vCSAqLwotLy8JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemVFeHRlcm5hbEZpbGVzKElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKLS8vCQlzd2l0Y2ggKGRlbHRhS2luZCkgewotLy8JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLS8vCQkJCXJldHVybiB0aGlzLmV4dGVybmFsRmlsZUFkZGVkKGZpbGUpOwotLy8JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotLy8JCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxGaWxlUmVtb3ZlZChmaWxlKTsKLS8vCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLS8vCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0vLwkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0vLwkJCQlicmVhazsgIC8vIGlnbm9yZQotLy8JCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0vLwkJCQlicmVhazsgIC8vIGlnbm9yZQotLy8JCQlkZWZhdWx0IDoKLS8vCQkJCWJyZWFrOyAgLy8gb25seSB3b3JyaWVkIGFib3V0IGFkZGVkL3JlbW92ZWQvY2hhbmdlZCBmaWxlcwotLy8JCX0KLS8vCi0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsRmlsZUFkZGVkKElGaWxlIGZpbGUpIHsKLS8vCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpOwotLy8JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0vLwkJCXJldHVybiBmYWxzZTsKLS8vCQl9Ci0vLwkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLS8vCQkJcmV0dXJuIHRydWU7Ci0vLwkJfQotLy8JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKSkgewotLy8JCQlyZXR1cm4gdHJ1ZTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGZhbHNlOwotLy8JfQotLy8KLS8vCXByb3RlY3RlZCBib29sZWFuIGV4dGVybmFsRmlsZVJlbW92ZWQoSUZpbGUgZmlsZSkgewotLy8JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0vLwkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotLy8JCQlyZXR1cm4gdGhpcy5yZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChmaWxlKTsKLS8vCQl9Ci0vLwkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0vLwkJCXJldHVybiB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlUGVyc2lzdGVudFR5cGVDYWNoZS5yZW1vdmVQZXJzaXN0ZW50VHlwZXMoZmlsZSk7Ci0vLwkJfQotLy8JCXJldHVybiBmYWxzZTsKLS8vCX0KLS8vCi0vLwlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlRXh0ZXJuYWxKYXZhVHlwZXMoKSB7Ci0vLwkJZm9yIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA6IHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpIHsKLS8vCQkJanJjdS5yZXNvbHZlVHlwZXMoKTsKLS8vCQl9Ci0vLwl9Ci0KLQkvLyAqKioqKiByZXNvdXJjZSBkZWx0YSB2aXNpdG9ycwotCS8qKgotCSAqIGFkZCBvciByZW1vdmUgYSBKUEEgZmlsZSBmb3IgZXZlcnkgW2FwcHJvcHJpYXRlXSBmaWxlIGVuY291bnRlcmVkIGJ5IHRoZSB2aXNpdG9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSA9IGZhbHNlOwotCQkKLQkJcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHZpc2l0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KHRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4gLSB3ZSBkb24ndCB0aHJvdyBhbnkgQ29yZUV4Y2VwdGlvbnMKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlzd2l0Y2ggKHJlcy5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQl0aGlzLmZpbGVDaGFuZ2VkKChJRmlsZSkgcmVzLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbiAocHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLi4uKQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmlsZUNoYW5nZWQoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgewotCQkJaWYgKHRoaXMuZmlsZUNoYW5nZUlzU2lnbmlmaWNhbnQoZmlsZSwgZGVsdGFLaW5kKSkgewotCQkJCXRoaXMuZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBmaWxlQ2hhbmdlSXNTaWduaWZpY2FudChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHZpc2l0b3IgZW5jb3VudGVyZWQgc29tZSBzb3J0IG9mICJzaWduaWZpY2FudCIKLQkJICogY2hhbmdlIHdoaWxlIHRyYXZlcnNpbmcgdGhlIElSZXNvdXJjZURlbHRhCi0JCSAqIChlLmcuIGEgSlBBIGZpbGUgd2FzIGFkZGVkIG9yIHJlbW92ZWQpLgotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSgpIHsKLQkJCXJldHVybiB0aGlzLmVuY291bnRlcmVkU2lnbmlmaWNhbnRDaGFuZ2U7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvci5zZXQoY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEV4ZWN1dG9yIGdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkgewotCQlyZXR1cm4gdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUgY29udGV4dCBtb2RlbCB3aXRoIHJlc291cmNlIG1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBTeW5jaHJvbml6ZXIgZ2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJaWYgKHN5bmNocm9uaXplciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmNvbnRleHRNb2RlbFN5bmNocm9uaXplci5zdG9wKCk7Ci0JCXRoaXMuc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyXyhzeW5jaHJvbml6ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcl8oU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQl0aGlzLmNvbnRleHRNb2RlbFN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQkJdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxlZ2F0ZSB0byB0aGUgY29udGV4dCBtb2RlbCBzeW5jaHJvbml6ZXIgc28gY2xpZW50cyBjYW4gY29uZmlndXJlIGhvdwotCSAqIHN5bmNocm9uaXphdGlvbnMgb2NjdXIuCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVDb250ZXh0TW9kZWwoKSB7Ci0JCXRoaXMuc3luY2hyb25pemluZ0NvbnRleHRNb2RlbCA9IHRydWU7Ci0JCXRoaXMuY29udGV4dE1vZGVsU3luY2hyb25pemVyLnN5bmNocm9uaXplKCk7Ci0JCXRoaXMuc3luY2hyb25pemluZ0NvbnRleHRNb2RlbCA9IGZhbHNlOwotCi0JCS8vIFRoZXJlIGFyZSBzb21lIGNoYW5nZXMgdG8gdGhlIHJlc291cmNlIG1vZGVsIHRoYXQgd2lsbCBub3QgY2hhbmdlCi0JCS8vIHRoZSBleGlzdGluZyBjb250ZXh0IG1vZGVsIGFuZCB0cmlnZ2VyIGFuIHVwZGF0ZSAoZS5nLiBhZGRpbmcgYW4KLQkJLy8gQEVudGl0eSBhbm5vdGF0aW9uIHdoZW4gdGhlIHRoZSBKUEEgcHJvamVjdCBpcyBhdXRvbWF0aWNhbGx5Ci0JCS8vIGRpc2NvdmVyaW5nIGFubm90YXRlZCBjbGFzc2VzKTsgc28gd2UgZXhwbGljaXRseSBleGVjdXRlIGFuIHVwZGF0ZQotCQkvLyBoZXJlIHRvIGRpc2NvdmVyIHRob3NlIGNoYW5nZXMuCi0JCXRoaXMudXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBjb250ZXh0IG1vZGVsIHN5bmNocm9uaXplci4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBzeW5jaHJvbml6ZUNvbnRleHRNb2RlbChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5jb250ZXh0Um9vdC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplQ29udGV4dE1vZGVsQW5kV2FpdCgpIHsKLQkJU3luY2hyb25pemVyIHRlbXAgPSB0aGlzLmNvbnRleHRNb2RlbFN5bmNocm9uaXplcjsKLQkJdGhpcy5zZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyKCkpOwotCQl0aGlzLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXRoaXMuc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKHRlbXApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IGNvbnRleHQgbW9kZWwgc3luY2hyb25pemVyIChzeW5jaHJvbm91cykgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFN5bmNocm9uaXplciBidWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZAotCQlpbXBsZW1lbnRzIENvbW1hbmQKLQl7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlBYnN0cmFjdEpheGJQcm9qZWN0LnRoaXMuc3luY2hyb25pemVDb250ZXh0TW9kZWwobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJvamVjdCAidXBkYXRlIiAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgZ2V0VXBkYXRlU3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gdGhpcy51cGRhdGVTeW5jaHJvbml6ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlU3luY2hyb25pemVyKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQlpZiAoc3luY2hyb25pemVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnN0b3AoKTsKLQkJdGhpcy51cGRhdGVTeW5jaHJvbml6ZXIucmVtb3ZlTGlzdGVuZXIodGhpcy51cGRhdGVTeW5jaHJvbml6ZXJMaXN0ZW5lcik7Ci0JCXRoaXMuc2V0VXBkYXRlU3luY2hyb25pemVyXyhzeW5jaHJvbml6ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwZGF0ZVN5bmNocm9uaXplcl8oQ2FsbGJhY2tTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyID0gc3luY2hyb25pemVyOwotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplci5hZGRMaXN0ZW5lcih0aGlzLnVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyKTsKLQkJdGhpcy51cGRhdGVTeW5jaHJvbml6ZXIuc3RhcnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLnN0YXRlQ2hhbmdlZCgpOwotCQl0aGlzLnVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBKQVhCIHByb2plY3QncyBzdGF0ZSBoYXMgY2hhbmdlZCwgInVwZGF0ZSIgdGhvc2UgcGFydHMgb2YgdGhlCi0JICogSkFYQiBwcm9qZWN0IHRoYXQgYXJlIGRlcGVuZGVudCBvbiBvdGhlciBwYXJ0cyBvZiB0aGUgSkFYQiBwcm9qZWN0LgotCSAqIDxwPgotCSAqIERlbGVnYXRlIHRvIHRoZSB1cGRhdGUgc3luY2hyb25pemVyIHNvIGNsaWVudHMgY2FuIGNvbmZpZ3VyZSBob3cKLQkgKiB1cGRhdGVzIG9jY3VyLgotCSAqIDxwPgotCSAqIElnbm9yZSBhbnkgPGVtPnVwZGF0ZXM8L2VtPiB0aGF0IG9jY3VyIHdoaWxlIHdlIGFyZSBzeW5jaHJvbml6aW5nCi0JICogdGhlIGNvbnRleHQgbW9kZWwgd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgYmVjYXVzZSB3ZSB3aWxsIDxlbT51cGRhdGU8L2VtPgotCSAqIHRoZSBjb250ZXh0IG1vZGVsIGF0IHRoZSBjb21wbGV0aW9uIG9mIHRoZSA8ZW0+c3luYzwvZW0+LiBUaGlzIGlzIHJlYWxseQotCSAqIG9ubHkgdXNlZnVsIGZvciBzeW5jaHJvbm91cyA8ZW0+c3luY3M8L2VtPiBhbmQgPGVtPnVwZGF0ZXM8L2VtPjsgc2luY2UKLQkgKiB0aGUgam9iIHNjaGVkdWxpbmcgcnVsZXMgd2lsbCBwcmV2ZW50IHRoZSA8ZW0+c3luYzwvZW0+IGFuZAotCSAqIDxlbT51cGRhdGU8L2VtPiBqb2JzIGZyb20gcnVubmluZyBjb25jdXJyZW50bHkuCi0JICogCi0JICogQHNlZSAjdXBkYXRlQW5kV2FpdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoICEgdGhpcy5zeW5jaHJvbml6aW5nQ29udGV4dE1vZGVsKSB7Ci0JCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSB1cGRhdGUgc3luY2hyb25pemVyLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHVwZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5jb250ZXh0Um9vdC51cGRhdGUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgdXBkYXRlIHN5bmNocm9uaXplciB0byBub3RpZnkgdGhlIEpBWEIKLQkgKiBwcm9qZWN0IHRoYXQgdGhlICJ1cGRhdGUiIGhhcyBxdWllc2NlZCAoaS5lLiB0aGUgInVwZGF0ZSIgaGFzIGNvbXBsZXRlZAotCSAqIGFuZCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGZ1cnRoZXIgInVwZGF0ZXMiKS4KLQkgKi8KLSAJcHVibGljIHZvaWQgdXBkYXRlUXVpZXNjZWQoKSB7Ci0gCQkvL25vdGhpbmcgeWV0Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQW5kV2FpdCgpIHsKLQkJQ2FsbGJhY2tTeW5jaHJvbml6ZXIgdGVtcCA9IHRoaXMudXBkYXRlU3luY2hyb25pemVyOwotCQl0aGlzLnNldFVwZGF0ZVN5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXIoKSk7Ci0JCXRoaXMudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VXBkYXRlU3luY2hyb25pemVyKHRlbXApOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IHVwZGF0ZSBzeW5jaHJvbml6ZXIgKHN5bmNocm9ub3VzKSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZAotCQlpbXBsZW1lbnRzIENvbW1hbmQKLQl7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlBYnN0cmFjdEpheGJQcm9qZWN0LnRoaXMudXBkYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0ZSBzeW5jaHJvbml6ZXIgbGlzdGVuZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENhbGxiYWNrU3luY2hyb25pemVyLkxpc3RlbmVyIGJ1aWxkVXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgVXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIKLQkJaW1wbGVtZW50cyBDYWxsYmFja1N5bmNocm9uaXplci5MaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgc3luY2hyb25pemF0aW9uUXVpZXNjZWQoQ2FsbGJhY2tTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCQlBYnN0cmFjdEpheGJQcm9qZWN0LnRoaXMudXBkYXRlUXVpZXNjZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0dlbmVyaWNKYXhiRmlsZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pheGJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NGFkMTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pheGJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLQotLyoqCi0gKiBUaGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGEgSkFYQiBwcm9qZWN0IGFuZCB0aGUgcmVzb3VyY2UgbW9kZWwgYXNzb2NpYXRlZAotICogd2l0aCBhIGZpbGUuCi0gKiBIb2xkIHRoZSBhc3NvY2lhdGVkIHJvb3Qgc3RydWN0dXJlIG5vZGVzLCB3aGljaCBhcmUgaG9va3MgdG8gdGhlCi0gKiBjb250ZXh0IG1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJGaWxlCi0JZXh0ZW5kcyBBYnN0cmFjdEpheGJOb2RlCi0JaW1wbGVtZW50cyBKYXhiRmlsZQotewotCS8qKgotCSAqIHR5cGljYWxseSBhIC5qYXZhIG9yIC54bWwgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUZpbGUgZmlsZTsKLQotCS8qKgotCSAqIGNhY2hlIHRoZSBjb250ZW50IHR5cGUgLSBpZiB0aGUgY29udGVudCB0eXBlIGNoYW5nZXMsIHRoZSBKQVhCIHByb2plY3QKLQkgKiB3aWxsIHRocm93IG91dCB0aGUgSkFYQiBmaWxlIGFuZCBidWlsZCBhIG5ldyBvbmUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlOwotCi0JLyoqCi0JICogdGhlIHJlc291cmNlIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpbGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSnB0UmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsOwotCi0vLwkvKioKLS8vCSAqIHRoZSByb290IHN0cnVjdHVyZSAoY29udGV4dCBtb2RlbCkgbm9kZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcmVzb3VyY2UKLS8vCSAqIG1vZGVsCi0vLwkgKi8KLS8vCXByb3RlY3RlZCBmaW5hbCBIYXNodGFibGU8T2JqZWN0LCBKcGFTdHJ1Y3R1cmVOb2RlPiByb290U3RydWN0dXJlTm9kZXM7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmljSmF4YkZpbGUoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSwgSnB0UmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXN1cGVyKGpheGJQcm9qZWN0KTsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotCQl0aGlzLnJlc291cmNlTW9kZWwgPSByZXNvdXJjZU1vZGVsOwotLy8JCXRoaXMucm9vdFN0cnVjdHVyZU5vZGVzID0gbmV3IEhhc2h0YWJsZTxPYmplY3QsIEpwYVN0cnVjdHVyZU5vZGU+KCk7Ci0JfQotLy8KLS8vCS8qKgotLy8JICogQ2hhbmdlcyB0byBST09UX1NUUlVDVFVSRV9OT0RFU19DT0xMRUNUSU9OIGRvIG5vdCBuZWVkIHRvIHRyaWdnZXIgYQotLy8JICogcHJvamVjdCB1cGRhdGUuIE9ubHkgdGhlIFVJIGNhcmVzIGFib3V0IHRoZSByb290IHN0cnVjdHVyZSBub2Rlcy4KLS8vCSAqIElmIGEgcHJvamVjdCB1cGRhdGUgaXMgYWxsb3dlZCB0byBoYXBwZW4sIGFuIGluZmluaXRlIGxvb3Agd2lsbCByZXN1bHQKLS8vCSAqIGlmIGFueSBqYXZhIGNsYXNzIGlzIHNwZWNpZmllZCBpbiBtb3JlIHRoYW4gb25lIGxvY2F0aW9uIGluIHRoZQotLy8JICogcGVyc2lzdGVuY2UgdW5pdC4KLS8vCSAqLwotLy8JQE92ZXJyaWRlCi0vLwlwcm90ZWN0ZWQgdm9pZCBhZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzKSB7Ci0vLwkJc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0vLwkJbm9uVXBkYXRlQXNwZWN0TmFtZXMuYWRkKFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04pOwotLy8JfQotCi0KLQkvLyAqKioqKioqKioqIGZpbGUgKioqKioqKioqKgotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbGU7Ci0JfQotCi0JcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGVudFR5cGU7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKElDb250ZW50VHlwZSBjdCkgewotCQlyZXR1cm4gdGhpcy5jb250ZW50VHlwZS5pc0tpbmRPZihjdCkgPyB0aGlzLnJlc291cmNlTW9kZWwgOiBudWxsOwotCX0KLQotCi0vLwkvLyAqKioqKioqKioqIHJvb3Qgc3RydWN0dXJlIG5vZGVzICoqKioqKioqKioKLS8vCi0vLwlwdWJsaWMgSXRlcmF0b3I8SnBhU3RydWN0dXJlTm9kZT4gcm9vdFN0cnVjdHVyZU5vZGVzKCkgewotLy8JCXJldHVybiB0aGlzLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCk7Ci0vLwl9Ci0vLwotLy8JcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYVN0cnVjdHVyZU5vZGU+IGdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpIHsKLS8vCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpwYVN0cnVjdHVyZU5vZGU+KHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnZhbHVlcygpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgaW50IHJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSB7Ci0vLwkJcmV0dXJuIHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnNpemUoKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCBhZGRSb290U3RydWN0dXJlTm9kZShPYmplY3Qga2V5LCBKcGFTdHJ1Y3R1cmVOb2RlIHJvb3RTdHJ1Y3R1cmVOb2RlKSB7Ci0vLwkJSnBhU3RydWN0dXJlTm9kZSBvbGQgPSB0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5wdXQoa2V5LCByb290U3RydWN0dXJlTm9kZSk7Ci0vLwkJaWYgKHJvb3RTdHJ1Y3R1cmVOb2RlICE9IG9sZCkgewotLy8JCQlpZiAob2xkICE9IG51bGwpIHsKLS8vCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04sIG9sZCk7Ci0vLwkJCX0KLS8vCQkJdGhpcy5maXJlSXRlbUFkZGVkKFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04sIHJvb3RTdHJ1Y3R1cmVOb2RlKTsKLS8vCQl9Ci0vLwl9Ci0vLwotLy8JcHVibGljIHZvaWQgcmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0IGtleSkgewotLy8JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04sIHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLnJlbW92ZShrZXkpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0vLwkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIHJvb3ROb2RlIDogdGhpcy5nZXRSb290U3RydWN0dXJlTm9kZXMoKSkgewotLy8JCQlKcGFTdHJ1Y3R1cmVOb2RlIG5vZGUgPSByb290Tm9kZS5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOwotLy8JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0vLwkJCQlyZXR1cm4gbm9kZTsKLS8vCQkJfQotLy8JCX0KLS8vCQlyZXR1cm4gbnVsbDsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZmlsZSk7Ci0JCXNiLmFwcGVuZCgnWycpOwotCQlzYi5hcHBlbmQodGhpcy5jb250ZW50VHlwZS5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJ10nKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0dlbmVyaWNKYXhiUHJvamVjdC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pheGJQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiODEwMTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pheGJQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotCi0vKioKLSAqIE5vdCBtdWNoIGRpZmZlcmVudCBmcm9tIHRoZSBhYnN0cmFjdCBKQVhCIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4YlByb2plY3QKLQlleHRlbmRzIEFic3RyYWN0SmF4YlByb2plY3QKLXsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEdlbmVyaWNKYXhiUHJvamVjdChKYXhiUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXN1cGVyKGNvbmZpZyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0phdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmNhNWVhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL0phdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBKYXZhIHBhY2thZ2UtaW5mby5qYXZhIHNvdXJjZSBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgYnVpbGRSZXNvdXJjZU1vZGVsKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQkJdHJ5IHsKLQkJCWlmIChjb21waWxhdGlvblVuaXQuZ2V0UGFja2FnZURlY2xhcmF0aW9ucygpLmxlbmd0aCA+IDApewotCQkJCXJldHVybiBuZXcgU291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQoCi0JCQkJCQljb21waWxhdGlvblVuaXQsCi0JCQkJCQlqYXhiUHJvamVjdC5nZXRQbGF0Zm9ybSgpLmdldEFubm90YXRpb25Qcm92aWRlcigpLAotCQkJCQkJamF4YlByb2plY3QuZ2V0UGxhdGZvcm0oKS5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpLAotCQkJCQkJamF4YlByb2plY3QuZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKSk7Ci0JCQl9IAotCQkJLy9pZ25vcmUgcGFja2FnZS1pbmZvIHBsYWNlZCBpbiBkZWZhdWx0IHBhY2thZ2UgYXMKLQkJCS8vaXQgZG9lc24ndCBoYXZlIHBhY2thZ2UgZGVjbGFyYXRpb24gYW5kIGNhbid0IGhvbGQgYW5ub3RhdGlvbnMKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGUpOwotCQkJLy8gSWdub3JlIC0tIHByb2plY3QgaXMgaW4gYSBiYWQgc3RhdGUuIFRoaXMgd2lsbCBnZXQgcmVjYWxsZWQgaWYgbmVjZXNzYXJ5Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNjZmMTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiBKYXZhIHNvdXJjZSBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEU7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBidWlsZFJlc291cmNlTW9kZWwoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0KAotCQkJCQlKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpLAotCQkJCQlqYXhiUHJvamVjdC5nZXRQbGF0Zm9ybSgpLmdldEFubm90YXRpb25Qcm92aWRlcigpLAotCQkJCQlqYXhiUHJvamVjdC5nZXRQbGF0Zm9ybSgpLmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCksCi0JCQkJCWpheGJQcm9qZWN0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkKLQkJCQkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSmF4YlBsYXRmb3JtVGVzdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KYXhiUGxhdGZvcm1UZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkN2JkYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KYXhiUGxhdGZvcm1UZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YlBsYXRmb3JtVGVzdGVyCi0JCWV4dGVuZHMgUHJvcGVydHlUZXN0ZXIgewotCQotCXB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IHJlY2VpdmVyLCBTdHJpbmcgcHJvcGVydHksIE9iamVjdFtdIGFyZ3MsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB7Ci0JCWlmICghIChwcm9wZXJ0eS5lcXVhbHMoImpheGJQbGF0Zm9ybSIpIHx8IHByb3BlcnR5LmVxdWFscygiamF4YlBsYXRmb3JtR3JvdXAiKSkKLQkJCQl8fCAhIChleHBlY3RlZFZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0gbnVsbDsKLQkJCi0JCWlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcGxhdGZvcm0gPSBwbGF0Zm9ybSgoKElSZXNvdXJjZSkgcmVjZWl2ZXIpLmdldFByb2plY3QoKSk7Ci0JCX0gCi0JCWVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlwbGF0Zm9ybSA9IHBsYXRmb3JtKCgoSUphdmFFbGVtZW50KSByZWNlaXZlcikuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCWVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24pIHsKLQkJCXBsYXRmb3JtID0gKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uKSByZWNlaXZlcjsKLQkJfQotCQllbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSB7Ci0JCQlwbGF0Zm9ybSA9ICgoSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIHJlY2VpdmVyKS5nZXRKYXhiUGxhdGZvcm0oKTsKLQkJfQotCQkKLQkJaWYgKHByb3BlcnR5LmVxdWFscygiamF4YlBsYXRmb3JtIikpIHsKLQkJCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIG90aGVyUGxhdGZvcm0gPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKChTdHJpbmcpIGV4cGVjdGVkVmFsdWUpOwotCQkJcmV0dXJuIHBsYXRmb3JtID09IG51bGwgPyBmYWxzZSA6IHBsYXRmb3JtLmVxdWFscyhvdGhlclBsYXRmb3JtKTsKLQkJfQotCQlpZiAocHJvcGVydHkuZXF1YWxzKCJqYXhiUGxhdGZvcm1Hcm91cCIpKSB7Ci0JCQlKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdyb3VwID0gKHBsYXRmb3JtID09IG51bGwpID8gbnVsbCA6IHBsYXRmb3JtLmdldEdyb3VwKCk7Ci0JCQlKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIG90aGVyR3JvdXAgPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtR3JvdXAoKFN0cmluZykgZXhwZWN0ZWRWYWx1ZSk7Ci0JCQlyZXR1cm4gZ3JvdXAgPT0gbnVsbCA/IGZhbHNlIDogZ3JvdXAuZXF1YWxzKG90aGVyR3JvdXApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAocHJvamVjdCA9PSBudWxsKSAKLQkJCQk/IG51bGwgCi0JCQkJOiBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybUlkKHByb2plY3QpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9KcHRKYXhiQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkZGJjZGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvSnB0SmF4YkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgSkFYQiBDb3JlLgotICovCi1wdWJsaWMgY2xhc3MgSnB0SmF4YkNvcmVNZXNzYWdlcyB7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09OVEVYVF9NT0RFTF9TWU5DX0pPQl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVQREFURV9KT0JfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUkVGRVJFTkNFU19GTFVTSF9KT0JfTkFNRTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yX2dlbmVyYXRpbmdDbGFzc2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JfZ2VuZXJhdGluZ0NsYXNzZXNUYXNrOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldENvbmZpZ192YWxpZGF0ZVBsYXRmb3JtTm90U3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldENvbmZpZ192YWxpZGF0ZVBsYXRmb3JtRG9lc05vdFN1cHBvcnRGYWNldFZlcnNpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkUGxhdGZvcm07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkSmF2YUZhY2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpyZUxpYnJhcnlWYWxpZGF0b3JfaW52YWxpZEphdmFMaWJyYXJ5OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVzZXJMaWJyYXJ5VmFsaWRhdG9yX2luY29tcGF0aWJsZUphdmFGYWNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VyTGlicmFyeVZhbGlkYXRvcl9pbmNvbXBhdGlibGVKYXZhTGlicmFyeTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JfY3JlYXRpbmdKQVhCUHJvcGVydGllc0ZpbGVUYXNrOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9BVFRSSUJVVEVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfRUxFTUVOVF9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTF9UWVBFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1VCU1RJVFVUSU9OX0hFQURfREVTQzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19TQ09QRTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X2pheGJfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRKYXhiQ29yZU1lc3NhZ2VzLmNsYXNzOwotCQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCQotCQotCXByaXZhdGUgSnB0SmF4YkNvcmVNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvU2NoZW1hRW50cnlJbXBsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TY2hlbWFFbnRyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwODM5Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TY2hlbWFFbnRyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuU2NoZW1hRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RSZXNvdXJjZUltcGw7Ci0KLQotcHVibGljIGNsYXNzIFNjaGVtYUVudHJ5SW1wbAotCQlpbXBsZW1lbnRzIFNjaGVtYUVudHJ5IHsKLQkKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsb2NhdGlvbjsKLQkKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0JCi0JcHJpdmF0ZSBYU0RSZXNvdXJjZUltcGwgc2NoZW1hUmVzb3VyY2U7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHVubG9hZGVkID0gZmFsc2U7Ci0JCi0JcHJpdmF0ZSBTY2hlbWFSZXNvdXJjZUFkYXB0ZXIgc2NoZW1hUmVzb3VyY2VBZGFwdGVyOwotCQotCQotCVNjaGVtYUVudHJ5SW1wbChTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl0aGlzLnNjaGVtYVJlc291cmNlQWRhcHRlciA9IG5ldyBTY2hlbWFSZXNvdXJjZUFkYXB0ZXIoKTsKLQkJcmVmcmVzaCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNMb2FkZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYVJlc291cmNlICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBYc2RTY2hlbWEgZ2V0WHNkU2NoZW1hKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKHRoaXMudW5sb2FkZWQpIHsKLQkJCXJlZnJlc2goKTsKLQkJCXRoaXMudW5sb2FkZWQgPSBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMubmFtZXNwYWNlLCBuYW1lc3BhY2UpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJaWYgKHRoaXMuc2NoZW1hUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIFhzZFV0aWwuZ2V0U2NoZW1hKHRoaXMuc2NoZW1hUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdW5sb2FkKCk7Ci0JCQotCQlTdHJpbmcgcmVzb2x2ZWRVcmkgPSBYc2RVdGlsLmdldFJlc29sdmVkVXJpKHRoaXMubG9jYXRpb24pOwotCQlpZiAocmVzb2x2ZWRVcmkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlYU0RTY2hlbWEgc2NoZW1hID0gWHNkVXRpbC5idWlsZFhTRE1vZGVsKHJlc29sdmVkVXJpKTsKLQkJWFNEUmVzb3VyY2VJbXBsIHNjaGVtYVJlc291cmNlID0gKHNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiAoWFNEUmVzb3VyY2VJbXBsKSBzY2hlbWEuZVJlc291cmNlKCk7Ci0JCQotCQlpZiAoc2NoZW1hUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJc2NoZW1hUmVzb3VyY2UuZUFkYXB0ZXJzKCkuYWRkKHRoaXMuc2NoZW1hUmVzb3VyY2VBZGFwdGVyKTsKLQkJCXRoaXMuc2NoZW1hUmVzb3VyY2UgPSBzY2hlbWFSZXNvdXJjZTsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCQl0aGlzLm5hbWVzcGFjZSA9IChuYW1lc3BhY2UgPT0gbnVsbCkgPyAiIiA6IG5hbWVzcGFjZTsKLQkJfQotCX0KLQkKLQl2b2lkIHVubG9hZCgpIHsKLQkJaWYgKHRoaXMuc2NoZW1hUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWFSZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5zY2hlbWFSZXNvdXJjZUFkYXB0ZXIpOwotCQl9Ci0JCXRoaXMudW5sb2FkZWQgPSB0cnVlOwotCQl0aGlzLnNjaGVtYVJlc291cmNlID0gbnVsbDsKLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5zY2hlbWFSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNjaGVtYVJlc291cmNlLmVBZGFwdGVycygpLnJlbW92ZSh0aGlzLnNjaGVtYVJlc291cmNlQWRhcHRlcik7Ci0JCX0KLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBTY2hlbWFSZXNvdXJjZUFkYXB0ZXIKLQkJCWV4dGVuZHMgQWRhcHRlckltcGwgewotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG1zZykgewotCQkJaWYgKG1zZy5nZXRGZWF0dXJlSUQoUmVzb3VyY2UuY2xhc3MpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQKLQkJCQkJJiYgbXNnLmdldE5ld0Jvb2xlYW5WYWx1ZSgpID09IGZhbHNlKSB7Ci0JCQkJU2NoZW1hRW50cnlJbXBsLnRoaXMudW5sb2FkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TY2hlbWFMaWJyYXJ5SW1wbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvU2NoZW1hTGlicmFyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZjODhjNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9TY2hlbWFMaWJyYXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuU2NoZW1hRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5TY2hlbWFMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBTY2hlbWFMaWJyYXJ5SW1wbAotCQlpbXBsZW1lbnRzIFNjaGVtYUxpYnJhcnkgewotCQotCXByaXZhdGUgSmF4YlByb2plY3QgcHJvamVjdDsKLQkKLQlwcml2YXRlIGZpbmFsIExpc3Q8U2NoZW1hRW50cnlJbXBsPiBzY2hlbWFFbnRyaWVzOwotCQotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU2NoZW1hRW50cnlJbXBsPiBpbXBsaWVkRW50cmllczsKLQkKLQkKLQlTY2hlbWFMaWJyYXJ5SW1wbChKYXhiUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuc2NoZW1hRW50cmllcyA9IG5ldyBWZWN0b3I8U2NoZW1hRW50cnlJbXBsPigpOwotCQl0aGlzLmltcGxpZWRFbnRyaWVzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFNjaGVtYUVudHJ5SW1wbD4oKTsKLQkJcmVhZFByb2plY3RQcmVmZXJlbmNlcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgTGlzdDxTY2hlbWFFbnRyeT4gZ2V0U2NoZW1hRW50cmllcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLjxTY2hlbWFFbnRyeT51bm1vZGlmaWFibGVMaXN0KHRoaXMuc2NoZW1hRW50cmllcyk7Ci0JfQotCQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0U2NoZW1hTG9jYXRpb25zKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKLQkJCQlDb2xsZWN0aW9uVG9vbHMubGlzdCgKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFNjaGVtYUVudHJ5LCBTdHJpbmc+KHRoaXMuc2NoZW1hRW50cmllcykgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFNjaGVtYUVudHJ5IG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8uZ2V0TG9jYXRpb24oKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYUxvY2F0aW9ucyhMaXN0PFN0cmluZz4gc2NoZW1hTG9jYXRpb25zKSB7Ci0JCWZvciAoU2NoZW1hRW50cnlJbXBsIGVudHJ5IDogdGhpcy5zY2hlbWFFbnRyaWVzKSB7Ci0JCQllbnRyeS5kaXNwb3NlKCk7Ci0JCX0KLQkJdGhpcy5zY2hlbWFFbnRyaWVzLmNsZWFyKCk7Ci0JCUpwdEpheGJDb3JlUGx1Z2luLnNldFNjaGVtYUxvY2F0aW9ucyh0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpLCBzY2hlbWFMb2NhdGlvbnMpOwotCQlyZWFkUHJvamVjdFByZWZlcmVuY2VzKCk7Ci0JfQotCQotCXB1YmxpYyBYc2RTY2hlbWEgZ2V0U2NoZW1hKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJZm9yIChTY2hlbWFFbnRyeSBlbnRyeSA6IHRoaXMuc2NoZW1hRW50cmllcykgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChuYW1lc3BhY2UsIGVudHJ5LmdldE5hbWVzcGFjZSgpKSkgewotCQkJCXJldHVybiBlbnRyeS5nZXRYc2RTY2hlbWEobmFtZXNwYWNlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKCEgdGhpcy5pbXBsaWVkRW50cmllcy5jb250YWluc0tleShuYW1lc3BhY2UpKSB7Ci0JCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoWHNkVXRpbC5nZXRSZXNvbHZlZFVyaShuYW1lc3BhY2UpLCBuYW1lc3BhY2UpKSB7Ci0JCQkJLy8gdGhlIG5hbWVzcGFjZSBpdHNlbGYgcmVzb2x2ZXMgdG8gYSBsb2NhdGlvbi4gIGFkZCBpdCBhcyBhbiBpbXBsaWVkIGVudHJ5Ci0JCQkJdGhpcy5pbXBsaWVkRW50cmllcy5wdXQobmFtZXNwYWNlLCBuZXcgU2NoZW1hRW50cnlJbXBsKG5hbWVzcGFjZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiB0aGlzLmltcGxpZWRFbnRyaWVzLmdldChuYW1lc3BhY2UpLmdldFhzZFNjaGVtYShuYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZWFkUHJvamVjdFByZWZlcmVuY2VzKCkgewotCQlMaXN0PFN0cmluZz4gc2NoZW1hcyA9IEpwdEpheGJDb3JlUGx1Z2luLmdldFNjaGVtYUxvY2F0aW9ucyh0aGlzLnByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJZm9yIChTdHJpbmcgc2NoZW1hTG9jYXRpb24gOiBzY2hlbWFzKSB7Ci0JCQlTY2hlbWFFbnRyeUltcGwgZW50cnkgPSBuZXcgU2NoZW1hRW50cnlJbXBsKHNjaGVtYUxvY2F0aW9uKTsKLQkJCXRoaXMuc2NoZW1hRW50cmllcy5hZGQoZW50cnkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hTY2hlbWEoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlmb3IgKFNjaGVtYUVudHJ5SW1wbCBlbnRyeSA6IHRoaXMuc2NoZW1hRW50cmllcykgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChuYW1lc3BhY2UsIGVudHJ5LmdldE5hbWVzcGFjZSgpKSkgewotCQkJCWVudHJ5LnJlZnJlc2goKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWZyZXNoQWxsU2NoZW1hcygpIHsKLQkJZm9yIChTY2hlbWFFbnRyeUltcGwgZW50cnkgOiB0aGlzLnNjaGVtYUVudHJpZXMpIHsKLQkJCWVudHJ5LnJlZnJlc2goKTsKLQkJfQotCX0KLQkKLQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZvciAoU2NoZW1hRW50cnlJbXBsIGVudHJ5IDogdGhpcy5zY2hlbWFFbnRyaWVzKSB7Ci0JCQllbnRyeS5kaXNwb3NlKCk7Ci0JCX0KLQkJZm9yIChTY2hlbWFFbnRyeUltcGwgZW50cnkgOiB0aGlzLmltcGxpZWRFbnRyaWVzLnZhbHVlcygpKSB7Ci0JCQllbnRyeS5kaXNwb3NlKCk7Ci0JCX0KLQkJCi0JCXRoaXMuc2NoZW1hRW50cmllcy5jbGVhcigpOwotCQl0aGlzLmltcGxpZWRFbnRyaWVzLmNsZWFyKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUJhZzxTdHJpbmc+IG5hbWVzcGFjZXMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCQotCQlmb3IgKFNjaGVtYUVudHJ5IGVudHJ5IDogdGhpcy5zY2hlbWFFbnRyaWVzKSB7Ci0JCQluYW1lc3BhY2VzLmFkZChlbnRyeS5nZXROYW1lc3BhY2UoKSk7Ci0JCQkKLQkJCWlmICghIGVudHJ5LmlzTG9hZGVkKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX19VTlJFU09MVkVEX1NDSEVNQSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgZW50cnkuZ2V0TG9jYXRpb24oKSB9LAotCQkJCQkJCQl0aGlzLnByb2plY3QpKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChJdGVyYXRvcjxTdHJpbmc+IHN0cmVhbSA9IG5hbWVzcGFjZXMudW5pcXVlSXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gc3RyZWFtLm5leHQoKTsKLQkJCWlmIChuYW1lc3BhY2VzLmNvdW50KG5hbWVzcGFjZSkgPiAxKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9fRFVQTElDQVRFX05BTUVTUEFDRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgbmFtZXNwYWNlIH0sCi0JCQkJCQkJCXRoaXMucHJvamVjdCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvU2ltcGxlSmF4YlByb2plY3RDb25maWcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL1NpbXBsZUpheGJQcm9qZWN0Q29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTlkZWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvU2ltcGxlSmF4YlByb2plY3RDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpBWEIgcHJvamVjdCBjb25maWcuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVKYXhiUHJvamVjdENvbmZpZwotCQlpbXBsZW1lbnRzIEpheGJQcm9qZWN0LkNvbmZpZyB7Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0OwotCQotCXByaXZhdGUgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBwbGF0Zm9ybURlZmluaXRpb247Ci0JCi0JCi0JcHVibGljIFNpbXBsZUpheGJQcm9qZWN0Q29uZmlnKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGdldFBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1EZWZpbml0aW9uOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQbGF0Zm9ybURlZmluaXRpb24oSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBwbGF0Zm9ybURlZmluaXRpb24pIHsKLQkJdGhpcy5wbGF0Zm9ybURlZmluaXRpb24gPSBwbGF0Zm9ybURlZmluaXRpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucHJvamVjdC5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyNzBiMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SmF4YkNvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpheGJOb2RlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUKLQlleHRlbmRzIEFic3RyYWN0SmF4Yk5vZGUKLQlpbXBsZW1lbnRzIEpheGJDb250ZXh0Tm9kZQotewotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBBYnN0cmFjdEpheGJDb250ZXh0Tm9kZShKYXhiTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQkvLyBOT1AKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZU5vZGVzV2l0aFJlc291cmNlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEpheGJDb250ZXh0Tm9kZT4gbm9kZXMpIHsKLQkJZm9yIChKYXhiQ29udGV4dE5vZGUgbm9kZSA6IG5vZGVzKSB7Ci0JCQlub2RlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJLy8gTk9QCi0JfQotCi0JLyoqCi0JICogY29udmVuaWVuY2UgbWV0aG9kCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTm9kZXMoSXRlcmFibGU8PyBleHRlbmRzIEpheGJDb250ZXh0Tm9kZT4gbm9kZXMpIHsKLQkJZm9yIChKYXhiQ29udGV4dE5vZGUgbm9kZSA6IG5vZGVzKSB7Ci0JCQlub2RlLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5ICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBjb3ZhcmlhbnQgb3ZlcnJpZGUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXhiQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwkKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiBpbjo8dWw+Ci0JICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFDb250ZXh0Tm9kZSNnZXRSZXNvdXJjZVR5cGUoKSBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZX0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRkZW4gaW46PHVsPgotCSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LkdlbmVyaWNDb250ZXh0Um9vdCNnZXRDb250ZXh0Um9vdCgpIEdlbmVyaWNDb250ZXh0Um9vdH0KLQkgKiB0byByZXR1cm4gaXRzZWxmPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIEpheGJDb250ZXh0Um9vdCBnZXRDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldENvbnRleHRSb290KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpheGJDb250ZXh0Um9vdC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpheGJDb250ZXh0Um9vdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmYwYWJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RKYXhiQ29udGV4dFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1Ykl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhiaW5kZXguSmF4YkluZGV4UmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiB0aGUgY29udGV4dCBtb2RlbCByb290Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpheGJDb250ZXh0Um9vdAotCQlleHRlbmRzIEFic3RyYWN0SmF4YkNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF4YkNvbnRleHRSb290IHsKLQkKLQkvKiBUaGlzIG9iamVjdCBoYXMgbm8gcGFyZW50LCBzbyBpdCBtdXN0IHBvaW50IHRvIHRoZSBKQVhCIHByb2plY3QgZXhwbGljaXRseS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSmF4YlByb2plY3QgamF4YlByb2plY3Q7Ci0JCi0JLyogVGhlIG1hcCBvZiBwYWNrYWdlIG5hbWUgdG8gSmF4YlBhY2thZ2Ugb2JqZWN0cyAqLwotCXByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLCBKYXhiUGFja2FnZT4gcGFja2FnZXM7Ci0JCi0JLyogVGhlIG1hcCBvZiBjbGFzcyBuYW1lIHRvIEpheGJUeXBlIG9iamVjdHMgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPFN0cmluZywgSmF4YlR5cGU+IHR5cGVzOwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEpheGJDb250ZXh0Um9vdChKYXhiUHJvamVjdCBqYXhiUHJvamVjdCkgewotCQlzdXBlcihudWxsKTsgIC8vIHRoZSBKQVhCIHByb2plY3QgaXMgbm90IHJlYWxseSBhICJwYXJlbnQiLi4uCi0JCWlmIChqYXhiUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmpheGJQcm9qZWN0ID0gamF4YlByb2plY3Q7Ci0JCXRoaXMucGFja2FnZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgSmF4YlBhY2thZ2U+KCk7Ci0JCXRoaXMudHlwZXMgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgSmF4YlR5cGU+KCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJDb250ZXh0Um9vdCBnZXRDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQotCQkvLyBwcm9jZXNzIHBhY2thZ2VzIHdpdGggYW5ub3RhdGlvbnMgZmlyc3QKLQkJZm9yIChTdHJpbmcgcGtnIDogY2FsY3VsYXRlSW5pdGlhbFBhY2thZ2VOYW1lcygpKSB7Ci0JCQl0aGlzLnBhY2thZ2VzLnB1dChwa2csIGJ1aWxkUGFja2FnZShwa2cpKTsKLQkJfQotCQkKLQkJLy8ga2VlcCBzZXQgb2YgdG90YWwgdHlwZXMgZm9yIHJlbWFpbmluZyBwYWNrYWdlIGluaXRpYWxpemF0aW9uCi0JCVNldDxTdHJpbmc+IHRvdGFsVHlwZU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQkKLQkJLy8gcHJvY2VzcyB0eXBlcyB3aXRoIGFubm90YXRpb25zIGFuZCBpbiBqYXhiLmluZGV4IGZpbGVzCi0JCWZvciAoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA6IGNhbGN1bGF0ZUluaXRpYWxUeXBlcygpKSB7Ci0JCQl0b3RhbFR5cGVOYW1lcy5hZGQocmVzb3VyY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQlhZGRUeXBlXyhidWlsZFR5cGUocmVzb3VyY2VUeXBlKSk7Ci0JCX0KLQkJCi0JCS8vIG9uY2UgYWxsIGNsYXNzZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgYWRkIHBhY2thZ2VzCi0JCWZvciAoU3RyaW5nIHBrZyA6IGNhbGN1bGF0ZVBhY2thZ2VOYW1lcyh0b3RhbFR5cGVOYW1lcykpIHsKLQkJCWlmICghIHRoaXMucGFja2FnZXMuY29udGFpbnNLZXkocGtnKSkgewotCQkJCXRoaXMucGFja2FnZXMucHV0KHBrZywgYnVpbGRQYWNrYWdlKHBrZykpOwotCQkJfQotCQl9Ci0JCQotLy8JCS8vIGtlZXAgYSBtYXN0ZXIgbGlzdCBvZiBhbGwgdHlwZXMgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgc28gd2UgZG9uJ3QgcHJvY2VzcyB0aGVtIGFnYWluCi0vLwkJZmluYWwgU2V0PFN0cmluZz4gdG90YWxUeXBlcyA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNldCgpOwotLy8JCQotLy8JCS8vIGtlZXAgYW4gcnVubmluZyBsaXN0IG9mIHR5cGVzIHRoYXQgd2UgbmVlZCB0byBzY2FuIGZvciBmdXJ0aGVyIHJlZmVyZW5jZWQgdHlwZXMKLS8vCQlmaW5hbCBTZXQ8U3RyaW5nPiB0eXBlc1RvU2NhbiA9IENvbGxlY3Rpb25Ub29scy48U3RyaW5nPnNldCgpOwotLy8JCQotLy8JCS8vIHByb2Nlc3MgcGFja2FnZXMgd2l0aCBhbm5vdGF0aW9ucyBmaXJzdAotLy8JCWZvciAoU3RyaW5nIHBrZyA6IGNhbGN1bGF0ZUluaXRpYWxQYWNrYWdlTmFtZXMoKSkgewotLy8JCQl0aGlzLnBhY2thZ2VzLnB1dChwa2csIGJ1aWxkUGFja2FnZShwa2cpKTsKLS8vCQl9Ci0vLwkJCi0vLwkJLy8gY2FsY3VsYXRlIGluaXRpYWwgdHlwZXMgKGFubm90YXRlZCBvciBsaXN0ZWQgaW4gamF4Yi5pbmRleCBmaWxlcykKLS8vCQlmaW5hbCBTZXQ8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiByZXNvdXJjZVR5cGVzVG9Qcm9jZXNzID0gY2FsY3VsYXRlSW5pdGlhbFR5cGVzKCk7Ci0vLwkJCi0vLwkJLy8gd2hpbGUgdGhlcmUgYXJlIHJlc291cmNlIHR5cGVzIHRvIHByb2Nlc3Mgb3IgdHlwZXMgdG8gc2NhbiwgY29udGludWUgdG8gZG8gc28KLS8vCQl3aGlsZSAoISByZXNvdXJjZVR5cGVzVG9Qcm9jZXNzLmlzRW1wdHkoKSB8fCAhIHR5cGVzVG9TY2FuLmlzRW1wdHkoKSkgewotLy8JCQlmb3IgKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgOiBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4ocmVzb3VyY2VUeXBlc1RvUHJvY2VzcykpIHsKLS8vCQkJCVN0cmluZyBjbGFzc05hbWUgPSByZXNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotLy8JCQkJdG90YWxUeXBlcy5hZGQoY2xhc3NOYW1lKTsKLS8vCQkJCXR5cGVzVG9TY2FuLmFkZChjbGFzc05hbWUpOwotLy8JCQkJYWRkVHlwZV8oYnVpbGRUeXBlKHJlc291cmNlVHlwZSkpOwotLy8JCQkJcmVzb3VyY2VUeXBlc1RvUHJvY2Vzcy5yZW1vdmUocmVzb3VyY2VUeXBlKTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJZm9yIChTdHJpbmcgdHlwZVRvU2NhbiA6IG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPih0eXBlc1RvU2NhbikpIHsKLS8vCQkJCUpheGJUeXBlIGpheGJUeXBlID0gZ2V0VHlwZSh0eXBlVG9TY2FuKTsKLS8vCQkJCWlmIChqYXhiVHlwZSAhPSBudWxsKSB7Ci0vLwkJCQkJZm9yIChTdHJpbmcgcmVmZXJlbmNlZFR5cGVOYW1lIDogamF4YlR5cGUuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpKSB7Ci0vLwkJCQkJCWlmICghIHRvdGFsVHlwZXMuY29udGFpbnMocmVmZXJlbmNlZFR5cGVOYW1lKSkgewotLy8JCQkJCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlZmVyZW5jZWRUeXBlID0gZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKHJlZmVyZW5jZWRUeXBlTmFtZSk7Ci0vLwkJCQkJCQlpZiAocmVmZXJlbmNlZFR5cGUgIT0gbnVsbCkgewotLy8JCQkJCQkJCXJlc291cmNlVHlwZXNUb1Byb2Nlc3MuYWRkKHJlZmVyZW5jZWRUeXBlKTsKLS8vCQkJCQkJCX0KLS8vCQkJCQkJfQotLy8JCQkJCX0KLS8vCQkJCX0KLS8vCQkJCXR5cGVzVG9TY2FuLnJlbW92ZSh0eXBlVG9TY2FuKTsKLS8vCQkJfQotLy8JCX0KLS8vCQkKLS8vCQkvLyBvbmNlIGFsbCBjbGFzc2VzIGhhdmUgYmVlbiBwcm9jZXNzZWQsIGFkZCBwYWNrYWdlcwotLy8JCWZvciAoU3RyaW5nIHBrZyA6IGNhbGN1bGF0ZVBhY2thZ2VOYW1lcyh0b3RhbFR5cGVzKSkgewotLy8JCQlpZiAoISB0aGlzLnBhY2thZ2VzLmNvbnRhaW5zS2V5KHBrZykpIHsKLS8vCQkJCXRoaXMucGFja2FnZXMucHV0KHBrZywgYnVpbGRQYWNrYWdlKHBrZykpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCWZvciAoSmF4YlBhY2thZ2UgZWFjaCA6IGdldFBhY2thZ2VzKCkpIHsKLQkJCWVhY2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JCWZvciAoSmF4YlR5cGUgZWFjaCA6IGdldFR5cGVzKCkpIHsKLQkJCWVhY2guc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCQotCQkvLyBrZWVwIGEgbWFzdGVyIGxpc3Qgb2YgdGhlc2Ugc28gdGhhdCBvYmplY3RzIGFyZSB1cGRhdGVkIG9ubHkgb25jZQotCQlmaW5hbCBTZXQ8U3RyaW5nPiBwYWNrYWdlc1RvVXBkYXRlID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c2V0KCk7Ci0JCWZpbmFsIFNldDxTdHJpbmc+IHR5cGVzVG9VcGRhdGUgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zZXQoKTsKLQkJCi0JCS8vIGtlZXAgYSAoc2hyaW5raW5nKSBydW5uaW5nIGxpc3Qgb2YgdGhlc2Ugc28gdGhhdCB3ZSBrbm93IHdoaWNoIG9uZXMgd2UgZG8gZXZlbnR1YWxseSBuZWVkIHRvIHJlbW92ZQotCQlmaW5hbCBTZXQ8U3RyaW5nPiBwYWNrYWdlc1RvUmVtb3ZlID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLnBhY2thZ2VzLmtleVNldCgpKTsKLQkJZmluYWwgU2V0PFN0cmluZz4gdHlwZXNUb1JlbW92ZSA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy50eXBlcy5rZXlTZXQoKSk7Ci0JCQotCQkvLyBrZWVwIGEgbWFzdGVyIGxpc3Qgb2YgYWxsIHR5cGVzIHRoYXQgd2UndmUgcHJvY2Vzc2VkIHNvIHdlIGRvbid0IHByb2Nlc3MgdGhlbSBhZ2FpbgotCQlmaW5hbCBTZXQ8U3RyaW5nPiB0b3RhbFR5cGVzID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c2V0KCk7Ci0JCQotCQkvLyBrZWVwIGFuIHJ1bm5pbmcgbGlzdCBvZiB0eXBlcyB0aGF0IHdlIG5lZWQgdG8gc2NhbiBmb3IgZnVydGhlciByZWZlcmVuY2VkIHR5cGVzCi0JCWZpbmFsIFNldDxTdHJpbmc+IHR5cGVzVG9TY2FuID0gQ29sbGVjdGlvblRvb2xzLjxTdHJpbmc+c2V0KCk7Ci0JCQotCQkvLyBwcm9jZXNzIHBhY2thZ2VzIHdpdGggYW5ub3RhdGlvbnMgZmlyc3QKLQkJZm9yIChTdHJpbmcgcGtnIDogY2FsY3VsYXRlSW5pdGlhbFBhY2thZ2VOYW1lcygpKSB7Ci0JCQlpZiAodGhpcy5wYWNrYWdlcy5jb250YWluc0tleShwa2cpKSB7Ci0JCQkJcGFja2FnZXNUb1VwZGF0ZS5hZGQocGtnKTsKLQkJCQlwYWNrYWdlc1RvUmVtb3ZlLnJlbW92ZShwa2cpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5hZGRQYWNrYWdlKHRoaXMuYnVpbGRQYWNrYWdlKHBrZykpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBjYWxjdWxhdGUgaW5pdGlhbCB0eXBlcyAoYW5ub3RhdGVkIG9yIGxpc3RlZCBpbiBqYXhiLmluZGV4IGZpbGVzKQotCQlmaW5hbCBTZXQ8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiByZXNvdXJjZVR5cGVzVG9Qcm9jZXNzID0gY2FsY3VsYXRlSW5pdGlhbFR5cGVzKCk7Ci0JCQotCQkvLyBzdG9yZSBzZXQgb2YgdHlwZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCAoYW5kIHNob3VsZCB0aGVyZWZvcmUgYmUgZGVmYXVsdCBtYXBwZWQpCi0JCWZpbmFsIFNldDxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHJlZmVyZW5jZWRUeXBlcyA9IG5ldyBIYXNoU2V0PEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4oKTsKLQkJCi0JCS8vIHdoaWxlIHRoZXJlIGFyZSByZXNvdXJjZSB0eXBlcyB0byBwcm9jZXNzIG9yIHR5cGVzIHRvIHNjYW4sIGNvbnRpbnVlIHRvIGRvIHNvCi0JCXdoaWxlICghIHJlc291cmNlVHlwZXNUb1Byb2Nlc3MuaXNFbXB0eSgpIHx8ICEgdHlwZXNUb1NjYW4uaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgOiBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4ocmVzb3VyY2VUeXBlc1RvUHJvY2VzcykpIHsKLQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gcmVzb3VyY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCQl0eXBlc1RvUmVtb3ZlLnJlbW92ZShjbGFzc05hbWUpOwotCQkJCXRvdGFsVHlwZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCQkJdHlwZXNUb1NjYW4uYWRkKGNsYXNzTmFtZSk7Ci0JCQkJcHJvY2Vzc1R5cGUocmVzb3VyY2VUeXBlLCB0eXBlc1RvVXBkYXRlLCByZWZlcmVuY2VkVHlwZXMuY29udGFpbnMocmVzb3VyY2VUeXBlKSk7Ci0JCQkJcmVzb3VyY2VUeXBlc1RvUHJvY2Vzcy5yZW1vdmUocmVzb3VyY2VUeXBlKTsKLQkJCX0KLQkJCQotCQkJZm9yIChTdHJpbmcgdHlwZVRvU2NhbiA6IG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPih0eXBlc1RvU2NhbikpIHsKLQkJCQlKYXhiVHlwZSBqYXhiVHlwZSA9IGdldFR5cGUodHlwZVRvU2Nhbik7Ci0JCQkJaWYgKGpheGJUeXBlICE9IG51bGwpIHsKLQkJCQkJZm9yIChTdHJpbmcgcmVmZXJlbmNlZFR5cGVOYW1lIDogamF4YlR5cGUuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpKSB7Ci0JCQkJCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHJlZmVyZW5jZWRUeXBlTmFtZSkgJiYgISB0b3RhbFR5cGVzLmNvbnRhaW5zKHJlZmVyZW5jZWRUeXBlTmFtZSkpIHsKLQkJCQkJCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVmZXJlbmNlZFR5cGUgPSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUocmVmZXJlbmNlZFR5cGVOYW1lKTsKLQkJCQkJCQlpZiAocmVmZXJlbmNlZFR5cGUgIT0gbnVsbCkgewotCQkJCQkJCQlyZXNvdXJjZVR5cGVzVG9Qcm9jZXNzLmFkZChyZWZlcmVuY2VkVHlwZSk7Ci0JCQkJCQkJCXJlZmVyZW5jZWRUeXBlcy5hZGQocmVmZXJlbmNlZFR5cGUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQl0eXBlc1RvU2Nhbi5yZW1vdmUodHlwZVRvU2Nhbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG9uY2UgYWxsIGNsYXNzZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgYWRkIHBhY2thZ2VzCi0JCWZvciAoU3RyaW5nIHBrZyA6IGNhbGN1bGF0ZVBhY2thZ2VOYW1lcyh0b3RhbFR5cGVzKSkgewotCQkJaWYgKHRoaXMucGFja2FnZXMuY29udGFpbnNLZXkocGtnKSkgewotCQkJCXBhY2thZ2VzVG9VcGRhdGUuYWRkKHBrZyk7Ci0JCQkJcGFja2FnZXNUb1JlbW92ZS5yZW1vdmUocGtnKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuYWRkUGFja2FnZSh0aGlzLmJ1aWxkUGFja2FnZShwa2cpKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChTdHJpbmcgcGFja2FnZVRvVXBkYXRlIDogcGFja2FnZXNUb1VwZGF0ZSkgewotCQkJdGhpcy5wYWNrYWdlcy5nZXQocGFja2FnZVRvVXBkYXRlKS51cGRhdGUoKTsKLQkJfQotCQkKLQkJZm9yIChTdHJpbmcgdHlwZVRvVXBkYXRlIDogdHlwZXNUb1VwZGF0ZSkgewotCQkJdGhpcy50eXBlcy5nZXQodHlwZVRvVXBkYXRlKS51cGRhdGUoKTsKLQkJfQotCQkKLQkJZm9yIChTdHJpbmcgcGFja2FnZVRvUmVtb3ZlIDogcGFja2FnZXNUb1JlbW92ZSkgewotCQkJcmVtb3ZlUGFja2FnZShwYWNrYWdlVG9SZW1vdmUpOwotCQl9Ci0JCQotCQlmb3IgKFN0cmluZyB0eXBlVG9SZW1vdmUgOiB0eXBlc1RvUmVtb3ZlKSB7Ci0JCQlyZW1vdmVUeXBlKHR5cGVUb1JlbW92ZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogY2FsY3VsYXRlIHNldCBvZiBwYWNrYWdlcyB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIHB1cmVseSBieSBwcmVzZW5jZSBvZiBwYWNrYWdlIGFubm90YXRpb25zCi0JICovCi0JcHJvdGVjdGVkIFNldDxTdHJpbmc+IGNhbGN1bGF0ZUluaXRpYWxQYWNrYWdlTmFtZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc2V0KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEphdmFSZXNvdXJjZVBhY2thZ2UsIFN0cmluZz4oCi0JCQkJCQlnZXRKYXhiUHJvamVjdCgpLmdldEFubm90YXRlZEphdmFSZXNvdXJjZVBhY2thZ2VzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEphdmFSZXNvdXJjZVBhY2thZ2UgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCS8qKgotCSAqIGNhbGN1bGF0ZSBzZXQgb2YgcGFja2FnZXMgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHR5cGUgbmFtZXMKLQkgKi8KLQlwcm90ZWN0ZWQgU2V0PFN0cmluZz4gY2FsY3VsYXRlUGFja2FnZU5hbWVzKFNldDxTdHJpbmc+IHR5cGVOYW1lcykgewotCQlTZXQ8U3RyaW5nPiBwYWNrYWdlTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuPFN0cmluZz5zZXQoKTsKLQkJZm9yIChTdHJpbmcgdHlwZU5hbWUgOiB0eXBlTmFtZXMpIHsKLQkJCUpheGJUeXBlIGpheGJUeXBlID0gdGhpcy50eXBlcy5nZXQodHlwZU5hbWUpOwotCQkJaWYgKGpheGJUeXBlICE9IG51bGwpIHsKLQkJCQlwYWNrYWdlTmFtZXMuYWRkKGpheGJUeXBlLmdldFBhY2thZ2VOYW1lKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYWNrYWdlTmFtZXM7Ci0JfQotCQotCS8qCi0JICogQ2FsY3VsYXRlIHNldCBvZiBpbml0aWFsIHR5cGVzCi0JICogVGhpcyBzaG91bGQgYmU6Ci0JICogLSBhbGwgcmVzb3VyY2UgdHlwZXMgd2l0aCBAWG1sVHlwZSwgQFhtbFJvb3RFbGVtZW50LCBvciBAWG1sSmF2YVR5cGVBZGFwdGVyCi0JICogLSBhbGwgcmVzb3VyY2UgY2xhc3NlcyB3aXRoIEBYbWxSZWdpc3RyeQotCSAqIC0gYWxsIHJlc291cmNlIGVudW1zIHdpdGggQFhtbEVudW0KLQkgKiAtIGFsbCB0eXBlcyBsaXN0ZWQgaW4gamF4Yi5pbmRleCBmaWxlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU2V0PEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gY2FsY3VsYXRlSW5pdGlhbFR5cGVzKCkgewotCQlTZXQ8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBzZXQgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KAotCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+KAotCQkJCQkJZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhU291cmNlUmVzb3VyY2VUeXBlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIG8pIHsKLQkJCQkJCWlmIChvLmdldEtpbmQoKSA9PSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZC5UWVBFKSB7Ci0JCQkJCQkJaWYgKG8uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9SRUdJU1RSWSkgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoby5nZXRLaW5kKCkgPT0gSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlLktpbmQuRU5VTSkgewotCQkJCQkJCWlmIChvLmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTSkgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gby5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpICE9IG51bGwKLQkJCQkJCQkJfHwgby5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCkgIT0gbnVsbAotCQkJCQkJCQl8fCBvLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpICE9IG51bGw7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCgKLQkJCQlzZXQsCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4oCi0JCQkJCQkJCW5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJJbmRleFJlc291cmNlLCBJdGVyYWJsZTxTdHJpbmc+PihnZXRKYXhiUHJvamVjdCgpLmdldEpheGJJbmRleFJlc291cmNlcygpKSB7Ci0JCQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPnRyYW5zZm9ybShKYXhiSW5kZXhSZXNvdXJjZSBvKSB7Ci0JCQkJCQkJCQkJCQlyZXR1cm4gby5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0pKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0cmFuc2Zvcm0oU3RyaW5nIG8pIHsKLQkJCQkJCQkJcmV0dXJuIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9LAotCQkJCQkJTm90TnVsbEZpbHRlci48SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPmluc3RhbmNlKCkpKTsKLQkJcmV0dXJuIHNldDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1R5cGUoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSwgU2V0PFN0cmluZz4gdHlwZXNUb1VwZGF0ZSwgYm9vbGVhbiBkZWZhdWx0TWFwcGVkKSB7Ci0JCUpheGJUeXBlLktpbmQgamF4YlR5cGVLaW5kID0gY2FsY3VsYXRlSmF4YlR5cGVLaW5kKHJlc291cmNlVHlwZSk7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSByZXNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkKLQkJaWYgKHRoaXMudHlwZXMuY29udGFpbnNLZXkoY2xhc3NOYW1lKSkgewotCQkJSmF4YlR5cGUgdHlwZSA9IHRoaXMudHlwZXMuZ2V0KGNsYXNzTmFtZSk7Ci0JCQlpZiAodHlwZS5nZXRLaW5kKCkgPT0gamF4YlR5cGVLaW5kKSB7Ci0JCQkJdHlwZXNUb1VwZGF0ZS5hZGQoY2xhc3NOYW1lKTsKLQkJCQl0eXBlLnNldERlZmF1bHRNYXBwZWQoZGVmYXVsdE1hcHBlZCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5yZW1vdmVUeXBlKGNsYXNzTmFtZSk7IC8vIHRoaXMgd2lsbCByZW1vdmUgYSB0eXBlIG9mIGFub3RoZXIga2luZAotCQkJfQotCQl9Ci0JCQotCQlKYXhiVHlwZSB0eXBlID0gYnVpbGRUeXBlKHJlc291cmNlVHlwZSk7Ci0JCXR5cGUuc2V0RGVmYXVsdE1hcHBlZChkZWZhdWx0TWFwcGVkKTsKLQkJdGhpcy5hZGRUeXBlKHR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlR5cGUuS2luZCBjYWxjdWxhdGVKYXhiVHlwZUtpbmQoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSkgewotCQlpZiAocmVzb3VyY2VUeXBlLmdldEtpbmQoKSA9PSBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZC5FTlVNKSB7Ci0JCQlyZXR1cm4gSmF4YlR5cGUuS2luZC5FTlVNOwotCQl9Ci0JCS8vIGVsc2UgaXMgb2Yga2luZCBUWVBFCi0JCWVsc2UgewotCQkJcmV0dXJuIEpheGJUeXBlLktpbmQuQ0xBU1M7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJUeXBlIGJ1aWxkVHlwZShKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCUpheGJUeXBlLktpbmQga2luZCA9IGNhbGN1bGF0ZUpheGJUeXBlS2luZChyZXNvdXJjZVR5cGUpOwotCQlpZiAoa2luZCA9PSBKYXhiVHlwZS5LaW5kLkVOVU0pIHsKLQkJCXJldHVybiBidWlsZEpheGJFbnVtKChKYXZhUmVzb3VyY2VFbnVtKSByZXNvdXJjZVR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGJ1aWxkSmF4YkNsYXNzKChKYXZhUmVzb3VyY2VUeXBlKSByZXNvdXJjZVR5cGUpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIEFic3RyYWN0SmF4Yk5vZGUgb3ZlcnJpZGVzICoqKioqIAotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUHJvamVjdCBnZXRKYXhiUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF4YlByb2plY3Q7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQcm9qZWN0LmdldFByb2plY3QoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcGFja2FnZXMgKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YlBhY2thZ2U+IGdldFBhY2thZ2VzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpheGJQYWNrYWdlPih0aGlzLnBhY2thZ2VzLnZhbHVlcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRQYWNrYWdlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnBhY2thZ2VzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF4YlBhY2thZ2UgZ2V0UGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJZm9yIChKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA6IHRoaXMuZ2V0UGFja2FnZXMoKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChqYXhiUGFja2FnZS5nZXROYW1lKCksIHBhY2thZ2VOYW1lKSkgewotCQkJCXJldHVybiBqYXhiUGFja2FnZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGFkZFBhY2thZ2UoSmF4YlBhY2thZ2UgY29udGV4dFBhY2thZ2UpIHsKLQkJaWYgKHRoaXMucGFja2FnZXMuY29udGFpbnNLZXkoY29udGV4dFBhY2thZ2UuZ2V0TmFtZSgpKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUGFja2FnZSB3aXRoIHRoYXQgbmFtZSBhbHJlYWR5IGV4aXN0cy4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMucGFja2FnZXMucHV0KGNvbnRleHRQYWNrYWdlLmdldE5hbWUoKSwgY29udGV4dFBhY2thZ2UpOwotCQlmaXJlSXRlbUFkZGVkKFBBQ0tBR0VTX0NPTExFQ1RJT04sIGNvbnRleHRQYWNrYWdlKTsKLQkJcmV0dXJuIGNvbnRleHRQYWNrYWdlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQYWNrYWdlKEpheGJQYWNrYWdlIGNvbnRleHRQYWNrYWdlKSB7Ci0JCXRoaXMucmVtb3ZlUGFja2FnZShjb250ZXh0UGFja2FnZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlpZiAoISB0aGlzLnBhY2thZ2VzLmNvbnRhaW5zS2V5KHBhY2thZ2VOYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gcGFja2FnZSB3aXRoIHRoYXQgbmFtZSBleGlzdHMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXhiUGFja2FnZSByZW1vdmVkUGFja2FnZSA9IHRoaXMucGFja2FnZXMucmVtb3ZlKHBhY2thZ2VOYW1lKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFBBQ0tBR0VTX0NPTExFQ1RJT04sIHJlbW92ZWRQYWNrYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGJ1aWxkUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJ1aWxkUGFja2FnZSh0aGlzLCBwYWNrYWdlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW1wdHkoSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UpIHsKLQkJcmV0dXJuIGpheGJQYWNrYWdlLmlzRW1wdHkoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdHlwZXMgKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YlR5cGU+IGdldFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpheGJUeXBlPih0aGlzLnR5cGVzLnZhbHVlcygpKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRUeXBlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIEpheGJUeXBlIGdldFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0eXBlTmFtZSA9PSBudWxsID8gbnVsbCA6IHRoaXMudHlwZXMuZ2V0KHR5cGVOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZV8oSmF4YlR5cGUgdHlwZSkgewotCQl0aGlzLnR5cGVzLnB1dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCB0eXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVHlwZShKYXhiVHlwZSB0eXBlKSB7Ci0JCWlmICh0aGlzLnR5cGVzLmNvbnRhaW5zS2V5KHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUeXBlIHdpdGggdGhhdCBuYW1lIGFscmVhZHkgZXhpc3RzLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYWRkVHlwZV8odHlwZSk7Ci0JCWZpcmVJdGVtQWRkZWQoVFlQRVNfQ09MTEVDVElPTiwgdHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVR5cGUoSmF4YlR5cGUgdHlwZSkgewotCQlyZW1vdmVUeXBlKHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlpZiAoISB0aGlzLnR5cGVzLmNvbnRhaW5zS2V5KHR5cGVOYW1lKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gdHlwZSB3aXRoIHRoYXQgbmFtZSBleGlzdHMuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlKYXhiVHlwZSByZW1vdmVkVHlwZSA9IHRoaXMudHlwZXMucmVtb3ZlKHR5cGVOYW1lKTsKLQkJZmlyZUl0ZW1SZW1vdmVkKFRZUEVTX0NPTExFQ1RJT04sIHJlbW92ZWRUeXBlKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJUeXBlPiBnZXRUeXBlcyhmaW5hbCBKYXhiUGFja2FnZSBqYXhiUGFja2FnZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXhiVHlwZSBvKSB7Ci0JCQkJcmV0dXJuIG8uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMoamF4YlBhY2thZ2UuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJDbGFzcz4gZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBTdWJJdGVyYWJsZVdyYXBwZXI8SmF4YlR5cGUsIEpheGJDbGFzcz4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YlR5cGUgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0S2luZCgpID09IEpheGJUeXBlLktpbmQuQ0xBU1M7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJDbGFzcz4gZ2V0Q2xhc3NlcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxKYXhiVHlwZSwgSmF4YkNsYXNzPigKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF4YlR5cGU+KGdldFR5cGVzKGpheGJQYWNrYWdlKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpheGJUeXBlIG8pIHsKLQkJCQkJCXJldHVybiBvLmdldEtpbmQoKSA9PSBKYXhiVHlwZS5LaW5kLkNMQVNTOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiRW51bT4gZ2V0RW51bXMoKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEpheGJUeXBlLCBKYXhiRW51bT4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YlR5cGUgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0S2luZCgpID09IEpheGJUeXBlLktpbmQuRU5VTTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YkVudW0+IGdldEVudW1zKEpheGJQYWNrYWdlIGpheGJQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEpheGJUeXBlLCBKYXhiRW51bT4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJUeXBlPihnZXRUeXBlcyhqYXhiUGFja2FnZSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXhiVHlwZSBvKSB7Ci0JCQkJCQlyZXR1cm4gby5nZXRLaW5kKCkgPT0gSmF4YlR5cGUuS2luZC5FTlVNOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3MgYnVpbGRKYXhiQ2xhc3MoSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjdG9yeSgpLmJ1aWxkSmF4YkNsYXNzKHRoaXMsIHJlc291cmNlVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiRW51bSBidWlsZEpheGJFbnVtKEphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtKSB7Ci0JCXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5idWlsZEpheGJFbnVtKHRoaXMsIHJlc291cmNlRW51bSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxYbWxSZWdpc3RyeT4gZ2V0WG1sUmVnaXN0cmllcyhKYXhiUGFja2FnZSBqYXhiUGFja2FnZSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFhtbFJlZ2lzdHJ5PigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiQ2xhc3MsIFhtbFJlZ2lzdHJ5PihnZXRDbGFzc2VzKGpheGJQYWNrYWdlKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFhtbFJlZ2lzdHJ5IHRyYW5zZm9ybShKYXhiQ2xhc3MgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCQkJfQotCQkJCX0sCi0JCQkJTm90TnVsbEZpbHRlci5JTlNUQU5DRSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUpheGJUeXBlIHR5cGUgPSBnZXRUeXBlKHR5cGVOYW1lKTsKLQkJcmV0dXJuICh0eXBlID09IG51bGwpID8gbnVsbCA6IHR5cGUuZ2V0TWFwcGluZygpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkNsYXNzTWFwcGluZyBnZXRDbGFzc01hcHBpbmcoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUpheGJUeXBlIHR5cGUgPSBnZXRUeXBlKHR5cGVOYW1lKTsKLQkJcmV0dXJuICh0eXBlID09IG51bGwgfHwgKHR5cGUuZ2V0S2luZCgpICE9IEpheGJUeXBlLktpbmQuQ0xBU1MpKSA/IAotCQkJCW51bGwgOiAoKEpheGJDbGFzcykgdHlwZSkuZ2V0TWFwcGluZygpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLnN0YXRlQ2hhbmdlZCgpOwotCQkvLyBmb3J3YXJkIHRvIEpBWEIgcHJvamVjdAotCQl0aGlzLmpheGJQcm9qZWN0LnN0YXRlQ2hhbmdlZCgpOwotICAgIH0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZvciAoSmF4YlBhY2thZ2UgcGtnIDogdGhpcy5wYWNrYWdlcy52YWx1ZXMoKSkgewotCQkJcGtnLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQkJZm9yIChKYXhiVHlwZSB0eXBlIDogdGhpcy50eXBlcy52YWx1ZXMoKSkgewotCQkJdHlwZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljQ29udGV4dFJvb3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY0NvbnRleHRSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNTJmYzAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljQ29udGV4dFJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0NvbnRleHRSb290Ci0JCWV4dGVuZHMgQWJzdHJhY3RKYXhiQ29udGV4dFJvb3QgewotCQotCXB1YmxpYyBHZW5lcmljQ29udGV4dFJvb3QoSmF4YlByb2plY3QgamF4YlByb2plY3QpIHsKLQkJc3VwZXIoamF4YlByb2plY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY1BhY2thZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY1BhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmZjJiMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L0dlbmVyaWNQYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOc0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNQYWNrYWdlCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiUGFja2FnZSB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lOwotCQotCXByb3RlY3RlZCBKYXhiUGFja2FnZUluZm8gcGFja2FnZUluZm87Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNQYWNrYWdlKEpheGJDb250ZXh0Um9vdCBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UganJwID0gZ2V0SmF4YlByb2plY3QoKS5nZXRBbm5vdGF0ZWRKYXZhUmVzb3VyY2VQYWNrYWdlKHRoaXMubmFtZSk7Ci0JCWlmIChqcnAgIT0gbnVsbCkgewotCQkJdGhpcy5wYWNrYWdlSW5mbyA9IGJ1aWxkUGFja2FnZUluZm8oanJwKTsKLQkJfQotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCWlmICh0aGlzLnBhY2thZ2VJbmZvICE9IG51bGwpIHsgCi0JCQl0aGlzLnBhY2thZ2VJbmZvLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8vQnVpbGRpbmcvcmVtb3Zpbmcgb2YgdGhlIHBhY2thZ2VJbmZvIGlzIGluIHRoZSB1cGRhdGUgYmVjYXVzZSB0aGlzIGlzIGRlcGVuZGVudAotCS8vb24gYSBKYXhiRmlsZSBiZWluZyBhZGRlZC9yZW1vdmVkIHdoaWNoIG9ubHkgY2F1c2VzIGFuIHVwZGF0ZSBvZiB0aGUgbW9kZWwuCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBqcnAgPSBnZXRKYXhiUHJvamVjdCgpLmdldEFubm90YXRlZEphdmFSZXNvdXJjZVBhY2thZ2UodGhpcy5uYW1lKTsKLQkJaWYgKGpycCA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldFBhY2thZ2VJbmZvXyhudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmICh0aGlzLnBhY2thZ2VJbmZvID09IG51bGwpIHsKLQkJCQl0aGlzLnNldFBhY2thZ2VJbmZvXyh0aGlzLmJ1aWxkUGFja2FnZUluZm8oanJwKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnBhY2thZ2VJbmZvLnVwZGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbmFtZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBwYWNrYWdlIGluZm8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgSmF4YlBhY2thZ2VJbmZvIGdldFBhY2thZ2VJbmZvKCkgewotCQlyZXR1cm4gdGhpcy5wYWNrYWdlSW5mbzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFja2FnZUluZm9fKEpheGJQYWNrYWdlSW5mbyBwYWNrYWdlSW5mbykgewotCQlKYXhiUGFja2FnZUluZm8gb2xkID0gdGhpcy5wYWNrYWdlSW5mbzsKLQkJdGhpcy5wYWNrYWdlSW5mbyA9IHBhY2thZ2VJbmZvOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFBBQ0tBR0VfSU5GT19QUk9QRVJUWSwgb2xkLCB0aGlzLnBhY2thZ2VJbmZvKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlSW5mbyBidWlsZFBhY2thZ2VJbmZvKEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KCkuYnVpbGRKYXZhUGFja2FnZUluZm8odGhpcywgcmVzb3VyY2VQYWNrYWdlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIGdldFBhY2thZ2VJbmZvKCkgPT0gbnVsbCAmJiBnZXRSZWdpc3RyeSgpID09IG51bGw7Ci0JfQotCQotCXB1YmxpYyBYbWxSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJSXRlcmFibGU8WG1sUmVnaXN0cnk+IHJlZ2lzdHJpZXMgPSBnZXRDb250ZXh0Um9vdCgpLmdldFhtbFJlZ2lzdHJpZXModGhpcyk7Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZWdpc3RyaWVzKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5nZXQocmVnaXN0cmllcywgMCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbWlzYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gKGdldFBhY2thZ2VJbmZvKCkgPT0gbnVsbCkgPyAiIiA6IGdldFBhY2thZ2VJbmZvKCkuZ2V0WG1sU2NoZW1hKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBYbWxOc0Zvcm0gZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiAoZ2V0UGFja2FnZUluZm8oKSA9PSBudWxsKSA/IFhtbE5zRm9ybS5VTlNFVCA6IGdldFBhY2thZ2VJbmZvKCkuZ2V0WG1sU2NoZW1hKCkuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKTsKLQl9Ci0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiAoZ2V0UGFja2FnZUluZm8oKSA9PSBudWxsKSA/IFhtbE5zRm9ybS5VTlNFVCA6IGdldFBhY2thZ2VJbmZvKCkuZ2V0WG1sU2NoZW1hKCkuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCk7Ci0JfQotCQotCXB1YmxpYyBYc2RTY2hlbWEgZ2V0WHNkU2NoZW1hKCkgewotCQlyZXR1cm4gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKGdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKGdldE5hbWVzcGFjZSgpKSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5QQUNLQUdFX05PX1NDSEVNQV9GT1JfTkFNRVNQQUNFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHtnZXROYW1lc3BhY2UoKSwgdGhpcy5uYW1lfSwKLQkJCQkJCXRoaXMpKTsKLQkJfQotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAodGhpcy5wYWNrYWdlSW5mbyAhPSBudWxsKSB7Ci0JCQl0aGlzLnBhY2thZ2VJbmZvLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQWRhcHRhYmxlQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4Y2Q3ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQWRhcHRhYmxlQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFkYXB0YWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFBZGFwdGFibGVBdHRyaWJ1dGVNYXBwaW5nPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8QT4KLQkJaW1wbGVtZW50cyBYbWxBZGFwdGFibGVNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlcjsKLQkKLQkKLQlwdWJsaWMgQWJzdHJhY3RKYXZhQWRhcHRhYmxlQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbEphdmFUeXBlQWRhcHRlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl1cGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sSmF2YVR5cGVBZGFwdGVyICoqKioqCi0JCi0JcHVibGljIFhtbEphdmFUeXBlQWRhcHRlciBnZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEphdmFUeXBlQWRhcHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxKYXZhVHlwZUFkYXB0ZXJfKFhtbEphdmFUeXBlQWRhcHRlciB4bWxKYXZhVHlwZUFkYXB0ZXIpIHsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIG9sZFhtbEphdmFUeXBlQWRhcHRlciA9IHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyOwotCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlciA9IHhtbEphdmFUeXBlQWRhcHRlcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfSkFWQV9UWVBFX0FEQVBURVJfUFJPUEVSVFksIG9sZFhtbEphdmFUeXBlQWRhcHRlciwgeG1sSmF2YVR5cGVBZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIFhtbEphdmFUeXBlQWRhcHRlciBhZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyID0gYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoYW5ub3RhdGlvbik7Ci0JCXNldFhtbEphdmFUeXBlQWRhcHRlcl8oeG1sSmF2YVR5cGVBZGFwdGVyKTsKLQkJcmV0dXJuIHhtbEphdmFUeXBlQWRhcHRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlzZXRYbWxKYXZhVHlwZUFkYXB0ZXJfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyIGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24geG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyKHRoaXMsIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyID0gYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEphdmFUeXBlQWRhcHRlcigpIHsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbEphdmFUeXBlQWRhcHRlcl8oYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoYW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sSmF2YVR5cGVBZGFwdGVyXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlci51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxBZGFwdGVyICoqKioqCi0JCi0JcHVibGljIFhtbEFkYXB0ZXIgZ2V0WG1sQWRhcHRlcigpIHsKLQkJLy8gc2VlIGlmIHRoZXJlIGlzIGFuIHhtbCBhZGFwdGVyIHNwZWNpZmllZCBvbiB0aGlzIGF0dHJpYnV0ZQotCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyLmdldFhtbEFkYXB0ZXIoKTsKLQkJfQotCQkKLQkJU3RyaW5nIGJvdW5kVHlwZU5hbWUgPSBnZXRCb3VuZFR5cGVOYW1lKCk7Ci0JCQotCQkvLyBzZWUgaWYgdGhlcmUgaXMgYW4geG1sIGFkYXB0ZXIgc3BlY2lmaWVkIG9uIHRoZSB0eXBlCi0JCUpheGJUeXBlIGJvdW5kVHlwZSA9IGdldENvbnRleHRSb290KCkuZ2V0VHlwZShib3VuZFR5cGVOYW1lKTsKLQkJaWYgKGJvdW5kVHlwZSAhPSBudWxsKSB7Ci0JCQlYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyID0gYm91bmRUeXBlLmdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkJaWYgKHhtbEphdmFUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHhtbEphdmFUeXBlQWRhcHRlci5nZXRYbWxBZGFwdGVyKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHNlZSBpZiB0aGVyZSBpcyBhbiB4bWwgYWRhcHRlciBvbiB0aGUgcGFja2FnZQotCQlKYXhiUGFja2FnZSBwa2cgPSBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCQlKYXhiUGFja2FnZUluZm8gcGtnSW5mbyA9IChwa2cgPT0gbnVsbCkgPyBudWxsIDogcGtnLmdldFBhY2thZ2VJbmZvKCk7Ci0JCWlmIChwa2dJbmZvICE9IG51bGwpIHsKLQkJCVhtbEphdmFUeXBlQWRhcHRlciB4bWxKYXZhVHlwZUFkYXB0ZXIgPSBwa2dJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcihib3VuZFR5cGVOYW1lKTsKLQkJCWlmICh4bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiB4bWxKYXZhVHlwZUFkYXB0ZXIuZ2V0WG1sQWRhcHRlcigpOwotCQkJfQotCQl9Ci0JCQotCQkvLyBzZWUgaWYgdGhlcmUgaXMgYW4geG1sIGFkYXB0ZXIgb24gdGhlICp0eXBlJ3MqIHBhY2thZ2UKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShib3VuZFR5cGVOYW1lKTsKLQkJaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQlwa2cgPSBnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2UocmVzb3VyY2VUeXBlLmdldFBhY2thZ2VOYW1lKCkpOwotCQkJcGtnSW5mbyA9IChwa2cgPT0gbnVsbCkgPyBudWxsIDogcGtnLmdldFBhY2thZ2VJbmZvKCk7Ci0JCQlpZiAocGtnSW5mbyAhPSBudWxsKSB7Ci0JCQkJWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlciA9IHBrZ0luZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKGJvdW5kVHlwZU5hbWUpOwotCQkJCWlmICh4bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4geG1sSmF2YVR5cGVBZGFwdGVyLmdldFhtbEFkYXB0ZXIoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVR5cGVOYW1lKCkgewotCQlYbWxBZGFwdGVyIHhtbEFkYXB0ZXIgPSBnZXRYbWxBZGFwdGVyKCk7Ci0JCXJldHVybiAoeG1sQWRhcHRlciA9PSBudWxsKSA/IHN1cGVyLmdldFZhbHVlVHlwZU5hbWUoKSA6IHhtbEFkYXB0ZXIuZ2V0VmFsdWVUeXBlKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTM5YWVjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RVdGlsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxBIGV4dGVuZHMgQW5ub3RhdGlvbj4KLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEpheGJBdHRyaWJ1dGVNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0XzsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmRlZmF1bHRfID0gdGhpcy5idWlsZERlZmF1bHQoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpheGJDbGFzc01hcHBpbmcgZ2V0Q2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY0RlZmF1bHQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiAqKioqKioqKioqCi0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEEgZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChBKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHdoZW4gYW4gYW5ub3RhdGlvbiAqbXVzdCogYmUgcHJlc2VudCAoc3VjaCBhcyB3aGVuIHNldHRpbmcgZmllbGRzIG9uIGl0KS4KLQkgKiBGb3IgbW9zdCBtYXBwaW5ncywgdGhpcyBpcyBlcXVpdmFsZW50IHRvICNnZXRBbm5vdGF0aW9uKCksIGJ1dCBmb3IgZGVmYXVsdCBtYXBwaW5ncyAoc3VjaCBhcyBAWG1sRWxlbWVudCkKLQkgKiBhbiBhbm5vdGF0aW9uIHdpbGwgYmUgYWRkZWQgaWYgbm9uZSBjdXJyZW50bHkgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBBIGdldE9yQ3JlYXRlQW5ub3RhdGlvbigpIHsKLQkJQSBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuc2V0TWFwcGluZ0tleShnZXRLZXkoKSk7Ci0JCQlhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOwotCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgYW5ub3RhdGlvbjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZGVmYXVsdCAqKioqKioqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0XzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gZGVmYXVsdF8pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRfOwotCQl0aGlzLmRlZmF1bHRfID0gZGVmYXVsdF87Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRfKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jRGVmYXVsdCgpIHsKLQkJdGhpcy5zZXREZWZhdWx0KHRoaXMuYnVpbGREZWZhdWx0KCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbigpID09IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpID09IG51bGwgPyBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpIDogZ2V0QW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQkKLQlwdWJsaWMgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldEpheGJDbGFzc01hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Q2xhc3NNYXBwaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRCb3VuZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRCb3VuZFR5cGVOYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0VmFsdWVUeXBlTmFtZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGV4cGVjdGVkIHNjaGVtYSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0eXBlCi0JICovCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKSB7Ci0JCVN0cmluZyBkYXRhVHlwZSA9IGdldERhdGFUeXBlTmFtZSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkYXRhVHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKYXhiUGFja2FnZSBwa2cgPSBnZXRKYXhiUGFja2FnZSgpOwotCQlKYXhiUGFja2FnZUluZm8gcGtnSW5mbyA9IChwa2cgPT0gbnVsbCkgPyBudWxsIDogcGtnLmdldFBhY2thZ2VJbmZvKCk7Ci0JCWlmIChwa2dJbmZvICE9IG51bGwpIHsKLQkJCWZvciAoWG1sU2NoZW1hVHlwZSBzY2hlbWFUeXBlIDogcGtnSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpKSB7Ci0JCQkJaWYgKGRhdGFUeXBlLmVxdWFscyhzY2hlbWFUeXBlLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKSkgewotCQkJCQlyZXR1cm4gc2NoZW1hVHlwZS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJSmF4YlR5cGVNYXBwaW5nIGpheGJUeXBlTWFwcGluZyA9IGdldENvbnRleHRSb290KCkuZ2V0VHlwZU1hcHBpbmcoZGF0YVR5cGUpOwotCQlpZiAoamF4YlR5cGVNYXBwaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBqYXhiVHlwZU1hcHBpbmcuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJfQotCQkKLQkJU3RyaW5nIGJ1aWx0SW5UeXBlID0gZ2V0SmF4YlByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLmdldERlZmluaXRpb24oKS5nZXRTY2hlbWFUeXBlTWFwcGluZyhkYXRhVHlwZSk7Ci0JCWlmIChidWlsdEluVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gWHNkVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbihidWlsdEluVHlwZSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KGdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JfQotCQotCS8qIGRlZmF1bHQgaW1wbCAqLwotCXB1YmxpYyBib29sZWFuIGlzUGFydGljbGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qIGRlZmF1bHQgaW1wbCAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1ZDcxYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24uICBPdmVycmlkZSBpZiB0aGUgbWFwcGluZyBkZWZpbml0aW9uIG5lZWRzIHRvIGRvIG1vcmUgYW5hbHlzaXMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKGdldEFubm90YXRpb25OYW1lKCkpIAotCQkJIT0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Y4MzI3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0SmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlleHRlbmRzIEFic3RyYWN0SmF4YkNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF2YUNvbnRleHROb2RlIHsKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUoSmF4Yk5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGFic3RyYWN0IFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBBbGwgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zIHtAbGluayAjdmFsaWRhdGUoTGlzdCwgQ29tcGlsYXRpb25Vbml0KSl9IAotCSAqIHNob3VsZCBiZSBwcmVjZWRlZCBieSBhICJzdXBlciIgY2FsbCB0byB0aGlzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVsZW1lbnRRTmFtZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVsZW1lbnRRTmFtZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2VkZWZjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbGVtZW50UU5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFbGVtZW50UU5hbWUKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCi0JcHVibGljIEFic3RyYWN0SmF2YUVsZW1lbnRRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBBYnN0cmFjdEphdmFRTmFtZS5Bbm5vdGF0aW9uUHJveHkgcHJveHkpIHsKLQkJc3VwZXIocGFyZW50LCBwcm94eSk7Ci0JfQotCQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLlhNTF9FTEVNRU5UX0RFU0M7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCi0JcHJvdGVjdGVkIEpheGJDbGFzc01hcHBpbmcgZ2V0SmF4YkNsYXNzTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRDbGFzc01hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldEpheGJUeXBlKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJaWYgKHhzZFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQkKLQkJWG1sRWxlbWVudFdyYXBwZXIgZWxlbWVudFdyYXBwZXIgPSBnZXRFbGVtZW50V3JhcHBlcigpOwotCQkKLQkJaWYgKGVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCXJldHVybiB4c2RUeXBlLmdldEVsZW1lbnROYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJWHNkRWxlbWVudERlY2xhcmF0aW9uIHhzZFdyYXBwZXJFbGVtZW50ID0gZWxlbWVudFdyYXBwZXIuZ2V0WHNkRWxlbWVudERlY2xhcmF0aW9uKCk7Ci0JCQlpZiAoeHNkV3JhcHBlckVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiB4c2RXcmFwcGVyRWxlbWVudC5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCkgewotCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IHRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJcmV0dXJuIChqYXhiUGFja2FnZSAhPSBudWxsICYmIGpheGJQYWNrYWdlLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpID09IFhtbE5zRm9ybS5RVUFMSUZJRUQpID8KLQkJCQlnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSA6ICIiOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpIDogc2NoZW1hLmdldE5hbWVzcGFjZVByb3Bvc2FscyhmaWx0ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVmZXJlbmNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJaWYgKHhzZFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlYc2RFbGVtZW50RGVjbGFyYXRpb24gcmVzb2x2ZWRYc2RFbGVtZW50ID0gbnVsbDsKLQkJCi0JCVhtbEVsZW1lbnRXcmFwcGVyIGVsZW1lbnRXcmFwcGVyID0gZ2V0RWxlbWVudFdyYXBwZXIoKTsKLQkJCi0JCWlmIChlbGVtZW50V3JhcHBlciA9PSBudWxsKSB7Ci0JCQlyZXNvbHZlZFhzZEVsZW1lbnQgPSB4c2RUeXBlLmdldEVsZW1lbnQoZ2V0TmFtZXNwYWNlKCksIGdldE5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlYc2RFbGVtZW50RGVjbGFyYXRpb24geHNkV3JhcHBlckVsZW1lbnQgPSBlbGVtZW50V3JhcHBlci5nZXRYc2RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQkJCWlmICh4c2RXcmFwcGVyRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJLy8gdGhlcmUgd2lsbCBiZSBhIHNlcGFyYXRlIG1lc3NhZ2UgZm9yIHVucmVzb2x2ZWQgd3JhcHBlciBlbGVtZW50Ci0JCQkJLy8gbm8gbmVlZCB0byBhbHNvIGhhdmUgYSBtZXNzYWdlIGZvciB0aGUgbmVzdGVkIGVsZW1lbnQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlyZXNvbHZlZFhzZEVsZW1lbnQgPSB4c2RXcmFwcGVyRWxlbWVudC5nZXRFbGVtZW50KGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkpOwotCQl9Ci0JCQotCQlpZiAocmVzb2x2ZWRYc2RFbGVtZW50ID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZChnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFRTmFtZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVFOYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjgxZDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVFOYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuUU5hbWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFRTmFtZQotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlIAotCQlpbXBsZW1lbnRzIEpheGJRTmFtZSB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEFubm90YXRpb25Qcm94eSBwcm94eTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWVzcGFjZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7Ci0JCi0JCi0JcHVibGljIEFic3RyYWN0SmF2YVFOYW1lKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIEFubm90YXRpb25Qcm94eSBwcm94eSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlID0gZ2V0QW5ub3RhdGlvbk5hbWVzcGFjZSgpOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXNldFNwZWNpZmllZE5hbWVzcGFjZV8oZ2V0QW5ub3RhdGlvbk5hbWVzcGFjZSgpKTsKLQkJc2V0U3BlY2lmaWVkTmFtZV8oZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpOwotCQotCXByb3RlY3RlZCBmaW5hbCBYc2RTY2hlbWEgZ2V0WHNkU2NoZW1hKCkgewotCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IHRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJcmV0dXJuIChqYXhiUGFja2FnZSA9PSBudWxsKSA/IG51bGwgOiBqYXhiUGFja2FnZS5nZXRYc2RTY2hlbWEoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldFNwZWNpZmllZE5hbWVzcGFjZSgpKSA/IC8vIG5hbWVzcGFjZT0iIiBpcyBhY3R1YWxseSBpbnRlcnByZXRlZCBhcyB1bnNwZWNpZmllZCBieSBKQVhCIHRvb2xzCi0JCQkJZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIDogZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lc3BhY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWVzcGFjZShTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZXNwYWNlKSB7Ci0JCXNldEFubm90YXRpb25OYW1lc3BhY2UobmV3U3BlY2lmaWVkTmFtZXNwYWNlKTsKLQkJc2V0U3BlY2lmaWVkTmFtZXNwYWNlXyhuZXdTcGVjaWZpZWROYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lc3BhY2VfKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZE5hbWVzcGFjZSA9IHRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlOwotCQl0aGlzLnNwZWNpZmllZE5hbWVzcGFjZSA9IG5ld1NwZWNpZmllZE5hbWVzcGFjZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRVNQQUNFX1BST1BFUlRZLCBvbGROYW1lc3BhY2UsIG5ld1NwZWNpZmllZE5hbWVzcGFjZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEFubm90YXRpb25OYW1lc3BhY2UoU3RyaW5nIG5ld05hbWVzcGFjZSkgewotCQl0aGlzLnByb3h5LnNldE5hbWVzcGFjZShuZXdOYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5LmdldE5hbWVzcGFjZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCA/IGdldERlZmF1bHROYW1lKCkgOiBnZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJc2V0QW5ub3RhdGlvbk5hbWUobmV3U3BlY2lmaWVkTmFtZSk7Ci0JCXNldFNwZWNpZmllZE5hbWVfKG5ld1NwZWNpZmllZE5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5ld1NwZWNpZmllZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmV3U3BlY2lmaWVkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBuZXdTcGVjaWZpZWROYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0QW5ub3RhdGlvbk5hbWUoU3RyaW5nIG5ld05hbWUpIHsKLQkJdGhpcy5wcm94eS5zZXROYW1lKG5ld05hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wcm94eS5nZXROYW1lKCk7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAodGhpcy5wcm94eS5uYW1lc3BhY2VUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoZmlsdGVyKTsKLQkJfQotCQkKLQkJaWYgKHRoaXMucHJveHkubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIGdldE5hbWVQcm9wb3NhbHMoZmlsdGVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcik7Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpOwotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKFRleHRSYW5nZSB0ZXh0UmFuZ2UsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFRleHRSYW5nZSh0aGlzLnByb3h5LmdldE5hbWVzcGFjZVRleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0VGV4dFJhbmdlKHRoaXMucHJveHkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCQotCS8qKgotCSAqIGUuZy4gIlhNTCBlbGVtZW50IgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJLy8gZGVmYXVsdCBpbXBsCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdmFsaWRhdGVOYW1lKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldE5hbWUoKSkpIHsKLQkJCXZhbGlkYXRlUmVmZXJlbmNlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdldE5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5RTkFNRV9fTUlTU0lOR19OQU1FLAotCQkJCQluZXcgU3RyaW5nW10geyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCkgfSwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlUmVmZXJlbmNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlFOQU1FX19VTlJFU09MVkVEX0NPTVBPTkVOVCwKLQkJCQluZXcgU3RyaW5nW10geyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCksIGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkgfSwKLQkJCQl0aGlzLAotCQkJCWdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIEFubm90YXRpb25Qcm94eSB7Ci0JCQotCQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0JCQotCQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKTsKLQkJCi0JCWJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCQotCQlUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkJCi0JCVN0cmluZyBnZXROYW1lKCk7Ci0JCQotCQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQkKLQkJYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCQotCQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8qKgotCSAqIHJlcHJlc2VudHMgYSB7QGxpbmsgUU5hbWVBbm5vdGF0aW9ufQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RRTmFtZUFubm90YXRpb25Qcm94eQotCQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uUHJveHkgewotCQkKLQkJcHJvdGVjdGVkIGFic3RyYWN0IFFOYW1lQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOdWxsKTsKLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQkJUU5hbWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCXJldHVybiBhbm5vdGF0aW9uID09IG51bGwgPyBudWxsIDogYW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lc3BhY2UpIHsKLQkJCWdldEFubm90YXRpb24odHJ1ZSkuc2V0TmFtZXNwYWNlKG5ld1NwZWNpZmllZE5hbWVzcGFjZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVFOYW1lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihmYWxzZSk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBmYWxzZSA6IGFubm90YXRpb24ubmFtZXNwYWNlVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJUU5hbWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldE5hbWVzcGFjZVRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCVFOYW1lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihmYWxzZSk7Ci0JCQlyZXR1cm4gYW5ub3RhdGlvbiA9PSBudWxsID8gbnVsbCA6IGFubm90YXRpb24uZ2V0TmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdTcGVjaWZpZWROYW1lKSB7Ci0JCQlnZXRBbm5vdGF0aW9uKHRydWUpLnNldE5hbWUobmV3U3BlY2lmaWVkTmFtZSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlRTmFtZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gZmFsc2UgOiBhbm5vdGF0aW9uLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJUU5hbWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdhNWNkNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFUeXBlCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiVHlwZSB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGU7Ci0JCi0JcHJvdGVjdGVkIEpheGJUeXBlTWFwcGluZyBtYXBwaW5nOwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRNYXBwZWQgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlcjsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhVHlwZShKYXhiQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotCQlpbml0TWFwcGluZygpOwotCQlpbml0WG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG92ZXJyaWRlcyAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRGaWxlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jTWFwcGluZygpOwotCQlzeW5jWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZU1hcHBpbmcoKTsKLQkJdXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1hcHBpbmcgKioqKioKLQkKLQlwdWJsaWMgSmF4YlR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdfKEpheGJUeXBlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCUpheGJUeXBlTWFwcGluZyBvbGQgPSB0aGlzLm1hcHBpbmc7Ci0JCXRoaXMubWFwcGluZyA9IG5ld01hcHBpbmc7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUElOR19QUk9QRVJUWSwgb2xkLCBuZXdNYXBwaW5nKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpheGJUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoKTsKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0TWFwcGluZygpIHsKLQkJaWYgKGlzRGVmYXVsdE1hcHBlZCgpIHx8IGlzU3BlY2lmaWVkTWFwcGVkKCkpIHsKLQkJCXRoaXMubWFwcGluZyA9IGJ1aWxkTWFwcGluZygpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNNYXBwaW5nKCkgewotCQlpZiAodGhpcy5tYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMubWFwcGluZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlTWFwcGluZygpIHsKLQkJYm9vbGVhbiBpc01hcHBlZCA9IGlzRGVmYXVsdE1hcHBlZCgpIHx8IGlzU3BlY2lmaWVkTWFwcGVkKCk7Ci0JCWlmIChpc01hcHBlZCkgewotCQkJaWYgKHRoaXMubWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJdGhpcy5tYXBwaW5nLnVwZGF0ZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0TWFwcGluZ18oYnVpbGRNYXBwaW5nKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMubWFwcGluZyAhPSBudWxsKSB7Ci0JCQlzZXRNYXBwaW5nXyhudWxsKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGlzIHR5cGUgaW5kaWNhdGUgaXQgc2hvdWxkIGhhdmUgYSBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTcGVjaWZpZWRNYXBwZWQoKSB7Ci0JCXJldHVybiBnZXRYbWxUeXBlQW5ub3RhdGlvbigpICE9IG51bGwKLQkJCQl8fCBnZXRYbWxSb290RWxlbWVudEFubm90YXRpb24oKSAhPSBudWxsCi0JCQkJfHwgZ2V0WG1sVHJhbnNpZW50QW5ub3RhdGlvbigpICE9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxUeXBlQW5ub3RhdGlvbiBnZXRYbWxUeXBlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxUeXBlQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxSb290RWxlbWVudEFubm90YXRpb24gZ2V0WG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFRyYW5zaWVudEFubm90YXRpb24gZ2V0WG1sVHJhbnNpZW50QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxUcmFuc2llbnRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UUkFOU0lFTlQpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IG1hcHBlZCAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE1hcHBlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcHBlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdE1hcHBlZChib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0TWFwcGVkOwotCQl0aGlzLmRlZmF1bHRNYXBwZWQgPSBuZXdWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01BUFBFRF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEphdmFUeXBlQWRhcHRlciAqKioqKgotCQotCXB1YmxpYyBYbWxKYXZhVHlwZUFkYXB0ZXIgZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbEphdmFUeXBlQWRhcHRlcl8oWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlcikgewotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgb2xkWG1sSmF2YVR5cGVBZGFwdGVyID0gdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXI7Ci0JCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyID0geG1sSmF2YVR5cGVBZGFwdGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9KQVZBX1RZUEVfQURBUFRFUl9QUk9QRVJUWSwgb2xkWG1sSmF2YVR5cGVBZGFwdGVyLCB4bWxKYXZhVHlwZUFkYXB0ZXIpOwotCX0KLQkKLQlwdWJsaWMgWG1sSmF2YVR5cGVBZGFwdGVyIGFkZFhtbEphdmFUeXBlQWRhcHRlcigpIHsKLQkJaWYgKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gCi0JCQkJPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmFkZEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgeG1sSmF2YVR5cGVBZGFwdGVyID0gYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoYW5ub3RhdGlvbik7Ci0JCXNldFhtbEphdmFUeXBlQWRhcHRlcl8oeG1sSmF2YVR5cGVBZGFwdGVyKTsKLQkJcmV0dXJuIHhtbEphdmFUeXBlQWRhcHRlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJc2V0WG1sSmF2YVR5cGVBZGFwdGVyXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxKYXZhVHlwZUFkYXB0ZXIgYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyKHRoaXMsIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sSmF2YVR5cGVBZGFwdGVyKCkgewotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyID0gYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEphdmFUeXBlQWRhcHRlcigpIHsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbEphdmFUeXBlQWRhcHRlcl8oYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIoYW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sSmF2YVR5cGVBZGFwdGVyXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlci51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBKYXhiVHlwZSBtaXNjICoqKioqCi0JCi0JcHVibGljIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlUXVhbGlmaWVkTmFtZSgpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0UGFja2FnZU5hbWUoKTsKLQkJcmV0dXJuIChwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwKSA/IGdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpIDogZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VOYW1lLmxlbmd0aCgpICsgMSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGUuZ2V0UGFja2FnZU5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlKGdldFBhY2thZ2VOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBhY2thZ2VJbmZvIGdldEpheGJQYWNrYWdlSW5mbygpIHsKLQkJSmF4YlBhY2thZ2UgcGtnID0gZ2V0SmF4YlBhY2thZ2UoKTsKLQkJcmV0dXJuIChwa2cgPT0gbnVsbCkgPyBudWxsIDogcGtnLmdldFBhY2thZ2VJbmZvKCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCk7Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCXByb3RlY3RlZCBDb21waWxhdGlvblVuaXQgYnVpbGRBU1RSb290KCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGUuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkuYnVpbGRBU1RSb290KCk7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoCi0JCQlpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKHRoaXMubWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLm1hcHBpbmcuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEphdmFUeXBlQWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLnhtbEphdmFUeXBlQWRhcHRlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCS8qKgotCSAqIE92ZXJyaWRlIGFzIG5lZWRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gVE9ETyB0ZW1wb3JhcnkgaGFjayBzaW5jZSB3ZSBkb24ndCBrbm93IHlldCB3aGVyZSB0byBwdXQKLQkJLy8gYW55IG1lc3NhZ2VzIGZvciB0eXBlcyBpbiBhbm90aGVyIHByb2plY3QKLQkJSUZpbGUgZmlsZSA9IHRoaXMucmVzb3VyY2VUeXBlLmdldEZpbGUoKTsKLQkJLy8gJ2ZpbGUnIHdpbGwgYmUgbnVsbCBpZiB0aGUgdHlwZSBpcyAiZXh0ZXJuYWwiIGFuZCBiaW5hcnk7Ci0JCS8vIHRoZSBmaWxlIHdpbGwgYmUgaW4gYSBkaWZmZXJlbnQgcHJvamVjdCBpZiB0aGUgdHlwZSBpcyAiZXh0ZXJuYWwiIGFuZCBzb3VyY2U7Ci0JCS8vIHRoZSB0eXBlIHdpbGwgYmUgYmluYXJ5IGlmIGl0IGlzIGluIGEgSkFSIGluIHRoZSBjdXJyZW50IHByb2plY3QKLQkJaWYgKChmaWxlICE9IG51bGwpIAotCQkJCSYmIGZpbGUuZ2V0UHJvamVjdCgpLmVxdWFscyhnZXRKYXhiUHJvamVjdCgpLmdldFByb2plY3QoKSkgCi0JCQkJJiYgKHRoaXMucmVzb3VyY2VUeXBlIGluc3RhbmNlb2YgU291cmNlTm9kZSkpIHsKLQkJCS8vIGJ1aWxkIHRoZSBBU1Qgcm9vdCBoZXJlIHRvIHBhc3MgZG93bgotCQkJdGhpcy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIHRoaXMuYnVpbGRBU1RSb290KCkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy5tYXBwaW5nICE9IG51bGwpIHsKLQkJCXRoaXMubWFwcGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTAzZTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJRTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNlZUFsc287Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuUU5hbWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNlZUFsc29Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiVHlwZU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBib29sZWFuIHhtbFRyYW5zaWVudDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgSmF4YlFOYW1lIHFOYW1lOwotCQotCXByb3RlY3RlZCBYbWxSb290RWxlbWVudCB4bWxSb290RWxlbWVudDsKLQkKLQlwcm90ZWN0ZWQgWG1sU2VlQWxzbyB4bWxTZWVBbHNvOwotCQotCQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFUeXBlTWFwcGluZyhKYXhiVHlwZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdFhtbFRyYW5zaWVudCgpOwotCQl0aGlzLnFOYW1lID0gYnVpbGRRTmFtZSgpOyAKLQkJaW5pdFhtbFJvb3RFbGVtZW50KCk7Ci0JCWluaXRpYWxpemVYbWxTZWVBbHNvKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiVHlwZSBnZXRKYXhiVHlwZSgpIHsKLQkJcmV0dXJuIChKYXhiVHlwZSkgZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIGdldEpheGJUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sVHJhbnNpZW50KCk7Ci0JCXRoaXMucU5hbWUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sUm9vdEVsZW1lbnQoKTsKLQkJc3luY1htbFNlZUFsc28oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5xTmFtZS51cGRhdGUoKTsKLQkJdXBkYXRlWG1sUm9vdEVsZW1lbnQoKTsKLQkJdXBkYXRlWG1sU2VlQWxzbygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxUcmFuc2llbnQgKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1htbFRyYW5zaWVudCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sVHJhbnNpZW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRYbWxUcmFuc2llbnQoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlnZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQlzZXRYbWxUcmFuc2llbnRfKG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sVHJhbnNpZW50Xyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy54bWxUcmFuc2llbnQ7Ci0JCXRoaXMueG1sVHJhbnNpZW50ID0gbmV3VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX1RSQU5TSUVOVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxUcmFuc2llbnRBbm5vdGF0aW9uIGdldFhtbFRyYW5zaWVudEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sVHJhbnNpZW50QW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFJBTlNJRU5UKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbFRyYW5zaWVudCgpIHsKLQkJdGhpcy54bWxUcmFuc2llbnQgPSBnZXRYbWxUcmFuc2llbnRBbm5vdGF0aW9uKCkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbFRyYW5zaWVudCgpIHsKLQkJc2V0WG1sVHJhbnNpZW50XyhnZXRYbWxUcmFuc2llbnRBbm5vdGF0aW9uKCkgIT0gbnVsbCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFR5cGUubmFtZSBhbmQgbmFtZXNwYWNlICoqKioqCi0JCi0JcHVibGljIEpheGJRTmFtZSBnZXRRTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgYnVpbGRRTmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBYbWxUeXBlUU5hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxUeXBlQW5ub3RhdGlvbiBnZXRYbWxUeXBlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxUeXBlQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxSb290RWxlbWVudCAqKioqKgotCQotCXB1YmxpYyBYbWxSb290RWxlbWVudCBnZXRYbWxSb290RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUm9vdEVsZW1lbnQ7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFJvb3RFbGVtZW50XyhYbWxSb290RWxlbWVudCByb290RWxlbWVudCkgewotCQlYbWxSb290RWxlbWVudCBvbGQgPSB0aGlzLnhtbFJvb3RFbGVtZW50OwotCQl0aGlzLnhtbFJvb3RFbGVtZW50ID0gcm9vdEVsZW1lbnQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfUk9PVF9FTEVNRU5UX1BST1BFUlRZLCBvbGQsIHJvb3RFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIFhtbFJvb3RFbGVtZW50IGFkZFhtbFJvb3RFbGVtZW50KCkgewotCQlpZiAodGhpcy54bWxSb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uIAotCQkJCT0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCi0JCVhtbFJvb3RFbGVtZW50IHhtbFJvb3RFbGVtZW50ID0gYnVpbGRYbWxSb290RWxlbWVudChhbm5vdGF0aW9uKTsKLQkJc2V0WG1sUm9vdEVsZW1lbnRfKHhtbFJvb3RFbGVtZW50KTsKLQkJcmV0dXJuIHhtbFJvb3RFbGVtZW50OwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxSb290RWxlbWVudCgpIHsKLQkJaWYgKHRoaXMueG1sUm9vdEVsZW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlnZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlzZXRYbWxSb290RWxlbWVudF8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxSb290RWxlbWVudEFubm90YXRpb24gZ2V0WG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFJvb3RFbGVtZW50IGJ1aWxkWG1sUm9vdEVsZW1lbnQoKSB7Ci0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uID09IG51bGwgPyBudWxsIDogYnVpbGRYbWxSb290RWxlbWVudChhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFJvb3RFbGVtZW50IGJ1aWxkWG1sUm9vdEVsZW1lbnQoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHJlc291cmNlUm9vdEVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZEphdmFYbWxSb290RWxlbWVudCh0aGlzLCByZXNvdXJjZVJvb3RFbGVtZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbFJvb3RFbGVtZW50KCkgewotCQl0aGlzLnhtbFJvb3RFbGVtZW50ID0gdGhpcy5idWlsZFhtbFJvb3RFbGVtZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxSb290RWxlbWVudCgpIHsKLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxSb290RWxlbWVudEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sUm9vdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sUm9vdEVsZW1lbnQuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sUm9vdEVsZW1lbnRfKGJ1aWxkWG1sUm9vdEVsZW1lbnQoYW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMueG1sUm9vdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJc2V0WG1sUm9vdEVsZW1lbnRfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbFJvb3RFbGVtZW50KCkgewotCQlpZiAodGhpcy54bWxSb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbFJvb3RFbGVtZW50LnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFNlZUFsc28gKioqKioKLQkKLQlwdWJsaWMgWG1sU2VlQWxzbyBnZXRYbWxTZWVBbHNvKCkgewotCQlyZXR1cm4gdGhpcy54bWxTZWVBbHNvOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxTZWVBbHNvXyhYbWxTZWVBbHNvIHhtbFNlZUFsc28pIHsKLQkJWG1sU2VlQWxzbyBvbGQgPSB0aGlzLnhtbFNlZUFsc287Ci0JCXRoaXMueG1sU2VlQWxzbyA9IHhtbFNlZUFsc287Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX1NFRV9BTFNPX1BST1BFUlRZLCBvbGQsIHhtbFNlZUFsc28pOwotCX0KLQkKLQlwdWJsaWMgWG1sU2VlQWxzbyBhZGRYbWxTZWVBbHNvKCkgewotCQlpZiAodGhpcy54bWxTZWVBbHNvICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlYbWxTZWVBbHNvQW5ub3RhdGlvbiBhbm5vdGF0aW9uIAotCQkJCT0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCQotCQlYbWxTZWVBbHNvIHhtbFNlZUFsc28gPSBidWlsZFhtbFNlZUFsc28oYW5ub3RhdGlvbik7Ci0JCXNldFhtbFNlZUFsc29fKHhtbFNlZUFsc28pOwotCQlyZXR1cm4geG1sU2VlQWxzbzsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sU2VlQWxzbygpIHsKLQkJaWYgKHRoaXMueG1sU2VlQWxzbyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlzZXRYbWxTZWVBbHNvXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFNlZUFsc29Bbm5vdGF0aW9uIGdldFhtbFNlZUFsc29Bbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxTZWVBbHNvIGJ1aWxkWG1sU2VlQWxzbyhYbWxTZWVBbHNvQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxTZWVBbHNvKHRoaXMsIGFubm90YXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sU2VlQWxzbygpIHsKLQkJWG1sU2VlQWxzb0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFNlZUFsc29Bbm5vdGF0aW9uKCk7Ci0JCXRoaXMueG1sU2VlQWxzbyA9IChhbm5vdGF0aW9uID09IG51bGwpID8KLQkJCQludWxsCi0JCQkJOiBidWlsZFhtbFNlZUFsc28oYW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxTZWVBbHNvKCkgewotCQlYbWxTZWVBbHNvQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sU2VlQWxzb0Fubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sU2VlQWxzbyAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxTZWVBbHNvLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbFNlZUFsc29fKGJ1aWxkWG1sU2VlQWxzbyhhbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxTZWVBbHNvXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxTZWVBbHNvKCkgewotCQlpZiAodGhpcy54bWxTZWVBbHNvICE9IG51bGwpIHsKLQkJCXRoaXMueG1sU2VlQWxzby51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuICh0aGlzLnhtbFRyYW5zaWVudCkgPwotCQkJCWdldFRyYW5zaWVudFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKQotCQkJCTogZ2V0Tm9uVHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOyAKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Tm9uVHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJaWYgKHRoaXMueG1sU2VlQWxzbyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy54bWxTZWVBbHNvLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UgPSBnZXRKYXhiUGFja2FnZSgpOwotCQlpZiAoamF4YlBhY2thZ2UgIT0gbnVsbCkgewotCQkJZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkucmVmcmVzaFNjaGVtYShqYXhiUGFja2FnZS5nZXROYW1lc3BhY2UoKSk7Ci0JCX0KLQkJCi0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnFOYW1lLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sUm9vdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdGhpcy54bWxSb290RWxlbWVudC5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogZ2V0SmF4YlR5cGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKCEgdGhpcy54bWxUcmFuc2llbnQpIHsKLQkJCXRoaXMucU5hbWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCQotCQkJaWYgKHRoaXMueG1sUm9vdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sUm9vdEVsZW1lbnQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldFhzZFR5cGVEZWZpbml0aW9uKCkgewotCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IGdldEpheGJQYWNrYWdlKCk7Ci0JCVhzZFNjaGVtYSB4c2RTY2hlbWEgPSAoamF4YlBhY2thZ2UgPT0gbnVsbCkgPyBudWxsIDogamF4YlBhY2thZ2UuZ2V0WHNkU2NoZW1hKCk7Ci0JCWlmICh4c2RTY2hlbWEgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5xTmFtZS5nZXROYW1lKCkpKSB7Ci0JCQlyZXR1cm4geHNkU2NoZW1hLmdldFR5cGVEZWZpbml0aW9uKHRoaXMucU5hbWUuZ2V0TmFtZXNwYWNlKCksIHRoaXMucU5hbWUuZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sUm9vdEVsZW1lbnQgIT0gbnVsbCkgewotCQkJWHNkRWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnQgCi0JCQkJCT0geHNkU2NoZW1hLmdldEVsZW1lbnREZWNsYXJhdGlvbigKLQkJCQkJCQl0aGlzLnhtbFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCksIAotCQkJCQkJCXRoaXMueG1sUm9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkJaWYgKHhzZEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiB4c2RFbGVtZW50LmdldFR5cGUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHkoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFJvb3RFbGVtZW50ICE9IG51bGw7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxUeXBlUU5hbWUKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUgewotCQkKLQkJcHJvdGVjdGVkIFhtbFR5cGVRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5ldyBRTmFtZUFubm90YXRpb25Qcm94eSgpKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcudGhpcy5nZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0JCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nLnRoaXMuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCQkJcmV0dXJuIChqYXhiUGFja2FnZSA9PSBudWxsKSA/IG51bGwgOiBqYXhiUGFja2FnZS5nZXROYW1lc3BhY2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCQlyZXR1cm4gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShBYnN0cmFjdEphdmFUeXBlTWFwcGluZy50aGlzLmdldEpheGJUeXBlKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCXJldHVybiBzY2hlbWEuZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIHNjaGVtYS5nZXRUeXBlTmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLlhNTF9UWVBFX0RFU0M7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIGRvIG5vdCBjYWxsIHN1cGVyLi4uIC0gaXQgaXMgbm90IGFuIGVycm9yIGlmIHRoZSBuYW1lIGlzICIiCi0JCQkvLyBpZiBuYW1lIGlzIGFic2VudCAoIiIpLCBuYW1lc3BhY2UgY2Fubm90IGJlIGRpZmZlcmVudCBmcm9tIHBhY2thZ2UgbmFtZXNwYWNlCi0JCQlpZiAoIiIuZXF1YWxzKGdldE5hbWUoKSkgCi0JCQkJCSYmICEgU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKAotCQkJCQkJCWdldE5hbWVzcGFjZSgpLAotCQkJCQkJCWdldERlZmF1bHROYW1lc3BhY2UoKSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1RZUEVfX1VOTUFUQ0hJTkdfTkFNRVNQQUNFX0ZPUl9BTk9OWU1PVVNfVFlQRSwKLQkJCQkJCXRoaXMsCi0JCQkJCQlnZXRYbWxUeXBlQW5ub3RhdGlvbigpLmdldE5hbWVzcGFjZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWZlcmVuY2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIGlmIG5hbWUgaXMgbm90IGFic2VudCAoIiIpLCB0eXBlIG11c3QgYmUgZnJvbSBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2FnZQotCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKCk7Ci0JCQkKLQkJCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkobmFtZSkpIHsKLQkJCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCQkJWHNkVHlwZURlZmluaXRpb24gc2NoZW1hVHlwZSA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbihuYW1lc3BhY2UsIG5hbWUpOwotCQkJCQlpZiAoc2NoZW1hVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFUeXBlTWFwcGluZy50aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNzA4NzIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVhtbEphdmFUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVhtbEphdmFUeXBlQWRhcHRlcgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sSmF2YVR5cGVBZGFwdGVyIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCQotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0JCi0JcHJvdGVjdGVkIFhtbEFkYXB0ZXIgeG1sQWRhcHRlcjsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFR5cGU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VHlwZTsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhWG1sSmF2YVR5cGVBZGFwdGVyKEpheGJDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl0aGlzLnZhbHVlID0gZ2V0UmVzb3VyY2VWYWx1ZSgpOwotCQlpbml0aWFsaXplWG1sQWRhcHRlcigpOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBnZXRSZXNvdXJjZVR5cGVTdHJpbmcoKTsKLQkJdGhpcy5kZWZhdWx0VHlwZSA9IGJ1aWxkRGVmYXVsdFR5cGUoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbjsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzZXRWYWx1ZV8oZ2V0UmVzb3VyY2VWYWx1ZSgpKTsKLQkJc3luY1htbEFkYXB0ZXIoKTsKLQkJc2V0U3BlY2lmaWVkVHlwZV8oZ2V0UmVzb3VyY2VUeXBlU3RyaW5nKCkpOwotCQlzZXREZWZhdWx0VHlwZShidWlsZERlZmF1bHRUeXBlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl1cGRhdGVYbWxBZGFwdGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFubm90YXRpb24uc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnNldFZhbHVlXyh2YWx1ZSk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB4bWxBZGFwdGVyICoqKioqCi0JCi0JcHVibGljIFhtbEFkYXB0ZXIgZ2V0WG1sQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMueG1sQWRhcHRlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sQWRhcHRlcl8oWG1sQWRhcHRlciB4bWxBZGFwdGVyKSB7Ci0JCVhtbEFkYXB0ZXIgb2xkID0gdGhpcy54bWxBZGFwdGVyOwotCQl0aGlzLnhtbEFkYXB0ZXIgPSB4bWxBZGFwdGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9BREFQVEVSX1BST1BFUlRZLCBvbGQsIHhtbEFkYXB0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBnZXRYbWxBZGFwdGVyUmVzb3VyY2VUeXBlKCkgewotCQlTdHJpbmcgeG1sQWRhcHRlck5hbWUgPSBnZXRGdWxseVF1YWxpZmllZFZhbHVlKCk7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKHhtbEFkYXB0ZXJOYW1lLCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZC5UWVBFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEFkYXB0ZXIgYnVpbGRYbWxBZGFwdGVyKEphdmFSZXNvdXJjZVR5cGUgeG1sQWRhcHRlclJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sQWRhcHRlcih0aGlzLCB4bWxBZGFwdGVyUmVzb3VyY2VUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbEFkYXB0ZXIoKSB7Ci0JCUphdmFSZXNvdXJjZVR5cGUgeG1sQWRhcHRlclJlc291cmNlVHlwZSA9IGdldFhtbEFkYXB0ZXJSZXNvdXJjZVR5cGUoKTsKLQkJaWYgKHhtbEFkYXB0ZXJSZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy54bWxBZGFwdGVyID0gYnVpbGRYbWxBZGFwdGVyKHhtbEFkYXB0ZXJSZXNvdXJjZVR5cGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxBZGFwdGVyKCkgewotCQlpZiAodGhpcy54bWxBZGFwdGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sQWRhcHRlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sQWRhcHRlcigpIHsKLQkJSmF2YVJlc291cmNlVHlwZSBuZXdSZXNvdXJjZVR5cGUgPSBnZXRYbWxBZGFwdGVyUmVzb3VyY2VUeXBlKCk7Ci0JCWlmIChuZXdSZXNvdXJjZVR5cGUgPT0gbnVsbCkgewotCQkJc2V0WG1sQWRhcHRlcl8obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodGhpcy54bWxBZGFwdGVyID09IG51bGwpIHsKLQkJCQlzZXRYbWxBZGFwdGVyXyhidWlsZFhtbEFkYXB0ZXIobmV3UmVzb3VyY2VUeXBlKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlKYXZhUmVzb3VyY2VUeXBlIGN1cnJlbnRSZXNvdXJjZVR5cGUgPSB0aGlzLnhtbEFkYXB0ZXIuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkJCWlmIChjdXJyZW50UmVzb3VyY2VUeXBlID09IG51bGwgfHwgISBjdXJyZW50UmVzb3VyY2VUeXBlLmVxdWFscyhuZXdSZXNvdXJjZVR5cGUpKSB7Ci0JCQkJCXNldFhtbEFkYXB0ZXJfKGJ1aWxkWG1sQWRhcHRlcihuZXdSZXNvdXJjZVR5cGUpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRoaXMueG1sQWRhcHRlci51cGRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogdHlwZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZU5vdFNldCgpID8gdGhpcy5nZXREZWZhdWx0VHlwZSgpIDogdGhpcy5nZXRTcGVjaWZpZWRUeXBlKCk7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwZWNpZmllZFR5cGVOb3RTZXQoKSB7Ci0JCXJldHVybiBnZXRTcGVjaWZpZWRUeXBlKCkgPT0gbnVsbCB8fCBnZXRTcGVjaWZpZWRUeXBlKCkuZXF1YWxzKERFRkFVTFRfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VHlwZShTdHJpbmcgZGVmYXVsdFR5cGUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRUeXBlID0gdGhpcy5kZWZhdWx0VHlwZTsKLQkJdGhpcy5kZWZhdWx0VHlwZSA9IGRlZmF1bHRUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFlQRV9QUk9QRVJUWSwgb2xkRGVmYXVsdFR5cGUsIGRlZmF1bHRUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBidWlsZERlZmF1bHRUeXBlKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUeXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUeXBlKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmFubm90YXRpb24uc2V0VHlwZShsb2NhdGlvbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVHlwZV8obG9jYXRpb24pOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVHlwZV8oU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlVHlwZVN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5nZXRUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2M1MWFkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBdHRhY2htZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSURSRUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5hbWVkTm9kZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpheGJCYXNpY1NjaGVtYUNvbXBvbmVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEUkVGQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZzxBIGV4dGVuZHMgSmF4YkJhc2ljU2NoZW1hQ29tcG9uZW50QW5ub3RhdGlvbj4KLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZzxBPgotCQlpbXBsZW1lbnRzIFhtbE5hbWVkTm9kZU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBYbWxJRCB4bWxJRDsKLQkKLQlwcm90ZWN0ZWQgWG1sSURSRUYgeG1sSURSRUY7Ci0JCi0JcHJvdGVjdGVkIFhtbEF0dGFjaG1lbnRSZWYgeG1sQXR0YWNobWVudFJlZjsKLQkKLQkKLQlwdWJsaWMgQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZVhtbElEKCk7Ci0JCWluaXRpYWxpemVYbWxJRFJFRigpOwotCQlpbml0aWFsaXplWG1sQXR0YWNobWVudFJlZigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbElEKCk7Ci0JCXN5bmNYbWxJRFJFRigpOwotCQlzeW5jWG1sQXR0YWNobWVudFJlZigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl1cGRhdGVYbWxJRCgpOwotCQl1cGRhdGVYbWxJRFJFRigpOwotCQl1cGRhdGVYbWxBdHRhY2htZW50UmVmKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbElEICoqKioqCi0JCi0JcHVibGljIFhtbElEIGdldFhtbElEKCkgewotCQlyZXR1cm4gdGhpcy54bWxJRDsKLQl9Ci0JCi0JcHVibGljIFhtbElEIGFkZFhtbElEKCkgewotCQlpZiAodGhpcy54bWxJRCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJWG1sSURBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSB0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQkKLQkJWG1sSUQgeG1sSUQgPSB0aGlzLmJ1aWxkWG1sSUQoYW5ub3RhdGlvbik7Ci0JCXRoaXMuc2V0WG1sSURfKHhtbElEKTsKLQkJcmV0dXJuIHhtbElEOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sSUQgYnVpbGRYbWxJRChYbWxJREFubm90YXRpb24geG1sSURBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxJRCh0aGlzLCB4bWxJREFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxJRCgpIHsKLQkJaWYgKHRoaXMueG1sSUQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCXRoaXMuc2V0WG1sSURfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sSUQoKSB7Ci0JCVhtbElEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxJREFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxJRCA9IHRoaXMuYnVpbGRYbWxJRChhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sSURBbm5vdGF0aW9uIGdldFhtbElEQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxJREFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxJRCgpIHsKLQkJWG1sSURBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFhtbElEQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFhtbElEKCkuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5zZXRYbWxJRF8odGhpcy5idWlsZFhtbElEKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2V0WG1sSURfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbElEKCkgewotCQlpZiAodGhpcy5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCXRoaXMuZ2V0WG1sSUQoKS51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxJRF8oWG1sSUQgeG1sSUQpIHsKLQkJWG1sSUQgb2xkWG1sSUQgPSB0aGlzLnhtbElEOwotCQl0aGlzLnhtbElEID0geG1sSUQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX0lEX1BST1BFUlRZLCBvbGRYbWxJRCwgeG1sSUQpOwotCX0KLQkKLQkKLQkvLyoqKioqKioqKioqKiAgWG1sSURSRUYgKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbElEUkVGIGdldFhtbElEUkVGKCkgewotCQlyZXR1cm4gdGhpcy54bWxJRFJFRjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sSURSRUZfKFhtbElEUkVGIHhtbElEUkVGKSB7Ci0JCVhtbElEUkVGIG9sZFhtbElEUkVGID0gdGhpcy54bWxJRFJFRjsKLQkJdGhpcy54bWxJRFJFRiA9IHhtbElEUkVGOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9JRFJFRl9QUk9QRVJUWSwgb2xkWG1sSURSRUYsIHhtbElEUkVGKTsKLQl9Ci0JCi0JcHVibGljIFhtbElEUkVGIGFkZFhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJCi0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQkKLQkJWG1sSURSRUYgeG1sSURSRUYgPSBidWlsZFhtbElEUkVGKCk7Ci0JCXNldFhtbElEUkVGXyh4bWxJRFJFRik7Ci0JCXJldHVybiB4bWxJRFJFRjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSURSRUYoKSB7Ci0JCWlmICh0aGlzLnhtbElEUkVGID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJc2V0WG1sSURSRUZfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sSURSRUYoKSB7Ci0JCWlmIChnZXRYbWxJRFJFRkFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbElEUkVGID0gYnVpbGRYbWxJRFJFRigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxJRFJFRigpIHsKLQkJaWYgKGdldFhtbElEUkVGQW5ub3RhdGlvbigpID09IG51bGwpIHsKLQkJCXNldFhtbElEUkVGXyhudWxsKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLnhtbElEUkVGID09IG51bGwpIHsKLQkJCXNldFhtbElEUkVGXyhidWlsZFhtbElEUkVGKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy54bWxJRFJFRi5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sSURSRUYoKSB7Ci0JCWlmICh0aGlzLnhtbElEUkVGICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSURSRUYudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbElEUkVGQW5ub3RhdGlvbiBnZXRYbWxJRFJFRkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sSURSRUZBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbElEUkVGIGJ1aWxkWG1sSURSRUYoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxJRFJFRih0aGlzLCBidWlsZFhtbElEUkVGQ29udGV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEdlbmVyaWNKYXZhWG1sSURSRUYuQ29udGV4dCBidWlsZFhtbElEUkVGQ29udGV4dCgpOwotCQotCQotCS8vKioqKioqKioqKioqICBYbWxBdHRhY2htZW50UmVmICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBYbWxBdHRhY2htZW50UmVmIGdldFhtbEF0dGFjaG1lbnRSZWYoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dGFjaG1lbnRSZWY7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRhY2htZW50UmVmIGFkZFhtbEF0dGFjaG1lbnRSZWYoKSB7Ci0JCWlmICh0aGlzLnhtbEF0dGFjaG1lbnRSZWYgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCQotCQlYbWxBdHRhY2htZW50UmVmIHhtbEF0dGFjaG1lbnRSZWYgPSB0aGlzLmJ1aWxkWG1sQXR0YWNobWVudFJlZihhbm5vdGF0aW9uKTsKLQkJdGhpcy5zZXRYbWxBdHRhY2htZW50UmVmXyh4bWxBdHRhY2htZW50UmVmKTsKLQkJcmV0dXJuIHhtbEF0dGFjaG1lbnRSZWY7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBdHRhY2htZW50UmVmIGJ1aWxkWG1sQXR0YWNobWVudFJlZihYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sQXR0YWNobWVudFJlZih0aGlzLCB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dGFjaG1lbnRSZWYoKSB7Ci0JCWlmICh0aGlzLnhtbEF0dGFjaG1lbnRSZWYgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCXRoaXMuc2V0WG1sQXR0YWNobWVudFJlZl8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxBdHRhY2htZW50UmVmKCkgewotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEF0dGFjaG1lbnRSZWYgPSB0aGlzLmJ1aWxkWG1sQXR0YWNobWVudFJlZihhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gZ2V0WG1sQXR0YWNobWVudFJlZkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxBdHRhY2htZW50UmVmKCkgewotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5nZXRYbWxBdHRhY2htZW50UmVmKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuZ2V0WG1sQXR0YWNobWVudFJlZigpLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMuc2V0WG1sQXR0YWNobWVudFJlZl8odGhpcy5idWlsZFhtbEF0dGFjaG1lbnRSZWYoYW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy5zZXRYbWxBdHRhY2htZW50UmVmXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxBdHRhY2htZW50UmVmKCkgewotCQlpZiAodGhpcy5nZXRYbWxBdHRhY2htZW50UmVmKCkgIT0gbnVsbCkgewotCQkJdGhpcy5nZXRYbWxBdHRhY2htZW50UmVmKCkudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sQXR0YWNobWVudFJlZl8oWG1sQXR0YWNobWVudFJlZiB4bWxBdHRhY2htZW50UmVmKSB7Ci0JCVhtbEF0dGFjaG1lbnRSZWYgb2xkWG1sQXR0YWNobWVudFJlZiA9IHRoaXMueG1sQXR0YWNobWVudFJlZjsKLQkJdGhpcy54bWxBdHRhY2htZW50UmVmID0geG1sQXR0YWNobWVudFJlZjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfQVRUQUNITUVOVF9SRUZfUFJPUEVSVFksIG9sZFhtbEF0dGFjaG1lbnRSZWYsIHhtbEF0dGFjaG1lbnRSZWYpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCWlmICh0aGlzLnhtbElEUkVGICE9IG51bGwpIHsKLQkJCUpheGJDbGFzc01hcHBpbmcgcmVmZXJlbmNlTWFwcGluZyA9IGdldENvbnRleHRSb290KCkuZ2V0Q2xhc3NNYXBwaW5nKGdldFZhbHVlVHlwZU5hbWUoKSk7Ci0JCQlpZiAocmVmZXJlbmNlTWFwcGluZyAhPSBudWxsKSB7Ci0JCQkJSmF4YkF0dHJpYnV0ZU1hcHBpbmcgaWRNYXBwaW5nID0gcmVmZXJlbmNlTWFwcGluZy5nZXRYbWxJZE1hcHBpbmcoKTsKLQkJCQlpZiAoaWRNYXBwaW5nICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGlkTWFwcGluZy5nZXRWYWx1ZVR5cGVOYW1lKCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFN0cmluZy5jbGFzcy5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIGdldFZhbHVlVHlwZU5hbWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLnhtbElEICE9IG51bGwpIHsKLQkJCXRoaXMueG1sSUQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sSURSRUYgIT0gbnVsbCkgewotCQkJdGhpcy54bWxJRFJFRi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxBdHRhY2htZW50UmVmICE9IG51bGwpIHsKLQkJCXRoaXMueG1sQXR0YWNobWVudFJlZi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBYbWxJRFJFRkNvbnRleHQKLQkJCWltcGxlbWVudHMgR2VuZXJpY0phdmFYbWxJRFJFRi5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxJRFJFRkFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGlzTGlzdCgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nLnRoaXMuaXNYbWxMaXN0KCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhWG1sTm9kZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTdkNDVhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOb2RlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTGlzdEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFZhcmlldHk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVhtbE5vZGVNYXBwaW5nPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8QT4KLQkJaW1wbGVtZW50cyBYbWxOb2RlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZTsKLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWRYbWxMaXN0OwotCQotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRYbWxMaXN0OwotCQotCQotCXB1YmxpYyBBYnN0cmFjdEphdmFYbWxOb2RlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdGlhbGl6ZVhtbFNjaGVtYVR5cGUoKTsKLQkJaW5pdGlhbGl6ZVhtbExpc3QoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxTY2hlbWFUeXBlKCk7Ci0JCXN5bmNYbWxMaXN0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbFNjaGVtYVR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sU2NoZW1hVHlwZSAqKioqKgotCQotCXB1YmxpYyBYbWxTY2hlbWFUeXBlIGdldFhtbFNjaGVtYVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFNjaGVtYVR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFNjaGVtYVR5cGVfKFhtbFNjaGVtYVR5cGUgeG1sU2NoZW1hVHlwZSkgewotCQlYbWxTY2hlbWFUeXBlIG9sZFhtbFNjaGVtYVR5cGUgPSB0aGlzLnhtbFNjaGVtYVR5cGU7Ci0JCXRoaXMueG1sU2NoZW1hVHlwZSA9IHhtbFNjaGVtYVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfU0NIRU1BX1RZUEVfUFJPUEVSVFksIG9sZFhtbFNjaGVtYVR5cGUsIHhtbFNjaGVtYVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxTY2hlbWFUeXBlKCkgewotCQlyZXR1cm4gdGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBYbWxTY2hlbWFUeXBlIGFkZFhtbFNjaGVtYVR5cGUoKSB7Ci0JCWlmICh0aGlzLnhtbFNjaGVtYVR5cGUgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCQotCQlYbWxTY2hlbWFUeXBlIHhtbEphdmFUeXBlQWRhcHRlciA9IHRoaXMuYnVpbGRYbWxTY2hlbWFUeXBlKGFubm90YXRpb24pOwotCQl0aGlzLnNldFhtbFNjaGVtYVR5cGVfKHhtbEphdmFUeXBlQWRhcHRlcik7Ci0JCXJldHVybiB4bWxKYXZhVHlwZUFkYXB0ZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoKSB7Ci0JCWlmICh0aGlzLnhtbFNjaGVtYVR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCXRoaXMuc2V0WG1sU2NoZW1hVHlwZV8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxTY2hlbWFUeXBlIGJ1aWxkWG1sU2NoZW1hVHlwZShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVNYXBwaW5nWG1sU2NoZW1hVHlwZSh0aGlzLCBhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSB0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sU2NoZW1hVHlwZSgpIHsKLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxTY2hlbWFUeXBlID0gdGhpcy5idWlsZFhtbFNjaGVtYVR5cGUoYW5ub3RhdGlvbik7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxTY2hlbWFUeXBlKCkgewotCQlpZiAodGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCXRoaXMueG1sU2NoZW1hVHlwZS51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sU2NoZW1hVHlwZSgpIHsKLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZ2V0WG1sU2NoZW1hVHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmdldFhtbFNjaGVtYVR5cGUoKS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnNldFhtbFNjaGVtYVR5cGVfKHRoaXMuYnVpbGRYbWxTY2hlbWFUeXBlKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc2V0WG1sU2NoZW1hVHlwZV8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sTGlzdCAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzWG1sTGlzdCgpIHsKLQkJcmV0dXJuIGlzU3BlY2lmaWVkWG1sTGlzdCgpIHx8IGlzRGVmYXVsdFhtbExpc3QoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWRYbWxMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRYbWxMaXN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRYbWxMaXN0KGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkWG1sTGlzdCA9PSBuZXdWYWx1ZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlpZiAobmV3VmFsdWUpIHsKLQkJCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfTElTVCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpOwotCQl9Ci0JCQotCQlzZXRTcGVjaWZpZWRYbWxMaXN0XyhuZXdWYWx1ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFhtbExpc3RfKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuc3BlY2lmaWVkWG1sTGlzdDsKLQkJdGhpcy5zcGVjaWZpZWRYbWxMaXN0ID0gbmV3VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1hNTF9MSVNUX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRYbWxMaXN0KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0WG1sTGlzdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFhtbExpc3RfKGJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJYm9vbGVhbiBvbGRWYWx1ZSA9IHRoaXMuZGVmYXVsdFhtbExpc3Q7Ci0JCXRoaXMuZGVmYXVsdFhtbExpc3QgPSBuZXdWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1hNTF9MSVNUX1BST1BFUlRZLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sTGlzdCgpIHsKLQkJdGhpcy5zcGVjaWZpZWRYbWxMaXN0ID0gZ2V0WG1sTGlzdEFubm90YXRpb24oKSAhPSBudWxsOwotCQl0aGlzLmRlZmF1bHRYbWxMaXN0ID0gY2FsY3VsYXRlRGVmYXVsdFhtbExpc3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbExpc3QoKSB7Ci0JCXNldFNwZWNpZmllZFhtbExpc3RfKGdldFhtbExpc3RBbm5vdGF0aW9uKCkgIT0gbnVsbCk7Ci0JCXNldERlZmF1bHRYbWxMaXN0XyhjYWxjdWxhdGVEZWZhdWx0WG1sTGlzdCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbExpc3RBbm5vdGF0aW9uIGdldFhtbExpc3RBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbExpc3RBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0WG1sTGlzdCgpOwotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0RGF0YVR5cGVYc2RUeXBlRGVmaW5pdGlvbigpIHsKLQkJaWYgKHRoaXMueG1sU2NoZW1hVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy54bWxTY2hlbWFUeXBlLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sU2NoZW1hVHlwZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxTY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCXRoaXMueG1sU2NoZW1hVHlwZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAoaXNYbWxMaXN0KCkpIHsKLQkJCXZhbGlkYXRlWG1sTGlzdChtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sTGlzdChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoISBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0xJU1RfX0FUVFJJQlVURV9OT1RfQ09MTEVDVElPTl9UWVBFLAotCQkJCQl0aGlzLAotCQkJCQlnZXRYbWxMaXN0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCWVsc2UgewotCQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQkJCWlmICh4c2RUeXBlICE9IG51bGwKLQkJCQkJJiYgKHhzZFR5cGUuZ2V0S2luZCgpICE9IFhzZFR5cGVEZWZpbml0aW9uLktpbmQuU0lNUExFCi0JCQkJCQkJfHwgKChYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbikgeHNkVHlwZSkuZ2V0WFNEQ29tcG9uZW50KCkuZ2V0VmFyaWV0eSgpID09IFhTRFZhcmlldHkuTElTVF9MSVRFUkFMKSkgewotCQkJCQotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9MSVNUX19JVEVNX1RZUEVfTk9UX01BUFBFRF9UT19WQUxJRF9TQ0hFTUFfVFlQRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgZ2V0VmFsdWVUeXBlTmFtZSgpIH0sCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbExpc3RWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVhtbExpc3RBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxMaXN0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpIDogYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0ZpZWxkQWNjZXNzb3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9GaWVsZEFjY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTE4MzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0ZpZWxkQWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgRmllbGRBY2Nlc3NvcgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgQWNjZXNzb3IgewotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkOwotCQotCQotCXB1YmxpYyBGaWVsZEFjY2Vzc29yKEpheGJDbGFzc01hcHBpbmcgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VGaWVsZCA9IHJlc291cmNlRmllbGQ7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUZpZWxkKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkgewotCQlyZXR1cm4gQWNjZXNzb3JUb29scy5nZXRCYXNlVHlwZU5hbWUodGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBBY2Nlc3NvclRvb2xzLmlzQ29sbGVjdGlvblR5cGUoZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZVR5cGVTdWJUeXBlT2YoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnR5cGVJc1N1YlR5cGVPZih0eXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUZpZWxkIGdldFJlc291cmNlRmllbGQoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlRmllbGQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUZpZWxkID09IHJlc291cmNlRmllbGQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCwgSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlTWFwcGluZ1htbFNjaGVtYVR5cGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU1hcHBpbmdYbWxTY2hlbWFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkOThmZmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlTWFwcGluZ1htbFNjaGVtYVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUF0dHJpYnV0ZU1hcHBpbmdYbWxTY2hlbWFUeXBlCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFBdHRyaWJ1dGVNYXBwaW5nWG1sU2NoZW1hVHlwZShKYXhiQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YkF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldEpheGJDbGFzc01hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Q2xhc3NNYXBwaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCVN0cmluZyBmcVR5cGUgPSBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJaWYgKGZxVHlwZSAhPSBudWxsICYmICEgWG1sU2NoZW1hVHlwZUFubm90YXRpb24uREVGQVVMVF9UWVBFLmVxdWFscyhmcVR5cGUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfU0NIRU1BX1RZUEVfX1RZUEVfU1BFQ0lGSUVEX09OX0FUVFJJQlVURSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNzUxYjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YVhtbEphdmFUeXBlQWRhcHRlcgotewotCi0JcHVibGljIEdlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyKEpheGJBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJaWYgKGdldFR5cGUoKSA9PSBudWxsIHx8IGdldFR5cGUoKS5lcXVhbHMoWG1sSmF2YVR5cGVBZGFwdGVyLkRFRkFVTFRfVFlQRSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5BVFRSSUJVVEVfTUFQUElOR19YTUxfSkFWQV9UWVBFX0FEQVBURVJfVFlQRV9OT1RfREVGSU5FRCwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0QW5ub3RhdGlvbigpLmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM2MDliYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVzQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlc0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQXR0cmlidXRlc0NvbnRhaW5lcgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF4YkF0dHJpYnV0ZXNDb250YWluZXIgewotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgamF2YVJlc291cmNlVHlwZTsKLQotCXByb3RlY3RlZCBPd25lciBvd25lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBuZXcgVmVjdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCi0JcHVibGljIEdlbmVyaWNKYXZhQXR0cmlidXRlc0NvbnRhaW5lcihKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgT3duZXIgb3duZXIsIEphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuamF2YVJlc291cmNlVHlwZSA9IHJlc291cmNlVHlwZTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiQ2xhc3NNYXBwaW5nIGdldEpheGJDbGFzc01hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF4YkNsYXNzTWFwcGluZykgZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZVR5cGUgamF2YVJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gdGhpcy5qYXZhUmVzb3VyY2VUeXBlID09IGphdmFSZXNvdXJjZVR5cGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY2hyb25pemVOb2Rlc1dpdGhSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFjY2VzcyB0eXBlICoqKioqKioqKioKLQotCXByb3RlY3RlZCBYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldEFjY2Vzc1R5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuYXR0cmlidXRlcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlcy5zaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpKSB7Ci0JCQl0aGlzLm93bmVyLmZpcmVBdHRyaWJ1dGVBZGRlZChhdHRyaWJ1dGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQXR0cmlidXRlKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVzLnJlbW92ZShhdHRyaWJ1dGUpKSB7Ci0JCQl0aGlzLm93bmVyLmZpcmVBdHRyaWJ1dGVSZW1vdmVkKGF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRGaWVsZChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKGdldEpheGJDbGFzc01hcHBpbmcoKSwgcmVzb3VyY2VGaWVsZCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkUHJvcGVydHkoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZEphdmFQZXJzaXN0ZW50UHJvcGVydHkoZ2V0SmF4YkNsYXNzTWFwcGluZygpLCByZXNvdXJjZUdldHRlciwgcmVzb3VyY2VTZXR0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGVzKCkgewotCQlpZiAoZ2V0SmF4YkNsYXNzTWFwcGluZygpLmlzWG1sVHJhbnNpZW50KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZ2V0QWNjZXNzVHlwZSgpID09IFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUikgewotCQkJdGhpcy5pbml0aWFsaXplUHVibGljTWVtYmVyQWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JCWVsc2UgaWYgKGdldEFjY2Vzc1R5cGUoKSA9PSBYbWxBY2Nlc3NUeXBlLkZJRUxEKSB7Ci0JCQl0aGlzLmludGlhbGl6ZUZpZWxkQWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JCWVsc2UgaWYgKGdldEFjY2Vzc1R5cGUoKSA9PSBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKSB7Ci0JCQl0aGlzLmludGlhbGl6ZVByb3BlcnR5QWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JCWVsc2UgaWYgKGdldEFjY2Vzc1R5cGUoKSA9PSBYbWxBY2Nlc3NUeXBlLk5PTkUpIHsKLQkJCXRoaXMuaW50aWFsaXplTm9uZUFjY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZXMgZm9yIFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUgotCSAqIDEuIGFsbCBwdWJsaWMsIG5vbi1zdGF0aWMsIG5vbi10cmFuc2llbnQgZmllbGRzICh0cmFuc2llbnQgbW9kaWZpZXIsIEBYbWxUcmFuc2llbnQgaXMgYnJvdWdodCB0byB0aGUgY29udGV4dCBtb2RlbCkKLQkgKiAyLiBhbGwgYW5ub3RhdGVkIGZpZWxkcyB0aGF0IGFyZW4ndCBwdWJsaWMKLQkgKiAzLiBhbGwgcHVibGljIGdldHRlci9zZXR0ZXIgamF2YWJlYW5zIHBhaXJzCi0JICogNC4gYWxsIGFubm90YXRlZCBtZXRob2RzIChzb21lIHdpbGwgaGF2ZSBhIG1hdGNoaW5nIGdldHRlci9zZXR0ZXIsIHNvbWUgd2lsbCBiZSBzdGFuZGFsb25lKQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHVibGljTWVtYmVyQWNjZXNzQXR0cmlidXRlcygpIHsKLQkJdGhpcy5pbml0aWFsaXplRmllbGRBdHRyaWJ1dGVzKFBVQkxJQ19NRU1CRVJfQUNDRVNTX1RZUEVfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUik7Ci0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJLy9pdGVyYXRlIHRocm91Z2ggYWxsIHBlcnNpc3RhYmxlIHJlc291cmNlIG1ldGhvZCBnZXR0ZXJzCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCA6IHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKHRoaXMuYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcigpKSkgewotCQkJSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCA9IGdldFZhbGlkU2libGluZ1NldE1ldGhvZChnZXR0ZXJNZXRob2QsIHJlc291cmNlTWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kc0FyZVBlcnNpc3RhYmxlUHVibGljTWVtYmVyQWNjZXNzKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCXRoaXMuYXR0cmlidXRlcy5hZGQodGhpcy5idWlsZFByb3BlcnR5KGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSk7Ci0JCQl9Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKGdldHRlck1ldGhvZCk7Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHNldHRlck1ldGhvZCk7Ci0JCX0KLQkJdGhpcy5pbml0aWFsaXplUmVtYWluaW5nUmVzb3VyY2VNZXRob2RBdHRyaWJ1dGVzKHJlc291cmNlTWV0aG9kcyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5GSUVMRAotCSAqIDEuIGFsbCBub24tdHJhbnNpZW50IGZpZWxkcwotCSAqIDIuIGFsbCBhbm5vdGF0ZWQgbWV0aG9kcyBnZXR0ZXJzL3NldHRlcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50aWFsaXplRmllbGRBY2Nlc3NBdHRyaWJ1dGVzKCkgewotCQl0aGlzLmluaXRpYWxpemVGaWVsZEF0dHJpYnV0ZXModGhpcy5idWlsZE5vblRyYW5zaWVudE5vblN0YXRpY1Jlc291cmNlRmllbGRzRmlsdGVyKCkpOwotCQl0aGlzLmluaXRpYWxpemVBbm5vdGF0ZWRQcm9wZXJ0eUF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGVzIGZvciBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZCi0JICogMS4gYWxsIGdldHRlci9zZXR0ZXIgamF2YWJlYW5zIHBhaXJzCi0JICogMi4gYWxsIGFubm90YXRlZCBmaWVsZHMKLQkgKiAzLiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgZ2V0dGVycy9zZXR0ZXJzIHRoYXQgZG9uJ3QgaGF2ZSBhIG1hdGNoaW5nIHBhaXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50aWFsaXplUHJvcGVydHlBY2Nlc3NBdHRyaWJ1dGVzKCkgewotCQl0aGlzLmluaXRpYWxpemVGaWVsZEF0dHJpYnV0ZXMoQU5OT1RBVEVEX1JFU09VUkNFX0ZJRUxEU19GSUxURVIpOwotCi0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJLy9pdGVyYXRlIHRocm91Z2ggYWxsIHJlc291cmNlIG1ldGhvZHMgc2VhcmNoaW5nIGZvciBwZXJzaXN0YWJsZSBnZXR0ZXJzCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCA6IHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKHRoaXMuYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcigpKSkgewotCQkJSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCA9IGdldFZhbGlkU2libGluZ1NldE1ldGhvZChnZXR0ZXJNZXRob2QsIHJlc291cmNlTWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kc0FyZVBlcnNpc3RhYmxlUHJvcGVydGllcyhnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpIHsKLQkJCQl0aGlzLmF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRQcm9wZXJ0eShnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpOwotCQkJfQotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShnZXR0ZXJNZXRob2QpOwotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShzZXR0ZXJNZXRob2QpOwotCQl9Ci0JCXRoaXMuaW5pdGlhbGl6ZVJlbWFpbmluZ1Jlc291cmNlTWV0aG9kQXR0cmlidXRlcyhyZXNvdXJjZU1ldGhvZHMpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZXMgZm9yIFhtbEFjY2Vzc1R5cGUuTk9ORQotCSAqIDEuIGFsbCBhbm5vdGF0ZWQgZmllbGRzCi0JICogMi4gYWxsIGFubm90YXRlZCBtZXRob2RzIGdldHRlcnMvc2V0dGVycyAoc29tZSB3aWxsIGhhdmUgYSBtYXRjaGluZyBnZXR0ZXIvc2V0dGVyLCBzb21lIHdpbGwgYmUgc3RhbmRhbG9uZSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50aWFsaXplTm9uZUFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZpZWxkQXR0cmlidXRlcyhBTk5PVEFURURfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUFubm90YXRlZFByb3BlcnR5QXR0cmlidXRlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmllbGRBdHRyaWJ1dGVzKEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4gZmlsdGVyKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA6IHRoaXMuZ2V0UmVzb3VyY2VGaWVsZHMoZmlsdGVyKSkgewotCQkJdGhpcy5hdHRyaWJ1dGVzLmFkZCh0aGlzLmJ1aWxkRmllbGQocmVzb3VyY2VGaWVsZCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVSZW1haW5pbmdSZXNvdXJjZU1ldGhvZEF0dHJpYnV0ZXMoQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcykgewotCQkvL2l0ZXJhdGUgdGhyb3VnaCByZW1haW5pbmcgcmVzb3VyY2UgbWV0aG9kcyBhbmQgc2VhcmNoIGZvciB0aG9zZSB0aGF0IGFyZSBhbm5vdGF0ZWQuCi0JCS8vYWxsIGdldHRlciBtZXRob2RzIHdpbGwgYWxyZWFkeSBiZSB1c2VkLgotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlTWV0aG9kcykgewotCQkJaWYgKHJlc291cmNlTWV0aG9kLmlzQW5ub3RhdGVkKCkpIHsKLQkJCQkvL2Fubm90YXRlZCBzZXR0ZXIob3Igb3RoZXIgcmFuZG9tIG1ldGhvZCkgd2l0aCBubyBjb3JyZXNwb25kaW5nIGdldHRlciwgYnJpbmcgaW50byBjb250ZXh0IG1vZGVsIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzCi0JCQkJdGhpcy5hdHRyaWJ1dGVzLmFkZCh0aGlzLmJ1aWxkUHJvcGVydHkobnVsbCwgcmVzb3VyY2VNZXRob2QpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kc0FyZVBlcnNpc3RhYmxlUHJvcGVydGllcyhKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kLCBKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kKSB7Ci0JCWlmIChzZXR0ZXJNZXRob2QgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJLy9MaXN0cyBkbyBub3QgaGF2ZSB0byBoYXZlIGEgY29ycmVzcG9uZGluZyBzZXR0ZXIgbWV0aG9kCi0JCWVsc2UgaWYgKGdldHRlck1ldGhvZC5nZXRUeXBlTmFtZSgpLmVxdWFscygiamF2YS51dGlsLkxpc3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChnZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSkgewotCQkJLy9hbm5vdGF0ZWQgZ2V0dGVyIHdpdGggbm8gY29ycmVzcG9uZGluZyBzZXR0ZXIsIGJyaW5nIGludG8gY29udGV4dCBtb2RlbCBmb3IgdmFsaWRhdGlvbiBwdXJwb3NlcwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kc0FyZVBlcnNpc3RhYmxlUHVibGljTWVtYmVyQWNjZXNzKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QsIEphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QpIHsKLQkJaWYgKGdldHRlck1ldGhvZC5pc1B1YmxpYygpKSB7Ci0JCQlpZiAoc2V0dGVyTWV0aG9kICE9IG51bGwpIHsKLQkJCQlpZiAoc2V0dGVyTWV0aG9kLmlzUHVibGljKCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQkJLy9MaXN0cyBkbyBub3QgaGF2ZSB0byBoYXZlIGEgY29ycmVzcG9uZGluZyBzZXR0ZXIgbWV0aG9kCi0JCQllbHNlIGlmIChnZXR0ZXJNZXRob2QuZ2V0VHlwZU5hbWUoKS5lcXVhbHMoImphdmEudXRpbC5MaXN0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAoZ2V0dGVyTWV0aG9kLmlzQW5ub3RhdGVkKCkpIHsKLQkJCQkvL2Fubm90YXRlZCBnZXR0ZXIgd2l0aCBubyBjb3JyZXNwb25kaW5nIHNldHRlciwgYnJpbmcgaW50byBjb250ZXh0IG1vZGVsIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0dGVyTWV0aG9kLmlzQW5ub3RhdGVkKCkgfHwgKHNldHRlck1ldGhvZCAhPSBudWxsICYmIHNldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQW5ub3RhdGVkUHJvcGVydHlBdHRyaWJ1dGVzKCkgewotCQlDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRSZXNvdXJjZU1ldGhvZHMoKSk7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIGFsbCByZXNvdXJjZSBtZXRob2RzIHNlYXJjaGluZyBmb3IgcGVyc2lzdGFibGUgZ2V0dGVycwotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QgOiB0aGlzLmdldFJlc291cmNlTWV0aG9kcyhidWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kID0gZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKGdldHRlck1ldGhvZCwgcmVzb3VyY2VNZXRob2RzKTsKLQkJCWlmIChnZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSB8fCAoc2V0dGVyTWV0aG9kICE9IG51bGwgJiYgc2V0dGVyTWV0aG9kLmlzQW5ub3RhdGVkKCkpKSB7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzLmFkZCh0aGlzLmJ1aWxkUHJvcGVydHkoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKTsKLQkJCX0KLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoZ2V0dGVyTWV0aG9kKTsKLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoc2V0dGVyTWV0aG9kKTsKLQkJfQotCQl0aGlzLmluaXRpYWxpemVSZW1haW5pbmdSZXNvdXJjZU1ldGhvZEF0dHJpYnV0ZXMocmVzb3VyY2VNZXRob2RzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+IGdldFJlc291cmNlRmllbGRzKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUmVzb3VyY2VUeXBlLmdldEZpZWxkcygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGdldFJlc291cmNlTWV0aG9kcygpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVJlc291cmNlVHlwZS5nZXRNZXRob2RzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPiBnZXRSZXNvdXJjZUZpZWxkcyhGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPihnZXRSZXNvdXJjZUZpZWxkcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGdldFJlc291cmNlTWV0aG9kcyhGaWx0ZXI8SmF2YVJlc291cmNlTWV0aG9kPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+KGdldFJlc291cmNlTWV0aG9kcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+IGJ1aWxkTm9uVHJhbnNpZW50Tm9uU3RhdGljUmVzb3VyY2VGaWVsZHNGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCQkJcmV0dXJuIG1lbWJlcklzTm9uVHJhbnNpZW50Tm9uU3RhdGljKHJlc291cmNlRmllbGQpIHx8IHJlc291cmNlRmllbGQuaXNBbm5vdGF0ZWQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4gUFVCTElDX01FTUJFUl9BQ0NFU1NfVFlQRV9SRVNPVVJDRV9GSUVMRFNfRklMVEVSID0gbmV3IEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4oKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCQlyZXR1cm4gbWVtYmVySXNQdWJsaWNOb25UcmFuc2llbnROb25TdGF0aWMocmVzb3VyY2VGaWVsZCkgfHwgcmVzb3VyY2VGaWVsZC5pc0Fubm90YXRlZCgpOwotCQl9Ci0JfTsKLQotCXByb3RlY3RlZCBGaWx0ZXI8SmF2YVJlc291cmNlTWV0aG9kPiBidWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxKYXZhUmVzb3VyY2VNZXRob2Q+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgewotCQkJCXJldHVybiBtZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIocmVzb3VyY2VNZXRob2QsIGdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWVtYmVySXNQdWJsaWNOb25UcmFuc2llbnROb25TdGF0aWMoSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyKSB7Ci0JCXJldHVybiByZXNvdXJjZU1lbWJlci5pc1B1YmxpYygpICYmIG1lbWJlcklzTm9uVHJhbnNpZW50Tm9uU3RhdGljKHJlc291cmNlTWVtYmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWVtYmVySXNOb25UcmFuc2llbnROb25TdGF0aWMoSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyKSB7Ci0JCXJldHVybiAhcmVzb3VyY2VNZW1iZXIuaXNUcmFuc2llbnQoKSAmJiAhcmVzb3VyY2VNZW1iZXIuaXNTdGF0aWMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4gQU5OT1RBVEVEX1JFU09VUkNFX0ZJRUxEU19GSUxURVIgPSAKLQkJbmV3IEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQkJCXJldHVybiByZXNvdXJjZUZpZWxkLmlzQW5ub3RhdGVkKCk7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiBUaGUgYXR0cmlidXRlcyBhcmUgc3luY2hyb25pemVkIGR1cmluZyB0aGUgPGVtPnVwZGF0ZTwvZW0+IGJlY2F1c2UKLQkgKiB0aGUgbGlzdCBvZiByZXNvdXJjZSBhdHRyaWJ1dGVzIGlzIGRldGVybWluZWQgYnkgdGhlIGFjY2VzcyB0eXBlCi0JICogd2hpY2ggY2FuIGJlIGNvbnRyb2xsZWQgaW4gYSBudW1iZXIgb2YgZGlmZmVyZW50IHBsYWNlcy4uLi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVBdHRyaWJ1dGVzKCkgewotCQlpZiAoZ2V0SmF4YkNsYXNzTWFwcGluZygpLmlzWG1sVHJhbnNpZW50KCkpIHsKLQkJCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA6IGdldEF0dHJpYnV0ZXMoKSkgewotCQkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKGNvbnRleHRBdHRyaWJ1dGUpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChnZXRBY2Nlc3NUeXBlKCkgPT0gWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSKSB7Ci0JCQl0aGlzLnN5bmNQdWJsaWNNZW1iZXJBY2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0QWNjZXNzVHlwZSgpID09IFhtbEFjY2Vzc1R5cGUuRklFTEQpIHsKLQkJCXRoaXMuc3luY0ZpZWxkQWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JCWVsc2UgaWYgKGdldEFjY2Vzc1R5cGUoKSA9PSBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKSB7Ci0JCQl0aGlzLnN5bmNQcm9wZXJ0eUFjY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJfQotCQllbHNlIGlmIChnZXRBY2Nlc3NUeXBlKCkgPT0gWG1sQWNjZXNzVHlwZS5OT05FKSB7Ci0JCQl0aGlzLnN5bmNOb25lQWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU3luYyB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSCi0JICogMS4gYWxsIHB1YmxpYywgbm9uLXN0YXRpYywgbm9uLXRyYW5zaWVudCBmaWVsZHMgKHRyYW5zaWVudCBtb2RpZmllciwgQFhtbFRyYW5zaWVudCBpcyBicm91Z2h0IHRvIHRoZSBjb250ZXh0IG1vZGVsKQotCSAqIDIuIGFsbCBhbm5vdGF0ZWQgZmllbGRzIHRoYXQgYXJlbid0IHB1YmxpYwotCSAqIDMuIGFsbCBwdWJsaWMgZ2V0dGVyL3NldHRlciBqYXZhYmVhbnMgcGFpcnMKLQkgKiA0LiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgKHNvbWUgd2lsbCBoYXZlIGEgbWF0Y2hpbmcgZ2V0dGVyL3NldHRlciwgc29tZSB3aWxsIGJlIHN0YW5kYWxvbmUpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNQdWJsaWNNZW1iZXJBY2Nlc3NBdHRyaWJ1dGVzKCkgewotCQlIYXNoU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBjb250ZXh0QXR0cmlidXRlcyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5nZXRBdHRyaWJ1dGVzKCkpOwotCi0JCXRoaXMuc3luY0ZpZWxkQXR0cmlidXRlcyhjb250ZXh0QXR0cmlidXRlcywgUFVCTElDX01FTUJFUl9BQ0NFU1NfVFlQRV9SRVNPVVJDRV9GSUVMRFNfRklMVEVSKTsKLQotCQlDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRSZXNvdXJjZU1ldGhvZHMoKSk7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIGFsbCBwZXJzaXN0YWJsZSByZXNvdXJjZSBtZXRob2QgZ2V0dGVycwotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QgOiB0aGlzLmdldFJlc291cmNlTWV0aG9kcyh0aGlzLmJ1aWxkUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlck1ldGhvZHNGaWx0ZXIoKSkpIHsKLQkJCUphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QgPSBnZXRWYWxpZFNpYmxpbmdTZXRNZXRob2QoZ2V0dGVyTWV0aG9kLCByZXNvdXJjZU1ldGhvZHMpOwotCQkJaWYgKG1ldGhvZHNBcmVQZXJzaXN0YWJsZVB1YmxpY01lbWJlckFjY2VzcyhnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpIHsKLQkJCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQkJZm9yIChJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gY29udGV4dEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmlzRm9yKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQkJY29udGV4dEF0dHJpYnV0ZS51cGRhdGUoKTsKLQkJCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghbWF0Y2gpIHsKLQkJCQkJdGhpcy5hZGRBdHRyaWJ1dGUodGhpcy5idWlsZFByb3BlcnR5KGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSk7Ci0JCQkJfQotCQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoZ2V0dGVyTWV0aG9kKTsKLQkJCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHNldHRlck1ldGhvZCk7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5zeW5jUmVtYWluaW5nUmVzb3VyY2VNZXRob2RzKGNvbnRleHRBdHRyaWJ1dGVzLCByZXNvdXJjZU1ldGhvZHMpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZXMgZm9yIFhtbEFjY2Vzc1R5cGUuRklFTEQKLQkgKiAxLiBhbGwgbm9uLXRyYW5zaWVudCBmaWVsZHMKLQkgKiAyLiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgZ2V0dGVycy9zZXR0ZXJzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNGaWVsZEFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0KLQkJdGhpcy5zeW5jRmllbGRBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCB0aGlzLmJ1aWxkTm9uVHJhbnNpZW50Tm9uU3RhdGljUmVzb3VyY2VGaWVsZHNGaWx0ZXIoKSk7Ci0JCXRoaXMuc3luY0Fubm90YXRlZFByb3BlcnR5QXR0cmlidXRlcyhjb250ZXh0QXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5QUk9QRVJUWQotCSAqIDEuIGFsbCBnZXR0ZXIvc2V0dGVyIGphdmFiZWFucyBwYWlycwotCSAqIDIuIGFsbCBhbm5vdGF0ZWQgZmllbGRzCi0JICogMy4gYWxsIGFubm90YXRlZCBtZXRob2RzIGdldHRlcnMvc2V0dGVycyB0aGF0IGRvbid0IGhhdmUgYSBtYXRjaGluZyBwYWlyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNQcm9wZXJ0eUFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0KLQkJdGhpcy5zeW5jRmllbGRBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCBBTk5PVEFURURfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUik7Ci0KLQkJQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKCkpOwotCQkvL2l0ZXJhdGUgdGhyb3VnaCBhbGwgcmVzb3VyY2UgbWV0aG9kcyBzZWFyY2hpbmcgZm9yIHBlcnNpc3RhYmxlIGdldHRlcnMKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kIDogdGhpcy5nZXRSZXNvdXJjZU1ldGhvZHModGhpcy5idWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kID0gZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKGdldHRlck1ldGhvZCwgcmVzb3VyY2VNZXRob2RzKTsKLQkJCWlmIChtZXRob2RzQXJlUGVyc2lzdGFibGVQcm9wZXJ0aWVzKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKGNvbnRleHRBdHRyaWJ1dGUuaXNGb3IoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFtYXRjaCkgewotCQkJCQl0aGlzLmFkZEF0dHJpYnV0ZSh0aGlzLmJ1aWxkUHJvcGVydHkoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKGdldHRlck1ldGhvZCk7Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHNldHRlck1ldGhvZCk7Ci0JCX0KLQkJdGhpcy5zeW5jUmVtYWluaW5nUmVzb3VyY2VNZXRob2RzKGNvbnRleHRBdHRyaWJ1dGVzLCByZXNvdXJjZU1ldGhvZHMpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZXMgZm9yIFhtbEFjY2Vzc1R5cGUuTk9ORQotCSAqIDEuIGFsbCBhbm5vdGF0ZWQgZmllbGRzCi0JICogMi4gYWxsIGFubm90YXRlZCBtZXRob2RzIGdldHRlcnMvc2V0dGVycyAoc29tZSB3aWxsIGhhdmUgYSBtYXRjaGluZyBnZXR0ZXIvc2V0dGVyLCBzb21lIHdpbGwgYmUgc3RhbmRhbG9uZSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY05vbmVBY2Nlc3NBdHRyaWJ1dGVzKCkgewotCQlIYXNoU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBjb250ZXh0QXR0cmlidXRlcyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5nZXRBdHRyaWJ1dGVzKCkpOwotCi0JCXRoaXMuc3luY0ZpZWxkQXR0cmlidXRlcyhjb250ZXh0QXR0cmlidXRlcywgQU5OT1RBVEVEX1JFU09VUkNFX0ZJRUxEU19GSUxURVIpOwotCQl0aGlzLnN5bmNBbm5vdGF0ZWRQcm9wZXJ0eUF0dHJpYnV0ZXMoY29udGV4dEF0dHJpYnV0ZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQW5ub3RhdGVkUHJvcGVydHlBdHRyaWJ1dGVzKEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzKSB7Ci0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJLy9pdGVyYXRlIHRocm91Z2ggYWxsIHJlc291cmNlIG1ldGhvZHMgc2VhcmNoaW5nIGZvciBwZXJzaXN0YWJsZSBnZXR0ZXJzCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCA6IHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKGJ1aWxkUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlck1ldGhvZHNGaWx0ZXIoKSkpIHsKLQkJCUphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QgPSBnZXRWYWxpZFNpYmxpbmdTZXRNZXRob2QoZ2V0dGVyTWV0aG9kLCByZXNvdXJjZU1ldGhvZHMpOwotCQkJaWYgKGdldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpIHx8IChzZXR0ZXJNZXRob2QgIT0gbnVsbCAmJiBzZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSkpIHsKLQkJCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQkJZm9yIChJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gY29udGV4dEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmlzRm9yKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQkJY29udGV4dEF0dHJpYnV0ZS51cGRhdGUoKTsKLQkJCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghbWF0Y2gpIHsKLQkJCQkJdGhpcy5hZGRBdHRyaWJ1dGUodGhpcy5idWlsZFByb3BlcnR5KGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSk7Ci0JCQkJfQotCQkJfQotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShnZXR0ZXJNZXRob2QpOwotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShzZXR0ZXJNZXRob2QpOwotCQl9Ci0JCXRoaXMuc3luY1JlbWFpbmluZ1Jlc291cmNlTWV0aG9kcyhjb250ZXh0QXR0cmlidXRlcywgcmVzb3VyY2VNZXRob2RzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0ZpZWxkQXR0cmlidXRlcyhIYXNoU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBjb250ZXh0QXR0cmlidXRlcywgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBmaWx0ZXIpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkIDogdGhpcy5nZXRSZXNvdXJjZUZpZWxkcyhmaWx0ZXIpKSB7Ci0JCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoY29udGV4dEF0dHJpYnV0ZS5pc0ZvcihyZXNvdXJjZUZpZWxkKSkgewotCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCWNvbnRleHRBdHRyaWJ1dGUudXBkYXRlKCk7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCS8vIGFkZGVkIGVsZW1lbnRzIGFyZSBzeW5jJ2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb3Igd2lsbCBiZQotCQkJCS8vIHVwZGF0ZWQgZHVyaW5nIHRoZSBuZXh0ICJ1cGRhdGUiICh3aGljaCBpcyB0cmlnZ2VyZWQgYnkKLQkJCQkvLyB0aGVpciBhZGRpdGlvbiB0byB0aGUgbW9kZWwpCi0JCQkJdGhpcy5hZGRBdHRyaWJ1dGUodGhpcy5idWlsZEZpZWxkKHJlc291cmNlRmllbGQpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUmVtYWluaW5nUmVzb3VyY2VNZXRob2RzKEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzLCBDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzKSB7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIHJlbWFpbmluZyByZXNvdXJjZSBtZXRob2RzIGFuZCBzZWFyY2ggZm9yIHRob3NlIHRoYXQgYXJlIGFubm90YXRlZC4KLQkJLy9hbGwgZ2V0dGVyIG1ldGhvZHMgd2lsbCBhbHJlYWR5IGJlIHVzZWQuCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kIDogcmVzb3VyY2VNZXRob2RzKSB7Ci0JCQlpZiAocmVzb3VyY2VNZXRob2QuaXNBbm5vdGF0ZWQoKSkgewotCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQkvL2Fubm90YXRlZCBzZXR0ZXIob3Igb3RoZXIgcmFuZG9tIG1ldGhvZCkgd2l0aCBubyBjb3JyZXNwb25kaW5nIGdldHRlciwgYnJpbmcgaW50byBjb250ZXh0IG1vZGVsIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzCi0JCQkJZm9yIChJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gY29udGV4dEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmlzRm9yKG51bGwsIHJlc291cmNlTWV0aG9kKSkgewotCQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQkJY29udGV4dEF0dHJpYnV0ZS51cGRhdGUoKTsKLQkJCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghbWF0Y2gpIHsKLQkJCQkJdGhpcy5hZGRBdHRyaWJ1dGUodGhpcy5idWlsZFByb3BlcnR5KG51bGwsIHJlc291cmNlTWV0aG9kKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIGFueSBsZWZ0b3ZlciBjb250ZXh0IGF0dHJpYnV0ZXMKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlIDogY29udGV4dEF0dHJpYnV0ZXMpIHsKLQkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKGNvbnRleHRBdHRyaWJ1dGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgYSAiZ2V0dGVyIiBtZXRob2QgdGhhdAotCSAqIHJlcHJlc2VudHMgYSBwcm9wZXJ0eSB0aGF0IG1heSBiZSAicGVyc2lzdGVkIi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCwgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBhbGxNZXRob2RzKSB7Ci0JCWlmIChtZXRob2RIYXNJbnZhbGlkTW9kaWZpZXJzKHJlc291cmNlTWV0aG9kKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChyZXNvdXJjZU1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVN0cmluZyByZXR1cm5UeXBlTmFtZSA9IHJlc291cmNlTWV0aG9kLmdldFR5cGVOYW1lKCk7Ci0JCWlmIChyZXR1cm5UeXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBET00gbWV0aG9kIGJpbmRpbmdzIGNhbiBoYXZlIGEgbnVsbCBuYW1lCi0JCX0KLQkJaWYgKHJldHVyblR5cGVOYW1lLmVxdWFscygidm9pZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWV0aG9kSGFzUGFyYW1ldGVycyhyZXNvdXJjZU1ldGhvZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWJvb2xlYW4gYm9vbGVhbkdldHRlciA9IG1ldGhvZElzQm9vbGVhbkdldHRlcihyZXNvdXJjZU1ldGhvZCk7Ci0KLQkJLy8gaWYgdGhlIHR5cGUgaGFzIGJvdGggbWV0aG9kczoKLQkJLy8gICAgIGJvb2xlYW4gaXNQcm9wZXJ0eSgpCi0JCS8vICAgICBib29sZWFuIGdldFByb3BlcnR5KCkKLQkJLy8gdGhlbiAjaXNQcm9wZXJ0eSgpIHRha2VzIHByZWNlZGVuY2UgYW5kIHdlIGlnbm9yZSAjZ2V0UHJvcGVydHkoKTsKLQkJLy8gYnV0IG9ubHkgaGF2aW5nICNnZXRQcm9wZXJ0eSgpIGlzIE9LIHRvbwotCQkvLyAoc2VlIHRoZSBKYXZhQmVhbnMgc3BlYyAxLjAxKQotCQlpZiAoYm9vbGVhbkdldHRlciAmJiBtZXRob2RIYXNWYWxpZFNpYmxpbmdJc01ldGhvZChyZXNvdXJjZU1ldGhvZCwgYWxsTWV0aG9kcykpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHNpbmNlIHRoZSB0eXBlIGFsc28gZGVmaW5lcyAjaXNQcm9wZXJ0eSgpLCBpZ25vcmUgI2dldFByb3BlcnR5KCkKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZElzQm9vbGVhbkdldHRlcihKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKLQkJU3RyaW5nIHJldHVyblR5cGVOYW1lID0gcmVzb3VyY2VNZXRob2QuZ2V0VHlwZU5hbWUoKTsKLQkJU3RyaW5nIG5hbWUgPSByZXNvdXJjZU1ldGhvZC5nZXRNZXRob2ROYW1lKCk7Ci0JCWJvb2xlYW4gYm9vbGVhbkdldHRlciA9IGZhbHNlOwotCQlpZiAobmFtZS5zdGFydHNXaXRoKCJpcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoImdldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYm9vbGVhbkdldHRlciA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIGJvb2xlYW5HZXR0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCdzIG1vZGlmaWVycyBwcmV2ZW50IGl0Ci0JICogZnJvbSBiZWluZyBhIGdldHRlciBvciBzZXR0ZXIgZm9yIGEgInBlcnNpc3RlbnQiIHByb3BlcnR5LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKLQkJaW50IG1vZGlmaWVycyA9IHJlc291cmNlTWV0aG9kLmdldE1vZGlmaWVycygpOwotCQlpZiAoTW9kaWZpZXIuaXNTdGF0aWMobW9kaWZpZXJzKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzUGFyYW1ldGVycyhKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKLQkJcmV0dXJuIHJlc291cmNlTWV0aG9kLmdldFBhcmFtZXRlcnNTaXplKCkgIT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIGhhcyBhIHNpYmxpbmcgImlzIiBtZXRob2QgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9wZXJ0eSBhbmQgdGhhdCBtZXRob2QgaXMgdmFsaWQgZm9yIGEgInBlcnNpc3RhYmxlIiBwcm9wZXJ0eS4KLQkgKiBQcmUtY29uZGl0aW9uOiB0aGUgbWV0aG9kIGlzIGEgImJvb2xlYW4gZ2V0dGVyIiAoZS5nLiAncHVibGljIGJvb2xlYW4gZ2V0UHJvcGVydHkoKScpOwotCSAqIHRoaXMgcHJldmVudHMgdXMgZnJvbSByZXR1cm5pbmcgdHJ1ZSB3aGVuIHRoZSBtZXRob2QgaXRzZWxmIGlzIGFuCi0JICogImlzIiBtZXRob2QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RIYXNWYWxpZFNpYmxpbmdJc01ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0TWV0aG9kLCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcykgewotCQlTdHJpbmcgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lID0gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShnZXRNZXRob2QuZ2V0TmFtZSgpKTsKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2Qgc2libGluZyA6IHJlc291cmNlTWV0aG9kcykgewotCQkJaWYgKChzaWJsaW5nLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMCkKLQkJCQkJJiYgc2libGluZy5nZXRNZXRob2ROYW1lKCkuZXF1YWxzKCJpcyIgKyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoc2libGluZywgImJvb2xlYW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWV0aG9kIGhhcyBhIHNpYmxpbmcgInNldCIgbWV0aG9kCi0JICogYW5kIHRoYXQgbWV0aG9kIGlzIHZhbGlkIGZvciBhICJwZXJzaXN0YWJsZSIgcHJvcGVydHkuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSmF2YVJlc291cmNlTWV0aG9kIGdldFZhbGlkU2libGluZ1NldE1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0TWV0aG9kLCBDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzKSB7Ci0JCVN0cmluZyBjYXBpdGFsaXplZEF0dHJpYnV0ZU5hbWUgPSBTdHJpbmdUb29scy5jYXBpdGFsaXplKGdldE1ldGhvZC5nZXROYW1lKCkpOwotCQlTdHJpbmcgcGFyYW1ldGVyVHlwZUVyYXN1cmVOYW1lID0gZ2V0TWV0aG9kLmdldFR5cGVOYW1lKCk7Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIHNpYmxpbmcgOiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJCUxpc3RJdGVyYWJsZTxTdHJpbmc+IHNpYmxpbmdQYXJtVHlwZU5hbWVzID0gc2libGluZy5nZXRQYXJhbWV0ZXJUeXBlTmFtZXMoKTsKLQkJCWlmICgoc2libGluZy5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDEpCi0JCQkJJiYgc2libGluZy5nZXRNZXRob2ROYW1lKCkuZXF1YWxzKCJzZXQiICsgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lKSAvLyROT04tTkxTLTEkCi0JCQkJJiYgc2libGluZ1Bhcm1UeXBlTmFtZXMuaXRlcmF0b3IoKS5uZXh0KCkuZXF1YWxzKHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSkpIHsKLQkJCQlyZXR1cm4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoc2libGluZywgInZvaWQiKSA/IHNpYmxpbmcgOiBudWxsOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtZXRob2QgaXMgYSB2YWxpZCBzaWJsaW5nIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHJldHVybiB0eXBlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNWYWxpZFNpYmxpbmcoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kLCBTdHJpbmcgcmV0dXJuVHlwZU5hbWUpIHsKLQkJaWYgKHJlc291cmNlTWV0aG9kID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhyZXNvdXJjZU1ldGhvZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVzb3VyY2VNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHJ0TmFtZSA9IHJlc291cmNlTWV0aG9kLmdldFR5cGVOYW1lKCk7Ci0JCWlmIChydE5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gRE9NIG1ldGhvZCBiaW5kaW5ncyBjYW4gaGF2ZSBhIG51bGwgbmFtZQotCQl9Ci0JCXJldHVybiBydE5hbWUuZXF1YWxzKHJldHVyblR5cGVOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWF0dHJpYnV0ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JCi0JaW50ZXJmYWNlIE93bmVyIHsKLQkJCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFjY2VzcyB0eXBlIG9mIHRoZSBvd25lciwgdG8gYmUgdXNlZCBpbiBkZXRlcm1pbmluZyB3aGljaCBhdHRyaWJ1dGVzIHRvIGJ1aWxkCi0JCSAqLwotCQlYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKTsKLQotCQkvKioKLQkJICogZmlyZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZm9yIHRoZSBhZGRlZCBhdHRyaWJ1dGUKLQkJICovCi0JCXZvaWQgZmlyZUF0dHJpYnV0ZUFkZGVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSk7Ci0JCQotCQkvKioKLQkJICogZmlyZSBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnQgZm9yIHRoZSByZW1vdmVkIGF0dHJpYnV0ZQotCQkgKi8KLQkJdm9pZCBmaXJlQXR0cmlidXRlUmVtb3ZlZChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNsYXNzTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzI4ODMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZXNDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5hbWVkTm9kZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBY2Nlc3NPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcub21nLkNPUkJBLlBVQkxJQ19NRU1CRVI7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcKLQkJaW1wbGVtZW50cyBKYXhiQ2xhc3NNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZEZhY3RvcnlDbGFzczsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGZhY3RvcnlNZXRob2Q7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFByb3BPcmRlckNvbnRhaW5lciBwcm9wT3JkZXJDb250YWluZXI7Ci0JCi0JcHJvdGVjdGVkIEpheGJDbGFzc01hcHBpbmcgc3VwZXJjbGFzczsKLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzVHlwZTsKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3NUeXBlOwotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NPcmRlciBkZWZhdWx0QWNjZXNzT3JkZXI7Ci0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIHNwZWNpZmllZEFjY2Vzc09yZGVyOwotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHlfbG9hZGVkID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeSA9IGZhbHNlOwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXhiQXR0cmlidXRlc0NvbnRhaW5lciBhdHRyaWJ1dGVzQ29udGFpbmVyOwotCQotCXByb3RlY3RlZCBmaW5hbCBNYXA8SmF4YkNsYXNzTWFwcGluZywgSmF4YkF0dHJpYnV0ZXNDb250YWluZXI+IGluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcnM7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nKEpheGJDbGFzcyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzID0gbmV3IEhhc2h0YWJsZTxKYXhiQ2xhc3NNYXBwaW5nLCBKYXhiQXR0cmlidXRlc0NvbnRhaW5lcj4oKTsKLQkJdGhpcy5wcm9wT3JkZXJDb250YWluZXIgPSBuZXcgUHJvcE9yZGVyQ29udGFpbmVyKCk7Ci0JCQotCQlpbml0RmFjdG9yeUNsYXNzKCk7Ci0JCWluaXRGYWN0b3J5TWV0aG9kKCk7Ci0JCWluaXRQcm9wT3JkZXIoKTsKLQkJaW5pdFNwZWNpZmllZEFjY2Vzc1R5cGUoKTsKLQkJaW5pdERlZmF1bHRBY2Nlc3NUeXBlKCk7Ci0JCWluaXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpOwotCQlpbml0RGVmYXVsdEFjY2Vzc09yZGVyKCk7Ci0JCXRoaXMuYXR0cmlidXRlc0NvbnRhaW5lciA9IG5ldyBHZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIodGhpcywgYnVpbGRBdHRyaWJ1dGVzQ29udGFpbmVyT3duZXIoKSwgZ2V0SmF2YVJlc291cmNlVHlwZSgpKTsKLQkJaW5pdEluY2x1ZGVkQXR0cmlidXRlcygpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIHN1cGVyLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJDbGFzcyBnZXRKYXhiVHlwZSgpIHsKLQkJcmV0dXJuIChKYXhiQ2xhc3MpIHN1cGVyLmdldEpheGJUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGFja2FnZUluZm8gZ2V0UGFja2FnZUluZm8oKSB7Ci0JCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gZ2V0SmF4YlBhY2thZ2UoKTsKLQkJLy8gamF4YiBwYWNrYWdlIG1heSBiZSBudWxsIGR1cmluZyBpbml0aWFsaXphdGlvbi91cGRhdGUKLQkJcmV0dXJuIChqYXhiUGFja2FnZSA9PSBudWxsKSA/IG51bGwgOiBqYXhiUGFja2FnZS5nZXRQYWNrYWdlSW5mbygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY0ZhY3RvcnlDbGFzcygpOwotCQlzeW5jRmFjdG9yeU1ldGhvZCgpOwotCQlzeW5jUHJvcE9yZGVyKCk7Ci0JCXN5bmNTcGVjaWZpZWRBY2Nlc3NUeXBlKCk7Ci0JCXN5bmNTcGVjaWZpZWRBY2Nlc3NPcmRlcigpOwotCQl0aGlzLmF0dHJpYnV0ZXNDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jSW5jbHVkZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVN1cGVyY2xhc3MoKTsKLQkJdXBkYXRlRGVmYXVsdEFjY2Vzc1R5cGUoKTsKLQkJdXBkYXRlRGVmYXVsdEFjY2Vzc09yZGVyKCk7Ci0JCXRoaXMuaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeV9sb2FkZWQgPSBmYWxzZTsgLy8gdHJpZ2dlcnMgdGhhdCB0aGUgdmFsdWUgbXVzdCBiZSByZWNhbGN1bGF0ZWQgb24gbmV4dCByZXF1ZXN0Ci0JCXRoaXMuYXR0cmlidXRlc0NvbnRhaW5lci51cGRhdGUoKTsKLQkJdXBkYXRlSW5jbHVkZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCQotCQotCS8vICoqKioqIGZhY3RvcnkgY2xhc3MgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEZhY3RvcnlDbGFzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRmFjdG9yeUNsYXNzIDogSkFYQi5YTUxfVFlQRV9fREVGQVVMVF9GQUNUT1JZX0NMQVNTOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmFjdG9yeUNsYXNzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoU3RyaW5nIGZhY3RvcnlDbGFzcykgewotCQlnZXRYbWxUeXBlQW5ub3RhdGlvbigpLnNldEZhY3RvcnlDbGFzcyhmYWN0b3J5Q2xhc3MpOwotCQlzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3NfKGZhY3RvcnlDbGFzcyk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3NfKFN0cmluZyBmYWN0b3J5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkRmFjdG9yeUNsYXNzOwotCQl0aGlzLnNwZWNpZmllZEZhY3RvcnlDbGFzcyA9IGZhY3RvcnlDbGFzczsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRkFDVE9SWV9DTEFTU19QUk9QRVJUWSwgb2xkLCBmYWN0b3J5Q2xhc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRGYWN0b3J5Q2xhc3MoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEZhY3RvcnlDbGFzcygpIHsKLQkJdGhpcy5zcGVjaWZpZWRGYWN0b3J5Q2xhc3MgPSBnZXRSZXNvdXJjZUZhY3RvcnlDbGFzcygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRmFjdG9yeUNsYXNzKCkgewotCQlzZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3NfKGdldFJlc291cmNlRmFjdG9yeUNsYXNzKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBmYWN0b3J5IG1ldGhvZCAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeU1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeU1ldGhvZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeU1ldGhvZChTdHJpbmcgZmFjdG9yeU1ldGhvZCkgewotCQlnZXRYbWxUeXBlQW5ub3RhdGlvbigpLnNldEZhY3RvcnlNZXRob2QoZmFjdG9yeU1ldGhvZCk7Ci0JCXNldEZhY3RvcnlNZXRob2RfKGZhY3RvcnlNZXRob2QpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmFjdG9yeU1ldGhvZF8oU3RyaW5nIGZhY3RvcnlNZXRob2QpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZmFjdG9yeU1ldGhvZDsKLQkJdGhpcy5mYWN0b3J5TWV0aG9kID0gZmFjdG9yeU1ldGhvZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChGQUNUT1JZX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBmYWN0b3J5TWV0aG9kKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUZhY3RvcnlNZXRob2QoKSB7Ci0JCXJldHVybiBnZXRYbWxUeXBlQW5ub3RhdGlvbigpLmdldEZhY3RvcnlNZXRob2QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEZhY3RvcnlNZXRob2QoKSB7Ci0JCXRoaXMuZmFjdG9yeU1ldGhvZCA9IGdldFJlc291cmNlRmFjdG9yeU1ldGhvZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRmFjdG9yeU1ldGhvZCgpIHsKLQkJc2V0RmFjdG9yeU1ldGhvZF8oZ2V0UmVzb3VyY2VGYWN0b3J5TWV0aG9kKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwcm9wIG9yZGVyICoqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpIHsKLQkJcmV0dXJuIHRoaXMucHJvcE9yZGVyQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByb3AoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnByb3BPcmRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0UHJvcE9yZGVyU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvcE9yZGVyQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkUHJvcChpbnQgaW5kZXgsIFN0cmluZyBwcm9wKSB7Ci0JCWdldFhtbFR5cGVBbm5vdGF0aW9uKCkuYWRkUHJvcChpbmRleCwgcHJvcCk7Ci0JCXRoaXMucHJvcE9yZGVyQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBwcm9wKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcChTdHJpbmcgcHJvcCkgewotCQl0aGlzLnJlbW92ZVByb3AodGhpcy5wcm9wT3JkZXJDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KHByb3ApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcChpbnQgaW5kZXgpIHsKLQkJdGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbigpLnJlbW92ZVByb3AoaW5kZXgpOwotCQl0aGlzLnByb3BPcmRlckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVQcm9wKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oKS5tb3ZlUHJvcCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnByb3BPcmRlckNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByb3BPcmRlcigpIHsKLQkJdGhpcy5wcm9wT3JkZXJDb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jUHJvcE9yZGVyKCkgewotCQl0aGlzLnByb3BPcmRlckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZVByb3BPcmRlcigpIHsKLQkJTGlzdEl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRQcm9wT3JkZXIoKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5zaXplKHJlc3VsdCkgPT0gMSAmJiBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkcuZXF1YWxzKENvbGxlY3Rpb25Ub29scy5nZXQocmVzdWx0LCAwKSkpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEFjY2Vzc29yVHlwZSAqKioqKgotCQotCXB1YmxpYyBYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlIDogdGhpcy5kZWZhdWx0QWNjZXNzVHlwZTsKLQl9Ci0JCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBY2Nlc3NUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWNjZXNzVHlwZV8oWG1sQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJWG1sQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRBY2Nlc3NUeXBlOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3NUeXBlID0gYWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1RZUEVfUFJPUEVSVFksIG9sZCwgYWNjZXNzKTsKLQl9Ci0JCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlnZXRYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKCkuc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKGFjY2VzcykpOwotCQlzZXRTcGVjaWZpZWRBY2Nlc3NUeXBlXyhhY2Nlc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NUeXBlXyhYbWxBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlYbWxBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlID0gYWNjZXNzOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfVFlQRV9QUk9QRVJUWSwgb2xkLCBhY2Nlc3MpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVmYXVsdEFjY2Vzc1R5cGUoKSB7Ci0JCXRoaXMuZGVmYXVsdEFjY2Vzc1R5cGUgPSBidWlsZERlZmF1bHRBY2Nlc3NUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRBY2Nlc3NUeXBlKCkgewotCQlzZXREZWZhdWx0QWNjZXNzVHlwZV8oYnVpbGREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogRGVmYXVsdCBhY2Nlc3MgdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBmb2xsb3dpbmcsIGluIG9yZGVyIG9mIHByZWNlZGVuY2U6Ci0JICogLSBAWG1sQWNjZXNzb3JUeXBlIGFubm90YXRpb24gb24gYSBtYXBwZWQgc3VwZXIgY2xhc3MKLQkgKiAtIEBYbWxBY2Nlc3NvclR5cGUgYW5ub3RhdGlvbiBvbiB0aGUgcGFja2FnZQotCSAqIC0gZGVmYXVsdCBhY2Nlc3MgdHlwZSBvZiB7QGxpbmsgUFVCTElDX01FTUJFUn0KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBidWlsZERlZmF1bHRBY2Nlc3NUeXBlKCkgewotCQlYbWxBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgPSBnZXRTdXBlcmNsYXNzQWNjZXNzVHlwZSgpOwotCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWNjZXNzVHlwZTsKLQkJfQotCQlhY2Nlc3NUeXBlID0gZ2V0UGFja2FnZUFjY2Vzc1R5cGUoKTsKLQkJaWYgKGFjY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCX0KLQkJcmV0dXJuIFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc1R5cGUgZ2V0U3VwZXJjbGFzc0FjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnN1cGVyY2xhc3MgPT0gbnVsbCA/IG51bGwgOiB0aGlzLnN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBnZXRQYWNrYWdlQWNjZXNzVHlwZSgpIHsKLQkJSmF4YlBhY2thZ2VJbmZvIHBhY2thZ2VJbmZvID0gZ2V0UGFja2FnZUluZm8oKTsKLQkJcmV0dXJuIChwYWNrYWdlSW5mbyA9PSBudWxsKSA/IG51bGwgOiBwYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIGdldFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBnZXRSZXNvdXJjZUFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChnZXRYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRTcGVjaWZpZWRBY2Nlc3NUeXBlKCkgewotCQl0aGlzLnNwZWNpZmllZEFjY2Vzc1R5cGUgPSBnZXRSZXNvdXJjZUFjY2Vzc1R5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEFjY2Vzc1R5cGUoKSB7Ci0JCXNldFNwZWNpZmllZEFjY2Vzc1R5cGVfKGdldFJlc291cmNlQWNjZXNzVHlwZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sQWNjZXNzb3JPcmRlciAqKioqKgotCQotCXB1YmxpYyBYbWxBY2Nlc3NPcmRlciBnZXRBY2Nlc3NPcmRlcigpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2Vzc09yZGVyICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlciA6IHRoaXMuZGVmYXVsdEFjY2Vzc09yZGVyOwotCX0KLQkKLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzT3JkZXI7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3NPcmRlcl8oWG1sQWNjZXNzT3JkZXIgYWNjZXNzT3JkZXIpIHsKLQkJWG1sQWNjZXNzT3JkZXIgb2xkID0gdGhpcy5kZWZhdWx0QWNjZXNzT3JkZXI7Ci0JCXRoaXMuZGVmYXVsdEFjY2Vzc09yZGVyID0gYWNjZXNzT3JkZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9BQ0NFU1NfT1JERVJfUFJPUEVSVFksIG9sZCwgYWNjZXNzT3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2Vzc09yZGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlcikgewotCQlnZXRYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbigpLnNldFZhbHVlKFhtbEFjY2Vzc09yZGVyLnRvSmF2YVJlc291cmNlTW9kZWwoYWNjZXNzT3JkZXIpKTsKLQkJc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXJfKGFjY2Vzc09yZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXJfKFhtbEFjY2Vzc09yZGVyIGFjY2Vzc09yZGVyKSB7Ci0JCVhtbEFjY2Vzc09yZGVyIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXI7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXIgPSBhY2Nlc3NPcmRlcjsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX09SREVSX1BST1BFUlRZLCBvbGQsIGFjY2Vzc09yZGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlZmF1bHRBY2Nlc3NPcmRlcigpIHsKLQkJdGhpcy5kZWZhdWx0QWNjZXNzT3JkZXIgPSBidWlsZERlZmF1bHRBY2Nlc3NPcmRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0QWNjZXNzT3JkZXIoKSB7Ci0JCXNldERlZmF1bHRBY2Nlc3NPcmRlcl8oYnVpbGREZWZhdWx0QWNjZXNzT3JkZXIoKSk7Ci0JfQotCQotCS8qKgotCSAqIERlZmF1bHQgYWNjZXNzIG9yZGVyIGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZywgaW4gb3JkZXIgb2YgcHJlY2VkZW5jZToKLQkgKiAtIEBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24gb24gYSBtYXBwZWQgc3VwZXIgY2xhc3MKLQkgKiAtIEBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24gb24gdGhlIHBhY2thZ2UKLQkgKiAtIGRlZmF1bHQgYWNjZXNzIG9yZGVyIG9mIHtAbGluayBVTkRFRklORUR9Ci0JICovCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIGJ1aWxkRGVmYXVsdEFjY2Vzc09yZGVyKCkgewotCQlYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlciA9IGdldFN1cGVyY2xhc3NBY2Nlc3NPcmRlcigpOwotCQlpZiAoYWNjZXNzT3JkZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjY2Vzc09yZGVyOwotCQl9Ci0JCWFjY2Vzc09yZGVyID0gZ2V0UGFja2FnZUFjY2Vzc09yZGVyKCk7Ci0JCWlmIChhY2Nlc3NPcmRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWNjZXNzT3JkZXI7Ci0JCX0KLQkJcmV0dXJuIFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIGdldFN1cGVyY2xhc3NBY2Nlc3NPcmRlcigpIHsKLQkJSmF4YkNsYXNzTWFwcGluZyBzdXBlcmNsYXNzID0gdGhpcy5zdXBlcmNsYXNzOwotCQl3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsKSB7Ci0JCQlYbWxBY2Nlc3NPcmRlciBhY2Nlc3NPcmRlciA9IHN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKTsKLQkJCWlmIChhY2Nlc3NPcmRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc09yZGVyOwotCQkJfQotCQkJc3VwZXJjbGFzcyA9IHN1cGVyY2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzT3JkZXIgZ2V0UGFja2FnZUFjY2Vzc09yZGVyKCkgewotCQlKYXhiUGFja2FnZUluZm8gcGFja2FnZUluZm8gPSBnZXRQYWNrYWdlSW5mbygpOwotCQlyZXR1cm4gcGFja2FnZUluZm8gPT0gbnVsbCA/IG51bGwgOiBwYWNrYWdlSW5mby5nZXRBY2Nlc3NPcmRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gZ2V0WG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NPcmRlciBnZXRSZXNvdXJjZUFjY2Vzc09yZGVyKCkgewotCQlyZXR1cm4gWG1sQWNjZXNzT3JkZXIuZnJvbUphdmFSZXNvdXJjZU1vZGVsKGdldFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpIHsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlciA9IGdldFJlc291cmNlQWNjZXNzT3JkZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEFjY2Vzc09yZGVyKCkgewotCQlzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcl8oZ2V0UmVzb3VyY2VBY2Nlc3NPcmRlcigpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdXBlciBjbGFzcyAqKioqKioqKioqCi0JCi0JcHVibGljIEpheGJDbGFzc01hcHBpbmcgZ2V0U3VwZXJjbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3VwZXJjbGFzczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXJjbGFzc18oSmF4YkNsYXNzTWFwcGluZyBzdXBlcmNsYXNzKSB7Ci0JCUpheGJDbGFzc01hcHBpbmcgb2xkID0gdGhpcy5zdXBlcmNsYXNzOwotCQl0aGlzLnN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1VQRVJDTEFTU19QUk9QRVJUWSwgb2xkLCBzdXBlcmNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3VwZXJjbGFzcygpIHsKLQkJc2V0U3VwZXJjbGFzc18oZmluZFN1cGVyY2xhc3MoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGZpbmRTdXBlcmNsYXNzKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGdldFN1cGVyY2xhc3MoZ2V0SmF2YVJlc291cmNlVHlwZSgpKTsKLQkJd2hpbGUgKHJlc291cmNlVHlwZSAhPSBudWxsICYmIHJlc291cmNlVHlwZSAhPSB0aGlzKSB7Ci0JCQlKYXhiVHlwZSBqYXhiVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKHJlc291cmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCi0JCQkvLyBpZiB0aGUgc3VwZXJjbGFzcyBpcyBub3QgYSBjbGFzcywgcmV0dXJuIG51bGwKLQkJCWlmIChqYXhiVHlwZSA9PSBudWxsIHx8IGpheGJUeXBlLmdldEtpbmQoKSAhPSBKYXhiVHlwZS5LaW5kLkNMQVNTKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCUpheGJDbGFzc01hcHBpbmcgamF4YkNsYXNzTWFwcGluZyA9ICgoSmF4YkNsYXNzKSBqYXhiVHlwZSkuZ2V0TWFwcGluZygpOwotCQkJLy8gcmFyZSBmb3IgYSBub24tbnVsbCBzdXBlcmNsYXNzIHRvIG5vdCBiZSBtYXBwZWQsIGJ1dCBwb3RlbnRpYWxseSBwb3NzaWJsZSBtaWQtdXBkYXRlCi0JCQlpZiAoamF4YkNsYXNzTWFwcGluZyAhPSBudWxsKSB7ICAKLQkJCQlyZXR1cm4gamF4YkNsYXNzTWFwcGluZzsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc291cmNlVHlwZSA9IGdldFN1cGVyY2xhc3MocmVzb3VyY2VUeXBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgZ2V0U3VwZXJjbGFzcyhKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSByZXNvdXJjZVR5cGUuZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSgKLQkJCQlzdXBlcmNsYXNzTmFtZSwgSmF2YVJlc291cmNlVHlwZS5LaW5kLlRZUEUpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBhdHRyaWJ1dGVzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzQ29udGFpbmVyLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlc0NvbnRhaW5lci5nZXRBdHRyaWJ1dGVzU2l6ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgR2VuZXJpY0phdmFBdHRyaWJ1dGVzQ29udGFpbmVyLk93bmVyIGJ1aWxkQXR0cmlidXRlc0NvbnRhaW5lck93bmVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQXR0cmlidXRlc0NvbnRhaW5lci5Pd25lcigpIHsKLQkJCXB1YmxpYyBYbWxBY2Nlc3NUeXBlIGdldEFjY2Vzc1R5cGUoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLnRoaXMuZ2V0QWNjZXNzVHlwZSgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBmaXJlQXR0cmlidXRlQWRkZWQoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmcudGhpcy5maXJlSXRlbUFkZGVkKEFUVFJJQlVURVNfQ09MTEVDVElPTiwgYXR0cmlidXRlKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZmlyZUF0dHJpYnV0ZVJlbW92ZWQoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmcudGhpcy5maXJlSXRlbVJlbW92ZWQoQVRUUklCVVRFU19DT0xMRUNUSU9OLCBhdHRyaWJ1dGUpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKiBpbmNsdWRlZCBhdHRyaWJ1dGVzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRJbmNsdWRlZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KGdldEluY2x1ZGVkQXR0cmlidXRlU2V0cygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPj4gZ2V0SW5jbHVkZWRBdHRyaWJ1dGVTZXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YkF0dHJpYnV0ZXNDb250YWluZXIsIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPj4oCi0JCQkJZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKEpheGJBdHRyaWJ1dGVzQ29udGFpbmVyIGF0dHJpYnV0ZXNDb250YWluZXIpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlc0NvbnRhaW5lci5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiQXR0cmlidXRlc0NvbnRhaW5lcj4gZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKYXhiQXR0cmlidXRlc0NvbnRhaW5lcj4odGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnZhbHVlcygpKTsgIC8vIHJlYWQtb25seQotCX0KLQkKLQlwdWJsaWMgaW50IGdldEluY2x1ZGVkQXR0cmlidXRlc1NpemUoKSB7Ci0JCWludCBzaXplID0gMDsKLQkJZm9yIChKYXhiQXR0cmlidXRlc0NvbnRhaW5lciBhdHRyaWJ1dGVzQ29udGFpbmVyIDogZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycygpKSB7Ci0JCQlzaXplICs9IGF0dHJpYnV0ZXNDb250YWluZXIuZ2V0QXR0cmlidXRlc1NpemUoKTsKLQkJfQotCQlyZXR1cm4gc2l6ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEluY2x1ZGVkQXR0cmlidXRlcygpIHsKLQkJLy8geG1sIHRyYW5zaWVudCBjbGFzc2VzIGhhdmUgbm8gaW5jbHVkZWQgYXR0cmlidXRlcwotCQlpZiAoaXNYbWxUcmFuc2llbnQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUpheGJDbGFzc01hcHBpbmcgc3VwZXJjbGFzcyA9IHRoaXMuc3VwZXJjbGFzczsKLQkJLy8gb25seSBhZGQgaW5oZXJpdGVkIGF0dHJpYnV0ZXMgZm9yIHN1cGVyY2xhc3NlcyB1cCB1bnRpbCBhIG1hcHBlZCBjbGFzcyBpcyBlbmNvdW50ZXJlZAotCQl3aGlsZSAoc3VwZXJjbGFzcyAhPSBudWxsICYmIHN1cGVyY2xhc3MuaXNYbWxUcmFuc2llbnQoKSkgewotCQkJdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnB1dChzdXBlcmNsYXNzLCBidWlsZEluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcihzdXBlcmNsYXNzKSk7Ci0JCQlzdXBlcmNsYXNzID0gc3VwZXJjbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY0luY2x1ZGVkQXR0cmlidXRlcygpIHsKLQkJZm9yIChKYXhiQXR0cmlidXRlc0NvbnRhaW5lciBhdHRyaWJ1dGVzQ29udGFpbmVyIDogdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnZhbHVlcygpKSB7Ci0JCQlhdHRyaWJ1dGVzQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbmNsdWRlZEF0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF4YkNsYXNzTWFwcGluZz4gb2xkU3VwZXJjbGFzc2VzIAotCQkJCT0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcnMua2V5U2V0KCkpOwotCQlTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IG9sZEF0dHJpYnV0ZXMgPSBDb2xsZWN0aW9uVG9vbHMuc2V0KGdldEluY2x1ZGVkQXR0cmlidXRlcygpKTsKLQkJCi0JCWlmICghIGlzWG1sVHJhbnNpZW50KCkpIHsKLQkJCUpheGJDbGFzc01hcHBpbmcgc3VwZXJjbGFzcyA9IHRoaXMuc3VwZXJjbGFzczsKLQkJCS8vIG9ubHkgYWRkIGluaGVyaXRlZCBhdHRyaWJ1dGVzIGZvciBzdXBlcmNsYXNzZXMgdXAgdW50aWwgYSBtYXBwZWQgY2xhc3MgaXMgZW5jb3VudGVyZWQKLQkJCXdoaWxlIChzdXBlcmNsYXNzICE9IG51bGwgJiYgc3VwZXJjbGFzcy5pc1htbFRyYW5zaWVudCgpKSB7Ci0JCQkJaWYgKHRoaXMuaW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycy5jb250YWluc0tleShzdXBlcmNsYXNzKSkgewotCQkJCQl0aGlzLmluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcnMuZ2V0KHN1cGVyY2xhc3MpLnVwZGF0ZSgpOwotCQkJCQlvbGRTdXBlcmNsYXNzZXMucmVtb3ZlKHN1cGVyY2xhc3MpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5pbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJzLnB1dChzdXBlcmNsYXNzLCBidWlsZEluY2x1ZGVkQXR0cmlidXRlc0NvbnRhaW5lcihzdXBlcmNsYXNzKSk7Ci0JCQkJfQotCQkJCXN1cGVyY2xhc3MgPSBzdXBlcmNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiQ2xhc3NNYXBwaW5nIG9sZFN1cGVyY2xhc3MgOiBvbGRTdXBlcmNsYXNzZXMpIHsKLQkJCXRoaXMuaW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVycy5yZW1vdmUob2xkU3VwZXJjbGFzcyk7Ci0JCX0KLQkJCi0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3QXR0cmlidXRlcyA9IENvbGxlY3Rpb25Ub29scy5zZXQoZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzKCkpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRGlmZmVyZW50KG9sZEF0dHJpYnV0ZXMsIG5ld0F0dHJpYnV0ZXMpKSB7Ci0JCQlmaXJlQ29sbGVjdGlvbkNoYW5nZWQoSU5DTFVERURfQVRUUklCVVRFU19DT0xMRUNUSU9OLCBuZXdBdHRyaWJ1dGVzKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZXNDb250YWluZXIgYnVpbGRJbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXIoSmF4YkNsYXNzTWFwcGluZyBqYXhiQ2xhc3NNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVzQ29udGFpbmVyKHRoaXMsIGJ1aWxkSW5jbHVkZWRBdHRyaWJ1dGVzQ29udGFpbmVyT3duZXIoKSwgamF4YkNsYXNzTWFwcGluZy5nZXRKYXhiVHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBHZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIuT3duZXIgYnVpbGRJbmNsdWRlZEF0dHJpYnV0ZXNDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUF0dHJpYnV0ZXNDb250YWluZXIuT3duZXIoKSB7Ci0JCQlwdWJsaWMgWG1sQWNjZXNzVHlwZSBnZXRBY2Nlc3NUeXBlKCkgewotCQkJCXJldHVybiBHZW5lcmljSmF2YUNsYXNzTWFwcGluZy50aGlzLmdldEFjY2Vzc1R5cGUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgZmlyZUF0dHJpYnV0ZUFkZGVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLnRoaXMuZmlyZUl0ZW1BZGRlZChJTkNMVURFRF9BVFRSSUJVVEVTX0NPTExFQ1RJT04sIGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIGZpcmVBdHRyaWJ1dGVSZW1vdmVkKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nLnRoaXMuZmlyZUl0ZW1SZW1vdmVkKElOQ0xVREVEX0FUVFJJQlVURVNfQ09MTEVDVElPTiwgYXR0cmlidXRlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyBhdHRyaWJ1dGVzICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBbGxMb2NhbGx5RGVmaW5lZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KAotCQkJCWdldEF0dHJpYnV0ZXMoKSwKLQkJCQlnZXRJbmNsdWRlZEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0SW5oZXJpdGVkQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4oCi0JCQkJZ2V0SW5jbHVkZWRBdHRyaWJ1dGVzKCksCi0JCQkJZ2V0T3RoZXJJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpOwotCX0KLQkKLQkvKioKLQkgKiByZXR1cm4gdGhvc2UgaW5oZXJpdGVkIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IGluY2x1ZGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRPdGhlckluaGVyaXRlZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJDbGFzc01hcHBpbmcsIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPj4oCi0JCQkJCQluZXcgQ2hhaW5JdGVyYWJsZTxKYXhiQ2xhc3NNYXBwaW5nPihnZXRTdXBlcmNsYXNzKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBuZXh0TGluayhKYXhiQ2xhc3NNYXBwaW5nIGN1cnJlbnRMaW5rKSB7Ci0JCQkJCQkJCXJldHVybiBjdXJyZW50TGluay5nZXRTdXBlcmNsYXNzKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiB0cmFuc2Zvcm0oSmF4YkNsYXNzTWFwcGluZyBvKSB7Ci0JCQkJCQlyZXR1cm4gby5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3ViQ2xhc3NlcyAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHkoKSB7Ci0JCWlmICghIHRoaXMuaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeV9sb2FkZWQpIHsKLQkJCXRoaXMuaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeSA9IGNhbGN1bGF0ZUhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHkoKTsKLQkJCXRoaXMuaGFzUm9vdEVsZW1lbnRJbkhpZXJhcmNoeV9sb2FkZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiB0aGlzLmhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZUhhc1Jvb3RFbGVtZW50SW5IaWVyYXJjaHkoKSB7Ci0JCWlmICh0aGlzLmdldFhtbFJvb3RFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCWZvciAoSmF4YlR5cGUgamF4YlR5cGUgOiBnZXRKYXhiUHJvamVjdCgpLmdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkgewotCQkJaWYgKGpheGJUeXBlLmdldE1hcHBpbmcoKSAhPSBudWxsIAotCQkJCQkmJiAhIGpheGJUeXBlLmdldE1hcHBpbmcoKS5pc1htbFRyYW5zaWVudCgpIAotCQkJCQkmJiBqYXhiVHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sUm9vdEVsZW1lbnQoKSAhPSBudWxsCi0JCQkJCSYmIEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoCi0JCQkJCQkJZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLAotCQkJCQkJCWpheGJUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLCBnZXRKYXhiVHlwZSgpLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRUcmFuc2llbnRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0VHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpLAotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGUoZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCkpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Tm9uVHJhbnNpZW50UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCXN1cGVyLmdldE5vblRyYW5zaWVudFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSwKLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlKGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpKSwKLQkJCQluZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlLCBJdGVyYWJsZTxTdHJpbmc+PihnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiB0cmFuc2Zvcm0oSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCQkJCQlyZXR1cm4gby5nZXRNYXBwaW5nKCkuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldFhtbElkTWFwcGluZygpIHsKLQkJSXRlcmF0b3I8WG1sTmFtZWROb2RlTWFwcGluZz4gaWRNYXBwaW5ncyA9IGdldEJhc2ljTWFwcGluZ3NXaXRoWG1sSUQoKS5pdGVyYXRvcigpOwotCQlyZXR1cm4gKGlkTWFwcGluZ3MuaGFzTmV4dCgpKSA/IGlkTWFwcGluZ3MubmV4dCgpIDogbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhtbE5hbWVkTm9kZU1hcHBpbmc+IGdldEJhc2ljTWFwcGluZ3NXaXRoWG1sSUQoKXsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxYbWxOYW1lZE5vZGVNYXBwaW5nPihnZXRCYXNpY01hcHBpbmdzKCkpewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoWG1sTmFtZWROb2RlTWFwcGluZyBiYXNpY01hcHBpbmcpIHsKLQkJCQlyZXR1cm4gYmFzaWNNYXBwaW5nLmdldFhtbElEKCkgIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhtbE5hbWVkTm9kZU1hcHBpbmc+IGdldEJhc2ljTWFwcGluZ3MoKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEpheGJBdHRyaWJ1dGVNYXBwaW5nLCBYbWxOYW1lZE5vZGVNYXBwaW5nPihnZXRCYXNpY01hcHBpbmdzXygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJBdHRyaWJ1dGVNYXBwaW5nPiBnZXRCYXNpY01hcHBpbmdzXygpewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJBdHRyaWJ1dGVNYXBwaW5nPihnZXRBdHRyaWJ1dGVNYXBwaW5ncygpKXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpheGJBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJCQlyZXR1cm4gKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZCi0JCQkJCQl8fCBhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXhiQXR0cmlidXRlTWFwcGluZz4gZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF4YkF0dHJpYnV0ZU1hcHBpbmc+KGdldEF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgdHJhbnNmb3JtKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKAotCQkJaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmIChwcm9wVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvcFByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQkvLyBUT0RPIC0gZmFjdG9yeSBtZXRob2RzPwotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0aGlzLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJcmVzdWx0ID0gYXR0cmlidXRlLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmc+KGdldEFsbExvY2FsbHlEZWZpbmVkQXR0cmlidXRlcygpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIG8pIHsKLQkJCQkJCQlyZXR1cm4gby5nZXROYW1lKCk7Ci0JCQkJCQl9Ci0JCQkJCX0sCi0JCQkJCWZpbHRlcikpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXZhbGlkYXRlQ29uc3RydWN0b3IobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdmFsaWRhdGVQcm9wT3JkZXIobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdmFsaWRhdGVYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJdmFsaWRhdGVYbWxBbnlFbGVtZW50TWFwcGluZyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlWG1sVmFsdWVNYXBwaW5nKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJdmFsaWRhdGVYbWxJRHMobWVzc2FnZXMsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWF0dHJpYnV0ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29uc3RydWN0b3IoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gVE9ETyAtIGZhY3RvcnkgY2xhc3MvbWV0aG9kCi0JCQotCQlpZiAoISBKQVhCLlhNTF9UWVBFX19ERUZBVUxUX0ZBQ1RPUllfQ0xBU1MuZXF1YWxzKGdldEZhY3RvcnlDbGFzcygpKSkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0RmFjdG9yeU1ldGhvZCgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19VTlNQRUNJRklFRF9GQUNUT1JZX01FVEhPRCwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZ2V0RmFjdG9yeU1ldGhvZCgpID09IG51bGwKLQkJCQkJJiYgZ2V0SmF4YlR5cGUoKS5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSA9PSBudWxsCi0JCQkJCSYmICEgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmhhc1B1YmxpY09yUHJvdGVjdGVkTm9BcmdDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1RZUEVfX05PX1BVQkxJQ19PUl9QUk9URUNURURfQ09OU1RSVUNUT1IsCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcm9wT3JkZXIoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGdldFByb3BPcmRlcigpKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvLyBubyBkdXBsaWNhdGVzCi0JCS8vIGFsbCBhdHRyaWJ1dGVzL2luY2x1ZGVkIGF0dHJpYnV0ZXMgd2l0aCBYbWxFbGVtZW50L3MvUmVmL3MgbXVzdCBiZSBsaXN0ZWQKLQkJLy8gbm8gbm9uZXhpc3RlbnQgYXR0cmlidXRlcyAoYXR0cmlidXRlcyBtYXBwZWQgb3RoZXJ3aXNlIGFsbG93ZWQpIC4uLgotCQkvLyAqZXhjZXB0KiBubyB0cmFuc2llbnQgYXR0cmlidXRlcyBhbGxvd2VkCi0JCQotCQlCYWc8U3RyaW5nPiBwcm9wcyA9IENvbGxlY3Rpb25Ub29scy5iYWcoZ2V0UHJvcE9yZGVyKCkpOwotCQlTZXQ8U3RyaW5nPiBhbGxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlTZXQ8U3RyaW5nPiByZXF1aXJlZEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCVNldDxTdHJpbmc+IHRyYW5zaWVudEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQotCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGdldEFsbExvY2FsbHlEZWZpbmVkQXR0cmlidXRlcygpKSB7Ci0JCQlhbGxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCXRyYW5zaWVudEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQl9Ci0JCQotCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGdldEFsbExvY2FsbHlEZWZpbmVkQXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc1BhcnRpY2xlTWFwcGluZygpKSB7Ci0JCQkJcmVxdWlyZWRBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJCQotCQkJaWYgKCEgYXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc1RyYW5zaWVudCgpKSB7Ci0JCQkJLy8gcmVtb3ZlIHRyYW5zaWVudHMgKHJhdGhlciB0aGFuIHByZXZpb3VzIGFsZ29yaXRobSBvZiBhZGRpbmcgdGhlbSkKLQkJCQkvLyB0aGVyZSBtYXkgYmUgdHdvIGF0dHJpYnV0ZXMgb2YgdGhlIHNhbWUgbmFtZSAob25lIGZpZWxkLCBvbmUgcHJvcGVydHkpIGluIAotCQkJCS8vIGEgY2xhc3MsIHdoaWNoIGlzIGEgY29ycmVjdCBjb25maWd1cmF0aW9uLiAgd2Ugd2FudCB0byBrbm93IGlmICpldmVyeSogYXR0cmlidXRlIAotCQkJCS8vIG9mIGEgZ2l2ZW4gbmFtZSBpcyB0cmFuc2llbnQgKG9yIGlmIHRoZXJlJ3MgYSBzaW5nbGUgbm9uLXRyYW5zaWVudCBhdHRyaWJ1dGUpCi0JCQkJdHJhbnNpZW50QXR0cmlidXRlcy5yZW1vdmUoYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVNldDxJbnRlZ2VyPiBkdXBsaWNhdGVQcm9wcyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0JCVNldDxTdHJpbmc+IG1pc3NpbmdQcm9wcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4ocmVxdWlyZWRBdHRyaWJ1dGVzKTsKLQkJU2V0PEludGVnZXI+IG5vbmV4aXN0ZW50UHJvcHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotCQlTZXQ8SW50ZWdlcj4gdHJhbnNpZW50UHJvcHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOwotCQkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRQcm9wT3JkZXJTaXplKCk7IGkgKysgKSB7Ci0JCQlTdHJpbmcgcHJvcCA9IGdldFByb3AoaSk7Ci0JCQkKLQkJCWlmIChwcm9wcy5jb3VudChwcm9wKSA+IDEpIHsKLQkJCQlkdXBsaWNhdGVQcm9wcy5hZGQoaSk7Ci0JCQl9Ci0JCQkKLQkJCWlmIChtaXNzaW5nUHJvcHMuY29udGFpbnMocHJvcCkpIHsKLQkJCQltaXNzaW5nUHJvcHMucmVtb3ZlKHByb3ApOwotCQkJfQotCQkJCi0JCQlpZiAoISBhbGxBdHRyaWJ1dGVzLmNvbnRhaW5zKHByb3ApKSB7Ci0JCQkJbm9uZXhpc3RlbnRQcm9wcy5hZGQoaSk7Ci0JCQl9Ci0JCQkKLQkJCWlmICh0cmFuc2llbnRBdHRyaWJ1dGVzLmNvbnRhaW5zKHByb3ApKSB7Ci0JCQkJdHJhbnNpZW50UHJvcHMuYWRkKGkpOwotCQkJfQotCQl9Ci0JCQotCQlmb3IgKGludCBpIDogZHVwbGljYXRlUHJvcHMpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19EVVBMSUNBVEVfUFJPUCwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBnZXRQcm9wKGkpIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRQcm9wVGV4dFJhbmdlKGksIGFzdFJvb3QpKSk7Ci0JCX0KLQkJCi0JCWZvciAoU3RyaW5nIG1pc3NpbmdQcm9wIDogbWlzc2luZ1Byb3BzKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVFlQRV9fTUlTU0lOR19QUk9QLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IG1pc3NpbmdQcm9wIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRQcm9wT3JkZXJUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA6IG5vbmV4aXN0ZW50UHJvcHMpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19OT05FWElTVEVOVF9QUk9QLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldFByb3AoaSkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFByb3BUZXh0UmFuZ2UoaSwgYXN0Um9vdCkpKTsKLQkJfQotCQkKLQkJZm9yIChpbnQgaSA6IHRyYW5zaWVudFByb3BzKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVFlQRV9fVFJBTlNJRU5UX1BST1AsCi0JCQkJCQkJbmV3IFN0cmluZyBbXSB7IGdldFByb3AoaSkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFByb3BUZXh0UmFuZ2UoaSwgYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gbG9jYWxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkJCi0JCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQU5ZX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQlsb2NhbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BTllfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJCWFsbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChhbGxBdHRyaWJ1dGVzLnNpemUoKSA+IDEpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9BTllfQVRUUklCVVRFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVELAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCQotCQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhbnlBdHRyaWJ1dGUgOiBsb2NhbEF0dHJpYnV0ZXMpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0FOWV9BVFRSSUJVVEVfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQlhbnlBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYbWxBbnlFbGVtZW50TWFwcGluZyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBsb2NhbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQlsb2NhbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCQlhbGxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoYWxsQXR0cmlidXRlcy5zaXplKCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfQU5ZX0VMRU1FTlRfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQkJCi0JCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGFueUF0dHJpYnV0ZSA6IGxvY2FsQXR0cmlidXRlcykgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfQU5ZX0VMRU1FTlRfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQlhbnlBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYbWxWYWx1ZU1hcHBpbmcoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gbG9jYWxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCVNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYWxsQXR0cmlidXRlcyA9IG5ldyBIYXNoU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkJCi0JCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfVkFMVUVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQkJbG9jYWxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJCWFsbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZ2V0SW5oZXJpdGVkQXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfVkFMVUVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKGFsbEF0dHJpYnV0ZXMuc2l6ZSgpID4gMSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZBTFVFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVELAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCQotCQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhbnlBdHRyaWJ1dGUgOiBsb2NhbEF0dHJpYnV0ZXMpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZBTFVFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVELAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKSwKLQkJCQkJCWFueUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlWG1sSURzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBsb2NhbEF0dHJpYnV0ZXMgPSBuZXcgSGFzaFNldDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJU2V0PEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhbGxBdHRyaWJ1dGVzID0gbmV3IEhhc2hTZXQ8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmICgoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWQotCQkJCQl8fCBhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkKLQkJCQkJJiYgKChYbWxOYW1lZE5vZGVNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCQlsb2NhbEF0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZSk7Ci0JCQkJYWxsQXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBnZXRJbmhlcml0ZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmICgoYXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWQotCQkJCQl8fCBhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkKLQkJCQkJJiYgKChYbWxOYW1lZE5vZGVNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRYbWxJRCgpICE9IG51bGwpIHsKLQkJCQlhbGxBdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCQotCQlpZiAoYWxsQXR0cmlidXRlcy5zaXplKCkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSURfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQkJCi0JCQlmb3IgKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGFueUF0dHJpYnV0ZSA6IGxvY2FsQXR0cmlidXRlcykgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSURfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQsCi0JCQkJCQlhbnlBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLAotCQkJCQkJYW55QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRGYWN0b3J5Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHJlc3VsdCA9IGdldFhtbFR5cGVBbm5vdGF0aW9uKCkuZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHJlc3VsdCAhPSBudWxsKSA/IHJlc3VsdCA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RmFjdG9yeU1ldGhvZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgcmVzdWx0ID0gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRGYWN0b3J5TWV0aG9kVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHJlc3VsdCAhPSBudWxsKSA/IHJlc3VsdCA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0UHJvcE9yZGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSByZXN1bHQgPSBnZXRYbWxUeXBlQW5ub3RhdGlvbigpLmdldFByb3BPcmRlclRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuIChyZXN1bHQgIT0gbnVsbCkgPyByZXN1bHQgOiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFByb3BUZXh0UmFuZ2UoaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0WG1sVHlwZUFubm90YXRpb24oKS5nZXRQcm9wVGV4dFJhbmdlKGluZGV4LCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvcFRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKGdldFhtbFR5cGVBbm5vdGF0aW9uKCkucHJvcE9yZGVyVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGdldFhtbFR5cGVBbm5vdGF0aW9uKCkuZ2V0UHJvcE9yZGVyU2l6ZSgpOyBpICsrICkgewotCQkJCWlmIChnZXRYbWxUeXBlQW5ub3RhdGlvbigpLnByb3BUb3VjaGVzKGksIHBvcywgYXN0Um9vdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogeG1sIHByb3Agb3JkZXIgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFByb3BPcmRlckNvbnRhaW5lcgotCQkJZXh0ZW5kcyBMaXN0Q29udGFpbmVyPFN0cmluZywgU3RyaW5nPiB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gUFJPUF9PUkRFUl9MSVNUOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZENvbnRleHRFbGVtZW50KFN0cmluZyByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiByZXNvdXJjZUVsZW1lbnQ7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUNsYXNzTWFwcGluZy50aGlzLmdldFJlc291cmNlUHJvcE9yZGVyKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRWxlbWVudChTdHJpbmcgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTY5ZWU1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIHsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2Q7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBzY29wZTsKLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIHFOYW1lOwotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgc3Vic3RpdHV0aW9uSGVhZFFOYW1lOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kKFhtbFJlZ2lzdHJ5IHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VNZXRob2QgPSByZXNvdXJjZU1ldGhvZDsKLQkJdGhpcy5zY29wZSA9IGdldFJlc291cmNlU2NvcGUoKTsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkUU5hbWUgPSBidWlsZFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IHRoaXMuZ2V0UmVzb3VyY2VEZWZhdWx0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbEVsZW1lbnREZWNsUU5hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgYnVpbGRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgWG1sRWxlbWVudERlY2xTdWJzdGl0dXRpb25IZWFkUU5hbWUodGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxSZWdpc3RyeSBnZXRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIChYbWxSZWdpc3RyeSkgZ2V0UGFyZW50KCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0UmVzb3VyY2VNZXRob2QoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlTWV0aG9kOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIGdldFJlc291cmNlTWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXNldFNjb3BlXyhnZXRSZXNvdXJjZVNjb3BlKCkpOwotCQl0aGlzLnFOYW1lLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkUU5hbWUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzZXREZWZhdWx0VmFsdWVfKGdldFJlc291cmNlRGVmYXVsdFZhbHVlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnFOYW1lLnVwZGF0ZSgpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWRRTmFtZS51cGRhdGUoKTsKLQl9Ci0JCi0KLQkvLyAqKioqKiBKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgaW1wbCAqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZU1ldGhvZC5nZXROYW1lKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHNjb3BlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NvcGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNjb3BlXyhTdHJpbmcgc2NvcGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2NvcGU7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTQ09QRV9QUk9QRVJUWSwgb2xkLCBzY29wZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlnZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKS5zZXRTY29wZShzY29wZSk7Ci0JCXNldFNjb3BlXyhzY29wZSk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlU2NvcGUoKSB7Ci0JCXJldHVybiBnZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKS5nZXRTY29wZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2NvcGUoKSB7Ci0JCXJldHVybiAodGhpcy5zY29wZSA9PSBudWxsKSA/IERFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRSA6IGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpLmdldEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxTY29wZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRS5lcXVhbHMoZ2V0RnVsbHlRdWFsaWZpZWRTY29wZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcW5hbWUgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uIGhlYWQgcW5hbWUgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3Vic3RpdHV0aW9uSGVhZFFOYW1lOwotCX0KLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlXyhTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlnZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKS5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJc2V0RGVmYXVsdFZhbHVlXyhkZWZhdWx0VmFsdWUpOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZURlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpLmdldERlZmF1bHRWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMucU5hbWUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnN1YnN0aXR1dGlvbkhlYWRRTmFtZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWRRTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJaWYgKCEgSkFYQi5KQVhCX0VMRU1FTlQuZXF1YWxzKHJlc291cmNlTWV0aG9kLmdldFR5cGVOYW1lKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9ERUNMX19JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfUkVUVVJOX1RZUEUsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQkJaWYgKHJlc291cmNlTWV0aG9kLmdldFBhcmFtZXRlcnNTaXplKCkgIT0gMSB8fCAKLQkJCQkhIEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLCByZXNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlTmFtZSgwKSwgT2JqZWN0LmNsYXNzLmdldE5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9QQVJBTSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudERlY2xRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudERlY2xRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5ldyBRTmFtZUFubm90YXRpb25Qcm94eSgpKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmdldFJlZ2lzdHJ5KCkuZ2V0SmF4YkNsYXNzKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gdGhpcy5nZXRKYXhiUGFja2FnZSgpOwotCQkJcmV0dXJuIChqYXhiUGFja2FnZSA9PSBudWxsKSA/IG51bGwgOiBqYXhiUGFja2FnZS5nZXROYW1lc3BhY2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlpZiAoISBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuaXNHbG9iYWxTY29wZSgpKSB7Ci0JCQkJU3RyaW5nIGZxU2NvcGUgPSBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRTY29wZSgpOwotCQkJCUpheGJUeXBlTWFwcGluZyBzY29wZVR5cGVNYXBwaW5nID0gCi0JCQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuZ2V0SmF4YlByb2plY3QoKS5nZXRDb250ZXh0Um9vdCgpLmdldFR5cGVNYXBwaW5nKGZxU2NvcGUpOwotCQkJCWlmIChzY29wZVR5cGVNYXBwaW5nICE9IG51bGwpIHsKLQkJCQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IHNjb3BlVHlwZU1hcHBpbmcuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCQkJaWYgKHhzZFR5cGUgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIHhzZFR5cGUuZ2V0RWxlbWVudE5hbWVQcm9wb3NhbHMoZ2V0TmFtZXNwYWNlKCksIGZpbHRlciwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVhzZFNjaGVtYSB4c2RTY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHhzZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHhzZFNjaGVtYS5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsgCi0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlYc2RTY2hlbWEgeHNkU2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCXJldHVybiAoeHNkU2NoZW1hID09IG51bGwpID8gRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkgOiB4c2RTY2hlbWEuZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YkNvcmVNZXNzYWdlcy5YTUxfRUxFTUVOVF9ERVNDOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWZlcmVuY2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCWlmICghIEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5pc0dsb2JhbFNjb3BlKCkpIHsKLQkJCQlTdHJpbmcgZnFTY29wZSA9IEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRGdWxseVF1YWxpZmllZFNjb3BlKCk7Ci0JCQkJSmF4YlR5cGVNYXBwaW5nIHNjb3BlVHlwZU1hcHBpbmcgPSAKLQkJCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRKYXhiUHJvamVjdCgpLmdldENvbnRleHRSb290KCkuZ2V0VHlwZU1hcHBpbmcoZnFTY29wZSk7Ci0JCQkJaWYgKHNjb3BlVHlwZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gc2NvcGVUeXBlTWFwcGluZy5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkJCQlpZiAoeHNkVHlwZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICh4c2RUeXBlLmdldEVsZW1lbnQoZ2V0TmFtZXNwYWNlKCksIGdldE5hbWUoKSwgdHJ1ZSkgPT0gbnVsbCkgewotCQkJCQkJbWVzc2FnZXMuYWRkKGdldFVucmVzb2x2ZVNjaGVtYUNvbXBvbmVudE1lc3NhZ2UoYXN0Um9vdCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJWHNkU2NoZW1hIHhzZFNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQkJaWYgKHhzZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJCWlmICh4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9uKGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkpID09IG51bGwpIHsKLQkJCQkJCW1lc3NhZ2VzLmFkZChnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUU5hbWVBbm5vdGF0aW9uUHJveHkgCi0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVFOYW1lLkFic3RyYWN0UU5hbWVBbm5vdGF0aW9uUHJveHkgewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBRTmFtZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRYbWxFbGVtZW50RGVjbEFubm90YXRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudERlY2xTdWJzdGl0dXRpb25IZWFkUU5hbWUKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnREZWNsU3Vic3RpdHV0aW9uSGVhZFFOYW1lKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmV3IFN1YnN0aXR1dGlvbkhlYWRRTmFtZUFubm90YXRpb25Qcm94eSgpKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZC50aGlzLmdldFJlZ2lzdHJ5KCkuZ2V0SmF4YkNsYXNzKCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlID0gdGhpcy5nZXRKYXhiUGFja2FnZSgpOwotCQkJcmV0dXJuIChqYXhiUGFja2FnZSA9PSBudWxsKSA/IG51bGwgOiBqYXhiUGFja2FnZS5nZXROYW1lc3BhY2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlTdHJpbmcgZnFTY29wZSA9IEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRGdWxseVF1YWxpZmllZFNjb3BlKCk7Ci0JCQlKYXhiVHlwZU1hcHBpbmcgc2NvcGVUeXBlTWFwcGluZyA9IAotCQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuZ2V0SmF4YlByb2plY3QoKS5nZXRDb250ZXh0Um9vdCgpLmdldFR5cGVNYXBwaW5nKGZxU2NvcGUpOwotCQkJaWYgKHNjb3BlVHlwZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBzY29wZVR5cGVNYXBwaW5nLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQkJaWYgKHhzZFR5cGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4geHNkVHlwZS5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCVhzZFNjaGVtYSB4c2RTY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHhzZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHhzZFNjaGVtYS5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsgCi0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlYc2RTY2hlbWEgeHNkU2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCXJldHVybiAoeHNkU2NoZW1hID09IG51bGwpID8gRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkgOiB4c2RTY2hlbWEuZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YkNvcmVNZXNzYWdlcy5TVUJTVElUVVRJT05fSEVBRF9ERVNDOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBuZWVkIHRvIGlnbm9yZSB0aGUgdW5zcGVjaWZpZWQgKG51bGwpIGNhc2UKLQkJCWlmICgiIi5lcXVhbHMoZ2V0TmFtZSgpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlFOQU1FX19NSVNTSU5HX05BTUUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSB9LAotCQkJCQkJCQl0aGlzLAotCQkJCQkJCQlnZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0TmFtZSgpKSkgewotCQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChnZXROYW1lKCksIEdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2QudGhpcy5nZXRRTmFtZSgpLmdldE5hbWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OQU1FX0VRVUFMU19OQU1FLAotCQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJCWdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVmZXJlbmNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlYc2RTY2hlbWEgeHNkU2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCWlmICh4c2RTY2hlbWEgIT0gbnVsbCkgewotCQkJCWlmICh4c2RTY2hlbWEuZ2V0RWxlbWVudERlY2xhcmF0aW9uKGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkpID09IG51bGwpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKGdldFVucmVzb2x2ZVNjaGVtYUNvbXBvbmVudE1lc3NhZ2UoYXN0Um9vdCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJZm9yIChKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudERlY2wgOiBHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuZ2V0UmVnaXN0cnkoKS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSkgewotCQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChnZXROYW1lKCksIGVsZW1lbnREZWNsLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLmdldE5hbWUoKSkKLQkJCQkJCSYmIFRvb2xzLnZhbHVlc0FyZUVxdWFsKGdldE5hbWVzcGFjZSgpLCBlbGVtZW50RGVjbC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lc3BhY2UoKSkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX0RFQ0xfX1NVQlNUX0hFQURfTk9fTUFUQ0hJTkdfRUxFTUVOVF9ERUNMLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgU3Vic3RpdHV0aW9uSGVhZFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJaW1wbGVtZW50cyBBYnN0cmFjdEphdmFRTmFtZS5Bbm5vdGF0aW9uUHJveHkgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIAlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kLnRoaXMuZ2V0WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCQlyZXR1cm4gYW5ub3RhdGlvbiA9PSBudWxsID8gbnVsbCA6IGFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5ld1NwZWNpZmllZE5hbWVzcGFjZSkgewotCQkJZ2V0QW5ub3RhdGlvbigpLnNldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UobmV3U3BlY2lmaWVkTmFtZXNwYWNlKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBmYWxzZSA6IGFubm90YXRpb24uc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpOwotCQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZVRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCQlyZXR1cm4gYW5ub3RhdGlvbiA9PSBudWxsID8gbnVsbCA6IGFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3U3BlY2lmaWVkTmFtZSkgewotCQkJZ2V0QW5ub3RhdGlvbigpLnNldFN1YnN0aXR1dGlvbkhlYWROYW1lKG5ld1NwZWNpZmllZE5hbWUpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBmYWxzZSA6IGFubm90YXRpb24uc3Vic3RpdHV0aW9uSGVhZE5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZVRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1Db25zdGFudC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bUNvbnN0YW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OWVlNDUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bUNvbnN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRW51bVZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbnVtQ29uc3RhbnQKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEpheGJFbnVtQ29uc3RhbnQgewotCi0JZmluYWwgcHJvdGVjdGVkIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCByZXNvdXJjZUVudW1Db25zdGFudDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFZhbHVlOwotCi0JcHVibGljIEdlbmVyaWNKYXZhRW51bUNvbnN0YW50KEpheGJFbnVtTWFwcGluZyBwYXJlbnQsIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCByZXNvdXJjZUVudW1Db25zdGFudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlRW51bUNvbnN0YW50ID0gcmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWUgPSB0aGlzLmdldFJlc291cmNlRW51bVZhbHVlKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBKYXhiRW51bU1hcHBpbmcgZ2V0RW51bU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF4YkVudW1NYXBwaW5nKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZUVudW1Db25zdGFudCBnZXRSZXNvdXJjZUVudW1Db25zdGFudCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVmFsdWVfKHRoaXMuZ2V0UmVzb3VyY2VFbnVtVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHhtbCBlbnVtIHZhbHVlIGFubm90YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFhtbEVudW1WYWx1ZUFubm90YXRpb24gZ2V0WG1sRW51bVZhbHVlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlRW51bUNvbnN0YW50KCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUVudW1Db25zdGFudC5nZXROYW1lKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRWYWx1ZSgpICE9IG51bGwgPyB0aGlzLmdldFNwZWNpZmllZFZhbHVlKCkgOiB0aGlzLmdldERlZmF1bHRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuZ2V0WG1sRW51bVZhbHVlQW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRWYWx1ZV8odmFsdWUpOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFZhbHVlOwotCQl0aGlzLnNwZWNpZmllZFZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VFbnVtVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEVudW1WYWx1ZUFubm90YXRpb24oKS5nZXRWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh2YWx1ZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJWHNkVHlwZURlZmluaXRpb248Pz4geHNkVHlwZSA9IGdldEVudW1NYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCWlmICh4c2RUeXBlICE9IG51bGwgJiYgeHNkVHlwZS5nZXRLaW5kKCkgPT0gWHNkVHlwZURlZmluaXRpb24uS2luZC5TSU1QTEUpIHsKLQkJCQlYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RTaW1wbGVUeXBlID0gKFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RUeXBlOwotCQkJCXJldHVybiB4c2RTaW1wbGVUeXBlLmdldEVudW1WYWx1ZVByb3Bvc2FscyhmaWx0ZXIpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldFhtbEVudW1WYWx1ZUFubm90YXRpb24oKS52YWx1ZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlTdHJpbmcgdmFsdWUgPSBnZXRWYWx1ZSgpOwotCQlYc2RUeXBlRGVmaW5pdGlvbjw/PiB4c2RUeXBlID0gZ2V0RW51bU1hcHBpbmcoKS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkKLQkJaWYgKHhzZFR5cGUgPT0gbnVsbCB8fCB4c2RUeXBlLmdldEtpbmQoKSAhPSBYc2RUeXBlRGVmaW5pdGlvbi5LaW5kLlNJTVBMRSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoISAoKFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RUeXBlKS5nZXRYU0RDb21wb25lbnQoKS5pc1ZhbGlkTGl0ZXJhbCh2YWx1ZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTlVNX1ZBTFVFX19JTlZBTElEX0xFWElDQUxfVkFMVUUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgdmFsdWUsIHhzZFR5cGUuZ2V0TmFtZSgpIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWx1ZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0UmVzb3VyY2VFbnVtQ29uc3RhbnQoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIGVudW1WYWx1ZVRleHRSYW5nZSA9IGdldFhtbEVudW1WYWx1ZUFubm90YXRpb24oKS5nZXRWYWx1ZVRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuIGVudW1WYWx1ZVRleHRSYW5nZSAhPSBudWxsID8gZW51bVZhbHVlVGV4dFJhbmdlIDogZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2NGU1My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVudW1NYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcKLQkJaW1wbGVtZW50cyBKYXhiRW51bU1hcHBpbmcgewotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkWG1sRW51bVZhbHVlOwotCi0JcHJvdGVjdGVkIGZpbmFsIEVudW1Db25zdGFudENvbnRhaW5lciBlbnVtQ29uc3RhbnRDb250YWluZXI7Ci0KLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFFbnVtTWFwcGluZyhKYXhiRW51bSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5lbnVtQ29uc3RhbnRDb250YWluZXIgPSBuZXcgRW51bUNvbnN0YW50Q29udGFpbmVyKCk7Ci0JCQotCQlpbml0WG1sRW51bVZhbHVlKCk7Ci0JCWluaXRFbnVtQ29uc3RhbnRzKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUmVzb3VyY2VFbnVtIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiAoSmF2YVJlc291cmNlRW51bSkgc3VwZXIuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN5bmMvdXBkYXRlICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxFbnVtVmFsdWUoKTsKLQkJc3luY0VudW1Db25zdGFudHMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdXBkYXRlRW51bUNvbnN0YW50cygpOwotCX0KLQkKLQotCS8vICoqKioqIFhtbEVudW0udmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVudW1WYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFhtbEVudW1WYWx1ZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkWG1sRW51bVZhbHVlIDogREVGQVVMVF9YTUxfRU5VTV9WQUxVRTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFhtbEVudW1WYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKFN0cmluZyB4bWxFbnVtVmFsdWUpIHsKLQkJZ2V0WG1sRW51bUFubm90YXRpb24oKS5zZXRWYWx1ZSh4bWxFbnVtVmFsdWUpOwotCQlzZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWVfKHhtbEVudW1WYWx1ZSk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWVfKFN0cmluZyB4bWxFbnVtVmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkWG1sRW51bVZhbHVlOwotCQl0aGlzLnNwZWNpZmllZFhtbEVudW1WYWx1ZSA9IHhtbEVudW1WYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfWE1MX0VOVU1fVkFMVUVfUFJPUEVSVFksIG9sZCwgeG1sRW51bVZhbHVlKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFhtbEVudW1WYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFhtbEVudW1WYWx1ZSAhPSBudWxsKSA/IAotCQkJCWdldFhtbEVudW1Bbm5vdGF0aW9uKCkuZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpCi0JCQkJOiBERUZBVUxUX1hNTF9FTlVNX1ZBTFVFOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRW51bUFubm90YXRpb24gZ2V0WG1sRW51bUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRW51bUFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVhtbEVudW1WYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFhtbEVudW1Bbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbEVudW1WYWx1ZSgpIHsKLQkJdGhpcy5zcGVjaWZpZWRYbWxFbnVtVmFsdWUgPSBnZXRSZXNvdXJjZVhtbEVudW1WYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sRW51bVZhbHVlKCkgewotCQlzZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWVfKGdldFJlc291cmNlWG1sRW51bVZhbHVlKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBlbnVtIGNvbnN0YW50cyAqKioqKgotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiRW51bUNvbnN0YW50PiBnZXRFbnVtQ29uc3RhbnRzKCkgewotCQlyZXR1cm4gdGhpcy5lbnVtQ29uc3RhbnRDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0RW51bUNvbnN0YW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVudW1Db25zdGFudENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRFbnVtQ29uc3RhbnRzKCkgewotCQl0aGlzLmVudW1Db25zdGFudENvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNFbnVtQ29uc3RhbnRzKCkgewotCQl0aGlzLmVudW1Db25zdGFudENvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVudW1Db25zdGFudHMoKSB7Ci0JCXRoaXMuZW51bUNvbnN0YW50Q29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiBnZXRSZXNvdXJjZUVudW1Db25zdGFudHMoKSB7Ci0JCXJldHVybiBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0RW51bUNvbnN0YW50cygpOwotCX0KLQkKLQlwcml2YXRlIEpheGJFbnVtQ29uc3RhbnQgYnVpbGRFbnVtQ29uc3RhbnQoSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHJlc291cmNlRW51bUNvbnN0YW50KSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KCkuYnVpbGRKYXZhRW51bUNvbnN0YW50KHRoaXMsIHJlc291cmNlRW51bUNvbnN0YW50KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5vblRyYW5zaWVudFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZFhtbEVudW1WYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCXN1cGVyLmdldE5vblRyYW5zaWVudFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSwKLQkJCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZShnZXRGdWxseVF1YWxpZmllZFhtbEVudW1WYWx1ZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldE5vblRyYW5zaWVudFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQl9Ci0JCi0JcHVibGljIFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldFZhbHVlWHNkVHlwZURlZmluaXRpb24oKSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRWYWx1ZVhzZFR5cGVEZWZpbml0aW9uXygpOwotCQlpZiAoeHNkVHlwZSA9PSBudWxsIHx8IHhzZFR5cGUuZ2V0S2luZCgpICE9IFhzZFR5cGVEZWZpbml0aW9uLktpbmQuU0lNUExFKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSB4c2RUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgWHNkVHlwZURlZmluaXRpb24gZ2V0VmFsdWVYc2RUeXBlRGVmaW5pdGlvbl8oKSB7Ci0JCVN0cmluZyBmcVhtbEVudW1WYWx1ZSA9IGdldEZ1bGx5UXVhbGlmaWVkWG1sRW51bVZhbHVlKCk7Ci0JCQotCQlKYXhiVHlwZSBqYXhiVHlwZSA9IGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcVhtbEVudW1WYWx1ZSk7Ci0JCWlmIChqYXhiVHlwZSAhPSBudWxsKSB7Ci0JCQlKYXhiVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSBqYXhiVHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCXJldHVybiB0eXBlTWFwcGluZy5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHR5cGVNYXBwaW5nID0gZ2V0SmF4YlByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLmdldERlZmluaXRpb24oKS5nZXRTY2hlbWFUeXBlTWFwcGluZyhmcVhtbEVudW1WYWx1ZSk7Ci0JCQlpZiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCVhzZFNjaGVtYSB4c2RTY2hlbWEgPSBYc2RVdGlsLmdldFNjaGVtYUZvclNjaGVtYSgpOwotCQkJCXJldHVybiB4c2RTY2hlbWEuZ2V0VHlwZURlZmluaXRpb24odHlwZU1hcHBpbmcpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlmb3IgKEpheGJFbnVtQ29uc3RhbnQgY29uc3RhbnQgOiBnZXRFbnVtQ29uc3RhbnRzKCkpIHsKLQkJCXJlc3VsdCA9IGNvbnN0YW50LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXZhbGlkYXRlWG1sVHlwZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl2YWxpZGF0ZVhtbEVudW0obWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWZvciAoSmF4YkVudW1Db25zdGFudCBjb25zdGFudCA6IGdldEVudW1Db25zdGFudHMoKSkgewotCQkJY29uc3RhbnQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbFR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJWG1sVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFR5cGVBbm5vdGF0aW9uKCk7Ci0JCQotCQlpZiAoYW5ub3RhdGlvbi5nZXRGYWN0b3J5Q2xhc3MoKSAhPSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9UWVBFX19GQUNUT1JZX0NMQVNTX0lHTk9SRURfRk9SX0VOVU0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlhbm5vdGF0aW9uLmdldEZhY3RvcnlDbGFzc1RleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQlpZiAoYW5ub3RhdGlvbi5nZXRGYWN0b3J5TWV0aG9kKCkgIT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVFlQRV9fRkFDVE9SWV9NRVRIT0RfSUdOT1JFRF9GT1JfRU5VTSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZFRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShhbm5vdGF0aW9uLmdldFByb3BPcmRlcigpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVFlQRV9fUFJPUF9PUkRFUl9JR05PUkVEX0ZPUl9FTlVNLAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJYW5ub3RhdGlvbi5nZXRQcm9wT3JkZXJUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbEVudW0oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJWHNkU2NoZW1hIHhzZFNjaGVtYSA9IGdldEpheGJQYWNrYWdlKCkuZ2V0WHNkU2NoZW1hKCk7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRWYWx1ZVhzZFR5cGVEZWZpbml0aW9uXygpOwotCQkKLQkJaWYgKCh4c2RTY2hlbWEgIT0gbnVsbCAmJiB4c2RUeXBlID09IG51bGwpCi0JCQkJfHwgKHhzZFR5cGUgIT0gbnVsbCAmJiB4c2RUeXBlLmdldEtpbmQoKSAhPSBYc2RUeXBlRGVmaW5pdGlvbi5LaW5kLlNJTVBMRSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTlVNX19OT05fU0lNUExFX1NDSEVNQV9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldEZ1bGx5UXVhbGlmaWVkWG1sRW51bVZhbHVlKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFhtbEVudW1WYWx1ZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sRW51bVZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRYbWxFbnVtQW5ub3RhdGlvbigpLmdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBlbnVtIGNvbnN0YW50IGNvbnRhaW5lciBhZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEVudW1Db25zdGFudENvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcjxKYXhiRW51bUNvbnN0YW50LCBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBFTlVNX0NPTlNUQU5UU19DT0xMRUNUSU9OOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpheGJFbnVtQ29uc3RhbnQgYnVpbGRDb250ZXh0RWxlbWVudChKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFFbnVtTWFwcGluZy50aGlzLmJ1aWxkRW51bUNvbnN0YW50KHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlRW51bUNvbnN0YW50PiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhRW51bU1hcHBpbmcudGhpcy5nZXRSZXNvdXJjZUVudW1Db25zdGFudHMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQgZ2V0UmVzb3VyY2VFbGVtZW50KEpheGJFbnVtQ29uc3RhbnQgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRSZXNvdXJjZUVudW1Db25zdGFudCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSmF4YkNsYXNzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKYXhiQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhMGE5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKYXhiQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSZWdpc3RyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSmF4YkNsYXNzCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZSAKLQkJaW1wbGVtZW50cyBKYXhiQ2xhc3MgewotCQotCXByb3RlY3RlZCBYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeTsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFKYXhiQ2xhc3MoSmF4YkNvbnRleHROb2RlIHBhcmVudCwgSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZVR5cGUpOwotCQlpbml0WG1sUmVnaXN0cnkoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VUeXBlKSBzdXBlci5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBKYXhiVHlwZS5LaW5kLkNMQVNTOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbFJlZ2lzdHJ5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbFJlZ2lzdHJ5KCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1hcHBpbmcgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNsYXNzTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gKEpheGJDbGFzc01hcHBpbmcpIHN1cGVyLmdldE1hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJDbGFzc01hcHBpbmcgYnVpbGRNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0RmFjdG9yeSgpLmJ1aWxkSmF4YkNsYXNzTWFwcGluZyh0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTcGVjaWZpZWRNYXBwZWQoKSB7Ci0JCXJldHVybiBnZXRYbWxUeXBlQW5ub3RhdGlvbigpICE9IG51bGwKLQkJCQl8fCBnZXRYbWxSb290RWxlbWVudEFubm90YXRpb24oKSAhPSBudWxsCi0JCQkJfHwgZ2V0WG1sVHJhbnNpZW50QW5ub3RhdGlvbigpICE9IG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFJlZ2lzdHJ5ICoqKioqCi0JCi0JcHVibGljIFhtbFJlZ2lzdHJ5IGdldFhtbFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gdGhpcy54bWxSZWdpc3RyeTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sUmVnaXN0cnlfKFhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5KSB7Ci0JCVhtbFJlZ2lzdHJ5IG9sZCA9IHRoaXMueG1sUmVnaXN0cnk7Ci0JCXRoaXMueG1sUmVnaXN0cnkgPSB4bWxSZWdpc3RyeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfUkVHSVNUUllfUFJPUEVSVFksIG9sZCwgeG1sUmVnaXN0cnkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUmVnaXN0cnlBbm5vdGF0aW9uIGdldFhtbFJlZ2lzdHJ5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxSZWdpc3RyeUFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JFR0lTVFJZKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFJlZ2lzdHJ5IGJ1aWxkWG1sUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KCkuYnVpbGRYbWxSZWdpc3RyeSh0aGlzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbFJlZ2lzdHJ5KCkgewotCQlpZiAoZ2V0WG1sUmVnaXN0cnlBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxSZWdpc3RyeSA9IGJ1aWxkWG1sUmVnaXN0cnkoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sUmVnaXN0cnkoKSB7Ci0JCVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sUmVnaXN0cnlBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbFJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbFJlZ2lzdHJ5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbFJlZ2lzdHJ5XyhidWlsZFhtbFJlZ2lzdHJ5KCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMueG1sUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJc2V0WG1sUmVnaXN0cnlfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbFJlZ2lzdHJ5KCkgewotCQlpZiAodGhpcy54bWxSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbFJlZ2lzdHJ5LnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sUmVnaXN0cnkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxSZWdpc3RyeS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSmF4YkVudW0uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUpheGJFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjUzODcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSmF4YkVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFKYXhiRW51bQotCQlleHRlbmRzIEFic3RyYWN0SmF2YVR5cGUKLQkJaW1wbGVtZW50cyBKYXhiRW51bSB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhSmF4YkVudW0oSmF4YkNvbnRleHROb2RlIHBhcmVudCwgSmF2YVJlc291cmNlRW51bSByZXNvdXJjZVR5cGUpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZVR5cGUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlc291cmNlRW51bSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZUVudW0pIHN1cGVyLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIEtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEpheGJUeXBlLktpbmQuRU5VTTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWFwcGluZyAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiRW51bU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXhiRW51bU1hcHBpbmcpIHN1cGVyLmdldE1hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJFbnVtTWFwcGluZyBidWlsZE1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRGYWN0b3J5KCkuYnVpbGRKYXhiRW51bU1hcHBpbmcodGhpcyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzU3BlY2lmaWVkTWFwcGVkKCkgewotCQlyZXR1cm4gc3VwZXIuaXNTcGVjaWZpZWRNYXBwZWQoKSAKLQkJCQl8fCBnZXRYbWxFbnVtQW5ub3RhdGlvbigpICE9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbnVtQW5ub3RhdGlvbiBnZXRYbWxFbnVtQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbnVtQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MGQ4ODguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxBbm5vdGF0aW9uPiB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlSW5mby5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4Y2MyZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVBhY2thZ2VJbmZvCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXhiUGFja2FnZUluZm8gewotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlOwotCi0JcHJvdGVjdGVkIGZpbmFsIFhtbFNjaGVtYSB4bWxTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3NUeXBlOwotCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIHNwZWNpZmllZEFjY2Vzc09yZGVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPFhtbFNjaGVtYVR5cGUsIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uPiB4bWxTY2hlbWFUeXBlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPFhtbEphdmFUeXBlQWRhcHRlciwgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4geG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyOwotCi0JcHVibGljIEdlbmVyaWNKYXZhUGFja2FnZUluZm8oSmF4YlBhY2thZ2UgcGFyZW50LCBKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlUGFja2FnZSA9IHJlc291cmNlUGFja2FnZTsKLQkJdGhpcy54bWxTY2hlbWEgPSBnZXRGYWN0b3J5KCkuYnVpbGRKYXZhWG1sU2NoZW1hKHRoaXMpOwotCQl0aGlzLnNwZWNpZmllZEFjY2Vzc1R5cGUgPSBnZXRSZXNvdXJjZUFjY2Vzc1R5cGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlciA9IGdldFJlc291cmNlQWNjZXNzT3JkZXIoKTsKLQkJdGhpcy54bWxTY2hlbWFUeXBlQ29udGFpbmVyID0gdGhpcy5idWlsZFhtbFNjaGVtYVR5cGVDb250YWluZXIoKTsKLQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIgPSB0aGlzLmJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIChKYXhiUGFja2FnZSkgZ2V0UGFyZW50KCk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKioqKioqKiBBYnN0cmFjdEpheGJOb2RlIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQYWNrYWdlLmdldEZpbGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy54bWxTY2hlbWEuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc1R5cGVfKHRoaXMuZ2V0UmVzb3VyY2VBY2Nlc3NUeXBlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc09yZGVyXyh0aGlzLmdldFJlc291cmNlQWNjZXNzT3JkZXIoKSk7Ci0JCXRoaXMuc3luY1htbFNjaGVtYVR5cGVzKCk7Ci0JCXRoaXMuc3luY1htbEphdmFUeXBlQWRhcHRlcnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnhtbFNjaGVtYS51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVYbWxTY2hlbWFUeXBlcygpOwotCQl0aGlzLnVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF4YlBhY2thZ2VJbmZvIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQYWNrYWdlIGdldFJlc291cmNlUGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VQYWNrYWdlOwotCX0KLQotCS8vICoqKioqKioqKiogeG1sIHNjaGVtYSAqKioqKioqKioqCi0KLQlwdWJsaWMgWG1sU2NoZW1hIGdldFhtbFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sU2NoZW1hOwotCX0KLQotCS8vICoqKioqKioqKiogYWNjZXNzIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0QWNjZXNzVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2Vzc1R5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEFjY2Vzc1R5cGUgOiB0aGlzLmdldERlZmF1bHRBY2Nlc3NUeXBlKCk7Ci0JfQotCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlIGFjY2VzcykgewotCQl0aGlzLmdldEFjY2Vzc29yVHlwZUFubm90YXRpb24oKS5zZXRWYWx1ZShYbWxBY2Nlc3NUeXBlLnRvSmF2YVJlc291cmNlTW9kZWwoYWNjZXNzKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzVHlwZV8oYWNjZXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NUeXBlXyhYbWxBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlYbWxBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NUeXBlID0gYWNjZXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FDQ0VTU19UWVBFX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7Ci0JfQotCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVI7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxBY2Nlc3NUeXBlIGdldFJlc291cmNlQWNjZXNzVHlwZSgpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc1R5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0QWNjZXNzb3JUeXBlQW5ub3RhdGlvbigpLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIGdldEFjY2Vzc29yVHlwZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBhY2thZ2UuZ2V0Tm9uTnVsbEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2VzcyBvcmRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0QWNjZXNzT3JkZXIoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlciAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXIgOiB0aGlzLmdldERlZmF1bHRBY2Nlc3NPcmRlcigpOwotCX0KLQotCXB1YmxpYyBYbWxBY2Nlc3NPcmRlciBnZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzT3JkZXI7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2Vzc09yZGVyKFhtbEFjY2Vzc09yZGVyIGFjY2Vzc09yZGVyKSB7Ci0JCXRoaXMuZ2V0QWNjZXNzb3JPcmRlckFubm90YXRpb24oKS5zZXRWYWx1ZShYbWxBY2Nlc3NPcmRlci50b0phdmFSZXNvdXJjZU1vZGVsKGFjY2Vzc09yZGVyKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXJfKGFjY2Vzc09yZGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcl8oWG1sQWNjZXNzT3JkZXIgYWNjZXNzT3JkZXIpIHsKLQkJWG1sQWNjZXNzT3JkZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlcjsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3NPcmRlciA9IGFjY2Vzc09yZGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FDQ0VTU19PUkRFUl9QUk9QRVJUWSwgb2xkLCBhY2Nlc3NPcmRlcik7Ci0JfQotCi0JcHVibGljIFhtbEFjY2Vzc09yZGVyIGdldERlZmF1bHRBY2Nlc3NPcmRlcigpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc09yZGVyIGdldFJlc291cmNlQWNjZXNzT3JkZXIoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NPcmRlci5mcm9tSmF2YVJlc291cmNlTW9kZWwodGhpcy5nZXRBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbigpLmdldFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiBnZXRBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVBhY2thZ2UuZ2V0Tm9uTnVsbEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB4bWwgc2NoZW1hIHR5cGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sU2NoZW1hVHlwZT4gZ2V0WG1sU2NoZW1hVHlwZXMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFNjaGVtYVR5cGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTY2hlbWFUeXBlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFNjaGVtYVR5cGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBYbWxTY2hlbWFUeXBlIGFkZFhtbFNjaGVtYVR5cGUoaW50IGluZGV4KSB7Ci0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHRoaXMucmVzb3VyY2VQYWNrYWdlLmFkZEFubm90YXRpb24oaW5kZXgsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJcmV0dXJuIHRoaXMueG1sU2NoZW1hVHlwZUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sU2NoZW1hVHlwZShYbWxTY2hlbWFUeXBlIHhtbFNjaGVtYVR5cGUpIHsKLQkJdGhpcy5yZW1vdmVYbWxTY2hlbWFUeXBlKHRoaXMueG1sU2NoZW1hVHlwZUNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sU2NoZW1hVHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoaW50IGluZGV4KSB7Ci0JCXRoaXMucmVzb3VyY2VQYWNrYWdlLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJdGhpcy54bWxTY2hlbWFUeXBlQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlWG1sU2NoZW1hVHlwZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnJlc291cmNlUGFja2FnZS5tb3ZlQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJdGhpcy54bWxTY2hlbWFUeXBlQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxTY2hlbWFUeXBlIGJ1aWxkWG1sU2NoZW1hVHlwZShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiB4bWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGFja2FnZVhtbFNjaGVtYVR5cGUodGhpcywgeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxTY2hlbWFUeXBlcygpIHsKLQkJdGhpcy54bWxTY2hlbWFUeXBlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxTY2hlbWFUeXBlcygpIHsKLQkJdGhpcy54bWxTY2hlbWFUeXBlQ29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sU2NoZW1hVHlwZUFubm90YXRpb24+IGdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgWG1sU2NoZW1hVHlwZUFubm90YXRpb24+KAotCQkJCXRoaXMucmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb25zKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPFhtbFNjaGVtYVR5cGUsIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uPiBidWlsZFhtbFNjaGVtYVR5cGVDb250YWluZXIoKSB7Ci0JCVhtbFNjaGVtYVR5cGVDb250YWluZXIgY29udGFpbmVyID0gbmV3IFhtbFNjaGVtYVR5cGVDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogeG1sIGphdmEgdHlwZSBhZGFwdGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbEphdmFUeXBlQWRhcHRlcj4gZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpIHsKLQkJcmV0dXJuIHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sSmF2YVR5cGVBZGFwdGVyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIFhtbEphdmFUeXBlQWRhcHRlciBhZGRYbWxKYXZhVHlwZUFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSB0aGlzLnJlc291cmNlUGFja2FnZS5hZGRBbm5vdGF0aW9uKGluZGV4LCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCXJldHVybiB0aGlzLnhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKFhtbEphdmFUeXBlQWRhcHRlciB4bWxTY2hlbWFUeXBlKSB7Ci0JCXRoaXMucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKHRoaXMueG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCh4bWxTY2hlbWFUeXBlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKGludCBpbmRleCkgewotCQl0aGlzLnJlc291cmNlUGFja2FnZS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCXRoaXMueG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMucmVzb3VyY2VQYWNrYWdlLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyIGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24geG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlcih0aGlzLCB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXJzKCkgewotCQl0aGlzLnhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sSmF2YVR5cGVBZGFwdGVycygpIHsKLQkJdGhpcy54bWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4gZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+KAotCQkJCXRoaXMucmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb25zKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPFhtbEphdmFUeXBlQWRhcHRlciwgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4gYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXJDb250YWluZXIoKSB7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgWG1sSmF2YVR5cGVBZGFwdGVyQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCXB1YmxpYyBYbWxKYXZhVHlwZUFkYXB0ZXIgZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKFN0cmluZyBib3VuZFR5cGVOYW1lKSB7Ci0JCWZvciAoWG1sSmF2YVR5cGVBZGFwdGVyIGFkYXB0ZXIgOiBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCkpIHsKLQkJCWlmIChib3VuZFR5cGVOYW1lLmVxdWFscyhhZGFwdGVyLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKioqKioqKiBtaXNjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGFja2FnZS5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5idWlsZEFTVFJvb3QoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLy9UaGlzIGRvZXNuJ3QgYWN0dWFsbHkgd29yayB5ZXQgYmVjYXVzZSBvZiBKRFQgYnVnIChidWdzLmVjbGlwc2Uub3JnLzMyNjYxMCkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5yZWZyZXNoU2NoZW1hKGdldEpheGJQYWNrYWdlKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMueG1sU2NoZW1hLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQkJCi0JCWZvciAoWG1sU2NoZW1hVHlwZSB4bWxTY2hlbWFUeXBlIDogdGhpcy5nZXRYbWxTY2hlbWFUeXBlcygpKSB7Ci0JCQlyZXN1bHQgPSB4bWxTY2hlbWFUeXBlLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlUGFja2FnZS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLnJlc291cmNlUGFja2FnZS5nZXRGaWxlKCk7Ci0JCS8vICdmaWxlJyB3aWxsIGJlIG51bGwgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgYmluYXJ5OwotCQkvLyB0aGUgZmlsZSB3aWxsIGJlIGluIGEgZGlmZmVyZW50IHByb2plY3QgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgc291cmNlOwotCQkvLyB0aGUgdHlwZSB3aWxsIGJlIGJpbmFyeSBpZiBpdCBpcyBpbiBhIEpBUiBpbiB0aGUgY3VycmVudCBwcm9qZWN0Ci0JCWlmICgoZmlsZSAhPSBudWxsKSAKLQkJCQkmJiBmaWxlLmdldFByb2plY3QoKS5lcXVhbHMoZ2V0SmF4YlByb2plY3QoKS5nZXRQcm9qZWN0KCkpIAotCQkJCSYmICh0aGlzLnJlc291cmNlUGFja2FnZSBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpKSB7Ci0JCQkvLyBidWlsZCB0aGUgQVNUIHJvb3QgaGVyZSB0byBwYXNzIGRvd24KLQkJCXRoaXMudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCB0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl0aGlzLnhtbFNjaGVtYS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgOiBnZXRYbWxTY2hlbWFUeXBlcygpKSB7Ci0JCQlzY2hlbWFUeXBlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJCi0JCWZvciAoWG1sSmF2YVR5cGVBZGFwdGVyIGFkYXB0ZXIgOiBnZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCkpIHsKLQkJCWFkYXB0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogeG1sIHNjaGVtYSB0eXBlIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBYbWxTY2hlbWFUeXBlQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8WG1sU2NoZW1hVHlwZSwgWG1sU2NoZW1hVHlwZUFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gWE1MX1NDSEVNQV9UWVBFU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sU2NoZW1hVHlwZSBidWlsZENvbnRleHRFbGVtZW50KFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUGFja2FnZUluZm8udGhpcy5idWlsZFhtbFNjaGVtYVR5cGUocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVBhY2thZ2VJbmZvLnRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoWG1sU2NoZW1hVHlwZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB4bWwgamF2YSB0eXBlIGFkYXB0ZXIgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEphdmFUeXBlQWRhcHRlckNvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxKYXZhVHlwZUFkYXB0ZXIsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBYTUxfSkFWQV9UWVBFX0FEQVBURVJTX0xJU1Q7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sSmF2YVR5cGVBZGFwdGVyIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVBhY2thZ2VJbmZvLnRoaXMuYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXIocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVBhY2thZ2VJbmZvLnRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ZWU5ZTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlcgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhWG1sSmF2YVR5cGVBZGFwdGVyCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyKEpheGJQYWNrYWdlSW5mbyBwYXJlbnQsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gcmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUeXBlKCkgewotCQkvL3RoZXJlIGlzIG5vIGRlZmF1bHQgdHlwZSBvbiBhIHBhY2thZ2UgbGV2ZWwgWG1sSmF2YVR5cGVBZGFwdGVyLCBpdCBtdXN0IGJlIHNwZWNpZmllZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQlpZiAoZ2V0U3BlY2lmaWVkVHlwZSgpID09IG51bGwgfHwgZ2V0U3BlY2lmaWVkVHlwZSgpLmVxdWFscyhYbWxKYXZhVHlwZUFkYXB0ZXIuREVGQVVMVF9UWVBFKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlBBQ0tBR0VfWE1MX0pBVkFfVFlQRV9BREFQVEVSX1RZUEVfTk9UX1NQRUNJRklFRCwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0QW5ub3RhdGlvbigpLmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbFNjaGVtYVR5cGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBhY2thZ2VYbWxTY2hlbWFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NDgwMTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbFNjaGVtYVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVBhY2thZ2VYbWxTY2hlbWFUeXBlCi0JZXh0ZW5kcyBHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGUKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVBhY2thZ2VYbWxTY2hlbWFUeXBlKEpheGJQYWNrYWdlSW5mbyBwYXJlbnQsIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUGFja2FnZUluZm8gZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJQYWNrYWdlSW5mbykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJQYWNrYWdlSW5mbyBnZXRKYXhiUGFja2FnZUluZm8oKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiUGFja2FnZUluZm8oKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCVN0cmluZyBmcVR5cGUgPSBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJaWYgKGZxVHlwZSA9PSBudWxsIHx8IFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uLkRFRkFVTFRfVFlQRS5lcXVhbHMoZnFUeXBlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1NDSEVNQV9UWVBFX19UWVBFX05PVF9TUEVDSUZJRURfT05fUEFDS0FHRSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBjMjY4Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgewotCQotCXByb3RlY3RlZCBmaW5hbCBBY2Nlc3NvciBhY2Nlc3NvcjsKLQkKLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZzsgIC8vIG5ldmVyIG51bGwKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRNYXBwaW5nS2V5OwotCQotCQotCQotCXB1YmxpYyBzdGF0aWMgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRQZXJzaXN0ZW50UHJvcGVydHkoCi0JCUpheGJDbGFzc01hcHBpbmcgcGFyZW50LAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgKLQkJCQlwYXJlbnQsIG5ldyBQcm9wZXJ0eUFjY2Vzc29yKHBhcmVudCwgcmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFBlcnNpc3RlbnRGaWVsZCgKLQkJSmF4YkNsYXNzTWFwcGluZyBwYXJlbnQsCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoCi0JCQkJcGFyZW50LCBuZXcgRmllbGRBY2Nlc3NvcihwYXJlbnQsIHJlc291cmNlRmllbGQpKTsKLQl9Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgQWNjZXNzb3IgYWNjZXNzb3IpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yOwotCQkvLyBrZWVwIG5vbi1udWxsIGF0IGFsbCB0aW1lcwotCQl0aGlzLm1hcHBpbmcgPSB0aGlzLmJ1aWxkTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBKYXhiQ2xhc3NNYXBwaW5nIGdldENsYXNzTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXhiQ2xhc3NNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNNYXBwaW5nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTWFwcGluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBkZWNsYXJpbmcgY2xhc3MvIGluaGVyaXRhbmNlICoqKioqCi0JCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0RGVjbGFyaW5nSmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXNzb3IuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW5oZXJpdGVkKCkgewotCQlyZXR1cm4gZ2V0RGVjbGFyaW5nSmF2YVJlc291cmNlVHlwZSgpICE9IGdldENsYXNzTWFwcGluZygpLmdldEpheGJUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JfQotCQotCQotCS8vICoqKioqIGFjY2Vzc29yICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3Nvci5pc0ZvcihyZXNvdXJjZUZpZWxkKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcikgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3Nvci5pc0ZvcihyZXNvdXJjZUdldHRlciwgcmVzb3VyY2VTZXR0ZXIpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3Nvci5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3Nvci5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlVHlwZVN1YlR5cGVPZihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYWNjZXNzb3IuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVUeXBlU3ViVHlwZU9mKHR5cGVOYW1lKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBtYXBwaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIENsaWVudHMgZG8gbm90IHNldCB0aGUgbWFwcGluZyBkaXJlY3RseS4KLQkgKiBAc2VlICNzZXRNYXBwaW5nS2V5KFN0cmluZykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nKEpheGJBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJSmF4YkF0dHJpYnV0ZU1hcHBpbmcgb2xkID0gdGhpcy5tYXBwaW5nOwotCQl0aGlzLm1hcHBpbmcgPSBtYXBwaW5nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUElOR19QUk9QRVJUWSwgb2xkLCBtYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0S2V5KCk7Ci0JfQotCi0JLyoqCi0JICogUG9zc2libGUgdHJhbnNpdGlvbnM6Ci0JICogPHRhYmxlIGJvcmRlcj4KLQkgKiA8dGg+Ci0JICogPHRoPm51bGwgbWFwcGluZy9kZWZhdWx0PGJyPgotCSAqICAgICA8Y29kZT5rZXkgPSBudWxsPC9jb2RlPgotCSAqIDx0aD5zcGVjaWZpZWQgbWFwcGluZyBBPGJyPgotCSAqICAgICA8Y29kZT5rZXkgPSAiQSI8L2NvZGU+Ci0JICogPHRoPnNwZWNpZmllZCBtYXBwaW5nIEI8YnI+Ci0JICogICAgIDxjb2RlPmtleSA9ICJCIjwvY29kZT4KLQkgKiA8dHI+Ci0JICogPHRoPltkZWZhdWx0XSBudWxsIG1hcHBpbmcKLQkgKiAgIDx0ZD5kbyBub3RoaW5nCi0JICogICA8dGQ+YWRkIGFubm90YXRpb24gQTxicj4KLQkgKiAgICAgICBzZXQgbmV3IG1hcHBpbmcgQQotCSAqICAgPHRkPmFkZCBhbm5vdGF0aW9uIEI8YnI+Ci0JICogICAgICAgc2V0IG5ldyBtYXBwaW5nIEIKLQkgKiA8dHI+Ci0JICogPHRoPmRlZmF1bHQgbWFwcGluZyBBCi0JICogICA8dGQ+ZG8gbm90aGluZwotCSAqICAgPHRkPmFkZCBhbm5vdGF0aW9uIEE8YnI+Ci0JICogICAgICAgPGVtPnJlLXVzZTwvZW0+IGRlZmF1bHQgbWFwcGluZyBBCi0JICogICA8dGQ+YWRkIGFubm90YXRpb24gQjxicj4KLQkgKiAgICAgICBzZXQgbmV3IG1hcHBpbmcgQgotCSAqIDx0cj4KLQkgKiA8dGg+c3BlY2lmaWVkIG1hcHBpbmcgQQotCSAqICAgPHRkPnJlbW92ZSBhbm5vdGF0aW9uIEE8YnI+Ci0JICogICAgICAgc2V0IG5ldyBkZWZhdWx0IG9yIG51bGwgbWFwcGluZwotCSAqICAgPHRkPmRvIG5vdGhpbmcKLQkgKiAgIDx0ZD5yZW1vdmUgYW5ub3RhdGlvbiBBPGJyPgotCSAqICAgICAgIGFkZCBhbm5vdGF0aW9uIEI8YnI+Ci0JICogICAgICAgc2V0IG5ldyBtYXBwaW5nIEIKLQkgKiA8L3RhYmxlPgotCSAqIFRoZSAiZG8gbm90aGluZyIgdHJhbnNpdGlvbnMgYXJlIGhhbmRsZWQgaW4gdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIHNldE1hcHBpbmdLZXkoU3RyaW5nIGtleSkgewotCQlpZiAodGhpcy5tYXBwaW5nLmlzRGVmYXVsdCgpKSB7Ci0JCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCQkvLyBsZWF2ZSB0aGUgZGVmYXVsdCBtYXBwaW5nIHVuY2hhbmdlZAotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldE1hcHBpbmdLZXlfKGtleSk7ICAvLyByZXBsYWNlIHRoZSBkZWZhdWx0IG1hcHBpbmcKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGtleSwgdGhpcy5tYXBwaW5nLmdldEtleSgpKSkgewotCQkJCS8vIGxlYXZlIHRoZSBzcGVjaWZpZWQgbWFwcGluZyB1bmNoYW5nZWQKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRNYXBwaW5nS2V5XyhrZXkpOyAgLy8gcmVwbGFjZSB0aGUgc3BlY2lmaWVkIG1hcHBpbmcKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIFdlIGhhdmUgZWl0aGVyOjx1bD4KLQkgKiA8bGk+YSA8ZW0+ZGVmYXVsdDwvZW0+IG1hcHBpbmcgYW5kIGEgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGtleQotCSAqIDwvdWw+b3I8dWw+Ci0JICogPGxpPmEgPGVtPnNwZWNpZmllZDwvZW0+IG1hcHBpbmcgYW5kIGEgZGlmZmVyZW50IChwb3NzaWJseQotCSAqICAgICA8Y29kZT5udWxsPC9jb2RlPikga2V5Ci0JICogPC91bD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nS2V5XyhTdHJpbmcga2V5KSB7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gdGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbihrZXkpOwotCQlpZiAoZGVmaW5pdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBvdXIgbWFwcGluZyBpcyAic3BlY2lmaWVkIiBhbmQgdGhlIGtleSBpcyBudWxsOwotCQkJLy8gY2hlY2sgZm9yIGEgZGVmYXVsdCBkZWZpbml0aW9uCi0JCQlkZWZpbml0aW9uID0gdGhpcy5nZXREZWZhdWx0TWFwcGluZ0RlZmluaXRpb24oKTsKLQkJCUl0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcyA9IChkZWZpbml0aW9uICE9IG51bGwpID8gZGVmaW5pdGlvbi5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQkJCS8vIGNsZWFyIGFueSBtYXBwaW5nIGFubm90YXRpb24ocyk7Ci0JCQkvLyBsZWF2ZSB0aGUgImRlZmF1bHQiIG1hcHBpbmcncyBzdXBwb3J0aW5nIGFubm90YXRpb25zOwotCQkJLy8gaWYgdGhlcmUgaXMgbm8gImRlZmF1bHQiIG1hcHBpbmcsIGNsZWFyIGFsbCBzdXBwb3J0aW5nIGFubm90YXRpb25zIHRvbyg/KQotCQkJdGhpcy5zZXRNYXBwaW5nQW5ub3RhdGlvbihudWxsLCBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0TWFwcGluZ0Fubm90YXRpb24oZGVmaW5pdGlvbik7Ci0JCX0KLQkJLy8gbm90ZTogJ2RlZmluaXRpb24nIGNhbiBzdGlsbCBiZSBudWxsIChpZiB0aGUga2V5IGlzIG51bGwgYW5kIHRoZXJlIGlzIG5vICJkZWZhdWx0IiBtYXBwaW5nKQotCQl0aGlzLnNldE1hcHBpbmcodGhpcy5idWlsZE1hcHBpbmcoZGVmaW5pdGlvbikpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IGRlZmluaXRpb24gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGluZ0Fubm90YXRpb24oSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJdGhpcy5zZXRNYXBwaW5nQW5ub3RhdGlvbihkZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCksIGRlZmluaXRpb24uZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nQW5ub3RhdGlvbihTdHJpbmcgcHJpbWFyeUFubm90YXRpb25OYW1lLCBJdGVyYWJsZTxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5zZXRQcmltYXJ5QW5ub3RhdGlvbihwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJcmV0dXJuIChkZWZpbml0aW9uID09IG51bGwpID8gdGhpcy5idWlsZE51bGxNYXBwaW5nKCkgOiB0aGlzLmJ1aWxkTWFwcGluZ18oZGVmaW5pdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTnVsbE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldEZhY3RvcnkoKS5idWlsZEphdmFOdWxsQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBkZWZpbml0aW9uIGlzIG5vdCBudWxsCi0JICogPHA+Ci0JICogSWYgd2UgYXJlIGNvbnZlcnRpbmcgYSA8ZW0+ZGVmYXVsdDwvZW0+IG1hcHBpbmcgdG8gaXRzIDxlbT5zcGVjaWZpZWQ8L2VtPgotCSAqIG1hbmlmZXN0YXRpb24sIHdlIGp1c3Qga2VlcCB0aGUgc2FtZSBtYXBwaW5nIGFuZCBjcmVhdGUgaXRzIGFubm90YXRpb24uCi0JICogV2UgZG8gPGVtPm5vdDwvZW0+IGRvIHRoZSBzYW1lIHRoaW5nIHdoZW4gY29udmVydGluZyBhIDxlbT5zcGVjaWZpZWQ8L2VtPgotCSAqIG1hcHBpbmcgdG8gaXRzIDxlbT5kZWZhdWx0PC9lbT4gbWFuaWZlc3RhdGlvbi4gV2UgcmVidWlsZCB0aGUKLQkgKiBlbnRpcmUgbWFwcGluZywgc2ltcGxpZnlpbmcgdGhlIGNsZWFyaW5nIG9mIGFsbCBpdHMgc3RhdGUuIFdlIGRvIHRoaXMKLQkgKiBiZWNhdXNlIHdlIGFsbG93IGNsaWVudHMgdG8gbW9kaWZ5IGEgPGVtPmRlZmF1bHQ8L2VtPiBtYXBwaW5nIChvciBhbnkgb2YKLQkgKiBpdHMgY29tcG9uZW50cykgZGlyZWN0bHksCi0JICogbW9kaWZ5aW5nIGl0cyBzdGF0ZSBhbmQgdHJpZ2dlcmluZyBhIGNvbnZlcnNpb24gdG8gYSA8ZW0+c3BlY2lmaWVkPC9lbT4KLQkgKiBtYXBwaW5nLiBUaGUgb25seSB3YXkgdG8gY29udmVydCBhIDxlbT5zcGVjaWZpZWQ8L2VtPiBtYXBwaW5nIHRvIGEKLQkgKiA8ZW0+ZGVmYXVsdDwvZW0+IG1hcHBpbmcgaXMgYnkge0BsaW5rICNzZXRNYXBwaW5nS2V5KFN0cmluZykgc2V0dGluZyB0aGUKLQkgKiBtYXBwaW5nIGtleX0gdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZ18oSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJLy8gJ21hcHBpbmcnIGlzIG51bGwgZHVyaW5nIGNvbnN0cnVjdGlvbgotCQlpZiAoKHRoaXMubWFwcGluZyAhPSBudWxsKSAmJiB0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkgJiYgVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5tYXBwaW5nLmdldEtleSgpLCBkZWZpbml0aW9uLmdldEtleSgpKSkgewotCQkJdGhpcy5tYXBwaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsgIC8vIHRoZSBtYXBwaW5nIGluc3RhbmNlIGhhc24ndCBjaGFuZ2VkLCBidXQgc29tZSByZXNvdXJjZSBkaWZmZXJlbmNlcyBtYXkgaGF2ZSByZXN1bHRlZAotCQkJcmV0dXJuIHRoaXMubWFwcGluZzsKLQkJfQotCQlyZXR1cm4gZGVmaW5pdGlvbi5idWlsZE1hcHBpbmcodGhpcywgdGhpcy5nZXRGYWN0b3J5KCkpOwotCX0KLQotCS8qKgotCSAqIFdlIG9ubHkgbG9vayBmb3IgYSA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZyBoZXJlLgotCSAqIFdlIGxvb2sgZm9yIGEgZGVmYXVsdCBtYXBwaW5nIGR1cmluZyA8ZW0+dXBkYXRlPC9lbT4uCi0JICovCi0JcHJvdGVjdGVkIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRNYXBwaW5nKHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogTG9vayBmb3IgYSA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZyBhbmQgc3luYyBvdXIgbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jTWFwcGluZygpIHsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gPSB0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCWlmIChkZWZpbml0aW9uID09IG51bGwpIHsKLQkJCWlmICh0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkpIHsKLQkJCQkvLyBudWxsL2RlZmF1bHQgPT4gbnVsbC9kZWZhdWx0Ci0JCQkJdGhpcy5tYXBwaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc3BlY2lmaWVkID0+IG51bGwvZGVmYXVsdAotCQkJCWRlZmluaXRpb24gPSB0aGlzLmdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbigpOwotCQkJCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZyhkZWZpbml0aW9uKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5tYXBwaW5nLmlzRGVmYXVsdCgpKSB7Ci0JCQkJLy8gbnVsbC9kZWZhdWx0ID0+IHNwZWNpZmllZAotCQkJCS8vICh3aWxsIG5vdCBjaGFuZ2UgbWFwcGluZyBpbnN0YW5jZSBpZiBrZXlzIGFyZSB0aGUgc2FtZSwgYnV0IHdpbGwgc3luYyB0aGUgbWFwcGluZykKLQkJCQl0aGlzLnNldE1hcHBpbmcodGhpcy5idWlsZE1hcHBpbmcoZGVmaW5pdGlvbikpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzcGVjaWZpZWQgPT4gc3BlY2lmaWVkCi0JCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgdGhpcy5tYXBwaW5nLmdldEtleSgpKSkgewotCQkJCQl0aGlzLm1hcHBpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZyhkZWZpbml0aW9uKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAic3BlY2lmaWVkIiBtYXBwaW5nIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQga2V5LgotCSAqLwotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb24oU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiB0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwga2V5KSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgbWFwcGluZyBrZXk6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGRlZmluaXRpb24gZm9yIHRoZSBtYXBwaW5nIGN1cnJlbnRseSBzcGVjaWZpZWQgaW4gdGhlCi0JICogc291cmNlIGNvZGUuCi0JICovCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJZm9yIChKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCWlmIChkZWZpbml0aW9uLmlzU3BlY2lmaWVkKHRoaXMpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybSgpLmdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBtYXBwaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNYXBwaW5nS2V5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNYXBwaW5nS2V5KFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRNYXBwaW5nS2V5OwotCQl0aGlzLmRlZmF1bHRNYXBwaW5nS2V5ID0gbWFwcGluZ0tleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTUFQUElOR19LRVlfUFJPUEVSVFksIG9sZCwgbWFwcGluZ0tleSk7Ci0JfQotCi0JLyoqCi0JICogSWYgYSBtYXBwaW5nIGFubm90YXRpb24gaXMgc3BlY2lmaWVkLCB3ZSB3b3VsZCBoYXZlIGFscmVhZHkgc2V0IGEKLQkgKiA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZyBpbiB7QGxpbmsgI3N5bmNNYXBwaW5nKCl9LiBXZSBuZWVkIG9ubHkgY2hlY2sKLQkgKiBmb3IgY2hhbmdlcyB0byB0aGUgPGVtPmRlZmF1bHQ8L2VtPiBtYXBwaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1hcHBpbmcoKSB7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gdGhpcy5nZXREZWZhdWx0TWFwcGluZ0RlZmluaXRpb24oKTsKLQkJU3RyaW5nIG5ld0RlZmF1bHRLZXkgPSAoZGVmaW5pdGlvbiA9PSBudWxsKSA/IG51bGwgOiBkZWZpbml0aW9uLmdldEtleSgpOwotCQlpZiAodGhpcy5tYXBwaW5nLmlzRGVmYXVsdCgpICYmIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLm1hcHBpbmcuZ2V0S2V5KCksIG5ld0RlZmF1bHRLZXkpKSB7Ci0JCQl0aGlzLnNldE1hcHBpbmcodGhpcy5idWlsZE1hcHBpbmcoZGVmaW5pdGlvbikpOyAgLy8gdGhlIGRlZmF1bHQgbWFwcGluZyBoYXMgY2hhbmdlZAotCQl9IGVsc2UgewotCQkJdGhpcy5tYXBwaW5nLnVwZGF0ZSgpOwotCQl9Ci0JCXRoaXMuc2V0RGVmYXVsdE1hcHBpbmdLZXkobmV3RGVmYXVsdEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWZhdWx0TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCWZvciAoRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogdGhpcy5nZXREZWZhdWx0TWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCWlmIChkZWZpbml0aW9uLmlzRGVmYXVsdCh0aGlzKSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXREZWZhdWx0TWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybSgpLmdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCS8vICoqKioqKioqKioqKioqKiogY29udGVudCBhc3Npc3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy5tYXBwaW5nLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJLy8gdmFsaWRhdGUgdGhhdCB1bnN1cHBvcnRlZCBhbm5vdGF0aW9ucyBhcmUgbm90IHByZXNlbnQKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGN1cnJlbnRNYXBwaW5nRGVmaW5pdGlvbiA9IGdldEN1cnJlbnRNYXBwaW5nRGVmaW5pdGlvbigpOwotCQlJdGVyYWJsZTxTdHJpbmc+IHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMgPSBjdXJyZW50TWFwcGluZ0RlZmluaXRpb24uZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpOwotCQkKLQkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbGxBbm5vdGF0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KGN1cnJlbnRNYXBwaW5nRGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLCBhbm5vdGF0aW9uLmdldEFubm90YXRpb25OYW1lKCkpCi0JCQkJCSYmICEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMsIGFubm90YXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5BVFRSSUJVVEVfTUFQUElOR19fVU5TVVBQT1JURURfQU5OT1RBVElPTiwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLCBjdXJyZW50TWFwcGluZ0RlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSB9LAotCQkJCQkJCQl0aGlzLAotCQkJCQkJCQlhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQl9Ci0JCQotCQl0aGlzLmdldE1hcHBpbmcoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldEN1cnJlbnRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJSXRlcmFibGU8PyBleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gbWFwcGluZ0RlZmluaXRpb25zID0gCi0JCQkJKHRoaXMubWFwcGluZy5pc0RlZmF1bHQoKSkgPyAKLQkJCQkJCWdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbnMoKQotCQkJCQkJOiBnZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQkJCi0JCWZvciAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIG1hcHBpbmdEZWZpbml0aW9uIDogbWFwcGluZ0RlZmluaXRpb25zKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwobWFwcGluZ0RlZmluaXRpb24uZ2V0S2V5KCksIHRoaXMubWFwcGluZy5nZXRLZXkoKSkpIHsKLQkJCQlyZXR1cm4gbWFwcGluZ0RlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhODc0Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YVhtbEphdmFUeXBlQWRhcHRlcgotewotCi0JcHVibGljIEdlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlcihKYXhiVHlwZSBwYXJlbnQsIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gcmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJUeXBlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXhiVHlwZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0eXBlICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFR5cGUoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQWRhcHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFkYjMwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEFkYXB0ZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbEFkYXB0ZXIgewotCQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGJvdW5kVHlwZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlVHlwZTsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxBZGFwdGVyKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotCQlpbml0Qm91bmRBbmRWYWx1ZVR5cGVzKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogb3ZlcnJpZGVzICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlLmdldEZpbGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0Qm91bmRBbmRWYWx1ZVR5cGVzKCkgewotCQlTdHJpbmdbXSB0eXBlcyA9IGZpbmRCb3VuZEFuZFZhbHVlVHlwZXMoZ2V0SmF2YVJlc291cmNlVHlwZSgpKTsKLQkJdGhpcy5ib3VuZFR5cGUgPSB0eXBlc1swXTsKLQkJdGhpcy52YWx1ZVR5cGUgPSB0eXBlc1sxXTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJLy8gdGhlc2UgYXJlIGluIHVwZGF0ZSwgc2luY2UgdGhlaXIgdmFsdWVzIG1heSBkZXBlbmQgb24gb3RoZXIgY2xhc3NlcwotCQl1cGRhdGVCb3VuZEFuZFZhbHVlVHlwZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQm91bmRBbmRWYWx1ZVR5cGVzKCkgewotCQlTdHJpbmdbXSB0eXBlcyA9IGZpbmRCb3VuZEFuZFZhbHVlVHlwZXMoZ2V0SmF2YVJlc291cmNlVHlwZSgpKTsKLQkJc2V0Qm91bmRUeXBlXyh0eXBlc1swXSk7Ci0JCXNldFZhbHVlVHlwZV8odHlwZXNbMV0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZmluZEJvdW5kQW5kVmFsdWVUeXBlcyhKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlVHlwZS5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChNQVJTSEFMX01FVEhPRF9OQU1FLmVxdWFscyhyZXNvdXJjZU1ldGhvZC5nZXROYW1lKCkpICYmIHJlc291cmNlTWV0aG9kLmdldFBhcmFtZXRlcnNTaXplKCkgPT0gMSkgewotCQkJCVN0cmluZyB2YWx1ZVR5cGUgPSByZXNvdXJjZU1ldGhvZC5nZXRUeXBlTmFtZSgpOwotCQkJCVN0cmluZyBib3VuZFR5cGUgPSByZXNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlTmFtZSgwKTsKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgYm91bmRUeXBlLCB2YWx1ZVR5cGUgfTsKLQkJCX0KLQkJfQotCQkKLQkJU3RyaW5nIHN1cGVyUmVzb3VyY2VUeXBlTmFtZSA9IHJlc291cmNlVHlwZS5nZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpOwotCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHN1cGVyUmVzb3VyY2VUeXBlTmFtZSkpIHsKLQkJCUphdmFSZXNvdXJjZVR5cGUgc3VwZXJSZXNvdXJjZVR5cGUgCi0JCQkJCT0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShzdXBlclJlc291cmNlVHlwZU5hbWUsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5LaW5kLlRZUEUpOwotCQkJaWYgKHN1cGVyUmVzb3VyY2VUeXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZmluZEJvdW5kQW5kVmFsdWVUeXBlcyhzdXBlclJlc291cmNlVHlwZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVN0cmluZyBvYmplY3RUeXBlTmFtZSA9IE9iamVjdC5jbGFzcy5nZXROYW1lKCk7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyBvYmplY3RUeXBlTmFtZSwgb2JqZWN0VHlwZU5hbWUgfTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogYm91bmQgdHlwZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Qm91bmRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5ib3VuZFR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEJvdW5kVHlwZV8oU3RyaW5nIG5ld1R5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSB0aGlzLmJvdW5kVHlwZTsKLQkJdGhpcy5ib3VuZFR5cGUgPSBuZXdUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEJPVU5EX1RZUEVfUFJPUEVSVFksIG9sZFR5cGUsIG5ld1R5cGUpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWx1ZSB0eXBlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlVHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVUeXBlXyhTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHRoaXMudmFsdWVUeXBlOwotCQl0aGlzLnZhbHVlVHlwZSA9IG5ld1R5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfVFlQRV9QUk9QRVJUWSwgb2xkVHlwZSwgbmV3VHlwZSk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5NGI0Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbj4KLQkJaW1wbGVtZW50cyBYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpbml0aWFsaXplWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0FOWV9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQU5ZX0FUVFJJQlVURTsKLQl9Ci0JCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKCEgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzSmF2YVJlc291cmNlQXR0cmlidXRlVHlwZVN1YlR5cGVPZihNYXAuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9BTllfQVRUUklCVVRFX19OT05fTUFQX1RZUEUsCi0JCQkJCXRoaXMsCi0JCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDY4ZTMxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFueUVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE1peGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQW55RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTWl4ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQWRhcHRhYmxlQXR0cmlidXRlTWFwcGluZzxYbWxBbnlFbGVtZW50QW5ub3RhdGlvbj4KLQkJaW1wbGVtZW50cyBYbWxBbnlFbGVtZW50TWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTGF4OwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVmFsdWU7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFhtbEVsZW1lbnRSZWZzIHhtbEVsZW1lbnRSZWZzOwotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciB4bWxFbGVtZW50V3JhcHBlcjsKLQkKLQlwcm90ZWN0ZWQgWG1sTWl4ZWQgeG1sTWl4ZWQ7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkTGF4ID0gYnVpbGRTcGVjaWZpZWRMYXgoKTsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZSA9IGdldFJlc291cmNlVmFsdWVTdHJpbmcoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcyA9IGJ1aWxkWG1sRWxlbWVudFJlZnMoKTsKLQkJaW5pdGlhbGl6ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCWluaXRpYWxpemVYbWxNaXhlZCgpOwkJCQotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BTllfRUxFTUVOVDsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXNldFNwZWNpZmllZExheF8oYnVpbGRTcGVjaWZpZWRMYXgoKSk7Ci0JCXNldFNwZWNpZmllZFZhbHVlXyhnZXRSZXNvdXJjZVZhbHVlU3RyaW5nKCkpOwotCQl0aGlzLnhtbEVsZW1lbnRSZWZzLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXN5bmNYbWxNaXhlZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnhtbEVsZW1lbnRSZWZzLnVwZGF0ZSgpOwotCQl1cGRhdGVYbWxFbGVtZW50V3JhcHBlcigpOwotCQl1cGRhdGVYbWxNaXhlZCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBsYXggKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0xheCgpIHsKLQkJcmV0dXJuIChnZXRTcGVjaWZpZWRMYXgoKSA9PSBudWxsKSA/IGlzRGVmYXVsdExheCgpIDogZ2V0U3BlY2lmaWVkTGF4KCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZExheCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGF4OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMYXgoQm9vbGVhbiBuZXdTcGVjaWZpZWRMYXgpIHsKLQkJZ2V0T3JDcmVhdGVBbm5vdGF0aW9uKCkuc2V0TGF4KG5ld1NwZWNpZmllZExheCk7Ci0JCXNldFNwZWNpZmllZExheF8obmV3U3BlY2lmaWVkTGF4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGF4XyhCb29sZWFuIG5ld1NwZWNpZmllZExheCkgewotCQlCb29sZWFuIG9sZExheCA9IHRoaXMuc3BlY2lmaWVkTGF4OwotCQl0aGlzLnNwZWNpZmllZExheCA9IG5ld1NwZWNpZmllZExheDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTEFYX1BST1BFUlRZLCBvbGRMYXgsIG5ld1NwZWNpZmllZExheCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkTGF4KCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldExheCgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRMYXgoKSB7Ci0JCXJldHVybiBERUZBVUxUX0xBWDsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkVmFsdWUoKSA9PSBudWxsID8gZ2V0RGVmYXVsdFZhbHVlKCkgOiBnZXRTcGVjaWZpZWRWYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVmFsdWUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWdldE9yQ3JlYXRlQW5ub3RhdGlvbigpLnNldFZhbHVlKGxvY2F0aW9uKTsKLQkJc2V0U3BlY2lmaWVkVmFsdWVfKGxvY2F0aW9uKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFZhbHVlXyhTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZSA9IHR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlVmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1ZBTFVFOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50UmVmcyAqKioqKgotCQotCXB1YmxpYyBYbWxFbGVtZW50UmVmcyBnZXRYbWxFbGVtZW50UmVmcygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnM7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmcyBidWlsZFhtbEVsZW1lbnRSZWZzKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnModGhpcywgbmV3IFhtbEVsZW1lbnRSZWZzQ29udGV4dCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFdyYXBwZXIgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxFbGVtZW50V3JhcHBlcl8oWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIpIHsKLQkJWG1sRWxlbWVudFdyYXBwZXIgb2xkWG1sRWxlbWVudFdyYXBwZXIgPSB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyOwotCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID0geG1sRWxlbWVudFdyYXBwZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX0VMRU1FTlRfV1JBUFBFUl9QUk9QRVJUWSwgb2xkWG1sRWxlbWVudFdyYXBwZXIsIHhtbEVsZW1lbnRXcmFwcGVyKTsKLQl9Ci0JCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGFkZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlYbWxFbGVtZW50V3JhcHBlciB4bWxFbGVtZW50V3JhcHBlciA9IGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKHhtbEVsZW1lbnRXcmFwcGVyKTsKLQkJcmV0dXJuIHhtbEVsZW1lbnRXcmFwcGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlcih0aGlzLCBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlci5TaW1wbGVDb250ZXh0KGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sTWl4ZWQgKioqKioKLQkKLQlwdWJsaWMgWG1sTWl4ZWQgZ2V0WG1sTWl4ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1peGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxNaXhlZF8oWG1sTWl4ZWQgeG1sTWl4ZWQpIHsKLQkJWG1sTWl4ZWQgb2xkWG1sTWl4ZWQgPSB0aGlzLnhtbE1peGVkOwotCQl0aGlzLnhtbE1peGVkID0geG1sTWl4ZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX01JWEVEX1BST1BFUlRZLCBvbGRYbWxNaXhlZCwgeG1sTWl4ZWQpOwotCX0KLQkKLQlwdWJsaWMgWG1sTWl4ZWQgYWRkWG1sTWl4ZWQoKSB7Ci0JCWlmICh0aGlzLnhtbE1peGVkICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQkKLQkJWG1sTWl4ZWQgeG1sTWl4ZWQgPSBidWlsZFhtbE1peGVkKGFubm90YXRpb24pOwotCQlzZXRYbWxNaXhlZF8oeG1sTWl4ZWQpOwotCQlyZXR1cm4geG1sTWl4ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCXNldFhtbE1peGVkXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkQW5ub3RhdGlvbiBnZXRYbWxNaXhlZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sTWl4ZWRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkIGJ1aWxkWG1sTWl4ZWQoWG1sTWl4ZWRBbm5vdGF0aW9uIHhtbE1peGVkQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sTWl4ZWQodGhpcywgeG1sTWl4ZWRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbE1peGVkKCkgewotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbE1peGVkQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkID0gYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sTWl4ZWQoKSB7Ci0JCVhtbE1peGVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sTWl4ZWRBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbE1peGVkICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbE1peGVkLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbE1peGVkXyhidWlsZFhtbE1peGVkKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbE1peGVkXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxNaXhlZCgpIHsKLQkJaWYgKHRoaXMueG1sTWl4ZWQgIT0gbnVsbCkgewotCQkJdGhpcy54bWxNaXhlZC51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnMuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFJlZnMuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXRoaXMueG1sRWxlbWVudFJlZnMudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmIChnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUykgIT0gbnVsbCkgewotCQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAKLQkJCQkJKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuQVRUUklCVVRFX01BUFBJTkdfX1VOU1VQUE9SVEVEX0FOTk9UQVRJT04sCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IEpBWEIuWE1MX0VMRU1FTlRfUkVGLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMgfSwKLQkJCQkJCQkJZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLAotCQkJCQkJCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRSZWZzQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzLkNvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkgewotCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYWRkWG1sRWxlbWVudFJlZkFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCkgewotCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbnMoKSB7Ci0JCQlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24geG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4geG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQl9Ci0JCQkKLQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiB4bWxFbGVtZW50UmVmc0Fubm90YXRpb24uYWRkWG1sRWxlbWVudFJlZihpbmRleCk7Ci0JCQl9Ci0JCQkKLQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKGluZGV4ID4gMSkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGluZGV4KSk7Ci0JCQkJfQotCQkJCXhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IGFkZFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbigpOwotCQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weSA9IHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5hZGRYbWxFbGVtZW50UmVmKDApOwotCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXROYW1lKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQkJeG1sRWxlbWVudFJlZkFubm90YXRpb25Db3B5LnNldE5hbWVzcGFjZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCQkJeG1sRWxlbWVudFJlZkFubm90YXRpb25Db3B5LnNldFJlcXVpcmVkKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXRUeXBlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCQkJCi0JCQkJcmVtb3ZlWG1sRWxlbWVudFJlZkFubm90YXRpb24oKTsKLQkJCQkKLQkJCQlyZXR1cm4geG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmFkZFhtbEVsZW1lbnRSZWYoaW5kZXgpOwotCQkJfQotCQkJCi0JCQlpZiAoaW5kZXggPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcudmFsdWVPZihpbmRleCkpOwotCQkJfQotCQkJcmV0dXJuIGFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbigpOwotCQkJaWYgKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLnJlbW92ZVhtbEVsZW1lbnRSZWYoaW5kZXgpOwotCQkJCWlmICh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkgPT0gMCkgewotCQkJCQlyZW1vdmVYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpID09IDEpIHsKLQkJCQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmcygpLCAwKTsKLQkJCQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb25Db3B5ID0gYWRkWG1sRWxlbWVudFJlZkFubm90YXRpb24oKTsKLQkJCQkJeG1sRWxlbWVudFJlZkFubm90YXRpb25Db3B5LnNldE5hbWUoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCQkJeG1sRWxlbWVudFJlZkFubm90YXRpb25Db3B5LnNldE5hbWVzcGFjZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCQkJCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uQ29weS5zZXRSZXF1aXJlZCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJCQkJeG1sRWxlbWVudFJlZkFubm90YXRpb25Db3B5LnNldFR5cGUoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJCQkJcmVtb3ZlWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigpOwotCQkJaWYgKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlpZiAoaW5kZXggIT0gMCkgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGluZGV4KSk7Ci0JCQkJfQotCQkJCXJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGluZGV4KSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJaWYgKHRhcmdldEluZGV4ID09IHNvdXJjZUluZGV4KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24geG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKHRhcmdldEluZGV4KSArICIsICIgKyBTdHJpbmcudmFsdWVPZihzb3VyY2VJbmRleCkpOwotCQkJfQotCQkJeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLm1vdmVYbWxFbGVtZW50UmVmKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50UmVmIGJ1aWxkWG1sRWxlbWVudFJlZihKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZihwYXJlbnQsIG5ldyBYbWxFbGVtZW50UmVmQ29udGV4dChhbm5vdGF0aW9uKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbigpOwotCQkJaWYgKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCQl9Ci0JCQkKLQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oKTsKLQkJCWlmICh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYuQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbjsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmQ29udGV4dChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpczsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgZ2V0RWxlbWVudFdyYXBwZXIoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBdHRhY2htZW50UmVmLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBdHRhY2htZW50UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3Y2EyZmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQXR0YWNobWVudFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0YWNobWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0YWNobWVudFJlZkFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEF0dGFjaG1lbnRSZWYKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbEF0dGFjaG1lbnRSZWYgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiByZXNvdXJjZVhtbEF0dGFjaG1lbnRSZWY7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sQXR0YWNobWVudFJlZihKYXhiQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uIHJlc291cmNlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VYbWxBdHRhY2htZW50UmVmID0gcmVzb3VyY2U7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YkF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVhtbEF0dGFjaG1lbnRSZWYuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5NDI4Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJRTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxJRFJFRi5WYWxpZGF0YWJsZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuUU5hbWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBdHRyaWJ1dGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFYbWxOYW1lZE5vZGVNYXBwaW5nPFhtbEF0dHJpYnV0ZUFubm90YXRpb24+Ci0JCWltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEpheGJRTmFtZSBxTmFtZTsKLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZXF1aXJlZDsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnFOYW1lID0gYnVpbGRRTmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZFJlcXVpcmVkID0gYnVpbGRTcGVjaWZpZWRSZXF1aXJlZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucU5hbWUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzZXRTcGVjaWZpZWRSZXF1aXJlZF8oYnVpbGRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5xTmFtZS51cGRhdGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQVRUUklCVVRFOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzY2hlbWEgY29tcG9uZW50IHJlZiAqKioqKgotCQotCXB1YmxpYyBKYXhiUU5hbWUgZ2V0UU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnFOYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIGJ1aWxkUU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgWG1sQXR0cmlidXRlUU5hbWUodGhpcyk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEF0dHJpYnV0ZS5yZXF1aXJlZCAqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlcXVpcmVkID09IG51bGwpID8gaXNEZWZhdWx0UmVxdWlyZWQoKSA6IHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZXF1aXJlZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVxdWlyZWQoQm9vbGVhbiBuZXdTcGVjaWZpZWRSZXF1aXJlZCkgewotCQlnZXRPckNyZWF0ZUFubm90YXRpb24oKS5zZXRSZXF1aXJlZChuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JCXNldFNwZWNpZmllZFJlcXVpcmVkXyhuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlcXVpcmVkXyhCb29sZWFuIG5ld1NwZWNpZmllZFJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkUmVxdWlyZWQgPSB0aGlzLnNwZWNpZmllZFJlcXVpcmVkOwotCQl0aGlzLnNwZWNpZmllZFJlcXVpcmVkID0gbmV3U3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFUVVJUkVEX1BST1BFUlRZLCBvbGRSZXF1aXJlZCwgbmV3U3BlY2lmaWVkUmVxdWlyZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFJlcXVpcmVkKCkgewotCQlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFJlcXVpcmVkKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbExpc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0WG1sTGlzdCgpIHsKLQkJcmV0dXJuIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbElEUkVGICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEdlbmVyaWNKYXZhWG1sSURSRUYuQ29udGV4dCBidWlsZFhtbElEUkVGQ29udGV4dCgpIHsKLQkJcmV0dXJuIG5ldyBYbWxJRFJFRkNvbnRleHQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCXB1YmxpYyBYc2RGZWF0dXJlIGdldFhzZEZlYXR1cmUoKSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHR5cGUgPSBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJWHNkQXR0cmlidXRlVXNlIGF0dHJpYnV0ZVVzZSA9IHR5cGUuZ2V0QXR0cmlidXRlKHRoaXMucU5hbWUuZ2V0TmFtZXNwYWNlKCksIHRoaXMucU5hbWUuZ2V0TmFtZSgpKTsKLQkJCXJldHVybiAoYXR0cmlidXRlVXNlID09IG51bGwpID8gbnVsbCA6IGF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotCQl9Ci0JCXJldHVybiBudWxsOwkJCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXREYXRhVHlwZVhzZFR5cGVEZWZpbml0aW9uKCkgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gc3VwZXIuZ2V0RGF0YVR5cGVYc2RUeXBlRGVmaW5pdGlvbigpOwotCQlpZiAoeHNkVHlwZSAhPSBudWxsIAotCQkJCSYmIGlzWG1sTGlzdCgpIAotCQkJCSYmIHhzZFR5cGUuZ2V0S2luZCgpID09IFhzZFR5cGVEZWZpbml0aW9uLktpbmQuU0lNUExFIAotCQkJCSYmICgoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZFR5cGUpLmdldEl0ZW1UeXBlKCkgIT0gbnVsbCkgewotCQkJeHNkVHlwZSA9ICgoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIHhzZFR5cGUpLmdldEl0ZW1UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHhzZFR5cGU7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy5xTmFtZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdmFsaWRhdGVRTmFtZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl2YWxpZGF0ZVNjaGVtYVR5cGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnFOYW1lLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlU2NoZW1hVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlYc2RGZWF0dXJlIHhzZEZlYXR1cmUgPSBnZXRYc2RGZWF0dXJlKCk7Ci0JCWlmICh4c2RGZWF0dXJlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJWHNkVHlwZURlZmluaXRpb24gZXhwZWN0ZWRTY2hlbWFUeXBlID0gbnVsbDsKLQkJaWYgKHRoaXMueG1sSUQgIT0gbnVsbCkgewotCQkJZXhwZWN0ZWRTY2hlbWFUeXBlID0gWHNkVXRpbC5nZXRTY2hlbWFGb3JTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbigiSUQiKTsKLQkJfQotCQllbHNlIGlmICh0aGlzLnhtbElEUkVGICE9IG51bGwpIHsKLQkJCWV4cGVjdGVkU2NoZW1hVHlwZSA9IFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb24oIklEUkVGIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlleHBlY3RlZFNjaGVtYVR5cGUgPSBnZXREYXRhVHlwZVhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJCi0JCWlmIChleHBlY3RlZFNjaGVtYVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlib29sZWFuIGlzSXRlbVR5cGUgPSBpc1htbExpc3QoKSAmJiB0aGlzLnhtbFNjaGVtYVR5cGUgPT0gbnVsbDsKLQkJaWYgKCEgeHNkRmVhdHVyZS50eXBlSXNWYWxpZChleHBlY3RlZFNjaGVtYVR5cGUsIGlzSXRlbVR5cGUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfQVRUUklCVVRFX19JTlZBTElEX1NDSEVNQV9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldFZhbHVlVHlwZU5hbWUoKSwgeHNkRmVhdHVyZS5nZXROYW1lKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMucU5hbWUuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxBdHRyaWJ1dGVRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlUU5hbWUoSmF2YUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBuZXcgUU5hbWVBbm5vdGF0aW9uUHJveHkoKSk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb21wb25lbnRUeXBlRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YkNvcmVNZXNzYWdlcy5YTUxfQVRUUklCVVRFX0RFU0M7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROYW1lKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkJcmV0dXJuICh4c2RUeXBlID09IG51bGwpID8gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpIDogeHNkVHlwZS5nZXRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZXNwYWNlKCkgewotCQkJSmF4YlBhY2thZ2UgamF4YlBhY2thZ2UgPSB0aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCQlyZXR1cm4gKGpheGJQYWNrYWdlICE9IG51bGwgJiYgamF4YlBhY2thZ2UuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSA9PSBYbWxOc0Zvcm0uUVVBTElGSUVEKSA/Ci0JCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpIDogIiI7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCXJldHVybiAoc2NoZW1hID09IG51bGwpID8gRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkgOiBzY2hlbWEuZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJWHNkVHlwZURlZmluaXRpb24gdHlwZSA9IGdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWlmICh0eXBlLmdldEF0dHJpYnV0ZShnZXROYW1lc3BhY2UoKSwgZ2V0TmFtZSgpKSA9PSBudWxsKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZChnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCWlmIChjcmVhdGVJZk51bGwpIHsKLQkJCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLnRoaXMuZ2V0T3JDcmVhdGVBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLnRoaXMuZ2V0QW5ub3RhdGlvbigpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxJRFJFRkNvbnRleHQKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhWG1sTmFtZWROb2RlTWFwcGluZy5YbWxJRFJFRkNvbnRleHQgewotCQkKLQkJcHVibGljIEl0ZXJhYmxlPFZhbGlkYXRhYmxlUmVmZXJlbmNlPiBnZXRSZWZlcmVuY2VzKCkgewotCQkJCi0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxWYWxpZGF0YWJsZVJlZmVyZW5jZT4oCi0JCQkJCQotCQkJCQluZXcgVmFsaWRhdGFibGVSZWZlcmVuY2UoKSB7Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkgewotCQkJCQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJCQkJCS8vIDEpIGlmIHdlJ3JlIGdldHRpbmcgaGVyZSwgWG1sSURSRUYgd2lsbCBub3QgYmUgbnVsbAotCQkJCQkJCS8vIDIpIHVzZSB0aGUgQFhtbElEUkVGIHRleHQgcmFuZ2UsIHNpbmNlIHRoZXJlIGlzIG5vIHNwZWNpZmljIHBsYWNlIHdoZXJlIHRoZSB0eXBlIGlzIHNwZWNpZmllZAotCQkJCQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRYbWxJRFJFRigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBYc2RGZWF0dXJlIGdldFhzZEZlYXR1cmUoKSB7Ci0JCQkJCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldFhzZEZlYXR1cmUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFRleHRSYW5nZSBnZXRYc2RGZWF0dXJlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkJCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZy50aGlzLmdldFFOYW1lKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpc0xpc3QoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuaXNMaXN0KCkgCi0JCQkJfHwgR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwN2I3Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJRTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50Ci0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50IHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBjb250ZXh0OwotCQotCXByb3RlY3RlZCBmaW5hbCBKYXhiUU5hbWUgcU5hbWU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTmlsbGFibGU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE5pbGxhYmxlOwotCQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFJlcXVpcmVkOwotCQotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVHlwZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUeXBlOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnQoSmF2YUNvbnRleHROb2RlIHBhcmVudCwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMucU5hbWUgPSBidWlsZFFOYW1lKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTmlsbGFibGUgPSBidWlsZFNwZWNpZmllZE5pbGxhYmxlKCk7Ci0JCXRoaXMuZGVmYXVsdE5pbGxhYmxlID0gYnVpbGREZWZhdWx0TmlsbGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9IGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBidWlsZERlZmF1bHRWYWx1ZSgpOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBidWlsZFNwZWNpZmllZFR5cGUoKTsKLQkJdGhpcy5kZWZhdWx0VHlwZSA9IGJ1aWxkRGVmYXVsdFR5cGUoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnFOYW1lLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc2V0U3BlY2lmaWVkTmlsbGFibGVfKGJ1aWxkU3BlY2lmaWVkTmlsbGFibGUoKSk7Ci0JCXNldERlZmF1bHROaWxsYWJsZV8oYnVpbGREZWZhdWx0TmlsbGFibGUoKSk7Ci0JCXNldFNwZWNpZmllZFJlcXVpcmVkXyhidWlsZFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlzZXREZWZhdWx0VmFsdWVfKGJ1aWxkRGVmYXVsdFZhbHVlKCkpOwotCQlzZXRTcGVjaWZpZWRUeXBlXyhidWlsZFNwZWNpZmllZFR5cGUoKSk7Ci0JCXNldERlZmF1bHRUeXBlXyhidWlsZERlZmF1bHRUeXBlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnFOYW1lLnVwZGF0ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0OwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIGdldENvbnRleHQoKS5nZXRBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0Q29udGV4dCgpLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldEpheGJDbGFzc01hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Q2xhc3NNYXBwaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50QW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOdWxsKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0QW5ub3RhdGlvbihjcmVhdGVJZk51bGwpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzY2hlbWEgY29tcG9uZW50IHJlZiAqKioqKgotCQotCXB1YmxpYyBKYXhiUU5hbWUgZ2V0UU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnFOYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIGJ1aWxkUU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgWG1sRWxlbWVudFFOYW1lKHRoaXMpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50Lm5pbGxhYmxlICoqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5pbGxhYmxlID09IG51bGwpID8gaXNEZWZhdWx0TmlsbGFibGUoKSA6IGdldFNwZWNpZmllZE5pbGxhYmxlKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROaWxsYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmlsbGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWROaWxsYWJsZSkgewotCQlnZXRBbm5vdGF0aW9uKHRydWUpLnNldE5pbGxhYmxlKG5ld1NwZWNpZmllZE5pbGxhYmxlKTsKLQkJc2V0U3BlY2lmaWVkTmlsbGFibGVfKG5ld1NwZWNpZmllZE5pbGxhYmxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmlsbGFibGVfKEJvb2xlYW4gbmV3U3BlY2lmaWVkTmlsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGROaWxsYWJsZSA9IHRoaXMuc3BlY2lmaWVkTmlsbGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkTmlsbGFibGUgPSBuZXdTcGVjaWZpZWROaWxsYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTklMTEFCTEVfUFJPUEVSVFksIG9sZE5pbGxhYmxlLCBuZXdTcGVjaWZpZWROaWxsYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkTmlsbGFibGUoKSB7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRBbm5vdGF0aW9uKGZhbHNlKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0TmlsbGFibGUoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmlsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROaWxsYWJsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5pbGxhYmxlXyhib29sZWFuIG5ld05pbGxhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkTmlsbGFibGUgPSB0aGlzLmRlZmF1bHROaWxsYWJsZTsKLQkJdGhpcy5kZWZhdWx0TmlsbGFibGUgPSBuZXdOaWxsYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX05JTExBQkxFX1BST1BFUlRZLCBvbGROaWxsYWJsZSwgbmV3TmlsbGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHROaWxsYWJsZSgpIHsKLQkJWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpIDogZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnQucmVxdWlyZWQgKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9PSBudWxsKSA/IGlzRGVmYXVsdFJlcXVpcmVkKCkgOiB0aGlzLnNwZWNpZmllZFJlcXVpcmVkLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlcXVpcmVkKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVxdWlyZWQpIHsKLQkJZ2V0QW5ub3RhdGlvbih0cnVlKS5zZXRSZXF1aXJlZChuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JCXNldFNwZWNpZmllZFJlcXVpcmVkXyhuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlcXVpcmVkXyhCb29sZWFuIG5ld1NwZWNpZmllZFJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkUmVxdWlyZWQgPSB0aGlzLnNwZWNpZmllZFJlcXVpcmVkOwotCQl0aGlzLnNwZWNpZmllZFJlcXVpcmVkID0gbmV3U3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFUVVJUkVEX1BST1BFUlRZLCBvbGRSZXF1aXJlZCwgbmV3U3BlY2lmaWVkUmVxdWlyZWQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFJlcXVpcmVkKCkgewotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihmYWxzZSk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFJlcXVpcmVkKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnQuZGVmYXVsdFZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJZ2V0QW5ub3RhdGlvbih0cnVlKS5zZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJc2V0RGVmYXVsdFZhbHVlXyhkZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VmFsdWVfKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZERlZmF1bHRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1ZBTFVFX1BST1BFUlRZLCBvbGREZWZhdWx0VmFsdWUsIGRlZmF1bHRWYWx1ZSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZSgpIHsKLQkJWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudC50eXBlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSA9PSBudWxsKSA/IGdldERlZmF1bHRUeXBlKCkgOiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHlwZShTdHJpbmcgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlnZXRBbm5vdGF0aW9uKHRydWUpLnNldFR5cGUobmV3U3BlY2lmaWVkVHlwZSk7Ci0JCXNldFNwZWNpZmllZFR5cGVfKG5ld1NwZWNpZmllZFR5cGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUeXBlXyhTdHJpbmcgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHRoaXMuc3BlY2lmaWVkVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRUeXBlID0gbmV3U3BlY2lmaWVkVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkVHlwZSwgbmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRUeXBlKCkgewotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihmYWxzZSk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFR5cGU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUeXBlXyhTdHJpbmcgbmV3VHlwZSkgewotCQlTdHJpbmcgb2xkVHlwZSA9IHRoaXMuZGVmYXVsdFR5cGU7Ci0JCXRoaXMuZGVmYXVsdFR5cGUgPSBuZXdUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVFlQRV9QUk9QRVJUWSwgb2xkVHlwZSwgbmV3VHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dC5nZXREZWZhdWx0VHlwZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFR5cGUgPT0gbnVsbCkgPyBnZXREZWZhdWx0VHlwZSgpIDogZ2V0QW5ub3RhdGlvbihmYWxzZSkuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJLy8gb25seSByZXR1cm4gdGhlIHNwZWNpZmllZCB0eXBlIC0gdGhlIGRlZmF1bHQgdHlwZSBzaG91bGQgYWxyZWFkeSBiZSBpbmNsdWRlZAotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSA9PSBudWxsKSA/IAotCQkJCUVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpIAotCQkJCTogbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZShnZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WHNkRWxlbWVudCgpIHsKLQkJWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRYc2RUeXBlRGVmaW5pdGlvbigpOwotCQlyZXR1cm4gKHhzZFR5cGUgPT0gbnVsbCkgPyBudWxsIDogeHNkVHlwZS5nZXRFbGVtZW50KHRoaXMucU5hbWUuZ2V0TmFtZXNwYWNlKCksIHRoaXMucU5hbWUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBleHBlY3RlZCBzY2hlbWEgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdHlwZQotCSAqLwotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXRUeXBlWHNkVHlwZURlZmluaXRpb24oKSB7Ci0JCVN0cmluZyB0eXBlID0gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHR5cGUpIHx8IFhtbEVsZW1lbnQuREVGQVVMVF9UWVBFX1BST1BFUlRZLmVxdWFscyh0eXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpheGJQYWNrYWdlIHBrZyA9IGdldEpheGJQYWNrYWdlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBwa2dJbmZvID0gKHBrZyA9PSBudWxsKSA/IG51bGwgOiBwa2cuZ2V0UGFja2FnZUluZm8oKTsKLQkJaWYgKHBrZ0luZm8gIT0gbnVsbCkgewotCQkJZm9yIChYbWxTY2hlbWFUeXBlIHNjaGVtYVR5cGUgOiBwa2dJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCkpIHsKLQkJCQlpZiAodHlwZS5lcXVhbHMoc2NoZW1hVHlwZS5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSkpIHsKLQkJCQkJcmV0dXJuIHNjaGVtYVR5cGUuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCUpheGJUeXBlTWFwcGluZyBqYXhiVHlwZU1hcHBpbmcgPSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVNYXBwaW5nKHR5cGUpOwotCQlpZiAoamF4YlR5cGVNYXBwaW5nICE9IG51bGwpIHsKLQkJCXJldHVybiBqYXhiVHlwZU1hcHBpbmcuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJfQotCQkKLQkJU3RyaW5nIGJ1aWx0SW5UeXBlID0gZ2V0SmF4YlByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLmdldERlZmluaXRpb24oKS5nZXRTY2hlbWFUeXBlTWFwcGluZyh0eXBlKTsKLQkJaWYgKGJ1aWx0SW5UeXBlICE9IG51bGwpIHsKLQkJCXJldHVybiBYc2RVdGlsLmdldFNjaGVtYUZvclNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9uKGJ1aWx0SW5UeXBlKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy5xTmFtZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEFubm90YXRpb24oZmFsc2UpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBnZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpIDogYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbihmYWxzZSk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IGdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkgOiBhbm5vdGF0aW9uLmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlUU5hbWUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdmFsaWRhdGVUeXBlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXZhbGlkYXRlU2NoZW1hVHlwZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVFOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMucU5hbWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyBmcVR5cGUgPSBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZnFUeXBlKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfX1VOU1BFQ0lGSUVEX1RZUEUsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRUeXBlVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQkJZWxzZSBpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuc3BlY2lmaWVkVHlwZSkKLQkJCQkvLyB2ZXJpZnkgdGhhdCB0eXBlIGFjdHVhbGx5IGV4aXN0cyBiZWZvcmUgdmFsaWRhdGluZwotCQkJCSYmIEpEVFRvb2xzLmZpbmRUeXBlKGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKSwgZnFUeXBlKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYXR0cmlidXRlQmFzZVR5cGUgPSBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0VmFsdWVUeXBlTmFtZSgpOwotCQkJaWYgKCEgSkRUVG9vbHMudHlwZUlzU3ViVHlwZShnZXRKYXhiUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCksIGZxVHlwZSwgYXR0cmlidXRlQmFzZVR5cGUpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfX0lMTEVHQUxfVFlQRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgYXR0cmlidXRlQmFzZVR5cGUgfSwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCQkJCQkKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVNjaGVtYVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJWHNkRWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnQgPSBnZXRYc2RFbGVtZW50KCk7Ci0JCWlmICh4c2RFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJWHNkVHlwZURlZmluaXRpb24gZXhwZWN0ZWRTY2hlbWFUeXBlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5jb250ZXh0LmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXREYXRhVHlwZU5hbWUoKTsKLQkJaWYgKCEgWG1sRWxlbWVudC5ERUZBVUxUX1RZUEVfUFJPUEVSVFkuZXF1YWxzKGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKSkgewotCQkJdHlwZU5hbWUgPSBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJfQotCQkKLQkJaWYgKHRoaXMuY29udGV4dC5oYXNYbWxJRCgpKSB7Ci0JCQlleHBlY3RlZFNjaGVtYVR5cGUgPSBYc2RVdGlsLmdldFNjaGVtYUZvclNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9uKCJJRCIpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuY29udGV4dC5oYXNYbWxJRFJFRigpKSB7Ci0JCQlleHBlY3RlZFNjaGVtYVR5cGUgPSBYc2RVdGlsLmdldFNjaGVtYUZvclNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9uKCJJRFJFRiIpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuY29udGV4dC5oYXNYbWxTY2hlbWFUeXBlKCkpIHsKLQkJCWV4cGVjdGVkU2NoZW1hVHlwZSA9IHRoaXMuY29udGV4dC5nZXRYbWxTY2hlbWFUeXBlKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJfQotCQllbHNlIGlmICghIFhtbEVsZW1lbnQuREVGQVVMVF9UWVBFX1BST1BFUlRZLmVxdWFscyhnZXRGdWxseVF1YWxpZmllZFR5cGUoKSkpIHsKLQkJCWV4cGVjdGVkU2NoZW1hVHlwZSA9IGdldFR5cGVYc2RUeXBlRGVmaW5pdGlvbigpOwotCQl9Ci0JCWVsc2UgewotCQkJZXhwZWN0ZWRTY2hlbWFUeXBlID0gdGhpcy5jb250ZXh0LmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXREYXRhVHlwZVhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJCi0JCWlmIChleHBlY3RlZFNjaGVtYVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoISB4c2RFbGVtZW50LnR5cGVJc1ZhbGlkKGV4cGVjdGVkU2NoZW1hVHlwZSwgdGhpcy5jb250ZXh0Lmhhc1htbExpc3QoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX19JTlZBTElEX1NDSEVNQV9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lLCB4c2RFbGVtZW50LmdldE5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5xTmFtZS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFFbGVtZW50UU5hbWUgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5ldyBRTmFtZUFubm90YXRpb25Qcm94eSgpKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnQudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXIgZ2V0RWxlbWVudFdyYXBwZXIoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50LnRoaXMuY29udGV4dC5nZXRFbGVtZW50V3JhcHBlcigpOwotCQl9CQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUU5hbWVBbm5vdGF0aW9uUHJveHkgCi0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVFOYW1lLkFic3RyYWN0UU5hbWVBbm5vdGF0aW9uUHJveHkgewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBRTmFtZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudC50aGlzLmdldEFubm90YXRpb24oY3JlYXRlSWZOdWxsKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpOwotCQkKLQkJWG1sRWxlbWVudEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCk7Ci0JCQotCQlTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKTsKLQkJCi0JCVhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCk7Ci0JCQotCQlib29sZWFuIGhhc1htbElEKCk7Ci0JCQotCQlib29sZWFuIGhhc1htbElEUkVGKCk7Ci0JCQotCQlib29sZWFuIGhhc1htbExpc3QoKTsKLQkJCi0JCWJvb2xlYW4gaGFzWG1sU2NoZW1hVHlwZSgpOwotCQkKLQkJWG1sU2NoZW1hVHlwZSBnZXRYbWxTY2hlbWFUeXBlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YWFlMjUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxJRFJFRi5WYWxpZGF0YWJsZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YVhtbE5hbWVkTm9kZU1hcHBpbmc8WG1sRWxlbWVudEFubm90YXRpb24+Ci0JCWltcGxlbWVudHMgWG1sRWxlbWVudE1hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxFbGVtZW50IHhtbEVsZW1lbnQ7Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbEVsZW1lbnQgPSBidWlsZFhtbEVsZW1lbnQoKTsKLQkJaW5pdGlhbGl6ZVhtbEVsZW1lbnRXcmFwcGVyKCk7CQkJCi0JfQotCQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnhtbEVsZW1lbnQuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sRWxlbWVudFdyYXBwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy54bWxFbGVtZW50LnVwZGF0ZSgpOwotCQl1cGRhdGVYbWxFbGVtZW50V3JhcHBlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50ICoqKioqCi0JCi0JcHVibGljIFhtbEVsZW1lbnQgZ2V0WG1sRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudDsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnQgYnVpbGRYbWxFbGVtZW50KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudCh0aGlzLCBuZXcgWG1sRWxlbWVudENvbnRleHQoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlcih0aGlzLCBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlci5TaW1wbGVDb250ZXh0KGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpKSk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyh4bWxFbGVtZW50V3JhcHBlcik7Ci0JCXJldHVybiB4bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyKCkgIT0gbnVsbCkgewotCQkJCWdldFhtbEVsZW1lbnRXcmFwcGVyKCkuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmIChnZXRYbWxFbGVtZW50V3JhcHBlcigpICE9IG51bGwpIHsKLQkJCWdldFhtbEVsZW1lbnRXcmFwcGVyKCkudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRWxlbWVudFdyYXBwZXJfKFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyKSB7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyIG9sZFhtbEVsZW1lbnRXcmFwcGVyID0gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IHhtbEVsZW1lbnRXcmFwcGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFksIG9sZFhtbEVsZW1lbnRXcmFwcGVyLCB4bWxFbGVtZW50V3JhcHBlcik7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbExpc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0WG1sTGlzdCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxJRFJFRiAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBHZW5lcmljSmF2YVhtbElEUkVGLkNvbnRleHQgYnVpbGRYbWxJRFJFRkNvbnRleHQoKSB7Ci0JCXJldHVybiBuZXcgWG1sSURSRUZDb250ZXh0KCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpLAotCQkJCXRoaXMueG1sRWxlbWVudC5nZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRpY2xlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBYc2RGZWF0dXJlIGdldFhzZEZlYXR1cmUoKSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJaWYgKHhzZFR5cGUgIT0gbnVsbCkgewotCQkJWG1sRWxlbWVudFdyYXBwZXIgZWxlbWVudFdyYXBwZXIgPSB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyOwotCQkJCi0JCQlpZiAoZWxlbWVudFdyYXBwZXIgPT0gbnVsbCkgewotCQkJCXJldHVybiB4c2RUeXBlLmdldEVsZW1lbnQodGhpcy54bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCksIHRoaXMueG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlYc2RFbGVtZW50RGVjbGFyYXRpb24geHNkV3JhcHBlckVsZW1lbnQgPSBlbGVtZW50V3JhcHBlci5nZXRYc2RFbGVtZW50RGVjbGFyYXRpb24oKTsKLQkJCQlpZiAoeHNkV3JhcHBlckVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4geHNkV3JhcHBlckVsZW1lbnQuZ2V0RWxlbWVudCh0aGlzLnhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSwgdGhpcy54bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gbnVsbDsJCi0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy54bWxFbGVtZW50LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdGhpcy54bWxFbGVtZW50V3JhcHBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl0aGlzLnhtbEVsZW1lbnQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudENvbnRleHQKLQkJCWltcGxlbWVudHMgR2VuZXJpY0phdmFYbWxFbGVtZW50LkNvbnRleHQgewotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiAoY3JlYXRlSWZOdWxsKSA/IAotCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0T3JDcmVhdGVBbm5vdGF0aW9uKCkgCi0JCQkJCTogR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldEFubm90YXRpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUeXBlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBnZXRFbGVtZW50V3JhcHBlcigpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sSUQoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbElEKCkgIT0gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sSURSRUYoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbElEUkVGKCkgIT0gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sTGlzdCgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuaXNYbWxMaXN0KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbFNjaGVtYVR5cGUoKSB7Ci0JCQlyZXR1cm4gZ2V0WG1sU2NoZW1hVHlwZSgpICE9IG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxTY2hlbWFUeXBlIGdldFhtbFNjaGVtYVR5cGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldFhtbFNjaGVtYVR5cGUoKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sSURSRUZDb250ZXh0Ci0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVhtbE5hbWVkTm9kZU1hcHBpbmcuWG1sSURSRUZDb250ZXh0IHsKLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxWYWxpZGF0YWJsZVJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlcygpIHsKLQkJCQotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8VmFsaWRhdGFibGVSZWZlcmVuY2U+KAotCQkJCQkKLQkJCQkJbmV3IFZhbGlkYXRhYmxlUmVmZXJlbmNlKCkgewotCQkJCQkJCi0JCQkJCQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJCQkJCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLnhtbEVsZW1lbnQuZ2V0VHlwZSgpOwotCQkJCQkJfQotCQkJCQkJCi0JCQkJCQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCQkJCQkvLyAxKSBpZiB3ZSdyZSBnZXR0aW5nIGhlcmUsIFhtbElEUkVGIHdpbGwgbm90IGJlIG51bGwKLQkJCQkJCQkvLyAyKSBpZiB0aGVyZSBpcyBhbiBAWG1sRWxlbWVudCBhbm5vdGF0aW9uLCB1c2UgdGhhdCwgb3RoZXJ3aXNlIHVzZSB0aGUgQFhtbElEUkVGCi0JCQkJCQkJcmV0dXJuIChHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0QW5ub3RhdGlvbigpID09IG51bGwpID8KLQkJCQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxJRFJFRigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJCQkJCTogR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLnhtbEVsZW1lbnQuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFhzZEZlYXR1cmUgZ2V0WHNkRmVhdHVyZSgpIHsKLQkJCQkJCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLmdldFhzZEZlYXR1cmUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFRleHRSYW5nZSBnZXRYc2RGZWF0dXJlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkJCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy54bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNzYwZjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5RTmFtZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlIAotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRSZWYgewotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0IGNvbnRleHQ7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEpheGJRTmFtZSBxTmFtZTsKLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRSZXF1aXJlZDsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFR5cGU7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VHlwZTsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLnFOYW1lID0gYnVpbGRRTmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZFJlcXVpcmVkID0gYnVpbGRTcGVjaWZpZWRSZXF1aXJlZCgpOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBidWlsZFNwZWNpZmllZFR5cGUoKTsKLQkJdGhpcy5kZWZhdWx0VHlwZSA9IGJ1aWxkRGVmYXVsdFR5cGUoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnFOYW1lLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc2V0U3BlY2lmaWVkUmVxdWlyZWRfKGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCXNldFNwZWNpZmllZFR5cGVfKGJ1aWxkU3BlY2lmaWVkVHlwZSgpKTsKLQkJc2V0RGVmYXVsdFR5cGVfKGJ1aWxkRGVmYXVsdFR5cGUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucU5hbWUudXBkYXRlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQ7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0Q29udGV4dCgpLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldEpheGJDbGFzc01hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0Q2xhc3NNYXBwaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJDbGFzc01hcHBpbmcoKS5nZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldEFubm90YXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc2NoZW1hIGNvbXBvbmVudCByZWYgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbEVsZW1lbnRSZWZRTmFtZSh0aGlzKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZi5yZXF1aXJlZCAqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9PSBudWxsKSA/IGlzRGVmYXVsdFJlcXVpcmVkKCkgOiB0aGlzLnNwZWNpZmllZFJlcXVpcmVkLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlcXVpcmVkKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVxdWlyZWQpIHsKLQkJZ2V0QW5ub3RhdGlvbigpLnNldFJlcXVpcmVkKG5ld1NwZWNpZmllZFJlcXVpcmVkKTsKLQkJc2V0U3BlY2lmaWVkUmVxdWlyZWRfKG5ld1NwZWNpZmllZFJlcXVpcmVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVxdWlyZWRfKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGRSZXF1aXJlZCA9IHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkUmVxdWlyZWQgPSBuZXdTcGVjaWZpZWRSZXF1aXJlZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVRVUlSRURfUFJPUEVSVFksIG9sZFJlcXVpcmVkLCBuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0UmVxdWlyZWQoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZi50eXBlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSA9PSBudWxsKSA/IGdldERlZmF1bHRUeXBlKCkgOiB0aGlzLnNwZWNpZmllZFR5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHlwZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVHlwZShTdHJpbmcgbmV3U3BlY2lmaWVkVHlwZSkgewotCQlnZXRBbm5vdGF0aW9uKCkuc2V0VHlwZShuZXdTcGVjaWZpZWRUeXBlKTsKLQkJc2V0U3BlY2lmaWVkVHlwZV8obmV3U3BlY2lmaWVkVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFR5cGVfKFN0cmluZyBuZXdTcGVjaWZpZWRUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdGhpcy5zcGVjaWZpZWRUeXBlOwotCQl0aGlzLnNwZWNpZmllZFR5cGUgPSBuZXdTcGVjaWZpZWRUeXBlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UWVBFX1BST1BFUlRZLCBvbGRUeXBlLCBuZXdTcGVjaWZpZWRUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0VHlwZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFR5cGVfKFN0cmluZyBuZXdUeXBlKSB7Ci0JCVN0cmluZyBvbGRUeXBlID0gdGhpcy5kZWZhdWx0VHlwZTsKLQkJdGhpcy5kZWZhdWx0VHlwZSA9IG5ld1R5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UWVBFX1BST1BFUlRZLCBvbGRUeXBlLCBuZXdUeXBlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldERlZmF1bHRUeXBlKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVHlwZSA9PSBudWxsKSA/IGdldERlZmF1bHRUeXBlKCkgOiBnZXRBbm5vdGF0aW9uKCkuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJLy8gb25seSByZXR1cm4gdGhlIHNwZWNpZmllZCB0eXBlIC0gdGhlIGRlZmF1bHQgdHlwZSBzaG91bGQgYWxyZWFkeSBiZSBpbmNsdWRlZAotCQlpZiAodGhpcy5zcGVjaWZpZWRUeXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBmcVR5cGUgPSBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJCWlmICghIEpBWEIuSkFYQl9FTEVNRU5ULmVxdWFscyhmcVR5cGUpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGUoZnFUeXBlKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnFOYW1lLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl2YWxpZGF0ZVR5cGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlTdHJpbmcgZnFUeXBlID0gZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGZxVHlwZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX1JFRl9fVU5TUEVDSUZJRURfVFlQRSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCWdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCQllbHNlIGlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5zcGVjaWZpZWRUeXBlKQotCQkJCS8vIHZlcmlmeSB0aGF0IHR5cGUgYWN0dWFsbHkgZXhpc3RzIGJlZm9yZSB2YWxpZGF0aW5nCi0JCQkJJiYgSkRUVG9vbHMuZmluZFR5cGUoZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLCBmcVR5cGUpICE9IG51bGwpIHsKLQkJCVN0cmluZyBhdHRyaWJ1dGVCYXNlVHlwZSA9IGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKTsKLQkJCWlmICghIEpEVFRvb2xzLnR5cGVJc1N1YlR5cGUoZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLCBmcVR5cGUsIGF0dHJpYnV0ZUJhc2VUeXBlKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX1JFRl9fSUxMRUdBTF9UWVBFLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyBhdHRyaWJ1dGVCYXNlVHlwZSB9LAotCQkJCQkJCQl0aGlzLAotCQkJCQkJCQlnZXRUeXBlVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQkJCQkJCQotCQkJfQotCQkJCi0JCQkvLyBpZiB0eXBlIGlzIGEgcGVyc2lzdGVudCBjbGFzcywgY2hlY2sgdGhhdCBpdCBvciBhIHN1YmNsYXNzIGhhcyBhIHJvb3QgZWxlbWVudCBzcGVjaWZpZWQKLQkJCUpheGJUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGdldEpheGJQcm9qZWN0KCkuZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlTWFwcGluZyhmcVR5cGUpOwotCQkJaWYgKHR5cGVNYXBwaW5nICE9IG51bGwgJiYgISB0eXBlTWFwcGluZy5oYXNSb290RWxlbWVudEluSGllcmFyY2h5KCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9SRUZfX05PX1JPT1RfRUxFTUVOVCwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgYXR0cmlidXRlQmFzZVR5cGUgfSwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmUU5hbWUKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhRWxlbWVudFFOYW1lIHsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmUU5hbWUoSmF2YUNvbnRleHROb2RlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBuZXcgUU5hbWVBbm5vdGF0aW9uUHJveHkoKSk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1R5cGVKQVhCRWxlbWVudCgpIHsKLQkJCXJldHVybiBKQVhCLkpBWEJfRUxFTUVOVC5lcXVhbHMoR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLnRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgSmF4YlR5cGVNYXBwaW5nIGdldFJlZmVyZW5jZWRUeXBlTWFwcGluZygpIHsKLQkJCVN0cmluZyBmcVR5cGVOYW1lID0gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmLnRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCQlyZXR1cm4gZ2V0SmF4YlByb2plY3QoKS5nZXRDb250ZXh0Um9vdCgpLmdldFR5cGVNYXBwaW5nKGZxVHlwZU5hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZi50aGlzLmNvbnRleHQuZ2V0RWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCQlpZiAoaXNUeXBlSkFYQkVsZW1lbnQoKSkgewotCQkJCXJldHVybiBzdXBlci5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlKYXhiVHlwZU1hcHBpbmcgcmVmZXJlbmNlZFR5cGVNYXBwaW5nID0gZ2V0UmVmZXJlbmNlZFR5cGVNYXBwaW5nKCk7Ci0JCQlpZiAocmVmZXJlbmNlZFR5cGVNYXBwaW5nICE9IG51bGwpIHsKLQkJCQlYbWxSb290RWxlbWVudCByb290RWxlbWVudCA9IHJlZmVyZW5jZWRUeXBlTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpOwotCQkJCWlmIChyb290RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiByb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiAiIjsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWVzcGFjZSgpIHsKLQkJCUpheGJUeXBlTWFwcGluZyByZWZlcmVuY2VkVHlwZU1hcHBpbmcgPSBnZXRSZWZlcmVuY2VkVHlwZU1hcHBpbmcoKTsKLQkJCWlmIChyZWZlcmVuY2VkVHlwZU1hcHBpbmcgIT0gbnVsbCkgewotCQkJCVhtbFJvb3RFbGVtZW50IHJvb3RFbGVtZW50ID0gcmVmZXJlbmNlZFR5cGVNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCk7Ci0JCQkJaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBvbmx5IHZhbGlkYXRlIGlmIHR5cGUgaXMgSkFYQkVsZW1lbnQKLQkJCWlmIChpc1R5cGVKQVhCRWxlbWVudCgpKSB7Ci0JCQkJc3VwZXIudmFsaWRhdGVOYW1lKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJc3VwZXIudmFsaWRhdGVSZWZlcmVuY2UobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCQotCQkJLy8gaWYgdHlwZSBpcyBKQVhCRWxlbWVudCwgdGhlbiBuYW1lL25hbWVzcGFjZSBtdXN0IGFsc28gcG9pbnQgYXQgYSB2YWxpZCBYbWxFbGVtZW50RGVjbAotCQkJaWYgKCEgaXNUeXBlSkFYQkVsZW1lbnQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJWG1sUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRKYXhiUGFja2FnZSgpLmdldFJlZ2lzdHJ5KCk7Ci0JCQkKLQkJCWlmIChyZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfUkVGX19OT19SRUdJU1RSWSwKLQkJCQkJCQkJdGhpcywKLQkJCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJZm9yIChKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudERlY2wgOiByZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSkgewotCQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChnZXROYW1lKCksIGVsZW1lbnREZWNsLmdldFFOYW1lKCkuZ2V0TmFtZSgpKQotCQkJCQkJJiYgVG9vbHMudmFsdWVzQXJlRXF1YWwoZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnREZWNsLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVF9SRUZfX05PX01BVENISU5HX0VMRU1FTlRfREVDTCwKLQkJCQkJCQluZXcgU3RyaW5nW10geyBnZXROYW1lc3BhY2UoKSwgZ2V0TmFtZSgpIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQkJCQkJCi0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYudGhpcy5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBDb250ZXh0IHsKLQkJCi0JCUpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJCi0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQkJCi0JCVN0cmluZyBnZXREZWZhdWx0VHlwZSgpOwotCQkKLQkJWG1sRWxlbWVudFdyYXBwZXIgZ2V0RWxlbWVudFdyYXBwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhNzkwYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50UmVmTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE1peGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8WG1sRWxlbWVudFJlZkFubm90YXRpb24+Ci0JCWltcGxlbWVudHMgWG1sRWxlbWVudFJlZk1hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWY7Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyOwotCQotCXByb3RlY3RlZCBYbWxNaXhlZCB4bWxNaXhlZDsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbGVtZW50UmVmID0gYnVpbGRYbWxFbGVtZW50UmVmKCk7Ci0JCWluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpOwkJCQotCQlpbml0aWFsaXplWG1sTWl4ZWQoKTsJCQkKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9SRUZfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUY7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXN5bmNYbWxNaXhlZCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnhtbEVsZW1lbnRSZWYudXBkYXRlKCk7Ci0JCXVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXVwZGF0ZVhtbE1peGVkKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWYgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZiBnZXRYbWxFbGVtZW50UmVmKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZiBidWlsZFhtbEVsZW1lbnRSZWYoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmKHRoaXMsIG5ldyBYbWxFbGVtZW50UmVmQ29udGV4dCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFdyYXBwZXIgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxFbGVtZW50V3JhcHBlcl8oWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIpIHsKLQkJWG1sRWxlbWVudFdyYXBwZXIgb2xkWG1sRWxlbWVudFdyYXBwZXIgPSB0aGlzLnhtbEVsZW1lbnRXcmFwcGVyOwotCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID0geG1sRWxlbWVudFdyYXBwZXI7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX0VMRU1FTlRfV1JBUFBFUl9QUk9QRVJUWSwgb2xkWG1sRWxlbWVudFdyYXBwZXIsIHhtbEVsZW1lbnRXcmFwcGVyKTsKLQl9Ci0JCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGFkZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlYbWxFbGVtZW50V3JhcHBlciB4bWxFbGVtZW50V3JhcHBlciA9IGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKHhtbEVsZW1lbnRXcmFwcGVyKTsKLQkJcmV0dXJuIHhtbEVsZW1lbnRXcmFwcGVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyIGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlcih0aGlzLCBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlci5TaW1wbGVDb250ZXh0KGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXRoaXMueG1sRWxlbWVudFdyYXBwZXIudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sTWl4ZWQgKioqKioKLQkKLQlwdWJsaWMgWG1sTWl4ZWQgZ2V0WG1sTWl4ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1peGVkOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxNaXhlZF8oWG1sTWl4ZWQgeG1sTWl4ZWQpIHsKLQkJWG1sTWl4ZWQgb2xkWG1sTWl4ZWQgPSB0aGlzLnhtbE1peGVkOwotCQl0aGlzLnhtbE1peGVkID0geG1sTWl4ZWQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX01JWEVEX1BST1BFUlRZLCBvbGRYbWxNaXhlZCwgeG1sTWl4ZWQpOwotCX0KLQkKLQlwdWJsaWMgWG1sTWl4ZWQgYWRkWG1sTWl4ZWQoKSB7Ci0JCWlmICh0aGlzLnhtbE1peGVkICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQkKLQkJWG1sTWl4ZWQgeG1sTWl4ZWQgPSBidWlsZFhtbE1peGVkKGFubm90YXRpb24pOwotCQlzZXRYbWxNaXhlZF8oeG1sTWl4ZWQpOwotCQlyZXR1cm4geG1sTWl4ZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCXNldFhtbE1peGVkXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkQW5ub3RhdGlvbiBnZXRYbWxNaXhlZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sTWl4ZWRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkIGJ1aWxkWG1sTWl4ZWQoWG1sTWl4ZWRBbm5vdGF0aW9uIHhtbE1peGVkQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sTWl4ZWQodGhpcywgeG1sTWl4ZWRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbE1peGVkKCkgewotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbE1peGVkQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkID0gYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sTWl4ZWQoKSB7Ci0JCVhtbE1peGVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sTWl4ZWRBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbE1peGVkICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbE1peGVkLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbE1peGVkXyhidWlsZFhtbE1peGVkKGFubm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbE1peGVkXyhudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0aWNsZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFJlZi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFdyYXBwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdGhpcy54bWxFbGVtZW50UmVmLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRSZWZDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZi5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcudGhpcy5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmcudGhpczsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VHlwZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXIgZ2V0RWxlbWVudFdyYXBwZXIoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZy50aGlzLmdldFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMGY0OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlIAotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRSZWZzIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBjb250ZXh0OwotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50UmVmLCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4geG1sRWxlbWVudFJlZkNvbnRhaW5lcjsKLQkKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcyhKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy54bWxFbGVtZW50UmVmQ29udGFpbmVyID0gdGhpcy5idWlsZFhtbEVsZW1lbnRSZWZDb250YWluZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogeG1sIGVsZW1lbnQgcmVmcyAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZj4gZ2V0WG1sRWxlbWVudFJlZnMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIFhtbEVsZW1lbnRSZWYgYWRkWG1sRWxlbWVudFJlZihpbnQgaW5kZXgpIHsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuY29udGV4dC5hZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQl0aGlzLmNvbnRleHQucmVtb3ZlWG1sRWxlbWVudFJlZkFubm90YXRpb24oaW5kZXgpOwotCQl0aGlzLnhtbEVsZW1lbnRSZWZDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKFhtbEVsZW1lbnRSZWYgeG1sRWxlbWVudFJlZikgewotCQlyZW1vdmVYbWxFbGVtZW50UmVmKHRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sRWxlbWVudFJlZikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlWG1sRWxlbWVudFJlZihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmNvbnRleHQubW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sRWxlbWVudFJlZkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWYgYnVpbGRYbWxFbGVtZW50UmVmKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuYnVpbGRYbWxFbGVtZW50UmVmKHRoaXMsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50UmVmLCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gYnVpbGRYbWxFbGVtZW50UmVmQ29udGFpbmVyKCkgewotCQlYbWxFbGVtZW50UmVmQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBYbWxFbGVtZW50UmVmQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJZm9yIChYbWxFbGVtZW50UmVmIGVsZW1lbnRSZWYgOiBnZXRYbWxFbGVtZW50UmVmcygpKSB7Ci0JCQlyZXN1bHQgPSBlbGVtZW50UmVmLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXZhbGlkYXRlRHVwbGljYXRlVHlwZXNBbmRRTmFtZXMobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWZvciAoWG1sRWxlbWVudFJlZiBlbGVtZW50UmVmIDogZ2V0WG1sRWxlbWVudFJlZnMoKSkgewotCQkJZWxlbWVudFJlZi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlVHlwZXNBbmRRTmFtZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCi0JCUJhZzxTdHJpbmc+IHhtbEVsZW1lbnRSZWZUeXBlcyA9IG5ldyBIYXNoQmFnPFN0cmluZz4oKTsKLQkJQmFnPFFOYW1lPiB4bWxFbGVtZW50UmVmUW5hbWVzID0gbmV3IEhhc2hCYWc8UU5hbWU+KCk7Ci0JCQotCQlmb3IgKFhtbEVsZW1lbnRSZWYgeG1sRWxlbWVudFJlZiA6IGdldFhtbEVsZW1lbnRSZWZzKCkpIHsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IHhtbEVsZW1lbnRSZWYuZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCQlib29sZWFuIGlzSmF4YkVsZW1lbnQgPSBKQVhCLkpBWEJfRUxFTUVOVC5lcXVhbHModHlwZU5hbWUpOwotCQkJaWYgKCEgaXNKYXhiRWxlbWVudCAmJiAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodHlwZU5hbWUpKSB7Ci0JCQkJeG1sRWxlbWVudFJlZlR5cGVzLmFkZCh0eXBlTmFtZSk7Ci0JCQl9Ci0JCQlTdHJpbmcgZWxlbWVudFJlZk5hbWUgPSB4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0TmFtZSgpOwotCQkJaWYgKGlzSmF4YkVsZW1lbnQgJiYgISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGVsZW1lbnRSZWZOYW1lKSkgewotCQkJCXhtbEVsZW1lbnRSZWZRbmFtZXMuYWRkKG5ldyBRTmFtZSh4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnRSZWZOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmIDogZ2V0WG1sRWxlbWVudFJlZnMoKSkgewotCQkJU3RyaW5nIHR5cGVOYW1lID0geG1sRWxlbWVudFJlZi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJCWJvb2xlYW4gaXNKYXhiRWxlbWVudCA9IEpBWEIuSkFYQl9FTEVNRU5ULmVxdWFscyh0eXBlTmFtZSk7Ci0JCQlpZiAoISBpc0pheGJFbGVtZW50ICYmIHhtbEVsZW1lbnRSZWZUeXBlcy5jb3VudCh0eXBlTmFtZSkgPiAxKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lIH0sCi0JCQkJCQkJCXhtbEVsZW1lbnRSZWYsCi0JCQkJCQkJCXhtbEVsZW1lbnRSZWYuZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJfQotCQkJCi0JCQlTdHJpbmcgeG1sRWxlbWVudE5hbWVzcGFjZSA9IHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKTsKLQkJCVN0cmluZyB4bWxFbGVtZW50TmFtZSA9IHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCk7Ci0JCQlpZiAoaXNKYXhiRWxlbWVudCAmJiB4bWxFbGVtZW50UmVmUW5hbWVzLmNvdW50KG5ldyBRTmFtZSh4bWxFbGVtZW50TmFtZXNwYWNlLCB4bWxFbGVtZW50TmFtZSkpID4gMSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9FTEVNRU5UX1JFRlNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9RTkFNRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRWxlbWVudE5hbWUgfSwKLQkJCQkJCQkJeG1sRWxlbWVudFJlZiwKLQkJCQkJCQkJeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhtbEVsZW1lbnRSZWYsIEl0ZXJhYmxlPFN0cmluZz4+KGdldFhtbEVsZW1lbnRSZWZzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IHRyYW5zZm9ybShYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYpIHsKLQkJCQkJCXJldHVybiB4bWxFbGVtZW50UmVmLmdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKTsKLQkJCQkJfQotCQkJCX0pOwotCX0KLQkKLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudFJlZkNvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50UmVmLCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFhtbEVsZW1lbnRSZWZzLlhNTF9FTEVNRU5UX1JFRlNfTElTVDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sRWxlbWVudFJlZkFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmcy50aGlzLmJ1aWxkWG1sRWxlbWVudFJlZihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzLnRoaXMuZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZkFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KFhtbEVsZW1lbnRSZWYgY29udGV4dEVsZW1lbnQpIHsKLQkJCS8vIGluIHRoaXMgY29udGV4dCwgdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBYbWxFbGVtZW50UmVmIHdpdGhvdXQgYW4gYW5ub3RhdGlvbgotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldEFubm90YXRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQgewotCQkKLQkJTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbnMoKTsKLQkJCi0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCk7Ci0JCQotCQl2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCk7Ci0JCQotCQl2b2lkIG1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCQotCQlYbWxFbGVtZW50UmVmIGJ1aWxkWG1sRWxlbWVudFJlZihKYXZhQ29udGV4dE5vZGUgcGFyZW50LCBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQkJCi0JCVRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y3ZTdkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWZzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE1peGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBZGFwdGFibGVBdHRyaWJ1dGVNYXBwaW5nPFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbj4KLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50UmVmc01hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxFbGVtZW50UmVmcyB4bWxFbGVtZW50UmVmczsKLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXI7Ci0JCi0JcHJvdGVjdGVkIFhtbE1peGVkIHhtbE1peGVkOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcyA9IGJ1aWxkWG1sRWxlbWVudFJlZnMoKTsKLQkJaW5pdGlhbGl6ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCWluaXRpYWxpemVYbWxNaXhlZCgpOwkJCQotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRlNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxFbGVtZW50V3JhcHBlcigpOwotCQlzeW5jWG1sTWl4ZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy54bWxFbGVtZW50UmVmcy51cGRhdGUoKTsKLQkJdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJdXBkYXRlWG1sTWl4ZWQoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sRWxlbWVudFJlZnMgKioqKioKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZnMgZ2V0WG1sRWxlbWVudFJlZnMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZnMgYnVpbGRYbWxFbGVtZW50UmVmcygpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzKHRoaXMsIG5ldyBYbWxFbGVtZW50UmVmc0NvbnRleHQoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRXcmFwcGVyICoqKioqCi0JCi0JcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRWxlbWVudFdyYXBwZXJfKFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyKSB7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyIG9sZFhtbEVsZW1lbnRXcmFwcGVyID0gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IHhtbEVsZW1lbnRXcmFwcGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFksIG9sZFhtbEVsZW1lbnRXcmFwcGVyLCB4bWxFbGVtZW50V3JhcHBlcik7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyh4bWxFbGVtZW50V3JhcHBlcik7Ci0JCXJldHVybiB4bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIodGhpcywgbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIuU2ltcGxlQ29udGV4dChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmIChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID0gYnVpbGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sRWxlbWVudFdyYXBwZXJfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbEVsZW1lbnRXcmFwcGVyLnVwZGF0ZSgpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqIFhtbE1peGVkICoqKioqCi0JCi0JcHVibGljIFhtbE1peGVkIGdldFhtbE1peGVkKCkgewotCQlyZXR1cm4gdGhpcy54bWxNaXhlZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sTWl4ZWRfKFhtbE1peGVkIHhtbE1peGVkKSB7Ci0JCVhtbE1peGVkIG9sZFhtbE1peGVkID0gdGhpcy54bWxNaXhlZDsKLQkJdGhpcy54bWxNaXhlZCA9IHhtbE1peGVkOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9NSVhFRF9QUk9QRVJUWSwgb2xkWG1sTWl4ZWQsIHhtbE1peGVkKTsKLQl9Ci0JCi0JcHVibGljIFhtbE1peGVkIGFkZFhtbE1peGVkKCkgewotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJCi0JCVhtbE1peGVkIHhtbE1peGVkID0gYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKTsKLQkJc2V0WG1sTWl4ZWRfKHhtbE1peGVkKTsKLQkJcmV0dXJuIHhtbE1peGVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxNaXhlZCgpIHsKLQkJaWYgKHRoaXMueG1sTWl4ZWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlzZXRYbWxNaXhlZF8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxNaXhlZEFubm90YXRpb24gZ2V0WG1sTWl4ZWRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbE1peGVkQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxNaXhlZCBidWlsZFhtbE1peGVkKFhtbE1peGVkQW5ub3RhdGlvbiB4bWxNaXhlZEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbE1peGVkKHRoaXMsIHhtbE1peGVkQW5ub3RhdGlvbik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVYbWxNaXhlZCgpIHsKLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxNaXhlZEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy54bWxNaXhlZCA9IGJ1aWxkWG1sTWl4ZWQoYW5ub3RhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbE1peGVkKCkgewotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbE1peGVkQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxNaXhlZC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRYbWxNaXhlZF8oYnVpbGRYbWxNaXhlZChhbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxNaXhlZF8obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxNaXhlZCgpIHsKLQkJaWYgKHRoaXMueG1sTWl4ZWQgIT0gbnVsbCkgewotCQkJdGhpcy54bWxNaXhlZC51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnMuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnRpY2xlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy54bWxFbGVtZW50UmVmcy5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMueG1sRWxlbWVudFdyYXBwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdGhpcy54bWxFbGVtZW50UmVmcy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxNaXhlZCAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbE1peGVkLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRSZWZzQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzLkNvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmcudGhpcy5nZXRBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IGdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9ucygpIHsKLQkJCXJldHVybiBnZXRYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYWRkWG1sRWxlbWVudFJlZkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkuYWRkWG1sRWxlbWVudFJlZihpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkucmVtb3ZlWG1sRWxlbWVudFJlZihpbmRleCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQkJZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkubW92ZVhtbEVsZW1lbnRSZWYodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRSZWYgYnVpbGRYbWxFbGVtZW50UmVmKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXJldHVybiBuZXcgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmKHBhcmVudCwgbmV3IFhtbEVsZW1lbnRSZWZDb250ZXh0KGFubm90YXRpb24pKTsKLQkJfQotCQkKLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50UmVmQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWYuQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYW5ub3RhdGlvbjsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50UmVmQ29udGV4dChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nLnRoaXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2Y3YzVhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50V3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlFOYW1lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRXcmFwcGVyIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBjb250ZXh0OwotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgcU5hbWU7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTmlsbGFibGU7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIoSmF4YkF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRSZXF1aXJlZCA9IGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKTsKLQkJdGhpcy5zcGVjaWZpZWROaWxsYWJsZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWROaWxsYWJsZSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIGJ1aWxkUU5hbWUoKSB7Ci0JCXJldHVybiBuZXcgWG1sRWxlbWVudFFOYW1lKHRoaXMpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJBdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0SmF4YlR5cGUoKS5nZXRKYXhiUGFja2FnZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHQuZ2V0QW5ub3RhdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnFOYW1lLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc2V0U3BlY2lmaWVkUmVxdWlyZWRfKGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTmlsbGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5xTmFtZS51cGRhdGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc2NoZW1hIGNvbXBvbmVudCByZWYgKioqKioKLQkKLQlwdWJsaWMgSmF4YlFOYW1lIGdldFFOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5xTmFtZTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiogWG1sRWxlbWVudFdyYXBwZXIucmVxdWlyZWQgKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFNwZWNpZmllZFJlcXVpcmVkKCkgPT0gbnVsbCkgPyB0aGlzLmlzRGVmYXVsdFJlcXVpcmVkKCkgOiB0aGlzLmdldFNwZWNpZmllZFJlcXVpcmVkKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFJlcXVpcmVkKCkgewotCQlyZXR1cm4gREVGQVVMVF9SRVFVSVJFRDsKLQl9Ci0JCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlcXVpcmVkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuIG5ld1NwZWNpZmllZFJlcXVpcmVkKSB7Ci0JCWdldEFubm90YXRpb24oKS5zZXRSZXF1aXJlZChuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVxdWlyZWRfKG5ld1NwZWNpZmllZFJlcXVpcmVkKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVxdWlyZWRfKEJvb2xlYW4gbmV3U3BlY2lmaWVkUmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGRSZXF1aXJlZCA9IHRoaXMuc3BlY2lmaWVkUmVxdWlyZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkUmVxdWlyZWQgPSBuZXdTcGVjaWZpZWRSZXF1aXJlZDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVRVUlSRURfUFJPUEVSVFksIG9sZFJlcXVpcmVkLCBuZXdTcGVjaWZpZWRSZXF1aXJlZCk7Ci0JfQotCQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uKCkuZ2V0UmVxdWlyZWQoKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiogIFhtbEVsZW1lbnRXcmFwcGVyLm5pbGxhYmxlICoqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBib29sZWFuIGlzTmlsbGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTcGVjaWZpZWROaWxsYWJsZSgpID09IG51bGwpID8gdGhpcy5pc0RlZmF1bHROaWxsYWJsZSgpIDogdGhpcy5nZXRTcGVjaWZpZWROaWxsYWJsZSgpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROaWxsYWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTklMTEFCTEU7Ci0JfQotCQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROaWxsYWJsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmlsbGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWROaWxsYWJsZSkgewotCQlnZXRBbm5vdGF0aW9uKCkuc2V0TmlsbGFibGUobmV3U3BlY2lmaWVkTmlsbGFibGUpOwotCQl0aGlzLnNldFNwZWNpZmllZE5pbGxhYmxlXyhuZXdTcGVjaWZpZWROaWxsYWJsZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5pbGxhYmxlXyhCb29sZWFuIG5ld1NwZWNpZmllZE5pbGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkTmlsbGFibGUgPSB0aGlzLnNwZWNpZmllZE5pbGxhYmxlOwotCQl0aGlzLnNwZWNpZmllZE5pbGxhYmxlID0gbmV3U3BlY2lmaWVkTmlsbGFibGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05JTExBQkxFX1BST1BFUlRZLCBvbGROaWxsYWJsZSwgbmV3U3BlY2lmaWVkTmlsbGFibGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE5pbGxhYmxlKCkgewotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldE5pbGxhYmxlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbWlzYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WHNkRWxlbWVudERlY2xhcmF0aW9uKCkgewotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldENsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiAoeHNkVHlwZSA9PSBudWxsKSA/IG51bGwgOiB4c2RUeXBlLmdldEVsZW1lbnQodGhpcy5xTmFtZS5nZXROYW1lc3BhY2UoKSwgdGhpcy5xTmFtZS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXN1bHQgPSB0aGlzLnFOYW1lLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlpZiAoISBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0VMRU1FTlRfV1JBUFBFUl9ERUZJTkVEX09OX05PTl9BUlJBWV9OT05fQ09MTEVDVElPTiwKLQkJCQkJdGhpcywKLQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQl2YWxpZGF0ZVFOYW1lKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5xTmFtZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCQotCXB1YmxpYyBpbnRlcmZhY2UgQ29udGV4dCB7Ci0JCQotCQkvKioKLQkJICogVGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQkgKi8KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIENvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uOwotCQkKLQkJcHVibGljIFNpbXBsZUNvbnRleHQoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmFubm90YXRpb247Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudFFOYW1lKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgbmV3IFFOYW1lQW5ub3RhdGlvblByb3h5KCkpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLnRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCQlyZXR1cm4gIiI7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0JCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IHRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJCXJldHVybiAoamF4YlBhY2thZ2UgIT0gbnVsbCAmJiBqYXhiUGFja2FnZS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSA9PSBYbWxOc0Zvcm0uUVVBTElGSUVEKSA/Ci0JCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIudGhpcy5nZXRKYXhiQ2xhc3NNYXBwaW5nKCkuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSA6ICIiOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUgPSBHZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLnRoaXMuZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKHhzZFR5cGUgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCkgOiB4c2RUeXBlLmdldEVsZW1lbnROYW1lUHJvcG9zYWxzKGdldE5hbWVzcGFjZSgpLCBmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlyZXR1cm4gKHNjaGVtYSA9PSBudWxsKSA/IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpIDogc2NoZW1hLmdldE5hbWVzcGFjZVByb3Bvc2FscyhmaWx0ZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29tcG9uZW50VHlwZURlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIEpwdEpheGJDb3JlTWVzc2FnZXMuWE1MX0VMRU1FTlRfREVTQzsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVmZXJlbmNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlYc2RUeXBlRGVmaW5pdGlvbiB0eXBlID0gZ2V0SmF4YkNsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAodHlwZS5nZXRFbGVtZW50KGdldE5hbWVzcGFjZSgpLCBnZXROYW1lKCkpID09IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQoZ2V0VW5yZXNvbHZlU2NoZW1hQ29tcG9uZW50TWVzc2FnZShhc3RSb290KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFFOYW1lQW5ub3RhdGlvblByb3h5IAotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZS5BYnN0cmFjdFFOYW1lQW5ub3RhdGlvblByb3h5IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUU5hbWVBbm5vdGF0aW9uIGdldEFubm90YXRpb24oYm9vbGVhbiBjcmVhdGVJZk51bGwpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyLnRoaXMuZ2V0QW5ub3RhdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzYjQ4ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuSGFzaEJhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSURSRUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxJRFJFRi5WYWxpZGF0YWJsZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudHNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJRFJFRkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUFkYXB0YWJsZUF0dHJpYnV0ZU1hcHBpbmc8WG1sRWxlbWVudHNBbm5vdGF0aW9uPiAKLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50c01hcHBpbmcgewotCQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50LCBYbWxFbGVtZW50QW5ub3RhdGlvbj4geG1sRWxlbWVudENvbnRhaW5lcjsKLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXI7Ci0JCi0JcHJvdGVjdGVkIFhtbElEUkVGIHhtbElEUkVGOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbGVtZW50Q29udGFpbmVyID0gYnVpbGRYbWxFbGVtZW50Q29udGFpbmVyKCk7Ci0JCWluaXRpYWxpemVYbWxFbGVtZW50V3JhcHBlcigpOwotCQlpbml0aWFsaXplWG1sSURSRUYoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVFNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVFM7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnhtbEVsZW1lbnRDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJc3luY1htbElEUkVGKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMueG1sRWxlbWVudENvbnRhaW5lci51cGRhdGUoKTsKLQkJdXBkYXRlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJdXBkYXRlWG1sSURSRUYoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogeG1sIGVsZW1lbnRzICoqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxYbWxFbGVtZW50PiBnZXRYbWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxFbGVtZW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudCBhZGRYbWxFbGVtZW50KGludCBpbmRleCkgewotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0QW5ub3RhdGlvbigpLmFkZFhtbEVsZW1lbnQoaW5kZXgpOwotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50Q29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJZ2V0QW5ub3RhdGlvbigpLnJlbW92ZVhtbEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLnhtbEVsZW1lbnRDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50KFhtbEVsZW1lbnQgeG1sRWxlbWVudCkgewotCQlyZW1vdmVYbWxFbGVtZW50KHRoaXMueG1sRWxlbWVudENvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sRWxlbWVudCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlWG1sRWxlbWVudChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlnZXRBbm5vdGF0aW9uKCkubW92ZVhtbEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxFbGVtZW50Q29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBidWlsZFhtbEVsZW1lbnQoWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVhtbEVsZW1lbnQodGhpcywgbmV3IFhtbEVsZW1lbnRDb250ZXh0KHhtbEVsZW1lbnRBbm5vdGF0aW9uKSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sRWxlbWVudEFubm90YXRpb24+IGdldFhtbEVsZW1lbnRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRYbWxFbGVtZW50cygpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxFbGVtZW50V3JhcHBlciAqKioqKgotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBnZXRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFdyYXBwZXI7Ci0JfQotCQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlciBhZGRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJWG1sRWxlbWVudFdyYXBwZXIgeG1sRWxlbWVudFdyYXBwZXIgPSBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyh4bWxFbGVtZW50V3JhcHBlcik7Ci0JCXJldHVybiB4bWxFbGVtZW50V3JhcHBlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmICh0aGlzLnhtbEVsZW1lbnRXcmFwcGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRWxlbWVudFdyYXBwZXJfKFhtbEVsZW1lbnRXcmFwcGVyIHhtbEVsZW1lbnRXcmFwcGVyKSB7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyIG9sZFhtbEVsZW1lbnRXcmFwcGVyID0gdGhpcy54bWxFbGVtZW50V3JhcHBlcjsKLQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IHhtbEVsZW1lbnRXcmFwcGVyOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9FTEVNRU5UX1dSQVBQRVJfUFJPUEVSVFksIG9sZFhtbEVsZW1lbnRXcmFwcGVyLCB4bWxFbGVtZW50V3JhcHBlcik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIodGhpcywgbmV3IEdlbmVyaWNKYXZhWG1sRWxlbWVudFdyYXBwZXIuU2ltcGxlQ29udGV4dChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlpZiAoZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlciA9IGJ1aWxkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sRWxlbWVudFdyYXBwZXIoKSB7Ci0JCWlmIChnZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxFbGVtZW50V3JhcHBlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRYbWxFbGVtZW50V3JhcHBlcl8oYnVpbGRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbEVsZW1lbnRXcmFwcGVyXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci51cGRhdGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxYbWxFbGVtZW50LCBYbWxFbGVtZW50QW5ub3RhdGlvbj4gYnVpbGRYbWxFbGVtZW50Q29udGFpbmVyKCkgewotCQlYbWxFbGVtZW50Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBYbWxFbGVtZW50Q29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbElEUkVGICoqKioqCi0JCi0JcHVibGljIFhtbElEUkVGIGdldFhtbElEUkVGKCkgewotCQlyZXR1cm4gdGhpcy54bWxJRFJFRjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sSURSRUZfKFhtbElEUkVGIHhtbElEUkVGKSB7Ci0JCVhtbElEUkVGIG9sZFhtbElEUkVGID0gdGhpcy54bWxJRFJFRjsKLQkJdGhpcy54bWxJRFJFRiA9IHhtbElEUkVGOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9JRFJFRl9QUk9QRVJUWSwgb2xkWG1sSURSRUYsIHhtbElEUkVGKTsKLQl9Ci0JCi0JcHVibGljIFhtbElEUkVGIGFkZFhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCVhtbElEUkVGIHhtbElEUkVGID0gYnVpbGRYbWxJRFJFRigpOwotCQlzZXRYbWxJRFJFRl8oeG1sSURSRUYpOwotCQlyZXR1cm4geG1sSURSRUY7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCXNldFhtbElEUkVGXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVhtbElEUkVGKCkgewotCQlpZiAoZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJdGhpcy54bWxJRFJFRiA9IGJ1aWxkWG1sSURSRUYoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sSURSRUYoKSB7Ci0JCWlmIChnZXRYbWxJRFJFRkFubm90YXRpb24oKSA9PSBudWxsKSB7Ci0JCQlzZXRYbWxJRFJFRl8obnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy54bWxJRFJFRiA9PSBudWxsKSB7Ci0JCQlzZXRYbWxJRFJFRl8oYnVpbGRYbWxJRFJFRigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMueG1sSURSRUYuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVhtbElEUkVGKCkgewotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbElEUkVGLnVwZGF0ZSgpOwotCQl9Ci0JfQotCXByb3RlY3RlZCBYbWxJRFJFRkFubm90YXRpb24gZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbElEUkVGQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxJRFJFRiBidWlsZFhtbElEUkVGKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhWG1sSURSRUYodGhpcywgYnVpbGRYbWxJRFJFRkNvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxJRFJFRkNvbnRleHQgYnVpbGRYbWxJRFJFRkNvbnRleHQoKSB7Ci0JCXJldHVybiBuZXcgWG1sSURSRUZDb250ZXh0KCk7Ci0JfQotCQotCQotCS8vICoqKioqIG1pc2MgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZWZlcmVuY2VkWG1sVHlwZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpLAotCQkJCW5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WG1sRWxlbWVudCwgSXRlcmFibGU8U3RyaW5nPj4oZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IHRyYW5zZm9ybShYbWxFbGVtZW50IG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8uZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpOwotCQkJCQkJCX0KLQkJCQkJCX0pKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0aWNsZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWZvciAoWG1sRWxlbWVudCB4bWxFbGVtZW50IDogZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJcmVzdWx0ID0geG1sRWxlbWVudC5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdGhpcy54bWxFbGVtZW50V3JhcHBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl2YWxpZGF0ZUR1cGxpY2F0ZVR5cGVzQW5kUU5hbWVzKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlmb3IgKFhtbEVsZW1lbnQgeG1sRWxlbWVudCA6IGdldFhtbEVsZW1lbnRzKCkpIHsKLQkJCXhtbEVsZW1lbnQudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQkKLQkJaWYgKHRoaXMueG1sRWxlbWVudFdyYXBwZXIgIT0gbnVsbCkgewotCQkJdGhpcy54bWxFbGVtZW50V3JhcHBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCQotCQlpZiAodGhpcy54bWxJRFJFRiAhPSBudWxsKSB7Ci0JCQl0aGlzLnhtbElEUkVGLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEdXBsaWNhdGVUeXBlc0FuZFFOYW1lcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlCYWc8U3RyaW5nPiB4bWxFbGVtZW50VHlwZXMgPSBuZXcgSGFzaEJhZzxTdHJpbmc+KCk7Ci0JCUJhZzxRTmFtZT4geG1sRWxlbWVudFFOYW1lcyA9IG5ldyBIYXNoQmFnPFFOYW1lPigpOwotCQkKLQkJZm9yIChYbWxFbGVtZW50IHhtbEVsZW1lbnQgOiBnZXRYbWxFbGVtZW50cygpKSB7Ci0JCQlTdHJpbmcgdHlwZU5hbWUgPSB4bWxFbGVtZW50LmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0eXBlTmFtZSkpIHsKLQkJCQl4bWxFbGVtZW50VHlwZXMuYWRkKHR5cGVOYW1lKTsKLQkJCX0KLQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCk7Ci0JCQlpZiAoISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGVsZW1lbnROYW1lKSkgewotCQkJCXhtbEVsZW1lbnRRTmFtZXMuYWRkKG5ldyBRTmFtZSh4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCksIGVsZW1lbnROYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoWG1sRWxlbWVudCB4bWxFbGVtZW50IDogZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJdmFsaWRhdGVEdXBsaWNhdGVUeXBlKHhtbEVsZW1lbnQsIHhtbEVsZW1lbnRUeXBlcywgbWVzc2FnZXMsIGFzdFJvb3QpOwotCQkJdmFsaWRhdGVEdXBsaWNhdGVRTmFtZSh4bWxFbGVtZW50LCB4bWxFbGVtZW50UU5hbWVzLCBtZXNzYWdlcywgYXN0Um9vdCk7CQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlVHlwZShYbWxFbGVtZW50IHhtbEVsZW1lbnQsIEJhZzxTdHJpbmc+IHhtbEVsZW1lbnRUeXBlcywKLQkJCQlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nIHhtbEVsZW1lbnRUeXBlID0geG1sRWxlbWVudC5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJaWYgKHhtbEVsZW1lbnRUeXBlcy5jb3VudCh4bWxFbGVtZW50VHlwZSkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHhtbEVsZW1lbnRUeXBlIH0sCi0JCQkJCQkJeG1sRWxlbWVudCwKLQkJCQkJCQl4bWxFbGVtZW50LmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUR1cGxpY2F0ZVFOYW1lKFhtbEVsZW1lbnQgeG1sRWxlbWVudCwgQmFnPFFOYW1lPiB4bWxFbGVtZW50UU5hbWVzLAotCQkJCUxpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmcgeG1sRWxlbWVudE5hbWVzcGFjZSA9IHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKTsKLQkJU3RyaW5nIHhtbEVsZW1lbnROYW1lID0geG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJaWYgKHhtbEVsZW1lbnRRTmFtZXMuY291bnQobmV3IFFOYW1lKHhtbEVsZW1lbnROYW1lc3BhY2UsIHhtbEVsZW1lbnROYW1lKSkgPiAxKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9RTkFNRSwKLQkJCQkJCQluZXcgU3RyaW5nW10geyB4bWxFbGVtZW50TmFtZSB9LAotCQkJCQkJCXhtbEVsZW1lbnQsCi0JCQkJCQkJeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRDb250YWluZXIKLQkJCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8WG1sRWxlbWVudCwgWG1sRWxlbWVudEFubm90YXRpb24+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBYbWxFbGVtZW50c01hcHBpbmcuWE1MX0VMRU1FTlRTX0xJU1Q7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudCBidWlsZENvbnRleHRFbGVtZW50KFhtbEVsZW1lbnRBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuYnVpbGRYbWxFbGVtZW50KHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudEFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudEFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KFhtbEVsZW1lbnQgY29udGV4dEVsZW1lbnQpIHsKLQkJCS8vIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgbWFwcGluZywgdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBYbWxFbGVtZW50IHdpdGhvdXQgYW4gYW5ub3RhdGlvbgotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldEFubm90YXRpb24oZmFsc2UpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50Q29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbEVsZW1lbnQuQ29udGV4dCB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbjsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50Q29udGV4dChYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCkgewotCQkJLy8gd2lsbCBuZXZlciBiZSBudWxsIGluIHRoaXMgY29udGV4dAotCQkJcmV0dXJuIGFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFR5cGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyIGdldEVsZW1lbnRXcmFwcGVyKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sSUQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbElEUkVGKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUYoKSAhPSBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxMaXN0KCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBoYXNYbWxTY2hlbWFUeXBlKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlwdWJsaWMgWG1sU2NoZW1hVHlwZSBnZXRYbWxTY2hlbWFUeXBlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbElEUkVGQ29udGV4dAotCQkJaW1wbGVtZW50cyBHZW5lcmljSmF2YVhtbElEUkVGLkNvbnRleHQgewotCQkKLQkJcHVibGljIFhtbElEUkVGQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sSURSRUZBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBJdGVyYWJsZTxWYWxpZGF0YWJsZVJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlcygpIHsKLQkJCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYbWxFbGVtZW50LCBWYWxpZGF0YWJsZVJlZmVyZW5jZT4oCi0JCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudHMoKSkgewotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBWYWxpZGF0YWJsZVJlZmVyZW5jZSB0cmFuc2Zvcm0oZmluYWwgWG1sRWxlbWVudCBvKSB7Ci0JCQkJCQotCQkJCQlyZXR1cm4gbmV3IFZhbGlkYXRhYmxlUmVmZXJlbmNlKCkgewotCQkJCQkJCi0JCQkJCQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJCQkJCQlyZXR1cm4gby5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkJCQkJcmV0dXJuIG8uZ2V0VHlwZVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJcHVibGljIFhzZEZlYXR1cmUgZ2V0WHNkRmVhdHVyZSgpIHsKLQkJCQkJCQlyZXR1cm4gby5nZXRYc2RFbGVtZW50KCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0WHNkRmVhdHVyZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJCQkJCXJldHVybiBvLmdldFFOYW1lKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0xpc3QoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxJRC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBiYWJmNS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5hbWVkTm9kZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxJRAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFhtbElECi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgWG1sSURBbm5vdGF0aW9uIHJlc291cmNlWG1sSUQ7Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxJRChYbWxOYW1lZE5vZGVNYXBwaW5nIHBhcmVudCwgWG1sSURBbm5vdGF0aW9uIHJlc291cmNlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VYbWxJRCA9IHJlc291cmNlOwotCX0KLQkKLQkKLQlwdWJsaWMgWG1sTmFtZWROb2RlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gKFhtbE5hbWVkTm9kZU1hcHBpbmcpIGdldFBhcmVudCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKCEgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzSmF2YVJlc291cmNlQXR0cmlidXRlVHlwZVN1YlR5cGVPZihTdHJpbmcuY2xhc3MuZ2V0TmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9JRF9fQVRUUklCVVRFX1RZUEVfTk9UX1NUUklORywKLQkJCQkJdGhpcywKLQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQlYc2RGZWF0dXJlIHhzZEZlYXR1cmUgPSBnZXRNYXBwaW5nKCkuZ2V0WHNkRmVhdHVyZSgpOwotCQlpZiAoeHNkRmVhdHVyZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVhzZFR5cGVEZWZpbml0aW9uIGlkcmVmVHlwZSA9IFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb24oIklEIik7Ci0JCWlmICghIHhzZEZlYXR1cmUudHlwZUlzVmFsaWQoaWRyZWZUeXBlLCBmYWxzZSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSURfX1NDSEVNQV9UWVBFX05PVF9JRCwKLQkJCQkJCW5ldyBTdHJpbmcgW10geyB4c2RGZWF0dXJlLmdldE5hbWUoKSB9LAotCQkJCQkJdGhpcywKLQkJCQkJCWdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVhtbElELmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxJRFJFRi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sSURSRUYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzYThlYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxJRFJFRi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSURSRUY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEUkVGQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sSURSRUYKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbElEUkVGIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dCBjb250ZXh0OwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbElEUkVGKEpheGJBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YkF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb250ZXh0LmdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlmb3IgKFZhbGlkYXRhYmxlUmVmZXJlbmNlIHJlZiA6IHRoaXMuY29udGV4dC5nZXRSZWZlcmVuY2VzKCkpIHsKLQkJCVN0cmluZyB0eXBlTmFtZSA9IHJlZi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJCQotCQkJLy8gT2JqZWN0IG1heSBiZSB1c2VkIGluIHNvbWUgY2FzZXMgb2YgYSAqc2luZ2xlKiB0eXBlLCBidXQgY2FuJ3QgYmUgdmFsaWRhdGVkCi0JCQlpZiAoISAoT2JqZWN0LmNsYXNzLmdldE5hbWUoKS5lcXVhbHModHlwZU5hbWUpICYmIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuY29udGV4dC5nZXRSZWZlcmVuY2VzKCkpID09IDEpKSB7Ci0JCQkJCQotCQkJCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRDbGFzc01hcHBpbmcodHlwZU5hbWUpOwotCQkJCWlmIChjbGFzc01hcHBpbmcgPT0gbnVsbCB8fCBjbGFzc01hcHBpbmcuZ2V0WG1sSWRNYXBwaW5nKCkgPT0gbnVsbCkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX0lEX1JFRl9fVFlQRV9ET0VTX05PVF9DT05UQUlOX1hNTF9JRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7IHR5cGVOYW1lIH0sCi0JCQkJCQl0aGlzLAotCQkJCQkJcmVmLmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCkpKTsJCQkJCi0JCQkJfQotCQkJfQotCQkJCi0JCQlYc2RGZWF0dXJlIHhzZEZlYXR1cmUgPSByZWYuZ2V0WHNkRmVhdHVyZSgpOwotCQkJaWYgKHhzZEZlYXR1cmUgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICh4c2RGZWF0dXJlICE9IG51bGwgCi0JCQkJCSYmICEgeHNkRmVhdHVyZS50eXBlSXNWYWxpZChYc2RVdGlsLmdldFNjaGVtYUZvclNjaGVtYSgpLmdldFR5cGVEZWZpbml0aW9uKCJJRFJFRiIpLCB0aGlzLmNvbnRleHQuaXNMaXN0KCkpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9JRF9SRUZfX1NDSEVNQV9UWVBFX05PVF9JRFJFRiwKLQkJCQkJCQluZXcgU3RyaW5nIFtdIHsgeHNkRmVhdHVyZS5nZXROYW1lKCkgfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXJlZi5nZXRYc2RGZWF0dXJlVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBDb250ZXh0IHsKLQkJCi0JCVhtbElEUkVGQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCk7Ci0JCQotCQlJdGVyYWJsZTxWYWxpZGF0YWJsZVJlZmVyZW5jZT4gZ2V0UmVmZXJlbmNlcygpOwotCQkKLQkJYm9vbGVhbiBpc0xpc3QoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBWYWxpZGF0YWJsZVJlZmVyZW5jZSB7Ci0JCQotCQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCQotCQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCQotCQlYc2RGZWF0dXJlIGdldFhzZEZlYXR1cmUoKTsKLQkJCi0JCVRleHRSYW5nZSBnZXRYc2RGZWF0dXJlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxNaXhlZC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sTWl4ZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5OGViZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxNaXhlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTWl4ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sTWl4ZWQKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIFhtbE1peGVkIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgWG1sTWl4ZWRBbm5vdGF0aW9uIHJlc291cmNlWG1sTWl4ZWQ7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sTWl4ZWQoSmF4YkF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBYbWxNaXhlZEFubm90YXRpb24gcmVzb3VyY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZVhtbE1peGVkID0gcmVzb3VyY2U7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YkF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlWG1sTWl4ZWQuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbE5zLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxOcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTM1ZWVhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbE5zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxOcwotCWV4dGVuZHMgQWJzdHJhY3RKYXhiQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFhtbE5zCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgWG1sTnNBbm5vdGF0aW9uIHJlc291cmNlWG1sTnM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQotCXByb3RlY3RlZCBTdHJpbmcgcHJlZml4OwotCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sTnMoWG1sU2NoZW1hIHBhcmVudCwgWG1sTnNBbm5vdGF0aW9uIHhtbE5zQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlWG1sTnMgPSB4bWxOc0Fubm90YXRpb247Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gdGhpcy5nZXRSZXNvdXJjZU5hbWVzcGFjZVVSSSgpOwotCQl0aGlzLnByZWZpeCA9IHRoaXMuZ2V0UmVzb3VyY2VQcmVmaXgoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sTnNBbm5vdGF0aW9uIGdldFJlc291cmNlWG1sTnMoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlWG1sTnM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldE5hbWVzcGFjZVVSSV8odGhpcy5nZXRSZXNvdXJjZU5hbWVzcGFjZVVSSSgpKTsKLQkJdGhpcy5zZXRQcmVmaXhfKHRoaXMuZ2V0UmVzb3VyY2VQcmVmaXgoKSk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YlBhY2thZ2VJbmZvIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXhiUGFja2FnZUluZm8pIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlIGdldFJlc291cmNlUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldFBhcmVudCgpLmdldFJlc291cmNlUGFja2FnZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lc3BhY2VVUkkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZVVSSTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZSkgewotCQl0aGlzLnJlc291cmNlWG1sTnMuc2V0TmFtZXNwYWNlVVJJKG5hbWVzcGFjZSk7Ci0JCXRoaXMuc2V0TmFtZXNwYWNlVVJJXyhuYW1lc3BhY2UpOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUklfKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlVVJJOwotCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9VUklfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlVVJJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlTmFtZXNwYWNlVVJJKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVhtbE5zLmdldE5hbWVzcGFjZVVSSSgpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJlZml4ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gdGhpcy5wcmVmaXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLQkJdGhpcy5yZXNvdXJjZVhtbE5zLnNldFByZWZpeChwcmVmaXgpOwotCQl0aGlzLnNldFByZWZpeF8ocHJlZml4KTsJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJlZml4XyhTdHJpbmcgcHJlZml4KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnByZWZpeDsKLQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQUkVGSVhfUFJPUEVSVFksIG9sZCwgcHJlZml4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlUHJlZml4KCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVhtbE5zLmdldFByZWZpeCgpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWVzcGFjZVVSSSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sUmVnaXN0cnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjdiNjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbGVtZW50RmFjdG9yeU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUmVnaXN0cnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxSZWdpc3RyeQotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sUmVnaXN0cnkgewotCi0JcHJvdGVjdGVkIGZpbmFsIEVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyIGVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFJlZ2lzdHJ5KEpheGJDbGFzcyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5lbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lciA9IG5ldyBFbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lcigpOwotCQkKLQkJaW5pdEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF4YkNsYXNzIGdldEpheGJDbGFzcygpIHsKLQkJcmV0dXJuIChKYXhiQ2xhc3MpIGdldFBhcmVudCgpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gZ2V0SmF4YkNsYXNzKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUmVnaXN0cnlBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sUmVnaXN0cnlBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGFja2FnZSBnZXRKYXhiUGFja2FnZSgpIHsKLQkJcmV0dXJuIGdldEpheGJDbGFzcygpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY0VsZW1lbnRGYWN0b3J5TWV0aG9kcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl1cGRhdGVFbGVtZW50RmFjdG9yeU1ldGhvZHMoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZWxlbWVudCBmYWN0b3J5IG1ldGhvZHMgKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBnZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpIHsKLQkJdGhpcy5lbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lci5pbml0aWFsaXplKCk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jRWxlbWVudEZhY3RvcnlNZXRob2RzKCkgewotCQl0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRWxlbWVudEZhY3RvcnlNZXRob2RzKCkgewotCQl0aGlzLmVsZW1lbnRGYWN0b3J5TWV0aG9kQ29udGFpbmVyLnVwZGF0ZSgpOwkKLQl9Ci0JCi0JcHJpdmF0ZSBKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgYnVpbGRFbGVtZW50RmFjdG9yeU1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKLQkJcmV0dXJuIGdldEZhY3RvcnkoKS5idWlsZEphdmFFbGVtZW50RmFjdG9yeU1ldGhvZCh0aGlzLCByZXNvdXJjZU1ldGhvZCk7Ci0JfQotCQotCXByaXZhdGUgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRSZXNvdXJjZUVsZW1lbnRGYWN0b3J5TWV0aG9kcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+KGdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKLQkJCQlyZXR1cm4gbWV0aG9kSXNFbGVtZW50RmFjdG9yeU1ldGhvZChtZXRob2QpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvLyBSZXR1cm4gbWV0aG9kcyB3aXRoIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gbWV0aG9kSXNFbGVtZW50RmFjdG9yeU1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBtZXRob2RIYXNYbWxFbGVtZW50RGVjbEFubm90YXRpb24obWV0aG9kKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc1htbEVsZW1lbnREZWNsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBtZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpICE9IG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBtZXRob2RSZXR1cm5UeXBlSXNKQVhCRWxlbWVudChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7Ci0JCXJldHVybiBtZXRob2QudHlwZUlzU3ViVHlwZU9mKEpBWEIuWE1MX0VMRU1FTlQpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKgotCQotCSBAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlmb3IgKEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlZm0gOiBnZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSkgewotCQkJcmVzdWx0ID0gZWZtLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IGdldEpheGJDbGFzcygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl2YWxpZGF0ZUR1cGxpY2F0ZVFOYW1lcyhtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJZm9yIChKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWZtIDogZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkpIHsKLQkJCWVmbS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlUU5hbWVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQotCQlNYXA8U3RyaW5nLCBCYWc8UU5hbWU+PiB4bWxFbGVtZW50RGVjbFFuYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQmFnPFFOYW1lPj4oKTsKLQkJCi0JCWZvciAoSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIHhtbEVsZW1lbnREZWNsIDogZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkpIHsKLQkJCVN0cmluZyBlbGVtZW50RGVjbE5hbWUgPSB4bWxFbGVtZW50RGVjbC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZWxlbWVudERlY2xOYW1lKSkgewotCQkJCVN0cmluZyBmcVNjb3BlID0geG1sRWxlbWVudERlY2wuZ2V0RnVsbHlRdWFsaWZpZWRTY29wZSgpOwotCQkJCWlmICh4bWxFbGVtZW50RGVjbFFuYW1lcy5nZXQoZnFTY29wZSkgPT0gbnVsbCkgewotCQkJCQl4bWxFbGVtZW50RGVjbFFuYW1lcy5wdXQoZnFTY29wZSwgbmV3IEhhc2hCYWc8UU5hbWU+KCkpOwotCQkJCX0KLQkJCQl4bWxFbGVtZW50RGVjbFFuYW1lcy5nZXQoZnFTY29wZSkuYWRkKG5ldyBRTmFtZSh4bWxFbGVtZW50RGVjbC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpLCBlbGVtZW50RGVjbE5hbWUpKTsKLQkJCX0KLQkJfQotCQkKLQkJZm9yIChKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgeG1sRWxlbWVudERlY2wgOiBnZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSkgewotCQkJU3RyaW5nIGZxU2NvcGUgPSB4bWxFbGVtZW50RGVjbC5nZXRGdWxseVF1YWxpZmllZFNjb3BlKCk7Ci0JCQlTdHJpbmcgeG1sRWxlbWVudE5hbWVzcGFjZSA9IHhtbEVsZW1lbnREZWNsLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCQlTdHJpbmcgeG1sRWxlbWVudE5hbWUgPSB4bWxFbGVtZW50RGVjbC5nZXRRTmFtZSgpLmdldE5hbWUoKTsKLQkJCWlmICh4bWxFbGVtZW50RGVjbFFuYW1lcy5nZXQoZnFTY29wZSkuY291bnQobmV3IFFOYW1lKHhtbEVsZW1lbnROYW1lc3BhY2UsIHhtbEVsZW1lbnROYW1lKSkgPiAxKSB7Ci0JCQkJU3RyaW5nIHNjb3BlRGVzYyA9ICIiOwotCQkJCWlmICghIEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZC5ERUZBVUxUX1NDT1BFX0NMQVNTX05BTUUuZXF1YWxzKGZxU2NvcGUpKSB7Ci0JCQkJCXNjb3BlRGVzYyA9IE5MUy5iaW5kKEpwdEpheGJDb3JlTWVzc2FnZXMuWE1MX0VMRU1FTlRfREVDTF9fU0NPUEUsIGZxU2NvcGUpOwotCQkJCX0KLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfUkVHSVNUUllfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9RTkFNRSwKLQkJCQkJCQkJbmV3IFN0cmluZ1tdIHsgeG1sRWxlbWVudE5hbWUsIHNjb3BlRGVzYyB9LAotCQkJCQkJCQl4bWxFbGVtZW50RGVjbCwKLQkJCQkJCQkJeG1sRWxlbWVudERlY2wuZ2V0UU5hbWUoKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogZWxlbWVudCBmYWN0b3J5IG1ldGhvZCBjb250YWluZXIgYWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBFbGVtZW50RmFjdG9yeU1ldGhvZENvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QsIEphdmFSZXNvdXJjZU1ldGhvZD4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFhtbFJlZ2lzdHJ5LkVMRU1FTlRfRkFDVE9SWV9NRVRIT0RTX0NPTExFQ1RJT047Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGJ1aWxkQ29udGV4dEVsZW1lbnQoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sUmVnaXN0cnkudGhpcy5idWlsZEVsZW1lbnRGYWN0b3J5TWV0aG9kKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sUmVnaXN0cnkudGhpcy5nZXRSZXNvdXJjZUVsZW1lbnRGYWN0b3J5TWV0aG9kcygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZU1ldGhvZCBnZXRSZXNvdXJjZUVsZW1lbnQoSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTQ3NjM5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJRTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sUm9vdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuUU5hbWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxSb290RWxlbWVudAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sUm9vdEVsZW1lbnQgewotCQotCXByb3RlY3RlZCBmaW5hbCBYbWxSb290RWxlbWVudEFubm90YXRpb24gYW5ub3RhdGlvbjsKLQkKLQlwcm90ZWN0ZWQgSmF4YlFOYW1lIHFOYW1lOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50KEpheGJUeXBlTWFwcGluZyBwYXJlbnQsIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiByZXNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFubm90YXRpb24gPSByZXNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLQkJdGhpcy5xTmFtZSA9IGJ1aWxkUU5hbWUoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBidWlsZFFOYW1lKCkgewotCQlyZXR1cm4gbmV3IFhtbFJvb3RFbGVtZW50UU5hbWUodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBKYXhiVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoSmF4YlR5cGVNYXBwaW5nKSBnZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJUeXBlIGdldEpheGJUeXBlKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRKYXhiVHlwZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCXJldHVybiBnZXRKYXhiVHlwZSgpLmdldEpheGJQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5xTmFtZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucU5hbWUudXBkYXRlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHNjaGVtYSBlbGVtZW50IHJlZiAqKioqKgotCQotCXB1YmxpYyBKYXhiUU5hbWUgZ2V0UU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnFOYW1lOwotCX0KLQkJCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBjb250ZW50IGFzc2lzdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy5xTmFtZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCXRoaXMucU5hbWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKioqKioqKiogbWlzY2VsbGFuZW91cyAqKioqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCh0aGlzLnFOYW1lLnRvU3RyaW5nKCkpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUm9vdEVsZW1lbnRRTmFtZQotCQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFRTmFtZSB7Ci0JCQotCQlwcm90ZWN0ZWQgWG1sUm9vdEVsZW1lbnRRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5ldyBRTmFtZUFubm90YXRpb25Qcm94eSgpKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC50aGlzLmdldEpheGJQYWNrYWdlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0JCQlKYXhiUGFja2FnZSBqYXhiUGFja2FnZSA9IHRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJCXJldHVybiAoamF4YlBhY2thZ2UgPT0gbnVsbCkgPyBudWxsIDogamF4YlBhY2thZ2UuZ2V0TmFtZXNwYWNlKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQkJcmV0dXJuIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC50aGlzLmdldEpheGJUeXBlKCkuZ2V0U2ltcGxlTmFtZSgpKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCXJldHVybiBzY2hlbWEuZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIHNjaGVtYS5nZXRFbGVtZW50TmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLlhNTF9FTEVNRU5UX0RFU0M7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVJlZmVyZW5jZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JCQlTdHJpbmcgbmFtZXNwYWNlID0gZ2V0TmFtZXNwYWNlKCk7Ci0JCQlYc2RTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXRYc2RTY2hlbWEoKTsKLQkJCQotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJLy8gZWxlbWVudCBtdXN0IHJlc29sdmUKLQkJCQlYc2RFbGVtZW50RGVjbGFyYXRpb24gc2NoZW1hRWxlbWVudCA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb24obmFtZXNwYWNlLCBuYW1lKTsKLQkJCQlpZiAoc2NoZW1hRWxlbWVudCA9PSBudWxsKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZChnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGVsZW1lbnQgdHlwZSBtdXN0IGFncmVlIHdpdGggcGFyZW50J3Mgc2NoZW1hIHR5cGUKLQkJCQkJWHNkVHlwZURlZmluaXRpb24gc2NoZW1hVHlwZSA9IEdlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnQudGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQkJCWlmIChzY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCQkJCWlmICghIHNjaGVtYVR5cGUuZXF1YWxzKHNjaGVtYUVsZW1lbnQuZ2V0VHlwZSgpKSkgewotCQkJCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQkJCURlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfUk9PVF9FTEVNRU5UX1RZUEVfQ09ORkxJQ1RTX1dJVEhfWE1MX1RZUEUsCi0JCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtuYW1lLCBuYW1lc3BhY2V9LAotCQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBRTmFtZUFubm90YXRpb25Qcm94eSAKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUuQWJzdHJhY3RRTmFtZUFubm90YXRpb25Qcm94eSB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFFOYW1lQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKGJvb2xlYW4gY3JlYXRlSWZOdWxsKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxSb290RWxlbWVudC50aGlzLmFubm90YXRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWEuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQxMjU4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5TY2hlbWFFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERm9ybTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sU2NoZW1hCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBYbWxTY2hlbWEgewotCQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZXNwYWNlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb247Ci0JCi0JcHJvdGVjdGVkIFhtbE5zRm9ybSBzcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdDsKLQkKLQlwcm90ZWN0ZWQgWG1sTnNGb3JtIHNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8WG1sTnMsIFhtbE5zQW5ub3RhdGlvbj4geG1sTnNQcmVmaXhDb250YWluZXI7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sU2NoZW1hKEpheGJQYWNrYWdlSW5mbyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lc3BhY2UgPSB0aGlzLmdldFJlc291cmNlTmFtZXNwYWNlKCk7Ci0JCXRoaXMubG9jYXRpb24gPSB0aGlzLmdldFJlc291cmNlTG9jYXRpb24oKTsKLQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdCA9IGdldFJlc291cmNlQXR0cmlidXRlRm9ybURlZmF1bHQoKTsKLQkJdGhpcy5zcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQgPSBnZXRSZXNvdXJjZUVsZW1lbnRGb3JtRGVmYXVsdCgpOwotCQl0aGlzLnhtbE5zUHJlZml4Q29udGFpbmVyID0gdGhpcy5idWlsZFhtbE5zUHJlZml4Q29udGFpbmVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZXNwYWNlXyh0aGlzLmdldFJlc291cmNlTmFtZXNwYWNlKCkpOwotCQl0aGlzLnNldExvY2F0aW9uXyh0aGlzLmdldFJlc291cmNlTG9jYXRpb24oKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHRfKGdldFJlc291cmNlQXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0XyhnZXRSZXNvdXJjZUVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJdGhpcy5zeW5jWG1sTnNQcmVmaXhlcygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZVhtbE5zUHJlZml4ZXMoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJQYWNrYWdlSW5mbyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YlBhY2thZ2VJbmZvKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0SmF4YlBhY2thZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0UmVzb3VyY2VQYWNrYWdlKCkgewotCQlyZXR1cm4gZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogeG1sIHNjaGVtYSBhbm5vdGF0aW9uICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgWG1sU2NoZW1hQW5ub3RhdGlvbiBnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFNjaGVtYUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VQYWNrYWdlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBuYW1lc3BhY2UgKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlID09IG51bGwpID8gIiIgOiB0aGlzLnNwZWNpZmllZE5hbWVzcGFjZTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnNldE5hbWVzcGFjZShuYW1lc3BhY2UpOwotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVzcGFjZV8obmFtZXNwYWNlKTsJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lc3BhY2U7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldE5hbWVzcGFjZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGxvY2F0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJdGhpcy5zZXRMb2NhdGlvbl8obG9jYXRpb24pOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0TG9jYXRpb25fKFN0cmluZyBsb2NhdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5sb2NhdGlvbjsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9DQVRJT05fUFJPUEVSVFksIG9sZCwgbG9jYXRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkuZ2V0TG9jYXRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0ICoqKioqKioqKioKLQkKLQlwdWJsaWMgWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQgPT0gbnVsbCkgPyBYbWxOc0Zvcm0uVU5TRVQgOiB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCX0KLQkKLQlwdWJsaWMgWG1sTnNGb3JtIGdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSB7Ci0JCWdldFhtbFNjaGVtYUFubm90YXRpb24oKS5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0udG9KYXZhUmVzb3VyY2VNb2RlbChhdHRyaWJ1dGVGb3JtRGVmYXVsdCkpOwotCQlzZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdF8oYXR0cmlidXRlRm9ybURlZmF1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdF8oWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSB7Ci0JCVhtbE5zRm9ybSBvbGQgPSB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gYXR0cmlidXRlRm9ybURlZmF1bHQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FUVFJJQlVURV9GT1JNX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgYXR0cmlidXRlRm9ybURlZmF1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sTnNGb3JtIGdldFJlc291cmNlQXR0cmlidXRlRm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiBYbWxOc0Zvcm0uZnJvbUphdmFSZXNvdXJjZU1vZGVsKGdldFhtbFNjaGVtYUFubm90YXRpb24oKS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBlbGVtZW50IGZvcm0gZGVmYXVsdCAqKioqKioqKioqCi0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQgPT0gbnVsbCkgPyBYbWxOc0Zvcm0uVU5TRVQgOiB0aGlzLnNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnNldEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0udG9KYXZhUmVzb3VyY2VNb2RlbChlbGVtZW50Rm9ybURlZmF1bHQpKTsKLQkJc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0XyhlbGVtZW50Rm9ybURlZmF1bHQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHRfKFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJWG1sTnNGb3JtIG9sZCA9IHRoaXMuc3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0OwotCQl0aGlzLnNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRUxFTUVOVF9GT1JNX0RFRkFVTFRfUFJPUEVSVFksIG9sZCwgZWxlbWVudEZvcm1EZWZhdWx0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE5zRm9ybSBnZXRSZXNvdXJjZUVsZW1lbnRGb3JtRGVmYXVsdCgpIHsKLQkJcmV0dXJuIFhtbE5zRm9ybS5mcm9tSmF2YVJlc291cmNlTW9kZWwoZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB4bWwgbmFtZXNwYWNlIHByZWZpeGVzICoqKioqKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbE5zPiBnZXRYbWxOc1ByZWZpeGVzKCkgewotCQlyZXR1cm4gdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxOc1ByZWZpeGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sTnNQcmVmaXhDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sTnMgYWRkWG1sTnNQcmVmaXgoaW50IGluZGV4KSB7Ci0JCVhtbE5zQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkuYWRkWG1sbnMoaW5kZXgpOwotCQlyZXR1cm4gdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbE5zUHJlZml4KFhtbE5zIHhtbE5zUHJlZml4KSB7Ci0JCXRoaXMucmVtb3ZlWG1sTnNQcmVmaXgodGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoeG1sTnNQcmVmaXgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sTnNQcmVmaXgoaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLnJlbW92ZVhtbG5zKGluZGV4KTsKLQkJdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxOc1ByZWZpeChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmdldFhtbFNjaGVtYUFubm90YXRpb24oKS5tb3ZlWG1sbnModGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxOc1ByZWZpeENvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbE5zIGJ1aWxkWG1sTnMoWG1sTnNBbm5vdGF0aW9uIHhtbE5zQW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRGYWN0b3J5KCkuYnVpbGRKYXZhWG1sTnModGhpcywgeG1sTnNBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbE5zUHJlZml4ZXMoKSB7Ci0JCXRoaXMueG1sTnNQcmVmaXhDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVYbWxOc1ByZWZpeGVzKCkgewotCQl0aGlzLnhtbE5zUHJlZml4Q29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sTnNBbm5vdGF0aW9uPiBnZXRYbWxOc0Fubm90YXRpb25zKCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldFhtbG5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPFhtbE5zLCBYbWxOc0Fubm90YXRpb24+IGJ1aWxkWG1sTnNQcmVmaXhDb250YWluZXIoKSB7Ci0JCVhtbE5zUHJlZml4Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBYbWxOc1ByZWZpeENvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygKLQkJCWludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCWlmIChuYW1lc3BhY2VUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiBnZXROYW1lc3BhY2VQcm9wb3NhbHMoZmlsdGVyKTsKLQkJfQotCQkKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLm5hbWVzcGFjZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKAotCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U2NoZW1hRW50cnksIFN0cmluZz4oCi0JCQkJCQkJCWdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYUVudHJpZXMoKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFNjaGVtYUVudHJ5IG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8uZ2V0TmFtZXNwYWNlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSwgCi0JCQkJCQlmaWx0ZXIpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJLy8gcmVtb3ZpbmcgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UgZm9yIG5vdzogIHNlZSBqYXhiIGJ1ZyA4MjMgKGh0dHA6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KQVhCLTgyMykKLS8vCQlYc2RTY2hlbWEgc2NoZW1hID0gZ2V0SmF4YlBhY2thZ2UoKS5nZXRYc2RTY2hlbWEoKTsKLS8vCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLS8vCQkJaWYgKGZvcm1Db25mbGljdHMoZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSwgc2NoZW1hLmdldFhTRENvbXBvbmVudCgpLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpKSB7Ci0vLwkJCQltZXNzYWdlcy5hZGQoCi0vLwkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLS8vCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotLy8JCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1NDSEVNQV9fTUlTTUFUQ0hFRF9BVFRSSUJVVEVfRk9STV9ERUZBVUxULAotLy8JCQkJCXRoaXMsCi0vLwkJCQkJZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbigpLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0VGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCWlmIChmb3JtQ29uZmxpY3RzKGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpLCBzY2hlbWEuZ2V0WFNEQ29tcG9uZW50KCkuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpKSB7Ci0vLwkJCQltZXNzYWdlcy5hZGQoCi0vLwkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLS8vCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotLy8JCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1NDSEVNQV9fTUlTTUFUQ0hFRF9FTEVNRU5UX0ZPUk1fREVGQVVMVCwKLS8vCQkJCQl0aGlzLAotLy8JCQkJCWdldFhtbFNjaGVtYUFubm90YXRpb24oKS5nZXRFbGVtZW50Rm9ybURlZmF1bHRUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLS8vCQkJfQotLy8JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZm9ybUNvbmZsaWN0cyhYbWxOc0Zvcm0gZm9ybSwgWFNERm9ybSB4c2RGb3JtKSB7Ci0JCXJldHVybiAoZm9ybSA9PSBYbWxOc0Zvcm0uUVVBTElGSUVEKSBeICh4c2RGb3JtID09IFhTREZvcm0uUVVBTElGSUVEX0xJVEVSQUwpOwotCX0KLQkKLQkKLQkvKioKLQkgKiB4bWwgbnMgcHJlZml4IGNvbnRhaW5lciBhZGFwdGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFhtbE5zUHJlZml4Q29udGFpbmVyCi0JCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPFhtbE5zLCBYbWxOc0Fubm90YXRpb24+IHsKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBYTUxfTlNfUFJFRklYRVNfTElTVDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxOcyBidWlsZENvbnRleHRFbGVtZW50KFhtbE5zQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVhtbFNjaGVtYS50aGlzLmJ1aWxkWG1sTnMocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sTnNBbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sU2NoZW1hLnRoaXMuZ2V0WG1sTnNBbm5vdGF0aW9ucygpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbE5zQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoWG1sTnMgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRSZXNvdXJjZVhtbE5zKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYjFkNGUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUU5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFNjaGVtYVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuUU5hbWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZQotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sU2NoZW1hVHlwZSB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGFubm90YXRpb247Ci0JCi0JcHJvdGVjdGVkIEpheGJRTmFtZSBxTmFtZTsKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0JCi0JCi0JcHJvdGVjdGVkIEdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZShKYXhiQ29udGV4dE5vZGUgcGFyZW50LCBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCXRoaXMucU5hbWUgPSBidWlsZFFOYW1lKCk7Ci0JCXRoaXMudHlwZSA9IHRoaXMuZ2V0UmVzb3VyY2VUeXBlU3RyaW5nKCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBKYXhiUU5hbWUgYnVpbGRRTmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBYbWxTY2hlbWFUeXBlUU5hbWUodGhpcyk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUU5hbWUgZ2V0UU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnFOYW1lOwotCX0KLQkKLQlwdWJsaWMgWG1sU2NoZW1hVHlwZUFubm90YXRpb24gZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpheGJQYWNrYWdlIGdldEpheGJQYWNrYWdlKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5xTmFtZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0VHlwZV8odGhpcy5nZXRSZXNvdXJjZVR5cGVTdHJpbmcoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucU5hbWUudXBkYXRlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmFubm90YXRpb24uc2V0VHlwZShsb2NhdGlvbik7Ci0JCXRoaXMuc2V0VHlwZV8obG9jYXRpb24pOwkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHlwZV8oU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldFR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbigpLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldFhzZFR5cGVEZWZpbml0aW9uKCkgewotCQlKYXhiUGFja2FnZSBwa2cgPSBnZXRKYXhiUGFja2FnZSgpOwotCQlYc2RTY2hlbWEgeHNkU2NoZW1hID0gKHBrZyA9PSBudWxsKSA/IG51bGwgOiBwa2cuZ2V0WHNkU2NoZW1hKCk7Ci0JCWlmICh4c2RTY2hlbWEgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5xTmFtZS5nZXROYW1lKCkpKSB7Ci0JCQlyZXR1cm4geHNkU2NoZW1hLmdldFR5cGVEZWZpbml0aW9uKHRoaXMucU5hbWUuZ2V0TmFtZXNwYWNlKCksIHRoaXMucU5hbWUuZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8vICoqKioqIGNvbnRlbnQgYXNzaXN0ICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocmVzdWx0KSkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQkKLQkJcmVzdWx0ID0gdGhpcy5xTmFtZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICghIENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlc3VsdCkpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl0aGlzLnFOYW1lLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0WHNkVHlwZURlZmluaXRpb24oKTsKLQkJaWYgKHhzZFR5cGUgIT0gbnVsbCAmJiB4c2RUeXBlLmdldEtpbmQoKSAhPSBYc2RUeXBlRGVmaW5pdGlvbi5LaW5kLlNJTVBMRSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1NDSEVNQV9UWVBFX19OT05fU0lNUExFX1RZUEUsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgcU5hbWUuZ2V0TmFtZSgpIH0sCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbigpLmdldFR5cGVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxTY2hlbWFUeXBlUU5hbWUKLQkJCWV4dGVuZHMgQWJzdHJhY3RKYXZhUU5hbWUgewotCQkKLQkJcHJvdGVjdGVkIFhtbFNjaGVtYVR5cGVRTmFtZShKYXZhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIG5ldyBRTmFtZUFubm90YXRpb25Qcm94eSgpKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF4YlBhY2thZ2UgZ2V0SmF4YlBhY2thZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlLnRoaXMuZ2V0SmF4YlBhY2thZ2UoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbXBvbmVudFR5cGVEZXNjcmlwdGlvbigpIHsKLQkJCXJldHVybiBKcHRKYXhiQ29yZU1lc3NhZ2VzLlhNTF9UWVBFX0RFU0M7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gWG1sU2NoZW1hVHlwZS5ERUZBVUxUX05BTUVTUEFDRTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJCX0KLQkJCXJldHVybiBzY2hlbWEuZ2V0TmFtZXNwYWNlUHJvcG9zYWxzKGZpbHRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROYW1lUHJvcG9zYWxzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQkJWHNkU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0WHNkU2NoZW1hKCk7Ci0JCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQkJfQotCQkJcmV0dXJuIHNjaGVtYS5nZXRTaW1wbGVUeXBlTmFtZVByb3Bvc2FscyhnZXROYW1lc3BhY2UoKSwgZmlsdGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUmVmZXJlbmNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoKTsKLQkJCQotCQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJCVhzZFNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFhzZFNjaGVtYSgpOwotCQkJCQotCQkJCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJCQlYc2RUeXBlRGVmaW5pdGlvbiBzY2hlbWFUeXBlID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9uKG5hbWVzcGFjZSwgbmFtZSk7Ci0JCQkJCWlmIChzY2hlbWFUeXBlID09IG51bGwpIHsKLQkJCQkJCW1lc3NhZ2VzLmFkZChnZXRVbnJlc29sdmVTY2hlbWFDb21wb25lbnRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUU5hbWVBbm5vdGF0aW9uUHJveHkgCi0JCQlleHRlbmRzIEFic3RyYWN0SmF2YVFOYW1lLkFic3RyYWN0UU5hbWVBbm5vdGF0aW9uUHJveHkgewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBRTmFtZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihib29sZWFuIGNyZWF0ZUlmTnVsbCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZS50aGlzLmFubm90YXRpb247Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTZWVBbHNvLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTZWVBbHNvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0MjE2YWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2VlQWxzby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTZWVBbHNvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTZWVBbHNvQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sU2VlQWxzbwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgWG1sU2VlQWxzbyB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb247Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RDb250YWluZXI8U3RyaW5nLCBTdHJpbmc+IHZhbHVlQ29udGFpbmVyOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFNlZUFsc28oSmF4YlR5cGVNYXBwaW5nIHBhcmVudCwgWG1sU2VlQWxzb0Fubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFubm90YXRpb24gPSBhbm5vdGF0aW9uOwotCQl0aGlzLnZhbHVlQ29udGFpbmVyID0gdGhpcy5idWlsZFZhbHVlQ29udGFpbmVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy52YWx1ZUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRDbGFzc2VzKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRDbGFzc2VzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eikgewotCQl0aGlzLmFubm90YXRpb24uYWRkQ2xhc3MoaW5kZXgsIGNsYXp6KTsKLQkJdGhpcy52YWx1ZUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgY2xhenopOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVDbGFzcyhpbnQgaW5kZXgpIHsKLQkJdGhpcy5hbm5vdGF0aW9uLnJlbW92ZUNsYXNzKGluZGV4KTsKLQkJdGhpcy52YWx1ZUNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVDbGFzcyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmFubm90YXRpb24ubW92ZUNsYXNzKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMudmFsdWVDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlZmVyZW5jZWRYbWxUeXBlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc2VzKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RDb250YWluZXI8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVmFsdWVDb250YWluZXIoKSB7Ci0JCVZhbHVlQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBWYWx1ZUNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgVmFsdWVDb250YWluZXIKLQkJCWV4dGVuZHMgTGlzdENvbnRhaW5lcjxTdHJpbmcsIFN0cmluZz4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIENMQVNTRVNfTElTVDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRDb250ZXh0RWxlbWVudChTdHJpbmcgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2VFbGVtZW50OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFYbWxTZWVBbHNvLnRoaXMuYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRWxlbWVudChTdHJpbmcgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFRyYW5zaWVudE1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFRyYW5zaWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyM2Y0ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxUcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zaWVudEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbFRyYW5zaWVudE1hcHBpbmcKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPFhtbFRyYW5zaWVudEFubm90YXRpb24+IHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxUcmFuc2llbnRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX1RSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1RSQU5TSUVOVDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVmZXJlbmNlZFhtbFR5cGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NWFhOTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxWYWx1ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29udGVudFR5cGVDYXRlZ29yeTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhWG1sTm9kZU1hcHBpbmc8WG1sVmFsdWVBbm5vdGF0aW9uPgotCQlpbXBsZW1lbnRzIFhtbFZhbHVlTWFwcGluZyB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9WQUxVRV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9WQUxVRTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sTGlzdCAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRYbWxMaXN0KCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsaWRhdGlvbiAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQl2YWxpZGF0ZVNjaGVtYVR5cGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVTY2hlbWFUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHhzZENsYXNzVHlwZSA9IGdldENsYXNzTWFwcGluZygpLmdldFhzZFR5cGVEZWZpbml0aW9uKCk7Ci0JCQotCQlpZiAoeHNkQ2xhc3NUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgKHhzZENsYXNzVHlwZS5nZXRLaW5kKCkgPT0gWHNkVHlwZURlZmluaXRpb24uS2luZC5TSU1QTEUKLQkJCQl8fCAoKFhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikgeHNkQ2xhc3NUeXBlKS5nZXRYU0RDb21wb25lbnQoKS5nZXRDb250ZW50VHlwZUNhdGVnb3J5KCkgPT0gWFNEQ29udGVudFR5cGVDYXRlZ29yeS5TSU1QTEVfTElURVJBTCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9WQUxVRV9fTk9fVEVYVF9DT05URU5ULAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0geHNkQ2xhc3NUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIGV4cGVjdGVkU2NoZW1hVHlwZSA9IGdldERhdGFUeXBlWHNkVHlwZURlZmluaXRpb24oKTsKLQkJCi0JCWlmICh4c2RUeXBlID09IG51bGwgfHwgZXhwZWN0ZWRTY2hlbWFUeXBlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKCEgeHNkVHlwZS50eXBlSXNWYWxpZChleHBlY3RlZFNjaGVtYVR5cGUsIGlzWG1sTGlzdCgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZBTFVFX19JTlZBTElEX1NDSEVNQV9UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7IGdldFZhbHVlVHlwZU5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGIzYzRlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0geyAKLQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSIH07Ci0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9BTllfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQU5ZX0FUVFJJQlVURTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKTsKLQl9Ci0KLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZGI1MGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gewotCQlKQVhCLlhNTF9FTEVNRU5UX1JFRiwKLQkJSkFYQi5YTUxfRUxFTUVOVF9SRUZTLAotCQlKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIsCi0JCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLAotCQlKQVhCLlhNTF9NSVhFRCB9OwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0FOWV9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FOWV9FTEVNRU5UOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpheGJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZTIxYmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSB7Ci0JCQlKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRiwKLQkJCUpBWEIuWE1MX0lELAotCQkJSkFYQi5YTUxfSURSRUYsCi0JCQlKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEsCi0JCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUiwKLQkJCUpBWEIuWE1MX0xJU1QsCi0JCQlKQVhCLlhNTF9NSU1FX1RZUEUsCi0JCQlKQVhCLlhNTF9TQ0hFTUFfVFlQRSB9OwotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQVRUUklCVVRFOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMpOwotCX0KLQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3YjJjOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlKQVhCLlhNTF9JRCwKLQkJCQlKQVhCLlhNTF9JRFJFRiwKLQkJCQlKQVhCLlhNTF9MSVNULAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFLAotCQkJCUpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGLAotCQkJCUpBWEIuWE1MX01JTUVfVFlQRSwKLQkJCQlKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEsCi0JCQkJSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSIH07Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVhtbEVsZW1lbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCS8qKgotCSAqIEZyb20gdGhlIEpBWEIgc3BlYyBzZWN0aW9uIDguMTIuNS4xIERlZmF1bHQgTWFwcGluZzoKLQkgKiA8cD4KLQkgKiBBIHNpbmdsZSB2YWx1ZWQgcHJvcGVydHkgb3IgZmllbGQgbXVzdCBiZSBtYXBwZWQgYnkgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwcGluZyBhbm5vdGF0aW9uOjx1bD4KLQkgKiA8bGk+IEBYbWxFbGVtZW50Ci0JICogPC91bD4KLQkgKiA8cD4KLQkgKiBBIHByb3BlcnR5IG9yIGZpZWxkIHdpdGggYSBjb2xsZWN0aW9uIHR5cGUgbXVzdCBiZSBtYXBwZWQgYnkgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQgbWFwcGluZyBhbm5vdGF0aW9uOjx1bD4KLQkgKiA8bGk+IGlmIHRoZSBwcm9wZXJ0eSBvciBmaWVsZCBpcyBhbm5vdGF0ZWQgd2l0aCBAWG1sTGlzdCwgdGhlbiB0aGUgZGVmYXVsdCBtYXBwaW5nIGFubm90YXRpb24gaXM6PHVsPgotCSAqIDxsaT4gQFhtbEVsZW1lbnQKLQkgKiA8L3VsPgotCSAqIDxsaT4gb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IG1hcHBpbmcgYW5ub3RhdGlvbiBpczo8dWw+Ci0JICogPGxpPiBAWG1sRWxlbWVudHMoeyBAWG1sRWxlbWVudChuaWxsYWJsZT10cnVlKX0pICAKLQkgKiAJCQkoTkI6ICB0aGlzIGFjdHVhbGx5IG1lYW5zIHRoZSBzYW1lIGFzCi0JICogICAgICAJCUBYbWxFbGVtZW50KG5pbGxhYmxlPXRydWUpCi0JICogICAgICAJKQotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3OWRmYTAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfUkVGX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfUkVGOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oIG5ldyBTdHJpbmdbXSB7Ci0JCQkJSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSIH0pOwotCX0KLQkKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFYbWxFbGVtZW50UmVmTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWJiZTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLQotcHVibGljIGNsYXNzIEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRlNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oIG5ldyBTdHJpbmdbXSB7Ci0JCQkJSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLAotCQkJCUpBWEIuWE1MX01JWEVEIH0pOwotCX0KLQkKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFYbWxFbGVtZW50UmVmc01hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE4NmQ3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgCi0JCQk9IG5ldyBKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UU19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UUzsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYWJsZTxTdHJpbmc+KCBuZXcgU3RyaW5nW10gewotCQkJCUpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUiwKLQkJCQlKQVhCLlhNTF9JRFJFRiwKLQkJCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUiB9KTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpheGJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhWG1sRWxlbWVudHNNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFYbWxUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzgyN2VmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVhtbFRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBKYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBKYXZhWG1sVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX1RSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9UUkFOU0lFTlQ7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVhtbFRyYW5zaWVudE1hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI2YWU0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhWG1sVmFsdWVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlKQVhCLlhNTF9MSVNULAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFIH07Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuWE1MX1ZBTFVFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1ZBTFVFOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdEl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKTsKLQl9Ci0JCi0JcHVibGljIEpheGJBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIEpheGJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhWG1sVmFsdWVNYXBwaW5nKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1Byb3BlcnR5QWNjZXNzb3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9Qcm9wZXJ0eUFjY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTk1MDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1Byb3BlcnR5QWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5BY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5QWNjZXNzb3IKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFDb250ZXh0Tm9kZQotCQlpbXBsZW1lbnRzIEFjY2Vzc29yIHsKLQotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXI7Ci0KLQlwdWJsaWMgUHJvcGVydHlBY2Nlc3NvcihKYXhiQ2xhc3NNYXBwaW5nIHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5yZXNvdXJjZUdldHRlciA9IHJlc291cmNlR2V0dGVyOwotCQl0aGlzLnJlc291cmNlU2V0dGVyID0gcmVzb3VyY2VTZXR0ZXI7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhbGN1bGF0ZVJlc291cmNlTWV0aG9kVG9Bbm5vdGF0ZSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGdldHRlck1ldGhvZCA9IGdldFJlc291cmNlR2V0dGVyTWV0aG9kKCk7Ci0JCS8vaXQncyBpbnZhbGlkIHRvIGhhdmUgYSBzZXR0ZXIgd2l0aG91dCBhIGdldHRlciwgc28ganVzdCByZXR1cm4gbnVsbCBpbiB0aGlzIGNhc2UKLQkJLy9yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGRlZmluZSB0aGUgdHlwZSBmcm9tIHRoZSBzZXR0ZXIncyBwYXJhbWV0ZXJzCi0JCXJldHVybiBnZXR0ZXJNZXRob2QgPT0gbnVsbCA/IG51bGwgOiBBY2Nlc3NvclRvb2xzLmdldEJhc2VUeXBlTmFtZShnZXR0ZXJNZXRob2QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0dGVyTWV0aG9kID0gZ2V0UmVzb3VyY2VHZXR0ZXJNZXRob2QoKTsKLQkJLy9pdCdzIGludmFsaWQgdG8gaGF2ZSBhIHNldHRlciB3aXRob3V0IGEgZ2V0dGVyLCBzbyBqdXN0IHJldHVybiBmYWxzZSBpbiB0aGlzIGNhc2UKLQkJLy9yYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIHVzZSB0aGUgc2V0dGVyJ3MgcGFyYW1ldGVycwotCQlyZXR1cm4gZ2V0dGVyTWV0aG9kID09IG51bGwgPyBmYWxzZSA6IEFjY2Vzc29yVG9vbHMuaXNDb2xsZWN0aW9uVHlwZShnZXR0ZXJNZXRob2QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSmF2YVJlc291cmNlQXR0cmlidXRlVHlwZVN1YlR5cGVPZihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGdldHRlck1ldGhvZCA9IGdldFJlc291cmNlR2V0dGVyTWV0aG9kKCk7Ci0JCS8vaXQncyBpbnZhbGlkIHRvIGhhdmUgYSBzZXR0ZXIgd2l0aG91dCBhIGdldHRlciwgc28ganVzdCByZXR1cm4gZmFsc2UgaW4gdGhpcyBjYXNlCi0JCS8vcmF0aGVyIHRoYW4gYXR0ZW1wdGluZyB0byB1c2UgdGhlIHNldHRlcidzIHBhcmFtZXRlcnMKLQkJcmV0dXJuIGdldHRlck1ldGhvZCA9PSBudWxsID8gZmFsc2UgOiBnZXR0ZXJNZXRob2QudHlwZUlzU3ViVHlwZU9mKHR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlTWV0aG9kIGdldFJlc291cmNlR2V0dGVyTWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdldHRlcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlTWV0aG9kIGdldFJlc291cmNlU2V0dGVyTWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVNldHRlcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kLCBKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kKSB7Ci0JCXJldHVybiAodGhpcy5yZXNvdXJjZUdldHRlciA9PSBnZXR0ZXJNZXRob2QpICYmICh0aGlzLnJlc291cmNlU2V0dGVyID09IHNldHRlck1ldGhvZCk7Ci0JfQotCi0JLy9zaW5jZSB0aGlzIGlzIGJhc2VkIG9uIGEgcHJlZmVyZW5jZSBhcyB3ZWxsIGFzIGFubm90YXRpb24gbG9jYXRpb24KLQkvL3dlIHdpbGwganVzdCBjYWxjdWxhdGUgaXQgaW5zdGVhZCBvZiBoYW5kbGluZyBpdCBpbiBzeW5jIGFuZCBzdG9yaW5nIGl0LgotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VNZXRob2QgY2FsY3VsYXRlUmVzb3VyY2VNZXRob2RUb0Fubm90YXRlKCkgewotCQlpZiAoZ2V0dGVySXNBbm5vdGF0ZWQoKSkgewotCQkJaWYgKHNldHRlcklzQW5ub3RhdGVkKCkpIHsKLQkJCQkvL3VzZSBwcmVmZXJlbmNlIGZvciB3aGljaCBvbmUgdG8gc2V0IHRoZSBwcmltYXJ5IGFubm90YXRpb24gb24uCi0JCQkJcmV0dXJuIGdldEFubm90YXRlR2V0dGVyUHJlZmVyZW5jZSgpID8gdGhpcy5yZXNvdXJjZUdldHRlciA6IHRoaXMucmVzb3VyY2VTZXR0ZXI7Ci0JCQl9Ci0JCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdldHRlcjsKLQkJfQotCQllbHNlIGlmIChzZXR0ZXJJc0Fubm90YXRlZCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVNldHRlcjsKLQkJfQotCQllbHNlIGlmIChnZXRBbm5vdGF0ZUdldHRlclByZWZlcmVuY2UoKSYmIHRoaXMucmVzb3VyY2VHZXR0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMucmVzb3VyY2VHZXR0ZXI7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VTZXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0dGVySXNBbm5vdGF0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlR2V0dGVyID09IG51bGwgPyBmYWxzZSA6IHRoaXMucmVzb3VyY2VHZXR0ZXIuaXNBbm5vdGF0ZWQoKTsgCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXR0ZXJJc0Fubm90YXRlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VTZXR0ZXIgPT0gbnVsbCA/IGZhbHNlIDogdGhpcy5yZXNvdXJjZVNldHRlci5pc0Fubm90YXRlZCgpOyAKLQl9Ci0KLQkvL1RPRE8gYnVnIDMzMzQ4MyAtIG1ha2UgdGhpcyBhIHByZWZlcmVuY2UgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCB3aGV0aGVyIHRoZSBnZXR0ZXIgb3Igc2V0dGVyIHNob3VsZCBiZSBhbm5vdGF0ZWQuCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0QW5ub3RhdGVHZXR0ZXJQcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvL1RPRE8gdmFsaWRhdGlvbiAtIGJ1ZyAzMzM0ODQKLQkvL2lmIChnZXR0ZXJJc0Fubm90YXRlZCgpICYmIHNldHRlcklzQW5ub3RhdGVkKCkpIGVycm9yIHRvIHVzZXIKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWQyYTVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotCQlleHRlbmRzIElEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF8gCi0JCQk9IEpheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk0KLQkJCT0gUFJFRklYXyArICJQTEFURk9STSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUKLQkJCT0gUFJFRklYXyArICJMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhMmI2Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSUxpYnJhcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlcgotCQlleHRlbmRzIEZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyIAotCQlpbXBsZW1lbnRzIEpheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gRU1QVFlfRE1QRF9BUlJBWSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF07Ci0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gRE1QRF9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkbXBkMSwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRtcGQyKSB7Ci0JCQkJCXJldHVybiBkbXBkMS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkuY29tcGFyZVRvKGRtcGQyLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkKLQkKLQkKLQkvLyBsaXN0ZW5zIHRvIHByaW1hcnkgcnVudGltZSBjaGFuZ2luZwotCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIgZnByb2pMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgZGVmYXVsdExpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci0JCi0JCi0JcHJvdGVjdGVkIEpheGJGYWNldERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmZwcm9qTGlzdGVuZXIgPSBidWlsZEZwcm9qTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGJ1aWxkRnByb2pMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBJRmFjZXRlZFByb2plY3RMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KElGYWNldGVkUHJvamVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChQTEFURk9STSk7Ci0JCW5hbWVzLmFkZChMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfSUQpKSB7Ci0JCQlyZXR1cm4gSmF4YkZhY2V0LklEOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdFBsYXRmb3JtKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0RGVmYXVsdFBsYXRmb3JtKGdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGdldERlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCkgewotCQkvLyBkZWxlZ2F0ZSBpdHNlbGYgY2hhbmdlcyBvbmx5IHdoZW4gZmFjZXQgdmVyc2lvbiBjaGFuZ2VzCi0JCWlmICh0aGlzLmRlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgPSBidWlsZERlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoISB0aGlzLmRlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5lcXVhbHMoZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKSkgewotCQkJdGhpcy5kZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCQl0aGlzLmRlZmF1bHRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlID0gYnVpbGREZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgYnVpbGREZWZhdWx0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnBqd2MgPSBnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIHBmdiA9IGdldFByb2plY3RGYWNldFZlcnNpb24oKTsKLQkJaWYgKGZwandjID09IG51bGwgfHwgcGZ2ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlkID0gbmV3IExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoZnBqd2MsIHBmdik7Ci0JCWxpZC5hZGRMaXN0ZW5lcihidWlsZExpYnJhcnlJbnN0YWxsRGVsZWdhdGVMaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGxpZDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkTGlicmFyeUluc3RhbGxEZWxlZ2F0ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlICkgewotCQkJCQlpZiAoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZS5QUk9QX0FWQUlMQUJMRV9QUk9WSURFUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCQkJYWRqdXN0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQkJCQl9Ci0JCQkJCWdldERhdGFNb2RlbCgpLm5vdGlmeVByb3BlcnR5Q2hhbmdlKExJQlJBUllfSU5TVEFMTF9ERUxFR0FURSwgSURhdGFNb2RlbC5WQUxVRV9DSEcpOwotCQkJCX0KLQkJCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkanVzdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKSB7Ci0JCUxpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlkID0gdGhpcy5nZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0JCWlmIChsaWQgIT0gbnVsbCkgewotCQkJTGlzdDxKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4gamF4YkNvbmZpZ3MgCi0JCQkJCT0gbmV3IEFycmF5TGlzdDxKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4oKTsKLQkJCS8vIGFkZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9uZSBmaXJzdAotCQkJSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY3VycmVudEpheGJDb25maWcgPSBudWxsOwotCQkJTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnIGNvbmZpZyA9IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb25Db25maWcoKTsKLQkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgewotCQkJCWN1cnJlbnRKYXhiQ29uZmlnID0gKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7Ci0JCQkJamF4YkNvbmZpZ3MuYWRkKGN1cnJlbnRKYXhiQ29uZmlnKTsKLQkJCX0KLQkJCWZvciAoSUxpYnJhcnlQcm92aWRlciBscCA6IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJzKCkpIHsKLQkJCQljb25maWcgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKGxwKTsKLQkJCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJCQkJCSYmICEgY29uZmlnLmVxdWFscyhjdXJyZW50SmF4YkNvbmZpZykpIHsKLQkJCQkJamF4YkNvbmZpZ3MuYWRkKChKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpheGJDb25maWcgOiBqYXhiQ29uZmlncykgewotCQkJCWpheGJDb25maWcuc2V0SmF4YlBsYXRmb3JtKGdldFBsYXRmb3JtKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wcm9wZXJ0eVNldChwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQkKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSkpIHsKLQkJCS8vIHNob3VsZCBvbmx5IGJlIGRvbmUgb25jZQotCQkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnByb2ogPSAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpIHByb3BlcnR5VmFsdWU7Ci0JCQlmcHJvai5hZGRMaXN0ZW5lcih0aGlzLmZwcm9qTGlzdGVuZXIsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJJTUFSWV9SVU5USU1FX0NIQU5HRUQpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfVkVSU0lPTikpIHsKLQkJCWFkanVzdExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUExBVEZPUk0sIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlhZGp1c3RMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBvazsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMoKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMoKSB7Ci0JCUl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiB2YWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zID0gYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zKCk7Ci0JCUl0ZXJhYmxlPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gdmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzID0KLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yPih2YWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIHRyYW5zZm9ybShKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQkJCQkJcmV0dXJuIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKGRlc2NyaXB0aW9uKTsKLQkJCQkJfQotCQkJCX07Ci0JCXJldHVybiBBcnJheVRvb2xzLnNvcnQoQXJyYXlUb29scy5hcnJheSh2YWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMsIEVNUFRZX0RNUERfQVJSQVkpLCBETVBEX0NPTVBBUkFUT1IpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+IGJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4oCi0JCQkJSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gbykgewotCQkJCXJldHVybiBvLnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJcmV0dXJuIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKGdldFBsYXRmb3JtKCkpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgYnVpbGRQbGF0Zm9ybURlc2NyaXB0b3IoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVzYykgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihkZXNjLCBkZXNjLmdldExhYmVsKCkpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBPS19TVEFUVVMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBidWlsZEVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBidWlsZFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGJ1aWxkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVBsYXRmb3JtKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpKSB7Ci0JCQlyZXR1cm4gZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLnZhbGlkYXRlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVBsYXRmb3JtKCkgewotCQlyZXR1cm4gKGdldFBsYXRmb3JtKCkgPT0gbnVsbCkgPyAKLQkJCQlidWlsZEVycm9yU3RhdHVzKEpwdEpheGJDb3JlTWVzc2FnZXMuSmF4YkZhY2V0Q29uZmlnX3ZhbGlkYXRlUGxhdGZvcm1Ob3RTcGVjaWZpZWQpIAotCQkJCTogT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgZ2V0UHJvcGVydHkoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBnZXRQcm9wZXJ0eShGQUNFVF9WRVJTSU9OKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uKSBnZXRQcm9wZXJ0eShQTEFURk9STSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGdldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKSB7Ci0JCXJldHVybiAoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSkgZ2V0UHJvcGVydHkoTElCUkFSWV9JTlNUQUxMX0RFTEVHQVRFKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlnZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCkucmVtb3ZlTGlzdGVuZXIodGhpcy5mcHJvakxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREZWxlZ2F0ZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0RGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1YTUxNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXREZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSURlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXhiRmFjZXREZWxlZ2F0ZQotCQlpbXBsZW1lbnRzIElEZWxlZ2F0ZSB7Ci0JCi0JcHVibGljIGZpbmFsIHZvaWQgZXhlY3V0ZSgKLQkJCUlQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCAKLQkJCU9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJdGhpcy5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZV8oCi0JCQlJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0JCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVN1Yk1vbml0b3Igc3ViTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCA3KTsKLQkJCi0JCUlEYXRhTW9kZWwgamF4YkNvbmZpZyA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCQotCQkvLyBwcm9qZWN0IHNldHRpbmdzCi0JCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtID0KLQkJCQkoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24pIGpheGJDb25maWcuZ2V0UHJvcGVydHkoSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSk7Ci0JCUpwdEpheGJDb3JlUGx1Z2luLnNldEpheGJQbGF0Zm9ybShwcm9qZWN0LCBwbGF0Zm9ybSk7Ci0JCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQkKLQkJLy8gZGVmYXVsdHMgc2V0dGluZ3MKLQkJSnB0SmF4YkNvcmVQbHVnaW4uc2V0RGVmYXVsdEpheGJQbGF0Zm9ybShmdiwgcGxhdGZvcm0pOwotCQlzdWJNb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCS8vRGVsZWdhdGUgdG8gTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSB0byBjb25maWd1cmUgdGhlIHByb2plY3QgY2xhc3NwYXRoCi0JCUxpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlkID0gCi0JCQkJKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIGpheGJDb25maWcuZ2V0UHJvcGVydHkoSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5MSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpOwotCQlsaWQuZXhlY3V0ZShzdWJNb25pdG9yLm5ld0NoaWxkKDEpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjNDI2Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMgCi0JCWV4dGVuZHMgSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjVkOTgyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBKYXhiRmFjZXREYXRhTW9kZWxQcm92aWRlciAKLQkJaW1wbGVtZW50cyBKYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JcHVibGljIEpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVF9WRVJTSU9OKSkgewotCQkJaWYgKCEgZ2V0UGxhdGZvcm0oKS5zdXBwb3J0c0pheGJGYWNldFZlcnNpb24oZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKSkgewotCQkJCWdldERhdGFNb2RlbCgpLnNldFByb3BlcnR5KFBMQVRGT1JNLCBudWxsKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIG9rOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldEluc3RhbGxEZWxlZ2F0ZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3MjQ4MzIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25GcmFtZXdvcms7Ci0KLQotcHVibGljIGNsYXNzIEpheGJGYWNldEluc3RhbGxEZWxlZ2F0ZQotCQlleHRlbmRzIEpheGJGYWNldERlbGVnYXRlIHsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVfKAotCQkJSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlWYWxpZGF0aW9uRnJhbWV3b3JrLmdldERlZmF1bHQoKS5hZGRWYWxpZGF0aW9uQnVpbGRlcihwcm9qZWN0KTsKLQkJc3VwZXIuZXhlY3V0ZV8ocHJvamVjdCwgZnYsIGNvbmZpZywgbW9uaXRvcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZTFkOWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkZhY2V0VW5pbnN0YWxsRGVsZWdhdGUKLQkJaW1wbGVtZW50cyBJRGVsZWdhdGUgewotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsCi0JCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YzViMmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm9wZXJ0aWVzCi0JCWV4dGVuZHMgSmF4YkZhY2V0RGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc3MmI1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2ZhY2V0L0pheGJGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3ZpZGVyCi0JCWV4dGVuZHMgSmF4YkZhY2V0RGF0YU1vZGVsUHJvdmlkZXIgCi0JCWltcGxlbWVudHMgSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXB1YmxpYyBKYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zKCkgewotCQkvLyBhZGQgZXhpc3RpbmcgcGxhdGZvcm0gdG8gbGlzdCBvZiBjaG9pY2VzCi0JCUl0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiB2YWxpZFBsYXRmb3JtRGVzY3MgPSBzdXBlci5idWlsZFZhbGlkUGxhdGZvcm1EZXNjcmlwdGlvbnMoKTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHZhbGlkUGxhdGZvcm1EZXNjcywgZ2V0UGxhdGZvcm0oKSkpIHsKLQkJCXZhbGlkUGxhdGZvcm1EZXNjcyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZShnZXRQbGF0Zm9ybSgpLCB2YWxpZFBsYXRmb3JtRGVzY3MpOwotCQl9Ci0JCXJldHVybiB2YWxpZFBsYXRmb3JtRGVzY3M7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlUGxhdGZvcm0oKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIudmFsaWRhdGVQbGF0Zm9ybSgpOwotCQkKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCWlmICghIGdldFBsYXRmb3JtKCkuc3VwcG9ydHNKYXhiRmFjZXRWZXJzaW9uKGdldFByb2plY3RGYWNldFZlcnNpb24oKSkpIHsKLQkJCQlzdGF0dXMgPSBidWlsZEVycm9yU3RhdHVzKEpwdEpheGJDb3JlTWVzc2FnZXMuSmF4YkZhY2V0Q29uZmlnX3ZhbGlkYXRlUGxhdGZvcm1Eb2VzTm90U3VwcG9ydEZhY2V0VmVyc2lvbik7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURlbGVnYXRlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3YTRiYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9mYWNldC9KYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLQotcHVibGljIGNsYXNzIEpheGJGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZQotCQlleHRlbmRzIEpheGJGYWNldERlbGVnYXRlIHsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlXygKLQkJCUlQcm9qZWN0IHByb2plY3QsIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2LCBPYmplY3QgY29uZmlnLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDIpOwotCQlzdXBlci5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBzbS5uZXdDaGlsZCgxKSk7Ci0JCQotCQlKcHRKYXhiQ29yZVBsdWdpbi5nZXRQcm9qZWN0TWFuYWdlcigpLnJlYnVpbGRKYXhiUHJvamVjdChwcm9qZWN0KTsKLQkJc20ud29ya2VkKDEpOwotCQkvLyBub3RoaW5nIGZ1cnRoZXIgdG8gZG8gaGVyZSAqanVzdCogeWV0Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL0NsYXNzZXNHZW5lcmF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NjIzMjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL0NsYXNzZXNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5nZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KYXZhUnVudGltZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwuZ2VuLkFic3RyYWN0SnB0R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiAgQ2xhc3Nlc0dlbmVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0SnB0R2VuZXJhdG9yCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIX0NPTkZJR19OQU1FID0gIkpBWEIgUnVuIENvbmZpZyI7ICAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfR0VORVJJQ19HRU5fQ0xBU1MgPSAiY29tLnN1bi50b29scy54amMuWEpDRmFjYWRlIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9HRU5FUklDX0dFTl9KREtfQ0xBU1MgPSAiY29tLnN1bi50b29scy5pbnRlcm5hbC54amMuWEpDRmFjYWRlIjsgICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9FQ0xJUFNFTElOS19HRU5fQ0xBU1MgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi54amMuTU9YeVhKQyI7ICAgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjaGVtYVBhdGhPclVyaTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBvdXRwdXREaXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjYXRhbG9nOwotCXByaXZhdGUgZmluYWwgU3RyaW5nW10gYmluZGluZ3NGaWxlTmFtZXM7Ci0JcHJpdmF0ZSBmaW5hbCBDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zOwotCXByaXZhdGUgZmluYWwgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMgZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uczsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBtYWluVHlwZTsKLQlwcml2YXRlIFN0cmluZyB0b29sc0phclBhdGg7Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGUoCi0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QsIAotCQkJU3RyaW5nIHNjaGVtYVBhdGhPclVyaSwgCi0JCQlTdHJpbmcgb3V0cHV0RGlyLCAKLQkJCVN0cmluZyB0YXJnZXRQYWNrYWdlLCAKLQkJCVN0cmluZyBjYXRhbG9nLCAKLQkJCWJvb2xlYW4gdXNlc01veHlHZW5lcmF0b3IsCi0JCQlTdHJpbmdbXSBiaW5kaW5nc0ZpbGVOYW1lcywKLQkJCUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdlbmVyYXRvck9wdGlvbnMsCi0JCQlDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJbmV3IENsYXNzZXNHZW5lcmF0b3IoamF2YVByb2plY3QsIAotCQkJc2NoZW1hUGF0aE9yVXJpLCAKLQkJCW91dHB1dERpciwgCi0JCQl0YXJnZXRQYWNrYWdlLCAKLQkJCWNhdGFsb2csIAotCQkJdXNlc01veHlHZW5lcmF0b3IsIAotCQkJYmluZGluZ3NGaWxlTmFtZXMsCi0JCQlnZW5lcmF0b3JPcHRpb25zLCAKLQkJCWdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMpLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIEpESyBKYXhiIGNvbXBpbGVyIGlzIG9uIHRoZSBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyaWNKYXhiSmRrSXNPbkNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIGdlbkNsYXNzID0gamF2YVByb2plY3QuZmluZFR5cGUoSkFYQl9HRU5FUklDX0dFTl9KREtfQ0xBU1MpOwotCQkJcmV0dXJuIChnZW5DbGFzcyAhPSBudWxsKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgbm9uLUpESyBKYXhiIGNvbXBpbGVyIGlzIG9uIHRoZSBjbGFzc3BhdGguCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdlbmVyaWNKYXhiTm9uSmRrSXNPbkNsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlUeXBlIGdlbkNsYXNzID0gamF2YVByb2plY3QuZmluZFR5cGUoSkFYQl9HRU5FUklDX0dFTl9DTEFTUyk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJVk1JbnN0YWxsIGdldFZNSW5zdGFsbChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEphdmFSdW50aW1lLmdldFZNSW5zdGFsbChqYXZhUHJvamVjdCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZNSW5zdGFsbExvY2F0aW9uKElWTUluc3RhbGwgdm0pIHsKLQkJCXJldHVybiB2bS5nZXRJbnN0YWxsTG9jYXRpb24oKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Vk1JbnN0YWxsVG9vbHNKYXJBYnNvbHV0ZVBhdGgoSVZNSW5zdGFsbCB2bSkgewotCQlTdHJpbmcgdm1JbnN0YWxsTG9jYXRpb24gPSBnZXRWTUluc3RhbGxMb2NhdGlvbih2bSk7Ci0JCXJldHVybiB2bUluc3RhbGxMb2NhdGlvbiArIEZpbGUuc2VwYXJhdG9yICsgImxpYiIgKyBGaWxlLnNlcGFyYXRvciArICJ0b29scy5qYXIiOyAgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZFRvb2xzSmFyUGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGwgdm0gPSBnZXRWTUluc3RhbGwoamF2YVByb2plY3QpOwotCQkJcmV0dXJuIGdldFZNSW5zdGFsbFRvb2xzSmFyQWJzb2x1dGVQYXRoKHZtKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZpbmRUb29sc0phclBhdGgoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0KSB7Ci0JCQlTdHJpbmcgdG9vbHNBYnNvbHV0ZVBhdGggPSBidWlsZFRvb2xzSmFyUGF0aChqYXZhUHJvamVjdCk7Ci0JCQlyZXR1cm4gKChuZXcgRmlsZSh0b29sc0Fic29sdXRlUGF0aCkpLmV4aXN0cygpKSA/IHRvb2xzQWJzb2x1dGVQYXRoIDogbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHRvb2xzSmFyRXhpc3RzKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCkgewotCQlyZXR1cm4gKGZpbmRUb29sc0phclBhdGgoamF2YVByb2plY3QpICE9IG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgQ2xhc3Nlc0dlbmVyYXRvcigKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgCi0JCQlTdHJpbmcgc2NoZW1hUGF0aE9yVXJpLCAKLQkJCVN0cmluZyBvdXRwdXREaXIsIAotCQkJU3RyaW5nIHRhcmdldFBhY2thZ2UsIAotCQkJU3RyaW5nIGNhdGFsb2csIAotCQkJYm9vbGVhbiB1c2VzTW94eUdlbmVyYXRvciwgCi0JCQlTdHJpbmdbXSBiaW5kaW5nc0ZpbGVOYW1lcywKLQkJCUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdlbmVyYXRvck9wdGlvbnMsCi0JCQlDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKSB7Ci0JCXN1cGVyKGphdmFQcm9qZWN0KTsKLQkJdGhpcy5zY2hlbWFQYXRoT3JVcmkgPSBzY2hlbWFQYXRoT3JVcmk7Ci0JCXRoaXMub3V0cHV0RGlyID0gb3V0cHV0RGlyOwotCQl0aGlzLnRhcmdldFBhY2thZ2UgPSB0YXJnZXRQYWNrYWdlOwotCQl0aGlzLmNhdGFsb2cgPSBjYXRhbG9nOwotCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzID0gYmluZGluZ3NGaWxlTmFtZXM7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnM7Ci0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyA9IGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0JCQotCQl0aGlzLm1haW5UeXBlID0gdGhpcy5idWlsZE1haW5UeXBlKGphdmFQcm9qZWN0LCB1c2VzTW94eUdlbmVyYXRvcik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFpblR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm1haW5UeXBlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGF1bmNoQ29uZmlnTmFtZSgpIHsKLQkJcmV0dXJuIExBVU5DSF9DT05GSUdfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5SlJFKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcmVHZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gbm90aGluZyB0byBkbyB5ZXQuLi4KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZE1haW5UeXBlKElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgYm9vbGVhbiB1c2VzTW94eUdlbmVyYXRvcikgewotCQlpZih1c2VzTW94eUdlbmVyYXRvcikgewotCQkJcmV0dXJuIEpBWEJfRUNMSVBTRUxJTktfR0VOX0NMQVNTOwotCQl9Ci0JCWVsc2UgaWYoZ2VuZXJpY0pheGJOb25KZGtJc09uQ2xhc3NwYXRoKGphdmFQcm9qZWN0KSkgewotCQkJcmV0dXJuIEpBWEJfR0VORVJJQ19HRU5fQ0xBU1M7Ci0JCX0KLQkJZWxzZSBpZihnZW5lcmljSmF4Ykpka0lzT25DbGFzc3BhdGgoamF2YVByb2plY3QpKSB7Ci0JCQlyZXR1cm4gSkFYQl9HRU5FUklDX0dFTl9KREtfQ0xBU1M7Ci0JCX0KLQkJdGhpcy50b29sc0phclBhdGggPSBmaW5kVG9vbHNKYXJQYXRoKGphdmFQcm9qZWN0KTsKLQkJcmV0dXJuIEpBWEJfR0VORVJJQ19HRU5fSkRLX0NMQVNTOwotCX0KLQotCXByaXZhdGUgSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeSBnZXRUb29sc0NsYXNzcGF0aEVudHJ5KCkgewotCQlyZXR1cm4gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy50b29sc0phclBhdGgpKSA/Ci0JCQludWxsIDoKLQkJCWdldEFyY2hpdmVDbGFzc3BhdGhFbnRyeShuZXcgUGF0aCh0aGlzLnRvb2xzSmFyUGF0aCkpOwotCX0KLQotCS8vICoqKioqKioqKiogTGF1bmNoIENvbmZpZ3VyYXRpb24gU2V0dXAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBidWlsZENsYXNzcGF0aCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTGlzdDxTdHJpbmc+IGNsYXNzcGF0aCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkvLyBEZWZhdWx0IFByb2plY3QgY2xhc3NwYXRoCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXREZWZhdWx0UHJvamVjdENsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gU3lzdGVtIExpYnJhcnkgIAotCQljbGFzc3BhdGguYWRkKHRoaXMuZ2V0U3lzdGVtTGlicmFyeUNsYXNzcGF0aEVudHJ5KCkuZ2V0TWVtZW50bygpKTsKLQkJLy8gQ29udGFpbmVycyBjbGFzc3BhdGgKLQkJZm9yKElSdW50aW1lQ2xhc3NwYXRoRW50cnkgY29udGFpbmVyQ2xhc3NwYXRoRW50cnk6IHRoaXMuZ2V0Q29udGFpbmVyc0NsYXNzcGF0aEVudHJpZXMoKSkgewotCQkJY2xhc3NwYXRoLmFkZChjb250YWluZXJDbGFzc3BhdGhFbnRyeS5nZXRNZW1lbnRvKCkpOwotCQl9Ci0JCS8vIFRvb2xzIGNsYXNzcGF0aAotCQlJUnVudGltZUNsYXNzcGF0aEVudHJ5IHRvb2xzQ2xhc3NwYXRoRW50cnkgPSB0aGlzLmdldFRvb2xzQ2xhc3NwYXRoRW50cnkoKTsKLQkJaWYodG9vbHNDbGFzc3BhdGhFbnRyeSAhPSBudWxsKSB7Ci0JCQljbGFzc3BhdGguYWRkKHRvb2xzQ2xhc3NwYXRoRW50cnkuZ2V0TWVtZW50bygpKTsKLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNwZWNpZnlQcm9ncmFtQXJndW1lbnRzKCkgewotCQlTdHJpbmdCdWZmZXIgcHJvZ3JhbUFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCItZCAiKTsJICAvLyROT04tTkxTLTEkCi0JCWlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5vdXRwdXREaXIpKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiT3V0cHV0IGRpcmVjdG9yeSBjYW5ub3QgYmUgZW1wdHkiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy5vdXRwdXREaXIpKTsKLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnRhcmdldFBhY2thZ2UpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1wICIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKHRoaXMudGFyZ2V0UGFja2FnZSk7Ci0JCX0KLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNhdGFsb2cpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1jYXRhbG9nICIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuY2F0YWxvZykpOwotCQl9Ci0KLQkJLy8gT3B0aW9ucwotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5nZXRQcm94eSgpKSkgewotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtaHR0cHByb3h5ICIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5nZXRQcm94eSgpKTsKLQkJfQotCQlpZiggISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5nZXRQcm94eUZpbGUoKSkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWh0dHBwcm94eWZpbGUgIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy5nZW5lcmF0b3JPcHRpb25zLmdldFByb3h5RmlsZSgpKSk7Ci0JCX0KLQkJCi0JCWlmKCAhIHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy51c2VzU3RyaWN0VmFsaWRhdGlvbigpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1udiIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMubWFrZXNSZWFkT25seSgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1yZWFkT25seSIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLW5wYSIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMuc3VwcHJlc3Nlc0hlYWRlckdlbigpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1uby1oZWFkZXIiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLmlzVmVyYm9zZSgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC12ZXJib3NlIik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5pc1F1aWV0KCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXF1aWV0Iik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLnRyZWF0c0FzWG1sU2NoZW1hKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXhtbHNjaGVtYSIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMudHJlYXRzQXNSZWxheE5nKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLXJlbGF4bmciKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QoKSkgewotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtcmVsYXhuZy1jb21wYWN0Iik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy50cmVhdHNBc0R0ZCgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1kdGQiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYodGhpcy5nZW5lcmF0b3JPcHRpb25zLnRyZWF0c0FzV3NkbCgpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC13c2RsIik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKHRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zaG93c1ZlcnNpb24oKSkgewotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtdmVyc2lvbiIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZih0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2hvd3NIZWxwKCkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWhlbHAiKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBFeHRlbnNpb24gT3B0aW9ucwotCQlpZih0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuYWxsb3dzRXh0ZW5zaW9ucygpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1leHRlbnNpb24iKTsJICAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuZ2V0Q2xhc3NwYXRoKCkpKSB7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCgiIC1jbGFzc3BhdGggIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoU3RyaW5nVG9vbHMucXVvdGUodGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLmdldENsYXNzcGF0aCgpKSk7Ci0JCX0KLQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuZ2V0QWRkaXRpb25hbEFyZ3MoKSkpIHsKLQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCcgJyk7Ci0JCQlwcm9ncmFtQXJndW1lbnRzLmFwcGVuZCh0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuZ2V0QWRkaXRpb25hbEFyZ3MoKSk7Ci0JCX0KLQotCQkvLyBzY2hlbWEKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoJyAnKTsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnNjaGVtYVBhdGhPclVyaSkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTY2hlbWEgY2Fubm90IGJlIGVtcHR5Iik7CSAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKFN0cmluZ1Rvb2xzLnF1b3RlKHRoaXMuc2NoZW1hUGF0aE9yVXJpKSk7Ci0JCQotCQkvLyBiaW5kaW5ncwotCQlpZiAodGhpcy5iaW5kaW5nc0ZpbGVOYW1lcy5sZW5ndGggPiAwKSB7Ci0JCQlmb3IgKFN0cmluZyBiaW5kaW5nc0ZpbGVOYW1lIDogdGhpcy5iaW5kaW5nc0ZpbGVOYW1lcykgewotCQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKCIgLWIgIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJCXByb2dyYW1Bcmd1bWVudHMuYXBwZW5kKFN0cmluZ1Rvb2xzLnF1b3RlKGJpbmRpbmdzRmlsZU5hbWUpKTsKLQkJCX0KLQkJfQotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIHByb2dyYW1Bcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFF1ZXJpZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0PElSdW50aW1lQ2xhc3NwYXRoRW50cnk+IGdldENvbnRhaW5lcnNDbGFzc3BhdGhFbnRyaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4gY2xhc3NwYXRoRW50cmllcyA9IG5ldyBBcnJheUxpc3Q8SVJ1bnRpbWVDbGFzc3BhdGhFbnRyeT4oKTsKLQkJZm9yKElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeTogdGhpcy5qYXZhUHJvamVjdC5nZXRSYXdDbGFzc3BhdGgoKSkgewotCQkJaWYoY2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9DT05UQUlORVIpIHsKLQkJCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEphdmFDb3JlLmdldENsYXNzcGF0aENvbnRhaW5lcihjbGFzc3BhdGhFbnRyeS5nZXRQYXRoKCksIHRoaXMuamF2YVByb2plY3QpOwotCQkJCWlmKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lci5nZXRLaW5kKCkgPT0gSUNsYXNzcGF0aENvbnRhaW5lci5LX1NZU1RFTSkgewotCQkJCQljbGFzc3BhdGhFbnRyaWVzLmFkZCggCi0JCQkJCQlKYXZhUnVudGltZS5uZXdSdW50aW1lQ29udGFpbmVyQ2xhc3NwYXRoRW50cnkoCi0JCQkJCQkJY29udGFpbmVyLmdldFBhdGgoKSwgCi0JCQkJCQkJSVJ1bnRpbWVDbGFzc3BhdGhFbnRyeS5CT09UU1RSQVBfQ0xBU1NFUywgCi0JCQkJCQkJdGhpcy5qYXZhUHJvamVjdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xhc3NwYXRoRW50cmllczsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9nZW4vQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzY5NDVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi0vKioKLSAqICBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMKLXsKLQlwcml2YXRlIFN0cmluZyBjbGFzc3BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGFsbG93c0V4dGVuc2lvbnM7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYWRkaXRpb25hbEFyZ3M7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCi0JcHVibGljIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0dGVycy9zZXR0ZXJzICoqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYWxsb3dzRXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuYWxsb3dzRXh0ZW5zaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd3NFeHRlbnNpb25zKGJvb2xlYW4gYWxsb3dzRXh0ZW5zaW9ucykgewotCQl0aGlzLmFsbG93c0V4dGVuc2lvbnMgPSBhbGxvd3NFeHRlbnNpb25zOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzcGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMuY2xhc3NwYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRDbGFzc3BhdGgoU3RyaW5nIGNsYXNzcGF0aCl7Ci0JCXRoaXMuY2xhc3NwYXRoID0gY2xhc3NwYXRoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbEFyZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmFkZGl0aW9uYWxBcmdzOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsQXJncyhTdHJpbmcgYWRkaXRpb25hbEFyZ3MpewotCQl0aGlzLmFkZGl0aW9uYWxBcmdzID0gYWRkaXRpb25hbEFyZ3M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9nZW4vQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yT3B0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTJjZjc5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9DbGFzc2VzR2VuZXJhdG9yT3B0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmdlbjsKLQotCi0vKioKLSAqICBDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMKLXsKLQlwcml2YXRlIFN0cmluZyBwcm94eTsKLQlwcml2YXRlIFN0cmluZyBwcm94eUZpbGU7Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCXByaXZhdGUgYm9vbGVhbiBtYWtlc1JlYWRPbmx5OwotCXByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW47Ci0JcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzZXNIZWFkZXJHZW47Ci0JcHJpdmF0ZSBib29sZWFuIGlzVmVyYm9zZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNRdWlldDsKLQotCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc1htbFNjaGVtYTsKLQlwcml2YXRlIGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nOwotCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0OwotCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc0R0ZDsKLQlwcml2YXRlIGJvb2xlYW4gdHJlYXRzQXNXc2RsOwotCXByaXZhdGUgYm9vbGVhbiBzaG93c1ZlcnNpb247Ci0JcHJpdmF0ZSBib29sZWFuIHNob3dzSGVscDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXB1YmxpYyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldHRlcnMvc2V0dGVycyAqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJveHkoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm94eShTdHJpbmcgcHJveHkpewotCQl0aGlzLnByb3h5ID0gcHJveHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm94eUZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3h5RmlsZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJveHlGaWxlKFN0cmluZyBwcm94eUZpbGUpewotCQl0aGlzLnByb3h5RmlsZSA9IHByb3h5RmlsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oKSB7Ci0JCXJldHVybiB0aGlzLnN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW4pIHsKLQkJdGhpcy5zdXBwcmVzc2VzUGFja2FnZUluZm9HZW4gPSBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlc1N0cmljdFZhbGlkYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVzZXNTdHJpY3RWYWxpZGF0aW9uKGJvb2xlYW4gdXNlc1N0cmljdFZhbGlkYXRpb24pIHsKLQkJdGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbiA9IHVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1ha2VzUmVhZE9ubHkoKSB7Ci0JCXJldHVybiB0aGlzLm1ha2VzUmVhZE9ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFrZXNSZWFkT25seShib29sZWFuIG1ha2VzUmVhZE9ubHkpIHsKLQkJdGhpcy5tYWtlc1JlYWRPbmx5ID0gbWFrZXNSZWFkT25seTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc3VwcHJlc3Nlc0hlYWRlckdlbigpIHsKLQkJcmV0dXJuIHRoaXMuc3VwcHJlc3Nlc0hlYWRlckdlbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3VwcHJlc3Nlc0hlYWRlckdlbihib29sZWFuIHN1cHByZXNzZXNIZWFkZXJHZW4pewotCQl0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW4gPSBzdXBwcmVzc2VzSGVhZGVyR2VuOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmVyYm9zZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNWZXJib3NlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJc1ZlcmJvc2UoYm9vbGVhbiBpc1ZlcmJvc2UpewotCQl0aGlzLmlzVmVyYm9zZSA9IGlzVmVyYm9zZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNRdWlldCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNRdWlldDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SXNRdWlldChib29sZWFuIGlzUXVpZXQpewotCQl0aGlzLmlzUXVpZXQgPSBpc1F1aWV0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRyZWF0c0FzWG1sU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1htbFNjaGVtYTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJlYXRzQXNYbWxTY2hlbWEoYm9vbGVhbiB0cmVhdHNBc1htbFNjaGVtYSl7Ci0JCXRoaXMudHJlYXRzQXNYbWxTY2hlbWEgPSB0cmVhdHNBc1htbFNjaGVtYTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1JlbGF4Tmc7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRyZWF0c0FzUmVsYXhOZyhib29sZWFuIHRyZWF0c0FzUmVsYXhOZyl7Ci0JCXRoaXMudHJlYXRzQXNSZWxheE5nID0gdHJlYXRzQXNSZWxheE5nOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0KCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1JlbGF4TmdDb21wYWN0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUcmVhdHNBc1JlbGF4TmdDb21wYWN0KGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nQ29tcGFjdCl7Ci0JCXRoaXMudHJlYXRzQXNSZWxheE5nQ29tcGFjdCA9IHRyZWF0c0FzUmVsYXhOZ0NvbXBhY3Q7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHRyZWF0c0FzRHRkKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc0R0ZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VHJlYXRzQXNEdGQoYm9vbGVhbiB0cmVhdHNBc0R0ZCl7Ci0JCXRoaXMudHJlYXRzQXNEdGQgPSB0cmVhdHNBc0R0ZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdHJlYXRzQXNXc2RsKCkgewotCQlyZXR1cm4gdGhpcy50cmVhdHNBc1dzZGw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRyZWF0c0FzV3NkbChib29sZWFuIHRyZWF0c0FzV3NkbCl7Ci0JCXRoaXMudHJlYXRzQXNXc2RsID0gdHJlYXRzQXNXc2RsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzaG93c1ZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLnNob3dzVmVyc2lvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U2hvd3NWZXJzaW9uKGJvb2xlYW4gc2hvd3NWZXJzaW9uKXsKLQkJdGhpcy5zaG93c1ZlcnNpb24gPSBzaG93c1ZlcnNpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHNob3dzSGVscCgpIHsKLQkJcmV0dXJuIHRoaXMuc2hvd3NIZWxwOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaG93c0hlbHAoYm9vbGVhbiBzaG93c0hlbHApewotCQl0aGlzLnNob3dzSGVscCA9IHNob3dzSGVscDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9HZW5lcmF0ZUpheGJDbGFzc2VzSm9iLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9nZW4vR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGIyYTllLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9HZW5lcmF0ZUpheGJDbGFzc2VzSm9iLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuSnB0SmF4YkNvcmVNZXNzYWdlczsKLQotLyoqCi0gKiAgR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JcHJpdmF0ZSBmaW5hbCBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYWJzb2x1dGVMb2NhbFhzZFVyaTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBvdXRwdXREaXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBjYXRhbG9nOwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiB1c2VzTW94eUdlbmVyYXRvcjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzOwotCXByaXZhdGUgZmluYWwgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9uczsKLQlwcml2YXRlIGZpbmFsIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zIGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIEdlbmVyYXRlSmF4YkNsYXNzZXNKb2IoCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgCi0JCVN0cmluZyBhYnNvbHV0ZUxvY2FsWHNkVXJpLCAKLQkJU3RyaW5nIG91dHB1dERpciwKLQkJU3RyaW5nIHRhcmdldFBhY2thZ2UsIAotCQlTdHJpbmcgY2F0YWxvZywgCi0JCWJvb2xlYW4gdXNlc01veHlHZW5lcmF0b3IsCi0JCVN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzLAotCQlDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zLAotCQlDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKSB7Ci0JCQotCQlzdXBlcihKcHRKYXhiQ29yZU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JfZ2VuZXJhdGluZ0NsYXNzZXMpOwotCQlpZiAoamF2YVByb2plY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2plY3QgaXMgbnVsbCIpOwkJLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoYWJzb2x1dGVMb2NhbFhzZFVyaSkpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTY2hlbWEgY2Fubm90IGJlIGVtcHR5Iik7CS8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkob3V0cHV0RGlyKSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJPdXRwdXQgZGlyZWN0b3J5IGNhbm5vdCBiZSBlbXB0eSIpOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLmFic29sdXRlTG9jYWxYc2RVcmkgPSBhYnNvbHV0ZUxvY2FsWHNkVXJpOwotCQl0aGlzLm91dHB1dERpciA9IG91dHB1dERpcjsKLQkJdGhpcy50YXJnZXRQYWNrYWdlID0gdGFyZ2V0UGFja2FnZTsKLQkJdGhpcy5jYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy51c2VzTW94eUdlbmVyYXRvciA9IHVzZXNNb3h5R2VuZXJhdG9yOwotCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzID0gYmluZGluZ3NGaWxlTmFtZXM7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnM7Ci0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyA9IGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0JCXRoaXMuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKHRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgSnB0SmF4YkNvcmVNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yX2dlbmVyYXRpbmdDbGFzc2VzVGFzaywgMSk7Ci0JCXRyeSB7Ci0JCQl0aGlzLmNsYXNzZXNHZW5lcmF0b3JHZW5lcmF0ZSh0aGlzLmphdmFQcm9qZWN0LCAKLQkJCQl0aGlzLmFic29sdXRlTG9jYWxYc2RVcmksIAotCQkJCXRoaXMub3V0cHV0RGlyLCAKLQkJCQl0aGlzLnRhcmdldFBhY2thZ2UsIAotCQkJCXRoaXMuY2F0YWxvZywgCi0JCQkJdGhpcy51c2VzTW94eUdlbmVyYXRvciwKLQkJCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzLAotCQkJCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucywKLQkJCQl0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMsIAotCQkJCXNtLm5ld0NoaWxkKDEpKTsKLQkJfSAKLQkJY2F0Y2ggKE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCS8vIGZhbGwgdGhyb3VnaCBhbmQgdGVsbCBtb25pdG9yIHdlIGFyZSBkb25lCi0JCX0KLQkJY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gcmUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHJlKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLX0KLQotCXByaXZhdGUgdm9pZCBjbGFzc2VzR2VuZXJhdG9yR2VuZXJhdGUoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCAKLQkJU3RyaW5nIGFic29sdXRlTG9jYWxYc2RVcmksIAotCQlTdHJpbmcgb3V0cHV0RGlyLCAKLQkJU3RyaW5nIHRhcmdldFBhY2thZ2UsIAotCQlTdHJpbmcgY2F0YWxvZywgCi0JCWJvb2xlYW4gdXNlc01veHlHZW5lcmF0b3IsCi0JCVN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzLCAKLQkJQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9ucywKLQkJQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMgZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucywKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJQ2xhc3Nlc0dlbmVyYXRvci5nZW5lcmF0ZShqYXZhUHJvamVjdCwgCi0JCQlhYnNvbHV0ZUxvY2FsWHNkVXJpLCAKLQkJCW91dHB1dERpciwgCi0JCQl0YXJnZXRQYWNrYWdlLCAKLQkJCWNhdGFsb2csIAotCQkJdXNlc01veHlHZW5lcmF0b3IsIAotCQkJYmluZGluZ3NGaWxlTmFtZXMsIAotCQkJZ2VuZXJhdG9yT3B0aW9ucywgCi0JCQlnZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLAotCQkJbW9uaXRvcik7Ci0JCXJldHVybjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL1NjaGVtYUdlbmVyYXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvZ2VuL1NjaGVtYUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjgyOGI0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2dlbi9TY2hlbWFHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JSmF2YUxhdW5jaENvbmZpZ3VyYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmdlbi5BYnN0cmFjdEpwdEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkpwdEpheGJDb3JlTWVzc2FnZXM7Ci0KLS8qKgotICogIFNjaGVtYUdlbmVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKcHRHZW5lcmF0b3IKLXsKLQlzdGF0aWMgcHVibGljIFN0cmluZyBMQVVOQ0hfQ09ORklHX05BTUUgPSAiSkFYQiBTY2hlbWEgR2VuIFJ1biBDb25maWciOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBKQVhCX1NDSEVNQV9HRU5fUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuc2NoZW1hZ2VuIjsgICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgSkFYQl9TQ0hFTUFfR0VOX0NMQVNTID0gSkFYQl9TQ0hFTUFfR0VOX1BBQ0tBR0VfTkFNRSArICIuTWFpbiI7CSAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEVDTElQU0VMSU5LX0pBWEJfU0NIRU1BX0dFTl9QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4iOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIFN0cmluZyBFQ0xJUFNFTElOS19KQVhCX1NDSEVNQV9HRU5fQ0xBU1MgPSBFQ0xJUFNFTElOS19KQVhCX1NDSEVNQV9HRU5fUEFDS0FHRV9OQU1FICsgIi5NYWluIjsJICAvLyROT04tTkxTLTEkCi0JCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgRUNMSVBTRUxJTktfSkFYQl9DT05URVhUX0ZBQ1RPUlkgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dEZhY3RvcnkiOyAgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEVDTElQU0VMSU5LX0pBWEJfUFJPUEVSVElFU19GSUxFX0NPTlRFTlRTID0gImphdmF4LnhtbC5iaW5kLmNvbnRleHQuZmFjdG9yeT0iICsgRUNMSVBTRUxJTktfSkFYQl9DT05URVhUX0ZBQ1RPUlk7ICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgSkFYQl9QUk9QRVJUSUVTX0ZJTEVfTkFNRSA9ICJqYXhiLnByb3BlcnRpZXMiOyAgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEpBWEJfU0NIRU1BX0dFTl9KQVJfUFJFRklYID0gSkFYQl9TQ0hFTUFfR0VOX1BBQ0tBR0VfTkFNRSArICJfIjsJLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEVDTElQU0VMSU5LX0pBWEJfU0NIRU1BX0dFTl9KQVJfUFJFRklYID0gRUNMSVBTRUxJTktfSkFYQl9TQ0hFTUFfR0VOX1BBQ0tBR0VfTkFNRSArICJfIjsJLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgSkFYQl9HRU5FUklDX1NDSEVNQV9HRU5fQ0xBU1MgPSAiamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQiOwkvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgSkFYQl9FQ0xJUFNFTElOS19TQ0hFTUFfR0VOX0NMQVNTID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHQiOwkvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXM7Ci0JcHJpdmF0ZSAgU3RyaW5nIG1haW5UeXBlOwotCXByaXZhdGUgIGJvb2xlYW4gdXNlTW94eTsKLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZSgKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgCi0JCQlTdHJpbmcgdGFyZ2V0U2NoZW1hTmFtZSwgCi0JCQlTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzLAotCQkJYm9vbGVhbiB1c2VNb3h5LAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQluZXcgU2NoZW1hR2VuZXJhdG9yKGphdmFQcm9qZWN0LCAKLQkJCXRhcmdldFNjaGVtYU5hbWUsIAotCQkJc291cmNlQ2xhc3NOYW1lcywKLQkJCXVzZU1veHkpLmdlbmVyYXRlKG1vbml0b3IpOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgU2NoZW1hR2VuZXJhdG9yKAotCQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCAKLQkJCVN0cmluZyB0YXJnZXRTY2hlbWFOYW1lLCAKLQkJCVN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXMsCi0JCQlib29sZWFuIHVzZU1veHkpIHsKLQkJc3VwZXIoamF2YVByb2plY3QpOwotCQl0aGlzLnRhcmdldFNjaGVtYU5hbWUgPSB0YXJnZXRTY2hlbWFOYW1lOwotCQl0aGlzLnNvdXJjZUNsYXNzTmFtZXMgPSBzb3VyY2VDbGFzc05hbWVzOwotCQl0aGlzLnVzZU1veHkgPSB1c2VNb3h5OwotCQl0aGlzLm1haW5UeXBlID0gKHRoaXMudXNlTW94eSkgPyAKLQkJCQlFQ0xJUFNFTElOS19KQVhCX1NDSEVNQV9HRU5fQ0xBU1MgOgotCQkJCUpBWEJfU0NIRU1BX0dFTl9DTEFTUzsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYWluVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFpblR5cGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXVuY2hDb25maWdOYW1lKCkgewotCQlyZXR1cm4gTEFVTkNIX0NPTkZJR19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Qm9vdHN0cmFwSmFyUHJlZml4KCkgewotCQlyZXR1cm4gKHRoaXMudXNlTW94eSkgPyAKLQkJCQkJCUVDTElQU0VMSU5LX0pBWEJfU0NIRU1BX0dFTl9KQVJfUFJFRklYIDoKLQkJCQkJCUpBWEJfU0NIRU1BX0dFTl9KQVJfUFJFRklYOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHByZUdlbmVyYXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBnZW5lcmF0ZSBqYXhiLnByb3BlcnRpZXMgZmlsZSBpZiBuZWNlc3NhcnkKLQkJaWYgKHRoaXMudXNlTW94eSl7Ci0JCQlpZiAoIWlzSmF4YlByb3BlcnRpZXNGaWxlUHJlc2VudCgpKXsKLQkJCQl0aGlzLmdlbmVyYXRlSmF4YlByb3BlcnRpZXNGaWxlKG1vbml0b3IpOwotCQkJfQotCQkJZWxzZSBpZiAoIWlzSmF4YkNvbnRleHRNb3h5KCkpewotCQkJCS8vcHJvcGVydGllcyBmaWxlIGFjdHVhbGx5IHNwZWNpZmllcyBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbgotCQkJCS8vb3ZlcnJpZGUgd2l6YXJkIHNldHRpbmcgYW5kIGZhbGwgYmFjayB0byBnZW5lcmljIGdlbmVyYXRpb24KLQkJCQl0aGlzLnVzZU1veHkgPSBmYWxzZTsKLQkJCQl0aGlzLm1haW5UeXBlID0gSkFYQl9TQ0hFTUFfR0VOX0NMQVNTOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBMYXVuY2ggQ29uZmlndXJhdGlvbiBTZXR1cCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkQ2xhc3NwYXRoKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlMaXN0PFN0cmluZz4gY2xhc3NwYXRoID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCS8vIFNjaGVtYV9HZW4gamFyCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRCb290c3RyYXBKYXJDbGFzc3BhdGhFbnRyeSgpLmdldE1lbWVudG8oKSk7Ci0JCS8vIERlZmF1bHQgUHJvamVjdCBjbGFzc3BhdGgKLQkJY2xhc3NwYXRoLmFkZCh0aGlzLmdldERlZmF1bHRQcm9qZWN0Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQkvLyBTeXN0ZW0gTGlicmFyeSAgCi0JCWNsYXNzcGF0aC5hZGQodGhpcy5nZXRTeXN0ZW1MaWJyYXJ5Q2xhc3NwYXRoRW50cnkoKS5nZXRNZW1lbnRvKCkpOwotCQlyZXR1cm4gY2xhc3NwYXRoOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5UHJvZ3JhbUFyZ3VtZW50cygpIHsKLQotCQlTdHJpbmdCdWZmZXIgcHJvZ3JhbUFyZ3VtZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJLy8gc291cmNlQ2xhc3NOYW1lcwotCQl0aGlzLmFwcGVuZENsYXNzTmFtZUFyZ3VtZW50cyhwcm9ncmFtQXJndW1lbnRzKTsKLQotCQkvLyBzY2hlbWEKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoIiAtcyBcIiIpOwkgIC8vJE5PTi1OTFMtMSQKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQodGhpcy50YXJnZXRTY2hlbWFOYW1lKTsKLQkJcHJvZ3JhbUFyZ3VtZW50cy5hcHBlbmQoJyInKTsKLQotCQl0aGlzLmxhdW5jaENvbmZpZy5zZXRBdHRyaWJ1dGUoSUphdmFMYXVuY2hDb25maWd1cmF0aW9uQ29uc3RhbnRzLkFUVFJfUFJPR1JBTV9BUkdVTUVOVFMsIHByb2dyYW1Bcmd1bWVudHMudG9TdHJpbmcoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgdm9pZCBhcHBlbmRDbGFzc05hbWVBcmd1bWVudHMoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCWZvciAoU3RyaW5nIGNsYXNzTmFtZSA6IHRoaXMuc291cmNlQ2xhc3NOYW1lcykgewotCQkJc2IuYXBwZW5kKCIgLWMgIik7CSAgLy8kTk9OLU5MUy0xJAotCQkJc2IuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgImpheGIucHJvcGVydGllcyIgZmlsZSB0aGF0IGlzIGZvdW5kIGluIGEgdmFsaWQgc291cmNlCi0JICogZm9sZGVyIGluIHRoZSBwcm9qZWN0LgotCSAqIAotCSAqIFJldHVybnMgbnVsbCBpZiBubyAiamF4Yi5wcm9wZXJ0aWVzIiBmaWxlIGlzIGZvdW5kLgotCSAqLwotCXByaXZhdGUgSUZpbGUgZ2V0SmF4YlByb3BlcnRpZXNGaWxlKCkgewotCQlyZXR1cm4gZ2V0SmF4YlByb3BlcnRpZXNGaWxlRnJvbVBhY2thZ2VSb290cyhKRFRUb29scy5nZXRKYXZhU291cmNlRm9sZGVycyh0aGlzLmphdmFQcm9qZWN0KSk7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgZ2V0SmF4YlByb3BlcnRpZXNGaWxlRnJvbVBhY2thZ2VSb290cyhJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4gcGFja2FnZUZyYWdtZW50Um9vdHMpewotCQlPYmplY3RbXSBvYmplY3RzID0gbnVsbDsKLQkJSUphdmFFbGVtZW50W10gamF2YUVsZW1lbnRzOwotCQl0cnkgewotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgOiBwYWNrYWdlRnJhZ21lbnRSb290cykgewotCQkJCWphdmFFbGVtZW50cyA9IHBmci5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoSUphdmFFbGVtZW50IGphdmFFbGVtZW50IDogamF2YUVsZW1lbnRzKSB7Ci0JCQkJCW9iamVjdHMgPSAoKElQYWNrYWdlRnJhZ21lbnQpIGphdmFFbGVtZW50KS5nZXROb25KYXZhUmVzb3VyY2VzKCk7Ci0JCQkJCWZvciAoT2JqZWN0IG9iamVjdCA6IG9iamVjdHMpIHsKLQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIG9iamVjdDsKLQkJCQkJCWlmIChyZXNvdXJjZS5nZXROYW1lKCkuZXF1YWxzKEpBWEJfUFJPUEVSVElFU19GSUxFX05BTUUpKSB7Ci0JCQkJCQkJLy8gamF4Yi5wcm9wZXJ0aWVzIGhhcyBiZWVuIGZvdW5kCi0JCQkJCQkJcmV0dXJuIChJRmlsZSlyZXNvdXJjZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oam1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQkKLQotCXByaXZhdGUgYm9vbGVhbiBpc0pheGJQcm9wZXJ0aWVzRmlsZVByZXNlbnQoKXsKLQkJcmV0dXJuIGdldEpheGJQcm9wZXJ0aWVzRmlsZSgpIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNKYXhiQ29udGV4dE1veHkoKXsJCi0KLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBnZXRKYXhiUHJvcGVydGllc0ZpbGUoKS5nZXRDb250ZW50cygpOwotCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCS8vamF4Yi5wcm9wZXJ0aWVzIHdpbGwgb25seSBjb250YWluIG9uZSBwcm9wZXJ0eSBlbnRyeSwgdGhlIEpBWEJDb250ZXh0RmFjdG9yeQotCQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSBsaW5lLnN1YnN0cmluZyhsaW5lLmluZGV4T2YoIj0iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocHJvcGVydHlWYWx1ZS5lcXVhbHMoRUNMSVBTRUxJTktfSkFYQl9DT05URVhUX0ZBQ1RPUlkpKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSl7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihjZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSl7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UpOwotCQl9IGZpbmFsbHkgewotCQkgICAgaWYgKGluICE9IG51bGwpewotCQkgICAgCXRyeXsKLQkJICAgIAkJaW4uY2xvc2UoKTsKLQkJICAgIAl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJICAgIAkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oaW9lKTsKLQkJCQl9Ci0JCSAgICB9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVKYXhiUHJvcGVydGllc0ZpbGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMSk7Ci0JCXNtLnN1YlRhc2soSnB0SmF4YkNvcmVNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JfY3JlYXRpbmdKQVhCUHJvcGVydGllc0ZpbGVUYXNrKTsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gZmluZFBhY2thZ2VGcmFnZW1lbnRGb3JTb3VyY2VDbGFzc05hbWUodGhpcy5zb3VyY2VDbGFzc05hbWVzWzBdKTsKLQotCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKXBhY2thZ2VGcmFnbWVudC5nZXRSZXNvdXJjZSgpOwotCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoSkFYQl9QUk9QRVJUSUVTX0ZJTEVfTkFNRSk7Ci0JCQkKLQkJYnl0ZVtdIGJ5dGVzOwotCQl0cnkgewotCQkJYnl0ZXMgPSBFQ0xJUFNFTElOS19KQVhCX1BST1BFUlRJRVNfRklMRV9DT05URU5UUy5nZXRCeXRlcygiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9ICAgIAotCQkKLQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkKLQkJdHJ5IHsKLQkJCS8vdGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBhcyBhIHJlc3VsdCBvZiBjYWxsaW5nIGNyZWF0ZQotCQkgICAgZmlsZS5jcmVhdGUoY29udGVudHMsIElSZXNvdXJjZS5OT05FLCBzbS5uZXdDaGlsZCgxKSk7CQkKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50IGZpbmRQYWNrYWdlRnJhZ2VtZW50Rm9yU291cmNlQ2xhc3NOYW1lKFN0cmluZyBzb3VyY2VDbGFzc05hbWUpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gc291cmNlQ2xhc3NOYW1lLnN1YnN0cmluZygwLCBzb3VyY2VDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCQotCQkvL0ZpbmQgdGhlIGV4aXN0aW5nIHBhY2thZ2UgZnJhZ21lbnQgd2hlcmUgd2Ugd2FudCB0byBnZW5lcmF0ZQotCQlmb3IgKElQYWNrYWdlRnJhZ21lbnRSb290IHBmciA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKHRoaXMuamF2YVByb2plY3QpKSB7Ci0JCQkvL3VzZSB0aGUgcGFja2FnZSBvZiB0aGUgZmlyc3Qgc291cmNlIGNsYXNzIGFzIHRoZSBwYWNrYWdlIGZvciBnZW5lcmF0aW9uCi0JCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHBmci5nZXRQYWNrYWdlRnJhZ21lbnQocGFja2FnZU5hbWUpOwotCQkJaWYgKHBhY2thZ2VGcmFnbWVudC5leGlzdHMoKSl7Ci0JCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudDsKLQkJCX0KLQkJfQotCQkvL3RoZSBleGlzdGluZyBwYWNrYWdlIGZyYWdtZW50IHdhcyBub3QgZm91bmQKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSmF2YSBwYWNrYWdlIG11c3QgZXhpc3QgZm9yIHNvdXJjZSBjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX0ZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2pheGIyMS9HZW5lcmljSmF4Yl8yXzFfRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzU5NGJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2pheGIyMS9HZW5lcmljSmF4Yl8yXzFfRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpheGJGYWN0b3J5OwotCi0vKioKLSAqIEdlbmVyaWMgSkFYQiB2ZXJzaW9uIDIuMQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJfMl8xX0ZhY3RvcnkKLQkJZXh0ZW5kcyBBYnN0cmFjdEpheGJGYWN0b3J5IHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF4Yl8yXzFfRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljSmF4Yl8yXzFfRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiMGY0YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkdlbmVyaWNKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbFRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxWYWx1ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yVHlwZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sQW55RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRWxlbWVudHNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFJlZ2lzdHJ5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYVR5cGVzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFNlZUFsc29Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhicHJvcHMuSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEFic3RyYWN0SmF4YlBsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCXByb3RlY3RlZCBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8xOwotCX0KLQkKLQlwdWJsaWMgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9GYWN0b3J5Lmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkSmF2YVRvU2NoZW1hVHlwZXMoKSB7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCW1hcC5wdXQoImJvb2xlYW4iLCAiYm9vbGVhbiIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuQm9vbGVhbiIsICJib29sZWFuIik7Ci0JCW1hcC5wdXQoImJ5dGUiLCAiYnl0ZSIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuQnl0ZSIsICJieXRlIik7Ci0JCW1hcC5wdXQoInNob3J0IiwgInNob3J0Iik7Ci0JCW1hcC5wdXQoImphdmEubGFuZy5TaG9ydCIsICJzaG9ydCIpOwotCQltYXAucHV0KCJpbnQiLCAiaW50Iik7Ci0JCW1hcC5wdXQoImphdmEubGFuZy5JbnRlZ2VyIiwgImludCIpOwotCQltYXAucHV0KCJsb25nIiwgImxvbmciKTsKLQkJbWFwLnB1dCgiamF2YS5sYW5nLkxvbmciLCAibG9uZyIpOwotCQltYXAucHV0KCJmbG9hdCIsICJmbG9hdCIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuRmxvYXQiLCAiZmxvYXQiKTsKLQkJbWFwLnB1dCgiZG91YmxlIiwgImRvdWJsZSIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuRG91YmxlIiwgImRvdWJsZSIpOwotCQltYXAucHV0KCJqYXZhLmxhbmcuU3RyaW5nIiwgInN0cmluZyIpOwotCQltYXAucHV0KCJqYXZhLm1hdGguQmlnSW50ZWdlciIsICJpbnRlZ2VyIik7Ci0JCW1hcC5wdXQoImphdmEubWF0aC5CaWdEZWNpbWFsIiwgImRlY2ltYWwiKTsKLQkJbWFwLnB1dCgiamF2YS51dGlsLkNhbGVuZGFyIiwgImRhdGVUaW1lIik7Ci0JCW1hcC5wdXQoImphdmEudXRpbC5EYXRlIiwgImRhdGVUaW1lIik7Ci0JCW1hcC5wdXQoImphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWUiLCAiUU5hbWUiKTsKLQkJbWFwLnB1dCgiamF2YS5uZXQuVVJJIiwgInN0cmluZyIpOwotCQltYXAucHV0KCJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiLCAiYW55U2ltcGxlVHlwZSIpOwotCQltYXAucHV0KCJqYXZheC54bWwuZGF0YXR5cGUuRHVyYXRpb24iLCAiZHVyYXRpb24iKTsKLQkJbWFwLnB1dCgiamF2YS5sYW5nLk9iamVjdCIsICJhbnlUeXBlIik7Ci0JCW1hcC5wdXQoImphdmEuYXd0LkltYWdlIiwgImJhc2U2NEJpbmFyeSIpOwotCQltYXAucHV0KCJqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIiwgImJhc2U2NEJpbmFyeSIpOwotCQltYXAucHV0KCJqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZSIsICJiYXNlNjRCaW5hcnkiKTsKLQkJbWFwLnB1dCgiamF2YS51dGlsLlVVSUQiLCAic3RyaW5nIik7Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQkvLyBvcmRlciBzaG91bGQgbm90IGJlIGltcG9ydGFudCBoZXJlCi0JCXJldHVybiBuZXcgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUphdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQkJSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlKYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpfTsKLQl9Ci0JCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUEFDS0FHRV9JTkZPX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYnVpbGRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25bXSB7Ci0JCQkJWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxFbGVtZW50c0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVudW1Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbEVudW1WYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbElEUkVGQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxNaW1lVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sTWl4ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sU2NoZW1hQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sU2VlQWxzb0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJCQlYbWxWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIGJ1aWxkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIHsKLQkJCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFYbWxFbGVtZW50UmVmTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbFRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVhtbFZhbHVlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhMjM1Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIyL0dlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2pheGIyMi9HZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZGY5ZTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIyL0dlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkdlbmVyaWNKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8yOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9GYWN0b3J5Lmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvamF4YjIyL0dlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjIvR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ5NDRlNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9qYXhiMjIvR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSB7Ci0KLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJKcmVMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJKcmVMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDA4ZjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KYXhiSnJlTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3YuSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci0KLQotcHVibGljIGNsYXNzIEpheGJKcmVMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWV4dGVuZHMgTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlpbXBsZW1lbnRzIEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwcml2YXRlIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybTsKLQkKLQkKLQlwdWJsaWMgSmF4YkpyZUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQbGF0Zm9ybTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SmF4YlBsYXRmb3JtKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybSkgewotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBvbGQgPSB0aGlzLmpheGJQbGF0Zm9ybTsKLQkJdGhpcy5qYXhiUGxhdGZvcm0gPSBqYXhiUGxhdGZvcm07Ci0JCWlmIChvbGQgIT0gamF4YlBsYXRmb3JtKSB7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoUFJPUF9KQVhCX1BMQVRGT1JNLCBvbGQsIGpheGJQbGF0Zm9ybSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RhdHVzIHZhbGlkYXRlKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlKCk7Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCWZvciAoTGlicmFyeVZhbGlkYXRvciBsaWJyYXJ5VmFsaWRhdG9yIDogSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRMaWJyYXJ5VmFsaWRhdG9ycyh0aGlzKSkgewotCQkJc3RhdHVzID0gbGlicmFyeVZhbGlkYXRvci52YWxpZGF0ZSh0aGlzKTsKLQkJCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCQlyZXR1cm4gc3RhdHVzOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnByb3YvSmF4Yk9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjY3Njk5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnByb3YvSmF4Yk9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5saWJwcm92LkpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci0KLQotcHVibGljIGNsYXNzIEpheGJPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJZXh0ZW5kcyBKcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJaW1wbGVtZW50cyBKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyB7Ci0JCi0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBqYXhiUGxhdGZvcm07Ci0JCi0JCi0JcHVibGljIEpheGJPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQbGF0Zm9ybTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SmF4YlBsYXRmb3JtKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybSkgewotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBvbGQgPSB0aGlzLmpheGJQbGF0Zm9ybTsKLQkJdGhpcy5qYXhiUGxhdGZvcm0gPSBqYXhiUGxhdGZvcm07Ci0JCW5vdGlmeUxpc3RlbmVycyhQUk9QX0pBWEJfUExBVEZPUk0sIG9sZCwgamF4YlBsYXRmb3JtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9KYXhiVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzNDljYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJwcm92L0pheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KcHRVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3YuSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLQotcHVibGljIGNsYXNzIEpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQlleHRlbmRzIEpwdFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWltcGxlbWVudHMgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgewotCQotCXByaXZhdGUgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gamF4YlBsYXRmb3JtOwotCQotCQotCXB1YmxpYyBKYXhiVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpheGJQbGF0Zm9ybTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SmF4YlBsYXRmb3JtKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybSkgewotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBvbGQgPSB0aGlzLmpheGJQbGF0Zm9ybTsKLQkJdGhpcy5qYXhiUGxhdGZvcm0gPSBqYXhiUGxhdGZvcm07Ci0JCW5vdGlmeUxpc3RlbmVycyhQUk9QX0pBWEJfUExBVEZPUk0sIG9sZCwgamF4YlBsYXRmb3JtKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJ2YWwvR2VuZXJpY0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMwZmMzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IgCi0vLwkJZXh0ZW5kcyBBYnN0cmFjdE9zZ2lCdW5kbGVzTGlicmFyeVZhbGlkYXRvciAKLQkJewotCQotLy8JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLS8vCQlKcGFPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcganBhQ29uZmlnIAotLy8JCQkJPSAoSnBhT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7Ci0vLwkJTWFwPFN0cmluZywgVmVyc2lvblJhbmdlW10+IGJ1bmRsZVZlcnNpb25SYW5nZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFZlcnNpb25SYW5nZVtdPigpOwotLy8JCVN0cmluZyBidW5kbGVOYW1lID0gImphdmF4LnBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotLy8JCVZlcnNpb25SYW5nZVtdIHZlcnNpb25SYW5nZXMgPSBuZXcgVmVyc2lvblJhbmdlWzBdOwotLy8JCWlmIChjb25maWcuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmVxdWFscyhKcGFGYWNldC5WRVJTSU9OXzFfMCkpIHsKLS8vCQkJdmVyc2lvblJhbmdlcyA9IG5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQllbHNlIGlmIChjb25maWcuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpLmVxdWFscyhKcGFGYWNldC5WRVJTSU9OXzJfMCkpIHsKLS8vCQkJdmVyc2lvblJhbmdlcyA9IG5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfTsgLy8kTk9OLU5MUy0xJAotLy8JCX0KLS8vCQlidW5kbGVWZXJzaW9uUmFuZ2VzLnB1dChidW5kbGVOYW1lLCB2ZXJzaW9uUmFuZ2VzKTsKLS8vCQlyZXR1cm4gdmFsaWRhdGUoanBhQ29uZmlnLCBidW5kbGVWZXJzaW9uUmFuZ2VzKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJ2YWwvR2VuZXJpY0pheGJVc2VyTGlicmFyeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGFiZTExLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwubGlidmFsLkxpYlZhbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KYXhiVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IKLQkJaW1wbGVtZW50cyBMaWJyYXJ5VmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgc3luY2hyb25pemVkIElTdGF0dXMgdmFsaWRhdGUoSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJCi0JCUpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqYXhiQ29uZmlnIAotCQkJCT0gKEpheGJVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQkKLQkJSVByb2plY3RGYWNldFZlcnNpb24gamF4YlZlcnNpb24gPSBjb25maWcuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXZhVmVyc2lvbiA9IEpheGJMaWJWYWxVdGlsLmdldEphdmFWZXJzaW9uKGpheGJDb25maWcpOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXZhSmF4YlZlcnNpb24gPSBKYXhiTGliVmFsVXRpbC5maW5kSmF2YUpheGJWZXJzaW9uKGpheGJDb25maWcpOwotCQkKLQkJSXRlcmFibGU8SVBhdGg+IGxpYnJhcnlQYXRocyA9IAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElDbGFzc3BhdGhFbnRyeSwgSVBhdGg+KGpheGJDb25maWcucmVzb2x2ZSgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSVBhdGggdHJhbnNmb3JtKElDbGFzc3BhdGhFbnRyeSBvKSB7Ci0JCQkJCQlyZXR1cm4gby5nZXRQYXRoKCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkKLQkJLy8gZGV2LXRpbWUgcG9ydGlvbiBvZiB2YWxpZGF0aW9uIC0gZXJyb3IgaWYgYWN0dWFsIGphdmEgbGlicmFyeSAqY29uZmxpY3RzIHdpdGgqIGpheGIgZmFjZXQKLQkJLy8gb3IgaWYgbGlicmFyeSBkb2VzIG5vdCBwcm92aWRlIHN1cHBsZW1lbnRhbCBjbGFzc2VzCi0JCQotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqcmVKYXhiVmVyc2lvbiA9IEpheGJMaWJWYWxVdGlsLmZpbmRKcmVKYXhiVmVyc2lvbihqYXhiQ29uZmlnKTsKLQkJCi0JCS8vIG51bGwgaGVyZSBpbXBsaWVzIHNvbWV0aGluZyBwcmlvciB0byBqYXhiIDIuMQotCQlpZiAoanJlSmF4YlZlcnNpb24gIT0gbnVsbCkgewotCQkJaWYgKGpyZUpheGJWZXJzaW9uLmNvbXBhcmVUbyhqYXhiVmVyc2lvbikgPCAwKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJCUpwdEpheGJDb3JlTWVzc2FnZXMuVXNlckxpYnJhcnlWYWxpZGF0b3JfaW5jb21wYXRpYmxlSmF2YUxpYnJhcnksCi0JCQkJCQluZXcgU3RyaW5nW10ge2pheGJWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKX0pOwotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpheGJDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYganJlIGlzIGVub3VnaCBmb3IgamF4YiB2ZXJzaW9uLCB3ZSBkb24ndCBsb29rIGZvciBjbGFzc2VzIGluIHRoZSBsaWJyYXJ5Ci0JCWVsc2UgewotCQkJU2V0PFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkKLQkJCWNsYXNzTmFtZXMuYWRkKCJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc28iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGpheGJWZXJzaW9uLmNvbXBhcmVUbyhKYXhiRmFjZXQuVkVSU0lPTl8yXzIpID49IDApIHsKLQkJCQljbGFzc05hbWVzLmFkZCgiamF2YXgueG1sLmJpbmQuSkFYQlBlcm1pc3Npb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJCi0JCQlJU3RhdHVzIHN0YXR1cyA9IExpYlZhbFV0aWwudmFsaWRhdGUobGlicmFyeVBhdGhzLCBjbGFzc05hbWVzKTsKLQkJCQotCQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJCXJldHVybiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIHJ1bnRpbWUgcG9ydGlvbiBvZiB2YWxpZGF0aW9uIC0gd2FybiBpZiBqYXZhIGZhY2V0IGlzIGluc3VmZmljaWVudCB0byBwcm92aWRlIGpheGIgYXBpLgotCQkvLyB1c2VyIG1heSBvdmVycmlkZSBpbXBsZW1lbnRhdGlvbiBtYW51YWxseSwgaG93ZXZlcgotCQkvLyBhc3N1bWUgMS42IHJ1bnRpbWUgZW52aXJvbnMgYXJlIGxhdGVzdCAod2l0aCBqYXhiIDIuMSwgbm90IDIuMCkKLQkJCi0JCS8vIG51bGwgaGVyZSBpbXBsaWVzIHNvbWV0aGluZyBwcmlvciB0byBqYXhiIDIuMQotCQlpZiAoamF2YUpheGJWZXJzaW9uICE9IG51bGwgJiYgamF2YUpheGJWZXJzaW9uLmNvbXBhcmVUbyhqYXhiVmVyc2lvbikgPCAwKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKAotCQkJCQlKcHRKYXhiQ29yZU1lc3NhZ2VzLlVzZXJMaWJyYXJ5VmFsaWRhdG9yX2luY29tcGF0aWJsZUphdmFGYWNldCwKLQkJCQkJbmV3IFN0cmluZ1tdIHtqYXZhVmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCksIGpheGJWZXJzaW9uLmdldFZlcnNpb25TdHJpbmcoKX0pOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJ2YWwvSmF4YkpyZUxpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9KYXhiSnJlTGlicmFyeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzAxZGEzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9KYXhiSnJlTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnZhbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnByb3YuSnB0TGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlidmFsLkxpYnJhcnlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5HZW5lcmljSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5KcHRKYXhiQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUubGlicHJvdi5KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiSnJlTGlicmFyeVZhbGlkYXRvcgotCQlpbXBsZW1lbnRzIExpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCQotCQlKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqYXhiQ29uZmlnIAotCQkJCT0gKEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWc7Ci0JCQotCQlpZiAoISBqYXhiQ29uZmlnLmdldEpheGJQbGF0Zm9ybSgpLmdldEdyb3VwKCkuZXF1YWxzKEdlbmVyaWNKYXhiUGxhdGZvcm0uR1JPVVApKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEpwdEpheGJDb3JlTWVzc2FnZXMuSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkUGxhdGZvcm0pOwotCQl9Ci0JCQotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXhiVmVyc2lvbiA9IGNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGphdmFWZXJzaW9uID0gSmF4YkxpYlZhbFV0aWwuZ2V0SmF2YVZlcnNpb24oamF4YkNvbmZpZyk7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGphdmFKYXhiVmVyc2lvbiA9IEpheGJMaWJWYWxVdGlsLmZpbmRKYXZhSmF4YlZlcnNpb24oamF4YkNvbmZpZyk7Ci0JCQotCQkvLyBkZXYtdGltZSBwb3J0aW9uIG9mIHZhbGlkYXRpb24gLSBlcnJvciBpZiBhY3R1YWwgamF2YSBsaWJyYXJ5IGRvZXMgbm90IHN1cHBvcnQgamF4YiBmYWNldAotCQkKLQkJSVByb2plY3RGYWNldFZlcnNpb24ganJlSmF4YlZlcnNpb24gPSBKYXhiTGliVmFsVXRpbC5maW5kSnJlSmF4YlZlcnNpb24oamF4YkNvbmZpZyk7Ci0JCQotCQkvLyBudWxsIGhlcmUgaW1wbGllcyBzb21ldGhpbmcgcHJpb3IgdG8gamF4YiAyLjEKLQkJaWYgKGpyZUpheGJWZXJzaW9uID09IG51bGwgfHwganJlSmF4YlZlcnNpb24uY29tcGFyZVRvKGpheGJWZXJzaW9uKSA8IDApIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoCi0JCQkJCUpwdEpheGJDb3JlTWVzc2FnZXMuSnJlTGlicmFyeVZhbGlkYXRvcl9pbnZhbGlkSmF2YUxpYnJhcnksCi0JCQkJCW5ldyBTdHJpbmdbXSB7amF4YlZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpfSk7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQl9Ci0JCQotCQkvLyBydW50aW1lIHBvcnRpb24gb2YgdmFsaWRhdGlvbiAtIHdhcm4gaWYgamF2YSBmYWNldCBpcyBpbnN1ZmZpY2llbnQgdG8gcHJvdmlkZSBqYXhiIGFwaS4KLQkJLy8gdXNlciBtYXkgb3ZlcnJpZGUgaW1wbGVtZW50YXRpb24gbWFudWFsbHksIGhvd2V2ZXIKLQkJLy8gYXNzdW1lIDEuNiBydW50aW1lIGVudmlyb25zIGFyZSBsYXRlc3QgKHdpdGggamF4YiAyLjEsIG5vdCAyLjApCi0JCQotCQkvLyBudWxsIGhlcmUgaW1wbGllcyBzb21ldGhpbmcgcHJpb3IgdG8gamF4YiAyLjEKLQkJaWYgKGphdmFKYXhiVmVyc2lvbiA9PSBudWxsIHx8IGphdmFKYXhiVmVyc2lvbi5jb21wYXJlVG8oamF4YlZlcnNpb24pIDwgMCkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJSnB0SmF4YkNvcmVNZXNzYWdlcy5KcmVMaWJyYXJ5VmFsaWRhdG9yX2ludmFsaWRKYXZhRmFjZXQsCi0JCQkJCW5ldyBTdHJpbmdbXSB7amF2YVZlcnNpb24uZ2V0VmVyc2lvblN0cmluZygpLCBqYXhiVmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCl9KTsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSnB0SmF4YkNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJfQotCQkKLQkJLy8gVE9ETyAtIGNoZWNrIGZvciB4amMgY2xhc3NlcyB3aGVuIHdlIHN1cHBvcnQgamRrIHZlcnNpb24gb2YgeGpjCi0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9saWJ2YWwvSmF4YkxpYlZhbFV0aWwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9KYXhiTGliVmFsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTVkMGFiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL2xpYnZhbC9KYXhiTGliVmFsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLklWTUluc3RhbGxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSmF2YVJ1bnRpbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5MaWJyYXJ5TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3YuSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSmF2YUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlN0YW5kYXJkSnJlUnVudGltZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWUuSVJ1bnRpbWVDb21wb25lbnQ7Ci0KLQotcHVibGljIGNsYXNzIEpheGJMaWJWYWxVdGlsIHsKLQkKLQlzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0SmF2YVZlcnNpb24oSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiBjb25maWcuZ2V0RmFjZXRlZFByb2plY3QoKS5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKEphdmFGYWNldC5GQUNFVCk7Ci0JfQotCQotCS8qKiAKLQkgKiBSZXR1cm4gamF4YiB2ZXJzaW9uIGRldGVybWluZWQgYnkgamF2YSBmYWNldCB2ZXJzaW9uLgotCSAqIEFzc3VtZSBoaWdoZXN0IHVwZGF0ZSBvZiBqYXZhIChpLmUuIGphdmEgMS42IG1hcHMgdG8gamF4YiAyLjEpCi0JICovCi0Jc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZpbmRKYXZhSmF4YlZlcnNpb24oSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGphdmFWZXJzaW9uID0gZ2V0SmF2YVZlcnNpb24oY29uZmlnKTsKLQkJCi0JCWlmIChqYXZhVmVyc2lvbiA9PSBKYXZhRmFjZXQuVkVSU0lPTl8xXzYpIHsKLQkJCXJldHVybiBKYXhiRmFjZXQuVkVSU0lPTl8yXzE7Ci0JCX0KLQkJZWxzZSBpZiAoamF2YVZlcnNpb24gPT0gSmF2YUZhY2V0LlZFUlNJT05fMV83KSB7Ci0JCQlyZXR1cm4gSmF4YkZhY2V0LlZFUlNJT05fMl8yOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0Jc3RhdGljIElQcm9qZWN0RmFjZXRWZXJzaW9uIGZpbmRKcmVKYXhiVmVyc2lvbihKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcpIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IGNvbmZpZy5nZXRGYWNldGVkUHJvamVjdCgpLmdldFByaW1hcnlSdW50aW1lKCk7Ci0JCQotCQlpZiAocnVudGltZSAhPSBudWxsKSB7Ci0JCQlmb3IgKElSdW50aW1lQ29tcG9uZW50IHJjIDogcnVudGltZS5nZXRSdW50aW1lQ29tcG9uZW50cygpKSB7Ci0JCQkJSVZNSW5zdGFsbCB2bSA9IGZpbmRWTUluc3RhbGwocmMpOwotCQkJCWlmICh2bSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBmaW5kSnJlSmF4YlZlcnNpb24odm0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJSVZNSW5zdGFsbCB2bSA9IEphdmFSdW50aW1lLmdldERlZmF1bHRWTUluc3RhbGwoKTsKLQkJCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShjb25maWcuZ2V0RmFjZXRlZFByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlpZiAoamF2YVByb2plY3QgIT0gbnVsbCkgewkKLQkJCXRyeSB7Ci0JCQkJdm0gPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGwoamF2YVByb2plY3QpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQkvLyBkbyBub3RoaW5nLCBqdXN0IHVzZSB0aGUgZGVmYXVsdCBpbnN0YWxsCi0JCQl9Ci0JCX0KLQkJCi0JCWlmICh2bSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZmluZEpyZUpheGJWZXJzaW9uKHZtKTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIElWTUluc3RhbGwgZmluZFZNSW5zdGFsbChJUnVudGltZUNvbXBvbmVudCByYykgewotCQlTdHJpbmcgdm1JbnN0YWxsVHlwZUlkIAotCQkJPSByYy5nZXRQcm9wZXJ0eShTdGFuZGFyZEpyZVJ1bnRpbWVDb21wb25lbnQuUFJPUF9WTV9JTlNUQUxMX1RZUEUpOwotCQlTdHJpbmcgdm1JbnN0YWxsSWQKLQkJCT0gcmMuZ2V0UHJvcGVydHkoU3RhbmRhcmRKcmVSdW50aW1lQ29tcG9uZW50LlBST1BfVk1fSU5TVEFMTF9JRCk7Ci0JCQotCQlpZiAodm1JbnN0YWxsVHlwZUlkID09IG51bGwgfHwgdm1JbnN0YWxsSWQgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUlWTUluc3RhbGxUeXBlIHZtSW5zdGFsbFR5cGUgPSBKYXZhUnVudGltZS5nZXRWTUluc3RhbGxUeXBlKHZtSW5zdGFsbFR5cGVJZCk7Ci0JCQotCQlpZiggdm1JbnN0YWxsVHlwZSA9PSBudWxsICkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXJldHVybiB2bUluc3RhbGxUeXBlLmZpbmRWTUluc3RhbGwodm1JbnN0YWxsSWQpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBmaW5kSnJlSmF4YlZlcnNpb24oSVZNSW5zdGFsbCB2bSkgewotCQlpZiAodm0gaW5zdGFuY2VvZiBJVk1JbnN0YWxsMikgewotCQkJU3RyaW5nIGphdmFWZXJzaW9uID0gKChJVk1JbnN0YWxsMikgdm0pLmdldEphdmFWZXJzaW9uKCk7Ci0JCQlpZiAoamF2YVZlcnNpb24gIT0gbnVsbCkgewotCQkJCS8vIGFsbCBvdGhlciB2ZXJzaW9ucyBleGNlcHQgMS43IGFuZCAxLjYgaGF2ZSBubyBjb3JyZXNwb25kaW5nIHZlcnNpb24gKGFzIG9mIHlldCkKLQkJCQlpZiAoamF2YVZlcnNpb24uc3RhcnRzV2l0aChKYXZhQ29yZS5WRVJTSU9OXzFfNykpIHsKLQkJCQkJcmV0dXJuIEpheGJGYWNldC5WRVJTSU9OXzJfMjsKLQkJCQl9Ci0JCQkJLy8gMS42IG11c3QgYmUgZnVydGhlciBhbmFseXplZAotCQkJCWlmICghIGphdmFWZXJzaW9uLnN0YXJ0c1dpdGgoSmF2YUNvcmUuVkVSU0lPTl8xXzYpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJSXRlcmFibGU8SVBhdGg+IHZtTGliUGF0aHMgCi0JCQk9IG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPExpYnJhcnlMb2NhdGlvbiwgSVBhdGg+KAotCQkJCQluZXcgQXJyYXlJdGVyYWJsZTxMaWJyYXJ5TG9jYXRpb24+KEphdmFSdW50aW1lLmdldExpYnJhcnlMb2NhdGlvbnModm0pKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJUGF0aCB0cmFuc2Zvcm0oTGlicmFyeUxvY2F0aW9uIG8pIHsKLQkJCQkJcmV0dXJuIG8uZ2V0U3lzdGVtTGlicmFyeVBhdGgoKTsKLQkJCQl9Ci0JCQl9OwotCQkKLQkJYm9vbGVhbiBmb3VuZFhtbFNlZUFsc28gPSBmYWxzZTsgIC8vIG1hcmtlciBmb3IgamF4YiAyLjEgKwotCQlib29sZWFuIGZvdW5kSkFYQlBlcm1pc3Npb24gPSBmYWxzZTsgIC8vIG1hcmtlciBmb3IgamF4YiAyLjIgKwotCQkKLQkJZm9yIChJUGF0aCB2bUxpYlBhdGggOiB2bUxpYlBhdGhzKSB7Ci0JCQlGaWxlIGZpbGUgPSB2bUxpYlBhdGgudG9GaWxlKCk7Ci0JCQkKLQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJWmlwRmlsZSB6aXAgPSBudWxsOwotCQkJCQotCQkJCXRyeSB7Ci0JCQkJCXppcCA9IG5ldyBaaXBGaWxlKGZpbGUpOwotCQkJCQkKLQkJCQkJZm91bmRYbWxTZWVBbHNvIHw9IHppcC5nZXRFbnRyeSgiamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxTZWVBbHNvLmNsYXNzIikgIT0gbnVsbDsKLQkJCQkJZm91bmRKQVhCUGVybWlzc2lvbiB8PSB6aXAuZ2V0RW50cnkoImphdmF4L3htbC9iaW5kL0pBWEJQZXJtaXNzaW9uLmNsYXNzIikgIT0gbnVsbDsKLQkJCQkJCi0JCQkJCS8vIHNob3J0IGNpcmN1aXQgZm9yIEpBWEIgMi4yCi0JCQkJCWlmIChmb3VuZEpBWEJQZXJtaXNzaW9uKSB7Ci0JCQkJCQlyZXR1cm4gSmF4YkZhY2V0LlZFUlNJT05fMl8yOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7fQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoemlwICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJemlwLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkge30KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJaWYgKGZvdW5kWG1sU2VlQWxzbykgewotCQkJcmV0dXJuIEpheGJGYWNldC5WRVJTSU9OXzJfMTsKLQkJfQotCQkJCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9TY2hlbWFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9TY2hlbWFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDViYTQ2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvU2NoZW1hRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkFic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogIFNjaGVtYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLXsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVOYW1lKCkgewotCQlpZih0aGlzLmdldFByb2plY3QoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGJlc3QgZ3Vlc3Mgc291cmNlIGxvY2F0aW9uIGZvciB0aGUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJQ29udGFpbmVyIGdldERlZmF1bHRDb250YWluZXIoKSB7Ci0JCUlDb250YWluZXIgZGVmYXVsdENvbnRhaW5lciA9IHN1cGVyLmdldERlZmF1bHRDb250YWluZXIoKTsKLQkJaWYoZGVmYXVsdENvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCQkJcmV0dXJuIGRlZmF1bHRDb250YWluZXIuZ2V0Rm9sZGVyKHByb2plY3QuZ2V0TG9jYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVzY3JpcHRpb25JbXBsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhNjA0OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIHsKLQkKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIFN0cmluZyBmYWN0b3J5Q2xhc3NOYW1lOwotCXByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gamF4YkZhY2V0VmVyc2lvbjsKLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdF8gPSBmYWxzZTsKLQlwcml2YXRlIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsIGdyb3VwOwotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQl2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiB0aGlzLnBsdWdpbklkOwotCX0KLQkKLQl2b2lkIHNldFBsdWdpbklkKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsOwotCX0KLQkKLQl2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeUNsYXNzTmFtZTsKLQl9Ci0JCi0Jdm9pZCBzZXRGYWN0b3J5Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5mYWN0b3J5Q2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0SmF4YkZhY2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuamF4YkZhY2V0VmVyc2lvbjsKLQl9Ci0JCi0Jdm9pZCBzZXRKYXhiRmFjZXRWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpheGJGYWNldFZlcnNpb24pIHsKLQkJaWYgKCEgamF4YkZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5lcXVhbHMoSmF4YkZhY2V0LkZBQ0VUKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXhiRmFjZXRWZXJzaW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXRoaXMuamF4YkZhY2V0VmVyc2lvbiA9IGpheGJGYWNldFZlcnNpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXhiRmFjZXRWZXJzaW9uKSB7Ci0JCWlmICghIGpheGJGYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkuZXF1YWxzKEpheGJGYWNldC5GQUNFVCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oamF4YkZhY2V0VmVyc2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gKHRoaXMuamF4YkZhY2V0VmVyc2lvbiAhPSBudWxsKSA/IHRoaXMuamF4YkZhY2V0VmVyc2lvbi5lcXVhbHMoamF4YkZhY2V0VmVyc2lvbikgOiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRfOwotCX0KLQkKLQl2b2lkIHNldERlZmF1bHQoYm9vbGVhbiBkZWZhdWx0XykgewotCQl0aGlzLmRlZmF1bHRfID0gZGVmYXVsdF87Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdldEdyb3VwKCkgewotCQlyZXR1cm4gdGhpcy5ncm91cDsKLQl9Ci0JCi0Jdm9pZCBzZXRHcm91cChKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCBncm91cCkgewotCQl0aGlzLmdyb3VwID0gZ3JvdXA7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkgZmFjdG9yeSA9IFhQb2ludFRvb2xzLmluc3RhbnRpYXRlKAotCQkJCXRoaXMucGx1Z2luSWQsIEpheGJQbGF0Zm9ybU1hbmFnZXJJbXBsLlFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQsIAotCQkJCXRoaXMuZmFjdG9yeUNsYXNzTmFtZSwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuY2xhc3MpOwotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMubGFiZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZTgzYWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVySXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgTWFwPFN0cmluZywgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb25JbXBsPiBwbGF0Zm9ybXM7Ci0JCi0JCi0JSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwoKSB7Ci0JCXRoaXMucGxhdGZvcm1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGw+KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQl2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiB0aGlzLnBsdWdpbklkOwotCX0KLQkKLQl2b2lkIHNldFBsdWdpbklkKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsOwotCX0KLQkKLQl2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCQotCXZvaWQgYWRkUGxhdGZvcm0oSmF4YlBsYXRmb3JtRGVzY3JpcHRpb25JbXBsIHBsYXRmb3JtKSB7Ci0JCXRoaXMucGxhdGZvcm1zLnB1dChwbGF0Zm9ybS5nZXRJZCgpLCBwbGF0Zm9ybSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gZ2V0UGxhdGZvcm1zKCkgewotCQlyZXR1cm4gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPihDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLnBsYXRmb3Jtcy52YWx1ZXMoKSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5sYWJlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1JbXBsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OGEyMWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkdlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEpheGJQbGF0Zm9ybUltcGwKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm0gewotCQotCXByaXZhdGUgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBwbGF0Zm9ybURlZmluaXRpb247Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uUHJvdmlkZXIgYW5ub3RhdGlvblByb3ZpZGVyOwotCQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1JbXBsKEpheGJQbGF0Zm9ybURlZmluaXRpb24gamF4YlBsYXRmb3JtRGVmaW5pdGlvbikgewotCQlzdXBlcigpOwotCQl0aGlzLnBsYXRmb3JtRGVmaW5pdGlvbiA9IGpheGJQbGF0Zm9ybURlZmluaXRpb247Ci0JCXRoaXMuYW5ub3RhdGlvblByb3ZpZGVyID0gbmV3IEdlbmVyaWNBbm5vdGF0aW9uUHJvdmlkZXIodGhpcy5wbGF0Zm9ybURlZmluaXRpb24uZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCksIHRoaXMucGxhdGZvcm1EZWZpbml0aW9uLmdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtRGVmaW5pdGlvbi5nZXREZXNjcmlwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybURlZmluaXRpb247Ci0JfQotCQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1EZWZpbml0aW9uLmdldEZhY3RvcnkoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBKQVhCIGZpbGUvcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXhiRmlsZSBidWlsZEpheGJGaWxlKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCXJldHVybiAoY29udGVudFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEpheGJGaWxlKGpheGJQcm9qZWN0LCBmaWxlLCBjb250ZW50VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpheGJGaWxlIGJ1aWxkSmF4YkZpbGUoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlKcHRSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSB0aGlzLmJ1aWxkUmVzb3VyY2VNb2RlbChqYXhiUHJvamVjdCwgZmlsZSwgY29udGVudFR5cGUpOwotCQlyZXR1cm4gKHJlc291cmNlTW9kZWwgPT0gbnVsbCkgPyBudWxsIDogZ2V0RmFjdG9yeSgpLmJ1aWxkSmF4YkZpbGUoamF4YlByb2plY3QsIGZpbGUsIGNvbnRlbnRUeXBlLCByZXNvdXJjZU1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0UmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXIoY29udGVudFR5cGUpOwotCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHByb3ZpZGVyLmJ1aWxkUmVzb3VyY2VNb2RlbChqYXhiUHJvamVjdCwgZmlsZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIG51bGwgaWYgd2UgZG9uJ3QgaGF2ZSBhIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZQotCSAqIChzaW5jZSB3ZSBkb24ndCBoYXZlIGNvbnRyb2wgb3ZlciB0aGUgcG9zc2libGUgY29udGVudCB0eXBlcykuCi0JICovCi0JcHJvdGVjdGVkIEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIgZ2V0UmVzb3VyY2VNb2RlbFByb3ZpZGVyKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlmb3IgKEpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgOiBnZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkpIHsKLQkJCWlmIChjb250ZW50VHlwZS5lcXVhbHMocHJvdmlkZXIuZ2V0Q29udGVudFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBnZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybURlZmluaXRpb24uZ2V0UmVzb3VyY2VNb2RlbFByb3ZpZGVycygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEphdmEgYW5ub3RhdGlvbnMgKioqKioqKioqKgotCQotCXB1YmxpYyBBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkgewotCQlyZXR1cm4gRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKAotCQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWZvciAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCWlmIChkZWZpbml0aW9uLmlzU3BlY2lmaWVkKGF0dHJpYnV0ZSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBtdXN0IGJlIGEgbWFwcGluZyBkZWZpbml0aW9uIGZvciBhbGwgYXR0cmlidXRlcyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1EZWZpbml0aW9uLmdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlmb3IgKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF0dHJpYnV0ZSBtYXBwaW5nIGtleTogIiArIG1hcHBpbmdLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEl0ZXJhYmxlPERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybURlZmluaXRpb24uZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1NYW5hZ2VySW1wbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtTWFuYWdlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxOWZjNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1NYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLlhQb2ludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuS2V5ZWRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLQotcHVibGljIGNsYXNzIEpheGJQbGF0Zm9ybU1hbmFnZXJJbXBsCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtTWFuYWdlciB7Ci0JCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiamF4YlBsYXRmb3JtcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQgPSBKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSURfICsgRVhURU5TSU9OX1BPSU5UX0lEOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fR1JPVVBfRUxFTUVOVCA9ICJqYXhiUGxhdGZvcm1Hcm91cCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX0VMRU1FTlQgPSAiamF4YlBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQVRUUklCVVRFID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfQVRUUklCVVRFID0gImxhYmVsIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRkFDVE9SWV9DTEFTU19BVFRSSUJVVEUgPSAiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9GQUNFVF9WRVJTSU9OX0FUVFJJQlVURSA9ICJqYXhiRmFjZXRWZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9BVFRSSUJVVEUgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdST1VQX0VMRU1FTlQgPSAiZ3JvdXAiOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpheGJQbGF0Zm9ybU1hbmFnZXJJbXBsIElOU1RBTkNFID0gbmV3IEpheGJQbGF0Zm9ybU1hbmFnZXJJbXBsKCk7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1NYW5hZ2VySW1wbCBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGw+IHBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnM7Ci0JcHJpdmF0ZSBLZXllZFNldDxTdHJpbmcsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbD4gcGxhdGZvcm1EZXNjcmlwdGlvbnM7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1NYW5hZ2VySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25zID0gbmV3IEtleWVkU2V0PFN0cmluZywgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGw+KCk7Ci0JCXRoaXMucGxhdGZvcm1EZXNjcmlwdGlvbnMgPSBuZXcgS2V5ZWRTZXQ8U3RyaW5nLCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGw+KCk7Ci0JCXJlYWRFeHRlbnNpb25zKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9ucygpIHsKLQkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCi0JCWZpbmFsIElFeHRlbnNpb25Qb2ludCB4cG9pbnQgCi0JCQkJPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChKcHRKYXhiQ29yZVBsdWdpbi5QTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQotCQlpZiAoeHBvaW50ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQkKLQkJTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHBsYXRmb3JtR3JvdXBDb25maWdzID0gbmV3IEFycmF5TGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+KCk7Ci0JCUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBwbGF0Zm9ybUNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiB4cG9pbnQuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhQTEFURk9STV9HUk9VUF9FTEVNRU5UKSkgewotCQkJCQlwbGF0Zm9ybUdyb3VwQ29uZmlncy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhQTEFURk9STV9FTEVNRU5UKSkgewotCQkJCQlwbGF0Zm9ybUNvbmZpZ3MuYWRkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IHBsYXRmb3JtR3JvdXBDb25maWdzKSB7Ci0JCQlyZWFkUGxhdGZvcm1Hcm91cEV4dGVuc2lvbihlbGVtZW50KTsKLQkJfQotCQkKLQkJZm9yIChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA6IHBsYXRmb3JtQ29uZmlncykgewotCQkJcmVhZFBsYXRmb3JtRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkUGxhdGZvcm1Hcm91cEV4dGVuc2lvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJZmluYWwgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwgZGVzYyA9IG5ldyBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCgpOwotCQkJCi0JCQkvLyBwbHVnLWluIGlkCi0JCQlkZXNjLnNldFBsdWdpbklkKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCQkJCi0JCQkvLyBpZAotCQkJZGVzYy5zZXRJZChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgSURfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCWlmICh0aGlzLnBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnMuY29udGFpbnNLZXkoZGVzYy5nZXRJZCgpKSkgewotCQkJCWxvZ0R1cGxpY2F0ZUV4dGVuc2lvbihRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCBJRF9BVFRSSUJVVEUsIGRlc2MuZ2V0SWQoKSk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQkvLyBsYWJlbAotCQkJZGVzYy5zZXRMYWJlbChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgTEFCRUxfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCXRoaXMucGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5hZGRJdGVtKGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkUGxhdGZvcm1FeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWZpbmFsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbCBkZXNjID0gbmV3IEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbCgpOwotCQkJCi0JCQkvLyBwbHVnLWluIGlkCi0JCQlkZXNjLnNldFBsdWdpbklkKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCQkJCi0JCQkvLyBpZAotCQkJZGVzYy5zZXRJZChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgSURfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCWlmICh0aGlzLnBsYXRmb3JtRGVzY3JpcHRpb25zLmNvbnRhaW5zS2V5KGRlc2MuZ2V0SWQoKSkpIHsKLQkJCQlsb2dEdXBsaWNhdGVFeHRlbnNpb24oUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgSURfQVRUUklCVVRFLCBkZXNjLmdldElkKCkpOwotCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCQotCQkJLy8gbGFiZWwKLQkJCWRlc2Muc2V0TGFiZWwoZmluZFJlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnQsIExBQkVMX0FUVFJJQlVURSkpOwotCQkJCi0JCQkvLyBmYWN0b3J5IGNsYXNzIAotCQkJZGVzYy5zZXRGYWN0b3J5Q2xhc3NOYW1lKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBGQUNUT1JZX0NMQVNTX0FUVFJJQlVURSkpOwotCQkJCi0JCQkvLyBKQVhCIGZhY2V0IHZlcnNpb24KLQkJCVN0cmluZyBqYXhiRmFjZXRWZXJzaW9uU3RyaW5nID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSkFYQl9GQUNFVF9WRVJTSU9OX0FUVFJJQlVURSk7Ci0JCQlpZiAoamF4YkZhY2V0VmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24ganBhRmFjZXRWZXJzaW9uID0gSmF4YkZhY2V0LkZBQ0VULmdldFZlcnNpb24oamF4YkZhY2V0VmVyc2lvblN0cmluZyk7Ci0JCQkJaWYgKGpwYUZhY2V0VmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJCWRlc2Muc2V0SmF4YkZhY2V0VmVyc2lvbihqcGFGYWNldFZlcnNpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbG9nSW52YWxpZFZhbHVlKGVsZW1lbnQsIEpBWEJfRkFDRVRfVkVSU0lPTl9BVFRSSUJVVEUsIGpheGJGYWNldFZlcnNpb25TdHJpbmcpOwotCQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBkZWZhdWx0Ci0JCQlTdHJpbmcgZGVmYXVsdFN0cmluZyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKERFRkFVTFRfQVRUUklCVVRFKTsKLQkJCWlmIChkZWZhdWx0U3RyaW5nICE9IG51bGwpIHsKLQkJCQlpZiAoZGVmYXVsdFN0cmluZy5lcXVhbHMoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWRlc2Muc2V0RGVmYXVsdCh0cnVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZGVmYXVsdFN0cmluZy5lcXVhbHMoImZhbHNlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZXNjLnNldERlZmF1bHQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbG9nSW52YWxpZFZhbHVlKGVsZW1lbnQsIERFRkFVTFRfQVRUUklCVVRFLCBkZWZhdWx0U3RyaW5nKTsKLQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZ3JvdXAKLQkJCVN0cmluZyBncm91cElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfRUxFTUVOVCk7Ci0JCQlpZiAoZ3JvdXBJZCAhPSBudWxsKSB7Ci0JCQkJSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwgZ3JvdXAgPSB0aGlzLnBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnMuZ2V0SXRlbShncm91cElkKTsKLQkJCQlpZiAoZ3JvdXAgIT0gbnVsbCkgewotCQkJCQlkZXNjLnNldEdyb3VwKGdyb3VwKTsKLQkJCQkJZ3JvdXAuYWRkUGxhdGZvcm0oZGVzYyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlsb2dJbnZhbGlkVmFsdWUoZWxlbWVudCwgR1JPVVBfRUxFTUVOVCwgZ3JvdXBJZCk7Ci0JCQkJCXRocm93IG5ldyBYUG9pbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCBncm91cCA9IG5ldyBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCgpOwotCQkJCWdyb3VwLnNldFBsdWdpbklkKGRlc2MuZ2V0UGx1Z2luSWQoKSk7Ci0JCQkJZ3JvdXAuc2V0SWQoZGVzYy5nZXRJZCgpKTsKLQkJCQlncm91cC5zZXRMYWJlbChkZXNjLmdldExhYmVsKCkpOwotCQkJCWdyb3VwLmFkZFBsYXRmb3JtKGRlc2MpOwotCQkJCQotCQkJCWlmICh0aGlzLnBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnMuY29udGFpbnNLZXkoZ3JvdXAuZ2V0SWQoKSkpIHsKLQkJCQkJbG9nSW52YWxpZFZhbHVlKGVsZW1lbnQsIEdST1VQX0VMRU1FTlQsIGdyb3VwSWQpOwotCQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCQotCQkJCXRoaXMucGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5hZGRJdGVtKGdyb3VwLmdldElkKCksIGdyb3VwKTsKLQkJCX0KLQkJCQotCQkJdGhpcy5wbGF0Zm9ybURlc2NyaXB0aW9ucy5hZGRJdGVtKGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbj4gZ2V0SmF4YlBsYXRmb3JtR3JvdXBzKCkgewotCQlyZXR1cm4gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24+KHRoaXMucGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5nZXRJdGVtU2V0KCkpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm1Hcm91cChTdHJpbmcgZ3JvdXBJZCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25zLmdldEl0ZW0oZ3JvdXBJZCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gZ2V0SmF4YlBsYXRmb3JtcygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckl0ZXJhYmxlV3JhcHBlcjxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4odGhpcy5wbGF0Zm9ybURlc2NyaXB0aW9ucy5nZXRJdGVtU2V0KCkpOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SmF4YlBsYXRmb3JtKFN0cmluZyBwbGF0Zm9ybUlkKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtRGVzY3JpcHRpb25zLmdldEl0ZW0ocGxhdGZvcm1JZCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZWZhdWx0SmF4YlBsYXRmb3JtKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpheGJGYWNldFZlcnNpb24pIHsKLQkJaWYgKCEgamF4YkZhY2V0VmVyc2lvbi5nZXRQcm9qZWN0RmFjZXQoKS5lcXVhbHMoSmF4YkZhY2V0LkZBQ0VUKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqYXhiRmFjZXRWZXJzaW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWZvciAoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0gOiBnZXRKYXhiUGxhdGZvcm1zKCkpIHsKLQkJCWlmIChwbGF0Zm9ybS5pc0RlZmF1bHQoKSAmJiBwbGF0Zm9ybS5zdXBwb3J0c0pheGJGYWNldFZlcnNpb24oamF4YkZhY2V0VmVyc2lvbikpIHsKLQkJCQlyZXR1cm4gcGxhdGZvcm07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBqYXhiUGxhdGZvcm1JZCA9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybUlkKHByb2plY3QpOwotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwgcGxhdGZvcm1EZXNjID0gdGhpcy5wbGF0Zm9ybURlc2NyaXB0aW9ucy5nZXRJdGVtKGpheGJQbGF0Zm9ybUlkKTsKLQkJaWYgKHBsYXRmb3JtRGVzYyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQcm9qZWN0IGRvZXMgbm90IGhhdmUgYSByZWNvZ25pemVkIEpBWEIgcGxhdGZvcm0uIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcGxhdGZvcm1EZXNjLmJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQyNDAyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yT3JkZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgc3VwZXIuYWRkQW5ub3RhdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxBY2Nlc3NvclRPcmRlckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgWG1sQWNjZXNzT3JkZXIgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFhtbEFjY2Vzc09yZGVyIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI0OGEwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSBzdXBlci5hZGRBbm5vdGF0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgWG1sQWNjZXNzVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoWG1sQWNjZXNzVHlwZSB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEVudW1Bbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxFbnVtQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjIyZmFlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbEVudW1Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbEVudW1Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sRW51bUFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbFhtbEVudW1Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VOVU07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEVudW1Bbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sRW51bUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sRW51bUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMTc4YjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sRW51bVZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsWG1sRW51bVZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVudW1WYWx1ZUFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbFhtbEVudW1WYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTV9WQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRW51bVZhbHVlQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbEVudW1WYWx1ZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sRW51bVZhbHVlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxTY2hlbWFBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxTY2hlbWFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMmNjM2IuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsWG1sU2NoZW1hQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbFNjaGVtYUFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxTY2hlbWFBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxYbWxTY2hlbWFBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1NDSEVNQTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sU2NoZW1hQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFNjaGVtYUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sU2NoZW1hQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lc3BhY2UKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbG9jYXRpb24KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9jYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0gYXR0cmlidXRlRm9ybURlZmF1bHQpIHsKLQkJaWYgKGF0dHJpYnV0ZUZvcm1EZWZhdWx0ICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KGF0dHJpYnV0ZUZvcm1EZWZhdWx0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlRm9ybURlZmF1bHRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0gZWxlbWVudEZvcm1EZWZhdWx0KSB7Ci0JCWlmIChlbGVtZW50Rm9ybURlZmF1bHQgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0RWxlbWVudEZvcm1EZWZhdWx0KGVsZW1lbnRGb3JtRGVmYXVsdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVsZW1lbnRGb3JtRGVmYXVsdFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbE5zQW5ub3RhdGlvbj4gZ2V0WG1sbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sbnNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgWG1sTnNBbm5vdGF0aW9uIHhtbG5zQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBYbWxOc0Fubm90YXRpb24gYWRkWG1sbnMoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmFkZEFubm90YXRpb24oKS5hZGRYbWxucyhpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVhtbG5zKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbG5zKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbFR5cGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxYbWxUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDhiNTRkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFhtbFR5cGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFR5cGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbFhtbFR5cGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVHlwZUFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbFhtbFR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFR5cGVBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sVHlwZUFubm90YXRpb24pIHN1cGVyLmFkZEFubm90YXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogZmFjdG9yeSBjbGFzcwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeUNsYXNzKFN0cmluZyBmYWN0b3J5Q2xhc3MpIHsKLQkJaWYgKGZhY3RvcnlDbGFzcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRGYWN0b3J5Q2xhc3MoZmFjdG9yeUNsYXNzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIGZhY3RvcnkgbWV0aG9kCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5TWV0aG9kKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGYWN0b3J5TWV0aG9kKFN0cmluZyBmYWN0b3J5TWV0aG9kKSB7Ci0JCWlmIChmYWN0b3J5TWV0aG9kICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldEZhY3RvcnlNZXRob2QoZmFjdG9yeU1ldGhvZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZhY3RvcnlNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lKG5hbWUpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKG5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcm9wT3JkZXJTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wKGludCBpbmRleCwgU3RyaW5nIHByb3ApIHsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuYWRkUHJvcChpbmRleCwgcHJvcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcChTdHJpbmcgcHJvcCkgewotCQl0aGlzLmFkZEFubm90YXRpb24oKS5hZGRQcm9wKHByb3ApOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVQcm9wKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoU3RyaW5nIHByb3ApIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UHJvcE9yZGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm9wT3JkZXJUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcm9wVGV4dFJhbmdlKGludCBpbmRleCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3BUb3VjaGVzKGludCBpbmRleCwgaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzZlODY2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3Nvck9yZGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQUNDRVNTT1JfT1JERVI7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzYmVhNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQUNDRVNTT1JfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2MTM3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BTllfQVRUUklCVVRFOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFueUVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZlNmRmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sQW55RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBbnlFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BTllfRUxFTUVOVDsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDU3OTE5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sQXR0YWNobWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dGFjaG1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRjsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihwYXJlbnQsIChBdHRyaWJ1dGUpIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0MDIwZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEF0dHJpYnV0ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbEF0dHJpYnV0ZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQVRUUklCVVRFOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEF0dHJpYnV0ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sQXR0cmlidXRlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzkyOGE1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uLmJ1aWxkU291cmNlWG1sRWxlbWVudEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sRWxlbWVudEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnREZWNsQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmFiZDBjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxFbGVtZW50RGVjbEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfREVDTDsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmFhN2QuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1JFRjsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIFNvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmJ1aWxkU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzYwMThiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxFbGVtZW50UmVmc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50UmVmc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLQotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1JFRlM7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNmFiZTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjA3MGE1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxFbGVtZW50c0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxFbGVtZW50c0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbGVtZW50c0Fubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEVsZW1lbnRzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxFbGVtZW50c0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVFM7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sRWxlbWVudHNBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVsZW1lbnRzQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVudW1Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzgwYTRjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbEVudW1Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sRW51bUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxFbnVtQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRW51bUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbnVtQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbFhtbEVudW1Bbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVudW1Bbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbnVtVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbnVtVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE3NjVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bVZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sRW51bVZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbEVudW1WYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEVudW1WYWx1ZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbEVudW1WYWx1ZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sRW51bVZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTlVNX1ZBTFVFOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEVudW1WYWx1ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEVudW1WYWx1ZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjdiNTk1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxJREFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSURBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbElEQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxJREFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEUkVGQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTUxMmFiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxJRFJFRkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxJRFJFRkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxJRFJFRkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSURSRUZBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEUkVGOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbElEUkVGQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxJRFJFRkFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjZWUwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3NzUxZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTX19WQUxVRTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmJ1aWxkU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlcnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlZjcyNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlcnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyc0Fubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbEphdmFUeXBlQWRhcHRlcnNBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sSmF2YVR5cGVBZGFwdGVyc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTGlzdEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZmRiYTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sTGlzdEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxMaXN0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3QKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbExpc3RBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxMaXN0QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9MSVNUOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbExpc3RBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbExpc3RBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaW1lVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMzOTVmOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sTWltZVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWltZVR5cGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sTWltZVR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbE1pbWVUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9NSU1FX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTWl4ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWJkNjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1peGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbE1peGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxNaXhlZEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTUlYRUQ7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sTWl4ZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbE1peGVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUmVnaXN0cnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYjNmYmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbFJlZ2lzdHJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxSZWdpc3RyeUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfUkVHSVNUUlk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sUmVnaXN0cnlBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MzcwYzUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxSb290RWxlbWVudEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfUk9PVF9FTEVNRU5UOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxSb290RWxlbWVudEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ODhjMGQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTY2hlbWFBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTY2hlbWFBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFNjaGVtYUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFNjaGVtYUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxYbWxTY2hlbWFBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQkvLyBUT0RPCi0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYVR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmI5Zjk4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sU2NoZW1hVHlwZUFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1NDSEVNQV9UWVBFOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BX1RZUEVTOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BX1RZUEVTX19WQUxVRTsKLQl9Ci0JCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5idWlsZFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYzE5NWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXJzQW5ub3RhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgWG1sU2NoZW1hVHlwZXNBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTY2hlbWFUeXBlc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sU2NoZW1hVHlwZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbiwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9TQ0hFTUFfVFlQRVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2VlQWxzb0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZTlkNmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sU2VlQWxzb0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxTZWVBbHNvQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc28KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbFNlZUFsc29Bbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxTZWVBbHNvQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9TRUVfQUxTTzsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxTZWVBbHNvQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3MzAxOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxUcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFJBTlNJRU5UOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFRyYW5zaWVudEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sVHJhbnNpZW50QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFR5cGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjBlN2I1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFR5cGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYbWxUeXBlQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgWG1sVHlwZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxUeXBlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbFhtbFR5cGVBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbFR5cGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzOWE5MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhtbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9WQUxVRTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxWYWx1ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5WG1sVmFsdWVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODZkOTAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yT3JkZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgWG1sQWNjZXNzT3JkZXIgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqIFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFhtbEFjY2Vzc09yZGVyIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShYbWxBY2Nlc3NPcmRlciB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFhtbEFjY2Vzc09yZGVyIHZhbHVlKSB7Ci0JCVhtbEFjY2Vzc09yZGVyIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFhtbEFjY2Vzc09yZGVyIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NPcmRlci5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSX19WQUxVRSkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2M2I0YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotewotCXByaXZhdGUgWG1sQWNjZXNzVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIEJpbmFyeVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqIFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgWG1sQWNjZXNzVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoWG1sQWNjZXNzVHlwZSB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFhtbEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJWG1sQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBYbWxBY2Nlc3NUeXBlIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiBYbWxBY2Nlc3NUeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfQUNDRVNTT1JfVFlQRV9fVkFMVUUpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE3OTYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FOWV9BVFRSSUJVVEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55RWxlbWVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MTBhZmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQW55RWxlbWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBbnlFbGVtZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbgotewotCXByaXZhdGUgQm9vbGVhbiBsYXg7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmxheCA9IHRoaXMuYnVpbGRMYXgoKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BTllfRUxFTUVOVDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldExheF8odGhpcy5idWlsZExheCgpKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxBbnlFbGVtZW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBsYXgKLQlwdWJsaWMgQm9vbGVhbiBnZXRMYXgoKSB7Ci0JCXJldHVybiB0aGlzLmxheDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXgoQm9vbGVhbiBsYXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldExheF8oQm9vbGVhbiBsYXgpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmxheDsKLQkJdGhpcy5sYXggPSBsYXg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMQVhfUFJPUEVSVFksIG9sZCwgbGF4KTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRMYXgoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9BTllfRUxFTUVOVF9fTEFYKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldExheFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX1ZBTFVFX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0FOWV9FTEVNRU5UX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgdmFsdWUgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQXR0YWNobWVudFJlZkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEwZGNlOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0YWNobWVudFJlZkFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRhY2htZW50UmVmCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMGVmYzcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sQXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dHJpYnV0ZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEF0dHJpYnV0ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZUFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIEJvb2xlYW4gcmVxdWlyZWQ7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gdGhpcy5idWlsZE5hbWVzcGFjZSgpOwotCQl0aGlzLnJlcXVpcmVkID0gdGhpcy5idWlsZFJlcXVpcmVkKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FUVFJJQlVURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCQl0aGlzLnNldE5hbWVzcGFjZV8odGhpcy5idWlsZE5hbWVzcGFjZSgpKTsKLQkJdGhpcy5zZXRSZXF1aXJlZF8odGhpcy5idWlsZFJlcXVpcmVkKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEF0dHJpYnV0ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9BVFRSSUJVVEVfX05BTUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIG5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0FUVFJJQlVURV9fTkFNRVNQQUNFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVxdWlyZWRfKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCByZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9BVFRSSUJVVEVfX1JFUVVJUkVEKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjcyMWI3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxFbGVtZW50QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sRWxlbWVudEFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0VmFsdWU7Ci0JcHJpdmF0ZSBCb29sZWFuIG5pbGxhYmxlOwotCXByaXZhdGUgQm9vbGVhbiByZXF1aXJlZDsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sRWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5idWlsZERlZmF1bHRWYWx1ZSgpOwotCQl0aGlzLm5pbGxhYmxlID0gdGhpcy5idWlsZE5pbGxhYmxlKCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoKTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCQl0aGlzLnNldE5hbWVzcGFjZV8odGhpcy5idWlsZE5hbWVzcGFjZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VmFsdWVfKHRoaXMuYnVpbGREZWZhdWx0VmFsdWUoKSk7Ci0JCXRoaXMuc2V0TmlsbGFibGVfKHRoaXMuYnVpbGROaWxsYWJsZSgpKTsKLQkJdGhpcy5zZXRSZXF1aXJlZF8odGhpcy5idWlsZFJlcXVpcmVkKCkpOwotCQl0aGlzLnNldFR5cGVfKHRoaXMuYnVpbGRUeXBlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVsZW1lbnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZXNwYWNlXyhTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fTkFNRVNQQUNFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdCB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldERlZmF1bHRWYWx1ZV8oU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VmFsdWU7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldERlZmF1bHRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBuaWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShCb29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROaWxsYWJsZV8oQm9vbGVhbiBuaWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmlsbGFibGU7Ci0JCXRoaXMubmlsbGFibGUgPSBuaWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5JTExBQkxFX1BST1BFUlRZLCBvbGQsIG5pbGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROaWxsYWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfX05JTExBQkxFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5pbGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHJlcXVpcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlcXVpcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlcXVpcmVkXyhCb29sZWFuIHJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5yZXF1aXJlZDsKLQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVRVUlSRURfUFJPUEVSVFksIG9sZCwgcmVxdWlyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fUkVRVUlSRUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlXyhTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX19UWVBFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMWJlMjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudERlY2wKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbgotCQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50RGVjbEFubm90YXRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2U7Ci0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RpdHV0aW9uSGVhZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlOwotCQotCQotCXB1YmxpYyBCaW5hcnlYbWxFbGVtZW50RGVjbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5zY29wZSA9IGJ1aWxkU2NvcGUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBidWlsZE5hbWVzcGFjZSgpOwotCQl0aGlzLm5hbWUgPSBidWlsZE5hbWUoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlID0gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCk7Ci0JCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWUgPSBidWlsZFN1YnN0aXR1dGlvbkhlYWROYW1lKCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gYnVpbGREZWZhdWx0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfREVDTDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0U2NvcGVfKGJ1aWxkU2NvcGUoKSk7Ci0JCXNldE5hbWVzcGFjZV8oYnVpbGROYW1lc3BhY2UoKSk7Ci0JCXNldE5hbWVfKGJ1aWxkTmFtZSgpKTsKLQkJc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZV8oYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkpOwotCQlzZXRTdWJzdGl0dXRpb25IZWFkTmFtZV8oYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZSgpKTsKLQkJc2V0RGVmYXVsdFZhbHVlXyhidWlsZERlZmF1bHRWYWx1ZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXROYW1lc3BhY2VfKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX05BTUVTUEFDRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzY29wZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRTY29wZV8oU3RyaW5nIHNjb3BlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNjb3BlOwotCQl0aGlzLnNjb3BlID0gc2NvcGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NPUEVfUFJPUEVSVFksIG9sZCwgc2NvcGUpOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9TQ09QRV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIHNjb3BlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTY29wZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fU0NPUEUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjb3BlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKFN0cmluZyBzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZV8oU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlID0gc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVUJTVElUVVRJT05fSEVBRF9OQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RJVFVUSU9OX0hFQURfTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uSGVhZE5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVfKFN0cmluZyBzdWJzdGl0dXRpb25IZWFkTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZSA9IHN1YnN0aXR1dGlvbkhlYWROYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNVQlNUSVRVVElPTl9IRUFEX05BTUVfUFJPUEVSVFksIG9sZCwgc3Vic3RpdHV0aW9uSGVhZE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc3Vic3RpdHV0aW9uSGVhZE5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IHZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXREZWZhdWx0VmFsdWVfKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRWYWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXREZWZhdWx0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMDdmOGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCXByaXZhdGUgQm9vbGVhbiByZXF1aXJlZDsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoKTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUY7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXROYW1lc3BhY2VfKHRoaXMuYnVpbGROYW1lc3BhY2UoKSk7Ci0JCXRoaXMuc2V0UmVxdWlyZWRfKHRoaXMuYnVpbGRSZXF1aXJlZCgpKTsKLQkJdGhpcy5zZXRUeXBlXyh0aGlzLmJ1aWxkVHlwZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIG5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FU1BBQ0UpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHJlcXVpcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlcXVpcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlcXVpcmVkXyhCb29sZWFuIHJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5yZXF1aXJlZDsKLQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVRVUlSRURfUFJPUEVSVFksIG9sZCwgcmVxdWlyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9fUkVRVUlSRUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUeXBlXyhTdHJpbmcgdHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX1JFRl9fVFlQRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjZhYjRiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBCaW5hcnlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHsKLQkKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4geG1sRWxlbWVudFJlZnM7Ci0JCi0JCi0JcHVibGljIEJpbmFyeVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnhtbEVsZW1lbnRSZWZzID0gdGhpcy5idWlsZFhtbEVsZW1lbnRSZWZzKCk7Ci0JfQotCQotCQotCXByaXZhdGUgVmVjdG9yPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBidWlsZFhtbEVsZW1lbnRSZWZzKCkgewotCQlPYmplY3RbXSBqZHRYbWxFbGVtZW50UmVmcyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUpOwotCQlWZWN0b3I8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8WG1sRWxlbWVudFJlZkFubm90YXRpb24+KGpkdFhtbEVsZW1lbnRSZWZzLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdFhtbEVsZW1lbnRSZWYgOiBqZHRYbWxFbGVtZW50UmVmcykgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5WG1sRWxlbWVudFJlZkFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRYbWxFbGVtZW50UmVmKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IGdldFhtbEVsZW1lbnRSZWZzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxFbGVtZW50UmVmQW5ub3RhdGlvbj4odGhpcy54bWxFbGVtZW50UmVmcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxFbGVtZW50UmVmc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlWG1sRWxlbWVudFJlZihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDQ3MzQ0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCXByaXZhdGUgQm9vbGVhbiBuaWxsYWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gcmVxdWlyZWQ7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKCk7Ci0JCXRoaXMubmlsbGFibGUgPSB0aGlzLmJ1aWxkTmlsbGFibGUoKTsKLQkJdGhpcy5yZXF1aXJlZCA9IHRoaXMuYnVpbGRSZXF1aXJlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXROYW1lc3BhY2VfKHRoaXMuYnVpbGROYW1lc3BhY2UoKSk7Ci0JCXRoaXMuc2V0TmlsbGFibGVfKHRoaXMuYnVpbGROaWxsYWJsZSgpKTsKLQkJdGhpcy5zZXRSZXF1aXJlZF8odGhpcy5idWlsZFJlcXVpcmVkKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUl9fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZXNwYWNlXyhTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgbmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSX19OQU1FU1BBQ0UpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuaWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShCb29sZWFuIG5pbGxhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROaWxsYWJsZV8oQm9vbGVhbiBuaWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmlsbGFibGU7Ci0JCXRoaXMubmlsbGFibGUgPSBuaWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5JTExBQkxFX1BST1BFUlRZLCBvbGQsIG5pbGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROaWxsYWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUl9fTklMTEFCTEUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmlsbGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVxdWlyZWRfKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCByZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVJfX1JFUVVJUkVEKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVsZW1lbnRzQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDZmMWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50c0Fubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50cwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sRWxlbWVudHNBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxFbGVtZW50c0Fubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxYbWxFbGVtZW50QW5ub3RhdGlvbj4geG1sRWxlbWVudHM7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxFbGVtZW50c0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy54bWxFbGVtZW50cyA9IHRoaXMuYnVpbGRYbWxFbGVtZW50cygpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBidWlsZFhtbEVsZW1lbnRzKCkgewotCQlPYmplY3RbXSBqZHRYbWxFbGVtZW50cyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpBWEIuWE1MX0VMRU1FTlRTX19WQUxVRSk7Ci0JCVZlY3RvcjxYbWxFbGVtZW50QW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxYbWxFbGVtZW50QW5ub3RhdGlvbj4oamR0WG1sRWxlbWVudHMubGVuZ3RoKTsKLQkJZm9yIChPYmplY3QgamR0WG1sRWxlbWVudCA6IGpkdFhtbEVsZW1lbnRzKSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBCaW5hcnlYbWxFbGVtZW50QW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdFhtbEVsZW1lbnQpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UUzsKLQl9Ci0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sRWxlbWVudEFubm90YXRpb24+KHRoaXMueG1sRWxlbWVudHMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sRWxlbWVudHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50cy5zaXplKCk7Ci0JfQotCi0JcHVibGljIFhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudHMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb24gYWRkWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVhtbEVsZW1lbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRW51bUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVudW1Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYWZmM2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sRW51bUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sRW51bUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVudW1Bbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlYbWxFbnVtQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VOVU07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbnVtIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVkFMVUVfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRU5VTV9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHZhbHVlIGNsYXNzIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVudW1WYWx1ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbEVudW1WYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjYzQ4MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxFbnVtVmFsdWVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxFbnVtVmFsdWVBbm5vdGF0aW9uCi17Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBCaW5hcnlYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTV9WQUxVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVudW1WYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfRU5VTV9WQUxVRV9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxJREFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElEQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDBkZmExLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElEQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbElEQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sSURBbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5WG1sSURBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElEUkVGQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSURSRUZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ODM2MTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSURSRUZBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJRFJFRkFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sSURSRUZBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxJRFJFRkFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxJRFJFRkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfSURSRUY7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYTU0ODYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgQmluYXJ5WG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYmRkNmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQkKLQkKLQlwdWJsaWMgQmluYXJ5WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gYnVpbGRWYWx1ZSgpOwotCQl0aGlzLnR5cGUgPSBidWlsZFR5cGUoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlzZXRWYWx1ZV8oYnVpbGRWYWx1ZSgpKTsKLQkJc2V0VHlwZV8oYnVpbGRUeXBlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VHlwZV8oU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZTsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZCwgdHlwZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVFlQRV9QUk9QRVJUWSwgb2xkLCB0eXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUl9fVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTGlzdEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbExpc3RBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiM2Y5NTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTGlzdEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbExpc3RBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTGlzdAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sTGlzdEFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sTGlzdEFubm90YXRpb24gewotCQotCXB1YmxpYyBCaW5hcnlYbWxMaXN0QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTElTVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxNaW1lVHlwZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTI1ZjJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTWltZVR5cGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWltZVR5cGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbE1pbWVUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sTWltZVR5cGVBbm5vdGF0aW9uCi17Ci0KLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBCaW5hcnlYbWxNaW1lVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9NSU1FX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxNaW1lVHlwZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSkFYQi5YTUxfTUlNRV9UWVBFX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbE1peGVkQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOGQ1NjMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxNaXhlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5WG1sTWl4ZWRBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbE1peGVkQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIEJpbmFyeVhtbE1peGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTUlYRUQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sUmVnaXN0cnlBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxSZWdpc3RyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjOTYzZi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxSZWdpc3RyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJlZ2lzdHJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxSZWdpc3RyeUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFJlZ2lzdHJ5QW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9SRUdJU1RSWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxSb290RWxlbWVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzJlNjE1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxSb290RWxlbWVudEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gdGhpcy5idWlsZE5hbWVzcGFjZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9ST09UX0VMRU1FTlQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXROYW1lc3BhY2VfKHRoaXMuYnVpbGROYW1lc3BhY2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9ST09UX0VMRU1FTlRfX05BTUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVzcGFjZV8oU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIG5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX1JPT1RfRUxFTUVOVF9fTkFNRVNQQUNFKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sU2VlQWxzb0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwYjA5MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2VlQWxzb0Fubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTZWVBbHNvCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxTZWVBbHNvQW5ub3RhdGlvbgotCQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxTZWVBbHNvQW5ub3RhdGlvbiB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBjbGFzc2VzOwotCi0KLQlwdWJsaWMgQmluYXJ5WG1sU2VlQWxzb0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5jbGFzc2VzID0gdGhpcy5idWlsZENsYXNzZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0VFX0FMU087Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVDbGFzc2VzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jbGFzc2VzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sU2VlQWxzb0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmNsYXNzZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2xhc3Nlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzZXMuc2l6ZSgpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRDbGFzc2VzKCkgewotCQlPYmplY3RbXSBqZHRDbGFzc2VzID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSkFYQi5YTUxfU0VFX0FMU09fX1ZBTFVFKTsKLQkJVmVjdG9yPFN0cmluZz4gcmVzdWx0ID0gbmV3IFZlY3RvcjxTdHJpbmc+KGpkdENsYXNzZXMubGVuZ3RoKTsKLQkJZm9yIChPYmplY3QgamR0Q2xhc3MgOiBqZHRDbGFzc2VzKSB7Ci0JCQlyZXN1bHQuYWRkKChTdHJpbmcpIGpkdENsYXNzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENsYXNzKFN0cmluZyBjbGF6eikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ2xhc3MoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ2xhc3MoU3RyaW5nIGNsYXp6KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNsYXNzKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIGdldENsYXNzZXMoKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNsYXNzZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM3MWRkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFRyYW5zaWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zaWVudEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVhtbFRyYW5zaWVudEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFRyYW5zaWVudEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlYbWxUcmFuc2llbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1RSQU5TSUVOVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVHlwZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkMDhmNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHlwZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVHlwZUFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBmYWN0b3J5Q2xhc3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeU1ldGhvZDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IHByb3BPcmRlcjsKLQotCi0JcHVibGljIEJpbmFyeVhtbFR5cGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuZmFjdG9yeUNsYXNzID0gdGhpcy5idWlsZEZhY3RvcnlDbGFzcygpOwotCQl0aGlzLmZhY3RvcnlNZXRob2QgPSB0aGlzLmJ1aWxkRmFjdG9yeU1ldGhvZCgpOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoKTsKLQkJdGhpcy5wcm9wT3JkZXIgPSB0aGlzLmJ1aWxkUHJvcE9yZGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGYWN0b3J5Q2xhc3NfKHRoaXMuYnVpbGRGYWN0b3J5Q2xhc3MoKSk7Ci0JCXRoaXMuc2V0RmFjdG9yeU1ldGhvZF8odGhpcy5idWlsZEZhY3RvcnlNZXRob2QoKSk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7Ci0JCXRoaXMuc2V0TmFtZXNwYWNlXyh0aGlzLmJ1aWxkTmFtZXNwYWNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbFR5cGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGZhY3RvcnlDbGFzcwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5Q2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeUNsYXNzKFN0cmluZyBmYWN0b3J5Q2xhc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZhY3RvcnlDbGFzc18oU3RyaW5nIGZhY3RvcnlDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mYWN0b3J5Q2xhc3M7Ci0JCXRoaXMuZmFjdG9yeUNsYXNzID0gZmFjdG9yeUNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkFDVE9SWV9DTEFTU19QUk9QRVJUWSwgb2xkLCBmYWN0b3J5Q2xhc3MpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX0ZBQ1RPUllfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBmYWN0b3J5Q2xhc3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRmFjdG9yeUNsYXNzKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9UWVBFX19GQUNUT1JZX0NMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZhY3RvcnlDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgZmFjdG9yeSBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZhY3RvcnlDbGFzczsKLQl9Ci0KLQkvLyAqKioqKiBmYWN0b3J5TWV0aG9kCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5TWV0aG9kKCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5TWV0aG9kOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZhY3RvcnlNZXRob2QoU3RyaW5nIGZhY3RvcnlNZXRob2QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEZhY3RvcnlNZXRob2RfKFN0cmluZyBmYWN0b3J5TWV0aG9kKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZhY3RvcnlNZXRob2Q7Ci0JCXRoaXMuZmFjdG9yeU1ldGhvZCA9IGZhY3RvcnlNZXRob2Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGQUNUT1JZX01FVEhPRF9QUk9QRVJUWSwgb2xkLCBmYWN0b3J5TWV0aG9kKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZhY3RvcnlNZXRob2QoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX1RZUEVfX0ZBQ1RPUllfTUVUSE9EKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZhY3RvcnlNZXRob2RUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpBWEIuWE1MX1RZUEVfX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lc3BhY2VfKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKQVhCLlhNTF9UWVBFX19OQU1FU1BBQ0UpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBwcm9wIG9yZGVyCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnByb3BPcmRlcik7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcm9wT3JkZXJTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wcm9wT3JkZXIuc2l6ZSgpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRQcm9wT3JkZXIoKSB7Ci0JCU9iamVjdFtdIGpkdFByb3BPcmRlciA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpBWEIuWE1MX1RZUEVfX1BST1BfT1JERVIpOwotCQlWZWN0b3I8U3RyaW5nPiByZXN1bHQgPSBuZXcgVmVjdG9yPFN0cmluZz4oamR0UHJvcE9yZGVyLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdFByb3AgOiBqZHRQcm9wT3JkZXIpIHsKLQkJCXJlc3VsdC5hZGQoKFN0cmluZykgamR0UHJvcCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wKFN0cmluZyBwcm9wT3JkZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcChpbnQgaW5kZXgsIFN0cmluZyBwcm9wT3JkZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVByb3AoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcChTdHJpbmcgcHJvcE9yZGVyKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByb3BPcmRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvcE9yZGVyVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcm9wVGV4dFJhbmdlKGludCBpbmRleCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3BUb3VjaGVzKGludCBpbmRleCwgaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxOWYzOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFZhbHVlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlYbWxWYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbFZhbHVlQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeVhtbFZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMzExOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JPcmRlcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgWG1sQWNjZXNzT3JkZXIgdmFsdWU7Ci0KLQotCXB1YmxpYyBTb3VyY2VYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRlZEVsZW1lbnQsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiBYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBYbWxBY2Nlc3NPcmRlciBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFhtbEFjY2Vzc09yZGVyIGFzdFZhbHVlKSB7Ci0JCVhtbEFjY2Vzc09yZGVyIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFhtbEFjY2Vzc09yZGVyIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIFhtbEFjY2Vzc09yZGVyLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCS8vcmVtb3ZlIHRoZSBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24gd2hlbiB0aGUgdmFsdWUgZWxlbWVudCBpcyByZW1vdmVkLgotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSX19WQUxVRSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjM2IwYmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgWG1sQWNjZXNzVHlwZSB2YWx1ZTsKLQotCi0JcHVibGljIFNvdXJjZVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0ZWRFbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQUNDRVNTT1JfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFhtbEFjY2Vzc1R5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFhtbEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUodmFsdWUpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoWG1sQWNjZXNzVHlwZSBhc3RWYWx1ZSkgewotCQlYbWxBY2Nlc3NUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFhtbEFjY2Vzc1R5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gWG1sQWNjZXNzVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQkvL3JlbW92ZSB0aGUgWG1sQWNjZXNzb3JUeXBlIGFubm90YXRpb24gd2hlbiB0aGUgdmFsdWUgZWxlbWVudCBpcyByZW1vdmVkLgotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEVfX1ZBTFVFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3MGZhOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUF0dHJpYnV0ZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSk7Ci0KLQlwdWJsaWMgU291cmNlWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQU5ZX0FUVFJJQlVURTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBbnlFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2UxM2JjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUVsZW1lbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55RWxlbWVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQW55RWxlbWVudEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbGF4RGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGxheEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIGxheDsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIFNvdXJjZVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgU291cmNlWG1sQW55RWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubGF4RGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZExheEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5sYXhBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmxheERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkVmFsdWVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkTGF4QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfQU5ZX0VMRU1FTlRfX0xBWCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIEpBWEIuWE1MX0FOWV9FTEVNRU5UX19WQUxVRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGNvbnZlcnRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0FOWV9FTEVNRU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5sYXggPSB0aGlzLmJ1aWxkTGF4KGFzdFJvb3QpOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jTGF4KHRoaXMuYnVpbGRMYXgoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sQW55RWxlbWVudEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbGF4Ci0JcHVibGljIEJvb2xlYW4gZ2V0TGF4KCkgewotCQlyZXR1cm4gdGhpcy5sYXg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF4KEJvb2xlYW4gbGF4KSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmxheCwgbGF4KSkgewotCQkJdGhpcy5sYXggPSBsYXg7Ci0JCQl0aGlzLmxheEFkYXB0ZXIuc2V0VmFsdWUobGF4KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTGF4KEJvb2xlYW4gYXN0TGF4KSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5sYXg7Ci0JCXRoaXMubGF4ID0gYXN0TGF4OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEFYX1BST1BFUlRZLCBvbGQsIGFzdExheCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkTGF4KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmxheEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRMYXhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmxheERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB2YWx1ZSBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX1ZBTFVFX0NMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFkZGQ5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0YWNobWVudFJlZgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfQVRUQUNITUVOVF9SRUY7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDk0MmUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sQXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0cmlidXRlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sQXR0cmlidXRlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sQXR0cmlidXRlQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIFNvdXJjZVhtbEF0dHJpYnV0ZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQl0aGlzKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUikpOwotCX0KLQotCXB1YmxpYyBTb3VyY2VYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlQWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRSZXF1aXJlZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXF1aXJlZEFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMucmVxdWlyZWREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0FUVFJJQlVURV9fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZXNwYWNlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9BVFRSSUJVVEVfX05BTUVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFJlcXVpcmVkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfQVRUUklCVVRFX19SRVFVSVJFRCk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9BVFRSSUJVVEU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpOwotCQl0aGlzLnJlcXVpcmVkID0gdGhpcy5idWlsZFJlcXVpcmVkKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTmFtZXNwYWNlKHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNSZXF1aXJlZCh0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEF0dHJpYnV0ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5hbWUsIG5hbWUpKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBhc3ROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWVzcGFjZShTdHJpbmcgYXN0TmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBhc3ROYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgYXN0TmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZXF1aXJlZCwgcmVxdWlyZWQpKSB7Ci0JCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCQl0aGlzLnJlcXVpcmVkQWRhcHRlci5zZXRWYWx1ZShyZXF1aXJlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlcXVpcmVkKEJvb2xlYW4gYXN0UmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gYXN0UmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCBhc3RSZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiN2Y2MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sRWxlbWVudEFubm90YXRpb24KLQkJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sRWxlbWVudEFubm90YXRpb24gewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG5pbGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG5pbGxhYmxlQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gbmlsbGFibGU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVkOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHR5cGVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uIGJ1aWxkU291cmNlWG1sRWxlbWVudEFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJCi0JCXJldHVybiBuZXcgU291cmNlWG1sRWxlbWVudEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkU291cmNlWG1sRWxlbWVudEFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQkKLQkKLQlwcml2YXRlIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgZGFhKSk7Ci0JfQotCQotCXByaXZhdGUgU291cmNlWG1sRWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQl0aGlzKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaWRhYSwgbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSkpOwotCX0KLQkKLQlwcml2YXRlIFNvdXJjZVhtbEVsZW1lbnRBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCAKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCAKLQkJCUFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCQotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlQWRhcHRlcihkYWEpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uaWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROaWxsYWJsZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uaWxsYWJsZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMubmlsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFJlcXVpcmVkQWRhcHRlcihkYWEpOwotCQl0aGlzLnJlcXVpcmVkQWRhcHRlciA9IHRoaXMuYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZERlZmF1bHRWYWx1ZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5kZWZhdWx0VmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmRlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRUeXBlQWRhcHRlcihkYWEpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9FTEVNRU5UX19OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX05BTUVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE5pbGxhYmxlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfRUxFTUVOVF9fTklMTEFCTEUpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRSZXF1aXJlZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX1JFUVVJUkVEKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGREZWZhdWx0VmFsdWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFR5cGVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIEpBWEIuWE1MX0VMRU1FTlRfX1RZUEUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMubmlsbGFibGUgPSB0aGlzLmJ1aWxkTmlsbGFibGUoYXN0Um9vdCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCk7Ci0JCXRoaXMuZGVmYXVsdFZhbHVlID0gdGhpcy5idWlsZERlZmF1bHRWYWx1ZShhc3RSb290KTsKLQkJdGhpcy50eXBlID0gdGhpcy5idWlsZFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFR5cGVOYW1lKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTmFtZXNwYWNlKHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNOaWxsYWJsZSh0aGlzLmJ1aWxkTmlsbGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNSZXF1aXJlZCh0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNEZWZhdWx0VmFsdWUodGhpcy5idWlsZERlZmF1bHRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1R5cGUodGhpcy5idWlsZFR5cGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGdWxseVF1YWxpZmllZFR5cGVOYW1lKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFR5cGVOYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbGVtZW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIGFzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5hbWVzcGFjZSwgbmFtZXNwYWNlKSkgewotCQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuc2V0VmFsdWUobmFtZXNwYWNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZXNwYWNlKFN0cmluZyBhc3ROYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQl0aGlzLm5hbWVzcGFjZSA9IGFzdE5hbWVzcGFjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lc3BhY2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuaWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShCb29sZWFuIG5pbGxhYmxlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5pbGxhYmxlLCBuaWxsYWJsZSkpIHsKLQkJCXRoaXMubmlsbGFibGUgPSBuaWxsYWJsZTsKLQkJCXRoaXMubmlsbGFibGVBZGFwdGVyLnNldFZhbHVlKG5pbGxhYmxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmlsbGFibGUoQm9vbGVhbiBhc3ROaWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmlsbGFibGU7Ci0JCXRoaXMubmlsbGFibGUgPSBhc3ROaWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5JTExBQkxFX1BST1BFUlRZLCBvbGQsIGFzdE5pbGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROaWxsYWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmlsbGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5pbGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiByZXF1aXJlZAotCXB1YmxpYyBCb29sZWFuIGdldFJlcXVpcmVkKCkgewotCQlyZXR1cm4gdGhpcy5yZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChCb29sZWFuIHJlcXVpcmVkKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnJlcXVpcmVkLCByZXF1aXJlZCkpIHsKLQkJCXRoaXMucmVxdWlyZWQgPSByZXF1aXJlZDsKLQkJCXRoaXMucmVxdWlyZWRBZGFwdGVyLnNldFZhbHVlKHJlcXVpcmVkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUmVxdWlyZWQoQm9vbGVhbiBhc3RSZXF1aXJlZCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMucmVxdWlyZWQ7Ci0JCXRoaXMucmVxdWlyZWQgPSBhc3RSZXF1aXJlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFUVVJUkVEX1BST1BFUlRZLCBvbGQsIGFzdFJlcXVpcmVkKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRSZXF1aXJlZChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXF1aXJlZEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBkZWZhdWx0VmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlKSkgewotCQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCQl0aGlzLmRlZmF1bHRWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRGVmYXVsdFZhbHVlKFN0cmluZyBhc3REZWZhdWx0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFZhbHVlOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGFzdERlZmF1bHRWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0RGVmYXVsdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RGVmYXVsdFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5kZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy50eXBlLCB0eXBlKSkgewotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMudHlwZUFkYXB0ZXIuc2V0VmFsdWUodHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1R5cGUoU3RyaW5nIGFzdFR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudHlwZTsKLQkJdGhpcy50eXBlID0gYXN0VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZCwgYXN0VHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZFR5cGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRUeXBlTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudHlwZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCi0JCi0JLy8qKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGZyb20gTmVzdGFibGVBbm5vdGF0aW9uIGludGVyZmFjZQotCSAqIGZvciBzdWJjbGFzc2VzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3NDVjYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50RGVjbEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50RGVjbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjb3BlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NvcGVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHNjb3BlOwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2U7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHN1YnN0aXR1dGlvbkhlYWROYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc3Vic3RpdHV0aW9uSGVhZE5hbWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkZWZhdWx0VmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRWYWx1ZTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JCXRoaXMuc2NvcGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFNjb3BlRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMuc2NvcGVBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5zY29wZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGROYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5kZWZhdWx0VmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZERlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZUFkYXB0ZXIgPSBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLmRlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNjb3BlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX1NDT1BFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FU1BBQ0UpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGVmYXVsdFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX0RFRkFVTFRfVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9ERUNMOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc2NvcGUgPSBidWlsZFNjb3BlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUgPSBidWlsZEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZSA9IGJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlID0gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKGFzdFJvb3QpOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lID0gYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZShhc3RSb290KTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBidWlsZERlZmF1bHRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN5bmNTY29wZShidWlsZFNjb3BlKGFzdFJvb3QpKTsKLQkJc3luY0Z1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoYnVpbGRGdWxseVF1YWxpZmllZFNjb3BlQ2xhc3NOYW1lKGFzdFJvb3QpKTsKLQkJc3luY05hbWVzcGFjZShidWlsZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JCXN5bmNOYW1lKGJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXN5bmNTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKGJ1aWxkU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JCXN5bmNTdWJzdGl0dXRpb25IZWFkTmFtZShidWlsZFN1YnN0aXR1dGlvbkhlYWROYW1lKGFzdFJvb3QpKTsKLQkJc3luY0RlZmF1bHRWYWx1ZShidWlsZERlZmF1bHRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqIHNjb3BlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NvcGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc2NvcGUsIHNjb3BlKSkgewotCQkJdGhpcy5zY29wZSA9IHNjb3BlOwotCQkJdGhpcy5zY29wZUFkYXB0ZXIuc2V0VmFsdWUoc2NvcGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jU2NvcGUoU3RyaW5nIGFzdFNjb3BlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNjb3BlOwotCQl0aGlzLnNjb3BlID0gYXN0U2NvcGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NPUEVfUFJPUEVSVFksIG9sZCwgYXN0U2NvcGUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFNjb3BlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNjb3BlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY29wZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjb3BlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHNjb3BlIGNsYXNzIG5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWU7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jRnVsbHlRdWFsaWZpZWRTY29wZUNsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFNjb3BlQ2xhc3NOYW1lOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUgPSBuYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9TQ09QRV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkU2NvcGVDbGFzc05hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuICh0aGlzLnNjb3BlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy5zY29wZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lc3BhY2UpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShTdHJpbmcgc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSwgc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSkpIHsKLQkJCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSA9IHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2U7Ci0JCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jU3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShTdHJpbmcgYXN0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlOwotCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UgPSBhc3RTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFNVQlNUSVRVVElPTl9IRUFEX05BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBhc3RTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3Vic3RpdHV0aW9uSGVhZE5hbWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZSwgc3Vic3RpdHV0aW9uSGVhZE5hbWUpKSB7Ci0JCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lID0gc3Vic3RpdHV0aW9uSGVhZE5hbWU7Ci0JCQl0aGlzLnN1YnN0aXR1dGlvbkhlYWROYW1lQWRhcHRlci5zZXRWYWx1ZShzdWJzdGl0dXRpb25IZWFkTmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNTdWJzdGl0dXRpb25IZWFkTmFtZShTdHJpbmcgYXN0U3Vic3RpdHV0aW9uSGVhZE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWU7Ci0JCXRoaXMuc3Vic3RpdHV0aW9uSGVhZE5hbWUgPSBhc3RTdWJzdGl0dXRpb25IZWFkTmFtZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChTVUJTVElUVVRJT05fSEVBRF9OQU1FX1BST1BFUlRZLCBvbGQsIGFzdFN1YnN0aXR1dGlvbkhlYWROYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTdWJzdGl0dXRpb25IZWFkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHN1YnN0aXR1dGlvbkhlYWROYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5zdWJzdGl0dXRpb25IZWFkTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogZGVmYXVsdFZhbHVlICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmRlZmF1bHRWYWx1ZSwgZGVmYXVsdFZhbHVlKSkgewotCQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0JCQl0aGlzLmRlZmF1bHRWYWx1ZUFkYXB0ZXIuc2V0VmFsdWUoZGVmYXVsdFZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY0RlZmF1bHRWYWx1ZShTdHJpbmcgYXN0RGVmYXVsdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWUgPSBhc3REZWZhdWx0VmFsdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3REZWZhdWx0VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldERlZmF1bHRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmRlZmF1bHRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMTA4ZDQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQotCQotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlcXVpcmVkRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHJlcXVpcmVkQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gcmVxdWlyZWQ7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0eXBlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24gYnVpbGRTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24gYnVpbGROZXN0ZWRTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JfQotCQotCQotCXByaXZhdGUgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCi0JCXRoaXMocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgZGFhKSk7Ci0JfQotCQotCXByaXZhdGUgU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGlkYWEsIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCAKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLAotCQkJQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJCi0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRSZXF1aXJlZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXF1aXJlZEFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMucmVxdWlyZWREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkVHlwZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FU1BBQ0UpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRSZXF1aXJlZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19SRVFVSVJFRCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuZGFhLCBKQVhCLlhNTF9FTEVNRU5UX1JFRl9fVFlQRSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1JFRjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCk7Ci0JCXRoaXMucmVxdWlyZWQgPSB0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZSA9IHRoaXMuYnVpbGRUeXBlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRUeXBlTmFtZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jTmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY05hbWVzcGFjZSh0aGlzLmJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jUmVxdWlyZWQodGhpcy5idWlsZFJlcXVpcmVkKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jVHlwZSh0aGlzLmJ1aWxkVHlwZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Z1bGx5UXVhbGlmaWVkVHlwZU5hbWUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIG5hbWVzcGFjZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZXNwYWNlLCBuYW1lc3BhY2UpKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJCXRoaXMubmFtZXNwYWNlQWRhcHRlci5zZXRWYWx1ZShuYW1lc3BhY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIGFzdE5hbWVzcGFjZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCi0JLy8gKioqKiogcmVxdWlyZWQKLQlwdWJsaWMgQm9vbGVhbiBnZXRSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZXF1aXJlZCwgcmVxdWlyZWQpKSB7Ci0JCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JCQl0aGlzLnJlcXVpcmVkQWRhcHRlci5zZXRWYWx1ZShyZXF1aXJlZCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlcXVpcmVkKEJvb2xlYW4gYXN0UmVxdWlyZWQpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnJlcXVpcmVkOwotCQl0aGlzLnJlcXVpcmVkID0gYXN0UmVxdWlyZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVFVSVJFRF9QUk9QRVJUWSwgb2xkLCBhc3RSZXF1aXJlZCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkUmVxdWlyZWQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVxdWlyZWRBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogdHlwZQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnR5cGUsIHR5cGUpKSB7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy50eXBlQWRhcHRlci5zZXRWYWx1ZSh0eXBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZShTdHJpbmcgYXN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSBhc3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFR5cGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudHlwZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy50eXBlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Z1bGx5UXVhbGlmaWVkVHlwZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlTmFtZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFR5cGVOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFR5cGVOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy50eXBlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy50eXBlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQkKLQkvLyoqKioqKioqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBOZXN0YWJsZUFubm90YXRpb24gaW50ZXJmYWNlCi0JICogZm9yIHN1YmNsYXNzZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50UmVmc0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkyYTRhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudFJlZnMKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxFbGVtZW50UmVmc0Fubm90YXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgCi0JCQk9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBYbWxFbGVtZW50UmVmc0Fubm90YXRpb25Db250YWluZXIgeG1sRWxlbWVudFJlZnNDb250YWluZXIgCi0JCQk9IG5ldyBYbWxFbGVtZW50UmVmc0Fubm90YXRpb25Db250YWluZXIoKTsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBTb3VyY2VYbWxFbGVtZW50UmVmc0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVF9SRUZTOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIuaW5pdGlhbGl6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy54bWxFbGVtZW50UmVmc0NvbnRhaW5lci5zeW5jaHJvbml6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHhtbCBlbGVtZW50IHJlZnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50UmVmcygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxFbGVtZW50UmVmc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRSZWZzQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50UmVmc0NvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYWRkWG1sRWxlbWVudFJlZihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCXByaXZhdGUgWG1sRWxlbWVudFJlZkFubm90YXRpb24gYnVpbGRYbWxFbGVtZW50UmVmKGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlWG1sRWxlbWVudFJlZkFubm90YXRpb24uYnVpbGROZXN0ZWRTb3VyY2VYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigKLQkJCQl0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkWG1sRWxlbWVudFJlZkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRYbWxFbGVtZW50UmVmSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJdGhpcy5kYWEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUsIGluZGV4LCBKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxFbGVtZW50UmVmKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMueG1sRWxlbWVudFJlZnNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudFJlZihpbnQgaW5kZXgpIHsKLQkJdGhpcy54bWxFbGVtZW50UmVmc0NvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JCi0JY2xhc3MgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQkJZXh0ZW5kcyBBbm5vdGF0aW9uQ29udGFpbmVyPFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uPiB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uc1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBYTUxfRUxFTUVOVF9SRUZTX0xJU1Q7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRfUkVGOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VYbWxFbGVtZW50UmVmc0Fubm90YXRpb24udGhpcy5idWlsZFhtbEVsZW1lbnRSZWYoaW5kZXgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwMjE3OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBuaWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBuaWxsYWJsZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIG5pbGxhYmxlOwotCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiByZXF1aXJlZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHJlcXVpcmVkOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIFNvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXRoaXMocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JfQotCi0JcHVibGljIFNvdXJjZVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE5hbWVzcGFjZUFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmlsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmlsbGFibGVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubmlsbGFibGVBZGFwdGVyID0gdGhpcy5idWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLm5pbGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRSZXF1aXJlZEFkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXF1aXJlZEFkYXB0ZXIgPSB0aGlzLmJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMucmVxdWlyZWREZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUl9fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZXNwYWNlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVJfX05BTUVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE5pbGxhYmxlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSX19OSUxMQUJMRSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFJlcXVpcmVkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvckJvb2xlYW5zKGRhYSwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSX19SRVFVSVJFRCk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFNob3J0Q2lyY3VpdEJvb2xlYW5FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVI7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5uYW1lc3BhY2UgPSB0aGlzLmJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpOwotCQl0aGlzLm5pbGxhYmxlID0gdGhpcy5idWlsZE5pbGxhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnJlcXVpcmVkID0gdGhpcy5idWlsZFJlcXVpcmVkKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTmFtZXNwYWNlKHRoaXMuYnVpbGROYW1lc3BhY2UoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNOaWxsYWJsZSh0aGlzLmJ1aWxkTmlsbGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNSZXF1aXJlZCh0aGlzLmJ1aWxkUmVxdWlyZWQoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIGFzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5hbWVzcGFjZSwgbmFtZXNwYWNlKSkgewotCQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCQl0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuc2V0VmFsdWUobmFtZXNwYWNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZXNwYWNlKFN0cmluZyBhc3ROYW1lc3BhY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQl0aGlzLm5hbWVzcGFjZSA9IGFzdE5hbWVzcGFjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lc3BhY2UpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBuaWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE5pbGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROaWxsYWJsZShCb29sZWFuIG5pbGxhYmxlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5pbGxhYmxlLCBuaWxsYWJsZSkpIHsKLQkJCXRoaXMubmlsbGFibGUgPSBuaWxsYWJsZTsKLQkJCXRoaXMubmlsbGFibGVBZGFwdGVyLnNldFZhbHVlKG5pbGxhYmxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmlsbGFibGUoQm9vbGVhbiBhc3ROaWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubmlsbGFibGU7Ci0JCXRoaXMubmlsbGFibGUgPSBhc3ROaWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5JTExBQkxFX1BST1BFUlRZLCBvbGQsIGFzdE5pbGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROaWxsYWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uaWxsYWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROaWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmlsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHJlcXVpcmVkCi0JcHVibGljIEJvb2xlYW4gZ2V0UmVxdWlyZWQoKSB7Ci0JCXJldHVybiB0aGlzLnJlcXVpcmVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKEJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucmVxdWlyZWQsIHJlcXVpcmVkKSkgewotCQkJdGhpcy5yZXF1aXJlZCA9IHJlcXVpcmVkOwotCQkJdGhpcy5yZXF1aXJlZEFkYXB0ZXIuc2V0VmFsdWUocmVxdWlyZWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZXF1aXJlZChCb29sZWFuIGFzdFJlcXVpcmVkKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5yZXF1aXJlZDsKLQkJdGhpcy5yZXF1aXJlZCA9IGFzdFJlcXVpcmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVRVUlSRURfUFJPUEVSVFksIG9sZCwgYXN0UmVxdWlyZWQpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFJlcXVpcmVkKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlcXVpcmVkQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5yZXF1aXJlZERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50c0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg3NzNmNS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbGVtZW50c0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRzQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VYbWxFbGVtZW50c0Fubm90YXRpb24KLQkJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sRWxlbWVudHNBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSIAotCT0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfRUxFTUVOVFMpOwotCi0JCi0JcHJpdmF0ZSBmaW5hbCBYbWxFbGVtZW50c0Fubm90YXRpb25Db250YWluZXIgeG1sRWxlbWVudHNDb250YWluZXIgPSBuZXcgWG1sRWxlbWVudHNBbm5vdGF0aW9uQ29udGFpbmVyKCk7Ci0JCi0JcHVibGljIFNvdXJjZVhtbEVsZW1lbnRzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXRoaXMocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgU291cmNlWG1sRWxlbWVudHNBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlRTOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sRWxlbWVudHNDb250YWluZXIuaW5pdGlhbGl6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy54bWxFbGVtZW50c0NvbnRhaW5lci5zeW5jaHJvbml6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHhtbG5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudHNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxFbGVtZW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVsZW1lbnRzQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy54bWxFbGVtZW50c0NvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb24gYWRkWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRWxlbWVudHNDb250YWluZXIuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCXByaXZhdGUgWG1sRWxlbWVudEFubm90YXRpb24gYnVpbGRYbWxFbGVtZW50KGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlWG1sRWxlbWVudEFubm90YXRpb24uYnVpbGROZXN0ZWRTb3VyY2VYbWxFbGVtZW50QW5ub3RhdGlvbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkWG1sRWxlbWVudEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRYbWxFbGVtZW50SW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQl0aGlzLmRhYSwgSkFYQi5YTUxfRUxFTUVOVFNfX1ZBTFVFLCBpbmRleCwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxFbGVtZW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMueG1sRWxlbWVudHNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sRWxlbWVudChpbnQgaW5kZXgpIHsKLQkJdGhpcy54bWxFbGVtZW50c0NvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JLyoqCi0JKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIHhtbCBzY2hlbWEncyB4bWxucwotCSovCi0JY2xhc3MgWG1sRWxlbWVudHNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQlleHRlbmRzIEFubm90YXRpb25Db250YWluZXI8WG1sRWxlbWVudEFubm90YXRpb24+Ci0JCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbnNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gWE1MX0VMRU1FTlRTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gSkFYQi5YTUxfRUxFTUVOVFNfX1ZBTFVFOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpBWEIuWE1MX0VMRU1FTlQ7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50QW5ub3RhdGlvbiBidWlsZE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gU291cmNlWG1sRWxlbWVudHNBbm5vdGF0aW9uLnRoaXMuYnVpbGRYbWxFbGVtZW50KGluZGV4KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVudW1Bbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbnVtQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmRjYmFmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEVudW1Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sRW51bUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEVudW1Bbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0VOVU0pOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lOwotCi0JcHVibGljIFNvdXJjZVhtbEVudW1Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9FTlVNOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Z1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUodGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxFbnVtQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgdmFsdWUgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Z1bGx5UXVhbGlmaWVkVmFsdWVDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9WQUxVRV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRU5VTV9fVkFMVUUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmc+IGNvbnZlcnRlcikgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxFbnVtVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjQ0MjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sRW51bVZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRW51bVZhbHVlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW1WYWx1ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sRW51bVZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sRW51bVZhbHVlQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQlwdWJsaWMgU291cmNlWG1sRW51bVZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfRU5VTV9WQUxVRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbEVudW1WYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKFZBTFVFX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfRU5VTV9WQUxVRV9fVkFMVUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSURBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxJREFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1NGI3ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxJREFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbElEQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sSURBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0lEKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxJREFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSURSRUZBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxJRFJFRkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2MzJhYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxJRFJFRkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURSRUZBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSURSRUYKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbElEUkVGQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sSURSRUZBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX0lEUkVGKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxJRFJFRkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lEUkVGOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOWY2YjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24KLQkJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEpOwotCQotCQotCXB1YmxpYyBTb3VyY2VYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTcyM2M2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTKTsKLQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFZhbHVlOwotCQotCS8qCi0JICogV2Ugd2FudCB0aGlzIGV2ZW50IGZpcmVkIHdoZW4gdGhlIGZxIGNsYXNzIGNoYW5nZXMgYnkgaXRzZWxmLCBub3QgYXMgYSByZXN1bHQKLQkgKiBvZiB0aGUgbm9uLWZxIGNsYXNzIGNoYW5naW5nLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc0ZRVmFsdWVFdmVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0eXBlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGU7Ci0JCi0JLyoKLQkgKiBXZSB3YW50IHRoaXMgZXZlbnQgZmlyZWQgd2hlbiB0aGUgZnEgY2xhc3MgY2hhbmdlcyBieSBpdHNlbGYsIG5vdCBhcyBhIHJlc3VsdAotCSAqIG9mIHRoZSBub24tZnEgY2xhc3MgY2hhbmdpbmcuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHN1cHByZXNzRlFUeXBlRXZlbnROb3RpZmljYXRpb24gPSBmYWxzZTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIHN0YXRpYyBTb3VyY2VYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGJ1aWxkU291cmNlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBidWlsZFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oCi0JCQlwYXJlbnQsCi0JCQlhbm5vdGF0ZWRFbGVtZW50LAotCQkJaWRhYSwKLQkJCWlhYSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkVmFsdWVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy50eXBlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRUeXBlQWRhcHRlcihkYWEpOwotCQl0aGlzLnR5cGVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1ZBTFVFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1RZUEUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSBidWlsZFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWUgPSBidWlsZEZ1bGx5UXVhbGlmaWVkVmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMudHlwZSA9IGJ1aWxkVHlwZShhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFR5cGUgPSBidWlsZEZ1bGx5UXVhbGlmaWVkVHlwZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN5bmNWYWx1ZShidWlsZFZhbHVlKGFzdFJvb3QpKTsKLQkJc3luY1R5cGUoYnVpbGRUeXBlKGFzdFJvb3QpKTsKLQkJc3luY0Z1bGx5UXVhbGlmaWVkVmFsdWUoYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlKGFzdFJvb3QpKTsKLQkJc3luY0Z1bGx5UXVhbGlmaWVkVHlwZShidWlsZEZ1bGx5UXVhbGlmaWVkVHlwZShhc3RSb290KSk7Ci0JCQotCQl0aGlzLnN1cHByZXNzRlFWYWx1ZUV2ZW50Tm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCXRoaXMuc3VwcHJlc3NGUVR5cGVFdmVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5zdXBwcmVzc0ZRVmFsdWVFdmVudE5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5zdXBwcmVzc0ZRVmFsdWVFdmVudE5vdGlmaWNhdGlvbiB8PSBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwob2xkLCBhc3RWYWx1ZSk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZFZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkVmFsdWU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRWYWx1ZSA9IG5hbWU7Ci0JCWlmICghIHRoaXMuc3VwcHJlc3NGUVZhbHVlRXZlbnROb3RpZmljYXRpb24pIHsKLQkJCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfVkFMVUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCkpOwotCX0KLQkKLQkvLyAqKioqKiB0eXBlCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50eXBlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnR5cGUsIHR5cGUpKSB7Ci0JCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJdGhpcy5zdXBwcmVzc0ZRVHlwZUV2ZW50Tm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJCXRoaXMudHlwZUFkYXB0ZXIuc2V0VmFsdWUodHlwZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNUeXBlKFN0cmluZyBhc3RUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnR5cGU7Ci0JCXRoaXMudHlwZSA9IGFzdFR5cGU7Ci0JCXRoaXMuc3VwcHJlc3NGUVR5cGVFdmVudE5vdGlmaWNhdGlvbiB8PSBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwob2xkLCBhc3RUeXBlKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRZUEVfUFJPUEVSVFksIG9sZCwgYXN0VHlwZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy50eXBlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy50eXBlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZFR5cGUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVHlwZSA9IG5hbWU7Ci0JCWlmICghIHRoaXMuc3VwcHJlc3NGUVR5cGVFdmVudE5vdGlmaWNhdGlvbikgewotCQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy50eXBlID09IG51bGwpID8gbnVsbCA6IEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy50eXBlQWRhcHRlci5nZXRFeHByZXNzaW9uKGFzdFJvb3QpKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiBOZXN0YWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIGNvbnZlbmllbmNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZCBmcm9tIE5lc3RhYmxlQW5ub3RhdGlvbiBpbnRlcmZhY2UKLQkgKiBmb3Igc3ViY2xhc3NlcwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQl0aGlzLmdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkWG1sSmF2YVR5cGVBZGFwdGVyRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IAotCQkJbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCUNPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJaW5kZXgsCi0JCQkJSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlyZXR1cm4gaWRhYTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxMaXN0QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTGlzdEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0NDczMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxMaXN0QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxMaXN0QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3QKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbExpc3RBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxMaXN0QW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9MSVNUKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxMaXN0QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfTElTVDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2RiYTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTWltZVR5cGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1pbWVUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1pbWVUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxNaW1lVHlwZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbE1pbWVUeXBlQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9NSU1FX1RZUEUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBTb3VyY2VYbWxNaW1lVHlwZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX01JTUVfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbE1pbWVUeXBlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX01JTUVfVFlQRV9fVkFMVUUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE1peGVkQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDY5YjIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbE1peGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxNaXhlZEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFhtbE1peGVkQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKQVhCLlhNTF9NSVhFRCk7Ci0KLQlwdWJsaWMgU291cmNlWG1sTWl4ZWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKQVhCLlhNTF9NSVhFRDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbE5zQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTnNBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzQyZjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sTnNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFNvdXJjZVhtbE5zQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxOc0Fubm90YXRpb24gewotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VVUklEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VVUklBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcHJlZml4RGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcHJlZml4QWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBwcmVmaXg7Ci0JCi0JCi0JcHVibGljIFNvdXJjZVhtbE5zQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaWRhYSwgbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSkpOwotCQl0aGlzLm5hbWVzcGFjZVVSSURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lc3BhY2VVUklEZWNsYXJhdGlvbkFkYXB0ZXIoaWRhYSk7Ci0JCXRoaXMubmFtZXNwYWNlVVJJQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKHRoaXMubmFtZXNwYWNlVVJJRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5wcmVmaXhEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkUHJlZml4RGVjbGFyYXRpb25BZGFwdGVyKGlkYWEpOwotCQl0aGlzLnByZWZpeEFkYXB0ZXIgPSBidWlsZEFkYXB0ZXIodGhpcy5wcmVmaXhEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVzcGFjZVVSSURlY2xhcmF0aW9uQWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCQotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9OU19fTkFNRVNQQUNFX1VSSSk7Ci0JfQotCQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkUHJlZml4RGVjbGFyYXRpb25BZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCi0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX05TX19QUkVGSVgpOwotCX0KLQkKLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX05TOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gYnVpbGROYW1lc3BhY2VVUkkoYXN0Um9vdCk7Ci0JCXRoaXMucHJlZml4ID0gYnVpbGRQcmVmaXgoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN5bmNOYW1lc3BhY2VVUkkoYnVpbGROYW1lc3BhY2VVUkkoYXN0Um9vdCkpOwotCQlzeW5jUHJlZml4KGJ1aWxkUHJlZml4KGFzdFJvb3QpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lc3BhY2VVUkkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG5hbWVzcGFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZXNwYWNlVVJJLCBuYW1lc3BhY2VVUkkpKSB7Ci0JCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQkJCXRoaXMubmFtZXNwYWNlVVJJQWRhcHRlci5zZXRWYWx1ZShuYW1lc3BhY2VVUkkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlVVJJKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZVVSSUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZXNwYWNlVVJJKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlVVJJOwotCQl0aGlzLm5hbWVzcGFjZVVSSSA9IG5hbWVzcGFjZVVSSTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfVVJJX1BST1BFUlRZLCBvbGQsIG5hbWVzcGFjZVVSSSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVVJJVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lc3BhY2VVUklEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHByZWZpeCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIHRoaXMucHJlZml4OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucHJlZml4LCBwcmVmaXgpKSB7Ci0JCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJCXRoaXMucHJlZml4QWRhcHRlci5zZXRWYWx1ZShwcmVmaXgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUHJlZml4KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnByZWZpeEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucHJlZml4OwotCQl0aGlzLnByZWZpeCA9IHByZWZpeDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChQUkVGSVhfUFJPUEVSVFksIG9sZCwgcHJlZml4KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmVmaXhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnByZWZpeERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCBuZXdJbmRleCkgewotCQl0aGlzLmdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpLm1vdmVBbm5vdGF0aW9uKG5ld0luZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gKEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcikgdGhpcy5hbm5vdGF0aW9uQWRhcHRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxSZWdpc3RyeUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDUwYmJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSZWdpc3RyeUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlWG1sUmVnaXN0cnlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxSZWdpc3RyeUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfUkVHSVNUUlkpOwotCi0JcHVibGljIFNvdXJjZVhtbFJlZ2lzdHJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfUkVHSVNUUlk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vbm8tb3AKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxSb290RWxlbWVudEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRkNjk3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVfQURBUFRFUiA9IGJ1aWxkTmFtZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVTUEFDRV9BREFQVEVSID0gYnVpbGROYW1lc3BhY2VBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lc3BhY2VBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQotCXB1YmxpYyBTb3VyY2VYbWxSb290RWxlbWVudEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE5BTUVfQURBUFRFUik7Ci0JCXRoaXMubmFtZXNwYWNlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTkFNRVNQQUNFX0FEQVBURVIpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfUk9PVF9FTEVNRU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gdGhpcy5idWlsZE5hbWVzcGFjZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jTmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY05hbWVzcGFjZSh0aGlzLmJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxSb290RWxlbWVudEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm5hbWUsIG5hbWUpKSB7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQkJdGhpcy5uYW1lQWRhcHRlci5zZXRWYWx1ZShuYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBhc3ROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKE5BTUVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWVzcGFjZShTdHJpbmcgYXN0TmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBhc3ROYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgYXN0TmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRVNQQUNFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyhOQU1FU1BBQ0VfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1JPT1RfRUxFTUVOVF9fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1JPT1RfRUxFTUVOVF9fTkFNRVNQQUNFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFNjaGVtYUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFNjaGVtYUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyOTM5Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Zvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFNjaGVtYUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFNvdXJjZVhtbFNjaGVtYUFubm90YXRpb24KLQkJZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sU2NoZW1hQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiAKLQkJCT0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfU0NIRU1BKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEFUVFJJQlVURV9GT1JNX0RFRkFVTFRfQURBUFRFUiA9IAotCQkJYnVpbGRBdHRyaWJ1dGVGb3JtRGVmYXVsdEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGF0dHJpYnV0ZUZvcm1EZWZhdWx0QWRhcHRlcjsKLQlwcml2YXRlIFhtbE5zRm9ybSBhdHRyaWJ1dGVGb3JtRGVmYXVsdDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEVMRU1FTlRfRk9STV9ERUZBVUxUX0FEQVBURVIgPSAKLQkJCWJ1aWxkRWxlbWVudEZvcm1EZWZhdWx0QWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZWxlbWVudEZvcm1EZWZhdWx0QWRhcHRlcjsKLQlwcml2YXRlIFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBMT0NBVElPTl9BREFQVEVSID0gCi0JCQlidWlsZExvY2F0aW9uQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbG9jYXRpb25BZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRVNQQUNFX0FEQVBURVIgPSAKLQkJCWJ1aWxkTmFtZXNwYWNlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZXNwYWNlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBYbWxuc0Fubm90YXRpb25Db250YWluZXIgeG1sbnNDb250YWluZXIgPSBuZXcgWG1sbnNBbm5vdGF0aW9uQ29udGFpbmVyKCk7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEF0dHJpYnV0ZUZvcm1EZWZhdWx0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoCi0JCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9TQ0hFTUFfX0FUVFJJQlVURV9GT1JNX0RFRkFVTFQpOyAvL3JlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEVsZW1lbnRGb3JtRGVmYXVsdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfU0NIRU1BX19FTEVNRU5UX0ZPUk1fREVGQVVMVCk7IC8vIHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZExvY2F0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfU0NIRU1BX19MT0NBVElPTik7IC8vIHJlbW92ZSBhbm5vdGF0aW9uIHdoZW4gZW1wdHkKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncygKLQkJCQlERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1NDSEVNQV9fTkFNRVNQQUNFKTsgLy8gcmVtb3ZlIGFubm90YXRpb24gd2hlbiBlbXB0eQotCX0KLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sU2NoZW1hQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXRoaXMocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQkKLQlwdWJsaWMgU291cmNlWG1sU2NoZW1hQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSk7Ci0JCXRoaXMuYXR0cmlidXRlRm9ybURlZmF1bHRBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoQVRUUklCVVRFX0ZPUk1fREVGQVVMVF9BREFQVEVSKTsKLQkJdGhpcy5lbGVtZW50Rm9ybURlZmF1bHRBZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRUxFTUVOVF9GT1JNX0RFRkFVTFRfQURBUFRFUik7Ci0JCXRoaXMubG9jYXRpb25BZGFwdGVyID0gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTE9DQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubmFtZXNwYWNlQWRhcHRlciA9IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE5BTUVTUEFDRV9BREFQVEVSKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuYXR0cmlidXRlRm9ybURlZmF1bHQgPSBidWlsZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KGFzdFJvb3QpOwotCQl0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCA9IGJ1aWxkRWxlbWVudEZvcm1EZWZhdWx0KGFzdFJvb3QpOwotCQl0aGlzLmxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihhc3RSb290KTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBidWlsZE5hbWVzcGFjZShhc3RSb290KTsKLQkJdGhpcy54bWxuc0NvbnRhaW5lci5pbml0aWFsaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzeW5jQXR0cmlidXRlRm9ybURlZmF1bHQoYnVpbGRBdHRyaWJ1dGVGb3JtRGVmYXVsdChhc3RSb290KSk7Ci0JCXN5bmNFbGVtZW50Rm9ybURlZmF1bHQoYnVpbGRFbGVtZW50Rm9ybURlZmF1bHQoYXN0Um9vdCkpOwotCQlzeW5jTG9jYXRpb24oYnVpbGRMb2NhdGlvbihhc3RSb290KSk7Ci0JCXN5bmNOYW1lc3BhY2UoYnVpbGROYW1lc3BhY2UoYXN0Um9vdCkpOwotCQl0aGlzLnhtbG5zQ29udGFpbmVyLnN5bmNocm9uaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZXNwYWNlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBhdHRyaWJ1dGUgZm9ybSBkZWZhdWx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlRm9ybURlZmF1bHQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFhtbE5zRm9ybSBhdHRyaWJ1dGVGb3JtRGVmYXVsdCkgewotCQlpZiAoYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuYXR0cmlidXRlRm9ybURlZmF1bHQsIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSkgewotCQkJdGhpcy5hdHRyaWJ1dGVGb3JtRGVmYXVsdCA9IGF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCQkJdGhpcy5hdHRyaWJ1dGVGb3JtRGVmYXVsdEFkYXB0ZXIuc2V0VmFsdWUoWG1sTnNGb3JtLnRvSmF2YUFubm90YXRpb25WYWx1ZShhdHRyaWJ1dGVGb3JtRGVmYXVsdCkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgWG1sTnNGb3JtIGJ1aWxkQXR0cmlidXRlRm9ybURlZmF1bHQoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIFhtbE5zRm9ybS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtIGF0dHJpYnV0ZUZvcm1EZWZhdWx0KSB7Ci0JCVhtbE5zRm9ybSBvbGQgPSB0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0OwotCQl0aGlzLmF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gYXR0cmlidXRlRm9ybURlZmF1bHQ7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQVRUUklCVVRFX0ZPUk1fREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBhdHRyaWJ1dGVGb3JtRGVmYXVsdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlRm9ybURlZmF1bHRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShBVFRSSUJVVEVfRk9STV9ERUZBVUxUX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGVsZW1lbnQgZm9ybSBkZWZhdWx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFhtbE5zRm9ybSBnZXRFbGVtZW50Rm9ybURlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCwgZWxlbWVudEZvcm1EZWZhdWx0KSkgewotCQkJdGhpcy5lbGVtZW50Rm9ybURlZmF1bHQgPSBlbGVtZW50Rm9ybURlZmF1bHQ7Ci0JCQl0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdEFkYXB0ZXIuc2V0VmFsdWUoWG1sTnNGb3JtLnRvSmF2YUFubm90YXRpb25WYWx1ZShlbGVtZW50Rm9ybURlZmF1bHQpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFhtbE5zRm9ybSBidWlsZEVsZW1lbnRGb3JtRGVmYXVsdChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gWG1sTnNGb3JtLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZWxlbWVudEZvcm1EZWZhdWx0QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jRWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybSBlbGVtZW50Rm9ybURlZmF1bHQpIHsKLQkJWG1sTnNGb3JtIG9sZCA9IHRoaXMuZWxlbWVudEZvcm1EZWZhdWx0OwotCQl0aGlzLmVsZW1lbnRGb3JtRGVmYXVsdCA9IGVsZW1lbnRGb3JtRGVmYXVsdDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChFTEVNRU5UX0ZPUk1fREVGQVVMVF9QUk9QRVJUWSwgb2xkLCBlbGVtZW50Rm9ybURlZmF1bHQpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVsZW1lbnRGb3JtRGVmYXVsdFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEVMRU1FTlRfRk9STV9ERUZBVUxUX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGxvY2F0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5sb2NhdGlvbiwgbG9jYXRpb24pKSB7Ci0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCQl0aGlzLmxvY2F0aW9uQWRhcHRlci5zZXRWYWx1ZShsb2NhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRMb2NhdGlvbihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbkFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jTG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmxvY2F0aW9uOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTE9DQVRJT05fUFJPUEVSVFksIG9sZCwgbG9jYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldExvY2F0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTE9DQVRJT05fQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogbmFtZXNwYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lc3BhY2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2UpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVTUEFDRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZXNwYWNlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXMoTkFNRVNQQUNFX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogeG1sbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8WG1sTnNBbm5vdGF0aW9uPiBnZXRYbWxucygpIHsKLQkJcmV0dXJuIHRoaXMueG1sbnNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRYbWxuc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbG5zQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQkKLQlwdWJsaWMgWG1sTnNBbm5vdGF0aW9uIHhtbG5zQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnhtbG5zQ29udGFpbmVyLm5lc3RlZEFubm90YXRpb25BdChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBYbWxOc0Fubm90YXRpb24gYWRkWG1sbnMoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnhtbG5zQ29udGFpbmVyLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQlwcml2YXRlIFhtbE5zQW5ub3RhdGlvbiBidWlsZFhtbG5zKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbE5zQW5ub3RhdGlvbigKLQkJCQl0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkWG1sbnNJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOwotCX0KLQkKLQlwcml2YXRlIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkWG1sbnNJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQl0aGlzLmRhYSwgSkFYQi5YTUxfU0NIRU1BX19YTUxOUywgaW5kZXgsIEpBWEIuWE1MX05TKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgbW92ZVhtbG5zKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMueG1sbnNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sbnMoaW50IGluZGV4KSB7Ci0JCXRoaXMueG1sbnNDb250YWluZXIucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgeG1sIHNjaGVtYSdzIHhtbG5zCi0JICovCi0JY2xhc3MgWG1sbnNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQlleHRlbmRzIEFubm90YXRpb25Db250YWluZXI8WG1sTnNBbm5vdGF0aW9uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbnNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gWE1MTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBKQVhCLlhNTF9TQ0hFTUFfX1hNTE5TOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpBWEIuWE1MX05TOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sTnNBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VYbWxTY2hlbWFBbm5vdGF0aW9uLnRoaXMuYnVpbGRYbWxucyhpbmRleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sU2NoZW1hVHlwZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFkNmE3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUKLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfU0NIRU1BX1RZUEVTKTsKLQkKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0eXBlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZTsKLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGU7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYnVpbGRTb3VyY2VYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgCi0JCQlpbnQgaW5kZXgpIHsKLQkJCi0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZFhtbFNjaGVtYVR5cGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IGJ1aWxkWG1sU2NoZW1hVHlwZUFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJYW5ub3RhdGVkRWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQkKLQlwcml2YXRlIFNvdXJjZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLAotCQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCQotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZE5hbWVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGROYW1lc3BhY2VBZGFwdGVyKGRhYSk7Ci0JCXRoaXMubmFtZXNwYWNlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFR5cGVBZGFwdGVyKGRhYSk7Ci0JCXRoaXMudHlwZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMudHlwZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYWEsIEpBWEIuWE1MX1NDSEVNQV9UWVBFX19OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZXNwYWNlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoZGFhLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRV9fTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVHlwZUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGRhYSwgSkFYQi5YTUxfU0NIRU1BX1RZUEVfX1RZUEUsIAotCQkJCVNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcigKLQkJCURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgCi0JCQlFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCQotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KAotCQkJCWFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfU0NIRU1BX1RZUEU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gYnVpbGROYW1lKGFzdFJvb3QpOwotCQl0aGlzLm5hbWVzcGFjZSA9IGJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpOwotCQl0aGlzLnR5cGUgPSBidWlsZFR5cGUoYXN0Um9vdCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlID0gYnVpbGRGdWxseVF1YWxpZmllZFR5cGUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzeW5jTmFtZShidWlsZE5hbWUoYXN0Um9vdCkpOwotCQlzeW5jTmFtZXNwYWNlKGJ1aWxkTmFtZXNwYWNlKGFzdFJvb3QpKTsKLQkJc3luY1R5cGUoYnVpbGRUeXBlKGFzdFJvb3QpKTsKLQkJc3luY0Z1bGx5UXVhbGlmaWVkVHlwZShidWlsZEZ1bGx5UXVhbGlmaWVkVHlwZShhc3RSb290KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogWG1sU2NoZW1hVHlwZUFubm90YXRpb24gaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jTmFtZShTdHJpbmcgYXN0TmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBhc3ROYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3ROYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQkvLyAqKioqKiBuYW1lc3BhY2UKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lc3BhY2UoU3RyaW5nIGFzdE5hbWVzcGFjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lc3BhY2U7Ci0JCXRoaXMubmFtZXNwYWNlID0gYXN0TmFtZXNwYWNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRVNQQUNFX1BST1BFUlRZLCBvbGQsIGFzdE5hbWVzcGFjZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZXNwYWNlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5uYW1lc3BhY2VEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZXNwYWNlRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHR5cGUKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudHlwZSwgdHlwZSkpIHsKLQkJCXRoaXMudHlwZSA9IHR5cGU7Ci0JCQl0aGlzLnR5cGVBZGFwdGVyLnNldFZhbHVlKHR5cGUpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzeW5jVHlwZShTdHJpbmcgYXN0VHlwZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50eXBlOwotCQl0aGlzLnR5cGUgPSBhc3RUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3RUeXBlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnR5cGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY0Z1bGx5UXVhbGlmaWVkVHlwZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFR5cGU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRUeXBlID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UWVBFX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkVHlwZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gKHRoaXMudHlwZSA9PSBudWxsKSA/IG51bGwgOiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudHlwZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCQotCQotCS8vKioqKioqKioqKiogTmVzdGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBjb252ZW5pZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QgZnJvbSBOZXN0YWJsZUFubm90YXRpb24gaW50ZXJmYWNlCi0JICogZm9yIHN1YmNsYXNzZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBtb3ZlQW5ub3RhdGlvbihpbnQgbmV3SW5kZXgpIHsKLQkJdGhpcy5nZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKS5tb3ZlQW5ub3RhdGlvbihuZXdJbmRleCk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGdldEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIChJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIpIHRoaXMuYW5ub3RhdGlvbkFkYXB0ZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkWG1sU2NoZW1hVHlwZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sU2VlQWxzb0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFNlZUFsc29Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGU1MDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sU2VlQWxzb0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTZWVBbHNvQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc28KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbFNlZUFsc29Bbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFNlZUFsc29Bbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfU0VFX0FMU08pOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IHZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiB2YWx1ZUFkYXB0ZXI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBjbGFzc2VzOwotCQotCS8qCi0JICogV2Ugd2FudCB0aGlzIGV2ZW50IGZpcmVkIHdoZW4gdGhlIGZxIGNsYXNzZXMgY2hhbmdlIGJ5IHRoZW1zZWx2ZXMsIG5vdCBhcyBhIHJlc3VsdAotCSAqIG9mIHRoZSB2YWx1ZSBjaGFuZ2luZy4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3NGUUNsYXNzZXNFdmVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCQotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gZnVsbHlRdWFsaWZpZWRDbGFzc2VzOwotCQotCQotCXB1YmxpYyBTb3VyY2VYbWxTZWVBbHNvQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKQVhCLlhNTF9TRUVfQUxTT19fVkFMVUUpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcih0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5jbGFzc2VzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc2VzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JfQotCQotCQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1NFRV9BTFNPOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWZvciAoU3RyaW5nIGFzdENsYXNzIDogdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpIHsKLQkJCXRoaXMuY2xhc3Nlcy5hZGQoYXN0Q2xhc3MpOwotCQl9Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5mdWxseVF1YWxpZmllZENsYXNzZXMsIGJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc2VzKGFzdFJvb3QpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZ1tdIGFzdENsYXNzZXMgPSB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJc3luY2hyb25pemVMaXN0KEFycmF5cy5hc0xpc3QoYXN0Q2xhc3NlcyksIHRoaXMuY2xhc3NlcywgQ0xBU1NFU19MSVNUKTsKLQkJCi0JCWlmICh0aGlzLnN1cHByZXNzRlFDbGFzc2VzRXZlbnROb3RpZmljYXRpb24pIHsKLQkJCXRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc2VzLmNsZWFyKCk7Ci0JCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc2VzLCBidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3Nlcyhhc3RSb290KSk7Ci0JCQl0aGlzLnN1cHByZXNzRlFDbGFzc2VzRXZlbnROb3RpZmljYXRpb24gPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXN5bmNocm9uaXplTGlzdChidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3Nlcyhhc3RSb290KSwgdGhpcy5mdWxseVF1YWxpZmllZENsYXNzZXMsIEZVTExZX1FVQUxJRklFRF9DTEFTU0VTX0xJU1QpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc2VzKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24oYXN0Um9vdCk7Ci0JCWlmIChleHByZXNzaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQkJfQotCQlpZiAoZXhwcmVzc2lvbi5nZXROb2RlVHlwZSgpID09IEFTVE5vZGUuVFlQRV9MSVRFUkFMKSB7Ci0JCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUoZXhwcmVzc2lvbikpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWVzKGV4cHJlc3Npb24pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY2xhc3Nlcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogWG1sU2VlQWxzb0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCS8vICoqKioqIGNsYXNzZXMKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmNsYXNzZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldENsYXNzZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc2VzLnNpemUoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkQ2xhc3MoU3RyaW5nIGNsYXp6KSB7Ci0JCXRoaXMuYWRkQ2xhc3ModGhpcy5jbGFzc2VzLnNpemUoKSwgY2xhenopOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eikgewotCQl0aGlzLmNsYXNzZXMuYWRkKGluZGV4LCBjbGF6eik7Ci0JCXRoaXMuc3VwcHJlc3NGUUNsYXNzZXNFdmVudE5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCXRoaXMud3JpdGVDbGFzc2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVDbGFzcyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlDb2xsZWN0aW9uVG9vbHMubW92ZSh0aGlzLmNsYXNzZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuc3VwcHJlc3NGUUNsYXNzZXNFdmVudE5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCXRoaXMud3JpdGVDbGFzc2VzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZUNsYXNzKGludCBpbmRleCkgewotCQl0aGlzLmNsYXNzZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5zdXBwcmVzc0ZRQ2xhc3Nlc0V2ZW50Tm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJdGhpcy53cml0ZUNsYXNzZXMoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3Nlcyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB3cml0ZUNsYXNzZXMoKSB7Ci0JCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHRoaXMuY2xhc3Nlcy50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5jbGFzc2VzLnNpemUoKV0pKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JUeXBlcygpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZ1tdPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgY29udmVydGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMTdiODMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2llbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxUcmFuc2llbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBYbWxUcmFuc2llbnRBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0KLQlwdWJsaWMgU291cmNlWG1sVHJhbnNpZW50QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFJBTlNJRU5UOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHlwZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFR5cGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTY5YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSW5kZXhlZENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHlwZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VYbWxUeXBlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVHlwZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSkFYQi5YTUxfVFlQRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZBQ1RPUllfQ0xBU1NfQURBUFRFUiA9IGJ1aWxkRmFjdG9yeUNsYXNzQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmFjdG9yeUNsYXNzQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBmYWN0b3J5Q2xhc3M7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGQUNUT1JZX01FVEhPRF9BREFQVEVSID0gYnVpbGRGYWN0b3J5TWV0aG9kQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmFjdG9yeU1ldGhvZEFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZmFjdG9yeU1ldGhvZDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGROYW1lQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRVNQQUNFX0FEQVBURVIgPSBidWlsZE5hbWVzcGFjZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVzcGFjZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZXNwYWNlOwotCi0JcHJpdmF0ZSBmaW5hbCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBwcm9wT3JkZXJEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IHByb3BPcmRlckFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiBwcm9wT3JkZXIgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxUeXBlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5mYWN0b3J5Q2xhc3NBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihGQUNUT1JZX0NMQVNTX0FEQVBURVIpOwotCQl0aGlzLmZhY3RvcnlNZXRob2RBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihGQUNUT1JZX01FVEhPRF9BREFQVEVSKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTkFNRV9BREFQVEVSKTsKLQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyID0gdGhpcy5idWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihOQU1FU1BBQ0VfQURBUFRFUik7Ci0JCXRoaXMucHJvcE9yZGVyRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1RZUEVfX1BST1BfT1JERVIpOwotCQl0aGlzLnByb3BPcmRlckFkYXB0ZXIgPSB0aGlzLmJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5wcm9wT3JkZXJEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXIuZm9yU3RyaW5ncygpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgSW5kZXhlZEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBJbmRleGVkQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSkFYQi5YTUxfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuZmFjdG9yeUNsYXNzID0gdGhpcy5idWlsZEZhY3RvcnlDbGFzcyhhc3RSb290KTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKGFzdFJvb3QpOwotCQl0aGlzLmZhY3RvcnlNZXRob2QgPSB0aGlzLmJ1aWxkRmFjdG9yeU1ldGhvZChhc3RSb290KTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMubmFtZXNwYWNlID0gdGhpcy5idWlsZE5hbWVzcGFjZShhc3RSb290KTsKLQkJdGhpcy5pbml0aWFsaXplUHJvcE9yZGVyKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNGYWN0b3J5Q2xhc3ModGhpcy5idWlsZEZhY3RvcnlDbGFzcyhhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Z1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jRmFjdG9yeU1ldGhvZCh0aGlzLmJ1aWxkRmFjdG9yeU1ldGhvZChhc3RSb290KSk7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNOYW1lc3BhY2UodGhpcy5idWlsZE5hbWVzcGFjZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1Byb3BPcmRlcihhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxUeXBlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBmYWN0b3J5Q2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeUNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZhY3RvcnlDbGFzcyhTdHJpbmcgZmFjdG9yeUNsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmZhY3RvcnlDbGFzcywgZmFjdG9yeUNsYXNzKSkgewotCQkJdGhpcy5mYWN0b3J5Q2xhc3MgPSBmYWN0b3J5Q2xhc3M7Ci0JCQl0aGlzLmZhY3RvcnlDbGFzc0FkYXB0ZXIuc2V0VmFsdWUoZmFjdG9yeUNsYXNzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRmFjdG9yeUNsYXNzKFN0cmluZyBhc3RGYWN0b3J5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZmFjdG9yeUNsYXNzOwotCQl0aGlzLmZhY3RvcnlDbGFzcyA9IGFzdEZhY3RvcnlDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZBQ1RPUllfQ0xBU1NfUFJPUEVSVFksIG9sZCwgYXN0RmFjdG9yeUNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZhY3RvcnlDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5Q2xhc3NBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmFjdG9yeUNsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoRkFDVE9SWV9DTEFTU19BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfRkFDVE9SWV9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiAodGhpcy5mYWN0b3J5Q2xhc3MgPT0gbnVsbCkgPyBudWxsIDogQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLmZhY3RvcnlDbGFzc0FkYXB0ZXIuZ2V0RXhwcmVzc2lvbihhc3RSb290KSk7Ci0JfQotCi0JLy8gKioqKiogZmFjdG9yeU1ldGhvZAotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeU1ldGhvZCgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeU1ldGhvZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGYWN0b3J5TWV0aG9kKFN0cmluZyBmYWN0b3J5TWV0aG9kKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmZhY3RvcnlNZXRob2QsIGZhY3RvcnlNZXRob2QpKSB7Ci0JCQl0aGlzLmZhY3RvcnlNZXRob2QgPSBmYWN0b3J5TWV0aG9kOwotCQkJdGhpcy5mYWN0b3J5TWV0aG9kQWRhcHRlci5zZXRWYWx1ZShmYWN0b3J5TWV0aG9kKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jRmFjdG9yeU1ldGhvZChTdHJpbmcgYXN0RmFjdG9yeU1ldGhvZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mYWN0b3J5TWV0aG9kOwotCQl0aGlzLmZhY3RvcnlNZXRob2QgPSBhc3RGYWN0b3J5TWV0aG9kOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkFDVE9SWV9NRVRIT0RfUFJPUEVSVFksIG9sZCwgYXN0RmFjdG9yeU1ldGhvZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGYWN0b3J5TWV0aG9kKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmZhY3RvcnlNZXRob2RBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmFjdG9yeU1ldGhvZFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEZBQ1RPUllfTUVUSE9EX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKE5BTUVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbmFtZXNwYWNlCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lc3BhY2UsIG5hbWVzcGFjZSkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2VBZGFwdGVyLnNldFZhbHVlKG5hbWVzcGFjZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWVzcGFjZShTdHJpbmcgYXN0TmFtZXNwYWNlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBhc3ROYW1lc3BhY2U7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FU1BBQ0VfUFJPUEVSVFksIG9sZCwgYXN0TmFtZXNwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWVzcGFjZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZXNwYWNlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTkFNRVNQQUNFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBuYW1lc3BhY2VUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyhOQU1FU1BBQ0VfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogcHJvcCBvcmRlciAqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRQcm9wT3JkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy5wcm9wT3JkZXIpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFByb3BPcmRlclNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BPcmRlci5zaXplKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFByb3AoU3RyaW5nIHByb3ApIHsKLQkJdGhpcy5hZGRQcm9wKHRoaXMucHJvcE9yZGVyLnNpemUoKSwgcHJvcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFByb3AoaW50IGluZGV4LCBTdHJpbmcgcHJvcCkgewotCQl0aGlzLnByb3BPcmRlci5hZGQoaW5kZXgsIHByb3ApOwotCQl0aGlzLndyaXRlUHJvcE9yZGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVByb3AoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJQ29sbGVjdGlvblRvb2xzLm1vdmUodGhpcy5wcm9wT3JkZXIsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMud3JpdGVQcm9wT3JkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wKFN0cmluZyBwcm9wKSB7Ci0JCXRoaXMucHJvcE9yZGVyLnJlbW92ZShwcm9wKTsKLQkJdGhpcy53cml0ZVByb3BPcmRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KSB7Ci0JCXRoaXMucHJvcE9yZGVyLnJlbW92ZShpbmRleCk7Ci0JCXRoaXMud3JpdGVQcm9wT3JkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVQcm9wT3JkZXIoKSB7Ci0JCXRoaXMucHJvcE9yZGVyQWRhcHRlci5zZXRWYWx1ZSh0aGlzLnByb3BPcmRlci50b0FycmF5KG5ldyBTdHJpbmdbdGhpcy5wcm9wT3JkZXIuc2l6ZSgpXSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJvcE9yZGVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZ1tdIGFzdFByb3BPcmRlciA9IHRoaXMucHJvcE9yZGVyQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhc3RQcm9wT3JkZXIubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMucHJvcE9yZGVyLmFkZChhc3RQcm9wT3JkZXJbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQcm9wT3JkZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nW10gYXN0UHJvcE9yZGVyID0gdGhpcy5wcm9wT3JkZXJBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNocm9uaXplTGlzdChBcnJheXMuYXNMaXN0KGFzdFByb3BPcmRlciksIHRoaXMucHJvcE9yZGVyLCBQUk9QX09SREVSX0xJU1QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByb3BPcmRlclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnByb3BPcmRlckRlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3BPcmRlclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMucHJvcE9yZGVyRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByb3BUZXh0UmFuZ2UoaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZShnZXRBbm5vdGF0aW9uRWxlbWVudFN1YnZhbHVlVGV4dFJhbmdlKHRoaXMucHJvcE9yZGVyRGVjbGFyYXRpb25BZGFwdGVyLCBpbmRleCwgYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm9wVG91Y2hlcyhpbnQgaW5kZXgsIGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0ZXh0UmFuZ2VUb3VjaGVzKGdldEFubm90YXRpb25FbGVtZW50U3VidmFsdWVUZXh0UmFuZ2UodGhpcy5wcm9wT3JkZXJEZWNsYXJhdGlvbkFkYXB0ZXIsIGluZGV4LCBhc3RSb290KSwgcG9zKTsKLQl9Ci0JCi0JCi0JLy8qKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRmFjdG9yeUNsYXNzQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfVFlQRV9fRkFDVE9SWV9DTEFTUywgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0Jc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lLCBFeHByZXNzaW9uQ29udmVydGVyPFN0cmluZz4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGYWN0b3J5TWV0aG9kQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfVFlQRV9fRkFDVE9SWV9NRVRIT0QpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSkFYQi5YTUxfVFlQRV9fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVzcGFjZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpBWEIuWE1MX1RZUEVfX05BTUVTUEFDRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmNWQ0NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZVhtbFZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgWG1sVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpBWEIuWE1MX1ZBTFVFKTsKLQotCXB1YmxpYyBTb3VyY2VYbWxWYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpBWEIuWE1MX1ZBTFVFOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy9uby1vcAotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvL25vLW9wCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YmluZGV4L0pheGJJbmRleFJlc291cmNlSW1wbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YmluZGV4L0pheGJJbmRleFJlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQxMzM1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJpbmRleC9KYXhiSW5kZXhSZXNvdXJjZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF4YmluZGV4OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkluZGV4UmVzb3VyY2VJbXBsCi0JCWltcGxlbWVudHMgSmF4YkluZGV4UmVzb3VyY2UgewotCQotCXByb3RlY3RlZCBmaW5hbCBMaXN0ZW5lckxpc3Q8SnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyPiByZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0ID0KLQkJCW5ldyBMaXN0ZW5lckxpc3Q8SnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyPihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIuY2xhc3MpOwotCQotCQotCXByb3RlY3RlZCBJRmlsZSBmaWxlOwotCQotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnZU5hbWU7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3Q8U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCi0JCi0JcHVibGljIEpheGJJbmRleFJlc291cmNlSW1wbChJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbGUgY2Fubm90IGJlIG51bGwiKTsKLQkJfQotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLnBhY2thZ2VOYW1lID0gYnVpbGRQYWNrYWdlTmFtZSgpOwotCQlidWlsZENsYXNzTmFtZXMoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFBhY2thZ2VOYW1lKCkgewotCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSBKYXZhQ29yZS5jcmVhdGUodGhpcy5maWxlLmdldFBhcmVudCgpKTsKLQkJaWYgKGphdmFFbGVtZW50ICE9IG51bGwgJiYgamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCkgewotCQkJcmV0dXJuICgoSVBhY2thZ2VGcmFnbWVudCkgamF2YUVsZW1lbnQpLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBidWlsZENsYXNzTmFtZXMoKSB7Ci0JCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQotCQl0cnkgewotCQkJc3RyZWFtID0gZmlsZS5nZXRDb250ZW50cygpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3RyZWFtKSk7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2xhc3NOYW1lID0gbGluZS50cmltKCk7Ci0JCQkJCXRoaXMuY2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGlvZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnBhY2thZ2VOYW1lOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKSB7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0JCWZpbmFsIFN0cmluZyBwYWNrYWdlUHJlZml4ID0gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwYWNrYWdlTmFtZSkgPyAiIiA6IHBhY2thZ2VOYW1lICsgIi4iOwotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KAotCQkJCW5ldyBTbmFwc2hvdENsb25lSXRlcmFibGU8U3RyaW5nPih0aGlzLmNsYXNzTmFtZXMpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBzaG9ydENsYXNzTmFtZSkgewotCQkJCXJldHVybiBwYWNrYWdlUHJlZml4ICsgc2hvcnRDbGFzc05hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgdXBkYXRlKCkgewotCQl0aGlzLmNsYXNzTmFtZXMuY2xlYXIoKTsKLQkJYnVpbGRDbGFzc05hbWVzKCk7Ci0JCXJlc291cmNlTW9kZWxDaGFuZ2VkKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSnB0UmVzb3VyY2VNb2RlbCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX0lOREVYX1JFU09VUkNFX1RZUEU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZFJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlc291cmNlTW9kZWxDaGFuZ2VkKCkgewotCQlmb3IgKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJbGlzdGVuZXIucmVzb3VyY2VNb2RlbENoYW5nZWQodGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXhiaW5kZXgvSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXhiaW5kZXgvSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNjAwNzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YmluZGV4L0pheGJJbmRleFJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhiaW5kZXg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF4YmluZGV4LkpheGJJbmRleFJlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SUZpbGUsIEpheGJJbmRleFJlc291cmNlSW1wbD4gbW9kZWxzID0gbmV3IEhhc2hNYXA8SUZpbGUsIEpheGJJbmRleFJlc291cmNlSW1wbD4oKTsKLQkKLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEpheGJJbmRleFJlc291cmNlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gYnVpbGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CQotCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzb3VyY2VDaGFuZ2VFdmVudChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX0lOREVYX0NPTlRFTlRfVFlQRTsKLQl9Ci0JCi0JcHVibGljIEpwdFJlc291cmNlTW9kZWwgYnVpbGRSZXNvdXJjZU1vZGVsKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBidWlsZFJlc291cmNlTW9kZWwoZmlsZSk7Ci0JfQotCQotCXB1YmxpYyBKYXhiSW5kZXhSZXNvdXJjZSBidWlsZFJlc291cmNlTW9kZWwoSUZpbGUgZmlsZSkgewotCQlKYXhiSW5kZXhSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSB0aGlzLm1vZGVscy5nZXQoZmlsZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmVzb3VyY2UgPSBuZXcgSmF4YkluZGV4UmVzb3VyY2VJbXBsKGZpbGUpOwotCQl0aGlzLm1vZGVscy5wdXQoZmlsZSwgcmVzb3VyY2UpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJlc291cmNlQ2hhbmdlRXZlbnQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIDoKLQkJCWNhc2UgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSA6Ci0JCQkJcmVtb3ZlUHJvamVjdFJlc291cmNlcygoSVByb2plY3QpIGV2ZW50LmdldFJlc291cmNlKCkpOwotCQkJCXJldHVybjsKLQkJCQotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6Ci0JCQkJdXBkYXRlUmVzb3VyY2VzKGV2ZW50LmdldERlbHRhKCkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb2plY3RSZXNvdXJjZXMoSVByb2plY3QgcmVtb3ZlZFByb2plY3QpIHsKLQkJZm9yIChJRmlsZSBmaWxlIDogbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxJRmlsZT4odGhpcy5tb2RlbHMua2V5U2V0KCkpKSB7Ci0JCQlpZiAoZmlsZS5nZXRQcm9qZWN0KCkuZXF1YWxzKHJlbW92ZWRQcm9qZWN0KSkgewotCQkJCXJlbW92ZVJlc291cmNlKGZpbGUpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc291cmNlcyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0cnkgewotCQkJZGVsdGEuYWNjZXB0KG5ldyBSZXNvdXJjZURlbHRhVmlzaXRvcigpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbgotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCXRoaXMubW9kZWxzLnJlbW92ZShmaWxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlKYXhiSW5kZXhSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSB0aGlzLm1vZGVscy5nZXQoZmlsZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZS51cGRhdGUoKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IKLQkJCWltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCXN3aXRjaCAocmVzLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCWZpbGVDaGFuZ2VkKChJRmlsZSkgcmVzLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbiAocHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLi4uKQotCQkJfQotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBmaWxlQ2hhbmdlZChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCQlpZiAoZGVsdGFLaW5kID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQlKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIudGhpcy5yZW1vdmVSZXNvdXJjZShmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGRlbHRhS2luZCA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJSmF4YkluZGV4UmVzb3VyY2VNb2RlbFByb3ZpZGVyLnRoaXMudXBkYXRlUmVzb3VyY2UoZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXhicHJvcHMvSmF4YlByb3BlcnRpZXNSZXNvdXJjZUltcGwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2EzMDg5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXhicHJvcHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJwcm9wcy5KYXhiUHJvcGVydGllc1Jlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbAotCWltcGxlbWVudHMgSmF4YlByb3BlcnRpZXNSZXNvdXJjZQotewotCXByb3RlY3RlZCBmaW5hbCBJRmlsZSBmaWxlOwotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZTsKLQotCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPQotCQkJbmV3IExpc3RlbmVyTGlzdDxKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI+KEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lci5jbGFzcyk7Ci0KLQotCXB1YmxpYyBKYXhiUHJvcGVydGllc1Jlc291cmNlSW1wbChJRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCXRoaXMucGFja2FnZU5hbWUgPSB0aGlzLmJ1aWxkUGFja2FnZU5hbWUoKTsKLQkJdGhpcy5sb2FkUHJvcGVydGllcygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRQYWNrYWdlTmFtZSgpIHsKLQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gSmF2YUNvcmUuY3JlYXRlKHRoaXMuZmlsZS5nZXRQYXJlbnQoKSk7Ci0JCWlmICgoamF2YUVsZW1lbnQgIT0gbnVsbCkgJiYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpKSB7Ci0JCQlyZXR1cm4gKChJUGFja2FnZUZyYWdtZW50KSBqYXZhRWxlbWVudCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWxvYWRQcm9wZXJ0aWVzKCkgewotCQl0aGlzLnByb3BlcnRpZXMuY2xlYXIoKTsKLQkJdGhpcy5sb2FkUHJvcGVydGllcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGxvYWRQcm9wZXJ0aWVzKCkgewotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJc3RyZWFtID0gdGhpcy5maWxlLmdldENvbnRlbnRzKCk7Ci0JCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCQl0aGlzLnByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmNsb3NlU3RyZWFtKHN0cmVhbSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVN0cmVhbShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWlmIChzdHJlYW0gIT0gbnVsbCkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlKCkgewotCQl0aGlzLnJlbG9hZFByb3BlcnRpZXMoKTsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsQ2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnBhY2thZ2VOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwdFJlc291cmNlTW9kZWwgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX1BST1BFUlRJRVNfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVJlc291cmNlTW9kZWxMaXN0ZW5lcihKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoKSB7Ci0JCWZvciAoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsQ2hhbmdlZCh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YnByb3BzL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYjJlNzIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF4YnByb3BzL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJwcm9wczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHMuSmF4YlByb3BlcnRpZXNSZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBNYXA8SUZpbGUsIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VJbXBsPiBtb2RlbHMgPSBuZXcgSGFzaE1hcDxJRmlsZSwgSmF4YlByb3BlcnRpZXNSZXNvdXJjZUltcGw+KCk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciByZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5yZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gYnVpbGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBidWlsZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKSB7CQotCQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlUmVzb3VyY2VDaGFuZ2VFdmVudChldmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5KQVhCX1BST1BFUlRJRVNfQ09OVEVOVF9UWVBFOwotCX0KLQkKLQlwdWJsaWMgSnB0UmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSmF4YlByb2plY3QgamF4YlByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGJ1aWxkUmVzb3VyY2VNb2RlbChmaWxlKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2UgYnVpbGRSZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUpIHsKLQkJSmF4YlByb3BlcnRpZXNSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSB0aGlzLm1vZGVscy5nZXQoZmlsZSk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb3VyY2U7Ci0JCX0KLQkJcmVzb3VyY2UgPSBuZXcgSmF4YlByb3BlcnRpZXNSZXNvdXJjZUltcGwoZmlsZSk7Ci0JCXRoaXMubW9kZWxzLnB1dChmaWxlLCByZXNvdXJjZSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVzb3VyY2VDaGFuZ2VFdmVudChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOgotCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIDoKLQkJCQlyZW1vdmVQcm9qZWN0UmVzb3VyY2VzKChJUHJvamVjdCkgZXZlbnQuZ2V0UmVzb3VyY2UoKSk7Ci0JCQkJcmV0dXJuOwotCQkJCi0JCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIDoKLQkJCQl1cGRhdGVSZXNvdXJjZXMoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvamVjdFJlc291cmNlcyhJUHJvamVjdCByZW1vdmVkUHJvamVjdCkgewotCQlmb3IgKElGaWxlIGZpbGUgOiBuZXcgU25hcHNob3RDbG9uZUl0ZXJhYmxlPElGaWxlPih0aGlzLm1vZGVscy5rZXlTZXQoKSkpIHsKLQkJCWlmIChmaWxlLmdldFByb2plY3QoKS5lcXVhbHMocmVtb3ZlZFByb2plY3QpKSB7Ci0JCQkJcmVtb3ZlUmVzb3VyY2UoZmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUmVzb3VyY2VzKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCXRyeSB7Ci0JCQlkZWx0YS5hY2NlcHQobmV3IFJlc291cmNlRGVsdGFWaXNpdG9yKCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlc291cmNlKElGaWxlIGZpbGUpIHsKLQkJdGhpcy5tb2RlbHMucmVtb3ZlKGZpbGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvdXJjZShJRmlsZSBmaWxlKSB7Ci0JCUpheGJQcm9wZXJ0aWVzUmVzb3VyY2VJbXBsIHJlc291cmNlID0gdGhpcy5tb2RlbHMuZ2V0KGZpbGUpOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmVzb3VyY2UudXBkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlRGVsdGFWaXNpdG9yCi0JCQlpbXBsZW1lbnRzIElSZXNvdXJjZURlbHRhVmlzaXRvciB7Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlzd2l0Y2ggKHJlcy5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQlmaWxlQ2hhbmdlZCgoSUZpbGUpIHJlcywgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4gKHByb2JhYmx5IHNob3VsZG4ndCBnZXQgaGVyZS4uLikKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgZmlsZUNoYW5nZWQoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgewotCQkJaWYgKGRlbHRhS2luZCA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIudGhpcy5yZW1vdmVSZXNvdXJjZShmaWxlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGRlbHRhS2luZCA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEKSB7Ci0JCQkJSmF4YlByb3BlcnRpZXNSZXNvdXJjZU1vZGVsUHJvdmlkZXIudGhpcy51cGRhdGVSZXNvdXJjZShmaWxlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0YzQ0N2YuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0VmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBERUZBVUxUX1BBUk1TID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIHN0YXRpYyBUZXh0UmFuZ2UgREVGQVVMVF9URVhUX1JBTkdFID0gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKAotCQkJaW50IGRlZmF1bHRTZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgcGFybXMsIHRhcmdldE9iamVjdCwgREVGQVVMVF9URVhUX1JBTkdFKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2UoZGVmYXVsdFNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCwgdGV4dFJhbmdlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldE9iamVjdCwgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQkKLQkJLy9kZXRlcm1pbmUgd2hldGhlciBkZWZhdWx0IHNldmVyaXR5IHNob3VsZCBiZSBvdmVycmlkZGVuCi0JCWludCBzZXZlcml0eSA9IGRlZmF1bHRTZXZlcml0eTsKLQkJCi0JCS8vIFRPRE8gLSB1c2VyIG92ZXJyaWRlIG9mIGVycm9ycy93YXJuaW5ncwotLy8JCWludCBzZXZlcml0eVByZWZlcmVuY2UgPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuZ2V0UHJvYmxlbVNldmVyaXR5UHJlZmVyZW5jZSh0YXJnZXRPYmplY3QsIG1lc3NhZ2VJZCk7Ci0vLwkJaWYgKHNldmVyaXR5UHJlZmVyZW5jZSAhPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTk9fU0VWRVJJVFlfUFJFRkVSRU5DRSl7Ci0vLwkJCXNldmVyaXR5ID0gc2V2ZXJpdHlQcmVmZXJlbmNlOwotLy8JCX0KLQkJCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTWVzc2FnZShKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0KTsKLQkJbWVzc2FnZS5zZXRNYXJrZXJJZChKcHRKYXhiQ29yZVBsdWdpbi5WQUxJREFUSU9OX01BUktFUl9JRCk7Ci0JCQotCQlpZiAodGV4dFJhbmdlID09IG51bGwpIHsKLQkJCS8vbG9nIGFuIGV4Y2VwdGlvbiBhbmQgdGhlbiBjb250aW51ZSB3aXRob3V0IHNldHRpbmcgbG9jYXRpb24gaW5mb3JtYXRpb24KLQkJCS8vQXQgbGVhc3QgdGhlIHVzZXIgd2lsbCBzdGlsbCBnZXQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSBhbmQgd2lsbAotCQkJLy9iZSBhYmxlIHRvIHNlZSBvdGhlciB2YWxpZGF0aW9uIG1lc3NhZ2VzIHdpdGggdmFsaWQgdGV4dFJhbmdlcwotCQkJSnB0SmF4YkNvcmVQbHVnaW4ubG9nKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgdGV4dCByYW5nZSBmb3IgbWVzc2FnZSBJRDogIiArIG1lc3NhZ2VJZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQltZXNzYWdlLnNldExpbmVObyh0ZXh0UmFuZ2UuZ2V0TGluZU51bWJlcigpKTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQkKLQkKLQlwcml2YXRlIERlZmF1bHRWYWxpZGF0aW9uTWVzc2FnZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNjg3YTkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQkKLQkvLyBidW5kbGUgbmFtZQotCVN0cmluZyBCVU5ETEVfTkFNRSA9ICJqYXhiX3ZhbGlkYXRpb24iOwotCQotCS8vIHZhbGlkYXRpb24gb24gcHJvamVjdAotCQotCVN0cmluZyBOT19KQVhCX1BST0pFQ1QgPSAiTk9fSkFYQl9QUk9KRUNUIjsgCi0JU3RyaW5nIFBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSID0gIlBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSIjsKLQlTdHJpbmcgUFJPSkVDVF9fVU5SRVNPTFZFRF9TQ0hFTUEgPSAiUFJPSkVDVF9fVU5SRVNPTFZFRF9TQ0hFTUEiOwotCVN0cmluZyBQUk9KRUNUX19EVVBMSUNBVEVfTkFNRVNQQUNFID0gIlBST0pFQ1RfX0RVUExJQ0FURV9OQU1FU1BBQ0UiOwotCQotCQotCS8vIHZhbGlkYXRpb24gb24gcGFja2FnZQotCQotCVN0cmluZyBQQUNLQUdFX05PX1NDSEVNQV9GT1JfTkFNRVNQQUNFID0gIlBBQ0tBR0VfTk9fU0NIRU1BX0ZPUl9OQU1FU1BBQ0UiOwotCVN0cmluZyBQQUNLQUdFX1hNTF9KQVZBX1RZUEVfQURBUFRFUl9UWVBFX05PVF9TUEVDSUZJRUQgPSAiUEFDS0FHRV9YTUxfSkFWQV9UWVBFX0FEQVBURVJfVFlQRV9OT1RfU1BFQ0lGSUVEIjsKLQkKLQlTdHJpbmcgWE1MX1NDSEVNQV9fTUlTTUFUQ0hFRF9BVFRSSUJVVEVfRk9STV9ERUZBVUxUID0gIlhNTF9TQ0hFTUFfX01JU01BVENIRURfQVRUUklCVVRFX0ZPUk1fREVGQVVMVCI7Ci0JU3RyaW5nIFhNTF9TQ0hFTUFfX01JU01BVENIRURfRUxFTUVOVF9GT1JNX0RFRkFVTFQgPSAiWE1MX1NDSEVNQV9fTUlTTUFUQ0hFRF9FTEVNRU5UX0ZPUk1fREVGQVVMVCI7Ci0JCi0JCi0JLy8gdmFsaWRhdGlvbiBvbiB0eXBlCi0JCi0JU3RyaW5nIFhNTF9FTlVNX19OT05fU0lNUExFX1NDSEVNQV9UWVBFID0gIlhNTF9FTlVNX19OT05fU0lNUExFX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX1RZUEVfX1VOTUFUQ0hJTkdfTkFNRVNQQUNFX0ZPUl9BTk9OWU1PVVNfVFlQRSA9ICJYTUxfVFlQRV9fVU5NQVRDSElOR19OQU1FU1BBQ0VfRk9SX0FOT05ZTU9VU19UWVBFIjsKLQlTdHJpbmcgWE1MX1RZUEVfX1VOU1BFQ0lGSUVEX0ZBQ1RPUllfTUVUSE9EID0gIlhNTF9UWVBFX19VTlNQRUNJRklFRF9GQUNUT1JZX01FVEhPRCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19OT19QVUJMSUNfT1JfUFJPVEVDVEVEX0NPTlNUUlVDVE9SID0gIlhNTF9UWVBFX19OT19QVUJMSUNfT1JfUFJPVEVDVEVEX0NPTlNUUlVDVE9SIjsKLQlTdHJpbmcgWE1MX1RZUEVfX0RVUExJQ0FURV9QUk9QID0gIlhNTF9UWVBFX19EVVBMSUNBVEVfUFJPUCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19NSVNTSU5HX1BST1AgPSAiWE1MX1RZUEVfX01JU1NJTkdfUFJPUCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19OT05FWElTVEVOVF9QUk9QID0gIlhNTF9UWVBFX19OT05FWElTVEVOVF9QUk9QIjsKLQlTdHJpbmcgWE1MX1RZUEVfX1RSQU5TSUVOVF9QUk9QID0gIlhNTF9UWVBFX19UUkFOU0lFTlRfUFJPUCI7Ci0JU3RyaW5nIFhNTF9UWVBFX19GQUNUT1JZX0NMQVNTX0lHTk9SRURfRk9SX0VOVU0gPSAiWE1MX1RZUEVfX0ZBQ1RPUllfQ0xBU1NfSUdOT1JFRF9GT1JfRU5VTSI7Ci0JU3RyaW5nIFhNTF9UWVBFX19GQUNUT1JZX01FVEhPRF9JR05PUkVEX0ZPUl9FTlVNID0gIlhNTF9UWVBFX19GQUNUT1JZX01FVEhPRF9JR05PUkVEX0ZPUl9FTlVNIjsKLQlTdHJpbmcgWE1MX1RZUEVfX1BST1BfT1JERVJfSUdOT1JFRF9GT1JfRU5VTSA9ICJYTUxfVFlQRV9fUFJPUF9PUkRFUl9JR05PUkVEX0ZPUl9FTlVNIjsKLQkKLQlTdHJpbmcgWE1MX1JPT1RfRUxFTUVOVF9UWVBFX0NPTkZMSUNUU19XSVRIX1hNTF9UWVBFID0gIlhNTF9ST09UX0VMRU1FTlRfVFlQRV9DT05GTElDVFNfV0lUSF9YTUxfVFlQRSI7Ci0JCi0JCi0JLy8gdmFsaWRhdGlvbiBvbiBlbnVtIGNvbnN0YW50IAotCQotCVN0cmluZyBYTUxfRU5VTV9WQUxVRV9fSU5WQUxJRF9MRVhJQ0FMX1ZBTFVFID0gIlhNTF9FTlVNX1ZBTFVFX19JTlZBTElEX0xFWElDQUxfVkFMVUUiOwotCQotCQotCS8vIHZhbGlkYXRpb24gb24gYXR0cmlidXRlCi0JCi0JU3RyaW5nIEFUVFJJQlVURV9NQVBQSU5HX19VTlNVUFBPUlRFRF9BTk5PVEFUSU9OID0gIkFUVFJJQlVURV9NQVBQSU5HX19VTlNVUFBPUlRFRF9BTk5PVEFUSU9OIjsKLQlTdHJpbmcgQVRUUklCVVRFX01BUFBJTkdfWE1MX0pBVkFfVFlQRV9BREFQVEVSX1RZUEVfTk9UX0RFRklORUQgPSAiQVRUUklCVVRFX01BUFBJTkdfWE1MX0pBVkFfVFlQRV9BREFQVEVSX1RZUEVfTk9UX0RFRklORUQiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX0RFRklORURfT05fTk9OX0FSUkFZX05PTl9DT0xMRUNUSU9OID0gIlhNTF9FTEVNRU5UX1dSQVBQRVJfREVGSU5FRF9PTl9OT05fQVJSQVlfTk9OX0NPTExFQ1RJT04iOwotCQotCVN0cmluZyBYTUxfQU5ZX0FUVFJJQlVURV9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCA9ICJYTUxfQU5ZX0FUVFJJQlVURV9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCI7Ci0JU3RyaW5nIFhNTF9BTllfQVRUUklCVVRFX19OT05fTUFQX1RZUEUgPSAiWE1MX0FOWV9BVFRSSUJVVEVfX05PTl9NQVBfVFlQRSI7Ci0JCi0JU3RyaW5nIFhNTF9BTllfRUxFTUVOVF9fTVVMVElQTEVfTUFQUElOR1NfREVGSU5FRCA9ICJYTUxfQU5ZX0VMRU1FTlRfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQiOwotCQotCVN0cmluZyBYTUxfQVRUUklCVVRFX19JTlZBTElEX1NDSEVNQV9UWVBFID0gIlhNTF9BVFRSSUJVVEVfX0lOVkFMSURfU0NIRU1BX1RZUEUiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9fVU5TUEVDSUZJRURfVFlQRSA9ICJYTUxfRUxFTUVOVF9fVU5TUEVDSUZJRURfVFlQRSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX19JTExFR0FMX1RZUEUgPSAiWE1MX0VMRU1FTlRfX0lMTEVHQUxfVFlQRSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX19JTlZBTElEX1NDSEVNQV9UWVBFID0gIlhNTF9FTEVNRU5UX19JTlZBTElEX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fSU5WQUxJRF9NRVRIT0RfU0lHTkFUVVJFX1JFVFVSTl9UWVBFID0gIlhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9SRVRVUk5fVFlQRSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfX0lOVkFMSURfTUVUSE9EX1NJR05BVFVSRV9QQVJBTSA9ICJYTUxfRUxFTUVOVF9ERUNMX19JTlZBTElEX01FVEhPRF9TSUdOQVRVUkVfUEFSQU0iOwotCVN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19TVUJTVF9IRUFEX05BTUVfRVFVQUxTX05BTUUgPSAiWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OQU1FX0VRVUFMU19OQU1FIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OT19NQVRDSElOR19FTEVNRU5UX0RFQ0wgPSAiWE1MX0VMRU1FTlRfREVDTF9fU1VCU1RfSEVBRF9OT19NQVRDSElOR19FTEVNRU5UX0RFQ0wiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZfX1VOU1BFQ0lGSUVEX1RZUEUgPSAiWE1MX0VMRU1FTlRfUkVGX19VTlNQRUNJRklFRF9UWVBFIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX19JTExFR0FMX1RZUEUgPSAiWE1MX0VMRU1FTlRfUkVGX19JTExFR0FMX1RZUEUiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZfX05PX1JPT1RfRUxFTUVOVCA9ICJYTUxfRUxFTUVOVF9SRUZfX05PX1JPT1RfRUxFTUVOVCI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9fTk9fUkVHSVNUUlkgPSAiWE1MX0VMRU1FTlRfUkVGX19OT19SRUdJU1RSWSI7Ci0JU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9fTk9fTUFUQ0hJTkdfRUxFTUVOVF9ERUNMID0gIlhNTF9FTEVNRU5UX1JFRl9fTk9fTUFUQ0hJTkdfRUxFTUVOVF9ERUNMIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUgPSAiWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1RZUEUiOwotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSAiWE1MX0VMRU1FTlRfUkVGU19fRFVQTElDQVRFX1hNTF9FTEVNRU5UX1FOQU1FIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfVFlQRSA9ICJYTUxfRUxFTUVOVFNfX0RVUExJQ0FURV9YTUxfRUxFTUVOVF9UWVBFIjsKLQlTdHJpbmcgWE1MX0VMRU1FTlRTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSAiWE1MX0VMRU1FTlRTX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUiOwotCQotCVN0cmluZyBYTUxfSURfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQgPSAiWE1MX0lEX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEIjsKLQlTdHJpbmcgWE1MX0lEX19BVFRSSUJVVEVfVFlQRV9OT1RfU1RSSU5HID0gIlhNTF9JRF9fQVRUUklCVVRFX1RZUEVfTk9UX1NUUklORyI7Ci0JU3RyaW5nIFhNTF9JRF9fU0NIRU1BX1RZUEVfTk9UX0lEID0gIlhNTF9JRF9fU0NIRU1BX1RZUEVfTk9UX0lEIjsKLQkKLQlTdHJpbmcgWE1MX0lEX1JFRl9fVFlQRV9ET0VTX05PVF9DT05UQUlOX1hNTF9JRCA9ICJYTUxfSURfUkVGX19UWVBFX0RPRVNfTk9UX0NPTlRBSU5fWE1MX0lEIjsKLQlTdHJpbmcgWE1MX0lEX1JFRl9fU0NIRU1BX1RZUEVfTk9UX0lEUkVGID0gIlhNTF9JRF9SRUZfX1NDSEVNQV9UWVBFX05PVF9JRFJFRiI7Ci0JCi0JU3RyaW5nIFhNTF9MSVNUX19BVFRSSUJVVEVfTk9UX0NPTExFQ1RJT05fVFlQRSA9ICJYTUxfTElTVF9fQVRUUklCVVRFX05PVF9DT0xMRUNUSU9OX1RZUEUiOwotCVN0cmluZyBYTUxfTElTVF9fSVRFTV9UWVBFX05PVF9NQVBQRURfVE9fVkFMSURfU0NIRU1BX1RZUEUgPSAiWE1MX0xJU1RfX0lURU1fVFlQRV9OT1RfTUFQUEVEX1RPX1ZBTElEX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX1JFR0lTVFJZX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUgPSAiWE1MX1JFR0lTVFJZX19EVVBMSUNBVEVfWE1MX0VMRU1FTlRfUU5BTUUiOwotCQotCVN0cmluZyBYTUxfVkFMVUVfX01VTFRJUExFX01BUFBJTkdTX0RFRklORUQgPSAiWE1MX1ZBTFVFX19NVUxUSVBMRV9NQVBQSU5HU19ERUZJTkVEIjsKLQlTdHJpbmcgWE1MX1ZBTFVFX19OT19URVhUX0NPTlRFTlQgPSAiWE1MX1ZBTFVFX19OT19URVhUX0NPTlRFTlQiOwotCVN0cmluZyBYTUxfVkFMVUVfX0lOVkFMSURfU0NIRU1BX1RZUEUgPSAiWE1MX1ZBTFVFX19JTlZBTElEX1NDSEVNQV9UWVBFIjsKLQkKLQlTdHJpbmcgWE1MX1ZBTFVFX01BUFBJTkdfV0lUSF9OT05fWE1MX0FUVFJJQlVURV9NQVBQSU5HX0RFRklORUQgPSAiWE1MX1ZBTFVFX01BUFBJTkdfV0lUSF9OT05fWE1MX0FUVFJJQlVURV9NQVBQSU5HX0RFRklORUQiOwotCQotCQotCS8vIGdlbmVyYWwgdmFsaWRhdGlvbgotCQotCVN0cmluZyBYTUxfU0NIRU1BX1RZUEVfX05PTl9TSU1QTEVfVFlQRSA9ICJYTUxfU0NIRU1BX1RZUEVfX05PTl9TSU1QTEVfVFlQRSI7Ci0JU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9OT1RfU1BFQ0lGSUVEX09OX1BBQ0tBR0UgPSAiWE1MX1NDSEVNQV9UWVBFX19UWVBFX05PVF9TUEVDSUZJRURfT05fUEFDS0FHRSI7Ci0JU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9TUEVDSUZJRURfT05fQVRUUklCVVRFID0gIlhNTF9TQ0hFTUFfVFlQRV9fVFlQRV9TUEVDSUZJRURfT05fQVRUUklCVVRFIjsKLQkKLQlTdHJpbmcgUU5BTUVfX01JU1NJTkdfTkFNRSA9ICJRTkFNRV9fTUlTU0lOR19OQU1FIjsKLQlTdHJpbmcgUU5BTUVfX1VOUkVTT0xWRURfQ09NUE9ORU5UID0gIlFOQU1FX19VTlJFU09MVkVEX0NPTVBPTkVOVCI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pheGJWYWxpZGF0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSmF4YlZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQzYjVlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSmF4YlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLklSZXNvdXJjZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLkFic3RyYWN0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uVmFsaWRhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlIEpBWEIgZXh0ZW5zaW9uIGZvciB0aGUKLSAqIFdUUCB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgSmF4YlZhbGlkYXRvcgotCQlleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yCi0JCWltcGxlbWVudHMgSVZhbGlkYXRvciB7Ci0JCi0JcHVibGljIEpheGJWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSVZhbGlkYXRvciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIElSZXBvcnRlciByZXBvcnRlcikgewotCQl2YWxpZGF0ZShyZXBvcnRlciwgcHJvamVjdChjb250ZXh0KSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBBYnN0cmFjdFZhbGlkYXRvciBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRlKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IGtpbmQsIFZhbGlkYXRpb25TdGF0ZSBzdGF0ZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwotCQlJUmVwb3J0ZXIgcmVwb3J0ZXIgPSByZXN1bHQuZ2V0UmVwb3J0ZXIobW9uaXRvcik7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCXRoaXMuY2xlYXJNYXJrZXJzKHByb2plY3QpOwotCQlyZXN1bHQuc2V0U3VzcGVuZFZhbGlkYXRpb24ocHJvamVjdCk7Ci0JCXRoaXMudmFsaWRhdGUocmVwb3J0ZXIsIHByb2plY3QpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGludGVybmFsIGNvbnYuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTWFya2VycyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQljbGVhck1hcmtlcnNfKHByb2plY3QpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTWFya2Vyc18oSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyW10gbWFya2VycyA9IHByb2plY3QuZmluZE1hcmtlcnMoSnB0SmF4YkNvcmVQbHVnaW4uVkFMSURBVElPTl9NQVJLRVJfSUQsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCWZvciAoSU1hcmtlciBtYXJrZXIgOiBtYXJrZXJzKSB7Ci0JCQltYXJrZXIuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKElSZXBvcnRlciByZXBvcnRlciwgSVByb2plY3QgcHJvamVjdCkgewotCQlmb3IgKElNZXNzYWdlIG1lc3NhZ2UgOiB0aGlzLmdldFZhbGlkYXRpb25NZXNzYWdlcyhyZXBvcnRlciwgcHJvamVjdCkpIHsKLQkJCS8vIGNoZWNrIHRvIHNlZSBpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBwcmVmZXJlbmNlcwotCQkJLy8gVE9ETyBKQVhCIHZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLS8vCQkJaWYgKCFKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuaXNQcm9ibGVtSWdub3JlZChwcm9qZWN0LCBtZXNzYWdlLmdldElkKCkpKXsKLQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIGFkanVzdE1lc3NhZ2UobWVzc2FnZSkpOwotLy8JCQl9Ci0JCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIElQcm9qZWN0IHByb2plY3QoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuICgoSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dCkgY29udGV4dCkuZ2V0UHJvamVjdCgpOwotCX0KLQkKLQlwcml2YXRlIEl0ZXJhYmxlPElNZXNzYWdlPiBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoSVJlcG9ydGVyIHJlcG9ydGVyLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpheGJQcm9qZWN0IGpheGJQcm9qZWN0ID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqYXhiUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF4YlByb2plY3QuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKHJlcG9ydGVyKTsKLQkJfQotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxJTWVzc2FnZT4oCi0JCQkJRGVmYXVsdFZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5OT19KQVhCX1BST0pFQ1QsCi0JCQkJCQlwcm9qZWN0KSk7Ci0JfQotCQotCXByaXZhdGUgSU1lc3NhZ2UgYWRqdXN0TWVzc2FnZShJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCUlBZGFwdGFibGUgdGFyZ2V0T2JqZWN0ID0gKElBZGFwdGFibGUpIG1lc3NhZ2UuZ2V0VGFyZ2V0T2JqZWN0KCk7Ci0JCUlSZXNvdXJjZSB0YXJnZXRSZXNvdXJjZSA9ICgoSVJlc291cmNlUGFydCkgdGFyZ2V0T2JqZWN0LmdldEFkYXB0ZXIoSVJlc291cmNlUGFydC5jbGFzcykpLmdldFJlc291cmNlKCk7Ci0JCW1lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KHRhcmdldFJlc291cmNlKTsKLQkJaWYgKG1lc3NhZ2UuZ2V0TGluZU51bWJlcigpID09IElNZXNzYWdlLkxJTkVOT19VTlNFVCkgewotCQkJbWVzc2FnZS5zZXRBdHRyaWJ1dGUoSU1hcmtlci5MT0NBVElPTiwgIiAiKTsKLQkJfQotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9saWJwcm92L0pheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9saWJwcm92L0pheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTBmY2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvbGlicHJvdi9KYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyAKLQkJZXh0ZW5kcyBKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0pBWEJfUExBVEZPUk0gPSAiSkFYQl9QTEFURk9STSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKYXhiUGxhdGZvcm0oKTsKLQkKLQl2b2lkIHNldEpheGJQbGF0Zm9ybShKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBqYXhiUGxhdGZvcm0pOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJkODg1YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGxhdGZvcm0gewotCQotCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBnZXREZWZpbml0aW9uKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIGZhY3RvcnkgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGNvcmUgKGUuZy4gSmF4YlByb2plY3QpLCByZXNvdXJjZQotCSAqIChlLmcuIFBlcnNpc3RlbmNlUmVzb3VyY2UpLCBhbmQgY29udGV4dCAoZS5nLiBQZXJzaXN0ZW5jZVVuaXQpIG1vZGVsCi0JICogb2JqZWN0cwotCSAqLwotCUpheGJGYWN0b3J5IGdldEZhY3RvcnkoKTsKLQotCi0JLy8gKioqKioqKioqKiBKQVhCIGZpbGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhIEpBWEIgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBmaWxlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBmaWxlJ3MgY29udGVudCBpcyB1bnN1cHBvcnRlZC4KLQkgKi8KLQlKYXhiRmlsZSBidWlsZEpheGJGaWxlKEpheGJQcm9qZWN0IGpheGJQcm9qZWN0LCBJRmlsZSBmaWxlKTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGFubm90YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhbm5vdGF0aW9uIHByb3ZpZGVyIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB3aGF0IEphdmEKLQkgKiBhbm5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkIGFuZCBjb25zdHJ1Y3RpbmcgamF2YSByZXNvdXJjZSBtb2RlbCBvYmplY3RzLgotCSAqLwotCUFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGZvcm1hdHRlciB0aGF0IGNhbiBjbGVhbiB1cCB0aGUgSmF2YSBhbm5vdGF0aW9ucyBhZGRlZCB0byBzb3VyY2UKLQkgKiBjb2RlLgotCSAqLwotCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JSXRlcmFibGU8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0KLQlJdGVyYWJsZTxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIGEge0BsaW5rIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbn0gdGhhdCBkZXNjcmliZXMgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiBhcyBpdCBleGlzdHMsIGNvbXBsZXRlIHdpdGggYW5ub3RhdGlvbnMuICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGF0dHJpYnV0ZSdzIGRlZmF1bHQgbWFwcGluZwotCSAqIGhhcyBhbHJlYWR5IGJlZW4gZGV0ZXJtaW5lZC4KLQkgKiBUaGlzIG1heSBub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgTnVsbFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbn0sKSBlbHNlCi0JICogYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyaWJ1dGUgVGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlIHRvIGFuYWx5emUKLQkgKiBAcmV0dXJuIFRoZSBtYXBwaW5nIGRlZmluaXRpb24gZGVzY3JpYmluZyB0aGUgYW5ub3RhdGVkIHN0YXRlIG9mIHRoZSBhdHRyaWJ1dGUKLQkgKi8KLQlKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSB7QGxpbmsgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ufSBmb3IgdGhlIGdpdmVuIG1hcHBpbmcga2V5LgotCSAqIFRocm93IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlmIHRoZSBrZXkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uCi0JICovCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybURlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhZTdkYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJQbGF0Zm9ybURlZmluaXRpb24gewotCQotCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCk7Ci0JCi0JLy8gKioqKiogcGxhdGZvcm0teSBxdWVzdGlvbnMgKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGJ1aWx0IGluIHNjaGVtYSB0eXBlIG5hbWUgbWFwcGVkIGJ5IHRoZSBnaXZlbiAoZnVsbHkgcXVhbGlmaWVkKSBqYXZhIHR5cGUgbmFtZQotCSAqLwotCVN0cmluZyBnZXRTY2hlbWFUeXBlTWFwcGluZyhTdHJpbmcgamF2YVR5cGVOYW1lKTsKLQkKLQkKLQlKYXhiRmFjdG9yeSBnZXRGYWN0b3J5KCk7Ci0JCi0JQW5ub3RhdGlvbkRlZmluaXRpb25bXSBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQotCU5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25bXSBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgcHJvdmlkZXJzIHRoYXQgYXBwbHkgdG8gdGhpcyBwbGF0Zm9ybS4KLQkgKi8KLQlMaXN0SXRlcmFibGU8SmF4YlJlc291cmNlTW9kZWxQcm92aWRlcj4gZ2V0UmVzb3VyY2VNb2RlbFByb3ZpZGVycygpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbW9zdCByZWNlbnQgcmVzb3VyY2UgdHlwZSBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyBwbGF0Zm9ybQotCSAqLwotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpOwotCQotLy8JLyoqCi0vLwkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGRlZmluaXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotLy8JICovCi0vLwlMaXN0SXRlcmF0b3I8UmVzb3VyY2VEZWZpbml0aW9uPiByZXNvdXJjZURlZmluaXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBkZWZhdWx0IGphdmEgYXR0cmlidXRlIG1hcHBpbmdzIGZvciB0aGlzIHBsYXRmb3JtLgotCSAqLwotCUl0ZXJhYmxlPERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBzcGVjaWZpZWQgamF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgZm9yIHRoaXMgcGxhdGZvcm0uCi0JICovCi0JSXRlcmFibGU8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3MTYxYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSkFYQiB2ZW5kb3IgdG8gYnVpbGQgYQotICoge0BsaW5rIEpheGJQbGF0Zm9ybURlZmluaXRpb259LgotICogPHA+Ci0gKiBTZWUgdGhlIDxjb2RlPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlBsYXRmb3JtczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkgewotCQotCUpheGJQbGF0Zm9ybURlZmluaXRpb24gYnVpbGRKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmYzVlNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogQ29udGFpbnMgbWV0YWRhdGEgdGhhdCBkZXNjcmliZXMgYSBKQVhCIHBsYXRmb3JtLiAgTm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiB7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRJZCgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRGYWN0b3J5Q2xhc3NOYW1lKCk7Ci0JCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNKYXhiRmFjZXRWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpwYUZhY2V0VmVyc2lvbik7Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCk7Ci0JCi0JcHVibGljIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gZ2V0R3JvdXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3YzEyMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm07Ci0KLS8qKgotICogQ29udGFpbnMgbWV0YWRhdGEgdGhhdCBkZXNjcmliZXMgYSBKQVhCIHBsYXRmb3JtIGdyb3VwLiAgTm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIHsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQkKLQlwdWJsaWMgSXRlcmFibGU8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+IGdldFBsYXRmb3JtcygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtTWFuYWdlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcGxhdGZvcm0vSmF4YlBsYXRmb3JtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGNhMzA3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3BsYXRmb3JtL0pheGJQbGF0Zm9ybU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIEVudHJ5IHBvaW50IHRvIHRoZSAiamF4YlBsYXRmb3JtcyIgZXh0ZW5zaW9uIHBvaW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGxhdGZvcm1NYW5hZ2VyIHsKLQkKLQlJdGVyYWJsZTxKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uPiBnZXRKYXhiUGxhdGZvcm1Hcm91cHMoKTsKLQkKLQlKYXhiUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdldEpheGJQbGF0Zm9ybUdyb3VwKFN0cmluZyBncm91cElkKTsKLQkKLQlJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gZ2V0SmF4YlBsYXRmb3JtcygpOwotCQotCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpheGJQbGF0Zm9ybShTdHJpbmcgcGxhdGZvcm1JZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgSkFYQiBwbGF0Zm9ybSByZWdpc3RlcmVkIGFzIGEgZGVmYXVsdCBwbGF0Zm9ybSBhbmQgd2hpY2ggc3VwcG9ydHMgdGhlIGdpdmVuIAotCSAqIEpBWEIgZmFjZXQgdmVyc2lvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmVnaXN0ZXJlZCBwbGF0Zm9ybXMuCi0JICovCi0JSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdEpheGJQbGF0Zm9ybShJUHJvamVjdEZhY2V0VmVyc2lvbiBqYXhiRmFjZXRWZXJzaW9uKTsKLQkKLQlKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbihJUHJvamVjdCBwcm9qZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvSkFYQi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9KQVhCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDhlMmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9KQVhCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogSkFYQiBKYXZhLXJlbGF0ZWQgc3R1ZmYgKGFubm90YXRpb25zIGV0Yy4pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEpBWEIgewotCi0JLy8gSkFYQiBwYWNrYWdlcwotCQotCVN0cmluZyBKQVhCX1BBQ0tBR0UgPSAiamF2YXgueG1sLmJpbmQiOwotCVN0cmluZyBKQVhCX1BBQ0tBR0VfID0gSkFYQl9QQUNLQUdFICsgJy4nOwotCQotCVN0cmluZyBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRSA9ICJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uIjsKLQlTdHJpbmcgSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0UgKyAnLic7Ci0JCi0JU3RyaW5nIEpBWEJfQURBUFRFUlNfUEFDS0FHRSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJhZGFwdGVycyI7Ci0JU3RyaW5nIEpBWEJfQURBUFRFUlNfUEFDS0FHRV8gPSBKQVhCX0FEQVBURVJTX1BBQ0tBR0UgKyAnLic7Ci0JCi0JCi0JLy8gSkFYQiBhbm5vdGF0aW9ucwotCQotCVN0cmluZyBYTUxfQVRUQUNITUVOVF9SRUYgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sQXR0YWNobWVudFJlZiI7Ci0JCi0JU3RyaW5nIFhNTF9BQ0NFU1NPUl9PUkRFUiA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxBY2Nlc3Nvck9yZGVyIjsKLQkJU3RyaW5nIFhNTF9BQ0NFU1NPUl9PUkRFUl9fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfQUNDRVNTT1JfVFlQRSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxBY2Nlc3NvclR5cGUiOwotCQlTdHJpbmcgWE1MX0FDQ0VTU09SX1RZUEVfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0FOWV9BVFRSSUJVVEUgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sQW55QXR0cmlidXRlIjsKLQkKLQlTdHJpbmcgWE1MX0FOWV9FTEVNRU5UID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEFueUVsZW1lbnQiOwotCQlTdHJpbmcgWE1MX0FOWV9FTEVNRU5UX19MQVggPSAibGF4IjsKLQkJU3RyaW5nIFhNTF9BTllfRUxFTUVOVF9fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfQVRUUklCVVRFID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEF0dHJpYnV0ZSI7Ci0JCVN0cmluZyBYTUxfQVRUUklCVVRFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgWE1MX0FUVFJJQlVURV9fTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JCVN0cmluZyBYTUxfQVRUUklCVVRFX19SRVFVSVJFRCA9ICJyZXF1aXJlZCI7Ci0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEVsZW1lbnQiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9fTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9fREVGQVVMVF9WQUxVRSA9ICJkZWZhdWx0VmFsdWUiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfX05JTExBQkxFID0gIm5pbGxhYmxlIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX19SRVFVSVJFRCA9ICJyZXF1aXJlZCI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9fVFlQRSA9ICJ0eXBlIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTCA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxFbGVtZW50RGVjbCI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9fTkFNRVNQQUNFID0gIm5hbWVzcGFjZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19ERUZBVUxUX1ZBTFVFID0gImRlZmF1bHRWYWx1ZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19TQ09QRSA9ICJzY29wZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FID0gInN1YnN0aXR1dGlvbkhlYWROYW1lIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfX1NVQlNUSVRVVElPTl9IRUFEX05BTUVTUEFDRSA9ICJzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlIjsKLQkKLQlTdHJpbmcgWE1MX0VMRU1FTlRTID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEVsZW1lbnRzIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UU19fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9SRUYgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sRWxlbWVudFJlZiI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZfX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX19SRVFVSVJFRCA9ICJyZXF1aXJlZCI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZfX1RZUEUgPSAidHlwZSI7Ci0JCi0JU3RyaW5nIFhNTF9FTEVNRU5UX1JFRlMgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sRWxlbWVudFJlZnMiOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEVsZW1lbnRXcmFwcGVyIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9XUkFQUEVSX19OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfX05JTExBQkxFID0gIm5pbGxhYmxlIjsKLQkJU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfX1JFUVVJUkVEID0gInJlcXVpcmVkIjsKLQkKLQlTdHJpbmcgWE1MX0VOVU0gPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sRW51bSI7Ci0JCVN0cmluZyBYTUxfRU5VTV9fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfRU5VTV9WQUxVRSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxFbnVtVmFsdWUiOwotCQlTdHJpbmcgWE1MX0VOVU1fVkFMVUVfX1ZBTFVFID0gInZhbHVlIjsKLQkKLQlTdHJpbmcgWE1MX0lOTElORV9CSU5BUllfREFUQSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxJbmxpbmVCaW5hcnlEYXRhIjsKLQkKLQlTdHJpbmcgWE1MX0lEID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbElEIjsKLQkKLQlTdHJpbmcgWE1MX0lEUkVGID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbElEUkVGIjsKLQkKLQlTdHJpbmcgWE1MX0pBVkFfVFlQRV9BREFQVEVSID0gSkFYQl9BREFQVEVSU19QQUNLQUdFXyArICJYbWxKYXZhVHlwZUFkYXB0ZXIiOwotCQlTdHJpbmcgWE1MX0pBVkFfVFlQRV9BREFQVEVSX19UWVBFID0gInR5cGUiOwotCQlTdHJpbmcgWE1MX0pBVkFfVFlQRV9BREFQVEVSX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIFhNTF9KQVZBX1RZUEVfQURBUFRFUlMgPSBKQVhCX0FEQVBURVJTX1BBQ0tBR0VfICsgIlhtbEphdmFUeXBlQWRhcHRlcnMiOwotCQlTdHJpbmcgWE1MX0pBVkFfVFlQRV9BREFQVEVSU19fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfTElTVCA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxMaXN0IjsKLQkKLQlTdHJpbmcgWE1MX01JTUVfVFlQRSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxNaW1lVHlwZSI7Ci0JCVN0cmluZyBYTUxfTUlNRV9UWVBFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIFhNTF9NSVhFRCA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxNaXhlZCI7Ci0JCi0JU3RyaW5nIFhNTF9OUyA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxOcyI7Ci0JCVN0cmluZyBYTUxfTlNfX05BTUVTUEFDRV9VUkkgPSAibmFtZXNwYWNlVVJJIjsKLQkJU3RyaW5nIFhNTF9OU19fUFJFRklYID0gInByZWZpeCI7Ci0JCi0JU3RyaW5nIFhNTF9SRUdJU1RSWSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxSZWdpc3RyeSI7Ci0JCi0JU3RyaW5nIFhNTF9ST09UX0VMRU1FTlQgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sUm9vdEVsZW1lbnQiOwotCQlTdHJpbmcgWE1MX1JPT1RfRUxFTUVOVF9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFhNTF9ST09UX0VMRU1FTlRfX05BTUVTUEFDRSA9ICJuYW1lc3BhY2UiOwotCQotCVN0cmluZyBYTUxfU0NIRU1BID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbFNjaGVtYSI7Ci0JCVN0cmluZyBYTUxfU0NIRU1BX19BVFRSSUJVVEVfRk9STV9ERUZBVUxUID0gImF0dHJpYnV0ZUZvcm1EZWZhdWx0IjsKLQkJU3RyaW5nIFhNTF9TQ0hFTUFfX0VMRU1FTlRfRk9STV9ERUZBVUxUID0gImVsZW1lbnRGb3JtRGVmYXVsdCI7Ci0JCVN0cmluZyBYTUxfU0NIRU1BX19MT0NBVElPTiA9ICJsb2NhdGlvbiI7Ci0JCVN0cmluZyBYTUxfU0NIRU1BX19OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLQkJU3RyaW5nIFhNTF9TQ0hFTUFfX1hNTE5TID0gInhtbG5zIjsKLQkKLQlTdHJpbmcgWE1MX1NDSEVNQV9UWVBFID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbFNjaGVtYVR5cGUiOwotCQlTdHJpbmcgWE1MX1NDSEVNQV9UWVBFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgWE1MX1NDSEVNQV9UWVBFX19OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLQkJU3RyaW5nIFhNTF9TQ0hFTUFfVFlQRV9fVFlQRSA9ICJ0eXBlIjsKLQkKLQlTdHJpbmcgWE1MX1NDSEVNQV9UWVBFUyA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxTY2hlbWFUeXBlcyI7Ci0JCVN0cmluZyBYTUxfU0NIRU1BX1RZUEVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIFhNTF9TRUVfQUxTTyA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxTZWVBbHNvIjsKLQkJU3RyaW5nIFhNTF9TRUVfQUxTT19fVkFMVUUgPSAidmFsdWUiOwotCQotCVN0cmluZyBYTUxfVFlQRSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxUeXBlIjsKLQkJU3RyaW5nIFhNTF9UWVBFX19GQUNUT1JZX0NMQVNTID0gImZhY3RvcnlDbGFzcyI7Ci0JCVN0cmluZyBYTUxfVFlQRV9fRkFDVE9SWV9NRVRIT0QgPSAiZmFjdG9yeU1ldGhvZCI7Ci0JCVN0cmluZyBYTUxfVFlQRV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFhNTF9UWVBFX19OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsKLQkJU3RyaW5nIFhNTF9UWVBFX19QUk9QX09SREVSID0gInByb3BPcmRlciI7Ci0JCVN0cmluZyBYTUxfVFlQRV9fREVGQVVMVF9GQUNUT1JZX0NMQVNTID0gWE1MX1RZUEUgKyAiLkRFRkFVTFQiOwotCQkKLQlTdHJpbmcgWE1MX1RSQU5TSUVOVCA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxUcmFuc2llbnQiOwotCQotCVN0cmluZyBYTUxfVkFMVUUgPSBKQVhCX0FOTk9UQVRJT05fUEFDS0FHRV8gKyAiWG1sVmFsdWUiOwotCQotCQotCS8vIEpBWEIgZW51bXMKLQkKLQlTdHJpbmcgWE1MX0FDQ0VTU19PUkRFUiA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxBY2Nlc3NPcmRlciI7Ci0JCVN0cmluZyBYTUxfQUNDRVNTX09SREVSXyA9IFhNTF9BQ0NFU1NfT1JERVIgKyAnLic7Ci0JCVN0cmluZyBYTUxfQUNDRVNTX09SREVSX19BTFBIQUJFVElDQUwgPSBYTUxfQUNDRVNTX09SREVSXyArICJBTFBIQUJFVElDQUwiOwotCQlTdHJpbmcgWE1MX0FDQ0VTU19PUkRFUl9fVU5ERUZJTkVEID0gWE1MX0FDQ0VTU19PUkRFUl8gKyAiVU5ERUZJTkVEIjsKLQkKLQlTdHJpbmcgWE1MX0FDQ0VTU19UWVBFID0gSkFYQl9BTk5PVEFUSU9OX1BBQ0tBR0VfICsgIlhtbEFjY2Vzc1R5cGUiOwotCQlTdHJpbmcgWE1MX0FDQ0VTU19UWVBFXyA9IFhNTF9BQ0NFU1NfVFlQRSArICcuJzsKLQkJU3RyaW5nIFhNTF9BQ0NFU1NfVFlQRV9fRklFTEQgPSBYTUxfQUNDRVNTX1RZUEVfICsgIkZJRUxEIjsKLQkJU3RyaW5nIFhNTF9BQ0NFU1NfVFlQRV9fTk9ORSA9IFhNTF9BQ0NFU1NfVFlQRV8gKyAiTk9ORSI7Ci0JCVN0cmluZyBYTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZID0gWE1MX0FDQ0VTU19UWVBFXyArICJQUk9QRVJUWSI7Ci0JCVN0cmluZyBYTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIgPSBYTUxfQUNDRVNTX1RZUEVfICsgIlBVQkxJQ19NRU1CRVIiOwotCQotCVN0cmluZyBYTUxfTlNfRk9STSA9IEpBWEJfQU5OT1RBVElPTl9QQUNLQUdFXyArICJYbWxOc0Zvcm0iOwotCVN0cmluZyBYTUxfTlNfRk9STV8gPSBYTUxfTlNfRk9STSArICIuIjsKLQkJU3RyaW5nIFhNTF9OU19GT1JNX19RVUFMSUZJRUQgPSBYTUxfTlNfRk9STV8gKyAiUVVBTElGSUVEIjsKLQkJU3RyaW5nIFhNTF9OU19GT1JNX19VTlFVQUxJRklFRCA9IFhNTF9OU19GT1JNXyArICJVTlFVQUxJRklFRCI7Ci0JCVN0cmluZyBYTUxfTlNfRk9STV9fVU5TRVQgPSBYTUxfTlNfRk9STV8gKyAiVU5TRVQiOwotCQotCQotCS8vIE90aGVyIEpBWEIgdHlwZXMKLQkKLQlTdHJpbmcgSkFYQl9FTEVNRU5UID0gSkFYQl9QQUNLQUdFXyArICJKQVhCRWxlbWVudCI7Ci0JCi0JU3RyaW5nIFhNTF9BREFQVEVSID0gSkFYQl9BREFQVEVSU19QQUNLQUdFXyArICJYbWxBZGFwdGVyIjsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvSmF4YkJhc2ljU2NoZW1hQ29tcG9uZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9KYXhiQmFzaWNTY2hlbWFDb21wb25lbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkZDNiMGQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9KYXhiQmFzaWNTY2hlbWFDb21wb25lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIFN1cGVyLWludGVyZmFjZSBmb3Ige0BsaW5rIFhtbEF0dHJpYnV0ZUFubm90YXRpb259IGFuZCB7QGxpbmsgWG1sRWxlbWVudEFubm90YXRpb259Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiQmFzaWNTY2hlbWFDb21wb25lbnRBbm5vdGF0aW9uCi0JCWV4dGVuZHMgUU5hbWVBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3JlcXVpcmVkJyBlbGVtZW50IG9mIHRoZSBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0UmVxdWlyZWQoKTsKLQkJU3RyaW5nIFJFUVVJUkVEX1BST1BFUlRZID0gInJlcXVpcmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZXF1aXJlZCcgZWxlbWVudCBvZiB0aGUgWG1sQXR0cmlidXRlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3JlcXVpcmVkJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9RTmFtZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvUU5hbWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4N2RhNzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9RTmFtZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byBKQVhCIGFubm90YXRpb25zIHdpdGggbmFtZXNwYWNlIGFuZCBuYW1lIGZpZWxkcwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4/Ci0gKiBAc2luY2UgMy4/Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUU5hbWVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlICduYW1lc3BhY2UnIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIE5BTUVTUEFDRV9QUk9QRVJUWSA9ICJuYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lc3BhY2UnIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lc3BhY2UnIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2UpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgYW5ub3RhdGlvbiBpdHNlbGYuCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAnbmFtZScgcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGFubm90YXRpb24gaXRzZWxmLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICduYW1lJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzT3JkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzT3JkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjYmFjNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc09yZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBlbnVtCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc09yZGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGVudW0gWG1sQWNjZXNzT3JkZXIgewotCi0JQUxQSEFCRVRJQ0FMKEpBWEIuWE1MX0FDQ0VTU19PUkRFUl9fQUxQSEFCRVRJQ0FMKSwKLQlVTkRFRklORUQgKEpBWEIuWE1MX0FDQ0VTU19PUkRFUl9fVU5ERUZJTkVEKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCVhtbEFjY2Vzc09yZGVyKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFhtbEFjY2Vzc09yZGVyIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgWG1sQWNjZXNzT3JkZXIgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoWG1sQWNjZXNzT3JkZXIgYWNjZXNzVHlwZSA6IFhtbEFjY2Vzc09yZGVyLnZhbHVlcygpKSB7Ci0JCQlpZiAoYWNjZXNzVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKFhtbEFjY2Vzc09yZGVyIGFjY2Vzc1R5cGUpIHsKLQkJcmV0dXJuIChhY2Nlc3NUeXBlID09IG51bGwpID8gbnVsbCA6IGFjY2Vzc1R5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3NUeXBlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiM2JkMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGVudW0KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBlbnVtIFhtbEFjY2Vzc1R5cGUgewotCi0JRklFTEQoSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKSwKLQlOT05FKEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKSwKLQlQUk9QRVJUWShKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpLAotCVBVQkxJQ19NRU1CRVIoSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JWG1sQWNjZXNzVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBYbWxBY2Nlc3NUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgWG1sQWNjZXNzVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChYbWxBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgOiBYbWxBY2Nlc3NUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoYWNjZXNzVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKFhtbEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgewotCQlyZXR1cm4gKGFjY2Vzc1R5cGUgPT0gbnVsbCkgPyBudWxsIDogYWNjZXNzVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlYjIxM2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JPcmRlcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlYbWxBY2Nlc3NPcmRlciBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxBY2Nlc3Nvck9yZGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEFjY2Vzc29yT3JkZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yVHlwZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBkYmFjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sQWNjZXNzb3JUeXBlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlYbWxBY2Nlc3NUeXBlIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEFjY2Vzc29yVHlwZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFhtbEFjY2Vzc1R5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEFjY2Vzc29yVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzM1NmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBbnlFbGVtZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxBbnlFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWY2NzljLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdsYXgnIGVsZW1lbnQgb2YgdGhlIFhtbEFueUVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0TGF4KCk7Ci0JCVN0cmluZyBMQVhfUFJPUEVSVFkgPSAibGF4IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdsYXgnIGVsZW1lbnQgb2YgdGhlIFhtbEFueUVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRMYXgoQm9vbGVhbiBsYXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdsYXgnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEFueUVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TGF4VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEFueUVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sQW55RWxlbWVudCh2YWx1ZT1Gb28uY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIkZvbyIKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sQW55RWxlbWVudCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sQW55RWxlbWVudCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCB2YWx1ZSBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEFueUVsZW1lbnQodmFsdWU9Rm9vLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJtb2RlbC5Gb28iIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgbW9kZWwuRm9vLgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpOwotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1ZBTFVFX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU2Yzc3MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dGFjaG1lbnRSZWYKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQ4NjU1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sQXR0cmlidXRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlQW5ub3RhdGlvbgotCQlleHRlbmRzIEpheGJCYXNpY1NjaGVtYUNvbXBvbmVudEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTdiNDU4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRBbm5vdGF0aW9uCi0JCWV4dGVuZHMgSmF4YkJhc2ljU2NoZW1hQ29tcG9uZW50QW5ub3RhdGlvbiwgTmVzdGFibGVBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RlZmF1bHRWYWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpOwotCQlTdHJpbmcgREVGQVVMVF9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0VmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RlZmF1bHRWYWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgZGVmYXVsdFZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnZGVmYXVsdFZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXREZWZhdWx0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduaWxsYWJsZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXROaWxsYWJsZSgpOwotCQlTdHJpbmcgTklMTEFCTEVfUFJPUEVSVFkgPSAibmlsbGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25pbGxhYmxlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmlsbGFibGUoQm9vbGVhbiBuaWxsYWJsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25pbGxhYmxlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbGVtZW50IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5pbGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHlwZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxFbGVtZW50KHR5cGU9Rm9vLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJGb28iCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQkJU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndHlwZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpOwotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndHlwZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sRWxlbWVudCh0eXBlPUZvby5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAibW9kZWwuRm9vIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLkZvby4KLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKTsKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjNhODNlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50RGVjbEFubm90YXRpb24KLQkJZXh0ZW5kcyBRTmFtZUFubm90YXRpb24gewotCQotCS8vICoqKioqIHNjb3BlICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCAic2NvcGUiIHByb3BlcnR5IGNoYW5nZXMuCi0JICovCi0JU3RyaW5nIFNDT1BFX1BST1BFUlRZID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2NvcGUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEVsZW1lbnREZWNsKHR5cGU9WG1sRWxlbWVudERlY2wuR0xPQkFMLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJYbWxFbGVtZW50RGVjbC5HTE9CQUwiCi0JICovCi0JU3RyaW5nIGdldFNjb3BlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzY29wZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRTY29wZShTdHJpbmcgc2NvcGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc2NvcGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTY29wZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCAiZnVsbHlRdWFsaWZpZWRTY29wZUNsYXNzTmFtZSIgcHJvcGVydHkgY2hhbmdlcy4KLQkgKi8KLQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NDT1BFX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRTY29wZUNsYXNzTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBzY29wZSBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEVsZW1lbnREZWNsKHR5cGU9WG1sRWxlbWVudERlY2wuR0xPQkFMLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnREZWNsLkdMT0JBTCIKLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRTY29wZUNsYXNzTmFtZSgpOwotCQotCQotCS8vICoqKioqIHN1YnN0aXR1dGlvbiBoZWFkIG5hbWVzcGFjZSAqKioqKgotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggInN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UiIHByb3BlcnR5IGNoYW5nZXMuCi0JICovCi0JU3RyaW5nIFNVQlNUSVRVVElPTl9IRUFEX05BTUVTUEFDRV9QUk9QRVJUWSA9ICJzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoU3RyaW5nIHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEVsZW1lbnREZWNsIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3N1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gc3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCQotCS8vICoqKioqIHN1YnN0aXR1dGlvbiBoZWFkIG5hbWUgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoICJzdWJzdGl0dXRpb25IZWFkTmFtZSIgcHJvcGVydHkgY2hhbmdlcy4KLQkgKi8KLQlTdHJpbmcgU1VCU1RJVFVUSU9OX0hFQURfTkFNRV9QUk9QRVJUWSA9ICJzdWJzdGl0dXRpb25IZWFkTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3N1YnN0aXR1dGlvbkhlYWROYW1lJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzdWJzdGl0dXRpb25IZWFkTmFtZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRTdWJzdGl0dXRpb25IZWFkTmFtZShTdHJpbmcgc3Vic3RpdHV0aW9uSGVhZE5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc3Vic3RpdHV0aW9uSGVhZE5hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTdWJzdGl0dXRpb25IZWFkTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnc3Vic3RpdHV0aW9uSGVhZE5hbWUnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gc3Vic3RpdHV0aW9uSGVhZE5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkKLQkvLyAqKioqKiBkZWZhdWx0IHZhbHVlICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCAiZGVmYXVsdFZhbHVlIiBwcm9wZXJ0eSBjaGFuZ2VzLgotCSAqLwotCVN0cmluZyBERUZBVUxUX1ZBTFVFX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RlZmF1bHRWYWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2RlZmF1bHRWYWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudERlY2wgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VmFsdWUoU3RyaW5nIGRlZmF1bHRWYWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdkZWZhdWx0VmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbGVtZW50RGVjbCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXREZWZhdWx0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjZkOWI4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRSZWYKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uCi0JCWV4dGVuZHMgUU5hbWVBbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24gewotCQotCS8vICoqKioqIHJlcXVpcmVkICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAncmVxdWlyZWQnIHByb3BlcnR5IG9mIHRoaXMgYW5ub3RhdGlvbi4KLQkgKi8KLQlTdHJpbmcgUkVRVUlSRURfUFJPUEVSVFkgPSAicmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZXF1aXJlZCcgZWxlbWVudCBvZiB0aGlzIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFJlcXVpcmVkKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZXF1aXJlZCcgZWxlbWVudCBvZiB0aGlzIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdyZXF1aXJlZCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgYW5ub3RhdGlvbiBpdHNlbGYuCi0JICovCi0JVGV4dFJhbmdlIGdldFJlcXVpcmVkVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkKLQkvLyAqKioqKiB0eXBlICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAndHlwZScgcHJvcGVydHkgb2YgdGhpcyBhbm5vdGF0aW9uLgotCSAqLwotCVN0cmluZyBUWVBFX1BST1BFUlRZID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoaXMgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sRWxlbWVudFJlZih0eXBlPUZvby5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiRm9vIgotCSAqLwotCVN0cmluZyBnZXRUeXBlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoaXMgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3R5cGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBhbm5vdGF0aW9uIGl0c2VsZi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VHlwZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSAnZnVsbHlRdWFsaWZpZWROYW1lJyBwcm9wZXJ0eSBvZiB0aGlzIGFubm90YXRpb24uCi0JICovCi0JU3RyaW5nIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sRWxlbWVudFJlZih0eXBlPUZvby5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAibW9kZWwuRm9vIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIG1vZGVsLkZvby4KLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjEwZjI3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50UmVmcwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudFJlZnMgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlMaXN0SXRlcmFibGU8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IGdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCVN0cmluZyBYTUxfRUxFTUVOVF9SRUZTX0xJU1QgPSAieG1sRWxlbWVudFJlZnMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudFJlZnMgYW5ub3RhdGlvbi4KLQkgKi8KLQlpbnQgZ2V0WG1sRWxlbWVudFJlZnNTaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudFJlZnMgYW5ub3RhdGlvbi4KLQkgKi8KLQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQXQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50UmVmcyBhbm5vdGF0aW9uLgotCSAqLwotCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIGFkZFhtbEVsZW1lbnRSZWYoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50UmVmcyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZVhtbEVsZW1lbnRSZWYoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRSZWZzIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKGludCBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhY2QwOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24KLQkJZXh0ZW5kcyBRTmFtZUFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmlsbGFibGUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldE5pbGxhYmxlKCk7Ci0JU3RyaW5nIE5JTExBQkxFX1BST1BFUlRZID0gIm5pbGxhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmlsbGFibGUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmlsbGFibGUoQm9vbGVhbiBuaWxsYWJsZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduaWxsYWJsZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmlsbGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVxdWlyZWQnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFJlcXVpcmVkKCk7Ci0JU3RyaW5nIFJFUVVJUkVEX1BST1BFUlRZID0gInJlcXVpcmVkIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVxdWlyZWQnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiByZXF1aXJlZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdyZXF1aXJlZCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVxdWlyZWRUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50c0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudHNBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNmQxODAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50c0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVsZW1lbnRzQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRzIGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTGlzdEl0ZXJhYmxlPFhtbEVsZW1lbnRBbm5vdGF0aW9uPiBnZXRYbWxFbGVtZW50cygpOwotCQlTdHJpbmcgWE1MX0VMRU1FTlRTX0xJU1QgPSAieG1sRWxlbWVudHMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudHMgYW5ub3RhdGlvbi4KLQkgKi8KLQlpbnQgZ2V0WG1sRWxlbWVudHNTaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sRWxlbWVudHMgYW5ub3RhdGlvbi4KLQkgKi8KLQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QXQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50cyBhbm5vdGF0aW9uLgotCSAqLwotCVhtbEVsZW1lbnRBbm5vdGF0aW9uIGFkZFhtbEVsZW1lbnQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbGVtZW50cyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZVhtbEVsZW1lbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVsZW1lbnRzIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVYbWxFbGVtZW50KGludCBpbmRleCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVudW1Bbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVudW1Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmM4Y2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxFbnVtQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRW51bUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxFbnVtIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1htbEVudW0odmFsdWU9RW51bUNsYXNzLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJFbnVtQ2xhc3MiCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVudW0gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxFbnVtIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHZhbHVlIGNsYXNzIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sRW51bSh2YWx1ZT1FbnVtQ2xhc3MuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIm1vZGVsLkVudW1DbGFzcyIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5FbnVtQ2xhc3MuCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfVkFMVUVfQ0xBU1NfTkFNRV9QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZFZhbHVlQ2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEVudW1WYWx1ZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRW51bVZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDcwYTI4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sRW51bVZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bVZhbHVlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxFbnVtVmFsdWVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVudW1WYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbEVudW1WYWx1ZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEVudW1WYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIHBvc2l0aW9uIHRvdWNoZXMgdGhlICd2YWx1ZScgZWxlbWVudCB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbElEQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJREFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4M2JkMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbElEQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSURBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbElEUkVGQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJRFJFRkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZjZmFkMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbElEUkVGQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRFJFRgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSURSRUZBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOTk5MTkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJbmxpbmVCaW5hcnlEYXRhCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiYzJjZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uCi0JCWV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sSmF2YVR5cGVBZGFwdGVyKHZhbHVlPUZvb0FkYXB0ZXIuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIkZvb0FkYXB0ZXIiCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdmFsdWUncyBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxKYXZhVHlwZUFkYXB0ZXIoRm9vQWRhcHRlci5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiZXhhbXBsZS5Gb29BZGFwdGVyIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIGV4YW1wbGUuRm9vQWRhcHRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpOwotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1ZBTFVFX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sSmF2YVR5cGVBZGFwdGVyKHR5cGU9Rm9vLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJGb28iCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQkJU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3R5cGUnIGVsZW1lbnQgb2YgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndHlwZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUncyBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZT1Gb28uY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gImV4YW1wbGUuRm9vIiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yIGV4YW1wbGUuRm9vLgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFR5cGUoKTsKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9UWVBFX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkVHlwZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTGlzdEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTGlzdEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NmU0Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbExpc3RBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbExpc3QKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbExpc3RBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxNaW1lVHlwZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczYWRlNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbE1pbWVUeXBlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWltZVR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1pbWVUeXBlQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFhtbE1pbWVUeXBlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sTWltZVR5cGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbE1pbWVUeXBlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxNaXhlZEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTWl4ZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTJjNDIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxNaXhlZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWl4ZWQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1peGVkQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxOc0Fubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTnNBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZmQwZmYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxOc0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnMKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE5zQW5ub3RhdGlvbgotCQlleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lc3BhY2VVUkknIGVsZW1lbnQgb2YgdGhlIFhtbE5zIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCVN0cmluZyBOQU1FU1BBQ0VfVVJJX1BST1BFUlRZID0gIm5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWVzcGFjZVVSSScgZWxlbWVudCBvZiB0aGUgWG1sTnMgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lc3BhY2UnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxOcyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lc3BhY2VVUklUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncHJlZml4JyBlbGVtZW50IG9mIHRoZSBYbWxOcyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFByZWZpeCgpOwotCQlTdHJpbmcgUFJFRklYX1BST1BFUlRZID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ByZWZpeCcgZWxlbWVudCBvZiB0aGUgWG1sTnMgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRQcmVmaXgoU3RyaW5nIHByZWZpeCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdwcmVmaXgnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxOcyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRQcmVmaXhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxOc0Zvcm0uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sTnNGb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzM1NDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxOc0Zvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGVudW0KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTnNGb3JtCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGVudW0gWG1sTnNGb3JtIHsKLQkKLQlRVUFMSUZJRUQoSkFYQi5YTUxfTlNfRk9STV9fUVVBTElGSUVEKSwKLQlVTlFVQUxJRklFRChKQVhCLlhNTF9OU19GT1JNX19VTlFVQUxJRklFRCksCi0JVU5TRVQoSkFYQi5YTUxfTlNfRk9STV9fVU5TRVQpOwotCQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCVhtbE5zRm9ybShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBYbWxOc0Zvcm0gZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBYbWxOc0Zvcm0gZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoWG1sTnNGb3JtIG5zRm9ybSA6IFhtbE5zRm9ybS52YWx1ZXMoKSkgewotCQkJaWYgKG5zRm9ybS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIG5zRm9ybTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoWG1sTnNGb3JtIG5zRm9ybSkgewotCQlyZXR1cm4gKG5zRm9ybSA9PSBudWxsKSA/IG51bGwgOiBuc0Zvcm0uZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUmVnaXN0cnlBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFJlZ2lzdHJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2U2YWVmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUmVnaXN0cnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZWdpc3RyeUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMThmYzk2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbgotCQlleHRlbmRzIFFOYW1lQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFNjaGVtYUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTA4NTA2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2NoZW1hQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnYXR0cmlidXRlRm9ybURlZmF1bHQnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JWG1sTnNGb3JtIGdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCk7Ci0JCVN0cmluZyBBVFRSSUJVVEVfRk9STV9ERUZBVUxUX1BST1BFUlRZID0gImF0dHJpYnV0ZUZvcm1EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnYXR0cmlidXRlRm9ybURlZmF1bHQnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFhtbE5zRm9ybSBhdHRyaWJ1dGVGb3JtRGVmYXVsdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdhdHRyaWJ1dGVGb3JtRGVmYXVsdCcgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdlbGVtZW50Rm9ybURlZmF1bHQnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JWG1sTnNGb3JtIGdldEVsZW1lbnRGb3JtRGVmYXVsdCgpOwotCQlTdHJpbmcgRUxFTUVOVF9GT1JNX0RFRkFVTFRfUFJPUEVSVFkgPSAiZWxlbWVudEZvcm1EZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZWxlbWVudEZvcm1EZWZhdWx0JyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRFbGVtZW50Rm9ybURlZmF1bHQoWG1sTnNGb3JtIGVsZW1lbnRGb3JtRGVmYXVsdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdlbGVtZW50Rm9ybURlZmF1bHQnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RWxlbWVudEZvcm1EZWZhdWx0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2xvY2F0aW9uJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbigpOwotCQlTdHJpbmcgTE9DQVRJT05fUFJPUEVSVFkgPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdsb2NhdGlvbicgZWxlbWVudCBvZiB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2xvY2F0aW9uJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldExvY2F0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWVzcGFjZScgZWxlbWVudCBvZiB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZXNwYWNlKCk7Ci0JCVN0cmluZyBOQU1FU1BBQ0VfUFJPUEVSVFkgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lc3BhY2UnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVzcGFjZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZXNwYWNlJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIG5hbWVzcGFjZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAneG1sbnMnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUxpc3RJdGVyYWJsZTxYbWxOc0Fubm90YXRpb24+IGdldFhtbG5zKCk7Ci0JCVN0cmluZyBYTUxOU19MSVNUID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAneG1sbnMnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLgotCSAqLwotCWludCBnZXRYbWxuc1NpemUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3htbG5zJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ubm90YXRpb24uCi0JICovCi0JWG1sTnNBbm5vdGF0aW9uIHhtbG5zQXQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3htbG5zJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKi8KLQlYbWxOc0Fubm90YXRpb24gYWRkWG1sbnMoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3htbG5zJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVYbWxucyhpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd4bWxucycgZWxlbWVudCBvZiB0aGUgWG1sU2NoZW1hIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVYbWxucyhpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEyNTVlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2NoZW1hVHlwZUFubm90YXRpb24KLQkJZXh0ZW5kcyBRTmFtZUFubm90YXRpb24sIE5lc3RhYmxlQW5ub3RhdGlvbiB7Ci0JCi0JU3RyaW5nIFRZUEVfUFJPUEVSVFkgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3R5cGUnIGVsZW1lbnQgb2YgdGhlIFhtbFNjaGVtYVR5cGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7WG1sU2NoZW1hVHlwZShuYW1lPSJkYXRlIiwgdHlwZT1YTUxHcmVnb3JpYW5DYWxlbmRhci5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiWE1MR3JlZ29yaWFuQ2FsZW5kYXIiCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0eXBlJyBlbGVtZW50IG9mIHRoZSBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0eXBlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sU2NoZW1hVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUeXBlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1RZUEVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxTY2hlbWFUeXBlKG5hbWU9ImRhdGUiLCB0eXBlPVhNTEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJqYXZheC54bWwuZGF0YXR5cGUuWE1MR3JlZ29yaWFuQ2FsZW5kYXIiIGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IgCi0JICogamF2YXgueG1sLmRhdGF0eXBlLlhNTEdyZWdvcmlhbkNhbGVuZGFyLgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCk7Ci0JCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdHlwZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkCi0JICovCi0JU3RyaW5nIERFRkFVTFRfVFlQRSA9ICJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGUuREVGQVVMVCI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFNlZUFsc29Bbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFNlZUFsc29Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmY4NjQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxTZWVBbHNvQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2VlQWxzbwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2VlQWxzb0Fubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBDaGFuZ2Ugbm90aWZpY2F0aW9uIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsdWUgZWxlbWVudAotCSAqLwotCVN0cmluZyBDTEFTU0VTX0xJU1QgPSAiY2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxTZWVBbHNvKHtGb28uY2xhc3MsIEJhci5jbGFzc30pCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gYW5kIGl0ZXJhYmxlIGNvbnRhaW5pbmc6ICJGb28iLCAiQmFyIgotCSAqLwotCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGdldENsYXNzZXMoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldENsYXNzZXNTaXplKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sU2VlQWxzbyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgYWRkQ2xhc3MoU3RyaW5nIGNsYXp6KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBhZGRDbGFzcyhpbnQgaW5kZXgsIFN0cmluZyBjbGF6eik7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgWG1sU2VlQWxzbyBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZUNsYXNzKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBYbWxTZWVBbHNvIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVDbGFzcyhpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIENoYW5nZSBub3RpZmljYXRpb24gY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3Nlcy4KLQkgKiBDaGFuZ2VzIHNob3VsZCBvY2N1ciB3aGVuZXZlciBjaGFuZ2VzIG9jY3VyIHRvIHRoZSAiY2xhc3NlcyIgbGlzdCwgYnV0IAotCSAqIG1heSBhbHNvIG9jY3VyIHdpdGggY2hhbmdlcyB0byB0aGUgY2xhc3NlcyByZXNvbHV0aW9uIHN0YXRlIChpbXBvcnQgY2hhbmdlcywgZS5nLikKLQkgKi8KLQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0NMQVNTRVNfTElTVCA9ICJmdWxseVF1YWxpZmllZENsYXNzZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBlbGVtZW50cyByZXNvbHZlZCB0byBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZXMKLQkgKi8KLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRGdWxseVF1YWxpZmllZENsYXNzZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50QW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDY3MjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSkFYQiBhbm5vdGF0aW9uCi0gKiBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVHJhbnNpZW50QW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUeXBlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUeXBlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODFjZGU5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2phdmEvWG1sVHlwZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKQVhCIGFubm90YXRpb24KLSAqIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4/Ci0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVHlwZUFubm90YXRpb24KLQkJZXh0ZW5kcyBRTmFtZUFubm90YXRpb24gewotCQotCS8vICoqKioqIGZhY3RvcnkgY2xhc3MgKioqKioKLQkKLQlTdHJpbmcgRkFDVE9SWV9DTEFTU19QUk9QRVJUWSA9ICJmYWN0b3J5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIERFRkFVTFRfRkFDVE9SWV9DTEFTUyA9IEpBWEIuWE1MX1RZUEVfX0RFRkFVTFRfRkFDVE9SWV9DTEFTUzsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZhY3RvcnlDbGFzcycgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxUeXBlKG5hbWU9IlVTQWRkcmVzc1R5cGUiLCBmYWN0b3J5Q2xhc3M9VVNBZGRyZXNzRmFjdG9yeS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAiVVNBZGRyZXNzRmFjdG9yeSIKLQkgKi8KLQlTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmYWN0b3J5Q2xhc3MnIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRGYWN0b3J5Q2xhc3MoU3RyaW5nIGZhY3RvcnlDbGFzcyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdmYWN0b3J5Q2xhc3MnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBYbWxUeXBlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEZhY3RvcnlDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JU3RyaW5nIEZVTExZX1FVQUxJRklFRF9GQUNUT1JZX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGZhY3RvcnkgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtYbWxUeXBlKG5hbWU9IlVTQWRkcmVzc1R5cGUiLCBmYWN0b3J5Q2xhc3M9VVNBZGRyZXNzRmFjdG9yeS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiAibW9kZWwuVVNBZGRyZXNzRmFjdG9yeSIgaWYgdGhlcmUgaXMgYW4gaW1wb3J0IGZvciBtb2RlbC5VU0FkZHJlc3NGYWN0b3J5LgotCSAqIEByZXR1cm4KLQkgKi8KLQlTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRGYWN0b3J5Q2xhc3NOYW1lKCk7Ci0JCi0JCi0JLy8gKioqKiogZmFjdG9yeSBtZXRob2QgKioqKioKLQkKLQlTdHJpbmcgRkFDVE9SWV9NRVRIT0RfUFJPUEVSVFkgPSAiZmFjdG9yeU1ldGhvZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZhY3RvcnlNZXRob2QnIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRGYWN0b3J5TWV0aG9kKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmYWN0b3J5TWV0aG9kJyBlbGVtZW50IG9mIHRoZSBYbWxUeXBlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RmFjdG9yeU1ldGhvZChTdHJpbmcgZmFjdG9yeU1ldGhvZCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdmYWN0b3J5TWV0aG9kJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRGYWN0b3J5TWV0aG9kVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkKLQkvLyAqKioqKiBwcm9wIG9yZGVyICoqKioqCi0JCi0JU3RyaW5nIFBST1BfT1JERVJfTElTVCA9ICJwcm9wT3JkZXIiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQSBzaW5nbGUgZWxlbWVudCBlbXB0eSBzdHJpbmcgYXJyYXkgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIHVuc3BlY2lmaWVkCi0JICovCi0JU3RyaW5nW10gREVGQVVMVF9QUk9QX09SREVSID0gbmV3IFN0cmluZ1tdIHsgIiIgfTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Byb3BPcmRlcicgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUxpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFByb3BPcmRlcigpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncHJvcE9yZGVyJyBlbGVtZW50IG9mIHRoZSBYbWxUeXBlIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldFByb3BPcmRlclNpemUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Byb3BPcmRlcicgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgYWRkUHJvcChTdHJpbmcgcHJvcCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIGFkZFByb3AoaW50IGluZGV4LCBTdHJpbmcgcHJvcCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVQcm9wKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3Byb3BPcmRlcicgZWxlbWVudCBvZiB0aGUgWG1sVHlwZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcChTdHJpbmcgcHJvcCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZVByb3AoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2Ugb2YgdGhlICdwcm9wT3JkZXInIGVsZW1lbnQgb2YgdGhlIFhtbFR5cGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UHJvcE9yZGVyVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdwcm9wT3JkZXInIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gcHJvcE9yZGVyVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIG9mIHRoZSBwcm9wIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0JICovCi0JVGV4dFJhbmdlIGdldFByb3BUZXh0UmFuZ2UoaW50IGluZGV4LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSBwcm9wIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotCSAqLwotCWJvb2xlYW4gcHJvcFRvdWNoZXMoaW50IGluZGV4LCBpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5MzY1NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpBWEIgYW5ub3RhdGlvbgotICogamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVmFsdWVBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQW5ub3RhdGlvbiB7Ci0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS9yZXNvdXJjZS9qYXhiaW5kZXgvSmF4YkluZGV4UmVzb3VyY2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2pheGJpbmRleC9KYXhiSW5kZXhSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjI3NTMzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2pheGJpbmRleC9KYXhiSW5kZXhSZXNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YkluZGV4UmVzb3VyY2UKLQkJZXh0ZW5kcyBKcHRSZXNvdXJjZU1vZGVsIHsKLQkKLQlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLQkKLQlJdGVyYWJsZTxTdHJpbmc+IGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lcygpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF4YnByb3BzL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Jlc291cmNlL2pheGJwcm9wcy9KYXhiUHJvcGVydGllc1Jlc291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDkzMWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvcmVzb3VyY2UvamF4YnByb3BzL0pheGJQcm9wZXJ0aWVzUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJQcm9wZXJ0aWVzUmVzb3VyY2UKLQkJZXh0ZW5kcyBKcHRSZXNvdXJjZU1vZGVsIHsKLQkKLQlTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKTsKLQkKLQlTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWFNETm9kZVZpc2l0b3IuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9YU0ROb2RlVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWM3YTQyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9YU0ROb2RlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0KLQotcHVibGljIGNsYXNzIFhTRE5vZGVWaXNpdG9yIHsKLQkKLQlwcml2YXRlIFN0YWNrPFhTRENvbXBvbmVudD4gdmlzaXRlZE5vZGVTdGFjayA9IG5ldyBTdGFjazxYU0RDb21wb25lbnQ+KCk7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlzaXRDaGlsZHJlbiA9IHRydWU7Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmlzaXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIHRoaXMudmlzaXRDaGlsZHJlbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXROb2RlKFhTRENvbXBvbmVudCBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgISB2aXNpdGVkTm9kZVN0YWNrLmNvbnRhaW5zKG5vZGUpKSB7Ci0JCQl2aXNpdGVkTm9kZVN0YWNrLnB1c2gobm9kZSk7Ci0JCQlYU0RTd2l0Y2ggeHNkU3dpdGNoID0gbmV3IFhTRFN3aXRjaCgpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbihvYmplY3QpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIE9iamVjdCBjYXNlWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24ob2JqZWN0KTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KSB7Ci0JCQkJCXZpc2l0WFNEQXR0cmlidXRlVXNlKG9iamVjdCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQl2aXNpdFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihvYmplY3QpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIE9iamVjdCBjYXNlWFNERWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24ob2JqZWN0KTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RNb2RlbEdyb3VwKG9iamVjdCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgT2JqZWN0IGNhc2VYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiBvYmplY3QpIHsKLQkJCQkJdmlzaXRYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbihvYmplY3QpOwotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIE9iamVjdCBjYXNlWFNEUGFydGljbGUoWFNEUGFydGljbGUgb2JqZWN0KSB7Ci0JCQkJCXZpc2l0WFNEUGFydGljbGUob2JqZWN0KTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQl2aXNpdFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCQl4c2RTd2l0Y2guZG9Td2l0Y2gobm9kZSk7Ci0JCQl2aXNpdGVkTm9kZVN0YWNrLnBvcCgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZpc2l0WFNEQXR0cmlidXRlRGVjbGFyYXRpb24oWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gbm9kZSkge30KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gbm9kZSkgewotCQlpZiAodmlzaXRDaGlsZHJlbigpKSB7Ci0JCQlmb3IgKFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlIDogbm9kZS5nZXRBdHRyaWJ1dGVVc2VzKCkpIHsKLQkJCQl2aXNpdE5vZGUoYXR0clVzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RBdHRyaWJ1dGVVc2UoWFNEQXR0cmlidXRlVXNlIG5vZGUpIHt9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0QmFzZVR5cGUoKSAhPSBudWxsKSB7Ci0JCQl2aXNpdE5vZGUobm9kZS5nZXRCYXNlVHlwZSgpKTsKLQkJfQotCQkKLQkJaWYgKHZpc2l0Q2hpbGRyZW4oKSkgewotCQkJZm9yIChYU0RBdHRyaWJ1dGVVc2UgYXR0clVzZSA6IG5vZGUuZ2V0QXR0cmlidXRlVXNlcygpKSB7Ci0JCQkJdmlzaXROb2RlKGF0dHJVc2UpOwotCQkJfQotCQkJCi0JCQlpZiAobm9kZS5nZXRDb250ZW50KCkgIT0gbnVsbCkgewotCQkJCXZpc2l0Tm9kZShub2RlLmdldENvbnRlbnQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJZm9yIChYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA6IG5vZGUuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKSkgewotCQkJdmlzaXROb2RlKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlpZiAodmlzaXRDaGlsZHJlbigpKSB7Ci0JCQlpZiAobm9kZS5nZXRUeXBlRGVmaW5pdGlvbigpICE9IG51bGwpIHsKLQkJCQl2aXNpdE5vZGUobm9kZS5nZXRUeXBlRGVmaW5pdGlvbigpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBub2RlKSB7Ci0JCWlmICh2aXNpdENoaWxkcmVuKCkpIHsKLQkJCWZvciAoWFNEUGFydGljbGUgcGFydGljbGUgOiBub2RlLmdldFBhcnRpY2xlcygpKSB7Ci0JCQkJdmlzaXROb2RlKHBhcnRpY2xlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2aXNpdFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0TW9kZWxHcm91cCgpICE9IG51bGwpIHsKLQkJCXZpc2l0Tm9kZShub2RlLmdldE1vZGVsR3JvdXAoKSk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdmlzaXRYU0RQYXJ0aWNsZShYU0RQYXJ0aWNsZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldFRlcm0oKSAhPSBudWxsKSB7Ci0JCQl2aXNpdE5vZGUobm9kZS5nZXRUZXJtKCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHZpc2l0WFNEU2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbm9kZSkgewotCQlpZiAobm9kZS5nZXRCYXNlVHlwZSgpICE9IG51bGwpIHsKLQkJCXZpc2l0Tm9kZShub2RlLmdldEJhc2VUeXBlKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1NGFhMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYc2RBdHRyaWJ1dGVEZWNsYXJhdGlvbgotCQlleHRlbmRzIFhzZEZlYXR1cmU8WFNEQXR0cmlidXRlRGVjbGFyYXRpb24+IHsKLQkKLQlYc2RBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiB4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbikgewotCQlzdXBlcih4c2RBdHRyaWJ1dGVEZWNsYXJhdGlvbik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXRUeXBlKCkgewotCQlYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlID0gZ2V0WFNEQ29tcG9uZW50KCkuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHhzZFR5cGUgPT0gbnVsbCkgPyBudWxsIDogKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkVHlwZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSkgewotCQlyZXR1cm4gZ2V0VHlwZSgpLnR5cGVJc1ZhbGlkKHhzZFR5cGUsIGlzSXRlbVR5cGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZlYjFiMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgWHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uCi0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbj4gewotCQotCVhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24geHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKSB7Ci0JCXN1cGVyKHhzZEF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEF0dHJpYnV0ZVVzZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEF0dHJpYnV0ZVVzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTljZmQzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RBdHRyaWJ1dGVVc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZVVzZTsKLQotCi1wdWJsaWMgY2xhc3MgWHNkQXR0cmlidXRlVXNlCi0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PFhTREF0dHJpYnV0ZVVzZT4gewotCQotCQotCVhzZEF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2UgeHNkQXR0cmlidXRlVXNlKSB7Ci0JCXN1cGVyKHhzZEF0dHJpYnV0ZVVzZSk7Ci0JfQotCQotCQotCXB1YmxpYyBYc2RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpIHsKLQkJWFNEQXR0cmlidXRlRGVjbGFyYXRpb24geHNkQXR0cmlidXRlID0gZ2V0WFNEQ29tcG9uZW50KCkuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKTsKLQkJcmV0dXJuICh4c2RBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogKFhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkQXR0cmlidXRlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjE1MDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZENvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYc2RDb21wbGV4VHlwZURlZmluaXRpb24KLQkJZXh0ZW5kcyBYc2RUeXBlRGVmaW5pdGlvbjxYU0RDb21wbGV4VHlwZURlZmluaXRpb24+IHsKLQkKLQlYc2RDb21wbGV4VHlwZURlZmluaXRpb24oWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uIHhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbikgewotCQlzdXBlcih4c2RDb21wbGV4VHlwZURlZmluaXRpb24pOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVHlwZURlZmluaXRpb24uS2luZCBnZXRLaW5kKCkgewotCQlyZXR1cm4gS2luZC5DT01QTEVYOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWHNkQXR0cmlidXRlVXNlIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKFhzZEF0dHJpYnV0ZVVzZSBhdHRyVXNlIDogZ2V0QXR0cmlidXRlVXNlcyhuYW1lc3BhY2UpKSB7Ci0JCQlpZiAoYXR0clVzZS5nZXRYU0RDb21wb25lbnQoKS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0clVzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WHNkQXR0cmlidXRlVXNlLCBTdHJpbmc+KGdldEF0dHJpYnV0ZVVzZXMobmFtZXNwYWNlKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShYc2RBdHRyaWJ1dGVVc2UgYXR0clVzZSkgewotCQkJCQkJCXJldHVybiBhdHRyVXNlLmdldFhTRENvbXBvbmVudCgpLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotCQkJCQkJfQotCQkJCQl9LAotCQkJCQlmaWx0ZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhzZEF0dHJpYnV0ZVVzZT4gZ2V0QXR0cmlidXRlVXNlcyhmaW5hbCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RBdHRyaWJ1dGVVc2UsIFhzZEF0dHJpYnV0ZVVzZT4oCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFhTREF0dHJpYnV0ZVVzZT4oZ2V0WFNEQ29tcG9uZW50KCkuZ2V0QXR0cmlidXRlVXNlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoWFNEQXR0cmlidXRlVXNlIGF0dHJVc2UpIHsKLQkJCQkJCXJldHVybiBYc2RVdGlsLm5hbWVzcGFjZUVxdWFscyhhdHRyVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCksIG5hbWVzcGFjZSk7Ci0JCQkJCX0KLQkJCQl9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RBdHRyaWJ1dGVVc2UgdHJhbnNmb3JtKFhTREF0dHJpYnV0ZVVzZSBhdHRyVXNlKSB7Ci0JCQkJcmV0dXJuIChYc2RBdHRyaWJ1dGVVc2UpIFhzZFV0aWwuZ2V0QWRhcHRlcihhdHRyVXNlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhzZEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbikgewotCQlmb3IgKFhzZEVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50IDogZ2V0RWxlbWVudERlY2xhcmF0aW9ucyhuYW1lc3BhY2UsIHJlY3Vyc2VDaGlsZHJlbikpIHsKLQkJCWlmIChlbGVtZW50LmdldFhTRENvbXBvbmVudCgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlIGdldEVsZW1lbnROYW1lUHJvcG9zYWxzKFN0cmluZyBuYW1lc3BhY2UsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgYm9vbGVhbiByZWN1cnNlQ2hpbGRyZW4pIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WHNkRWxlbWVudERlY2xhcmF0aW9uLCBTdHJpbmc+KGdldEVsZW1lbnREZWNsYXJhdGlvbnMobmFtZXNwYWNlLCByZWN1cnNlQ2hpbGRyZW4pKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFhzZEVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KSB7Ci0JCQkJCQkJcmV0dXJuIGVsZW1lbnQuZ2V0WFNEQ29tcG9uZW50KCkuZ2V0TmFtZSgpOwotCQkJCQkJfQotCQkJCQl9LAotCQkJCQlmaWx0ZXIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhzZEVsZW1lbnREZWNsYXJhdGlvbj4gZ2V0RWxlbWVudERlY2xhcmF0aW9ucyhmaW5hbCBTdHJpbmcgbmFtZXNwYWNlLCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNERWxlbWVudERlY2xhcmF0aW9uLCBYc2RFbGVtZW50RGVjbGFyYXRpb24+KAotCQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxYU0RFbGVtZW50RGVjbGFyYXRpb24+KGdldFhTREVsZW1lbnREZWNsYXJhdGlvbnMocmVjdXJzZUNoaWxkcmVuKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KSB7Ci0JCQkJCQlyZXR1cm4gWHNkVXRpbC5uYW1lc3BhY2VFcXVhbHMoZWxlbWVudCwgbmFtZXNwYWNlKTsKLQkJCQkJfQotCQkJCX0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFhzZEVsZW1lbnREZWNsYXJhdGlvbiB0cmFuc2Zvcm0oWFNERWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gKFhzZEVsZW1lbnREZWNsYXJhdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WFNERWxlbWVudERlY2xhcmF0aW9uPiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb25zKGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuKSB7Ci0JCUVsZW1lbnRGaW5kZXIgZWxlbWVudEZpbmRlciA9IG5ldyBFbGVtZW50RmluZGVyKHJlY3Vyc2VDaGlsZHJlbik7Ci0JCWVsZW1lbnRGaW5kZXIudmlzaXROb2RlKGdldFhTRENvbXBvbmVudCgpKTsKLQkJcmV0dXJuIGVsZW1lbnRGaW5kZXIuZ2V0RWxlbWVudHMoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBFbGVtZW50RmluZGVyCi0JCQlleHRlbmRzIFhTRE5vZGVWaXNpdG9yIHsKLQkJCi0JCXByaXZhdGUgYm9vbGVhbiByZWN1cnNlQ2hpbGRyZW47Ci0JCQotCQlwcml2YXRlIExpc3Q8WFNERWxlbWVudERlY2xhcmF0aW9uPiBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3Q8WFNERWxlbWVudERlY2xhcmF0aW9uPigpOwotCQkKLQkJCi0JCXByaXZhdGUgRWxlbWVudEZpbmRlcihib29sZWFuIHJlY3Vyc2VDaGlsZHJlbikgewotCQkJdGhpcy5yZWN1cnNlQ2hpbGRyZW4gPSByZWN1cnNlQ2hpbGRyZW47Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdmlzaXRDaGlsZHJlbigpIHsKLQkJCXJldHVybiBzdXBlci52aXNpdENoaWxkcmVuKCkgfHwgdGhpcy5yZWN1cnNlQ2hpbGRyZW47Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB2aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gbm9kZSkgewotCQkJYm9vbGVhbiBjYWNoZWRWaXNpdENoaWxkcmVuID0gdGhpcy52aXNpdENoaWxkcmVuOwotCQkJdGhpcy52aXNpdENoaWxkcmVuID0gZmFsc2U7Ci0JCQlzdXBlci52aXNpdFhTREVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQkJCWlmICghIHRoaXMuZWxlbWVudHMuY29udGFpbnMobm9kZSkpIHsKLQkJCQllbGVtZW50cy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQl0aGlzLnZpc2l0Q2hpbGRyZW4gPSBjYWNoZWRWaXNpdENoaWxkcmVuOwotCQl9Ci0JCQotCQlwdWJsaWMgSXRlcmFibGU8WFNERWxlbWVudERlY2xhcmF0aW9uPiBnZXRFbGVtZW50cygpIHsKLQkJCXJldHVybiB0aGlzLmVsZW1lbnRzOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZENvbXBvbmVudC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZENvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjdmZWM0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RDb21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLQotCi1wdWJsaWMgY2xhc3MgWHNkQ29tcG9uZW50PEEgZXh0ZW5kcyBYU0RDb25jcmV0ZUNvbXBvbmVudD4KLQkJZXh0ZW5kcyBBZGFwdGVySW1wbCB7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIEEgeHNkQ29tcG9uZW50OwotCQotCQotCXByb3RlY3RlZCBYc2RDb21wb25lbnQoQSB4c2RDb21wb25lbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy54c2RDb21wb25lbnQgPSB4c2RDb21wb25lbnQ7Ci0JfQotCQotCQotCXB1YmxpYyBBIGdldFhTRENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHRoaXMueHNkQ29tcG9uZW50OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFhzZFV0aWwuYWRhcHRlckZhY3Rvcnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZEVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk1NzJmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RFbGVtZW50RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotCi0vKioKLSAqIEFkZHMgQVBJIHRvIHtAbGluayBYU0RFbGVtZW50RGVjbGFyYXRpb259LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBYc2RFbGVtZW50RGVjbGFyYXRpb24KLQkJZXh0ZW5kcyBYc2RGZWF0dXJlPFhTREVsZW1lbnREZWNsYXJhdGlvbj4gewotCQotCVhzZEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCXN1cGVyKHhzZEVsZW1lbnREZWNsYXJhdGlvbik7Ci0JfQotCQotCQotCXB1YmxpYyBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gZ2V0WFNERmVhdHVyZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0VHlwZSgpIHsKLQkJWFNEVHlwZURlZmluaXRpb24geHNkVHlwZSA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiAoeHNkVHlwZSA9PSBudWxsKSA/IG51bGwgOiAoWHNkVHlwZURlZmluaXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcih4c2RUeXBlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdHlwZUlzVmFsaWQoWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSwgYm9vbGVhbiBpc0l0ZW1UeXBlKSB7Ci0JCVhTREVsZW1lbnREZWNsYXJhdGlvbiB4c2RFbGVtZW50ID0gZ2V0WFNEQ29tcG9uZW50KCk7Ci0JCWJvb2xlYW4gYWxsb3dFeHRlbnNpb24gPSB0cnVlOwotCQlib29sZWFuIGFsbG93UmVzdHJpY3Rpb24gPSB0cnVlOwotCQlYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkU3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiA9IHhzZEVsZW1lbnQuZ2V0U3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbigpOwotCQlpZiAoeHNkU3Vic3RpdHV0aW9uR3JvdXBBZmZpbGlhdGlvbiAhPSBudWxsKSB7Ci0JCQlFTGlzdDxYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnM+IHhzZFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucyAKLQkJCQkJPSB4c2RTdWJzdGl0dXRpb25Hcm91cEFmZmlsaWF0aW9uLmdldFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucygpOwotCQkJYWxsb3dFeHRlbnNpb24gPSAhIHhzZFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucy5jb250YWlucyhYU0RTdWJzdGl0dXRpb25Hcm91cEV4Y2x1c2lvbnMuRVhURU5TSU9OX0xJVEVSQUwpOwotCQkJYWxsb3dSZXN0cmljdGlvbiA9ICEgeHNkU3Vic3RpdHV0aW9uR3JvdXBFeGNsdXNpb25zLmNvbnRhaW5zKFhTRFN1YnN0aXR1dGlvbkdyb3VwRXhjbHVzaW9ucy5SRVNUUklDVElPTl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZ2V0VHlwZSgpLnR5cGVJc1ZhbGlkKHhzZFR5cGUsIGlzSXRlbVR5cGUsIGFsbG93RXh0ZW5zaW9uLCBhbGxvd1Jlc3RyaWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFhzZEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCVhzZFR5cGVEZWZpbml0aW9uIHR5cGUgPSBnZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBudWxsKSA/IG51bGwgOiB0eXBlLmdldEVsZW1lbnQobmFtZXNwYWNlLCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RWxlbWVudE5hbWVQcm9wb3NhbHMoU3RyaW5nIG5hbWVzcGFjZSwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBnZXRUeXBlKCkuZ2V0RWxlbWVudE5hbWVQcm9wb3NhbHMobmFtZXNwYWNlLCBmaWx0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RGZWF0dXJlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBmNjlkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREZlYXR1cmU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhzZEZlYXR1cmU8QSBleHRlbmRzIFhTREZlYXR1cmU+Ci0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PEE+IHsKLQkKLQlwcm90ZWN0ZWQgWHNkRmVhdHVyZShBIHhzZEZlYXR1cmUpIHsKLQkJc3VwZXIoeHNkRmVhdHVyZSk7Ci0JfQotCQotCQotCXB1YmxpYyBBIGdldFhTREZlYXR1cmUoKSB7Ci0JCXJldHVybiBnZXRYU0RDb21wb25lbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0WFNERmVhdHVyZSgpLmdldE5hbWUoKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFhzZFR5cGVEZWZpbml0aW9uIGdldFR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc2NoZW1hIHR5cGUgaXMgdmFsaWQgd2l0aGluIHRoZSBmZWF0dXJlCi0JICogQHBhcmFtIGlzSXRlbVR5cGUgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB4c2RUeXBlIHNob3VsZCBpbnN0ZWFkIGJlIHRyZWF0ZWQgYXMgYW4gaXRlbSB0eXBlCi0JICogICB3aXRoaW4gYSBsaXN0Ci0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gdHlwZUlzVmFsaWQoWHNkVHlwZURlZmluaXRpb24geHNkVHlwZSwgYm9vbGVhbiBpc0l0ZW1UeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RNb2RlbEdyb3VwLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkTW9kZWxHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2RhMDdiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RNb2RlbEdyb3VwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci0KLQotcHVibGljIGNsYXNzIFhzZE1vZGVsR3JvdXAKLQkJZXh0ZW5kcyBYc2RDb21wb25lbnQ8WFNETW9kZWxHcm91cD4gewotCQotCVhzZE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCB4c2RNb2RlbEdyb3VwKSB7Ci0JCXN1cGVyKHhzZE1vZGVsR3JvdXApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOWMyYTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYc2RNb2RlbEdyb3VwRGVmaW5pdGlvbgotCQlleHRlbmRzIFhzZENvbXBvbmVudDxYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbj4gewotCQotCVhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKSB7Ci0JCXN1cGVyKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFBhcnRpY2xlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkUGFydGljbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiYmY5Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkUGFydGljbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGU7Ci0KLQotcHVibGljIGNsYXNzIFhzZFBhcnRpY2xlCi0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PFhTRFBhcnRpY2xlPiB7Ci0KLQlYc2RQYXJ0aWNsZShYU0RQYXJ0aWNsZSB4c2RQYXJ0aWNsZSkgewotCQlzdXBlcih4c2RQYXJ0aWNsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFNjaGVtYS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFNjaGVtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmMzMWQwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RTY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU25hcHNob3RDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RVdGlsOwotCi1wdWJsaWMgY2xhc3MgWHNkU2NoZW1hCi0JCWV4dGVuZHMgWHNkQ29tcG9uZW50PFhTRFNjaGVtYT4gewotCQotCVhzZFNjaGVtYShYU0RTY2hlbWEgeHNkU2NoZW1hKSB7Ci0JCXN1cGVyKHhzZFNjaGVtYSk7Ci0JfQotCQotCQotCXB1YmxpYyBYU0RTY2hlbWEgZ2V0WFNEU2NoZW1hKCkgewotCQlyZXR1cm4gZ2V0WFNEQ29tcG9uZW50KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZXMoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZShnZXRYU0RTY2hlbWEoKS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCkudmFsdWVzKCkpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRYU0RTY2hlbWEoKS5nZXRUYXJnZXROYW1lc3BhY2UoKSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KCIiLCByZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxYc2RUeXBlRGVmaW5pdGlvbj4gZ2V0QWxsVHlwZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24sIFhzZFR5cGVEZWZpbml0aW9uPihnZXRBbGxYU0RUeXBlRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgWHNkVHlwZURlZmluaXRpb24gdHJhbnNmb3JtKFhTRFR5cGVEZWZpbml0aW9uIG8pIHsKLQkJCQlyZXR1cm4gKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIobyk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxYc2RUeXBlRGVmaW5pdGlvbj4gZ2V0RGVjbGFyZWRUeXBlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RUeXBlRGVmaW5pdGlvbiwgWHNkVHlwZURlZmluaXRpb24+KGdldERlY2xhcmVkWFNEVHlwZURlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFhzZFR5cGVEZWZpbml0aW9uIHRyYW5zZm9ybShYU0RUeXBlRGVmaW5pdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIChYc2RUeXBlRGVmaW5pdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKG8pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8WHNkVHlwZURlZmluaXRpb24+IGdldEJ1aWx0SW5UeXBlRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RUeXBlRGVmaW5pdGlvbiwgWHNkVHlwZURlZmluaXRpb24+KGdldEJ1aWx0SW5YU0RUeXBlRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgWHNkVHlwZURlZmluaXRpb24gdHJhbnNmb3JtKFhTRFR5cGVEZWZpbml0aW9uIG8pIHsKLQkJCQlyZXR1cm4gKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIobyk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxYc2RUeXBlRGVmaW5pdGlvbj4gZ2V0VHlwZURlZmluaXRpb25zKGZpbmFsIFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhTRFR5cGVEZWZpbml0aW9uLCBYc2RUeXBlRGVmaW5pdGlvbj4oZ2V0WFNEVHlwZURlZmluaXRpb25zKG5hbWVzcGFjZSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFhzZFR5cGVEZWZpbml0aW9uIHRyYW5zZm9ybShYU0RUeXBlRGVmaW5pdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIChYc2RUeXBlRGVmaW5pdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKG8pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8WHNkU2ltcGxlVHlwZURlZmluaXRpb24+IGdldFNpbXBsZVR5cGVEZWZpbml0aW9ucyhmaW5hbCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgWHNkU2ltcGxlVHlwZURlZmluaXRpb24+KAotCQkJCWdldFhTRFNpbXBsZVR5cGVEZWZpbml0aW9ucyhuYW1lc3BhY2UpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0cmFuc2Zvcm0oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbykgewotCQkJCXJldHVybiAoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihvKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLyoqCi0JICogYnkgZGVmYXVsdCwgcmV0dXJuIGEgdHlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCB0aGUgc2NoZW1hJ3MgdGFyZ2V0IG5hbWVzcGFjZQotCSAqLwotCXB1YmxpYyBYc2RUeXBlRGVmaW5pdGlvbiBnZXRUeXBlRGVmaW5pdGlvbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0VHlwZURlZmluaXRpb24oZ2V0WFNEQ29tcG9uZW50KCkuZ2V0VGFyZ2V0TmFtZXNwYWNlKCksIG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgWHNkVHlwZURlZmluaXRpb24gZ2V0VHlwZURlZmluaXRpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChYU0RUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA6IGdldFhTRFR5cGVEZWZpbml0aW9ucyhuYW1lc3BhY2UpKSB7Ci0JCQlpZiAoWHNkVXRpbC5uYW1lc3BhY2VFcXVhbHModHlwZURlZmluaXRpb24sIG5hbWVzcGFjZSkgJiYgdHlwZURlZmluaXRpb24uZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiAoWHNkVHlwZURlZmluaXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcih0eXBlRGVmaW5pdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxYU0RUeXBlRGVmaW5pdGlvbj4gZ2V0QWxsWFNEVHlwZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFhTRFR5cGVEZWZpbml0aW9uPigKLQkJCQlnZXREZWNsYXJlZFhTRFR5cGVEZWZpbml0aW9ucygpLCBnZXRCdWlsdEluWFNEVHlwZURlZmluaXRpb25zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24+IGdldERlY2xhcmVkWFNEVHlwZURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZShnZXRYU0RTY2hlbWEoKS5nZXRUeXBlRGVmaW5pdGlvbnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxYU0RUeXBlRGVmaW5pdGlvbj4gZ2V0QnVpbHRJblhTRFR5cGVEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTbmFwc2hvdENsb25lSXRlcmFibGUoZ2V0WFNEU2NoZW1hKCkuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb25zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24+IGdldFhTRFR5cGVEZWZpbml0aW9ucyhmaW5hbCBTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCWlmIChYU0RVdGlsLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0JCQlyZXR1cm4gZ2V0QnVpbHRJblhTRFR5cGVEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24+KGdldERlY2xhcmVkWFNEVHlwZURlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFhTRFR5cGVEZWZpbml0aW9uIG8pIHsKLQkJCQlyZXR1cm4gWHNkVXRpbC5uYW1lc3BhY2VFcXVhbHMobywgbmFtZXNwYWNlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uPiBnZXRYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbnMoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNEVHlwZURlZmluaXRpb24sIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uPigKLQkJCW5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxYU0RUeXBlRGVmaW5pdGlvbj4oZ2V0WFNEVHlwZURlZmluaXRpb25zKG5hbWVzcGFjZSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoWFNEVHlwZURlZmluaXRpb24gbykgewotCQkJCQlyZXR1cm4gbyBpbnN0YW5jZW9mIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotCQkJCX0KLQkJCX0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHRyYW5zZm9ybShYU0RUeXBlRGVmaW5pdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIChYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikgbzsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFhzZEVsZW1lbnREZWNsYXJhdGlvbj4gZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhTREVsZW1lbnREZWNsYXJhdGlvbiwgWHNkRWxlbWVudERlY2xhcmF0aW9uPihnZXRYU0RFbGVtZW50RGVjbGFyYXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFhzZEVsZW1lbnREZWNsYXJhdGlvbiB0cmFuc2Zvcm0oWFNERWxlbWVudERlY2xhcmF0aW9uIG8pIHsKLQkJCQlyZXR1cm4gKFhzZEVsZW1lbnREZWNsYXJhdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKG8pOwotCQkJfQotCQl9OwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8WHNkRWxlbWVudERlY2xhcmF0aW9uPiBnZXRFbGVtZW50RGVjbGFyYXRpb25zKGZpbmFsIFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhTREVsZW1lbnREZWNsYXJhdGlvbiwgWHNkRWxlbWVudERlY2xhcmF0aW9uPigKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8WFNERWxlbWVudERlY2xhcmF0aW9uPihnZXRYU0RFbGVtZW50RGVjbGFyYXRpb25zKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChYU0RFbGVtZW50RGVjbGFyYXRpb24gbykgewotCQkJCQkJcmV0dXJuIFhzZFV0aWwubmFtZXNwYWNlRXF1YWxzKG8sIG5hbWVzcGFjZSk7Ci0JCQkJCX0KLQkJCQl9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RFbGVtZW50RGVjbGFyYXRpb24gdHJhbnNmb3JtKFhTREVsZW1lbnREZWNsYXJhdGlvbiBvKSB7Ci0JCQkJcmV0dXJuIChYc2RFbGVtZW50RGVjbGFyYXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihvKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHVibGljIFhzZEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2xhcmF0aW9uIDogZ2V0WFNERWxlbWVudERlY2xhcmF0aW9ucygpKSB7Ci0JCQlpZiAoWHNkVXRpbC5uYW1lc3BhY2VFcXVhbHMoZWxlbWVudERlY2xhcmF0aW9uLCBuYW1lc3BhY2UpICYmIGVsZW1lbnREZWNsYXJhdGlvbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIChYc2RFbGVtZW50RGVjbGFyYXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihlbGVtZW50RGVjbGFyYXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WFNERWxlbWVudERlY2xhcmF0aW9uPiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZShnZXRYU0RTY2hlbWEoKS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5hbWVzcGFjZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPihnZXROYW1lc3BhY2VzKCksIGZpbHRlcikpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRUeXBlTmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WHNkVHlwZURlZmluaXRpb24sIFN0cmluZz4odGhpcy5nZXRUeXBlRGVmaW5pdGlvbnMobmFtZXNwYWNlKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShYc2RUeXBlRGVmaW5pdGlvbiBvKSB7Ci0JCQkJCQkJcmV0dXJuIG8uZ2V0TmFtZSgpOwotCQkJCQkJfQotCQkJCQl9LAotCQkJCQlmaWx0ZXIpKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U2ltcGxlVHlwZU5hbWVQcm9wb3NhbHMoU3RyaW5nIG5hbWVzcGFjZSwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgU3RyaW5nPih0aGlzLmdldFNpbXBsZVR5cGVEZWZpbml0aW9ucyhuYW1lc3BhY2UpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oWHNkU2ltcGxlVHlwZURlZmluaXRpb24gbykgewotCQkJCQkJCQlyZXR1cm4gby5nZXROYW1lKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSwKLQkJCQkJCWZpbHRlcikpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRFbGVtZW50TmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFhzZEVsZW1lbnREZWNsYXJhdGlvbiwgU3RyaW5nPih0aGlzLmdldEVsZW1lbnREZWNsYXJhdGlvbnMobmFtZXNwYWNlKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFhzZEVsZW1lbnREZWNsYXJhdGlvbiBvKSB7Ci0JCQkJCQkJCXJldHVybiBvLmdldE5hbWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9LAotCQkJCQkJZmlsdGVyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFNpbXBsZVR5cGVEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkU2ltcGxlVHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM3Yjg4MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkU2ltcGxlVHlwZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVmFyaWV0eTsKLQotCi1wdWJsaWMgY2xhc3MgWHNkU2ltcGxlVHlwZURlZmluaXRpb24KLQkJZXh0ZW5kcyBYc2RUeXBlRGVmaW5pdGlvbjxYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbj4gewotCQotCVhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKSB7Ci0JCXN1cGVyKHhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFR5cGVEZWZpbml0aW9uLktpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIEtpbmQuU0lNUExFOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYWxpZChYc2RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlLCBib29sZWFuIGlzSXRlbVR5cGUsIGJvb2xlYW4gYWxsb3dFeHRlbnNpb24sIGJvb2xlYW4gYWxsb3dSZXN0cmljdGlvbikgewotCQlpZiAoaXNJdGVtVHlwZSkgewotCQkJWHNkU2ltcGxlVHlwZURlZmluaXRpb24gaXRlbVR5cGUgPSBnZXRJdGVtVHlwZSgpOwotCQkJcmV0dXJuIChpdGVtVHlwZSA9PSBudWxsKSA/IGZhbHNlIDogaXRlbVR5cGUudHlwZUlzVmFsaWQoeHNkVHlwZSwgZmFsc2UsIGFsbG93RXh0ZW5zaW9uLCBhbGxvd1Jlc3RyaWN0aW9uKTsKLQkJfQotCQlpZiAoZ2V0WFNEQ29tcG9uZW50KCkuZ2V0VmFyaWV0eSgpID09IFhTRFZhcmlldHkuVU5JT05fTElURVJBTCkgewotCQkJaWYgKFhzZFV0aWwuZ2V0U2NoZW1hRm9yU2NoZW1hKCkuZ2V0VHlwZURlZmluaXRpb24oInN0cmluZyIpLnR5cGVJc1ZhbGlkKHhzZFR5cGUsIGlzSXRlbVR5cGUsIGFsbG93RXh0ZW5zaW9uLCBhbGxvd1Jlc3RyaWN0aW9uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci50eXBlSXNWYWxpZCh4c2RUeXBlLCBpc0l0ZW1UeXBlLCBhbGxvd0V4dGVuc2lvbiwgYWxsb3dSZXN0cmljdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIElmIHRoZSB0eXBlIGlzIG9mIHZhcmlldHkgTElTVCwgdGhpcyB3aWxsIHJldHVybiB0aGUgaXRlbSB0eXBlIG9mIHRoZSBsaXN0Ci0JICovCi0JcHVibGljIFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uIGdldEl0ZW1UeXBlKCkgewotCQlYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiB4c2RJdGVtVHlwZSA9IGdldFhTRENvbXBvbmVudCgpLmdldEl0ZW1UeXBlRGVmaW5pdGlvbigpOwotCQlyZXR1cm4gKHhzZEl0ZW1UeXBlID09IG51bGwpID8gbnVsbCA6IChYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbikgWHNkVXRpbC5nZXRBZGFwdGVyKHhzZEl0ZW1UeXBlKTsKLQl9Ci0JCi0JLyoqCi0JICogSWYgdGhlIHR5cGUgaXMgb2YgdmFyaWV0eSBVTklPTiwgdGhpcyB3aWxsIHJldHVybiB0aGUgbWVtYmVyIHR5cGVzIG9mIHRoZSB1bmlvbgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbj4gZ2V0TWVtYmVyVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiwgWHNkU2ltcGxlVHlwZURlZmluaXRpb24+KAotCQkJCWdldFhTRENvbXBvbmVudCgpLmdldE1lbWJlclR5cGVEZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBYc2RTaW1wbGVUeXBlRGVmaW5pdGlvbiB0cmFuc2Zvcm0oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gbykgewotCQkJCXJldHVybiAoWHNkU2ltcGxlVHlwZURlZmluaXRpb24pIFhzZFV0aWwuZ2V0QWRhcHRlcihvKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhzZEF0dHJpYnV0ZVVzZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gc2ltcGxlIHR5cGVzIGhhdmUgbm8gYXR0cmlidXRlcwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJLy8gc2ltcGxlIHR5cGVzIGhhdmUgbm8gYXR0cmlidXRlcwotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWHNkRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuKSB7Ci0JCS8vIHNpbXBsZSB0eXBlcyBoYXZlIG5vIGVsZW1lbnRzCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRFbGVtZW50TmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIGJvb2xlYW4gcmVjdXJzZUNoaWxkcmVuKSB7Ci0JCS8vIHNpbXBsZSB0eXBlcyBoYXZlIG5vIGVsZW1lbnRzCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEVudW1WYWx1ZVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscygKLQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPigKLQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8WFNERW51bWVyYXRpb25GYWNldCwgU3RyaW5nPihnZXRYU0RDb21wb25lbnQoKS5nZXRFbnVtZXJhdGlvbkZhY2V0cygpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0KSB7Ci0JCQkJCQkJcmV0dXJuIGVudW1GYWNldC5nZXRMZXhpY2FsVmFsdWUoKTsKLQkJCQkJCX0KLQkJCQkJfSwKLQkJCQkJZmlsdGVyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFR5cGVEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkVHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU1MzY2My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS94c2QvWHNkVHlwZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogQWRkcyBBUEkgdG8ge0BsaW5rIFhTRFR5cGVEZWZpbml0aW9ufS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgWHNkVHlwZURlZmluaXRpb248QSBleHRlbmRzIFhTRFR5cGVEZWZpbml0aW9uPgotCQlleHRlbmRzIFhzZENvbXBvbmVudDxBPiB7Ci0JCi0JcHJvdGVjdGVkIFhzZFR5cGVEZWZpbml0aW9uKEEgeHNkVHlwZURlZmluaXRpb24pIHsKLQkJc3VwZXIoeHNkVHlwZURlZmluaXRpb24pOwotCX0KLQkKLQkKLQkvLyBmb3Igc29tZSByZWFzb24sIHRoZSBjb21waWxlciBpcyBub3QgcmVjb2duaXppbmcgdGhlIFhTRCBjb21wb25lbnQgb2YgdGhpcyB0eXBlIGFzIGV4dGVuZGluZwotCS8vIFhTRFR5cGVEZWZpbml0aW9uIHdpdGhvdXQgaW1wbGVtZW50aW5nIHRoaXMgbWV0aG9kLgotCUBPdmVycmlkZQotCXB1YmxpYyBBIGdldFhTRENvbXBvbmVudCgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFhTRENvbXBvbmVudCgpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgS2luZCBnZXRLaW5kKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0WFNEQ29tcG9uZW50KCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBYc2RVdGlsLm5hbWVzcGFjZUVxdWFscyhnZXRYU0RDb21wb25lbnQoKSwgbmFtZXNwYWNlKSAmJiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoZ2V0TmFtZSgpLCBuYW1lKTsgCi0JfQotCQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSkgewotCQlyZXR1cm4gdHlwZUlzVmFsaWQoeHNkVHlwZSwgaXNJdGVtVHlwZSwgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHR5cGVJc1ZhbGlkKFhzZFR5cGVEZWZpbml0aW9uIHhzZFR5cGUsIGJvb2xlYW4gaXNJdGVtVHlwZSwgYm9vbGVhbiBhbGxvd0V4dGVuc2lvbiwgYm9vbGVhbiBhbGxvd1Jlc3RyaWN0aW9uKSB7Ci0JCXJldHVybiBnZXRYU0RDb21wb25lbnQoKS5nZXRCYWRUeXBlRGVyaXZhdGlvbih4c2RUeXBlLmdldFhTRENvbXBvbmVudCgpLCBhbGxvd0V4dGVuc2lvbiwgYWxsb3dSZXN0cmljdGlvbikgPT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFhzZFR5cGVEZWZpbml0aW9uIGdldEJhc2VUeXBlKCkgewotCQlYU0RUeXBlRGVmaW5pdGlvbiB4c2RCYXNlVHlwZSA9IGdldFhTRENvbXBvbmVudCgpLmdldEJhc2VUeXBlKCk7Ci0JCXJldHVybiAoeHNkQmFzZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogKFhzZFR5cGVEZWZpbml0aW9uKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkQmFzZVR5cGUpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgWHNkQXR0cmlidXRlVXNlIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSk7Ci0JCi0JcHVibGljIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZVByb3Bvc2FscyhTdHJpbmcgbmFtZXNwYWNlLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpOwotCQotCXB1YmxpYyBYc2RFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0RWxlbWVudChuYW1lc3BhY2UsIG5hbWUsIGZhbHNlKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFhzZEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbik7Ci0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RWxlbWVudE5hbWVQcm9wb3NhbHMoU3RyaW5nIG5hbWVzcGFjZSwgRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50TmFtZVByb3Bvc2FscyhuYW1lc3BhY2UsIGZpbHRlciwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgSXRlcmFibGUgZ2V0RWxlbWVudE5hbWVQcm9wb3NhbHMoU3RyaW5nIG5hbWVzcGFjZSwgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBib29sZWFuIHJlY3Vyc2VDaGlsZHJlbik7Ci0JCi0JCi0JcHVibGljIGVudW0gS2luZCB7Ci0JCQotCQkvKioKLQkJICogQW4ge0BsaW5rIFhzZFR5cGVEZWZpbml0aW9ufSBvZiBTSU1QTEUge0BsaW5rIEtpbmR9IG1heSBzYWZlbHkgYmUgY2FzdCB0byBhbiB7QGxpbmsgWHNkU2ltcGxlVHlwZURlZmluaXRpb259Ci0JCSAqLwotCQlTSU1QTEUsCi0JCQotCQkvKioKLQkJICogQW4ge0BsaW5rIFhzZFR5cGVEZWZpbml0aW9ufSBvZiBDT01QTEVYIHtAbGluayBLaW5kfSBtYXkgc2FmZWx5IGJlIGNhc3QgdG8gYW4ge0BsaW5rIFhzZENvbXBsZXhUeXBlRGVmaW5pdGlvbn0KLQkJICovCi0JCUNPTVBMRVg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFV0aWwuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3hzZC9Yc2RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNTE5MWQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUveHNkL1hzZFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczoKLSAqICAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCQkoY29waWVkIG1haW5seSBmcm9tIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLlhTREltcGwpCi0gKiAgCU9yYWNsZSAtIGV4dGVuc2lvbnMgYW5kIG1vZGlmaWNhdGlvbnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLlhTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5hbWVkQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuaW1wbC5YU0RJbXBvcnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFNjaGVtYUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTd2l0Y2g7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyBmb3IgYnVpbGRpbmcgWFNEIG1vZGVsIGFuZCBpdHMgZXh0ZW5zaW9ucyBmb3IgSkFYQgotICovCi1wdWJsaWMgY2xhc3MgWHNkVXRpbCB7Ci0JCi0Jc3RhdGljIGZpbmFsIFhzZEFkYXB0ZXJGYWN0b3J5SW1wbCBhZGFwdGVyRmFjdG9yeSA9IG5ldyBYc2RBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbmFtZXNwYWNlRXF1YWxzKFhTRE5hbWVkQ29tcG9uZW50IGNvbXAsIFN0cmluZyBuYW1lc3BhY2UpIHsKLQkJU3RyaW5nIHhzZE5hbWVzcGFjZSA9IGNvbXAuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0JCXJldHVybiAoeHNkTmFtZXNwYWNlID09IG51bGwpID8gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lc3BhY2UpIDogeHNkTmFtZXNwYWNlLmVxdWFscyhuYW1lc3BhY2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvbHZlZFVyaShTdHJpbmcgbG9jYXRpb24pIHsKLQkJU3RyaW5nIHJlc29sdmVkVXJpID0gbnVsbDsKLQkJCi0JCUlDYXRhbG9nIGNhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQkKLQkJaWYgKCEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShsb2NhdGlvbikpIHsKLQkJCXRyeSB7Ci0JCQkJcmVzb2x2ZWRVcmkgPSBjYXRhbG9nLnJlc29sdmVTeXN0ZW0obG9jYXRpb24pOwotCQkJCWlmIChyZXNvbHZlZFVyaSA9PSBudWxsKSB7Ci0JCQkJCXJlc29sdmVkVXJpID0gY2F0YWxvZy5yZXNvbHZlVVJJKGxvY2F0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKHJlc29sdmVkVXJpID09IG51bGwpIHsKLQkJCQkJcmVzb2x2ZWRVcmkgPSBjYXRhbG9nLnJlc29sdmVQdWJsaWMobG9jYXRpb24sIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpIHsKLQkJCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2cobWUpOwotCQkJCXJlc29sdmVkVXJpID0gbnVsbDsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpZSkgewotCQkJCUpwdEpheGJDb3JlUGx1Z2luLmxvZyhpZSk7Ci0JCQkJcmVzb2x2ZWRVcmkgPSBudWxsOwotCQkJfQotCQl9Ci0JCQotCQkvLyBpZiByZXNvbHZlZFVyaSBpcyBudWxsLCBhc3N1bWUgdGhlIGxvY2F0aW9uIGlzIHJlc29sdmVkCi0JCXJldHVybiAocmVzb2x2ZWRVcmkgIT0gbnVsbCkgPyByZXNvbHZlZFVyaSA6IGxvY2F0aW9uOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIFhzZFNjaGVtYSBnZXRTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSkgewotCQlyZXR1cm4gKHhzZFNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiAoWHNkU2NoZW1hKSBYc2RVdGlsLmdldEFkYXB0ZXIoeHNkU2NoZW1hKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYc2RTY2hlbWEgZ2V0U2NoZW1hRm9yU2NoZW1hKCkgewotCQlyZXR1cm4gZ2V0U2NoZW1hKFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSkpOwotCX0KLQkKLQkvKioKLQkgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLQkgKiBjb3JyZXNwb25kaW5nIEVNRiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBYU0RTY2hlbWEgYnVpbGRYU0RNb2RlbChTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCVhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotCQkKLQkJLy8gaWYgWE1MIFNjaGVtYSBmb3IgU2NoZW1hIGlzIHJlcXVlc3RlZCwgZ2V0IGl0IHRocm91Z2ggc2NoZW1hIG1vZGVsIAotCQlpZiAodXJpU3RyaW5nLmVuZHNXaXRoKCIyMDAxL1hNTFNjaGVtYS54c2QiKSkgewotCQkJeHNkU2NoZW1hID0gWFNEU2NoZW1hSW1wbC5nZXRTY2hlbWFGb3JTY2hlbWEoWFNEQ29uc3RhbnRzLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxKTsJCQkKLQkJfQotCQllbHNlIHsgCQotCQkJUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0JCQlyZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkKLQkJCVVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHVyaVN0cmluZyk7ICAgCi0JCQkKLQkJCS8vIENTIDogYnVnIDExMzUzNyBlbnN1cmUgd2UgcGVyZm9ybSBwaHlzaWNhbCByZXNvbHV0aW9uIGJlZm9yZSBvcGVuaW5nIGEgc3RyZWFtIGZvciB0aGUgcmVzb3VyY2UKLQkJCVN0cmluZyBwaHlzaWNhbExvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgIiIsIHVyaVN0cmluZyk7Ci0JCQlYU0RSZXNvdXJjZUltcGwgcmVzb3VyY2UgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLmNyZWF0ZUlucHV0U3RyZWFtKFVSSS5jcmVhdGVVUkkocGh5c2ljYWxMb2NhdGlvbikpOwotCQkJCXJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbCkgcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0JCQkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7Ci0JCQkJcmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHNjaGVtYSBkb2VzIG5vdCBleGlzdCBvciBjYW5ub3QgYmUgcmVhZAotCQkJCS8vIHN3YWxsb3cgdGhlIGV4Y2VwdGlvbiwgYW5kIHJldHVybiBudWxsCi0JCQkJLy8gdGhlcmUgd2lsbCBiZSBwcm9qZWN0IHZhbGlkYXRpb24gdG8gY2FwdHVyZSB0aGlzIGVycm9yCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQl4c2RTY2hlbWEgPSByZXNvdXJjZS5nZXRTY2hlbWEoKTsgICAgICAKLQkJfQotCQloYW5kbGVJbXBvcnRzKHhzZFNjaGVtYSk7Ci0JCXJldHVybiB4c2RTY2hlbWE7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlSW1wb3J0cyhYU0RTY2hlbWEgeHNkU2NoZW1hKSB7Ci0JCWlmICh4c2RTY2hlbWEgIT0gbnVsbCkgewotCQkJZm9yIChYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgOiB4c2RTY2hlbWEuZ2V0Q29udGVudHMoKSkgewotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgWFNESW1wb3J0SW1wbCkgewotCQkJCQlYU0RJbXBvcnRJbXBsIGFuSW1wb3J0ID0gKFhTREltcG9ydEltcGwpIGNvbnRlbnQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoYW5JbXBvcnQuZ2V0U2NoZW1hTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJYW5JbXBvcnQuaW1wb3J0U2NoZW1hKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKcHRKYXhiQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QWRhcHRlcihOb3RpZmllciBub3RpZmllcikgewotCQlyZXR1cm4gYWRhcHRlckZhY3RvcnkuYWRhcHQobm90aWZpZXIpOwotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGUgRmFjdG9yeSBmb3IgdGhlIFhTRCBhZGFwdGVyIG1vZGVsLiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2gKLQkgKiBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgWHNkQWRhcHRlckZhY3RvcnlJbXBsCi0JCQlleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJCVhTRFN3aXRjaCB4c2RTd2l0Y2ggPSBuZXcgWFNEU3dpdGNoKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkU2NoZW1hKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZEF0dHJpYnV0ZURlY2xhcmF0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbihYU0RBdHRyaWJ1dGVHcm91cERlZmluaXRpb24gb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkQXR0cmlidXRlVXNlKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkQ29tcGxleFR5cGVEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTREVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gb2JqZWN0KSB7Ci0JCQkJCXJldHVybiBuZXcgWHNkRWxlbWVudERlY2xhcmF0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBvYmplY3QpIHsKLQkJCQkJcmV0dXJuIG5ldyBYc2RNb2RlbEdyb3VwKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFBhcnRpY2xlKFhTRFBhcnRpY2xlIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZFBhcnRpY2xlKG9iamVjdCk7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBPYmplY3QgY2FzZVhTRFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIG9iamVjdCkgewotCQkJCQlyZXR1cm4gbmV3IFhzZFNpbXBsZVR5cGVEZWZpbml0aW9uKG9iamVjdCk7Ci0JCQkJfQotCQkJfTsKLQkJCQotCQkJT2JqZWN0IG8gPSB4c2RTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpIHRhcmdldCk7Ci0JCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIEFkYXB0ZXIpIHsKLQkJCQlyZXN1bHQgPSAoQWRhcHRlcikgbzsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJCi0JCXB1YmxpYyBBZGFwdGVyIGFkYXB0KE5vdGlmaWVyIHRhcmdldCkgewotCQkJcmV0dXJuIGFkYXB0KHRhcmdldCwgdGhpcyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxMjNmYjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZTBlYjYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OGI5ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ0aXBzQW5kVHJpY2tzSHJlZiIgY29udGFpbnMgdGhlIEhlbHAgdG9waWMgaHJlZiB0byBhIHRpcHMgYW5kIHRyaWNrcyBwYWdlIAotIyBvcHRpb25hbAotdGlwc0FuZFRyaWNrc0hyZWY9L29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCi0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhjN2MwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDEwLCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YmQwM2EuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZGIyZDEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZhZDhhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIE1PWHkgKEpBWEIpIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8uY3ZzaWdub3JlIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4MmMzNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIwNDQ0NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDc6NTMgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTRlMTcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwuYmluZCwKLSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4sCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL2Fib3V0Lmh0bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgyPkFib3V0IFRoaXMgQ29udGVudDwvSDI+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgCi0gIG91dCBiZWxvdy4gSWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCAKLSAgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIAotICB0byB0aGUgUmVkaXN0cmlidXRvciYjODIxNztzIGxpY2Vuc2UgZm9yIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxoND48YSBuYW1lPSJKUEEiIGlkPSJKUEEiPjwvYT5KYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB2MS4wPC9oND4KLQotPGJsb2NrcXVvdGU+Ci0gIDxwPlRoZSBKYXZhIFBlcnNpc3RlbmNlIEFQSSAoSlBBKSB3aGljaCBpcyBkaXN0cmlidXRlZCB1bmRlciA8YSBocmVmPSJodHRwczovL2dsYXNzZmlzaC5kZXYuamF2YS5uZXQvcHVibGljL0NEREx2MS4wLmh0bWwiPkNEREwgCi0gICAgdjEuMDwvYT4gaXMgcmVxdWlyZWQgYnkgdGhlIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBQcm9qZWN0IGluIG9yZGVyIAotICAgIHRvIHN1cHBvcnQgdGhpcyBzdGFuZGFyZC48L3A+Ci08L2Jsb2NrcXVvdGU+Ci08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vYnVpbGQucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTM1YzYxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1NzQxMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKQVhCIFN1cHBvcnQgLSBTY2hlbWEgR2VuZXJhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vTWFpbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZTA1ZjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9NYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5iaW5kLlNjaGVtYU91dHB1dFJlc29sdmVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsLkpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5OwotCi0vKioKLSAqICBHZW5lcmF0ZSBhIEVjbGlwc2VMaW5rIEpBWEIgU2NoZW1hCi0gKiAgCi0gKiBDdXJyZW50IGNvbW1hbmQtbGluZSBhcmd1bWVudHM6Ci0gKiAgICAgWy1zIHNjaGVtYS54c2RdIC0gc3BlY2lmaWVzIHRoZSB0YXJnZXQgc2NoZW1hCi0gKiAgICAgWy1jIGNsYXNzTmFtZV0gLSBzcGVjaWZpZXMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJpdmF0ZSBTdHJpbmdbXSBzb3VyY2VDbGFzc05hbWVzOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldFNjaGVtYU5hbWU7Ci0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgTk9fRkFDVE9SWV9DTEFTUyA9ICJkb2VzbnQgY29udGFpbiBPYmplY3RGYWN0b3J5LmNsYXNzIjsgICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgQ0FOTk9UX0JFX0NBU1RfVE9fSkFYQkNPTlRFWFQgPSAiY2Fubm90IGJlIGNhc3QgdG8gb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dCI7ICAgLy8kTk9OLU5MUy0xJAotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQluZXcgTWFpbigpLmV4ZWN1dGUoYXJncyk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCXByaXZhdGUgTWFpbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKFN0cmluZ1tdIGFyZ3MpIHsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmdlbmVyYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotICAgIAl0aGlzLnNvdXJjZUNsYXNzTmFtZXMgPSB0aGlzLmdldFNvdXJjZUNsYXNzTmFtZXMoYXJncyk7Ci0gICAgCXRoaXMudGFyZ2V0U2NoZW1hTmFtZSA9IHRoaXMuZ2V0VGFyZ2V0U2NoZW1hTmFtZShhcmdzKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlKCkgewotICAgICAgICAvLyBDcmVhdGUgdGhlIEpBWEJDb250ZXh0Ci0gICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gdGhpcy5idWlsZEpheGJDb250ZXh0KCk7Ci0KLSAgICAgICAgLy8gR2VuZXJhdGUgYW4gWE1MIFNjaGVtYQotICAgICAgICBpZihqYXhiQ29udGV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmdlbmVyYXRlU2NoZW1hKGpheGJDb250ZXh0KTsKLQkJfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgCVRvb2xzLmJpbmQoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLlNDSEVNQV9OT1RfQ1JFQVRFRCwgdGhpcy50YXJnZXRTY2hlbWFOYW1lKTsKLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIEpBWEJDb250ZXh0IGJ1aWxkSmF4YkNvbnRleHQoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihUb29scy5nZXRTdHJpbmcoSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkxPQURJTkdfQ0xBU1NFUykpOwotICAgICAgICBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlDbGFzc0xvYWRlciBsb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCQkJCi0JCQlDbGFzc1tdIHNvdXJjZUNsYXNzZXMgPSB0aGlzLmJ1aWxkU291cmNlQ2xhc3Nlcyh0aGlzLnNvdXJjZUNsYXNzTmFtZXMsIGxvYWRlcik7Ci0JCQkKLQkJCS8vY2FsbCBNT1h5IEpBWEJDb250ZXh0RmFjdG9yeSBkaXJlY3RseS4gIFRoaXMgZWxpbWluYXRlcyB0aGUgbmVlZCB0byBoYXZlIHRoZSBKQVhCIHByb3BlcnRpZXMgZmlsZSBpbiBwbGFjZQotCQkJLy9pbiB0aW1lIGZvciB0aGUgZ2VuZXJhdGlvbi4KLQkJCWpheGJDb250ZXh0ID0gKEpBWEJDb250ZXh0KUpBWEJDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KHNvdXJjZUNsYXNzZXMsIENvbGxlY3Rpb25zLjxTdHJpbmcsT2JqZWN0PmVtcHR5TWFwKCkpOwotCQl9Ci0JCWNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aGlzLmhhbmRsZUpheGJFeGNlcHRpb24oZXgpOwotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCXRoaXMuaGFuZGxlQ2xhc3NDYXN0RXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gamF4YkNvbnRleHQ7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVNjaGVtYShKQVhCQ29udGV4dCBqYXhiQ29udGV4dCkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oVG9vbHMuZ2V0U3RyaW5nKEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5HRU5FUkFUSU5HX1NDSEVNQSkpOwotCQlTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0KLSAgICAJU2NoZW1hT3V0cHV0UmVzb2x2ZXIgc2NoZW1hT3V0cHV0UmVzb2x2ZXIgPSAKLSAgICAJCW5ldyBKcHRTY2hlbWFPdXRwdXRSZXNvbHZlcih0aGlzLnRhcmdldFNjaGVtYU5hbWUpOwotCi0JCXRyeSB7Ci0JCQlqYXhiQ29udGV4dC5nZW5lcmF0ZVNjaGVtYShzY2hlbWFPdXRwdXRSZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2goRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0gICAgCi0gICAgcHJpdmF0ZSBDbGFzc1tdIGJ1aWxkU291cmNlQ2xhc3NlcyhTdHJpbmdbXSBjbGFzc05hbWVzLCBDbGFzc0xvYWRlciBsb2FkZXIpIHsKLQotCQlBcnJheUxpc3Q8Q2xhc3M+IHNvdXJjZUNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0PENsYXNzPihjbGFzc05hbWVzLmxlbmd0aCk7Ci0JCWZvcihTdHJpbmcgY2xhc3NOYW1lOiBjbGFzc05hbWVzKSB7Ci0JCQl0cnkgewotCQkJCXNvdXJjZUNsYXNzZXMuYWRkKGxvYWRlci5sb2FkQ2xhc3MoY2xhc3NOYW1lKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihjbGFzc05hbWUpOwotCQkJfQotCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbihUb29scy5iaW5kKEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5OT1RfRk9VTkQsIGNsYXNzTmFtZSkpOwotCQkJfQotCQl9Ci0JCVN5c3RlbS5vdXQuZmx1c2goKTsKLQkJcmV0dXJuIHNvdXJjZUNsYXNzZXMudG9BcnJheShuZXcgQ2xhc3NbMF0pOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlSmF4YkV4Y2VwdGlvbihKQVhCRXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQlUaHJvd2FibGUgbGlua2VkRXggPSBleC5nZXRMaW5rZWRFeGNlcHRpb24oKTsKLQkJaWYobWVzc2FnZSAhPSBudWxsICYmIG1lc3NhZ2UuaW5kZXhPZihOT19GQUNUT1JZX0NMQVNTKSA+IC0xKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4obWVzc2FnZSk7Ci0JCX0KLQkJZWxzZSBpZihsaW5rZWRFeCAhPSBudWxsICYmIGxpbmtlZEV4IGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IFRvb2xzLmJpbmQoCi0JCQkJSnB0RWNsaXBzZUxpbmtKYXhiQ29yZU1lc3NhZ2VzLkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQsIGxpbmtlZEV4LmdldE1lc3NhZ2UoKSk7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZXJyb3JNZXNzYWdlKTsKLQkJfQotCQllbHNlIHsKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc0Nhc3RFeGNlcHRpb24oQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gZXguZ2V0TWVzc2FnZSgpOwotCQlpZihtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5pbmRleE9mKENBTk5PVF9CRV9DQVNUX1RPX0pBWEJDT05URVhUKSA+IC0xKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oVG9vbHMuZ2V0U3RyaW5nKEpwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5QUk9QRVJUSUVTX0ZJTEVfTk9UX0ZPVU5EKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogYXJndW1lbnQgcXVlcmllcyAqKioqKioqKioqCi0gICAgCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb3VyY2VDbGFzc05hbWVzKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5nZXRBbGxBcmd1bWVudFZhbHVlcygiLWMiLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldFRhcmdldFNjaGVtYU5hbWUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1zIiwgYXJncyk7ICAgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBnZXREZWJ1Z01vZGUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmFyZ3VtZW50RXhpc3RzKCItZGVidWciLCBhcmdzKTsgICAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gKioqKioqKioqKiBwcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJnTmFtZSwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlyZXR1cm4gYXJnc1tqXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QWxsQXJndW1lbnRWYWx1ZXMoU3RyaW5nIGFyZ05hbWUsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJTGlzdDxTdHJpbmc+IGFyZ1ZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmdOYW1lKSkgewotCQkJCWludCBqID0gaSArIDE7Ci0JCQkJaWYgKGogPCBhcmdzLmxlbmd0aCkgewotCQkJCQlhcmdWYWx1ZXMuYWRkKGFyZ3Nbal0pOwotCQkJCQlpKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhcmdWYWx1ZXMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmdOYW1lLCBTdHJpbmdbXSBhcmdzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbaV07Ci0JCQlpZiAoYXJnLnRvTG93ZXJDYXNlKCkuZXF1YWxzKGFyZ05hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQotCi0vLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotY2xhc3MgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIgZXh0ZW5kcyBTY2hlbWFPdXRwdXRSZXNvbHZlciB7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFNjaGVtYU5hbWU7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSnB0U2NoZW1hT3V0cHV0UmVzb2x2ZXIoU3RyaW5nIGRlZmF1bHRTY2hlbWFOYW1lKSB7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYU5hbWUgPSBkZWZhdWx0U2NoZW1hTmFtZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlc3VsdCBjcmVhdGVPdXRwdXQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHN1Z2dlc3RlZEZpbGVOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IChUb29scy5zdHJpbmdJc0VtcHR5KG5hbWVzcGFjZVVSSSkpID8gCi0gICAgICAgIAkJdGhpcy5idWlsZEZpbGVOYW1lRnJvbSh0aGlzLmRlZmF1bHRTY2hlbWFOYW1lLCBzdWdnZXN0ZWRGaWxlTmFtZSkgOiAKLSAgICAgICAgCQl0aGlzLm1vZGlmeUZpbGVOYW1lKG5hbWVzcGFjZVVSSSk7Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZVBhdGgpOwotICAgICAgICBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChmaWxlKTsKLSAgICAgICAgcmVzdWx0LnNldFN5c3RlbUlkKGZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnQoVG9vbHMuYmluZChKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuU0NIRU1BX0dFTkVSQVRFRCwgZmlsZSkpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0KLQkgcHJpdmF0ZSBTdHJpbmcgYnVpbGRGaWxlTmFtZUZyb20oU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgc3VnZ2VzdGVkRmlsZU5hbWUpIHsKLQotCQkgZmlsZU5hbWUgPSBUb29scy5zdHJpcEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0KLQkJIGlmKFRvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZU5hbWUpKSB7Ci0JCQkgcmV0dXJuIHN1Z2dlc3RlZEZpbGVOYW1lOwotCQkgfQotCQkgU3RyaW5nIG51bWJlciA9IFRvb2xzLmV4dHJhY3RGaWxlTnVtYmVyKHN1Z2dlc3RlZEZpbGVOYW1lKTsKLQotCQkgZmlsZU5hbWUgPSB0aGlzLmJ1aWxkRmlsZU5hbWUoZmlsZU5hbWUsIG51bWJlcik7Ci0JCSByZXR1cm4gVG9vbHMuYXBwZW5kWHNkRXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkgfQotCi0JIHByaXZhdGUgU3RyaW5nIGJ1aWxkRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBTdHJpbmcgbnVtYmVyKSB7Ci0KLQkJIGlmKFRvb2xzLnN0cmluZ0lzRW1wdHkobnVtYmVyKSkgewotCQkJIHJldHVybiBmaWxlTmFtZTsKLQkJIH0KLQkJIHJldHVybiAobnVtYmVyLmVxdWFscygiMCIpKSA/IGZpbGVOYW1lIDogZmlsZU5hbWUgKyBudW1iZXI7ICAgLy8kTk9OLU5MUy0xJAotCSB9Ci0KLQkgcHJpdmF0ZSBTdHJpbmcgbW9kaWZ5RmlsZU5hbWUoU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQkgU3RyaW5nIGRpciA9IFRvb2xzLmV4dHJhY3REaXJlY3RvcnkodGhpcy5kZWZhdWx0U2NoZW1hTmFtZSk7Ci0KLQkJIFN0cmluZyBmaWxlTmFtZSA9IFRvb2xzLnN0cmlwUHJvdG9jb2wobmFtZXNwYWNlVVJJKTsKLQkJIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZUFsbCgiLyIsICJfIik7CQkvLyROT04tTkxTLTEkCi0JCSBmaWxlTmFtZSA9IFRvb2xzLmFwcGVuZFhzZEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IChUb29scy5zdHJpbmdJc0VtcHR5KGRpcikpID8gZmlsZU5hbWUgOiBkaXIgKyBGaWxlLnNlcGFyYXRvciArIGZpbGVOYW1lOwotCQkKLQkJcmV0dXJuIHJlc3VsdDsKLQkgfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9KcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhOWUyZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL0pwdEVjbGlwc2VMaW5rSmF4YkNvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBFY2xpcHNlTGluayBKQVhCIGNvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0FESU5HX0NMQVNTRVMgPSAiTE9BRElOR19DTEFTU0VTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUSU5HX1NDSEVNQSA9ICJHRU5FUkFUSU5HX1NDSEVNQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0dFTkVSQVRFRCA9ICJTQ0hFTUFfR0VORVJBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTk9UX0NSRUFURUQgPSAiU0NIRU1BX05PVF9DUkVBVEVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RfRk9VTkQgPSAiTk9UX0ZPVU5EIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIkNPTlRFWFRfRkFDVE9SWV9OT1RfRk9VTkQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfRklMRV9OT1RfRk9VTkQgPSAiUFJPUEVSVElFU19GSUxFX05PVF9GT1VORCI7Ci0JCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4uaW50ZXJuYWwuanB0X2VjbGlwc2VsaW5rX2pheGJfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZUJ1bmRsZSBSRVNPVVJDRV9CVU5ETEUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCi0JcHJpdmF0ZSBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBSRVNPVVJDRV9CVU5ETEUuZ2V0U3RyaW5nKGtleSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gJyEnICsga2V5ICsgJyEnOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzMmU0Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvc2NoZW1hZ2VuL2ludGVybmFsL1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi0vKioKLSAqICBUb29scwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVG9vbHMKLXsKLQkvKiogZGVmYXVsdCBmaWxlIG5hbWUgdXNlZCBieSB0aGUgc2NoZW1hZ2VuICovCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgR0VOX0RFRkFVTFRfTkFNRSA9ICJzY2hlbWEiOyAgIC8vJE5PTi1OTFMtMSQKLQkKLQkvKiogZW1wdHkgc3RyaW5nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHN0cmluZyBpcyBudWxsLCBlbXB0eSwgb3IgY29udGFpbnMKLQkgKiBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eShTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmIChzdHJpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaW50IGxlbiA9IHN0cmluZy5sZW5ndGgoKTsKLQkJaWYgKGxlbiA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gc3RyaW5nSXNFbXB0eV8oc3RyaW5nLnRvQ2hhckFycmF5KCksIGxlbik7Ci0JfQkKLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gc3RyaW5nSXNFbXB0eV8oY2hhcltdIHMsIGludCBsZW4pIHsKLQkJZm9yIChpbnQgaSA9IGxlbjsgaS0tID4gMDsgKSB7Ci0JCQlpZiAoICEgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzW2ldKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNob3J0IG5hbWUgbWFuaXB1bGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmlwIHRoZSBleHRlbnNpb24gZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUgbmFtZQotCSAqIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4gSWYgdGhlIGZpbGUgbmFtZSBoYXMgbm8KLQkgKiBleHRlbnNpb24sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZAotCSAqIEZpbGUjYmFzZVBhdGgoKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRXh0ZW5zaW9uKFN0cmluZyBmaWxlTmFtZSkgewotCQlpbnQgaW5kZXggPSBmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBmaWxlTmFtZTsKLQkJfQotCQlyZXR1cm4gZmlsZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFByb3RvY29sKFN0cmluZyB1cmkpIHsKLQotCQkgcmV0dXJuIHVyaS5yZXBsYWNlRmlyc3QoImh0dHA6Ly8iLCBFTVBUWV9TVFJJTkcpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kWHNkRXh0ZW5zaW9uKFN0cmluZyBuYW1lKSB7Ci0KLQkJIHJldHVybiBuYW1lICsgIi54c2QiOwkJLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4dHJhY3RGaWxlTnVtYmVyKFN0cmluZyBmaWxlTmFtZSkgewotCi0JCSBTdHJpbmcgcmVzdWx0ID0gc3RyaXBFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkgaWYoVG9vbHMuc3RyaW5nSXNFbXB0eShyZXN1bHQpKSB7Ci0JCQkgcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJIH0KLQkJIHJldHVybiByZXN1bHQucmVwbGFjZUZpcnN0KEdFTl9ERUZBVUxUX05BTUUsIEVNUFRZX1NUUklORyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdERpcmVjdG9yeShTdHJpbmcgcGF0aCkgewotCQlpZiggISBwYXRoLmNvbnRhaW5zKEZpbGUuc2VwYXJhdG9yKSkgewotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsJCi0JCX0KLQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBOTFMgdXRpbGl0aWVzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBKcHRFY2xpcHNlTGlua0pheGJDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKGtleSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIGtleSwgT2JqZWN0IGFyZ3VtZW50KSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgYXJndW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnNjaGVtYWdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9zY2hlbWFnZW4vaW50ZXJuYWwvanB0X2VjbGlwc2VsaW5rX2pheGJfY29yZS5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Zjc2NjEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuc2NoZW1hZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3NjaGVtYWdlbi9pbnRlcm5hbC9qcHRfZWNsaXBzZWxpbmtfamF4Yl9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTE9BRElOR19DTEFTU0VTID0gbG9hZGluZy4uLgotR0VORVJBVElOR19TQ0hFTUEgPSBcbk1PWHkgZ2VuZXJhdGluZyBzY2hlbWEuLi4KLVNDSEVNQV9HRU5FUkFURUQgPSAgXG5TY2hlbWEgezB9IGdlbmVyYXRlZAotU0NIRU1BX05PVF9DUkVBVEVEID0gIFxuU2NoZW1hIHswfSBub3QgY3JlYXRlZAotTk9UX0ZPVU5EID0gIFxuXHROb3QgZm91bmQ6IHswfQotUFJPUEVSVElFU19GSUxFX05PVF9GT1VORCA9ICBcbkVjbGlwc2VMaW5rIEpBWEJDb250ZXh0RmFjdG9yeSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgamF4Yi5wcm9wZXJ0aWVzIGZpbGUgdG8gdXNlIEVjbGlwc2VMaW5rIE1PWHkgZm9yIHNjaGVtYSBnZW5lcmF0aW9uLlxuXAotamF2YXgueG1sLmJpbmQuY29udGV4dC5mYWN0b3J5PW9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5Ci1DT05URVhUX0ZBQ1RPUllfTk9UX0ZPVU5EID0gIFxuVGhlIEpBWEJDb250ZXh0RmFjdG9yeSB7MH0gXG5cCi1zcGVjaWZpZWQgaW4gdGhlIGpheGIucHJvcGVydGllcyBmaWxlIGNvdWxkIG5vdCBiZSBsb2NhdGVkIG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gXG5cCi1UaGUgSkFYQiBwcm92aWRlciB0aGF0IGRlZmluZXMgdGhpcyBmYWN0b3J5IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcHJvamVjdCBjbGFzc3BhdGgsIFxuXAotb3IgdGhlIGpheGIucHJvcGVydGllcyBmaWxlIHNob3VsZCBiZSByZW1vdmVkIHRvIHVzZSB0aGUgZGVmYXVsdCBwcm92aWRlci4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGggYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjMyZmU1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg5OWEzNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGViMGZjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA3OjQ1IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyODliMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5KcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuajJlZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuNC4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4zMDAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5saWJ2YWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMzt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfNDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdmZTEyMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJhZDYwYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSkFYQiBTdXBwb3J0IC0gQ29yZQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVBfTEFCRUwgPSBFY2xpcHNlTGluawotRUNMSVBTRUxJTktfMl8xX1BMQVRGT1JNX0xBQkVMID0gRWNsaXBzZUxpbmsgMi4xLngKLUVDTElQU0VMSU5LXzJfMl9QTEFURk9STV9MQUJFTCA9IEVjbGlwc2VMaW5rIDIuMi54Ci1FQ0xJUFNFTElOS18yXzNfUExBVEZPUk1fTEFCRUwgPSBFY2xpcHNlTGluayAyLjMueAotRUNMSVBTRUxJTktfMl80X1BMQVRGT1JNX0xBQkVMID0gRWNsaXBzZUxpbmsgMi40LngKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGUzZjhmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5qYXhiUGxhdGZvcm1zIj4KLQkJCi0JCTxqYXhiUGxhdGZvcm1Hcm91cAotICAgICAgICAJaWQ9ImVjbGlwc2VsaW5rIgotICAgICAgICAJbGFiZWw9IiVFQ0xJUFNFTElOS19QTEFURk9STV9HUk9VUF9MQUJFTCIvPgotCQkKLQkJPGpheGJQbGF0Zm9ybQotCQkJaWQ9ImVjbGlwc2VsaW5rXzJfMSIKLQkJCWxhYmVsPSIlRUNMSVBTRUxJTktfMl8xX1BMQVRGT1JNX0xBQkVMIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IgotCQkJZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJamF4YkZhY2V0VmVyc2lvbj0iMi4xIgotCQkJZGVmYXVsdD0iZmFsc2UiLz4KLQkJCi0JCTxqYXhiUGxhdGZvcm0KLQkJCWlkPSJlY2xpcHNlbGlua18yXzIiCi0JCQlsYWJlbD0iJUVDTElQU0VMSU5LXzJfMl9QTEFURk9STV9MQUJFTCIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8yLkVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeSIKLQkJCWdyb3VwPSJlY2xpcHNlbGluayIKLQkJCWpheGJGYWNldFZlcnNpb249IjIuMiIKLQkJCWRlZmF1bHQ9ImZhbHNlIi8+Ci0JCQotCQk8amF4YlBsYXRmb3JtCi0JCQlpZD0iZWNsaXBzZWxpbmtfMl8zIgotCQkJbGFiZWw9IiVFQ0xJUFNFTElOS18yXzNfUExBVEZPUk1fTEFCRUwiCi0JCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMy5FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkiCi0JCQlncm91cD0iZWNsaXBzZWxpbmsiCi0JCQlqYXhiRmFjZXRWZXJzaW9uPSIyLjIiCi0JCQlkZWZhdWx0PSJmYWxzZSIvPgotCQkKLQkJPGpheGJQbGF0Zm9ybQotCQkJaWQ9ImVjbGlwc2VsaW5rXzJfNCIKLQkJCWxhYmVsPSIlRUNMSVBTRUxJTktfMl80X1BMQVRGT1JNX0xBQkVMIgotCQkJZmFjdG9yeUNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzQuRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IgotCQkJZ3JvdXA9ImVjbGlwc2VsaW5rIgotCQkJamF4YkZhY2V0VmVyc2lvbj0iMi4yIgotCQkJZGVmYXVsdD0iZmFsc2UiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIj4KLQkJCi0JCTxsaWJyYXJ5VmFsaWRhdG9yCi0JCQlpZD0iZWNsaXBzZWxpbmtVc2VyTGlicmFyeVZhbGlkYXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmxpYnZhbC5FTEpheGJVc2VyTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8YW5kPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuZXh0ZW5kc0lkIiB2YWx1ZT0iamF4Yi11c2VyLWxpYnJhcnktcHJvdmlkZXIiLz4KLQkJCQkJPC93aXRoPgotCQkJCQk8d2l0aCB2YXJpYWJsZT0iY29uZmlnIj4KLQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmpheGJQbGF0Zm9ybUdyb3VwIiB2YWx1ZT0iZWNsaXBzZWxpbmsiLz4KLQkJCQkJPC93aXRoPgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVtZW50PgotCQk8L2xpYnJhcnlWYWxpZGF0b3I+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9wcm9wZXJ0eV9maWxlcy9lbF9qYXhiX3ZhbGlkYXRpb24ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VsX2pheGJfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjRjNzlkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3Byb3BlcnR5X2ZpbGVzL2VsX2pheGJfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jICAKLSMgIENvbnRyaWJ1dG9yczogCi0jICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVBST0pFQ1RfTUlTU0lOR19FQ0xJUFNFTElOS19KQVhCX0NPTlRFWFRfRkFDVE9SWSA9IFByb2plY3QgaXMgbWlzc2luZyBhIGpheGIucHJvcGVydGllcyBmaWxlIHNwZWNpZnlpbmcgdGhlIEVjbGlwc2VMaW5rIEpBWEIgY29udGV4dCBmYWN0b3J5Ci0KLVhNTF9QQVRIX19ST09UX05PVF9TVVBQT1JURUQgPSBSb290IFhtbFBhdGggaXMgbm90IHN1cHBvcnRlZC4KLVhNTF9QQVRIX19JTlZBTElEX0ZPUk1fSUxMRUdBTF9TRUdNRU5UID0gSWxsZWdhbCBYbWxQYXRoIHN0ZXAgXCJ7MH1cIi4KLVhNTF9QQVRIX19TRUxGX1NFR01FTlRfTVVTVF9CRV9GSVJTVF9TRUdNRU5UID0gU2VsZiBYbWxQYXRoIHN0ZXAgbXVzdCBiZSBmaXJzdCBzdGVwLgotWE1MX1BBVEhfX1RFWFRfU0VHTUVOVF9NVVNUX0JFX0xBU1RfU0VHTUVOVCA9IFRleHQgWG1sUGF0aCBzdGVwIG11c3QgYmUgbGFzdCBzdGVwLgotWE1MX1BBVEhfX0FUVFJJQlVURV9TRUdNRU5UX01VU1RfQkVfTEFTVF9TRUdNRU5UID0gQW4gYXR0cmlidXRlIFhtbFBhdGggc3RlcCBtdXN0IGJlIHRoZSBsYXN0IHN0ZXAuCi0KLVhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX1BBVEhTX0ZPUl9YTUxfRUxFTUVOVFMgPSBJbnN1ZmZpY2llbnQgWG1sUGF0aHMgc3BlY2lmaWVkLiAgVGhlcmUgbXVzdCBiZSBhbiBYbWxQYXRoIGZvciBlYWNoIFhtbEVsZW1lbnQuCi1YTUxfUEFUSF9fSU5TVUZGSUNJRU5UX1hNTF9FTEVNRU5UU19GT1JfWE1MX1BBVEhTID0gVGhlcmUgaXMgbm8gWG1sRWxlbWVudCB0byBtYXRjaCB0aGlzIFhtbFBhdGguICBUaGVyZSBtdXN0IGJlIGFuIFhtbEVsZW1lbnQgZm9yIGVhY2ggWG1scGF0aC4KLQotWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQllfTk9UX1NQRUNJRklFRCA9IFRoZSAnbWFwcGVkQnknIHByb3BlcnR5IG11c3QgYmUgc3BlY2lmaWVkIG9uIGFuIFhtbEludmVyc2VSZWZlcmVuY2UuCi1YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfUkVTT0xWRUQgPSBDYW5ub3QgcmVzb2x2ZSB0aGUgYXR0cmlidXRlICcnezB9Jycgb24gdGhlIGNsYXNzICcnezF9JycuCi1YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfWE1MX0VMRU1FTlQgPSBUaGUgYXR0cmlidXRlICcnezB9Jycgb24gdGhlIGNsYXNzICcnezF9JycgaXMgbm90IG1hcHBlZCB0byBhbiBYbWxFbGVtZW50LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0VMSmF4Yk1hcHBpbmdLZXlzLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9FTEpheGJNYXBwaW5nS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDJmMTgzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0VMSmF4Yk1hcHBpbmdLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVMSmF4Yk1hcHBpbmdLZXlzIHsKLQkKLQlTdHJpbmcgWE1MX0lOVkVSU0VfUkVGRVJFTkNFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ4bWwtaW52ZXJzZS1yZWZlcmVuY2UiOwotCVN0cmluZyBYTUxfVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZID0gInhtbC10cmFuc2Zvcm1hdGlvbiI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9FTEpheGJQbGF0Zm9ybS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvRUxKYXhiUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIyOWJkYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9FTEpheGJQbGF0Zm9ybS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiUGxhdGZvcm0gewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiBHUk9VUCAKLQkJCT0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybUdyb3VwKCJlY2xpcHNlbGluayIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfMQotCQkJPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKCJlY2xpcHNlbGlua18yXzEiKTsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzIKLQkJCT0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybSgiZWNsaXBzZWxpbmtfMl8yIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMl8zCi0JCQk9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm0oImVjbGlwc2VsaW5rXzJfMyIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBWRVJTSU9OXzJfNAotCQkJPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKCJlY2xpcHNlbGlua18yXzQiKTsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpheGJWZXJzaW9uKSB7Ci0JCWlmIChqYXhiVmVyc2lvbi5lcXVhbHMoSmF4YkZhY2V0LlZFUlNJT05fMl8xKSkgewotCQkJcmV0dXJuIFZFUlNJT05fMl8xOwotCQl9Ci0JCXJldHVybiBWRVJTSU9OXzJfNDsKLQl9Ci0JCi0JCi0JLyoqCi0JICogTm90IGZvciBpbnN0YW50aWF0aW9uCi0JICovCi0JcHJpdmF0ZSBFTEpheGJQbGF0Zm9ybSgpIHt9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9KcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9KcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTY4MTgwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL0pwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luCi0JCWV4dGVuZHMgUGx1Z2luIHsKLQkKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBKcHRKYXhiRWNsaXBzZUxpbmtDb3JlUGx1Z2luIElOU1RBTkNFOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uIEpQVCBFY2xpcHNlTGluayBwbHVnLWluLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVBsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0JCi0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJSU5TVEFOQ0UuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioJCi0JCi0JcHVibGljIEpwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSU5TVEFOQ0UgPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2ZmE3Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBFTFhtbEFueUF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nLCBFTFhtbFBhdGhNYXBwaW5nIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEFueUVsZW1lbnRNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxBbnlFbGVtZW50TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDhmNTM2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEFueUVsZW1lbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFueUVsZW1lbnRNYXBwaW5nOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxBbnlFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIFhtbEFueUVsZW1lbnRNYXBwaW5nLCBFTFhtbFBhdGhNYXBwaW5nIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWViZDdkYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLQotcHVibGljIGludGVyZmFjZSBFTFhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nLCBFTFhtbE5hbWVkTm9kZU1hcHBpbmcgewotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50TWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sRWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhMjE3Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50TWFwcGluZzsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVMWG1sRWxlbWVudE1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxFbGVtZW50TWFwcGluZywgRUxYbWxOYW1lZE5vZGVNYXBwaW5nIHsKLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sRWxlbWVudHNNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50c01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlMTdhYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxFbGVtZW50c01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudHNNYXBwaW5nOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRUxYbWxFbGVtZW50c01hcHBpbmcKLQkJZXh0ZW5kcyBYbWxFbGVtZW50c01hcHBpbmcgewotCQotCS8vICoqKioqIHhtbFBhdGhzICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSB4bWxQYXRocyBsaXN0Ci0JICovCi0JU3RyaW5nIFhNTF9QQVRIU19MSVNUID0gInhtbFBhdGhzIjsgIC8vLyROT04tTkxTLTEkCi0JCi0JTGlzdEl0ZXJhYmxlPEVMWG1sUGF0aD4gZ2V0WG1sUGF0aHMoKTsKLQkKLQlpbnQgZ2V0WG1sUGF0aHNTaXplKCk7Ci0JCi0JRUxYbWxQYXRoIGFkZFhtbFBhdGgoaW50IGluZGV4KTsKLQkKLQl2b2lkIHJlbW92ZVhtbFBhdGgoaW50IGluZGV4KTsKLQkKLQl2b2lkIG1vdmVYbWxQYXRoKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVhNjA5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJBdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gRWNsaXBzZUxpbmsgWG1sSW52ZXJzZVJlZmVyZW5jZSBhdHRyaWJ1dGUgbWFwcGluZyBpbiBlaXRoZXIKLSAqIGphdmEgYW5ub3RhdGlvbnMgb3Igb3htIGZpbGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nCi0JCWV4dGVuZHMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgewotCQotCS8vICoqKioqIG1hcHBlZEJ5ICoqKioqCi0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBtYXBwZWRCeSBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBNQVBQRURfQllfUFJPUEVSVFkgPSAibWFwcGVkQnkiOyAgLy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBlZEJ5IHByb3BlcnR5IHZhbHVlLgotCSAqIEEgbnVsbCBpbmRpY2F0ZXMgaXQgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIG1hcHBlZEJ5IHByb3BlcnR5IHZhbHVlLgotCSAqIFNldHRpbmcgdG8gbnVsbCB3aWxsIHVuc3BlY2lmeSBpdC4KLQkgKi8KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxOYW1lZE5vZGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1Mzk4OGYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sTmFtZWROb2RlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOYW1lZE5vZGVNYXBwaW5nOwotCi0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSBmb3IgRUxYbWxFbGVtZW50TWFwcGluZyBhbmQgRUxYbWxBdHRyaWJ1dGVNYXBwaW5nCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBFTFhtbE5hbWVkTm9kZU1hcHBpbmcKLQkJZXh0ZW5kcyBYbWxOYW1lZE5vZGVNYXBwaW5nLCBFTFhtbFBhdGhNYXBwaW5nIHsKLQkKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbFBhdGguamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2NvbnRleHQvamF2YS9FTFhtbFBhdGguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdmYzBkMC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVMWG1sUGF0aAotCQlleHRlbmRzIEpheGJDb250ZXh0Tm9kZSB7Ci0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHZhbHVlIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgIC8vLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB2YWx1ZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBBIG51bGwgaW5kaWNhdGVzIGl0IGlzIG5vdCBzcGVjaWZpZWQuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBOdWxsIHVuc3BlY2lmaWVzIHRoZSB2YWx1ZS4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxQYXRoTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvY29udGV4dC9qYXZhL0VMWG1sUGF0aE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4NTcyZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9jb250ZXh0L2phdmEvRUxYbWxQYXRoTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVMWG1sUGF0aE1hcHBpbmcgewotCQotCS8vICoqKioqIHhtbFBhdGggKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHhtbFBhdGggcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgWE1MX1BBVEhfUFJPUEVSVFkgPSAieG1sUGF0aCI7ICAvLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgeG1sUGF0aCBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiBBIG51bGwgaW5kaWNhdGVzIGl0IGlzIG5vdCBzcGVjaWZpZWQuCi0JICovCi0JRUxYbWxQYXRoIGdldFhtbFBhdGgoKTsKLQkKLQkvKioKLQkgKiBBZGQgKGFuZCByZXR1cm4pIGFuIHhtbFBhdGggcHJvcGVydHkgdmFsdWUuCi0JICogKFNwZWNpZmllcyB0aGUgcHJvcGVydHkpCi0JICovCi0JRUxYbWxQYXRoIGFkZFhtbFBhdGgoKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHhtbFBhdGggcHJvcGVydHkgdmFsdWUuCi0JICogKFVuc3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSkKLQkgKi8KLQl2b2lkIHJlbW92ZVhtbFBhdGgoKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0Fic3RyYWN0RUxKYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEVMSmF4YlBsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTQzNjVjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL0Fic3RyYWN0RUxKYXhiUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFTEpheGJQbGF0Zm9ybURlZmluaXRpb24KLQkJZXh0ZW5kcyBBYnN0cmFjdEpheGJQbGF0Zm9ybURlZmluaXRpb24gewotCQotCXByb3RlY3RlZCBBYnN0cmFjdEVMSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpheGJQbGF0Zm9ybURlZmluaXRpb24gZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKTsKLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYVR5cGVNYXBwaW5nKFN0cmluZyBqYXZhVHlwZU5hbWUpIHsKLQkJU3RyaW5nIG1hcHBpbmcgPSBnZXRHZW5lcmljSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpLmdldFNjaGVtYVR5cGVNYXBwaW5nKGphdmFUeXBlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyAhPSBudWxsKSA/IG1hcHBpbmcgOiBzdXBlci5nZXRTY2hlbWFUeXBlTWFwcGluZyhqYXZhVHlwZU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZEphdmFUb1NjaGVtYVR5cGVzKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQltYXAucHV0KCJqYXZhLnNxbC5EYXRlIiwgImRhdGUiKTsKLQkJbWFwLnB1dCgiamF2YS5zcWwuVGltZSIsICJ0aW1lIik7Ci0JCW1hcC5wdXQoImphdmEuc3FsLlRpbWVzdGFtcCIsICJkYXRlVGltZSIpOwotCQlyZXR1cm4gbWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRUxKYXhiQ29udGV4dFJvb3QuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvRUxKYXhiQ29udGV4dFJvb3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2MjM4Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvbnRleHRSb290LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuQWJzdHJhY3RKYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXhicHJvcHMuSmF4YlByb3BlcnRpZXNSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiQ29udGV4dFJvb3QKLQkJZXh0ZW5kcyBBYnN0cmFjdEpheGJDb250ZXh0Um9vdCB7Ci0JCi0JCi0JcHVibGljIEVMSmF4YkNvbnRleHRSb290KEpheGJQcm9qZWN0IGpheGJQcm9qZWN0KSB7Ci0JCXN1cGVyKGpheGJQcm9qZWN0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkKLQkJdmFsaWRhdGVKYXhiUHJvcGVydGllcyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpheGJQcm9wZXJ0aWVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJU3RyaW5nIGZhY3RvcnlQcm9wID0gImphdmF4LnhtbC5iaW5kLmNvbnRleHQuZmFjdG9yeSI7Ci0JCVN0cmluZyBmYWN0b3J5UHJvcFZhbHVlID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5IjsKLQkJCQotCQlmb3IgKEpheGJQYWNrYWdlIGpwIDogZ2V0UGFja2FnZXMoKSkgewotCQkJU3RyaW5nIHBuID0ganAuZ2V0TmFtZSgpOwotCQkJSmF4YlByb3BlcnRpZXNSZXNvdXJjZSBqcHIgPSBnZXRKYXhiUHJvamVjdCgpLmdldEpheGJQcm9wZXJ0aWVzUmVzb3VyY2UocG4pOwotCQkJaWYgKGpwciAhPSBudWxsICYmIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChqcHIuZ2V0UHJvcGVydHkoZmFjdG9yeVByb3ApLCBmYWN0b3J5UHJvcFZhbHVlKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJbWVzc2FnZXMuYWRkKAotCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTUlTU0lOR19FQ0xJUFNFTElOS19KQVhCX0NPTlRFWFRfRkFDVE9SWSwKLQkJCQkJCWdldEpheGJQcm9qZWN0KCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0Zjk1My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIAotCQlpbXBsZW1lbnRzIEVMWG1sQW55QXR0cmlidXRlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggeG1sUGF0aDsKLQkKLQkKLQlwdWJsaWMgRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdFhtbFBhdGgoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxQYXRoKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFBhdGggKioqKioKLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGdldFhtbFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFBhdGg7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFBhdGhfKEVMSmF2YVhtbFBhdGggeG1sUGF0aCkgewotCQlFTEphdmFYbWxQYXRoIG9sZCA9IHRoaXMueG1sUGF0aDsKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfUEFUSF9QUk9QRVJUWSwgb2xkLCB0aGlzLnhtbFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGFkZFhtbFBhdGgoKSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJRUxKYXZhWG1sUGF0aCB4bWxQYXRoID0gYnVpbGRYbWxQYXRoKCk7Ci0JCXNldFhtbFBhdGhfKHhtbFBhdGgpOwotCQlyZXR1cm4geG1sUGF0aDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sUGF0aCgpIHsKLQkJaWYgKHRoaXMueG1sUGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJd2hpbGUgKGdldFhtbFBhdGhBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQl9Ci0JCXNldFhtbFBhdGhfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCXRoaXMueG1sUGF0aCA9IChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGJ1aWxkWG1sUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbFBhdGggPT0gbnVsbCkgewotCQkJCXNldFhtbFBhdGhfKGJ1aWxkWG1sUGF0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMueG1sUGF0aC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxQYXRoXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCBidWlsZFhtbFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sUGF0aCh0aGlzLCBuZXcgWG1sUGF0aENvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQYXRoQW5ub3RhdGlvbiBnZXRYbWxQYXRoQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxQYXRoQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJdmFsaWRhdGVYbWxQYXRoKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYbWxQYXRoKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sUGF0aC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUGF0aENvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sUGF0aC5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxQYXRoQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczNWE1ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlFTEpheGIuWE1MX1BBVEggfTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQkJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkMjgxMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEFueUVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcgCi0JCWltcGxlbWVudHMgRUxYbWxBbnlFbGVtZW50TWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggeG1sUGF0aDsKLQkKLQkKLQlwdWJsaWMgRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCWluaXRYbWxQYXRoKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlzeW5jWG1sUGF0aCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBYbWxQYXRoICoqKioqCi0JCi0JcHVibGljIEVMWG1sUGF0aCBnZXRYbWxQYXRoKCkgewotCQlyZXR1cm4gdGhpcy54bWxQYXRoOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxQYXRoXyhFTEphdmFYbWxQYXRoIHhtbFBhdGgpIHsKLQkJRUxKYXZhWG1sUGF0aCBvbGQgPSB0aGlzLnhtbFBhdGg7Ci0JCXRoaXMueG1sUGF0aCA9IHhtbFBhdGg7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX1BBVEhfUFJPUEVSVFksIG9sZCwgdGhpcy54bWxQYXRoKTsKLQl9Ci0JCi0JcHVibGljIEVMWG1sUGF0aCBhZGRYbWxQYXRoKCkgewotCQlpZiAodGhpcy54bWxQYXRoICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCUVMSmF2YVhtbFBhdGggeG1sUGF0aCA9IGJ1aWxkWG1sUGF0aCgpOwotCQlzZXRYbWxQYXRoXyh4bWxQYXRoKTsKLQkJcmV0dXJuIHhtbFBhdGg7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFBhdGgoKSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXdoaWxlIChnZXRYbWxQYXRoQW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJfQotCQlzZXRYbWxQYXRoXyhudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFhtbFBhdGgoKSB7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQl0aGlzLnhtbFBhdGggPSAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBidWlsZFhtbFBhdGgoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1htbFBhdGgoKSB7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy54bWxQYXRoID09IG51bGwpIHsKLQkJCQlzZXRYbWxQYXRoXyhidWlsZFhtbFBhdGgoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnhtbFBhdGguc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2V0WG1sUGF0aF8obnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggYnVpbGRYbWxQYXRoKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbFBhdGgodGhpcywgbmV3IFhtbFBhdGhDb250ZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUGF0aEFubm90YXRpb24gZ2V0WG1sUGF0aEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sUGF0aEFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyKHRoaXMsIG5ldyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0ZVhtbFBhdGgobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbFBhdGgoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy54bWxQYXRoLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxQYXRoQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxQYXRoLkNvbnRleHQgewotCQkKLQkJcHVibGljIFhtbFBhdGhBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sRWxlbWVudFdyYXBwZXIuQ29udGV4dCB7Ci0JCQotCQlwdWJsaWMgWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcudGhpcy5nZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sUGF0aCgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZy50aGlzLnhtbFBhdGggIT0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhNWNkOS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlFTEpheGIuWE1MX1BBVEggfTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJCQlzdXBlci5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCQkJbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwNGM5Ny4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JCWltcGxlbWVudHMgRUxYbWxBdHRyaWJ1dGVNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCB4bWxQYXRoOwotCQotCQotCXB1YmxpYyBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQlpbml0WG1sUGF0aCgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBzeW5jL3VwZGF0ZSAqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJc3luY1htbFBhdGgoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogWG1sUGF0aCAqKioqKgotCQotCXB1YmxpYyBFTFhtbFBhdGggZ2V0WG1sUGF0aCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGF0aDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sUGF0aF8oRUxKYXZhWG1sUGF0aCB4bWxQYXRoKSB7Ci0JCUVMSmF2YVhtbFBhdGggb2xkID0gdGhpcy54bWxQYXRoOwotCQl0aGlzLnhtbFBhdGggPSB4bWxQYXRoOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFhNTF9QQVRIX1BST1BFUlRZLCBvbGQsIHRoaXMueG1sUGF0aCk7Ci0JfQotCQotCXB1YmxpYyBFTFhtbFBhdGggYWRkWG1sUGF0aCgpIHsKLQkJaWYgKHRoaXMueG1sUGF0aCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQlFTEphdmFYbWxQYXRoIHhtbFBhdGggPSBidWlsZFhtbFBhdGgoKTsKLQkJc2V0WG1sUGF0aF8oeG1sUGF0aCk7Ci0JCXJldHVybiB4bWxQYXRoOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxQYXRoKCkgewotCQlpZiAodGhpcy54bWxQYXRoID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQl3aGlsZSAoZ2V0WG1sUGF0aEFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCX0KLQkJc2V0WG1sUGF0aF8obnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRYbWxQYXRoKCkgewotCQlYbWxQYXRoQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sUGF0aEFubm90YXRpb24oKTsKLQkJdGhpcy54bWxQYXRoID0gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYnVpbGRYbWxQYXRoKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNYbWxQYXRoKCkgewotCQlYbWxQYXRoQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sUGF0aEFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMueG1sUGF0aCA9PSBudWxsKSB7Ci0JCQkJc2V0WG1sUGF0aF8oYnVpbGRYbWxQYXRoKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy54bWxQYXRoLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldFhtbFBhdGhfKG51bGwpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBFTEphdmFYbWxQYXRoIGJ1aWxkWG1sUGF0aCgpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxQYXRoKHRoaXMsIG5ldyBYbWxQYXRoQ29udGV4dCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFBhdGhBbm5vdGF0aW9uIGdldFhtbFBhdGhBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFhtbFBhdGhBbm5vdGF0aW9uKSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVFOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggPT0gbnVsbCkgewotCQkJc3VwZXIudmFsaWRhdGVRTmFtZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVYbWxQYXRoKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYbWxQYXRoKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sUGF0aC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUGF0aENvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sUGF0aC5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxQYXRoQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcudGhpcy5nZXRYbWxQYXRoQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1MWZiNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQkJaW1wbGVtZW50cyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gCi0JCQl7Ci0JCQkJRUxKYXhiLlhNTF9QQVRIIH07Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQkJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCS8vIHRlc3Qgd2hldGhlciBhbm5vdGF0ZWQgd2l0aCBAWG1sUGF0aCwgYW5kIGlmIHNvLCBpZiBsYXN0IHNlZ21lbnQgc3RhcnRzIHdpdGggIkAiCi0JCS8vIChwcmVzZW5jZSBvZiAiQCIgZWxzZXdoZXJlIG1heSBiZSBhIG5vZGUgc2VsZWN0IGNsYXVzZSkKLQkJWG1sUGF0aEFubm90YXRpb24geG1sUGF0aEFubm90YXRpb24gPSAKLQkJCQkoWG1sUGF0aEFubm90YXRpb24pIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQlpZiAoeG1sUGF0aEFubm90YXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB2YWx1ZSA9IHhtbFBhdGhBbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsICIvIik7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoISB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJcmV0dXJuIHRva2VuLnN0YXJ0c1dpdGgoIkAiKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MTQyOTkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudAotCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudCB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEVsZW1lbnQoSmF2YUNvbnRleHROb2RlIHBhcmVudCwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKHBhcmVudCwgY29udGV4dCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiAoQ29udGV4dCkgc3VwZXIuZ2V0Q29udGV4dCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVFOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICghIGdldENvbnRleHQoKS5oYXNYbWxQYXRoKCkpIHsKLQkJCXN1cGVyLnZhbGlkYXRlUU5hbWUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQKLQkJCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50LkNvbnRleHQgewotCQkKLQkJYm9vbGVhbiBoYXNYbWxQYXRoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1NWJkZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkVMWG1sUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxFbGVtZW50TWFwcGluZwotCQlleHRlbmRzIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmcKLQkJaW1wbGVtZW50cyBFTFhtbEVsZW1lbnRNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCB4bWxQYXRoOwotCQotCQotCXB1YmxpYyBFTEphdmFYbWxFbGVtZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJaW5pdFhtbFBhdGgoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNYbWxQYXRoKCk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbFBhdGggKioqKioKLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGdldFhtbFBhdGgoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFBhdGg7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFBhdGhfKEVMSmF2YVhtbFBhdGggeG1sUGF0aCkgewotCQlFTEphdmFYbWxQYXRoIG9sZCA9IHRoaXMueG1sUGF0aDsKLQkJdGhpcy54bWxQYXRoID0geG1sUGF0aDsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfUEFUSF9QUk9QRVJUWSwgb2xkLCB0aGlzLnhtbFBhdGgpOwotCX0KLQkKLQlwdWJsaWMgRUxYbWxQYXRoIGFkZFhtbFBhdGgoKSB7Ci0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJRUxKYXZhWG1sUGF0aCB4bWxQYXRoID0gYnVpbGRYbWxQYXRoKCk7Ci0JCXNldFhtbFBhdGhfKHhtbFBhdGgpOwotCQlyZXR1cm4geG1sUGF0aDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sUGF0aCgpIHsKLQkJaWYgKHRoaXMueG1sUGF0aCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJd2hpbGUgKGdldFhtbFBhdGhBbm5vdGF0aW9uKCkgIT0gbnVsbCkgewotCQkJZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQl9Ci0JCXNldFhtbFBhdGhfKG51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0WG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCXRoaXMueG1sUGF0aCA9IChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGJ1aWxkWG1sUGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzeW5jWG1sUGF0aCgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLnhtbFBhdGggPT0gbnVsbCkgewotCQkJCXNldFhtbFBhdGhfKGJ1aWxkWG1sUGF0aCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRoaXMueG1sUGF0aC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRYbWxQYXRoXyhudWxsKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCBidWlsZFhtbFBhdGgoKSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sUGF0aCh0aGlzLCBuZXcgWG1sUGF0aENvbnRleHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQYXRoQW5ub3RhdGlvbiBnZXRYbWxQYXRoQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChYbWxQYXRoQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtaXNjICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEVsZW1lbnQgYnVpbGRYbWxFbGVtZW50KCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnQodGhpcywgbmV3IFhtbEVsZW1lbnRDb250ZXh0KCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRWxlbWVudFdyYXBwZXIgYnVpbGRYbWxFbGVtZW50V3JhcHBlcigpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxFbGVtZW50V3JhcHBlcih0aGlzLCBuZXcgWG1sRWxlbWVudFdyYXBwZXJDb250ZXh0KCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWxpZGF0aW9uICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCi0JCWlmICh0aGlzLnhtbFBhdGggIT0gbnVsbCkgewotCQkJdmFsaWRhdGVYbWxQYXRoKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYbWxQYXRoKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMueG1sUGF0aC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUGF0aENvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sUGF0aC5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxQYXRoQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0WG1sUGF0aEFubm90YXRpb24oKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudENvbnRleHQKLQkJCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZy5YbWxFbGVtZW50Q29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxFbGVtZW50LkNvbnRleHQgewotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sUGF0aCgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50TWFwcGluZy50aGlzLnhtbFBhdGggIT0gbnVsbDsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudFdyYXBwZXJDb250ZXh0Ci0JCQlpbXBsZW1lbnRzIEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyLkNvbnRleHQgewotCQkKLQkJcHVibGljIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nLnRoaXMuZ2V0WG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc1htbFBhdGgoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcudGhpcy54bWxQYXRoICE9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ZDRkOTguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBKYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFTEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBFTEphdmFYbWxFbGVtZW50TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlFTEpheGIuWE1MX1BBVEggfTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQkJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRXcmFwcGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyOTI4YS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudFdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVhtbEVsZW1lbnRXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyCi0JCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlciB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyKEpheGJBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKHBhcmVudCwgY29udGV4dCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiAoQ29udGV4dCkgdGhpcy5jb250ZXh0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVFOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICghIGdldENvbnRleHQoKS5oYXNYbWxQYXRoKCkpIHsKLQkJCXN1cGVyLnZhbGlkYXRlUU5hbWUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgaW50ZXJmYWNlIENvbnRleHQKLQkJCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50V3JhcHBlci5Db250ZXh0IHsKLQkJCi0JCWJvb2xlYW4gaGFzWG1sUGF0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50c01hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50c01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhhZTQ5ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcKLQkJZXh0ZW5kcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZwotCQlpbXBsZW1lbnRzIEVMWG1sRWxlbWVudHNNYXBwaW5nIHsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8RUxKYXZhWG1sUGF0aCwgWG1sUGF0aEFubm90YXRpb24+IHhtbFBhdGhDb250YWluZXI7Ci0JCi0JCi0JcHVibGljIEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxQYXRoQ29udGFpbmVyID0gYnVpbGRYbWxQYXRoQ29udGFpbmVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnhtbFBhdGhDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnhtbFBhdGhDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHhtbFBhdGhzICoqKioqCi0JCi0JcHVibGljIExpc3RJdGVyYWJsZTxFTFhtbFBhdGg+IGdldFhtbFBhdGhzKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxFTFhtbFBhdGg+KHhtbFBhdGhDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCkpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFhtbFBhdGhzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGF0aENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCQotCXB1YmxpYyBFTFhtbFBhdGggYWRkWG1sUGF0aChpbnQgaW5kZXgpIHsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxQYXRoQW5ub3RhdGlvbikgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJcmV0dXJuIHRoaXMueG1sUGF0aENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFBhdGgoaW50IGluZGV4KSB7Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCXRoaXMueG1sUGF0aENvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVYbWxQYXRoKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCWdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJdGhpcy54bWxQYXRoQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRUxKYXZhWG1sUGF0aCBidWlsZFhtbFBhdGgoWG1sUGF0aEFubm90YXRpb24geG1sUGF0aEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxQYXRoKHRoaXMsIG5ldyBYbWxQYXRoQ29udGV4dCh4bWxQYXRoQW5ub3RhdGlvbikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8RUxKYXZhWG1sUGF0aCwgWG1sUGF0aEFubm90YXRpb24+IGJ1aWxkWG1sUGF0aENvbnRhaW5lcigpIHsKLQkJWG1sUGF0aENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgWG1sUGF0aENvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbFBhdGhBbm5vdGF0aW9uPiBnZXRYbWxQYXRoQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIFhtbFBhdGhBbm5vdGF0aW9uPigKLQkJCQlnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50IGJ1aWxkWG1sRWxlbWVudChYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnQodGhpcywgbmV3IFhtbEVsZW1lbnRDb250ZXh0KHhtbEVsZW1lbnRBbm5vdGF0aW9uKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxFbGVtZW50V3JhcHBlciBidWlsZFhtbEVsZW1lbnRXcmFwcGVyKCkgewotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbEVsZW1lbnRXcmFwcGVyKHRoaXMsIG5ldyBYbWxFbGVtZW50V3JhcHBlckNvbnRleHQoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJaWYgKGdldFhtbFBhdGhzU2l6ZSgpID4gMCApIHsKLQkJCXZhbGlkYXRlWG1sUGF0aHMobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVhtbFBhdGhzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhdG9yPFhtbEVsZW1lbnQ+IHhtbEVsZW1lbnRzID0gZ2V0WG1sRWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQlJdGVyYXRvcjxFTEphdmFYbWxQYXRoPiB4bWxQYXRocyA9IHRoaXMueG1sUGF0aENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkKLQkJd2hpbGUgKHhtbEVsZW1lbnRzLmhhc05leHQoKSAmJiB4bWxQYXRocy5oYXNOZXh0KCkpIHsKLQkJCXhtbEVsZW1lbnRzLm5leHQoKTsKLQkJCXhtbFBhdGhzLm5leHQoKTsKLQkJfQotCQkKLQkJaWYgKHhtbEVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX1BBVEhTX0ZPUl9YTUxfRUxFTUVOVFMsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRYbWxQYXRoc1RleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQl3aGlsZSAoeG1sUGF0aHMuaGFzTmV4dCgpKSB7Ci0JCQlFTEphdmFYbWxQYXRoIHhtbFBhdGggPSB4bWxQYXRocy5uZXh0KCk7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1BBVEhfX0lOU1VGRklDSUVOVF9YTUxfRUxFTUVOVFNfRk9SX1hNTF9QQVRIUywKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXhtbFBhdGguZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KSkpOwotCQl9Ci0JCQotCQlmb3IgKEVMSmF2YVhtbFBhdGggeG1sUGF0aCA6IHRoaXMueG1sUGF0aENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKSkgewotCQkJeG1sUGF0aC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRHVwbGljYXRlUU5hbWUoWG1sRWxlbWVudCB4bWxFbGVtZW50LCBCYWc8UU5hbWU+IHhtbEVsZW1lbnRRTmFtZXMsIAotCQkJCUxpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJaWYgKGdldFhtbFBhdGhzU2l6ZSgpID09IDApIHsgCi0JCQlzdXBlci52YWxpZGF0ZUR1cGxpY2F0ZVFOYW1lKHhtbEVsZW1lbnQsIHhtbEVsZW1lbnRRTmFtZXMsIG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFBhdGhzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9QQVRIUyk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWFubm90YXRpb24gPSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKDAsIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sUGF0aENvbnRhaW5lcgotCQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxFTEphdmFYbWxQYXRoLCBYbWxQYXRoQW5ub3RhdGlvbj4gewotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEVMWG1sRWxlbWVudHNNYXBwaW5nLlhNTF9QQVRIU19MSVNUOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEVMSmF2YVhtbFBhdGggYnVpbGRDb250ZXh0RWxlbWVudChYbWxQYXRoQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcudGhpcy5idWlsZFhtbFBhdGgocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUGF0aEFubm90YXRpb24+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nLnRoaXMuZ2V0WG1sUGF0aEFubm90YXRpb25zKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sUGF0aEFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEVMSmF2YVhtbFBhdGggY29udGV4dEVsZW1lbnQpIHsKLQkJCS8vIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgbWFwcGluZywgdGhlcmUgd2lsbCBuZXZlciBiZSBhbiBFTFhtbFBhdGggd2l0aG91dCBhbiBhbm5vdGF0aW9uCi0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0QW5ub3RhdGlvbigpOwotCQl9Ci0JCQotLy8JCXB1YmxpYyBpbnQgaW5kZXhPZihYbWwpCi0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBYbWxQYXRoQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxQYXRoLkNvbnRleHQgewotCQkKLQkJcHJvdGVjdGVkIFhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb247Ci0JCQotCQkKLQkJcHJvdGVjdGVkIFhtbFBhdGhDb250ZXh0KFhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBYbWxQYXRoQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbjsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgWG1sRWxlbWVudENvbnRleHQKLQkJCWV4dGVuZHMgR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmcuWG1sRWxlbWVudENvbnRleHQKLQkJCWltcGxlbWVudHMgRUxKYXZhWG1sRWxlbWVudC5Db250ZXh0IHsKLQkJCi0JCXByb3RlY3RlZCBYbWxFbGVtZW50Q29udGV4dChYbWxFbGVtZW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQlzdXBlcihhbm5vdGF0aW9uKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sUGF0aCgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcudGhpcy5nZXRYbWxQYXRoc1NpemUoKSA+IDA7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGNsYXNzIFhtbEVsZW1lbnRXcmFwcGVyQ29udGV4dAotCQkJaW1wbGVtZW50cyBFTEphdmFYbWxFbGVtZW50V3JhcHBlci5Db250ZXh0IHsKLQkJCi0JCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcudGhpcy5nZXRYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24oKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaGFzWG1sUGF0aCgpIHsKLQkJCXJldHVybiBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcudGhpcy5nZXRYbWxQYXRoc1NpemUoKSA+IDA7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyY2NiMS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24KLQkJZXh0ZW5kcyBKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbiB7Ci0JCi0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSAKLQkJCXsKLQkJCQlFTEpheGIuWE1MX1BBVEgsCi0JCQkJRUxKYXhiLlhNTF9QQVRIUyB9OwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByb3RlY3RlZCBFTEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCQkJc3VwZXIuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQkJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVhNzNmZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24+Ci0JCWltcGxlbWVudHMgRUxYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZyB7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeTsKLQkKLQkKLQlwdWJsaWMgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWFwcGVkQnkgPSBnZXRSZXNvdXJjZU1hcHBlZEJ5KCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRUxKYXhiTWFwcGluZ0tleXMuWE1MX0lOVkVSU0VfUkVGRVJFTkNFX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0U7Ci0JfQotCQotCQotCS8vICoqKioqIHN5bmMvdXBkYXRlICoqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkKLQkJc2V0TWFwcGVkQnlfKGdldFJlc291cmNlTWFwcGVkQnkoKSk7Ci0JfQotCQotCQotCS8vICoqKioqIG1hcHBlZEJ5ICoqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIG1hcHBlZEJ5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpIHsKLQkJZ2V0WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24oKS5zZXRNYXBwZWRCeShtYXBwZWRCeSk7Ci0JCXNldE1hcHBlZEJ5XyhtYXBwZWRCeSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBlZEJ5XyhTdHJpbmcgbWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgbWFwcGVkQnkpOwotCX0KLQkKLQlwdWJsaWMgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gZ2V0WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24pIGdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIGdldFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKCkuZ2V0TWFwcGVkQnkoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWlzYyAqKioqKgotCQotCXByb3RlY3RlZCBKYXhiQ2xhc3NNYXBwaW5nIGdldFJlZmVyZW5jZWRDbGFzc01hcHBpbmcoKSB7Ci0JCVN0cmluZyByZWZlcmVuY2VkQ2xhc3NOYW1lID0gZ2V0VmFsdWVUeXBlTmFtZSgpOwotCQlyZXR1cm4gKHJlZmVyZW5jZWRDbGFzc05hbWUgPT0gbnVsbCkgPyBudWxsIDogZ2V0Q29udGV4dFJvb3QoKS5nZXRDbGFzc01hcHBpbmcocmVmZXJlbmNlZENsYXNzTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRSZWZlcmVuY2VkQXR0cmlidXRlKCkgewotCQlTdHJpbmcgbWFwcGVkQnkgPSBnZXRNYXBwZWRCeSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShtYXBwZWRCeSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpheGJDbGFzc01hcHBpbmcgcmVmZXJlbmNlZENsYXNzTWFwcGluZyA9IGdldFJlZmVyZW5jZWRDbGFzc01hcHBpbmcoKTsKLQkJaWYgKHJlZmVyZW5jZWRDbGFzc01hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgdGVtcFJlc3VsdCA9IG51bGw7Ci0JCWZvciAoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogcmVmZXJlbmNlZENsYXNzTWFwcGluZy5nZXRBbGxMb2NhbGx5RGVmaW5lZEF0dHJpYnV0ZXMoKSkgewotCQkJaWYgKGF0dHJpYnV0ZS5nZXROYW1lKCkuZXF1YWxzKG1hcHBlZEJ5KSkgewotCQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpID09IE1hcHBpbmdLZXlzLlhNTF9UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQkJCXRlbXBSZXN1bHQgPSBhdHRyaWJ1dGU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gYXR0cmlidXRlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGVtcFJlc3VsdDsKLQl9Ci0JCi0JCi0JLy8gKioqKiogY29udGVudCBhc3Npc3QgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlpZiAoZ2V0WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24oKS5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmVzdWx0ID0gZ2V0TWFwcGVkQnlQcm9wb3NhbHMoZmlsdGVyLCBhc3RSb290KTsKLQkJfQotCQlpZiAoISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXN1bHQpKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRNYXBwZWRCeVByb3Bvc2FscyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUpheGJDbGFzc01hcHBpbmcgcmVmZXJlbmNlZENsYXNzTWFwcGluZyA9IGdldFJlZmVyZW5jZWRDbGFzc01hcHBpbmcoKTsKLQkJCi0JCWlmIChyZWZlcmVuY2VkQ2xhc3NNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHMoCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4ocmVmZXJlbmNlZENsYXNzTWFwcGluZy5nZXRBbGxMb2NhbGx5RGVmaW5lZEF0dHJpYnV0ZXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0TmFtZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkKLQkJdmFsaWRhdGVNYXBwZWRCeShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHBlZEJ5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyBtYXBwZWRCeSA9IGdldE1hcHBlZEJ5KCk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KG1hcHBlZEJ5KSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZX05PVF9TUEVDSUZJRUQsCi0JCQkJCQkJdGhpcywKLQkJCQkJCQlnZXRNYXBwZWRCeVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlKYXhiQ2xhc3NNYXBwaW5nIHJlZmVyZW5jZWRDbGFzc01hcHBpbmcgPSBnZXRSZWZlcmVuY2VkQ2xhc3NNYXBwaW5nKCk7Ci0JCWlmIChyZWZlcmVuY2VkQ2xhc3NNYXBwaW5nID09IG51bGwpIHsKLQkJCS8vIFRPRE8gdmFsaWRhdGU/Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHJlZmVyZW5jZWRBdHRyaWJ1dGUgPSBnZXRSZWZlcmVuY2VkQXR0cmlidXRlKCk7Ci0JCWlmIChyZWZlcmVuY2VkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfUkVTT0xWRUQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgbWFwcGVkQnksIHJlZmVyZW5jZWRDbGFzc01hcHBpbmcuZ2V0SmF4YlR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCQllbHNlIGlmIChyZWZlcmVuY2VkQXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSAhPSBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfWE1MX0VMRU1FTlQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgbWFwcGVkQnksIHJlZmVyZW5jZWRDbGFzc01hcHBpbmcuZ2V0SmF4YlR5cGUoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSB9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoYXN0Um9vdCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBnZXRYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbigpLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2IxY2YyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4Yk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcm90ZWN0ZWQgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEVMSmF4Yk1hcHBpbmdLZXlzLlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgSmF4YkF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF4YkZhY3RvcnkgZmFjdG9yeSkgewotCQkvLyBUT0RPOiBtb3ZlIHRvIGZhY3Rvcnkgb25jZSBBUEkgb3BlbnMgdXAgYWdhaW4KLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxQYXRoLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sUGF0aC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjNhZjczLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxQYXRoLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuU2ltcGxlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5FTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkVMSmF4YlZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sUGF0aAotCQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnRleHROb2RlCi0JCWltcGxlbWVudHMgRUxYbWxQYXRoIHsKLQkJCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQkKLQlwcm90ZWN0ZWQgQ29udGV4dCBjb250ZXh0OwotCQotCXByb3RlY3RlZCBMaXN0PFN0ZXA+IHN0ZXBzOwotCQotCQotCXB1YmxpYyBFTEphdmFYbWxQYXRoKEphdmFDb250ZXh0Tm9kZSBwYXJlbnQsIENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQlpbml0VmFsdWUoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogc3luYy91cGRhdGUgKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXN5bmNWYWx1ZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWx1ZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0QW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKLQkJc2V0VmFsdWVfKHZhbHVlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHRoaXMudmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0VmFsdWUoKSB7Ci0JCXRoaXMudmFsdWUgPSBnZXRBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKTsKLQkJaW5pdFN0ZXBzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNWYWx1ZSgpIHsKLQkJc2V0VmFsdWVfKGdldEFubm90YXRpb24oKS5nZXRWYWx1ZSgpKTsKLQkJc3luY1N0ZXBzKCk7Ci0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgWG1sUGF0aEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29udGV4dC5nZXRBbm5vdGF0aW9uKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHN0ZXBzICoqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0ZXBzKCkgewotCQl0aGlzLnN0ZXBzID0gbmV3IFZlY3RvcjxTdGVwPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKHRoaXMuc3RlcHMsIHBhcnNlKHRoaXMudmFsdWUpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc3luY1N0ZXBzKCkgewotCQlTdHJpbmcgb2xkWHBhdGggPSBnZXRDb21wbGV0ZVhwYXRoKCk7Ci0JCWlmICghIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLnZhbHVlLCBvbGRYcGF0aCkpIHsKLQkJCXRoaXMuc3RlcHMuY2xlYXIoKTsKLQkJCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5zdGVwcywgcGFyc2UodGhpcy52YWx1ZSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcGxldGVYcGF0aCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yPFN0ZXA+IHN0cmVhbSA9IHRoaXMuc3RlcHMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlzYi5hcHBlbmQoc3RyZWFtLm5leHQoKS52YWx1ZSk7Ci0JCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXNiLmFwcGVuZChERUxJTSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHZhbGlkYXRpb24gKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGdldEFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQotCQlTdHJpbmcgY29tcGxldGVYcGF0aCA9IGdldENvbXBsZXRlWHBhdGgoKTsKLQkJaWYgKGNvbXBsZXRlWHBhdGguc3RhcnRzV2l0aChERUxJTSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9QQVRIX19ST09UX05PVF9TVVBQT1JURUQsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7IHRoaXMudmFsdWUgfSwKLQkJCQkJCQkJRUxKYXZhWG1sUGF0aC50aGlzLAotCQkJCQkJCQlnZXRWYWx1ZVRleHRSYW5nZShhc3RSb290KSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlJTWVzc2FnZSBmaXJzdEZvcm1FcnJvciA9IG51bGw7Ci0JCUl0ZXJhdG9yPFN0ZXA+IHN0cmVhbSA9IHRoaXMuc3RlcHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGZpcnN0Rm9ybUVycm9yID09IG51bGwgJiYgc3RyZWFtLmhhc05leHQoKSApIHsKLQkJCWZpcnN0Rm9ybUVycm9yID0gc3RyZWFtLm5leHQoKS5nZXRGaXJzdEZvcm1FcnJvcihtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQkJaWYgKGZpcnN0Rm9ybUVycm9yICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZChmaXJzdEZvcm1FcnJvcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQlyZXR1cm4gZ2V0QW5ub3RhdGlvbigpLmdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlKFN0ZXAgc3RlcCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIGVudGlyZVRleHRSYW5nZSA9IGdldFZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlpbnQgc3RhcnQgPSAxOyAvLyBtb3ZlIHRvIHJpZ2h0IG9uZSBzaW5jZSBpbml0aWFsIHRleHQgcmFuZ2UgaW5jbHVkZXMgZmlyc3QgcXVvdGUKLQkJZm9yIChTdGVwIGVhY2ggOiB0aGlzLnN0ZXBzKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZWFjaC52YWx1ZS5sZW5ndGgoKTsKLQkJCQlpZiAoZWFjaCA9PSBzdGVwKSB7Ci0JCQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkJCWlmICh0aGlzLnN0ZXBzLnNpemUoKSA+IDEpIHsKLQkJCQkJCS8vIGV4cGFuZCB0ZXh0IHJhbmdlIHRvIGluY2x1ZGUgZWl0aGVyIGxlYWRpbmcgb3IgdHJhaWxpbmcgIi8iCi0JCQkJCQlsZW5ndGggKz0gMTsKLQkJCQkJCWlmIChzdGVwLmluZGV4ICE9IDApIHsKLQkJCQkJCQkvLyBpZiBzdGVwIGlzIG5vdCBmaXJzdCBzdGVwLCB1c2UgbGVhZGluZyAiLyIKLQkJCQkJCQlzdGFydCAtLTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBlbnRpcmVUZXh0UmFuZ2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVUZXh0UmFuZ2UoZW50aXJlVGV4dFJhbmdlLmdldE9mZnNldCgpICsgc3RhcnQsIGxlbmd0aCwgZW50aXJlVGV4dFJhbmdlLmdldExpbmVOdW1iZXIoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGFydCArPSBsZW5ndGggKyAxOyAvLyBzdGVwIHBsdXMgIi8iCi0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU3RlcCBtdXN0IGJlIGluIGxpc3Qgb2YgdGhpcyBYbWxQYXRoJ3Mgc3RlcHMuIik7Ci0JfQotCQotCQotCS8vICoqKioqIHhwYXRoIHBhcnNpbmcgKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUxJTSA9ICIvIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBURVhUID0gInRleHQoKSI7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgU0VMRiA9ICIuIjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBBVFRfUFJFRklYID0gIkAiOwotCQotCXByb3RlY3RlZCBTdGVwW10gcGFyc2UoU3RyaW5nIHhwYXRoKSB7Ci0JCWlmICh4cGF0aCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IFN0ZXBbMF07Ci0JCX0KLQkJU3RyaW5nW10gc2VnbWVudHMgPSB4cGF0aC5zcGxpdChERUxJTSwgLTEpOwotCQlTdGVwW10gc3RlcHMgPSBuZXcgU3RlcFtzZWdtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZ21lbnRzLmxlbmd0aDsgaSArKyApIHsKLQkJCXN0ZXBzW2ldID0gbmV3IFN0ZXAoc2VnbWVudHNbaV0sIGkpOwotCQl9Ci0JCXJldHVybiBzdGVwczsKLQl9Ci0JCi0JCi0JcHVibGljIGludGVyZmFjZSBDb250ZXh0IHsKLQkJCi0JCVhtbFBhdGhBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFN0ZXAgewotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQkJCi0JCXByb3RlY3RlZCBpbnQgaW5kZXg7Ci0JCQotCQlwcm90ZWN0ZWQgRmxhdm9yIGZsYXZvcjsKLQkJCi0JCQotCQlwcm90ZWN0ZWQgU3RlcChTdHJpbmcgdmFsdWUsIGludCBpbmRleCkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQkJdGhpcy5mbGF2b3IgPSBkZXRlcm1pbmVGbGF2b3IoKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIEZsYXZvciBkZXRlcm1pbmVGbGF2b3IoKSB7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnZhbHVlKSkgewotCQkJCXJldHVybiBGbGF2b3IuRU1QVFk7Ci0JCQl9Ci0JCQllbHNlIGlmIChURVhULmVxdWFscyh0aGlzLnZhbHVlKSkgewotCQkJCXJldHVybiBGbGF2b3IuVEVYVDsKLQkJCX0KLQkJCWVsc2UgaWYgKFNFTEYuZXF1YWxzKHRoaXMudmFsdWUpKSB7Ci0JCQkJcmV0dXJuIEZsYXZvci5TRUxGOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy52YWx1ZS5zdGFydHNXaXRoKEFUVF9QUkVGSVgpKSB7Ci0JCQkJcmV0dXJuIEZsYXZvci5BVFRSSUJVVEU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXR1cm4gRmxhdm9yLkVMRU1FTlQ7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJTWVzc2FnZSBnZXRGaXJzdEZvcm1FcnJvcihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXN3aXRjaCAodGhpcy5mbGF2b3IpIHsKLQkJCQljYXNlIEVNUFRZIDoKLQkJCQkJcmV0dXJuIEVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlci5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1BBVEhfX0lOVkFMSURfRk9STV9JTExFR0FMX1NFR01FTlQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsgdGhpcy52YWx1ZSB9LAotCQkJCQkJCUVMSmF2YVhtbFBhdGgudGhpcywKLQkJCQkJCQlFTEphdmFYbWxQYXRoLnRoaXMuYnVpbGRUZXh0UmFuZ2UodGhpcywgYXN0Um9vdCkpOwotCQkJCWNhc2UgU0VMRiA6Ci0JCQkJCWlmICh0aGlzLmluZGV4ICE9IDApIHsKLQkJCQkJCXJldHVybiBFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9QQVRIX19TRUxGX1NFR01FTlRfTVVTVF9CRV9GSVJTVF9TRUdNRU5ULAotCQkJCQkJCUVMSmF2YVhtbFBhdGgudGhpcywKLQkJCQkJCQlFTEphdmFYbWxQYXRoLnRoaXMuYnVpbGRUZXh0UmFuZ2UodGhpcywgYXN0Um9vdCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCWNhc2UgVEVYVCA6Ci0JCQkJCWlmICh0aGlzLmluZGV4ICE9IEVMSmF2YVhtbFBhdGgudGhpcy5zdGVwcy5zaXplKCkgLSAxKSB7Ci0JCQkJCQlyZXR1cm4gRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUVMSmF4YlZhbGlkYXRpb25NZXNzYWdlcy5YTUxfUEFUSF9fVEVYVF9TRUdNRU5UX01VU1RfQkVfTEFTVF9TRUdNRU5ULAotCQkJCQkJCUVMSmF2YVhtbFBhdGgudGhpcywKLQkJCQkJCQlFTEphdmFYbWxQYXRoLnRoaXMuYnVpbGRUZXh0UmFuZ2UodGhpcywgYXN0Um9vdCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCWNhc2UgQVRUUklCVVRFIDoKLQkJCQkJaWYgKHRoaXMuaW5kZXggIT0gRUxKYXZhWG1sUGF0aC50aGlzLnN0ZXBzLnNpemUoKSAtIDEpIHsKLQkJCQkJCXJldHVybiBFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLlhNTF9QQVRIX19BVFRSSUJVVEVfU0VHTUVOVF9NVVNUX0JFX0xBU1RfU0VHTUVOVCwKLQkJCQkJCQlFTEphdmFYbWxQYXRoLnRoaXMsCi0JCQkJCQkJRUxKYXZhWG1sUGF0aC50aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMsIGFzdFJvb3QpKTsKLQkJCQkJfQotCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBlbnVtIEZsYXZvciB7Ci0JCQotCQlFTVBUWSwKLQkJCi0JCVNFTEYsCi0JCQotCQlURVhULAotCQkKLQkJRUxFTUVOVCwKLQkJCi0JCUFUVFJJQlVURQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxUcmFuc2Zvcm1hdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2OTA4Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZwotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8WG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uPiB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBFTEpheGJNYXBwaW5nS2V5cy5YTUxfVFJBTlNGT1JNQVRJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9UUkFOU0ZPUk1BVElPTjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZkMDVmNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJvdGVjdGVkIEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gRUxKYXhiTWFwcGluZ0tleXMuWE1MX1RSQU5TRk9STUFUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT047Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXhiRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCS8vIFRPRE86IG1vdmUgdG8gZmFjdG9yeSBvbmNlIEFQSSBvcGVucyB1cCBhZ2FpbgotCQlyZXR1cm4gbmV3IEVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL2xpYnZhbC9FTEpheGJVc2VyTGlicmFyeVZhbGlkYXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VMSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNmMzNmQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvbGlidmFsL0VMSmF4YlVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnZhbC5MaWJWYWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5KcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwubGlidmFsLkVjbGlwc2VMaW5rTGliVmFsVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmxpYnByb3YuSmF4YlVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotCi0KLS8qKgotICogTGlicmFyeSB2YWxpZGF0b3IgZm9yIEVjbGlwc2VMaW5rIEpBWEIgdXNlciBsaWJyYXJpZXMuCi0gKiAKLSAqIEluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGNvcnJlY3QgZWNsaXBzZWxpbmsuamFyIGlzIHByZXNlbnQgaW4gdGhlIHVzZXIgbGlicmFyeSwgdGhlIHZlcnNpb24KLSAqIGNsYXNzIHdoaWNoIGFwcGVhcnMgaW4gc3RhbmRhcmQgRWNsaXBzZUxpbmsgbGlicmFyaWVzIHdpbGwgYmUgZXhhbWluZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgdGhlCi0gKiB1bmlvbiBvZiBjYWxjdWxhdGVkIHZlcnNpb24gcmFuZ2VzLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHNwZWNpZmllZCBpbiB0aGUgY29uZmlnLgotICovCi1wdWJsaWMgY2xhc3MgRUxKYXhiVXNlckxpYnJhcnlWYWxpZGF0b3IKLQkJaW1wbGVtZW50cyBMaWJyYXJ5VmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQlKYXhiVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgamF4YkNvbmZpZyAKLQkJCQk9IChKYXhiVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZzsKLQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0gPSBqYXhiQ29uZmlnLmdldEpheGJQbGF0Zm9ybSgpOwotCQlTZXQ8VmVyc2lvblJhbmdlPiB2ZXJzaW9uUmFuZ2VzID0gbmV3IEhhc2hTZXQ8VmVyc2lvblJhbmdlPigpOwotCQkKLQkJaWYgKEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8xLmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCXZlcnNpb25SYW5nZXMuYWRkKG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjEsIDMuMCkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChFTEpheGJQbGF0Zm9ybS5WRVJTSU9OXzJfMi5lcXVhbHMocGxhdGZvcm0pKSB7Ci0JCQl2ZXJzaW9uUmFuZ2VzLmFkZChuZXcgVmVyc2lvblJhbmdlKCJbMi4yLCAzLjApIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzMuZXF1YWxzKHBsYXRmb3JtKSkgewotCQkJdmVyc2lvblJhbmdlcy5hZGQobmV3IFZlcnNpb25SYW5nZSgiWzIuMywgMy4wKSIpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl80LmVxdWFscyhwbGF0Zm9ybSkpIHsKLQkJCXZlcnNpb25SYW5nZXMuYWRkKG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjQsIDMuMCkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBFY2xpcHNlTGlua0xpYlZhbFV0aWwudmFsaWRhdGUoamF4YkNvbmZpZy5yZXNvbHZlKCksIHZlcnNpb25SYW5nZXMpOwotCQkKLQkJaWYgKCEgc3RhdHVzLmlzT0soKSkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCQkKLQkJLy8gZmluYWxseSBsb29rIGZvciB4amMgY2xhc3NlcwotCQkKLQkJU2V0PFN0cmluZz4gY2xhc3NOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCi0JCWNsYXNzTmFtZXMuYWRkKCJjb20uc3VuLnRvb2xzLnhqYy5YSkNGYWNhZGUiKTsgLy8kTk9OLU5MUy0xJAotCQljbGFzc05hbWVzLmFkZCgiY29tLnN1bi54bWwuYmluZC5VdGlsIik7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCUl0ZXJhYmxlPElQYXRoPiBsaWJyYXJ5UGF0aHMgPSAKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJQ2xhc3NwYXRoRW50cnksIElQYXRoPihqYXhiQ29uZmlnLnJlc29sdmUoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIElQYXRoIHRyYW5zZm9ybShJQ2xhc3NwYXRoRW50cnkgbykgewotCQkJCQkJcmV0dXJuIG8uZ2V0UGF0aCgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCi0JCXN0YXR1cyA9IExpYlZhbFV0aWwudmFsaWRhdGUobGlicmFyeVBhdGhzLCBjbGFzc05hbWVzKTsKLQkJCi0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgSnB0SmF4YkNvcmVQbHVnaW4uUExVR0lOX0lELCBKcHRDb21tb25FY2xpcHNlTGlua0NvcmVNZXNzYWdlcy5FTEpheGJVc2VyTGlicmFyeVZhbGlkYXRvcl9ub1hqY0NsYXNzZXMpOwotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1ZDE5ZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbgotCQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUGF0aEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNjU5M2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVhtbFBhdGhBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLQotCi1wdWJsaWMgY2xhc3MgWG1sUGF0aEFubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBYbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBYbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfUEFUSDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfUEFUSFM7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX1BBVEhfX1ZBTFVFOwotCX0KLQkKLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZVhtbFBhdGhBbm5vdGF0aW9uLmJ1aWxkU291cmNlWG1sUGF0aEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxQYXRoQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxQYXRoc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlZDc0ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxQYXRoc0Fubm90YXRpb25EZWZpbml0aW9uCi0JCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24gewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFhtbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBYbWxQYXRoc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9QQVRIUzsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbiwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlMjE5Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5WG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci0KLQotcHVibGljIGNsYXNzIFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFTEpheGIuWE1MX1RSQU5TRk9STUFUSU9OOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhNjAwYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRUxKYXhiOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQmluYXJ5WG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCQotCQotCXB1YmxpYyBCaW5hcnlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm1hcHBlZEJ5ID0gYnVpbGRNYXBwZWRCeSgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0TWFwcGVkQnlfKGJ1aWxkTWFwcGVkQnkoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubWFwcGVkQnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBtYXBwZWRCeSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgbWFwcGVkQnkpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQlkpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sUGF0aEFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVhtbFBhdGhBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZTVmODUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sUGF0aEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIEJpbmFyeVhtbFBhdGhBbm5vdGF0aW9uCi0JCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFBhdGhBbm5vdGF0aW9uIHsKLQkKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQkKLQkKLQlwdWJsaWMgQmluYXJ5WG1sUGF0aEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IGJ1aWxkVmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfUEFUSDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0VmFsdWVfKGJ1aWxkVmFsdWUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKiB2YWx1ZSAqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEVMSmF4Yi5YTUxfUEFUSF9fVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5WG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I5ZDBlNi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBCaW5hcnlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24KLQkJZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JCWltcGxlbWVudHMgWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHsKLQkKLQlwcml2YXRlIEJvb2xlYW4gb3B0aW9uYWw7Ci0JCi0JCi0JcHVibGljIEJpbmFyeVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm9wdGlvbmFsID0gYnVpbGRPcHRpb25hbCgpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9UUkFOU0ZPUk1BVElPTjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJc2V0T3B0aW9uYWxfKGJ1aWxkT3B0aW9uYWwoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMub3B0aW9uYWwpOwotCX0KLQkKLQkKLQkvLyAqKioqKiBvcHRpb25hbCAKLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBzZXRPcHRpb25hbF8oQm9vbGVhbiBvcHRpb25hbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMub3B0aW9uYWw7Ci0JCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShFTEpheGIuWE1MX1RSQU5TRk9STUFUSU9OX19PUFRJT05BTCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNWViNGUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFNvdXJjZVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG1hcHBlZEJ5RGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbWFwcGVkQnlBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCQotCQotCXB1YmxpYyBTb3VyY2VYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKSk7Ci0JfQotCi0JcHVibGljIFNvdXJjZVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm1hcHBlZEJ5RGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRNYXBwZWRCeURlY2xhcmF0aW9uQWRhcHRlcihkYWEpOwotCQl0aGlzLm1hcHBlZEJ5QWRhcHRlciA9IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKHRoaXMubWFwcGVkQnlEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRNYXBwZWRCeURlY2xhcmF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGRhYSwgRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm1hcHBlZEJ5ID0gYnVpbGRNYXBwZWRCeShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY01hcHBlZEJ5KGJ1aWxkTWFwcGVkQnkoYXN0Um9vdCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm1hcHBlZEJ5KTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogbWFwcGVkQnkgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCWlmIChhdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5tYXBwZWRCeSwgbWFwcGVkQnkpKSB7Ci0JCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShtYXBwZWRCeSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNNYXBwZWRCeShTdHJpbmcgYXN0TWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBhc3RNYXBwZWRCeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkLCB0aGlzLm1hcHBlZEJ5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRNYXBwZWRCeShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm1hcHBlZEJ5RGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBlbGVtZW50VG91Y2hlcyh0aGlzLm1hcHBlZEJ5RGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFBhdGhBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VYbWxQYXRoQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzY5MGJkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFBhdGhBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBTb3VyY2VYbWxQYXRoQW5ub3RhdGlvbgotCQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQkJaW1wbGVtZW50cyBYbWxQYXRoQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IAotCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9QQVRIKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IAotCQkJbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoRUxKYXhiLlhNTF9QQVRIUyk7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlWG1sUGF0aEFubm90YXRpb24gYnVpbGRTb3VyY2VYbWxQYXRoQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQkKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkWG1sUGF0aERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRYbWxQYXRoQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlWG1sUGF0aEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpZGFhLCBpYWEpOwotCX0KLQkKLQkKLQlwcml2YXRlIFNvdXJjZVhtbFBhdGhBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJCi0JCXN1cGVyKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSBidWlsZFZhbHVlQWRhcHRlcihkYWEpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoZGFhLCBFTEpheGIuWE1MX1BBVEhfX1ZBTFVFLCBTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJCi0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBjb252ZXJ0ZXIpOwotCX0KLQkKLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRUxKYXhiLlhNTF9QQVRIOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSBidWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3luY1ZhbHVlKGJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKiogdmFsdWUgKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGVsZW1lbnRUb3VjaGVzKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCQotCQotCS8vICoqKioqIE5lc3RhYmxlQW5ub3RhdGlvbiBpbXBsICoqKioqCi0JCi0JLyoqCi0JICogY29udmVuaWVuY2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kIGZyb20gTmVzdGFibGVBbm5vdGF0aW9uIGludGVyZmFjZQotCSAqIGZvciBzdWJjbGFzc2VzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbW92ZUFubm90YXRpb24oaW50IG5ld0luZGV4KSB7Ci0JCXRoaXMuZ2V0SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKCkubW92ZUFubm90YXRpb24obmV3SW5kZXgpOwotCX0KLQkKLQlwcml2YXRlIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBnZXRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiAoSW5kZXhlZEFubm90YXRpb25BZGFwdGVyKSB0aGlzLmFubm90YXRpb25BZGFwdGVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbFBhdGhBbm5vdGF0aW9uQWRhcHRlcigKLQkJCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFhtbFBhdGhEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gCi0JCQkJbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQkJQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQkJaW5kZXgsCi0JCQkJCUVMSmF4Yi5YTUxfUEFUSCk7Ci0JCXJldHVybiBpZGFhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGI3OTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uCi0JCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCQlpbXBsZW1lbnRzIFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT04pOwotCQotCXByaXZhdGUgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3B0aW9uYWxBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQkKLQkKLQlwdWJsaWMgU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpKTsKLQl9Ci0KLQlwdWJsaWMgU291cmNlWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm9wdGlvbmFsRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRPcHRpb25hbERlY2xhcmF0aW9uQWRhcHRlcihkYWEpOwotCQl0aGlzLm9wdGlvbmFsQWRhcHRlciA9IGJ1aWxkU2hvcnRDaXJjdWl0Qm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMub3B0aW9uYWxEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQkKLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3B0aW9uYWxEZWNsYXJhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JCb29sZWFucyhkYWEsIEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT05fX09QVElPTkFMKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRTaG9ydENpcmN1aXRCb29sZWFuRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT047Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5vcHRpb25hbCA9IGJ1aWxkT3B0aW9uYWwoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNPcHRpb25hbChidWlsZE9wdGlvbmFsKGFzdFJvb3QpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5vcHRpb25hbCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogb3B0aW9uYWwKLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJaWYgKGF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm9wdGlvbmFsLCBvcHRpb25hbCkpIHsKLQkJCXRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJCXRoaXMub3B0aW9uYWxBZGFwdGVyLnNldFZhbHVlKG9wdGlvbmFsKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY09wdGlvbmFsKEJvb2xlYW4gYXN0T3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gYXN0T3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCB0aGlzLm9wdGlvbmFsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5vcHRpb25hbERlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX0ZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRUxKYXhiXzJfMV9GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhY2Y5NzAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLkFic3RyYWN0SmF4YkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxFbGVtZW50c01hcHBpbmc7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzFfRmFjdG9yeQotCQlleHRlbmRzIEFic3RyYWN0SmF4YkZhY3RvcnkgewotCQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpheGJGYWN0b3J5IElOU1RBTkNFID0gbmV3IEVMSmF4Yl8yXzFfRmFjdG9yeSgpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YkZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVMSmF4Yl8yXzFfRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJDb250ZXh0Um9vdCBidWlsZENvbnRleHRSb290KEpheGJQcm9qZWN0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEVMSmF4YkNvbnRleHRSb290KHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQW55RWxlbWVudE1hcHBpbmcgYnVpbGRKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcoSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhWG1sQXR0cmlidXRlTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxFbGVtZW50TWFwcGluZyBidWlsZEphdmFYbWxFbGVtZW50TWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxFbGVtZW50TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sRWxlbWVudHNNYXBwaW5nIGJ1aWxkSmF2YVhtbEVsZW1lbnRzTWFwcGluZyhKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBFTEphdmFYbWxFbGVtZW50c01hcHBpbmcocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8xL0VMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMjFmYWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjEuR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RFTEpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxFbGVtZW50c01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5YbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFBhdGhzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEFic3RyYWN0RUxKYXhiUGxhdGZvcm1EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBFTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlZmluaXRpb24gZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8xOwotCX0KLQkKLQlwdWJsaWMgSmF4YkZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzFfRmFjdG9yeS5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlJlc291cmNlTW9kZWxQcm92aWRlcltdIGJ1aWxkUmVzb3VyY2VNb2RlbFByb3ZpZGVycygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYXJyYXkoCi0JCQkJZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKS5nZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCksIAotCQkJCW5ldyBKYXhiUmVzb3VyY2VNb2RlbFByb3ZpZGVyWzBdKTsKLQkJCQotCX0KLQkKLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCXJldHVybiBnZXRHZW5lcmljSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoY29udGVudFR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBidWlsZEFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAotCQkJCWdldEdlbmVyaWNKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCksCi0JCQkJWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCQkJWG1sUGF0aHNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQkJCVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gYnVpbGROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAotCQkJCWdldEdlbmVyaWNKYXhiUGxhdGZvcm1EZWZpbml0aW9uKCkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSwKLQkJCQlYbWxQYXRoQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oCi0JCQlBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgZ2V0R2VuZXJpY0pheGJQbGF0Zm9ybURlZmluaXRpb24oKS5nZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKAotCQkJQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBnZXRHZW5lcmljSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpLmdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzEvRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYmM1MDQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeQotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IHsKLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBFTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzIvRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzIvRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkMmUxYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8yL0VMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfMjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5qYXhiMjIuR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbFRyYW5zZm9ybWF0aW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8xLkVMSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbgotCQlleHRlbmRzICBFTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl8yOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBnZXRHZW5lcmljSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb24uaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKAotCQkJQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJc3VwZXIuYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgRUxKYXZhWG1sVHJhbnNmb3JtYXRpb25NYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8yL0VMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMi9FTEpheGJfMl8yX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4NDRkNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml8yL0VMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5Ci0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkgewotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGZmMDA1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzMvRUxKYXhiXzJfM19QbGF0Zm9ybURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5FTEpheGJQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzIuRUxKYXhiXzJfMl9QbGF0Zm9ybURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uCi0JCWV4dGVuZHMgIEVMSmF4Yl8yXzJfUGxhdGZvcm1EZWZpbml0aW9uIHsKLQkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByb3RlY3RlZCBFTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gRUxKYXhiUGxhdGZvcm0uVkVSU0lPTl8yXzM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzMvRUxKYXhiXzJfM19QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmM2NGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbkZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeQotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IHsKLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBidWlsZEpheGJQbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBFTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA2NDhiMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml80L0VMSmF4Yl8yXzRfUGxhdGZvcm1EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52Ml8zLkVMSmF4Yl8yXzNfUGxhdGZvcm1EZWZpbml0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl80X1BsYXRmb3JtRGVmaW5pdGlvbgotCQlleHRlbmRzICBFTEpheGJfMl8zX1BsYXRmb3JtRGVmaW5pdGlvbiB7Ci0JCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFTEpheGJfMl80X1BsYXRmb3JtRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF4YlBsYXRmb3JtRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4YlBsYXRmb3JtLlZFUlNJT05fMl80OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9pbnRlcm5hbC92Ml80L0VMSmF4Yl8yXzRfUGxhdGZvcm1EZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGZiMmE4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3YyXzQvRUxKYXhiXzJfNF9QbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwudjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl80X1BsYXRmb3JtRGVmaW5pdGlvbkZhY3RvcnkKLQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybURlZmluaXRpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBKYXhiUGxhdGZvcm1EZWZpbml0aW9uIGJ1aWxkSmF4YlBsYXRmb3JtRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIEVMSmF4Yl8yXzRfUGxhdGZvcm1EZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWMwZmIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkpwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBFTEpheGJWYWxpZGF0aW9uTWVzc2FnZUJ1aWxkZXIgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIERFRkFVTFRfUEFSTVMgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgc3RhdGljIFRleHRSYW5nZSBERUZBVUxUX1RFWFRfUkFOR0UgPSBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlSWQsIERFRkFVTFRfUEFSTVMsIHRhcmdldE9iamVjdCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKAotCQkJaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QsIERFRkFVTFRfVEVYVF9SQU5HRSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKAotCQkJaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBidWlsZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2VJZCwgREVGQVVMVF9QQVJNUywgdGFyZ2V0T2JqZWN0LCB0ZXh0UmFuZ2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nW10gcGFybXMsIE9iamVjdCB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBFTEpheGJWYWxpZGF0aW9uTWVzc2FnZShFTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuQlVORExFX05BTUUsIHNldmVyaXR5LCBtZXNzYWdlSWQsIHBhcm1zLCB0YXJnZXRPYmplY3QpOwotCQltZXNzYWdlLnNldE1hcmtlcklkKEpwdEpheGJDb3JlUGx1Z2luLlZBTElEQVRJT05fTUFSS0VSX0lEKTsgLy9UT0RPIGRvIHdlIG5lZWQgYW4gJ0VjbGlwc2VMaW5rJyBwcm9ibGVtIG1hcmtlcj8KLQkJaWYgKHRleHRSYW5nZSA9PSBudWxsKSB7Ci0JCQkvL2xvZyBhbiBleGNlcHRpb24gYW5kIHRoZW4gY29udGludWUgd2l0aG91dCBzZXR0aW5nIGxvY2F0aW9uIGluZm9ybWF0aW9uCi0JCQkvL0F0IGxlYXN0IHRoZSB1c2VyIHdpbGwgc3RpbGwgZ2V0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgYW5kIHdpbGwKLQkJCS8vYmUgYWJsZSB0byBzZWUgb3RoZXIgdmFsaWRhdGlvbiBtZXNzYWdlcyB3aXRoIHZhbGlkIHRleHRSYW5nZXMKLQkJCUpwdEpheGJFY2xpcHNlTGlua0NvcmVQbHVnaW4ubG9nKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgdGV4dCByYW5nZSBmb3IgbWVzc2FnZSBJRDogIiArIG1lc3NhZ2VJZCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQltZXNzYWdlLnNldExpbmVObyh0ZXh0UmFuZ2UuZ2V0TGluZU51bWJlcigpKTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHRleHRSYW5nZS5nZXRPZmZzZXQoKSk7Ci0JCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0UmFuZ2UuZ2V0TGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQkKLQkKLQlwcml2YXRlIEVMSmF4YlZhbGlkYXRpb25NZXNzYWdlQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZSByZXNvdXJjZSBidW5kbGUgdXNpbmcgdGhpcyBjbGFzc0xvYWRlci4KLQkgKiBPdGhlcndpc2UgdGhlIHdzdCB2YWxpZGF0aW9uIG1lc3NhZ2UgYXR0ZW1wdHMgdG8gdXNlIHRoZSBDbGFzc0xvYWRlcgotCSAqIG9mIHRoZSBnZW5lcmljIGpheGIgdmFsaWRhdG9yIHdoaWNoIGlzIGluIHRoZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlIHBsdWdpbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBFTEpheGJWYWxpZGF0aW9uTWVzc2FnZQotCQkJZXh0ZW5kcyBNZXNzYWdlIHsKLQkJCi0JCXB1YmxpYyBFTEpheGJWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgYUJ1bmRsZU5hbWUsIGludCBhU2V2ZXJpdHksIFN0cmluZyBhbklkLCBTdHJpbmdbXSBhUGFyYW1zLCBPYmplY3QgYVRhcmdldE9iamVjdCkgewotCQkJc3VwZXIoYUJ1bmRsZU5hbWUsIGFTZXZlcml0eSwgYW5JZCwgYVBhcmFtcywgYVRhcmdldE9iamVjdCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0QnVuZGxlKExvY2FsZSBsb2NhbGUsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyKSB7Ci0JCQlSZXNvdXJjZUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlidW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoZ2V0QnVuZGxlTmFtZSgpLCBsb2NhbGUsIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQl9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBzdXBlci5nZXRCdW5kbGUobG9jYWxlLCBjbGFzc0xvYWRlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVuZGxlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWIxMTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FTEpheGJWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgRUxKYXhiVmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQkKLQkvLyBidW5kbGUgbmFtZQotCVN0cmluZyBCVU5ETEVfTkFNRSA9ICJlbF9qYXhiX3ZhbGlkYXRpb24iOwotCQotCQotCS8vIHZhbGlkYXRpb24gb24gcHJvamVjdAotCVN0cmluZyBQUk9KRUNUX01JU1NJTkdfRUNMSVBTRUxJTktfSkFYQl9DT05URVhUX0ZBQ1RPUlkgPSAiUFJPSkVDVF9NSVNTSU5HX0VDTElQU0VMSU5LX0pBWEJfQ09OVEVYVF9GQUNUT1JZIjsKLQkKLQkKLQlTdHJpbmcgWE1MX1BBVEhfX1JPT1RfTk9UX1NVUFBPUlRFRCA9ICJYTUxfUEFUSF9fUk9PVF9OT1RfU1VQUE9SVEVEIjsKLQlTdHJpbmcgWE1MX1BBVEhfX0lOVkFMSURfRk9STV9JTExFR0FMX1NFR01FTlQgPSAiWE1MX1BBVEhfX0lOVkFMSURfRk9STV9JTExFR0FMX1NFR01FTlQiOwotCVN0cmluZyBYTUxfUEFUSF9fU0VMRl9TRUdNRU5UX01VU1RfQkVfRklSU1RfU0VHTUVOVCA9ICJYTUxfUEFUSF9fU0VMRl9TRUdNRU5UX01VU1RfQkVfRklSU1RfU0VHTUVOVCI7Ci0JU3RyaW5nIFhNTF9QQVRIX19URVhUX1NFR01FTlRfTVVTVF9CRV9MQVNUX1NFR01FTlQgPSAiWE1MX1BBVEhfX1RFWFRfU0VHTUVOVF9NVVNUX0JFX0xBU1RfU0VHTUVOVCI7Ci0JU3RyaW5nIFhNTF9QQVRIX19BVFRSSUJVVEVfU0VHTUVOVF9NVVNUX0JFX0xBU1RfU0VHTUVOVCA9ICJYTUxfUEFUSF9fQVRUUklCVVRFX1NFR01FTlRfTVVTVF9CRV9MQVNUX1NFR01FTlQiOwotCQotCS8vIHVzZWQgb24gWG1sRWxlbWVudHMgbWFwcGluZwotCVN0cmluZyBYTUxfUEFUSF9fSU5TVUZGSUNJRU5UX1hNTF9QQVRIU19GT1JfWE1MX0VMRU1FTlRTID0gIlhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX1BBVEhTX0ZPUl9YTUxfRUxFTUVOVFMiOwotCVN0cmluZyBYTUxfUEFUSF9fSU5TVUZGSUNJRU5UX1hNTF9FTEVNRU5UU19GT1JfWE1MX1BBVEhTID0gIlhNTF9QQVRIX19JTlNVRkZJQ0lFTlRfWE1MX0VMRU1FTlRTX0ZPUl9YTUxfUEFUSFMiOwotCQotCVN0cmluZyBYTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfU1BFQ0lGSUVEID0gIlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZX05PVF9TUEVDSUZJRUQiOwotCVN0cmluZyBYTUxfSU5WRVJTRV9SRUZFUkVOQ0VfX01BUFBFRF9CWV9OT1RfUkVTT0xWRUQgPSAiWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQllfTk9UX1JFU09MVkVEIjsKLQlTdHJpbmcgWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQllfTk9UX1hNTF9FTEVNRU5UID0gIlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZX05PVF9YTUxfRUxFTUVOVCI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VMSmF4Yi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9FTEpheGIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyMmM2MS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL0VMSmF4Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogRWNsaXBzZUxpbmsgSkFYQiBKYXZhLXJlbGF0ZWQgc3R1ZmYgKGFubm90YXRpb25zIGV0Yy4pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIEVMSmF4YiB7Ci0JCi0JLy8gRWNsaXBzZUxpbmsgYW5ub3RhdGlvbnMgcGFja2FnZQotCQotCVN0cmluZyBQQUNLQUdFID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5hbm5vdGF0aW9ucyI7Ci0JU3RyaW5nIFBBQ0tBR0VfID0gUEFDS0FHRSArICcuJzsKLQkKLQkKLQkvLyBBbm5vdGF0aW9ucwotCQotCVN0cmluZyBYTUxfSU5WRVJTRV9SRUZFUkVOQ0UgPSBQQUNLQUdFXyArICJYbWxJbnZlcnNlUmVmZXJlbmNlIjsKLQkJU3RyaW5nIFhNTF9JTlZFUlNFX1JFRkVSRU5DRV9fTUFQUEVEX0JZID0gIm1hcHBlZEJ5IjsKLQkKLQlTdHJpbmcgWE1MX1BBVEggPSBQQUNLQUdFXyArICJYbWxQYXRoIjsKLQkJU3RyaW5nIFhNTF9QQVRIX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIFhNTF9QQVRIUyA9IFBBQ0tBR0VfICsgIlhtbFBhdGhzIjsKLQkKLQlTdHJpbmcgWE1MX1RSQU5TRk9STUFUSU9OID0gUEFDS0FHRV8gKyAiWG1sVHJhbnNmb3JtYXRpb24iOwotCQlTdHJpbmcgWE1MX1RSQU5TRk9STUFUSU9OX19PUFRJT05BTCA9ICJvcHRpb25hbCI7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjdhMDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sSW52ZXJzZVJlZmVyZW5jZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24KLQkJZXh0ZW5kcyBBbm5vdGF0aW9uIHsKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZSBldmVudHMgdG8gdGhlICdtYXBwZWRCeScgcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgTUFQUEVEX0JZX1BST1BFUlRZID0gIm1hcHBlZEJ5IjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWFwcGVkQnknIGVsZW1lbnQgb2YgdGhlIFhtbEludmVyc2VSZWZlcmVuY2UgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRNYXBwZWRCeSgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWFwcGVkQnknIGVsZW1lbnQgb2YgdGhlIFhtbEludmVyc2VSZWZlcmVuY2UgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlICdtYXBwZWRCeScgZWxlbWVudC4KLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2Ugb2YgdGhpcyBhbm5vdGF0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGFic2VudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGV4dCBwb3NpdGlvbiBpcyB3aXRoaW4gdGhlICdtYXBwZWRCeScgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbFBhdGhBbm5vdGF0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbFBhdGhBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNjkwOGEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEVjbGlwc2VMaW5rIGFubm90YXRpb24KLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5hbm5vdGF0aW9ucy5YbWxQYXRoCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQYXRoQW5ub3RhdGlvbgotCQlleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbiB7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2UgZXZlbnRzIHRvIHRoZSAndmFsdWUnIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YSAodGhlIGFubm90YXRpb24gaXMgYSBtYXJrZXIgYW5ub3RhdGlvbi4pCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQgKHRvIG1ha2UgaXQgYSBtYXJrZXIgYW5ub3RhdGlvbi4pCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBhc3NvY2lhdGVkIHdpdGggdGhlICd2YWx1ZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2Ugb2YgdGhpcyBhbm5vdGF0aW9uIGlmIHRoZSBlbGVtZW50IGlzIGFic2VudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGV4dCBwb3NpdGlvbiBpcyB3aXRoaW4gdGhlICd2YWx1ZScgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3MDcxNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS9yZXNvdXJjZS9qYXZhL1htbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBFY2xpcHNlTGluayBhbm5vdGF0aW9uCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sVHJhbnNmb3JtYXRpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbgotCQlleHRlbmRzIEFubm90YXRpb24gewotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlIGV2ZW50cyB0byB0aGUgJ29wdGlvbmFsJyBwcm9wZXJ0eQotCSAqLwotCVN0cmluZyBPUFRJT05BTF9QUk9QRVJUWSA9ICJvcHRpb25hbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBYbWxUcmFuc2Zvcm1hdGlvbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRPcHRpb25hbCgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnb3B0aW9uYWwnIGVsZW1lbnQgb2YgdGhlIFhtbFRyYW5zZm9ybWF0aW9uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ29wdGlvbmFsJyBlbGVtZW50LgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBvZiB0aGlzIGFubm90YXRpb24gaWYgdGhlIGVsZW1lbnQgaXMgYWJzZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODNlZTFlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qYXhiL3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3VpLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YTI0ZDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzhmYTkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA4OjA0IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDM1ZjMzLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLkpwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLnN3dDtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoO2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfNDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvYWJvdXQuaHRtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YmMwMzguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtaW52ZXJzZS1yZWZlcmVuY2UuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWludmVyc2UtcmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U1NWI4NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtaW52ZXJzZS1yZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLXRyYW5zZm9ybWF0aW9uLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9pY29ucy9mdWxsL29iajE2L3htbC10cmFuc2Zvcm1hdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlY2Y5ZTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLXRyYW5zZm9ybWF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyMGI3Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIE1PWHkgU3VwcG9ydCAtIFVJCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9wbHVnaW4ueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMmQ0YTQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxwbHVnaW4+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmpheGIudWkuamF4YlBsYXRmb3JtVWlzIj4KLQkJCi0JCTxqYXhiUGxhdGZvcm1VaQotCQkJaWQ9ImVjbGlwc2VsaW5rXzJfMS51aSIKLQkJCWpheGJQbGF0Zm9ybT0iZWNsaXBzZWxpbmtfMl8xIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzEuRUxKYXhiXzJfMV9QbGF0Zm9ybVVpIi8+Ci0JCQotCQk8amF4YlBsYXRmb3JtVWkKLQkJCWlkPSJlY2xpcHNlbGlua18yXzIudWkiCi0JCQlqYXhiUGxhdGZvcm09ImVjbGlwc2VsaW5rXzJfMiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8yLkVMSmF4Yl8yXzJfUGxhdGZvcm1VaSIvPgotCQkKLQkJPGpheGJQbGF0Zm9ybVVpCi0JCQlpZD0iZWNsaXBzZWxpbmtfMl8zLnVpIgotCQkJamF4YlBsYXRmb3JtPSJlY2xpcHNlbGlua18yXzMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMy5FTEpheGJfMl8zX1BsYXRmb3JtVWkiLz4KLQkJCi0JCTxqYXhiUGxhdGZvcm1VaQotCQkJaWQ9ImVjbGlwc2VsaW5rXzJfNC51aSIKLQkJCWpheGJQbGF0Zm9ybT0iZWNsaXBzZWxpbmtfMl80IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzQuRUxKYXhiXzJfNF9QbGF0Zm9ybVVpIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL0FjdGl2YXRvci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzllODE1OC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0Jc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gYnVuZGxlQ29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiNWQ3Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL0pwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi0vKioKLSAqIFRoZSBhY3RpdmF0b3IgY2xhc3MgY29udHJvbHMgdGhlIHBsdWctaW4gbGlmZSBjeWNsZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW4KLQkJZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQkKLQkvLyBUaGUgcGx1Zy1pbiBJRAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aSI7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzaW5nbGV0b24gKioqKioqKioqKgotCQotCXByaXZhdGUgc3RhdGljIEpwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luIElOU1RBTkNFOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBQbHVnaW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZXJyb3IgbG9nZ2luZyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0gICAgfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIEltYWdlIEFQSSAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhpcyBnZXRzIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKCEga2V5LnN0YXJ0c1dpdGgoImljb25zLyIpKSB7Ci0JCQlrZXkgPSAiaWNvbnMvIiArIGtleTsKLQkJfQotCQlpZiAoISBrZXkuZW5kc1dpdGgoIi5naWYiKSkgewotCQkJa2V5ID0ga2V5ICsgIi5naWYiOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwga2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgYW4gaW1hZ2UgZm9yIGEgLmdpZiBmcm9tIHRoZSBpY29ucyBmb2xkZXIKLQkgKi8KLQkvL1RPRE8gd2UgYXJlIHVzaW5nIHRoZSBJbWFnZVJlZ2lzdHJ5IGhlcmUgYW5kIHN0b3JpbmcgYWxsIG91ciBpY29ucyBmb3IgdGhlIGxpZmUgb2YgdGhlIHBsdWdpbiwgCi0JLy93aGljaCBtZWFucyB1bnRpbCB0aGUgd29ya3NwYWNlIGlzIGNsb3NlZC4gIFRoaXMgaXMgYmV0dGVyIHRoYW4gYmVmb3JlIHdoZXJlIHdlIGNvbnN0YW50bHkgCi0JLy9jcmVhdGVkIG5ldyBpbWFnZXMuIEJ1ZyAzMDY0MzcgaXMgYWJvdXQgY2xlYW5pbmcgdGhpcyB1cCBhbmQgdXNpbmcgTG9jYWwgUmVzb3VyY2UgTWFuYWdlcnMgCi0JLy9vbiBvdXIgdmlld3Mgc28gdGhhdCBjbG9zaW5nIHRoZSBKUEEgcGVyc3BlY3RpdmUgd291bGQgbWVhbiBvdXIgaWNvbnMgYXJlIGRpc3Bvc2VkLgotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBpbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoa2V5LCBnZXRJbWFnZURlc2NyaXB0b3Ioa2V5KSk7Ci0JCQlpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIEpwdEpheGJFY2xpcHNlTGlua1VpUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCUlOU1RBTkNFID0gdGhpczsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4Yk1hcHBpbmdJbWFnZUhlbHBlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FTEpheGJNYXBwaW5nSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmYTM0My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4Yk1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuRUxKYXhiTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuSnB0SmF4YkVjbGlwc2VMaW5rVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSmF4Yk1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yk1hcHBpbmdJbWFnZUhlbHBlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBJbWFnZSBpbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJU3RyaW5nIGljb25LZXkgPSBpY29uS2V5Rm9yQXR0cmlidXRlTWFwcGluZyhtYXBwaW5nS2V5KTsKLQkJcmV0dXJuIChpY29uS2V5ID09IG51bGwpID8gCi0JCQkJSmF4Yk1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcobWFwcGluZ0tleSkgCi0JCQkJOiBKcHRKYXhiRWNsaXBzZUxpbmtVaVBsdWdpbi5nZXRJbWFnZShpY29uS2V5KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgaWNvbktleUZvckF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJaWYgKEVMSmF4Yk1hcHBpbmdLZXlzLlhNTF9JTlZFUlNFX1JFRkVSRU5DRV9BVFRSSUJVVEVfTUFQUElOR19LRVkgPT0gbWFwcGluZ0tleSkgewotCQkJcmV0dXJuIEpwdEpheGJFY2xpcHNlTGlua1VpSWNvbnMuWE1MX0lOVkVSU0VfUkVGRVJFTkNFOwotCQl9Ci0JCWVsc2UgaWYgKEVMSmF4Yk1hcHBpbmdLZXlzLlhNTF9UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucy5YTUxfVFJBTlNGT1JNQVRJT047Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0VMSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdjMzkwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxLkdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotCQlleHRlbmRzIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIEVMSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBFTEpheGJOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBFTEpheGJOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sCi0JCQlEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCi0JCWlmIChpdGVtIGluc3RhbmNlb2YgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBuZXcgRUxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyKChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuYnVpbGRJdGVtTGFiZWxQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FTEpheGJOYXZpZ2F0b3JVaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FTEpheGJOYXZpZ2F0b3JVaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGExNTczLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiTmF2aWdhdG9yVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5qYXhiMjEuR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJOYXZpZ2F0b3JVaQotCQlleHRlbmRzIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgRUxKYXhiTmF2aWdhdG9yVWkgSU5TVEFOQ0UgPSBuZXcgRUxKYXhiTmF2aWdhdG9yVWkoKTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEVMSmF4Yk5hdmlnYXRvclVpIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByaXZhdGUgRUxKYXhiTmF2aWdhdG9yVWkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gRUxKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FTEpheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvRUxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOTk5MzIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC9FTEpheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMS5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyIAotCQlleHRlbmRzIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIgewotCQotCXB1YmxpYyBFTEpheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKGF0dHJpYnV0ZSwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJCi0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlLCBJbWFnZT4oCi0JCQkJbmV3IFN0cmluZ1tdIHtKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfS0VZX1BST1BFUlRZLCBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZS5NQVBQSU5HX1BST1BFUlRZfSwgCi0JCQkJZ2V0TW9kZWwoKSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gRUxKYXhiTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyh0aGlzLnN1YmplY3QuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL0pwdEpheGJFY2xpcHNlTGlua1VpSWNvbnMuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDgzMzM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgSnB0SmF4YkVjbGlwc2VMaW5rVWlJY29ucyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0lOVkVSU0VfUkVGRVJFTkNFID0gImZ1bGwvb2JqMTYveG1sLWludmVyc2UtcmVmZXJlbmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVFJBTlNGT1JNQVRJT04gPSAiZnVsbC9vYmoxNi94bWwtdHJhbnNmb3JtYXRpb24iOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL0VMSmF4Yl8yXzFfUGxhdGZvcm1VaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8xL0VMSmF4Yl8yXzFfUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGFhMzBjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMS9FTEpheGJfMl8xX1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkubmF2aWdhdG9yLkpheGJOYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiXzJfMV9QbGF0Zm9ybVVpCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtVWkgewotCQotCXB1YmxpYyBKYXhiTmF2aWdhdG9yVWkgZ2V0TmF2aWdhdG9yVWkoKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9yVWkuaW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzIvRUxKYXhiXzJfMl9QbGF0Zm9ybVVpLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzIvRUxKYXhiXzJfMl9QbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Mzc5ODIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml8yL0VMSmF4Yl8yXzJfUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC52Ml8yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwuRUxKYXhiTmF2aWdhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkubmF2aWdhdG9yLkpheGJOYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiXzJfMl9QbGF0Zm9ybVVpCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtVWkgewotCQotCXB1YmxpYyBKYXhiTmF2aWdhdG9yVWkgZ2V0TmF2aWdhdG9yVWkoKSB7Ci0JCXJldHVybiBFTEpheGJOYXZpZ2F0b3JVaS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfMy9FTEpheGJfMl8zX1BsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjOWM0Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL3VpL2ludGVybmFsL3YyXzMvRUxKYXhiXzJfM19QbGF0Zm9ybVVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLnYyXzM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS5pbnRlcm5hbC5FTEpheGJOYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5uYXZpZ2F0b3IuSmF4Yk5hdmlnYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJfMl8zX1BsYXRmb3JtVWkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1VaSB7Ci0JCi0JcHVibGljIEpheGJOYXZpZ2F0b3JVaSBnZXROYXZpZ2F0b3JVaSgpIHsKLQkJcmV0dXJuIEVMSmF4Yk5hdmlnYXRvclVpLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml80L0VMSmF4Yl8yXzRfUGxhdGZvcm1VaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay91aS9pbnRlcm5hbC92Ml80L0VMSmF4Yl8yXzRfUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmNiN2ZmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvdWkvaW50ZXJuYWwvdjJfNC9FTEpheGJfMl80X1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsudWkuaW50ZXJuYWwudjJfNDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLnVpLmludGVybmFsLkVMSmF4Yk5hdmlnYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLm5hdmlnYXRvci5KYXhiTmF2aWdhdG9yVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkucGxhdGZvcm0uSmF4YlBsYXRmb3JtVWk7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4Yl8yXzRfUGxhdGZvcm1VaQotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybVVpIHsKLQkKLQlwdWJsaWMgSmF4Yk5hdmlnYXRvclVpIGdldE5hdmlnYXRvclVpKCkgewotCQlyZXR1cm4gRUxKYXhiTmF2aWdhdG9yVWkuaW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLmNsYXNzcGF0aCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRmYjM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLmN2c2lnbm9yZSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnByb2plY3QgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MzcxMjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4Y2Y1N2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA4OjEwIEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdmZWVjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmc7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC51aTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aTtidW5kbGUtdmVyc2lvbj0iWzEuNC4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuNS4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS40LjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuNTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS40MDEsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Qud2ViLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjQwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS41MDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuNjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi42LjAsMy4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmZpbHRlcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5qYXhiMjE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5qYXhiMjI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5wbGF0Zm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLnByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5mYWNldDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMucHJvajt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMucHJvai5tb2RlbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuc2NoZW1hZ2VuO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIudWkubmF2aWdhdG9yLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9hYm91dC5odG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5NWVjYS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBzY2hlbWEvCi0gICAgICAgICAgICAgICAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvY29tcG9uZW50LnhtbCBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDk1N2ZlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi51aSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpheGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvTmV3WFNELmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvTmV3WFNELmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZmRkMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L05ld1hTRC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pheGJfZmFjZXQuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9qYXhiX2ZhY2V0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1YTE3Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pheGJfZmFjZXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfamF4Yl9wcm9qZWN0X3dpei5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qYXhiX3Byb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0NzcxNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qYXhiX3Byb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y2xhc3Nfd2l6LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y2xhc3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFjNjU0NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2NsYXNzX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBlZWI3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MwYWNhZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2VudW1fY29uc3RhbnQuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW51bV9jb25zdGFudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0Y2I0MjUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW51bV9jb25zdGFudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9qYXhiX2NsYXNzLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfY2xhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFjMjM2Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfY2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvamF4Yl9jb250ZW50LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NWExN2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvamF4Yl9jb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfZW51bS5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9qYXhiX2VudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzNlZDI4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfZW51bS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9qYXhiX3JlZ2lzdHJ5LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfcmVnaXN0cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTllNjA1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfcmVnaXN0cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvamF4Yl90cmFuc2llbnRfY2xhc3MuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvamF4Yl90cmFuc2llbnRfY2xhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjY0NjFiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfdHJhbnNpZW50X2NsYXNzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfdHJhbnNpZW50X2NsYXNzLmljbyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfdHJhbnNpZW50X2NsYXNzLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2ZjNlNS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9qYXhiX3RyYW5zaWVudF9jbGFzcy5pY28KKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9qYXhiX3RyYW5zaWVudF9lbnVtLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfdHJhbnNpZW50X2VudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjM0ZmI1Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L2pheGJfdHJhbnNpZW50X2VudW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvamF4Yl90cmFuc2llbnRfZW51bS5pY28gYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9qYXhiX3RyYW5zaWVudF9lbnVtLmljbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMzY2NlYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9qYXhiX3RyYW5zaWVudF9lbnVtLmljbworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTljMjMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3BhY2thZ2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg5YjhkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3BhY2thZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVudF9maWVsZC5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW50X2ZpZWxkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjYjQyNS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW50X2ZpZWxkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbnRfcHJvcGVydHkuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVudF9wcm9wZXJ0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMjQ3MDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVudF9wcm9wZXJ0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE3YTM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3RleHQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWFueS1hdHRyaWJ1dGUuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWFueS1hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQ5ZmIwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1hbnktYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1hbnktZWxlbWVudC5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtYW55LWVsZW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzNkMDJiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1hbnktZWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtYXR0cmlidXRlLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTFlZTcyLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWVsZW1lbnQtcmVmLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1lbGVtZW50LXJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMjAwNTIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWVsZW1lbnQtcmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1lbGVtZW50LXJlZnMuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWVsZW1lbnQtcmVmcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZTRkNmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWVsZW1lbnQtcmVmcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtZWxlbWVudC5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjOTUzZGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWVsZW1lbnRzLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC1lbGVtZW50cy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNmFhZDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLWVsZW1lbnRzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL29iajE2L3htbC10cmFuc2llbnQuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLXRyYW5zaWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZDkwY2YuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLXRyYW5zaWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtdmFsdWUuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb2JqMTYveG1sLXZhbHVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE0NWQ2ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC9vYmoxNi94bWwtdmFsdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9pY29ucy9mdWxsL3dpemJhbi9OZXdYU0QuZ2lmIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld1hTRC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MGY0ODIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL05ld1hTRC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pheGJfcHJqX3dpei5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pheGJfcHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxODczYTEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19qYXhiX3Byal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2NsYXNzX3dpei5naWYgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3Y2xhc3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjMGVlOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3Y2xhc3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9wbHVnaW4ucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0YjQ4NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpBWEIgVUkKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi1qYXhiUGxhdGZvcm1VaSA9IEpBWEIgUGxhdGZvcm0gVUkKLQotamF4YldpemFyZENhdGVnb3J5TmFtZSA9IEpBWEIKLQotZ2VuZXJhdGVTY2hlbWFGcm9tQ2xhc3Nlc05hbWUgPSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMKLWdlbmVyYXRlU2NoZW1hRnJvbUNsYXNzZXNEZXNjID0gR2VuZXJhdGUgYSBTY2hlbWEgZnJvbSBKQVhCIGNsYXNzZXMKLQotZ2VuZXJhdGVDbGFzc2VzRnJvbVNjaGVtYU5hbWUgPSBKQVhCIENsYXNzZXMgZnJvbSBTY2hlbWEKLWdlbmVyYXRlQ2xhc3Nlc0Zyb21TY2hlbWFEZXNjID0gR2VuZXJhdGUgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEKLQotbmV3SmF4YlByb2plY3RXaXphcmROYW1lID0gSkFYQiBQcm9qZWN0Ci1uZXdKYXhiUHJvamVjdFdpemFyZERlc2MgPSBDcmVhdGUgYSBKQVhCIHByb2plY3QKLQotamF4YkNvbXBsZXRpb25Qcm9wb3NhbHMgPSBKQVhCIFByb3Bvc2FscwotamF4YkNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyID0gSkFYQiBQcm9wb3NhbCBDb21wdXRlcgotCi1qYXhiTmF2aWdhdG9yQ29udGVudD1KQVhCIENvbnRlbnQKLWdlbmVyYXRlSmF4YkNsYXNzZXMgPSBKQVhCIENsYXNzZXMuLi4KLQotamF4Yk5vZGUgPSBKQVhCCi1qYXhiU2NoZW1hcyA9IFNjaGVtYXMKZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9wbHVnaW4ueG1sIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTcwODQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvcHJvcGVydHlfZmlsZXMvanB0X2pheGJfdWkucHJvcGVydGllcyBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9wcm9wZXJ0eV9maWxlcy9qcHRfamF4Yl91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Zjk5NjNkLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9wcm9wZXJ0eV9maWxlcy9qcHRfamF4Yl91aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1KYXZhUHJvamVjdFdpemFyZFBhZ2VfcHJvamVjdCA9IFByb2plY3Q6Ci1KYXZhUHJvamVjdFdpemFyZFBhZ2VfZGVzdGluYXRpb25Qcm9qZWN0ID0gU2VsZWN0IGRlc3RpbmF0aW9uIHByb2plY3Q6Ci0KLSMgQ2xhc3Nlc0dlbmVyYXRvcgotQ2xhc3Nlc0dlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX3RpdGxlID0gSmF2YSBQcm9qZWN0Ci1DbGFzc2VzR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfZGVzYyA9IFNwZWNpZnkgcHJvamVjdCBmb3IgdGhlIG5ldyBjbGFzc2VzLgotCi1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkX3RpdGxlID0gTmV3IEpBWEIgQ2xhc3NlcyBmcm9tIHNjaGVtYQotCi1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkX2Vycm9yRGlhbG9nVGl0bGUgPSBHZW5lcmF0ZSBDbGFzc2VzIEZhaWxlZAotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF9jb3VsZE5vdENyZWF0ZSA9IENvdWxkIG5vdCBjcmVhdGUgezB9Ci0KLUVycm9yX29wZW5pbmdFZGl0b3I9RXJyb3IgT3BlbmluZyBFZGl0b3IKLQotSmF4YkNvbnRlbnRfbGFiZWw9SkFYQiBDb250ZW50Ci0KLVNjaGVtYXNQYWdlX2Rlc2NyaXB0aW9uID0gQ29uZmlndXJlIEpBWEIgc2NoZW1hcyB1c2VkIGZvciB2YWxpZGF0aW9uIGFuZCBjb250ZW50IGFzc2lzdAotU2NoZW1hc1BhZ2VfcmV2ZXJ0ID0gJlJldmVydAotU2NoZW1hc1BhZ2Vfc2NoZW1hcyA9ICZTY2hlbWEgbmFtZXNwYWNlcyBhbmQgbG9jYXRpb25zOgotU2NoZW1hc1BhZ2VfbmFtZXNwYWNlQ29sdW1uTGFiZWwgPSBOYW1lc3BhY2UKLVNjaGVtYXNQYWdlX2xvY2F0aW9uQ29sdW1uTGFiZWwgPSBMb2NhdGlvbgotU2NoZW1hc1BhZ2VfYWRkQnV0dG9uTGFiZWwgPSAmQWRkIC4uLgotU2NoZW1hc1BhZ2VfZWRpdEJ1dHRvbkxhYmVsID0gJkVkaXQgLi4uCi1TY2hlbWFzUGFnZV9yZW1vdmVCdXR0b25MYWJlbCA9IFJlJm1vdmUKLVNjaGVtYXNQYWdlX2FkZFNjaGVtYU1lc3NhZ2UgPSBFbnRlciBhIG5ldyBzY2hlbWEgbmFtZXNwYWNlIGFuZCB0aGUgbG9jYXRpb24gd2hlcmUgaXQgY2FuIGJlIGZvdW5kLgotU2NoZW1hc1BhZ2VfZWRpdFNjaGVtYU1lc3NhZ2UgPSBFZGl0IGFuIGV4aXN0aW5nIHNjaGVtYSBuYW1lc3BhY2UgYW5kIHRoZSBsb2NhdGlvbiB3aGVyZSBpdCBjYW4gYmUgZm91bmQuCi1TY2hlbWFzUGFnZV9hZGRTY2hlbWFEaWFsb2dUaXRsZSA9IEFkZCBTY2hlbWEgTG9jYXRpb24KLVNjaGVtYXNQYWdlX2VkaXRTY2hlbWFEaWFsb2dUaXRsZSA9IEVkaXQgU2NoZW1hIExvY2F0aW9uCi1TY2hlbWFzUGFnZV9hZGRTY2hlbWFUaXRsZSA9IEFkZCBhIG5ldyBzY2hlbWEgbG9jYXRpb24KLVNjaGVtYXNQYWdlX2VkaXRTY2hlbWFUaXRsZSA9IEVkaXQgYW4gZXhpc3Rpbmcgc2NoZW1hIGxvY2F0aW9uCi1TY2hlbWFzUGFnZV9sb2NhdGlvbkxhYmVsID0gJkxvY2F0aW9uOgotU2NoZW1hc1BhZ2VfYnJvd3NlQnV0dG9uTGFiZWwgPSAmQnJvd3NlIC4uLgotU2NoZW1hc1BhZ2VfbmFtZXNwYWNlTGFiZWwgPSAmTmFtZXNwYWNlOgotU2NoZW1hc1BhZ2Vfbm9OYW1lc3BhY2VUZXh0ID0gPG5vIG5hbWVzcGFjZT4KLVNjaGVtYXNQYWdlX3NjaGVtYVVucmVzb2x2ZWRNZXNzYWdlID0gQ291bGQgbm90IHJlc29sdmUgY2hvc2VuIHNjaGVtYSBsb2NhdGlvbi4KLVNjaGVtYXNQYWdlX2R1cGxpY2F0ZU5hbWVzcGFjZU1lc3NhZ2UgPSBUaGF0IG5hbWVzcGFjZSBpcyBhbHJlYWR5IGluIHVzZS4KLVNjaGVtYXNQYWdlX25vTG9jYXRpb25NZXNzYWdlID0gWW91IG11c3Qgc3BlY2lmeSBhIGxvY2F0aW9uLgotU2NoZW1hc1BhZ2VfY2hvb3NlTG9jYXRpb25UaXRsZSA9IFNlbGVjdCBTY2hlbWEgTG9jYXRpb24KLQotU2NoZW1hV2l6YXJkUGFnZV90aXRsZSA9IFNlbGVjdCBTY2hlbWEKLVNjaGVtYVdpemFyZFBhZ2VfZGVzYyA9IFNwZWNpZnkgc2NoZW1hIHRvIGdlbmVyYXRlIHRoZSBjbGFzc2VzIGZyb20KLQotU2NoZW1hV2l6YXJkUGFnZV94bWxDYXRhbG9nVGFibGVUaXRsZSA9IFhNTCBDYXRhbG9nCi1TY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW4gPSBLZXkKLVNjaGVtYVdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbiA9IFVSSQotCi1TY2hlbWFXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkID0gVGhlIHNlbGVjdGVkIGNhdGFsb2cgZW50cnkgc3BlY2lmaWVzIGEgVVJJIHRoYXQgY2FuIG5vdCBiZSBsb2NhdGVkLgotCi1TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbF9maWxlRnJvbVdvcmtzcGFjZSA9IFNlbGVjdCBmaWxlIGZyb20gV29yayZzcGFjZQotU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWxfeG1sQ2F0YWxvZ0VudHJ5ID0gU2VsZWN0IFhNTCBDYXRhbG8mZyBlbnRyeQotU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWxfaW1wb3J0QnV0dG9uID0gJkltcG9ydCBGaWxlcy4uLgotCi1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV90aXRsZSA9IEdlbmVyYXRlIENsYXNzZXMgZnJvbSBTY2hlbWE6IHswfQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfZGVzYyA9IENvbmZpZ3VyZSBKQVhCIGNsYXNzIGdlbmVyYXRpb24uCi0KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3VzZXNNb3h5SW1wbGVtZW50YXRpb24gPSBVc2UgRWNsaXBzZUxpbmsgTU8mWHkgYXMgdGhlIEpBWEIgaW1wbGVtZW50YXRpb24KLQotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2F0YWxvZyA9IENhdGFsbyZnOgotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYmluZGluZ3NGaWxlcyA9IEImaW5kaW5ncyBmaWxlczoKLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2Jyb3dzZUJ1dHRvbiA9IEJyb3cmc2UuLi4KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2FkZEJ1dHRvbiA9ICZBZGQuLi4KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3JlbW92ZUJ1dHRvbiA9IFJlJm1vdmUKLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2Nob29zZUFCaW5kaW5nc0ZpbGUgPSBFeHRlcm5hbCBCaW5kaW5ncyBGaWxlIFNlbGVjdGlvbgotQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2hvb3NlQUNhdGFsb2cgPSBDYXRhbG9nIEZpbGUgU2VsZWN0aW9uCi0KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3NvdXJjZUZvbGRlclNlbGVjdGlvbkRpYWxvZ190aXRsZSA9IFNvdXJjZSBGb2xkZXIgU2VsZWN0aW9uCi1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VTb3VyY2VGb2xkZXJEaWFsb2dfZGVzYyA9ICZDaG9vc2UgYSBzb3VyY2UgZm9sZGVyOgotCi1DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9qYXhiTGlicmFyaWVzTm90QXZhaWxhYmxlID0gXAotCQlUaGUgY2xhc3NwYXRoIGZvciB0aGlzIHByb2plY3QgZG9lcyBub3QgYXBwZWFyIHRvIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMgdG8gcHJvY2VlZCB3aXRoIGNsYXNzIGdlbmVyYXRpb24uXAotCQlcblBsZWFzZSBpbnN1cmUgdGhhdCBhIEpBWEIgaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIG9uIHRoZSBjbGFzc3BhdGguCi0KLUNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX21veHlMaWJyYXJpZXNOb3RBdmFpbGFibGUgPSBcCi0JCVRoZSBjbGFzc3BhdGggZm9yIHRoaXMgcHJvamVjdCBkb2VzIG5vdCBhcHBlYXIgdG8gY29udGFpbiB0aGUgbmVjZXNzYXJ5IGxpYnJhcmllcyB0byBwcm9jZWVkIHdpdGggY2xhc3MgZ2VuZXJhdGlvbi5cCi0JCVxuUGxlYXNlIGluc3VyZSB0aGF0IEVjbGlwc2VMaW5rIE1PWHkgaXMgYXZhaWxhYmxlIG9uIHRoZSBjbGFzc3BhdGguCi0KLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90aXRsZSA9IENsYXNzZXMgR2VuZXJhdG9yIE9wdGlvbnMKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9kZXNjID0gQ29uZmlndXJlIEpBWEIgY29tcGlsZXIgb3B0aW9ucy4KLQotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3Byb3h5R3JvdXAgPSBQcm94eQotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX25vUHJveHkgPSBOJm8gcHJveHkKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eSA9ICZQcm94eToKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUZpbGUgPSBQcm94JnkgZmlsZToKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9jaG9vc2VBUHJveHlGaWxlID0gUHJveHkgRmlsZSBTZWxlY3Rpb24KLQotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3VzZVN0cmljdFZhbGlkYXRpb24gPSBVc2Ugc3RyaWN0IHYmYWxpZGF0aW9uCi1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfbWFrZVJlYWRPbmx5ID0gR2VuZXJhdGUgJnJlYWQtb25seSBmaWxlcwotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzUGFja2FnZUluZm9HZW4gPSBTdXBwcmVzcyBwYWMma2FnZS1pbmZvIGdlbmVyYXRpb24KLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zdXBwcmVzc2VzSGVhZGVyR2VuID0gU3VwcHJlc3MgZ2VuZXJhdGlvbiBvZiBmaWxlICZoZWFkZXIKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90YXJnZXQgPSBUYXJnZXQgWCZKQyAyLjAKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV92ZXJib3NlID0gJlZlcmJvc2UKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9xdWlldCA9IFN1cHByZXNzIGNvbXBpbGVyIG91dHAmdXQKLQotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzWG1sU2NoZW1hID0gVHJlYXQgaW5wdXQgYXMgJlhNTCBzY2hlbWEKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1JlbGF4TmcgPSBUcmVhdCBpbnB1dCBhcyBSRUxBWCBOJkcKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1JlbGF4TmdDb21wYWN0ID0gVHJlYXQgaW5wdXQgYXMgUkVMQVggTkcgJmNvbXBhY3Qgc3ludGF4Ci1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNEdGQgPSBUcmVhdCBpbnB1dCBhcyBYTUwgRCZURAotQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzV3NkbCA9IFRyZWF0IGlucHV0IGFzIFdTJkRMIGFuZCBjb21waWxlIHNjaGVtYSBpbnNpZGUgaXQKLUNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zaG93c1ZlcnNpb24gPSBTaG93IHZlcnMmaW9uCi1DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Vfc2hvd3NIZWxwID0gU2hvdyBoJmVscAotCi1DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGUgPSBDbGFzc2VzIEdlbmVyYXRvciBFeHRlbnNpb24gQ29uZmlndXJhdGlvbgotQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2Rlc2MgPSBDb25maWd1cmUgSkFYQiBjb21waWxlciB2ZW5kb3IgZXh0ZW5zaW9ucy4KLQotQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2FsbG93RXh0ZW5zaW9ucyA9IEFsbG93IHZlbmRvciAmZXh0ZW5zaW9ucwotQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2NsYXNzcGF0aCA9IENsYXNzJnBhdGg6Ci1DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2VfYWRkaXRpb25hbEFyZ3VtZW50cyA9IEFkZGl0aW9uYWwgYXImZ3VtZW50czoKLQotQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdFbnRpdGllcyA9IEdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gU2NoZW1hCi1DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0VudGl0aWVzVGFzayA9IEdlbmVyYXRpbmcgY2xhc3NlcwotCi1DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nVGl0bGUgPSBHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcwotQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdDbGFzc2VzV2FybmluZ01lc3NhZ2UgPSBcCi0JCVdhcm5pbmc6IEdlbmVyYXRpbmcgY2xhc3NlcyB3aWxsIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcyBpbiB5b3VyIHByb2plY3QuXAotCQlcbkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIyBTY2hlbWFHZW5lcmF0b3IKLVNjaGVtYUdlbmVyYXRvcldpemFyZF90aXRsZSA9IE5ldyBKQVhCIFNjaGVtYSBGaWxlCi0KLVNjaGVtYUdlbmVyYXRvcldpemFyZF9nZW5lcmF0aW5nU2NoZW1hID0gR2VuZXJhdGluZyBKQVhCIFNjaGVtYQotCi1TY2hlbWFHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV90aXRsZSA9IEpBWEIgc2NoZW1hIGZpbGUKLVNjaGVtYUdlbmVyYXRvclByb2plY3RXaXphcmRQYWdlX2Rlc2MgPSBTcGVjaWZ5IGRlZmF1bHQgZmlsZSBuYW1lIGFuZCBsb2NhdGlvbgotCi1TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX3RpdGxlID0gR2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlcwotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9kZXNjID0gU2VsZWN0IGNsYXNzZXMgdG8gaW5jbHVkZS4KLQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9zaGVtYUxvY2F0aW9uID0gU2NoZW1hIGZpbGU6Ci1TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX3NoZW1hID0gU2NoZW1hIG5hbWU6Ci1TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX3BhY2thZ2VzID0gU2VsZWN0IGNsYXNzZXMgdG8gaW5jbHVkZSBpbiBzY2hlbWE6Ci1TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2Jyb3dzZSA9IEJyb3dzZS4uLgotCi1TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2Nob29zZVNjaGVtYURpYWxvZ1RpdGxlID0gU2VsZWN0IFNjaGVtYSBGaWxlCi0KLVNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfZXJyb3JOb1NjaGVtYSA9IFNjaGVtYSBuYW1lIGNhbm5vdCBiZSBlbXB0eQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9lcnJvck5vUGFja2FnZSA9IE5vIGNsYXNzZXMgaW5jbHVkZWQKLQotU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9qYXhiTGlicmFyaWVzTm90QXZhaWxhYmxlID0gXAotCQlUaGUgY2xhc3NwYXRoIGZvciB0aGlzIHByb2plY3QgZG9lcyBub3QgYXBwZWFyIHRvIGNvbnRhaW4gdGhlIG5lY2Vzc2FyeSBsaWJyYXJpZXMgdG8gcHJvY2VlZCB3aXRoIHNjaGVtYSBnZW5lcmF0aW9uLlwKLQkJXG5QbGVhc2UgaW5zdXJlIHRoYXQgYSBKQVhCIGltcGxlbWVudGF0aW9uIGlzIGF2YWlsYWJsZSBvbiB0aGUgY2xhc3NwYXRoLgotCi1TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX21veHlMaWJyYXJpZXNOb3RBdmFpbGFibGUgPSBcCi0JCVRoZSBjbGFzc3BhdGggZm9yIHRoaXMgcHJvamVjdCBkb2VzIG5vdCBhcHBlYXIgdG8gY29udGFpbiB0aGUgbmVjZXNzYXJ5IGxpYnJhcmllcyB0byBwcm9jZWVkIHdpdGggc2NoZW1hIGdlbmVyYXRpb24uXAotCQlcblBsZWFzZSBpbnN1cmUgdGhhdCBFY2xpcHNlTGluayBNT1h5IGlzIGF2YWlsYWJsZSBvbiB0aGUgY2xhc3NwYXRoLgotCi1TY2hlbWFHZW5lcmF0b3JXaXphcmRfZ2VuZXJhdGVTY2hlbWFUYXNrID0gR2VuZXJhdGluZyBzY2hlbWEgezB9Ci0KLSNOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZQotCi1OZXdTY2hlbWFGaWxlV2l6YXJkUGFnZV9lcnJvck5vdEphdmFQcm9qZWN0ID0gTm90IGEgSmF2YSBwcm9qZWN0Ci1OZXdTY2hlbWFGaWxlV2l6YXJkUGFnZV9vdmVyd3JpdGVFeGlzdGluZ1NjaGVtYXMgPSBTY2hlbWEgZ2VuZXJhdGlvbiBtYXkgb3ZlcndyaXRlIGV4aXN0aW5nIHNjaGVtYXMgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuCi0KLQotSmF4YlByb2plY3RXaXphcmRfdGl0bGUgPSBOZXcgSkFYQiBQcm9qZWN0Ci0KLUpheGJQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZSA9IEpBWEIgUHJvamVjdAotSmF4YlByb2plY3RXaXphcmRfZmlyc3RQYWdlX2Rlc2MgPSBDb25maWd1cmUgSkFYQiBwcm9qZWN0IHNldHRpbmdzLgotCi1KYXhiRmFjZXRXaXphcmRQYWdlX3RpdGxlID0gSkFYQiBGYWNldAotSmF4YkZhY2V0V2l6YXJkUGFnZV9kZXNjID0gQ29uZmlndXJlIEpBWEIgc2V0dGluZ3MuCi1KYXhiRmFjZXRXaXphcmRQYWdlX3BsYXRmb3JtTGFiZWwgPSAmUGxhdGZvcm0KLUpheGJGYWNldFdpemFyZFBhZ2VfZmFjZXRzUGFnZUxpbmsgPSA8YT5DaGFuZ2UgSkFYQiB2ZXJzaW9uIC4uLjwvYT4KLUpheGJGYWNldFdpemFyZFBhZ2VfamF4YkltcGxlbWVudGF0aW9uTGFiZWwgPSBKQVhCIGltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc2NoZW1hL2pheGJQbGF0Zm9ybVVpcy5leHNkIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NjaGVtYS9qYXhiUGxhdGZvcm1VaXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMxNTJiYy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc2NoZW1hL2pheGJQbGF0Zm9ybVVpcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpIiBpZD0ianBhUGxhdGZvcm1zIiBuYW1lPSJKQVhCIFBsYXRmb3JtIFVJcyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZGVzY3JpcHRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iamF4YlBsYXRmb3JtVWkiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iamF4YlBsYXRmb3JtVWkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEV4dGVuZGVycyBvZiB0aGUgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5qYXhiUGxhdGZvcm1zIGV4dGVuc2lvbiBwb2ludCBtYXkgYWxzbyB1c2UgdGhpcyBwb2ludCB0byBpbnNlcnQgVUkgaW50byB0aGUgd29ya2JlbmNoIGZvciB0aGF0IHBsYXRmb3JtLiAgVGhlIGpheGJQbGF0Zm9ybSBtdXN0IG1hdGNoIHRoZSBpZCBvZiBhIGpheGJQbGF0Zm9ybSBleHRlbnNpb24uCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImpheGJQbGF0Zm9ybSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgamF4YlBsYXRmb3JtIG11c3QgbWF0Y2ggYSBjb3JyZXNwb25kaW5nIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuamF4YlBsYXRmb3JtIGV4dGVuc2lvbiBpZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgaW5zdGFudGlhYmxlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LmpheGIudWkucGxhdGZvcm0uSmF4YlBsYXRmb3JtVWkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwaW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMy4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpaW5mbyIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLXBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLXdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi1UaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLXRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi1hbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIAotQ29udHJpYnV0b3JzOgotT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9KcHRKYXhiVWlQbHVnaW4uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvSnB0SmF4YlVpUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNGE0ZDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9KcHRKYXhiVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkucGxhdGZvcm0uSmF4YlBsYXRmb3JtVWlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0SmF4YlVpUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfID0gUExVR0lOX0lEICsgJy4nOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9DQVRBTE9HX0lEID0gWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQ7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBVEFMT0dfSUQgPSBYTUxDb3JlUGx1Z2luLkRFRkFVTFRfQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9DQVRBTE9HX0lEID0gWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRDsgLy8kTk9OLU5MUy0xJAotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQlwcml2YXRlIHN0YXRpYyBKcHRKYXhiVWlQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gUGx1Z2luCi0JICovCi0JcHVibGljIHN0YXRpYyBKcHRKYXhiVWlQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotICAgIH0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSkpOwotCX0KLQotCS8vICoqKioqKioqKiogSW1hZ2UgQVBJICoqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGdldHMgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlpZiAoISBrZXkuc3RhcnRzV2l0aCgiaWNvbnMvIikpIHsKLQkJCWtleSA9ICJpY29ucy8iICsga2V5OwotCQl9Ci0JCWlmICghIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgcmV0dXJucyBhbiBpbWFnZSBmb3IgYSAuZ2lmIGZyb20gdGhlIGljb25zIGZvbGRlcgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLCAKLQkvL3doaWNoIG1lYW5zIHVudGlsIHRoZSB3b3Jrc3BhY2UgaXMgY2xvc2VkLiAgVGhpcyBpcyBiZXR0ZXIgdGhhbiBiZWZvcmUgd2hlcmUgd2UgY29uc3RhbnRseSAKLQkvL2NyZWF0ZWQgbmV3IGltYWdlcy4gQnVnIDMwNjQzNyBpcyBhYm91dCBjbGVhbmluZyB0aGlzIHVwIGFuZCB1c2luZyBMb2NhbCBSZXNvdXJjZSBNYW5hZ2VycyAKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JCi0JcHVibGljIHN0YXRpYyBKYXhiUGxhdGZvcm1VaU1hbmFnZXIgZ2V0SmF4YlBsYXRmb3JtVWlNYW5hZ2VyKCkgewotCQlyZXR1cm4gSmF4YlBsYXRmb3JtVWlNYW5hZ2VySW1wbC5pbnN0YW5jZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIFhNTENvcmVQbHVnaW4gQVBJICoqKioqKioqKioKLQkKLQlwdWJsaWMgSUNhdGFsb2cgZ2V0RGVmYXVsdFhNTENhdGFsb2coKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEpwdEpheGJVaVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKElOU1RBTkNFICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJfQotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9DbGFzc2VzR2VuZXJhdG9yVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvQ2xhc3Nlc0dlbmVyYXRvclVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2N2QxMTMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9DbGFzc2VzR2VuZXJhdG9yVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLlNjaGVtYUxpYnJhcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5nZW4uQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5nZW4uQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5nZW4uR2VuZXJhdGVKYXhiQ2xhc3Nlc0pvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnhzZC5Yc2RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW4uQ2xhc3Nlc0dlbmVyYXRvcldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5YU0RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci0KLS8qKgotICogIENsYXNzZXNHZW5lcmF0b3JVaQotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvclVpIHsKLQkKLQlwcml2YXRlIGZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIElGaWxlIHhzZEZpbGU7Ci0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKElGaWxlIHhzZEZpbGUpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHhzZEZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQluZXcgQ2xhc3Nlc0dlbmVyYXRvclVpKGphdmFQcm9qZWN0LCB4c2RGaWxlKS5nZW5lcmF0ZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwcml2YXRlIENsYXNzZXNHZW5lcmF0b3JVaShJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElGaWxlIHhzZEZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQkJdGhpcy54c2RGaWxlID0geHNkRmlsZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRlICoqKioqKioqKioKLQkvKioKLQkgKiBwcm9tcHQgdGhlIHVzZXIgd2l0aCBhIHdpemFyZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewotCQlDbGFzc2VzR2VuZXJhdG9yV2l6YXJkIHdpemFyZCA9IG5ldyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkKHRoaXMuamF2YVByb2plY3QsIHRoaXMueHNkRmlsZSk7Ci0JCXdpemFyZC5zZXRXaW5kb3dUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkX3RpdGxlKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2codGhpcy5nZXRDdXJyZW50U2hlbGwoKSwgd2l6YXJkKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlpbnQgcmV0dXJuQ29kZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCWlmIChyZXR1cm5Db2RlICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZih0aGlzLmRpc3BsYXlPdmVyd3JpdGluZ0NsYXNzZXNXYXJuaW5nKHdpemFyZC5nZXRHZW5lcmF0b3JPcHRpb25zKCkpKSB7Ci0JCQl0aGlzLmdlbmVyYXRlSmF4YkNsYXNzZXMoCi0JCQkJCXdpemFyZC5nZXRMb2NhbFNjaGVtYVVyaSgpLCAKLQkJCQkJd2l6YXJkLmdldERlc3RpbmF0aW9uRm9sZGVyKCksIAotCQkJCQl3aXphcmQuZ2V0VGFyZ2V0UGFja2FnZSgpLCAKLQkJCQkJd2l6YXJkLmdldENhdGFsb2coKSwgCi0JCQkJCXdpemFyZC51c2VzTW94eSgpLCAKLQkJCQkJd2l6YXJkLmdldEJpbmRpbmdzRmlsZU5hbWVzKCksCi0JCQkJCXdpemFyZC5nZXRHZW5lcmF0b3JPcHRpb25zKCksCi0JCQkJCXdpemFyZC5nZXRHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCkpOwotCQkJYWRkU2NoZW1hVG9MaWJyYXJ5KHdpemFyZC5nZXRTY2hlbWFMb2NhdGlvbigpKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVKYXhiQ2xhc3NlcygKLQkJCVVSSSBzY2hlbWFVcmksCi0JCQlTdHJpbmcgb3V0cHV0RGlyLAotCQkJU3RyaW5nIHRhcmdldFBhY2thZ2UsIAotCQkJU3RyaW5nIGNhdGFsb2csIAotCQkJYm9vbGVhbiB1c2VzTW94eUdlbmVyYXRvciwKLQkJCVN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzLAotCQkJQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9ucywKLQkJCUNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zIGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMpIHsKLQkJCi0JCXRyeSB7Ci0JCQlXb3Jrc3BhY2VKb2Igam9iID0gbmV3IEdlbmVyYXRlSmF4YkNsYXNzZXNKb2IoCi0JCQkJCXRoaXMuamF2YVByb2plY3QsIAotCQkJCQlzY2hlbWFVcmkudG9TdHJpbmcoKSwKLQkJCQkJb3V0cHV0RGlyLCAKLQkJCQkJdGFyZ2V0UGFja2FnZSwgCi0JCQkJCWNhdGFsb2csIAotCQkJCQl1c2VzTW94eUdlbmVyYXRvciwKLQkJCQkJYmluZGluZ3NGaWxlTmFtZXMsCi0JCQkJCWdlbmVyYXRvck9wdGlvbnMsCi0JCQkJCWdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMpOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJSnB0SmF4YlVpUGx1Z2luLmxvZyhyZSk7Ci0KLQkJCVN0cmluZyBtc2cgPSByZS5nZXRNZXNzYWdlKCk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IChtc2cgPT0gbnVsbCkgPyByZS50b1N0cmluZygpIDogbXNnOwotCQkJdGhpcy5sb2dFcnJvcihtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU2NoZW1hVG9MaWJyYXJ5KFN0cmluZyBzY2hlbWFMb2NhdGlvbikgewotCQlKYXhiUHJvamVjdCBqYXhiUHJvamVjdCA9IGdldEpheGJQcm9qZWN0KCk7Ci0JCQotCQlpZiAoamF4YlByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgcmVzb2x2ZWRVcmkgPSBYc2RVdGlsLmdldFJlc29sdmVkVXJpKHNjaGVtYUxvY2F0aW9uKTsKLQkJWFNEU2NoZW1hIHNjaGVtYSA9IFhTREltcGwuYnVpbGRYU0RNb2RlbChyZXNvbHZlZFVyaSk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJU2NoZW1hTGlicmFyeSBzY2hlbWFMaWIgPSBqYXhiUHJvamVjdC5nZXRTY2hlbWFMaWJyYXJ5KCk7Ci0JCQlMaXN0PFN0cmluZz4gc2NoZW1hcyA9IG5ldyBWZWN0b3I8U3RyaW5nPihzY2hlbWFMaWIuZ2V0U2NoZW1hTG9jYXRpb25zKCkpOwotCQkJaWYgKCEgc2NoZW1hcy5jb250YWlucyhzY2hlbWFMb2NhdGlvbikpIHsKLQkJCQlzY2hlbWFzLmFkZChzY2hlbWFMb2NhdGlvbik7Ci0JCQkJc2NoZW1hTGliLnNldFNjaGVtYUxvY2F0aW9ucyhzY2hlbWFzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgbG9nRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcy5kaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcigKLQkJCQl0aGlzLmdldFNoZWxsKCksCi0JCQkJSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF9lcnJvckRpYWxvZ1RpdGxlLAotCQkJCW1lc3NhZ2UKLQkJCSk7Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IERpc3BsYXkuZ2V0Q3VycmVudCgpOwotCQlTaGVsbCBzaGVsbCA9IChkaXNwbGF5ID09IG51bGwpID8gbnVsbCA6IGRpc3BsYXkuZ2V0QWN0aXZlU2hlbGwoKTsKLQkJaWYoc2hlbGwgPT0gbnVsbCAmJiBkaXNwbGF5ICE9IG51bGwpIHsKLQkJCVNoZWxsW10gc2hlbGxzID0gZGlzcGxheS5nZXRTaGVsbHMoKTsKLQkJCWlmKHNoZWxscy5sZW5ndGggPiAwKQotCQkJCXNoZWxsID0gc2hlbGxzWzBdOwotCQl9Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0JCi0JLyogbWF5IGJlIG51bGwgKi8KLQlwcml2YXRlIEpheGJQcm9qZWN0IGdldEpheGJQcm9qZWN0KCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlByb2plY3QodGhpcy5qYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNPdmVyd3JpdGluZ0NsYXNzZXMoQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9ucykgewotCQlpZihnZW5lcmF0b3JPcHRpb25zID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmKGdlbmVyYXRvck9wdGlvbnMuc2hvd3NWZXJzaW9uKCkgfHwgZ2VuZXJhdG9yT3B0aW9ucy5zaG93c0hlbHAoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5T3ZlcndyaXRpbmdDbGFzc2VzV2FybmluZyhDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zKSB7Ci0JCQotCQlpZiggISB0aGlzLmlzT3ZlcndyaXRpbmdDbGFzc2VzKGdlbmVyYXRvck9wdGlvbnMpCi0JCQkJfHwgIU9wdGlvbmFsTWVzc2FnZURpYWxvZy5pc0RpYWxvZ0VuYWJsZWQoT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nLklEKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX1lbHNlIHsKLQkJCU92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyBkaWFsb2cgPSBuZXcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JCQlyZXR1cm4gZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRDsJCQkKLQkJfQotCX0KLQkKLQlwcml2YXRlIFNoZWxsIGdldEN1cnJlbnRTaGVsbCgpIHsKLQkgICAgcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogb3ZlcndyaXRlIGRpYWxvZyAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nIGV4dGVuZHMgT3B0aW9uYWxNZXNzYWdlRGlhbG9nIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQ9ICJkb250U2hvd092ZXJ3cml0ZUpheGJDbGFzc2VzRnJvbVNjaGVtYXMud2FybmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCQlPdmVyd3JpdGVDb25maXJtZXJEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCQlzdXBlcihJRCwgcGFyZW50LAotCQkJCQlKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nVGl0bGUsCi0JCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JVaV9nZW5lcmF0aW5nQ2xhc3Nlc1dhcm5pbmdNZXNzYWdlLAotCQkJCQlNZXNzYWdlRGlhbG9nLldBUk5JTkcsCi0JCQkJCW5ldyBTdHJpbmdbXSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9LAotCQkJCQkxKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19JRCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgdHJ1ZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KYXhiSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL0pheGJKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4ZmIwNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL0pheGJKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci0KLQotcHVibGljIGNsYXNzIEpheGJKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIKLQkJaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQotCXB1YmxpYyBKYXhiSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBzZXNzaW9uU3RhcnRlZCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiAoY29udGV4dCBpbnN0YW5jZW9mIEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpID8KLQkJCQljb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygoSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCkgY29udGV4dCkKLQkJCQk6IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQkKLQkvKioKLQkgKiBXZSBmYWlsIHNpbGVudGx5IGhlcmUgYmVjYXVzZSAoaXQgc2VlbXMpIDxlbT5leHBlY3RlZDwvZW0+IGV4Y2VwdGlvbnMgb2NjdXIKLQkgKiBtb3JlIGZyZXF1ZW50bHkgdGhhbiBpbnRlcm1pdHRlbnQgPGVtPnVuZXhwZWN0ZWQ8L2VtPiBleGNlcHRpb25zIHRoYXQgbWlnaHQKLQkgKiBtZXJpdCBpbnZlc3RpZ2F0aW9uIChhbmQgYSBsb2dnZWQgc3RhY2t0cmFjZSBtaWdodCBiZSB0aGUgb25seSBoaW50IGFzCi0JICogdG8gd2hhdCBoYXBwZW5lZCkuCi0JICogPHA+Ci0JICogV2Ugd2lsbCBnZXQgYW4gPGVtPmV4cGVjdGVkPC9lbT4gZXhjZXB0aW9uICh0eXBpY2FsbHkgYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb24gTlBFfSkKLQkgKiBoZXJlIGlmIHRoZSB1c2VyOjxvbD4KLQkgKiA8bGk+bW9kaWZpZXMgdGhlIEphdmEgc291cmNlIGZpbGUgaW4gYSB3YXkgdGhhdCBwdXRzIGl0IGRyYXN0aWNhbGx5IG91dAotCSAqICAgICBvZiBzeW5jIHdpdGggdGhlIERhbGkgY29udGV4dCBtb2RlbCAoZS5nLiBkZWxldGluZyBhIGZpZWxkIG9yCi0JICogICAgIGFubm90YXRpb24pCi0JICogPGxpPmltbWVkaWF0ZWx5IGludm9rZXMgQ29udGVudCBBc3Npc3QgKHR5cGljYWxseSA8Y29kZT5DdHJsK1NwYWNlPC9jb2RlPikKLQkgKiA8L29sPgotCSAqIFRoZSBBU1Qgd2UgYnVpbGQgaGVyZSB3aWxsIGJlIGJhc2VkIG9uIHRoZSBqdXN0LW1vZGlmaWVkIEphdmEgc291cmNlOyBidXQsCi0JICogc2luY2UgdGhlIHVzZXIgbW92ZWQgcXVpY2tseSBhbmQgd2Ugd2lsbCBub3QgaGF2ZSB5ZXQgcmVjZWl2ZWQgYW55IEphdmEKLQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIChzaW5jZSB3ZSBvbmx5IGdldCBhIEphdmEgY2hhbmdlIG5vdGlmaWNhdGlvbiB3aGVuCi0JICogdGhlIHVzZXIgaGFzIHBhdXNlZCB0eXBpbmcgZm9yIGF0IGxlYXN0IDAuNSBzZWNvbmRzKSwgdGhlIGNvbnRleHQgbW9kZWwKLQkgKiB3aWxsIHN0aWxsIGJlIGJhc2VkIG9uIHRoZSB1bm1vZGlmaWVkIEphdmEgc291cmNlLiBBcyB0aGUgbmV3IEFTVCBpcwotCSAqIHBhc3NlZCBkb3duIHRocm91Z2ggdGhlIGNvbnRleHQgbW9kZWwgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFsbCB0aGUgY29kZQotCSAqIGV4cGVjdHMgdG8gZmluZCB0aGUgQVNUIGluIHN5bmMgd2l0aCB0aGUgbW9kZWwuIFdoZW4gdGhpcyBpcyBub3QgdGhlCi0JICogY2FzZSAoZS5nLiBhIGZpZWxkIGluIHRoZSByZXNvdXJjZSBtb2RlbCBpcyBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgQVNUCi0JICogYmVjYXVzZSB0aGUgdXNlciBoYXMgZGVsZXRlZCBpdCBvciBtb2RpZmllZCB0aGUgY29kZSBpbiBzdWNoIGEgd2F5IHRoYXQKLQkgKiB0aGUgcGFyc2VyIGNhbiBubyBsb25nZXIgZGV0ZWN0IHRoZSBmaWVsZCkgdGhlIG1vZGVsIHdpbGwgcHJvYmFibHkgY2hva2UKLQkgKiB3aGVuIGl0IGNhbm5vdCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIEFTVCBub2RlLgotCSAqIDxwPgotCSAqIEl0IHNlZW1zIHJlYXNvbmFibGUsIGluIHRoZXNlIHNpdHVhdGlvbnMsIHRvIHNpbXBseSByZXR1cm4gbm8gY29tcGxldGlvbgotCSAqIHByb3Bvc2Fscy4gSWYgdGhlIHVzZXIgc2ltcGx5IHdhaXRzIGEgbW9tZW50IGFuZCB0cmllcyBhZ2Fpbiwgd2Ugd2lsbCBiZQotCSAqIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGNhbGN1bGF0ZSBzb21lIHByb3Bvc2Fscy4KLQkgKiA8cD4KLQkgKiB+Ymp2Ci0JICovCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQl0cnkgewotCQkJcmV0dXJuIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzXyhjb250ZXh0KTsKLQkJfSAKLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJLy8gSnB0SmF4YkNvcmVQbHVnaW4ubG9nKGV4KTsgIC8vIGRvbid0IGxvZyAiZXhwZWN0ZWQiIGV4Y2VwdGlvbnMgKD8pCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzXyhKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNvbnRleHQuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCUlGaWxlIGZpbGUgPSAoY3UgIT0gbnVsbCkgPyBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoY3UpIDogbnVsbDsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gKGZpbGUgIT0gbnVsbCkgPyBQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpIDogbnVsbDsKLQkJCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsICB8fCAhIGNvbnRlbnRUeXBlLmlzS2luZE9mKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCQotCQlKYXhiUHJvamVjdCBqYXhiUHJvamVjdCA9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQcm9qZWN0KGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJaWYgKGpheGJQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCQkKLQkJSXRlcmFibGU8PyBleHRlbmRzIEphdmFDb250ZXh0Tm9kZT4gamF2YU5vZGVzID0gamF4YlByb2plY3QuZ2V0UHJpbWFyeUphdmFOb2RlcyhjdSk7Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShqYXZhTm9kZXMpKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQotCQlDb21wbGV0aW9uQ29udGV4dCBjYyA9IGNvbnRleHQuZ2V0Q29yZUNvbnRleHQoKTsKLQotCQkvLyB0aGUgY29udGV4dCdzICJ0b2tlbiIgaXMgcmVhbGx5IGEgc29ydCBvZiAicHJlZml4IiAtIGl0IGRvZXMgTk9UCi0JCS8vIGNvcnJlc3BvbmQgdG8gdGhlICJzdGFydCIgYW5kICJlbmQiIHdlIGdldCBiZWxvdy4uLiAKLQkJY2hhcltdIHByZWZpeCA9IGNjLmdldFRva2VuKCk7Ci0JCUZpbHRlcjxTdHJpbmc+IGZpbHRlciA9ICgocHJlZml4ID09IG51bGwpID8gRmlsdGVyLk51bGwuPFN0cmluZz5pbnN0YW5jZSgpIDogbmV3IElnbm9yZUNhc2VQcmVmaXhGaWx0ZXIocHJlZml4KSk7Ci0JCS8vIHRoZSB0b2tlbiAic3RhcnQiIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHRva2VuJ3MgZmlyc3QgY2hhcmFjdGVyCi0JCWludCB0b2tlblN0YXJ0ID0gY2MuZ2V0VG9rZW5TdGFydCgpOwotCQkvLyB0aGUgdG9rZW4gImVuZCIgaXMgdGhlIG9mZnNldCBvZiB0aGUgdG9rZW4ncyBsYXN0IGNoYXJhY3RlciAoeXVrKQotCQlpbnQgdG9rZW5FbmQgPSBjYy5nZXRUb2tlbkVuZCgpOwotCQlpZiAodG9rZW5TdGFydCA9PSAtMSkgeyAgLy8gbm90IHN1cmUgd2h5IHRoaXMgaGFwcGVucyAtIHNlZSBidWcgMjQyMjg2Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJCi0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJwcmVmaXg6ICIgKyAoKHByZWZpeCA9PSBudWxsKSA/ICJbbnVsbF0iIDogbmV3IFN0cmluZyhwcmVmaXgpKSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbiBzdGFydDogIiArIHRva2VuU3RhcnQpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigidG9rZW4gZW5kOiAiICsgdG9rZW5FbmQpOwotLy8JCVN0cmluZyBzb3VyY2UgPSBjdS5nZXRTb3VyY2UoKTsKLS8vCQlTdHJpbmcgdG9rZW4gPSBzb3VyY2Uuc3Vic3RyaW5nKE1hdGgubWF4KDAsIHRva2VuU3RhcnQpLCBNYXRoLm1pbihzb3VyY2UubGVuZ3RoKCksIHRva2VuRW5kICsgMSkpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigidG9rZW46ID0+IiArIHRva2VuICsgIjw9Iik7Ci0vLwkJU3RyaW5nIHNuaXBwZXQgPSBzb3VyY2Uuc3Vic3RyaW5nKE1hdGgubWF4KDAsIHRva2VuU3RhcnQgLSAyMCksIE1hdGgubWluKHNvdXJjZS5sZW5ndGgoKSwgdG9rZW5FbmQgKyAyMSkpOwotLy8JCVN5c3RlbS5vdXQucHJpbnRsbigic3Vycm91bmRpbmcgc25pcHBldDogPT4iICsgc25pcHBldCArICI8PSIpOwotCi0JCS8vIFRPRE8gbW92ZSB0aGlzIHBhcnNlciBjYWxsIGludG8gdGhlIG1vZGVsLi4uCi0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gQVNUVG9vbHMuYnVpbGRBU1RSb290KGN1KTsKLQkJTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+KCk7Ci0JCWZvciAoSmF2YUNvbnRleHROb2RlIGphdmFOb2RlIDogamF2YU5vZGVzKSB7Ci0JCQlmb3IgKFN0cmluZyBwcm9wb3NhbCA6IGphdmFOb2RlLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpLCBmaWx0ZXIsIGFzdFJvb3QpKSB7Ci0JCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsLCB0b2tlblN0YXJ0LCB0b2tlbkVuZCAtIHRva2VuU3RhcnQgKyAxLCBwcm9wb3NhbC5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQl0cnkgewotCQkJcmV0dXJuIChJRmlsZSkgY3UuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0SmF4YlVpUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0IGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlc3Npb25FbmRlZCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElnbm9yZUNhc2VQcmVmaXhGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXI8U3RyaW5nPiB7Ci0JCXByaXZhdGUgZmluYWwgY2hhcltdIHByZWZpeDsKLQkJSWdub3JlQ2FzZVByZWZpeEZpbHRlcihjaGFyW10gcHJlZml4KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBzKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nU3RhcnRzV2l0aElnbm9yZUNhc2Uocy50b0NoYXJBcnJheSgpLCB0aGlzLnByZWZpeCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvSmF4Yk1hcHBpbmdJbWFnZUhlbHBlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KYXhiTWFwcGluZ0ltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMGRkZDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KYXhiTWFwcGluZ0ltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgSmF4Yk1hcHBpbmdJbWFnZUhlbHBlcgotewotLy8KLS8vCXB1YmxpYyBzdGF0aWMgSW1hZ2UgaW1hZ2VGb3JUeXBlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotLy8JCXJldHVybiBKcHRVaVBsdWdpbi5nZXRJbWFnZShpY29uS2V5Rm9yVHlwZU1hcHBpbmcobWFwcGluZ0tleSkpOwotLy8JfQotLy8KLS8vCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGljb25LZXlGb3JUeXBlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotLy8JCWlmIChNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkgPT0gbWFwcGluZ0tleSkgewotLy8JCQlyZXR1cm4gSnB0VWlJY29ucy5OVUxMX1RZUEVfTUFQUElORzsKLS8vCQl9Ci0vLwkJZWxzZSBpZiAoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0vLwkJCXJldHVybiBKcHRVaUljb25zLkVOVElUWTsKLS8vCQl9Ci0vLwkJZWxzZSBpZiAoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotLy8JCQlyZXR1cm4gSnB0VWlJY29ucy5FTUJFRERBQkxFOwotLy8JCX0KLS8vCQllbHNlIGlmIChNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotLy8JCQlyZXR1cm4gSnB0VWlJY29ucy5NQVBQRURfU1VQRVJDTEFTUzsKLS8vCQl9Ci0vLwkJcmV0dXJuIG51bGw7Ci0vLwl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKGljb25LZXlGb3JBdHRyaWJ1dGVNYXBwaW5nKG1hcHBpbmdLZXkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uS2V5Rm9yQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPT0gbWFwcGluZ0tleSkgewotCQkJcmV0dXJuIEpwdEpheGJVaUljb25zLk5VTExfQVRUUklCVVRFX01BUFBJTkc7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuWE1MX0FOWV9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdEpheGJVaUljb25zLlhNTF9BTllfQVRUUklCVVRFOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLlhNTF9BTllfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YlVpSWNvbnMuWE1MX0FOWV9FTEVNRU5UOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdEpheGJVaUljb25zLlhNTF9BVFRSSUJVVEU7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdEpheGJVaUljb25zLlhNTF9FTEVNRU5UOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRl9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YlVpSWNvbnMuWE1MX0VMRU1FTlRfUkVGOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRlNfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdEpheGJVaUljb25zLlhNTF9FTEVNRU5UX1JFRlM7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRTX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRKYXhiVWlJY29ucy5YTUxfRUxFTUVOVFM7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuWE1MX1RSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0SmF4YlVpSWNvbnMuWE1MX1RSQU5TSUVOVDsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5YTUxfVkFMVUVfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdEpheGJVaUljb25zLlhNTF9WQUxVRTsKLQkJfQotCQkKLQkJLy9yZXR1cm4gdGhlIEpBWEJfQ09OVEVOVCBpY29uIGluc3RlYWQgb2YgbnVsbCwgbWlnaHQgYXMgd2VsbCBoYXZlIGFuIGljb24gaWYgb25lIGlzIG5vdCBkZWZpbmVkCi0JCXJldHVybiBKcHRKYXhiVWlJY29ucy5KQVhCX0NPTlRFTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KcHRKYXhiVWlJY29ucy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KcHRKYXhiVWlJY29ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTNjM2VjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvSnB0SmF4YlVpSWNvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0SmF4YlVpSWNvbnMgewotCQotCS8vICoqKioqKioqKioqKioqKiogR2VuZXJhbCBpY29ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfQ09OVEVOVCA9ICJmdWxsL29iajE2L2pheGJfY29udGVudCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRSA9ICJmdWxsL29iajE2L3BhY2thZ2UiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfQ0xBU1MgPSAiZnVsbC9vYmoxNi9qYXhiX2NsYXNzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX0VOVU0gPSAiZnVsbC9vYmoxNi9qYXhiX2VudW0iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfVFJBTlNJRU5UX0NMQVNTID0gImZ1bGwvb2JqMTYvamF4Yl90cmFuc2llbnRfY2xhc3MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfVFJBTlNJRU5UX0VOVU0gPSAiZnVsbC9vYmoxNi9qYXhiX3RyYW5zaWVudF9lbnVtIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1JFR0lTVFJZID0gImZ1bGwvb2JqMTYvamF4Yl9yZWdpc3RyeSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FOWV9BVFRSSUJVVEUgPSAiZnVsbC9vYmoxNi94bWwtYW55LWF0dHJpYnV0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FOWV9FTEVNRU5UID0gImZ1bGwvb2JqMTYveG1sLWFueS1lbGVtZW50IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUklCVVRFID0gImZ1bGwvb2JqMTYveG1sLWF0dHJpYnV0ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlQgPSAiZnVsbC9vYmoxNi94bWwtZWxlbWVudCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfUkVGID0gImZ1bGwvb2JqMTYveG1sLWVsZW1lbnQtcmVmIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9SRUZTID0gImZ1bGwvb2JqMTYveG1sLWVsZW1lbnQtcmVmcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRTID0gImZ1bGwvb2JqMTYveG1sLWVsZW1lbnRzIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVFJBTlNJRU5UID0gImZ1bGwvb2JqMTYveG1sLXRyYW5zaWVudCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZBTFVFID0gImZ1bGwvb2JqMTYveG1sLXZhbHVlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX0FUVFJJQlVURV9NQVBQSU5HID0gImZ1bGwvb2JqMTYvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9GSUVMRCA9ICJmdWxsL29iajE2L3BlcnNpc3RlbnRfZmllbGQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfUFJPUEVSVFkgPSAiZnVsbC9vYmoxNi9wZXJzaXN0ZW50X3Byb3BlcnR5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNX0NPTlNUQU5UID0gImZ1bGwvb2JqMTYvZW51bV9jb25zdGFudCI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBXaXphcmQgaWNvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9HRU4gPSAiZnVsbC93aXpiYW4vTmV3WFNEIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfR0VOX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vTmV3WFNEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0VTX0dFTl9XSVpfQkFOTkVSID0gImZ1bGwvd2l6YmFuL25ld2NsYXNzX3dpeiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYQl9XSVpfQkFOTkVSID0gImZ1bGwvd2l6YmFuL25ld19qYXhiX3Byal93aXoiOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KcHRKYXhiVWlNZXNzYWdlcy5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9KcHRKYXhiVWlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzFjOGRmLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvSnB0SmF4YlVpTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgSkFYQiBVSS4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqLwotcHVibGljIGNsYXNzIEpwdEpheGJVaU1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFQcm9qZWN0V2l6YXJkUGFnZV9wcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEphdmFQcm9qZWN0V2l6YXJkUGFnZV9kZXN0aW5hdGlvblByb2plY3Q7Ci0JCi0JLy8gQ2xhc3Nlc0dlbmVyYXRvcgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRfZXJyb3JEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkX2NvdWxkTm90Q3JlYXRlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29wZW5pbmdFZGl0b3I7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF4YkNvbnRlbnRfbGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfcmV2ZXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYXNQYWdlX3NjaGVtYXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfbmFtZXNwYWNlQ29sdW1uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfbG9jYXRpb25Db2x1bW5MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFzUGFnZV9hZGRCdXR0b25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFzUGFnZV9lZGl0QnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfcmVtb3ZlQnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfYWRkU2NoZW1hTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFzUGFnZV9lZGl0U2NoZW1hTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFzUGFnZV9hZGRTY2hlbWFEaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFzUGFnZV9lZGl0U2NoZW1hRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfYWRkU2NoZW1hVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfZWRpdFNjaGVtYVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYXNQYWdlX2xvY2F0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfYnJvd3NlQnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfbmFtZXNwYWNlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2Vfbm9OYW1lc3BhY2VUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYXNQYWdlX3NjaGVtYVVucmVzb2x2ZWRNZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYXNQYWdlX2R1cGxpY2F0ZU5hbWVzcGFjZU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2Vfbm9Mb2NhdGlvbk1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hc1BhZ2VfY2hvb3NlTG9jYXRpb25UaXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYVdpemFyZFBhZ2VfZGVzYzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlOyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYVdpemFyZFBhZ2VfeG1sQ2F0YWxvZ1VyaUNvbHVtbjsgCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFXaXphcmRQYWdlX2Vycm9yVXJpQ2Fubm90QmVMb2NhdGVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWxfZmlsZUZyb21Xb3Jrc3BhY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWxfeG1sQ2F0YWxvZ0VudHJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsX2ltcG9ydEJ1dHRvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2Rlc2M7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfdXNlc01veHlJbXBsZW1lbnRhdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2JpbmRpbmdzRmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2FkZEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9yZW1vdmVCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfY2hvb3NlQUJpbmRpbmdzRmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VBQ2F0YWxvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3NvdXJjZUZvbGRlclNlbGVjdGlvbkRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VTb3VyY2VGb2xkZXJEaWFsb2dfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2pheGJMaWJyYXJpZXNOb3RBdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfbW94eUxpYnJhcmllc05vdEF2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfZGVzYzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9ub1Byb3h5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfcHJveHlGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9jaG9vc2VBUHJveHlGaWxlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV91c2VTdHJpY3RWYWxpZGF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9tYWtlUmVhZE9ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzUGFja2FnZUluZm9HZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3N1cHByZXNzZXNIZWFkZXJHZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RhcmdldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdmVyYm9zZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfcXVpZXQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNYbWxTY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzUmVsYXhOZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNSZWxheE5nQ29tcGFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNEdGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzV3NkbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Vfc2hvd3NWZXJzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zaG93c0hlbHA7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9hbGxvd0V4dGVuc2lvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2NsYXNzcGF0aDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2VfYWRkaXRpb25hbEFyZ3VtZW50czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsYXNzZXNHZW5lcmF0b3JVaV9nZW5lcmF0aW5nRW50aXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdFbnRpdGllc1Rhc2s7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xhc3Nlc0dlbmVyYXRvclVpX2dlbmVyYXRpbmdDbGFzc2VzV2FybmluZ01lc3NhZ2U7Ci0KLQkvLyBTY2hlbWFHZW5lcmF0b3IKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRpbmdTY2hlbWE7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9kZXNjOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2Vfc2hlbWFMb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX3NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfcGFja2FnZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9icm93c2U7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VTY2hlbWFEaWFsb2dUaXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2Vycm9yTm9TY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZV9lcnJvck5vUGFja2FnZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2pheGJMaWJyYXJpZXNOb3RBdmFpbGFibGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX21veHlMaWJyYXJpZXNOb3RBdmFpbGFibGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hR2VuZXJhdG9yV2l6YXJkX2dlbmVyYXRlU2NoZW1hVGFzazsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZV9lcnJvck5vdEphdmFQcm9qZWN0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlX292ZXJ3cml0ZUV4aXN0aW5nU2NoZW1hczsKLQkKLQkKLQkvLyBuZXcgcHJvamVjdCB3aXphcmQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXhiUHJvamVjdFdpemFyZF90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXhiUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF4YlByb2plY3RXaXphcmRfZmlyc3RQYWdlX2Rlc2M7Ci0JCi0JCi0JLy8gZmFjZXQgcGFnZQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldFdpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF4YkZhY2V0V2l6YXJkUGFnZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldFdpemFyZFBhZ2VfcGxhdGZvcm1MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKYXhiRmFjZXRXaXphcmRQYWdlX2ZhY2V0c1BhZ2VMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpheGJGYWNldFdpemFyZFBhZ2VfamF4YkltcGxlbWVudGF0aW9uTGFiZWw7Ci0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9qYXhiX3VpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdEpheGJVaU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRKYXhiVWlNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVDbGFzc2VzQWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVDbGFzc2VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNmZkNjkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlQ2xhc3Nlc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5DbGFzc2VzR2VuZXJhdG9yVWk7Ci0KLS8qKgotICogIEdlbmVyYXRlQ2xhc3Nlc0FjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVDbGFzc2VzQWN0aW9uIGV4dGVuZHMgT2JqZWN0QWN0aW9uCi17Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElGaWxlIHhzZEZpbGUpIHsKLQotCQlDbGFzc2VzR2VuZXJhdG9yVWkuZ2VuZXJhdGUoeHNkRmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2FjdGlvbnMvT2JqZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MmQ3NWEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9hY3Rpb25zL09iamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiAgR2VuZXJhdGVFbnRpdGllc0FjdGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgCi17Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwdWJsaWMgT2JqZWN0QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKHRoaXMuY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElUcmVlU2VsZWN0aW9uKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPD8+IHN0cmVhbSA9ICgoSVRyZWVTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbikuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJdGhpcy5leGVjdXRlKHN0cmVhbS5uZXh0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCQotCQlpZihzZWxlY3Rpb24gaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJdGhpcy5leGVjdXRlKChJRmlsZSlzZWxlY3Rpb24pOwotCQl9Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJRmlsZSBmaWxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KYXhiUmVzb3VyY2VBY3Rpb24uamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvYWN0aW9ucy9PcGVuSmF4YlJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NTJlNDguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KYXhiUmVzb3VyY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQmFzZVNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5KYXhiUmVzb3VyY2VBY3Rpb24KLQkJZXh0ZW5kcyBCYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb24gewotCQotCXByaXZhdGUgSmF4YkNvbnRleHROb2RlIHNlbGVjdGVkTm9kZTsKLQkKLQkKLQlwdWJsaWMgT3BlbkpheGJSZXNvdXJjZUFjdGlvbigpIHsKLQkJc3VwZXIoIk9wZW4iKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0JCXRoaXMuc2VsZWN0ZWROb2RlID0gbnVsbDsKLQkJCi0JCWlmICghIHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAocy5zaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAocy5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIEpheGJDb250ZXh0Um9vdCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlzZWxlY3RlZE5vZGUgPSAoSmF4YkNvbnRleHROb2RlKSBzLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKCEgaXNFbmFibGVkKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSVJlc291cmNlIHJlc291cmNlID0gdGhpcy5zZWxlY3RlZE5vZGUuZ2V0UmVzb3VyY2UoKTsKLQkJCi0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpICYmIHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJb3BlbkVkaXRvcigoSUZpbGUpIHJlc291cmNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBvcGVuRWRpdG9yKElGaWxlIGZpbGUpIHsKLQkJSUVkaXRvclJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBJREUuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvckRlc2NyaXB0b3IgPSByZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TmFtZSgpLCBjb250ZW50VHlwZSk7Ci0JCWlmIChlZGl0b3JEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIG5vIGVkaXRvciBhc3NvY2lhdGVkLi4uCi0JCX0KLQkJCi0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCi0JCXRyeSB7Ci0JCQlwYWdlLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChmaWxlKSwgZWRpdG9yRGVzY3JpcHRvci5nZXRJZCgpKTsKLQkJfSAKLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihwYWdlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIEpwdEpheGJVaU1lc3NhZ2VzLkVycm9yX29wZW5pbmdFZGl0b3IsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Db250YWluZXJGaWx0ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Db250YWluZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3MmUwYi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvQ29udGFpbmVyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotCi0vKioKLSAqIEZpbHRlcnMgb3V0IGFsbCBjb250YWluZXJzIGkuZS4gYWxsIHBhY2thZ2VzIGFuZCBmb2xkZXJzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250YWluZXJGaWx0ZXIgIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlib29sZWFuIGlzQ29udGFpbmVyID0gZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXI7Ci0JCQotCQlpZiggISBpc0NvbnRhaW5lciAmJiBlbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlpbnQgdHlwZT0gKChJSmF2YUVsZW1lbnQpZWxlbWVudCkuZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWlzQ29udGFpbmVyID0gKHR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwKLQkJCQkJCXx8IHR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVAotCQkJCQkJfHwgdHlwZSA9PSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVAotCQkJCQkJfHwgdHlwZSA9PUlKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQl9Ci0JCXJldHVybiAhIGlzQ29udGFpbmVyOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRmlsdGVyIG91dCBDb250YWluZXJzIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9FbXB0eUlubmVyUGFja2FnZUZpbHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL0VtcHR5SW5uZXJQYWNrYWdlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTYwOWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL0VtcHR5SW5uZXJQYWNrYWdlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBDb2RlIG9yaWdpbmF0ZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5maWx0ZXJzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuZmlsdGVyczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIEZpbHRlcnMgZW1wdHkgbm9uLWxlYWYgcGFja2FnZSBmcmFnbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEVtcHR5SW5uZXJQYWNrYWdlRmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotCS8qCi0JICogQHNlZSBWaWV3ZXJGaWx0ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50IHBrZz0gKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudDsKLQkJCXRyeSB7Ci0JCQkJaWYgKHBrZy5pc0RlZmF1bHRQYWNrYWdlKCkpCi0JCQkJCXJldHVybiBwa2cuaGFzQ2hpbGRyZW4oKTsKLQkJCQlyZXR1cm4gIXBrZy5oYXNTdWJwYWNrYWdlcygpIHx8IHBrZy5oYXNDaGlsZHJlbigpIHx8IChwa2cuZ2V0Tm9uSmF2YVJlc291cmNlcygpLmxlbmd0aCA+IDApOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uQXJjaGl2ZU9yRXh0ZXJuYWxFbGVtZW50RmlsdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uQXJjaGl2ZU9yRXh0ZXJuYWxFbGVtZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZTk1ZjguLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL05vbkFyY2hpdmVPckV4dGVybmFsRWxlbWVudEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSogICAgIAotKiAgICAgQ29kZSBvcmlnaW5hdGUgZnJvbSBYWFhYCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLS8qKgotICogIE5vbkFyY2hpdmVPckV4dGVybmFsRWxlbWVudEZpbHRlcgotICovCi1wdWJsaWMgY2xhc3MgTm9uQXJjaGl2ZU9yRXh0ZXJuYWxFbGVtZW50RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCUlQYWNrYWdlRnJhZ21lbnRSb290IHJvb3Q9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudDsKLQkJCXJldHVybiAhcm9vdC5pc0FyY2hpdmUoKSAmJiAhcm9vdC5pc0V4dGVybmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJGaWx0ZXIgb3V0OiBOb24tQXJjaGl2ZSBhbmQgTm9uLUV4dGVybmFsIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL05vbkNvbnRhaW5lckZpbHRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL05vbkNvbnRhaW5lckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmQ2ZTZhLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvZmlsdGVycy9Ob25Db250YWluZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotCi0vKioKLSAqIEZpbHRlcnMgb3V0IGFsbCBub24gQ29udGFpbmVyIGFuZCBhbGwgSmF2YVByb2plY3QgCi0gKiB3aXRoIG5hbWUgbm90IGVxdWFscyB0byB0aGUgZ2l2ZW4gcHJvamVjdE5hbWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb25Db250YWluZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIKLXsKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLQotCXB1YmxpYyBOb25Db250YWluZXJGaWx0ZXIoU3RyaW5nIHByb2plY3ROYW1lKSB7Ci0JCXRoaXMucHJvamVjdE5hbWUgPSBwcm9qZWN0TmFtZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJYm9vbGVhbiBpc0NvbnRhaW5lciA9IGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyOwotCQlpbnQgdHlwZTsKLQkJaWYoICEgaXNDb250YWluZXIgJiYgZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJdHlwZSA9ICgoSUphdmFFbGVtZW50KWVsZW1lbnQpLmdldEVsZW1lbnRUeXBlKCk7Ci0JCQlpc0NvbnRhaW5lciA9ICh0eXBlID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMCi0JCQkJCQl8fCB0eXBlID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QKLQkJCQkJCXx8IHR5cGUgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQKLQkJCQkJCXx8IHR5cGUgPT1JSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UKTsKLQkJfQotCQlpZihpc0NvbnRhaW5lciAmJiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkpIHsKLQkJCXR5cGUgPSAoKElKYXZhRWxlbWVudCllbGVtZW50KS5nZXRFbGVtZW50VHlwZSgpOwotCQkJaWYodHlwZSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUKSB7Ci0JCQkJU3RyaW5nIHByb2plY3ROYW1lID0gKChJSmF2YVByb2plY3QpZWxlbWVudCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQlyZXR1cm4gcHJvamVjdE5hbWUuZXF1YWxzKHRoaXMucHJvamVjdE5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0NvbnRhaW5lcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIkZpbHRlciBvdXQgTm9uLUNvbnRhaW5lcnMiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9maWx0ZXJzL05vbkphdmFFbGVtZW50RmlsdGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uSmF2YUVsZW1lbnRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMxYTY5NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2ZpbHRlcnMvTm9uSmF2YUVsZW1lbnRGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmZpbHRlcnMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5maWx0ZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBGaWx0ZXJzIG91dCBhbGwgbm9uLUphdmEgZWxlbWVudHMsIGFuZCBlbGVtZW50cyBuYW1lZCBwYWNrYWdlLWluZm8KLSAqLwotcHVibGljIGNsYXNzIE5vbkphdmFFbGVtZW50RmlsdGVyIGV4dGVuZHMgVmlld2VyRmlsdGVyIHsKLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIEZJTEVfVE9fRVhDTFVERSA9ICJwYWNrYWdlLWluZm8uamF2YSI7ICAgLy8kTk9OLU5MUy0xJAotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyI3NlbGVjdChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybihGSUxFX1RPX0VYQ0xVREUuZXF1YWxzKCgoSUphdmFFbGVtZW50KWVsZW1lbnQpLmdldEVsZW1lbnROYW1lKCkpKSA/Ci0JCQkJCWZhbHNlIDogdHJ1ZTsKLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0PSAoKElSZXNvdXJjZSllbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCQlyZXR1cm4gcHJvamVjdCA9PSBudWxsIHx8ICFwcm9qZWN0LmlzT3BlbigpOwotCQl9Ci0KLQkJLy8gRXhjbHVkZSBhbGwgSVN0b3JhZ2UgZWxlbWVudHMgd2hpY2ggYXJlIG5laXRoZXIgSmF2YSBlbGVtZW50cyBub3IgcmVzb3VyY2VzCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2UpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTZjNmJiLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ29udGV4dFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBJTlNUQU5DRTsKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgaW5zdGFuY2UoKSB7Ci0JCWlmIChJTlNUQU5DRSA9PSBudWxsKSB7Ci0JCQlJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwKLQkJCURlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQkKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiQ29udGV4dFJvb3QpIHsKLQkJCXJldHVybiBuZXcgSmF4YkNvbnRleHRSb290SXRlbUxhYmVsUHJvdmlkZXIoKEpheGJDb250ZXh0Um9vdCkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiUGFja2FnZSkgewotCQkJcmV0dXJuIG5ldyBKYXhiUGFja2FnZUl0ZW1MYWJlbFByb3ZpZGVyKChKYXhiUGFja2FnZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiQ2xhc3MpIHsKLQkJCXJldHVybiBuZXcgSmF4YkNsYXNzSXRlbUxhYmVsUHJvdmlkZXIoKEpheGJDbGFzcykgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiRW51bSkgewotCQkJcmV0dXJuIG5ldyBKYXhiRW51bUl0ZW1MYWJlbFByb3ZpZGVyKChKYXhiRW51bSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIG5ldyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyKChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiRW51bUNvbnN0YW50KSB7Ci0JCQlyZXR1cm4gbmV3IEpheGJFbnVtQ29uc3RhbnRJdGVtTGFiZWxQcm92aWRlcigoSmF4YkVudW1Db25zdGFudCkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhNjI2NS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9HZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgewotCQotCXByaXZhdGUgc3RhdGljIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgSU5TVEFOQ0U7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBHZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBHZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sCi0JCQlEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudEFuZExhYmVsUHJvdmlkZXIpIHsKLQkJCi0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyID0gCi0JCQkJKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotCQkKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiQ29udGV4dFJvb3QpIHsKLQkJCXJldHVybiBuZXcgSmF4YkNvbnRleHRSb290SXRlbUNvbnRlbnRQcm92aWRlcigoSmF4YkNvbnRleHRSb290KSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXhiUGFja2FnZSkgewotCQkJcmV0dXJuIG5ldyBKYXhiUGFja2FnZUl0ZW1Db250ZW50UHJvdmlkZXIoKEpheGJQYWNrYWdlKSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgSmF4YkNsYXNzKSB7Ci0JCQlyZXR1cm4gbmV3IEpheGJDbGFzc0l0ZW1Db250ZW50UHJvdmlkZXIoKEpheGJDbGFzcykgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEpheGJFbnVtKSB7Ci0JCQlyZXR1cm4gbmV3IEpheGJFbnVtSXRlbUNvbnRlbnRQcm92aWRlcigoSmF4YkVudW0pIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NWY1ZTYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLm5hdmlnYXRvci5KYXhiTmF2aWdhdG9yVWk7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaQotCQlpbXBsZW1lbnRzIEpheGJOYXZpZ2F0b3JVaSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpIElOU1RBTkNFOwotCQotCQotCXB1YmxpYyBzdGF0aWMgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpIGluc3RhbmNlKCkgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJSU5TVEFOQ0UgPSBuZXcgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpKCk7Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBHZW5lcmljSmF4Yl8yXzFfTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0dlbmVyaWNKYXhiXzJfMV9QbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzZhYmMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkubmF2aWdhdG9yLkpheGJOYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtVWkKLQkJaW1wbGVtZW50cyBKYXhiUGxhdGZvcm1VaSB7Ci0JCi0JcHVibGljIEpheGJOYXZpZ2F0b3JVaSBnZXROYXZpZ2F0b3JVaSgpIHsKLQkJcmV0dXJuIEdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDbGFzc0l0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDbGFzc0l0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlMjU2Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiQ2xhc3NJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQotcHVibGljIGNsYXNzIEpheGJDbGFzc0l0ZW1Db250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiB7Ci0JCi0JcHVibGljIEpheGJDbGFzc0l0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlKYXhiQ2xhc3MgamF4YkNsYXNzLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihqYXhiQ2xhc3MsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQ2xhc3MgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSmF4YkNsYXNzKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNvbnRleHRSb290IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXhiQ29udGV4dFJvb3QpIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF4YkNsYXNzTWFwcGluZz4gbWFwcGluZ01vZGVsID0gYnVpbGRNYXBwaW5nTW9kZWwoKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4sIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPigKLQkJCQlidWlsZEF0dHJpYnV0ZXNNb2RlbChtYXBwaW5nTW9kZWwpLAotCQkJCWJ1aWxkSW5jbHVkZWRBdHRyaWJ1dGVzTW9kZWwobWFwcGluZ01vZGVsKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF4YkNsYXNzTWFwcGluZz4gYnVpbGRNYXBwaW5nTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpheGJDbGFzcywgSmF4YkNsYXNzTWFwcGluZz4oSmF4YkNsYXNzLk1BUFBJTkdfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpheGJDbGFzc01hcHBpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRBdHRyaWJ1dGVzTW9kZWwoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF4YkNsYXNzTWFwcGluZz4gbWFwcGluZ01vZGVsKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8SmF4YkNsYXNzTWFwcGluZywgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KAotCQkJCW1hcHBpbmdNb2RlbCwgSmF4YkNsYXNzTWFwcGluZy5BVFRSSUJVVEVTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkSW5jbHVkZWRBdHRyaWJ1dGVzTW9kZWwoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF4YkNsYXNzTWFwcGluZz4gbWFwcGluZ01vZGVsKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8SmF4YkNsYXNzTWFwcGluZywgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+KAotCQkJCW1hcHBpbmdNb2RlbCwgSmF4YkNsYXNzTWFwcGluZy5JTkNMVURFRF9BVFRSSUJVVEVTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEluY2x1ZGVkQXR0cmlidXRlcygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDbGFzc0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiQ2xhc3NJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmI4N2M4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDbGFzc0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkNsYXNzSXRlbUxhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBKYXhiVHlwZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgSmF4YkNsYXNzSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlKYXhiQ2xhc3MgamF4YlBlcnNpc3RlbnRDbGFzcywgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCi0JCXN1cGVyKGpheGJQZXJzaXN0ZW50Q2xhc3MsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNsYXNzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKEpheGJDbGFzcykgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEpheGJDbGFzc0ltYWdlTW9kZWwoZ2V0TW9kZWwoKSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBjbGFzcyBKYXhiQ2xhc3NJbWFnZU1vZGVsCi0JCQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8SmF4YkNsYXNzLCBJbWFnZT4gewotCQkKLQkJcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBpc1htbFJlZ2lzdHJ5TW9kZWw7Ci0JCQkKLQkJcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXhiQ2xhc3NNYXBwaW5nPiBtYXBwaW5nTW9kZWw7Ci0JCQotCQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGlzWG1sVHJhbnNpZW50TW9kZWw7Ci0JCQotCQlwcm90ZWN0ZWQgZmluYWwgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotCQkKLQkJCi0JCXB1YmxpYyBKYXhiQ2xhc3NJbWFnZU1vZGVsKEpheGJDbGFzcyBzdWJqZWN0KSB7Ci0JCQlzdXBlcihuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsKHN1YmplY3QpKTsKLQkJCXRoaXMuaXNYbWxSZWdpc3RyeU1vZGVsID0gYnVpbGRJc1htbFJlZ2lzdHJ5TW9kZWwoKTsKLQkJCXRoaXMubWFwcGluZ01vZGVsID0gYnVpbGRNYXBwaW5nTW9kZWwoKTsKLQkJCXRoaXMuaXNYbWxUcmFuc2llbnRNb2RlbCA9IGJ1aWxkSXNYbWxUcmFuc2llbnRNb2RlbCgpOwotCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSXNYbWxSZWdpc3RyeU1vZGVsKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF4YkNsYXNzLCBCb29sZWFuPihKYXhiQ2xhc3MuWE1MX1JFR0lTVFJZX1BST1BFUlRZLCBKYXhiQ2xhc3NJdGVtTGFiZWxQcm92aWRlci50aGlzLmdldE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRYbWxSZWdpc3RyeSgpICE9IG51bGw7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxKYXhiQ2xhc3NNYXBwaW5nPiBidWlsZE1hcHBpbmdNb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpheGJDbGFzcywgSmF4YkNsYXNzTWFwcGluZz4gKEpheGJDbGFzcy5NQVBQSU5HX1BST1BFUlRZLCBKYXhiQ2xhc3NJdGVtTGFiZWxQcm92aWRlci50aGlzLmdldE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSmF4YkNsYXNzTWFwcGluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRNYXBwaW5nKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZElzWG1sVHJhbnNpZW50TW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXhiQ2xhc3NNYXBwaW5nLCBCb29sZWFuPih0aGlzLm1hcHBpbmdNb2RlbCwgSmF4YkNsYXNzTWFwcGluZy5YTUxfVFJBTlNJRU5UX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaXNYbWxUcmFuc2llbnQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgcHJvcGVydHkgY2hhbmdlIGV2ZW50cwotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUpheGJDbGFzc0ltYWdlTW9kZWwudGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEltYWdlIGJ1aWxkVmFsdWVfKCkgewotCQkJaWYgKHRoaXMubWFwcGluZ01vZGVsLmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCWlmICh0aGlzLmlzWG1sVHJhbnNpZW50TW9kZWwuZ2V0VmFsdWUoKSA9PSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJcmV0dXJuIEpwdEpheGJVaVBsdWdpbi5nZXRJbWFnZShKcHRKYXhiVWlJY29ucy5KQVhCX1RSQU5TSUVOVF9DTEFTUyk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5pc1htbFJlZ2lzdHJ5TW9kZWwuZ2V0VmFsdWUoKSA9PSBCb29sZWFuLlRSVUUpIHsKLQkJCQlyZXR1cm4gSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKEpwdEpheGJVaUljb25zLkpBWEJfUkVHSVNUUlkpOwotCQkJfQotCQkJcmV0dXJuIEpwdEpheGJVaVBsdWdpbi5nZXRJbWFnZShKcHRKYXhiVWlJY29ucy5KQVhCX0NMQVNTKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5pc1htbFJlZ2lzdHJ5TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMubWFwcGluZ01vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLmlzWG1sVHJhbnNpZW50TW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5pc1htbFJlZ2lzdHJ5TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMubWFwcGluZ01vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQl0aGlzLmlzWG1sVHJhbnNpZW50TW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDb250ZXh0Um9vdEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDb250ZXh0Um9vdEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2YTAxMy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiQ29udGV4dFJvb3RJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkNvbnRleHRSb290SXRlbUNvbnRlbnRQcm92aWRlcgotCQlleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8SmF4YlBhY2thZ2U+IHsKLQkKLQlwdWJsaWMgSmF4YkNvbnRleHRSb290SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCUpheGJDb250ZXh0Um9vdCByb290Q29udGV4dCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIocm9vdENvbnRleHQsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQ29udGV4dFJvb3QgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSmF4YkNvbnRleHRSb290KSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVByb2plY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRKYXhiUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpheGJQYWNrYWdlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8SmF4YkNvbnRleHRSb290LCBKYXhiUGFja2FnZT4oCi0JCQkJSmF4YkNvbnRleHRSb290LlBBQ0tBR0VTX0NPTExFQ1RJT04sCi0JCQkJZ2V0TW9kZWwoKSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXhiUGFja2FnZT4gZ2V0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQYWNrYWdlcygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDb250ZXh0Um9vdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiQ29udGV4dFJvb3RJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmE1YzRlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJDb250ZXh0Um9vdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJDb250ZXh0Um9vdEl0ZW1MYWJlbFByb3ZpZGVyCi0JCSBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIgewotCQotCXB1YmxpYyBKYXhiQ29udGV4dFJvb3RJdGVtTGFiZWxQcm92aWRlcigKLQkJCUpheGJDb250ZXh0Um9vdCByb290Q29udGV4dE5vZGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQotCQlzdXBlcihyb290Q29udGV4dE5vZGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNvbnRleHRSb290IGdldE1vZGVsKCkgewotCQlyZXR1cm4gKEpheGJDb250ZXh0Um9vdCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKEpwdEpheGJVaUljb25zLkpBWEJfQ09OVEVOVCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oSnB0SmF4YlVpTWVzc2FnZXMuSmF4YkNvbnRlbnRfbGFiZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJDb250ZW50X2xhYmVsKTsKLQkJc2IuYXBwZW5kKCIgLSAiKTsgIC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKGdldE1vZGVsKCkuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihzYi50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiRW51bUNvbnN0YW50SXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJFbnVtQ29uc3RhbnRJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTgzOWYwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJFbnVtQ29uc3RhbnRJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5qYXhiMjE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bUNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJFbnVtQ29uc3RhbnRJdGVtTGFiZWxQcm92aWRlcgotCQkgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgSmF4YkVudW1Db25zdGFudEl0ZW1MYWJlbFByb3ZpZGVyKAotCQlKYXhiRW51bUNvbnN0YW50IGpheGJFbnVtQ29uc3RhbnQsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCQotCQlzdXBlcihqYXhiRW51bUNvbnN0YW50LCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJFbnVtQ29uc3RhbnQgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSmF4YkVudW1Db25zdGFudCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKEpwdEpheGJVaUljb25zLkVOVU1fQ09OU1RBTlQpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KGdldE1vZGVsKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihnZXRNb2RlbCgpLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvSmF4YkVudW1JdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiRW51bUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkYTMyMi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiRW51bUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1NYXBwaW5nOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiRW51bUl0ZW1Db250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEpheGJFbnVtQ29uc3RhbnQ+IHsKLQkKLQlwdWJsaWMgSmF4YkVudW1JdGVtQ29udGVudFByb3ZpZGVyKAotCQkJSmF4YkVudW0gamF4YkVudW0sIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCQotCQlzdXBlcihqYXhiRW51bSwgY29udGVudFByb3ZpZGVyKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJFbnVtIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKEpheGJFbnVtKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YkNvbnRleHRSb290IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXhiQ29udGV4dFJvb3QpIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SmF4YkVudW1NYXBwaW5nPiBidWlsZE1hcHBpbmdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF4YkVudW0sIEpheGJFbnVtTWFwcGluZz4oSmF4YkVudW0uTUFQUElOR19QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF4YkVudW1NYXBwaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SmF4YkVudW1Db25zdGFudD4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPEpheGJFbnVtTWFwcGluZywgSmF4YkVudW1Db25zdGFudD4oCi0JCQkJYnVpbGRNYXBwaW5nTW9kZWwoKSwgSmF4YkVudW1NYXBwaW5nLkVOVU1fQ09OU1RBTlRTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJFbnVtQ29uc3RhbnQ+IGdldEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RW51bUNvbnN0YW50cygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJFbnVtSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJFbnVtSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiZGFjZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiRW51bUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJFbnVtSXRlbUxhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBKYXhiVHlwZUl0ZW1MYWJlbFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgSmF4YkVudW1JdGVtTGFiZWxQcm92aWRlcigKLQkJCUpheGJFbnVtIGpheGJFbnVtLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihqYXhiRW51bSwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiRW51bSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChKYXhiRW51bSkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEpheGJFbnVtSW1hZ2VNb2RlbChnZXRNb2RlbCgpKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGNsYXNzIEpheGJFbnVtSW1hZ2VNb2RlbAotCQkJZXh0ZW5kcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEpheGJFbnVtLCBJbWFnZT4gewotCQkKLQkJcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXhiRW51bU1hcHBpbmc+IG1hcHBpbmdNb2RlbDsKLQkJCi0JCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gaXNYbWxUcmFuc2llbnRNb2RlbDsKLQkJCi0JCXByb3RlY3RlZCBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci0JCQotCQkKLQkJcHVibGljIEpheGJFbnVtSW1hZ2VNb2RlbChKYXhiRW51bSBzdWJqZWN0KSB7Ci0JCQlzdXBlcihuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsKHN1YmplY3QpKTsKLQkJCXRoaXMubWFwcGluZ01vZGVsID0gYnVpbGRNYXBwaW5nTW9kZWwoKTsKLQkJCXRoaXMuaXNYbWxUcmFuc2llbnRNb2RlbCA9IGJ1aWxkSXNYbWxUcmFuc2llbnRNb2RlbCgpOwotCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEpheGJFbnVtTWFwcGluZz4gYnVpbGRNYXBwaW5nTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXhiRW51bSwgSmF4YkVudW1NYXBwaW5nPiAoSmF4YkVudW0uTUFQUElOR19QUk9QRVJUWSwgSmF4YkVudW1JdGVtTGFiZWxQcm92aWRlci50aGlzLmdldE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSmF4YkVudW1NYXBwaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1hcHBpbmcoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSXNYbWxUcmFuc2llbnRNb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpheGJFbnVtTWFwcGluZywgQm9vbGVhbj4odGhpcy5tYXBwaW5nTW9kZWwsIEpheGJFbnVtTWFwcGluZy5YTUxfVFJBTlNJRU5UX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiB0aGlzLnN1YmplY3QuaXNYbWxUcmFuc2llbnQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkvLyB0cmFuc2Zvcm0gdGhlIHN1YmplY3QncyBwcm9wZXJ0eSBjaGFuZ2UgZXZlbnRzIGludG8gVkFMVUUgcHJvcGVydHkgY2hhbmdlIGV2ZW50cwotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCUpheGJFbnVtSW1hZ2VNb2RlbC50aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSW1hZ2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlpZiAodGhpcy5tYXBwaW5nTW9kZWwuZ2V0VmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMuaXNYbWxUcmFuc2llbnRNb2RlbC5nZXRWYWx1ZSgpID09IEJvb2xlYW4uVFJVRSkgewotCQkJCQlyZXR1cm4gSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKEpwdEpheGJVaUljb25zLkpBWEJfVFJBTlNJRU5UX0VOVU0pOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2UoSnB0SmF4YlVpSWNvbnMuSkFYQl9FTlVNKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5tYXBwaW5nTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihWQUxVRSwgdGhpcy5wcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCXRoaXMuaXNYbWxUcmFuc2llbnRNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQl0aGlzLm1hcHBpbmdNb2RlbC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFZBTFVFLCB0aGlzLnByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkJdGhpcy5pc1htbFRyYW5zaWVudE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoVkFMVUUsIHRoaXMucHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiUGFja2FnZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJQYWNrYWdlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjBjNmU3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJQYWNrYWdlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5qYXhiMjE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUGFja2FnZUl0ZW1Db250ZW50UHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEpheGJUeXBlPiB7Ci0JCi0JcHVibGljIEpheGJQYWNrYWdlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkKLQkJc3VwZXIoamF4YlBhY2thZ2UsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUGFja2FnZSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChKYXhiUGFja2FnZSkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpheGJDb250ZXh0Um9vdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF4YkNvbnRleHRSb290KSBnZXRNb2RlbCgpLmdldFBhcmVudCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SmF4YlR5cGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxKYXhiQ29udGV4dFJvb3QsIEpheGJUeXBlPigKLQkJCQlKYXhiQ29udGV4dFJvb3QuVFlQRVNfQ09MTEVDVElPTiwgZ2V0UGFyZW50KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpheGJUeXBlPiBnZXRJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFR5cGVzKGdldE1vZGVsKCkpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJQYWNrYWdlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJQYWNrYWdlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3NWNiNy4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiUGFja2FnZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJQYWNrYWdlSXRlbUxhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyIHsKLQkKLQlwdWJsaWMgSmF4YlBhY2thZ2VJdGVtTGFiZWxQcm92aWRlcigKLQkJCUpheGJQYWNrYWdlIGpheGJQYWNrYWdlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkKLQkJc3VwZXIoamF4YlBhY2thZ2UsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YlBhY2thZ2UgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSmF4YlBhY2thZ2UpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdEpheGJVaVBsdWdpbi5nZXRJbWFnZShKcHRKYXhiVWlJY29ucy5QQUNLQUdFKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihnZXRNb2RlbCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoZ2V0TW9kZWwoKS5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoIiAtICIpOyAgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZ2V0TW9kZWwoKS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHNiLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMxNGYyZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmpheGIyMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSmF4Yk1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIKLQkJIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlciB7Ci0JCi0JcHVibGljIEpheGJQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIoCi0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJCi0JCXN1cGVyKGF0dHJpYnV0ZSwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSwgSW1hZ2U+KAotCQkJCW5ldyBTdHJpbmdbXSB7SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUuREVGQVVMVF9NQVBQSU5HX0tFWV9QUk9QRVJUWSwgSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWX0sIAotCQkJCWdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEltYWdlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBKYXhiTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyh0aGlzLnN1YmplY3QuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChnZXRNb2RlbCgpLmlzSW5oZXJpdGVkKCkpIHsKLQkJCXNiLmFwcGVuZChnZXRNb2RlbCgpLmdldERlY2xhcmluZ0phdmFSZXNvdXJjZVR5cGUoKS5nZXROYW1lKCkpOwotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJc2IuYXBwZW5kKGdldE1vZGVsKCkuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihzYi50b1N0cmluZygpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihnZXRNb2RlbCgpLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvSmF4YlJlZ2lzdHJ5SXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjEvSmF4YlJlZ2lzdHJ5SXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDZlNWI5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJSZWdpc3RyeUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJlZ2lzdHJ5OwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUmVnaXN0cnlJdGVtQ29udGVudFByb3ZpZGVyCi0JCWV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IHsKLQkKLQlwdWJsaWMgSmF4YlJlZ2lzdHJ5SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJWG1sUmVnaXN0cnkgamF4YlJlZ2lzdHJ5LCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkKLQkJc3VwZXIoamF4YlJlZ2lzdHJ5LCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sUmVnaXN0cnkgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoWG1sUmVnaXN0cnkpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXhiQ29udGV4dFJvb3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEpheGJDb250ZXh0Um9vdCkgZ2V0TW9kZWwoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJUeXBlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIxL0pheGJUeXBlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3ZWI0NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL2pheGIyMS9KYXhiVHlwZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlR5cGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpheGJUeXBlSXRlbUxhYmVsUHJvdmlkZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyIHsKLQkKLQlwcm90ZWN0ZWQgSmF4YlR5cGVJdGVtTGFiZWxQcm92aWRlcigKLQkJCUpheGJUeXBlIGpheGJUeXBlLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQkKLQkJc3VwZXIoamF4YlR5cGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF4YlR5cGUgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSmF4YlR5cGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KGdldE1vZGVsKCkuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoZ2V0TW9kZWwoKS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgiIC0gIik7ICAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChnZXRNb2RlbCgpLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oc2IudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjIvR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvamF4YjIyL0dlbmVyaWNKYXhiXzJfMl9QbGF0Zm9ybVVpLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMmFkNWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9qYXhiMjIvR2VuZXJpY0pheGJfMl8yX1BsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuamF4YjIxLkdlbmVyaWNKYXhiXzJfMV9OYXZpZ2F0b3JVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5uYXZpZ2F0b3IuSmF4Yk5hdmlnYXRvclVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF4Yl8yXzJfUGxhdGZvcm1VaQotCQlpbXBsZW1lbnRzIEpheGJQbGF0Zm9ybVVpIHsKLQkKLQlwdWJsaWMgSmF4Yk5hdmlnYXRvclVpIGdldE5hdmlnYXRvclVpKCkgewotCQlyZXR1cm4gR2VuZXJpY0pheGJfMl8xX05hdmlnYXRvclVpLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSmF4Yk5hdmlnYXRvckFjdGlvblByb3ZpZGVyLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL25hdmlnYXRvci9KYXhiTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ZDBkOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL25hdmlnYXRvci9KYXhiTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmFjdGlvbnMuT3BlbkpheGJSZXNvdXJjZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLkNvbW1vbkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQWN0aW9uRXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbk1lbnVDb25zdGFudHM7Ci0KLQotcHVibGljIGNsYXNzIEpheGJOYXZpZ2F0b3JBY3Rpb25Qcm92aWRlcgotCQlleHRlbmRzIENvbW1vbkFjdGlvblByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIE9wZW5KYXhiUmVzb3VyY2VBY3Rpb24gb3BlbkFjdGlvbjsKLQkKLQkKLQlwdWJsaWMgSmF4Yk5hdmlnYXRvckFjdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25BY3Rpb25FeHRlbnNpb25TaXRlIGFDb25maWcpIHsKLQkJdGhpcy5vcGVuQWN0aW9uID0gbmV3IE9wZW5KYXhiUmVzb3VyY2VBY3Rpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dChBY3Rpb25Db250ZXh0IGFDb250ZXh0KSB7Ci0JCWlmIChhQ29udGV4dCAhPSBudWxsICYmIGFDb250ZXh0LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl0aGlzLm9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQl9Ci0JCQotCQlzdXBlci5zZXRDb250ZXh0KGFDb250ZXh0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgdGhlQWN0aW9uQmFycykgewotCQlpZiAodGhpcy5vcGVuQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQl0aGVBY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSUNvbW1vbkFjdGlvbkNvbnN0YW50cy5PUEVOLCB0aGlzLm9wZW5BY3Rpb24pOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgYU1lbnUpIHsKLQkJaWYgKGdldENvbnRleHQoKSA9PSBudWxsIHx8IGdldENvbnRleHQoKS5nZXRTZWxlY3Rpb24oKS5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHRoaXMub3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJYU1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgdGhpcy5vcGVuQWN0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pheGJOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSmF4Yk5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODQ0YjIuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSmF4Yk5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci0KLQotcHVibGljIGNsYXNzIEpheGJOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlcgotCQlleHRlbmRzIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgewotCQotCXB1YmxpYyBKYXhiTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKG5ldyBKYXhiTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCksIG5ldyBKYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pheGJOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pheGJOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzOTIyZS4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL25hdmlnYXRvci9KYXhiTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50UHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2YgbmF2aWdhdG9yIGNvbnRlbnQgcHJvdmlkZXIgZGVsZWdhdGVzIHRvIHRoZSBwbGF0Zm9ybSBVSQotICogKHNlZSB0aGUgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuamF4YlBsYXRmb3JtVWlzIGV4dGVuc2lvbiBwb2ludCkgZm9yIG5hdmlnYXRvciBjb250ZW50LgotICogCi0gKiBJZiB0aGVyZSBpcyBhIHBsYXRmb3JtIFVJIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCwgdGhpcyBjb250ZW50IHByb3ZpZGVyIHdpbGwKLSAqIHByb3ZpZGUgYSByb290ICJKQVhCIENvbnRlbnQiIG5vZGUgKGNoaWxkIG9mIHRoZSBwcm9qZWN0KSwgb3RoZXJ3aXNlIHRoZXJlCi0gKiB3aWxsIGJlIG5vIGNvbnRlbnQuICBGb3IgY2hpbGRyZW4gb2YgdGhlICJKQVhCIENvbnRlbnQiIG5vZGUgKG9yIGZvciBhbnkgb3RoZXIKLSAqIHN1Yi1ub2RlKSwgdGhpcyBwcm92aWRlciB3aWxsIGRlbGVnYXRlIHRvIHRoZSBjb250ZW50IHByb3ZpZGVyIHJldHVybmVkIGJ5IHRoZSAKLSAqIHBsYXRmb3JtIFVJIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSmF4Yk5hdmlnYXRvckNvbnRlbnRQcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb21tb25Db250ZW50UHJvdmlkZXIgewotCQotCXByaXZhdGUgSmF4Yk5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGRlbGVnYXRlOwotCQotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGpheGJQcm9qZWN0TGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcjsKLQkKLQkKLQlwdWJsaWMgSmF4Yk5hdmlnYXRvckNvbnRlbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qYXhiUHJvamVjdExpc3RlbmVyID0gdGhpcy5idWlsZEpheGJQcm9qZWN0TGlzdGVuZXIoKTsKLQkJSnB0SmF4YkNvcmVQbHVnaW4uZ2V0UHJvamVjdE1hbmFnZXIoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSmF4YlByb2plY3RNYW5hZ2VyLkpBWEJfUFJPSkVDVFNfQ09MTEVDVElPTiwgdGhpcy5qYXhiUHJvamVjdExpc3RlbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZEpheGJQcm9qZWN0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSmF4YlByb2plY3RMaXN0ZW5lcigpOwotCX0KLQotCXB1YmxpYyBKYXhiTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlbGVnYXRlOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJSnB0SmF4YkNvcmVQbHVnaW4uZ2V0UHJvamVjdE1hbmFnZXIoKS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSmF4YlByb2plY3RNYW5hZ2VyLkpBWEJfUFJPSkVDVFNfQ09MTEVDVElPTiwgdGhpcy5qYXhiUHJvamVjdExpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJdGhpcy5kZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmICh0aGlzLmRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXRoaXMuZGVsZWdhdGUuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJfQotCQl0aGlzLnZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXI7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICh0aGlzLmRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmRlbGVnYXRlLmdldFBhcmVudChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBlbGVtZW50KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUpheGJQcm9qZWN0IGpheGJQcm9qZWN0ID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGpheGJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVzYyA9IGpheGJQcm9qZWN0LmdldFBsYXRmb3JtKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJSmF4YlBsYXRmb3JtVWkgcGxhdGZvcm1VaSA9IAotCQkJCQkJCUpwdEpheGJVaVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1VaU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm1VaShkZXNjKTsKLQkJCQkJCi0JCQkJCXJldHVybiBwbGF0Zm9ybVVpICE9IG51bGw7Ci0JCQkJfQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHRoaXMuZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBwYXJlbnRFbGVtZW50KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUpheGJQcm9qZWN0IGpheGJQcm9qZWN0ID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlByb2plY3QocHJvamVjdCk7Ci0JCQkJaWYgKGpheGJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVzYyA9IGpheGJQcm9qZWN0LmdldFBsYXRmb3JtKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJSmF4YlBsYXRmb3JtVWkgcGxhdGZvcm1VaSA9IAotCQkJCQkJCUpwdEpheGJVaVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1VaU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm1VaShkZXNjKTsKLQkJCQkJCi0JCQkJCWlmIChwbGF0Zm9ybVVpICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgT2JqZWN0W10ge2pheGJQcm9qZWN0LmdldENvbnRleHRSb290KCl9OwotCQkJCQl9Ci0JCQkJfQkKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHRoaXMuZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0Q2hpbGRyZW4ocGFyZW50RWxlbWVudCk7Ci0JCX0KLQkJCQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJTWVtZW50b0F3YXJlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUNvbW1vbkNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZSBjb25maWcpIHsKLQkJaWYgKHRoaXMuZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJSmF4Yk5hdmlnYXRvckxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IChKYXhiTmF2aWdhdG9yTGFiZWxQcm92aWRlcikgY29uZmlnLmdldEV4dGVuc2lvbigpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgbGFiZWxQcm92aWRlci5nZXREZWxlZ2F0ZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLmRlbGVnYXRlID0gbGFiZWxQcm92aWRlci5nZXREZWxlZ2F0ZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5kZWxlZ2F0ZSA9IG5ldyBKYXhiTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIoKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBKYXhiUHJvamVjdExpc3RlbmVyCi0JCWltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCXRoaXMucmVmcmVzaFZpZXdlcihudWxsKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJdGhpcy5yZWZyZXNoVmlld2VyKG51bGwpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlmb3IgKE9iamVjdCBpdGVtIDogZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJCXRoaXMucmVmcmVzaFZpZXdlcigoKEpheGJQcm9qZWN0KSBpdGVtKS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQl9Ci0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQkJdGhpcy5yZWZyZXNoVmlld2VyKCgoSmF4YlByb2plY3QpIGl0ZW0pLmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VyKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAKLQkJCQkJJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsIAotCQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkvLyBVc2luZyBqb2IgaGVyZSBzbyB0aGF0IHByb2plY3QgbW9kZWwgdXBkYXRlICh3aGljaCBhbHNvIHVzZXMKLQkJCQkvLyAgYSBqb2IpIHdpbGwgY29tcGxldGUgZmlyc3QKLQkJCQlKb2IgcmVmcmVzaEpvYiA9IG5ldyBKb2IoIlJlZnJlc2ggdmlld2VyIikgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJLy8gVXNpbmcgcnVubmFibGUgaGVyZSBzbyB0aGF0IHJlZnJlc2ggd2lsbCBnbyBvbiBjb3JyZWN0IHRocmVhZAotCQkJCQkJdmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJCXZpZXdlci5yZWZyZXNoKHByb2plY3QpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJcmVmcmVzaEpvYi5zZXRSdWxlKHByb2plY3QpOwotCQkJCX0KLQkJCQlyZWZyZXNoSm9iLnNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL25hdmlnYXRvci9KYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL25hdmlnYXRvci9KYXhiTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlM2IyY2IuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpOwotCi1wdWJsaWMgY2xhc3MgSmF4Yk5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogRXhhY3RseSAqb25lKiBvZiB0aGVzZSBmYWN0b3JpZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCB2aWV3IHRoYXQgdXRpbGl6ZXMgaXQuICAKLQkgKiBUaGVyZWZvcmUsIGFzIHdlIGRlbGVnYXRlIHRvIHRoZSBwbGF0Zm9ybSBVSSBmb3IgZWFjaCBwcm9qZWN0LCB3ZSBzaG91bGQgCi0JICogbWFpbnRhaW4gdGhlIHNhbWUgbXVsdGlwbGljaXR5LiAgVGhhdCBpcywgaWYgdGhlcmUgaXMgYSBkZWxlZ2F0ZSBmb3IgZWFjaCAKLQkgKiBwbGF0Zm9ybSBVSSwgd2Ugc2hvdWxkIG1haW50YWluICpvbmUqIGRlbGVnYXRlIGZvciBlYWNoIHZpZXcuCi0JICogCi0JICogS2V5OiBwbGF0Zm9ybSBkZXNjcmlwdGlvbiwgIFZhbHVlOiBkZWxlZ2F0ZSBjb250ZW50IHByb3ZpZGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcDxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiwgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5PiBkZWxlZ2F0ZXM7Ci0JCi0JCi0JcHVibGljIEpheGJOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVzID0gbmV3IEhhc2hNYXA8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24sIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeT4oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZShpdGVtKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0RGVsZWdhdGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCEgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpheGJDb250ZXh0Tm9kZSBjb250ZXh0Tm9kZSA9IChKYXhiQ29udGV4dE5vZGUpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihKYXhiQ29udGV4dE5vZGUuY2xhc3MpOwotCQkKLQkJaWYgKGNvbnRleHROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybURlc2MgPSBjb250ZXh0Tm9kZS5nZXRKYXhiUHJvamVjdCgpLmdldFBsYXRmb3JtKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJaWYgKGRlbGVnYXRlcy5jb250YWluc0tleShwbGF0Zm9ybURlc2MpKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGVzLmdldChwbGF0Zm9ybURlc2MpOwotCQl9Ci0JCUpheGJQbGF0Zm9ybVVpIHBsYXRmb3JtVWkgPSBKcHRKYXhiVWlQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtVWlNYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtVWkocGxhdGZvcm1EZXNjKTsKLQkJSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGRlbGVnYXRlID0gCi0JCQkJKHBsYXRmb3JtVWkgPT0gbnVsbCkgPyBudWxsIDogcGxhdGZvcm1VaS5nZXROYXZpZ2F0b3JVaSgpLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCQlkZWxlZ2F0ZXMucHV0KHBsYXRmb3JtRGVzYywgZGVsZWdhdGUpOwotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSmF4Yk5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pheGJOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWE3YmEuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSmF4Yk5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25MYWJlbFByb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIG5hdmlnYXRvciBsYWJlbCBwcm92aWRlciBkZWxlZ2F0ZXMgdG8gdGhlIHBsYXRmb3JtIFVJCi0gKiAoc2VlIHRoZSBvcmcuZWNsaXBzZS5qcHQudWkuanBhUGxhdGZvcm0gZXh0ZW5zaW9uIHBvaW50KSBmb3IgbmF2aWdhdG9yIGxhYmVscy4KLSAqIAotICogVGhpcyBsYWJlbCBwcm92aWRlciBwcm92aWRlcyBhIGxhYmVsIGZvciB0aGUgcm9vdCAiSlBBIENvbnRlbnQiIG5vZGUgcHJvdmlkZWQKLSAqIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyIChzZWUge0BsaW5rIEpheGJOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXJ9KSBhbmQgZGVsZWdhdGVzCi0gKiB0byB0aGUgbGFiZWwgcHJvdmlkZXIgcmV0dXJuZWQgYnkgdGhlIHBsYXRmb3JtIFVJIGltcGxlbWVudGF0aW9uIGZvciBsYWJlbHMKLSAqIGZvciBjaGlsZHJlbiBvZiB0aGUgIkpQQSBDb250ZW50IiBub2RlIChvciBmb3IgYW55IG90aGVyIHN1Yi1ub2RlKS4KLSAqLwotcHVibGljIGNsYXNzIEpheGJOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyCi0JCWV4dGVuZHMgTGFiZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElDb21tb25MYWJlbFByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIEpheGJOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBkZWxlZ2F0ZTsKLQkKLQkKLQlwdWJsaWMgSmF4Yk5hdmlnYXRvckxhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXhiTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIgZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJQmFzZUxhYmVsUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuaXNMYWJlbFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmlzTGFiZWxQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5kaXNwb3NlKCk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElMYWJlbFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuZ2V0VGV4dChlbGVtZW50KTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSURlc2NyaXB0aW9uUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElNZW1lbnRvQXdhcmUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgc2F2ZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVzdG9yZVN0YXRlKElNZW1lbnRvIG1lbWVudG8pIHsKLQkJLy8gbm8gb3AKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJQ29tbW9uTGFiZWxQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkNvbnRlbnRFeHRlbnNpb25TaXRlIGNvbmZpZykgewotCQlpZiAoZGVsZWdhdGUgPT0gbnVsbCkgewotCQkJSmF4Yk5hdmlnYXRvckNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoSmF4Yk5hdmlnYXRvckNvbnRlbnRQcm92aWRlcikgY29uZmlnLmdldEV4dGVuc2lvbigpLmdldENvbnRlbnRQcm92aWRlcigpOwotCQkJaWYgKGNvbnRlbnRQcm92aWRlciAhPSBudWxsICYmIGNvbnRlbnRQcm92aWRlci5nZXREZWxlZ2F0ZSgpICE9IG51bGwpIHsKLQkJCQlkZWxlZ2F0ZSA9IGNvbnRlbnRQcm92aWRlci5nZXREZWxlZ2F0ZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGVsZWdhdGUgPSBuZXcgSmF4Yk5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL25hdmlnYXRvci9KYXhiTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL25hdmlnYXRvci9KYXhiTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2N2ZiYjAuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSmF4Yk5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLnBsYXRmb3JtLkpheGJQbGF0Zm9ybVVpOwotCi1wdWJsaWMgY2xhc3MgSmF4Yk5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSB7Ci0JCi0JLyoqCi0JICogRXhhY3RseSAqb25lKiBvZiB0aGVzZSBmYWN0b3JpZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCB2aWV3IHRoYXQgdXRpbGl6ZXMgaXQuICAKLQkgKiBUaGVyZWZvcmUsIGFzIHdlIGRlbGVnYXRlIHRvIHRoZSBwbGF0Zm9ybSBVSSBmb3IgZWFjaCBwcm9qZWN0LCB3ZSBzaG91bGQgCi0JICogbWFpbnRhaW4gdGhlIHNhbWUgbXVsdGlwbGljaXR5LiAgVGhhdCBpcywgaWYgdGhlcmUgaXMgYSBkZWxlZ2F0ZSBmb3IgZWFjaCAKLQkgKiBwbGF0Zm9ybSBVSSwgd2Ugc2hvdWxkIG1haW50YWluICpvbmUqIGRlbGVnYXRlIGZvciBlYWNoIHZpZXcuCi0JICogCi0JICogS2V5OiBwbGF0Zm9ybSBpZCwgIFZhbHVlOiBkZWxlZ2F0ZSBjb250ZW50IHByb3ZpZGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIE1hcDxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiwgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5PiBkZWxlZ2F0ZXM7Ci0JCi0JCi0JcHVibGljIEpheGJOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVzID0gbmV3IEhhc2hNYXA8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24sIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeT4oKTsKLQl9Ci0JCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IGdldERlbGVnYXRlKGl0ZW0pOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXByaXZhdGUgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldERlbGVnYXRlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghIChlbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKYXhiQ29udGV4dE5vZGUgY29udGV4dE5vZGUgPSAoSmF4YkNvbnRleHROb2RlKSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSmF4YkNvbnRleHROb2RlLmNsYXNzKTsKLQkJCi0JCWlmIChjb250ZXh0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm1EZXNjID0gY29udGV4dE5vZGUuZ2V0SmF4YlByb2plY3QoKS5nZXRQbGF0Zm9ybSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCWlmIChkZWxlZ2F0ZXMuY29udGFpbnNLZXkocGxhdGZvcm1EZXNjKSkgewotCQkJcmV0dXJuIGRlbGVnYXRlcy5nZXQocGxhdGZvcm1EZXNjKTsKLQkJfQotCQlKYXhiUGxhdGZvcm1VaSBwbGF0Zm9ybVVpID0gSnB0SmF4YlVpUGx1Z2luLmdldEpheGJQbGF0Zm9ybVVpTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybVVpKHBsYXRmb3JtRGVzYyk7Ci0JCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IAotCQkJCShwbGF0Zm9ybVVpID09IG51bGwpID8gbnVsbCA6IHBsYXRmb3JtVWkuZ2V0TmF2aWdhdG9yVWkoKS5nZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQkJZGVsZWdhdGVzLnB1dChwbGF0Zm9ybURlc2MsIGRlbGVnYXRlKTsKLQkJcmV0dXJuIGRlbGVnYXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtVWlDb25maWcuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtVWlDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkOTA1ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3BsYXRmb3JtL0pheGJQbGF0Zm9ybVVpQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaTsKLQotcHVibGljIGNsYXNzIEpheGJQbGF0Zm9ybVVpQ29uZmlnIHsKLQkKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybTsKLQlwcml2YXRlIFN0cmluZyBjbGFzc05hbWU7Ci0JcHJpdmF0ZSBKYXhiUGxhdGZvcm1VaSBwbGF0Zm9ybVVpOwotCQotCQotCUpheGJQbGF0Zm9ybVVpQ29uZmlnKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0JCi0Jdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gdGhpcy5wbHVnaW5JZDsKLQl9Ci0JCi0Jdm9pZCBzZXRQbHVnaW5JZChTdHJpbmcgcGx1Z2luSWQpIHsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SmF4YlBsYXRmb3JtKCkgewotCQlyZXR1cm4gdGhpcy5qYXhiUGxhdGZvcm07Ci0JfQotCQotCXZvaWQgc2V0SmF4YlBsYXRmb3JtKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybSkgewotCQl0aGlzLmpheGJQbGF0Zm9ybSA9IGpheGJQbGF0Zm9ybTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzTmFtZTsKLQl9Ci0JCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQl9Ci0JCi0JcHVibGljIEpheGJQbGF0Zm9ybVVpIGdldFBsYXRmb3JtVWkoKSB7Ci0JCWlmICh0aGlzLnBsYXRmb3JtVWkgPT0gbnVsbCkgewotCQkJdGhpcy5wbGF0Zm9ybVVpID0gWFBvaW50VG9vbHMuaW5zdGFudGlhdGUoCi0JCQkJCXRoaXMucGx1Z2luSWQsIEpheGJQbGF0Zm9ybVVpTWFuYWdlckltcGwuUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwKLQkJCQkJdGhpcy5jbGFzc05hbWUsIEpheGJQbGF0Zm9ybVVpLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVVpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSmF4YlBsYXRmb3JtVWlNYW5hZ2VySW1wbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1VaU1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhODJiYzkuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1VaU1hbmFnZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLlhQb2ludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuS2V5ZWRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1VaU1hbmFnZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXhiUGxhdGZvcm1VaU1hbmFnZXJJbXBsCi0JCWltcGxlbWVudHMgSmF4YlBsYXRmb3JtVWlNYW5hZ2VyIHsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJqYXhiUGxhdGZvcm1VaXMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lEID0gSnB0SmF4YlVpUGx1Z2luLlBMVUdJTl9JRF8gKyBFWFRFTlNJT05fUE9JTlRfSUQ7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX1VJX0VMRU1FTlQgPSAiamF4YlBsYXRmb3JtVWkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJVVEUgPSAiaWQiOyAvLyROT04tTkxTLTEkCQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fQVRUUklCVVRFID0gImpheGJQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQJCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19BVFRSSUJVVEUgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCQotCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpheGJQbGF0Zm9ybVVpTWFuYWdlckltcGwgSU5TVEFOQ0UgPSBuZXcgSmF4YlBsYXRmb3JtVWlNYW5hZ2VySW1wbCgpOwotCQotCQotCXB1YmxpYyBzdGF0aWMgSmF4YlBsYXRmb3JtVWlNYW5hZ2VySW1wbCBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQlwcml2YXRlIEtleWVkU2V0PFN0cmluZywgSmF4YlBsYXRmb3JtVWlDb25maWc+IHBsYXRmb3JtVWlDb25maWdzOwotCXByaXZhdGUgS2V5ZWRTZXQ8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24sIEpheGJQbGF0Zm9ybVVpQ29uZmlnPiBwbGF0Zm9ybVRvVWlDb25maWdzOwotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCQotCXByaXZhdGUgSmF4YlBsYXRmb3JtVWlNYW5hZ2VySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wbGF0Zm9ybVVpQ29uZmlncyA9IG5ldyBLZXllZFNldDxTdHJpbmcsIEpheGJQbGF0Zm9ybVVpQ29uZmlnPigpOwotCQl0aGlzLnBsYXRmb3JtVG9VaUNvbmZpZ3MgPSBuZXcgS2V5ZWRTZXQ8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24sIEpheGJQbGF0Zm9ybVVpQ29uZmlnPigpOwotCQlyZWFkRXh0ZW5zaW9ucygpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVhZEV4dGVuc2lvbnMoKSB7Ci0JCWZpbmFsIElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQotCQlmaW5hbCBJRXh0ZW5zaW9uUG9pbnQgeHBvaW50IAotCQkJCT0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoSnB0SmF4YlVpUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJCi0JCWlmICh4cG9pbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gcGxhdGZvcm1VaUNvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSUV4dGVuc2lvbiBleHRlbnNpb24gOiB4cG9pbnQuZ2V0RXh0ZW5zaW9ucygpKSB7Ci0JCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50IDogZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKSB7Ci0JCQkJaWYgKGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhQTEFURk9STV9VSV9FTEVNRU5UKSkgewotCQkJCQlwbGF0Zm9ybVVpQ29uZmlncy5hZGQoY29uZmlnRWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50OiBwbGF0Zm9ybVVpQ29uZmlncykgewotCQkJcmVhZFBsYXRmb3JtVWlFeHRlbnNpb24oY29uZmlnRWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRQbGF0Zm9ybVVpRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlKYXhiUGxhdGZvcm1VaUNvbmZpZyBwbGF0Zm9ybVVpQ29uZmlnID0gbmV3IEpheGJQbGF0Zm9ybVVpQ29uZmlnKCk7Ci0JCQkKLQkJCS8vIHBsdWctaW4gaWQKLQkJCXBsYXRmb3JtVWlDb25maWcuc2V0UGx1Z2luSWQoZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKSk7Ci0JCQkKLQkJCS8vIGlkCi0JCQlwbGF0Zm9ybVVpQ29uZmlnLnNldElkKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBJRF9BVFRSSUJVVEUpKTsKLQkJCQotCQkJaWYgKHRoaXMucGxhdGZvcm1VaUNvbmZpZ3MuY29udGFpbnNLZXkocGxhdGZvcm1VaUNvbmZpZy5nZXRJZCgpKSkgewotCQkJCWxvZ0R1cGxpY2F0ZUV4dGVuc2lvbihRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCBJRF9BVFRSSUJVVEUsIHBsYXRmb3JtVWlDb25maWcuZ2V0SWQoKSk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQkvLyBqYXhiIHBsYXRmb3JtIGlkCi0JCQlTdHJpbmcgamF4YlBsYXRmb3JtSWQgPSBmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgUExBVEZPUk1fQVRUUklCVVRFKTsKLQkJCUpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGpheGJQbGF0Zm9ybSA9IAotCQkJCQlKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SmF4YlBsYXRmb3JtKGpheGJQbGF0Zm9ybUlkKTsKLQkJCQotCQkJaWYgKGpheGJQbGF0Zm9ybSA9PSBudWxsKSB7Ci0JCQkJbG9nSW52YWxpZFZhbHVlKGVsZW1lbnQsIFBMQVRGT1JNX0FUVFJJQlVURSwgamF4YlBsYXRmb3JtSWQpOwotCQkJfQotCQkJCi0JCQlpZiAodGhpcy5wbGF0Zm9ybVRvVWlDb25maWdzLmNvbnRhaW5zS2V5KGpheGJQbGF0Zm9ybSkpIHsKLQkJCQlsb2dEdXBsaWNhdGVFeHRlbnNpb24oUVVBTElGSUVEX0VYVEVOU0lPTl9QT0lOVF9JRCwgUExBVEZPUk1fQVRUUklCVVRFLCBqYXhiUGxhdGZvcm1JZCk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQlwbGF0Zm9ybVVpQ29uZmlnLnNldEpheGJQbGF0Zm9ybShqYXhiUGxhdGZvcm0pOwotCQkJCi0JCQkvLyBjbGFzcwotCQkJcGxhdGZvcm1VaUNvbmZpZy5zZXRDbGFzc05hbWUoZmluZFJlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnQsIENMQVNTX0FUVFJJQlVURSkpOwotCQkJCi0JCQl0aGlzLnBsYXRmb3JtVWlDb25maWdzLmFkZEl0ZW0ocGxhdGZvcm1VaUNvbmZpZy5nZXRJZCgpLCBwbGF0Zm9ybVVpQ29uZmlnKTsKLQkJCXRoaXMucGxhdGZvcm1Ub1VpQ29uZmlncy5hZGRJdGVtKGpheGJQbGF0Zm9ybSwgcGxhdGZvcm1VaUNvbmZpZyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotCQotCXB1YmxpYyBKYXhiUGxhdGZvcm1VaSBnZXRKYXhiUGxhdGZvcm1VaShKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybURlc2MpIHsKLQkJSmF4YlBsYXRmb3JtVWlDb25maWcgY29uZmlnID0gdGhpcy5wbGF0Zm9ybVRvVWlDb25maWdzLmdldEl0ZW0ocGxhdGZvcm1EZXNjKTsKLQkJcmV0dXJuIChjb25maWcgPT0gbnVsbCkgPyBudWxsIDogY29uZmlnLmdldFBsYXRmb3JtVWkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSmF4YlByb2plY3RNb2RlbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pheGJQcm9qZWN0TW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmYjY3MC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSmF4YlByb2plY3RNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBUcmVhdCB0aGUgSkFYQiBwcm9qZWN0IGFzIGFuICJhc3BlY3QiIG9mIHRoZSBFY2xpcHNlIHByb2plY3QgKElQcm9qZWN0KTsKLSAqIGJ1dCB0aGUgSkFYQiBwcm9qZWN0IGlzIHN0b3JlZCBpbiB0aGUgSkFYQiBtb2RlbCwgbm90IHRoZSBFY2xpcHNlIHByb2plY3QKLSAqIGl0c2VsZi4uLi4KLSAqIFdlIGFsc28gbmVlZCB0byBsaXN0ZW4gZm9yIHRoZSBKQVhCIHByb2plY3QgdG8gYmUgcmVidWlsdCBpZiB0aGUgdXNlcgotICogY2hhbmdlcyB0aGUgRWNsaXBzZSBwcm9qZWN0J3MgSkFYQiBwbGF0Zm9ybSAod2hpY2ggaXMgc3RvcmVkIGluIHRoZQotICogRWNsaXBzZSBwcm9qZWN0J3MgcHJlZmVyZW5jZXMpLgotICovCi1jbGFzcyBKYXhiUHJvamVjdE1vZGVsCi0JCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxJUHJvamVjdCwgSmF4YlByb2plY3Q+IHsKLQkKLQkvKioKLQkgKiBUaGUgSkFYQiBwcm9qZWN0IG1heSBhbHNvIGNoYW5nZSB2aWEgYW5vdGhlciBwYWdlIChub3RhYmx5LCB0aGUgcHJvamVjdCBmYWNldHMgcGFnZSkuCi0JICogSW4gdGhhdCBjYXNlLCB0aGUgcHJlZmVyZW5jZSBjaGFuZ2Ugb2NjdXJzIGJlZm9yZSB3ZSBhY3R1YWxseSBoYXZlIGFub3RoZXIgcHJvamVjdCwKLQkgKiBzbyB3ZSBtdXN0IGxpc3RlbiB0byB0aGUgcHJvamVjdHMgbWFuYWdlcgotCSAqLwotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHByb2plY3RNYW5hZ2VyTGlzdGVuZXI7Ci0JCi0JCi0JSmF4YlByb2plY3RNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SVByb2plY3Q+IHByb2plY3RNb2RlbCkgewotCQlzdXBlcihwcm9qZWN0TW9kZWwpOwotCQl0aGlzLnByb2plY3RNYW5hZ2VyTGlzdGVuZXIgPSBidWlsZFByb2plY3RNYW5hZ2VyTGlzdGVuZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9qZWN0TWFuYWdlckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCkgewotCQkJLy8gd2UgYXJlIG9ubHkgbG9va2luZyBmb3IgdGhlIHByb2plY3QgcmVidWlsZCAqYWRkKiBldmVudCBoZXJlIHNvIHdlIGNhbgotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBwbGF0Zm9ybSBoYXMgY2hhbmdlZC4KLQkJCS8vIHRoZSBvdGhlciBldmVudHMgYXJlIHVuaW1wb3J0YW50IGluIHRoaXMgY2FzZQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCXBsYXRmb3JtQ2hhbmdlZCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQl2b2lkIHBsYXRmb3JtQ2hhbmdlZCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0JCUpwdEpheGJDb3JlUGx1Z2luLmdldFByb2plY3RNYW5hZ2VyKCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKAotCQkJCQlKYXhiUHJvamVjdE1hbmFnZXIuSkFYQl9QUk9KRUNUU19DT0xMRUNUSU9OLCAKLQkJCQkJdGhpcy5wcm9qZWN0TWFuYWdlckxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCUpwdEpheGJDb3JlUGx1Z2luLmdldFByb2plY3RNYW5hZ2VyKCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKAotCQkJCQlKYXhiUHJvamVjdE1hbmFnZXIuSkFYQl9QUk9KRUNUU19DT0xMRUNUSU9OLCAKLQkJCQkJdGhpcy5wcm9qZWN0TWFuYWdlckxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpheGJQcm9qZWN0IGJ1aWxkVmFsdWVfKCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlByb2plY3QodGhpcy5zdWJqZWN0KTsKLQl9CQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSmF4YlByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pheGJQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllYWRiOC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSmF4YlByb2plY3RQcm9wZXJ0aWVzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC51aS5saWJwcm92LkxpYnJhcnlQcm92aWRlckZyYW1ld29ya1VpLmNyZWF0ZUluc3RhbGxMaWJyYXJ5UGFuZWw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LklDVVN0cmluZ0NvbGxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwucHJvcGVydGllcy5KcHRQcm9qZWN0UHJvcGVydGllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5saWJwcm92LkpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBXYXkgbW9yZSBjb21wbGljYXRlZCBVSSB0aGFuIHlvdSB3b3VsZCB0aGluay4uLi4KLSAqLwotcHVibGljIGNsYXNzIEpheGJQcm9qZWN0UHJvcGVydGllc1BhZ2UKLQkJZXh0ZW5kcyBKcHRQcm9qZWN0UHJvcGVydGllc1BhZ2UgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSUQgPSAib3JnLmVjbGlwc2UuanB0LmpheGIudWkuamF4YlByb2plY3RQcm9wZXJ0aWVzUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKYXhiUHJvamVjdD4gamF4YlByb2plY3RNb2RlbDsKLQkKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+IHBsYXRmb3JtTW9kZWw7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHBsYXRmb3JtTGlzdGVuZXI7Ci0JCi0JLyogcHJpdmF0ZSAqLyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxTdHJpbmc+IFNUUklOR19DT01QQVJBVE9SID0gbmV3IElDVVN0cmluZ0NvbGxhdG9yKCk7Ci0JCi0JLy8gKioqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSmF4YlByb2plY3RQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYnVpbGRNb2RlbHMoKSB7Ci0JCXRoaXMuamF4YlByb2plY3RNb2RlbCA9IG5ldyBKYXhiUHJvamVjdE1vZGVsKHRoaXMucHJvamVjdE1vZGVsKTsKLQkJCi0JCXRoaXMucGxhdGZvcm1Nb2RlbCA9IHRoaXMuYnVpbGRQbGF0Zm9ybU1vZGVsKCk7Ci0JCXRoaXMucGxhdGZvcm1MaXN0ZW5lciA9IHRoaXMuYnVpbGRQbGF0Zm9ybUxpc3RlbmVyKCk7Ci0JfQotCQotCQotCS8vICoqKioqIHBsYXRmb3JtIElEIG1vZGVsCi0JCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiBidWlsZFBsYXRmb3JtTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4oCi0JCQkJbmV3IFBsYXRmb3JtTW9kZWwodGhpcy5qYXhiUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUGxhdGZvcm1MaXN0ZW5lcigpewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUpheGJQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5wbGF0Zm9ybUNoYW5nZWQoKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0Jdm9pZCBwbGF0Zm9ybUNoYW5nZWQoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gbmV3UGxhdGZvcm0pIHsKLQkJaWYgKCAhIHRoaXMuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJLy8gaGFuZGxlIG51bGwsIGluIHRoZSBjYXNlIHRoZSBqcGEgZmFjZXQgaXMgY2hhbmdlZCB2aWEgdGhlIGZhY2V0cyBwYWdlLAotCQkJLy8gdGhlIGxpYnJhcnkgaW5zdGFsbCBkZWxlZ2F0ZSBpcyB0ZW1wb3JhcmlseSBudWxsCi0JCQlhZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBMaWJyYXJ5RmFjZXRQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRGYWNldGVkUHJvamVjdCgpLmdldEluc3RhbGxlZFZlcnNpb24oSmF4YkZhY2V0LkZBQ0VUKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgY3JlYXRlTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShJRmFjZXRlZFByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYpIHsKLQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQgPSBuZXcgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShwcm9qZWN0LCBmdik7Ci0JCWxpZC5hZGRMaXN0ZW5lcihidWlsZExpYnJhcnlQcm92aWRlckxpc3RlbmVyKCkpOwotCQlyZXR1cm4gbGlkOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCkgewotCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IHRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQlpZiAobGlkICE9IG51bGwpIHsKLQkJCUxpc3Q8SmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc+IGpheGJDb25maWdzIAotCQkJCQk9IG5ldyBBcnJheUxpc3Q8SmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc+KCk7Ci0JCQkvLyBhZGQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvbmUgZmlyc3QKLQkJCUpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGN1cnJlbnRKYXhiQ29uZmlnID0gbnVsbDsKLQkJCUxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZyBjb25maWcgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKCk7Ci0JCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIHsKLQkJCQljdXJyZW50SmF4YkNvbmZpZyA9IChKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQkJCWpheGJDb25maWdzLmFkZChjdXJyZW50SmF4YkNvbmZpZyk7Ci0JCQl9Ci0JCQlmb3IgKElMaWJyYXJ5UHJvdmlkZXIgbHAgOiBsaWQuZ2V0TGlicmFyeVByb3ZpZGVycygpKSB7Ci0JCQkJY29uZmlnID0gbGlkLmdldExpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZyhscCk7Ci0JCQkJaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEpheGJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCQkJCQkmJiAhIGNvbmZpZy5lcXVhbHMoY3VycmVudEpheGJDb25maWcpKSB7Ci0JCQkJCWpheGJDb25maWdzLmFkZCgoSmF4YkxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChKYXhiTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqYXhiQ29uZmlnIDogamF4YkNvbmZpZ3MpIHsKLQkJCQlqYXhiQ29uZmlnLnNldEpheGJQbGF0Zm9ybSh0aGlzLnBsYXRmb3JtTW9kZWwuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBwYWdlICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVXaWRnZXRzKENvbXBvc2l0ZSBwYXJlbnQpIHsJCi0JCWJ1aWxkUGxhdGZvcm1Hcm91cChwYXJlbnQpOwotCQkKLQkJQ29udHJvbCBsaWJyYXJ5UHJvdmlkZXJDb21wb3NpdGUgPSBjcmVhdGVJbnN0YWxsTGlicmFyeVBhbmVsKAotCQkJCXBhcmVudCwgCi0JCQkJZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLCAKLQkJCQlKcHRKYXhiVWlNZXNzYWdlcy5KYXhiRmFjZXRXaXphcmRQYWdlX2pheGJJbXBsZW1lbnRhdGlvbkxhYmVsKTsKLQkJCi0gCQlsaWJyYXJ5UHJvdmlkZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gCQkKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSmF4YkhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJc3VwZXIuZW5nYWdlTGlzdGVuZXJzKCk7Ci0JCXRoaXMucGxhdGZvcm1Nb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wbGF0Zm9ybUxpc3RlbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzZW5nYWdlTGlzdGVuZXJzKCkgewotCQl0aGlzLnBsYXRmb3JtTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMucGxhdGZvcm1MaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc2VuZ2FnZUxpc3RlbmVycygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHBsYXRmb3JtIGdyb3VwICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRQbGF0Zm9ybUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuSmF4YkZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUNvbWJvIHBsYXRmb3JtRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOwotCQlTV1RUb29scy5iaW5kKAotCQkJCWJ1aWxkUGxhdGZvcm1DaG9pY2VzTW9kZWwoKSwKLQkJCQl0aGlzLnBsYXRmb3JtTW9kZWwsCi0JCQkJcGxhdGZvcm1Ecm9wRG93biwKLQkJCQlKQVhCX1BMQVRGT1JNX0xBQkVMX0NPTlZFUlRFUik7Ci0JCQotCQlidWlsZEZhY2V0c1BhZ2VMaW5rKGdyb3VwLCBKcHRKYXhiVWlNZXNzYWdlcy5KYXhiRmFjZXRXaXphcmRQYWdlX2ZhY2V0c1BhZ2VMaW5rKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIHRoZSBwcm9qZWN0J3MgSkFYQiBwbGF0Zm9ybSBpZiBpdCBpcyBub3Qgb24gdGhlIGxpc3Qgb2YgdmFsaWQKLQkgKiBwbGF0Zm9ybXMuCi0JICogPHA+Ci0JICogVGhpcyBpcyBwcm9iYWJseSBvbmx5IHVzZWZ1bCBpZiB0aGUgcHJvamVjdCBpcyBjb3JydXB0ZWQKLQkgKiBhbmQgaGFzIGEgcGxhdGZvcm0gdGhhdCBleGlzdHMgaW4gdGhlIHJlZ2lzdHJ5IGJ1dCBpcyBub3Qgb24gdGhlCi0JICogbGlzdCBvZiB2YWxpZCBwbGF0Zm9ybXMgZm9yIHRoZSBwcm9qZWN0J3MgSkFYQiBmYWNldCB2ZXJzaW9uLgotCSAqIEJlY2F1c2UsIGlmIHRoZSBwcm9qZWN0J3MgSkFYQiBwbGF0Zm9ybSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHRoZXJlCi0JICogd291bGQgYmUgbm8gSkFYQiBwcm9qZWN0IQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+IGJ1aWxkUGxhdGZvcm1DaG9pY2VzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPigKLQkJCQluZXcgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KAotCQkJCQkJbmV3IENvbXBvc2l0ZUNvbGxlY3Rpb25WYWx1ZU1vZGVsPENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KAotCQkJCQkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KHRoaXMucGxhdGZvcm1Nb2RlbCksCi0JCQkJCQkJCWJ1aWxkUmVnaXN0cnlQbGF0Zm9ybXNNb2RlbCgpKSksCi0JCQkJSkFYQl9QTEFURk9STV9DT01QQVJBVE9SKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gYnVpbGRSZWdpc3RyeVBsYXRmb3Jtc01vZGVsKCkgewotCQlJdGVyYWJsZTxKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gZW5hYmxlZFBsYXRmb3JtcyA9IAotCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPigKLQkJCQkJSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtTWFuYWdlcigpLmdldEpheGJQbGF0Zm9ybXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBvKSB7Ci0JCQkJCXJldHVybiBvLnN1cHBvcnRzSmF4YkZhY2V0VmVyc2lvbihnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KGVuYWJsZWRQbGF0Zm9ybXMpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uPiBKQVhCX1BMQVRGT1JNX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbiBkZXNjMSwgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZGVzYzIpIHsKLQkJCQkJcmV0dXJuIFNUUklOR19DT01QQVJBVE9SLmNvbXBhcmUoZGVzYzEuZ2V0TGFiZWwoKSwgZGVzYzIuZ2V0TGFiZWwoKSk7Ci0JCQkJfQotCQkJfTsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdDb252ZXJ0ZXI8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+IEpBWEJfUExBVEZPUk1fTEFCRUxfQ09OVkVSVEVSID0KLQkJCW5ldyBTdHJpbmdDb252ZXJ0ZXI8SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGRlc2MpIHsKLQkJCQkJcmV0dXJuIGRlc2MuZ2V0TGFiZWwoKTsKLQkJCQl9Ci0JCQl9OwotCQotCQotCS8vICoqKioqKioqKiogT0svUmV2ZXJ0L0FwcGx5IGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9qZWN0UmVidWlsZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybU1vZGVsLmlzQnVmZmVyaW5nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlYnVpbGRQcm9qZWN0KCkgewotCQkvLyBpZiB0aGUgSkFYQiBwbGF0Zm9ybSBpcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIGNvbXBsZXRlbHkgcmVidWlsZCB0aGUgSkFYQiBwcm9qZWN0Ci0JCUpwdEpheGJDb3JlUGx1Z2luLmdldFByb2plY3RNYW5hZ2VyKCkucmVidWlsZEpheGJQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gYnVpbGRCdWZmZXJlZE1vZGVscygpIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsW10gewotCQkJdGhpcy5wbGF0Zm9ybU1vZGVsCi0JCX07Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1vZGVsW10gYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCkgewotCQlyZXR1cm4gbmV3IE1vZGVsW10gewotCQkJcGxhdGZvcm1Nb2RlbAotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtVmFsaWRhdGlvbihNYXA8SW50ZWdlciwgQXJyYXlMaXN0PElTdGF0dXM+PiBzdGF0dXNlcykgewotCQkvKiBwbGF0Zm9ybSAqLwotCQkvLyB1c2VyIGlzIHVuYWJsZSB0byB1bnNldCB0aGUgcGxhdGZvcm0sIHNvIG5vIHZhbGlkYXRpb24gbmVjZXNzYXJ5Ci0JCQotCQkvKiBsaWJyYXJ5IHByb3ZpZGVyICovCi0JCXN1cGVyLnBlcmZvcm1WYWxpZGF0aW9uKHN0YXR1c2VzKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBVSSBtb2RlbCBhZGFwdGVycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVHJlYXQgdGhlIEpBWEIgcGxhdGZvcm0gYXMgYW4gImFzcGVjdCIgb2YgdGhlIEpBWEIgcHJvamVjdC4KLQkgKiBUaGUgcGxhdGZvcm0gSUQgaXMgc3RvcmVkIGluIHRoZSBwcm9qZWN0IHByZWZlcmVuY2VzLgotCSAqIFRoZSBwbGF0Zm9ybSBJRCBkb2VzIG5vdCBjaGFuZ2UgZm9yIGEgSkFYQiBwcm9qZWN0IC0gaWYgdGhlIHVzZXIgd2FudHMgYQotCSAqIGRpZmZlcmVudCBwbGF0Zm9ybSwgd2UgYnVpbGQgYW4gZW50aXJlbHkgbmV3IEpBWEIgcHJvamVjdC4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgUGxhdGZvcm1Nb2RlbAotCQkJZXh0ZW5kcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEpheGJQcm9qZWN0LCBKYXhiUGxhdGZvcm1EZXNjcmlwdGlvbj4gewotCQkKLQkJUGxhdGZvcm1Nb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SmF4YlByb2plY3Q+IGpheGJQcm9qZWN0TW9kZWwpIHsKLQkJCXN1cGVyKGpheGJQcm9qZWN0TW9kZWwpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQbGF0Zm9ybSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZV8oSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gbmV3UGxhdGZvcm0pIHsKLQkJCUpwdEpheGJDb3JlUGx1Z2luLnNldEpheGJQbGF0Zm9ybSh0aGlzLnN1YmplY3QuZ2V0UHJvamVjdCgpLCBuZXdQbGF0Zm9ybSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCS8vIHRoZSBwbGF0Zm9ybSBJRCBkb2VzIG5vdCBjaGFuZ2UKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJLy8gdGhlIHBsYXRmb3JtIElEIGRvZXMgbm90IGNoYW5nZQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pheGJTY2hlbWFzUHJvcGVydGllc1BhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KYXhiU2NoZW1hc1Byb3BlcnRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxY2M3NzQuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pheGJTY2hlbWFzUHJvcGVydGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVHJheURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5sYXlvdXQuVGFibGVDb2x1bW5MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtblZpZXdlclRvb2xUaXBTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5Ub29sVGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5zd3QuQ29sdW1uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5UYWJsZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWxpdHkuc3d0LlNXVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5CdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuU2NoZW1hRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW4uU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWwuWFNESW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2NoZW1hOwotCi0vKioKLSAqIFNob3dzIHRoZSBzY2hlbWFzIGFzc29jaWF0ZWQgd2l0aCBhIEpBWEIgcHJvamVjdAotICovCi1wdWJsaWMgY2xhc3MgSmF4YlNjaGVtYXNQcm9wZXJ0aWVzUGFnZQotCQlleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19TRUxFQ1RJT05fUEFORV9XSURUSCA9IDQ1MDsKLQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SVByb2plY3Q+IHByb2plY3RNb2RlbDsKLQkKLQlwcml2YXRlIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxKYXhiUHJvamVjdD4gamF4YlByb2plY3RNb2RlbDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbC5UcmlnZ2VyIHRyaWdnZXI7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBTY2hlbWFzTW9kZWwgc2NoZW1hc01vZGVsOwotCQotCXByaXZhdGUgZmluYWwgV3JpdGFibGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxTY2hlbWE+IHNjaGVtYXNTZWxlY3Rpb25Nb2RlbDsKLQkKLQkKLQlwdWJsaWMgSmF4YlNjaGVtYXNQcm9wZXJ0aWVzUGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9qZWN0TW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPElQcm9qZWN0PigpOwotCQl0aGlzLmpheGJQcm9qZWN0TW9kZWwgPSBuZXcgSmF4YlByb2plY3RNb2RlbCh0aGlzLnByb2plY3RNb2RlbCk7Ci0JCXRoaXMudHJpZ2dlciA9IG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsLlRyaWdnZXIoKTsKLQkJdGhpcy5zY2hlbWFzTW9kZWwgPSBuZXcgU2NoZW1hc01vZGVsKHRoaXMuamF4YlByb2plY3RNb2RlbCwgdGhpcy50cmlnZ2VyKTsKLQkJdGhpcy5zY2hlbWFzU2VsZWN0aW9uTW9kZWwgPSBuZXcgU2ltcGxlQ29sbGVjdGlvblZhbHVlTW9kZWw8U2NoZW1hPigpOwotCQlzZXREZXNjcmlwdGlvbihKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9kZXNjcmlwdGlvbik7Ci0JfQotCQotCQotCXByb3RlY3RlZCBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0TW9kZWwuZ2V0VmFsdWUoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50ICkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKCBwYXJlbnQgKTsKLQkJCi0JCUJ1dHRvbiByZXZlcnRCdXR0b24gPSBnZXREZWZhdWx0c0J1dHRvbigpOwotCQkKLQkJcmV2ZXJ0QnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2VfcmV2ZXJ0KTsKLQkJCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCVBvaW50IG1pbkJ1dHRvblNpemUgPSByZXZlcnRCdXR0b24uY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxULCB0cnVlKTsKLQkJZ2Qud2lkdGhIaW50ID0gTWF0aC5tYXgoY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fV0lEVEgpLCBtaW5CdXR0b25TaXplLngpOwotCQlyZXZlcnRCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl1cGRhdGVCdXR0b25zKCk7Ci0JCQotCQlnZXRTaGVsbCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLSAgICB9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlJQWRhcHRhYmxlIGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgZWxlbWVudDsKLQkJfQotCQllbHNlIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkubG9hZEFkYXB0ZXIoZWxlbWVudCwgSVByb2plY3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCQkKLQkJdGhpcy5wcm9qZWN0TW9kZWwuc2V0VmFsdWUocHJvamVjdCk7Ci0JCQotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJcGFnZUNvbXBvbmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IFNJWklOR19TRUxFQ1RJT05fUEFORV9XSURUSDsKLQkJcGFnZUNvbXBvbmVudC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJTGFiZWwgc2NoZW1hc0xhYmVsID0gbmV3IExhYmVsKHBhZ2VDb21wb25lbnQsIFNXVC5MRUZUKTsKLQkJc2NoZW1hc0xhYmVsLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2Vfc2NoZW1hcyk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXNjaGVtYXNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSB0YWJsZSBjb21wb3NpdGUKLQkJQ29tcG9zaXRlIHRhYmxlQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYWdlQ29tcG9uZW50LCBTV1QuTk9ORSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCWRhdGEud2lkdGhIaW50ID0gU0laSU5HX1NFTEVDVElPTl9QQU5FX1dJRFRIOwotCQl0YWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJLy8gY3JlYXRlIHRoZSB0YWJsZQotCQlUYWJsZVZpZXdlciBzY2hlbWFzVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIodGFibGVDb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkpOwotCQlUYWJsZU1vZGVsQWRhcHRlci5hZGFwdCgKLQkJCQluZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFNjaGVtYT4odGhpcy5zY2hlbWFzTW9kZWwpLAotCQkJCXRoaXMuc2NoZW1hc1NlbGVjdGlvbk1vZGVsLAotCQkJCXNjaGVtYXNUYWJsZS5nZXRUYWJsZSgpLAotCQkJCW5ldyBTY2hlbWFDb2x1bW5BZGFwdGVyKCksCi0JCQkJbmV3IFNjaGVtYVRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJQ29sdW1uVmlld2VyVG9vbFRpcFN1cHBvcnQuZW5hYmxlRm9yKHNjaGVtYXNUYWJsZSwgVG9vbFRpcC5OT19SRUNSRUFURSk7Ci0JCXNjaGVtYXNUYWJsZS5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXNjaGVtYXNUYWJsZS5nZXRUYWJsZSgpLnNldFRvb2xUaXBUZXh0KG51bGwpOwotICAgICAgICAKLQkJLy8gc2V0IHRoZSB0YWJsZSBjb21wb3NpdGUgbGF5b3V0IChhZnRlciB0aGUgdGFibGUsIHNvIHRoYXQgY29sdW1uIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSkKLQkJVGFibGVDb2x1bW5MYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVDb2x1bW5MYXlvdXQoKTsKLQkJdGFibGVMYXlvdXQuc2V0Q29sdW1uRGF0YShzY2hlbWFzVGFibGUuZ2V0VGFibGUoKS5nZXRDb2x1bW4oMCksIG5ldyBDb2x1bW5XZWlnaHREYXRhKDE1KSk7Ci0JCXRhYmxlTGF5b3V0LnNldENvbHVtbkRhdGEoc2NoZW1hc1RhYmxlLmdldFRhYmxlKCkuZ2V0Q29sdW1uKDEpLCBuZXcgQ29sdW1uV2VpZ2h0RGF0YSgyNSkpOwotCQl0YWJsZUNvbXBvc2l0ZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCQkKLQkJLy8gc2V0IHRoZSB0YWJsZSBsYXlvdXQgZGF0YQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IHNjaGVtYXNUYWJsZS5nZXRUYWJsZSgpLmdldEl0ZW1IZWlnaHQoKSAqIDc7Ci0JCWRhdGEud2lkdGhIaW50ID0gMjAwOwotCQlzY2hlbWFzVGFibGUuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJY3JlYXRlQnV0dG9uR3JvdXAocGFnZUNvbXBvbmVudCk7Ci0gICAgICAgIAotICAgICAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCQotICAgICAgICByZXR1cm4gcGFnZUNvbXBvbmVudDsKLSAgICB9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZ3JvdXBDb21wb25lbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGdyb3VwTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ3JvdXBMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlncm91cExheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlncm91cENvbXBvbmVudC5zZXRMYXlvdXQoZ3JvdXBMYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlncm91cENvbXBvbmVudC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXBDb21wb25lbnQsIFNXVC5QVVNIKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2VfYWRkQnV0dG9uTGFiZWwpOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlhZGRTY2hlbWEoKTsKLQkJCQkJfQotCQkJCX0pOwotCQlzZXRCdXR0b25MYXlvdXREYXRhKGFkZEJ1dHRvbik7Ci0JCQotCQlCdXR0b24gZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXBDb21wb25lbnQsIFNXVC5QVVNIKTsKLQkJZWRpdEJ1dHRvbi5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYXNQYWdlX2VkaXRCdXR0b25MYWJlbCk7Ci0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQllZGl0U2VsZWN0ZWRTY2hlbWEoKTsKLQkJCQkJfQotCQkJCX0pOwotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKGJ1aWxkRWRpdEVuYWJsZWRNb2RlbCgpLCBlZGl0QnV0dG9uKTsKLQkJc2V0QnV0dG9uTGF5b3V0RGF0YShlZGl0QnV0dG9uKTsKLQkJCi0JCUJ1dHRvbiByZW1vdmVCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwQ29tcG9uZW50LCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYXNQYWdlX3JlbW92ZUJ1dHRvbkxhYmVsKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJCW5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJcmVtb3ZlU2VsZWN0ZWRTY2hlbWFzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJU1dUVG9vbHMuY29udHJvbEVuYWJsZWRTdGF0ZShidWlsZFJlbW92ZUVuYWJsZWRNb2RlbCgpLCByZW1vdmVCdXR0b24pOwotICAgICAgICBzZXRCdXR0b25MYXlvdXREYXRhKHJlbW92ZUJ1dHRvbik7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBhZGRTY2hlbWEoKSB7Ci0JCS8vIGNvbnN0cnVjdHMgYSBkaWFsb2cgZm9yIGVkaXRpbmcgdGhlIG5ldyBzY2hlbWEgbmFtZXNwYWNlIGFuZCBsb2NhdGlvbgotCQlBZGRFZGl0U2NoZW1hRGlhbG9nIGRpYWxvZyA9IAotCQkJCW5ldyBBZGRFZGl0U2NoZW1hRGlhbG9nKAotCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCW51bGwsCi0JCQkJCQl0aGlzLnNjaGVtYXNNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIG9wZW5zIHRoZSBkaWFsb2cgLSBqdXN0IHJldHVybnMgaWYgdGhlIHVzZXIgY2FuY2VscyBpdAotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIG90aGVyd2lzZSwgYWRkcyB0aGUgbmV3IHNjaGVtYQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5zY2hlbWFzTW9kZWwuYWRkU2NoZW1hKGRpYWxvZy5nZXROYW1lc3BhY2UoKSwgZGlhbG9nLmdldExvY2F0aW9uKCkpOwotCQkKLSAgICAgICAgLy8gc2VsZWN0IHRoZSBuZXcgc2NoZW1hCi0gICAgICAgIHRoaXMuc2NoZW1hc1NlbGVjdGlvbk1vZGVsLnNldFZhbHVlcyhuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFNjaGVtYT4oc2NoZW1hKSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRWRpdEVuYWJsZWRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uUHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPih0aGlzLnNjaGVtYXNTZWxlY3Rpb25Nb2RlbCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5jb2xsZWN0aW9uTW9kZWwuc2l6ZSgpID09IDEpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZWRpdFNlbGVjdGVkU2NoZW1hKCkgewotCQkvLyBjb25zdHJ1Y3RzIGEgZGlhbG9nIGZvciBlZGl0aW5nIHRoZSBuZXcgc2NoZW1hIG5hbWVzcGFjZSBhbmQgbG9jYXRpb24KLQkJZmluYWwgU2NoZW1hIHNjaGVtYSA9IHRoaXMuc2NoZW1hc1NlbGVjdGlvbk1vZGVsLml0ZXJhdG9yKCkubmV4dCgpOwotCQlBZGRFZGl0U2NoZW1hRGlhbG9nIGRpYWxvZyA9IAotCQkJCW5ldyBBZGRFZGl0U2NoZW1hRGlhbG9nKAotCQkJCQkJZ2V0U2hlbGwoKSwKLQkJCQkJCXNjaGVtYSwKLQkJCQkJCXRoaXMuc2NoZW1hc01vZGVsLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gb3BlbnMgdGhlIGRpYWxvZyAtIGp1c3QgcmV0dXJucyBpZiB0aGUgdXNlciBjYW5jZWxzIGl0Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJLy8gb3RoZXJ3aXNlLCBjaGFuZ2VzIHRoZSBuZXcgc2NoZW1hCi0JCXNjaGVtYS5zZXROYW1lc3BhY2UoZGlhbG9nLmdldE5hbWVzcGFjZSgpKTsKLQkJc2NoZW1hLnNldExvY2F0aW9uKGRpYWxvZy5nZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRSZW1vdmVFbmFibGVkTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvblByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5zY2hlbWFzU2VsZWN0aW9uTW9kZWwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuY29sbGVjdGlvbk1vZGVsLnNpemUoKSA+PSAxKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVNlbGVjdGVkU2NoZW1hcygpIHsKLQkJdGhpcy5zY2hlbWFzTW9kZWwucmVtb3ZlU2NoZW1hcyhDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5zY2hlbWFzU2VsZWN0aW9uTW9kZWwuaXRlcmF0b3IoKSkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlQnV0dG9ucygpIHsKLQkJYm9vbGVhbiBlbmFibGVBcHBseSA9IGlzVmFsaWQoKTsKLQkJYm9vbGVhbiBlbmFibGVSZXZlcnQgPSB0cnVlOwotCQkKLQkJQnV0dG9uIGFwcGx5QnV0dG9uID0gZ2V0QXBwbHlCdXR0b24oKTsKLQkJCi0JCWlmIChhcHBseUJ1dHRvbiAhPSBudWxsKSB7Ci0JCQlhcHBseUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZUFwcGx5KTsKLQkJfQotCQkKLQkJQnV0dG9uIHJldmVydEJ1dHRvbiA9IGdldERlZmF1bHRzQnV0dG9uKCk7Ci0JCQotCQlpZiAocmV2ZXJ0QnV0dG9uICE9IG51bGwpIHsKLQkJCXJldmVydEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZVJldmVydCk7Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBPSy9SZXZlcnQvQXBwbHkgYmVoYXZpb3IgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQl0cnkgewotCQkJLy8gdHJ1ZT1mb3JrOyBmYWxzZT11bmNhbmNlbGxhYmxlCi0JCQl0aGlzLmJ1aWxkT2tQcm9ncmVzc01vbml0b3JEaWFsb2coKS5ydW4odHJ1ZSwgZmFsc2UsIHRoaXMuYnVpbGRPa1J1bm5hYmxlV2l0aFByb2dyZXNzKCkpOwotCQl9Ci0JCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IAotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBJUnVubmFibGVDb250ZXh0IGJ1aWxkT2tQcm9ncmVzc01vbml0b3JEaWFsb2coKSB7Ci0JCXJldHVybiBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgYnVpbGRPa1J1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQlyZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQl0cnkgewotCQkJCQkvLyB0aGUgYnVpbGQgd2UgZXhlY3V0ZSBpbiAjcGVyZm9ybU9rXygpIGxvY2tzIHRoZSB3b3Jrc3BhY2Ugcm9vdCwKLQkJCQkJLy8gc28gd2UgbmVlZCB0byB1c2UgdGhlIHdvcmtzcGFjZSByb290IGFzIG91ciBzY2hlZHVsaW5nIHJ1bGUgaGVyZQotCQkJCQl3cy5ydW4oCi0JCQkJCQkJYnVpbGRPa1dvcmtzcGFjZVJ1bm5hYmxlKCksCi0JCQkJCQkJd3MuZ2V0Um9vdCgpLAotCQkJCQkJCUlXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLAotCQkJCQkJCW1vbml0b3IpOwotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihleCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQkvKiBwcml2YXRlICovIElXb3Jrc3BhY2VSdW5uYWJsZSBidWlsZE9rV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCXJldHVybiBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCXBlcmZvcm1Pa18obW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgcGVyZm9ybU9rXyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuc2NoZW1hc01vZGVsLmhhc0NoYW5nZXMoKSkgewotCQkJdGhpcy50cmlnZ2VyLmFjY2VwdCgpOwotCQkJSnB0SmF4YkNvcmVQbHVnaW4uZ2V0UHJvamVjdE1hbmFnZXIoKS5yZWJ1aWxkSmF4YlByb2plY3QoZ2V0UHJvamVjdCgpKTsKLQkJCWdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG1vbml0b3IpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJdGhpcy50cmlnZ2VyLnJlc2V0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCQotCXN0YXRpYyBjbGFzcyBTY2hlbWFzTW9kZWwKLQkJCWV4dGVuZHMgQXNwZWN0QWRhcHRlcjxKYXhiUHJvamVjdD4KLQkJCWltcGxlbWVudHMgQ29sbGVjdGlvblZhbHVlTW9kZWw8U2NoZW1hPiB7Ci0JCQotCQkvKioKLQkJICogVGhlIGNvbGxlY3Rpb24gb2Ygc2NoZW1hcwotCQkgKi8KLQkJcHJvdGVjdGVkIGZpbmFsIENvbGxlY3Rpb248U2NoZW1hPiBzY2hlbWFzOwotCQkKLQkJLyoqCi0JCSAqIFRoaXMgaXMgdGhlIHRyaWdnZXIgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYnVmZmVyZWQgdmFsdWUKLQkJICogc2hvdWxkIGJlIGFjY2VwdGVkIG9yIHJlc2V0LgotCQkgKi8KLQkJcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0cmlnZ2VySG9sZGVyOwotCQotCQkvKiogVGhpcyBsaXN0ZW5zIHRvIHRoZSB0cmlnZ2VyIGhvbGRlci4gKi8KLQkJcHJvdGVjdGVkIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdHJpZ2dlckNoYW5nZUxpc3RlbmVyOwotCi0JCQotCQlTY2hlbWFzTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpheGJQcm9qZWN0PiBzdWJqZWN0SG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdHJpZ2dlckhvbGRlcikgewotCQkJc3VwZXIoc3ViamVjdEhvbGRlcik7Ci0JCQl0aGlzLnNjaGVtYXMgPSBuZXcgQXJyYXlMaXN0PFNjaGVtYT4oKTsKLQkJCXRoaXMudHJpZ2dlckhvbGRlciA9IHRyaWdnZXJIb2xkZXI7Ci0JCQl0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lciA9IGJ1aWxkVHJpZ2dlckNoYW5nZUxpc3RlbmVyKCk7Ci0JCX0KLQkJCi0JCQotCQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRyaWdnZXJDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQl0cmlnZ2VyQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb248U2NoZW1hPiBidWlsZFNjaGVtYXNfKCkgewotCQkJQXJyYXlMaXN0PFNjaGVtYT4gc2NoZW1hcyA9IG5ldyBBcnJheUxpc3Q8U2NoZW1hPigpOwotCQkJZm9yIChTY2hlbWFFbnRyeSBlbnRyeSA6IHRoaXMuc3ViamVjdC5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hRW50cmllcygpKSB7Ci0JCQkJc2NoZW1hcy5hZGQobmV3IFNjaGVtYShlbnRyeS5nZXROYW1lc3BhY2UoKSwgZW50cnkuZ2V0TG9jYXRpb24oKSkpOwotCQkJfQotCQkJcmV0dXJuIHNjaGVtYXM7Ci0JCX0KLQkJCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoYW5nZXMoKSB7Ci0JCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IGZhbHNlIDogISB0aGlzLnNjaGVtYXMuZXF1YWxzKGJ1aWxkU2NoZW1hc18oKSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHRyaWdnZXJDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmIChoYXNDaGFuZ2VzKCkpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwgJiYgKChCb29sZWFuKSBldmVudC5nZXROZXdWYWx1ZSgpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLmFjY2VwdCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMucmVzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGFjY2VwdCgpIHsKLQkJCUxpc3Q8U3RyaW5nPiBzY2hlbWFMb2NhdGlvbnMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJCWZvciAoU2NoZW1hIHNjaGVtYSA6IHRoaXMuc2NoZW1hcykgewotCQkJCXNjaGVtYUxvY2F0aW9ucy5hZGQoc2NoZW1hLmdldExvY2F0aW9uKCkpOwotCQkJfQotCQkJdGhpcy5zdWJqZWN0LmdldFNjaGVtYUxpYnJhcnkoKS5zZXRTY2hlbWFMb2NhdGlvbnMoc2NoZW1hTG9jYXRpb25zKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0JCQl0aGlzLnNjaGVtYXMuY2xlYXIoKTsKLQkJCWlmICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgewotCQkJCXRoaXMuc2NoZW1hcy5hZGRBbGwoYnVpbGRTY2hlbWFzXygpKTsKLQkJCX0KLQkJCWZpcmVDb2xsZWN0aW9uQ2hhbmdlZChWQUxVRVMsIGdldFZhbHVlKCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgU2NoZW1hIGFkZFNjaGVtYShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJCVNjaGVtYSBzY2hlbWEgPSBuZXcgU2NoZW1hKG5hbWVzcGFjZSwgbG9jYXRpb24pOwotCQkJYWRkSXRlbVRvQ29sbGVjdGlvbihzY2hlbWEsIHRoaXMuc2NoZW1hcywgVkFMVUVTKTsKLQkJCXJldHVybiBzY2hlbWE7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNjaGVtYXMoSXRlcmFibGU8U2NoZW1hPiBzY2hlbWFzKSB7Ci0JCQlyZW1vdmVJdGVtc0Zyb21Db2xsZWN0aW9uKHNjaGVtYXMsIHRoaXMuc2NoZW1hcywgVkFMVUVTKTsKLQkJfQotCQkKLQkJCi0JCS8vICoqKioqKioqKioqKiBBc3BlY3RBZGFwdGVyIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMaXN0ZW5lckFzcGVjdE5hbWUoKSB7Ci0JCQlyZXR1cm4gVkFMVUVTOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lci5jbGFzczsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIGhhc0xpc3RlbmVycygpIHsKLQkJCXJldHVybiBoYXNBbnlDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXJzKFZBTFVFUyk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBmaXJlQXNwZWN0Q2hhbmdlZChPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQkJZmlyZUNvbGxlY3Rpb25DaGFuZ2VkKFZBTFVFUywgZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCXRoaXMuc2NoZW1hcy5hZGRBbGwoYnVpbGRTY2hlbWFzXygpKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5zY2hlbWFzLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbHMoKSB7Ci0JCQlzdXBlci5lbmdhZ2VNb2RlbHMoKTsKLQkJCXRoaXMudHJpZ2dlckhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50cmlnZ2VyQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWxzKCkgewotCQkJdGhpcy50cmlnZ2VySG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRyaWdnZXJDaGFuZ2VMaXN0ZW5lcik7Ci0JCQlzdXBlci5kaXNlbmdhZ2VNb2RlbHMoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uPFNjaGVtYT4gZ2V0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oaXRlcmF0b3IoKSk7Ci0JCX0KLQkJCi0JCQotCQkvLyAqKioqKioqKioqKiogQ29sbGVjdGlvblZhbHVlTW9kZWwgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQkKLQkJcHVibGljIEl0ZXJhdG9yPFNjaGVtYT4gaXRlcmF0b3IoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zY2hlbWFzLml0ZXJhdG9yKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLnNjaGVtYXMuc2l6ZSgpOwotCQl9Ci0JfQotCQotCQotCXN0YXRpYyBjbGFzcyBTY2hlbWEgCi0JCQlleHRlbmRzIEFic3RyYWN0TW9kZWwKLQkJCWltcGxlbWVudHMgQ29tcGFyYWJsZTxTY2hlbWE+IHsKLQkJCi0JCXN0YXRpYyBTdHJpbmcgbG9jYXRpb25EaXNwbGF5U3RyaW5nKFN0cmluZyBsb2NhdGlvbikgewotCQkJaWYgKGxvY2F0aW9uID09IG51bGwpIHsKLQkJCQlyZXR1cm4gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HOwotCQkJfQotCQkJCi0JCQlVUkkgdXJpID0gVVJJLmNyZWF0ZVVSSShsb2NhdGlvbik7Ci0JCQlpZiAodXJpLmlzUGxhdGZvcm1SZXNvdXJjZSgpKSB7Ci0JCQkJcmV0dXJuIHVyaS50b1BsYXRmb3JtU3RyaW5nKGZhbHNlKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0JCQotCQlzdGF0aWMgU3RyaW5nIG5hbWVzcGFjZURpc3BsYXlTdHJpbmcoU3RyaW5nIG5hbWVzcGFjZSkgewotCQkJaWYgKG51bGwgPT0gbmFtZXNwYWNlIHx8IFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklORy5lcXVhbHMobmFtZXNwYWNlKSkgewotCQkJCXJldHVybiBKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9ub05hbWVzcGFjZVRleHQ7Ci0JCQl9Ci0JCQkKLQkJCXJldHVybiBuYW1lc3BhY2U7Ci0JCX0KLQkJCi0JCVNjaGVtYShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJfQotCQkKLQkJCi0JCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZTsKLQkJZmluYWwgc3RhdGljIFN0cmluZyBOQU1FU1BBQ0VfUFJPUEVSVFkgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0JCWZpbmFsIHN0YXRpYyBTdHJpbmcgTE9DQVRJT05fUFJPUEVSVFkgPSAibG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JCQotCQkKLQkJU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzcGFjZTsKLQkJfQotCQkKLQkJdm9pZCBzZXROYW1lc3BhY2UoU3RyaW5nIG5hbWVzcGFjZSkgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZXNwYWNlOwotCQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVTUEFDRV9QUk9QRVJUWSwgb2xkLCBuYW1lc3BhY2UpOwotCQl9Ci0JCQotCQlTdHJpbmcgbmFtZXNwYWNlRGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiBuYW1lc3BhY2VEaXNwbGF5U3RyaW5nKHRoaXMubmFtZXNwYWNlKTsKLQkJfQotCQkKLQkJU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQkJcmV0dXJuIHRoaXMubG9jYXRpb247Ci0JCX0KLQkJCi0JCVN0cmluZyBsb2NhdGlvbkRpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gbG9jYXRpb25EaXNwbGF5U3RyaW5nKGdldExvY2F0aW9uKCkpOwotCQl9Ci0JCQotCQl2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQkJU3RyaW5nIG9sZCA9IHRoaXMubG9jYXRpb247Ci0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKExPQ0FUSU9OX1BST1BFUlRZLCBvbGQsIGxvY2F0aW9uKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBjb21wYXJlVG8oU2NoZW1hIG8pIHsKLQkJCXJldHVybiB0aGlzLm5hbWVzcGFjZURpc3BsYXlTdHJpbmcoKS5jb21wYXJlVG8oby5uYW1lc3BhY2VEaXNwbGF5U3RyaW5nKCkpOwotCQl9Ci0JfQotCQotCQotCXN0YXRpYyBjbGFzcyBTY2hlbWFDb2x1bW5BZGFwdGVyCi0JCQlpbXBsZW1lbnRzIENvbHVtbkFkYXB0ZXI8U2NoZW1hPiB7Ci0JCQotCQlzdGF0aWMgZmluYWwgaW50IENPTFVNTl9DT1VOVCA9IDI7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTkFNRVNQQUNFX0NPTFVNTiA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgTE9DQVRJT05fQ09MVU1OID0gMTsKLQkJCi0JCQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBjb2x1bW5OYW1lKGludCBjb2x1bW5JbmRleCkgewotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgTkFNRVNQQUNFX0NPTFVNTiA6Ci0JCQkJCXJldHVybiBKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9uYW1lc3BhY2VDb2x1bW5MYWJlbDsKLQkJCQljYXNlIExPQ0FUSU9OX0NPTFVNTiA6Ci0JCQkJCXJldHVybiBKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9sb2NhdGlvbkNvbHVtbkxhYmVsOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQkKLQkJcHVibGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gY2VsbE1vZGVscyhTY2hlbWEgc3ViamVjdCkgewotCQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W0NPTFVNTl9DT1VOVF07Ci0JCQljZWxsTW9kZWxzW05BTUVTUEFDRV9DT0xVTU5dID0gYnVpbGROYW1lc3BhY2VDZWxsTW9kZWwoc3ViamVjdCk7Ci0JCQljZWxsTW9kZWxzW0xPQ0FUSU9OX0NPTFVNTl0gPSBidWlsZExvY2F0aW9uQ2VsbE1vZGVsKHN1YmplY3QpOwotCQkJcmV0dXJuIGNlbGxNb2RlbHM7Ci0JCX0KLQkJCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVzcGFjZUNlbGxNb2RlbChTY2hlbWEgc3ViamVjdCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U2NoZW1hLCBTdHJpbmc+KFNjaGVtYS5OQU1FU1BBQ0VfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWVzcGFjZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZExvY2F0aW9uQ2VsbE1vZGVsKFNjaGVtYSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWEsIFN0cmluZz4oU2NoZW1hLkxPQ0FUSU9OX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRMb2NhdGlvbigpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0JCi0JCi0Jc3RhdGljIGNsYXNzIFNjaGVtYVRhYmxlTGFiZWxQcm92aWRlcgotCQkJZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JCQlpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQkKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgU2NoZW1hQ29sdW1uQWRhcHRlci5OQU1FU1BBQ0VfQ09MVU1OIDoKLQkJCQkJcmV0dXJuICgoU2NoZW1hKSBlbGVtZW50KS5uYW1lc3BhY2VEaXNwbGF5U3RyaW5nKCk7Ci0JCQkJY2FzZSBTY2hlbWFDb2x1bW5BZGFwdGVyLkxPQ0FUSU9OX0NPTFVNTiA6Ci0JCQkJCXJldHVybiAoKFNjaGVtYSkgZWxlbWVudCkubG9jYXRpb25EaXNwbGF5U3RyaW5nKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCQotCXN0YXRpYyBjbGFzcyBBZGRFZGl0U2NoZW1hRGlhbG9nCi0JCQlleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0JCQotCQlwcml2YXRlIFNjaGVtYSBjdXJyZW50U2NoZW1hOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE1lc3NhZ2U7Ci0JCQotCQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbG9jYXRpb247Ci0JCQotCQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbmFtZXNwYWNlOwotCQkKLQkJcHJpdmF0ZSBYU0RTY2hlbWEgcmVzb2x2ZWRTY2hlbWE7Ci0JCQotCQlwcml2YXRlIGZpbmFsIE1vZGUgbW9kZTsKLQkJCi0JCXByaXZhdGUgSXRlcmFibGU8U2NoZW1hPiBhbGxTY2hlbWFzOwotCQkKLQkJCi0JCXB1YmxpYyBBZGRFZGl0U2NoZW1hRGlhbG9nKFNoZWxsIHNoZWxsLCBTY2hlbWEgY3VycmVudFNjaGVtYSwgSXRlcmFibGU8U2NoZW1hPiBhbGxTY2hlbWFzKSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCQl0aGlzLmN1cnJlbnRTY2hlbWEgPSBjdXJyZW50U2NoZW1hOwotCQkJdGhpcy5hbGxTY2hlbWFzID0gYWxsU2NoZW1hczsKLQkJCXRoaXMubG9jYXRpb24gPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJCXRoaXMubmFtZXNwYWNlID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KCk7Ci0JCQkKLQkJCXRoaXMubW9kZSA9ICh0aGlzLmN1cnJlbnRTY2hlbWEgPT0gbnVsbCkgPyBNb2RlLkFERCA6IE1vZGUuRURJVDsKLQkJCWlmICh0aGlzLm1vZGUgPT0gTW9kZS5BREQpIHsKLQkJCQl0aGlzLmRlZmF1bHRNZXNzYWdlID0gSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2VfYWRkU2NoZW1hTWVzc2FnZTsKLQkJCQl0aGlzLmxvY2F0aW9uLnNldFZhbHVlKG51bGwpOwotCQkJCXRoaXMubmFtZXNwYWNlLnNldFZhbHVlKG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0TWVzc2FnZSA9IEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYXNQYWdlX2VkaXRTY2hlbWFNZXNzYWdlOwotCQkJCXRoaXMubG9jYXRpb24uc2V0VmFsdWUoY3VycmVudFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQkJCQl0aGlzLm5hbWVzcGFjZS5zZXRWYWx1ZShjdXJyZW50U2NoZW1hLmdldE5hbWVzcGFjZSgpKTsKLQkJCX0KLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQkJaWYgKHRoaXMubW9kZSA9PSBNb2RlLkFERCkgewotCQkJCW5ld1NoZWxsLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2VfYWRkU2NoZW1hRGlhbG9nVGl0bGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3U2hlbGwuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9lZGl0U2NoZW1hRGlhbG9nVGl0bGUpOwotCQkJfQotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQotCQkJc2V0TWVzc2FnZSh0aGlzLmRlZmF1bHRNZXNzYWdlKTsKLQkJCWlmICh0aGlzLm1vZGUgPT0gTW9kZS5BREQpIHsKLQkJCQlzZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9hZGRTY2hlbWFUaXRsZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9lZGl0U2NoZW1hVGl0bGUpOwotCQkJfQotCQkJCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkKLQkJCUxhYmVsIGxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCQlsb2NhdGlvbkxhYmVsLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2VfbG9jYXRpb25MYWJlbCk7Ci0JCQlsb2NhdGlvbkxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5MRUZULCBTV1QuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpKTsKLQkJCQotCQkJZmluYWwgVGV4dCBsb2NhdGlvblRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uRGlzcGxheVN0cmluZygpKTsKLQkJCWxvY2F0aW9uVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQlsb2NhdGlvblRleHQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlLCAxLCAxKSk7Ci0JCQl0aGlzLmxvY2F0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoCi0JCQkJCVByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwKLQkJCQkJbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQkJCWxvY2F0aW9uVGV4dC5zZXRUZXh0KGxvY2F0aW9uRGlzcGxheVN0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkKLQkJCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2VfYnJvd3NlQnV0dG9uTGFiZWwpOwotCQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5SSUdIVCwgU1dULkNFTlRFUiwgZmFsc2UsIHRydWUsIDEsIDEpKTsKLQkJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQkJbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQkJCWJyb3dzZUZvclNjaGVtYUxvY2F0aW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCi0JCQlMYWJlbCBuYW1lc3BhY2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OVUxMKTsKLQkJCW5hbWVzcGFjZUxhYmVsLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2VfbmFtZXNwYWNlTGFiZWwpOwotCQkJbmFtZXNwYWNlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkxFRlQsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJCi0JCQlmaW5hbCBUZXh0IG5hbWVzcGFjZVRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCW5hbWVzcGFjZVRleHQuc2V0VGV4dChuYW1lc3BhY2VEaXNwbGF5U3RyaW5nKCkpOwotCQkJbmFtZXNwYWNlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQluYW1lc3BhY2VUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuQ0VOVEVSLCB0cnVlLCBmYWxzZSwgMSwgMSkpOwotCQkJdGhpcy5uYW1lc3BhY2UuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigKLQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLAotCQkJCQluZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCQkJbmFtZXNwYWNlVGV4dC5zZXRUZXh0KG5hbWVzcGFjZURpc3BsYXlTdHJpbmcoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCi0JCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGRpYWxvZ0FyZWEpOwotCQkJCi0JCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJCXN1cGVyLmNyZWF0ZSgpOwotCQkJCi0JCQkvLyBkaXNhYmxlIG9rIGJ1dHRvbiB1bnRpbCB1c2VyIGRvZXMgc29tZXRoaW5nIGFuZCB0aGVuIHZhbGlkYXRpb24gdGFrZXMgb3ZlcgotCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNpemFibGUoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGJyb3dzZUZvclNjaGVtYUxvY2F0aW9uKCkgewotCQkJU2NoZW1hTG9jYXRpb25EaWFsb2cgZGlhbG9nID0gbmV3IFNjaGVtYUxvY2F0aW9uRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJCi0JCQkvLyBvcGVucyB0aGUgZGlhbG9nIC0ganVzdCByZXR1cm5zIGlmIHRoZSB1c2VyIGNhbmNlbHMgaXQKLQkJCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGRpYWxvZy5nZXRMb2NhdGlvbigpOwotCQkJdGhpcy5sb2NhdGlvbi5zZXRWYWx1ZShsb2NhdGlvbik7Ci0JCQkKLQkJCVN0cmluZyByZXNvbHZlZFVyaSA9IFhzZFV0aWwuZ2V0UmVzb2x2ZWRVcmkobG9jYXRpb24pOwotCQkJCi0JCQlYU0RTY2hlbWEgc2NoZW1hID0gWFNESW1wbC5idWlsZFhTRE1vZGVsKHJlc29sdmVkVXJpKTsKLQkJCVN0cmluZyBuZXdOYW1lc3BhY2UgPSAKLQkJCQkJKHNjaGVtYSA9PSBudWxsKSA/IAotCQkJCQkJCW51bGwgCi0JCQkJCQkJOiAoKHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSkgPT0gbnVsbCA/IAotCQkJCQkJCQkJU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HCi0JCQkJCQkJCQk6IHNjaGVtYS5nZXRUYXJnZXROYW1lc3BhY2UoKSk7Ci0JCQl0aGlzLm5hbWVzcGFjZS5zZXRWYWx1ZShuZXdOYW1lc3BhY2UpOwotCQkJdGhpcy5yZXNvbHZlZFNjaGVtYSA9IHNjaGVtYTsKLQkJCQotCQkJdmFsaWRhdGUoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2UuZ2V0VmFsdWUoKTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VEaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIFNjaGVtYS5uYW1lc3BhY2VEaXNwbGF5U3RyaW5nKGdldE5hbWVzcGFjZSgpKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJCXJldHVybiB0aGlzLmxvY2F0aW9uLmdldFZhbHVlKCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgbG9jYXRpb25EaXNwbGF5U3RyaW5nKCkgewotCQkJcmV0dXJuIFNjaGVtYS5sb2NhdGlvbkRpc3BsYXlTdHJpbmcoZ2V0TG9jYXRpb24oKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJCWlmICh0aGlzLnJlc29sdmVkU2NoZW1hID09IG51bGwpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hc1BhZ2Vfc2NoZW1hVW5yZXNvbHZlZE1lc3NhZ2UpOwotCQkJfQotCQkJZWxzZSBpZiAoaXNEdXBsaWNhdGVOYW1lc3BhY2UoKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9kdXBsaWNhdGVOYW1lc3BhY2VNZXNzYWdlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5sb2NhdGlvbi5nZXRWYWx1ZSgpKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9ub0xvY2F0aW9uTWVzc2FnZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJc2V0TWVzc2FnZSh0aGlzLmRlZmF1bHRNZXNzYWdlKTsKLQkJCX0KLQkJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGdldEVycm9yTWVzc2FnZSgpID09IG51bGwpOwotCQl9Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gaXNEdXBsaWNhdGVOYW1lc3BhY2UoKSB7Ci0JCQlmb3IgKFNjaGVtYSBzY2hlbWEgOiB0aGlzLmFsbFNjaGVtYXMpIHsKLQkJCQlpZiAoKHRoaXMuY3VycmVudFNjaGVtYSAhPSBzY2hlbWEpICYmIGdldE5hbWVzcGFjZSgpLmVxdWFscyhzY2hlbWEuZ2V0TmFtZXNwYWNlKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJCi0JCXByaXZhdGUgZW51bSBNb2RlIHsKLQkJCUFERCwKLQkJCUVESVQKLQkJfQotCX0KLQkKLQkKLQlzdGF0aWMgY2xhc3MgU2NoZW1hTG9jYXRpb25EaWFsb2cKLQkJCWV4dGVuZHMgVHJheURpYWxvZyB7Ci0JCQotCQlwcml2YXRlIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIGxvY2F0aW9uUGFuZWw7Ci0JCQotCQlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQkJCi0JCQotCQlwdWJsaWMgU2NoZW1hTG9jYXRpb25EaWFsb2coU2hlbGwgc2hlbGwpIHsKLQkJCXN1cGVyKHNoZWxsKTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQkJbmV3U2hlbGwuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFzUGFnZV9jaG9vc2VMb2NhdGlvblRpdGxlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQotCQkJdGhpcy5sb2NhdGlvblBhbmVsID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKGNvbXBvc2l0ZSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCQl0aGlzLmxvY2F0aW9uUGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10geyIueHNkIn0pOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmxvY2F0aW9uUGFuZWwudXBkYXRlKCk7Ci0JCQl0aGlzLmxvY2F0aW9uUGFuZWwuc2V0VmlzaWJsZUhlbHBlcih0cnVlKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIGlzUmVzaXphYmxlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCQlJRmlsZSBmaWxlID0gdGhpcy5sb2NhdGlvblBhbmVsLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLmxvY2F0aW9uID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKS50b1N0cmluZygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5sb2NhdGlvbiA9IHRoaXMubG9jYXRpb25QYW5lbC5nZXRYTUxDYXRhbG9nSWQoKTsKLQkJCX0KLQkJCQotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9Qcm9qZWN0V2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL1Byb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzNjOGMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL1Byb2plY3RXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5GaWxsTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqICBQcm9qZWN0V2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlCi17Ci0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JcHJpdmF0ZSBQcm9qZWN0R3JvdXAgcHJvamVjdEdyb3VwOwotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLSAgICBwdWJsaWMgc3RhdGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb21TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgCWlmKHNlbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJfQotCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCXJldHVybiAoSUphdmFQcm9qZWN0KWZpcnN0RWxlbWVudDsKLQkJfQotCQllbHNlIGlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVJlc291cmNlKSBmaXJzdEVsZW1lbnQpLmdldFByb2plY3QoKTsKLQkJCXJldHVybiBnZXRKYXZhUHJvamVjdEZyb20ocHJvamVjdCk7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElKYXZhRWxlbWVudClmaXJzdEVsZW1lbnQpLmdldEphdmFQcm9qZWN0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0RnJvbShJUHJvamVjdCBwcm9qZWN0KSB7Ci0gICAgCXJldHVybiAoSUphdmFQcm9qZWN0KSgoSUphdmFFbGVtZW50KSgoSUFkYXB0YWJsZSlwcm9qZWN0KS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcykpOwotICAgIH0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotICAgIAotCXB1YmxpYyBQcm9qZWN0V2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIkphdmEgUHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5zZXREZXNjcmlwdGlvbihKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfZGVzYyk7Ci0JfQotCQotCXB1YmxpYyBQcm9qZWN0V2l6YXJkUGFnZShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJdGhpcygpOwotCi0JCXRoaXMuamF2YVByb2plY3QgPSBqYXZhUHJvamVjdDsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBJRGlhbG9nUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJdGhpcy5zZXRDb250cm9sKHRoaXMuYnVpbGRUb3BMZXZlbENvbnRyb2wocGFyZW50KSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdDsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQl0aGlzLnByb2plY3RHcm91cCA9IG5ldyBQcm9qZWN0R3JvdXAoY29tcG9zaXRlKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBIRUxQX0NPTlRFWFRfSUQpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0SmF2YVByb2plY3QoSUphdmFQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2plY3RDaGFuZ2VkKCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRoaXMucHJvamVjdEdyb3VwLmdldFByb2plY3ROYW1lKCk7Ci0JCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHJvamVjdE5hbWUpKSB7Ci0KLQkJCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJdGhpcy5zZXRKYXZhUHJvamVjdChKYXZhQ29yZS5jcmVhdGUocHJvamVjdCkpOwotCQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHByb2plY3QgZ3JvdXAgKioqKioqKioqKgotCi0JY2xhc3MgUHJvamVjdEdyb3VwIHsKLQotCQlwcml2YXRlIENvbWJvIHByb2plY3RDb21ibzsKLQotCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JCXByaXZhdGUgUHJvamVjdEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQkJLy8gUHJvamVjdAotCQkJdGhpcy5idWlsZExhYmVsKGNvbXBvc2l0ZSwgSnB0SmF4YlVpTWVzc2FnZXMuSmF2YVByb2plY3RXaXphcmRQYWdlX3Byb2plY3QpOwotCQkJdGhpcy5wcm9qZWN0Q29tYm8gPSB0aGlzLmJ1aWxkUHJvamVjdENvbWJvKGNvbXBvc2l0ZSwgdGhpcy5idWlsZFByb2plY3RDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy51cGRhdGVQcm9qZWN0Q29tYm8oKTsKLQotCQkJc2V0UGFnZUNvbXBsZXRlKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRQcm9qZWN0TmFtZSgpKSk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFByb2plY3RDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gbm90aGluZyBzcGVjaWFsIGZvciAiZGVmYXVsdCIgKGRvdWJsZS1jbGljaz8pCi0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlQcm9qZWN0R3JvdXAudGhpcy5zZWxlY3RlZFByb2plY3RDaGFuZ2VkKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiSmF2YVByb2plY3RXaXphcmRQYWdlIHByb2plY3QgY29tYm8tYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGNhbGxiYWNrcyAqKioqKioqKioqCi0KLQkJdm9pZCBzZWxlY3RlZFByb2plY3RDaGFuZ2VkKCkgewotCQkJcHJvamVjdENoYW5nZWQoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcm9qZWN0Q29tYm8uZ2V0VGV4dCgpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQkJCi0JCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByb2plY3RDb21ibygpIHsKLQkJCQotCQkJdGhpcy5wcm9qZWN0Q29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkKLQkJCWZvciAoU3RyaW5nIG5hbWUgOiB0aGlzLmdldFNvcnRlZEphdmFQcm9qZWN0c05hbWVzKCkpIHsKLQkJCQl0aGlzLnByb2plY3RDb21iby5hZGQobmFtZSk7Ci0JCQl9Ci0JCQlpZihqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wcm9qZWN0Q29tYm8uc2VsZWN0KHRoaXMucHJvamVjdENvbWJvLmluZGV4T2YoamF2YVByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmdbXSBnZXRTb3J0ZWRKYXZhUHJvamVjdHNOYW1lcygpIHsKLQkJCXJldHVybiBBcnJheVRvb2xzLnNvcnQodGhpcy5nZXRKYXZhUHJvamVjdHNOYW1lcygpKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gZ2V0SmF2YVByb2plY3RzTmFtZXMoKSB7Ci0JCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJUHJvamVjdCwgU3RyaW5nPih0aGlzLmdldEphdmFQcm9qZWN0cygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQkJCQlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCW5ldyBTdHJpbmdbMF0pOwotCQl9Ci0JCQotCQlwcml2YXRlIEl0ZXJhYmxlPElQcm9qZWN0PiBnZXRKYXZhUHJvamVjdHMoKSB7Ci0JCSAgIHJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SVByb2plY3Q+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UHJvamVjdHMoKSkpIHsKLQkJICAgICAgQE92ZXJyaWRlCi0JCSAgICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJUHJvamVjdCBuZXh0KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXR1cm4gbmV4dC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJICAgICAgfQotCQkgICB9OwotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVyYXRvcjxJUHJvamVjdD4gZ2V0UHJvamVjdHMoKSB7Ci0JCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8SVByb2plY3Q+KFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKSk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCi0JCXByaXZhdGUgTGFiZWwgYnVpbGRMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQlwcml2YXRlIENvbWJvIGJ1aWxkUHJvamVjdENvbWJvKENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlDb21ibyBwcm9qZWN0Q29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCXByb2plY3RDb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXByb2plY3RDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQlyZXR1cm4gcHJvamVjdENvbWJvOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E5ODQyNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLkpwdEpheGJVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC5KcHRKYXhiVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9PUFRJT04gPSAiLXRhcmdldCAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEV4dGVuc2lvbk9wdGlvbnNDb21wb3NpdGUgYWRkaXRpb25hbEFyZ3NDb21wb3NpdGU7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJDbGFzc2VzIEdlbmVyYXRvciBFeHRlbnNpb24gT3B0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnNldFRpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlX2Rlc2MpOwotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRoaXMuYWRkaXRpb25hbEFyZ3NDb21wb3NpdGUgPSBuZXcgRXh0ZW5zaW9uT3B0aW9uc0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIGFsbG93c0V4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmFkZGl0aW9uYWxBcmdzQ29tcG9zaXRlLmFsbG93c0V4dGVuc2lvbnMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc3BhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmFkZGl0aW9uYWxBcmdzQ29tcG9zaXRlLmdldENsYXNzcGF0aCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxBcmdzKCkgewotCQlyZXR1cm4gdGhpcy5hZGRpdGlvbmFsQXJnc0NvbXBvc2l0ZS5nZXRBZGRpdGlvbmFsQXJncygpOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldEZhY2V0VmVyc2lvbigpIHsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gcHJvamVjdEZhY2V0VmVyc2lvbiA9IHRoaXMuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpOwotCQlyZXR1cm4gKHByb2plY3RGYWNldFZlcnNpb24gPT0gbnVsbCkgPyBudWxsIDogcHJvamVjdEZhY2V0VmVyc2lvbi5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgewotCQlJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZFByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUodGhpcy5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCWNhdGNoKENvcmVFeGNlcHRpb24gZSkgewotCQkJSnB0SmF4YlVpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoZmFjZXRlZFByb2plY3QgPT0gbnVsbCkgPyBudWxsIDogZmFjZXRlZFByb2plY3QuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihKYXhiRmFjZXQuRkFDRVQpOwotCX0KLQotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuICgoQ2xhc3Nlc0dlbmVyYXRvcldpemFyZCl0aGlzLmdldFdpemFyZCgpKS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBFeHRlbnNpb25PcHRpb25zQ29tcG9zaXRlICoqKioqKioqKioKLQotCWNsYXNzIEV4dGVuc2lvbk9wdGlvbnNDb21wb3NpdGUgewotCi0JCXByaXZhdGUgYm9vbGVhbiBhbGxvd3NFeHRlbnNpb25zOwotCQlwcml2YXRlIGZpbmFsIFRleHQgY2xhc3NwYXRoVGV4dDsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gYWxsb3dzRXh0ZW5zaW9uc0NoZWNrQm94OwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBUZXh0IGFkZGl0aW9uYWxBcmdzVGV4dDsKLQkJCi0JCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCQlwcml2YXRlIEV4dGVuc2lvbk9wdGlvbnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuYWxsb3dzRXh0ZW5zaW9ucyA9IGZhbHNlOwotCQkJCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuZ3JvdXAsIEhFTFBfQ09OVEVYVF9JRCk7Ci0JCQkKLQkJCXRoaXMuYWxsb3dzRXh0ZW5zaW9uc0NoZWNrQm94ID0gdGhpcy5idWlsZEFsbG93c0V4dGVuc2lvbnNDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRBbGxvd3NFeHRlbnNpb25zU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJCS8vIENsYXNzcGF0aAotCQkJTGFiZWwgY2xhc3NwYXRoTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQljbGFzc3BhdGhMYWJlbC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9jbGFzc3BhdGgpOwotCQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJCWNsYXNzcGF0aExhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJdGhpcy5jbGFzc3BhdGhUZXh0ID0gdGhpcy5idWlsZENsYXNzcGF0aFRleHQoY29tcG9zaXRlKTsKLQkJCQotCQkJTGFiZWwgYWRkaXRpb25hbEFyZ3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWFkZGl0aW9uYWxBcmdzTGFiZWwuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2VfYWRkaXRpb25hbEFyZ3VtZW50cyk7Ci0JCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJYWRkaXRpb25hbEFyZ3NMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXRoaXMuYWRkaXRpb25hbEFyZ3NUZXh0ID0gdGhpcy5idWlsZEFkZGl0aW9uYWxBcmdzVGV4dChjb21wb3NpdGUpOwotCQkJaWYoICEgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRGYWNldFZlcnNpb24oKSkpIHsKLQkJCQl0aGlzLmFkZGl0aW9uYWxBcmdzVGV4dC5zZXRUZXh0KFRBUkdFVF9PUFRJT04gKyBnZXRGYWNldFZlcnNpb24oKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0JCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZEFsbG93c0V4dGVuc2lvbnNDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQljaGVja0JveC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zV2l6YXJkUGFnZV9hbGxvd0V4dGVuc2lvbnMpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuYWxsb3dzRXh0ZW5zaW9ucygpKTsKLQkJCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCi0JCXByaXZhdGUgVGV4dCBidWlsZENsYXNzcGF0aFRleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAzOwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQl0ZXh0LnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQotCQlwcml2YXRlIFRleHQgYnVpbGRBZGRpdGlvbmFsQXJnc1RleHQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEluZGVudCA9IDE7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gdGV4dC5nZXRMaW5lSGVpZ2h0KCkgKiAxMDsKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRBbGxvd3NFeHRlbnNpb25zU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJRXh0ZW5zaW9uT3B0aW9uc0NvbXBvc2l0ZS50aGlzLnNldEFsbG93c0V4dGVuc2lvbnMoCi0JCQkJCQlFeHRlbnNpb25PcHRpb25zQ29tcG9zaXRlLnRoaXMuYWxsb3dzRXh0ZW5zaW9uc0NoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGxvd3NFeHRlbnNpb25zKCkgewotCQkJcmV0dXJuIHRoaXMuYWxsb3dzRXh0ZW5zaW9uczsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0QWxsb3dzRXh0ZW5zaW9ucyhib29sZWFuIGFsbG93c0V4dGVuc2lvbnMpewotCQkJdGhpcy5hbGxvd3NFeHRlbnNpb25zID0gYWxsb3dzRXh0ZW5zaW9uczsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NwYXRoKCkgewotCQkJcmV0dXJuIHRoaXMuY2xhc3NwYXRoVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEFyZ3MoKSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRpdGlvbmFsQXJnc1RleHQuZ2V0VGV4dCgpOwotCQl9Ci0JCQotCX0JCi19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL0NsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjkzMWUxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL0NsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZQotewotCXByaXZhdGUgUHJveHlPcHRpb25zQ29tcG9zaXRlIHByb3h5T3B0aW9uc0NvbXBvc2l0ZTsKLQlwcml2YXRlIE9wdGlvbnMxQ29tcG9zaXRlIG9wdGlvbnMxQ29tcG9zaXRlOwotCXByaXZhdGUgT3B0aW9uczJDb21wb3NpdGUgb3B0aW9uczJDb21wb3NpdGU7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlKCkgewotCQlzdXBlcigiQ2xhc3NlcyBHZW5lcmF0b3IgT3B0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5zZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdGl0bGUpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9kZXNjKTsKLQl9Ci0JCQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXRoaXMucHJveHlPcHRpb25zQ29tcG9zaXRlID0gbmV3IFByb3h5T3B0aW9uc0NvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCXRoaXMuYnVpbGRPcHRpb25zQ29tcG9zaXRlcyhjb21wb3NpdGUpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkT3B0aW9uc0NvbXBvc2l0ZXMoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIHRydWUpKTsKLQkJCi0JCXRoaXMub3B0aW9uczFDb21wb3NpdGUgPSBuZXcgT3B0aW9uczFDb21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQl0aGlzLm9wdGlvbnMyQ29tcG9zaXRlID0gbmV3IE9wdGlvbnMyQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3h5KCkgewotCQlyZXR1cm4gdGhpcy5wcm94eU9wdGlvbnNDb21wb3NpdGUuZ2V0UHJveHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3h5RmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJveHlPcHRpb25zQ29tcG9zaXRlLmdldFByb3h5RmlsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzU3RyaWN0VmFsaWRhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczFDb21wb3NpdGUudXNlc1N0cmljdFZhbGlkYXRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFrZXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczFDb21wb3NpdGUubWFrZXNSZWFkT25seSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbigpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczFDb21wb3NpdGUuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuKCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHN1cHByZXNzZXNIZWFkZXJHZW4oKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMxQ29tcG9zaXRlLnN1cHByZXNzZXNIZWFkZXJHZW4oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWZXJib3NlKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMUNvbXBvc2l0ZS5pc1ZlcmJvc2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNRdWlldCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczFDb21wb3NpdGUuaXNRdWlldCgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzWG1sU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMkNvbXBvc2l0ZS50cmVhdHNBc1htbFNjaGVtYSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmcoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnRyZWF0c0FzUmVsYXhOZygpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0KCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMkNvbXBvc2l0ZS50cmVhdHNBc1JlbGF4TmdDb21wYWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzRHRkKCkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zMkNvbXBvc2l0ZS50cmVhdHNBc0R0ZCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1dzZGwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnRyZWF0c0FzV3NkbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93c1ZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnNob3dzVmVyc2lvbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93c0hlbHAoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMyQ29tcG9zaXRlLnNob3dzSGVscCgpOwotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29udHJvbHMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBCdXR0b24gYnVpbGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIsIGludCB2ZXJ0aWNhbEluZGVudCkgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQ9IHZlcnRpY2FsSW5kZW50OwotCQljaGVja0JveC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY2hlY2tCb3guc2V0VGV4dCh0ZXh0KTsKLQkJY2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gY2hlY2tCb3g7Ci0JfQotCi0JcHJvdGVjdGVkIEJ1dHRvbiBidWlsZFJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciwgaW50IGhvcml6b250YWxTcGFuKSB7Ci0JCUJ1dHRvbiByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IGhvcml6b250YWxTcGFuOwotCQlyYWRpb0J1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmFkaW9CdXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJcmFkaW9CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gcmFkaW9CdXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIFRleHQgYnVpbGRUZXh0KENvbXBvc2l0ZSBwYXJlbnQsIGludCBob3Jpem9udGFsU3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZVRleHQoVGV4dCB0ZXh0KSB7Ci0JCXRleHQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCXRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIG1ha2VSZWxhdGl2ZVRvUHJvamVjdFBhdGgoU3RyaW5nIGZpbGVQYXRoKSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVQYXRoKTsKLQkJSVBhdGggcmVsYXRpdmVQYXRoID0gcGF0aC5tYWtlUmVsYXRpdmVUbyh0aGlzLmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpKTsKLQkJcmV0dXJuIHJlbGF0aXZlUGF0aC50b09TU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gKChDbGFzc2VzR2VuZXJhdG9yV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCX0KLQotCS8vICoqKioqKioqKiogUHJveHlPcHRpb25zQ29tcG9zaXRlICoqKioqKioqKioKLQotCWNsYXNzIFByb3h5T3B0aW9uc0NvbXBvc2l0ZSB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBub1Byb3h5UmFkaW9CdXR0b247Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBwcm94eVJhZGlvQnV0dG9uOwotCQlwcml2YXRlIGZpbmFsIFRleHQgcHJveHlUZXh0OwotCi0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHByb3h5RmlsZVJhZGlvQnV0dG9uOwotCQlwcml2YXRlIGZpbmFsIFRleHQgcHJveHlGaWxlVGV4dDsKLQkJcHJpdmF0ZSBCdXR0b24gYnJvd3NlQnV0dG9uOwotCQkKLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJcHJpdmF0ZSBQcm94eU9wdGlvbnNDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoKTsKLQkJCUdyb3VwIHByb3h5R3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKTsKLQkJCXByb3h5R3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlwcm94eUdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJcHJveHlHcm91cC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUdyb3VwKTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgcHJveHlCdXR0b25MaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm94eVJhZGlvQnV0dG9uTGlzdGVuZXIoKTsKLQotCQkJdGhpcy5ub1Byb3h5UmFkaW9CdXR0b24gPSBidWlsZFJhZGlvQnV0dG9uKHByb3h5R3JvdXAsIAotCQkJCQkJCQkJSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX25vUHJveHksIHByb3h5QnV0dG9uTGlzdGVuZXIsIDMpOwotCQkJCi0JCQl0aGlzLnByb3h5UmFkaW9CdXR0b24gPSBidWlsZFJhZGlvQnV0dG9uKHByb3h5R3JvdXAsIAotCQkJCQkJCQkJSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3Byb3h5LCBwcm94eUJ1dHRvbkxpc3RlbmVyLCAxKTsKLQkJCXRoaXMucHJveHlUZXh0ID0gYnVpbGRUZXh0KHByb3h5R3JvdXAsIDEpOwotCQkJbmV3IExhYmVsKHByb3h5R3JvdXAsIFNXVC5XUkFQKTsgLy9lbXB0eSBsYWJlbCBmb3Igc3BhY2luZwotCi0JCQl0aGlzLnByb3h5RmlsZVJhZGlvQnV0dG9uID0gYnVpbGRSYWRpb0J1dHRvbihwcm94eUdyb3VwLCAKLQkJCQkJCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9wcm94eUZpbGUsIHByb3h5QnV0dG9uTGlzdGVuZXIsIDEpOwotCQkJdGhpcy5wcm94eUZpbGVUZXh0ID0gYnVpbGRUZXh0KHByb3h5R3JvdXAsIDEpOwotCQkJdGhpcy5icm93c2VCdXR0b24gPSB0aGlzLmJ1aWxkQnJvd3NlQnV0dG9uKHByb3h5R3JvdXApOwotCQkJCi0JCQl0aGlzLm5vUHJveHlSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQl0aGlzLnByb3h5QnV0dG9uQ2hhbmdlZCgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRCcm93c2VCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkJLy8gQnJvd3NlIGJ1dHRvbnMKLQkJCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJCQlTdHJpbmcgZmlsZVBhdGggPSBwcm9tcHRQcm94eUZpbGUoKTsKLQkJCQkJaWYgKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZVBhdGgpKSB7Ci0JCQkJCQlQcm94eU9wdGlvbnNDb21wb3NpdGUudGhpcy5wcm94eUZpbGVUZXh0LnNldFRleHQobWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChmaWxlUGF0aCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gYnJvd3NlQnV0dG9uOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFByb3h5UmFkaW9CdXR0b25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlwcm94eUJ1dHRvbkNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb3h5QnV0dG9uQ2hhbmdlZCgpIHsKLQkJCWJvb2xlYW4gdXNlc1Byb3h5ID0gISB0aGlzLm5vUHJveHlSYWRpb0J1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICh1c2VzUHJveHkpIHsKLQkJCQlpZiAodGhpcy5wcm94eVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXRoaXMucHJveHlUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJCWRpc2FibGVUZXh0KHRoaXMucHJveHlGaWxlVGV4dCk7Ci0JCQkJCXRoaXMuYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0aGlzLnByb3h5RmlsZVJhZGlvQnV0dG9uLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJCXRoaXMucHJveHlGaWxlVGV4dC5zZXRFbmFibGVkKHRydWUpOwotCQkJCQl0aGlzLmJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJCQlkaXNhYmxlVGV4dCh0aGlzLnByb3h5VGV4dCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZGlzYWJsZVRleHQodGhpcy5wcm94eVRleHQpOwotCQkJCWRpc2FibGVUZXh0KHRoaXMucHJveHlGaWxlVGV4dCk7Ci0JCQkJdGhpcy5icm93c2VCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQkvKioKLQkJICogVGhlIEFkZCBidXR0b24gd2FzIGNsaWNrZWQsIGl0cyBhY3Rpb24gaW52b2tlcyB0aGlzIGFjdGlvbiB3aGljaCBzaG91bGQKLQkJICogcHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZpbGUgYW5kIHJldHVybiBpdC4KLQkJICovCi0JCXByaXZhdGUgU3RyaW5nIHByb21wdFByb3h5RmlsZSgpIHsKLQkJCUlXaXphcmQgd2l6YXJkID0gQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlLnRoaXMuZ2V0V2l6YXJkKCk7Ci0JCQlTdHJpbmcgcHJvamVjdFBhdGggPSAoKENsYXNzZXNHZW5lcmF0b3JXaXphcmQpd2l6YXJkKS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0KLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfY2hvb3NlQVByb3h5RmlsZSk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwcm9qZWN0UGF0aCk7Ci0KLQkJCXJldHVybiBkaWFsb2cub3BlbigpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRQcm94eSgpIHsKLQkJCXJldHVybiB0aGlzLnByb3h5VGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3h5RmlsZSgpIHsKLQkJCXJldHVybiB0aGlzLnByb3h5RmlsZVRleHQuZ2V0VGV4dCgpOwotCQl9Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBPcHRpb25zMUNvbXBvc2l0ZSAqKioqKioqKioqCi0KLQljbGFzcyBPcHRpb25zMUNvbXBvc2l0ZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHVzZXNTdHJpY3RWYWxpZGF0aW9uOwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiB1c2VzU3RyaWN0VmFsaWRhdGlvbkNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBtYWtlc1JlYWRPbmx5OwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBtYWtlc1JlYWRPbmx5Q2hlY2tCb3g7Ci0JCQotCQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuOwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW5DaGVja0JveDsKLQotCQlwcml2YXRlIGJvb2xlYW4gc3VwcHJlc3Nlc0hlYWRlckdlbjsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gc3VwcHJlc3Nlc0hlYWRlckdlbkNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1ZlcmJvc2U7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGlzVmVyYm9zZUNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1F1aWV0OwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBpc1F1aWV0Q2hlY2tCb3g7Ci0JCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlPcHRpb25zMUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbiA9IHRydWU7Ci0JCQl0aGlzLm1ha2VzUmVhZE9ubHkgPSBmYWxzZTsKLQkJCXRoaXMuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuID0gZmFsc2U7Ci0JCQl0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW4gPSBmYWxzZTsKLQkJCXRoaXMuaXNWZXJib3NlID0gZmFsc2U7Ci0JCQl0aGlzLmlzUXVpZXQgPSBmYWxzZTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJCi0JCQl0aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkVXNlc1N0cmljdFZhbGlkYXRpb25DaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRVc2VzU3RyaWN0VmFsaWRhdGlvblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5tYWtlc1JlYWRPbmx5Q2hlY2tCb3ggPSB0aGlzLmJ1aWxkTWFrZXNSZWFkT25seUNoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZE1ha2VzUmVhZE9ubHlTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkU3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuQ2hlY2tCb3goY29tcG9zaXRlLCB0aGlzLmJ1aWxkU3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQl0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW5DaGVja0JveCA9IHRoaXMuYnVpbGRTdXBwcmVzc2VzSGVhZGVyR2VuQ2hlY2tCb3goY29tcG9zaXRlLCB0aGlzLmJ1aWxkU3VwcHJlc3Nlc0hlYWRlckdlblNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5pc1ZlcmJvc2VDaGVja0JveCA9IHRoaXMuYnVpbGRJc1ZlcmJvc2VDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRJc1ZlcmJvc2VTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMuaXNRdWlldENoZWNrQm94ID0gdGhpcy5idWlsZElzUXVpZXRDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRJc1F1aWV0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkVXNlc1N0cmljdFZhbGlkYXRpb25DaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV91c2VTdHJpY3RWYWxpZGF0aW9uLCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbigpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkTWFrZXNSZWFkT25seUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlCdXR0b24gY2hlY2tCb3ggPSBidWlsZENoZWNrQm94KHBhcmVudCwgSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX21ha2VSZWFkT25seSwgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMubWFrZXNSZWFkT25seSgpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkU3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Vfc3VwcHJlc3NQYWNrYWdlSW5mb0dlbiwgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0JCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZFN1cHByZXNzZXNIZWFkZXJHZW5DaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9zdXBwcmVzc2VzSGVhZGVyR2VuLCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5zdXBwcmVzc2VzSGVhZGVyR2VuKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0JCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkSXNWZXJib3NlQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdmVyYm9zZSwgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuaXNWZXJib3NlKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0JCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZElzUXVpZXRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV9xdWlldCwgbGlzdGVuZXIsIDUpOwotCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMuaXNRdWlldCgpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCi0JCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQkJCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRVc2VzU3RyaWN0VmFsaWRhdGlvblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0VXNlc1N0cmljdFZhbGlkYXRpb24oCi0JCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkTWFrZXNSZWFkT25seVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0TWFrZXNSZWFkT25seSgKLQkJCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMubWFrZXNSZWFkT25seUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT3B0aW9uczFDb21wb3NpdGUudGhpcy5zZXRTdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oCi0JCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLnN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU3VwcHJlc3Nlc0hlYWRlckdlblNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0U3VwcHJlc3Nlc0hlYWRlckdlbigKLQkJCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc3VwcHJlc3Nlc0hlYWRlckdlbkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZElzVmVyYm9zZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMxQ29tcG9zaXRlLnRoaXMuc2V0SXNWZXJib3NlKAotCQkJCQkJT3B0aW9uczFDb21wb3NpdGUudGhpcy5pc1ZlcmJvc2VDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZElzUXVpZXRTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLnNldElzUXVpZXQoCi0JCQkJCQlPcHRpb25zMUNvbXBvc2l0ZS50aGlzLmlzUXVpZXRDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogZ2V0dGVycy9zZXR0ZXJzICoqKioqKioqKgotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlc1N0cmljdFZhbGlkYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy51c2VzU3RyaWN0VmFsaWRhdGlvbjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VXNlc1N0cmljdFZhbGlkYXRpb24oYm9vbGVhbiB1c2VzU3RyaWN0VmFsaWRhdGlvbil7Ci0JCQl0aGlzLnVzZXNTdHJpY3RWYWxpZGF0aW9uID0gdXNlc1N0cmljdFZhbGlkYXRpb247Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIG1ha2VzUmVhZE9ubHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYWtlc1JlYWRPbmx5OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRNYWtlc1JlYWRPbmx5KGJvb2xlYW4gbWFrZXNSZWFkT25seSl7Ci0JCQl0aGlzLm1ha2VzUmVhZE9ubHkgPSBtYWtlc1JlYWRPbmx5OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwcmVzc2VzUGFja2FnZUluZm9HZW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdXBwcmVzc2VzUGFja2FnZUluZm9HZW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbihib29sZWFuIHN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbil7Ci0JCQl0aGlzLnN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbiA9IHN1cHByZXNzZXNQYWNrYWdlSW5mb0dlbjsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc3VwcHJlc3Nlc0hlYWRlckdlbigpIHsKLQkJCXJldHVybiB0aGlzLnN1cHByZXNzZXNIZWFkZXJHZW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFN1cHByZXNzZXNIZWFkZXJHZW4oYm9vbGVhbiBzdXBwcmVzc2VzSGVhZGVyR2VuKXsKLQkJCXRoaXMuc3VwcHJlc3Nlc0hlYWRlckdlbiA9IHN1cHByZXNzZXNIZWFkZXJHZW47Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIGlzVmVyYm9zZSgpIHsKLQkJCXJldHVybiB0aGlzLmlzVmVyYm9zZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0SXNWZXJib3NlKGJvb2xlYW4gaXNWZXJib3NlKXsKLQkJCXRoaXMuaXNWZXJib3NlID0gaXNWZXJib3NlOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1aWV0KCkgewotCQkJcmV0dXJuIHRoaXMuaXNRdWlldDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0SXNRdWlldChib29sZWFuIGlzUXVpZXQpewotCQkJdGhpcy5pc1F1aWV0ID0gaXNRdWlldDsKLQkJfQotCi0JfQotCi0JLy8gKioqKioqKioqKiBPcHRpb25zMkNvbXBvc2l0ZSAqKioqKioqKioqCi0KLQljbGFzcyBPcHRpb25zMkNvbXBvc2l0ZSB7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHRyZWF0c0FzWG1sU2NoZW1hOwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiB0cmVhdHNBc1htbFNjaGVtYUNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc1JlbGF4Tmc7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHRyZWF0c0FzUmVsYXhOZ0NoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0OwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0Q2hlY2tCb3g7Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHRyZWF0c0FzRHRkOwotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiB0cmVhdHNBc0R0ZENoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiB0cmVhdHNBc1dzZGw7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHRyZWF0c0FzV3NkbENoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBzaG93c1ZlcnNpb247Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHNob3dzVmVyc2lvbkNoZWNrQm94OwotCi0JCXByaXZhdGUgYm9vbGVhbiBzaG93c0hlbHA7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIHNob3dzSGVscENoZWNrQm94OwotCQkKLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkJT3B0aW9uczJDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMudHJlYXRzQXNYbWxTY2hlbWEgPSBmYWxzZTsKLQkJCXRoaXMudHJlYXRzQXNSZWxheE5nID0gZmFsc2U7Ci0JCQl0aGlzLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QgPSBmYWxzZTsKLQkJCXRoaXMudHJlYXRzQXNEdGQgPSBmYWxzZTsKLQkJCXRoaXMudHJlYXRzQXNXc2RsID0gZmFsc2U7Ci0JCQl0aGlzLnNob3dzVmVyc2lvbiA9IGZhbHNlOwotCQkJdGhpcy5zaG93c0hlbHAgPSBmYWxzZTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCQl0aGlzLnRyZWF0c0FzWG1sU2NoZW1hQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJlYXRzQXNYbWxTY2hlbWFDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRUcmVhdHNBc1htbFNjaGVtYVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy50cmVhdHNBc1JlbGF4TmdDaGVja0JveCA9IHRoaXMuYnVpbGRUcmVhdHNBc1JlbGF4TmdDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRUcmVhdHNBc1JlbGF4TmdTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMudHJlYXRzQXNSZWxheE5nQ29tcGFjdENoZWNrQm94ID0gdGhpcy5idWlsZFRyZWF0c0FzUmVsYXhOZ0NvbXBhY3RDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRUcmVhdHNBc1JlbGF4TmdDb21wYWN0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQl0aGlzLnRyZWF0c0FzRHRkQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkVHJlYXRzQXNEdGRDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRUcmVhdHNBc0R0ZFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy50cmVhdHNBc1dzZGxDaGVja0JveCA9IHRoaXMuYnVpbGRUcmVhdHNBc1dzZGxDaGVja0JveChjb21wb3NpdGUsIHRoaXMuYnVpbGRUcmVhdHNBc1dzZGxTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMuc2hvd3NWZXJzaW9uQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkVmVyc2lvbkNoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZFZlcnNpb25TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCXRoaXMuc2hvd3NIZWxwQ2hlY2tCb3ggPSB0aGlzLmJ1aWxkSGVscENoZWNrQm94KGNvbXBvc2l0ZSwgdGhpcy5idWlsZEhlbHBTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0JCQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZFRyZWF0c0FzWG1sU2NoZW1hQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNYbWxTY2hlbWEsIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnRyZWF0c0FzWG1sU2NoZW1hKCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRUcmVhdHNBc1JlbGF4TmdDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1JlbGF4TmcsIGxpc3RlbmVyLCA1KTsKLQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnRyZWF0c0FzUmVsYXhOZygpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCQlwcml2YXRlIEJ1dHRvbiBidWlsZFRyZWF0c0FzUmVsYXhOZ0NvbXBhY3RDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJQnV0dG9uIGNoZWNrQm94ID0gYnVpbGRDaGVja0JveChwYXJlbnQsIEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zV2l6YXJkUGFnZV90cmVhdHNBc1JlbGF4TmdDb21wYWN0LCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy50cmVhdHNBc1JlbGF4TmdDb21wYWN0KCkpOwotCQkJcmV0dXJuIGNoZWNrQm94OwotCQl9Ci0KLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRUcmVhdHNBc0R0ZENoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlCdXR0b24gY2hlY2tCb3ggPSBidWlsZENoZWNrQm94KHBhcmVudCwgSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlX3RyZWF0c0FzRHRkLCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy50cmVhdHNBc0R0ZCgpKTsKLQkJCXJldHVybiBjaGVja0JveDsKLQkJfQotCi0JCXByaXZhdGUgQnV0dG9uIGJ1aWxkVHJlYXRzQXNXc2RsQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2VfdHJlYXRzQXNXc2RsLCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy50cmVhdHNBc1dzZGwoKSk7Ci0JCQlyZXR1cm4gY2hlY2tCb3g7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRWZXJzaW9uQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Vfc2hvd3NWZXJzaW9uLCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5zaG93c1ZlcnNpb24oKSk7Ci0JCQlyZXR1cm4gY2hlY2tCb3g7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBCdXR0b24gYnVpbGRIZWxwQ2hlY2tCb3goQ29tcG9zaXRlIHBhcmVudCwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCUJ1dHRvbiBjaGVja0JveCA9IGJ1aWxkQ2hlY2tCb3gocGFyZW50LCBKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Vfc2hvd3NIZWxwLCBsaXN0ZW5lciwgNSk7Ci0JCQljaGVja0JveC5zZXRTZWxlY3Rpb24odGhpcy5zaG93c0hlbHAoKSk7Ci0JCQlyZXR1cm4gY2hlY2tCb3g7Ci0JCX0KLQkJCi0JCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVHJlYXRzQXNYbWxTY2hlbWFTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnNldFRyZWF0c0FzWG1sU2NoZW1hKAotCQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy50cmVhdHNBc1htbFNjaGVtYUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRyZWF0c0FzUmVsYXhOZ1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMuc2V0VHJlYXRzQXNSZWxheE5nKAotCQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy50cmVhdHNBc1JlbGF4TmdDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRyZWF0c0FzUmVsYXhOZ0NvbXBhY3RTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnNldFRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QoCi0JCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3RDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRyZWF0c0FzRHRkU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy5zZXRUcmVhdHNBc0R0ZCgKLQkJCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMudHJlYXRzQXNEdGRDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFRyZWF0c0FzV3NkbFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMuc2V0VHJlYXRzQXNXc2RsKAotCQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy50cmVhdHNBc1dzZGxDaGVja0JveC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFZlcnNpb25TZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJCX0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnNldFNob3dzVmVyc2lvbigKLQkJCQkJCU9wdGlvbnMyQ29tcG9zaXRlLnRoaXMuc2hvd3NWZXJzaW9uQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRIZWxwU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJT3B0aW9uczJDb21wb3NpdGUudGhpcy5zZXRTaG93c0hlbHAoCi0JCQkJCQlPcHRpb25zMkNvbXBvc2l0ZS50aGlzLnNob3dzSGVscENoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBnZXR0ZXIvc2V0dGVyICoqKioqKioqKgotCi0JCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzWG1sU2NoZW1hKCkgewotCQkJcmV0dXJuIHRoaXMudHJlYXRzQXNYbWxTY2hlbWE7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFRyZWF0c0FzWG1sU2NoZW1hKGJvb2xlYW4gdHJlYXRzQXNYbWxTY2hlbWEpewotCQkJdGhpcy50cmVhdHNBc1htbFNjaGVtYSA9IHRyZWF0c0FzWG1sU2NoZW1hOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy50cmVhdHNBc1JlbGF4Tmc7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFRyZWF0c0FzUmVsYXhOZyhib29sZWFuIHRyZWF0c0FzUmVsYXhOZyl7Ci0JCQl0aGlzLnRyZWF0c0FzUmVsYXhOZyA9IHRyZWF0c0FzUmVsYXhOZzsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdHJlYXRzQXNSZWxheE5nQ29tcGFjdCgpIHsKLQkJCXJldHVybiB0aGlzLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3Q7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QoYm9vbGVhbiB0cmVhdHNBc1JlbGF4TmdDb21wYWN0KXsKLQkJCXRoaXMudHJlYXRzQXNSZWxheE5nQ29tcGFjdCA9IHRyZWF0c0FzUmVsYXhOZ0NvbXBhY3Q7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIHRyZWF0c0FzRHRkKCkgewotCQkJcmV0dXJuIHRoaXMudHJlYXRzQXNEdGQ7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFRyZWF0c0FzRHRkKGJvb2xlYW4gdHJlYXRzQXNEdGQpewotCQkJdGhpcy50cmVhdHNBc0R0ZCA9IHRyZWF0c0FzRHRkOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgYm9vbGVhbiB0cmVhdHNBc1dzZGwoKSB7Ci0JCQlyZXR1cm4gdGhpcy50cmVhdHNBc1dzZGw7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIHNldFRyZWF0c0FzV3NkbChib29sZWFuIHRyZWF0c0FzV3NkbCl7Ci0JCQl0aGlzLnRyZWF0c0FzV3NkbCA9IHRyZWF0c0FzV3NkbDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIGJvb2xlYW4gc2hvd3NWZXJzaW9uKCkgewotCQkJcmV0dXJuIHRoaXMuc2hvd3NWZXJzaW9uOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRTaG93c1ZlcnNpb24oYm9vbGVhbiBzaG93c1ZlcnNpb24pewotCQkJdGhpcy5zaG93c1ZlcnNpb24gPSBzaG93c1ZlcnNpb247Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIHNob3dzSGVscCgpIHsKLQkJCXJldHVybiB0aGlzLnNob3dzSGVscDsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgc2V0U2hvd3NIZWxwKGJvb2xlYW4gc2hvd3NIZWxwKXsKLQkJCXRoaXMuc2hvd3NIZWxwID0gc2hvd3NIZWxwOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvcldpemFyZC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvcldpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mjg2YzY5Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL0NsYXNzZXNHZW5lcmF0b3JXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5PcHRpb25hbE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aXphcmRzLkphdmFQcm9qZWN0V2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5TY2hlbWFMaWJyYXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuLkNsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuLkNsYXNzZXNHZW5lcmF0b3JPcHRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuLkdlbmVyYXRlSmF4YkNsYXNzZXNKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS54c2QuWHNkVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLlhTREltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLQotLyoqCi0gKiAgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZAotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZAotCQlleHRlbmRzIFdpemFyZAotCQlpbXBsZW1lbnRzIElXb3JrYmVuY2hXaXphcmQgewotCQotCXByaXZhdGUgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCXByaXZhdGUgSUZpbGUgcHJlc2VsZWN0ZWRYc2RGaWxlOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb247Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb25Gb2xkZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0UGFja2FnZTsKLQlwcml2YXRlIFN0cmluZyBjYXRhbG9nOwotCXByaXZhdGUgYm9vbGVhbiB1c2VzTW94eTsKLQlwcml2YXRlIFN0cmluZ1tdIGJpbmRpbmdzRmlsZU5hbWVzOwotCQotCXByaXZhdGUgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnMgZ2VuZXJhdG9yT3B0aW9uczsKLQlwcml2YXRlIENsYXNzZXNHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zIGdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnM7Ci0JCi0JcHJpdmF0ZSBKYXZhUHJvamVjdFdpemFyZFBhZ2UgcHJvamVjdFdpemFyZFBhZ2U7Ci0JcHJpdmF0ZSBTY2hlbWFXaXphcmRQYWdlIHNjaGVtYVdpemFyZFBhZ2U7Ci0JCi0JcHJpdmF0ZSBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZSBzZXR0aW5nc1BhZ2U7Ci0JcHJpdmF0ZSBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2Ugb3B0aW9uc1BhZ2U7Ci0JcHJpdmF0ZSBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9uc1dpemFyZFBhZ2UgZXh0ZW5zaW9uT3B0aW9uc1BhZ2U7Ci0JcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1zR2VuZXJhdGlvbjsKLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wZXJmb3Jtc0dlbmVyYXRpb24gPSB0cnVlOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZChJSmF2YVByb2plY3QgamF2YVByb2plY3QsIElGaWxlIHhzZEZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLnByZXNlbGVjdGVkWHNkRmlsZSA9IHhzZEZpbGU7Ci0JCXRoaXMucGVyZm9ybXNHZW5lcmF0aW9uID0gZmFsc2U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSVdvcmtiZW5jaFdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJCi0JCXRoaXMuc2V0V2luZG93VGl0bGUoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZF90aXRsZSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRKYXhiVWlJY29ucy5DTEFTU0VTX0dFTl9XSVpfQkFOTkVSKSk7Ci0JCXRoaXMuc2V0TmVlZHNQcm9ncmVzc01vbml0b3IodHJ1ZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSVdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlzdXBlci5hZGRQYWdlcygpOwotCQkKLQkJaWYgKHRoaXMuc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLmdldEphdmFQcm9qZWN0RnJvbVNlbGVjdGlvbih0aGlzLnNlbGVjdGlvbik7Ci0JCQkKLQkJCXRoaXMucHJvamVjdFdpemFyZFBhZ2UgPSBuZXcgSmF2YVByb2plY3RXaXphcmRQYWdlKHRoaXMuamF2YVByb2plY3QpOwotCQkJdGhpcy5wcm9qZWN0V2l6YXJkUGFnZS5zZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfdGl0bGUpOwotCQkJdGhpcy5wcm9qZWN0V2l6YXJkUGFnZS5zZXREZXNjcmlwdGlvbihKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfZGVzYyk7Ci0JCQl0aGlzLnByb2plY3RXaXphcmRQYWdlLnNldERlc3RpbmF0aW9uTGFiZWwoSnB0SmF4YlVpTWVzc2FnZXMuSmF2YVByb2plY3RXaXphcmRQYWdlX2Rlc3RpbmF0aW9uUHJvamVjdCk7Ci0JCQl0aGlzLmFkZFBhZ2UodGhpcy5wcm9qZWN0V2l6YXJkUGFnZSk7Ci0JCQkKLQkJCS8vIFNjaGVtYVdpemFyZFBhZ2UKLQkJCWlmICh0aGlzLnByZXNlbGVjdGVkWHNkRmlsZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5wcmVzZWxlY3RlZFhzZEZpbGUgPSBTY2hlbWFXaXphcmRQYWdlLmdldFNvdXJjZVNjaGVtYUZyb21TZWxlY3Rpb24odGhpcy5zZWxlY3Rpb24pOwotCQkJfQotCQkJCi0JCQlpZiAodGhpcy5wcmVzZWxlY3RlZFhzZEZpbGUgPT0gbnVsbCkgewotCQkJCXRoaXMuc2NoZW1hV2l6YXJkUGFnZSA9IG5ldyBTY2hlbWFXaXphcmRQYWdlKHRoaXMuc2VsZWN0aW9uKTsKLQkJCQl0aGlzLmFkZFBhZ2UodGhpcy5zY2hlbWFXaXphcmRQYWdlKTsKLQkJCX0KLQkJfQotCQkKLQkJdGhpcy5zZXR0aW5nc1BhZ2UgPSB0aGlzLmJ1aWxkQ2xhc3Nlc0dlbmVyYXRvclBhZ2UoKTsKLQkJdGhpcy5vcHRpb25zUGFnZSA9IHRoaXMuYnVpbGRDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1BhZ2UoKTsKLQkJdGhpcy5leHRlbnNpb25PcHRpb25zUGFnZSA9IHRoaXMuYnVpbGRFeHRlbnNpb25PcHRpb25zUGFnZSgpOwotCQkKLQkJdGhpcy5hZGRQYWdlKHRoaXMuc2V0dGluZ3NQYWdlKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMub3B0aW9uc1BhZ2UpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy5leHRlbnNpb25PcHRpb25zUGFnZSk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotICAgIAlyZXR1cm4gdGhpcy5zZXR0aW5nc1BhZ2UuaXNQYWdlQ29tcGxldGUoKSAKLSAgICAJCQkmJiB0aGlzLm9wdGlvbnNQYWdlLmlzUGFnZUNvbXBsZXRlKCkgCi0gICAgCQkJJiYgdGhpcy5leHRlbnNpb25PcHRpb25zUGFnZS5pc1BhZ2VDb21wbGV0ZSgpOwotICAgIH0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQkKLQkJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IChXaXphcmRQYWdlKWdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0JCWlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAoISBjdXJyZW50UGFnZS5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdGhpcy5yZXRyaWV2ZUdlbmVyYXRvclNldHRpbmdzKCk7Ci0JCQl0aGlzLnJldHJpZXZlR2VuZXJhdG9yT3B0aW9ucygpOwotCQkJdGhpcy5yZXRyaWV2ZUdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMoKTsKLQkJCQotCQkJSUZvbGRlciBmb2xkZXIgPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcih0aGlzLmRlc3RpbmF0aW9uRm9sZGVyKTsKLQkJCXRoaXMuY3JlYXRlRm9sZGVySWZOb3RFeGlzdChmb2xkZXIpOwotCQl9Ci0KLQkJaWYgKHRoaXMucGVyZm9ybXNHZW5lcmF0aW9uKSB7Ci0JCQlpZiAoZGlzcGxheU92ZXJ3cml0aW5nQ2xhc3Nlc1dhcm5pbmcodGhpcy5nZW5lcmF0b3JPcHRpb25zKSkgewotCQkJCWdlbmVyYXRlSmF4YkNsYXNzZXMoKTsKLQkJCQlhZGRTY2hlbWFUb0xpYnJhcnkoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLSAgICAKLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLSAgICAKLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlpZih0aGlzLnByb2plY3RXaXphcmRQYWdlICE9IG51bGwpIHsKLQkJCXRoaXMuamF2YVByb2plY3QgPSB0aGlzLnByb2plY3RXaXphcmRQYWdlLmdldEphdmFQcm9qZWN0KCk7Ci0JCX0KLSAgICAJcmV0dXJuIHRoaXMuamF2YVByb2plY3Q7Ci0gICAgfQotCQotCS8qIG1heSBiZSBudWxsICovCi0JcHJpdmF0ZSBKYXhiUHJvamVjdCBnZXRKYXhiUHJvamVjdCgpIHsKLQkJcmV0dXJuIEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQcm9qZWN0KGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQl9Ci0JCi0JLyogcmV0dXJuIHRoZSBwaHlzaWNhbCBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hICovCi0JcHVibGljIFVSSSBnZXRMb2NhbFNjaGVtYVVyaSgpIHsKLQkJaWYgKHRoaXMucHJlc2VsZWN0ZWRYc2RGaWxlICE9IG51bGwpIHsKLQkJCXJldHVybiBVUkkuY3JlYXRlRmlsZVVSSSh0aGlzLnByZXNlbGVjdGVkWHNkRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuc2NoZW1hV2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5zY2hlbWFXaXphcmRQYWdlLmdldExvY2FsU2NoZW1hVVJJKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qIHJldHVybiB0aGUgdXJpIG9yIGZpbGUgcGxhdGZvcm0gcmVzb3VyY2UgdXJpIHVzZWQgZm9yIHNjaGVtYSByZXNvbHV0aW9uICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpIHsKLQkJaWYgKHRoaXMucHJlc2VsZWN0ZWRYc2RGaWxlICE9IG51bGwpIHsKLQkJCXJldHVybiBVUkkuY3JlYXRlUGxhdGZvcm1SZXNvdXJjZVVSSSh0aGlzLnByZXNlbGVjdGVkWHNkRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKS50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuc2NoZW1hV2l6YXJkUGFnZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5zY2hlbWFXaXphcmRQYWdlLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgbWV0aG9kcyAqKioqKioqKioqCi0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXREZXN0aW5hdGlvbkZvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZGVzdGluYXRpb25Gb2xkZXI7Ci0JfQotCQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0UGFja2FnZTsKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQkKLSAgICBwdWJsaWMgYm9vbGVhbiB1c2VzTW94eSgpIHsKLQkJcmV0dXJuIHRoaXMudXNlc01veHk7Ci0JfQotCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEJpbmRpbmdzRmlsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5iaW5kaW5nc0ZpbGVOYW1lczsKLQl9Ci0JCi0gICAgcHVibGljIENsYXNzZXNHZW5lcmF0b3JPcHRpb25zIGdldEdlbmVyYXRvck9wdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvck9wdGlvbnM7Ci0JfQotCQotICAgIHB1YmxpYyBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyBnZXRHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zOwotCX0KLQkKLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotICAgIAotCXB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAlpZihzZWxlY3Rpb24gPT0gbnVsbCkgewotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCX0KLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElKYXZhUHJvamVjdClmaXJzdEVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSAoKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCQlyZXR1cm4gZ2V0SmF2YVByb2plY3RGcm9tKHByb2plY3QpOwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChJSmF2YUVsZW1lbnQpZmlyc3RFbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLQkKLSAgICBwcml2YXRlIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlIGJ1aWxkQ2xhc3Nlc0dlbmVyYXRvclBhZ2UoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2UoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1dpemFyZFBhZ2UgYnVpbGRDbGFzc2VzR2VuZXJhdG9yT3B0aW9uc1BhZ2UoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3Nlc0dlbmVyYXRvck9wdGlvbnNXaXphcmRQYWdlKCk7Ci0JfQotCQotCXByaXZhdGUgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlIGJ1aWxkRXh0ZW5zaW9uT3B0aW9uc1BhZ2UoKSB7Ci0JCXJldHVybiBuZXcgQ2xhc3Nlc0dlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnNXaXphcmRQYWdlKCk7Ci0JfQotICAgIAotICAgIHB1YmxpYyBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3RGcm9tKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAJcmV0dXJuIChJSmF2YVByb2plY3QpKChJSmF2YUVsZW1lbnQpKChJQWRhcHRhYmxlKXByb2plY3QpLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKSk7Ci0gICAgfQotICAgIAotCXByaXZhdGUgYm9vbGVhbiBkaXNwbGF5T3ZlcndyaXRpbmdDbGFzc2VzV2FybmluZyhDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zKSB7Ci0JCQotCQlpZiggISB0aGlzLmlzT3ZlcnJpZGluZ0NsYXNzZXMoZ2VuZXJhdG9yT3B0aW9ucykgCi0JCQkJfHwgIU9wdGlvbmFsTWVzc2FnZURpYWxvZy5pc0RpYWxvZ0VuYWJsZWQoT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nLklEKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cgZGlhbG9nID0gbmV3IE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyh0aGlzLmdldFNoZWxsKCkpOwotCQkJcmV0dXJuIGRpYWxvZy5vcGVuKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQ7CQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPdmVycmlkaW5nQ2xhc3NlcyhDbGFzc2VzR2VuZXJhdG9yT3B0aW9ucyBnZW5lcmF0b3JPcHRpb25zKSB7Ci0JCWlmKGdlbmVyYXRvck9wdGlvbnMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYoZ2VuZXJhdG9yT3B0aW9ucy5zaG93c1ZlcnNpb24oKSB8fCBnZW5lcmF0b3JPcHRpb25zLnNob3dzSGVscCgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJldHJpZXZlR2VuZXJhdG9yU2V0dGluZ3MoKSB7Ci0JCXRoaXMuZGVzdGluYXRpb25Gb2xkZXIgPSB0aGlzLnNldHRpbmdzUGFnZS5nZXRUYXJnZXRGb2xkZXIoKTsKLQkJdGhpcy50YXJnZXRQYWNrYWdlID0gdGhpcy5zZXR0aW5nc1BhZ2UuZ2V0VGFyZ2V0UGFja2FnZSgpOwotCQl0aGlzLmNhdGFsb2cgPSB0aGlzLnNldHRpbmdzUGFnZS5nZXRDYXRhbG9nKCk7Ci0JCXRoaXMudXNlc01veHkgPSB0aGlzLnNldHRpbmdzUGFnZS51c2VzTW94eSgpOwotCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzID0gdGhpcy5zZXR0aW5nc1BhZ2UuZ2V0QmluZGluZ3NGaWxlTmFtZXMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJldHJpZXZlR2VuZXJhdG9yT3B0aW9ucygpIHsKLQkJdGhpcy5nZW5lcmF0b3JPcHRpb25zID0gbmV3IENsYXNzZXNHZW5lcmF0b3JPcHRpb25zKCk7Ci0KLQkJdGhpcy5nZW5lcmF0b3JPcHRpb25zLnNldFByb3h5KHRoaXMub3B0aW9uc1BhZ2UuZ2V0UHJveHkoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRQcm94eUZpbGUodGhpcy5vcHRpb25zUGFnZS5nZXRQcm94eUZpbGUoKSk7Ci0JCQotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0VXNlc1N0cmljdFZhbGlkYXRpb24odGhpcy5vcHRpb25zUGFnZS51c2VzU3RyaWN0VmFsaWRhdGlvbigpKTsKLQkJdGhpcy5nZW5lcmF0b3JPcHRpb25zLnNldE1ha2VzUmVhZE9ubHkodGhpcy5vcHRpb25zUGFnZS5tYWtlc1JlYWRPbmx5KCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0U3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuKHRoaXMub3B0aW9uc1BhZ2Uuc3VwcHJlc3Nlc1BhY2thZ2VJbmZvR2VuKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0U3VwcHJlc3Nlc0hlYWRlckdlbih0aGlzLm9wdGlvbnNQYWdlLnN1cHByZXNzZXNIZWFkZXJHZW4oKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRJc1ZlcmJvc2UodGhpcy5vcHRpb25zUGFnZS5pc1ZlcmJvc2UoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRJc1F1aWV0KHRoaXMub3B0aW9uc1BhZ2UuaXNRdWlldCgpKTsKLQkJCi0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRUcmVhdHNBc1htbFNjaGVtYSh0aGlzLm9wdGlvbnNQYWdlLnRyZWF0c0FzWG1sU2NoZW1hKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0VHJlYXRzQXNSZWxheE5nKHRoaXMub3B0aW9uc1BhZ2UudHJlYXRzQXNSZWxheE5nKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0VHJlYXRzQXNSZWxheE5nQ29tcGFjdCh0aGlzLm9wdGlvbnNQYWdlLnRyZWF0c0FzUmVsYXhOZ0NvbXBhY3QoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9yT3B0aW9ucy5zZXRUcmVhdHNBc0R0ZCh0aGlzLm9wdGlvbnNQYWdlLnRyZWF0c0FzRHRkKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0VHJlYXRzQXNXc2RsKHRoaXMub3B0aW9uc1BhZ2UudHJlYXRzQXNXc2RsKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0U2hvd3NWZXJzaW9uKHRoaXMub3B0aW9uc1BhZ2Uuc2hvd3NWZXJzaW9uKCkpOwotCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMuc2V0U2hvd3NIZWxwKHRoaXMub3B0aW9uc1BhZ2Uuc2hvd3NIZWxwKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmV0cmlldmVHZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zKCkgewotCi0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucyA9IG5ldyBDbGFzc2VzR2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucygpOwotCi0JCXRoaXMuZ2VuZXJhdG9yRXh0ZW5zaW9uT3B0aW9ucy5zZXRBbGxvd3NFeHRlbnNpb25zKHRoaXMuZXh0ZW5zaW9uT3B0aW9uc1BhZ2UuYWxsb3dzRXh0ZW5zaW9ucygpKTsKLQkJdGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLnNldENsYXNzcGF0aCh0aGlzLmV4dGVuc2lvbk9wdGlvbnNQYWdlLmdldENsYXNzcGF0aCgpKTsKLQkJdGhpcy5nZW5lcmF0b3JFeHRlbnNpb25PcHRpb25zLnNldEFkZGl0aW9uYWxBcmdzKHRoaXMuZXh0ZW5zaW9uT3B0aW9uc1BhZ2UuZ2V0QWRkaXRpb25hbEFyZ3MoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVGb2xkZXJJZk5vdEV4aXN0KElGb2xkZXIgZm9sZGVyKSB7Ci0JCWlmKCBmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKYXhiVWlQbHVnaW4ubG9nKGUpOwotCQkJCi0JCQl0aGlzLmxvZ0Vycm9yKE5MUy5iaW5kKAotCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRfY291bGROb3RDcmVhdGUsIAotCQkJCWZvbGRlci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9PU1N0cmluZygpKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSmF4YkNsYXNzZXMoKSB7Ci0JCXRyeSB7Ci0JCQlXb3Jrc3BhY2VKb2Igam9iID0gCi0JCQkJCW5ldyBHZW5lcmF0ZUpheGJDbGFzc2VzSm9iKAotCQkJCQkJdGhpcy5nZXRKYXZhUHJvamVjdCgpLAotCQkJCQkJdGhpcy5nZXRMb2NhbFNjaGVtYVVyaSgpLnRvU3RyaW5nKCksCi0JCQkJCQl0aGlzLmRlc3RpbmF0aW9uRm9sZGVyLAotCQkJCQkJdGhpcy50YXJnZXRQYWNrYWdlLAotCQkJCQkJdGhpcy5jYXRhbG9nLAotCQkJCQkJdGhpcy51c2VzTW94eSwKLQkJCQkJCXRoaXMuYmluZGluZ3NGaWxlTmFtZXMsCi0JCQkJCQl0aGlzLmdlbmVyYXRvck9wdGlvbnMsCi0JCQkJCQl0aGlzLmdlbmVyYXRvckV4dGVuc2lvbk9wdGlvbnMpOwotCQkJam9iLnNjaGVkdWxlKCk7Ci0JCX0KLQkJY2F0Y2goUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJSnB0SmF4YlVpUGx1Z2luLmxvZyhyZSk7Ci0JCQkKLQkJCVN0cmluZyBtc2cgPSByZS5nZXRNZXNzYWdlKCk7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IChtc2cgPT0gbnVsbCkgPyByZS50b1N0cmluZygpIDogbXNnOwotCQkJdGhpcy5sb2dFcnJvcihtZXNzYWdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkU2NoZW1hVG9MaWJyYXJ5KCkgewotCQlKYXhiUHJvamVjdCBqYXhiUHJvamVjdCA9IGdldEpheGJQcm9qZWN0KCk7Ci0JCQotCQlpZiAoamF4YlByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBnZXRTY2hlbWFMb2NhdGlvbigpOwotCQlTdHJpbmcgcmVzb2x2ZWRVcmkgPSBYc2RVdGlsLmdldFJlc29sdmVkVXJpKHNjaGVtYUxvY2F0aW9uKTsKLQkJWFNEU2NoZW1hIHNjaGVtYSA9IFhTREltcGwuYnVpbGRYU0RNb2RlbChyZXNvbHZlZFVyaSk7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJU2NoZW1hTGlicmFyeSBzY2hlbWFMaWIgPSBqYXhiUHJvamVjdC5nZXRTY2hlbWFMaWJyYXJ5KCk7Ci0JCQlMaXN0PFN0cmluZz4gc2NoZW1hcyA9IG5ldyBWZWN0b3I8U3RyaW5nPihzY2hlbWFMaWIuZ2V0U2NoZW1hTG9jYXRpb25zKCkpOwotCQkJaWYgKCEgc2NoZW1hcy5jb250YWlucyhzY2hlbWFMb2NhdGlvbikpIHsKLQkJCQlzY2hlbWFzLmFkZChzY2hlbWFMb2NhdGlvbik7Ci0JCQkJc2NoZW1hTGliLnNldFNjaGVtYUxvY2F0aW9ucyhzY2hlbWFzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihTdHJpbmcgbWVzc2FnZSkgewotCQkJdGhpcy5kaXNwbGF5RXJyb3IobWVzc2FnZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwbGF5RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoCi0JCQkJdGhpcy5nZXRTaGVsbCgpLAotCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRfZXJyb3JEaWFsb2dUaXRsZSwKLQkJCQltZXNzYWdlCi0JCQkpOwotCX0KLQkKLQlzdGF0aWMgY2xhc3MgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nIGV4dGVuZHMgT3B0aW9uYWxNZXNzYWdlRGlhbG9nIHsKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQ9ICJkb250U2hvd092ZXJ3cml0ZUpheGJDbGFzc2VzRnJvbVNjaGVtYXMud2FybmluZyI7IC8vJE5PTi1OTFMtMSQKLQotCQlPdmVyd3JpdGVDb25maXJtZXJEaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCQlzdXBlcihJRCwgcGFyZW50LAotCQkJCQlKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yVWlfZ2VuZXJhdGluZ0NsYXNzZXNXYXJuaW5nVGl0bGUsCi0JCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JVaV9nZW5lcmF0aW5nQ2xhc3Nlc1dhcm5pbmdNZXNzYWdlLAotCQkJCQlNZXNzYWdlRGlhbG9nLldBUk5JTkcsCi0JCQkJCW5ldyBTdHJpbmdbXSB7SURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIElEaWFsb2dDb25zdGFudHMuTk9fTEFCRUx9LAotCQkJCQkxKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfTEFCRUwsIGZhbHNlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19JRCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgdHJ1ZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL0NsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmFlYTUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5UeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuVHlwZWRWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5JVk1JbnN0YWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSVZNSW5zdGFsbDI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50Q29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5TdGFuZGFyZEphdmFFbGVtZW50Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1R5cGVXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVHJheURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuLkNsYXNzZXNHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5wbGF0Zm9ybS5KYXhiUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnBsYXRmb3JtLkpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5GaWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogIENsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZSBleHRlbmRzIE5ld1R5cGVXaXphcmRQYWdlIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBKUFRfRUNMSVBTRUxJTktfVUlfUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkiOyAgIC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBYTUxfRklMVEVSID0gIioueG1sIjsgICAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmdbXSBiaW5kaW5nZEZpbGVzRmlsdGVyRXh0ZW5zaW9ucyA9IHsiLnhqYiIsIi54bWwiLCIueGJkIn07IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIGZpbmFsIEpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVAgCi0JCQk9IEpwdEpheGJDb3JlUGx1Z2luLmdldEpheGJQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKYXhiUGxhdGZvcm1Hcm91cCgiZWNsaXBzZWxpbmsiKTsgICAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUxQX0NPTlRFWFRfSUQgPSAib3JnLmVjbGlwc2UuanB0LnVpLmNvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTZXR0aW5nc0dyb3VwIHNldHRpbmdzR3JvdXA7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0Rm9sZGVyOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldFBhY2thZ2U7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gdXNlc01veHlDaGVja0JveDsKLQlwcml2YXRlIGJvb2xlYW4gdXNlc01veHk7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKHRydWUsICJDbGFzc2VzIEdlbmVyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJdGhpcy5zZXREZXNjcmlwdGlvbihKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9kZXNjKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJdGhpcy5zZXRDb250cm9sKHRoaXMuYnVpbGRUb3BMZXZlbENvbnRyb2wocGFyZW50KSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRGb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEZvbGRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFBhY2thZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldFBhY2thZ2U7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zZXR0aW5nc0dyb3VwLmdldENhdGFsb2coKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QmluZGluZ3NGaWxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnNldHRpbmdzR3JvdXAuZ2V0QmluZGluZ3NGaWxlTmFtZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlc01veHkoKSB7Ci0JCXJldHVybiB0aGlzLnVzZXNNb3h5OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VXNlc01veHkoYm9vbGVhbiB1c2VzTW94eSl7Ci0JCXRoaXMudXNlc01veHkgPSB1c2VzTW94eTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgcGFja2FnZUNoYW5nZWQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIucGFja2FnZUNoYW5nZWQoKTsgCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gZ2V0UGFja2FnZUZyYWdtZW50KCk7Ci0JCWlmKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJdGhpcy50YXJnZXRQYWNrYWdlID0gcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9CQkJCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgY29udGFpbmVyQ2hhbmdlZCgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci5jb250YWluZXJDaGFuZ2VkKCk7Ci0JCVN0cmluZyBzcmNGb2xkZXIgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290VGV4dCgpOwotCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7Ci0JCQkJdGhpcy50YXJnZXRGb2xkZXIgPSBzcmNGb2xkZXIuc3Vic3RyaW5nKHNyY0ZvbGRlci5pbmRleE9mKCIvIikgKyAxKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGaWVsZENoYW5nZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlzdXBlci5oYW5kbGVGaWVsZENoYW5nZWQoZmllbGROYW1lKTsKLQkJaWYodGhpcy5mQ29udGFpbmVyU3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCXRoaXMudXBkYXRlU3RhdHVzKGZDb250YWluZXJTdGF0dXMpOwotCQl9Ci0JCWVsc2UgaWYoICEgdGhpcy5mUGFja2FnZVN0YXR1cy5tYXRjaGVzKElTdGF0dXMuT0spICkgewotCQkJdGhpcy51cGRhdGVTdGF0dXMoZlBhY2thZ2VTdGF0dXMpOwotCQl9IAotCQllbHNlIHsKLQkJCXRoaXMudXBkYXRlU3RhdHVzKFN0YXR1cy5PS19TVEFUVVMpOwotCQl9Ci0JCXRoaXMudmFsaWRhdGVQcm9qZWN0Q2xhc3NwYXRoKCk7Ci0JfQotCQotCS8qKgotCSAqIE92ZXJyaWRlIHNldFZpc2libGUgdG8gaW5zdXJlIHRoYXQgb3VyIG1vcmUgaW1wb3J0YW50IHdhcm5pbmcKLQkgKiBtZXNzYWdlIGFib3V0IGNsYXNzcGF0aCBwcm9ibGVtcyBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgZmlyc3QuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYodmlzaWJsZSkgewotCQkJdGhpcy5pbml0Q29udGFpbmVyUGFnZSgoKENsYXNzZXNHZW5lcmF0b3JXaXphcmQpdGhpcy5nZXRXaXphcmQoKSkuZ2V0SmF2YVByb2plY3QoKSk7Ci0KLQkJCWlmKHRoaXMucHJvamVjdFBsYXRmb3JtSXNKYXhiKCkpIHsKLQkJCQl0aGlzLnNldFVzZXNNb3h5KHRoaXMucHJvamVjdEpheGJQbGF0Zm9ybUlzRWNsaXBzZUxpbmsoKSk7Ci0JCQkJdGhpcy51c2VzTW94eUNoZWNrQm94LnNldFZpc2libGUoZmFsc2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZGVmYXVsdCB1c2VzTW94eSB0byB0cnVlIG9ubHkgd2hlbiBKUFQgRWNsaXBzZUxpbmsgYnVuZGxlIGV4aXN0cyBhbmQgTU9YeSBpcyBvbiB0aGUgY2xhc3NwYXRoCi0JCQkJdGhpcy5zZXRVc2VzTW94eSgodGhpcy5qcHRFY2xpcHNlTGlua0J1bmRsZUV4aXN0cygpICYmIHRoaXMubW94eUlzT25DbGFzc3BhdGgoKSkpOyAKLQkJCi0JCQkJLy8gY2hlY2tib3ggaXMgdmlzaWJsZSBvbmx5IGlmIGpwdC5lY2xpcHNlbGluay51aSBwbHVnaW4gaXMgYXZhaWxhYmxlCi0JCQkJLy8gYW5kIEVjbGlwc2VMaW5rIE1PWHkgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGgKLQkJCQl0aGlzLnVzZXNNb3h5Q2hlY2tCb3guc2V0VmlzaWJsZSh0aGlzLmpwdEVjbGlwc2VMaW5rQnVuZGxlRXhpc3RzKCkgJiYgISB0aGlzLm1veHlJc09uQ2xhc3NwYXRoKCkpOwotCQkJfQotCQkJdGhpcy52YWxpZGF0ZVByb2plY3RDbGFzc3BhdGgoKTsKLQotCQkJU3RyaW5nIHNjaGVtYU5hbWUgPSAoKENsYXNzZXNHZW5lcmF0b3JXaXphcmQpIGdldFdpemFyZCgpKS5nZXRMb2NhbFNjaGVtYVVyaSgpLmxhc3RTZWdtZW50KCk7Ci0JCQl0aGlzLnNldFRpdGxlKE5MUy5iaW5kKEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX3RpdGxlLCBzY2hlbWFOYW1lKSk7Ci0JCX0KLQl9Ci0gICAgCi0JLyoqIAotCSAqIE92ZXJyaWRlIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBzb3VyY2UgZm9sZGVyIGluIGN1cnJlbnQgcHJvamVjdCBvbmx5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdDb250YWluZXJXaXphcmRQYWdlI2Nob29zZUNvbnRhaW5lcigpCi0JICogT25seSAxIGxpbmUgaW4gdGhpcyBjb2RlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBwYXJlbnQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgY2hvb3NlQ29udGFpbmVyKCkgewotCQlDbGFzczw/PltdIGFjY2VwdGVkQ2xhc3NlcyA9IG5ldyBDbGFzc1tdIHsgSVBhY2thZ2VGcmFnbWVudFJvb3QuY2xhc3MsIElKYXZhUHJvamVjdC5jbGFzcyB9OwotCQlUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IgdmFsaWRhdG9yPSBuZXcgVHlwZWRFbGVtZW50U2VsZWN0aW9uVmFsaWRhdG9yKGFjY2VwdGVkQ2xhc3NlcywgZmFsc2UpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZFZhbGlkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQkJSUphdmFQcm9qZWN0IGpwcm9qZWN0PSAoSUphdmFQcm9qZWN0KWVsZW1lbnQ7Ci0JCQkJCQlJUGF0aCBwYXRoPSBqcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCXJldHVybiAoanByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QocGF0aCkgIT0gbnVsbCk7Ci0JCQkJCX0gCi0JCQkJCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCQlyZXR1cm4gKCgoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudCkuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9IAotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlKcHRKYXhiVWlQbHVnaW4ubG9nKGUpOyAvLyBqdXN0IGxvZywgbm8gVUkgaW4gdmFsaWRhdGlvbgotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJYWNjZXB0ZWRDbGFzc2VzPSBuZXcgQ2xhc3NbXSB7IElKYXZhTW9kZWwuY2xhc3MsIElQYWNrYWdlRnJhZ21lbnRSb290LmNsYXNzLCBJSmF2YVByb2plY3QuY2xhc3MgfTsKLQkJVmlld2VyRmlsdGVyIGZpbHRlcj0gbmV3IFR5cGVkVmlld2VyRmlsdGVyKGFjY2VwdGVkQ2xhc3NlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJldHVybiAoKChJUGFja2FnZUZyYWdtZW50Um9vdCllbGVtZW50KS5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpOwotCQkJCQl9IAotCQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUpwdEpheGJVaVBsdWdpbi5sb2coZS5nZXRTdGF0dXMoKSk7IC8vIGp1c3QgbG9nLCBubyBVSSBpbiB2YWxpZGF0aW9uCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLnNlbGVjdCh2aWV3ZXIsIHBhcmVudCwgZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlciBwcm92aWRlcj0gbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcj0gbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ERUZBVUxUKTsKLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgcHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9zb3VyY2VGb2xkZXJTZWxlY3Rpb25EaWFsb2dfdGl0bGUpOwotCQlkaWFsb2cuc2V0TWVzc2FnZShKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VTb3VyY2VGb2xkZXJEaWFsb2dfZGVzYyk7Ci0JCWRpYWxvZy5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJLy9zZXQgdGhlIGphdmEgcHJvamVjdCBhcyB0aGUgaW5wdXQgaW5zdGVhZCBvZiB0aGUgd29ya3NwYWNlIGxpa2UgdGhlIE5ld0NvbnRhaW5lcldpemFyZFBhZ2Ugd2FzIGRvaW5nCi0JCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8KLQkJZGlhbG9nLnNldElucHV0KHRoaXMuZ2V0SmF2YVByb2plY3QoKSk7ICAgICAJCQkvLwotCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vCi0JCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9uKGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKSk7Ci0JCWRpYWxvZy5zZXRIZWxwQXZhaWxhYmxlKGZhbHNlKTsKLQotCQlpZihkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0IGVsZW1lbnQ9IGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCUlKYXZhUHJvamVjdCBqcHJvamVjdD0gKElKYXZhUHJvamVjdCllbGVtZW50OwotCQkJCXJldHVybiBqcHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KGpwcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQkJCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudFJvb3QpZWxlbWVudDsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbnRyb2wgYnVpbGRUb3BMZXZlbENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSEVMUF9DT05URVhUX0lEKTsKLQkJCi0JCXRoaXMuc2V0dGluZ3NHcm91cCA9IG5ldyBTZXR0aW5nc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy51c2VzTW94eUNoZWNrQm94ID0gdGhpcy5idWlsZFVzZXNNb3h5Q2hlY2tCb3goY29tcG9zaXRlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRVc2VzTW94eUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEluZGVudCA9IDU7Ci0JCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNoZWNrQm94LnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfdXNlc01veHlJbXBsZW1lbnRhdGlvbik7Ci0JCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnVzZXNNb3h5KCkpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVXNlc01veHlTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFVzZXNNb3h5U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlzZXRVc2VzTW94eSh1c2VzTW94eUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl2YWxpZGF0ZVByb2plY3RDbGFzc3BhdGgoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGpwdEVjbGlwc2VMaW5rQnVuZGxlRXhpc3RzKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0SnB0RWNsaXBzZUxpbmtCdW5kbGUoKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCdW5kbGUgZ2V0SnB0RWNsaXBzZUxpbmtCdW5kbGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRCdW5kbGUoSlBUX0VDTElQU0VMSU5LX1VJX1BMVUdJTl9JRCk7CS8vIENhbm5vdCByZWZlcmVuY2UgZGlyZWN0bHkgRUwgcGx1Z2luLgotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVQcm9qZWN0Q2xhc3NwYXRoKCkgewotCQkvL3RoaXMgbGluZSB3aWxsIHN1cHByZXNzIHRoZSAiZGVmYXVsdCBwYWNrYWdlIiB3YXJuaW5nICh3aGljaCBkb2Vzbid0IHJlYWxseSBhcHBseSBoZXJlCi0JCS8vYXMgdGhlIEpBWEIgZ2VuIHVzZXMgYW4gb3JnLmV4YW1wbGUuc2NoZW1hTmFtZSBwYWNrYWdlIGJ5IGRlZmF1bHQpIGFuZCB3aWxsIGNsZWFyIHRoZSBjbGFzc3BhdGggd2FybmluZ3Mgd2hlbiBuZWNlc3NhcnkKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJCi0JCWlmKCAhIHRoaXMuZ2VuZXJpY0pheGJJc09uQ2xhc3NwYXRoKCkpIHsKLQkJCXRoaXMuZGlzcGxheVdhcm5pbmcoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfamF4YkxpYnJhcmllc05vdEF2YWlsYWJsZSk7Ci0JCX0KLQkJZWxzZSBpZih0aGlzLnVzZXNNb3h5KCkgJiYgISB0aGlzLmVjbGlwc2VMaW5rTW94eUlzT25DbGFzc3BhdGgoKSkgewotCQkJLy90aGlzIG1lc3NhZ2UgaXMgYmVpbmcgdHJ1bmNhdGVkIGJ5IHRoZSB3aXphcmQgd2lkdGggaW4gc29tZSBjYXNlcwotCQkJdGhpcy5kaXNwbGF5V2FybmluZyhKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9tb3h5TGlicmFyaWVzTm90QXZhaWxhYmxlKTsKLQkJfQotCi0JCS8vdGhpcyBjb2RlIHdpbGwgaW50ZWxsaWdlbnRseSByZW1vdmUgb3VyIGNsYXNzcGF0aCB3YXJuaW5ncyB3aGVuIHRoZXkgYXJlIHByZXNlbnQgYnV0IG5vIGxvbmdlciBhcHBseSAoYXMgYW4gYWx0ZXJuYXRpdmUgCi0JCS8vdG8gc2V0dGluZyB0aGUgbWVzc2FnZSB0byBudWxsIGNvbnRpbnVvdXNseSBhcyBpcyBjdXJyZW50bHkgZG9uZSkKLS8vCQllbHNlIGlmKCB0aGlzLmdldE1lc3NhZ2UoKSAhPSBudWxsKXsKLS8vCQkJaWYgKHRoaXMuZ2V0TWVzc2FnZSgpLmVxdWFscyhKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9qYXhiTGlicmFyaWVzTm90QXZhaWxhYmxlKSB8fAotLy8JCQkJCXRoaXMuZ2V0TWVzc2FnZSgpLmVxdWFscyhKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9tb3h5TGlicmFyaWVzTm90QXZhaWxhYmxlKSkgeyAKLS8vCQkJCXNldE1lc3NhZ2UobnVsbCk7Ci0vLwkJCX0KLS8vCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgSmF4YiBjb21waWxlciBpcyBvbiB0aGUgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmljSmF4YklzT25DbGFzc3BhdGgoKSB7Ci0JCWlmKHRoaXMuZ2VuZXJpY0pheGJOb25KZGtJc09uQ2xhc3NwYXRoKCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYodGhpcy5wcm9qZWN0SnJlMTVPckxvd2VyKCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmKHRoaXMuZ2VuZXJpY0pheGJKZGtJc09uQ2xhc3NwYXRoKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiB0aGlzLnRvb2xzSmFyRXhpc3RzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJvamVjdEpyZTE1T3JMb3dlcigpIHsKLQkJdHJ5IHsKLQkJCUlWTUluc3RhbGwgdm0gPSB0aGlzLmdldFZNSW5zdGFsbCgpOwotCQkJaWYodm0gPT0gbnVsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmICh2bSBpbnN0YW5jZW9mIElWTUluc3RhbGwyKSB7Ci0JCQkJU3RyaW5nIGphdmFWZXJzaW9uID0gKChJVk1JbnN0YWxsMikgdm0pLmdldEphdmFWZXJzaW9uKCk7Ci0JCQkJaWYoamF2YVZlcnNpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdmVyc2lvblN0cmluZyA9IGphdmFWZXJzaW9uLnN1YnN0cmluZygwLCBqYXZhVmVyc2lvbi5sYXN0SW5kZXhPZignLicpKTsKLQkJCQkJRmxvYXQgamF2YVZlcnNpb25OdW1iZXIgPSBGbG9hdC52YWx1ZU9mKHZlcnNpb25TdHJpbmcpOwotCQkJCQlpZiggamF2YVZlcnNpb25OdW1iZXIgPD0gMS41KSB7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0IGlmIHRoZSBKREsgSmF4YiBjb21waWxlciBpcyBvbiB0aGUgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmljSmF4Ykpka0lzT25DbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBDbGFzc2VzR2VuZXJhdG9yLmdlbmVyaWNKYXhiSmRrSXNPbkNsYXNzcGF0aCh0aGlzLmdldEphdmFQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIG5vbi1KREsgSmF4YiBjb21waWxlciBpcyBvbiB0aGUgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZW5lcmljSmF4Yk5vbkpka0lzT25DbGFzc3BhdGgoKSB7Ci0JCXJldHVybiBDbGFzc2VzR2VuZXJhdG9yLmdlbmVyaWNKYXhiTm9uSmRrSXNPbkNsYXNzcGF0aCh0aGlzLmdldEphdmFQcm9qZWN0KCkpOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdG9vbHNKYXJFeGlzdHMoKSB7Ci0JCXJldHVybiBDbGFzc2VzR2VuZXJhdG9yLnRvb2xzSmFyRXhpc3RzKHRoaXMuZ2V0SmF2YVByb2plY3QoKSk7Ci0JfQotCQotCXByaXZhdGUgSVZNSW5zdGFsbCBnZXRWTUluc3RhbGwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBDbGFzc2VzR2VuZXJhdG9yLmdldFZNSW5zdGFsbCh0aGlzLmdldEphdmFQcm9qZWN0KCkpOwotCX0KLQkKLQkvKioKLQkgKiBUZXN0IGlmIHRoZSBFY2xpcHNlTGluayBKYXhiIGNvbXBpbGVyIGlzIG9uIHRoZSBjbGFzc3BhdGguCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIG1veHlJc09uQ2xhc3NwYXRoKCkgewotCQl0cnkgewotCQkJSVR5cGUgZ2VuQ2xhc3MgPSB0aGlzLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoQ2xhc3Nlc0dlbmVyYXRvci5KQVhCX0VDTElQU0VMSU5LX0dFTl9DTEFTUyk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9IAotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGVjbGlwc2VMaW5rTW94eUlzT25DbGFzc3BhdGgoKSB7Ci0JCXJldHVybiAodGhpcy5tb3h5SXNPbkNsYXNzcGF0aCgpICYmIHRoaXMuZ2VuZXJpY0pheGJOb25KZGtJc09uQ2xhc3NwYXRoKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0UGxhdGZvcm1Jc0pheGIoKSB7Ci0JCXJldHVybiBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUHJvamVjdCh0aGlzLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0SmF4YlBsYXRmb3JtSXNFY2xpcHNlTGluaygpIHsKLQkJSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gamF4YlBsYXRmb3JtID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0SmF4YlBsYXRmb3JtRGVzY3JpcHRpb24odGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCUpheGJQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gamF4YlBsYXRmb3JtR3JvdXAgPSAoamF4YlBsYXRmb3JtID09IG51bGwpID8gbnVsbCA6IGpheGJQbGF0Zm9ybS5nZXRHcm91cCgpOwotCQlyZXR1cm4gamF4YlBsYXRmb3JtR3JvdXAgPT0gRUNMSVBTRUxJTktfUExBVEZPUk1fR1JPVVA7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwbGF5V2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQl0aGlzLnNldE1lc3NhZ2UobWVzc2FnZSwgV0FSTklORyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbm5lciBjbGFzcyAqKioqKioqKioqCi0JCi0JLy8gKioqKioqKioqKiBTZXR0aW5nc0dyb3VwIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgU2V0dGluZ3NHcm91cCB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBUZXh0IGNhdGFsb2dUZXh0OwotCi0JCXByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gYmluZGluZ3NGaWxlTmFtZXM7Ci0JCQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlwcml2YXRlIFNldHRpbmdzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoKTsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCg0LCBmYWxzZSk7IC8vbXVzdCBiZSA0IGZvciB0aGUgcGFja2FnZSBjb250cm9scwotCQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuZ3JvdXAsIEhFTFBfQ09OVEVYVF9JRCk7Ci0KLQkJCS8vIFNvdXJjZSBmb2xkZXIKLQkJCWNyZWF0ZUNvbnRhaW5lckNvbnRyb2xzKGNvbXBvc2l0ZSwgNCk7Ci0JCQkKLQkJCS8vIFBhY2thZ2UKLQkJCWNyZWF0ZVBhY2thZ2VDb250cm9scyhjb21wb3NpdGUsIDQpOwotCQkJCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkJFR0lOTklORywgdHJ1ZSwgZmFsc2UsIDQsIDEpOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQkKLQkJCS8vIENhdGFsb2cKLQkJCUxhYmVsIGNhdGFsb2dMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWNhdGFsb2dMYWJlbC5zZXRUZXh0KEpwdEpheGJVaU1lc3NhZ2VzLkNsYXNzZXNHZW5lcmF0b3JXaXphcmRQYWdlX2NhdGFsb2cpOwotCQkJZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdyaWREYXRhLnZlcnRpY2FsSW5kZW50ID0gNTsKLQkJCWNhdGFsb2dMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXRoaXMuY2F0YWxvZ1RleHQgPSB0aGlzLmJ1aWxkQ2F0YWxvZ1RleHQoY29tcG9zaXRlKTsKLQkJCXRoaXMuYnVpbGRCcm93c2VCdXR0b24oY29tcG9zaXRlKTsKLQkJCQotCQkJLy8gQmluZGluZ3MgZmlsZXMKLQkJCXRoaXMuYmluZGluZ3NGaWxlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCUxhYmVsIGJpbmRpbmdzRmlsZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJYmluZGluZ3NGaWxlTGFiZWwuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9iaW5kaW5nc0ZpbGVzKTsKLQkJCWJpbmRpbmdzRmlsZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJdGhpcy5idWlsZEJpbmRpbmdzRmlsZVRhYmxlKGNvbXBvc2l0ZSk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCQlyZXR1cm4gdGhpcy5jYXRhbG9nVGV4dC5nZXRUZXh0KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QmluZGluZ3NGaWxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmJpbmRpbmdzRmlsZU5hbWVzLml0ZXJhdG9yKCksIG5ldyBTdHJpbmdbMF0pOwotCQl9Ci0JCQotCQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCi0JCXByaXZhdGUgVGV4dCBidWlsZENhdGFsb2dUZXh0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULkJPUkRFUik7Ci0JCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJdGV4dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCXJldHVybiB0ZXh0OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGJ1aWxkQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQotCQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkJLy8gQnJvd3NlIGJ1dHRvbnMKLQkJCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYnJvd3NlQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50PSBHcmlkRGF0YS5GSUxMOwotCQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSA1OwotCQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT0gdHJ1ZTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCQotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQkJCQlTdHJpbmcgZmlsZVBhdGggPSBwcm9tcHRYbWxGaWxlKCk7Ci0JCQkJCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZVBhdGgpKSB7Ci0JCQkJCQkKLQkJCQkJCWNhdGFsb2dUZXh0LnNldFRleHQobWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChmaWxlUGF0aCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQlwcml2YXRlIFRhYmxlVmlld2VyIGJ1aWxkQmluZGluZ3NGaWxlVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCi0JCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IHRoaXMuYnVpbGRUYWJsZVZpZXdlcihwYXJlbnQsIHRoaXMuYmluZGluZ3NGaWxlTmFtZXMpOwotCQkJCi0JCQl0aGlzLmJ1aWxkQWRkUmVtb3ZlQnV0dG9ucyhwYXJlbnQsIHRhYmxlVmlld2VyLCB0aGlzLmJpbmRpbmdzRmlsZU5hbWVzKTsKLQkJCXJldHVybiB0YWJsZVZpZXdlcjsKLQkJfQotCQkKLQkJcHJpdmF0ZSBUYWJsZVZpZXdlciBidWlsZFRhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIEFycmF5TGlzdDxTdHJpbmc+IHRhYmxlRGF0YU1vZGVsKSB7CQotCQkKLQkJCVRhYmxlTGF5b3V0Q29tcG9zaXRlIHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0Q29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJdGhpcy5hZGRDb2x1bW5zRGF0YSh0YWJsZUxheW91dCk7Ci0JCQotCQkJZmluYWwgVGFibGUgdGFibGUgPSBuZXcgVGFibGUodGFibGVMYXlvdXQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuQk9SREVSKTsKLQkJCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0JCQkKLQkJCVRhYmxlQ29sdW1uIGNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIDApOwotCQkJY29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCi0JCQlHcmlkRGF0YSBncmlkRGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlncmlkRGF0YS5oZWlnaHRIaW50PSBTV1RVdGlsLmdldFRhYmxlSGVpZ2h0SGludCh0YWJsZSwgMyk7Ci0JCQl0YWJsZUxheW91dC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCQlUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQkJdGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcih0aGlzLmJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQkJCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcih0aGlzLmJ1aWxkQ29udGVudFByb3ZpZGVyKCkpOwotCQkJCi0JCQl0YWJsZVZpZXdlci5zZXRJbnB1dCh0YWJsZURhdGFNb2RlbCk7Ci0JCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBidWlsZEFkZFJlbW92ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXIsIGZpbmFsIEFycmF5TGlzdDxTdHJpbmc+IHRhYmxlRGF0YU1vZGVsKSB7Ci0JCQotCQkJQ29tcG9zaXRlIGJ1dHRvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uTGF5b3V0KTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkJFR0lOTklORzsKLQkJCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCS8vIEFkZCBidXR0b24KLQkJCUJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYWRkQnV0dG9uLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfYWRkQnV0dG9uKTsKLQkJCWdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlPSB0cnVlOwotCQkJYWRkQnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJU3RyaW5nIGZpbGVQYXRoID0gYWRkQmluZGluZ3NGaWxlRGlhbG9nKCk7Ci0JCQkJCWlmKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZmlsZVBhdGgpKSB7Ci0JCQkJCQlhZGRCaW5kaW5nc0ZpbGUoZmlsZVBhdGgsIHRhYmxlRGF0YU1vZGVsKTsKLQkJCQkJCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJLy8gUmVtb3ZlIGJ1dHRvbgotCQkJQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCQlyZW1vdmVCdXR0b24uc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9yZW1vdmVCdXR0b24pOwotCQkJZ3JpZERhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2U9IHRydWU7Ci0JCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlyZW1vdmVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChTdHJ1Y3R1cmVkU2VsZWN0aW9uKXRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQkJCQlpZihzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGJpbmRpbmdzRmlsZU5hbWUgPSAoU3RyaW5nKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQkJcmVtb3ZlQmluZGluZ3NGaWxlKGJpbmRpbmdzRmlsZU5hbWUpOwotCQkKLQkJCQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCQkJYWRkQnV0dG9uLnNldEZvY3VzKCk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgIGFkZEJpbmRpbmdzRmlsZURpYWxvZygpIHsKLQkJCVByb21wdEJpbmRpbmdzRmlsZXNEaWFsb2cgZGlhbG9nID0gbmV3IFByb21wdEJpbmRpbmdzRmlsZXNEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQkKLQkJCS8vIG9wZW5zIHRoZSBkaWFsb2cgLSBqdXN0IHJldHVybnMgaWYgdGhlIHVzZXIgY2FuY2VscyBpdAotCQkJaWYoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGRpYWxvZy5nZXRMb2NhdGlvbigpOwotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbWFrZVJlbGF0aXZlVG9Qcm9qZWN0UGF0aChTdHJpbmcgZmlsZVBhdGgpIHsKLQkJCVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVQYXRoKTsKLQkJCUlQYXRoIHJlbGF0aXZlUGF0aCA9IHBhdGgubWFrZVJlbGF0aXZlVG8oZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TG9jYXRpb24oKSk7Ci0JCQlyZXR1cm4gcmVsYXRpdmVQYXRoLnRvT1NTdHJpbmcoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBhZGRCaW5kaW5nc0ZpbGUoU3RyaW5nIHJlbGF0aXZlUGF0aCwgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gdGFibGVEYXRhTW9kZWwpIHsKLQkJCWlmKCAhIHRhYmxlRGF0YU1vZGVsLmNvbnRhaW5zKHJlbGF0aXZlUGF0aCkpIHsKLQkJCQl0YWJsZURhdGFNb2RlbC5hZGQocmVsYXRpdmVQYXRoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHJlbW92ZUJpbmRpbmdzRmlsZShTdHJpbmcgYmluZGluZ3NOYW1lKSB7Ci0JCQl0aGlzLmJpbmRpbmdzRmlsZU5hbWVzLnJlbW92ZShiaW5kaW5nc05hbWUpOwotCQl9Ci0KLQkJcHJpdmF0ZSBJQmFzZUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIG5ldyBUYWJsZUNvbnRlbnRQcm92aWRlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSBBZGQgYnV0dG9uIHdhcyBjbGlja2VkLCBpdHMgYWN0aW9uIGludm9rZXMgdGhpcyBhY3Rpb24gd2hpY2ggc2hvdWxkCi0JCSAqIHByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmaWxlIGFuZCByZXR1cm4gaXQuCi0JCSAqLwotCQlwcml2YXRlIFN0cmluZyBwcm9tcHRYbWxGaWxlKCkgewotCQkJU3RyaW5nIHByb2plY3RQYXRoPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0KLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCQlkaWFsb2cuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VBQ2F0YWxvZyk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyUGF0aChwcm9qZWN0UGF0aCk7Ci0JCQlkaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhuZXcgU3RyaW5nW10ge1hNTF9GSUxURVJ9KTsKLQotCQkJcmV0dXJuIGRpYWxvZy5vcGVuKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uc0RhdGEoVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0KSB7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgdHJ1ZSkpOwotCQl9Ci0JCQotCX0KLQotCS8vICoqKioqKioqKiogVGFibGVMYWJlbFByb3ZpZGVyICoqKioqKioqKioKLQkKLQlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gKFN0cmluZyllbGVtZW50OwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBUYWJsZUNvbnRlbnRQcm92aWRlciAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkJVGFibGVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQotCQkKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbjw/PikgaW5wdXRFbGVtZW50KS50b0FycmF5KCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIFByb21wdEJpbmRpbmdzRmlsZXNEaWFsb2cgKioqKioqKioqKgotCQotCXByaXZhdGUgY2xhc3MgUHJvbXB0QmluZGluZ3NGaWxlc0RpYWxvZyBleHRlbmRzIFRyYXlEaWFsb2cgewotCQkKLQkJcHJpdmF0ZSBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbCBsb2NhdGlvblBhbmVsOwotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgbG9jYXRpb247Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0JCXB1YmxpYyBQcm9tcHRCaW5kaW5nc0ZpbGVzRGlhbG9nKFNoZWxsIHNoZWxsKSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQkJc3VwZXIuY29uZmlndXJlU2hlbGwobmV3U2hlbGwpOwotCQkJbmV3U2hlbGwuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5DbGFzc2VzR2VuZXJhdG9yV2l6YXJkUGFnZV9jaG9vc2VBQmluZGluZ3NGaWxlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCQotCQkJdGhpcy5sb2NhdGlvblBhbmVsID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKGNvbXBvc2l0ZSwgU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCQl0aGlzLmxvY2F0aW9uUGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhiaW5kaW5nZEZpbGVzRmlsdGVyRXh0ZW5zaW9ucyk7Ci0JCQl0aGlzLmxvY2F0aW9uUGFuZWwudXBkYXRlKCk7Ci0JCQl0aGlzLmxvY2F0aW9uUGFuZWwuc2V0VmlzaWJsZUhlbHBlcih0cnVlKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBib29sZWFuIGlzUmVzaXphYmxlKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCQlJRmlsZSBmaWxlID0gdGhpcy5sb2NhdGlvblBhbmVsLmdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLmxvY2F0aW9uID0gZmlsZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9PU1N0cmluZygpOwotCQkJfQotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TY2hlbWFXaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TY2hlbWFXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMWExZDYuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vU2NoZW1hV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5Db21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLklXaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2l6YXJkcy5KYXZhUHJvamVjdFdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotLyoqCi0gKiAgU2NoZW1hV2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hV2l6YXJkUGFnZQotCQlleHRlbmRzIFdpemFyZFBhZ2UgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gYnJvd3NlWFNERmlsdGVyRXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBmaW5hbCBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uOwotCXByaXZhdGUgSVByb2plY3QgdGFyZ2V0UHJvamVjdDsKLQkKLQlwcm90ZWN0ZWQgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgc2VsZWN0U291cmNlUGFuZWw7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kICoqKioqKioqKioKLQkKLSAgICBwdWJsaWMgc3RhdGljIElGaWxlIGdldFNvdXJjZVNjaGVtYUZyb21TZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQgPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlTdHJpbmcgZWxlbWVudEV4dGVuc2lvbiA9ICgoSUZpbGUpZmlyc3RFbGVtZW50KS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZihlbGVtZW50RXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCQlpZihicm93c2VYU0RGaWx0ZXJFeHRlbnNpb25zWzBdLmVuZHNXaXRoKGVsZW1lbnRFeHRlbnNpb24pKSB7Ci0JCQkJCXJldHVybiAoKElGaWxlKWZpcnN0RWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLSAgICAKLQlTY2hlbWFXaXphcmRQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigiU2NoZW1hV2l6YXJkUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQl0aGlzLmluaXRpYWxTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogSURpYWxvZ1BhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0vLwkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEhFTFBfQ09OVEVYVF9JRCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJdGhpcy5zZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKGNvbXBvc2l0ZSwgdGhpcy5pbml0aWFsU2VsZWN0aW9uKTsKLQkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCi0JCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLlBhbmVsTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuUGFuZWxMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKSB7Ci0JCQkJc2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWxDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCX0KLQkKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZih2aXNpYmxlKSB7Ci0JCQkKLQkJCWlmKHRoaXMuZ2V0U2NoZW1hRmlsZSgpICE9IG51bGwpIHsKLQkgICAgCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldFNpbmdsZUZpbGVWaWV3RGVmYXVsdFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0aGlzLmdldFNjaGVtYUZpbGUoKSkpOwotCSAgICAJfQotCSAgICAJZWxzZSB7Ci0JICAgIAkJdGhpcy51cGRhdGVUYXJnZXRQcm9qZWN0KCk7Ci0JCSAgICAJSUZpbGUgc2NoZW1hID0gZ2V0U291cmNlU2NoZW1hRnJvbVNlbGVjdGlvbih0aGlzLmluaXRpYWxTZWxlY3Rpb24pOwotCQkgICAgCWlmKHNjaGVtYSAhPSBudWxsKSB7Ci0JCSAgICAJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0U2luZ2xlRmlsZVZpZXdEZWZhdWx0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNjaGVtYSkpOwotCQkgICAgCX0KLQkJICAgIAllbHNlIHsKLQkJICAgIAkJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5zZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGhpcy50YXJnZXRQcm9qZWN0KSk7Ci0JCSAgICAJfQotCSAgICAJfQotCSAgICAJdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC51cGRhdGUoKTsKLQkJCQotCQkJdGhpcy5zZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFXaXphcmRQYWdlX3RpdGxlKTsKLQkJCXRoaXMuc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hV2l6YXJkUGFnZV9kZXNjKTsKLQkJCXRoaXMuc2VsZWN0U291cmNlUGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhicm93c2VYU0RGaWx0ZXJFeHRlbnNpb25zKTsKLQkJfQotCQl0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLnNldFZpc2libGVIZWxwZXIodmlzaWJsZSk7Ci0JfQotICAgIAotICAgIAotCS8vICoqKioqKioqKiogSVdpemFyZFBhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLSAgICAKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLSAgICAJCi0JCXJldHVybiB0aGlzLmZpbGVPclhtbENhdGFsb2dFbnRyeVNlbGVjdGVkKCkgJiYgKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCk7Ci0JfQotICAgIAotICAgIAotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCQotICAgIC8qIHJldHVybiB0aGUgZmlsZSwgaWYgYSBmaWxlIGlzIHNlbGVjdGVkICovCi0JcHVibGljIElGaWxlIGdldFNjaGVtYUZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLmdldEZpbGUoKTsKLQl9Ci0JCi0JLyogcmV0dXJuIHhtbCBjYXRhbG9nIGlkLCBpZiBhIGNhdGFsb2cgZW50cnkgaXMgc2VsZWN0ZWQgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dJZCgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCk7Ci0JfQotCQotCS8qIHJldHVybiBpZGVudGlmaWVyIG9mIHNjaGVtYSBsb2NhdGlvbiwgd2hldGhlciB1c2luZyBmaWxlIG9yIHhtbCBjYXRhbG9nICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpIHsKLQkJSUZpbGUgZmlsZSA9IHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0RmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGZhbHNlKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNlbGVjdFNvdXJjZVBhbmVsLmdldFhNTENhdGFsb2dJZCgpOwotCX0KLQkKLQkvKiByZXR1cm4gbG9jYWwgdXJpIG9mIHNjaGVtYSwgd2hldGhlciB1c2luZyBmaWxlIG9yIHhtbCBjYXRhbG9nICovCi0JcHVibGljIFVSSSBnZXRMb2NhbFNjaGVtYVVSSSgpIHsKLQkJSUZpbGUgZmlsZSA9IHRoaXMuc2VsZWN0U291cmNlUGFuZWwuZ2V0RmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCQotCQlTdHJpbmcgdXJpID0gdGhpcy5zZWxlY3RTb3VyY2VQYW5lbC5nZXRYTUxDYXRhbG9nVVJJKCk7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJcmV0dXJuIENvbW1vblBsdWdpbi5hc0xvY2FsVVJJKFVSSS5jcmVhdGVVUkkodXJpKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYXJnZXRQcm9qZWN0KCkgewotICAgIAlJV2l6YXJkUGFnZSBwcmV2aW91c1BhZ2UgPSB0aGlzLmdldFByZXZpb3VzUGFnZSgpOwotICAgIAkKLQkJaWYocHJldmlvdXNQYWdlIGluc3RhbmNlb2YgSmF2YVByb2plY3RXaXphcmRQYWdlKSB7Ci0JCQkvLyBnZXQgcHJvamVjdCBmcm9tIHByZXZpb3VzUGFnZQotCQkJdGhpcy50YXJnZXRQcm9qZWN0ID0gKCgoSmF2YVByb2plY3RXaXphcmRQYWdlKXByZXZpb3VzUGFnZSkuZ2V0SmF2YVByb2plY3QoKSkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWVsc2UgaWYoaW5pdGlhbFNlbGVjdGlvbiAhPSBudWxsICYmICEgdGhpcy5pbml0aWFsU2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJLy8gbm8gcHJldmlvdXNQYWdlIC0gZ2V0IHByb2plY3QgZnJvbSBpbml0aWFsU2VsZWN0aW9uCi0JCQl0aGlzLnRhcmdldFByb2plY3QgPSB0aGlzLmdldFByb2plY3RGcm9tSW5pdGlhbFNlbGVjdGlvbigpOwotCQl9CQkKLQl9Ci0JCi0gICAgcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oKSB7Ci0JCU9iamVjdCBmaXJzdEVsZW1lbnQgPSBpbml0aWFsU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJcmV0dXJuIChJUHJvamVjdClmaXJzdEVsZW1lbnQ7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCXJldHVybiAoKElSZXNvdXJjZSkgZmlyc3RFbGVtZW50KS5nZXRQcm9qZWN0KCk7Ci0JCX0KLQkJZWxzZSBpZihmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElKYXZhRWxlbWVudClmaXJzdEVsZW1lbnQpLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gZmlsZU9yWG1sQ2F0YWxvZ0VudHJ5U2VsZWN0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYUZpbGUoKSAhPSBudWxsIHx8IHRoaXMuZ2V0WE1MQ2F0YWxvZ0lkKCkgIT0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCVVSSSB1cmkgPSB0aGlzLmdldExvY2FsU2NoZW1hVVJJKCk7Ci0JCWlmICh1cmkgIT0gbnVsbCkgewotCQkJaWYgKCEgVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLnRvU3RyaW5nKCksIGZhbHNlKSkgewotCQkJCWVycm9yTWVzc2FnZSA9IEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYVdpemFyZFBhZ2VfZXJyb3JVcmlDYW5ub3RCZUxvY2F0ZWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsQ2hhbmdlZCgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IHRoaXMuY29tcHV0ZUVycm9yTWVzc2FnZSgpOwotCQl0aGlzLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0aGlzLmlzUGFnZUNvbXBsZXRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTRjZGM4Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogQ29kZSBvcmlnaW5hdGUgZnJvbSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCi0JcHVibGljIGludGVyZmFjZSBQYW5lbExpc3RlbmVyIHsKLQkJdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBhbmVsTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JcHJvdGVjdGVkIEJ1dHRvbltdIHJhZGlvQnV0dG9uOwotCXByb3RlY3RlZCBTZWxlY3RGaWxlUGFuZWwgc2VsZWN0RmlsZVBhbmVsOwotCXByb3RlY3RlZCBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCBzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbDsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkvLyBjb250YWluZXIgZ3JvdXAKLQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50ID0gNDAwOwotCQlnZC53aWR0aEhpbnQgPSA0MDA7Ci0JCXNldExheW91dERhdGEoZ2QpOwotCi0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCXJhZGlvQnV0dG9uWzBdLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWxfZmlsZUZyb21Xb3Jrc3BhY2UpOwotCQlyYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKHRydWUpOwotCQlyYWRpb0J1dHRvblswXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlyYWRpb0J1dHRvblsxXSA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW9CdXR0b25bMV0uc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbF94bWxDYXRhbG9nRW50cnkpOwotCQlyYWRpb0J1dHRvblsxXS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcmFkaW9CdXR0b25bMV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2sodGhpcywgU1dULk5PTkUpOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlzZWxlY3RGaWxlUGFuZWwgPSBuZXcgU2VsZWN0RmlsZVBhbmVsKHBhZ2VCb29rLCBzZWxlY3Rpb24pOwotCQl0aGlzLnNldFNpbmdsZUZpbGVWaWV3RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkKLQkJLy8gQ2F0YWxvZwotCQlJQ2F0YWxvZyB4bWxDYXRhbG9nID0gSnB0SmF4YlVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwocGFnZUJvb2ssIHhtbENhdGFsb2cpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JCQl9Ci0JCX0pOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdEZpbGVQYW5lbC5nZXRDb250cm9sKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTaW5nbGVGaWxlVmlld0RlZmF1bHRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5zZWxlY3RGaWxlUGFuZWwuc2V0RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlJRmlsZSByZXN1bHQgPSBudWxsOwotCQlpZiAocmFkaW9CdXR0b25bMF0uZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCXJlc3VsdCA9IHNlbGVjdEZpbGVQYW5lbC5nZXRGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJhZGlvQnV0dG9uWzFdLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXN1bHQgPSBzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRYTUxDYXRhbG9nRW50cnkoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MQ2F0YWxvZ0lkKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJhZGlvQnV0dG9uWzFdLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXN1bHQgPSBzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRJZCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nVVJJKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJhZGlvQnV0dG9uWzFdLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlyZXN1bHQgPSBzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRVUkkoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2dFbnRyeVR5cGUoaW50IGNhdGFsb2dFbnRyeVR5cGUpIHsKLQkJc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuc2V0Q2F0YWxvZ0VudHJ5VHlwZShjYXRhbG9nRW50cnlUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMpIHsKLQkJc2VsZWN0RmlsZVBhbmVsLnJlc2V0RmlsdGVycygpOwotCQlzZWxlY3RGaWxlUGFuZWwuYWRkRmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5nZXRUYWJsZVZpZXdlcigpLnNldEZpbHRlckV4dGVuc2lvbnMoZmlsdGVyRXh0ZW5zaW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlzdGVuZXIoUGFuZWxMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQlzZWxlY3RGaWxlUGFuZWwuc2V0VmlzaWJsZUhlbHBlcihpc1Zpc2libGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpIHsKLQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWxpc3RlbmVyLmNvbXBsZXRpb25TdGF0ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gcmFkaW9CdXR0b25bMF0pIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdEZpbGVQYW5lbC5nZXRDb250cm9sKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcGFnZUJvb2suc2hvd1BhZ2Uoc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwpOwotCQl9Ci0JCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3MgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBjbGFzcyBTZWxlY3RGaWxlUGFuZWwgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlVmlld0ZhY2FkZSBpbXBsZW1lbnRzIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLkxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgU2VsZWN0RmlsZVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJc3VwZXIoc2VsZWN0aW9uLCB0cnVlKTsKLQkJCS8vIFN0cmluZ1tdIGV4dCA9IHsiLmR0ZCJ9OwotCQkJLy8gYWRkRmlsdGVyRXh0ZW5zaW9ucyhleHQpOwotCQkJdGhpcy5jb250cm9sID0gdGhpcy5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCQl0aGlzLm92ZXJyaWRlSW1wb3J0QnV0dG9uVGV4dCgpOwotCi0JCQl0aGlzLmNvbnRyb2wuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlTZWxlY3RGaWxlUGFuZWwudGhpcy5zZXRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250cm9sOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Q29udHJvbENvbXBsZXRlKGJvb2xlYW4gaXNDb21wbGV0ZSkgewotCQkJdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgb3ZlcnJpZGVJbXBvcnRCdXR0b25UZXh0KCkgewotCQkgICAgdGhpcy5pbXBvcnRCdXR0b24uc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbF9pbXBvcnRCdXR0b24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1NlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODA5NWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmNsYXNzZXNnZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFNlbGVjdFNpbmdsZUZpbGVWaWV3Ci0gKiAgCi0gKiAgRmHnYWRlIGNsYXNzIHRvIGNoYW5nZSBhY2Nlc3NpYmlsaXR5IG9mIFNlbGVjdFNpbmdsZUZpbGVWaWV3LgotICovCi1wdWJsaWMgY2xhc3MgU2VsZWN0U2luZ2xlRmlsZVZpZXdGYWNhZGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcgewotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLnZpZXdlcnMuU2VsZWN0U2luZ2xlRmlsZVZpZXcuTGlzdGVuZXIKLQl7fQotCi0JcHVibGljIFNlbGVjdFNpbmdsZUZpbGVWaWV3RmFjYWRlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJc3VwZXIoc2VsZWN0aW9uLCBpc0ZpbGVNYW5kYXRvcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZmlsdGVyRXh0ZW5zaW9ucykgewotCQlzdXBlci5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCX0KLQotCXB1YmxpYyBDb21wb3NpdGUgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRGaWx0ZXJzKCkgewotCQlzdXBlci5yZXNldEZpbHRlcnMoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlSGVscGVyKGlzVmlzaWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2V0RGVmYXVsdFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2NsYXNzZXNnZW4vU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExNjg0Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9TZWxlY3RYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgaW50IGNhdGFsb2dFbnRyeVR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZG9UYWJsZVNpemVIYWNrID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmWG1sQ2F0YWxvZzsKLQotCXB1YmxpYyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChDb21wb3NpdGUgcGFyZW50LCBJQ2F0YWxvZyB4bWxDYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmZYbWxDYXRhbG9nID0geG1sQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNzAwOwotCQl0aGlzLnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dUYWJsZVRpdGxlKTsKLQotCQl0YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKHRoaXMpOwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJkdW1teSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciBjcmVhdGVUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBoZWFkaW5nc1tdID0gbmV3IFN0cmluZ1syXTsKLQkJaGVhZGluZ3NbMF0gPSBKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFXaXphcmRQYWdlX3htbENhdGFsb2dLZXlDb2x1bW47Ci0JCWhlYWRpbmdzWzFdID0gSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hV2l6YXJkUGFnZV94bWxDYXRhbG9nVXJpQ29sdW1uOwotCi0JCVhNTENhdGFsb2dUYWJsZVZpZXdlciB0aGVUYWJsZVZpZXdlciA9IG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIocGFyZW50LCBoZWFkaW5ncykgewotCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRYTUxDYXRhbG9nRW50cmllcyhMaXN0IGxpc3QsIElDYXRhbG9nRW50cnlbXSBlbnRyaWVzKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgZW50cnkgPSBlbnRyaWVzW2ldOwotCQkJCQlpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSAwKSB7Ci0JCQkJCQlsaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2F0YWxvZ0VudHJ5VHlwZSA9PSBlbnRyeS5nZXRFbnRyeVR5cGUoKSkgewotCQkJCQkJbGlzdC5hZGQoZW50cnkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRYTUxDYXRhbG9nRW50cmllcygpIHsKLQkJCQlMaXN0IHJlc3VsdCA9IG51bGw7Ci0KLQkJCQlpZiAoKGZYbWxDYXRhbG9nID09IG51bGwpIHx8IGRvVGFibGVTaXplSGFjaykgewotCQkJCQkvLyB0aGlzIGxldHMgdXMgY3JlYXRlIGEgdGFibGUgd2l0aCBhbiBpbml0aWFsIGhlaWdodCBvZgotCQkJCQkvLyAxMCByb3dzCi0JCQkJCS8vIG90aGVyd2lzZSB3ZSBnZXQgc3R1Y2sgd2l0aCAwIHJvdyBoZWlnaCB0YWJsZS4uLiB0aGF0J3MKLQkJCQkJLy8gdG9vIHNtYWxsCi0JCQkJCWRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCUlOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGZYbWxDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykgewotCQkJCQkJSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQkJCQlJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkJCWlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKEpwdEpheGJVaVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCQkJCQlhZGRYTUxDYXRhbG9nRW50cmllcyhyZXN1bHQsIHN5c3RlbUNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKSk7Ci0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoSnB0SmF4YlVpUGx1Z2luLlVTRVJfQ0FUQUxPR19JRC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJSUNhdGFsb2cgdXNlckNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLQkJCQkJCQkJYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCB1c2VyQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpKTsKLQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhlVGFibGVWaWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0S2V5KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFVSSSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgcmVzdWx0ID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQlyZXN1bHQgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXRoaXMuY2F0YWxvZ0VudHJ5VHlwZSA9IGNhdGFsb2dFbnRyeVR5cGU7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvY2xhc3Nlc2dlbi9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTI0ZjFjLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9jbGFzc2VzZ2VuL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIENvZGUgb3JpZ2luYXRlIGZyb20gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5jbGFzc2VzZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFUlJPUl9TVEFURV9LRVkgPSAiZXJyb3JzdGF0ZWtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZHRkRmlsZUltYWdlID0gSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHVua25vd25GaWxlSW1hZ2UgPSBKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgeHNkRmlsZUltYWdlID0gSnB0SmF4YlVpUGx1Z2luLmdldEltYWdlKCJpY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVycm9ySW1hZ2UgPSBKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2UoImljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gY29sdW1uUHJvcGVydGllcykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJVGFibGUgdGFibGUgPSBnZXRUYWJsZSgpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIGkpOwotCQkJY29sdW1uLnNldFRleHQoY29sdW1uUHJvcGVydGllc1tpXSk7Ci0JCQljb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCX0KLQkJdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZShmYWxzZSk7Ci0KLQkJc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5Qcm9wZXJ0aWVzKTsKLQotCQlzZXRDb250ZW50UHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlcigpKTsKLQkJc2V0TGFiZWxQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5TGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRYTUxDYXRhbG9nRW50cmllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiaGVsbG8iKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJ1biEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJcmVzZXRGaWx0ZXJzKCk7Ci0JCWFkZEZpbHRlcihuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKGV4dGVuc2lvbnMpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGlubmVyIGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQkJT2JqZWN0W10gYXJyYXkgPSBnZXRYTUxDYXRhbG9nRW50cmllcygpLnRvQXJyYXkoKTsKLQkJCUNvbXBhcmF0b3IgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlpbnQgcmVzdWx0ID0gMDsKLQkJCQkJaWYgKChvMSBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpICYmIChvMiBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpKSB7Ci0JCQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvMSA9IChJQ2F0YWxvZ0VudHJ5KSBvMTsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8yID0gKElDYXRhbG9nRW50cnkpIG8yOwotCQkJCQkJcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKG1hcHBpbmdJbmZvMS5nZXRLZXkoKSwgbWFwcGluZ0luZm8yLmdldEtleSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCUltYWdlIGJhc2UgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQkJaWYgKHVyaS5lbmRzV2l0aCgiZHRkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IGR0ZEZpbGVJbWFnZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh1cmkuZW5kc1dpdGgoInhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2UgPSB4c2RGaWxlSW1hZ2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQliYXNlID0gdW5rbm93bkZpbGVJbWFnZTsKLQkJCQkJfQotCi0JCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJCWlmIChVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJCXJlc3VsdCA9IGJhc2U7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBUT0RPLi4uIFNTRSBwb3J0Ci0JCQkJCQkJcmVzdWx0ID0gYmFzZTsvLyBpbWFnZUZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlSW1hZ2UoYmFzZSwKLQkJCQkJCQkvLyBlcnJvckltYWdlLAotCQkJCQkJCS8vIEltYWdlRmFjdG9yeS5CT1RUT01fTEVGVCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQlyZXN1bHQgPSBjb2x1bW5JbmRleCA9PSAwID8gY2F0YWxvZ0VudHJ5LmdldEtleSgpIDogY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCXJlc3VsdCA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wocmVzdWx0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQljbGFzcyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIgZXh0ZW5kcyBWaWV3ZXJGaWx0ZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQotCQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpbHRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIGVsZW1lbnQ7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChjYXRhbG9nRW50cnkuZ2V0VVJJKCkuZW5kc1dpdGgoZXh0ZW5zaW9uc1tpXSkpIHsKLQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvSmF4YkZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldC9KYXhiRmFjZXRJbnN0YWxsUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzUyNmI3Li4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9mYWNldC9KYXhiRmFjZXRJbnN0YWxsUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldC5KYXhiRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIEpheGJGYWNldEluc3RhbGxQYWdlCi0JCWV4dGVuZHMgSmF4YkZhY2V0UGFnZQotCQlpbXBsZW1lbnRzIEpheGJGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlwdWJsaWMgSmF4YkZhY2V0SW5zdGFsbFBhZ2UoKSB7Ci0JCXN1cGVyKCJqcHQuamF4Yi5mYWNldC5pbnN0YWxsLnBhZ2UiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvSmF4YkZhY2V0UGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2ZhY2V0L0pheGJGYWNldFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4OTdjZC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvSmF4YkZhY2V0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmZhY2V0LkpheGJGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeUluc3RhbGxEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkubGlicHJvdi5MaWJyYXJ5UHJvdmlkZXJGcmFtZXdvcmtVaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuRGF0YU1vZGVsRmFjZXRJbnN0YWxsUGFnZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF4YkZhY2V0UGFnZQotCQlleHRlbmRzIERhdGFNb2RlbEZhY2V0SW5zdGFsbFBhZ2UKLQkJaW1wbGVtZW50cyBKYXhiRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlwcm90ZWN0ZWQgSmF4YkZhY2V0UGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5KYXhiRmFjZXRXaXphcmRQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oSnB0SmF4YlVpTWVzc2FnZXMuSmF4YkZhY2V0V2l6YXJkUGFnZV9kZXNjKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEpwdEpheGJVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0SmF4YlVpSWNvbnMuSkFYQl9XSVpfQkFOTkVSKSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldENvbmZpZyhPYmplY3QgY29uZmlnKSB7Ci0JCWlmICghIChjb25maWcgaW5zdGFuY2VvZiBJRGF0YU1vZGVsKSkgewotCQkJY29uZmlnID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5sb2FkQWRhcHRlcihjb25maWcsIElEYXRhTW9kZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJfQotCQlzdXBlci5zZXRDb25maWcoY29uZmlnKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCi0JCWFkZFN1YkNvbXBvc2l0ZXMoY29tcG9zaXRlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLS8vCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0pQQV9GQUNFVCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCAgYWRkU3ViQ29tcG9zaXRlcyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCW5ldyBQbGF0Zm9ybUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCW5ldyBDbGFzc3BhdGhDb25maWdHcm91cChjb21wb3NpdGUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQl9Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCQlQTEFURk9STSwKLQkJCQlMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUKLQkJCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQlpZiAoISBzdXBlci5pc1BhZ2VDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IHRoaXMubW9kZWwudmFsaWRhdGUoKTsgCi0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCXNldEVycm9yTWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9OwotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYgKHZpc2libGUpIHsKLQkJCXNldEVycm9yTWVzc2FnZSgpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRyYW5zZmVyU3RhdGVUb0NvbmZpZygpIHsKLQkJLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gImZpbmlzaCIgaXMgYmVpbmcgcGVyZm9ybWVkLgotCQkvLyBXZSByZW1vdmUgInRoaXMiIGFzIGEgbGlzdGVuZXIgc28gdGhhdCBpdCB3aWxsIHN0b3AgcmVzcG9uZGluZyB0byBkYXRhIG1vZGVsIGNoYW5nZXMuCi0JCS8vICJUaGlzIiBsaXN0ZW5zIG9ubHkgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMsIGFuZCB3ZSBhcmUgZG9uZSB3aXRoIHZhbGlkYXRpb24gYXQgdGhpcwotCQkvLyBwb2ludC4gRnVydGhlcm1vcmUsIGFueSB2YWxpZGF0aW9uIGF0IHRoaXMgcG9pbnQgcnVucyBpbnRvIHRoZSBkYW5nZXIgb2YgZGVhZGxvY2tpbmcKLQkJLy8gdGhlIHdpemFyZC4KLQkJdGhpcy5tb2RlbC5yZW1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJdGhpcy5zeW5jaEhlbHBlci5kaXNwb3NlKCk7Ci0JCXN1cGVyLnRyYW5zZmVyU3RhdGVUb0NvbmZpZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCS8vIGRvbmUgdG8gcHJldmVudCAib3JwaGFuIiBwYWdlcyBmcm9tIHZhbGlkYXRpbmcKLQkJaWYgKGdldFdpemFyZCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZShib29sZWFuIHNob3dNZXNzYWdlKSB7Ci0JCS8vIGRvbmUgdG8gcHJldmVudCAib3JwaGFuIiBwYWdlcyBmcm9tIHZhbGlkYXRpbmcKLQkJaWYgKGdldFdpemFyZCgpID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJc3VwZXIudmFsaWRhdGVQYWdlKHNob3dNZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGZpbmFsIGNsYXNzIFBsYXRmb3JtR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gcGxhdGZvcm1Db21ibzsKLQkJCi0JCQotCQlwdWJsaWMgUGxhdGZvcm1Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuSmF4YkZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotLy8JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfSlBBX1BMQVRGT1JNKTsKLQotCQkJdGhpcy5wbGF0Zm9ybUNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOwotCQkJSmF4YkZhY2V0UGFnZS50aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8ocGxhdGZvcm1Db21ibywgUExBVEZPUk0sIG51bGwpOwotCQl9Ci0JfQotCQotCQotCXByb3RlY3RlZCBmaW5hbCBjbGFzcyBDbGFzc3BhdGhDb25maWdHcm91cCB7Ci0JCQotCQlwdWJsaWMgQ2xhc3NwYXRoQ29uZmlnR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQkJCi0JCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpYnJhcmllc0luc3RhbGxEZWxlZ2F0ZQotCQkJCQk9IChMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShMSUJSQVJZX0lOU1RBTExfREVMRUdBVEUpOwotCQkJCi0JCQlDb21wb3NpdGUgbGlicmFyaWVzQ29tcG9zaXRlIAotCQkJCQk9IChDb21wb3NpdGUpIExpYnJhcnlQcm92aWRlckZyYW1ld29ya1VpLmNyZWF0ZUluc3RhbGxMaWJyYXJ5UGFuZWwoCi0JCQkJCQkJY29tcG9zaXRlLCBsaWJyYXJpZXNJbnN0YWxsRGVsZWdhdGUsIAotCQkJCQkJCUpwdEpheGJVaU1lc3NhZ2VzLkpheGJGYWNldFdpemFyZFBhZ2VfamF4YkltcGxlbWVudGF0aW9uTGFiZWwpOwotCQkJbGlicmFyaWVzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotLy8JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGxpYnJhcmllc0NvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwkJCQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL2ZhY2V0L0pheGJGYWNldFZlcnNpb25DaGFuZ2VQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZlMWU0My4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvZmFjZXQvSmF4YkZhY2V0VmVyc2lvbkNoYW5nZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZmFjZXQuSmF4YkZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBKYXhiRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZQotCQlleHRlbmRzIEpheGJGYWNldFBhZ2UKLQkJaW1wbGVtZW50cyBKYXhiRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvcGVydGllcyB7Ci0JCi0JcHVibGljIEpheGJGYWNldFZlcnNpb25DaGFuZ2VQYWdlKCkgewotCQlzdXBlcigianB0LmpheGIuZmFjZXQudmVyc2lvbkNoYW5nZS5wYWdlIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSmF4YlByb2plY3RXaXphcmQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL0pheGJQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NmQ0Y2UuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSmF4YlByb2plY3RXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5KcHRKYXhiVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLm1vZGVsLkpheGJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQ7Ci0KLQotcHVibGljIGNsYXNzIEpheGJQcm9qZWN0V2l6YXJkCi0JCWV4dGVuZHMgTmV3UHJvamVjdERhdGFNb2RlbEZhY2V0V2l6YXJkIHsKLQkKLQlwdWJsaWMgSmF4YlByb2plY3RXaXphcmQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJQcm9qZWN0V2l6YXJkX3RpdGxlKTsKLQl9Ci0JCi0JcHVibGljIEpheGJQcm9qZWN0V2l6YXJkKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JCXNldFdpbmRvd1RpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLkpheGJQcm9qZWN0V2l6YXJkX3RpdGxlKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBnZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIEpwdEpheGJVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0SmF4YlVpSWNvbnMuSkFYQl9XSVpfQkFOTkVSKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElXaXphcmRQYWdlIGNyZWF0ZUZpcnN0UGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBKYXhiUHJvamVjdFdpemFyZEZpcnN0UGFnZShtb2RlbCwgImZpcnN0LnBhZ2UiKTsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgY3JlYXRlRGF0YU1vZGVsKCkgewotCQlyZXR1cm4gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEpheGJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoImpwdC5qYXhiLnRlbXBsYXRlIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSmF4YlByb2plY3RXaXphcmRGaXJzdFBhZ2UuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL0pheGJQcm9qZWN0V2l6YXJkRmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMWVjMDcuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSmF4YlByb2plY3RXaXphcmRGaXJzdFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud2ViLnVpLmludGVybmFsLndpemFyZHMuRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2U7Ci0KLQotcHVibGljIGNsYXNzIEpheGJQcm9qZWN0V2l6YXJkRmlyc3RQYWdlCi0JCWV4dGVuZHMgRGF0YU1vZGVsRmFjZXRDcmVhdGlvbldpemFyZFBhZ2UgewotCQotCXB1YmxpYyBKYXhiUHJvamVjdFdpemFyZEZpcnN0UGFnZShJRGF0YU1vZGVsIGRhdGFNb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCwgcGFnZU5hbWUpOwotCQlzZXRUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5KYXhiUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihKcHRKYXhiVWlNZXNzYWdlcy5KYXhiUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzYyk7Ci0JCS8vc2V0SW5mb3BvcElEKEpwYUpheGJIZWxwQ29udGV4dElkcy5ORVdfSkFYQl9QUk9KRUNUKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSB0b3AgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQljcmVhdGVXb3JraW5nU2V0R3JvdXBQYW5lbCh0b3AsIG5ldyBTdHJpbmdbXSB7IFJFU09VUkNFX1dPUktJTkdfU0VULCBKQVZBX1dPUktJTkdfU0VUIH0pOwotCQlyZXR1cm4gdG9wOwotCX0KLQkKLS8vCUBPdmVycmlkZQotLy8JcHVibGljIGJvb2xlYW4gaW50ZXJuYWxMYXVuY2hOZXdSdW50aW1lV2l6YXJkKFNoZWxsIHNoZWxsLCBJRGF0YU1vZGVsIG1vZGVsKSB7Ci0vLwkJSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnB3YyA9IChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgbW9kZWwuZ2V0UHJvcGVydHkoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0vLwkJSVByb2plY3RGYWNldFZlcnNpb24gbW9kdWxlRmFjZXQgPSBGYWNldFRvb2xzLmdldE1vZHVsZUZhY2V0KGZwd2MpOwotLy8JCWlmIChtb2R1bGVGYWNldCAhPSBudWxsKSB7Ci0vLwkJCXJldHVybiBsYXVuY2hOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBtb2RlbCwgbW9kdWxlRmFjZXQuZ2V0UHJvamVjdEZhY2V0KCkuZ2V0SWQoKSk7Ci0vLwkJfQotLy8JCWVsc2UgewotLy8JCQlyZXR1cm4gbGF1bmNoTmV3UnVudGltZVdpemFyZChzaGVsbCwgbW9kZWwpOwotLy8JCX0KLS8vCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZHVsZVR5cGVJRCgpIHsKLQkJcmV0dXJuIEpheGJGYWNldC5JRDsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgCXN1cGVyLnN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgCS8vIFRPRE8KLS8vICAgIAlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotLy8gICAgCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0vLyAgICAJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0vLyAgICAJCVN0cmluZyBmYWNldElEID0gZ2V0TW9kdWxlRmFjZXRJRCgpOwotLy8gICAgCQlJRGF0YU1vZGVsIGoyZWVNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChmYWNldElEKTsKLS8vICAgIAkJaWYoajJlZU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUikpewotLy8gICAgCQkJU3RyaW5nIGxhc3RFQVJOYW1lID0gajJlZU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLS8vICAgIAkJCXNldHRpbmdzLnB1dChTVE9SRV9MQUJFTCwgbGFzdEVBUk5hbWUpOwotLy8gICAgCQl9Ci0vLyAgICAJfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotICAgIAlzdXBlci5yZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgICAgIC8vIFRPRE8KLS8vICAgIAlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotLy8gICAgCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0vLyAgICAJCVN0cmluZyBsYXN0RUFSTmFtZSA9IHNldHRpbmdzLmdldChTVE9SRV9MQUJFTCk7Ci0vLyAgICAJCWlmIChsYXN0RUFSTmFtZSAhPSBudWxsKXsKLS8vICAgIAkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0vLyAgICAJCQlTdHJpbmcgZmFjZXRJRCA9IGdldE1vZHVsZUZhY2V0SUQoKTsKLS8vICAgIAkJCUlEYXRhTW9kZWwgajJlZU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0SUQpOwotLy8gICAgCQkJajJlZU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5MQVNUX0VBUl9OQU1FLCBsYXN0RUFSTmFtZSk7Ci0vLyAgICAJCX0KLS8vICAgIAl9Ci0gICAgfQotICAgIAotLy8gICAgQE92ZXJyaWRlCi0vLyAgICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotLy8gICAgCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0vLyAgICB9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9tb2RlbC9KYXhiUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL21vZGVsL0pheGJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njc0N2IwLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL21vZGVsL0pheGJQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5pbnRlcm5hbC53aXphcmRzLnByb2oubW9kZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSmF4YkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLkZhY2V0UHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldDsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0JCWV4dGVuZHMgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCQlpbXBsZW1lbnRzIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXB1YmxpYyBKYXhiUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCXN1cGVyLmluaXQoKTsKLQkJCi0JCUNvbGxlY3Rpb248SVByb2plY3RGYWNldD4gcmVxdWlyZWRGYWNldHMgPSBuZXcgQXJyYXlMaXN0PElQcm9qZWN0RmFjZXQ+KCk7Ci0JCXJlcXVpcmVkRmFjZXRzLmFkZChKYXZhRmFjZXQuRkFDRVQpOwotCQlyZXF1aXJlZEZhY2V0cy5hZGQoSmF4YkZhY2V0LkZBQ0VUKTsKLQkJc2V0UHJvcGVydHkoUkVRVUlSRURfRkFDRVRTX0NPTExFQ1RJT04sIHJlcXVpcmVkRmFjZXRzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL0Fic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL0Fic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MDNlMWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9BYnN0cmFjdEphckRlc3RpbmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuc2NoZW1hZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmphcnBhY2thZ2VyLkphclBhY2thZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci0KLS8qKgotICogIEZh52FkZSBjbGFzcyB0byBjaGFuZ2UgYWNjZXNzaWJpbGl0eSBvZiBBYnN0cmFjdEphckRlc3RpbmF0aW9uV2l6YXJkUGFnZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphckRlc3RpbmF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXJwYWNrYWdlci5BYnN0cmFjdEphckRlc3RpbmF0aW9uV2l6YXJkUGFnZQotewotCi0JcHVibGljIEFic3RyYWN0SmFyRGVzdGluYXRpb25XaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBKYXJQYWNrYWdlRGF0YSBqYXJQYWNrYWdlKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24sIGphclBhY2thZ2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9DaGVja2JveFRyZWVBbmRMaXN0R3JvdXAuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vQ2hlY2tib3hUcmVlQW5kTGlzdEdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTFhNWUuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9DaGVja2JveFRyZWVBbmRMaXN0R3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiBDb2RlIG9yaWdpbmF0ZSBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5qYXJwYWNrYWdlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLndpemFyZHMuc2NoZW1hZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tib3hUYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVWaWV3ZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlRXhwYW5zaW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlOwotCi0vKioKLSAqCUNvbWJpbmVzIGEgQ2hlY2tib3hUcmVlVmlld2VyIGFuZCBDaGVja2JveExpc3RWaWV3ZXIuCi0gKglBbGwgdmlld2VyIHNlbGVjdGlvbi1kcml2ZW4gaW50ZXJhY3Rpb25zIGFyZSBoYW5kbGVkIHdpdGhpbiB0aGlzIHZpZXdlcgotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tib3hUcmVlQW5kTGlzdEdyb3VwIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciwgSVRyZWVWaWV3ZXJMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIE9iamVjdCBmUm9vdDsKLQlwcml2YXRlIE9iamVjdCBmQ3VycmVudFRyZWVTZWxlY3Rpb247Ci0JcHJpdmF0ZSBMaXN0IGZFeHBhbmRlZFRyZWVOb2Rlcz0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTWFwIGZDaGVja2VkU3RhdGVTdG9yZT0gdGhpcy5idWlsZENoZWNrZWRTdGF0ZVN0b3JlKCk7Ci0JcHJpdmF0ZSBMaXN0IGZXaGl0ZUNoZWNrZWRUcmVlSXRlbXM9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgZkxpc3RlbmVycz0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBJVHJlZUNvbnRlbnRQcm92aWRlciBmVHJlZUNvbnRlbnRQcm92aWRlcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIGZMaXN0Q29udGVudFByb3ZpZGVyOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZlRyZWVMYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgZkxpc3RMYWJlbFByb3ZpZGVyOwotCi0JLy8gd2lkZ2V0cwotCXByaXZhdGUgQ2hlY2tib3hUcmVlVmlld2VyIGZUcmVlVmlld2VyOwotCXByaXZhdGUgQ2hlY2tib3hUYWJsZVZpZXdlciBmTGlzdFZpZXdlcjsKLQotCS8qKgotCSAqCUNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4gIFVzZSB0aGlzIGNvbnN0cnVjdG9yIGlmIHlvdSB3aXNoIHRvIHNwZWNpZnkKLQkgKgl0aGUgd2lkdGggYW5kL29yIGhlaWdodCBvZiB0aGUgY29tYmluZWQgd2lkZ2V0ICh0byBvbmx5IGhhcmRjb2RlIG9uZSBvZiB0aGUKLQkgKglzaXppbmcgZGltZW5zaW9ucywgc3BlY2lmeSB0aGUgb3RoZXIgZGltZW5zaW9uJ3MgdmFsdWUgYXMgLTEpCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHJvb3RPYmplY3QKLQkgKiBAcGFyYW0gdHJlZUNvbnRlbnRQcm92aWRlcgotCSAqIEBwYXJhbSB0cmVlTGFiZWxQcm92aWRlcgotCSAqIEBwYXJhbSBsaXN0Q29udGVudFByb3ZpZGVyCi0JICogQHBhcmFtIGxpc3RMYWJlbFByb3ZpZGVyCi0JICogQHBhcmFtIHN0eWxlCi0JICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodAotCSAqLwotCXB1YmxpYyBDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJT2JqZWN0IHJvb3RPYmplY3QsCi0JCQlJVHJlZUNvbnRlbnRQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyLAotCQkJSUxhYmVsUHJvdmlkZXIgdHJlZUxhYmVsUHJvdmlkZXIsCi0JCQlJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciBsaXN0Q29udGVudFByb3ZpZGVyLAotCQkJSUxhYmVsUHJvdmlkZXIgbGlzdExhYmVsUHJvdmlkZXIsCi0JCQlpbnQgc3R5bGUsCi0JCQlpbnQgd2lkdGgsCi0JCQlpbnQgaGVpZ2h0KSB7Ci0JCWZSb290PSByb290T2JqZWN0OwotCQlmVHJlZUNvbnRlbnRQcm92aWRlcj0gdHJlZUNvbnRlbnRQcm92aWRlcjsKLQkJZkxpc3RDb250ZW50UHJvdmlkZXI9IGxpc3RDb250ZW50UHJvdmlkZXI7Ci0JCWZUcmVlTGFiZWxQcm92aWRlcj0gdHJlZUxhYmVsUHJvdmlkZXI7Ci0JCWZMaXN0TGFiZWxQcm92aWRlcj0gbGlzdExhYmVsUHJvdmlkZXI7Ci0JCWNyZWF0ZUNvbnRlbnRzKHBhcmVudCwgd2lkdGgsIGhlaWdodCwgc3R5bGUpOwotCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGlzIHdpbmRvdyBiZWNvbWVzIHZpc2libGUuCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb09wZW4oKSB7Ci0JCWRldGVybWluZVdoaXRlQ2hlY2tlZERlc2NlbmRlbnRzKGZSb290KTsKLQkJY2hlY2tOZXdUcmVlRWxlbWVudHMoZ2V0VHJlZUNoaWxkcmVuKGZSb290KSk7Ci0JCWZDdXJyZW50VHJlZVNlbGVjdGlvbj0gbnVsbDsKLQotCQkvL3NlbGVjdCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdAotCQlPYmplY3RbXSBlbGVtZW50cz0gZ2V0VHJlZUNoaWxkcmVuKGZSb290KTsKLQkJT2JqZWN0IHByaW1hcnk9IGVsZW1lbnRzLmxlbmd0aCA+IDAgPyBlbGVtZW50c1swXSA6IG51bGw7Ci0JCWlmIChwcmltYXJ5ICE9IG51bGwpIHsKLQkJCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihwcmltYXJ5KSk7Ci0JCX0KLQkJZlRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCS8qKgotCSAqCUFkZHMgdGhlIHBhc3NlZCBsaXN0ZW5lciB0byBzZWxmJ3MgY29sbGVjdGlvbiBvZiBjbGllbnRzCi0JICoJdGhhdCBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gZWxlbWVudCBjaGVja2VkIHN0YXRlcwotCSAqCi0JICoJQHBhcmFtIGxpc3RlbmVyIElDaGVja1N0YXRlTGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDaGVja1N0YXRlTGlzdGVuZXIoSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCS8qKgotCSAqIEFkZHMgdGhlIHJlY2VpdmVyIGFuZCBhbGwgb2YgaXQncyBhbmNlc3RvcnMgdG8gdGhlIGNoZWNrZWRTdGF0ZVN0b3JlIGlmIHRoZXkKLQkgKiBhcmUgbm90IGFscmVhZHkgdGhlcmUuCi0JICogQHBhcmFtIHRyZWVFbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvSGllcmFyY2h5VG9DaGVja2VkU3RvcmUoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0KLQkJLy8gaWYgdGhpcyB0cmVlIGVsZW1lbnQgaXMgYWxyZWFkeSBncmF5IHRoZW4gaXRzIGFuY2VzdG9ycyBhbGwgYXJlIGFzIHdlbGwKLQkJaWYgKCFmQ2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnNLZXkodHJlZUVsZW1lbnQpKQotCQkJZkNoZWNrZWRTdGF0ZVN0b3JlLnB1dCh0cmVlRWxlbWVudCwgbmV3IEFycmF5TGlzdCgpKTsKLQotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQlhZGRUb0hpZXJhcmNoeVRvQ2hlY2tlZFN0b3JlKHBhcmVudCk7Ci0JfQotCS8qKgotCSAqCVJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgY2hpbGRyZW4gb2YgdGhlIHBhc3NlZCB0cmVlIGVsZW1lbnQKLQkgKglhcmUgY3VycmVudGx5IHdoaXRlLWNoZWNrZWQKLQkgKgotCSAqCUByZXR1cm4gYm9vbGVhbgotCSAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXJlQWxsQ2hpbGRyZW5XaGl0ZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuPSBnZXRUcmVlQ2hpbGRyZW4odHJlZUVsZW1lbnQpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWlmICghZldoaXRlQ2hlY2tlZFRyZWVJdGVtcy5jb250YWlucyhjaGlsZHJlbltpXSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqCVJldHVybnMgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciBhbGwgbGlzdCBlbGVtZW50cyBhc3NvY2lhdGVkIHdpdGgKLQkgKgl0aGUgcGFzc2VkIHRyZWUgZWxlbWVudCBhcmUgY3VycmVudGx5IGNoZWNrZWQKLQkgKgotCSAqCUByZXR1cm4gYm9vbGVhbgotCSAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYXJlQWxsRWxlbWVudHNDaGVja2VkKE9iamVjdCB0cmVlRWxlbWVudCkgewotCQlMaXN0IGNoZWNrZWRFbGVtZW50cz0gKExpc3QpZkNoZWNrZWRTdGF0ZVN0b3JlLmdldCh0cmVlRWxlbWVudCk7Ci0JCWlmIChjaGVja2VkRWxlbWVudHMgPT0gbnVsbCkgLy8gaWUuLSB0cmVlIGl0ZW0gbm90IGV2ZW4gZ3JheS1jaGVja2VkCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIGdldExpc3RJdGVtc1NpemUodHJlZUVsZW1lbnQpID09IGNoZWNrZWRFbGVtZW50cy5zaXplKCk7Ci0JfQotCS8qKgotCSAqCUl0ZXJhdGVzIHRocm91Z2ggdGhlIHBhc3NlZCBlbGVtZW50cyB3aGljaCBhcmUgYmVpbmcgcmVhbGl6ZWQgZm9yIHRoZSBmaXJzdAotCSAqCXRpbWUgYW5kIGNoZWNrIGVhY2ggb25lIGluIHRoZSB0cmVlIHZpZXdlciBhcyBhcHByb3ByaWF0ZQotCSAqIEBwYXJhbSBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNoZWNrTmV3VHJlZUVsZW1lbnRzKE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGk9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJT2JqZWN0IGN1cnJlbnRFbGVtZW50PSBlbGVtZW50c1tpXTsKLQkJCWJvb2xlYW4gY2hlY2tlZD0gZkNoZWNrZWRTdGF0ZVN0b3JlLmNvbnRhaW5zS2V5KGN1cnJlbnRFbGVtZW50KTsKLQkJCWZUcmVlVmlld2VyLnNldENoZWNrZWQoY3VycmVudEVsZW1lbnQsIGNoZWNrZWQpOwotCQkJZlRyZWVWaWV3ZXIuc2V0R3JheWVkKAotCQkJCWN1cnJlbnRFbGVtZW50LAotCQkJCWNoZWNrZWQgJiYgIWZXaGl0ZUNoZWNrZWRUcmVlSXRlbXMuY29udGFpbnMoY3VycmVudEVsZW1lbnQpKTsKLQkJfQotCX0KLQkvKioKLQkqCUFuIGl0ZW0gd2FzIGNoZWNrZWQgaW4gb25lIG9mIHNlbGYncyB0d28gdmlld3MuICBEZXRlcm1pbmUgd2hpY2gKLQkqCXZpZXcgdGhpcyBvY2N1cnJlZCBpbiBhbmQgZGVsZWdhdGUgYXBwcm9wcmlhdGVseQotCSoKLQkqCUBwYXJhbSBldmVudCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50Ci0JKi8KLQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChmaW5hbCBDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0KLQkJLy9Qb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiAtIHNob3cgYSBidXN5IGN1cnNvcgotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmVHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGV2ZW50LmdldENoZWNrYWJsZSgpLmVxdWFscyhmVHJlZVZpZXdlcikpCi0JCQkJCXRyZWVJdGVtQ2hlY2tlZChldmVudC5nZXRFbGVtZW50KCksIGV2ZW50LmdldENoZWNrZWQoKSk7Ci0JCQkJZWxzZQotCQkJCQlsaXN0SXRlbUNoZWNrZWQoZXZlbnQuZ2V0RWxlbWVudCgpLCBldmVudC5nZXRDaGVja2VkKCksIHRydWUpOwotCi0JCQkJbm90aWZ5Q2hlY2tTdGF0ZUNoYW5nZUxpc3RlbmVycyhldmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkvKioKLQkgKglMYXkgb3V0IGFuZCBpbml0aWFsaXplIHNlbGYncyB2aXN1YWwgY29tcG9uZW50cy4KLQkgKgotCSAqCUBwYXJhbSBwYXJlbnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICoJQHBhcmFtIHdpZHRoIGludAotCSAqCUBwYXJhbSBoZWlnaHQgaW50Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHMoCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCWludCB3aWR0aCwKLQkJaW50IGhlaWdodCwKLQkJaW50IHN0eWxlKSB7Ci0JCS8vIGdyb3VwIHBhbmUKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZT0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIHN0eWxlKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zPSAyOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoPSB0cnVlOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0PSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGg9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWNyZWF0ZVRyZWVWaWV3ZXIoY29tcG9zaXRlLCB3aWR0aCAvIDIsIGhlaWdodCk7Ci0JCWNyZWF0ZUxpc3RWaWV3ZXIoY29tcG9zaXRlLCB3aWR0aCAvIDIsIGhlaWdodCk7Ci0KLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkvKioKLQkgKglDcmVhdGVzIHRoaXMgZ3JvdXAncyBsaXN0IHZpZXdlci4KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUxpc3RWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCWZMaXN0Vmlld2VyPSBDaGVja2JveFRhYmxlVmlld2VyLm5ld0NoZWNrTGlzdChwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlmTGlzdFZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQlHcmlkRGF0YSBkYXRhPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQ9IHdpZHRoOwotCQlkYXRhLmhlaWdodEhpbnQ9IGhlaWdodDsKLQkJZkxpc3RWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmTGlzdFZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZkxpc3RDb250ZW50UHJvdmlkZXIpOwotCQlmTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGZMaXN0TGFiZWxQcm92aWRlcik7Ci0JCWZMaXN0Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0JLyoqCi0JICoJQ3JlYXRlcyB0aGlzIGdyb3VwJ3MgdHJlZSB2aWV3ZXIuCi0JICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY29tcG9zaXRlCi0JICogQHBhcmFtIHdpZHRoIHRoZSB3aWR0aAotCSAqIEBwYXJhbSBoZWlnaHQgdGhlIGhlaWdodAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0JCVRyZWUgdHJlZT0gbmV3IFRyZWUocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50PSB3aWR0aDsKLQkJZGF0YS5oZWlnaHRIaW50PSBoZWlnaHQ7Ci0JCXRyZWUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmVHJlZVZpZXdlcj0gbmV3IENoZWNrYm94VHJlZVZpZXdlcih0cmVlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0VXNlSGFzaGxvb2t1cCh0cnVlKTsKLQkJZlRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKGZUcmVlQ29udGVudFByb3ZpZGVyKTsKLQkJZlRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihmVHJlZUxhYmVsUHJvdmlkZXIpOwotCQlmVHJlZVZpZXdlci5hZGRUcmVlTGlzdGVuZXIodGhpcyk7Ci0JCWZUcmVlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJZlRyZWVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhc3NlZCB0cmVlIGVsZW1lbnQgc2hvdWxkIGJlCi0JICogYXQgTEVBU1QgZ3JheS1jaGVja2VkLiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNvbnNpZGVyIHdoZXRoZXIKLQkgKiBpdCBzaG91bGQgYmUgd2hpdGUtY2hlY2tlZCwgc28gYSBzcGVjaWZpZWQgdHJlZSBpdGVtIHdoaWNoIHNob3VsZCBiZQotCSAqIHdoaXRlLWNoZWNrZWQgd2lsbCByZXN1bHQgaW4gYSA8Y29kZT50cnVlPC9jb2RlPiBhbnN3ZXIgZnJvbSB0aGlzIG1ldGhvZC4KLQkgKiBUbyBkZXRlcm1pbmUgd2hldGhlciBhIHRyZWUgaXRlbSBzaG91bGQgYmUgd2hpdGUtY2hlY2tlZCB1c2UgbWV0aG9kCi0JICogI2RldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKE9iamVjdCkuCi0JICoKLQkgKiBAcGFyYW0gdHJlZUVsZW1lbnQgamF2YS5sYW5nLk9iamVjdAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBzZWUgI2RldGVybWluZVNob3VsZEJlV2hpdGVDaGVja2VkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0ZXJtaW5lU2hvdWxkQmVBdExlYXN0R3JheUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCS8vIGlmIGFueSBsaXN0IGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0cmVlRWxlbWVudCBhcmUgY2hlY2tlZCB0aGVuIGl0Ci0JCS8vIHJldGFpbnMgaXRzIGdyYXktY2hlY2tlZCBzdGF0dXMgcmVnYXJkbGVzcyBvZiBpdHMgY2hpbGRyZW4KLQkJTGlzdCBjaGVja2VkPSAoTGlzdCkgZkNoZWNrZWRTdGF0ZVN0b3JlLmdldCh0cmVlRWxlbWVudCk7Ci0JCWlmIChjaGVja2VkICE9IG51bGwgJiYgKCFjaGVja2VkLmlzRW1wdHkoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBpZiBhbnkgY2hpbGRyZW4gb2YgdHJlZUVsZW1lbnQgYXJlIHN0aWxsIGdyYXktY2hlY2tlZCB0aGVuIHRyZWVFbGVtZW50Ci0JCS8vIG11c3QgcmVtYWluIGdyYXktY2hlY2tlZCBhcyB3ZWxsCi0JCU9iamVjdFtdIGNoaWxkcmVuPSBnZXRUcmVlQ2hpbGRyZW4odHJlZUVsZW1lbnQpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKLQkJCWlmIChmQ2hlY2tlZFN0YXRlU3RvcmUuY29udGFpbnNLZXkoY2hpbGRyZW5baV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhc3NlZCB0cmVlIGl0ZW0gc2hvdWxkIGJlCi0JICogd2hpdGUtY2hlY2tlZC4KLQkgKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCXJldHVybiBhcmVBbGxDaGlsZHJlbldoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCkKLQkJCSYmIGFyZUFsbEVsZW1lbnRzQ2hlY2tlZCh0cmVlRWxlbWVudCk7Ci0JfQotCS8qKgotCSAqCVJlY3Vyc2l2ZWx5IGFkZHMgYXBwcm9wcmlhdGUgdHJlZSBlbGVtZW50cyB0byB0aGUgY29sbGVjdGlvbiBvZgotCSAqCWtub3duIHdoaXRlLWNoZWNrZWQgdHJlZSBlbGVtZW50cy4KLQkgKgotCSAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGV0ZXJtaW5lV2hpdGVDaGVja2VkRGVzY2VuZGVudHMoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCS8vIGFsd2F5cyBnbyB0aHJvdWdoIGFsbCBjaGlsZHJlbiBmaXJzdCBzaW5jZSB0aGVpciB3aGl0ZS1jaGVja2VkCi0JCS8vIHN0YXR1c2VzIHdpbGwgYmUgbmVlZGVkIHRvIGRldGVybWluZSB0aGUgd2hpdGUtY2hlY2tlZCBzdGF0dXMgZm9yCi0JCS8vIHRoaXMgdHJlZSBlbGVtZW50Ci0JCU9iamVjdFtdIGNoaWxkcmVuPSBnZXRUcmVlQ2hpbGRyZW4odHJlZUVsZW1lbnQpOwotCQlmb3IgKGludCBpPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpCi0JCQlkZXRlcm1pbmVXaGl0ZUNoZWNrZWREZXNjZW5kZW50cyhjaGlsZHJlbltpXSk7Ci0KLQkJLy8gbm93IGRldGVybWluZSB0aGUgd2hpdGUtY2hlY2tlZCBzdGF0dXMgZm9yIHRoaXMgdHJlZSBlbGVtZW50Ci0JCWlmIChkZXRlcm1pbmVTaG91bGRCZVdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCkpCi0JCQlzZXRXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQsIHRydWUpOwotCX0KLQkvKioKLQkgKiBDYXVzZXMgdGhlIHRyZWUgdmlld2VyIHRvIGV4cGFuZCBhbGwgaXRzIGl0ZW1zCi0JICovCi0JcHVibGljIHZvaWQgZXhwYW5kQWxsKCkgewotCQlmVHJlZVZpZXdlci5leHBhbmRBbGwoKTsKLQl9Ci0JLyoqCi0JICoJQW5zd2VycyBhIGZsYXQgY29sbGVjdGlvbiBvZiBhbGwgb2YgdGhlIGNoZWNrZWQgZWxlbWVudHMgaW4gdGhlCi0JICoJbGlzdCBwb3J0aW9uIG9mIHNlbGYKLQkgKgotCSAqCUByZXR1cm4gamF2YS51dGlsLlZlY3RvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRBbGxDaGVja2VkTGlzdEl0ZW1zKCkgewotCQlTZXQgcmVzdWx0PSBuZXcgSGFzaFNldCgpOwotCQlJdGVyYXRvciBsaXN0Q29sbGVjdGlvbnNFbnVtPSB0aGlzLmZDaGVja2VkU3RhdGVTdG9yZS52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAobGlzdENvbGxlY3Rpb25zRW51bS5oYXNOZXh0KCkpCi0JCQlyZXN1bHQuYWRkQWxsKChMaXN0KWxpc3RDb2xsZWN0aW9uc0VudW0ubmV4dCgpKTsKLQkJcmV0dXJuIHJlc3VsdC5pdGVyYXRvcigpOwotCX0KLQkvKioKLQkgKglBbnN3ZXIgYSBjb2xsZWN0aW9uIG9mIGFsbCBvZiB0aGUgY2hlY2tlZCBlbGVtZW50cyBpbiB0aGUgdHJlZSBwb3J0aW9uCi0JICoJb2Ygc2VsZgotCSAqCi0JICoJQHJldHVybiBqYXZhLnV0aWwuVmVjdG9yCi0JICovCi0JcHVibGljIFNldCBnZXRBbGxDaGVja2VkVHJlZUl0ZW1zKCkgewotCQlyZXR1cm4gbmV3IEhhc2hTZXQoZkNoZWNrZWRTdGF0ZVN0b3JlLmtleVNldCgpKTsKLQl9Ci0JLyoqCi0JICoJQW5zd2VycyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgYnkgdGhlCi0JICoJdXNlci4KLQkgKgotCSAqCUByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDaGVja2VkRWxlbWVudENvdW50KCkgewotCQlyZXR1cm4gZkNoZWNrZWRTdGF0ZVN0b3JlLnNpemUoKTsKLQl9Ci0JLyoqCi0JICoJUmV0dXJucyBhIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgbGlzdCBpdGVtcyBhc3NvY2lhdGVkIHdpdGggYQotCSAqCWdpdmVuIHRyZWUgaXRlbS4KLQkgKgotCSAqCUByZXR1cm4gaW50Ci0JICoJQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldExpc3RJdGVtc1NpemUoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzPSBnZXRMaXN0RWxlbWVudHModHJlZUVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudHMubGVuZ3RoOwotCX0KLQkvKioKLQkgKiBHZXRzIHRoZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRoZSBmb2xkZXIgY29udGVudAotCSAqCi0JICogQHJldHVybiB0aGUgdGFibGUgdXNlZCB0byBzaG93IHRoZSBsaXN0Ci0JICovCi0JcHVibGljIFRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gZkxpc3RWaWV3ZXIuZ2V0VGFibGUoKTsKLQl9Ci0JLyoqCi0JICogR2V0cyB0aGUgdHJlZSB0aGF0IGRpc3BsYXlzIHRoZSBsaXN0IGZvciBhIGZvbGRlcgotCSAqCi0JICogQHJldHVybiB0aGUgdHJlZSB1c2VkIHRvIHNob3cgdGhlIGZvbGRlcnMKLQkgKi8KLQlwdWJsaWMgVHJlZSBnZXRUcmVlKCkgewotCQlyZXR1cm4gZlRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotCX0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBmaWx0ZXIgdG8gdGhlIHRyZWUgdmlld2VyIGFuZAotCSAqIHRyaWdnZXJzIHJlZmlsdGVyaW5nIGFuZCByZXNvcnRpbmcgb2YgdGhlIGVsZW1lbnRzLgotCSAqCi0JICogQHBhcmFtIGZpbHRlciBhIHZpZXdlciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUcmVlRmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIHsKLQkJZlRyZWVWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVRyZWVGaWx0ZXIoVmlld2VyRmlsdGVyIGZpbHRlcikgewotCQlmVHJlZVZpZXdlci5yZW1vdmVGaWx0ZXIoZmlsdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBmaWx0ZXIgdG8gdGhlIGxpc3Qgdmlld2VyIGFuZAotCSAqIHRyaWdnZXJzIHJlZmlsdGVyaW5nIGFuZCByZXNvcnRpbmcgb2YgdGhlIGVsZW1lbnRzLgotCSAqCi0JICogQHBhcmFtIGZpbHRlciBhIHZpZXdlciBmaWx0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0RmlsdGVyKFZpZXdlckZpbHRlciBmaWx0ZXIpIHsKLQkJZkxpc3RWaWV3ZXIuYWRkRmlsdGVyKGZpbHRlcik7Ci0JfQotCi0JLyoqCi0JICoJTG9naWNhbGx5IGdyYXktY2hlY2sgYWxsIGFuY2VzdG9ycyBvZiB0cmVlSXRlbSBieSBlbnN1cmluZyB0aGF0IHRoZXkKLQkgKglhcHBlYXIgaW4gdGhlIGNoZWNrZWQgdGFibGUKLQkgKiBAcGFyYW0gdHJlZUVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBncmF5Q2hlY2tIaWVyYXJjaHkoT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0KLQkJLy8gaWYgdGhpcyB0cmVlIGVsZW1lbnQgaXMgYWxyZWFkeSBncmF5IHRoZW4gaXRzIGFuY2VzdG9ycyBhbGwgYXJlIGFzIHdlbGwKLQkJaWYgKGZDaGVja2VkU3RhdGVTdG9yZS5jb250YWluc0tleSh0cmVlRWxlbWVudCkpCi0JCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gcHJvY2VlZCB1cHdhcmRzIGZyb20gaGVyZQotCi0JCWZDaGVja2VkU3RhdGVTdG9yZS5wdXQodHJlZUVsZW1lbnQsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCWlmIChkZXRlcm1pbmVTaG91bGRCZVdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCkpIHsKLQkJCXNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgdHJ1ZSk7Ci0JCX0KLQkJT2JqZWN0IHBhcmVudD0gZlRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KHRyZWVFbGVtZW50KTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJZ3JheUNoZWNrSGllcmFyY2h5KHBhcmVudCk7Ci0JfQotCS8qKgotCSAqCVNldHMgdGhlIGluaXRpYWwgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgcGFzc2VkIGxpc3QgZWxlbWVudCB0byB0cnVlLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbENoZWNrTGlzdEl0ZW0oT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0IHBhcmVudD0gZlRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQlmQ3VycmVudFRyZWVTZWxlY3Rpb249IHBhcmVudDsKLQkJLy9BcyB0aGlzIGlzIG5vdCBkb25lIGZyb20gdGhlIFVJIHRoZW4gc2V0IHRoZSBib3ggZm9yIHVwZGF0aW5nIGZyb20gdGhlIHNlbGVjdGlvbiB0byBmYWxzZQotCQlsaXN0SXRlbUNoZWNrZWQoZWxlbWVudCwgdHJ1ZSwgZmFsc2UpOwotCQl1cGRhdGVIaWVyYXJjaHkocGFyZW50KTsKLQl9Ci0JLyoqCi0JICoJU2V0cyB0aGUgaW5pdGlhbCBjaGVja2VkIHN0YXRlIG9mIHRoZSBwYXNzZWQgZWxlbWVudCB0byB0cnVlLAotCSAqCWFzIHdlbGwgYXMgdG8gYWxsIG9mIGl0cyBjaGlsZHJlbiBhbmQgYXNzb2NpYXRlZCBsaXN0IGVsZW1lbnRzCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsQ2hlY2tUcmVlSXRlbShPYmplY3QgZWxlbWVudCkgewotCQl0cmVlSXRlbUNoZWNrZWQoZWxlbWVudCwgdHJ1ZSk7Ci0JfQotCS8qKgotCSAqCUluaXRpYWxpemVzIHRoaXMgZ3JvdXAncyB2aWV3ZXJzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGxhaWQgb3V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWZUcmVlVmlld2VyLnNldElucHV0KGZSb290KTsKLQl9Ci0JLyoqCi0JICoJQ2FsbGJhY2sgdGhhdCdzIGludm9rZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0dXMgb2YgYW4gaXRlbSBpbiB0aGUgbGlzdAotCSAqCWlzIGNoYW5nZWQgYnkgdGhlIHVzZXIuIERvIG5vdCB0cnkgYW5kIHVwZGF0ZSB0aGUgaGllcmFyY2h5IGlmIHdlIGFyZSBidWlsZGluZyB0aGUKLQkgKiAgaW5pdGlhbCBsaXN0LgotCSAqIEBwYXJhbSBsaXN0RWxlbWVudAotCSAqIEBwYXJhbSBzdGF0ZQotCSAqIEBwYXJhbSB1cGRhdGluZ0Zyb21TZWxlY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsaXN0SXRlbUNoZWNrZWQoCi0JCU9iamVjdCBsaXN0RWxlbWVudCwKLQkJYm9vbGVhbiBzdGF0ZSwKLQkJYm9vbGVhbiB1cGRhdGluZ0Zyb21TZWxlY3Rpb24pIHsKLQkJTGlzdCBjaGVja2VkTGlzdEl0ZW1zPSAoTGlzdCkgZkNoZWNrZWRTdGF0ZVN0b3JlLmdldChmQ3VycmVudFRyZWVTZWxlY3Rpb24pOwotCi0JCWlmIChzdGF0ZSkgewotCQkJaWYgKGNoZWNrZWRMaXN0SXRlbXMgPT0gbnVsbCkgewotCQkJCS8vIHNpbmNlIHRoZSBhc3NvY2lhdGVkIHRyZWUgaXRlbSBoYXMgZ29uZSBmcm9tIDAgLT4gMSBjaGVja2VkCi0JCQkJLy8gbGlzdCBpdGVtcywgdHJlZSBjaGVja2luZyBtYXkgbmVlZCB0byBiZSB1cGRhdGVkCi0JCQkJZ3JheUNoZWNrSGllcmFyY2h5KGZDdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0JCQkJY2hlY2tlZExpc3RJdGVtcz0gKExpc3QpIGZDaGVja2VkU3RhdGVTdG9yZS5nZXQoZkN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLQkJCX0KLQkJCWNoZWNrZWRMaXN0SXRlbXMuYWRkKGxpc3RFbGVtZW50KTsKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZWRMaXN0SXRlbXMucmVtb3ZlKGxpc3RFbGVtZW50KTsKLQkJCWlmIChjaGVja2VkTGlzdEl0ZW1zLmlzRW1wdHkoKSkgewotCQkJCS8vIHNpbmNlIHRoZSBhc3NvY2lhdGVkIHRyZWUgaXRlbSBoYXMgZ29uZSBmcm9tIDEgLT4gMCBjaGVja2VkCi0JCQkJLy8gbGlzdCBpdGVtcywgdHJlZSBjaGVja2luZyBtYXkgbmVlZCB0byBiZSB1cGRhdGVkCi0JCQkJdW5ncmF5Q2hlY2tIaWVyYXJjaHkoZkN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmICh1cGRhdGluZ0Zyb21TZWxlY3Rpb24pCi0JCQl1cGRhdGVIaWVyYXJjaHkoZkN1cnJlbnRUcmVlU2VsZWN0aW9uKTsKLQl9Ci0JLyoqCi0JICoJTm90aWZpZXMgYWxsIGNoZWNrZWQgc3RhdGUgbGlzdGVuZXJzIHRoYXQgdGhlIHBhc3NlZCBlbGVtZW50IGhhcyBoYWQKLQkgKglpdHMgY2hlY2tlZCBzdGF0ZSBjaGFuZ2VkIHRvIHRoZSBwYXNzZWQgc3RhdGUKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGVja1N0YXRlQ2hhbmdlTGlzdGVuZXJzKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgbGlzdGVuZXJzRW51bT0gZkxpc3RlbmVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAobGlzdGVuZXJzRW51bS5oYXNOZXh0KCkpCi0JCQkgKChJQ2hlY2tTdGF0ZUxpc3RlbmVyKSBsaXN0ZW5lcnNFbnVtLm5leHQoKSkuY2hlY2tTdGF0ZUNoYW5nZWQoZXZlbnQpOwotCX0KLQkvKioKLQkgKlNldHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXN0IHZpZXdlciBiYXNlZCB1cG9uIHRoZSBzcGVjaWZpZWQgc2VsZWN0ZWQKLQkgKnRyZWUgZWxlbWVudC4gIFRoaXMgYWxzbyBpbmNsdWRlcyBjaGVja2luZyB0aGUgYXBwcm9wcmlhdGUgbGlzdCBpdGVtcy4KLQkgKgotCSAqQHBhcmFtIHRyZWVFbGVtZW50IGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZUxpc3RWaWV3ZXIoZmluYWwgT2JqZWN0IHRyZWVFbGVtZW50KSB7Ci0JCWlmICh0cmVlRWxlbWVudCA9PSBmQ3VycmVudFRyZWVTZWxlY3Rpb24pCi0JCQlyZXR1cm47Ci0JCWZDdXJyZW50VHJlZVNlbGVjdGlvbj0gdHJlZUVsZW1lbnQ7Ci0JCWZMaXN0Vmlld2VyLnNldElucHV0KHRyZWVFbGVtZW50KTsKLQkJTGlzdCBsaXN0SXRlbXNUb0NoZWNrPSAoTGlzdCkgZkNoZWNrZWRTdGF0ZVN0b3JlLmdldCh0cmVlRWxlbWVudCk7Ci0KLQkJaWYgKGxpc3RJdGVtc1RvQ2hlY2sgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgbGlzdEl0ZW1zRW51bT0gbGlzdEl0ZW1zVG9DaGVjay5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGxpc3RJdGVtc0VudW0uaGFzTmV4dCgpKQotCQkJCWZMaXN0Vmlld2VyLnNldENoZWNrZWQobGlzdEl0ZW1zRW51bS5uZXh0KCksIHRydWUpOwotCQl9Ci0JfQotCS8qKgotCSAqCVJlbW92ZXMgdGhlIHBhc3NlZCBsaXN0ZW5lciBmcm9tIHNlbGYncyBjb2xsZWN0aW9uIG9mIGNsaWVudHMKLQkgKgl0aGF0IGxpc3RlbiBmb3IgY2hhbmdlcyB0byBlbGVtZW50IGNoZWNrZWQgc3RhdGVzCi0JICoKLQkgKglAcGFyYW0gbGlzdGVuZXIgSUNoZWNrU3RhdGVMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoZWNrU3RhdGVMaXN0ZW5lcihJQ2hlY2tTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JLyoqCi0JICoJSGFuZGxlcyB0aGUgc2VsZWN0aW9uIG9mIGFuIGl0ZW0gaW4gdGhlIHRyZWUgdmlld2VyCi0JICoKLQkgKglAcGFyYW0gZXZlbnQgSVNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFRhYmxlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb249IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJT2JqZWN0IHNlbGVjdGVkRWxlbWVudD0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCWlmIChzZWxlY3RlZEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQlmQ3VycmVudFRyZWVTZWxlY3Rpb249IG51bGw7Ci0JCQkJCWZMaXN0Vmlld2VyLnNldElucHV0KGZDdXJyZW50VHJlZVNlbGVjdGlvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJcG9wdWxhdGVMaXN0Vmlld2VyKHNlbGVjdGVkRWxlbWVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgb3IgZGVzZWxlY3QgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgdHJlZSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSBzZWxlY3Rpb24KLQkgKiBib29sZWFuLiBCZSBzdXJlIHRvIHVwZGF0ZSB0aGUgZGlzcGxheWVkIGZpbGVzIGFzIHdlbGwuCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbFNlbGVjdGlvbnMoZmluYWwgYm9vbGVhbiBzZWxlY3Rpb24pIHsKLQotCQkvL1BvdGVudGlhbGx5IGxvbmcgb3BlcmF0aW9uIC0gc2hvdyBhIGJ1c3kgY3Vyc29yCi0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZUcmVlVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzZXRUcmVlQ2hlY2tlZChmUm9vdCwgc2VsZWN0aW9uKTsKLQkJCQlmTGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqCVNldHMgdGhlIGxpc3Qgdmlld2VyJ3MgcHJvdmlkZXJzIHRvIHRob3NlIHBhc3NlZAotCSAqCi0JICoJQHBhcmFtIGNvbnRlbnRQcm92aWRlciBJVHJlZUNvbnRlbnRQcm92aWRlcgotCSAqCUBwYXJhbSBsYWJlbFByb3ZpZGVyIElMYWJlbFByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFByb3ZpZGVycygKLQkJSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCWZMaXN0Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlmTGlzdFZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCX0KLQkvKioKLQkgKglTZXRzIHRoZSBzb3J0ZXIgdGhhdCBpcyB0byBiZSBhcHBsaWVkIHRvIHNlbGYncyBsaXN0IHZpZXdlcgotCSAqIEBwYXJhbSBjb21wYXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdENvbXBhcmF0b3IoVmlld2VyQ29tcGFyYXRvciBjb21wYXJhdG9yKSB7Ci0JCWZMaXN0Vmlld2VyLnNldENvbXBhcmF0b3IoY29tcGFyYXRvcik7Ci0JfQotCS8qKgotCSAqIFNldHMgdGhlIHJvb3Qgb2YgdGhlIHdpZGdldCB0byBiZSBuZXcgUm9vdC4gUmVnZW5lcmF0ZSBhbGwgb2YgdGhlIHRhYmxlcyBhbmQgbGlzdHMgZnJvbSB0aGlzCi0JICogdmFsdWUuCi0JICoKLQkgKiBAcGFyYW0gbmV3Um9vdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3QoT2JqZWN0IG5ld1Jvb3QpIHsKLQkJdGhpcy5mUm9vdD0gbmV3Um9vdDsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkvKioKLQkgKglTZXRzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHRoZSBwYXNzZWQgdHJlZSBlbGVtZW50IGFwcHJvcHJpYXRlbHksIGFuZAotCSAqCWRvIHNvIHJlY3Vyc2l2ZWx5IHRvIGFsbCBvZiBpdHMgY2hpbGQgdHJlZSBlbGVtZW50cyBhcyB3ZWxsCi0JICogQHBhcmFtIHRyZWVFbGVtZW50Ci0JICogQHBhcmFtIHN0YXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0KLQkJaWYgKHRyZWVFbGVtZW50LmVxdWFscyhmQ3VycmVudFRyZWVTZWxlY3Rpb24pKSB7Ci0JCQlmTGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKHN0YXRlKTsKLQkJfQotCi0JCWlmIChzdGF0ZSkgewotCQkJT2JqZWN0W10gbGlzdEl0ZW1zPSBnZXRMaXN0RWxlbWVudHModHJlZUVsZW1lbnQpOwotCQkJTGlzdCBsaXN0SXRlbXNDaGVja2VkPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpPSAwOyBpIDwgbGlzdEl0ZW1zLmxlbmd0aDsgKytpKQotCQkJCWxpc3RJdGVtc0NoZWNrZWQuYWRkKGxpc3RJdGVtc1tpXSk7Ci0KLQkJCWZDaGVja2VkU3RhdGVTdG9yZS5wdXQodHJlZUVsZW1lbnQsIGxpc3RJdGVtc0NoZWNrZWQpOwotCQl9IGVsc2UKLQkJCWZDaGVja2VkU3RhdGVTdG9yZS5yZW1vdmUodHJlZUVsZW1lbnQpOwotCi0JCXNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgc3RhdGUpOwotCQlmVHJlZVZpZXdlci5zZXRDaGVja2VkKHRyZWVFbGVtZW50LCBzdGF0ZSk7Ci0JCWZUcmVlVmlld2VyLnNldEdyYXllZCh0cmVlRWxlbWVudCwgZmFsc2UpOwotCi0JCS8vIG5vdyBsb2dpY2FsbHkgY2hlY2svdW5jaGVjayBhbGwgY2hpbGRyZW4gYXMgd2VsbAotCQlPYmplY3RbXSBjaGlsZHJlbj0gZ2V0VHJlZUNoaWxkcmVuKHRyZWVFbGVtZW50KTsKLQkJZm9yIChpbnQgaT0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7Ci0JCQlzZXRUcmVlQ2hlY2tlZChjaGlsZHJlbltpXSwgc3RhdGUpOwotCQl9Ci0JfQotCS8qKgotCSAqCVNldHMgdGhlIHRyZWUgdmlld2VyJ3MgcHJvdmlkZXJzIHRvIHRob3NlIHBhc3NlZAotCSAqCi0JICoJQHBhcmFtIGNvbnRlbnRQcm92aWRlciBJVHJlZUNvbnRlbnRQcm92aWRlcgotCSAqCUBwYXJhbSBsYWJlbFByb3ZpZGVyIElMYWJlbFByb3ZpZGVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJlZVByb3ZpZGVycygKLQkJSVRyZWVDb250ZW50UHJvdmlkZXIgY29udGVudFByb3ZpZGVyLAotCQlJTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCWZUcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlmVHJlZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGxhYmVsUHJvdmlkZXIpOwotCX0KLQkvKioKLQkgKglTZXRzIHRoZSBzb3J0ZXIgdGhhdCBpcyB0byBiZSBhcHBsaWVkIHRvIHNlbGYncyB0cmVlIHZpZXdlcgotCSAqIEBwYXJhbSBzb3J0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmVlQ29tcGFyYXRvcihWaWV3ZXJDb21wYXJhdG9yIHNvcnRlcikgewotCQlmVHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKHNvcnRlcik7Ci0JfQotCS8qKgotCSAqCUFkanVzdHMgdGhlIGNvbGxlY3Rpb24gb2YgcmVmZXJlbmNlcyB0byB3aGl0ZS1jaGVja2VkIHRyZWUgZWxlbWVudHMgYXBwcm9wcmlhdGVseS4KLQkgKgotCSAqCUBwYXJhbSB0cmVlRWxlbWVudCBqYXZhLmxhbmcuT2JqZWN0Ci0JICoJQHBhcmFtIGlzV2hpdGVDaGVja2VkIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaGl0ZUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIGlzV2hpdGVDaGVja2VkKSB7Ci0JCWlmIChpc1doaXRlQ2hlY2tlZCkgewotCQkJaWYgKCFmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLmNvbnRhaW5zKHRyZWVFbGVtZW50KSkKLQkJCQlmV2hpdGVDaGVja2VkVHJlZUl0ZW1zLmFkZCh0cmVlRWxlbWVudCk7Ci0JCX0gZWxzZQotCQkJZldoaXRlQ2hlY2tlZFRyZWVJdGVtcy5yZW1vdmUodHJlZUVsZW1lbnQpOwotCX0KLQkvKioKLQkgKglIYW5kbGUgdGhlIGNvbGxhcHNpbmcgb2YgYW4gZWxlbWVudCBpbiBhIHRyZWUgdmlld2VyCi0JICogQHBhcmFtIGV2ZW50Ci0JICovCi0JcHVibGljIHZvaWQgdHJlZUNvbGxhcHNlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQkJLy8gV2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyB3aXRoIHRoaXMKLQl9Ci0KLQkvKioKLQkgKglIYW5kbGVzIHRoZSBleHBhbnNpb25zaW9uIG9mIGFuIGVsZW1lbnQgaW4gYSB0cmVlIHZpZXdlcgotCSAqIEBwYXJhbSBldmVudAotCSAqLwotCXB1YmxpYyB2b2lkIHRyZWVFeHBhbmRlZChUcmVlRXhwYW5zaW9uRXZlbnQgZXZlbnQpIHsKLQotCQlPYmplY3QgaXRlbT0gZXZlbnQuZ2V0RWxlbWVudCgpOwotCi0JCS8vIEZpcnN0IHNlZSBpZiB0aGUgY2hpbGRyZW4gbmVlZCB0byBiZSBnaXZlbiB0aGVpciBjaGVja2VkIHN0YXRlIGF0IGFsbC4gIElmIHRoZXkndmUKLQkJLy8gYWxyZWFkeSBiZWVuIHJlYWxpemVkIHRoZW4gdGhpcyB3b24ndCBiZSBuZWNlc3NhcnkKLQkJaWYgKCFmRXhwYW5kZWRUcmVlTm9kZXMuY29udGFpbnMoaXRlbSkpIHsKLQkJCWZFeHBhbmRlZFRyZWVOb2Rlcy5hZGQoaXRlbSk7Ci0JCQljaGVja05ld1RyZWVFbGVtZW50cyhnZXRUcmVlQ2hpbGRyZW4oaXRlbSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIENhbGxiYWNrIHRoYXQncyBpbnZva2VkIHdoZW4gdGhlIGNoZWNrZWQgc3RhdHVzIG9mIGFuIGl0ZW0gaW4gdGhlIHRyZWUKLQkgKiAgaXMgY2hhbmdlZCBieSB0aGUgdXNlci4KLQkgKiBAcGFyYW0gdHJlZUVsZW1lbnQKLQkgKiBAcGFyYW0gc3RhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmVlSXRlbUNoZWNrZWQoT2JqZWN0IHRyZWVFbGVtZW50LCBib29sZWFuIHN0YXRlKSB7Ci0KLQkJLy8gcmVjdXJzaXZlbHkgYWRqdXN0IGFsbCBjaGlsZCB0cmVlIGVsZW1lbnRzIGFwcHJvcHJpYXRlbHkKLQkJc2V0VHJlZUNoZWNrZWQodHJlZUVsZW1lbnQsIHN0YXRlKTsKLQotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gbm93IHVwZGF0ZSB1cHdhcmRzIGluIHRoZSB0cmVlIGhpZXJhcmNoeQotCQlpZiAoc3RhdGUpCi0JCQlncmF5Q2hlY2tIaWVyYXJjaHkocGFyZW50KTsKLQkJZWxzZQotCQkJdW5ncmF5Q2hlY2tIaWVyYXJjaHkocGFyZW50KTsKLQotCQl1cGRhdGVIaWVyYXJjaHkodHJlZUVsZW1lbnQpOwotCX0KLQkvKioKLQkgKglMb2dpY2FsbHkgdW4tZ3JheS1jaGVjayBhbGwgYW5jZXN0b3JzIG9mIHRyZWVJdGVtIGlmZiBhcHByb3ByaWF0ZS4KLQkgKiBAcGFyYW0gdHJlZUVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1bmdyYXlDaGVja0hpZXJhcmNoeShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQkJaWYgKCFkZXRlcm1pbmVTaG91bGRCZUF0TGVhc3RHcmF5Q2hlY2tlZCh0cmVlRWxlbWVudCkpCi0JCQlmQ2hlY2tlZFN0YXRlU3RvcmUucmVtb3ZlKHRyZWVFbGVtZW50KTsKLQotCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQodHJlZUVsZW1lbnQpOwotCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQl1bmdyYXlDaGVja0hpZXJhcmNoeShwYXJlbnQpOwotCX0KLQkvKioKLQkgKglTZXRzIHRoZSBjaGVja2VkIHN0YXRlIG9mIHNlbGYgYW5kIGFsbCBhbmNlc3RvcnMgYXBwcm9wcmlhdGVseQotCSAqIEBwYXJhbSB0cmVlRWxlbWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUhpZXJhcmNoeShPYmplY3QgdHJlZUVsZW1lbnQpIHsKLQotCQlib29sZWFuIHdoaXRlQ2hlY2tlZD0gZGV0ZXJtaW5lU2hvdWxkQmVXaGl0ZUNoZWNrZWQodHJlZUVsZW1lbnQpOwotCQlib29sZWFuIHNob3VsZEJlQXRMZWFzdEdyYXk9IGRldGVybWluZVNob3VsZEJlQXRMZWFzdEdyYXlDaGVja2VkKHRyZWVFbGVtZW50KTsKLQotCQlmVHJlZVZpZXdlci5zZXRDaGVja2VkKHRyZWVFbGVtZW50LCB3aGl0ZUNoZWNrZWQgfHwgc2hvdWxkQmVBdExlYXN0R3JheSk7Ci0JCXNldFdoaXRlQ2hlY2tlZCh0cmVlRWxlbWVudCwgd2hpdGVDaGVja2VkKTsKLQkJaWYgKHdoaXRlQ2hlY2tlZCkKLQkJCWZUcmVlVmlld2VyLnNldEdyYXllZCh0cmVlRWxlbWVudCwgZmFsc2UpOwotCQllbHNlCi0JCQlmVHJlZVZpZXdlci5zZXRHcmF5ZWQodHJlZUVsZW1lbnQsIHNob3VsZEJlQXRMZWFzdEdyYXkpOwotCi0JCS8vIHByb2NlZWQgdXAgdGhlIHRyZWUgZWxlbWVudCBoaWVyYXJjaHkKLQkJT2JqZWN0IHBhcmVudD0gZlRyZWVDb250ZW50UHJvdmlkZXIuZ2V0UGFyZW50KHRyZWVFbGVtZW50KTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl1cGRhdGVIaWVyYXJjaHkocGFyZW50KTsKLQkJfQotCX0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHNlbGVjdGlvbnMgb2YgdGhlIHRyZWUgZWxlbWVudHMgaW4gaXRlbXMgdG8gcmVmbGVjdCB0aGUgbmV3Ci0JICogc2VsZWN0aW9ucyBwcm92aWRlZC4KLQkgKgotCSAqIEBwYXJhbSBpdGVtcyB3aXRoIGtleXMgb2YgT2JqZWN0ICh0aGUgdHJlZSBlbGVtZW50KSBhbmQgdmFsdWVzIG9mIExpc3QgKHRoZSBzZWxlY3RlZAotCSAqIGxpc3QgZWxlbWVudHMpLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVNlbGVjdGlvbnMoZmluYWwgTWFwIGl0ZW1zKSB7Ci0KLQkJLy9Qb3RlbnRpYWxseSBsb25nIG9wZXJhdGlvbiAtIHNob3cgYSBidXN5IGN1cnNvcgotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmVHJlZVZpZXdlci5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaGFuZGxlVXBkYXRlU2VsZWN0aW9uKGl0ZW1zKTsKLQkJCX0KLQkJfSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIHRoZSBnaXZlbiBlbGVtZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJzLgotCSAqIEBwYXJhbSBmaWx0ZXJzCi0JICoKLQkgKiBAcGFyYW0gZWxlbWVudHMgdGhlIGVsZW1lbnRzIHRvIGZpbHRlcgotCSAqIEByZXR1cm4gb25seSB0aGUgZWxlbWVudHMgd2hpY2ggYWxsIGZpbHRlcnMgYWNjZXB0Ci0JICovCi0JcHJvdGVjdGVkIE9iamVjdFtdIGZpbHRlcihWaWV3ZXJGaWx0ZXJbXSBmaWx0ZXJzLCBPYmplY3RbXSBlbGVtZW50cykgewotCQlpZiAoZmlsdGVycyAhPSBudWxsKSB7Ci0JCQlBcnJheUxpc3QgZmlsdGVyZWQgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYm9vbGVhbiBhZGQgPSB0cnVlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmlsdGVycy5sZW5ndGg7IGorKykgewotCQkJCQlhZGQgPSBmaWx0ZXJzW2pdLnNlbGVjdChudWxsLCBudWxsLCBlbGVtZW50c1tpXSk7Ci0JCQkJCWlmICghYWRkKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChhZGQpCi0JCQkJCWZpbHRlcmVkLmFkZChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmlsdGVyZWQudG9BcnJheSgpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFRyZWVDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmlsdGVyKGZUcmVlVmlld2VyLmdldEZpbHRlcnMoKSwgZlRyZWVDb250ZW50UHJvdmlkZXIuZ2V0Q2hpbGRyZW4oZWxlbWVudCkpOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0TGlzdEVsZW1lbnRzKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmaWx0ZXIoZkxpc3RWaWV3ZXIuZ2V0RmlsdGVycygpLCBmTGlzdENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhlbGVtZW50KSk7Ci0JfQotCi0JcHVibGljIFNldCBnZXRXaGl0ZUNoZWNrZWRUcmVlSXRlbXMoKSB7Ci0JCXJldHVybiBuZXcgSGFzaFNldChmV2hpdGVDaGVja2VkVHJlZUl0ZW1zKTsKLQl9Ci0KLQlwcml2YXRlIEhhc2hNYXAgYnVpbGRDaGVja2VkU3RhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIG5ldyBIYXNoTWFwKDkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlVXBkYXRlU2VsZWN0aW9uKE1hcCBpdGVtcykgewotCQlJdGVyYXRvciBrZXlJdGVyYXRvcj0gaXRlbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQkvL1VwZGF0ZSB0aGUgc3RvcmUgYmVmb3JlIHRoZSBoaWVyYXJjaHkgdG8gcHJldmVudCB1cGRhdGluZyBwYXJlbnRzIGJlZm9yZSBhbGwgb2YgdGhlIGNoaWxkcmVuIGFyZSBkb25lCi0JCXdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXk9IGtleUl0ZXJhdG9yLm5leHQoKTsKLQkJCS8vUmVwbGFjZSB0aGUgaXRlbXMgaW4gdGhlIGNoZWNrZWQgc3RhdGUgc3RvcmUgd2l0aCB0aG9zZSBmcm9tIHRoZSBzdXBwbGllZCBpdGVtcwotCQkJTGlzdCBzZWxlY3Rpb25zPSAoTGlzdCkgaXRlbXMuZ2V0KGtleSk7Ci0JCQlpZiAoc2VsZWN0aW9ucy5zaXplKCkgPT0gMCkKLQkJCQkvL0lmIGl0IGlzIGVtcHR5IHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0Ci0JCQkJZkNoZWNrZWRTdGF0ZVN0b3JlLnJlbW92ZShrZXkpOwotCQkJZWxzZSB7Ci0JCQkJZkNoZWNrZWRTdGF0ZVN0b3JlLnB1dChrZXksIHNlbGVjdGlvbnMpOwotCQkJCS8vIHByb2NlZWQgdXAgdGhlIHRyZWUgZWxlbWVudCBoaWVyYXJjaHkKLQkJCQlPYmplY3QgcGFyZW50PSBmVHJlZUNvbnRlbnRQcm92aWRlci5nZXRQYXJlbnQoa2V5KTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQkJYWRkVG9IaWVyYXJjaHlUb0NoZWNrZWRTdG9yZShwYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vTm93IHVwZGF0ZSBoaWVyYXJjaGllcwotCQlrZXlJdGVyYXRvcj0gaXRlbXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoa2V5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qga2V5PSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0JCQl1cGRhdGVIaWVyYXJjaHkoa2V5KTsKLQkJCWlmIChmQ3VycmVudFRyZWVTZWxlY3Rpb24gIT0gbnVsbCAmJiBmQ3VycmVudFRyZWVTZWxlY3Rpb24uZXF1YWxzKGtleSkpIHsKLQkJCQlmTGlzdFZpZXdlci5zZXRBbGxDaGVja2VkKGZhbHNlKTsKLQkJCQlmTGlzdFZpZXdlci5zZXRDaGVja2VkRWxlbWVudHMoKChMaXN0KSBpdGVtcy5nZXQoa2V5KSkudG9BcnJheSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGlzIGdyZXkgY2hlY2tlZC4KLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogQHJldHVybiBpZiBhbiBlbGVtZW50IGlzIGdyZXkgY2hlY2tlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RyZWVJdGVtR3JleUNoZWNrZWQoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZlRyZWVWaWV3ZXIuZ2V0R3JheWVkKG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICogRm9yIGEgZ2l2ZW4gZWxlbWVudCwgZXhwYW5kIGl0cyBjaGlkcmVuIHRvIGEgbGV2ZWwuCi0JICogQHBhcmFtIG9iamVjdAotCSAqIEBwYXJhbSBsZXZlbAotCSAqLwotCXB1YmxpYyB2b2lkIGV4cGFuZFRyZWVUb0xldmVsKE9iamVjdCBvYmplY3QsIGludCBsZXZlbCkgewotCQlmVHJlZVZpZXdlci5leHBhbmRUb0xldmVsKG9iamVjdCwgbGV2ZWwpOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJlZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlmVHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9OZXdTY2hlbWFGaWxlV2l6YXJkUGFnZS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9OZXdTY2hlbWFGaWxlV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZjYjkxLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5zY2hlbWFnZW47Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuUFJPSkVDVDsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5zY2hlbWFnZW4uU2NoZW1hR2VuZXJhdG9yV2l6YXJkLlhTRF9FWFRFTlNJT047Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkZpbGVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuSnB0SmF4YlVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5pZGUuSURFV29ya2JlbmNoTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqICBOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZQotICovCi1wdWJsaWMgY2xhc3MgTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBkYXRhTW9kZWw7IAotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBpbml0aWFsU2VsZWN0aW9uOwotCQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIERFRkFVTFRfU0NIRU1BX05BTUUgPSAiTmV3WE1MU2NoZW1hIiArIFhTRF9FWFRFTlNJT047ICAgLy8kTk9OLU5MUy0xJAotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCQotCXB1YmxpYyBOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSURhdGFNb2RlbCBkYXRhTW9kZWwsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCXRoaXMuaW5pdGlhbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQotCQl0aGlzLmluaXQoZGF0YU1vZGVsKTsKLQkJdGhpcy5zZXRUaXRsZSh0aXRsZSk7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXRoaXMuZGF0YU1vZGVsID0gZGF0YU1vZGVsOwotCQkKLQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCk7Ci0JCXRoaXMuZGF0YU1vZGVsLnNldFByb3BlcnR5KFBST0pFQ1QsIHByb2plY3QpOwotCQkKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IChJUGF0aCkgdGhpcy5kYXRhTW9kZWwuZ2V0UHJvcGVydHkoQ09OVEFJTkVSX1BBVEgpOwotCQlpZiAoY29udGFpbmVyUGF0aCAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldENvbnRhaW5lckZ1bGxQYXRoKGNvbnRhaW5lclBhdGgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBJRGlhbG9nUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotICAgIAlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0gICAgCQotICAgIAl0aGlzLnNldEFsbG93RXhpc3RpbmdSZXNvdXJjZXModHJ1ZSk7Ci0JCXRoaXMuc2V0RmlsZU5hbWUoREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0gICAgfQotCQotCS8vICoqKioqKioqKiogaW50cmEtd2l6YXJkIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiAoSVByb2plY3QpIHRoaXMuZGF0YU1vZGVsLmdldFByb3BlcnR5KFBST0pFQ1QpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHBhdGggb2YgdGhlIHNjaGVtYSBmaWxlIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0Ci0JICovCi0JcHVibGljIElQYXRoIGdldEZpbGVSZWxhdGl2ZVBhdGgoKSB7Ci0JCUlQYXRoIGZpbGVQYXRoID0gdGhpcy5nZXRDb250YWluZXJGdWxsUGF0aCgpOwotICAgIAlTdHJpbmcgcHJvamVjdE5hbWUgPSBmaWxlUGF0aC5zZWdtZW50KDApOwotCi0gICAgCWlmKHRoaXMuZ2V0UHJvamVjdCgpLmdldE5hbWUoKS5lcXVhbHMocHJvamVjdE5hbWUpKSB7Ci0gICAgCQlmaWxlUGF0aCA9IGZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGZpbGVQYXRoOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQl0aGlzLmRhdGFNb2RlbC5zZXRQcm9wZXJ0eShQUk9KRUNULCB0aGlzLmdldFByb2plY3ROYW1lZCh0aGlzLmdldENvbnRhaW5lck5hbWUoKSkpOwotCQl0aGlzLmRhdGFNb2RlbC5zZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCwgdGhpcy5nZXRDb250YWluZXJGdWxsUGF0aCgpKTsKLQkJdGhpcy5kYXRhTW9kZWwuc2V0UHJvcGVydHkoRklMRV9OQU1FLCB0aGlzLmdldEZpbGVOYW1lKCkpOwotCi0JCWJvb2xlYW4gdmFsaWQgPSBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLQkJaWYoICEgdmFsaWQpIHsKLQkJCXJldHVybiB2YWxpZDsKLQkJfQotCQl0aGlzLm92ZXJyaWRlRmlsZUV4aXN0c1dhcm5pbmcoKTsKLQkJCi0JCS8vVE9ETyBtb3ZlIHRoaXMgdmFsaWRhdGlvbiB0byB0aGUgZGF0YU1vZGVsIC0gc2VlIE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UKLQkJLy8gVmFsaWRhdGUgUHJvamVjdAotCQl2YWxpZCA9IHRoaXMucHJvamVjdElzSmF2YVByb2plY3QodGhpcy5nZXRQcm9qZWN0KCkpOwotCQlpZiggISB2YWxpZCkgewotCQkJdGhpcy5zZXRFcnJvck1lc3NhZ2UoSnB0SmF4YlVpTWVzc2FnZXMuTmV3U2NoZW1hRmlsZVdpemFyZFBhZ2VfZXJyb3JOb3RKYXZhUHJvamVjdCk7Ci0JCQlyZXR1cm4gdmFsaWQ7Ci0JCX0KLQkJLy8gVmFsaWRhdGUgWFNEIGZpbGUgbm90IGV4aXN0cy4KLQkJdmFsaWQgPSB0aGlzLnhzZEZpbGVOb3RFeGlzdHMoKTsKLQkJaWYoICEgdmFsaWQpIHsKLQkJCXRoaXMuc2V0TWVzc2FnZShKcHRKYXhiVWlNZXNzYWdlcy5OZXdTY2hlbWFGaWxlV2l6YXJkUGFnZV9vdmVyd3JpdGVFeGlzdGluZ1NjaGVtYXMsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQl0aGlzLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0SXNKYXZhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHByb2plY3QgIT0gbnVsbCkgJiYgKHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCkpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotICAgIH0KLQotICAgIHByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCkgewotCQlPYmplY3QgZmlyc3RFbGVtZW50ID0gaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiAoSVByb2plY3QpZmlyc3RFbGVtZW50OwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSVJlc291cmNlKSB7Ci0JCQlyZXR1cm4gKChJUmVzb3VyY2UpIGZpcnN0RWxlbWVudCkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWVsc2UgaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChJSmF2YUVsZW1lbnQpZmlyc3RFbGVtZW50KS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgICB9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3ROYW1lZChTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwcm9qZWN0TmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRDb250YWluZXJOYW1lKCkgewotCQlJUGF0aCBjb250YWluZXJQYXRoID0gdGhpcy5nZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZihjb250YWluZXJQYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb250YWluZXJOYW1lID0gY29udGFpbmVyUGF0aC5zZWdtZW50KDApOwotCQlyZXR1cm4gY29udGFpbmVyTmFtZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3ZlcnJpZGVGaWxlRXhpc3RzV2FybmluZygpIHsKLQkJU3RyaW5nIGV4aXN0c1N0cmluZz0gSURFV29ya2JlbmNoTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzOwotCQlleGlzdHNTdHJpbmcudG9TdHJpbmcoKTsKLQkJCi0JCWV4aXN0c1N0cmluZyA9IGV4aXN0c1N0cmluZy5zdWJzdHJpbmcoIicnezB9JyciLmxlbmd0aCgpLCBleGlzdHNTdHJpbmcubGVuZ3RoKCkpOyAgICAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtZXNzYWdlID0gdGhpcy5nZXRNZXNzYWdlKCk7Ci0JCWlmKG1lc3NhZ2UgIT0gbnVsbCAmJiBtZXNzYWdlLmVuZHNXaXRoKGV4aXN0c1N0cmluZykpIHsgCi0JCQl0aGlzLnNldE1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4geHNkRmlsZU5vdEV4aXN0cygpIHsKLQkJCi0JCXJldHVybiAhIHRoaXMueHNkRmlsZUV4aXN0cyh0aGlzLmdldENvbnRhaW5lckFic29sdXRlUGF0aCgpLnRvRmlsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHhzZEZpbGVFeGlzdHMoRmlsZSBkaXJlY3RvcnkpIHsKLQkJCi0JCWlmKGRpcmVjdG9yeS5saXN0RmlsZXMoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgZGlyZWN0b3J5OiAiICsgZGlyZWN0b3J5KTsgICAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yKEZpbGUgZmlsZSA6IGRpcmVjdG9yeS5saXN0RmlsZXMoKSkgewotCQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZihYU0RfRVhURU5TSU9OLmVxdWFsc0lnbm9yZUNhc2UoRmlsZVRvb2xzLmV4dGVuc2lvbihmaWxlKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXRDb250YWluZXJBYnNvbHV0ZVBhdGgoKSB7Ci0JCUlQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGggPSB0aGlzLmdldENvbnRhaW5lckZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlVG8odGhpcy5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSk7Ci0JCUlSZXNvdXJjZSBkaXJlY3RvcnkgPSAocHJvamVjdFJlbGF0aXZlUGF0aC5pc0VtcHR5KCkpID8KLQkJCQl0aGlzLmdldFByb2plY3QoKSA6Ci0JCQkJdGhpcy5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwcm9qZWN0UmVsYXRpdmVQYXRoKTsKLQkJcmV0dXJuIGRpcmVjdG9yeS5nZXRMb2NhdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9TY2hlbWFHZW5lcmF0b3JXaXphcmQuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvaW50ZXJuYWwvd2l6YXJkcy9zY2hlbWFnZW4vU2NoZW1hR2VuZXJhdG9yV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMWRjMWMuLjAwMDAwMDAKLS0tIGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9TY2hlbWFHZW5lcmF0b3JXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5zY2hlbWFnZW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5GaWxlVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZ2VuLlNjaGVtYUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuU2NoZW1hRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsUHJvdmlkZXI7Ci0KLS8qKgotICogIFNjaGVtYUdlbmVyYXRvcldpemFyZAotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdG9yV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCAKLXsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQlwcml2YXRlIElKYXZhUHJvamVjdCB0YXJnZXRQcm9qZWN0OwotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsJCi0JCi0JcHJpdmF0ZSBOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZSBuZXdTY2hlbWFGaWxlV2l6YXJkUGFnZTsKLQotCXByaXZhdGUgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZSBzY2hlbWFHZW5XaXphcmRQYWdlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWFNEX0VYVEVOU0lPTiA9ICIueHNkIjsgICAvLyROT04tTkxTLTEkCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQkKLQlwdWJsaWMgU2NoZW1hR2VuZXJhdG9yV2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRfdGl0bGUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHRKYXhiVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdEpheGJVaUljb25zLlNDSEVNQV9HRU5fV0laX0JBTk5FUikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJdGhpcy5pbml0aWFsU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQkKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8IHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsJCi0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy50YXJnZXRQcm9qZWN0ID0gdGhpcy5nZXRQcm9qZWN0RnJvbUluaXRpYWxTZWxlY3Rpb24oKTsKLQkJdGhpcy5kYXRhTW9kZWwgPSBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogSVdpemFyZCBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCQotCQl0aGlzLm5ld1NjaGVtYUZpbGVXaXphcmRQYWdlID0gdGhpcy5idWlsZE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlKHRoaXMuaW5pdGlhbFNlbGVjdGlvbik7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLm5ld1NjaGVtYUZpbGVXaXphcmRQYWdlKTsKLQotCQl0aGlzLnNjaGVtYUdlbldpemFyZFBhZ2UgPSB0aGlzLmJ1aWxkU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZSh0aGlzLmJ1aWxkU2VsZWN0aW9uKHRoaXMuZ2V0UHJvamVjdCgpKSk7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLnNjaGVtYUdlbldpemFyZFBhZ2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCi0JCXRoaXMudGFyZ2V0UHJvamVjdCA9IHRoaXMuZ2V0SmF2YVByb2plY3QoKTsKLQkJCi0JCVN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXMgPSB0aGlzLmJ1aWxkU291cmNlQ2xhc3NOYW1lcyh0aGlzLmdldEFsbENoZWNrZWRJdGVtcygpKTsKLQkJCi0JCVdvcmtzcGFjZUpvYiBnZW5TY2hlbWFKb2IgPSBuZXcgR2VuZXJhdGVTY2hlbWFKb2IoIAotCQkJCQkJdGhpcy50YXJnZXRQcm9qZWN0LCAKLQkJCQkJCXNvdXJjZUNsYXNzTmFtZXMsIAotCQkJCQkJdGhpcy5nZXRUYXJnZXRTY2hlbWEoKSwgCi0JCQkJCQl0aGlzLnVzZXNNb3h5KCkpOwotCQlnZW5TY2hlbWFKb2Iuc2NoZWR1bGUoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludHJhLXdpemFyZCBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdEZyb20odGhpcy5nZXRQcm9qZWN0KCkpOwotCX0KLSAgICAKLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5uZXdTY2hlbWFGaWxlV2l6YXJkUGFnZS5nZXRQcm9qZWN0KCk7Ci0JfQotCi0gICAgcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0UHJvamVjdEZyb21Jbml0aWFsU2VsZWN0aW9uKCkgewotICAgIAlJSmF2YVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9IHRoaXMuaW5pdGlhbFNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSUphdmFFbGVtZW50KSB7Ci0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KWZpcnN0RWxlbWVudDsKLQkJCWludCB0eXBlID0gamF2YUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKLQkJCWlmKHR5cGUgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCXByb2plY3QgPSAoSUphdmFQcm9qZWN0KWphdmFFbGVtZW50OwotCQkJfQotCQkJZWxzZSBpZih0eXBlID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQkJcHJvamVjdCA9ICgoSVBhY2thZ2VGcmFnbWVudClqYXZhRWxlbWVudCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdEZyb20oSVByb2plY3QgcHJvamVjdCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSAoSUphdmFQcm9qZWN0KSgoSUphdmFFbGVtZW50KSgoSUFkYXB0YWJsZSlwcm9qZWN0KS5nZXRBZGFwdGVyKElKYXZhRWxlbWVudC5jbGFzcykpOwotCQlpZihqYXZhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm90IGEgSmF2YSBQcm9qZWN0Iik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotICAgIH0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRUYXJnZXRTY2hlbWEoKSB7Ci0KLQkJSVBhdGggZmlsZVBhdGggPSB0aGlzLm5ld1NjaGVtYUZpbGVXaXphcmRQYWdlLmdldEZpbGVSZWxhdGl2ZVBhdGgoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdGhpcy5uZXdTY2hlbWFGaWxlV2l6YXJkUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlTdHJpbmcgdGFyZ2V0U2NoZW1hID0gKGZpbGVQYXRoLmlzRW1wdHkoKSkgPwotCQkJZmlsZU5hbWUgOgotCQkJZmlsZVBhdGgudG9PU1N0cmluZygpICsgRmlsZS5zZXBhcmF0b3IgKyBmaWxlTmFtZTsKLQotCQlyZXR1cm4gdGhpcy5hZGRYc2RFeHRlbnNpb24odGFyZ2V0U2NoZW1hKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBhZGRYc2RFeHRlbnNpb24oU3RyaW5nIGZpbGVOYW1lKSB7Ci0KLQkJcmV0dXJuIChGaWxlVG9vbHMuZXh0ZW5zaW9uKGZpbGVOYW1lKS5lcXVhbHNJZ25vcmVDYXNlKFhTRF9FWFRFTlNJT04pKSA/Ci0JCQlmaWxlTmFtZSA6Ci0JCQlmaWxlTmFtZSArIFhTRF9FWFRFTlNJT047Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3RbXSBnZXRBbGxDaGVja2VkSXRlbXMoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUdlbldpemFyZFBhZ2UuZ2V0QWxsQ2hlY2tlZEl0ZW1zKCk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nW10gYnVpbGRTb3VyY2VDbGFzc05hbWVzKE9iamVjdFtdIGNoZWNrZWRFbGVtZW50cykgewotCi0JCUFycmF5TGlzdDxTdHJpbmc+IGNsYXNzTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCWZvcihPYmplY3QgZWxlbWVudDogY2hlY2tlZEVsZW1lbnRzKSB7Ci0JCQlJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQgPSAoSUphdmFFbGVtZW50KWVsZW1lbnQ7Ci0JCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBqYXZhRWxlbWVudC5nZXRQYXJlbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gamF2YUVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBGaWxlVG9vbHMuc3RyaXBFeHRlbnNpb24oZWxlbWVudE5hbWUpOwotCQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLQkJCQljbGFzc05hbWVzLmFkZChjbGFzc05hbWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2xhc3NOYW1lcy5hZGQocGFja2FnZU5hbWUgKyAnLicgKyBjbGFzc05hbWUpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheShjbGFzc05hbWVzLCBuZXcgU3RyaW5nWzBdKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHVzZXNNb3h5KCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5XaXphcmRQYWdlLnVzZXNNb3h5KCk7Ci0JfQotCQotCXByb3RlY3RlZCBOZXdTY2hlbWFGaWxlV2l6YXJkUGFnZSBidWlsZE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE5ld1NjaGVtYUZpbGVXaXphcmRQYWdlKAotCQkJCSJQYWdlXzEiLCBzZWxlY3Rpb24sIHRoaXMuZ2V0RGF0YU1vZGVsKCksCSAgIC8vJE5PTi1OTFMtMSQKLQkJCQlKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JQcm9qZWN0V2l6YXJkUGFnZV90aXRsZSwgCi0JCQkJSnB0SmF4YlVpTWVzc2FnZXMuU2NoZW1hR2VuZXJhdG9yUHJvamVjdFdpemFyZFBhZ2VfZGVzYyk7Ci0JfQotCQotCXByb3RlY3RlZCBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlIGJ1aWxkU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlKHNlbGVjdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBidWlsZFNlbGVjdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0KLQkJTGlzdDxJQWRhcHRhYmxlPiBzZWxlY3RlZEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxJQWRhcHRhYmxlPigxKTsKLQkJdGhpcy5hZGRQcm9qZWN0VG8oc2VsZWN0ZWRFbGVtZW50cywgcHJvamVjdCk7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZEVsZW1lbnRzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2plY3RUbyhMaXN0PElBZGFwdGFibGU+IHNlbGVjdGVkRWxlbWVudHMsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCWlmKHByb2plY3QgIT0gbnVsbCAmJiBwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKQotCQkJCXNlbGVjdGVkRWxlbWVudHMuYWRkKEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KSk7Ci0JCX0gCi0JCWNhdGNoKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGlnbm9yZSBzZWxlY3RlZCBlbGVtZW50Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBnZXREYXRhTW9kZWwoKSB7Ci0JCWlmICh0aGlzLmRhdGFNb2RlbCA9PSBudWxsKSB7Ci0JCQl0aGlzLmRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKGdldERlZmF1bHRQcm92aWRlcigpKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kYXRhTW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWxQcm92aWRlciBnZXREZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2NoZW1hRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSBzY2hlbWEgam9iICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBHZW5lcmF0ZVNjaGVtYUpvYiBleHRlbmRzIFdvcmtzcGFjZUpvYiB7Ci0JCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHNvdXJjZUNsYXNzTmFtZXM7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHRhcmdldFNjaGVtYTsKLQkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVzZU1veHk7Ci0JCQotCQlHZW5lcmF0ZVNjaGVtYUpvYihJSmF2YVByb2plY3QgcHJvamVjdCwgU3RyaW5nW10gc291cmNlQ2xhc3NOYW1lcywgU3RyaW5nIHRhcmdldFNjaGVtYSwgYm9vbGVhbiB1c2VNb3h5KSB7Ci0JCQlzdXBlcihKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRfZ2VuZXJhdGluZ1NjaGVtYSk7Ci0JCQkKLQkJCXRoaXMuamF2YVByb2plY3QgPSBwcm9qZWN0IDsKLQkJCXRoaXMuc291cmNlQ2xhc3NOYW1lcyA9IHNvdXJjZUNsYXNzTmFtZXM7Ci0JCQl0aGlzLnRhcmdldFNjaGVtYSA9IHRhcmdldFNjaGVtYTsKLQkJCXRoaXMudXNlTW94eSA9IHVzZU1veHk7Ci0KLQkJCXRoaXMuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0UnVsZUZhY3RvcnkoKS5tb2RpZnlSdWxlKHRoaXMuamF2YVByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIElTdGF0dXMgcnVuSW5Xb3Jrc3BhY2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIE5MUy5iaW5kKEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvcldpemFyZF9nZW5lcmF0ZVNjaGVtYVRhc2ssIHRoaXMudGFyZ2V0U2NoZW1hKSwgMSk7Ci0JCQl0cnkgewotCQkJCVNjaGVtYUdlbmVyYXRvci5nZW5lcmF0ZSh0aGlzLmphdmFQcm9qZWN0LCB0aGlzLnRhcmdldFNjaGVtYSwgdGhpcy5zb3VyY2VDbGFzc05hbWVzLCB0aGlzLnVzZU1veHksIHNtLm5ld0NoaWxkKDEpKTsKLQkJCX0KLQkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9pbnRlcm5hbC93aXphcmRzL3NjaGVtYWdlbi9TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlLmphdmEgYi9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL1NjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhYTA1NC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL2ludGVybmFsL3dpemFyZHMvc2NoZW1hZ2VuL1NjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwud2l6YXJkcy5zY2hlbWFnZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByb2JsZW1zTGFiZWxEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja1N0YXRlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5nZW4uU2NoZW1hR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLkpwdEpheGJVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmZpbHRlcnMuQ29udGFpbmVyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLmludGVybmFsLmZpbHRlcnMuRW1wdHlJbm5lclBhY2thZ2VGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuZmlsdGVycy5Ob25BcmNoaXZlT3JFeHRlcm5hbEVsZW1lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuZmlsdGVycy5Ob25Db250YWluZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuaW50ZXJuYWwuZmlsdGVycy5Ob25KYXZhRWxlbWVudEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqICBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlIGV4dGVuZHMgQWJzdHJhY3RKYXJEZXN0aW5hdGlvbldpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgdGFyZ2V0UHJvamVjdDsKLQotCS8vIHdpZGdldHMKLQlwcml2YXRlIFNldHRpbmdzR3JvdXAgc2V0dGluZ3NHcm91cDsKLQlwcml2YXRlIE5vbkNvbnRhaW5lckZpbHRlciBwcm9qZWN0RmlsdGVyOwotCQotCXByaXZhdGUgQnV0dG9uIHVzZXNNb3h5Q2hlY2tCb3g7Ci0JcHJpdmF0ZSBib29sZWFuIHVzZXNNb3h5OwotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgSlBUX0VDTElQU0VMSU5LX1VJX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpIjsgICAvLyROT04tTkxTLTEkCi0KLQkvLyBvdGhlciBjb25zdGFudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laSU5HX1NFTEVDVElPTl9XSURHRVRfV0lEVEggPSA0ODA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWklOR19TRUxFQ1RJT05fV0lER0VUX0hFSUdIVCA9IDE1MDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBfQ09OVEVYVF9JRCA9ICJvcmcuZWNsaXBzZS5qcHQudWkud2l6YXJkX2pheGJzY2hlbWFfY2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigiSkFYQiBTY2hlbWEgR2VuZXJhdG9yIiwgc2VsZWN0aW9uLCBudWxsKTsJLy8kTk9OLU5MUy0xJAotCi0JCXRoaXMuc2V0VXNlc01veHkoZmFsc2UpOwotCQl0aGlzLnNldFRpdGxlKEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfdGl0bGUpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uKEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfZGVzYyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJRGlhbG9nUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotICAgIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCXRoaXMuc2V0Q29udHJvbCh0aGlzLmJ1aWxkVG9wTGV2ZWxDb250cm9sKHBhcmVudCkpOwotCX0KLQotCUBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLSAgICAJaWYodmlzaWJsZSkgewotCSAgICAJdGhpcy51cGRhdGVUYXJnZXRQcm9qZWN0KCk7Ci0JICAgIAl0aGlzLnVwZGF0ZUlucHV0R3JvdXBUcmVlRmlsdGVyKCk7Ci0JCi0JCQkvLyBkZWZhdWx0IHVzZXNNb3h5IHRvIHRydWUgb25seSB3aGVuIEpQVCBFY2xpcHNlTGluayBidW5kbGUgZXhpc3RzIGFuZCBNT1h5IGlzIG9uIHRoZSBjbGFzc3BhdGgKLQkJCXRoaXMudXBkYXRlVXNlc01veHkodGhpcy5qcHRFY2xpcHNlTGlua0J1bmRsZUV4aXN0cygpICYmIHRoaXMubW94eUlzT25DbGFzc3BhdGgoKSk7Ci0JCi0JCQkvLyBjaGVja2JveCB2aXNpYmxlIG9ubHkgaWYganB0LmVjbGlwc2VsaW5rLnVpIHBsdWdpbiBpcyBhdmFpbGFibGUKLQkJCS8vIGFuZCBFY2xpcHNlTGluayBNT1h5IGlzIG5vdCBvbiB0aGUgY2xhc3NwYXRoCi0JCQl0aGlzLnVzZXNNb3h5Q2hlY2tCb3guc2V0VmlzaWJsZSh0aGlzLmpwdEVjbGlwc2VMaW5rQnVuZGxlRXhpc3RzKCkgJiYgISB0aGlzLm1veHlJc09uQ2xhc3NwYXRoKCkpOwotCQkJCi0JCQl0aGlzLnZhbGlkYXRlUHJvamVjdENsYXNzcGF0aCgpOwotICAgIAl9Ci0gICAgfQotCi0JLy8gKioqKioqKioqKiBJV2l6YXJkUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCWJvb2xlYW4gY29tcGxldGUgPSB0aGlzLnZhbGlkYXRlU291cmNlR3JvdXAoKTsKLQkJCWlmKGNvbXBsZXRlKSB7Ci0JCQkJdGhpcy52YWxpZGF0ZVByb2plY3RDbGFzc3BhdGgoKTsKLQkJCX0KLQkJcmV0dXJuIGNvbXBsZXRlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzUGFnZShJV2l6YXJkUGFnZSBwYWdlKSB7Ci0JCXN1cGVyLnNldFByZXZpb3VzUGFnZShwYWdlKTsKLQkJaWYodGhpcy5nZXRDb250cm9sKCkgIT0gbnVsbCkKLQkJCXRoaXMudXBkYXRlUGFnZUNvbXBsZXRpb24oKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT2JqZWN0W10gZ2V0QWxsQ2hlY2tlZEl0ZW1zKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hcnJheSh0aGlzLmdldElucHV0R3JvdXAoKS5nZXRBbGxDaGVja2VkTGlzdEl0ZW1zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VzTW94eSgpIHsKLQkJcmV0dXJuIHRoaXMudXNlc01veHk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUGFnZUNvbXBsZXRpb24oKSB7Ci0JCXN1cGVyLnVwZGF0ZVBhZ2VDb21wbGV0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEZXN0aW5hdGlvbkdyb3VwKCkgewotCQkvLyBkbyBub3RoaW5nCi0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlU291cmNlR3JvdXAoKSB7Ci0JCWlmKHRoaXMuZ2V0QWxsQ2hlY2tlZEl0ZW1zKCkubGVuZ3RoID09IDApIHsKLQkJCWlmKHRoaXMuZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0RXJyb3JNZXNzYWdlKEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfZXJyb3JOb1BhY2thZ2UpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUHJvamVjdENsYXNzcGF0aCgpIHsKLQkJaWYodGhpcy50YXJnZXRQcm9qZWN0ID09IG51bGwpIHsJCS8vIHByb2plY3Qgc2VsZWN0ZWQgYXZhaWxhYmxlIHlldAotCQkJcmV0dXJuOwotCQl9Ci0JCS8vdGhpcyBsaW5lIHdpbGwgc3VwcHJlc3MgdGhlICJkZWZhdWx0IHBhY2thZ2UiIHdhcm5pbmcgKHdoaWNoIGRvZXNuJ3QgcmVhbGx5IGFwcGx5IGhlcmUKLQkJLy9hcyB0aGUgSkFYQiBnZW4gdXNlcyBhbiBvcmcuZXhhbXBsZS5zY2hlbWFOYW1lIHBhY2thZ2UgYnkgZGVmYXVsdCkgYW5kIHdpbGwgY2xlYXIgdGhlIGNsYXNzcGF0aCB3YXJuaW5ncyB3aGVuIG5lY2Vzc2FyeQotCQlzZXRNZXNzYWdlKG51bGwpOwotCQkKLQkJaWYoICEgdGhpcy5nZW5lcmljSmF4YklzT25DbGFzc3BhdGgoKSkgewotCQkJdGhpcy5kaXNwbGF5V2FybmluZyhKcHRKYXhiVWlNZXNzYWdlcy5TY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlX2pheGJMaWJyYXJpZXNOb3RBdmFpbGFibGUpOwotCQl9Ci0JCWVsc2UgaWYodGhpcy51c2VzTW94eSgpICYmICEgdGhpcy5tb3h5SXNPbkNsYXNzcGF0aCgpKSB7Ci0JCQkvL3RoaXMgbWVzc2FnZSBpcyBiZWluZyB0cnVuY2F0ZWQgYnkgdGhlIHdpemFyZCB3aWR0aCBpbiBzb21lIGNhc2VzCi0JCQl0aGlzLmRpc3BsYXlXYXJuaW5nKEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfbW94eUxpYnJhcmllc05vdEF2YWlsYWJsZSk7Ci0JCX0KLQotCQkvL3RoaXMgY29kZSB3aWxsIGludGVsbGlnZW50bHkgcmVtb3ZlIG91ciBjbGFzc3BhdGggd2FybmluZ3Mgd2hlbiB0aGV5IGFyZSBwcmVzZW50IGJ1dCBubyBsb25nZXIgYXBwbHkgKGFzIGFuIGFsdGVybmF0aXZlIAotCQkvL3RvIHNldHRpbmcgdGhlIG1lc3NhZ2UgdG8gbnVsbCBjb250aW51b3VzbHkgYXMgaXMgY3VycmVudGx5IGRvbmUpCi0vLwkJZWxzZSBpZiggdGhpcy5nZXRNZXNzYWdlKCkgIT0gbnVsbCl7Ci0vLwkJCWlmICh0aGlzLmdldE1lc3NhZ2UoKS5lcXVhbHMoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfamF4YkxpYnJhcmllc05vdEF2YWlsYWJsZSkgfHwKLS8vCQkJCQl0aGlzLmdldE1lc3NhZ2UoKS5lcXVhbHMoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfbW94eUxpYnJhcmllc05vdEF2YWlsYWJsZSkpIHsgCi0vLwkJCQlzZXRNZXNzYWdlKG51bGwpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotCS8qKgotCSAqIFRlc3QgaWYgdGhlIEpheGIgY29tcGlsZXIgaXMgb24gdGhlIGNsYXNzcGF0aC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZ2VuZXJpY0pheGJJc09uQ2xhc3NwYXRoKCkgewotCQl0cnkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IFNjaGVtYUdlbmVyYXRvci5KQVhCX0dFTkVSSUNfU0NIRU1BX0dFTl9DTEFTUzsKLQkJCUlUeXBlIGdlbkNsYXNzID0gdGhpcy50YXJnZXRQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSk7Ci0JCQlyZXR1cm4gKGdlbkNsYXNzICE9IG51bGwpOwotCQl9IAotCQljYXRjaChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVG9wTGV2ZWxDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSEVMUF9DT05URVhUX0lEKTsKLQkJCi0JCXRoaXMuc2V0dGluZ3NHcm91cCA9IG5ldyBTZXR0aW5nc0dyb3VwKGNvbXBvc2l0ZSk7Ci0KLQkJdGhpcy51c2VzTW94eUNoZWNrQm94ID0gdGhpcy5idWlsZFVzZXNNb3h5Q2hlY2tCb3goY29tcG9zaXRlKTsKLQkJCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhcmdldFByb2plY3QoKSB7Ci0gICAgCQotCQl0aGlzLnRhcmdldFByb2plY3QgPSAoKFNjaGVtYUdlbmVyYXRvcldpemFyZCl0aGlzLmdldFdpemFyZCgpKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJbnB1dEdyb3VwVHJlZUZpbHRlcigpIHsKLSAgICAJdGhpcy5nZXRJbnB1dEdyb3VwKCkuc2V0QWxsU2VsZWN0aW9ucyhmYWxzZSk7Ci0gICAgCQotICAgIAlpZih0aGlzLnByb2plY3RGaWx0ZXIgIT0gbnVsbCkgewotICAgIAkJdGhpcy5nZXRJbnB1dEdyb3VwKCkucmVtb3ZlVHJlZUZpbHRlcih0aGlzLnByb2plY3RGaWx0ZXIpOwotICAgIAl9Ci0gICAgCXRoaXMucHJvamVjdEZpbHRlciA9IG5ldyBOb25Db250YWluZXJGaWx0ZXIodGhpcy50YXJnZXRQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQl0aGlzLmdldElucHV0R3JvdXAoKS5hZGRUcmVlRmlsdGVyKHRoaXMucHJvamVjdEZpbHRlcik7Ci0gICAgfQotCi0JcHJpdmF0ZSBib29sZWFuIGpwdEVjbGlwc2VMaW5rQnVuZGxlRXhpc3RzKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0SnB0RWNsaXBzZUxpbmtCdW5kbGUoKSAhPSBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBCdW5kbGUgZ2V0SnB0RWNsaXBzZUxpbmtCdW5kbGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRCdW5kbGUoSlBUX0VDTElQU0VMSU5LX1VJX1BMVUdJTl9JRCk7CS8vIENhbm5vdCByZWZlcmVuY2UgZGlyZWN0bHkgRUwgcGx1Z2luLgotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRVc2VzTW94eShib29sZWFuIHVzZXNNb3h5KXsKLQkJdGhpcy51c2VzTW94eSA9IHVzZXNNb3h5OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlVXNlc01veHkoYm9vbGVhbiB1c2VzTW94eSl7Ci0JCXRoaXMuc2V0VXNlc01veHkodXNlc01veHkpOwotCQl0aGlzLnVzZXNNb3h5Q2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMudXNlc01veHkoKSk7Ci0JCXRoaXMudmFsaWRhdGVQcm9qZWN0Q2xhc3NwYXRoKCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgRWNsaXBzZUxpbmsgSmF4YiBjb21waWxlciBpcyBvbiB0aGUgY2xhc3NwYXRoLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtb3h5SXNPbkNsYXNzcGF0aCgpIHsKLQkJdHJ5IHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBTY2hlbWFHZW5lcmF0b3IuSkFYQl9FQ0xJUFNFTElOS19TQ0hFTUFfR0VOX0NMQVNTOwotCQkJSVR5cGUgZ2VuQ2xhc3MgPSB0aGlzLnRhcmdldFByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJCXJldHVybiAoZ2VuQ2xhc3MgIT0gbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcGxheVdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJdGhpcy5zZXRNZXNzYWdlKG1lc3NhZ2UsIFdBUk5JTkcpOwotCX0KLQotCXByaXZhdGUgQ2hlY2tib3hUcmVlQW5kTGlzdEdyb3VwIGdldElucHV0R3JvdXAoKSB7Ci0JCXJldHVybiB0aGlzLnNldHRpbmdzR3JvdXAuaW5wdXRHcm91cDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoaXMgcGFnZSdzIGNvbGxlY3Rpb24gb2YgY3VycmVudGx5LXNwZWNpZmllZAotCSAqIGVsZW1lbnRzIHRvIGJlIGV4cG9ydGVkLiBUaGlzIGlzIHRoZSBwcmltYXJ5IGVsZW1lbnQgc2VsZWN0aW9uIGZhY2lsaXR5Ci0JICogYWNjZXNzb3IgZm9yIHN1YmNsYXNzZXMuCi0JICoKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNvbGxlY3Rpb24gb2YgZWxlbWVudHMgY3VycmVudGx5IHNlbGVjdGVkIGZvciBleHBvcnQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmF0b3I8Pz4gZ2V0U2VsZWN0ZWRSZXNvdXJjZXNJdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SW5wdXRHcm91cCgpLmdldEFsbENoZWNrZWRMaXN0SXRlbXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGUoKSB7Ci0JCXRoaXMudXBkYXRlUGFnZUNvbXBsZXRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCBzYXZlV2lkZ2V0VmFsdWVzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxTYXZlV2lkZ2V0VmFsdWVzKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVdpZGdldFZhbHVlcygpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphclBhY2thZ2UoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZ2l2ZUZvY3VzVG9EZXN0aW5hdGlvbigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRVc2VzTW94eUNoZWNrQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNoZWNrQm94LnNldFRleHQoSnB0SmF4YlVpTWVzc2FnZXMuQ2xhc3Nlc0dlbmVyYXRvcldpemFyZFBhZ2VfdXNlc01veHlJbXBsZW1lbnRhdGlvbik7Ci0JCWNoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLnVzZXNNb3h5KCkpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkVXNlc01veHlTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJCi0JCXJldHVybiBjaGVja0JveDsKLQl9Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFVzZXNNb3h5U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVVc2VzTW94eSh1c2VzTW94eUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl2YWxpZGF0ZVByb2plY3RDbGFzc3BhdGgoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTZXR0aW5nc0dyb3VwIGNsYXNzICoqKioqKioqKioKLQotCXByaXZhdGUgY2xhc3MgU2V0dGluZ3NHcm91cCB7Ci0KLQkJcHJpdmF0ZSBDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAgaW5wdXRHcm91cDsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCQlwcml2YXRlIFNldHRpbmdzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoKTsKLQkJCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJYnVpbGRTY2hlbWFDb21wb3NpdGUoY29tcG9zaXRlKTsKLQotCQkJLy8gSW5wdXQgVHJlZQotCQkJY3JlYXRlUGxhaW5MYWJlbChjb21wb3NpdGUsIEpwdEpheGJVaU1lc3NhZ2VzLlNjaGVtYUdlbmVyYXRvcldpemFyZFBhZ2VfcGFja2FnZXMpOwotCQkJdGhpcy5pbnB1dEdyb3VwID0gdGhpcy5jcmVhdGVJbnB1dEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCi0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGJ1aWxkU2NoZW1hQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgzLCBmYWxzZSk7ICAvLyBmYWxzZSA9IGRvIG5vdCBtYWtlIGNvbHVtbnMgZXF1YWwgd2lkdGgKLQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJCWxheW91dC5tYXJnaW5Cb3R0b20gPSAxMDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQkJCi0JCS8qKgotCQkgKiBDcmVhdGVzIHRoZSBjaGVja2JveCB0cmVlIGFuZCBsaXN0IGZvciBzZWxlY3RpbmcgcmVzb3VyY2VzLgotCQkgKgotCQkgKiBAcGFyYW0gcGFyZW50IHRoZSBwYXJlbnQgY29udHJvbAotCQkgKi8KLQkJcHJvdGVjdGVkIENoZWNrYm94VHJlZUFuZExpc3RHcm91cCBjcmVhdGVJbnB1dEdyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNoZWNrYm94VHJlZUFuZExpc3RHcm91cCBjaGVja2JveFRyZWVHcm91cDsKLQkJCQotCQkJaW50IGxhYmVsRmxhZ3MgPSBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19CQVNJQ1MKLQkJCQkJCQl8IEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX09WRVJMQVlfSUNPTlMKLQkJCQkJCQl8IEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX1NNQUxMX0lDT05TOwotCQkJSVRyZWVDb250ZW50UHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlcj0KLQkJCQluZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCQkvLyBwcmV2ZW50IHRoZSArIGZyb20gYmVpbmcgc2hvd24gaW4gZnJvbnQgb2YgcGFja2FnZXMKLQkJCQkJCXJldHVybiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSAmJiBzdXBlci5oYXNDaGlsZHJlbihlbGVtZW50KTsKLQkJCQkJfQotCQkJCX07Ci0JCQlmaW5hbCBEZWNvcmF0aW5nTGFiZWxQcm92aWRlciBwcm92aWRlciA9IG5ldyBEZWNvcmF0aW5nTGFiZWxQcm92aWRlcihuZXcgSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyKGxhYmVsRmxhZ3MpLCBuZXcgUHJvYmxlbXNMYWJlbERlY29yYXRvcihudWxsKSk7Ci0JCQljaGVja2JveFRyZWVHcm91cCA9IG5ldyBDaGVja2JveFRyZWVBbmRMaXN0R3JvdXAoCi0JCQkJCQlwYXJlbnQsCi0JCQkJCQlKYXZhQ29yZS5jcmVhdGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSksCi0JCQkJCQl0cmVlQ29udGVudFByb3ZpZGVyLAotCQkJCQkJcHJvdmlkZXIsCi0JCQkJCQluZXcgU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlcigpLAotCQkJCQkJcHJvdmlkZXIsCi0JCQkJCQlTV1QuTk9ORSwKLQkJCQkJCVNJWklOR19TRUxFQ1RJT05fV0lER0VUX1dJRFRILAotCQkJCQkJU0laSU5HX1NFTEVDVElPTl9XSURHRVRfSEVJR0hUKTsKLQkJCWNoZWNrYm94VHJlZUdyb3VwLmFkZFRyZWVGaWx0ZXIobmV3IEVtcHR5SW5uZXJQYWNrYWdlRmlsdGVyKCkpOwotCQkJY2hlY2tib3hUcmVlR3JvdXAuc2V0VHJlZUNvbXBhcmF0b3IobmV3IEphdmFFbGVtZW50Q29tcGFyYXRvcigpKTsKLQkJCWNoZWNrYm94VHJlZUdyb3VwLnNldExpc3RDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCQkKLQkJCWNoZWNrYm94VHJlZUdyb3VwLmFkZFRyZWVGaWx0ZXIobmV3IE5vbkphdmFFbGVtZW50RmlsdGVyKCkpOwotCQkJY2hlY2tib3hUcmVlR3JvdXAuYWRkVHJlZUZpbHRlcihuZXcgTm9uQXJjaGl2ZU9yRXh0ZXJuYWxFbGVtZW50RmlsdGVyKCkpOwotCQkJCi0JCQljaGVja2JveFRyZWVHcm91cC5hZGRMaXN0RmlsdGVyKG5ldyBDb250YWluZXJGaWx0ZXIoKSk7Ci0JCQljaGVja2JveFRyZWVHcm91cC5hZGRMaXN0RmlsdGVyKG5ldyBOb25KYXZhRWxlbWVudEZpbHRlcigpKTsKLQkJCQotCQkJY2hlY2tib3hUcmVlR3JvdXAuZ2V0VHJlZSgpLmFkZExpc3RlbmVyKFNXVC5Nb3VzZVVwLCBTY2hlbWFHZW5lcmF0b3JXaXphcmRQYWdlLnRoaXMpOwotCQkJY2hlY2tib3hUcmVlR3JvdXAuZ2V0VGFibGUoKS5hZGRMaXN0ZW5lcihTV1QuTW91c2VVcCwgU2NoZW1hR2VuZXJhdG9yV2l6YXJkUGFnZS50aGlzKTsKLQotCQkJSUNoZWNrU3RhdGVMaXN0ZW5lciBsaXN0ZW5lciAgPSBuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjaGVja1N0YXRlQ2hhbmdlZChDaGVja1N0YXRlQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH07Ci0KLQkgICAgICAgIGNoZWNrYm94VHJlZUdyb3VwLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JICAgICAgICByZXR1cm4gY2hlY2tib3hUcmVlR3JvdXA7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL25hdmlnYXRvci9KYXhiTmF2aWdhdG9yVWkuamF2YSBiL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvbmF2aWdhdG9yL0pheGJOYXZpZ2F0b3JVaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGI1YTJlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvbmF2aWdhdG9yL0pheGJOYXZpZ2F0b3JVaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotLyoqCi0gKiBEZWZpbmVzIGNvbnRlbnQgYW5kIGxhYmVsIHByb3ZpZGVyIGZhY3RvcmllcyBmb3IgUHJvamVjdCBOYXZpZ2F0b3IgdmlldyBmb3IgYSBnaXZlbiBKQVhCIHByb2plY3QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpheGJOYXZpZ2F0b3JVaSB7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJ9cwotCSAqLwotCVRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBJdGVtTGFiZWxQcm92aWRlcn1zCi0JICovCi0JSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotfQpkaWZmIC0tZ2l0IGEvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1VaS5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTBlOWVlLi4wMDAwMDAwCi0tLSBhL2pheGIvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvdWkvcGxhdGZvcm0vSmF4YlBsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLm5hdmlnYXRvci5KYXhiTmF2aWdhdG9yVWk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBKQVhCIGltcGxlbWVudGF0aW9uIHZlbmRvciB0byBwcm92aWRlIGV4dGVuc2lvbnMgCi0gKiB0byBKQVhCIFVJIGZ1bmN0aW9uYWxpdHkuCi0gKiA8cD4KLSAqIEFueSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgPGk+c3RhdGVsZXNzPC9pPiBpbiBuYXR1cmUuCi0gKiA8cD4KLSAqIFNlZSB0aGUgZXh0ZW5zaW9uIHBvaW50OiBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5qYXhiUGxhdGZvcm1zCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXhiUGxhdGZvcm1VaSB7Ci0JCi0JLy8gKioqKioqKioqKiBuYXZpZ2F0b3IgVUkgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEpheGJOYXZpZ2F0b3JVaX0gZm9yIHRoaXMgcGxhdGZvcm0sIAotCSAqIHdoaWNoIGRldGVybWluZXMgUHJvamVjdCBFeHBsb3JlciBjb250ZW50Ci0JICovCi0JSmF4Yk5hdmlnYXRvclVpIGdldE5hdmlnYXRvclVpKCk7Ci19CmRpZmYgLS1naXQgYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL3BsYXRmb3JtL0pheGJQbGF0Zm9ybVVpTWFuYWdlci5qYXZhIGIvamF4Yi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi91aS9wbGF0Zm9ybS9KYXhiUGxhdGZvcm1VaU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYwNGVkNC4uMDAwMDAwMAotLS0gYS9qYXhiL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL3VpL3BsYXRmb3JtL0pheGJQbGF0Zm9ybVVpTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi51aS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIudWkuSnB0SmF4YlVpUGx1Z2luOwotCi0vKioKLSAqIFJlcG9zaXRvcnkgZm9yIHtAbGluayBKYXhiUGxhdGZvcm1VaX1zCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqIEBzZWUgSnB0SmF4YlVpUGx1Z2luI2dldEpheGJQbGF0Zm9ybVVpTWFuYWdlcigpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF4YlBsYXRmb3JtVWlNYW5hZ2VyIHsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBsYXRmb3JtIFVJIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgVUkgZWxlbWVudHMgZm9yIHRoZSBnaXZlbgotCSAqIEpBWEIgcGxhdGZvcm0gZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgSmF4YlBsYXRmb3JtVWkgZ2V0SmF4YlBsYXRmb3JtVWkoSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm1EZXNjKTsKLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MTMxY2EuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYmVkN2YuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4NGI1Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDc6MzYgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNjA1MGUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLURhbGktQ29tbWVudDogamRrIDEuNiBoYXMgdGhlIGphdmF4LnhtbC5iaW5kIGFubm90YXRpb25zCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuNgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5KcHRKYXhiQ29yZVRlc3RzUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy42LjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNi4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjQuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi42LjAsMy4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDI5YmMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTBiNjMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSkFYQiBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9KcHRKYXhiQ29yZVRlc3RzUGx1Z2luLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvSnB0SmF4YkNvcmVUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2U0ZmYxLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9KcHRKYXhiQ29yZVRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBjb25maWd1cmUgdGhlIGNvcmUgdG8gaGFuZGxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdoZW4gd2UgYXJlCi0gKiBydW5uaW5nIHRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdEpheGJDb3JlVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SmF4YkNvcmVUZXN0c1BsdWdpbiBJTlNUQU5DRTsKLQotCXB1YmxpYyBzdGF0aWMgSnB0SmF4YkNvcmVUZXN0c1BsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRKYXhiQ29yZVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUpheGJQcm9qZWN0TWFuYWdlciBqYXhiUHJvamVjdE1hbmFnZXIgPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRQcm9qZWN0TWFuYWdlcigpOwotCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChqYXhiUHJvamVjdE1hbmFnZXIsICJoYW5kbGVFdmVudHNTeW5jaHJvbm91c2x5Iik7Ci0JCVJlZmxlY3Rpb25Ub29scy5leGVjdXRlU3RhdGljTWV0aG9kKEpwdEpheGJDb3JlUGx1Z2luLmNsYXNzLCAiZG9Ob3RGbHVzaFByZWZlcmVuY2VzIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL0pheGJDb3JlVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9KYXhiQ29yZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmRmNDAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL0pheGJDb3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHM7Ci0KLXB1YmxpYyBjbGFzcyBKYXhiQ29yZVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXhiQ29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hTGlicmFyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdChKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlZEphcnNFeGlzdHMoKSB7Ci0JCXJldHVybiBqYXhiSmFyUHJvcGVydHlFeGlzdHMoKSAmJiBqYXhiSmFyRmlsZUV4aXN0cygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF4YkphclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF4YkphckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSkpLmV4aXN0cygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmKCAhIGpheGJKYXJQcm9wZXJ0eUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JNaXNzaW5nUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KFRlc3RKYXhiUHJvamVjdC5KQVhCX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSkpOwotCX0KLQkKLQkvKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIjsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChTdHJpbmcgcHJvcGVydHlWYWx1ZSkgewotCQlyZXR1cm4gIkpBUiBmaWxlIGRvZXNuJ3QgZXhpc3Q6IFwiIiArIHByb3BlcnR5VmFsdWUgKyAiXCIiOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3lzdGVtUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSmF4YkNvcmVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL0pheGJUZXN0Q2FzZS5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL0pheGJUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzIxMTdmLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9KYXhiVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpheGJQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuSnB0SmF4YkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5pbnRlcm5hbC5mYWNldC5KYXhiRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwuZmFjZXQuSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF4YlByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YlRlc3RDYXNlCi0JCWV4dGVuZHMgQW5ub3RhdGlvblRlc3RDYXNlIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9ICJKYXhiVGVzdFByb2plY3QiOwotCQotCXByb3RlY3RlZCBKYXhiVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBidWlsZEpheGJQcm9qZWN0KEJBU0VfUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQsIGJ1aWxkSmF4YkZhY2V0SW5zdGFsbENvbmZpZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlc3RKYXhiUHJvamVjdCBidWlsZEpheGJQcm9qZWN0KAotCQkJU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBqYXhiQ29uZmlnKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gVGVzdEpheGJQcm9qZWN0LmJ1aWxkSmF4YlByb2plY3QocHJvamVjdE5hbWUsIGF1dG9CdWlsZCwgamF4YkNvbmZpZyk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSmF4YkZhY2V0SW5zdGFsbENvbmZpZygpIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSmF4YkZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWNvbmZpZy5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT04sIGdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKYXhiRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCBnZXRQbGF0Zm9ybSgpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQbGF0Zm9ybURlc2NyaXB0aW9uIGdldFBsYXRmb3JtKCkgewotCQlyZXR1cm4gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0RGVmYXVsdFBsYXRmb3JtKGdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gSmF4YkZhY2V0LlZFUlNJT05fMl8xOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEpheGJQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gKFRlc3RKYXhiUHJvamVjdCkgc3VwZXIuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJQcm9qZWN0IGdldEpheGJQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldEpheGJQcm9qZWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0RmllbGROYW1lZChKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlIDogcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlTmFtZSkpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9TY2hlbWFMaWJyYXJ5VGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9TY2hlbWFMaWJyYXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMzM1Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvU2NoZW1hTGlicmFyeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUueHNkLlhzZFNjaGVtYTsKLQotCi0KLXB1YmxpYyBjbGFzcyBTY2hlbWFMaWJyYXJ5VGVzdHMKLQkJZXh0ZW5kcyBKYXhiVGVzdENhc2UgewotCQotCXB1YmxpYyBTY2hlbWFMaWJyYXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8vIHRlc3RzIHNjaGVtYSBmb3IgbmFtZXNwYWNlIHRoYXQgaXMgc2V0IGluIGNhdGFsb2csIGJ1dCBub3QgaW4gcHJvamVjdCBwcm9wZXJ0aWVzCi0JcHVibGljIHZvaWQgdGVzdFVuc2V0TmFtZXNwYWNlKCkgewotCQlTdHJpbmcgbmFtZXNwYWNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iOwotCQkKLQkJLy8gdGVzdCBpbml0aWFsIGxvYWQKLQkJWHNkU2NoZW1hIHNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IGNhY2hlZCBsb2FkCi0JCXNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IHVubG9hZC9yZWxvYWQKLQkJc2NoZW1hLmdldFhTRENvbXBvbmVudCgpLmVSZXNvdXJjZSgpLnVubG9hZCgpOwotCQlzY2hlbWEgPSBnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5nZXRTY2hlbWEobmFtZXNwYWNlKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCX0KLQkKLQkvLyB0ZXN0cyBzY2hlbWEgZm9yIHJlZ2lzdGVyZWQgdXJpIHRoYXQgaXMgc2V0IGluIHByb2plY3QgcHJvcGVydGllcyAobmFtZXNwYWNlIG5vdCByZWdpc3RlcmVkIGluIGNhdGFsb2cpCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZ2lzdGVyZWRVcmlVbnJlZ2lzdGVyZWROYW1lc3BhY2UoKSB7Ci0JCVN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIjsKLQkJCi0JCS8vIHNldCBuYW1lc3BhY2UgaW4gcHJvamVjdCBwcm9wZXJ0aWVzXAotCQlMaXN0PFN0cmluZz4gc2NoZW1hTG9jYXRpb25zID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXNjaGVtYUxvY2F0aW9ucy5hZGQoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8yXzAueHNkIik7Ci0JCWdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLnNldFNjaGVtYUxvY2F0aW9ucyhzY2hlbWFMb2NhdGlvbnMpOwotCQkKLQkJLy8gdGVzdCBpbml0aWFsIGxvYWQKLQkJWHNkU2NoZW1hIHNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IGNhY2hlZCBsb2FkCi0JCXNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IHVubG9hZC9yZWxvYWQKLQkJc2NoZW1hLmdldFhTRENvbXBvbmVudCgpLmVSZXNvdXJjZSgpLnVubG9hZCgpOwotCQlzY2hlbWEgPSBnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5nZXRTY2hlbWEobmFtZXNwYWNlKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCX0KLQkKLQkvLyB0ZXN0cyBzY2hlbWEgZm9yIHJlZ2lzdGVyZCB1cmkgdGhhdCBpcyBzZXQgaW4gcHJvamVjdCBwcm9wZXJ0aWVzIChuYW1lc3BhY2UgYWxyZWFkeSByZWdpc3RlcmVkIGluIGNhdGFsb2cpCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZ2lzdGVyZWRVcmlSZWdpc3RlcmVkTmFtZXNwYWNlKCkgewotCQlTdHJpbmcgbmFtZXNwYWNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsveHNkcy9wZXJzaXN0ZW5jZS9vcm0iOwotCQkKLQkJLy8gc2V0IG5hbWVzcGFjZSBpbiBwcm9qZWN0IHByb3BlcnRpZXNcCi0JCUxpc3Q8U3RyaW5nPiBzY2hlbWFMb2NhdGlvbnMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQkJc2NoZW1hTG9jYXRpb25zLmFkZCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay94c2RzL2VjbGlwc2VsaW5rX29ybV8xXzAueHNkIik7Ci0JCWdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLnNldFNjaGVtYUxvY2F0aW9ucyhzY2hlbWFMb2NhdGlvbnMpOwotCQkKLQkJLy8gdGVzdCBpbml0aWFsIGxvYWQKLQkJWHNkU2NoZW1hIHNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IGNhY2hlZCBsb2FkCi0JCXNjaGVtYSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0U2NoZW1hTGlicmFyeSgpLmdldFNjaGVtYShuYW1lc3BhY2UpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYSk7Ci0JCQotCQkvLyB0ZXN0IHVubG9hZC9yZWxvYWQKLQkJc2NoZW1hLmdldFhTRENvbXBvbmVudCgpLmVSZXNvdXJjZSgpLnVubG9hZCgpOwotCQlzY2hlbWEgPSBnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5nZXRTY2hlbWEobmFtZXNwYWNlKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCX0KLQkKLQkvLyB0ZXN0cyBzY2hlbWEgZm9yIHVucmVnaXN0ZXJlZCB1cmkgdGhhdCBpcyBzZXQgaW4gcHJvamVjdCBwcm9wZXJ0aWVzIChsb2NhbCBmaWxlKQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVbnJlZ2lzdGVyZFVyaSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBzY2hlbWFGaWxlID0gZ2V0SmF4YlByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShuZXcgUGF0aCgiY3VzdG9tZXIueHNkIikpOwotCQlTdHJpbmcgY29udGVudHMgPSAKLQkJCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IgotCQkJCSsgIjx4czpzY2hlbWEgeG1sbnM6eHM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYVwiIgotCQkJCSsgIiB0YXJnZXROYW1lc3BhY2U9XCJodHRwOi8vd3d3LmV4YW1wbGUub3JnL2N1c3RvbWVyLWV4YW1wbGVcIj4iCi0JCQkJKyAiPC94czpzY2hlbWE+IjsKLQkJc2NoZW1hRmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzLmdldEJ5dGVzKCkpLCB0cnVlLCBudWxsKTsKLQkJCi0JCVN0cmluZyBuYW1lc3BhY2UgPSAiaHR0cDovL3d3dy5leGFtcGxlLm9yZy9jdXN0b21lci1leGFtcGxlIjsKLQkJCi0JCS8vIHNldCBuYW1lc3BhY2UgaW4gcHJvamVjdCBwcm9wZXJ0aWVzXAotCQlMaXN0PFN0cmluZz4gc2NoZW1hTG9jYXRpb25zID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0JCXNjaGVtYUxvY2F0aW9ucy5hZGQoInBsYXRmb3JtOi9yZXNvdXJjZS8iICsgQkFTRV9QUk9KRUNUX05BTUUgKyAiL2N1c3RvbWVyLnhzZCIpOwotCQlnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5zZXRTY2hlbWFMb2NhdGlvbnMoc2NoZW1hTG9jYXRpb25zKTsKLQkJCi0JCS8vIHRlc3QgaW5pdGlhbCBsb2FkCi0JCVhzZFNjaGVtYSBzY2hlbWEgPSBnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5nZXRTY2hlbWEobmFtZXNwYWNlKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCQkKLQkJLy8gdGVzdCBjYWNoZWQgbG9hZAotCQlzY2hlbWEgPSBnZXRKYXhiUHJvamVjdCgpLmdldFNjaGVtYUxpYnJhcnkoKS5nZXRTY2hlbWEobmFtZXNwYWNlKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCQkKLQkJLy8gdGVzdCB1bmxvYWQvcmVsb2FkCi0JCXNjaGVtYS5nZXRYU0RDb21wb25lbnQoKS5lUmVzb3VyY2UoKS51bmxvYWQoKTsKLQkJc2NoZW1hID0gZ2V0SmF4YlByb2plY3QoKS5nZXRTY2hlbWFMaWJyYXJ5KCkuZ2V0U2NoZW1hKG5hbWVzcGFjZSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljQ29udGV4dFJvb3RUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvR2VuZXJpY0NvbnRleHRSb290VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1YTVlZi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9HZW5lcmljQ29udGV4dFJvb3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5UeXBlTGl0ZXJhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNDb250ZXh0Um9vdFRlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0NvbnRleHRSb290VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3Nvck9yZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sQWNjZXNzb3JPcmRlcih2YWx1ZSA9IFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCkiLAotCQkJCUpBWEIuWE1MX0FDQ0VTU19PUkRFUiwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZFN1cGVyY2xhc3NOYW1lZChmaW5hbCBTdHJpbmcgc3VwZXJjbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBzdXBlcmNsYXNzTmFtZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZEF0dHJpYnV0ZSgKLQkJCWZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBmaW5hbCBTdHJpbmcgdHlwZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyAiICsgdHlwZU5hbWUgKyAiICIgKyBhdHRyaWJ1dGVOYW1lICsgIjsiICsgQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZExpc3RBdHRyaWJ1dGUoCi0JCQlmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSwgZmluYWwgU3RyaW5nIHR5cGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KCJqYXZhLnV0aWwuTGlzdCIsIEpBWEIuWE1MX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgTGlzdDwiICsgdHlwZU5hbWUgKyAiPiAiICsgYXR0cmlidXRlTmFtZSArICI7IiArIENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBhY2thZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlJdGVyYXRvcjxKYXhiUGFja2FnZT4gcGFja2FnZXMgPSB0aGlzLmdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5nZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSwgcGFja2FnZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHBhY2thZ2VzLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgYW4gdW5hbm5vdGF0ZWQgcGFja2FnZS1pbmZvLmphdmEgYW5kIG1ha2Ugc3VyZSBpdCdzIG5vdCBhZGRlZCB0byB0aGUgcm9vdCBjb250ZXh0IG5vZGUKLQkJdGhpcy5jcmVhdGVVbmFubm90YXRlZFBhY2thZ2VJbmZvKCJmb28iKTsKLQkJcGFja2FnZXMgPSB0aGlzLmdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGhpcy5nZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSwgcGFja2FnZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHBhY2thZ2VzLmhhc05leHQoKSk7Ci0KLQkJLy9hbm5vdGF0ZSB0aGUgcGFja2FnZS1pbmZvLmphdmEgYW5kIHRlc3QgaXQncyBhZGRlZCB0byB0aGUgcm9vdCBjb250ZXh0IG5vZGUKLQkJSmF2YVJlc291cmNlUGFja2FnZSBmb29SZXNvdXJjZVBhY2thZ2UgPSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBhY2thZ2UoImZvbyIpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQoZm9vUmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0NvbnRleHRSb290VGVzdHMudGhpcy5hZGRYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQkJfQotCQl9KTsKLQotCQlJdGVyYWJsZTxTdHJpbmc+IHBhY2thZ2VOYW1lcyA9IG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpheGJQYWNrYWdlLCBTdHJpbmc+KHRoaXMuZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEpheGJQYWNrYWdlIG8pIHsKLQkJCQlyZXR1cm4gby5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JCWFzc2VydEVxdWFscygyLCB0aGlzLmdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhwYWNrYWdlTmFtZXMsIFBBQ0tBR0VfTkFNRSkpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhwYWNrYWdlTmFtZXMsICJmb28iKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIGFubm90YXRpb24gZnJvbSB0aGUgcGFja2FnZS1pbmZvLmphdmEgYW5kIHRlc3QgaXQncyByZW1vdmVkIGZyb20gdGhlIHJvb3QgY29udGV4dCBub2RlCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNDb250ZXh0Um9vdFRlc3RzLnRoaXMucmVtb3ZlWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCi0JCXBhY2thZ2VzID0gdGhpcy5nZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRoaXMuZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUsIHBhY2thZ2VzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwYWNrYWdlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBhY2Nlc3NUeXBlKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYWRkTm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYWRkRW51bU1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFX19WQUxVRSwgYWNjZXNzVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sU2VlQWxzb0Fubm90YXRpb24oZmluYWwgTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nLi4uIHR5cGVOYW1lcykgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfU0VFX0FMU08pOwotCQlOb3JtYWxBbm5vdGF0aW9uIG5vcm1hbEFubm90YXRpb24gPSBudWxsOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlub3JtYWxBbm5vdGF0aW9uID0gYWRkTm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCX0KLQkJZWxzZSBpZiAoYW5ub3RhdGlvbi5pc01hcmtlckFubm90YXRpb24oKSkgewotCQkJbm9ybWFsQW5ub3RhdGlvbiA9IHJlcGxhY2VNYXJrZXJBbm5vdGF0aW9uKChNYXJrZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vcm1hbEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbjsKLQkJfQotCQkKLQkJRXhwcmVzc2lvbiBhcnJheUluaXRpYWxpemVyID0gbmV3QXJyYXlJbml0aWFsaXplcigKLQkJCQlkZWNsYXJhdGlvbi5nZXRBc3QoKSwKLQkJCQlBcnJheVRvb2xzLmFycmF5KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBUeXBlTGl0ZXJhbD4obmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPih0eXBlTmFtZXMpKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIFR5cGVMaXRlcmFsIHRyYW5zZm9ybShTdHJpbmcgbykgewotCQkJCQkJCQlyZXR1cm4gbmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIG8pOwotCQkJCQkJCX0KLQkJCQkJCX0sCi0JCQkJCQluZXcgRXhwcmVzc2lvblswXSkpOwotCQlhZGRNZW1iZXJWYWx1ZVBhaXIobm9ybWFsQW5ub3RhdGlvbiwgSkFYQi5YTUxfU0VFX0FMU09fX1ZBTFVFLCBhcnJheUluaXRpYWxpemVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVnaXN0cmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeSgpOwotCQlJdGVyYWJsZTxKYXhiVHlwZT4gdHlwZXMgPSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlcykpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpLmdldFhtbFJlZ2lzdHJ5KCkpOwotCQkKLQkJLy9hZGQgYW4gdW5hbm5vdGF0ZWQgY2xhc3MgYW5kIG1ha2Ugc3VyZSBpdCdzIG5vdCBhZGRlZCB0byB0aGUgY29udGV4dCByb290Ci0JCWNyZWF0ZVVuYW5ub3RhdGVkQ2xhc3NOYW1lZCgiRm9vIik7Ci0JCXR5cGVzID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZXMpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKS5nZXRYbWxSZWdpc3RyeSgpKTsKLQkJCi0JCS8vYW5ub3RhdGUgdGhlIGNsYXNzIHdpdGggQFhtbFJlZ2lzdHJ5IGFuZCB0ZXN0IGl0J3MgYWRkZWQgdG8gdGhlIHJvb3QgY29udGV4dCBub2RlCi0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBmb29SZXNvdXJjZVR5cGUgPSBnZXRKYXhiUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoInRlc3QuRm9vIik7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQoZm9vUmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCWFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfUkVHSVNUUlkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQl0eXBlcyA9IGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHR5cGVzKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5Gb28iKSkuZ2V0WG1sUmVnaXN0cnkoKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkuZ2V0WG1sUmVnaXN0cnkoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBjbGFzcyBhbmQgdGVzdCBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgY29udGV4dCByb290Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlyZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXR5cGVzID0gZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZXMpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKS5nZXRYbWxSZWdpc3RyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpKTsKLQkJCi0JCS8vYWRkIGFuIHVuYW5ub3RhdGVkIGNsYXNzIGFuZCBtYWtlIHN1cmUgaXQncyBub3QgYWRkZWQgdG8gdGhlIGNvbnRleHQgcm9vdAotCQljcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkpOwotCQkKLQkJLy9hbm5vdGF0ZSB0aGUgY2xhc3Mgd2l0aCBAWG1sVHlwZSBhbmQgdGVzdCBpdCdzIGFkZGVkIHRvIHRoZSBjb250ZXh0IHJvb3QKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGZvb1Jlc291cmNlVHlwZSA9IGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSgidGVzdC5Gb28iKTsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChmb29SZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9UWVBFKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0LkZvbyIpKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBjbGFzcyBhbmQgdGVzdCBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgcm9vdCBjb250ZXh0IG5vZGUKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCXJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1RZUEUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkpOwotCQlhc3NlcnROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuRm9vIikpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkVudW0pIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkpOwotCQkKLQkJLy9hZGQgYW4gdW5hbm5vdGF0ZWQgY2xhc3MgYW5kIG1ha2Ugc3VyZSBpdCdzIG5vdCBhZGRlZCB0byB0aGUgY29udGV4dCByb290Ci0JCWNyZWF0ZVVuYW5ub3RhdGVkRW51bU5hbWVkKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKCgoSmF4YkVudW0pIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSkpOwotCQlhc3NlcnROdWxsKCgoSmF4YkVudW0pIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5Gb28iKSkpOwotCQkKLQkJLy9hbm5vdGF0ZSB0aGUgY2xhc3Mgd2l0aCBAWG1sRW51bSBhbmQgdGVzdCBpdCdzIGFkZGVkIHRvIHRoZSBjb250ZXh0IHJvb3QKLQkJSmF2YVJlc291cmNlRW51bSBmb29SZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlRW51bSkgZ2V0SmF4YlByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCJ0ZXN0LkZvbyIsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5LaW5kLkVOVU0pOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KGZvb1Jlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlhZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1RZUEUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiRW51bSkgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiRW51bSkgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0LkZvbyIpKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBjbGFzcyBhbmQgdGVzdCBpdCdzIHJlbW92ZWQgZnJvbSB0aGUgcm9vdCBjb250ZXh0IG5vZGUKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCXJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1RZUEUpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiRW51bSkgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKSk7Ci0JCWFzc2VydE51bGwoKChKYXhiRW51bSkgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0LkZvbyIpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3RSZWZlcmVuY2VkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSAiU3VwZXIiICsgVFlQRV9OQU1FOwotCQlTdHJpbmcgZnFTdXBlcmNsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRV8gKyBzdXBlcmNsYXNzTmFtZTsKLQkJY3JlYXRlVW5hbm5vdGF0ZWRDbGFzc05hbWVkKHN1cGVyY2xhc3NOYW1lKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB1bmFubm90YXRlZCBzdXBlcmNsYXNzIGlzIG5vdCBpbiBjb250ZXh0Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCQotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kU3VwZXJjbGFzc05hbWVkKHN1cGVyY2xhc3NOYW1lKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKSk7Ci0JCWFzc2VydE5vdE51bGwoKChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcVN1cGVyY2xhc3NOYW1lKSkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRlZCBjbGFzcyAtIGJvdGggY2xhc3NlcyByZW1vdmVkIGZyb20gY29udGV4dAotCQlJRmlsZSBmaWxlID0gKElGaWxlKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkuZ2V0UmVzb3VyY2UoKTsKLQkJZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROdWxsKCgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpKTsKLQkJYXNzZXJ0TnVsbCgoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxU3VwZXJjbGFzc05hbWUpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REaXJlY3RSZWZlcmVuY2VkQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBvdGhlckNsYXNzTmFtZSA9ICJPdGhlciIgKyBUWVBFX05BTUU7Ci0JCVN0cmluZyBmcU90aGVyQ2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FXyArIG90aGVyQ2xhc3NOYW1lOwotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9ICJvdGhlciI7Ci0JCWNyZWF0ZVVuYW5ub3RhdGVkQ2xhc3NOYW1lZChvdGhlckNsYXNzTmFtZSk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdW5hbm5vdGF0ZWQgb3RoZXIgY2xhc3MgaXMgbm90IGluIGNvbnRleHQKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJCi0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGVBbmRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgb3RoZXJDbGFzc05hbWUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHRoaXNUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEZpZWxkTmFtZWQodGhpc1R5cGUsIGF0dHJpYnV0ZU5hbWUpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEVsZW1lbnQoYXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lKSk7Ci0JCQotCQkvLyBhZGQgYW4gQFhtbEVsZW1lbnQKLQkJYW5ub3RhdGVkQXR0cmlidXRlLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxT3RoZXJDbGFzc05hbWUpKTsKLQkJCi0JCS8vIGNoYW5nZSB0byBAWG1sVHJhbnNpZW50Ci0JCWFubm90YXRlZEF0dHJpYnV0ZS5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCXJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJCQkJYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0UmVmZXJlbmNlZExpc3RBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG90aGVyQ2xhc3NOYW1lID0gIk90aGVyIiArIFRZUEVfTkFNRTsKLQkJU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgb3RoZXJDbGFzc05hbWU7Ci0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gIm90aGVyIjsKLQkJY3JlYXRlVW5hbm5vdGF0ZWRDbGFzc05hbWVkKG90aGVyQ2xhc3NOYW1lKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB1bmFubm90YXRlZCBvdGhlciBjbGFzcyBpcyBub3QgaW4gY29udGV4dAotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQkKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZExpc3RBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSwgb3RoZXJDbGFzc05hbWUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHRoaXNUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEZpZWxkTmFtZWQodGhpc1R5cGUsIGF0dHJpYnV0ZU5hbWUpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEF0dHJpYnV0ZSA9IGFubm90YXRlZEVsZW1lbnQoYXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lKSk7Ci0JCQotCQkvLyBhZGQgYW4gQFhtbEVsZW1lbnQKLQkJYW5ub3RhdGVkQXR0cmlidXRlLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxT3RoZXJDbGFzc05hbWUpKTsKLQkJCi0JCS8vIGNoYW5nZSB0byBAWG1sVHJhbnNpZW50Ci0JCWFubm90YXRlZEF0dHJpYnV0ZS5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCXJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJCQkJYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0UmVmZXJlbmNlZFNlZUFsc28oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIG90aGVyQ2xhc3NOYW1lID0gIk90aGVyIiArIFRZUEVfTkFNRTsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgb3RoZXJDbGFzc05hbWU7Ci0JCWZpbmFsIFN0cmluZyBvdGhlckNsYXNzTmFtZTIgPSAiT3RoZXIiICsgVFlQRV9OQU1FICsgIjIiOwotCQlmaW5hbCBTdHJpbmcgZnFPdGhlckNsYXNzTmFtZTIgPSBQQUNLQUdFX05BTUVfICsgb3RoZXJDbGFzc05hbWUyOwotCQljcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQob3RoZXJDbGFzc05hbWUpOwotCQljcmVhdGVVbmFubm90YXRlZENsYXNzTmFtZWQob3RoZXJDbGFzc05hbWUyKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB1bmFubm90YXRlZCBvdGhlciBjbGFzc2VzIGFyZSBub3QgaW4gY29udGV4dAotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQkKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHRoaXNUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpheGJQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRUeXBlID0gYW5ub3RhdGVkRWxlbWVudCh0aGlzVHlwZSk7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdW5hbm5vdGF0ZWQgb3RoZXIgY2xhc3NlcyBhcmUgbm90IGluIGNvbnRleHQKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCQotCQkvLyBhZGQgYW4gQFhtbFNlZUFsc28gd2l0aCBvbmUgY2xhc3MKLQkJYW5ub3RhdGVkVHlwZS5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCWFkZFhtbFNlZUFsc29Bbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBvdGhlckNsYXNzTmFtZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lKSk7Ci0JCQotCQkvLyBjaGFuZ2UgdG8gQFhtbFNlZUFsc28gd2l0aCB0d28gY2xhc3NlcwotCQlhbm5vdGF0ZWRUeXBlLmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJcmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0VFX0FMU08pOwotCQkJCQkJYWRkWG1sU2VlQWxzb0Fubm90YXRpb24oZGVjbGFyYXRpb24sIG90aGVyQ2xhc3NOYW1lLCBvdGhlckNsYXNzTmFtZTIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShmcU90aGVyQ2xhc3NOYW1lMikpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBAWG1sU2VlQWxzbyBhbm5vdGF0aW9uCi0JCWFubm90YXRlZFR5cGUuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlyZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF4YkluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBvdGhlckNsYXNzTmFtZSA9ICJPdGhlciIgKyBUWVBFX05BTUU7Ci0JCWZpbmFsIFN0cmluZyBmcU90aGVyQ2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FXyArIG90aGVyQ2xhc3NOYW1lOwotCQlmaW5hbCBTdHJpbmcgb3RoZXJDbGFzc05hbWUyID0gIk90aGVyIiArIFRZUEVfTkFNRSArICIyIjsKLQkJZmluYWwgU3RyaW5nIGZxT3RoZXJDbGFzc05hbWUyID0gUEFDS0FHRV9OQU1FXyArIG90aGVyQ2xhc3NOYW1lMjsKLQkJY3JlYXRlVW5hbm5vdGF0ZWRDbGFzc05hbWVkKG90aGVyQ2xhc3NOYW1lKTsKLQkJY3JlYXRlVW5hbm5vdGF0ZWRDbGFzc05hbWVkKG90aGVyQ2xhc3NOYW1lMik7Ci0JCQotCQkvLyBtYWtlIHN1cmUgdW5hbm5vdGF0ZWQgb3RoZXIgY2xhc3NlcyBhcmUgbm90IGluIGNvbnRleHQKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCkpKTsKLQkJCi0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCS8vIG1ha2Ugc3VyZSB1bmFubm90YXRlZCBvdGhlciBjbGFzc2VzIGFyZSBub3QgaW4gY29udGV4dAotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJCi0JCS8vIGFkZCBhIGpheGIuaW5kZXggd2l0aCBvbmUgY2xhc3MKLQkJSUZpbGUgamF4YkluZGV4ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShuZXcgUGF0aCgic3JjL3Rlc3QvamF4Yi5pbmRleCIpKTsKLQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG90aGVyQ2xhc3NOYW1lLmdldEJ5dGVzKCkpOwotCQlqYXhiSW5kZXguY3JlYXRlKHN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZSkpOwotCQkKLQkJLy8gY2hhbmdlIHRvIGpheGIuaW5kZXggd2l0aCB0d28gY2xhc3NlcwotCQlqYXhiSW5kZXguc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKChvdGhlckNsYXNzTmFtZSArIENSICsgb3RoZXJDbGFzc05hbWUyKS5nZXRCeXRlcygpKSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSkpOwotCQlhc3NlcnROb3ROdWxsKGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKGZxT3RoZXJDbGFzc05hbWUpKTsKLQkJYXNzZXJ0Tm90TnVsbChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoZnFPdGhlckNsYXNzTmFtZTIpKTsKLQkJCi0JCS8vIGNsZWFyIHRoZSBqYXhiLmluZGV4Ci0JCWpheGJJbmRleC5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KYXhiQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pheGJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWViMzkyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pheGJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDb250ZXh0Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLkpheGJUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi0JCWV4dGVuZHMgSmF4YlRlc3RDYXNlIHsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1BST0pFQ1RfTkFNRSA9ICJKYXhiQ29udGV4dE1vZGVsVGVzdFByb2plY3QiOwotCQotCQotCXByb3RlY3RlZCBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBidWlsZEpheGJQcm9qZWN0KEJBU0VfUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQsIGJ1aWxkSmF4YkZhY2V0SW5zdGFsbENvbmZpZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpheGJDb250ZXh0Um9vdCBnZXRDb250ZXh0Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF4YlByb2plY3QoKS5nZXRDb250ZXh0Um9vdCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIChBbm5vdGF0ZWRFbGVtZW50KSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShyZXNvdXJjZSwgImFubm90YXRlZEVsZW1lbnQiKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVW5hbm5vdGF0ZWRQYWNrYWdlSW5mbyhTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbyhwYWNrYWdlTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfUkVHSVNUUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxSZWdpc3RyeSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVW5hbm5vdGF0ZWRDbGFzc05hbWVkKFN0cmluZyB0eXBlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgdHlwZU5hbWUgKyAiLmphdmEiLCB0eXBlTmFtZSwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVFbnVtV2l0aFhtbFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdEVudW0obmV3IERlZmF1bHRFbnVtQW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRW51bUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlVW5hbm5vdGF0ZWRFbnVtTmFtZWQoU3RyaW5nIGVudW1OYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdEVudW0oUEFDS0FHRV9OQU1FLCBlbnVtTmFtZSArICIuamF2YSIsIGVudW1OYW1lLCBuZXcgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3MjM0OS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuSmF4YkNvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YS5KYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0czsKLQotcHVibGljIGNsYXNzIEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMKLQkJZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChKYXhiQ29yZVRlc3RzLnJlcXVpcmVkSmFyc0V4aXN0cygpKSB7Ci0JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0NvbnRleHRSb290VGVzdHMuY2xhc3MpOwotCQkJc3VpdGUuYWRkVGVzdChKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoSmF4YkNvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDJhOTgwLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZEF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfQVRUUklCVVRFLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBdHRyaWJ1dGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbEphdmFUeXBlQWRhcHRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZUFuZEF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFZhbHVlKCJmb28iKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQkgLy92ZXJpZnkgdGhlIHhtbCBzY2hlbWEgdHlwZSBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIHZhbHVlIGlzIHNldCB0byBudWxsCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0VmFsdWUobnVsbCk7Ci0JCWphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlQW5kQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vYWRkIGEgdmFsdWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlclR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSX19WQUxVRSwgIlN0cmluZyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQXR0cmlidXRlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGVBbmRBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFNwZWNpZmllZFR5cGUoImZvbyIpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGVBbmRBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImludCIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQotCQkvL2FkZCBhIHR5cGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlclR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSX19UWVBFLCAiU3RyaW5nIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUF0dHJpYnV0ZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEphdmFUeXBlQWRhcHRlclR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pLCAKLQkJCW5hbWUsIAotCQkJdGhpcy5uZXdUeXBlTGl0ZXJhbChkZWNsYXJhdGlvbi5nZXRBc3QoKSwgdHlwZU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxKYXZhVHlwZUFkYXB0ZXJNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsJCQotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2Y0MzVlLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQm9keURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5JRXh0ZW5kZWRNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1vZGlmaWVyLk1vZGlmaWVyS2V5d29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBY2Nlc3NPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5Qcm9wZXJ0eUFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTZWVBbHNvQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlWG1sVHlwZVdpdGhBY2Nlc3NvclR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRSwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlWG1sVHlwZVdpdGhBY2Nlc3Nvck9yZGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfQUNDRVNTX09SREVSLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbEFjY2Vzc29yT3JkZXIodmFsdWUgPSBYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxBY2Nlc3NvclR5cGUodmFsdWUgPSBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKSIsCi0JCQkJSkFYQi5YTUxfQUNDRVNTX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhGaWVsZEFuZFB1YmxpY01lbWJlckFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RZUEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkxpc3Q7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUikuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wZXJ0eUFuZFB1YmxpY01lbWJlckFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RZUEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkxpc3Q7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgaW50IGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gMTsiKS5hcHBlbmQoQ1IpLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKSB7fSIpLmFwcGVuZChDUikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFhtbFR5cGVXaXRoUHJvcGVydHlHZXR0ZXJBbmRQdWJsaWNNZW1iZXJBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9UWVBFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfVFJBTlNJRU5UKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIDE7IikuYXBwZW5kKENSKS5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFhtbFR5cGVXaXRoUHJvcGVydHlHZXR0ZXJMaXN0QW5kUHVibGljTWVtYmVyQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSkFYQi5YTUxfVFlQRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PD8+IGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gMTsiKS5hcHBlbmQoQ1IpLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUikuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wZXJ0eVNldHRlckFuZFB1YmxpY01lbWJlckFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpBWEIuWE1MX1RZUEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkxpc3Q7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbykge30iKS5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlGYWN0b3J5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEZhY3RvcnlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEpBWEIuWE1MX1RZUEVfX0RFRkFVTFRfRkFDVE9SWV9DTEFTUywgY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlDbGFzcygpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoImZvbyIpOwotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkRmFjdG9yeUNsYXNzKG51bGwpOwotCQl4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhKQVhCLlhNTF9UWVBFX19ERUZBVUxUX0ZBQ1RPUllfQ0xBU1MsIGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBnZXQgYmxvd24gYXdheQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCQotCQkvL3NldCBmYWN0b3J5Q2xhc3MgYWdhaW4sIHRoaXMgdGltZSBzdGFydGluZyB3aXRoIG5vIFhtbFR5cGUgYW5ub3RhdGlvbgotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkRmFjdG9yeUNsYXNzKCJmb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRmFjdG9yeUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRGYWN0b3J5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhKQVhCLlhNTF9UWVBFX19ERUZBVUxUX0ZBQ1RPUllfQ0xBU1MsIGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCQotCQkvL2FkZCBhIGZhY3RvcnlDbGFzcyBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbFR5cGVUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9UWVBFX19GQUNUT1JZX0NMQVNTLCAiRm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIGZhY3RvcnlDbGFzcyBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxUeXBlQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0U3BlY2lmaWVkRmFjdG9yeUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoSkFYQi5YTUxfVFlQRV9fREVGQVVMVF9GQUNUT1JZX0NMQVNTLCBjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlGYWN0b3J5TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLnNldEZhY3RvcnlNZXRob2QoImZvbyIpOwotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5zZXRGYWN0b3J5TWV0aG9kKG51bGwpOwotCQl4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQkKLQkJLy9hZGQgYW5vdGhlciBhbm5vdGF0aW9uIHNvIHRoYXQgdGhlIGNvbnRleHQgbW9kZWwgZG9lcyBub3QgZ2V0IGJsb3duIGF3YXkKLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQkKLQkJLy9zZXQgZmFjdG9yeU1ldGhvZCBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sVHlwZSBhbm5vdGF0aW9uCi0JCWNsYXNzTWFwcGluZy5zZXRGYWN0b3J5TWV0aG9kKCJmb28iKTsKLQkJeG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGYWN0b3J5TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCQkKLQkJLy9hZGQgYSBmYWN0b3J5TWV0aG9kIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFlQRV9fRkFDVE9SWV9NRVRIT0QsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIGZhY3RvcnlNZXRob2QgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sVHlwZUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYVR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCVN0cmluZyBkZWZhdWx0WG1sVHlwZU5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKFRZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7CQotCQkKLQkJLy9hZGQgYW5vdGhlciBhbm5vdGF0aW9uIHNvIHRoYXQgdGhlIGNvbnRleHQgbW9kZWwgZG9lcyBub3QgZ2V0IGJsb3duIGF3YXkKLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQkKLQkJLy9zZXQgbmFtZSBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sVHlwZSBhbm5vdGF0aW9uCi0JCWNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQl4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2hlbWFUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlTdHJpbmcgZGVmYXVsdFhtbFR5cGVOYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShUWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRYbWxUeXBlTmFtZSwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFlQRV9fTkFNRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbFR5cGVBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UoImZvbyIpOwotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UobnVsbCk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgYW5ub3RhdGlvbiBzbyB0aGF0IHRoZSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGdldCBibG93biBhd2F5Ci0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJCi0JCS8vc2V0IG5hbWVzcGFjZSBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sVHlwZSBhbm5vdGF0aW9uCi0JCWNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbFR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1RZUEVfX05BTUVTUEFDRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxUeXBlQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgY2xhc3NNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3NUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVhtbFR5cGVXaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpOwotCQlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIGFjY2Vzc29yVHlwZUFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5GSUVMRCwgYWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuRklFTEQsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NUeXBlKCkpOwotCi0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBhY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc1R5cGUuTk9ORSwgYWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuTk9ORSwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc1R5cGUoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShudWxsKTsKLQkJYWNjZXNzb3JUeXBlQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYXNzZXJ0TnVsbChhY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWNjZXNzVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVYbWxUeXBlV2l0aEFjY2Vzc29yVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjbGFzc01hcHBpbmcuZ2V0U3BlY2lmaWVkQWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JCQotCQkvL3NldCB0aGUgYWNjZXNzZXIgdHlwZSB2YWx1ZSB0byBGSUVMRAotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5GSUVMRCwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc1R5cGUoKSk7Ci0KLQkJLy9zZXQgdGhlIGFjY2Vzc2VyIHR5cGUgdmFsdWUgdG8gUFVCTElDX01FTUJFUgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSwgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc1R5cGUoKSk7Ci0KLQkJLy9zZXQgdGhlIGFjY2Vzc2VyIHR5cGUgdmFsdWUgdG8gTk9ORQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSwgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuTk9ORSwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc1R5cGUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGlzIGEgQFhtbEFjY2Vzc29yVHlwZSBvbiBhIGNsYXNzLCB0aGVuIGl0IGlzIHVzZWQuCi0JICogT3RoZXJ3aXNlLCBpZiBhIEBYbWxBY2Nlc3NvclR5cGUgZXhpc3RzIG9uIG9uZSBvZiBpdHMgc3VwZXIgY2xhc3NlcywgdGhlbiBpdCBpcyBpbmhlcml0ZWQuCi0JICogT3RoZXJ3aXNlLCB0aGUgQFhtbEFjY2Vzc29yVHlwZSBvbiBhIHBhY2thZ2UgaXMgaW5oZXJpdGVkLiAJCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBY2Nlc3NUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YkNsYXNzIGNoaWxkSmF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2hpbGRDbGFzc01hcHBpbmcgPSBjaGlsZEpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjaGlsZENsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRDbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0KLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCBjaGlsZENsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzVHlwZSgpKTsKLQotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCWNsYXNzTWFwcGluZy5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRDbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRDbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuTk9ORSwgY2hpbGRDbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNoaWxkQ2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdXBlclBlcnNpc3RlbnRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJDbGFzcyBjaGlsZEpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNoaWxkQ2xhc3NNYXBwaW5nID0gY2hpbGRKYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzTWFwcGluZywgY2hpbGRDbGFzc01hcHBpbmcuZ2V0U3VwZXJjbGFzcygpKTsKLQotCQkvL3Rlc3QgdGhhdCB0aGUgc3VwZXJDbGFzcyBpcyBub3QgbnVsbCBldmVuIHdoZW4gaXQgaXMgdW5hbm5vdGF0ZWQKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoY2xhc3NNYXBwaW5nLCBjaGlsZENsYXNzTWFwcGluZy5nZXRTdXBlcmNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3NPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVYbWxUeXBlV2l0aEFjY2Vzc29yT3JkZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCBjbGFzc01hcHBpbmcuZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NPcmRlcigpKTsKLQotCQljbGFzc01hcHBpbmcuc2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVEKTsKLQkJWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gYWNjZXNzb3JPcmRlckFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzT3JkZXIoKSk7Ci0KLQkJY2xhc3NNYXBwaW5nLnNldFNwZWNpZmllZEFjY2Vzc09yZGVyKG51bGwpOwotCQlhY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnROdWxsKGFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY2xhc3NNYXBwaW5nLmdldEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjbGFzc01hcHBpbmcuZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3NPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVYbWxUeXBlV2l0aEFjY2Vzc29yT3JkZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCBjbGFzc01hcHBpbmcuZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwsIGNsYXNzTWFwcGluZy5nZXRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY2xhc3NNYXBwaW5nLmdldERlZmF1bHRBY2Nlc3NPcmRlcigpKTsKLQotCQkvL3NldCB0aGUgYWNjZXNzIG9yZGVyIHZhbHVlIHRvIFVOREVGSU5FRAotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSLCBKQVhCLlhNTF9BQ0NFU1NfT1JERVJfX1VOREVGSU5FRCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzT3JkZXIoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFNwZWNpZmllZEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjbGFzc01hcHBpbmcuZ2V0QWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNsYXNzTWFwcGluZy5nZXREZWZhdWx0QWNjZXNzT3JkZXIoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb3BPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBwcm9wcyA9IGNsYXNzTWFwcGluZy5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCi0JCS8vYWRkIDIgcHJvcCBvcmRlcnMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRQcm9wKGRlY2xhcmF0aW9uLCAwLCAiYmFyIik7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZFByb3AoZGVjbGFyYXRpb24sIDEsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHByb3BzLmhhc05leHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyBwcm9wKSB7Ci0JCXRoaXMuYWRkQXJyYXlFbGVtZW50KGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9UWVBFLCBpbmRleCwgSkFYQi5YTUxfVFlQRV9fUFJPUF9PUkRFUiwgdGhpcy5uZXdTdHJpbmdMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCBwcm9wKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcE9yZGVyU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlclNpemUoKSk7Ci0KLQkJLy9hZGQgMiBwcm9wIG9yZGVycwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZFByb3AoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkUHJvcChkZWNsYXJhdGlvbiwgMSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNsYXNzTWFwcGluZy5nZXRQcm9wT3JkZXJTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcm9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDAsICJiYXIiKTsKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMCwgImZvbyIpOwotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgwLCAiYmF6Iik7Ci0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBwcm9wcyA9IHhtbFR5cGVBbm5vdGF0aW9uLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDAsICJiYXIiKTsKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMSwgImZvbyIpOwotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgwLCAiYmF6Iik7Ci0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBwcm9wcyA9IHhtbFR5cGVBbm5vdGF0aW9uLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMCwgImJhciIpOwotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgxLCAiZm9vIik7Ci0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDIsICJiYXoiKTsKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0KLQkJY2xhc3NNYXBwaW5nLnJlbW92ZVByb3AoMSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gcmVzb3VyY2VQcm9wcyA9IHhtbFR5cGVBbm5vdGF0aW9uLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VQcm9wcy5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgcmVzb3VyY2VQcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZVByb3BzLmhhc05leHQoKSk7Ci0KLQkJY2xhc3NNYXBwaW5nLnJlbW92ZVByb3AoMSk7Ci0JCXJlc291cmNlUHJvcHMgPSB4bWxUeXBlQW5ub3RhdGlvbi5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlUHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VQcm9wcy5oYXNOZXh0KCkpOwotCi0JCWNsYXNzTWFwcGluZy5yZW1vdmVQcm9wKDApOwotCQlyZXNvdXJjZVByb3BzID0geG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VQcm9wcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUHJvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJY2xhc3NNYXBwaW5nLmFkZFByb3AoMCwgImJhciIpOwotCQljbGFzc01hcHBpbmcuYWRkUHJvcCgxLCAiZm9vIik7Ci0JCWNsYXNzTWFwcGluZy5hZGRQcm9wKDIsICJiYXoiKTsKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHhtbFR5cGVBbm5vdGF0aW9uLmdldFByb3BPcmRlclNpemUoKSk7CQkKLQotCQljbGFzc01hcHBpbmcubW92ZVByb3AoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHByb3BzID0gY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHByb3BzLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiByZXNvdXJjZVByb3BzID0geG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZVByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgcmVzb3VyY2VQcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlUHJvcHMubmV4dCgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5tb3ZlUHJvcCgwLCAxKTsKLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcHMubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZShwcm9wcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlUHJvcHMgPSB4bWxUeXBlQW5ub3RhdGlvbi5nZXRQcm9wT3JkZXIoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHJlc291cmNlUHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZVByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VQcm9wcy5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jUHJvcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHByb3BzID0gY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHByb3BzLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMyBwcm9wIG9yZGVycwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZFByb3AoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkUHJvcChkZWNsYXJhdGlvbiwgMSwgImZvbyIpOwotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRQcm9wKGRlY2xhcmF0aW9uLCAyLCAiYmF6Iik7Ci0JCQl9Ci0JCX0pOwotCi0JCXByb3BzID0gY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUocHJvcHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5tb3ZlUHJvcChkZWNsYXJhdGlvbiwgMiwgMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXByb3BzID0gY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUocHJvcHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5tb3ZlUHJvcChkZWNsYXJhdGlvbiwgMCwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXByb3BzID0gY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUocHJvcHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBwcm9wcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVQcm9wKGRlY2xhcmF0aW9uLCAxKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcHMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UocHJvcHMuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVQcm9wKGRlY2xhcmF0aW9uLCAxKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcHJvcHMgPSBjbGFzc01hcHBpbmcuZ2V0UHJvcE9yZGVyKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHByb3BzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHByb3BzLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlUHJvcChkZWNsYXJhdGlvbiwgMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXByb3BzID0gY2xhc3NNYXBwaW5nLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHByb3BzLmhhc05leHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbFR5cGVUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbFR5cGVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9UWVBFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlUHJvcChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgSkFYQi5YTUxfVFlQRV9fUFJPUF9PUkRFUiwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQcm9wKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBKQVhCLlhNTF9UWVBFX19QUk9QX09SREVSLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFJvb3RFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5hZGRYbWxSb290RWxlbWVudCgpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiB4bWxSb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNsYXNzTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5yZW1vdmVYbWxSb290RWxlbWVudCgpOwotCQl4bWxSb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxSb290RWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKSk7Ci0JCQotCQkvL2FkZCBhIFhtbFJvb3RFbGVtZW50IGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1lbWJlclZhbHVlUGFpcihhbm5vdGF0aW9uLCBKQVhCLlhNTF9ST09UX0VMRU1FTlRfX05BTUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbFJvb3RFbGVtZW50IGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZpZWxkQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlV2l0aEZpZWxkQW5kUHVibGljTWVtYmVyQWNjZXNzKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZm9vOwotCQlwdWJsaWNGaWVsZFRlc3QoY2xhc3NNYXBwaW5nKTsKLQkJCi0JCS8vcHVibGljIHRyYW5zaWVudCBpbnQgZm9vOwotCQlwdWJsaWNUcmFuc2llbnRGaWVsZFRlc3QoY2xhc3NNYXBwaW5nKTsKLQkJCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZm9vOwotCQlwdWJsaWNTdGF0aWNGaWVsZFRlc3QoY2xhc3NNYXBwaW5nKTsKLQkJCi0JCS8vcHVibGljIGZpbmFsIGludCBmb287Ci0JCXB1YmxpY0ZpbmFsRmllbGRUZXN0KGNsYXNzTWFwcGluZyk7Ci0JCQotCQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvbzsKLQkJcHVibGljU3RhdGljRmluYWxGaWVsZFRlc3QoY2xhc3NNYXBwaW5nKTsKLQkJCi0JCS8vcHJpdmF0ZSBpbnQgZm9vOwotCQlwcml2YXRlRmllbGRUZXN0KGNsYXNzTWFwcGluZyk7Ci0JCQotCQkvLyAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IGZvbzsKLQkJcHJpdmF0ZVRyYW5zaWVudEZpZWxkVGVzdChjbGFzc01hcHBpbmcpOwotCQkKLQkJLy8gIEBYbWxBdHRyaWJ1dGUKLQkJLy8gIHByaXZhdGUgc3RhdGljIGludCBmb287IC8vcGVyc2lzdGVudAotCQlwcml2YXRlU3RhdGljRmllbGRUZXN0KGNsYXNzTWFwcGluZyk7Ci0JCQotCQkvLyAgQFhtbEF0dHJpYnV0ZQotCQkvLyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGZvbzsgLy9wZXJzaXN0ZW50Ci0JCXByaXZhdGVTdGF0aWNGaW5hbEZpZWxkVGVzdChjbGFzc01hcHBpbmcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaWNGaWVsZFRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJLy9wdWJsaWMgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCS8vcHVibGljIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJLy9wdWJsaWMgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkvL2FkZCBAWG1sVHJhbnNpZW50IGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VGaWVsZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxUcmFuc2llbnQKLQkJLy9wdWJsaWMgaW50IGZvbzsgLy9QUk9QRVJUWSBhY2Nlc3MgLSBub3QgInBlcnNpc3RlbnQiLCBidXQgY29tZXMgaW4gdG8gb3VyIGNvbnRleHQgbW9kZWwgYmVjYXVzZSBpdCBpcyAibWFwcGVkIgotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxUcmFuc2llbnQKLQkJLy9wdWJsaWMgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbFRyYW5zaWVudAotCQkvL3B1YmxpYyBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbFRyYW5zaWVudAotCQkvL3B1YmxpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1YmxpY1RyYW5zaWVudEZpZWxkVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IChKYXZhUmVzb3VyY2VGaWVsZCkgYXR0cmlidXRlcy5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJLy9wdWJsaWMgdHJhbnNpZW50IGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlRSQU5TSUVOVF9LRVlXT1JEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyB0cmFuc2llbnQgaW50IGZvbzsgLy9QUk9QRVJUWSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHRyYW5zaWVudCBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgdHJhbnNpZW50IGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgdHJhbnNpZW50IGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5UUkFOU0lFTlRfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHVibGljU3RhdGljRmllbGRUZXN0KEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nKSB7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBhdHRyaWJ1dGVzLm5leHQoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLmFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJdGhpcy5yZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlNUQVRJQ19LRVlXT1JEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaWNGaW5hbEZpZWxkVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IChKYXZhUmVzb3VyY2VGaWVsZCkgYXR0cmlidXRlcy5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJLy9wdWJsaWMgZmluYWwgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5GSU5BTF9LRVlXT1JEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9wdWJsaWMgZmluYWwgaW50IGZvbzsgLy9QUk9QRVJUWSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIGZpbmFsIGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL3B1YmxpYyBmaW5hbCBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIGZpbmFsIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5GSU5BTF9LRVlXT1JEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaWNTdGF0aWNGaW5hbEZpZWxkVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IChKYXZhUmVzb3VyY2VGaWVsZCkgYXR0cmlidXRlcy5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb287IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlNUQVRJQ19LRVlXT1JELCBNb2RpZmllcktleXdvcmQuRklOQUxfS0VZV09SRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQl0aGlzLnJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQsIE1vZGlmaWVyS2V5d29yZC5GSU5BTF9LRVlXT1JEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcml2YXRlRmllbGRUZXN0KEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nKSB7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBhdHRyaWJ1dGVzLm5leHQoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJcmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JCWFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFJJVkFURV9LRVlXT1JEKTsKLQotCQkvL3ByaXZhdGUgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHJpdmF0ZSBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL3ByaXZhdGUgaW50IGZvbzsgLy9OT05FIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3ByaXZhdGUgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VGaWVsZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIGludCBmb287IC8vUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIGludCBmb287IC8vRklFTEQgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQlyZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCk7Ci0JCWFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaXZhdGVUcmFuc2llbnRGaWVsZFRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoSmF2YVJlc291cmNlRmllbGQpIGF0dHJpYnV0ZXMubmV4dCgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlyZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBVQkxJQ19LRVlXT1JEKTsKLQkJYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQsIE1vZGlmaWVyS2V5d29yZC5UUkFOU0lFTlRfS0VZV09SRCk7Ci0KLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHJpdmF0ZSB0cmFuc2llbnQgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VGaWVsZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHRyYW5zaWVudCBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSB0cmFuc2llbnQgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgdHJhbnNpZW50IGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSB0cmFuc2llbnQgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQkJcmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQsIE1vZGlmaWVyS2V5d29yZC5UUkFOU0lFTlRfS0VZV09SRCk7Ci0JCWFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaXZhdGVTdGF0aWNGaWVsZFRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoSmF2YVJlc291cmNlRmllbGQpIGF0dHJpYnV0ZXMubmV4dCgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlyZW1vdmVNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBVQkxJQ19LRVlXT1JEKTsKLQkJYWRkTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHJpdmF0ZSBzdGF0aWMgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VGaWVsZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHN0YXRpYyBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBzdGF0aWMgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgc3RhdGljIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBzdGF0aWMgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQkJcmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlRmllbGQsIE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCk7Ci0JCWFkZE1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaXZhdGVTdGF0aWNGaW5hbEZpZWxkVGVzdChKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZykgewotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IChKYXZhUmVzb3VyY2VGaWVsZCkgYXR0cmlidXRlcy5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCXJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUZpZWxkLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCQlhZGRNb2RpZmllcnMocmVzb3VyY2VGaWVsZCwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCwgTW9kaWZpZXJLZXl3b3JkLlNUQVRJQ19LRVlXT1JELCBNb2RpZmllcktleXdvcmQuRklOQUxfS0VZV09SRCk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL0ZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL05PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VGaWVsZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgZm9vOyAvL1BST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGZvbzsgLy9GSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBmb287IC8vTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGZvbzsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvcGVydHlBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BlcnR5QW5kUHVibGljTWVtYmVyQWNjZXNzKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgdm9pZCBzZXRGb28oaW50KTsKLQkJcHVibGljR2V0dGVyU2V0dGVyVGVzdChjbGFzc01hcHBpbmcpOwotCQkKLQkJLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKTssIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oaW50KTsKLQkJcHVibGljU3RhdGljR2V0dGVyU2V0dGVyVGVzdChjbGFzc01hcHBpbmcpOwotCQkKLQkJLy9wcml2YXRlIGludCBnZXRGb28oKTssIHByaXZhdGUgdm9pZCBzZXRGb28oaW50KTsKLQkJcHJpdmF0ZUdldHRlclNldHRlclRlc3QoY2xhc3NNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUdldHRlclByb3BlcnR5QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wZXJ0eUdldHRlckFuZFB1YmxpY01lbWJlckFjY2VzcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQkKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7IFBST1BFUlRZIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOyBGSUVMRCBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vcHVibGljIGludCBnZXRGb28oKTsgTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBjbGFzc01hcHBpbmcuZ2V0SmF4YlR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZXRob2QpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIGludCBnZXRGb28oKTsgUFJPUEVSVFkgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7IEZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIGludCBnZXRGb28oKTsgTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNldHRlclByb3BlcnR5QXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wZXJ0eVNldHRlckFuZFB1YmxpY01lbWJlckFjY2VzcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQkKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vcHVibGljIHZvaWQgc2V0Rm9vKGludCBmb28pOyBQUk9QRVJUWSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7IEZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7IE5PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vcHVibGljIHZvaWQgc2V0Rm9vKGludCBmb28pOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGNsYXNzTWFwcGluZy5nZXRKYXhiVHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7OyBQUk9QRVJUWSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgdm9pZCBzZXRGb28oaW50IGZvbyk7IEZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyB2b2lkIHNldEZvbyhpbnQgZm9vKTsgTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIHZvaWQgc2V0Rm9vKGludCBmb28pOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVHZXR0ZXJMaXN0UHJvcGVydHlBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoUHJvcGVydHlHZXR0ZXJMaXN0QW5kUHVibGljTWVtYmVyQWNjZXNzKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvL3B1YmxpYyBMaXN0PD8+IGdldEZvbygpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9wdWJsaWMgTGlzdDw/PiBnZXRGb28oKTsgRklFTEQgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBMaXN0PD8+IGdldEZvbygpOyBOT05FIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBMaXN0PD8+IGdldEZvbygpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBjbGFzc01hcHBpbmcuZ2V0SmF4YlR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZXRob2QpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IEZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIExpc3Q8Pz4gZ2V0Rm9vKCk7IE5PTkUgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBMaXN0PD8+IGdldEZvbygpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1YmxpY0dldHRlclNldHRlclRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gcGVyc2lzdGVudAotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlJdGVyYXRvcjxKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IEZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IE5PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIGludCBnZXRGb28oKTssIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCi0JCS8vYWRkIEBYbWxBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhbmQgdGVzdCBlYWNoIGFjY2VzcyB0eXBlCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IChKYXZhUmVzb3VyY2VNZXRob2QpIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgaW50IGdldEZvbygpOywgcHVibGljIHZvaWQgc2V0Rm9vKGludCk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIGludCBnZXRGb28oKTssIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQpOyBGSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgdm9pZCBzZXRGb28oaW50KTsgTk9ORSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHVibGljIGludCBnZXRGb28oKTssIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1YmxpY1N0YXRpY0dldHRlclNldHRlclRlc3QoSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcpIHsKLQkJSXRlcmF0b3I8SmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCVByb3BlcnR5QWNjZXNzb3IgcHJvcGVydHlBY2Nlc3NvciA9IChQcm9wZXJ0eUFjY2Vzc29yKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShhdHRyaWJ1dGVzLm5leHQoKSwgImFjY2Vzc29yIik7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciA9IHByb3BlcnR5QWNjZXNzb3IuZ2V0UmVzb3VyY2VHZXR0ZXJNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyID0gcHJvcGVydHlBY2Nlc3Nvci5nZXRSZXNvdXJjZVNldHRlck1ldGhvZCgpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VHZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCk7Ci0JCXRoaXMuYWRkTW9kaWZpZXJzKHJlc291cmNlU2V0dGVyLCBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0KLQkJLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKTssIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oaW50KTsgUFJPUEVSVFkgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpOywgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhpbnQpOyBGSUVMRCBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCk7IE5PTkUgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0JCS8vcHVibGljIHN0YXRpYyBpbnQgZ2V0Rm9vKCk7LCBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCk7IFBVQkxJQ19NRU1CRVIgYWNjZXNzIC0gbm90IHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCi0KLQkJLy9hZGQgQFhtbEF0dHJpYnV0ZSBhbm5vdGF0aW9uIGFuZCB0ZXN0IGVhY2ggYWNjZXNzIHR5cGUKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlR2V0dGVyKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJfSk7Ci0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpOywgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhpbnQpOyBQUk9QRVJUWSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpOywgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhpbnQpOyBGSUVMRCBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3B1YmxpYyBzdGF0aWMgaW50IGdldEZvbygpOywgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhpbnQpOyBOT05FIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX05PTkUpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQkvL0BYbWxBdHRyaWJ1dGUKLQkJLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKTssIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oaW50KTsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQkJdGhpcy5yZW1vdmVNb2RpZmllcnMocmVzb3VyY2VHZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5TVEFUSUNfS0VZV09SRCk7Ci0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlU2V0dGVyLCBNb2RpZmllcktleXdvcmQuU1RBVElDX0tFWVdPUkQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaXZhdGVHZXR0ZXJTZXR0ZXJUZXN0KEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nKSB7Ci0JCUl0ZXJhdG9yPEpheGJQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlQcm9wZXJ0eUFjY2Vzc29yIHByb3BlcnR5QWNjZXNzb3IgPSAoUHJvcGVydHlBY2Nlc3NvcikgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoYXR0cmlidXRlcy5uZXh0KCksICJhY2Nlc3NvciIpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIgPSBwcm9wZXJ0eUFjY2Vzc29yLmdldFJlc291cmNlR2V0dGVyTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlciA9IHByb3BlcnR5QWNjZXNzb3IuZ2V0UmVzb3VyY2VTZXR0ZXJNZXRob2QoKTsKLQotCQkvL3ByaXZhdGUgaW50IGdldEZvbygpOywgcHJpdmF0ZSB2b2lkIHNldEZvbyhpbnQpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlR2V0dGVyLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCQl0aGlzLnJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZVNldHRlciwgTW9kaWZpZXJLZXl3b3JkLlBVQkxJQ19LRVlXT1JEKTsKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VHZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5QUklWQVRFX0tFWVdPUkQpOwotCQl0aGlzLmFkZE1vZGlmaWVycyhyZXNvdXJjZVNldHRlciwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL3ByaXZhdGUgaW50IGdldEZvbygpOywgcHJpdmF0ZSB2b2lkIHNldEZvbyhpbnQpOyBQUk9QRVJUWSBhY2Nlc3MgLSBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vcHJpdmF0ZSBpbnQgZ2V0Rm9vKCk7LCBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCk7IEZJRUxEIGFjY2VzcyAtIG5vdCBwZXJzaXN0ZW50Ci0JCXRoaXMuc2V0QWNjZXNzVHlwZUluSmF2YVNvdXJjZShjbGFzc01hcHBpbmcsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIGludCBnZXRGb28oKTssIHByaXZhdGUgdm9pZCBzZXRGb28oaW50KTsgTk9ORSBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQkJLy9wcml2YXRlIGludCBnZXRGb28oKTssIHByaXZhdGUgdm9pZCBzZXRGb28oaW50KTsgUFVCTElDX01FTUJFUiBhY2Nlc3MgLSBub3QgcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCWFzc2VydEVxdWFscygwLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0KLQotCQkvL2FkZCBAWG1sQXR0cmlidXRlIGFubm90YXRpb24gYW5kIHRlc3QgZWFjaCBhY2Nlc3MgdHlwZQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VHZXR0ZXIpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQl9KTsKLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBpbnQgZ2V0Rm9vKCk7LCBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCk7IFBST1BFUlRZIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBpbnQgZ2V0Rm9vKCk7LCBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCk7IEZJRUxEIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX0ZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXR0cmlidXRlcyA9IGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJLy9AWG1sQXR0cmlidXRlCi0JCS8vcHJpdmF0ZSBpbnQgZ2V0Rm9vKCk7LCBwcml2YXRlIHZvaWQgc2V0Rm9vKGludCk7IE5PTkUgYWNjZXNzIC0gcGVyc2lzdGVudAotCQl0aGlzLnNldEFjY2Vzc1R5cGVJbkphdmFTb3VyY2UoY2xhc3NNYXBwaW5nLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fTk9ORSk7Ci0JCWFzc2VydEVxdWFscygxLCBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JCWF0dHJpYnV0ZXMgPSBjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCi0JCS8vQFhtbEF0dHJpYnV0ZQotCQkvL3ByaXZhdGUgaW50IGdldEZvbygpOywgcHJpdmF0ZSB2b2lkIHNldEZvbyhpbnQpOyBQVUJMSUNfTUVNQkVSIGFjY2VzcyAtIHBlcnNpc3RlbnQKLQkJdGhpcy5zZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKGNsYXNzTWFwcGluZywgSkFYQi5YTUxfQUNDRVNTX1RZUEVfX1BVQkxJQ19NRU1CRVIpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhdHRyaWJ1dGVzID0gY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCX0pOwotCQl0aGlzLnJlbW92ZU1vZGlmaWVycyhyZXNvdXJjZUdldHRlciwgTW9kaWZpZXJLZXl3b3JkLlBSSVZBVEVfS0VZV09SRCk7Ci0JCXRoaXMucmVtb3ZlTW9kaWZpZXJzKHJlc291cmNlU2V0dGVyLCBNb2RpZmllcktleXdvcmQuUFJJVkFURV9LRVlXT1JEKTsKLQkJdGhpcy5hZGRNb2RpZmllcnMocmVzb3VyY2VHZXR0ZXIsIE1vZGlmaWVyS2V5d29yZC5QVUJMSUNfS0VZV09SRCk7Ci0JCXRoaXMuYWRkTW9kaWZpZXJzKHJlc291cmNlU2V0dGVyLCBNb2RpZmllcktleXdvcmQuUFVCTElDX0tFWVdPUkQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sU2VlQWxzbygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sU2VlQWxzbygpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5hZGRYbWxTZWVBbHNvKCk7Ci0JCWFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0Tm90TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sU2VlQWxzbygpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCWNsYXNzTWFwcGluZy5yZW1vdmVYbWxTZWVBbHNvKCk7Ci0JCWFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sU2VlQWxzbygpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFNlZUFsc28oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlYbWxTZWVBbHNvQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbFNlZUFsc28oKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJCQkJfQotCQkJCX0pOwotCQlhbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydE5vdE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbFNlZUFsc28oKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoCi0JCQkJCQlNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCWFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0TnVsbChjbGFzc01hcHBpbmcuZ2V0WG1sU2VlQWxzbygpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTW9kaWZpZXJzKEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlciwgZmluYWwgTW9kaWZpZXJLZXl3b3JkLi4uIG1vZGlmaWVycykgewotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZW1iZXIpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUNsYXNzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTW9kaWZpZXJzKChCb2R5RGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIG1vZGlmaWVycyk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1vZGlmaWVycyhKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIsIGZpbmFsIE1vZGlmaWVyS2V5d29yZC4uLiBtb2RpZmllcnMpIHsKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlTWVtYmVyKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZU1vZGlmaWVycygoQm9keURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBtb2RpZmllcnMpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNb2RpZmllcnMoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiwgTW9kaWZpZXJLZXl3b3JkLi4uIG1vZGlmaWVycykgewotCQlmb3IgKE1vZGlmaWVyS2V5d29yZCBtb2RpZmllciA6IG1vZGlmaWVycykgewotCQkJdGhpcy5tb2RpZmllcnMoYm9keURlY2xhcmF0aW9uKS5hZGQoYm9keURlY2xhcmF0aW9uLmdldEFTVCgpLm5ld01vZGlmaWVyKG1vZGlmaWVyKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNb2RpZmllcnMoQm9keURlY2xhcmF0aW9uIGJvZHlEZWNsYXJhdGlvbiwgTW9kaWZpZXJLZXl3b3JkLi4uIG1vZGlmaWVyS2V5d29yZHMpIHsKLQkJZm9yIChNb2RpZmllcktleXdvcmQgbW9kaWZpZXJLZXlXb3JkIDogbW9kaWZpZXJLZXl3b3JkcykgewotCQkJZm9yIChJdGVyYXRvcjxJRXh0ZW5kZWRNb2RpZmllcj4gc3RyZWFtID0gdGhpcy5tb2RpZmllcnMoYm9keURlY2xhcmF0aW9uKS5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCUlFeHRlbmRlZE1vZGlmaWVyIG1vZGlmaWVyID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAobW9kaWZpZXIuaXNNb2RpZmllcigpKSB7Ci0JCQkJCWlmICgoKE1vZGlmaWVyKSBtb2RpZmllcikuZ2V0S2V5d29yZCgpID09IG1vZGlmaWVyS2V5V29yZCkgewotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4gbW9kaWZpZXJzKEJvZHlEZWNsYXJhdGlvbiBib2R5RGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGJvZHlEZWNsYXJhdGlvbi5tb2RpZmllcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBY2Nlc3NUeXBlSW5KYXZhU291cmNlKEpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nLCBmaW5hbCBTdHJpbmcgYWNjZXNzVHlwZSkgewotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlQ2xhc3MgPSBjbGFzc01hcHBpbmcuZ2V0SmF4YlR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUNsYXNzKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFDbGFzc01hcHBpbmdUZXN0cy50aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUsIGFjY2Vzc1R5cGUpOwotCQkJfQotCQl9KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlOGY3Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJPYmplY3RGYWN0b3J5LmphdmEiLCAiT2JqZWN0RmFjdG9yeSIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9SRUdJU1RSWSwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMLCAiamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUmVnaXN0cnkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50RGVjbCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgSkFYQkVsZW1lbnQ8QW5ub3RhdGlvblRlc3RUeXBlPiBjcmVhdGVGb28oQW5ub3RhdGlvblRlc3RUeXBlIHZhbHVlKSB7cmV0dXJuIG51bGx9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBYbWxFbGVtZW50RGVjbChuYW1lPVwiYmFyXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBKQVhCRWxlbWVudCBjcmVhdGVCYXIoT2JqZWN0IHZhbHVlKSB7cmV0dXJuIG51bGx9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RWxlbWVudE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJSXRlcmF0b3I8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBlbGVtZW50RmFjdG9yeU1ldGhvZHMgPSB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRSZXNvdXJjZU1ldGhvZCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJhciIpOwotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQkgLy92ZXJpZnkgdGhlIHhtbCBlbGVtZW50IGRlY2wgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSBlbGVtZW50IG5hbWUgaXMgc2V0IHRvIG51bGwKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQllbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRWxlbWVudE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0Lk9iamVjdEZhY3RvcnkiKTsKLQkJWG1sUmVnaXN0cnkgeG1sUmVnaXN0cnkgPSBqYXhiQ2xhc3MuZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnREZWNsTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX0RFQ0xfX05BTUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLnJlbW92ZVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeURlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJSXRlcmF0b3I8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBlbGVtZW50RmFjdG9yeU1ldGhvZHMgPSB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRSZXNvdXJjZU1ldGhvZCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpKTsKLQotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5zZXREZWZhdWx0VmFsdWUoImJhciIpOwotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIGVsZW1lbnQgZGVjbCBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIGVsZW1lbnQgbmFtZSBpcyBzZXQgdG8gbnVsbAotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5zZXREZWZhdWx0VmFsdWUobnVsbCk7Ci0JCWVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldERlZmF1bHRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlTWV0aG9kKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMuYWRkWG1sRWxlbWVudERlY2xNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfREVDTF9fREVGQVVMVF9WQUxVRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY29wZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJSXRlcmF0b3I8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBlbGVtZW50RmFjdG9yeU1ldGhvZHMgPSB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRSZXNvdXJjZU1ldGhvZCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFNjb3BlKCkpOwotCQlhc3NlcnRUcnVlKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmlzR2xvYmFsU2NvcGUoKSk7Ci0JCQotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5zZXRTY29wZSgiQmFyIik7Ci0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiBlbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFNjb3BlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFNjb3BlKCkpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50RmFjdG9yeU1ldGhvZC5pc0dsb2JhbFNjb3BlKCkpOwotCQkKLQkJZWxlbWVudEZhY3RvcnlNZXRob2Quc2V0U2NvcGUoSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kLkRFRkFVTFRfU0NPUEVfQ0xBU1NfTkFNRSk7Ci0JCWVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0RXF1YWxzKEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZC5ERUZBVUxUX1NDT1BFX0NMQVNTX05BTUUsIGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTY29wZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZC5ERUZBVUxUX1NDT1BFX0NMQVNTX05BTUUsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFNjb3BlKCkpOwotCQlhc3NlcnRUcnVlKGVsZW1lbnRGYWN0b3J5TWV0aG9kLmlzR2xvYmFsU2NvcGUoKSk7Ci0JCQotCQkgLy92ZXJpZnkgdGhlIHhtbCBlbGVtZW50IGRlY2wgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSBlbGVtZW50IG5hbWUgaXMgc2V0IHRvIG51bGwKLQkJZWxlbWVudEZhY3RvcnlNZXRob2Quc2V0U2NvcGUobnVsbCk7Ci0JCWVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U2NvcGUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U2NvcGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY29wZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTY29wZSgpKTsKLQkJYXNzZXJ0VHJ1ZShlbGVtZW50RmFjdG9yeU1ldGhvZC5pc0dsb2JhbFNjb3BlKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZU1ldGhvZCk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnREZWNsVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TQ09QRSwgIkZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTY29wZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudEZhY3RvcnlNZXRob2QuaXNHbG9iYWxTY29wZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5yZW1vdmVYbWxFbGVtZW50RGVjbEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN1YnN0aXR1dGlvbkhlYWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXIiKTsKLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIGVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQkgLy92ZXJpZnkgdGhlIHhtbCBlbGVtZW50IGRlY2wgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSBlbGVtZW50IG5hbWUgaXMgc2V0IHRvIG51bGwKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3Vic3RpdHV0aW9uSGVhZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKCJ0ZXN0Lk9iamVjdEZhY3RvcnkiKTsKLQkJWG1sUmVnaXN0cnkgeG1sUmVnaXN0cnkgPSBqYXhiQ2xhc3MuZ2V0WG1sUmVnaXN0cnkoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZXRob2QpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50RGVjbE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLmdldE5hbWUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydEVxdWFscygiIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiYmFyIik7Ci0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiBlbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIGVsZW1lbnQgZGVjbCBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIGVsZW1lbnQgbmFtZSBpcyBzZXQgdG8gbnVsbAotCQllbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UobnVsbCk7Ci0JCWVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRTdWJzdGl0dXRpb25IZWFkUU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8SmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kPiBlbGVtZW50RmFjdG9yeU1ldGhvZHMgPSB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRSZXNvdXJjZU1ldGhvZCgpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFN1YnN0aXR1dGlvbkhlYWRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZXRob2QpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50RGVjbE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19TVUJTVElUVVRJT05fSEVBRF9OQU1FU1BBQ0UsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0U3Vic3RpdHV0aW9uSGVhZFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRWxlbWVudEZhY3RvcnlNZXRob2RUZXN0cy50aGlzLnJlbW92ZVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFR5cGUoKTsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sUmVnaXN0cnlBbmRDcmVhdGVNZXRob2RzKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZSgidGVzdC5PYmplY3RGYWN0b3J5Iik7Ci0JCVhtbFJlZ2lzdHJ5IHhtbFJlZ2lzdHJ5ID0gamF4YkNsYXNzLmdldFhtbFJlZ2lzdHJ5KCk7Ci0JCQotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbGVtZW50RmFjdG9yeU1ldGhvZCBlbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFJlc291cmNlTWV0aG9kKCk7Ci0JCWFzc2VydEVxdWFscygiIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lc3BhY2UoImJhciIpOwotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24gZWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJIC8vdmVyaWZ5IHRoZSB4bWwgZWxlbWVudCBkZWNsIGFubm90YXRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgZWxlbWVudCBuYW1lIGlzIHNldCB0byBudWxsCi0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQllbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVDbGFzc1dpdGhYbWxUeXBlKCk7Ci0JCWNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSB4bWxSZWdpc3RyeSA9IGpheGJDbGFzcy5nZXRYbWxSZWdpc3RyeSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPEpheGJFbGVtZW50RmFjdG9yeU1ldGhvZD4gZWxlbWVudEZhY3RvcnlNZXRob2RzID0geG1sUmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kIGVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UmVzb3VyY2VNZXRob2QoKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VNZXRob2QpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVsZW1lbnRGYWN0b3J5TWV0aG9kVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50RGVjbE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMX19OQU1FU1BBQ0UsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCB4bWxSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnREZWNsTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxFbGVtZW50RGVjbEFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50RGVjbFR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtQ29uc3RhbnRUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1Db25zdGFudFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Yjk3NWUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudW1Db25zdGFudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJFbnVtTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRW51bVZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFFbnVtQ29uc3RhbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlRW51bVdpdGhYbWxFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0RW51bShuZXcgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFbnVtQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sRW51bSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXhiRW51bUNvbnN0YW50IGNvbnRleHRFbnVtQ29uc3RhbnQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHMoKSwgMSk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gamF4YkVudW0uZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJLy9hZGQgYSBmYWN0b3J5Q2xhc3MgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlRW51bSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMudGhpcy5jaGFuZ2VFbnVtQ29uc3RhbnROYW1lKChFbnVtRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksICJNT05EQVkiLCAiTU9OREFZMiIpOwotCQkJfQotCQl9KTsKLQkJY29udGV4dEVudW1Db25zdGFudCA9IENvbGxlY3Rpb25Ub29scy5nZXQoZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50cygpLCAxKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1PTkRBWTIiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sRW51bSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXhiRW51bUNvbnN0YW50IGNvbnRleHRFbnVtQ29uc3RhbnQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHMoKSwgMSk7Ci0JCUphdmFSZXNvdXJjZUVudW1Db25zdGFudCByZXNvdXJjZUVudW1Db25zdGFudCA9IGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0UmVzb3VyY2VFbnVtQ29uc3RhbnQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0RW51bUNvbnN0YW50LmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dEVudW1Db25zdGFudC5zZXRTcGVjaWZpZWRWYWx1ZSgiZm9vIik7Ci0JCVhtbEVudW1WYWx1ZUFubm90YXRpb24gZW51bVZhbHVlQW5ub3RhdGlvbiA9IChYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUVudW1Db25zdGFudC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1WYWx1ZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dEVudW1Db25zdGFudC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFNwZWNpZmllZFZhbHVlKCkpOwotCQkKLQkJY29udGV4dEVudW1Db25zdGFudC5zZXRTcGVjaWZpZWRWYWx1ZShudWxsKTsKLQkJZW51bVZhbHVlQW5ub3RhdGlvbiA9IChYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUVudW1Db25zdGFudC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQlhc3NlcnROdWxsKGVudW1WYWx1ZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0RW51bUNvbnN0YW50LmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxFbnVtKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUpheGJFbnVtQ29uc3RhbnQgY29udGV4dEVudW1Db25zdGFudCA9IENvbGxlY3Rpb25Ub29scy5nZXQoZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50cygpLCAxKTsKLQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IHJlc291cmNlRW51bUNvbnN0YW50ID0gY29udGV4dEVudW1Db25zdGFudC5nZXRSZXNvdXJjZUVudW1Db25zdGFudCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRFbnVtQ29uc3RhbnQuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCQotCQkvL2FkZCBhbiBYbWxFbnVtVmFsdWUgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VFbnVtQ29uc3RhbnQpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIGVudW1WYWx1ZUFubm90YXRpb24gPSBHZW5lcmljSmF2YUVudW1Db25zdGFudFRlc3RzLnRoaXMuYWRkTm9ybWFsQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQkJCQlHZW5lcmljSmF2YUVudW1Db25zdGFudFRlc3RzLnRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGVudW1WYWx1ZUFubm90YXRpb24sIEpBWEIuWE1MX0VOVU1fVkFMVUVfX1ZBTFVFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCi0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dEVudW1Db25zdGFudC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0RW51bUNvbnN0YW50LmdldFNwZWNpZmllZFZhbHVlKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTU9OREFZIiwgY29udGV4dEVudW1Db25zdGFudC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0RW51bUNvbnN0YW50LmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjM5Y2E0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uRW51bURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVudW1NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cwotCQlleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbFR5cGVUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVudW1UeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbnVtQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbFR5cGVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9UWVBFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRYbWxFbnVtQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRU5VTSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYVR5cGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGpheGJFbnVtLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJU3RyaW5nIGRlZmF1bHRYbWxUeXBlTmFtZSA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnVtTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQl4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhkZWZhdWx0WG1sVHlwZU5hbWUsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRW51bS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQkKLQkJLy9zZXQgbmFtZSBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sVHlwZSBhbm5vdGF0aW9uCi0JCWVudW1NYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2hlbWFUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJFbnVtIGpheGJFbnVtID0gKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJFbnVtTWFwcGluZyBlbnVtTWFwcGluZyA9IGpheGJFbnVtLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBqYXhiRW51bS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCVN0cmluZyBkZWZhdWx0WG1sVHlwZU5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKFRZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRYbWxUeXBlTmFtZSwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRYbWxUeXBlTmFtZSwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlRW51bSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfVFlQRSk7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfVFlQRV9fTkFNRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmdldFhtbFR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sVHlwZUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdFhtbFR5cGVOYW1lLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJFbnVtIGpheGJFbnVtID0gKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJFbnVtTWFwcGluZyBlbnVtTWFwcGluZyA9IGpheGJFbnVtLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBqYXhiRW51bS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWVudW1NYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWVudW1NYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQl4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVudW1NYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJcmVzb3VyY2VFbnVtLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCQotCQkvL3NldCBuYW1lc3BhY2UgYWdhaW4sIHRoaXMgdGltZSBzdGFydGluZyB3aXRoIG5vIFhtbFR5cGUgYW5ub3RhdGlvbgotCQllbnVtTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gamF4YkVudW0uZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VFbnVtKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9UWVBFKTsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxUeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9UWVBFX19OQU1FU1BBQ0UsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW51bU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxUeXBlQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBlbnVtTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFJvb3RFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGpheGJFbnVtLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKSk7Ci0JCQotCQllbnVtTWFwcGluZy5hZGRYbWxSb290RWxlbWVudCgpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiB4bWxSb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudW1NYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJZW51bU1hcHBpbmcucmVtb3ZlWG1sUm9vdEVsZW1lbnQoKTsKLQkJeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbCh4bWxSb290RWxlbWVudEFubm90YXRpb24pOwotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxSb290RWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFbnVtV2l0aFhtbFR5cGUoKTsKLQkJCi0JCUpheGJFbnVtIGpheGJFbnVtID0gKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJFbnVtTWFwcGluZyBlbnVtTWFwcGluZyA9IGpheGJFbnVtLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBqYXhiRW51bS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkpOwotCQkKLQkJLy9hZGQgYSBYbWxSb290RWxlbWVudCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUVudW0pOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGROb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIEpBWEIuWE1MX1JPT1RfRUxFTUVOVF9fTkFNRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnVtTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBYbWxSb290RWxlbWVudCBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxFbnVtVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gamF4YkVudW0uZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhKYXhiRW51bU1hcHBpbmcuREVGQVVMVF9YTUxfRU5VTV9WQUxVRSwgZW51bU1hcHBpbmcuZ2V0WG1sRW51bVZhbHVlKCkpOwotCQkKLQkJZW51bU1hcHBpbmcuc2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKCJJbnRlZ2VyIik7Ci0JCVhtbEVudW1Bbm5vdGF0aW9uIHhtbEVudW1Bbm5vdGF0aW9uID0gKFhtbEVudW1Bbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgeG1sRW51bUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIGVudW1NYXBwaW5nLmdldFNwZWNpZmllZFhtbEVudW1WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgZW51bU1hcHBpbmcuZ2V0WG1sRW51bVZhbHVlKCkpOwotCQkKLQkJZW51bU1hcHBpbmcuc2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKG51bGwpOwotCQl4bWxFbnVtQW5ub3RhdGlvbiA9IChYbWxFbnVtQW5ub3RhdGlvbikgcmVzb3VyY2VFbnVtLmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTSk7Ci0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSmF4YkVudW1NYXBwaW5nLkRFRkFVTFRfWE1MX0VOVU1fVkFMVUUsIGVudW1NYXBwaW5nLmdldFhtbEVudW1WYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlRW51bS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlyZXNvdXJjZUVudW0ucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNKTsKLQkJZW51bU1hcHBpbmcgPSAoKEpheGJFbnVtKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCkpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChlbnVtTWFwcGluZy5nZXRTcGVjaWZpZWRYbWxFbnVtVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhKYXhiRW51bU1hcHBpbmcuREVGQVVMVF9YTUxfRU5VTV9WQUxVRSwgZW51bU1hcHBpbmcuZ2V0WG1sRW51bVZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sRW51bVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVudW1XaXRoWG1sVHlwZSgpOwotCQkKLQkJSmF4YkVudW0gamF4YkVudW0gPSAoSmF4YkVudW0pIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkVudW1NYXBwaW5nIGVudW1NYXBwaW5nID0gamF4YkVudW0uZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IGpheGJFbnVtLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoZW51bU1hcHBpbmcuZ2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSmF4YkVudW1NYXBwaW5nLkRFRkFVTFRfWE1MX0VOVU1fVkFMVUUsIGVudW1NYXBwaW5nLmdldFhtbEVudW1WYWx1ZSgpKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUVudW0pOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTlVNKTsKLQkJCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVudW1UeXBlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTlVNX19WQUxVRSwgIlN0cmluZyIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgZW51bU1hcHBpbmcuZ2V0U3BlY2lmaWVkWG1sRW51bVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGVudW1NYXBwaW5nLmdldFhtbEVudW1WYWx1ZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBmYWN0b3J5Q2xhc3MgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbnVtQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbnVtQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVudW1Bbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGVudW1NYXBwaW5nLmdldFNwZWNpZmllZFhtbEVudW1WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEpheGJFbnVtTWFwcGluZy5ERUZBVUxUX1hNTF9FTlVNX1ZBTFVFLCBlbnVtTWFwcGluZy5nZXRYbWxFbnVtVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVudW1Db25zdGFudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlRW51bVdpdGhYbWxUeXBlKCk7Ci0JCQotCQlKYXhiRW51bSBqYXhiRW51bSA9IChKYXhiRW51bSkgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiRW51bU1hcHBpbmcgZW51bU1hcHBpbmcgPSBqYXhiRW51bS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gamF4YkVudW0uZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHNTaXplKCkpOwotCQlJdGVyYXRvcjxKYXhiRW51bUNvbnN0YW50PiBlbnVtQ29uc3RhbnRzID0gZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50cygpLml0ZXJhdG9yKCk7Ci0JCUpheGJFbnVtQ29uc3RhbnQgZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiU1VOREFZIiwgZW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JCWVudW1Db25zdGFudCA9IGVudW1Db25zdGFudHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1PTkRBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbnVtQ29uc3RhbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUVudW0pOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGRFbnVtQ29uc3RhbnQoKEVudW1EZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgIlRVRVNEQVkiKTsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5hZGRFbnVtQ29uc3RhbnQoKEVudW1EZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgIldFRE5FU0RBWSIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHNTaXplKCkpOwotCQllbnVtQ29uc3RhbnRzID0gZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50cygpLml0ZXJhdG9yKCk7Ci0JCWVudW1Db25zdGFudCA9IGVudW1Db25zdGFudHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIlNVTkRBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQllbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBlbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQkJZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiVFVFU0RBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQllbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXRURORVNEQVkiLCBlbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW51bUNvbnN0YW50cy5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlRW51bUNvbnN0YW50KChFbnVtRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksICJTVU5EQVkiKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzU2l6ZSgpKTsKLQkJZW51bUNvbnN0YW50cyA9IGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHMoKS5pdGVyYXRvcigpOwotCQllbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNT05EQVkiLCBlbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQkJZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiVFVFU0RBWSIsIGVudW1Db25zdGFudC5nZXROYW1lKCkpOwotCQllbnVtQ29uc3RhbnQgPSBlbnVtQ29uc3RhbnRzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJXRURORVNEQVkiLCBlbnVtQ29uc3RhbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZW51bUNvbnN0YW50cy5oYXNOZXh0KCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUVudW1Db25zdGFudCgoRW51bURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiVFVFU0RBWSIpOwotCQkJCUdlbmVyaWNKYXZhRW51bU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUVudW1Db25zdGFudCgoRW51bURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiTU9OREFZIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMSwgZW51bU1hcHBpbmcuZ2V0RW51bUNvbnN0YW50c1NpemUoKSk7Ci0JCWVudW1Db25zdGFudHMgPSBlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzKCkuaXRlcmF0b3IoKTsKLQkJZW51bUNvbnN0YW50ID0gZW51bUNvbnN0YW50cy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiV0VETkVTREFZIiwgZW51bUNvbnN0YW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVudW1Db25zdGFudHMuaGFzTmV4dCgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YUVudW1NYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVFbnVtQ29uc3RhbnQoKEVudW1EZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgIldFRE5FU0RBWSIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudW1NYXBwaW5nLmdldEVudW1Db25zdGFudHNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShlbnVtTWFwcGluZy5nZXRFbnVtQ29uc3RhbnRzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwMTI1Yy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBY2Nlc3NPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sSmF2YVR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sQWNjZXNzb3JUeXBlKHZhbHVlID0gWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkiLAotCQkJCUpBWEIuWE1MX0FDQ0VTU19UWVBFLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yT3JkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxBY2Nlc3Nvck9yZGVyKHZhbHVlID0gWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMKSIsCi0JCQkJSkFYQi5YTUxfQUNDRVNTX09SREVSLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3NUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgY29udGV4dFBhY2thZ2VJbmZvLmdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY29udGV4dFBhY2thZ2VJbmZvLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCQkKLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gYWNjZXNzb3JUeXBlQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlLkZJRUxELCBhY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5GSUVMRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc1R5cGUoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLnNldFNwZWNpZmllZEFjY2Vzc1R5cGUoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzVHlwZS5OT05FLCBhY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5OT05FLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzVHlwZSgpKTsKLQkJCi0JCWNvbnRleHRQYWNrYWdlSW5mby5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKG51bGwpOwotCQlhY2Nlc3NvclR5cGVBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCQlhc3NlcnROdWxsKGFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFBhY2thZ2VJbmZvLmdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBVQkxJQ19NRU1CRVIsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0RGVmYXVsdEFjY2Vzc1R5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3NUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgY29udGV4dFBhY2thZ2VJbmZvLmdldFNwZWNpZmllZEFjY2Vzc1R5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLlBST1BFUlRZLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY29udGV4dFBhY2thZ2VJbmZvLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCQkKLQkJLy9zZXQgdGhlIGFjY2Vzc2VyIHR5cGUgdmFsdWUgdG8gRklFTEQKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19GSUVMRCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5GSUVMRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc1R5cGUoKSk7Ci0KLQkJLy9zZXQgdGhlIGFjY2Vzc2VyIHR5cGUgdmFsdWUgdG8gUFVCTElDX01FTUJFUgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5zZXRFbnVtTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRV9fUFVCTElDX01FTUJFUik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzVHlwZSgpKTsKLQotCQkvL3NldCB0aGUgYWNjZXNzZXIgdHlwZSB2YWx1ZSB0byBOT05FCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUsIEpBWEIuWE1MX0FDQ0VTU19UWVBFX19OT05FKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLk5PTkUsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NUeXBlKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMucmVtb3ZlWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNvbnRleHRQYWNrYWdlSW5mby5nZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgY29udGV4dFBhY2thZ2VJbmZvLmdldERlZmF1bHRBY2Nlc3NUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5BTFBIQUJFVElDQUwsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldERlZmF1bHRBY2Nlc3NPcmRlcigpKTsKLQkJCi0JCWNvbnRleHRQYWNrYWdlSW5mby5zZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQpOwotCQlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiBhY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgYWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NPcmRlcigpKTsKLQkJCi0JCWNvbnRleHRQYWNrYWdlSW5mby5zZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcihudWxsKTsKLQkJYWNjZXNzb3JPcmRlckFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJYXNzZXJ0TnVsbChhY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0UGFja2FnZUluZm8uZ2V0U3BlY2lmaWVkQWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldERlZmF1bHRBY2Nlc3NPcmRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2Vzc09yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yT3JkZXIoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCwgY29udGV4dFBhY2thZ2VJbmZvLmdldFNwZWNpZmllZEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0QWNjZXNzT3JkZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNvbnRleHRQYWNrYWdlSW5mby5nZXREZWZhdWx0QWNjZXNzT3JkZXIoKSk7Ci0JCQotCQkvL3NldCB0aGUgYWNjZXNzIG9yZGVyIHZhbHVlIHRvIFVOREVGSU5FRAotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuc2V0RW51bU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIsIEpBWEIuWE1MX0FDQ0VTU19PUkRFUl9fVU5ERUZJTkVEKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NPcmRlci5VTkRFRklORUQsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRBY2Nlc3NPcmRlcigpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5yZW1vdmVYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNvbnRleHRQYWNrYWdlSW5mby5nZXRTcGVjaWZpZWRBY2Nlc3NPcmRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgY29udGV4dFBhY2thZ2VJbmZvLmdldEFjY2Vzc09yZGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVELCBjb250ZXh0UGFja2FnZUluZm8uZ2V0RGVmYXVsdEFjY2Vzc09yZGVyKCkpOwotCX0KLQotCS8vYWRkIGFub3RoZXIgcGFja2FnZSBhbm5vdGF0aW9uIHNvIHRoYXQgdGhlIGNvbnRleHQgbW9kZWwgb2JqZWN0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQgd2hlbiAKLQkvL3JlbW92aW5nIHRoZSBYbWxBY2Nlc3NvclR5cGUgYW5ub3RhdGlvbi4gT25seSAiYW5ub3RhdGVkIiBwYWNrYWdlcyBhcmUgYWRkZWQgdG8gdGhlIGNvbnRleHQgbW9kZWwKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1NDSEVNQSk7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7CQkKLQl9Ci0KLQkvL2FkZCBhbm90aGVyIHBhY2thZ2UgYW5ub3RhdGlvbiBzbyB0aGF0IHRoZSBjb250ZXh0IG1vZGVsIG9iamVjdCBkb2Vzbid0IGdldCByZW1vdmVkIHdoZW4gCi0JLy9yZW1vdmluZyB0aGUgWG1sQWNjZXNzb3JPcmRlciBhbm5vdGF0aW9uLiBPbmx5ICJhbm5vdGF0ZWQiIHBhY2thZ2VzIGFyZSBhZGRlZCB0byB0aGUgY29udGV4dCBtb2RlbAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJdGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX1NDSEVNQSk7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwkJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbFNjaGVtYVR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCUxpc3RJdGVyYWJsZTxYbWxTY2hlbWFUeXBlPiB4bWxTY2hlbWFUeXBlcyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMiBYbWxTY2hlbWFUeXBlcwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMCwgImJhciIpOwotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDEsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sU2NoZW1hVHlwZXMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFNjaGVtYVR5cGU+IHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbFNjaGVtYVR5cGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFycmF5RWxlbWVudCA9IHRoaXMubmV3WG1sU2NoZW1hVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCksIG5hbWUpOwotCQl0aGlzLmFkZEFycmF5RWxlbWVudChkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEVTLCBpbmRleCwgSkFYQi5YTUxfU0NIRU1BX1RZUEVTX19WQUxVRSwgYXJyYXlFbGVtZW50KTsJCQotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld1htbFNjaGVtYVR5cGVBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEVfX05BTUUsIG5hbWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sU2NoZW1hVHlwZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JPcmRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydEVxdWFscygwLCBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXNTaXplKCkpOwotCi0JCS8vYWRkIDIgWG1sU2NoZW1hVHlwZXMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAxLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMiwgY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sU2NoZW1hVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvL2NyZWF0ZSBhIHBhY2thZ2UgaW5mbyB3aXRoIGFuIGFubm90YXRpb24gb3RoZXIgdGhhbiBYbWxTY2hlbWEgdG8gdGVzdAotCQkvL2FkZGluZyB0aGluZ3MgdG8gdGhlIG51bGwgc2NoZW1hIGFubm90YXRpb24KLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkJCi0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmFyIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmF6Iik7Ci0KLQkJSXRlcmF0b3I8WG1sU2NoZW1hVHlwZUFubm90YXRpb24+IHhtbFNjaGVtYVR5cGVzID0gdGhpcy5nZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5oYXNOZXh0KCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbj4gZ2V0U2NoZW1hVHlwZUFubm90YXRpb25zKEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uPihyZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbnMoSkFYQi5YTUxfU0NIRU1BX1RZUEUpKS5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRYbWxTY2hlbWFUeXBlMigpIHRocm93cyBFeGNlcHRpb24gewotCQkvL2NyZWF0ZSBhIHBhY2thZ2UgaW5mbyB3aXRoIGFuIGFubm90YXRpb24gb3RoZXIgdGhhbiBYbWxTY2hlbWEgdG8gdGVzdAotCQkvL2FkZGluZyB0aGluZ3MgdG8gdGhlIG51bGwgc2NoZW1hIGFubm90YXRpb24KLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sU2NoZW1hVHlwZSgwKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJhciIpOwotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sU2NoZW1hVHlwZSgxKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sU2NoZW1hVHlwZSgwKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJheiIpOwotCi0JCUl0ZXJhdG9yPFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uPiB4bWxTY2hlbWFUeXBlcyA9IHRoaXMuZ2V0U2NoZW1hVHlwZUFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlWG1sU2NoZW1hVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmFyIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDEpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDIpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmF6Iik7Ci0KLQkJSXRlcmF0b3I8WG1sU2NoZW1hVHlwZUFubm90YXRpb24+IHhtbFNjaGVtYVR5cGVzID0gdGhpcy5nZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLnJlbW92ZVhtbFNjaGVtYVR5cGUoMSk7Ci0KLQkJeG1sU2NoZW1hVHlwZXMgPSB0aGlzLmdldFNjaGVtYVR5cGVBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLnJlbW92ZVhtbFNjaGVtYVR5cGUoMSk7Ci0JCXhtbFNjaGVtYVR5cGVzID0gdGhpcy5nZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ucmVtb3ZlWG1sU2NoZW1hVHlwZSgwKTsKLQkJeG1sU2NoZW1hVHlwZXMgPSB0aGlzLmdldFNjaGVtYVR5cGVBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlWG1sU2NoZW1hVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmFyIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDEpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxTY2hlbWFUeXBlKDIpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmF6Iik7Ci0KLQkJSXRlcmF0b3I8WG1sU2NoZW1hVHlwZUFubm90YXRpb24+IHhtbFNjaGVtYVR5cGVzID0gdGhpcy5nZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLm1vdmVYbWxTY2hlbWFUeXBlKDIsIDApOwotCQl4bWxTY2hlbWFUeXBlcyA9IHRoaXMuZ2V0U2NoZW1hVHlwZUFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ubW92ZVhtbFNjaGVtYVR5cGUoMCwgMSk7Ci0JCXhtbFNjaGVtYVR5cGVzID0gdGhpcy5nZXRTY2hlbWFUeXBlQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jWG1sU2NoZW1hVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlMaXN0SXRlcmFibGU8WG1sU2NoZW1hVHlwZT4geG1sU2NoZW1hVHlwZXMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCS8vYWRkIDMgWG1sU2NoZW1hVHlwZXMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAxLCAiZm9vIik7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMiwgImJheiIpOwotCQkJfQotCQl9KTsKLQotCQl4bWxTY2hlbWFUeXBlcyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpOwotCQlMaXN0SXRlcmF0b3I8WG1sU2NoZW1hVHlwZT4geG1sU2NoZW1hVHlwZXNJdGVyYXRvciA9IHhtbFNjaGVtYVR5cGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5tb3ZlWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMiwgMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMubW92ZVhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDAsIDEpOwotCQkJfQotCQl9KTsKLQotCQl4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yID0geG1sU2NoZW1hVHlwZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnJlbW92ZVhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDEpOwotCQkJfQotCQl9KTsKLQotCQl4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yID0geG1sU2NoZW1hVHlwZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMucmVtb3ZlWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLnJlbW92ZVhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDApOwotCQkJfQotCQl9KTsKLQotCQl4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yID0geG1sU2NoZW1hVHlwZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jQWRkWG1sU2NoZW1hVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlMaXN0SXRlcmFibGU8WG1sU2NoZW1hVHlwZT4geG1sU2NoZW1hVHlwZXMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCi0JCS8vYWRkIDEgWG1sU2NoZW1hVHlwZSB3aGVuIG5vbmUgZXhpc3QKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZUluZm9UZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGUoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sU2NoZW1hVHlwZXMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbFNjaGVtYVR5cGU+IHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCS8vYWRkIDEgWG1sU2NoZW1hVHlwZSB3aGVuIDEgc3RhbmRhbG9uZSBleGlzdHMKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZShkZWNsYXJhdGlvbiwgMSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQotCQl4bWxTY2hlbWFUeXBlcyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpOwotCQl4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yID0geG1sU2NoZW1hVHlwZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCS8vYWRkIDEgWG1sU2NoZW1hVHlwZSB3aGVuIGEgY29udGFpbmVyIGFubm90YXRpb25zIGV4aXN0cwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAyLCAiYmF6Iik7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCk7Ci0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCS8vYWRkIDEgWG1sU2NoZW1hVHlwZSB0byBiZWdpbm5pbmcgb2YgbGlzdCB3aGVuIGEgY29udGFpbmVyIGFubm90YXRpb25zIGV4aXN0cwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlKGRlY2xhcmF0aW9uLCAwLCAiZm9vYmF6Iik7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbFNjaGVtYVR5cGVzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCk7Ci0JCXhtbFNjaGVtYVR5cGVzSXRlcmF0b3IgPSB4bWxTY2hlbWFUeXBlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29iYXoiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sU2NoZW1hVHlwZXNJdGVyYXRvci5uZXh0KCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IubmV4dCgpLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxTY2hlbWFUeXBlc0l0ZXJhdG9yLm5leHQoKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbFNjaGVtYVR5cGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlWG1sU2NoZW1hVHlwZShNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9TQ0hFTUFfVFlQRVMpLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRVNfX1ZBTFVFLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbFNjaGVtYVR5cGUoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfU0NIRU1BX1RZUEVTKSwgSkFYQi5YTUxfU0NIRU1BX1RZUEVTX19WQUxVRSwgaW5kZXgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sSmF2YVR5cGVBZGFwdGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yT3JkZXIoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlMaXN0SXRlcmFibGU8WG1sSmF2YVR5cGVBZGFwdGVyPiB4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMiBYbWxKYXZhVHlwZUFkYXB0ZXJzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDAsICJTdHJpbmciKTsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDEsICJJbnRlZ2VyIik7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbEphdmFUeXBlQWRhcHRlcnMgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpOwotCQlMaXN0SXRlcmF0b3I8WG1sSmF2YVR5cGVBZGFwdGVyPiB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IgPSB4bWxKYXZhVHlwZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEphdmFUeXBlQWRhcHRlcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYXJyYXlFbGVtZW50ID0gdGhpcy5uZXdYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpLCBuYW1lKTsKLQkJdGhpcy5hZGRBcnJheUVsZW1lbnQoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSUywgaW5kZXgsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSU19fVkFMVUUsIGFycmF5RWxlbWVudCk7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9ybWFsQW5ub3RhdGlvbiBuZXdYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKEFTVCBhc3QsIFN0cmluZyB2YWx1ZVR5cGVOYW1lKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQlhbm5vdGF0aW9uLAotCQkJSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1ZBTFVFLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoYXN0LCB2YWx1ZVR5cGVOYW1lKSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxKYXZhVHlwZUFkYXB0ZXJzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yT3JkZXIoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnNTaXplKCkpOwotCi0JCS8vYWRkIDIgWG1sSmF2YVR5cGVBZGFwdGVycwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKGRlY2xhcmF0aW9uLCAwLCAiU3RyaW5nIik7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKGRlY2xhcmF0aW9uLCAxLCAiSW50ZWdlciIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vY3JlYXRlIGEgcGFja2FnZSBpbmZvIHdpdGggYW4gYW5ub3RhdGlvbiBvdGhlciB0aGFuIFhtbFNjaGVtYSB0byB0ZXN0Ci0JCS8vYWRkaW5nIHRoaW5ncyB0byB0aGUgbnVsbCBzY2hlbWEgYW5ub3RhdGlvbgotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMCkuc2V0VmFsdWUoImJhciIpOwotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDApLnNldFZhbHVlKCJmb28iKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigwKS5zZXRWYWx1ZSgiYmF6Iik7Ci0KLQkJSXRlcmF0b3I8WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbj4geG1sSmF2YVR5cGVBZGFwdGVycyA9IHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzLmhhc05leHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKEphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+KHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9ucyhKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUikpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFhtbEphdmFUeXBlQWRhcHRlcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9jcmVhdGUgYSBwYWNrYWdlIGluZm8gd2l0aCBhbiBhbm5vdGF0aW9uIG90aGVyIHRoYW4gWG1sU2NoZW1hIHRvIHRlc3QKLQkJLy9hZGRpbmcgdGhpbmdzIHRvIHRoZSBudWxsIHNjaGVtYSBhbm5vdGF0aW9uCi0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigwKS5zZXRWYWx1ZSgiYmFyIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMSkuc2V0VmFsdWUoImZvbyIpOwotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDApLnNldFZhbHVlKCJiYXoiKTsKLQotCQlJdGVyYXRvcjxYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uPiB4bWxKYXZhVHlwZUFkYXB0ZXJzID0gdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigwKS5zZXRWYWx1ZSgiU3RyaW5nIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMSkuc2V0VmFsdWUoImZvbyIpOwotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDIpLnNldFZhbHVlKCJiYXoiKTsKLQotCQlJdGVyYXRvcjxYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uPiB4bWxKYXZhVHlwZUFkYXB0ZXJzID0gdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFkYXB0ZXJBbm5vdGF0aW9uID0geG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgYWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgYWRhcHRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwkJCi0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKDEpOwotCi0JCXhtbEphdmFUeXBlQWRhcHRlcnMgPSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFkYXB0ZXJBbm5vdGF0aW9uID0geG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgYWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgYWRhcHRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigxKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbnMocmVzb3VyY2VQYWNrYWdlKTsKLQkJYWRhcHRlckFubm90YXRpb24gPSB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwkJCi0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8ucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKDApOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQljb250ZXh0UGFja2FnZUluZm8uYWRkWG1sSmF2YVR5cGVBZGFwdGVyKDApLnNldFZhbHVlKCJiYXIiKTsKLQkJY29udGV4dFBhY2thZ2VJbmZvLmFkZFhtbEphdmFUeXBlQWRhcHRlcigxKS5zZXRWYWx1ZSgiZm9vIik7Ci0JCWNvbnRleHRQYWNrYWdlSW5mby5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoMikuc2V0VmFsdWUoImJheiIpOwotCi0JCUl0ZXJhdG9yPFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24+IHhtbEphdmFUeXBlQWRhcHRlcnMgPSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxKYXZhVHlwZUFkYXB0ZXJzLm5leHQoKS5nZXRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxKYXZhVHlwZUFkYXB0ZXJzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFBhY2thZ2VJbmZvLm1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoMiwgMCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlcnMgPSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb25zKHJlc291cmNlUGFja2FnZSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVycy5uZXh0KCkuZ2V0VmFsdWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVycy5oYXNOZXh0KCkpOwotCi0JCWNvbnRleHRQYWNrYWdlSW5mby5tb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKDAsIDEpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gdGhpcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9ucyhyZXNvdXJjZVBhY2thZ2UpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbEphdmFUeXBlQWRhcHRlcnMubmV4dCgpLmdldFZhbHVlKCkpOwkJCi0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3luY1htbEphdmFUeXBlQWRhcHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlMaXN0SXRlcmFibGU8WG1sSmF2YVR5cGVBZGFwdGVyPiB4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMyBYbWxKYXZhVHlwZUFkYXB0ZXJzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDEsICJmb28iKTsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDIsICJiYXoiKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxKYXZhVHlwZUFkYXB0ZXI+IHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvciA9IHhtbEphdmFUeXBlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5tb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKGRlY2xhcmF0aW9uLCAyLCAwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvciA9IHhtbEphdmFUeXBlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5tb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKGRlY2xhcmF0aW9uLCAwLCAxKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvciA9IHhtbEphdmFUeXBlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxKYXZhVHlwZUFkYXB0ZXJzSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDEpOwotCQkJfQotCQl9KTsKLQotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yID0geG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VJbmZvVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoZGVjbGFyYXRpb24sIDEpOwotCQkJfQotCQl9KTsKLQotCQl4bWxKYXZhVHlwZUFkYXB0ZXJzID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yID0geG1sSmF2YVR5cGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5uZXh0KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLnRoaXMucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKGRlY2xhcmF0aW9uLCAwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sSmF2YVR5cGVBZGFwdGVycyA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlcnNJdGVyYXRvciA9IHhtbEphdmFUeXBlQWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sSmF2YVR5cGVBZGFwdGVyc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSUyksIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSU19fVkFMVUUsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSUyksIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSU19fVkFMVUUsIGluZGV4KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNDUxMTYuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBhY2thZ2VYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGFja2FnZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEphdmFUeXBlQWRhcHRlciIsCi0JCQkJSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5zZXRWYWx1ZSgiZm9vIik7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIHNjaGVtYSB0eXBlIGFubm90YXRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgdmFsdWUgaXMgc2V0IHRvIG51bGwKLQkJY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5zZXRWYWx1ZShudWxsKTsKLQkJamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vYWRkIGEgdmFsdWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUGFja2FnZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1ZBTFVFLCAiU3RyaW5nIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxKYXZhVHlwZUFkYXB0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sSmF2YVR5cGVBZGFwdGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFNwZWNpZmllZFR5cGUoImZvbyIpOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFR5cGUoKSk7Ci0KLQkJIC8vdmVyaWZ5IHRoZSB4bWwgc2NoZW1hIHR5cGUgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSB0eXBlIGlzIHNldCB0byBudWxsCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0KLQkJLy9hZGQgYSB0eXBlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlclR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSX19UWVBFLCAiU3RyaW5nIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVBhY2thZ2VYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbEphdmFUeXBlQWRhcHRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKAotCQkJKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEphdmFUeXBlQWRhcHRlck1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLy9hZGQgYW5vdGhlciBwYWNrYWdlIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBvYmplY3QgZG9lc24ndCBnZXQgcmVtb3ZlZCB3aGVuIAotCS8vcmVtb3ZpbmcgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uLiBPbmx5ICJhbm5vdGF0ZWQiIHBhY2thZ2VzIGFyZSBhZGRlZCB0byB0aGUgY29udGV4dCBtb2RlbAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsJCQotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmY0YjAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEVTVF9DTEFTU19OQU1FID0gIlRlc3RDbGFzcyI7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sVHlwZVdpdGhWYXJpb3VzQXR0cmlidXRlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSkFYQi5YTUxfVFlQRSkuYXBwZW5kKCI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRFU1RfQ0xBU1NfTkFNRSkuYXBwZW5kKCI8VCBleHRlbmRzIE51bWJlcj4gIikuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgU3RyaW5nIHN0cmluZzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmdbXSBzdHJpbmdBcnJheTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmdbXVtdIHN0cmluZ0RvdWJsZUFycmF5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFQgZ2VuZXJpYzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFQ+IGdlbmVyaWNMaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIFRbXSBnZW5lcmljQXJyYXk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgTGlzdDw/PiB3aWxkY2FyZExpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgYnl0ZVtdIGJ5dGVBcnJheTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0IGxpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRFU1RfQ0xBU1NfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUmVzb3VyY2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVhtbFR5cGVXaXRoVmFyaW91c0F0dHJpYnV0ZXMoKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSAoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKFBBQ0tBR0VfTkFNRV8gKyBURVNUX0NMQVNTX05BTUUpKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBTdHJpbmcgc3RyaW5nCi0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIGF0dCA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIGF0dC5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdAotCQlhdHQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDEpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBhdHQuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBTdHJpbmdbXSBzdHJpbmdBcnJheQotCQlhdHQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBhdHQuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBTdHJpbmdbXVtdIHN0cmluZ0RvdWJsZUFycmF5Ci0JCWF0dCA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMyk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZ1tdW10iLCBhdHQuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlQmFzZVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dC5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkpOwotCQkKLQkJLy8gVCBnZW5lcmljCi0JCWF0dCA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgNCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bWJlciIsIGF0dC5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBMaXN0PFQ+IGdlbmVyaWNMaXN0Ci0JCWF0dCA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgNSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk51bWJlciIsIGF0dC5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHQuaXNKYXZhUmVzb3VyY2VBdHRyaWJ1dGVDb2xsZWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIFRbXSBnZW5lcmljQXJyYXkKLQkJYXR0ID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCA2KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuTnVtYmVyIiwgYXR0LmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dC5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkpOwotCQkKLQkJLy8gTGlzdDw/PiB3aWxkY2FyZExpc3QKLQkJYXR0ID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCA3KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYXR0LmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dC5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkpOwotCQkKLQkJLy8gYnl0ZVtdIGJ5dGVBcnJheQotCQlhdHQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDgpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGF0dC5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGVCYXNlVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0LmlzSmF2YVJlc291cmNlQXR0cmlidXRlQ29sbGVjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBMaXN0IGxpc3QKLQkJYXR0ID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCA5KTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgYXR0LmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZUJhc2VUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dC5pc0phdmFSZXNvdXJjZUF0dHJpYnV0ZUNvbGxlY3Rpb25UeXBlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDFiYTA5Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkJsb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Cb2R5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZXRob2REZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uU2luZ2xlVmFyaWFibGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkVsZW1lbnRGYWN0b3J5TWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cyBleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXB1YmxpYyBHZW5lcmljSmF2YVJlZ2lzdHJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNsYXNzV2l0aFhtbFJlZ2lzdHJ5QW5kQ3JlYXRlTWV0aG9kcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJPYmplY3RGYWN0b3J5LmphdmEiLCAiT2JqZWN0RmFjdG9yeSIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9SRUdJU1RSWSwgSkFYQi5YTUxfRUxFTUVOVF9ERUNMLCAiamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUmVnaXN0cnkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXROYW1lTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50RGVjbChuYW1lPVwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBKQVhCRWxlbWVudDxBbm5vdGF0aW9uVGVzdFR5cGU+IGNyZWF0ZUZvbyhBbm5vdGF0aW9uVGVzdFR5cGUgdmFsdWUpIHtyZXR1cm4gbnVsbH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFhtbEVsZW1lbnREZWNsKG5hbWU9XCJiYXJcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEpBWEJFbGVtZW50IGNyZWF0ZUJhcihPYmplY3QgdmFsdWUpIHtyZXR1cm4gbnVsbH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbGVtZW50RmFjdG9yeU1ldGhvZChUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uLCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlBU1QgYXN0ID0gdHlwZURlY2xhcmF0aW9uLmdldEFTVCgpOwotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IHRoaXMubmV3TWV0aG9kRGVjbGFyYXRpb24oYXN0LCBtZXRob2ROYW1lKTsKLQkJQmxvY2sgYm9keSA9IGFzdC5uZXdCbG9jaygpOwotCQltZXRob2REZWNsYXJhdGlvbi5zZXRCb2R5KGJvZHkpOwotCQltZXRob2REZWNsYXJhdGlvbi5zZXRSZXR1cm5UeXBlMihhc3QubmV3U2ltcGxlVHlwZShhc3QubmV3TmFtZSgiSkFYQkVsZW1lbnQiKSkpOwotCQlTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uIHBhcmFtZXRlciA9IGFzdC5uZXdTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uKCk7Ci0JCXBhcmFtZXRlci5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKCJ2YWx1ZSIpKTsKLQkJcGFyYW1ldGVyLnNldFR5cGUoYXN0Lm5ld1NpbXBsZVR5cGUoYXN0Lm5ld05hbWUoIk9iamVjdCIpKSk7Ci0JCXBhcmFtZXRlcnMobWV0aG9kRGVjbGFyYXRpb24pLmFkZChwYXJhbWV0ZXIpOwotCQlOb3JtYWxBbm5vdGF0aW9uIGVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsICJYbWxFbGVtZW50RGVjbCIpOwotCQltb2RpZmllcnMobWV0aG9kRGVjbGFyYXRpb24pLmFkZChlbGVtZW50RGVjbEFubm90YXRpb24pOwotCQl0aGlzLmJvZHlEZWNsYXJhdGlvbnModHlwZURlY2xhcmF0aW9uKS5hZGQobWV0aG9kRGVjbGFyYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBNZXRob2REZWNsYXJhdGlvbiBuZXdNZXRob2REZWNsYXJhdGlvbihBU1QgYXN0LCBTdHJpbmcgbWV0aG9kTmFtZSkgewotCQlNZXRob2REZWNsYXJhdGlvbiBtZXRob2REZWNsYXJhdGlvbiA9IGFzdC5uZXdNZXRob2REZWNsYXJhdGlvbigpOwotCQltZXRob2REZWNsYXJhdGlvbi5zZXROYW1lKGFzdC5uZXdTaW1wbGVOYW1lKG1ldGhvZE5hbWUpKTsKLQkJcmV0dXJuIG1ldGhvZERlY2xhcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIG1pbmltaXplIHRoZSBzY29wZSBvZiB0aGUgc3VwcHJlc3NlZCB3YXJuaW5ncwotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBMaXN0PEJvZHlEZWNsYXJhdGlvbj4gYm9keURlY2xhcmF0aW9ucyhUeXBlRGVjbGFyYXRpb24gdGQpIHsKLQkJcmV0dXJuIHRkLmJvZHlEZWNsYXJhdGlvbnMoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdDxTaW5nbGVWYXJpYWJsZURlY2xhcmF0aW9uPiBwYXJhbWV0ZXJzKE1ldGhvZERlY2xhcmF0aW9uIG1kKSB7Ci0JCXJldHVybiBtZC5wYXJhbWV0ZXJzKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8SUV4dGVuZGVkTW9kaWZpZXI+IG1vZGlmaWVycyhNZXRob2REZWNsYXJhdGlvbiBtZCkgewotCQlyZXR1cm4gbWQubW9kaWZpZXJzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWV0aG9kRGVjbGFyYXRpb24oVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbiwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKLQkJZm9yIChNZXRob2REZWNsYXJhdGlvbiBtZCA6IHR5cGVEZWNsYXJhdGlvbi5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChtZC5nZXROYW1lKCkuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7Ci0JCQkJdGhpcy5ib2R5RGVjbGFyYXRpb25zKHR5cGVEZWNsYXJhdGlvbikucmVtb3ZlKG1kKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFbGVtZW50RmFjdG9yeU1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQ2xhc3NXaXRoWG1sVHlwZSgpOwotCQljcmVhdGVDbGFzc1dpdGhYbWxSZWdpc3RyeUFuZENyZWF0ZU1ldGhvZHMoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoInRlc3QuT2JqZWN0RmFjdG9yeSIpOwotCQlYbWxSZWdpc3RyeSBjb250ZXh0UmVnaXN0cnkgPSBqYXhiQ2xhc3MuZ2V0WG1sUmVnaXN0cnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQlJdGVyYXRvcjxKYXhiRWxlbWVudEZhY3RvcnlNZXRob2Q+IGVsZW1lbnRGYWN0b3J5TWV0aG9kcyA9IGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHMoKS5pdGVyYXRvcigpOwotCQlKYXhiRWxlbWVudEZhY3RvcnlNZXRob2QgZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNyZWF0ZUZvbyIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3JlYXRlQmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5oYXNOZXh0KCkpOwotCi0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VUeXBlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLnRoaXMuYWRkRWxlbWVudEZhY3RvcnlNZXRob2QoKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgImNyZWF0ZUZvbzIiKTsKLQkJCQlHZW5lcmljSmF2YVJlZ2lzdHJ5VGVzdHMudGhpcy5hZGRFbGVtZW50RmFjdG9yeU1ldGhvZCgoVHlwZURlY2xhcmF0aW9uKSBkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCAiY3JlYXRlQmFyMiIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZHMgPSBjb250ZXh0UmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNyZWF0ZUZvbyIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3JlYXRlQmFyIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjcmVhdGVGb28yIiwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNyZWF0ZUJhcjIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50RmFjdG9yeU1ldGhvZHMuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cy50aGlzLnJlbW92ZU1ldGhvZERlY2xhcmF0aW9uKChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksICJjcmVhdGVGb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygzLCBjb250ZXh0UmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2RzID0gY29udGV4dFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjcmVhdGVCYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2QgPSBlbGVtZW50RmFjdG9yeU1ldGhvZHMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNyZWF0ZUZvbzIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWxlbWVudEZhY3RvcnlNZXRob2QuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQllbGVtZW50RmFjdG9yeU1ldGhvZCA9IGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY3JlYXRlQmFyMiIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRGYWN0b3J5TWV0aG9kcy5oYXNOZXh0KCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cy50aGlzLnJlbW92ZU1ldGhvZERlY2xhcmF0aW9uKChUeXBlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksICJjcmVhdGVGb28yIik7Ci0JCQkJR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLnRoaXMucmVtb3ZlTWV0aG9kRGVjbGFyYXRpb24oKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgImNyZWF0ZUJhcjIiKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb250ZXh0UmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzU2l6ZSgpKTsKLQkJZWxlbWVudEZhY3RvcnlNZXRob2RzID0gY29udGV4dFJlZ2lzdHJ5LmdldEVsZW1lbnRGYWN0b3J5TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCWVsZW1lbnRGYWN0b3J5TWV0aG9kID0gZWxlbWVudEZhY3RvcnlNZXRob2RzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjcmVhdGVCYXIiLCBlbGVtZW50RmFjdG9yeU1ldGhvZC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnRGYWN0b3J5TWV0aG9kLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudEZhY3RvcnlNZXRob2RzLmhhc05leHQoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFSZWdpc3RyeVRlc3RzLnRoaXMucmVtb3ZlTWV0aG9kRGVjbGFyYXRpb24oKFR5cGVEZWNsYXJhdGlvbikgZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgImNyZWF0ZUJhciIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnRleHRSZWdpc3RyeS5nZXRFbGVtZW50RmFjdG9yeU1ldGhvZHNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0UmVnaXN0cnkuZ2V0RWxlbWVudEZhY3RvcnlNZXRob2RzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRmNWY3ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxKYXZhVHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cyBleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIEdlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxKYXZhVHlwZUFkYXB0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGpheGJDbGFzcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFZhbHVlKCJmb28iKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJIC8vdmVyaWZ5IHRoZSB4bWwgc2NoZW1hIHR5cGUgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gbnVsbAotCQljb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLnNldFZhbHVlKG51bGwpOwotCQlqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlYbWxKYXZhVHlwZUFkYXB0ZXIgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlciA9IGpheGJDbGFzcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFZhbHVlKCkpOwotCi0JCS8vYWRkIGEgdmFsdWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMuYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJfX1ZBTFVFLCAiU3RyaW5nIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VmFsdWUoKSk7Ci0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMudGhpcy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoamF4YkNsYXNzLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCVhtbEphdmFUeXBlQWRhcHRlciBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyID0gamF4YkNsYXNzLmdldFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCi0JCWNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuc2V0U3BlY2lmaWVkVHlwZSgiZm9vIik7Ci0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0KLQkJY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQlqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChqYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXREZWZhdWx0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIgPSBqYXhiQ2xhc3MuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgY29udGV4dFhtbEphdmFUeXBlQWRhcHRlci5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0KLQkJLy9hZGQgYSB0eXBlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVR5cGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy50aGlzLmFkZFhtbEphdmFUeXBlQWRhcHRlclR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSX19UWVBFLCAiU3RyaW5nIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGNvbnRleHRYbWxKYXZhVHlwZUFkYXB0ZXIuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjb250ZXh0WG1sSmF2YVR5cGVBZGFwdGVyLmdldERlZmF1bHRUeXBlKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhVHlwZVhtbEphdmFUeXBlQWRhcHRlclRlc3RzLnRoaXMucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGpheGJDbGFzcy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sSmF2YVR5cGVBZGFwdGVyVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKAotCQkJKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEphdmFUeXBlQWRhcHRlck1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLy9hZGQgYW5vdGhlciBwYWNrYWdlIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBvYmplY3QgZG9lc24ndCBnZXQgcmVtb3ZlZCB3aGVuIAotCS8vcmVtb3ZpbmcgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uLiBPbmx5ICJhbm5vdGF0ZWQiIHBhY2thZ2VzIGFyZSBhZGRlZCB0byB0aGUgY29udGV4dCBtb2RlbAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsJCQotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQWRhcHRlclRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNzllMTAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEphdmFUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEFkYXB0ZXJUZXN0cwotCQlleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVYbWxUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKAotCQkJCW5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVPYmpPYmpYbWxBZGFwdGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIgKyBKQVhCLlhNTF9BREFQVEVSICsgIjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgT2JqT2JqQWRhcHRlciBleHRlbmRzIFhtbEFkYXB0ZXI8T2JqZWN0LCBPYmplY3Q+IHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBPYmplY3QgbWFyc2hhbChPYmplY3Qgb2JqKSB7IHJldHVybiBudWxsOyB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChPYmplY3Qgb2JqKSB7IHJldHVybiBudWxsOyB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJPYmpPYmpBZGFwdGVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFwQ2FsZW5kYXJYbWxBZGFwdGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIgKyBKQVhCLlhNTF9BREFQVEVSICsgIjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5NYXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIE1hcENhbGVuZGFyQWRhcHRlciBleHRlbmRzIFhtbEFkYXB0ZXI8R3JlZ29yaWFuQ2FsZW5kYXIsIE1hcDxTdHJpbmcsIFN0cmluZz4+IHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBHcmVnb3JpYW5DYWxlbmRhciBtYXJzaGFsKE1hcDxTdHJpbmcsIFN0cmluZz4gb2JqKSB7IHJldHVybiBudWxsOyB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgR3JlZ29yaWFuQ2FsZW5kYXIgbWFyc2hhbChPYmplY3Qgb2JqKSB7IHJldHVybiBudWxsOyB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiB1bm1hcnNoYWwoR3JlZ29yaWFuIENhbGVuZGFyIG9iaikgeyByZXR1cm4gbnVsbDsgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTWFwQ2FsZW5kYXJBZGFwdGVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Qm91bmRBbmRWYWx1ZVR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVhtbFR5cGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJWG1sSmF2YVR5cGVBZGFwdGVyIHhtbEphdmFUeXBlQWRhcHRlciA9IGF0dHJpYnV0ZU1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlci5zZXRWYWx1ZSgidGVzdC5PYmpPYmpBZGFwdGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRlc3QuT2JqT2JqQWRhcHRlciIsIHhtbEphdmFUeXBlQWRhcHRlci5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Lk9iak9iakFkYXB0ZXIiLCB4bWxKYXZhVHlwZUFkYXB0ZXIuZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXIuZ2V0WG1sQWRhcHRlcigpKTsKLQkJCi0JCWNyZWF0ZU9iak9ialhtbEFkYXB0ZXIoKTsKLQkJWG1sQWRhcHRlciB4bWxBZGFwdGVyID0geG1sSmF2YVR5cGVBZGFwdGVyLmdldFhtbEFkYXB0ZXIoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBZGFwdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgeG1sQWRhcHRlci5nZXRCb3VuZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLk9iamVjdCIsIHhtbEFkYXB0ZXIuZ2V0VmFsdWVUeXBlKCkpOwotCQkKLQkJY3JlYXRlTWFwQ2FsZW5kYXJYbWxBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlci5zZXRWYWx1ZSgidGVzdC5NYXBDYWxlbmRhckFkYXB0ZXIiKTsKLQkJeG1sQWRhcHRlciA9IHhtbEphdmFUeXBlQWRhcHRlci5nZXRYbWxBZGFwdGVyKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQWRhcHRlcik7Ci0JCWFzc2VydEVxdWFscygiamF2YS51dGlsLk1hcCIsIHhtbEFkYXB0ZXIuZ2V0Qm91bmRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciIsIHhtbEFkYXB0ZXIuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyZTcwMC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEFueUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxBbnlBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFueUF0dHJpYnV0ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWFwcGluZ1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfQVRUUklCVVRFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0FOWV9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCi0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfQVRUUklCVVRFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9BTllfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55QXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfQVRUUklCVVRFKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55QXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCi0KLQkJLy9hZGQgYW4gWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyZjk1ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBbnlFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbEVsZW1lbnRSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFueUVsZW1lbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZU1hcHBpbmdUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0FOWV9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCi0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQU5ZX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24geG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCi0JCWF0dHJpYnV0ZU1hcHBpbmcucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUxheCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkTGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0TGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNMYXgoKSk7Ci0KLQkJYXR0cmlidXRlTWFwcGluZy5zZXRTcGVjaWZpZWRMYXgoQm9vbGVhbi5UUlVFKTsKLQkJWG1sQW55RWxlbWVudEFubm90YXRpb24geG1sQW55RWxlbWVudEFubm90YXRpb24gPSAoWG1sQW55RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRMYXgoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkTGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0TGF4KCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlTWFwcGluZy5pc0xheCgpKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZExheChudWxsKTsKLQkJeG1sQW55RWxlbWVudEFubm90YXRpb24gPSAoWG1sQW55RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkTGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0TGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNMYXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUxheCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkTGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0TGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNMYXgoKSk7Ci0KLQotCQkvL2FkZCBhIG5pbGxhYmxlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEFueUVsZW1lbnRNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FOWV9FTEVNRU5UX19MQVgsIHRydWUpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYXR0cmlidXRlTWFwcGluZy5nZXRTcGVjaWZpZWRMYXgoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRMYXgoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVNYXBwaW5nLmlzTGF4KCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBsYXggbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxBbnlFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkTGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0TGF4KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU1hcHBpbmcuaXNMYXgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFZhbHVlKCJGb28iKTsKLQkJWG1sQW55RWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sQW55RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYXR0cmlidXRlTWFwcGluZy5nZXRWYWx1ZSgpKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFZhbHVlKG51bGwpOwotCQl4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxBbnlFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRTcGVjaWZpZWRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBbnlFbGVtZW50TWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEFueUVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCi0KLQkJLy9hZGQgYSBWYWx1ZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxBbnlFbGVtZW50VHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQU5ZX0VMRU1FTlRfX1ZBTFVFLCAiRm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0VmFsdWUoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIFZhbHVlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sQW55RWxlbWVudEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50QW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFZhbHVlKCkpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEFueUVsZW1lbnRNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sQW55RWxlbWVudEFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sQW55RWxlbWVudFR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWZzICoqKioqCi0JCi0JcHVibGljIHZvaWQgdGVzdFN5bmNYbWxFbGVtZW50UmVmcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEFueUVsZW1lbnRNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCUl0ZXJhYmxlPFhtbEVsZW1lbnRSZWY+IHhtbEVsZW1lbnRSZWZzID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoeG1sRWxlbWVudFJlZnMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCQotCQkvL2FkZCBYbWxFbGVtZW50UmVmIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfRUxFTUVOVF9SRUYpLAotCQkJCQkJCQlKQVhCLlhNTF9FTEVNRU5UX1JFRl9fTkFNRSwgImZvbyIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCXhtbEVsZW1lbnRSZWZzID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAwKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBhZGQgWG1sRWxlbWVudFJlZnMgYW5ub3RhdGlvbiB3aXRoIG5lc3RlZCBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJCQlkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkJCQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLm5ld05vcm1hbEFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0QXN0KCksIEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCQkJYW5ub3RhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZfX05BTUUsICJiYXIiKTsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZEFycmF5RWxlbWVudCgKLQkJCQkJCQkJZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfUkVGUywgMCwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTX19WQUxVRSwgYW5ub3RhdGlvbik7CQkKLQkJCQkJfQotCQkJCX0pOwotCQl4bWxFbGVtZW50UmVmcyA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMCkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkJCQotCQkvLyBhZGQgc2Vjb25kIG5lc3RlZCBYbWxFbGVtZW50UmVmIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5uZXdOb3JtYWxBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpLCBKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQkJCWFubm90YXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FLCAiYmF6Iik7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRBcnJheUVsZW1lbnQoCi0JCQkJCQkJCWRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMsIDEsIEpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUsIGFubm90YXRpb24pOwkJCi0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sRWxlbWVudFJlZnMgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpKSk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnMsIDApLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAxKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzd2l0Y2ggbmVzdGVkIFhtbEVsZW1lbnRSZWYgYW5ub3RhdGlvbnMKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLm1vdmVBcnJheUVsZW1lbnQoCi0JCQkJCQkJCShOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVF9SRUZTKSwgCi0JCQkJCQkJCUpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUsIDAsIDEpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCXhtbEVsZW1lbnRSZWZzID0gYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAwKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMSkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gcmVtb3ZlIFhtbEVsZW1lbnRSZWZzIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFycmF5RWxlbWVudCgKLQkJCQkJCQkJKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UX1JFRlMpLCAKLQkJCQkJCQkJSkFYQi5YTUxfRUxFTUVOVF9SRUZTX19WQUxVRSwgMSk7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBcnJheUVsZW1lbnQoCi0JCQkJCQkJCShOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVF9SRUZTKSwgCi0JCQkJCQkJCUpBWEIuWE1MX0VMRU1FTlRfUkVGU19fVkFMVUUsIDApOwotCQkJCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbigKLQkJCQkJCQkJZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sRWxlbWVudFJlZnMgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnMsIDApLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBYbWxFbGVtZW50UmVmIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oCi0JCQkJCQkJCWRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sRWxlbWVudFJlZnMgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEVsZW1lbnRSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24geG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmFkZFhtbEVsZW1lbnRSZWYoMCkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuYWRkWG1sRWxlbWVudFJlZigxKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImJhciIpOwotCQl4bWxFbGVtZW50UmVmc0Fubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzKCksIDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmc0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnMoKSwgMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5tb3ZlWG1sRWxlbWVudFJlZigwLCAxKTsKLQkJeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmcygpLCAwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzKCksIDEpLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkucmVtb3ZlWG1sRWxlbWVudFJlZigwKTsKLQkJeG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkKLQkJYXR0cmlidXRlTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLnJlbW92ZVhtbEVsZW1lbnRSZWYoMCk7Ci0JCXhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUykpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1peGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbE1peGVkQW5ub3RhdGlvbiB4bWxMaXN0QW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwoeG1sTGlzdEFubm90YXRpb24pOwotCi0JCWF0dHJpYnV0ZU1hcHBpbmcuYWRkWG1sTWl4ZWQoKTsKLQkJeG1sTGlzdEFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbExpc3RBbm5vdGF0aW9uKTsKLQotCQlhdHRyaWJ1dGVNYXBwaW5nLnJlbW92ZVhtbE1peGVkKCk7Ci0JCXhtbExpc3RBbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbE1peGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55RWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQW55RWxlbWVudE1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IChYbWxBbnlFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbE1peGVkQW5ub3RhdGlvbiB4bWxMaXN0QW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwoeG1sTGlzdEFubm90YXRpb24pOwotCi0KLQkJLy9hZGQgYW4gWG1sTWl4ZWQgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX01JWEVEKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbExpc3RBbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE5vdE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxMaXN0QW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbE1peGVkIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfTUlYRUQpOwotCQkJfQotCQl9KTsKLQkJeG1sTGlzdEFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROdWxsKHhtbExpc3RBbm5vdGF0aW9uKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZDAwNzIuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQXR0YWNobWVudFJlZkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dHJpYnV0ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURSRUZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzIGV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEF0dHJpYnV0ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0IGphdmEudXRpbC5MaXN0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBYbWxBdHRyaWJ1dGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gbGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQl4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCi0JCS8vYWRkIGEgTmFtZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEF0dHJpYnV0ZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfQVRUUklCVVRFX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBOYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEF0dHJpYnV0ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEF0dHJpYnV0ZUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQl4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCi0KLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxBdHRyaWJ1dGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVFJJQlVURV9fTkFNRVNQQUNFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEF0dHJpYnV0ZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEF0dHJpYnV0ZUFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0U3BlY2lmaWVkUmVxdWlyZWQoQm9vbGVhbi5UUlVFKTsKLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQXR0cmlidXRlTWFwcGluZy5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0U3BlY2lmaWVkUmVxdWlyZWQobnVsbCk7Ci0JCXhtbEF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzUmVxdWlyZWQoKSk7Ci0KLQotCQkvL2FkZCBhIHJlcXVpcmVkIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sQXR0cmlidXRlTWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRSSUJVVEVfX1JFUVVJUkVELCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNSZXF1aXJlZCgpKTsKLQotCQkvL3JlbW92ZSB0aGUgcmVxdWlyZWQgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sQXR0cmlidXRlQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sQXR0cmlidXRlTWFwcGluZy5pc1JlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZyk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24geG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuYWRkWG1sU2NoZW1hVHlwZSgpOwotCQl4bWxTY2hlbWFUeXBlQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLnJlbW92ZVhtbFNjaGVtYVR5cGUoKTsKLQkJeG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCi0KLQkJLy9hZGQgYW4gWG1sU2NoZW1hVHlwZSBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxTY2hlbWFUeXBlQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxTY2hlbWFUeXBlKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sU2NoZW1hVHlwZSBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQkJfQotCQl9KTsKLQkJeG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sU2NoZW1hVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxTY2hlbWFUeXBlQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sQXR0cmlidXRlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxBdHRyaWJ1dGVUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sQXR0cmlidXRlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfQVRUUklCVVRFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QoZmFsc2UpOwotCQkKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxMaXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aENvbGxlY3Rpb25YbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sQXR0cmlidXRlTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QoZmFsc2UpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbExpc3QgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfTElTVCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbExpc3QgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0xJU1QpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhDb2xsZWN0aW9uWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9hZGQgYW4gWG1sTGlzdCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBYbWxMaXN0IGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sQXR0cmlidXRlTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxJRCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxJREFubm90YXRpb24geG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJREFubm90YXRpb24pOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcuYWRkWG1sSUQoKTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxJREFubm90YXRpb24pOwotCi0JCXhtbEF0dHJpYnV0ZU1hcHBpbmcucmVtb3ZlWG1sSUQoKTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbElEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEQW5ub3RhdGlvbiB4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxJRCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9JRCk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbElEIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9JRCk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbElEUkVGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEUkVGQW5ub3RhdGlvbiB4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5hZGRYbWxJRFJFRigpOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxJRFJFRigpOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSURSRUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBdHRyaWJ1dGUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sSURSRUZBbm5vdGF0aW9uIHhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbElEUkVGIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0lEUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sSURSRUYgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0lEUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sQXR0YWNobWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxBdHRhY2htZW50UmVmKCkpOwotCQlhc3NlcnROdWxsKHhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nLmFkZFhtbEF0dGFjaG1lbnRSZWYoKTsKLQkJeG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gPSAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUQUNITUVOVF9SRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZy5yZW1vdmVYbWxBdHRhY2htZW50UmVmKCk7Ci0JCXhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sQXR0YWNobWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlTWFwcGluZy5nZXRYbWxBdHRhY2htZW50UmVmKCkpOwotCQlhc3NlcnROdWxsKHhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbEF0dGFjaG1lbnRSZWYgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQVRUQUNITUVOVF9SRUYpOwotCQkJfQotCQl9KTsKLQkJeG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gPSAoWG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUQUNITUVOVF9SRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEF0dGFjaG1lbnRSZWYgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVEFDSE1FTlRfUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFhtbEF0dGFjaG1lbnRSZWYoKSk7Ci0JCWFzc2VydE51bGwoeG1sQXR0YWNobWVudFJlZkFubm90YXRpb24pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhZDc5Ni4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJREFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElEUkVGQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aENvbGxlY3Rpb25YbWxFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkxpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBYbWxFbGVtZW50IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGxpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBUWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlWG1sVHlwZVdpdGhWYXJpb3VzQXR0cmlidXRlcygpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSkFYQi5YTUxfVFlQRSkuYXBwZW5kKCI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgU3RyaW5nIHN0cmluZzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBTdHJpbmdbXSBzdHJpbmdBcnJheTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgVFlQRV9OQU1FICsgIi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCXhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQotCQl4bWxFbGVtZW50LmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJeG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0KLQkJLy9hZGQgYSBOYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnRNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfX05BTUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIE5hbWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQotCQl4bWxFbGVtZW50LmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJeG1sRWxlbWVudC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZShudWxsKTsKLQkJeG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudCB4bWxFbGVtZW50ID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCi0KLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9fTkFNRVNQQUNFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJLy9yZW1vdmUgdGhlIG5hbWVzcGFjZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sRWxlbWVudEFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNSZXF1aXJlZCgpKTsKLQotCQl4bWxFbGVtZW50LnNldFNwZWNpZmllZFJlcXVpcmVkKEJvb2xlYW4uVFJVRSk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgeG1sRWxlbWVudC5pc1JlcXVpcmVkKCkpOwotCi0JCXhtbEVsZW1lbnQuc2V0U3BlY2lmaWVkUmVxdWlyZWQobnVsbCk7Ci0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNSZXF1aXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNSZXF1aXJlZCgpKTsKLQotCi0JCS8vYWRkIGEgcmVxdWlyZWQgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9fUkVRVUlSRUQsIHRydWUpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgeG1sRWxlbWVudC5pc1JlcXVpcmVkKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSByZXF1aXJlZCBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sRWxlbWVudEFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNSZXF1aXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmlsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNOaWxsYWJsZSgpKTsKLQotCQl4bWxFbGVtZW50LnNldFNwZWNpZmllZE5pbGxhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudC5nZXRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgeG1sRWxlbWVudC5pc05pbGxhYmxlKCkpOwotCi0JCXhtbEVsZW1lbnQuc2V0U3BlY2lmaWVkTmlsbGFibGUobnVsbCk7Ci0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNOaWxsYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmlsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNOaWxsYWJsZSgpKTsKLQotCi0JCS8vYWRkIGEgbmlsbGFibGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9fTklMTEFCTEUsIHRydWUpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudC5nZXRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgeG1sRWxlbWVudC5pc05pbGxhYmxlKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBuaWxsYWJsZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlOb3JtYWxBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKE5vcm1hbEFubm90YXRpb24pIEdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy52YWx1ZXMoeG1sRWxlbWVudEFubm90YXRpb24pLnJlbW92ZSgwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNOaWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROaWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVYbWxUeXBlV2l0aFZhcmlvdXNBdHRyaWJ1dGVzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIHN0cmluZwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKS5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc0RlZmF1bHROaWxsYWJsZSgpKTsKLQkJCi0JCS8vIHN0cmluZyBsaXN0Ci0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDEpOwotCQl4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCXhtbEVsZW1lbnQgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxFbGVtZW50KCk7Ci0JCXJlc291cmNlQXR0cmlidXRlID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCB4bWxFbGVtZW50LmlzRGVmYXVsdE5pbGxhYmxlKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSkuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCQotCQkvLyBzdHJpbmcgYXJyYXkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMik7Ci0JCXhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJcmVzb3VyY2VBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHhtbEVsZW1lbnQuaXNEZWZhdWx0TmlsbGFibGUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKS5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudC5pc0RlZmF1bHROaWxsYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50IHhtbEVsZW1lbnQgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0JCXhtbEVsZW1lbnQuc2V0RGVmYXVsdFZhbHVlKCJmb28iKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnQuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0JCXhtbEVsZW1lbnQuc2V0RGVmYXVsdFZhbHVlKG51bGwpOwotCQl4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLQotCQkvL2FkZCBhIERlZmF1bHRWYWx1ZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50TWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnQuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBEZWZhdWx0VmFsdWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnQuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB4bWxFbGVtZW50LmdldERlZmF1bHRUeXBlKCkpOwotCQkKLQkJeG1sRWxlbWVudC5zZXRTcGVjaWZpZWRUeXBlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbGVtZW50LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRWxlbWVudC5nZXRUeXBlKCkpOwotCQkKLQkJeG1sRWxlbWVudC5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnQuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB4bWxFbGVtZW50LmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnQgeG1sRWxlbWVudCA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sRWxlbWVudC5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB4bWxFbGVtZW50LmdldFR5cGUoKSk7Ci0JCQotCQkvL2FkZCBhIFR5cGUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudFR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfX1RZUEUsICJGb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRWxlbWVudC5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVsZW1lbnQuZ2V0VHlwZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBUeXBlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudEFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50QW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sRWxlbWVudC5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCi0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCXhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24geG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRNYXBwaW5nLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24geG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRNYXBwaW5nLmFkZFhtbFNjaGVtYVR5cGUoKTsKLQkJeG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRNYXBwaW5nLnJlbW92ZVhtbFNjaGVtYVR5cGUoKTsKLQkJeG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24geG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCi0KLQkJLy9hZGQgYW4gWG1sU2NoZW1hVHlwZSBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQkJfQotCQl9KTsKLQkJeG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCi0JCS8vcmVtb3ZlIHRoZSBYbWxTY2hlbWFUeXBlIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQkJfQotCQl9KTsKLQkJeG1sU2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbFNjaGVtYVR5cGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sU2NoZW1hVHlwZUFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50TWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIAotCQkJbmFtZSwgCi0JCQl0aGlzLm5ld1R5cGVMaXRlcmFsKGRlY2xhcmF0aW9uLmdldEFzdCgpLCB0eXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJcmV0dXJuIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxFbGVtZW50V3JhcHBlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxFbGVtZW50TWFwcGluZy5hZGRYbWxFbGVtZW50V3JhcHBlcigpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxFbGVtZW50TWFwcGluZy5yZW1vdmVYbWxFbGVtZW50V3JhcHBlcigpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCi0KLQkJLy9hZGQgYW4gWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkJfQotCQl9KTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbExpc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCXhtbEVsZW1lbnRNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxFbGVtZW50TWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KGZhbHNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTGlzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhDb2xsZWN0aW9uWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCXhtbEVsZW1lbnRNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxFbGVtZW50TWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KGZhbHNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9hZGQgYW4gWG1sTGlzdCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfTElTVCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbExpc3QgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbExpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQkvL2FkZCBhbiBYbWxMaXN0IGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50TWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sTGlzdCBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0xJU1QpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbEVsZW1lbnRNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sRWxlbWVudE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxJRCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEQW5ub3RhdGlvbiB4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJREFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRNYXBwaW5nLmFkZFhtbElEKCk7Ci0JCXhtbElEQW5ub3RhdGlvbiA9IChYbWxJREFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcucmVtb3ZlWG1sSUQoKTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbElEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50TWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sSURBbm5vdGF0aW9uIHhtbElEQW5ub3RhdGlvbiA9IChYbWxJREFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEKCkpOwotCQlhc3NlcnROdWxsKHhtbElEQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxJRCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSUQpOwotCQkJfQotCQl9KTsKLQkJeG1sSURBbm5vdGF0aW9uID0gKFhtbElEQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSUQoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSURBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sSUQgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9JRCk7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJREFubm90YXRpb24gPSAoWG1sSURBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJREFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxJRFJFRigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRNYXBwaW5nIHhtbEVsZW1lbnRNYXBwaW5nID0gKFhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbElEUkVGQW5ub3RhdGlvbiB4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRNYXBwaW5nLmFkZFhtbElEUkVGKCk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcucmVtb3ZlWG1sSURSRUYoKTsKLQkJeG1sSURSRUZBbm5vdGF0aW9uID0gKFhtbElEUkVGQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sSURSRUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxJRFJFRkFubm90YXRpb24geG1sSURSRUZBbm5vdGF0aW9uID0gKFhtbElEUkVGQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQotCi0JCS8vYWRkIGFuIFhtbElEUkVGIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9JRFJFRik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50TWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCi0JCS8vcmVtb3ZlIHRoZSBYbWxJRFJFRiBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0lEUkVGKTsKLQkJCX0KLQkJfSk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRNYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEF0dGFjaG1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcuYWRkWG1sQXR0YWNobWVudFJlZigpOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJeG1sRWxlbWVudE1hcHBpbmcucmVtb3ZlWG1sQXR0YWNobWVudFJlZigpOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEF0dGFjaG1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50TWFwcGluZyB4bWxFbGVtZW50TWFwcGluZyA9IChYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxBdHRhY2htZW50UmVmIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEF0dGFjaG1lbnRSZWYgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudE1hcHBpbmcuZ2V0WG1sQXR0YWNobWVudFJlZigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YTkxMGQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhKQVhCRWxlbWVudFhtbEVsZW1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoVFlQRV9OQU1FICsgIjIiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9FTEVNRU5UX1JFRiwgSkFYQi5KQVhCX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgSkFYQkVsZW1lbnQgZm9vOyIpLmFwcGVuZChDUikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFJvb3RFbGVtZW50WG1sRWxlbWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShUWVBFX05BTUUgKyAiMyIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0VMRU1FTlRfUkVGLCBKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFJvb3RFbGVtZW50KG5hbWU9XCJmb29cIikiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgIiArIFRZUEVfTkFNRSArICIzIGZvbzsiKS5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCWNyZWF0ZVR5cGVXaXRoSkFYQkVsZW1lbnRYbWxFbGVtZW50UmVmKCk7IC8vIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUgKyAiMiIKLQkJY3JlYXRlVHlwZVdpdGhSb290RWxlbWVudFhtbEVsZW1lbnRSZWYoKTsgLy8gRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSArICIzIgotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIGdldENvbnRleHRSb290KCkuZ2V0VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQkvLyBYbWxFbGVtZW50UmVmIHR5cGUgaXMgamF2YS5sYW5nLlN0cmluZyAtPiBubyBkZWZhdWx0IG5hbWUgb3IgbmFtZXNwYWNlCi0JCWFzc2VydEVxdWFscygiIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNsYXNzTWFwcGluZyA9ICgoSmF4YkNsYXNzKSBnZXRDb250ZXh0Um9vdCgpLmdldFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSArICIyIikpLmdldE1hcHBpbmcoKTsKLQkJeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQl4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQkKLQkJLy8gWG1sRWxlbWVudFJlZiB0eXBlIGlzIEpBWEJFbGVtZW50IC0+IGRlZmF1bHQgbmFtZSBpcyBuYW1lIG9mIGF0dHJpYnV0ZQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQljbGFzc01hcHBpbmcgPSAoKEpheGJDbGFzcykgZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUgKyAiMyIpKS5nZXRNYXBwaW5nKCk7Ci0JCXhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJeG1sRWxlbWVudFJlZiA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWYoKTsKLQkJCi0JCS8vIFhtbEVsZW1lbnRSZWYgdHlwZSBpcyB0eXBlIHdpdGggcm9vdCBlbGVtZW50IC0+IGRlZmF1bHQgbmFtZSBpcyByb290IGVsZW1lbnQgbmFtZQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCXhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0KLQkJLy9hZGQgYSBOYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnRSZWZNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBOYW1lIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZSgiZm9vIik7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sRWxlbWVudFJlZi5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQotCQl4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIHhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCi0KLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudFJlZk1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZfX05BTUVTUEFDRSwgImZvbyIpOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxFbGVtZW50UmVmLmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCi0JCS8vcmVtb3ZlIHRoZSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZigpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmIHhtbEVsZW1lbnRSZWYgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudFJlZi5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzUmVxdWlyZWQoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5zZXRTcGVjaWZpZWRSZXF1aXJlZChCb29sZWFuLlRSVUUpOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50UmVmLmdldFNwZWNpZmllZFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnRSZWYuaXNEZWZhdWx0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB4bWxFbGVtZW50UmVmLmlzUmVxdWlyZWQoKSk7Ci0KLQkJeG1sRWxlbWVudFJlZi5zZXRTcGVjaWZpZWRSZXF1aXJlZChudWxsKTsKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnRSZWYuaXNSZXF1aXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyB4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWYgeG1sRWxlbWVudFJlZiA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzRGVmYXVsdFJlcXVpcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHhtbEVsZW1lbnRSZWYuaXNSZXF1aXJlZCgpKTsKLQotCi0JCS8vYWRkIGEgcmVxdWlyZWQgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudFJlZk1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZfX1JFUVVJUkVELCB0cnVlKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudFJlZi5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHhtbEVsZW1lbnRSZWYuaXNSZXF1aXJlZCgpKTsKLQotCQkvL3JlbW92ZSB0aGUgcmVxdWlyZWQgbWVtYmVyIHZhbHVlIHBhaXIKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJTm9ybWFsQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMudGhpcy5nZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMudmFsdWVzKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkUmVxdWlyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgeG1sRWxlbWVudFJlZi5pc0RlZmF1bHRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB4bWxFbGVtZW50UmVmLmlzUmVxdWlyZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIHhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sRWxlbWVudFJlZi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnRSZWYuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmLnNldFNwZWNpZmllZFR5cGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbGVtZW50UmVmLmdldFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnRSZWYuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIHhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZiB4bWxFbGVtZW50UmVmID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZigpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWYuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCB4bWxFbGVtZW50UmVmLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIHhtbEVsZW1lbnRSZWYuZ2V0VHlwZSgpKTsKLQkJCi0JCS8vYWRkIGEgVHlwZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMudGhpcy5hZGRYbWxFbGVtZW50UmVmVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZfX1RZUEUsICJGb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRWxlbWVudFJlZi5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVsZW1lbnRSZWYuZ2V0VHlwZSgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBUeXBlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoTm9ybWFsQW5ub3RhdGlvbikgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbikucmVtb3ZlKDApOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgeG1sRWxlbWVudFJlZi5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VNYXBwaW5nVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyB4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCi0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9FTEVNRU5UX1JFRl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFJlZk1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0KLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZk1hcHBpbmcgeG1sRWxlbWVudFJlZk1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCi0JCXhtbEVsZW1lbnRSZWZNYXBwaW5nLmFkZFhtbEphdmFUeXBlQWRhcHRlcigpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxFbGVtZW50UmVmTWFwcGluZy5yZW1vdmVYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKTsKLQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyB4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCi0KLQkJLy9hZGQgYW4gWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQkvL3JlbW92ZSB0aGUgWG1sSmF2YVR5cGVBZGFwdGVyIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sRWxlbWVudFJlZk1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRSZWZNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sRWxlbWVudFJlZlR5cGVNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCShNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQluYW1lLCAKLQkJCXRoaXMubmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxFbGVtZW50V3JhcHBlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIHhtbEVsZW1lbnRSZWZNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZNYXBwaW5nLmFkZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50UmVmTWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCQkKLQkJeG1sRWxlbWVudFJlZk1hcHBpbmcucmVtb3ZlWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sRWxlbWVudFJlZldyYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyB4bWxFbGVtZW50UmVmTWFwcGluZyA9IChYbWxFbGVtZW50UmVmTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZk1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJCi0JCS8vYWRkIGFuIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24KLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkJfQotCQl9KTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sRWxlbWVudFdyYXBwZXIgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkJfQotCQl9KTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZNYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxNaXhlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWYoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCVhtbE1peGVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwoYXR0cmlidXRlTWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQkJCi0JCWF0dHJpYnV0ZU1hcHBpbmcuYWRkWG1sTWl4ZWQoKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQlhdHRyaWJ1dGVNYXBwaW5nLnJlbW92ZVhtbE1peGVkKCk7Ci0JCWFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTWl4ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxFbGVtZW50UmVmTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gYXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQkvL2FkZCBhbiBYbWxNaXhlZCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9NSVhFRCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sTWl4ZWQgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfTUlYRUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVNYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzRmZjAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sRWxlbWVudFJlZnNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE1peGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzCi0JCWV4dGVuZHMgSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZnMiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sRWxlbWVudFJlZnNNZW1iZXJWYWx1ZVBhaXIoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlhZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRSZWZzTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWFkZE1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRSZWZzVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWFkZE1lbWJlclZhbHVlUGFpcigKLQkJCQkoTWFya2VyQW5ub3RhdGlvbikgZ2V0WG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgCi0JCQkJbmFtZSwgCi0JCQkJbmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIHR5cGVOYW1lKSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRSZWZzICoqKioqCi0JCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gbmV3WG1sRWxlbWVudFJlZkFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsIEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfUkVGX19OQU1FLCBuYW1lKTsKLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbEVsZW1lbnRSZWYoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4LCBTdHJpbmcgbmFtZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFycmF5RWxlbWVudCA9IG5ld1htbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldEFzdCgpLCBuYW1lKTsKLQkJYWRkQXJyYXlFbGVtZW50KGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMsIGluZGV4LCBKQVhCLlhNTF9FTEVNRU5UX1JFRlNfX1ZBTFVFLCBhcnJheUVsZW1lbnQpOwkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIG1vdmVYbWxFbGVtZW50UmVmKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCW1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UX1JFRlMpLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlNfX1ZBTFVFLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxFbGVtZW50UmVmKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCkgewotCQlyZW1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UX1JFRlMpLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlNfX1ZBTFVFLCBpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jWG1sRWxlbWVudFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJSXRlcmFibGU8WG1sRWxlbWVudFJlZj4geG1sRWxlbWVudFJlZnMgPSBtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxFbGVtZW50UmVmcykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vYWRkIDIgWG1sRWxlbWVudFJlZiBhbm5vdGF0aW9ucwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudFJlZihkZWNsYXJhdGlvbiwgMCwgImZvbyIpOwotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnRSZWYoZGVjbGFyYXRpb24sIDEsICJiYXIiKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sRWxlbWVudFJlZnMgPSBtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmcygpKSk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudFJlZnMsIDApLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAxKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzd2l0Y2ggWG1sRWxlbWVudFJlZiBhbm5vdGF0aW9ucwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCQotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nVGVzdHMudGhpcy5tb3ZlWG1sRWxlbWVudFJlZihkZWNsYXJhdGlvbiwgMCwgMSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZzID0gbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnMoKSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRSZWZzLCAwKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50UmVmcywgMSkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gcmVtb3ZlIFhtbEVsZW1lbnRSZWYgYW5ub3RhdGlvbnMKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudFJlZihkZWNsYXJhdGlvbiwgMSk7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudFJlZihkZWNsYXJhdGlvbiwgMCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZzID0gbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzKCk7Ci0JCQotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbEVsZW1lbnRSZWZzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkuZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxFbGVtZW50UmVmcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRSZWZzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudFJlZnNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkKLQkJSXRlcmFibGU8WG1sRWxlbWVudFJlZkFubm90YXRpb24+IGFubm90YXRpb25zID0gYW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJCi0JCW1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5hZGRYbWxFbGVtZW50UmVmKDApLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCW1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5hZGRYbWxFbGVtZW50UmVmKDEpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmF6Iik7Ci0JCW1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5hZGRYbWxFbGVtZW50UmVmKDEpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmFyIik7Ci0JCQotCQlhbm5vdGF0aW9ucyA9IGFubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldChhbm5vdGF0aW9ucywgMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KGFubm90YXRpb25zLCAxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIENvbGxlY3Rpb25Ub29scy5nZXQoYW5ub3RhdGlvbnMsIDIpLmdldE5hbWUoKSk7Ci0JCQotCQltYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkubW92ZVhtbEVsZW1lbnRSZWYoMSwgMik7Ci0JCQotCQlhbm5vdGF0aW9ucyA9IGFubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5nZXRYbWxFbGVtZW50UmVmc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldChhbm5vdGF0aW9ucywgMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KGFubm90YXRpb25zLCAxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoYW5ub3RhdGlvbnMsIDIpLmdldE5hbWUoKSk7Ci0JCQotCQltYXBwaW5nLmdldFhtbEVsZW1lbnRSZWZzKCkucmVtb3ZlWG1sRWxlbWVudFJlZigyKTsKLQkJbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLnJlbW92ZVhtbEVsZW1lbnRSZWYoMCk7Ci0JCW1hcHBpbmcuZ2V0WG1sRWxlbWVudFJlZnMoKS5yZW1vdmVYbWxFbGVtZW50UmVmKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGFubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxFbGVtZW50UmVmcygpLmdldFhtbEVsZW1lbnRSZWZzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlTWFwcGluZ1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUykpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9BVFRSSUJVVEVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxBdHRyaWJ1dGVNYXBwaW5nID0gKFhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9SRUZTX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUykpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZnNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQkJbWFwcGluZy5hZGRYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQltYXBwaW5nLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZnNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCi0JCS8vcmVtb3ZlIHRoZSBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkJfQotCQl9KTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEVsZW1lbnRXcmFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLmFkZFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEVsZW1lbnRXcmFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudFJlZnMoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRSZWZzTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQkvL2FkZCBhbiBYbWxFbGVtZW50V3JhcHBlciBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbEVsZW1lbnRXcmFwcGVyIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWl4ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZnNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLmFkZFhtbE1peGVkKCk7Ci0JCWFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQkKLQkJbWFwcGluZy5yZW1vdmVYbWxNaXhlZCgpOwotCQlhbm5vdGF0aW9uID0gKFhtbE1peGVkQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9NSVhFRCk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxNaXhlZCgpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTWl4ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50UmVmcygpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sRWxlbWVudFJlZnNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudFJlZnNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxNaXhlZEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JCQotCQkvL2FkZCBhbiBYbWxNaXhlZCBhbm5vdGF0aW9uCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50UmVmc01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfTUlYRUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCWFubm90YXRpb24gPSAoWG1sTWl4ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbE1peGVkKCkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQkKLQkJLy9yZW1vdmUgdGhlIFhtbE1peGVkIGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZnNNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9NSVhFRCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJYW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sTWl4ZWQoKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1ZDczYy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURSRUZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZSgKLQkJCQluZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkJCQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0VMRU1FTlRTKTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50cyIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCQotCS8vICoqKioqIFhtbEVsZW1lbnRzICoqKioqCi0JCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gbmV3WG1sRWxlbWVudEFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsIEpBWEIuWE1MX0VMRU1FTlQpOwotCQlhZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9fTkFNRSwgbmFtZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxFbGVtZW50KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhcnJheUVsZW1lbnQgPSBuZXdYbWxFbGVtZW50QW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSwgbmFtZSk7Ci0JCWFkZEFycmF5RWxlbWVudChkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVFMsIGluZGV4LCBKQVhCLlhNTF9FTEVNRU5UU19fVkFMVUUsIGFycmF5RWxlbWVudCk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVhtbEVsZW1lbnQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJbW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX0VMRU1FTlRTKSwgSkFYQi5YTUxfRUxFTUVOVFNfX1ZBTFVFLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxFbGVtZW50KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIGludCBpbmRleCkgewotCQlyZW1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGRlY2xhcmF0aW9uLmdldEFubm90YXRpb25OYW1lZChKQVhCLlhNTF9FTEVNRU5UUyksIEpBWEIuWE1MX0VMRU1FTlRTX19WQUxVRSwgaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3luY1htbEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudHMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50c01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50c01hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCUl0ZXJhYmxlPFhtbEVsZW1lbnQ+IHhtbEVsZW1lbnRzID0gbWFwcGluZy5nZXRYbWxFbGVtZW50cygpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbEVsZW1lbnRzKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQkJCi0JCS8vYWRkIDIgWG1sRWxlbWVudCBhbm5vdGF0aW9ucwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sRWxlbWVudChkZWNsYXJhdGlvbiwgMCwgImZvbyIpOwotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbEVsZW1lbnQoZGVjbGFyYXRpb24sIDEsICJiYXIiKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sRWxlbWVudHMgPSBtYXBwaW5nLmdldFhtbEVsZW1lbnRzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShtYXBwaW5nLmdldFhtbEVsZW1lbnRzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudHMsIDApLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRzLCAxKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzd2l0Y2ggWG1sRWxlbWVudCBhbm5vdGF0aW9ucwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCQotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5tb3ZlWG1sRWxlbWVudChkZWNsYXJhdGlvbiwgMCwgMSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXhtbEVsZW1lbnRzID0gbWFwcGluZy5nZXRYbWxFbGVtZW50cygpOwotCQkKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkobWFwcGluZy5nZXRYbWxFbGVtZW50cygpKSk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbEVsZW1lbnRzLCAwKS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50cywgMSkuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy8gcmVtb3ZlIFhtbEVsZW1lbnQgYW5ub3RhdGlvbnMKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQkKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudChkZWNsYXJhdGlvbiwgMSk7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sRWxlbWVudChkZWNsYXJhdGlvbiwgMCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXhtbEVsZW1lbnRzID0gbWFwcGluZy5nZXRYbWxFbGVtZW50cygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxFbGVtZW50cykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEVsZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudHMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50c01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50c01hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJWG1sRWxlbWVudHNBbm5vdGF0aW9uIHhtbEVsZW1lbnRzQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50c0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVFMpOwotCQkKLQkJSXRlcmFibGU8WG1sRWxlbWVudEFubm90YXRpb24+IHhtbEVsZW1lbnRBbm5vdGF0aW9ucyA9IHhtbEVsZW1lbnRzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50cygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbEVsZW1lbnRzQW5ub3RhdGlvbi5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBwaW5nLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sRWxlbWVudCgwKS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQltYXBwaW5nLmFkZFhtbEVsZW1lbnQoMSkuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJiYXoiKTsKLQkJbWFwcGluZy5hZGRYbWxFbGVtZW50KDEpLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiYmFyIik7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbnMgPSB4bWxFbGVtZW50c0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudHMoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB4bWxFbGVtZW50c0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwcGluZy5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50QW5ub3RhdGlvbnMsIDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50QW5ub3RhdGlvbnMsIDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxFbGVtZW50QW5ub3RhdGlvbnMsIDIpLmdldE5hbWUoKSk7Ci0JCQotCQltYXBwaW5nLm1vdmVYbWxFbGVtZW50KDEsIDIpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb25zID0geG1sRWxlbWVudHNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRzKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgeG1sRWxlbWVudHNBbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcHBpbmcuZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudEFubm90YXRpb25zLCAwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudEFubm90YXRpb25zLCAxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sRWxlbWVudEFubm90YXRpb25zLCAyKS5nZXROYW1lKCkpOwotCQkKLQkJbWFwcGluZy5yZW1vdmVYbWxFbGVtZW50KDIpOwotCQltYXBwaW5nLnJlbW92ZVhtbEVsZW1lbnQoMCk7Ci0JCW1hcHBpbmcucmVtb3ZlWG1sRWxlbWVudCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB4bWxFbGVtZW50c0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxFbGVtZW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxKYXZhVHlwZUFkYXB0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbEphdmFUeXBlQWRhcHRlcigpOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudHNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudHNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sSmF2YVR5cGVBZGFwdGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCi0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCQkJfQotCQkJCX0pOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbEVsZW1lbnRXcmFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudHMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50c01hcHBpbmcgbWFwcGluZyA9IChYbWxFbGVtZW50c01hcHBpbmcpIENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxFbGVtZW50V3JhcHBlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxFbGVtZW50V3JhcHBlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudHNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudHNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KAotCQkJCW5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQkJCUdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbEVsZW1lbnRXcmFwcGVyKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KAotCQkJCQlNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlHZW5lcmljSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCQkJfQotCQkJCX0pOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sRWxlbWVudFdyYXBwZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSURSRUYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJWG1sSURSRUZBbm5vdGF0aW9uIHhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLmFkZFhtbElEUkVGKCk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbElEUkVGKCk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxJRFJFRigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudHNNYXBwaW5nIG1hcHBpbmcgPSAoWG1sRWxlbWVudHNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlYbWxJRFJFRkFubm90YXRpb24geG1sSURSRUZBbm5vdGF0aW9uID0gKFhtbElEUkVGQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCQotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sSURSRUYoKSk7Ci0JCWFzc2VydE51bGwoeG1sSURSRUZBbm5vdGF0aW9uKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IGFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfSURSRUYpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCXhtbElEUkVGQW5ub3RhdGlvbiA9IChYbWxJRFJFRkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSURSRUYpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbElEUkVGKCkpOwotCQlhc3NlcnROb3ROdWxsKHhtbElEUkVGQW5ub3RhdGlvbik7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJR2VuZXJpY0phdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0lEUkVGKTsKLQkJCQkJfQotCQkJCX0pOwotCQl4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxJRFJFRigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxJRFJFRkFubm90YXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxSb290RWxlbWVudFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDM4MjQwLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxSb290RWxlbWVudFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEuYmVhbnMuSW50cm9zcGVjdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LlhtbFJvb3RFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sVHlwZVdpdGhYbWxSb290RWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUm9vdEVsZW1lbnQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sVHlwZVdpdGhYbWxSb290RWxlbWVudCgpOwotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCVhtbFJvb3RFbGVtZW50IGNvbnRleHRSb290RWxlbWVudCA9IGNsYXNzTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydE51bGwoY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKG51bGwpOwotCQlyb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnROdWxsKHJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFR5cGVXaXRoWG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxSb290RWxlbWVudCBjb250ZXh0Um9vdEVsZW1lbnQgPSBjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVR5cGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMudGhpcy5hZGRYbWxSb290RWxlbWVudE1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UX19OQU1FU1BBQ0UsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnRUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnROdWxsKGNsYXNzTWFwcGluZy5nZXRYbWxSb290RWxlbWVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFR5cGVXaXRoWG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxSb290RWxlbWVudCBjb250ZXh0Um9vdEVsZW1lbnQgPSBjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCVN0cmluZyBkZWZhdWx0TmFtZSA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHROYW1lLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHROYW1lLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiByb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbnRleHRSb290RWxlbWVudC5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwocm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHROYW1lLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFR5cGVXaXRoWG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxSb290RWxlbWVudCBjb250ZXh0Um9vdEVsZW1lbnQgPSBjbGFzc01hcHBpbmcuZ2V0WG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGpheGJDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCVN0cmluZyBkZWZhdWx0TmFtZSA9IEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHROYW1lLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHROYW1lLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sUm9vdEVsZW1lbnRUZXN0cy50aGlzLmFkZFhtbFJvb3RFbGVtZW50TWVtYmVyVmFsdWVQYWlyKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9ST09UX0VMRU1FTlRfX05BTUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFJvb3RFbGVtZW50LmdldFFOYW1lKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Um9vdEVsZW1lbnQuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxSb290RWxlbWVudFRlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydE51bGwoY2xhc3NNYXBwaW5nLmdldFhtbFJvb3RFbGVtZW50KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbFJvb3RFbGVtZW50TWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgbmFtZSwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWYwYTRjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxOczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sTnNGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpIiwKLQkJCQlKQVhCLlhNTF9BQ0NFU1NfVFlQRSwgSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0WG1sU2NoZW1hLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2NoZW1hQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYS5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCQotCQkgLy9zZXQgYW5vdGhlciBhbm5vdGF0aW9uIHNvIHRoZSBjb250ZXh0IG1vZGVsIGlzIG5vdCBibG93biBhd2F5IGJ5IHJlbW92aW5nIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbgotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWROYW1lc3BhY2UobnVsbCk7Ci0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWFBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0WG1sU2NoZW1hLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWVzcGFjZSBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sU2NoZW1hIGFubm90YXRpb24KLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWROYW1lc3BhY2UoImZvbyIpOwotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2NoZW1hQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYS5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQkKLQkJLy9hZGQgYSBuYW1lc3BhY2UgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQV9fTkFNRVNQQUNFLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkTmFtZXNwYWNlKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLnJlbW92ZVhtbFNjaGVtYUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0WG1sU2NoZW1hLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldExvY2F0aW9uKCkpOwotCQkKLQkJY29udGV4dFhtbFNjaGVtYS5zZXRMb2NhdGlvbigiZm9vIik7Ci0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNjaGVtYUFubm90YXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQkJCi0JCSAvL3NldCBhbm90aGVyIGFubm90YXRpb24gc28gdGhlIGNvbnRleHQgbW9kZWwgaXMgbm90IGJsb3duIGF3YXkgYnkgcmVtb3ZpbmcgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uCi0JCWNvbnRleHRQYWNrYWdlSW5mby5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpOwotCQljb250ZXh0WG1sU2NoZW1hLnNldExvY2F0aW9uKG51bGwpOwotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hQW5ub3RhdGlvbi5nZXRMb2NhdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldExvY2F0aW9uKCkpOwotCi0JCS8vc2V0IGxvY2F0aW9uIGFnYWluLCB0aGlzIHRpbWUgc3RhcnRpbmcgd2l0aCBubyBYbWxTY2hlbWEgYW5ub3RhdGlvbgotCQljb250ZXh0WG1sU2NoZW1hLnNldExvY2F0aW9uKCJmb28iKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNjaGVtYUFubm90YXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQkJCi0JCS8vYWRkIGEgbG9jYXRpb24gbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQV9fTE9DQVRJT04sICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sU2NoZW1hLmdldExvY2F0aW9uKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5yZW1vdmVYbWxTY2hlbWFBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRMb2NhdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkJCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlNFVCwgY29udGV4dFhtbFNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtLlFVQUxJRklFRCk7Ci0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uUVVBTElGSUVELCBjb250ZXh0WG1sU2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQkKLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0uVU5RVUFMSUZJRUQpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybS5VTlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCSAvL3NldCBhbm90aGVyIGFubm90YXRpb24gc28gdGhlIGNvbnRleHQgbW9kZWwgaXMgbm90IGJsb3duIGF3YXkgYnkgcmVtb3ZpbmcgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uCi0JCWNvbnRleHRQYWNrYWdlSW5mby5zZXRTcGVjaWZpZWRBY2Nlc3NUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpOwotCQljb250ZXh0WG1sU2NoZW1hLnNldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KG51bGwpOwotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hQW5ub3RhdGlvbi5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQkKLQkJLy9zZXQgYXR0cmlidXRlIGZvcm0gZGVmYXVsdCBhZ2FpbiwgdGhpcyB0aW1lIHN0YXJ0aW5nIHdpdGggbm8gWG1sU2NoZW1hIGFubm90YXRpb24KLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0uUVVBTElGSUVEKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uUVVBTElGSUVELCBjb250ZXh0WG1sU2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXR0cmlidXRlRm9ybURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCQotCQkvL3NldCB0aGUgYXR0cmlidXRlIGZvcm0gZGVmYXVsdCB2YWx1ZSB0byBRVUFMSUZJRUQKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFFbnVtTWVtYmVyVmFsdWVQYWlyKAotCQkJCQlkZWNsYXJhdGlvbiwKLQkJCQkJSkFYQi5YTUxfU0NIRU1BX19BVFRSSUJVVEVfRk9STV9ERUZBVUxULCAKLQkJCQkJSkFYQi5YTUxfTlNfRk9STV9fUVVBTElGSUVEKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCQotCQkvL3NldCB0aGUgYXR0cmlidXRlIGZvcm0gZGVmYXVsdCB2YWx1ZSB0byBVTlFVQUxJRklFRAotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuc2V0WG1sU2NoZW1hRW51bU1lbWJlclZhbHVlUGFpcigKLQkJCQkJZGVjbGFyYXRpb24sCi0JCQkJCUpBWEIuWE1MX1NDSEVNQV9fQVRUUklCVVRFX0ZPUk1fREVGQVVMVCwgCi0JCQkJCUpBWEIuWE1MX05TX0ZPUk1fX1VOUVVBTElGSUVEKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5yZW1vdmVYbWxTY2hlbWFBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQljb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlhc3NlcnROdWxsKGNvbnRleHRYbWxTY2hlbWEuZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5TRVQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlFbGVtZW50Rm9ybURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlNFVCwgY29udGV4dFhtbFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCQotCQljb250ZXh0WG1sU2NoZW1hLnNldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0uUVVBTElGSUVEKTsKLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtLlFVQUxJRklFRCwgc2NoZW1hQW5ub3RhdGlvbi5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uUVVBTElGSUVELCBjb250ZXh0WG1sU2NoZW1hLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWEuc2V0U3BlY2lmaWVkRWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybS5VTlFVQUxJRklFRCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTnNGb3JtLlVOUVVBTElGSUVELCBzY2hlbWFBbm5vdGF0aW9uLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCQotCQkgLy9zZXQgYW5vdGhlciBhbm5vdGF0aW9uIHNvIHRoZSBjb250ZXh0IG1vZGVsIGlzIG5vdCBibG93biBhd2F5IGJ5IHJlbW92aW5nIHRoZSBYbWxTY2hlbWEgYW5ub3RhdGlvbgotCQljb250ZXh0UGFja2FnZUluZm8uc2V0U3BlY2lmaWVkQWNjZXNzVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJY29udGV4dFhtbFNjaGVtYS5zZXRTcGVjaWZpZWRFbGVtZW50Rm9ybURlZmF1bHQobnVsbCk7Ci0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWFBbm5vdGF0aW9uLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJCi0JCS8vc2V0IGVsZW1lbnQgZm9ybSBkZWZhdWx0IGFnYWluLCB0aGlzIHRpbWUgc3RhcnRpbmcgd2l0aCBubyBYbWxTY2hlbWEgYW5ub3RhdGlvbgotCQljb250ZXh0WG1sU2NoZW1hLnNldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0uUVVBTElGSUVEKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFbGVtZW50Rm9ybURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlNFVCwgY29udGV4dFhtbFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCQotCQkvL3NldCB0aGUgZWxlbWVudCBmb3JtIGRlZmF1bHQgdmFsdWUgdG8gUVVBTElGSUVECi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sU2NoZW1hRW51bU1lbWJlclZhbHVlUGFpcigKLQkJCQkJZGVjbGFyYXRpb24sCi0JCQkJCUpBWEIuWE1MX1NDSEVNQV9fRUxFTUVOVF9GT1JNX0RFRkFVTFQsIAotCQkJCQlKQVhCLlhNTF9OU19GT1JNX19RVUFMSUZJRUQpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uUVVBTElGSUVELCBjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIGNvbnRleHRYbWxTY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQkKLQkJLy9zZXQgdGhlIGVsZW1lbnQgZm9ybSBkZWZhdWx0IHZhbHVlIHRvIFVOUVVBTElGSUVECi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5zZXRYbWxTY2hlbWFFbnVtTWVtYmVyVmFsdWVQYWlyKAotCQkJCQlkZWNsYXJhdGlvbiwKLQkJCQkJSkFYQi5YTUxfU0NIRU1BX19FTEVNRU5UX0ZPUk1fREVGQVVMVCwgCi0JCQkJCUpBWEIuWE1MX05TX0ZPUk1fX1VOUVVBTElGSUVEKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlVOUVVBTElGSUVELCBjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlFVQUxJRklFRCwgY29udGV4dFhtbFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMucmVtb3ZlWG1sU2NoZW1hQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hLmdldFNwZWNpZmllZEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5VTlNFVCwgY29udGV4dFhtbFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxOc1ByZWZpeGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCUxpc3RJdGVyYWJsZTxYbWxOcz4geG1sTnNQcmVmaXhlcyA9IGNvbnRleHRYbWxTY2hlbWEuZ2V0WG1sTnNQcmVmaXhlcygpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQotCQkvL2FkZCAyIFhtbE5zIHByZWZpeGVzCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sTnMoZGVjbGFyYXRpb24sIDAsICJiYXIiLCAiYmFyUHJlZml4Iik7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLmFkZFhtbE5zKGRlY2xhcmF0aW9uLCAxLCAiZm9vIiwgImZvb1ByZWZpeCIpOwotCQkJfQotCQl9KTsKLQotCQl4bWxOc1ByZWZpeGVzID0gY29udGV4dFhtbFNjaGVtYS5nZXRYbWxOc1ByZWZpeGVzKCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOcz4geG1sTnNQcmVmaXhlc0l0ZXJhdG9yID0geG1sTnNQcmVmaXhlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbE5zUHJlZml4ZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQlYbWxOcyB4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyUHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvb1ByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxOcyhNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBwcmVmaXgpIHsKLQkJTm9ybWFsQW5ub3RhdGlvbiBhcnJheUVsZW1lbnQgPSB0aGlzLm5ld1htbE5zQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSwgbmFtZXNwYWNlVVJJLCBwcmVmaXgpOwotCQl0aGlzLmFkZEFycmF5RWxlbWVudChkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BLCBpbmRleCwgSkFYQi5YTUxfU0NIRU1BX19YTUxOUywgYXJyYXlFbGVtZW50KTsJCQotCX0KLQotCXByb3RlY3RlZCBOb3JtYWxBbm5vdGF0aW9uIG5ld1htbE5zQW5ub3RhdGlvbihBU1QgYXN0LCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcHJlZml4KSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMubmV3Tm9ybWFsQW5ub3RhdGlvbihhc3QsIEpBWEIuWE1MX05TKTsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgSkFYQi5YTUxfTlNfX05BTUVTUEFDRV9VUkksIG5hbWVzcGFjZVVSSSk7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKGFubm90YXRpb24sIEpBWEIuWE1MX05TX19QUkVGSVgsIHByZWZpeCk7Ci0JCXJldHVybiBhbm5vdGF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxOc1ByZXhpZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydEVxdWFscygwLCBjb250ZXh0WG1sU2NoZW1hLmdldFhtbE5zUHJlZml4ZXNTaXplKCkpOwotCi0JCS8vYWRkIDIgWG1sTnMgcHJlZml4ZXMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5hZGRYbWxOcyhkZWNsYXJhdGlvbiwgMCwgImJhciIsICJiYXJQcmVmaXgiKTsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sTnMoZGVjbGFyYXRpb24sIDEsICJmb28iLCAiZm9vUHJlZml4Iik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMiwgY29udGV4dFhtbFNjaGVtYS5nZXRYbWxOc1ByZWZpeGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sTnNQcmVmaXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9jcmVhdGUgYSBwYWNrYWdlIGluZm8gd2l0aCBhbiBhbm5vdGF0aW9uIG90aGVyIHRoYW4gWG1sU2NoZW1hIHRvIHRlc3QKLQkJLy9hZGRpbmcgdGhpbmdzIHRvIHRoZSBudWxsIHNjaGVtYSBhbm5vdGF0aW9uCi0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCVhtbE5zIHhtbE5zUHJlZml4ID0gY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgwKTsKLQkJeG1sTnNQcmVmaXguc2V0TmFtZXNwYWNlVVJJKCJiYXIiKTsKLQkJeG1sTnNQcmVmaXguc2V0UHJlZml4KCJiYXJQcmVmaXgiKTsKLQkJeG1sTnNQcmVmaXggPSBjb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDApOwotCQl4bWxOc1ByZWZpeC5zZXROYW1lc3BhY2VVUkkoImZvbyIpOwotCQl4bWxOc1ByZWZpeC5zZXRQcmVmaXgoImZvb1ByZWZpeCIpOwotCQl4bWxOc1ByZWZpeCA9IGNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMCk7Ci0JCXhtbE5zUHJlZml4LnNldE5hbWVzcGFjZVVSSSgiYmF6Iik7Ci0JCXhtbE5zUHJlZml4LnNldFByZWZpeCgiYmF6UHJlZml4Iik7Ci0KLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOc0Fubm90YXRpb24+IHhtbE5zUHJlZml4ZXMgPSBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zKCkuaXRlcmF0b3IoKTsKLQotCQlYbWxOc0Fubm90YXRpb24geG1sTnNBbm5vdGF0aW9uID0geG1sTnNQcmVmaXhlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNBbm5vdGF0aW9uLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXpQcmVmaXgiLCB4bWxOc0Fubm90YXRpb24uZ2V0UHJlZml4KCkpOwotCQl4bWxOc0Fubm90YXRpb24gPSB4bWxOc1ByZWZpeGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxOc0Fubm90YXRpb24uZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvb1ByZWZpeCIsIHhtbE5zQW5ub3RhdGlvbi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zQW5ub3RhdGlvbiA9IHhtbE5zUHJlZml4ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zQW5ub3RhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyUHJlZml4IiwgeG1sTnNBbm5vdGF0aW9uLmdldFByZWZpeCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRYbWxOc1ByZWZpeDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWEoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWEgY29udGV4dFhtbFNjaGVtYSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJWG1sTnMgeG1sTnNQcmVmaXggPSBjb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDApOwotCQl4bWxOc1ByZWZpeC5zZXROYW1lc3BhY2VVUkkoImJhciIpOwotCQl4bWxOc1ByZWZpeC5zZXRQcmVmaXgoImJhclByZWZpeCIpOwotCQl4bWxOc1ByZWZpeCA9IGNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMSk7Ci0JCXhtbE5zUHJlZml4LnNldE5hbWVzcGFjZVVSSSgiZm9vIik7Ci0JCXhtbE5zUHJlZml4LnNldFByZWZpeCgiZm9vUHJlZml4Iik7Ci0JCXhtbE5zUHJlZml4ID0gY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgwKTsKLQkJeG1sTnNQcmVmaXguc2V0TmFtZXNwYWNlVVJJKCJiYXoiKTsKLQkJeG1sTnNQcmVmaXguc2V0UHJlZml4KCJiYXpQcmVmaXgiKTsKLQotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbE5zQW5ub3RhdGlvbj4geG1sTnNQcmVmaXhlcyA9IHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnMoKS5pdGVyYXRvcigpOwotCi0JCVhtbE5zQW5ub3RhdGlvbiB4bWxOc0Fubm90YXRpb24gPSB4bWxOc1ByZWZpeGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc0Fubm90YXRpb24uZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhelByZWZpeCIsIHhtbE5zQW5ub3RhdGlvbi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zQW5ub3RhdGlvbiA9IHhtbE5zUHJlZml4ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zQW5ub3RhdGlvbi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyUHJlZml4IiwgeG1sTnNBbm5vdGF0aW9uLmdldFByZWZpeCgpKTsKLQkJeG1sTnNBbm5vdGF0aW9uID0geG1sTnNQcmVmaXhlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNBbm5vdGF0aW9uLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29QcmVmaXgiLCB4bWxOc0Fubm90YXRpb24uZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVhtbE5zUHJlZml4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hIGNvbnRleHRYbWxTY2hlbWEgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMCkuc2V0TmFtZXNwYWNlVVJJKCJiYXIiKTsKLQkJY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgxKS5zZXROYW1lc3BhY2VVUkkoImZvbyIpOwotCQljb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDIpLnNldE5hbWVzcGFjZVVSSSgiYmF6Iik7Ci0KLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydEVxdWFscygzLCBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zU2l6ZSgpKTsKLQotCQljb250ZXh0WG1sU2NoZW1hLnJlbW92ZVhtbE5zUHJlZml4KDEpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxOc0Fubm90YXRpb24+IHhtbE5zUHJlZml4ZXMgPSBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc1ByZWZpeGVzLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc1ByZWZpeGVzLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXMuaGFzTmV4dCgpKTsKLQotCQljb250ZXh0WG1sU2NoZW1hLnJlbW92ZVhtbE5zUHJlZml4KDEpOwotCQl4bWxOc1ByZWZpeGVzID0gc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sTnNQcmVmaXhlcy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzLmhhc05leHQoKSk7Ci0KLQkJY29udGV4dFhtbFNjaGVtYS5yZW1vdmVYbWxOc1ByZWZpeCgwKTsKLQkJeG1sTnNQcmVmaXhlcyA9IHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVYbWxOc1ByZWZpeCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQljb250ZXh0WG1sU2NoZW1hLmFkZFhtbE5zUHJlZml4KDApLnNldE5hbWVzcGFjZVVSSSgiYmFyIik7Ci0JCWNvbnRleHRYbWxTY2hlbWEuYWRkWG1sTnNQcmVmaXgoMSkuc2V0TmFtZXNwYWNlVVJJKCJmb28iKTsKLQkJY29udGV4dFhtbFNjaGVtYS5hZGRYbWxOc1ByZWZpeCgyKS5zZXROYW1lc3BhY2VVUkkoImJheiIpOwotCi0KLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnNTaXplKCkpOwkJCi0KLQkJY29udGV4dFhtbFNjaGVtYS5tb3ZlWG1sTnNQcmVmaXgoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxYbWxOcz4geG1sTnNQcmVmaXhlcyA9IGNvbnRleHRYbWxTY2hlbWEuZ2V0WG1sTnNQcmVmaXhlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNQcmVmaXhlcy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbE5zUHJlZml4ZXMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxOc1ByZWZpeGVzLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5oYXNOZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxOc0Fubm90YXRpb24+IHhtbE5zQW5ub3RhdGlvbnMgPSBzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxOc0Fubm90YXRpb25zLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNBbm5vdGF0aW9ucy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zQW5ub3RhdGlvbnMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQotCi0JCWNvbnRleHRYbWxTY2hlbWEubW92ZVhtbE5zUHJlZml4KDAsIDEpOwotCQl4bWxOc1ByZWZpeGVzID0gY29udGV4dFhtbFNjaGVtYS5nZXRYbWxOc1ByZWZpeGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc1ByZWZpeGVzLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sTnNQcmVmaXhlcy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zUHJlZml4ZXMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsJCQotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzLmhhc05leHQoKSk7Ci0KLQkJeG1sTnNBbm5vdGF0aW9ucyA9IHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbE5zQW5ub3RhdGlvbnMubmV4dCgpLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxOc0Fubm90YXRpb25zLm5leHQoKS5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sTnNBbm5vdGF0aW9ucy5uZXh0KCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeW5jWG1sTnNQcmVmaXhlcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYSBjb250ZXh0WG1sU2NoZW1hID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQotCQlMaXN0SXRlcmFibGU8WG1sTnM+IHhtbE5zUHJlZml4ZXMgPSBjb250ZXh0WG1sU2NoZW1hLmdldFhtbE5zUHJlZml4ZXMoKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlcy5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJLy9hZGQgMyBYbWxOcyBwcmVmaXhlcwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLmFkZFhtbE5zKGRlY2xhcmF0aW9uLCAwLCAiYmFyIiwgImJhclByZWZpeCIpOwotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5hZGRYbWxOcyhkZWNsYXJhdGlvbiwgMSwgImZvbyIsICJmb29QcmVmaXgiKTsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMuYWRkWG1sTnMoZGVjbGFyYXRpb24sIDIsICJiYXoiLCAiYmF6UHJlZml4Iik7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbE5zUHJlZml4ZXMgPSBjb250ZXh0WG1sU2NoZW1hLmdldFhtbE5zUHJlZml4ZXMoKTsKLQkJTGlzdEl0ZXJhdG9yPFhtbE5zPiB4bWxOc1ByZWZpeGVzSXRlcmF0b3IgPSB4bWxOc1ByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCVhtbE5zIHhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJQcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQl4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vUHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhelByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLm1vdmVYbWxOc1ByZWZpeChkZWNsYXJhdGlvbiwgMiwgMCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbE5zUHJlZml4ZXNJdGVyYXRvciA9IHhtbE5zUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvb1ByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXpQcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQl4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyUHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTnNQcmVmaXhlc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVRlc3RzLnRoaXMubW92ZVhtbE5zUHJlZml4KGRlY2xhcmF0aW9uLCAwLCAxKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sTnNQcmVmaXhlc0l0ZXJhdG9yID0geG1sTnNQcmVmaXhlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHhtbE5zUHJlZml4ZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQl4bWxOc1ByZWYgPSB4bWxOc1ByZWZpeGVzSXRlcmF0b3IubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbE5zUHJlZi5nZXROYW1lc3BhY2VVUkkoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6UHJlZml4IiwgeG1sTnNQcmVmLmdldFByZWZpeCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvb1ByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJQcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5yZW1vdmVYbWxOc1ByZWZpeChkZWNsYXJhdGlvbiwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbE5zUHJlZml4ZXNJdGVyYXRvciA9IHhtbE5zUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhelByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCXhtbE5zUHJlZiA9IHhtbE5zUHJlZml4ZXNJdGVyYXRvci5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sTnNQcmVmLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJQcmVmaXgiLCB4bWxOc1ByZWYuZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVGVzdHMudGhpcy5yZW1vdmVYbWxOc1ByZWZpeChkZWNsYXJhdGlvbiwgMSk7Ci0JCQl9Ci0JCX0pOwotCi0JCXhtbE5zUHJlZml4ZXNJdGVyYXRvciA9IHhtbE5zUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkJeG1sTnNQcmVmID0geG1sTnNQcmVmaXhlc0l0ZXJhdG9yLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCB4bWxOc1ByZWYuZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhelByZWZpeCIsIHhtbE5zUHJlZi5nZXRQcmVmaXgoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE5zUHJlZml4ZXNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy50aGlzLnJlbW92ZVhtbE5zUHJlZml4KGRlY2xhcmF0aW9uLCAwKTsKLQkJCX0KLQkJfSk7Ci0KLQkJeG1sTnNQcmVmaXhlc0l0ZXJhdG9yID0geG1sTnNQcmVmaXhlcy5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh4bWxOc1ByZWZpeGVzSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxTY2hlbWFFbnVtTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkRW51bU1lbWJlclZhbHVlUGFpcigoTWFya2VyQW5ub3RhdGlvbikgdGhpcy5nZXRYbWxTY2hlbWFBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgZWxlbWVudE5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxTY2hlbWFFbnVtTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGVudW1WYWx1ZSkgewotCQl0aGlzLnNldEVudW1NZW1iZXJWYWx1ZVBhaXIoKE5vcm1hbEFubm90YXRpb24pIHRoaXMuZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbihkZWNsYXJhdGlvbiksIGVsZW1lbnROYW1lLCBlbnVtVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbFNjaGVtYU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKChNYXJrZXJBbm5vdGF0aW9uKSB0aGlzLmdldFhtbFNjaGVtYUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLy9hZGQgYW5vdGhlciBwYWNrYWdlIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBvYmplY3QgZG9lc24ndCBnZXQgcmVtb3ZlZCB3aGVuIAotCS8vcmVtb3ZpbmcgdGhlIFhtbFNjaGVtYSBhbm5vdGF0aW9uLiBPbmx5ICJhbm5vdGF0ZWQiIHBhY2thZ2VzIGFyZSBhZGRlZCB0byB0aGUgY29udGV4dCBtb2RlbAotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbFNjaGVtYUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQl0aGlzLmFkZE1hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQl0aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sU2NoZW1hQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXJldHVybiBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoSkFYQi5YTUxfU0NIRU1BKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlWG1sTnNQcmVmaXgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBnZXRYbWxTY2hlbWFBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKSwgSkFYQi5YTUxfU0NIRU1BX19YTUxOUywgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxOc1ByZWZpeChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVBcnJheUVsZW1lbnQoKE5vcm1hbEFubm90YXRpb24pIGdldFhtbFNjaGVtYUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBKQVhCLlhNTF9TQ0hFTUFfX1hNTE5TLCBpbmRleCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTI0ODJjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBhY2thZ2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxTY2hlbWFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFV0aWw7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMgZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWFUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hVHlwZSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYVR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWFUeXBlIGNvbnRleHRYbWxTY2hlbWFUeXBlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCQkKLQkJY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gc2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzY2hlbWFUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCSAvL3ZlcmlmeSB0aGUgeG1sIHNjaGVtYSB0eXBlIGFubm90YXRpb24gaXMgbm90IHJlbW92ZWQgd2hlbiB0aGUgbmFtZSBpcyBzZXQgdG8gbnVsbAotCQljb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYVR5cGUgY29udGV4dFhtbFNjaGVtYVR5cGUgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0KLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL2FkZCBhIG5hbWUgbWVtYmVyIHZhbHVlIHBhaXIKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlUGFja2FnZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZVRlc3RzLnRoaXMuYWRkWG1sU2NoZW1hVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEVfX05BTUUsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lKCkpOwotCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2NoZW1hVHlwZVRlc3RzLnRoaXMucmVtb3ZlWG1sU2NoZW1hVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlUGFja2FnZUluZm9XaXRoWG1sU2NoZW1hVHlwZSgpOwotCQlKYXhiUGFja2FnZUluZm8gY29udGV4dFBhY2thZ2VJbmZvID0gQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFBhY2thZ2VzKCksIDApLmdldFBhY2thZ2VJbmZvKCk7Ci0JCVhtbFNjaGVtYVR5cGUgY29udGV4dFhtbFNjaGVtYVR5cGUgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0WG1sU2NoZW1hVHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBjb250ZXh0UGFja2FnZUluZm8uZ2V0UmVzb3VyY2VQYWNrYWdlKCk7Ci0JCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhYU0RVdGlsLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhYU0RVdGlsLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCWNvbnRleHRYbWxTY2hlbWFUeXBlLmdldFFOYW1lKCkuc2V0U3BlY2lmaWVkTmFtZXNwYWNlKCJmb28iKTsKLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gc2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzY2hlbWFUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQkgLy92ZXJpZnkgdGhlIHhtbCBzY2hlbWEgdHlwZSBhbm5vdGF0aW9uIGlzIG5vdCByZW1vdmVkIHdoZW4gdGhlIG5hbWVzcGFjZSBpcyBzZXQgdG8gbnVsbAotCQljb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLnNldFNwZWNpZmllZE5hbWVzcGFjZShudWxsKTsKLQkJc2NoZW1hVHlwZUFubm90YXRpb24gPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWFUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhYU0RVdGlsLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYVR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWFUeXBlIGNvbnRleHRYbWxTY2hlbWFUeXBlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhYU0RVdGlsLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldERlZmF1bHROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscyhYU0RVdGlsLlNDSEVNQV9GT1JfU0NIRU1BX1VSSV8yMDAxLCBjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRRTmFtZSgpLmdldE5hbWVzcGFjZSgpKTsKLQkJCi0JCS8vYWRkIGEgbmFtZXNwYWNlIG1lbWJlciB2YWx1ZSBwYWlyCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZVBhY2thZ2UpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy50aGlzLmFkZFhtbFNjaGVtYVR5cGVNZW1iZXJWYWx1ZVBhaXIoZGVjbGFyYXRpb24sIEpBWEIuWE1MX1NDSEVNQV9UWVBFX19OQU1FU1BBQ0UsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXRTcGVjaWZpZWROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0UU5hbWUoKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy50aGlzLnJlbW92ZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVQYWNrYWdlSW5mb1dpdGhYbWxTY2hlbWFUeXBlKCk7Ci0JCUpheGJQYWNrYWdlSW5mbyBjb250ZXh0UGFja2FnZUluZm8gPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0UGFja2FnZXMoKSwgMCkuZ2V0UGFja2FnZUluZm8oKTsKLQkJWG1sU2NoZW1hVHlwZSBjb250ZXh0WG1sU2NoZW1hVHlwZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGNvbnRleHRQYWNrYWdlSW5mby5nZXRSZXNvdXJjZVBhY2thZ2UoKTsKLQkKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRUeXBlKCkpOwotCQkKLQkJY29udGV4dFhtbFNjaGVtYVR5cGUuc2V0VHlwZSgiZm9vIik7Ci0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIHNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2NoZW1hVHlwZUFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRUeXBlKCkpOwotCQkKLQkJIC8vdmVyaWZ5IHRoZSB4bWwgc2NoZW1hIHR5cGUgYW5ub3RhdGlvbiBpcyBub3QgcmVtb3ZlZCB3aGVuIHRoZSB0eXBlIGlzIHNldCB0byBudWxsCi0JCWNvbnRleHRYbWxTY2hlbWFUeXBlLnNldFR5cGUobnVsbCk7Ci0JCXNjaGVtYVR5cGVBbm5vdGF0aW9uID0gKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hVHlwZUFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0WG1sU2NoZW1hVHlwZS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVBhY2thZ2VJbmZvV2l0aFhtbFNjaGVtYVR5cGUoKTsKLQkJSmF4YlBhY2thZ2VJbmZvIGNvbnRleHRQYWNrYWdlSW5mbyA9IENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRQYWNrYWdlcygpLCAwKS5nZXRQYWNrYWdlSW5mbygpOwotCQlYbWxTY2hlbWFUeXBlIGNvbnRleHRYbWxTY2hlbWFUeXBlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFhtbFNjaGVtYVR5cGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gY29udGV4dFBhY2thZ2VJbmZvLmdldFJlc291cmNlUGFja2FnZSgpOwotCi0JCWFzc2VydE51bGwoY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0VHlwZSgpKTsKLQkJCi0JCS8vYWRkIGEgdHlwZSBtZW1iZXIgdmFsdWUgcGFpcgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VQYWNrYWdlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxTY2hlbWFUeXBlVGVzdHMudGhpcy5hZGRYbWxTY2hlbWFUeXBlVHlwZU1lbWJlclZhbHVlUGFpcihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEVfX1RZUEUsICJTdHJpbmciKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgY29udGV4dFhtbFNjaGVtYVR5cGUuZ2V0VHlwZSgpKTsKLQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy50aGlzLnJlbW92ZVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRQYWNrYWdlSW5mby5nZXRYbWxTY2hlbWFUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxTY2hlbWFUeXBlVHlwZU1lbWJlclZhbHVlUGFpcihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRoaXMuYWRkTWVtYmVyVmFsdWVQYWlyKAotCQkJKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pLCAKLQkJCW5hbWUsIAotCQkJdGhpcy5uZXdUeXBlTGl0ZXJhbChkZWNsYXJhdGlvbi5nZXRBc3QoKSwgdHlwZU5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRYbWxTY2hlbWFUeXBlTWVtYmVyVmFsdWVQYWlyKE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5hZGRNZW1iZXJWYWx1ZVBhaXIoKE1hcmtlckFubm90YXRpb24pIHRoaXMuZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oZGVjbGFyYXRpb24pLCBuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLy9hZGQgYW5vdGhlciBwYWNrYWdlIGFubm90YXRpb24gc28gdGhhdCB0aGUgY29udGV4dCBtb2RlbCBvYmplY3QgZG9lc24ndCBnZXQgcmVtb3ZlZCB3aGVuIAotCS8vcmVtb3ZpbmcgdGhlIFhtbFNjaGVtYVR5cGUgYW5ub3RhdGlvbi4gT25seSAiYW5ub3RhdGVkIiBwYWNrYWdlcyBhcmUgYWRkZWQgdG8gdGhlIGNvbnRleHQgbW9kZWwKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbihNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCXRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwkJCi0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sU2NoZW1hVHlwZUFubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2VlQWxzb1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sU2VlQWxzb1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZGU4YTkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9ybWFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sU2VlQWxzbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2VlQWxzb0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxTZWVBbHNvVGVzdHMKLQkJZXh0ZW5kcyBKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBHZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFubm90YXRlZFBlcnNpc3RlbnRDbGFzc1dpdGhYbWxTZWVBbHNvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiICsgQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFhtbFNlZUFsc28iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFubm90YXRlZFBlcnNpc3RlbnRDbGFzc1dpdGhYbWxTZWVBbHNvKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJWG1sU2VlQWxzbyBjb250ZXh0WG1sU2VlQWxzbyA9IGNsYXNzTWFwcGluZy5nZXRYbWxTZWVBbHNvKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gamF4YkNsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBhIGNsYXNzCi0JCWNvbnRleHRYbWxTZWVBbHNvLmFkZENsYXNzKDAsICJmb28iKTsKLQkJWG1sU2VlQWxzb0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnRFcXVhbHMoMSwgYW5ub3RhdGlvbi5nZXRDbGFzc2VzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCksICJmb28iKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhbm5vdGF0aW9uLmdldENsYXNzZXMoKSwgImJhciIpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyCi0JCWNvbnRleHRYbWxTZWVBbHNvLmFkZENsYXNzKDAsICJiYXIiKTsKLQkJYW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnRFcXVhbHMoMiwgYW5ub3RhdGlvbi5nZXRDbGFzc2VzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCksICJmb28iKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGFubm90YXRpb24uZ2V0Q2xhc3NlcygpLCAiYmFyIikpOwotCQkKLQkJIC8vIHJlbW92ZSBvbmUKLQkJY29udGV4dFhtbFNlZUFsc28ucmVtb3ZlQ2xhc3MoMSk7Ci0JCWFubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGFubm90YXRpb24uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhbm5vdGF0aW9uLmdldENsYXNzZXMoKSwgImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCksICJiYXIiKSk7Ci0JCQotCQkvLyByZW1vdmUgdGhlIG90aGVyCi0JCWNvbnRleHRYbWxTZWVBbHNvLnJlbW92ZUNsYXNzKDApOwotCQlhbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydEVxdWFscygwLCBhbm5vdGF0aW9uLmdldENsYXNzZXNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoYW5ub3RhdGlvbi5nZXRDbGFzc2VzKCksICJiYXIiKSk7Ci0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhhbm5vdGF0aW9uLmdldENsYXNzZXMoKSwgImZvbyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQW5ub3RhdGVkUGVyc2lzdGVudENsYXNzV2l0aFhtbFNlZUFsc28oKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlYbWxTZWVBbHNvIGNvbnRleHRYbWxTZWVBbHNvID0gY2xhc3NNYXBwaW5nLmdldFhtbFNlZUFsc28oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBqYXhiQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBhbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlVHlwZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgYSBjbGFzcwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy50aGlzLmFkZENsYXNzKGRlY2xhcmF0aW9uLCAwLCAiZm9vIik7Ci0JCQl9Ci0JCX0pOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3Nlc1NpemUoKSk7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXMoKSwgImZvbyIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXMoKSwgImJhciIpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sU2VlQWxzb1Rlc3RzLnRoaXMuYWRkQ2xhc3MoZGVjbGFyYXRpb24sIDAsICJiYXIiKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzU2l6ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3NlcygpLCAiZm9vIikpOwotCQlhc3NlcnRUcnVlKENvbGxlY3Rpb25Ub29scy5jb250YWlucyhjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzKCksICJiYXIiKSk7Ci0JCQotCQkgLy8gcmVtb3ZlIG9uZQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy50aGlzLnJlbW92ZUNsYXNzKGRlY2xhcmF0aW9uLCAxKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXMoKSwgImZvbyIpKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoY29udGV4dFhtbFNlZUFsc28uZ2V0Q2xhc3NlcygpLCAiYmFyIikpOwotCQkKLQkJLy8gcmVtb3ZlIHRoZSBvdGhlcgotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy50aGlzLnJlbW92ZUNsYXNzKGRlY2xhcmF0aW9uLCAwKTsKLQkJCX0KLQkJfSk7Ci0JCWFzc2VydEVxdWFscygwLCBjb250ZXh0WG1sU2VlQWxzby5nZXRDbGFzc2VzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXMoKSwgImJhciIpKTsKLQkJYXNzZXJ0RmFsc2UoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGNvbnRleHRYbWxTZWVBbHNvLmdldENsYXNzZXMoKSwgImZvbyIpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2xhc3MoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4LCBTdHJpbmcgY2xhenopIHsKLQkJYWRkQXJyYXlFbGVtZW50KGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9TRUVfQUxTTywgaW5kZXgsIEpBWEIuWE1MX1NFRV9BTFNPX19WQUxVRSwgbmV3VHlwZUxpdGVyYWwoZGVjbGFyYXRpb24uZ2V0QXN0KCksIGNsYXp6KSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ2xhc3MoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJlbW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZ2V0WG1sU2VlQWxzb0Fubm90YXRpb24oZGVjbGFyYXRpb24pLCBKQVhCLlhNTF9TRUVfQUxTT19fVkFMVUUsIGluZGV4KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEFubm90YXRpb24gZ2V0WG1sU2VlQWxzb0Fubm90YXRpb24oTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQlyZXR1cm4gZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWQwZDAxLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5YbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuWG1sVmFsdWVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5KYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cyBleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIEdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxWYWx1ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkxpc3Q7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAWG1sVmFsdWUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gbGlzdDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZU1hcHBpbmdUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sVmFsdWUoKTsKLQotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9ICgoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCkpLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbFZhbHVlTWFwcGluZyB4bWxWYWx1ZU1hcHBpbmcgPSAoWG1sVmFsdWVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sVmFsdWVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbFZhbHVlTWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9WQUxVRSkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZyA9IChYbWxBdHRyaWJ1dGVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1ZBTFVFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX1ZBTFVFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCXhtbFZhbHVlTWFwcGluZyA9IChYbWxWYWx1ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbFZhbHVlTWFwcGluZyk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9WQUxVRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKSk7Ci0KLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sRWxlbWVudE1hcHBpbmcgeG1sRWxlbWVudE1hcHBpbmcgPSAoWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1ZBTFVFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlhNTF9WQUxVRV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQl4bWxWYWx1ZU1hcHBpbmcgPSAoWG1sVmFsdWVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxWYWx1ZU1hcHBpbmcpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVkFMVUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sVmFsdWUoKTsKLQotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9ICgoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCkpLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbFZhbHVlTWFwcGluZyB4bWxWYWx1ZU1hcHBpbmcgPSAoWG1sVmFsdWVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sVmFsdWVNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE51bGwoeG1sVmFsdWVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxWYWx1ZU1hcHBpbmcuYWRkWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydE5vdE51bGwoeG1sVmFsdWVNYXBwaW5nLmdldFhtbEphdmFUeXBlQWRhcHRlcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKTsKLQotCQl4bWxWYWx1ZU1hcHBpbmcucmVtb3ZlWG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbEphdmFUeXBlQWRhcHRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCk7Ci0KLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSAoKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApKS5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgeG1sVmFsdWVNYXBwaW5nID0gKFhtbFZhbHVlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbFZhbHVlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKHhtbFZhbHVlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQotCQkvL2FkZCBhbiBYbWxKYXZhVHlwZUFkYXB0ZXIgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROb3ROdWxsKHhtbFZhbHVlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE5vdE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0KLQkJLy9yZW1vdmUgdGhlIFhtbEphdmFUeXBlQWRhcHRlciBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCX0pOwotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKHhtbFZhbHVlTWFwcGluZy5nZXRYbWxKYXZhVHlwZUFkYXB0ZXIoKSk7Ci0JCWFzc2VydE51bGwoeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxMaXN0MSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFZhbHVlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgeG1sTWFwcGluZyA9IChYbWxWYWx1ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KGZhbHNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTGlzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhDb2xsZWN0aW9uWG1sVmFsdWUoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCVhtbFZhbHVlTWFwcGluZyB4bWxNYXBwaW5nID0gKFhtbFZhbHVlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHhtbE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCQkKLQkJeG1sTWFwcGluZy5zZXRTcGVjaWZpZWRYbWxMaXN0KHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQl4bWxNYXBwaW5nLnNldFNwZWNpZmllZFhtbExpc3QoZmFsc2UpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKHhtbE1hcHBpbmcuaXNTcGVjaWZpZWRYbWxMaXN0KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTElTVCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTGlzdDEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxWYWx1ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJWG1sVmFsdWVNYXBwaW5nIHhtbE1hcHBpbmcgPSAoWG1sVmFsdWVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0geG1sTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbExpc3QgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzRGVmYXVsdFhtbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1NwZWNpZmllZFhtbExpc3QoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKSk7Ci0JCQotCQkvL3JlbW92ZSB0aGUgWG1sTGlzdCBhbm5vdGF0aW9uCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUdlbmVyaWNKYXZhWG1sVmFsdWVNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzWG1sTGlzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbExpc3QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoQ29sbGVjdGlvblhtbFZhbHVlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlYbWxWYWx1ZU1hcHBpbmcgeG1sTWFwcGluZyA9IChYbWxWYWx1ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB4bWxNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vYWRkIGFuIFhtbExpc3QgYW5ub3RhdGlvbgotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBKQVhCLlhNTF9MSVNUKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNYbWxMaXN0KCkpOwotCQlhc3NlcnRUcnVlKHhtbE1hcHBpbmcuaXNEZWZhdWx0WG1sTGlzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBYbWxMaXN0IGFubm90YXRpb24KLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJR2VuZXJpY0phdmFYbWxWYWx1ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEpBWEIuWE1MX0xJU1QpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc1htbExpc3QoKSk7Ci0JCWFzc2VydFRydWUoeG1sTWFwcGluZy5pc0RlZmF1bHRYbWxMaXN0KCkpOwotCQlhc3NlcnRGYWxzZSh4bWxNYXBwaW5nLmlzU3BlY2lmaWVkWG1sTGlzdCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmYxOTJlLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF4YkNvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzCi0JCWV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbGVtZW50RmFjdG9yeU1ldGhvZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhRW51bUNvbnN0YW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQYWNrYWdlSW5mb1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhQ2xhc3NNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbnVtTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhUmVnaXN0cnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhWG1sRWxlbWVudFJlZk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbEVsZW1lbnRSZWZzTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQYWNrYWdlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFUeXBlWG1sSmF2YVR5cGVBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFBdHRyaWJ1dGVYbWxKYXZhVHlwZUFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFJvb3RFbGVtZW50VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFYbWxTY2hlbWFUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFNjaGVtYVR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFNlZUFsc29UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVhtbFZhbHVlTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpheGJQcm9qZWN0LmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpheGJQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzdiNDkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Byb2plY3RzL1Rlc3RKYXhiUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLkpwdEpheGJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkcyBhbmQgaG9sZHMgYSAiSkFYQiIgcHJvamVjdC4KLSAqIFN1cHBvcnQgZm9yIGFkZGluZyBwYWNrYWdlcyBhbmQgdHlwZXMuCi0gKiAKLSAqIFRoZSBKUEEgcHJvamVjdCdzIHNldHRpbmdzIChwbGF0Zm9ybSwgZGF0YWJhc2UgY29ubmVjdGlvbiwgZXRjLikgY2FuIGJlCi0gKiBjb250cm9sbGVkIGJ5IGJ1aWxkaW5nIGEgZGF0YSBtb2RlbCBhbmQgcGFzc2luZyBpdCBpbnRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAqLwotcHVibGljIGNsYXNzIFRlc3RKYXhiUHJvamVjdAotCQlleHRlbmRzIFRlc3RKYXZhUHJvamVjdCB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKYXhiUHJvamVjdCBqYXhiUHJvamVjdDsKLQkKLQkKLQkvLyAqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLmpwdC5qYXhiLmphciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXIiOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGpheGJKYXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoSkFYQl9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlY2xpcHNlbGlua0phck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3lzdGVtUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogYnVpbGRlcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVGVzdEpheGJQcm9qZWN0IGJ1aWxkSmF4YlByb2plY3QoCi0JCQlTdHJpbmcgYmFzZVByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCwgSURhdGFNb2RlbCBjb25maWcpCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVGVzdEpheGJQcm9qZWN0KGJhc2VQcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBjb25maWcpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCi0JcHVibGljIFRlc3RKYXhiUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0TmFtZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgVGVzdEpheGJQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdGhpcyhwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIFRlc3RKYXhiUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcihwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQkJU3RyaW5nIGpheGJGYWNldFZlcnNpb24gPSAKLQkJCQkoKElQcm9qZWN0RmFjZXRWZXJzaW9uKSBjb25maWcuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OKSkuZ2V0VmVyc2lvblN0cmluZygpOwotCQl0aGlzLmluc3RhbGxGYWNldChKYXhiRmFjZXQuSUQsIGpheGJGYWNldFZlcnNpb24sIGNvbmZpZyk7Ci0JCXRoaXMuYWRkSmFyKGpheGJKYXJOYW1lKCkpOwotCQlpZiAoZWNsaXBzZWxpbmtKYXJOYW1lKCkgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRKYXIoZWNsaXBzZWxpbmtKYXJOYW1lKCkpOwotCQl9Ci0JCXRoaXMuamF4YlByb2plY3QgPSBKcHRKYXhiQ29yZVBsdWdpbi5nZXRKYXhiUHJvamVjdCh0aGlzLmdldFByb2plY3QoKSk7Ci0JCXRoaXMuamF4YlByb2plY3Quc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpKTsKLQkJdGhpcy5qYXhiUHJvamVjdC5zZXRVcGRhdGVTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3luY2hyb25pemVyIGJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBidWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlUZXN0SmF4YlByb2plY3QudGhpcy5qYXhiUHJvamVjdC5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJVGVzdEpheGJQcm9qZWN0LnRoaXMuamF4YlByb2plY3QudXBkYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcHVibGljIG1ldGhvZHMgKioqKioqKioqKgotCQotCXB1YmxpYyBKYXhiUHJvamVjdCBnZXRKYXhiUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuamF4YlByb2plY3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZmYWE4ZC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5KYXhiQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0czsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCi0JCWlmIChKYXhiQ29yZVRlc3RzLnJlcXVpcmVkSmFyc0V4aXN0cygpKSB7Ci0JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF4YkluZGV4UmVzb3VyY2VUZXN0cy5jbGFzcyk7Ci0JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF4YlByb3BlcnRpZXNSZXNvdXJjZVRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3QoSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZS53YXJuaW5nKEpheGJDb3JlVGVzdHMuYnVpbGRNaXNzaW5nSmFyRXJyb3JNZXNzYWdlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pheGJJbmRleFJlc291cmNlVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KYXhiSW5kZXhSZXNvdXJjZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNjYxMTMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pheGJJbmRleFJlc291cmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF4YmluZGV4LkpheGJJbmRleFJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJpbmRleC5KYXhiSW5kZXhSZXNvdXJjZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF4YkluZGV4UmVzb3VyY2VUZXN0cwotCQlleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBWEJfSU5ERVggPSAiamF4Yi5pbmRleCI7Ci0JCi0JCi0JcHVibGljIEpheGJJbmRleFJlc291cmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUZpbGUgY3JlYXRlSmF4YkluZGV4KElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIFN0cmluZy4uLiBjbGFzc05hbWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIocHJvamVjdFJlbGF0aXZlUGF0aCk7Ci0JCWlmICghIGZvbGRlci5leGlzdHMoKSkgewotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCX0KLQkJSUZpbGUgamF4YkluZGV4ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0RmlsZShwcm9qZWN0UmVsYXRpdmVQYXRoLmFwcGVuZChuZXcgUGF0aChKQVhCX0lOREVYKSkpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBpbnB1dFN0cmVhbShjbGFzc05hbWVzKTsKLQkJamF4YkluZGV4LmNyZWF0ZShzdHJlYW0sIHRydWUsIG51bGwpOwotCQlyZXR1cm4gamF4YkluZGV4OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0Q2xhc3NOYW1lcyhJRmlsZSBqYXhiSW5kZXgsIFN0cmluZy4uLiBjbGFzc05hbWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJamF4YkluZGV4LnNldENvbnRlbnRzKGlucHV0U3RyZWFtKGNsYXNzTmFtZXMpLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0oU3RyaW5nLi4uIGNsYXNzTmFtZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKFN0cmluZyBjbGFzc05hbWUgOiBjbGFzc05hbWVzKSB7Ci0JCQlzYi5hcHBlbmQoY2xhc3NOYW1lICsgQ1IpOwotCQl9Ci0JCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgamF4YkluZGV4ID0gY3JlYXRlSmF4YkluZGV4KG5ldyBQYXRoKCJzcmMvdGVzdCIpLCAiZm9vIiwgImJhciIpOwotCQlKYXhiSW5kZXhSZXNvdXJjZSByZXNvdXJjZSA9IEpheGJJbmRleFJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLmJ1aWxkUmVzb3VyY2VNb2RlbChqYXhiSW5kZXgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbCgKLQkJCQlyZXNvdXJjZS5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKSwgCi0JCQkJbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihuZXcgU3RyaW5nW10geyJ0ZXN0LmZvbyIsICJ0ZXN0LmJhciJ9KSkpOwotCQkKLQkJc2V0Q2xhc3NOYW1lcyhqYXhiSW5kZXgsICJmb28iLCAiYmFyIiwgImJheiIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbCgKLQkJCQlyZXNvdXJjZS5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKSwgCi0JCQkJbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihuZXcgU3RyaW5nW10geyJ0ZXN0LmZvbyIsICJ0ZXN0LmJhciIsICJ0ZXN0LmJheiJ9KSkpOwotCQkKLQkJc2V0Q2xhc3NOYW1lcyhqYXhiSW5kZXgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXNvdXJjZS5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKSkpOwotCQkKLQkJamF4YkluZGV4ID0gY3JlYXRlSmF4YkluZGV4KG5ldyBQYXRoKCJzcmMiKSwgImZvbyIsICJiYXIiKTsKLQkJcmVzb3VyY2UgPSBKYXhiSW5kZXhSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKS5idWlsZFJlc291cmNlTW9kZWwoamF4YkluZGV4KTsKLQkJCi0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLmVsZW1lbnRzQXJlRXF1YWwoCi0JCQkJcmVzb3VyY2UuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWVzKCksIAotCQkJCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4obmV3IFN0cmluZ1tdIHsiZm9vIiwgImJhciJ9KSkpOwotCQkKLQkJc2V0Q2xhc3NOYW1lcyhqYXhiSW5kZXgsICJmb28iLCAiYmFyIiwgImJheiIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbCgKLQkJCQlyZXNvdXJjZS5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKSwgCi0JCQkJbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihuZXcgU3RyaW5nW10geyJmb28iLCAiYmFyIiwgImJheiJ9KSkpOwotCQkKLQkJc2V0Q2xhc3NOYW1lcyhqYXhiSW5kZXgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXNvdXJjZS5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZXMoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KYXhiUHJvcGVydGllc1Jlc291cmNlVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KYXhiUHJvcGVydGllc1Jlc291cmNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwNjg0Zi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSmF4YlByb3BlcnRpZXNSZXNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLnJlc291cmNlLmpheGJwcm9wcy5KYXhiUHJvcGVydGllc1Jlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmpheGJwcm9wcy5KYXhiUHJvcGVydGllc1Jlc291cmNlOwotCi0KLXB1YmxpYyBjbGFzcyBKYXhiUHJvcGVydGllc1Jlc291cmNlVGVzdHMKLQkJZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBKQVhCX1BST1BFUlRJRVMgPSAiamF4Yi5wcm9wZXJ0aWVzIjsKLQkKLQkKLQlwdWJsaWMgSmF4YlByb3BlcnRpZXNSZXNvdXJjZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElGaWxlIGNyZWF0ZUpheGJQcm9wZXJ0aWVzKElQYXRoIHByb2plY3RSZWxhdGl2ZVBhdGgsIFN0cmluZ1tdIC4uLiBwcm9wZXJ0eVZhbHVlUGFpcnMpIHRocm93cyBFeGNlcHRpb24gewotCQlJRm9sZGVyIGZvbGRlciA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcihwcm9qZWN0UmVsYXRpdmVQYXRoKTsKLQkJaWYgKCEgZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQlmb2xkZXIuY3JlYXRlKHRydWUsIGZhbHNlLCBudWxsKTsKLQkJfQotCQlJRmlsZSBqYXhiUHJvcGVydGllcyA9IGdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZpbGUocHJvamVjdFJlbGF0aXZlUGF0aC5hcHBlbmQobmV3IFBhdGgoSkFYQl9QUk9QRVJUSUVTKSkpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBpbnB1dFN0cmVhbShwcm9wZXJ0eVZhbHVlUGFpcnMpOwotCQlqYXhiUHJvcGVydGllcy5jcmVhdGUoc3RyZWFtLCB0cnVlLCBudWxsKTsKLQkJcmV0dXJuIGpheGJQcm9wZXJ0aWVzOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0UHJvcGVydGllcyhJRmlsZSBqYXhiUHJvcGVydGllcywgU3RyaW5nW10gLi4uIHByb3BlcnR5VmFsdWVQYWlycykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWpheGJQcm9wZXJ0aWVzLnNldENvbnRlbnRzKGlucHV0U3RyZWFtKHByb3BlcnR5VmFsdWVQYWlycyksIHRydWUsIGZhbHNlLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbShTdHJpbmdbXSAuLi4gcHJvcGVydHlWYWx1ZVBhaXJzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChTdHJpbmdbXSBwcm9wZXJ0eVZhbHVlUGFpciA6IHByb3BlcnR5VmFsdWVQYWlycykgewotCQkJc2IuYXBwZW5kKHByb3BlcnR5VmFsdWVQYWlyWzBdICsgIj0iICsgcHJvcGVydHlWYWx1ZVBhaXJbMV0gKyBDUik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzYi50b1N0cmluZygpLmdldEJ5dGVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBqYXhiUHJvcGVydGllcyA9IGNyZWF0ZUpheGJQcm9wZXJ0aWVzKG5ldyBQYXRoKCJzcmMvdGVzdCIpLCBuZXcgU3RyaW5nW10geyJmb28iLCAiZm9vUHJvcCJ9LCBuZXcgU3RyaW5nW10geyJiYXIiLCAiYmFyUHJvcCJ9KTsKLQkJSmF4YlByb3BlcnRpZXNSZXNvdXJjZSByZXNvdXJjZSA9IEpheGJQcm9wZXJ0aWVzUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCkuYnVpbGRSZXNvdXJjZU1vZGVsKGpheGJQcm9wZXJ0aWVzKTsKLQkJCi0JCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRQcm9wZXJ0eSgiZm9vIiksICJmb29Qcm9wIik7Ci0JCWFzc2VydEVxdWFscyhyZXNvdXJjZS5nZXRQcm9wZXJ0eSgiYmFyIiksICJiYXJQcm9wIik7Ci0JCQotCQlzZXRQcm9wZXJ0aWVzKGpheGJQcm9wZXJ0aWVzLCBuZXcgU3RyaW5nW10geyJmb28iLCAiZm9vUHJvcDIifSwgbmV3IFN0cmluZ1tdIHsiYmF6IiwgImJhelByb3AifSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocmVzb3VyY2UuZ2V0UHJvcGVydHkoImZvbyIpLCAiZm9vUHJvcDIiKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZS5nZXRQcm9wZXJ0eSgiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMocmVzb3VyY2UuZ2V0UHJvcGVydHkoImJheiIpLCAiYmF6UHJvcCIpOwotCQkKLQkJc2V0UHJvcGVydGllcyhqYXhiUHJvcGVydGllcyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlLmdldFByb3BlcnR5KCJmb28iKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UuZ2V0UHJvcGVydHkoImJhciIpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZS5nZXRQcm9wZXJ0eSgiYmF6IikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTQyNzIxLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmludGVybmFsLmpheGIyMS5HZW5lcmljSmF4Yl8yXzFfUGxhdGZvcm1EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpheGJQcm9qZWN0OwotCi1wdWJsaWMgY2xhc3MgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UKLQkJZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsJCi0KLQlwdWJsaWMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuamF2YVByb2plY3QuYWRkSmFyKFRlc3RKYXhiUHJvamVjdC5qYXhiSmFyTmFtZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25EZWZpbml0aW9uW10gYW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEFubm90YXRpb25EZWZpbml0aW9ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gR2VuZXJpY0pheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzODY0ZjIuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sQWNjZXNzb3JPcmRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sQWNjZXNzb3JPcmRlclR5cGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sQWNjZXNzb3JUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxBY2Nlc3NvclR5cGVUeXBlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxBbnlFbGVtZW50QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sRWxlbWVudFJlZkFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxFbGVtZW50UmVmc0Fubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxFbGVtZW50c0Fubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxFbnVtQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEVudW1WYWx1ZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxJREFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxJRFJFRkFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxJbmxpbmVCaW5hcnlEYXRhQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbElubGluZUJpbmFyeURhdGFUeXBlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbEphdmFUeXBlQWRhcHRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sSmF2YVR5cGVBZGFwdGVyVHlwZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxMaXN0QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbE1pbWVUeXBlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbE1peGVkQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFJlZ2lzdHJ5QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFNjaGVtYUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxTY2hlbWFUeXBlQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFNjaGVtYVR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFNlZUFsc29Bbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sVHJhbnNpZW50QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFRyYW5zaWVudFR5cGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sVHlwZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxWYWx1ZUFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yT3JkZXJQYWNrYWdlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyY2I3M2MuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NPcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEFjY2Vzc29yT3JkZXJQYWNrYWdlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBYbWxBY2Nlc3Nvck9yZGVyUGFja2FnZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yT3JkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxBY2Nlc3Nvck9yZGVyKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCkiLAotCQkJCUpBWEIuWE1MX0FDQ0VTU19PUkRFUiwgSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEFjY2Vzc29yT3JkZXIoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJCi0JCVhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIuQUxQSEFCRVRJQ0FMKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBY2Nlc3Nvck9yZGVyKEFMUEhBQkVUSUNBTCkiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxBY2Nlc3Nvck9yZGVyKCIsIGN1KTsKLQkJCi0vLwkJVE9ETyB1bmNvbW1lbnQgd2hlbiBidWcgMzI4NDAwIGlzIGFkZHJlc3NlZAotLy8JCWFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLS8vCQlhbm5vdGF0aW9uLnNldFZhbHVlKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yT3JkZXIoVU5ERUZJTkVEKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyVHlwZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JPcmRlclR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxOGM5MS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBY2Nlc3Nvck9yZGVyVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sQWNjZXNzT3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxBY2Nlc3Nvck9yZGVyVHlwZUFubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgWG1sQWNjZXNzb3JPcmRlclR5cGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBY2Nlc3Nvck9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFjY2Vzc29yT3JkZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBY2Nlc3Nvck9yZGVyV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BQ0NFU1NPUl9PUkRFUiwgSkFYQi5YTUxfQUNDRVNTX09SREVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQWNjZXNzb3JPcmRlcih2YWx1ZSA9IFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFjY2Vzc29yT3JkZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnRUcnVlKHhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc29yT3JkZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQWNjZXNzb3JPcmRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0KLQkJWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24geG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCwgeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBY2Nlc3Nvck9yZGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiB4bWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbiA9IChYbWxBY2Nlc3Nvck9yZGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfT1JERVIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzT3JkZXIuVU5ERUZJTkVEKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLlVOREVGSU5FRCwgeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBY2Nlc3Nvck9yZGVyKFVOREVGSU5FRCkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQWNjZXNzb3JPcmRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0KLQkJWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24geG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX09SREVSKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc09yZGVyLkFMUEhBQkVUSUNBTCwgeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzb3JPcmRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzNlNzM3Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yVHlwZVBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxBY2Nlc3NvclR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBYbWxBY2Nlc3NvclR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoQWNjZXNzb3JUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sQWNjZXNzb3JUeXBlKHZhbHVlID0gWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkiLAotCQkJCUpBWEIuWE1MX0FDQ0VTU19UWVBFLCBKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhBY2Nlc3NvclR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJCi0JCVhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IEZJRUxEKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuTk9ORSwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBY2Nlc3NvclR5cGUodmFsdWUgPSBOT05FKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBY2Nlc3NvclR5cGUodmFsdWUgPSBQVUJMSUNfTUVNQkVSKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sQWNjZXNzb3JUeXBlKCIsIGN1KTsKLQkJCi0vLwkJVE9ETyB1bmNvbW1lbnQgd2hlbiBidWcgMzI4NDAwIGlzIGFkZHJlc3NlZAotLy8JCWFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmFkZEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0vLwkJYW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLS8vCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yVHlwZShQUk9QRVJUWSkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlVHlwZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQWNjZXNzb3JUeXBlVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzdjNGYzLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFjY2Vzc29yVHlwZVR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxBY2Nlc3NvclR5cGVUeXBlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBYbWxBY2Nlc3NvclR5cGVUeXBlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQWNjZXNzb3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQWNjZXNzb3JUeXBlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQWNjZXNzb3JUeXBlV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BQ0NFU1NPUl9UWVBFLCBKQVhCLlhNTF9BQ0NFU1NfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IFhtbEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBY2Nlc3NvclR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCWFzc2VydFRydWUoeG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQWNjZXNzb3JUeXBlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhYbWxBY2Nlc3NUeXBlLkZJRUxELCB4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQWNjZXNzb3JUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlYbWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uIHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24gPSAoWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQUNDRVNTT1JfVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCXhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uc2V0VmFsdWUoWG1sQWNjZXNzVHlwZS5QVUJMSUNfTUVNQkVSKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbEFjY2Vzc1R5cGUuUFVCTElDX01FTUJFUiwgeG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yVHlwZShQVUJMSUNfTUVNQkVSKSIsIGN1KTsKLQotCQl4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLnNldFZhbHVlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSwgeG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFjY2Vzc29yVHlwZShQUk9QRVJUWSkiLCBjdSk7Ci0KLQkJeG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5zZXRWYWx1ZShYbWxBY2Nlc3NUeXBlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5OT05FLCB4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQWNjZXNzb3JUeXBlKE5PTkUpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFjY2Vzc29yVHlwZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0KLQkJWG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbiB4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uID0gKFhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FDQ0VTU09SX1RZUEUpOwotCQlhc3NlcnRFcXVhbHMoWG1sQWNjZXNzVHlwZS5GSUVMRCwgeG1sQWNjZXNzb3JUeXBlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQl4bWxBY2Nlc3NvclR5cGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc29yVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxBY2Nlc3NvclR5cGUoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEFueUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NThlMTkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQW55QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BTllfQVRUUklCVVRFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQW55QXR0cmlidXRlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxBbnlBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFueUF0dHJpYnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBbnlBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEFueUF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0FUVFJJQlVURSk7Ci0JCWFzc2VydFRydWUoeG1sQW55QXR0cmlidXRlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9BVFRSSUJVVEUpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEFueUF0dHJpYnV0ZSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlFbGVtZW50QW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBbnlFbGVtZW50QW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZTg3MTMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sQW55RWxlbWVudEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEFueUVsZW1lbnRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxBbnlFbGVtZW50QW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BTllfRUxFTUVOVF9WQUxVRSA9ICJTdHJpbmciOwotCi0JcHVibGljIFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBbnlFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFueUVsZW1lbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBbnlFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEFueUVsZW1lbnQoIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQW55RWxlbWVudFdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBbnlFbGVtZW50KHZhbHVlID0gIiArIFhNTF9BTllfRUxFTUVOVF9WQUxVRSAgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQW55RWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sQW55RWxlbWVudEFubm90YXRpb24geG1sQW55RWxlbWVudEFubm90YXRpb24gPSAoWG1sQW55RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQlhc3NlcnRUcnVlKHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmdldExheCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBbnlFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KCJsYXgiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbiB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxBbnlFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0TGF4KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRMYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFueUVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxBbnlFbGVtZW50QW5ub3RhdGlvbiB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxBbnlFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BTllfRUxFTUVOVCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh4bWxBbnlFbGVtZW50QW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0TGF4KCkpOwotCi0JCXhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLnNldExheChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLmdldExheCgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEFueUVsZW1lbnQobGF4ID0gZmFsc2UpIiwgY3UpOwotCi0JCXhtbEFueUVsZW1lbnRBbm5vdGF0aW9uLnNldExheChudWxsKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBbnlFbGVtZW50IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibGF4IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQW55RWxlbWVudFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sQW55RWxlbWVudEFubm90YXRpb24geG1sQW55RWxlbWVudEFubm90YXRpb24gPSAoWG1sQW55RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQU5ZX0VMRU1FTlQpOwotCQlhc3NlcnRUcnVlKHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0FOWV9FTEVNRU5UX1ZBTFVFLCB4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuIiArIFhNTF9BTllfRUxFTUVOVF9WQUxVRSwgeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEFueUVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEFueUVsZW1lbnRBbm5vdGF0aW9uIHhtbEFueUVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEFueUVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbCh4bWxBbnlFbGVtZW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJeG1sQW55RWxlbWVudEFubm90YXRpb24uc2V0VmFsdWUoWE1MX0FOWV9FTEVNRU5UX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9BTllfRUxFTUVOVF9WQUxVRSwgeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBbnlFbGVtZW50KCIgKyBYTUxfQU5ZX0VMRU1FTlRfVkFMVUUgICsgIi5jbGFzcykiLCBjdSk7Ci0KLQkJeG1sQW55RWxlbWVudEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sQW55RWxlbWVudEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBbnlFbGVtZW50IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEFueUVsZW1lbnQodmFsdWUgPSAiICsgWE1MX0FOWV9FTEVNRU5UX1ZBTFVFICArICIuY2xhc3MpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dGFjaG1lbnRSZWZBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMGQwNy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sQXR0YWNobWVudFJlZkFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQXR0YWNobWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfQVRUQUNITUVOVF9SRUYpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxBdHRhY2htZW50UmVmIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxBdHRhY2htZW50UmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBdHRhY2htZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiB4bWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbiA9IChYbWxBdHRhY2htZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydFRydWUoeG1sQXR0YWNobWVudFJlZkFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9BVFRBQ0hNRU5UX1JFRik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sQXR0YWNobWVudFJlZiIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjUyNzI5Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEF0dHJpYnV0ZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUklCVVRFX05BTUUgPSAiZWxlbWVudE5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQVRUUklCVVRFX05BTUVTUEFDRSA9ICJYbWxBdHRyaWJ1dGVOYW1lc3BhY2UiOwotCi0JcHVibGljIFhtbEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQXR0cmlidXRlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgWE1MX0FUVFJJQlVURV9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhTdHJpbmdFbGVtZW50KCJuYW1lc3BhY2UiLCBYTUxfQVRUUklCVVRFX05BTUVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudCwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEF0dHJpYnV0ZSgiICsgZWxlbWVudCArICIgPSBcIiIgKyB2YWx1ZSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEF0dHJpYnV0ZSgiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uIHhtbEF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfQVRUUklCVVRFX05BTUUsIHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uIHhtbEF0dHJpYnV0ZUFubm90YXRpb24gPSAoWG1sQXR0cmlidXRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9BVFRSSUJVVEUpOwotCQlhc3NlcnRUcnVlKHhtbEF0dHJpYnV0ZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCXhtbEF0dHJpYnV0ZUFubm90YXRpb24uc2V0TmFtZShYTUxfQVRUUklCVVRFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0FUVFJJQlVURV9OQU1FLCB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxBdHRyaWJ1dGUobmFtZSA9IFwiIiArIFhNTF9BVFRSSUJVVEVfTkFNRSArICJcIikiLCBjdSk7Ci0KLQkJeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEF0dHJpYnV0ZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxBdHRyaWJ1dGUobmFtZSA9IFwiIiArIFhNTF9BVFRSSUJVVEVfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0FUVFJJQlVURV9OQU1FU1BBQ0UsIHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sQXR0cmlidXRlQW5ub3RhdGlvbiB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uID0gKFhtbEF0dHJpYnV0ZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX0FUVFJJQlVURV9OQU1FU1BBQ0UpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0FUVFJJQlVURV9OQU1FU1BBQ0UsIHhtbEF0dHJpYnV0ZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQXR0cmlidXRlKG5hbWVzcGFjZSA9IFwiIiArIFhNTF9BVFRSSUJVVEVfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQotCQl4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEF0dHJpYnV0ZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxBdHRyaWJ1dGUobmFtZXNwYWNlID0gXCIiICsgWE1MX0FUVFJJQlVURV9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aEJvb2xlYW5FbGVtZW50KCJyZXF1aXJlZCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQXR0cmlidXRlQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEF0dHJpYnV0ZUFubm90YXRpb24geG1sQXR0cmlidXRlQW5ub3RhdGlvbiA9IChYbWxBdHRyaWJ1dGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0FUVFJJQlVURSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCi0JCXhtbEF0dHJpYnV0ZUFubm90YXRpb24uc2V0UmVxdWlyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxBdHRyaWJ1dGVBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQXR0cmlidXRlKHJlcXVpcmVkID0gZmFsc2UpIiwgY3UpOwotCi0JCXhtbEF0dHJpYnV0ZUFubm90YXRpb24uc2V0UmVxdWlyZWQobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sQXR0cmlidXRlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigicmVxdWlyZWQiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjU4OTM4Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sRWxlbWVudEFubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfTkFNRSA9ICJlbGVtZW50TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX05BTUVTUEFDRSA9ICJYbWxFbGVtZW50TmFtZXNwYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVGQVVMVF9WQUxVRSA9ICJteURlZmF1bHRWYWx1ZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1RZUEUgPSAiU3RyaW5nIjsKLQkKLQkKLQlwdWJsaWMgWG1sRWxlbWVudEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgWE1MX0VMRU1FTlRfTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoU3RyaW5nRWxlbWVudCgibmFtZXNwYWNlIiwgWE1MX0VMRU1FTlRfTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhTdHJpbmdFbGVtZW50KCJkZWZhdWx0VmFsdWUiLCBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50KCIgKyBlbGVtZW50ICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50KCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlQpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnQodHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9UWVBFICArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX05BTUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lKFhNTF9FTEVNRU5UX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX05BTUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIikiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRVNQQUNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0TmFtZXNwYWNlKFhNTF9FTEVNRU5UX05BTUVTUEFDRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRVNQQUNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudChuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoRGVmYXVsdFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVGQVVMVF9WQUxVRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSAoWG1sRWxlbWVudEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldERlZmF1bHRWYWx1ZShYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudChkZWZhdWx0VmFsdWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldERlZmF1bHRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudChkZWZhdWx0VmFsdWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5pbGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KCJuaWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROaWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROaWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KG5pbGxhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0TmlsbGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuaWxsYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KCJyZXF1aXJlZCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRSZXF1aXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KHJlcXVpcmVkID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0UmVxdWlyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJyZXF1aXJlZCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1RZUEUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLiIgKyBYTUxfRUxFTUVOVF9UWVBFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0VHlwZShYTUxfRUxFTUVOVF9UWVBFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9UWVBFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQodHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9UWVBFICArICIuY2xhc3MiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudCh0eXBlID0gIiArIFhNTF9FTEVNRU5UX1RZUEUgICsgIi5jbGFzcyIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50RGVjbEFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4MmEwYi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50RGVjbEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50RGVjbEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSA9ICJlbGVtZW50TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRVNQQUNFID0gIlhtbEVsZW1lbnREZWNsTmFtZXNwYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9ERUZBVUxUX1ZBTFVFID0gIm15RGVmYXVsdFZhbHVlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfREVDTF9TQ09QRSA9ICJYbWxFbGVtZW50RGVjbC5HTE9CQUwiOwotCi0JcHVibGljIFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudERlY2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50RGVjbCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFN0cmluZ0VsZW1lbnREZWNsKCJuYW1lIiwgWE1MX0VMRU1FTlRfREVDTF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3RyaW5nRWxlbWVudERlY2woIm5hbWVzcGFjZSIsIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRVNQQUNFKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3RyaW5nRWxlbWVudERlY2woImRlZmF1bHRWYWx1ZSIsIFhNTF9FTEVNRU5UX0RFQ0xfREVGQVVMVF9WQUxVRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhTdWJzdGl0dXRpb25IZWFkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoU3RyaW5nRWxlbWVudERlY2woInN1YnN0aXR1dGlvbkhlYWROYW1lIiwgWE1MX0VMRU1FTlRfREVDTF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFN0cmluZ0VsZW1lbnREZWNsKCJzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlIiwgWE1MX0VMRU1FTlRfREVDTF9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFN0cmluZ0VsZW1lbnREZWNsKGZpbmFsIFN0cmluZyBlbGVtZW50LCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnREZWNsKCIgKyBlbGVtZW50ICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudERlY2woc2NvcGUgPSAiICsgWE1MX0VMRU1FTlRfREVDTF9TQ09QRSAgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U2NvcGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0TmFtZShYTUxfRUxFTUVOVF9ERUNMX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9OQU1FLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudERlY2wobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2xXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9OQU1FU1BBQ0UsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2woKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0TmFtZXNwYWNlKFhNTF9FTEVNRU5UX0RFQ0xfTkFNRVNQQUNFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfTkFNRVNQQUNFLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfREVDTF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnREZWNsKG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhEZWZhdWx0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50RGVjbEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX0RFRkFVTFRfVkFMVUUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2woKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0RGVmYXVsdFZhbHVlKFhNTF9FTEVNRU5UX0RFQ0xfREVGQVVMVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX0RFRkFVTFRfVkFMVUUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50RGVjbChkZWZhdWx0VmFsdWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUNMX0RFRkFVTFRfVkFMVUUgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5zZXREZWZhdWx0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnREZWNsKGRlZmF1bHRWYWx1ZSA9IFwiIiArIFhNTF9FTEVNRU5UX0RFQ0xfREVGQVVMVF9WQUxVRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNjb3BlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhTY29wZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfU0NPUEUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTY29wZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLiIgKyBYTUxfRUxFTUVOVF9ERUNMX1NDT1BFLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRTY29wZUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NvcGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFNjb3BlKCkpOwotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0U2NvcGUoWE1MX0VMRU1FTlRfREVDTF9TQ09QRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX1NDT1BFLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U2NvcGUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50RGVjbChzY29wZSA9ICIgKyBYTUxfRUxFTUVOVF9ERUNMX1NDT1BFICArICIuY2xhc3MiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLnNldFNjb3BlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTY29wZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnREZWNsKHNjb3BlID0gIiArIFhNTF9FTEVNRU5UX0RFQ0xfU0NPUEUgICsgIi5jbGFzcyIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnREZWNsV2l0aFN1YnN0aXR1dGlvbkhlYWROYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9OQU1FLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBnZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxFbGVtZW50RGVjbEFubm90YXRpb24geG1sRWxlbWVudERlY2xBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX0RFQ0wpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpKTsKLQkJeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLnNldFN1YnN0aXR1dGlvbkhlYWROYW1lKFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUNMX05BTUUsIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbi5nZXRTdWJzdGl0dXRpb25IZWFkTmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsKHN1YnN0aXR1dGlvbkhlYWROYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfREVDTF9OQU1FICsgIlwiKSIsIGN1KTsKLQotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudERlY2wiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudERlY2woc3Vic3RpdHV0aW9uSGVhZE5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50RGVjbFdpdGhTdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiB4bWxFbGVtZW50RGVjbEFubm90YXRpb24gPSAoWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfREVDTCk7Ci0JCWFzc2VydFRydWUoeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVDTF9OQU1FLCB4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudERlY2woKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZ2V0TWV0aG9kKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudERlY2xBbm5vdGF0aW9uIHhtbEVsZW1lbnREZWNsQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50RGVjbEFubm90YXRpb24pIHJlc291cmNlTWV0aG9kLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9ERUNMKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpKTsKLQkJeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLnNldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoWE1MX0VMRU1FTlRfREVDTF9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSwgeG1sRWxlbWVudERlY2xBbm5vdGF0aW9uLmdldFN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50RGVjbChzdWJzdGl0dXRpb25IZWFkTmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfREVDTF9OQU1FICsgIlwiKSIsIGN1KTsKLQotCQl4bWxFbGVtZW50RGVjbEFubm90YXRpb24uc2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50RGVjbEFubm90YXRpb24uZ2V0U3Vic3RpdHV0aW9uSGVhZE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnREZWNsIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnREZWNsKHN1YnN0aXR1dGlvbkhlYWROYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUNMX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlYjRkYS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sRWxlbWVudFJlZkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9OQU1FID0gImVsZW1lbnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSA9ICJYbWxFbGVtZW50UmVmTmFtZXNwYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfUkVGX1RZUEUgPSAiU3RyaW5nIjsKLQkKLQkKLQlwdWJsaWMgWG1sRWxlbWVudFJlZkFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFhNTF9FTEVNRU5UX1JFRl9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhTdHJpbmdFbGVtZW50KCJuYW1lc3BhY2UiLCBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZigiICsgZWxlbWVudCArICIgPSBcIiIgKyB2YWx1ZSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRSZWYoIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRSZWYodHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0TmFtZShYTUxfRUxFTUVOVF9SRUZfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUUgKyAiXCIpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnRSZWYobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhOYW1lc3BhY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWYobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnRSZWYobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhCb29sZWFuRWxlbWVudCgicmVxdWlyZWQiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSAoWG1sRWxlbWVudFJlZkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUYpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXRSZXF1aXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmKHJlcXVpcmVkID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0UmVxdWlyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWYiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJyZXF1aXJlZCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydFRydWUoeG1sRWxlbWVudFJlZkFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9SRUZfVFlQRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldFR5cGUoWE1MX0VMRU1FTlRfUkVGX1RZUEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1JFRl9UWVBFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWYodHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAgKyAiLmNsYXNzIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0VHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnRSZWYodHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAgKyAiLmNsYXNzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50UmVmc0Fubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzVjMzA2Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRSZWZzQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50UmVmc0Fubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9SRUZfTkFNRSA9ICJlbGVtZW50TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UgPSAiWG1sRWxlbWVudFJlZk5hbWVzcGFjZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1JFRl9UWVBFID0gIlN0cmluZyI7Ci0JCi0JCi0JcHVibGljIFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfUkVGLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRSZWZzKEBYbWxFbGVtZW50UmVmKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFhNTF9FTEVNRU5UX1JFRl9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhTdHJpbmdFbGVtZW50KCJuYW1lc3BhY2UiLCBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1JFRiwgSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50UmVmcyhAWG1sRWxlbWVudFJlZigiICsgZWxlbWVudCArICIgPSBcIiIgKyB2YWx1ZSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9SRUYsIEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYodHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAgKyAiLmNsYXNzKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfUkVGLCBKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRSZWZzKEBYbWxFbGVtZW50UmVmKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRSArICJcIiwgbmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSArICJcIiwgdHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAgKyAiLmNsYXNzKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXByaXZhdGUgWG1sRWxlbWVudFJlZkFubm90YXRpb24gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiByZWZzQW5ub3RhdGlvbiAKLQkJCQk9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJcmV0dXJuIHJlZnNBbm5vdGF0aW9uLnhtbEVsZW1lbnRSZWZBdCgwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxFbGVtZW50UmVmQW5ub3RhdGlvbiBhZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihpbnQgaW5kZXgsIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgewotCQlYbWxFbGVtZW50UmVmc0Fubm90YXRpb24gcmVmc0Fubm90YXRpb24gCi0JCQkJPSAoWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGUyk7Ci0JCXJldHVybiByZWZzQW5ub3RhdGlvbi5hZGRYbWxFbGVtZW50UmVmKGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKGludCBpbmRleCwgSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiByZWZzQW5ub3RhdGlvbiAKLQkJCQk9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJcmVmc0Fubm90YXRpb24ucmVtb3ZlWG1sRWxlbWVudFJlZihpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1JFRl9OQU1FLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXROYW1lKFhNTF9FTEVNRU5UX1JFRl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1JFRl9OQU1FLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FICsgIlwiKSkiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudFJlZkFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWZzKEBYbWxFbGVtZW50UmVmKG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UgKyAiXCIpKSIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRSZWZzKEBYbWxFbGVtZW50UmVmKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRSZWZXaXRoVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudFJlZkFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50UmVmQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1JFRl9UWVBFLCB4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy4iICsgWE1MX0VMRU1FTlRfUkVGX1RZUEUsIHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFJlZkFubm90YXRpb24geG1sRWxlbWVudFJlZkFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50UmVmQW5ub3RhdGlvbi5zZXRUeXBlKFhNTF9FTEVNRU5UX1JFRl9UWVBFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9SRUZfVFlQRSwgeG1sRWxlbWVudFJlZkFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50UmVmcyhAWG1sRWxlbWVudFJlZih0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFICArICIuY2xhc3MpKSIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLnNldFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFJlZnMoQFhtbEVsZW1lbnRSZWYpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sRWxlbWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhBbGwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlhZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigxLCByZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCVhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbiByZWZzQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50UmVmc0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9SRUZTKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudFJlZnMoe0BYbWxFbGVtZW50UmVmKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRSAKLQkJCQkJCSsgIlwiLCBuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9SRUZfTkFNRVNQQUNFCi0JCQkJCQkrICJcIiwgdHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9SRUZfVFlQRSAKLQkJCQkJCSsgIi5jbGFzcyksQFhtbEVsZW1lbnRSZWZ9KSIsIGN1KTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKSk7Ci0JCWFzc2VydE5vdE51bGwocmVmc0Fubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVmc0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sRWxlbWVudFJlZlRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50UmVmV2l0aEFsbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCWFkZFhtbEVsZW1lbnRSZWZBbm5vdGF0aW9uKDEsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJWG1sRWxlbWVudFJlZnNBbm5vdGF0aW9uIHJlZnNBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRSZWZzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1JFRlMpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxFbGVtZW50UmVmcyh7QFhtbEVsZW1lbnRSZWYobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FIAotCQkJCQkJKyAiXCIsIG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UKLQkJCQkJCSsgIlwiLCB0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFIAotCQkJCQkJKyAiLmNsYXNzKSxAWG1sRWxlbWVudFJlZn0pIiwgY3UpOwotCQkJCQotCQlhZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigwLCByZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEVsZW1lbnRSZWZzKHtAWG1sRWxlbWVudFJlZixAWG1sRWxlbWVudFJlZihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUUgCi0JCQkJCQkrICJcIiwgbmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRQotCQkJCQkJKyAiXCIsIHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfUkVGX1RZUEUgCi0JCQkJCQkrICIuY2xhc3MpLCBAWG1sRWxlbWVudFJlZn0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfUkVGKSk7Ci0JCWFzc2VydE5vdE51bGwocmVmc0Fubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoMywgcmVmc0Fubm90YXRpb24uZ2V0WG1sRWxlbWVudFJlZnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlWG1sRWxlbWVudFJlZigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFJlZldpdGhBbGwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlhZGRYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigxLCByZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEVsZW1lbnRSZWZzKHtAWG1sRWxlbWVudFJlZihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUUgCi0JCQkJCQkrICJcIiwgbmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfUkVGX05BTUVTUEFDRQotCQkJCQkJKyAiXCIsIHR5cGUgPSAiICsgWE1MX0VMRU1FTlRfUkVGX1RZUEUgCi0JCQkJCQkrICIuY2xhc3MpLEBYbWxFbGVtZW50UmVmfSkiLCBjdSk7Ci0JCQotCQlyZW1vdmVYbWxFbGVtZW50UmVmQW5ub3RhdGlvbigxLCByZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEVsZW1lbnRSZWYobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FIAotCQkJCQkJKyAiXCIsIG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX1JFRl9OQU1FU1BBQ0UKLQkJCQkJCSsgIlwiLCB0eXBlID0gIiArIFhNTF9FTEVNRU5UX1JFRl9UWVBFIAotCQkJCQkJKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOGMzNzUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50V3JhcHBlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRSA9ICJlbGVtZW50TmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRVNQQUNFID0gIlhtbEVsZW1lbnRXcmFwcGVyTmFtZXNwYWNlIjsKLQotCXB1YmxpYyBYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50V3JhcHBlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyV2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXJXaXRoTmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcldpdGhTdHJpbmdFbGVtZW50KCJuYW1lc3BhY2UiLCBYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUVTUEFDRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcldpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50LCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudFdyYXBwZXIoIiArIGVsZW1lbnQgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXJXaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVsZW1lbnRXcmFwcGVyKCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUUsIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLnNldE5hbWUoWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRSwgeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FICsgIlwiKSIsIGN1KTsKLQotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRXcmFwcGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnRXcmFwcGVyKG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyV2l0aE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9XUkFQUEVSX05BTUVTUEFDRSwgeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQl4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uc2V0TmFtZXNwYWNlKFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRVNQQUNFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRVNQQUNFLCB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFdyYXBwZXIobmFtZXNwYWNlID0gXCIiICsgWE1MX0VMRU1FTlRfV1JBUFBFUl9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRXcmFwcGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVsZW1lbnRXcmFwcGVyKG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX1dSQVBQRVJfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmlsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyV2l0aEJvb2xlYW5FbGVtZW50KCJuaWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiB4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24gPSAoWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRfV1JBUFBFUik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5pbGxhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROaWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdyYXBwZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCi0JCWFzc2VydE5vdE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50V3JhcHBlckFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0KLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLnNldE5pbGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldE5pbGxhYmxlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudFdyYXBwZXIobmlsbGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0KLQkJeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLnNldE5pbGxhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRXcmFwcGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibmlsbGFibGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V3JhcHBlcldpdGhCb29sZWFuRWxlbWVudCgicmVxdWlyZWQiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24geG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UX1dSQVBQRVIpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVxdWlyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXcmFwcGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbiA9IChYbWxFbGVtZW50V3JhcHBlckFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVF9XUkFQUEVSKTsKLQotCQlhc3NlcnROb3ROdWxsKHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudFdyYXBwZXJBbm5vdGF0aW9uLmdldFJlcXVpcmVkKCkpOwotCi0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5zZXRSZXF1aXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnRXcmFwcGVyKHJlcXVpcmVkID0gZmFsc2UpIiwgY3UpOwotCi0JCXhtbEVsZW1lbnRXcmFwcGVyQW5ub3RhdGlvbi5zZXRSZXF1aXJlZChudWxsKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50V3JhcHBlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInJlcXVpcmVkIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRzQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbGVtZW50c0Fubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjg1YTBjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVsZW1lbnRzQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVsZW1lbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbGVtZW50c0Fubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRzQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9OQU1FID0gImVsZW1lbnROYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfTkFNRVNQQUNFID0gIlhtbEVsZW1lbnROYW1lc3BhY2UiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFID0gIm15RGVmYXVsdFZhbHVlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfVFlQRSA9ICJTdHJpbmciOwotCQotCQotCXB1YmxpYyBYbWxFbGVtZW50c0Fubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UUywgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudHMoQFhtbEVsZW1lbnQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgWE1MX0VMRU1FTlRfTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoU3RyaW5nRWxlbWVudCgibmFtZXNwYWNlIiwgWE1MX0VMRU1FTlRfTkFNRVNQQUNFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aERlZmF1bHRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhTdHJpbmdFbGVtZW50KCJkZWZhdWx0VmFsdWUiLCBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UUywgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudHMoQFhtbEVsZW1lbnQoIiArIGVsZW1lbnQgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9FTEVNRU5UUywgSkFYQi5YTUxfRUxFTUVOVCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudHMoQFhtbEVsZW1lbnQoIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VMRU1FTlRTLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50cyhAWG1sRWxlbWVudCh0eXBlID0gIiArIFhNTF9FTEVNRU5UX1RZUEUgICsgIi5jbGFzcykpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwcml2YXRlIFhtbEVsZW1lbnRBbm5vdGF0aW9uIGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgewotCQlYbWxFbGVtZW50c0Fubm90YXRpb24gYW5ub3RhdGlvbiAKLQkJCQk9IChYbWxFbGVtZW50c0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVFMpOwotCQlyZXR1cm4gYW5ub3RhdGlvbi54bWxFbGVtZW50QXQoMCk7Ci0JfQotCQotCXByaXZhdGUgWG1sRWxlbWVudEFubm90YXRpb24gYWRkWG1sRWxlbWVudEFubm90YXRpb24oaW50IGluZGV4LCBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJWG1sRWxlbWVudHNBbm5vdGF0aW9uIGFubm90YXRpb24gCi0JCQkJPSAoWG1sRWxlbWVudHNBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlRTKTsKLQkJcmV0dXJuIGFubm90YXRpb24uYWRkWG1sRWxlbWVudChpbmRleCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVYbWxFbGVtZW50QW5ub3RhdGlvbihpbnQgaW5kZXgsIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgewotCQlYbWxFbGVtZW50c0Fubm90YXRpb24gYW5ub3RhdGlvbiAKLQkJCQk9IChYbWxFbGVtZW50c0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVFMpOwotCQlhbm5vdGF0aW9uLnJlbW92ZVhtbEVsZW1lbnQoaW5kZXgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX05BTUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lKFhNTF9FTEVNRU5UX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX05BTUUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIikiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRVNQQUNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxFbGVtZW50QW5ub3RhdGlvbiB4bWxFbGVtZW50QW5ub3RhdGlvbiA9IGdldFhtbEVsZW1lbnRBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0TmFtZXNwYWNlKFhNTF9FTEVNRU5UX05BTUVTUEFDRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfTkFNRVNQQUNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudChuYW1lc3BhY2UgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbGVtZW50KG5hbWVzcGFjZSA9IFwiIiArIFhNTF9FTEVNRU5UX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoRGVmYXVsdFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHhtbEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VMRU1FTlRfREVGQVVMVF9WQUxVRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVmYXVsdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sRWxlbWVudEFubm90YXRpb24geG1sRWxlbWVudEFubm90YXRpb24gPSBnZXRYbWxFbGVtZW50QW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldERlZmF1bHRWYWx1ZSgpKTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldERlZmF1bHRWYWx1ZShYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXREZWZhdWx0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRWxlbWVudChkZWZhdWx0VmFsdWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQkJCi0JCXhtbEVsZW1lbnRBbm5vdGF0aW9uLnNldERlZmF1bHRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudChkZWZhdWx0VmFsdWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9ERUZBVUxUX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5pbGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KCJuaWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROaWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0TmlsbGFibGUoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXROaWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXROaWxsYWJsZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KG5pbGxhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0TmlsbGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuaWxsYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aEJvb2xlYW5FbGVtZW50KCJyZXF1aXJlZCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sRWxlbWVudEFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbik7Ci0JCWFzc2VydE51bGwoeG1sRWxlbWVudEFubm90YXRpb24uZ2V0UmVxdWlyZWQoKSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRSZXF1aXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRSZXF1aXJlZCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbGVtZW50KHJlcXVpcmVkID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0UmVxdWlyZWQobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJyZXF1aXJlZCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVsZW1lbnRXaXRoVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh4bWxFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTEVNRU5UX1RZUEUsIHhtbEVsZW1lbnRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLiIgKyBYTUxfRUxFTUVOVF9UWVBFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRWxlbWVudCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEVsZW1lbnRBbm5vdGF0aW9uIHhtbEVsZW1lbnRBbm5vdGF0aW9uID0gZ2V0WG1sRWxlbWVudEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQkKLQkJeG1sRWxlbWVudEFubm90YXRpb24uc2V0VHlwZShYTUxfRUxFTUVOVF9UWVBFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYTUxfRUxFTUVOVF9UWVBFLCB4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQodHlwZSA9ICIgKyBYTUxfRUxFTUVOVF9UWVBFICArICIuY2xhc3MiLCBjdSk7Ci0JCQotCQl4bWxFbGVtZW50QW5ub3RhdGlvbi5zZXRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxFbGVtZW50QW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEVsZW1lbnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sRWxlbWVudCh0eXBlID0gIiArIFhNTF9FTEVNRU5UX1RZUEUgICsgIi5jbGFzcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFhtbEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlhZGRYbWxFbGVtZW50QW5ub3RhdGlvbigxLCByZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCVhtbEVsZW1lbnRzQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEVsZW1lbnRzQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UUyk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEVsZW1lbnRzKHtAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIiksQFhtbEVsZW1lbnR9KSIsIAotCQkJCWN1KTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VMRU1FTlQpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFubm90YXRpb24uZ2V0WG1sRWxlbWVudHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkWG1sRWxlbWVudFRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sRWxlbWVudFdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJYWRkWG1sRWxlbWVudEFubm90YXRpb24oMSwgcmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlYbWxFbGVtZW50c0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxFbGVtZW50c0Fubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfRUxFTUVOVFMpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxFbGVtZW50cyh7QFhtbEVsZW1lbnQobmFtZSA9IFwiIiArIFhNTF9FTEVNRU5UX05BTUUgKyAiXCIpLEBYbWxFbGVtZW50fSkiLCAKLQkJCQljdSk7Ci0JCQkJCi0JCWFkZFhtbEVsZW1lbnRBbm5vdGF0aW9uKDAsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudHMoe0BYbWxFbGVtZW50LEBYbWxFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfRUxFTUVOVF9OQU1FICsgIlwiKSwgQFhtbEVsZW1lbnR9KSIsIAotCQkJCWN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTEVNRU5UKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygzLCBhbm5vdGF0aW9uLmdldFhtbEVsZW1lbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVhtbEVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxFbGVtZW50V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlhZGRYbWxFbGVtZW50QW5ub3RhdGlvbigxLCByZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEVsZW1lbnRzKHtAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIiksQFhtbEVsZW1lbnR9KSIsIAotCQkJCWN1KTsKLQkJCi0JCXJlbW92ZVhtbEVsZW1lbnRBbm5vdGF0aW9uKDEsIHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sRWxlbWVudChuYW1lID0gXCIiICsgWE1MX0VMRU1FTlRfTkFNRSArICJcIikiLCAKLQkJCQljdSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVudW1Bbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVudW1Bbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkMGQ2Mi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxFbnVtQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxFbnVtQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sRW51bUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU5VTV9KQVZBX1RZUEUgPSAiU3RyaW5nIjsKLQotCXB1YmxpYyBYbWxFbnVtQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRW51bSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0RW51bShuZXcgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VOVU0pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFbnVtQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbnVtIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRW51bVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0RW51bShuZXcgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VOVU0pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFbnVtQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbnVtKHZhbHVlID0gIiArIFhNTF9FTlVNX0pBVkFfVFlQRSAgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRW51bSgpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VFbnVtKGN1KTsgCi0KLQkJWG1sRW51bUFubm90YXRpb24geG1sRW51bUFubm90YXRpb24gPSAoWG1sRW51bUFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU0pOwotCQlhc3NlcnRUcnVlKHhtbEVudW1Bbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVudW1Bbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRW51bVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VFbnVtIHJlc291cmNlRW51bSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VFbnVtKGN1KTsgCi0KLQkJWG1sRW51bUFubm90YXRpb24geG1sRW51bUFubm90YXRpb24gPSAoWG1sRW51bUFubm90YXRpb24pIHJlc291cmNlRW51bS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU0pOwotCQlhc3NlcnRUcnVlKHhtbEVudW1Bbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX0VOVU1fSkFWQV9UWVBFLCB4bWxFbnVtQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuIiArIFhNTF9FTlVNX0pBVkFfVFlQRSwgeG1sRW51bUFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZUNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEVudW0oKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlRW51bShjdSk7IAotCi0JCVhtbEVudW1Bbm5vdGF0aW9uIHhtbEVudW1Bbm5vdGF0aW9uID0gKFhtbEVudW1Bbm5vdGF0aW9uKSByZXNvdXJjZUVudW0uZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbnVtQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJeG1sRW51bUFubm90YXRpb24uc2V0VmFsdWUoWE1MX0VOVU1fSkFWQV9UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTlVNX0pBVkFfVFlQRSwgeG1sRW51bUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbnVtKCIgKyBYTUxfRU5VTV9KQVZBX1RZUEUgICsgIi5jbGFzcykiLCBjdSk7Ci0KLQkJeG1sRW51bUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sRW51bUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxFbnVtIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEVudW1WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bVZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MjllMzcuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sRW51bVZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUVudW1Db25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEVudW1WYWx1ZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEVudW1WYWx1ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VOVU1fVkFMVUVfVkFMVUUgPSAibXlFbnVtVmFsdWUiOwotCi0JcHVibGljIFhtbEVudW1WYWx1ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVudW1WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0RW51bShuZXcgRGVmYXVsdEVudW1Bbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTdW5kYXlFbnVtQ29uc3RhbnRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEVudW1WYWx1ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEVudW1WYWx1ZVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sRW51bVZhbHVlV2l0aFN0cmluZ0VsZW1lbnQoInZhbHVlIiwgWE1MX0VOVU1fVkFMVUVfVkFMVUUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sRW51bVZhbHVlV2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RFbnVtKG5ldyBEZWZhdWx0RW51bUFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFN1bmRheUVudW1Db25zdGFudEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRW51bVZhbHVlKCIgKyBlbGVtZW50ICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sRW51bVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbnVtVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBidWlsZEphdmFSZXNvdXJjZUVudW0oY3UpOyAKLQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudCA9IGdldEVudW1Db25zdGFudChyZXNvdXJjZUVudW0sIDApOwotCi0JCVhtbEVudW1WYWx1ZUFubm90YXRpb24geG1sRW51bVZhbHVlQW5ub3RhdGlvbiA9IChYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKSBlbnVtQ29uc3RhbnQuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbnVtVmFsdWVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCWVudW1Db25zdGFudC5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0VOVU1fVkFMVUUpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbEVudW1WYWx1ZSIsIGN1KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sRW51bVZhbHVlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZUVudW0gcmVzb3VyY2VFbnVtID0gYnVpbGRKYXZhUmVzb3VyY2VFbnVtKGN1KTsgCi0JCUphdmFSZXNvdXJjZUVudW1Db25zdGFudCBlbnVtQ29uc3RhbnQgPSBnZXRFbnVtQ29uc3RhbnQocmVzb3VyY2VFbnVtLCAwKTsKLQotCQlYbWxFbnVtVmFsdWVBbm5vdGF0aW9uIHhtbEVudW1WYWx1ZUFubm90YXRpb24gPSAoWG1sRW51bVZhbHVlQW5ub3RhdGlvbikgZW51bUNvbnN0YW50LmdldEFubm90YXRpb24oSkFYQi5YTUxfRU5VTV9WQUxVRSk7Ci0JCWFzc2VydFRydWUoeG1sRW51bVZhbHVlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTlVNX1ZBTFVFX1ZBTFVFLCB4bWxFbnVtVmFsdWVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbnVtVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBidWlsZEphdmFSZXNvdXJjZUVudW0oY3UpOyAKLQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudCA9IGdldEVudW1Db25zdGFudChyZXNvdXJjZUVudW0sIDApOwotCi0JCVhtbEVudW1WYWx1ZUFubm90YXRpb24geG1sRW51bVZhbHVlQW5ub3RhdGlvbiA9IChYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKSBlbnVtQ29uc3RhbnQuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxFbnVtVmFsdWVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVudW1WYWx1ZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxFbnVtVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlRW51bSByZXNvdXJjZUVudW0gPSBidWlsZEphdmFSZXNvdXJjZUVudW0oY3UpOyAKLQkJSmF2YVJlc291cmNlRW51bUNvbnN0YW50IGVudW1Db25zdGFudCA9IGdldEVudW1Db25zdGFudChyZXNvdXJjZUVudW0sIDApOwotCi0JCVhtbEVudW1WYWx1ZUFubm90YXRpb24geG1sRW51bVZhbHVlQW5ub3RhdGlvbiA9IChYbWxFbnVtVmFsdWVBbm5vdGF0aW9uKSBlbnVtQ29uc3RhbnQuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9FTlVNX1ZBTFVFKTsKLQkJYXNzZXJ0TnVsbCh4bWxFbnVtVmFsdWVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQl4bWxFbnVtVmFsdWVBbm5vdGF0aW9uLnNldFZhbHVlKFhNTF9FTlVNX1ZBTFVFX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9FTlVNX1ZBTFVFX1ZBTFVFLCB4bWxFbnVtVmFsdWVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sRW51bVZhbHVlKFwiIiArIFhNTF9FTlVNX1ZBTFVFX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQotCQl4bWxFbnVtVmFsdWVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEVudW1WYWx1ZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxFbnVtVmFsdWUoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJREFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEzYzZlLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElEQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJREFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbElEQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbElEQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSUQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSUQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbElEKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxJRCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sSURBbm5vdGF0aW9uIHhtbElEQW5ub3RhdGlvbiA9IChYbWxJREFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSUQpOwotCQlhc3NlcnRUcnVlKHhtbElEQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0lEKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxJRCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJRFJFRkFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSURSRUZBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhhYWNiNC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJRFJFRkFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSURSRUZBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxJRFJFRkFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxJRFJFRkFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbElEUkVGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9JRFJFRik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbElEUkVGIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxJRFJFRigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sSURSRUYoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbElEUkVGQW5ub3RhdGlvbiB4bWxJRFJFRkFubm90YXRpb24gPSAoWG1sSURSRUZBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lEUkVGKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxJRFJFRkFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9JRFJFRik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sSURSRUYiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW5saW5lQmluYXJ5RGF0YUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW5saW5lQmluYXJ5RGF0YUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2FkMjgyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sSW5saW5lQmluYXJ5RGF0YUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxJbmxpbmVCaW5hcnlEYXRhQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSW5saW5lQmluYXJ5RGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfSU5MSU5FX0JJTkFSWV9EQVRBKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbElubGluZUJpbmFyeURhdGEiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbElubGluZUJpbmFyeURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbElubGluZUJpbmFyeURhdGEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSB0aGlzLmdldE1ldGhvZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uIHhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uID0gKFhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQSk7Ci0JCWFzc2VydFRydWUoeG1sSW5saW5lQmluYXJ5RGF0YUFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJcmVzb3VyY2VNZXRob2QucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbElubGluZUJpbmFyeURhdGEiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW5saW5lQmluYXJ5RGF0YVR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbElubGluZUJpbmFyeURhdGFUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZDk0Y2IuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSW5saW5lQmluYXJ5RGF0YVR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbElubGluZUJpbmFyeURhdGFBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxJbmxpbmVCaW5hcnlEYXRhVHlwZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxJbmxpbmVCaW5hcnlEYXRhVHlwZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbElubGluZUJpbmFyeURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0lOTElORV9CSU5BUllfREFUQSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbElubGluZUJpbmFyeURhdGEiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbElubGluZUJpbmFyeURhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbElubGluZUJpbmFyeURhdGEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbiB4bWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbiA9IChYbWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfSU5MSU5FX0JJTkFSWV9EQVRBKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxJbmxpbmVCaW5hcnlEYXRhQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9JTkxJTkVfQklOQVJZX0RBVEEpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbElubGluZUJpbmFyeURhdGEiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGVhYjQwLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEphdmFUeXBlQWRhcHRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sSmF2YVR5cGVBZGFwdGVyUGFja2FnZUFubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTUyA9ICJUZXN0Q2xhc3MiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTXzIgPSAiVGVzdENsYXNzMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZRX1RFU1RfQ0xBU1MgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBURVNUX0NMQVNTOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUV9URVNUX0NMQVNTXzIgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBURVNUX0NMQVNTXzI7Ci0JCi0JCi0JcHVibGljIFhtbEphdmFUeXBlQWRhcHRlclBhY2thZ2VBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0Q2xhc3MoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKFRFU1RfQ0xBU1MpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIFRFU1RfQ0xBU1MgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdENsYXNzMigpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoVEVTVF9DTEFTU18yKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBURVNUX0NMQVNTXzIgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVyIiwKLQkJCQlKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhKYXZhVHlwZUFkYXB0ZXJBbmRWYWx1ZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdENsYXNzKCk7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsCi0JCQkJSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIsIEZRX1RFU1RfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoSmF2YVR5cGVBZGFwdGVyQW5kVHlwZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdENsYXNzKCk7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLAotCQkJCUpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSLCBGUV9URVNUX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEphdmFUeXBlQWRhcHRlcnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHtAWG1sSmF2YVR5cGVBZGFwdGVyLEBYbWxKYXZhVHlwZUFkYXB0ZXJ9KSIsCi0JCQkJSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVJTLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWYWx1ZSgpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoSmF2YVR5cGVBZGFwdGVyQW5kVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJY3JlYXRlVGVzdENsYXNzMigpOwotCQkKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoVEVTVF9DTEFTU18yKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTU18yICsgIi5jbGFzcykiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKFRFU1RfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFR5cGUoKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEphdmFUeXBlQWRhcHRlckFuZFR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJY3JlYXRlVGVzdENsYXNzMigpOwotCQkKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVyKHR5cGUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRUeXBlKFRFU1RfQ0xBU1NfMik7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTXzIsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVyKHR5cGUgPSAiICsgVEVTVF9DTEFTU18yICsgIi5jbGFzcykiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlV2l0aFZhbHVlKCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aEphdmFUeXBlQWRhcHRlckFuZFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0JCWNyZWF0ZVRlc3RDbGFzczIoKTsKLQkJCi0JCVhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTU18yKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTXzIsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIodmFsdWUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MsIHR5cGUgPSAiICsgVEVTVF9DTEFTU18yICsgIi5jbGFzcykiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcih0eXBlID0gIiArIFRFU1RfQ0xBU1NfMiArICIuY2xhc3MpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZShURVNUX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTXzIsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZSA9ICIgKyBURVNUX0NMQVNTXzIgKyAiLmNsYXNzLCB2YWx1ZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbmVkV2l0aFZhbHVlKCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IGNvbnRhaW5lZCBhbm5vdGF0aW9uIHZhbHVlIHNldHRpbmcvdXBkYXRpbmcKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsKLQkJY3JlYXRlVGVzdENsYXNzKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFkYXB0ZXJBbm5vdGF0aW9uID0gCi0JCQkoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkKLQkJYWRhcHRlckFubm90YXRpb24uc2V0VmFsdWUoVEVTVF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVycyh7QFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpLEBYbWxKYXZhVHlwZUFkYXB0ZXJ9KSIsIGN1KTsKLQkJCi0JCWFkYXB0ZXJBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGFkYXB0ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKEZRX1RFU1RfQ0xBU1MsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVycyh7QFhtbEphdmFUeXBlQWRhcHRlcixAWG1sSmF2YVR5cGVBZGFwdGVyfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluZWRXaXRoVHlwZSgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBjb250YWluZWQgYW5ub3RhdGlvbiB0eXBlIHNldHRpbmcvdXBkYXRpbmcKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhKYXZhVHlwZUFkYXB0ZXJzKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsKLQkJY3JlYXRlVGVzdENsYXNzKCk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFkYXB0ZXJBbm5vdGF0aW9uID0gCi0JCQkoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQkKLQkJYWRhcHRlckFubm90YXRpb24uc2V0VHlwZShURVNUX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVycyh7QFhtbEphdmFUeXBlQWRhcHRlcixAWG1sSmF2YVR5cGVBZGFwdGVyKHR5cGUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZVBhY2thZ2UubW92ZUFubm90YXRpb24oMCwgMSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhZGFwdGVyQW5ub3RhdGlvbiA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhZGFwdGVyQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYWRhcHRlckFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbEphdmFUeXBlQWRhcHRlcnMoe0BYbWxKYXZhVHlwZUFkYXB0ZXIodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcyksQFhtbEphdmFUeXBlQWRhcHRlcn0pIiwgY3UpOwotCQkKLQkJYWRhcHRlckFubm90YXRpb24uc2V0VHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhZGFwdGVyQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKEZRX1RFU1RfQ0xBU1MsIGFkYXB0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHtAWG1sSmF2YVR5cGVBZGFwdGVyLEBYbWxKYXZhVHlwZUFkYXB0ZXJ9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBhZGRpbmcvcmVtb3ZpbmcvbW92aW5nCi0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsKLQkJY3JlYXRlVGVzdENsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RDbGFzczIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCQotCQlyZXNvdXJjZVBhY2thZ2UuYWRkQW5ub3RhdGlvbigxLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sSmF2YVR5cGVBZGFwdGVycyh7IEBYbWxKYXZhVHlwZUFkYXB0ZXIsIEBYbWxKYXZhVHlwZUFkYXB0ZXIgfSkiLCBjdSk7Ci0JCQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIGFkYXB0ZXJBbm5vdGF0aW9uMSA9IChYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFkYXB0ZXJBbm5vdGF0aW9uMS5zZXRWYWx1ZShURVNUX0NMQVNTKTsKLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiBhZGFwdGVyQW5ub3RhdGlvbjIgPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMSwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhZGFwdGVyQW5ub3RhdGlvbjIuc2V0VmFsdWUoVEVTVF9DTEFTU18yKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxKYXZhVHlwZUFkYXB0ZXJzKHsgQFhtbEphdmFUeXBlQWRhcHRlcigiICsgVEVTVF9DTEFTUwotCQkJCQkrICIuY2xhc3MpLCBAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTXzIKLQkJCQkJKyAiLmNsYXNzKSB9KSIsIGN1KTsKLQkJCi0JCXJlc291cmNlUGFja2FnZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVycyh7IEBYbWxKYXZhVHlwZUFkYXB0ZXIoIiArIFRFU1RfQ0xBU1NfMgotCQkJCQkrICIuY2xhc3MpLCBAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTCi0JCQkJCSsgIi5jbGFzcykgfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZVBhY2thZ2UucmVtb3ZlQW5ub3RhdGlvbigwLCBKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sSmF2YVR5cGVBZGFwdGVycyIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxKYXZhVHlwZUFkYXB0ZXJUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MGZlYjAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sSmF2YVR5cGVBZGFwdGVyVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbEphdmFUeXBlQWRhcHRlclR5cGVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0pBVkFfVFlQRV9BREFQVEVSX0NMQVNTID0gIk15QWRhcHRlckNsYXNzIjsKLQotCXB1YmxpYyBYbWxKYXZhVHlwZUFkYXB0ZXJUeXBlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSmF2YVR5cGVBZGFwdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9KQVZBX1RZUEVfQURBUFRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEphdmFUeXBlQWRhcHRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEphdmFUeXBlQWRhcHRlcldpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RBZGFwdGVyQ2xhc3MoKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSmF2YVR5cGVBZGFwdGVyKHZhbHVlID0gIiArIFhNTF9KQVZBX1RZUEVfQURBUFRFUl9DTEFTUyAgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEFkYXB0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChYTUxfSkFWQV9UWVBFX0FEQVBURVJfQ0xBU1MpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJNeUFkYXB0ZXJDbGFzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sSmF2YVR5cGVBZGFwdGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxKYXZhVHlwZUFkYXB0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnRUcnVlKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfSkFWQV9UWVBFX0FEQVBURVJfQ0xBU1MsIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC4iICsgWE1MX0pBVkFfVFlQRV9BREFQVEVSX0NMQVNTLCB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxKYXZhVHlwZUFkYXB0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uIHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24gPSAoWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfSkFWQV9UWVBFX0FEQVBURVIpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCXhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uc2V0VmFsdWUoWE1MX0pBVkFfVFlQRV9BREFQVEVSX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9KQVZBX1RZUEVfQURBUFRFUl9DTEFTUywgeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEphdmFUeXBlQWRhcHRlcigiICsgWE1MX0pBVkFfVFlQRV9BREFQVEVSX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sSmF2YVR5cGVBZGFwdGVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbiB4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uID0gKFhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX0pBVkFfVFlQRV9BREFQVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9KQVZBX1RZUEVfQURBUFRFUl9DTEFTUywgeG1sSmF2YVR5cGVBZGFwdGVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQl4bWxKYXZhVHlwZUFkYXB0ZXJBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbEphdmFUeXBlQWRhcHRlckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxKYXZhVHlwZUFkYXB0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sSmF2YVR5cGVBZGFwdGVyKCIgKyBYTUxfSkFWQV9UWVBFX0FEQVBURVJfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxMaXN0QW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMWE5MDQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTGlzdEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sTGlzdEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbExpc3RBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWG1sTGlzdEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX0xJU1QpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxMaXN0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxMaXN0KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxMaXN0QW5ub3RhdGlvbiB4bWxMaXN0QW5ub3RhdGlvbiA9IChYbWxMaXN0QW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9MSVNUKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxMaXN0QW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX0xJU1QpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbExpc3QiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTWltZVR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1pbWVUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDg3OGMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sTWltZVR5cGVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaW1lVHlwZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbE1pbWVUeXBlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9NSU1FX1RZUEVfVkFMVUUgPSAibXlNaW1lVHlwZSI7Ci0KLQlwdWJsaWMgWG1sTWltZVR5cGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxNaW1lVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfTUlNRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sTWltZVR5cGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxNaW1lVHlwZVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0WG1sTWltZVR5cGVXaXRoU3RyaW5nRWxlbWVudCgidmFsdWUiLCBYTUxfTUlNRV9UWVBFX1ZBTFVFKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbE1pbWVUeXBlV2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnQsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9NSU1FX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxNaW1lVHlwZSgiICsgZWxlbWVudCArICIgPSBcIiIgKyB2YWx1ZSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbE1pbWVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxNaW1lVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sTWltZVR5cGVBbm5vdGF0aW9uIHhtbE1pbWVUeXBlQW5ub3RhdGlvbiA9IChYbWxNaW1lVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlNRV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNaW1lVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9NSU1FX1RZUEUpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbE1pbWVUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sTWltZVR5cGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbE1pbWVUeXBlQW5ub3RhdGlvbiB4bWxNaW1lVHlwZUFubm90YXRpb24gPSAoWG1sTWltZVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JTUVfVFlQRSk7Ci0JCWFzc2VydFRydWUoeG1sTWltZVR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX01JTUVfVFlQRV9WQUxVRSwgeG1sTWltZVR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxNaW1lVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sTWltZVR5cGVBbm5vdGF0aW9uIHhtbE1pbWVUeXBlQW5ub3RhdGlvbiA9IChYbWxNaW1lVHlwZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlNRV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxNaW1lVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sTWltZVR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sTWltZVR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCi0JCVhtbE1pbWVUeXBlQW5ub3RhdGlvbiB4bWxNaW1lVHlwZUFubm90YXRpb24gPSAoWG1sTWltZVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX01JTUVfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sTWltZVR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQl4bWxNaW1lVHlwZUFubm90YXRpb24uc2V0VmFsdWUoWE1MX01JTUVfVFlQRV9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfTUlNRV9UWVBFX1ZBTFVFLCB4bWxNaW1lVHlwZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxNaW1lVHlwZShcIiIgKyBYTUxfTUlNRV9UWVBFX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQotCQl4bWxNaW1lVHlwZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sTWltZVR5cGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sTWltZVR5cGUoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1peGVkQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxNaXhlZEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTllODY4Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbE1peGVkQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxNaXhlZEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbE1peGVkQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFhtbE1peGVkQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sTWl4ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX01JWEVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sTWl4ZWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbE1peGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxNaXhlZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sTWl4ZWRBbm5vdGF0aW9uIHhtbE1peGVkQW5ub3RhdGlvbiA9IChYbWxNaXhlZEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSkFYQi5YTUxfTUlYRUQpOwotCQlhc3NlcnRUcnVlKHhtbE1peGVkQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpBWEIuWE1MX01JWEVEKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxNaXhlZCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSZWdpc3RyeUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUmVnaXN0cnlBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3YjM2Yi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxSZWdpc3RyeUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sUmVnaXN0cnlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBYbWxSZWdpc3RyeUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxSZWdpc3RyeUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFJlZ2lzdHJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFJlZ2lzdHJ5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRYbWxSZWdpc3RyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sUmVnaXN0cnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxSZWdpc3RyeUFubm90YXRpb24geG1sUmVnaXN0cnlBbm5vdGF0aW9uID0gKFhtbFJlZ2lzdHJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfUkVHSVNUUlkpOwotCQlhc3NlcnRUcnVlKHhtbFJlZ2lzdHJ5QW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9SRUdJU1RSWSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sUmVnaXN0cnkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFJvb3RFbGVtZW50QW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjYzNjAuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxSb290RWxlbWVudEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ST09UX0VMRU1FTlRfTkFNRSA9ICJYbWxSb290RWxlbWVudE5hbWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUk9PVF9FTEVNRU5UX05BTUVTUEFDRSA9ICJYbWxSb290RWxlbWVudE5hbWVzcGFjZSI7Ci0KLQlwdWJsaWMgWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxSb290RWxlbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUm9vdEVsZW1lbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxSb290RWxlbWVudFdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxSb290RWxlbWVudChuYW1lID0gXCIiICsgWE1MX1JPT1RfRUxFTUVOVF9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFJvb3RFbGVtZW50V2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUm9vdEVsZW1lbnQobmFtZXNwYWNlID0gXCIiICsgWE1MX1JPT1RfRUxFTUVOVF9OQU1FU1BBQ0UgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxSb290RWxlbWVudFdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydFRydWUoeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1JPT1RfRUxFTUVOVF9OQU1FLCB4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxSb290RWxlbWVudEFubm90YXRpb24geG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxSb290RWxlbWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sUm9vdEVsZW1lbnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxSb290RWxlbWVudEFubm90YXRpb24geG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uID0gKFhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfUk9PVF9FTEVNRU5UKTsKLQkJYXNzZXJ0TnVsbCh4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLnNldE5hbWUoWE1MX1JPT1RfRUxFTUVOVF9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9ST09UX0VMRU1FTlRfTkFNRSwgeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxSb290RWxlbWVudChuYW1lID0gXCIiICsgWE1MX1JPT1RfRUxFTUVOVF9OQU1FICsgIlwiKSIsIGN1KTsKLQotCQl4bWxSb290RWxlbWVudEFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFJvb3RFbGVtZW50IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFJvb3RFbGVtZW50KG5hbWUgPSBcIiIgKyBYTUxfUk9PVF9FTEVNRU5UX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFJvb3RFbGVtZW50V2l0aE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiB4bWxSb290RWxlbWVudEFubm90YXRpb24gPSAoWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9ST09UX0VMRU1FTlQpOwotCQlhc3NlcnRUcnVlKHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9ST09UX0VMRU1FTlRfTkFNRVNQQUNFLCB4bWxSb290RWxlbWVudEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFJvb3RFbGVtZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uIHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbiA9IChYbWxSb290RWxlbWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1JPT1RfRUxFTUVOVCk7Ci0JCWFzc2VydE51bGwoeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShYTUxfUk9PVF9FTEVNRU5UX05BTUVTUEFDRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfUk9PVF9FTEVNRU5UX05BTUVTUEFDRSwgeG1sUm9vdEVsZW1lbnRBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFJvb3RFbGVtZW50KG5hbWVzcGFjZSA9IFwiIiArIFhNTF9ST09UX0VMRU1FTlRfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQotCQl4bWxSb290RWxlbWVudEFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbFJvb3RFbGVtZW50QW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxSb290RWxlbWVudCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxSb290RWxlbWVudChuYW1lc3BhY2UgPSBcIiIgKyBYTUxfUk9PVF9FTEVNRU5UX05BTUVTUEFDRSArICJcIikiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE0YmJkMi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxOc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbE5zRm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sU2NoZW1hQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0xPQ0FUSU9OID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdGVzdC9zY2hlbWEueHNkIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy90ZXN0L3NjaGVtYSI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJFRklYID0gInRzIjsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OQU1FU1BBQ0VfMiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3Rlc3Qvc2NoZW1hMiI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJFRklYXzIgPSAidHMyIjsKLQkKLQkKLQlwdWJsaWMgWG1sU2NoZW1hQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kQXR0cmlidXRlRm9ybURlZmF1bHQoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWEoYXR0cmlidXRlRm9ybURlZmF1bHQgPSBYbWxOc0Zvcm0uUVVBTElGSUVEKSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BLCBKQVhCLlhNTF9OU19GT1JNKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZEVsZW1lbnRGb3JtRGVmYXVsdCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYShlbGVtZW50Rm9ybURlZmF1bHQgPSBYbWxOc0Zvcm0uUVVBTElGSUVEKSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BLCBKQVhCLlhNTF9OU19GT1JNKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZExvY2F0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hKGxvY2F0aW9uID0gXCIiICsgVEVTVF9MT0NBVElPTiArICJcIikiLAotCQkJCUpBWEIuWE1MX1NDSEVNQSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFBbmROYW1lc3BhY2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWEobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUEpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kWG1sbnMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0UGFja2FnZUluZm8oCi0JCQkJIkBYbWxTY2hlbWEoeG1sbnMgPSBAWG1sTnMpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUEsIEpBWEIuWE1MX05TKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZFhtbG5zV2l0aE5hbWVzcGFjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYSh4bWxucyA9IEBYbWxOcyhuYW1lc3BhY2VVUkkgPSBcIiIgKyBURVNUX05BTUVTUEFDRSArICJcIikpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUEsIEpBWEIuWE1MX05TKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZFhtbG5zV2l0aFByZWZpeCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYSh4bWxucyA9IEBYbWxOcyhwcmVmaXggPSBcIiIgKyBURVNUX1BSRUZJWCArICJcIikpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUEsIEpBWEIuWE1MX05TKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkgCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFBbmRBdHRyaWJ1dGVGb3JtRGVmYXVsdCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHBhY2thZ2VSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQkKLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydFRydWUoc2NoZW1hQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gWG1sTnNGb3JtLlFVQUxJRklFRCkiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLnNldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KFhtbE5zRm9ybS5VTlFVQUxJRklFRCk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0QXR0cmlidXRlRm9ybURlZmF1bHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGF0dHJpYnV0ZUZvcm1EZWZhdWx0ID0gVU5RVUFMSUZJRUQpIiwgY3UpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXRBdHRyaWJ1dGVGb3JtRGVmYXVsdChYbWxOc0Zvcm0uVU5TRVQpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlVOU0VULCBzY2hlbWFBbm5vdGF0aW9uLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYShhdHRyaWJ1dGVGb3JtRGVmYXVsdCA9IFVOU0VUKSIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24uc2V0QXR0cmlidXRlRm9ybURlZmF1bHQobnVsbCk7Ci0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWFBbm5vdGF0aW9uLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFNjaGVtYSgiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCXNjaGVtYUFubm90YXRpb24uc2V0QXR0cmlidXRlRm9ybURlZmF1bHQoWG1sTnNGb3JtLlFVQUxJRklFRCk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uUVVBTElGSUVELCBzY2hlbWFBbm5vdGF0aW9uLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYShhdHRyaWJ1dGVGb3JtRGVmYXVsdCA9IFFVQUxJRklFRCkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbGVtZW50Rm9ybURlZmF1bHQoKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZEVsZW1lbnRGb3JtRGVmYXVsdCgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHBhY2thZ2VSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQkKLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydFRydWUoc2NoZW1hQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYShlbGVtZW50Rm9ybURlZmF1bHQgPSBYbWxOc0Zvcm0uUVVBTElGSUVEKSIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24uc2V0RWxlbWVudEZvcm1EZWZhdWx0KFhtbE5zRm9ybS5VTlFVQUxJRklFRCk7Ci0JCWFzc2VydEVxdWFscyhYbWxOc0Zvcm0uVU5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYShlbGVtZW50Rm9ybURlZmF1bHQgPSBVTlFVQUxJRklFRCkiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLnNldEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0uVU5TRVQpOwotCQlhc3NlcnRFcXVhbHMoWG1sTnNGb3JtLlVOU0VULCBzY2hlbWFBbm5vdGF0aW9uLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWEoZWxlbWVudEZvcm1EZWZhdWx0ID0gVU5TRVQpIiwgY3UpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXRFbGVtZW50Rm9ybURlZmF1bHQobnVsbCk7Ci0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0TnVsbChzY2hlbWFBbm5vdGF0aW9uLmdldEVsZW1lbnRGb3JtRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxTY2hlbWEoIiwgY3UpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlzY2hlbWFBbm5vdGF0aW9uLnNldEVsZW1lbnRGb3JtRGVmYXVsdChYbWxOc0Zvcm0uUVVBTElGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKFhtbE5zRm9ybS5RVUFMSUZJRUQsIHNjaGVtYUFubm90YXRpb24uZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYShlbGVtZW50Rm9ybURlZmF1bHQgPSBRVUFMSUZJRUQpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb24oKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZExvY2F0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0JCQotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWFBbm5vdGF0aW9uLmdldExvY2F0aW9uKCkpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXRMb2NhdGlvbihudWxsKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnROdWxsKHNjaGVtYUFubm90YXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sU2NoZW1hKCIsIGN1KTsKLQkJCi0JCXNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmFkZEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJc2NoZW1hQW5ub3RhdGlvbi5zZXRMb2NhdGlvbihURVNUX0xPQ0FUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTE9DQVRJT04sIHNjaGVtYUFubm90YXRpb24uZ2V0TG9jYXRpb24oKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hKGxvY2F0aW9uID0gXCIiICsgVEVTVF9MT0NBVElPTiArICJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lc3BhY2UoKSAKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYUFuZE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHBhY2thZ2VSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCQkKLQkJWG1sU2NoZW1hQW5ub3RhdGlvbiBzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnROdWxsKHNjaGVtYUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFNjaGVtYSgiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uID0gKFhtbFNjaGVtYUFubm90YXRpb24pIHBhY2thZ2VSZXNvdXJjZS5hZGRBbm5vdGF0aW9uKEpBWEIuWE1MX1NDSEVNQSk7Ci0JCXNjaGVtYUFubm90YXRpb24uc2V0TmFtZXNwYWNlKFRFU1RfTkFNRVNQQUNFKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRVNQQUNFLCBzY2hlbWFBbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWEobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0WG1sbnNOYW1lc3BhY2UoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kWG1sbnNXaXRoTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0JCQotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJWG1sTnNBbm5vdGF0aW9uIHhtbG5zQW5ub3RhdGlvbiA9IHNjaGVtYUFubm90YXRpb24ueG1sbnNBdCgwKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxuc0Fubm90YXRpb24uZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQkKLQkJeG1sbnNBbm5vdGF0aW9uLnNldE5hbWVzcGFjZVVSSShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxuc0Fubm90YXRpb24uZ2V0TmFtZXNwYWNlVVJJKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYSh4bWxucyA9IEBYbWxOcykiLCBjdSk7Ci0JCQotCQl4bWxuc0Fubm90YXRpb24uc2V0TmFtZXNwYWNlVVJJKFRFU1RfTkFNRVNQQUNFXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0VfMiwgeG1sbnNBbm5vdGF0aW9uLmdldE5hbWVzcGFjZVVSSSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWEoeG1sbnMgPSBAWG1sTnMobmFtZXNwYWNlVVJJID0gXCIiICsgVEVTVF9OQU1FU1BBQ0VfMiArICJcIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0WG1sbnNQcmVmaXgoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kWG1sbnNXaXRoUHJlZml4KCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0JCQotCQlYbWxTY2hlbWFBbm5vdGF0aW9uIHNjaGVtYUFubm90YXRpb24gPSAoWG1sU2NoZW1hQW5ub3RhdGlvbikgcGFja2FnZVJlc291cmNlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0NIRU1BKTsKLQkJWG1sTnNBbm5vdGF0aW9uIHhtbG5zQW5ub3RhdGlvbiA9IHNjaGVtYUFubm90YXRpb24ueG1sbnNBdCgwKTsKLQkJYXNzZXJ0Tm90TnVsbCh4bWxuc0Fubm90YXRpb24uZ2V0UHJlZml4KCkpOwotCQkKLQkJeG1sbnNBbm5vdGF0aW9uLnNldFByZWZpeChudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxuc0Fubm90YXRpb24uZ2V0UHJlZml4KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYSh4bWxucyA9IEBYbWxOcykiLCBjdSk7Ci0JCQotCQl4bWxuc0Fubm90YXRpb24uc2V0UHJlZml4KFRFU1RfUFJFRklYXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9QUkVGSVhfMiwgeG1sbnNBbm5vdGF0aW9uLmdldFByZWZpeCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWEoeG1sbnMgPSBAWG1sTnMocHJlZml4ID0gXCIiICsgVEVTVF9QUkVGSVhfMiArICJcIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0WG1sbnMoKQotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hQW5kWG1sbnMoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSBwYWNrYWdlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOyAKLQkJCi0JCVhtbFNjaGVtYUFubm90YXRpb24gc2NoZW1hQW5ub3RhdGlvbiA9IChYbWxTY2hlbWFBbm5vdGF0aW9uKSBwYWNrYWdlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TQ0hFTUEpOwotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShzY2hlbWFBbm5vdGF0aW9uLmdldFhtbG5zKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnNTaXplKCkpOwotCQkKLQkJc2NoZW1hQW5ub3RhdGlvbi5hZGRYbWxucygxKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNjaGVtYUFubm90YXRpb24uZ2V0WG1sbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYSh4bWxucyA9IHtAWG1sTnMsQFhtbE5zfSkiLCBjdSk7Ci0JCQotCQlYbWxOc0Fubm90YXRpb24geG1sbnNBbm5vdGF0aW9uMSA9IHNjaGVtYUFubm90YXRpb24ueG1sbnNBdCgwKTsKLQkJeG1sbnNBbm5vdGF0aW9uMS5zZXROYW1lc3BhY2VVUkkoVEVTVF9OQU1FU1BBQ0UpOwotCQl4bWxuc0Fubm90YXRpb24xLnNldFByZWZpeChURVNUX1BSRUZJWCk7Ci0JCVhtbE5zQW5ub3RhdGlvbiB4bWxuc0Fubm90YXRpb24yID0gc2NoZW1hQW5ub3RhdGlvbi54bWxuc0F0KDEpOwotCQl4bWxuc0Fubm90YXRpb24yLnNldE5hbWVzcGFjZVVSSShURVNUX05BTUVTUEFDRV8yKTsKLQkJeG1sbnNBbm5vdGF0aW9uMi5zZXRQcmVmaXgoVEVTVF9QUkVGSVhfMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hKHhtbG5zID0ge0BYbWxOcyhuYW1lc3BhY2VVUkkgPSBcIiIgKyBURVNUX05BTUVTUEFDRSAKLQkJCQkJKyAiXCIsIHByZWZpeCA9IFwiIiArIFRFU1RfUFJFRklYIAotCQkJCQkrICJcIiksQFhtbE5zKG5hbWVzcGFjZVVSSSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFXzIKLQkJCQkJKyAiXCIsIHByZWZpeCA9IFwiIiArIFRFU1RfUFJFRklYXzIKLQkJCQkJKyAiXCIpfSkiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLm1vdmVYbWxucygwLCAxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWEoeG1sbnMgPSB7QFhtbE5zKG5hbWVzcGFjZVVSSSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFXzIKLQkJCQkJKyAiXCIsIHByZWZpeCA9IFwiIiArIFRFU1RfUFJFRklYXzIKLQkJCQkJKyAiXCIpLEBYbWxOcyhuYW1lc3BhY2VVUkkgPSBcIiIgKyBURVNUX05BTUVTUEFDRQotCQkJCQkrICJcIiwgcHJlZml4ID0gXCIiICsgVEVTVF9QUkVGSVgKLQkJCQkJKyAiXCIpfSkiLCBjdSk7Ci0JCQotCQlzY2hlbWFBbm5vdGF0aW9uLnJlbW92ZVhtbG5zKDEpOwotCQlhc3NlcnRFcXVhbHMoMSwgc2NoZW1hQW5ub3RhdGlvbi5nZXRYbWxuc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hKHhtbG5zID0gQFhtbE5zKG5hbWVzcGFjZVVSSSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFXzIKLQkJCQkJKyAiXCIsIHByZWZpeCA9IFwiIiArIFRFU1RfUFJFRklYXzIKLQkJCQkJKyAiXCIpKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlQXR0cmlidXRlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWJhYTkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTY2hlbWFUeXBlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sU2NoZW1hVHlwZUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUUgPSAiZm9vIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OQU1FXzIgPSAiYmFyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUVTUEFDRSA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3Rlc3Qvc2NoZW1hIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9OQU1FU1BBQ0VfMiA9ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3Rlc3Qvc2NoZW1hMiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTUyA9IEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9DTEFTU18yID0gRGF0ZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZRX1RFU1RfQ0xBU1MgPSBHcmVnb3JpYW5DYWxlbmRhci5jbGFzcy5nZXROYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZRX1RFU1RfQ0xBU1NfMiA9IERhdGUuY2xhc3MuZ2V0TmFtZSgpOwotCi0KLQlwdWJsaWMgWG1sU2NoZW1hVHlwZUF0dHJpYnV0ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhTY2hlbWFUeXBlQW5kTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aFNjaGVtYVR5cGVBbmROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sU2NoZW1hVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoU2NoZW1hVHlwZUFuZFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1NDSEVNQV9UWVBFLCBGUV9URVNUX0NMQVNTLCBGUV9URVNUX0NMQVNTXzIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxTY2hlbWFUeXBlKHR5cGUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxBdHRyaWJ1dGVXaXRoU2NoZW1hVHlwZUFuZE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKFhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FLCBhbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FICsgIlwiKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWUoVEVTVF9OQU1FXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FXzIsIGFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUVfMiArICJcIikiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXROYW1lKFRFU1RfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUUsIGFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbEF0dHJpYnV0ZVdpdGhTY2hlbWFUeXBlQW5kTmFtZXNwYWNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRVNQQUNFLCBhbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKG5hbWVzcGFjZSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWVzcGFjZShURVNUX05BTUVTUEFDRV8yKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRVNQQUNFXzIsIGFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0VfMiArICJcIikiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXROYW1lc3BhY2UobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZXNwYWNlKFRFU1RfTkFNRVNQQUNFKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRVNQQUNFLCBhbm5vdGF0aW9uLmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKG5hbWVzcGFjZSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sQXR0cmlidXRlV2l0aFNjaGVtYVR5cGVBbmRUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1MsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcykiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXRUeXBlKFRFU1RfQ0xBU1NfMik7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTXzIsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZRX1RFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSh0eXBlID0gIiArIFRFU1RfQ0xBU1NfMiArICIuY2xhc3MpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXRUeXBlKFRFU1RfQ0xBU1MpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSh0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sU2NoZW1hVHlwZVBhY2thZ2VBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzNTg1MS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTY2hlbWFUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sU2NoZW1hVHlwZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbFNjaGVtYVR5cGVQYWNrYWdlQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRSA9ICJmb28iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUVfMiA9ICJiYXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdGVzdC9zY2hlbWEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX05BTUVTUEFDRV8yID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvdGVzdC9zY2hlbWEyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTID0gR3JlZ29yaWFuQ2FsZW5kYXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0NMQVNTXzIgPSBEYXRlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlFfVEVTVF9DTEFTUyA9IEdyZWdvcmlhbkNhbGVuZGFyLmNsYXNzLmdldE5hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlFfVEVTVF9DTEFTU18yID0gRGF0ZS5jbGFzcy5nZXROYW1lKCk7Ci0KLQotCXB1YmxpYyBYbWxTY2hlbWFUeXBlUGFja2FnZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hVHlwZSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFUeXBlQW5kTmFtZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRSArICJcIikiLAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZUFuZE5hbWVzcGFjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RQYWNrYWdlSW5mbygKLQkJCQkiQFhtbFNjaGVtYVR5cGUobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpIiwKLQkJCQlKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGVBbmRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hVHlwZSh0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsCi0JCQkJSkFYQi5YTUxfU0NIRU1BX1RZUEUsIEZRX1RFU1RfQ0xBU1MsIEZRX1RFU1RfQ0xBU1NfMik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFBhY2thZ2VJbmZvKAotCQkJCSJAWG1sU2NoZW1hVHlwZXMoe0BYbWxTY2hlbWFUeXBlLEBYbWxTY2hlbWFUeXBlfSkiLAotCQkJCUpBWEIuWE1MX1NDSEVNQV9UWVBFUywgSkFYQi5YTUxfU0NIRU1BX1RZUEUsIEZRX1RFU1RfQ0xBU1MsIEZRX1RFU1RfQ0xBU1NfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGVBbmROYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsgCi0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMCwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUUsIGFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUUgKyAiXCIpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZShURVNUX05BTUVfMik7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUVfMiwgYW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRV8yICsgIlwiKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWUoVEVTVF9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwgYW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZSA9IFwiIiArIFRFU1RfTkFNRSArICJcIikiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZUFuZE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0UsIGFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCi0JCWFubm90YXRpb24uc2V0TmFtZXNwYWNlKFRFU1RfTkFNRVNQQUNFXzIpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0VfMiwgYW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBURVNUX05BTUVTUEFDRV8yICsgIlwiKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoVEVTVF9OQU1FU1BBQ0UpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9OQU1FU1BBQ0UsIGFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNjaGVtYVR5cGUobmFtZXNwYWNlID0gXCIiICsgVEVTVF9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVQYWNrYWdlSW5mb1dpdGhTY2hlbWFUeXBlQW5kVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VQYWNrYWdlIHJlc291cmNlUGFja2FnZSA9IGJ1aWxkSmF2YVJlc291cmNlUGFja2FnZShjdSk7IAotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTUywgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSh0eXBlID0gIiArIFRFU1RfQ0xBU1MgKyAiLmNsYXNzKSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTU18yKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfQ0xBU1NfMiwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRlFfVEVTVF9DTEFTU18yLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKHR5cGUgPSAiICsgVEVTVF9DTEFTU18yICsgIi5jbGFzcykiLCBjdSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXRUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZSIsIGN1KTsKLQotCQlhbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTY2hlbWFUeXBlKHR5cGUgPSAiICsgVEVTVF9DTEFTUyArICIuY2xhc3MpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluZWRXaXRoTmFtZSgpCXRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IGNvbnRhaW5lZCBhbm5vdGF0aW9uIHZhbHVlIHNldHRpbmcvdXBkYXRpbmcKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlUGFja2FnZUluZm9XaXRoU2NoZW1hVHlwZXMoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOwotCi0JCVhtbFNjaGVtYVR5cGVBbm5vdGF0aW9uIGNvbnRhaW5lZEFubm90YXRpb24gPSAKLQkJCQkoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQotCQljb250YWluZWRBbm5vdGF0aW9uLnNldE5hbWUoVEVTVF9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRFU1RfTkFNRSwgY29udGFpbmVkQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFNjaGVtYVR5cGVzKHtAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FICsgIlwiKSxAWG1sU2NoZW1hVHlwZX0pIiwgY3UpOwotCi0JCWNvbnRhaW5lZEFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb250YWluZWRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hVHlwZXMoe0BYbWxTY2hlbWFUeXBlLEBYbWxTY2hlbWFUeXBlfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZFdpdGhOYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBjb250YWluZWQgYW5ub3RhdGlvbiB2YWx1ZSBzZXR0aW5nL3VwZGF0aW5nCi0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsKLQotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBjb250YWluZWRBbm5vdGF0aW9uID0gCi0JCQkoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQotCQljb250YWluZWRBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShURVNUX05BTUVTUEFDRSk7Ci0JCWFzc2VydEVxdWFscyhURVNUX05BTUVTUEFDRSwgY29udGFpbmVkQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hVHlwZXMoe0BYbWxTY2hlbWFUeXBlKG5hbWVzcGFjZSA9IFwiIiArIFRFU1RfTkFNRVNQQUNFICsgIlwiKSxAWG1sU2NoZW1hVHlwZX0pIiwgY3UpOwotCi0JCWNvbnRhaW5lZEFubm90YXRpb24uc2V0TmFtZXNwYWNlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnRhaW5lZEFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFNjaGVtYVR5cGVzKHtAWG1sU2NoZW1hVHlwZSxAWG1sU2NoZW1hVHlwZX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluZWRXaXRoVHlwZSgpdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHRlc3QgY29udGFpbmVkIGFubm90YXRpb24gdHlwZSBzZXR0aW5nL3VwZGF0aW5nCi0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGVzKCk7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2UgcmVzb3VyY2VQYWNrYWdlID0gYnVpbGRKYXZhUmVzb3VyY2VQYWNrYWdlKGN1KTsKLQotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBjb250YWluZWRBbm5vdGF0aW9uID0gCi0JCQkoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDEsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQotCQljb250YWluZWRBbm5vdGF0aW9uLnNldFR5cGUoVEVTVF9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhURVNUX0NMQVNTLCBjb250YWluZWRBbm5vdGF0aW9uLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGUV9URVNUX0NMQVNTLCBjb250YWluZWRBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWFUeXBlcyh7QFhtbFNjaGVtYVR5cGUsQFhtbFNjaGVtYVR5cGUodHlwZSA9ICIgKyBURVNUX0NMQVNTICsgIi5jbGFzcyl9KSIsIGN1KTsKLQotCQljb250YWluZWRBbm5vdGF0aW9uLnNldFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udGFpbmVkQW5ub3RhdGlvbi5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKEZRX1RFU1RfQ0xBU1MsIGNvbnRhaW5lZEFubm90YXRpb24uZ2V0RnVsbHlRdWFsaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFNjaGVtYVR5cGVzKHtAWG1sU2NoZW1hVHlwZSxAWG1sU2NoZW1hVHlwZX0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBhZGRpbmcvcmVtb3ZpbmcvbW92aW5nCi0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVBhY2thZ2VJbmZvV2l0aFNjaGVtYVR5cGUoKTsKLQkJSmF2YVJlc291cmNlUGFja2FnZSByZXNvdXJjZVBhY2thZ2UgPSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoY3UpOwotCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0KLQkJcmVzb3VyY2VQYWNrYWdlLmFkZEFubm90YXRpb24oMSwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2NoZW1hVHlwZXMoeyBAWG1sU2NoZW1hVHlwZSwgQFhtbFNjaGVtYVR5cGUgfSkiLCBjdSk7Ci0KLQkJWG1sU2NoZW1hVHlwZUFubm90YXRpb24gY29udGFpbmVkQW5ub3RhdGlvbjEgPSAoWG1sU2NoZW1hVHlwZUFubm90YXRpb24pIHJlc291cmNlUGFja2FnZS5nZXRBbm5vdGF0aW9uKDAsIEpBWEIuWE1MX1NDSEVNQV9UWVBFKTsKLQkJY29udGFpbmVkQW5ub3RhdGlvbjEuc2V0TmFtZShURVNUX05BTUUpOwotCQlYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbiBjb250YWluZWRBbm5vdGF0aW9uMiA9IChYbWxTY2hlbWFUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VQYWNrYWdlLmdldEFubm90YXRpb24oMSwgSkFYQi5YTUxfU0NIRU1BX1RZUEUpOwotCQljb250YWluZWRBbm5vdGF0aW9uMi5zZXROYW1lKFRFU1RfTkFNRV8yKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxTY2hlbWFUeXBlcyh7IEBYbWxTY2hlbWFUeXBlKG5hbWUgPSBcIiIgKyBURVNUX05BTUUKLQkJCQkJKyAiXCIpLCBAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FXzIKLQkJCQkJKyAiXCIpIH0pIiwgY3UpOwotCi0JCXJlc291cmNlUGFja2FnZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hVHlwZXMoeyBAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FXzIKLQkJCQkJKyAiXCIpLCBAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FCi0JCQkJCSsgIlwiKSB9KSIsIGN1KTsKLQotCQlyZXNvdXJjZVBhY2thZ2UucmVtb3ZlQW5ub3RhdGlvbigxLCBKQVhCLlhNTF9TQ0hFTUFfVFlQRSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZVBhY2thZ2UuZ2V0QW5ub3RhdGlvbnNTaXplKEpBWEIuWE1MX1NDSEVNQV9UWVBFKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKAotCQkJCSJAWG1sU2NoZW1hVHlwZShuYW1lID0gXCIiICsgVEVTVF9OQU1FXzIgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFNjaGVtYVR5cGVzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNlZUFsc29Bbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFNlZUFsc29Bbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwYjdiNi4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxTZWVBbHNvQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5YbWxTZWVBbHNvQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sU2VlQWxzb0Fubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxTZWVBbHNvQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sU2VlQWxzbygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfU0VFX0FMU08pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxTZWVBbHNvIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sU2VlQWxzb1dpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfU0VFX0FMU08pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxTZWVBbHNvKHZhbHVlID0ge0Zvby5jbGFzcywgQmFyLmNsYXNzfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sU2VlQWxzbygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIHhtbFNlZUFsc29Bbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydFRydWUoeG1sU2VlQWxzb0Fubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCB4bWxTZWVBbHNvQW5ub3RhdGlvbi5nZXRDbGFzc2VzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2xhc3NlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sU2VlQWxzb1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIHhtbFNlZUFsc29Bbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydFRydWUoeG1sU2VlQWxzb0Fubm90YXRpb24gIT0gbnVsbCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGNsYXNzZXMgPSB4bWxTZWVBbHNvQW5ub3RhdGlvbi5nZXRDbGFzc2VzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjbGFzc2VzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY2xhc3Nlcy5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc2VzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sU2VlQWxzb1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIHhtbFNlZUFsc29Bbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydFRydWUoeG1sU2VlQWxzb0Fubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscygyLCB4bWxTZWVBbHNvQW5ub3RhdGlvbi5nZXRDbGFzc2VzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFNlZUFsc28oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxTZWVBbHNvQW5ub3RhdGlvbiB4bWxTZWVBbHNvQW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnRUcnVlKHhtbFNlZUFsc29Bbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKCJGb29vIik7Ci0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKCJCYXJyciIpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2VlQWxzbyh7IEZvb28uY2xhc3MsIEJhcnJyLmNsYXNzIH0pIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDbGFzc0luZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxTZWVBbHNvKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sU2VlQWxzb0Fubm90YXRpb24geG1sU2VlQWxzb0Fubm90YXRpb24gPSAoWG1sU2VlQWxzb0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1NFRV9BTFNPKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxTZWVBbHNvQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQl4bWxTZWVBbHNvQW5ub3RhdGlvbi5hZGRDbGFzcygwLCAiRm9vbyIpOwotCQl4bWxTZWVBbHNvQW5ub3RhdGlvbi5hZGRDbGFzcygwLCAiQmFyciIpOwotCQl4bWxTZWVBbHNvQW5ub3RhdGlvbi5hZGRDbGFzcygxLCAiQmxhaCIpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2VlQWxzbyh7IEJhcnIuY2xhc3MsIEJsYWguY2xhc3MsIEZvb28uY2xhc3MgfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sU2VlQWxzb1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFNlZUFsc29Bbm5vdGF0aW9uIHhtbFNlZUFsc29Bbm5vdGF0aW9uID0gKFhtbFNlZUFsc29Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9TRUVfQUxTTyk7Ci0JCWFzc2VydFRydWUoeG1sU2VlQWxzb0Fubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJeG1sU2VlQWxzb0Fubm90YXRpb24ucmVtb3ZlQ2xhc3MoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2VlQWxzbyh2YWx1ZSA9IEJhci5jbGFzcykiLCBjdSk7Ci0KLQkJeG1sU2VlQWxzb0Fubm90YXRpb24ucmVtb3ZlQ2xhc3MoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2VlQWxzbyIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInZhbHVlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFNlZUFsc28oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxTZWVBbHNvQW5ub3RhdGlvbiB4bWxTZWVBbHNvQW5ub3RhdGlvbiA9IChYbWxTZWVBbHNvQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfU0VFX0FMU08pOwotCQlhc3NlcnRUcnVlKHhtbFNlZUFsc29Bbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKCJGb29vIik7Ci0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKCJCYXJyIik7Ci0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLmFkZENsYXNzKCJCbGFoIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sU2VlQWxzbyh7IEZvb28uY2xhc3MsIEJhcnIuY2xhc3MsIEJsYWguY2xhc3MgfSkiLCBjdSk7Ci0KLQkJeG1sU2VlQWxzb0Fubm90YXRpb24ubW92ZUNsYXNzKDAsIDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFNlZUFsc28oeyBCYXJyLmNsYXNzLCBGb29vLmNsYXNzLCBCbGFoLmNsYXNzIH0pIiwgY3UpOwotCi0JCXhtbFNlZUFsc29Bbm5vdGF0aW9uLm1vdmVDbGFzcygyLCAxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxTZWVBbHNvKHsgQmFyci5jbGFzcywgQmxhaC5jbGFzcywgRm9vby5jbGFzcyB9KSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zaWVudEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTZhNTk0Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zaWVudEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFRyYW5zaWVudEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbFRyYW5zaWVudEF0dHJpYnV0ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxUcmFuc2llbnRBdHRyaWJ1dGVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUcmFuc2llbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbFRyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHJhbnNpZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gdGhpcy5nZXRNZXRob2QocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxUcmFuc2llbnRBbm5vdGF0aW9uIHhtbFRyYW5zaWVudEFubm90YXRpb24gPSAoWG1sVHJhbnNpZW50QW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQlhc3NlcnRUcnVlKHhtbFRyYW5zaWVudEFubm90YXRpb24gIT0gbnVsbCk7Ci0KLQkJcmVzb3VyY2VNZXRob2QucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFRyYW5zaWVudCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2llbnRUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNzY4NjUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHJhbnNpZW50VHlwZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHJhbnNpZW50QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sVHJhbnNpZW50VHlwZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBYbWxUcmFuc2llbnRUeXBlQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUcmFuc2llbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFhtbFRyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHJhbnNpZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHJhbnNpZW50QW5ub3RhdGlvbiB4bWxUcmFuc2llbnRBbm5vdGF0aW9uID0gKFhtbFRyYW5zaWVudEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RSQU5TSUVOVCk7Ci0JCWFzc2VydFRydWUoeG1sVHJhbnNpZW50QW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKQVhCLlhNTF9UUkFOU0lFTlQpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFRyYW5zaWVudCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUeXBlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTVlZDQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVHlwZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuWG1sVHlwZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFhtbFR5cGVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RZUEVfTkFNRSA9ICJYbWxUeXBlTmFtZSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UWVBFX05BTUVTUEFDRSA9ICJYbWxUeXBlTmFtZXNwYWNlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RZUEVfRkFDVE9SWV9NRVRIT0QgPSAibXlGYWN0b3J5TWV0aG9kIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RZUEVfRkFDVE9SWV9DTEFTUyA9ICJNeUZhY3RvcnlDbGFzcyI7Ci0KLQlwdWJsaWMgWG1sVHlwZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sVHlwZShuYW1lID0gXCIiICsgWE1MX1RZUEVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxUeXBlV2l0aE5hbWVzcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUobmFtZXNwYWNlID0gXCIiICsgWE1MX1RZUEVfTkFNRVNQQUNFICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFR5cGVXaXRoRmFjdG9yeU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUoZmFjdG9yeU1ldGhvZCA9IFwiIiArIFhNTF9UWVBFX0ZBQ1RPUllfTUVUSE9EICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFR5cGVXaXRoRmFjdG9yeUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEZhY3RvcnlDbGFzcygpOwotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUoZmFjdG9yeUNsYXNzID0gIiArIFhNTF9UWVBFX0ZBQ1RPUllfQ0xBU1MgICsgIi5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RGYWN0b3J5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoWE1MX1RZUEVfRkFDVE9SWV9DTEFTUykuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIk15RmFjdG9yeUNsYXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlKHByb3BPcmRlciA9IHtcImZvb1wiLCBcImJhclwifSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9UWVBFX05BTUUsIHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydFRydWUoeG1sVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkRmFjdG9yeUNsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5TWV0aG9kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uLnNldE5hbWUoWE1MX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhYTUxfVFlQRV9OQU1FLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShuYW1lID0gXCIiICsgWE1MX1RZUEVfTkFNRSArICJcIikiLCBjdSk7Ci0KLQkJeG1sVHlwZUFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxUeXBlKG5hbWUgPSBcIiIgKyBYTUxfVFlQRV9OQU1FICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZXNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlV2l0aE5hbWVzcGFjZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9UWVBFX05BTUVTUEFDRSwgeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lc3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCQl4bWxUeXBlQW5ub3RhdGlvbi5zZXROYW1lc3BhY2UoWE1MX1RZUEVfTkFNRVNQQUNFKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9UWVBFX05BTUVTUEFDRSwgeG1sVHlwZUFubm90YXRpb24uZ2V0TmFtZXNwYWNlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShuYW1lc3BhY2UgPSBcIiIgKyBYTUxfVFlQRV9OQU1FU1BBQ0UgKyAiXCIpIiwgY3UpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLnNldE5hbWVzcGFjZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFR5cGUobmFtZXNwYWNlID0gXCIiICsgWE1MX1RZUEVfTkFNRVNQQUNFICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmFjdG9yeU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZVdpdGhGYWN0b3J5TWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoWE1MX1RZUEVfRkFDVE9SWV9NRVRIT0QsIHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZhY3RvcnlNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQkJeG1sVHlwZUFubm90YXRpb24uc2V0RmFjdG9yeU1ldGhvZChYTUxfVFlQRV9GQUNUT1JZX01FVEhPRCk7Ci0JCWFzc2VydEVxdWFscyhYTUxfVFlQRV9GQUNUT1JZX01FVEhPRCwgeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeU1ldGhvZCgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUoZmFjdG9yeU1ldGhvZCA9IFwiIiArIFhNTF9UWVBFX0ZBQ1RPUllfTUVUSE9EICsgIlwiKSIsIGN1KTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5zZXRGYWN0b3J5TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlNZXRob2QoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFR5cGUoZmFjdG9yeU1ldGhvZCA9IFwiIiArIFhNTF9UWVBFX0ZBQ1RPUllfTUVUSE9EICsgIlwiKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmFjdG9yeUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlV2l0aEZhY3RvcnlDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9UWVBFX0ZBQ1RPUllfQ0xBU1MsIHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LiIgKyBYTUxfVFlQRV9GQUNUT1JZX0NMQVNTLCB4bWxUeXBlQW5ub3RhdGlvbi5nZXRGdWxseVF1YWxpZmllZEZhY3RvcnlDbGFzc05hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZhY3RvcnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0TnVsbCh4bWxUeXBlQW5ub3RhdGlvbi5nZXRGYWN0b3J5Q2xhc3MoKSk7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uLnNldEZhY3RvcnlDbGFzcyhYTUxfVFlQRV9GQUNUT1JZX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKFhNTF9UWVBFX0ZBQ1RPUllfQ0xBU1MsIHhtbFR5cGVBbm5vdGF0aW9uLmdldEZhY3RvcnlDbGFzcygpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUoZmFjdG9yeUNsYXNzID0gIiArIFhNTF9UWVBFX0ZBQ1RPUllfQ0xBU1MgICsgIi5jbGFzcyIsIGN1KTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5zZXRGYWN0b3J5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sVHlwZUFubm90YXRpb24uZ2V0RmFjdG9yeUNsYXNzKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBYbWxUeXBlKGZhY3RvcnlDbGFzcyA9ICIgKyBYTUxfVFlQRV9GQUNUT1JZX0NMQVNTICArICIuY2xhc3MiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb3BPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZVdpdGhQcm9wT3JkZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlYbWxUeXBlQW5ub3RhdGlvbiB4bWxUeXBlQW5ub3RhdGlvbiA9IChYbWxUeXBlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSkFYQi5YTUxfVFlQRSk7Ci0JCWFzc2VydFRydWUoeG1sVHlwZUFubm90YXRpb24gIT0gbnVsbCk7Ci0JCUxpc3RJdGVyYXRvcjxTdHJpbmc+IHByb3BPcmRlciA9IHhtbFR5cGVBbm5vdGF0aW9uLmdldFByb3BPcmRlcigpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcHJvcE9yZGVyLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcE9yZGVyLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByb3BPcmRlclNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoUHJvcE9yZGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMiwgeG1sVHlwZUFubm90YXRpb24uZ2V0UHJvcE9yZGVyU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5hZGRQcm9wKCJmb29vIik7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uLmFkZFByb3AoImJhcnIiKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUocHJvcE9yZGVyID0geyBcImZvb29cIiwgXCJiYXJyXCIgfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFByb3BJbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5hZGRQcm9wKDAsICJmb29vIik7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uLmFkZFByb3AoMCwgImJhcnIiKTsKLQkJeG1sVHlwZUFubm90YXRpb24uYWRkUHJvcCgxLCAiYmxhaCIpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZShwcm9wT3JkZXIgPSB7IFwiYmFyclwiLCBcImJsYWhcIiwgXCJmb29vXCIgfSkiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFR5cGVXaXRoUHJvcE9yZGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJWG1sVHlwZUFubm90YXRpb24geG1sVHlwZUFubm90YXRpb24gPSAoWG1sVHlwZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpBWEIuWE1MX1RZUEUpOwotCQlhc3NlcnRUcnVlKHhtbFR5cGVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLnJlbW92ZVByb3AoImZvbyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUocHJvcE9yZGVyID0gXCJiYXJcIikiLCBjdSk7Ci0KLQkJeG1sVHlwZUFubm90YXRpb24ucmVtb3ZlUHJvcCgiYmFyIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHlwZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInByb3BPcmRlciIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJvcEluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RYbWxUeXBlV2l0aFByb3BPcmRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5yZW1vdmVQcm9wKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUocHJvcE9yZGVyID0gXCJiYXJcIikiLCBjdSk7Ci0KLQkJeG1sVHlwZUFubm90YXRpb24ucmVtb3ZlUHJvcCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUeXBlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigicHJvcE9yZGVyIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUHJvcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0WG1sVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCVhtbFR5cGVBbm5vdGF0aW9uIHhtbFR5cGVBbm5vdGF0aW9uID0gKFhtbFR5cGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9UWVBFKTsKLQkJYXNzZXJ0VHJ1ZSh4bWxUeXBlQW5ub3RhdGlvbiAhPSBudWxsKTsKLQotCQl4bWxUeXBlQW5ub3RhdGlvbi5hZGRQcm9wKCJmb29vIik7Ci0JCXhtbFR5cGVBbm5vdGF0aW9uLmFkZFByb3AoImJhcnIiKTsKLQkJeG1sVHlwZUFubm90YXRpb24uYWRkUHJvcCgiYmxhaCIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUocHJvcE9yZGVyID0geyBcImZvb29cIiwgXCJiYXJyXCIsIFwiYmxhaFwiIH0pIiwgY3UpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLm1vdmVQcm9wKDAsIDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUocHJvcE9yZGVyID0geyBcImJhcnJcIiwgXCJmb29vXCIsIFwiYmxhaFwiIH0pIiwgY3UpOwotCi0JCXhtbFR5cGVBbm5vdGF0aW9uLm1vdmVQcm9wKDIsIDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFR5cGUocHJvcE9yZGVyID0geyBcImJhcnJcIiwgXCJibGFoXCIsIFwiZm9vb1wiIH0pIiwgY3UpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFZhbHVlQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNjM1YTMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFZhbHVlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgWG1sVmFsdWVBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgWG1sVmFsdWVBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxWYWx1ZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0WG1sVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFhtbFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQotCQlYbWxWYWx1ZUFubm90YXRpb24geG1sVmFsdWVBbm5vdGF0aW9uID0gKFhtbFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKQVhCLlhNTF9WQUxVRSk7Ci0JCWFzc2VydFRydWUoeG1sVmFsdWVBbm5vdGF0aW9uICE9IG51bGwpOwotCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSkFYQi5YTUxfVkFMVUUpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFZhbHVlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy90ZXN0LnhtbCBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg2YzY5NC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGI3YzkzLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvamF4Yi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jdnNpZ25vcmUgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTUxM2Y2Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMTI5ZWQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUaHUgTWF5IDA1IDE3OjI1OjExIEVEVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDIwYmIxLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1EYWxpLUNvbW1lbnQ6IGpkayAxLjYgaGFzIHRoZSBqYXZheC54bWwuYmluZCBhbm5vdGF0aW9ucwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjYKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVRlc3RzUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjcuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS40LjIwMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cywKLSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLAotIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UsCi0gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDI5YmMuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NjFjYzQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSkFYQiBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9KcHRKYXhiRWNsaXBzZUxpbmtDb3JlVGVzdHNQbHVnaW4uamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9KcHRKYXhiRWNsaXBzZUxpbmtDb3JlVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzNTkzOC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KYXhiUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5KcHRKYXhiQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBjb25maWd1cmUgdGhlIGNvcmUgdG8gaGFuZGxlIGV2ZW50cyBzeW5jaHJvbm91c2x5IHdoZW4gd2UgYXJlCi0gKiBydW5uaW5nIHRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdEpheGJFY2xpcHNlTGlua0NvcmVUZXN0c1BsdWdpbgotCQlleHRlbmRzIFBsdWdpbiB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVRlc3RzUGx1Z2luIElOU1RBTkNFOwotCQotCQotCXB1YmxpYyBzdGF0aWMgSnB0SmF4YkVjbGlwc2VMaW5rQ29yZVRlc3RzUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQkKLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBKcHRKYXhiRWNsaXBzZUxpbmtDb3JlVGVzdHNQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlKYXhiUHJvamVjdE1hbmFnZXIgamF4YlByb2plY3RNYW5hZ2VyID0gSnB0SmF4YkNvcmVQbHVnaW4uZ2V0UHJvamVjdE1hbmFnZXIoKTsKLQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QoamF4YlByb2plY3RNYW5hZ2VyLCAiaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseSIpOwotCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZVN0YXRpY01ldGhvZChKcHRKYXhiQ29yZVBsdWdpbi5jbGFzcywgImRvTm90Rmx1c2hQcmVmZXJlbmNlcyIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0VMSmF4YkNvcmVUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0VMSmF4YkNvcmVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzNkODBjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9FTEpheGJDb3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRUxKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0czsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXhiQ29yZVRlc3RzIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRUxKYXhiQ29yZVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEVMSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoRUxKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZXF1aXJlZEphcnNFeGlzdHMoKSB7Ci0JCXJldHVybiBqYXhiSmFyUHJvcGVydHlFeGlzdHMoKSAKLQkJCSYmIGpheGJKYXJGaWxlRXhpc3RzKCkKLQkJCSYmIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKSAKLQkJCSYmIGVjbGlwc2VsaW5rSmFyRmlsZUV4aXN0cygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF4YkphclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gamF4YkphckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkpBWEJfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSkpLmV4aXN0cygpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZWNsaXBzZWxpbmtKYXJQcm9wZXJ0eUV4aXN0cygpIHsKLQkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KFRlc3RKYXhiUHJvamVjdC5FQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlbGlua0phckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRNaXNzaW5nSmFyRXJyb3JNZXNzYWdlKCkgewotCQlpZiggISBqYXhiSmFyUHJvcGVydHlFeGlzdHMoKSkgewotCQkJcmV0dXJuIGVycm9yTWlzc2luZ1Byb3BlcnR5KFRlc3RKYXhiUHJvamVjdC5KQVhCX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JCX0KLQkJZWxzZSBpZiggISBqYXhiSmFyRmlsZUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KFRlc3RKYXhiUHJvamVjdC5KQVhCX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSkpOwotCQl9Ci0JCWVsc2UgaWYoICEgZWNsaXBzZWxpbmtKYXJQcm9wZXJ0eUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JNaXNzaW5nUHJvcGVydHkoVGVzdEpheGJQcm9qZWN0LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChnZXRTeXN0ZW1Qcm9wZXJ0eShUZXN0SmF4YlByb2plY3QuRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKSk7Ci0JfQotCQotCS8qKioqKioqKioqKiBwcml2YXRlICoqKioqKioqKiovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJtaXNzaW5nIEphdmEgc3lzdGVtIHByb3BlcnR5OiBcIiIgKyBwcm9wZXJ0eU5hbWUgKyAiXCIiOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTeXN0ZW1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBTeXN0ZW0uZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBFTEpheGJDb3JlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI5NDdjLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucGxhdGZvcm0uSmF4YlBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLkVMSmF4YlBsYXRmb3JtOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZQotCQlleHRlbmRzIEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF4YlBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiBFTEpheGJQbGF0Zm9ybS5nZXREZWZhdWx0UGxhdGZvcm0oZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FTEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWFjYWY5Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VMSmF4YkNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkVMSmF4YkNvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YS5FTEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShFTEpheGJDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCi0JCWlmIChFTEpheGJDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLS8vCQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNDb250ZXh0Um9vdFRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3QoRUxKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoRUxKYXhiQ29yZVRlc3RzLmJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgRUxKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U5OGZiNC4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEyICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTW9kaWZpZWREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sQW55QXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9BTllfQVRUUklCVVRFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQW55QXR0cmlidXRlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJbWFwcGluZy5hZGRYbWxQYXRoKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sUGF0aCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQW55QXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sQW55QXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxBbnlBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExMDViMS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRUxKYXhiQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpBWEIuWE1MX1RZUEUsIEpBWEIuWE1MX0FOWV9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQW55RWxlbWVudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxBbnlFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sUGF0aCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbFBhdGgoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEFueUVsZW1lbnQoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEFueUVsZW1lbnRNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLmFkZE1hcmtlckFubm90YXRpb24oCi0JCQkJCQlkZWNsYXJhdGlvbi5nZXREZWNsYXJhdGlvbigpLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sQW55RWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYmY1MzUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMiAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3NNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnJlc291cmNlLmphdmEuSkFYQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5FTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzCi0JCWV4dGVuZHMgRUxKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfQVRUUklCVVRFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sQXR0cmlidXRlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxQYXRoIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEF0dHJpYnV0ZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCQkKLQkJbWFwcGluZy5hZGRYbWxQYXRoKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcucmVtb3ZlWG1sUGF0aCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sQXR0cmlidXRlKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5hZGRNYXJrZXJBbm5vdGF0aW9uKAotCQkJCQkJZGVjbGFyYXRpb24uZ2V0RGVjbGFyYXRpb24oKSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZUFubm90YXRpb24oZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sUGF0aCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJWG1sUGF0aEFubm90YXRpb24geG1sUGF0aEFubm90YXRpb24gPSAoWG1sUGF0aEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoeG1sUGF0aEFubm90YXRpb24pOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfQVRUUklCVVRFX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxBdHRyaWJ1dGVNYXBwaW5nVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9QQVRILCAiLi9lbGVtZW50W0BuYW1lPVwiZm9vXCJdL2VsZW1lbnRbMV0vdGV4dCgpIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMuc2V0TWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCwgImVsZW1lbnQvQGF0dHJpYnV0ZSIpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE5vdE51bGwoeG1sUGF0aEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sQXR0cmlidXRlTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbCh4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0FUVFJJQlVURV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGNiOWEuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzCi0JCWV4dGVuZHMgRUxKYXhiQ29udGV4dE1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBFTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKQVhCLlhNTF9UWVBFLCBKQVhCLlhNTF9FTEVNRU5UKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sRWxlbWVudCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUGF0aCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50KCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlFTEphdmFYbWxFbGVtZW50TWFwcGluZyBtYXBwaW5nID0gKEVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQkJCi0JCW1hcHBpbmcuYWRkWG1sUGF0aCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbFBhdGgoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKSk7Ci0JCWFzc2VydE51bGwobWFwcGluZy5nZXRYbWxQYXRoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxFbGVtZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSB0aGlzLmFubm90YXRlZEVsZW1lbnQocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMuYWRkTWFya2VyQW5ub3RhdGlvbigKLQkJCQkJCWRlY2xhcmF0aW9uLmdldERlY2xhcmF0aW9uKCksIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nLmdldFhtbFBhdGgoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0WG1sUGF0aCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVHlwZVdpdGhYbWxQYXRoKCk7Ci0JCQotCQlKYXhiQ2xhc3MgamF4YkNsYXNzID0gKEpheGJDbGFzcykgQ29sbGVjdGlvblRvb2xzLmdldChnZXRDb250ZXh0Um9vdCgpLmdldFR5cGVzKCksIDApOwotCQlKYXhiQ2xhc3NNYXBwaW5nIGNsYXNzTWFwcGluZyA9IGpheGJDbGFzcy5nZXRNYXBwaW5nKCk7Ci0JCUpheGJQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlYbWxQYXRoQW5ub3RhdGlvbiB4bWxQYXRoQW5ub3RhdGlvbiA9IChYbWxQYXRoQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbigwLCBFTEpheGIuWE1MX1BBVEgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxQYXRoQW5ub3RhdGlvbik7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9QQVRILCAiZWxlbWVudC9AYXR0cmlidXRlIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9QQVRILCAiLi9lbGVtZW50W0BuYW1lPVwiZm9vXCJdL2VsZW1lbnRbMV0vdGV4dCgpIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh4bWxQYXRoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5YTUxfRUxFTUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sRWxlbWVudE1hcHBpbmdUZXN0cy50aGlzLnJlbW92ZU1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgpOwotCQkJfQotCQl9KTsKLQkJCi0JCWFzc2VydE51bGwoeG1sUGF0aEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuWE1MX0VMRU1FTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODFhMzUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxFbGVtZW50c01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVHlwZVdpdGhYbWxFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgSkFYQi5YTUxfRUxFTUVOVFMpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxFbGVtZW50cyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE5vcm1hbEFubm90YXRpb24gbmV3WG1sUGF0aEFubm90YXRpb24oQVNUIGFzdCwgU3RyaW5nIHZhbHVlKSB7Ci0JCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ld05vcm1hbEFubm90YXRpb24oYXN0LCBFTEpheGIuWE1MX1BBVEgpOwotCQlhZGRNZW1iZXJWYWx1ZVBhaXIoYW5ub3RhdGlvbiwgRUxKYXhiLlhNTF9QQVRIX19WQUxVRSwgdmFsdWUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkWG1sUGF0aChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgaW5kZXgsIFN0cmluZyB2YWx1ZSkgewotCQlOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXdYbWxQYXRoQW5ub3RhdGlvbihkZWNsYXJhdGlvbi5nZXRBc3QoKSwgdmFsdWUpOwotCQlhZGRBcnJheUVsZW1lbnQoZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSFMsIGluZGV4LCAidmFsdWUiLCBhbm5vdGF0aW9uKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlWG1sUGF0aChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uLCBpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQltb3ZlQXJyYXlFbGVtZW50KChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoRUxKYXhiLlhNTF9QQVRIUyksICJ2YWx1ZSIsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbFBhdGgoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJlbW92ZUFycmF5RWxlbWVudCgoTm9ybWFsQW5ub3RhdGlvbikgZGVjbGFyYXRpb24uZ2V0QW5ub3RhdGlvbk5hbWVkKEVMSmF4Yi5YTUxfUEFUSFMpLCAidmFsdWUiLCBpbmRleCk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxFbGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEVsZW1lbnRzKCk7Ci0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJRUxYbWxFbGVtZW50c01hcHBpbmcgbWFwcGluZyA9IChFTFhtbEVsZW1lbnRzTWFwcGluZykgQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkKLQkJSXRlcmFibGU8RUxYbWxQYXRoPiB4bWxQYXRocyA9IG1hcHBpbmcuZ2V0WG1sUGF0aHMoKTsKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxQYXRocykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCQotCQkvL2FkZCAyIFhtbFBhdGggYW5ub3RhdGlvbnMKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlFTEphdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLmFkZFhtbFBhdGgoZGVjbGFyYXRpb24sIDAsICJmb28iKTsKLQkJCQkJCUVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMuYWRkWG1sUGF0aChkZWNsYXJhdGlvbiwgMSwgImJhciIpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQotCQl4bWxQYXRocyA9IG1hcHBpbmcuZ2V0WG1sUGF0aHMoKTsKLQkJCi0JCWFzc2VydEZhbHNlKENvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHhtbFBhdGhzKSk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBwaW5nLmdldFhtbFBhdGhzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhzLCAwKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhzLCAxKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHN3aXRjaCBYbWxQYXRoIGFubm90YXRpb25zCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdCgKLQkJCQluZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJCQlFTEphdmFYbWxFbGVtZW50c01hcHBpbmdUZXN0cy50aGlzLm1vdmVYbWxQYXRoKGRlY2xhcmF0aW9uLCAwLCAxKTsKLQkJCQkJfQotCQkJCX0pOwotCQkKLQkJeG1sUGF0aHMgPSBtYXBwaW5nLmdldFhtbFBhdGhzKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxQYXRocykpOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRocywgMCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRocywgMSkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgWG1sUGF0aCBhbm5vdGF0aW9ucwotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQoCi0JCQkJbmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCQkJRUxKYXZhWG1sRWxlbWVudHNNYXBwaW5nVGVzdHMudGhpcy5yZW1vdmVYbWxQYXRoKGRlY2xhcmF0aW9uLCAxKTsKLQkJCQkJCUVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLnRoaXMucmVtb3ZlWG1sUGF0aChkZWNsYXJhdGlvbiwgMCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCi0JCXhtbFBhdGhzID0gbWFwcGluZy5nZXRYbWxQYXRocygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eSh4bWxQYXRocykpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbFBhdGhzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sRWxlbWVudHMoKTsKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlFTFhtbEVsZW1lbnRzTWFwcGluZyBtYXBwaW5nID0gKEVMWG1sRWxlbWVudHNNYXBwaW5nKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNsYXNzTWFwcGluZy5nZXRBdHRyaWJ1dGVzKCksIDApLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gbWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEVMSmF4Yi5YTUxfUEFUSCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCQotCQltYXBwaW5nLmFkZFhtbFBhdGgoMCkuc2V0VmFsdWUoImZvbyIpOwotCQltYXBwaW5nLmFkZFhtbFBhdGgoMSkuc2V0VmFsdWUoImJheiIpOwotCQltYXBwaW5nLmFkZFhtbFBhdGgoMSkuc2V0VmFsdWUoImJhciIpOwotCQkKLQkJSXRlcmFibGU8WG1sUGF0aEFubm90YXRpb24+IHhtbFBhdGhBbm5vdGF0aW9ucyA9IAotCQkJCW5ldyBTdWJJdGVyYWJsZVdyYXBwZXIocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoRUxKYXhiLlhNTF9QQVRIKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoeG1sUGF0aEFubm90YXRpb25zKSk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBwaW5nLmdldFhtbFBhdGhzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhBbm5vdGF0aW9ucywgMCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRoQW5ub3RhdGlvbnMsIDEpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sUGF0aEFubm90YXRpb25zLCAyKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcHBpbmcubW92ZVhtbFBhdGgoMSwgMik7Ci0JCQotCQl4bWxQYXRoQW5ub3RhdGlvbnMgPSAKLQkJCQluZXcgU3ViSXRlcmFibGVXcmFwcGVyKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zKEVMSmF4Yi5YTUxfUEFUSCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHhtbFBhdGhBbm5vdGF0aW9ucykpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwcGluZy5nZXRYbWxQYXRoc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgQ29sbGVjdGlvblRvb2xzLmdldCh4bWxQYXRoQW5ub3RhdGlvbnMsIDApLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIENvbGxlY3Rpb25Ub29scy5nZXQoeG1sUGF0aEFubm90YXRpb25zLCAxKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KHhtbFBhdGhBbm5vdGF0aW9ucywgMikuZ2V0VmFsdWUoKSk7Ci0JCQotCQltYXBwaW5nLnJlbW92ZVhtbFBhdGgoMik7Ci0JCW1hcHBpbmcucmVtb3ZlWG1sUGF0aCgwKTsKLQkJbWFwcGluZy5yZW1vdmVYbWxQYXRoKDApOwotCQkKLQkJeG1sUGF0aEFubm90YXRpb25zID0gCi0JCQkJbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcihyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9ucyhFTEpheGIuWE1MX1BBVEgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh4bWxQYXRoQW5ub3RhdGlvbnMpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcHBpbmcuZ2V0WG1sUGF0aHNTaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNzcxMGIuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Ob3JtYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUuY29udGV4dC5KYXhiQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzc01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmNvcmUucmVzb3VyY2UuamF2YS5KQVhCOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1wdWJsaWMgY2xhc3MgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cwotCQlleHRlbmRzIEVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sSW52ZXJzZVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFR5cGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sSW52ZXJzZVJlZmVyZW5jZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sSW52ZXJzZVJlZmVyZW5jZSgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcgbWFwcGluZyA9IChFTEphdmFYbWxJbnZlcnNlUmVmZXJlbmNlTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0UpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQltYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJbWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbEludmVyc2VSZWZlcmVuY2UoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50ID0gdGhpcy5hbm5vdGF0ZWRFbGVtZW50KHJlc291cmNlQXR0cmlidXRlKTsKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cy50aGlzLmFkZE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCShNYXJrZXJBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSksCi0JCQkJCQlFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFX19NQVBQRURfQlksICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCU5vcm1hbEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSBkZWNsYXJhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZWQoRUxKYXhiLlhNTF9JTlZFUlNFX1JFRkVSRU5DRSk7Ci0JCQkJRUxKYXZhWG1sSW52ZXJzZVJlZmVyZW5jZU1hcHBpbmdUZXN0cy50aGlzLnZhbHVlcyhhbm5vdGF0aW9uKS5yZW1vdmUoMCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKG1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxQYXRoVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXZhWG1sUGF0aFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNThjYjkuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEphdmFYbWxQYXRoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5jb250ZXh0LkpheGJDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YkNsYXNzTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLmNvbnRleHQuSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5yZXNvdXJjZS5qYXZhLkpBWEI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuRUxYbWxFbGVtZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5FTFhtbFBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRUxKYXZhWG1sRWxlbWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sUGF0aEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVMSmF4YkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEphdmFYbWxQYXRoVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJDb250ZXh0TW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEVMSmF2YVhtbFBhdGhUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVR5cGVXaXRoWG1sUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSkFYQi5YTUxfVFlQRSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUeXBlIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUGF0aCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVR5cGVXaXRoWG1sUGF0aCgpOwotCQkKLQkJSmF4YkNsYXNzIGpheGJDbGFzcyA9IChKYXhiQ2xhc3MpIENvbGxlY3Rpb25Ub29scy5nZXQoZ2V0Q29udGV4dFJvb3QoKS5nZXRUeXBlcygpLCAwKTsKLQkJSmF4YkNsYXNzTWFwcGluZyBjbGFzc01hcHBpbmcgPSBqYXhiQ2xhc3MuZ2V0TWFwcGluZygpOwotCQlKYXhiUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gQ29sbGVjdGlvblRvb2xzLmdldChjbGFzc01hcHBpbmcuZ2V0QXR0cmlidXRlcygpLCAwKTsKLQkJRUxYbWxFbGVtZW50TWFwcGluZyBtYXBwaW5nID0gKEVMWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJRUxYbWxQYXRoIHhwYXRoID0gbWFwcGluZy5nZXRYbWxQYXRoKCk7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sUGF0aEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh4cGF0aC5nZXRWYWx1ZSgpKTsKLQkJCi0JCXhwYXRoLnNldFZhbHVlKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4cGF0aC5nZXRWYWx1ZSgpKTsKLQkJCi0JCXhwYXRoLnNldFZhbHVlKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCB4cGF0aC5nZXRWYWx1ZSgpKTsKLQkJCi0JCXhwYXRoLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHhwYXRoLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUeXBlV2l0aFhtbFBhdGgoKTsKLQkJCi0JCUpheGJDbGFzcyBqYXhiQ2xhc3MgPSAoSmF4YkNsYXNzKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KGdldENvbnRleHRSb290KCkuZ2V0VHlwZXMoKSwgMCk7Ci0JCUpheGJDbGFzc01hcHBpbmcgY2xhc3NNYXBwaW5nID0gamF4YkNsYXNzLmdldE1hcHBpbmcoKTsKLQkJSmF4YlBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IENvbGxlY3Rpb25Ub29scy5nZXQoY2xhc3NNYXBwaW5nLmdldEF0dHJpYnV0ZXMoKSwgMCk7Ci0JCUVMSmF2YVhtbEVsZW1lbnRNYXBwaW5nIG1hcHBpbmcgPSAoRUxKYXZhWG1sRWxlbWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJRUxYbWxQYXRoIHhwYXRoID0gbWFwcGluZy5nZXRYbWxQYXRoKCk7Ci0JCVhtbFBhdGhBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoWG1sUGF0aEFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh4cGF0aC5nZXRWYWx1ZSgpKTsKLQkJCi0JCUFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCA9IHRoaXMuYW5ub3RhdGVkRWxlbWVudChyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCWFubm90YXRlZEVsZW1lbnQuZWRpdChuZXcgTWVtYmVyLkVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCUVMSmF2YVhtbFBhdGhUZXN0cy50aGlzLnNldE1lbWJlclZhbHVlUGFpcigKLQkJCQkJCWRlY2xhcmF0aW9uLCBFTEpheGIuWE1MX1BBVEgsICJmb28iKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeHBhdGguZ2V0VmFsdWUoKSk7Ci0JCQotCQlhbm5vdGF0ZWRFbGVtZW50LmVkaXQobmV3IE1lbWJlci5FZGl0b3IoKSB7Ci0JCQlwdWJsaWMgdm9pZCBlZGl0KE1vZGlmaWVkRGVjbGFyYXRpb24gZGVjbGFyYXRpb24pIHsKLQkJCQlFTEphdmFYbWxQYXRoVGVzdHMudGhpcy5zZXRNZW1iZXJWYWx1ZVBhaXIoCi0JCQkJCQlkZWNsYXJhdGlvbiwgRUxKYXhiLlhNTF9QQVRILCAiIik7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHhwYXRoLmdldFZhbHVlKCkpOwotCQkKLQkJYW5ub3RhdGVkRWxlbWVudC5lZGl0KG5ldyBNZW1iZXIuRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJRUxKYXZhWG1sUGF0aFRlc3RzLnRoaXMucmVtb3ZlTWVtYmVyVmFsdWVQYWlyKAotCQkJCQkJZGVjbGFyYXRpb24sIEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHhwYXRoLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRUxKYXhiQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYzU1ZjUuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FTEpheGJDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4YkNvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMKLQkJZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEVMSmF4YkNvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbEFueUF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFTEphdmFYbWxBbnlFbGVtZW50TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbEF0dHJpYnV0ZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFTEphdmFYbWxFbGVtZW50TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbEVsZW1lbnRzTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVMSmF2YVhtbEludmVyc2VSZWZlcmVuY2VNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRUxKYXZhWG1sUGF0aFRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEVMSmF4YkNvcmVKYXZhQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9FTEpheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmEwMGMyLi4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9FTEpheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuRUxKYXhiQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJDb3JlUmVzb3VyY2VNb2RlbFRlc3RzIAotCQlleHRlbmRzIFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCi0JCWlmIChFTEpheGJDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3QoRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoRUxKYXhiQ29yZVRlc3RzLmJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpKSk7Ci0JCX0KLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEVMSmF4YkNvcmVSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc5MDEwYy4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXhiUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLnYyXzEuRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb247Ci0KLQotcHVibGljIGNsYXNzIEVMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgCi0JCWV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7CQotCQotCXB1YmxpYyBFTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmphdmFQcm9qZWN0LmFkZEphcihUZXN0SmF4YlByb2plY3QuZWNsaXBzZWxpbmtKYXJOYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQkvLyBub3RoaW5nIGFzIG9mIHlldAotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBhbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBFTEpheGJfMl8xX1BsYXRmb3JtRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmdldEFubm90YXRpb25EZWZpbml0aW9ucygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbltdIG5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gRUxKYXhiXzJfMV9QbGF0Zm9ybURlZmluaXRpb24uaW5zdGFuY2UoKS5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhOWQ5NS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0KLXB1YmxpYyBjbGFzcyBFTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzCi0JCWV4dGVuZHMgVGVzdENhc2UgewotCQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShFTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFhtbFBhdGhBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQkKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEVMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0MDRmOS4uMDAwMDAwMAotLS0gYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb247Ci0KLQotcHVibGljIGNsYXNzIFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uVGVzdHMKLQkJZXh0ZW5kcyBFTEpheGJKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxJbnZlcnNlUmVmZXJlbmNlKCkgCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0UpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEludmVyc2VSZWZlcmVuY2UiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sSW52ZXJzZVJlZmVyZW5jZVdpdGhNYXBwZWRCeSgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfSU5WRVJTRV9SRUZFUkVOQ0UpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbEludmVyc2VSZWZlcmVuY2UobWFwcGVkQnkgPSBcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbiBnZXRYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIChYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihFTEpheGIuWE1MX0lOVkVSU0VfUkVGRVJFTkNFKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxJbnZlcnNlUmVmZXJlbmNlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydFRydWUoYW5ub3RhdGlvbiAhPSBudWxsKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxJbnZlcnNlUmVmZXJlbmNlV2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sSW52ZXJzZVJlZmVyZW5jZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sSW52ZXJzZVJlZmVyZW5jZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbEludmVyc2VSZWZlcmVuY2VBbm5vdGF0aW9uIGFubm90YXRpb24gPSBnZXRYbWxJbnZlcnNlUmVmZXJlbmNlQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxJbnZlcnNlUmVmZXJlbmNlKG1hcHBlZEJ5ID0gXCJiYXJcIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiIiwgYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxJbnZlcnNlUmVmZXJlbmNlKG1hcHBlZEJ5ID0gXCJcIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbEludmVyc2VSZWZlcmVuY2UiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJtYXBwZWRCeSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxQYXRoQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MjczOTQuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvamF4Yi9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvWG1sUGF0aEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FTEpheGI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLlhtbFBhdGhBbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxQYXRoQW5ub3RhdGlvblRlc3RzCi0JCWV4dGVuZHMgRUxKYXhiSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIFhtbFBhdGhBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0WG1sUGF0aCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfUEFUSCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAWG1sUGF0aCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxQYXRoV2l0aFZhbHVlKCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxQYXRoKFwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFhtbFBhdGhzKCkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRUxKYXhiLlhNTF9QQVRIUywgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxQYXRocyh7QFhtbFBhdGgsQFhtbFBhdGh9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxQYXRoQW5ub3RhdGlvbiBnZXRYbWxQYXRoQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIGdldFhtbFBhdGhBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlLCAwKTsKLQl9Ci0JCi0JcHJpdmF0ZSBYbWxQYXRoQW5ub3RhdGlvbiBnZXRYbWxQYXRoQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUsIGludCBpbmRleCkgewotCQlyZXR1cm4gKFhtbFBhdGhBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKGluZGV4LCBFTEpheGIuWE1MX1BBVEgpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxQYXRoV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlQXR0cmlidXRlID0gZ2V0RmllbGQocmVzb3VyY2VUeXBlLCAwKTsKLQkJWG1sUGF0aEFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxQYXRoKFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sUGF0aChcImJhclwiKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFBhdGgoXCJcIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFhtbFBhdGgiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAWG1sUGF0aCgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb250YWluZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB0ZXN0IGNvbnRhaW5lZCBhbm5vdGF0aW9uIHZhbHVlIHNldHRpbmcvdXBkYXRpbmcKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sUGF0aHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxQYXRoQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sUGF0aEFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFBhdGhzKHtAWG1sUGF0aCxAWG1sUGF0aH0pIiwgY3UpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxQYXRocyh7QFhtbFBhdGgoXCJmb29cIiksQFhtbFBhdGh9KSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxQYXRocyh7QFhtbFBhdGgsQFhtbFBhdGh9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnRhaW5lZCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdGVzdCBhZGRpbmcvcmVtb3ZpbmcvbW92aW5nCi0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFhtbFBhdGgoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShFTEpheGIuWE1MX1BBVEgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oMSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoRUxKYXhiLlhNTF9QQVRIKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sUGF0aHMoeyBAWG1sUGF0aCwgQFhtbFBhdGggfSkiLCBjdSk7Ci0JCQotCQlYbWxQYXRoQW5ub3RhdGlvbiBhbm5vdGF0aW9uMSA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlLCAwKTsKLQkJYW5ub3RhdGlvbjEuc2V0VmFsdWUoImZvbyIpOwotCQlYbWxQYXRoQW5ub3RhdGlvbiBhbm5vdGF0aW9uMiA9IGdldFhtbFBhdGhBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlLCAxKTsKLQkJYW5ub3RhdGlvbjIuc2V0VmFsdWUoImJhciIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygKLQkJCQkiQFhtbFBhdGhzKHsgQFhtbFBhdGgoXCJmb29cIiksIEBYbWxQYXRoKFwiYmFyXCIpIH0pIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUubW92ZUFubm90YXRpb24oMCwgMSwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxQYXRocyh7IEBYbWxQYXRoKFwiYmFyXCIpLCBAWG1sUGF0aChcImZvb1wiKSB9KSIsIGN1KTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oMCwgRUxKYXhiLlhNTF9QQVRIKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShFTEpheGIuWE1MX1BBVEgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoCi0JCQkJIkBYbWxQYXRoKFwiZm9vXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFhtbFBhdGhzIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qYXhiL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9YbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDhkMzQ5Li4wMDAwMDAwCi0tLSBhL2pheGIvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pheGIvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1htbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVMSmF4YjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cwotCQlleHRlbmRzIEVMSmF4YkphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxUcmFuc2Zvcm1hdGlvbigpIAotCQkJdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFTEpheGIuWE1MX1RSQU5TRk9STUFUSU9OKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBYbWxUcmFuc2Zvcm1hdGlvbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RYbWxUcmFuc2Zvcm1hdGlvbldpdGhPcHRpb25hbCgpCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVMSmF4Yi5YTUxfVFJBTlNGT1JNQVRJT04pOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFhtbFRyYW5zZm9ybWF0aW9uKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgWG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIGdldFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIChYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRUxKYXhiLlhNTF9UUkFOU0ZPUk1BVElPTik7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sVHJhbnNmb3JtYXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFubm90YXRpb24gIT0gbnVsbCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0WG1sVHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VBdHRyaWJ1dGUgPSBnZXRGaWVsZChyZXNvdXJjZVR5cGUsIDApOwotCQlYbWxUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBhbm5vdGF0aW9uLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RYbWxUcmFuc2Zvcm1hdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUF0dHJpYnV0ZSA9IGdldEZpZWxkKHJlc291cmNlVHlwZSwgMCk7Ci0JCVhtbFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gZ2V0WG1sVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYW5ub3RhdGlvbi5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBYbWxUcmFuc2Zvcm1hdGlvbihvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWFubm90YXRpb24uc2V0T3B0aW9uYWwobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAWG1sVHJhbnNmb3JtYXRpb24iLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvcHRpb25hbCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC54bWwgYi9qYXhiL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDMwMjIuLjAwMDAwMDAKLS0tIGEvamF4Yi90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPHByb2plY3QgbmFtZT0idGVzdHN1aXRlIiBkZWZhdWx0PSJydW4iIGJhc2VkaXI9Ii4iPgotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBTZXQgYSBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWUgZm9yIHdoZW4gaXQgaXMgbm90LiAtLT4KLQk8ZWNobyBtZXNzYWdlPSJiYXNlZGlyICR7YmFzZWRpcn0iIC8+Ci0JPGVjaG8gbWVzc2FnZT0iZWNsaXBzZSBwbGFjZSAke2VjbGlwc2UtaG9tZX0iIC8+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIHBsdWdpbi1uYW1lIC0tPgotCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4tbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMiLz4KLSAgICA8ZWNobyBsZXZlbD0iZGVidWciIG1lc3NhZ2U9InRlc3RSb290OiAke3Rlc3RSb290fSIgLz4KLSAgICA8ZmFpbCBtZXNzYWdlPSJ0ZXN0Um9vdCBtdXN0IGJlIHNldCIgdW5sZXNzPSJ0ZXN0Um9vdCIgLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZTEiPgotICAgIAk8cHJvcGVydHkgZmlsZT0iJHt0ZXN0Um9vdH0vdGVzdFNlcnZlci5wcm9wZXJ0aWVzIi8+Ci0JICAgIDxwcm9wZXJ0eSBuYW1lPSJqcHQtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pwdF9mb2xkZXIiLz4KLQkgICAgPGRlbGV0ZSBkaXI9IiR7anB0LWZvbGRlcn0iIHF1aWV0PSJ0cnVlIi8+Ci0KLQkJPGFudCB0YXJnZXQ9ImNvcmUtdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCSAgICA8cHJvcGVydHkgbmFtZT0iZGF0YS1kaXIiIHZhbHVlPSIke2pwdC1mb2xkZXJ9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qYXhiLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuRUxKYXhiQ29yZVJlc291cmNlTW9kZWxUZXN0cyIvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1Eb3JnLmVjbGlwc2UuanB0LmpheGIuamFyPSR7dGVzdERpcn0vJHtqcHQtamF2YXgteG1sLWJpbmQtamFyfSAtRG9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXI9JHt0ZXN0RGlyfS8ke2pwdC1lY2xpcHNlbGluay1qYXJ9Ii8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCTx0YXJnZXQgbmFtZT0ic3VpdGUyIj4KLSAgICAJPHByb3BlcnR5IGZpbGU9IiR7dGVzdFJvb3R9L3Rlc3RTZXJ2ZXIucHJvcGVydGllcyIvPgotCSAgICA8cHJvcGVydHkgbmFtZT0ianB0LWZvbGRlciIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9qcHRfZm9sZGVyIi8+Ci0JICAgIDxkZWxldGUgZGlyPSIke2pwdC1mb2xkZXJ9IiBxdWlldD0idHJ1ZSIvPgotCi0JCTxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQkgICAgPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtqcHQtZm9sZGVyfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0iJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJjbGFzc25hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuamF4Yi5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRUxKYXhiQ29yZUNvbnRleHRNb2RlbFRlc3RzIi8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLXBhdGgiIHZhbHVlPSIke2VjbGlwc2UtaG9tZX0vcGx1Z2lucy8ke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImV4dHJhVk1hcmdzIiB2YWx1ZT0iLURvcmcuZWNsaXBzZS5qcHQuamF4Yi5qYXI9JHt0ZXN0RGlyfS8ke2pwdC1qYXZheC14bWwtYmluZC1qYXJ9IC1Eb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmphcj0ke3Rlc3REaXJ9LyR7anB0LWVjbGlwc2VsaW5rLWphcn0iLz4KLQkJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IGhvbGRzIGNvZGUgdG8gY2xlYW51cCB0aGUgdGVzdGluZyBlbnZpcm9ubWVudCBhZnRlciAtLT4KLQk8IS0tIGFmdGVyIGFsbCBvZiB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0YXJnZXQgdG8gLS0+Ci0JPCEtLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNyZWF0ZWQuIC0tPgotCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gLS0+Ci0JPCEtLSBhZnRlciBhbGwgdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LCBzdWl0ZTEsIHN1aXRlMiwgY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjEyM2NlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhhMDNmMC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODNlOWRlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNWMzMS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNTgzNy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTA6NDcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2NjZmFkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI5ZjMxZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBKUEEgU3VwcG9ydAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSlBBIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkOWRmNS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjEuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmVjbGlwc2VsaW5rLmZlYXR1cmUiIHZlcnNpb249IjEuMS4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iamF2YXgucGVyc2lzdGVuY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjQucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4xLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi40LjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuNC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDkxNmRmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyODM5MGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1OWU1Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkY2ZjZDYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMDBiYS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MjA4MmYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ODM5Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcxMzE4Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgRWNsaXBzZUxpbmsgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNTllNWYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0IFNvdXJjZVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNmY2Q2Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBlY2xpcHNlMzIuZ2lmLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgc3JjLyoqLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotCi08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi0KLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCi0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjIwODJmLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFY2xpcHNlTGluayBTdXBwb3J0Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8ucHJvamVjdCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzcwMDEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWI4NGEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjExOjE3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE2ZGU3NC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDdjYzc0Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSlBBIENvcmUgSlVuaXQgVGVzdHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLSMgVE9SRVZJRVcgLSB1cGRhdGVTaXRlTmFtZQotdXBkYXRlU2l0ZU5hbWU9V2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFY2xpcHNlTGluayBKUEEgQ29yZSBKVW5pdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTk1NWNiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnRlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnRlc3RzLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY1ZDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWZlYXR1cmUudGVtcC5mb2xkZXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlXzEuMC4xLioKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZjQ4NjIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2M3ZDRiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MDk6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MTY5OGYuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBmZWFmNi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEVjbGlwc2VMaW5rIEpQQSBTdXBwb3J0IFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgYXJjaGl2ZXMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSAtIEVjbGlwc2VMaW5rIEpQQSBTdXBwb3J0Ci0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYxNWZiYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGlua19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmtfc2RrLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWQ5NWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWI1ODM3Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDo0NyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzY2NmYWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU4YWE5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBTdXBwb3J0Ci0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgU3VwcG9ydAotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGIzYjhiLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmciCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5mZWF0dXJlIiB2ZXJzaW9uPSIxLjEuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjkuMCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMuZmVhdHVyZSIgdmVyc2lvbj0iMS45LjAiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjkuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMi4wLjAucXVhbGlmaWVyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuMC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubGFuZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjEuMC5xdWFsaWZpZXIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLnZlbG9jaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuNS4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5qZG9tIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjg4YWUuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NTk0ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJhM2VmMC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3YWQ0Zi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlIENvcnBvcmF0aW9uLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5KdW5lIDA2LCAyMDA3PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRACmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMTYzNGQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDgsIDIwMTAuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlOTUyOWIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NTk0ZC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2NmZhNS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1Yjg0YS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYS50ZXN0cy5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1N1biBNYXkgMjcgMTU6MTE6MTcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTZkZTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMDZlMTEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb21tb24gYW5kIEpQQSBKVW5pdCBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotIyBUT1JFVklFVyAtIHVwZGF0ZVNpdGVOYW1lCi11cGRhdGVTaXRlTmFtZT1XZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIENvbW1vbiBhbmQgSlBBIEpVbml0IFRlc3RzCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUgQ29ycG9yYXRpb24uXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODRhZGQuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMTAwLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBsaWNlbnNlLWZlYXR1cmU9Im9yZy5lY2xpcHNlLmxpY2Vuc2UiCi0gICAgICBsaWNlbnNlLWZlYXR1cmUtdmVyc2lvbj0iMS4wLjAucXVhbGlmaWVyIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi50ZXN0cy5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg3YWViZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1mZWF0dXJlLnRlbXAuZm9sZGVyCi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmVfMS4wLjEuKgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkzM2I1ZS4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzdkNGIuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNTowOTo1OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2MTBjMy4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5qcGEuZmVhdHVyZS5zb3VyY2U9b3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJmZWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIFN1cHBvcnQgU0RLCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSBhcmNoaXZlcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIFN1cHBvcnQKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZSBDb3Jwb3JhdGlvbi5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhmNDE5Li4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYV9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5kb2MuaXN2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LnRlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTcwZmEuLjAwMDAwMDAKLS0tIGEvanBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudGVzdHMuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEudGVzdHMuZmVhdHVyZTwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qcGEvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0X3Nkay5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDUyM2NlLi4wMDAwMDAwCi0tLSBhL2pwYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHRfc2RrLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdF9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGFfc2RrLmZlYXR1cmU8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIzMTVlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmc8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuY29yZS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmY1NjU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhNTU3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kYi51aTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWk8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZGIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGNmY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRiLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGI8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmRiPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTY3MGZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1NTc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS40LjEucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5oZWxwO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Fib3V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhOTEzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWJvdXQgdGhpcyBjb250ZW50IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPjxhIGlkPSJzdGhyZWYyOTUiIG5hbWU9InN0aHJlZjI5NSI+PC9hPgotPGgxPkFib3V0IHRoaXMgY29udGVudDwvaDE+Ci08cD5Ob3ZlbWJlciwgMjAwOTwvcD4KLTxhIGlkPSJzdGhyZWYyOTYiIG5hbWU9InN0aHJlZjI5NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5MaWNlbnNlPC9wPgotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT4uIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+PC9jb2RlPi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE4NGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5BYm91dCB0aGlzIGNvbnRlbnQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEgQnVpbGQgMDA0IiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAwOS0xMS0xNlQ5OjU2OjIzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAzLjAiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjkwIiBuYW1lPSJzdGhyZWYyOTAiPjwvYT4KLTxoMT5BYm91dCB0aGlzIGNvbnRlbnQ8L2gxPgotPHA+Tm92ZW1iZXIsIDIwMDk8L3A+Ci08YSBpZD0ic3RocmVmMjkxIiBuYW1lPSJzdGhyZWYyOTEiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TGljZW5zZTwvcD4KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT48L2NvZGU+LiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IGFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPjwvY29kZT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDA5LCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0MjEwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBjaGVhdHNoZWV0cy8sXAotICAgICAgICAgICAgICAgZGNvbW1vbi8sXAotICAgICAgICAgICAgICAgaW1nLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBidWlsZC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRfbWFwcGluZy5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbmNlcHRzMDAxLmh0bSxcCi0gICAgICAgICAgICAgICBjb25jZXB0czAwMi5odG0sXAotICAgICAgICAgICAgICAgY29uY2VwdHMwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGNvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwMS5odG0sXAotICAgICAgICAgICAgICAgZ2V0dGluZ19zdGFydGVkMDAyLmh0bSxcCi0gICAgICAgICAgICAgICBnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIGdldHRpbmdfc3RhcnRlZDAwNC5odG0sXAotICAgICAgICAgICAgICAgaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGxlZ2FsLmh0bSxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHJlZl9kZXRhaWxzX29ybS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2pwYV9mYWNldC5odG0sXAotICAgICAgICAgICAgICAgcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0sXAotICAgICAgICAgICAgICAgcmVmX25ld19qcGFfcHJvamVjdC5odG0sXAotICAgICAgICAgICAgICAgcmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0sXAotICAgICAgICAgICAgICAgcmVmX3ByaW1hcnlfa2V5Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDAyLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDYuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAwNy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDA4Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMDkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDExLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxMy5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE0Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxNi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDE3Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMTguaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2luaGVyaXRhbmNlLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hbmFnZV9vcm0uaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX21hcHBpbmcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwMS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDAzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDUuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA2Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAwNy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMDguaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDA5Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMC5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDEyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTQuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE1Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxNi5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMTcuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDE4Lmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAxOS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjAuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tzMDIxLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMi5odG0sXAotICAgICAgICAgICAgICAgdGlwc19hbmRfdHJpY2tzLmh0bSxcCi0gICAgICAgICAgICAgICB0b2MueG1sLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldy5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDAxLmh0bSxcCi0gICAgICAgICAgICAgICB3aGF0c19uZXcwMDIuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwMy5odG0sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAxOS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIwLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjEuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyMi5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDIzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyNS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDI2Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjcuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAyOC5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMwLmh0bSxcCi0gICAgICAgICAgICAgICByZWZlcmVuY2UwMjkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZmVyZW5jZTAzMS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMyLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyMy5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjQuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNC5odG0sXAotICAgICAgICAgICAgICAgd2hhdHNfbmV3MDA1Lmh0bSxcCi0gICAgICAgICAgICAgICByZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2FkZF9jb252ZXJ0ZXIuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0sXAotICAgICAgICAgICAgICAgcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0sXAotICAgICAgICAgICAgICAgcmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qYXZhX3BhZ2UuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9qb2luX2NvbHVtbnMuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfc2VsZWN0VGFibGVzLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSxcCi0gICAgICAgICAgICAgICByZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtLFwKLSAgICAgICAgICAgICAgIHJlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0sXAotICAgICAgICAgICAgICAgcmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0sXAotICAgICAgICAgICAgICAgcmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0sXAotICAgICAgICAgICAgICAgcmVmZXJlbmNlMDMzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtLFwKLSAgICAgICAgICAgICAgIHRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSxcCi0gICAgICAgICAgICAgICB0YXNrczAyNS5odG0sXAotICAgICAgICAgICAgICAgdGFza3MwMjYuaHRtLFwKLSAgICAgICAgICAgICAgIHdoYXRzX25ldzAwNi5odG0KLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvYWRkX3BlcnNpc3RlbmNlLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJlZWRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjaGVhdHNoZWV0IHRpdGxlPSJDcmVhdGUgYSBKUEEgUHJvamVjdCI+Ci0gICA8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gY3JlYXRlIGEgSlBBIHByb2plY3QuIAotCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cywgb3IgdG8gc2VlIGEgbGlzdCBvZiBhdmFpbGFibGUgY2hlYXQgc2hlZXRzLCBjbGljayBIZWxwICg/KS4gCi1UbyBzdGFydCB3b3JrIHdvcmtpbmcgb24gdGhpcyBjaGVhdCBzaGVldCBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gQmVnaW4mcXVvdDsgYnV0dG9uIGJlbG93LiAKLQotTGV0JmFwb3M7cyBnZXQgc3RhcnRlZCEKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0gdGl0bGU9IlNldHVwIHRoZSBFbnZpcm9ubWVudCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhdGF0b29scy5kb2MudXNlci9jX2RhdGFiYXNlX2RldmVsb3BtZW50X3NldHVwLmh0bWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgWW91ciBlbnZpcm9ubWVudCBtdXN0IGJlIHNldCB1cCBiZWZvcmUgeW91IGNhbiBwZXJmb3JtIHRoZSBzdGVwcyBpbiB0aGlzIGNoZWF0IHNoZWV0LiAKLQotQ3JlYXRlIGEgZGF0YWJhc2UgcHJvZmlsZSBhbmQgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0KLVRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIGRpYWxvZyBhdXRvbWF0aWNhbGx5IGFwcGVhcnMgd2hlbiB5b3UgY2xpY2sgdGhlICZxdW90O0NsaWNrIHRvIFBlcmZvcm0mcXVvdDsgYnV0dG9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxjb21tYW5kIHNlcmlhbGl6YXRpb249Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5zcWxlZGl0b3IuYXR0YWNoUHJvZmlsZUFjdGlvbiIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9jb21tYW5kPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0iPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBOZXcgUHJvamVjdCBXaXphcmQgdG8gY3JlYXRlIGEgSlBBIHByb2plY3QuIAotU2VsZWN0IDxiPkZpbGUtJmd0O05ldy0mZ3Q7UHJvamVjdC4uLjwvYj4gYW5kIGNob29zZSA8Yj5KUEEtJmd0O0pQQSBQcm9qZWN0PC9iPiBpbiB0aGUgbGlzdC4gCi0KLU9uIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB3aXphcmQsIGVudGVyIGEgcHJvamVjdCBuYW1lIGFuZCBsb2NhdGlvbiwgc2VsZWN0IHlvdXIgdGFyZ2V0IHJ1bnRpbWUsIGFuZCBzZWxlY3QgYSBwcmVkZWZpbmVkIHByb2plY3QgY29uZmlndXJhdGlvbi4KLQotQ2xpY2sgPGI+TmV4dDwvYj4gdG8gZGlzcGxheSB0aGUgbmV4dCBwYWdlIG9mIHRoZSB3aXphcmQuCi0KLVRoZSAmcXVvdDtOZXcgSlBBIFByb2plY3QmcXVvdDsgd2l6YXJkIGlzIGF1dG9tYXRpY2FsbHkgZGlzcGxheWVkIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5PcGVuUHJvamVjdFdpemFyZEFjdGlvbiIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLmpkdC51aSIgY29uZmlybT0iZmFsc2UiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iU2VsZWN0IFByb2plY3QgRmFjZXQiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3BoLXByb2plY3RzLmh0bWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVXNlIHRoZSBQcm9qZWN0IEZhY2V0IHBhZ2UgdG8gc2VsZWN0IGEgcHJlZGVmaW5lZCBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gb3Igc3BlY2lmaWMgc3BlY2lmaWMgZmFjZXRzIHRvIGluY2x1ZGUgaW4gdGhlIHByb2plY3QuIAotCi1DbGljayAmcXVvdDtOZXh0JnF1b3Q7IHRvIGRpc3BsYXkgdGhlIG5leHQgcGFnZSBvZiB0aGUgd2l6YXJkLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLSAgIDxpdGVtIHRpdGxlPSJTcGVjaWZ5IHRoZSBKUEEgRmFjZXQiIGRpYWxvZz0iZmFsc2UiIHNraXA9ImZhbHNlIiBocmVmPSIvb3JnLmVjbGlwc2UuamR0LmRvYy51c2VyL3JlZl9qcGFfZmFjZXQuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgSlBBIEZhY2V0IHBhZ2UgdG8gc3BlY2lmeSB0aGUgdGhlIHZlbmRvci1zcGVjaWZpYyBKUEEgcGxhdGZvcm0sIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSwgYW5kIHRoZSBzcGVjaWZpYyBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4gCi0KLVlvdSBjYW4gYWxzbyBzcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhbiBvcm0ueG1sIGZpbGUuCi0KLUlmIHlvdSBkbyBub3QgaGF2ZSBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiwgY2xpY2sgPGI+QWRkIENvbm5lY3Rpb25zPC9iPiB0byBjcmVhdGUgb25lLiAKLQotSWYgeW91IGRvIG5vdCBoYXZlIGEgZGVmaW5lZCBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSwgY2xpY2sgPGI+Q29uZmlndXJlIGRlZmF1bHQgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnk8L2I+IG9yIDxiPkNvbmZpZ3VyZSB1c2VyIGxpYnJhcmllczwvYj4gdG8gZGVmaW5lIG9uZS4gCi0KLUNsaWNrIDxiPkZpbmlzaDwvYj4gdG8gY29tcGxldGUgdGhlIHdpemFyZCBhbmQgb3BlbiB0aGUgb3BlbiB0aGUgcHJvamVjdC4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iRmluaXNoIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBDb25ncmF0dWxhdGlvbnMhIFlvdSBoYXZlIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGEgSlBBIHByb2plY3QuIENvbXBsZXRlIHRoZSBhZGRpdGlvbmFsIGNoZWF0IHNoZWV0cyB0byBhZGQgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXAgdGhvc2UgZW50aXRpZXMgdG8gZGF0YWJhc2UgdGFibGVzLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgIDwvaXRlbT4KLTwvY2hlYXRzaGVldD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0ZThhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY2hlYXRzaGVldHMvY3JlYXRlX2VudGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNoZWF0c2hlZXQgdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5Ij4KLQk8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLQkJPGRlc2NyaXB0aW9uPgotVGhpcyBjaGVhdCBzaGVldCB3aWxsIGF1dG9tYXRpY2FsbHkgbGF1bmNoIHdpemFyZHMsIHBlcmZvcm0gYWN0aW9ucywgYW5kIGd1aWRlIHlvdSB0aHJvdWdoIHRoZSBzdGVwcyB0byBhZGQgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHRvIHlvdXIgSmF2YSBwcm9qZWN0LiAKLVRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcgY2hlYXQgc2hlZXRzIG9yIHRvIHNlZSBhIGxpc3Qgb2YgYXZhaWxhYmxlIGNoZWF0IHNoZWV0cywgY2xpY2sgSGVscCAoPykuIAotVG8gc3RhcnQgd29yayB3b3JraW5nIG9uIHRoaXMgY2hlYXQgc2hlZXQsIGNsaWNrIHRoZSA8Yj5DbGljayB0byBCZWdpbjwvYj4gYnV0dG9uIGJlbG93LiAKLUxldCdzIGdldCBzdGFydGVkIQotICA8L2Rlc2NyaXB0aW9uPgotCTwvaW50cm8+Ci0JPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIEpQQSBQcm9qZWN0IiBza2lwPSJ0cnVlIj4KLQkJPGRlc2NyaXB0aW9uPgotVG8gY3JlYXRlIGEgUGVyc2lzdGVudCBlbnRpdHksIHlvdSBtdXN0IGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiBJZiB5b3UgYWxyZWFkeSBoYXZlIGEgSlBBIHByb2plY3QsIHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAgYnkgY2xpY2tpbmcgdGhlICJDbGljayB0byBTa2lwIiBidXR0b24uCi1JZiBub3QsIHNlbGVjdCA8Yj5GaWxlLT5OZXctPlByb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLT5KUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIENvbXBsZXRlIGVhY2ggcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBQcm9qZWN0IHdpemFyZCB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iT3BlbiB0aGUgSlBBIERldmVsb3BtZW50IFBlcnNwZWN0aXZlIiBza2lwPSJ0cnVlIiBocmVmPSIvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0iPgotCQk8YWN0aW9uIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmludGVybmFsLmNoZWF0c2hlZXRzLmFjdGlvbnMuT3BlblBlcnNwZWN0aXZlIiBwYXJhbTE9Im9yZy5lY2xpcHNlLmpwdC51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIi8+Ci0JCTxkZXNjcmlwdGlvbj4KLVdoZW4gd29ya2luZyB3aXRoIEpQQSAgcGVyc2lzdGVuY2UsIHlvdSBzaG91bGQgdXNlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZS4gSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUgYWN0aXZlLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAiQ2xpY2sgdG8gU2tpcCIgYnV0dG9uLiAKLUlmIG5vdCwgc2VsZWN0IDxiPldpbmRvdy0+T3BlbiBQZXJzcGVjdGl2ZS0+T3RoZXI8L2I+IGluIHRoZSBtZW51YmFyIGF0IHRoZSB0b3Agb2YgdGhlIHdvcmtiZW5jaC4gSW4gdGhlIFNlbGVjdCBQZXJzcGVjdGl2ZXMgZGlhbG9nLCBzZWxlY3QgPGI+SlBBIERldmVsb3BtZW50PC9iPiBhbmQgY2xpY2sgT0suIFRoaXMgc3RlcCBjaGFuZ2VzIHRoZSBwZXJzcGVjdGl2ZSB0byBzZXQgdXAgdGhlIEVjbGlwc2Ugd29ya2JlbmNoIGZvciBKUEEgZGV2ZWxvcG1lbnQuCi1Zb3UgY2FuIGNsaWNrIHRoZSAiQ2xpY2sgdG8gUGVyZm9ybSIgYnV0dG9uIHRvIGhhdmUgdGhlICJQZXJzaXN0ZW5jZSIgcGVyc3BlY3RpdmUgb3BlbmVkIGF1dG9tYXRpY2FsbHkuCi0gICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSmF2YSBDbGFzcyI+Ci0JCTxkZXNjcmlwdGlvbj4KLVRoZSBuZXh0IHN0ZXAgaXMgdG8gY3JlYXRlIGEgbmV3IEphdmEgY2xhc3MuIEluIHRoZSBtYWluIHRvb2xiYXIgYWdhaW4sIGNsaWNrIG9uIDxiPk5ldyBKYXZhIENsYXNzPC9iPiBidXR0b24gKG9yIHRoZSBsaW5rIGJlbG93KS4KLVRoZSBKYXZhIGVkaXRvciB3aWxsIGF1dG9tYXRpY2FsbHkgb3BlbiBzaG93aW5nIHlvdXIgbmV3IGNsYXNzLiAgICAgIAotICAgICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgUGVyc2lzdGVudCBFbnRpdHkiPgotCQk8ZGVzY3JpcHRpb24+Ci1GaW5hbGx5IHdlIHdpbGwgbWFrZSB0aGUgSmF2YSBjbGFzcyBhIHBlcnNpc3RlbnQgZW50aXR5LgotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotSW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHVzZSB0aGUgIk1hcCBBcyIgZmllbGQgdG8gc2VsZWN0IDxiPkVudGl0eTwvYj4uIERhbGkgYXV0b21hdGljYWxseSBhZGRzIHRoZSBARW50aXR5IGFubm90YXRpb24gdG8gdGhlIGNsYXNzIGluIHRoZSBKYXZhIGVkaXRvci4gCi1Vc2UgdGhlIFRhYmxlLCBDYXRhbG9nLCBhbmQgU2NoZW1hIGZpZWxkcyB0byBhc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgc3BlY2lmaWMgdGFibGUgaW4gdGhlIGRhdGFiYXNlLgotICAgICA8L2Rlc2NyaXB0aW9uPgotCTwvaXRlbT4KLQk8aXRlbSB0aXRsZT0iRmluaXNoIj4KLQkJPGRlc2NyaXB0aW9uPgotQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgYWRkZWQgYSBKUEEgZW50aXR5IHRvIHlvdXIgSlBBIHByb2plY3QuIENvbXBsZXRlIHRoZSBhZGRpdGlvbmFsIGNoZWF0IHNoZWV0cyB0byBtYXAgdGhlIGVudGl0eSdzIGZpZWxkcyB0byBkYXRhYmFzZSB0YWJsZXMuCi0gIDwvZGVzY3JpcHRpb24+Ci0JPC9pdGVtPgotPC9jaGVhdHNoZWV0PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzMwN2YyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jaGVhdHNoZWV0cy9tYXBfZW50aXR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2hlYXRzaGVldCB0aXRsZT0iTWFwIGEgSmF2YSBQZXJzaXN0ZW50IEVudGl0eSI+Ci0gICA8aW50cm8gaHJlZj0iL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtY2hlYXRzaGVldHMuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFRoaXMgY2hlYXQgc2hlZXQgd2lsbCBhdXRvbWF0aWNhbGx5IGxhdW5jaCB3aXphcmRzLCBwZXJmb3JtIGFjdGlvbnMsIGFuZCBndWlkZSB5b3UgdGhyb3VnaCB0aGUgc3RlcHMgdG8gbWFwIHRoZSBmaWVsZHMgb2YgYSBKUEEgZW50aXR5IGVudGl0eSB0byB5b3VyIGRhdGFiYXNlLgotCi1UbyBsZWFybiBtb3JlIGFib3V0IHVzaW5nIGNoZWF0IHNoZWV0cyBvciB0byBzZWUgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaGVhdCBzaGVldHMsIGNsaWNrIEhlbHAgKD8pLiAKLVRvIHN0YXJ0IHdvcmsgd29ya2luZyBvbiB0aGlzIGNoZWF0IHNoZWV0LCBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gQmVnaW4mcXVvdDsgYnV0dG9uIGJlbG93LiAKLQotTGV0JmFwb3M7cyBnZXQgc3RhcnRlZCEKLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2ludHJvPgotICAgPGl0ZW0gdGl0bGU9IlNldHVwIHRoZSBFbnZpcm9ubWVudCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhdGF0b29scy5kb2MudXNlci9jX2RhdGFiYXNlX2RldmVsb3BtZW50X3NldHVwLmh0bWwiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgWW91ciBlbnZpcm9ubWVudCBtdXN0IGJlIHNldCB1cCBiZWZvcmUgeW91IGNhbiBwZXJmb3JtIHRoZSBzdGVwcyBpbiB0aGlzIGNoZWF0IHNoZWV0LiAKLQotQ3JlYXRlIGEgZGF0YWJhc2UgcHJvZmlsZSBhbmQgY29ubmVjdCB0byB0aGUgZGF0YWJhc2UuCi0KLUlmIHlvdSBhbHJlYWR5IGhhdmUgKGFuZCBhcmUgY29ubmVjdGVkIHRvKSBhIGRhdGFiYXNlIGNvbm5lY3Rpb24sIHlvdSAgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4KLQotVGhlIERhdGFiYXNlIENvbm5lY3Rpb24gZGlhbG9nIGF1dG9tYXRpY2FsbHkgYXBwZWFycyB3aGVuIHlvdSBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGNvbW1hbmQgc2VyaWFsaXphdGlvbj0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLnNxbGVkaXRvci5hdHRhY2hQcm9maWxlQWN0aW9uIiBjb25maXJtPSJmYWxzZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSlBBIFByb2plY3QiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiIGhyZWY9Ii9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFVzZSB0aGUgTmV3IFByb2plY3QgV2l6YXJkIHRvIGNyZWF0ZSBhIEpQQSBwcm9qZWN0LiAKLVNlbGVjdCA8Yj5GaWxlLSZndDtOZXctJmd0O1Byb2plY3QuLi48L2I+IGFuZCBjaG9vc2UgPGI+SlBBLSZndDtKUEEgUHJvamVjdDwvYj4gaW4gdGhlIGxpc3QuIAotCi1Db21wbGV0ZSBlYWNoIHBhZ2Ugb2YgdGhlIHdpemFyZCB0byBjcmVhdGUgYSBuZXcgSlBBIHByb2plY3QuCi0KLVRoZSAmcXVvdDtOZXcgSlBBIFByb2plY3QmcXVvdDsgd2l6YXJkIGlzIGF1dG9tYXRpY2FsbHkgZGlzcGxheWVkIHdoZW4geW91IGNsaWNrIHRoZSAmcXVvdDtDbGljayB0byBQZXJmb3JtJnF1b3Q7IGJ1dHRvbi4KLQotSWYgeW91IGFscmVhZHkgaGF2ZSBhIEpQQSBwcm9qZWN0LCB5b3UgIG1heSBza2lwIHRoaXMgc3RlcCBieSBjbGlja2luZyB0aGUgJnF1b3Q7Q2xpY2sgdG8gU2tpcCZxdW90OyBidXR0b24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuT3BlblByb2plY3RXaXphcmRBY3Rpb24iIHBsdWdpbklkPSJvcmcuZWNsaXBzZS5qZHQudWkiIGNvbmZpcm09ImZhbHNlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9Ik9wZW4gdGhlIEpQQSBEZXZlbG9wbWVudCBQZXJzcGVjdGl2ZSIgZGlhbG9nPSJmYWxzZSIgc2tpcD0idHJ1ZSIgaHJlZj0iL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcGVyc3BlY3RpdmUuaHRtIj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgIFdoZW4gd29ya2luZyB3aXRoIEpQQSAgcGVyc2lzdGVuY2UsIHlvdSBzaG91bGQgdXNlIHRoZSBQZXJzaXN0ZW5jZSBwZXJzcGVjdGl2ZS4gSWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgUGVyc2lzdGVuY2UgcGVyc3BlY3RpdmUgYWN0aXZlLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4gCi1JZiBub3QsIHNlbGVjdCA8Yj5XaW5kb3ctJmd0O09wZW4gUGVyc3BlY3RpdmUtJmd0O090aGVyPC9iPiBpbiB0aGUgbWVudWJhciBhdCB0aGUgdG9wIG9mIHRoZSB3b3JrYmVuY2guIEluIHRoZSBTZWxlY3QgUGVyc3BlY3RpdmVzIGRpYWxvZywgc2VsZWN0IDxiPkpQQSBEZXZlbG9wbWVudDwvYj4gYW5kIGNsaWNrIE9LLiBUaGlzIHN0ZXAgY2hhbmdlcyB0aGUgcGVyc3BlY3RpdmUgdG8gc2V0IHVwIHRoZSBFY2xpcHNlIHdvcmtiZW5jaCBmb3IgSlBBIGRldmVsb3BtZW50LgotWW91IGNhbiBjbGljayB0aGUgJnF1b3Q7Q2xpY2sgdG8gUGVyZm9ybSZxdW90OyBidXR0b24gdG8gaGF2ZSB0aGUgJnF1b3Q7UGVyc2lzdGVuY2UmcXVvdDsgcGVyc3BlY3RpdmUgb3BlbmVkIGF1dG9tYXRpY2FsbHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuanB0LnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIGEgSmF2YSBDbGFzcyIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgVGhlIG5leHQgc3RlcCBpcyB0byBjcmVhdGUgYSBuZXcgSmF2YSBjbGFzcy4gSW4gdGhlIG1haW4gdG9vbGJhciBhZ2FpbiwgY2xpY2sgb24gPGI+TmV3IEphdmEgQ2xhc3M8L2I+IGJ1dHRvbiAob3IgdGhlIGxpbmsgYmVsb3cpLgotVGhlIEphdmEgZWRpdG9yIHdpbGwgYXV0b21hdGljYWxseSBvcGVuIHNob3dpbmcgeW91ciBuZXcgY2xhc3MuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkNyZWF0ZSBhIFBlcnNpc3RlbnQgRW50aXR5IiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBGaW5hbGx5IHdlIHdpbGwgbWFrZSB0aGUgSmF2YSBjbGFzcyBhIHBlcnNpc3RlbnQgZW50aXR5LgotSW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotSW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcsIHVzZSB0aGUgJnF1b3Q7TWFwIEFzJnF1b3Q7IGZpZWxkIHRvIHNlbGVjdCA8Yj5FbnRpdHk8L2I+LiBEYWxpIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgQEVudGl0eSBhbm5vdGF0aW9uIHRvIHRoZSBjbGFzcyBpbiB0aGUgSmF2YSBlZGl0b3IuIAotVXNlIHRoZSBUYWJsZSwgQ2F0YWxvZywgYW5kIFNjaGVtYSBmaWVsZHMgdG8gYXNzb2NpYXRlIHRoZSBlbnRpdHkgd2l0aCBhIHNwZWNpZmljIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQWRkIEZpZWxkcyB0byB0aGUgQ2xhc3MiIGRpYWxvZz0iZmFsc2UiIHNraXA9InRydWUiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgTm93IHlvdSB3aWxsIGFkZCBzb21lIGZpZWxkcyB0byB0aGUgZW50aXR5IHRvIG1hcCB0byByb3dzIGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gICAKLQotSWYgeW91ciBwZXJzaXN0ZW50IGVudGl0eSBhbHJlYWR5IGhhcyBmaWVsZHMgdG8gbWFwLCB5b3UgbWF5IHNraXAgdGhpcyBzdGVwIGJ5IGNsaWNraW5nIHRoZSAmcXVvdDtDbGljayB0byBTa2lwJnF1b3Q7IGJ1dHRvbi4gSWYgbm90LCB1c2UgdGhlIEphdmEgZWRpdG9yIHRvIGFkZCBmaWVsZHMgdG8gdGhlIGVudGl0eS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8YWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5jaGVhdHNoZWV0cy5hY3Rpb25zLk9wZW5QZXJzcGVjdGl2ZSIgcGx1Z2luSWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIiBjb25maXJtPSJmYWxzZSIgcGFyYW0xPSJvcmcuZWNsaXBzZS5kYWxpLnVpLlBlcnNpc3RlbmNlUGVyc3BlY3RpdmUiPgotICAgICAgPC9hY3Rpb24+Ci0gICA8L2l0ZW0+Ci0gICA8aXRlbSB0aXRsZT0iQ3JlYXRlIHRoZSBNYXBwaW5nIiBkaWFsb2c9ImZhbHNlIiBza2lwPSJmYWxzZSIgaHJlZj0iL29yZy5lY2xpcHNlLmRhbGkuZG9jLnVzZXIvcmVmX2VudGl0eV9wYWdlLmh0bSI+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICBOb3cgeW91IGFyZSByZWFkeSB0byBtYXAgdGhlIGVudGl0eSBmaWVsZHMgdG8gY29sdW1ucyBpbiB0aGUgZGF0YWJhc2UgdGFibGUuIEluIHRoZSBQYWNrYWdlIEV4cGxvcmVyLCBzZWxlY3QgdGhlIEphdmEgY2xhc3MuIAotCi1JbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LCBleHBhbmQgdGhlIHBlcnNpc3RlbnQgZW50aXR5IHRvIGRpc3BsYXkgdGhlIGZpZWxkcy4gU2VsZWN0IGEgZmllbGQuIAotCi1UaGUgSlBBIERldGFpbHMgdmlldyBkaXNwbGF5cyB0aGUgaW5mb3JtYXRpb24gZm9yIHRoZSBmaWVsZC4gVXNlIHRoZSBNYXAgQXMgZmllbGQgdG8gc2VsZWN0IHRoZSBCYXNpYyBtYXBwaW5nLiBVc2UgdGhlIENvbHVtbiBmaWVsZCB0byBzZWxlY3QgYSBjb2x1bW4gZnJvbSB0aGUgZGF0YWJhc2UgdGFibGUuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuY2hlYXRzaGVldHMuYWN0aW9ucy5PcGVuUGVyc3BlY3RpdmUiIHBsdWdpbklkPSJvcmcuZWNsaXBzZS51aS5jaGVhdHNoZWV0cyIgY29uZmlybT0iZmFsc2UiIHBhcmFtMT0ib3JnLmVjbGlwc2UuZGFsaS51aS5QZXJzaXN0ZW5jZVBlcnNwZWN0aXZlIj4KLSAgICAgIDwvYWN0aW9uPgotICAgPC9pdGVtPgotICAgPGl0ZW0gdGl0bGU9IkZpbmlzaCIgZGlhbG9nPSJmYWxzZSIgc2tpcD0iZmFsc2UiPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgQ29uZ3JhdHVsYXRpb25zISBZb3UgaGF2ZSBzdWNjZXNzZnVsbHkgbWFwcGVkIHRoZSBmaWVsZHMgZnJvbSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgdG8gYSBjb2x1bW4gaW4gYSBkYXRhYmFzZSB0YWJsZS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICA8L2l0ZW0+Ci08L2NoZWF0c2hlZXQ+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9tYXBwaW5nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWY3ZDk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X21hcHBpbmcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJCREpGSSIgbmFtZT0iQkFCQkRKRkkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjEiIG5hbWU9InN0aHJlZjIxIj48L2E+PGEgaWQ9InN0aHJlZjIyIiBuYW1lPSJzdGhyZWYyMiI+PC9hPlRoZSBEYWxpIE9SIChvYmplY3QtcmVsYXRpb25hbCkgTWFwcGluZyBUb29sIGFsbG93cyB5b3UgdG8gZGVzY3JpYmUgaG93IHlvdXIgZW50aXR5IG9iamVjdHMgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bWFwPC9zcGFuPiB0byB0aGUgZGF0YSBzb3VyY2UgKG9yIG90aGVyIG9iamVjdHMpLiBUaGlzIGFwcHJvYWNoIGlzb2xhdGVzIHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGZyb20gdGhlIG9iamVjdCBtb2RlbCZuZGFzaDtkZXZlbG9wZXJzIGFyZSBmcmVlIHRvIGRlc2lnbiB0aGVpciBpZGVhbCBvYmplY3QgbW9kZWwsIGFuZCBEQkFzIGFyZSBmcmVlIHRvIGRlc2lnbiB0aGVpciBpZGVhbCBzY2hlbWEuPC9wPgotPHA+VGhlc2UgbWFwcGluZ3MgdHJhbnNmb3JtIGFuIG9iamVjdCBkYXRhIG1lbWJlciB0eXBlIHRvIGEgY29ycmVzcG9uZGluZyByZWxhdGlvbmFsIGRhdGFiYXNlIGRhdGEgc291cmNlIHJlcHJlc2VudGF0aW9uLiBUaGVzZSBPUiBtYXBwaW5ncyBjYW4gYWxzbyB0cmFuc2Zvcm0gb2JqZWN0IGRhdGEgbWVtYmVycyB0aGF0IHJlZmVyZW5jZSBvdGhlciBkb21haW4gb2JqZWN0cyBzdG9yZWQgaW4gb3RoZXIgdGFibGVzIGluIHRoZSBkYXRhYmFzZSBhbmQgYXJlIHJlbGF0ZWQgdGhyb3VnaCBmb3JlaWduIGtleXMuPC9wPgotPHA+WW91IGNhbiB1c2UgdGhlc2UgbWFwcGluZ3MgdG8gbWFwIHNpbXBsZSBkYXRhIHR5cGVzIGluY2x1ZGluZyBwcmltaXRpdmVzIChzdWNoIGFzIDxjb2RlPmludDwvY29kZT4pLCBKREsgY2xhc3NlcyAoc3VjaCBhcyA8Y29kZT5TdHJpbmc8L2NvZGU+KSwgYW5kIGxhcmdlIG9iamVjdCAoTE9CKSB2YWx1ZXMuIFlvdSBjYW4gYWxzbyB1c2UgdGhlbSB0byB0cmFuc2Zvcm0gb2JqZWN0IGRhdGEgbWVtYmVycyB0aGF0IHJlZmVyZW5jZSBvdGhlciBkb21haW4gb2JqZWN0cyBieSB3YXkgb2YgYXNzb2NpYXRpb24gd2hlcmUgZGF0YSBzb3VyY2UgcmVwcmVzZW50YXRpb25zIHJlcXVpcmUgb2JqZWN0IGlkZW50aXR5IG1haW50ZW5hbmNlIChzdWNoIGFzIHNlcXVlbmNpbmcgYW5kIGJhY2sgcmVmZXJlbmNlcykgYW5kIHBvc3Nlc3MgdmFyaW91cyB0eXBlcyBvZiBtdWx0aXBsaWNpdHkgYW5kIG5hdmlnYWJpbGl0eS4gVGhlIGFwcHJvcHJpYXRlIG1hcHBpbmcgY2xhc3MgaXMgY2hvc2VuIHByaW1hcmlseSBieSB0aGUgY2FyZGluYWxpdHkgb2YgdGhlIHJlbGF0aW9uc2hpcC48L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0X3BlcnNpc3RlbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3ZjgwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJDQUhJQyIgbmFtZT0iQkFCQ0FISUMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxOSIgbmFtZT0ic3RocmVmMTkiPjwvYT48c3BhbiBjbGFzcz0iaXRhbGljIj5QZXJzaXN0ZW5jZTwvc3Bhbj4gcmVmZXJzIHRvIHRoZSBhYmlsaXR5IHRvIHN0b3JlIG9iamVjdHMgaW4gYSBkYXRhYmFzZSBhbmQgdXNlIHRob3NlIG9iamVjdHMgd2l0aCB0cmFuc2FjdGlvbmFsIGludGVncml0eS4gSW4gYSBKMkVFIGFwcGxpY2F0aW9uLCBkYXRhIGlzIHR5cGljYWxseSBzdG9yZWQgYW5kIHBlcnNpc3RlZCBpbiB0aGUgZGF0YSB0aWVyLCBpbiBhIHJlbGF0aW9uYWwgZGF0YWJhc2UuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjIwIiBuYW1lPSJzdGhyZWYyMCI+PC9hPjxzcGFuIGNsYXNzPSJpdGFsaWMiPkVudGl0eSBiZWFuczwvc3Bhbj4gYXJlIGVudGVycHJpc2UgYmVhbnMgdGhhdCBjb250YWluIHBlcnNpc3RlbnQgZGF0YSBhbmQgdGhhdCBjYW4gYmUgc2F2ZWQgaW4gdmFyaW91cyBwZXJzaXN0ZW50IGRhdGEgc3RvcmVzLiBUaGUgZW50aXR5IGJlYW5zIHJlcHJlc2VudCBkYXRhIGZyb20gYSBkYXRhYmFzZTsgZWFjaCBlbnRpdHkgYmVhbiBjYXJyaWVzIGl0cyBvd24gaWRlbnRpdHkuIEVudGl0eSBiZWFucyBjYW4gYmUgZGVwbG95ZWQgdXNpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+YXBwbGljYXRpb24tbWFuYWdlZCBwZXJzaXN0ZW5jZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y29udGFpbmVyLW1hbmFnZWQgcGVyc2lzdGVuY2U8L3NwYW4+LjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0cy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE0MGI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0cy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbmNlcHRzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBDb25jZXB0cyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE4IiBuYW1lPSJzdGhyZWYxOCI+PC9hPjwvcD4KLTxoMT5Db25jZXB0czwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgYW4gb3ZlcnZpZXcgb2YgY29uY2VwdHMgeW91IHNob3VsZCBiZSBmYW1pbGlhciB3aXRoIHdoZW4gdXNpbmcgRGFsaSB0byBjcmVhdGUgbWFwcGluZ3MgZm9yIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPkluIGFkZGl0aW9uIHRvIHRoZXNlIHNlY3Rpb25zLCB5b3Ugc2hvdWxkIHJldmlldyB0aGUgZm9sbG93aW5nIHJlc291cmNlcyBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5FY2xpcHNlIERhbGkgcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGk8L2E+PC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSBwcm9qZWN0OiA8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+SlNSIDIyMCBFSkIgMy4wIHNwZWNpZmljYXRpb246IDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTIyMCI+aHR0cDovL3d3dy5qY3Aub3JnL2VuL2pzci9kZXRhaWw/aWQ9MjIwPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZUxpbmsgcHJvamVjdDogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluayI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluazwvYT48L2NvZGU+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDRkYTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJHRkpHIiBuYW1lPSJCQUJCR0ZKRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2gxPgotPHA+VGhlIEphdmEgMiBFbnRlcnByaXNlIEVkaXRpb24oSjJFRSkgRW50ZXJwcmlzZSBKYXZhQmVhbnMgKEVKQikgYXJlIGEgY29tcG9uZW50IGFyY2hpdGVjdHVyZSB0aGF0IHlvdSB1c2UgdG8gZGV2ZWxvcCBhbmQgZGVwbG95IG9iamVjdC1vcmllbnRlZCwgZGlzdHJpYnV0ZWQsIGVudGVycHJpc2Utc2NhbGUgYXBwbGljYXRpb25zLiBBbiBhcHBsaWNhdGlvbiB3cml0dGVuIGFjY29yZGluZyB0byB0aGUgRW50ZXJwcmlzZSBKYXZhQmVhbnMgYXJjaGl0ZWN0dXJlIGlzIHNjYWxhYmxlLCB0cmFuc2FjdGlvbmFsLCBhbmQgc2VjdXJlLjwvcD4KLTxwPlRoZSBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGltcHJvdmVzIHRoZSBFSkIgYXJjaGl0ZWN0dXJlIGJ5IHJlZHVjaW5nIGl0cyBjb21wbGV4aXR5IHRocm91Z2ggdGhlIHVzZSBvZiBtZXRhZGF0YSAoYW5ub3RhdGlvbnMpIGFuZCBzcGVjaWZ5aW5nIHByb2dyYW1tYXRpYyBkZWZhdWx0cyBvZiB0aGF0IG1ldGFkYXRhLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYxZTQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9jb25jZXB0czAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSERIQUdJSCIgbmFtZT0iQ0hESEFHSUgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWYyMyIgbmFtZT0ic3RocmVmMjMiPjwvYT5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2gxPgotPHA+VGhlIEpQQSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgZm9yIGRlcGxveW1lbnQuIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBkYXRhYmFzZSBhbmQgZW50aXR5IG1hbmFnZXIgb3B0aW9ucywgYW5kIG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgcGVyc2lzdGVuY2UgdW5pdC4gVG8gZW5hYmxlIHlvdSB0byBlYXNpbHkgZWRpdCB0aGlzIGluZm9ybWF0aW9uLCBEYWxpIHByb3ZpZGVzIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB1c2UgdGhlIEVjbGlwc2UgWE1MIEVkaXRvciB0byBjcmVhdGUgYW5kIG1haW50YWluIHRoaXMgaW5mb3JtYXRpb24uIFNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1UbyB3b3JrIHdpdGggbXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMsIGNvbW1lbnQgb3V0IGFsbCBidXQgb25lIHBlcnNpc3RlbmNlIHVuaXQgaW4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbmNlcHRzMDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM4ODdhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29uY2VwdHMwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaGUgb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRoZSBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSERCSUpBQyIgbmFtZT0iQ0hEQklKQUMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWYyNCIgbmFtZT0ic3RocmVmMjQiPjwvYT5UaGUgb3JtLnhtbCBmaWxlPC9oMT4KLTxwPkFsdGhvdWdoIHRoZSBKUEEgc3BlY2lmaWNhdGlvbiBlbXBoYXNpemVzIHRoZSB1c2Ugb2YgYW5ub3RhdGlvbnMgdG8gc3BlY2lmeSBwZXJzaXN0ZW5jZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byBzdG9yZSB0aGlzIG1ldGFkYXRhLiBEYWxpIGVuYWJsZXMgeW91IHRvIGNyZWF0ZSBhIHN0dWIgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgYSBKUEEgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uIFNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhlIG1ldGFkYXRhIG11c3QgbWF0Y2ggdGhlIFhTRCBzcGVjaWZpY2F0aW9uIG9mIHlvdXIgc2VsZWN0ZWQgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPHA+RGFsaSBwcm92aWRlcyBjb21wcmVoZW5zaXZlIHN1cHBvcnQgZm9yIGNvbmZpZ3VyaW5nIFhNTCBtYXBwaW5nIGZpbGVzIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT4gdGhhdCBpcyBuZWFybHkgaWRlbnRpY2FsIHRvIHRoZSBhbm5vdGF0aW9uLWJhc2VkIGNvbmZpZ3VyYXRpb24gaW4gdGhlIEphdmEgc291cmNlLiBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGFsc28gdXNlIHRoZSBFY2xpcHNlIFhNTCBFZGl0b3IgdG8gY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgbWV0YWRhdGEgaW5mb3JtYXRpb24gaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4uPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCI+TWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29udGV4dHMueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2NvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhNjYxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvY29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08Y29udGV4dHM+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9hY2Nlc3NUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRoZSB2YXJpYWJsZSBpcyBhY2Nlc3NlZDogUHJvcGVydHkgKGRlZmF1bHQpIG9yIEZpZWxkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfbmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgbmFtZSBvZiB0aGlzIGVudGl0eS4gQnkgZGVmYXVsdCwgdGhlIGNsYXNzIG5hbWUgaXMgdXNlZCBhcyB0aGUgZW50aXR5IG5hbWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV90YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgdGFibGUgYXNzaWduZWQgdG8gdGhpcyBlbnRpdHkuIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBuYW1lIGlzIHVzZWQgYXMgdGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgYSBwcm9wZXJ0eSBvciBmaWVsZCB0byBiZSBvdmVycmlkZGVuIChmcm9tIHRoZSBkZWZhdWx0IG1hcHBpbmdzKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc05hbWUiPgotCQk8ZGVzY3JpcHRpb24+TmFtZSBvZiB0aGUgZGF0YWJhc2UgY29sdW1uLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBvdmVycmlkZXMgYSBwcm9wZXJ0eSBvciBmaWVsZC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0luc2VydGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBJTlNFUlQgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc1VwZGF0YWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBpcyBhbHdheXMgaW5jbHVkZWQgaW4gU1FMIFVQREFURSBzdGF0ZW1lbnRzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX21hcEFzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRoaXMgYXR0cmlidXRlIG1hcHMgdG8gdGhlIGRhdGFiYXNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfY29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5UYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IGNvbnRhaW5zIHRoZSBzZWxlY3RlZCBjb2x1bW4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5JbnNlcnRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGUgY29sdW1uIGlzIGFsd2F5cyBpbmNsdWRlZCBpbiBTUUwgSU5TRVJUIHN0YXRlbWVudHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19jb2x1bW5VcGRhdGFibGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIFNRTCBVUERBVEUgc3RhdGVtZW50cy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2ZldGNoVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZTogRWFnZXIgKGRlZmF1bHQpIG9yIExhenk8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX29wdGlvbmFsIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZmllcyBpZiB0aGlzIGZpZWxkIGlzIGNhbiBiZSBudWxsLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfZ2VuZXJhdGVkVmFsdWVTdHJhdGVneSI+Ci0JCTxkZXNjcmlwdGlvbj5EZXRlcm1pbmVzIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkOiBBdXRvIChkZWZhdWx0KSwgU2VxdWVuY2UsIElkZW50aXR5LCBvciBUYWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlR2VuZXJhdG9yTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfdGFyZ2V0RW50aXR5Ij4KLQkJPGRlc2NyaXB0aW9uPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLiA8L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2Nhc2NhZGVUeXBlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgd2hpY2ggb3BlcmF0aW9ucyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdob3V0IHRoZSBlbnRpdHk6IEFsbCwgUGVyc2lzdCwgTWVyZ2UsIG9yIE1vdmUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19tYXBwZWRCeSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZmllbGQgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pbkNvbHVtbk5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSByZWZlcmVuY2UgZm9yIHRoZSBlbnRpdHkgYXNzb2NpYXRpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19qb2luUmVmZXJlbmNlZENvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgIG1hcHBpbmcgb2YgYW4gZW50aXR54oCZcyBhdHRyaWJ1dGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyIgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIHRoYXQgaXMgYmVpbmcgbWFwcGVkIHRvIHRoZSBlbnRpdHnigJlzIGF0dHJpYnV0ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfbWFwQXMiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgdHlwZSBvZiBwZXJzaXN0ZW50IGRvbWFpbiBvYmplY3QgZm9yIHRoZSBKYXZhIGNsYXNzOiBQZXJzaXN0ZW50LCBFbWJlZGRlZCwgb3IgTWFwcGVkIFN1cGVyY2xhc3MuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iVW5kZXJzdGFuZGluZyBwZXJzaXN0ZW5jZSIgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImVudGl0eV9pbmhlcml0YW5jZVN0cmF0ZWd5Ij4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IGFuIGVudGl0eSBtYXkgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gb3RoZXIgZW50aXRpZXM6IFNpbmdsZSB0YWJsZSwgT25lIHRhYmxlIHBlciBjbGFzcywgb3IgSm9pbmVkIHRhYmxlcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yQ29sdW1uIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbiB3aGVuIHVzaW5nIGEgU2luZ2xlIG9yIEpvaW5lZCBpbmhlcml0YW5jZSBzdHJhdGVneS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVHlwZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBmaWVsZCB0byBzZXQgdGhlIGRpc2NyaW1pbmF0b3IgdHlwZSB0byBDSEFSIG9yIElOVEVHRVIgKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IFN0cmluZykuIFRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTcGVjaWZ5aW5nIGluaGVyaXRhbmNlIiBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2luaGVyaXRhbmNlRGlzY3JpbWluYXRvclZhbHVlIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgdHlwZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgaW5oZXJpdGFuY2UiIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX29yZGVyQnkiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgZGVmYXVsdCBvcmRlciBmb3Igb2JqZWN0cyByZXR1cm5lZCBmcm9tIGEgcXVlcnkuICAJCi1vcmRlcmJ5X2xpc3Q6Oj0gb3JkZXJieV9pdGVtIFssb3JkZXJieV9pdGVtXSAgICAgCi1vcmRlcmJ5X2l0ZW06Oj0gW3Byb3BlcnR5X29yX2ZpZWxkX25hbWVdIFtBU0MgfCBERVNDXSAgICAgCi1Gb3IgZXhhbXBsZTogImxhc3ROYW1lIEFTQyAsc2FsYXJ5IERFU0MiCTwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBFbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblRhYmxlTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSAgbmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBkZWZpbmVzIHRoZSBmb3JlaWduIGtleSBmb3IgYSBtYW55LXRvLW1hbnkgb3IgYSB1bmlkaXJlY3Rpb25hbCBvbmUtdG8tbWFueSBhc3NvY2lhdGlvbi4gWW91IGNhbiBjb25maWd1cmUgdGhlIGpvaW4gdGFibGUgd2l0aCBhIHNwZWNpZmljIGNhdGFsb2cgb3Igc2NoZW1hLCBjb25maWd1cmUgb25lIG9yIG1vcmUgam9pbiB0YWJsZSBjb2x1bW5zIHdpdGggYSB1bmlxdWUgY29uc3RyYWludCwgYW5kIHVzZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMgcGVyIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX2pvaW5UYWJsZUpvaW5Db2x1bW5zIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgIHR3byBvciBtb3JlIGpvaW4gY29sdW1ucyAodGhhdCBpcywgYSBjb21wb3NpdGUgcHJpbWFyeSBrZXkpLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfam9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGpvaW4gY29sdW1uIG9uIHRoZSBvd25lZCAob3IgaW52ZXJzZSBzaWRlKSBvZiB0aGUgYXNzb2NpYXRpb246IHRoZSBvd25lZCBlbnRpdHkncyBwcmltYXJ5IGtleSBjb2x1bW4uIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBvcHRpb25zIG9uIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZUNvbm5lY3Rpb24iPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBtYXAgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2VTY2hlbWEiPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIHNjaGVtYSB1c2VkIHRvIG1hcCB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb2plY3QgcHJvcGVydGllcyIgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcyIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkUGVyc2lzdGVuY2UiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoZSBBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIHRvIGRlZmluZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2UgdG8gc3RvcmUgdGhlIHBlcnNpc3RlbmNlIGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZU91dGxpbmUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBkaXNwbGF5cyBhbiBvdXRsaW5lIG9mIHRoZSBzdHJ1Y3R1cmUgKGl0cyBhdHRyaWJ1dGVzIGFuZCBtYXBwaW5ncykgb2YgdGhlIGVudGl0eSB0aGF0IGlzIGN1cnJlbnRseSBzZWxlY3RlZCBvciBvcGVuZWQgaW4gdGhlIGVkaXRvci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBTdHJ1Y3R1cmUgdmlldyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGUgR2VuZXJhdGUgRW50aXRpZXMgZGlhbG9nIHRvIGNyZWF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgYmFzZWQgb24geW91ciBkYXRhYmFzZSB0YWJsZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19zb3VyY2UiPgotCQk8ZGVzY3JpcHRpb24+VGhlIHByb2plY3QgZm9sZGVyIG5hbWUgaW4gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy4gQ2xpY2sgQnJvd3NlIHRvIHNlbGVjdCBhbiBleGlzdGluZyBmb2xkZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfcGFja2FnZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgcGFja2FnZSBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLCBvciBjbGljayBCcm93c2UgdG8gc2VsZWN0IGFuIGV4aXN0aW5nIHBhY2thZ2UuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIiBocmVmPSJ0YXNrX2dlbmVyYXRlX2VudGl0aWVzLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfdGFibGVzIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gY3JlYXRlIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZW50aXRpZXMuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iUHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBkZWZpbmUgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gdXNlZCB0byBzdG9yZSB0aGUgcGVyc2lzdGVuY2UgZW50aXRpZXMgYW5kIHRvIGNyZWF0ZSB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19uZXdKUEFQcm9qZWN0Ij4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBkZWZpbmUgdGhlIG5ldyBKUEEgcHJvamVjdCBuYW1lLCBpdHMgbG9jYXRpb24sIHRhcmdldCBydW50aW1lLCBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBzZXR0aW5ncy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgUHJvamVjdCBwYWdlIiBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3Qgd2l6YXJkIiBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZCIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9kYXRhYmFzZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhlc2UgZmllbGRzIHRvIGRlZmluZSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB1c2VkIHRvIHN0b3JlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIFBlcnNpc3RlbmNlIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9wZXJzaXN0ZW5jZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgcHJvamVjdCIgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX2NsYXNzcGF0aCI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBvcHRpb24gdG8gYWRkIGxpYnJhcmllcyBvciBKQVJzIHRoYXQgY29udGFpbiB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgYW5kIGVudGl0aWVzIHRvIHRoZSBwcm9qZWN04oCZcyBKYXZhIEJ1aWxkIFBhdGguPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgUGVyc2lzdGVuY2UgZGlhbG9nIiBocmVmPSJyZWZfYWRkX3BlcnNpc3RlbmNlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfcGFja2FnaW5nIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGVzZSBmaWVsZHMgdG8gY3JlYXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZS4gU2VsZWN0IHRoZSBwZXJzaXN0ZW5jZSB2ZXJzaW9uLCB0aGUgbmFtZSBvZiB0aGUgSlBBIHByb3ZpZGVyLCBhbmQgYSB1bmlxdWUgbmFtZSB0byBpZGVudGlmeSB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFkZCBQZXJzaXN0ZW5jZSBkaWFsb2ciIGhyZWY9InJlZl9hZGRfcGVyc2lzdGVuY2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX29wdGlvbnMgIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIHBhZ2UgdG8gc2VsZWN0IHdoaWNoIHNjcmlwdCBvcHRpb25zIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZCBzY3JpcHQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik9wdGlvbnMgcGFnZSAiIGhyZWY9InJlZl9vcHRpb25zLmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9nZW5lcmF0ZURETF9vYmplY3RzICI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBwYWdlIHRvIHNlbGVjdCB3aGljaCBlbGVtZW50cyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgc2NyaXB0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyB0YWJsZXMgKERETCkgZnJvbSBlbnRpdGllcyAiIGhyZWY9InRhc2tfZ2VuZXJhdGVfZGRsLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJPYmplY3RzIHBhZ2UgIiBocmVmPSJyZWZfb2JqZWN0cy5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJ3aXphcmRfZ2VuZXJhdGVERExfc2F2ZSAiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgcGFnZSB0byBzZWxlY3QgdGhlIGZpbGVuYW1lIGFuZCBsb2NhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkIHNjcmlwdC4gWW91IGNhbiBhbHNvIHByZXZpZXcgdGhlIHNjcmlwdCBhbmQgc3BlY2lmeSB0byBydW4gb3IgY29udGludWUgZWRpdGluZyB0aGUgc2NyaXB0IGFmdGVyIGdlbmVyYXRpb24uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IlNhdmUgYW5kIFJ1biBEREwgcGFnZSAiIGhyZWY9InJlZl9zYXZlX2FuZF9ydW4uaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0id2l6YXJkX2dlbmVyYXRlRERMX3N1bW1hcnkgIj4KLQkJPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBzaG93cyB0aGUgc2V0dGluZ3MgdGhhdCB5b3Ugc2VsZWN0ZWQgZm9yIHRoZSBnZW5lcmF0ZWQgRERMLiBUbyBjaGFuZ2UgYW55IG9wdGlvbiBjbGljayAiQmFjayIgb3IgY2xpY2sgIkZpbmlzaCIgdG8gY29udGludWUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyAoRERMKSBmcm9tIGVudGl0aWVzICIgaHJlZj0idGFza19nZW5lcmF0ZV9kZGwuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvck5hbWUiPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgb2YgdGhlIHRhYmxlIHNlcXVlbmNlIGdlbmVyYXRvci4gVGhpcyBuYW1lIGlzIGdsb2JhbCB0byB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCAoYWNyb3NzIGFsbCBnZW5lcmF0b3IgdHlwZXMpLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvclRhYmxlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yUHJpbWFyeUtleUNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgZGF0YWJhc2UgY29sdW1uIG9mIHRoZSBnZW5lcmF0b3IgdGFibGUgdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yVmFsdWVDb2x1bW4iPgotCQk8ZGVzY3JpcHRpb24+VGhlIG5hbWUgZm9yIHRoZSBjb2x1bW4gdGhhdCBzdG9yZXMgdGhlIGdlbmVyYXRlZCBJRCB2YWx1ZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yUHJpbWFyeUtleUNvbHVtblZhbHVlIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjb2x1bW4gb2YgdGhlIGdlbmVyYXRvciB0YWJsZSB0aGF0IGRlZmluZXMgdGhlIHByaW1hcnkga2V5IHZhbHVlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2RhdGFiYXNlQXV0aG9yaXphdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdG8gY29ubmVjdCAobG9nIGluKSB0byBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gdG8gdXNlIHdpdGggeW91ciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMuIAotCQlZb3UgbXVzdCBoYXZlIGEgZGVmaW5lZCBkYXRhYmFzZSBjb25uZWN0aW9uIChhbmQgYmUgY29ubmVjdGVkKSB0byBhZGQgcGVyc2lzdGVuY2UuIDwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkIHBlcnNpc3RlbmNlIHRvIGEgSmF2YSBwcm9qZWN0IiBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZV9wcm9qZWN0Lmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190ZW1wb3JhbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGlmIHRoZSBtYXBwZWQgZmllbGQgY29udGFpbnMgYSBEYXRlIChqYXZhLnNxbC5EYXRlKSwgVGltZSAoamF2YS5zcWwuVGltZSksIG9yIFRpbWVzdGFtcCAoamF2YS5zcWwuVGltZXN0YW1wKSB2YWx1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfcHJpbWFyeUtleUdlbmVyYXRpb24iPgotCQk8ZGVzY3JpcHRpb24+RGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ190YWJsZUdlbmVyYXRvciI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRvIHVzZSBhIHNwZWNpZmljIGRhdGFiYXNlIHRhYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBwcmltYXJ5IGtleS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5IiBocmVmPSJ0YXNrX21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdG8gdXNlIGEgc3BlY2lmaWMgc2VxdWVuY2UgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JOYW1lIj4KLQkJPGRlc2NyaXB0aW9uPk5hbWUgb2YgdGhlIHNlcXVlbmNlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JTZXF1ZW5jZSI+Ci0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19sb2IiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSBpZiB0aGUgZmllbGQgaXMgbWFwcGVkIHRvIGphdmEuc3FsLkNsb2Igb3IgamF2YS5zcWwuQmxvYi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibWFwcGluZ19lbnVtZXJhdGVkIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgaG93IHRvIHBlcnNpc3QgZW51bWVyYXRlZCBjb25zdHJhaW50cyBpZiB0aGUgU3RyaW5nIHZhbHVlIHN1aXRzIHlvdXIgYXBwbGljYXRpb24gcmVxdWlyZW1lbnRzIG9yIHRvIG1hdGNoIGFuIGV4aXN0aW5nIGRhdGFiYXNlIHNjaGVtYS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VkaXRJbnZlcnNlSm9pbkNvbHVtbiI+Ci0JCTxkZXNjcmlwdGlvbj4uPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYXBwaW5nIGFuIGVudGl0eSIgaHJlZj0idGFza19tYXBwaW5nLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2NhdGFsb2ciPgotCQk8ZGVzY3JpcHRpb24+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgVGFibGUuIFRoaXMgZmllbGQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0cyBpbiB0aGUgb3JtLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfc2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdGhhdCBjb250YWlucyB0aGUgVGFibGUuIFRoaXMgZmllbGQgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0cyBpbiB0aGUgb3JtLnhtbCBmaWxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fcGFja2FnZSI+Ci0JCTxkZXNjcmlwdGlvbj5UaGUgSmF2YSBwYWNrYWdlIHRoYXQgY29udGFpbnMgdGhlIHBlcnNpc3RlbnQgZW50aXRpZXMgdG8gd2hpY2ggdGhlIG9ybS54bWwgZmlsZSBhcHBsaWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fc2NoZW1hIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBzY2hlbWEgdG8gdXNlIGFzIHRoZSBkZWZhdWx0IGZvciBhbGwgZW50aXRpZXMgbWFuYWdlZCBieSB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIERldGFpbHMiIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9Im9ybV9jYXRhbG9nIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkYXRhYmFzZSBjYXRhbG9nIHRvIHVzZSBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIGVudGl0aWVzIG1hbmFnZWQgYnkgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fYWNjZXNzIj4KLQkJPGRlc2NyaXB0aW9uPlRoZSBkZWZhdWx0IGFjY2VzcyBtZXRob2QgZm9yIHZhcmlhYmxlcyBpbiB0aGlzIHByb2plY3Q6IFByb3BlcnR5IG9yIEZpZWxkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcm1fY2FzY2FkZSI+Ci0JCTxkZXNjcmlwdGlvbj5BZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucyBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJKUEEgRGV0YWlscyIgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3JtX3htbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgdGhhdCB0aGUgSmF2YSBjbGFzc2VzIGluIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCBhcmUgZnVsbHkgc3BlY2lmaWVkIGJ5IHRoZWlyIG1ldGFkYXRhLiBBbnkgYW5ub3RhdGlvbnMgd2lsbCBiZSBpZ25vcmVkLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfSlBBUGxhdGZvcm0iPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgdmVuZG9yLXNwZWNpZmljIEpQQSBpbXBsZW1lbnRhdGlvbi5EZWZhdWx0IGlzIEdlbmVyaWMuLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3JlYXRlT1JNIj4KLQkJPGRlc2NyaXB0aW9uPkNyZWF0ZSBhbiBpbml0aWFsIG9ybS54bWwgZmlsZS4gVXNlIHRoaXMgZmlsZSB0byBzcGVjaWZ5IHByb2plY3QgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtIi8+Ci0JPC9jb250ZXh0PgotCi0JPGNvbnRleHQgaWQ9ImNhY2hpbmdfZGVmYXVsdFR5cGUiPgotCQk8ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSBkZWZhdWx0IGNhY2hpbmcgc3RyYXRlZ3kgZm9yIHRoZSBwcm9qZWN0LiBUaGUgZGVmYXVsdCBpcyBXZWFrIHdpdGggU29mdCBTdWJjYWNoZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJjYWNoaW5nX2RlZmF1bHRTaXplIj4KLQkJPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBjYWNoZS4gVGhlIGRlZmF1bHQgaXMgMTAwIGl0ZW1zLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImNhY2hpbmdfZGVmYXVsdFNoYXJlZCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGlmIGNhY2hlZCBpbnN0YW5jZXMgc2hvdWxkIGJlIGluIHRoZSBzaGFyZWQgY2FjaGUgb3IgaW4gYSBjbGllbnQgaXNvbGF0ZWQgY2FjaGUuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ibG9nZ2luZ19sZXZlbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgdGhlIGFtb3VudCBhbmQgZGV0YWlsIG9mIGxvZyBvdXRwdXQgYnkgc2VsZWN0aW5nIHRoZSBsb2cgbGV2ZWwuIERlZmF1bHQgaXMgSW5mbyBsZXZlbC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJsb2dnaW5nX3RpbWVTdGFtcCI+Ci0JCTxkZXNjcmlwdGlvbj5Db250cm9sIHdoZXRoZXIgdGhlIHRpbWVzdGFtcCBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuIERlZmF1bHQgaXMgVHJ1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJsb2dnaW5nX3RocmVhZCI+Ci0JCTxkZXNjcmlwdGlvbj5Db250cm9sIHdoZXRoZXIgYSB0aHJlYWQgaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuIERlZmF1bHQgaXMgVHJ1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJsb2dnaW5nX3Nlc3Npb24iPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIGFuIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuIERlZmF1bHQgaXMgVHJ1ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJsb2dnaW5nX2V4Y2VwdGlvbnMiPgotCQk8ZGVzY3JpcHRpb24+Q29udHJvbCB3aGV0aGVyIHRoZSBleGNlcHRpb25zIHRocm93biBmcm9tIHdpdGhpbiB0aGUgY29kZSBhcmUgbG9nZ2VkIHByaW9yIHRvIHJldHVybmluZyB0aGUgZXhjZXB0aW9uIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiBFbnN1cmVzIHRoYXQgYWxsIGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZCBhbmQgbm90IG1hc2tlZCBieSB0aGUgYXBwbGljYXRpb24gY29kZS4uIERlZmF1bHQgaXMgRmFsc2UuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc19zZXNzaW9uTmFtZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IHRoZSBuYW1lIGJ5IHdoaWNoIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGlzIHN0b3JlZCBpbiB0aGUgc3RhdGljIHNlc3Npb24gbWFuYWdlci48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcHRpb25zX3Nlc3Npb25zWG1sIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gbG9hZGVkIGZyb20gdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gY29uZmlndXJhdGlvbiBmaWxlLiBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiBhcyBhbiBhbHRlcm5hdGl2ZSB0byBhbm5vdGF0aW9ucyBhbmQgZGVwbG95bWVudCBYTUwuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0ib3B0aW9uc190YXJnZXREYXRhYmFzZSI+Ci0JCTxkZXNjcmlwdGlvbj48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJvcHRpb25zX3RhcmdldFNlcnZlciI+Ci0JCTxkZXNjcmlwdGlvbj4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX25ld0pQQVByb2plY3RKYXZhIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBpbmNsdWRlIGV4aXN0aW5nIEphdmEgc291cmNlIGZpbGVzIGluIHRoaXMgcHJvamVjdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkphdmEgcGFnZSIgaHJlZj0icmVmX2phdmFfcGFnZS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTmV3IEpQQSBQcm9qZWN0IHdpemFyZCIgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9ImRpYWxvZ19uZXdKUEFQcm9qZWN0RmFjZXQiPgotCQk8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBGYWNldCBwYWdlIiBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIFByb2plY3Qgd2l6YXJkIiBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZCIgLz4KLQkJPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCIgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VudGl0eUNsYXNzUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSBwYWNrYWdlLCBjbGFzcyBuYW1lLCBhbmQgaW5oZXJpdGFuY2UgcHJvcGVydGllcyBvZiB0aGUgZW50aXR5IHRvIGNyZWF0ZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkVudGl0eSBDbGFzcyBwYWdlIiBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJOZXcgSlBBIEVudGl0eSB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0aW5nIGEgbmV3IEpQQSBlbnRpdHkiIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2VudGl0eVByb3BlcnRpZXNQYWdlIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSBlbnRpdHkgbmFtZSwgYXNzb2NpYXRlZCB0YWJsZSwgYW5kIG1hcHBlZCBmaWVsZHMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJFbnRpdHkgUHJvcGVydGllcyBwYWdlIiBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBKUEEgRW50aXR5IHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIGVudGl0eSIgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfc2VsZWN0VGFibGVzUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgZGF0YWJhc2UgdGFibGVzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgZW50aXRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTZWxlY3QgVGFibGVzIHBhZ2UiIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcyB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX3RhYmxlQXNzb2NpYXRpb25zUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gY3JlYXRlIG9yIGVkaXQgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFuZCBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJUYWJsZSBBc3NvY2lhdGlvbnMgcGFnZSIgaHJlZj0icmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgdGFibGUgbWFwcGluZyBhbmQgZG9tYWluIGNsYXNzIGluZm9ybWF0aW9uIGZvciB0aGUgZ2VuZXJhdGVkIGVudGl0eS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uIHBhZ2UiIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIHdpemFyZCIgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3VzdG9taXplSW5kaXZpZHVhbEVudGl0aWVzIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0YWJsZSBtYXBwaW5nIGFuZCBkb21haW4gY2xhc3MgaW5mb3JtYXRpb24gZm9yIHRoZSBnZW5lcmF0ZWQgZW50aXR5LjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iQ3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMgcGFnZSIgaHJlZj0icmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSIgLz4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBDdXN0b20gRW50aXRpZXMgd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0KLQk8Y29udGV4dCBpZD0iZGlhbG9nX2Fzc29jaWF0aW9uVGFibGVzUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgYXNzb2NpYXRpb24gdGFibGVzIGZvciBhbiBlbnRpdHkuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBc3NvY2lhdGlvbiBUYWJsZXMgcGFnZSIgaHJlZj0icmVmX2Fzc29jaWF0aW9uX3RhYmxlcy5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX2pvaW5Db2x1bW5zUGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iSm9pbiBDb2x1bW5zIHBhZ2UiIGhyZWY9InJlZl9qb2luX2NvbHVtbnMuaHRtIiAvPgotCQk8dG9waWMgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24gd2l6YXJkIiBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtIiAvPgotCTwvY29udGV4dD4JCi0JPGNvbnRleHQgaWQ9ImRpYWxvZ19hc3NvY2lhdGlvbkNhcmRpbmFsaXR5UGFnZSI+Ci0JCTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSBjYXJkaW5hbGl0eSBvZiBhbiBhc3NvY2lhdGlvbiB0YWJsZS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkFzc29jaWF0aW9uIENhcmRpbmFsaXR5IHBhZ2UiIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0iIC8+Ci0JCTx0b3BpYyBsYWJlbD0iQ3JlYXRlIE5ldyBBc3NvY2lhdGlvbiB3aXphcmQiIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0iIC8+Ci0JPC9jb250ZXh0PgkKLQk8Y29udGV4dCBpZD0iZGlhbG9nX3NlbGVjdENhc2NhZGUiPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGFzc29jaWF0aW9uOiBBbGwsIFBlcnNpc3QsIE1lcmdlLCBSZW1vdmUsIG9yIFJlZnJlc2guPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTZWxlY3QgQ2FzY2FkZSBwYWdlIiBocmVmPSJyZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtIi8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFwcGluZyBhbiBlbnRpdHkiIGhyZWY9InRhc2tfbWFwcGluZy5odG0iLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIiBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9nZW5lcmFsIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGdlbmVyYWwgcGVyc2lzdGVuY2Ugb3B0aW9ucy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYWwgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX2Nvbm5lY3Rpb24iPgotCQk8ZGVzY3JpcHRpb24+U3BlY2lmeSB0aGUgZGF0YSBzb3VyY2Ugb3IgSkRCQyBjb25uZWN0aW9uIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDb25uZWN0aW9uIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9jb25uZWN0aW9uIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9jdXN0b21pemF0aW9uIj4KLQkJPGRlc2NyaXB0aW9uPlNwZWNpZnkgdGhlIGRlZmF1bHQgb3IgZW50aXR5IHNwZWNpZmljIEVjbGlwc2VMaW5rIGN1c3RvbWl6YXRpb24gYW5kIHZhbGlkYXRpb24gcHJvcGVydGllcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkN1c3RvbWl6YXRpb24gcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2Nvbm5lY3Rpb24iIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9InBlcnNpc3RlbmNlX2NhY2hpbmciPgotCQk8ZGVzY3JpcHRpb24+Q29uZmlndXJlIHRoZSBzZXNzaW9uIG9yIGVudGl0eSBzcGVjaWZpYyBFY2xpcHNlTGluayBjYWNoaW5nIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDYWNoaW5nIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9jYWNoaW5nIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJwZXJzaXN0ZW5jZV9sb2dnaW5nIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgRWNsaXBzZUxpbmsgbG9nZ2luZyBwcm9wZXJ0aWVzLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iTG9nZ2luZyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbG9nZ2luZyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2Vfb3B0aW9ucyI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIEVjbGlwc2VMaW5rIHNlc3Npb24gYW5kIG1pc2NlbGxhbm91cyBvcHRpb25zLjwvZGVzY3JpcHRpb24+Ci0JCTx0b3BpYyBsYWJlbD0iT3B0aW9ucyBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3B0aW9ucyIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2Vfc2NoZW1hR2VuZXJhdGlvbiI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHNjaGVtYSBnZW5lcmF0aW9uIHByb3BlcnRpZXMuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJTY2hlbWEgR2VuZXJhdGlvbiBwYWdlIiBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfc2NoZW1hR2VuZXJhdGlvbiIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlIiAvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2VfcHJvcGVydGllcyI+Ci0JCTxkZXNjcmlwdGlvbj5Db25maWd1cmUgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBmb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9wZXJ0aWVzIHBhZ2UiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wZXJ0aWVzIiAvPgotCQk8dG9waWMgbGFiZWw9InBlcnNpc3RlbmNlLnhtbCBlZGl0b3IiIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxfZWRpdG9yIiAvPgotCQk8dG9waWMgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UiIC8+Ci0JPC9jb250ZXh0PgotCQk8Y29udGV4dCBpZD0icGVyc2lzdGVuY2Vfc291cmNlIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IlByb3BlcnRpZXMgcGFnZSIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3BlcnRpZXMiIC8+Ci0JCTx0b3BpYyBsYWJlbD0icGVyc2lzdGVuY2UueG1sIGVkaXRvciIgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3htbF9lZGl0b3IiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZSIgLz4KLQk8L2NvbnRleHQ+CQotCTxjb250ZXh0IGlkPSJkaWFsb2dfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlIj4KLQkJPGRlc2NyaXB0aW9uPkNvbmZpZ3VyZSB0aGUgcHJvcGVydGllcyBkZWZpbmVkIGZvciB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9Ik5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgcGFnZSIgaHJlZj0icmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZSIgLz4KLQkJPHRvcGljIGxhYmVsPSJwZXJzaXN0ZW5jZS54bWwgZWRpdG9yIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sX2VkaXRvciIgLz4KLQkJPHRvcGljIGxhYmVsPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIiBocmVmPSJ0YXNrX21hbmFnZV9vcm0iIC8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJkaWFsb2dfY3JlYXRlX25ld19jb252ZXJ0ZXJzIj4KLQkJPGRlc2NyaXB0aW9uPlVzZSB0aGlzIGRpYWxvZyB0byBjcmVhdGUgYSBuZXcgRWNsaXBzZUxpbmsgY29udmV0ZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJBZGQgQ29udmVydGVyIGRpYWxvZyIgaHJlZj0icmVmX2FkZF9jb252ZXJ0ZXIiIC8+Ci0JCTx0b3BpYyBsYWJlbD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgaHJlZj0idGFza19tYW5hZ2Vfb3JtIiAvPgotCTwvY29udGV4dD4KLQotPCEtLSBBZGRlZCBmb3IgMi4zIC0tPgotCTxjb250ZXh0IGlkPSJwcm9wZXJ0aWVzX2Nhbm9uaWNhbE1ldGFtb2RlbCI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZpZXMgaWYgdGhlIHByb2plY3QgbW9kZWwgdXNlcyB0aGUgQ2Fub25pY2FsIE1ldGFtb2RlbC4gPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJQcm9qZWN0IHByb3BlcnRpZXMiIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMiLz4KLQkJPHRvcGljIGxhYmVsPSJVbmRlcnN0YW5kaW5nIHBlcnNpc3RlbmNlIiBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSIvPgotCTwvY29udGV4dD4KLQk8Y29udGV4dCBpZD0iZW50aXR5X2NhY2hlYWJsZSI+Ci0JCTxkZXNjcmlwdGlvbj5TcGVjaWZ5IGlmIHRoZSBlbnRpdHkgdXNlcyB0aGUgQENhY2hhYmxlIGFubm90YXRpb24uIERlZmF1bHQgaXMgQENhY2hhYmxlKGZhbHNlKS48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlVuZGVyc3RhbmRpbmcgcGVyc2lzdGVuY2UiIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJlbnRpdHlfcHJpbWFyeUtleUNsYXNzIj4KLQkJPGRlc2NyaXB0aW9uPkNsaWNrIEJyb3dzZSBhbmQgc2VsZWN0IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGl0eS4gQ2xpY2tpbmcgdGhlIGZpZWxkIG5hbWUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBjbGFzcy48L2Rlc2NyaXB0aW9uPgotCQk8dG9waWMgbGFiZWw9IkpQQSBEZXRhaWxzIiBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JPGNvbnRleHQgaWQ9IndpemFyZF9qYXhic2NoZW1hX2NsYXNzZXMiPgotCQk8ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSBwcm9qZWN0LCBwYWNrYWdlLCBvciBjbGFzc2VzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIFhNTCBzY2hlbWEuIENsaWNrIEZpbmlzaCB0byBnZW5lcmF0ZSB0aGUgc2NoZW1hPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgd2l6YXJkIiBocmVmPSJyZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgc2NoZW1hIGZyb20gY2xhc3NlcyIgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtIi8+Ci0JPC9jb250ZXh0PgotCTxjb250ZXh0IGlkPSJjb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZyI+Ci0JCTxkZXNjcmlwdGlvbj5FbnRlciB0aGUgSkFYQiBjbGFzcyBnZW5lcmF0aW9uIHNldHRpbmdzIGFuZCBjbGljayBGaW5pc2ggdG8gZ2VuZXJhdGUgY2xhc3Nlcy4gIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsIGV4Y2VwdCBmb3IgdGhlIHNvdXJjZSBmb2xkZXIuPC9kZXNjcmlwdGlvbj4KLQkJPHRvcGljIGxhYmVsPSJDb25maWd1cmUgSkFYQiBDbGFzcyBHZW5lcmF0aW9uIGRpYWxvZyIgaHJlZj0icmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bSIvPgotCQk8dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0iLz4KLQk8L2NvbnRleHQ+Ci0JCi0JCi0JCi0JCi0JCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vY3NzL2JsYWZkb2MuY3NzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vY3NzL2JsYWZkb2MuY3NzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWY2MTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9kY29tbW9uL2Nzcy9ibGFmZG9jLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLUBpbXBvcnQgIi4uLy4uLy4uL1BST0RVQ1RfUExVR0lOL2Jvb2suY3NzIjsKLQotc3Bhbi5jb250cm9sLCBzcGFuLmd1aS1vYmplY3QtYWN0aW9uLCBwLnN1YmhlYWQyLCBzcGFuLmJvbGQsIHAubm90ZXAxIHsKLSAgZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ubmFtZSwgcC50aXRsZWluZmlndXJlLCBzcGFuLml0YWxpYyB7Ci0gIGZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotcC50aXRsZWluZmlndXJlLCBwLnN1YmhlYWQyIHsKLSAgcGFkZGluZy10b3A6IDEwcHg7Ci19Ci0KLXNwYW4uY29kZSB7Ci0gIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci19Ci0KLXNwYW4uY29weXJpZ2h0bG9nbyB7Zm9udC1zaXplOiAwLjhlbX0KLQotLmZvb3RlciB7bWFyZ2luLXRvcDogMmVtO2JvcmRlci10b3A6MXB4IHNvbGlkICNjY2NjY2M7cGFkZGluZy10b3A6MWVtO30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2Rjb21tb24vaHRtbC9jcHlyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgyZWM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZGNvbW1vbi9odG1sL2NweXIuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLQotPGhlYWQ+Ci08IS0tICA8bWV0YSBodHRwLWVxdWl2PSJyZWZyZXNoIiBjb250ZW50PSIwO3VybD0uLi8uLi9sZWdhbC5odG0iPiAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaHJlZj0iLi4vLi4vbGVnYWwuaHRtIj5MaWNlbnNlIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTNhZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdldHRpbmcgc3RhcnRlZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgR2V0dGluZyBzdGFydGVkIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMiIgbmFtZT0ic3RocmVmMiI+PC9hPjwvcD4KLTxoMT5HZXR0aW5nIHN0YXJ0ZWQ8L2gxPgotPHA+VGhpcyBzZWN0aW9uIHByb3ZpZGVzIGluZm9ybWF0aW9uIG9uIGdldHRpbmcgc3RhcnRlZCB3aXRoIHRoZSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jQkFCRUZIQ0QiPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtI0JBQklHQ0pBIj5EYWxpIHF1aWNrIHN0YXJ0PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Rm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHBsZWFzZSB2aXNpdCB0aGUgRGFsaSBob21lIHBhZ2UgYXQ6PC9wPgotPHA+PGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scy9kYWxpIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL2RhbGk8L2E+PC9jb2RlPi48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFjZjk2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFRkhDRCIgbmFtZT0iQkFCRUZIQ0QiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uPGEgaWQ9InN0aHJlZjMiIG5hbWU9InN0aHJlZjMiPjwvYT48YSBpZD0ic3RocmVmNCIgbmFtZT0ic3RocmVmNCI+PC9hPjwvaDE+Ci08cD5CZWZvcmUgaW5zdGFsbGluZyBEYWxpLCBlbnN1cmUgdGhhdCB5b3VyIGVudmlyb25tZW50IG1lZXRzIHRoZSBmb2xsb3dpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+bWluaW11bTwvc3Bhbj4gcmVxdWlyZW1lbnRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkVjbGlwc2UgMy42ICg8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2Rvd25sb2FkcyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHM8L2E+PC9jb2RlPik8L3A+Ci08L2xpPgotPGxpPgotPHA+SmF2YSBSdW50aW1lIEVudmlyb25tZW50IChKUkUpIDEuNSAoPGNvZGU+PGEgaHJlZj0iaHR0cDovL2phdmEuY29tIj5odHRwOi8vamF2YS5jb208L2E+PC9jb2RlPik8L3A+Ci08L2xpPgotPGxpPgotPHA+RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgMy4yICg8Y29kZT48YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzPC9hPjwvY29kZT4pPC9wPgotPC9saT4KLTxsaT4KLTxwPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIGZvciBKYXZhIEVFIDUuIEZvciBleGFtcGxlLCB0aGUgRWNsaXBzZUxpbmsgaW1wbGVtZW50YXRpb24gZm9yIEpQQSBjYW4gYmUgb2J0YWluZWQgZnJvbTogPGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvPC9hPjwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlJlZmVyIHRvIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9nZXR0aW5nc3RhcnRlZF9tYWluLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMvZGFsaS9nZXR0aW5nc3RhcnRlZF9tYWluLmh0bWw8L2E+PC9jb2RlPiBmb3IgYWRkaXRpb25hbCBpbnN0YWxsYXRpb24gaW5mb3JtYXRpb24uPC9wPgotPHA+PGEgaWQ9InN0aHJlZjUiIG5hbWU9InN0aHJlZjUiPjwvYT5EYWxpIGlzIGluY2x1ZGVkIGFzIHBhcnQgb2YgV1RQIDMuMi4gTm8gYWRkaXRpb25hbCBpbnN0YWxsYXRpb24gb3IgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC48L3A+Ci08YSBpZD0ic3RocmVmNiIgbmFtZT0ic3RocmVmNiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BY2Nlc3NpYmlsaXR5IEZlYXR1cmVzPC9wPgotPHA+RGFsaSBzdXBwb3J0cyB0aGUgc3RhbmRhcmQgYWNjZXNzaWJpbGl0eSBmZWF0dXJlcyBpbiBFY2xpcHNlLCBpbmNsdWRpbmcgdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYXZpZ2F0aW5nIHRoZSB1c2VyIGludGVyZmFjZSB1c2luZyB0aGUga2V5Ym9hcmQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlNwZWNpZnlpbmcgZ2VuZXJhbCBhY2Nlc3NpYmlsaXR5IHByZWZlcmVuY2VzIGZvciB0aGUgZWRpdG9yLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+U2VlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2FjY2Vzc2liaWxpdHkvYWNjZXNzbWFpbi5odG0iPkFjY2Vzc2liaWxpdHkgRmVhdHVyZXMgaW4gRWNsaXBzZTwvYT4gaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPldvcmtiZW5jaCBVc2VyIEd1aWRlPC9zcGFuPiBmb3IgZGV0YWlscy48L3A+Ci08YSBpZD0ic3RocmVmNyIgbmFtZT0ic3RocmVmNyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5IZWxwIEFjY2Vzc2liaWxpdHk8L3A+Ci08cD5UaGUgZG9jdW1lbnRhdGlvbiBhbmQgaGVscCBjb250YWlucyBtYXJrdXAgdG8gZmFjaWxpdGF0ZSBhY2Nlc3MgYnkgdGhlIGRpc2FibGVkIGNvbW11bml0eS4gU2VlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3Rhc2tzL2hlbHBfYWNjZXNzaWJpbGl0eS5odG0iPkhlbHAgQWNjZXNzaWJpbGl0eTwvYT4gaW4gdGhlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPldvcmtiZW5jaCBVc2VyIEd1aWRlPC9zcGFuPiBmb3IgZGV0YWlscy48L3A+Ci08cD5XaGVuIHVzaW5nIHRoZSBoZWxwLCBiZSBhd2FyZSBvZiB0aGUgZm9sbG93aW5nOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlNjcmVlbiByZWFkZXJzIG1heSBub3QgYWx3YXlzIGNvcnJlY3RseSByZWFkIHRoZSBjb2RlIGV4YW1wbGVzIGluIHRoaXMgZG9jdW1lbnQuIFRoZSBjb252ZW50aW9ucyBmb3Igd3JpdGluZyBjb2RlIHJlcXVpcmUgdGhhdCBjbG9zaW5nIGJyYWNlcyBzaG91bGQgYXBwZWFyIG9uIGFuIG90aGVyd2lzZSBlbXB0eSBsaW5lOyBob3dldmVyLCBzb21lIHNjcmVlbiByZWFkZXJzIG1heSBub3QgYWx3YXlzIHJlYWQgYSBsaW5lIG9mIHRleHQgdGhhdCBjb25zaXN0cyBzb2xlbHkgb2YgYSBicmFja2V0IG9yIGJyYWNlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaGlzIGRvY3VtZW50YXRpb24gbWF5IGNvbnRhaW4gbGlua3MgdG8gV2ViIHNpdGVzIG9mIG90aGVyIGNvbXBhbmllcyBvciBvcmdhbml6YXRpb25zIHRoYXQgd2UgZG8gbm90IGNvbnRyb2wuIFdlIG5laXRoZXIgZXZhbHVhdGUgbm9yIG1ha2UgYW55IHJlcHJlc2VudGF0aW9ucyByZWdhcmRpbmcgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlc2UgV2ViIHNpdGVzLjwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4NTMxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RGFsaSBxdWljayBzdGFydDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJEYWxpIHF1aWNrIHN0YXJ0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUdDSkEiIG5hbWU9IkJBQklHQ0pBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5EYWxpIHF1aWNrIHN0YXJ0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4IiBuYW1lPSJzdGhyZWY4Ij48L2E+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIHRvIGhlbHAgeW91IHF1aWNrbHkgc3RhcnQgdXNpbmcgRGFsaSB0byBjcmVhdGUgcmVsYXRpb25hbCBtYXBwaW5ncyBiZXR3ZWVuIEphdmEgcGVyc2lzdGVudCBlbnRpdGllcyBhbmQgZGF0YWJhc2UgdGFibGVzLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMy5odG0jQkFCREZIREEiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIj5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0aXBzX2FuZF90cmlja3MuaHRtI0NIREhHSEJGIj5UaXBzIGFuZCB0cmlja3M8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwMy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNiYWM3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDAzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREZIREEiIG5hbWU9IkJBQkRGSERBIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvaDE+Ci08cD48YSBpZD0ic3RocmVmOSIgbmFtZT0ic3RocmVmOSI+PC9hPlRoaXMgcXVpY2sgc3RhcnQgc2hvd3MgaG93IHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U2VsZWN0IEZpbGUgJmd0OyBOZXcgJmd0OyBQcm9qZWN0PC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gc2VsZWN0IHRoZSBKUEEgcGVyc3BlY3RpdmUgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgSlBBIFByb2plY3Q8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSBQcm9qZWN0PC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSNDQUNCSkFHQyI+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIGEgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5Qcm9qZWN0IG5hbWU8L3NwYW4+IChzdWNoIGFzIDxjb2RlPlF1aWNrU3RhcnQ8L2NvZGU+KS48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5UYXJnZXQgUnVudGltZTwvc3Bhbj4gKHN1Y2ggYXMgPGNvZGU+QXBhY2hlIFRvbWNhdDwvY29kZT4pIGFuZCBjb25maWd1cmF0aW9uLCBzdWNoIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5VdGlsaXR5IEpQQSBQcm9qZWN0IHdpdGggSmF2YSA1LjA8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIEphdmEgc291cmNlIHBhZ2UgYXBwZWFycy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBUYXJnZXQgUnVudGltZSBpcyBub3QgcmVxdWlyZWQgZm9yIEphdmEgU0UgZGV2ZWxvcG1lbnQuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+SWYgeW91IGhhdmUgZXhpc3RpbmcgSmF2YSBzb3VyY2UgZmlsZXMsIGFkZCB0aGVtIHRvIHlvdXIgY2xhc3NwYXRoIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+T24gdGhlIEpQQSBGYWNldCBkaWFsb2csIHNlbGVjdCB5b3VyIHZlbmRvci1zcGVjaWZpYyBKUEEgcGxhdGZvcm0gKG9yIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4pLCBkYXRhYmFzZSBjb25uZWN0aW9uIChvciBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbiksIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IChzdWNoIGFzIEVjbGlwc2VMaW5rKSwgZGVmaW5lIGhvdyBEYWxpIHNob3VsZCBtYW5hZ2UgcGVyc2lzdGVudCBjbGFzc2VzLCBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIHRoZSBEZWZhdWx0IFNjaGVtYSBmb3IgQ29ubmVjdGlvbjwvc3Bhbj4gaWYgeW91IHJlcXVpcmUgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgb25lIHRoYXQgRGFsaSBkZXJpdmVzIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24sIHdoaWNoIG1heSBiZSBpbmNvcnJlY3QgaW4gc29tZSBjYXNlcy4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGVhbHNvIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBwcm9qZWN0IHRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW5zIHRoZSBKUEEgcGVyc3BlY3RpdmUuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTAiIG5hbWU9InN0aHJlZjEwIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIFByb2plY3QgaW4gUHJvamVjdCBFeHBsb3JlcjwvcD4KLTxpbWcgc3JjPSJpbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZyIgYWx0PSJQYWNrYWdlIEV4cGxvcmVyIHNob3dpbmcgdGhlIEpQQSBwcm9qZWN0LiIgdGl0bGU9IlBhY2thZ2UgRXhwbG9yZXIgc2hvd2luZyB0aGUgSlBBIHByb2plY3QuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPk5vdyB0aGF0IHlvdSBoYXZlIGNyZWF0ZWQgYSBwcm9qZWN0IHdpdGggcGVyc2lzdGVuY2UsIHlvdSBjYW4gY29udGludWUgd2l0aCA8YSBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIj5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvYT4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2dldHRpbmdfc3RhcnRlZDAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5ZWE3Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvZ2V0dGluZ19zdGFydGVkMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkdEREciIG5hbWU9IkJBQkZHRERHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTEiIG5hbWU9InN0aHJlZjExIj48L2E+VGhpcyBxdWljayBzdGFydCBzaG93cyBob3cgdG8gY3JlYXRlIGEgbmV3IHBlcnNpc3RlbnQgSmF2YSBlbnRpdHkuIFdlIHdpbGwgY3JlYXRlIGFuIGVudGl0eSB0byBhc3NvY2lhdGUgd2l0aCBhIGRhdGFiYXNlIHRhYmxlLiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBBRERSRVNTIHRhYmxlIHRvIHlvdXIgZGF0YWJhc2UuPC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBKUEEgcHJvamVjdCBpbiB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIgYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgJmd0OyBFbnRpdHk8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIHBhY2thZ2UgbmFtZSAoc3VjaCBhcyA8Y29kZT5xdWlja3N0YXJ0LmRlbW8ubW9kZWw8L2NvZGU+KSwgdGhlIGNsYXNzIG5hbWUgKHN1Y2ggYXMgPGNvZGU+QWRkcmVzczwvY29kZT4pIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2E+IGFwcGVhcnMsIHdoaWNoIGVuYWJsZXMgeW91IHRvIGRlZmluZSB0aGUgcGVyc2lzdGVuY2UgZmllbGRzLCB3aGljaCB5b3Ugd2lsbCBtYXAgdG8gdGhlIGNvbHVtbnMgb2YgYSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaWQ9InN0aHJlZjEyIiBuYW1lPSJzdGhyZWYxMiI+PC9hPjxhIGlkPSJzdGhyZWYxMyIgbmFtZT0ic3RocmVmMTMiPjwvYT5Vc2UgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nIChpbnZva2VkIGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+KSB0byBhZGQgcGVyc2lzdGVuY2UgZmllbGRzIHRvIHRoZSBBZGRyZXNzIGNsYXNzOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLXByaXZhdGUgTG9uZyBpZDsKLXByaXZhdGUgU3RyaW5nIGNpdHk7Ci1wcml2YXRlIFN0cmluZyBjb3VudHJ5OwotcHJpdmF0ZSBTdHJpbmcgc3RhdGVPclByb3ZpbmNlOwotcHJpdmF0ZSBTdHJpbmcgcG9zdGFsQ29kZTsKLXByaXZhdGUgU3RyaW5nIHN0cmVldDsKLTwvcHJlPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1Zb3Ugd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgY29sdW1ucyB0byB0aGUgQUREUkVTUyBkYXRhYmFzZSB0YWJsZToKLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLU5VTUJFUigxMCwwKSBBRERSRVNTX0lEIChwcmltYXJ5IGtleSkKLVZBUkNIQVIyKDgwKSBQUk9WSU5DRQotVkFSQ0hBUjIoODApIENPVU5UUlkKLVZBUkNIQVIyKDIwKSBQX0NPREUKLVZBUkNIQVIyKDgwKSBTVFJFRVQKLVZBUkNIQVIyKDgwKSBDSVRZCi08L3ByZT4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLTwvcHJlPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LiBXaXRoIHRoZSBDcmVhdGUgSlBBIEVudGl0eSBjb21wbGV0ZWQsIEVjbGlwc2UgZGlzcGxheXMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGRyZXNzPC9zcGFuPiBlbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldy48L3A+Ci08cD5BZGRyZXNzLmphdmEgaW5jbHVkZXMgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24sIHRoZSBwZXJzaXN0ZW5jZSBmaWVsZHMsIGFzIHdlbGwgYXMgPGNvZGU+Z2V0dGVyPC9jb2RlPiBhbmQgPGNvZGU+c2V0dGVyPC9jb2RlPiBtZXRob2RzIGZvciBlYWNoIG9mIHRoZSBmaWVsZHMuPC9wPgotPC9saT4KLTwvb2w+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNCIgbmFtZT0ic3RocmVmMTQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5BZGRyZXNzIEVudGl0eSBpbiBBZGRyZXNzLmphdmE8L3A+Ci08aW1nIHNyYz0iaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nIiBhbHQ9IkphdmEgZWRpdG9yIHdpdGggdGhlIEFkZHJlc3MgZW50aXR5LiIgdGl0bGU9IkphdmEgZWRpdG9yIHdpdGggdGhlIEFkZHJlc3MgZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5FY2xpcHNlIGFsc28gZGlzcGxheXMgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5BZGRyZXNzPC9zcGFuPiBlbnRpdHkgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldzo8L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNSIgbmFtZT0ic3RocmVmMTUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5BZGRyZXNzIEVudGl0eSBpbiB0aGUgSlBBIFN0cnVjdHVyZSBWaWV3PC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZyIgYWx0PSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldy4iIHRpdGxlPSJBZGRyZXNzLmphdmEgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkFkZHJlc3M8L3NwYW4+IGNsYXNzIGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcsIG5vdGljZSB0aGF0IERhbGkgaGFzIGF1dG9tYXRpY2FsbHkgYXNzb2NpYXRlZCB0aGUgQUREUkVTUyBkYXRhYmFzZSB0YWJsZSB3aXRoIHRoZSBlbnRpdHkgYmVjYXVzZSB0aGV5IGFyZSBuYW1lZCBpZGVudGljYWxseS48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLURlcGVuZGluZyBvbiB5b3VyIGRhdGFiYXNlIGNvbm5lY3Rpb24gdHlwZSwgeW91IG1heSBuZWVkIHRvIHNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWE8L3NwYW4+LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYiIG5hbWU9InN0aHJlZjE2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+SlBBIERldGFpbHMgVmlldyBmb3IgQWRkcmVzcyBFbnRpdHk8L3A+Ci08aW1nIHNyYz0iaW1nL2FkZHJlc3MuamF2YV9qcGFfZGV0YWlscy5wbmciIGFsdD0iQWRkcmVzcy5qYXZhIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgdGl0bGU9IkFkZHJlc3MuamF2YSBpbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotQWZ0ZXIgYXNzb2NpYXRpbmcgdGhlIGVudGl0eSB3aXRoIHRoZSBkYXRhYmFzZSB0YWJsZSwgeW91IHNob3VsZCB1cGRhdGUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSB0byBpbmNsdWRlIHRoaXMgSlBBIGVudGl0eS4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3MgTGlzdDwvc3Bhbj4uIERhbGkgYWRkcyB0aGUgZm9sbG93aW5nIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPHA+PGNvZGU+Jmx0O2NsYXNzJmd0O3F1aWNrc3RhcnQuZGVtby5tb2RlbC5BZGRyZXNzJmx0Oy9jbGFzcyZndDs8L2NvZGU+PC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPHA+Tm93IHdlIGFyZSByZWFkeSB0byBtYXAgZWFjaCBmaWVsZHMgaW4gdGhlIEFkZHJlc3MgY2xhc3MgdG8gYSBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5pZDwvc3Bhbj4gZmllbGQgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIGlkIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgaWQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgSlBBIERldGFpbHMgdmlldywgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BRERSRVNTX0lEPC9zcGFuPiBpbiB0aGUgTmFtZSBmaWVsZDo8L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNyIgbmFtZT0ic3RocmVmMTciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRGV0YWlscyBWaWV3IGZvciB0aGUgYWRkcmVzc0lkIEZpZWxkPC9wPgotPGltZyBzcmM9ImltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmciIGFsdD0iVGhlIEpQQSBEZXRhaWxzIHZpZXcgZm9yIHRoZSBBZGRyZXNzIGVudGl0eSZyc3F1bztzIGlkIGF0dHJpYnV0ZS4iIHRpdGxlPSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgdGhlIEFkZHJlc3MgZW50aXR5JnJzcXVvO3MgaWQgYXR0cmlidXRlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgQWRkcmVzcyBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQElkCi1AQ29sdW1uKG5hbWU9IkFERFJFU1NfSUQiKQotPC9wcmU+PC9saT4KLTxsaT4KLTxwPk1hcCBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzIChhcyA8c3BhbiBjbGFzcz0iYm9sZCI+QmFzaWM8L3NwYW4+IG1hcHBpbmdzKSB0byB0aGUgYXBwcm9wcmlhdGUgZGF0YWJhc2UgY29sdW1uOjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJIUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG1hcHBpbmdzIGZvciBlYWNoIG9mIHRoZSBmaWVsZHMgaW4gdGhlIEFkZHJlc3MgZW50aXR5LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG1hcHBpbmdzIGZvciBlYWNoIG9mIHRoZSBmaWVsZHMgaW4gdGhlIEFkZHJlc3MgZW50aXR5LiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzMlIiAvPgotPGNvbCB3aWR0aD0iMzMlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OCI+RmllbGQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDgiPk1hcCBBczwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RGF0YWJhc2UgQ29sdW1uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5jaXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDggcjFjMy10OCI+Q0lUWTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5jb3VudHJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+Q09VTlRSWTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5wb3N0YWxDb2RlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10OCByMWMyLXQ4Ij5CYXNpYzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMy10OCI+UF9DT0RFPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPnByb3ZpbmNlT3JTdGF0ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzMtdDgiPlBST1ZJTkNFPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPnN0cmVldDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPlNUUkVFVDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RGFsaSBhdXRvbWF0aWNhbGx5IG1hcHMgc29tZSBmaWVsZHMgdG8gdGhlIGNvcnJlY3QgZGF0YWJhc2UgY29sdW1uIChzdWNoIGFzIHRoZSBjaXR5IGZpZWxkIHRvIHRoZSBDaXR5IGNvbHVtbikgaWYgdGhlIG5hbWVzIGFyZSBpZGVudGljYWwuPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzLmphdmFfanBhX2RldGFpbHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGNmMDA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzcy5qYXZhX2pwYV9kZXRhaWxzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvYWRkcmVzc19pZF9kZXRhaWxzX3F1aWNrc3RhcnQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjQwY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2lkX2RldGFpbHNfcXVpY2tzdGFydC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9hZGRyZXNzX2phdmFfSlBBX3N0cnVjdHVyZV9xdWlja3N0YXJ0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFmNTFhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2FkZHJlc3NfamF2YV9KUEFfc3RydWN0dXJlX3F1aWNrc3RhcnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2VudGl0eV93aXphcmQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzYwZTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3JlYXRlX2pwYV9maWVsZHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5Nzk3YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jcmVhdGVfanBhX2ZpZWxkcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9kZWZhdWx0X2VudGl0eV9nZW5lcmF0aW9uLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2RlZmF1bHRfZW50aXR5X2dlbmVyYXRpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTY3NjE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvY3VzdG9taXplX2RlZmF1bHRfZW50aXR5X2dlbmVyYXRpb24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9pbmRpdmlkdWFsX2VudGl0aWVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM3YmRlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2N1c3RvbWl6ZV9pbmRpdmlkdWFsX2VudGl0aWVzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2RldGFpbHNfZW50aXR5bWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjYzMDBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2Vycm9yX3NhbXBsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDk2NDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9lcnJvcl9zYW1wbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MTFkMDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9nZW5lcmF0ZV9lbnRpdGllcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYWEyNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9nZW5lcmF0ZV9lbnRpdGllcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2ljb25fYmFzaWNtYXBtYXBwaW5ncy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2ljb25fYmFzaWNtYXBtYXBwaW5ncy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZWVmM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pY29uX2Jhc2ljbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2ljb25fYmFzaWNtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE5Mzc1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2ljb25fYmFzaWNtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfam9pbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI2ODc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2Vfam9pbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDY0ODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV9zaW5nbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV90YWIucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9pbmhlcml0YW5jZV90YWIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzZkZDlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvaW5oZXJpdGFuY2VfdGFiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2phdmFfZWRpdG9yX2FkZHJlc3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzQyODkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL2pheGJfc2NobWVhX2dlbmVyYXRpb25fZGlhbG9nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF4Yl9zY2htZWFfZ2VuZXJhdGlvbl9kaWFsb2cucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIyMjJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvamF4Yl9zY2htZWFfZ2VuZXJhdGlvbl9kaWFsb2cucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDU1MGVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvanBhX3dpemFyZF9jcmVhdGVfZmllbGRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwZWRfZW50aXR5X3R5cGVfbGluay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjE2MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwZWRfZW50aXR5X3R5cGVfbGluay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfZmlsZV9uZXcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM1NTc0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfZmlsZV9uZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VtYmVkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NmVhNmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VtYmVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbnRpdHkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MDRmZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fc3VwZXJjbGFzcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL21hcHBpbmdfdHlwZV9zZWxlY3Rpb25fc3VwZXJjbGFzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOGU4ZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tb2RpZnlfZmFjZXRlZF9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0Yzc5NjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9tb2RpZnlfZmFjZXRlZF9wcm9qZWN0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjBiN2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fYmFzaWNtYXBwaW5ncy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGFibGVlbnRpdHltYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODI5NGVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkYWJsZWVudGl0eW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9lbWJlZGRlZGlkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJlOWRjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRtYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fZW1iZWRkZWRtYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkNTJiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2lkbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX2lkbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZWZiNWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9pZG1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYW55dG9tYW55bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI4MDIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b21hbnltYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvb25lbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hbnl0b29uZW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2FjYzE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFueXRvb25lbWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX21hcHBlZGVudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGVhMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fbWFwcGVkc3VwZXJjbGFzcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTdjZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9tYW55bWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvbWFueW1hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGRjOTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fb25ldG9tYW55bWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvb25lbWFwcGluZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19pY29uX29uZXRvb25lbWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZDliYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl9vbmV0b29uZW1hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl90cmFuc2llbnRtYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MDQ4OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl90cmFuc2llbnRtYXBwaW5nLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl92ZXJzaW9ubWFwcGluZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NzM3MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfaWNvbl92ZXJzaW9ubWFwcGluZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfZmFjZXRfdGFzay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MDc4MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX2ZhY2V0X3Rhc2sucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3BlcnNwZWN0aXZlX2J1dHRvbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0MjVhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ld19qcGFfcGVyc3BlY3RpdmVfYnV0dG9uLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmV3X2pwYV9wcm9qZWN0X3Rhc2sucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDc5YzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZXdfanBhX3Byb2plY3RfdGFzay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsYy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsYy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzgxYTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbGMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHIucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9uZ3JlbHIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmJjNzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWxyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWx0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvbmdyZWx0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhZjIxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL25ncmVsdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3BlcnNpc3RlbmNlX291dGxpbmVfdmlldy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2OWFhODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wZXJzaXN0ZW5jZV9vdXRsaW5lX3ZpZXcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzU1N2VlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcHJvamVjdF9wcm9wZXJ0aWVzX3Rhc2tzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvcXVpY2tzdGFydF9wcm9qZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhjYTA1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3F1aWNrc3RhcnRfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlY29uZGFyeV90YWJsZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWNvbmRhcnlfdGFibGVzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxZjlmNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlY29uZGFyeV90YWJsZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2VudGl0eS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZWJlOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX2pwYV9wcm9qZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyMzUwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF9hX3dpemFyZF9tYXBwaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDljOWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfamF4Yl9zY2hlbWFfd2l6YXJkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X2pheGJfc2NoZW1hX3dpemFyZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4N2U2MWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zZWxlY3RfamF4Yl9zY2hlbWFfd2l6YXJkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X3RhYmxlcy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3NlbGVjdF90YWJsZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTdjOTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvc2VsZWN0X3RhYmxlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy9zeW5jaG9ybml6ZV9jbGFzc2VzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1OWY2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWI0MGJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfYXNzb2NpYXRpb25zLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfZW50aXR5LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdGFibGVfZW50aXR5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhMWRiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3RhYmxlX2VudGl0eS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3Rhc2tfZW50ZXJpbmdfcXVlcnkucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiZWFjZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2ltZy90YXNrX2VudGVyaW5nX3F1ZXJ5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdXBncmFkZV9wZXJzaXN0ZW5jZV9qcGFfdmVyc2lvbi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW1nL3VwZ3JhZGVfcGVyc2lzdGVuY2VfanBhX3ZlcnNpb24ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmZhNGQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9pbWcvdXBncmFkZV9wZXJzaXN0ZW5jZV9qcGFfdmVyc2lvbi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW5kZXgueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmOWJlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz4KLTxpbmRleCB2ZXJzaW9uPSIxLjAiPgotICA8ZW50cnkga2V5d29yZD0iQEJhc2ljIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTYiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBDb2x1bW4iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARGlzY3JpbWluYXRvckNvbHVtbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTYiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzOSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQERpc2NyaW1pbmF0b3JWYWx1ZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTgiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGFibGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjgxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRlZCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI3N0aHJlZjEyMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVtYmVkZGVkSWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRlZCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEyNCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVudGl0eSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQEVudW1lcmF0ZWQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjU1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAR2VuZXJhdGVkVmFsdWUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNzdGhyZWYyNjUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBJZCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTI4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASW5oZXJpdGFuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjk0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJASm9pbkNvbHVtbiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTM5IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxNDkiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jc3RocmVmMjYxIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jc3RocmVmMjY0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJATG9iIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1MCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE1hbnlUb01hbnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMzIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9PbmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzNyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE1hcHBlZFN1cGVyY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY4OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE5hbWVkUXVlcnkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjEwOCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQE9uZVRvTWFueSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAT25lVG9PbmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJAT3JkZXJCeSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkBTZXF1ZW5jZUdlbmVyYXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI2NyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQFRlbXBvcmFsIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQFRyYW5zaWVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjE1MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQFZlcnNpb24iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTU2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhcmNoaXRlY3R1cmUgb2YgRGFsaSBmZWF0dXJlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMy5odG0jc3RocmVmMzAzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJhc3NvY2lhdGlvbiB0YWJsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgTmV3IEFzc29jaWF0aW9uIj48dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNzdGhyZWYyMjEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZSBvdmVycmlkZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNzdGhyZWYyMjgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkF0dHJpYnV0ZSBPdmVycmlkZXMgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkF0dHJpYnV0ZSBvdmVycmlkZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI3N0aHJlZjIzMCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMjQ0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVW5kZXJzdGFuZGluZyBPUiBtYXBwaW5ncyI+PHRvcGljIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jc3RocmVmMjEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iYmFzaWMgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBCYXNpYyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQmFzaWMgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNzdGhyZWYxMTUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSIoU2VlIGFsc28gbWFwcGluZ3MpIj48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2FjaGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNhY2hpbmciPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI3N0aHJlZjI3OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY2Fub25pY2FsIG1ldGFtb2RlbCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjk4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjYXJkaW5hbGl0eSAtIGFzc29jaWF0aW9uIHRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkFzc29jaWF0aW9uIENhcmRpbmFsaXR5Ij48dG9waWMgaHJlZj0icmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSNzdGhyZWYyMjQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNsYXNzZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgcGVyc2lzdGVuY2UgdG8iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzIj48dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjY5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW1iZWRkYWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVudGl0eSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjcyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2VuZXJhdGluZyBzY2hlbWEgZnJvbSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI3N0aHJlZjE5MCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI3N0aHJlZjE5OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnZWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY1MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIHBlcnNpc3RlbnQgY2xhc3NlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIEZhY2V0IHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNzdGhyZWYyMDciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFwcGVkIHN1cGVyY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrczAwOC5odG0jc3RocmVmODYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzeW5jaHJvbml6aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jc3RocmVmNTIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29sdW1ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRpc2NyaW1pbmF0b3IiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTciIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jc3RocmVmMjQwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iam9pbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNzdGhyZWYxMzgiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ4IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBUYWJsZSBJbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jc3RocmVmMjYwIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNzdGhyZWYyNjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIHRvIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjQ2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsdWUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmOTkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jc3RocmVmMjM4IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbm5lY3Rpb24gcG9vbCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY1MSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iY29udmVydGluZyBKYXZhIHByb2plY3QgdG8gSlBBIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza3MwMDEuaHRtI3N0aHJlZjM3IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgYSBKUEEgUHJvamVjdCBXaXphcmQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYyOSIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jc3RocmVmMTk0IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI3N0aHJlZjIwMiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCI+PHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNzdGhyZWYyMDQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRhdGFiYXNlIHRhYmxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyI+PHRvcGljIGhyZWY9InRhc2tzMDIxLmh0bSNzdGhyZWYxNjEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2UgLSBwZXJzaXN0ZW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbm5lY3Rpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjkzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2NoZW1hIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkZXJpdmVkIElEIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMy5odG0jc3RocmVmMzAyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlYWdlciBmZXRjaCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDgiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGFibGUgY2xhc3MiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkYWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRhYmxlIj48dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI3N0aHJlZjc5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIElEIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW1iZWRkZWRJZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgSUQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDEyLmh0bSNzdGhyZWYxMjMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW1iZWRkZWQgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBFbWJlZGRlZCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMjEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkZWQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDExLmh0bSNzdGhyZWYxMTkiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZW50aXRpZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJARW50aXR5IGFubm90YXRpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSI+PHRvcGljIGhyZWY9InRhc2tzMDA2Lmh0bSNzdGhyZWY3NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiPjx0b3BpYyBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNzdGhyZWYyMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEpQQSBFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNzdGhyZWY0MCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImN1c3RvbWl6aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllcyI+PHRvcGljIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jc3RocmVmMjIwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW1iZWRkYWJsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW1iZWRkYWJsZSI+PHRvcGljIGhyZWY9InRhc2tzMDA3Lmh0bSNzdGhyZWY4MyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZyb20gdGFibGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzIj48dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI3N0aHJlZjE1OCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlNlbGVjdCBUYWJsZXMiPjx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNzdGhyZWYyMTYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnZW5lcmF0aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiI+PHRvcGljIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jc3RocmVmMjE5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI3N0aHJlZjIyNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBlZCBzdXBlcmNsYXNzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY4OSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB3aXRoIHBlcnNpc3RlbnQgZmllbGRzIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDA0Lmh0bSNzdGhyZWYxMyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBwZXJzaXN0ZW50IGZpZWxkcyI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwNC5odG0jc3RocmVmMTEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwZXJzaXN0ZW50Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzAiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkiPjx0b3BpYyBocmVmPSJ0YXNrczAwNi5odG0jc3RocmVmNzYiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkgdGFibGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI3N0aHJlZjIzMyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJFbnRpdHkgQ2xhc3MgcGFnZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNlbGVjdGluZyB0aGUgQ3JlYXRlIGEgSlBBIEVudGl0eSBXaXphcmQiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNzdGhyZWY0MyIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRW50aXR5IFByb3BlcnRpZXMgcGFnZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IiZsdDthIGlkPSZxdW90O3N0aHJlZjQzJnF1b3Q7IG5hbWU9JnF1b3Q7c3RocmVmNDMmcXVvdDsmZ3Q7Jmx0Oy9hJmd0O1RoZSBFbnRpdHkgQ2xhc3MgUGFnZSI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI3N0aHJlZjQ1IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbnVtZXJhdGVkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI1NCIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjU2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlcnJvciBtZXNzYWdlcyAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMy5odG0jc3RocmVmMTY3IiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVycm9yIG1lc3NhZ2VzIj48dG9waWMgaHJlZj0idGFza3MwMjQuaHRtI3N0aHJlZjE3MiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZXh0ZW5zaW9uIHBvaW50cyAtIERhbGkgZmVhdHVyZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI3N0aHJlZjMwNCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmV0Y2ggdHlwZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNDciIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIGRpYWxvZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTYwIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNlbGVjdCBUYWJsZXMiPjx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNzdGhyZWYyMTUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXMgd2l6YXJkIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI3N0aHJlZjE5MiIgLz48L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNzdGhyZWYyMDAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRlZCB2YWx1ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5ncyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9wcmltYXJ5X2tleS5odG0jc3RocmVmMjY2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2VxdWVuY2UiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByaW1hcnkgS2V5IEdlbmVyYXRpb24gaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI3N0aHJlZjI2OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJoaW50cyAtIHF1ZXJ5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgTmFtZWQgUXVlcmllcyI+PHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNzdGhyZWYxMTAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJASWQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTI5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IklEIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxMy5odG0jc3RocmVmMTI3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImluaGVyaXRhbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXR5Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjkzIiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5IENsYXNzIHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfRW50aXR5Q2xhc3NQYWdlLmh0bSNzdGhyZWYyMDkiIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJbmhlcml0YW5jZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jc3RocmVmMjM2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iam9pbmVkIHRhYmxlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2luZ2xlIFRhYmxlIEluaGVyaXRhbmNlIj48dG9waWMgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jc3RocmVmMTA1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2luZ2xlIHRhYmxlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwMCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJJbmhlcml0YW5jZSAtIGluIEphdmEgRGV0YWlscyB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI3N0aHJlZjIzNSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iaW5zdGFsbGF0aW9uIC0gRGFsaSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWYzIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKYXZhIHByb2plY3QgLSBjb252ZXJ0aW5nIHRvIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNzdGhyZWYzNSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSkFYQiI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNzdGhyZWYxOTEiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBKQVhCIENsYXNzZXMgZnJvbSBhIFNjaGVtYSI+PHRvcGljIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jc3RocmVmMTk5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJqb2luIGNvbHVtbnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKb2luIENvbHVtbnMiPjx0b3BpYyBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNzdGhyZWYyMjMiIC8+PC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNzdGhyZWYyNjIiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImpvaW5lZCB0YWJsZXMgLSBpbmhlcml0YW5jZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNpbmdsZSBUYWJsZSBJbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwNiIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMjQyIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXRpZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcykiPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNzdGhyZWYyMjUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlIj48dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNzdGhyZWYzMDAiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVGhlIEphdmEgU291cmNlIFBhZ2UiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMzQiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpQQSBwcm9qZWN0Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udmVydGluZyBmcm9tIEphdmEiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCI+PHRvcGljIGhyZWY9InRhc2tzMDAxLmh0bSNzdGhyZWYzNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIG5ldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPjx0b3BpYyBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jc3RocmVmMjciIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBsZW1lbnRhdGlvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIEZhY2V0IHBhZ2UiPjx0b3BpYyBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNzdGhyZWYyMDUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwYWdlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWYyOSZxdW90OyBuYW1lPSZxdW90O3N0aHJlZjI5JnF1b3Q7Jmd0OyZsdDsvYSZndDtTZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZCI+PHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNzdGhyZWYzMSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IiZsdDthIGlkPSZxdW90O3N0aHJlZjE5NCZxdW90OyBuYW1lPSZxdW90O3N0aHJlZjE5NCZxdW90OyZndDsmbHQ7L2EmZ3Q7U2VsZWN0aW5nIHRoZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgd2l6YXJkIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI3N0aHJlZjE5NiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InBsYXRmb3JtIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIFZhbGlkYXRpb24gUHJlZmVyZW5jZXMiPjx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI3N0aHJlZjI5MiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKUEEgU3RydWN0dXJlIHZpZXciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgU3RydWN0dXJlIHZpZXciPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jc3RocmVmMjcwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJsYXp5IGZldGNoIj4KLSAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhbCBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI3N0aHJlZjI0OSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibGlicmFyeSAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBGYWNldCBwYWdlIj48dG9waWMgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jc3RocmVmMjA2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYW55LXRvLW1hbnkgbWFwcGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBNYW55VG9NYW55Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE0Lmh0bSNzdGhyZWYxMzMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMxIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tb25lIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJATWFueVRvT25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW55LXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTUuaHRtI3N0aHJlZjEzNSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwZWQgc3VwZXJjbGFzcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkBNYXBwZWRTdXBlcmNsYXNzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY4NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYXBwZWQgc3VwZXJjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNzdGhyZWY4NSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGVudGl0aWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI3N0aHJlZjEyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5nIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSImbHQ7YSBpZD0mcXVvdDtzdGhyZWY1OCZxdW90OyBuYW1lPSZxdW90O3N0aHJlZjU4JnF1b3Q7Jmd0OyZsdDsvYSZndDtNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza3MwMDQuaHRtI3N0aHJlZjYxIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkVudGl0eSBDbGFzcyBwYWdlIj48dG9waWMgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jc3RocmVmMjEwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJtYXBwaW5ncyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJVbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzIj48dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNzdGhyZWYyMiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImJhc2ljIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJCYXNpYyBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTAuaHRtI3N0aHJlZjExNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRlZCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTEuaHRtI3N0aHJlZjExOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVtYmVkZGVkIElEIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJFbWJlZGRlZCBJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI3N0aHJlZjEyMiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IklEIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJJRCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTMuaHRtI3N0aHJlZjEyNiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbnktdG8tbWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFueS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jc3RocmVmMTMwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFueS10by1vbmUiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik1hbnktdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNS5odG0jc3RocmVmMTM0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW1hbnkiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1tYW55IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jc3RocmVmMTQwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW9uZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW9uZSBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI3N0aHJlZjE0NCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2JsZW1zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJWYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMy5odG0jc3RocmVmMTcwIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idHJhbnNpZW50Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUcmFuc2llbnQgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE4Lmh0bSNzdGhyZWYxNTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2ZXJzaW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTU0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Im1ldGFtb2RlbCAtIGNhbm9uaWNhbCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjk5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJuYW1lZCBxdWVyaWVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXR5Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjEwNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImhpbnRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBOYW1lZCBRdWVyaWVzIj48dG9waWMgaHJlZj0idGFza3MwMDkuaHRtI3N0aHJlZjExMSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJuYXRpdmUgcXVlcmllcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTEyIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJub25wZXJzaXN0ZW50Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iY2xhc3NlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPjx0b3BpYyBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNjgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJmaWVsZHMuIFNlZSB0cmFuc2llbnQiPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvbmUtdG8tbWFueSBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQE9uZVRvTWFueSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxNDMiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iT25lLXRvLW1hbnkgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE2Lmh0bSNzdGhyZWYxNDEiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib25lLXRvLW9uZSBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQE9uZVRvT25lIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJPbmUtdG8tb25lIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxNy5odG0jc3RocmVmMTQ3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9Ik9uZS10by1vbmUgbWFwcGluZyI+PHRvcGljIGhyZWY9InRhc2tzMDE3Lmh0bSNzdGhyZWYxNDUiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3JkZXJpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjU4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJvcm0ueG1sIGZpbGUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhYm91dCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNzdGhyZWYyNCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgRmFjZXQgcGFnZSI+PHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI3N0aHJlZjIwOCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNzdGhyZWY1OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNhbXBsZSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI+PHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jc3RocmVmNTkiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ib3ZlcnJpZGVzIC0gSlBBIGF0dHJpYnV0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA3Lmh0bSNzdGhyZWYyMjkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjE5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGF0YWJhc2UgY29ubmVjdGlvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTQiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkYXRhYmFzZSBzY2hlbWEiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjk3IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZW50aXR5IGNsYXNzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI+PHRvcGljIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNzdGhyZWY2NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im9wdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zIj48dG9waWMgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jc3RocmVmMjg3IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyODkiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm92aWRlciI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI3N0aHJlZjQ5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbmNlLnhtbCBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+PHRvcGljIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNzdGhyZWYyMyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hbmFnaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNDciIC8+PC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJXb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI3N0aHJlZjY1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2FtcGxlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPjx0b3BpYyBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jc3RocmVmNDgiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzeW5jaHJvbml6aW5nIHdpdGggY2xhc3NlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU3luY2hyb25pemluZyBjbGFzc2VzIj48dG9waWMgaHJlZj0idGFza3MwMDIuaHRtI3N0aHJlZjUzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InBlcnNpc3RlbnQgZW50aXR5Ij4KLSAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjcxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwZXJzcGVjdGl2ZSAtIEpQQSBEZXZlbG9wbWVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jc3RocmVmMzAxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwbGF0Zm9ybSAtIEpQQSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjkxIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJwcm9ibGVtcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+PHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNzdGhyZWYxNjkiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InByb2plY3RzIC0gSlBBIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgbmV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI+PHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMy5odG0jc3RocmVmOSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0Ij48dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI3N0aHJlZjI2IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3B0aW9ucyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNzdGhyZWYyOTAiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJ2YWxpZGF0aW9uIHByZWZlcmVuY2VzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAtIEphdmEgUGVyc2lzdGVuY2UgT3B0aW9ucyI+PHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI3N0aHJlZjI4OCIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJxdWVyeSBoaW50cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAwOS5odG0jc3RocmVmMTA5IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJxdWljayBzdGFydCAtIERhbGkiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEYWxpIHF1aWNrIHN0YXJ0Ij48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAyLmh0bSNzdGhyZWY4IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJyZXF1aXJlbWVudHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlJlcXVpcmVtZW50cyBhbmQgaW5zdGFsbGF0aW9uIj48dG9waWMgaHJlZj0iZ2V0dGluZ19zdGFydGVkMDAxLmh0bSNzdGhyZWY0IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGVyc2lzdGVudCBlbnRpdGllcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRW50aXR5Ij48dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI3N0aHJlZjczIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZyb20gY2xhc3NlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iR2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzIj48dG9waWMgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI3N0aHJlZjE4OSIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiPjx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI3N0aHJlZjE5NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzY2hlbWEgLSBkYXRhYmFzZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgUHJvcGVydGllcyBwYWdlIC0gVmFsaWRhdGlvbiBQcmVmZXJlbmNlcyI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAyNy5odG0jc3RocmVmMjk2IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzZWNvbmRhcnkgdGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMzEiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSBUYWJsZXMgLSBpbiBKYXZhIERldGFpbHMgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbiI+PHRvcGljIGhyZWY9InJlZmVyZW5jZTAwOC5odG0jc3RocmVmMjM0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwMSIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic3VwZXJjbGFzcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Ik1hcHBlZCBzdXBlcmNsYXNzIj48dG9waWMgaHJlZj0idGFza3MwMDguaHRtI3N0aHJlZjkwIiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzeW5jaHJvbml6aW5nIGNsYXNzZXMgd2l0aCBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlN5bmNocm9uaXppbmcgY2xhc3NlcyI+PHRvcGljIGhyZWY9InRhc2tzMDAyLmh0bSNzdGhyZWY1NCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGFibGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYXNzb2NpYXRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJUYWJsZSBBc3NvY2lhdGlvbnMiPjx0b3BpYyBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI3N0aHJlZjIxOCIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI3N0aHJlZjIyMiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIGVudGl0aWVzIGZyb20iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXMiPjx0b3BpYyBocmVmPSJ0YXNrczAyMS5odG0jc3RocmVmMTU5IiAvPjwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2VsZWN0IFRhYmxlcyI+PHRvcGljIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI3N0aHJlZjIxNyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImluaGVyaXRhbmNlIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSI+PHRvcGljIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI3N0aHJlZjEwMiIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNlY29uZGFyeSI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmZXJlbmNlMDA4Lmh0bSNzdGhyZWYyMzIiIC8+PC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0idGVtcG9yYWwiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJHZW5lcmFsIGluZm9ybWF0aW9uIj48dG9waWMgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jc3RocmVmMjUxIiAvPjwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iPjx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNzdGhyZWYyNTMiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InRyYW5zaWVudCBtYXBwaW5nIj4KLSAgICA8ZW50cnkga2V5d29yZD0iQFRyYW5zaWVudCI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVHJhbnNpZW50IG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOC5odG0jc3RocmVmMTUzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWJvdXQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlRyYW5zaWVudCBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTguaHRtI3N0aHJlZjE1MSIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ2ZXJzaW9uIG1hcHBpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJAVmVyc2lvbiI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iVmVyc2lvbiBtYXBwaW5nIj48dG9waWMgaHJlZj0idGFza3MwMTkuaHRtI3N0aHJlZjE1NyIgLz48L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFib3V0Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJWZXJzaW9uIG1hcHBpbmciPjx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jc3RocmVmMTU1IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZpZXdzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI3N0aHJlZjIyNiIgLz48L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI+PHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jc3RocmVmMjQzIiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlBBIFN0cnVjdHVyZSB2aWV3Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJKUEEgU3RydWN0dXJlIHZpZXciPjx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jc3RocmVmMjY5IiAvPjwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9Indhcm5pbmcgbWVzc2FnZXMgLSBEYWxpIj4KLSAgICA8ZW50cnkga2V5d29yZD0iVmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zIj48dG9waWMgaHJlZj0idGFza3MwMjMuaHRtI3N0aHJlZjE2OCIgLz48L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIj4KLSAgICA8ZW50cnkga2V5d29yZD0iUmVxdWlyZW1lbnRzIGFuZCBpbnN0YWxsYXRpb24iPjx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDEuaHRtI3N0aHJlZjUiIC8+PC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlIj48dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI3N0aHJlZjY0IiAvPjwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9sZWdhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYTAwMDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL2xlZ2FsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TGVnYWw8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIExlZ2FsIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjk0IiBuYW1lPSJzdGhyZWYyOTQiPjwvYT48L3A+Ci08aDE+TGVnYWw8L2gxPgotPHA+Q29weXJpZ2h0ICZjb3B5OyAyMDA2LCAyMDEwLCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9wPgotPHA+VGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQ6PC9wPgotPHA+PGNvZGU+PGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPjwvY29kZT48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG0iPlRlcm1zIGFuZCBjb25kaXRpb25zIHJlZ2FyZGluZyB0aGUgdXNlIG9mIHRoaXMgZ3VpZGUuPC9hPjwvcD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZWEwYzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRG9jdW1lbnRhdGlvbgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotanBhRGV2ZWxvcG1lbnQ9SlBBIERldmVsb3BtZW50Ci1jcmVhdGVBSnBhUHJvamVjdD1DcmVhdGUgYSBKUEEgcHJvamVjdAotY3JlYXRlQUpwYVByb2plY3REZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdC4KLWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5PUNyZWF0ZSBhIHBlcnNpc3RlbnQgZW50aXR5Ci1jcmVhdGVBUGVyc2lzdGVudEVudGl0eURlc2NyaXB0aW9uPVRoaXMgY2hlYXQgc2hlZXQgaGVscHMgeW91IGNyZWF0ZSBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkuCi1NYXBBUGVyc2lzdGVudEVudGl0eT1NYXAgYSBwZXJzaXN0ZW50IGVudGl0eQotTWFwQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbj1UaGlzIGNoZWF0IHNoZWV0IGhlbHBzIHlvdSBtYXAgdGhlIGEgSmF2YSBwZXJzaXN0ZW50IGVudGl0eSB0byBhIGRhdGFiYXNlIHRhYmxlLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3BsdWdpbi54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwNTI2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgVE9DICAtLT4KLQk8IS0tID09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLQkJPHRvYyBmaWxlPSJ0b2MueG1sIiBwcmltYXJ5PSJ0cnVlIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIERlZmluZSBGMSAgIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI+Ci0JCTxjb250ZXh0cyBmaWxlPSJjb250ZXh0cy54bWwiIHBsdWdpbj0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIvPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZpbmUgS2V5d29yZCBJbmRleCAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotCQk8aW5kZXggZmlsZT0iaW5kZXgueG1sIi8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLQk8IS0tIENoZWF0c2hlZXRzIC0tPgotCTwhLS0gPT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY2hlYXRzaGVldHMuY2hlYXRTaGVldENvbnRlbnQiPgotCQk8Y2F0ZWdvcnkgbmFtZT0iJWpwYURldmVsb3BtZW50IiBpZD0iY29tLmpwYS5jYXRlZ29yeSIvPgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlY3JlYXRlQUpwYVByb2plY3QiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9hZGRfcGVyc2lzdGVuY2UueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQuY3JlYXRlcHJvamVjdDEiPgotCQkJPGRlc2NyaXB0aW9uPiVjcmVhdGVBSnBhUHJvamVjdERlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9jaGVhdHNoZWV0PgotCQk8Y2hlYXRzaGVldCBuYW1lPSIlY3JlYXRlQVBlcnNpc3RlbnRFbnRpdHkiIGNhdGVnb3J5PSJjb20uanBhLmNhdGVnb3J5IiBjb250ZW50RmlsZT0iJG5sJC9jaGVhdHNoZWV0cy9jcmVhdGVfZW50aXR5LnhtbCIgaWQ9Im9yZy5lY2xpcHNlLmpwYS5jaGVhdHNoZWV0LmFkZGVudGl0eSI+Ci0JCQk8ZGVzY3JpcHRpb24+JWNyZWF0ZUFQZXJzaXN0ZW50RW50aXR5RGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotCQk8L2NoZWF0c2hlZXQ+Ci0JCTxjaGVhdHNoZWV0IG5hbWU9IiVNYXBBUGVyc2lzdGVudEVudGl0eSIgY2F0ZWdvcnk9ImNvbS5qcGEuY2F0ZWdvcnkiIGNvbnRlbnRGaWxlPSIkbmwkL2NoZWF0c2hlZXRzL21hcF9lbnRpdHkueG1sIiBpZD0ib3JnLmVjbGlwc2UuanBhLmNoZWF0c2hlZXQubWFwZW50aXR5Ij4KLQkJCTxkZXNjcmlwdGlvbj4lTWFwQVBlcnNpc3RlbnRFbnRpdHlEZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTwvY2hlYXRzaGVldD4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU3OGYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5Q2xhc3NQYWdlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVudGl0eSBDbGFzcyBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBDbGFzcyBwYWdlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRkVJR0YiIG5hbWU9IkNJQUZFSUdGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHkgQ2xhc3MgcGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBFbnRpdHkgQ2xhc3MgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMTclIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDUiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5Qcm9qZWN0PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NSIgaGVhZGVycz0icjFjMS10NSI+U291cmNlIEZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDUgcjFjMi10NSI+VGhlIGxvY2F0aW9uIG9mIHRoZSBKUEEgcHJvamVjdCdzIHNyYyBmb2xkZXIuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NSIgaGVhZGVycz0icjFjMS10NSI+SmF2YSBQYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgY2xhc3MgcGFja2FnZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5DbGFzcyBuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NSByMWMyLXQ1Ij5UaGUgbmFtZSBvZiB0aGUgSmF2YSBjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ1IHIxYzMtdDUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ1IiBoZWFkZXJzPSJyMWMxLXQ1Ij5TdXBlcmNsYXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMyLXQ1Ij5TZWxlY3QgdGhlIHN1cGVyY2xhc3MuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NSByMWMzLXQ1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+SW5oZXJpdGFuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ1IHIxYzItdDUiPkJlY2F1c2UgdGhlIHdpemFyZCBjcmVhdGVzIGEgSmF2YSBjbGFzcyB3aXRoIGFuIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG5vdGF0aW9uLCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVudGl0eTwvc3Bhbj4gb3B0aW9uIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcHBlZCBTdXBlcmNsYXNzPC9zcGFuPiBpZiB5b3UgZGVmaW5lZCBhIHN1cGVyY2xhc3MuPC9wPgotPHA+VG8gYWRkIGFuIDxjb2RlPkBJbmhlcml0YW5jZTwvY29kZT4gbm90YXRpb24gdG8gdGhlIGVudGl0eSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgaW5oZXJpdGFuY2UgbWFwcGluZyBzdHJhdGVnaWVzIChkZXNjcmliZWQgaW4gSlNSIDIyMCk6PC9wPgotPHVsPgotPGxpPgotPHA+U0lOR0xFX1RBQkxFIC0tIEFsbCBjbGFzc2VzIGluIGEgaGllcmFyY2h5IGFzIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS4gVGhpcyBhbm5vdGF0aW9uIGlzIHdpdGhvdXQgYW4gYXR0cmlidXRlIGZvciB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuPC9wPgotPC9saT4KLTxsaT4KLTxwPlRBQkxFX1BFUl9DTEFTUyAtLSBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5KT0lORUQgLS0gVGhlIHJvb3Qgb2YgdGhlIGNsYXNzIGhpZXJhcmNoeSBpcyByZXByZXNlbnRlZCBieSBhIHNpbmdsZSB0YWJsZS4gRWFjaCBzdWJjbGFzcyBpcyByZXByZXNlbnRlZCBieSBhIHNlcGFyYXRlIHRhYmxlIHRoYXQgY29udGFpbnMgdGhvc2UgZmllbGRzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBzdWJjbGFzcyAobm90IGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlcmNsYXNzKSwgYXMgd2VsbCBhcyB0aGUgY29sdW1uKHMpIHRoYXQgcmVwcmVzZW50IGl0cyBwcmltYXJ5IGtleS4gVGhlIHByaW1hcnkga2V5IGNvbHVtbihzKSBvZiB0aGUgc3ViY2xhc3MgdGFibGUgc2VydmVzIGFzIGEgZm9yZWlnbiBrZXkgdG8gdGhlIHByaW1hcnkga2V5IG9mIHRoZSBzdXBlcmNsYXNzIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NSByMWMzLXQ1Ij5FbnRpdHk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NSIgaGVhZGVycz0icjFjMS10NSI+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+WE1MIEVudGl0eSBNYXBwaW5nczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMi10NSI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgdG8gZW50aXR5IG1hcHBpbmdzIGluIFhNTDwvc3Bhbj4gdG8gY3JlYXRlIFhNTCBtYXBwaW5ncyBpbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiwgcmF0aGVyIHRoYW4gYW5ub3RhdGlvbnMuCi08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwaW5nIGZpbGU8L3NwYW4+IGZpZWxkIHRvIHNwZWNpZnkgdGhlIGZpbGUgdG8gdXNlLiBCeSBkZWZhdWx0LCBtYXBwaW5ncyBhcmUgc3RvcmVkIGluIHRoZSA8Y29kZT5NRVRBLUlORi9vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDUgcjFjMy10NSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MTRmODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFERUNJQSIgbmFtZT0iQ0lBREVDSUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVudGl0eSBQcm9wZXJ0aWVzIHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTk3IiBuYW1lPSJzdGhyZWYxOTciPjwvYT48YSBpZD0ic3RocmVmMTk4IiBuYW1lPSJzdGhyZWYxOTgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPiZuYnNwOzwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIHRvIGJlIGNvbnZlcnRlZCB0byBpbmZvcm1hbC4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10NiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5FbnRpdHkgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMi10NiI+Ci08cD5UaGUgbmFtZSBvZiB0aGUgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZW50ZXJlZCBhcyB0aGUgY2xhc3MgbmFtZS4gSWYgdGhlIGVudGl0eSBuYW1lIGRpZmZlcnMgZnJvbSB0aGUgY2xhc3MgbmFtZSwgdGhlbiB0aGUgZW50aXR5IG5hbWUgaXMgYWRkZWQgYXMgYW4gYXR0cmlidXRlLiBGb3IgZXhhbXBsZTogPGNvZGU+QEVudGl0eShuYW1lPSJFbnRpdHlOYW1lIik8L2NvZGU+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDYgcjFjMy10NiI+Ci08cD5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5UYWJsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NiByMWMyLXQ2Ij4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+IHRvIG1hdGNoIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUgbmFtZSB0byB0aGUgZW50aXR5IG5hbWUuIE90aGVyd2lzZSwgY2xlYXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Vc2UgZGVmYXVsdDwvc3Bhbj4gb3B0aW9uIGFuZCBlbnRlciB0aGUgbmFtZSBpbiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+VGFibGUgTmFtZTwvc3Bhbj4gZmllbGQuIFRoZXNlIG9wdGlvbnMgcmVzdWx0IGluIHRoZSBhZGRpdGlvbiBvZiB0aGUgPGNvZGU+QFRhYmxlPC9jb2RlPiBvcHRpb24gdG8gdGhlIEphdmEgY2xhc3MgZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ2IHIxYzMtdDYiPgotPHA+VXNlIGRlZmF1bHQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDYiIGhlYWRlcnM9InIxYzEtdDYiPgotPHA+RW50aXR5IEZpZWxkczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDYgcjFjMi10NiI+Ci08cD5DbGljayB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gYnV0dG9uIHRvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdXNpbmcgdGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nLiBUaGlzIGRpYWxvZyBlbmFibGUgeW91IHRvIGJ1aWxkIGEgZmllbGQgYnkgZW50ZXJpbmcgYSBmaWVsZCBuYW1lIGFuZCBzZWxlY3RpbmcgYW1vbmcgcGVyc2lzdGVuY2UgdHlwZXMuIFRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+S2V5PC9zcGFuPiBvcHRpb24gZW5hYmxlcyB5b3UgdG8gbWFyayBhIGZpZWxkIGFzIGEgcHJpbWFyeSBrZXkuIFRoZSBkaWFsb2cncyA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBmdW5jdGlvbiBlbmFibGVzIHlvdSB0byBhZGQgb3RoZXIgcGVyc2lzdGVuY2UgdHlwZXMgZGVzY3JpYmVkIGluIHRoZSBKUEEgc3BlY2lmaWNhdGlvbi4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5FZGl0PC9zcGFuPiBidXR0b24gZW5hYmxlcyB5b3UgdG8gY2hhbmdlIHRoZSBuYW1lIG9yIHR5cGUgc2V0IGZvciBhIHBlcnNpc3RlbnQgZmllbGQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NiByMWMzLXQ2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NiIgaGVhZGVycz0icjFjMS10NiI+Ci08cD5BY2Nlc3MgVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDYgcjFjMi10NiI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgZW50aXR5J3MgYWNjZXNzIHRvIGluc3RhbmNlIHZhcmlhYmxlcyBpcyBmaWVsZC1iYXNlZCBvciBwcm9wZXJ0eS1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAmbmRhc2g7IEluc3RhbmNlIHZhcmlhYmxlcyBhcmUgYWNjZXNzZWQgZGlyZWN0bHkuIEFsbCBub24tdHJhbnNpZW50IGluc3RhbmNlIHZhcmlhYmxlcyBhcmUgcGVyc2lzdGVudC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ2IHIxYzMtdDYiPgotPHA+RmllbGQ8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfanBhX2VudGl0eS5odG0jQkFCRkJKQkciPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfYWRkX2NvbnZlcnRlci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTIyNTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hZGRfY29udmVydGVyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWRkIENvbnZlcnRlciBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHQ0dJSiIgbmFtZT0iQ0lBR0NHSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFkZCBDb252ZXJ0ZXIgZGlhbG9nPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBjcmVhdGUgYSBuZXcgRWNsaXBzZUxpbmsgY29udmVydGVyLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGhydWxlaW5mb3JtYWxtYXgiPgotPHRhYmxlIGNsYXNzPSJIUnVsZUluZm9ybWFsTWF4IiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBvcHRpb25zIG9uIHRoZSBOZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0icm93cyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0MCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDQwIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10NDAiIGhlYWRlcnM9InIxYzEtdDQwIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NDAgcjFjMi10NDAiPkVudGVyIHRoZSBuYW1lIGZvciB0aGlzIGNvbnZlcnRlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQ0MCIgaGVhZGVycz0icjFjMS10NDAiPlR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ0MCByMWMyLXQ0MCI+U2VsZWN0IHRoZSBjb252ZXJ0ZXIgdHlwZToKLTx1bD4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PYmplY3QgdHlwZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TdHJ1Y3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+VHlwZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdiOGU1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpb24gQ2FyZGluYWxpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXNzb2NpYXRpb24gQ2FyZGluYWxpdHkiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGSUlGSCIgbmFtZT0iQ0lBRklJRkgiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyMTAiIG5hbWU9InN0aHJlZjIxMCI+PC9hPlVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IGNhcmRpbmFsaXR5IG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLiBEZXBlbmRpbmcgb24gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Bc3NvY2lhdGlvbiBLaW5kPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW4gQ29sdW1uczwvc3Bhbj4gdGhhdCB5b3Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgc29tZSBhc3NvY2lhdGlvbnMgbWF5IG5vdCBiZSBhdmFpbGFibGUuPC9wPgotPHVsPgotPGxpPgotPHA+TWFueSB0byBvbmU8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG1hbnk8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRvIG9uZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5NYW55IHRvIG1hbnk8L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9hc3NvY2lhdGlvbl90YWJsZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgxOTdmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2Fzc29jaWF0aW9uX3RhYmxlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QXNzb2NpYXRpb24gVGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkFzc29jaWF0aW9uIFRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdKSERDIiBuYW1lPSJDSUFHSkhEQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXNzb2NpYXRpb24gVGFibGVzPC9oMT4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gc3BlY2lmeSB0aGUgYXNzb2NpYXRpb24gdGFibGVzIGZvciBhbiBlbnRpdHkuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBBc3NvY2lhdGlvbiBUYWJsZXMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEFzc29jaWF0aW9uIFRhYmxlcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEyIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTIiIGhlYWRlcnM9InIxYzEtdDEyIj5Bc3NvY2lhdGlvbiBraW5kPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTIgcjFjMi10MTIiPlNwZWNpZnkgaWYgdGhlIGFzc29jaWF0aW9uIGlzIDxzcGFuIGNsYXNzPSJib2xkIj5TaW1wbGU8L3NwYW4+ICgxOk0pIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IChNOk0pLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMiIgaGVhZGVycz0icjFjMS10MTIiPkFzc29jaWF0aW9uIHRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEyIHIxYzItdDEyIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGUgU2VsZWN0aW9uPC9zcGFuPiwgdGhlbiBzZWxlY3QgdGhlIHR3byB0YWJsZXMgdG8gYXNzb2NpYXRlLgotPHA+V2hlbiBjcmVhdGluZyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55IHRvIE1hbnk8L3NwYW4+IGFzc29jaWF0aW9uLCB5b3UgY2FuIHNlbGVjdCBhIDxzcGFuIGNsYXNzPSJib2xkIj5Kb2luIFRhYmxlPC9zcGFuPiBmb3IgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jb25maWd1cmVfamF4Yl9jbGFzc19nZW5lcmF0aW9uX2RpYWxvZy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmYzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE5OjMzOjdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNISEhKQSIgbmFtZT0iQ0FDSEhISkEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBnZW5lcmF0ZSBKQVhCIGNsYXNzZXMgZnJvbSBhIHNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxocnVsZWluZm9ybWFsbWF4Ij4KLTx0YWJsZSBjbGFzcz0iSFJ1bGVJbmZvcm1hbE1heCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgb3B0aW9ucyBvbiB0aGUgTmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9InJvd3MiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NDEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+U291cmNlIGZvbGRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQxIHIxYzItdDQxIj5Mb2NhdGlvbiBpbiB3aGljaCB0byBnZW5lcmF0ZSB0aGUgY2xhc3Nlcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gc2VsZWN0IGEgbG9jYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+UGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDQxIHIxYzItdDQxIj5OYW1lIG9mIHRoZSBwYWNrYWdlLiBDbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgcGFja2FnZS48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj5DYXRhbG9nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NDEgcjFjMi10NDEiPk5hbWUgb2YgdGhlIGNhdGFsb2cgZmlsZSB0byB1c2UgdG8gcmVzb2x2ZSBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj5CaW5kaW5ncyBmaWxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDQxIHIxYzItdDQxIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgdGhlIGV4dGVybmFsIGJpbmRpbmdzIGZpbGVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtI0NJSENCSEpEIj5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1Njk0YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdCRkpFIiBuYW1lPSJDSUFHQkZKRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgQ3VzdG9tIEVudGl0aWVzIFdpemFyZCB0byBjcmVhdGUgZW50aXRpZXMgZnJvbSB5b3VyIGRhdGFiYXNlIHRhYmxlcy48L3A+Ci08cD5UaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3NlbGVjdFRhYmxlcy5odG0jQ0lBSENHRUUiPlNlbGVjdCBUYWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiPlRhYmxlIEFzc29jaWF0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSNDSUFFSkRCRSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0jQ0lBQ0lHRUUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkYTc0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHR0dERiIgbmFtZT0iQ0lBR0dHREYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvaDE+Ci08cD5UaGUgQ3JlYXRlIEpQQSB3aXphcmQgZW5hYmxlcyB5b3UgdG8gcXVpY2tseSBhZGQgYW4gZW50aXR5IGFuZCBhbHNvIGFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhhdCBlbnRpdHkuIEluIGFkZGl0aW9uLCB0aGlzIHdpemFyZCBhZGRzIHRoZSBhY2Nlc3NvciBtZXRob2RzICg8Y29kZT5nZXR0ZXI8L2NvZGU+IGFuZCA8Y29kZT5zZXR0ZXI8L2NvZGU+KSBpbiB0aGUgY2xhc3MgZmlsZS4gVGhlIHdpemFyZCBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIj5FbnRpdHkgQ2xhc3MgcGFnZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX0VudGl0eVByb3BlcnRpZXNQYWdlLmh0bSNDSUFERUNJQSI+RW50aXR5IFByb3BlcnRpZXMgcGFnZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzRhYTVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGR0hJRiIgbmFtZT0iQ0lBRkdISUYiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNyIgbmFtZT0ic3RocmVmMjA3Ij48L2E+PGEgaWQ9InN0aHJlZjIwOCIgbmFtZT0ic3RocmVmMjA4Ij48L2E+VXNlIHRoZSBDcmVhdGUgTmV3IEFzc29jaWF0aW9uIHdpemFyZCB0byBzcGVjaWZ5IGFzc29jaWF0aW9uIHRhYmxlcyB3aGVuIGdlbmVyYXRpbmcgYW4gZW50aXR5LjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIj5Bc3NvY2lhdGlvbiBUYWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qb2luX2NvbHVtbnMuaHRtI0NJQUVHRUVHIj5Kb2luIENvbHVtbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9hc3NvY2lhdGlvbl9jYXJkaW5hbGl0eS5odG0jQ0lBRklJRkgiPkFzc29jaWF0aW9uIENhcmRpbmFsaXR5PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NDdkYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9jdXN0b21pekluZGl2aWR1YWxFbnRpdGllcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0lHRUUiIG5hbWU9IkNJQUNJR0VFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA2IiBuYW1lPSJzdGhyZWYyMDYiPjwvYT5Vc2UgdGhpcyBwYWdlIHRvIGN1c3RvbWl6ZSBlYWNoIGdlbmVyYXRlZCBlbnRpdHkuIFNlbGVjdCBhbiBpdGVtIGluIHRoZSBUYWJsZSBhbmQgY29sdW1ucyBhcmVhLCB0aGVuIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzIGZvciBlYWNoIGl0ZW0uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBJbmRpdmlkdWFsIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBJbmRpdmlkdWFsIEVudGl0aWVzIGRpYWxvZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDExIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTEiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPlRhYmxlIE1hcHBpbmc8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMSByMWMyLXQxMSI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSB0YWJsZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxMSIgaGVhZGVycz0icjFjMS10MTEiPiZuYnNwOyZuYnNwO0tleSZuYnNwO2dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDExIHIxYzItdDExIj5TZWxlY3QgdGhlIGdlbmVyYXRvciB1c2VkIGZvciB0aGlzIG1hcHBpbmcuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2UmbmJzcDtuYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTEgcjFjMi10MTEiPkVudGVyIGEgbmFtZSBmb3IgdGhlIHNlcXVlbmNlLgotPHA+WW91IGNhbiB1c2UgPHNwYW4gY2xhc3M9ImJvbGQiPiR0YWJsZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj4kcGs8L3NwYW4+IGFzIHZhcmlhYmxlcyBpbiB0aGUgbmFtZS4gVGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGFibGUgbmFtZSBhbmQgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUgKHJlc3BlY3RpdmVseSkgd2hlbiBEYWxpIGdlbmVyYXRlcyBhIHRhYmxlIG1hcHBpbmcuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+Jm5ic3A7Jm5ic3A7RW50aXR5Jm5ic3A7YWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTEgcjFjMi10MTEiPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW50aXR5IGFjY2VzcyBtZXRob2Q6IDxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZDwvc3Bhbj4gKGRlZmF1bHQpIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDExIiBoZWFkZXJzPSJyMWMxLXQxMSI+RG9tYWluIEphdmEgQ2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMSByMWMyLXQxMSI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiAoPHNwYW4gY2xhc3M9ImJvbGQiPlN1cGVyY2xhc3M8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+SW50ZXJmYWNlczwvc3Bhbj4pIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzg4MDFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24uaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUVKREJFIiBuYW1lPSJDSUFFSkRCRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNSIgbmFtZT0ic3RocmVmMjA1Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGluZm9ybWF0aW9uIERhbGkgd2lsbCB1c2Ugd2hlbiBnZW5lcmF0aW5nIHRoZSBlbnRpdGllcyBmcm9tIHRoZSBkYXRhYmFzZSB0YWJsZXMuIFlvdSB3aWxsIGJlIGFibGUgdG8gb3ZlcnJpZGUgdGhpcyBpbmZvcm1hdGlvbiBmb3Igc3BlY2lmaWMgZW50aXRpZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgQ3VzdG9tIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb24gZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTAiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxMCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+VGFibGUgTWFwcGluZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEwIHIxYzItdDEwIj5Vc2UgdGhlc2Ugb3B0aW9ucyB0byBkZWZpbmUgdGhlIHRhYmxlIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+Jm5ic3A7Jm5ic3A7S2V5Jm5ic3A7Z2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTAgcjFjMi10MTAiPlNlbGVjdCB0aGUgZ2VuZXJhdG9yIHVzZWQgZm9yIHRoaXMgbWFwcGluZy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtTZXF1ZW5jZSZuYnNwO25hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMCByMWMyLXQxMCI+RW50ZXIgYSBuYW1lIGZvciB0aGUgc2VxdWVuY2UuCi08cD5Zb3UgY2FuIHVzZSA8c3BhbiBjbGFzcz0iYm9sZCI+JHRhYmxlPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9ImJvbGQiPiRwazwvc3Bhbj4gYXMgdmFyaWFibGVzIGluIHRoZSBuYW1lLiBUaGVzZSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSB0YWJsZSBuYW1lIGFuZCBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSAocmVzcGVjdGl2ZWx5KSB3aGVuIERhbGkgZ2VuZXJhdGVzIGEgdGFibGUgbWFwcGluZy48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtFbnRpdHkmbmJzcDthY2Nlc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMCByMWMyLXQxMCI+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbnRpdHkgYWNjZXNzIG1ldGhvZDogPHNwYW4gY2xhc3M9ImJvbGQiPkZpZWxkPC9zcGFuPiAoZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtBc3NvY2lhdGlvbnMmbmJzcDtmZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IGZldGNoIG1vZGUgZm9yIGFzc29jaWF0aW9uczogPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQ8L3NwYW4+LCBhcyBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiAoZGVmYXVsdCksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5MYXp5PC9zcGFuPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTAiIGhlYWRlcnM9InIxYzEtdDEwIj4mbmJzcDsmbmJzcDtDb2xsZWN0aW9uJm5ic3A7dHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDEwIHIxYzItdDEwIj5TcGVjaWZ5IGlmIHRoZSBjb2xsZWN0aW9uIHByb3BlcnRpZXMgYXJlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNldDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkxpc3Q8L3NwYW4+LgotPHA+RW5hYmxlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+QWx3YXlzIGdlbmVyYXRlIG9wdGlvbmFsIEpQQSBhbm5vdGF0aW9ucyBhbmQgRERMIHBhcmFtZXRlcnM8L3NwYW4+IG9wdGlvbiB0byBoYXZlIERhbGkgaW5jbHVkZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBlbnRpdHkuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDEwIiBoZWFkZXJzPSJyMWMxLXQxMCI+RG9tYWluIEphdmEgQ2xhc3M8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQxMCByMWMyLXQxMCI+VXNlIHRoZXNlIG9wdGlvbnMgdG8gZGVmaW5lIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiAoPHNwYW4gY2xhc3M9ImJvbGQiPlBhY2thZ2U8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+U3VwZXJjbGFzczwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+SW50ZXJmYWNlczwvc3Bhbj4pIGZvciB0aGUgZW50aXR5LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9kZXRhaWxzX29ybS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4NTk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2RldGFpbHNfb3JtLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dER0hDIiBuYW1lPSJDQUNHREdIQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9oMT4KLTxwPlRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZGlzcGxheXMgdGhlIGRlZmF1bHQgbWFwcGluZyBhbmQgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwcm9qZWN0IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIGFyZWFzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxMy5odG0jQ0FDQ0FDR0giPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNC5odG0jQ0FDRUFHQkciPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiPkdlbmVyYXRvcnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNi5odG0jQ0lBSUJBQUoiPlF1ZXJpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxNy5odG0jQ0lBREdDSUQiPkNvbnZlcnRlcnM8L2E+ICh3aGVuIHVzaW5nIEVjbGlwc2VMaW5rKTwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhlc2UgZGVmYXVsdHMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHNldHRpbmdzIG9uIGEgc3BlY2lmaWMgZW50aXR5IG9yIG1hcHBpbmcuPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhNjMwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2VjbGlwc2VsaW5rX21hcHBpbmdfZmlsZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBRURFSkYiIG5hbWU9IkNJQUVERUpGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvaDE+Ci08cD5TcGVjaWZ5IHRoZSBsb2NhdGlvbiBhbmQgcHJvcGVydGllcyBvZiB0aGUgRWNsaXBzZUxpbmsgbWFwcGluZyBmaWxlICg8Y29kZT5lY2xpc3BlbGluay1vcm0ueG1sPC9jb2RlPikuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCI+Ci08dGFibGUgY2xhc3M9IkhSdWxlSW5mb3JtYWxNYXgiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIG9wdGlvbnMgb24gdGhlIE5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJyb3dzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPlByb2plY3Q8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzOSByMWMyLXQzOSI+U2VsZWN0IHRoZSBwcm9qZWN0IGluIHdoaWNoIHRvIGFkZCB0aGUgbWFwcGluZyBmaWxlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPlNvdXJjZSBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzOSByMWMyLXQzOSI+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgc291cmNlIGZpbGUgaW4gd2hpY2ggdG8gYWRkIHRoZSBtYXBwaW5nIGZpbGUuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPi4uLzwvY29kZT48Y29kZT48c3BhbiBjbGFzcz0iY29kZWlubGluZWl0YWxpYyI+Jmx0O1BST0pFQ1QmZ3Q7PC9zcGFuPjwvY29kZT48Y29kZT4vc3JjPC9jb2RlPi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzkiIGhlYWRlcnM9InIxYzEtdDM5Ij5GaWxlIHBhdGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzOSByMWMyLXQzOSI+RW50ZXIgdGhlIGZpbGVuYW1lIGFuZCBwYXRoIG9mIHRoZSBtYXBwaW5nIGZpbGUuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPkRlZmF1bHQgYWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzkgcjFjMi10MzkiPlNlbGVjdCB3aGV0aGVyIHRoZSBlbnRpdHkncyBhY2Nlc3MgdG8gaW5zdGFuY2UgdmFyaWFibGVzIGlzIDxzcGFuIGNsYXNzPSJib2xkIj5maWVsZDwvc3Bhbj4tYmFzZWQgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPnByb3BlcnR5PC9zcGFuPi1iYXNlZCwgYXMgZGVmaW5lZCBpbiB0aGUgSlBBIHNwZWNpZmljYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM5IiBoZWFkZXJzPSJyMWMxLXQzOSI+QWRkIHRvIHBlcnNpc3RlbmNlIHVuaXQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzOSByMWMyLXQzOSI+U3BlY2lmeSBpZiB0aGlzIG1hcHBpbmcgZmlsZSBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgKDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4pLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzOSIgaGVhZGVycz0icjFjMS10MzkiPiZuYnNwOyZuYnNwO1BlcnNpc3RlbmNlJm5ic3A7VW5pdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDM5IHIxYzItdDM5Ij5TZWxlY3QgdGhlIHBlcnNpc3RlbmNlIHVuaXQgaW4gd2hpY2ggdG8gYWRkIHRoZSBtYXBwaW5nIGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaHJ1bGVpbmZvcm1hbG1heCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAzLmh0bSNDSUFKRUlESiI+TWFwcGluZyBGaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF2YV9wYWdlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF2YV9wYWdlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZiZjNmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2phdmFfcGFnZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkphdmEgUGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKYXZhIFBhZ2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFHRUJBQSIgbmFtZT0iQ0lBR0VCQUEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkphdmEgUGFnZTwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBvbiB0aGUgSmF2YSBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMiIGhlYWRlcnM9InIxYzEtdDMiPlNvdXJjZSBmb2xkZXJzIG9uIGJ1aWxkIHBhdGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzIHIxYzItdDMiPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgRm9sZGVyPC9zcGFuPiB0byBzZWxlY3QgYW4gZXhpc3RpbmcgSmF2YSBzb3VyY2UgZm9sZGVyIHRvIGFkZCB0byB0aGlzIHByb2plY3QuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MyByMWMzLXQzIj5FY2xpcHNlTGluazwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQzIiBoZWFkZXJzPSJyMWMxLXQzIj5EZWZhdWx0IG91dHB1dCBmb2xkZXI8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzIHIxYzItdDMiPlNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIHRoZSZuYnNwOzxjb2RlPi5jbGFzczwvY29kZT4gZmlsZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MyByMWMzLXQzIj5idWlsZFxjbGFzc2VzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmViNWJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTY6MTg6MTNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dBREZIIiBuYW1lPSJDQUNHQURGSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvaDE+Ci08cD5Vc2UgdGhlIEdlbmVyYXRlIFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3NlcyB3aXphcmQgY3JlYXRlIGFuIFhNTCBzY2hlbWEgKCZuYnNwOy54c2QpIGZvciBhIHNldCBvZiBKQVhCIG1hcHBlZCBjbGFzc2VzLjwvcD4KLTxwPlRoZSB3aXphcmQgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfc2NoZW1hX2Zyb21fY2xhc3Nlc19wYWdlLmh0bSNDQUNIQkVHSiI+R2VuZXJhdGUgU2NoZW1hIGZyb20gQ2xhc3NlczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bSNDSUhIQkpDSiI+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9IiNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfam9pbl9jb2x1bW5zLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfam9pbl9jb2x1bW5zLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzMmNiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pvaW5fY29sdW1ucy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gQ29sdW1uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFFR0VFRyIgbmFtZT0iQ0lBRUdFRUciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1uczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjA5IiBuYW1lPSJzdGhyZWYyMDkiPjwvYT5Vc2UgdGhpcyBkaWFsb2cgdG8gc3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIG9mIGFuIGFzc29jaWF0aW9uIHRhYmxlLjwvcD4KLTxwPkNsaWNrIEFkZCB0byBzcGVjaWZ5IHRoZSBqb2luIGNvbHVtbnMgYmV0d2VlbiB0aGUgdHdvIHRhYmxlcy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIj5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfanBhX2ZhY2V0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNGZmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX2pwYV9mYWNldC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRmFjZXQgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgRmFjZXQgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lGRElGIiBuYW1lPSJDQUNJRkRJRiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIEZhY2V0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDQiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPlBsYXRmb3JtPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10NCByMWMyLXQ0Ij5WZW5kb3Itc3BlY2lmaWMgSlBBIGltcGxlbWVudGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDQgcjFjMy10NCI+RWNsaXBzZUxpbms8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MSIgbmFtZT0ic3RocmVmMTkxIj48L2E+PGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+SlBBIEltcGxlbWVudGF0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMyLXQ0Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDQgcjFjMi10NCI+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Vc2VyIExpYnJhcnk8L3NwYW4+IHRvIHNlbGVjdCBmcm9tIHRoZSBhdmFpbGFibGUgdXNlci1kZWZpbmVkIG9yIGRvd25sb2FkZWQgbGlicmFyaWVzLgotPHA+SWYgeW91IHNlbGVjdCBEaXNhYmxlLCB5b3UgbXVzdCBtYW51YWxseSBpbmNsdWRlIHRoZSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGguPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NCByMWMzLXQ0Ij5Vc2VyIExpYnJhcnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7SW5jbHVkZSBsaWJyYXJpZXMgd2l0aCB0aGlzIGFwcGxpY2F0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0IHIxYzMtdDQiPlNlbGVjdGVkPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDQiIGhlYWRlcnM9InIxYzEtdDQiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2Ugd2l0aCB0aGUgcHJvamVjdC4gRGFsaSByZXF1aXJlcyBhbiBhY3RpdmUgZGF0YWJhc2UgY29ubmVjdGlvbiB0byB1c2UgYW5kIHZhbGlkYXRlIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NCByMWMzLXQ0Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10NCIgaGVhZGVycz0icjFjMS10NCI+Jm5ic3A7Jm5ic3A7T3ZlcnJpZGUmbmJzcDtkZWZhdWx0IHNjaGVtYSBmcm9tIGNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0IHIxYzItdDQiPlNlbGVjdCBhIHNjaGVtYSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSB0aGF0IGlzIGRlcml2ZWQgZnJvbSB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbi4gVXNlIHRoaXMgb3B0aW9uIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10NCByMWMzLXQ0Ij5UaGUgdmFsdWUgY2FsY3VsYXRlZCBieSBEYWxpLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij5KUEEgSW1wbGVtZW50YXRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ0IHIxYzItdDQiPlNlbGVjdCB0byB1c2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5KUEEgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgdGhlIHNlcnZlciBhdCBydW50aW1lPC9zcGFuPiwgb3Igc2VsZWN0IGEgc3BlY2lmaWMgPHNwYW4gY2xhc3M9ImJvbGQiPmltcGxlbWVudGF0aW9uIGxpYnJhcnk8L3NwYW4+IHRoYXQgY29udGFpbiB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkgYW5kIGVudGl0aWVzIHRvIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0J3MgSmF2YSBCdWlsZCBQYXRoLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5PC9zcGFuPiB0byBjcmVhdGUgYSBkZWZhdWx0IGxpYnJhcnkgZm9yIHRoZSBwcm9qZWN0IG9yIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Db25maWd1cmUgdXNlciBsaWJyYXJpZXM8L3NwYW4+IHRvIGRlZmluZSBhZGRpdGlvbmFsIGxpYnJhcmllcy48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIHdvcmtpbmcgd2l0aCBKUEEgcHJvamVjdHMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NCByMWMzLXQ0Ij5EZXRlcm1pbmVkIGJ5IHNlcnZlci48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NCIgaGVhZGVycz0icjFjMS10NCI+PGEgaWQ9InN0aHJlZjE5MyIgbmFtZT0ic3RocmVmMTkzIj48L2E+UGVyc2lzdGVudCBjbGFzcyBtYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgd2lsbCA8c3BhbiBjbGFzcz0iYm9sZCI+ZGlzY292ZXIgYW5ub3RhdGVkIGNsYXNzZXMgYXV0b21hdGljYWxseTwvc3Bhbj4sIG9yIGlmIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+YW5ub3RhdGVkIGNsYXNzZXMgbXVzdCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbDwvc3Bhbj4gZmlsZS4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ob3RlPC9zcGFuPjogVG8gaW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgbGlzdCB0aGUgbWFuYWdlZCBwZXJzaXN0ZW5jZSBjbGFzc2VzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQgcjFjMy10NCI+RGV0ZXJtaW5lZCBieSBzZXJ2ZXIuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0IiBoZWFkZXJzPSJyMWMxLXQ0Ij48YSBpZD0ic3RocmVmMTk0IiBuYW1lPSJzdGhyZWYxOTQiPjwvYT5DcmVhdGUgPGNvZGU+b3JtLnhtbDwvY29kZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10NCByMWMyLXQ0Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIGNyZWF0ZSBhIGRlZmF1bHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgeW91ciBlbnRpdHkgbWFwcGluZ3MgYW5kIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQgcjFjMy10NCI+U2VsZWN0ZWQ8L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX21hcHBpbmdfZ2VuZXJhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMDJiYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9tYXBwaW5nX2dlbmVyYWwuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhbCBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmFsIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkhGSUoiIG5hbWU9IkNBQ0JIRklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmFsIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEdlbmVyYWwgcHJvcGVydGllcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KYXZhIERldGFpbHMgdmlldzwvc3Bhbj4gZm9yIGVhY2ggbWFwcGluZyB0eXBlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjclIiAvPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MTYiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQxNiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDE2Ij5EZWZhdWx0PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWM0LXQxNiI+QXZhaWxhYmxlIGZvciBNYXBwaW5nIFR5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+TWFwcGluZyBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzItdDE2Ij5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGF0dHJpYnV0ZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWMzLXQxNiI+QmFzaWM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNiByMWM0LXQxNiI+QWxsIG1hcHBpbmcgdHlwZXM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij48YSBpZD0iQ0FDR0NCSEIiIG5hbWU9IkNBQ0dDQkhCIj48L2E+Q29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMi10MTYiPjxhIGlkPSJzdGhyZWYyMzEiIG5hbWU9InN0aHJlZjIzMSI+PC9hPjxhIGlkPSJzdGhyZWYyMzIiIG5hbWU9InN0aHJlZjIzMiI+PC9hPlRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUuIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTYgcjFjMy10MTYiPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiPlZlcnNpb24gbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMi10MTYiPk5hbWUgb2YgdGhlIGRhdGFiYXNlIGNvbHVtbi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBDb2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWMyLXQxNiI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgY29sdW1uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO0luc2VydGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWMyLXQxNiI+U3BlY2lmaWVzIGlmIHRoZSBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBJTlNFUlQ8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1VwZGF0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBjb2x1bW4gaXMgYWx3YXlzIGluY2x1ZGVkIGluIDxjb2RlPlNRTCBVUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO1VuaXF1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSA8Y29kZT5VTklRVUU8L2NvZGU+IGNvbnN0cmFpbnQgZm9yIHRoZSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTYgcjFjMy10MTYiPkZhbHNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtOdWxsYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhlIGNvbHVtbiBhbGxvd3MgbnVsbCB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTYgcjFjMy10MTYiPlRydWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtMZW5ndGg8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTYgcjFjMi10MTYiPlNldHMgdGhlIGNvbHVtbiBsZW5ndGguPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE2IHIxYzMtdDE2Ij4yNTU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+Jm5ic3A7Jm5ic3A7UHJlY2lzaW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE2IHIxYzItdDE2Ij5TZXRzIHRoZSBwcmVjaXNpb24gZm9yIHRoZSBjb2x1bW4gdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWMzLXQxNiI+MDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTEuaHRtI0JBQkNCSERGIj5FbWJlZGRlZCBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MTYiIGhlYWRlcnM9InIxYzEtdDE2Ij4mbmJzcDsmbmJzcDtTY2FsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxNiByMWMyLXQxNiI+U2V0cyB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB0aGF0IGFwcGVhciB0byB0aGUgcmlnaHQgb2YgdGhlIGRlY2ltYWwgcG9pbnQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE2IHIxYzMtdDE2Ij4wPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxM2MxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPiZuYnNwOyZuYnNwO0NvbHVtbiBEZWZpbml0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE2IHIxYzItdDE2Ij5EZWZpbmUgdGhlIERETCBmb3IgYSBjb2x1bW4uIFRoaXMgaXMgdXNlZCB3aGVuIGEgdGFibGUgaXMgYmVpbmcgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNHR0dIQiIgbmFtZT0iQ0FDR0dHSEIiPjwvYT48YSBpZD0ic3RocmVmMjMzIiBuYW1lPSJzdGhyZWYyMzMiPjwvYT48YSBpZD0ic3RocmVmMjM0IiBuYW1lPSJzdGhyZWYyMzQiPjwvYT48YSBpZD0ic3RocmVmMjM1IiBuYW1lPSJzdGhyZWYyMzUiPjwvYT5GZXRjaCBUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzItdDE2Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZToKLTx1bD4KLTxsaT4KLTxwPkVhZ2VyICZuZGFzaDsgRGF0YSBpcyBsb2FkZWQgaW4gYmVmb3JlIGl0IGlzIGFjdHVhbGx5IG5lZWRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eSAmbmRhc2g7IERhdGEgaXMgbG9hZGVkIG9ubHkgd2hlbiByZXF1aXJlZCBieSB0aGUgdHJhbnNhY3Rpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTRjMS10MTYgcjFjMy10MTYiPkVhZ2VyPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPk9wdGlvbmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE1YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10MTYgcjFjMy10MTYiPlllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxNWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJDQUNCQklCSSIgbmFtZT0iQ0FDQkJJQkkiPjwvYT48YSBpZD0ic3RocmVmMjM2IiBuYW1lPSJzdGhyZWYyMzYiPjwvYT5Mb2I8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgaWYgdGhlIGZpZWxkIGlzIG1hcHBlZCB0byA8Y29kZT5qYXZhLnNxbC5DbG9iPC9jb2RlPiBvciA8Y29kZT5qYXZhLnNxbC5CbG9iPC9jb2RlPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBMb2I8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE2YzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSI+QmFzaWMgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE3YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0VBSkdEIiBuYW1lPSJDQUNFQUpHRCI+PC9hPjxhIGlkPSJzdGhyZWYyMzciIG5hbWU9InN0aHJlZjIzNyI+PC9hPjxhIGlkPSJzdGhyZWYyMzgiIG5hbWU9InN0aHJlZjIzOCI+PC9hPjxhIGlkPSJzdGhyZWYyMzkiIG5hbWU9InN0aHJlZjIzOSI+PC9hPlRlbXBvcmFsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLTx1bD4KLTxsaT4KLTxwPkRhdGUgJm5kYXNoOyA8Y29kZT5qYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wICZuZGFzaDsgPGNvZGU+amF2YS5zcWwuVGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFRlbXBvcmFsPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxN2MxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMC5odG0jQkFCQkFCQ0UiPkJhc2ljIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJzdGhyZWYyNDAiIG5hbWU9InN0aHJlZjI0MCI+PC9hPjxhIGlkPSJzdGhyZWYyNDEiIG5hbWU9InN0aHJlZjI0MSI+PC9hPjxhIGlkPSJzdGhyZWYyNDIiIG5hbWU9InN0aHJlZjI0MiI+PC9hPkVudW1lcmF0ZWQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10MTYgcjFjMi10MTYiPlNwZWNpZnkgaG93IHRvIHBlcnNpc3QgZW51bWVyYXRlZCBjb25zdHJhaW50cyBpZiB0aGUgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZSBzdWl0cyB5b3VyIGFwcGxpY2F0aW9uIHJlcXVpcmVtZW50cyBvciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuCi08dWw+Ci08bGk+Ci08cD5vcmRpbmFsPC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPlN0cmluZzwvY29kZT48L3A+Ci08L2xpPgotPC91bD4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbnVtZXJhdGVkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxNiByMWMzLXQxNiI+T3JkaW5hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOGMxLXQxNiByMWM0LXQxNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOWMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjMi10MTYiPlRoZSBwZXJzaXN0ZW50IGVudGl0eSB0byB3aGljaCB0aGUgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTljMS10MTYgcjFjMy10MTYiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxOWMxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+IDxhIGhyZWY9InRhc2tzMDE0Lmh0bSNCQUJFSUVHRCI+TWFueS10by1tYW55IG1hcHBpbmc8L2E+LCA8YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyMGMxLXQxNiIgaGVhZGVycz0icjFjMS10MTYiPjxhIGlkPSJzdGhyZWYyNDMiIG5hbWU9InN0aHJlZjI0MyI+PC9hPklEPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IGlmIHRoZSBlbnRpdHkncyBJRCBpcyBkZXJpdmVkIGZyb20gdGhlIGlkZW50aXR5IG9mIGFub3RoZXIgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIwYzEtdDE2IHIxYzQtdDE2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIxYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pBSUhCIiBuYW1lPSJDQUNKQUlIQiI+PC9hPkNhc2NhZGUgVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMWMxLXQxNiByMWMyLXQxNiI+U3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBwcm9wYWdhdGVkIHRocm91Z2hvdXQgdGhlIGVudGl0eS4KLTx1bD4KLTxsaT4KLTxwPkFsbCAmbmRhc2g7IEFsbCBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPlBlcnNpc3Q8L3A+Ci08L2xpPgotPGxpPgotPHA+TWVyZ2U8L3A+Ci08L2xpPgotPGxpPgotPHA+TW92ZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SZW1vdmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UmVmcmVzaDwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIxYzEtdDE2IHIxYzMtdDE2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMjFjMS10MTYgcjFjNC10MTYiPjxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiwgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0pESkpBIiBuYW1lPSJDQUNKREpKQSI+PC9hPk1hcHBlZCBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWMyLXQxNiI+VGhlIGZpZWxkIGluIHRoZSBkYXRhYmFzZSB0YWJsZSB0aGF0ICJvd25zIiB0aGUgcmVsYXRpb25zaGlwLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIG9ubHkgb24gdGhlIG5vbi1vd25pbmcgc2lkZSBvZiB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyMmMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIyYzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjIzYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+PGEgaWQ9IkNBQ0RBRElIIiBuYW1lPSJDQUNEQURJSCI+PC9hPjxhIGlkPSJzdGhyZWYyNDQiIG5hbWU9InN0aHJlZjI0NCI+PC9hPjxhIGlkPSJzdGhyZWYyNDUiIG5hbWU9InN0aHJlZjI0NSI+PC9hPk9yZGVyIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzItdDE2Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeToKLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbSBvcmRlcmluZzwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9yZGVyQnk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjIzYzEtdDE2IHIxYzMtdDE2Ij5QcmltYXJ5IGtleTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyM2MxLXQxNiByMWM0LXQxNiI+PGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPi4gPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4sIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjI0YzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyNGMxLXQxNiByMWMyLXQxNiI+T3ZlcnJpZGVzIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYzwvc3Bhbj4gbWFwcGluZ3Mgb2YgYSBtYXBwZWQgc3VwZXJjbGFzcyAoZm9yIGV4YW1wbGUsIGlmIHRoZSBpbmhlcml0ZWQgY29sdW1uIG5hbWUgaXMgaW5jb21wYXRpYmxlIHdpdGggYSBwcmUtZXhpc3RpbmcgZGF0YSBtb2RlbCwgb3IgaW52YWxpZCBhcyBhIGNvbHVtbiBuYW1lIGluIHlvdXIgZGF0YWJhc2UpLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyNGMxLXQxNiByMWMzLXQxNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjI0YzEtdDE2IHIxYzQtdDE2Ij48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1NzZlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX25ld19qcGFfcHJvamVjdC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5OZXcgSlBBIFByb2plY3QgcGFnZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0JKQUdDIiBuYW1lPSJDQUNCSkFHQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TmV3IEpQQSBQcm9qZWN0IHBhZ2U8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBhdmFpbGFibGUgb24gdGhlIE5ldyBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIERETCAtIE9iamVjdHMgcGFnZS4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBEREwgLSBPYmplY3RzIHBhZ2UuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MiI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlByb2plY3QgbmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+TmFtZSBvZiB0aGUgRWNsaXBzZSBKUEEgcHJvamVjdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyIHIxYzMtdDIiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj5Qcm9qZWN0IGNvbnRlbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5Mb2NhdGlvbiBvZiB0aGUgd29ya3NwYWNlIGluIHdoaWNoIHRvIHNhdmUgdGhlIHByb2plY3QuCi08cD5VbnNlbGVjdCBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZSBEZWZhdWx0PC9zcGFuPiBvcHRpb24gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5Ccm93c2U8L3NwYW4+IHRvIHNlbGVjdCBhIG5ldyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyIHIxYzMtdDIiPkN1cnJlbnQgd29ya3NwYWNlPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIiIGhlYWRlcnM9InIxYzEtdDIiPlRhcmdldCBydW50aW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMyLXQyIj5TZWxlY3QgYSBwcmUtZGVmaW5lZCB0YXJnZXQgZm9yIHRoZSBwcm9qZWN0LgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5ldzwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGVudmlyb25tZW50IHdpdGggdGhlIE5ldyBTZXJ2ZXIgUnVudGltZSB3aXphcmQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MiIgaGVhZGVycz0icjFjMS10MiI+Q29uZmlndXJhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyIHIxYzItdDIiPlNlbGVjdCBhIHByb2plY3QgY29uZmlndXJhdGlvbiB3aXRoIHByZS1kZWZpbmVkIGZhY2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Jmx0O2N1c3RvbSZndDs8L3NwYW4+IHRvIG1hbnVhbGx5IHNlbGVjdCB0aGUgZmFjZXRzIGZvciB0aGlzIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MiByMWMzLXQyIj5VdGlsaXR5IEpQQSBwcm9qZWN0IHdpdGggSmF2YSA1LjA8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MiIgaGVhZGVycz0icjFjMS10MiI+RUFSIG1lbWJlcnNoaXA8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyIHIxYzItdDIiPlNwZWNpZnkgaWYgdGhpcyBwcm9qZWN0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbiBFQVIgZmlsZSBmb3IgZGVwbG95bWVudC4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkVBUiBQcm9qZWN0IE5hbWU8L3NwYW4+LCBvciBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV3PC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgRUFSIHByb2plY3QuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MiByMWMzLXQyIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MiIgaGVhZGVycz0icjFjMS10MiI+V29ya2luZyBzZXRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MiByMWMyLXQyIj5TcGVjaWZ5IGlmIHRoaXMgcHJvamVjdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW4gZXhpc3Rpbmcgd29ya2luZyBzZXQuIFRoZSBkcm9wIGRvd24gZmllbGQgc2hvd3MgYSBsaXN0IG9mIHByZXZpb3VzIHNlbGVjdGVkIHdvcmtpbmcgc2V0cy4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkIHByb2plY3QgdG8gd29ya2luZyBzZXRzPC9zcGFuPiwgdGhlbiBzZWxlY3QgYSB3b3JraW5nIHNldCBpbiB3aGljaCB0byBhZGQgdGhpcyBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIgcjFjMy10MiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OTMyMGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSkdCRyIgbmFtZT0iQ0FDQkpHQkciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPlRoZSBDcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBKYXZhIHByb2plY3QgdXNpbmcgSlBBLiBUaGUgd2l6YXJkIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGFnZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfamF2YV9wYWdlLmh0bSNDSUFHRUJBQSI+SmF2YSBQYWdlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNmYwOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYWw8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhbCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNJRkdKIiBuYW1lPSJDSUFDSUZHSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhbDwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBHZW5lcmFsIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI1OCIgbmFtZT0ic3RocmVmMjU4Ij48L2E+PGEgaWQ9InN0aHJlZjI1OSIgbmFtZT0ic3RocmVmMjU5Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBHZW5lcmFsIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEdlbmVyYWwgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCZyc3F1bztzIEdlbmVyYWwgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPk5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMzLXQyNCI+Ci08cD5UaGUgcHJvamVjdCBuYW1lLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+UGVyc2lzdGVuY2UgUHJvdmlkZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgcHJvdmlkZXIuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMy10MjQiPgotPHA+RGV0ZXJtaW5lZCBieSB0aGUgc2VydmVyLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RGVzY3JpcHRpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+Ci08cD5FbnRlciBhIGRlc2NyaXB0aW9uIGZvciB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuIFRoaXMgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+TWFuYWdlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMi10MjQiPgotPHA+QWRkIG9yIHJlbW92ZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjQgcjFjMi10MjQiPgotPHA+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNCByMWMzLXQyNCI+Ci08cD5GYWxzZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPgotPHA+WE1MIE1hcHBpbmcgRmlsZXM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQyNCByMWMyLXQyNCI+Ci08cD5BZGQgb3IgcmVtb3ZlIHRoZSBvYmplY3QvcmVsYXRpb25hbCBtYXBwaW5nIFhNTCBmaWxlcyB0aGF0IGRlZmluZSB0aGUgY2xhc3NlcyB0byBiZSBtYW5hZ2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI0IHIxYzMtdDI0Ij4KLTxwPk1ldGEtSU5GXG9ybS54bWw8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MjQiIGhlYWRlcnM9InIxYzEtdDI0Ij4KLTxwPkpBUiBGaWxlczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI0IHIxYzItdDI0Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQyNjczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSUZCQUYiIG5hbWU9IkJBQklGQkFGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIyOCIgbmFtZT0ic3RocmVmMjI4Ij48L2E+PGEgaWQ9InN0aHJlZjIyOSIgbmFtZT0ic3RocmVmMjI5Ij48L2E+PGEgaWQ9InN0aHJlZjIzMCIgbmFtZT0ic3RocmVmMjMwIj48L2E+VGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBkaXNwbGF5cyB0aGUgcGVyc2lzdGVuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFwcGVkIGF0dHJpYnV0ZSBhbmQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBhcmVhczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRhZmNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBTdHJ1Y3R1cmUgdmlldzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJFR0dGRSIgbmFtZT0iQkFCRUdHRkUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpQQSBTdHJ1Y3R1cmUgdmlldzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjU1IiBuYW1lPSJzdGhyZWYyNTUiPjwvYT48YSBpZD0ic3RocmVmMjU2IiBuYW1lPSJzdGhyZWYyNTYiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBTdHJ1Y3R1cmU8L3NwYW4+IHZpZXcgZGlzcGxheXMgYW4gb3V0bGluZSBvZiB0aGUgc3RydWN0dXJlIChpdHMgYXR0cmlidXRlcyBhbmQgbWFwcGluZ3MpIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgb3Igb3BlbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIHNob3duIGluIHRoZSBvdXRsaW5lIGFyZSB0aGUgZW50aXR5IGFuZCBpdHMgZmllbGRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjI1NyIgbmFtZT0ic3RocmVmMjU3Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEpQQSBTdHJ1Y3R1cmUgVmlldzwvcD4KLTxpbWcgc3JjPSJpbWcvcGVyc2lzdGVuY2Vfb3V0bGluZV92aWV3LnBuZyIgYWx0PSJTYW1wbGUgSlBBIFN0cnVjdHVyZSB2aWV3IGZvciBhbiBlbnRpdHkuIiB0aXRsZT0iU2FtcGxlIEpQQSBTdHJ1Y3R1cmUgdmlldyBmb3IgYW4gZW50aXR5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGJlOGNhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQklGQkRCIiBuYW1lPSJCQUJJRkJEQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyODYiIG5hbWU9InN0aHJlZjI4NiI+PC9hPjxhIGlkPSJzdGhyZWYyODciIG5hbWU9InN0aHJlZjI4NyI+PC9hPlRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9zcGFuPiBkZWZpbmVzIHRoZSBpbml0aWFsIHNldCBhbmQgbGF5b3V0IG9mIHZpZXdzIGluIHRoZSBXb3JrYmVuY2ggd2luZG93IHdoZW4gdXNpbmcgRGFsaS4gQnkgZGVmYXVsdCwgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmU8L3NwYW4+IGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgdmlld3M6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jb25jZXB0cy00Lmh0bSI+UGVyc3BlY3RpdmVzPC9hPjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA4ZTAxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZBRUJCIiBuYW1lPSJCQUJGQUVCQiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjExIiBuYW1lPSJzdGhyZWYyMTEiPjwvYT48YSBpZD0ic3RocmVmMjEyIiBuYW1lPSJzdGhyZWYyMTIiPjwvYT48YSBpZD0ic3RocmVmMjEzIiBuYW1lPSJzdGhyZWYyMTMiPjwvYT5UaGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGRpc3BsYXlzIHRoZSBwZXJzaXN0ZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbnRpdHkgYW5kIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgdGFiczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDcuaHRtI0NBQ0lKQkdIIj5BdHRyaWJ1dGUgb3ZlcnJpZGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0JISURBIj5TZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAwOS5odG0jQ0FDRkhHSEUiPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNzkwMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUNDSElEIiBuYW1lPSJDSUFDQ0hJRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+cGVyc2lzdGVuY2UueG1sIEVkaXRvcjwvaDE+Ci08cD5UaGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdGhhdCBlbmFibGVzIHlvdSB0byB1cGRhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlLiBGb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIHBsYXRmb3JtLCB0aGUgcGVyaXNpc3RlbmNlLnhtbCBFZGl0b3IgY29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMC5odG0jQ0lBQkVEQ0giPkNhY2hpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiPkxvZ2dpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIj5Qcm9wZXJ0aWVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZSBmb2xsb3dpbmcgc3Vic2V0IG9mIHRoZXNlIHBhZ2VzIGlzIGF2YWlsYWJsZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfZ2VuZXJhbC5odG0jQ0lBQ0lGR0oiPkdlbmVyYWw8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyNS5odG0jQ0lBSENKQUgiPlNvdXJjZTwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3ByaW1hcnlfa2V5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlMDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJpbWFyeV9rZXkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkNDQUIiIG5hbWU9IkNBQ0ZDQ0FCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uPC9zcGFuPiBhcmVhIGluIEpQQSBEZXRhaWxzIHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyI+SUQgbWFwcGluZzwvYT4gdHlwZXMuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBDb2x1bW5zIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM0JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE5Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTkiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxOSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDQkFKQkMiIG5hbWU9IkNBQ0JBSkJDIj48L2E+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzItdDE5Ij48YSBpZD0ic3RocmVmMjUxIiBuYW1lPSJzdGhyZWYyNTEiPjwvYT48YSBpZD0ic3RocmVmMjUyIiBuYW1lPSJzdGhyZWYyNTIiPjwvYT5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLiBUaGVzZSBmaWVsZHMgY29ycmVzcG9uZCB0byB0aGUgPGNvZGU+QEdlbmVyYXRlZFZhbHVlPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5HZW5lcmF0ZWQgVmFsdWU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDSkVFRUMiIG5hbWU9IkNBQ0pFRUVDIj48L2E+Jm5ic3A7Jm5ic3A7Jm5ic3A7U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMyLXQxOSI+Ci08dWw+Ci08bGk+QXV0bzwvbGk+Ci08bGk+Ci08cD5JZGVudGl0eSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgdGhlIGRhdGFiYXNlJ3MgPHNwYW4gY2xhc3M9ImJvbGQiPklkZW50aXR5PC9zcGFuPiBjb2x1bW4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlcXVlbmNlICZuZGFzaDsgVmFsdWVzIGFyZSBhc3NpZ25lZCBieSBhIHNlcXVlbmNlIHRhYmxlIChzZWUgPGEgaHJlZj0iI0NBQ0ZGSEVIIj5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvYT4pLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSAmbmRhc2g7IFZhbHVlcyBhcmUgYXNzaWduZWQgYnkgYSBkYXRhYmFzZSB0YWJsZSAoc2VlIDxhIGhyZWY9IiNDQUNHRkVBSCI+VGFibGUgR2VuZXJhdG9yPC9hPikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxOSByMWMzLXQxOSI+QXV0bzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJCQUJFRUFISiIgbmFtZT0iQkFCRUVBSEoiPjwvYT4mbmJzcDsmbmJzcDtHZW5lcmF0b3IgTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIHZhbHVlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij48YSBpZD0iQ0FDR0ZFQUgiIG5hbWU9IkNBQ0dGRUFIIj48L2E+VGFibGUgR2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTkgcjFjMi10MTkiPlRoZXNlIGZpZWxkcyBkZWZpbmUgdGhlIGRhdGFiYXNlIHRhYmxlIHVzZWQgZm9yIGdlbmVyYXRpbmcgdGhlIHByaW1hcnkga2V5IGFuZCBjb3JyZXNwb25kIHRvIHRoZSA8Y29kZT5AVGFibGVHZW5lcmF0b3I8L2NvZGU+IGFubm90YXRpb24uCi08cD5UaGVzZSBmaWVsZHMgYXBwbHkgb25seSB3aGVuIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4mbmJzcDs9Jm5ic3A7PHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5VbmlxdWUgbmFtZSBvZiB0aGUgZ2VuZXJhdG9yLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij4mbmJzcDsmbmJzcDtUYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE5IHIxYzItdDE5Ij5EYXRhYmFzZSB0YWJsZSB0aGF0IHN0b3JlcyB0aGUgZ2VuZXJhdGVkIElEIHZhbHVlcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMi10MTkiPlRoZSBjb2x1bW4gaW4gdGhlIHRhYmxlIGdlbmVyYXRvcidzIDxzcGFuIGNsYXNzPSJib2xkIj5UYWJsZTwvc3Bhbj4gdGhhdCBjb250YWlucyB0aGUgcHJpbWFyeSBrZXkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPiZuYnNwOyZuYnNwO1ZhbHVlIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzItdDE5Ij5UaGUgY29sdW1uIHRoYXQgc3RvcmVzIHRoZSBnZW5lcmF0ZWQgSUQgdmFsdWVzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7UHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDE5IHIxYzItdDE5Ij5UaGUgdmFsdWUgZm9yIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJpbWFyeSBLZXkgQ29sdW1uPC9zcGFuPiBpbiB0aGUgZ2VuZXJhdG9yIHRhYmxlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxOSByMWMzLXQxOSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQxOSIgaGVhZGVycz0icjFjMS10MTkiPjxhIGlkPSJDQUNGRkhFSCIgbmFtZT0iQ0FDRkZIRUgiPjwvYT5TZXF1ZW5jZSZuYnNwO0dlbmVyYXRvcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQxOSByMWMyLXQxOSI+PGEgaWQ9InN0aHJlZjI1MyIgbmFtZT0ic3RocmVmMjUzIj48L2E+PGEgaWQ9InN0aHJlZjI1NCIgbmFtZT0ic3RocmVmMjU0Ij48L2E+VGhlc2UgZmllbGRzIGRlZmluZSB0aGUgc3BlY2lmaWMgc2VxdWVuY2UgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgcHJpbWFyeSBrZXkgYW5kIGNvcnJlc3BvbmQgdG8gdGhlIDxjb2RlPkBTZXF1ZW5jZUdlbmVyYXRvcjwvY29kZT4gYW5ub3RhdGlvbi4KLTxwPlRoZXNlIGZpZWxkcyBhcHBseSBvbmx5IHdoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPlN0cmF0ZWd5PC9zcGFuPiA9IDxzcGFuIGNsYXNzPSJib2xkIj5TZXF1ZW5jZTwvc3Bhbj4uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjExYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQxOSByMWMyLXQxOSI+TmFtZSBvZiB0aGUgc2VxdWVuY2UgdGFibGUgdG8gdXNlIGZvciBkZWZpbmluZyBwcmltYXJ5IGtleSB2YWx1ZXMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+Jm5ic3A7Jm5ic3A7U2VxdWVuY2U8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMi10MTkiPlVuaXF1ZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MTkgcjFjMy10MTkiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTZhYTg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJKSEJDSSIgbmFtZT0iQkFCSkhCQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNzMiIG5hbWU9InN0aHJlZjI3MyI+PC9hPjxhIGlkPSJzdGhyZWYyNzQiIG5hbWU9InN0aHJlZjI3NCI+PC9hPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkVycm9ycy9XYXJuaW5nczwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc3BlY2lmeSB0aGUgdmFsaWRhdGlvbiBvcHRpb25zIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibGluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzYiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPkVuYWJsZSBwcm9qZWN0IHNwZWNpZmljIHNldHRpbmdzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYWwgc2V0dGluZ3MgZm9yIHRoaXMgcHJvamVjdC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtQcm9qZWN0IGxldmVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7UGVyc2lzdGVudCB1bml0IGxldmVsPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7VHlwZSBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO0F0dHJpYnV0ZSBsZXZlbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO1NjaGVtYSBtYXBwaW5nPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDM2IiBoZWFkZXJzPSJyMWMxLXQzNiI+Jm5ic3A7Jm5ic3A7SW1wbGllZCZuYnNwO2F0dHJpYnV0ZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtJbXBsaWVkJm5ic3A7YXNzb2NpYXRpb25zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzYgcjFjMi10MzYiPlNlbGVjdCB0aGUgd2FybmluZyBsZXZlbCB0byByZXBvcnQuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQzNiIgaGVhZGVycz0icjFjMS10MzYiPiZuYnNwOyZuYnNwO0luaGVyaXRhbmNlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDM2IHIxYzItdDM2Ij5TZWxlY3QgdGhlIHdhcm5pbmcgbGV2ZWwgdG8gcmVwb3J0LjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTFjMS10MzYiIGhlYWRlcnM9InIxYzEtdDM2Ij4mbmJzcDsmbmJzcDtRdWVyaWVzJm5ic3A7YW5kJm5ic3A7Z2VuZXJhdG9yczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQzNiByMWMyLXQzNiI+U2VsZWN0IHRoZSB3YXJuaW5nIGxldmVsIHRvIHJlcG9ydC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyNi5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZmY4MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zY2hlbWFfZnJvbV9jbGFzc2VzX3BhZ2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxNjoxODoxM1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSEJFR0oiIG5hbWU9IkNBQ0hCRUdKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzPC9oMT4KLTxwPlVzZSB0aGlzIGRpYWxvZyB0byBzZWxlY3QgdGhlIGNsYXNzZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSBhIHNjaGVtYS4gWW91IGNhbiBzZWxlY3QgYW4gZW50aXJlIHByb2plY3QsIGEgcGFja2FnZSwgb3Igc3BlY2lmaWMgY2xhc3Nlcy48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdFRhYmxlcy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhN2QzYzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZl9zZWxlY3RUYWJsZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TZWxlY3QgVGFibGVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNlbGVjdCBUYWJsZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFIQ0dFRSIgbmFtZT0iQ0lBSENHRUUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBUYWJsZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwMSIgbmFtZT0ic3RocmVmMjAxIj48L2E+PGEgaWQ9InN0aHJlZjIwMiIgbmFtZT0ic3RocmVmMjAyIj48L2E+PGEgaWQ9InN0aHJlZjIwMyIgbmFtZT0ic3RocmVmMjAzIj48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+U2VsZWN0IFRhYmxlczwvc3Bhbj4gZGlhbG9nIHRvIHNwZWNpZnkgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gYW5kIHRhYmxlcyBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBlbnRpdGllcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBHZW5lcmF0ZSBFbnRpdGllcyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ4Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10OCI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPkNvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzItdDgiPlNlbGVjdCBhIGRhdGFiYXNlIGNvbm5lY3Rpb24gb3IgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBDb25uZWN0aW9uPC9zcGFuPiB0byBjcmVhdGUgYSBuZXcgY29ubmVjdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U2NoZW1hPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10OCByMWMyLXQ4Ij5TZWxlY3QgdGhlIGRhdGFiYXNlIHNjaGVtYSBmcm9tIHdoaWNoIHRvIHNlbGVjdCB0YWJsZXMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPlRhYmxlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDggcjFjMi10OCI+U2VsZWN0IHRoZSB0YWJsZXMgZnJvbSB3aGljaCB0byBjcmVhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzLiBUaGUgdGFibGVzIHNob3duIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEgc2VsZWN0aW9ucy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10OCIgaGVhZGVycz0icjFjMS10OCI+U3luY2hyb25pemUgQ2xhc3NlcyBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10OCByMWMyLXQ4Ij5TcGVjaWZ5IGlmIERhbGkgc2hvdWxkIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIGluY2x1ZGUgdGhlIGdlbmVyYXRlZCBjbGFzc2VzLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NyZWF0ZV9jdXN0b21fZW50aXRpZXNfd2l6YXJkLmh0bSNDSUFHQkZKRSI+R2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXMgV2l6YXJkPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfc2VsZWN0X2Nhc2NhZGVfZGlhbG9nLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3YmYxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTZWxlY3QgQ2FzY2FkZSBkaWFsb2ciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFGREdJSiIgbmFtZT0iQ0lBRkRHSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlbGVjdCBDYXNjYWRlIGRpYWxvZzwvaDE+Ci08cD5TcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgYXJlIHByb3BhZ2F0ZWQgdGhyb3VnaG91dCB0aGUgYXNzb2NpYXRpb246IEFsbCwgUGVyc2lzdCwgTWVyZ2UsIFJlbW92ZSwgb3IgUmVmcmVzaC48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmX3RhYmxlQXNzb2NpYXRpb25zLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdlZjNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UYWJsZSBBc3NvY2lhdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iVGFibGUgQXNzb2NpYXRpb25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBQ0RJQ0IiIG5hbWU9IkNJQUNESUNCIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5UYWJsZSBBc3NvY2lhdGlvbnM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjIwNCIgbmFtZT0ic3RocmVmMjA0Ij48L2E+VXNlIHRoaXMgcGFnZSB0byBjcmVhdGUgb3IgZWRpdCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZGF0YWJhc2UgdGFibGUgYW5kIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEdlbmVyYXRlIEVudGl0aWVzIGRpYWxvZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBUYWJsZSBBc3NvY2lhdGlvbnMgZGlhbG9nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10OSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDkiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ5IiBoZWFkZXJzPSJyMWMxLXQ5Ij5UYWJsZSBhc3NvY2lhdGlvbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ5IHIxYzItdDkiPlNlbGVjdCBhbiBhc3NvY2lhdGlvbiB0byBtb2RpZnkgb3IgY2xpY2sgdG8gY3JlYXRlIGEgbmV3IHRhYmxlIGFzc29jaWF0aW9uIHdpdGggdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+IHdpemFyZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10OSIgaGVhZGVycz0icjFjMS10OSI+R2VuZXJhdGUgdGhpcyBhc3NvY2lhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDkgcjFjMi10OSI+U3BlY2lmeSBpZiBEYWxpIHNob3VsZCBjcmVhdGUgdGhlIHNlbGVjdGVkIGFzc29jaWF0aW9uLiBJZiBlbmFibGVkLCB5b3UgY2FuIHNwZWNpZnkgdGhlIENhcmRpbmFsaXR5IGFuZCBKb2luIHRhYmxlIGZvciB0aGUgdGFibGUgYXNzb2NpYXRpb24uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDkiIGhlYWRlcnM9InIxYzEtdDkiPkdlbmVyYXRlIGEgcmVmZXJlbmNlIHRvIDxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtST1cmZ3Q7PC9zcGFuPiBpbiA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEUmZ3Q7PC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDkgcjFjMi10OSI+U3BlY2lmeSBpZiB0aGUgZW50aXR5IHNob3VsZCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgdGFibGUuCi08cD5JZiBlbmFibGVkLCB5b3UgY2FuIGFsc28gZW50ZXIgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5Qcm9wZXJ0eTwvc3Bhbj4gbmFtZSBhbmQgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q2FzY2FkZTwvc3Bhbj4gbWV0aG9kIChhbGwsIHBlcnNpc3QsIG1lcmdlLCByZW1vdmUsIG9yIHJlZnJlc2gpIGZvciB0aGUgcmVmZXJlbmNlLjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX25ld19hc3NvY2lhdGlvbl93aXphcmQuaHRtI0NJQUZHSElGIj5DcmVhdGUgTmV3IEFzc29jaWF0aW9uPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiPkdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzIFdpemFyZDwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGIwMjdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5SZWZlcmVuY2U8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFJlZmVyZW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9InN0aHJlZjE4OSIgbmFtZT0ic3RocmVmMTg5Ij48L2E+PC9wPgotPGgxPlJlZmVyZW5jZTwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgZGV0YWlsZWQgaGVscCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBvZiB0aGUgZm9sbG93aW5nIGVsZW1lbnRzIGluIHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbDo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDEuaHRtI0NBQ0pKSkpIIj5XaXphcmRzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMDUuaHRtI0NBQ0RKSUlHIj5Qcm9wZXJ0eSBwYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI2Lmh0bSNDQUNERUlFRSI+UHJlZmVyZW5jZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyOC5odG0jQ0FDR0VKREEiPkRpYWxvZ3M8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiPkpQQSBEZXZlbG9wbWVudCBwZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMy5odG0jQ0FDQkJESUIiPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0MDIyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+V2l6YXJkczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDYtMDRUMTk6MzM6M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJXaXphcmRzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDSkpKSkgiIG5hbWU9IkNBQ0pKSkpIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5XaXphcmRzPC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nIHdpemFyZHM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdF93aXphcmQuaHRtI0NBQ0JKR0JHIj5DcmVhdGUgTmV3IEpQQSBQcm9qZWN0IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFHSENHQSI+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfY3JlYXRlX2N1c3RvbV9lbnRpdGllc193aXphcmQuaHRtI0NJQUdCRkpFIj5HZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQ8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtI0NBQ0dBREZIIj5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MzY0MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgRmlsZSBXaXphcmQ8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUlKQ0NFIiBuYW1lPSJDSUFJSkNDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TWFwcGluZyBGaWxlIFdpemFyZDwvaDE+Ci08cD5UaGUgTWFwcGluZyBGaWxlIHdpemFyZCBlbmFibGVzIHlvdSB0byBhZGQgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB0byBhIEpQQSBwcm9qZWN0IGlmIG5vIG9iamVjdCBtYXAgZXhpc3RzIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQuIEZvciBleGFtcGxlLCBpZiB5b3UgY2xlYXJlZCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gb24gdGhlIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4sIHlvdSBjYW4gbGF0ZXIgYWRkIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIHRvIHRoZSBzcmMgZmlsZSBvZiB0aGUgcHJvamVjdCB1c2luZyB0aGlzIHdpemFyZC48L3A+Ci08cD5UaGUgPGEgaHJlZj0iI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPiBjb25zaXN0cyBvZiB0aGUgTWFwcGluZyBGaWxlIHBhZ2UuPC9wPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzczY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5NYXBwaW5nIEZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDZaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGluZyBGaWxlIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSkVJREoiIG5hbWU9IkNJQUpFSURKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYXBwaW5nIEZpbGU8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMTk5IiBuYW1lPSJzdGhyZWYxOTkiPjwvYT48YSBpZD0ic3RocmVmMjAwIiBuYW1lPSJzdGhyZWYyMDAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPk1hcHBpbmcgRmlsZSBXaXphcmQgUHJvcGVydGllczwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iTWFwcGluZyBGaWxlIFdpemFyZCBQcm9wZXJ0aWVzIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBNYXBwaW5nIEZpbGUgV2l6YXJkLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10NyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQ3Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPlByb2plY3Q8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ3IHIxYzItdDciPgotPHA+VGhlIG5hbWUgb2YgdGhlIEpQQSBwcm9qZWN0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5Tb3VyY2UgZm9sZGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NyByMWMyLXQ3Ij4KLTxwPlRoZSBsb2NhdGlvbiBvZiB0aGUgcHJvamVjdCdzIHNyYyBmb2xkZXIuIElmIG5lZWRlZCwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gdG8gcG9pbnQgdGhlIHdpemFyZCB0byB0aGUgc3JjIGZpbGUncyBsb2NhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQ3IHIxYzMtdDciPgotPHA+U2VsZWN0ZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDciIGhlYWRlcnM9InIxYzEtdDciPgotPHA+RmlsZSBQYXRoPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10NyByMWMyLXQ3Ij4KLTxwPlRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NyIgaGVhZGVycz0icjFjMS10NyI+Ci08cD5EZWZhdWx0IEFjY2VzczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDcgcjFjMi10NyI+Ci08cD5TZWxlY3Qgd2hldGhlciB0aGUgYWNjZXNzIHRvIHRoZSBlbnRpdHkgaXMgZmllbGQtYmFzZWQgb3IgcHJvcGVydHktYmFzZWQsIGFzIGRlZmluZWQgaW4gSlBBIHNwZWNpZmljYXRpb24uPC9wPgotPHVsPgotPGxpPgotPHA+Tm9uZSAmbmRhc2g7IE5vIGFjY2VzcyB0eXBlIHNwZWNpZmllZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GaWVsZC1iYXNlZDwvc3Bhbj4gJm5kYXNoOyBJbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBBbGwgbm9uLXRyYW5zaWVudCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIHBlcnNpc3RlbnQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ3IHIxYzMtdDciPgotPHA+Tm9uZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ3IiBoZWFkZXJzPSJyMWMxLXQ3Ij4KLTxwPkFkZCB0byBwZXJzaXN0ZW5jZSB1bml0PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NyByMWMyLXQ3Ij4KLTxwPkRlc2lnbmF0ZXMgdGhlIHBlcnNpc3RlbmNlIHVuaXQgZm9yIHRoaXMgb2JqZWN0IG1hcCBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDcgcjFjMy10NyI+Ci08cD5TZWxlY3RlZC48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwMi5odG0jQ0lBSUpDQ0UiPk1hcHBpbmcgRmlsZSBXaXphcmQ8L2E+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEwMGNkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ2WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUdIQ0dBIiBuYW1lPSJDSUFHSENHQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMgV2l6YXJkPC9oMT4KLTxwPlVzZSB0aGUgR2VuZXJhdGUgRERMIGZyb20gRW50aXRpZXMgV2l6YXJkIHRvIHF1aWNrbHkgY3JlYXRlIERETCBzY3JpcHRzIGZyb20geW91ciBwZXJzaXN0ZW50IGVudGl0aWVzLiBEYWxpIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyB0aGUgbmVjZXNzYXJ5IHByaW1hcnkgYW5kIGZvcmVpZ24ga2V5cywgYmFzZWQgb24gdGhlIGVudGl0eSBtYXBwaW5ncy48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiI+Q3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExMTQwMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnR5IHBhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByb3BlcnR5IHBhZ2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREpJSUciIG5hbWU9IkNBQ0RKSUlHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9wZXJ0eSBwYWdlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYmMyNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUdHQyIgbmFtZT0iQ0FDQ0FHR0MiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDEzIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTMiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDEzIj5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+TWFwcGluZyBUeXBlIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzItdDEzIj5DbGlja2luZyB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyByZXByZXNlbnRlZCBhcyBhIGh5cGVybGluaywgaW52b2tlcyB0aGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cuIFVzZSB0aGlzIGRpYWxvZyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGVudGl0eTogTWFwcGVkIFN1cGVyY2xhc3MsIEVtYmVkZGFibGUgb3IgdGhlIGRlZmF1bHQgbWFwcGluZyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzMtdDEzIj5FbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+LCA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+LCBhbmQgPGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzItdDEzIj5UaGUgZGVmYXVsdCBkYXRhYmFzZSB0YWJsZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBlbnRpdHkuIFRoZXNlIGZpZWxkcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giPkF0dHJpYnV0ZSBvdmVycmlkZXM8L2E+IGFyZWEuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtOYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMi10MTMiPlRoZSBuYW1lIG9mIHRoZSBwcmltYXJ5IGRhdGFiYXNlIHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxMyByMWM0LXQxMyI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDEzIiBoZWFkZXJzPSJyMWMxLXQxMyI+Jm5ic3A7Jm5ic3A7Q2F0YWxvZzwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzItdDEzIj5UaGUgZGF0YWJhc2UgY2F0YWxvZyB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzMtdDEzIj5BcyBkZWZpbmVkIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj4mbmJzcDsmbmJzcDtTY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxMyByMWMyLXQxMyI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEzIHIxYzMtdDEzIj5BcyBkZWZpbmVkIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjMi10MTMiPlRoZSBuYW1lIG9mIHRoaXMgZW50aXR5LiBCeSBkZWZhdWx0LCB0aGUgY2xhc3MgbmFtZSBpcyB1c2VkIGFzIHRoZSBlbnRpdHkgbmFtZS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPkFjY2VzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDEzIHIxYzItdDEzIj5UaGUgYWNjZXNzIG1ldGhvZCBmb3IgdGhpcyBlbnRpdHkuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTMgcjFjMy10MTMiPkZpZWxkPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MTMgcjFjNC10MTMiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPlByaW1hcnkmbmJzcDtrZXkmbmJzcDtjbGFzczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDEzIHIxYzItdDEzIj5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QnJvd3NlPC9zcGFuPiBhbmQgc2VsZWN0IHRoZSBwcmltYXJ5IGtleSBmb3IgdGhlIGVudGl0eS4gQ2xpY2tpbmcgdGhlIGZpZWxkIG5hbWUsIHdoaWNoIGlzIHJlcHJlc2VudGVkIGFzIGEgaHlwZXJsaW5rLCBhbGxvd3MgeW91IHRvIGNyZWF0ZSBhIG5ldyBjbGFzcy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQxMyByMWMzLXQxMyI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MTMgcjFjNC10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTBjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5DYWNoYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQxMyByMWMyLXQxMyI+U3BlY2lmaWVzIGlmIHRoZSBlbnRpdHkgaXMgY2FjaGFibGUuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AQ2FjaGFibGU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzMtdDEzIj5AQ2FjaGFibGUoZmFsc2UpPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDEzIHIxYzQtdDEzIj48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMDBhY2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkF0dHJpYnV0ZSBvdmVycmlkZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDdaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQXR0cmlidXRlIG92ZXJyaWRlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0lKQkdIIiBuYW1lPSJDQUNJSkJHSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+QXR0cmlidXRlIG92ZXJyaWRlczwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE0IiBuYW1lPSJzdGhyZWYyMTQiPjwvYT48YSBpZD0ic3RocmVmMjE1IiBuYW1lPSJzdGhyZWYyMTUiPjwvYT48YSBpZD0ic3RocmVmMjE2IiBuYW1lPSJzdGhyZWYyMTYiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3Mgc3BlY2lmaWVkIGluIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDYuaHRtI0NBQ0NBR0dDIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBhcmVhIG9mIGFuIGF0dHJpYnV0ZS4gQXR0cmlidXRlIG92ZXJyaWRlcyBnZW5lcmFsbHkgb3ZlcnJpZGUvY29uZmlndXJlIGF0dHJpYnV0ZXMgdGhhdCBhcmUgaW5oZXJpdGVkIG9yIGVtYmVkZGVkLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIEF0dHJpYnV0ZSBvdmVycmlkZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIxNyUiIC8+Ci08Y29sIHdpZHRoPSIyNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE0Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTQiPkRlZmF1bHQ8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzQtdDE0Ij5BdmFpbGFibGUgZm9yIEVudGl0eSZuYnNwO1R5cGU8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+QXR0cmlidXRlIE92ZXJyaWRlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZ5IGEgcHJvcGVydHkgb3IgZmllbGQgdG8gYmUgb3ZlcnJpZGRlbiAoZnJvbSB0aGUgZGVmYXVsdCBtYXBwaW5ncykuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzQtdDE0Ij48YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+U3BlY2lmeSB0aGUgam9pbmluZyBzdHJhdGVneS4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiB0byBhZGQgYSBkaWZmZXJlbnQgam9pbmluZyBzdHJhdGVneS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMzLXQxNCI+Sm9pbiBjb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTQgcjFjNC10MTQiPjxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAwNi5odG0jQ0FDQ0FHR0MiPkdlbmVyYWwgaW5mb3JtYXRpb248L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wcm9wX3ZpZXcuaHRtI0JBQkZBRUJCIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMDguaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDBmOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTZWNvbmRhcnkgdGFibGUgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCSElEQSIgbmFtZT0iQ0FDQkhJREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNlY29uZGFyeSB0YWJsZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjE3IiBuYW1lPSJzdGhyZWYyMTciPjwvYT48YSBpZD0ic3RocmVmMjE4IiBuYW1lPSJzdGhyZWYyMTgiPjwvYT48YSBpZD0ic3RocmVmMjE5IiBuYW1lPSJzdGhyZWYyMTkiPjwvYT48YSBpZD0ic3RocmVmMjIwIiBuYW1lPSJzdGhyZWYyMjAiPjwvYT5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5TZWNvbmRhcnkgVGFibGVzPC9zcGFuPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgdG8gYXNzb2NpYXRlIGFkZGl0aW9uYWwgdGFibGVzIHdpdGggYW4gZW50aXR5LiBVc2UgdGhpcyBhcmVhIGlmIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgaXMgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSB0YWJsZXMuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAwOS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwNTM4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDA5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkluaGVyaXRhbmNlIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkluaGVyaXRhbmNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkhHSEUiIG5hbWU9IkNBQ0ZIR0hFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Jbmhlcml0YW5jZSBpbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjIxIiBuYW1lPSJzdGhyZWYyMjEiPjwvYT48YSBpZD0ic3RocmVmMjIyIiBuYW1lPSJzdGhyZWYyMjIiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SW5oZXJpdGFuY2U8L3NwYW4+IGFyZWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBJbmhlcml0YW5jZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyMyUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+U3RyYXRlZ3k8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMyLXQxNSI+U3BlY2lmeSB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gbWFwcGluZyBhIGNsYXNzIG9yIGNsYXNzIGhpZXJhcmNoeToKLTx1bD4KLTxsaT4KLTxwPlNpbmdsZSB0YWJsZSAmbmRhc2g7IEFsbCBjbGFzc2VzIGluIHRoZSBoaWVyYXJjaHkgYXJlIG1hcHBlZCB0byBhIHNpbmdsZSB0YWJsZS48L3A+Ci08L2xpPgotPGxpPgotPHA+Sm9pbmVkICZuZGFzaDsgVGhlIHJvb3Qgb2YgdGhlIGhpZXJhcmNoeSBpcyBtYXBwZWQgdG8gYSBzaW5nbGUgdGFibGU7IGVhY2ggY2hpbGQgbWFwcyB0byBpdHMgb3duIHRhYmxlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UYWJsZSBwZXIgY2xhc3MgJm5kYXNoOyBFYWNoIGNsYXNzIGlzIG1hcHBlZCB0byBhIHNlcGFyYXRlIHRhYmxlLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QEluaGVyaXRhbmNlPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE1IHIxYzMtdDE1Ij5TaW5nbGUgdGFibGU8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjIzIiBuYW1lPSJzdGhyZWYyMjMiPjwvYT48YSBpZD0ic3RocmVmMjI0IiBuYW1lPSJzdGhyZWYyMjQiPjwvYT5EaXNjcmltaW5hdG9yIFZhbHVlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGFuIGVudGl0eSBpbiB0aGlzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gVGhlIHZhbHVlIG11c3QgY29uZm9ybSB0byB0aGUgc3BlY2lmaWVkIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFR5cGU8L3NwYW4+LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij48YSBpZD0ic3RocmVmMjI1IiBuYW1lPSJzdGhyZWYyMjUiPjwvYT48YSBpZD0ic3RocmVmMjI2IiBuYW1lPSJzdGhyZWYyMjYiPjwvYT5EaXNjcmltaW5hdG9yIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE1IHIxYzItdDE1Ij5UaGVzZSBmaWVsZHMgYXJlIGF2YWlsYWJsZSB3aGVuIHVzaW5nIGEgPHNwYW4gY2xhc3M9ImJvbGQiPlNpbmdsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkpvaW5lZDwvc3Bhbj4gaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuCi08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ARGlzY3JpbWluYXRvckNvbHVtbjwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EZXRhaWxzPC9zcGFuPiBhcmVhIHRvIGRlZmluZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkxlbmd0aDwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Db2x1bW4gZGVmaW5pdGlvbjwvc3Bhbj4gb2YgdGhpcyBEaXNjcmltaW5hdG9yIENvbHVtbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNSByMWMzLXQxNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+Jm5ic3A7Jm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzItdDE1Ij5OYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIGNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij4mbmJzcDsmbmJzcDtUeXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTUgcjFjMi10MTUiPlNldCB0aGlzIGZpZWxkIHRvIHNldCB0aGUgZGlzY3JpbWluYXRvciB0eXBlIHRvIDxjb2RlPkNoYXI8L2NvZGU+IG9yIDxjb2RlPkludGVnZXI8L2NvZGU+IChpbnN0ZWFkIG9mIGl0cyBkZWZhdWx0OiA8Y29kZT5TdHJpbmc8L2NvZGU+KS4gVGhlIDxzcGFuIGNsYXNzPSJib2xkIj5EaXNjcmltaW5hdG9yIFZhbHVlPC9zcGFuPiBtdXN0IGNvbmZvcm0gdG8gdGhpcyB0eXBlLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE1IHIxYzMtdDE1Ij5TdHJpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNSByMWMyLXQxNSI+VXNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4gU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5PdmVycmlkZSBEZWZhdWx0PC9zcGFuPiwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBzZWxlY3QgbmV3IEpvaW4gQ29sdW1uLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB3aXRoIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE1IHIxYzMtdDE1Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj5BZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGIzZTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5RdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ3WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjIyNyIgbmFtZT0ic3RocmVmMjI3Ij48L2E+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5Vc2UgdGhlIHF1ZXJpZXMgYXJlYSBvZiB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjcmVhdGUgbmFtZWQgcXVlcmllcyBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuIFJlZmVyIHRvIDxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwOS5odG0jQkFCSUdCR0ciPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVjZGNlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQkFFQkMiIG5hbWU9IkNBQ0JBRUJDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Kb2luIFRhYmxlIEluZm9ybWF0aW9uPC9oMT4KLTxwPlVzZSBhcmVhIHRvIHNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4gQnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC9wPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGF2YWlsYWJsZSBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpvaW4gVGFibGU8L3NwYW4+IGFyZWEgaW4gPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPnRoZSBKUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgPGEgaHJlZj0idGFza3MwMTYuaHRtI0JBQkhHRUJEIj5PbmUtdG8tbWFueSBtYXBwaW5nPC9hPiBhbmQgPGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT4gbWFwcGluZyB0eXBlcy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBUYWJsZSB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSm9pbiBUYWJsZSB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzItdDE3Ij5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMzLXQxNyI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPjxhIGlkPSJDQUNCQkRGRyIgbmFtZT0iQ0FDQkJERkciPjwvYT5Kb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNyByMWMyLXQxNyI+PGEgaWQ9InN0aHJlZjI0NiIgbmFtZT0ic3RocmVmMjQ2Ij48L2E+PGEgaWQ9InN0aHJlZjI0NyIgbmFtZT0ic3RocmVmMjQ3Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMi10MTciPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDI5Lmh0bSNDQUNDR0VIQyI+RWRpdCBKb2luIENvbHVtbnMgRGlhbG9nPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxOTkwNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0N1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJKb2luIENvbHVtbnMgSW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNGQ0VKQyIgbmFtZT0iQ0FDRkNFSkMiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvaDE+Ci08cD48YSBpZD0ic3RocmVmMjQ4IiBuYW1lPSJzdGhyZWYyNDgiPjwvYT5UaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBUYWJsZTwvc3Bhbj4gYXJlYSBpbiA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIDxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT4gYW5kIDxhIGhyZWY9InRhc2tzMDE3Lmh0bSNCQUJGSEJDSiI+T25lLXRvLW9uZSBtYXBwaW5nPC9hPiBtYXBwaW5nIHR5cGVzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxOCByMWMyLXQxOCI+PGEgaWQ9InN0aHJlZjI0OSIgbmFtZT0ic3RocmVmMjQ5Ij48L2E+PGEgaWQ9InN0aHJlZjI1MCIgbmFtZT0ic3RocmVmMjUwIj48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTggcjFjMy10MTgiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAyOS5odG0jQ0FDQ0dFSEMiPkVkaXQgSm9pbiBDb2x1bW5zIERpYWxvZzwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA4OTIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmFsIGluZm9ybWF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNDQUNHSCIgbmFtZT0iQ0FDQ0FDR0giPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYWwgaW5mb3JtYXRpb248L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgR2VuZXJhbCBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIGVhY2ggZW50aXR5IHR5cGUuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjElIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIwIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjAiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5QYWNrYWdlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjAgcjFjMi10MjAiPlRoZSBKYXZhIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUgcGVyc2lzdGVudCBlbnRpdGllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gYW5kIHNlbGVjdCB0aGUgcGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzMtdDIwIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjAiIGhlYWRlcnM9InIxYzEtdDIwIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMy10MjAiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMyLXQyMCI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjAgcjFjMi10MjAiPlNwZWNpZnkgdGhlIGRlZmF1bHQgYWNjZXNzIG1ldGhvZCBmb3IgdGhlIHZhcmlhYmxlcyBpbiB0aGUgcHJvamVjdDoKLTx1bD4KLTxsaT4KLTxwPlByb3BlcnR5PC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkPC9wPgotPC9saT4KLTwvdWw+Ci08cD5UaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT4mbHQ7YWNjZXNzJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMCByMWMzLXQyMCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyNGQzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0VBR0JHIiBuYW1lPSJDQUNFQUdCRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UGVyc2lzdGVuY2UgVW5pdCBpbmZvcm1hdGlvbjwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBQZXJzaXN0ZW5jZSBVbml0IGluZm9ybWF0aW9uIGZpZWxkcyBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldyBmb3IgZWFjaCBlbnRpdHkgdHlwZS4gVGhlc2UgZmllbGRzIGFyZSBjb250YWluZWQgaW4gdGhlIDxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjEiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIxIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPlhNTCBNYXBwaW5nIERhdGEgQ29tcGxldGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMyLXQyMSI+U3BlY2lmaWVzIHRoYXQgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQgYXJlIGZ1bGx5IHNwZWNpZmllZCBieSB0aGVpciBtZXRhZGF0YS4gQW55IGFubm90YXRpb25zIHdpbGwgYmUgaWdub3JlZC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDt4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhc2NhZGUgUGVyc2lzdDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzItdDIxIj5BZGRzIGNhc2NhZGUtcGVyc2lzdCB0byB0aGUgc2V0IG9mIGNhc2NhZGUgb3B0aW9ucyBpbiBlbnRpdHkgcmVsYXRpb25zaGlwcyBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXNjYWRlLXBlcnNpc3QmZ3Q7PC9jb2RlPiBlbGVtZW50IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzMtdDIxIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5TY2hlbWE8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIHNjaGVtYSB0aGF0IGNvbnRhaW5zIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+VGFibGU8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+Jmx0O3NjaGVtYSZndDs8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjEgcjFjMy10MjEiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhdGFsb2c8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMyLXQyMSI+VGhlIGRhdGFiYXNlIGNhdGFsb2cgdGhhdCBjb250YWlucyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPiZsdDtjYXRhbG9nJmd0OzwvY29kZT4gZWxlbWVudCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMzLXQyMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+QWNjZXNzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMi10MjEiPlNwZWNpZnkgaG93IHRoZSBlbnRpdHkgaXRzIGFjY2VzcyBpbnN0YW5jZSB2YXJpYWJsZXMuCi08dWw+Ci08bGk+Ci08cD5Qcm9wZXJ0eSAmbmRhc2g7IFBlcnNpc3RlbnQgc3RhdGUgYWNjZXNzZWQgdGhyb3VnaCB0aGUgcHJvcGVydHkgYWNjZXNzb3IgbWV0aG9kcy4gVGhlIHByb3BlcnR5IGFjY2Vzc29yIG1ldGhvZHMgbXVzdCBiZSA8c3BhbiBjbGFzcz0iYm9sZCI+cHVibGljPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+cHJpdmF0ZTwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkZpZWxkICZuZGFzaDsgSW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NlZCBkaXJlY3RseS4gQWxsIG5vbi10cmFuc2llbnQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZW50LjwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjEgcjFjMy10MjEiPlByb3BlcnR5PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwYzg4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRvcnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdG9ycyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZHQUlKIiBuYW1lPSJDSUFGR0FJSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdG9yczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBHZW5lcmF0b3IgaW5mb3JtYXRpb24gZmllbGRzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3IGZvciB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3LCBHZW5lcmFsIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyMSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjIiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMiI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIyIiBoZWFkZXJzPSJyMWMxLXQyMiI+R2VuZXJhdG9yPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjIgcjFjMi10MjIiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBTZXF1ZW5jZSBhbmQgVGFibGUgZ2VuZXJhdG9ycy4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgU2VxdWVuY2U8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgVGFibGU8L3NwYW4+IHRvIGFkZCBhIG5ldyBnZW5lcmF0b3IuPC9wPgotPHA+Rm9yIHNlcXVlbmNlIGdlbmVyYXRvcnMsIHlvdSBtdXN0IGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgZmllbGRzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPk5hbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+U2NoZW1hPC9wPgotPC9saT4KLTxsaT4KLTxwPkNhdGFsb2c8L3A+Ci08L2xpPgotPGxpPgotPHA+QWxsb2NhdGlvbiBzaXplPC9wPgotPC9saT4KLTxsaT4KLTxwPkluaXRpYWwgdmFsdWU8L3A+Ci08L2xpPgotPC91bD4KLTxwPkZvciB0YWJsZSBnZW5lcmF0b3JzLCB5b3UgbXVzdCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIGZpZWxkczo8L3A+Ci08dWw+Ci08bGk+Ci08cD5OYW1lPC9wPgotPC9saT4KLTxsaT4KLTxwPlRhYmxlPC9wPgotPC9saT4KLTxsaT4KLTxwPlNjaGVtYTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXRhbG9nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5IGNvbHVtbjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5WYWx1ZSBjb2x1bW48L3A+Ci08L2xpPgotPGxpPgotPHA+UHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlPC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbG9jYXRpb24gc2l6ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyN2EyYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlF1ZXJpZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUXVlcmllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUlCQUFKIiBuYW1lPSJDSUFJQkFBSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+UXVlcmllczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBRdWVyeSBpbmZvcm1hdGlvbiBmaWVsZHMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcgZm9yIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEdlbmVyYWwgdGFiLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldywgR2VuZXJhbCB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIxJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIzIj5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5RdWVyaWVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMi10MjMiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBOYW1lZCBhbmQgTmF0aXZlIHF1ZXJpZXMuCi08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0byBhZGQgYSBuYW1lZCBxdWVyeSwgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBOYXRpdmU8L3NwYW4+IGZvciBhIG5hdGl2ZSBxdWVyeS48L3A+Ci08cD5Gb3IgbmFtZWQgcXVlcmllcywgZW50ZXIgdGhlIHF1ZXJ5IGluIHRoZSBRdWVyeSBmaWVsZC48L3A+Ci08cD5Gb3IgbmF0aXZlIHF1ZXJpZXMsIHNlbGVjdCBhIHJlc3VsdCBjbGFzcywgdGhlbiBlbnRlciB0aGUgcXVlcnkgaW4gdGhlIFF1ZXJ5IGZpZWxkLjwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPlF1ZXJ5IEhpbnRzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMi10MjMiPkRpc3BsYXlzIHRoZSBleGlzdGluZyBxdWVyeSBoaW50cyAoTmFtZSBhbmQgVmFsdWUpLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gYWRkIGEgbmV3IHF1ZXJ5IGhpbnQuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyI+Q3JlYXRpbmcgTmFtZWQgUXVlcmllczwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhMjFhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE3Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVydGVyczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDb252ZXJ0ZXJzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBREdDSUQiIG5hbWU9IkNJQURHQ0lEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Db252ZXJ0ZXJzPC9oMT4KLTxwPlRoZSBDb252ZXJ0ZXJzIGluZm9ybWF0aW9uIGluIHRoZSBKUEEgRGV0YWlscyB2aWV3IGFwcGxpZXMgb25seSB3aGVuIHVzaW5nIEVjbGlwc2VMaW5rPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gY3JlYXRlIGEgbmV3IGNvbnZlcnRlciwgdXNpbmcgdGhlIDxhIGhyZWY9InJlZl9hZGRfY29udmVydGVyLmh0bSNDSUFHQ0dJSiI+QWRkIENvbnZlcnRlciBkaWFsb2c8L2E+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfZGV0YWlsc19vcm0uaHRtI0NBQ0dER0hDIj5KUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzNWI3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbm5lY3Rpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29ubmVjdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZGSklFIiBuYW1lPSJDSUFGRkpJRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29ubmVjdGlvbjwvaDE+Ci08cD5UaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgQ29ubmVjdGlvbiBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjAiIG5hbWU9InN0aHJlZjI2MCI+PC9hPjxhIGlkPSJzdGhyZWYyNjEiIG5hbWU9InN0aHJlZjI2MSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgQ29ubmVjdGlvbiBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBDb25uZWN0aW9uIFBhZ2UiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBwZXJzaXN0ZW5jZS54bWwgZWRpdG9yJnJzcXVvO3MgY29ubmVjdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+VHJhbnNhY3Rpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzItdDI1Ij4KLTxwPlNwZWNpZnkgaWYgdGhlIGNvbm5lY3Rpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCB1c2VzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRyYW5zYWN0aW9uIHR5cGVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0PC9zcGFuPiAtLSBTZWxlY3QgdG8gdXNlIHRoZSBjb250YWluZXIgdXNlZCBieSB0aGUgY29udGFpbmVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIC0tIFRyYW5zYWN0aW9ucyBvZiB0aGUgSmF2YSBFRSBzZXJ2ZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5SZXNvdXJjZSBMb2NhbDwvc3Bhbj4gLS0gTmF0aXZlIGFjdGlvbnMgb2YgYSBKREJDIGRyaXZlciB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IGEgcGVyc2lzdGVuY2UgdW5pdC48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPkJhdGNoIFdyaXRpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMyLXQyNSI+Ci08cD5TcGVjaWZ5IHRoZSB1c2Ugb2YgYmF0Y2ggd3JpdGluZyB0byBvcHRpbWl6ZSB0cmFuc2FjdGlvbnMgd2l0aCBtdWx0aXBsZSB3cml0ZSBvcGVyYXRpb25zLjwvcD4KLTxwPlNldCB0aGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpbnRvIHRoZSBzZXNzaW9uIGF0IGRlcGxveW1lbnQgdGltZS48L3A+Ci08cD5Ob3RlOiBUaGlzIHByb3BlcnR5IGFwcGxpZXMgd2hlbiB1c2VkIGJvdGggaW4gYSBKYXZhIFNFIGFuZCBKYXZhIEVFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIG9yYWNsZS50b3BsaW5rLmNvbmZpZy5CYXRjaFdyaXRpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBKREJDIGJhdGNoIHdyaXRpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5CdWZmZXJlZDwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBlaXRoZXIgSkRCQyBiYXRjaCB3cml0aW5nIG5vciBuYXRpdmUgcGxhdGZvcm0gYmF0Y2ggd3JpdGluZy48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9yYWNsZUpEQkM8L3NwYW4+Jm5kYXNoO1VzZSBib3RoIEpEQkMgYmF0Y2ggd3JpdGluZyBhbmQgT3JhY2xlIG5hdGl2ZSBwbGF0Zm9ybSBiYXRjaCB3cml0aW5nLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4mbmRhc2g7RG8gbm90IHVzZSBiYXRjaCB3cml0aW5nICh0dXJuIGl0IG9mZikuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5TdGF0ZW1lbnQgY2FjaGluZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5OYXRpdmUgU1FMPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI1IHIxYzMtdDI1Ij4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD5KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+SlRBPC9zcGFuPiBhcyB0aGUgdHJhbnNhY3Rpb24gdHlwZSwgdGhlbiBlbnRlciB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBKVEEgZGF0YSBzb3VyY2UgZm9yIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjUiIGhlYWRlcnM9InIxYzEtdDI1Ij4KLTxwPk5vbi1KVEEgRGF0YSBTb3VyY2UgTmFtZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI1IHIxYzItdDI1Ij4KLTxwPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGFzIHRoZSB0cmFuc2FjdGlvbiB0eXBlLCB0aGVuIGVudGVyIHRoZSBuYW1lIG9mIHRoZSBub24tSlRBIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+Jm5ic3A7Jm5ic3A7QmluZCZuYnNwO1BhcmFtZXRlcnM8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyNSByMWMyLXQyNSI+Ci08cD5Db250cm9sIHdoZXRoZXIgb3Igbm90IHRoZSBxdWVyeSB1c2VzIHBhcmFtZXRlciBiaW5kaW5nLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvcGVydHkgYXBwbGllcyB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoaXMgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIEdlbmVyaWMgcGxhdGZvcm0uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjUgcjFjMy10MjUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOWMxLXQyNSIgaGVhZGVycz0icjFjMS10MjUiPgotPHA+RWNsaXBzZUxpbmsgQ29ubmVjdGlvbiBQb29sPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjUgcjFjMi10MjUiPgotPHA+RGVmaW5lIHRoZSBjb25uZWN0aW9uIHBvb2wgZHJpdmVyLCBVUkwsIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQuPC9wPgotPHA+VGhlc2UgcHJvcGVydGllcyBhcmUgbm90ZSBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEwYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtSZWFkJm5ic3A7Q29ubmVjdGlvbjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMGMxLXQyNSByMWMyLXQyNSI+Ci08cD5UaGUgbWF4aW11bSBhbmQgbWluaW11bSBudW1iZXIgb2YgY29ubmVjdGlvbnMgYWxsb3dlZCBpbiB0aGUgSkRCQyByZWFkIGNvbm5lY3Rpb24gcG9vbC48L3A+Ci08cD5Ob3RlOiBUaGVzZSBwcm9wZXJ0eSBhcHBseSB3aGVuIHVzZWQgaW4gYSBKYXZhIFNFIGVudmlyb25tZW50LjwvcD4KLTxwPlRoZXNlIHByb3BlcnRpZXMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSBHZW5lcmljIHBsYXRmb3JtPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI1IHIxYzMtdDI1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+Ci08cD4mbmJzcDsmbmJzcDtXcml0ZSZuYnNwO0Nvbm5lY3Rpb248L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjUgcjFjMi10MjUiPgotPHA+VGhlIG1heGltdW0gYW5kIG1pbmltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIGFsbG93ZWQgaW4gdGhlIEpEQkMgcmVhZCBjb25uZWN0aW9uIHBvb2wuPC9wPgotPHA+Tm90ZTogVGhlc2UgcHJvcGVydHkgYXBwbHkgd2hlbiB1c2VkIGluIGEgSmF2YSBTRSBlbnZpcm9ubWVudC48L3A+Ci08cD5UaGVzZSBwcm9wZXJ0aWVzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTEzZGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMTkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3VzdG9taXphdGlvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJDdXN0b21pemF0aW9uIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSkFGRUciIG5hbWU9IkNJQUpBRkVHIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5DdXN0b21pemF0aW9uPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSBDdXN0b21pemF0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2MiIgbmFtZT0ic3RocmVmMjYyIj48L2E+PGEgaWQ9InN0aHJlZjI2MyIgbmFtZT0ic3RocmVmMjYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDdXN0b21pemF0aW9uIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIEN1c3RvbWl6YXRpb24gUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvciZyc3F1bztzIEN1c3RvbWl6YXRpb24gcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDI2Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjYiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyNiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPldlYXZpbmc8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+Ci08cD5TcGVjaWZpZXMgaWYgd2VhdmluZyBvZiB0aGUgZW50aXR5IGNsYXNzZXMgaXMgcGVyZm9ybWVkLiBUaGUgRWNsaXBzZUxpbmsgSlBBIHBlcnNpc3RlbmNlIHByb3ZpZGVyIHVzZXMgd2VhdmluZyB0byBlbmhhbmNlIEpQQSBlbnRpdGllcyBmb3Igc3VjaCBwcm9wZXJ0aWVzIGFzIGxhenkgbG9hZGluZywgY2hhbmdlIHRyYWNraW5nLCBmZXRjaCBncm91cHMsIGFuZCBpbnRlcm5hbCBvcHRpbWl6YXRpb25zLiBTZWxlY3QgZnJvbSB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vIFdlYXZpbmc8L3NwYW4+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWF2ZSBEeW5hbWljYWxseTwvc3Bhbj48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPldlYXZlIFN0YXRpY2FsbHk8L3NwYW4+IC0tIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgcGxhbiB0byBleGVjdXRlIHlvdXIgYXBwbGljYXRpb24gb3V0c2lkZSBvZiBhIEphdmEgRUUgNSBjb250YWluZXIgaW4gYW4gZW52aXJvbm1lbnQgdGhhdCBkb2VzIG5vdCBwZXJtaXQgdGhlIHVzZSBvZiA8Y29kZT4tamF2YWFnZW50OmVjbGlwc2VsaW5rLmphcjwvY29kZT4gb24gdGhlIEpWTSBjb21tYW5kIGxpbmUuIFRoaXMgYXNzdW1lcyB0aGF0IGNsYXNzZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3RhdGljYWxseSB3b3Zlbi4gUnVuIHRoZSBzdGF0aWMgd2VhdmVyIG9uIHRoZSBjbGFzc2VzIGJlZm9yZSBkZXBsb3lpbmcgdGhlbS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPldlYXZlIER5bmFtaWNhbGx5PC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD4mbmJzcDsmbmJzcDtXZWF2aW5nJm5ic3A7TGF6eTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgbGF6eSB3ZWF2aW5nLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcmbmJzcDtGZXRjaCZuYnNwO0dyb3VwczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBlbmFibGUgZmV0Y2ggZ3JvdXBzIHRocm91Z2ggd2VhdmluZy4gU2V0IHRoaXMgb3B0aW9uIHRvIGZhbHNlIGlmOjwvcD4KLTx1bD4KLTxsaT4KLTxwPlRoZXJlIGlzIG5vIHdlYXZpbmcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsYXNzZXMgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGR1cmluZyB3ZWF2aW5nIChmb3IgZXhhbXBsZSwgd2hlbiBkZWJ1Z2dpbmcpLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+U2V0IHRoaXMgcHJvcGVydHkgdG8gZmFsc2UgZm9yIHBsYXRmb3JtcyB3aGVyZSBpdCBpcyBub3Qgc3VwcG9ydGVkLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPldlYXZpbmcmbmJzcDtpbnRlcm5hbDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI2IHIxYzItdDI2Ij48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNiByMWMzLXQyNiI+Ci08cD5UcnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5XZWF2aW5nJm5ic3A7ZWFnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjYgcjFjMy10MjYiPgotPHA+RmFsc2U8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPiZuYnNwOyZuYnNwO1dlYXZpbmcmbmJzcDtDaGFuZ2UmbmJzcDtUcmFja2luZzwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCB0aGlzIG9wdGlvbiB0byB1c2Ugd2VhdmluZyB0byBkZXRlY3Qgd2hpY2ggZmllbGRzIG9yIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBjaGFuZ2UuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjYgcjFjMy10MjYiPgotPHA+VHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+Jm5ic3A7Jm5ic3A7VGhyb3cmbmJzcDtFeGNlcHRpb25zPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIHNldCBFY2xpcHNlTGluayB0byB0aHJvdyBhbiBleGNlcHRpb24gb3IgbG9nIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBwcm9ibGVtIHdpdGggYW55IG9mIHRoZSBmaWxlcyBsaXN0ZWQgaW4gYSA8c3BhbiBjbGFzcz0iYm9sZCI+cGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlIDxjb2RlPiZsdDttYXBwaW5nLWZpbGUmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPkV4Y2VwdGlvbiBoYW5kbGVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IChvciBjcmVhdGUpIGEgSmF2YSBjbGFzcyB0byBoYW5kbGUgZXhjZXB0aW9ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyNiByMWMzLXQyNiI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQyNiIgaGVhZGVycz0icjFjMS10MjYiPgotPHA+U2Vzc2lvbiBDdXN0b21pemVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI2IHIxYzItdDI2Ij4KLTxwPlNlbGVjdCBhIHNlc3Npb24gY3VzdG9taXplciBjbGFzczogYSBKYXZhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgPGNvZGU+ZWNsaXBzZWxpbmsudG9vbHMuc2Vzc2lvbmNvbmZpZ3VyYXRpb24uU2Vzc2lvbkN1c3RvbWl6ZXI8L2NvZGU+IGludGVyZmFjZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0ICh6ZXJvLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4gVXNlIHRoaXMgY2xhc3MnIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5zZXNzaW9ucy5TZXNzaW9uPC9jb2RlPiwgdG8gcHJvZ3JhbW1hdGljYWxseSBhY2Nlc3MgYWR2YW5jZWQgRWNsaXBzZUxpbmsgc2Vzc2lvbiBBUEkuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDI2IHIxYzMtdDI2Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjExYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5EZXNjcmlwdG9yIEN1c3RvbWl6ZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjYgcjFjMi10MjYiPgotPHA+U2VsZWN0IGFuIEVjbGlwc2VMaW5rIGRlc2NyaXB0b3IgY3VzdG9taXplciBjbGFzcyZuZGFzaDthIEphdmEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSA8Y29kZT5lY2xpcHNlbGluay50b29scy5zZXNzaW9uY29uZmlndXJhdGlvbi5EZXNjcmlwdG9yQ3VzdG9taXplcjwvY29kZT4gaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBhIGRlZmF1bHQgKHplcm8tYXJndW1lbnQpIGNvbnN0cnVjdG9yLiBVc2UgdGhpcyBjbGFzcydzIDxjb2RlPmN1c3RvbWl6ZTwvY29kZT4gbWV0aG9kLCB3aGljaCB0YWtlcyBhbiA8Y29kZT5lY2xpcHNlbGluay5kZXNjcmlwdG9ycy5DbGFzc0Rlc2NyaXB0b3I8L2NvZGU+LCB0byBwcm9ncmFtbWF0aWNhbGx5IGFjY2VzcyBhZHZhbmNlZCBFY2xpcHNlTGluayBkZXNjcmlwdG9yIGFuZCBtYXBwaW5nIEFQSSBmb3IgdGhlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgZW50aXR5IG5hbWVkIDxjb2RlPiZsdDtFTlRJVFkmZ3Q7PC9jb2RlPi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTFjMS10MjYgcjFjMy10MjYiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMTJjMS10MjYiIGhlYWRlcnM9InIxYzEtdDI2Ij4KLTxwPlZhbGlkYXRpb24gb25seTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMmMxLXQyNiByMWMyLXQyNiI+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEyYzEtdDI2IHIxYzMtdDI2Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Ci08cD5Qcm9maWxlcjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxM2MxLXQyNiByMWMyLXQyNiI+Ci08dWw+Ci08bGk+Ci08cD5ObyBQcm9maWxlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJmb3JtYW5jZSBQcm9maWxlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5RdWVyeSBNb25pdG9yPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTNjMS10MjYgcjFjMy10MjYiPgotPHA+Tm9Qcm9maWxlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ZTZkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNhY2hpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ2FjaGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUJFRENIIiBuYW1lPSJDSUFCRURDSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjI2NCIgbmFtZT0ic3RocmVmMjY0Ij48L2E+Q2FjaGluZzwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgY2xhc3M9InRibGZvcm1hbCI+PGEgaWQ9InN0aHJlZjI2NSIgbmFtZT0ic3RocmVmMjY1Ij48L2E+PGEgaWQ9InN0aHJlZjI2NiIgbmFtZT0ic3RocmVmMjY2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbnRhYmxlIj5Qcm9wZXJ0aWVzIG9mIHRoZSBDYWNoaW5nIFBhZ2U8L3A+Ci08dGFibGUgY2xhc3M9IkZvcm1hbCIgdGl0bGU9IlByb3BlcnRpZXMgb2YgdGhlIENhY2hpbmcgUGFnZSIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sJnJzcXVvO3MgQ2FjaGluZyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyOCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI4Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RGVmYXVsdCBDYWNoZSBUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjggcjFjMi10MjgiPgotPHA+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGFzIHRoZSBEZWZhdWx0IENhY2hlIFR5cGU6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPlNvZnQgd2l0aCBXZWFrIFN1YmNhY2hlPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5XZWFrIHdpdGggSGFyZCBTdWJjYWNoZTwvc3Bhbj4gZXhjZXB0IHRoYXQgaXQgbWFpbnRhaW5zIGEgbW9zdCBmcmVxdWVudGx5IHVzZWQgc3ViY2FjaGUgdGhhdCB1c2VzIHNvZnQgcmVmZXJlbmNlcy4gVGhlIHNpemUgb2YgdGhlIHN1YmNhY2hlIGlzIHByb3BvcnRpb25hbCB0byB0aGUgc2l6ZSBvZiB0aGUgaWRlbnRpdHkgbWFwLiBUaGUgc3ViY2FjaGUgdXNlcyBzb2Z0IHJlZmVyZW5jZXMgdG8gZW5zdXJlIHRoYXQgdGhlc2Ugb2JqZWN0cyBhcmUgZ2FyYmFnZS1jb2xsZWN0ZWQgb25seSBpZiB0aGUgc3lzdGVtIGlzIGxvdyBvbiBtZW1vcnkuPC9wPgotPHA+VXNlIHRoaXMgaWRlbnRpdHkgbWFwIGluIG1vc3QgY2lyY3Vtc3RhbmNlcyBhcyBhIG1lYW5zIHRvIGNvbnRyb2wgbWVtb3J5IHVzZWQgYnkgdGhlIGNhY2hlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+V2VlayB3aXRoIEhhcmQgU3ViY2FjaGU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGlzIHNpbWlsYXIgdG8gPHNwYW4gY2xhc3M9ImJvbGQiPlNvZnQgd2l0aCBXZWFrPC9zcGFuPiBzdWJjYWNoZSBleGNlcHQgdGhhdCBpdCBtYWludGFpbnMgYSBtb3N0IGZyZXF1ZW50bHkgdXNlZCBzdWJjYWNoZSB0aGF0IHVzZXMgaGFyZCByZWZlcmVuY2VzLiBVc2UgdGhpcyBpZGVudGl0eSBtYXAgaWYgc29mdCByZWZlcmVuY2VzIGFyZSBub3Qgc3VpdGFibGUgZm9yIHlvdXIgcGxhdGZvcm0uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XZWFrPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBpcyBzaW1pbGFyIHRvIDxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiwgZXhjZXB0IHRoYXQgb2JqZWN0cyBhcmUgcmVmZXJlbmNlZCB1c2luZyB3ZWFrIHJlZmVyZW5jZXMuIFRoaXMgb3B0aW9uIHVzZXMgbGVzcyBtZW1vcnkgdGhhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RnVsbDwvc3Bhbj4sIGFsbG93cyBjb21wbGV0ZSBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHByb3ZpZGVzIGZ1bGwgY2FjaGluZyBhbmQgZ3VhcmFudGVlZCBpZGVudGl0eS48L3A+Ci08cD5Vc2UgdGhpcyBpZGVudGl0eSBtYXAgZm9yIHRyYW5zYWN0aW9ucyB0aGF0LCBvbmNlIHN0YXJ0ZWQsIHN0YXkgb24gdGhlIHNlcnZlciBzaWRlLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U29mdDwvc3Bhbj4mbmRhc2g7VGhpcyBvcHRpb24gaXMgc2ltaWxhciB0byA8c3BhbiBjbGFzcz0iYm9sZCI+V2Vhazwvc3Bhbj4gZXhjZXB0IHRoYXQgdGhlIG1hcCBob2xkcyB0aGUgb2JqZWN0cyB1c2luZyBzb2Z0IHJlZmVyZW5jZXMuIFRoaXMgaWRlbnRpdHkgbWFwIGVuYWJsZXMgZnVsbCBnYXJiYWdlIGNvbGxlY3Rpb24gd2hlbiBtZW1vcnkgaXMgbG93LiBJdCBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GdWxsPC9zcGFuPiZuZGFzaDtUaGlzIG9wdGlvbiBwcm92aWRlcyBmdWxsIGNhY2hpbmcgYW5kIGd1YXJhbnRlZWQgaWRlbnRpdHk6IGFsbCBvYmplY3RzIGFyZSBjYWNoZWQgYW5kIG5vdCByZW1vdmVkLjwvcD4KLTxwPk5vdGU6IFRoaXMgcHJvY2VzcyBtYXkgYmUgbWVtb3J5LWludGVuc2l2ZSB3aGVuIG1hbnkgb2JqZWN0cyBhcmUgcmVhZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vbmU8L3NwYW4+Jm5kYXNoO1RoaXMgb3B0aW9uIGRvZXMgbm90IHByZXNlcnZlIG9iamVjdCBpZGVudGl0eSBhbmQgZG9lcyBub3QgY2FjaGUgb2JqZWN0cy5UaGlzIG9wdGlvbiBpcyBub3QgcmVjb21tZW5kZWQuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyOCByMWMzLXQyOCI+Ci08cD5XZWFrIHdpdGggc29mdCBzdWJjYWNoZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+RGVmYXVsdCBDYWNoZSBTaXplPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMi10MjgiPgotPHA+U2V0IHRoZSBzaXplIChtYXhpbXVtIG51bWJlciBvZiBvYmplY3RzKSBvZiB0aGUgY2FjaGUuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjggcjFjMy10MjgiPgotPHA+MTAwPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI4IiBoZWFkZXJzPSJyMWMxLXQyOCI+Ci08cD5EZWZhdWx0IFNoYXJlZCBDYWNoZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI4IHIxYzItdDI4Ij4KLTxwPlNwZWNpZmllcyBpZiBjYWNoZWQgaW5zdGFuY2VzIHNob3VsZCBiZSBpbiB0aGUgc2hhcmVkIGNhY2hlIG9yIGluIGEgY2xpZW50IGlzb2xhdGVkIGNhY2hlLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI4IHIxYzMtdDI4Ij4KLTxwPlRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkVudGl0eSBDYWNoaW5nPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMi10MjgiPgotPHA+U3BlY2lmeSB0aGUgZW50aXR5LXNwZWNpZmljIGNhY2hpbmcgaW5mb3JtYXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUmbmJzcDtUeXBlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjggcjFjMi10MjgiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGUgVHlwZS48L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7Q2FjaGUmbmJzcDtTaXplPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjggcjFjMi10MjgiPgotPHA+U2VlIDxzcGFuIGNsYXNzPSJpdGFsaWMiPkRlZmF1bHQgQ2FjaGUgU2l6ZS48L3NwYW4+PC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjggcjFjMy10MjgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyOGMxLXQyOCIgaGVhZGVycz0icjFjMS10MjgiPgotPHA+Jm5ic3A7Jm5ic3A7U2hhcmVkJm5ic3A7Q2FjaGU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQyOCByMWMyLXQyOCI+Ci08cD5TZWUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+RGVmYXVsdCBTaGFyZWQgQ2FjaGU8L3NwYW4+LjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDI4IHIxYzMtdDI4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10MjgiIGhlYWRlcnM9InIxYzEtdDI4Ij4KLTxwPkZsdXNoIGNsZWFyIGNhY2hlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MjggcjFjMi10MjgiPgotPHA+U2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGFzIHRoZSBEZWZhdWx0IENhY2hlIFR5cGU6PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRyb3A8L3NwYW4+ICZuZGFzaDsgVGhpcyBtb2RlIGlzIHRoZSBmYXN0ZXN0IGFuZCB1c2VzIHRoZSBsZWFzdCBtZW1vcnkuIEhvd2V2ZXIsIGFmdGVyIGNvbW1pdCB0aGUgc2hhcmVkIGNhY2hlIG1pZ2h0IHBvdGVudGlhbGx5IGNvbnRhaW4gc3RhbGUgZGF0YS48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkRyb3AgSW52YWxpZGF0ZTwvc3Bhbj4gJm5kYXNoOyBDbGFzc2VzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgb2JqZWN0IHVwZGF0ZWQgb3IgZGVsZXRlZCBhcmUgaW52YWxpZGF0ZWQgaW4gdGhlIHNoYXJlZCBjYWNoZSBhdCBjb21taXQgdGltZS4gVGhpcyBtb2RlIGlzIHNsb3dlciB0aGFuIDxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wPC9zcGFuPiwgYnV0IGFzIGVmZmljaWVudCBtZW1vcnkgdXNhZ2Utd2lzZSwgYW5kIHByZXZlbnRzIHN0YWxlIGRhdGEuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5NZXJnZTwvc3Bhbj4gJm5kYXNoOyBEcm9wIGNsYXNzZXMgZnJvbSB0aGUgRW50aXR5TWFuYWdlcidzIGNhY2hlIG9mIG9iamVjdHMgdGhhdCBoYXZlIG5vdCBiZWVuIGZsdXNoZWQuIFRoaXMgbW9kZSBsZWF2ZXMgdGhlIHNoYXJlZCBjYWNoZSBpbiBhIHBlcmZlY3Qgc3RhdGUgYWZ0ZXIgY29tbWl0LiBIb3dldmVyLCBpdCBpcyB0aGUgbGVhc3QgbWVtb3J5LWVmZmljaWVudCBtb2RlOyB0aGUgbWVtb3J5IG1pZ2h0IGV2ZW4gcnVuIG91dCBpbiBhIHZlcnkgbGFyZ2UgdHJhbnNhY3Rpb24uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOWMxLXQyOCByMWMzLXQyOCI+Ci08cD5Ecm9wIEludmFsaWRhdGU8L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJ0Ymxmb3JtYWwiIC0tPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGlzIHBhZ2UgaXMgbm90IGF2YWlsYWJsZSBmb3IgcHJvamVjdHMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5HZW5lcmljPC9zcGFuPiBwbGF0Zm9ybS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MmMzNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Mb2dnaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkxvZ2dpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFCR0hISSIgbmFtZT0iQ0lBQkdISEkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkxvZ2dpbmc8L2gxPgotPHA+VGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBwYWdlIG9mIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIj5wZXJzaXN0ZW5jZS54bWwgRWRpdG9yPC9hPi48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoaXMgcGFnZSBpcyBub3QgYXZhaWxhYmxlIGZvciBwcm9qZWN0cyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkdlbmVyaWM8L3NwYW4+IHBsYXRmb3JtLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0idGJsZm9ybWFsIj48YSBpZD0ic3RocmVmMjY3IiBuYW1lPSJzdGhyZWYyNjciPjwvYT48YSBpZD0ic3RocmVmMjY4IiBuYW1lPSJzdGhyZWYyNjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWludGFibGUiPlByb3BlcnRpZXMgb2YgdGhlIExvZ2dpbmcgUGFnZTwvcD4KLTx0YWJsZSBjbGFzcz0iRm9ybWFsIiB0aXRsZT0iUHJvcGVydGllcyBvZiB0aGUgTG9nZ2luZyBQYWdlIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBMb2dnaW5nIHBhZ2Ugb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImhzaWRlcyIgcnVsZXM9Imdyb3VwcyIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI0JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzMSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDMxIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MzEiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnaW5nIExldmVsPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzEgcjFjMi10MzEiPgotPHA+U3BlY2lmaWVzIHRoZSBhbW91bnQgYW5kIGRldGFpbCBvZiBsb2cgb3V0cHV0IGJ5IHNlbGVjdGluZyB0aGUgbG9nIGxldmVsIChpbiBhc2NlbmRpbmcgb3JkZXIgb2YgaW5mb3JtYXRpb24pOjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgYXJlIHRoZSB2YWxpZCB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZy5MZXZlbDwvY29kZT46PC9wPgotPHVsPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk9GRjwvc3Bhbj4mbmRhc2g7ZGlzYWJsZXMgbG9nZ2luZzwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U0VWRVJFPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgaW5kaWNhdGluZyBUb3BMaW5rIGNhbm5vdCBjb250aW51ZSwgYXMgd2VsbCBhcyBhbnkgZXhjZXB0aW9ucyBnZW5lcmF0ZWQgZHVyaW5nIGxvZ2luLiBUaGlzIGluY2x1ZGVzIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5XQVJOSU5HPC9zcGFuPiZuZGFzaDtsb2dzIGV4Y2VwdGlvbnMgdGhhdCBkbyBub3QgZm9yY2UgVG9wTGluayB0byBzdG9wLCBpbmNsdWRpbmcgYWxsIGV4Y2VwdGlvbnMgbm90IGxvZ2dlZCB3aXRoIHNldmVyZSBsZXZlbC4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGEgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5JTkZPPC9zcGFuPiZuZGFzaDtsb2dzIHRoZSBsb2dpbi9sb2dvdXQgcGVyIHNldmVyIHNlc3Npb24sIGluY2x1ZGluZyB0aGUgdXNlciBuYW1lLiBBZnRlciBhY3F1aXJpbmcgdGhlIHNlc3Npb24sIGRldGFpbGVkIGluZm9ybWF0aW9uIGlzIGxvZ2dlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNPTkZJRzwvc3Bhbj4mbmRhc2g7bG9ncyBvbmx5IGxvZ2luLCBKREJDIGNvbm5lY3Rpb24sIGFuZCBkYXRhYmFzZSBpbmZvcm1hdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkZJTkU8L3NwYW4+Jm5kYXNoO2xvZ3MgU1FMLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RklORVI8L3NwYW4+Jm5kYXNoO3NpbWlsYXIgdG8gd2FybmluZy4gSW5jbHVkZXMgc3RhY2sgdHJhY2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5GSU5FU1Q8L3NwYW4+Jm5kYXNoO2luY2x1ZGVzIGFkZGl0aW9uYWwgbG93IGxldmVsIGluZm9ybWF0aW9uLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbCIgdmFsdWU9IklORk8iLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDMxIHIxYzMtdDMxIj4KLTxwPkluZm88L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RpbWVzdGFtcDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgdGltZXN0YW1wIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aW1lc3RhbXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5mYWxzZTwvc3Bhbj4mbmRhc2g7ZG8gbm90IGxvZyBhIHRpbWVzdGFtcC48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcudGltZXN0YW1wIiB2YWx1ZT0iZmFsc2UiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMxIHIxYzMtdDMxIj4KLTxwPnRydWU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzEiIGhlYWRlcnM9InIxYzEtdDMxIj4KLTxwPiZuYnNwOyZuYnNwO1RocmVhZDwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciBhIHRocmVhZCBpZGVudGlmaWVyIGlzIGxvZ2dlZCBpbiBlYWNoIGxvZyBlbnRyeS48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj50cnVlPC9zcGFuPiZuZGFzaDtsb2cgYSB0aHJlYWQgaWRlbnRpZmllci48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPmZhbHNlPC9zcGFuPiZuZGFzaDtkbyBub3QgbG9nIGEgdGhyZWFkIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMSByMWMzLXQzMSI+Ci08cD50cnVlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD4mbmJzcDsmbmJzcDtTZXNzaW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMi10MzEiPgotPHA+Q29udHJvbCB3aGV0aGVyIGFuIEVjbGlwc2VMaW5rIHNlc3Npb24gaWRlbnRpZmllciBpcyBsb2dnZWQgaW4gZWFjaCBsb2cgZW50cnkuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGEgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpZGVudGlmaWVyLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgYSBFY2xpcHNlTGluayBzZXNzaW9uIGlkZW50aWZpZXIuPC9wPgotPC9saT4KLTwvdWw+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLnNlc3Npb24iIHZhbHVlPSJmYWxzZSIvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzEgcjFjMy10MzEiPgotPHA+dHJ1ZTwvcD4KLTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQzMSIgaGVhZGVycz0icjFjMS10MzEiPgotPHA+Jm5ic3A7Jm5ic3A7RXhjZXB0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzItdDMxIj4KLTxwPkNvbnRyb2wgd2hldGhlciB0aGUgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSB3aXRoaW4gdGhlIEVjbGlwc2VMaW5rIGNvZGUgYXJlIGxvZ2dlZCBwcmlvciB0byByZXR1cm5pbmcgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4gRW5zdXJlcyB0aGF0IGFsbCBleGNlcHRpb25zIGFyZSBsb2dnZWQgYW5kIG5vdCBtYXNrZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgdGhlIHZhbGlkIHZhbHVlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+dHJ1ZTwvc3Bhbj4mbmRhc2g7bG9nIGFsbCBleGNlcHRpb25zLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+ZmFsc2U8L3NwYW4+Jm5kYXNoO2RvIG5vdCBsb2cgZXhjZXB0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucyIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDMxIHIxYzMtdDMxIj4KLTxwPmZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2cgZmlsZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMxIHIxYzItdDMxIj4KLTxwPlNwZWNpZnkgYSBmaWxlIGxvY2F0aW9uIGZvciB0aGUgbG9nIG91dHB1dCAoaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgb3V0KS48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmZpbGUiIHZhbHVlPSJDOlxteW91dFwiIC8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzMSByMWMzLXQzMSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI4YzEtdDMxIiBoZWFkZXJzPSJyMWMxLXQzMSI+Ci08cD5Mb2dnZXI8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMSByMWMyLXQzMSI+Ci08cD5TZWxlY3QgdGhlIHR5cGUgb2YgbG9nZ2VyIHRvIHVzZTo8L3A+Ci08cD5UaGUgZm9sbG93aW5nIGFyZSB0aGUgdmFsaWQgdmFsdWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0TG9nZ2VyPC9zcGFuPiZuZGFzaDt0aGUgRWNsaXBzZUxpbmsgbmF0aXZlIGxvZ2dlciA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLkRlZmF1bHRTZXNzaW9uTG9nPC9jb2RlPi48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkphdmFMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLmxvZ2dpbmcuSmF2YUxvZzwvY29kZT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5TZXJ2ZXJMb2dnZXI8L3NwYW4+Jm5kYXNoO3RoZSA8Y29kZT5qYXZhLnV0aWwubG9nZ2luZzwvY29kZT4gbG9nZ2VyIDxjb2RlPmVjbGlwc2VsaW5rLnBsYXRmb3JtLnNlcnZlci5TZXJ2ZXJMb2c8L2NvZGU+LiBJbnRlZ3JhdGVzIHdpdGggdGhlIGFwcGxpY2F0aW9uIHNlcnZlcidzIGxvZ2dpbmcgYXMgZGVmaW5lIGluIHRoZSA8Y29kZT5lY2xpcHNlbGluay5wbGF0Zm9ybS5zZXJ2ZXIuU2VydmVyUGxhdGZvcm0uPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5GdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGN1c3RvbSBsb2dnZXIuIFRoZSBjdXN0b20gbG9nZ2VyIG11c3QgaW1wbGVtZW50IHRoZSA8Y29kZT5lY2xpcHNlbGluay5sb2dnaW5nLlNlc3Npb25Mb2c8L2NvZGU+IGludGVyZmFjZS48L3A+Ci08L2xpPgotPC91bD4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5FeGFtcGxlPC9zcGFuPjogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlPC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotJmx0O3Byb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubG9nZ2VyIiB2YWx1ZT0iYWNtZS5sb2dnZXJzLk15Q3VzdG9tTG9nZ2VyIiAvJmd0OwotPC9wcmU+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10MzEgcjFjMy10MzEiPgotPHA+RGVmYXVsdExvZ2dlcjwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTExYjdjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9wdGlvbnM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT3B0aW9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUZKQ0hFIiBuYW1lPSJDSUFGSkNIRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+T3B0aW9uczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNjkiIG5hbWU9InN0aHJlZjI2OSI+PC9hPjxhIGlkPSJzdGhyZWYyNzAiIG5hbWU9InN0aHJlZjI3MCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+UHJvcGVydGllcyBvZiB0aGUgT3B0aW9ucyBQYWdlPC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSJQcm9wZXJ0aWVzIG9mIHRoZSBPcHRpb25zIFBhZ2UiIHN1bW1hcnk9IlByb3BlcnRpZXMgb2YgdGhlIE9wdGlvbnMgUGFnZSIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDMzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzMyIgaGVhZGVycz0icjFjMS10MzMiPgotPHA+U2Vzc2lvbiBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSB0aGUgbmFtZSBieSB3aGljaCB0aGUgRWNsaXBzZUxpbmsgc2Vzc2lvbiBpcyBzdG9yZWQgaW4gdGhlIHN0YXRpYyBzZXNzaW9uIG1hbmFnZXIuIFVzZSB0aGlzIG9wdGlvbiBpZiB5b3UgbmVlZCB0byBhY2Nlc3MgdGhlIEVjbGlwc2VMaW5rIHNoYXJlZCBzZXNzaW9uIG91dHNpZGUgb2YgdGhlIGNvbnRleHQgb2YgdGhlIEpQQSBvciB0byB1c2UgYSBwcmUtZXhpc3RpbmcgRWNsaXBzZUxpbmsgc2Vzc2lvbiBjb25maWd1cmVkIHRocm91Z2ggYSBFY2xpcHNlTGluayA8Y29kZT5zZXNzaW9ucy54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cD5WYWxpZCB2YWx1ZXM6IGEgdmFsaWQgRWNsaXBzZUxpbmsgc2Vzc2lvbiBuYW1lIHRoYXQgaXMgdW5pcXVlIGluIGEgc2VydmVyIGRlcGxveW1lbnQuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1uYW1lIiB2YWx1ZT0iTXlTZXNzaW9uIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5TZXNzaW9ucyBYTUw8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzMyByMWMyLXQzMyI+Ci08cD5TcGVjaWZ5IHBlcnNpc3RlbmNlIGluZm9ybWF0aW9uIGxvYWRlZCBmcm9tIHRoZSBFY2xpcHNlTGluayBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gZmlsZSAoPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPikuPC9wPgotPHA+WW91IGNhbiB1c2UgdGhpcyBvcHRpb24gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYW5ub3RhdGlvbnMgYW5kIGRlcGxveW1lbnQgWE1MLiBJZiB5b3Ugc3BlY2lmeSB0aGlzIHByb3BlcnR5LCBFY2xpcHNlTGluayB3aWxsIG92ZXJyaWRlIGFsbCBjbGFzcyBhbm5vdGF0aW9uIGFuZCB0aGUgb2JqZWN0IHJlbGF0aW9uYWwgbWFwcGluZyBmcm9tIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LCBhcyB3ZWxsIGFzIDxjb2RlPk9STS54bWw8L2NvZGU+IGFuZCBvdGhlciBtYXBwaW5nIGZpbGVzLCBpZiBwcmVzZW50LjwvcD4KLTxwPkluZGljYXRlIHRoZSBzZXNzaW9uIGJ5IHNldHRpbmcgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb24tbmFtZTwvY29kZT4gcHJvcGVydHkuPC9wPgotPHA+Tm90ZTogSWYgeW91IGRvIG5vdCBzcGVjaWZ5IHRoZSB2YWx1ZSBmb3IgdGhpcyBwcm9wZXJ0eSwgPGNvZGU+c2Vzc2lvbnMueG1sPC9jb2RlPiBmaWxlIHdpbGwgbm90IGJlIHVzZWQuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiB0aGUgcmVzb3VyY2UgbmFtZSBvZiB0aGUgc2Vzc2lvbnMgWE1MIGZpbGUuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0idG9wbGluay5zZXNzaW9uLXhtbCIgdmFsdWU9Im15c2Vzc2lvbi54bWwiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDMzIHIxYzMtdDMzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPlRhcmdldCBEYXRhYmFzZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDMzIHIxYzItdDMzIj4KLTxwPlNlbGVjdCB0aGUgdGFyZ2V0IGRhdGFiYXNlLiBZb3UgY2FuIGFsc28gc2V0IHRoZSB2YWx1ZSB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBzdWJjbGFzcyBvZiB0aGUgPGNvZGU+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UucGxhdGZvcm0uRGF0YWJhc2VQbGF0Zm9ybSBjbGFzczwvY29kZT4uPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGFyZ2V0LWRhdGFiYXNlIiB2YWx1ZT0iT3JhY2xlIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQzMyByMWMzLXQzMyI+Ci08cD5BdXRvPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5UYXJnZXQgU2VydmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzMgcjFjMi10MzMiPgotPHA+U2VsZWN0IHRoZSB0YXJnZXQgc2VydmVyIGZvciB5b3VyIEpQQSBhcHBsaWNhdGlvbi48L3A+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+RXhhbXBsZTwvc3Bhbj46IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZTwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLSZsdDtwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay50YXJnZXQtc2VydmVyIiB2YWx1ZT0iT0M0Sl8xMF8xXzMiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDMzIHIxYzMtdDMzIj4KLTxwPk5vbmU8L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPkV2ZW50IExpc3RlbmVyPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBhIGRlc2NyaXB0b3IgZXZlbnQgbGlzdGVuZXIgdG8gYmUgYWRkZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcuPC9wPgotPHA+VmFsaWQgdmFsdWVzOiBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIDxjb2RlPmVjbGlwc2VsaW5rLnNlc3Npb25zLlNlc3Npb25FdmVudExpc3RlbmVyPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsuc2Vzc2lvbi1ldmVudC1saXN0ZW5lciIgdmFsdWU9Im15cGFja2FnZS5NeUNsYXNzLmNsYXNzIi8mZ3Q7Ci08L3ByZT48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD5JbmNsdWRlIERlc2NyaXB0b3IgUXVlcmllczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzItdDMzIj4KLTxwPkVuYWJsZSBvciBkaXNhYmxlIHRoZSBkZWZhdWx0IGNvcHlpbmcgb2YgYWxsIG5hbWVkIHF1ZXJpZXMgZnJvbSB0aGUgZGVzY3JpcHRvcnMgdG8gdGhlIHNlc3Npb24uIFRoZXNlIHF1ZXJpZXMgaW5jbHVkZSB0aGUgb25lcyBkZWZpbmVkIHVzaW5nIEVjbGlwc2VMaW5rIEFQSSwgZGVzY3JpcHRvciBhbWVuZG1lbnQgbWV0aG9kcywgYW5kIHNvIG9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDMzIHIxYzMtdDMzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzMiIGhlYWRlcnM9InIxYzEtdDMzIj4KLTxwPk1pc2NlbGxhbmVvdXMgT3B0aW9uczwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDMzIHIxYzItdDMzIj48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQzMyByMWMzLXQzMyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDMzIiBoZWFkZXJzPSJyMWMxLXQzMyI+Ci08cD4mbmJzcDsmbmJzcDtUZW1wb3JhbCBtdXRhYmxlPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzMgcjFjMi10MzMiPgotPHA+U3BlY2lmeSBpZiBhbGwgPGNvZGU+RGF0ZTwvY29kZT4gYW5kIDxjb2RlPkNhbGVuZGFyPC9jb2RlPiBwZXJzaXN0ZW50IGZpZWxkcyBzaG91bGQgYmUgaGFuZGxlZCBhcyBtdXRhYmxlIG9iamVjdHMuPC9wPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkV4YW1wbGU8L3NwYW4+OiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGU8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7cHJvcGVydHkgbmFtZT0iZWNsaXBzZWxpbmsudGVtcG9yYWwubXV0YWJsZSIgdmFsdWU9InRydWUiLyZndDsKLTwvcHJlPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDMzIHIxYzMtdDMzIj4KLTxwPkZhbHNlPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0idGJsZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QzIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDIzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVjNDA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U2NoZW1hIEdlbmVyYXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iU2NoZW1hIEdlbmVyYXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUFDQ0ZDQiIgbmFtZT0iQ0lBQ0NGQ0IiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MyI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlNjaGVtYSBHZW5lcmF0aW9uPC9oMT4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFNjaGVtYSBHZW5lcmF0aW9uIHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotVGhpcyBwYWdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIHByb2plY3RzIHVzaW5nIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJpYzwvc3Bhbj4gcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJ0Ymxmb3JtYWwiPjxhIGlkPSJzdGhyZWYyNzEiIG5hbWU9InN0aHJlZjI3MSI+PC9hPjxhIGlkPSJzdGhyZWYyNzIiIG5hbWU9InN0aHJlZjI3MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW50YWJsZSI+Jm5ic3A7PC9wPgotPHRhYmxlIGNsYXNzPSJGb3JtYWwiIHRpdGxlPSIiIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3ImcnNxdW87cyBTY2hlbWEgR2VuZXJhdGlvbiBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJoc2lkZXMiIHJ1bGVzPSJncm91cHMiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIyNCUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzUiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNSI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDM1Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNSIgaGVhZGVycz0icjFjMS10MzUiPgotPHA+RERMIEdlbmVyYXRpb24gVHlwZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNlbGVjdCB0aGUgdHlwZSBvZiBEREwgZ2VuZXJhdGlvbjo8L3A+Ci08dWw+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+Tm9uZTwvc3Bhbj4gLS0gRG8gbm90IGdlbmVyYXRlIERETDsgbm8gc2NoZW1hIGlzIGdlbmVyYXRlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBUYWJsZXM8L3NwYW4+IC0tIENyZWF0ZSBEREwgZm9yIG5vbi1leGlzdGVudCB0YWJsZXM7IGxlYXZlIGV4aXN0aW5nIHRhYmxlcyB1bmNoYW5nZWQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Ecm9wIGFuZCBDcmVhdGUgVGFibGVzPC9zcGFuPiAtLSBDcmVhdGUgRERMIGZvciBhbGwgdGFibGVzOyBkcm9wIGFsbCBleGlzdGluZyB0YWJsZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNSByMWMzLXQzNSI+Ci08cD5Ob25lPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5PdXRwdXQgTW9kZTwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM1IHIxYzItdDM1Ij4KLTxwPlNlbGVjdCB0aGUgRERMIGdlbmVyYXRpb24gdGFyZ2V0OjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5Cb3RoPC9zcGFuPiAtLSBHZW5lcmF0ZSBTUUwgZmlsZXMgYW5kIGV4ZWN1dGUgdGhlbSBvbiB0aGUgZGF0YWJhc2UuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxzcGFuIGNsYXNzPSJib2xkIj5EYXRhYmFzZTwvc3Bhbj4gLS0gRXhlY3V0ZSBTUUwgb24gdGhlIGRhdGFiYXNlIG9ubHkgKGRvIG5vdCBnZW5lcmF0ZSBTUUwgZmlsZXMpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48c3BhbiBjbGFzcz0iYm9sZCI+U1FMIFNjcmlwdDwvc3Bhbj4gLS0gR2VuZXJhdGUgU1FMIGZpbGVzIG9ubHkgKGRvIG5vdCBleGVjdXRlIHRoZW0gb24gdGhlIGRhdGFiYXNlKS48L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM1IHIxYzMtdDM1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkRETCBHZW5lcmF0aW9uIExvY2F0aW9uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB3aGVyZSBFY2xpcHNlTGluayB3cml0ZXMgRERMIG91dHB1dC4gU3BlY2lmeSBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0byBhIGRpcmVjdG9yeSBpbiB3aGljaCB5b3UgaGF2ZSB3cml0ZSBhY2Nlc3MuIFRoZSBmaWxlIHNwZWNpZmljYXRpb24gbWF5IGJlIHJlbGF0aXZlIHRvIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBvciBhYnNvbHV0ZS4gSWYgaXQgZG9lcyBub3QgZW5kIGluIGEgZmlsZSBzZXBhcmF0b3IsIHRoZW4gRWNsaXBzZUxpbmsgYXBwZW5kcyBvbmUgdGhhdCBpcyB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM1IHIxYzMtdDM1Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzUiIGhlYWRlcnM9InIxYzEtdDM1Ij4KLTxwPkNyZWF0ZSBEREwgRmlsZSBOYW1lPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MzUgcjFjMi10MzUiPgotPHA+U3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSBEREwgZmlsZSB0aGF0IEVjbGlwc2VMaW5rIGdlbmVyYXRlcyB0aGF0IGNvbnRhaW5zIFNRTCBzdGF0ZW1lbnRzIGZvciBjcmVhdGluZyB0YWJsZXMgZm9yIEpQQSBlbnRpdGllcy4gU3BlY2lmeSBhIGZpbGUgbmFtZSB2YWxpZCBmb3IgeW91ciBvcGVyYXRpbmcgc3lzdGVtLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM1IHIxYzMtdDM1Ij4KLTxwPmNyZWF0ZURETC5qZGJjPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI2YzEtdDM1IiBoZWFkZXJzPSJyMWMxLXQzNSI+Ci08cD5Ecm9wIERETCBGaWxlIE5hbWU8L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQzNSByMWMyLXQzNSI+Ci08cD5TcGVjaWZ5IHRoZSBmaWxlIG5hbWUgb2YgdGhlIERETCBmaWxlIHRoYXQgRWNsaXBzZUxpbmsgZ2VuZXJhdGVzIHRoYXQgY29udGFpbnMgU1FMIHN0YXRlbWVudHMgZm9yIGRyb3BwaW5nIHRhYmxlcyBmb3IgSlBBIGVudGl0aWVzLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDM1IHIxYzMtdDM1Ij4KLTxwPmRyb3BEREwuamRiYzwvcD4KLTwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InRibGZvcm1hbCIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMGYwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+UHJvcGVydGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJQcm9wZXJ0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lBSEpERkYiIG5hbWU9IkNJQUhKREZGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDMiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9wZXJ0aWVzPC9oMT4KLTxwPlRoaXMgcGFnZSBlbmFibGVzIHlvdSB0byBhZGQgb3IgcmVtb3ZlIHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50cyBvZiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LjwvcD4KLTxwPlRvIGFkZCBhIHByb3BlcnR5LCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPiB0aGVuIGVudGVyIHRoZSBwcm9wZXJ0eSA8c3BhbiBjbGFzcz0iYm9sZCI+TmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5WYWx1ZTwvc3Bhbj4uPC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MyIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdiOTg0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI1Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U291cmNlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlNvdXJjZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJQUhDSkFIIiBuYW1lPSJDSUFIQ0pBSCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QzIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U291cmNlPC9oMT4KLTxwPlVzaW5nIHRoaXMgcGFnZSwgeW91IGNhbiBtYW51YWxseSBlZGl0IHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI8L2E+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDMiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNWJhODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByZWZlcmVuY2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREVJRUUiIG5hbWU9IkNBQ0RFSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5QcmVmZXJlbmNlczwvaDE+Ci08cD5UaGlzIHNlY3Rpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZyBwcmVmZXJlbmNlIHBhZ2VzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDI3Lmh0bSNDQUNGQkFFSCI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OGQ0NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAyNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IFZhbGlkYXRpb24gUHJlZmVyZW5jZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDRkJBRUgiIG5hbWU9IkNBQ0ZCQUVIIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IFZhbGlkYXRpb24gUHJlZmVyZW5jZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI3NSIgbmFtZT0ic3RocmVmMjc1Ij48L2E+PGEgaWQ9InN0aHJlZjI3NiIgbmFtZT0ic3RocmVmMjc2Ij48L2E+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SmF2YSBQZXJzaXN0ZW5jZTwvc3Bhbj4gb3B0aW9ucyBvbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb3BlcnRpZXM8L3NwYW4+IHBhZ2UgdG8gc2VsZWN0IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHRvIHVzZSB3aXRoIHRoZSBwcm9qZWN0LjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHMgcGFnZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyBwYWdlLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIzMiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MzciPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQzNyI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+PGEgaWQ9InN0aHJlZjI3NyIgbmFtZT0ic3RocmVmMjc3Ij48L2E+PGEgaWQ9InN0aHJlZjI3OCIgbmFtZT0ic3RocmVmMjc4Ij48L2E+PGEgaWQ9InN0aHJlZjI3OSIgbmFtZT0ic3RocmVmMjc5Ij48L2E+PGEgaWQ9InN0aHJlZjI4MCIgbmFtZT0ic3RocmVmMjgwIj48L2E+UGxhdGZvcm08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNyByMWMyLXQzNyI+U2VsZWN0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+TGlicmFyeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgYSBzcGVjaWZpYyBKUEEgbGlicmFyeSBjb25maWd1cmF0aW9uLgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbmFnZSBsaWJyYXJpZXM8L3NwYW4+IHRvIGNyZWF0ZSBvciB1cGRhdGUgYSB1c2VyIGxpYnJhcnkuPC9wPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gZG93bmxvYWQgYSBzcGVjaWZpYyBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24uPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+Jm5ic3A7Jm5ic3A7VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPlVzZXIgTGlicmFyeTwvc3Bhbj4gdG8gc2VsZWN0IGZyb20gdGhlIGF2YWlsYWJsZSB1c2VyLWRlZmluZWQgb3IgZG93bmxvYWRlZCBsaWJyYXJpZXMuCi08cD5JZiB5b3Ugc2VsZWN0IERpc2FibGUsIHlvdSBtdXN0IG1hbnVhbGx5IGluY2x1ZGUgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtJbmNsdWRlJm5ic3A7bGlicmFyaWVzJm5ic3A7d2l0aCZuYnNwO3RoaXMmbmJzcDthcHBsaWNhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDM3IHIxYzItdDM3Ij5TcGVjaWZ5IGlmIHRoZSBzZWxlY3RlZCBsaWJyYXJpZXMgYXJlIGluY2x1ZGVkIHdoZW4gZGVwbG95aW5nIHRoZSBhcHBsaWNhdGlvbi48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij48YSBpZD0ic3RocmVmMjgxIiBuYW1lPSJzdGhyZWYyODEiPjwvYT48YSBpZD0ic3RocmVmMjgyIiBuYW1lPSJzdGhyZWYyODIiPjwvYT48YSBpZD0ic3RocmVmMjgzIiBuYW1lPSJzdGhyZWYyODMiPjwvYT5Db25uZWN0aW9uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MzcgcjFjMi10MzciPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHVzZWQgdG8gbWFwIHRoZSBwZXJzaXN0ZW50IGVudGl0aWVzLgotPHVsPgotPGxpPgotPHA+VG8gY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQ29ubmVjdGlvbnM8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UbyByZWNvbm5lY3QgdG8gYW4gZXhpc3RpbmcgY29ubmVjdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtjYXRhbG9nJm5ic3A7ZnJvbSZuYnNwO2Nvbm5lY3Rpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQzNyByMWMyLXQzNyI+U2VsZWN0IGEgY2F0YWxvZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSBkZXJpdmVkIGZyb20gdGhlIGNvbm5lY3Rpb24gaW5mb3JtYXRpb24uIFVzZSB0aGlzIG9wdGlvbiBpZiB0aGUgZGVmYXVsdCBjYXRhbG9nIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij4mbmJzcDsmbmJzcDtPdmVycmlkZSZuYnNwO2RlZmF1bHQmbmJzcDtzY2hlbWEmbmJzcDtmcm9tJm5ic3A7Y29ubmVjdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDM3IHIxYzItdDM3Ij5TZWxlY3QgYSBzY2hlbWEgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmUgZGVyaXZlZCBmcm9tIHRoZSBjb25uZWN0aW9uIGluZm9ybWF0aW9uLiBVc2UgdGhpcyBvcHRpb24gaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIGluY29ycmVjdCBvciBjYW5ub3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHVzZSB0aGlzIG9wdGlvbiB3aGVuIHRoZSBkZXBsb3ltZW50IGxvZ2luIGRpZmZlcnMgZnJvbSB0aGUgZGVzaWduLXRpbWUgbG9naW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI5YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+UGVyc2lzdGVudCBDbGFzcyBNYW5hZ2VtZW50PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjljMS10MzcgcjFjMi10MzciPlNwZWNpZnkgaWYgRGFsaSB3aWxsIDxzcGFuIGNsYXNzPSJib2xkIj5kaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBhdXRvbWF0aWNhbGx5PC9zcGFuPiwgb3IgaWYgdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5hbm5vdGF0ZWQgY2xhc3NlcyBtdXN0IGJlIGxpc3RlZCBpbiB0aGUgcGVyc2lzdGVuY2UueG1sPC9zcGFuPiBmaWxlLgotPHA+PHNwYW4gY2xhc3M9ImJvbGQiPk5vdGU8L3NwYW4+OiBUbyBpbnN1cmUgYXBwbGljYXRpb24gcG9ydGFiaWxpdHksIHlvdSBzaG91bGQgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPjxhIGlkPSJzdGhyZWYyODQiIG5hbWU9InN0aHJlZjI4NCI+PC9hPjxhIGlkPSJzdGhyZWYyODUiIG5hbWU9InN0aHJlZjI4NSI+PC9hPkNhbm9uaWNhbCBNZXRhbW9kZWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTBjMS10MzcgcjFjMi10MzciPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibGluZm9ybWFsIiAtLT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzcxYjI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjguaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5EaWFsb2dzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ4WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRpYWxvZ3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNHRUpEQSIgbmFtZT0iQ0FDR0VKREEiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRpYWxvZ3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZSBwYWdlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0NHRUhDIj5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9zZWxlY3RfY2FzY2FkZV9kaWFsb2cuaHRtI0NJQUZER0lKIj5TZWxlY3QgQ2FzY2FkZSBkaWFsb2c8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZl9lY2xpcHNlbGlua19tYXBwaW5nX2ZpbGUuaHRtI0NJQUVERUpGIj5OZXcgRWNsaXBzZUxpbmsgTWFwcGluZyBGaWxlIGRpYWxvZzwvYT48L3A+Ci08L2xpPgotPC91bD4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+PC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDI5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjY2Njc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMjkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDhaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWRpdCBKb2luIENvbHVtbnMgRGlhbG9nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDQ0dFSEMiIG5hbWU9IkNBQ0NHRUhDIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FZGl0IEpvaW4gQ29sdW1ucyBEaWFsb2c8L2gxPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cgdG8gY3JlYXRlIG9yIG1vZGlmeSB0aGUgam9pbiB0YWJsZXMgYW5kIGNvbHVtbnMgaW4gcmVsYXRpb25zaGlwIG1hcHBpbmdzLjwvcD4KLTxwPlRoaXMgdGFibGUgbGlzdHMgdGhlIHByb3BlcnRpZXMgYXZhaWxhYmxlIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+Sm9pbiBDb2x1bW5zPC9zcGFuPiBkaWFsb2cuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBKb2luIENvbHVtbnMgZGlhbG9nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpvaW4gQ29sdW1ucyBkaWFsb2cuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjMyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQzOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDM4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MzgiIGhlYWRlcnM9InIxYzEtdDM4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MzggcjFjMi10MzgiPk5hbWUgb2YgdGhlIGpvaW50IHRhYmxlIGNvbHVtbiB0aGF0IGNvbnRhaW5zIHRoZSBmb3JlaWduIGtleSBjb2x1bW4uPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM4IiBoZWFkZXJzPSJyMWMxLXQzOCI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM4IHIxYzItdDM4Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSBjb2x1bW4gdGhhdCBjb250YWlucyB0aGUgZm9yZWlnbiBrZXkgcmVmZXJlbmNlIGZvciB0aGUgZW50aXR5IHJlbGF0aW9uc2hpcC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT48YnIgLz4KLTxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI3OTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JY29ucyBhbmQgYnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyBhbmQgYnV0dG9ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0RIQ0lBIiBuYW1lPSJDQUNESENJQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnMgYW5kIGJ1dHRvbnM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGluZm9ybWF0aW9uIG9uIGVhY2ggb2YgdGhlIGljb25zIGFuZCBidXR0b25zIHVzZWQgaW4gdGhlIERhbGkgT1IgTWFwcGluZyBUb29sLjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDR0VBQ0ciPkljb25zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzIuaHRtI0NBQ0RKQ0VJIj5CdXR0b25zPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzYwZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5JY29uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJJY29ucyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNBQ0dFQUNHIiBuYW1lPSJDQUNHRUFDRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SWNvbnM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBpY29ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgaWNvbnMgdXNlZCBpbiB0aGUgRGFsaSBwbHVnLWluLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIGljb25zIHVzZWQgaW4gdGhlIERhbGkgcGx1Zy1pbi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjMlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDQxIj5JY29uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ0MSI+RGVzY3JpcHRpb248L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRlbnRpdHkucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9lbWJlZGRhYmxlZW50aXR5bWFwcGluZy5wbmciIGFsdD0iRW1iZWRkYWJsZSBlbnRpdHkgaWNvbiIgdGl0bGU9IkVtYmVkZGFibGUgZW50aXR5IGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT4gZW50aXR5PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYXBwZWRzdXBlcmNsYXNzLnBuZyIgYWx0PSJNYXBwZWQgc3VwZXJjbGFzcyBpY29uIiB0aXRsZT0iTWFwcGVkIHN1cGVyY2xhc3MgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2Jhc2ljbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10NDEgcjFjMi10NDEiPkJhc2ljIGNvbGxlY3Rpb24gbWFwcGluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcHBpbmcucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ0MSByMWMyLXQ0MSI+QmFzaWMgbWFwIG1hcHBpbmc8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkaWRtYXBwaW5nLnBuZyIgYWx0PSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIHRpdGxlPSJFbWJlZGRlZCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjhjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDExLmh0bSNCQUJDQkhERiI+RW1iZWRkZWQgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjljMS10NDEiIGhlYWRlcnM9InIxYzEtdDQxIj48aW1nIHNyYz0iaW1nL25ld19pY29uX2VtYmVkZGVkbWFwcGluZy5wbmciIGFsdD0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiB0aXRsZT0iRW1iZWRkZWQgSUQgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI5YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxMi5odG0jQ0lIRElBRUUiPkVtYmVkZGVkIElEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25faWRtYXBwaW5nLnBuZyIgYWx0PSJJRCBtYXBwaW5nIGljb24iIHRpdGxlPSJJRCBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEwYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxMy5odG0jQkFCR0NCSEciPklEIG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxMWMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fbWFueXRvbWFueW1hcHBpbmcucG5nIiBhbHQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJNYW55LXRvLW1hbnkgbWFwcGluZyBpY29uIiAvPjxiciAvPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIxMWMxLXQ0MSByMWMyLXQ0MSI+PGEgaHJlZj0idGFza3MwMTQuaHRtI0JBQkVJRUdEIj5NYW55LXRvLW1hbnkgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEyYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9tYW55dG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJNYW55LXRvLW9uZSBtYXBwaW5nIGljb24uIiB0aXRsZT0iTWFueS10by1vbmUgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTJjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiI+TWFueS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjEzYzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9uZXdfaWNvbl9vbmV0b21hbnltYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIHRpdGxlPSJPbmUtdG8tbWFueSBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjEzYzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiPk9uZS10by1tYW55IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fb25ldG9vbmVtYXBwaW5nLnBuZyIgYWx0PSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJPbmUtdG8tb25lIG1hcHBpbmcgaWNvbi4iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE0YzEtdDQxIHIxYzItdDQxIj48YSBocmVmPSJ0YXNrczAxNy5odG0jQkFCRkhCQ0oiPk9uZS10by1vbmUgbWFwcGluZzwvYT48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjE1YzEtdDQxIiBoZWFkZXJzPSJyMWMxLXQ0MSI+PGltZyBzcmM9ImltZy9pY29uX2Jhc2ljbWFwbWFwcGluZ3MucG5nIiBhbHQ9IkJhc2ljIG1hcHBpbmcgaWNvbiIgdGl0bGU9IkJhc2ljIG1hcHBpbmcgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTVjMS10NDEgcjFjMi10NDEiPlRyYW5zZm9ybWF0aW9uIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxNmMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdHJhbnNpZW50bWFwcGluZy5wbmciIGFsdD0iVHJhbnNpZW50IG1hcHBpbmcgaWNvbi4iIHRpdGxlPSJUcmFuc2llbnQgbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMTZjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxN2MxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvaWNvbl9iYXNpY21hcG1hcHBpbmdzLnBuZyIgYWx0PSJCYXNpYyBtYXBwaW5nIGljb24iIHRpdGxlPSJCYXNpYyBtYXBwaW5nIGljb24iIC8+PGJyIC8+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjE3YzEtdDQxIHIxYzItdDQxIj5WYXJpYWJsZSBvbmUtdG8tb25lIG1hcHBpbmdzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIxOGMxLXQ0MSIgaGVhZGVycz0icjFjMS10NDEiPjxpbWcgc3JjPSJpbWcvbmV3X2ljb25fdmVyc2lvbm1hcHBpbmcucG5nIiBhbHQ9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgdGl0bGU9IlZlcnNpb24gbWFwcGluZyBpY29uLiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMThjMS10NDEgcjFjMi10NDEiPjxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDMwLmh0bSNDQUNESENJQSI+SWNvbnMgYW5kIGJ1dHRvbnM8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3JlZmVyZW5jZTAzMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkYjU0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QnV0dG9uczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJCdXR0b25zIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0FDREpDRUkiIG5hbWU9IkNBQ0RKQ0VJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5CdXR0b25zPC9oMT4KLTxwPlRoZSBmb2xsb3dpbmcgYnV0dG9ucyBhcmUgdXNlZCB0aHJvdWdob3V0IHRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbC48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgYnV0dG9ucyB1c2VkIGluIHRoZSBEYWxpIHBsdWctaW4uIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQ0MiI+SWNvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10NDIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ0MiIgaGVhZGVycz0icjFjMS10NDIiPjxpbWcgc3JjPSJpbWcvbmV3X2pwYV9wZXJzcGVjdGl2ZV9idXR0b24ucG5nIiBhbHQ9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgdGl0bGU9IlRoZSBKUEEgUGVyc3BlY3RpdmUgaWNvbiIgLz48YnIgLz48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ0MiByMWMyLXQ0MiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMzAuaHRtI0NBQ0RIQ0lBIj5JY29ucyBhbmQgYnV0dG9uczwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvcmVmZXJlbmNlMDMzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzMuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTcwNmI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9yZWZlcmVuY2UwMzMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5EYWxpIERldmVsb3BlciBEb2N1bWVudGF0aW9uPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDQUNCQkRJQiIgbmFtZT0iQ0FDQkJESUIiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkRhbGkgRGV2ZWxvcGVyIERvY3VtZW50YXRpb248L2gxPgotPHA+PGEgaWQ9InN0aHJlZjI4OCIgbmFtZT0ic3RocmVmMjg4Ij48L2E+PGEgaWQ9InN0aHJlZjI4OSIgbmFtZT0ic3RocmVmMjg5Ij48L2E+PGEgaWQ9InN0aHJlZjI5MCIgbmFtZT0ic3RocmVmMjkwIj48L2E+QWRkaXRpb25hbCBEYWxpIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIG9ubGluZSBhdDo8L3A+Ci08cD48Y29kZT48YSBocmVmPSJodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9pbmRleC5waHAvRGFsaV9EZXZlbG9wZXJfRG9jdW1lbnRhdGlvbiI+aHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvaW5kZXgucGhwL0RhbGlfRGV2ZWxvcGVyX0RvY3VtZW50YXRpb248L2E+PC9jb2RlPjwvcD4KLTxwPlRoaXMgZGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQ6PC9wPgotPHVsPgotPGxpPgotPHA+RGFsaSBhcmNoaXRlY3R1cmU8L3A+Ci08L2xpPgotPGxpPgotPHA+UGx1Z2lucyB0aGF0IGNvbXByaXNlIHRoZSBEYWxpIEpQQSBFY2xpcHNlIGZlYXR1cmU8L3A+Ci08L2xpPgotPGxpPgotPHA+RXh0ZW5zaW9uIHBvaW50czwvcD4KLTwvbGk+Ci08L3VsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOTg0MmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUNBSSIgbmFtZT0iQkFCSElDQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+Ci08aDE+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY3IiBuYW1lPSJzdGhyZWY2NyI+PC9hPjxhIGlkPSJzdGhyZWY2OCIgbmFtZT0ic3RocmVmNjgiPjwvYT48YSBpZD0ic3RocmVmNjkiIG5hbWU9InN0aHJlZjY5Ij48L2E+WW91IGNhbiBtYWtlIGEgSmF2YSBjbGFzcyBpbnRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBlcnNpc3RlbnQgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIj5FbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDA3Lmh0bSNCQUJGRUlDRSI+RW1iZWRkYWJsZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDguaHRtI0JBQkRBR0NJIj5NYXBwZWQgc3VwZXJjbGFzczwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPiA8IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfYWRkaXRvbmFsX3RhYmxlcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkNTg0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19hZGRpdG9uYWxfdGFibGVzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIR0JJRUkiIG5hbWU9IkNJSEdCSUVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9oMT4KLTxwPkFkZCBhIHNlY29uZGFyeSB0YWJsZSBhbm5vdGF0aW9uIHRvIGFuIGVudGl0eSBpZiBpdHMgZGF0YSBpcyBzcGxpdCBhY3Jvc3MgbW9yZSB0aGFuIG9uZSB0YWJsZS48L3A+Ci08cD5UbyBhZGQgYSBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIGVudGl0eSw8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGVudGl0eSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5JbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+U2Vjb25kYXJ5IFRhYmxlczwvc3Bhbj4gaW5mb3JtYXRpb24uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmOTIiIG5hbWU9InN0aHJlZjkyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3BlY2lmeWluZyBTZWNvbmRhcnkgVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy9zZWNvbmRhcnlfdGFibGVzLnBuZyIgYWx0PSJTZWNvbmRhcnkgVGFibGVzIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiB0aXRsZT0iU2Vjb25kYXJ5IFRhYmxlcyBhcmVhIG9uIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIHRhYmxlIHdpdGggdGhlIGVudGl0eS4gVGhlIEVkaXQgU2Vjb25kYXJ5IFRhYmxlIGRpYWxvZyBhcHBlYXJzPC9wPgotPC9saT4KLTxsaT4KLTxwPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk5hbWU8L3NwYW4+LCA8c3BhbiBjbGFzcz0iYm9sZCI+Q2F0YWxvZzwvc3Bhbj4sIGFuZCA8c3BhbiBjbGFzcz0iYm9sZCI+U2NoZW1hPC9zcGFuPiBvZiB0aGUgYWRkaXRpb25hbCB0YWJsZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgZW50aXR5LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdGhlIGVudGl0eTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AU2Vjb25kYXJ5VGFibGUobmFtZT0iTkFNRSIsIGNhdGFsb2cgPSAiQ0FUQUxPRyIsIHNjaGVtYSA9ICJTQ0hFTUEiKQotCi08L3ByZT4KLTxwPlRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByaW1hcnkga2V5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPkVuYWJsZSB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJ3cml0ZSBkZWZhdWx0PC9zcGFuPiBvcHRpb24sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gdG8gc3BlY2lmeSBhIG5ldyBwcmltYXJ5IGtleSBqb2luIGNvbHVtbi4gVGhlIENyZWF0ZSBOZXcgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4gYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+TmFtZTwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJib2xkIj5SZWZlcmVuY2VkIGNvbHVtbiBuYW1lPC9zcGFuPiwgPHNwYW4gY2xhc3M9ImJvbGQiPlRhYmxlPC9zcGFuPiwgYW5kIDxzcGFuIGNsYXNzPSJib2xkIj5Db2x1bW4gZGVmaW5pdGlvbjwvc3Bhbj4gb2YgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgZW50aXR5LjwvcD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRoZSBlbnRpdHk6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQFNlY29uZGFyeVRhYmxlKG5hbWU9Ik5BTUUiLCBjYXRhbG9nID0gIkNBVEFMT0ciLCBzY2hlbWEgPSAiU0NIRU1BIiwgcGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iaWQiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9ICJpZCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPSJOQU1FIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiUkVGRVJFTkNFRCBDT0xVTU4gTkFNRSIsIGNvbHVtbkRlZmluaXRpb24gPSAiQ09MVU1OIERFRklOSVRJT04iKX0pCi0KLTwvcHJlPjwvbGk+Ci08L29sPgotPGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfanBhX2VudGl0eS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfanBhX2VudGl0eS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2Y3ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGEgSlBBIEVudGl0eSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZCSkJHIiBuYW1lPSJCQUJGQkpCRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjQwIiBuYW1lPSJzdGhyZWY0MCI+PC9hPkNyZWF0aW5nIGEgSlBBIEVudGl0eTwvaDE+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGEgSlBBIGVudGl0eTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IHRoZSBKUEEgcHJvamVjdCBhbmQgdGhlbiA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0MSIgbmFtZT0ic3RocmVmNDEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3RpbmcgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgV2l6YXJkPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfYV93aXphcmRfZW50aXR5LnBuZyIgYWx0PSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEVudGl0eSBzZWxlY3RlZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpQQSAmZ3Q7IEVudGl0eTwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjQyIiBuYW1lPSJzdGhyZWY0MiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWY0MyIgbmFtZT0ic3RocmVmNDMiPjwvYT5UaGUgRW50aXR5IENsYXNzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5wbmciIGFsdD0iVGhlIEVudGl0eSBDbGFzcyBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgRW50aXR5IHdpemFyZC4iIHRpdGxlPSJUaGUgRW50aXR5IENsYXNzIHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBFbnRpdHkgd2l6YXJkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08cD5Db21wbGV0ZSB0aGlzIHBhZ2UgYXMgZm9sbG93czo8L3A+Ci08dWw+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIEpQQSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+UHJvamVjdDwvc3Bhbj4gZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U291cmNlIEZvbGRlcjwvc3Bhbj4gZmllbGQsIHNlbGVjdCwgb3IgZW50ZXIsIHRoZSBsb2NhdGlvbiBvZiB0aGUgSlBBIHByb2plY3QncyA8Y29kZT5zcmM8L2NvZGU+IGZvbGRlci48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0LCBvciBlbnRlciwgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHBhY2thZ2UgZm9yIHRoaXMgZW50aXR5IGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+SmF2YSBQYWNrYWdlPC9zcGFuPiBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5DbGFzcyBuYW1lPC9zcGFuPiBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciwgb3Igc2VsZWN0IGEgc3VwZXJjbGFzcy48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBjb21wbGV0ZSB0aGUgSW5oZXJpdGFuY2Ugc2VjdGlvbiBhcyBmb2xsb3dzICh0aGVzZSBwcm9wZXJ0aWVzIGFyZSBvcHRpb25hbCk6PC9wPgotPHVsPgotPGxpPgotPHA+QWNjZXB0IHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RW50aXR5PC9zcGFuPiBvcHRpb24gKHRoZSBkZWZhdWx0KSB0byBjcmVhdGUgYSBKYXZhIGNsYXNzIHdpdGggdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IG9wdGlvbi48L3A+Ci08L2xpPgotPGxpPgotPHA+QWx0ZXJuYXRpdmVseSwgc2VsZWN0IDxhIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSI+TWFwcGVkIHN1cGVyY2xhc3M8L2E+IChpZiB5b3UgZGVmaW5lZCBhIHN1cGVyIGNsYXNzKS48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5Jbmhlcml0YW5jZTwvc3Bhbj4gYW5kIHRoZW4gc2VsZWN0IG9uZSBvZiB0aGUgSlNSIDIyMCBpbmhlcml0YW5jZSBtYXBwaW5nIHN0cmF0ZWdpZXMgKFNJTkdMRV9UQUJMRSwgVEFCTEVfUEVSX0NMQVNTLCBKT0lORUQpLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCB0byBlbnRpdHkgbWFwcGluZ3MgaW4gWE1MPC9zcGFuPiB0byBjcmVhdGUgWE1MIG1hcHBpbmdzIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LCByYXRoZXIgdGhhbiBhbm5vdGF0aW9ucy48L3A+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPiB0byBwcm9jZWVkIHRvIHRoZSA8YSBocmVmPSJyZWZfRW50aXR5UHJvcGVydGllc1BhZ2UuaHRtI0NJQURFQ0lBIj5FbnRpdHkgUHJvcGVydGllcyBwYWdlPC9hPiB3aGVyZSB5b3UgZGVmaW5lIHRoZSBwZXJzaXN0ZW50IGZpZWxkcyBmb3IgdGhlIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY0NCIgbmFtZT0ic3RocmVmNDQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmNDUiIG5hbWU9InN0aHJlZjQ1Ij48L2E+VGhlIEVudGl0eSBQcm9wZXJ0aWVzIFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL2NyZWF0ZV9qcGFfZmllbGRzLnBuZyIgYWx0PSJUaGUgRW50aXR5IFByb3BlcnRpZXMgcGFnZSBvZiB0aGUgQ3JlYXRlIEpQQSBFbnRpdHkgd2l6YXJkLiIgdGl0bGU9IlRoZSBFbnRpdHkgUHJvcGVydGllcyBwYWdlIG9mIHRoZSBDcmVhdGUgSlBBIEVudGl0eSB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkFsdGVybmF0aXZlbHksIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+IHRvIGNvbXBsZXRlIHRoZSBlbnRpdHkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSBwYWdlIGFzIGZvbGxvd3M6PC9wPgotPG9sPgotPGxpPgotPHA+SWYgbmVlZGVkLCBlbnRlciBhIG5ldyBuYW1lIGZvciB0aGUgZW50aXR5LiBEb2luZyBzbyByZXN1bHRzIGluIGFkZGluZyBhIDxjb2RlPm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+QEVudGl0eTwvY29kZT4gbm90YXRpb24gKDxjb2RlPkBFbnRpdHkobmFtZT0iRW50aXR5TmFtZSIpPC9jb2RlPikuPC9wPgotPC9saT4KLTxsaT4KLTxwPkFjY2VwdCA8c3BhbiBjbGFzcz0iYm9sZCI+VXNlIGRlZmF1bHQ8L3NwYW4+ICh0aGUgZGVmYXVsdCBzZXR0aW5nKSB0byB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBuYW1lIG9mIHRoZSBtYXBwZWQgdGFibGUuIEVudGVyaW5nIGEgZGlmZmVyZW50IG5hbWUgcmVzdWx0cyBpbiBhZGRpbmcgdGhlIDxjb2RlPkBUYWJsZTwvY29kZT4gbm90YXRpb24gd2l0aCBpdHMgPGNvZGU+bmFtZTwvY29kZT4gYXR0cmlidXRlIGRlZmluZWQgYXMgdGhlIG5ldyB0YWJsZSAoPGNvZGU+QFRhYmxlKG5hbWU9IlRhYmxlTmFtZSIpPC9jb2RlPikuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgRW50aXR5IE5hbWUtcmVsYXRlZCBvcHRpb25zIGFyZSBub3QgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3RlZCA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPiBvbiB0aGUgPGEgaHJlZj0icmVmX0VudGl0eUNsYXNzUGFnZS5odG0jQ0lBRkVJR0YiPkVudGl0eSBDbGFzcyBwYWdlPC9hPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkFkZCBwZXJzaXN0ZW5jZSBmaWVsZHMgdG8gdGhlIGVudGl0eSBieSBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi4gVGhlIEVudGl0eSBGaWVsZHMgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNDYiIG5hbWU9InN0aHJlZjQ2Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIEVudGl0eSBGaWVsZHMgRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9qcGFfd2l6YXJkX2NyZWF0ZV9maWVsZHMucG5nIiBhbHQ9IlRoZSBFbnRpdHkgRmllbGRzIGRpYWxvZy4iIHRpdGxlPSJUaGUgRW50aXR5IEZpZWxkcyBkaWFsb2cuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+U2VsZWN0IGEgcGVyc2lzdGVuY2UgdHlwZSBmcm9tIHRoZSBUeXBlIGxpc3QuIFlvdSBjYW4gcmV0cmlldmUgYWRkaXRpb25hbCB0eXBlcyB1c2luZyB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkJyb3dzZTwvc3Bhbj4gZnVuY3Rpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBmaWVsZCBuYW1lIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uIFJlcGVhdCB0aGlzIHByb2NlZHVyZSBmb3IgZWFjaCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+SWYgbmVlZGVkLCBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPktleTwvc3Bhbj4gdG8gZGVzaWduYXRlIHRoZSBmaWVsZCBhcyBhIHByaW1hcnkga2V5LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgZWl0aGVyIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+RmllbGQtYmFzZWQ8L3NwYW4+IGFjY2VzcyB0eXBlICh0aGUgZGVmYXVsdCkgb3IgPHNwYW4gY2xhc3M9ImJvbGQiPlByb3BlcnR5LWJhc2VkPC9zcGFuPiBhY2Nlc3MgdHlwZS48L3A+Ci08L2xpPgotPC9vbD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gRWNsaXBzZSBhZGRzIHRoZSBlbnRpdHkgdG8geW91ciBwcm9qZWN0LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9jcmVhdGVfanBhX2VudGl0eV93aXphcmQuaHRtI0NJQUdHR0RGIj5DcmVhdGUgSlBBIEVudGl0eSB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3ZTFlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDFaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhIRUpDSiIgbmFtZT0iQ0lISEVKQ0oiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYyNiIgbmFtZT0ic3RocmVmMjYiPjwvYT48YSBpZD0ic3RocmVmMjciIG5hbWU9InN0aHJlZjI3Ij48L2E+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGNyZWF0ZSBhIG5ldyBKUEEgcHJvamVjdC48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3Jlciwgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5GaWxlICZndDsgTmV3ICZndDsgUHJvamVjdDwvc3Bhbj4uIFRoZSBTZWxlY3QgYSB3aXphcmQgZGlhbG9nIGFwcGVhcnMuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgSlBBIHBlcnNwZWN0aXZlIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IEpQQSBQcm9qZWN0PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyOCIgbmFtZT0ic3RocmVmMjgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMjkiIG5hbWU9InN0aHJlZjI5Ij48L2E+U2VsZWN0aW5nIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9hX3dpemFyZF9qcGFfcHJvamVjdC5wbmciIGFsdD0iVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgd2l0aCBKUEEgcHJvamVjdCBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgU2VsZWN0IGEgV2l6YXJkIGRpYWxvZyB3aXRoIEpQQSBwcm9qZWN0IHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SlBBIFByb2plY3Q8L3NwYW4+IGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3QuaHRtI0NBQ0JKQUdDIj5OZXcgSlBBIFByb2plY3QgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMCIgbmFtZT0ic3RocmVmMzAiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMzEiIG5hbWU9InN0aHJlZjMxIj48L2E+VGhlIEpQQSBQcm9qZWN0IFBhZ2U8L3A+Ci08aW1nIHNyYz0iaW1nL25ld19qcGFfcHJvamVjdF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIFByb2plY3QgcGFnZSBvZiB0aGUgQ3JlYXRlIGEgSlBBIFByb2plY3Qgd2l6YXJkLiIgdGl0bGU9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiPk5ldyBKUEEgUHJvamVjdCBwYWdlPC9hPiB0byBzcGVjaWZ5IHRoZSBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uLCB0YXJnZXQgcnVudGltZSwgYW5kIHByZS1kZWZpbmVkIGNvbmZpZ3VyYXRpb24uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1UaGUgVGFyZ2V0IFJ1bnRpbWUgaXMgbm90IHJlcXVpcmVkIGZvciBKYXZhIFNFIGRldmVsb3BtZW50LjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5OZXh0PC9zcGFuPi4gVGhlIEphdmEgc291cmNlIHBhZ2UgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzMiIgbmFtZT0ic3RocmVmMzIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgSmF2YSBTb3VyY2UgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvamF2YV9lZGl0b3JfYWRkcmVzcy5wbmciIGFsdD0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBGYWNldCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZCBGb2xkZXI8L3NwYW4+IHRvIGFkZCBleGlzdGluZyBKYXZhIHNvdXJjZSBmaWxlcyB0byB0aGUgcHJvamVjdC48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMzMiIG5hbWU9InN0aHJlZjMzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM0IiBuYW1lPSJzdGhyZWYzNCI+PC9hPlRoZSBKUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIHRpdGxlPSJUaGUgSlBBIEZhY2V0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1JZiB0aGUgc2VydmVyIHJ1bnRpbWUgZG9lcyBub3QgcHJvdmlkZSBhIEpQQSBpbXBsZW1lbnRhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBzZWxlY3QgYSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeS4KLTxwPlRvIGluc3VyZSB0aGUgcG9ydGFiaWxpdHkgb2YgeW91ciBhcHBsaWNhdGlvbiwgeW91IG11c3QgZXhwbGljaXRseSBsaXN0IHRoZSBtYW5hZ2VkIHBlcnNpc3RlbmNlIGNsYXNzZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuIElmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgRUpCIDMuMCwgdGhlIHBlcnNpc3RlbnQgY2xhc3NlcyB3aWxsIGJlIGRpc2NvdmVyZWQgYXV0b21hdGljYWxseS48L3A+Ci08cD5EZXBlbmRpbmcgb24geW91ciBKUEEgaW1wbGVtZW50YXRpb24gKGZvciBleGFtcGxlLCBHZW5lcmljIG9yIEVjbGlwc2VMaW5rKSwgZGlmZmVyZW50IG9wdGlvbnMgbWF5IGJlIGF2YWlsYWJsZSB3aGVuIGNyZWF0aW5nIEpQQSBwcm9qZWN0cy48L3A+Ci08L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi4gWW91IHNob3VsZCBub3cgb3BlbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjllZTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2dlbmVyYXRlX2NsYXNzZXNfZnJvbV9zY2hlbWEuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIEpBWEIgQ2xhc3NlcyBmcm9tIGEgU2NoZW1hPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxOTozMzozWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhDQkhKRCIgbmFtZT0iQ0lIQ0JISkQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWE8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE5NyIgbmFtZT0ic3RocmVmMTk3Ij48L2E+PGEgaWQ9InN0aHJlZjE5OCIgbmFtZT0ic3RocmVmMTk4Ij48L2E+PGEgaWQ9InN0aHJlZjE5OSIgbmFtZT0ic3RocmVmMTk5Ij48L2E+VXNlIHRoZSBHZW5lcmF0ZSBDbGFzc2VzIGZyb20gWFNEIGRpYWxvZyB0byBnZW5lcmF0ZSBKQVhCIGNsYXNzZXMgZnJvbSBhbiBYTUwgc2NoZW1hICgmbmJzcDsueHNkKS48YSBpZD0ic3RocmVmMjAwIiBuYW1lPSJzdGhyZWYyMDAiPjwvYT48L3A+Ci08b2w+Ci08bGk+Ci08cD5Gcm9tIHRoZSBOYXZpZ2F0b3Igb3IgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQtY2xpY2sgYSBzY2hlbWEgKCZuYnNwOy54c2QgZmlsZSkgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJhdGUgJmd0OyBKQVhCIENsYXNzZXM8L3NwYW4+LiBUaGUgR2VuZXJhdGUgQ2xhc3NlcyBmcm9tIFNjaGVtYSBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYyMDEiIG5hbWU9InN0aHJlZjIwMSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPjxhIGlkPSJzdGhyZWYyMDIiIG5hbWU9InN0aHJlZjIwMiI+PC9hPkNvbmZpZ3VyZSBKQVhCIENsYXNzIEdlbmVyYXRpb24gZGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLnBuZyIgYWx0PSJHZW5lcmF0ZSBjbGFzc2VzIGZyb20gc2NoZW1hIGRpYWxvZy4iIHRpdGxlPSJHZW5lcmF0ZSBjbGFzc2VzIGZyb20gc2NoZW1hIGRpYWxvZy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgSkFYQiBzZXR0aW5ncyBpbmZvcm1hdGlvbiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uPC9wPgotPC9saT4KLTwvb2w+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2NvbmZpZ3VyZV9qYXhiX2NsYXNzX2dlbmVyYXRpb25fZGlhbG9nLmh0bSNDQUNISEhKQSI+Q29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2c8L2E+Ci08cD4mbmJzcDs8L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfZ2VuZXJhdGluZ19zY2hlbWFfZnJvbV9jbGFzc2VzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3Y2YxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5HZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA2LTA0VDE2OjE4OjEyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkdlbmVyYXRpbmcgU2NoZW1hIGZyb20gQ2xhc3NlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSEhCSkNKIiBuYW1lPSJDSUhIQkpDSiI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+R2VuZXJhdGluZyBTY2hlbWEgZnJvbSBDbGFzc2VzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxODkiIG5hbWU9InN0aHJlZjE4OSI+PC9hPjxhIGlkPSJzdGhyZWYxOTAiIG5hbWU9InN0aHJlZjE5MCI+PC9hPjxhIGlkPSJzdGhyZWYxOTEiIG5hbWU9InN0aHJlZjE5MSI+PC9hPlVzZSB0aGUgR2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIHdpemFyZCBjcmVhdGUgYW4gWE1MIHNjaGVtYSAoJm5ic3A7LnhzZCkgZm9yIGEgc2V0IG9mIEpBWEIgbWFwcGVkIGNsYXNzZXMuPGEgaWQ9InN0aHJlZjE5MiIgbmFtZT0ic3RocmVmMTkyIj48L2E+PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIHdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZWFsc28iPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlQWxzbyBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPlRpcDo8L3A+Ci1Zb3UgY2FuIGFsc28gYWNjZXNzIHRoZSBHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgd2l6YXJkIGZyb20gYSBzcGVjaWZpYyBwcm9qZWN0IG9yIHBhY2thZ2UuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTkzIiBuYW1lPSJzdGhyZWYxOTMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMTk0IiBuYW1lPSJzdGhyZWYxOTQiPjwvYT5TZWxlY3RpbmcgdGhlIFNjaGVtYSBGcm9tIEpBWEIgQ2xhc3NlcyB3aXphcmQ8L3A+Ci08aW1nIHNyYz0iaW1nL3NlbGVjdF9qYXhiX3NjaGVtYV93aXphcmQucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggU2NoZW1hIEZyb20gSkFYQiBDbGFzc2VzIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggU2NoZW1hIEZyb20gSkFYQiBDbGFzc2VzIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+SkFYQiAmZ3Q7IFNjaGVtYSBmcm9tIEpBWEIgQ2xhc3Nlczwvc3Bhbj4gYW5kIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LiBUaGUgPGEgaHJlZj0icmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0jQ0FDSEJFR0oiPkdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXM8L2E+IHBhZ2Ugb2YgdGhlIDxhIGhyZWY9InJlZl9qYXhiX3NjaGVtYV93aXphcmQuaHRtI0NBQ0dBREZIIj5HZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkPC9hPiBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5NSIgbmFtZT0ic3RocmVmMTk1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE5NiIgbmFtZT0ic3RocmVmMTk2Ij48L2E+VGhlIEdlbmVyYXRlIFNjaGVtYSBmcm9tIENsYXNzZXMgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvamF4Yl9zY2htZWFfZ2VuZXJhdGlvbl9kaWFsb2cucG5nIiBhbHQ9IlRoZSBKUEEgUHJvamVjdCBwYWdlIG9mIHRoZSBDcmVhdGUgYSBKUEEgUHJvamVjdCB3aXphcmQuIiB0aXRsZT0iVGhlIEpQQSBQcm9qZWN0IHBhZ2Ugb2YgdGhlIENyZWF0ZSBhIEpQQSBQcm9qZWN0IHdpemFyZC4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIHByb2plY3QsIHBhY2thZ2UsIG9yIGNsYXNzZXMgZnJvbSB3aGljaCB0byBnZW5lcmF0ZSB0aGUgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfamF4Yl9zY2hlbWFfd2l6YXJkLmh0bSNDQUNHQURGSCI+R2VuZXJhdGUgU2NoZW1hIGZyb20gSkFYQiBDbGFzc2VzIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX2luaGVyaXRhbmNlLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNGQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza19pbmhlcml0YW5jZS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSENDQ0pEIiBuYW1lPSJDSUhDQ0NKRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjkzIiBuYW1lPSJzdGhyZWY5MyI+PC9hPjxhIGlkPSJzdGhyZWY5NCIgbmFtZT0ic3RocmVmOTQiPjwvYT5BbiBlbnRpdHkgbWF5IGluaGVyaXQgcHJvcGVydGllcyBmcm9tIG90aGVyIGVudGl0aWVzLiBZb3UgY2FuIHNwZWNpZnkgYSBzcGVjaWZpYyBzdHJhdGVneSB0byB1c2UgZm9yIGluaGVyaXRhbmNlLjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBzcGVjaWZ5IGluaGVyaXRhbmNlICg8Y29kZT5ASW5oZXJpdGFuY2UpPC9jb2RlPiBmb3IgYW4gZXhpc3RpbmcgZW50aXR5ICg8Y29kZT5ARW50aXR5PC9jb2RlPik6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldywgc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkluaGVyaXRhbmNlPC9zcGFuPiBpbmZvcm1hdGlvbi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY5NSIgbmFtZT0ic3RocmVmOTUiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TcGVjaWZ5aW5nIEluaGVyaXRhbmNlPC9wPgotPGltZyBzcmM9ImltZy9pbmhlcml0YW5jZV90YWIucG5nIiBhbHQ9IlNlbGVjdGluZyB0aGUgSW5oZXJpdGFuY2UgYXJlYSBvbiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJTZWxlY3RpbmcgdGhlIEluaGVyaXRhbmNlIGFyZWEgb24gdGhlIEpQQSBEZXRhaWxzIHZpZXcuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+SW4gdGhlIDxzcGFuIGNsYXNzPSJib2xkIj5TdHJhdGVneTwvc3Bhbj4gbGlzdCwgc2VsZWN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVnaWVzOjwvcD4KLTx1bD4KLTxsaT4KLTxwPkEgc2luZ2xlIHRhYmxlIChkZWZhdWx0KTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Kb2luZWQgdGFibGU8L3A+Ci08L2xpPgotPGxpPgotPHA+T25lIHRhYmxlIHBlciBjbGFzczwvcD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgZm9sbG93aW5nIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSB0YWIuIFNlZSA8YSBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIj4iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iPC9hPiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgZGVzY3JpYmVzIHRoZSBvcHRpb25zIG9uIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcsIEluaGVyaXRhbmNlIHRhYi4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjQlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjIzJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDEzIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTMiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxMyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj48YSBpZD0ic3RocmVmOTYiIG5hbWU9InN0aHJlZjk2Ij48L2E+PGEgaWQ9InN0aHJlZjk3IiBuYW1lPSJzdGhyZWY5NyI+PC9hPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTMgcjFjMi10MTMiPk5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgY29sdW1uIHdoZW4gdXNpbmcgYSA8c3BhbiBjbGFzcz0iYm9sZCI+U2luZ2xlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0iYm9sZCI+Sm9pbmVkPC9zcGFuPiBpbmhlcml0YW5jZSBzdHJhdGVneS4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDEzIHIxYzMtdDEzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTMiIGhlYWRlcnM9InIxYzEtdDEzIj5EaXNjcmltaW5hdG9yIFR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxMyByMWMyLXQxMyI+U2V0IHRoZSBkaXNjcmltaW5hdG9yIHR5cGUgdG8gPGNvZGU+Q2hhcjwvY29kZT4gb3IgPGNvZGU+SW50ZWdlcjwvY29kZT4gKGluc3RlYWQgb2YgaXRzIGRlZmF1bHQ6IDxjb2RlPlN0cmluZzwvY29kZT4pLiBUaGUgPHNwYW4gY2xhc3M9ImJvbGQiPkRpc2NyaW1pbmF0b3IgVmFsdWU8L3NwYW4+IG11c3QgY29uZm9ybSB0byB0aGlzIHR5cGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTMgcjFjMy10MTMiPlN0cmluZzwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPjxhIGlkPSJzdGhyZWY5OCIgbmFtZT0ic3RocmVmOTgiPjwvYT48YSBpZD0ic3RocmVmOTkiIG5hbWU9InN0aHJlZjk5Ij48L2E+RGlzY3JpbWluYXRvciBWYWx1ZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDEzIHIxYzItdDEzIj5TcGVjaWZ5IHRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBhbiBlbnRpdHkgaW4gdGhpcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFRoZSB2YWx1ZSBtdXN0IGNvbmZvcm0gdG8gdGhlIHNwZWNpZmllZCA8c3BhbiBjbGFzcz0iYm9sZCI+RGlzY3JpbWluYXRvciBUeXBlPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBEaXNjcmltaW5hdG9yVmFsdWU8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxMyIgaGVhZGVycz0icjFjMS10MTMiPk92ZXJyaWRlIERlZmF1bHQ8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxMyByMWMyLXQxMyI+VXNlIHRoaXMgZmllbGQgdG8gc3BlY2lmeSBjdXN0b20gcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QFByaW1hcnlLZXlKb2luQ2x1bW48L2NvZGU+IGFubm90YXRpb24uPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTMgcjFjMy10MTMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0aGUgZW50aXR5IGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOSEVSSVRBTkNFX1NUUkFURUdZJmd0Ozwvc3Bhbj4pCi1ARGlzY3JpbWluYXRvckNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RElTQ1JJTUlOQVRPUl9DT0xVTU4mZ3Q7PC9zcGFuPiIsCi0gICAgZGlzY3JpbWluYXRvclR5cGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVFlQRSZndDs8L3NwYW4+KQotQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZS0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0RJU0NSSU1JTkFUT1JfVkFMVUUmZ3Q7PC9zcGFuPiIpCi1AUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKQotCi08L3ByZT4KLTxwPjxhIGlkPSJzdGhyZWYxMDAiIG5hbWU9InN0aHJlZjEwMCI+PC9hPjxhIGlkPSJzdGhyZWYxMDEiIG5hbWU9InN0aHJlZjEwMSI+PC9hPjxhIGlkPSJzdGhyZWYxMDIiIG5hbWU9InN0aHJlZjEwMiI+PC9hPlRoZSBmb2xsb3dpbmcgZmlndXJlcyBpbGx1c3RyYXRlcyB0aGUgZGlmZmVyZW50IGluaGVyaXRhbmNlIHN0cmF0ZWdpZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTAzIiBuYW1lPSJzdGhyZWYxMDMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TaW5nbGUgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX3NpbmdsZS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXMgZW50aXR5IGluaGVyaXRhbmNlIGluIGEgc2luZ2xlIHRhYmxlLiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGVudGl0eSBpbmhlcml0YW5jZSBpbiBhIHNpbmdsZSB0YWJsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTA0IiBuYW1lPSJzdGhyZWYxMDQiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj48YSBpZD0ic3RocmVmMTA1IiBuYW1lPSJzdGhyZWYxMDUiPjwvYT48YSBpZD0ic3RocmVmMTA2IiBuYW1lPSJzdGhyZWYxMDYiPjwvYT5Kb2luZWQgVGFibGUgSW5oZXJpdGFuY2U8L3A+Ci08aW1nIHNyYz0iaW1nL2luaGVyaXRhbmNlX2pvaW4ucG5nIiBhbHQ9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgdGl0bGU9IlRoaXMgZmlndXJlIGlsbHVzdHJhdGVzIGEgam9pbmVkIHN1YmNsYXNzIGluaGVyaXRhbmNlIHN0cmF0ZWd5LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+Ci08YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X3BlcnNpc3RlbmNlLmh0bSNCQUJDQUhJQyI+VW5kZXJzdGFuZGluZyBKYXZhIHBlcnNpc3RlbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9vcm0uaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Njg3MzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX29ybS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDJaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNJSERHRENEIiBuYW1lPSJDSUhER0RDRCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+PGEgaWQ9InN0aHJlZjU4IiBuYW1lPSJzdGhyZWY1OCI+PC9hPk1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGU8L2gxPgotPHA+V2hlbiBjcmVhdGluZyBhIEpQQSBwcm9qZWN0LCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pIHlvdSBjYW4gYWxzbyBjcmVhdGUgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBtYXBwaW5nIG1ldGFkYXRhIGFuZCBkZWZhdWx0cy48L3A+Ci08cD48YSBpZD0ic3RocmVmNTkiIG5hbWU9InN0aHJlZjU5Ij48L2E+RWNsaXBzZSBjcmVhdGVzIHRoZSA8Y29kZT5NRVRBLUlORlxvcm0ueG1sPC9jb2RlPiBmaWxlIGluIHlvdXIgcHJvamVjdCdzIGRpcmVjdG9yeTo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci0mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Jmd0OwotJmx0O3BlcnNpc3RlbmNlIHZlcnNpb249IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9WRVJTSU9OJmd0Ozwvc3Bhbj4iCi0gICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiCi0gICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZQotICAgICAgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCImZ3Q7Ci0gICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiImZ3Q7Ci0gICAgJmx0O3Byb3ZpZGVyPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7UEVSU0lTVEVOQ0VfUFJPVklERVImZ3Q7PC9zcGFuPiIgLyZndDsKLSAgJmx0Oy9wZXJzaXN0ZW5jZS11bml0Jmd0OwotJmx0Oy9wZXJzaXN0ZW5jZSZndDsKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyI+Q3JlYXRlIE5ldyBKUEEgUHJvamVjdCB3aXphcmQ8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSNDSUFFREVKRiI+TmV3IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZSBkaWFsb2c8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwNS5odG0jQ0lIQkNEQ0UiPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMy5odG0jQ0hEQklKQUMiPlRoZSBvcm0ueG1sIGZpbGU8L2E+PGJyIC8+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZjYxOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhEQUpJRCIgbmFtZT0iQ0lIREFKSUQiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPjxhIGlkPSJzdGhyZWY0NyIgbmFtZT0ic3RocmVmNDciPjwvYT5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjQ4IiBuYW1lPSJzdGhyZWY0OCI+PC9hPldoZW4geW91IGNyZWF0ZSBhIHByb2plY3QsIEVjbGlwc2UgY3JlYXRlcyB0aGUgPGNvZGU+TUVUQS1JTkZccGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIGluIHRoZSBwcm9qZWN0J3MgZGlyZWN0b3J5LjwvcD4KLTxwPllvdSBjYW4gY3JlYXRlIGEgc3R1YiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIE1FVEEtSU5GIGRpcmVjdG9yeSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCAoc2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4pLiBZb3UgY2FuIG1hbmFnZSB0aGlzIGZpbGUgZWl0aGVyIHRocm91Z2ggdGhlIFhNTCBlZGl0b3IgKHNlZSApIG9yIHRocm91Z2ggdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotRGVwZW5kaW5nIG9uIHlvdXIgSlBBIGltcGxlbWVudGF0aW9uIChmb3IgZXhhbXBsZSwgRWNsaXBzZUxpbmspLCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcGFnZXMgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIEVkaXRvcjoKLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAxOS5odG0jQ0lBSkFGRUciPkN1c3RvbWl6YXRpb248L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgY2hhbmdlLXRyYWNraW5nIGFuZCBzZXNzaW9uIGN1c3RvbWl6ZXItcmVsYXRlZCBwcm9wZXJ0aWVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJyZWZlcmVuY2UwMjAuaHRtI0NJQUJFRENIIj5DYWNoaW5nPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIGNhY2hpbmcgcHJvcGVydGllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0icmVmZXJlbmNlMDIxLmh0bSNDSUFCR0hISSI+TG9nZ2luZzwvYT48L3A+Ci08cD5Vc2UgdGhpcyBwYWdlIHRvIGRlZmluZSBsb2dnaW5nIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMi5odG0jQ0lBRkpDSEUiPk9wdGlvbnM8L2E+PC9wPgotPHA+VXNlIHRoaXMgcGFnZSB0byBkZWZpbmUgc2Vzc2lvbiBhbmQgdGFyZ2V0IGRhdGFiYXNlIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InJlZmVyZW5jZTAyMy5odG0jQ0lBQ0NGQ0IiPlNjaGVtYSBHZW5lcmF0aW9uPC9hPjwvcD4KLTxwPlVzZSB0aGlzIHBhZ2UgdG8gZGVmaW5lIERETC1yZWxhdGVkIHByb3BlcnRpZXMuPC9wPgotPC9saT4KLTwvdWw+Ci08cD5Gb3IgcHJvamVjdHMgdXNpbmcgdGhlIEVjbGlwc2VMaW5rIEpQQSBpbXBsZW1lbnRhdGlvbiwgdGhlIENvbm5lY3Rpb25zIHBhZ2UgYWxzbyBpbmNsdWRlcyBKREJDIGNvbm5lY3Rpb24gcG9vbCBwcm9wZXJ0aWVzLjwvcD4KLTxwPklmIHRoZSBwcm9qZWN0IHVzZXMgdGhlIEdlbmVyaWMgcGxhdGZvcm0sIHRoZW4gb25seSB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiwgPGEgaHJlZj0icmVmZXJlbmNlMDE4Lmh0bSNDSUFGRkpJRSI+Q29ubmVjdGlvbjwvYT4sIDxhIGhyZWY9InJlZmVyZW5jZTAyNC5odG0jQ0lBSEpERkYiPlByb3BlcnRpZXM8L2E+IGFuZCA8YSBocmVmPSJyZWZlcmVuY2UwMjUuaHRtI0NJQUhDSkFIIj5Tb3VyY2U8L2E+IHBhZ2VzIGFyZSBhdmFpbGFibGUuPC9wPgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZSIgLS0+PC9kaXY+Ci08cD5UbyB1c2UgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gRWRpdG9yOjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIDxjb2RlPnBlcmlzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBUaGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX2dlbmVyYWwuaHRtI0NJQUNJRkdKIj5HZW5lcmFsPC9hPiBwYWdlIG9mIHRoZSBlZGl0b3IgYXBwZWFycy48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+R2VuZXJhbDwvc3Bhbj4gcGFnZSB0byBkZWZpbmUgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZXMgPGNvZGU+Jmx0O3BlcnNpc3RlbnQtdW5pdCZndDs8L2NvZGU+LXJlbGF0ZWQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIHRoZSA8Y29kZT4mbHQ7cHJvdmlkZXImZ3Q7PC9jb2RlPiwgYW5kIDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+IGVsZW1lbnRzIChkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSkuPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGVhbHNvIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZUFsc28gb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5UaXA6PC9wPgotVGhlIHBlcnNpc3RlbmNlLnhtbCBFZGl0b3IncyBTb3VyY2UgcGFnZSBlbmFibGVzIHlvdSB0byB2aWV3IGFuZCBlZGl0IHRoZSByYXcgWE1MIGZpbGUuPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsbm90ZWFsc28iIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJJbmZvcm1hbCIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgcHJvcGVydGllcyBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGVkaXRvci4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iaHNpZGVzIiBydWxlcz0iZ3JvdXBzIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iMjklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDgiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQ4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10OCI+RWxlbWVudCBEZWZpbmVkPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5OYW1lPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10OCByMWMyLXQ4Ij5FbnRlciB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWUgPSAiJmx0O05hbWUmZ3Q7IiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY0OSIgbmFtZT0ic3RocmVmNDkiPjwvYT5QZXJzaXN0ZW5jZSBQcm92aWRlcjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMi10OCI+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIHBlcnNpc3RlbmNlIHByb3ZpZGVyLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O3Byb3ZpZGVyJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10OCIgaGVhZGVycz0icjFjMS10OCI+RGVzY3JpcHRpb248L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzItdDgiPkVudGVyIGEgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4gVGhpcyBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtkZXNjcmlwdGlvbiZndDs8L2NvZGU+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDgiIGhlYWRlcnM9InIxYzEtdDgiPjxhIGlkPSJzdGhyZWY1MCIgbmFtZT0ic3RocmVmNTAiPjwvYT5NYW5hZ2VkIENsYXNzZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIGNsYXNzZXMgbWFuYWdlZCB0aHJvdWdoIHRoZSBwZXJzaXN0ZW5jZSB1bml0LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDggcjFjMy10OCI+PGNvZGU+Jmx0O2NsYXNzJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10OCIgaGVhZGVycz0icjFjMS10OCI+Jm5ic3A7Jm5ic3A7RXhjbHVkZSZuYnNwO1VubGlzdGVkJm5ic3A7Q2xhc3NlczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDggcjFjMi10OCI+U2VsZWN0IHRvIGluY2x1ZGUgYWxsIGFubm90YXRlZCBlbnRpdHkgY2xhc3NlcyBpbiB0aGUgcm9vdCBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQ4IHIxYzMtdDgiPjxjb2RlPiZsdDtleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMmZ3Q7PC9jb2RlPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyN2MxLXQ4IiBoZWFkZXJzPSJyMWMxLXQ4Ij5YTUwmbmJzcDtNYXBwaW5nJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgdGhlIG9iamVjdC9yZWxhdGlvbmFsIG1hcHBpbmcgWE1MIGZpbGVzIGRlZmluZSB0aGUgY2xhc3NlcyBtYW5hZ2VkIHRocm91Z2ggdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10OCByMWMzLXQ4Ij48Y29kZT4mbHQ7bWFwcGluZy1maWxlJmd0OzwvY29kZT48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjhjMS10OCIgaGVhZGVycz0icjFjMS10OCI+SkFSJm5ic3A7RmlsZXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyOGMxLXQ4IHIxYzItdDgiPkFkZCBvciByZW1vdmUgYWRkaXRpb25hbCBKQVIgZmlsZXMgYW5kIGxpYnJhcmllczwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI4YzEtdDggcjFjMy10OCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJsaW5mb3JtYWwiIC0tPjwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiPkNvbm5lY3Rpb248L2E+IHBhZ2UgdG8gZGVmaW5lIHRoZSA8Y29kZT4mbHQ7anRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtub24tanRhLWRhdGEtc291cmNlJmd0OzwvY29kZT4gZWxlbWVudHMgYXMgZm9sbG93czo8L3A+Ci08cD5UbyBjb25maWd1cmUgdGhlIEpUQSAoSmF2YSBUcmFuc2FjdGlvbiBBUEkpIHNvdXJjZSB1c2VkIGJ5IHRoZSBwZXJzaXN0ZW5jZSBwcm92aWRlcjo8L3A+Ci08b2w+Ci08bGk+Ci08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPkpUQTwvc3Bhbj4gZnJvbSB0aGUgVHJhbnNhY3Rpb24gVHlwZSBsaXN0LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnRlciB0aGUgZ2xvYmFsIEpOREkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UuPC9wPgotPC9saT4KLTwvb2w+Ci08cD5UbyBjb25maWd1cmUgYSBub24tSlRBIGRhdGEgc291cmNlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+UmVzb3VyY2UgTG9jYWw8L3NwYW4+IGZyb20gdGhlIFRyYW5zYWN0aW9uIFR5cGUgbGlzdC48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIGdsb2JhbCBKTkRJIG5hbWUgb2YgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotU2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5EZWZhdWx0KCk8L3NwYW4+IHRvIHVzZSB0aGUgZGF0YSBzb3VyY2UgcHJvdmlkZWQgYnkgdGhlIGNvbnRhaW5lci48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPHA+PGEgaWQ9InN0aHJlZjUxIiBuYW1lPSJzdGhyZWY1MSI+PC9hPkZvciBwcm9qZWN0cyB1c2luZyB0aGUgR2VuZXJpYyBwbGF0Zm9ybSwgeW91IGNhbiBhbHNvIGRlZmluZSB0aGUgRWNsaXBzZUxpbmsgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgY29ubmVjdGlvbiBwb29sIGRyaXZlciwgVVJMLCB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5Vc2UgdGhlIHRhYmxlIGluIHRoZSBQcm9wZXJ0aWVzIHBhZ2UgdG8gc2V0IHRoZSB2ZW5kb3Itc3BlY2lmaWMgPGNvZGU+Jmx0O3Byb3BlcnRpZXMmZ3Q7PC9jb2RlPiBlbGVtZW50LjwvcD4KLTxwPlRvIGFkZCA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50czo8L3A+Ci08b2w+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+QWRkPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+RW50ZXIgdGhlIDxjb2RlPiZsdDtuYW1lJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt2YWx1ZSZndDs8L2NvZGU+IGF0dHJpYnV0ZXMgZm9yIHRoZSA8Y29kZT4mbHQ7cHJvcGVydHkmZ3Q7PC9jb2RlPiBlbGVtZW50IHVzaW5nIHRoZSB0YWJsZSdzIE5hbWUgYW5kIFZhbHVlIGZpZWxkcy48L3A+Ci08L2xpPgotPC9vbD4KLTxwPlRvIHJlbW92ZSBhIDxjb2RlPiZsdDtwcm9wZXJ0eSZndDs8L2NvZGU+IGVsZW1lbnQsIHNlbGVjdCBhIGRlZmluZWQgcHJvcGVydHkgaW4gdGhlIHRhYmxlIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5SZW1vdmU8L3NwYW4+LjwvcD4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlIj48YnIgLz4KLTx0YWJsZSBjbGFzcz0iTm90ZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPHRib2R5PgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij4KLTxwIGNsYXNzPSJub3RlcDEiPk5vdGU6PC9wPgotSWYgdGhlIHByb2plY3QgdXNlcyB0aGUgRWNsaXBzZUxpbmsgcGxhdGZvcm0sIHRoZSBjb25uZWN0aW9uIHBhZ2UgYWxzbyBpbmNsdWRlcyBwYXJhbWV0ZXJzIGZvciBKREJDIGNvbm5lY3Rpb24gcG9vbGluZy48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV94bWxsX2VkaXRvci5odG0jQ0lBQ0NISUQiPnBlcnNpc3RlbmNlLnhtbCBFZGl0b3I8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRkVCQUkiPlN5bmNocm9uaXppbmcgY2xhc3NlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCI+VGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjxiciAvPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrX21hcHBpbmcuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOGQ4ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tfbWFwcGluZy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hcHBpbmcgYW4gZW50aXR5PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hcHBpbmcgYW4gZW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCREdCSUoiIG5hbWU9IkJBQkRHQklKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPgotPGgxPk1hcHBpbmcgYW4gZW50aXR5PC9oMT4KLTxwPkRhbGkgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBtYXBwaW5nIHR5cGVzIGZvciBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXM6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTAuaHRtI0JBQkJBQkNFIj5CYXNpYyBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiPkVtYmVkZGVkIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+RW1iZWRkZWQgSUQgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj5JRCBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiPk1hbnktdG8tbWFueSBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAxNS5odG0jQkFCSEZBRkoiPk1hbnktdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE2Lmh0bSNCQUJIR0VCRCI+T25lLXRvLW1hbnkgbWFwcGluZzwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIj5PbmUtdG8tb25lIG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE4Lmh0bSNCQUJIRkhFSSI+VHJhbnNpZW50IG1hcHBpbmc8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDE5Lmh0bSNCQUJISUJJSSI+VmVyc2lvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMC5odG0jQ0lIQkRFQUoiPkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QWRkaXRpb25hbCBtYXBwaW5nIHR5cGVzIChzdWNoIGFzIEJhc2ljIENvbGxlY3Rpb24gbWFwcGluZ3MpIG1heSBiZSBhdmFpbGFibGUgd2hlbiB1c2luZyBEYWxpIHdpdGggRWNsaXBzZUxpbmsuPC9wPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT4gPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT48L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGUyMTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrcy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhc2tzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNi0wNFQxOTozMjo1OFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSIgVGFza3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJzdGhyZWYyNSIgbmFtZT0ic3RocmVmMjUiPjwvYT48L3A+Ci08aDE+VGFza3M8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGluY2x1ZGVzIGRldGFpbGVkIHN0ZXAtYnktc3RlcCBwcm9jZWR1cmVzIGZvciBhY2Nlc3NpbmcgdGhlIERhbGkgT1IgbWFwcGluZyB0b29sIGZ1bmN0aW9uYWxpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIj5Db252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3Q8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIj5DcmVhdGluZyBhIEpQQSBFbnRpdHk8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj5NYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCI+U3BlY2lmeWluZyBlbnRpdHkgaW5oZXJpdGFuY2U8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyMS5odG0jQkFCQkFHRkkiPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tzMDIzLmh0bSNCQUJGQUlCQSI+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSJ0YXNrczAyNi5odG0jQkFCREJDQkkiPk1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza19nZW5lcmF0aW5nX3NjaGVtYV9mcm9tX2NsYXNzZXMuaHRtI0NJSEhCSkNKIj5HZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9InRhc2tfZ2VuZXJhdGVfY2xhc3Nlc19mcm9tX3NjaGVtYS5odG0jQ0lIQ0JISkQiPkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWE8L2E+PC9wPgotPC9saT4KLTwvdWw+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NjA0MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAxLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQxWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnRpbmcgYSBKYXZhIFByb2plY3QgdG8gYSBKUEEgUHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJFSUJBREhIIiBuYW1lPSJCRUlCQURISCI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0PC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYzNSIgbmFtZT0ic3RocmVmMzUiPjwvYT48YSBpZD0ic3RocmVmMzYiIG5hbWU9InN0aHJlZjM2Ij48L2E+PGEgaWQ9InN0aHJlZjM3IiBuYW1lPSJzdGhyZWYzNyI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBjb252ZXJ0IGFuIGV4aXN0aW5nIEphdmEgcHJvamVjdCB0byBhIEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkZyb20gdGhlIE5hdmlnYXRvciBvciBQcm9qZWN0IGV4cGxvcmVyLCByaWdodC1jbGljayB0aGUgSmF2YSBwcm9qZWN0IGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJlICZndDsgQ29udmVydCB0byBKUEEgUHJvamVjdC48L3NwYW4+IFRoZSBQcm9qZWN0IEZhY2V0cyBwYWdlIG9mIHRoZSBNb2RpZnkgRmFjZXRlZCBQcm9qZWN0IHdpemFyZCBhcHBlYXJzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjM4IiBuYW1lPSJzdGhyZWYzOCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1vZGlmeSBGYWNldGVkIFByb2plY3QgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbW9kaWZ5X2ZhY2V0ZWRfcHJvamVjdC5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+Q29uZmlndXJhdGlvbjwvc3Bhbj4gdG8gPHNwYW4gY2xhc3M9ImJvbGQiPkRlZmF1bHQgSlBBIENvbmZpZ3VyYXRpb248L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIDxhIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIj5KUEEgRmFjZXQgcGFnZTwvYT4gYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYzOSIgbmFtZT0ic3RocmVmMzkiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5KUEEgRmFjZXQgUGFnZTwvcD4KLTxpbWcgc3JjPSJpbWcvbmV3X2pwYV9mYWNldF90YXNrLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5Db21wbGV0ZSB0aGUgZmllbGRzIG9uIHRoZSA8YSBocmVmPSJyZWZfanBhX2ZhY2V0Lmh0bSNDQUNJRkRJRiI+SlBBIEZhY2V0IHBhZ2U8L2E+IHRvIHNwZWNpZnkgeW91ciB2ZW5kZXItc3BlY2lmaWMgcGxhdGZvcm0sIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5LCBhbmQgZGF0YWJhc2UgY29ubmVjdGlvbi48L3A+Ci08cD5DbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TWFuYWdlIGxpYnJhcmllczwvc3Bhbj4gdG8gY3JlYXRlIG9yIHVwZGF0ZSB5b3VyIEpQQSB1c2VyIGxpYnJhcmllcy4gQ2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkRvd25sb2FkIGxpYnJhcmllczwvc3Bhbj4gdG8gb2J0YWluIGFkZGl0aW9uYWwgSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcmllcy48L3A+Ci08cD5JZiBEYWxpIGRlcml2ZXMgdGhlIGluY29ycmVjdCBzY2hlbWEsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgdGhlIERlZmF1bHQgU2NoZW1hIGZvciBDb25uZWN0aW9uPC9zcGFuPi4gVXNpbmcgdGhpcyBvcHRpb24sIHlvdSBjYW4gc2VsZWN0IGEgZGV2ZWxvcG1lbnQgdGltZSBzY2hlbWEgZm9yIGRlZmF1bHRzIGFuZCB2YWxpZGF0aW9uLjwvcD4KLTxwPklmIHlvdSBjbGVhciB0aGUgPHNwYW4gY2xhc3M9ImJvbGQiPkNyZWF0ZSBvcm0ueG1sPC9zcGFuPiBvcHRpb24gKHdoaWNoIGlzIHNlbGVjdGVkIGJ5IGRlZmF1bHQpLCB5b3UgY2FuIGxhdGVyIGFkZCBhIG1hcHBpbmcgZmlsZSB0byB0aGUgcHJvamVjdCB1c2luZyB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4uPC9wPgotPC9saT4KLTxsaT4KLTxwPkNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5GaW5pc2g8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+VGhlIERhbGkgT1IgTWFwcGluZyBUb29sIGFkZHMgdGhlIEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJpZXMgdG8geW91ciBwcm9qZWN0IGFuZCBjcmVhdGVzIHRoZSBuZWNlc3NhcnkgPGNvZGU+b3JtLnhtbDwvY29kZT4gYW5kIDxjb2RlPnBlcmlzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGVzLjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfbmV3X2pwYV9wcm9qZWN0X3dpemFyZC5odG0jQ0FDQkpHQkciPkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkPC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3BlcnNwZWN0aXZlLmh0bSNCQUJJRkJEQiI+SlBBIERldmVsb3BtZW50IHBlcnNwZWN0aXZlPC9hPjxiciAvPgotPGEgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSI+TWFwcGluZyBGaWxlIFdpemFyZDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2tzIiB0aXRsZT0iUmVsYXRlZCB0YXNrcyIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj5NYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj5DcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdDwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfcGVyc2lzdGVuY2UuaHRtI0JBQkNBSElDIj5VbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2U8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMi5odG0jQ0hESEFHSUgiPlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZTwvYT4KLTxwPiZuYnNwOzwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDIuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmY5YmIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlN5bmNocm9uaXppbmcgY2xhc3NlczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRUJBSSIgbmFtZT0iQ0lIRkVCQUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlN5bmNocm9uaXppbmcgY2xhc3NlczwvaDE+Ci08cD5BcyB5b3Ugd29yayB3aXRoIHRoZSBjbGFzc2VzIGluIHlvdXIgSmF2YSBwcm9qZWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlIHRvIHJlZmxlY3QgdGhlIGNoYW5nZXMuIDxhIGlkPSJzdGhyZWY1MiIgbmFtZT0ic3RocmVmNTIiPjwvYT48YSBpZD0ic3RocmVmNTMiIG5hbWU9InN0aHJlZjUzIj48L2E+PGEgaWQ9InN0aHJlZjU0IiBuYW1lPSJzdGhyZWY1NCI+PC9hPjwvcD4KLTxwPlVzZSB0aGlzIHByb2NlZHVyZSB0byBzeW5jaHJvbml6ZSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlOjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3MgTGlzdDwvc3Bhbj4uPC9wPgotPGRpdiBhbGlnbj0iY2VudGVyIj4KLTxkaXYgY2xhc3M9ImluZnRibG5vdGUiPjxiciAvPgotPHRhYmxlIGNsYXNzPSJOb3RlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+Tm90ZTo8L3A+Ci1Vc2UgdGhpcyBmdW5jdGlvbiBpZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9ImJvbGQiPkFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgbGlzdGVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgb3B0aW9uPC9zcGFuPiBpbiB0aGUgPGEgaHJlZj0icmVmX2pwYV9mYWNldC5odG0jQ0FDSUZESUYiPkpQQSBGYWNldCBwYWdlPC9hPi4gSW4gZ2VuZXJhbCwgeW91IGRvIG5vdCBoYXZlIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGhpbiB0aGUgY29udGFpbmVyLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibG5vdGUiIC0tPjwvZGl2PgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNTUiIG5hbWU9InN0aHJlZjU1Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U3luY2hyb25pemluZyB0aGUgcGVyc2lzdGVuY2UueG1sIEZpbGU8L3A+Ci08aW1nIHNyYz0iaW1nL3N5bmNob3JuaXplX2NsYXNzZXMucG5nIiBhbHQ9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBKUEEgVG9vbHMgJmd0OyBTeW5jaHJvbml6ZSBDbGFzc2VzIG9wdGlvbi4iIHRpdGxlPSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPkRhbGkgYWRkcyB0aGUgbmVjZXNzYXJ5IDxjb2RlPiZsdDtjbGFzcyZndDs8L2NvZGU+IGVsZW1lbnRzIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlBlcnNpc3RlbmNlIFhNTCBFZGl0b3I8L3NwYW4+IHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08L2xpPgotPC9vbD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCI+TWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDIuaHRtI0NIREhBR0lIIj5UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGU8L2E+PGJyIC8+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDAzLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE4ZjE0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDMuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5VcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbjwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0MloiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJVcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmNTYiIG5hbWU9InN0aHJlZjU2Ij48L2E+Ci08aDE+VXBncmFkaW5nIGRvY3VtZW50IHZlcnNpb248L2gxPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIG1pZ3JhdGUgeW91ciBwcm9qZWN0IGZyb20gSlBBIDEuMCB0byBKUEEgMi4wLiBZb3UgbXVzdCBjb21wbGV0ZSB0aGlzIHVwZ3JhZGUgdG8gdXNlIHRoZSBjdXJyZW50IEpQQSAyLjAgZmVhdHVyZXMgaW4gRGFsaS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY1NyIgbmFtZT0ic3RocmVmNTciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5VcGdyYWRpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBGaWxlPC9wPgotPGltZyBzcmM9ImltZy91cGdyYWRlX3BlcnNpc3RlbmNlX2pwYV92ZXJzaW9uLnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgSlBBIFRvb2xzICZndDsgU3luY2hyb25pemUgQ2xhc3NlcyBvcHRpb24uIiB0aXRsZT0iVGhpcyBmaWd1cmUgc2hvd3MgdGhlIEpQQSBUb29scyAmZ3Q7IFN5bmNocm9uaXplIENsYXNzZXMgb3B0aW9uLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNDQxYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGFuIG9ybS54bWwgZmlsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmNjAiIG5hbWU9InN0aHJlZjYwIj48L2E+Ci08aDE+Q3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY2MSIgbmFtZT0ic3RocmVmNjEiPjwvYT5JZiB5b3Ugb3B0IG5vdCB0byBjcmVhdGUgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSB3aGVuIHlvdSBjcmVhdGUgYSBKUEEgcHJvamVjdCwgeW91IGNhbiBjcmVhdGUgb25lIHVzaW5nIHRoZSA8YSBocmVmPSJyZWZlcmVuY2UwMDIuaHRtI0NJQUlKQ0NFIj5NYXBwaW5nIEZpbGUgV2l6YXJkPC9hPi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gY3JlYXRlIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGU6PC9wPgotPG9sPgotPGxpPgotPHA+RnJvbSB0aGUgTmF2aWdhdG9yIG9yIFByb2plY3QgRXhwbG9yZXIsIHNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+RmlsZSAmZ3Q7IE5ldyAmZ3Q7IE90aGVyPC9zcGFuPi4gVGhlIFNlbGVjdCBhIFdpemFyZCBkaWFsb2cgYXBwZWFycy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY2MiIgbmFtZT0ic3RocmVmNjIiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgU2VsZWN0IGEgV2l6YXJkIERpYWxvZzwvcD4KLTxpbWcgc3JjPSJpbWcvc2VsZWN0X2Ffd2l6YXJkX21hcHBpbmcucG5nIiBhbHQ9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBTZWxlY3QgYSBXaXphcmQgZGlhbG9nIHdpdGggTWFwcGluZyBmaWxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwcGluZyBGaWxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uIFRoZSBNYXBwaW5nIEZpbGUgcGFnZSBhcHBlYXJzLjwvcD4KLTxwPklmIHlvdSBhcmUgdXNpbmcgRWNsaXBzZUxpbmssIHlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FY2xpcHNlTGluayAmZ3Q7IEVjbGlwc2VMaW5rIE1hcHBpbmcgRmlsZTwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNjMiIG5hbWU9InN0aHJlZjYzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgRmlsZSBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX2ZpbGVfbmV3LnBuZyIgYWx0PSJUaGUgTWFwcGluZyBGaWxlIHBhZ2UuIiB0aXRsZT0iVGhlIE1hcHBpbmcgRmlsZSBwYWdlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkRlZmluZSB0aGUgcHJvcGVydGllcyBpbiB0aGUgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkZpbmlzaDwvc3Bhbj4uIFRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIGFwcGVhcnMgaW4gdGhlIHNyYyBkaXJlY3Rvcnkgb2YgdGhlIHNlbGVjdGVkIEpQQSBwcm9qZWN0LiBZb3UgY2FuIG1hbmFnZSB0aGUgb3JtLnhtbCBmaWxlIHVzaW5nIHRoZSBKUEEgRGV0YWlscyB2aWV3IG9yIHRocm91Z2ggdGhlIFhNTCBFZGl0b3IuIFNlZSBhbHNvIDxhIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBvcm0ueG1sKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY5NjA4My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQyWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCQ0RDRSIgbmFtZT0iQ0lIQkNEQ0UiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldvcmtpbmcgd2l0aCBvcm0ueG1sIGZpbGU8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjY0IiBuYW1lPSJzdGhyZWY2NCI+PC9hPjxhIGlkPSJzdGhyZWY2NSIgbmFtZT0ic3RocmVmNjUiPjwvYT5Zb3UgY2FuIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gYnkgdXNpbmcgdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIHdvcmsgd2l0aCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZTo8L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5PcGVuPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+SW4gdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldywgc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHlNYXBwaW5nczwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGUgSlBBIERldGFpbHMgdmlldyB0byBjb25maWd1cmUgdGhlIGVudGl0eSBtYXBwaW5nIGFuZCBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjY2IiBuYW1lPSJzdGhyZWY2NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkpQQSBEZXRhaWxzIHZpZXcgZm9yIEVudGl0eU1hcHBpbmdzIChvcm0ueG1sKTwvcD4KLTxpbWcgc3JjPSJpbWcvZGV0YWlsc19lbnRpdHltYXBwaW5ncy5wbmciIGFsdD0iSlBBIERldGFpbHMgdmlldyBmb3Igb3JtLnhtbCBmaWxlLiIgdGl0bGU9IkpQQSBEZXRhaWxzIHZpZXcgZm9yIG9ybS54bWwgZmlsZS4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08L29sPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX2RldGFpbHNfb3JtLmh0bSNDQUNHREdIQyI+SlBBIERldGFpbHMgdmlldyAoZm9yIG9ybS54bWwpPC9hPjxiciAvPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iI0NJSEJDRENFIj5Xb3JraW5nIHdpdGggb3JtLnhtbCBmaWxlPC9hPjxiciAvPgotPGEgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtYTUwuaHRtbCI+V29ya2luZyB3aXRoIFhNTCBGaWxlczwvYT48YnIgLz4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyI+VGhlIG9ybS54bWwgZmlsZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhMGQ3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FbnRpdHk8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW50aXR5IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCR0JJRUUiIG5hbWU9IkJBQkdCSUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbnRpdHk8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjcwIiBuYW1lPSJzdGhyZWY3MCI+PC9hPjxhIGlkPSJzdGhyZWY3MSIgbmFtZT0ic3RocmVmNzEiPjwvYT48YSBpZD0ic3RocmVmNzIiIG5hbWU9InN0aHJlZjcyIj48L2E+PGEgaWQ9InN0aHJlZjczIiBuYW1lPSJzdGhyZWY3MyI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGlzIGEgcGVyc2lzdGVudCBkb21haW4gb2JqZWN0LjwvcD4KLTxwPkFuIGVudGl0eSA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXMuIEVudGl0aWVzIG1heSBhbHNvIGV4dGVuZCBub24tZW50aXR5IGNsYXNzZXMgYXMgd2VsbCBhcyBlbnRpdHkgY2xhc3NlcywgYW5kIG5vbi1lbnRpdHkgY2xhc3NlcyBtYXkgZXh0ZW5kIGVudGl0eSBjbGFzc2VzLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QW4gZW50aXR5IDxzcGFuIGNsYXNzPSJpdGFsaWMiPm11c3QgaGF2ZTwvc3Bhbj46PC9wPgotPHVsPgotPGxpPgotPHA+QSBuby1hcmcgY29uc3RydWN0b3IgKHB1YmxpYyBvciBwcm90ZWN0ZWQpOyB0aGUgZW50aXR5IGNsYXNzIG1heSBoYXZlIG90aGVyIGNvbnN0cnVjdG9ycyBhcyB3ZWxsLjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+PGEgaWQ9InN0aHJlZjc0IiBuYW1lPSJzdGhyZWY3NCI+PC9hPjxhIGlkPSJzdGhyZWY3NSIgbmFtZT0ic3RocmVmNzUiPjwvYT48YSBpZD0ic3RocmVmNzYiIG5hbWU9InN0aHJlZjc2Ij48L2E+RWFjaCBwZXJzaXN0ZW50IGVudGl0eSBtdXN0IGJlIG1hcHBlZCB0byBhIGRhdGFiYXNlIHRhYmxlIGFuZCBjb250YWluIGEgcHJpbWFyeSBrZXkuIFBlcnNpc3RlbnQgZW50aXRpZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIDxjb2RlPkBFbnRpdHk8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXIuPC9zcGFuPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBhY2Nlc3MgdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nLiBJbiB0aGUgZm9sbG93aW5nIGZpZ3VyZSwgY2xpY2tpbmcgPHNwYW4gY2xhc3M9Iml0YWxpYyI+ZW50aXR5PC9zcGFuPiBpbnZva2VzIHRoZSBkaWFsb2cgZnJvbSB0aGUgSlBBIERldGFpbHMgVmlldy48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY3NyIgbmFtZT0ic3RocmVmNzciPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgTWFwcGluZyBUeXBlIEh5cGVybGluazwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGVkX2VudGl0eV90eXBlX2xpbmsucG5nIiBhbHQ9IlRoZSBKUEEgRGV0YWlscyB2aWV3IGZvciBhbiBlbnRpdHkgc2hvd2luZyB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluay4iIHRpdGxlPSJUaGUgSlBBIERldGFpbHMgdmlldyBmb3IgYW4gZW50aXR5IHNob3dpbmcgdGhlIG1hcHBpbmcgdHlwZSBoeXBlcmxpbmsuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxkaXYgYWxpZ249ImNlbnRlciI+Ci08ZGl2IGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGVBbHNvIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPgotPHAgY2xhc3M9Im5vdGVwMSI+VGlwOjwvcD4KLVlvdSBjYW4gYWxzbyBjaGFuZ2UgKG9yIGFkZCkgcGVyc2lzdGVuY2UgZm9yIGFuIGVudGl0eSBieSByaWdodC1jbGlja2luZyB0aGUgY2xhc3MgaW4gdGhlIEpQQSBTdHJ1Y3R1cmUgVmlldyBhbmQgdGhlbiBjbGlja2luZyA8c3BhbiBjbGFzcz0iYm9sZCI+TWFwIEFzICZndDsgRW50aXR5PC9zcGFuPi48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlYWxzbyIgLS0+PC9kaXY+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbnRpdHk8L3NwYW4+IGZyb20gdGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIGFuZCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5PSzwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmNzgiIG5hbWU9InN0aHJlZjc4Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX2VudGl0eS5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiB0aXRsZT0iVGhlIE1hcHBpbmcgVHlwZSBzZWxlY3Rpb24gZGlhbG9nIHdpdGggRW5pdHkgc2VsZWN0ZWQuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+Q29tcGxldGUgdGhlIHJlbWFpbmluZyA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfcHJvcF92aWV3Lmh0bSNCQUJGQUVCQiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGVudGl0aWVzKTwvYT4uPC9wPgotPC9saT4KLTwvb2w+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrcyIgdGl0bGU9IlJlbGF0ZWQgdGFza3MiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDRhMTY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkVtYmVkZGFibGU8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRW1iZWRkYWJsZSIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZFSUNFIiBuYW1lPSJCQUJGRUlDRSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RW1iZWRkYWJsZTwvaDE+Ci08cD48YSBpZD0ic3RocmVmNzkiIG5hbWU9InN0aHJlZjc5Ij48L2E+PGEgaWQ9InN0aHJlZjgwIiBuYW1lPSJzdGhyZWY4MCI+PC9hPkFuIDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRlZDwvc3Bhbj4gY2xhc3MgaXMgYSBjbGFzcyB3aG9zZSBpbnN0YW5jZXMgYXJlIHN0b3JlZCBhcyBwYXJ0IG9mIGFuIG93bmluZyBlbnRpdHk7IGl0IHNoYXJlcyB0aGUgaWRlbnRpdHkgb2YgdGhlIG93bmluZyBlbnRpdHkuIEVhY2ggZmllbGQgb2YgdGhlIGVtYmVkZGVkIGNsYXNzIGlzIG1hcHBlZCB0byB0aGUgZGF0YWJhc2UgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBvd25pbmcgZW50aXR5LjwvcD4KLTxwPlRvIG92ZXJyaWRlIHRoZSBtYXBwaW5nIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHN1YmNsYXNzLCB1c2UgdGhlIDxjb2RlPkBBdHRyaWJ1dGVPdmVycmlkZTwvY29kZT4gYW5ub3RhdGlvbiBmb3IgdGhhdCBzcGVjaWZpYyBjbGFzcy48L3A+Ci08cD48YSBpZD0ic3RocmVmODEiIG5hbWU9InN0aHJlZjgxIj48L2E+PGEgaWQ9InN0aHJlZjgyIiBuYW1lPSJzdGhyZWY4MiI+PC9hPjxhIGlkPSJzdGhyZWY4MyIgbmFtZT0ic3RocmVmODMiPjwvYT5BbiBlbWJlZGRhYmxlIGVudGl0eSBpcyBpZGVudGlmaWVkIGJ5IHRoZSA8Y29kZT5ARW1iZWRkYWJsZTwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIGVtYmVkZGFibGUgcGVyc2lzdGVuY2UgdG8gYW4gZXhpc3RpbmcgZW50aXR5OjwvcD4KLTxvbD4KLTxsaT4KLTxwPk9wZW4gdGhlIEphdmEgY2xhc3MgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPi48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IHRoZSBjbGFzcyBpbiB0aGUgSlBBIFN0cnVjdHVyZSB2aWV3LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5FbWJlZGRhYmxlPC9zcGFuPiBhbmQgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+T0s8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjg0IiBuYW1lPSJzdGhyZWY4NCI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPk1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gRGlhbG9nIChFbWJlZGRhYmxlKTwvcD4KLTxpbWcgc3JjPSJpbWcvbWFwcGluZ190eXBlX3NlbGVjdGlvbl9lbWJlZC5wbmciIGFsdD0iVGhlIE1hcHBpbmcgVHlwZSBTZWxlY3Rpb24gZGlhbG9nIHdpdGggRW1iZWRkYWJsZSBzZWxlY3RlZC4iIHRpdGxlPSJUaGUgTWFwcGluZyBUeXBlIFNlbGVjdGlvbiBkaWFsb2cgd2l0aCBFbWJlZGRhYmxlIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGRsPgotPGRkPjxhIGhyZWY9InRhc2tfYWRkX3BlcnNpc3RlbmNlLmh0bSNCQUJISUNBSSI+QWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3M8L2E+PC9kZD4KLTxkZD48YSBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIj5TcGVjaWZ5aW5nIGFkZGl0aW9uYWwgdGFibGVzPC9hPjwvZGQ+Ci08ZGQ+PGEgaHJlZj0idGFza19pbmhlcml0YW5jZS5odG0jQ0lIQ0NDSkQiPlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlPC9hPjwvZGQ+Ci08L2RsPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAwOC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTA1NGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA4Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFwcGVkIHN1cGVyY2xhc3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDNaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iTWFwcGVkIHN1cGVyY2xhc3MiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJEQUdDSSIgbmFtZT0iQkFCREFHQ0kiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk1hcHBlZCBzdXBlcmNsYXNzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWY4NSIgbmFtZT0ic3RocmVmODUiPjwvYT48YSBpZD0ic3RocmVmODYiIG5hbWU9InN0aHJlZjg2Ij48L2E+QW4gZW50aXR5IHRoYXQgZXh0ZW5kcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gY2xhc3MgaW5oZXJpdHMgdGhlIHBlcnNpc3RlbnQgc3RhdGUgYW5kIG1hcHBpbmcgaW5mb3JtYXRpb24gZnJvbSBhIHN1cGVyY2xhc3MuIFlvdSBzaG91bGQgdXNlIGEgbWFwcGVkIHN1cGVyY2xhc3MgdG8gZGVmaW5lIG1hcHBpbmcgaW5mb3JtYXRpb24gdGhhdCBpcyBjb21tb24gdG8gbXVsdGlwbGUgZW50aXR5IGNsYXNzZXMuPC9wPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyA8c3BhbiBjbGFzcz0iaXRhbGljIj5jYW4gYmU8L3NwYW4+OjwvcD4KLTx1bD4KLTxsaT4KLTxwPkFic3RyYWN0IG9yIGNvbmNyZXRlIGNsYXNzZXM8L3A+Ci08L2xpPgotPC91bD4KLTxwPkEgbWFwcGVkIHN1cGVyY2xhc3MgPHNwYW4gY2xhc3M9Iml0YWxpYyI+Y2Fubm90IGJlPC9zcGFuPjo8L3A+Ci08dWw+Ci08bGk+Ci08cD5CZSBxdWVyaWVkIG9yIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBFbnRpdHktTWFuYWdlciBvciBRdWVyeSBvcGVyYXRpb25zPC9wPgotPC9saT4KLTxsaT4KLTxwPkJlIHRoZSB0YXJnZXQgb2YgYSBwZXJzaXN0ZW50IHJlbGF0aW9uc2hpcDwvcD4KLTwvbGk+Ci08L3VsPgotPHA+QSBtYXBwZWQgc3VwZXJjbGFzcyBkb2VzIG5vdCBoYXZlIGEgZGVmaW5lZCBkYXRhYmFzZSB0YWJsZS4gSW5zdGVhZCwgaXRzIG1hcHBpbmcgaW5mb3JtYXRpb24gaXMgZGVyaXZlZCBmcm9tIGl0cyBzdXBlcmNsYXNzLiBUbyBvdmVycmlkZSB0aGUgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyBzdWJjbGFzcywgdXNlIHRoZSA8Y29kZT5AQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+IGFubm90YXRpb24gZm9yIHRoYXQgc3BlY2lmaWMgY2xhc3MuPC9wPgotPHA+PGEgaWQ9InN0aHJlZjg3IiBuYW1lPSJzdGhyZWY4NyI+PC9hPjxhIGlkPSJzdGhyZWY4OCIgbmFtZT0ic3RocmVmODgiPjwvYT48YSBpZD0ic3RocmVmODkiIG5hbWU9InN0aHJlZjg5Ij48L2E+PGEgaWQ9InN0aHJlZjkwIiBuYW1lPSJzdGhyZWY5MCI+PC9hPkEgbWFwcGVkIHN1cGVyY2xhc3MgaXMgaWRlbnRpZmllZCBieSB0aGUgPGNvZGU+QE1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+IGFubm90YXRpb24uPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIGFkZCBNYXBwZWQgU3VwZXJjbGFzcyBwZXJzaXN0ZW5jZSB0byBhbiBleGlzdGluZyBlbnRpdHk6PC9wPgotPG9sPgotPGxpPgotPHA+T3BlbiB0aGUgSmF2YSBjbGFzcyBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPlByb2plY3QgRXhwbG9yZXI8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5TZWxlY3QgdGhlIGNsYXNzIGluIHRoZSBKUEEgU3RydWN0dXJlIHZpZXcuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBjbGljayB0aGUgbWFwcGluZyB0eXBlIGh5cGVybGluayB0byBvcGVuIHRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZy48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXBwZWQgU3VwZXJjbGFzczwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWY5MSIgbmFtZT0ic3RocmVmOTEiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5NYXBwaW5nIFR5cGUgU2VsZWN0aW9uIERpYWxvZyAoTWFwcGVkIFN1cGVyY2xhc3MpPC9wPgotPGltZyBzcmM9ImltZy9tYXBwaW5nX3R5cGVfc2VsZWN0aW9uX3N1cGVyY2xhc3MucG5nIiBhbHQ9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgdGl0bGU9IlRoZSBNYXBwaW5nIFR5cGUgU2VsZWN0aW9uIGRpYWxvZyB3aXRoIE1hcHBlZCBTdXBlcmNsYXNzIHNlbGVjdGVkLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIHRoZSByZW1haW5pbmcgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBlbnRpdGllcyk8L2E+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFza3MiIHRpdGxlPSJSZWxhdGVkIHRhc2tzIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPkFkZGluZyBwZXJzaXN0ZW5jZSB0byBhIGNsYXNzPC9hPjxiciAvPgotPGEgaHJlZj0idGFza19hZGRpdG9uYWxfdGFibGVzLmh0bSNDSUhHQklFSSI+U3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlczwvYT48YnIgLz4KLTxhIGhyZWY9InRhc2tfaW5oZXJpdGFuY2UuaHRtI0NJSENDQ0pEIj5TcGVjaWZ5aW5nIGVudGl0eSBpbmhlcml0YW5jZTwvYT48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDA5Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlODY5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMDkuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5DcmVhdGluZyBOYW1lZCBRdWVyaWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQzWiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJJR0JHRyIgbmFtZT0iQkFCSUdCR0ciPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjEwNyIgbmFtZT0ic3RocmVmMTA3Ij48L2E+PGEgaWQ9InN0aHJlZjEwOCIgbmFtZT0ic3RocmVmMTA4Ij48L2E+TmFtZWQgcXVlcmllcyBpbXByb3ZlIGFwcGxpY2F0aW9uIHBlcmZvcm1hbmNlIGJlY2F1c2UgdGhleSBhcmUgcHJlcGFyZWQgb25jZSBhbmQgdGhleSAoYW5kIGFsbCBvZiB0aGVpciBhc3NvY2lhdGVkIHN1cHBvcnRpbmcgb2JqZWN0cykgY2FuIGJlIGVmZmljaWVudGx5IHJldXNlZCB0aGVyZWFmdGVyLCBtYWtpbmcgdGhlbSB3ZWxsIHN1aXRlZCBmb3IgY29tcGxleCBhbmQgZnJlcXVlbnRseSBleGVjdXRlZCBvcGVyYXRpb25zLiBOYW1lZCBxdWVyaWVzIHVzZSB0aGUgSlBBIHF1ZXJ5IGxhbmd1YWdlIGZvciBwb3J0YWJsZSBleGVjdXRpb24gb24gYW55IHVuZGVybHlpbmcgZGF0YWJhc2U7IG5hbWVkIG5hdGl2ZSBxdWVyaWVzIHVzZSB0aGUgU1FMIGxhbmd1YWdlIG5hdGl2ZSB0byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS48L3A+Ci08cD5Vc2UgdGhpcyBwcm9jZWR1cmUgdG8gYWRkIDxjb2RlPkBOYW1lZFF1ZXJ5PC9jb2RlPiBhbmQgPGNvZGU+QE5hbWVkTmF0aXZlUXVlcnk8L2NvZGU+IGFubm90YXRpb25zIHRvIHRoZSBlbnRpdHkuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmFtZWQgcXVlcnk6PC9wPgotPG9sPgotPGxpPgotPHA+U2VsZWN0IHRoZSBlbnRpdHkgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBKUEEgRGV0YWlscyB2aWV3LCBleHBhbmQgUXVlcmllcy48L3A+Ci08L2xpPgotPGxpPgotPHA+Q2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPkFkZDwvc3Bhbj4gZm9yIGEgbmFtZWQgcXVlcnksIG9yIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgTmF0aXZlPC9zcGFuPiBmb3IgYSBuYXRpdmUgcXVlcnkuPC9wPgotPC9saT4KLTxsaT4KLTxwPkluIHRoZSBkaWFsb2cgdGhhdCBhcHBlYXJzLCBlbnRlciB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgaW4gdGhlIE5hbWUgZmllbGQgYW5kIHRoZW4gY2xpY2sgT0suPC9wPgotPC9saT4KLTxsaT4KLTxwPkVudGVyIHRoZSBxdWVyeSBpbiB0aGUgUXVlcnkgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGlkPSJzdGhyZWYxMDkiIG5hbWU9InN0aHJlZjEwOSI+PC9hPjxhIGlkPSJzdGhyZWYxMTAiIG5hbWU9InN0aHJlZjExMCI+PC9hPjxhIGlkPSJzdGhyZWYxMTEiIG5hbWU9InN0aHJlZjExMSI+PC9hPjxhIGlkPSJzdGhyZWYxMTIiIG5hbWU9InN0aHJlZjExMiI+PC9hPlRvIGFkZCBhIFF1ZXJ5IGhpbnQsIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQ8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjExMyIgbmFtZT0ic3RocmVmMTEzIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+RW50ZXJpbmcgYSBOYW1lZCBRdWVyeTwvcD4KLTxpbWcgc3JjPSJpbWcvdGFza19lbnRlcmluZ19xdWVyeS5wbmciIGFsdD0iVGhlIFF1ZXJpZXMgc2VjdGlvbiBvZiB0aGUgSlBBIERldGFpbHMgdmlldy4iIHRpdGxlPSJUaGUgUXVlcmllcyBzZWN0aW9uIG9mIHRoZSBKUEEgRGV0YWlscyB2aWV3LiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTwvb2w+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEwLmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMjJkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTAuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+QmFzaWMgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0M1oiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJCYXNpYyBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQkFCQ0UiIG5hbWU9IkJBQkJBQkNFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5CYXNpYyBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTQiIG5hbWU9InN0aHJlZjExNCI+PC9hPjxhIGlkPSJzdGhyZWYxMTUiIG5hbWU9InN0aHJlZjExNSI+PC9hPjxhIGlkPSJzdGhyZWYxMTYiIG5hbWU9InN0aHJlZjExNiI+PC9hPjxhIGlkPSJzdGhyZWYxMTciIG5hbWU9InN0aHJlZjExNyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPiB0byBtYXAgYW4gYXR0cmlidXRlIGRpcmVjdGx5IHRvIGEgZGF0YWJhc2UgY29sdW1uLiBCYXNpYyBtYXBwaW5ncyBtYXkgYmUgdXNlZCBvbmx5IHdpdGggdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgdHlwZXM6PC9wPgotPHVsPgotPGxpPgotPHA+SmF2YSBwcmltaXRpdmUgdHlwZXMgYW5kIHdyYXBwZXJzIG9mIHRoZSBwcmltaXRpdmUgdHlwZXM8L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS5sYW5nLlN0cmluZywgamF2YS5tYXRoLkJpZ0ludGVnZXI8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+amF2YS51dGlsLkNhbGVuZGFyLCBqYXZhLnNxbC5EYXRlPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPmJ5dGVbXTwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+Qnl0ZVtdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48Y29kZT5jaGFyW108L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkNoYXJhY3RlcltdPC9jb2RlPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5lbnVtczwvcD4KLTwvbGk+Ci08bGk+Ci08cD5hbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgPGNvZGU+U2VyaWFsaXphYmxlPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VG8gY3JlYXRlIGEgYmFzaWMgbWFwcGluZzo8L3A+Ci08b2w+Ci08bGk+Ci08cD5JbiB0aGUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+LCByaWdodC1jbGljayB0aGUgZmllbGQgdG8gbWFwLiBTZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IEJhc2ljPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZCBmaWVsZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgb24gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE0Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTQiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNCI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5FbnRpdHkgTWFwIEh5cGVybGluazwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE0IHIxYzItdDE0Ij5EZWZpbmVzIHRoaXMgbWFwcGluZyBhcyBhIDxzcGFuIGNsYXNzPSJib2xkIj5CYXNpYyBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBCYXNpYzwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNCByMWMzLXQxNCI+QmFzaWM8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5Db2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQxNCByMWMyLXQxNCI+VGhlIGRhdGFiYXNlIGNvbHVtbiBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHQ0JIQiI+IkNvbHVtbiI8L2E+IGZvciBkZXRhaWxzLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE0IHIxYzMtdDE0Ij5CeSBkZWZhdWx0LCB0aGUgQ29sdW1uIGlzIGFzc3VtZWQgdG8gYmUgbmFtZWQgaWRlbnRpY2FsbHkgdG8gdGhlIGF0dHJpYnV0ZSBhbmQgYWx3YXlzIGluY2x1ZGVkIGluIHRoZSA8Y29kZT5JTlNFUlQ8L2NvZGU+IGFuZCA8Y29kZT5VUERBVEU8L2NvZGU+IHN0YXRlbWVudHMuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+VGFibGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQxNCByMWMyLXQxNCI+TmFtZSBvZiB0aGUgZGF0YWJhc2UgdGFibGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTQgcjFjMy10MTQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQxNCIgaGVhZGVycz0icjFjMS10MTQiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MTQgcjFjMi10MTQiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNCByMWMzLXQxNCI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTQiIGhlYWRlcnM9InIxYzEtdDE0Ij5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQxNCByMWMzLXQxNCI+WWVzPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI3YzEtdDE0IiBoZWFkZXJzPSJyMWMxLXQxNCI+VHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDE0IHIxYzItdDE0Ij5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGF0YToKLTx1bD4KLTxsaT4KLTxwPkRlZmF1bHQ8L3A+Ci08L2xpPgotPGxpPgotPHA+TE9CICZuZGFzaDsgU3BlY2lmaWVzIGlmIHRoaXMgaXMgYSBsYXJnZSBvYmplY3RzIChCTE9CIG9yIENMT0IpLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDQkJJQkkiPiJMb2IiPC9hPiBmb3IgZGV0YWlscy48L3A+Ci08L2xpPgotPGxpPgotPHA+VGVtcG9yYWwgJm5kYXNoOyBTcGVjaWZ5IGlmIHRoaXMgaXMgYSBEYXRlLCBUaW1lLCBvciBUaW1lc3RhbXAgb2JqZWN0LiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDRUFKR0QiPiJUZW1wb3JhbCI8L2E+IGZvciBkZXRhaWxzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5FbnVtZXJhdGVkICZuZGFzaDsgU3BlY2lmeSBob3cgdG8gcGVyc2lzdCBlbnVtZXJhdGVkIGNvbnN0cmFpbnRzIGFzIG9yZGluYWwgb3Igc3RyaW5nLCBpbiBvcmRlciB0byBtYXRjaCBhbiBleGlzdGluZyBkYXRhYmFzZSBzY2hlbWEuPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyN2MxLXQxNCByMWMzLXQxNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIAotICAgIGluc2VydGFibGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgb3B0aW9uYWwgPSA8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7T1BUSU9OQUwmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbChUZW1wb3JhbFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RFTVBPUkFMJmd0Ozwvc3Bhbj4pCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MzRkNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDExLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCQ0JIREYiIG5hbWU9IkJBQkNCSERGIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMTgiIG5hbWU9InN0aHJlZjExOCI+PC9hPjxhIGlkPSJzdGhyZWYxMTkiIG5hbWU9InN0aHJlZjExOSI+PC9hPjxhIGlkPSJzdGhyZWYxMjAiIG5hbWU9InN0aHJlZjEyMCI+PC9hPjxhIGlkPSJzdGhyZWYxMjEiIG5hbWU9InN0aHJlZjEyMSI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSBhIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgb2YgYW4gZW50aXR5IHdob3NlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIGFuIGVtYmVkZGFibGUgY2xhc3MuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgcmlnaHQtY2xpY2sgdGhlIGZpZWxkIHRvIG1hcC48L3A+Ci08L2xpPgotPGxpPgotPHA+U2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgYXMgJmd0OyBFbWJlZGRlZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE1IiBoZWFkZXJzPSJyMWMxLXQxNSI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTUgcjFjMi10MTUiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZDwvY29kZT4gYW5ub3RhdGlvbi48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNSByMWMzLXQxNSI+RW1iZWRkZWQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTUiIGhlYWRlcnM9InIxYzEtdDE1Ij5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMi10MTUiPlNwZWNpZnkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWFwcGluZyBvZiBhbiBlbnRpdHkncyBhdHRyaWJ1dGUuIFNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTUgcjFjMy10MTUiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkCi1AQXR0cmlidXRlT3ZlcnJpZGUoY29sdW1uPUBDb2x1bW4odGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fVEFCTEUmZ3Q7PC9zcGFuPiIsIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iKSkKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNWZiNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RW1iZWRkZWQgSUQgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFbWJlZGRlZCBJRCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lIRElBRUUiIG5hbWU9IkNJSERJQUVFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5FbWJlZGRlZCBJRCBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMjIiIG5hbWU9InN0aHJlZjEyMiI+PC9hPjxhIGlkPSJzdGhyZWYxMjMiIG5hbWU9InN0aHJlZjEyMyI+PC9hPjxhIGlkPSJzdGhyZWYxMjQiIG5hbWU9InN0aHJlZjEyNCI+PC9hPjxhIGlkPSJzdGhyZWYxMjUiIG5hbWU9InN0aHJlZjEyNSI+PC9hPlVzZSBhbiA8c3BhbiBjbGFzcz0iYm9sZCI+RW1iZWRkZWQgSUQgTWFwcGluZzwvc3Bhbj4gdG8gc3BlY2lmeSB0aGUgcHJpbWFyeSBrZXkgb2YgYW4gZW1iZWRkZWQgSUQuIFRoZXNlIG1hcHBpbmdzIG1heSBiZSB1c2VkIHdpdGggYSA8YSBocmVmPSJ0YXNrczAwNy5odG0jQkFCRkVJQ0UiPkVtYmVkZGFibGU8L2E+IGVudGl0aWVzLjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBFbWJlZGRlZCBJZDwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSByZW1haW5pbmcgZmllbGRzIG9uIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE2IiBoZWFkZXJzPSJyMWMxLXQxNiI+RW50aXR5IE1hcHBpbmcgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTYgcjFjMi10MTYiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPkVtYmVkZGVkIElkPC9zcGFuPi4KLTxwPlRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE2IHIxYzMtdDE2Ij5FbWJlZGRlZCBJZDwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQEVtYmVkZGVkSWQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYWRmODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDEzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPklEIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSUQgbWFwcGluZyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkdDQkhHIiBuYW1lPSJCQUJHQ0JIRyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QyIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+SUQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTI2IiBuYW1lPSJzdGhyZWYxMjYiPjwvYT48YSBpZD0ic3RocmVmMTI3IiBuYW1lPSJzdGhyZWYxMjciPjwvYT48YSBpZD0ic3RocmVmMTI4IiBuYW1lPSJzdGhyZWYxMjgiPjwvYT48YSBpZD0ic3RocmVmMTI5IiBuYW1lPSJzdGhyZWYxMjkiPjwvYT5Vc2UgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPklEIE1hcHBpbmc8L3NwYW4+IHRvIHNwZWNpZnkgdGhlIHByaW1hcnkga2V5IG9mIGFuIGVudGl0eS4gSUQgbWFwcGluZ3MgbWF5IGJlIHVzZWQgd2l0aCBhIDxhIGhyZWY9InRhc2tzMDA2Lmh0bSNCQUJHQklFRSI+RW50aXR5PC9hPiBvciA8YSBocmVmPSJ0YXNrczAwOC5odG0jQkFCREFHQ0kiPk1hcHBlZCBzdXBlcmNsYXNzPC9hPi4gRWFjaCA8YSBocmVmPSJ0YXNrczAwNi5odG0jQkFCR0JJRUUiPkVudGl0eTwvYT4gbXVzdCBoYXZlIGFuIElEIG1hcHBpbmcuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIHRoZSBmaWxlZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBhcyAmZ3Q7IElEPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMjIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjM1JSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDE3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MTciPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQxNyI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MTciIGhlYWRlcnM9InIxYzEtdDE3Ij5FbnRpdHkgTWFwcGluZyBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQxNyByMWMyLXQxNyI+RGVmaW5lcyB0aGlzIG1hcHBpbmcgYXMgYW4gPHNwYW4gY2xhc3M9ImJvbGQiPklEIE1hcHBpbmc8L3NwYW4+LgotPHA+VGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE3IHIxYzMtdDE3Ij5JRDwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE3IHIxYzItdDE3Ij5UaGUgZGF0YWJhc2UgY29sdW1uIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQxNyIgaGVhZGVycz0icjFjMS10MTciPlRhYmxlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMi10MTciPlRoZSBkYXRhYmFzZSB0YWJsZSBtYXBwZWQgdG8gdGhlIGVudGl0eSBhdHRyaWJ1dGUuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTcgcjFjMy10MTciPkJ5IGRlZmF1bHQsIHRoZSBUYWJsZSBpcyBhc3N1bWVkIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgdGFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDE3IiBoZWFkZXJzPSJyMWMxLXQxNyI+VGVtcG9yYWw8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMyLXQxNyI+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRhdGEuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNFQUpHRCI+IlRlbXBvcmFsIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EYXRlPC9wPgotPC9saT4KLTxsaT4KLTxwPlRpbWU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZXN0YW1wPC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxNyByMWMzLXQxNyI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiA8YSBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIj5QcmltYXJ5IEtleSBHZW5lcmF0aW9uIGluZm9ybWF0aW9uPC9hPiBhcmVhIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQSyBHZW5lcmF0aW9uIHRhYi4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUEsgR2VuZXJhdGlvbiB0YWIuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjIyJSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzNSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE4Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTgiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzItdDE4Ij5UaGVzZSBmaWVsZHMgZGVmaW5lIGhvdyB0aGUgcHJpbWFyeSBrZXkgaXMgZ2VuZXJhdGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE4IHIxYzMtdDE4Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTgiIGhlYWRlcnM9InIxYzEtdDE4Ij4mbmJzcDsmbmJzcDtTdHJhdGVneTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzItdDE4Ij5TZWUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNCQUpCQyI+IlByaW1hcnkgS2V5IEdlbmVyYXRpb24iPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkF1dG88L3A+Ci08L2xpPgotPGxpPgotPHA+U2VxdWVuY2U8L3A+Ci08L2xpPgotPGxpPgotPHA+SWRlbnRpdHk8L3A+Ci08L2xpPgotPGxpPgotPHA+VGFibGU8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE4IHIxYzMtdDE4Ij5BdXRvPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDE4IiBoZWFkZXJzPSJyMWMxLXQxOCI+Jm5ic3A7Jm5ic3A7R2VuZXJhdG9yJm5ic3A7TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE4IHIxYzItdDE4Ij5OYW1lIG9mIHRoZSBwcmltYXJ5IGtleSBnZW5lcmF0b3Igc3BlY2lmaWVkIGluIHRoZSA8c3BhbiBjbGFzcz0iYm9sZCI+U3RyYXRlZ3k8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTggcjFjMy10MTgiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5BZGRpdGlvbmFsIGZpZWxkcyB3aWxsIGFwcGVhciBpbiB0aGUgPGEgaHJlZj0icmVmX3ByaW1hcnlfa2V5Lmh0bSNDQUNGQ0NBQiI+UHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbjwvYT4gYXJlYSwgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBTdHJhdGVneS4gU2VlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPiJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPC9hPiBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi48L3A+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQElkCi1AQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgdGFibGU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtJTlNFUlRBQkxFJmd0Ozwvc3Bhbj4sCi0gICAgdXBkYXRhYmxlPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtVUERBVEFCTEUmZ3Q7PC9zcGFuPikKLUBUZW1wb3JhbCg8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEVNUE9SQUwmZ3Q7PC9zcGFuPikKLUBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0b3JUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtTVFJBVEVHWSZndDs8L3NwYW4+LCBnZW5lcmF0b3I9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IilAVGFibGVHZW5lcmF0b3IobmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9OQU1FJmd0Ozwvc3Bhbj4iLCB0YWJsZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfR0VORVJBVE9SX1RBQkxFJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtbk5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBQkxFX0dFTkVSQVRPUl9QSyZndDs8L3NwYW4+IiwgCi0gICAgdmFsdWVDb2x1bW5OYW1lID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OJmd0Ozwvc3Bhbj4iLCAKLSAgICBwa0NvbHVtblZhbHVlID0gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQUJMRV9HRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFJmd0Ozwvc3Bhbj4iKUBTZXF1ZW5jZUdlbmVyYXRvcihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7U0VRVUVOQ0VfR0VORVJBVE9SX05BTUUmZ3Q7PC9zcGFuPiIsIAotICAgIHNlcXVlbmNlTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSZndDs8L3NwYW4+IikKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNTgxOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbnktdG8tbWFueSBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ0WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1hbnktdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRUlFR0QiIG5hbWU9IkJBQkVJRUdEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW1hbnkgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTMwIiBuYW1lPSJzdGhyZWYxMzAiPjwvYT48YSBpZD0ic3RocmVmMTMxIiBuYW1lPSJzdGhyZWYxMzEiPjwvYT48YSBpZD0ic3RocmVmMTMyIiBuYW1lPSJzdGhyZWYxMzIiPjwvYT48YSBpZD0ic3RocmVmMTMzIiBuYW1lPSJzdGhyZWYxMzMiPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+TWFueS10by1NYW55IE1hcHBpbmc8L3NwYW4+IHRvIGRlZmluZSBhIG1hbnktdmFsdWVkIGFzc29jaWF0aW9uIHdpdGggbWFueS10by1tYW55IG11bHRpcGxpY2l0eS4gQSBtYW55LXRvLW1hbnkgbWFwcGluZyBoYXMgdHdvIHNpZGVzOiB0aGUgPHNwYW4gY2xhc3M9Iml0YWxpYyI+b3duaW5nIHNpZGU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0iaXRhbGljIj5ub24tb3duaW5nIHNpZGU8L3NwYW4+LiBZb3UgbXVzdCBzcGVjaWZ5IHRoZSBqb2luIHRhYmxlIG9uIHRoZSBvd25pbmcgc2lkZS4gRm9yIGJpZGlyZWN0aW9uYWwgbWFwcGluZ3MsIGVpdGhlciBzaWRlIG1heSBiZSB0aGUgb3duaW5nIHNpZGUuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tTWFueTwvc3Bhbj4uIFRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+IGRpc3BsYXlzIHRoZSBwcm9wZXJ0aWVzIGZvciB0aGUgc2VsZWN0ZWQgZmllbGQuPC9wPgotPC9saT4KLTxsaT4KLTxwPlVzZSB0aGlzIHRhYmxlIHRvIGNvbXBsZXRlIHRoZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiI+R2VuZXJhbCBpbmZvcm1hdGlvbjwvYT4gZmllbGRzIG9mIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQxOSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDE5Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MTkiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDE5IiBoZWFkZXJzPSJyMWMxLXQxOSI+TWFwcGluZyBFbnRpdHkgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MTkgcjFjMi10MTkiPkRlZmluZXMgdGhpcyBtYXBwaW5nIGFzIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk1hbnkgdG8gTWFueSBNYXBwaW5nPC9zcGFuPi4KLTxwPlRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDE5IHIxYzMtdDE5Ij5NYW55IHRvIE1hbnk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5UYXJnZXQgRW50aXR5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MTkgcjFjMi10MTkiPlRoZSBlbnRpdHkgdG8gd2hpY2ggdGhpcyBhdHRyaWJ1dGUgaXMgbWFwcGVkLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDE5IHIxYzMtdDE5Ij5udWxsCi08cD5Zb3UgZG8gbm90IG5lZWQgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0YXJnZXQgZW50aXR5LCBzaW5jZSBpdCBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgdHlwZSBvZiBvYmplY3QgYmVpbmcgcmVmZXJlbmNlZC48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5GZXRjaDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDE5IHIxYzItdDE5Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MTkgcjFjMy10MTkiPkxhenk8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQxOSByMWMyLXQxOSI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDE5IHIxYzMtdDE5Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MTkiIGhlYWRlcnM9InIxYzEtdDE5Ij5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDE5IHIxYzItdDE5Ij5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjZjMS10MTkgcjFjMy10MTkiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBpbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gYXJlYSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEZXRhaWxzPC9zcGFuPiB2aWV3LjwvcD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBKb2luIFRhYmxlIHRhYiBvZiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyMCI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIwIj5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjAiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+TmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIwIHIxYzItdDIwIj5OYW1lIG9mIHRoZSBqb2luIHRhYmxlIHRoYXQgY29udGFpbnMgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMCByMWMzLXQyMCI+WW91IG11c3Qgc3BlY2lmeSB0aGUgam9pbiB0YWJsZSBvbiB0aGUgb3duaW5nIHNpZGUuCi08cD5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIwIiBoZWFkZXJzPSJyMWMxLXQyMCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG5hbWUgaXMgYXNzdW1lZCB0byBiZSB0aGUgcHJpbWFyeSB0YWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdGllcyBjb25jYXRlbmF0ZWQgd2l0aCBhbiB1bmRlcnNjb3JlLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMCIgaGVhZGVycz0icjFjMS10MjAiPkludmVyc2UgSm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjAgcjFjMi10MjAiPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMCByMWMzLXQyMCI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VG8gYWRkIGEgbmV3IEpvaW4gb3IgSW52ZXJzZSBKb2luIENvbHVtbiwgY2xpY2sgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtYWN0aW9uIj5BZGQ8L3NwYW4+LjwvcD4KLTxwPlRvIGVkaXQgYW4gZXhpc3RpbmcgSm9pbiBvciBJbnZlcnNlIEpvaW4gQ29sdW1uLCBzZWxlY3QgdGhlIGZpZWxkIHRvIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPkVkaXQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBKb2luVGFibGUoam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OJmd0Ozwvc3Bhbj4iKSwgCi0gICAgbmFtZSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iKQotQE1hbnlUb01hbnkoY2FzY2FkZT1DYXNjYWRlVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q0FTQ0FERV9UWVBFJmd0Ozwvc3Bhbj4sIGZldGNoPUZldGNoVHlwZS48c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7RkVUQ0hfVFlQRSZndDs8L3NwYW4+LAotICAgIHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBtYXBwZWRCeSA9ICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7TUFQUEVEX0JZJmd0Ozwvc3Bhbj4iKQotQE9yZGVyQnkoIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtPUkRFUl9CWSZndDs8L3NwYW4+IikKLQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlYmE2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TWFueS10by1vbmUgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNYW55LXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZBRkoiIG5hbWU9IkJBQkhGQUZKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5NYW55LXRvLW9uZSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxMzQiIG5hbWU9InN0aHJlZjEzNCI+PC9hPjxhIGlkPSJzdGhyZWYxMzUiIG5hbWU9InN0aHJlZjEzNSI+PC9hPjxhIGlkPSJzdGhyZWYxMzYiIG5hbWU9InN0aHJlZjEzNiI+PC9hPjxhIGlkPSJzdGhyZWYxMzciIG5hbWU9InN0aHJlZjEzNyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4gbWFwcGluZyB0byBkZWZpbmVzIGEgc2luZ2xlLXZhbHVlZCBhc3NvY2lhdGlvbiB0byBhbm90aGVyIGVudGl0eSBjbGFzcyB0aGF0IGhhcyBtYW55LXRvLW9uZSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0IGNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE1hbnktdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW9uIHRoZSBHZW5lcmFsIHRhYiBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGlvbiB0aGUgR2VuZXJhbCB0YWIgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIxIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjEiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMSI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5NYXBwaW5nIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMSByMWMyLXQyMSI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5NYW55LXRvLU9uZTwvc3Bhbj4uIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBNYW55VG9PbmU8L2NvZGU+IGFubm90YXRpb24uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjEgcjFjMy10MjEiPk1hbnktdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDIxIHIxYzItdDIxIj5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMSByMWMzLXQyMSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDIxIiBoZWFkZXJzPSJyMWMxLXQyMSI+RmV0Y2g8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMSByMWMyLXQyMSI+RGVmaW5lcyBob3cgZGF0YSBpcyBsb2FkZWQgZnJvbSB0aGUgZGF0YWJhc2UuIFNlZSA8YSBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNHR0dIQiI+IkZldGNoIFR5cGUiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkVhZ2VyPC9wPgotPC9saT4KLTxsaT4KLTxwPkxhenk8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDIxIHIxYzMtdDIxIj5FYWdlcjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMSIgaGVhZGVycz0icjFjMS10MjEiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMSByMWMyLXQyMSI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjEgcjFjMy10MjEiPkRlZmF1bHQ8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjEiIGhlYWRlcnM9InIxYzEtdDIxIj5PcHRpb25hbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIxIHIxYzItdDIxIj5TcGVjaWZpZXMgaWYgdGhpcyBmaWVsZCBpcyBjYW4gYmUgbnVsbC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMSByMWMzLXQyMSI+WWVzPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIGZpZWxkcyBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDEyLmh0bSNDQUNGQ0VKQyI+Sm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uPC9hPiB0YWIgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5KUEEgRGV0YWlsczwvc3Bhbj4gdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMTklIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTxjb2wgd2lkdGg9IjQxJSIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDIyIj5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MjIiPkRlc2NyaXB0aW9uPC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMzLXQyMiI+RGVmYXVsdDwvdGg+Ci08L3RyPgotPC90aGVhZD4KLTx0Ym9keT4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjJjMS10MjIiIGhlYWRlcnM9InIxYzEtdDIyIj5Kb2luIENvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIyIHIxYzItdDIyIj48YSBpZD0ic3RocmVmMTM4IiBuYW1lPSJzdGhyZWYxMzgiPjwvYT48YSBpZD0ic3RocmVmMTM5IiBuYW1lPSJzdGhyZWYxMzkiPjwvYT5TcGVjaWZ5IGEgbWFwcGVkIGNvbHVtbiBmb3Igam9pbmluZyBhbiBlbnRpdHkgYXNzb2NpYXRpb24uIFRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPkBKb2luQ29sdW08L2NvZGU+IGF0dHJpYnV0ZS4KLTxwPlNlbGVjdCA8c3BhbiBjbGFzcz0iYm9sZCI+T3ZlcnJpZGUgRGVmYXVsdDwvc3Bhbj4sIHRoZW4gQWRkLCBFZGl0LCBvciBSZW1vdmUgdGhlIGpvaW4gY29sdW1ucy48L3A+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyMiByMWMzLXQyMiI+QnkgZGVmYXVsdCwgdGhlIG1hcHBpbmcgaXMgYXNzdW1lZCB0byBoYXZlIGEgc2luZ2xlIGpvaW4uPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb25zIHRvIHRoZSBmaWVsZDo8L3A+Ci08cHJlIHhtbDpzcGFjZT0icHJlc2VydmUiIGNsYXNzPSJvYWNfbm9fd2FybiI+Ci1ASm9pblRhYmxlKGpvaW5Db2x1bW5zPUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTiZndDs8L3NwYW4+IiksIAotICAgIG5hbWUgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fVEFCTEVfTkFNRSZndDs8L3NwYW4+IikKLUBNYW55VG9PbmUodGFyZ2V0RW50aXR5PTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtUQVJHRVRfRU5USVRZJmd0Ozwvc3Bhbj4sIGZldGNoPTxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtGRVRDSF9UWVBFJmd0Ozwvc3Bhbj4sIAotICAgIGNhc2NhZGU9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NBU0NBREVfVFlQRSZndDs8L3NwYW4+KQotPC9wcmU+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsdC5wbmciIGFsdD0iUmVsYXRlZCB0YXNrIiB0aXRsZT0iUmVsYXRlZCB0YXNrIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJ0YXNrX21hcHBpbmcuaHRtI0JBQkRHQklKIj5NYXBwaW5nIGFuIGVudGl0eTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT48YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRfbWFwcGluZy5odG0jQkFCQkRKRkkiPlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3M8L2E+PGJyIC8+Ci08YSBocmVmPSJjb25jZXB0czAwMS5odG0jQkFCQkdGSkciPlVuZGVyc3RhbmRpbmcgRUpCIDMuMCBKYXZhIFBlcnNpc3RlbmNlIEFQSTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE2Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3Yzc0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTYuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+T25lLXRvLW1hbnkgbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NFoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEdFQkQiIG5hbWU9IkJBQkhHRUJEIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tbWFueSBtYXBwaW5nPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNDAiIG5hbWU9InN0aHJlZjE0MCI+PC9hPjxhIGlkPSJzdGhyZWYxNDEiIG5hbWU9InN0aHJlZjE0MSI+PC9hPjxhIGlkPSJzdGhyZWYxNDIiIG5hbWU9InN0aHJlZjE0MiI+PC9hPjxhIGlkPSJzdGhyZWYxNDMiIG5hbWU9InN0aHJlZjE0MyI+PC9hPlVzZSBhIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tTWFueSBNYXBwaW5nPC9zcGFuPiB0byBkZWZpbmUgYSByZWxhdGlvbnNoaXAgd2l0aCBvbmUtdG8tbWFueSBtdWx0aXBsaWNpdHkuPC9wPgotPG9sPgotPGxpPgotPHA+SW4gdGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPiwgc2VsZWN0IHRoZSBmaWVsZCB0byBtYXAuPC9wPgotPC9saT4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBmaWVsZCBhbmQgdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk1hcCBBcyAmZ3Q7IE9uZS10by1tYW55PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEdlbmVyYWwgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgR2VuZXJhbCB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjMiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyMyI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDIzIj5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPk1hcHBpbmcgRW50aXR5IFR5cGUgSHlwZXJsaW5rPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjMgcjFjMi10MjMiPkRlZmluZXMgbWFwcGluZyBhcyA8c3BhbiBjbGFzcz0iYm9sZCI+T25lLXRvLU1hbnk8L3NwYW4+LiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AT25lVG9NYW55PC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIzIHIxYzMtdDIzIj5PbmUtdG8tTWFueTwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPlRhcmdldCBFbnRpdHk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyMyByMWMyLXQyMyI+VGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBpcyBtYXBwZWQuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNGMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPkNhc2NhZGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyMyByMWMyLXQyMyI+U2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0pBSUhCIj4iQ2FzY2FkZSBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5EZWZhdWx0PC9wPgotPC9saT4KLTxsaT4KLTxwPkFsbDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5QZXJzaXN0PC9wPgotPC9saT4KLTxsaT4KLTxwPk1lcmdlPC9wPgotPC9saT4KLTxsaT4KLTxwPlJlbW92ZTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjMgcjFjMy10MjMiPjxiciAvPjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyNWMxLXQyMyIgaGVhZGVycz0icjFjMS10MjMiPkZldGNoPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjMgcjFjMi10MjMiPkRlZmluZXMgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiBTZWUgPGEgaHJlZj0icmVmX21hcHBpbmdfZ2VuZXJhbC5odG0jQ0FDR0dHSEIiPiJGZXRjaCBUeXBlIjwvYT4gZm9yIGRldGFpbHMuCi08dWw+Ci08bGk+Ci08cD5FYWdlcjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5MYXp5PC9wPgotPC9saT4KLTwvdWw+Ci08L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyMyByMWMzLXQyMyI+RWFnZXI8L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjZjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5NYXBwZWQgQnk8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNmMxLXQyMyByMWMyLXQyMyI+VGhlIGRhdGFiYXNlIGZpZWxkIHRoYXQgb3ducyB0aGUgcmVsYXRpb25zaGlwLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI2YzEtdDIzIHIxYzMtdDIzIj48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjdjMS10MjMiIGhlYWRlcnM9InIxYzEtdDIzIj5PcmRlciBCeTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI3YzEtdDIzIHIxYzItdDIzIj5TcGVjaWZ5IHRoZSBkZWZhdWx0IG9yZGVyIGZvciBvYmplY3RzIHJldHVybmVkIGZyb20gYSBxdWVyeS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0RBRElIIj4iT3JkZXIgQnkiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPk5vIG9yZGVyaW5nPC9wPgotPC9saT4KLTxsaT4KLTxwPlByaW1hcnkga2V5PC9wPgotPC9saT4KLTxsaT4KLTxwPkN1c3RvbTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjdjMS10MjMgcjFjMy10MjMiPk5vIG9yZGVyaW5nPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiPkpvaW4gVGFibGUgSW5mb3JtYXRpb248L2E+IGZpZWxkcyBpbiB0aGUgSlBBIERldGFpbHMgdmlldy48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiPgotPHRhYmxlIGNsYXNzPSJSdWxlSW5mb3JtYWwiIHRpdGxlPSJUaGlzIHRhYmxlIGxpc3RzIHRoZSBmaWVsZHMgaW4gdGhlIEpvaW4gVGFibGUgdGFiIG9mIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgSm9pbiBUYWJsZSB0YWIgb2YgdGhlIFBlcnNpc3RlbmNlIFByb3BlcnRpZXMgdmlldyBmb3IgdGhpcyBtYXBwaW5nLiIgZGlyPSJsdHIiIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiIGZyYW1lPSJib3JkZXIiIHJ1bGVzPSJhbGwiIGNlbGxwYWRkaW5nPSIzIiBjZWxsc3BhY2luZz0iMCI+Ci08Y29sIHdpZHRoPSIxOSUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPGNvbCB3aWR0aD0iMzglIiAvPgotPHRoZWFkPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMS10MjQiPlByb3BlcnR5PC90aD4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMyLXQyNCI+RGVzY3JpcHRpb248L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzMtdDI0Ij5EZWZhdWx0PC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyNCIgaGVhZGVycz0icjFjMS10MjQiPk5hbWU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNCByMWMyLXQyNCI+TmFtZSBvZiB0aGUgam9pbiB0YWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI0IHIxYzMtdDI0Ij5CeSBkZWZhdWx0LCB0aGUgbmFtZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBwcmltYXJ5IHRhYmxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudGl0aWVzIGNvbmNhdGVuYXRlZCB3aXRoIGFuIHVuZGVyc2NvcmUuPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+Sm9pbiBDb2x1bW5zPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjQgcjFjMi10MjQiPlNwZWNpZnkgdHdvIG9yIG1vcmUgam9pbiBjb2x1bW5zICh0aGF0IGlzLCBhIHByaW1hcnkga2V5KS48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNCByMWMzLXQyNCI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI0IiBoZWFkZXJzPSJyMWMxLXQyNCI+SW52ZXJzZSBKb2luIENvbHVtbnM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNGMxLXQyNCByMWMyLXQyNCI+VGhlIGpvaW4gY29sdW1uIG9uIHRoZSBvd25lZCAob3IgaW52ZXJzZSkgc2lkZSBvZiB0aGUgYXNzb2NpYXRpb246IHRoZSBvd25lZCBlbnRpdHkncyBwcmltYXJ5IGtleSBjb2x1bW4uPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjQgcjFjMy10MjQiPjxiciAvPjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvTWFueSh0YXJnZXRFbnRpdHk9PHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1RBUkdFVF9FTlRJVFkmZ3Q7PC9zcGFuPikKLUBDb2x1bW4obmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NPTFVNTiZndDs8L3NwYW4+IikKLQotCi1AT25lVG9NYW55KHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LmNsYXNzLCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IilAT3JkZXJCeSgiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O09SREVSX0JZJmd0Ozwvc3Bhbj4iKQotQEpvaW5UYWJsZShuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9UQUJMRV9OQU1FJmd0Ozwvc3Bhbj4iLCBqb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPQotICAgICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Sk9JTl9DT0xVTU5fTkFNRSZndDs8L3NwYW4+IiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTiZndDs8L3NwYW4+IiksIAotICAgIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7SU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCAKLSAgICByZWZlcmVuY2VkQ29sdW1uTmFtZT0iPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU4mZ3Q7PC9zcGFuPiIpKQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU4ZjhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxNy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5PbmUtdG8tb25lIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDRaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCRkhCQ0oiIG5hbWU9IkJBQkZIQkNKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5PbmUtdG8tb25lIG1hcHBpbmc8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE0NCIgbmFtZT0ic3RocmVmMTQ0Ij48L2E+PGEgaWQ9InN0aHJlZjE0NSIgbmFtZT0ic3RocmVmMTQ1Ij48L2E+PGEgaWQ9InN0aHJlZjE0NiIgbmFtZT0ic3RocmVmMTQ2Ij48L2E+PGEgaWQ9InN0aHJlZjE0NyIgbmFtZT0ic3RocmVmMTQ3Ij48L2E+VXNlIGEgPHNwYW4gY2xhc3M9ImJvbGQiPk9uZS10by1PbmUgTWFwcGluZzwvc3Bhbj4gdG8gZGVmaW5lIGEgcmVsYXRpb25zaGlwIHdpdGggb25lLXRvLW1hbnkgbXVsdGlwbGljaXR5LjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBPbmUtdG8tT25lPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0JIRklKIj5HZW5lcmFsIGluZm9ybWF0aW9uPC9hPiBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNSI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI1Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjUiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNSByMWMyLXQyNSI+RGVmaW5lcyBtYXBwaW5nIGFzIDxzcGFuIGNsYXNzPSJib2xkIj5PbmUtdG8tT25lPC9zcGFuPi4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+QE9uZVRvT25lPC9jb2RlPiBhbm5vdGF0aW9uLjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDI1IHIxYzMtdDI1Ij5PbmUtdG8tT25lPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+VGFyZ2V0IEVudGl0eTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI1IHIxYzItdDI1Ij5UaGUgZW50aXR5IHRvIHdoaWNoIHRoaXMgYXR0cmlidXRlIGlzIG1hcHBlZC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQyNSByMWMzLXQyNSI+bnVsbAotPHA+WW91IGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgdGFyZ2V0IGVudGl0eSwgc2luY2UgaXQgY2FuIGJlIGluZmVycmVkIGZyb20gdGhlIHR5cGUgb2Ygb2JqZWN0IGJlaW5nIHJlZmVyZW5jZWQuPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+RmV0Y2ggVHlwZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI1IHIxYzItdDI1Ij5EZWZpbmVzIGhvdyBkYXRhIGlzIGxvYWRlZCBmcm9tIHRoZSBkYXRhYmFzZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dHR0hCIj4iRmV0Y2ggVHlwZSI8L2E+IGZvciBkZXRhaWxzLgotPHVsPgotPGxpPgotPHA+RWFnZXI8L3A+Ci08L2xpPgotPGxpPgotPHA+TGF6eTwvcD4KLTwvbGk+Ci08L3VsPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MjUgcjFjMy10MjUiPkVhZ2VyPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI1YzEtdDI1IiBoZWFkZXJzPSJyMWMxLXQyNSI+TWFwcGVkIEJ5PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjVjMS10MjUgcjFjMi10MjUiPlRoZSBkYXRhYmFzZSBmaWVsZCB0aGF0IG93bnMgdGhlIHJlbGF0aW9uc2hpcC48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyNWMxLXQyNSByMWMzLXQyNSI+PGJyIC8+PC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIiAtLT48L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIDxhIGhyZWY9InJlZmVyZW5jZTAxMi5odG0jQ0FDRkNFSkMiPkpvaW4gQ29sdW1ucyBJbmZvcm1hdGlvbjwvYT4gZmllbGRzIGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+SlBBIERldGFpbHM8L3NwYW4+IHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSI0MSUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNiI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI2Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjYiPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI2IiBoZWFkZXJzPSJyMWMxLXQyNiI+Sm9pbiBDb2x1bW48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNiByMWMyLXQyNiI+PGEgaWQ9InN0aHJlZjE0OCIgbmFtZT0ic3RocmVmMTQ4Ij48L2E+PGEgaWQ9InN0aHJlZjE0OSIgbmFtZT0ic3RocmVmMTQ5Ij48L2E+U3BlY2lmeSBhIG1hcHBlZCBjb2x1bW4gZm9yIGpvaW5pbmcgYW4gZW50aXR5IGFzc29jaWF0aW9uLiBUaGlzIGZpZWxkIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5ASm9pbkNvbHVtPC9jb2RlPiBhdHRyaWJ1dGUuCi08cD5TZWxlY3QgPHNwYW4gY2xhc3M9ImJvbGQiPk92ZXJyaWRlIERlZmF1bHQ8L3NwYW4+LCB0aGVuIEFkZCwgRWRpdCwgb3IgUmVtb3ZlIHRoZSBqb2luIGNvbHVtbnMuPC9wPgotPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjJjMS10MjYgcjFjMy10MjYiPkJ5IGRlZmF1bHQsIHRoZSBtYXBwaW5nIGlzIGFzc3VtZWQgdG8gaGF2ZSBhIHNpbmdsZSBqb2luLjwvdGQ+Ci08L3RyPgotPC90Ym9keT4KLTwvdGFibGU+Ci08YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCIgLS0+PC9saT4KLTwvb2w+Ci08cD5FY2xpcHNlIGFkZHMgdGhlIGZvbGxvd2luZyBhbm5vdGF0aW9ucyB0byB0aGUgZmllbGQ6PC9wPgotPHByZSB4bWw6c3BhY2U9InByZXNlcnZlIiBjbGFzcz0ib2FjX25vX3dhcm4iPgotQE9uZVRvT25lKHRhcmdldEVudGl0eT08c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFSR0VUX0VOVElUWSZndDs8L3NwYW4+LCBjYXNjYWRlPUNhc2NhZGVUeXBlLjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDQVNDQURFX1RZUEUmZ3Q7PC9zcGFuPiwgCi0gICAgZmV0Y2ggPSBGZXRjaFR5cGUuPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0ZFVENIX1RZUEUmZ3Q7PC9zcGFuPiwgbWFwcGVkQnkgPSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O01BUFBFRF9CWSZndDs8L3NwYW4+IikKLUBKb2luQ29sdW1uKG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtKT0lOX0NPTFVNTl9OQU1FJmd0Ozwvc3Bhbj4iLCByZWZlcmVuY2VkQ29sdW1uTmFtZT0KLSAgICAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OJmd0Ozwvc3Bhbj4iLCBpbnNlcnRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0lOU0VSVEFCTEUmZ3Q7PC9zcGFuPiwgCi0gICAgdXBkYXRhYmxlID0gPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O1VQREFUQUJMRSZndDs8L3NwYW4+KQotCi08L3ByZT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPk1hcHBpbmcgYW4gZW50aXR5PC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHIucG5nIiBhbHQ9IlJlbGF0ZWQgcmVmZXJlbmNlIiB0aXRsZT0iUmVsYXRlZCByZWZlcmVuY2UiIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9vdXRsaW5lLmh0bSNCQUJFR0dGRSI+SlBBIFN0cnVjdHVyZSB2aWV3PC9hPjxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+SlBBIERldGFpbHMgdmlldyAoZm9yIGF0dHJpYnV0ZXMpPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSI+VW5kZXJzdGFuZGluZyBPUiBtYXBwaW5nczwvYT48YnIgLz4KLTxhIGhyZWY9ImNvbmNlcHRzMDAxLmh0bSNCQUJCR0ZKRyI+VW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJPC9hPjwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMTguaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRiZGIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRyYW5zaWVudCBtYXBwaW5nPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlRyYW5zaWVudCBtYXBwaW5nIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQkFCSEZIRUkiIG5hbWU9IkJBQkhGSEVJIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDIiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5UcmFuc2llbnQgbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTUwIiBuYW1lPSJzdGhyZWYxNTAiPjwvYT48YSBpZD0ic3RocmVmMTUxIiBuYW1lPSJzdGhyZWYxNTEiPjwvYT48YSBpZD0ic3RocmVmMTUyIiBuYW1lPSJzdGhyZWYxNTIiPjwvYT48YSBpZD0ic3RocmVmMTUzIiBuYW1lPSJzdGhyZWYxNTMiPjwvYT5Vc2UgdGhlIFRyYW5zaWVudCBNYXBwaW5nIHRvIHNwZWNpZnkgYSBmaWVsZCBvZiB0aGUgZW50aXR5IGNsYXNzIHRoYXQgPHNwYW4gY2xhc3M9Iml0YWxpYyI+aXMgbm90PC9zcGFuPiBwZXJzaXN0ZW50LjwvcD4KLTxwPlRvIGNyZWF0ZSBhIHRyYW5zaWVudCBtYXBwaW5nOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgVHJhbnNpZW50PC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgYWRkcyB0aGUgZm9sbG93aW5nIGFubm90YXRpb24gdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBUcmFuc2llbnQKLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAxOS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjMyMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDE5Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlZlcnNpb24gbWFwcGluZzwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJWZXJzaW9uIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJCQUJISUJJSSIgbmFtZT0iQkFCSElCSUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlZlcnNpb24gbWFwcGluZzwvaDE+Ci08cD48YSBpZD0ic3RocmVmMTU0IiBuYW1lPSJzdGhyZWYxNTQiPjwvYT48YSBpZD0ic3RocmVmMTU1IiBuYW1lPSJzdGhyZWYxNTUiPjwvYT48YSBpZD0ic3RocmVmMTU2IiBuYW1lPSJzdGhyZWYxNTYiPjwvYT48YSBpZD0ic3RocmVmMTU3IiBuYW1lPSJzdGhyZWYxNTciPjwvYT5Vc2UgYSA8c3BhbiBjbGFzcz0iYm9sZCI+VmVyc2lvbiBNYXBwaW5nPC9zcGFuPiB0byBzcGVjaWZ5IHRoZSBmaWVsZCB1c2VkIGZvciBvcHRpbWlzdGljIGxvY2tpbmcuIElmIHRoZSBlbnRpdHkgaXMgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIHRhYmxlcywgeW91IHNob3VsZCB1c2UgYSB2ZXJzaW9uIG1hcHBpbmcgb25seSB3aXRoIHRoZSBwcmltYXJ5IHRhYmxlLiBZb3Ugc2hvdWxkIGhhdmUgb25seSBhIHNpbmdsZSB2ZXJzaW9uIG1hcHBpbmcgcGVyIHBlcnNpc3RlbnQgZW50aXR5LiBWZXJzaW9uIG1hcHBpbmdzIG1heSBiZSB1c2VkIG9ubHkgd2l0aCB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZSB0eXBlczo8L3A+Ci08dWw+Ci08bGk+Ci08cD48Y29kZT5pbnQ8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPkludGVnZXI8L2NvZGU+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxjb2RlPnNob3J0LCBTaG9ydDwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+bG9uZywgTG9uZzwvY29kZT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGNvZGU+VGltZXN0YW1wPC9jb2RlPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+VG8gY3JlYXRlIGEgdmVyc2lvbiBtYXBwaW5nOjwvcD4KLTxvbD4KLTxsaT4KLTxwPkluIHRoZSA8YSBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiPkpQQSBTdHJ1Y3R1cmUgdmlldzwvYT4sIHNlbGVjdCB0aGUgZmllbGQgdG8gbWFwLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgZmllbGQgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJib2xkIj5NYXAgQXMgJmd0OyBWZXJzaW9uPC9zcGFuPi4gVGhlIDxhIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiPkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKTwvYT4gZGlzcGxheXMgdGhlIHByb3BlcnRpZXMgZm9yIHRoZSBzZWxlY3RlZC48L3A+Ci08L2xpPgotPGxpPgotPHA+VXNlIHRoaXMgdGFibGUgdG8gY29tcGxldGUgdGhlIHJlbWFpbmluZyBmaWVsZHMgaW4gdGhlIEpQQSBEZXRhaWxzIHZpZXcuPC9wPgotPGRpdiBjbGFzcz0iaW5mdGJscnVsZWluZm9ybWFsIj4KLTx0YWJsZSBjbGFzcz0iUnVsZUluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgZmllbGRzIGluIHRoZSBQZXJzaXN0ZW5jZSBQcm9wZXJ0aWVzIHZpZXcgZm9yIHRoaXMgbWFwcGluZy4iIHN1bW1hcnk9IlRoaXMgdGFibGUgbGlzdHMgdGhlIGZpZWxkcyBpbiB0aGUgUGVyc2lzdGVuY2UgUHJvcGVydGllcyB2aWV3IGZvciB0aGlzIG1hcHBpbmcuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjE5JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08Y29sIHdpZHRoPSIzOCUiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyNyI+UHJvcGVydHk8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDI3Ij5EZXNjcmlwdGlvbjwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMy10MjciPkRlZmF1bHQ8L3RoPgotPC90cj4KLTwvdGhlYWQ+Ci08dGJvZHk+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIyYzEtdDI3IiBoZWFkZXJzPSJyMWMxLXQyNyI+TWFwcGVkIEVudGl0eSBIeXBlcmxpbms8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMyLXQyNyI+RGVmaW5lcyB0aGUgbWFwcGluZyBhcyBWZXJzaW9uLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5AVmVyc2lvbjwvY29kZT4gYW5ub3RhdGlvbi48L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQyNyByMWMzLXQyNyI+VmVyc2lvbjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyNyIgaGVhZGVycz0icjFjMS10MjciPkNvbHVtbjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDI3IHIxYzItdDI3Ij5UaGUgZGF0YWJhc2UgY29sdW1uIG1hcHBlZCB0byB0aGUgZW50aXR5IGF0dHJpYnV0ZS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0dDQkhCIj4iQ29sdW1uIjwvYT4gZm9yIGRldGFpbHMuPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MjcgcjFjMy10MjciPkJ5IGRlZmF1bHQsIHRoZSBDb2x1bW4gaXMgYXNzdW1lZCB0byBiZSBuYW1lZCBpZGVudGljYWxseSB0byB0aGUgYXR0cmlidXRlIGFuZCBhbHdheXMgaW5jbHVkZWQgaW4gdGhlIDxjb2RlPklOU0VSVDwvY29kZT4gYW5kIDxjb2RlPlVQREFURTwvY29kZT4gc3RhdGVtZW50cy48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5UYWJsZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzItdDI3Ij5OYW1lIG9mIHRoZSBkYXRhYmFzZSB0YWJsZS4gVGhpcyBtdXN0IGJlIHRoZSBwcmltYXJ5IHRhYmxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlJ3MgZW50aXR5LjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjVjMS10MjciIGhlYWRlcnM9InIxYzEtdDI3Ij5UZW1wb3JhbDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzItdDI3Ij5TcGVjaWZpZXMgdGhlIHR5cGUgb2YgZGF0YS4gU2VlIDxhIGhyZWY9InJlZl9tYXBwaW5nX2dlbmVyYWwuaHRtI0NBQ0VBSkdEIj4iVGVtcG9yYWwiPC9hPiBmb3IgZGV0YWlscy4KLTx1bD4KLTxsaT4KLTxwPkRhdGU8L3A+Ci08L2xpPgotPGxpPgotPHA+VGltZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5UaW1lc3RhbXA8L3A+Ci08L2xpPgotPC91bD4KLTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI1YzEtdDI3IHIxYzMtdDI3Ij48YnIgLz48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPjwvbGk+Ci08L29sPgotPHA+RWNsaXBzZSBhZGRzIHRoZSBmb2xsb3dpbmcgYW5ub3RhdGlvbnMgdG8gdGhlIGZpZWxkOjwvcD4KLTxwcmUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgY2xhc3M9Im9hY19ub193YXJuIj4KLUBWZXJzaW9uCi1AQ29sdW1uKHRhYmxlPSI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX1RBQkxFJmd0Ozwvc3Bhbj4iLCBuYW1lPSImbHQ7PHNwYW4gY2xhc3M9Iml0YWxpYyI+Q09MVU1OX05BTUU8L3NwYW4+Jmd0OyIpCi0KLTwvcHJlPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbHQucG5nIiBhbHQ9IlJlbGF0ZWQgdGFzayIgdGl0bGU9IlJlbGF0ZWQgdGFzayIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiI+TWFwcGluZyBhbiBlbnRpdHk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX291dGxpbmUuaHRtI0JBQkVHR0ZFIj5KUEEgU3RydWN0dXJlIHZpZXc8L2E+PGJyIC8+Ci08YSBocmVmPSJyZWZfcGVyc2lzdGVuY2VfbWFwX3ZpZXcuaHRtI0JBQklGQkFGIj5KUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcyk8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsYy5wbmciIGFsdD0iUmVsYXRlZCBjb25jZXB0IiB0aXRsZT0iUmVsYXRlZCBjb25jZXB0IiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJjb25jZXB0X21hcHBpbmcuaHRtI0JBQkJESkZJIj5VbmRlcnN0YW5kaW5nIE9SIG1hcHBpbmdzPC9hPjxiciAvPgotPGEgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIj5VbmRlcnN0YW5kaW5nIEVKQiAzLjAgSmF2YSBQZXJzaXN0ZW5jZSBBUEk8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ODVjZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIwLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RWxlbWVudCBDb2xsZWN0aW9uIG1hcHBpbmc8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRWxlbWVudCBDb2xsZWN0aW9uIG1hcHBpbmciIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhCREVBSiIgbmFtZT0iQ0lIQkRFQUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVsZW1lbnQgQ29sbGVjdGlvbiBtYXBwaW5nPC9oMT4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDIiIC0tPgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjEuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThlYmI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgZW50aXRpZXMgZnJvbSB0YWJsZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkJBR0ZJIiBuYW1lPSJCQUJCQUdGSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5HZW5lcmF0aW5nIGVudGl0aWVzIGZyb20gdGFibGVzPC9oMT4KLTxwPjxhIGlkPSJzdGhyZWYxNTgiIG5hbWU9InN0aHJlZjE1OCI+PC9hPjxhIGlkPSJzdGhyZWYxNTkiIG5hbWU9InN0aHJlZjE1OSI+PC9hPlVzZSB0aGlzIHByb2NlZHVyZSB0byBnZW5lcmF0ZSBKYXZhIHBlcnNpc3RlbnQgZW50aXRpZXMgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIFlvdSBtdXN0IGNyZWF0ZSBhIEpQQSBwcm9qZWN0IGFuZCBlc3RhYmxpc2ggYSBkYXRhYmFzZSBjb25uZWN0aW9uIDxzcGFuIGNsYXNzPSJpdGFsaWMiPmJlZm9yZTwvc3Bhbj4gZ2VuZXJhdGluZyBwZXJzaXN0ZW50IGVudGl0aWVzLiBTZWUgPGEgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIj4iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48YSBpZD0ic3RocmVmMTYwIiBuYW1lPSJzdGhyZWYxNjAiPjwvYT48YSBpZD0ic3RocmVmMTYxIiBuYW1lPSJzdGhyZWYxNjEiPjwvYT48L3A+Ci08b2w+Ci08bGk+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgZnJvbSBUYWJsZXM8L3NwYW4+LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2MiIgbmFtZT0ic3RocmVmMTYyIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllczwvcD4KLTxpbWcgc3JjPSJpbWcvZ2VuZXJhdGVfZW50aXRpZXMucG5nIiBhbHQ9IlVzaW5nIHRoZSBKUEEgVG9vbHMgJmd0OyBHZW5lcmF0ZSBFbnRpdGllcyBtZW51IG9wdGlvbi4iIHRpdGxlPSJVc2luZyB0aGUgSlBBIFRvb2xzICZndDsgR2VuZXJhdGUgRW50aXRpZXMgbWVudSBvcHRpb24uIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+T24gdGhlIDxhIGhyZWY9InJlZl9zZWxlY3RUYWJsZXMuaHRtI0NJQUhDR0VFIj5TZWxlY3QgVGFibGVzPC9hPiBwYWdlLCBzZWxlY3QgeW91ciBkYXRhYmFzZSBjb25uZWN0aW9uIGFuZCBzY2hlbWEuPC9wPgotPHA+VG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgY29ubmVjdGlvbjwvc3Bhbj4uPC9wPgotPHA+SWYgeW91IGFyZSBub3QgY3VycmVudGx5IGNvbm5lY3RlZCB0byB0aGUgZGF0YWJhc2UsIHRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIHBhZ2UgYXBwZWFycy4gU2VsZWN0IHlvdXIgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgc2NoZW1hLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPlJlY29ubmVjdDwvc3Bhbj4uPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTYzIiBuYW1lPSJzdGhyZWYxNjMiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5TZWxlY3QgVGFibGVzPC9wPgotPGltZyBzcmM9ImltZy9zZWxlY3RfdGFibGVzLnBuZyIgYWx0PSIiIHRpdGxlPSIiIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPjwvbGk+Ci08bGk+Ci08cD5BZnRlciBzZWxlY3RpbmcgYSBzY2hlbWEsIHNlbGVjdCB0aGUgdGFibGVzIGZyb20gd2hpY2ggdG8gZ2VuZXJhdGUgSmF2YSBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfdGFibGVBc3NvY2lhdGlvbnMuaHRtI0NJQUNESUNCIj5UYWJsZSBBc3NvY2lhdGlvbnM8L2E+IHBhZ2UsIHNlbGVjdCB0aGUgYXNzb2NpYXRpb25zIHRvIGdlbmVyYXRlLiBZb3UgY2FuIHNwZWNpZnkgdG8gZ2VuZXJhdGUgc3BlY2lmaWMgcmVmZXJlbmNlcyBmb3IgZWFjaCBhc3NvY2lhdGlvbi48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgYXNzb2NpYXRpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJib2xkIj5BZGQgQXNzb2NpYXRpb248L3NwYW4+LiBVc2UgdGhlIDxhIGhyZWY9InJlZl9jcmVhdGVfbmV3X2Fzc29jaWF0aW9uX3dpemFyZC5odG0jQ0lBRkdISUYiPkNyZWF0ZSBOZXcgQXNzb2NpYXRpb248L2E+IHdpemFyZCB0byBkZWZpbmUgdGhlIGFzc29jaWF0aW9uLjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE2NCIgbmFtZT0ic3RocmVmMTY0Ij48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+VGFibGUgQXNzb2NpYXRpb25zPC9wPgotPGltZyBzcmM9ImltZy90YWJsZV9hc3NvY2lhdGlvbnMucG5nIiBhbHQ9IiIgdGl0bGU9IiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkFmdGVyIGVkaXRpbmcgdGhlIHRhYmxlIGFzc29jaWF0aW9ucywgY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk5leHQ8L3NwYW4+LjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5PbiB0aGUgPGEgaHJlZj0icmVmX2N1c3RvbWl6ZURlZmF1bHRFbnRpdHlHZW5lcmF0aW9uLmh0bSNDSUFFSkRCRSI+Q3VzdG9taXplIERlZmF1bHQgRW50aXR5IEdlbmVyYXRpb248L2E+IHBhZ2UsIGN1c3RvbWl6ZSB0aGUgbWFwcGluZyBhbmQgY2xhc3MgaW5mb3JtYXRpb24gZm9yIGVhY2ggZ2VuZXJhdGVkIGVudGl0eS48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjUiIG5hbWU9InN0aHJlZjE2NSI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkN1c3RvbWl6ZSBEZWZhdWx0IEVudGl0eSBHZW5lcmF0aW9uPC9wPgotPGltZyBzcmM9ImltZy9jdXN0b21pemVfZGVmYXVsdF9lbnRpdHlfZ2VuZXJhdGlvbi5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPGxpPgotPHA+QWZ0ZXIgY3VzdG9taXppbmcgdGhlIG1hcHBpbmdzLCBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+TmV4dDwvc3Bhbj4uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9uIHRoZSA8YSBocmVmPSJyZWZfY3VzdG9taXpJbmRpdmlkdWFsRW50aXRpZXMuaHRtI0NJQUNJR0VFIj5DdXN0b21pemUgSW5kaXZpZHVhbCBFbnRpdGllczwvYT4gcGFnZSwgcmV2aWV3IHRoZSBtYXBwaW5nIGFuZCBjbGFzcyBpbmZvcm1hdGlvbiBmb3IgZWFjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0iYm9sZCI+RmluaXNoPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJmaWd1cmUiPjxhIGlkPSJzdGhyZWYxNjYiIG5hbWU9InN0aHJlZjE2NiI+PC9hPgotPHAgY2xhc3M9InRpdGxlaW5maWd1cmUiPkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzPC9wPgotPGltZyBzcmM9ImltZy9jdXN0b21pemVfaW5kaXZpZHVhbF9lbnRpdGllcy5wbmciIGFsdD0iIiB0aXRsZT0iIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT48L2xpPgotPC9vbD4KLTxwPkVjbGlwc2UgY3JlYXRlcyBhIEphdmEgcGVyc2lzdGVudCBlbnRpdHkgZm9yIGVhY2ggZGF0YWJhc2UgdGFibGUuIEVhY2ggZW50aXR5IGNvbnRhaW5zIGZpZWxkcyBiYXNlZCBvbiB0aGUgdGFibGUncyBjb2x1bW5zLiBFY2xpcHNlIHdpbGwgYWxzbyBnZW5lcmF0ZSBlbnRpdHkgcmVsYXRpb25zaGlwcyAoc3VjaCBhcyBvbmUtdG8tb25lKSBiYXNlZCBvbiB0aGUgdGFibGUgY29uc3RyYWludHMuIDxhIGhyZWY9IiNDSUhKSUpKQyI+RmlndXJlOiBHZW5lcmF0aW5nIEVudGl0aWVzIGZyb20gVGFibGVzPC9hPiBpbGx1c3RyYXRlcyBob3cgRWNsaXBzZSBnZW5lcmF0ZXMgZW50aXRpZXMgZnJvbSB0YWJsZXMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0iQ0lISklKSkMiIG5hbWU9IkNJSEpJSkpDIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+R2VuZXJhdGluZyBFbnRpdGllcyBmcm9tIFRhYmxlczwvcD4KLTxpbWcgc3JjPSJpbWcvdGFibGVfZW50aXR5LnBuZyIgYWx0PSJUaGlzIGZpZ3VyZSBzaG93cyB0aGUgRU1QTE9ZRUUgYW5kIEFERFJFU1MgZW50aXRpZXMgZ2VuZXJhdGVkIGZyb20gZGF0YWJhc2UgdGFibGVzLiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHRoZSBFTVBMT1lFRSBhbmQgQUREUkVTUyBlbnRpdGllcyBnZW5lcmF0ZWQgZnJvbSBkYXRhYmFzZSB0YWJsZXMuIiAvPjxiciAvPjwvZGl2PgotPCEtLSBjbGFzcz0iZmlndXJlIiAtLT4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDFlODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIyLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+R2VuZXJhdGluZyB0YWJsZXMgZnJvbSBlbnRpdGllczwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0NVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0lISklHQkUiIG5hbWU9IkNJSEpJR0JFIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5HZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzPC9oMT4KLTxwPldoZW4gdXNpbmcgYSB2ZW5kb3Itc3BlY2lmaWMgcGxhdGZvcm0sIHlvdSBjYW4gY3JlYXRlIGEgRERMIHNjcmlwdCBmcm9tIHlvdXIgcGVyc2lzdGVudCBlbnRpdGllcy48L3A+Ci08ZGl2IGFsaWduPSJjZW50ZXIiPgotPGRpdiBjbGFzcz0iaW5mdGJsbm90ZSI+PGJyIC8+Ci08dGFibGUgY2xhc3M9Ik5vdGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+Ci08cCBjbGFzcz0ibm90ZXAxIj5Ob3RlOjwvcD4KLVRoZSBEREwgc2NyaXB0IHdpdGggRFJPUCBleGlzdGluZyB0YWJsZXMgb24gdGhlIGRhdGFiYXNlIGFuZCBDUkVBVEUgbmV3IHRhYmxlcywgYmFzZWQgb24gdGhlIGVudGl0aWVzIGluIHlvdXIgcHJvamVjdC48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0Ymxub3RlIiAtLT48L2Rpdj4KLTxwPlRvIGdlbmVyYXRlIGEgRERMIHNjcmlwdDo8L3A+Ci08cD5SaWdodC1jbGljayB0aGUgSlBBIHByb2plY3QgaW4gdGhlIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LXRpdGxlIj5Qcm9qZWN0IEV4cGxvcmVyPC9zcGFuPiBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+SlBBIFRvb2xzICZndDsgR2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXM8L3NwYW4+LjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08cD48YSBocmVmPSJ0YXNrX2NyZWF0ZV9qcGFfZW50aXR5Lmh0bSNCQUJGQkpCRyI+Q3JlYXRpbmcgYSBKUEEgRW50aXR5PC9hPjwvcD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxyLnBuZyIgYWx0PSJSZWxhdGVkIHJlZmVyZW5jZSIgdGl0bGU9IlJlbGF0ZWQgcmVmZXJlbmNlIiAvPjxiciAvPgotPGJyIC8+Ci08YSBocmVmPSJyZWZfcHJvamVjdF9wcm9wZXJ0aWVzLmh0bSNCQUJKSEJDSSI+UHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgJm5kYXNoOyBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnM8L2E+PC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExODcwZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDIzLmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+VmFsaWRhdGluZyBtYXBwaW5ncyBhbmQgcmVwb3J0aW5nIHByb2JsZW1zPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkZBSUJBIiBuYW1lPSJCQUJGQUlCQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj4KLTxoMT5WYWxpZGF0aW5nIG1hcHBpbmdzIGFuZCByZXBvcnRpbmcgcHJvYmxlbXM8L2gxPgotPHA+PGEgaWQ9InN0aHJlZjE2NyIgbmFtZT0ic3RocmVmMTY3Ij48L2E+PGEgaWQ9InN0aHJlZjE2OCIgbmFtZT0ic3RocmVmMTY4Ij48L2E+PGEgaWQ9InN0aHJlZjE2OSIgbmFtZT0ic3RocmVmMTY5Ij48L2E+PGEgaWQ9InN0aHJlZjE3MCIgbmFtZT0ic3RocmVmMTcwIj48L2E+RXJyb3JzIGFuZCB3YXJuaW5ncyBvbiBwZXJzaXN0ZW50IGVudGl0aWVzIGFuZCBtYXBwaW5ncyBhcmUgaW5kaWNhdGVkIHdpdGggYSByZWQgZXJyb3Igb3IgeWVsbG93IHdhcm5pbmcgbmV4dCB0byB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgZXJyb3IsIGFzIHdlbGwgYXMgdGhlIHBhcmVudCBjb250YWluZXJzIHVwIHRvIHRoZSBwcm9qZWN0LjwvcD4KLTxkaXYgY2xhc3M9ImZpZ3VyZSI+PGEgaWQ9InN0aHJlZjE3MSIgbmFtZT0ic3RocmVmMTcxIj48L2E+Ci08cCBjbGFzcz0idGl0bGVpbmZpZ3VyZSI+U2FtcGxlIEVycm9ycyBhbmQgV2FybmluZ3M8L3A+Ci08aW1nIHNyYz0iaW1nL2Vycm9yX3NhbXBsZS5wbmciIGFsdD0iVGhpcyBmaWd1cmUgc2hvd3Mgc2FtcGxlIGVycm9yIGFuZCB3YXJuaW5nIGljb25zIGluIHRoZSBFeHBsb3JlciB2aWV3LiIgdGl0bGU9IlRoaXMgZmlndXJlIHNob3dzIHNhbXBsZSBlcnJvciBhbmQgd2FybmluZyBpY29ucyBpbiB0aGUgRXhwbG9yZXIgdmlldy4iIC8+PGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJmaWd1cmUiIC0tPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjQuaHRtI0NJSEZFREVJIj5FcnJvciBtZXNzYWdlczwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0idGFza3MwMjUuaHRtI0NJSEdFQUlKIj5XYXJuaW5nIG1lc3NhZ2VzPC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPjwvZGl2PgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmVlMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI0Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+RXJyb3IgbWVzc2FnZXM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDVaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iRXJyb3IgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhGRURFSSIgbmFtZT0iQ0lIRkVERUkiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPkVycm9yIG1lc3NhZ2VzPGEgaWQ9InN0aHJlZjE3MiIgbmFtZT0ic3RocmVmMTcyIj48L2E+PC9oMT4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBlcnJvciBtZXNzYWdlcyAoaW5jbHVkaW5nIGhvdyB0byByZXNvbHZlIHRoZSBpc3N1ZSkgeW91IG1heSBlbmNvdW50ZXIgd2hpbGUgd29ya2luZyB3aXRoIERhbGkuPC9wPgotPGEgaWQ9InN0aHJlZjE3MyIgbmFtZT0ic3RocmVmMTczIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPkF0dHJpYnV0ZSAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0FUVFJJQlVURV9fTkFNRSZndDs8L3NwYW4+IiBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGUgaW4gdGhpcyBjb250ZXh0PC9wPgotPHA+VGhlIG1hcHBlZCBhdHRyaWJ1dGUgaXMgaW52YWxpZC4gRWl0aGVyIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9yIGNoYW5nZSB0aGUgZW50aXR5IHR5cGUuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzQiIG5hbWU9InN0aHJlZjE3NCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5BdHRyaWJ1dGUgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtBVFRSSUJVVEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+RGFsaSBjYW5ub3QgbWFwIHRoZSBhdHRyaWJ1dGUgdG8gYSBkYXRhYmFzZSB0YWJsZSBhbmQgY29sdW1uLiBWZXJpZnkgdGhhdCB5b3UgZGF0YWJhc2UgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBpcyBjb3JyZWN0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2NyZWF0ZV9uZXdfcHJvamVjdC5odG0jQ0lISEVKQ0oiPiJDcmVhdGluZyBhIG5ldyBKUEEgcHJvamVjdCI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzUiIG5hbWU9InN0aHJlZjE3NSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5DbGFzcyAiPHNwYW4gY2xhc3M9Iml0YWxpYyI+Jmx0O0NMQVNTX05BTUUmZ3Q7PC9zcGFuPiIgaXMgbm90IGFubm90YXRlZCBhcyBhIHBlcnNpc3RlbnQgY2xhc3MuPC9wPgotPHA+VGhlIGNsYXNzIGhhcyBub3QgYmVlbiBpZGVudGlmaWVkIGFzIGEgcGVyc2lzdGVudCBjbGFzcy4gQ29uZmlndXJlIHRoZSBjbGFzcyBhcyBhbiBFbnRpdHksIE1hcHBlZCBTdXBlcmNsYXNzLCBvciBFbWJlZGRhYmxlIHBlcnNpc3RlbnQgZW50aXR5LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzYiIG5hbWU9InN0aHJlZjE3NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IG1hcHBlZCBhbiBlbnRpdHkncyBmaWVsZCB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBjb2x1bW4gaW4gdGhlIGRhdGFiYXNlIHRhYmxlLiBCeSBkZWZhdWx0LCBEYWxpIHdpbGwgYXR0ZW1wdCB0byBtYXAgZWFjaCBmaWVsZCBpbiB0aGUgZW50aXR5IHdpdGggYW4gaWRlbnRpY2FsbHkgbmFtZWQgcm93IGluIHRoZSBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGZpZWxkJ3MgbmFtZSBkaWZmZXJzIGZyb20gdGhlIHJvdydzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBtYXBwaW5nLjwvcD4KLTxwPk1hcCB0aGUgZmllbGQgdG8gYSB2YWxpZCByb3cgaW4gdGhlIGRhdGFiYXNlIHRhYmxlIGFzIHNob3duIGluIDxhIGhyZWY9InRhc2tfbWFwcGluZy5odG0jQkFCREdCSUoiPiJNYXBwaW5nIGFuIGVudGl0eSI8L2E+LjwvcD4KLTxhIGlkPSJzdGhyZWYxNzciIG5hbWU9InN0aHJlZjE3NyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5EdXBsaWNhdGUgY2xhc3MgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDTEFTU19OQU1FJmd0Ozwvc3Bhbj4iLjwvcD4KLTxwPllvdSBjcmVhdGVkIHRvIHBlcnNpc3RlbmNlIGNsYXNzZXMgd2l0aCB0aGUgc2FtZSBuYW1lLiBFYWNoIEphdmEgY2xhc3MgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUuIFNlZSA8YSBocmVmPSJ0YXNrX2FkZF9wZXJzaXN0ZW5jZS5odG0jQkFCSElDQUkiPiJBZGRpbmcgcGVyc2lzdGVuY2UgdG8gYSBjbGFzcyI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxNzgiIG5hbWU9InN0aHJlZjE3OCI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5FbnRpdHkgZG9lcyBub3QgaGF2ZSBhbiBJZCBvciBFbWJlZGRlZCBJZC48L3A+Ci08cD5Zb3UgY3JlYXRlZCBhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGhvdXQgaWRlbnRpZnlpbmcgaXRzIHByaW1hcnkga2V5LiBBIHBlcnNpc3RlbnQgZW50aXR5IG11c3QgaGF2ZSBhIHByaW1hcnkga2V5IGZpZWxkIGRlc2lnbmF0ZWQgd2l0aCBhbiA8Y29kZT5ASWQ8L2NvZGU+IG9yIDxjb2RlPkBFbWJlZGRlZElkPC9jb2RlPiBhbm5vdGF0aW9uLjwvcD4KLTxwPkFkZCBhbiBJRCBtYXBwaW5nIHRvIHRoZSBlbnRpdHkgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza3MwMTMuaHRtI0JBQkdDQkhHIj4iSUQgbWFwcGluZyI8L2E+IG9yIDxhIGhyZWY9InRhc2tzMDEyLmh0bSNDSUhESUFFRSI+IkVtYmVkZGVkIElEIG1hcHBpbmciPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTc5IiBuYW1lPSJzdGhyZWYxNzkiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+TXVsdGlwbGUgcGVyc2lzdGVuY2UueG1sIGZpbGVzIGluIHByb2plY3QuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRoIG1vcmUgdGhhbiBvbmUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBFYWNoIEpQQSBwcm9qZWN0IG11c3QgY29udGFpbiBhIDxzcGFuIGNsYXNzPSJpdGFsaWMiPnNpbmdsZTwvc3Bhbj4gPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9wZXJzaXN0ZW5jZS5odG0jQ0lIREFKSUQiPiJNYW5hZ2luZyB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTgwIiBuYW1lPSJzdGhyZWYxODAiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gcGVyc2lzdGVuY2UgdW5pdCBkZWZpbmVkLjwvcD4KLTxwPlRoZXJlIGlzIG5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZCBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLiBVc2UgdGhlICZsdDtwZXJzaXN0ZW5jZS11bml0IG5hbWU9IjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtQRVJTSVNURU5DRV9VTklUX05BTUUmZ3Q7PC9zcGFuPiIgdGFnIHRvIGRlZmluZSB0aGUgcGVyc2lzdGVudCB1bml0LjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrX21hbmFnZV9vcm0uaHRtI0NJSERHRENEIj4iTWFuYWdpbmcgdGhlIG9ybS54bWwgZmlsZSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODEiIG5hbWU9InN0aHJlZjE4MSI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5ObyBwZXJzaXN0ZW5jZS54bWwgZmlsZSBpbiBwcm9qZWN0LjwvcD4KLTxwPllvdSBjcmVhdGVkIGEgSlBBIHByb2plY3Qgd2l0aG91dCBhIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4gRWFjaCBKUEEgcHJvamVjdCBtdXN0IGNvbnRhaW4gYSA8c3BhbiBjbGFzcz0iaXRhbGljIj5zaW5nbGU8L3NwYW4+IDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0idGFza19tYW5hZ2VfcGVyc2lzdGVuY2UuaHRtI0NJSERBSklEIj4iTWFuYWdpbmcgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4MiIgbmFtZT0ic3RocmVmMTgyIj48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlJlZmVyZW5jZWQgY29sdW1uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09MVU1OX05BTUUmZ3Q7PC9zcGFuPiIgaW4gam9pbiBjb2x1bW4gIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtDT0xVTU5fTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+VGhlIGNvbHVtbiB0aGF0IHlvdSBzZWxlY3RlZCB0byBqb2luIGEgcmVsYXRpb25zaGlwIG1hcHBpbmcgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGRhdGFiYXNlIHRhYmxlLiBFaXRoZXIgc2VsZWN0IGEgZGlmZmVyZW50IGNvbHVtbiBvbiB0aGUgPGEgaHJlZj0icmVmZXJlbmNlMDExLmh0bSNDQUNCQUVCQyI+Sm9pbiBUYWJsZSBJbmZvcm1hdGlvbjwvYT4gb3IgY3JlYXRlIHRoZSBuZWNlc3NhcnkgY29sdW1uIG9uIHRoZSBkYXRhYmFzZSB0YWJsZS48L3A+Ci08cD5TZWUgPGEgaHJlZj0icmVmX3BlcnNpc3RlbmNlX21hcF92aWV3Lmh0bSNCQUJJRkJBRiI+IkpQQSBEZXRhaWxzIHZpZXcgKGZvciBhdHRyaWJ1dGVzKSI8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTxhIGlkPSJzdGhyZWYxODMiIG5hbWU9InN0aHJlZjE4MyI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5TY2hlbWEgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5TQ0hFTUFfTkFNRTwvc3Bhbj4mZ3Q7IiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHRhYmxlL2pvaW4gdGFibGUgIiZsdDs8c3BhbiBjbGFzcz0iaXRhbGljIj5UQUJMRV9OQU1FPC9zcGFuPiZndDsiLjwvcD4KLTxwPkRlZmluZSB0aGUgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgaW5mb3JtYXRpb24gaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfbWFuYWdlX29ybS5odG0jQ0lIREdEQ0QiPiJNYW5hZ2luZyB0aGUgb3JtLnhtbCBmaWxlIjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPgotPGEgaWQ9InN0aHJlZjE4NCIgbmFtZT0ic3RocmVmMTg0Ij48L2E+Ci08cCBjbGFzcz0ic3ViaGVhZDIiPlRhYmxlICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7VEFCTEVfTkFNRSZndDs8L3NwYW4+IiBjYW5ub3QgYmUgcmVzb2x2ZWQuPC9wPgotPHA+WW91IGFzc29jaWF0ZWQgYSBwZXJzaXN0ZW50IGVudGl0eSB0byBhbiBpbmNvcnJlY3Qgb3IgaW52YWxpZCBkYXRhYmFzZSB0YWJsZS4gQnkgZGVmYXVsdCwgRGFsaSB3aWxsIGF0dGVtcHQgdG8gYXNzb2NpYXRlIGVhY2ggcGVyc2lzdGVudCBlbnRpdHkgd2l0aCBhbiBpZGVudGljYWxseSBuYW1lZCBkYXRhYmFzZSB0YWJsZS4gSWYgdGhlIGVudGl0eSdzIG5hbWUgZGlmZmVycyBmcm9tIHRoZSB0YWJsZSdzIG5hbWUsIHlvdSBtdXN0IGV4cGxpY2l0bHkgY3JlYXRlIHRoZSBhc3NvY2lhdGlvbi48L3A+Ci08cD5Bc3NvY2lhdGUgdGhlIGVudGl0eSB3aXRoIGEgdmFsaWQgZGF0YWJhc2UgdGFibGUgYXMgc2hvd24gaW4gPGEgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIj4iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPC9hPi48L3A+Ci08YSBpZD0ic3RocmVmMTg1IiBuYW1lPSJzdGhyZWYxODUiPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+VW5yZXNvbHZlZCBnZW5lcmF0b3IgIjxzcGFuIGNsYXNzPSJpdGFsaWMiPiZsdDtHRU5FUkFUT1JfTkFNRSZndDs8L3NwYW4+IiBpcyBkZWZpbmVkIGluIHBlcnNpc3RlbmNlIHVuaXQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBwZXJzaXN0ZW5jZSBlbnRpdHkgdGhhdCB1c2VzIHNlcXVlbmNpbmcgb3IgYSB0YWJsZSBnZW5lcmF0b3IsIGJ1dCBkaWQgbm90IGRlZmluZSB0aGUgZ2VuZXJhdG9yIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBFaXRoZXIgZGVmaW5lIHRoZSBnZW5lcmF0b3IgYnkgdXNpbmcgYW4gYW5ub3RhdGlvbiBvciBpbmNsdWRpbmcgaXQgaW4gdGhlIFhNTCBtYXBwaW5nIGZpbGUuPC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxwPjxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL2NvbmNlcHRzL2NwcmJ2aWV3Lmh0bSI+UHJvYmxlbXMgdmlldzwvYT48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QyIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI1Lmh0bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZiYmFjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGFza3MwMjUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5XYXJuaW5nIG1lc3NhZ2VzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSUhHRUFJSiIgbmFtZT0iQ0lIR0VBSUoiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPldhcm5pbmcgbWVzc2FnZXM8L2gxPgotPHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHdhcm5pbmcgbWVzc2FnZXMgKGluY2x1ZGluZyBob3cgdG8gcmVzb2x2ZSB0aGUgaXNzdWUpIHlvdSBtYXkgZW5jb3VudGVyIHdoaWxlIHdvcmtpbmcgd2l0aCBEYWxpLjwvcD4KLTxhIGlkPSJzdGhyZWYxODYiIG5hbWU9InN0aHJlZjE4NiI+PC9hPgotPHAgY2xhc3M9InN1YmhlYWQyIj5Db25uZWN0aW9uICI8c3BhbiBjbGFzcz0iaXRhbGljIj4mbHQ7Q09OTkVDVElPTl9OQU1FJmd0Ozwvc3Bhbj4iIGlzIG5vdCBhY3RpdmUuIE5vIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGRhdGEgc291cmNlLjwvcD4KLTxwPlRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIHlvdSBzcGVjaWZpZWQgdG8gdXNlIHdpdGggdGhlIEpQQSBwcm9qZWN0IGlzIG5vdCBhY3RpdmUuIFRoZSBKUEEgcHJvamVjdCByZXF1aXJlcyBhbiBhY3RpdmUgY29ubmVjdGlvbi48L3A+Ci08YSBpZD0ic3RocmVmMTg3IiBuYW1lPSJzdGhyZWYxODciPjwvYT4KLTxwIGNsYXNzPSJzdWJoZWFkMiI+Tm8gY29ubmVjdGlvbiBzcGVjaWZpZWQgZm9yIHRoZSBwcm9qZWN0LiBObyBkYXRhLXNwZWNpZmljIHZhbGlkYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuPC9wPgotPHA+WW91IGNyZWF0ZWQgYSBKUEEgcHJvamVjdCB3aXRob3V0IHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLiBUaGUgSlBBIHByb2plY3QgcmVxdWlyZXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24uPC9wPgotPHA+U2VlIDxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+IkNyZWF0aW5nIGEgbmV3IEpQQSBwcm9qZWN0IjwvYT4gb3IgPGEgaHJlZj0idGFza3MwMjYuaHRtI0JBQkRCQ0JJIj4iTW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzIjwvYT4gZm9yIGluZm9ybWF0aW9uIG9uIHNwZWNpZnlpbmcgYSBkYXRhYmFzZSBjb25uZWN0aW9uLjwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWxjLnBuZyIgYWx0PSJSZWxhdGVkIGNvbmNlcHQiIHRpdGxlPSJSZWxhdGVkIGNvbmNlcHQiIC8+PGJyIC8+Ci08cD48YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlci9jb25jZXB0cy9jcHJidmlldy5odG0iPlByb2JsZW1zIHZpZXc8L2E+PC9wPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJzZWN0MiIgLS0+Ci08IS0tIGNsYXNzPSJzZWN0MSIgLS0+Ci08IS0tIFN0YXJ0IEZvb3RlciAtLT4KLTxkaXYgY2xhc3M9ImZvb3RlciI+Ci08dGFibGUgY2xhc3M9InNpbXBsZSBvYWNfbm9fd2FybiIgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KLTxjb2wgd2lkdGg9Ijg2JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dHI+Ci08dGQgYWxpZ249ImxlZnQiPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5Db3B5cmlnaHQmbmJzcDsmY29weTsmbmJzcDsyMDA2LCAyMDEwLCZuYnNwO09yYWNsZSZuYnNwO2FuZC9vciZuYnNwO2l0cyZuYnNwO2FmZmlsaWF0ZXMuJm5ic3A7QWxsJm5ic3A7cmlnaHRzJm5ic3A7cmVzZXJ2ZWQuPC9zcGFuPjxiciAvPgotPGEgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIj48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+TGVnYWwgTm90aWNlczwvc3Bhbj48L2E+PC90ZD4KLTwvdHI+Ci08L3RhYmxlPgotPC9kaXY+Ci08IS0tIGNsYXNzPSJmb290ZXIiIC0tPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI2Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90YXNrczAyNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5NWEwM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3Rhc2tzMDI2Lmh0bQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIHhtbDpsYW5nPSJlbiIgbGFuZz0iZW4iPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11cy1hc2NpaSIgLz4KLSAKLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ1WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkJBQkRCQ0JJIiBuYW1lPSJCQUJEQkNCSSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+TW9kaWZ5aW5nIHBlcnNpc3RlbnQgcHJvamVjdCBwcm9wZXJ0aWVzPC9oMT4KLTxwPkVhY2ggcGVyc2lzdGVudCBwcm9qZWN0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGF0YWJhc2UgY29ubmVjdGlvbi4gVG8gY3JlYXRlIGEgbmV3IGRhdGFiYXNlIGNvbm5lY3Rpb24sIGNsaWNrIDxzcGFuIGNsYXNzPSJndWktb2JqZWN0LWFjdGlvbiI+RGF0YWJhc2UgQ29ubmVjdGlvbjwvc3Bhbj4gdXNlIHRoZSBOZXcgQ29ubmVjdGlvbiB3aXphcmQuPC9wPgotPHA+VXNlIHRoaXMgcHJvY2VkdXJlIHRvIG1vZGlmeSB0aGUgdmVuZGVyLXNwZWNpZmljIHBsYXRmb3JtIGFuZCBkYXRhYmFzZSBjb25uZWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB5b3VyIEpQQSBwcm9qZWN0LjwvcD4KLTxvbD4KLTxsaT4KLTxwPlJpZ2h0LWNsaWNrIHRoZSBwcm9qZWN0IGluIHRoZSA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC10aXRsZSI+RXhwbG9yZXI8L3NwYW4+IHZpZXcgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByb3BlcnRpZXM8L3NwYW4+LiBUaGUgUHJvcGVydGllcyBwYWdlIGFwcGVhcnMuPC9wPgotPGRpdiBjbGFzcz0iZmlndXJlIj48YSBpZD0ic3RocmVmMTg4IiBuYW1lPSJzdGhyZWYxODgiPjwvYT4KLTxwIGNsYXNzPSJ0aXRsZWluZmlndXJlIj5UaGUgUHJvcGVydGllcyBQYWdlPC9wPgotPGltZyBzcmM9ImltZy9wcm9qZWN0X3Byb3BlcnRpZXNfdGFza3MucG5nIiBhbHQ9IlRoZSBQZXJzaXN0ZW5jZSBwYWdlLiIgdGl0bGU9IlRoZSBQZXJzaXN0ZW5jZSBwYWdlLiIgLz48YnIgLz48L2Rpdj4KLTwhLS0gY2xhc3M9ImZpZ3VyZSIgLS0+PC9saT4KLTxsaT4KLTxwPkNvbXBsZXRlIGVhY2ggZmllbGQgb24gdGhlIDxhIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIj5Qcm9qZWN0IFByb3BlcnRpZXMgcGFnZSAmbmRhc2g7IEphdmEgUGVyc2lzdGVuY2UgT3B0aW9uczwvYT4gY2xpY2sgPHNwYW4gY2xhc3M9ImJvbGQiPk9LPC9zcGFuPi48L3A+Ci08L2xpPgotPC9vbD4KLTxwPiZuYnNwOzwvcD4KLTxpbWcgc3JjPSJpbWcvbmdyZWx0LnBuZyIgYWx0PSJSZWxhdGVkIHRhc2siIHRpdGxlPSJSZWxhdGVkIHRhc2siIC8+PGJyIC8+Ci08YnIgLz4KLTxhIGhyZWY9InRhc2tfY3JlYXRlX25ld19wcm9qZWN0Lmh0bSNDSUhIRUpDSiI+Q3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3Q8L2E+Ci08cD4mbmJzcDs8L3A+Ci08aW1nIHNyYz0iaW1nL25ncmVsci5wbmciIGFsdD0iUmVsYXRlZCByZWZlcmVuY2UiIHRpdGxlPSJSZWxhdGVkIHJlZmVyZW5jZSIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0icmVmX3Byb2plY3RfcHJvcGVydGllcy5odG0jQkFCSkhCQ0kiPlByb2plY3QgUHJvcGVydGllcyBwYWdlICZuZGFzaDsgSmF2YSBQZXJzaXN0ZW5jZSBPcHRpb25zPC9hPgotPHA+Jm5ic3A7PC9wPgotPGltZyBzcmM9ImltZy9uZ3JlbGMucG5nIiBhbHQ9IlJlbGF0ZWQgY29uY2VwdCIgdGl0bGU9IlJlbGF0ZWQgY29uY2VwdCIgLz48YnIgLz4KLTxiciAvPgotPGEgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiPlVuZGVyc3RhbmRpbmcgSmF2YSBwZXJzaXN0ZW5jZTwvYT48L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc5MTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90aXBzX2FuZF90cmlja3MuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5UaXBzIGFuZCB0cmlja3M8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iIFRpcHMgYW5kIHRyaWNrcyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNIREhHSEJGIiBuYW1lPSJDSERIR0hCRiI+PC9hPjwvcD4KLTxoMT5UaXBzIGFuZCB0cmlja3M8L2gxPgotPHA+VGhlIGZvbGxvd2luZyB0aXBzIGFuZCB0cmlja3MgZ2l2ZSBzb21lIGhlbHBmdWwgaWRlYXMgZm9yIGluY3JlYXNpbmcgeW91ciBwcm9kdWN0aXZpdHkuPC9wPgotPHVsPgotPGxpPgotPHA+PGEgaHJlZj0iI0JBQkZJSUhBIj48c3BhbiBjbGFzcz0iYm9sZCI+RGF0YWJhc2UgQ29ubmVjdGlvbnM8L3NwYW4+PC9hPjwvcD4KLTwvbGk+Ci08bGk+Ci08cD48YSBocmVmPSIjQkFCQ0hBSEYiPjxzcGFuIGNsYXNzPSJib2xkIj5TY2hlbWEtYmFzZWQgcGVyc2lzdGVuY2UueG1sPC9zcGFuPjwvYT48L3A+Ci08L2xpPgotPC91bD4KLTxkaXYgY2xhc3M9ImluZnRibHJ1bGVpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IlJ1bGVJbmZvcm1hbCIgdGl0bGU9IlRoaXMgdGFibGUgbGlzdHMgdGhlIHRpcHMgYW5kIHRyaWNrcyBpbiB0aGlzIGNhdGVnb3J5LiIgc3VtbWFyeT0iVGhpcyB0YWJsZSBsaXN0cyB0aGUgdGlwcyBhbmQgdHJpY2tzIGluIHRoaXMgY2F0ZWdvcnkuIiBkaXI9Imx0ciIgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSIgZnJhbWU9ImJvcmRlciIgcnVsZXM9ImFsbCIgY2VsbHBhZGRpbmc9IjMiIGNlbGxzcGFjaW5nPSIwIj4KLTxjb2wgd2lkdGg9IjI3JSIgLz4KLTxjb2wgd2lkdGg9IioiIC8+Ci08dGhlYWQ+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0aCBhbGlnbj0ibGVmdCIgdmFsaWduPSJib3R0b20iIGlkPSJyMWMxLXQyIj5UaXA8L3RoPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzItdDIiPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCRklJSEEiIG5hbWU9IkJBQkZJSUhBIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPkRhdGFiYXNlIENvbm5lY3Rpb25zPC9zcGFuPjwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIyYzEtdDIgcjFjMi10MiI+V2hlbiBzdGFydGluZyBhIG5ldyB3b3JrYmVuY2ggc2Vzc2lvbiwgYmUgc3VyZSB0byA8YSBocmVmPSIuLi9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRvYy51c2VyL2RvYy9odG1sL2FzYzEyMjk3MDAzNDMzNTIuaHRtbCI+cmVjb25uZWN0IHRvIHlvdXIgZGF0YWJhc2U8L2E+IChpZiB5b3UgYXJlIHdvcmtpbmcgb25saW5lKS4gVGhpcyBhbGxvd3MgRGFsaSB0byBwcm92aWRlIGRhdGFiYXNlLXJlbGF0ZWQgbWFwcGluZyBhc3Npc3RhbmNlIGFuZCB2YWxpZGF0aW9uLjwvdGQ+Ci08L3RyPgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyM2MxLXQyIiBoZWFkZXJzPSJyMWMxLXQyIj48YSBpZD0iQkFCQ0hBSEYiIG5hbWU9IkJBQkNIQUhGIj48L2E+PHNwYW4gY2xhc3M9ImJvbGQiPlNjaGVtYS1iYXNlZCBwZXJzaXN0ZW5jZS54bWw8L3NwYW4+PC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MiByMWMyLXQyIj5JZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsLCB5b3UgbWF5IG5lZWQgdG8gY29uZmlndXJlIHlvdXIgRWNsaXBzZSB3b3Jrc3BhY2UgcHJveHkgaW4gdGhlIDxhIGhyZWY9Ii4uL29yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyL3JlZmVyZW5jZS9yZWYtNzIuaHRtIj5QcmVmZXJlbmNlcyBkaWFsb2c8L2E+ICg8c3BhbiBjbGFzcz0iZ3VpLW9iamVjdC1hY3Rpb24iPlByZWZlcmVuY2VzICZndDsgSW50ZXJuZXQgJmd0OyBQcm94eSBTZXR0aW5nczwvc3Bhbj4pIHRvIHByb3Blcmx5IHZhbGlkYXRlIGEgc2NoZW1hLWJhc2VkIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS48L3RkPgotPC90cj4KLTwvdGJvZHk+Ci08L3RhYmxlPgotPGJyIC8+PC9kaXY+Ci08IS0tIGNsYXNzPSJpbmZ0YmxydWxlaW5mb3JtYWwiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci90b2MueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmRlYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PgotPCEtLSBVc2VyIEd1aWRlIC0tPgotICA8dG9jIGxhYmVsPSJEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgVXNlciBHdWlkZSI+Ci0gICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZC5odG0iIGxhYmVsPSJHZXR0aW5nIHN0YXJ0ZWQiPgotICAgICAgPHRvcGljIGhyZWY9ImdldHRpbmdfc3RhcnRlZDAwMS5odG0jQkFCRUZIQ0QiIGxhYmVsPSJSZXF1aXJlbWVudHMgYW5kIGluc3RhbGxhdGlvbiIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDIuaHRtI0JBQklHQ0pBIiBsYWJlbD0iRGFsaSBxdWljayBzdGFydCI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtI0JBQkRGSERBIiBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJnZXR0aW5nX3N0YXJ0ZWQwMDQuaHRtI0JBQkZHRERHIiBsYWJlbD0iQ3JlYXRpbmcgYSBKYXZhIHBlcnNpc3RlbnQgZW50aXR5IHdpdGggcGVyc2lzdGVudCBmaWVsZHMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzLmh0bSIgbGFiZWw9IiBDb25jZXB0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdF9wZXJzaXN0ZW5jZS5odG0jQkFCQ0FISUMiIGxhYmVsPSJVbmRlcnN0YW5kaW5nIEphdmEgcGVyc2lzdGVuY2UiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdF9tYXBwaW5nLmh0bSNCQUJCREpGSSIgbGFiZWw9IlVuZGVyc3RhbmRpbmcgT1IgbWFwcGluZ3MiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0iY29uY2VwdHMwMDEuaHRtI0JBQkJHRkpHIiBsYWJlbD0iVW5kZXJzdGFuZGluZyBFSkIgMy4wIEphdmEgUGVyc2lzdGVuY2UgQVBJIj4KLSAgICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAyLmh0bSNDSERIQUdJSCIgbGFiZWw9IlRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9ImNvbmNlcHRzMDAzLmh0bSNDSERCSUpBQyIgbGFiZWw9IlRoZSBvcm0ueG1sIGZpbGUiIC8+Ci0gICAgICA8L3RvcGljPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9InRhc2tzLmh0bSIgbGFiZWw9IiBUYXNrcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19jcmVhdGVfbmV3X3Byb2plY3QuaHRtI0NJSEhFSkNKIiBsYWJlbD0iQ3JlYXRpbmcgYSBuZXcgSlBBIHByb2plY3QiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMDEuaHRtI0JFSUJBREhIIiBsYWJlbD0iQ29udmVydGluZyBhIEphdmEgUHJvamVjdCB0byBhIEpQQSBQcm9qZWN0IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfY3JlYXRlX2pwYV9lbnRpdHkuaHRtI0JBQkZCSkJHIiBsYWJlbD0iQ3JlYXRpbmcgYSBKUEEgRW50aXR5IiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tfbWFuYWdlX3BlcnNpc3RlbmNlLmh0bSNDSUhEQUpJRCIgbGFiZWw9Ik1hbmFnaW5nIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMi5odG0jQ0lIRkVCQUkiIGxhYmVsPSJTeW5jaHJvbml6aW5nIGNsYXNzZXMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAwMy5odG0jc3RocmVmNTYiIGxhYmVsPSJVcGdyYWRpbmcgZG9jdW1lbnQgdmVyc2lvbiIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYW5hZ2Vfb3JtLmh0bSNDSUhER0RDRCIgbGFiZWw9Ik1hbmFnaW5nIHRoZSBvcm0ueG1sIGZpbGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDQuaHRtI3N0aHJlZjYwIiBsYWJlbD0iQ3JlYXRpbmcgYW4gb3JtLnhtbCBmaWxlIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDUuaHRtI0NJSEJDRENFIiBsYWJlbD0iV29ya2luZyB3aXRoIG9ybS54bWwgZmlsZSIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19hZGRfcGVyc2lzdGVuY2UuaHRtI0JBQkhJQ0FJIiBsYWJlbD0iQWRkaW5nIHBlcnNpc3RlbmNlIHRvIGEgY2xhc3MiPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDYuaHRtI0JBQkdCSUVFIiBsYWJlbD0iRW50aXR5IiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMDcuaHRtI0JBQkZFSUNFIiBsYWJlbD0iRW1iZWRkYWJsZSIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA4Lmh0bSNCQUJEQUdDSSIgbGFiZWw9Ik1hcHBlZCBzdXBlcmNsYXNzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2FkZGl0b25hbF90YWJsZXMuaHRtI0NJSEdCSUVJIiBsYWJlbD0iU3BlY2lmeWluZyBhZGRpdGlvbmFsIHRhYmxlcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2luaGVyaXRhbmNlLmh0bSNDSUhDQ0NKRCIgbGFiZWw9IlNwZWNpZnlpbmcgZW50aXR5IGluaGVyaXRhbmNlIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDA5Lmh0bSNCQUJJR0JHRyIgbGFiZWw9IkNyZWF0aW5nIE5hbWVkIFF1ZXJpZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19tYXBwaW5nLmh0bSNCQUJER0JJSiIgbGFiZWw9Ik1hcHBpbmcgYW4gZW50aXR5Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEwLmh0bSNCQUJCQUJDRSIgbGFiZWw9IkJhc2ljIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxMS5odG0jQkFCQ0JIREYiIGxhYmVsPSJFbWJlZGRlZCBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTIuaHRtI0NJSERJQUVFIiBsYWJlbD0iRW1iZWRkZWQgSUQgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDEzLmh0bSNCQUJHQ0JIRyIgbGFiZWw9IklEIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNC5odG0jQkFCRUlFR0QiIGxhYmVsPSJNYW55LXRvLW1hbnkgbWFwcGluZyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDE1Lmh0bSNCQUJIRkFGSiIgbGFiZWw9Ik1hbnktdG8tb25lIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxNi5odG0jQkFCSEdFQkQiIGxhYmVsPSJPbmUtdG8tbWFueSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTcuaHRtI0JBQkZIQkNKIiBsYWJlbD0iT25lLXRvLW9uZSBtYXBwaW5nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0idGFza3MwMTguaHRtI0JBQkhGSEVJIiBsYWJlbD0iVHJhbnNpZW50IG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAxOS5odG0jQkFCSElCSUkiIGxhYmVsPSJWZXJzaW9uIG1hcHBpbmciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMC5odG0jQ0lIQkRFQUoiIGxhYmVsPSJFbGVtZW50IENvbGxlY3Rpb24gbWFwcGluZyIgLz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza3MwMjEuaHRtI0JBQkJBR0ZJIiBsYWJlbD0iR2VuZXJhdGluZyBlbnRpdGllcyBmcm9tIHRhYmxlcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyMi5odG0jQ0lISklHQkUiIGxhYmVsPSJHZW5lcmF0aW5nIHRhYmxlcyBmcm9tIGVudGl0aWVzIiAvPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDIzLmh0bSNCQUJGQUlCQSIgbGFiZWw9IlZhbGlkYXRpbmcgbWFwcGluZ3MgYW5kIHJlcG9ydGluZyBwcm9ibGVtcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0YXNrczAyNC5odG0jQ0lIRkVERUkiIGxhYmVsPSJFcnJvciBtZXNzYWdlcyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDI1Lmh0bSNDSUhHRUFJSiIgbGFiZWw9Ildhcm5pbmcgbWVzc2FnZXMiIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InRhc2tzMDI2Lmh0bSNCQUJEQkNCSSIgbGFiZWw9Ik1vZGlmeWluZyBwZXJzaXN0ZW50IHByb2plY3QgcHJvcGVydGllcyIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0YXNrX2dlbmVyYXRpbmdfc2NoZW1hX2Zyb21fY2xhc3Nlcy5odG0jQ0lISEJKQ0oiIGxhYmVsPSJHZW5lcmF0aW5nIFNjaGVtYSBmcm9tIENsYXNzZXMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0idGFza19nZW5lcmF0ZV9jbGFzc2VzX2Zyb21fc2NoZW1hLmh0bSNDSUhDQkhKRCIgbGFiZWw9IkdlbmVyYXRpbmcgSkFYQiBDbGFzc2VzIGZyb20gYSBTY2hlbWEiIC8+Ci0gICAgPC90b3BpYz4KLSAgICA8dG9waWMgbGFiZWw9IiBSZWZlcmVuY2UiPgotICAgICAgPHRvcGljIGxhYmVsPSJXaXphcmRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9uZXdfanBhX3Byb2plY3Rfd2l6YXJkLmh0bSNDQUNCSkdCRyIgbGFiZWw9IkNyZWF0ZSBOZXcgSlBBIFByb2plY3Qgd2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX25ld19qcGFfcHJvamVjdC5odG0jQ0FDQkpBR0MiIGxhYmVsPSJOZXcgSlBBIFByb2plY3QgcGFnZSIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2phdmFfcGFnZS5odG0jQ0lBR0VCQUEiIGxhYmVsPSJKYXZhIFBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9qcGFfZmFjZXQuaHRtI0NBQ0lGRElGIiBsYWJlbD0iSlBBIEZhY2V0IHBhZ2UiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY3JlYXRlX2pwYV9lbnRpdHlfd2l6YXJkLmh0bSNDSUFHR0dERiIgbGFiZWw9IkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZCI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlDbGFzc1BhZ2UuaHRtI0NJQUZFSUdGIiBsYWJlbD0iRW50aXR5IENsYXNzIHBhZ2UiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9FbnRpdHlQcm9wZXJ0aWVzUGFnZS5odG0jQ0lBREVDSUEiIGxhYmVsPSJFbnRpdHkgUHJvcGVydGllcyBwYWdlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDAyLmh0bSNDSUFJSkNDRSIgbGFiZWw9Ik1hcHBpbmcgRmlsZSBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDMuaHRtI0NJQUpFSURKIiBsYWJlbD0iTWFwcGluZyBGaWxlIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA0Lmh0bSNDSUFHSENHQSIgbGFiZWw9IkdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzIFdpemFyZCIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jcmVhdGVfY3VzdG9tX2VudGl0aWVzX3dpemFyZC5odG0jQ0lBR0JGSkUiIGxhYmVsPSJHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcyBXaXphcmQiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfc2VsZWN0VGFibGVzLmh0bSNDSUFIQ0dFRSIgbGFiZWw9IlNlbGVjdCBUYWJsZXMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl90YWJsZUFzc29jaWF0aW9ucy5odG0jQ0lBQ0RJQ0IiIGxhYmVsPSJUYWJsZSBBc3NvY2lhdGlvbnMiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9jdXN0b21pemVEZWZhdWx0RW50aXR5R2VuZXJhdGlvbi5odG0jQ0lBRUpEQkUiIGxhYmVsPSJDdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2N1c3RvbWl6SW5kaXZpZHVhbEVudGl0aWVzLmh0bSNDSUFDSUdFRSIgbGFiZWw9IkN1c3RvbWl6ZSBJbmRpdmlkdWFsIEVudGl0aWVzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2NyZWF0ZV9uZXdfYXNzb2NpYXRpb25fd2l6YXJkLmh0bSNDSUFGR0hJRiIgbGFiZWw9IkNyZWF0ZSBOZXcgQXNzb2NpYXRpb24iPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfYXNzb2NpYXRpb25fdGFibGUuaHRtI0NJQUdKSERDIiBsYWJlbD0iQXNzb2NpYXRpb24gVGFibGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfam9pbl9jb2x1bW5zLmh0bSNDSUFFR0VFRyIgbGFiZWw9IkpvaW4gQ29sdW1ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX2Fzc29jaWF0aW9uX2NhcmRpbmFsaXR5Lmh0bSNDSUFGSUlGSCIgbGFiZWw9IkFzc29jaWF0aW9uIENhcmRpbmFsaXR5IiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2pheGJfc2NoZW1hX3dpemFyZC5odG0jQ0FDR0FERkgiIGxhYmVsPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBKQVhCIENsYXNzZXMgV2l6YXJkIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmX3NjaGVtYV9mcm9tX2NsYXNzZXNfcGFnZS5odG0jQ0FDSEJFR0oiIGxhYmVsPSJHZW5lcmF0ZSBTY2hlbWEgZnJvbSBDbGFzc2VzIiAvPgotICAgICAgICA8L3RvcGljPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iUHJvcGVydHkgcGFnZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3BlcnNpc3RlbmNlX3Byb3Bfdmlldy5odG0jQkFCRkFFQkIiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgZW50aXRpZXMpIj4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDA2Lmh0bSNDQUNDQUdHQyIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAwNy5odG0jQ0FDSUpCR0giIGxhYmVsPSJBdHRyaWJ1dGUgb3ZlcnJpZGVzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDguaHRtI0NBQ0JISURBIiBsYWJlbD0iU2Vjb25kYXJ5IHRhYmxlIGluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMDkuaHRtI0NBQ0ZIR0hFIiBsYWJlbD0iSW5oZXJpdGFuY2UgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMC5odG0jc3RocmVmMjQxIiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9tYXBfdmlldy5odG0jQkFCSUZCQUYiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3IgYXR0cmlidXRlcykiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfbWFwcGluZ19nZW5lcmFsLmh0bSNDQUNCSEZJSiIgbGFiZWw9IkdlbmVyYWwgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxMS5odG0jQ0FDQkFFQkMiIGxhYmVsPSJKb2luIFRhYmxlIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTIuaHRtI0NBQ0ZDRUpDIiBsYWJlbD0iSm9pbiBDb2x1bW5zIEluZm9ybWF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcHJpbWFyeV9rZXkuaHRtI0NBQ0ZDQ0FCIiBsYWJlbD0iUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9kZXRhaWxzX29ybS5odG0jQ0FDR0RHSEMiIGxhYmVsPSJKUEEgRGV0YWlscyB2aWV3IChmb3Igb3JtLnhtbCkiPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTMuaHRtI0NBQ0NBQ0dIIiBsYWJlbD0iR2VuZXJhbCBpbmZvcm1hdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE0Lmh0bSNDQUNFQUdCRyIgbGFiZWw9IlBlcnNpc3RlbmNlIFVuaXQgaW5mb3JtYXRpb24iIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxNS5odG0jQ0lBRkdBSUoiIGxhYmVsPSJHZW5lcmF0b3JzIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTYuaHRtI0NJQUlCQUFKIiBsYWJlbD0iUXVlcmllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDE3Lmh0bSNDSUFER0NJRCIgbGFiZWw9IkNvbnZlcnRlcnMiIC8+Ci0gICAgICAgIDwvdG9waWM+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2Vfb3V0bGluZS5odG0jQkFCRUdHRkUiIGxhYmVsPSJKUEEgU3RydWN0dXJlIHZpZXciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfcGVyc2lzdGVuY2VfeG1sbF9lZGl0b3IuaHRtI0NJQUNDSElEIiBsYWJlbD0icGVyc2lzdGVuY2UueG1sIEVkaXRvciI+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9nZW5lcmFsLmh0bSNDSUFDSUZHSiIgbGFiZWw9IkdlbmVyYWwiIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAxOC5odG0jQ0lBRkZKSUUiIGxhYmVsPSJDb25uZWN0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMTkuaHRtI0NJQUpBRkVHIiBsYWJlbD0iQ3VzdG9taXphdGlvbiIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIwLmh0bSNDSUFCRURDSCIgbGFiZWw9IkNhY2hpbmciIC8+Ci0gICAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAyMS5odG0jQ0lBQkdISEkiIGxhYmVsPSJMb2dnaW5nIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjIuaHRtI0NJQUZKQ0hFIiBsYWJlbD0iT3B0aW9ucyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDIzLmh0bSNDSUFDQ0ZDQiIgbGFiZWw9IlNjaGVtYSBHZW5lcmF0aW9uIiAvPgotICAgICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjQuaHRtI0NJQUhKREZGIiBsYWJlbD0iUHJvcGVydGllcyIgLz4KLSAgICAgICAgICA8dG9waWMgaHJlZj0icmVmZXJlbmNlMDI1Lmh0bSNDSUFIQ0pBSCIgbGFiZWw9IlNvdXJjZSIgLz4KLSAgICAgICAgPC90b3BpYz4KLSAgICAgIDwvdG9waWM+Ci0gICAgICA8dG9waWMgbGFiZWw9IlByZWZlcmVuY2VzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZl9wcm9qZWN0X3Byb3BlcnRpZXMuaHRtI0JBQkpIQkNJIiBsYWJlbD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBKYXZhIFBlcnNpc3RlbmNlIE9wdGlvbnMiIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjcuaHRtI0NBQ0ZCQUVIIiBsYWJlbD0iUHJvamVjdCBQcm9wZXJ0aWVzIHBhZ2UgLSBWYWxpZGF0aW9uIFByZWZlcmVuY2VzIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBsYWJlbD0iRGlhbG9ncyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMjkuaHRtI0NBQ0NHRUhDIiBsYWJlbD0iRWRpdCBKb2luIENvbHVtbnMgRGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX3NlbGVjdF9jYXNjYWRlX2RpYWxvZy5odG0jQ0lBRkRHSUoiIGxhYmVsPSJTZWxlY3QgQ2FzY2FkZSBkaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfZWNsaXBzZWxpbmtfbWFwcGluZ19maWxlLmh0bSNDSUFFREVKRiIgbGFiZWw9Ik5ldyBFY2xpcHNlTGluayBNYXBwaW5nIEZpbGUgZGlhbG9nIiAvPgotICAgICAgICA8dG9waWMgaHJlZj0icmVmX2FkZF9jb252ZXJ0ZXIuaHRtI0NJQUdDR0lKIiBsYWJlbD0iQWRkIENvbnZlcnRlciBkaWFsb2ciIC8+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJyZWZfY29uZmlndXJlX2pheGJfY2xhc3NfZ2VuZXJhdGlvbl9kaWFsb2cuaHRtI0NBQ0hISEpBIiBsYWJlbD0iQ29uZmlndXJlIEpBWEIgQ2xhc3MgR2VuZXJhdGlvbiBkaWFsb2ciIC8+Ci0gICAgICA8L3RvcGljPgotICAgICAgPHRvcGljIGhyZWY9InJlZl9wZXJzaXN0ZW5jZV9wZXJzcGVjdGl2ZS5odG0jQkFCSUZCREIiIGxhYmVsPSJKUEEgRGV2ZWxvcG1lbnQgcGVyc3BlY3RpdmUiIC8+Ci0gICAgICA8dG9waWMgbGFiZWw9Ikljb25zIGFuZCBidXR0b25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMS5odG0jQ0FDR0VBQ0ciIGxhYmVsPSJJY29ucyIgLz4KLSAgICAgICAgPHRvcGljIGhyZWY9InJlZmVyZW5jZTAzMi5odG0jQ0FDREpDRUkiIGxhYmVsPSJCdXR0b25zIiAvPgotICAgICAgPC90b3BpYz4KLSAgICAgIDx0b3BpYyBocmVmPSJyZWZlcmVuY2UwMzMuaHRtI0NBQ0JCRElCIiBsYWJlbD0iRGFsaSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIgLz4KLSAgICA8L3RvcGljPgotICAgIDx0b3BpYyBocmVmPSJ0aXBzX2FuZF90cmlja3MuaHRtIiBsYWJlbD0iVGlwcyBhbmQgdHJpY2tzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDEuaHRtI3N0aHJlZjMwNiIgbGFiZWw9IkltcHJvdmVkIEludGVybmF0aW9uYWxpemF0aW9uIGFuZCBMb2NhbGl6YXRpb24iIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDAyLmh0bSNDSkFDRURERSIgbGFiZWw9Ik11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZSIgLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ3aGF0c19uZXcwMDMuaHRtI0NKQURJRkhKIiBsYWJlbD0iU3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbmsiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA0Lmh0bSNDSkFCSUpFQyIgbGFiZWw9IkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHMiIC8+Ci0gICAgICA8dG9waWMgaHJlZj0id2hhdHNfbmV3MDA1Lmh0bSNDSkFDSkJEQSIgbGFiZWw9IkVjbGlwc2VMaW5rIDIueCBTdXBwb3J0IiAvPgotICAgICAgPHRvcGljIGhyZWY9IndoYXRzX25ldzAwNi5odG0jc3RocmVmMzA3IiBsYWJlbD0iVGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlIiAvPgotICAgIDwvdG9waWM+Ci0gICAgPHRvcGljIGhyZWY9ImxlZ2FsLmh0bSIgbGFiZWw9IiBMZWdhbCI+Ci0gICAgICA8dG9waWMgaHJlZj0iYWJvdXQuaHRtI3N0aHJlZjMwOSIgbGFiZWw9IkFib3V0IHRoaXMgY29udGVudCIgLz4KLSAgICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTI5NGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5XaGF0J3MgbmV3PC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IiBXaGF0J3MgbmV3IiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0ic3RocmVmMjkxIiBuYW1lPSJzdGhyZWYyOTEiPjwvYT4gV2hhdCdzIG5ldzwvcD4KLTxwPlRoaXMgc2VjdGlvbiBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgdGhlIGZvbGxvd2luZyBuZXcgZmVhdHVyZXMgYW5kIHNpZ25pZmljYW50IGNoYW5nZXMgbWFkZSB0byB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgZm9yIFJlbGVhc2UgMi4zOjwvcD4KLTx1bD4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwMi5odG0jQ0pBQ0VEREUiPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvYT48L3A+Ci08L2xpPgotPGxpPgotPHA+PGEgaHJlZj0id2hhdHNfbmV3MDAzLmh0bSNDSkFESUZISiI+U3VwcG9ydCBmb3IgSlBBIDIuMCBhbmQgRWNsaXBzZUxpbms8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNC5odG0jQ0pBQklKRUMiPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L2E+PC9wPgotPC9saT4KLTxsaT4KLTxwPjxhIGhyZWY9IndoYXRzX25ldzAwNS5odG0jQ0pBQ0pCREEiPkVjbGlwc2VMaW5rIDIueCBTdXBwb3J0PC9hPjwvcD4KLTwvbGk+Ci08L3VsPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDEuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2E0NDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMS5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkltcHJvdmVkIEludGVybmF0aW9uYWxpemF0aW9uIGFuZCBMb2NhbGl6YXRpb248L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iSW1wcm92ZWQgSW50ZXJuYXRpb25hbGl6YXRpb24gYW5kIExvY2FsaXphdGlvbiIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT48YSBpZD0ic3RocmVmMjkyIiBuYW1lPSJzdGhyZWYyOTIiPjwvYT4KLTxoMT5JbXByb3ZlZCBJbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgTG9jYWxpemF0aW9uPC9oMT4KLTxwPlRoaXMgcmVsZWFzZSBvZiB0aGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgcHJvdmlkZXMgaW1wcm92ZWQgaW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIGFuZCBsb2NhbGl6YXRpb24gc3VwcG9ydC4gRGFsaSBwcm9qZWN0cyBjYW4gc3VwcG9ydCBkaWZmZXJlbnQgbG9jYWxlcyBhbmQgcHJvY2Vzc2luZyBvZiBpbnRlcm5hdGlvbmFsIGRhdGEgKHN1Y2ggYXMgZGF0ZXMgYW5kIHN0cmluZ3MpLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDIuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjE1ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJNdWx0aXBsZSBJbXByb3ZlbWVudHMgdG8gdGhlIERhbGkgUGVyc3BlY3RpdmUiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxwPjxhIGlkPSJDSkFDRURERSIgbmFtZT0iQ0pBQ0VEREUiPjwvYT48L3A+Ci08ZGl2IGNsYXNzPSJzZWN0MSI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPk11bHRpcGxlIEltcHJvdmVtZW50cyB0byB0aGUgRGFsaSBQZXJzcGVjdGl2ZTwvaDE+Ci08cD5UaGVyZSBoYXZlIGJlZW4gbXVsdGlwbGUgaW1wcm92ZW1lbnRzIHRvIHRoZSBEYWxpIHBlcnNwZWN0aXZlcyB0byBpbXByb3ZlIGl0cyBlYXNlLW9mLXVzZTo8L3A+Ci08dWw+Ci08bGk+Ci08cD5UaGUgPGEgaHJlZj0icmVmX2NyZWF0ZV9qcGFfZW50aXR5X3dpemFyZC5odG0jQ0lBR0dHREYiPkNyZWF0ZSBKUEEgRW50aXR5IHdpemFyZDwvYT4gbm93IGFjY2VwdHMgc2hvcnQgbmFtZXMgYXMgYXR0cmlidXRlIHR5cGVzLjwvcD4KLTwvbGk+Ci08bGk+Ci08cD5EYWxpIHdpbGwgcGVyZm9ybSB2YWxpZGF0aW9uIGFmdGVyIHJlZnJlc2hpbmcgZGF0YWJhc2UgaW5mb3JtYXRpb24uPC9wPgotPC9saT4KLTxsaT4KLTxwPkRhbGkgYWxsb3dzIHByb2plY3QtbGV2ZWwgY3VzdG9taXphdGlvbiBmb3IgdmFsaWRhdGlvbiAoZXJyb3IgYW5kIHdhcm5pbmcgcmVwb3J0cyk8L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDMuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjFjYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwMy5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rPC90aXRsZT4KLTxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iT3JhY2xlIERBUkIgWEhUTUwgQ29udmVydGVyIChNb2RlID0gb2hqL29odykgLSBWZXJzaW9uIDUuMS4xIiAvPgotPG1ldGEgbmFtZT0iZGF0ZSIgY29udGVudD0iMjAxMC0wNS0xOVQ4OjEyOjQ5WiIgLz4KLTxtZXRhIG5hbWU9InJvYm90cyIgY29udGVudD0ibm9hcmNoaXZlIiAvPgotPG1ldGEgbmFtZT0iZG9jdGl0bGUiIGNvbnRlbnQ9IlN1cHBvcnQgZm9yIEpQQSAyLjAgYW5kIEVjbGlwc2VMaW5rIiAvPgotPG1ldGEgbmFtZT0icmVsbnVtIiBjb250ZW50PSJSZWxlYXNlIDIuMyIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IG9yYWNsZSAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxsaW5rIHJlbD0iY29weXJpZ2h0IiBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iIHRpdGxlPSJDb3B5cmlnaHQiIHR5cGU9InRleHQvaHRtbCIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iZGNvbW1vbi9jc3MvYmxhZmRvYy5jc3MiIHRpdGxlPSJPcmFjbGUgQkxBRkRvYyIgdHlwZT0idGV4dC9jc3MiIC8+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08cD48YSBpZD0iQ0pBRElGSEoiIG5hbWU9IkNKQURJRkhKIj48L2E+PC9wPgotPGRpdiBjbGFzcz0ic2VjdDEiPjwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLTxoMT5TdXBwb3J0IGZvciBKUEEgMi4wIGFuZCBFY2xpcHNlTGluazwvaDE+Ci08cD5UaGlzIHJlbGVhc2Ugb2YgdGhlIERhbGkgT1IgTWFwcGluZyBUb29sIHN1cHBvcnRzIGdlbmVyaWMgSlBBIDIuMCBhcyB3ZWxsIGFzIHNwZWNpZmljIGl0ZW1zIGZvciBFY2xpc3BlTGluayAxLjIuPC9wPgotPHVsPgotPGxpPgotPHA+RGVyaXZlZCBJRHM8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2FjaGluZyAoU2hhcmVkIENhY2hlIGFuZCBDYWNoYWJsZSk8L3A+Ci08L2xpPgotPGxpPgotPHA+Q2Fub25pY2FsIG1ldGFtb2RlbCBnZW5lcmF0aW9uPC9wPgotPC9saT4KLTxsaT4KLTxwPk9yZGVyIENvbHVtbiBjb25maWd1cmF0aW9uPC9wPgotPC9saT4KLTxsaT4KLTxwPkVsZW1lbnRDb2xsZWN0aW9uIG1hcHBpbmcgdHlwZTwvcD4KLTwvbGk+Ci08bGk+Ci08cD5DYXNjYWRlIGRldGFjaDwvcD4KLTwvbGk+Ci08bGk+Ci08cD5EYWxpIHdpbGwgdXBncmFkZSB5b3VyIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZnJvbSBKUEEgMS4wIHRvIDIuMC48L3A+Ci08L2xpPgotPC91bD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDQuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDU0NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNC5odG0KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkNvbnZlcnNpb24gb2YgSmF2YSBQcm9qZWN0cyB0byBKUEEgUHJvamVjdHM8L3RpdGxlPgotPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSJPcmFjbGUgREFSQiBYSFRNTCBDb252ZXJ0ZXIgKE1vZGUgPSBvaGovb2h3KSAtIFZlcnNpb24gNS4xLjEiIC8+Ci08bWV0YSBuYW1lPSJkYXRlIiBjb250ZW50PSIyMDEwLTA1LTE5VDg6MTI6NDlaIiAvPgotPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub2FyY2hpdmUiIC8+Ci08bWV0YSBuYW1lPSJkb2N0aXRsZSIgY29udGVudD0iQ29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0cyIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUJJSkVDIiBuYW1lPSJDSkFCSUpFQyI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+Q29udmVyc2lvbiBvZiBKYXZhIFByb2plY3RzIHRvIEpQQSBQcm9qZWN0czwvaDE+Ci08cD5UaGUgRGFsaSBPUiBNYXBwaW5nIFRvb2wgbm93IHVzZXMgdGhlIEVjbGlwc2UgPHNwYW4gY2xhc3M9ImJvbGQiPkNvbmZpZ3VyZTwvc3Bhbj4gbWVudSB0byBjb252ZXJ0IGV4aXN0aW5nIEphdmEgcHJvamVjdHMgdG8gSlBBIHByb2plY3RzLjwvcD4KLTxwPlNlZSA8YSBocmVmPSJ0YXNrczAwMS5odG0jQkVJQkFESEgiPiJDb252ZXJ0aW5nIGEgSmF2YSBQcm9qZWN0IHRvIGEgSlBBIFByb2plY3QiPC9hPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9InNlY3QxIiAtLT4KLTwhLS0gU3RhcnQgRm9vdGVyIC0tPgotPGRpdiBjbGFzcz0iZm9vdGVyIj4KLTx0YWJsZSBjbGFzcz0ic2ltcGxlIG9hY19ub193YXJuIiBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgotPGNvbCB3aWR0aD0iODYlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0cj4KLTx0ZCBhbGlnbj0ibGVmdCI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkNvcHlyaWdodCZuYnNwOyZjb3B5OyZuYnNwOzIwMDYsIDIwMTAsJm5ic3A7T3JhY2xlJm5ic3A7YW5kL29yJm5ic3A7aXRzJm5ic3A7YWZmaWxpYXRlcy4mbmJzcDtBbGwmbmJzcDtyaWdodHMmbmJzcDtyZXNlcnZlZC48L3NwYW4+PGJyIC8+Ci08YSBocmVmPSJkY29tbW9uL2h0bWwvY3B5ci5odG0iPjxzcGFuIGNsYXNzPSJjb3B5cmlnaHRsb2dvIj5MZWdhbCBOb3RpY2VzPC9zcGFuPjwvYT48L3RkPgotPC90cj4KLTwvdGFibGU+Ci08L2Rpdj4KLTwhLS0gY2xhc3M9ImZvb3RlciIgLS0+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvd2hhdHNfbmV3MDA1Lmh0bSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzFmOTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDUuaHRtCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotIAotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TdHlsZS1UeXBlIiBjb250ZW50PSJ0ZXh0L2NzcyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU2NyaXB0LVR5cGUiIGNvbnRlbnQ9InRleHQvamF2YXNjcmlwdCIgLz4KLTx0aXRsZT5FY2xpcHNlTGluayAyLnggU3VwcG9ydDwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJFY2xpcHNlTGluayAyLnggU3VwcG9ydCIgLz4KLTxtZXRhIG5hbWU9InJlbG51bSIgY29udGVudD0iUmVsZWFzZSAyLjMiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBvcmFjbGUgLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bGluayByZWw9ImNvcHlyaWdodCIgaHJlZj0iZGNvbW1vbi9odG1sL2NweXIuaHRtIiB0aXRsZT0iQ29weXJpZ2h0IiB0eXBlPSJ0ZXh0L2h0bWwiIC8+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImRjb21tb24vY3NzL2JsYWZkb2MuY3NzIiB0aXRsZT0iT3JhY2xlIEJMQUZEb2MiIHR5cGU9InRleHQvY3NzIiAvPgotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotPHA+PGEgaWQ9IkNKQUNKQkRBIiBuYW1lPSJDSkFDSkJEQSI+PC9hPjwvcD4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci08aDE+RWNsaXBzZUxpbmsgMi54IFN1cHBvcnQ8L2gxPgotPHA+UmVsZWFzZSAyLjMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgRWNsaXBzZUxpbmsgMi54IGZlYXR1cmVzLjwvcD4KLTxwPkVjbGlwc2VMaW5rICh0aGUgRWNsaXBzZSBQZXJzaXN0ZW5jZSBTZXJ2aWNlcyBQcm9qZWN0KSBpcyBhIGNvbXBsZXRlIHBlcnNpc3RlbmNlIGZyYW1lIHdvcmsuIFJlZmVyIHRvIDxjb2RlPjxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZWxpbmsvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VjbGlwc2VsaW5rLzwvYT48L2NvZGU+IGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci93aGF0c19uZXcwMDYuaHRtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMjg2N2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3doYXRzX25ldzAwNi5odG0KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlRhYmxlLXBlci1Db25jcmV0ZS1DbGFzcyBJbmhlcml0YW5jZTwvdGl0bGU+Ci08bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9Ik9yYWNsZSBEQVJCIFhIVE1MIENvbnZlcnRlciAoTW9kZSA9IG9oai9vaHcpIC0gVmVyc2lvbiA1LjEuMSIgLz4KLTxtZXRhIG5hbWU9ImRhdGUiIGNvbnRlbnQ9IjIwMTAtMDUtMTlUODoxMjo0OVoiIC8+Ci08bWV0YSBuYW1lPSJyb2JvdHMiIGNvbnRlbnQ9Im5vYXJjaGl2ZSIgLz4KLTxtZXRhIG5hbWU9ImRvY3RpdGxlIiBjb250ZW50PSJUYWJsZS1wZXItQ29uY3JldGUtQ2xhc3MgSW5oZXJpdGFuY2UiIC8+Ci08bWV0YSBuYW1lPSJyZWxudW0iIGNvbnRlbnQ9IlJlbGVhc2UgMi4zIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggb3JhY2xlIC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPGxpbmsgcmVsPSJjb3B5cmlnaHQiIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSIgdGl0bGU9IkNvcHlyaWdodCIgdHlwZT0idGV4dC9odG1sIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJkY29tbW9uL2Nzcy9ibGFmZG9jLmNzcyIgdGl0bGU9Ik9yYWNsZSBCTEFGRG9jIiB0eXBlPSJ0ZXh0L2NzcyIgLz4KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLTxkaXYgY2xhc3M9InNlY3QxIj48IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+PGEgaWQ9InN0aHJlZjI5MyIgbmFtZT0ic3RocmVmMjkzIj48L2E+Ci08aDE+VGFibGUtcGVyLUNvbmNyZXRlLUNsYXNzIEluaGVyaXRhbmNlPC9oMT4KLTxwPlRoZSBEYWxpIE9SIE1hcHBpbmcgVG9vbCBub3cgc3VwcG9ydHMgdGhlIEpQQSAxLjAtb3B0aW9uYWwgdGFibGUtcGVyLWNvbmNyZXRlLWNsYXNzIGluaGVyaXRhbmNlIG9wdGlvbi4gVGhpcyBmdW5jdGlvbmFsaXR5IG1heSBiZSByZXF1aXJlZCBpbiBKUEEgMi4wLjwvcD4KLTwvZGl2PgotPCEtLSBjbGFzcz0ic2VjdDEiIC0tPgotPCEtLSBTdGFydCBGb290ZXIgLS0+Ci08ZGl2IGNsYXNzPSJmb290ZXIiPgotPHRhYmxlIGNsYXNzPSJzaW1wbGUgb2FjX25vX3dhcm4iIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+Ci08Y29sIHdpZHRoPSI4NiUiIC8+Ci08Y29sIHdpZHRoPSIqIiAvPgotPHRyPgotPHRkIGFsaWduPSJsZWZ0Ij48c3BhbiBjbGFzcz0iY29weXJpZ2h0bG9nbyI+Q29weXJpZ2h0Jm5ic3A7JmNvcHk7Jm5ic3A7MjAwNiwgMjAxMCwmbmJzcDtPcmFjbGUmbmJzcDthbmQvb3ImbmJzcDtpdHMmbmJzcDthZmZpbGlhdGVzLiZuYnNwO0FsbCZuYnNwO3JpZ2h0cyZuYnNwO3Jlc2VydmVkLjwvc3Bhbj48YnIgLz4KLTxhIGhyZWY9ImRjb21tb24vaHRtbC9jcHlyLmh0bSI+PHNwYW4gY2xhc3M9ImNvcHlyaWdodGxvZ28iPkxlZ2FsIE5vdGljZXM8L3NwYW4+PC9hPjwvdGQ+Ci08L3RyPgotPC90YWJsZT4KLTwvZGl2PgotPCEtLSBjbGFzcz0iZm9vdGVyIiAtLT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZjYzVhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmc8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ1MzU5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW48L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDE0NTk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZTwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OGUyMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5qYXhiLmNvcmUuc2NoZW1hZ2VuPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpheGIuZWNsaXBzZWxpbmsuY29yZS5zY2hlbWFnZW4gYW5kIG1vdmVkIHRvIGpheGIgY29tcG9uZW50PC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNjU4NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsudWk8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5nZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ODIyNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0Lmdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmdlbjwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1NTJmOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuamF4Yi5jb3JlLnNjaGVtYWdlbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpheGIuY29yZS5zY2hlbWFnZW48L25hbWU+Ci0JPGNvbW1lbnQ+bW92ZWQgdG8gamF4YiBjb21wb25lbnQ8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qYXhiLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzMwMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpheGIudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qYXhiLnVpPC9uYW1lPgotCTxjb21tZW50Pm1vdmVkIHRvIGpheGIgY29tcG9uZW50PC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDAxYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLmpwdF8xLjAuMC4qClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTYzNGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWVjMjlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jU3VuIE1heSAyNyAxNToxMDowOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MGI1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUgMDYsIDIwMDc8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQuaW5pIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkODhiOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9aWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgInRpcHNBbmRUcmlja3NIcmVmIiBjb250YWlucyB0aGUgSGVscCB0b3BpYyBocmVmIHRvIGEgdGlwcyBhbmQgdHJpY2tzIHBhZ2UgCi0jIG9wdGlvbmFsCi10aXBzQW5kVHJpY2tzSHJlZj0vb3JnLmVjbGlwc2UuanB0LmRvYy51c2VyL3RpcHNfYW5kX3RyaWNrcy5odG0KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkYWFiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmMTcwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBTdXBwb3J0XG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBPcmFjbGUgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNiwgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDg5YmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGNvbXBvbmVudC54bWwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MTEzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZyI+Ci08ZGVzY3JpcHRpb24gdXJsPSIiPjwvZGVzY3JpcHRpb24+Ci08Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZyIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIiIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxMjY2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzRmYjM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyY2I1YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjE2Y2YyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowODoxOCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYzYjk2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eTtleGNsdWRlOj0ib3JnLmVjbGlwc2UuanB0LmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29udGVudHR5cGVzIgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMTAwLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjEwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5qMmVlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwgMy4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZndvcmtiZW5jaC5pbnRlZ3JhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3M7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5tb2R1bGVjb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMzAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjIuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4zMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuNS4xMDAsNC4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dCwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJwcm92O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnZhbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnByZWZzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmNvbnRlbnR0eXBlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS54bWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuc3luY2g7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucywKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUubGlicHJvdiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMCwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sCi1JbXBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSI0LjAuMSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU2YzViZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgICAgIHByb3BlcnR5X2ZpbGVzLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KLXNyYy5pbmNsdWRlcyA9IG1vZGVsLyxcCi0gICAgICAgICAgICAgICBzY2hlbWEvCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzA2Yzg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0KLSAgQ29udHJpYnV0b3JzOgotICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08Y29tcG9uZW50ICB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL2Rldi1kb2NzL0NvbHVtbiBIaWVyYXJjaHkudnNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL2Rldi1kb2NzL0NvbHVtbiBIaWVyYXJjaHkudnNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWViZWNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9kZXYtZG9jcy9Db2x1bW4gSGllcmFyY2h5LnZzZAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9kZXYtZG9jcy9UYWJsZSBIaWVyYXJjaHkudnNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL2Rldi1kb2NzL1RhYmxlIEhpZXJhcmNoeS52c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGE0ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL2Rldi1kb2NzL1RhYmxlIEhpZXJhcmNoeS52c2QKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvRGFsaUVtZkZvcm1hdHRlci54bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvRGFsaUVtZkZvcm1hdHRlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NzA2NWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL0RhbGlFbWZGb3JtYXR0ZXIueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9jb21tb24uZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMTMwNjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL2NvbW1vbi5lY29yZQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZWNvcmU6RVBhY2thZ2UgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeG1sbnM6ZWNvcmU9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiIG5hbWU9InhtbCIKLSAgICBuc1VSST0ianB0LmNvbW1vbi54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sIj4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdEpwYVJvb3RFT2JqZWN0IiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9KcGFSb290RU9iamVjdCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkpwYVJvb3RFT2JqZWN0IiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmVyc2lvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWFMb2NhdGlvbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIy8vRVN0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvanBhUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvanBhUmVzb3VyY2VNb2RlbHMuZ2VubW9kZWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5N2U5YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL2pwYVJlc291cmNlTW9kZWxzLmdlbm1vZGVsCisrKyAvZGV2L251bGwKQEAgLTEsNTEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Z2VubW9kZWw6R2VuTW9kZWwgeG1pOnZlcnNpb249IjIuMCIKLSAgICB4bWxuczp4bWk9Imh0dHA6Ly93d3cub21nLm9yZy9YTUkiIHhtbG5zOmVjb3JlPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIgotICAgIHhtbG5zOmdlbm1vZGVsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIiBtb2RlbERpcmVjdG9yeT0iL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMiCi0gICAgY3JlYXRpb25Db21tYW5kcz0iZmFsc2UiIGNyZWF0aW9uSWNvbnM9ImZhbHNlIiBlZGl0RGlyZWN0b3J5PSIiIGVkaXRvckRpcmVjdG9yeT0iIgotICAgIG1vZGVsUGx1Z2luSUQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIgbW9kZWxOYW1lPSJDb3JlIiBlZGl0UGx1Z2luQ2xhc3M9IiIgZWRpdG9yUGx1Z2luQ2xhc3M9IiIKLSAgICB1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIiByb290RXh0ZW5kc0ludGVyZmFjZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0IgotICAgIHJvb3RFeHRlbmRzQ2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0IiBzdXBwcmVzc0ludGVyZmFjZXM9InRydWUiCi0gICAgdGVzdHNEaXJlY3Rvcnk9IiIgdGVzdFN1aXRlQ2xhc3M9IiIgaW1wb3J0ZXJJRD0ib3JnLmVjbGlwc2UuZW1mLmltcG9ydGVyLmVjb3JlIgotICAgIGNvbXBsaWFuY2VMZXZlbD0iNS4wIiBjb3B5cmlnaHRGaWVsZHM9ImZhbHNlIiB1c2VkR2VuUGFja2FnZXM9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZW1mLmVjb3JlL21vZGVsL0Vjb3JlLmdlbm1vZGVsIy8vZWNvcmUiPgotICA8Zm9yZWlnbk1vZGVsPmNvbW1vbi5lY29yZTwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPm9ybS5lY29yZTwvZm9yZWlnbk1vZGVsPgotICA8Zm9yZWlnbk1vZGVsPnBlcnNpc3RlbmNlLmVjb3JlPC9mb3JlaWduTW9kZWw+Ci0gIDxnZW5QYWNrYWdlcyBwcmVmaXg9IkNvbW1vbiIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZSIgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIKLSAgICAgIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZWNvcmVQYWNrYWdlPSJjb21tb24uZWNvcmUjLyI+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9BYnN0cmFjdEpwYVJvb3RFT2JqZWN0Ii8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJjb21tb24uZWNvcmUjLy9KcGFSb290RU9iamVjdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgY29tbW9uLmVjb3JlIy8vSnBhUm9vdEVPYmplY3QvdmVyc2lvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIGNvbW1vbi5lY29yZSMvL0pwYVJvb3RFT2JqZWN0L3NjaGVtYUxvY2F0aW9uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJPcm0iIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UiIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiCi0gICAgICBhZGFwdGVyRmFjdG9yeT0iZmFsc2UiIGVjb3JlUGFja2FnZT0ib3JtLmVjb3JlIy8iPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0Rpc2NyaW1pbmF0b3JUeXBlL1NUUklORyIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9EaXNjcmltaW5hdG9yVHlwZS9DSEFSIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0Rpc2NyaW1pbmF0b3JUeXBlL0lOVEVHRVIiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9FbnVtVHlwZSI+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0VudW1UeXBlL09SRElOQUwiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRW51bVR5cGUvU1RSSU5HIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vRmV0Y2hUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRmV0Y2hUeXBlL0xBWlkiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vRmV0Y2hUeXBlL0VBR0VSIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vR2VuZXJhdGlvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9UQUJMRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9TRVFVRU5DRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9JREVOVElUWSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9HZW5lcmF0aW9uVHlwZS9BVVRPIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0ib3JtLmVjb3JlIy8vSW5oZXJpdGFuY2VUeXBlIj4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vSW5oZXJpdGFuY2VUeXBlL1NJTkdMRV9UQUJMRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZVR5cGUvSk9JTkVEIi8+Ci0gICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL0luaGVyaXRhbmNlVHlwZS9UQUJMRV9QRVJfQ0xBU1MiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5FbnVtcyB0eXBlU2FmZUVudW1Db21wYXRpYmxlPSJmYWxzZSIgZWNvcmVFbnVtPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUvREFURSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUvVElNRSIvPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy9UZW1wb3JhbFR5cGUvVElNRVNUQU1QIi8+Ci0gICAgPC9nZW5FbnVtcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQmFzZUNvbHVtbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzZUNvbHVtbi9pbnNlcnRhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzZUNvbHVtbi9udWxsYWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2VDb2x1bW4vdGFibGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNlQ29sdW1uL3VuaXF1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2VDb2x1bW4vdXBkYXRhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxCYXNlQ29sdW1uIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbEVtYmVkZGVkIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nL21hcEtleSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE5hbWVkQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxOYW1lZENvbHVtbi9jb2x1bW5EZWZpbml0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sTmFtZWRDb2x1bW4vbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbi9kaXNjcmltaW5hdG9yVHlwZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uL2xlbmd0aCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEJhc2VKb2luQ29sdW1uIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNlSm9pbkNvbHVtbi9yZWZlcmVuY2VkQ29sdW1uTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nL3RhcmdldEVudGl0eSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Fic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZy9mZXRjaCIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcvY2FzY2FkZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nL29wdGlvbmFsIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUYWJsZS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUYWJsZS9jYXRhbG9nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUYWJsZS9zY2hlbWEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQWJzdHJhY3RYbWxUYWJsZS91bmlxdWVDb25zdHJhaW50cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEFjY2Vzc0hvbGRlciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQWNjZXNzSG9sZGVyL2FjY2VzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU1hcHBpbmcvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIvYXNzb2NpYXRpb25PdmVycmlkZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlL2NvbHVtbiIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyL2F0dHJpYnV0ZU92ZXJyaWRlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9pZHMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9lbWJlZGRlZElkcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2Jhc2ljcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3ZlcnNpb25zIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0F0dHJpYnV0ZXMvbWFueVRvT25lcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL29uZVRvTWFueXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9vbmVUb09uZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vQXR0cmlidXRlcy9tYW55VG9NYW55cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL2VtYmVkZGVkcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9BdHRyaWJ1dGVzL3RyYW5zaWVudHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxCYXNpYyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQmFzaWMvZmV0Y2giLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxCYXNpYy9vcHRpb25hbCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9DYXNjYWRlVHlwZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlL2Nhc2NhZGVBbGwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZVBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZU1lcmdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0Nhc2NhZGVUeXBlL2Nhc2NhZGVSZW1vdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ2FzY2FkZVR5cGUvY2FzY2FkZVJlZnJlc2giLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sQ2xhc3NSZWZlcmVuY2UiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbENsYXNzUmVmZXJlbmNlL2NsYXNzTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxDb2xsZWN0aW9uVGFibGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbENvbHVtbiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sQ29sdW1uL2xlbmd0aCIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbENvbHVtbi9wcmVjaXNpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxDb2x1bW4vc2NhbGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vQ29sdW1uTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0NvbHVtbk1hcHBpbmcvY29sdW1uIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0NvbHVtblJlc3VsdCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vQ29sdW1uUmVzdWx0L25hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbENvbnZlcnRpYmxlTWFwcGluZy9sb2IiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmcvdGVtcG9yYWwiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmcvZW51bWVyYXRlZCIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxEaXNjcmltaW5hdG9yQ29sdW1uIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRWxlbWVudENvbGxlY3Rpb24iLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbWJlZGRhYmxlIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbWJlZGRlZCIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sRW1iZWRkZWRJZCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEVudGl0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3RhYmxlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9zZWNvbmRhcnlUYWJsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5L3ByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvaW5oZXJpdGFuY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZGlzY3JpbWluYXRvclZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9kaXNjcmltaW5hdG9yQ29sdW1uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eS9zcWxSZXN1bHRTZXRNYXBwaW5ncyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eS9leGNsdWRlRGVmYXVsdExpc3RlbmVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEVudGl0eS9leGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHkvZW50aXR5TGlzdGVuZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0VudGl0eUxpc3RlbmVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9FbnRpdHlMaXN0ZW5lci9jbGFzc05hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXJzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vRW50aXR5TGlzdGVuZXJzL2VudGl0eUxpc3RlbmVycyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvZGVzY3JpcHRpb24iLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9wYWNrYWdlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3Mvc2NoZW1hIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvY2F0YWxvZyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9zZXF1ZW5jZUdlbmVyYXRvcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRW50aXR5TWFwcGluZ3MvdGFibGVHZW5lcmF0b3JzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL3NxbFJlc3VsdFNldE1hcHBpbmdzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEVudGl0eU1hcHBpbmdzL21hcHBlZFN1cGVyY2xhc3NlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9lbnRpdGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxFbnRpdHlNYXBwaW5ncy9lbWJlZGRhYmxlcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9FbnRpdHlSZXN1bHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0VudGl0eVJlc3VsdC9kaXNjcmltaW5hdG9yQ29sdW1uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vRW50aXR5UmVzdWx0L2VudGl0eUNsYXNzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL0VudGl0eVJlc3VsdC9maWVsZFJlc3VsdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vRXZlbnRNZXRob2QiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0V2ZW50TWV0aG9kL21ldGhvZE5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxFdmVudE1ldGhvZENvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyL3ByZVBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRXZlbnRNZXRob2RDb250YWluZXIvcG9zdFBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRXZlbnRNZXRob2RDb250YWluZXIvcHJlUmVtb3ZlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyL3Bvc3RSZW1vdmUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRXZlbnRNZXRob2RDb250YWluZXIvcHJlVXBkYXRlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyL3Bvc3RVcGRhdGUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sRXZlbnRNZXRob2RDb250YWluZXIvcG9zdExvYWQiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vRmllbGRSZXN1bHQiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL0ZpZWxkUmVzdWx0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9GaWVsZFJlc3VsdC9jb2x1bW4iLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxHZW5lcmF0ZWRWYWx1ZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sR2VuZXJhdGVkVmFsdWUvZ2VuZXJhdG9yIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sR2VuZXJhdGVkVmFsdWUvc3RyYXRlZ3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3IiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRvci9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sR2VuZXJhdG9yL2luaXRpYWxWYWx1ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRvci9hbGxvY2F0aW9uU2l6ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEdlbmVyYXRvckNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEdlbmVyYXRvckNvbnRhaW5lci9zZXF1ZW5jZUdlbmVyYXRvciIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxHZW5lcmF0b3JDb250YWluZXIvdGFibGVHZW5lcmF0b3IiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxJZCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbElkL2dlbmVyYXRlZFZhbHVlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sSWRDbGFzc0NvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbElkQ2xhc3NDb250YWluZXIvaWRDbGFzcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Jbmhlcml0YW5jZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vSW5oZXJpdGFuY2Uvc3RyYXRlZ3kiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxKb2luQ29sdW1uIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxKb2luQ29sdW1uQ29udGFpbmVyIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sSm9pbkNvbHVtbkNvbnRhaW5lci9qb2luQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbEpvaW5UYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbEpvaW5UYWJsZS9pbnZlcnNlSm9pbkNvbHVtbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxKb2luVGFibGVDb250YWluZXIiPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxKb2luVGFibGVDb250YWluZXIvam9pblRhYmxlIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL0xvYiIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFueVRvTWFueSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTWFueVRvT25lIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vTWFwS2V5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9NYXBLZXkvbmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE1hcHBlZEJ5TWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sTWFwcGVkQnlNYXBwaW5nL21hcHBlZEJ5Ii8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxNYXBwZWRTdXBlcmNsYXNzL2V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbE1hcHBlZFN1cGVyY2xhc3MvZW50aXR5TGlzdGVuZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkiPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbE5hbWVkTmF0aXZlUXVlcnkvcmVzdWx0Q2xhc3MiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxOYW1lZE5hdGl2ZVF1ZXJ5L3Jlc3VsdFNldE1hcHBpbmciLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTmFtZWRRdWVyeSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE9uZVRvTWFueSIvPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT25lVG9PbmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE9yZGVyYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sT3JkZXJhYmxlL29yZGVyQnkiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sT3JkZXJDb2x1bW4iLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbE92ZXJyaWRlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxPdmVycmlkZS9uYW1lIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy9zY2hlbWEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy9jYXRhbG9nIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvY2FzY2FkZVBlcnNpc3QiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMvZW50aXR5TGlzdGVuZXJzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS94bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS9wZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFJlZmVyZW5jZVRhYmxlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUmVmZXJlbmNlVGFibGUvam9pbkNvbHVtbnMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUG9zdExvYWQiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Qb3N0UGVyc2lzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1Bvc3RSZW1vdmUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9Qb3N0VXBkYXRlIi8+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vUHJlUGVyc2lzdCIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1ByZVJlbW92ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1ByZVVwZGF0ZSIvPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uIi8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyL3ByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFF1ZXJ5Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxRdWVyeS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sUXVlcnkvcXVlcnkiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vWG1sUXVlcnkvaGludHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lciI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFF1ZXJ5Q29udGFpbmVyL25hbWVkUXVlcmllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9YbWxRdWVyeUNvbnRhaW5lci9uYW1lZE5hdGl2ZVF1ZXJpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sUXVlcnlIaW50Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxRdWVyeUhpbnQvbmFtZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFF1ZXJ5SGludC92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxTZWNvbmRhcnlUYWJsZSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFNlY29uZGFyeVRhYmxlL3ByaW1hcnlLZXlKb2luQ29sdW1ucyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvci9zZXF1ZW5jZU5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vU3FsUmVzdWx0U2V0TWFwcGluZy9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1NxbFJlc3VsdFNldE1hcHBpbmcvZW50aXR5UmVzdWx0cyIvPgotICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy9TcWxSZXN1bHRTZXRNYXBwaW5nL2NvbHVtblJlc3VsdHMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVGFibGUiLz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci90YWJsZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL2NhdGFsb2ciLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci9zY2hlbWEiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci9wa0NvbHVtbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci92YWx1ZUNvbHVtbk5hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy9YbWxUYWJsZUdlbmVyYXRvci9wa0NvbHVtblZhbHVlIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFRhYmxlR2VuZXJhdG9yL3VuaXF1ZUNvbnN0cmFpbnRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVHJhbnNpZW50Ii8+Ci0gICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy9YbWxUeXBlTWFwcGluZyI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVHlwZU1hcHBpbmcvY2xhc3NOYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVHlwZU1hcHBpbmcvbWV0YWRhdGFDb21wbGV0ZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL1htbFR5cGVNYXBwaW5nL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL1htbFR5cGVNYXBwaW5nL2F0dHJpYnV0ZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vWG1sVW5pcXVlQ29uc3RyYWludCI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vWG1sVW5pcXVlQ29uc3RyYWludC9jb2x1bW5OYW1lcyIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL1htbFZlcnNpb24iLz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJPcm1WMl8wIiBiYXNlUGFja2FnZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybSIKLSAgICAgICAgZGlzcG9zYWJsZVByb3ZpZGVyRmFjdG9yeT0idHJ1ZSIgYWRhcHRlckZhY3Rvcnk9ImZhbHNlIiBlY29yZVBhY2thZ2U9Im9ybS5lY29yZSMvL3YyXzAiPgotICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09Im9ybS5lY29yZSMvL3YyXzAvTG9ja01vZGVUeXBlXzJfMCI+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wL05PTkUiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy92Ml8wL0xvY2tNb2RlVHlwZV8yXzAvUkVBRCIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL3YyXzAvTG9ja01vZGVUeXBlXzJfMC9XUklURSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9Im9ybS5lY29yZSMvL3YyXzAvTG9ja01vZGVUeXBlXzJfMC9PUFRJTUlTVElDIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wL09QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0ib3JtLmVjb3JlIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wL1BFU1NJTUlTVElDX1JFQUQiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy92Ml8wL0xvY2tNb2RlVHlwZV8yXzAvUEVTU0lNSVNUSUNfV1JJVEUiLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJvcm0uZWNvcmUjLy92Ml8wL0xvY2tNb2RlVHlwZV8yXzAvUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIi8+Ci0gICAgICA8L2dlbkVudW1zPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAvZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMC9kZXNjcmlwdGlvbiIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbEF0dHJpYnV0ZXNfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sQXR0cmlidXRlc18yXzAvZGVzY3JpcHRpb24iLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEF0dHJpYnV0ZXNfMl8wL2VsZW1lbnRDb2xsZWN0aW9ucyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbENhY2hlYWJsZV8yXzAiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxDYWNoZWFibGVfMl8wL2NhY2hlYWJsZSIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbENhc2NhZGVUeXBlXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbENhc2NhZGVUeXBlXzJfMC9jYXNjYWRlRGV0YWNoIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sQ29sbGVjdGlvblRhYmxlXzJfMCIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbERlcml2ZWRJZF8yXzAiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxEZXJpdmVkSWRfMl8wL2lkIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL3RhcmdldENsYXNzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9mZXRjaCIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL21hcEtleSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wL21hcEtleUNsYXNzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAvbWFwS2V5Q29sdW1uIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAvbWFwS2V5Sm9pbkNvbHVtbnMiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9jb2x1bW4iLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIHByb3BlcnR5PSJOb25lIiBjaGlsZHJlbj0idHJ1ZSIgY3JlYXRlQ2hpbGQ9InRydWUiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RVJlZmVyZW5jZSBvcm0uZWNvcmUjLy92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC9jb2xsZWN0aW9uVGFibGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxFbWJlZGRlZF8yXzAiLz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxFbnRpdHlfMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sRXZlbnRNZXRob2RfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sRXZlbnRNZXRob2RfMl8wL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sR2VuZXJhdG9yXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbEdlbmVyYXRvcl8yXzAvZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxNYW55VG9NYW55XzJfMCIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAvbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAvbWFwS2V5VGVtcG9yYWwiLz4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMC9tYXBLZXlFbnVtZXJhdGVkIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sTWFwc0lkXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE1hcHNJZF8yXzAvbWFwc0lkIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wL21hcEtleUNsYXNzIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wL21hcEtleUNvbHVtbiIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgcHJvcGVydHk9Ik5vbmUiIGNoaWxkcmVuPSJ0cnVlIiBjcmVhdGVDaGlsZD0idHJ1ZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFUmVmZXJlbmNlIG9ybS5lY29yZSMvL3YyXzAvWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC9tYXBLZXlKb2luQ29sdW1ucyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbE5hbWVkUXVlcnlfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sTmFtZWRRdWVyeV8yXzAvbG9ja01vZGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxPbmVUb01hbnlfMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sT25lVG9PbmVfMl8wIi8+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJhYmxlXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2Ugb3JtLmVjb3JlIy8vdjJfMC9YbWxPcmRlcmFibGVfMl8wL29yZGVyQ29sdW1uIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sT3JkZXJDb2x1bW5fMl8wL251bGxhYmxlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC9pbnNlcnRhYmxlIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC91cGRhdGFibGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxPcnBoYW5SZW1vdmFibGVfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMC9vcnBoYW5SZW1vdmFsIi8+Ci0gICAgICA8L2dlbkNsYXNzZXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9Im9ybS5lY29yZSMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wL2Rlc2NyaXB0aW9uIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMC9kZWxpbWl0ZWRJZGVudGlmaWVycyIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAvZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeV8yXzAiPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgb3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeV8yXzAvZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxRdWVyeUhpbnRfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sUXVlcnlIaW50XzJfMC9kZXNjcmlwdGlvbiIvPgotICAgICAgPC9nZW5DbGFzc2VzPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC9jYXRhbG9nIi8+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC9zY2hlbWEiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCIvPgotICAgICAgPGdlbkNsYXNzZXMgaW1hZ2U9ImZhbHNlIiBlY29yZUNsYXNzPSJvcm0uZWNvcmUjLy92Ml8wL1htbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIG9ybS5lY29yZSMvL3YyXzAvWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAvZGVzY3JpcHRpb24iLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICAgIDxnZW5DbGFzc2VzIGltYWdlPSJmYWxzZSIgZWNvcmVDbGFzcz0ib3JtLmVjb3JlIy8vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMCI+Ci0gICAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBvcm0uZWNvcmUjLy92Ml8wL1htbFVuaXF1ZUNvbnN0cmFpbnRfMl8wL25hbWUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICA8L2dlblBhY2thZ2VzPgotICA8Z2VuUGFja2FnZXMgcHJlZml4PSJQZXJzaXN0ZW5jZSIgYmFzZVBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZSIKLSAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZWNvcmVQYWNrYWdlPSJwZXJzaXN0ZW5jZS5lY29yZSMvIj4KLSAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiPgotICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS9KVEEiLz4KLSAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUvUkVTT1VSQ0VfTE9DQUwiLz4KLSAgICA8L2dlbkVudW1zPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sSmF2YUNsYXNzUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbEphdmFDbGFzc1JlZi9qYXZhQ2xhc3MiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxKYXJGaWxlUmVmIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbEphckZpbGVSZWYvZmlsZU5hbWUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxNYXBwaW5nRmlsZVJlZiI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxNYXBwaW5nRmlsZVJlZi9maWxlTmFtZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8Z2VuQ2xhc3NlcyBlY29yZUNsYXNzPSJwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZVVuaXRzIi8+Ci0gICAgPC9nZW5DbGFzc2VzPgotICAgIDxnZW5DbGFzc2VzIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0Ij4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC9kZXNjcmlwdGlvbiIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L3Byb3ZpZGVyIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvanRhRGF0YVNvdXJjZSIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L25vbkp0YURhdGFTb3VyY2UiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvbWFwcGluZ0ZpbGVzIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvamFyRmlsZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvY2xhc3NlcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L2V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQZXJzaXN0ZW5jZVVuaXQvcHJvcGVydGllcyIvPgotICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vWG1sUGVyc2lzdGVuY2VVbml0L25hbWUiLz4KLSAgICAgIDxnZW5GZWF0dXJlcyBjcmVhdGVDaGlsZD0iZmFsc2UiIGVjb3JlRmVhdHVyZT0iZWNvcmU6RUF0dHJpYnV0ZSBwZXJzaXN0ZW5jZS5lY29yZSMvL1htbFBlcnNpc3RlbmNlVW5pdC90cmFuc2FjdGlvblR5cGUiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQcm9wZXJ0aWVzIj4KLSAgICAgIDxnZW5GZWF0dXJlcyBwcm9wZXJ0eT0iTm9uZSIgY2hpbGRyZW49InRydWUiIGNyZWF0ZUNoaWxkPSJ0cnVlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVSZWZlcmVuY2UgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQcm9wZXJ0aWVzL3Byb3BlcnRpZXMiLz4KLSAgICA8L2dlbkNsYXNzZXM+Ci0gICAgPGdlbkNsYXNzZXMgZWNvcmVDbGFzcz0icGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQcm9wZXJ0eSI+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQcm9wZXJ0eS9uYW1lIi8+Ci0gICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy9YbWxQcm9wZXJ0eS92YWx1ZSIvPgotICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8bmVzdGVkR2VuUGFja2FnZXMgcHJlZml4PSJQZXJzaXN0ZW5jZVYyXzAiIGJhc2VQYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UiCi0gICAgICAgIGRpc3Bvc2FibGVQcm92aWRlckZhY3Rvcnk9InRydWUiIGFkYXB0ZXJGYWN0b3J5PSJmYWxzZSIgZWNvcmVQYWNrYWdlPSJwZXJzaXN0ZW5jZS5lY29yZSMvL3YyXzAiPgotICAgICAgPGdlbkVudW1zIHR5cGVTYWZlRW51bUNvbXBhdGlibGU9ImZhbHNlIiBlY29yZUVudW09InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAvQUxMIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC9OT05FIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC9FTkFCTEVfU0VMRUNUSVZFIi8+Ci0gICAgICAgIDxnZW5FbnVtTGl0ZXJhbHMgZWNvcmVFbnVtTGl0ZXJhbD0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC9ESVNBQkxFX1NFTEVDVElWRSIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAvVU5TUEVDSUZJRUQiLz4KLSAgICAgIDwvZ2VuRW51bXM+Ci0gICAgICA8Z2VuRW51bXMgdHlwZVNhZmVFbnVtQ29tcGF0aWJsZT0iZmFsc2UiIGVjb3JlRW51bT0icGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAiPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wL0FVVE8iLz4KLSAgICAgICAgPGdlbkVudW1MaXRlcmFscyBlY29yZUVudW1MaXRlcmFsPSJwZXJzaXN0ZW5jZS5lY29yZSMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMC9DQUxMQkFDSyIvPgotICAgICAgICA8Z2VuRW51bUxpdGVyYWxzIGVjb3JlRW51bUxpdGVyYWw9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wL05PTkUiLz4KLSAgICAgIDwvZ2VuRW51bXM+Ci0gICAgICA8Z2VuQ2xhc3NlcyBpbWFnZT0iZmFsc2UiIGVjb3JlQ2xhc3M9InBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wIj4KLSAgICAgICAgPGdlbkZlYXR1cmVzIGNyZWF0ZUNoaWxkPSJmYWxzZSIgZWNvcmVGZWF0dXJlPSJlY29yZTpFQXR0cmlidXRlIHBlcnNpc3RlbmNlLmVjb3JlIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wL3NoYXJlZENhY2hlTW9kZSIvPgotICAgICAgICA8Z2VuRmVhdHVyZXMgY3JlYXRlQ2hpbGQ9ImZhbHNlIiBlY29yZUZlYXR1cmU9ImVjb3JlOkVBdHRyaWJ1dGUgcGVyc2lzdGVuY2UuZWNvcmUjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdF8yXzAvdmFsaWRhdGlvbk1vZGUiLz4KLSAgICAgIDwvZ2VuQ2xhc3Nlcz4KLSAgICA8L25lc3RlZEdlblBhY2thZ2VzPgotICA8L2dlblBhY2thZ2VzPgotPC9nZW5tb2RlbDpHZW5Nb2RlbD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvb3JtLmVjb3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc4MzI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9tb2RlbC9vcm0uZWNvcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0ib3JtIgotICAgIG5zVVJJPSJqcHQub3JtLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0iPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2VDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sTmFtZWRDb2x1bW4iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbnNlcnRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibnVsbGFibGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idW5pcXVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxCYXNlQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uICMvL1htbEJhc2VDb2x1bW4iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIgotICAgICAgYWJzdHJhY3Q9InRydWUiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uICMvL1htbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxFbWJlZGRlZCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmciCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyAjLy9YbWxNYXBwZWRCeU1hcHBpbmcgIy8vWG1sSm9pblRhYmxlQ29udGFpbmVyICMvL1htbE9yZGVyYWJsZSAjLy92Ml8wL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXkiIGVUeXBlPSIjLy9NYXBLZXkiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjb2x1bW5EZWZpbml0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy9YbWxOYW1lZENvbHVtbiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NyaW1pbmF0b3JUeXBlIiBlVHlwZT0iIy8vRGlzY3JpbWluYXRvclR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlNUUklORyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEJhc2VKb2luQ29sdW1uIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29sdW1uIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icmVmZXJlbmNlZENvbHVtbk5hbWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkFic3RyYWN0WG1sTmFtZWRDb2x1bW4iIGFic3RyYWN0PSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbE5hbWVkQ29sdW1uIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0YXJnZXRFbnRpdHkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZldGNoIiBlVHlwZT0iIy8vRmV0Y2hUeXBlIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSJMQVpZIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNhc2NhZGUiIGVUeXBlPSIjLy9DYXNjYWRlVHlwZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmciCi0gICAgICBhYnN0cmFjdD0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyAjLy9YbWxKb2luVGFibGVDb250YWluZXIgIy8vWG1sSm9pbkNvbHVtbkNvbnRhaW5lciAjLy92Ml8wL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ib3B0aW9uYWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJBYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFRhYmxlICMvL1htbFJlZmVyZW5jZVRhYmxlIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxUYWJsZSIgYWJzdHJhY3Q9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InVuaXF1ZUNvbnN0cmFpbnRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFVuaXF1ZUNvbnN0cmFpbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQWJzdHJhY3RYbWxUeXBlTWFwcGluZyIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vWG1sVHlwZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBY2Nlc3NIb2xkZXIiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJhY2Nlc3MiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEF0dHJpYnV0ZU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUiIGVTdXBlclR5cGVzPSIjLy9YbWxPdmVycmlkZSAjLy9YbWxKb2luQ29sdW1uQ29udGFpbmVyICMvL3YyXzAvWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImFzc29jaWF0aW9uT3ZlcnJpZGVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlT3ZlcnJpZGUiIGVTdXBlclR5cGVzPSIjLy9YbWxPdmVycmlkZSAjLy92Ml8wL1htbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbHVtbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbENvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdHRyaWJ1dGVPdmVycmlkZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQXR0cmlidXRlcyIgZVN1cGVyVHlwZXM9IiMvL3YyXzAvWG1sQXR0cmlidXRlc18yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZHMiIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sSWQiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW1iZWRkZWRJZHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sRW1iZWRkZWRJZCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJiYXNpY3MiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sQmFzaWMiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idmVyc2lvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sVmVyc2lvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYW55VG9PbmVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE1hbnlUb09uZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvbmVUb01hbnlzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE9uZVRvTWFueSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJvbmVUb09uZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sT25lVG9PbmUiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFueVRvTWFueXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sTWFueVRvTWFueSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbWJlZGRlZHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sRW1iZWRkZWQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0idHJhbnNpZW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxUcmFuc2llbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQmFzaWMiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgIy8vQ29sdW1uTWFwcGluZyAjLy9YbWxDb252ZXJ0aWJsZU1hcHBpbmciPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJmZXRjaCIgZVR5cGU9IiMvL0ZldGNoVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iTEFaWSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcHRpb25hbCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNhc2NhZGVUeXBlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxDYXNjYWRlVHlwZV8yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlQWxsIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZVBlcnNpc3QiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlTWVyZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlUmVtb3ZlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZVJlZnJlc2giIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDbGFzc1JlZmVyZW5jZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29sbGVjdGlvblRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZSAjLy92Ml8wL1htbENvbGxlY3Rpb25UYWJsZV8yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2x1bW4iIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEJhc2VDb2x1bW4iPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJsZW5ndGgiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InByZWNpc2lvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9JbnRPYmplY3QiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NhbGUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkNvbHVtbk1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb2x1bW4iIGVUeXBlPSIjLy9YbWxDb2x1bW4iCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iQ29sdW1uUmVzdWx0Ij4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ29udmVydGlibGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvYiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRlbXBvcmFsIiBlVHlwZT0iIy8vVGVtcG9yYWxUeXBlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudW1lcmF0ZWQiIGVUeXBlPSIjLy9FbnVtVHlwZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxEaXNjcmltaW5hdG9yQ29sdW1uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVsZW1lbnRDb2xsZWN0aW9uIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW1iZWRkYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sRW1iZWRkZWQgIy8vdjJfMC9YbWxFbWJlZGRlZF8yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFbWJlZGRlZElkIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxFbWJlZGRlZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVHlwZU1hcHBpbmcgIy8vWG1sUXVlcnlDb250YWluZXIgIy8vWG1sR2VuZXJhdG9yQ29udGFpbmVyICMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyICMvL1htbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyICMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgIy8vdjJfMC9YbWxFbnRpdHlfMl8wICMvL1htbElkQ2xhc3NDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWJsZSIgZVR5cGU9IiMvL1htbFRhYmxlIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNlY29uZGFyeVRhYmxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxTZWNvbmRhcnlUYWJsZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaW5oZXJpdGFuY2UiIGVUeXBlPSIjLy9Jbmhlcml0YW5jZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkaXNjcmltaW5hdG9yVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImRpc2NyaW1pbmF0b3JDb2x1bW4iIGVUeXBlPSIjLy9YbWxEaXNjcmltaW5hdG9yQ29sdW1uIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InNxbFJlc3VsdFNldE1hcHBpbmdzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1NxbFJlc3VsdFNldE1hcHBpbmciIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eUxpc3RlbmVycyIgZVR5cGU9IiMvL0VudGl0eUxpc3RlbmVycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbnRpdHlMaXN0ZW5lciIgZVN1cGVyVHlwZXM9IiMvL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyICMvL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2xhc3NOYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJFbnRpdHlMaXN0ZW5lcnMiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlMaXN0ZW5lcnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRW50aXR5TGlzdGVuZXIiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sRW50aXR5TWFwcGluZ3MiIGVTdXBlclR5cGVzPSJjb21tb24uZWNvcmUjLy9BYnN0cmFjdEpwYVJvb3RFT2JqZWN0ICMvL1htbFF1ZXJ5Q29udGFpbmVyICMvL1htbEFjY2Vzc0hvbGRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBhY2thZ2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNjaGVtYSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2F0YWxvZyIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2VHZW5lcmF0b3JzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFNlcXVlbmNlR2VuZXJhdG9yIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InRhYmxlR2VuZXJhdG9ycyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxUYWJsZUdlbmVyYXRvciIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJzcWxSZXN1bHRTZXRNYXBwaW5ncyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9TcWxSZXN1bHRTZXRNYXBwaW5nIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcHBlZFN1cGVyY2xhc3NlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxNYXBwZWRTdXBlcmNsYXNzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0aWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEVudGl0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbWJlZGRhYmxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxFbWJlZGRhYmxlIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IkVudGl0eVJlc3VsdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRpc2NyaW1pbmF0b3JDb2x1bW4iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImVudGl0eUNsYXNzIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJmaWVsZFJlc3VsdHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vRmllbGRSZXN1bHQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iRXZlbnRNZXRob2QiIGFic3RyYWN0PSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxFdmVudE1ldGhvZF8yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtZXRob2ROYW1lIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFdmVudE1ldGhvZENvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVQZXJzaXN0IiBlVHlwZT0iIy8vUHJlUGVyc2lzdCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0UGVyc2lzdCIgZVR5cGU9IiMvL1Bvc3RQZXJzaXN0IgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByZVJlbW92ZSIgZVR5cGU9IiMvL1ByZVJlbW92ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwb3N0UmVtb3ZlIiBlVHlwZT0iIy8vUG9zdFJlbW92ZSIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmVVcGRhdGUiIGVUeXBlPSIjLy9QcmVVcGRhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdFVwZGF0ZSIgZVR5cGU9IiMvL1Bvc3RVcGRhdGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icG9zdExvYWQiIGVUeXBlPSIjLy9Qb3N0TG9hZCIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJGaWVsZFJlc3VsdCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbHVtbiIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sR2VuZXJhdGVkVmFsdWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJnZW5lcmF0b3IiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InN0cmF0ZWd5IiBlVHlwZT0iIy8vR2VuZXJhdGlvblR5cGUiCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IlRBQkxFIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEdlbmVyYXRvciIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbEdlbmVyYXRvcl8yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJpbml0aWFsVmFsdWUiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vSW50T2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImFsbG9jYXRpb25TaXplIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0ludE9iamVjdCIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxHZW5lcmF0b3JDb250YWluZXIiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ic2VxdWVuY2VHZW5lcmF0b3IiIGVUeXBlPSIjLy9YbWxTZXF1ZW5jZUdlbmVyYXRvciIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ0YWJsZUdlbmVyYXRvciIgZVR5cGU9IiMvL1htbFRhYmxlR2VuZXJhdG9yIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbElkIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nICMvL0NvbHVtbk1hcHBpbmcgIy8vWG1sQ29udmVydGlibGVNYXBwaW5nICMvL1htbEdlbmVyYXRvckNvbnRhaW5lciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImdlbmVyYXRlZFZhbHVlIiBlVHlwZT0iIy8vWG1sR2VuZXJhdGVkVmFsdWUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSWRDbGFzc0NvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJpZENsYXNzIiBlVHlwZT0iIy8vWG1sQ2xhc3NSZWZlcmVuY2UiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iSW5oZXJpdGFuY2UiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzdHJhdGVneSIgZVR5cGU9IiMvL0luaGVyaXRhbmNlVHlwZSIKLSAgICAgICAgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iU0lOR0xFX1RBQkxFIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5Db2x1bW4iIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEJhc2VDb2x1bW4gIy8vWG1sQmFzZUpvaW5Db2x1bW4iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxKb2luQ29sdW1uQ29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbEpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSm9pblRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImludmVyc2VKb2luQ29sdW1ucyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxKb2luQ29sdW1uIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEpvaW5UYWJsZUNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqb2luVGFibGUiIGVUeXBlPSIjLy9YbWxKb2luVGFibGUiCi0gICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iTG9iIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFueVRvTWFueSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nICMvL3YyXzAvWG1sTWFueVRvTWFueV8yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9PbmUiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJNYXBLZXkiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwZWRCeU1hcHBpbmciIGFic3RyYWN0PSJ0cnVlIgotICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwcGVkQnkiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHBlZFN1cGVyY2xhc3MiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nICMvL1htbElkQ2xhc3NDb250YWluZXIiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJleGNsdWRlRGVmYXVsdExpc3RlbmVycyIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iZW50aXR5TGlzdGVuZXJzIiBlVHlwZT0iIy8vRW50aXR5TGlzdGVuZXJzIgotICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE5hbWVkTmF0aXZlUXVlcnkiIGVTdXBlclR5cGVzPSIjLy9YbWxRdWVyeSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InJlc3VsdENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJyZXN1bHRTZXRNYXBwaW5nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxOYW1lZFF1ZXJ5IiBlU3VwZXJUeXBlcz0iIy8vWG1sUXVlcnkgIy8vdjJfMC9YbWxOYW1lZFF1ZXJ5XzJfMCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb01hbnkiIGVTdXBlclR5cGVzPSIjLy9BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyAjLy9YbWxKb2luQ29sdW1uQ29udGFpbmVyICMvL3YyXzAvWG1sT25lVG9NYW55XzJfMCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9uZVRvT25lIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nICMvL1htbE1hcHBlZEJ5TWFwcGluZyAjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciAjLy92Ml8wL1htbE9uZVRvT25lXzJfMCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9yZGVyYWJsZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbE9yZGVyYWJsZV8yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJvcmRlckJ5IiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPcmRlckNvbHVtbiIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4gIy8vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPdmVycmlkZSIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIiBlU3VwZXJUeXBlcz0iIy8vWG1sQWNjZXNzSG9sZGVyICMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXNjYWRlUGVyc2lzdCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImVudGl0eUxpc3RlbmVycyIgZVR5cGU9IiMvL0VudGl0eUxpc3RlbmVycyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIgZVN1cGVyVHlwZXM9IiMvL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ieG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbiIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIKLSAgICAgICAgZVR5cGU9IiMvL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFJlZmVyZW5jZVRhYmxlIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iam9pbkNvbHVtbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJQb3N0TG9hZCIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUG9zdFBlcnNpc3QiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvc3RSZW1vdmUiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlBvc3RVcGRhdGUiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZVBlcnNpc3QiIGVTdXBlclR5cGVzPSIjLy9FdmVudE1ldGhvZCIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlByZVJlbW92ZSIgZVN1cGVyVHlwZXM9IiMvL0V2ZW50TWV0aG9kIi8+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iUHJlVXBkYXRlIiBlU3VwZXJUeXBlcz0iIy8vRXZlbnRNZXRob2QiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sTmFtZWRDb2x1bW4gIy8vWG1sQmFzZUpvaW5Db2x1bW4iLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciIgYWJzdHJhY3Q9InRydWUiCi0gICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiCi0gICAgICAgIHVwcGVyQm91bmQ9Ii0xIiBlVHlwZT0iIy8vWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnkiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxRdWVyeV8yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJxdWVyeSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iaGludHMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sUXVlcnlIaW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFF1ZXJ5Q29udGFpbmVyIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWRRdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE5hbWVkUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibmFtZWROYXRpdmVRdWVyaWVzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbE5hbWVkTmF0aXZlUXVlcnkiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnlIaW50IiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxRdWVyeUhpbnRfMl8wIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgbG93ZXJCb3VuZD0iMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWUiIGxvd2VyQm91bmQ9IjEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFNlY29uZGFyeVRhYmxlIiBlU3VwZXJUeXBlcz0iIy8vQWJzdHJhY3RYbWxUYWJsZSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9InByaW1hcnlLZXlKb2luQ29sdW1ucyIKLSAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTZXF1ZW5jZUdlbmVyYXRvciIgZVN1cGVyVHlwZXM9IiMvL1htbEdlbmVyYXRvciAjLy92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InNlcXVlbmNlTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iU3FsUmVzdWx0U2V0TWFwcGluZyIgZVN1cGVyVHlwZXM9IiMvL3YyXzAvWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiBsb3dlckJvdW5kPSIxIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbnRpdHlSZXN1bHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0VudGl0eVJlc3VsdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJjb2x1bW5SZXN1bHRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL0NvbHVtblJlc3VsdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZSIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sVGFibGUiLz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxUYWJsZUdlbmVyYXRvciIgZVN1cGVyVHlwZXM9IiMvL1htbEdlbmVyYXRvciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJjYXRhbG9nIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJzY2hlbWEiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InBrQ29sdW1uTmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idmFsdWVDb2x1bW5OYW1lIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJwa0NvbHVtblZhbHVlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJ1bmlxdWVDb25zdHJhaW50cyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxVbmlxdWVDb25zdHJhaW50IiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFRyYW5zaWVudCIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFR5cGVNYXBwaW5nIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc0hvbGRlciI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNsYXNzTmFtZSIgbG93ZXJCb3VuZD0iMSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWV0YWRhdGFDb21wbGV0ZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJhdHRyaWJ1dGVzIiBlVHlwZT0iIy8vQXR0cmlidXRlcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxVbmlxdWVDb25zdHJhaW50IiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMCI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNvbHVtbk5hbWVzIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICBsb3dlckJvdW5kPSIxIiB1cHBlckJvdW5kPSItMSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sVmVyc2lvbiIgZVN1cGVyVHlwZXM9IiMvL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyAjLy9Db2x1bW5NYXBwaW5nICMvL1htbENvbnZlcnRpYmxlTWFwcGluZyIvPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRGlzY3JpbWluYXRvclR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU1RSSU5HIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJDSEFSIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iSU5URUdFUiIgdmFsdWU9IjIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJFbnVtVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJPUkRJTkFMIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTVFJJTkciIHZhbHVlPSIxIi8+Ci0gIDwvZUNsYXNzaWZpZXJzPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iRmV0Y2hUeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkxBWlkiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkVBR0VSIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IkdlbmVyYXRpb25UeXBlIj4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlRBQkxFIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJTRVFVRU5DRSIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IklERU5USVRZIiB2YWx1ZT0iMiIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iQVVUTyIgdmFsdWU9IjMiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVFbnVtIiBuYW1lPSJJbmhlcml0YW5jZVR5cGUiPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iU0lOR0xFX1RBQkxFIiBsaXRlcmFsPSJTSU5HTEVfVEFCTEUiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IkpPSU5FRCIgdmFsdWU9IjEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlRBQkxFX1BFUl9DTEFTUyIgdmFsdWU9IjIiIGxpdGVyYWw9IlRBQkxFX1BFUl9DTEFTUyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlRlbXBvcmFsVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJEQVRFIi8+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJUSU1FIiB2YWx1ZT0iMSIvPgotICAgIDxlTGl0ZXJhbHMgbmFtZT0iVElNRVNUQU1QIiB2YWx1ZT0iMiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2Ml8wIiBuc1VSST0ianB0Lm9ybS52Ml8wLnhtaSIgbnNQcmVmaXg9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMCI+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEpvaW5UYWJsZUNvbnRhaW5lciI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbEFjY2Vzc0hvbGRlciIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEF0dHJpYnV0ZXNfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJlbGVtZW50Q29sbGVjdGlvbnMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICAgIGVUeXBlPSIjLy9YbWxFbGVtZW50Q29sbGVjdGlvbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sQ2FjaGVhYmxlXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FjaGVhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbENhc2NhZGVUeXBlXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iY2FzY2FkZURldGFjaCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxDb2xsZWN0aW9uVGFibGVfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vWG1sUmVmZXJlbmNlVGFibGUiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbERlcml2ZWRJZF8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImlkIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL1htbENvbnZlcnRpYmxlTWFwcGluZyAjLy9YbWxPcmRlcmFibGUgIy8vWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgIy8vWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciAjLy92Ml8wL1htbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMCAjLy92Ml8wL1htbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InRhcmdldENsYXNzIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZldGNoIiBlVHlwZT0iIy8vRmV0Y2hUeXBlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0ibWFwS2V5IiBlVHlwZT0iIy8vTWFwS2V5IgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlDbGFzcyIgZVR5cGU9IiMvL1htbENsYXNzUmVmZXJlbmNlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlDb2x1bW4iIGVUeXBlPSIjLy9YbWxDb2x1bW4iCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vWG1sSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNvbHVtbiIgZVR5cGU9IiMvL1htbENvbHVtbiIKLSAgICAgICAgICBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0iY29sbGVjdGlvblRhYmxlIiBlVHlwZT0iIy8vWG1sQ29sbGVjdGlvblRhYmxlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVtYmVkZGVkXzJfMCIgYWJzdHJhY3Q9InRydWUiIGludGVyZmFjZT0idHJ1ZSIKLSAgICAgICAgZVN1cGVyVHlwZXM9IiMvL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eV8yXzAiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiCi0gICAgICAgIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbENhY2hlYWJsZV8yXzAiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEVudGl0eUxpc3RlbmVyXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxFdmVudE1ldGhvZF8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sR2VuZXJhdG9yXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYW55VG9NYW55XzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSIgZVN1cGVyVHlwZXM9IiMvL3YyXzAvWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wIgotICAgICAgICBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMiCi0gICAgICAgICAgdXBwZXJCb3VuZD0iLTEiIGVUeXBlPSIjLy9YbWxBdHRyaWJ1dGVPdmVycmlkZSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibWFwS2V5VGVtcG9yYWwiIGVUeXBlPSIjLy9UZW1wb3JhbFR5cGUiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJtYXBLZXlFbnVtZXJhdGVkIiBlVHlwZT0iIy8vRW51bVR5cGUiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE1hcHNJZF8yXzAiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im1hcHNJZCIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbE9yZGVyYWJsZV8yXzAgIy8vdjJfMC9YbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAgIy8vdjJfMC9YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlDbGFzcyIgZVR5cGU9IiMvL1htbENsYXNzUmVmZXJlbmNlIgotICAgICAgICAgIGNvbnRhaW5tZW50PSJ0cnVlIiByZXNvbHZlUHJveGllcz0iZmFsc2UiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJtYXBLZXlDb2x1bW4iIGVUeXBlPSIjLy9YbWxDb2x1bW4iCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcEtleUpvaW5Db2x1bW5zIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgICBlVHlwZT0iIy8vWG1sSm9pbkNvbHVtbiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sTmFtZWRRdWVyeV8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImxvY2tNb2RlIiBlVHlwZT0iIy8vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxPbmVUb01hbnlfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIiBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wICMvL3YyXzAvWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCIvPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT25lVG9PbmVfMl8wIiBhYnN0cmFjdD0idHJ1ZSIgaW50ZXJmYWNlPSJ0cnVlIgotICAgICAgICBlU3VwZXJUeXBlcz0iIy8vdjJfMC9YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCAjLy92Ml8wL1htbE9ycGhhblJlbW92YWJsZV8yXzAiLz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9yZGVyYWJsZV8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im9yZGVyQ29sdW1uIiBlVHlwZT0iIy8vWG1sT3JkZXJDb2x1bW4iCi0gICAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sT3JkZXJDb2x1bW5fMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJudWxsYWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iaW5zZXJ0YWJsZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9Cb29sZWFuT2JqZWN0Ii8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0idXBkYXRhYmxlIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW5PYmplY3QiLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbE9ycGhhblJlbW92YWJsZV8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im9ycGhhblJlbW92YWwiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIiBhYnN0cmFjdD0idHJ1ZSIKLSAgICAgICAgaW50ZXJmYWNlPSJ0cnVlIj4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZWxpbWl0ZWRJZGVudGlmaWVycyIKLSAgICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL0Jvb2xlYW4iLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxRdWVyeV8yXzAiIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImRlc2NyaXB0aW9uIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUXVlcnlIaW50XzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAiIGFic3RyYWN0PSJ0cnVlIgotICAgICAgICBpbnRlcmZhY2U9InRydWUiPgotICAgICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImNhdGFsb2ciIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2NoZW1hIiBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAiCi0gICAgICAgIGFic3RyYWN0PSJ0cnVlIiBpbnRlcmZhY2U9InRydWUiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbERlcml2ZWRJZF8yXzAgIy8vdjJfMC9YbWxNYXBzSWRfMl8wIi8+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0iZGVzY3JpcHRpb24iIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxVbmlxdWVDb25zdHJhaW50XzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ibmFtZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8L2VDbGFzc2lmaWVycz4KLSAgICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFRW51bSIgbmFtZT0iTG9ja01vZGVUeXBlXzJfMCI+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik5PTkUiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUkVBRCIgdmFsdWU9IjEiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iV1JJVEUiIHZhbHVlPSIyIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9QVElNSVNUSUMiIHZhbHVlPSIzIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9Ik9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIiB2YWx1ZT0iNCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJQRVNTSU1JU1RJQ19SRUFEIiB2YWx1ZT0iNSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJQRVNTSU1JU1RJQ19XUklURSIgdmFsdWU9IjYiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIiB2YWx1ZT0iNyIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvbW9kZWwvcGVyc2lzdGVuY2UuZWNvcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYThmMjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL21vZGVsL3BlcnNpc3RlbmNlLmVjb3JlCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxlY29yZTpFUGFja2FnZSB4bWk6dmVyc2lvbj0iMi4wIgotICAgIHhtbG5zOnhtaT0iaHR0cDovL3d3dy5vbWcub3JnL1hNSSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4bWxuczplY29yZT0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgbmFtZT0icGVyc2lzdGVuY2UiCi0gICAgbnNVUkk9ImpwdC5wZXJzaXN0ZW5jZS54bWkiIG5zUHJlZml4PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UiPgotICA8ZUNsYXNzaWZpZXJzIHhzaTp0eXBlPSJlY29yZTpFQ2xhc3MiIG5hbWU9IlhtbEphdmFDbGFzc1JlZiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImphdmFDbGFzcyIgb3JkZXJlZD0iZmFsc2UiCi0gICAgICAgIHVuaXF1ZT0iZmFsc2UiIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgcGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5lbWYuZWNvcmUvbW9kZWwvRWNvcmUuZWNvcmUjLy9FU3RyaW5nIgotICAgICAgICBkZWZhdWx0VmFsdWVMaXRlcmFsPSIiLz4KLSAgPC9lQ2xhc3NpZmllcnM+Ci0gIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sSmFyRmlsZVJlZiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbGVOYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxNYXBwaW5nRmlsZVJlZiI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImZpbGVOYW1lIiBvcmRlcmVkPSJmYWxzZSIKLSAgICAgICAgdW5pcXVlPSJmYWxzZSIgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBwbGF0Zm9ybTovcGx1Z2luL29yZy5lY2xpcHNlLmVtZi5lY29yZS9tb2RlbC9FY29yZS5lY29yZSMvL0VTdHJpbmciCi0gICAgICAgIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IiIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZSIgZVN1cGVyVHlwZXM9ImNvbW1vbi5lY29yZSMvL0Fic3RyYWN0SnBhUm9vdEVPYmplY3QiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwZXJzaXN0ZW5jZVVuaXRzIiB1cHBlckJvdW5kPSItMSIKLSAgICAgICAgZVR5cGU9IiMvL1htbFBlcnNpc3RlbmNlVW5pdCIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQZXJzaXN0ZW5jZVVuaXQiIGVTdXBlclR5cGVzPSIjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdF8yXzAiPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJkZXNjcmlwdGlvbiIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgZVR5cGU9ImVjb3JlOkVEYXRhVHlwZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAzL1hNTFR5cGUjLy9TdHJpbmciLz4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0icHJvdmlkZXIiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Imp0YURhdGFTb3VyY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5vbkp0YURhdGFTb3VyY2UiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9Im1hcHBpbmdGaWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxNYXBwaW5nRmlsZVJlZiIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJqYXJGaWxlcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxKYXJGaWxlUmVmIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVSZWZlcmVuY2UiIG5hbWU9ImNsYXNzZXMiIHVwcGVyQm91bmQ9Ii0xIgotICAgICAgICBlVHlwZT0iIy8vWG1sSmF2YUNsYXNzUmVmIiBjb250YWlubWVudD0idHJ1ZSIgcmVzb2x2ZVByb3hpZXM9ImZhbHNlIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9ImV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vQm9vbGVhbk9iamVjdCIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFUmVmZXJlbmNlIiBuYW1lPSJwcm9wZXJ0aWVzIiBlVHlwZT0iIy8vWG1sUHJvcGVydGllcyIKLSAgICAgICAgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJuYW1lIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ0cmFuc2FjdGlvblR5cGUiIHVuaXF1ZT0iZmFsc2UiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiIGRlZmF1bHRWYWx1ZUxpdGVyYWw9IkpUQSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSI+Ci0gICAgPGVMaXRlcmFscyBuYW1lPSJKVEEiLz4KLSAgICA8ZUxpdGVyYWxzIG5hbWU9IlJFU09VUkNFX0xPQ0FMIiB2YWx1ZT0iMSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcm9wZXJ0aWVzIj4KLSAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RVJlZmVyZW5jZSIgbmFtZT0icHJvcGVydGllcyIgdXBwZXJCb3VuZD0iLTEiCi0gICAgICAgIGVUeXBlPSIjLy9YbWxQcm9wZXJ0eSIgY29udGFpbm1lbnQ9InRydWUiIHJlc29sdmVQcm94aWVzPSJmYWxzZSIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUNsYXNzIiBuYW1lPSJYbWxQcm9wZXJ0eSI+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9Im5hbWUiIHVuaXF1ZT0iZmFsc2UiIGxvd2VyQm91bmQ9IjEiCi0gICAgICAgIGVUeXBlPSJlY29yZTpFRGF0YVR5cGUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMy9YTUxUeXBlIy8vU3RyaW5nIi8+Ci0gICAgPGVTdHJ1Y3R1cmFsRmVhdHVyZXMgeHNpOnR5cGU9ImVjb3JlOkVBdHRyaWJ1dGUiIG5hbWU9InZhbHVlIiB1bmlxdWU9ImZhbHNlIiBsb3dlckJvdW5kPSIxIgotICAgICAgICBlVHlwZT0iZWNvcmU6RURhdGFUeXBlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDMvWE1MVHlwZSMvL1N0cmluZyIvPgotICA8L2VDbGFzc2lmaWVycz4KLSAgPGVTdWJwYWNrYWdlcyBuYW1lPSJ2Ml8wIiBuc1VSST0ianB0LnBlcnNpc3RlbmNlLnYyXzAueG1pIiBuc1ByZWZpeD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAiPgotICAgIDxlQ2xhc3NpZmllcnMgeHNpOnR5cGU9ImVjb3JlOkVDbGFzcyIgbmFtZT0iWG1sUGVyc2lzdGVuY2VVbml0XzJfMCIgYWJzdHJhY3Q9InRydWUiCi0gICAgICAgIGludGVyZmFjZT0idHJ1ZSI+Ci0gICAgICA8ZVN0cnVjdHVyYWxGZWF0dXJlcyB4c2k6dHlwZT0iZWNvcmU6RUF0dHJpYnV0ZSIgbmFtZT0ic2hhcmVkQ2FjaGVNb2RlIiB1bmlxdWU9ImZhbHNlIgotICAgICAgICAgIGVUeXBlPSIjLy92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCIgZGVmYXVsdFZhbHVlTGl0ZXJhbD0iVU5TUEVDSUZJRUQiLz4KLSAgICAgIDxlU3RydWN0dXJhbEZlYXR1cmVzIHhzaTp0eXBlPSJlY29yZTpFQXR0cmlidXRlIiBuYW1lPSJ2YWxpZGF0aW9uTW9kZSIgdW5pcXVlPSJmYWxzZSIKLSAgICAgICAgICBlVHlwZT0iIy8vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIiBkZWZhdWx0VmFsdWVMaXRlcmFsPSJBVVRPIi8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCI+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IkFMTCIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iMSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJFTkFCTEVfU0VMRUNUSVZFIiB2YWx1ZT0iMiIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJESVNBQkxFX1NFTEVDVElWRSIgdmFsdWU9IjMiLz4KLSAgICAgIDxlTGl0ZXJhbHMgbmFtZT0iVU5TUEVDSUZJRUQiIHZhbHVlPSI0Ii8+Ci0gICAgPC9lQ2xhc3NpZmllcnM+Ci0gICAgPGVDbGFzc2lmaWVycyB4c2k6dHlwZT0iZWNvcmU6RUVudW0iIG5hbWU9IlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAiPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJBVVRPIi8+Ci0gICAgICA8ZUxpdGVyYWxzIG5hbWU9IkNBTExCQUNLIiB2YWx1ZT0iMSIvPgotICAgICAgPGVMaXRlcmFscyBuYW1lPSJOT05FIiB2YWx1ZT0iMiIvPgotICAgIDwvZUNsYXNzaWZpZXJzPgotICA8L2VTdWJwYWNrYWdlcz4KLTwvZWNvcmU6RVBhY2thZ2U+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjU3YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSnBhIENvcmUKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpQQV9QTEFURk9STT1KUEEgUGxhdGZvcm1zCi0KLUpQQV9SRVNPVVJDRV9NT0RFTF9QUk9WSURFUlM9SlBBIFJlc291cmNlIE1vZGVsIFByb3ZpZGVycwotSlBBX0ZJTEVfQ09OVEVOVD1KUEEgRmlsZSBDb250ZW50Ci0KLUJBU0VfSlBBX0NPTlRFTlQgPSBCYXNlIGNvbnRlbnQgZm9yIEpQQSBYTUwgZmlsZXMKLVBFUlNJU1RFTkNFX1hNTF9DT05URU5UID0gSlBBIHBlcnNpc3RlbmNlLnhtbCBmaWxlcwotTUFQUElOR19GSUxFX0NPTlRFTlQgPSBCYXNlIGNvbnRlbnQgZm9yIEpQQSBYTUwgbWFwcGluZyBmaWxlcwotT1JNX1hNTF9DT05URU5UID0gSlBBIG9ybS54bWwgbWFwcGluZyBmaWxlcwotSkFSX0NPTlRFTlQgPSBKQVIgQ29udGVudAotSkFWQV9QQUNLQUdFX0lORk9fQ09OVEVOVCA9IHBhY2thZ2UtaW5mby5qYXZhCi1GQUNFVF9DT05GSUdfWE1MX0NPTlRFTlQ9UHJvamVjdCBmYWNldCBjb25maWd1cmF0aW9uIFhNTCBmaWxlCi0KLUdFTkVSSUNfUExBVEZPUk1fR1JPVVBfTEFCRUw9R2VuZXJpYwotR0VORVJJQ18xXzBfUExBVEZPUk1fTEFCRUw9R2VuZXJpYyAxLjAKLUdFTkVSSUNfMl8wX1BMQVRGT1JNX0xBQkVMPUdlbmVyaWMgMi4wCi0KLU5PX09QX0xJQlJBUllfUFJPVklERVJfTUVTU0FHRSA9IFRoZSBKUEEgZmFjZXQgcmVxdWlyZXMgYSBKUEEgaW1wbGVtZW50YXRpb24gbGlicmFyeSB0byBiZSBwcmVzZW50IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aC4gQnkgZGlzYWJsaW5nIGxpYnJhcnkgY29uZmlndXJhdGlvbiwgdGhlIHVzZXIgdGFrZXMgb24gdGhlIHJlc3BvbnNpYmlsaXR5IG9mIGVuc3VyaW5nIHRoYXQgdGhlIGNsYXNzcGF0aCBpcyBjb25maWd1cmVkIGFwcHJvcHJpYXRlbHkgdmlhIGFsdGVybmF0ZSBtZWFucy4KLURFUFJFQ0FURURfVVNFUl9MSUJSQVJZX1BST1ZJREVSX0xBQkVMPVVzZXIgTGlicmFyeSAoZGVwcmVjYXRlZCkKLQotSlBBX0ZBQ0VUX0xBQkVMPUpQQQotSlBBX0ZBQ0VUX0RFU0NSSVBUSU9OPUFkZHMgc3VwcG9ydCBmb3Igd3JpdGluZyBwZXJzaXN0ZW50IG1ldGEtZGF0YSB1c2luZyB0aGUgSmF2YSBQZXJzaXN0ZW5jZSBBUEkgKEpQQSkuCi1KUEFfVEVNUExBVEVfTEFCRUw9SlBBIFByb2plY3QKLUpQQV9WQUxJREFUT1I9SlBBIFZhbGlkYXRvcgotSlBBX1BST0JMRU09SlBBIFByb2JsZW0KLQotSlBBX0RFTEVURV9UWVBFX1BBUlRJQ0lQQU5UX05BTUU9SlBBIERlbGV0ZSBUeXBlIFBhcnRpY2lwYW50Ci1KUEFfREVMRVRFX1BBQ0tBR0VfT1JfRk9MREVSX1BBUlRJQ0lQQU5UX05BTUU9SlBBIERlbGV0ZSBQYWNrYWdlIG9yIEZvbGRlciBQYXJ0aWNpcGFudAotSlBBX0RFTEVURV9NQVBQSU5HX0ZJTEVfUEFSVElDSVBBTlRfTkFNRT1KUEEgRGVsZXRlIE1hcHBpbmcgRmlsZSBQYXJ0aWNpcGFudAotSlBBX1JFTkFNRV9UWVBFX1BBUlRJQ0lQQU5UX05BTUU9SlBBIFJlbmFtZSBUeXBlIFBhcnRpY2lwYW50Ci1KUEFfUkVOQU1FX1BBQ0tBR0VfUEFSVElDSVBBTlRfTkFNRT1KUEEgUmVuYW1lIFBhY2thZ2UgUGFydGljaXBhbnQKLUpQQV9SRU5BTUVfRk9MREVSX1BBUlRJQ0lQQU5UX05BTUU9SlBBIFJlbmFtZSBGb2xkZXIgUGFydGljaXBhbnQKLUpQQV9SRU5BTUVfTUFQUElOR19GSUxFX1BBUlRJQ0lQQU5UX05BTUU9SlBBIFJlbmFtZSBNYXBwaW5nIEZpbGUgUGFydGljaXBhbnQKLUpQQV9NT1ZFX1RZUEVfUEFSVElDSVBBTlRfTkFNRT1KUEEgTW92ZSBUeXBlIFBhcnRpY2lwYW50Ci1KUEFfTU9WRV9NQVBQSU5HX0ZJTEVfUEFSVElDSVBBTlRfTkFNRT1KUEEgTW92ZSBNYXBwaW5nIEZpbGUgUGFydGljaXBhbnQKLSAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wbHVnaW4ueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YThhMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0KLQlDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCVRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotCXRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0JYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQkKLQlDb250cmlidXRvcnM6Ci0JCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIC0tPgotCi08cGx1Z2luPgotCi0JPCEtLSAqKioqKiBleHRlbnNpb24gcG9pbnRzICoqKioqIC0tPgotCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0ianBhUGxhdGZvcm1zIgotCQluYW1lPSIlSlBBX1BMQVRGT1JNIgotCQlzY2hlbWE9InNjaGVtYS9qcGFQbGF0Zm9ybXMuZXhzZCIvPgotCQotCQotCTwhLS0gKioqKiogRWNsaXBzZSBjb3JlIGV4dGVuc2lvbnMgKioqKiogLS0+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZS5jb250ZW50VHlwZXMiPgotCQkKLQkJPCEtLSAiYWJzdHJhY3QiIGNvbnRlbnQgdHlwZSB0byBiZSBleHRlbmRlZCBieSBhbGwgSlBBIFhNTCBmaWxlIGNvbnRlbnQgdHlwZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5iYXNlSnBhQ29udGVudCIKLQkJCW5hbWU9IiVCQVNFX0pQQV9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJZGVzY3JpYmVyPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29udGVudHR5cGVzLkluZGV0ZXJtaW5hdGVDb250ZW50RGVzY3JpYmVyIj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCQotCQk8IS0tIHBlcnNpc3RlbmNlLnhtbCBjb250ZW50IHR5cGUgLS0+Ci0gIAkJPGNvbnRlbnQtdHlwZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50LnBlcnNpc3RlbmNlIgotCQkJbmFtZT0iJVBFUlNJU1RFTkNFX1hNTF9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5iYXNlSnBhQ29udGVudCIKLQkJCWZpbGUtbmFtZXM9InBlcnNpc3RlbmNlLnhtbCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LlhNTFJvb3RFbGVtZW50Q29udGVudERlc2NyaWJlcjIiPgotCQkJCTxwYXJhbWV0ZXIgCi0JCQkJCW5hbWU9ImVsZW1lbnQiIAotCQkJCQl2YWx1ZT0ie2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlfXBlcnNpc3RlbmNlIi8+Ci0JCQk8L2Rlc2NyaWJlcj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCQotCQk8IS0tICJhYnN0cmFjdCIgbWFwcGluZyBmaWxlIGNvbnRlbnQgdHlwZSAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50Lm1hcHBpbmdGaWxlIgotCQkJbmFtZT0iJU1BUFBJTkdfRklMRV9DT05URU5UIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5iYXNlSnBhQ29udGVudCI+Ci0JCTwvY29udGVudC10eXBlPgotCQkKLQkJPCEtLSBvcm0ueG1sIGNvbnRlbnQgdHlwZSAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50Lm9ybSIKLQkJCW5hbWU9IiVPUk1fWE1MX0NPTlRFTlQiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50Lm1hcHBpbmdGaWxlIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuWE1MUm9vdEVsZW1lbnRDb250ZW50RGVzY3JpYmVyMiI+Ci0JCQkJPHBhcmFtZXRlciAKLQkJCQkJbmFtZT0iZWxlbWVudCIgCi0JCQkJCXZhbHVlPSJ7aHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtfWVudGl0eS1tYXBwaW5ncyIvPgotCQkJPC9kZXNjcmliZXI+Ci0JCTwvY29udGVudC10eXBlPgotCQkKLQkJPCEtLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWwgY29udGVudCB0eXBlIC0tPgotCQk8Y29udGVudC10eXBlCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUiCi0JCQluYW1lPSIlRkFDRVRfQ09ORklHX1hNTF9DT05URU5UIgotCQkJZmlsZS1uYW1lcz0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuWE1MUm9vdEVsZW1lbnRDb250ZW50RGVzY3JpYmVyMiI+Ci0JCQkJPHBhcmFtZXRlciAKLQkJCQkJbmFtZT0iZWxlbWVudCIgCi0JCQkJCXZhbHVlPSJmYWNldGVkLXByb2plY3QiLz4KLQkJCTwvZGVzY3JpYmVyPgotCQk8L2NvbnRlbnQtdHlwZT4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMucHJvcGVydHlUZXN0ZXJzIj4KLQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wcm9wZXJ0eVRlc3Rlci5wZXJzaXN0ZW50QXR0cmlidXRlIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJpc01hcHBlZCwgaXNWaXJ0dWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGVQcm9wZXJ0eVRlc3RlciIvPgotCQkKLQkJPHByb3BlcnR5VGVzdGVyCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnByb3BlcnR5VGVzdGVyLnBsYXRmb3JtUmVzb3VyY2UiCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiCi0JCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIKLQkJCXByb3BlcnRpZXM9ImpwYVBsYXRmb3JtLCBqcGFQbGF0Zm9ybUdyb3VwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFQbGF0Zm9ybVRlc3RlciIvPgotCQkKLQkJPHByb3BlcnR5VGVzdGVyCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnByb3BlcnR5VGVzdGVyLmphdmFFbGVtZW50IgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50IgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJqcGFQbGF0Zm9ybSwganBhUGxhdGZvcm1Hcm91cCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnBhUGxhdGZvcm1UZXN0ZXIiLz4KLQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wcm9wZXJ0eVRlc3Rlci5qcGFQbGF0Zm9ybURlc2NyaXB0aW9uIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb24iCi0JCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIKLQkJCXByb3BlcnRpZXM9ImpwYVBsYXRmb3JtLCBqcGFQbGF0Zm9ybUdyb3VwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFQbGF0Zm9ybVRlc3RlciIvPgotCQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wcm9wZXJ0eVRlc3Rlci5qcGFMaWJyYXJ5UHJvdmlkZXJDb25maWciCi0JCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUubGlicHJvdi5KcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIgotCQkJbmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiCi0JCQlwcm9wZXJ0aWVzPSJqcGFQbGF0Zm9ybSwganBhUGxhdGZvcm1Hcm91cCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnBhUGxhdGZvcm1UZXN0ZXIiLz4KLQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wcm9wZXJ0eVRlc3Rlci54bWxSZXNvdXJjZSIKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2UiCi0JCQluYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIKLQkJCXByb3BlcnRpZXM9ImlzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlUHJvcGVydHlUZXN0ZXIiLz4KLQkJCi0JCTxwcm9wZXJ0eVRlc3RlcgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wcm9wZXJ0eVRlc3Rlci54bWxGaWxlIgotCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sRmlsZSIKLQkJCW5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlIgotCQkJcHJvcGVydGllcz0iaXNMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2VQcm9wZXJ0eVRlc3RlciIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRlcnMiPgotCQkKLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuUHJvamVjdEFkYXB0ZXJGYWN0b3J5IgotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3QiLz4KLQkJPC9mYWN0b3J5PgotCQkKLQkJPGZhY3RvcnkKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuUHJvamVjdEFkYXB0ZXJGYWN0b3J5IgotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0Ij4KLQkJCTxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0Ii8+Ci0JCTwvZmFjdG9yeT4KLQkJCi0JCTxmYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5IgotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJPGFkYXB0ZXIgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZSIvPgotCQk8L2ZhY3Rvcnk+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCQotCQk8aW5pdGlhbGl6ZXIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnByZWZzLkpwYVByZWZlcmVuY2VJbml0aWFsaXplciIvPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8IS0tICoqKioqIEpQVCBleHRlbnNpb25zIChlYXQgb3VyIG93biBkb2dmb29kKSAqKioqKiAtLT4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybXMiPgotCQkKLQkJPGpwYVBsYXRmb3JtR3JvdXAKLSAgICAgICAgCWlkPSJnZW5lcmljIgotICAgICAgICAJbGFiZWw9IiVHRU5FUklDX1BMQVRGT1JNX0dST1VQX0xBQkVMIi8+Ci0JCQotCQk8anBhUGxhdGZvcm0KLQkJCWlkPSJnZW5lcmljIgotCQkJbGFiZWw9IiVHRU5FUklDXzFfMF9QTEFURk9STV9MQUJFTCIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFQbGF0Zm9ybUZhY3RvcnkiCi0JCQlncm91cD0iZ2VuZXJpYyIKLQkJCWpwYUZhY2V0VmVyc2lvbj0iMS4wIgotCQkJZGVmYXVsdD0iZmFsc2UiLz4KLQkJCQotCSAgPGpwYVBsYXRmb3JtCi0JICAgICAgICBpZD0iZ2VuZXJpYzJfMCIKLQkgICAgICAgIGxhYmVsPSIlR0VORVJJQ18yXzBfUExBVEZPUk1fTEFCRUwiCi0JICAgICAgICBmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFQbGF0Zm9ybUZhY3RvcnkiCi0JICAgICAgICBncm91cD0iZ2VuZXJpYyIKLQkgICAgICAgIGpwYUZhY2V0VmVyc2lvbj0iMi4wIgotCSAgICAgICAgZGVmYXVsdD0iZmFsc2UiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnJhcnlWYWxpZGF0b3JzIj4KLQkJCi0JCTxsaWJyYXJ5VmFsaWRhdG9yCi0JCQlpZD0iZ2VuZXJpY1VzZXJMaWJyYXJ5VmFsaWRhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJ2YWwuR2VuZXJpY0pwYVVzZXJMaWJyYXJ5VmFsaWRhdG9yIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJsaWJyYXJ5UHJvdmlkZXIiPgotCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmV4dGVuZHNJZCIgdmFsdWU9ImpwYS11c2VyLWxpYnJhcnktcHJvdmlkZXIiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvbGlicmFyeVZhbGlkYXRvcj4KLQkJCi0JCTxsaWJyYXJ5VmFsaWRhdG9yCi0JCQlpZD0iZ2VuZXJpY0VjbGlwc2VsaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnZhbC5HZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0ibGlicmFyeVByb3ZpZGVyIj4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5leHRlbmRzSWQiIHZhbHVlPSJlY2xpcHNlbGluay1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvbGlicmFyeVZhbGlkYXRvcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCQotCQotCTwhLS0KLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkqIExpYnJhcnkgUHJvdmlkZXIgRnJhbWV3b3JrIEludGVncmF0aW9uICoKLQkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQktLT4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5sZWdhY3lMaWJyYXJ5UHJvdmlkZXJEZXRlY3RvcnMiPgotCQkKLQkJPGRldGVjdG9yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuTGVnYWN5SnBhTGlicmFyeVByb3ZpZGVyRGV0ZWN0b3IiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnJhcnlQcm92aWRlcnMiPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpwYS1sZWdhY3ktbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJsZWdhY3ktbGlicmFyeS1wcm92aWRlciIKLQkJCWhpZGRlbj0idHJ1ZSI+Ci0JCQk8YWN0aW9uIHR5cGU9IlVOSU5TVEFMTCI+Ci0JCQkJPG9wZXJhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuTGVnYWN5SnBhTGlicmFyeVByb3ZpZGVyVW5pbnN0YWxsT3BlcmF0aW9uIi8+Ci0JCQk8L2FjdGlvbj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTxwcm92aWRlcgotCQkJaWQ9ImpwYS1uby1vcC1saWJyYXJ5LXByb3ZpZGVyIgotCQkJZXh0ZW5kcz0ianB0LW5vLW9wLWxpYnJhcnktcHJvdmlkZXIiPgotCQkJPHBhcmFtIG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSIlTk9fT1BfTElCUkFSWV9QUk9WSURFUl9NRVNTQUdFIi8+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIHZhbHVlPSJqcHQuanBhIiBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KLQkJCQk8L3dpdGg+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvcHJvdmlkZXI+Ci0JCQotCQk8cHJvdmlkZXIKLQkJCWlkPSJqcGEtdXNlci1saWJyYXJ5LXByb3ZpZGVyIgotCQkJZXh0ZW5kcz0id3RwLXVzZXItbGlicmFyeS1wcm92aWRlciI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0icmVxdWVzdGluZ1Byb2plY3RGYWNldCI+Ci0JCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiIAotCQkJCQkJdmFsdWU9ImpwdC5qcGEiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCTxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0JCQkJPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuSnBhVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWciLz4KLQkJCQk8b3BlcmF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24uY2xhc3NwYXRoLld0cFVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uIi8+Ci0JCQk8L2FjdGlvbj4KLQkJPC9wcm92aWRlcj4KLQkJCi0JCTxwcm92aWRlcgotCQkJaWQ9ImpwYS1kZXByZWNhdGVkLXVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWV4dGVuZHM9InVzZXItbGlicmFyeS1wcm92aWRlciIKLQkJCWFic3RyYWN0PSJ0cnVlIj4KLQkJCTxsYWJlbD4lREVQUkVDQVRFRF9VU0VSX0xJQlJBUllfUFJPVklERVJfTEFCRUw8L2xhYmVsPgotCQkJPGFjdGlvbiB0eXBlPSJJTlNUQUxMIj4KLQkJCQk8Y29uZmlnIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LnVzZXIuVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWciLz4KLQkJCQk8b3BlcmF0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92Lk5vT3BMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb24iLz4KLQkJCTwvYWN0aW9uPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpwYS1nZW5lcmljMV8wLXVzZXItbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJqcGEtZGVwcmVjYXRlZC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQloaWRkZW49InRydWUiPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpwYS1nZW5lcmljMl8wLXVzZXItbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJqcGEtZGVwcmVjYXRlZC11c2VyLWxpYnJhcnktcHJvdmlkZXIiCi0JCQloaWRkZW49InRydWUiPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImpwYS1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWV4dGVuZHM9Ind0cC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWFic3RyYWN0PSJ0cnVlIj4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCTxhY3Rpb24gdHlwZT0iSU5TVEFMTCI+Ci0JCQkJPGNvbmZpZyBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuSnBhT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIi8+Ci0JCQkJPG9wZXJhdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLmNsYXNzcGF0aC5XdHBPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb24iLz4KLQkJCTwvYWN0aW9uPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPCEtLSAKLQkJCUFsbCBvc2dpIGxpYnJhcnkgcHJvdmlkZXJzIHRoYXQgcG9pbnQgdG8gZWNsaXBzZWxpbmsgYnVuZGxlcyBleHRlbmQgdGhpcy4KLQkJCUl0IGV4aXN0cyBwdXJlbHkgYXMgYW4gaWRlbnRpZmllciBmb3IgbGlicmFyeSB2YWxpZGF0aW9uLgotCQkgLS0+Ci0JCTxwcm92aWRlcgotCQkJaWQ9ImVjbGlwc2VsaW5rLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWV4dGVuZHM9ImpwYS1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIKLQkJCWFic3RyYWN0PSJ0cnVlIi8+Ci0JCQotCQk8cHJvdmlkZXIgCi0JCQlpZD0iZWNsaXBzZWxpbmstMTAyLW9zZ2ktYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIgotCQkJZXh0ZW5kcz0iZWNsaXBzZWxpbmstYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIj4KLQkJCTxsYWJlbD5FY2xpcHNlTGluayAxLjAueDwvbGFiZWw+Ci0JCQk8cGFyYW0gbmFtZT0iY29udGFpbmVyLmxhYmVsIiB2YWx1ZT0iRWNsaXBzZUxpbmsgMS4wLngiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMCIgdmFsdWU9ImphdmF4LnBlcnNpc3RlbmNlOlsxLjAuMCwgMi4wLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjEiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlOlsxLjAuMCwgMS4xLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGE6WzEuMC4wLCAxLjEuMCkiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMyIgdmFsdWU9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbTpbMS4wLjAsIDEuMS4wKSIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS40IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHI6WzEuMC4wLCAxLjEuMCkiLz4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGE6MS4wIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImVjbGlwc2VsaW5rLTExMC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJlY2xpcHNlbGluay1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiPgotCQkJPGxhYmVsPkVjbGlwc2VMaW5rIDEuMS54PC9sYWJlbD4KLQkJCTxwYXJhbSBuYW1lPSJjb250YWluZXIubGFiZWwiIHZhbHVlPSJFY2xpcHNlTGluayAxLjEueCIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4wIiB2YWx1ZT0iamF2YXgucGVyc2lzdGVuY2U6WzEuOTkuMCwgMi4xLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjEiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlOlsxLjEuMCwgMS4yLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGE6WzEuMS4wLCAxLjIuMCkiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMyIgdmFsdWU9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbTpbMS4xLjAsIDEuMi4wKSIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS40IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHI6WzEuMS4wLCAxLjIuMCkiLz4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGE6MS4wIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImVjbGlwc2VsaW5rLTEyMC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJlY2xpcHNlbGluay1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiPgotCQkJPGxhYmVsPkVjbGlwc2VMaW5rIDEuMi54PC9sYWJlbD4KLQkJCTxwYXJhbSBuYW1lPSJjb250YWluZXIubGFiZWwiIHZhbHVlPSJFY2xpcHNlTGluayAxLjIueCIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4wIiB2YWx1ZT0iamF2YXgucGVyc2lzdGVuY2U6WzEuOTkuMCwgMi4xLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjEiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlOlsxLjIuMCwgMS4zLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGE6WzEuMi4wLCAxLjMuMCkiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMyIgdmFsdWU9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbTpbMS4yLjAsIDEuMy4wKSIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS40IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHI6WzEuMi4wLCAxLjMuMCkiLz4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJyZXF1ZXN0aW5nUHJvamVjdEZhY2V0Ij4KLQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGE6MS4wIi8+Ci0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyIAotCQkJaWQ9ImVjbGlwc2VsaW5rLTIwMC1vc2dpLWJ1bmRsZXMtbGlicmFyeS1wcm92aWRlciIgCi0JCQlleHRlbmRzPSJlY2xpcHNlbGluay1idW5kbGVzLWxpYnJhcnktcHJvdmlkZXIiPgotCQkJPGxhYmVsPkVjbGlwc2VMaW5rIDIuMC54PC9sYWJlbD4KLQkJCTxwYXJhbSBuYW1lPSJjb250YWluZXIubGFiZWwiIHZhbHVlPSJFY2xpcHNlTGluayAyLjAueCIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4wIiB2YWx1ZT0iamF2YXgucGVyc2lzdGVuY2U6WzIuMC4wLCAyLjEuMCkiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMSIgdmFsdWU9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmNvcmU6WzIuMC4wLCAyLjEuMCkiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYTpbMi4wLjAsIDIuMS4wKSIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS4zIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYXNtOlsyLjAuMCwgMi4xLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjQiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbnRscjpbMi4wLjAsIDIuMS4wKSIvPgotCQk8L3Byb3ZpZGVyPgotCQkKLQkJPHByb3ZpZGVyCi0JCQlpZD0iZWNsaXBzZWxpbmstMjEwLW9zZ2ktYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIgotCQkJZXh0ZW5kcz0iZWNsaXBzZWxpbmstYnVuZGxlcy1saWJyYXJ5LXByb3ZpZGVyIj4KLQkJCTxsYWJlbD5FY2xpcHNlTGluayAyLjEueDwvbGFiZWw+Ci0JCQk8cGFyYW0gbmFtZT0iY29udGFpbmVyLmxhYmVsIiB2YWx1ZT0iRWNsaXBzZUxpbmsgMi4xLngiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMCIgdmFsdWU9ImphdmF4LnBlcnNpc3RlbmNlOlsyLjAuMCwgMi4xLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjEiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5jb3JlOlsyLjEuMCwgMi4yLjApIi8+Ci0JCQk8cGFyYW0gbmFtZT0iYnVuZGxlLjIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGE6WzIuMS4wLCAyLjIuMCkiLz4KLQkJCTxwYXJhbSBuYW1lPSJidW5kbGUuMyIgdmFsdWU9Im9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFzbTpbMi4xLjAsIDIuMi4wKSIvPgotCQkJPHBhcmFtIG5hbWU9ImJ1bmRsZS40IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW50bHI6WzIuMS4wLCAyLjIuMCkiLz4KLQkJPC9wcm92aWRlcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPCEtLSAqKioqKiBXVFAgZXh0ZW5zaW9ucyAqKioqKiAtLT4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZS5yZXNvdXJjZUZhY3RvcmllcyI+Ci0JCQotCQk8cmVzb3VyY2VGYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sUmVzb3VyY2VGYWN0b3J5IgotCQkJaXNEZWZhdWx0PSJ0cnVlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5wZXJzaXN0ZW5jZSI+Ci0JCQk8L2NvbnRlbnRUeXBlQmluZGluZz4KLQkJPC9yZXNvdXJjZUZhY3Rvcnk+Ci0JCQotCQk8cmVzb3VyY2VGYWN0b3J5Ci0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1YbWxSZXNvdXJjZUZhY3RvcnkiCi0JCQlpc0RlZmF1bHQ9InRydWUiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50Lm9ybSI+Ci0JCQk8L2NvbnRlbnRUeXBlQmluZGluZz4KLQkJPC9yZXNvdXJjZUZhY3Rvcnk+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmZhY2V0cyI+Ci0JCQotCQk8cHJvamVjdC1mYWNldCBpZD0ianB0LmpwYSI+Ci0JCQk8bGFiZWw+JUpQQV9GQUNFVF9MQUJFTDwvbGFiZWw+Ci0JCQk8ZGVzY3JpcHRpb24+JUpQQV9GQUNFVF9ERVNDUklQVElPTjwvZGVzY3JpcHRpb24+Ci0JCTwvcHJvamVjdC1mYWNldD4KLQkJCi0JCTxwcm9qZWN0LWZhY2V0LXZlcnNpb24gZmFjZXQ9ImpwdC5qcGEiIHZlcnNpb249IjEuMCI+Ci0JCQk8Y29uc3RyYWludD4KLQkJCQk8cmVxdWlyZXMgZmFjZXQ9ImphdmEiIHZlcnNpb249Ils1LjAiLz4KLQkJCTwvY29uc3RyYWludD4KLQkJPC9wcm9qZWN0LWZhY2V0LXZlcnNpb24+Ci0JCQotCQk8cHJvamVjdC1mYWNldC12ZXJzaW9uIGZhY2V0PSJqcHQuanBhIiB2ZXJzaW9uPSIyLjAiPgotCQkJPGNvbnN0cmFpbnQ+Ci0JCQkJPHJlcXVpcmVzIGZhY2V0PSJqYXZhIiB2ZXJzaW9uPSJbNS4wIi8+Ci0JCQk8L2NvbnN0cmFpbnQ+Ci0JCTwvcHJvamVjdC1mYWNldC12ZXJzaW9uPgotCQkKLQkJPHRlbXBsYXRlIGlkPSJqcHQuanBhLnRlbXBsYXRlIj4KLQkJCTxsYWJlbD4lSlBBX1RFTVBMQVRFX0xBQkVMPC9sYWJlbD4KLQkJCTxmaXhlZCBmYWNldD0ianB0LmpwYSIvPgotCQkJPGZpeGVkIGZhY2V0PSJqYXZhIi8+Ci0JCQk8IS0tCi0JCQk8cHJlc2V0IGlkPSJqcHQuanBhLjJfMC5wcmVzZXQiLz4KLQkJCS0tPgotCQk8L3RlbXBsYXRlPgotCQkKLQkJPGFjdGlvbiBmYWNldD0ianB0LmpwYSIgdHlwZT0iaW5zdGFsbCIgaWQ9ImpwdC5qcGEuaW5zdGFsbCI+Ci0JCQk8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlciIvPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUiLz4KLQkJPC9hY3Rpb24+Ci0JCQotCQk8IS0tIAotCQkJVGhlIHVuaW5zdGFsbCBhY3Rpb24gaXMgb25seSB1c2VkIHRvIGVuYWJsZSBmYWNldCB1bmluc3RhbGxhdGlvbgotCQkJdGhyb3VnaCB0aGUgZmFjZXQgVUkuICBUaGUgZGVsZWdhdGUgY3VycmVudGx5IGhhcyBubyBmdW5jdGlvbmFsaXR5LiAKLQkJLS0+Ci0JCTxhY3Rpb24gZmFjZXQ9ImpwdC5qcGEiIHR5cGU9InVuaW5zdGFsbCIgaWQ9ImpwdC5qcGEudW5pbnN0YWxsIj4KLQkJCTxkZWxlZ2F0ZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0VW5pbnN0YWxsRGVsZWdhdGUiLz4KLQkJPC9hY3Rpb24+Ci0JCQotCQk8IS0tIAotCQkJVGhlIHZlcnNpb24gY2hhbmdlICAKLQkJLS0+Ci0JCTxhY3Rpb24gZmFjZXQ9ImpwdC5qcGEiIHR5cGU9InZlcnNpb24tY2hhbmdlIiBpZD0ianB0LmpwYS52ZXJzaW9uLWNoYW5nZSI+Ci0JCQk8Y29uZmlnLWZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlciIvPgotCQkJPGRlbGVnYXRlIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUiLz4KLQkJPC9hY3Rpb24+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpc3RlbmVycyI+Ci0JCQotCQk8bGlzdGVuZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuUnVudGltZUNoYW5nZWRMaXN0ZW5lciIKLQkJCWV2ZW50VHlwZXM9IlRBUkdFVEVEX1JVTlRJTUVTX0NIQU5HRUQiLz4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnJ1bnRpbWVzIj4KLQkJCi0JCTxzdXBwb3J0ZWQ+Ci0JCQk8ZmFjZXQgaWQ9ImpwdC5qcGEiLz4KLQkJCTxydW50aW1lLWNvbXBvbmVudCBhbnk9InRydWUiLz4KLQkJPC9zdXBwb3J0ZWQ+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvclYyIgotCQlpZD0ianBhVmFsaWRhdG9yIgotCQluYW1lPSIlSlBBX1ZBTElEQVRPUiI+Ci0JCQotCQk8dmFsaWRhdG9yCi0gICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdG9yIgotICAgICAgICAJbWFya2VySWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQcm9ibGVtTWFya2VyIj4KLQkJCTxpbmNsdWRlPgotCQkJCTxydWxlcz4KLQkJCQkJPGZhY2V0IGlkPSJqcHQuanBhIi8+Ci0JCQkJPC9ydWxlcz4KLQkJCTwvaW5jbHVkZT4KLQkJCTxpbmNsdWRlPgotCQkJCTxydWxlcz4KLQkJCQkJPGNvbnRlbnRUeXBlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhU291cmNlIiBleGFjdE1hdGNoPSJmYWxzZSIvPgotCQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5jb250ZW50LmphciIvPgotCQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50LmJhc2VKcGFDb250ZW50IiBleGFjdE1hdGNoPSJmYWxzZSIvPgotCQkJCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlIiBleGFjdE1hdGNoPSJ0cnVlIi8+Ci0JCQkJPC9ydWxlcz4KLQkJCTwvaW5jbHVkZT4KLQkJPC92YWxpZGF0b3I+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBFeHRlbnNpb246IEpQQSBQcm9ibGVtIE1hcmtlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tICoqKiogRG8gTk9UIHF1YWxpZnkgdGhlIG1hcmtlciBpZCB3aXRoIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwgc2VlIGJ1ZyAyNTI4OTEgCQkgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIgotCQlpZD0ianBhUHJvYmxlbU1hcmtlciIgCi0JCW5hbWU9IiVKUEFfUFJPQkxFTSI+Ci0KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KLQkJCi0JCTwhLS0gQ2FuJ3QgdXNlIHRleHQgbWFya2VyIHVudGlsIHdlIGhhdmUgc3BlY2lmaWMgbW9kZWxzIGZvciBlYWNoIGlucHV0IHR5cGUgKFhNTCwgamF2YSkKLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnRleHRtYXJrZXIiLz4KLQkJLS0+Ci0JCQotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlcjIiLz4KLQkJPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLnByb2JsZW0iLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQkKLSAJPGV4dGVuc2lvbgotIAkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmRlbGV0ZVBhcnRpY2lwYW50cyI+Ci0gICAgCQotICAgIAk8ZGVsZXRlUGFydGljaXBhbnQKLSAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3JpbmcuSnBhRGVsZXRlVHlwZVBhcnRpY2lwYW50IgotICAgIAkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZWZhY3RvcmluZy5qcGFEZWxldGVUeXBlUGFydGljaXBhbnQiCi0gICAgCQluYW1lPSIlSlBBX0RFTEVURV9UWVBFX1BBUlRJQ0lQQU5UX05BTUUiPgotICAgIAkJPGVuYWJsZW1lbnQ+Ci0gICAgCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotIAkgICAJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIi8+Ci0gICAgCQkJPC93aXRoPgotICAgIAkJPC9lbmFibGVtZW50PgotICAgIAk8L2RlbGV0ZVBhcnRpY2lwYW50PgotICAgIAkKLSAgICAgCTxkZWxldGVQYXJ0aWNpcGFudAotICAgICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZy5KcGFEZWxldGVQYWNrYWdlT3JGb2xkZXJQYXJ0aWNpcGFudCIKLSAgICAgICAgICAgCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVmYWN0b3JpbmcuanBhRGVsZXRlUGFja2FnZU9yRm9sZGVyUGFydGljaXBhbnQiCi0gICAgCQluYW1lPSIlSlBBX0RFTEVURV9QQUNLQUdFX09SX0ZPTERFUl9QQVJUSUNJUEFOVF9OQU1FIj4KLSAgICAgICAgCTxlbmFibGVtZW50PgotICAgICAgICAgICAJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLSAgICAgICAgICAgICAgICAJPG9yPgotICAgICAgICAgICAgICAgICAgIAkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KLSAgICAgICAgICAgICAgICAgICAJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyIi8+Ci0gICAgICAgICAgICAgICAgCTwvb3I+Ci0gICAgICAgICAgIAkJPC93aXRoPgotICAgICAgICAJPC9lbmFibGVtZW50PgotICAgICAJPC9kZWxldGVQYXJ0aWNpcGFudD4KLSAgICAgCQotICAgICAJPGRlbGV0ZVBhcnRpY2lwYW50Ci0gICAgICAgICAgIAljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nLkpwYURlbGV0ZU1hcHBpbmdGaWxlUGFydGljaXBhbnQiCi0gICAgICAgICAgIAlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlZmFjdG9yaW5nLmpwYURlbGV0ZU1hcHBpbmdGaWxlUGFydGljaXBhbnQiCi0gICAgCQluYW1lPSIlSlBBX0RFTEVURV9NQVBQSU5HX0ZJTEVfUEFSVElDSVBBTlRfTkFNRSI+Ci0gICAgICAgIAk8ZW5hYmxlbWVudD4KLSAJICAgICAgICAgICAJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotICAgICAgIAkJCQk8YW5kPgotCSAgICAgICAgICAgICAgCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiLz4KLQkgIAkJCQkJPHRlc3QKLSAgICAgICAgICAgIAkJCQlhcmdzPSJraW5kT2YiCi0gICAgICAgICAgICAJIAkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb250ZW50VHlwZUlkIgotICAgICAgICAgICAgIAkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRlbnQubWFwcGluZ0ZpbGUiLz4KLQkgICAgICAgIAkJPC9hbmQ+Ci0JICAgICAgICAgICAJPC93aXRoPgotICAgICAgICAJPC9lbmFibGVtZW50PgotICAgICAJPC9kZWxldGVQYXJ0aWNpcGFudD4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICAKLSAgCTxleHRlbnNpb24KLSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLm1vdmVQYXJ0aWNpcGFudHMiPgotICAgICAgICAKLSAgICAgCTxtb3ZlUGFydGljaXBhbnQKLSAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3JpbmcuSnBhTW92ZVR5cGVQYXJ0aWNpcGFudCIKLSAgICAJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUubHRrLmpwYU1vdmVUeXBlUGFydGljaXBhbnQiCi0gICAgCQluYW1lPSIlSlBBX01PVkVfVFlQRV9QQVJUSUNJUEFOVF9OQU1FIj4KLSAgICAgICAgCTxlbmFibGVtZW50PgotICAgICAJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0gICAgCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSIvPgotICAgIAkJCTwvd2l0aD4KLSAgICAgICAJCi0gICAgICAgIAk8L2VuYWJsZW1lbnQ+Ci0gICAgIAk8L21vdmVQYXJ0aWNpcGFudD4KLSAgCTwvZXh0ZW5zaW9uPgotICAJCi0gIAkKLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5yZW5hbWVQYXJ0aWNpcGFudHMiPgotICAgICAgICA8cmVuYW1lUGFydGljaXBhbnQKLSAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3JpbmcuSnBhUmVuYW1lVHlwZVBhcnRpY2lwYW50IgotICAgIAkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5sdGsuanBhUmVuYW1lVHlwZVBhcnRpY2lwYW50IgotICAgIAkJbmFtZT0iJUpQQV9SRU5BTUVfVFlQRV9QQVJUSUNJUEFOVF9OQU1FIj4KLSAgICAJCTxlbmFibGVtZW50PgotICAgIAkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLSAgICAJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIi8+Ci0gICAgCQkJPC93aXRoPgotICAgIAkJPC9lbmFibGVtZW50PgotICAgICAgICA8L3JlbmFtZVBhcnRpY2lwYW50PgotICAgICAgICA8cmVuYW1lUGFydGljaXBhbnQKLSAgICAJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3JpbmcuSnBhUmVuYW1lUGFja2FnZVBhcnRpY2lwYW50IgotICAgIAkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5sdGsuanBhUmVuYW1lUGFja2FnZVBhcnRpY2lwYW50IgotICAgIAkJbmFtZT0iJUpQQV9SRU5BTUVfUEFDS0FHRV9QQVJUSUNJUEFOVF9OQU1FIj4KLSAgICAJCTxlbmFibGVtZW50PgotICAgIAkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLSAgICAJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KLSAgICAJCQk8L3dpdGg+Ci0gICAgCQk8L2VuYWJsZW1lbnQ+Ci0gICAgICAgIDwvcmVuYW1lUGFydGljaXBhbnQ+Ci0gICAgICAgIDxyZW5hbWVQYXJ0aWNpcGFudAotICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZy5KcGFSZW5hbWVGb2xkZXJQYXJ0aWNpcGFudCIKLSAgICAJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUubHRrLmpwYVJlbmFtZUZvbGRlclBhcnRpY2lwYW50IgotICAgIAkJbmFtZT0iJUpQQV9SRU5BTUVfRk9MREVSX1BBUlRJQ0lQQU5UX05BTUUiPgotICAgIAkJPGVuYWJsZW1lbnQ+Ci0gICAgCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotICAgICAgICAgICAgICAgICAgIAk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciIvPgotICAgIAkJCTwvd2l0aD4KLSAgICAJCTwvZW5hYmxlbWVudD4KLSAgICAgICAgPC9yZW5hbWVQYXJ0aWNpcGFudD4KLSAgICAgICAgPHJlbmFtZVBhcnRpY2lwYW50Ci0gICAgCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nLkpwYVJlbmFtZU1hcHBpbmdGaWxlUGFydGljaXBhbnQiCi0gICAgCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmx0ay5qcGFSZW5hbWVNYXBwaW5nRmlsZVBhcnRpY2lwYW50IgotICAgIAkJbmFtZT0iJUpQQV9SRU5BTUVfTUFQUElOR19GSUxFX1BBUlRJQ0lQQU5UX05BTUUiPgotICAgICAgICAJPGVuYWJsZW1lbnQ+Ci0gCSAgICAgICAgICAgCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLSAgICAgICAJCQkJPGFuZD4KLQkgICAgICAgICAgICAgIAkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIi8+Ci0JICAJCQkJCTx0ZXN0Ci0gICAgICAgICAgICAJCQkJYXJncz0ia2luZE9mIgotICAgICAgICAgICAgCSAJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLSAgICAgICAgICAgICAJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50Lm1hcHBpbmdGaWxlIi8+Ci0JICAgICAgICAJCTwvYW5kPgotCSAgICAgICAgICAgCTwvd2l0aD4KLSAgICAgICAgCTwvZW5hYmxlbWVudD4KLSAgICAgICAgPC9yZW5hbWVQYXJ0aWNpcGFudD4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5tb3ZlUGFydGljaXBhbnRzIj4KLSAgICAgICAgPG1vdmVQYXJ0aWNpcGFudAotICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZy5KcGFNb3ZlTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudCIKLSAgICAJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUubHRrLmpwYU1vdmVNYXBwaW5nRmlsZVBhcnRpY2lwYW50IgotICAgIAkJbmFtZT0iJUpQQV9NT1ZFX01BUFBJTkdfRklMRV9QQVJUSUNJUEFOVF9OQU1FIj4KLSAgICAgICAgCTxlbmFibGVtZW50PgotIAkgICAgICAgICAgIAk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0gICAgICAgCQkJCTxhbmQ+Ci0JICAgICAgICAgICAgICAJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIvPgotCSAgCQkJCQk8dGVzdAotICAgICAgICAgICAgCQkJCWFyZ3M9ImtpbmRPZiIKLSAgICAgICAgICAgIAkgCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0gICAgICAgICAgICAgCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5tYXBwaW5nRmlsZSIvPgotCSAgICAgICAgCQk8L2FuZD4KLQkgICAgICAgICAgIAk8L3dpdGg+Ci0gICAgICAgIAk8L2VuYWJsZW1lbnQ+Ci0gICAgICAgIDwvbW92ZVBhcnRpY2lwYW50PgotICAgICAgICAgPG1vdmVQYXJ0aWNpcGFudAotICAgIAkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZy5KcGFNb3ZlRm9sZGVyUGFydGljaXBhbnQiCi0gICAgCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmx0ay5qcGFNb3ZlRm9sZGVyUGFydGljaXBhbnQiCi0gICAgCQluYW1lPSIlSlBBX01PVkVfRk9MREVSX1BBUlRJQ0lQQU5UX05BTUUiPgotICAgICAgICAJPGVuYWJsZW1lbnQ+Ci0gICAgCQkJPHdpdGggdmFyaWFibGU9ImVsZW1lbnQiPgotICAgICAgICAgICAgICAgICAgIAk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciIvPgotICAgIAkJCTwvd2l0aD4KLSAgICAgICAgCTwvZW5hYmxlbWVudD4KLSAgICAgICAgPC9tb3ZlUGFydGljaXBhbnQ+Ci0gICAgPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfY29yZS5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV9jb3JlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODUwOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV9jb3JlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotTk9ORT08Tm9uZT4KLVZBTElEQVRFX0pPQj1WYWxpZGF0aW9uCi1WQUxJREFURV9QUk9KRUNUX05PVF9KUEE9UHJvamVjdCBkb2VzIG5vdCBoYXZlIHRoZSBKUEEgZmFjZXQKLVZBTElEQVRFX1BST0pFQ1RfSU1QUk9QRVJfUExBVEZPUk09UHJvamVjdCdzIEpQQSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZmlsZSB0eXBlCi1WQUxJREFURV9DT05UQUlORVJfUVVFU1RJT05BQkxFPVBhcmVudCBmb2xkZXIgbWF5IG5vdCBiZSBhY2NlcHRhYmxlIGZvciB0aGlzIHByb2plY3RzCi1WQUxJREFURV9GSUxFX1ZFUlNJT05fTk9UX1NVUFBPUlRFRD1GaWxlIHZlcnNpb24gbm90IHN1cHBvcnRlZAotVkFMSURBVEVfRklMRV9WRVJTSU9OX05PVF9TVVBQT1JURURfRk9SX0ZBQ0VUX1ZFUlNJT049RmlsZSB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQgZm9yIEpQQSBmYWNldCB2ZXJzaW9uCi1WQUxJREFURV9QRVJTSVNURU5DRV9VTklUX0RPRVNfTk9UX1NQRUNJRklFRD1QZXJzaXN0ZW5jZSB1bml0IG5vdCBzcGVjaWZpZWQKLVZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfTk9UX0lOX1BST0pFQ1Q9UGVyc2lzdGVuY2UgdW5pdCAnJ3swfScnIG5vdCBkZWZpbmVkIGluIHByb2plY3QgJyd7MX0nJwotVkFMSURBVEVfUExBVEZPUk1fTk9UX1NQRUNJRklFRD1QbGF0Zm9ybSBtdXN0IGJlIHNwZWNpZmllZAotVkFMSURBVEVfUExBVEZPUk1fRE9FU19OT1RfU1VQUE9SVF9GQUNFVF9WRVJTSU9OPVBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgdGhlIGN1cnJlbnQgSlBBIGZhY2V0IHZlcnNpb24KLVZBTElEQVRFX0xJQlJBUllfUFJPVklERVJfSU5WQUxJRD1UaGUgY3VycmVudGx5IHNlbGVjdGVkIGxpYnJhcnkgcHJvdmlkZXIgaXMgaW52YWxpZAotVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfU1BFQ0lGSUVEPUNvbm5lY3Rpb24gbXVzdCBiZSBzcGVjaWZpZWQKLVZBTElEQVRFX0NPTk5FQ1RJT05fSU5WQUxJRD1Db25uZWN0aW9uIHByb2ZpbGUgJyd7MH0nJyBkb2VzIG5vdCBleGlzdAotVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEPUNvbm5lY3Rpb24gbXVzdCBiZSBhY3RpdmUgdG8gZ2V0IGRhdGEgc291cmNlIHNwZWNpZmljIGhlbHAgYW5kIHZhbGlkYXRpb24uCi1WQUxJREFURV9ERUZBVUxUX0NBVEFMT0dfTk9UX1NQRUNJRklFRD1EZWZhdWx0IGNhdGFsb2cgaXMgbm90IHNwZWNpZmllZAotVkFMSURBVEVfQ09OTkVDVElPTl9ET0VTTlRfQ09OVEFJTl9DQVRBTE9HPUNhdGFsb2cgJyd7MH0nJyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgY29ubmVjdGlvbiBzcGVjaWZpZWQKLVZBTElEQVRFX0RFRkFVTFRfU0NIRU1BX05PVF9TUEVDSUZJRUQ9RGVmYXVsdCBzY2hlbWEgaXMgbm90IHNwZWNpZmllZAotVkFMSURBVEVfQ09OTkVDVElPTl9ET0VTTlRfQ09OVEFJTl9TQ0hFTUE9U2NoZW1hICcnezB9JycgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGNvbm5lY3Rpb24gc3BlY2lmaWVkCi1WQUxJREFURV9SVU5USU1FX05PVF9TUEVDSUZJRUQ9VGhlcmUgaXMgbm8gc2VydmVyIHJ1bnRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdCB0byBwcm92aWRlIGEgSlBBIGltcGxlbWVudGF0aW9uCi1WQUxJREFURV9SVU5USU1FX0RPRVNfTk9UX1NVUFBPUlRfRUpCXzMwPVRoZSBzZXJ2ZXIgcnVudGltZSBzZWxlY3RlZCBkb2VzIG5vdCBzdXBwb3J0IEVKQiAzLjAsIHNvIGl0IGxpa2VseSBkb2VzIG5vdCBwcm92aWRlIGEgSlBBIGltcGxlbWVudGF0aW9uCi1WQUxJREFURV9MSUJSQVJZX05PVF9TUEVDSUZJRUQ9Tm8gSlBBIGltcGxlbWVudGF0aW9uIGxpYnJhcnkgc3BlY2lmaWVkCi1TWU5DSFJPTklaRV9DTEFTU0VTX0pPQj1TeW5jaHJvbml6aW5nIGNsYXNzZXMKLVNZTkNIUk9OSVpJTkdfQ0xBU1NFU19UQVNLPVN5bmNocm9uaXppbmcgY2xhc3NlcyAuLi4KLUlOVkFMSURfUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlQ9SW52YWxpZCBwZXJzaXN0ZW5jZS54bWwgY29udGVudAotRVJST1JfU1lOQ0hST05JWklOR19DTEFTU0VTX0NPVUxEX05PVF9WQUxJREFURT1FcnJvciBzeW5jaHJvbml6aW5nIGNsYXNzZXMuICBDb3VsZCBub3QgdmFsaWRhdGUuCi1FUlJPUl9XUklUSU5HX0ZJTEU9Q291bGQgbm90IHdyaXRlIHRvIHBlcnNpc3RlbmNlLnhtbAotUkVHSVNUUllfTUlTU0lOR19BVFRSSUJVVEU9TWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgJyd7MH0nJyBmb3IgZWxlbWVudCAnJ3sxfScnIGluIGV4dGVuc2lvbiAnJ3sxfScnIGZyb20gcGx1Zy1pbiAnJ3syfScnLgotUkVHSVNUUllfSU5WQUxJRF9WQUxVRT1JbnZhbGlkIHZhbHVlICcnezB9JycgZm9yICcnezF9JycgaW4gZXh0ZW5zaW9uICcnezJ9JycgZnJvbSBwbHVnLWluICcnezN9JycuCi1SRUdJU1RSWV9EVVBMSUNBVEU9QW4gZXh0ZW5zaW9uIG9mICcnezB9Jycgd2l0aCB0aGUgJyd7MX0nJyB2YWx1ZSBvZiAnJ3syfScnIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4KLVJFR0lTVFJZX0ZBSUxFRF9DTEFTU19MT0FEPVVuYWJsZSB0byBsb2FkIHRoZSBjbGFzcyAnJ3swfScnIGRlY2xhcmVkIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50ICcnezF9JycgaW4gdGhlIHBsdWctaW4gJyd7Mn0nJy4KLVJFR0lTVFJZX0ZBSUxFRF9JTlRFUkZBQ0VfQVNTSUdOTUVOVD1VbmFibGUgdG8gYXNzaWduIHRoZSBjbGFzcyAnJ3swfScnIGRlY2xhcmVkIGZvciB0aGUgZXh0ZW5zaW9uIHBvaW50ICcnezF9JycgaW4gdGhlIHBsdWctaW4gJyd7Mn0nJyB0byB0aGUgaW50ZXJmYWNlICcnezN9JycuCi1SRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTj1VbmFibGUgdG8gaW5zdGFudGlhdGUgdGhlIGNsYXNzICcnezB9JycgZGVjbGFyZWQgZm9yIHRoZSBleHRlbnNpb24gcG9pbnQgJyd7MX0nJyBpbiB0aGUgcGx1Zy1pbiAnJ3syfScnLgotQ09OVEVYVF9NT0RFTF9TWU5DX0pPQl9OQU1FPVN5bmNocm9uaXplIEpQQSBwcm9qZWN0OiAnJ3swfScnCi1VUERBVEVfSk9CX05BTUU9VXBkYXRlIEpQQSBwcm9qZWN0OiAnJ3swfScnCi1QTEFURk9STV9JRF9ET0VTX05PVF9FWElTVD1ObyBKUEEgcGxhdGZvcm0gZXhpc3RzIGZvciB0aGUgaWQ6ICcnezB9JycuIFRoZSBKUEEgcHJvamVjdCB3YXMgbm90IGNyZWF0ZWQgZm9yIHByb2plY3QgJyd7MX0nJy4gIEVuc3VyZSB0aGF0IHRoZSBwbGF0Zm9ybScncyBwbHVnaW4gaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBFY2xpcHNlIGluc3RhbGxhdGlvbi4KLVBSRUZFUkVOQ0VTX0ZMVVNIX0pPQl9OQU1FPUZsdXNoIFByZWZlcmVuY2VzOiB7MH0KLU9TR0lfQlVORExFU19MSUJSQVJZX1ZBTElEQVRPUl9fQlVORExFX05PVF9GT1VORD1UaGUgYnVuZGxlICcnezB9JycgY291bGQgbm90IGJlIGZvdW5kLgotT1NHSV9CVU5ETEVTX0xJQlJBUllfVkFMSURBVE9SX19JTVBST1BFUl9CVU5ETEVfVkVSU0lPTj1UaGUgdmVyc2lvbiBvZiBidW5kbGUgJyd7MH0nJyBkb2VzIG5vdCBtZWV0IHBsYXRmb3JtIHJlcXVpcmVtZW50cy4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfY29yZV9yZWZhY3RvcmluZy5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV9jb3JlX3JlZmFjdG9yaW5nLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYWRiMzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3Byb3BlcnR5X2ZpbGVzL2pwYV9jb3JlX3JlZmFjdG9yaW5nLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotSlBBX0RFTEVURV9UWVBFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU9SlBBIGRlbGV0ZSBJVHlwZSByZWZhY3RvcmluZyBwYXJ0aWNpcGFudAotSlBBX0RFTEVURV9QQUNLQUdFX09SX0ZPTERFUl9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FPUpQQSBkZWxldGUgSVBhY2thZ2VGcmFnbWVudC9JRm9sZGVyIHJlZmFjdG9yaW5nIHBhcnRpY2lwYW50Ci1KUEFfREVMRVRFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU9RGVsZXRlIHJlZmVyZW5jZXMgaW4gSlBBIG1ldGFkYXRhIGZpbGVzCi1KUEFfREVMRVRFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FPURlbGV0ZSByZWZlcmVuY2VzIGZyb20gcGVyc2lzdGVuY2UueG1sCi1KUEFfREVMRVRFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX01BUFBJTkdfRklMRV9OQU1FPURlbGV0ZSB0eXBlcyBmcm9tIG1hcHBpbmcgZmlsZQotSlBBX0RFTEVURV9UWVBFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU9SlBBIGRlbGV0ZSByZWZlcmVuY2VzCi0KLUpQQV9ERUxFVEVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU9SlBBIGRlbGV0ZSBtYXBwaW5nIGZpbGUgcmVmYWN0b3JpbmcgcGFydGljaXBhbnQKLUpQQV9ERUxFVEVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU9SlBBIGRlbGV0ZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlcwotSlBBX0RFTEVURV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU9RGVsZXRlIG1hcHBpbmcgZmlsZSByZWZlcmVuY2VzIGluIEpQQSBtZXRhZGF0YSBmaWxlcwotSlBBX0RFTEVURV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FPURlbGV0ZSBtYXBwaW5nIGZpbGVzIGZyb20gcGVyc2lzdGVuY2UueG1sCi0KLUpQQV9SRUZBQ09SSU5HX1BBUlRJQ0lQQU5UX0xPQURJTkdfSlBBX1BST0pFQ1RTX1NVQl9UQVNLX05BTUU9bG9hZGluZyBKUEEgcHJvamVjdHMKLQotSlBBX1JFTkFNRV9UWVBFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU9SlBBIHJlbmFtZSBJVHlwZSByZWZhY3RvcmluZyBwYXJ0aWNpcGFudAotSlBBX1JFTkFNRV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FPVJlbmFtZSBjbGFzc2VzIHJlZmVyZW5jZWQgaW4gSlBBIG1ldGFkYXRhIGZpbGVzCi1KUEFfUkVOQU1FX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FPVJlbmFtZSB0eXBlIHJlZmVyZW5jZXMgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotSlBBX1JFTkFNRV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9NQVBQSU5HX0ZJTEVfTkFNRT1SZW5hbWUgdHlwZSByZWZlcmVuY2VzIGluIHRoZSBtYXBwaW5nIGZpbGUKLUpQQV9SRU5BTUVfVFlQRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FPUpQQSByZW5hbWUgdHlwZSByZWZlcmVuY2VzCi0KLUpQQV9SRU5BTUVfUEFDS0FHRV9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FPUpQQSByZW5hbWUgSVBhY2thZ2VGcmFnbWVudCByZWZhY3RvcmluZyBwYXJ0aWNpcGFudAotSlBBX1JFTkFNRV9QQUNLQUdFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FPVJlbmFtZSBwYWNrYWdlcyByZWZlcmVuY2VkIGluIEpQQSBtZXRhZGF0YSBmaWxlcwotSlBBX1JFTkFNRV9QQUNLQUdFX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRT1SZW5hbWUgcGFja2FnZSByZWZlcmVuY2VzIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLUpQQV9SRU5BTUVfUEFDS0FHRV9SRUZBQ1RPUklOR19DSEFOR0VfTUFQUElOR19GSUxFX05BTUU9UmVuYW1lIHBhY2thZ2UgcmVmZXJlbmNlcyBpbiB0aGUgbWFwcGluZyBmaWxlCi1KUEFfUkVOQU1FX1BBQ0tBR0VfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRT1KUEEgcmVuYW1lIHBhY2thZ2UgcmVmZXJlbmNlcwotCi1KUEFfUkVOQU1FX0ZPTERFUl9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FPUpQQSByZW5hbWUgSUZvbGRlciByZWZhY3RvcmluZyBwYXJ0aWNpcGFudAotSlBBX1JFTkFNRV9GT0xERVJfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU9UmVuYW1lIGZvbGRlcnMgcmVmZXJlbmNlZCBpbiBKUEEgbWV0YWRhdGEgZmlsZXMKLUpQQV9SRU5BTUVfRk9MREVSX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRT1SZW5hbWUgZm9sZGVyIHJlZmVyZW5jZXMgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotSlBBX1JFTkFNRV9GT0xERVJfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRT1KUEEgcmVuYW1lIGZvbGRlciByZWZlcmVuY2VzCi0KLUpQQV9SRU5BTUVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU9SlBBIHJlbmFtZSBtYXBwaW5nIGZpbGUgcmVmYWN0b3JpbmcgcGFydGljaXBhbnQKLUpQQV9SRU5BTUVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU9SlBBIHJlbmFtZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlcwotSlBBX1JFTkFNRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU9UmVuYW1lIG1hcHBpbmcgZmlsZSByZWZlcmVuY2VzIGluIEpQQSBtZXRhZGF0YSBmaWxlcwotSlBBX1JFTkFNRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FPVJlbmFtZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlcyBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0KLUpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRT1KUEEgbW92ZSBJVHlwZSByZWZhY3RvcmluZyBwYXJ0aWNpcGFudAotSlBBX01PVkVfVFlQRV9SRUZBQ1RPUklOR19DSEFOR0VfTkFNRT1Nb3ZlIGNsYXNzZXMgcmVmZXJlbmNlZCBpbiBKUEEgbWV0YWRhdGEgZmlsZXMKLUpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FPU1vdmUgdHlwZSByZWZlcmVuY2VzIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLUpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX01BUFBJTkdfRklMRV9OQU1FPU1vdmUgdHlwZSByZWZlcmVuY2VzIGluIHRoZSBtYXBwaW5nIGZpbGUKLUpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRT1KUEEgbW92ZSB0eXBlIHJlZmVyZW5jZXMKLQotSlBBX01PVkVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU9SlBBIG1vdmUgbWFwcGluZyBmaWxlIHJlZmFjdG9yaW5nIHBhcnRpY2lwYW50Ci1KUEFfTU9WRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRT1KUEEgbW92ZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlcwotSlBBX01PVkVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FPU1vdmUgbWFwcGluZyBmaWxlIHJlZmVyZW5jZXMgaW4gSlBBIG1ldGFkYXRhIGZpbGVzCi1KUEFfTU9WRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FPU1vdmUgbWFwcGluZyBmaWxlIHJlZmVyZW5jZXMgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCi1KUEFfTU9WRV9GT0xERVJfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRT1KUEEgbW92ZSBJRm9sZGVyIHJlZmFjdG9yaW5nIHBhcnRpY2lwYW50Ci1KUEFfTU9WRV9GT0xERVJfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU9TW92ZSBmb2xkZXJzIHJlZmVyZW5jZWQgaW4gSlBBIG1ldGFkYXRhIGZpbGVzCi1KUEFfTU9WRV9GT0xERVJfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FPU1vdmUgZm9sZGVyIHJlZmVyZW5jZXMgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotSlBBX01PVkVfRk9MREVSX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU9SlBBIG1vdmUgZm9sZGVyIHJlZmVyZW5jZXMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfanBxbF92YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX2pwcWxfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjZkZDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfanBxbF92YWxpZGF0aW9uLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDojd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBBYnNFeHByZXNzaW9uIC0gR3JhbW1hcgotQUJTX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1BQlNfRVhQUkVTU0lPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gbXVzdCBiZSBwcm92aWRlZCBmb3IgYW4gQUJTIGV4cHJlc3Npb24uCi1BQlNfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIEFCUyBleHByZXNzaW9uLgotQUJTX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIEFCUyBleHByZXNzaW9uLgotIyBBYnNFeHByZXNzaW9uIC0gU2VtYW50aWMKLUFCU19FWFBSRVNTSU9OX0lOVkFMSURfTlVNRVJJQ19FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIG51bWVyaWMgZXhwcmVzc2lvbi4KLQotIyBBYnN0cmFjdEZyb21DbGF1c2UgLSBHcmFtbWFyCi1BQlNUUkFDVF9GUk9NX0NMQVVTRV9JREVOVElGSUNBVElPTl9WQVJJQUJMRV9ERUNMQVJBVElPTl9FTkRTX1dJVEhfQ09NTUEgPSBUaGUgRlJPTSBjbGF1c2UgY2Fubm90IGVuZCB3aXRoIGEgY29tbWEuCi1BQlNUUkFDVF9GUk9NX0NMQVVTRV9JREVOVElGSUNBVElPTl9WQVJJQUJMRV9ERUNMQVJBVElPTl9JU19NSVNTSU5HX0NPTU1BID0gVGhlIEZST00gY2xhdXNlIGhhcyAnJ3swfScnIGFuZCAnJ3sxfScnIHRoYXQgYXJlIG5vdCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KLUFCU1RSQUNUX0ZST01fQ0xBVVNFX01JU1NJTkdfSURFTlRJRklDQVRJT05fVkFSSUFCTEVfREVDTEFSQVRJT04gPSBUaGUgRlJPTSBjbGF1c2UgbXVzdCBkZWZpbmVkIGF0IGxlYXN0IG9uZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KLUFCU1RSQUNUX0ZST01fQ0xBVVNFX1dST05HX09SREVSX09GX0lERU5USUZJQ0FUSU9OX1ZBUklBQkxFX0RFQ0xBUkFUSU9OID0gVGhlIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlICcnezB9JycgaXMgZGVjbGFyZWQgYWZ0ZXIgaXRzIHVzYWdlLiBJZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMgYXJlIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQuCi0KLSMgQWJzdHJhY3RQYXRoRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUFCU1RSQUNUX1BBVEhfRVhQUkVTU0lPTl9DQU5OT1RfRU5EX1dJVEhfQ09NTUEgPSBBIHBhdGggZXhwcmVzc2lvbiBjYW5ub3QgZW5kIHdpdGggYSBjb21tYS4KLUFCU1RSQUNUX1BBVEhfRVhQUkVTU0lPTl9NSVNTSU5HX0lERU5USUZJQ0FUSU9OX1ZBUklBQkxFID0gQSBwYXRoIGV4cHJlc3Npb24gbXVzdCBzdGFydCB3aXRoIGFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlLgotCi0jIEFic3RyYWN0U2NoZW1hTmFtZSAtIEdyYW1tYXIKLUFCU1RSQUNUX1NDSEVNQV9OQU1FX0lOVkFMSUQgPSBUaGUgYWJzdHJhY3Qgc2NoZW1hIHR5cGUgJyd7MH0nJyBpcyB1bmtub3duLgotQUJTVFJBQ1RfU0NIRU1BX05BTUVfTk9UX1JFU09MVkFCTEUgPSAnJ3swfScnIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhIHR5cGUuCi0jIEFic3RyYWN0U2NoZW1hTmFtZSAtIFNlbWFudGljCi1QQVRIX0VYUFJFU1NJT05fTk9UX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gVGhlIGRlcml2ZWQgcGF0aCAnJ3swfScnIGRvZXMgbm90IHJlcHJlc2VudCBhbiBhc3NvY2lhdGlvbiBmaWVsZC4KLQotIyBBYnN0cmFjdFNlbGVjdENsYXVzZSAtIEdyYW1tYXIKLUFCU1RSQUNUX1NFTEVDVF9DTEFVU0VfU0VMRUNUX0VYUFJFU1NJT05fRU5EU19XSVRIX0NPTU1BID0gVGhlIHNlbGVjdCBleHByZXNzaW9uIGNhbm5vdCBlbmQgd2l0aCBhIGNvbW1hLgotQUJTVFJBQ1RfU0VMRUNUX0NMQVVTRV9TRUxFQ1RfRVhQUkVTU0lPTl9JU19NSVNTSU5HX0NPTU1BID0gVGhlIFNFTEVDVCBjbGF1c2UgaGFzICcnezB9JycgYW5kICcnezF9JycgdGhhdCBhcmUgbm90IHNlcGFyYXRlZCBieSBhIGNvbW1hLgotQUJTVFJBQ1RfU0VMRUNUX0NMQVVTRV9TRUxFQ1RfRVhQUkVTU0lPTl9NQUxGT1JNRUQgPSBUaGUgc2VsZWN0IGV4cHJlc3Npb24gaXMgbWFsZm9ybWVkLgotQUJTVFJBQ1RfU0VMRUNUX0NMQVVTRV9TRUxFQ1RfTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIHNlbGVjdCBleHByZXNzaW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgU0VMRUNUIGNsYXVzZS4KLQotIyBBYnN0cmFjdFNlbGVjdFN0YXRlbWVudCAtIEdyYW1tYXIKLUFCU1RSQUNUX1NFTEVDVF9TVEFURU1FTlRfRlJPTV9DTEFVU0VfTVNTSU5HID0gQSBzZWxlY3Qgc3RhdGVtZW50IG11c3QgaGF2ZSBhIEZST00gY2xhdXNlLgotCi0jIEFkZGl0aW9uRXhwcmVzc2lvbiAtIFNlbWFudGljCi1BRERJVElPTl9FWFBSRVNTSU9OX0xFRlRfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIGxlZnQgc2lkZSBvZiB0aGUgYWRkaXRpb24gaXMgbm90IGEgdmFsaWQgYXJpdGhtZXRpYyBleHByZXNzaW9uLgotQURESVRJT05fRVhQUkVTU0lPTl9SSUdIVF9FWFBSRVNTSU9OX1dST05HX1RZUEUgPSBUaGUgcmlnaHQgc2lkZSBvZiB0aGUgYWRkaXRpb24gaXMgbm90IGEgdmFsaWQgYXJpdGhtZXRpYyBleHByZXNzaW9uLgotCi0jIEFsbE9yQW55RXhwcmVzc2lvbiAtIEdyYW1tYXIKLUFMTF9PUl9BTllfRVhQUkVTU0lPTl9JTlZBTElEX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLUFMTF9PUl9BTllfRVhQUkVTU0lPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBUaGUgc3VicXVlcnkgbXVzdCBiZSBwcm92aWRlZCBmb3IgYW4gezB9IGV4cHJlc3Npb24uCi1BTExfT1JfQU5ZX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSB7MH0gZXhwcmVzc2lvbi4KLUFMTF9PUl9BTllfRVhQUkVTU0lPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgezB9IGV4cHJlc3Npb24uCi1BTExfT1JfQU5ZX0VYUFJFU1NJT05fTk9UX1BBUlRfT0ZfQ09NUEFSSVNPTl9FWFBSRVNTSU9OID0gVGhlIHswfSBleHByZXNzaW9uIG11c3QgYmUgcGFydCBvZiBhIGNvbXBhcmlzb24gZXhwcmVzc2lvbi4KLQotIyBBcml0aG1ldGljRmFjdG9yIC0gR3JhbW1hcgotQVJJVEhNRVRJQ19GQUNUT1JfTUlTU0lOR19FWFBSRVNTSU9OID0gQW4gYXJpdGhtZXRpYyBmYWN0b3IgbXVzdCBiZSBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uLgotIyBBcml0aG1ldGljRmFjdG9yIC0gU2VtYW50aWMKLUFSSVRITUVUSUNfRkFDVE9SX0lOVkFMSURfRVhQUkVTU0lPTiA9IFRoZSBleHByZXNzaW9uIG11c3QgYmUgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uLgotCi0jIEFyaXRobWV0aWNFeHByZXNzaW9uIC0gR3JhbW1hcgotQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0lOVkFMSURfTEVGVF9FWFBSRVNTSU9OID0gVGhlIGxlZnQgZXhwcmVzc2lvbiBpcyBub3QgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uLgotQVJJVEhNRVRJQ19FWFBSRVNTSU9OX0lOVkFMSURfUklHSFRfRVhQUkVTU0lPTiA9IFRoZSByaWdodCBleHByZXNzaW9uIGlzIG5vdCBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24uCi1BUklUSE1FVElDX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX0VYUFJFU1NJT04gPSBUaGUgbGVmdCBleHByZXNzaW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgYXJpdGhtZXRpYyBleHByZXNzaW9uLgotQVJJVEhNRVRJQ19FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfRVhQUkVTU0lPTiA9IFRoZSByaWdodCBleHByZXNzaW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgYXJpdGhtZXRpYyBleHByZXNzaW9uLgotCi0jIEF2Z0Z1bmN0aW9uIC0gR3JhbW1hcgotQVZHX0ZVTkNUSU9OX0lOVkFMSURfRVhQUkVTU0lPTiA9IFRoZSBlbmNhcHN1bGF0ZWQgZXhwcmVzc2lvbiBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotQVZHX0ZVTkNUSU9OX01JU1NJTkdfTEVGVF9QQVJFTlRIRVNJUyA9IFRoZSBsZWZ0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgQVZHIGV4cHJlc3Npb24uCi1BVkdfRlVOQ1RJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIG11c3QgYmUgcHJvdmlkZWQgZm9yIGFuIEFWRyBleHByZXNzaW9uLgotQVZHX0ZVTkNUSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBBVkcgZXhwcmVzc2lvbi4KLSMgQXZnRnVuY3Rpb24gLSBTZW1hbnRpYwotQVZHX0ZVTkNUSU9OX0lOVkFMSURfTlVNRVJJQ19FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIG51bWVyaWMgZXhwcmVzc2lvbi4KLQotIyBCZXR3ZWVuRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUJFVFdFRU5fRVhQUkVTU0lPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBUaGUgcmVzdWx0IGV4cHJlc3Npb24gaXMgbWlzc2luZyBmcm9tIHRoZSBCRVRXRUVOIGV4cHJlc3Npb24uCi1CRVRXRUVOX0VYUFJFU1NJT05fTUlTU0lOR19MT1dFUl9CT1VORF9FWFBSRVNTSU9OID0gVGhlIGxvd2VyIGJvdW5kIGV4cHJlc3Npb24gaXMgbWlzc2luZyBmcm9tIHRoZSBCRVRXRUVOIGV4cHJlc3Npb24uCi1CRVRXRUVOX0VYUFJFU1NJT05fTUlTU0lOR19BTkQgPSBUaGUgaWRlbnRpZmllciBBTkQgaXMgbWlzc2luZyBmcm9tIHRoZSBCRVRXRUVOIGV4cHJlc3Npb24uCi1CRVRXRUVOX0VYUFJFU1NJT05fTUlTU0lOR19VUFBFUl9CT1VORF9FWFBSRVNTSU9OID0gVGhlIHVwcGVyIGJvdW5kIGV4cHJlc3Npb24gaXMgbWlzc2luZyBmcm9tIHRoZSBCRVRXRUVOIGV4cHJlc3Npb24uCi0jIEJldHdlZW5FeHByZXNzaW9uIC0gU2VtYW50aWMKLUJFVFdFRU5fRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIGV4cHJlc3Npb24ncyB0eXBlIGFuZCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zJyB0eXBlIGhhdmUgdG8gYmUgdGhlIHNhbWUgdHlwZS4KLQotIyBDYXNlRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUNBU0VfRVhQUkVTU0lPTl9JTlZBTElEX0pQQV9WRVJTSU9OID0gQSBDT0FMRVNDRSBleHByZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGluIGEgSlBRTCBxdWVyeSB3aGVuIHRoZSBKUEEgcGxhdGZvcm0gaXMgMS4wLgotQ0FTRV9FWFBSRVNTSU9OX01JU1NJTkdfRUxTRV9FWFBSRVNTSU9OID0gQSBDQVNFIGV4cHJlc3Npb24gbXVzdCBoYXZlIGFuIEVMU0UgZXhwcmVzc2lvbi4KLUNBU0VfRVhQUkVTU0lPTl9NSVNTSU5HX0VMU0VfSURFTlRJRklFUiA9IFRoZSBpZGVudGlmaWVyIEVMU0UgaXMgbWlzc2luZyBmcm9tIHRoZSBDQVNFIGV4cHJlc3Npb24uCi1DQVNFX0VYUFJFU1NJT05fTUlTU0lOR19FTkRfSURFTlRJRklFUiA9IFRoZSBpZGVudGlmaWVyIEVORCBpcyBtaXNzaW5nIGZyb20gdGhlIENBU0UgZXhwcmVzc2lvbi4KLUNBU0VfRVhQUkVTU0lPTl9NSVNTSU5HX1dIRU5fQ0xBVVNFID0gQSBDQVNFIGV4cHJlc3Npb24gbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIFdIRU4gY2xhdXNlLgotQ0FTRV9FWFBSRVNTSU9OX1dIRU5fQ0xBVVNFU19FTkRfV0lUSF9DT01NQSA9IFRoZSBXSEVOIGNsYXVzZXMgY2Fubm90IGVuZCB3aXRoIGEgY29tbWEuCi1DQVNFX0VYUFJFU1NJT05fV0hFTl9DTEFVU0VTX0hBU19DT01NQSA9IFR3byBXSEVOIGNsYXVzZXMgY2Fubm90IGJlIHNlcGFyYXRlZCBieSBhIGNvbW1hLgotCi0jIENvYWxlc2NlRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUNPQUxFU0NFX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1DT0FMRVNDRV9FWFBSRVNTSU9OX0lOVkFMSURfSlBBX1ZFUlNJT04gPSBBIENPQUxFU0NFIGV4cHJlc3Npb24gY2Fubm90IGJlIHVzZWQgaW4gYSBKUFFMIHF1ZXJ5IHdoZW4gdGhlIEpQQSBwbGF0Zm9ybSBpcyAxLjAuCi1DT0FMRVNDRV9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IFRoZSBlbmNhcHN1bGF0ZWQgZXhwcmVzc2lvbnMgbXVzdCBiZSBwcm92aWRlZCBmb3IgYSBDT0FMRVNDRSBleHByZXNzaW9uLgotQ09BTEVTQ0VfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIENPQUxFU0NFIGV4cHJlc3Npb24uCi1DT0FMRVNDRV9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBDT0FMRVNDRSBleHByZXNzaW9uLgotCi0jIENvbGxlY3Rpb25FeHByZXNzaW9uIC0gR3JhbW1hcgotQ09MTEVDVElPTl9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IEFuIGV4cHJlc3Npb24gYXQgcG9zaXRpb24gezB9IG11c3QgYmUgZGVmaW5lZC4KLQotIyBDb2xsZWN0aW9uTWVtYmVyRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUNPTExFQ1RJT05fTUVNQkVSX0VYUFJFU1NJT05fTUlTU0lOR19FTlRJVFlfRVhQUkVTU0lPTiA9IEEgY29sbGVjdGlvbiBtZW1iZXIgZXhwcmVzc2lvbiBtdXN0IGRlZmluZSBhbiBlbnRpdHkgZXhwcmVzc2lvbi4KLUNPTExFQ1RJT05fTUVNQkVSX0VYUFJFU1NJT05fTUlTU0lOR19DT0xMRUNUSU9OX1ZBTFVFRF9QQVRIX0VYUFJFU1NJT04gPSBBIGNvbGxlY3Rpb24gbWVtYmVyIGV4cHJlc3Npb24gbXVzdCBkZWZpbmUgYSBjb2xsZWN0aW9uIHZhbHVlZCBwYXRoIGV4cHJlc3Npb24uCi0jIENvbGxlY3Rpb25NZW1iZXJFeHByZXNzaW9uIC0gU2VtYW50aWMKLUNPTExFQ1RJT05fTUVNQkVSX0VYUFJFU1NJT05fRU1CRUREQUJMRSA9IEFuIGVtYmVkZGFibGUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLgotCi0jIENvbGxlY3Rpb25NZW1iZXJEZWNsYXJhdGlvbiAtIEdyYW1tYXIKLUNPTExFQ1RJT05fTUVNQkVSX0RFQ0xBUkFUSU9OX01JU1NJTkdfQ09MTEVDVElPTl9WQUxVRURfUEFUSF9FWFBSRVNTSU9OID0gVGhlIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGggZXhwcmVzc2lvbiBpcyBtaXNzaW5nIGZyb20gdGhlIGNvbGxlY3Rpb24gbWVtYmVyIGRlY2xhcmF0aW9uLgotQ09MTEVDVElPTl9NRU1CRVJfREVDTEFSQVRJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBjb2xsZWN0aW9uIG1lbWJlciBkZWNsYXJhdGlvbi4KLUNPTExFQ1RJT05fTUVNQkVSX0RFQ0xBUkFUSU9OX01JU1NJTkdfSURFTlRJRklDQVRJT05fVkFSSUFCTEUgPSBBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYSBjb2xsZWN0aW9uIG1lbWJlciBkZWNsYXJhdGlvbi4KLUNPTExFQ1RJT05fTUVNQkVSX0RFQ0xBUkFUSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBjb2xsZWN0aW9uIG1lbWJlciBkZWNsYXJhdGlvbi4KLQotIyBDb2xsZWN0aW9uVmFsdWVkUGF0aEV4cHJlc3Npb24gLSBTZW1hbnRpYwotQ09MTEVDVElPTl9WQUxVRURfUEFUSF9FWFBSRVNTSU9OX05PVF9SRVNPTFZBQkxFID0gVGhlIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGggJyd7MH0nJyBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSB2YWxpZCBhc3NvY2lhdGlvbiBmaWVsZC4KLUNPTExFQ1RJT05fVkFMVUVEX1BBVEhfRVhQUkVTU0lPTl9OT1RfQ09MTEVDVElPTl9UWVBFID0gVGhlIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGggJyd7MH0nJyBtdXN0IHJlc29sdmUgdG8gYW4gYXNzb2NpYXRpb24gZmllbGQuCi0KLSMgQ29tcGFyaXNvbkV4cHJlc3Npb24gLSBHcmFtbWFyCi1DT01QQVJJU09OX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX0VYUFJFU1NJT04gPSBBIGNvbXBhcmlzb24gZXhwcmVzc2lvbiBtdXN0IGRlZmluZSB0aGUgbGVmdCBzaWRlIG9mIHRoZSBjb21wYXJpc29uLgotQ09NUEFSSVNPTl9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfRVhQUkVTU0lPTiA9IEEgY29tcGFyaXNvbiBleHByZXNzaW9uIG11c3QgZGVmaW5lIHRoZSByaWdodCBzaWRlIG9mIHRoZSBjb21wYXJpc29uLgotIyBDb21wYXJpc29uRXhwcmVzc2lvbiAtIFNlbWFudGljCi1DT01QQVJJU09OX0VYUFJFU1NJT05fV1JPTkdfQ09NUEFSSVNPTl9UWVBFID0gVGhlIGxlZnQgYW5kIHJpZ2h0IGV4cHJlc3Npb25zJyB0eXBlIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZS4KLQotIyBDb25jYXRFeHByZXNzaW9uIC0gR3JhbW1hcgotQ09OQ0FUX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGV4cHJlc3Npb24gJyd7MH0nJyBpcyBub3QgdmFsaWQgZXhwcmVzc2lvbi4KLUNPTkNBVF9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IFRoZSBlbmNhcHN1bGF0ZWQgZXhwcmVzc2lvbiBpcyBtaXNzaW5nIGZyb20gdGhlIENPTkNBVCBleHByZXNzaW9uLgotQ09OQ0FUX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBDT05DQVQgZXhwcmVzc2lvbi4KLUNPTkNBVF9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBDT05DQVQgZXhwcmVzc2lvbi4KLSMgQ29uY2F0RXhwcmVzc2lvbiAtIFNlbWFudGljCi1DT05DQVRfRVhQUkVTU0lPTl9FWFBSRVNTSU9OX1dST05HX1RZUEUgPSBUaGUgZXhwcmVzc2lvbiAnJ3swfScnIGlzIG5vdCBhIFN0cmluZy4KLQotIyBDb25zdHJ1Y3RvckV4cHJlc3Npb24gLSBHcmFtbWFyCi1DT05TVFJVQ1RPUl9FWFBSRVNTSU9OX0NPTlNUUlVDVE9SX0lURU1fRU5EU19XSVRIX0NPTU1BID0gVGhlIGNvbnN0cnVjdG9yIGl0ZW1zIGNhbm5vdCBlbmQgd2l0aCBhIGNvbW1hLgotQ09OU1RSVUNUT1JfRVhQUkVTU0lPTl9DT05TVFJVQ1RPUl9JVEVNX0lTX01JU1NJTkdfQ09NTUEgPSBUaGUgY29uc3RydWN0b3IgZXhwcmVzc2lvbiBoYXMgdHdvIGNvbnN0cnVjdG9yIGl0ZW1zICgnJ3swfScnIGFuZCAnJ3sxfScnKSB0aGF0IGFyZSBub3Qgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCi1DT05TVFJVQ1RPUl9FWFBSRVNTSU9OX01JU1NJTkdfQ09OU1RSVUNUT1JfSVRFTSA9IEEgY29uc3RydWN0b3IgZXhwcmVzc2lvbiBtdXN0IGRlZmluZSBhdCBsZWFzdCBvbmUgY29uc3RydWN0b3IgaXRlbS4KLUNPTlNUUlVDVE9SX0VYUFJFU1NJT05fTUlTU0lOR19DT05TVFJVQ1RPUl9OQU1FID0gVGhlIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotQ09OU1RSVUNUT1JfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uCi1DT05TVFJVQ1RPUl9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBjb25zdHJ1Y3RvciBleHByZXNzaW9uLgotIyBDb25zdHJ1Y3RvckV4cHJlc3Npb24gLSBTZW1hbnRpYwotQ09OU1RSVUNUT1JfRVhQUkVTU0lPTl9NSVNNQVRDSEVEX1BBUkFNRVRFUl9UWVBFUyA9IE5vIGNvbnN0cnVjdG9ycyBjYW4gYmUgZm91bmQgdGhhdCBtYXRjaCB0aGUgYXJndW1lbnQgdHlwZXMuCi1DT05TVFJVQ1RPUl9FWFBSRVNTSU9OX1VOS05PV05fVFlQRSA9ICcnezB9JycgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZS4KLQotIyBDb3VudEZ1bmN0aW9uIC0gR3JhbW1hcgotQ09VTlRfRlVOQ1RJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1DT1VOVF9GVU5DVElPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gbXVzdCBiZSBwcm92aWRlZCBmb3IgYSBDT1VOVCBleHByZXNzaW9uLgotQ09VTlRfRlVOQ1RJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBDT1VOVCBleHByZXNzaW9uLgotQ09VTlRfRlVOQ1RJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIENPVU5UIGV4cHJlc3Npb24uCi0jIENvdW50RnVuY3Rpb24gLSBTZW1hbnRpYwotQ09VTlRfRlVOQ1RJT05fRElTVElOQ1RfRU1CRUREQUJMRSA9IFRoZSB1c2Ugb2YgRElTVElOQ1QgaXMgbm90IHN1cHBvcnRlZCBmb3IgYXJndW1lbnRzIG9mIGVtYmVkZGFibGUgdHlwZXMuCi0KLSMgRGF0ZVRpbWUgLSBHcmFtbWFyCi1EQVRFX1RJTUVfSkRCQ19FU0NBUEVfRk9STUFUX0lOVkFMSURfU1BFQ0lGSUNBVElPTiA9IFRoZSBKREJDIGVzY2FwZSBmb3JtYXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBlaXRoZXIgJ2QnLCAndCcgb3IgJ3RzJy4KLURBVEVfVElNRV9KREJDX0VTQ0FQRV9GT1JNQVRfTUlTU0lOR19DTE9TRV9RVU9URSA9IFRoZSBKREJDIGVzY2FwZSBmb3JtYXQgaXMgbWlzc2luZyB0aGUgY2xvc2UgcXVvdGUuCi1EQVRFX1RJTUVfSkRCQ19FU0NBUEVfRk9STUFUX01JU1NJTkdfT1BFTl9RVU9URSA9IFRoZSBKREJDIGVzY2FwZSBmb3JtYXQgaXMgbWlzc2luZyB0aGUgb3BlbiBxdW90ZS4KLURBVEVfVElNRV9KREJDX0VTQ0FQRV9GT1JNQVRfTUlTU0lOR19SSUdIVF9DVVJMWV9CUkFDRSA9IFRoZSBKREJDIGVzY2FwZSBmb3JtYXQgaXMgbWlzc2luZyB0aGUgcmlnaHQgY3VybHkgYnJhY2UuCi0KLSMgRGVsZXRlQ2xhdXNlIC0gR3JhbW1hcgotREVMRVRFX0NMQVVTRV9GUk9NX01JU1NJTkcgPSBUaGUgaWRlbnRpZmllciBGUk9NIGlzIG1pc3NpbmcgZnJvbSB0aGUgREVMRVRFIEZST00gY2xhdXNlLgotREVMRVRFX0NMQVVTRV9NVUxUSVBMRV9SQU5HRV9WQVJJQUJMRV9ERUNMQVJBVElPTiA9IE9ubHkgb25lIGVudGl0eSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBjYW4gYmUgZGVmaW5lZC4KLURFTEVURV9DTEFVU0VfUkFOR0VfVkFSSUFCTEVfREVDTEFSQVRJT05fTUFMRk9STUVEID0gVGhlIGVudGl0eSBhYnN0cmFjdCBzY2hlbWEgdHlwZSBkZWNsYXJhdGlvbiBpcyBtYWxmb3JtZWQuCi1ERUxFVEVfQ0xBVVNFX1JBTkdFX1ZBUklBQkxFX0RFQ0xBUkFUSU9OX01JU1NJTkcgPSBBIERFTEVURSBjbGF1c2UgbXVzdCBkZWZpbmUgYW4gZW50aXR5IGFic3RyYWN0IHNjaGVtYSB0eXBlLgotCi0jIERpdmlzaW9uRXhwcmVzc2lvbiAtIFNlbWFudGljCi1ESVZJU0lPTl9FWFBSRVNTSU9OX0xFRlRfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIGxlZnQgc2lkZSBvZiB0aGUgZGl2aXNpb24gaXMgbm90IGEgdmFsaWQgYXJpdGhtZXRpYyBleHByZXNzaW9uLgotRElWSVNJT05fRVhQUkVTU0lPTl9SSUdIVF9FWFBSRVNTSU9OX1dST05HX1RZUEUgPSBUaGUgcmlnaHQgc2lkZSBvZiB0aGUgZGl2aXNpb24gaXMgbm90IGEgdmFsaWQgYXJpdGhtZXRpYyBleHByZXNzaW9uLgotCi0jIEVuY2Fwc3VsYXRlZElkZW50aWZpY2F0aW9uVmFyaWFibGVFeHByZXNzaW9uIC0gU2VtYW50aWMKLUVOQ0FQU1VMQVRFRF9JREVOVElGSUNBVElPTl9WQVJJQUJMRV9FWFBSRVNTSU9OX05PVF9NQVBfVkFMVUVEID0gVGhlIHswfSBvcGVyYXRvciBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlcyB0aGF0IGNvcnJlc3BvbmQgdG8gbWFwLXZhbHVlZCBhc3NvY2lhdGlvbnMgb3IgbWFwLXZhbHVlZCBlbGVtZW50IGNvbGxlY3Rpb25zLgotCi0jIEVtcHR5Q29sbGVjdGlvbkNvbXBhcmlzb25FeHByZXNzaW9uIC0gR3JhbW1hcgotRU1QVFlfQ09MTEVDVElPTl9DT01QQVJJU09OX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIGNvbGxlY3Rpb24gdmFsdWVkIHBhdGggZXhwcmVzc2lvbiBtdXN0IGJlIGRlZmluZWQuCi0KLSMgRW50aXR5VHlwZUxpdGVyYWwgLSBTZW1hbnRpYwotRU5USVRZX1RZUEVfTElURVJBTF9OT1RfUkVTT0xWQUJMRSA9ICcnezB9JycgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdHlwZS4KLQotIyBFbnRyeUV4cHJlc3Npb24gLSBHcmFtbWFyCi1FTlRSWV9FWFBSRVNTSU9OX0lOVkFMSURfRVhQUkVTU0lPTiA9IFRoZSBlbmNhcHN1bGF0ZWQgZXhwcmVzc2lvbiBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotRU5UUllfRVhQUkVTU0lPTl9JTlZBTElEX0pQQV9WRVJTSU9OID0gQW4gRU5UUlkgZXhwcmVzc2lvbiBjYW5ub3QgYmUgdXNlZCBpbiBhIEpQUUwgcXVlcnkgd2hlbiB0aGUgSlBBIHBsYXRmb3JtIGlzIDEuMC4KLUVOVFJZX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gQW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgbXVzdCBiZSBwcm92aWRlZCBmb3IgYW4gRU5UUlkgZXhwcmVzc2lvbi4KLUVOVFJZX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBFTlRSWSBleHByZXNzaW9uLgotRU5UUllfRVhQUkVTU0lPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgRU5UUlkgZXhwcmVzc2lvbi4KLQotIyBFeGlzdHNFeHByZXNzaW9uIC0gR3JhbW1hcgotRVhJU1RTX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1FWElTVFNfRVhQUkVTU0lPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBBIHN1YnF1ZXJ5IG11c3QgYmUgcHJvdmlkZWQgZm9yIGFuIEVYSVNUUyBleHByZXNzaW9uLgotRVhJU1RTX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBFWElTVFMgZXhwcmVzc2lvbi4KLUVYSVNUU19FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBFWElTVFMgZXhwcmVzc2lvbi4KLQotIyBGdW5jRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUZVTkNfRVhQUkVTU0lPTl9NSVNTSU5HX0ZVTkNUSU9OX05BTUUgPSBUaGUgU1FMIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQuCi1GVU5DX0VYUFJFU1NJT05fSU5WQUxJRF9KUEFfUExBVEZPUk0gPSBBIEZVTkMgZXhwcmVzc2lvbiBjYW4gb25seSBiZSB1c2VkIHdoZW4gdGhlIHBsYXRmb3JtIGlzIEVjbGlwc2VMaW5rLgotRlVOQ19FWFBSRVNTSU9OX01JU1NJTkdfTEVGVF9QQVJFTlRIRVNJUyA9IFRoZSBsZWZ0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgRlVOQyBleHByZXNzaW9uLgotRlVOQ19FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBGVU5DIGV4cHJlc3Npb24uCi0KLSMgR3JvdXBCeUNsYXVzZSAtIEdyYW1tYXIKLUdST1VQX0JZX0NMQVVTRV9HUk9VUF9CWV9JVEVNX0VORFNfV0lUSF9DT01NQSA9IFRoZSBzZWxlY3QgZXhwcmVzc2lvbiBjYW5ub3QgZW5kIHdpdGggYSBjb21tYS4KLUdST1VQX0JZX0NMQVVTRV9HUk9VUF9CWV9JVEVNX0lTX01JU1NJTkdfQ09NTUEgPSBUaGUgR1JPVVAgQlkgY2xhdXNlIGhhcyAnJ3swfScnIGFuZCAnJ3sxfScnIHRoYXQgYXJlIG5vdCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KLUdST1VQX0JZX0NMQVVTRV9HUk9VUF9CWV9JVEVNX01JU1NJTkcgPSBUaGUgZ3JvdXBpbmcgaXRlbSBpcyBtaXNzaW5nIGZyb20gdGhlIEdST1VQIEJZIGNsYXVzZS4KLQotIyBIYXZpbmdDbGF1c2UgLSBHcmFtbWFyCi1IQVZJTkdfQ0xBVVNFX0lOVkFMSURfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IFRoZSBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi1IQVZJTkdfQ0xBVVNFX01JU1NJTkdfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IFRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgSEFWSU5HIGNsYXVzZS4KLQotIyBJZGVudGlmaWNhdGlvblZhcmlhYmxlIC0gR3JhbW1hcgotSURFTlRJRklDQVRJT05fVkFSSUFCTEVfSU5WQUxJRF9EVVBMSUNBVEUgPSBUaGUgaWRlbnRpZmljYXRpb24gdmFyaWFibGUgJyd7MH0nJyBjYW5ub3QgYmUgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuCi1JREVOVElGSUNBVElPTl9WQVJJQUJMRV9JTlZBTElEX0pBVkFfSURFTlRJRklFUiA9IFRoZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSAnJ3swfScnIGlzIG5vdCBmb2xsb3dpbmcgdGhlIHJ1bGVzIGZvciBhIEphdmEgaWRlbnRpZmllci4KLUlERU5USUZJQ0FUSU9OX1ZBUklBQkxFX0lOVkFMSURfUkVTRVJWRURfV09SRCA9IFRoZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSAnJ3swfScnIGNhbm5vdCBiZSBhIHJlc2VydmVkIHdvcmQuCi0jIElkZW50aWZpY2F0aW9uVmFyaWFibGUgLSBTZW1hbnRpYwotSURFTlRJRklDQVRJT05fVkFSSUFCTEVfRU5USVRZX05BTUUgPSBBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBtdXN0IG5vdCBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYW55IGVudGl0eSBpbiB0aGUgc2FtZSBwZXJzaXN0ZW5jZSB1bml0LgotSURFTlRJRklDQVRJT05fVkFSSUFCTEVfSU5WQUxJRF9OT1RfREVDTEFSRUQgPSBUaGUgaWRlbnRpZmljYXRpb24gdmFyaWFibGUgJyd7MH0nJyBpcyBub3QgZGVmaW5lZCBpbiB0aGUgRlJPTSBjbGF1c2UuCi0KLSMgSWRlbnRpZmljYXRpb25WYXJpYWJsZURlY2xhcmF0aW9uIC0gR3JhbW1hcgotSURFTlRJRklDQVRJT05fVkFSSUFCTEVfREVDTEFSQVRJT05fTUlTU0lOR19SQU5HRV9WQVJJQUJMRV9ERUNMQVJBVElPTiA9IFRoZSByYW5nZSB2YXJpYWJsZSBkZWNsYXJhdGlvbiBtdXN0IGJlIHNwZWNpZmllZC4KLQotIyBJbmRleEV4cHJlc3Npb24gLSBHcmFtbWFyCi1JTkRFWF9FWFBSRVNTSU9OX0lOVkFMSURfRVhQUkVTU0lPTiA9IFRoZSBlbmNhcHN1bGF0ZWQgZXhwcmVzc2lvbiBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotSU5ERVhfRVhQUkVTU0lPTl9JTlZBTElEX0pQQV9WRVJTSU9OID0gQW4gSU5ERVggZXhwcmVzc2lvbiBjYW5ub3QgYmUgdXNlZCBpbiBhIEpQUUwgcXVlcnkgd2hlbiB0aGUgSlBBIHBsYXRmb3JtIGlzIDEuMC4KLUlOREVYX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gQW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgbXVzdCBiZSBwcm92aWRlZCBmb3IgYW4gSU5ERVggZXhwcmVzc2lvbi4KLUlOREVYX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBJTkRFWCBleHByZXNzaW9uLgotSU5ERVhfRVhQUkVTU0lPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgSU5ERVggZXhwcmVzc2lvbi4KLSMgSW5kZXhFeHByZXNzaW9uIC0gU2VtYW50aWMKLUlOREVYX0VYUFJFU1NJT05fV1JPTkdfVkFSSUFCTEUgPSBUaGUgaWRlbnRpZmljYXRpb24gdmFyaWFibGUgJyd7MH0nJyBkb2VzIG5vdCByZXByZXNlbnQgYW4gYXNzb2NpYXRpb24gb3IgZWxlbWVudCBjb2xsZWN0aW9uLgotCi0jIEluRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUlOX0VYUFJFU1NJT05fSU5fSVRFTV9FTkRTX1dJVEhfQ09NTUEgPSBUaGUgaXRlbXMgY2Fubm90IGVuZCB3aXRoIGEgY29tbWEuCi1JTl9FWFBSRVNTSU9OX0lOX0lURU1fSVNfTUlTU0lOR19DT01NQSA9IFRoZSBJTiBleHByZXNzaW9uIGhhcyAnJ3swfScnIGFuZCAnJ3sxfScnIHRoYXQgYXJlIG5vdCBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KLUlOX0VYUFJFU1NJT05fTUFMRk9STUVEX0VYUFJFU1NJT04gPSBUaGUgSU4gZXhwcmVzc2lvbiBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgc3RhdGUgZmllbGQgcGF0aCBleHByZXNzaW9uIG9yIFRZUEUgZXhwZXNzaW9uLgotSU5fRVhQUkVTU0lPTl9NSVNTSU5HX0lOX0lURU1TID0gQSBsZWFzdCBvbmUgaXRlbSBtdXN0IGJlIGRlZmluZWQgZm9yIHRoZSBJTiBleHByZXNzaW9uLgotSU5fRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIElOIGV4cHJlc3Npb24uCi1JTl9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBJTiBleHByZXNzaW9uLgotSU5fRVhQUkVTU0lPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBBIHN0YXRlIGZpZWxkIHBhdGggZXhwcmVzc2lvbiBvciBUWVBFIGV4cHJlc3Npb24gbXVzdCBiZSBkZWZpbmVkLgotCi0jIElucHV0UGFyYW1ldGVyIC0gR3JhbW1hcgotSU5QVVRfUEFSQU1FVEVSX0pBVkFfSURFTlRJRklFUiA9IFRoZSBuYW1lZCBpbnB1dCBwYXJhbWV0ZXIgJyd7MH0nJyBpcyBub3QgZm9sbG93aW5nIHRoZSBydWxlcyBmb3IgYSBKYXZhIGlkZW50aWZpZXIuCi1JTlBVVF9QQVJBTUVURVJfTUlTU0lOR19QQVJBTUVURVIgPSBUaGUgcGFyYW1ldGVyIHZhbHVlIGlzIG1pc3NpbmcgZnJvbSB0aGUgaW5wdXQgcGFyYW1ldGVyLgotSU5QVVRfUEFSQU1FVEVSX01JWFRVUkUgPSBOYW1lZCBhbmQgcG9zaXRpb25hbCBpbnB1dCBwYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG1peGVkIGluIGEgc2luZ2xlIHF1ZXJ5LgotSU5QVVRfUEFSQU1FVEVSX05PVF9JTlRFR0VSID0gVGhlIHBvc2l0aW9uYWwgaW5wdXQgcGFyYW1ldGVyICcnezB9JycgY2Fubm90IHVzZSBub24tSW50ZWdlciBjaGFyYWN0ZXJzLgotSU5QVVRfUEFSQU1FVEVSX1NNQUxMRVJfVEhBTl9PTkUgPSBUaGUgbnVtYmVyIHVzZWQgZm9yIHRoZSBwb3NpdGlvbmFsIGlucHV0IHBhcmFtZXRlciAnJ3swfScnIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAuCi1JTlBVVF9QQVJBTUVURVJfV1JPTkdfQ0xBVVNFX0RFQ0xBUkFUSU9OID0gSW5wdXQgcGFyYW1ldGVycyBjYW4gb25seSBiZSB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2Ugb3IgSEFWSU5HIGNsYXVzZSBvZiBhIHF1ZXJ5LgotCi0jIEpvaW4gLSBHcmFtbWFyCi1KT0lOX01JU1NJTkdfSURFTlRJRklDQVRJT05fVkFSSUFCTEUgPSBBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBtdXN0IGJlIGRlZmluZWQgZm9yIGEgSk9JTiBleHByZXNzaW9uLgotSk9JTl9NSVNTSU5HX0pPSU5fQVNTT0NJQVRJT05fUEFUSCA9IFRoZSBqb2luIGFzc29jaWF0aW9uIHBhdGggaXMgbWlzc2luZyBmcm9tIHRoZSBKT0lOIGV4cHJlc3Npb24uCi0KLSMgSm9pbkZldGNoIC0gR3JhbW1hcgotSk9JTl9GRVRDSF9NSVNTSU5HX0pPSU5fQVNTT0NJQVRJT05fUEFUSCA9IFRoZSBqb2luIGFzc29jaWF0aW9uIHBhdGggaXMgbWlzc2luZyBmcm9tIHRoZSBKT0lOIEZFVENIIGV4cHJlc3Npb24uCi1KT0lOX0ZFVENIX1dST05HX0NMQVVTRV9ERUNMQVJBVElPTiA9IEpPSU4gRkVUQ0ggZXhwcmVzc2lvbnMgY2Fubm90IGJlIHVzZWQgaW4gYSBGUk9NIGNsYXVzZSBvZiBhIHN1YnF1ZXJ5LgotCi0jIEpQUUxFeHByZXNzaW9uIC0gR3JhbW1hcgotSlBRTF9FWFBSRVNTSU9OX0lOVkFMSURfUVVFUlkgPSBUaGUgcXVlcnkgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHZhbGlkIGlkZW50aWZpZXIsIGhhcyB0byBiZSBlaXRoZXIgU0VMRUNULCBVUERBVEUgb3IgREVMRVRFIEZST00uCi1KUFFMX0VYUFJFU1NJT05fVU5LTk9XTl9FTkRJTkcgPSBUaGUgcXVlcnkgY29udGFpbnMgYSBtYWxmb3JtZWQgZW5kaW5nLgotCi0jIEtleUV4cHJlc3Npb24gLSBHcmFtbWFyCi1LRVlfRVhQUkVTU0lPTl9JTlZBTElEX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLUtFWV9FWFBSRVNTSU9OX0lOVkFMSURfSlBBX1ZFUlNJT04gPSBBIEtFWSBleHByZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGluIGEgSlBRTCBxdWVyeSB3aGVuIHRoZSBKUEEgcGxhdGZvcm0gaXMgMS4wLgotS0VZX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIG11c3QgYmUgcHJvdmlkZWQgZm9yIGFuIEFCUyBleHByZXNzaW9uLgotS0VZX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBBQlMgZXhwcmVzc2lvbi4KLUtFWV9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBBQlMgZXhwcmVzc2lvbi4KLQotIyBMZW5ndGhFeHByZXNzaW9uIC0gR3JhbW1hcgotTEVOR1RIX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1MRU5HVEhfRVhQUkVTU0lPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBBbiBleHByZXNzaW9uIG11c3QgYmUgcHJvdmlkZWQgZm9yIGEgTEVOR1RIIGV4cHJlc3Npb24uCi1MRU5HVEhfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIExFTkdUSCBleHByZXNzaW9uLgotTEVOR1RIX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIExFTkdUSCBleHByZXNzaW9uLgotIyBMaWtlRXhwcmVzc2lvbiAtIFNlbWFudGljCi1MRU5HVEhfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBvZiBzdHJpbmcgdHlwZS4KLQotIyBMaWtlRXhwcmVzc2lvbiAtIEdyYW1tYXIKLUxJS0VfRVhQUkVTU0lPTl9JTlZBTElEX0VTQ0FQRV9DSEFSQUNURVIgPSB7MH0gaXMgbm90IGEgdmFsaWQgZXNjYXBlIGNoYXJhY3Rlci4KLUxJS0VfRVhQUkVTU0lPTl9NSVNTSU5HX0VTQ0FQRV9DSEFSQUNURVIgPSBUaGUgZXNjYXBlIGNoYXJhY3RlciBpcyBtaXNzaW5nIGZyb20gdGhlIExJS0UgZXhwcmVzc2lvbi4KLUxJS0VfRVhQUkVTU0lPTl9NSVNTSU5HX1BBVFRFUk5fVkFMVUUgPSBUaGUgcGF0dGVybiB2YWx1ZSBpcyBtaXNzaW5nIGZyb20gdGhlIExJS0UgZXhwcmVzc2lvbi4KLUxJS0VfRVhQUkVTU0lPTl9NSVNTSU5HX1NUUklOR19FWFBSRVNTSU9OID0gVGhlIHN0cmluZyBleHByZXNzaW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgTElLRSBleHByZXNzaW9uLgotCi0jIExvY2F0ZUV4cHJlc3Npb24gLSBHcmFtbWFyCi1MT0NBVEVfRVhQUkVTU0lPTl9JTlZBTElEX0ZJUlNUX0VYUFJFU1NJT04gPSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLUxPQ0FURV9FWFBSRVNTSU9OX0lOVkFMSURfU0VDT05EX0VYUFJFU1NJT04gPSBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1MT0NBVEVfRVhQUkVTU0lPTl9JTlZBTElEX1RISVJEX0VYUFJFU1NJT04gPSBUaGUgdGhpcmQgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLUxPQ0FURV9FWFBSRVNTSU9OX01JU1NJTkdfRklSU1RfRVhQUkVTU0lPTiA9IFRoZSBmaXJzdCBhcmd1bWVudCBpcyBtaXNzaW5nIGZyb20gdGhlIExPQ0FURSBleHByZXNzaW9uLgotTE9DQVRFX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBMT0NBVEUgZXhwcmVzc2lvbi4KLUxPQ0FURV9FWFBSRVNTSU9OX01JU1NJTkdfRklSU1RfQ09NTUEgPSBUaGUgZmlyc3QgY29tbWEgaXMgbWlzc2luZyBmcm9tIHRoZSBMT0NBVEUgZXhwcmVzc2lvbi4KLUxPQ0FURV9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBMT0NBVEUgZXhwcmVzc2lvbi4KLUxPQ0FURV9FWFBSRVNTSU9OX01JU1NJTkdfU0VDT05EX0NPTU1BID0gVGhlIHNlY29uZCBjb21tYSBpcyBtaXNzaW5nIGZyb20gdGhlIExPQ0FURSBleHByZXNzaW9uLgotTE9DQVRFX0VYUFJFU1NJT05fTUlTU0lOR19TRUNPTkRfRVhQUkVTU0lPTiA9IFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbWlzc2luZyBmcm9tIHRoZSBMT0NBVEUgZXhwcmVzc2lvbi4KLUxPQ0FURV9FWFBSRVNTSU9OX01JU1NJTkdfVEhJUkRfRVhQUkVTU0lPTiA9IFRoZSB0aGlyZCBhcmd1bWVudCBpcyBtaXNzaW5nIGZyb20gdGhlIExPQ0FURSBleHByZXNzaW9uLgotIyBMb2NhdGVFeHByZXNzaW9uIC0gU2VtYW50aWMKLUxPQ0FURV9FWFBSRVNTSU9OX0ZJUlNUX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBmaXJzdCBleHByZXNzaW9uIGlzIG5vdCBvZiBzdHJpbmcgdHlwZS4KLUxPQ0FURV9FWFBSRVNTSU9OX1NFQ09ORF9FWFBSRVNTSU9OX1dST05HX1RZUEUgPSBUaGUgc2Vjb25kIGV4cHJlc3Npb24gaXMgbm90IG9mIHN0cmluZyB0eXBlLgotTE9DQVRFX0VYUFJFU1NJT05fVEhJUkRfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIHRoaXJkIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBvZiBudW1lcmljIHR5cGUuCi0KLSMgTG9naWNhbEV4cHJlc3Npb24gLSBHcmFtbWFyCi1MT0dJQ0FMX0VYUFJFU1NJT05fSU5WQUxJRF9MRUZUX0VYUFJFU1NJT04gPSBUaGUgbGVmdCBleHByZXNzaW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgbG9naWNhbCBleHByZXNzaW9uLgotTE9HSUNBTF9FWFBSRVNTSU9OX0lOVkFMSURfUklHSFRfRVhQUkVTU0lPTiA9IFRoZSByaWdodCBleHByZXNzaW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgbG9naWNhbCBleHByZXNzaW9uLgotTE9HSUNBTF9FWFBSRVNTSU9OX01JU1NJTkdfTEVGVF9FWFBSRVNTSU9OID0gVGhlIGxlZnQgZXhwcmVzc2lvbiBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotTE9HSUNBTF9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfRVhQUkVTU0lPTiA9IFRoZSByaWdodCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi0KLSMgTG93ZXJFeHByZXNzaW9uIC0gR3JhbW1hcgotTE9XRVJfRVhQUkVTU0lPTl9JTlZBTElEX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLUxPV0VSX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gQW4gZXhwcmVzc2lvbiBtdXN0IGJlIHByb3ZpZGVkIGZvciBhIExPV0VSIGV4cHJlc3Npb24uCi1MT1dFUl9FWFBSRVNTSU9OX01JU1NJTkdfTEVGVF9QQVJFTlRIRVNJUyA9IFRoZSBsZWZ0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgTE9XRVIgZXhwcmVzc2lvbi4KLUxPV0VSX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIExPV0VSIGV4cHJlc3Npb24uCi0jIFVwcGVyRXhwcmVzc2lvbiAtIFNlbWFudGljCi1MT1dFUl9FWFBSRVNTSU9OX1dST05HX1RZUEUgPSBUaGUgZXhwcmVzc2lvbiBpcyBub3QgYSBTdHJpbmcuCi0KLSMgTWF4RnVuY3Rpb24gLSBHcmFtbWFyCi1NQVhfRlVOQ1RJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1NQVhfRlVOQ1RJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIG11c3QgYmUgcHJvdmlkZWQgZm9yIGEgTUFYIGV4cHJlc3Npb24uCi1NQVhfRlVOQ1RJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBNQVggZXhwcmVzc2lvbi4KLU1BWF9GVU5DVElPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgTUFYIGV4cHJlc3Npb24uCi0KLSMgTWluRnVuY3Rpb24gLSBHcmFtbWFyCi1NSU5fRlVOQ1RJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1NSU5fRlVOQ1RJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIG11c3QgYmUgcHJvdmlkZWQgZm9yIGEgTUlOIGV4cHJlc3Npb24uCi1NSU5fRlVOQ1RJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBNSU4gZXhwcmVzc2lvbi4KLU1JTl9GVU5DVElPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgTUlOIGV4cHJlc3Npb24uCi0KLSMgTW9kRXhwcmVzc2lvbiAtIEdyYW1tYXIKLU1PRF9FWFBSRVNTSU9OX0lOVkFMSURfRklSU1RfRVhQUkVTU0lPTiA9IFRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotTU9EX0VYUFJFU1NJT05fSU5WQUxJRF9TRUNPTkRfUEFSRU5USEVTSVMgPSBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1NT0RfRVhQUkVTU0lPTl9NSVNTSU5HX0NPTU1BID0gVGhlIGNvbW1hIGlzIG1pc3NpbmcgZnJvbSB0aGUgTU9EIGV4cHJlc3Npb24uCi1NT0RfRVhQUkVTU0lPTl9NSVNTSU5HX0ZJUlNUX0VYUFJFU1NJT04gPSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgbWlzc2luZyBmcm9tIHRoZSBNT0QgZXhwcmVzc2lvbi4KLU1PRF9FWFBSRVNTSU9OX01JU1NJTkdfTEVGVF9QQVJFTlRIRVNJUyA9IFRoZSBsZWZ0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgTU9EIGV4cHJlc3Npb24uCi1NT0RfRVhQUkVTU0lPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgTU9EIGV4cHJlc3Npb24uCi1NT0RfRVhQUkVTU0lPTl9NSVNTSU5HX1NFQ09ORF9FWFBSRVNTSU9OID0gVGhlIHNlY29uZCBhcmd1bWVudCBpcyBtaXNzaW5nIGZyb20gdGhlIE1PRCBleHByZXNzaW9uLgotIyBNb2RFeHByZXNzaW9uIC0gU2VtYW50aWMKLU1PRF9FWFBSRVNTSU9OX0ZJUlNUX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBmaXJzdCBleHByZXNzaW9uIGlzIG5vdCBhbiBJbnRlZ2VyLgotTU9EX0VYUFJFU1NJT05fU0VDT05EX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBzZWNvbmQgZXhwcmVzc2lvbiBpcyBub3QgYW4gSW50ZWdlci4KLQotIyBNdWx0aXBsaWNhdGlvbkV4cHJlc3Npb24gLSBTZW1hbnRpYwotTVVMVElQTElDQVRJT05fRVhQUkVTU0lPTl9MRUZUX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBsZWZ0IHNpZGUgb2YgdGhlIG11bHRpcGxpY2F0aW9uIGlzIG5vdCBhIHZhbGlkIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4KLU1VTFRJUExJQ0FUSU9OX0VYUFJFU1NJT05fUklHSFRfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIHJpZ2h0IHNpZGUgb2YgdGhlIG11bHRpcGxpY2F0aW9uIGlzIG5vdCBhIHZhbGlkIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4KLQotIyBOb3RFeHByZXNzaW9uIC0gR3JhbW1hcgotTk9UX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIGV4cHJlc3Npb24gaXMgbWlzc2luZyBhZnRlciB0aGUgaWRlbnRpZmllciBOT1QuCi0jIE5vdEV4cHJlc3Npb24gLSBTZW1hbnRpYwotTk9UX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBleHByZXNzaW9uIGlzIG5vdCBvZiBib29sZWFuIHR5cGUuCi0KLSMgTnVsbENvbXBhcmlzb25FeHByZXNzaW9uIC0gR3JhbW1hcgotTlVMTF9DT01QQVJJU09OX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gVGhlIGV4cHJlc3Npb24gaXMgbWlzc2luZyBmcm9tIHRoZSBudWxsIGNvbXBhcmlzb24gZXhwcmVzc2lvbi4KLSMgTnVsbENvbXBhcmlzb25FeHByZXNzaW9uIC0gU2VtYW50aWMKLU5VTExfQ09NUEFSSVNPTl9FWFBSRVNTSU9OX0lOVkFMSURfVFlQRSA9ICcnezB9JycgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGVtYmVkZGFibGUuCi0KLSMgTnVsbElmRXhwcmVzc2lvbiAtIEdyYW1tYXIKLU5VTExJRl9FWFBSRVNTSU9OX0lOVkFMSURfRklSU1RfRVhQUkVTU0lPTiA9IFRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotTlVMTElGX0VYUFJFU1NJT05fSU5WQUxJRF9KUEFfVkVSU0lPTiA9IEEgTlVMTElGIGV4cHJlc3Npb24gY2Fubm90IGJlIHVzZWQgaW4gYSBKUFFMIHF1ZXJ5IHdoZW4gdGhlIEpQQSBwbGF0Zm9ybSBpcyAxLjAuCi1OVUxMSUZfRVhQUkVTU0lPTl9JTlZBTElEX1NFQ09ORF9FWFBSRVNTSU9OID0gVGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotTlVMTElGX0VYUFJFU1NJT05fTUlTU0lOR19DT01NQSA9IFRoZSBjb21tYSBpcyBtaXNzaW5nIGZyb20gdGhlIE5VTExJRiBleHByZXNzaW9uLgotTlVMTElGX0VYUFJFU1NJT05fTUlTU0lOR19GSVJTVF9FWFBSRVNTSU9OID0gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgTlVMTElGIGV4cHJlc3Npb24uCi1OVUxMSUZfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIE5VTExJRiBleHByZXNzaW9uLgotTlVMTElGX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIE5VTExJRiBleHByZXNzaW9uLgotTlVMTElGX0VYUFJFU1NJT05fTUlTU0lOR19TRUNPTkRfRVhQUkVTU0lPTiA9IFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbWlzc2luZyBmcm9tIHRoZSBOVUxMSUYgZXhwcmVzc2lvbi4KLQotIyBOdW1lcmljTGl0ZXJhbCAtIEdyYW1tYXIKLU5VTUVSSUNfTElURVJBTF9JTlZBTElEID0gJyd7MH0nJyBpcyBub3QgYSB2YWxpZCBudW1lcmljIHZhbHVlLgotCi0jIE9iamVjdEJ5SXRlbSAtIEdyYW1tYXIKLU9SREVSX0JZX0lURU1fSU5WQUxJRF9QQVRIID0gJyd7MH0nJyBpcyBub3QgYSB2YWxpZCBzdGF0ZSBmaWVsZCBwYXRoIGV4cHJlc3Npb24uCi1PUkRFUl9CWV9JVEVNX01JU1NJTkdfU1RBVEVfRklFTERfUEFUSF9FWFBSRVNTSU9OID0gQSBzdGF0ZSBmaWVsZCBwYXRoIGV4cHJlc3Npb24gbXVzdCBiZSBzcGVjaWZpZWQuCi0KLSMgT2JqZWN0RXhwcmVzc2lvbiAtIEdyYW1tYXIKLU9CSkVDVF9FWFBSRVNTSU9OX0lOVkFMSURfRVhQUkVTU0lPTiA9IFRoZSBlbmNhcHN1bGF0ZWQgZXhwcmVzc2lvbiBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotT0JKRUNUX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gQW4gaWRlbnRpZmljYXRpb24gdmFyaWFibGUgbXVzdCBiZSBwcm92aWRlZCBmb3IgYW4gT0JKRUNUIGV4cHJlc3Npb24uCi1PQkpFQ1RfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIE9CSkVDVCBleHByZXNzaW9uLgotT0JKRUNUX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIE9CSkVDVCBleHByZXNzaW9uLgotCi0jIE9yZGVyQnlDbGF1c2UgLSBHcmFtbWFyCi1PUkRFUl9CWV9DTEFVU0VfT1JERVJfQllfSVRFTV9FTkRTX1dJVEhfQ09NTUEgPSBUaGUgc2VsZWN0IGV4cHJlc3Npb24gY2Fubm90IGVuZCB3aXRoIGEgY29tbWEuCi1PUkRFUl9CWV9DTEFVU0VfT1JERVJfQllfSVRFTV9JU19NSVNTSU5HX0NPTU1BID0gVGhlIE9SREVSIEJZIGNsYXVzZSBoYXMgJyd7MH0nJyBhbmQgJyd7MX0nJyB0aGF0IGFyZSBub3Qgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCi1PUkRFUl9CWV9DTEFVU0VfT1JERVJfQllfSVRFTV9NSVNTSU5HID0gVGhlIG9yZGVyaW5nIGl0ZW0gaXMgbWlzc2luZyBmcm9tIHRoZSBPUkRFUiBCWSBjbGF1c2UuCi0KLSMgUmFuZ2VWYXJpYWJsZURlY2xhcmF0aW9uIC0gR3JhbW1hcgotUkFOR0VfVkFSSUFCTEVfREVDTEFSQVRJT05fTUlTU0lOR19BQlNUUkFDVF9TQ0hFTUFfTkFNRSA9IEFuIGFic3RyYWN0IHNjaGVtYSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotUkFOR0VfVkFSSUFCTEVfREVDTEFSQVRJT05fTUlTU0lOR19JREVOVElGSUNBVElPTl9WQVJJQUJMRSA9IEFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIG11c3QgYmUgcHJvdmlkZXIgZm9yIGEgcmFuZ2UgdmFyaWFibGUgZGVjbGFyYXRpb24uCi0KLSMgUmVzdWx0VmFyaWFibGUgLSBHcmFtbWFyCi1SRVNVTFRfVkFSSUFCTEVfSU5WQUxJRF9KUEFfVkVSU0lPTiA9IEEgcmVzdWx0IHZhcmlhYmxlIGNhbm5vdCBiZSB1c2VkIGluIGEgSlBRTCBxdWVyeSB3aGVuIHRoZSBKUEEgcGxhdGZvcm0gaXMgMS4wLgotUkVTVUxUX1ZBUklBQkxFX01JU1NJTkdfU0VMRUNUX0VYUFJFU1NJT04gPSBUaGUgc2VsZWN0IGl0ZW0gaXMgbWlzc2luZyBmcm9tIHRoZSByZXN1bHQgdmFyaWFibGUgZGVjbGFyYXRpb24uCi1SRVNVTFRfVkFSSUFCTEVfTUlTU0lOR19SRVNVTFRfVkFSSUFCTEUgPSBUaGUgcmVzdWx0IHZhcmlhYmxlIGlzIG1pc3NpbmcgZnJvbSB0aGUgc2VsZWN0IGl0ZW0gZGVjbGFyYXRpb24uCi0KLSMgU2VsZWN0U3RhdGVtZW50IC0gU2VtYW50aWMKLVNFTEVDVF9TVEFURU1FTlRfU0VMRUNUX0NMQVVTRV9IQVNfTk9OX0FHR1JFR0FURV9GVU5DVElPTlMgPSBUaGUgc2VsZWN0IGxpc3QgY2FuIG9ubHkgY29uc2lzdCBvZiBhZ2dyZWdhdGUgZnVuY3Rpb25zIGJlY2F1c2UgdGhlcmUgaXMgbm8gR1JPVVAgQlkgY2xhdXNlIGFuZCB0aGUgSEFWSU5HIGNsYXVzZSBpcyB1c2VkLgotCi0jIFNpbXBsZVNlbGVjdENsYXVzZSAtIEdyYW1tYXIKLVNJTVBMRV9TRUxFQ1RfQ0xBVVNFX05PVF9TSU5HTEVfRVhQUkVTU0lPTiA9IE9ubHkgb25lIGV4cHJlc3Npb24gY2FuIGJlIGRlY2xhcmVkIGluIGEgU0VMRUNUIGNsYXVzZSBvZiBhIHN1YnF1ZXJ5LgotCi0jIFNpbXBsZVNlbGVjdFN0YXRlbWVudCAtIEdyYW1tYXIKLVNJTVBMRV9TRUxFQ1RfU1RBVEVNRU5UX0lOVkFMSURfTE9DQVRJT04gPSBBIHN1YnF1ZXJ5IGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIFdIRVJFIG9yIEhBVklORyBjbGF1c2UuCi0KLSMgU2l6ZUV4cHJlc3Npb24gLSBHcmFtbWFyCi1TSVpFX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1TSVpFX0VYUFJFU1NJT05fTUlTU0lOR19FWFBSRVNTSU9OID0gQSBjb2xsZWN0aW9uLXZhbHVlZCBwYXRoIGV4cHJlc3Npb24gbXVzdCBiZSBwcm92aWRlZCBmb3IgYSBTSVpFIGV4cHJlc3Npb24uCi1TSVpFX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIFNJWkUgZXhwcmVzc2lvbi4KLVNJWkVfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIFNJWkUgZXhwcmVzc2lvbi4KLQotIyBTcXJ0RXhwcmVzc2lvbiAtIEdyYW1tYXIKLVNRUlRfRVhQUkVTU0lPTl9JTlZBTElEX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLVNRUlRfRVhQUkVTU0lPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBBbiBleHByZXNzaW9uIG11c3QgYmUgcHJvdmlkZWQgZm9yIGEgU1FSVCBleHByZXNzaW9uLgotU1FSVF9FWFBSRVNTSU9OX01JU1NJTkdfTEVGVF9QQVJFTlRIRVNJUyA9IFRoZSBsZWZ0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgU1FSVCBleHByZXNzaW9uLgotU1FSVF9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBTUVJUIGV4cHJlc3Npb24uCi0jIFNxcnRFeHByZXNzaW9uIC0gU2VtYW50aWMKLVNRUlRfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIGV4cHJlc3Npb24gaXMgbm90IGEgbnVtZXJpYyB0eXBlLgotCi0jIFN0YXRlRmllbGRQYXRoRXhwcmVzc2lvbiAtIFNlbWFudGljCi1TVEFURV9GSUVMRF9QQVRIX0VYUFJFU1NJT05fQVNTT0NJQVRJT05fRklFTEQgPSBUaGUgYXNzb2NpYXRpb24gZmllbGQgJyd7MH0nJyBjYW5ub3QgYmUgdXNlZCBhcyBhIHN0YXRlIGZpZWxkIHBhdGguCi1TVEFURV9GSUVMRF9QQVRIX0VYUFJFU1NJT05fQ09MTEVDVElPTl9UWVBFID0gVGhlIHN0YXRlIGZpZWxkIHBhdGggJyd7MH0nJyBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSBjb2xsZWN0aW9uIHR5cGUuCi1TVEFURV9GSUVMRF9QQVRIX0VYUFJFU1NJT05fSU5WQUxJRF9FTlVNX0NPTlNUQU5UID0gJyd7MH0nJyBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gRW51bSBjb25zdGFudC4KLVNUQVRFX0ZJRUxEX1BBVEhfRVhQUkVTU0lPTl9OT19NQVBQSU5HID0gTm8gbWFwcGluZyBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXRlIGZpZWxkIHBhdGggJyd7MH0nJy4KLVNUQVRFX0ZJRUxEX1BBVEhfRVhQUkVTU0lPTl9OT1RfUkVTT0xWQUJMRSA9IFRoZSBzdGF0ZSBmaWVsZCBwYXRoICcnezB9JycgY2Fubm90IGJlIHJlc29sdmVkIHRvIGEgdmFsaWQgdHlwZS4KLQotIyBTdHJpbmdMaXRlcmFsIC0gR3JhbW1hcgotU1RSSU5HX0xJVEVSQUxfTUlTU0lOR19DTE9TSU5HX1FVT1RFID0gVGhlIHN0cmluZyBsaXRlcmFsIGlzIG1pc3NpbmcgdGhlIGNsb3NpbmcgcXVvdGUuCi0KLSMgU3ViRXhwcmVzc2lvbiAtIEdyYW1tYXIKLVNVQl9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IFRoZSBlbmNhcHN1bGF0ZWQgZXhwcmVzc2lvbiBpcyBtaXNzaW5nLgotU1VCX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIHN1Yi1leHByZXNzaW9uLgotCi0jIFN1YnN0cmFjdGlvbkV4cHJlc3Npb24gLSBTZW1hbnRpYwotU1VCVFJBQ1RJT05fRVhQUkVTU0lPTl9MRUZUX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBsZWZ0IHNpZGUgb2YgdGhlIHN1YnRyYWN0aW9uIGlzIG5vdCBhIHZhbGlkIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4KLVNVQlRSQUNUSU9OX0VYUFJFU1NJT05fUklHSFRfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHN1YnRyYWN0aW9uIGlzIG5vdCBhIHZhbGlkIGFyaXRobWV0aWMgZXhwcmVzc2lvbi4KLQotIyBTdWJzdHJpbmdFeHByZXNzaW9uIC0gR3JhbW1hcgotU1VCU1RSSU5HX0VYUFJFU1NJT05fSU5WQUxJRF9GSVJTVF9FWFBSRVNTSU9OID0gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1TVUJTVFJJTkdfRVhQUkVTU0lPTl9JTlZBTElEX1NFQ09ORF9FWFBSRVNTSU9OID0gVGhlIHNlY29uZCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBleHByZXNzaW9uLgotU1VCU1RSSU5HX0VYUFJFU1NJT05fSU5WQUxJRF9USElSRF9FWFBSRVNTSU9OID0gVGhlIHRoaXJkIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1TVUJTVFJJTkdfRVhQUkVTU0lPTl9NSVNTSU5HX0ZJUlNUX0NPTU1BID0gVGhlIGZpcnN0IGNvbW1hIGlzIG1pc3NpbmcgZnJvbSB0aGUgU1VCU1RSSU5HIGV4cHJlc3Npb24uCi1TVUJTVFJJTkdfRVhQUkVTU0lPTl9NSVNTSU5HX0ZJUlNUX0VYUFJFU1NJT04gPSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgbWlzc2luZyBmcm9tIHRoZSBTVUJTVFJJTkcgZXhwcmVzc2lvbi4KLVNVQlNUUklOR19FWFBSRVNTSU9OX01JU1NJTkdfTEVGVF9QQVJFTlRIRVNJUyA9IFRoZSBsZWZ0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgU1VCU1RSSU5HIGV4cHJlc3Npb24uCi1TVUJTVFJJTkdfRVhQUkVTU0lPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgU1VCU1RSSU5HIGV4cHJlc3Npb24uCi1TVUJTVFJJTkdfRVhQUkVTU0lPTl9NSVNTSU5HX1NFQ09ORF9DT01NQSA9IFRoZSBzZWNvbmQgY29tbWEgaXMgbWlzc2luZyBmcm9tIHRoZSBTVUJTVFJJTkcgZXhwcmVzc2lvbi4KLVNVQlNUUklOR19FWFBSRVNTSU9OX01JU1NJTkdfU0VDT05EX0VYUFJFU1NJT04gPSBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIG1pc3NpbmcgZnJvbSB0aGUgU1VCU1RSSU5HIGV4cHJlc3Npb24uCi1TVUJTVFJJTkdfRVhQUkVTU0lPTl9NSVNTSU5HX1RISVJEX0VYUFJFU1NJT04gPSBUaGUgdGhpcmQgYXJndW1lbnQgaXMgbWlzc2luZyBmcm9tIHRoZSBTVUJTVFJJTkcgZXhwcmVzc2lvbi4KLSMgU3Vic3RyaW5nRXhwcmVzc2lvbiAtIFNlbWFudGljCi1TVUJTVFJJTkdfRVhQUkVTU0lPTl9GSVJTVF9FWFBSRVNTSU9OX1dST05HX1RZUEUgPSBUaGUgZmlyc3QgYXJndW1lbnQgaXMgbm90IGEgU3RyaW5nIHZhbHVlLgotU1VCU1RSSU5HX0VYUFJFU1NJT05fU0VDT05EX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYW4gaW50ZWdlciB2YWx1ZS4KLVNVQlNUUklOR19FWFBSRVNTSU9OX1RISVJEX0VYUFJFU1NJT05fV1JPTkdfVFlQRSA9IFRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYW4gaW50ZWdlciB2YWx1ZS4KLQotIyBTdW1GdW5jdGlvbiAtIEdyYW1tYXIKLVNVTV9GVU5DVElPTl9JTlZBTElEX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLVNVTV9GVU5DVElPTl9NSVNTSU5HX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gbXVzdCBiZSBwcm92aWRlZCBmb3IgYSBTVU0gZXhwcmVzc2lvbi4KLVNVTV9GVU5DVElPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIFNVTSBleHByZXNzaW9uLgotU1VNX0ZVTkNUSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBTVU0gZXhwcmVzc2lvbi4KLSMgU3VtRnVuY3Rpb24gLSBTZW1hbnRpYwotU1VNX0ZVTkNUSU9OX1dST05HX1RZUEUgPSBUaGUgYXJndW1lbnQgbXVzdCBiZSBudW1lcmljLgotCi0jIFRyZWF0RXhwcmVzc2lvbiAtIEdyYW1tYXIKLVRSRUFUX0VYUFJFU1NJT05fSU5WQUxJRF9KUEFfUExBVEZPUk0gPSBBIFRSRUFUIGV4cHJlc3Npb24gY2FuIG9ubHkgYmUgdXNlZCB3aGVuIHRoZSBwbGF0Zm9ybSBpcyBFY2xpcHNlTGluay4KLQotIyBUcmltRXhwcmVzc2lvbiAtIEdyYW1tYXIKLVRSSU1fRVhQUkVTU0lPTl9JTlZBTElEX0VYUFJFU1NJT04gPSBUaGUgZW5jYXBzdWxhdGVkIGV4cHJlc3Npb24gaXMgbm90IGEgdmFsaWQgZXhwcmVzc2lvbi4KLVRSSU1fRVhQUkVTU0lPTl9JTlZBTElEX1RSSU1fQ0hBUkFDVEVSID0gVGhlIHRyaW0gY2hhcmFjdGVyIHNob3VsZCBiZSBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIGxpdGVyYWwgb3IgYSBjaGFyYWN0ZXItdmFsdWVkIGlucHV0IHBhcmFtZXRlciAoaS5lLiwgY2hhciBvciBDaGFyYWN0ZXIpLgotVFJJTV9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IEFuIGV4cHJlc3Npb24gbXVzdCBiZSBwcm92aWRlZCBmb3IgYSBUUklNIGV4cHJlc3Npb24uCi1UUklNX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBUUklNIGV4cHJlc3Npb24uCi1UUklNX0VYUFJFU1NJT05fTUlTU0lOR19SSUdIVF9QQVJFTlRIRVNJUyA9IFRoZSByaWdodCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIFRSSU0gZXhwcmVzc2lvbi4KLVRSSU1fRVhQUkVTU0lPTl9OT1RfU0lOR0xFX1NUUklOR19MSVRFUkFMID0gVGhlIHRyaW0gY2hhcmFjdGVyIHNob3VsZCBiZSBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIGxpdGVyYWwuCi0KLSMgVHlwZUV4cHJlc3Npb24gLSBHcmFtbWFyCi1UWVBFX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1UWVBFX0VYUFJFU1NJT05fSU5WQUxJRF9KUEFfVkVSU0lPTiA9IEEgVFlQRSBleHByZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGluIGEgSlBRTCBxdWVyeSB3aGVuIHRoZSBKUEEgcGxhdGZvcm0gaXMgMS4wLgotVFlQRV9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IEFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIG9yIGEgcGF0aCBleHByZXNzaW9uIG11c3QgYmUgcHJvdmlkZWQgZm9yIGEgVFlQRSBleHByZXNzaW9uLgotVFlQRV9FWFBSRVNTSU9OX01JU1NJTkdfTEVGVF9QQVJFTlRIRVNJUyA9IFRoZSBsZWZ0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgVFlQRSBleHByZXNzaW9uLgotVFlQRV9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBUWVBFIGV4cHJlc3Npb24uCi0KLSMgVXBkYXRlQ2xhdXNlIC0gR3JhbW1hcgotVVBEQVRFX0NMQVVTRV9NSVNTSU5HX1JBTkdFX1ZBUklBQkxFX0RFQ0xBUkFUSU9OID0gVGhlIHJhbmdlIHZhcmlhYmxlIGRlY2xhcmF0aW9uIGlzIG1pc3NpbmcgZnJvbSB0aGUgVVBEQVRFIGNsYXVzZS4KLVVQREFURV9DTEFVU0VfTUlTU0lOR19TRVQgPSBUaGUgU0VUIGlkZW50aWZpZXIgaXMgbWlzc2luZyBmcm9tIHRoZSBVUERBVEUgY2xhdXNlLgotVVBEQVRFX0NMQVVTRV9NSVNTSU5HX1VQREFURV9JVEVNUyA9IEF0IGxlYXN0IG9uZSB1cGRhdGUgaXRlbSBtdXN0IGJlIHNwZWNpZmllZCBmb3IgYW4gVVBEQVRFIGNsYXVzZS4KLVVQREFURV9DTEFVU0VfVVBEQVRFX0lURU1fRU5EU19XSVRIX0NPTU1BID0gVGhlIHVwZGF0ZSBpdGVtIGNhbm5vdCBlbmQgd2l0aCBhIGNvbW1hLgotVVBEQVRFX0NMQVVTRV9VUERBVEVfSVRFTV9JU19NSVNTSU5HX0NPTU1BID0gVGhlIFVQREFURSBjbGF1c2UgaGFzICcnezB9JycgYW5kICcnezF9JycgdGhhdCBhcmUgbm90IHNlcGFyYXRlZCBieSBhIGNvbW1hLgotCi0jIFVwZGF0ZUl0ZW0gLSBHcmFtbWFyCi1VUERBVEVfSVRFTV9NSVNTSU5HX0VRVUFMX1NJR04gPSBUaGUgZXF1YWwgc2lnbiBtdXN0IGJlIHNwZWNpZmllZC4KLVVQREFURV9JVEVNX01JU1NJTkdfTkVXX1ZBTFVFID0gVGhlIG5ldyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4KLVVQREFURV9JVEVNX01JU1NJTkdfU1RBVEVfRklFTERfUEFUSF9FWFBSRVNTSU9OID0gVGhlIHN0YXRlIGZpZWxkIHBhdGggZXhwcmVzc2lvbiBpcyBtaXNzaW5nLgotIyBVcGRhdGVJdGVtIC0gU2VtYW50aWMKLVVQREFURV9JVEVNX05PVF9BU1NJR05BQkxFID0gVHlwZSBtaXNtYXRjaDogY2Fubm90IGNvbnZlcnQgZnJvbSB7MH0gdG8gezF9LgotVVBEQVRFX0lURU1fTk9UX1JFU09MVkFCTEUgPSBUaGUgc3RhdGUgZmllbGQgY2Fubm90IGJlIHJlc29sdmVkLgotCi0jIFVwcGVyRXhwcmVzc2lvbiAtIEdyYW1tYXIKLVVQUEVSX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1VUFBFUl9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IEFuIGV4cHJlc3Npb24gbXVzdCBiZSBwcm92aWRlZCBmb3IgYSBVUFBFUiBleHByZXNzaW9uLgotVVBQRVJfRVhQUkVTU0lPTl9NSVNTSU5HX0xFRlRfUEFSRU5USEVTSVMgPSBUaGUgbGVmdCBwYXJlbnRoZXNpcyBpcyBtaXNzaW5nIGZyb20gdGhlIFVQUEVSIGV4cHJlc3Npb24uCi1VUFBFUl9FWFBSRVNTSU9OX01JU1NJTkdfUklHSFRfUEFSRU5USEVTSVMgPSBUaGUgcmlnaHQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBVUFBFUiBleHByZXNzaW9uLgotIyBVcHBlckV4cHJlc3Npb24gLSBTZW1hbnRpYwotVVBQRVJfRVhQUkVTU0lPTl9XUk9OR19UWVBFID0gVGhlIGV4cHJlc3Npb24gaXMgbm90IGEgU3RyaW5nLgotCi0jIFZhbHVlRXhwcmVzc2lvbiAtIEdyYW1tYXIKLVZBTFVFX0VYUFJFU1NJT05fSU5WQUxJRF9FWFBSRVNTSU9OID0gVGhlIGVuY2Fwc3VsYXRlZCBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGV4cHJlc3Npb24uCi1WQUxVRV9FWFBSRVNTSU9OX0lOVkFMSURfSlBBX1ZFUlNJT04gPSBBIFZBTFVFIGV4cHJlc3Npb24gY2Fubm90IGJlIHVzZWQgaW4gYSBKUFFMIHF1ZXJ5IHdoZW4gdGhlIEpQQSBwbGF0Zm9ybSBpcyAxLjAuCi1WQUxVRV9FWFBSRVNTSU9OX01JU1NJTkdfRVhQUkVTU0lPTiA9IEFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIG11c3QgYmUgcHJvdmlkZWQgZm9yIGEgVkFMVUUgZXhwcmVzc2lvbi4KLVZBTFVFX0VYUFJFU1NJT05fTUlTU0lOR19MRUZUX1BBUkVOVEhFU0lTID0gVGhlIGxlZnQgcGFyZW50aGVzaXMgaXMgbWlzc2luZyBmcm9tIHRoZSBWQUxVRSBleHByZXNzaW9uLgotVkFMVUVfRVhQUkVTU0lPTl9NSVNTSU5HX1JJR0hUX1BBUkVOVEhFU0lTID0gVGhlIHJpZ2h0IHBhcmVudGhlc2lzIGlzIG1pc3NpbmcgZnJvbSB0aGUgVkFMVUUgZXhwcmVzc2lvbi4KLQotIyBXaGVuQ2xhdXNlIC0gR3JhbW1hcgotV0hFTl9DTEFVU0VfTUlTU0lOR19USEVOX0VYUFJFU1NJT04gPSBBIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gbXVzdCBiZSBwcm92aWRlciBmb3IgYSBXSEVOIGNsYXVzZS4KLVdIRU5fQ0xBVVNFX01JU1NJTkdfVEhFTl9JREVOVElGSUVSID0gVGhlIGlkZW50aWZpZXIgVEhFTiBpcyBtaXNzaW5nIGZyb20gdGhlIFdIRU4gY2xhdXNlLgotV0hFTl9DTEFVU0VfTUlTU0lOR19XSEVOX0VYUFJFU1NJT04gPSBBIFdIRU4gZXhwcmVzc2lvbiBtdXN0IGJlIHByb3ZpZGVkIGZvciBhIFdIRU4gY2xhdXNlLgotCi0jIFdoZXJlQ2xhdXNlIC0gR3JhbW1hcgotV0hFUkVfQ0xBVVNFX0lOVkFMSURfQ09ORElUSU9OQUxfRVhQUkVTU0lPTiA9IFRoZSBleHByZXNzaW9uIGlzIG5vdCBhIHZhbGlkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24uCi1XSEVSRV9DTEFVU0VfTUlTU0lOR19DT05ESVRJT05BTF9FWFBSRVNTSU9OID0gVGhlIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgbWlzc2luZyBmcm9tIHRoZSBXSEVSRSBjbGF1c2UuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX3ZhbGlkYXRpb24ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWYxYjA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jQ29udGVudCBpcyBvcmdhbml6ZWQgYmFzZWQgb24gdGhlIGNhdGVnb3JpZXMKLSNFbnRyaWVzIGluIGVhY2ggY2F0ZWdvcmllcyBhcmUgbGlzdGVkIGFscGhhYmV0aWNhbGx5LgotI0lmIGFkZGluZyBhIG5ldyBlbnRyeSwgcGxlYXNlIGFkZCBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeSBhdCB0aGUgcmlnaHQgcGxhY2UuCi0jTWVzc2FnZXMgdGhhdCBoYXZlIGEgcGFyYW1ldGVyIGFyZSBsaXN0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KLQotIyMjIFByb2plY3QgIyMjCi1OT19KUEFfUFJPSkVDVD1UaGlzIHByb2plY3QgaGFzIHRoZSBKUEEgZmFjZXQsIGJ1dCBubyBKUEEgcHJvamVjdCBjb3VsZCBiZSBjcmVhdGVkLiBTZWUgdGhlIGVycm9yIGxvZyBmb3IgbW9yZSBkZXRhaWxzLgotUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFM9TXVsdGlwbGUgcGVyc2lzdGVuY2UgdW5pdHMgZGVmaW5lZCAtIG9ubHkgdGhlIGZpcnN0IHBlcnNpc3RlbmNlIHVuaXQgd2lsbCBiZSByZWNvZ25pemVkCi1QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUPU5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZAotUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVD1UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZG9lcyBub3QgaGF2ZSByZWNvZ25pemVkIGNvbnRlbnQuCi1QRVJTSVNURU5DRV9YTUxfVU5TVVBQT1JURURfQ09OVEVOVD1UaGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgZG9lcyBub3QgaGF2ZSBzdXBwb3J0ZWQgY29udGVudCBmb3IgdGhpcyBKUEEgcGxhdGZvcm0uCi1QUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT049Q29ubmVjdGlvbiBcInswfVwiIGlzIG5vdCBhY3RpdmUuIE5vIHZhbGlkYXRpb24gd2lsbCBiZSBkb25lIGFnYWluc3QgdGhlIGRhdGEgc291cmNlLgotUFJPSkVDVF9JTlZBTElEX0NPTk5FQ1RJT049Q29ubmVjdGlvbiBcInswfVwiIGRvZXMgbm90IGV4aXN0LiBObyBkYXRhYmFzZS1zcGVjaWZpYyB2YWxpZGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLgotUFJPSkVDVF9JTlZBTElEX0xJQlJBUllfUFJPVklERVI9VGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaWJyYXJ5IHByb3ZpZGVyIGlzIGludmFsaWQuCi1QUk9KRUNUX01VTFRJUExFX1BFUlNJU1RFTkNFX1hNTD1NdWx0aXBsZSBwZXJzaXN0ZW5jZS54bWwgZmlsZXMgaW4gcHJvamVjdAotUFJPSkVDVF9OT19DT05ORUNUSU9OPU5vIGNvbm5lY3Rpb24gc3BlY2lmaWVkIGZvciBwcm9qZWN0LiBObyBkYXRhYmFzZS1zcGVjaWZpYyB2YWxpZGF0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLgotUFJPSkVDVF9OT19QRVJTSVNURU5DRV9YTUw9Tm8gcGVyc2lzdGVuY2UueG1sIGZpbGUgZm91bmQgaW4gcHJvamVjdAotWE1MX1ZFUlNJT05fTk9UX0xBVEVTVD1BIG1vcmUgcmVjZW50IHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBKUEEgcGxhdGZvcm0KLQotCi0jIyMgUGVyc2lzdGVuY2UgVW5pdCAjIyMKLU1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE9RXh0cmFuZW91cyBwZXJzaXN0ZW5jZSB1bml0IG1ldGFkYXRhIGZvdW5kIGNyb3NzIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBUaGlzIG1ldGFkYXRhIG1heSBub3QgYmUgdXNlZC4KLVBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTPUR1cGxpY2F0ZSBjbGFzcyBcInswfVwiCi1QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9KQVJfRklMRT1EdXBsaWNhdGUgSkFSIGZpbGUgXCJ7MH1cIgotUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFPUR1cGxpY2F0ZSBtYXBwaW5nIGZpbGUgXCJ7MH1cIgotUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUz1DbGFzcyBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEU9TWFwcGluZyBmaWxlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkLgotUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9KQVJfRklMRT1KQVIgZmlsZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTPUNsYXNzIFwiezB9XCIgaXMgaW5jbHVkZWQgaW4gYSBwZXJzaXN0ZW5jZSB1bml0LCBidXQgaXMgbm90IG1hcHBlZAotUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRT1NYXBwaW5nIGZpbGUgezB9IGRvZXMgbm90IGhhdmUgcmVjb2duaXplZCBjb250ZW50LgotUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORz1UaGUgcGF0aCB0byB0aGUgSkFSIGZpbGUgd2lsbCB2YXJ5IG9uIHlvdXIgcnVudGltZSBlbnZpcm9ubWVudC4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc3BlY2lmaWVkIHBhdGggZml0cyB5b3VyIHBhcnRpY3VsYXIgZW52aXJvbm1lbnQuCi1QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUz1DbGFzcyBcInswfVwiIGlzIGFscmVhZHkgc3BlY2lmaWVkIGluIG1hcHBpbmcgZmlsZSBcInsxfVwiCi1QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTPVVuc3BlY2lmaWVkIGNsYXNzCi1QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0pBUl9GSUxFPVVuc3BlY2lmaWVkIEpBUiBmaWxlCi1QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX01BUFBJTkdfRklMRT1VbnNwZWNpZmllZCBtYXBwaW5nIGZpbGUKLVBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQ9TWFwcGluZyBmaWxlIHswfSBkb2VzIG5vdCBoYXZlIHN1cHBvcnRlZCBjb250ZW50IGZvciB0aGlzIEpQQSBwbGF0Zm9ybS4KLQotIyMjIFR5cGUgIyMjCi1FTlRJVFlfTkFNRV9EVVBMSUNBVEVEPUR1cGxpY2F0ZSBlbnRpdHkgbmFtZSBcInswfVwiIGZvdW5kIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBFbnRpdHkgbmFtZXMgbXVzdCBiZSB1bmlxdWUuCi1FTlRJVFlfTkFNRV9NSVNTSU5HPVRoZSBnaXZlbiBuYW1lIG9mIHRoZSBlbnRpdHkgXCJ7MH1cIiBpcyBlbXB0eQotRU5USVRZX05PX1BLPVRoZSBlbnRpdHkgaGFzIG5vIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBkZWZpbmVkCi1FTlRJVFlfTk9OX1JPT1RfSURfQVRUUklCVVRFX1NQRUNJRklFRD1BIHByaW1hcnkga2V5IGF0dHJpYnV0ZSBzaG91bGQgb25seSBiZSBkZWZpbmVkIG9uIHRoZSByb290IGVudGl0eSBvciBhIG1hcHBlZCBzdXBlcmNsYXNzCi1FTlRJVFlfTk9OX1JPT1RfSURfQ0xBU1NfU1BFQ0lGSUVEPUFuIElEIGNsYXNzIHNob3VsZCBvbmx5IGJlIGRlZmluZWQgb24gdGhlIHJvb3QgZW50aXR5IG9yIGEgbWFwcGVkIHN1cGVyY2xhc3MKLVBFUlNJU1RFTlRfVFlQRV9BTk5PVEFURURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUPUNsYXNzIFwiezB9XCIgaXMgYW5ub3RhdGVkLCBidXQgaXMgbm90IGluY2x1ZGVkIGluIGFueSBwZXJzaXN0ZW5jZSB1bml0Ci1QRVJTSVNURU5UX1RZUEVfTUFQUEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVD1DbGFzcyBcInswfVwiIGlzIG1hcHBlZCwgYnV0IGlzIG5vdCBpbmNsdWRlZCBpbiBhbnkgcGVyc2lzdGVuY2UgdW5pdAotUEVSU0lTVEVOVF9UWVBFX0RVUExJQ0FURV9DTEFTUz1EdXBsaWNhdGUgY2xhc3MgXCJ7MH1cIiBmb3VuZCBpbiBtYXBwaW5nIGZpbGVzLiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdG9vbGluZyBhbmQgbWF5IHJlc3VsdCBpbiBpbnZhbGlkIGVycm9yIG1lc3NhZ2VzLgotUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1M9Q2xhc3MgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLVBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUz1VbnNwZWNpZmllZCBjbGFzcwotVEFSR0VUX05PVF9BTl9FTUJFRERBQkxFPXswfSBpcyBub3QgbWFwcGVkIGFzIGFuIGVtYmVkZGFibGUKLVRZUEVfTUFQUElOR19DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUj1UaGUgamF2YSBjbGFzcyBmb3IgbWFwcGVkIHR5cGUgXCJ7MH1cIiBoYXMgbm8gbm8tYXJnIGNvbnN0cnVjdG9yIGRlZmluZWQKLVRZUEVfTUFQUElOR19DTEFTU19QUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUj1UaGUgamF2YSBjbGFzcyBmb3IgbWFwcGVkIHR5cGUgXCJ7MH1cIiBoYXMgYSBwcml2YXRlIG5vLWFyZyBjb25zdHJ1Y3RvcjsgaXQgbXVzdCBiZSBwdWJsaWMgb3IgcHJvdGVjdGVkLgotVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTPVRoZSBqYXZhIGNsYXNzIGZvciBtYXBwZWQgdHlwZSBcInswfVwiIGlzIGZpbmFsCi1UWVBFX01BUFBJTkdfSURfQ0xBU1NfQU5EX0VNQkVEREVEX0lEX0JPVEhfVVNFRD1UaGlzIGNsYXNzIG11c3QgdXNlIGVpdGhlciBhbiBJRCBjbGFzcyBvciBhbiBlbWJlZGRlZCBJRCB0byBzcGVjaWZ5IGl0cyBjb21wb3NpdGUgcHJpbWFyeSBrZXksIG5vdCBib3RoLgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9ET0VTX05PVF9FWElTVD1UaGUgcHJpbWFyeSBrZXkgYXR0cmlidXRlIFwiezB9XCIgZG9lcyBub3QgaGF2ZSBhIG1hdGNoaW5nIElEIGNsYXNzIGF0dHJpYnV0ZQotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9NQVBQSU5HX0RVUExJQ0FURV9NQVRDSD1QcmltYXJ5IGtleSBhdHRyaWJ1dGUgezB9IGlzIGEgZHVwbGljYXRlIG1hdGNoIGZvciBJRCBjbGFzcwotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9NQVBQSU5HX05PX01BVENIPVRoZXJlIGlzIG5vIElEIGNsYXNzIGF0dHJpYnV0ZSB0byBtYXRjaCB0aGUgcHJpbWFyeSBrZXkgYXR0cmlidXRlIHswfQotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9OT19NQVRDSD1UaGVyZSBpcyBubyBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgdG8gbWF0Y2ggdGhlIElEIGNsYXNzIGF0dHJpYnV0ZSB7MH0KLVRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTk9UX1BSSU1BUllfS0VZPVRoZSBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIElEIGNsYXNzIGF0dHJpYnV0ZSB7MH0gaXMgbm90IG1hcHBlZCBhcyBhIHByaW1hcnkga2V5Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfQUdSRUU9VGhlIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgSUQgY2xhc3MgYXR0cmlidXRlIHswfSBkb2VzIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHR5cGUgezF9Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19FUVVBTFNfTUVUSE9EPUlEIGNsYXNzIFwiezB9XCIgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGVxdWFscygpIG1ldGhvZCBkZWZpbmVkCi1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0Q9SUQgY2xhc3MgXCJ7MH1cIiBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgaGFzaENvZGUoKSBtZXRob2QgZGVmaW5lZAotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SPUlEIGNsYXNzIFwiezB9XCIgaGFzIG5vIG5vLWFyZyBjb25zdHJ1Y3RvciBkZWZpbmVkCi1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19QVUJMSUNfTk9fQVJHX0NPTlNUUlVDVE9SPUlEIGNsYXNzIFwiezB9XCIgbXVzdCBoYXZlIGEgcHVibGljIG5vLWFyZyBjb25zdHJ1Y3RvcgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05BTUVfRU1QVFk9SUQgY2xhc3MgaGFzIGFuIGVtcHR5IG5hbWUKLVRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfRVhJU1Q9SUQgY2xhc3MgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoCi1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTk9UX0lNUExFTUVOVF9TRVJJQUxJWkFCTEU9SUQgY2xhc3MgXCJ7MH1cIiBtdXN0IGltcGxlbWVudCBcImphdmEuaW8uU2VyaWFsaXphYmxlXCIgaW50ZXJmYWNlCi1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTk9UX1BVQkxJQz1JRCBjbGFzcyBcInswfVwiIG11c3QgYmUgcHVibGljCi1UWVBFX01BUFBJTkdfSURfQ0xBU1NfUFJPUEVSVFlfTUVUSE9EX05PVF9QVUJMSUM9VGhlIHByb3BlcnR5IG1ldGhvZCBcInsxfVwiIG9mIElEIGNsYXNzIFwiezB9XCIgbXVzdCBiZSBwdWJsaWMKLVRZUEVfTUFQUElOR19JRF9DTEFTU19SRURFRklORUQ9QW4gYW5jZXN0b3Igb2YgdGhpcyBjbGFzcyBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBJRCBjbGFzcy4gVGhlIElEIGNsYXNzIG1heSBub3QgYmUgZGVmaW5lZCBoZXJlLgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFUVVJUkVEPVRoaXMgY2xhc3MgaGFzIGEgY29tcG9zaXRlIHByaW1hcnkga2V5LiBJdCBtdXN0IHVzZSBhbiBJRCBjbGFzcy4KLVRZUEVfTUFQUElOR19JRF9DTEFTU19XSVRIX01BUFNfSUQ9VGhlIHJlbGF0aW9uc2hpcCAnJ3swfScnIG1hcHMgYW4gSUQsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYW4gSUQgY2xhc3MuCi1UWVBFX01BUFBJTkdfTUFQU19JRF9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9BR1JFRT1UaGUgdHlwZSBvZiB0aGUgSUQgbWFwcGVkIGJ5IHRoZSByZWxhdGlvbnNoaXAgJyd7MH0nJyBkb2VzIG5vdCBhZ3JlZSB3aXRoIHRoZSBwcmltYXJ5IGtleSBjbGFzcyBvZiB0aGUgdGFyZ2V0IGVudGl0eS4KLVRZUEVfTUFQUElOR19NRU1CRVJfQ0xBU1M9VGhlIGphdmEgY2xhc3MgZm9yIG1hcHBlZCB0eXBlIFwiezB9XCIgaXMgYSBtZW1iZXIgY2xhc3MgCi1UWVBFX01BUFBJTkdfTVVMVElQTEVfRU1CRURERURfSUQ9VGhpcyBjbGFzcyB1c2VzIG11bHRpcGxlIGVtYmVkZGVkIElEIG1hcHBpbmdzLiBPbmx5IG9uZSBpcyBhbGxvd2VkLgotVFlQRV9NQVBQSU5HX1BLX1JFREVGSU5FRF9JRF9BVFRSSUJVVEU9QW4gYW5jZXN0b3Igb2YgdGhpcyBjbGFzcyBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBwcmltYXJ5IGtleS4gUHJpbWFyeSBrZXkgYXR0cmlidXRlcyBtYXkgbm90IGJlIGRlZmluZWQgaGVyZS4KLVRZUEVfTUFQUElOR19QS19SRURFRklORURfSURfQ0xBU1M9QW4gYW5jZXN0b3Igb2YgdGhpcyBjbGFzcyBoYXMgYWxyZWFkeSBkZWZpbmVkIHRoZSBwcmltYXJ5IGtleS4gVGhlIElEIGNsYXNzIG1heSBub3QgYmUgZGVmaW5lZCBoZXJlLgotCi0jIyMgQXR0cmlidXRlcyAjIyMKLU1BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQ9TWFwIGtleSBjbGFzcyBpcyBub3QgZGVmaW5lZAotTUFQX0tFWV9DTEFTU19OT1RfRVhJU1Q9TWFwIGtleSBjbGFzcyBkb2VzIG5vdCBleGlzdCBvbiB0aGUgcHJvamVjdCBjbGFzc3BhdGgKLUVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfRE9FU19OT1RfRVhJU1Q9VGFyZ2V0IGNsYXNzIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aAotRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19NVVNUX0JFX0VNQkVEREFCTEVfT1JfQkFTSUNfVFlQRT1UYXJnZXQgY2xhc3MgXCJ7MH1cIiBpcyBub3QgYW4gZW1iZWRkYWJsZSBvciBiYXNpYyB0eXBlCi1FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX05PVF9ERUZJTkVEPVRhcmdldCBjbGFzcyBpcyBub3QgZGVmaW5lZAotRU1CRURERURfSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9BVFRSSUJVVEVfT1ZFUlJJREVTX1NQRUNJRklFRD1FbWJlZGRlZCBJRHMgdGhhdCBhcmUgbWFwcGVkIGJ5IGEgcmVsYXRpb25zaGlwIHNob3VsZCBub3Qgc3BlY2lmeSBhbnkgYXR0cmlidXRlIG92ZXJyaWRlcy4KLUlEX01BUFBJTkdfTUFQUEVEX0JZX1JFTEFUSU9OU0hJUF9BTkRfQ09MVU1OX1NQRUNJRklFRD1JbiB7MH0sIGEgY29sdW1uIGlzIHNwZWNpZmllZCwgYnV0IGl0IGlzIG1hcHBlZCBieSBhIHJlbGF0aW9uc2hpcC4gSURzIHRoYXQgYXJlIG1hcHBlZCBieSBhIHJlbGF0aW9uc2hpcCBzaG91bGQgbm90IHNwZWNpZnkgYSBjb2x1bW4uCi1NQVBTX0lEX1ZBTFVFX0lOVkFMSUQ9SW4gezB9LCB0aGUgIm1hcHMgSUQiIHZhbHVlICcnezF9JycgZG9lcyBub3QgcmVmZXIgdG8gYW4gYXR0cmlidXRlIHRoYXQgaXMgdXNlZCBhcyBhbiBJRCBmb3IgdGhpcyBlbnRpdHkKLU1BUFNfSURfVkFMVUVfTk9UX1JFU09MVkVEPUluIHswfSwgdGhlICJtYXBzIElEIiB2YWx1ZSAnJ3sxfScnIGNvdWxkIG5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUgb24gdGhpcyBlbnRpdHkgb3IgdGhpcyBlbnRpdHknJ3MgZW1iZWRkZWQgSUQKLU1BUFNfSURfVkFMVUVfTk9UX1NQRUNJRklFRD1JbiB7MH0sIHRoZSAibWFwcyBJRCIgdmFsdWUgaXMgbm90IHNwZWNpZmllZCBhbmQgY291bGQgbm90IGJlIGRldGVybWluZWQgZnJvbSBkZWZhdWx0cwotTUFQUElOR19JTlZBTElEX01BUFBFRF9CWT1JbiB7MH0sIHRoZSAibWFwcGVkIGJ5IiBhdHRyaWJ1dGUgJyd7MX0nJyBoYXMgYW4gaW52YWxpZCBtYXBwaW5nIHR5cGUgZm9yIHRoaXMgcmVsYXRpb25zaGlwLgotTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUz1JbiB7MH0sIHRoZSAibWFwcGVkIGJ5IiBhdHRyaWJ1dGUgJyd7MX0nJyBhbHNvIG1hcHMgdGhpcyBhdHRyaWJ1dGUuIEV2ZXJ5IHJlbGF0aW9uc2hpcCBtdXN0IGhhdmUgYW4gb3duZXIuCi1NQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZPUluIHswfSwgdGhlICJtYXBwZWQgYnkiIHZhbHVlICcnezF9JycgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZSBvbiB0aGUgdGFyZ2V0IGVudGl0eS4KLU9SREVSX0NPTFVNTl9BTkRfT1JERVJfQllfQk9USF9TUEVDSUZJRUQ9QXR0cmlidXRlIFwiezB9XCIgc3BlY2lmaWVzIGJvdGggT3JkZXJDb2x1bW4gYW5kIE9yZGVyQnkgYW5ub3RhdGlvbnMKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEU9VGhlIGVsZW1lbnQgY29sbGVjdGlvbiB2YWx1ZSBmb3IgYSBUZW1wb3JhbCB0eXBlIG11c3QgYmUgb2YgdHlwZSBqYXZhLnV0aWwuRGF0ZSwgamF2YS51dGlsLkNhbGVuZGFyIG9yIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcgotUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBfS0VZX1RZUEU9VGhlIG1hcCBrZXkgZm9yIGEgVGVtcG9yYWwgdHlwZSBtdXN0IGJlIG9mIHR5cGUgamF2YS51dGlsLkRhdGUsIGphdmEudXRpbC5DYWxlbmRhciBvciBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEPVRoZSBqYXZhIGZpZWxkIGZvciBhdHRyaWJ1dGUgXCJ7MH1cIiBpcyBmaW5hbAotUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfR0VUVEVSPVRoZSBnZXQgbWV0aG9kIGZvciBhdHRyaWJ1dGUgXCJ7MH1cIiBpcyBmaW5hbAotUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfU0VUVEVSPVRoZSBzZXQgbWV0aG9kIGZvciBhdHRyaWJ1dGUgXCJ7MH1cIiBpcyBmaW5hbAotUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5IRVJJVEVEX0FUVFJJQlVURVNfTk9UX1NVUFBPUlRFRD1BdHRyaWJ1dGUgXCJ7MH1cIiBpcyBpbmhlcml0ZWQ7IHJlZmVycmluZyB0byBpbmhlcml0ZWQgYXR0cmlidXRlcyBpbiB0aGUgb3JtLnhtbCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSBhbGwgcGVyc2lzdGVuY2UgcHJvdmlkZXJzCi1QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX01BUFBJTkc9QXR0cmlidXRlIFwiezB9XCIgaGFzIGludmFsaWQgbWFwcGluZyB0eXBlIGluIHRoaXMgY29udGV4dAotUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBQSU5HX1RZUEU9VGhlIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgZm9yIGEgVGVtcG9yYWwgdHlwZSBtdXN0IGJlIG9mIHR5cGUgamF2YS51dGlsLkRhdGUsIGphdmEudXRpbC5DYWxlbmRhciBvciBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXIKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEU9VGhlIHBlcnNpc3RlbnQgZmllbGQgb3IgcHJvcGVydHkgZm9yIGEgVmVyc2lvbiBtYXBwaW5nIG11c3QgYmUgb2YgdHlwZSBpbnQsIEludGVnZXIsIHNob3J0LCBTaG9ydCwgbG9uZywgTG9uZyBvciBUaW1lc3RhbXAgdG8gZW5zdXJlIGFwcGxpY2F0aW9uIHBvcnRhYmlsaXR5Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9QVUJMSUNfRklFTEQ9VGhlIGphdmEgZmllbGQgZm9yIGF0dHJpYnV0ZSBcInswfVwiIGlzIHB1YmxpYwotUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FPUF0dHJpYnV0ZSBcInswfVwiIGluIGNsYXNzIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1QRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FPVVuc3BlY2lmaWVkIG5hbWUKLVRBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWT1UYXJnZXQgZW50aXR5IFwiezB9XCIgaXMgbm90IGFuIEVudGl0eQotVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRD1UYXJnZXQgZW50aXR5IGlzIG5vdCBkZWZpbmVkCi1UQVJHRVRfRU5USVRZX05PVF9FWElTVD1UYXJnZXQgZW50aXR5IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aAotVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRD1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBtYXAga2V5IGNsYXNzIGlzIG5vdCBkZWZpbmVkCi1WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX0RPRVNfTk9UX0VYSVNUPSJJbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0YXJnZXQgY2xhc3MgZG9lcyBub3QgZXhpc3Qgb24gdGhlIGNsYXNzcGF0aCIKLVZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFyZ2V0IGNsYXNzIFwiezF9XCIgaXMgbm90IGFuIGVtYmVkZGFibGUgb3IgYmFzaWMgdHlwZQotVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRD1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0YXJnZXQgY2xhc3MgaXMgbm90IGRlZmluZWQKLVZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0YXJnZXQgZW50aXR5IFwiezF9XCIgaXMgbm90IGFuIEVudGl0eQotVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9OT1RfREVGSU5FRD1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0YXJnZXQgZW50aXR5IGlzIG5vdCBkZWZpbmVkCi1WSVJUVUFMX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUF9LRVlfVFlQRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0aGUgbWFwIGtleSBmb3IgYSBUZW1wb3JhbCB0eXBlIG11c3QgYmUgb2YgdHlwZSBqYXZhLnV0aWwuRGF0ZSwgamF2YS51dGlsLkNhbGVuZGFyIG9yIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcgotVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX0lOVkFMSURfVkFMVUVfVFlQRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0aGUgZWxlbWVudCBjb2xsZWN0aW9uIHZhbHVlIGZvciBhIFRlbXBvcmFsIHR5cGUgbXVzdCBiZSBvZiB0eXBlIGphdmEudXRpbC5EYXRlLCBqYXZhLnV0aWwuQ2FsZW5kYXIgb3IgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyCi1WSVJUVUFMX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUFBJTkdfVFlQRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0aGUgcGVyc2lzdGVudCBmaWVsZCBvciBwcm9wZXJ0eSBmb3IgYSBUZW1wb3JhbCB0eXBlIG11c3QgYmUgb2YgdHlwZSBqYXZhLnV0aWwuRGF0ZSwgamF2YS51dGlsLkNhbGVuZGFyIG9yIGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcgotCi0jIyMgVGFibGUgIyMjCi1DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyA9IENhdGFsb2cgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGUgXCJ7MX1cIgotQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUUgPSBDb2xsZWN0aW9uIHRhYmxlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BID0gU2NoZW1hIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciBjb2xsZWN0aW9uIHRhYmxlIFwiezF9XCIKLUpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUNhdGFsb2cgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGpvaW4gdGFibGUgXCJ7MX1cIgotSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUU9Sm9pbiB0YWJsZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZAotSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGpvaW4gdGFibGUgXCJ7MX1cIgotU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1DYXRhbG9nIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIGZvciBzZWNvbmRhcnkgdGFibGUgXCJ7MX1cIgotU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1TZWNvbmRhcnkgdGFibGUgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLVNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHNlY29uZGFyeSB0YWJsZSBcInsxfVwiCi1UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9Q2F0YWxvZyBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGUgXCJ7MX1cIgotVEFCTEVfVU5SRVNPTFZFRF9OQU1FPVRhYmxlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHRhYmxlIFwiezF9XCIKLVZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HID0gSW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgY2F0YWxvZyBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgY29sbGVjdGlvbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRSA9IEluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGNvbGxlY3Rpb24gdGFibGUgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLVZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEgPSBJbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBzY2hlbWEgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGUgXCJ7Mn1cIgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgY2F0YWxvZyBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igam9pbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBqb2luIHRhYmxlIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHNjaGVtYSBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igam9pbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIHNlY29uZGFyeSB0YWJsZSBcInswfVwiLCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucwotVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW4gaW1wbGllZCBzZWNvbmRhcnkgdGFibGUgXCJ7MH1cIiwgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMKLVZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIHNlY29uZGFyeSB0YWJsZSBcInswfVwiLCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9SW4gaW1wbGllZCBzZWNvbmRhcnkgdGFibGUgXCJ7MH1cIiwgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsyfVwiCi0KLSMjIyBDb2x1bW4gIyMjCi1DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1UYWJsZSBcInswfVwiIGZvciBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQKLUlOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9TmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBpbnZlcnNlIGpvaW4gY29sdW1ucwotSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1SZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGludmVyc2Ugam9pbiBjb2x1bW5zCi1JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbnZlcnNlIGpvaW4gY29sdW1uIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezF9XCIKLUlOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPUludmVyc2Ugam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1OYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGpvaW4gY29sdW1ucwotSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9UmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBqb2luIGNvbHVtbnMKLUpPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1Kb2luIGNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9Sm9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1NQVBfS0VZX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSBNYXAga2V5IGNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPU9yZGVyIGNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1OYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucwotUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9UmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMKLVBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1QcmltYXJ5IGtleSBqb2luIGNvbHVtbiBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1NQVBfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID1OYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIG1hcCBrZXkgam9pbiBjb2x1bW5zCi1NQVBfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPVJlZmVyZW5jZWQgY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgbWFwIGtleSBqb2luIGNvbHVtbnMKLU1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPU1hcCBrZXkgam9pbiBjb2x1bW4gXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7MX1cIgotTUFQX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9TWFwIGtleSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezF9XCIKLQotVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7Mn1cIgotVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGludmVyc2Ugam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgaW52ZXJzZSBqb2luIGNvbHVtbnMKLVZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGludmVyc2Ugam9pbiBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7Mn1cIgotVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgaW52ZXJzZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezJ9XCIKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGpvaW4gY29sdW1ucwotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGpvaW4gY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezJ9XCIKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezJ9XCIKLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9IEluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIG1hcCBrZXkgY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezJ9XCIKLVZJUlRVQUxfQVRUUklCVVRFX09SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgb3JkZXIgY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezJ9XCIKLVZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FUVFJJQlVURV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucwotVklSVFVBTF9BVFRSSUJVVEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG5hbWUgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7Mn1cIgotVklSVFVBTF9BVFRSSUJVVEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7Mn1cIgotVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucwotVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucwotVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiwgbmFtZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsxfVwiCi1WSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRT1JbiBpbXBsaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezF9XCIKLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9NQVBfS0VZX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIG1hcCBrZXkgam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfTUFQX0tFWV9KT0lOX0NPTFVNTlM9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBtYXAga2V5IGpvaW4gY29sdW1ucwotVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgbWFwIGtleSBqb2luIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBtYXAga2V5IGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7Mn1cIgotCi0jIyMgT3ZlcnJpZGVzICMjIwotQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfVFlQRT1QZXJzaXN0ZW50IHR5cGUgb2Ygb3ZlcnJpZGUgYXR0cmlidXRlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1BVFRSSUJVVEVfT1ZFUlJJREVfREVSSVZFRF9BTkRfU1BFQ0lGSUVEPUFuIElEIGF0dHJpYnV0ZSBkZXJpdmVkIGZyb20gYSByZWxhdGlvbnNoaXAgbWFwcGluZyBjYW5ub3QgYmUgb3ZlcnJpZGRlbi4KLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBpbnZlcnNlIGpvaW4gY29sdW1ucwotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM9SW4gaW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiLCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGludmVyc2Ugam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgaW52ZXJzZSBqb2luIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgaW52ZXJzZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezJ9XCIKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW4gaW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiLCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGpvaW4gY29sdW1ucwotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezB9XCIsIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezB9XCIsIGpvaW4gY29sdW1uIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezJ9XCIKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgam9pbiB0YWJsZSBjYXRhbG9nIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIAotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezB9XCIsIGpvaW4gdGFibGUgXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgCi1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9SW4gaW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiLCBqb2luIHRhYmxlIHNjaGVtYSBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCAKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezF9XCIsIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInsxfVwiLCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGpvaW4gY29sdW1ucwotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezF9XCIsIGpvaW4gY29sdW1uIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezN9XCIKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInsxfVwiLCBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIFwiezJ9XCIgY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlIFwiezN9XCIKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUz1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInsxfVwiLCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGludmVyc2Ugam9pbiBjb2x1bW5zCi1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MX1cIiwgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBpbnZlcnNlIGpvaW4gY29sdW1ucwotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MX1cIiwgaW52ZXJzZSBqb2luIGNvbHVtbiBcInsyfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInszfVwiCi1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInsxfVwiLCBpbnZlcnNlIGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgXCJ7Mn1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7M31cIgotVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgYXR0cmlidXRlIG92ZXJyaWRlIFwiezF9XCIsIGNvbHVtbiBcInsyfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInszfVwiCi1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIFwiezF9XCIsIGNvbHVtbiBcInsyfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInszfVwiCi1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUluIGltcGxpZWQgYXR0cmlidXRlIG92ZXJyaWRlIFwiezB9XCIsIGNvbHVtbiBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZSBcInsyfVwiCi1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX1RZUEU9UGVyc2lzdGVudCB0eXBlIG9mIGltcGxpZWQgb3ZlcnJpZGUgYXR0cmlidXRlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkCi1WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9SW4gaW1wbGllZCBtYXAga2V5IGF0dHJpYnV0ZSBvdmVycmlkZSBcInswfVwiLCBjb2x1bW4gXCJ7MX1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7Mn1cIgotCi0jIyMgSW5oZXJpdGFuY2UgIyMjCi1ESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9RGlzY3JpbWluYXRvciBjb2x1bW4gXCJ7MH1cIiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgXCJ7MX1cIgotRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRD1ObyBkaXNjcmltaW5hdG9yIHZhbHVlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBhYnN0cmFjdCBlbnRpdHkgXCJ7MH1cIgotRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFPU5vIHRhYmxlIHNob3VsZCBiZSBkZWZpbmVkIGZvciBhYnN0cmFjdCBlbnRpdHkgXCJ7MH1cIiB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2UKLUVOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNob3VsZCBiZSBkZWZpbmVkIGZvciBub24tcm9vdCBlbnRpdHkgXCJ7MH1cIgotRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEU9Tm8gdGFibGUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIG5vbi1yb290IGVudGl0eSBcInswfVwiIHVzaW5nIHNpbmdsZS10YWJsZSBpbmhlcml0YW5jZQotRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNob3VsZCBiZSBkZWZpbmVkIGZvciBlbnRpdHkgXCJ7MH1cIiB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2UKLUVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGVudGl0eSBcInswfVwiIHVzaW5nIHRhYmxlLXBlci1jb25jcmV0ZS1jbGFzcyBpbmhlcml0YW5jZQotRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk09RW50aXR5IFwiezB9XCIgdXNlcyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2Ugd2hpY2ggaXMgbm90IHBvcnRhYmxlIGFuZCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgSlBBIHByb3ZpZGVyCi1FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk09RW50aXR5IFwiezB9XCIgY2Fubm90IHVzZSB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2UgYmVjYXVzZSB0aGUgY2hvc2VuIEpQQSBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGl0Ci0KLSMjIyBHZW5lcmF0b3IgIyMjCi1HRU5FUkFUT1JfRFVQTElDQVRFX05BTUU9RHVwbGljYXRlIGdlbmVyYXRvciBuYW1lZCBcInswfVwiIGRlZmluZWQgaW4gdGhpcyBwZXJzaXN0ZW5jZSB1bml0Ci1HRU5FUkFUT1JfTkFNRV9VTkRFRklORUQ9R2VuZXJhdG9yIGlzIHVubmFtZWQuIEFsbCBnZW5lcmF0b3JzIHJlcXVpcmUgYSBuYW1lLgotSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FPU5vIGdlbmVyYXRvciBuYW1lZCBcInswfVwiIGlzIGRlZmluZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQotIyMjIFF1ZXJ5ICMjIwotUVVFUllfRFVQTElDQVRFX05BTUU9RHVwbGljYXRlIHF1ZXJ5IG5hbWVkIFwiezB9XCIgZGVmaW5lZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQKLVFVRVJZX05BTUVfVU5ERUZJTkVEPVF1ZXJ5IGlzIHVubmFtZWQuIEFsbCBxdWVyaWVzIHJlcXVpcmUgYSBuYW1lLgotUVVFUllfU1RBVEVNRU5UX1VOREVGSU5FRD1RdWVyeSBcInswfVwiIGhhcyBubyBxdWVyeSBzdGF0ZW1lbnQuIEFsbCBxdWVyaWVzIHJlcXVpcmUgYSBxdWVyeSBzdGF0ZW1lbnQuCi0KLSNUaGVzZSBtZXNzYWdlcyBoYXZlIGEgcGFyYW1ldGVyIGF0IHRoZSBlbmQgd2hpY2ggaXMgdXNlZCB0byBwbHVnaW4gYSBkaWZmZXJlbnQgZGVzY3JpcHRpb24uCi0jVGhlIHBvc3NpYmxlIG1lc3NhZ2UgZW5kaW5ncyBhcmUgZm91bmQgaW4ganBhX3ZhbGlkYXRpb25fZGVzY3JpcHRpb24ucHJvcGVydGllcy4KLUFTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRT1Bc3NvY2lhdGlvbiBvdmVycmlkZSBcInswfVwiIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUgezF9IFwiezJ9XCIKLUFUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU9QXR0cmlidXRlIG92ZXJyaWRlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZSB7MX0gXCJ7Mn1cIgotQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBcInswfVwiIGZvciBjb2x1bW4gXCJ7MX1cIiB7Mn0KLUlOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIFwiezB9XCIgZm9yIGludmVyc2Ugam9pbiBjb2x1bW4gXCJ7MX1cIiB7Mn0KLUpPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBcInswfVwiIGZvciBqb2luIGNvbHVtbiBcInsxfVwiIHsyfQotTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIFwiezB9XCIgZm9yIG1hcCBrZXkgY29sdW1uIFwiezF9XCIgezJ9Ci1NQVBfS0VZX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBcInswfVwiIGZvciBtYXAga2V5IGpvaW4gY29sdW1uIFwiezF9XCIgezJ9Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRT1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZSB7MX0gXCJ7Mn1cIgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1JbiBpbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIFwiezB9XCIsIHRhYmxlIFwiezF9XCIgZm9yIGludmVyc2Ugam9pbiBjb2x1bW4gXCJ7Mn1cIiB7M30KLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUluIGltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3Igam9pbiBjb2x1bW4gXCJ7Mn1cIiB7M30KLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUgezJ9IFwiezN9XCIgCi1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBhc3NvY2lhdGlvbiBvdmVycmlkZSBcInsxfVwiLCB0YWJsZSBcInsyfVwiIGZvciBpbnZlcnNlIGpvaW4gY29sdW1uIFwiezN9XCIgezR9Ci1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgYXNzb2NpYXRpb24gb3ZlcnJpZGUgXCJ7MX1cIiwgdGFibGUgXCJ7Mn1cIiBmb3Igam9pbiBjb2x1bW4gXCJ7M31cIiB7NH0KLVZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIGF0dHJpYnV0ZSBvdmVycmlkZSBcInsxfVwiLCB0YWJsZSBcInsyfVwiIGZvciBjb2x1bW4gXCJ7M31cIiB7NH0KLVZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgYXR0cmlidXRlIG92ZXJyaWRlIFwiezF9XCIgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZSB7Mn0gXCJ7M31cIiAKLVZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3IgY29sdW1uIFwiezJ9XCIgezN9Ci1WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCB0YWJsZSBcInsxfVwiIGZvciBpbnZlcnNlIGpvaW4gY29sdW1uIFwiezJ9XCIgezN9Ci1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3Igam9pbiBjb2x1bW4gXCJ7Mn1cIiB7M30KLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgXCJ7MX1cIiwgdGFibGUgXCJ7Mn1cIiBmb3IgY29sdW1uIFwiezN9XCIgezR9Ci1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW4gaW1wbGllZCBhdHRyaWJ1dGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3IgbWFwIGtleSBjb2x1bW4gXCJ7Mn1cIiB7M30KLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUluIGltcGxpZWQgYXR0cmlidXRlIFwiezB9XCIsIHRhYmxlIFwiezF9XCIgZm9yIG1hcCBrZXkgam9pbiBjb2x1bW4gXCJ7Mn1cIiB7M30KLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRT1JbiBpbXBsaWVkIGF0dHJpYnV0ZSBcInswfVwiLCBtYXAga2V5IGF0dHJpYnV0ZSBvdmVycmlkZSBcInsxfVwiIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUgezJ9IFwiezN9XCIgCi1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUluIGltcGxpZWQgYXR0cmlidXRlIG92ZXJyaWRlIFwiezB9XCIsIHRhYmxlIFwiezF9XCIgZm9yIGNvbHVtbiBcInsyfVwiIHszfQotVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FPUltcGxpZWQgYXR0cmlidXRlIG92ZXJyaWRlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZSB7MX0gXCJ7Mn1cIgotVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUluIGltcGxpZWQgbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgXCJ7MH1cIiwgdGFibGUgXCJ7MX1cIiBmb3IgY29sdW1uIFwiezJ9XCIgezN9Ci1WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRT1JbXBsaWVkIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIFwiezB9XCIgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZSB7MX0gXCJ7Mn1cIgotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvcHJvcGVydHlfZmlsZXMvanBhX3ZhbGlkYXRpb25fZGVzY3JpcHRpb24ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfdmFsaWRhdGlvbl9kZXNjcmlwdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkyMmM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9wcm9wZXJ0eV9maWxlcy9qcGFfdmFsaWRhdGlvbl9kZXNjcmlwdGlvbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMKLSMgVGhlIG1lc3NhZ2VzIGFyZSB1c2VkIGFzIHRoZSBkZXNjcmlwdGlvbiBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzIGZvdW5kIGluIHRoZQotIyBqcGFfdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGJ1bmRsZS4gVGhleSBhcmUgdXNlZCBhcyBwYXJhbWV0ZXJzIHRvIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1ET0VTX05PVF9NQVRDSF9KT0lOX1RBQkxFPWRvZXMgbm90IG1hdGNoIGpvaW4gdGFibGUKLURPRVNfTk9UX01BVENIX0NPTExFQ1RJT05fVEFCTEU9ZG9lcyBub3QgbWF0Y2ggY29sbGVjdGlvbiB0YWJsZQotTk9UX1ZBTElEX0ZPUl9USElTX0VOVElUWT1pcyBub3QgdmFsaWQgZm9yIHRoaXMgZW50aXR5Ci0KLUFUVFJJQlVURV9ERVNDPWF0dHJpYnV0ZSAnJ3swfScnCi1WSVJUVUFMX0FUVFJJQlVURV9ERVNDPWltcGxpZWQgYXR0cmlidXRlICcnezB9JycKLQotT05fTUFQUEVEX1NVUEVSQ0xBU1M9b24gdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi1PTl9FTUJFRERBQkxFPW9uIHRoZSBlbWJlZGRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc2NoZW1hL2pwYVBsYXRmb3Jtcy5leHNkIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NjaGVtYS9qcGFQbGF0Zm9ybXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyODI1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc2NoZW1hL2pwYVBsYXRmb3Jtcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiIGlkPSJqcGFQbGF0Zm9ybXMiIG5hbWU9IkpQQSBQbGF0Zm9ybXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRGVmaW5lcyBKUEEgcGxhdGZvcm1zIGFuZCBKUEEgcGxhdGZvcm0gZ3JvdXBzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgIDxtZXRhLmVsZW1lbnQgLz4KLSAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImpwYVBsYXRmb3JtR3JvdXAiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ianBhUGxhdGZvcm0iLz4KLSAgICAgICAgIDwvY2hvaWNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpwYVBsYXRmb3JtR3JvdXAiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlY2xhcmVzIGEgSlBBIHBsYXRmb3JtIGdyb3VwLiAgQWN0cyBhcyBhIHNvcnQgb2YgJnF1b3Q7c3VwZXImcXVvdDsgcGxhdGZvcm0uICBNb3N0IHVzZWZ1bCBmb3IgZW5hYmxpbmcgZnVuY3Rpb25hbGl0eSBmb3IgYSBzZXQgb2YgcGxhdGZvcm1zIHdpdGhvdXQgaGF2aW5nIHRvIGVuYWJsZSB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgZWFjaCBwbGF0Zm9ybSBzZXBhcmF0ZWx5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgSlBBIHBsYXRmb3JtIGdyb3VwLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImxhYmVsIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgdHJhbnNsYXRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlBBIHBsYXRmb3JtIGdyb3VwLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpwYVBsYXRmb3JtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWNsYXJlcyBhIEpQQSBwbGF0Zm9ybS4gIE9uZSBKUEEgcGxhdGZvcm0gd2lsbCBiZSBzZWxlY3RlZCBwZXIgSlBBLWZhY2V0ZWQgcHJvamVjdC4gU2VlICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybSZsdDsvc2FtcCZndDsgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gSlBBIHBsYXRmb3Jtcy4gIEFsc28gc2VlIHRoZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVBsYXRmb3JtVWlzIGV4dGVuc2lvbiBwb2ludC4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibGFiZWwiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB0cmFuc2xhdGFibGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImZhY3RvcnlDbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzICZsdDtzYW1wJmd0O29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3RvcnkmbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0iOm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybUZhY3RvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJncm91cCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBEZWNsYXJlcyB3aGljaCBKUEEgcGxhdGZvcm0gZ3JvdXAgdGhpcyBwbGF0Zm9ybSBiZWxvbmdzIHRvLCBpZiBhbnkuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ianBhRmFjZXRWZXJzaW9uIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIERlY2xhcmVzIHRoZSBKUEEgZmFjZXQgdmVyc2lvbiBmb3Igd2hpY2ggdGhpcyBwbGF0Zm9ybSBtYXkgYmUgdXNlZC4gSWYgbm8gSlBBIGZhY2V0IHZlcnNpb24gaXMgc3BlY2lmaWVkLCB0aGlzIHBsYXRmb3JtIGlzIGF2YWlsYWJsZSBmb3IgYWxsIEpQQSBmYWNldCB2ZXJzaW9ucy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJib29sZWFuIiB1c2U9ImRlZmF1bHQiIHZhbHVlPSJmYWxzZSI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgRGVjbGFyZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtIHNob3VsZCBiZSB1c2VkIGFzIGEgZGVmYXVsdCBKUEEgcGxhdGZvcm0gZm9yIG5ldyBKUEEgcHJvamVjdCBjb250ZW50LiAgTm90ZSB0aGF0IGlmIGEgd29ya3NwYWNlIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgZGVmYXVsdCBwbGF0Zm9ybSBmb3IgYSBKUEEgZmFjZXQgdmVyc2lvbiwgb25lIG9mIHRoZW0gd2lsbCBiZSBjaG9zZW4gYXQgcmFuZG9tLiAgQnkgZGVmYXVsdCwgYSBwbGF0Zm9ybSBpcyBub3QgYSBkZWZhdWx0IHBsYXRmb3JtLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBKUFQgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDticiZndDsKLSZsdDtwJmd0OwotVGhlIGZvbGxvd2luZyBleGFtcGxlIGlzIHRoZSBpbmNsdWRlZCBnZW5lcmljIEpQQSAxLjAgcGxhdGZvcm0gYW5kIGl0cyBwbGF0Zm9ybSBncm91cCAKLSZsdDtwJmd0OwotJmx0O3ByZSZndDsKLSZsdDtleHRlbnNpb24gcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYVBsYXRmb3JtcyZxdW90OyZndDsKLSAgIAotICAgJmx0O2pwYVBsYXRmb3JtR3JvdXAKLSAgICAgIGlkPSZxdW90O215SnBhUGxhdGZvcm1Hcm91cCZxdW90OwotICAgICAgbGFiZWw9JnF1b3Q7TXkgSlBBIFBsYXRmb3JtJnF1b3Q7LyZndDsKLSAgICAgIAotICAgJmx0O2pwYVBsYXRmb3JtCi0gICAgICBpZD0mcXVvdDtnZW5lcmljJnF1b3Q7Ci0gICAgICBsYWJlbD0mcXVvdDslR0VORVJJQ18xXzBfUExBVEZPUk1fTEFCRUwmcXVvdDsKLSAgICAgIGZhY3RvcnlDbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtRmFjdG9yeSZxdW90OwotICAgICAganBhRmFjZXRWZXJzaW9uPSZxdW90OzEuMCZxdW90OwotICAgICAgZGVmYXVsdD0mcXVvdDtmYWxzZSZxdW90OyZndDsKLSAgICZsdDsvanBhUGxhdGZvcm0mZ3Q7Ci0gICAKLSZsdDsvZXh0ZW5zaW9uJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi11bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi1zdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLVRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLWFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gCi1Db250cmlidXRvcnM6Ci1PcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YyMmEwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBQcm92aWRlIGEgcGx1Z2dhYmxlIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgaG93IHRoZSBlbnRpdHkgZ2VuZXJhdG9yCi0gKiBwcmludHMgdGhlIG5hbWVzIG9mIHZhcmlvdXMgZGF0YWJhc2Ugb2JqZWN0cy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGVudGl0eSBhbmQgdGhlIHRhYmxlIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgZW50aXR5J3MKLQkgKiA8Y29kZT5UYWJsZTwvY29kZT4gYW5ub3RhdGlvbidzIDxjb2RlPm5hbWU8L2NvZGU+IGVsZW1lbnQuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbnRpdHkgbWFwcyB0byB0aGUgdGFibGUgYnkgZGVmYXVsdC4KLQkgKi8KLQlTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBhbmQgdGhlIGNvbHVtbgotCSAqIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkgKiA8Y29kZT5Db2x1bW48L2NvZGU+IGFubm90YXRpb24ncyA8Y29kZT5uYW1lPC9jb2RlPiBlbGVtZW50LgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIG1hcHMgdG8gdGhlIGNvbHVtbiBieSBkZWZhdWx0LgotCSAqLwotCVN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKTsKLQotCS8qKgotCSAqIEdpdmVuIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSAoZmllbGQgb3IgcHJvcGVydHkpIGFuZCB0aGUKLQkgKiBtYW55LXRvLW9uZSBvciBtYW55LXRvLW1hbnkgZm9yZWlnbiBrZXkgdG8gd2hpY2ggaXQgaXMgbWFwcGVkLAotCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUncwotCSAqIDxjb2RlPkpvaW5Db2x1bW48L2NvZGU+IGFubm90YXRpb24ncyA8Y29kZT5uYW1lPC9jb2RlPiBlbGVtZW50LgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JICogVGhlIHNwZWNpZmllZCBmb3JlaWduIGtleSBjb25zaXN0cyBvZiBhIHNpbmdsZSBjb2x1bW4gcGFpciB3aG9zZQotCSAqIHJlZmVyZW5jZWQgY29sdW1uIGlzIHRoZSBzaW5nbGUtY29sdW1uIHByaW1hcnkga2V5IG9mIHRoZSBmb3JlaWduCi0JICoga2V5J3MgcmVmZXJlbmNlZCB0YWJsZS4KLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIDxjb2RlPkpvaW5Db2x1bW48L2NvZGU+Ci0JICogYW5ub3RhdGlvbidzIDxjb2RlPm5hbWU8L2NvZGU+IG9yIDxjb2RlPnJlZmVyZW5jZWRDb2x1bW5OYW1lPC9jb2RlPiBlbGVtZW50LgotCSAqIFRoaXMgaXMgY2FsbGVkIGZvciBtYW55LXRvLW9uZSBhbmQgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4KLQkgKiB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBuYW1lIGFuZC9vciByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGFyZS9pcwotCSAqIG5vdCBhcHBsaWNhYmxlLgotCSAqIAotCSAqIEBzZWUgI2J1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZywgRm9yZWlnbktleSkKLQkgKi8KLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbik7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciBhIDxjb2RlPkpvaW5UYWJsZTwvY29kZT4KLQkgKiBhbm5vdGF0aW9uJ3MgPGNvZGU+bmFtZTwvY29kZT4gZWxlbWVudC4KLQkgKiBUaGlzIGlzIGNhbGxlZCBmb3IgbWFueS10by1tYW55IG1hcHBpbmdzIHdoZW4gdGhlIGRlZmF1bHQKLQkgKiBqb2luIHRhYmxlIG5hbWUgaXMgbm90IGFwcGxpY2FibGUuCi0JICovCi0JU3RyaW5nIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoVGFibGUgdGFibGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9HZW5lcmljSnBhUHJvamVjdE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRkMGRlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9HZW5lcmljSnBhUHJvamVjdE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklMb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5KcHRDb21tb25Db3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuQ2FsbGJhY2tKb2JTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSm9iQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5Kb2JTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFzeW5jaHJvbm91c0NvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU2ltcGxlQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdGF0ZWZ1bENvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuU2ltcGxlSnBhUHJvamVjdENvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklQcm9qZWN0RmFjZXRBY3Rpb25FdmVudDsKLQotLyoqCi0gKiBUaGUgSlBBIHByb2plY3QgbWFuYWdlciBtYWludGFpbnMgYSBsaXN0IG9mIGFsbCBKUEEgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4KLSAqIEl0IGtlZXBzIHRoZSBsaXN0IChhbmQgdGhlIHN0YXRlIG9mIHRoZSBKUEEgcHJvamVjdHMgdGhlbXNlbHZlcykKLSAqIHN5bmNocm9uaXplZCB3aXRoIHRoZSB3b3Jrc3BhY2UgYnkgbGlzdGVuaW5nIGZvciB2YXJpb3VzCi0gKiBjaGFuZ2VzOjx1bD4KLSAqIDxsaT5SZXNvdXJjZQotICogPGxpPkphdmEKLSAqIDxsaT5GYWNldGVkIFByb2plY3QKLSAqIDwvdWw+Ci0gKiBXZSB1c2UgYW4gRWNsaXBzZSB7QGxpbmsgSUxvY2sgbG9ja30gdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBKUEEKLSAqIHByb2plY3RzIHdoZW4gZGVhbGluZyB3aXRoIHRoZXNlIGV2ZW50cy4gSW4gYW4gZWZmb3J0IHRvIHJlZHVjZSBkZWFkbG9ja3MsCi0gKiB0aGUgc2ltcGxlIFJlc291cmNlIGFuZCBKYXZhIGNoYW5nZSBldmVudHMgYXJlIGRpc3BhdGNoZWQgdG8gYSBiYWNrZ3JvdW5kCi0gKiB0aHJlYWQsIGFsbG93aW5nIHVzIHRvIGhhbmRsZSB0aGUgZXZlbnRzIG91dHNpZGUgb2YgdGhlIHdvcmtzcGFjZSBsb2NrIGhlbGQKLSAqIGR1cmluZyByZXNvdXJjZSBhbmQgSmF2YSBjaGFuZ2Ugbm90aWZpY2F0aW9ucy4KLSAqIDxwPgotICogRXZlbnRzIHRoYXQgdHJpZ2dlciBlaXRoZXIgdGhlIGFkZGluZyBvciByZW1vdmluZyBvZiBhIEpQQSBwcm9qZWN0IChlLmcuCi0gKiB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9KSBhcmUgaGFuZGxlZCAic3luY2hyb25vdXNseSIKLSAqIGJ5IGFsbG93aW5nIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCB0byBoYW5kbGUgYW55IG91dHN0YW5kaW5nIGV2ZW50cyBiZWZvcmUKLSAqIHVwZGF0aW5nIHRoZSBsaXN0IG9mIEpQQSBwcm9qZWN0cyBhbmQgcmV0dXJuaW5nIGV4ZWN1dGlvbiB0byB0aGUgZXZlbnQKLSAqIHNvdXJjZS4KLSAqIDxwPgotICogVmFyaW91cyB0aGluZ3MgdGhhdCBjYXVzZSB1cyB0byBhZGQgb3IgcmVtb3ZlIGEgSlBBIHByb2plY3Q6PHVsPgotICogPGxpPlRoZSB7QGxpbmsgSnB0SnBhQ29yZVBsdWdpbn0gd2lsbCAibGF6aWx5IiBpbnN0YW50aWF0ZSBhbmQge0BsaW5rICNzdGFydCgpIHN0YXJ0fQotICogICAgIGEgSlBBIHByb2plY3QgbWFuYWdlciBhcyBhcHByb3ByaWF0ZS4gVGhpcyB3aWxsIHRyaWdnZXIgdGhlIG1hbmFnZXIKLSAqICAgICB0byBmaW5kIGFuZCBhZGQgYWxsIHByZS1leGlzdGluZyBKUEEgcHJvamVjdHMuCi0gKiAKLSAqIDxsaT5Qcm9qZWN0IGNyZWF0ZWQgYW5kIGZhY2V0IGluc3RhbGxlZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqIDxsaT5Qcm9qZWN0IGZhY2V0IHVuaW5zdGFsbGVkPHA+Ci0gKiAgICAge0BsaW5rIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUjUFJFX1VOSU5TVEFMTH0KLSAqIAotICogPGxpPlByb2plY3Qgb3BlbmVkPHA+Ci0gKiAgICAge0BsaW5rIElSZXNvdXJjZUNoYW5nZUV2ZW50I1BPU1RfQ0hBTkdFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2UjRklMRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjQURERUR9IGZhY2V0IHNldHRpbmdzIGZpbGUKLSAqICAgICAoPGNvZGU+Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS54bWw8L2NvZGU+KQotICogPGxpPlByb2plY3QgY2xvc2VkPHA+Ci0gKiAgICAge0BsaW5rIElSZXNvdXJjZUNoYW5nZUV2ZW50I1BPU1RfQ0hBTkdFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2UjRklMRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjUkVNT1ZFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZQotICogCi0gKiA8bGk+UHJlLWV4aXN0aW5nIHByb2plY3QgaW1wb3J0ZWQgZnJvbSBkaXJlY3Rvcnkgb3IgYXJjaGl2ZSAoY3JlYXRlZCBhbmQgb3BlbmVkKTxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI0FEREVEfSBmYWNldCBzZXR0aW5ncyBmaWxlCi0gKiA8bGk+UHJvamVjdCByZW5hbWVkPHA+Ci0gKiAgICAge0BsaW5rIElSZXNvdXJjZUNoYW5nZUV2ZW50I1BPU1RfQ0hBTkdFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2UjRklMRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjUkVNT1ZFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZSBvZiBvbGQgcHJvamVjdAotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNBRERFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZSBvZiBuZXcgcHJvamVjdAotICogPGxpPlByb2plY3QgZGVsZXRlZDxwPgotICogICAgIHtAbGluayBJUmVzb3VyY2VDaGFuZ2VFdmVudCNQT1NUX0NIQU5HRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlI0ZJTEV9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZURlbHRhI1JFTU9WRUR9IGZhY2V0IHNldHRpbmdzIGZpbGUKLSAqIAotICogPGxpPlByb2plY3QgZmFjZXQgaW5zdGFsbGVkIGJ5IGVkaXRpbmcgdGhlIGZhY2V0cyBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5PHA+Ci0gKiAgICAge0BsaW5rIElSZXNvdXJjZUNoYW5nZUV2ZW50I1BPU1RfQ0hBTkdFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2UjRklMRX0KLSAqICAgICAtPiB7QGxpbmsgSVJlc291cmNlRGVsdGEjQ0hBTkdFRH0gZmFjZXQgc2V0dGluZ3MgZmlsZQotICogPGxpPlByb2plY3QgZmFjZXQgdW5pbnN0YWxsZWQgYnkgZWRpdGluZyB0aGUgZmFjZXRzIHNldHRpbmdzIGZpbGUgZGlyZWN0bHk8cD4KLSAqICAgICB7QGxpbmsgSVJlc291cmNlQ2hhbmdlRXZlbnQjUE9TVF9DSEFOR0V9Ci0gKiAgICAgLT4ge0BsaW5rIElSZXNvdXJjZSNGSUxFfQotICogICAgIC0+IHtAbGluayBJUmVzb3VyY2VEZWx0YSNDSEFOR0VEfSBmYWNldCBzZXR0aW5ncyBmaWxlCi0gKiA8L3VsPgotICovCi0vLyBUT0RPIHJlbW92ZSBmYWNldGVkIHByb2plY3QgbGlzdGVuZXIgYW5kIHJlbHkgc29sZWx5IG9uIHJlc291cmNlIGNoYW5nZSBldmVudHMKLS8vIGZvciB0aGUgZmFjZXRlZCBwcm9qZWN0IHNldHRpbmdzIGZpbGUKLWNsYXNzIEdlbmVyaWNKcGFQcm9qZWN0TWFuYWdlcgotCWV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCWltcGxlbWVudHMgSnBhUHJvamVjdE1hbmFnZXIKLXsKLQkvKioKLQkgKiBBbGwgdGhlIEpQQSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCXByaXZhdGUgZmluYWwgVmVjdG9yPEpwYVByb2plY3Q+IGpwYVByb2plY3RzID0gbmV3IFZlY3RvcjxKcGFQcm9qZWN0PigpOwotCi0JLyoqCi0JICogU3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBKUEEgcHJvamVjdHMuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyBmaW5hbCBJTG9jayBsb2NrID0gdGhpcy5nZXRKb2JNYW5hZ2VyKCkubmV3TG9jaygpOwotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGhvdyBSZXNvdXJjZSBhbmQgSmF2YSBjaGFuZ2UgZXZlbnRzIGFyZQotCSAqIGhhbmRsZWQgKGkuZS4gc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSkuCi0JICovCi0JcHJpdmF0ZSB2b2xhdGlsZSBTdGF0ZWZ1bENvbW1hbmRFeGVjdXRvciBldmVudEhhbmRsZXIgPSBuZXcgQXN5bmNocm9ub3VzQ29tbWFuZEV4ZWN1dG9yKEpwdENvbW1vbkNvcmVNZXNzYWdlcy5EQUxJX0VWRU5UX0hBTkRMRVJfVEhSRUFEX05BTUUpOwotCi0JLyoqCi0JICogTGlzdGVuIGZvcjx1bD4KLQkgKiA8bGk+Y2hhbmdlcyB0byBwcm9qZWN0cyBhbmQgZmlsZXMKLQkgKiA8bGk+Y2xlYW4gYnVpbGRzCi0JICogPC91bD4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogVGhlIHR5cGVzIG9mIHJlc291cmNlIGNoYW5nZSBldmVudHMgdGhhdCBpbnRlcmVzdAotCSAqIHtAbGluayAjcmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcn0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX0NIQU5HRV9FVkVOVF9UWVBFUyA9Ci0JCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSB8Ci0JCQlJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEOwotCi0JLyoqCi0JICogTGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB0byBkZXRlcm1pbmUgd2hlbiB0aGUgSlBBIGZhY2V0IGlzCi0JICogYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIGEgImZhY2V0ZWQiIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ0VURURfUFJPSkVDVF9GUkFNRVdPUktfU0VUVElOR1NfRklMRV9OQU1FID0gRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuUExVR0lOX0lEICsgIi54bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIHRoZSBKUEEgZmFjZXQgYmVpbmcgYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIGEgImZhY2V0ZWQiIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJRmFjZXRlZFByb2plY3RMaXN0ZW5lciBmYWNldGVkUHJvamVjdExpc3RlbmVyID0gbmV3IEZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKTsKLQotCS8qKgotCSAqIFRoZSB0eXBlcyBvZiBmYWNldGVkIHByb2plY3QgZXZlbnRzIHRoYXQgaW50ZXJlc3QKLQkgKiB7QGxpbmsgI2ZhY2V0ZWRQcm9qZWN0TGlzdGVuZXJ9LgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGVbXSBGQUNFVEVEX1BST0pFQ1RfRVZFTlRfVFlQRVMgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZVtdIHsKLQkJCUlGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUFJFX1VOSU5TVEFMTAotCQl9OwotCi0JLyoqCi0JICogTGlzdGVuIGZvciBKYXZhIGNoYW5nZXMgKHVubGVzcyB0aGUgRGFsaSBVSSBpcyBhY3RpdmUpLgotCSAqIEBzZWUgI2phdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpOwotCi0JLyoqCi0JICogVGhlIHR5cGVzIG9mIHJlc291cmNlIGNoYW5nZSBldmVudHMgdGhhdCBpbnRlcmVzdAotCSAqIHtAbGluayAjamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcn0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpBVkFfQ0hBTkdFX0VWRU5UX1RZUEVTID0KLQkJCUVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9DSEFOR0UgfAotCQkJRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX1JFQ09OQ0lMRTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKcGFDb3JlUGx1Z2luIERhbGkgcGx1Zy1pbn0uCi0JICovCi0JR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGNvbnRyb2xsZWQgbGlmZS1jeWNsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcm5hbDogY2FsbGVkIGJ5IHtAbGluayBKcHRKcGFDb3JlUGx1Z2luIERhbGkgcGx1Zy1pbn0uCi0JICovCi0Jdm9pZCBzdGFydCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQl0aGlzLnN0YXJ0XygpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5sb2NrLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydF8oKSB7Ci0JCWRlYnVnKCIqKiogSlBBIHByb2plY3QgbWFuYWdlciBTVEFSVCAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJdGhpcy5idWlsZEpwYVByb2plY3RzKCk7Ci0JCQl0aGlzLmV2ZW50SGFuZGxlci5zdGFydCgpOwotCQkJdGhpcy5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMucmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgUkVTT1VSQ0VfQ0hBTkdFX0VWRU5UX1RZUEVTKTsKLQkJCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmFkZExpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lciwgRkFDRVRFRF9QUk9KRUNUX0VWRU5UX1RZUEVTKTsKLQkJCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyLCBKQVZBX0NIQU5HRV9FVkVOVF9UWVBFUyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXRoaXMuc3RvcF8oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpZGUtZWZmZWN0OiB7QGxpbmsgI2pwYVByb2plY3RzfSBwb3B1bGF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkSnBhUHJvamVjdHMoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmJ1aWxkSnBhUHJvamVjdHNfKCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGlmIHdlIGhhdmUgYSBwcm9ibGVtLCBsZWF2ZSB0aGUgY3VycmVudGx5IGJ1aWx0IEpQQSBwcm9qZWN0cyBpbgotCQkJLy8gcGxhY2UgYW5kIGtlZXAgZXhlY3V0aW5nIChzaG91bGQgYmUgT0suLi4pCi0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnVpbGRKcGFQcm9qZWN0c18oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmFjY2VwdChuZXcgUmVzb3VyY2VQcm94eVZpc2l0b3IoKSwgSVJlc291cmNlLk5PTkUpOwotCX0KLQotCS8qKgotCSAqIEludGVybmFsOiBjYWxsZWQgYnkge0BsaW5rIEpwdEpwYUNvcmVQbHVnaW4gRGFsaSBwbHVnLWlufS4KLQkgKi8KLQl2b2lkIHN0b3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQl0aGlzLnN0b3BfKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmxvY2sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BfKCkgewotCQlkZWJ1ZygiKioqIEpQQSBwcm9qZWN0IG1hbmFnZXIgU1RPUCAqKioiKTsgLy8kTk9OLU5MUy0xJAotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKHRoaXMuZmFjZXRlZFByb2plY3RMaXN0ZW5lcik7Ci0JCXRoaXMuZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcih0aGlzLnJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmV2ZW50SGFuZGxlci5zdG9wKCk7Ci0JCXRoaXMuY2xlYXJKcGFQcm9qZWN0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckpwYVByb2plY3RzKCkgewotCQkvLyBjbG9uZSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbnMKLQkJZm9yIChKcGFQcm9qZWN0IGpwYVByb2plY3QgOiB0aGlzLmdldEpwYVByb2plY3RzXygpKSB7Ci0JCQl0aGlzLnJlbW92ZUpwYVByb2plY3QoanBhUHJvamVjdCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhUHJvamVjdE1hbmFnZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEpwYVByb2plY3Q+IGdldEpwYVByb2plY3RzKCkgewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3RzXygpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5sb2NrLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8SnBhUHJvamVjdD4gZ2V0SnBhUHJvamVjdHNfKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpwYVByb2plY3Q+KHRoaXMuanBhUHJvamVjdHMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SnBhUHJvamVjdHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0cy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmxvY2suYWNxdWlyZSgpOwotCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdF8ocHJvamVjdCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLmxvY2sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldEpwYVByb2plY3RfKElQcm9qZWN0IHByb2plY3QpIHsKLQkJZm9yIChKcGFQcm9qZWN0IGpwYVByb2plY3QgOiB0aGlzLmpwYVByb2plY3RzKSB7Ci0JCQlpZiAoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZXF1YWxzKHByb2plY3QpKSB7Ci0JCQkJcmV0dXJuIGpwYVByb2plY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdChmaWxlLmdldFByb2plY3QoKSk7Ci0JCXJldHVybiAoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldEpwYUZpbGUoZmlsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVidWlsZEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXRoaXMucmVidWlsZEpwYVByb2plY3RfKHByb2plY3QpOwotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5sb2NrLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFzc3VtcHRpb246IHRoZSBKUEEgcHJvamVjdCBob2xkZXIgZXhpc3RzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlYnVpbGRKcGFQcm9qZWN0XyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMucmVtb3ZlSnBhUHJvamVjdCh0aGlzLmdldEpwYVByb2plY3RfKHByb2plY3QpKTsKLQkJdGhpcy5hZGRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lci5pc0FjdGl2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZShib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSkgewotCQl0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIuc2V0QWN0aXZlKGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSk7Ci0JfQotCi0JcHVibGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCXB1YmxpYyBJSm9iTWFuYWdlciBnZXRKb2JNYW5hZ2VyKCkgewotCQlyZXR1cm4gSm9iLmdldEpvYk1hbmFnZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWRkaW5nL3JlbW92aW5nIEpQQSBwcm9qZWN0cyAqKioqKioqKioqCi0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgYWRkSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMuYWRkSnBhUHJvamVjdCh0aGlzLmJ1aWxkSnBhUHJvamVjdChwcm9qZWN0KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEpwYVByb2plY3QoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCS8vIGZpZ3VyZSBvdXQgZXhhY3RseSB3aGVuIEpQQSBwcm9qZWN0cyBhcmUgYWRkZWQKLQkJZHVtcFN0YWNrVHJhY2UoImFkZDogIiwganBhUHJvamVjdCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gdGhlIEpQQSBwcm9qZWN0IHdpbGwgYmUgbnVsbCBpZiB3ZSBoYXZlIGFueSBwcm9ibGVtcyBidWlsZGluZyBpdC4uLgotCQkvLyAoZS5nLiBpZiB3ZSBoYXZlIHByb2JsZW1zIGdldHRpbmcgdGhlIEpQQSBwbGF0Zm9ybSkKLQkJaWYgKGpwYVByb2plY3QgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRJdGVtVG9Db2xsZWN0aW9uKGpwYVByb2plY3QsIHRoaXMuanBhUHJvamVjdHMsIEpQQV9QUk9KRUNUU19DT0xMRUNUSU9OKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJldHVybiBudWxsIGlmIHdlIGhhdmUgYW55IHByb2JsZW1zLi4uCi0JICovCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSnBhUHJvamVjdCh0aGlzLmJ1aWxkSnBhUHJvamVjdENvbmZpZyhwcm9qZWN0KSk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG51bGwgaWYgd2UgaGF2ZSBhbnkgcHJvYmxlbXMuLi4KLQkgKi8KLQlwcml2YXRlIEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZykgewotCQlKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSA9IGNvbmZpZy5nZXRKcGFQbGF0Zm9ybSgpOwotCQlpZiAoanBhUGxhdGZvcm0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5idWlsZEpwYVByb2plY3QoanBhUGxhdGZvcm0sIGNvbmZpZyk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWpwYVByb2plY3Quc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKHRoaXMuYnVpbGRKb2JDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoanBhUHJvamVjdCkpOwotCQlqcGFQcm9qZWN0LnNldFVwZGF0ZVN5bmNocm9uaXplcih0aGlzLmJ1aWxkSm9iVXBkYXRlU3luY2hyb25pemVyKGpwYVByb2plY3QpKTsKLQkJcmV0dXJuIGpwYVByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIG51bGwgaWYgd2UgaGF2ZSBhbnkgcHJvYmxlbXMuLi4KLQkgKi8KLQlwcml2YXRlIEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtLCBKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBqcGFQbGF0Zm9ybS5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKcGFQcm9qZWN0KGNvbmZpZyk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0LkNvbmZpZyBidWlsZEpwYVByb2plY3RDb25maWcoSVByb2plY3QgcHJvamVjdCkgewotCQlTaW1wbGVKcGFQcm9qZWN0Q29uZmlnIGNvbmZpZyA9IG5ldyBTaW1wbGVKcGFQcm9qZWN0Q29uZmlnKCk7Ci0JCWNvbmZpZy5zZXRQcm9qZWN0KHByb2plY3QpOwotCQljb25maWcuc2V0SnBhUGxhdGZvcm0oSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5idWlsZEpwYVBsYXRmb3JtSW1wbGVtZW50YXRpb24ocHJvamVjdCkpOwotCQljb25maWcuc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKHByb2plY3QpKTsKLQkJY29uZmlnLnNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKEpwdEpwYUNvcmVQbHVnaW4uZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2cocHJvamVjdCkpOwotCQljb25maWcuc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShKcHRKcGFDb3JlUGx1Z2luLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEocHJvamVjdCkpOwotCQljb25maWcuc2V0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKEpwdEpwYUNvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKHByb2plY3QpKTsKLQkJY29uZmlnLnNldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoSnB0SnBhQ29yZVBsdWdpbi5nZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKHByb2plY3QpKTsKLQkJcmV0dXJuIGNvbmZpZzsKLQl9Ci0KLQlwcml2YXRlIFN5bmNocm9uaXplciBidWlsZEpvYkNvbnRleHRNb2RlbFN5bmNocm9uaXplcihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBKb2JTeW5jaHJvbml6ZXIoCi0JCQkJdGhpcy5idWlsZENvbnRleHRNb2RlbEpvYk5hbWUoanBhUHJvamVjdCksCi0JCQkJdGhpcy5idWlsZENvbnRleHRNb2RlbEpvYkNvbW1hbmQoanBhUHJvamVjdCksCi0JCQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkKLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb250ZXh0TW9kZWxKb2JOYW1lKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlyZXR1cm4gTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLkNPTlRFWFRfTU9ERUxfU1lOQ19KT0JfTkFNRSwganBhUHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgSm9iQ29tbWFuZCBidWlsZENvbnRleHRNb2RlbEpvYkNvbW1hbmQoZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgSm9iQ29tbWFuZCgpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJcmV0dXJuIGpwYVByb2plY3Quc3luY2hyb25pemVDb250ZXh0TW9kZWwobW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDYWxsYmFja1N5bmNocm9uaXplciBidWlsZEpvYlVwZGF0ZVN5bmNocm9uaXplcihKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja0pvYlN5bmNocm9uaXplcigKLQkJCQl0aGlzLmJ1aWxkVXBkYXRlSm9iTmFtZShqcGFQcm9qZWN0KSwKLQkJCQl0aGlzLmJ1aWxkVXBkYXRlSm9iQ29tbWFuZChqcGFQcm9qZWN0KSwKLQkJCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKQotCQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFVwZGF0ZUpvYk5hbWUoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCXJldHVybiBOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuVVBEQVRFX0pPQl9OQU1FLCBqcGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKb2JDb21tYW5kIGJ1aWxkVXBkYXRlSm9iQ29tbWFuZChmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBKb2JDb21tYW5kKCkgewotCQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlyZXR1cm4ganBhUHJvamVjdC51cGRhdGUobW9uaXRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHJlbW92ZUpwYVByb2plY3QoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCS8vIGZpZ3VyZSBvdXQgZXhhY3RseSB3aGVuIEpQQSBwcm9qZWN0cyBhcmUgcmVtb3ZlZAotCQlkdW1wU3RhY2tUcmFjZSgicmVtb3ZlOiAiLCBqcGFQcm9qZWN0KTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqcGFQcm9qZWN0LCB0aGlzLmpwYVByb2plY3RzLCBKUEFfUFJPSkVDVFNfQ09MTEVDVElPTik7Ci0JCWpwYVByb2plY3QuZGlzcG9zZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcm9qZWN0IFBPU1RfQ0hBTkdFICoqKioqKioqKioKLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBwcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlKHRoaXMuYnVpbGRQcm9qZWN0Q2hhbmdlZENvbW1hbmQoZGVsdGEpKTsKLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRQcm9qZWN0Q2hhbmdlZENvbW1hbmQoZmluYWwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJQcm9qZWN0IFBPU1RfQ0hBTkdFIENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIudGhpcy5wcm9qZWN0Q2hhbmdlZF8oZGVsdGEpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIEZvcndhcmQgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBkZWx0YSB0byBhbGwgb3VyIEpQQSBwcm9qZWN0czsKLQkgKiB0aGV5IHdpbGwgZWFjaCBkZXRlcm1pbmUgd2hldGhlciB0aGUgZXZlbnQgaXMgc2lnbmlmaWNhbnQuCi0JICovCi0JLyogQ1UgcHJpdmF0ZSAqLyB2b2lkIHByb2plY3RDaGFuZ2VkXyhJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlmb3IgKEpwYVByb2plY3QganBhUHJvamVjdCA6IHRoaXMuanBhUHJvamVjdHMpIHsKLQkJCWpwYVByb2plY3QucHJvamVjdENoYW5nZWQoZGVsdGEpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByb2plY3QgUE9TVF9CVUlMRCAoQ0xFQU5fQlVJTEQpICoqKioqKioqKioKLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBwcm9qZWN0UG9zdENsZWFuQnVpbGQoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzLmV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQodGhpcy5idWlsZFByb2plY3RQb3N0Q2xlYW5CdWlsZENvbW1hbmQocHJvamVjdCkpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFByb2plY3RQb3N0Q2xlYW5CdWlsZENvbW1hbmQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoIlByb2plY3QgUE9TVF9CVUlMRCAoQ0xFQU5fQlVJTEQpIENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIudGhpcy5wcm9qZWN0UG9zdENsZWFuQnVpbGRfKHByb2plY3QpOwotCQkJfQotCQl9OwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBwcm9qZWN0UG9zdENsZWFuQnVpbGRfKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gdGhpcy5nZXRKcGFQcm9qZWN0Xyhwcm9qZWN0KTsKLQkJaWYgKGpwYVByb2plY3QgIT0gbnVsbCkgewotCQkJdGhpcy5yZW1vdmVKcGFQcm9qZWN0KGpwYVByb2plY3QpOwotCQkJdGhpcy5hZGRKcGFQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEZpbGUgUE9TVF9DSEFOR0UgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEZhY2V0ZWQgUHJvamVjdCBzZXR0aW5ncyBmaWxlIGhhcyBjaGFuZ2VkIGluIHNvbWUgZmFzaGlvbiwgY2hlY2sKLQkgKiB3aGV0aGVyIHRoZSBKUEEgZmFjZXQgaGFzIGJlZW4gYWRkZWQgdG8gb3IgcmVtb3ZlZCBmcm9tIHRoZSBzcGVjaWZpZWQKLQkgKiBwcm9qZWN0LgotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBjaGVja0ZvckpwYUZhY2V0VHJhbnNpdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdF8ocHJvamVjdCk7Ci0KLQkJaWYgKEpwYUZhY2V0LmlzSW5zdGFsbGVkKHByb2plY3QpKSB7Ci0JCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7ICAvLyBKUEEgZmFjZXQgYWRkZWQKLQkJCQl0aGlzLmV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQodGhpcy5idWlsZEFkZEpwYVByb2plY3RDb21tYW5kKHByb2plY3QpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsgIC8vIEpQQSBmYWNldCByZW1vdmVkCi0JCQkJdGhpcy5leGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKHRoaXMuYnVpbGRSZW1vdmVKcGFQcm9qZWN0Q29tbWFuZChqcGFQcm9qZWN0KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbW1hbmQgYnVpbGRBZGRKcGFQcm9qZWN0Q29tbWFuZChmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBuZXcgRXZlbnRIYW5kbGVyQ29tbWFuZCgiQWRkIEpQQSBQcm9qZWN0IENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIudGhpcy5hZGRKcGFQcm9qZWN0KHByb2plY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZFJlbW92ZUpwYVByb2plY3RDb21tYW5kKGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoIlJlbW92ZSBKUEEgUHJvamVjdCBDb21tYW5kIikgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQkJR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyLnRoaXMucmVtb3ZlSnBhUHJvamVjdChqcGFQcm9qZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRmFjZXRlZFByb2plY3QgUFJFX1VOSU5TVEFMTCAqKioqKioqKioqCi0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQganBhRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGwoSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBldmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQl0aGlzLmV4ZWN1dGVBZnRlckV2ZW50c0hhbmRsZWQodGhpcy5idWlsZEpwYUZhY2V0ZWRQcm9qZWN0UHJlVW5pbnN0YWxsQ29tbWFuZChwcm9qZWN0KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21tYW5kIGJ1aWxkSnBhRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGxDb21tYW5kKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIG5ldyBFdmVudEhhbmRsZXJDb21tYW5kKCJGYWNldGVkIFByb2plY3QgUFJFX1VOSU5TVEFMTCBDb21tYW5kIikgeyAvLyROT04tTkxTLTEkCi0JCQlAT3ZlcnJpZGUKLQkJCXZvaWQgZXhlY3V0ZV8oKSB7Ci0JCQkJR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyLnRoaXMuanBhRmFjZXRlZFByb2plY3RQcmVVbmluc3RhbGxfKHByb2plY3QpOwotCQkJfQotCQl9OwotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gdm9pZCBqcGFGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbF8oSVByb2plY3QgcHJvamVjdCkgewotCQkvLyBhc3N1bWUoPykgdGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byByZW1vdmUgdGhlIEpQQSBwcm9qZWN0IGZyb20gdGhlIEpQQSBwcm9qZWN0IG1hbmFnZXIKLQkJdGhpcy5yZW1vdmVKcGFQcm9qZWN0KHRoaXMuZ2V0SnBhUHJvamVjdF8ocHJvamVjdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGVsZW1lbnQgY2hhbmdlZCAqKioqKioqKioqCi0KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZSh0aGlzLmJ1aWxkSmF2YUVsZW1lbnRDaGFuZ2VkQ29tbWFuZChldmVudCkpOwotCX0KLQotCXByaXZhdGUgQ29tbWFuZCBidWlsZEphdmFFbGVtZW50Q2hhbmdlZENvbW1hbmQoZmluYWwgRWxlbWVudENoYW5nZWRFdmVudCBldmVudCkgewotCQlyZXR1cm4gbmV3IEV2ZW50SGFuZGxlckNvbW1hbmQoIkphdmEgZWxlbWVudCBjaGFuZ2VkIENvbW1hbmQiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUBPdmVycmlkZQotCQkJdm9pZCBleGVjdXRlXygpIHsKLQkJCQlHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIudGhpcy5qYXZhRWxlbWVudENoYW5nZWRfKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBKYXZhIGVsZW1lbnQgY2hhbmdlZCBldmVudCB0byBhbGwgdGhlIEpQQSBwcm9qZWN0cwotCSAqIGJlY2F1c2UgdGhlIGV2ZW50IGNvdWxkIGFmZmVjdCBtdWx0aXBsZSBwcm9qZWN0cy4KLQkgKi8KLQkvKiBDVSBwcml2YXRlICovIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkXyhFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSnBhUHJvamVjdCBqcGFQcm9qZWN0IDogdGhpcy5qcGFQcm9qZWN0cykgewotCQkJanBhUHJvamVjdC5qYXZhRWxlbWVudENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5qcGFQcm9qZWN0cyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV2ZW50IGhhbmRsZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgdGhlIGV2ZW50IGhhbmRsZXIgaXMgZXhlY3V0aW5nIGFzeW5jaHJvbm91c2x5Ojxicj4KLQkgKiBBbGxvdyBhbGwgdGhlIGNvbW1hbmRzIGN1cnJlbnRseSBvbiB0aGUgY29tbWFuZCBleGVjdXRvcidzIHF1ZXVlIHRvIGV4ZWN1dGUuCi0JICogT25jZSB0aGV5IGhhdmUgZXhlY3V0ZWQsIHN1c3BlbmQgdGhlIGNvbW1hbmQgZXhlY3V0b3IgYW5kIHByb2Nlc3MgdGhlCi0JICogc3BlY2lmaWVkIGNvbW1hbmQgKG9uIDxlbT50aGlzPC9lbT4gdGhyZWFkLCA8ZW0+bm90PC9lbT4gdGhlIGNvbW1hbmQKLQkgKiBleGVjdXRvciB0aHJlYWQpLiBPbmNlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBpcyBmaW5pc2hlZCwgYWxsb3cgdGhlCi0JICogY29tbWFuZCBleGVjdXRvciB0byByZXN1bWUgcHJvY2Vzc2luZyBpdHMgY29tbWFuZCBxdWV1ZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgZXZlbnQgaGFuZGxlciBpcyBleGVjdXRpbmcgc3luY2hyb25vdXNseTo8YnI+Ci0JICogQWxsIHRoZSBldmVudHMgaGF2ZSBhbHJlYWR5IGJlZW4gaGFuZGxlZCBzeW5jaHJvbm91c2x5LCBzbyB3ZSBzaW1wbHkKLQkgKiBleGVjdXRlIHRoZSBzcGVjaWZpZWQgY29tbWFuZCBbc29ydGFdIGRpcmVjdGx5LgotCSAqLwotCXByaXZhdGUgdm9pZCBleGVjdXRlQWZ0ZXJFdmVudHNIYW5kbGVkKENvbW1hbmQgY29tbWFuZCkgewotCQlTeW5jaHJvbml6ZWRCb29sZWFuIGZsYWcgPSBuZXcgU3luY2hyb25pemVkQm9vbGVhbihmYWxzZSk7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyLmV4ZWN1dGUobmV3IFBhdXNlQ29tbWFuZChmbGFnKSk7Ci0JCXRyeSB7Ci0JCQlmbGFnLndhaXRVbnRpbFRydWUoKTsKLQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGlnbm9yZSAtIG5vdCBzdXJlIHdoeSB0aGlzIHRocmVhZCB3b3VsZCBiZSBpbnRlcnJ1cHRlZAotCQl9Ci0JCXRyeSB7Ci0JCQljb21tYW5kLmV4ZWN1dGUoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZsYWcuc2V0RmFsc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoaXMgInBhdXNlIiBjb21tYW5kIGlzIGV4ZWN1dGluZyAoYXN5bmNocm9ub3VzbHkpIG9uIGEgZGlmZmVyZW50Ci0JICogdGhyZWFkIHRoYW4gdGhlIEpQQSBwcm9qZWN0IG1hbmFnZXI6PG9sPgotCSAqIDxsaT5pdCB3aWxsIHNldCB0aGUgZmxhZyB0byA8Y29kZT50cnVlPC9jb2RlPiwgYWxsb3dpbmcgdGhlIEpQQSBwcm9qZWN0Ci0JICogbWFuYWdlciB0byByZXN1bWUgZXhlY3V0aW5nIG9uIGl0cyBvd24gdGhyZWFkCi0JICogPGxpPnRoZW4gaXQgd2lsbCBzdXNwZW5kIGl0cyBjb21tYW5kIGV4ZWN1dG9yIHVudGlsIHRoZSBKUEEgcHJvamVjdAotCSAqIG1hbmFnZXIgc2V0cyB0aGUgZmxhZyBiYWNrIHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiA8L29sPgotCSAqIElmIHRoaXMgInBhdXNlIiBjb21tYW5kIGlzIGV4ZWN1dGluZyAoc3luY2hyb25vdXNseSkgb24gdGhlIHNhbWUgdGhyZWFkCi0JICogYXMgdGhlIEpQQSBwcm9qZWN0IG1hbmFnZXIsIGl0IHdpbGwgc2ltcGx5IHNldCB0aGUgZmxhZyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGFuZCByZXR1cm4uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF1c2VDb21tYW5kCi0JCWltcGxlbWVudHMgQ29tbWFuZAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBUaHJlYWQgcHJvZHVjZXJUaHJlYWQ7Ci0JCXByaXZhdGUgZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBmbGFnOwotCi0JCVBhdXNlQ29tbWFuZChTeW5jaHJvbml6ZWRCb29sZWFuIGZsYWcpIHsKLQkJCXRoaXMoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgZmxhZyk7Ci0JCX0KLQotCQlQYXVzZUNvbW1hbmQoVGhyZWFkIHByb2R1Y2VyVGhyZWFkLCBTeW5jaHJvbml6ZWRCb29sZWFuIGZsYWcpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByb2R1Y2VyVGhyZWFkID0gcHJvZHVjZXJUaHJlYWQ7Ci0JCQl0aGlzLmZsYWcgPSBmbGFnOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRoaXMuZmxhZy5zZXRUcnVlKCk7Ci0JCQlpZiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSAhPSB0aGlzLnByb2R1Y2VyVGhyZWFkKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJdGhpcy5mbGFnLndhaXRVbnRpbEZhbHNlKCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlIC0gdGhlIGNvbW1hbmQgZXhlY3V0b3Igd2lsbCBjaGVjayBmb3IgaW50ZXJydXB0aW9ucwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCAodmlhIHJlZmxlY3Rpb24pIHdoZW4gdGhlIHRlc3QgcGx1Zy1pbiBpcyBsb2FkZWQuCi0JICogU2VlIEpwdENvcmVUZXN0c1BsdWdpbiNzdGFydChCdW5kbGVDb250ZXh0KQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBoYW5kbGVFdmVudHNTeW5jaHJvbm91c2x5KCkgewotCQl0cnkgewotCQkJdGhpcy5sb2NrLmFjcXVpcmUoKTsKLQkJCXRoaXMuaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXZlbnRzU3luY2hyb25vdXNseV8oKSB7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyLnN0b3AoKTsKLQkJdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgU2ltcGxlQ29tbWFuZEV4ZWN1dG9yKCk7Ci0JCXRoaXMuZXZlbnRIYW5kbGVyLnN0YXJ0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIHByb3h5IHZpc2l0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogVmlzaXQgdGhlIHdvcmtzcGFjZSByZXNvdXJjZSB0cmVlLCBhZGRpbmcgYSBKUEEgcHJvamVjdCB0byB0aGUKLQkgKiBKUEEgcHJvamVjdCBtYW5hZ2VyIGZvciBlYWNoIG9wZW4gRWNsaXBzZSBwcm9qZWN0IHRoYXQgaGFzIGEgSlBBIGZhY2V0LgotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVzb3VyY2VQcm94eVZpc2l0b3IKLQkJaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IKLQl7Ci0JCVJlc291cmNlUHJveHlWaXNpdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHJlc291cmNlUHJveHkpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2VQcm94eS5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyBhbGwgcHJvamVjdHMgYXJlIGluIHRoZSAicm9vdCIKLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJdGhpcy5wcm9jZXNzUHJvamVjdChyZXNvdXJjZVByb3h5KTsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gbmVzdGVkIHByb2plY3RzCi0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIGlnbm9yZQotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Byb2plY3QoSVJlc291cmNlUHJveHkgcmVzb3VyY2VQcm94eSkgewotCQkJaWYgKHJlc291cmNlUHJveHkuaXNBY2Nlc3NpYmxlKCkpIHsgIC8vIHRoZSBwcm9qZWN0IGV4aXN0cyBhbmQgaXMgb3BlbgotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlUHJveHkucmVxdWVzdFJlc291cmNlKCk7Ci0JCQkJaWYgKEpwYUZhY2V0LmlzSW5zdGFsbGVkKHByb2plY3QpKSB7Ci0JCQkJCUdlbmVyaWNKcGFQcm9qZWN0TWFuYWdlci50aGlzLmFkZEpwYVByb2plY3QocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGV2ZW50IGhhbmRsZXIgY29tbWFuZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb21tYW5kIHRoYXQgaG9sZHMgdGhlIEpQQSBwcm9qZWN0IG1hbmFnZXIgbG9jayB3aGlsZQotCSAqIGV4ZWN1dGluZy4KLQkgKi8KLQlwcml2YXRlIGFic3RyYWN0IGNsYXNzIEV2ZW50SGFuZGxlckNvbW1hbmQKLQkJaW1wbGVtZW50cyBDb21tYW5kCi0JewotCQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JCUV2ZW50SGFuZGxlckNvbW1hbmQoU3RyaW5nIG5hbWUpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCXRyeSB7Ci0JCQkJR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyLnRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQkJdGhpcy5leGVjdXRlXygpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgewotCQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyLnRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlhYnN0cmFjdCB2b2lkIGV4ZWN1dGVfKCk7Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcml2YXRlIGNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIKLQkJaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcgotCXsKLQkJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUFJFX1VOSU5TVEFMTCBpcyB0aGUgb25seSBmYWNldCBldmVudCB3ZSB1c2UgZm9yIAotCQkgKiByZW1vdmluZyBKUEEgcHJvamVjdHMuIFRoZXNlIGFyZSB0aGUgY2FzZXMgd2hlcmUgd2UgbGlzdGVuIGZvciByZXNvdXJjZSBldmVudHMuCi0JCSAqIDxwPgotCQkgKiBDaGVjayBmb3I6PHVsPgotCQkgKiA8bGk+ZmFjZXQgc2V0dGluZ3MgZmlsZSBhZGRlZC9yZW1vdmVkL2NoYW5nZWQKLQkJICogKDxjb2RlPi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sPC9jb2RlPikKLQkJICogPGxpPmZpbGUgYWRkL3JlbW92ZSAtIGZvcndhcmRlZCB0byB0aGUgaW5kaXZpZHVhbCBKUEEgcHJvamVjdHMKLQkJICogPGxpPnByb2plY3QgY2xlYW4KLQkJICogPC91bD4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZUV2ZW50KGV2ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQkvLyB3b3Jrc3BhY2Ugb3IgcHJvamVjdCBldmVudHMKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9SRUZSRVNIIDoKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEIDoKLQkJCQkJdGhpcy5wcm9jZXNzUG9zdEJ1aWxkRXZlbnQoZXZlbnQpOwotCQkJCQlicmVhazsKLQotCQkJCS8vIHByb2plY3Qtb25seSBldmVudHMKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSA6ICAKLQkJCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgOgotCQkJCQlicmVhazsgIC8vIGlnbm9yZQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZUV2ZW50KElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlkZWJ1ZygiUmVzb3VyY2UgUE9TVF9DSEFOR0UiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5wcm9jZXNzUG9zdENoYW5nZURlbHRhKGV2ZW50LmdldERlbHRhKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlRGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlzd2l0Y2ggKHJlc291cmNlLmdldFR5cGUoKSkgewotCQkJCWNhc2UgSVJlc291cmNlLlJPT1QgOgotCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlUm9vdERlbHRhKGRlbHRhKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VQcm9qZWN0RGVsdGEoZGVsdGEpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZS5GT0xERVIgOgotCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRm9sZGVyRGVsdGEoKElGb2xkZXIpIHJlc291cmNlLCBkZWx0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRmlsZURlbHRhKChJRmlsZSkgcmVzb3VyY2UsIGRlbHRhKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gKioqKiogUE9TVF9DSEFOR0UgUk9PVAotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VSb290RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJfQotCi0JCS8vICoqKioqIFBPU1RfQ0hBTkdFIFBST0pFQ1QKLQkJLyoqCi0JCSAqIFByb2Nlc3MgdGhlIHByb2plY3QgZmlyc3QgZm9yIHRoZSBPcGVuaW5nIHByb2plY3QgY2FzZS4KLQkJICogVGhlIEpQQSBwcm9qZWN0IHdpbGwgbm90IGJlIGJ1aWx0IHVudGlsIHRoZSBjaGlsZHJlbiBhcmUgcHJvY2Vzc2VkCi0JCSAqIGFuZCB3ZSBzZWUgdGhhdCB0aGUgZmFjZXQgbWV0YWRhdGEgZmlsZSBpcyBhZGRlZC4KLQkJICogT3RoZXJ3aXNlIHRoZSBKUEEgcHJvamVjdCB3b3VsZCBiZSBidWlsdCBhbmQgdGhlbiB3ZSB3b3VsZCBwcm9jZXNzCi0JCSAqIHRoZSBBRERFRCBkZWx0YXMgZm9yIGFsbCB0aGUgZmlsZXMgaW4gdGhlIHByb2plY3QuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VQcm9qZWN0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCUdlbmVyaWNKcGFQcm9qZWN0TWFuYWdlci50aGlzLnByb2plY3RDaGFuZ2VkKGRlbHRhKTsKLQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJfQotCi0JCS8vICoqKioqIFBPU1RfQ0hBTkdFIEZPTERFUgotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RDaGFuZ2VGb2xkZXJEZWx0YShJRm9sZGVyIGZvbGRlciwgSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWlmIChmb2xkZXIuZ2V0TmFtZSgpLmVxdWFscygiLnNldHRpbmdzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHJvY2Vzc1Bvc3RDaGFuZ2VEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQkJCX0KLQkJfQotCi0JCS8vICoqKioqIFBPU1RfQ0hBTkdFIEZJTEUKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2hhbmdlRmlsZURlbHRhKElGaWxlIGZpbGUsIElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKEZBQ0VURURfUFJPSkVDVF9GUkFNRVdPUktfU0VUVElOR1NfRklMRV9OQU1FKSkgewotCQkJCXRoaXMuY2hlY2tGb3JGYWNldEZpbGVDaGFuZ2VzKGZpbGUsIGRlbHRhKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGNoZWNrRm9yRmFjZXRGaWxlQ2hhbmdlcyhJRmlsZSBmaWxlLCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJc3dpdGNoIChkZWx0YS5nZXRLaW5kKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRUQgOgotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6IAotCQkJCQlHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIudGhpcy5jaGVja0ZvckpwYUZhY2V0VHJhbnNpdGlvbihmaWxlLmdldFByb2plY3QoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT00gOgotCQkJCQlicmVhazsgIC8vIGlnbm9yZQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENoYW5nZURlbHRhQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWZvciAoSVJlc291cmNlRGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2hhbmdlRGVsdGEoY2hpbGQpOyAgLy8gcmVjdXJzZQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEEgcG9zdCBidWlsZCBldmVudCBoYXMgb2NjdXJyZWQuCi0JCSAqIENoZWNrIGZvciB3aGV0aGVyIHRoZSBidWlsZCB3YXMgYSAiY2xlYW4iIGJ1aWxkIGFuZCB0cmlnZ2VyIHByb2plY3QgdXBkYXRlLgotCQkgKi8KLQkJLy8gKioqKiogUE9TVF9CVUlMRAotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1Bvc3RCdWlsZEV2ZW50KElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlkZWJ1ZygiUmVzb3VyY2UgUE9TVF9CVUlMRDogIiwgZXZlbnQuZ2V0UmVzb3VyY2UoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChldmVudC5nZXRCdWlsZEtpbmQoKSA9PSBJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxEKSB7Ci0JCQkJdGhpcy5wcm9jZXNzUG9zdENsZWFuQnVpbGREZWx0YShldmVudC5nZXREZWx0YSgpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUG9zdENsZWFuQnVpbGREZWx0YShJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6Ci0JCQkJCXRoaXMucHJvY2Vzc1Bvc3RDbGVhbkJ1aWxkRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQl0aGlzLnByb2Nlc3NQcm9qZWN0UG9zdENsZWFuQnVpbGQoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJY2FzZSBJUmVzb3VyY2UuRklMRSA6Ci0JCQkJCWJyZWFrOyAgLy8gaWdub3JlCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NQb3N0Q2xlYW5CdWlsZERlbHRhQ2hpbGRyZW4oSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCWZvciAoSVJlc291cmNlRGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQl0aGlzLnByb2Nlc3NQb3N0Q2xlYW5CdWlsZERlbHRhKGNoaWxkKTsgIC8vIHJlY3Vyc2UKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzUHJvamVjdFBvc3RDbGVhbkJ1aWxkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWRlYnVnKCJcdFByb2plY3QgQ0xFQU46ICIsIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyLnRoaXMucHJvamVjdFBvc3RDbGVhbkJ1aWxkKHByb2plY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY2V0ZWQgcHJvamVjdCBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBGYWNldGVkIHByb2plY3QgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpQQSBwcm9qZWN0IG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBGYWNldGVkUHJvamVjdExpc3RlbmVyCi0JCWltcGxlbWVudHMgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIKLQl7Ci0JCUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENoZWNrIGZvcjo8dWw+Ci0JCSAqIDxsaT51bi1pbnN0YWxsIG9mIEpQQSBmYWNldAotCQkgKiA8L3VsPgotCQkgKi8KLQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQpIHsKLQkJCXN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBQUkVfVU5JTlNUQUxMIDoKLQkJCQkJdGhpcy5wcm9jZXNzUHJlVW5pbnN0YWxsRXZlbnQoKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1ByZVVuaW5zdGFsbEV2ZW50KElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCBldmVudCkgewotCQkJZGVidWcoIkZhY2V0IFBSRV9VTklOU1RBTEw6ICIsIGV2ZW50LmdldFByb2plY3RGYWNldCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGV2ZW50LmdldFByb2plY3RGYWNldCgpLmVxdWFscyhKcGFGYWNldC5GQUNFVCkpIHsKLQkJCQlHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIudGhpcy5qcGFGYWNldGVkUHJvamVjdFByZVVuaW5zdGFsbChldmVudCk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBlbGVtZW50IGNoYW5nZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGb3J3YXJkIHRoZSBKYXZhIGVsZW1lbnQgY2hhbmdlIGV2ZW50IGJhY2sgdG8gdGhlIEpQQSBwcm9qZWN0IG1hbmFnZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyCi0JCWltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIKLQl7Ci0JCS8qKgotCQkgKiBBIGZsYWcgdG8gYWN0aXZhdGUvZGVhY3RpdmF0ZSB0aGUgbGlzdGVuZXIKLQkJICogc28gd2UgY2FuIGlnbm9yZSBKYXZhIGV2ZW50cyB3aGVuZXZlciBEYWxpIGlzIG1hbmlwdWxhdGluZyB0aGUgSmF2YQotCQkgKiBzb3VyY2UgY29kZSB2aWEgdGhlIERhbGkgbW9kZWwuIFdlIGRvIHRoaXMgYmVjYXVzZSB0aGUgMC41IHNlYyBkZWxheQotCQkgKiBiZXR3ZWVuIHRoZSBKYXZhIHNvdXJjZSBiZWluZyBjaGFuZ2VkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBldmVudAotCQkgKiBiZWluZyBmaXJlZCBjYXVzZXMgdXMgbm8gZW5kIG9mIHBhaW4uCi0JCSAqLwotCQlwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gYWN0aXZlID0gdHJ1ZTsKLQotCQlKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCWlmICh0aGlzLmFjdGl2ZSkgewotCQkJCUdlbmVyaWNKcGFQcm9qZWN0TWFuYWdlci50aGlzLmphdmFFbGVtZW50Q2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCQkvLyBUT0RPIHNhdmUgdW5oYW5kbGVkIGV2ZW50cyBhbmQgcHJvY2VzcyB3aGVuIGxpc3RlbmVyIGlzIHJlYWN0aXZhdGVkPwotCQl9Ci0KLQkJdm9pZCBzZXRBY3RpdmUoYm9vbGVhbiBhY3RpdmUpIHsKLQkJCXRoaXMuYWN0aXZlID0gYWN0aXZlOwotCQl9Ci0KLQkJYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJCXJldHVybiB0aGlzLmFjdGl2ZTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcyk7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBERUJVRyAqKioqKioqKioqCi0KLQkvLyBAc2VlIEpwYVByb2plY3RNYW5hZ2VyVGVzdHMjdGVzdERFQlVHKCkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQkvKioKLQkgKiB0cmlnZ2VyICN0b1N0cmluZygpIGNhbGwgYW5kIHN0cmluZyBjb25jYXRlbmF0aW9uIG9ubHkgaWYgREVCVUcgaXMgdHJ1ZQotCSAqLwotCS8qIENVIHByaXZhdGUgKi8gc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlkZWJ1Z18obWVzc2FnZSArIG9iamVjdCk7Ci0JCX0KLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIHN0YXRpYyB2b2lkIGRlYnVnKFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChERUJVRykgewotCQkJZGVidWdfKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWJ1Z18oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIjogIiArIG1lc3NhZ2UpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZSgpIHsKLQkJZHVtcFN0YWNrVHJhY2UobnVsbCk7Ci0JfQotCi0JLyogQ1UgcHJpdmF0ZSAqLyBzdGF0aWMgdm9pZCBkdW1wU3RhY2tUcmFjZShTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IG9iamVjdCkgewotCQlpZiAoREVCVUcpIHsKLQkJCWR1bXBTdGFja1RyYWNlXyhtZXNzYWdlICsgb2JqZWN0KTsKLQkJfQotCX0KLQotCS8qIENVIHByaXZhdGUgKi8gc3RhdGljIHZvaWQgZHVtcFN0YWNrVHJhY2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlkdW1wU3RhY2tUcmFjZV8obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXBTdGFja1RyYWNlXyhTdHJpbmcgbWVzc2FnZSkgewotCQkvLyBsb2NrIFN5c3RlbS5vdXQgc28gdGhlIHN0YWNrIGVsZW1lbnRzIGFyZSBwcmludGVkIG91dCBjb250aWd1b3VzbHkKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJZGVidWdfKG1lc3NhZ2UpOwotCQkJfQotCQkJU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRTdGFja1RyYWNlKCk7Ci0JCQkvLyBza2lwIHRoZSBmaXJzdCAzIGVsZW1lbnRzIC0gdGhvc2UgYXJlIHRoaXMgbWV0aG9kIGFuZCAyIG1ldGhvZHMgaW4gVGhyZWFkCi0JCQlmb3IgKGludCBpID0gMzsgaSA8IHN0YWNrVHJhY2UubGVuZ3RoOyBpKyspIHsKLQkJCQlTdGFja1RyYWNlRWxlbWVudCBlbGVtZW50ID0gc3RhY2tUcmFjZVtpXTsKLQkJCQlpZiAoZWxlbWVudC5nZXRNZXRob2ROYW1lKCkuZXF1YWxzKCJpbnZva2UwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsgIC8vIHNraXAgYWxsIGVsZW1lbnRzIG91dHNpZGUgb2YgdGhlIEpVbml0IHRlc3QKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdCIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmE3M2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotCi0KLS8qKgotICogUHJvdmlkZXMgYW5ub3RhdGlvbiBkZWZpbml0aW9ucyBhbmQgbmVzdGFibGUgYW5ub3RhdGlvbiBkZWZpbml0aW9ucwotICoge0BsaW5rIEFubm90YXRpb25Qcm92aWRlcn0KLSAqIHRoZW4gdXNlcyBhIGNvbGxlY3Rpb24gb2YgdGhlc2UgdG8gYnVpbGQgYW5ub3RhdGlvbnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi17Ci0JLyoqCi0JICogUmV0dXJuIGFsbCBhbm5vdGF0aW9uIGRlZmluaXRpb25zCi0JICovCi0JSXRlcmFibGU8QW5ub3RhdGlvbkRlZmluaXRpb24+IGdldEFubm90YXRpb25EZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBuZXN0YWJsZSBhbm5vdGF0aW9uIGRlZmluaXRpb25zCi0JICovCi0JSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhRGF0YVNvdXJjZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhRGF0YVNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjEwYTQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYURhdGFTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFEYXRhU291cmNlCi0JZXh0ZW5kcyBKcGFOb2RlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YSBzb3VyY2UncyBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZS4KLQkgKiBUaGUgY29ubmVjdGlvbiBwcm9maWxlIGlzIGxvb2tlZCB1cCBiYXNlZCBvbiB0aGlzIHNldHRpbmcuCi0JICovCi0JU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBkYXRhIHNvdXJjZSdzIGNvbm5lY3Rpb24gcHJvZmlsZSBuYW1lLgotCSAqIFRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgbG9va2VkIHVwIGJhc2VkIG9uIHRoaXMgc2V0dGluZy4KLQkgKi8KLQl2b2lkIHNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQotCS8qKgotCSAqIElEIHN0cmluZyB1c2VkIHdoZW4gY29ubmVjdGlvblByb2ZpbGVOYW1lIHByb3BlcnR5IGlzIGNoYW5nZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbCNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JU3RyaW5nIENPTk5FQ1RJT05fUFJPRklMRV9OQU1FX1BST1BFUlRZID0gImNvbm5lY3Rpb25Qcm9maWxlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjb25uZWN0aW9uIHByb2ZpbGUgaXMgbnVsbCBpZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCi0JLyoqCi0JICogSUQgc3RyaW5nIHVzZWQgd2hlbiBjb25uZWN0aW9uUHJvZmlsZSBwcm9wZXJ0eSBpcyBjaGFuZ2VkCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWwjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCVN0cmluZyBDT05ORUNUSU9OX1BST0ZJTEVfUFJPUEVSVFkgPSAiY29ubmVjdGlvblByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBlaXRoZXIgY29ubmVjdGVkIHRvIGEgbGl2ZSBkYXRhYmFzZQotCSAqIHNlc3Npb24gb3Igd29ya2luZyBvZmYtbGluZSAoaS5lLiBpdCBoYXMgYWNjZXNzIHRvIG1ldGEtZGF0YSkuCi0JICovCi0JYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzIGFjdGl2ZSwgcmV0dXJuIGl0cyBkYXRhYmFzZS4KLQkgKi8KLQlEYXRhYmFzZSBnZXREYXRhYmFzZSgpOwotCi0JLyoqCi0JICogU2VsZWN0IGFuZCByZXR1cm4gdGhlIHRhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLgotCSAqIFdlIG5lZWQgdGhpcyB1bnVzdWFsIG1ldGhvZCBiZWNhdXNlIHRoZSBKUEEgc3BlYyBkb2VzIG5vdCBhbGxvdyBjb2x1bW5zCi0JICogb3Igam9pbiBjb2x1bW5zIHRvIHNwZWNpZnkgYSBzY2hlbWEgYW5kL29yIGNhdGFsb2cgKHdoaWNoIGlzIG9ubHkgYQotCSAqIHByb2JsZW0gd2hlbiBhbiBlbnRpdHkgaGFzIHR3byB0YWJsZXMgZnJvbSBkaWZmZXJlbnQgc2NoZW1hdGEgYnV0IHdpdGgKLQkgKiB0aGUgc2FtZSBuYW1lKS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nI3Jlc29sdmVEYlRhYmxlKFN0cmluZykKLQkgKi8KLQlUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogRGlzcG9zZSB0aGUgZGF0YSBzb3VyY2UuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYUZhY2V0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFGYWNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDljYjRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYUZhY2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSnBhRmFjZXQgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImpwdC5qcGEiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJUHJvamVjdEZhY2V0IEZBQ0VUID0gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElEKTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFZFUlNJT05fMV8wID0gRkFDRVQuZ2V0VmVyc2lvbigiMS4wIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXRWZXJzaW9uIFZFUlNJT05fMl8wID0gRkFDRVQuZ2V0VmVyc2lvbigiMi4wIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbnN0YWxsZWQoZmluYWwgSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBJRCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogTm90IGZvciBpbnN0YW50aWF0aW9uCi0JICovCi0JcHJpdmF0ZSBKcGFGYWNldCgpIHt9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NjA1ZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFMb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db21wbGV0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bWVyYXRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci0KLS8qKgotICogVXNlIGEgSlBBIGZhY3RvcnkgdG8gYnVpbGQgYW55IGNvcmUgKGUuZy4ge0BsaW5rIEpwYVByb2plY3R9KQotICogbW9kZWwgb2JqZWN0IG9yIGFueSBKYXZhIChlLmcuIHtAbGluayBKYXZhRW50aXR5fSksIE9STSAoZS5nLgotICoge0BsaW5rIEVudGl0eU1hcHBpbmdzfSksIG9yIHBlcnNpc3RlbmNlIChlLmcuIHtAbGluayBQZXJzaXN0ZW5jZVVuaXR9KQotICogY29udGV4dCBtb2RlbCBvYmplY3RzLgotICogPHA+Ci0gKiBBc3N1bWVzIGEgYmFzZSBKUEEgcHJvamVjdCBjb250ZXh0IHN0cnVjdHVyZSAKLSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpQQSBzcGVjOjx1bD4KLSAqIDxsaT5Sb290Q29udGV4dDx1bD4KLSAqICAgICA8bGk+cGVyc2lzdGVuY2UueG1sPHVsPgotICogICAgICAgICA8bGk+cGVyc2lzdGVuY2UgdW5pdChzKTx1bD4KLSAqICAgICAgICAgICAgIDxsaT5tYXBwaW5nIGZpbGUocykgIChlLmcuIDxjb2RlPm9ybS54bWw8L2NvZGU+KTx1bD4KLSAqICAgICAgICAgICAgICAgICA8bGk+dHlwZSBtYXBwaW5nKHMpICAoZS5nLiBFbnRpdHkpPHVsPgotICogICAgICAgICAgICAgICAgICAgICA8bGk+YXR0cmlidXRlIG1hcHBpbmcocykgIChlLmcuIEJhc2ljKQotICogICAgICAgICAgICAgICAgIDwvdWw+Ci0gKiAgICAgICAgICAgICA8L3VsPgotICogICAgICAgICAgICAgPGxpPnR5cGUgbWFwcGluZyhzKQotICogICAgICAgICA8L3VsPgotICogICAgIDwvdWw+Ci0gKiA8L3VsPgotICogPC91bD4KLSAqICAgLi4uIGFuZCBhc3NvY2lhdGVkIG9iamVjdHMuCi0gKjxwPiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuR2VuZXJpY0pwYUZhY3RvcnkKLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhRmFjdG9yeSAKLXsKLQkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgotCQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpwYVByb2plY3QgZm9yIHRoZSBzcGVjaWZpZWQgY29uZmlnLCB0byBiZQotCSAqIGFkZGVkIHRvIHRoZSBzcGVjaWZpZWQgSlBBIHByb2plY3QuIFJldHVybiBudWxsIGlmIHVuYWJsZSB0byBjcmVhdGUKLQkgKiB0aGUgSlBBIGZpbGUgKGUuZy4gdGhlIGNvbnRlbnQgdHlwZSBpcyB1bnJlY29nbml6ZWQpLgotCSAqLwotCUpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KEpwYVByb2plY3QuQ29uZmlnIGNvbmZpZyk7Ci0JCi0JSnBhRGF0YVNvdXJjZSBidWlsZEpwYURhdGFTb3VyY2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKTsKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIEpQQSBmaWxlIGZvciB0aGUgc3BlY2lmaWVkIEpQQSBwcm9qZWN0LCBmaWxlLCBjb250ZW50IHR5cGUsCi0JICogYW5kIHJlc291cmNlIG1vZGVsLgotCSAqLwotCUpwYUZpbGUgYnVpbGRKcGFGaWxlKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlLCBKcHRSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpOwotCQotCQotCS8vICoqKioqKioqKiogQ29udGV4dCBOb2RlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQnVpbGQgYSAoL2FuIHVwZGF0ZWQpIHJvb3QgY29udGV4dCBub2RlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gCi0JICogSlBBIHByb2plY3QuCi0JICogVGhlIHJvb3QgY29udGV4dCBub2RlIHdpbGwgYmUgYnVpbHQgb25jZSwgYnV0IHVwZGF0ZWQgbWFueSB0aW1lcy4KLQkgKiBAc2VlIEpwYVByb2plY3QjdXBkYXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCUpwYVJvb3RDb250ZXh0Tm9kZSBidWlsZFJvb3RDb250ZXh0Tm9kZShKcGFQcm9qZWN0IGpwYVByb2plY3QpOwotCi0KLQkvLyAqKioqKioqKioqIFhNTCBDb250ZXh0IE1vZGVsICoqKioqKioqKioKLQotCVBlcnNpc3RlbmNlWG1sIGJ1aWxkUGVyc2lzdGVuY2VYbWwoSnBhUm9vdENvbnRleHROb2RlIHBhcmVudCwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JTWFwcGluZ0ZpbGUgYnVpbGRNYXBwaW5nRmlsZShNYXBwaW5nRmlsZVJlZiBwYXJlbnQsIEpwYVhtbFJlc291cmNlIHJlc291cmNlKTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIENvbnRleHQgTW9kZWwgKioqKioqKioqKgotCQotCUphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZS5Pd25lciBvd25lciwgSmF2YVJlc291cmNlVHlwZSBqcnQpOwotCQotCUphdmFFbnRpdHkgYnVpbGRKYXZhRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEVudGl0eUFubm90YXRpb24gZW50aXR5QW5ub3RhdGlvbik7Ci0JCi0JSmF2YU1hcHBlZFN1cGVyY2xhc3MgYnVpbGRKYXZhTWFwcGVkU3VwZXJjbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbiBtYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbik7Ci0JCi0JSmF2YUVtYmVkZGFibGUgYnVpbGRKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbWJlZGRhYmxlQW5ub3RhdGlvbiBlbWJlZGRhYmxlQW5ub3RhdGlvbik7Ci0JCi0JSmF2YVR5cGVNYXBwaW5nIGJ1aWxkSmF2YU51bGxUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KTsKLQotCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBBY2Nlc3NvciBhY2Nlc3Nvcik7Ci0JCi0JSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCk7Ci0JCi0JSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudFByb3BlcnR5KFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpOwotCQotCUphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkSmF2YUVtYmVkZGVkSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YUVtYmVkZGVkTWFwcGluZyBidWlsZEphdmFFbWJlZGRlZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXZhSWRNYXBwaW5nIGJ1aWxkSmF2YUlkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCUphdmFNYW55VG9NYW55TWFwcGluZyBidWlsZEphdmFNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpOwotCQotCUphdmFNYW55VG9PbmVNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXZhT25lVG9NYW55TWFwcGluZyBidWlsZEphdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXZhVHJhbnNpZW50TWFwcGluZyBidWlsZEphdmFUcmFuc2llbnRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YVZlcnNpb25NYXBwaW5nIGJ1aWxkSmF2YVZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KTsKLQkKLQlKYXZhR2VuZXJhdG9yQ29udGFpbmVyIGJ1aWxkSmF2YUdlbmVyYXRvckNvbnRhaW5lcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhR2VuZXJhdG9yQ29udGFpbmVyLk93bmVyIG93bmVyKTsKLQotCUphdmFUYWJsZSBidWlsZEphdmFUYWJsZShKYXZhRW50aXR5IHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIpOwotCQotCUphdmFKb2luVGFibGUgYnVpbGRKYXZhSm9pblRhYmxlKEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyKTsKLQkKLQlKYXZhVmlydHVhbEpvaW5UYWJsZSBidWlsZEphdmFWaXJ0dWFsSm9pblRhYmxlKEphdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgcGFyZW50LCBSZWFkT25seVRhYmxlLk93bmVyIG93bmVyLCBSZWFkT25seUpvaW5UYWJsZSBvdmVycmlkZGVuVGFibGUpOwotCQotCUphdmFDb2x1bW4gYnVpbGRKYXZhQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFDb2x1bW4uT3duZXIgb3duZXIpOwotCQotCUphdmFWaXJ0dWFsQ29sdW1uIGJ1aWxkSmF2YVZpcnR1YWxDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YVZpcnR1YWxDb2x1bW4uT3duZXIgb3duZXIpOwotCi0JSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRKYXZhRGlzY3JpbWluYXRvckNvbHVtbihKYXZhRW50aXR5IHBhcmVudCwgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgb3duZXIpOwotCQotCUphdmFKb2luQ29sdW1uIGJ1aWxkSmF2YUpvaW5Db2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgQ29tcGxldGVKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQW5ub3RhdGlvbik7Ci0JCi0JSmF2YVZpcnR1YWxKb2luQ29sdW1uIGJ1aWxkSmF2YVZpcnR1YWxKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFJlYWRPbmx5Sm9pbkNvbHVtbiBvdmVycmlkZGVuQ29sdW1uKTsKLQkKLQlKYXZhU2Vjb25kYXJ5VGFibGUgYnVpbGRKYXZhU2Vjb25kYXJ5VGFibGUoSmF2YUVudGl0eSBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uKTsKLQkKLQlKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRKYXZhU2VxdWVuY2VHZW5lcmF0b3IoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbik7Ci0JCi0JSmF2YVRhYmxlR2VuZXJhdG9yIGJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24pOwotCQotCUphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEphdmFHZW5lcmF0ZWRWYWx1ZShKYXZhSWRNYXBwaW5nIHBhcmVudCwgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbik7Ci0JCi0JSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uQW5ub3RhdGlvbik7Ci0JCi0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcik7Ci0KLQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGUoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24pOwotCQotCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBuYW1lKTsKLQkKLQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKTsKLQotCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgcGFyZW50LCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uKTsKLQkKLQlKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgcGFyZW50LCBTdHJpbmcgbmFtZSk7Ci0JCi0JSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwIGJ1aWxkSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCk7Ci0JCi0JSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCBidWlsZEphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAoSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCk7Ci0JCi0JSmF2YVF1ZXJ5Q29udGFpbmVyIGJ1aWxkSmF2YVF1ZXJ5Q29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFRdWVyeUNvbnRhaW5lci5Pd25lciBvd25lcik7Ci0KLQlKYXZhTmFtZWRRdWVyeSBidWlsZEphdmFOYW1lZFF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnlBbm5vdGF0aW9uKTsKLQkKLQlKYXZhTmFtZWROYXRpdmVRdWVyeSBidWlsZEphdmFOYW1lZE5hdGl2ZVF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKTsKLQkKLQlKYXZhUXVlcnlIaW50IGJ1aWxkSmF2YVF1ZXJ5SGludChKYXZhUXVlcnkgcGFyZW50LCBRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludEFubm90YXRpb24pOwotCQotCUphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkSmF2YVVuaXF1ZUNvbnN0cmFpbnQoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgVW5pcXVlQ29uc3RyYWludC5Pd25lciBvd25lciwgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gY29uc3RyYWludEFubm90YXRpb24pOwotCQotCUphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludCBidWlsZEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgb3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQpOwotCQotCUphdmFFbnVtZXJhdGVkQ29udmVydGVyIGJ1aWxkSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBFbnVtZXJhdGVkQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBKYXZhQ29udmVydGVyLk93bmVyIG93bmVyKTsKLQkKLQlKYXZhVGVtcG9yYWxDb252ZXJ0ZXIgYnVpbGRKYXZhVGVtcG9yYWxDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBUZW1wb3JhbEFubm90YXRpb24gYW5ub3RhdGlvbiwgSmF2YUNvbnZlcnRlci5Pd25lciBvd25lcik7Ci0JCi0JSmF2YUxvYkNvbnZlcnRlciBidWlsZEphdmFMb2JDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBMb2JBbm5vdGF0aW9uIGFubm90YXRpb24sIEphdmFDb252ZXJ0ZXIuT3duZXIgb3duZXIpOwotCi0JSmF2YU9yZGVyYWJsZSBidWlsZEphdmFPcmRlcmFibGUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYUZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYUZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdlYTcyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLQotLyoqCi0gKiBBIEpQQSBQcm9qZWN0IGNvbnRhaW5zIEpQQSBmaWxlcyBmb3IgYWxsIGZpbGVzIGluIHRoZSBwcm9qZWN0IHRoYXQKLSAqIGFyZSByZWxldmFudCB0byB0aGUgSlBBIHNwZWMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFGaWxlCi0JZXh0ZW5kcyBKcGFOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgZmlsZSdzIEVjbGlwc2UgZmlsZS4KLQkgKi8KLQlJRmlsZSBnZXRGaWxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgZmlsZSdzIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpQQSBmaWxlOyB0eXBpY2FsbHkgYSBKUEEKLQkgKiBjb21waWxhdGlvbiB1bml0LCBhIEpQQSBYTUwgcmVzb3VyY2UsIG9yIGEgSlBBIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCAoSkFSKS4KLQkgKi8KLQlKcHRSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKTsKLQkKLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgSlBBCi0JICogZmlsZSBpZiB0aGUgZmlsZSdzIGNvbnRlbnQgaXMgYSAia2luZC1vZiIgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGU7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4gVGhpcyBpcyB1c2VmdWwgd2hlbiBhIGNsaWVudCBoYXMgbG9va2VkIHVwIHRoZQotCSAqIEpQQSBmaWxlIHZpYSBhIGZpbGUgbmFtZSBbYW5kIGFzc3VtZWQgY29udGVudCB0eXBlXS4KLQkgKiBAc2VlICNnZXRSZXNvdXJjZU1vZGVsKCkKLQkgKi8KLQlKcHRSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHJvb3Qgc3RydWN0dXJlIG5vZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIGZpbGUncyByb290IHN0cnVjdHVyZSBub2Rlcy4KLQkgKi8KLQlJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPiBnZXRSb290U3RydWN0dXJlTm9kZXMoKTsKLQkJU3RyaW5nIFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04gPSAicm9vdFN0cnVjdHVyZU5vZGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb3VudCBvZiB0aGUgSlBBIGZpbGUncyByb290IGNvbnRleHQgbW9kZWwgb2JqZWN0cy4KLQkgKi8KLQlpbnQgZ2V0Um9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgcm9vdCBzdHJ1Y3R1cmUgbm9kZS4KLQkgKiBUaGVyZSBpcyB0aGUgcG90ZW50aWFsIGZvciBtdWx0aXBsZSByb290IHN0cnVjdHVyZSBub2RlcyAKLQkgKiBmb3IgYSBwYXJ0aWN1bGFyIGtleS4gRm9yIGV4YW1wbGUsIGEgSmF2YSB0eXBlIGNhbiBiZSBsaXN0ZWQKLQkgKiBib3RoIGFzIGEge0Bjb2RlIDxjbGFzcz59IGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUKLQkgKiBhbmQgYXMgYW4ge0Bjb2RlIDxlbnRpdHk+fSBpbgotCSAqIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuIEluIHRoaXMgY2FzZSwgdGhlIEphdmUgdHlwZSBpbgotCSAqIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlIG11c3Qgc2V0Ci0JICogdGhlIHJvb3Qgc3RydWN0dXJlIG5vZGUgPGVtPmFmdGVyPC9lbT4gdGhlIEphdmEgdHlwZSBpbiB0aGUKLQkgKiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0JICogTGFzdCBvbmUgaW4gZHVyaW5nIHByb2plY3QgPGVtPnVwZGF0ZTwvZW0+IHdpbnMuCi0JICovCi0Jdm9pZCBhZGRSb290U3RydWN0dXJlTm9kZShPYmplY3Qga2V5LCBKcGFTdHJ1Y3R1cmVOb2RlIHJvb3RTdHJ1Y3R1cmVOb2RlKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgaWYgaXRzIGN1cnJlbnQgdmFsdWUKLQkgKiBpcyB0aGUgc2FtZSBhcyB0aGUgc3BlY2lmaWVkIG5vZGUuCi0JICogCi0JICogQHNlZSAjYWRkUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0LCBKcGFTdHJ1Y3R1cmVOb2RlKQotCSAqLwotCXZvaWQgcmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0IGtleSwgSnBhU3RydWN0dXJlTm9kZSByb290U3RydWN0dXJlTm9kZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cnVjdHVyZSBub2RlIGJlc3QgY29ycmVzcG9uZGluZyB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUuCi0JICovCi0JSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhTm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWUwZTVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLklSZXNvdXJjZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLk1vZGVsOwotCi0vKioKLSAqIEpQQS1zcGVjaWZpYyBwcm90b2NvbC4gQWxsIEpQQSBvYmplY3RzIGJlbG9uZyB0byBhIEpQQSBwcm9qZWN0LCBhcmUKLSAqIGFzc29jaWF0ZWQgd2l0aCBhIHJlc291cmNlLCBhbmQgaGF2ZSBhIHBhcmVudCAoZXhjZXB0aW5nIHRoZSBKUEEgcHJvamVjdCkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFOb2RlCi0JZXh0ZW5kcyBNb2RlbCwgSUFkYXB0YWJsZSwgSVJlc291cmNlUGFydAotewotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QgdGhlIG5vZGUgYmVsb25ncyB0by4KLQkgKi8KLQlKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIG5vZGUncyBwYXJlbnQuIFRoZSBKUEEgcHJvamVjdCB3aWxsIG5vdCBoYXZlIGEgcGFyZW50LgotCSAqLwotCUpwYU5vZGUgZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBTb21lIHN0YXRlIG9yIGNoaWxkIChvciBncmFuZGNoaWxkIGV0Yy4pIG9mIHRoZSBKUEEgbm9kZSBjaGFuZ2VkLgotCSAqIEZpcmUgYSBzdGF0ZSBjaGFuZ2UgZXZlbnQuIEltcGxpZWQgYnkgdGhpcyBiZWhhdmlvciBpcyB0aGF0IGFueSBjaGFuZ2UKLQkgKiB0byBhbnkgSlBBIG5vZGUgaW4gYSBKUEEgcHJvamVjdCB3aWxsIHRyaWdnZXIgdGhlIEpQQSBwcm9qZWN0IHRvIGZpcmUgYQotCSAqIHN0YXRlIGNoYW5nZSBldmVudC4KLQkgKiAKLQkgKiBAc2VlIE1vZGVsI2FkZFN0YXRlQ2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXIKLQkgKi8KLQl2b2lkIHN0YXRlQ2hhbmdlZCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhUGxhdGZvcm0uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVBsYXRmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MTI2MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhUGxhdGZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuSlBRTEdyYW1tYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBwcm92aWRlIGV4dGVuc2lvbnMgdG8KLSAqIHRoZSBjb3JlIEpQQSBtb2RlbC4gVGhlIGNvcmUgSlBBIG1vZGVsIHdpbGwgcHJvdmlkZSBmdW5jdGlvbmFsaXR5IGZvciBKUEEKLSAqIHNwZWMgYW5ub3RhdGlvbnMgaW4gSmF2YSwgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBhbmQgbWFwcGluZwotICogKDxjb2RlPm9ybS54bWw8L2NvZGU+KSBmaWxlcy4KLSAqIFRoZSA8Y29kZT5vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuZ2VuZXJpYzwvY29kZT4gZXh0ZW5zaW9uIHN1cHBsaWVzCi0gKiByZXNvdXJjZSBtb2RlbHMgZm9yIHRob3NlIGZpbGUgdHlwZXMuIEFzIGFub3RoZXIgdmVuZG9yIG9wdGlvbiB5b3UKLSAqIHdpbGwgaGF2ZSB0byBzdXBwbHkgdGhvc2UgcmVzb3VyY2UgbW9kZWxzIGFzIHdlbGwgb3IgZGlmZmVyZW50IG9uZXMKLSAqIGFzIG5lY2Vzc2FyeS4gSW4gdGhlIGV4dGVuc2lvbiBwb2ludCB5b3UgYWN0dWFsbHkgcHJvdmlkZSBhCi0gKiB7QGxpbmsgSnBhUGxhdGZvcm1GYWN0b3J5fSB0aGF0IHdpbGwgYnVpbGQgdGhlIEpQQSBwbGF0Zm9ybS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8cD4KLSAqIFNlZSB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYVBsYXRmb3JtczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogQHNlZSBKcGFQbGF0Zm9ybUZhY3RvcnkKLSAqIEBzZWUgSnBhUGxhdGZvcm1Qcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVBsYXRmb3JtCi17Ci0JLy8gKioqKioqKioqKiBtZXRhIHN0dWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIEdldCB0aGUgSUQgZm9yIHRoaXMgcGxhdGZvcm0KLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoaXMgcGxhdGZvcm0KLQkgKi8KLQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZlcnNpb24gb2JqZWN0IGZvciB0aGlzIHBsYXRmb3JtLgotCSAqLwotCVZlcnNpb24gZ2V0SnBhVmVyc2lvbigpOwotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgY29yZSAoZS5nLiBKcGFQcm9qZWN0KSwgcmVzb3VyY2UKLQkgKiAoZS5nLiBQZXJzaXN0ZW5jZVJlc291cmNlKSwgYW5kIGNvbnRleHQgKGUuZy4gUGVyc2lzdGVuY2VVbml0KSBtb2RlbAotCSAqIG9iamVjdHMKLQkgKi8KLQlKcGFGYWN0b3J5IGdldEpwYUZhY3RvcnkoKTsKLQotCi0JLy8gKioqKioqKioqKiBKUEEgZmlsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgZmlsZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZmlsZSdzIGNvbnRlbnQgaXMgdW5zdXBwb3J0ZWQuCi0JICovCi0JSnBhRmlsZSBidWlsZEpwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGFubm90YXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhbm5vdGF0aW9uIHByb3ZpZGVyIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB3aGF0IEphdmEKLQkgKiBhbm5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkIGFuZCBjb25zdHJ1Y3RpbmcgamF2YSByZXNvdXJjZSBtb2RlbCBvYmplY3RzLgotCSAqLwotCUFubm90YXRpb25Qcm92aWRlciBnZXRBbm5vdGF0aW9uUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGZvcm1hdHRlciB0aGF0IGNhbiBjbGVhbiB1cCB0aGUgSmF2YSBhbm5vdGF0aW9ucyBhZGRlZCB0byBzb3VyY2UKLQkgKiBjb2RlLgotCSAqLwotCUFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSB0eXBlIG1hcHBpbmdzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSB0eXBlIG1hcHBpbmcgZGVmaW5pdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgSmF2YQotCSAqIHR5cGUgbWFwcGluZ3MgYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgYW5ub3RhdGlvbnMuCi0JICovCi0JSXRlcmFibGU8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQKLQkgKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBhbm5vdGF0aW9ucy4KLQkgKi8KLQlJdGVyYWJsZTxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBidWlsZAotCSAqIGRlZmF1bHQgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MuCi0JICovCi0JSXRlcmFibGU8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB0eXBlcyBhbmQgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHBsYXRmb3JtIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjb25zaXN0ZW50IHdpdGgge0BsaW5rICNnZXRSZXNvdXJjZURlZmluaXRpb24oSnB0UmVzb3VyY2VUeXBlKX0uCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c1Jlc291cmNlVHlwZShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGxhdGZvcm0ncyByZXNvdXJjZSBkZWZpbml0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIHR5cGUuCi0JICogVGhlIHJldHVybmVkIGRlZmluaXRpb24gZGVzY3JpYmVzIHRoZSBwbGF0Zm9ybSdzIGNvcnJlc3BvbmRpbmcgY29udGV4dCBtb2RlbC4KLQkgKiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgcmVzb3VyY2UgdHlwZSBpcyBub3QKLQkgKiBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnNpc3RlbnQgd2l0aCB7QGxpbmsgI3N1cHBvcnRzUmVzb3VyY2VUeXBlKEpwdFJlc291cmNlVHlwZSl9LgotCSAqLwotCVJlc291cmNlRGVmaW5pdGlvbiBnZXRSZXNvdXJjZURlZmluaXRpb24oSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1vc3QgcmVjZW50IHN1cHBvcnRlZCByZXNvdXJjZSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRlbnQKLQkgKiB0eXBlLiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgY29udGVudCB0eXBlIGlzIG5vdAotCSAqIHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0uCi0JICovCi0JSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb25uZWN0aW9uIHJlcG9zaXRvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBxdWVyeSB0aGUgZGF0YWJhc2UKLQkgKiBhYm91dCBkYXRhYmFzZSBtZXRhZGF0YS4KLQkgKi8KLQlDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZW50aXR5IGdlbmVyYXRvciBkYXRhYmFzZSBhbm5vdGF0aW9uIG5hbWUgYnVpbGRlciwgd2hpY2ggaXMKLQkgKiB1c2VkIGJ5IEVudGl0eSBHZW5lcmF0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGFuZCBob3cgdGhlIGVudGl0eSBnZW5lcmF0b3IKLQkgKiBwcmludHMgdGhlIG5hbWVzIG9mIHZhcmlvdXMgZGF0YWJhc2Ugb2JqZWN0cy4KLQkgKi8KLQlFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBnZXRFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpOwotCi0KLQkvLyAqKioqKioqKioqIHBsYXRmb3JtIHZhcmlhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBwbGF0Zm9ybSB2YXJpYXRpb24gdGhhdCBpcyB1c2VkIHRvIGRldGVybWluZSBkaWZmZXJlbmNlcyBwbGF0Zm9ybXMgYW5kL29yIEpQQSBzcGVjaWZpY2F0aW9uIHZlcnNpb25zCi0JICovCi0JSnBhUGxhdGZvcm1WYXJpYXRpb24gZ2V0SnBhVmFyaWF0aW9uKCk7Ci0KLQotCS8vICoqKioqKioqKiogSGVybWVzIGludGVncmF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBRTCBncmFtbWFyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIEpQUUwgcXVlcmllcy4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JSlBRTEdyYW1tYXIgZ2V0SnBxbEdyYW1tYXIoKTsKLQotCi0JaW50ZXJmYWNlIFZlcnNpb24gewotCi0JCUNvbXBhcmF0b3I8U3RyaW5nPiBWRVJTSU9OX0NPTVBBUkFUT1IgPSBuZXcgRGVmYXVsdFZlcnNpb25Db21wYXJhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcGxhdGZvcm0ncyB2ZXJzaW9uLgotCQkgKi8KLQkJU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBoaWdoZXN0IEpQQSBzcGVjaWZpY2F0aW9uIHZlcnNpb24gc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybS4KLQkJICogQHNlZSBKcGFGYWNldCNWRVJTSU9OXzFfMAotCQkgKiBAc2VlIEpwYUZhY2V0I1ZFUlNJT05fMl8wCi0JCSAqLwotCQlTdHJpbmcgZ2V0SnBhVmVyc2lvbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGxhdGZvcm0gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgSlBBCi0JCSAqIHNwZWNpZmljYXRpb24gdmVyc2lvbi4KLQkJICogQHNlZSBKcGFGYWNldCNWRVJTSU9OXzFfMAotCQkgKiBAc2VlIEpwYUZhY2V0I1ZFUlNJT05fMl8wCi0JCSAqLwotCQlib29sZWFuIGlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKFN0cmluZyBqcGFWZXJzaW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2JiOWRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgdG8gYmUgaW1wbGVtZW50ZWQgYnkgYSBKUEEgdmVuZG9yIHRvIGJ1aWxkIGEKLSAqIHtAbGluayBKcGFQbGF0Zm9ybX0uCi0gKiA8cD4KLSAqIFNlZSB0aGUgPGNvZGU+b3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYVBsYXRmb3JtczwvY29kZT4gZXh0ZW5zaW9uIHBvaW50LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUGxhdGZvcm1GYWN0b3J5IHsKLQkvKioKLQkgKiBCdWlsZCB0aGUgSlBBIHBsYXRmb3JtIHdpdGggdGhlIHNwZWNpZmllZCBJRC4KLQkgKi8KLQlKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTFlZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBwcm92aWRlIGV4dGVuc2lvbnMgdG8gCi0gKiB0aGUgY29yZSBKUEEgbW9kZWwuICBUaGUgY29yZSBKUEEgbW9kZWwgd2lsbCBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgZm9yIEpQQQotICogc3BlYyBhbm5vdGF0aW9ucyBpbiBqYXZhLCBwZXJzaXN0ZW5jZS54bWwgYW5kIG1hcHBpbmcgKG9ybS54bWwpIGZpbGVzLgotICogVGhlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5nZW5lcmljIGV4dGVuc2lvbiBzdXBwbGllcyAKLSAqIHJlc291cmNlIG1vZGVscyBmb3IgdGhvc2UgZmlsZSB0eXBlcyBpbiBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlci4gCi0gKiAKLSAqIFRoaXMgSnBhUGxhdGZvcm1Qcm92aWRlciBpbXBsZW1lbnRhdGlvbiBtb3N0IGxpa2VseSBvbmx5IHJldHVybnMgcHJvdmlkZXJzCi0gKiB0aGF0IGFyZSBleHRlbnNpb25zIG9mIG90aGVyIHBsYXRmb3Jtcy4gIFRoZW4gaW4gdGhlIEdlbmVyaWNKcGFQbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbgotICogeW91IHBhc3MgaW4gMSBvciBtb3JlIEpwYVBsYXRmb3JtUHJvdmlkZXJzLgotICogCi0gKiBTZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybXMgZXh0ZW5zaW9uIHBvaW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVByb3ZpZGVyCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtb3N0IHJlY2VudCByZXNvdXJjZSB0eXBlIGZvciB0aGUgZ2l2ZW4gY29udGVudCB0eXBlIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtCi0JICovCi0JSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIG1vZGVsIHByb3ZpZGVycyB0aGF0IGFwcGx5IHRvIHRoaXMgcGxhdGZvcm0uCi0JICovCi0JSXRlcmFibGU8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBnZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGRlZmluaXRpb25zIHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtLgotCSAqLwotCUl0ZXJhYmxlPFJlc291cmNlRGVmaW5pdGlvbj4gZ2V0UmVzb3VyY2VEZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbGF0Zm9ybSdzIEphdmEgdHlwZSBtYXBwaW5nIGRlZmluaXRpb25zLgotCSAqLwotCUl0ZXJhYmxlPEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBkZWZpbml0aW9ucy4KLQkgKi8KLQlJdGVyYWJsZTxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwbGF0Zm9ybSdzIHNwZWNpZmllZCBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGRlZmluaXRpb25zLgotCSAqLwotCUl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhUGxhdGZvcm1WYXJpYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVBsYXRmb3JtVmFyaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MzdmZWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhUGxhdGZvcm1WYXJpYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotCi0vKioKLSAqIEEgSnBhUGxhdGZvcm0gY29udGFpbnMgYSBKcGFQbGF0Zm9ybVZhcmlhdGlvbi4gIFRoaXMgaXMgdXNlZCBmb3IgdmFyaW91cyBqcGEgc3BlYwotICogaXRlbXMgdGhhdCBhcmUgZWl0aGVyIG9wdGlvbmFsIG9yIG9ubHkgc3VwcG9ydGVkIGJ5IGNlcnRhaW4gdmVyc2lvbiBvZiB0aGUgc3BlYy4KLSAqIEVhY2ggcGxhdGZvcm0gaW1wbGVtZW50YXRpb24gbXVzdCBkZXRlcm1pbmUgaWYgaXQgc3VwcG9ydHMgdGhlc2UgdGhpbmdzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUGxhdGZvcm1WYXJpYXRpb24KLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaXMgYSBzdXBwb3J0ZWQKLQkgKiBpbmhlcml0YW5jZSBzdHJhdGVneSBpbiB0aGUgSlBBIHBsYXRmb3JtLgotCSAqIFN1cHBvcnRlZC5NQVlCRSBtZWFucyB0aGF0IGl0IGlzIGluIHRoZSBKUEEgc3BlYywgYnV0IG5vdCBwb3J0YWJsZQotCSAqIG9yIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQgYnkgYSBwYXJ0aWN1bGFyIHByb3ZpZGVyLiAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSByZWxhdGlvbnNoaXAgbWFwcGluZyB0aGF0IHVzZXMgYSBqb2luIHRhYmxlCi0JICogY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBhbiBhc3NvY2lhdGlvbiBvdmVycmlkZS4KLQkgKi8KLQlib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKTsKLQotCUFjY2Vzc1R5cGVbXSBnZXRTdXBwb3J0ZWRBY2Nlc3NUeXBlcyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQotCUFjY2Vzc1R5cGVbXSBHRU5FUklDX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVMgPSBuZXcgQWNjZXNzVHlwZVtdIHtBY2Nlc3NUeXBlLkZJRUxELCBBY2Nlc3NUeXBlLlBST1BFUlRZfTsKLQotCXB1YmxpYyBlbnVtIFN1cHBvcnRlZCB7Ci0JCS8qKgotCQkgKiBmdWxseSBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtCi0JCSAqLwotCQlZRVMsCi0JCQotCQkvKioKLQkJICogbm90IHN1cHBvcnRlZCBieSB0aGUgcGxhdGZvcm0KLQkJICovCi0JCU5PLAotCQkKLQkJLyoqCi0JCSAqIGluIHRoZSBKUEEgc3BlYywgbWlnaHQgbm90IHN1cHBvcnRlZCBiZSBzdXBwb3J0ZWQgYnkgYSBwYXJ0aWN1bGFyIHByb3ZpZGVyCi0JCSAqLwotCQlNQVlCRSwKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFQcm9qZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFQcm9qZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZmEwNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGVDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZEV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEEgSlBBIHByb2plY3QgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIEVjbGlwc2UgcHJvamVjdCAoYW5kIGl0cyBjb3JyZXNwb25kaW5nCi0gKiBKYXZhIHByb2plY3QpLiBJdCBob2xkcyB0aGUgPGVtPnJlc291cmNlPC9lbT4gbW9kZWwgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgCi0gKiB2YXJpb3VzIEpQQS1yZWxhdGVkIHJlc291cmNlcyAodGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSwgaXRzCi0gKiBtYXBwaW5nIGZpbGVzIFs8Y29kZT5vcm0ueG1sPC9jb2RlPl0sIGFuZCB0aGUgSmF2YSBzb3VyY2UgZmlsZXMpLiBJdCBhbHNvCi0gKiBob2xkcyB0aGUgPGVtPmNvbnRleHQ8L2VtPiBtb2RlbCB0aGF0IHJlcHJlc2VudHMKLSAqIHRoZSBKUEEgbWV0YWRhdGEsIGFzIGRlcml2ZWQgZnJvbSBzcGVjLWRlZmluZWQgZGVmYXVsdHMsIEphdmEgc291cmNlIGNvZGUKLSAqIGFubm90YXRpb25zLCBhbmQgWE1MIGRlc2NyaXB0b3JzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUHJvamVjdAotCWV4dGVuZHMgSnBhTm9kZQotewotCi0JLy8gKioqKioqKioqKiBnZW5lcmFsICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBuYW1lLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUgYXNzb2NpYXRlZAotCSAqIEVjbGlwc2UgcHJvamVjdCdzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRWNsaXBzZSBwcm9qZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSlBBIHByb2plY3QuCi0JICovCi0JSVByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgcHJvamVjdC4KLQkgKi8KLQlJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmVuZG9yLXNwZWNpZmljIEpQQSBwbGF0Zm9ybSB0aGF0IGJ1aWxkcyB0aGUgSlBBIHByb2plY3QKLQkgKiBhbmQgaXRzIGNvbnRlbnRzLgotCSAqLwotCUpwYVBsYXRmb3JtIGdldEpwYVBsYXRmb3JtKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvb3Qgb2YgdGhlIEpQQSBwcm9qZWN0J3MgY29udGV4dCBtb2RlbC4KLQkgKi8KLQlKcGFSb290Q29udGV4dE5vZGUgZ2V0Um9vdENvbnRleHROb2RlKCk7Ci0KLQkvKioKLQkgKiBUaGUgSlBBIHByb2plY3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBKUEEgbW9kZWwuIENsZWFuIHVwIGFueQotCSAqIGhvb2tzIHRvIGV4dGVybmFsIHJlc291cmNlcyBldGMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLQotCS8vICoqKioqKioqKiogSlBBIGZpbGVzICoqKioqKioqKioKLQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIHRoZSBKUEEgcHJvamVjdCdzIGNvbGxlY3Rpb24gb2YgSlBBIGZpbGVzIGNoYW5nZXMuCi0JICogQHNlZSAjYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlTdHJpbmcgSlBBX0ZJTEVTX0NPTExFQ1RJT04gPSAianBhRmlsZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgSlBBIGZpbGVzLgotCSAqLwotCUl0ZXJhYmxlPEpwYUZpbGU+IGdldEpwYUZpbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEpQQSBwcm9qZWN0J3MgSlBBIGZpbGVzLgotCSAqLwotCWludCBnZXRKcGFGaWxlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gSlBBIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKi8KLQlKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSk7Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0cyAqKioqKioqKioqCi0KLQkvKiogCi0JICogSUQgc3RyaW5nIHVzZWQgd2hlbiB0aGUgSlBBIHByb2plY3QncyBjb2xsZWN0aW9uIG9mIGV4dGVybmFsIEphdmEKLQkgKiByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0cyBjaGFuZ2VzLgotCSAqIEBzZWUgI2FkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIpCi0JICovCi0JU3RyaW5nIEVYVEVSTkFMX0pBVkFfUkVTT1VSQ0VfQ09NUElMQVRJT05fVU5JVFNfQ09MTEVDVElPTiA9ICJleHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSBjb21waWxhdGlvbiB1bml0cy4KLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+IGdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBKUEEgcHJvamVjdCdzIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMuCi0JICovCi0JaW50IGdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0c1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgdHlwZSBjYWNoZS4KLQkgKi8KLQlKYXZhUmVzb3VyY2VUeXBlQ2FjaGUgZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlQ2FjaGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBYTUwgcmVzb3VyY2VzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIFhNTCByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlIHdpdGggcnVudGltZSBwYXRoCi0JICogPGNvZGU+TUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sPC9jb2RlPiBpZiB0aGF0IGZpbGUgaGFzIHRoZSBwZXJzaXN0ZW5jZSBjb250ZW50IHR5cGUKLQkgKiAoPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50LnBlcnNpc3RlbmNlIjwvY29kZT4pLgotCSAqIAotCSAqIEBzZWUgSnB0SnBhQ29yZVBsdWdpbiNERUZBVUxUX1BFUlNJU1RFTkNFX1hNTF9SVU5USU1FX1BBVEgKLQkgKiBAc2VlIEpwdEpwYUNvcmVQbHVnaW4jUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRQotCSAqLwotCUpwYVhtbFJlc291cmNlIGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIFhNTCByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIHJ1bnRpbWUgcGF0aCBpZiB0aGF0IGZpbGUgaGFzIHRoZSBtYXBwaW5nIGZpbGUgY29udGVudCB0eXBlCi0JICogKDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGVudC5tYXBwaW5nRmlsZSI8L2NvZGU+KQotCSAqIAotCSAqIEBzZWUgSnB0SnBhQ29yZVBsdWdpbiNNQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFCi0JICovCi0JSnBhWG1sUmVzb3VyY2UgZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShJUGF0aCBydW50aW1lUGF0aCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIFhNTCByZXNvdXJjZSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaWxlCi0JICogPGNvZGU+TUVUQS1JTkYvb3JtLnhtbDwvY29kZT4gaWYgdGhhdCBmaWxlIGhhcyB0aGUgbWFwcGluZyBmaWxlIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAc2VlIEpwdEpwYUNvcmVQbHVnaW4jREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSAotCSAqLwotCUpwYVhtbFJlc291cmNlIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQotCQotCS8vICoqKioqKioqKiogSmF2YSByZXNvdXJjZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgSlBBIHByb2plY3QncyBhbm5vdGF0ZWQgSmF2YSBjbGFzc2VzCi0JICogKGlnbm9yaW5nIGNsYXNzZXMgaW4gSkFScyByZWZlcmVuY2VkIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+KS4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEFubm90YXRlZEphdmFTb3VyY2VDbGFzc05hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhlIG5hbWVzIG9mIHRob3NlIHZhbGlkIDxlbT5tYXBwZWQ8L2VtPiAoaS5lLiBhbm5vdGF0ZWQgd2l0aAotCSAqIDxjb2RlPkBFbnRpdHk8L2NvZGU+LCA8Y29kZT5ARW1iZWRkYWJsZTwvY29kZT4sIGV0Yy4pIEphdmEgcmVzb3VyY2UKLQkgKiBwZXJzaXN0ZW50IHR5cGVzIHRoYXQgYXJlIGRpcmVjdGx5IHBhcnQgb2YgdGhlIEpQQSBwcm9qZWN0LCBpZ25vcmluZwotCSAqIHRob3NlIGluIEpBUnMgcmVmZXJlbmNlZCBpbiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0TWFwcGVkSmF2YVNvdXJjZUNsYXNzTmFtZXMoKTsKLQotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZU1hcHBpbmdBbm5vdGF0aW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZS4KLQkgKiBSZXR1cm4gbnVsbCBpZiBpbnZhbGlkIG9yIGFic2VudC4KLQkgKi8KLQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlfSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSBuYW1lIGFuZCBraW5kLgotCSAqIFJldHVybiBudWxsIGlmIGludmFsaWQgb3IgYWJzZW50IG9yIGlmIHRoZSBraW5kIGRvZXMgbm90IG1hdGNoLgotCSAqLwotCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKFN0cmluZyB0eXBlTmFtZSwgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlLktpbmQga2luZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgcmVzb3VyY2UgcGFja2FnZSBmb3IgdGhlIHNwZWNpZmllZCBwYWNrYWdlLgotCSAqIFJldHVybiBudWxsIGlmIGludmFsaWQgb3IgYWJzZW50LgotCSAqLwotCUphdmFSZXNvdXJjZVBhY2thZ2UgZ2V0SmF2YVJlc291cmNlUGFja2FnZShTdHJpbmcgcGFja2FnZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHBhY2thZ2VzIGZvciB0aGUgcHJvamVjdC4KLQkgKiBSZXR1cm4gbnVsbCBpZiBpbnZhbGlkIG9yIGFic2VudC4KLQkgKi8KLQlJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlPiBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHBhY2thZ2UgZnJhZ2VtZW50IHJvb3QgZm9yIHRoZSBzcGVjaWZpZWQgSkFSLgotCSAqIFJldHVybiBudWxsIGlmIGFic2VudC4KLQkgKi8KLQlKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGdldEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QoU3RyaW5nIGphckZpbGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBKUEEgZmlsZXMgZm9yIGphcnMuCi0JICovCi0JSXRlcmFibGU8SnBhRmlsZT4gZ2V0SmFySnBhRmlsZXMoKTsKLQotCi0JLy8gKioqKioqKioqKiBleHRlcm5hbCBldmVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIEpQQSBwcm9qZWN0IHdpdGggdGhlIHNwZWNpZmllZCBwcm9qZWN0IHJlc291cmNlCi0JICogZGVsdGEsIHdhdGNoaW5nIGZvciBhZGRlZCBhbmQgcmVtb3ZlZCBmaWxlcyBpbiBwYXJ0aWN1bGFyLgotCSAqLwotCXZvaWQgcHJvamVjdENoYW5nZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpOwotCi0JLyoqCi0JICogU3luY2hyb25pemUgdGhlIEpQQSBwcm9qZWN0IHdpdGggdGhlIHNwZWNpZmllZCBKYXZhIGNoYW5nZS4KLQkgKi8KLQl2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KTsKLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSBjb250ZXh0IG1vZGVsIHdpdGggcmVzb3VyY2UgbW9kZWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIHN5bmNocm9uaXplIHRoZSBjb250ZXh0IG1vZGVsIHdpdGgKLQkgKiB0aGUgcmVzb3VyY2UgbW9kZWwgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JU3luY2hyb25pemVyIGdldENvbnRleHRNb2RlbFN5bmNocm9uaXplcigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBzeW5jaHJvbml6ZXIgdGhhdCB3aWxsIGtlZXAgdGhlIGNvbnRleHQgbW9kZWwgc3luY2hyb25pemVkIHdpdGgKLQkgKiB0aGUgcmVzb3VyY2UgbW9kZWwgd2hlbmV2ZXIgdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCi0JICogQmVmb3JlIHNldHRpbmcgdGhlIHN5bmNocm9uaXplciwgY2xpZW50cyBzaG91bGQgc2F2ZSB0aGUgY3VycmVudAotCSAqIHN5bmNocm9uaXplciBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgbGF0ZXIuCi0JICogCi0JICogQHNlZSAjZ2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKCkKLQkgKi8KLQl2b2lkIHNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcihTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKTsKLQotCS8qKgotCSAqIFRoZSBKUEEgcHJvamVjdCdzIHJlc291cmNlIG1vZGVsIGhhcyBjaGFuZ2VkOyBzeW5jaHJvbml6ZSB0aGUgSlBBCi0JICogcHJvamVjdCdzIGNvbnRleHQgbW9kZWwgd2l0aCBpdC4gVGhpcyBtZXRob2QgaXMgdHlwaWNhbGx5IGNhbGxlZCB3aGVuIHRoZQotCSAqIHJlc291cmNlIG1vZGVsIHN0YXRlIGhhcyBjaGFuZ2VkIHdoZW4gaXQgaXMgc3luY2hyb25pemVkIHdpdGggaXRzCi0JICogdW5kZXJseWluZyBFY2xpcHNlIHJlc291cmNlIGFzIHRoZSByZXN1bHQgb2YgYW4gRWNsaXBzZSByZXNvdXJjZSBjaGFuZ2UKLQkgKiBldmVudC4gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgY2FsbGVkIHdoZW4gYSBjbGllbnQgKGUuZy4gYSBKVW5pdCB0ZXN0Ci0JICogY2FzZSkgaGFzIG1hbmlwdWxhdGVkIHRoZSByZXNvdXJjZSBtb2RlbCB2aWEgaXRzIEFQSSAoYXMgb3Bwb3NlZCB0bwotCSAqIG1vZGlmeWluZyB0aGUgdW5kZXJseWluZyBFY2xpcHNlIHJlc291cmNlIGRpcmVjdGx5KSBhbmQgbmVlZHMgdGhlIGNvbnRleHQKLQkgKiBtb2RlbCB0byBiZSBzeW5jaHJvbml6ZWQgYWNjb3JkaW5nbHkgKHNpbmNlIG1hbmlwdWxhdGluZyB0aGUgcmVzb3VyY2UKLQkgKiBtb2RlbCB2aWEgaXRzIEFQSSB3aWxsIG5vdCB0cmlnZ2VyIHRoaXMgbWV0aG9kKS4gV2hldGhlciB0aGUgY29udGV4dAotCSAqIG1vZGVsIGlzIHN5bmNocm9ub3VzbHkgKG9yIGFzeW5jaHJvbm91c2x5KSBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IGNvbnRleHQKLQkgKiBtb2RlbCBzeW5jaHJvbml6ZXIuCi0JICogCi0JICogQHNlZSAjc3luY2hyb25pemVDb250ZXh0TW9kZWxBbmRXYWl0KCkKLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkvKioKLQkgKiBGb3JjZSB0aGUgSlBBIHByb2plY3QncyBjb250ZXh0IG1vZGVsIHRvIHN5bmNocm9uaXplIHdpdGggaXQgcmVzb3VyY2UKLQkgKiBtb2RlbCA8ZW0+c3luY2hyb25vdXNseTwvZW0+LgotCSAqIAotCSAqIEBzZWUgI3N5bmNocm9uaXplQ29udGV4dE1vZGVsKCkKLQkgKiBAc2VlICN1cGRhdGVBbmRXYWl0KCkKLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplQ29udGV4dE1vZGVsQW5kV2FpdCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgY29udGV4dCBtb2RlbCBzeW5jaHJvbml6ZXIgdG8gcGVyZm9ybQotCSAqIHRoZSBhY3R1YWwgInN5bmNocm9uaXplIi4KLQkgKi8KLQlJU3RhdHVzIHN5bmNocm9uaXplQ29udGV4dE1vZGVsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQotCS8vICoqKioqKioqKiogcHJvamVjdCAidXBkYXRlIiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN5bmNocm9uaXplciB0aGF0IHdpbGwgdXBkYXRlIHRoZSBjb250ZXh0IG1vZGVsIHdoZW5ldmVyCi0JICogaXQgaGFzIGFueSBjaGFuZ2VzLiBUaGlzIGFsbG93cyBhbnkgaW50cmEtSlBBIHByb2plY3QgZGVwZW5kZW5jaWVzIHRvCi0JICogYmUgdXBkYXRlZC4KLQkgKi8KLQlDYWxsYmFja1N5bmNocm9uaXplciBnZXRVcGRhdGVTeW5jaHJvbml6ZXIoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgc3luY2hyb25pemVyIHRoYXQgd2lsbCB1cGRhdGUgdGhlIGNvbnRleHQgbW9kZWwgd2hlbmV2ZXIKLQkgKiBpdCBoYXMgYW55IGNoYW5nZXMuIFRoaXMgYWxsb3dzIGFueSBpbnRyYS1KUEEgcHJvamVjdCBkZXBlbmRlbmNpZXMgdG8KLQkgKiBiZSB1cGRhdGVkLgotCSAqIEJlZm9yZSBzZXR0aW5nIHRoZSB1cGRhdGUgc3luY2hyb25pemVyLCBjbGllbnRzIHNob3VsZCBzYXZlIHRoZSBjdXJyZW50Ci0JICogc3luY2hyb25pemVyIHNvIGl0IGNhbiBiZSByZXN0b3JlZCBsYXRlci4KLQkgKiAKLQkgKiBAc2VlICNnZXRVcGRhdGVTeW5jaHJvbml6ZXIoKQotCSAqLwotCXZvaWQgc2V0VXBkYXRlU3luY2hyb25pemVyKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcik7Ci0KLQkvKioKLQkgKiBGb3JjZSB0aGUgSlBBIHByb2plY3QgdG8gInVwZGF0ZSIgPGVtPnN5bmNocm9ub3VzbHk8L2VtPi4KLQkgKiAKLQkgKiBAc2VlICNzeW5jaHJvbml6ZUNvbnRleHRNb2RlbEFuZFdhaXQoKQotCSAqLwotCXZvaWQgdXBkYXRlQW5kV2FpdCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgdXNlZCBieSB0aGUgdXBkYXRlIHN5bmNocm9uaXplciB0byBwZXJmb3JtIHRoZQotCSAqIGFjdHVhbCAidXBkYXRlIi4KLQkgKi8KLQlJU3RhdHVzIHVwZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0KLQkvLyAqKioqKioqKioqIHV0aWxpdHkgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIHtAbGluayBJRmlsZX0gdGhhdCBiZXN0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHJ1bnRpbWUgbG9jYXRpb24KLQkgKi8KLQlJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoSVBhdGggcnVudGltZVBhdGgpOwotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIEpQQSBwcm9qZWN0J3MgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLQkgKi8KLQlJdGVyYWJsZTxJTWVzc2FnZT4gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKElSZXBvcnRlciByZXBvcnRlcik7Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhIHNvdXJjZSB0aGUgSlBBIHByb2plY3QgaXMgbWFwcGVkIHRvLgotCSAqLwotCUpwYURhdGFTb3VyY2UgZ2V0RGF0YVNvdXJjZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24uCi0JICogVGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBudWxsIGlmIHRoZSBKUEEgcHJvamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYSBEVFAgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCUNvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEgY29udGFpbmVyOwotCSAqIHdoaWNoIGlzIGVpdGhlciB0aGUgSlBBIHByb2plY3QncyBkZWZhdWx0IGNhdGFsb2cgb3IgdGhlIEpQQSBwcm9qZWN0J3MKLQkgKiBkYXRhYmFzZSwgZGVwZW5kaW5nIG9uIGhvdyB0aGUgRFRQIG1vZGVsIGlzIGltcGxlbWVudGVkLgotCSAqLwotCVNjaGVtYUNvbnRhaW5lciBnZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QncyBkZWZhdWx0IGNhdGFsb2c7IHdoaWNoIGlzIGVpdGhlciB0aGUgdXNlcgotCSAqIG92ZXJyaWRlIGNhdGFsb2cgb3IgdGhlIGRhdGFiYXNlJ3MgZGVmYXVsdCBjYXRhbG9nLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGRlZmF1bHQgZGF0YWJhc2UgY2F0YWxvZy4KLQkgKiBAc2VlICNnZXREZWZhdWx0Q2F0YWxvZygpCi0JICovCi0JQ2F0YWxvZyBnZXREZWZhdWx0RGJDYXRhbG9nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgZGVmYXVsdCBzY2hlbWE7IHdoaWNoIGNhbiBiZSBvbmUgb2YgdGhlCi0JICogZm9sbG93aW5nOjx1bD4KLQkgKiA8bGk+dGhlIHVzZXIgb3ZlcnJpZGUgc2NoZW1hCi0JICogPGxpPnRoZSBkZWZhdWx0IGNhdGFsb2cncyBkZWZhdWx0IHNjaGVtYQotCSAqIDxsaT50aGUgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYSAoaWYgY2F0YWxvZ3MgYXJlIG5vdCBzdXBwb3J0ZWQpCi0JICogPC91bD4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGRlZmF1bHQgZGF0YWJhc2Ugc2NoZW1hLgotCSAqIEBzZWUgI2dldERlZmF1bHRTY2hlbWEoKQotCSAqIEBzZWUgI2dldERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpCi0JICovCi0JU2NoZW1hIGdldERlZmF1bHREYlNjaGVtYSgpOwotCi0KLQkvLyAqKioqKioqKioqIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nICoqKioqKioqKioKLQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIHRoZSBKUEEgcHJvamVjdCdzIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nIGNoYW5nZXMuCi0JICogQHNlZSAjYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTdHJpbmcsIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotCSAqLwotCVN0cmluZyBVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJ1c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPmlkZW50aWZpZXI8L2VtPiBvZiB0aGUgY2F0YWxvZyB0byBiZSB1c2VkIGFzIGEgZGVmYXVsdAotCSAqIGZvciB0aGUgSlBBIHByb2plY3QgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgaXMgYXNzb2NpYXRlZCBieSBkZWZhdWx0Ci0JICogd2l0aCB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqIEByZXR1cm4gVGhlIGNhdGFsb2cgaWRlbnRpZmllci4gTWF5IGJlIG51bGwgKGltcGx5aW5nIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUKLQkgKiBkZWZhdWx0IGNhdGFsb2cgc2hvdWxkIGJlIHVzZWQpLgotCSAqLwotCVN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOwotCi0JLyoqCi0JICogU2V0IHRoZSA8ZW0+aWRlbnRpZmllcjwvZW0+IG9mIHRoZSBjYXRhbG9nIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0Ci0JICogZm9yIHRoZSBKUEEgcHJvamVjdCBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCBpcyBhc3NvY2lhdGVkIGJ5IGRlZmF1bHQKLQkgKiB3aXRoIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogQHBhcmFtZXRlciBjYXRhbG9nIFRoZSBjYXRhbG9nIGlkZW50aWZpZXIuIE1heSBiZSBudWxsIChpbXBseWluZyB0aGUgY29ubmVjdGlvbiBwcm9maWxlCi0JICogZGVmYXVsdCBjYXRhbG9nIHNob3VsZCBiZSB1c2VkKS4KLQkgKi8KLQl2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKTsKLQotCi0JLy8gKioqKioqKioqKiB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hICoqKioqKioqKioKLQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIHRoZSBKUEEgcHJvamVjdCdzIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgY2hhbmdlcy4KLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JU3RyaW5nIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgPSAidXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPmlkZW50aWZpZXI8L2VtPiBvZiB0aGUgc2NoZW1hIHRvIGJlIHVzZWQgYXMgYSBkZWZhdWx0Ci0JICogZm9yIHRoZSBKUEEgcHJvamVjdCBpbnN0ZWFkIG9mIHRoZSBvbmUgdGhhdCBpcyBhc3NvY2lhdGVkIGJ5IGRlZmF1bHQKLQkgKiB3aXRoIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogQHJldHVybiBUaGUgc2NoZW1hIGlkZW50aWZpZXIuIE1heSBiZSBudWxsIChpbXBseWluZyB0aGUgY29ubmVjdGlvbiBwcm9maWxlCi0JICogZGVmYXVsdCBzY2hlbWEgc2hvdWxkIGJlIHVzZWQpLgotCSAqLwotCVN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIDxlbT5pZGVudGlmaWVyPC9lbT4gb2YgdGhlIHNjaGVtYSB0byBiZSB1c2VkIGFzIGEgZGVmYXVsdAotCSAqIGZvciB0aGUgSlBBIHByb2plY3QgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgaXMgYXNzb2NpYXRlZCBieSBkZWZhdWx0Ci0JICogd2l0aCB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqIEBwYXJhbWV0ZXIgc2NoZW1hIFRoZSBzY2hlbWEgaWRlbnRpZmllci4gTWF5IGJlIG51bGwgKGltcGx5aW5nIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUKLQkgKiBkZWZhdWx0IHNjaGVtYSBzaG91bGQgYmUgdXNlZCkuCi0JICovCi0Jdm9pZCBzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpOwotCi0KLQkvLyAqKioqKioqKioqIGRpc2NvdmVyIGFubm90YXRlZCBjbGFzc2VzICoqKioqKioqKioKLQotCS8qKiAKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMgcHJvcGVydHkgaXMgY2hhbmdlZC4KLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JU3RyaW5nIERJU0NPVkVSU19BTk5PVEFURURfQ0xBU1NFU19QUk9QRVJUWSA9ICJkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IHdpbGwgbm90IGdlbmVyYXRlIGVycm9yIG1lc3NhZ2VzIGZvciBhbnkKLQkgKiBhbm5vdGF0ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3QgbGlzdGVkIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+Ci0JICogZmlsZSBvciBvbmUgb2YgaXRzIG1hcHBpbmcgZmlsZXMuIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8KLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4sIGVycm9yIG1lc3NhZ2VzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhbGwgb2YgdGhlCi0JICogYW5ub3RhdGVkIGNsYXNzZXMgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgbGlzdGVkLiBUaGUgSlBBIHByb2plY3QKLQkgKiA8ZW0+YWx3YXlzPC9lbT4gImRpc2NvdmVycyIgYW5ub3RhdGVkIGNsYXNzZXMgYW5kIGFsbG93cyB0aGUgdXNlciB0bwotCSAqIHJlZmVyZW5jZSB0aGVtIHRocm91Z2hvdXQgdGhlIG1vZGVsOyB0aGlzIGZsYWcgc2ltcGx5IGNvbnRyb2xzIHdoZXRoZXIKLQkgKiB0aGUgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZCBkdXJpbmcgdmFsaWRhdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgdXNlci1zcGVjaWZpZWQgcHJlZmVyZW5jZSB0aGF0IGlzIHByb2JhYmx5Ci0JICogb25seSBoZWxwZnVsIHdoZW4gZGVwbG95aW5nIHRvIGEgSmF2YVNFIGVudmlyb25tZW50LiBUaGUgSlBBIHNwZWMKLQkgKiBzYXlzIGFubm90YXRlZCBjbGFzc2VzIGFyZSB0byBiZSBkaXNjb3ZlcmVkIGF1dG9tYXRpY2FsbHkgaW4gYSBKYXZhRUUKLQkgKiBlbnZpcm9ubWVudDsgd2hpbGUgdGhlIG1hbmFnZWQgcGVyc2lzdGVuY2UgY2xhc3NlcyBtdXN0IGJlIGV4cGxpY2l0bHkKLQkgKiBsaXN0ZWQgaW4gYSBKYXZhU0UgZW52aXJvbm1lbnQ6ICJBIGxpc3Qgb2YgYWxsIG5hbWVkIG1hbmFnZWQgcGVyc2lzdGVuY2UKLQkgKiBjbGFzc2VzIG11c3QgYmUgc3BlY2lmaWVkIGluIEphdmEgU0UgZW52aXJvbm1lbnRzIHRvIGluc3VyZSBwb3J0YWJpbGl0eSIuCi0JICogVGhpcyBmbGFnIGFsbG93cyBEYWxpIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2l0aCB0aGUgdXNlcidzIEpQQQotCSAqIGltcGxlbWVudGF0aW9uLCB3aGljaCBtYXkgYWxsb3cgImRpc2NvdmVyeSIgaW4gYSBKYXZhU0UgZW52aXJvbm1lbnQKLQkgKiAoZS5nLiBFY2xpcHNlTGluaykuIFRoaXMgc2V0dGluZyBjYW4gYWxzbyBiZSB1c2VkIHdoZW4gdGhlIHVzZXIgd2FudHMKLQkgKiB0byBleHBsaWNpdGx5IGxpc3QgY2xhc3NlcywgZXZlbiB3aGVuIHRoZSBjbGFzc2VzIGFyZSAiZGlzY292ZXJlZCIKLQkgKiBieSB0aGUgSlBBIGltcGxlbWVudGF0aW9uLgotCSAqLwotCWJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpOwotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IHdpbGwgbm90IGdlbmVyYXRlIGVycm9yIG1lc3NhZ2VzIGZvciBhbnkKLQkgKiBhbm5vdGF0ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3QgbGlzdGVkIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+Ci0JICogZmlsZSBvciBvbmUgb2YgaXRzIG1hcHBpbmcgZmlsZXMuCi0JICogQHNlZSAjZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpCi0JICovCi0Jdm9pZCBzZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKGJvb2xlYW4gZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyk7Ci0KLQotCS8vICoqKioqKioqKiogbW9kaWZ5aW5nIHNoYXJlZCBkb2N1bWVudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2V0IGEgdGhyZWFkLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgQ29tbWFuZEV4ZWN1dG9yfQotCSAqIGludGVyZmFjZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBleGVjdXRlIGEgY29tbWFuZCB0byBtb2RpZnkgYSBzaGFyZWQKLQkgKiBkb2N1bWVudC4gSWYgbmVjZXNzYXJ5LCB0aGUgY29tbWFuZCBleGVjdXRvciBjYW4gYmUgY2xlYXJlZCBieQotCSAqIHNldHRpbmcgaXQgdG8gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogVGhpcyBhbGxvd3MgYmFja2dyb3VuZCBjbGllbnRzIHRvIG1vZGlmeSBkb2N1bWVudHMgdGhhdCBhcmUKLQkgKiBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIFVJLiBTZWUgaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBDb21tYW5kRXhlY3V0b3J9LgotCSAqLwotCXZvaWQgc2V0VGhyZWFkTG9jYWxNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcihDb21tYW5kRXhlY3V0b3IgY29tbWFuZEV4ZWN1dG9yKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvamVjdC13aWRlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotCSAqIHtAbGluayBDb21tYW5kRXhlY3V0b3J9IGludGVyZmFjZS4KLQkgKi8KLQlDb21tYW5kRXhlY3V0b3IgZ2V0TW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3IoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gY29uZmlnICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBzZXR0aW5ncyB1c2VkIHRvIGNvbnN0cnVjdCBhIEpQQSBwcm9qZWN0LgotCSAqLwotCWludGVyZmFjZSBDb25maWcKLQl7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIEVjbGlwc2UgcHJvamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldyBKUEEgcHJvamVjdC4KLQkJICovCi0JCUlQcm9qZWN0IGdldFByb2plY3QoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBKUEEgcGxhdGZvcm0gdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgSlBBIHByb2plY3QuCi0JCSAqLwotCQlKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSB0byBiZSBhc3NvY2lhdGVkCi0JCSAqIHdpdGggdGhlIG5ldyBKUEEgcHJvamVjdC4gKFRoaXMgY29ubmVjdGlvbiBwcm9maWxlIHdyYXBzIGEgRFRQCi0JCSAqIGNvbm5lY3Rpb24gcHJvZmlsZS4pCi0JCSAqLwotCQlTdHJpbmcgZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgY2F0YWxvZyB0byB1c2UgaW5zdGVhZCBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlJ3MKLQkJICogZGVmYXVsdCBjYXRhbG9nLgotCQkgKiBNYXkgYmUgbnVsbC4KLQkJICovCi0JCVN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNjaGVtYSB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBzY2hlbWEKLQkJICogb2YgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkJICogTWF5IGJlIG51bGwuCi0JCSAqLwotCQlTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbmV3IEpQQSBwcm9qZWN0IGlzIHRvICJkaXNjb3ZlciIgYW5ub3RhdGVkCi0JCSAqIGNsYXNzZXMuCi0JCSAqLwotCQlib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVByb2plY3RNYW5hZ2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFQcm9qZWN0TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjAxOTE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVByb2plY3RNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLQotLyoqCi0gKiBUaGUgSlBBIHByb2plY3QgbWFuYWdlciBob2xkcyBhbGwgdGhlIEpQQSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUHJvamVjdE1hbmFnZXIKLQlleHRlbmRzIE1vZGVsCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgbW9kZWwncyBKUEEgcHJvamVjdHMuCi0JICovCi0JSXRlcmFibGU8SnBhUHJvamVjdD4gZ2V0SnBhUHJvamVjdHMoKTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX1BST0pFQ1RTX0NPTExFQ1RJT04gPSAianBhUHJvamVjdHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIEpQQSBtb2RlbCdzIGxpc3Qgb2YgSlBBIHByb2plY3RzLgotCSAqLwotCWludCBnZXRKcGFQcm9qZWN0c1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHByb2plY3QgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIEVjbGlwc2UKLQkgKiBwcm9qZWN0IHdpdGggYSBKUEEgcHJvamVjdC4KLQkgKi8KLQlKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIGZpbGUsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIGZpbGUgd2l0aCBhCi0JICogSlBBIGZpbGUuCi0JICovCi0JSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpOwotCi0JLyoqCi0JICogVGhlIEpQQSBzZXR0aW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QKLQkgKiBoYXZlIGNoYW5nZWQgaW4gc3VjaCBhIHdheSBhcyB0byByZXF1aXJlIHRoZSBhc3NvY2lhdGVkCi0JICogSlBBIHByb2plY3QgdG8gYmUgY29tcGxldGVseSByZWJ1aWx0Ci0JICogKGUuZy4gd2hlbiB0aGUgdXNlciBjaGFuZ2VzIGEgcHJvamVjdCdzIEpQQSBwbGF0Zm9ybSkuCi0JICovCi0Jdm9pZCByZWJ1aWxkSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtb2RlbCdzIEphdmEgY2hhbmdlIGxpc3RlbmVyIGlzIGFjdGl2ZS4KLQkgKi8KLQlib29sZWFuIGphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpOwotCi0JLyoqCi0JICogU2V0IHdoZXRoZXIgdGhlIG1vZGVsJ3MgSmF2YSBjaGFuZ2UgbGlzdGVuZXIgaXMgYWN0aXZlLgotCSAqLwotCXZvaWQgc2V0SmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKGJvb2xlYW4gamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI0MzRiOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotCi0vKioKLSAqIE1hcCBhIGNvbnRlbnQgdHlwZSB0byBhIEpQQSByZXNvdXJjZSBtb2RlbC4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciAKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbGUgY29udGVudCB0eXBlIHRoZSBwcm92aWRlciBpcyBmb3IuCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIEpQQSByZXNvdXJjZSBtb2RlbCBmb3IgdGhlIHNwZWNpZmllZCBKUEEgcHJvamVjdCBhbmQgZmlsZS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBmYWN0b3J5IGZvciBjcmVhdGlvbiBzbyBleHRlbmRlcnMgY2FuIHNpbXBseSBvdmVycmlkZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBjcmVhdGlvbiBtZXRob2QgaW5zdGVhZCBvZiBidWlsZGluZyBhIHByb3ZpZGVyIGZvciB0aGUKLQkgKiBzYW1lIGNvbnRlbnQuCi0JICovCi0JSnB0UmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVN0cnVjdHVyZU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwYVN0cnVjdHVyZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0ZGJkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcGFTdHJ1Y3R1cmVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIGZvciBvYmplY3RzIHRoYXQgYXBwZWFyIGluIHRoZSBTdHJ1Y3R1cmUgdmlldwotICogVGhpcyBpcyB1c2VkIGJ5IEpwYVNlbGVjdGlvbiB0byBkZXRlcm1pbmUgc2VsZWN0aW9uIGluIHRoZSBlZGl0b3IuCi0gKiBEZXRhaWxzIHBhZ2VzIGFyZSBhbHNvIHByb3ZpZGVkIGZvciBlYWNoIEpwYVN0cnVjdHVyZU5vZGUuCi0gKiAKLSAqIEkgZGlkIG5vdCBpbXBsZW1lbnQgSnBhQ29udGV4dE5vZGUgYW5kIEknbSBub3QgZXZlbiBzdXJlIHdlIHNob3VsZCBpbXBsZW1lbnQKLSAqIEpwYU5vZGUuICBJdCBpcyBwb3NzaWJseSBzb21lb25lIGNvdWxkIHdhbnQgYSBzdHJ1Y3R1cmUgbm9kZSB0aGF0IGlzCi0gKiBub3QgYWN0dWFsbHkgYSBjb250ZXh0Tm9kZSBpbiB0aGUgbW9kZWwuLy9UT0RPCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFTdHJ1Y3R1cmVOb2RlCi0JZXh0ZW5kcyBKcGFOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJ1Y3R1cmUgbm9kZSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LgotCSAqLwotCUpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIHRvIGJlIHVzZWQgdG8gc2VsZWN0IHRleHQgaW4gdGhlIGVkaXRvcgotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBub2RlLgotCSAqLwotCVRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYWxsIG9mIHRoaXMgY2xhc3Mgb2Ygc3RydWN0dXJlIG5vZGVzCi0JICovCi0JU3RyaW5nIGdldElkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHN0cnVjdHVyZSBub2RlJ3MgcmVzb3VyY2UuCi0JICogVGhpcyBpcyB1c2VkIHRvIGZpbmQgdGhlIGFwcHJvcHJpYXRlIHVpIHByb3ZpZGVyIGZvciBidWlsZGluZyBjb21wb3NpdGVzIAotCSAqLwotCUpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKTsKLQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmVOb2RlIGFuZCBkaXNwb3NlIG9mIGNoaWxkIHN0cnVjdHVyZU5vZGVzLgotCSAqIFR5cGljYWxseSB0aGlzIHdvdWxkIGJlIHVzZWQgdG8gdXBkYXRlIHRoZSBKcGFGaWxlIHJvb3RTdHJ1Y3R1cmVOb2Rlcy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwdEpwYUNvcmVQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL0pwdEpwYUNvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1ZmM5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9KcHRKcGFDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkluc3RhbmNlU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1NYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucHJlZnMuSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5HZW5lcmljUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5KMkVFQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLnV0aWwuSU1vZHVsZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5GYWNldGVkUHJvamVjdEZyYW1ld29yazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIFRoZSBEYWxpIGNvcmUgcGx1Zy1pbiBsaWZlY3ljbGUgaW1wbGVtZW50YXRpb24uCi0gKiBBIG51bWJlciBvZiBnbG9iYWxseS1hdmFpbGFibGUgY29uc3RhbnRzIGFuZCBtZXRob2RzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUNvcmVQbHVnaW4KLQlleHRlbmRzIFBsdWdpbgotewotCXByaXZhdGUgdm9sYXRpbGUgR2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyIGpwYVByb2plY3RNYW5hZ2VyOwotCXByaXZhdGUgdm9sYXRpbGUgU2VydmljZVRyYWNrZXI8PywgU0FYUGFyc2VyRmFjdG9yeT4gcGFyc2VyVHJhY2tlcjsKLQlwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGZsdXNoUHJlZmVyZW5jZXMgPSB0cnVlOwotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBjb25zdGFudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHBsdWctaW4gaWRlbnRpZmllciBvZiB0aGUgcGVyc2lzdGVuY2Ugc3VwcG9ydAotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlIjwvY29kZT4pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUiOyAgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF8gPSBQTFVHSU5fSUQgKyAnLic7Ci0KLQkvKioKLQkgKiBUaGUgbGVnYWN5IHBsdWctaW4gaWRlbnRpZmllciBvZiB0aGUgcGVyc2lzdGVuY2Ugc3VwcG9ydCwgdXNlZCBmb3IgcHJvamVjdCBwcmVmZXJlbmNlcwotCSAqICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuanB0LmNvcmUiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuY29yZSI7ICAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1BMVUdJTl9JRF8gPSBMRUdBQ1lfUExVR0lOX0lEICsgJy4nOwotCi0JLyoqCi0JICogVGhlIGtleSBmb3Igc3RvcmluZyBhIEpQQSBwcm9qZWN0J3MgcGxhdGZvcm0gSUQgaW4gdGhlIEVjbGlwc2UKLQkgKiBwcm9qZWN0J3MgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9QTEFURk9STV9QUkVGX0tFWSA9IExFR0FDWV9QTFVHSU5fSURfICsgInBsYXRmb3JtIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBvbGQga2V5IGZvciBzdG9yaW5nIHRoZSBkZWZhdWx0IEpQQSBwbGF0Zm9ybSBJRCBpbiB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2VzLgotCSAqIEBkZXByZWNhdGVkICBBcyBvZiB2ZXJzaW9uIDIuMy4gIEluc3RlYWQgdXNlIHtAbGluayAjREVGQVVMVF9KUEFfUExBVEZPUk1fMV8wX1BSRUZfS0VZfSBvciAKLQkgKiAJCXtAbGluayAjREVGQVVMVF9KUEFfUExBVEZPUk1fMl8wX1BSRUZfS0VZfQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KUEFfUExBVEZPUk1fUFJFRl9LRVkgPSAiZGVmYXVsdEpwYVBsYXRmb3JtIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIGRlZmF1bHQgSlBBIHBsYXRmb3JtIElEIGZvciBKUEEgMS4wIGluIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KUEFfUExBVEZPUk1fMV8wX1BSRUZfS0VZID0gCi0JCQlERUZBVUxUX0pQQV9QTEFURk9STV9QUkVGX0tFWSArICJfIiArIEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgdGhlIGRlZmF1bHQgSlBBIHBsYXRmb3JtIElEIGZvciBKUEEgMi4wIGluIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9KUEFfUExBVEZPUk1fMl8wX1BSRUZfS0VZID0gCi0JCQlERUZBVUxUX0pQQV9QTEFURk9STV9QUkVGX0tFWSArICJfIiArIEpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIHN0b3JpbmcgYSBKUEEgcHJvamVjdCdzICJkaXNjb3ZlciIgZmxhZyBpbiB0aGUgRWNsaXBzZQotCSAqIHByb2plY3QncyBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyA9IFBMVUdJTl9JRF8gKyAiZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8vYnVnIDM1NDc4MCAtIG1hZGUgdGhlIG1pc3Rha2Ugb2YgY2hhbmdpbmcgdGhlIHByb2plY3QgbWV0YWRhdGEgaW4gdGhlIDMuMCByZWxlYXNlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9ESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUyA9IExFR0FDWV9QTFVHSU5fSURfICsgImRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBzdG9yaW5nIHRoZSBuYW1lIG9mIGEgSlBBIHByb2plY3QncyBtZXRhbW9kZWwgc291cmNlIGZvbGRlcgotCSAqIGluIHRoZSBFY2xpcHNlIHByb2plY3QncyBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FID0gUExVR0lOX0lEXyArICJtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8vYnVnIDM1NDc4MCAtIG1hZGUgdGhlIG1pc3Rha2Ugb2YgY2hhbmdpbmcgdGhlIHByb2plY3QgbWV0YWRhdGEgaW4gdGhlIDMuMCByZWxlYXNlCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9NRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FID0gTEVHQUNZX1BMVUdJTl9JRF8gKyAibWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBzdG9yaW5nIGEgSlBBIHByb2plY3QncyBkYXRhIHNvdXJjZSBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZQotCSAqIGluIHRoZSBFY2xpcHNlIHByb2plY3QncyBwZXJzaXN0ZW50IHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIERBVEFfU09VUkNFX0NPTk5FQ1RJT05fUFJPRklMRV9OQU1FID0gCi0JCQluZXcgUXVhbGlmaWVkTmFtZShQTFVHSU5fSUQsICJkYXRhU291cmNlLmNvbm5lY3Rpb25Qcm9maWxlTmFtZSIpOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSBmb3Igc3RvcmluZyBhIEpQQSBwcm9qZWN0J3MgdXNlciBvdmVycmlkZGVuIGRlZmF1bHQgY2F0YWxvZyBuYW1lCi0JICogaW4gdGhlIEVjbGlwc2UgcHJvamVjdCdzIHBlcnNpc3RlbnQgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cgPSAKLQkJbmV3IFF1YWxpZmllZE5hbWUoUExVR0lOX0lELCAidXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dOYW1lIik7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBzdG9yaW5nIGEgSlBBIHByb2plY3QncyB1c2VyIG92ZXJyaWRkZW4gZGVmYXVsdCBzY2hlbWEgbmFtZQotCSAqIGluIHRoZSBFY2xpcHNlIHByb2plY3QncyBwZXJzaXN0ZW50IHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEgPSAKLQkJCW5ldyBRdWFsaWZpZWROYW1lKFBMVUdJTl9JRCwgInVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFOYW1lIik7ICAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSlBBIHZhbGlkYXRpb24gbWFya2VyCi0JICogKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhUHJvYmxlbU1hcmtlciI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9JRCA9IFBMVUdJTl9JRCArICIuanBhUHJvYmxlbU1hcmtlciI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIEpQQSB2YWxpZGF0b3IKLQkgKiAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFWYWxpZGF0b3IiPC9jb2RlPikuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVE9SX0lEID0gUExVR0lOX0lEXyArICJqcGFWYWxpZGF0b3IiOyAgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnRlbnQgdHlwZSBmb3IgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb250ZW50VHlwZSBQRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFID0gZ2V0SnBhQ29udGVudFR5cGUoInBlcnNpc3RlbmNlIik7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiB2ZXJzaW9uIDEuMCBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIFBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSA9IAotCQkJbmV3IEpwdFJlc291cmNlVHlwZShQRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuSlBBLlNDSEVNQV9WRVJTSU9OKTsKLQkKLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSBmb3IgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiB2ZXJzaW9uIDIuMCBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSnB0UmVzb3VyY2VUeXBlIFBFUlNJU1RFTkNFX1hNTF8yXzBfUkVTT1VSQ0VfVFlQRSA9IAotCQkJbmV3IEpwdFJlc291cmNlVHlwZShQRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5KUEEyXzAuU0NIRU1BX1ZFUlNJT04pOwotCQotCS8qKgotCSAqIFRoZSBiYXNlIGNvbnRlbnQgdHlwZSBmb3IgYWxsIG1hcHBpbmcgZmlsZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29udGVudFR5cGUgTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRSA9IGdldEpwYUNvbnRlbnRUeXBlKCJtYXBwaW5nRmlsZSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIGZvciA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtYXBwaW5nIGZpbGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbnRlbnRUeXBlIE9STV9YTUxfQ09OVEVOVF9UWVBFID0gZ2V0SnBhQ29udGVudFR5cGUoIm9ybSIpOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIDxjb2RlPm9ybS54bWw8L2NvZGU+IHZlcnNpb24gMS4wIG1hcHBpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBPUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFID0gCi0JCQluZXcgSnB0UmVzb3VyY2VUeXBlKE9STV9YTUxfQ09OVEVOVF9UWVBFLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQS5TQ0hFTUFfVkVSU0lPTik7Ci0JCi0JLyoqCi0JICogVGhlIHJlc291cmNlIHR5cGUgZm9yIDxjb2RlPm9ybS54bWw8L2NvZGU+IHZlcnNpb24gMi4wIG1hcHBpbmcgZmlsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwdFJlc291cmNlVHlwZSBPUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFID0gCi0JCQluZXcgSnB0UmVzb3VyY2VUeXBlKE9STV9YTUxfQ09OVEVOVF9UWVBFLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wLlNDSEVNQV9WRVJTSU9OKTsKLQkKLQkvKioKLQkgKiBXZWIgcHJvamVjdHMgaGF2ZSBzb21lIHNwZWNpYWwgZXhjZXB0aW9ucy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQcm9qZWN0RmFjZXQgV0VCX0ZBQ0VUCi0JCQk9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLkpTVF9XRUJfTU9EVUxFKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVBhdGggREVGQVVMVF9QRVJTSVNURU5DRV9YTUxfUlVOVElNRV9QQVRIID0gbmV3IFBhdGgoIk1FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElQYXRoIERFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEggPSBuZXcgUGF0aCgiTUVUQS1JTkYvb3JtLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSUNvbnRlbnRUeXBlIGdldEpwYUNvbnRlbnRUeXBlKFN0cmluZyBqcGFDb250ZW50VHlwZSkgewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGUoQ09OVEVOVF9QUkVGSVhfICsganBhQ29udGVudFR5cGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BSRUZJWCA9IFBMVUdJTl9JRF8gKyAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BSRUZJWF8gPSBDT05URU5UX1BSRUZJWCArICcuJzsKLQkKLQlwcml2YXRlIHN0YXRpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc2luZ2xldG9uICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEpwdEpwYUNvcmVQbHVnaW4gSU5TVEFOQ0U7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBEYWxpIGNvcmUgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpwYUNvcmVQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHVibGljIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ3VsYXIgSlBBIHByb2plY3QgbWFuYWdlciBjb3JyZXNwb25kaW5nCi0JICogdG8gdGhlIGN1cnJlbnQgd29ya3NwYWNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUHJvamVjdE1hbmFnZXIgZ2V0SnBhUHJvamVjdE1hbmFnZXIoKSB7Ci0JCXJldHVybiBJTlNUQU5DRS5nZXRKcGFQcm9qZWN0TWFuYWdlcl8oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QsCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdW5hYmxlIHRvIGFzc29jaWF0ZSB0aGUgc3BlY2lmaWVkIHByb2plY3Qgd2l0aCBhCi0JICogSlBBIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgZmlsZSwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmFibGUgdG8gYXNzb2NpYXRlIHRoZSBzcGVjaWZpZWQgZmlsZSB3aXRoIGEgSlBBIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFGaWxlIGdldEpwYUZpbGUoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRKcGFGaWxlKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIFRoZSBKUEEgc2V0dGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0Ci0JICogaGF2ZSBjaGFuZ2VkIGluIHN1Y2ggYSB3YXkgYXMgdG8gcmVxdWlyZSB0aGUgYXNzb2NpYXRlZAotCSAqIEpQQSBwcm9qZWN0IHRvIGJlIGNvbXBsZXRlbHkgcmVidWlsdAotCSAqIChlLmcuIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyBhIHByb2plY3QncyBKUEEgcGxhdGZvcm0pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWJ1aWxkSnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWdldEpwYVByb2plY3RNYW5hZ2VyKCkucmVidWlsZEpwYVByb2plY3QocHJvamVjdCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QgaGFzIGEgV2ViIGZhY2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwcm9qZWN0SGFzV2ViRmFjZXQoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gcHJvamVjdEhhc0ZhY2V0KHByb2plY3QsIFdFQl9GQUNFVCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tlZCBleGNlcHRpb25zIGJpdGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwcm9qZWN0SGFzRmFjZXQoSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldCBmYWNldCkgewotCQl0cnkgewotCQkJcmV0dXJuIEZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLmhhc1Byb2plY3RGYWNldChwcm9qZWN0LCBmYWNldC5nZXRJZCgpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJbG9nKGV4KTsgIC8vIHByb2JsZW1zIHJlYWRpbmcgdGhlIHByb2plY3QgbWV0YWRhdGEgLSBhc3N1bWUgZmFjZXQgZG9lc24ndCBleGlzdCAtIHJldHVybiAnZmFsc2UnCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKcGFGaWxlIGdldEpwYUZpbGUoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJSUZpbGUgeG1sRmlsZSA9IEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UGxhdGZvcm1GaWxlKHByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLQkJcmV0dXJuIHhtbEZpbGUuZXhpc3RzKCkgPyBnZXRKcGFGaWxlKHhtbEZpbGUpIDogbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBydW50aW1lIHBhdGggdG8gd2hpY2ggSkFScyBhcmUgcmVsYXRpdmVseSBzcGVjaWZpZWQgZm9yIAotCSAqIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIChXZWIgcHJvamVjdHMgaGF2ZSBhIGRpZmZlcmVudCBydW50aW1lIHN0cnVjdHVyZSB0aGFuIG5vbi13ZWIgcHJvamVjdHMuKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0SmFyUnVudGltZVJvb3RQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIHByb2plY3RIYXNXZWJGYWNldChwcm9qZWN0KSA/IAotCQkJCW5ldyBQYXRoKCIvIiArIEoyRUVDb25zdGFudHMuV0VCX0lORikgIC8vJE5PTi1OTFMtMSQKLQkJCQk6IG5ldyBQYXRoKCIvIik7ICAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBnZXREZWZhdWx0UHJlZmVyZW5jZXMoKTsKLQotCQkvLyBkZWZhdWx0IEpQQSBwbGF0Zm9ybXMKLQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBkZWZhdWx0UGxhdGZvcm1fMV8wID0gCi0JCQkJSnBhUGxhdGZvcm1NYW5hZ2VySW1wbC5pbnN0YW5jZSgpLmdldERlZmF1bHRKcGFQbGF0Zm9ybShKcGFGYWNldC5WRVJTSU9OXzFfMCk7Ci0JCWlmIChkZWZhdWx0UGxhdGZvcm1fMV8wID09IG51bGwpIHsKLQkJCWRlZmF1bHRQbGF0Zm9ybV8xXzAgPSBHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8xXzA7Ci0JCX0KLQkJbm9kZS5wdXQoREVGQVVMVF9KUEFfUExBVEZPUk1fMV8wX1BSRUZfS0VZLCBkZWZhdWx0UGxhdGZvcm1fMV8wLmdldElkKCkpOwotCQkKLQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBkZWZhdWx0UGxhdGZvcm1fMl8wID0gCi0JCQkJSnBhUGxhdGZvcm1NYW5hZ2VySW1wbC5pbnN0YW5jZSgpLmdldERlZmF1bHRKcGFQbGF0Zm9ybShKcGFGYWNldC5WRVJTSU9OXzJfMCk7Ci0JCWlmIChkZWZhdWx0UGxhdGZvcm1fMl8wID09IG51bGwpIHsKLQkJCWRlZmF1bHRQbGF0Zm9ybV8yXzAgPSBHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8yXzA7Ci0JCX0KLQkJbm9kZS5wdXQoREVGQVVMVF9KUEFfUExBVEZPUk1fMl8wX1BSRUZfS0VZLCBkZWZhdWx0UGxhdGZvcm1fMl8wLmdldElkKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgRGFsaSBwcmVmZXJlbmNlcwotCSAqIEBzZWUgSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldERlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKERlZmF1bHRTY29wZS5JTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEYWxpIHByZWZlcmVuY2VzIGZvciB0aGUgY3VycmVudCB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJRWNsaXBzZVByZWZlcmVuY2VzIGdldFdvcmtzcGFjZVByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoSW5zdGFuY2VTY29wZS5JTlNUQU5DRSk7Ci0JfQotCQotCS8qKgotCSAqIFNldCB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldFdvcmtzcGFjZVByZWZlcmVuY2UoU3RyaW5nIHByZWZlcmVuY2VLZXksIFN0cmluZyBwcmVmZXJlbmNlVmFsdWUpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFdvcmtzcGFjZVByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnB1dChwcmVmZXJlbmNlS2V5LCBwcmVmZXJlbmNlVmFsdWUpOwotCQlmbHVzaChwcmVmcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEYWxpIHByZWZlcmVuY2VzIGZvciB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkpOwotCX0KLQkKLQkvKioKLQkgKiBTZXQgdGhlIHByb2plY3QgcHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9qZWN0UHJlZmVyZW5jZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSwgU3RyaW5nIHByZWZlcmVuY2VWYWx1ZSkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotCQlpZiAocHJlZmVyZW5jZVZhbHVlID09IG51bGwpIHsKLQkJCXByZWZzLnJlbW92ZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQllbHNlIHsKLQkJCXByZWZzLnB1dChwcmVmZXJlbmNlS2V5LCBwcmVmZXJlbmNlVmFsdWUpOwotCQl9Ci0JCWZsdXNoKHByZWZzKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBwcm9qZWN0IHByZWZlcmVuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0UHJvamVjdFByZWZlcmVuY2UoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gcHJlZmVyZW5jZVZhbHVlKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCk7Ci0JCXByZWZzLnB1dEJvb2xlYW4ocHJlZmVyZW5jZUtleSwgcHJlZmVyZW5jZVZhbHVlKTsKLQkJZmx1c2gocHJlZnMpOwotCX0KLQkKLQkvKioKLQkgKiBDbGVhcnMgdGhlIHByb2plY3Qgb2YgSlBBLXNwZWNpZmljIHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsZWFyUHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJY2xlYXJQcm9qZWN0UHJlZmVyZW5jZXMoCi0JCQkJcHJvamVjdCwgCi0JCQkJSlBBX1BMQVRGT1JNX1BSRUZfS0VZLAotCQkJCURJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLAotCQkJCU1FVEFNT0RFTF9TT1VSQ0VfRk9MREVSX05BTUUsCi0JCQkJTEVHQUNZX0RJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLAotCQkJCUxFR0FDWV9NRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FKTsKLQl9Ci0JCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBzcGVjaWZpZWQgcHJlZmVyZW5jZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJQcm9qZWN0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIC4uLiBwcmVmZXJlbmNlS2V5cykgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotCQlmb3IgKFN0cmluZyBwcmVmZXJlbmNlS2V5IDogcHJlZmVyZW5jZUtleXMpIHsKLQkJCXByZWZzLnJlbW92ZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQlmbHVzaChwcmVmcyk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgRGFsaSBwcmVmZXJlbmNlcyBmb3IgdGhlIHNwZWNpZmllZCBjb250ZXh0LgotCSAqLwotCXByaXZhdGUgc3RhdGljIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVNjb3BlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBjb250ZXh0LmdldE5vZGUoTEVHQUNZX1BMVUdJTl9JRCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB7QGxpbmsgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbn0gZm9yIG5ldyBKUEEgcHJvamVjdHMgd2l0aCB0aGUgZ2l2ZW4gSlBBIGZhY2V0IHZlcnNpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlZmF1bHRKcGFQbGF0Zm9ybShJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb24pIHsKLQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBkZWZhdWx0UGxhdGZvcm0gPSAKLQkJCQlnZXREZWZhdWx0SnBhUGxhdGZvcm0oanBhRmFjZXRWZXJzaW9uLCBnZXRXb3Jrc3BhY2VQcmVmZXJlbmNlcygpLCBnZXREZWZhdWx0UHJlZmVyZW5jZXMoKSk7Ci0JCWlmIChkZWZhdWx0UGxhdGZvcm0gPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIHBsYXRmb3JtIElEIHN0b3JlZCBpbiB0aGUgd29ya3NwYWNlIHByZWZzIGlzIGludmFsaWQgKGkuZS4gbnVsbCksIGxvb2sgaW4gdGhlIGRlZmF1bHQgcHJlZnMKLQkJCWRlZmF1bHRQbGF0Zm9ybSA9IGdldERlZmF1bHRKcGFQbGF0Zm9ybShqcGFGYWNldFZlcnNpb24sIGdldERlZmF1bHRQcmVmZXJlbmNlcygpKTsKLQkJfQotCQlyZXR1cm4gZGVmYXVsdFBsYXRmb3JtOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlZmF1bHRKcGFQbGF0Zm9ybShJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb24sIFByZWZlcmVuY2VzIC4uLiBub2RlcykgewotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGRlZmF1bHREZWZhdWx0UGxhdGZvcm0gPSAKLQkJCQlnZXREZWZhdWx0SnBhUGxhdGZvcm0oanBhRmFjZXRWZXJzaW9uLCBERUZBVUxUX0pQQV9QTEFURk9STV9QUkVGX0tFWSwgbnVsbCwgbm9kZXMpOwotCQlTdHJpbmcgcHJlZmVyZW5jZUtleSA9IG51bGw7Ci0JCWlmIChqcGFGYWNldFZlcnNpb24uZXF1YWxzKEpwYUZhY2V0LlZFUlNJT05fMV8wKSkgewotCQkJaWYgKGRlZmF1bHREZWZhdWx0UGxhdGZvcm0gPT0gbnVsbCkgewotCQkJCWRlZmF1bHREZWZhdWx0UGxhdGZvcm0gPSBHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8xXzA7Ci0JCQl9Ci0JCQlwcmVmZXJlbmNlS2V5ID0gREVGQVVMVF9KUEFfUExBVEZPUk1fMV8wX1BSRUZfS0VZOyAKLQkJfQotCQllbHNlIGlmIChqcGFGYWNldFZlcnNpb24uZXF1YWxzKEpwYUZhY2V0LlZFUlNJT05fMl8wKSkgewotCQkJaWYgKGRlZmF1bHREZWZhdWx0UGxhdGZvcm0gPT0gbnVsbCkgewotCQkJCWRlZmF1bHREZWZhdWx0UGxhdGZvcm0gPSBHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8yXzA7Ci0JCQl9Ci0JCQlwcmVmZXJlbmNlS2V5ID0gREVGQVVMVF9KUEFfUExBVEZPUk1fMl8wX1BSRUZfS0VZOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBKUEEgZmFjZXQgdmVyc2lvbjogIiArIGpwYUZhY2V0VmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0RGVmYXVsdEpwYVBsYXRmb3JtKGpwYUZhY2V0VmVyc2lvbiwgcHJlZmVyZW5jZUtleSwgZGVmYXVsdERlZmF1bHRQbGF0Zm9ybSwgbm9kZXMpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlZmF1bHRKcGFQbGF0Zm9ybSgKLQkJCUlQcm9qZWN0RmFjZXRWZXJzaW9uIGpwYUZhY2V0VmVyc2lvbiwgU3RyaW5nIHByZWZlcmVuY2VLZXksIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZGVmYXVsdERlZmF1bHQsIFByZWZlcmVuY2VzIC4uLiBub2RlcykgewkKLQkJCi0JCVN0cmluZyBkZWZhdWx0RGVmYXVsdElkID0gKGRlZmF1bHREZWZhdWx0ID09IG51bGwpID8gbnVsbCA6IGRlZmF1bHREZWZhdWx0LmdldElkKCk7Ci0JCVN0cmluZyBkZWZhdWx0UGxhdGZvcm1JZCA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldChwcmVmZXJlbmNlS2V5LCBkZWZhdWx0RGVmYXVsdElkLCBub2Rlcyk7Ci0JCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZGVmYXVsdFBsYXRmb3JtID0gZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oZGVmYXVsdFBsYXRmb3JtSWQpOwotCQlpZiAoZGVmYXVsdFBsYXRmb3JtICE9IG51bGwgJiYgZGVmYXVsdFBsYXRmb3JtLnN1cHBvcnRzSnBhRmFjZXRWZXJzaW9uKGpwYUZhY2V0VmVyc2lvbikpIHsKLQkJCXJldHVybiBkZWZhdWx0UGxhdGZvcm07Ci0JCX0KLQkJZWxzZSBpZiAoZGVmYXVsdERlZmF1bHQgIT0gbnVsbCAmJiBkZWZhdWx0RGVmYXVsdC5zdXBwb3J0c0pwYUZhY2V0VmVyc2lvbihqcGFGYWNldFZlcnNpb24pKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdERlZmF1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1NYW5hZ2VyIGdldEpwYVBsYXRmb3JtTWFuYWdlcigpIHsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtTWFuYWdlckltcGwuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRlZmF1bHQgSlBBIHBsYXRmb3JtIElEIGZvciBjcmVhdGluZyBuZXcgSlBBIHByb2plY3RzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlZmF1bHRKcGFQbGF0Zm9ybUlkKFN0cmluZyBqcGFGYWNldFZlcnNpb24sIFN0cmluZyBwbGF0Zm9ybUlkKSB7Ci0JCVN0cmluZyBwcmVmZXJlbmNlS2V5ID0gbnVsbDsKLQkJaWYgKEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKS5lcXVhbHMoanBhRmFjZXRWZXJzaW9uKSkgewotCQkJcHJlZmVyZW5jZUtleSA9IERFRkFVTFRfSlBBX1BMQVRGT1JNXzFfMF9QUkVGX0tFWTsKLQkJfQotCQllbHNlIGlmIChKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkuZXF1YWxzKGpwYUZhY2V0VmVyc2lvbikpIHsKLQkJCXByZWZlcmVuY2VLZXkgPSBERUZBVUxUX0pQQV9QTEFURk9STV8yXzBfUFJFRl9LRVk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIEpQQSBmYWNldCB2ZXJzaW9uOiAiICsganBhRmFjZXRWZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFdvcmtzcGFjZVByZWZlcmVuY2UocHJlZmVyZW5jZUtleSwgcGxhdGZvcm1JZCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHBsYXRmb3JtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUlkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KS5nZXQoSlBBX1BMQVRGT1JNX1BSRUZfS0VZLCBHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8xXzAuZ2V0SWQoKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIHBsYXRmb3JtIGRlc2NyaXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBqcGFQbGF0Zm9ybUlkID0gZ2V0SnBhUGxhdGZvcm1JZChwcm9qZWN0KTsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKGpwYVBsYXRmb3JtSWQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgSlBBIHBsYXRmb3JtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0SnBhUGxhdGZvcm1JZChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcganBhUGxhdGZvcm1JZCkgewotCQlzZXRQcm9qZWN0UHJlZmVyZW5jZShwcm9qZWN0LCBKUEFfUExBVEZPUk1fUFJFRl9LRVksIGpwYVBsYXRmb3JtSWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJlZmVyZW5jZXMga2V5IHVzZWQgdG8gbG9vayB1cCBhbiBFY2xpcHNlIHByb2plY3QncwotCSAqIEpQQSBwbGF0Zm9ybSBJRC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUlkUHJlZktleSgpIHsKLQkJcmV0dXJuIEpQQV9QTEFURk9STV9QUkVGX0tFWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSAiZGlzY292ZXIiIGZsYWcgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBFY2xpcHNlIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCkuZ2V0KERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCBudWxsKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpLmdldEJvb2xlYW4oRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGZhbHNlKTsKLQkJfQotCQkvL2J1ZyAzNTQ3ODAgLSBtYWRlIHRoZSBtaXN0YWtlIG9mIGNoYW5naW5nIHRoZSBwcm9qZWN0IG1ldGFkYXRhIGluIHRoZSAzLjAgcmVsZWFzZQotCQlyZXR1cm4gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpLmdldEJvb2xlYW4oTEVHQUNZX0RJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBKUEEgImRpc2NvdmVyIiBmbGFnIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBkaXNjb3ZlckFubm90YXRlZENsYXNzZXMpIHsKLQkJc2V0UHJvamVjdFByZWZlcmVuY2UocHJvamVjdCwgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBtZXRhbW9kZWwgc291cmNlIGZvbGRlciBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUgPSBnZXRQcm9qZWN0UHJlZmVyZW5jZXMocHJvamVjdCkuZ2V0KE1FVEFNT0RFTF9TT1VSQ0VfRk9MREVSX05BTUUsIG51bGwpOwotCQlpZiAobWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZTsKLQkJfQotCQkvL2J1ZyAzNTQ3ODAgLSBtYWRlIHRoZSBtaXN0YWtlIG9mIGNoYW5naW5nIHRoZSBwcm9qZWN0IG1ldGFkYXRhIGluIHRoZSAzLjAgcmVsZWFzZQotCQlyZXR1cm4gZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpLmdldChMRUdBQ1lfTUVUQU1PREVMX1NPVVJDRV9GT0xERVJfTkFNRSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBuYW1lIG9mIHRoZSBtZXRhbW9kZWwgc291cmNlIGZvbGRlciBhc3NvY2lhdGVkIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSkgewotCQlzZXRQcm9qZWN0UHJlZmVyZW5jZShwcm9qZWN0LCBNRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FLCBtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKTsKLQkJLy9idWcgMzU0NzgwIC0gbWFkZSB0aGUgbWlzdGFrZSBvZiBjaGFuZ2luZyB0aGUgcHJvamVjdCBtZXRhZGF0YSBpbiB0aGUgMy4wIHJlbGVhc2UuCi0JCS8vbWFrZSBzdXJlIGxlZ2FjeSBzZXR0aW5nIGlzIHJlbW92ZWQgd2hlbiB0dXJuaW5nIG9mZiBtZXRhbW9kZWwgZ2VuLCBpZiB3ZSBkb24ndCB0aGVuCi0JCS8vdGhlcmUgd2lsbCBiZSBubyB3YXkgdG8gdHVybiBvZmYgbWVhdGFtb2RlbCBnZW4gd2l0aG91dCBzYWNyaWZpY2luZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQotCQlpZihtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lID09IG51bGwpIHsKLQkJCXNldFByb2plY3RQcmVmZXJlbmNlKHByb2plY3QsIExFR0FDWV9NRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FLCBudWxsKTsKLQkJfQotCQkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKHZpYSByZWZsZWN0aW9uKSB3aGVuIHRoZSB0ZXN0IHBsdWctaW4gaXMgbG9hZGVkLgotCSAqIFRoZSBwcmVmZXJlbmNlcyBlbmQgdXAgZ2V0dGluZyBmbHVzaGVkIGFmdGVyIHRoZSB0ZXN0IGNhc2UgaGFzIGRlbGV0ZWQKLQkgKiBpdHMgcHJvamVjdCwgcmVzdWx0aW5nIGluIHJlc291cmNlIGV4Y2VwdGlvbnMgaW4gdGhlIGxvZywgZS5nLgotCSAqIDxwcmU+Ci0JICogICAgIFJlc291cmNlICcvSnBhUHJvamVjdE1hbmFnZXJUZXN0cycgaXMgbm90IG9wZW4uCi0JICogPC9wcmU+Ci0JICogU2VlIDxjb2RlPkpwdENvcmVUZXN0c1BsdWdpbi5zdGFydChCdW5kbGVDb250ZXh0KTwvY29kZT4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRvTm90Rmx1c2hQcmVmZXJlbmNlcygpIHsKLQkJZmx1c2hQcmVmZXJlbmNlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEZsdXNoIHByZWZlcmVuY2VzIGluIGFuIGFzeW5jaHJvbm91cyBKb2IgYmVjYXVzZSB0aGUgZmx1c2ggcmVxdWVzdCB3aWxsCi0JICogdHJpZ2dlciBhIGxvY2sgb24gdGhlIHByb2plY3QsIHdoaWNoIGNhbiBjYXVzZSB1cyBzb21lIGRlYWRsb2NrcyAoZS5nLgotCSAqIHdoZW4gZGVsZXRpbmcgdGhlIG1ldGFtb2RlbCBzb3VyY2UgZm9sZGVyKS4KLQkgKiBOb3RlOiB0aGUgZmx1c2ggd2lsbCBhbHNvIHJlbW92ZSB0aGUgcHJlZnMgbm9kZSBpZiBpdCBpcyBlbXB0eQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZmx1c2goSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmcykgewotCQlpZiAoZmx1c2hQcmVmZXJlbmNlcykgewotCQkJbmV3IFByZWZlcmVuY2VzRmx1c2hKb2IocHJlZnMpLnNjaGVkdWxlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQcmVmZXJlbmNlc0ZsdXNoSm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBmaW5hbCBJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZzOwotCQlQcmVmZXJlbmNlc0ZsdXNoSm9iKElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJCXN1cGVyKE5MUy5iaW5kKEpwdENvcmVNZXNzYWdlcy5QUkVGRVJFTkNFU19GTFVTSF9KT0JfTkFNRSwgcHJlZnMuYWJzb2x1dGVQYXRoKCkpKTsKLQkJCXRoaXMucHJlZnMgPSBwcmVmczsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdHJ5IHsKLQkJCQl0aGlzLnByZWZzLmZsdXNoKCk7Ci0JCQl9IGNhdGNoKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBleCkgewotCQkJCWxvZyhleCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogRWNsaXBzZSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lID0gcHJvamVjdC5nZXRQZXJzaXN0ZW50UHJvcGVydHkoREFUQV9TT1VSQ0VfQ09OTkVDVElPTl9QUk9GSUxFX05BTUUpOwotCQkJLy8gc29tZSBvbGQgY29ubmVjdGlvbiBwcm9maWxlIG5hbWVzIHdlcmUgc3RvcmVkIGFzIGVtcHR5IHN0cmluZ3MgaW5zdGVhZCBvZiBudWxscyA6LSgKLQkJCS8vIGNvbnZlcnQgdGhlbSBoZXJlCi0JCQlyZXR1cm4gKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY29ubmVjdGlvblByb2ZpbGVOYW1lKSkgPyBudWxsIDogY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIEVjbGlwc2UgcHJvamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWUpIHsKLQkJdHJ5IHsKLQkJCXByb2plY3Quc2V0UGVyc2lzdGVudFByb3BlcnR5KERBVEFfU09VUkNFX0NPTk5FQ1RJT05fUFJPRklMRV9OQU1FLCBjb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2coZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGNhdGFsb2cgKGlkZW50aWZpZXIpIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIEVjbGlwc2UgcHJvamVjdC4KLQkgKiBAc2VlIEpwYVByb2plY3QjZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZGVmYXVsdCBjYXRhbG9nIChpZGVudGlmaWVyKSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBFY2xpcHNlIHByb2plY3QuCi0JICogQHNlZSBKcGFQcm9qZWN0I3NldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIGRlZmF1bHRDYXRhbG9nKSB7Ci0JCXRyeSB7Ci0JCQlwcm9qZWN0LnNldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgZGVmYXVsdENhdGFsb2cpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlsb2coZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHNjaGVtYSAoaWRlbnRpZmllcikgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqIEBzZWUgSnBhUHJvamVjdCNnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKElQcm9qZWN0IHByb2plY3QpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBwcm9qZWN0LmdldFBlcnNpc3RlbnRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJbG9nKGV4KTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkZWZhdWx0IHNjaGVtYSAoaWRlbnRpZmllcikgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRWNsaXBzZSBwcm9qZWN0LgotCSAqIEBzZWUgSnBhUHJvamVjdCNzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZGVmYXVsdFNjaGVtYSkgewotCQl0cnkgewotCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgZGVmYXVsdFNjaGVtYSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCWxvZyhleCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ2xlYXIgdGhlIEpQQS1zcGVjaWZpYyBwcm9qZWN0IHByb3BlcnRpZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xlYXJQcm9qZWN0UGVyc2lzdGVudFByb3BlcnRpZXMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoREFUQV9TT1VSQ0VfQ09OTkVDVElPTl9QUk9GSUxFX05BTUUsIG51bGwpOwotCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIG51bGwpOwotCQkJcHJvamVjdC5zZXRQZXJzaXN0ZW50UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCWxvZyhjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gbm9kZUlzSnBhMl8wQ29tcGF0aWJsZShKcGFOb2RlIGpwYU5vZGUpIHsKLQkJcmV0dXJuIGpwYU5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SnBhVmVyc2lvbigpLmlzQ29tcGF0aWJsZVdpdGhKcGFWZXJzaW9uKEpwYUZhY2V0LlZFUlNJT05fMl8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG5vZGVJc1htbDJfMENvbXBhdGlibGUoWG1sQ29udGV4dE5vZGUgeG1sQ29udGV4dE5vZGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZUlzQ29tcGF0aWJsZSh4bWxDb250ZXh0Tm9kZS5nZXRSZXNvdXJjZVR5cGUoKSwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMC5TQ0hFTUFfVkVSU0lPTik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlc291cmNlVHlwZUlzQ29tcGF0aWJsZShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlLCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gSnBhUGxhdGZvcm0uVmVyc2lvbi5WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZShyZXNvdXJjZVR5cGUuZ2V0VmVyc2lvbigpLCB2ZXJzaW9uKSA+PSAwOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBKUEEgcHJvamVjdCBtYW5hZ2VyJ3MgSmF2YSBjaGFuZ2UgbGlzdGVuZXIgaXMgYWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0TWFuYWdlcigpLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoZSBKUEEgcHJvamVjdCBtYW5hZ2VyJ3MgSmF2YSBjaGFuZ2UgbGlzdGVuZXIgaXMgYWN0aXZlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoYm9vbGVhbiBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUpIHsKLQkJZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5zZXRKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVySXNBY3RpdmUoamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcklzQWN0aXZlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotICAgICAgICBsb2cobXNnLCBudWxsKTsKLSAgICB9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyh0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCB0aHJvd2FibGUpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYW5kIGV4Y2VwdGlvbiBvciBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2csIFRocm93YWJsZSB0aHJvd2FibGUpIHsKLQkJbG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtc2csIHRocm93YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIExvZyB0aGUgc3BlY2lmaWVkIHN0YXR1cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKElTdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgIElOU1RBTkNFLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQotCi0JLy8gKioqKioqKioqKiBwbHVnLWluIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRKcGFDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCS8vIG5vdGhpbmcgeWV0Li4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKHRoaXMuanBhUHJvamVjdE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCXRoaXMuanBhUHJvamVjdE1hbmFnZXIuc3RvcCgpOwotCQkJCXRoaXMuanBhUHJvamVjdE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQkJaWYgKHRoaXMucGFyc2VyVHJhY2tlciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5wYXJzZXJUcmFja2VyLmNsb3NlKCk7Ci0JCQkJdGhpcy5wYXJzZXJUcmFja2VyID0gbnVsbDsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIgZ2V0SnBhUHJvamVjdE1hbmFnZXJfKCkgewotCQlpZiAodGhpcy5qcGFQcm9qZWN0TWFuYWdlciA9PSBudWxsKSB7Ci0JCQl0aGlzLmpwYVByb2plY3RNYW5hZ2VyID0gdGhpcy5idWlsZEpwYVByb2plY3RNYW5hZ2VyKCk7Ci0JCQl0aGlzLmpwYVByb2plY3RNYW5hZ2VyLnN0YXJ0KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdE1hbmFnZXI7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIgYnVpbGRKcGFQcm9qZWN0TWFuYWdlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFNBWFBhcnNlckZhY3RvcnkgZ2V0U0FYUGFyc2VyRmFjdG9yeSgpIHsKLQkJU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gdGhpcy5nZXRQYXJzZXJUcmFja2VyKCkuZ2V0U2VydmljZSgpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByaXZhdGUgU2VydmljZVRyYWNrZXI8PywgU0FYUGFyc2VyRmFjdG9yeT4gZ2V0UGFyc2VyVHJhY2tlcigpIHsKLQkJaWYgKHRoaXMucGFyc2VyVHJhY2tlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnBhcnNlclRyYWNrZXIgPSB0aGlzLmJ1aWxkUGFyc2VyVHJhY2tlcigpOwotCQkJdGhpcy5wYXJzZXJUcmFja2VyLm9wZW4oKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wYXJzZXJUcmFja2VyOwotCX0KLQotCXByaXZhdGUgU2VydmljZVRyYWNrZXI8PywgU0FYUGFyc2VyRmFjdG9yeT4gYnVpbGRQYXJzZXJUcmFja2VyKCkgewotCQlyZXR1cm4gbmV3IFNlcnZpY2VUcmFja2VyPE9iamVjdCwgU0FYUGFyc2VyRmFjdG9yeT4odGhpcy5nZXRCdW5kbGUoKS5nZXRCdW5kbGVDb250ZXh0KCksICJqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5IiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL01hcHBpbmdLZXlzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9NYXBwaW5nS2V5cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU1NmM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL01hcHBpbmdLZXlzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ0tleXMgewotCi0JU3RyaW5nIEVOVElUWV9UWVBFX01BUFBJTkdfS0VZID0gImVudGl0eSI7Ci0JU3RyaW5nIE1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkgPSAibWFwcGVkU3VwZXJjbGFzcyI7Ci0JU3RyaW5nIEVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSA9ICJlbWJlZGRhYmxlIjsKLQlTdHJpbmcgTlVMTF9UWVBFX01BUFBJTkdfS0VZID0gbnVsbDsKLQotCVN0cmluZyBCQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiYmFzaWMiOwotCVN0cmluZyBJRF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiaWQiOwotCVN0cmluZyBWRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJ2ZXJzaW9uIjsKLQlTdHJpbmcgT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkgID0gIm9uZVRvT25lIjsKLQlTdHJpbmcgT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gIm9uZVRvTWFueSI7Ci0JU3RyaW5nIE1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSA9ICJtYW55VG9PbmUiOwotCVN0cmluZyBNQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZID0gIm1hbnlUb01hbnkiOwotCVN0cmluZyBFTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiZW1iZWRkZWQiOwotCVN0cmluZyBFTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAiZW1iZWRkZWRJZCI7Ci0JU3RyaW5nIFRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidHJhbnNpZW50IjsKLQlTdHJpbmcgTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSBudWxsOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9SZXNvdXJjZURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL1Jlc291cmNlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzczZmUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL1Jlc291cmNlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotCi0vKioKLSAqIEEgSlBBIHBsYXRmb3JtIGNhbiBzdXBwb3J0IG11bHRpcGxlIHJlc291cmNlcy4gRWFjaCB3aWxsCi0gKiBoYXZlIGEgdW5pcXVlIHJlc291cmNlIHR5cGUgYW5kIG11c3QgYmUgZGVmaW5lZCB3aXRoIGEgcmVzb3VyY2UgZGVmaW5pdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlRGVmaW5pdGlvbgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmaW5pdGlvbidzIHJlc291cmNlIHR5cGUuCi0JICovCi0JSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9BY2Nlc3NIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQWNjZXNzSG9sZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmOWQxNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9BY2Nlc3NIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgaW50ZXJlc3RlZCBvbmx5IGluIGEgdHlwZQotICogb3IgYXR0cmlidXRlJ3MgYWNjZXNzIHNldHRpbmcgKGUuZy4gYSBVSSBjb21wb3NpdGUpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWNjZXNzSG9sZGVyCi0JZXh0ZW5kcyBSZWFkT25seUFjY2Vzc0hvbGRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFjY2VzcyB0eXBlOwotCSAqLwotCUFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgYWNjZXNzIHR5cGUuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBuZXdTcGVjaWZpZWRBY2Nlc3MpOwotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgYWNjZXNzIHR5cGUKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSA9ICJzcGVjaWZpZWRBY2Nlc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgYWNjZXNzIHR5cGUKLQkgKi8KLQlBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKTsKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVmYXVsdCBhY2Nlc3MgdHlwZQotCSAqLwotCVN0cmluZyBERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSA9ICJkZWZhdWx0QWNjZXNzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9BY2Nlc3NUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0FjY2Vzc1R5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwYWZmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0FjY2Vzc1R5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci0KLS8qKgotICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvOjx1bD4KLSAqIDxsaT50aGUgWE1MIHJlc291cmNlIG1vZGVsCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlfSwKLSAqIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5hY2Nlc3M8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLgotICogPGxpPnRoZSBKYXZhIHJlc291cmNlIG1vZGVsIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlfQotICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkFjY2VzczwvY29kZT4gYW5ub3RhdGlvbi4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBY2Nlc3NUeXBlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWNjZXNzVHlwZSBGSUVMRCA9IG5ldyBBY2Nlc3NUeXBlKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZS5GSUVMRCwKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwKLQkJCSJGaWVsZCIgLy8kTk9OLU5MUy0xJAotCQkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQWNjZXNzVHlwZSBQUk9QRVJUWSA9IG5ldyBBY2Nlc3NUeXBlKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZS5QUk9QRVJUWSwKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwKLQkJCSJQcm9wZXJ0eSIgLy8kTk9OLU5MUy0xJAotCQkpOwotCi0KLQlwcm90ZWN0ZWQgZmluYWwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZTsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG9ybUFjY2Vzc1R5cGU7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBkaXNwbGF5U3RyaW5nOwotCi0JcHVibGljIEFjY2Vzc1R5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSwgU3RyaW5nIG9ybUFjY2Vzc1R5cGUsIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCWlmIChvcm1BY2Nlc3NUeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFjY2Vzc1R5cGUgPSBqYXZhQWNjZXNzVHlwZTsKLQkJdGhpcy5vcm1BY2Nlc3NUeXBlID0gb3JtQWNjZXNzVHlwZTsKLQkJdGhpcy5kaXNwbGF5U3RyaW5nID0gZGlzcGxheVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSBnZXRKYXZhQWNjZXNzVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFjY2Vzc1R5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPcm1BY2Nlc3NUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1BY2Nlc3NUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgQWNjZXNzVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSwgSnBhUGxhdGZvcm0ganBhUGxhdGZvcm0sIEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIChqYXZhQWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YVJlc291cmNlTW9kZWxfKGphdmFBY2Nlc3NUeXBlLCBqcGFQbGF0Zm9ybSwgcmVzb3VyY2VUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBBY2Nlc3NUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZSBqYXZhQWNjZXNzVHlwZSwgSnBhUGxhdGZvcm0ganBhUGxhdGZvcm0sIEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJZm9yIChBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgOiBqcGFQbGF0Zm9ybS5nZXRKcGFWYXJpYXRpb24oKS5nZXRTdXBwb3J0ZWRBY2Nlc3NUeXBlcyhyZXNvdXJjZVR5cGUpKSB7Ci0JCQlpZiAoYWNjZXNzVHlwZS5nZXRKYXZhQWNjZXNzVHlwZSgpID09IGphdmFBY2Nlc3NUeXBlKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7Ci0JCXJldHVybiAoYWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NUeXBlLmdldEphdmFBY2Nlc3NUeXBlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBY2Nlc3NUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKFN0cmluZyBvcm1BY2Nlc3NUeXBlLCBKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSwgSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gKG9ybUFjY2Vzc1R5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbU9ybVJlc291cmNlTW9kZWxfKG9ybUFjY2Vzc1R5cGUsIGpwYVBsYXRmb3JtLCByZXNvdXJjZVR5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEFjY2Vzc1R5cGUgZnJvbU9ybVJlc291cmNlTW9kZWxfKFN0cmluZyBvcm1BY2Nlc3NUeXBlLCBKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSwgSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlmb3IgKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA6IGpwYVBsYXRmb3JtLmdldEpwYVZhcmlhdGlvbigpLmdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKHJlc291cmNlVHlwZSkpIHsKLQkJCWlmIChhY2Nlc3NUeXBlLmdldE9ybUFjY2Vzc1R5cGUoKS5lcXVhbHMob3JtQWNjZXNzVHlwZSkpIHsKLQkJCQlyZXR1cm4gYWNjZXNzVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b09ybVJlc291cmNlTW9kZWwoQWNjZXNzVHlwZSBhY2Nlc3NUeXBlKSB7Ci0JCXJldHVybiAoYWNjZXNzVHlwZSA9PSBudWxsKSA/IG51bGwgOiBhY2Nlc3NUeXBlLmdldE9ybUFjY2Vzc1R5cGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNzE1MzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIDxlbT5TcGVjaWZpZWQ8L2VtPiBhc3NvY2lhdGlvbiBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZQotCWV4dGVuZHMgT3ZlcnJpZGVfLCBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUKLXsKLQl2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvbGRPdmVycmlkZSk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlKTsKLQotCS8vIGNvdmFyaWFudCBvdmVycmlkZXMKLQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0VG9WaXJ0dWFsKCk7Ci0KLQlPdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMTRkZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyLgotICogVXNlZCBieSBlbnRpdGllcywgZW1iZWRkZWQgbWFwcGluZ3MsIGFuZCBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZ3MuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBPdmVycmlkZUNvbnRhaW5lcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgcmVsYXRpb25zaGlwIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBleGlzdC4gVGhpcyByZWxhdGlvbnNoaXAgbWFwcGluZwotCSAqIHdpbGwgYmUgZm91bmQgaW4gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIG9yIGVtYmVkZGFibGUgdHlwZSB3aG9zZSBtYXBwaW5nCi0JICogaXMgYmVpbmcgb3ZlcnJpZGRlbiwgbm90IGluIHRoZSBvd25pbmcgZW50aXR5Ci0JICovCi0JUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVsYXRpb25zaGlwIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlSZWFkT25seVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQkvLyBjb3ZhcmlhbnQgb3ZlcnJpZGVzCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldE92ZXJyaWRlcygpOwotCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldFNwZWNpZmllZE92ZXJyaWRlcygpOwotCUFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0U3BlY2lmaWVkT3ZlcnJpZGUoaW50IGluZGV4KTsKLQlBc3NvY2lhdGlvbk92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldFZpcnR1YWxPdmVycmlkZXMoKTsKLQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwoT3ZlcnJpZGVfIHNwZWNpZmllZE92ZXJyaWRlKTsKLQlBc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnZlcnRPdmVycmlkZVRvU3BlY2lmaWVkKFZpcnR1YWxPdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIE92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewotCQkvKioKLQkJICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyI3Jlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFN0cmluZykKLQkJICovCi0JCVJlYWRPbmx5UmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjI5ODdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBKUEEgYXR0cmlidXRlIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU1hcHBpbmcKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nJ3MgYXR0cmlidXRlICh0eXBpY2FsbHkgaXRzIHBhcmVudCBub2RlIGluIHRoZQotCSAqIGNvbnRhaW5tZW50IGhpZXJhcmNoeSkuCi0JICovCi0JUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcncyBuYW1lLCB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSBvZiB0aGUKLQkgKiBhc3NvY2lhdGVkIGF0dHJpYnV0ZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgaXMgaXRzIGF0dHJpYnV0ZSdzIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZwotCSAqIChhcyBvcHBvc2VkIHRvIGl0cyA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZykuCi0JICovCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQkJU3RyaW5nIERFRkFVTFRfUFJPUEVSVFkgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiBhIHVuaXF1ZSBrZXkgZm9yIHRoZSBhdHRyaWJ1dGUgbWFwcGluZy4gSWYgdGhpcyBpcyBkZWZpbmVkIGluCi0JICogYW4gZXh0ZW5zaW9uIHRoZXkgc2hvdWxkIGJlIGVxdWFsLgotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSAiYXR0cmlidXRlIiBtYXBwaW5nIGNhbiBiZSBvdmVycmlkZGVuLgotCSAqIFRoZSBtYXBwaW5nIG11c3QgYmUgYSB7QGxpbmsgQ29sdW1uTWFwcGluZ30uCi0JICovCi0JYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlICJhc3NvY2lhdGlvbiIgbWFwcGluZyBjYW4gYmUgb3ZlcnJpZGRlbi4KLQkgKiBUaGUgbWFwcGluZyBtdXN0IGJlIGEge0BsaW5rIFJlbGF0aW9uc2hpcE1hcHBpbmd9LgotCSAqLwotCWJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGZvciB0aGUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoZSBtYXBwaW5nJ3MgYXR0cmlidXRlLgotCSAqLwotCVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgbWFwcGluZyBpcyBmb3IgYSBwcmltYXJ5IGtleSBjb2x1bW4sIHJldHVybiB0aGUgY29sdW1uJ3MgbmFtZSwKLQkgKiBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBtYXBwaW5nIGlzIHRoZSBvd25pbmcgc2lkZSBvZiBhIHJlbGF0aW9uc2hpcC4KLQkgKiBFaXRoZXIgdGhpcyBpcyBhIHVuaWRpcmVjdGlvbmFsIG1hcHBpbmcgb3IgaXQgaXMgdGhlIG93bmluZyBzaWRlIG9mIGEKLQkgKiBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uc2hpcC4gSWYgYmlkaXJlY3Rpb25hbCwgdGhlIG93bmluZyBzaWRlIGlzIHRoZQotCSAqIHNpZGUgdGhhdCBkb2VzIDxlbT5ub3Q8L2VtPiBzcGVjaWZ5IGEgIm1hcHBlZCBieSIgYXR0cmlidXRlIG5hbWUuCi0JICogVGhlIG93bmluZyBzaWRlIGlzIHRoZSBzaWRlIHdoZXJlIHRoZSBqb2luIHRhYmxlIGlzIHRvIGJlIHNwZWNpZmllZC4KLQkgKiBJZiB0aGlzIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gdGhlIG1hcHBpbmcgd2lsbCBiZSBhCi0JICoge0BsaW5rIFJlbGF0aW9uc2hpcE1hcHBpbmd9LgotCSAqLwotCWJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtYXBwaW5nIG1hbmFnZXMgYSByZWxhdGlvbnNoaXAgd2l0aCB0aGUKLQkgKiBtYXBwaW5nLgotCSAqLwotCWJvb2xlYW4gaXNPd25lZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbnkgZGF0YWJhc2UgbWV0YWRhdGEgc3BlY2lmaWMgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIuCi0JICogKEZvciBpbnN0YW5jZSwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGFjdGl2ZSwgdGhlbiBpdCBzaG91bGQgbm90LikKLQkgKi8KLQlib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWxhdGlvbnNoaXAgZm9yIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlLgotCSAqLwotCVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHkgb25seSBJRCBtYXBwaW5ncyBoYXZlIGdlbmVyYXRvcnMuCi0JICovCi0JSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRHZW5lcmF0b3JzKCk7Ci0KLQotCS8vICoqKioqKioqKiogZW1iZWRkZWQgbWFwcGluZ3MgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIGZvciAibWFwcGVkIGJ5IiBjaG9pY2VzIGluIGEgcmVsYXRpb25zaGlwIG1hcHBpbmcuCi0JICogVHlwaWNhbGx5IHRoaXMgd2lsbCBqdXN0IGJlIGEgc2luZ2xlIGVsZW1lbnQgaXRlcmF0b3Igd2l0aCB0aGUgbWFwcGluZydzCi0JICogbmFtZS4KLQkgKiA8cD4KLQkgKiBJbiBhIEpQQSAyLjAgcHJvamVjdCwgYW4gZW1iZWRkZWQgbWFwcGluZyBzaG91bGQgcmV0dXJuIGl0cyBvd24gbmFtZSBhcwotCSAqIHdlbGwgYXMgdGhlIG5hbWUgb2YgaXRzIHRhcmdldCBlbWJlZGRhYmxlJ3MgbWFwcGluZ3Mgd2l0aCB0aGUgZW1iZWRkZWQKLQkgKiBtYXBwaW5nIG5hbWUgcHJlcGVuZGVkLCBlLmcuOjx1bD4KLQkgKiA8bGk+PGNvZGU+ImVtYmVkZGVkIjwvY29kZT4KLQkgKiA8bGk+PGNvZGU+ImVtYmVkZGVkLmZvbyI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPiJlbWJlZGRlZC5iYXIiPC9jb2RlPgotCSAqIDwvdWw+Ci0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxNYXBwaW5nTmFtZXMoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBmb3IgYW4KLQkgKiBlbWJlZGRlZCBtYXBwaW5nIG9yIGVudGl0eS4gUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGF0dHJpYnV0ZXMKLQkgKiB0aGF0IGNhbiBiZSBvdmVycmlkZGVuLgotCSAqIDxwPgotCSAqIEluIGEgSlBBIDIuMCBwcm9qZWN0IHRoaXMgd2lsbCBpbmNsdWRlIG92ZXJyaWRhYmxlIG5lc3RlZCBhdHRyaWJ1dGVzLgotCSAqIEBzZWUgI2lzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB2aXJ0dWFsIGFzc29jaWF0aW9uIG92ZXJyaWRlcyBmb3IgYW4KLQkgKiBlbWJlZGRlZCBtYXBwaW5nIG9yIGVudGl0eS4gUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIGFzc29jaWF0aW9ucwotCSAqIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4uCi0JICogPHA+Ci0JICogSW4gYSBKUEEgMi4wIHByb2plY3QgdGhpcyB3aWxsIGluY2x1ZGUgb3ZlcnJpZGFibGUgbmVzdGVkIGFzc29jaWF0aW9ucy4KLQkgKiBAc2VlICNpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwcGluZyBpdHNlbGYgaWYgaXRzIG5hbWUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPHA+Ci0JICogSW4gSlBBIDIuMCB0aGlzIG5hbWUgY291bGQgdXNlIGRvdC1ub3RhdGlvbiBmb3IgbmVzdGVkIG1hcHBpbmdzLgotCSAqIEpQQSAyLjAgZW1iZWRkZWQgbWFwcGluZ3Mgd2lsbCBoYXZlIHRvIHBhcnNlIHRoaXMgbmFtZSBhbmQgcmV0dXJuIHRoZQotCSAqIGFwcHJvcHJpYXRlIG5lc3RlZCBtYXBwaW5nLgotCSAqLwotCUF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4gb2YgdGhlIG92ZXJyaWRhYmxlIGF0dHJpYnV0ZSBtYXBwaW5nIChvciBhdHRyaWJ1dGUKLQkgKiBvdmVycmlkZSkgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBuYW1lLgotCSAqIDxwPgotCSAqIEluIEpQQSAyLjAgdGhpcyBuYW1lIGNhbiB1c2UgZG90LW5vdGF0aW9uIHRvIGRlc2lnbmF0ZSBuZXN0ZWQgYXR0cmlidXRlcwotCSAqIGluIGVtYmVkZGVkIGF0dHJpYnV0ZSBtYXBwaW5nJ3MgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcuCi0JICovCi0JQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjN2MyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIDxlbT5TcGVjaWZpZWQ8L2VtPiBhdHRyaWJ1dGUgb3ZlcnJpZGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVPdmVycmlkZQotCWV4dGVuZHMgT3ZlcnJpZGVfLCBSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlCi17Ci0Jdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIG9sZE92ZXJyaWRlKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgb2xkT3ZlcnJpZGUpOwotCi0JLy8gY292YXJpYW50IG92ZXJyaWRlcwotCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBjb252ZXJ0VG9WaXJ0dWFsKCk7Ci0KLQlDb2x1bW4gZ2V0Q29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0F0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWExMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIEF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIuCi0gKiBVc2VkIGJ5IGVudGl0aWVzLCBlbWJlZGRlZCBtYXBwaW5ncywgYW5kIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5ncy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBPdmVycmlkZUNvbnRhaW5lcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIG9mIHRoZSBtYXBwaW5nIG9yIGF0dHJpYnV0ZSBvdmVycmlkZSBmb3IgdGhlIHNwZWNpZmllZAotCSAqIGF0dHJpYnV0ZS4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIGl0IGRvZXMgbm90IGV4aXN0LiBUaGlzCi0JICogY29sdW1uIG1hcHBpbmcvYXR0cmlidXRlIG92ZXJyaWRlIHdpbGwgYmUgZm91bmQgaW4gdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi0JICogKG9yIGVtYmVkZGFibGUpLCBub3QgaW4gdGhlIG93bmluZyBlbnRpdHkuCi0JICovCi0JUmVhZE9ubHlDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpOwotCi0JLy8gY292YXJpYW50IG92ZXJyaWRlcwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0T3ZlcnJpZGVzKCk7Ci0JUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRTcGVjaWZpZWRPdmVycmlkZXMoKTsKLQlBdHRyaWJ1dGVPdmVycmlkZSBnZXRTcGVjaWZpZWRPdmVycmlkZShpbnQgaW5kZXgpOwotCUF0dHJpYnV0ZU92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRWaXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGNvbnZlcnRPdmVycmlkZVRvVmlydHVhbChPdmVycmlkZV8gc3BlY2lmaWVkT3ZlcnJpZGUpOwotCUF0dHJpYnV0ZU92ZXJyaWRlIGNvbnZlcnRPdmVycmlkZVRvU3BlY2lmaWVkKFZpcnR1YWxPdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIE92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewotCQkvKioKLQkJICogQHNlZSBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciNyZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcpCi0JCSAqLwotCQlSZWFkT25seUNvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9CYXNlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Jhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjODEwOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Jhc2VDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogY29sdW1uIG9yIGpvaW4gY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlQ29sdW1uCi0JZXh0ZW5kcyBUYWJsZUNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uCi17Ci0Jdm9pZCBzZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpOwotCXZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Jhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU2ZGRlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Jhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQmVoYXZpb3IgY29tbW9uIHRvIGVtYmVkZGVkIGFuZCBlbWJlZGRlZCBJRCBtYXBwaW5ncy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VFbWJlZGRlZE1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZW1iZWRkYWJsZSB0aGUgZW1iZWRkZWQgbWFwcGluZyByZWZlcmVuY2VzLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub25lLgotCSAqLwotCUVtYmVkZGFibGUgZ2V0VGFyZ2V0RW1iZWRkYWJsZSgpOwotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggcHJvcGVydHkgY2hhbmdlIGV2ZW50cyBmb3IgdGhlIHRhcmdldCBlbWJlZGRhYmxlCi0JICovCi0JU3RyaW5nIFRBUkdFVF9FTUJFRERBQkxFX1BST1BFUlRZID0gInRhcmdldEVtYmVkZGFibGUiOyAgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9CYXNlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9CYXNlSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njk3NjljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQmFzZUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogU3BlY2lmaWVkCi0gKiA8dWw+Ci0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDxsaT5wcmltYXJ5IGtleSBqb2luIGNvbHVtbgotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNlSm9pbkNvbHVtbgotCWV4dGVuZHMgTmFtZWRDb2x1bW4sIFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4KLXsKLQl2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Jhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9CYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzY2ZiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Jhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBKUEEgYmFzaWMgbWFwcGluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2ljTWFwcGluZyAKLQlleHRlbmRzIENvbHVtbk1hcHBpbmcsIEZldGNoYWJsZU1hcHBpbmcsIE9wdGlvbmFsTWFwcGluZywgQ29udmVydGlibGVNYXBwaW5nCi17Ci0JRmV0Y2hUeXBlIERFRkFVTFRfRkVUQ0hfVFlQRSA9IEZldGNoVHlwZS5FQUdFUjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQ2FzY2FkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9DYXNjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZGMwZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9DYXNjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSBjYXNjYWRlIChwZXJzaXN0LCBtZXJnZSwgcmVtb3ZlLCByZWZyZXNoKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FzY2FkZQotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlib29sZWFuIGlzQWxsKCk7Ci0Jdm9pZCBzZXRBbGwoYm9vbGVhbiB2YWx1ZSk7Ci0JCVN0cmluZyBBTExfUFJPUEVSVFkgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNQZXJzaXN0KCk7Ci0Jdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgUEVSU0lTVF9QUk9QRVJUWSA9ICJwZXJzaXN0IjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNNZXJnZSgpOwotCXZvaWQgc2V0TWVyZ2UoYm9vbGVhbiB2YWx1ZSk7Ci0JCVN0cmluZyBNRVJHRV9QUk9QRVJUWSA9ICJtZXJnZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzUmVtb3ZlKCk7Ci0Jdm9pZCBzZXRSZW1vdmUoYm9vbGVhbiB2YWx1ZSk7Ci0JCVN0cmluZyBSRU1PVkVfUFJPUEVSVFkgPSAicmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNSZWZyZXNoKCk7Ci0Jdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgUkVGUkVTSF9QUk9QRVJUWSA9ICJyZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Db2xsZWN0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Db2xsZWN0aW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjhiNWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQ29sbGVjdGlvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIGNvbGxlY3Rpb24gbWFwcGluZyAoZS5nLiAxOm0sIG06bSwgZWxlbWVudCBjb2xsZWN0aW9uKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvbk1hcHBpbmcKLQlleHRlbmRzIEZldGNoYWJsZU1hcHBpbmcKLXsKLQlGZXRjaFR5cGUgREVGQVVMVF9GRVRDSF9UWVBFID0gRmV0Y2hUeXBlLkxBWlk7Ci0KLQlPcmRlcmFibGUgZ2V0T3JkZXJhYmxlKCk7Ci0JCi0JUGVyc2lzdGVudFR5cGUgZ2V0UmVzb2x2ZWRUYXJnZXRUeXBlKCk7Ci0KLQotCS8vICoqKioqKioqKiogdHlwZXMgKioqKioqKioqKgotCi0JVHlwZSBnZXRWYWx1ZVR5cGUoKTsKLQkJU3RyaW5nIFZBTFVFX1RZUEVfUFJPUEVSVFkgPSAidmFsdWVUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JVHlwZSBnZXRLZXlUeXBlKCk7Ci0JCVN0cmluZyBLRVlfVFlQRV9QUk9QRVJUWSA9ICJrZXlUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGVudW0gVHlwZSB7Ci0JCUJBU0lDX1RZUEUsCi0JCUVNQkVEREFCTEVfVFlQRSwKLQkJRU5USVRZX1RZUEUsCi0JCU5PX1RZUEUKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSAqKioqKioqKioqCi0KLQlTdHJpbmcgZ2V0TWFwS2V5KCk7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkTWFwS2V5KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXkoU3RyaW5nIG1hcEtleSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTUFQX0tFWV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRNYXBLZXkiOyAvLyROT04tTkxTLTEkCi0KLQlib29sZWFuIGlzTm9NYXBLZXkoKTsKLQl2b2lkIHNldE5vTWFwS2V5KGJvb2xlYW4gbm9NYXBLZXkpOwotCQlTdHJpbmcgTk9fTUFQX0tFWV9QUk9QRVJUWSA9ICJub01hcEtleSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzUGtNYXBLZXkoKTsKLQl2b2lkIHNldFBrTWFwS2V5KGJvb2xlYW4gcGtNYXBLZXkpOwotCQlTdHJpbmcgUEtfTUFQX0tFWV9QUk9QRVJUWSA9ICJwa01hcEtleSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlib29sZWFuIGlzQ3VzdG9tTWFwS2V5KCk7Ci0Jdm9pZCBzZXRDdXN0b21NYXBLZXkoYm9vbGVhbiBjdXN0b21NYXBLZXkpOwotCQlTdHJpbmcgQ1VTVE9NX01BUF9LRVlfUFJPUEVSVFkgPSAiY3VzdG9tTWFwS2V5IjsgLy8kTk9OLU5MUy0xJAotCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpOwotCi0JU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0NvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzFmYTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIE5vcm1hbCBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbgotCWV4dGVuZHMgQmFzZUNvbHVtbiwgUmVhZE9ubHlDb2x1bW4KLXsKLQl2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5Q29sdW1uIG9sZENvbHVtbik7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seUNvbHVtbiBvbGRDb2x1bW4pOwotCi0Jdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlciBsZW5ndGgpOwotCi0Jdm9pZCBzZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlciBwcmVjaXNpb24pOwotCi0Jdm9pZCBzZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyIHNjYWxlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQ29sdW1uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Db2x1bW5NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZDQwZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Db2x1bW5NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSBhdHRyaWJ1dGUgbWFwcGluZyB0aGF0IGhhcyBhIGNvbnZlcnRlciAoZS5nLiBiYXNpYywgSUQsIHZlcnNpb24pLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uTWFwcGluZwotCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZywgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyCi17Ci0JQ29sdW1uIGdldENvbHVtbigpOwotfSAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0NvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWIyYTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLS8qKgotICogSlBBIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbnZlcnRlci4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnZlcnRlcgotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIncyB0eXBlLgotCSAqLwotCUNsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldFR5cGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgYWxsb3dpbmcgY29udmVydGVycyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzLCBjb2xsZWN0aW9uIG1hcHBpbmdzLCBldGMpLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgT3duZXIKLQl7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCUpwdFZhbGlkYXRvciBidWlsZFZhbGlkYXRvcihDb252ZXJ0ZXIgY29udmVydGVyLCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0NvbnZlcnRpYmxlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Db252ZXJ0aWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI1ODdlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0NvbnZlcnRpYmxlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSBhdHRyaWJ1dGUgbWFwcGluZyB0aGF0IGhhcyBhIGNvbnZlcnRlciAoZS5nLiBiYXNpYywgSUQsIHZlcnNpb24pLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBDb252ZXJ0aWJsZU1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcncyBjb252ZXJ0ZXIuIE5ldmVyIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCUNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKTsKLQkJU3RyaW5nIENPTlZFUlRFUl9QUk9QRVJUWSA9ICJjb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIGNvbnZlcnRlciB0eXBlLCBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UKLQkgKiBtb2RlbCBhbmQgcmVtb3ZpbmcgYW55IG90aGVyIGNvbnZlcnRlcnMuIENsZWFyIGFsbCBjb252ZXJ0ZXJzIGlmIHRoZQotCSAqIHNwZWNpZmllZCB0eXBlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXZvaWQgc2V0Q29udmVydGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9EaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlkODJlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JDb2x1bW4KLQlleHRlbmRzIE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotewotCVN0cmluZyBERUZBVUxUX05BTUUgPSAiRFRZUEUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2UuCi0JICovCi0JYm9vbGVhbiBpc1Jlc291cmNlU3BlY2lmaWVkKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvRGlzY3JpbWluYXRvclR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvRGlzY3JpbWluYXRvclR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZDBiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIERpc2NyaW1pbmF0b3IgVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBlbnVtIERpc2NyaW1pbmF0b3JUeXBlIHsKLQotCVNUUklORygKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLlNUUklORywKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HCi0JCSksCi0JQ0hBUigKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIsCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIKLQkJKSwKLQlJTlRFR0VSKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUgotCQkpOwotCi0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlIGphdmFEaXNjcmltaW5hdG9yVHlwZTsKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgb3JtRGlzY3JpbWluYXRvclR5cGU7Ci0KLQlEaXNjcmltaW5hdG9yVHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZSBqYXZhRGlzY3JpbWluYXRvclR5cGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgb3JtRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJaWYgKGphdmFEaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAob3JtRGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhRGlzY3JpbWluYXRvclR5cGUgPSBqYXZhRGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMub3JtRGlzY3JpbWluYXRvclR5cGUgPSBvcm1EaXNjcmltaW5hdG9yVHlwZTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUgZ2V0SmF2YURpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhRGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgZ2V0T3JtRGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybURpc2NyaW1pbmF0b3JUeXBlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZSBqYXZhRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJcmV0dXJuIChqYXZhRGlzY3JpbWluYXRvclR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhqYXZhRGlzY3JpbWluYXRvclR5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGUgamF2YURpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWZvciAoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUgOiBEaXNjcmltaW5hdG9yVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGRpc2NyaW1pbmF0b3JUeXBlLmdldEphdmFEaXNjcmltaW5hdG9yVHlwZSgpID09IGphdmFEaXNjcmltaW5hdG9yVHlwZSkgewotCQkJCXJldHVybiBkaXNjcmltaW5hdG9yVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJcmV0dXJuIChkaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkaXNjcmltaW5hdG9yVHlwZS5nZXRKYXZhRGlzY3JpbWluYXRvclR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgb3JtRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJcmV0dXJuIChvcm1EaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JtRGlzY3JpbWluYXRvclR5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERpc2NyaW1pbmF0b3JUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlIG9ybURpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWZvciAoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUgOiBEaXNjcmltaW5hdG9yVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGRpc2NyaW1pbmF0b3JUeXBlLmdldE9ybURpc2NyaW1pbmF0b3JUeXBlKCkgPT0gb3JtRGlzY3JpbWluYXRvclR5cGUpIHsKLQkJCQlyZXR1cm4gZGlzY3JpbWluYXRvclR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlyZXR1cm4gKGRpc2NyaW1pbmF0b3JUeXBlID09IG51bGwpID8gbnVsbCA6IGRpc2NyaW1pbmF0b3JUeXBlLmdldE9ybURpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0VtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA2NTkyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBlbWJlZGRhYmxlIHR5cGUgbWFwcGluZwotICogPGI+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkYWJsZQotCWV4dGVuZHMgVHlwZU1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0VtYmVkZGVkSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0VtYmVkZGVkSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZDAzZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9FbWJlZGRlZElkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBKUEEgZW1iZWRkZWQgSUQgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRJZE1hcHBpbmcKLQlleHRlbmRzIEJhc2VFbWJlZGRlZE1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9FbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWY3NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9FbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIGVtYmVkZGVkIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkTWFwcGluZwotCWV4dGVuZHMgQmFzZUVtYmVkZGVkTWFwcGluZwotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0VudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjNTliMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIGVudGl0eQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbnRpdHkKLQlleHRlbmRzIFR5cGVNYXBwaW5nCi17Ci0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCVN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROYW1lIjsgLy8kTk9OLU5MUy0xJAotCXZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmFtZSk7Ci0JU3RyaW5nIGdldERlZmF1bHROYW1lKCk7Ci0JCVN0cmluZyBERUZBVUxUX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogaWQgY2xhc3MgKioqKioqKioqKgotCi0gCS8qKgotIAkgKiBSZXR1cm4gdGhlIChhZ2dyZWdhdGUpIGNsYXNzIHJlZmVyZW5jZSBmb3IgY29uZmlndXJpbmcgYW5kIHZhbGlkYXRpbmcgaWQgY2xhc3MKLSAJICovCi0gCUlkQ2xhc3NSZWZlcmVuY2UgZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoaXMgZW50aXR5LCBlaXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCVRhYmxlIGdldFRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVudGl0eSdzIHByaW1hcnkga2V5IGNvbHVtbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZW50aXR5J3MgcHJpbWFyeSBrZXkgaXMgImNvbXBvdW5kIgotCSAqIChpLmUuIHRoZSBwcmltYXJ5IGtleSBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSBjb2x1bW5zKS4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW50aXR5J3MgZGVmYXVsdCB0YWJsZSBuYW1lLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBlbnRpdHkncwotCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnRpdHkncyBkZWZhdWx0IHNjaGVtYSwgd2hpY2ggZGVwZW5kcyBvbiB0aGUgZW50aXR5J3MKLQkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW50aXR5J3MgZGVmYXVsdCBjYXRhbG9nLCB3aGljaCBkZXBlbmRzIG9uIHRoZSBlbnRpdHkncwotCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQotCi0JLy8gKioqKioqKioqKiBzZWNvbmRhcnkgdGFibGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2Vjb25kYXJ5IHRhYmxlcyB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4gZ2V0U2Vjb25kYXJ5VGFibGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZWNvbmRhcnkgdGFibGVzLCBib3RoIHNwZWNpZmllZCBhbmQgZGVmYXVsdC4KLQkgKi8KLQlpbnQgZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBpdGVyYXRvciBvZiB0aGUgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZXMuCi0JICogVGhpcyB3aWxsIG5vdCBiZSBudWxsLgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgU2Vjb25kYXJ5VGFibGU+IGdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVCA9ICJzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlcy4KLQkgKi8KLQlpbnQgZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSB0byB0aGUgZW50aXR5IHJldHVybiB0aGUgb2JqZWN0Ci0JICogcmVwcmVzZW50aW5nIGl0LgotCSAqLwotCVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlIHRvIHRoZSBlbnRpdHkgcmV0dXJuIHRoZSBvYmplY3QKLQkgKiByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlIGF0IHRoZSBpbmRleCBmcm9tIHRoZSBlbnRpdHkuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSk7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlIGZyb20gdGhlIHNvdXJjZSBpbmRleCB0byB0aGUgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBpbmhlcml0YW5jZSBzdHJhdGVneSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBpbmhlcml0YW5jZSBzdHJhdGVneSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JICogaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuCi0JICovCi0JSW5oZXJpdGFuY2VUeXBlIGdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQlJbmhlcml0YW5jZVR5cGUgZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotCUluaGVyaXRhbmNlVHlwZSBnZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCQlTdHJpbmcgREVGQVVMVF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSA9ICJkZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICogVGhlIGZpcnN0IHBhcmVudCBpbiB0aGUgY2xhc3MgaGllcmFyY2h5IHRoYXQgaXMgYW4gZW50aXR5LgotCSAqIFRoaXMgaXMgdGhlIHBhcmVudCBpbiB0aGUgZW50aXR5IChwZXJzaXN0ZW50KSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLQkgKiAodnMgY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5KS4gIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHBhcmVudCBlbnRpdHkuCi0JICovCi0JRW50aXR5IGdldFBhcmVudEVudGl0eSgpOwotCi0JRGlzY3JpbWluYXRvckNvbHVtbiBnZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYSBEaXNjcmltaW5hdG9yVmFsdWUgaXMgYWxsb3dlZCBmb3IgdGhpcyBFbnRpdHkuCi0JICogSXQgaXMgYWxsb3dlZCBpZiB0aGUgZW50aXR5IGlzIG5vdCBhYnN0cmFjdCBhbmQgbm90IHBhcnQgb2YKLQkgKiBhIHRhYmxlLXBlci1jbGFzcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLQkgKi8KLQlib29sZWFuIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpOwotIAkJU3RyaW5nIFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1ZBTFVFX0lTX0FMTE9XRURfUFJPUEVSVFkgPSAiZGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JIC8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgRGlzY3JpbWluYXRvclZhbHVlIGlzIHVuZGVmaW5lZCBmb3IgdGhpcyBFbnRpdHkuCi0JICogSXQgaXMgdW5kZWZpbmVkIGlmIHRoZSBlbnRpdHkgaXMgYWJzdHJhY3Qgb3IgaWYgaXQKLQkgKiBpcyBwYXJ0IG9mIGEgdGFibGUtcGVyLWNsYXNzIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCSAqLwotCWJvb2xlYW4gZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKTsKLSAJCVN0cmluZyBESVNDUklNSU5BVE9SX1ZBTFVFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSA9ICJkaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgRGlzY3JpbWluYXRvckNvbHVtbiBpcyBhbGxvd2VkIGZvciB0aGlzIEVudGl0eS4KLQkgKiBJdCBpcyBhbGxvd2VkIGlmIHRoZSBlbnRpdHkgaXMgdGhlIHJvb3Qgb2YgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSAod2l0aCBkZXNjZW5kYW50IGVudGl0aWVzKQotCSAqIGFuZCB0aGUgc3RyYXRlZ3kgaXMgbm90IHRhYmxlLXBlci1jbGFzcwotCSAqLwotCWJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpOwotIAkJU3RyaW5nIFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX0NPTFVNTl9JU19BTExPV0VEX1BST1BFUlRZID0gInNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIERpc2NyaW1pbmF0b3JDb2x1bW4gaXMgdW5kZWZpbmVkIGZvciB0aGlzIEVudGl0eS4KLQkgKiBJdCBpcyB1bmRlZmluZWQgaWYgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIHRhYmxlLXBlci1jbGFzcwotCSAqLwotIAlib29sZWFuIGRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCgpOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU5fSVNfVU5ERUZJTkVEX1BST1BFUlRZID0gImRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgVGFibGUgaXMgYWxsb3dlZCBmb3IgdGhpcyBFbnRpdHkuCi0JICogSWYgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIHNpbmdsZS10YWJsZSwgVGFibGUgaXMgYWxsb3dlZCBvbmx5Ci0JICogb24gdGhlIHJvb3QgZW50aXR5LgotCSAqIElmIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyB0YWJsZS1wZXItY2xhc3MgaXQgaXMgYWxsb3dlZCBvbmx5Ci0JICogb24gY29uY3JldGUgZW50aXRpZXMuCi0JICovCi0gCWJvb2xlYW4gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoKTsKLSAJCVN0cmluZyBTUEVDSUZJRURfVEFCTEVfSVNfQUxMT1dFRF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGEgVGFibGUgaXMgdW5kZWZpbmVkIGZvciB0aGlzIEVudGl0eS4KLQkgKiBJZiB0aGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUtcGVyLWNsYXNzIGFuZCB0aGUgZW50aXR5IGlzCi0JICogYWJzdHJhY3QsIHRoZW4gYSBUYWJsZSBvYmplY3QgaXMgdW5kZWZpbmVkCi0JICovCi0gCWJvb2xlYW4gdGFibGVJc1VuZGVmaW5lZCgpOwotIAkJU3RyaW5nIFRBQkxFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSA9ICJ0YWJsZUlzVW5kZWZpbmVkIjsgLy8kTk9OLU5MUy0xJAotCi0KLSAJLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQotCWludCBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCA9ICJzcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQlpbnQgZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQotCXZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBjb250YWluZXJzICoqKioqKioqKioKLQotCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCVF1ZXJ5Q29udGFpbmVyIGdldFF1ZXJ5Q29udGFpbmVyKCk7Ci0KLQlHZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogZW50aXR5IGluaGVyaXRhbmNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdG9wIG9mIHRoZSBlbnRpdHkncyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JICogVGhpcyBtZXRob2Qgd2lsbCBuZXZlciByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uIFRoZSByb290Ci0JICogaXMgZGVmaW5lZCBhcyB0aGUgcGVyc2lzdGVudCB0eXBlIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKLQkgKiB0aGF0IGhhcyBubyBwYXJlbnQuIFRoZSByb290IHdpbGwgYmUgYW4gZW50aXR5LgotCSAqIDxwPgotCSAqIE5vbi1lbnRpdGllcyBpbiB0aGUgaGllcmFyY2h5IHNob3VsZCBiZSBpZ25vcmVkOyBpLmUuIHdlIHNraXAKLQkgKiBvdmVyIHRoZW0gaW4gdGhlIHNlYXJjaCBmb3IgdGhlIHJvb3QuCi0JICovCi0JRW50aXR5IGdldFJvb3RFbnRpdHkoKTsKLQkJU3RyaW5nIFJPT1RfRU5USVRZX1BST1BFUlRZID0gInJvb3RFbnRpdHkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJZiB0aGUgZW50aXR5IGlzIGEgcm9vdCBlbnRpdHksIHJldHVybiB0aGUgZW50aXR5J3MgZGVzY2VuZGFudCBlbnRpdGllczsKLQkgKiBpZiB0aGUgZW50aXR5IGlzIG5vdCBhIHJvb3QgZW50aXR5LCByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbi4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBBbiBlbnRpdHkgQSBpcyBhICJkZXNjZW5kYW50IiBvZiBhbm90aGVyIHJvb3QKLQkgKiBlbnRpdHkgQiBpZiB0aGUgPGVtPm5hbWU8L2VtPiBvZiBlbnRpdHkgQSdzIHJvb3QgZW50aXR5J3MgdHlwZSBtYXRjaGVzCi0JICogdGhlIG5hbWUgb2YgZW50aXR5IEIncyB0eXBlLiBUaGlzIG1lYW5zIGVudGl0eSBBIGNhbiBiZSBhICJkZXNjZW5kYW50IgotCSAqIG9mIG11bHRpcGxlIHJvb3QgZW50aXRpZXMgKHR5cGljYWxseSBib3RoIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPgotCSAqIGFuZCBKYXZhIHJvb3QgZW50aXRpZXMgZm9yIGEgcGFydGljdWxhciB0eXBlKTsgZGVzcGl0ZSBlbnRpdHkgaGF2ZSBvbmx5Ci0JICogYSBzaW5nbGUgInJvb3QiIGVudGl0eSAodHlwaWNhbGx5IHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiByb290IGVudGl0eSkuCi0JICovCi0JSXRlcmFibGU8RW50aXR5PiBnZXREZXNjZW5kYW50cygpOwotCQlTdHJpbmcgREVTQ0VOREFOVFNfQ09MTEVDVElPTiA9ICJkZXNjZW5kYW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBtYXBwaW5nIHRoYXQgbWF0Y2hlcyB0aGUgbmFtZS4KLQkgKiBJbiAyLjAgdGhpcyBuYW1lIGNvdWxkIHVzZSBkb3Qtbm90YXRpb24gZm9yIG5lc3RlZCBtYXBwaW5ncy4KLQkgKi8KLQlBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIElmIGFuIGVudGl0eSBoYXMgYSBzaW5nbGUgaWQgYXR0cmlidXRlLCByZXR1cm4gdGhhdCBhdHRyaWJ1dGUuCi0JICogRWxzZSByZXR1cm4gbnVsbC4KLQkgKi8KLQlQZXJzaXN0ZW50QXR0cmlidXRlIGdldElkQXR0cmlidXRlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0VudW1UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0VudW1UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzVjYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9FbnVtVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBFbnVtIFR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgZW51bSBFbnVtVHlwZSB7Ci0KLQlPUkRJTkFMKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuT1JESU5BTCwKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTAotCQkpLAotCVNUUklORygKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORywKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HCi0JCSk7Ci0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUgamF2YUVudW1UeXBlOwotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSBvcm1FbnVtVHlwZTsKLQotCUVudW1UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlIGphdmFFbnVtVHlwZSwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSBvcm1FbnVtVHlwZSkgewotCQlpZiAoamF2YUVudW1UeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChvcm1FbnVtVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFFbnVtVHlwZSA9IGphdmFFbnVtVHlwZTsKLQkJdGhpcy5vcm1FbnVtVHlwZSA9IG9ybUVudW1UeXBlOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZSBnZXRKYXZhRW51bVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFFbnVtVHlwZTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSBnZXRPcm1FbnVtVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtRW51bVR5cGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlIGphdmFFbnVtVHlwZSkgewotCQlyZXR1cm4gKGphdmFFbnVtVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YVJlc291cmNlTW9kZWxfKGphdmFFbnVtVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRW51bVR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZSBqYXZhRW51bVR5cGUpIHsKLQkJZm9yIChFbnVtVHlwZSBlbnVtVHlwZSA6IEVudW1UeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoZW51bVR5cGUuZ2V0SmF2YUVudW1UeXBlKCkgPT0gamF2YUVudW1UeXBlKSB7Ci0JCQkJcmV0dXJuIGVudW1UeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChFbnVtVHlwZSBlbnVtVHlwZSkgewotCQlyZXR1cm4gKGVudW1UeXBlID09IG51bGwpID8gbnVsbCA6IGVudW1UeXBlLmdldEphdmFFbnVtVHlwZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZSBvcm1FbnVtVHlwZSkgewotCQlyZXR1cm4gKG9ybUVudW1UeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcm1FbnVtVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRW51bVR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUgb3JtRW51bVR5cGUpIHsKLQkJZm9yIChFbnVtVHlwZSBlbnVtVHlwZSA6IEVudW1UeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoZW51bVR5cGUuZ2V0T3JtRW51bVR5cGUoKSA9PSBvcm1FbnVtVHlwZSkgewotCQkJCXJldHVybiBlbnVtVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKEVudW1UeXBlIGVudW1UeXBlKSB7Ci0JCXJldHVybiAoZW51bVR5cGUgPT0gbnVsbCkgPyBudWxsIDogZW51bVR5cGUuZ2V0T3JtRW51bVR5cGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvRW51bWVyYXRlZENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9FbnVtZXJhdGVkQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MGY4NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9FbnVtZXJhdGVkQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSBlbnVtZXJhdGVkIGNvbnZlcnRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW51bWVyYXRlZENvbnZlcnRlcgotCWV4dGVuZHMgQ29udmVydGVyCi17Ci0JRW51bVR5cGUgZ2V0RW51bVR5cGUoKTsKLQotCUVudW1UeXBlIGdldFNwZWNpZmllZEVudW1UeXBlKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZSBlbnVtVHlwZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfRU5VTV9UWVBFX1BST1BFUlRZID0gInNwZWNpZmllZEVudW1UeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCUVudW1UeXBlIGdldERlZmF1bHRFbnVtVHlwZSgpOwotCQlTdHJpbmcgREVGQVVMVF9FTlVNX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdEVudW1UeXBlIjsgLy8kTk9OLU5MUy0xJAotCQlFbnVtVHlwZSBERUZBVUxUX0VOVU1fVFlQRSA9IEVudW1UeXBlLk9SRElOQUw7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0ZldGNoVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9GZXRjaFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlMTQ3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0ZldGNoVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBGZXRjaCBUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGVudW0gRmV0Y2hUeXBlIHsKLQotCUVBR0VSKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIKLQkJKSwKLQlMQVpZKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZCi0JCSk7Ci0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlIGphdmFGZXRjaFR5cGU7Ci0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZSBvcm1GZXRjaFR5cGU7Ci0KLQlGZXRjaFR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlIGphdmFGZXRjaFR5cGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUZldGNoVHlwZSkgewotCQlpZiAoamF2YUZldGNoVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAob3JtRmV0Y2hUeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUZldGNoVHlwZSA9IGphdmFGZXRjaFR5cGU7Ci0JCXRoaXMub3JtRmV0Y2hUeXBlID0gb3JtRmV0Y2hUeXBlOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUgZ2V0SmF2YUZldGNoVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUZldGNoVHlwZTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgZ2V0T3JtRmV0Y2hUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1GZXRjaFR5cGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgRmV0Y2hUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUgamF2YUZldGNoVHlwZSkgewotCQlyZXR1cm4gKGphdmFGZXRjaFR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhqYXZhRmV0Y2hUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGZXRjaFR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUgamF2YUZldGNoVHlwZSkgewotCQlmb3IgKEZldGNoVHlwZSBmZXRjaFR5cGUgOiBGZXRjaFR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChmZXRjaFR5cGUuZ2V0SmF2YUZldGNoVHlwZSgpID09IGphdmFGZXRjaFR5cGUpIHsKLQkJCQlyZXR1cm4gZmV0Y2hUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoRmV0Y2hUeXBlIGZldGNoVHlwZSkgewotCQlyZXR1cm4gKGZldGNoVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmZXRjaFR5cGUuZ2V0SmF2YUZldGNoVHlwZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmV0Y2hUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUZldGNoVHlwZSkgewotCQlyZXR1cm4gKG9ybUZldGNoVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JtRmV0Y2hUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGZXRjaFR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIG9ybUZldGNoVHlwZSkgewotCQlmb3IgKEZldGNoVHlwZSBmZXRjaFR5cGUgOiBGZXRjaFR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChmZXRjaFR5cGUuZ2V0T3JtRmV0Y2hUeXBlKCkgPT0gb3JtRmV0Y2hUeXBlKSB7Ci0JCQkJcmV0dXJuIGZldGNoVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChGZXRjaFR5cGUgZmV0Y2hUeXBlKSB7Ci0JCXJldHVybiAoZmV0Y2hUeXBlID09IG51bGwpID8gbnVsbCA6IGZldGNoVHlwZS5nZXRPcm1GZXRjaFR5cGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvRmV0Y2hhYmxlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9GZXRjaGFibGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZGVjNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9GZXRjaGFibGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSBhdHRyaWJ1dGUgbWFwcGluZyB0aGF0IGhhcyBhIGZldGNoIHR5cGUgKGUuZy4gYmFzaWMsIHJlbGF0aW9uc2hpcCkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBGZXRjaGFibGVNYXBwaW5nCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JRmV0Y2hUeXBlIGdldEZldGNoKCk7Ci0JCQotCUZldGNoVHlwZSBnZXRTcGVjaWZpZWRGZXRjaCgpOwotCXZvaWQgc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlIG5ld1NwZWNpZmllZEZldGNoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9GRVRDSF9QUk9QRVJUWSA9ICJzcGVjaWZpZWRGZXRjaCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCk7Ci0JCVN0cmluZyBERUZBVUxUX0ZFVENIX1BST1BFUlRZID0gImRlZmF1bHRGZXRjaCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvR2VuZXJhdGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0YTA4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0dlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSBnZW5lcmF0ZWQgdmFsdWUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCUdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCk7Ci0JR2VuZXJhdGlvblR5cGUgZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKTsKLQl2b2lkIHNldFNwZWNpZmllZFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQlHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0U3RyYXRlZ3koKTsKLQkJU3RyaW5nIERFRkFVTFRfU1RSQVRFR1lfUFJPUEVSVFkgPSAiZGVmYXVsdFN0cmF0ZWd5IjsgLy8kTk9OLU5MUy0xJAotCQlHZW5lcmF0aW9uVHlwZSBERUZBVUxUX1NUUkFURUdZID0gR2VuZXJhdGlvblR5cGUuQVVUTzsKLQkKLQlTdHJpbmcgZ2V0R2VuZXJhdG9yKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZEdlbmVyYXRvcigpOwotCXZvaWQgc2V0U3BlY2lmaWVkR2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSA9ICJzcGVjaWZpZWRHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nIERFRkFVTFRfR0VORVJBVE9SX1BST1BFUlRZID0gImRlZmF1bHRHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0dlbmVyYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0dlbmVyYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkODdhZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9HZW5lcmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogR2VuZXJhdGlvbiBUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgewotCi0JVEFCTEUoCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZS5UQUJMRSwKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUuVEFCTEUKLQkJKSwKLQlTRVFVRU5DRSgKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZS5TRVFVRU5DRQotCQkpLAotCUlERU5USVRZKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFksCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlLklERU5USVRZCi0JCSksCi0JQVVUTygKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlLkFVVE8sCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlLkFVVE8KLQkJKTsKLQotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZSBqYXZhR2VuZXJhdGlvblR5cGU7Ci0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIG9ybUdlbmVyYXRpb25UeXBlOwotCi0JR2VuZXJhdGlvblR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUgamF2YUdlbmVyYXRpb25UeXBlLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIG9ybUdlbmVyYXRpb25UeXBlKSB7Ci0JCWlmIChqYXZhR2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKG9ybUdlbmVyYXRpb25UeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUdlbmVyYXRpb25UeXBlID0gamF2YUdlbmVyYXRpb25UeXBlOwotCQl0aGlzLm9ybUdlbmVyYXRpb25UeXBlID0gb3JtR2VuZXJhdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlIGdldEphdmFHZW5lcmF0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUdlbmVyYXRpb25UeXBlOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIGdldE9ybUdlbmVyYXRpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1HZW5lcmF0aW9uVHlwZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUgamF2YUdlbmVyYXRpb25UeXBlKSB7Ci0JCXJldHVybiAoamF2YUdlbmVyYXRpb25UeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUdlbmVyYXRpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRpb25UeXBlIGphdmFHZW5lcmF0aW9uVHlwZSkgewotCQlmb3IgKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlIDogR2VuZXJhdGlvblR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChnZW5lcmF0aW9uVHlwZS5nZXRKYXZhR2VuZXJhdGlvblR5cGUoKSA9PSBqYXZhR2VuZXJhdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gZ2VuZXJhdGlvblR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZSB0b0phdmFSZXNvdXJjZU1vZGVsKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlKSB7Ci0JCXJldHVybiAoZ2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgPyBudWxsIDogZ2VuZXJhdGlvblR5cGUuZ2V0SmF2YUdlbmVyYXRpb25UeXBlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlIG9ybUdlbmVyYXRpb25UeXBlKSB7Ci0JCXJldHVybiAob3JtR2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbU9ybVJlc291cmNlTW9kZWxfKG9ybUdlbmVyYXRpb25UeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZSBvcm1HZW5lcmF0aW9uVHlwZSkgewotCQlmb3IgKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlIDogR2VuZXJhdGlvblR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChnZW5lcmF0aW9uVHlwZS5nZXRPcm1HZW5lcmF0aW9uVHlwZSgpID09IG9ybUdlbmVyYXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGdlbmVyYXRpb25UeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZSB0b09ybVJlc291cmNlTW9kZWwoR2VuZXJhdGlvblR5cGUgZ2VuZXJhdGlvblR5cGUpIHsKLQkJcmV0dXJuIChnZW5lcmF0aW9uVHlwZSA9PSBudWxsKSA/IG51bGwgOiBnZW5lcmF0aW9uVHlwZS5nZXRPcm1HZW5lcmF0aW9uVHlwZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9HZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MjUxOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotCi0vKioKLSAqIFNlcXVlbmNlIGFuZCB0YWJsZSBnZW5lcmF0b3JzLgotICogPHA+Ci0gKiBTZXF1ZW5jZXMgY2FuIGJlIGRlZmluZWQgb248dWw+Ci0gKiA8bGk+SmF2YSBhbmQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZW50aXRpZXMKLSAqIDxsaT5KYXZhIGFuZCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBJRCBtYXBwaW5ncwotICogPGxpPjxjb2RlPm9ybS54bWw8L2NvZGU+IGVudGl0eSBtYXBwaW5ncyBlbGVtZW50cwotICogPC91bD4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRvcgotCWV4dGVuZHMgSnBhTmFtZWRDb250ZXh0Tm9kZQotewotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBnZW5lcmF0b3IncyB0eXBlLgotCSAqLwotCUNsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0b3I+IGdldFR5cGUoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0b3I+PiBUWVBFUyA9IG5ldyBBcnJheUl0ZXJhYmxlPENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0b3I+PigKLQkJCVNlcXVlbmNlR2VuZXJhdG9yLmNsYXNzLAotCQkJVGFibGVHZW5lcmF0b3IuY2xhc3MKLQkJKTsKLQotCS8vICoqKioqKioqKiogaW5pdGlhbCB2YWx1ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBpbml0aWFsIHZhbHVlIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICogZGVmYXVsdCBpbml0aWFsIHZhbHVlLgotCSAqLwotCWludCBnZXRJbml0aWFsVmFsdWUoKTsKLQlJbnRlZ2VyIGdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkSW5pdGlhbFZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWludCBnZXREZWZhdWx0SW5pdGlhbFZhbHVlKCk7Ci0JCVN0cmluZyBERUZBVUxUX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkgPSAiZGVmYXVsdEluaXRpYWxWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBhbGxvY2F0aW9uIHNpemUgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGFsbG9jYXRpb24gc2l6ZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZQotCSAqIGRlZmF1bHQgYWxsb2NhdGlvbiBzaXplLgotCSAqLwotCWludCBnZXRBbGxvY2F0aW9uU2l6ZSgpOwotCUludGVnZXIgZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKTsKLQl2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlpbnQgZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCk7Ci0JCVN0cmluZyBERUZBVUxUX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSA9ICJkZWZhdWx0QWxsb2NhdGlvblNpemUiOyAvLyROT04tTkxTLTEkCi0JaW50IERFRkFVTFRfQUxMT0NBVElPTl9TSVpFID0gNTA7Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgY29udGFpbmVyIHRoYXQgaG9sZHMgdGhlIHJlbGV2YW50IHNjaGVtYXRhLgotCSAqLwotCVNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBnZW5lcmF0b3IncyBkYXRhYmFzZSBjYXRhbG9nLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBnZW5lcmF0b3IncyBjYXRhbG9nIChuYW1lKSBpcyBpbnZhbGlkLgotCSAqLwotCUNhdGFsb2cgZ2V0RGJDYXRhbG9nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGdlbmVyYXRvcidzIGRhdGFiYXNlIHNjaGVtYS4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZ2VuZXJhdG9yJ3Mgc2NoZW1hIChuYW1lKSBpcyBpbnZhbGlkLgotCSAqLwotCVNjaGVtYSBnZXREYlNjaGVtYSgpOwotCi0JYm9vbGVhbiBpc0lkZW50aWNhbChHZW5lcmF0b3IgZ2VuZXJhdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvR2VuZXJhdG9yQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0dlbmVyYXRvckNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjNhMTI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIENvbnRhaW5lciBmb3IgYSB0YWJsZSBnZW5lcmF0b3IgYW5kL29yIHNlcXVlbmNlIGdlbmVyYXRvci4KLSAqIFVzZWQgYnkgZW50aXRpZXMgYW5kIElEIG1hcHBpbmdzLgotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBUaGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZW50aXR5IG1hcHBpbmdzIGVsZW1lbnQgY2FuCi0gKiBob2xkIG1vcmUgdGhhbiBhIHNpbmdsZSBzZXF1ZW5jZSBvciB0YWJsZSBnZW5lcmF0b3IsIHNvIGl0IGRvZXMgbm90IHVzZSB0aGlzCi0gKiBjb250YWluZXIuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBHZW5lcmF0b3JDb250YWluZXIKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBzZXF1ZW5jZSBhbmQgdGFibGUgZ2VuZXJhdG9ycy4KLQkgKi8KLQlJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKTsKLQotCi0JLy8gKioqKioqKioqKiBzZXF1ZW5jZSBnZW5lcmF0b3IgKioqKioqKioqKgotCi0JU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSA9ICJzZXF1ZW5jZUdlbmVyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQotCVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCi0Jdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQotCi0JLy8gKioqKioqKioqKiB0YWJsZSBnZW5lcmF0b3IgKioqKioqKioqKgotCQotCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkgPSAidGFibGVHZW5lcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JCi0JVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkKLQlUYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpOwotCQotCXZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSWRDbGFzc1JlZmVyZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9JZENsYXNzUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3OWQyMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9JZENsYXNzUmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLQotLyoqCi0gKiBJRCBjbGFzcyByZWZlcmVuY2UKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkQ2xhc3NSZWZlcmVuY2UKLQlleHRlbmRzIFBlcnNpc3RlbnRUeXBlLk93bmVyCi17Ci0JLy8gKioqKioqKioqKiBpZCBjbGFzcyBuYW1lICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgaWQgY2xhc3MsIHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gdGhlIGRlZmF1bHQgdmFsdWUgaWYgYXBwbGljYWJsZQotCSAqLwotCVN0cmluZyBnZXRJZENsYXNzTmFtZSgpOwotCQotCS8qKgotCSAqIFByb3BlcnR5IHN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUge0BsaW5rIElkQ2xhc3NIb2xkZXJ9J3Mgc3BlY2lmaWVkIGlkIGNsYXNzIG5hbWUKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX0lEX0NMQVNTX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkSWRDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgbmFtZSBvZiB0aGUgaWQgY2xhc3MsIG51bGwgaWYgbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JICovCi0JU3RyaW5nIGdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCk7Ci0JCi0JLyoqCi0JICogU2V0IHRoZSBzcGVjaWZpZWQgbmFtZSBvZiB0aGUgaWQgY2xhc3MuCi0JICogVXNlIG51bGwgdG8gcmVtb3ZlIHRoZSBpZCBjbGFzcyBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIHJlc291cmNlIG1vZGVsCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRJZENsYXNzTmFtZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFByb3BlcnR5IHN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUge0BsaW5rIElkQ2xhc3NIb2xkZXJ9J3MgZGVmYXVsdCBpZCBjbGFzcyBuYW1lCi0JICovCi0JU3RyaW5nIERFRkFVTFRfSURfQ0xBU1NfTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0SWRDbGFzc05hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IG5hbWUgb2YgdGhlIGlkIGNsYXNzLCBudWxsIGlmIHRoZXJlIGlzIG5vbmUKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdElkQ2xhc3NOYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGlkIGNsYXNzIGhhcyBiZWVuIHNwZWNpZmllZC4KLQkgKiBHZW5lcmFsbHksIHRoaXMgc2ltcGx5IG1lYW5zIHRoYXQgdGhlIGlkIGNsYXNzIG5hbWUgaGFzIGJlZW4gc2V0LCBhbHRob3VnaCBpZiBhIGRlZmF1bHQKLQkgKiBhcHBsaWVzLCB0aGlzIHNob3VsZCBhbHNvIHJldHVybiB0cnVlLgotCSAqLwotCWJvb2xlYW4gaXNTcGVjaWZpZWQoKTsKLQkKLQotCS8vICoqKioqKioqKiogaWQgY2xhc3MgKioqKioqKioqKgotCi0JLyoqCi0JICogUHJvcGVydHkgc3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSB7QGxpbmsgSWRDbGFzc0hvbGRlcn0ncyBpZCBjbGFzcy4KLQkgKiBUaGlzIHdpbGwgY2hhbmdlIChwb3RlbnRpYWxseSkgaWYgdGhlIGlkIGNsYXNzIG5hbWUgY2hhbmdlcywgb3IgaWYgb3RoZXIgY2hhbmdlcyByZXN1bHQKLQkgKiBpbiBjaGFuZ2VzIGluIHRoZSBpZCBjbGFzcycgcmVzb2x1dGlvbi4KLQkgKi8KLQlTdHJpbmcgSURfQ0xBU1NfUFJPUEVSVFkgPSAiaWRDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBKYXZhUGVyc2lzdGVudFR5cGV9IHRoYXQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgaWQgY2xhc3MgbmFtZS4KLQkgKiBUaGlzIHdpbGwgYmUgbnVsbCBpZiB0aGUgaWQgY2xhc3MgbmFtZSBpcyBudWxsIG9yIGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgcmVzb2x2ZWQgZnJvbSB0aGF0IAotCSAqIG5hbWUuCi0JICovCi0JSmF2YVBlcnNpc3RlbnRUeXBlIGdldElkQ2xhc3MoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIGlkIGNsYXNzIElUeXBlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCi0JICovCi0JY2hhciBnZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSVR5cGV9IHRoYXQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgaWQgY2xhc3MgbmFtZQotCSAqIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JSVR5cGUgZ2V0SWRDbGFzc0pkdFR5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9JZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjExN2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9JZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIElEIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElkTWFwcGluZwotCWV4dGVuZHMgQ29sdW1uTWFwcGluZywgQ29udmVydGlibGVNYXBwaW5nCi17Ci0JR2VuZXJhdG9yQ29udGFpbmVyIGdldEdlbmVyYXRvckNvbnRhaW5lcigpOwotCi0JR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQlHZW5lcmF0ZWRWYWx1ZSBhZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCXZvaWQgcmVtb3ZlR2VuZXJhdGVkVmFsdWUoKTsKLQkJU3RyaW5nIEdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSA9ICJnZW5lcmF0ZWRWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSW5oZXJpdGFuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0luaGVyaXRhbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzAwM2JmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSW5oZXJpdGFuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEluaGVyaXRhbmNlIFR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgewotCi0JU0lOR0xFX1RBQkxFKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRQotCQkpLAotCUpPSU5FRCgKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZS5KT0lORUQsCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5KT0lORUQKLQkJKSwKLQlUQUJMRV9QRVJfQ0xBU1MoCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTCi0JCSk7Ci0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlIGphdmFJbmhlcml0YW5jZVR5cGU7Ci0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSBvcm1Jbmhlcml0YW5jZVR5cGU7Ci0KLQlJbmhlcml0YW5jZVR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlIGphdmFJbmhlcml0YW5jZVR5cGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlIG9ybUluaGVyaXRhbmNlVHlwZSkgewotCQlpZiAoamF2YUluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAob3JtSW5oZXJpdGFuY2VUeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUluaGVyaXRhbmNlVHlwZSA9IGphdmFJbmhlcml0YW5jZVR5cGU7Ci0JCXRoaXMub3JtSW5oZXJpdGFuY2VUeXBlID0gb3JtSW5oZXJpdGFuY2VUeXBlOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUgZ2V0SmF2YUluaGVyaXRhbmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUluaGVyaXRhbmNlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUgZ2V0T3JtSW5oZXJpdGFuY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1Jbmhlcml0YW5jZVR5cGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGZyb21KYXZhUmVzb3VyY2VNb2RlbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUgamF2YUluaGVyaXRhbmNlVHlwZSkgewotCQlyZXR1cm4gKGphdmFJbmhlcml0YW5jZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhqYXZhSW5oZXJpdGFuY2VUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmhlcml0YW5jZVR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsXyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZVR5cGUgamF2YUluaGVyaXRhbmNlVHlwZSkgewotCQlmb3IgKEluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUgOiBJbmhlcml0YW5jZVR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChpbmhlcml0YW5jZVR5cGUuZ2V0SmF2YUluaGVyaXRhbmNlVHlwZSgpID09IGphdmFJbmhlcml0YW5jZVR5cGUpIHsKLQkJCQlyZXR1cm4gaW5oZXJpdGFuY2VUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlIHRvSmF2YVJlc291cmNlTW9kZWwoSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSkgewotCQlyZXR1cm4gKGluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBpbmhlcml0YW5jZVR5cGUuZ2V0SmF2YUluaGVyaXRhbmNlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlIG9ybUluaGVyaXRhbmNlVHlwZSkgewotCQlyZXR1cm4gKG9ybUluaGVyaXRhbmNlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JtSW5oZXJpdGFuY2VUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmhlcml0YW5jZVR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlIG9ybUluaGVyaXRhbmNlVHlwZSkgewotCQlmb3IgKEluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUgOiBJbmhlcml0YW5jZVR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChpbmhlcml0YW5jZVR5cGUuZ2V0T3JtSW5oZXJpdGFuY2VUeXBlKCkgPT0gb3JtSW5oZXJpdGFuY2VUeXBlKSB7Ci0JCQkJcmV0dXJuIGluaGVyaXRhbmNlVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlIHRvT3JtUmVzb3VyY2VNb2RlbChJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCXJldHVybiAoaW5oZXJpdGFuY2VUeXBlID09IG51bGwpID8gbnVsbCA6IGluaGVyaXRhbmNlVHlwZS5nZXRPcm1Jbmhlcml0YW5jZVR5cGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Kb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMGRkZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Kb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFNwZWNpZmllZCBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pbkNvbHVtbgotCWV4dGVuZHMgQmFzZUpvaW5Db2x1bW4sIEJhc2VDb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbgotewotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGpvaW4gY29sdW1uIGZyb20gdGhlIHNwZWNpZmllZCBvbGQgam9pbiBjb2x1bW4uCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUpvaW5Db2x1bW4gb2xkSm9pbkNvbHVtbik7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBqb2luIGNvbHVtbiBmcm9tIHRoZSBzcGVjaWZpZWQgb2xkIHZpcnR1YWwgam9pbiBjb2x1bW4uCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Kb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODBhZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9Kb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSm9pbiBjb2x1bW4gcmVsYXRpb25zaGlwPHVsPgotICogPGxpPjE6MQotICogPGxpPjE6bQotICogPGxpPm06MQotICogPGxpPmFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8L3VsPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIFJlbGF0aW9uc2hpcAotICogQHNlZSBKb2luQ29sdW1uCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLQlleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCwgUmVsYXRpb25zaGlwCi17Ci0JSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgcmVsYXRpb25zaGlwJ3Mgc3RyYXRlZ3kgdG8gdGhlIGpvaW4gY29sdW1uIHN0cmF0ZWd5LgotCSAqLwotCXZvaWQgc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzk2ZmEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBKb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZwotICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiBAc2VlIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCXZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpOwotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gdG8gdGhlIHJlbGF0aW9uc2hpcC4KLQkgKi8KLQlKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKTsKLQotCS8qKgotCSAqIEFkZCBhIHNwZWNpZmllZCBqb2luIGNvbHVtbiB0byB0aGUgcmVsYXRpb25zaGlwLgotCSAqLwotCUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4uCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbi4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbiBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pvaW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTE2OWJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogVXNlZCBieSBtYW55LXRvLW1hbnkgYW5kIG9uZS10by1tYW55IG1hcHBpbmdzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pblRhYmxlCi0JZXh0ZW5kcyBSZWZlcmVuY2VUYWJsZSwgUmVhZE9ubHlKb2luVGFibGUKLXsKLQlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRQYXJlbnQoKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luVGFibGUgb2xkSm9pblRhYmxlKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5Sm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGUpOwotCi0KLQkvLyAqKioqKioqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIGpvaW4gdGFibGUncyBkZWZhdWx0IGludmVyc2Ugam9pbiBjb2x1bW4gdG8gYSBzcGVjaWZpZWQKLQkgKiBpbnZlcnNlIGpvaW4gY29sdW1uLgotCSAqLwotCXZvaWQgY29udmVydERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtblRvU3BlY2lmaWVkKCk7Ci0KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGdldEludmVyc2VKb2luQ29sdW1ucygpOwotCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQotCUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEFkZCBhIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1uIHRvIHRoZSBqb2luIHRhYmxlLgotCSAqIFJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBqb2luIGNvbHVtbi4KLQkgKi8KLQlKb2luQ29sdW1uIGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbiB0byB0aGUgam9pbiB0YWJsZS4KLQkgKiBSZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgam9pbiBjb2x1bW4uCi0JICovCi0JSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBpbnZlcnNlIGpvaW4gY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgam9pbiB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1uIGZyb20gdGhlIGpvaW4gdGFibGUuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCi0JLyoqCi0JICogTW92ZSBhbiBpbnZlcnNlIGpvaW4gY29sdW1uIGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYWxsIHRoZSBqb2luIHRhYmxlJ3MgaW52ZXJzZSBqb2luIGNvbHVtbnMuCi0JICovCi0Jdm9pZCBjbGVhclNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCi0JSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pblRhYmxlUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWI2MGFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pblRhYmxlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSm9pbiB0YWJsZSByZWxhdGlvbnNoaXA8dWw+Ci0gKiA8bGk+MToxIChKUEEgMi4wKQotICogPGxpPjE6bQotICogPGxpPm06MSAoSlBBIDIuMCkKLSAqIDxsaT5tOm0KLSAqIDxsaT5hc3NvY2lhdGlvbiBvdmVycmlkZSAoSlBBIDIuMCkKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKb2luVGFibGVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwLCBSZWxhdGlvbnNoaXAKLXsKLQlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSByZWxhdGlvbnNoaXAncyBzdHJhdGVneSB0byB0aGUgam9pbiB0YWJsZSBzdHJhdGVneS4KLQkgKi8KLQl2b2lkIHNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhMmU3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSm9pbiB0YWJsZSByZWxhdGlvbnNoaXAgc3RyYXRlZ3kuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICogQHNlZSBKb2luVGFibGVSZWxhdGlvbnNoaXAKLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgCi0JZXh0ZW5kcyBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCXZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBvbGRTdHJhdGVneSk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHZpcnR1YWxTdHJhdGVneSk7Ci0KLQlKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pwYUNvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZTg5ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9KcGFDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgZm9yIEpQQSBvYmplY3RzIHRoYXQgaGF2ZSBhIGNvbnRleHQsIGFzIG9wcG9zZWQgdG8KLSAqIHJlc291cmNlIG9iamVjdHMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFDb250ZXh0Tm9kZQotCWV4dGVuZHMgSnBhTm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgdHlwZSBvZiB0aGUgY29udGV4dCBub2RlJ3MgcmVzb3VyY2UuCi0JICovCi0JSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGlmIHRoZSBjb250ZXh0IG5vZGUgaXMgd2l0aGluIGEgCi0JICogcGVyc2lzdGVuY2UgdW5pdC4gT3RoZXJ3aXNlIHRocm93IGFuIGV4Y2VwdGlvbi4KLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZmlsZSByb290IGlmIHRoZSBjb250ZXh0IG5vZGUgaXMgd2l0aGluIGEgCi0JICogbWFwcGluZyBmaWxlLiBPdGhlcndpc2UgdGhyb3cgYW4gZXhjZXB0aW9uLgotCSAqLwotCU1hcHBpbmdGaWxlUm9vdCBnZXRNYXBwaW5nRmlsZVJvb3QoKTsKLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQlTY2hlbWFDb250YWluZXIgZ2V0Q29udGV4dERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpOwotCi0JQ2F0YWxvZyBnZXRDb250ZXh0RGVmYXVsdERiQ2F0YWxvZygpOwotCi0JU2NoZW1hIGdldENvbnRleHREZWZhdWx0RGJTY2hlbWEoKTsKLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHJlc291cmNlIG1vZGVsIGhhcyBjaGFuZ2VkOyBzeW5jaHJvbml6ZSB0aGUgY29udGV4dCBtb2RlbCB3aXRoIGl0LgotCSAqIFRoaXMgd2lsbCBwcm9iYWJseSB0cmlnZ2VyIGEgY2FsbCB0byB7QGxpbmsgI3VwZGF0ZSgpfS4KLQkgKi8KLQl2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCS8qKgotCSAqIFNvbWUgbm9uLXRyaXZpYWwgc3RhdGUgaW4gdGhlIEpQQSBwcm9qZWN0IGhhcyBjaGFuZ2VkOyB1cGRhdGUgdGhlCi0JICogcGFydHMgb2YgdGhlIGNvbnRleHQgbm9kZSB0aGF0IGFyZSBkZXBlbmRlbnQgb24geWV0IG90aGVyIHBhcnRzIG9mIHRoZQotCSAqIG5vZGUncyBKUEEgcHJvamVjdC4KLQkgKiBJZiB0aGUgZGVwZW5kZW50IHN0YXRlIGNoYW5nZXMgYWxzbywgeWV0IGFub3RoZXIgPGVtPnVwZGF0ZTwvZW0+IHdpbGwgYmUKLQkgKiB0cmlnZ2VyZWQsIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IHlldCBtb3JlIDxlbT51cGRhdGVzPC9lbT47IHVudGlsIHRoZSBKUEEKLQkgKiBwcm9qZWN0J3Mgc3RhdGUgcXVpZXNjZXMuCi0JICovCi0Jdm9pZCB1cGRhdGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvSnBhTmFtZWRDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9KcGFOYW1lZENvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMGZiYWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9KcGFOYW1lZENvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotCi0vKioKLSAqIE5hbWVkIGNvbnRleHQgbm9kZS4KLSAqIDxwPgotICogVmVzdGlnaWFsIC0gbm90IHN1cmUgaG93IGhlbHBmdWwgdGhpcyBjb21tb24gaW50ZXJmYWNlIGlzIG5vdy4uLi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhTmFtZWRDb250ZXh0Tm9kZQotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLQlDbGFzczw/IGV4dGVuZHMgSnBhTmFtZWRDb250ZXh0Tm9kZT4gZ2V0VHlwZSgpOwotCi0JZmluYWwgY2xhc3MgTmFtZVRyYW5zZm9ybWVyPE4gZXh0ZW5kcyBKcGFOYW1lZENvbnRleHROb2RlPgotCQlpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPE4sIFN0cmluZz4sIFNlcmlhbGl6YWJsZQotCXsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBOYW1lVHJhbnNmb3JtZXIgSU5TVEFOQ0UgPSBuZXcgTmFtZVRyYW5zZm9ybWVyKCk7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgSnBhTmFtZWRDb250ZXh0Tm9kZT4gVHJhbnNmb3JtZXI8VCwgU3RyaW5nPiBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTmFtZVRyYW5zZm9ybWVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShOIG5vZGUpIHsKLQkJCXJldHVybiBub2RlLmdldE5hbWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFNpbmdsZXRvblRvU3RyaW5nKHRoaXMpOwotCQl9Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQlwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKLQkJCS8vIHJlcGxhY2UgdGhpcyBvYmplY3Qgd2l0aCB0aGUgc2luZ2xldG9uCi0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pwYVJvb3RDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9KcGFSb290Q29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmMTdkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0pwYVJvb3RDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBSb290IG9mIHRoZSBEYWxpIEpQQSBjb250ZXh0IG1vZGVsLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUm9vdENvbnRleHROb2RlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW5jZS54bWwgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSBYTUwgcHJvcGVydHkKLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRZID0gInBlcnNpc3RlbmNlWG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIAotCSAqIFJldHVybiB0aGUgY29udGVudCByZXByZXNlbnRlZCBieSB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPgotCSAqIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSByb290IGNvbnRleHQgbm9kZSdzIEpQQSBwcm9qZWN0LgotCSAqIFRoaXMgbWF5IGJlIG51bGwuIAotCSAqLwotCVBlcnNpc3RlbmNlWG1sIGdldFBlcnNpc3RlbmNlWG1sKCk7Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBZGQgdmFsaWRhdGlvbiBtZXNzYWdlcyB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTG9iQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L0xvYkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTA2NmNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTG9iQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSBMT0IgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2JDb252ZXJ0ZXIKLQlleHRlbmRzIENvbnZlcnRlcgotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hbnlUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiOThhODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMXMgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIG06bSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBNYW55VG9NYW55TWFwcGluZwotCWV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JTWFueVRvTWFueVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFueVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYW55VG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYzE4YzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYW55VG9NYW55UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogbTptIHJlbGF0aW9uc2hpcCByZWZlcmVuY2UKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIE1hcHBlZEJ5UmVsYXRpb25zaGlwLAotCQkJSm9pblRhYmxlUmVsYXRpb25zaGlwLAotCQkJTWFwcGluZ1JlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTYxN2UyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBKUEEgbToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb09uZU1hcHBpbmcKLQlleHRlbmRzIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlNYW55VG9PbmVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hbnlUb09uZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYW55VG9PbmVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyZjI5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hbnlUb09uZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIG06MSByZWxhdGlvbnNoaXAgKGpvaW4gY29sdW1uKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFueVRvT25lUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBKb2luQ29sdW1uUmVsYXRpb25zaGlwLCBNYXBwaW5nUmVsYXRpb25zaGlwCi17Ci0JLy8gbm90aGluZwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwZWRCeVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwZWRCeVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWY2MTBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFwcGVkQnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAiTWFwcGVkIGJ5IiByZWxhdGlvbnNoaXA8dWw+Ci0gKiA8bGk+MToxCi0gKiA8bGk+MTptCi0gKiA8bGk+bTptCi0gKiA8L3VsPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGVkQnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIFJlbGF0aW9uc2hpcAotewotCS8qKgotCSAqIFJldHVybiB0aGUgKG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+KSBzdHJhdGVneSB1c2VkIHRvIGNvbmZpZ3VyZQotCSAqIHRoZSByZWxhdGlvbnNoaXAncyAibWFwcGVkIGJ5IiBzdHJhdGVneS4KLQkgKi8KLQlNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSAibWFwcGVkIGJ5IiBzdHJhdGVneSBpcyB0aGUKLQkgKiByZWxhdGlvbnNoaXAncyBjdXJyZW50IHN0cmF0ZWd5LgotCSAqLwotCWJvb2xlYW4gc3RyYXRlZ3lJc01hcHBlZEJ5KCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJlbGF0aW9uc2hpcCdzIHN0cmF0ZWd5IHRvIHRoZSAibWFwcGVkIGJ5IiBzdHJhdGVneS4KLQkgKi8KLQl2b2lkIHNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtYXBwaW5nIG1heSBvd24gdGhlIHJlbGF0aW9uc2hpcC4KLQkgKi8KLQlib29sZWFuIG1heUJlTWFwcGVkQnkoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MGIyNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqICJNYXBwZWQgYnkiIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIE1hcHBlZEJ5UmVsYXRpb25zaGlwCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0Jdm9pZCBpbml0aWFsaXplRnJvbShNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IG9sZFN0cmF0ZWd5KTsKLQkKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGF0dHJpYnV0ZSBwcm9wZXJ0eSBvZiB0aGlzIG9iamVjdAotCSAqLwotCVN0cmluZyBNQVBQRURfQllfQVRUUklCVVRFX1BST1BFUlRZID0gIm1hcHBlZEJ5QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgbWFwcyB0aGUgcmVsYXRpb25zaGlwLgotCSAqLwotCVN0cmluZyBnZXRNYXBwZWRCeUF0dHJpYnV0ZSgpOwotCQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRoYXQgbWFwcyB0aGUgcmVsYXRpb25zaGlwLgotCSAqLwotCXZvaWQgc2V0TWFwcGVkQnlBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwb3NzaWJsZSBhdHRyaWJ1dGUgbmFtZXMgdGhlIHN0cmF0ZWd5IG1pZ2h0IHVzZS4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHN0cmF0ZWd5J3MgcmVsYXRpb25zaGlwIGlzIG93bmVkIGJ5IHRoZSBnaXZlbiBvdGhlcgotCSAqIHJlbGF0aW9uc2hpcCBtYXBwaW5nCi0JICovCi0JYm9vbGVhbiByZWxhdGlvbnNoaXBJc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBvdGhlck1hcHBpbmcpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2MDk2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogbWFwcGVkIHN1cGVyY2xhc3MKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3MKLQlleHRlbmRzIFR5cGVNYXBwaW5nCi17Ci0JSWRDbGFzc1JlZmVyZW5jZSBnZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBpbmdGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBpbmdGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhODlmZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbnRUeXBlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIEpQQSBtYXBwaW5nIGZpbGUgKHR5cGljYWxseSA8Y29kZT5vcm0ueG1sPC9jb2RlPikuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBwaW5nRmlsZQotCWV4dGVuZHMgWG1sRmlsZSwgUGVyc2lzdGVudFR5cGVDb250YWluZXIKLXsKLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JTWFwcGluZ0ZpbGVSZWYgZ2V0UGFyZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZmlsZSdzIHJvb3QuCi0JICogVGhpcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JTWFwcGluZ0ZpbGVSb290IGdldFJvb3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtYXBwaW5nIGZpbGUgZXhpc3RzIGluIHRoZSBzcGVjaWZpZWQgZm9sZGVyLgotCSAqLwotCWJvb2xlYW4gaXNJbihJRm9sZGVyIGZvbGRlcik7Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcy9nZW5lcmF0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcXVlcmllcyBkZWZpbmVkIGRpcmVjdGx5IGluIHRoZSBtYXBwaW5nIGZpbGUgKGFzIG9wcG9zZWQgdG8KLQkgKiBpbmNsdWRpbmcgdGhlIHF1ZXJpZXMgZGVmaW5lZCBpbiBKYXZhIGFubm90YXRpb25zKS4KLQkgKi8KLQlJdGVyYWJsZTxRdWVyeT4gZ2V0TWFwcGluZ0ZpbGVRdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGdlbmVyYXRvcnMgZGVmaW5lZCBkaXJlY3RseSBpbiB0aGUgbWFwcGluZyBmaWxlIChhcyBvcHBvc2VkIHRvCi0JICogaW5jbHVkaW5nIHRoZSBnZW5lcmF0b3JzIGRlZmluZWQgaW4gSmF2YSBhbm5vdGF0aW9ucykuCi0JICovCi0JSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRNYXBwaW5nRmlsZUdlbmVyYXRvcnMoKTsKLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgRGVsZXRlRWRpdHMgZm9yIGRlbGV0aW5nIHJlZmVyZW5jZXMgKGlmIGFueSkgdG8gdGhlIHR5cGUgYWJvdXQgdG8gYmUgZGVsZXRlZC4KLQkgKiBSZXR1cm4gYW4gRW1wdHlJdGVyYWJsZSBpZiB0aGVyZSBhcmUgbm90IGFueSByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZURlbGV0ZVR5cGVFZGl0cyhJVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQsIHRoZSBuZXdOYW1lIGlzIHRoZSBuZXcgc2hvcnQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsUGFja2FnZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyZWMxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzIGhlbGQgYnkgYSBtYXBwaW5nIGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JZXh0ZW5kcyBYbWxDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3MgdHlwZSBmb3IgYWxsIG1hbmFnZWQgY2xhc3NlcyBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwKLQkgKiB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBhIGxvY2FsIGFubm90YXRpb24gb3IgWE1MIHNldHRpbmcuCi0JICovCi0JQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2F0YWxvZyBmb3IgYWxsIGRhdGFiYXNlIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0aGUKLQkgKiBwZXJzaXN0ZW5jZSB1bml0LCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBhIGxvY2FsIGFubm90YXRpb24gb3IgWE1MIHNldHRpbmcuCi0JICogPHA+Ci0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgY2F0YWxvZyBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZQotCSAqIGRlZmF1bHQgY2F0YWxvZyBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uLgotCSAqLwotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSBmb3IgYWxsIGRhdGFiYXNlIG9iamVjdHMgcmVmZXJlbmNlZCBpbiB0aGUKLQkgKiBwZXJzaXN0ZW5jZSB1bml0LCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBhIGxvY2FsIGFubm90YXRpb24gb3IgWE1MIHNldHRpbmcuCi0JICogPHA+Ci0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc2NoZW1hIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICogZGVmYXVsdCBzY2hlbWEgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZGF0YWJhc2UgY29ubmVjdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSByZWxhdGlvbmhpcHMgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXJlIHRvIGJlIGNhc2NhZGUKLQkgKiBwZXJzaXN0LCB1bmxlc3Mgb3ZlcnJpZGRlbiBieSBhIGxvY2FsIGFubm90YXRpb24gb3IgWE1MIHNldHRpbmcuCi0JICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzEzYjY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBQZXJzaXN0ZW5jZSB1bml0IG1ldGFkYXRhIGhlbGQgYnkgYSBtYXBwaW5nIGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQlleHRlbmRzIFhtbENvbnRleHROb2RlCi17Ci0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCU1hcHBpbmdGaWxlUm9vdCBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBhbm5vdGF0aW9ucyBvbiB0aGUgcGVyc2lzdGVudCB0eXBlcyBhc3NvY2lhdGVkIHdpdGgKLQkgKiB0aGUgbWFwcGluZyBmaWxlJ3MgcGVyc2lzdGVuY2UgdW5pdCBhcmUgdG8gYmUgaWdub3JlZC4KLQkgKi8KLQlib29sZWFuIGlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cyBoZWxkIGJ5IHRoZSBtYXBwaW5nIGZpbGUuCi0JICovCi0JTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgZmlsZSdzIHVuZGVybHlpbmcgcmVzb3VyY2UgZXhpc3RzLgotCSAqIElmIHRoZXJlIGlzIGEgbm9kZSBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBmb3IgdGhlCi0JICoge0Bjb2RlIDxwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhPn0gZWxlbWVudCwKLQkgKiByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT47IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICovCi0JYm9vbGVhbiByZXNvdXJjZUV4aXN0cygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZVJvb3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFwcGluZ0ZpbGVSb290LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzVhNGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9NYXBwaW5nRmlsZVJvb3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW50VHlwZUNvbnRhaW5lcjsKLQotLyoqCi0gKiBUaGUgcm9vdCBvZiBhIEpQQSBtYXBwaW5nIGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBwaW5nRmlsZVJvb3QKLQlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlLCBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lcgotewotCS8qKgotCSAqIGNvdmFyaWFudCBvdmVycmlkZQotCSAqLwotCU1hcHBpbmdGaWxlIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYWNjZXNzIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkgKiBhY2Nlc3MuCi0JICovCi0JQWNjZXNzVHlwZSBnZXRBY2Nlc3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAotCSAqIGNhdGFsb2cuCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHNjaGVtYSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JICogc2NoZW1hLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWV0YWRhdGEgZGVmaW5lZCB3aXRoaW4gdGhlIG1hcHBpbmcgZmlsZQotCSAqIDxlbT5mb3IgdGhlIHBlcnNpc3RlbmNlIHVuaXQ8L2VtPi4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZSBleGlzdHMuCi0JICogCi0JICogQHNlZSBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI3Jlc291cmNlRXhpc3RzKCkKLQkgKi8KLQlNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L01hcHBpbmdSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzAwMDMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIE1hcHBpbmcgcmVsYXRpb25zaGlwPHVsPgotICogPGxpPjE6MQotICogPGxpPjE6bQotICogPGxpPm06MQotICogPGxpPm06bQotICogPC91bD4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwcGluZ1JlbGF0aW9uc2hpcAotCWV4dGVuZHMgUmVsYXRpb25zaGlwCi17Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlbGF0aW9uc2hpcCdzIG1hcHBpbmcgaXMgdGhlIHJlbGF0aW9uc2hpcCBvd25lci4KLQkgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcjaXNSZWxhdGlvbnNoaXBPd25lcigpCi0JICovCi0JYm9vbGVhbiBpc093bmVyKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBtYXBwaW5nIG93bnMgdGhlIHJlbGF0aW9uc2hpcC4KLQkgKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcjaXNPd25lZEJ5KEF0dHJpYnV0ZU1hcHBpbmcpCi0JICovCi0JYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZWxhdGlvbnNoaXAncyBtYXBwaW5nIGlzIGEgdGFyZ2V0IGZvcmVpZ24ga2V5Ci0JICogcmVsYXRpb25zaGlwLgotCSAqIEEgb25lLXRvLW1hbnkgbWFwcGluZyB3aXRoIGEgam9pbiBjb2x1bW4gd2lsbCBoYXZlIHRoZSBmb3JlaWduIGtleQotCSAqIGluIHRoZSB0YXJnZXQgdGFibGUuCi0JICovCi0JYm9vbGVhbiBpc1RhcmdldEZvcmVpZ25LZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZWxhdGlvbnNoaXAncyBtYXBwaW5nIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYW4KLQkgKiBhc3NvY2lhdGlvbiBvdmVycmlkZS4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcnJpZGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L011bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWIwNjFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIE11bHRpLXZhbHVlZCByZWxhdGlvbnNoaXAgKDE6bSwgbTptKSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nLCBDb2xsZWN0aW9uTWFwcGluZwotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L05hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L05hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNDkzYzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9OYW1lZENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBTcGVjaWZpZWQKLSAqIDx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8bGk+ZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxsaT5vcmRlciBjb2x1bW4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5TmFtZWRDb2x1bW4KLXsKLQl2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5hbWUpOwotCi0Jdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L05hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVjYjVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2NyaW1pbmF0b3IgY29sdW1ucwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uCi0JZXh0ZW5kcyBOYW1lZENvbHVtbiwgUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4KLXsKLQl2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIG5ld1NwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKTsKLQl2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvTmFtZWROYXRpdmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjczNzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci0KLS8qKgotICogbmFtZWQgbmF0aXZlIHF1ZXJ5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5Ci0JZXh0ZW5kcyBRdWVyeQotewotCS8vICoqKioqKioqKiogcmVzdWx0IGNsYXNzICoqKioqKioqKioKLQotCVN0cmluZyBnZXRSZXN1bHRDbGFzcygpOwotCXZvaWQgc2V0UmVzdWx0Q2xhc3MoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFJFU1VMVF9DTEFTU19QUk9QRVJUWSA9ICJyZXN1bHRDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2hhcmFjdGVyIHRvIGJlIHVzZWQgZm9yIGJyb3dzaW5nIG9yCi0JICogY3JlYXRpbmcgdGhlIHJlc3VsdCBjbGFzcyB7QGxpbmsgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUgSVR5cGV9LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCi0JICovCi0JY2hhciBnZXRSZXN1bHRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIElUeXBlfSB0aGF0IGlzIHJlc29sdmVkIGZyb20gdGhlIHJlc3VsdCBjbGFzcyBuYW1lCi0JICogb3IgbnVsbCBpZiBub25lIGV4aXN0cy4KLQkgKi8KLQlJVHlwZSBnZXRSZXN1bHRDbGFzc0pkdFR5cGUoKTsKLQotCi0JLy8gKioqKioqKioqKiByZXN1bHQgc2V0IG1hcHBpbmcgKioqKioqKioqKgotCi0JU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKTsKLQl2b2lkIHNldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSA9ICJyZXN1bHRTZXRNYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9OYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L05hbWVkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhYzU1ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L05hbWVkUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogbmFtZWQgcXVlcnkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcnkKLQlleHRlbmRzIFF1ZXJ5Ci17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODMzOGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEpQQSAxOm0gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9NYW55TWFwcGluZwotCWV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JT25lVG9NYW55UmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkN2Q0MGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAxOm0gcmVsYXRpb25zaGlwIChtYXBwZWQgYnksIGpvaW4gdGFibGUpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBPbmVUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIE1hcHBlZEJ5UmVsYXRpb25zaGlwLAotCQkJSm9pblRhYmxlUmVsYXRpb25zaGlwLAotCQkJTWFwcGluZ1JlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L09uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY1OTVjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L09uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBKUEEgMToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9uZVRvT25lTWFwcGluZwotCWV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotewotCU9uZVRvT25lUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PbmVUb09uZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PbmVUb09uZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M1MDE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvT25lVG9PbmVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiAxOjEgcmVsYXRpb25zaGlwIChtYXBwZWQgYnksIGpvaW4gY29sdW1uLCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9uZVRvT25lUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBNYXBwZWRCeVJlbGF0aW9uc2hpcCwKLQkJCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAsCi0JCQlQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCwKLQkJCU1hcHBpbmdSZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PcHRpb25hbE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvT3B0aW9uYWxNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDc3NjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PcHRpb25hbE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIGF0dHJpYnV0ZSBtYXBwaW5nIHRoYXQgaXMgb3B0aW9uYWwgKGUuZy4gYmFzaWMsIHNpbmdsZSByZWxhdGlvbnNoaXApLgotICogRnJvbSB0aGUgSlBBIHNwZWM6Ci0gKiA8cHJlPgotICogV2hldGhlciB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIG9yIHByb3BlcnR5IG1heSBiZSBudWxsLiBUaGlzIGlzIGEgaGludCAKLSAqIGFuZCBpcyBkaXNyZWdhcmRlZCBmb3IgcHJpbWl0aXZlIHR5cGVzOyBpdCBtYXkgYmUgdXNlZCBpbiBzY2hlbWEgZ2VuZXJhdGlvbi4KLSAqIDwvcHJlPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9wdGlvbmFsTWFwcGluZwotCWV4dGVuZHMgQXR0cmlidXRlTWFwcGluZwotewotCWJvb2xlYW4gaXNPcHRpb25hbCgpOwotCQotCWJvb2xlYW4gaXNEZWZhdWx0T3B0aW9uYWwoKTsKLQkJU3RyaW5nIERFRkFVTFRfT1BUSU9OQUxfUFJPUEVSVFkgPSAiZGVmYXVsdE9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfT1BUSU9OQUwgPSB0cnVlOwotCQotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKTsKLQl2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3B0aW9uYWwpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZID0gInNwZWNpZmllZE9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PcmRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvT3JkZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmFiM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PcmRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogTXVsdGktdmFsdWVkICgxOm0sIG06bSkgcmVsYXRpb25zaGlwIG1hcHBpbmdzIHN1cHBvcnQgb3JkZXJpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlcmFibGUKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKTsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWRPcmRlckJ5KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRPcmRlckJ5KFN0cmluZyBvcmRlckJ5KTsKLQkJU3RyaW5nIFNQRUNJRklFRF9PUkRFUl9CWV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRPcmRlckJ5IjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNOb09yZGVyaW5nKCk7Ci0Jdm9pZCBzZXROb09yZGVyaW5nKGJvb2xlYW4gbm9PcmRlcmluZyk7Ci0JCVN0cmluZyBOT19PUkRFUklOR19QUk9QRVJUWSA9ICJub09yZGVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNQa09yZGVyaW5nKCk7Ci0Jdm9pZCBzZXRQa09yZGVyaW5nKGJvb2xlYW4gcGtPcmRlcmluZyk7Ci0JCVN0cmluZyBQS19PUkRFUklOR19QUk9QRVJUWSA9ICJwa09yZGVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNDdXN0b21PcmRlcmluZygpOwotCXZvaWQgc2V0Q3VzdG9tT3JkZXJpbmcoYm9vbGVhbiBjdXN0b21PcmRlcmluZyk7Ci0JCVN0cmluZyBDVVNUT01fT1JERVJJTkdfUFJPUEVSVFkgPSAiY3VzdG9tT3JkZXJpbmciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L092ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L092ZXJyaWRlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MjNiOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nIHRoYXQgY29udGFpbnMgdGhlIG92ZXJyaWRlIGNvbnRhaW5lci4KLQkgKiBGb3IgZXhhbXBsZTo8dWw+Ci0JICogPGxpPmZvciBhbiBlbnRpdHksIHRoaXMgd291bGQgYmUgdGhlIGVudGl0eSBpdHNlbGYKLQkgKiA8bGk+Zm9yIGFuIGVtYmVkZGVkLCB0aGlzIHdvdWxkIGJlIHR5cGUgbWFwcGluZyB3aGVyZSB0aGUgZW1iZWRkZWQgaXMKLQkgKiAgICAgZGVjbGFyZWQsIGFzIG9wcG9zZWQgdG8gdGhlIHR5cGUgbWFwcGluZyB0aGUgZW1iZWRkZWQgcmVmZXJlbmNlcwotCSAqIDwvdWw+Ci0JICovCi0JVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nIHRoYXQgY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMvYXNzb2NpYXRpb25zIHRvCi0JICogYmUgb3ZlcnJpZGRlbjsgdGhvdWdoIHRoZSB0eXBlIG1hcHBpbmcgbWF5IG5vdCA8ZW0+ZGlyZWN0bHk8L2VtPgotCSAqIG93biB0aGVtIChlLmcuIHRoZXkgbWF5IGJlIG93bmVkIGJ5IGEgc3VwZXJ0eXBlIG1hcHBpbmcpLgotCSAqIEZvciBleGFtcGxlOjx1bD4KLQkgKiA8bGk+Zm9yIGFuIGVudGl0eSwgdGhpcyB3b3VsZCBiZSB0aGUgZW50aXR5J3Mgc3VwZXJ0eXBlIG1hcHBpbmcKLQkgKiA8bGk+Zm9yIGFuIGVtYmVkZGVkLCB0aGlzIHdvdWxkIGJlIHRoZSBlbWJlZGRlZCdzIHRhcmdldCB0eXBlIG1hcHBpbmcKLQkgKiA8L3VsPgotCSAqLwotCVR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBhdHRyaWJ1dGVzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4KLQkgKiAoaS5lLiBhbiBvdmVycmlkZSBtdXN0IGhhdmUgYSBuYW1lIGZyb20gdGhpcyBsaXN0KS4KLQkgKiBUaGlzIGlzIHVzdWFsbHkganVzdCBhbGwgb2YgdGhlIG92ZXJyaWRhYmxlIG5hbWVzIG9mIHRoZSBvdmVycmlkYWJsZQotCSAqIHR5cGUgbWFwcGluZy4KLQkgKiBAc2VlICNnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGFibGUgY2Fubm90IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkCi0JICogYXMgdGhlIHRhYmxlIGZvciBhbiBvdmVycmlkZSdzIGNvbHVtbiBvciBqb2luIGNvbHVtbi4KLQkgKi8KLQlib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGFibGVzIHRoYXQgYXJlIHZhbGlkIGZvciBhbiBvdmVycmlkZSdzCi0JICogY29sdW1uIG9yIGpvaW4gY29sdW1uLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCB0YWJsZSBuYW1lLgotCSAqLwotCVRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHRhYmxlIGZvciBhbiBvdmVycmlkZSdzIGNvbHVtbiBvciBqb2luIGNvbHVtbi4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCi0JSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0KLQlKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvdmVycmlkZXMsIGJvdGggPGVtPnNwZWNpZmllZDwvZW0+IGFuZCA8ZW0+dmlydHVhbDwvZW0+LgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlPdmVycmlkZT4gZ2V0T3ZlcnJpZGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBvdmVycmlkZXMsIGJvdGggPGVtPnNwZWNpZmllZDwvZW0+IGFuZCA8ZW0+dmlydHVhbDwvZW0+LgotCSAqLwotCWludCBnZXRPdmVycmlkZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG92ZXJyaWRlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLAotCSAqIHdoZXRoZXIgPGVtPnNwZWNpZmllZDwvZW0+IG9yIDxlbT52aXJ0dWFsPC9lbT4uCi0JICovCi0JLy8gVE9ETyBsb29rIGludG8gZ2V0dGluZyByaWQgb2YgdGhpczsKLQkvLyB3ZSBzaG91bGQgcHJvYmFibHkgdXNlICNnZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKFN0cmluZykKLQlSZWFkT25seU92ZXJyaWRlIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+c3BlY2lmaWVkPC9lbT4gb3ZlcnJpZGVzLiBUaGUgY29udGFpbmVyIGhhcyBubyBBUEkgZm9yCi0JICogYWRkaW5nIG9yIHJlbW92aW5nIDxlbT5zcGVjaWZpZWQ8L2VtPiBvdmVycmlkZXMuIFRoZSBjb250YWluZXIncwotCSAqIDxlbT52aXJ0dWFsPC9lbT4gb3ZlcnJpZGVzIGFyZSBidWlsdCBhY2NvcmRpbmcgdG8gdGhlIGxpc3Qgb2Ygb3ZlcnJpZGFibGUKLQkgKiBhdHRyaWJ1dGUgbmFtZXMgcmV0dXJuZWQgYnkgdGhlIGNvbnRhaW5lcidzIHBhcmVudC4gPGVtPlNwZWNpZmllZDwvZW0+Ci0JICogb3ZlcnJpZGVzIGNhbiBiZSBjcmVhdGVkIHZpYSB7QGxpbmsgVmlydHVhbE92ZXJyaWRlI2NvbnZlcnRUb1NwZWNpZmllZCgpfS4KLQkgKiA8ZW0+U3BlY2lmaWVkPC9lbT4gb3ZlcnJpZGVzIGNhbiBiZSByZW12b2VkIHZpYQotCSAqIHtAbGluayBPdmVycmlkZV8jY29udmVydFRvVmlydHVhbCgpfS4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIE92ZXJyaWRlXz4gZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfT1ZFUlJJREVTX0xJU1QgPSAic3BlY2lmaWVkT3ZlcnJpZGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgPGVtPnNwZWNpZmllZDwvZW0+IG92ZXJyaWRlcy4KLQkgKi8KLQlpbnQgZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+c3BlY2lmaWVkPC9lbT4gb3ZlcnJpZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlPdmVycmlkZV8gZ2V0U3BlY2lmaWVkT3ZlcnJpZGUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIE1vdmUgdGhlIDxlbT5zcGVjaWZpZWQ8L2VtPiBvdmVycmlkZSBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZE92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPnNwZWNpZmllZDwvZW0+IG92ZXJyaWRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JT3ZlcnJpZGVfIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIDxlbT5zcGVjaWZpZWQ8L2VtPiBvdmVycmlkZSB0byA8ZW0+dmlydHVhbDwvZW0+LgotCSAqIFJldHVybiB0aGUgbmV3IG92ZXJyaWRlLgotCSAqLwotCVZpcnR1YWxPdmVycmlkZSBjb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwoT3ZlcnJpZGVfIHNwZWNpZmllZE92ZXJyaWRlKTsKLQotCi0JLy8gKioqKioqKioqKiB2aXJ0dWFsIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIDxlbT52aXJ0dWFsPC9lbT4gb3ZlcnJpZGVzIChpLmUuIHRob3NlIG5vdCA8ZW0+c3BlY2lmaWVkPC9lbT4pLgotCSAqLwotCS8vIFRPRE8gY2hhbmdlIHRvIGEgSXRlcmFibGUgaW5zdGVhZCBvZiBMaXN0SXRlcmFibGU/Ci0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBWaXJ0dWFsT3ZlcnJpZGU+IGdldFZpcnR1YWxPdmVycmlkZXMoKTsKLQkJU3RyaW5nIFZJUlRVQUxfT1ZFUlJJREVTX0xJU1QgPSAidmlydHVhbE92ZXJyaWRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIDxlbT52aXJ0dWFsPC9lbT4gb3ZlcnJpZGVzLgotCSAqLwotCWludCBnZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIDxlbT52aXJ0dWFsPC9lbT4gb3ZlcnJpZGUgdG8gPGVtPnNwZWNpZmllZDwvZW0+LgotCSAqIFJldHVybiB0aGUgbmV3IG92ZXJyaWRlLgotCSAqLwotCU92ZXJyaWRlXyBjb252ZXJ0T3ZlcnJpZGVUb1NwZWNpZmllZChWaXJ0dWFsT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlKTsKLQotCi0JLy8gKioqKioqKioqKiBjb250YWluZXIgb3duZXIgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIE93bmVyCi0JewotCQkvKioKLQkJICogQHNlZSBPdmVycmlkZUNvbnRhaW5lciNnZXRUeXBlTWFwcGluZygpCi0JCSAqLwotCQlUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBAc2VlIE92ZXJyaWRlQ29udGFpbmVyI2dldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKQotCQkgKi8KLQkJVHlwZU1hcHBpbmcgZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBAc2VlIE92ZXJyaWRlQ29udGFpbmVyI2dldEFsbE92ZXJyaWRhYmxlTmFtZXMoKQotCQkgKi8KLQkJSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgT3ZlcnJpZGVDb250YWluZXIjZ2V0RGVmYXVsdFRhYmxlTmFtZSgpCi0JCSAqLwotCQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCi0JCS8qKgotCQkgKiBAc2VlIE92ZXJyaWRlQ29udGFpbmVyI3RhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcpCi0JCSAqLwotCQlib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKTsKLQotCQkvKioKLQkJICogQHNlZSBPdmVycmlkZUNvbnRhaW5lciNyZXNvbHZlRGJUYWJsZShTdHJpbmcpCi0JCSAqLwotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpOwotCi0JCS8qKgotCQkgKiBAc2VlIE92ZXJyaWRlQ29udGFpbmVyI2dldENhbmRpZGF0ZVRhYmxlTmFtZXMoKQotCQkgKi8KLQkJSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0KLQkJSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLQotCQlKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIGNvbHVtbk93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L092ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L092ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZDY4MDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE92ZXJyaWRlUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBSZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwLAotCQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotewotCXZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAgdmlydHVhbFJlbGF0aW9uc2hpcCk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwIHZpcnR1YWxSZWxhdGlvbnNoaXApOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgdmlydHVhbFJlbGF0aW9uc2hpcCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L092ZXJyaWRlXy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9PdmVycmlkZV8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhZWFiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L092ZXJyaWRlXy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiA8ZW0+U3BlY2lmaWVkPC9lbT48dWw+Ci0gKiA8bGk+YXR0cmlidXRlIG92ZXJyaWRlCi0gKiA8bGk+YXNzb2NpYXRpb24gb3ZlcnJpZGUKLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLS8vIHRoZSBjbGFzcyBuYW1lICJPdmVycmlkZSIgaXMgc29ydGEgdGFrZW46IGphdmEubGFuZy5PdmVycmlkZQotLy8gbWF5YmUgaWYgaXQgd2VyZW4ndCBpbiB0aGUgamF2YS5sYW5nIHBhY2thZ2Ugd2Ugd291bGQgdGFrZSBpdCBvbiwgYnV0Li4uIDopCi0vLyB2ZXJ5IGxpdHRsZSBjb2RlIHdpbGwgZGlyZWN0bHkgcmVmZXIgdG8gdGhpcyBpbnRlcmZhY2UsIHNvIHRoZSB1bmRlcnNjb3JlCi0vLyBpc24ndCAqdG9vKiBldmlsLi4uCi1wdWJsaWMgaW50ZXJmYWNlIE92ZXJyaWRlXwotCWV4dGVuZHMgUmVhZE9ubHlPdmVycmlkZQotewotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgPGVtPnNwZWNpZmllZDwvZW0+IG92ZXJyaWRlIHRvIGEgPGVtPnZpcnR1YWw8L2VtPiBvdmVycmlkZS4KLQkgKiBSZXR1cm4gdGhlIG5ldyA8ZW0+dmlydHVhbDwvZW0+IG92ZXJyaWRlLgotCSAqIEBzZWUgI2lzVmlydHVhbCgpCi0JICovCi0JVmlydHVhbE92ZXJyaWRlIGNvbnZlcnRUb1ZpcnR1YWwoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMGFhMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIENvbnRleHQgcGVyc2lzdGVudCA8ZW0+YXR0cmlidXRlPC9lbT4gKGZpZWxkIG9yIHByb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRBdHRyaWJ1dGUKLQlleHRlbmRzIFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgQWNjZXNzSG9sZGVyCi17Ci0JLyoqCi0JICogU2V0IHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nLgotCSAqIElmIHRoZSBzcGVjaWZpZWQga2V5IGlzIDxjb2RlPm51bGw8L2NvZGU+LCBjbGVhciB0aGUgc3BlY2lmaWVkIG1hcHBpbmcsCi0JICogYWxsb3dpbmcgdGhlIGF0dHJpYnV0ZSdzIG1hcHBpbmcgdG8gZGVmYXVsdCAoaWYgYXBwcm9wcmlhdGUpLgotCSAqIFJldHVybiB0aGUgbmV3IG1hcHBpbmcgKHdoaWNoIG1heSBiZSBhIDxlbT5udWxsPC9lbT4gbWFwcGluZykuCi0JICovCi0JQXR0cmlidXRlTWFwcGluZyBzZXRNYXBwaW5nS2V5KFN0cmluZyBrZXkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTViNDBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBDb250ZXh0IHBlcnNpc3RlbnQgdHlwZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRUeXBlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZSwgQWNjZXNzSG9sZGVyCi17Ci0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgW2Z1bGx5LXF1YWxpZmllZF0gbmFtZS4KLQkgKiBUaGUgZW5jbG9zaW5nIHR5cGUgc2VwYXJhdG9yIGlzIDxjb2RlPicuJzwvY29kZT4sCi0JICogYXMgb3Bwb3NlZCB0byA8Y29kZT4nJCc8L2NvZGU+LgotCSAqIEBzZWUgI2dldFNpbXBsZU5hbWUoKQotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSdzIHNpbXBsZSBuYW1lLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqLwotCVN0cmluZyBnZXRTaW1wbGVOYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSdzIG1hcHBpbmcuCi0JICogU2V0IHRoZSBtYXBwaW5nIHZpYSB7QGxpbmsgI3NldE1hcHBpbmdLZXkoU3RyaW5nKX0uCi0JICovCi0JVHlwZU1hcHBpbmcgZ2V0TWFwcGluZygpOwotCQlTdHJpbmcgTUFQUElOR19QUk9QRVJUWSA9ICJtYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldE1hcHBpbmdLZXkoKTsKLQotCXZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KTsKLQotCWJvb2xlYW4gaXNNYXBwZWQoKTsKLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgcGVyc2lzdGVudCBhdHRyaWJ1dGVzLgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIHBlcnNpc3RlbnQgdHlwZSdzIHBlcnNpc3RlbnQgYXR0cmlidXRlcy4KLQkgKi8KLQlpbnQgZ2V0QXR0cmlidXRlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHBlcnNpc3RlbnQgdHlwZSdzIHBlcnNpc3RlbnQgYXR0cmlidXRlcy4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEF0dHJpYnV0ZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZXMgaW4gdGhlIHBlcnNpc3RlbnQgdHlwZSdzCi0JICogaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCUl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0QWxsQXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlcyBpbiB0aGUKLQkgKiBwZXJzaXN0ZW50IHR5cGUncyBoaWVyYXJjaHkuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxBdHRyaWJ1dGVOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwKLQkgKiBpZiBpdCBleGlzdHMgbG9jYWxseSBvbiB0aGUgcGVyc2lzdGVudCB0eXBlIChhcyBvcHBvc2VkIHRvIGluIGl0cwotCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeSkuCi0JICovCi0JUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotCS8qKgotCSAqIFJlc29sdmUgYW5kIHJldHVybiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIGlmIGl0Ci0JICogaXMgZGlzdGluY3QgYW5kIGV4aXN0cyB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBlcnNpc3RlbnQgdHlwZS4KLQkgKi8KLQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZUF0dHJpYnV0ZShTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogaW5oZXJpdGFuY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAic3VwZXIiIHtAbGluayBQZXJzaXN0ZW50VHlwZX0gZnJvbSB0aGUgInBlcnNpc3RlbmNlIgotCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKiBJZiB0aGUgSmF2YSBpbmhlcml0YW5jZSBwYXJlbnQgaXMgbm90IGEge0BsaW5rIFBlcnNpc3RlbnRUeXBlfSwgdGhlbiBjb250aW51ZQotCSAqIHVwIHRoZSBoaWVyYXJjaHkgKHRoZSBKUEEgc3BlYyBhbGxvd3Mgbm9uLXBlcnNpc3RlbnQgdHlwZXMgdG8gYmUgcGFydCBvZiB0aGUgaGllcmFyY2h5LikKLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBlcnNpc3RlbnQgdHlwZSBpcyB0aGUgcm9vdCBwZXJzaXN0ZW50IHR5cGUuCi0JICogPHA+Ci0JICogRXhhbXBsZToKLQkgKiA8cHJlPgotCSAqICYjNjQ7RW50aXR5Ci0JICogcHVibGljIGFic3RyYWN0IGNsYXNzIE1vZGVsIHt9Ci0JICogCi0JICogcHVibGljIGFic3RyYWN0IGNsYXNzIEFuaW1hbCBleHRlbmRzIE1vZGVsIHt9Ci0JICogCi0JICogJiM2NDtFbnRpdHkKLQkgKiBwdWJsaWMgY2xhc3MgQ2F0IGV4dGVuZHMgQW5pbWFsIHt9Ci0JICogPC9wcmU+Ci0JICogVGhlICJzdXBlciIgcGVyc2lzdGVudCB0eXBlIG9mIHRoZSA8Y29kZT5DYXQ8L2NvZGU+IHBlcnNpc3RlbnQgdHlwZSBpcwotCSAqIHRoZSA8Y29kZT5Nb2RlbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlLiBUaGUgInN1cGVyIiBwZXJzaXN0ZW50IHR5cGUgY2FuCi0JICogYmUgZWl0aGVyIGEgSmF2YSBhbm5vdGF0ZWQgY2xhc3Mgb3IgZGVjbGFyZWQgaW4gdGhlIFhNTCBmaWxlcy4KLQkgKi8KLQlQZXJzaXN0ZW50VHlwZSBnZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7Ci0JCVN0cmluZyBTVVBFUl9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkgPSAic3VwZXJQZXJzaXN0ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgInBlcnNpc3RlbmNlIiBpbmhlcml0YW5jZSBoaWVyYXJjaHksCi0JICogPGVtPmluY2x1ZGluZzwvZW0+IHRoZSBwZXJzaXN0ZW50IHR5cGUgaXRzZWxmLgotCSAqIFRoZSByZXR1cm5lZCBpdGVyYXRvciB3aWxsIHJldHVybiBlbGVtZW50cyBpbmZpbml0ZWx5IGlmIHRoZSBoaWVyYXJjaHkKLQkgKiBoYXMgYSBsb29wLgotCSAqLwotCUl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBnZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW50IHR5cGUncyAicGVyc2lzdGVuY2UiIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwKLQkgKiA8ZW0+ZXhjbHVkaW5nPC9lbT4gdGhlIHBlcnNpc3RlbnQgdHlwZSBpdHNlbGYuCi0JICogVGhlIHJldHVybmVkIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGVsZW1lbnRzIGluZmluaXRlbHkgaWYgdGhlIGhpZXJhcmNoeQotCSAqIGhhcyBhIGxvb3AuCi0JICovCi0JSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+IGdldEFuY2VzdG9ycygpOwotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIHRvIHRoZSBsaXN0IG9mIGN1cnJlbnQgdmFsaWRhdGlvbiBtZXNzYWdlcwotCSAqLwotCXZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRleHQgcmFuZ2UgdG8gYmUgdXNlZCB3aXRoIGFueSB2YWxpZGF0aW9uIG1lc3NhZ2VzIHJlbGF0ZWQKLQkgKiB0byB0aGUgcGVyc2lzdGVudCB0eXBlLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGVyc2lzdGVudCB0eXBlIGFwcGxpZXMgdG8gdGhlCi0JICogc3BlY2lmaWVkIHR5cGUgbmFtZSBxdWFsaWZpZWQgd2l0aCA8Y29kZT4nLic8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gaXNGb3IoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwZXJzaXN0ZW50IHR5cGUgcmVzb2x2ZXMgdG8gYSBKYXZhIGNsYXNzIGluIHRoZQotCSAqIHNwZWNpZmllZCBwYWNrYWdlIGZyYWdtZW50LgotCSAqLwotCWJvb2xlYW4gaXNJbihJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSB0aGUgcGVyc2lzdGVudCB0eXBlIG92ZXJyaWRlcy4KLQkgKiBUeXBpY2FsbHkgdGhpcyBpcyB0aGUgSmF2YSBwZXJzaXN0ZW50IHR5cGUgb3ZlcnJpZGRlbiBieSBhCi0JICogbm9uLW1ldGFkYXRhLWNvbXBsZXRlIDxjb2RlPm9ybS54bWw8L2NvZGU+IHBlcnNpc3RlbnQgdHlwZS4KLQkgKi8KLQlQZXJzaXN0ZW50VHlwZSBnZXRPdmVycmlkZGVuUGVyc2lzdGVudFR5cGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjY2VzcyB0eXBlIHRoYXQgb3ZlcnJpZGVzIHRoZSBjbGllbnQgcGVyc2lzdGVudCB0eXBlJ3MKLQkgKiBhY2Nlc3MgdHlwZTsgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBhY2Nlc3Mgb3ZlcnJpZGUuCi0JICovCi0JQWNjZXNzVHlwZSBnZXRPd25lck92ZXJyaWRlQWNjZXNzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNsaWVudCBwZXJzaXN0ZW50IHR5cGUncyBkZWZhdWx0IGFjY2VzcyB0eXBlOwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggYWNjZXNzIGRlZmF1bHQuCi0JICovCi0JQWNjZXNzVHlwZSBnZXRPd25lckRlZmF1bHRBY2Nlc3MoKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLQl7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFjY2VzcyB0eXBlIHRoYXQgb3ZlcnJpZGVzIHRoZSBjbGllbnQgcGVyc2lzdGVudCB0eXBlJ3MKLQkJICogYWNjZXNzIHR5cGU7IDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggYWNjZXNzIG92ZXJyaWRlLgotCQkgKi8KLQkJQWNjZXNzVHlwZSBnZXRPdmVycmlkZVBlcnNpc3RlbnRUeXBlQWNjZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgY2xpZW50IHBlcnNpc3RlbnQgdHlwZSdzIGRlZmF1bHQgYWNjZXNzIHR5cGU7Ci0JCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggYWNjZXNzIGRlZmF1bHQuCi0JCSAqLwotCQlBY2Nlc3NUeXBlIGdldERlZmF1bHRQZXJzaXN0ZW50VHlwZUFjY2VzcygpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTczYzI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uCi0JZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbiwgUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbgotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZiZWRlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogUHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVsYXRpb25zaGlwPHVsPgotICogPGxpPjE6MQotICogPC91bD4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXAKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIChuZXZlciA8Y29kZT5udWxsPC9jb2RlPikgc3RyYXRlZ3kgdXNlZCB0byBjb25maWd1cmUKLQkgKiB0aGUgcmVsYXRpb25zaGlwJ3MgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gc3RyYXRlZ3kuCi0JICovCi0JUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gc3RyYXRlZ3kgaXMgdGhlCi0JICogcmVsYXRpb25zaGlwJ3MgY3VycmVudCBzdHJhdGVneS4KLQkgKi8KLQlib29sZWFuIHN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCi0JLyoqCi0JICogU2V0IHRoZSByZWxhdGlvbnNoaXAncyBzdHJhdGVneSB0byB0aGUgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gc3RyYXRlZ3kuCi0JICovCi0Jdm9pZCBzZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNDUwZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBQcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQkvKioKLQkgKiBDaGFuZ2Ugbm90aWZpY2F0aW9uIGlkZW50aWZpZXIgZm9yICJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiIGxpc3QKLQkgKi8KLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QgPSAicHJpbWFyeUtleUpvaW5Db2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyYXRlZ3kncyBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLgotCSAqLwotCWludCBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHJlbGF0aW9uc2hpcCBoYXMgYW55IHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4KLQkgKiAoRXF1aXZhbGVudCB0byB7QGxpbmsgI2dldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKX0gPT0gMC4pCi0JICovCi0JYm9vbGVhbiBoYXNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIEFkZCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLgotCSAqLwotCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCi0JLyoqCi0JICogQWRkIGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4uCi0JICovCi0JUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbi4KLQkgKi8KLQl2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4uCi0JICovCi0Jdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4uCi0JICovCi0Jdm9pZCBtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9RdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9RdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2Q2ODcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBOYW1lZCBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCi0gKiA8cD4KLSAqIFF1ZXJpZXMgY2FuIGJlIGRlZmluZWQgb248dWw+Ci0gKiA8bGk+SmF2YSBhbmQgPGNvZGU+b3JtLnhtbDwvY29kZT4gZW50aXRpZXMKLSAqIDxsaT5KYXZhICg8ZW0+b25seTwvZW0+KSBtYXBwZWQgc3VwZXJjbGFzc2VzCi0gKiA8bGk+PGNvZGU+b3JtLnhtbDwvY29kZT4gZW50aXR5IG1hcHBpbmdzIGVsZW1lbnRzCi0gKiA8L3VsPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnkKLQlleHRlbmRzIEpwYU5hbWVkQ29udGV4dE5vZGUKLXsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZ2VuZXJhdG9yJ3MgdHlwZS4KLQkgKi8KLQlDbGFzczw/IGV4dGVuZHMgUXVlcnk+IGdldFR5cGUoKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUl0ZXJhYmxlPENsYXNzPD8gZXh0ZW5kcyBRdWVyeT4+IFRZUEVTID0gbmV3IEFycmF5SXRlcmFibGU8Q2xhc3M8PyBleHRlbmRzIFF1ZXJ5Pj4oCi0JCQlOYW1lZFF1ZXJ5LmNsYXNzLAotCQkJTmFtZWROYXRpdmVRdWVyeS5jbGFzcwotCQkpOwotCi0JLy8gKioqKioqKioqKiBxdWVyeSAqKioqKioqKioqCi0KLQlTdHJpbmcgUVVFUllfUFJPUEVSVFkgPSAicXVlcnkiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0UXVlcnkoKTsKLQotCXZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KTsKLQotCi0JLy8gKioqKioqKioqKiBoaW50cyAqKioqKioqKioqCi0KLQlTdHJpbmcgSElOVFNfTElTVCA9ICJoaW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcXVlcnkncyBoaW50cy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFF1ZXJ5SGludD4gZ2V0SGludHMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGhpbnRzLgotCSAqLwotCWludCBnZXRIaW50c1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIGhpbnQgdG8gdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JUXVlcnlIaW50IGFkZEhpbnQoKTsKLQotCS8qKgotCSAqIEFkZCBhIGhpbnQgdG8gdGhlIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIG9iamVjdCByZXByZXNlbnRpbmcgaXQuCi0JICovCi0JUXVlcnlIaW50IGFkZEhpbnQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgaGludCBhdCB0aGUgaW5kZXggZnJvbSB0aGUgcXVlcnkuCi0JICovCi0Jdm9pZCByZW1vdmVIaW50KFF1ZXJ5SGludCBxdWVyeUhpbnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBoaW50IGZyb20gdGhlIHF1ZXJ5LgotCSAqLwotCXZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgaGludCBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkKLQlib29sZWFuIGlzSWRlbnRpY2FsKFF1ZXJ5IHF1ZXJ5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUXVlcnlDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUXVlcnlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkNDFlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1F1ZXJ5Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvbnRhaW5lciBmb3IgbmFtZWQgcXVlcmllcyBhbmQvb3IgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCi0gKiBVc2VkIGJ5IGVudGl0aWVzIGFuZCB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4KLSAqIDwvY29kZT5lbnRpdHktbWFwcGluZ3M8L2NvZGU+IGVsZW1lbnQuIAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlDb250YWluZXIKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjb250YWluZXIncyBuYW1lZCBhbmQgbmFtZWQgbmF0aXZlIHF1ZXJpZXMuCi0JICovCi0JSXRlcmFibGU8UXVlcnk+IGdldFF1ZXJpZXMoKTsKLQotCi0JLy8gKioqKioqKioqKiBuYW1lZCBxdWVyaWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3MgbmFtZWQgcXVlcmllcy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIE5hbWVkUXVlcnk+IGdldE5hbWVkUXVlcmllcygpOwotCi0JU3RyaW5nIE5BTUVEX1FVRVJJRVNfTElTVCA9ICJuYW1lZFF1ZXJpZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBuYW1lZCBxdWVyaWVzLgotCSAqLwotCWludCBnZXROYW1lZFF1ZXJpZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBuZXcgbmFtZWQgcXVlcnkgdG8gdGhlIGNvbnRhaW5lciBhbmQgcmV0dXJuIGl0LgotCSAqLwotCU5hbWVkUXVlcnkgYWRkTmFtZWRRdWVyeSgpOwotCi0JLyoqCi0JICogQWRkIGEgbmV3IG5hbWVkIHF1ZXJ5IHRvIHRoZSBjb250YWluZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCByZXR1cm4gaXQuCi0JICovCi0JTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgY29udGFpbmVyIHRoZSBuYW1lZCBxdWVyeSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXZvaWQgcmVtb3ZlTmFtZWRRdWVyeShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbmFtZWQgcXVlcnkgZnJvbSB0aGUgY29udGFpbmVyLgotCSAqLwotCXZvaWQgcmVtb3ZlTmFtZWRRdWVyeShOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkpOwotCi0JLyoqCi0JICogTW92ZSBhIG5hbWVkIHF1ZXJ5IGFzIHNwZWNpZmllZC4KLQkgKi8KLQl2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBuYW1lZCBuYXRpdmUgcXVlcmllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgTmFtZWROYXRpdmVRdWVyeT4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0KLQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJJRVNfTElTVCA9ICJuYW1lZE5hdGl2ZVF1ZXJpZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBuYW1lZCBuYXRpdmUgcXVlcmllcy4KLQkgKi8KLQlpbnQgZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpOwotCi0JLyoqCi0JICogQWRkIGEgbmV3IG5hbWVkIG5hdGl2ZSBxdWVyeSB0byB0aGUgY29udGFpbmVyIGFuZCByZXR1cm4gaXQuCi0JICovCi0JTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBuZXcgbmFtZWQgbmF0aXZlIHF1ZXJ5IHRvIHRoZSBjb250YWluZXIgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqIGFuZCByZXR1cm4gaXQuCi0JICovCi0JTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgZnJvbSB0aGUgY29udGFpbmVyIHRoZSBuYW1lZCBuYXRpdmUgcXVlcnkgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQl2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG5hbWVkIG5hdGl2ZSBxdWVyeSBmcm9tIHRoZSBjb250YWluZXIuCi0JICovCi0Jdm9pZCByZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSk7Ci0KLQkvKioKLQkgKiBNb3ZlIGEgbmFtZWQgbmF0aXZlIHF1ZXJ5IGFzIHNwZWNpZmllZC4KLQkgKi8KLQl2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9RdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUXVlcnlIaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZWVlOWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9RdWVyeUhpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogcXVlcnkgaGludAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUXVlcnlIaW50Ci0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCVN0cmluZyBnZXROYW1lKCk7Ci0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBnZXRWYWx1ZSgpOwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUFjY2Vzc0hvbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUFjY2Vzc0hvbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY1Zjc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlBY2Nlc3NIb2xkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogQ29tbW9uIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgaW50ZXJlc3RlZCBvbmx5IGluIGEgdHlwZQotICogb3IgYXR0cmlidXRlJ3MgYWNjZXNzIHNldHRpbmcgKGUuZy4gYSBVSSBjb21wb3NpdGUpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlBY2Nlc3NIb2xkZXIKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3MgdHlwZSwgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLgotCSAqIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBzaW5jZSBhdCBsZWFzdCB0aGUgZGVmYXVsdAotCSAqIHdpbGwgYmUgc2V0LgotCSAqLwotCUFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5MDY1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBSZWFkLW9ubHkgYXNzb2NpYXRpb24gb3ZlcnJpZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBSZWFkT25seU92ZXJyaWRlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBvdmVycmlkZGVuIHJlbGF0aW9uc2hpcCBtYXBwaW5nLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBleGlzdC4gVGhpcyByZWxhdGlvbnNoaXAgbWFwcGluZwotCSAqIHdpbGwgYmUgZm91bmQgaW4gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIG9yIGVtYmVkZGFibGUgdHlwZSwgbm90IGluIHRoZQotCSAqIG93bmluZyBlbnRpdHkKLQkgKi8KLQlSZWxhdGlvbnNoaXBNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQotCVJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2UwMDc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBSZWFkLW9ubHkgYXR0cmlidXRlIG92ZXJyaWRlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlCi0JZXh0ZW5kcyBSZWFkT25seU92ZXJyaWRlCi17Ci0JUmVhZE9ubHlDb2x1bW4gZ2V0Q29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5QmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUJhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI1NDA4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5QmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0KLS8qKgotICogUmVhZC1vbmx5Ci0gKiA8dWw+Ci0gKiA8bGk+Y29sdW1uCi0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seUJhc2VDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5VGFibGVDb2x1bW4KLXsKLQotCS8vICoqKioqKioqKiogdW5pcXVlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHVuaXF1ZSBzZXR0aW5nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICogZGVmYXVsdCB1bmlxdWUgc2V0dGluZy4KLQkgKi8KLQlib29sZWFuIGlzVW5pcXVlKCk7Ci0JQm9vbGVhbiBnZXRTcGVjaWZpZWRVbmlxdWUoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVW5pcXVlIjsgLy8kTk9OLU5MUy0xJAotCWJvb2xlYW4gaXNEZWZhdWx0VW5pcXVlKCk7Ci0JCVN0cmluZyBERUZBVUxUX1VOSVFVRV9QUk9QRVJUWSA9ICJkZWZhdWx0VW5pcXVlIjsgLy8kTk9OLU5MUy0xJAotCWJvb2xlYW4gREVGQVVMVF9VTklRVUUgPSBmYWxzZTsKLQotCi0JLy8gKioqKioqKioqKiBudWxsYWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBudWxsYWJsZSBzZXR0aW5nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICogZGVmYXVsdCBudWxsYWJsZSBzZXR0aW5nLgotCSAqLwotCWJvb2xlYW4gaXNOdWxsYWJsZSgpOwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROdWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlib29sZWFuIGlzRGVmYXVsdE51bGxhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX05VTExBQkxFX1BST1BFUlRZID0gImRlZmF1bHROdWxsYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlib29sZWFuIERFRkFVTFRfTlVMTEFCTEUgPSB0cnVlOwotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgaW5zZXJ0YWJsZSBzZXR0aW5nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICogZGVmYXVsdCBpbnNlcnRhYmxlIHNldHRpbmcuCi0JICovCi0JYm9vbGVhbiBpc0luc2VydGFibGUoKTsKLQlCb29sZWFuIGdldFNwZWNpZmllZEluc2VydGFibGUoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZEluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0JYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX0lOU0VSVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdEluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0JYm9vbGVhbiBERUZBVUxUX0lOU0VSVEFCTEUgPSB0cnVlOwotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0YWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCB1cGRhdGFibGUgc2V0dGluZyBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZQotCSAqIGRlZmF1bHQgdXBkYXRhYmxlIHNldHRpbmcuCi0JICovCi0JYm9vbGVhbiBpc1VwZGF0YWJsZSgpOwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZFVwZGF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpOwotCQlTdHJpbmcgREVGQVVMVF9VUERBVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdFVwZGF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlib29sZWFuIERFRkFVTFRfVVBEQVRBQkxFID0gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUJhc2VKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZTBhOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUJhc2VKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBSZWFkLW9ubHkKLSAqIDx1bD4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbgotCWV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbgotewotCS8vICoqKioqKioqKiogcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGlmIHByZXNlbnQsCi0JICogb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lLgotCSAqLwotCVN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCVN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlTdHJpbmcgREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gImRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdyYXBwZXIgZm9yIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBkYXRhc291cmNlIHRhYmxlCi0JICovCi0JVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQotCWJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbklzUmVzb2x2ZWQoKTsKLQotCS8vIFRPRE8gYmp2IHJlbmFtZT8KLQlib29sZWFuIGlzVmlydHVhbCgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKS4KLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSB3cmFwcGVyIGZvciB0aGUgZGF0YXNvdXJjZSB0YWJsZSBmb3IgdGhlIHJlZmVyZW5jZWQgY29sdW1uCi0JCSAqLwotCQlUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCi0JCWJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGpvaW4gY29sdW1ucyBpbiB0aGUgb3duZXIncyBsaXN0IHRoZSBqb2luCi0JCSAqIGNvbHVtbiBiZWxvbmdzIHRvLgotCQkgKi8KLQkJaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVhNjBlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5Q29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFJlYWQtb25seSBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5QmFzZUNvbHVtbgotewotCS8vICoqKioqKioqKiogbGVuZ3RoICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGxlbmd0aCBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0IGxlbmd0aC4KLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0JSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFkgPSAic3BlY2lmaWVkTGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAotCWludCBnZXREZWZhdWx0TGVuZ3RoKCk7Ci0JCVN0cmluZyBERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSA9ICJkZWZhdWx0TGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAotCWludCBERUZBVUxUX0xFTkdUSCA9IDI1NTsKLQkJCi0KLQkvLyAqKioqKioqKioqIHByZWNpc2lvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdCBwcmVjaXNpb24uCi0JICovCi0JaW50IGdldFByZWNpc2lvbigpOwotCUludGVnZXIgZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZID0gInNwZWNpZmllZFByZWNpc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlpbnQgZ2V0RGVmYXVsdFByZWNpc2lvbigpOwotCQlTdHJpbmcgREVGQVVMVF9QUkVDSVNJT05fUFJPUEVSVFkgPSAiZGVmYXVsdFByZWNpc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlpbnQgREVGQVVMVF9QUkVDSVNJT04gPSAwOwotCi0JCi0JLy8gKioqKioqKioqKiBzY2FsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzY2FsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0IHNjYWxlLgotCSAqLwotCWludCBnZXRTY2FsZSgpOwotCUludGVnZXIgZ2V0U3BlY2lmaWVkU2NhbGUoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTY2FsZSI7IC8vJE5PTi1OTFMtMSQKLQlpbnQgZ2V0RGVmYXVsdFNjYWxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDQUxFX1BST1BFUlRZID0gImRlZmF1bHRTY2FsZSI7IC8vJE5PTi1OTFMtMSQKLQlpbnQgREVGQVVMVF9TQ0FMRSA9IDA7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAzZGJkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBSZWFkLW9ubHkgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlKb2luQ29sdW1uCi0JZXh0ZW5kcyBSZWFkT25seUJhc2VKb2luQ29sdW1uLCBSZWFkT25seUJhc2VDb2x1bW4KLXsKLQkvKioKLQkgKiBJbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKS4KLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyLCBSZWFkT25seUJhc2VDb2x1bW4uT3duZXIKLQl7Ci0JCS8qKgotCQkgKiBUaGUgdGFyZ2V0IG9mIHRoZSByZWxhdGlvbnNoaXAgd2lsbCB1c3VhbGx5IGJlIHRoZSB0YXJnZXQgZW50aXR5LgotCQkgKiBJbiB0aGUgY2FzZSBvZiBhIHRhcmdldCBmb3JlaWduIGtleSByZWxhdGlvbnNoaXAgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0Ci0JCSAqIGFyZSBzd2FwcGVkLgotCQkgKi8KLQkJRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCi0JCS8qKgotCQkgKiByZXR1cm4gdGhlIGpvaW4gY29sdW1uJ3MgYXR0cmlidXRlIG5hbWUKLQkJICovCi0JCVN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZTIzNjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBKb2luIGNvbHVtbiByZWxhdGlvbnNoaXA8dWw+Ci0gKiA8bGk+MToxCi0gKiA8bGk+MTptCi0gKiA8bGk+bToxCi0gKiA8bGk+YXNzb2NpYXRpb24gb3ZlcnJpZGUKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgUmVsYXRpb25zaGlwCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLQlleHRlbmRzIFJlYWRPbmx5UmVsYXRpb25zaGlwCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSAobmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4pIHN0cmF0ZWd5IHVzZWQgdG8gY29uZmlndXJlCi0JICogdGhlIHJlbGF0aW9uc2hpcCdzIGpvaW4gY29sdW1uIHN0cmF0ZWd5LgotCSAqLwotCVJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGpvaW4gY29sdW1uIHN0cmF0ZWd5IGlzIHRoZQotCSAqIHJlbGF0aW9uc2hpcCdzIGN1cnJlbnQgc3RyYXRlZ3kuCi0JICovCi0JYm9vbGVhbiBzdHJhdGVneUlzSm9pbkNvbHVtbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyByZWxhdGlvbnNoaXAgbWF5IHBvdGVudGlhbGx5IGhhdmUgYSBkZWZhdWx0IGpvaW4KLQkgKiBjb2x1bW4uIEZvciBleGFtcGxlLCBhIDEtMSBtYXBwaW5nIG1heSBoYXZlIGEgZGVmYXVsdCBqb2luIGNvbHVtbgotCSAqIGlmIGl0IGRvZXMgbm90IHNwZWNpZnkgYSAibWFwcGVkIGJ5IiBhdHRyaWJ1dGUgb3IgYSBqb2luIHRhYmxlOwotCSAqIGJ1dCBhIDEtTSBtYXBwaW5nIGRvZXMgbm90IHN1cHBvcnQgYSBkZWZhdWx0IGpvaW4gY29sdW1uIGluIGFueQotCSAqIHNpdHVhdGlvbi4KLQkgKi8KLQlib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjllMWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotCi0vKioKLSAqIFJlYWQtb25seSBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEBzZWUgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiBAc2VlIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCS8qKgotCSAqIFRoZSBzb3VyY2Ugb2YgdGhlIHJlbGF0aW9uc2hpcCBpcyB1c3VhbGx5IHRoZSBvd25pbmcgdHlwZSBtYXBwaW5nLgotCSAqIEluIHRoZSBjYXNlIG9mIGEgdGFyZ2V0IGZvcmVpZ24ga2V5IHJlbGF0aW9uc2hpcCB0aGUgc291cmNlIGFuZCB0YXJnZXQKLQkgKiBhcmUgc3dhcHBlZC4KLQkgKiBAc2VlICNpc1RhcmdldEZvcmVpZ25LZXkoKQotCSAqLwotCVR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpOwotCi0JLyoqCi0JICogVGhlIHRhcmdldCBvZiB0aGUgcmVsYXRpb25zaGlwIHVzdWFsbHkgaXMgdGhlIHRhcmdldCBlbnRpdHkuCi0JICogSW4gdGhlIGNhc2Ugb2YgYSB0YXJnZXQgZm9yZWlnbiBrZXkgcmVsYXRpb25zaGlwIHRoZSBzb3VyY2UgYW5kIHRhcmdldAotCSAqIGFyZSBzd2FwcGVkLgotCSAqIEBzZWUgI2lzVGFyZ2V0Rm9yZWlnbktleSgpCi0JICovCi0JVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHJlbGF0aW9uc2hpcCBpcyBhIHRhcmdldCBmb3JlaWduIGtleSByZWxhdGlvbnNoaXAuCi0JICogQSBvbmUtdG8tbWFueSBtYXBwaW5nIHdpdGggYSBqb2luIGNvbHVtbiB3aWxsIGhhdmUgdGhlIGZvcmVpZ24ga2V5Ci0JICogaW4gdGhlIHRhcmdldCB0YWJsZS4KLQkgKi8KLQlib29sZWFuIGlzVGFyZ2V0Rm9yZWlnbktleSgpOwotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGpvaW4gY29sdW1ucyB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygam9pbiBjb2x1bW5zLCB3aGV0aGVyIHNwZWNpZmllZCBhbmQgZGVmYXVsdC4KLQkgKi8KLQlpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDaGFuZ2Ugbm90aWZpY2F0aW9uIGlkZW50aWZpZXIgZm9yICJzcGVjaWZpZWRKb2luQ29sdW1ucyIgbGlzdAotCSAqLwotCVN0cmluZyBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkSm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgotCSAqLwotCWludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzdHJhdGVneSBoYXMgYW55IHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICogKEVxdWl2YWxlbnQgdG8ge0BsaW5rICNnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKX0gIT0gMC4pCi0JICovCi0JYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlSZWFkT25seUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JLyoqCi0JICogQ2hhbmdlIG5vdGlmaWNhdGlvbiBpZGVudGlmaWVyIGZvciAiZGVmYXVsdEpvaW5Db2x1bW4iIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIERFRkFVTFRfSk9JTl9DT0xVTU5fUFJPUEVSVFkgPSAiZGVmYXVsdEpvaW5Db2x1bW4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgam9pbiBjb2x1bW4uIElmIHRoZXJlIGFyZSBzcGVjaWZpZWQgam9pbgotCSAqIGNvbHVtbnMsIHRoZXJlIGlzIG5vIGRlZmF1bHQgam9pbiBjb2x1bW4uIFRoZXJlIGFyZSBhbHNvCi0JICogdGltZXMgdGhhdCB0aGVyZSBtYXkgYmUgbm8gZGVmYXVsdCBqb2luIGNvbHVtbiBldmVuIGlmIHRoZXJlIGFyZSBubwotCSAqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICovCi0JUmVhZE9ubHlKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5Sm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5Sm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNTZmOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgYXNzb2NpYXRpb24gb3ZlcnJpZGVzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seUpvaW5UYWJsZQotCWV4dGVuZHMgUmVhZE9ubHlSZWZlcmVuY2VUYWJsZQotewotCVJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UGFyZW50KCk7Ci0KLQlSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQotCi0JLy8gKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGpvaW4gdGFibGUncyBpbnZlcnNlIGpvaW4gY29sdW1ucywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbnZlcnNlIGpvaW4gY29sdW1ucywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKi8KLQlpbnQgZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbnMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zLgotCSAqLwotCWludCBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgam9pbiB0YWJsZSBoYXMgc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zLgotCSAqLwotCWJvb2xlYW4gaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0JUmVhZE9ubHlKb2luQ29sdW1uIGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgaW52ZXJzZSBqb2luIGNvbHVtbiBvciBudWxsLiBBIGRlZmF1bHQgaW52ZXJzZSBqb2luIGNvbHVtbgotCSAqIG9ubHkgZXhpc3RzIGlmIHRoZXJlIGFyZSBubyBzcGVjaWZpZWQgaW52ZXJzZSBqb2luIGNvbHVtbnMuCi0JICovCi0JUmVhZE9ubHlKb2luQ29sdW1uIGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCQlTdHJpbmcgREVGQVVMVF9JTlZFUlNFX0pPSU5fQ09MVU1OID0gImRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUwOWYzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSm9pbiB0YWJsZSByZWxhdGlvbnNoaXA8dWw+Ci0gKiA8bGk+MToxIChKUEEgMi4wKQotICogPGxpPjE6bQotICogPGxpPm06MSAoSlBBIDIuMCkKLSAqIDxsaT5tOm0KLSAqIDxsaT5hc3NvY2lhdGlvbiBvdmVycmlkZSAoSlBBIDIuMCkKLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBSZWFkT25seVJlbGF0aW9uc2hpcAotewotCS8qKgotCSAqIFJldHVybiB0aGUgKG5ldmVyIDxjb2RlPm51bGw8L2NvZGU+KSBzdHJhdGVneSB1c2VkIHRvIGNvbmZpZ3VyZQotCSAqIHRoZSByZWxhdGlvbnNoaXAncyBqb2luIHRhYmxlIHN0cmF0ZWd5LgotCSAqLwotCVJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBqb2luIHRhYmxlIHN0cmF0ZWd5IGlzIHRoZQotCSAqIHJlbGF0aW9uc2hpcCdzIGN1cnJlbnQgc3RyYXRlZ3kuCi0JICovCi0JYm9vbGVhbiBzdHJhdGVneUlzSm9pblRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIHJlbGF0aW9uc2hpcCBtYXkgcG90ZW50aWFsbHkgaGF2ZSBhIGRlZmF1bHQgam9pbgotCSAqIHRhYmxlLiBGb3IgZXhhbXBsZSwgYSBNLU0gbWFwcGluZyBtYXkgaGF2ZSBhIGRlZmF1bHQgam9pbiB0YWJsZQotCSAqIGlmIGl0IGRvZXMgbm90IHNwZWNpZnkgYSAibWFwcGVkIGJ5IiBhdHRyaWJ1dGUgb3IgYSBqb2luIHRhYmxlOwotCSAqIGJ1dCBhIE0tMSBtYXBwaW5nIGRvZXMgbm90IHN1cHBvcnQgYSBkZWZhdWx0IGpvaW4gdGFibGUgaW4gYW55Ci0JICogc2l0dWF0aW9uLgotCSAqLwotCWJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzVjM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotCi0vKioKLSAqIFJlYWQtb25seSBqb2luIHRhYmxlIHJlbGF0aW9uc2hpcCBzdHJhdGVneS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiBAc2VlIEpvaW5UYWJsZVJlbGF0aW9uc2hpcAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQkvKioKLQkgKiBDaGFuZ2Ugbm90aWZpY2F0aW9uIGlkZW50aWZpZXIgZm9yICJqb2luVGFibGUiIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIEpPSU5fVEFCTEVfUFJPUEVSVFkgPSAiam9pblRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJhdGVneSdzIGpvaW4gdGFibGUuIFRoaXMgd2lsbCBiZSB0aGUgCi0JICogc3BlY2lmaWVkIG9yIGRlZmF1bHQgam9pbiB0YWJsZSBpZiBvbmUgaXMgc3BlY2lmaWVkIG9yIGEgZGVmYXVsdCAKLQkgKiBqb2luIHRhYmxlIGFwcGxpZXMsIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlSZWFkT25seUpvaW5UYWJsZSBnZXRKb2luVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBuYW1lIG9mIHRoZSBzdHJhdGVneSdzIGpvaW4gdGFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0Sm9pblRhYmxlRGVmYXVsdE5hbWUoKTsKLQotCWJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCk7Ci0KLQlKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLQotCUpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seU5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNjdjZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seU5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogUmVhZC1vbmx5Ci0gKiA8dWw+Ci0gKiA8bGk+Y29sdW1uCi0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDxsaT5wcmltYXJ5IGtleSBqb2luIGNvbHVtbgotICogPGxpPmRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8bGk+b3JkZXIgY29sdW1uCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlOYW1lZENvbHVtbgotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgbmFtZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JICogbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCVN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWROYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0TmFtZSgpOwotCQlTdHJpbmcgREVGQVVMVF9OQU1FX1BST1BFUlRZID0gImRlZmF1bHROYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIEEgY29sdW1uIHRoYXQgZG9lcyBub3QgaGF2ZSBhCi0JICogPGVtPnNwZWNpZmllZDwvZW0+IHRhYmxlIHN0aWxsIGhhcyBhIHRhYmxlIChhcyBkZXRlcm1pbmVkIGJ5Ci0JICogdGhlIGNvbHVtbidzIG93bmVyKS4KLQkgKi8KLQlTdHJpbmcgZ2V0VGFibGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gZGVmaW5pdGlvbiAqKioqKioqKioqCi0KLQlTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQlTdHJpbmcgQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkgPSAiY29sdW1uRGVmaW5pdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbidzIGRhdGFzb3VyY2UgdGFibGUuCi0JICovCi0JVGFibGUgZ2V0RGJUYWJsZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBmb3VuZCBvbiB0aGUgZGF0YXNvdXJjZS4KLQkgKi8KLQlib29sZWFuIGlzUmVzb2x2ZWQoKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKS4KLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQl7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdoaWNoIHRoZSBjb2x1bW4gYmVsb25ncyB0byBieSBkZWZhdWx0LgotCQkgKi8KLQkJU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBkZWZhdWx0IGNvbHVtbiBuYW1lLgotCQkgKi8KLQkJU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBkYXRhYmFzZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCB0YWJsZSBuYW1lLgotCQkgKi8KLQkJVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSk7Ci0JCQotCQlKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM2OTQ5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIGNvbW1vbiBpbnRlcmZhY2UgZm9yIGRpc2NyaW1pbmF0b3IgY29sdW1ucwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5TmFtZWRDb2x1bW4KLXsKLQotCS8vICoqKioqKioqKiogZGlzY3JpbWluYXRvciB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgdHlwZSBpZiBwcmVzZW50LAotCSAqIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQgZGlzY3JpbWluYXRvciB0eXBlLgotCSAqLwotCURpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JRGlzY3JpbWluYXRvclR5cGUgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUiOyAvLyROT04tTkxTLTEkCi0JRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCVN0cmluZyBERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSA9ICJkZWZhdWx0RGlzY3JpbWluYXRvclR5cGUiOyAvLyROT04tTkxTLTEkCi0JCURpc2NyaW1pbmF0b3JUeXBlIERFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFID0gRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HOwotCi0KLQkvLyAqKioqKioqKioqIGxlbmd0aCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBsZW5ndGggaWYgcHJlc2VudCwKLQkgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0IGxlbmd0aC4KLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0JSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFkgPSAic3BlY2lmaWVkTGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAotCWludCBnZXREZWZhdWx0TGVuZ3RoKCk7Ci0JCVN0cmluZyBERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSA9ICJkZWZhdWx0TGVuZ3RoIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgREVGQVVMVF9MRU5HVEggPSAzMTsKLQkJCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBkaXNjcmltaW5hdG9yIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoYnV0IHByZXR0eSBtdWNoIGp1c3QgZW50aXRpZXMpCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZGVmYXVsdCBkaXNjcmltaW5hdG9yIGNvbHVtbiBsZW5ndGgKLQkJICovCi0JCWludCBnZXREZWZhdWx0TGVuZ3RoKCk7Ci0JCQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBkZWZhdWx0IGRpc2NyaW1pbmF0b3IgY29sdW1uIHR5cGUKLQkJICovCi0JCURpc2NyaW1pbmF0b3JUeXBlIGdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seU92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDI3YTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBSZWFkLW9ubHkgKDxlbT5zcGVjaWZpZWQ8L2VtPiBvciA8ZW0+dmlydHVhbDwvZW0+KTx1bD4KLSAqIDxsaT5hdHRyaWJ1dGUgb3ZlcnJpZGUKLSAqIDxsaT5hc3NvY2lhdGlvbiBvdmVycmlkZQotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5T3ZlcnJpZGUKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JU3RyaW5nIGdldE5hbWUoKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb3ZlcnJpZGUgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIG9uCi0JICogdGhlIG92ZXJyaWRlJ3MgcGFyZW50IChpLmUuIGl0IG9jY3VycyBieSBkZWZhdWx0KTsgcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIGlmIHRoZSBvdmVycmlkZSBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCBvbiB0aGUgb3ZlcnJpZGUncyBwYXJlbnQuCi0JICogCi0JICogQHNlZSBPdmVycmlkZV8jY29udmVydFRvVmlydHVhbCgpCi0JICogQHNlZSBWaXJ0dWFsT3ZlcnJpZGUjY29udmVydFRvU3BlY2lmaWVkKCkKLQkgKi8KLQkvLyBUT0RPIGJqdiByZW5hbWU/Ci0JYm9vbGVhbiBpc1ZpcnR1YWwoKTsKLQotCS8qKgotCSAqIEBzZWUgT3ZlcnJpZGVDb250YWluZXIjZ2V0VHlwZU1hcHBpbmcoKQotCSAqLwotCVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHRhYmxlIGNhbm5vdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZAotCSAqIGFzIHRoZSB0YWJsZSBmb3IgdGhlIG92ZXJyaWRlJ3MgY29sdW1uIG9yIGpvaW4gY29sdW1uLgotCSAqLwotCWJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0YWJsZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoZSBvdmVycmlkZSdzCi0JICogY29sdW1uIG9yIGpvaW4gY29sdW1uLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCB0YWJsZSBuYW1lLgotCSAqLwotCVRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHRhYmxlIGZvciB0aGUgb3ZlcnJpZGUncyBjb2x1bW4gb3Igam9pbiBjb2x1bW4uCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQotCUpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBSZWFkT25seUJhc2VDb2x1bW4uT3duZXIgb3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5YjNhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogUmVhZC1vbmx5IGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwCi17Ci0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIEBzZWUgUmVhZE9ubHlPdmVycmlkZSNnZXRUeXBlTWFwcGluZygpCi0JICovCi0JVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGFibGUgY2Fubm90IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkCi0JICogYXMgdGhlIHRhYmxlIGZvciB0aGUgcmVsYXRpb25zaGlwJ3Mgam9pbiBjb2x1bW4uCi0JICovCi0JYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRhYmxlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhlIHJlbGF0aW9uc2hpcCdzCi0JICogam9pbiBjb2x1bW4uCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHRhYmxlIG5hbWUuCi0JICovCi0JVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSk7Ci0KLQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCi0JSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lciBvd25lciwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0KLQl2b2lkIGluaXRpYWxpemVPblNwZWNpZmllZChPdmVycmlkZVJlbGF0aW9uc2hpcCBzcGVjaWZpZWRSZWxhdGlvbnNoaXApOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTBhZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0vKioKLSAqIFJlYWQtb25seSBjb250ZXh0IHBlcnNpc3RlbnQgPGVtPmF0dHJpYnV0ZTwvZW0+IChmaWVsZCBvciBwcm9wZXJ0eSkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZQotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUsIFJlYWRPbmx5QWNjZXNzSG9sZGVyCi17Ci0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIG1hcHBpbmcuIFRoaXMgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAoYWx0aG91Z2gsIGl0IG1heSBiZSBhIDxlbT5udWxsPC9lbT4gbWFwcGluZykuCi0JICogU2V0IHRoZSBtYXBwaW5nIHZpYSB7QGxpbmsgUGVyc2lzdGVudEF0dHJpYnV0ZSNzZXRNYXBwaW5nS2V5KFN0cmluZyl9LgotCSAqLwotCUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpOwotCQlTdHJpbmcgTUFQUElOR19QUk9QRVJUWSA9ICJtYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIGtleS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGluZ0tleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBrZXkgZm9yIHRoZSBhdHRyaWJ1dGUncyBkZWZhdWx0IG1hcHBpbmcuCi0JICogVGhpcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gKGUuZy4gZm9yIDxlbT5zcGVjaWZpZWQ8L2VtPgotCSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZXMpLgotCSAqIEBzZWUgQXR0cmlidXRlTWFwcGluZyNpc0RlZmF1bHQoKQotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0TWFwcGluZ0tleSgpOwotCQlTdHJpbmcgREVGQVVMVF9NQVBQSU5HX0tFWV9QUk9QRVJUWSA9ICJkZWZhdWx0TWFwcGluZ0tleSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlIHRoYXQgb3ducyAoZGVjbGFyZXMpIHRoZSBhdHRyaWJ1dGUuCi0JICovCi0JUGVyc2lzdGVudFR5cGUgZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIG93bmluZyBwZXJzaXN0ZW50IHR5cGUncyBtYXBwaW5nIChhcyBvcHBvc2VkIHRvCi0JICogdGhlIGF0dHJpYnV0ZSdzIHRhcmdldCB0eXBlJ3MgbWFwcGluZykuCi0JICovCi0JVHlwZU1hcHBpbmcgZ2V0T3duaW5nVHlwZU1hcHBpbmcoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc29sdmVkLCBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgYXR0cmlidXRlJ3MgdHlwZQotCSAqIChlLmcuIDxjb2RlPiJqYXZhLnV0aWwuQ29sbGVjdGlvbiI8L2NvZGU+IG9yIDxjb2RlPiJieXRlPC9jb2RlPltdIikuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGNhbiBub3QgYmUgcmVzb2x2ZWQuCi0JICogSWYgdGhlIHR5cGUgaXMgYW4gYXJyYXksIHRoaXMgbmFtZSB3aWxsIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIG51bWJlcgotCSAqIG9mIGJyYWNrZXQgcGFpcnMuCi0JICogVGhpcyBuYW1lIHdpbGwgbm90IGluY2x1ZGUgdGhlIHR5cGUncyBnZW5lcmljIHR5cGUgYXJndW1lbnRzCi0JICogKGUuZy4gPGNvZGU+ImphdmEudXRpbC5Db2xsZWN0aW9uPGphdmEubGFuZy5TdHJpbmc+IjwvY29kZT4gd2lsbCBvbmx5IHJldHVybgotCSAqIDxjb2RlPiJqYXZhLnV0aWwuQ29sbGVjdGlvbiI8L2NvZGU+KS4KLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBJZiB0aGUgYXR0cmlidXRlIGlzIG1hcHBlZCB0byBhIHByaW1hcnkga2V5IGNvbHVtbiwgcmV0dXJuIHRoZQotCSAqIGNvbHVtbidzIG5hbWUsIG90aGVyd2lzZSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSBoYXMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uCi0JICogaW4gaXRzIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JICovCi0JYm9vbGVhbiBpc1ZpcnR1YWwoKTsKLQotCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQxYWE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBSZWFkLW9ubHkgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCWV4dGVuZHMgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbgotewotCS8vIG5vdGhpbmcgeWV0Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5UmVmZXJlbmNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlSZWZlcmVuY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2UwOTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlSZWZlcmVuY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIFJlYWQtb25seSByZWZlcmVuY2UgdGFibGUgKGkuZS4gYSB0YWJsZSB0aGF0IGpvaW5zIHdpdGggb25lIG90aGVyIHRhYmxlLAotICogYXMgb3Bwb3NlZCB0byBhICJqb2luIHRhYmxlIiB0aGF0IGpvaW5zIHdpdGggdHdvIG90aGVyIHRhYmxlcyk8dWw+Ci0gKiA8bGk+am9pbiB0YWJsZQotICogPGxpPmNvbGxlY3Rpb24gdGFibGUKLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seVJlZmVyZW5jZVRhYmxlCi0JZXh0ZW5kcyBSZWFkT25seVRhYmxlCi17Ci0JLy8gVE9ETyBpcyB0aGlzIG1ldGhvZCBuZWNlc3Nhcnk/Ci0JUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZmVyZW5jZSB0YWJsZSdzIGpvaW4gY29sdW1ucywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGpvaW4gY29sdW1ucywgd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKi8KLQlpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlZmVyZW5jZSB0YWJsZSdzIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkSm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgotCSAqLwotCWludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZWZlcmVuY2UgdGFibGUgaGFzIHNwZWNpZmllZCBqb2luIGNvbHVtbnMuCi0JICovCi0JYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlSZWFkT25seUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEEgZGVmYXVsdCBqb2luIGNvbHVtbiBvbmx5IGV4aXN0cyBpZiB0aGVyZSBhcmUgbm8gc3BlY2lmaWVkIGpvaW4gY29sdW1ucy4KLQkgKi8KLQlSZWFkT25seUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJU3RyaW5nIERFRkFVTFRfSk9JTl9DT0xVTU5fUFJPUEVSVFkgPSAiZGVmYXVsdEpvaW5Db2x1bW4iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhN2IyN2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIEEgcmVsYXRpb25zaGlwIGNvbnRhaW5zIHRoZSBzZXR0aW5ncyBkZXNjcmliaW5nIGhvdyBlbnRpdGllcyBhcmUgcmVsYXRlZAotICogaW4gYSB7QGxpbmsgUmVsYXRpb25zaGlwTWFwcGluZ30gb3Ige0BsaW5rIEFzc29jaWF0aW9uT3ZlcnJpZGV9Ojx1bD4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPmpvaW4gdGFibGUKLSAqIDxsaT4ibWFwcGVkIGJ5IgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8L3VsPgotICogU3VwcG9ydGVkIG1hcHBpbmdzOjx1bD4KLSAqIDxsaT4xOjEKLSAqIDxsaT4xOm0KLSAqIDxsaT5tOjEKLSAqIDxsaT5tOm0KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgcmVsYXRpb25zaGlwJ3MgbWFwcGluZzsgd2hpY2ggZm9yIGEgbWFwcGluZyByZWxhdGlvbnNoaXAgaXMKLQkgKiB0aGUgcmVsYXRpb25zaGlwJ3MgcGFyZW50LCBidXQgaW4gdGhlIGNhc2Ugb2YgYW4gb3ZlcnJpZGUgaXMgdGhlCi0JICogb3ZlcnJpZGRlbiBtYXBwaW5nIChmcm9tIGEgc3VwZXJjbGFzcyBvciBlbWJlZGRhYmxlIHR5cGUpLgotCSAqLwotCVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0TWFwcGluZygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcgdGhhdCBjb250YWlucyB0aGUgcmVsYXRpb25zaGlwJ3MgbWFwcGluZyBvcgotCSAqIG92ZXJyaWRlLgotCSAqLwotCVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVudGl0eSB0aGF0IGNvbnRhaW5zIHRoZSByZWxhdGlvbnNoaXAncyBtYXBwaW5nIG9yIG92ZXJyaWRlLgotCSAqIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlIG1ldGhvZCB0aGF0IGNhbGxzIHtAbGluayAjZ2V0VHlwZU1hcHBpbmcoKX0KLQkgKiBhbmQgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcmVzdWx0IGlzIG5vdCBhbiB7QGxpbmsgRW50aXR5fS4KLQkgKi8KLQlFbnRpdHkgZ2V0RW50aXR5KCk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHByZWRvbWluYW50IHN0cmF0ZWd5IHByb3BlcnR5Ci0JICovCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFJBVEVHWV9QUk9QRVJUWSA9ICJzdHJhdGVneSI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnQgc3RyYXRlZ3ksIHRoaXMgaXMgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRoZSByZWxhdGlvbnNoaXAgaXMgdmlydHVhbC4KLQkgKi8KLQlib29sZWFuIGlzVmlydHVhbCgpOwotCi0Jdm9pZCBpbml0aWFsaXplT24oUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWIyMmM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFN0cmF0ZWd5IGRlc2NyaWJpbmcgaG93IHR3byBlbnRpdGllcyBhcmUgcmVsYXRlZCwgZWl0aGVyIGZvciBhCi0gKiB7QGxpbmsgUmVsYXRpb25zaGlwTWFwcGluZ30gb3IgYW4ge0BsaW5rIEFzc29jaWF0aW9uT3ZlcnJpZGV9Ojx1bD4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPmpvaW4gdGFibGUKLSAqIDxsaT4ibWFwcGVkIGJ5IgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgUmVsYXRpb25zaGlwTWFwcGluZwotICogQHNlZSBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUKLSAqIEBzZWUgUmVhZE9ubHlSZWxhdGlvbnNoaXAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyYXRlZ3kncyByZWxhdGlvbnNoaXAuCi0JICovCi0JUmVhZE9ubHlSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RyYXRlZ3kncyBjb2x1bW5zLgotCSAqIFRoZSBqb2luIHRhYmxlIG5hbWUsIGZvciBpbnN0YW5jZSwgb3IgaW4gdGhlIGNhc2Ugb2YgYSBiaS1kaXJlY3Rpb25hbAotCSAqIHJlbGF0aW9uc2hpcCwgdGhlIHRhYmxlIG9mIHRoZSBvd25pbmcgcmVsYXRpb25zaGlwLgotCSAqLwotCVN0cmluZyBnZXRUYWJsZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OTFmNGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVNlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBSZWFkLW9ubHkgZW50aXR5IHNlY29uZGFyeSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seVNlY29uZGFyeVRhYmxlCi0JZXh0ZW5kcyBSZWFkT25seVRhYmxlCi17Ci0JcHVibGljIEVudGl0eSBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzZWNvbmRhcnkgdGFibGUgaXMgcGFydCBvZiBhbiA8Y29kZT5vcm0ueG1sPC9jb2RlPgotCSAqIGVudGl0eSBidXQgaXMgc3BlY2lmaWVkIG9ubHkgaW4gdGhlIGVudGl0eSdzIEphdmEgYW5ub3RhdGlvbnMgKGFzCi0JICogb3Bwb3NlZCB0byBleHBsaWNpdGx5IGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPikuCi0JICovCi0JYm9vbGVhbiBpc1ZpcnR1YWwoKTsKLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWNvbmRhcnkgdGFibGUncyBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMsCi0JICogd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdC4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zLAotCSAqIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHQuCi0JICovCi0JaW50IGdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUID0gInNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMuCi0JICovCi0JaW50IGdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb3IgbnVsbC4gIEEgZGVmYXVsdCBwcmltYXJ5Ci0JICoga2V5IGpvaW4gY29sdW1uIG9ubHkgZXhpc3RzIGlmIHRoZXJlIGFyZSBubyBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbgotCSAqIGNvbHVtbnMuCi0JICovCi0JUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJU3RyaW5nIERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSAiZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5VGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhNzkzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotCi0vKioKLSAqIFJlYWQtb25seSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seVRhYmxlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBuYW1lIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkgKiBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9OQU1FX1BST1BFUlRZID0gInNwZWNpZmllZE5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHROYW1lKCk7Ci0JCVN0cmluZyBERUZBVUxUX05BTUVfUFJPUEVSVFkgPSAiZGVmYXVsdE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGFibGUgY2FuIGJlIHJlc29sdmVkIHRvIGEgdGFibGUgb24gdGhlIGRhdGFiYXNlLgotCSAqLwotCWJvb2xlYW4gaXNSZXNvbHZlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGRhdGFiYXNlIHRhYmxlLgotCSAqLwotCW9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZ2V0RGJUYWJsZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBzY2hlbWEgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAotCSAqIHNjaGVtYS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKTsKLQkJU3RyaW5nIERFRkFVTFRfU0NIRU1BX1BST1BFUlRZID0gImRlZmF1bHRTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGFibGUncyBzY2hlbWEgY2FuIGJlIHJlc29sdmVkIHRvIGEgc2NoZW1hIG9uIHRoZQotCSAqIGRhdGFiYXNlLgotCSAqLwotCWJvb2xlYW4gc2NoZW1hSXNSZXNvbHZlZCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGRhdGFiYXNlIHNjaGVtYS4KLQkgKi8KLQlTY2hlbWEgZ2V0RGJTY2hlbWEoKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGNhdGFsb2cgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAotCSAqIGNhdGFsb2cuCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0YWJsZSBoYXMgYSBjYXRhbG9nIGFuZCBpdCBjYW4gYmUgcmVzb2x2ZWQgdG8gYQotCSAqIGNhdGFsb2cgb24gdGhlIGRhdGFiYXNlLgotCSAqLwotCWJvb2xlYW4gY2F0YWxvZ0lzUmVzb2x2ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyBkYXRhYmFzZSBjYXRhbG9nLgotCSAqLwotCUNhdGFsb2cgZ2V0RGJDYXRhbG9nKCk7Ci0KLQotCS8vICoqKioqKioqKiogdW5pcXVlIGNvbnN0cmFpbnRzICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QgPSAidW5pcXVlQ29uc3RyYWludHMiOyAvLyROT04tTkxTLTEkCi0JaW50IGdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpOwotCVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludCBnZXRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgZGF0YWJhc2Ugc2NoZW1hIGNvbnRhaW5lciAoY2F0YWxvZyBvciBkYXRhYmFzZSkuCi0JICovCi0JU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGFibGUgaXMgdmFsaWRhdGVkIGFnYWluc3QgYSBsaXZlIGRhdGFiYXNlIGNvbm5lY3Rpb24uCi0JICovCi0JYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lciB7Ci0JCUpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVhZE9ubHlUYWJsZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVRhYmxlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmN2ZjMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVRhYmxlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBSZWFkLW9ubHkKLSAqIDx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5VGFibGVDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5TmFtZWRDb2x1bW4KLXsKLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCVN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZFRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0VGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdFRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgdGFibGUgbmFtZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMgY29sdW1uCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogSW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiBiYXNpYyBtYXBwaW5ncyBhbmQgYXR0cmlidXRlIG92ZXJyaWRlcykuCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLyoqCi0JCSAqIHJldHVybiB3aGV0aGVyIHRoZSBnaXZlbiB0YWJsZSBjYW5ub3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQKLQkJICogaW4gdGhlIGNvbHVtbidzICd0YWJsZScgZWxlbWVudAotCQkgKi8KLQkJYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhIGxpc3Qgb2YgdGFibGUgbmFtZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoaXMgY29sdW1uCi0JCSAqLwotCQlJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5VW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRlMTMwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlYWRPbmx5VW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFJlYWQtb25seSBkYXRhYmFzZSB1bmlxdWUgY29uc3RyYWludAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB1bmlxdWUgY29uc3RyYWludCdzIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldENvbHVtbk5hbWVzKCk7Ci0JCVN0cmluZyBDT0xVTU5fTkFNRVNfTElTVCA9ICJjb2x1bW5OYW1lcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbiBuYW1lcyBpbiB0aGUgdW5pcXVlIGNvbnN0cmFpbnQuCi0JICovCi0JaW50IGdldENvbHVtbk5hbWVzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4gbmFtZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCVN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBpbmRleCk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsIGNvbnRhaW5lcnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuCi0JICovCi0JaW50ZXJmYWNlIE93bmVyIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlZmVyZW5jZVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlZmVyZW5jZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZGE0NWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWZlcmVuY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIFJlZmVyZW5jZSB0YWJsZSAoaS5lLiBhIHRhYmxlIHRoYXQgam9pbnMgd2l0aCBvbmUgb3RoZXIgdGFibGUsCi0gKiBhcyBvcHBvc2VkIHRvIGEgImpvaW4gdGFibGUiIHRoYXQgam9pbnMgd2l0aCB0d28gb3RoZXIgdGFibGVzKTx1bD4KLSAqIDxsaT5qb2luIHRhYmxlCi0gKiA8bGk+Y29sbGVjdGlvbiB0YWJsZQotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWZlcmVuY2VUYWJsZQotCWV4dGVuZHMgVGFibGUsIFJlYWRPbmx5UmVmZXJlbmNlVGFibGUKLXsKLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSByZWZlcmVuY2UgdGFibGUncyBkZWZhdWx0IGpvaW4gY29sdW1uIHRvIGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uLgotCSAqLwotCXZvaWQgY29udmVydERlZmF1bHRKb2luQ29sdW1uVG9TcGVjaWZpZWQoKTsKLQotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQotCUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQWRkIGFuZCByZXR1cm4gYSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gdG8gdGhlIHJlZmVyZW5jZSB0YWJsZS4KLQkgKi8KLQlKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKTsKLQotCS8qKgotCSAqIEFkZCBhbmQgcmV0dXJuIGEgc3BlY2lmaWVkIGpvaW4gY29sdW1uIHRvIHRoZSByZWZlcmVuY2UgdGFibGUuCi0JICovCi0JSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGpvaW4gY29sdW1uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlLgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW4gZnJvbSB0aGUgcmVmZXJlbmNlIHRhYmxlLgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCi0JLyoqCi0JICogTW92ZSB0aGUgam9pbiBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXggdG8gdGhlCi0JICogc3BlY2lmaWVkIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2IyYzViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIEFzc29jaWF0aW9uT3ZlcnJpZGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWxhdGlvbnNoaXAKLQlleHRlbmRzIFJlYWRPbmx5UmVsYXRpb25zaGlwCi17Ci0JUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0U3RyYXRlZ3koKTsKLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9ucyAqKioqKioqKioqCi0KLQl2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5UmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAoTWFwcGVkQnlSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApOwotCi0JLy8gd2Ugb25seSBoYXZlIGEgc2luZ2xlICJjbGllbnQiIG9mIHRoZSBwcmltYXJ5IGtleSByZWxhdGlvbnNoaXAgKDE6MSBtYXBwaW5nKQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjODc4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1JlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLQotLyoqCi0gKiBKUEEgcmVsYXRpb25zaGlwICgxOjEsIDE6bSwgbToxLCBtOm0pIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0JZXh0ZW5kcyBGZXRjaGFibGVNYXBwaW5nCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBtZXRhLWluZm9ybWF0aW9uIHVzZWQgdG8gcG9wdWxhdGUgdGhlIGVudGl0aWVzIG9mIHRoZSAKLQkgKiByZWxhdGlvbnNoaXAKLQkgKi8KLQlNYXBwaW5nUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWxhdGlvbnNoaXAgb3duZXIgb3IgbnVsbCBpZiB0aGlzIGlzIHRoZSBvd25pbmcgc2lkZQotIAkgKiBvciBpdCBpcyBhIHVuaWRpcmVjdGlvbmFsIG1hcHBpbmcuCi0JICovCi0JUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBPd25lcigpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdGFyZ2V0IGVudGl0eSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCVN0cmluZyBnZXRUYXJnZXRFbnRpdHkoKTsKLQkKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZID0gInNwZWNpZmllZFRhcmdldEVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOwotCQlTdHJpbmcgREVGQVVMVF9UQVJHRVRfRU5USVRZX1BST1BFUlRZID0gImRlZmF1bHRUYXJnZXRFbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JRW50aXR5IGdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFsbCBhdHRyaWJ1dGUgbmFtZXMgb24gdGhlIHRhcmdldCBlbnRpdHksIHByb3ZpZGVkIHRhcmdldCBlbnRpdHkKLQkgKiByZXNvbHZlcwotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNoYXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIHRhcmdldCBlbnRpdHkgSVR5cGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKLQkgKi8KLQljaGFyIGdldFRhcmdldEVudGl0eUVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIElUeXBlfSB0aGF0IGlzIHJlc29sdmVkIGZyb20gdGhlIHRhcmdldCBlbnRpdHkgbmFtZQotCSAqIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JSVR5cGUgZ2V0VGFyZ2V0RW50aXR5SmR0VHlwZSgpOwotCi0KLQkvLyAqKioqKioqKioqKioqKioqIGNhc2NhZGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCUNhc2NhZGUgZ2V0Q2FzY2FkZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTY0MTE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogU3RyYXRlZ3kgZGVzY3JpYmluZyBob3cgdHdvIGVudGl0aWVzIGFyZSBqb2luZWQsIGVpdGhlciBmb3IgYQotICoge0BsaW5rIFJlbGF0aW9uc2hpcE1hcHBpbmd9IG9yIGFuIHtAbGluayBBc3NvY2lhdGlvbk92ZXJyaWRlfTo8dWw+Ci0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDxsaT5qb2luIHRhYmxlCi0gKiA8bGk+Im1hcHBlZCBieSIKLSAqIDxsaT5wcmltYXJ5IGtleSBqb2luIGNvbHVtbgotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICogQHNlZSBSZWxhdGlvbnNoaXAKLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkvKioKLQkgKiBBZGQgdGhpcyBzdHJhdGVneSB0byB0aGUgcmVsYXRpb25zaGlwLgotCSAqLwotCXZvaWQgYWRkU3RyYXRlZ3koKTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhpcyBzdHJhdGVneSBmcm9tIHRoZSByZWxhdGlvbnNoaXAuCi0JICovCi0Jdm9pZCByZW1vdmVTdHJhdGVneSgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSByZWxhdGlvbnNoaXAncyBtYXBwaW5nIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggYW4KLQkgKiBhc3NvY2lhdGlvbiBvdmVycmlkZS4KLQkgKi8KLQlib29sZWFuIGlzT3ZlcnJpZGFibGUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkIHRhYmxlIG5hbWUuCi0JICovCi0JVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHRhYmxlIGNhbm5vdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZAotCSAqIGluIHRoZSBjb2x1bW4ncyA8Y29kZT50YWJsZTwvY29kZT4gZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiBhIG1lc3NhZ2UgZGVzY3JpcHRpb24gdXNlZCB3aGVuIHRoZSBjb2x1bW4ncyB0YWJsZSBpcyBub3QgdmFsaWQgCi0JICogaW4gdGhpcyBjb250ZXh0LiBUaGlzIHdpbGwgYmUgcGFzc2VkIGluIGFzIGEgcGFyYW1ldGVyIHRvIGEgdmFsaWRhdGlvbgotCSAqIG1lc3NhZ2UuIEhlcmUgaXMgYW4gZXhhbXBsZSB3aGVyZSB0aGUgZGVzY3JpcHRpb24gaXMgd2hhdCBpcyByZXR1cm5lZCAKLQkgKiBieSB0aGUgaW1wbGVtZW50YXRpb246Ci0JICogPHA+bG9jYXRpb246Ci0JICogVGFibGUgInRhYmxlIG5hbWUiIGZvciBtYXAga2V5IGNvbHVtbiAiY29sdW1uIG5hbWUiIAotCSAqIDxwPmRlc2NyaXB0aW9uOgotCSAqIGRvZXMgbm90IG1hdGNoIGpvaW4gdGFibGUKLQkgKi8KLQlTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1NlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1NlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOTE0OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9TZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogZW50aXR5IHNlY29uZGFyeSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBTZWNvbmRhcnlUYWJsZQotCWV4dGVuZHMgVGFibGUsIFJlYWRPbmx5U2Vjb25kYXJ5VGFibGUKLXsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQotCS8qKgotCSAqIEFkZCBhIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiB0byB0aGUgc2Vjb25kYXJ5IHRhYmxlLgotCSAqIFJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbi4KLQkgKi8KLQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCi0JLyoqCi0JICogQWRkIGEgc3BlY2lmaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHRvIHRoZSBzZWNvbmRhcnkgdGFibGUuCi0JICogUmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLgotCSAqLwotCVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20KLQkgKiB0aGUgc2Vjb25kYXJ5IHRhYmxlLgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIGZyb20gdGhlIHNlY29uZGFyeSB0YWJsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gZnJvbSB0aGUgc3BlY2lmaWVkIHNvdXJjZQotCSAqIGluZGV4IHRvIHRoZSBzcGVjaWZpZWQgdGFyZ2V0IGluZGV4LgotCSAqLwotCXZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQxNjRiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1NlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIHNlcXVlbmNlIGdlbmVyYXRvcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VxdWVuY2VHZW5lcmF0b3IKLQlleHRlbmRzIEdlbmVyYXRvcgotewotCWludCBERUZBVUxUX0lOSVRJQUxfVkFMVUUgPSAxOwotCi0KLQkvLyAqKioqKioqKioqIHNlcXVlbmNlIG5hbWUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc2VxdWVuY2UgbmFtZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZQotCSAqIGRlZmF1bHQgc2VxdWVuY2UgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTZXF1ZW5jZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKTsKLQkJU3RyaW5nIERFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0U2VxdWVuY2VOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1NpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzIzMjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBKUEEgc2luZ2xlIHJlbGF0aW9uc2hpcCAobToxLCAxOjEpIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLQlleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmcsIE9wdGlvbmFsTWFwcGluZwotewotCUZldGNoVHlwZSBERUZBVUxUX0ZFVENIX1RZUEUgPSBGZXRjaFR5cGUuRUFHRVI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVmODA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiA8dWw+Ci0gKiA8bGk+dGFibGUKLSAqIDxsaT5zZWNvbmRhcnkgdGFibGUKLSAqIDxsaT5qb2luIHRhYmxlCi0gKiA8bGk+Y29sbGVjdGlvbiB0YWJsZQotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZQotCWV4dGVuZHMgUmVhZE9ubHlUYWJsZQotewotCXZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgdmFsdWUpOwotCi0Jdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHZhbHVlKTsKLQotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgdmFsdWUpOwotCi0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCVVuaXF1ZUNvbnN0cmFpbnQgZ2V0VW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludCgpOwotCVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpOwotCXZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRhYmxlIGlzIHNwZWNpZmllZCBpbiB0aGUKLQkgKiAoSmF2YSBvciBYTUwpIHJlc291cmNlLgotCSAqLwotCWJvb2xlYW4gaXNTcGVjaWZpZWRJblJlc291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1RhYmxlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1RhYmxlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MjNmMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UYWJsZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBjb2x1bW4gb3Igam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhYmxlQ29sdW1uCi0JZXh0ZW5kcyBOYW1lZENvbHVtbiwgUmVhZE9ubHlUYWJsZUNvbHVtbgotewotCXZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIHRhYmxlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVGFibGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhMmZhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1RhYmxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogdGFibGUgZ2VuZXJhdG9yCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZUdlbmVyYXRvcgotCWV4dGVuZHMgR2VuZXJhdG9yCi17Ci0JaW50IERFRkFVTFRfSU5JVElBTF9WQUxVRSA9IDA7Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgdGFibGUgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAotCSAqIHRhYmxlLgotCSAqLwotCVN0cmluZyBnZXRUYWJsZSgpOwotCVN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX1RBQkxFX1BST1BFUlRZID0gImRlZmF1bHRUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgc2NoZW1hIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkgKiBzY2hlbWEuCi0JICovCi0JU3RyaW5nIGdldFNjaGVtYSgpOwotCVN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQl2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKTsKLQkJU3RyaW5nIERFRkFVTFRfU0NIRU1BX1BST1BFUlRZID0gImRlZmF1bHRTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjYXRhbG9nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkgKiBjYXRhbG9nLgotCSAqLwotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKTsKLQl2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZID0gInNwZWNpZmllZENhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgY29sdW0gbmFtZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuCi0JICogdGhlIGRlZmF1bHQgcHJpbWFyeSBrZXkgY29sdW0gbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfUEtfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkUGtDb2x1bW5OYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0UGtDb2x1bW5OYW1lKCk7Ci0JCVN0cmluZyBERUZBVUxUX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gImRlZmF1bHRQa0NvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogdmFsdWUgY29sdW1uIG5hbWUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgdmFsdWUgY29sdW0gbmFtZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuCi0JICogdGhlIGRlZmF1bHQgdmFsdWUgY29sdW0gbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JCVN0cmluZyBERUZBVUxUX1ZBTFVFX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gImRlZmF1bHRWYWx1ZUNvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHByaW1hcnkga2V5IGNvbHVtIHZhbHVlIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4KLQkgKiB0aGUgZGVmYXVsdCBwcmltYXJ5IGtleSBjb2x1bSB2YWx1ZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UGtDb2x1bW5WYWx1ZSgpOwotCVN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZID0gInNwZWNpZmllZFBrQ29sdW1tVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtblZhbHVlKCk7Ci0JCVN0cmluZyBERUZBVUxUX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSA9ICJkZWZhdWx0UGtDb2x1bW1WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCi0JPFQgZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50PiBJdGVyYWJsZTxUPiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCWludCBnZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKTsKLQlVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQlVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KTsKLQl2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZ2VuZXJhdG9yJ3MgZGF0YWJhc2UgdGFibGUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGdlbmVyYXRvcidzIHRhYmxlIChuYW1lKSBpcyBpbnZhbGlkLgotCSAqLwotCVRhYmxlIGdldERiVGFibGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UZW1wb3JhbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UZW1wb3JhbENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDA2MzliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVGVtcG9yYWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIHRlbXBvcmFsIGNvbnZlcnRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGVtcG9yYWxDb252ZXJ0ZXIKLQlleHRlbmRzIENvbnZlcnRlcgotewotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBURU1QT1JBTF9NQVBQSU5HX1NVUFBPUlRFRF9UWVBFUyA9IHsiamF2YS51dGlsLkRhdGUiLCAiamF2YS51dGlsLkNhbGVuZGFyIiwgImphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQotCVRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbFR5cGUoKTsKLQl2b2lkIHNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKTsKLQkJU3RyaW5nIFRFTVBPUkFMX1RZUEVfUFJPUEVSVFkgPSAidGVtcG9yYWxUeXBlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UZW1wb3JhbFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVGVtcG9yYWxUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzYjBmZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UZW1wb3JhbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogVGVtcG9yYWwgVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBlbnVtIFRlbXBvcmFsVHlwZSB7Ci0KLQlEQVRFKAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLkRBVEUsCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFCi0JCSksCi0JVElNRSgKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLAotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRQotCQkpLAotCVRJTUVTVEFNUCgKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsCi0JCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAKLQkJKTsKLQotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUgamF2YVRlbXBvcmFsVHlwZTsKLQlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlIG9ybVRlbXBvcmFsVHlwZTsKLQotCVRlbXBvcmFsVHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUgamF2YVRlbXBvcmFsVHlwZSwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgb3JtVGVtcG9yYWxUeXBlKSB7Ci0JCWlmIChqYXZhVGVtcG9yYWxUeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmIChvcm1UZW1wb3JhbFR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhVGVtcG9yYWxUeXBlID0gamF2YVRlbXBvcmFsVHlwZTsKLQkJdGhpcy5vcm1UZW1wb3JhbFR5cGUgPSBvcm1UZW1wb3JhbFR5cGU7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZSBnZXRKYXZhVGVtcG9yYWxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhVGVtcG9yYWxUeXBlOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZSBnZXRPcm1UZW1wb3JhbFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm9ybVRlbXBvcmFsVHlwZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUZW1wb3JhbFR5cGUgZnJvbUphdmFSZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZSBqYXZhVGVtcG9yYWxUeXBlKSB7Ci0JCXJldHVybiAoamF2YVRlbXBvcmFsVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YVJlc291cmNlTW9kZWxfKGphdmFUZW1wb3JhbFR5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRlbXBvcmFsVHlwZSBmcm9tSmF2YVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZSBqYXZhVGVtcG9yYWxUeXBlKSB7Ci0JCWZvciAoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSA6IFRlbXBvcmFsVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKHRlbXBvcmFsVHlwZS5nZXRKYXZhVGVtcG9yYWxUeXBlKCkgPT0gamF2YVRlbXBvcmFsVHlwZSkgewotCQkJCXJldHVybiB0ZW1wb3JhbFR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUgdG9KYXZhUmVzb3VyY2VNb2RlbChUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCXJldHVybiAodGVtcG9yYWxUeXBlID09IG51bGwpID8gbnVsbCA6IHRlbXBvcmFsVHlwZS5nZXRKYXZhVGVtcG9yYWxUeXBlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZW1wb3JhbFR5cGUgZnJvbU9ybVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgb3JtVGVtcG9yYWxUeXBlKSB7Ci0JCXJldHVybiAob3JtVGVtcG9yYWxUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21Pcm1SZXNvdXJjZU1vZGVsXyhvcm1UZW1wb3JhbFR5cGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRlbXBvcmFsVHlwZSBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgb3JtVGVtcG9yYWxUeXBlKSB7Ci0JCWZvciAoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSA6IFRlbXBvcmFsVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKHRlbXBvcmFsVHlwZS5nZXRPcm1UZW1wb3JhbFR5cGUoKSA9PSBvcm1UZW1wb3JhbFR5cGUpIHsKLQkJCQlyZXR1cm4gdGVtcG9yYWxUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgdG9Pcm1SZXNvdXJjZU1vZGVsKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJcmV0dXJuICh0ZW1wb3JhbFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGVtcG9yYWxUeXBlLmdldE9ybVRlbXBvcmFsVHlwZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1RyYW5zaWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkNzU5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1RyYW5zaWVudE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIHRyYW5zaWVudCAibWFwcGluZyIuIEJlY2F1c2Ugb2YgZGVmYXVsdCBtYXBwaW5ncywgYXR0cmlidXRlcyBtdXN0IGJlCi0gKiBleHBsaWNpdGx5IG1hcmtlZCAidHJhbnNpZW50IiBpZiB0aGV5IGFyZSBub3QgdG8gYmUgbWFwcGVkIHRvIHRoZSBkYXRhYmFzZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRyYW5zaWVudE1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvLyBub3RoaW5nIHlldAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9UeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjAzMDdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLQotLyoqCi0gKiB0eXBlIG1hcHBpbmc6PHVsPgotICogPGxpPmVudGl0eQotICogPGxpPm1hcHBlZCBzdXBlcmNsYXNzCi0gKiA8bGk+ZW1iZWRkYWJsZQotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUeXBlTWFwcGluZwotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGphdmEgcmVzb3VyY2UgdHlwZSwgdGhpcyBjYW4gYmUgbnVsbAotCSAqLwotCUphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCi0KLQkvKioKLQkgKiBSZXR1cm4gYSB1bmlxdWUga2V5IGZvciB0aGUgdHlwZSBtYXBwaW5nLiBJZiB0aGlzIGlzIGRlZmluZWQgaW4gYW4KLQkgKiBleHRlbnNpb24gdGhleSBzaG91bGQgYmUgZXF1YWwuCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lLCBzcGVjaWZpZWQgb3IgZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlib29sZWFuIGlzTWFwcGVkKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvbHZlZCBpZCBjbGFzcyBzcGVjaWZpZWQgb24gdGhpcyB0eXBlIG1hcHBpbmcsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JSmF2YVBlcnNpc3RlbnRUeXBlIGdldElkQ2xhc3MoKTsKLQotCUl0ZXJhYmxlPFF1ZXJ5PiBnZXRRdWVyaWVzKCk7Ci0KLQlJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKTsKLQotCi0JLy8gKioqKioqKioqKiBpbmhlcml0YW5jZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgbWFwcGluZyBvZiB0aGlzIHR5cGUgbWFwcGluZydzIHN1cGVyIHR5cGUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhpcyBpcyB0aGUgcm9vdC4KLQkgKi8KLQlUeXBlTWFwcGluZyBnZXRTdXBlclR5cGVNYXBwaW5nKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyAicGVyc2lzdGVuY2UiIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwKLQkgKiA8ZW0+aW5jbHVkaW5nPC9lbT4gdGhlIHR5cGUgbWFwcGluZyBpdHNlbGYuCi0JICogVGhlIHJldHVybmVkIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGVsZW1lbnRzIGluZmluaXRlbHkgaWYgdGhlIGhpZXJhcmNoeQotCSAqIGhhcyBhIGxvb3AuCi0JICovCi0JSXRlcmFibGU8VHlwZU1hcHBpbmc+IGdldEluaGVyaXRhbmNlSGllcmFyY2h5KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmhlcml0YW5jZSBzdHJhdGVneSBvciBudWxsCi0JICovCi0JSW5oZXJpdGFuY2VUeXBlIGdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgdHlwZSBtYXBwaW5nIGlzIGEgcm9vdCBlbnRpdHkgaW4gYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCWJvb2xlYW4gaXNSb290RW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJvb3QgZW50aXR5IG9mIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb3IgbnVsbC4KLQkgKi8KLQlFbnRpdHkgZ2V0Um9vdEVudGl0eSgpOwotCi0JLy8gKioqKioqKioqKiB0YWJsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyBwcmltYXJ5IHRhYmxlIG5hbWUuCi0JICogUmV0dXJuIG51bGwgaWYgYSBwcmltYXJ5IHRhYmxlIGlzIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCVN0cmluZyBnZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgZGF0YWJhc2UgdGFibGUuCi0JICogUmV0dXJuIG51bGwgaWYgYSBwcmltYXJ5IHRhYmxlIGlzIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCW9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZ2V0UHJpbWFyeURiVGFibGUoKTsKLQotCVNjaGVtYSBnZXREYlNjaGVtYSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyAiYXNzb2NpYXRlZCIgdGFibGVzLCB3aGljaCBpbmNsdWRlcyB0aGUgcHJpbWFyeQotCSAqIHRhYmxlIGFuZCB0aGUgY29sbGVjdGlvbiBvZiBzZWNvbmRhcnkgdGFibGVzLgotCSAqLwotCUl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IGdldEFzc29jaWF0ZWRUYWJsZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdHlwZSBtYXBwaW5nJ3MgImFzc29jaWF0ZWQiIHRhYmxlcywgd2hpY2ggaW5jbHVkZXMgdGhlIHByaW1hcnkKLQkgKiB0YWJsZSBhbmQgdGhlIGNvbGxlY3Rpb24gb2Ygc2Vjb25kYXJ5IHRhYmxlcywgYXMgd2VsbCBhcyBhbGwgaW5oZXJpdGVkCi0JICogImFzc29jaWF0ZWQiIHRhYmxlcy4KLQkgKi8KLQlJdGVyYWJsZTxSZWFkT25seVRhYmxlPiBnZXRBbGxBc3NvY2lhdGVkVGFibGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSB0eXBlIG1hcHBpbmcncyAiYXNzb2NpYXRlZCIgdGFibGVzLCB3aGljaAotCSAqIGluY2x1ZGVzIHRoZSBwcmltYXJ5IHRhYmxlIGFuZCB0aGUgY29sbGVjdGlvbiBvZiBzZWNvbmRhcnkgdGFibGVzLCBhcwotCSAqIHdlbGwgYXMgYWxsIHRoZSBpbmhlcml0ZWQgImFzc29jaWF0ZWQiIHRhYmxlcy4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc29sdmVkIDxlbT5hc3NvY2lhdGVkPC9lbT4gZGIgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWU7Ci0JICogaS5lLiB0aGUgc3BlY2lmaWVkIHRhYmxlIG11c3QgYmUgYW1vbmcgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlCi0JICogbWFwcGluZyBvdGhlcndpc2UgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSBzcGVjIGRvZXMgYWxsb3cgZm9yIGNvbHVtbnMgb3Igam9pbiBjb2x1bW5zIHRvCi0JICogc3BlY2lmeSBhIHNjaGVtYSBhbmQvb3IgY2F0YWxvZzsgc28gdGhlIHJlc3VsdHMgY2FuIGJlIHVucHJlZGljdGFibGUuLi4uCi0JICovCi0Jb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdGFibGUgaXMgaW52YWxpZCBmb3IgYW55IGFubm90YXRpb25zCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSB0eXBlIG1hcHBpbmcuIFRoZSB0YWJsZSBuYW1lIGlzIGNhc2UtCi0JICogPGVtPnNlbnNpdGl2ZTwvZW0+IHdoZW4gdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaXMgbWlzc2luZyBvciBpbmFjdGl2ZTsKLQkgKiB3aGVuIHRoZSBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFjdGl2ZSwgY2FzZS1zZW5zaXRpdml0eSBpcyBkZXRlcm1pbmVkCi0JICogYnkgdGhlIGRhdGFiYXNlLgotCSAqLwotCWJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpOwotCQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JLyoqCi0JICogQSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIGdldHRpbmcgdGhlIGF0dHJpYnV0ZSBtYXBwaW5ncyBmcm9tIFBlcnNpc3RlbnRUeXBlLmF0dHJpYnV0ZXMoKQotCSAqLwotCTxUIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gSXRlcmFibGU8VD4gZ2V0QXR0cmlidXRlTWFwcGluZ3MoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYXR0cmlidXRlIG1hcHBpbmdzIG9mIGEgcGFydGljdWxhciBtYXBwaW5nIHR5cGUgdGhhdCBhcmUgZGVjbGFyZWQgb24gdGhpcyB0eXBlIG1hcHBpbmcKLQkgKi8KLQk8VCBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IEl0ZXJhYmxlPFQ+IGdldEF0dHJpYnV0ZU1hcHBpbmdzKFN0cmluZyBtYXBwaW5nS2V5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBhdHRyaWJ1dGUgbWFwcGluZ3MgaW4gdGhlIHR5cGUgbWFwcGluZydzCi0JICogaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCUl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYXR0cmlidXRlIG1hcHBpbmdzIG9mIGEgcGFydGljdWxhciBtYXBwaW5nIHR5cGUgdGhhdCBhcmUgZGVjbGFyZWQgYW55d2hlcmUgb24gdGhpcyAKLQkgKiB0eXBlIG1hcHBpbmcncyBoaWVyYXJjaHkKLQkgKi8KLQk8VCBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IEl0ZXJhYmxlPFQ+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKFN0cmluZyBtYXBwaW5nS2V5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gYXR0cmlidXRlIG1hcHBpbmcga2V5IGlzIHZhbGlkIGZvciB0aGlzCi0JICogcGFydGljdWxhciB0eXBlIG1hcHBpbmcgKGZvciBleGFtcGxlLCBpZCdzIGFyZSBub3QgdmFsaWQgZm9yIGFuCi0JICogZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcpCi0JICovCi0JYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGlzIGEgZGVyaXZlZCBJRC4KLQkgKi8KLQlib29sZWFuIGF0dHJpYnV0ZUlzRGVyaXZlZElkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBJdGVyYXRvciBvZiBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBhIAotCSAqIHN1YiB0eXBlIG1hcHBpbmcuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYWxsIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHRoaXMKLQkgKiB0eXBlIG1hcHBpbmcuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4gb2YgdGhlIG92ZXJyaWRhYmxlIGF0dHJpYnV0ZSBtYXBwaW5nIChvciBhdHRyaWJ1dGUKLQkgKiBvdmVycmlkZSkgd2l0aCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBuYW1lLgotCSAqIDxwPgotCSAqIEluIEpQQSAyLjAgdGhpcyBuYW1lIGNhbiB1c2UgZG90LW5vdGF0aW9uIHRvIGRlc2lnbmF0ZSBuZXN0ZWQgYXR0cmlidXRlcwotCSAqIGluIGVtYmVkZGVkIGF0dHJpYnV0ZSBtYXBwaW5nJ3MgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcuCi0JICovCi0JQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotCi0JLy8gKioqKioqKioqKiBhc3NvY2lhdGlvbiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIEl0ZXJhdG9yIG9mIGFzc29jaWF0aW9ucyBuYW1lcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHRoaXMKLQkgKiB0eXBlIG1hcHBpbmcuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYW4gSXRlcmF0b3Igb2YgYWxsIGFzc29jaWF0aW9ucyBuYW1lcyB0aGF0IGNhbiBiZSBvdmVycmlkZGVuIGluIHRoaXMKLQkgKiB0eXBlIG1hcHBpbmcuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKTsKLQotCVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbnkgZGF0YWJhc2UgbWV0YWRhdGEgc3BlY2lmaWMgdmFsaWRhdGlvbiBzaG91bGQgb2NjdXIuCi0JICogKEZvciBpbnN0YW5jZSwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGFjdGl2ZSwgdGhlbiBpdCBzaG91bGQgbm90LikKLQkgKi8KLQlib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9VbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1VuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ2ODJmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1VuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBkYXRhYmFzZSB1bmlxdWUgY29uc3RyYWludAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Ci17Ci0Jdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgb2xkVW5pcXVlQ29uc3RyYWludCk7Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIG5hbWVzICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIGNvbHVtbiBuYW1lIHRvIHRoZSBlbmQgb2YgdGhlCi0JICogdW5pcXVlIGNvbnN0cmFpbnQncyBsaXN0IG9mIGNvbHVtbiBuYW1lcy4KLQkgKi8KLQl2b2lkIGFkZENvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpOwotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgY29sdW1uIG5hbWUgdG8gdGhlCi0JICogdW5pcXVlIGNvbnN0cmFpbnQncyBsaXN0IG9mIGNvbHVtbiBuYW1lcwotCSAqIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JICovCi0Jdm9pZCBhZGRDb2x1bW5OYW1lKGludCBpbmRleCwgU3RyaW5nIGNvbHVtbk5hbWUpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgY29sdW1uIG5hbWUgZnJvbSB0aGUKLQkgKiB1bmlxdWUgY29uc3RyYWludCdzIGxpc3Qgb2YgY29sdW1uIG5hbWVzLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGNvbHVtbiBuYW1lIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUKLQkgKiB1bmlxdWUgY29uc3RyYWludCdzIGxpc3Qgb2YgY29sdW1uIG5hbWVzLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogTW92ZSB0aGUgY29sdW1uIG5hbWUgYXQgdGhlIHNwZWNpZmllZCBzb3VyY2UgaW5kZXgKLQkgKiB0byB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleCBpbiB0aGUKLQkgKiB1bmlxdWUgY29uc3RyYWludCdzIGxpc3Qgb2YgY29sdW1uIG5hbWVzLgotCSAqLwotCXZvaWQgbW92ZUNvbHVtbk5hbWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQ3YmU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmVyc2lvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIHZlcnNpb24gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmVyc2lvbk1hcHBpbmcKLQlleHRlbmRzIENvbHVtbk1hcHBpbmcsIENvbnZlcnRpYmxlTWFwcGluZwotewotCVN0cmluZ1tdIFNVUFBPUlRFRF9UWVBFX05BTUVTID0gewotCQlpbnQuY2xhc3MuZ2V0TmFtZSgpLAotCQlqYXZhLmxhbmcuSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCXNob3J0LmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5sYW5nLlNob3J0LmNsYXNzLmdldE5hbWUoKSwKLQkJbG9uZy5jbGFzcy5nZXROYW1lKCksCi0JCWphdmEubGFuZy5Mb25nLmNsYXNzLmdldE5hbWUoKSwKLQkJamF2YS5zcWwuVGltZXN0YW1wLmNsYXNzLmdldE5hbWUoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZGUxOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiA8ZW0+VmlydHVhbDwvZW0+IGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBWaXJ0dWFsT3ZlcnJpZGUsIFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZQotewotCVJlYWRPbmx5UmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKCk7Ci0KLQkvLyBjb3ZhcmlhbnQgb3ZlcnJpZGVzCi0JQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQotCVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDM2ZTc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIDxlbT5WaXJ0dWFsPC9lbT4gYXR0cmlidXRlIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZQotCWV4dGVuZHMgVmlydHVhbE92ZXJyaWRlLCBSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlCi17Ci0JLy8gY292YXJpYW50IG92ZXJyaWRlcwotCUF0dHJpYnV0ZU92ZXJyaWRlIGNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JVmlydHVhbENvbHVtbiBnZXRDb2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEJhc2VDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEJhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjNjhiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxCYXNlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFZpcnR1YWwKLSAqIDx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxCYXNlQ29sdW1uCi0JZXh0ZW5kcyBWaXJ0dWFsVGFibGVDb2x1bW4sIFJlYWRPbmx5QmFzZUNvbHVtbgotewotCVJlYWRPbmx5QmFzZUNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxCYXNlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsQmFzZUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0ZGRhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxCYXNlSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBWaXJ0dWFsIGpvaW4gY29sdW1uIChubyB2aXJ0dWFsIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyB5ZXQpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxCYXNlSm9pbkNvbHVtbgotCWV4dGVuZHMgVmlydHVhbE5hbWVkQ29sdW1uLCBSZWFkT25seUJhc2VKb2luQ29sdW1uCi17Ci0JUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWRhYzM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBWaXJ0dWFsIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsQ29sdW1uCi0JZXh0ZW5kcyBWaXJ0dWFsQmFzZUNvbHVtbiwgUmVhZE9ubHlDb2x1bW4KLXsKLQlSZWFkT25seUNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogSW50ZXJmYWNlIGFsbG93aW5nIHRoZSB2aXJ0dWFsIGNvbHVtbiB0byBiZSBnZXQgdGhlIGNvbHVtbiBpdCBvdmVycmlkZXMuCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gb3ZlcnJpZGRlbiBieSB0aGUgdmlydHVhbCBjb2x1bW4uCi0JCSAqLwotCQlSZWFkT25seUNvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhYjhlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFZpcnR1YWwgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbEpvaW5Db2x1bW4KLQlleHRlbmRzIFZpcnR1YWxCYXNlSm9pbkNvbHVtbiwgVmlydHVhbEJhc2VDb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbgotewotCVJlYWRPbmx5Sm9pbkNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOTAxOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFZpcnR1YWwgam9pbiBjb2x1bW4gcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAsCi0JCQlWaXJ0dWFsUmVsYXRpb25zaGlwCi17Ci0JVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5MDVlNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBWaXJ0dWFsIGpvaW4gY29sdW1uIHJlbGF0aW9uc2hpcCBzdHJhdGVneS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3ksIFZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgVmlydHVhbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBWaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQlWaXJ0dWFsSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JVmlydHVhbEpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEpvaW5UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Mzk4OGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogVXNlZCBieSBhc3NvY2lhdGlvbiBvdmVycmlkZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxKb2luVGFibGUKLQlleHRlbmRzIFZpcnR1YWxSZWZlcmVuY2VUYWJsZSwgUmVhZE9ubHlKb2luVGFibGUKLXsKLQlWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UGFyZW50KCk7Ci0KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFZpcnR1YWxKb2luQ29sdW1uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFZpcnR1YWxKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQlWaXJ0dWFsSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCVZpcnR1YWxKb2luQ29sdW1uIGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCi0JUmVhZE9ubHlKb2luVGFibGUgZ2V0T3ZlcnJpZGRlblRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjMyMjE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFZpcnR1YWwgam9pbiB0YWJsZSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAsCi0JCQlWaXJ0dWFsUmVsYXRpb25zaGlwCi17Ci0JVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjOTkwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFZpcnR1YWwgam9pbiB0YWJsZSByZWxhdGlvbnNoaXAgc3RyYXRlZ3kuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSwgVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JVmlydHVhbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxOYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTczMTYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIDxlbT5WaXJ0dWFsPC9lbT48dWw+Ci0gKiA8bGk+Y29sdW1uCi0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsTmFtZWRDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5TmFtZWRDb2x1bW4KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZpcnR1YWwgY29sdW1uJ3Mgd3JhcHBlZCBjb2x1bW4uCi0JICovCi0JUmVhZE9ubHlOYW1lZENvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTkyZWMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotCi0vKioKLSAqIFZpcnR1YWwgbmFtZWQgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotCWV4dGVuZHMgVmlydHVhbE5hbWVkQ29sdW1uLCBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotewotCVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uIGdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWFjNGM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIDxlbT5WaXJ0dWFsPC9lbT48dWw+Ci0gKiA8bGk+YXR0cmlidXRlIG92ZXJyaWRlCi0gKiA8bGk+YXNzb2NpYXRpb24gb3ZlcnJpZGUKLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsT3ZlcnJpZGUKLQlleHRlbmRzIFJlYWRPbmx5T3ZlcnJpZGUKLXsKLQkvKioKLQkgKiBDb252ZXJ0IHRoZSA8ZW0+dmlydHVhbDwvZW0+IG92ZXJyaWRlIHRvIGEgPGVtPnNwZWNpZmllZDwvZW0+IG92ZXJyaWRlLgotCSAqIFJldHVybiB0aGUgbmV3IDxlbT5zcGVjaWZpZWQ8L2VtPiBvdmVycmlkZS4KLQkgKiBAc2VlICNpc1ZpcnR1YWwoKQotCSAqLwotCU92ZXJyaWRlXyBjb252ZXJ0VG9TcGVjaWZpZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTM4OTdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogVmlydHVhbCBhc3NvY2lhdGlvbiBvdmVycmlkZSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcCwKLQkJCVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhZjdiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBWaXJ0dWFsIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLiBUaGVyZSBhcmUgb25seSA8ZW0+b3JtLnhtbDwvZW0+IHZpcnR1YWwKLSAqIHByaW1hcnkga2V5IGpvaW4gY29sdW1uczsgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlZmF1bHQgY29sdW1ucyB0YWtlbiBmcm9tCi0gKiB0aGUgSmF2YSBlbnRpdHkuIFRoZXJlZm9yZSwgaXQncyBhcmd1YWJsZSB3aGV0aGVyIHdlIG5lZWQgdGhpcyBpbnRlcmZhY2U7IGJ1dAotICogaXQgbWFrZXMgdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzIGEgYml0IG1vcmUgY29uc2lzdGVudC4uLi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uCi0JZXh0ZW5kcyBWaXJ0dWFsQmFzZUpvaW5Db2x1bW4sIFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4KLXsKLQkvKioKLQkgKiBUaGlzIGlzIG5vdCB0aGUgYmVzdCBtZXRob2QgbmFtZTsgd2UgYXJlIHNpbXBseSBvdmVybG9hZGluZyB0aGUgbWVhbmluZwotCSAqIG9mIHRoZSBpbmhlcml0ZWQgbWV0aG9kLgotCSAqLwotCVByaW1hcnlLZXlKb2luQ29sdW1uIGdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbFJlZmVyZW5jZVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxSZWZlcmVuY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWE0ZWM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbFJlZmVyZW5jZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogVmlydHVhbCByZWZlcmVuY2UgdGFibGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbFJlZmVyZW5jZVRhYmxlCi0JZXh0ZW5kcyBWaXJ0dWFsVGFibGUsIFJlYWRPbmx5UmVmZXJlbmNlVGFibGUKLXsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFZpcnR1YWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpOwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgVmlydHVhbEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCVZpcnR1YWxKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0KLQlSZWFkT25seVJlZmVyZW5jZVRhYmxlIGdldE92ZXJyaWRkZW5UYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiZjRjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotLyoqCi0gKiBWaXJ0dWFsIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBSZWFkT25seVJlbGF0aW9uc2hpcAotewotCVZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRTdHJhdGVneSgpOwotCi0JUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDk1NzBkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLS8qKgotICogVmlydHVhbCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlWaXJ0dWFsUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbFNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Mjc1ZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsU2Vjb25kYXJ5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBWaXJ0dWFsIHNlY29uZGFyeSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsU2Vjb25kYXJ5VGFibGUKLQlleHRlbmRzIFZpcnR1YWxUYWJsZSwgUmVhZE9ubHlTZWNvbmRhcnlUYWJsZQotewotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCi0JU2Vjb25kYXJ5VGFibGUgZ2V0T3ZlcnJpZGRlblRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1YTY0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIFZpcnR1YWwgdGFibGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVmlydHVhbFRhYmxlCi0JZXh0ZW5kcyBSZWFkT25seVRhYmxlCi17Ci0JUmVhZE9ubHlUYWJsZSBnZXRPdmVycmlkZGVuVGFibGUoKTsKLQotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQgZ2V0VW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsVGFibGVDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvVmlydHVhbFRhYmxlQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZDdjZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsVGFibGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLQotLyoqCi0gKiBWaXJ0dWFsIHRhYmxlIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsVGFibGVDb2x1bW4KLQlleHRlbmRzIFZpcnR1YWxOYW1lZENvbHVtbiwgUmVhZE9ubHlUYWJsZUNvbHVtbgotewotCi0JUmVhZE9ubHlUYWJsZUNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1ZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTAyYTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9WaXJ0dWFsVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0OwotCi0vKioKLSAqIFZpcnR1YWwgZGF0YWJhc2UgdW5pcXVlIGNvbnN0cmFpbnQuIDxlbT5WaXJ0dWFsPC9lbT4gdW5pcXVlIGNvbnN0cmFpbnRzCi0gKiBhcmUgaGVsZCBieSA8ZW0+dmlydHVhbDwvZW0+IGpvaW4gdGFibGVzICh3aGljaCBhcmUgaGVsZCBieSA8ZW0+dmlydHVhbDwvZW0+Ci0gKiBhc3NvY2lhdGlvbiBvdmVycmlkZXMpIGFuZCwgaW4gdGhlIGNhc2Ugb3IgPGNvZGU+b3JtLnhtbDwvY29kZT4sCi0gKiA8ZW0+dmlydHVhbDwvZW0+IHNlY29uZGFyeSB0YWJsZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZpcnR1YWxVbmlxdWVDb25zdHJhaW50Ci0JZXh0ZW5kcyBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHdyYXBwZWQgdW5pcXVlIGNvbnN0cmFpbnQuCi0JICovCi0JUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IGdldE92ZXJyaWRkZW5VbmlxdWVDb25zdHJhaW50KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1htbENvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1htbENvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjljMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9YbWxDb250ZXh0Tm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogWE1MIEpQQSBjb250ZXh0IG5vZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbnRleHROb2RlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotLy8gVE9ETyBianYgcmVuYW1lIHRvIFhtbEpwYUNvbnRleHROb2RlCi0JLyoqCi0JICogQWRkIHRvIHRoZSBsaXN0IG9mIGN1cnJlbnQgdmFsaWRhdGlvbiBtZXNzYWdlcwotCSAqLwotCXZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcik7Ci0KLQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9YbWxGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1htbEZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxM2Q5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L1htbEZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotCi0vKioKLSAqIENvbnRleHQgcmVwcmVzZW50YXRpb24gb2YgYW55IEpQQSBYTUwgZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEZpbGUKLQlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBvYmplY3QKLQkgKi8KLQlKcGFYbWxSZXNvdXJjZSBnZXRYbWxSZXNvdXJjZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0FjY2Vzc29yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvQWNjZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ4M2VjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvQWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIEpQQSBhY2Nlc3NvciAoZmllbGQvcHJvcGVydHkpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWNjZXNzb3IgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPnJlc291cmNlPC9lbT4gYXR0cmlidXRlKGZpZWxkL21ldGhvZCkgdGhhdCBpcyB0byBiZSBhbm5vdGF0ZWQuIAotCSAqLwotCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCi0JYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKTsKLQotCWJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpOwotCi0JLyoqCi0JICogQnVpbGQgYSBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIEphdmEgcmVzb3VyY2UKLQkgKiBhdHRyaWJ1dGVzIGFuZCBiZWhhdmVzIGFzIHRob3VnaCBpdCBoYXMgbm8gYW5ub3RhdGlvbnMuIFRoaXMgd2lsbCBjYXVzZQotCSAqIGFsbCB0aGUgc2V0dGluZ3MgaW4gdGhlIEphdmEgPGVtPmNvbnRleHQ8L2VtPiBhdHRyaWJ1dGUgdG8gZGVmYXVsdC4KLQkgKi8KLQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFVuYW5ub3RhdGVkSmF2YUF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQpOwotCi0JQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCk7Ci0KLQlKcHRWYWxpZGF0b3IgYnVpbGRBdHRyaWJ1dGVWYWxpZGF0b3IoUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBQZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0Njc2YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1wdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkZWZpbml0aW9uJ3MgbWFwcGluZyBpcyB0aGUgImRlZmF1bHQiIG1hcHBpbmcgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZS4KLQkgKi8KLQlib29sZWFuIGlzRGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXJGaWxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmFyRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzE4NjJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXJGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVudFR5cGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBBIEpBUiBmaWxlIGlkZW50aWZpZWQgYnkgYSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IDxjb2RlPmphci1maWxlPC9jb2RlPiBlbGVtZW50LgotICogVGhpcyBob2xkcyBwZXJzaXN0ZW50IHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIHRoZSAicGVyc2lzdGFibGUiIHR5cGVzCi0gKiBkaXNjb3ZlcmVkIGluIHRoZSBKQVIuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXJGaWxlCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZSwgUGVyc2lzdGVudFR5cGVDb250YWluZXIKLXsKLQlKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGdldEphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCgpOwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgcGVyc2lzdGVudCB0eXBlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpBUiBmaWxlJ3MgSmF2YSBwZXJzaXN0ZW50IHR5cGVzLgotCSAqIFJldHVybiBvbmx5IHRoZSB0eXBlcyB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCBKUEEgYW5ub3RhdGlvbnMuCi0JICovCi0JSXRlcmFibGU8SmF2YVBlcnNpc3RlbnRUeXBlPiBnZXRKYXZhUGVyc2lzdGVudFR5cGVzKCk7Ci0JCVN0cmluZyBKQVZBX1BFUlNJU1RFTlRfVFlQRVNfQ09MTEVDVElPTiA9ICJqYXZhUGVyc2lzdGVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBKQVIgZmlsZSdzIEphdmEgcGVyc2lzdGVudCB0eXBlcy4KLQkgKi8KLQlpbnQgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZCB0byB0aGUgbGlzdCBvZiBjdXJyZW50IHZhbGlkYXRpb24gbWVzc2FnZXMKLQkgKi8KLQl2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBqYXIgZmlsZSBleGlzdHMgaW4gdGhlIGdpdmVuIGZvbGRlcgotCSAqLwotCWJvb2xlYW4gaXNJbihJRm9sZGVyIGZvbGRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZjljOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxlbT5TcGVjaWZpZWQ8L2VtPiBKYXZhIGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQXNzb2NpYXRpb25PdmVycmlkZQotCWV4dGVuZHMgSmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSwgQXNzb2NpYXRpb25PdmVycmlkZSwgSmF2YU92ZXJyaWRlCi17Ci0JSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnZlcnRUb1ZpcnR1YWwoKTsKLQotCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGdldE92ZXJyaWRlQW5ub3RhdGlvbigpOwotCi0JSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3N2RlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVfOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlOwotCi0vKioKLSAqIEphdmEgYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcgotCWV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciwgSmF2YU92ZXJyaWRlQ29udGFpbmVyCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgb3ZlcnJpZGUncyByZWxhdGlvbnNoaXAuCi0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhc3NvY2lhdGlvbiBvdmVycmlkZSBjb250YWluZXIKLQkgKiB3aGVuIGl0IGlzIGFsc28gdXNpbmcgdGhlIEphdmEgY29udGFpbmVyJ3Mgb3ZlcnJpZGUgbmFtZXMuCi0JICogQHNlZSAjZ2V0T3ZlcnJpZGVOYW1lcygpCi0JICovCi0JUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRPdmVycmlkZVJlbGF0aW9uc2hpcChTdHJpbmcgb3ZlcnJpZGVOYW1lKTsKLQotCS8vIGNvdmFyaWFudCBvdmVycmlkZXMKLQlMaXN0SXRlcmFibGU8SmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0T3ZlcnJpZGVzKCk7Ci0JSmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQlMaXN0SXRlcmFibGU8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldFNwZWNpZmllZE92ZXJyaWRlcygpOwotCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCk7Ci0JSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7Ci0JTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0VmlydHVhbE92ZXJyaWRlcygpOwotCUphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwoT3ZlcnJpZGVfIHNwZWNpZmllZE92ZXJyaWRlKTsKLQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0T3ZlcnJpZGVUb1NwZWNpZmllZChWaXJ0dWFsT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyLCBKYXZhT3ZlcnJpZGVDb250YWluZXIuT3duZXIKLQl7CQkKLQkJLy8gY29tYmluZSBpbnRlcmZhY2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1ODUxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUF0dHJpYnV0ZU1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBhcmVudCgpOwotCi0JSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCi0JSmF2YVJlc291cmNlQXR0cmlidXRlIGdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0KLQlBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0KLQlBbm5vdGF0aW9uIGdldEFubm90YXRpb25Gb3JVcGRhdGUoKTsKLQotCXZvaWQgdXBkYXRlRGVmYXVsdCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDM1YjcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci0KLS8qKgotICogTWFwIGEgc3RyaW5nIGtleSB0byBhbiBhdHRyaWJ1dGUgbWFwcGluZyBhbmQgaXRzIGNvcnJlc3BvbmRpbmcKLSAqIEphdmEgYW5ub3RhdGlvbnMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlIG1hcHBpbmcncyBrZXkuCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgbWFwcGluZydzIGFubm90YXRpb24uCi0JICovCi0JU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBhdHRyaWJ1dGUgbWFwcGluZydzICJzdXBwb3J0aW5nIiBhbm5vdGF0aW9ucy4KLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBkZWZpbml0aW9uJ3MgbWFwcGluZyBpcwotCSAqIHRoZSAic3BlY2lmaWVkIiBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlLgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IEEgbWFwcGluZyBpcyBub3QgbmVjZXNzYXJpbHkgInNwZWNpZmllZCIgaWYgaXRzCi0JICogYW5ub3RhdGlvbiBpcyBwcmVzZW50Ci0JICogKHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wI2lzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKX0pCi0JICovCi0JYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZS4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBmYWN0b3J5IGZvciBjcmVhdGlvbiBzbyBleHRlbmRlcnMgY2FuIHNpbXBseSBvdmVycmlkZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBmYWN0b3J5IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogc2FtZSBrZXkuCi0JICovCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEpwYUZhY3RvcnkgZmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTkyZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxlbT5TcGVjaWZpZWQ8L2VtPiBKYXZhIGF0dHJpYnV0ZSBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlCi0JZXh0ZW5kcyBKYXZhUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSwgQXR0cmlidXRlT3ZlcnJpZGUsIEphdmFPdmVycmlkZQotewotCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgY29udmVydFRvVmlydHVhbCgpOwotCi0JQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGdldE92ZXJyaWRlQW5ub3RhdGlvbigpOwotCi0JSmF2YUNvbHVtbiBnZXRDb2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5Y2ZkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZV87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlOwotCi0vKioKLSAqIEphdmEgYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgSmF2YU92ZXJyaWRlQ29udGFpbmVyCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgb3ZlcnJpZGUncyBjb2x1bW4uCi0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyCi0JICogd2hlbiBpdCBpcyBhbHNvIHVzaW5nIHRoZSBKYXZhIGNvbnRhaW5lcidzIG92ZXJyaWRlIG5hbWVzLgotCSAqIEBzZWUgI2dldE92ZXJyaWRlTmFtZXMoKQotCSAqLwotCVJlYWRPbmx5Q29sdW1uIGdldE92ZXJyaWRlQ29sdW1uKFN0cmluZyBvdmVycmlkZU5hbWUpOwotCi0JLy8gY292YXJpYW50IG92ZXJyaWRlcwotCUxpc3RJdGVyYWJsZTxKYXZhUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0T3ZlcnJpZGVzKCk7Ci0JSmF2YVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZ2V0T3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7Ci0JTGlzdEl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCk7Ci0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCUxpc3RJdGVyYWJsZTxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRWaXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBjb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwoT3ZlcnJpZGVfIHNwZWNpZmllZE92ZXJyaWRlKTsKLQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgY29udmVydE92ZXJyaWRlVG9TcGVjaWZpZWQoVmlydHVhbE92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBvd25lciAqKioqKioqKioqCi0KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciwgSmF2YU92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewkJCi0JCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2VDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EyZDFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNlQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGNvbHVtbiBvciBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUJhc2VDb2x1bW4KLQlleHRlbmRzIEJhc2VDb2x1bW4sIEphdmFOYW1lZENvbHVtbiwgSmF2YVJlYWRPbmx5QmFzZUNvbHVtbgotewotCUJhc2VDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNTQwNWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlRW1iZWRkZWRNYXBwaW5nOwotCi0vKioKLSAqIEJlaGF2aW9yIGNvbW1vbiB0byBKYXZhIGVtYmVkZGVkIGFuZCBlbWJlZGRlZCBJRCBtYXBwaW5ncy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nCi0JZXh0ZW5kcyBCYXNlRW1iZWRkZWRNYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZwotewotCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFCYXNlSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDNlZWFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzZUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotCi0vKioKLSAqIEphdmEgam9pbiBjb2x1bW4gb3IgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFCYXNlSm9pbkNvbHVtbgotCWV4dGVuZHMgQmFzZUpvaW5Db2x1bW4sIEphdmFOYW1lZENvbHVtbiwgSmF2YVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4KLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQ4MDM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgYmFzaWMgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUJhc2ljTWFwcGluZwotCWV4dGVuZHMgQmFzaWNNYXBwaW5nLCBKYXZhQ29sdW1uTWFwcGluZywgSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCUJhc2ljQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUNhc2NhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNTYyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUNhc2NhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci0KLS8qKgotICogSmF2YSBjYXNjYWRlIChwZXJzaXN0LCBtZXJnZSwgcmVtb3ZlLCByZWZyZXNoKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNhc2NhZGUKLQlleHRlbmRzIENhc2NhZGUsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUNvbGxlY3Rpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUNvbGxlY3Rpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGE0ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb2xsZWN0aW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sbGVjdGlvbk1hcHBpbmc7Ci0KLS8qKgotICogSlBBIEphdmEgY29sbGVjdGlvbiBtYXBwaW5nIChlLmcuIDE6bSwgbTptLCBlbGVtZW50IGNvbGxlY3Rpb24pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFDb2xsZWN0aW9uTWFwcGluZwotCWV4dGVuZHMgQ29sbGVjdGlvbk1hcHBpbmcsIEphdmFBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JSmF2YU9yZGVyYWJsZSBnZXRPcmRlcmFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODZmYzc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQ29sdW1uCi0JZXh0ZW5kcyBDb2x1bW4sIEphdmFCYXNlQ29sdW1uCi17Ci0JQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIEphdmFSZWFkT25seUJhc2VDb2x1bW4uT3duZXIKLQl7Ci0JCUNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCXZvaWQgcmVtb3ZlQ29sdW1uQW5ub3RhdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb2x1bW5NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNGYzZmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb2x1bW5NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotCi0vKioKLSAqIEphdmEgY29sdW1uIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFDb2x1bW5NYXBwaW5nCi0JZXh0ZW5kcyBDb2x1bW5NYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZywgSmF2YUNvbHVtbi5Pd25lcgotewotCUphdmFDb2x1bW4gZ2V0Q29sdW1uKCk7Ci19IApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYTczNTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLS8qKgotICogSmF2YSBjb252ZXJ0ZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFDb252ZXJ0ZXIKLQlleHRlbmRzIENvbnZlcnRlciwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCk7Ci0KLQlBbm5vdGF0aW9uIGdldENvbnZlcnRlckFubm90YXRpb24oKTsKLQotCS8qKgotCSAqIEFsbG93IHRoZSBjb252ZXJ0ZXIgdG8gY2xlYW4gdXAgYW55IHJlbGF0ZWQgYW5ub3RhdGlvbnMgYmVmb3JlIGl0IGlzCi0JICogcmVtb3ZlZCBpdHNlbGYuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci0KLQotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgYSBjb252ZXJ0aWJsZSBtYXBwaW5nIHRvIGludGVyYWN0IHdpdGggdmFyaW91cwotCSAqIEphdmEgY29udmVydGVycyB2aWEgdGhlIHNhbWUgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBBZGFwdGVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0eXBlIG9mIGNvbnZlcnRlciBoYW5kbGVkIGJ5IHRoZSBhZGFwdGVyLgotCQkgKi8KLQkJQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBCdWlsZCBhIGNvbnZlcnRlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgbWFwcGluZwotCQkgKiBpZiB0aGUgbWFwcGluZydzIHJlc291cmNlIGF0dHJpYnV0ZSBpcyBtb2RpZmllZCBieSB0aGUgYWRhcHRlcidzCi0JCSAqIGNvbnZlcnRlciBhbm5vdGF0aW9uLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCQkgKiBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgYSBjb252ZXJ0ZXIgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUKLQkJICogY29udmVydGVyJ3MgbWFwcGluZy4KLQkJICovCi0JCUphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGFkYXB0ZXIncyBjb252ZXJ0ZXIgYW5ub3RhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBKYXZhCi0JCSAqIHJlc291cmNlIHBlcnNpc3RlbnQgbWVtYmVyLgotCQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFkYXB0ZXIncyBjb252ZXJ0ZXIgYW5ub3RhdGlvbiBpcwotCQkgKiBtaXNzaW5nLiAKLQkJICogVGhlIHJldHVybmVkIGNvbnZlcnRlciBhbm5vdGF0aW9uIGlzIGNvbXBhcmVkIHRvIHRoZSBwYXJlbnQncwotCQkgKiBjb252ZXJ0ZXIncyBjb252ZXJ0ZXIgYW5ub3RhdGlvbiB3aGlsZSB0aGUgY29udGV4dCBtb2RlbCBpcyBzeW5jaHJvbml6ZWQKLQkJICogd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwuIElmIGl0IGhhcyBjaGFuZ2VkLCB0aGUgcGFyZW50IHdpbGwgYnVpbGQKLQkJICogYSBuZXcgY29udmVydGVyICh2aWEgdGhlIGFkYXB0ZXIpLgotCQkgKiAKLQkJICogQHNlZSAjYnVpbGRDb252ZXJ0ZXIoQW5ub3RhdGlvbiwgSmF2YUF0dHJpYnV0ZU1hcHBpbmcsIEpwYUZhY3RvcnkpCi0JCSAqLwotCQlBbm5vdGF0aW9uIGdldENvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci0KLQkJLyoqCi0JCSAqIEJ1aWxkIGEgY29udmVydGVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIGFubm90YXRpb24uCi0JCSAqIFRoaXMgaXMgdXNlZCB3aGVuIHRoZSBjb250ZXh0IG1vZGVsIGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZQotCQkgKiByZXNvdXJjZSBtb2RlbCAoYW5kIHRoZSByZXNvdXJjZSBtb2RlbCBoYXMgY2hhbmdlZCkuCi0JCSAqIAotCQkgKiBAc2VlICNnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUpCi0JCSAqLwotCQlKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKEFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiwgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpOwotCi0JCS8qKgotCQkgKiBCdWlsZCBhIG5ldyBjb252ZXJ0ZXIgYW5kLCBpZiBuZWNlc3NhcnksIGl0cyBjb3JyZXNwb25kaW5nIGNvbnZlcnRlcgotCQkgKiBhbm5vdGF0aW9uLgotCQkgKi8KLQkJSmF2YUNvbnZlcnRlciBidWlsZE5ld0NvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgYWRhcHRlcidzIGNvbnZlcnRlciBhbm5vdGF0aW9uIGZyb20gdGhlIHNwZWNpZmllZAotCQkgKiBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgbWVtYmVyLgotCQkgKi8KLQkJdm9pZCByZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWJzdHJhY3QgYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0QWRhcHRlcgotCQlpbXBsZW1lbnRzIEphdmFDb252ZXJ0ZXIuQWRhcHRlcgotCXsKLQkJcHVibGljIEphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q29udmVydGVyQW5ub3RhdGlvbihwYXJlbnQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCBwYXJlbnQsIGZhY3RvcnkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGdldENvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUNvbnZlcnRlciBidWlsZE5ld0NvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRDb252ZXJ0ZXIodGhpcy5idWlsZENvbnZlcnRlckFubm90YXRpb25JZk5lY2Vzc2FyeShwYXJlbnQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSksIHBhcmVudCwgZmFjdG9yeSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBidWlsZENvbnZlcnRlckFubm90YXRpb25JZk5lY2Vzc2FyeShKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkvLyB0aGUgYW5ub3RhdGlvbiBtYXkgYWxyZWFkeSBiZSBwcmVzZW50LCBhZnRlciB3ZSByZW1vdmUgdGhlIG90aGVyIGNvbnZlcnRlciBhbm5vdGF0aW9ucwotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKGF0dHJpYnV0ZSk7Ci0JCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5idWlsZENvbnZlcnRlckFubm90YXRpb24oYXR0cmlidXRlKTsKLQkJfQotCi0JCXByb3RlY3RlZCBBbm5vdGF0aW9uIGJ1aWxkQ29udmVydGVyQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlLmFkZEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnZlcnRlckFubm90YXRpb24oSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJYXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPd25lciBidWlsZE93bmVyKCkgewotCQkJcmV0dXJuIG5ldyBPd25lcigpIHsKLQkJCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQkJCXJldHVybiBKcHRWYWxpZGF0b3IuTnVsbC5pbnN0YW5jZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb252ZXJ0aWJsZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhQ29udmVydGlibGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZjliZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFDb252ZXJ0aWJsZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGlibGVNYXBwaW5nOwotCi0vKioKLSAqIEphdmEgYXR0cmlidXRlIG1hcHBpbmcgdGhhdCBoYXMgYSBjb252ZXJ0ZXIgKGUuZy4gYmFzaWMsIElELCB2ZXJzaW9uKS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotCWV4dGVuZHMgQ29udmVydGlibGVNYXBwaW5nLCBKYXZhQXR0cmlidXRlTWFwcGluZwotewotCUphdmFDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTVmMGZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRGlzY3JpbWluYXRvckNvbHVtbgotCWV4dGVuZHMgRGlzY3JpbWluYXRvckNvbHVtbiwgSmF2YU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotewotCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKTsKLQkJCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgSmF2YVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyCi0JewotCQkvLyBjb21iaW5lIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDBmY2E2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhRW1iZWRkYWJsZQotCWV4dGVuZHMgRW1iZWRkYWJsZSwgSmF2YVR5cGVNYXBwaW5nCi17Ci0JRW1iZWRkYWJsZUFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYwNjZiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGVtYmVkZGVkIElEIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFbWJlZGRlZElkTWFwcGluZwotCWV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmcsIEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nCi17Ci0JRW1iZWRkZWRJZEFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjY2MzFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgZW1iZWRkZWQgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVtYmVkZGVkTWFwcGluZyAKLQlleHRlbmRzIEVtYmVkZGVkTWFwcGluZywgSmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcKLXsKLQlFbWJlZGRlZEFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTMzNDRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGVudGl0eQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVudGl0eQotCWV4dGVuZHMgRW50aXR5LCBKYXZhVHlwZU1hcHBpbmcKLXsKLQlFbnRpdHlBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0KLQlKYXZhVGFibGUgZ2V0VGFibGUoKTsKLQkKLQlKYXZhSWRDbGFzc1JlZmVyZW5jZSBnZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCi0JSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQotCi0JLy8gKioqKioqKioqKiBzZWNvbmRhcnkgdGFibGVzICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxKYXZhU2Vjb25kYXJ5VGFibGU+IGdldFNlY29uZGFyeVRhYmxlcygpOwkKLQlMaXN0SXRlcmFibGU8SmF2YVNlY29uZGFyeVRhYmxlPiBnZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQlKYXZhU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKTsKLQlKYXZhU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KTsKLQkKLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCUxpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJU3RyaW5nIERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUFJPUEVSVFkgPSAiZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnRhaW5lcnMgKioqKioqKioqKgotCi0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCUphdmFRdWVyeUNvbnRhaW5lciBnZXRRdWVyeUNvbnRhaW5lcigpOwotCUphdmFHZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW51bWVyYXRlZENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODdjNTMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhRW51bWVyYXRlZENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGVudW1lcmF0ZWQgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFFbnVtZXJhdGVkQ29udmVydGVyCi0JZXh0ZW5kcyBFbnVtZXJhdGVkQ29udmVydGVyLCBKYXZhQ29udmVydGVyCi17Ci0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQWRhcHRlcgotCQlleHRlbmRzIEphdmFDb252ZXJ0ZXIuQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQkJcmV0dXJuIEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24sIEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbnVtZXJhdGVkQ29udmVydGVyKHBhcmVudCwgKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSBjb252ZXJ0ZXJBbm5vdGF0aW9uLCB0aGlzLmJ1aWxkT3duZXIoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MzQ5NWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0ZWRWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgZ2VuZXJhdGVkIHZhbHVlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhR2VuZXJhdGVkVmFsdWUKLQlleHRlbmRzIEdlbmVyYXRlZFZhbHVlLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2V0R2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSBnZW5lcmF0b3IuCi0JICovCi0JVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzOTVhZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRvckFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBzZXF1ZW5jZSBhbmQgdGFibGUgZ2VuZXJhdG9ycwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUdlbmVyYXRvciAKLQlleHRlbmRzIEdlbmVyYXRvciwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JR2VuZXJhdG9yQW5ub3RhdGlvbiBnZXRHZW5lcmF0b3JBbm5vdGF0aW9uKCk7Ci0KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0b3JDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MTVkY2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0b3JDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotCi0vKioKLSAqIEphdmEgZ2VuZXJhdG9yIGNvbnRhaW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUdlbmVyYXRvckNvbnRhaW5lcgotCWV4dGVuZHMgR2VuZXJhdG9yQ29udGFpbmVyLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIHNlcXVlbmNlIGdlbmVyYXRvciAqKioqKioqKioqCi0KLQlKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIGdlbmVyYXRvciAqKioqKioqKioqCi0JCi0JSmF2YVRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQlKYXZhVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKTsKLQotCWludGVyZmFjZSBPd25lcgotCXsKLQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBnZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUlkQ2xhc3NSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSWRDbGFzc1JlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjEyMTRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSWRDbGFzc1JlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkQ2xhc3NSZWZlcmVuY2U7Ci0KLS8qKgotICogSmF2YSBJRCBjbGFzcyByZWZlcmVuY2UKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFJZENsYXNzUmVmZXJlbmNlCi0JZXh0ZW5kcyBJZENsYXNzUmVmZXJlbmNlLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBpZCBjbGFzcywgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBhcHBsaWNhYmxlCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkSWRDbGFzc05hbWUoKTsKLQkJU3RyaW5nIEZVTExZX1FVQUxJRklFRF9JRF9DTEFTU19QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZElkQ2xhc3MiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZlODJmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIElEIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFJZE1hcHBpbmcKLQlleHRlbmRzIElkTWFwcGluZywgSmF2YUNvbHVtbk1hcHBpbmcsIEphdmFDb252ZXJ0aWJsZU1hcHBpbmcsIEphdmFHZW5lcmF0b3JDb250YWluZXIuT3duZXIKLXsKLQlJZEFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQotCUphdmFHZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7Ci0KLQlKYXZhR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQlKYXZhR2VuZXJhdGVkVmFsdWUgYWRkR2VuZXJhdGVkVmFsdWUoKTsKLX0gCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDU1ZWFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db21wbGV0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFKb2luQ29sdW1uCi0JZXh0ZW5kcyBKb2luQ29sdW1uLCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLCBKYXZhQmFzZUpvaW5Db2x1bW4sIEphdmFCYXNlQ29sdW1uCi17Ci0JQ29tcGxldGVKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDJiYzE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEphdmEgam9pbiBjb2x1bW4gcmVsYXRpb25zaGlwICgxOjEsIDE6bSwgbToxLCBhbmQgYXNzb2NpYXRpb24gb3ZlcnJpZGUpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotCWV4dGVuZHMgSm9pbkNvbHVtblJlbGF0aW9uc2hpcCwgSmF2YVJlbGF0aW9uc2hpcAotewotCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y1ZTVkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogSmF2YSBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBKYXZhUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0KLQlMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JSmF2YUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCUphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKTsKLQlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQlKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NjQ0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgam9pbiB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5UYWJsZQotCWV4dGVuZHMgSm9pblRhYmxlLCBKYXZhUmVmZXJlbmNlVGFibGUKLXsKLQlKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UGFyZW50KCk7Ci0KLQlKb2luVGFibGVBbm5vdGF0aW9uIGdldFRhYmxlQW5ub3RhdGlvbigpOwotCi0KLQkvLyAqKioqKioqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0KLQlMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCUphdmFKb2luQ29sdW1uIGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKTsKLQlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JSmF2YUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQxOGE3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSmF2YSBqb2luIHRhYmxlIHJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSwgbTptKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgSm9pblRhYmxlUmVsYXRpb25zaGlwLCBKYXZhUmVsYXRpb25zaGlwCi17Ci0JSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YzkxMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgam9pbiB0YWJsZSByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3ksIEphdmFSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCUphdmFKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBqb2luIHRhYmxlIGFubm90YXRpb24sIHVzZSBhIG51bGwgb2JqZWN0IGluc3RlYWQgb2YgcmV0dXJuaW5nIG51bGwKLQkgKiBpZiB0aGUgam9pbiB0YWJsZSBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0LgotCSAqLwotCUpvaW5UYWJsZUFubm90YXRpb24gZ2V0Sm9pblRhYmxlQW5ub3RhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFKcGFDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFKcGFDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhmNTc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhSnBhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIEpQQSBjb250ZXh0IG5vZGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSnBhQ29udGV4dE5vZGUKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIGNvZGUtY29tcGxldGlvbiBwcm9wb3NhbHMgZm9yIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KLQkgKiBpbiB0aGUgc291cmNlIGNvZGUuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIGxpc3Qgb2YgY3VycmVudCB2YWxpZGF0aW9uIG1lc3NhZ2VzCi0JICovCi0Jdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUxvYkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFMb2JDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4YzIxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YUxvYkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTG9iQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBMT0IgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFMb2JDb252ZXJ0ZXIKLQlleHRlbmRzIExvYkNvbnZlcnRlciwgSmF2YUNvbnZlcnRlcgotewotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFkYXB0ZXIKLQkJZXh0ZW5kcyBKYXZhQ29udmVydGVyLkFic3RyYWN0QWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBBZGFwdGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCXByaXZhdGUgQWRhcHRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJCXJldHVybiBMb2JDb252ZXJ0ZXIuY2xhc3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKEFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiwgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YUxvYkNvbnZlcnRlcihwYXJlbnQsIChMb2JBbm5vdGF0aW9uKSBjb252ZXJ0ZXJBbm5vdGF0aW9uLCB0aGlzLmJ1aWxkT3duZXIoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMjU0NGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBtOm0gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hbnlUb01hbnlNYXBwaW5nCi0JZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZywgSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZwotewotCU1hbnlUb01hbnlBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCi0JTWFueVRvTWFueUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbkZvclVwZGF0ZSgpOwotCQotCUphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjYWVmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBKYXZhIG06bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBNYW55VG9NYW55UmVsYXRpb25zaGlwLAotCQlKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXAsIAotCQlKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzdkYjNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgbToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNYW55VG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nLCBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotewotCU1hbnlUb09uZUFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkKLQlKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDZhZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEphdmEgbToxIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgTWFueVRvT25lUmVsYXRpb25zaGlwLAotCQlKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwZWRCeVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwZWRCeVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdmZWM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgIm1hcHBlZCBieSIgcmVsYXRpb25zaGlwICgxOjEsIDE6bSwgbTptKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBNYXBwZWRCeVJlbGF0aW9uc2hpcCwgSmF2YVJlbGF0aW9uc2hpcAotewotCUphdmFNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQotCU93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCi0JT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2IzMzU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotCi0vKioKLSAqIEphdmEgIm1hcHBlZCBieSIgcmVsYXRpb25zaGlwIHN0cmF0ZWd5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzkxNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgbWFwcGVkIHN1cGVyY2xhc3MKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNYXBwZWRTdXBlcmNsYXNzCi0JZXh0ZW5kcyBNYXBwZWRTdXBlcmNsYXNzLCBKYXZhVHlwZU1hcHBpbmcKLXsKLQlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCi0JSmF2YUlkQ2xhc3NSZWZlcmVuY2UgZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCi0JSmF2YVF1ZXJ5Q29udGFpbmVyIGdldFF1ZXJ5Q29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmNiYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLS8qKgotICogSmF2YSBtYXBwaW5nIGpvaW4gY29sdW1uIHJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcCwKLQkJSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTBmMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotLyoqCi0gKiBKYXZhIG1hcHBpbmcgam9pbiB0YWJsZSByZWxhdGlvbnNoaXAgKDE6MSwgMTptLCBtOjEsIG06bSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXAsCi0JCUphdmFNYXBwaW5nUmVsYXRpb25zaGlwCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDdjODI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEphdmEgbWFwcGluZyByZWxhdGlvbnNoaXAgKDE6MSwgMTptLCBtOjEsIG06bSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXAKLQlleHRlbmRzIE1hcHBpbmdSZWxhdGlvbnNoaXAsIEphdmFSZWxhdGlvbnNoaXAKLXsKLQlKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjZWIzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotCi0vKioKLSAqIEphdmEgbXVsdGktdmFsdWVkIHJlbGF0aW9uc2hpcCAoMTptLCBtOm0pIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0JZXh0ZW5kcyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcsIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLCBKYXZhQ29sbGVjdGlvbk1hcHBpbmcKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmJjYTRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhCi0gKiA8dWw+Ci0gKiA8bGk+Y29sdW1uCi0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDxsaT5wcmltYXJ5IGtleSBqb2luIGNvbHVtbgotICogPGxpPmRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8bGk+b3JkZXIgY29sdW1uCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFOYW1lZENvbHVtbgotCWV4dGVuZHMgTmFtZWRDb2x1bW4sIEphdmFSZWFkT25seU5hbWVkQ29sdW1uCi17Ci0JTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmJmZTczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLS8qKgotICogSmF2YSBuYW1lZCBkaXNjcmltaW5hdG9yIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotCWV4dGVuZHMgTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLCBKYXZhTmFtZWRDb2x1bW4KLXsKLQkvL2NvbWJpbmluZyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU5hbWVkTmF0aXZlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTgxYWZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIG5hbWVkIG5hdGl2ZSBxdWVyeQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU5hbWVkTmF0aXZlUXVlcnkKLQlleHRlbmRzIE5hbWVkTmF0aXZlUXVlcnksIEphdmFRdWVyeQotewotCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGdldFF1ZXJ5QW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogSWYgdGhlIHJlc3VsdCBjbGFzcyBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCByZXR1cm4gaXQgZnVsbHkgcXVhbGlmaWVkLiBJZiBub3QKLQkgKiBzcGVjaWZpZWQsIHRoZW4gaXQgd2lsbCByZXR1cm4gbnVsbAotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfUkVTVUxUX0NMQVNTX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhTmFtZWRRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMGI0OWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgbmFtZWQgcXVlcnkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFOYW1lZFF1ZXJ5Ci0JZXh0ZW5kcyBOYW1lZFF1ZXJ5LCBKYXZhUXVlcnkKLXsKLQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBnZXRRdWVyeUFubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNjQ2MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSAxOm0gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU9uZVRvTWFueU1hcHBpbmcKLQlleHRlbmRzIE9uZVRvTWFueU1hcHBpbmcsIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlPbmVUb01hbnlBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCi0JT25lVG9NYW55QW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uRm9yVXBkYXRlKCk7Ci0JCi0JSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWIwNjRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBKYXZhIDE6bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIE9uZVRvTWFueVJlbGF0aW9uc2hpcCwKLQkJSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwLAotCQlKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4ZDk2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIDE6MSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmcsIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JT25lVG9PbmVBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCi0JT25lVG9PbmVBbm5vdGF0aW9uIGdldEFubm90YXRpb25Gb3JVcGRhdGUoKTsKLQkKLQlKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzE1Y2NmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSmF2YSAxOjEgcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIE9uZVRvT25lUmVsYXRpb25zaGlwLAotCQlKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXAsIAotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAsCi0JCUphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU9yZGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPcmRlcmFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE1YzA0Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU9yZGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3JkZXJhYmxlOwotCi0vKioKLSAqIE11bHRpLXZhbHVlZCAoMTptLCBtOm0pIHJlbGF0aW9uc2hpcCBtYXBwaW5ncyBzdXBwb3J0IG9yZGVyaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU9yZGVyYWJsZQotCWV4dGVuZHMgT3JkZXJhYmxlLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQlKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjY2QzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZV87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3ZlcnJpZGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxlbT5TcGVjaWZpZWQ8L2VtPiBKYXZhIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT3ZlcnJpZGUKLQlleHRlbmRzIE92ZXJyaWRlXywgSmF2YVJlYWRPbmx5T3ZlcnJpZGUKLXsKLQlPdmVycmlkZUFubm90YXRpb24gZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0KLQkvLyBjb3ZhcmlhbnQgb3ZlcnJpZGVzCi0JSmF2YVZpcnR1YWxPdmVycmlkZSBjb252ZXJ0VG9WaXJ0dWFsKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YU92ZXJyaWRlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDBjMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlXzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGU7Ci0KLS8qKgotICogSmF2YSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT3ZlcnJpZGVDb250YWluZXIKLQlleHRlbmRzIE92ZXJyaWRlQ29udGFpbmVyLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgY29udGFpbmVyJ3Mgb3ZlcnJpZGVzLCBzcGVjaWZpZWQgYW5kIHZpcnR1YWwuCi0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvdmVycmlkZSBjb250YWluZXIgc28gYW55Ci0JICogaW52YWxpZCBKYXZhIG92ZXJyaWRlcyAoaS5lLiBvdmVycmlkZXMgZm9yIGEgbm9uLWV4aXN0ZW50IG9yCi0JICogbm9uLW92ZXJyaWRhYmxlIGF0dHJpYnV0ZXMpIGFyZSBpbmNsdWRlZCBhbW9uZyB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4KLQkgKiB2aXJ0dWFsIG92ZXJyaWRlcy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUVudGl0eS5PdmVycmlkZUNvbnRhaW5lck93bmVyI2dldEphdmFPdmVycmlkZU5hbWVzKCkKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldE92ZXJyaWRlTmFtZXMoKTsKLQotCS8vIGNvdmFyaWFudCBvdmVycmlkZXMKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEphdmFSZWFkT25seU92ZXJyaWRlPiBnZXRPdmVycmlkZXMoKTsKLQlKYXZhUmVhZE9ubHlPdmVycmlkZSBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEphdmFPdmVycmlkZT4gZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JSmF2YU92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCk7Ci0JSmF2YU92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgSmF2YVZpcnR1YWxPdmVycmlkZT4gZ2V0VmlydHVhbE92ZXJyaWRlcygpOwotCUphdmFWaXJ0dWFsT3ZlcnJpZGUgY29udmVydE92ZXJyaWRlVG9WaXJ0dWFsKE92ZXJyaWRlXyBzcGVjaWZpZWRPdmVycmlkZSk7Ci0JSmF2YU92ZXJyaWRlIGNvbnZlcnRPdmVycmlkZVRvU3BlY2lmaWVkKFZpcnR1YWxPdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIE92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewotCQlKYXZhUmVzb3VyY2VNZW1iZXIgZ2V0UmVzb3VyY2VNZW1iZXIoKTsKLQotCQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODYxODJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBhc3NvY2lhdGlvbiBvdmVycmlkZSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFPdmVycmlkZVJlbGF0aW9uc2hpcCAKLQlleHRlbmRzIE92ZXJyaWRlUmVsYXRpb25zaGlwLAotCQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLXsKLQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBnZXRPdmVycmlkZUFubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzEwZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLQotLyoqCi0gKiBDb250ZXh0IEphdmEgcGVyc2lzdGVudCA8ZW0+YXR0cmlidXRlPC9lbT4gKGZpZWxkIG9yIHByb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlCi0JZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIGNvdmFyaWFudCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpOwotCi0JSmF2YUF0dHJpYnV0ZU1hcHBpbmcgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KTsKLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzb3IoZmllbGQvcHJvcGVydHkpIGZvciB0aGUgYXR0cmlidXRlCi0JICovCi0JQWNjZXNzb3IgZ2V0QWNjZXNzb3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29ycmVzcG9uZGluZyA8ZW0+cmVzb3VyY2U8L2VtPiBhdHRyaWJ1dGUuIAotCSAqIFRoaXMgaXMgdGhlIGF0dHJpYnV0ZSAoZmllbGQvbWV0aG9kKSB0aGF0IGlzIGFubm90YXRlZC4KLQkgKiBAc2VlIEFjY2Vzc29yI2dldFJlc291cmNlQXR0cmlidXRlKCkKLQkgKi8KLQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIEBzZWUgQWNjZXNzb3IjaXNGb3IoSmF2YVJlc291cmNlRmllbGQpCi0JICovCi0JYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKTsKLQotCS8qKgotCSAqIEBzZWUgQWNjZXNzb3IjaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kLCBKYXZhUmVzb3VyY2VNZXRob2QpCi0JICovCi0JYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBnaXZlbiBvZmZzZXQgaW50byBpdHMgSmF2YQotCSAqIHNvdXJjZSBjb2RlIGZpbGUuCi0JICovCi0JYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGVtYmVkZGFibGUgKHR5cGUgbWFwcGluZykgY29ycmVzcG9uZGluZyB0byB0aGUgcGVyc2lzdGVudAotCSAqIGF0dHJpYnV0ZSdzIHR5cGUuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBub3QgZm91bmQuCi0JICovCi0JRW1iZWRkYWJsZSBnZXRFbWJlZGRhYmxlKCk7Ci0KLQkvLyAqKioqKioqKioqIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGF0dHJpYnV0ZSdzIHR5cGUgaXMgdmFsaWQgZm9yIGEgZGVmYXVsdCBiYXNpYyBtYXBwaW5nLgotCSAqLwotCWJvb2xlYW4gdHlwZUlzQmFzaWMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgdHlwZSBuYW1lIGlmIGl0IGlzIHZhbGlkIGFzIGEgdGFyZ2V0IHR5cGUKLQkgKiAoaS5lLiB0aGUgdHlwZSBpcyBuZWl0aGVyIGFuIGFycmF5IG5vciBhICJjb250YWluZXIiKS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2luZ2xlUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIElmIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGlzIGFuIGFwcHJvcHJpYXRlICJjb250YWluZXIiIHR5cGUsCi0JICogcmV0dXJuIHRoZSB0eXBlIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgdGFyZ2V0IHR5cGUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgYSBjb250YWluZXIgb3IgaWYgdGhlIHR5cGUKLQkgKiBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkIGFzIGEgdGFyZ2V0IHR5cGUgKGkuZS4gaXQgaXMgZWl0aGVyCi0JICogYW4gYXJyYXkgb3IgYSAiY29udGFpbmVyIikuCi0JICovCi0JU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIElmIHRoZSBhdHRyaWJ1dGUncyB0eXBlIGlzIGEgbWFwIHR5cGUsCi0JICogcmV0dXJuIHRoZSB0eXBlIHBhcmFtZXRlciB0aGF0IGNhbiBiZSB1c2VkIGFzIGEga2V5IHR5cGUuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgYSBtYXAgb3IgaWYgdGhlIHR5cGUKLQkgKiBwYXJhbWV0ZXIgaXMgbm90IHZhbGlkIGFzIGEga2V5IHR5cGUgKGkuZS4gaXQgaXMgZWl0aGVyCi0JICogYW4gYXJyYXkgb3IgYSAiY29udGFpbmVyIikuCi0JICovCi0JU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlTWFwS2V5VHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSnBhQ29udGFpbmVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBhdHRyaWJ1dGUncyB0eXBlLgotCSAqIFJldHVybiBhIG51bGwgaW1wbGVtZW50YXRpb24gaWYgdGhlIHR5cGUgaXMgbm90IGEgY29udGFpbmVyIChtYXAgb3IgY29sbGVjdGlvbikKLQkgKi8KLQlKcGFDb250YWluZXJEZWZpbml0aW9uIGdldEpwYUNvbnRhaW5lckRlZmluaXRpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBKUEEgY29udGFpbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEpQQSBjb250YWluZXIgZGVmaW5pdGlvbiBpbnRlcmZhY2UgKGFuZCBudWxsIGltcGxlbWVudGF0aW9uKQotCSAqLwotCWludGVyZmFjZSBKcGFDb250YWluZXJEZWZpbml0aW9uIHsKLQkJYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKFN0cmluZyB0eXBlTmFtZSk7Ci0JCWJvb2xlYW4gaXNDb250YWluZXIoKTsKLQkJYm9vbGVhbiBpc01hcCgpOwotCQlTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZShKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZShKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpOwotCQlTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCQlTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRNYXBLZXlUeXBlTmFtZShDb2xsZWN0aW9uTWFwcGluZyBtYXBwaW5nKTsKLQotCQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgSnBhQ29udGFpbmVyRGVmaW5pdGlvbiB7Ci0JCQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYUNvbnRhaW5lckRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQkJcHVibGljIHN0YXRpYyBKcGFDb250YWluZXJEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQkJCXJldHVybiBJTlNUQU5DRTsKLQkJCX0KLQkJCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJCXByaXZhdGUgTnVsbCgpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlRnJvbShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc01hcCgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlTWFwS2V5VHlwZU5hbWUoSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIEpQQTJfMC5DT0xMRUNUSU9OX0FUVFJJQlVURTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRNYXBLZXlUeXBlTmFtZShDb2xsZWN0aW9uTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIEpwYUNvbnRhaW5lckRlZmluaXRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIi5OdWxsIjsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmUzYzQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotCi0vKioKLSAqIENvbnRleHQgSmF2YSBwZXJzaXN0ZW50IHR5cGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUGVyc2lzdGVudFR5cGUKLQlleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIGNvdmFyaWFudCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JSmF2YVR5cGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQkKLQlMaXN0SXRlcmFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKTsKLQkJU3RyaW5nIEFUVFJJQlVURVNfTElTVCA9ICJhdHRyaWJ1dGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIEphdmEgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFueSBhdHRyaWJ1dGUgaW4gdGhpcyBwZXJzaXN0ZW50IHR5cGUgaXMgYW5ub3RhdGVkCi0JICovCi0JYm9vbGVhbiBoYXNBbnlBbm5vdGF0ZWRBdHRyaWJ1dGVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZS4KLQkgKi8KLQlKYXZhUmVzb3VyY2VUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkKLQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSmF2YVJlc291cmNlQXR0cmlidXRlIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMDQ3MTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCWV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4sIEphdmFCYXNlSm9pbkNvbHVtbgotewotCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzQ3MTYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSmF2YSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgKDE6MSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcAotCWV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAsCi0JCUphdmFNYXBwaW5nUmVsYXRpb25zaGlwCi17Ci0JSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM1ZGZlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotLyoqCi0gKiBKYXZhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEphdmFSZWxhdGlvbnNoaXBTdHJhdGVneSwgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotewotCUxpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTNiYzM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgbmFtZWQgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFRdWVyeQotCWV4dGVuZHMgUXVlcnksIEphdmFKcGFDb250ZXh0Tm9kZQotewotCVF1ZXJ5QW5ub3RhdGlvbiBnZXRRdWVyeUFubm90YXRpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBoaW50cyAqKioqKioqKioqCi0KLQlMaXN0SXRlcmFibGU8SmF2YVF1ZXJ5SGludD4gZ2V0SGludHMoKTsKLQotCUphdmFRdWVyeUhpbnQgYWRkSGludCgpOwotCi0JSmF2YVF1ZXJ5SGludCBhZGRIaW50KGludCBpbmRleCk7Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQl2b2lkIHZhbGlkYXRlKEpwYUpwcWxRdWVyeUhlbHBlciBxdWVyeUhlbHBlciwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFRdWVyeUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFRdWVyeUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjJiYzhiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLQotLyoqCi0gKiBKYXZhIHF1ZXJ5IGNvbnRhaW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUXVlcnlDb250YWluZXIKLQlleHRlbmRzIFF1ZXJ5Q29udGFpbmVyLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIG5hbWVkIHF1ZXJpZXMgKioqKioqKioqKgotCi0JTGlzdEl0ZXJhYmxlPEphdmFOYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKTsKLQotCUphdmFOYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoKTsKLQotCUphdmFOYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoaW50IGluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBuYW1lZCBuYXRpdmUgcXVlcmllcyAqKioqKioqKioqCi0KLQlMaXN0SXRlcmFibGU8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IGdldE5hbWVkTmF0aXZlUXVlcmllcygpOwotCi0JSmF2YU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeSgpOwotCi0JSmF2YU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpOwotCi0JaW50ZXJmYWNlIE93bmVyCi0JewotCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IGdldFJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVF1ZXJ5SGludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjQ1NDgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIHF1ZXJ5IGhpbnQKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFRdWVyeUhpbnQKLQlleHRlbmRzIFF1ZXJ5SGludCwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JUXVlcnlIaW50QW5ub3RhdGlvbiBnZXRRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0KLQlib29sZWFuIGlzSWRlbnRpY2FsKFF1ZXJ5SGludCBxdWVyeUhpbnQpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYWNhOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLQotLyoqCi0gKiBKYXZhIHJlYWQtb25seSBhc3NvY2lhdGlvbiBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUsIEphdmFSZWFkT25seU92ZXJyaWRlCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTFiODI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLQotLyoqCi0gKiBSZWFkLW9ubHkgSmF2YSBhdHRyaWJ1dGUgb3ZlcnJpZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUKLQlleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUsIEphdmFSZWFkT25seU92ZXJyaWRlCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5QmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seUJhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTMwMDY1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5QmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotCi0vKioKLSAqIEphdmEgcmVhZC1vbmx5IGNvbHVtbiBvciBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVhZE9ubHlCYXNlQ29sdW1uCi0JZXh0ZW5kcyBSZWFkT25seUJhc2VDb2x1bW4sIEphdmFSZWFkT25seVRhYmxlQ29sdW1uCi17Ci0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gYmFzaWMgbWFwcGluZ3MgYW5kIGF0dHJpYnV0ZSBvdmVycmlkZXMpCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyLCBKYXZhUmVhZE9ubHlUYWJsZUNvbHVtbi5Pd25lcgotCXsKLQkJLy8gY29tYmluZSBpbnRlcmZhY2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seUJhc2VKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM5MWI3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci0KLS8qKgotICogSmF2YSByZWFkLW9ubHkgam9pbiBjb2x1bW4gb3IgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4sIEphdmFSZWFkT25seU5hbWVkQ29sdW1uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSAoYmVzdCBndWVzcykgdGV4dCBsb2NhdGlvbiBvZiB0aGUgam9pbiBjb2x1bW4ncwotCSAqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUuCi0JICovCi0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgam9pbiBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gMToxIG1hcHBpbmdzIGFuZCBqb2luIHRhYmxlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyLCBKYXZhUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLy8gY29tYmluZSBpbnRlcmZhY2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2E1YjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLQotLyoqCi0gKiBKYXZhIHJlYWQtb25seSBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbgotCWV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uLCBKYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiwgSmF2YVJlYWRPbmx5QmFzZUNvbHVtbgotewotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyLCBKYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciwgSmF2YVJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lcgotCXsKLQkJLy8gY29tYmluZSBpbnRlcmZhY2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seU5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQzMDAyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci0KLS8qKgotICogSmF2YSByZWFkLW9ubHkKLSAqIDx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8bGk+ZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxsaT5vcmRlciBjb2x1bW4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVhZE9ubHlOYW1lZENvbHVtbgotCWV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbiwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSAoYmVzdCBndWVzcykgdGV4dCBsb2NhdGlvbiBvZiB0aGUgY29sdW1uJ3MgbmFtZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiBiYXNpYyBtYXBwaW5ncyBhbmQgYXR0cmlidXRlIG92ZXJyaWRlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gb3duZXIncyB0ZXh0IHJhbmdlLiBUaGlzIGNhbiBiZSByZXR1cm5lZCBieSB0aGUKLQkJICogY29sdW1uIHdoZW4gaXRzIGFubm90YXRpb24gaXMgbm90IHByZXNlbnQuCi0JCSAqLwotCQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBiNTgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotCi0KLS8qKgotICogSmF2YSBiYXNlIGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLCBKYXZhUmVhZE9ubHlOYW1lZENvbHVtbgotewotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGRpc2NyaW1pbmF0b3IgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChidXQgcHJldHR5IG11Y2gganVzdCBlbnRpdGllcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciwgSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIKLQl7Ci0JCS8vY29tYmluaW5nIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5T3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTFlNTZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZTsKLQotLyoqCi0gKiBSZWFkLW9ubHkgSmF2YSBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVhZE9ubHlPdmVycmlkZQotCWV4dGVuZHMgUmVhZE9ubHlPdmVycmlkZSwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSAoYmVzdCBndWVzcykgdGV4dCBsb2NhdGlvbiBvZiB0aGUgb3ZlcnJpZGUncyBuYW1lLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhYWU5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEphdmEgcmVsYXRpb25zaGlwIChqb2luIGNvbHVtbiwgam9pbiB0YWJsZSwgbWFwcGVkIGJ5LCBwcmltYXJ5IGtleSBqb2luCi0gKiBjb2x1bW4sIG1hcHBpbmcpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZWFkT25seVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgUmVhZE9ubHlSZWxhdGlvbnNoaXAsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCUphdmFSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY1NjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotCi0vKioKLSAqIEphdmEgcmVhZC1vbmx5IHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JSmF2YVJlYWRPbmx5UmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5VGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJiMmQzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci0KLS8qKgotICogSmF2YSByZWFkLW9ubHkgdGFibGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlYWRPbmx5VGFibGUKLQlleHRlbmRzIFJlYWRPbmx5VGFibGUsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQlUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQlUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5VGFibGVDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlUYWJsZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODc4NjM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVhZE9ubHlUYWJsZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZUNvbHVtbjsKLQotLyoqCi0gKiBKYXZhIHJlYWQtb25seSBjb2x1bW4gb3Igam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlYWRPbmx5VGFibGVDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5VGFibGVDb2x1bW4sIEphdmFSZWFkT25seU5hbWVkQ29sdW1uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSAoYmVzdCBndWVzcykgdGV4dCBsb2NhdGlvbiBvZiB0aGUgY29sdW1uJ3MgdGFibGUuCi0JICovCi0JVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIFJlYWRPbmx5VGFibGVDb2x1bW4uT3duZXIsIEphdmFSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyCi0JewotCQkvLyBjb21iaW5lIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkMjU0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50OwotCi0vKioKLSAqIEphdmEgcmVhZC1vbmx5IHVuaXF1ZSBjb25zdHJhaW50Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQKLQlleHRlbmRzIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludCwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlZmVyZW5jZVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlZmVyZW5jZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5M2FiZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWZlcmVuY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUmVmZXJlbmNlVGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgcmVmZXJlbmNlIHRhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUmVmZXJlbmNlVGFibGUKLQlleHRlbmRzIFJlZmVyZW5jZVRhYmxlLCBKYXZhVGFibGUKLXsKLQlSZWZlcmVuY2VUYWJsZUFubm90YXRpb24gZ2V0VGFibGVBbm5vdGF0aW9uKCk7Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQotCUxpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQlKYXZhSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpOwotCUphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCUphdmFKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4Y2Q3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSmF2YSByZWxhdGlvbnNoaXAgKGpvaW4gY29sdW1uLCBqb2luIHRhYmxlLCBtYXBwZWQgYnksIHByaW1hcnkga2V5IGpvaW4KLSAqIGNvbHVtbiwgbWFwcGluZykKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFSZWxhdGlvbnNoaXAKLQlleHRlbmRzIFJlbGF0aW9uc2hpcCwgSmF2YVJlYWRPbmx5UmVsYXRpb25zaGlwCi17Ci0JSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjM2YzM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5SZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIHJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSwgbTptKSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcKLQlleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmcsIEphdmFBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQotCVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGdldEFubm90YXRpb25Gb3JVcGRhdGUoKTsKLQotCUphdmFDYXNjYWRlIGdldENhc2NhZGUoKTsKLQotCUphdmFNYXBwaW5nUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotCi0JLyoqCi0JICogSWYgdGhlIHRhcmdldCBlbnRpdHkgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgcmV0dXJuIGl0IGZ1bGx5IHF1YWxpZmllZC4KLQkgKiBJZiBub3Qgc3BlY2lmaWVkLCBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRhcmdldCBlbnRpdHksIHdoaWNoIGlzIGFsd2F5cwotCSAqIGZ1bGx5IHF1YWxpZmllZAotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpOwotCQlTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFkgPSAiZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NTg1MDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotLyoqCi0gKiBKYXZhIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBSZWxhdGlvbnNoaXBTdHJhdGVneSwgSmF2YVJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlKYXZhUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzZmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgc2Vjb25kYXJ5IHRhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFTZWNvbmRhcnlUYWJsZQotCWV4dGVuZHMgU2Vjb25kYXJ5VGFibGUsIEphdmFUYWJsZQotewotCUphdmFFbnRpdHkgZ2V0UGFyZW50KCk7Ci0KLQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gZ2V0VGFibGVBbm5vdGF0aW9uKCk7Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCUxpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwNzI3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBzZXF1ZW5jZSBnZW5lcmF0b3IKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFTZXF1ZW5jZUdlbmVyYXRvcgotCWV4dGVuZHMgSmF2YUdlbmVyYXRvciwgU2VxdWVuY2VHZW5lcmF0b3IKLXsKLQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2V0R2VuZXJhdG9yQW5ub3RhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM2ODhkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBzaW5nbGUgKG06MSwgMToxKSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotCWV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZywgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFTdHJ1Y3R1cmVOb2Rlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFTdHJ1Y3R1cmVOb2Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTViM2RlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhU3RydWN0dXJlTm9kZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVN0cnVjdHVyZU5vZGVzIAotewotCVN0cmluZyBDT01QSUxBVElPTl9VTklUX0lEID0gCi0JCUpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5qYXZhLmNvbXBpbGF0aW9uVW5pdCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX0lEID0gCi0JCUpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5qYXZhLnBlcnNpc3RlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JRCA9IAotCQlKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCArICIuamF2YS5wZXJzaXN0ZW50QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRkZTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VUYWJsZUFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVRhYmxlCi0JZXh0ZW5kcyBUYWJsZSwgSmF2YVJlYWRPbmx5VGFibGUKLXsKLQlCYXNlVGFibGVBbm5vdGF0aW9uIGdldFRhYmxlQW5ub3RhdGlvbigpOwotCi0JTGlzdEl0ZXJhYmxlPEphdmFVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCUphdmFVbmlxdWVDb25zdHJhaW50IGdldFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQlKYXZhVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KCk7Ci0JSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUYWJsZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUYWJsZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzBiODYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGVDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlQ29sdW1uOwotCi0vKioKLSAqIEphdmEgY29sdW1uIG9yIGpvaW4gY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVGFibGVDb2x1bW4KLQlleHRlbmRzIFRhYmxlQ29sdW1uLCBKYXZhUmVhZE9ubHlUYWJsZUNvbHVtbgotewotCS8vY29tYmluaW5nIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4ZGJhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSB0YWJsZSBnZW5lcmF0b3IKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFUYWJsZUdlbmVyYXRvcgotCWV4dGVuZHMgSmF2YUdlbmVyYXRvciwgVGFibGVHZW5lcmF0b3IKLXsKLQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZ2V0R2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JSXRlcmFibGU8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCi0JSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUZW1wb3JhbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUZW1wb3JhbENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWM0MWRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVGVtcG9yYWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuSmF2YVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIHRlbXBvcmFsIGNvbnZlcnRlcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVGVtcG9yYWxDb252ZXJ0ZXIKLQlleHRlbmRzIFRlbXBvcmFsQ29udmVydGVyLCBKYXZhQ29udmVydGVyCi17Ci0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEJhc2ljQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkKLQkJcHJpdmF0ZSBCYXNpY0FkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3duZXIgYnVpbGRPd25lcigpIHsKLQkJCXJldHVybiBuZXcgT3duZXIoKSB7Ci0JCQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZFZhbGlkYXRvcihDb252ZXJ0ZXIgY29udmVydGVyLCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJCQlyZXR1cm4gbmV3IEphdmFUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcigoVGVtcG9yYWxDb252ZXJ0ZXIpIGNvbnZlcnRlciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnRDb2xsZWN0aW9uQWRhcHRlciBleHRlbmRzIEFic3RyYWN0QWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBFbGVtZW50Q29sbGVjdGlvbkFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCi0JCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb25BZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE93bmVyIGJ1aWxkT3duZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IE93bmVyKCkgewotCQkJCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoQ29udmVydGVyIGNvbnZlcnRlciwgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCQkJcmV0dXJuIG5ldyBKYXZhRWxlbWVudENvbGxlY3Rpb25UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcigoVGVtcG9yYWxDb252ZXJ0ZXIpIGNvbnZlcnRlciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RBZGFwdGVyCi0JCWV4dGVuZHMgSmF2YUNvbnZlcnRlci5BYnN0cmFjdEFkYXB0ZXIKLQl7Ci0JCi0JCUFic3RyYWN0QWRhcHRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJCXJldHVybiBUZW1wb3JhbENvbnZlcnRlci5jbGFzczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24sIEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFUZW1wb3JhbENvbnZlcnRlcihwYXJlbnQsIChUZW1wb3JhbEFubm90YXRpb24pIGNvbnZlcnRlckFubm90YXRpb24sIHRoaXMuYnVpbGRPd25lcigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZDAwN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSB0cmFuc2llbnQgIm1hcHBpbmciCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVHJhbnNpZW50TWFwcGluZwotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcsIFRyYW5zaWVudE1hcHBpbmcKLXsKLQlUcmFuc2llbnRBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZTdhOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLQotLyoqCi0gKiBKYXZhIHR5cGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGVNYXBwaW5nCi0JZXh0ZW5kcyBUeXBlTWFwcGluZywgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCi0KLQkvLyAqKioqKioqKioqIGNvdmFyaWFudCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JSmF2YVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlJdGVyYWJsZTxKYXZhQXR0cmlidXRlTWFwcGluZz4gZ2V0QXR0cmlidXRlTWFwcGluZ3MoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBdHRyaWJ1dGVNYXBwaW5ncyhTdHJpbmcgbWFwcGluZ0tleSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjY2YxNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotCi0vKioKLSAqIE1hcCBhIHN0cmluZyBrZXkgdG8gYSB0eXBlIG1hcHBpbmcgYW5kIGl0cyBjb3JyZXNwb25kaW5nCi0gKiBKYXZhIGFubm90YXRpb25zLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyBrZXkuCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG1hcHBpbmcncyBhbm5vdGF0aW9uLgotCSAqLwotCVN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgdHlwZSBtYXBwaW5nJ3MgInN1cHBvcnRpbmciIGFubm90YXRpb25zLgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpOwotCi0JLyoqCi0JICogQnVpbGQgYSBKYXZhIHR5cGUgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IHR5cGUgYW5kCi0JICogYW5ub3RhdGlvbi4KLQkgKiBVc2UgdGhlIHNwZWNpZmllZCBmYWN0b3J5IGZvciBjcmVhdGlvbiBzbyBleHRlbmRlcnMgY2FuIHNpbXBseSBvdmVycmlkZQotCSAqIHRoZSBhcHByb3ByaWF0ZSBmYWN0b3J5IG1ldGhvZCBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgZGVmaW5pdGlvbiBmb3IgdGhlCi0JICogc2FtZSBrZXkuCi0JICovCi0JSmF2YVR5cGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbiwgSnBhRmFjdG9yeSBmYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZjYyODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgdW5pcXVlIGNvbnN0cmFpbnQKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFVbmlxdWVDb25zdHJhaW50Ci0JZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50LCBKYXZhUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Ci17Ci0JVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gZ2V0VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oKTsKLQotCWJvb2xlYW4gaXNJZGVudGljYWwoSmF2YVVuaXF1ZUNvbnN0cmFpbnQgamF2YVVuaXF1ZUNvbnN0cmFpbnQpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRkMDJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgdmVyc2lvbiBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmVyc2lvbk1hcHBpbmcKLQlleHRlbmRzIFZlcnNpb25NYXBwaW5nLCBKYXZhQ29sdW1uTWFwcGluZywgSmF2YUNvbnZlcnRpYmxlTWFwcGluZwotewotCVZlcnNpb25Bbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMTVlYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0KLS8qKgotICogSmF2YSA8ZW0+dmlydHVhbDwvZW0+IGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZQotCWV4dGVuZHMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUsCi0JCQlKYXZhVmlydHVhbE92ZXJyaWRlLAotCQkJSmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZQotewotCUphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0VG9TcGVjaWZpZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzkxOTk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci0KLS8qKgotICogSmF2YSA8ZW0+dmlydHVhbDwvZW0+IGF0dHJpYnV0ZSBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlCi0JZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUsCi0JCQlKYXZhVmlydHVhbE92ZXJyaWRlLAotCQkJSmF2YVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUKLXsKLQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQlKYXZhVmlydHVhbENvbHVtbiBnZXRDb2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDFiOWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQ29sdW1uOwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVZpcnR1YWxDb2x1bW4KLQlleHRlbmRzIFZpcnR1YWxDb2x1bW4sIEphdmFSZWFkT25seUJhc2VDb2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgb3ZlcnJpZGRlbiBjb2x1bW4gY2FuIGJlIGVpdGhlciBhIEphdmEgam9pbiBjb2x1bW4gb3IgYW4KLQkgKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIGNvbHVtbjsgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSByZXR1cm4gdHlwZQotCSAqIGhlcmUuCi0JICovCi0JUmVhZE9ubHlDb2x1bW4gZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIFZpcnR1YWxDb2x1bW4uT3duZXIsIEphdmFSZWFkT25seUJhc2VDb2x1bW4uT3duZXIKLQl7Ci0JCS8qKgotCQkgKiBUaGUgb3ZlcnJpZGRlbiBjb2x1bW4gY2FuIGJlIGVpdGhlciBhIEphdmEgY29sdW1uIG9yIGFuCi0JCSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGNvbHVtbjsgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSByZXR1cm4gdHlwZSBoZXJlLgotCQkgKi8KLQkJUmVhZE9ubHlDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjNlMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luQ29sdW1uOwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbEpvaW5Db2x1bW4KLQlleHRlbmRzIFZpcnR1YWxKb2luQ29sdW1uLCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uCi17Ci0JLyoqCi0JICogVGhlIG92ZXJyaWRkZW4gam9pbiBjb2x1bW4gY2FuIGJlIGVpdGhlciBhIEphdmEgam9pbiBjb2x1bW4gb3IgYW4KLQkgKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIGNvbHVtbjsgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSByZXR1cm4gdHlwZQotCSAqIGhlcmUuCi0JICovCi0JUmVhZE9ubHlKb2luQ29sdW1uIGdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiOWQyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcCwKLQkJCUphdmFWaXJ0dWFsUmVsYXRpb25zaGlwCi17Ci0JSmF2YVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTAyNjJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBKYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8SmF2YVZpcnR1YWxKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCUphdmFWaXJ0dWFsSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JSmF2YVZpcnR1YWxKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzBmNWRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZTsKLQotLyoqCi0gKiBKYXZhIHZpcnR1YWwgam9pbiB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbEpvaW5UYWJsZQotCWV4dGVuZHMgVmlydHVhbEpvaW5UYWJsZSwgSmF2YVJlYWRPbmx5VGFibGUKLXsKLQlKYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFBhcmVudCgpOwotCi0JTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludD4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKLQlKYXZhVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQgZ2V0VW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCi0JTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8SmF2YVZpcnR1YWxKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCUphdmFWaXJ0dWFsSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JSmF2YVZpcnR1YWxKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0KLQlMaXN0SXRlcmFibGU8SmF2YVZpcnR1YWxKb2luQ29sdW1uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8SmF2YVZpcnR1YWxKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQlKYXZhVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQlKYXZhVmlydHVhbEpvaW5Db2x1bW4gZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBUaGUgb3ZlcnJpZGRlbiB0YWJsZSBjYW4gYmUgZWl0aGVyIGEgSmF2YSB0YWJsZQotCSAqIG9yIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IHRhYmxlOyBzbyB3ZSBkb24ndCBjaGFuZ2UgdGhlCi0JICogcmV0dXJuIHR5cGUgaGVyZS4KLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlKb2luVGFibGUgZ2V0T3ZlcnJpZGRlblRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI5NjNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBqb2luIHRhYmxlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcCwKLQkJCUphdmFWaXJ0dWFsUmVsYXRpb25zaGlwCi17Ci0JSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGVhMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBqb2luIHRhYmxlIHJlbGF0aW9uc2hpcCBzdHJhdGVneS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBKYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JSmF2YVZpcnR1YWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg0MjdlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlOwotCi0vKioKLSAqIEphdmEgPGVtPnZpcnR1YWw8L2VtPjx1bD4KLSAqIDxsaT5hdHRyaWJ1dGUgb3ZlcnJpZGUKLSAqIDxsaT5hc3NvY2lhdGlvbiBvdmVycmlkZQotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFWaXJ0dWFsT3ZlcnJpZGUKLQlleHRlbmRzIFZpcnR1YWxPdmVycmlkZSwgSmF2YVJlYWRPbmx5T3ZlcnJpZGUKLXsKLQlKYXZhT3ZlcnJpZGUgY29udmVydFRvU3BlY2lmaWVkKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE2M2UzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSmF2YSB2aXJ0dWFsIGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAsCi0JCQlKYXZhVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbFJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMDMzMjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSmF2YSB2aXJ0dWFsIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbFJlbGF0aW9uc2hpcAotCWV4dGVuZHMgVmlydHVhbFJlbGF0aW9uc2hpcCwgSmF2YVJlYWRPbmx5UmVsYXRpb25zaGlwCi17Ci0JSmF2YVZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDc1NDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBWaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3ksIEphdmFSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JSmF2YVZpcnR1YWxSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDI5NTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQ7Ci0KLS8qKgotICogSmF2YSB2aXJ0dWFsIGRhdGFiYXNlIHVuaXF1ZSBjb25zdHJhaW50Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQsIEphdmFSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQKLXsKLQkvKioKLQkgKiBUaGUgb3ZlcnJpZGRlbiB1bmlxdWUgY29uc3RyYWludCBjYW4gYmUgZWl0aGVyIGEgSmF2YSB1bmlxdWUgY29uc3RyYWludAotCSAqIG9yIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IHVuaXF1ZSBjb25zdHJhaW50OyBzbyB3ZSBkb24ndCBjaGFuZ2UgdGhlCi0JICogcmV0dXJuIHR5cGUgaGVyZS4KLQkgKi8KLQlSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgZ2V0T3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL0VudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTE0ZjZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL0VudGl0eU1hcHBpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIENvbnRleHQgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIFhNTCByZXNvdXJjZSBtb2RlbCB7QGxpbmsgWG1sRW50aXR5TWFwcGluZ3N9LAotICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmVudGl0eS1tYXBwaW5nczwvY29kZT4gZWxlbWVudAotICogaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0qLwotcHVibGljIGludGVyZmFjZSBFbnRpdHlNYXBwaW5ncwotCWV4dGVuZHMgTWFwcGluZ0ZpbGVSb290LCBQZXJzaXN0ZW50VHlwZS5Pd25lciwgQWNjZXNzSG9sZGVyCi17Ci0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCU9ybVhtbCBnZXRQYXJlbnQoKTsKLQotCVhtbEVudGl0eU1hcHBpbmdzIGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0KLQkvLyBUT0RPIGJqdiBhZGQgdmVyc2lvbiBjb25zdGFudHMKLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOwotCQlTdHJpbmcgREVTQ1JJUFRJT05fUFJPUEVSVFkgPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAiVGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IHN1YmVsZW1lbnQgc3BlY2lmaWVzIHRoZSBwYWNrYWdlIG9mIHRoZQotCSAqIGNsYXNzZXMgbGlzdGVkIHdpdGhpbiB0aGUgc3ViZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgb2YgdGhlIHNhbWUgbWFwcGluZwotCSAqIGZpbGUgb25seS4gVGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IHN1YmVsZW1lbnQgaXMgb3ZlcnJpZGRlbiBpZiB0aGUgZnVsbHkKLQkgKiBxdWFsaWZpZWQgY2xhc3MgbmFtZSBpcyBzcGVjaWZpZWQgZm9yIGEgY2xhc3MgYW5kIHRoZSB0d28gZGlzYWdyZWUuIgotCSAqIDxwPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IE5vIG1lbnRpb24gb2YgaG93IHRvIHJlc29sdmUgZHVwbGljYXRlcyBpbiB0aGUKLQkgKiAiZGVmYXVsdCIgcGFja2FnZSBvciBzdWItcGFja2FnZXM6PHVsPgotCSAqIDxsaT48Y29kZT5CYXI8L2NvZGU+IChpbiAiZGVmYXVsdCIgcGFja2FnZSkgdnMuIDxjb2RlPmZvby5CYXI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPmJhei5CYXI8L2NvZGU+IHZzLiA8Y29kZT5mb28uYmF6LkJhcjwvY29kZT4KLQkgKiA8L3VsPgotCSAqIHdoZW4gcGFja2FnZSBpcyBzcGVjaWZpZWQgYXMgPGNvZGU+Zm9vPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFja2FnZSgpOwotCXZvaWQgc2V0UGFja2FnZShTdHJpbmcgcGFja2FnZV8pOwotCQlTdHJpbmcgUEFDS0FHRV9QUk9QRVJUWSA9ICJwYWNrYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBzY2hlbWEgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgY2F0YWxvZyBvciwKLQkgKiBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncywgdGhlIGRhdGFiYXNlIGl0c2VsZi4KLQkgKi8KLQlTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZID0gInNwZWNpZmllZENhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JQ2F0YWxvZyBnZXREYkNhdGFsb2coKTsKLQotCVN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQl2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCVNjaGVtYSBnZXREYlNjaGVtYSgpOwotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCU9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0KLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlPiBnZXRQZXJzaXN0ZW50VHlwZXMoKTsKLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgY2xhc3NOYW1lKTsKLQlpbnQgZ2V0UGVyc2lzdGVudFR5cGVzU2l6ZSgpOwotCU9ybVBlcnNpc3RlbnRUeXBlIGFkZFBlcnNpc3RlbnRUeXBlKFN0cmluZyBtYXBwaW5nS2V5LCBTdHJpbmcgY2xhc3NOYW1lKTsKLQl2b2lkIHJlbW92ZVBlcnNpc3RlbnRUeXBlKGludCBpbmRleCk7Ci0Jdm9pZCByZW1vdmVQZXJzaXN0ZW50VHlwZShPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSk7Ci0JLy92b2lkIG1vdmVQZXJzaXN0ZW50VHlwZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JYm9vbGVhbiBjb250YWluc1BlcnNpc3RlbnRUeXBlKFN0cmluZyBjbGFzc05hbWUpOwotCQlTdHJpbmcgUEVSU0lTVEVOVF9UWVBFU19MSVNUID0gInBlcnNpc3RlbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQotCUxpc3RJdGVyYWJsZTxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JaW50IGdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKTsKLQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBhZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCU9ybVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKGludCBpbmRleCk7Ci0Jdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcihpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoT3JtU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IpOwotCXZvaWQgbW92ZVNlcXVlbmNlR2VuZXJhdG9yKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUlNfTElTVCA9ICJzZXF1ZW5jZUdlbmVyYXRvcnMiOyAvLyROT04tTkxTLTEkCi0KLQlMaXN0SXRlcmFibGU8T3JtVGFibGVHZW5lcmF0b3I+IGdldFRhYmxlR2VuZXJhdG9ycygpOwotCWludCBnZXRUYWJsZUdlbmVyYXRvcnNTaXplKCk7Ci0JT3JtVGFibGVHZW5lcmF0b3IgYWRkVGFibGVHZW5lcmF0b3IoKTsKLQlPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcihpbnQgaW5kZXgpOwotCXZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoaW50IGluZGV4KTsKLQl2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKE9ybVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yKTsKLQl2b2lkIG1vdmVUYWJsZUdlbmVyYXRvcihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JTX0xJU1QgPSAidGFibGVHZW5lcmF0b3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JT3JtUXVlcnlDb250YWluZXIgZ2V0UXVlcnlDb250YWluZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIHF1ZXJpZXMgZGVmaW5lZCBpbiBib3RoIHRoZSBlbnRpdHkgbWFwcGluZ3MgYW5kIGl0cwotCSAqIGVudGl0aWVzIChidXQgPGVtPm5vdDwvZW0+IGluIGFueSBhc3NvY2lhdGVkIEphdmEgYW5ub3RhdGlvbnMpLgotCSAqLwotCUl0ZXJhYmxlPFF1ZXJ5PiBnZXRNYXBwaW5nRmlsZVF1ZXJpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIGdlbmVyYXRvcnMgZGVmaW5lZCBpbiBib3RoIHRoZSBlbnRpdHkgbWFwcGluZ3MgYW5kIGl0cwotCSAqIHR5cGUgbWFwcGluZ3MgKGJ1dCA8ZW0+bm90PC9lbT4gaW4gYW55IGFzc29jaWF0ZWQgSmF2YSBhbm5vdGF0aW9ucykuCi0JICovCi0JSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRNYXBwaW5nRmlsZUdlbmVyYXRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBwYWNrYWdlIHRvIGJlIHVzZWQgZm9yIHBlcnNpc3RlbnQgdHlwZXMgaW4gdGhpcwotCSAqIGNvbnRleHQuCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRQZXJzaXN0ZW50VHlwZVBhY2thZ2UoKTsKLQotCXZvaWQgY2hhbmdlTWFwcGluZyhPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSwgT3JtVHlwZU1hcHBpbmcgb2xkTWFwcGluZywgT3JtVHlwZU1hcHBpbmcgbmV3TWFwcGluZyk7Ci0KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSByZXNvdXJjZSB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUKLQkgKiBmb3VuZCBpbiB0aGUgSlBBIHByb2plY3QuIEZpcnN0IGxvb2sgZm9yIG9uZSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lIChzaW5jZSBpdCBtaWdodCBiZSBmdWxseSBxdWFsaWZpZWQpLiBJZiBub3QgZm91bmQsIHByZXBlbmQgdGhlCi0JICogZGVmYXVsdCBwYWNrYWdlIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLQkgKiAKLQkgKiBAc2VlICNnZXRQYWNrYWdlKCkKLQkgKi8KLQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgcmVzb3VyY2UgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lIGFuZCBraW5kCi0JICogZm91bmQgaW4gdGhlIEpQQSBwcm9qZWN0LiBGaXJzdCBsb29rIGZvciBvbmUgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogbmFtZSAoc2luY2UgaXQgbWlnaHQgYmUgZnVsbHkgcXVhbGlmaWVkKSBhbmQga2luZC4gSWYgbm90IGZvdW5kLCAKLQkgKiBwcmVwZW5kIHRoZSBkZWZhdWx0IHBhY2thZ2UgbmFtZSBhbmQgdHJ5IGFnYWluLgotCSAqIAotCSAqIFJldHVybiBudWxsIGlmIGludmFsaWQgb3IgYWJzZW50IG9yIGlmIHRoZSBraW5kIGRvZXMgbm90IG1hdGNoLgotCSAqIAotCSAqIEBzZWUgI2dldFBhY2thZ2UoKQotCSAqLwotCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvbHZlSmF2YVJlc291cmNlVHlwZShTdHJpbmcgY2xhc3NOYW1lLCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZCBraW5kKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlIGZvciB0aGUgc3BlY2lmaWVkIGNsYXNzIG5hbWUKLQkgKiBmb3VuZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4gRmlyc3QgbG9vayBmb3Igb25lIHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUgKHNpbmNlIGl0IG1pZ2h0IGJlIGZ1bGx5IHF1YWxpZmllZCkuIElmIG5vdCBmb3VuZCwgcHJlcGVuZCB0aGUKLQkgKiBkZWZhdWx0IHBhY2thZ2UgbmFtZSBhbmQgdHJ5IGFnYWluLgotCSAqIAotCSAqIEBzZWUgI2dldFBhY2thZ2UoKQotCSAqLwotCVBlcnNpc3RlbnRUeXBlIHJlc29sdmVQZXJzaXN0ZW50VHlwZShTdHJpbmcgY2xhc3NOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRUIElUeXBlIHJlc291cmNlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZQotCSAqIGZvdW5kIGluIHRoZSBKYXZhIHByb2plY3QuIEZpcnN0IGxvb2sgZm9yIG9uZSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBuYW1lIChzaW5jZSBpdCBtaWdodCBiZSBmdWxseSBxdWFsaWZpZWQpLiBJZiBub3QgZm91bmQsIHByZXBlbmQgdGhlCi0JICogZGVmYXVsdCBwYWNrYWdlIG5hbWUgYW5kIHRyeSBhZ2Fpbi4KLQkgKiAKLQkgKiBAc2VlICNnZXRQYWNrYWdlKCkKLQkgKi8KLQlJVHlwZSByZXNvbHZlSmR0VHlwZShTdHJpbmcgY2xhc3NOYW1lKTsKLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgRGVsZXRlRWRpdHMgZm9yIGRlbGV0aW5nIHJlZmVyZW5jZXMgKGlmIGFueSkgdG8gdGhlIHR5cGUgYWJvdXQgdG8gYmUgZGVsZXRlZC4KLQkgKiBSZXR1cm4gYW4gRW1wdHlJdGVyYWJsZSBpZiB0aGVyZSBhcmUgbm90IGFueSByZWZlcmVuY2VzIHRvIHRoZSBnaXZlbiB0eXBlLgotCSAqLwotCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZURlbGV0ZVR5cGVFZGl0cyhJVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQsIHRoZSBuZXdOYW1lIGlzIHRoZSBuZXcgc2hvcnQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsUGFja2FnZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vTWFwcGluZ0ZpbGVEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9NYXBwaW5nRmlsZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE5ZWYxMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9NYXBwaW5nRmlsZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBBIEpQQSBwbGF0Zm9ybSBjYW4gc3VwcG9ydCBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzLiBFYWNoIHdpbGwKLSAqIGhhdmUgYSB1bmlxdWUgcmVzb3VyY2UgdHlwZSBhbmQgbXVzdCBiZSBkZWZpbmVkIHdpdGggYSBtYXBwaW5nIGZpbGUgZGVmaW5pdGlvbi4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdGaWxlRGVmaW5pdGlvbgotCWV4dGVuZHMgUmVzb3VyY2VEZWZpbml0aW9uCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL051bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMjFhYTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1OdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQsIChYbWxOdWxsQXR0cmlidXRlTWFwcGluZykgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWU0YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLQotLyoqCi0gKiA8ZW0+U3BlY2lmaWVkPC9lbT4gPGNvZGU+b3JtLnhtbDwvY29kZT4gYXNzb2NpYXRpb24gb3ZlcnJpZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUKLQlleHRlbmRzIE9ybVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSwgQXNzb2NpYXRpb25PdmVycmlkZSwgT3JtT3ZlcnJpZGUKLXsKLQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0VG9WaXJ0dWFsKCk7Ci0KLQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGdldFhtbE92ZXJyaWRlKCk7Ci0KLQlPcm1PdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI0MWYwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlXzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcgotCWV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciwgT3JtT3ZlcnJpZGVDb250YWluZXIKLXsKLQkvLyBjb3ZhcmlhbnQgb3ZlcnJpZGVzCi0JTGlzdEl0ZXJhYmxlPE9ybVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0T3ZlcnJpZGVzKCk7Ci0JT3JtUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCUxpc3RJdGVyYWJsZTxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRTcGVjaWZpZWRPdmVycmlkZXMoKTsKLQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCk7Ci0JT3JtQXNzb2NpYXRpb25PdmVycmlkZSBnZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKTsKLQlMaXN0SXRlcmFibGU8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldFZpcnR1YWxPdmVycmlkZXMoKTsKLQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBjb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwoT3ZlcnJpZGVfIHNwZWNpZmllZE92ZXJyaWRlKTsKLQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnZlcnRPdmVycmlkZVRvU3BlY2lmaWVkKFZpcnR1YWxPdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIsIE9ybU92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewkJCQkKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldFhtbE92ZXJyaWRlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyOThiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUF0dHJpYnV0ZU1hcHBpbmcKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcsIFhtbENvbnRleHROb2RlCi17Ci0JT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQYXJlbnQoKTsKLQotCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCi0JWG1sQXR0cmlidXRlTWFwcGluZyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0KLQlPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpOwotCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEF0dHJpYnV0ZXMgYXJlIGEgc2VxdWVuY2UgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNjaGVtYS4gV2UgbXVzdCBrZWVwCi0JICogdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBpbiB0aGUgYXBwcm9wcmlhdGUgb3JkZXIgc28gdGhlIFdUUCBYTUwKLQkgKiB0cmFuc2xhdG9ycyB3aWxsIHdyaXRlIHRoZW0gdG8gdGhlIFhNTCBkb2N1bWVudCBpbiB0aGF0IG9yZGVyIGFuZCB0aGV5Ci0JICogd2lsbCBhZGhlcmUgdG8gdGhlIHNjaGVtYS4KLQkgKiA8cD4KLQkgKiBFYWNoIGltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50IHRoaXMKLQkgKiBtZXRob2QgYW5kIHJldHVybiBhIG51bWJlciB0aGF0IG1hdGNoZXMgaXRzIG9yZGVyIGluIHRoZSBzY2hlbWEuCi0JICovCi0JaW50IGdldFhtbFNlcXVlbmNlKCk7Ci0KLQl2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcyk7Ci0KLQl2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKTsKLQotCWJvb2xlYW4gY29udGFpbnMoaW50IHRleHRPZmZzZXQpOwotCi0JVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKLQotCi0JLy8gKioqKioqKioqKiBtb3JwaGluZyBtYXBwaW5ncyAqKioqKioqKioqCi0KLQl2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcoT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1CYXNpY01hcHBpbmcoT3JtQmFzaWNNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybUlkTWFwcGluZyhPcm1JZE1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtVHJhbnNpZW50TWFwcGluZyhPcm1UcmFuc2llbnRNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybUVtYmVkZGVkTWFwcGluZyhPcm1FbWJlZGRlZE1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtRW1iZWRkZWRJZE1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtVmVyc2lvbk1hcHBpbmcoT3JtVmVyc2lvbk1hcHBpbmcgb2xkTWFwcGluZyk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tT3JtT25lVG9NYW55TWFwcGluZyhPcm1PbmVUb01hbnlNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybU1hbnlUb09uZU1hcHBpbmcoT3JtTWFueVRvT25lTWFwcGluZyBvbGRNYXBwaW5nKTsKLQotCXZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb09uZU1hcHBpbmcoT3JtT25lVG9PbmVNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbU9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybU1hbnlUb01hbnlNYXBwaW5nIG9sZE1hcHBpbmcpOwotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQsIHRoZSBuZXdOYW1lIGlzIHRoZSBuZXcgc2hvcnQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsUGFja2FnZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZjVlNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBQYXJ0IG9mIG1lY2hhbmlzbSB0byBleHRlbmQgdGhlIHR5cGVzIG9mIDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZQotICogbWFwcGluZ3MuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmaW5pdGlvbidzIG1hcHBpbmcga2V5LgotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhIHJlc291cmNlIG1hcHBpbmcuCi0JICovCi0JWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhIGNvbnRleHQgbWFwcGluZy4KLQkgKi8KLQlPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSk7CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmMxODIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLQotLyoqCi0gKiA8ZW0+U3BlY2lmaWVkPC9lbT4gPGNvZGU+b3JtLnhtbDwvY29kZT4gYXR0cmlidXRlIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1BdHRyaWJ1dGVPdmVycmlkZQotCWV4dGVuZHMgT3JtUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSwgQXR0cmlidXRlT3ZlcnJpZGUsIE9ybU92ZXJyaWRlCi17Ci0JT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGNvbnZlcnRUb1ZpcnR1YWwoKTsKLQotCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIGdldFhtbE92ZXJyaWRlKCk7Ci0KLQlPcm1Db2x1bW4gZ2V0Q29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QwZDk5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVfOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgT3JtT3ZlcnJpZGVDb250YWluZXIKLXsKLQl2b2lkIGluaXRpYWxpemVGcm9tKE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG9sZENvbnRhaW5lcik7Ci0KLQkvLyBjb3ZhcmlhbnQgb3ZlcnJpZGVzCi0JTGlzdEl0ZXJhYmxlPE9ybVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IGdldE92ZXJyaWRlcygpOwotCU9ybVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZ2V0T3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7Ci0JTGlzdEl0ZXJhYmxlPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRTcGVjaWZpZWRPdmVycmlkZXMoKTsKLQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBnZXRTcGVjaWZpZWRPdmVycmlkZShpbnQgaW5kZXgpOwotCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCUxpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IGdldFZpcnR1YWxPdmVycmlkZXMoKTsKLQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgY29udmVydE92ZXJyaWRlVG9WaXJ0dWFsKE92ZXJyaWRlXyBzcGVjaWZpZWRPdmVycmlkZSk7Ci0JT3JtQXR0cmlidXRlT3ZlcnJpZGUgY29udmVydE92ZXJyaWRlVG9TcGVjaWZpZWQoVmlydHVhbE92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIsIE9ybU92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewkJCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0WG1sT3ZlcnJpZGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTE2OGUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY29sdW1uIG9yIGpvaW4gY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1CYXNlQ29sdW1uCi0JZXh0ZW5kcyBCYXNlQ29sdW1uLCBPcm1OYW1lZENvbHVtbiwgT3JtUmVhZE9ubHlCYXNlQ29sdW1uCi17Ci0JWG1sQmFzZUNvbHVtbiBnZXRYbWxDb2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkOGQxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEVtYmVkZGVkOwotCi0vKioKLSAqIEJlaGF2aW9yIGNvbW1vbiB0byA8Y29kZT5vcm0ueG1sPC9jb2RlPiBlbWJlZGRlZCBhbmQgZW1iZWRkZWQgSUQgbWFwcGluZ3MuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1CYXNlRW1iZWRkZWRNYXBwaW5nCi0JZXh0ZW5kcyBCYXNlRW1iZWRkZWRNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nCi17Ci0JQWJzdHJhY3RYbWxFbWJlZGRlZCBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0KLQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1CYXNlSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzVjNjIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2VKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUpvaW5Db2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gam9pbiBjb2x1bW4gb3IgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUJhc2VKb2luQ29sdW1uCi0JZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbiwgT3JtTmFtZWRDb2x1bW4sIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4KLXsKLQlYbWxCYXNlSm9pbkNvbHVtbiBnZXRYbWxDb2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTE4OTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGJhc2ljIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUJhc2ljTWFwcGluZwotCWV4dGVuZHMgQmFzaWNNYXBwaW5nLCBPcm1Db2x1bW5NYXBwaW5nLCBPcm1Db252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlYbWxCYXNpYyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ2FzY2FkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ2FzY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODMzM2FkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUNhc2NhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBjYXNjYWRlIChwZXJzaXN0LCBtZXJnZSwgcmVtb3ZlLCByZWZyZXNoKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQ2FzY2FkZQotCWV4dGVuZHMgQ2FzY2FkZSwgWG1sQ29udGV4dE5vZGUKLXsKLQl2b2lkIGluaXRpYWxpemVGcm9tKENhc2NhZGUgb2xkQ2FzY2FkZSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Db2xsZWN0aW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ29sbGVjdGlvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFlNTgzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Db2xsZWN0aW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2xsZWN0aW9uTWFwcGluZzsKLQotLyoqCi0gKiBKUEEgPGNvZGU+b3JtLnhtbDwvY29kZT4gY29sbGVjdGlvbiBtYXBwaW5nIChlLmcuIDE6bSwgbTptLCBlbGVtZW50IGNvbGxlY3Rpb24pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUNvbGxlY3Rpb25NYXBwaW5nCi0JZXh0ZW5kcyBDb2xsZWN0aW9uTWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZwotewotCU9ybU9yZGVyYWJsZSBnZXRPcmRlcmFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxM2ZhYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUNvbHVtbgotCWV4dGVuZHMgQ29sdW1uLCBPcm1CYXNlQ29sdW1uCi17Ci0JWG1sQ29sdW1uIGdldFhtbENvbHVtbigpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gYmFzaWMgbWFwcGluZ3MgYW5kIGF0dHJpYnV0ZSBvdmVycmlkZXMpCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgT3JtUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyCi0JewotCQlYbWxDb2x1bW4gZ2V0WG1sQ29sdW1uKCk7Ci0JCVhtbENvbHVtbiBidWlsZFhtbENvbHVtbigpOwotCQl2b2lkIHJlbW92ZVhtbENvbHVtbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUNvbHVtbk1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUNvbHVtbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4Zjg1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Db2x1bW5NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY29sdW1uIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUNvbHVtbk1hcHBpbmcKLQlleHRlbmRzIENvbHVtbk1hcHBpbmcsIE9ybUF0dHJpYnV0ZU1hcHBpbmcsIE9ybUNvbHVtbi5Pd25lcgotewotCU9ybUNvbHVtbiBnZXRDb2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTVlNjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmc7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1Db252ZXJ0ZXIKLQlleHRlbmRzIENvbnZlcnRlciwgWG1sQ29udGV4dE5vZGUKLXsKLQlPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogV2UgbmVlZCB0aGlzICJoYWNrIiBiZWNhdXNlIHdlIGNhbid0IGJ1aWxkIHRoZSByZXNvdXJjZSBjb252ZXJ0ZXIgYmVmb3JlCi0JICogd2UgYnVpbGQgdGhlIGNvbnRleHQgY29udmVydGVyLiBUaGVyZSBpcyBubyByZXNvdXJjZSAiY29udmVydGVyIiwganVzdCBhCi0JICogc2ltcGxlIHNldHRpbmcgb24gdGhlIG1hcHBpbmcuIChNYXliZSAiY29udmVydGVyIiBpcyBub3QgdGhlIGJlc3Qgd2F5IHRvCi0JICogbW9kZWwgd2hhdCBpcyBnb2luZyBvbiBoZXJlLi4uLikKLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBhIGNvbnZlcnRpYmxlIG1hcHBpbmcgdG8gaW50ZXJhY3Qgd2l0aCB2YXJpb3VzCi0JICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY29udmVydGVycyB2aWEgdGhlIHNhbWUgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBBZGFwdGVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSB0eXBlIG9mIGNvbnZlcnRlciBoYW5kbGVkIGJ5IHRoZSBhZGFwdGVyLgotCQkgKi8KLQkJQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpOwotCi0JCS8qKgotCQkgKiBCdWlsZCBhIGNvbnZlcnRlciBmb3Igc3BlY2lmaWVkIG1hcHBpbmcKLQkJICogaWYgdGhlIG1hcHBpbmcncyBYTUwgaGFzIHRoZSBhZGFwdGVyJ3MgdmFsdWUgc2V0LgotCQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCQkgKiBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgYSBjb252ZXJ0ZXIgZHVyaW5nIGNvbnN0cnVjdGlvbiBvZiB0aGUKLQkJICogY29udmVydGVyJ3MgbWFwcGluZy4KLQkJICovCi0JCU9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIFhNTCBtYXBwaW5nIGhhcyB0aGUKLQkJICogYWRhcHRlcidzIHZhbHVlIHNldC4gSWYgdGhlIGFkYXB0ZXIgaXMgYWN0aXZlIGFuZCB0aGUgY29udGV4dAotCQkgKiBtYXBwaW5nJ3MgY29udmVydGVyIGRvZXMgbm90IG1hdGNoIHRoZSBhZGFwdGVyLCB0aGUgbWFwcGluZyB3aWxsCi0JCSAqIGJ1aWxkIGEgbmV3IGNvbnZlcnRlciAodmlhIHRoZSBhZGFwdGVyKS4KLQkJICogCi0JCSAqIEBzZWUgI2J1aWxkTmV3Q29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSkKLQkJICovCi0JCWJvb2xlYW4gaXNBY3RpdmUoWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nKTsKLQotCQkvKioKLQkJICogQnVpbGQgYSBjb252ZXJ0ZXIgZm9yIHNwZWNpZmllZCBtYXBwaW5nLgotCQkgKiBUaGlzIGlzIHVzZWQgd2hlbiB0aGUgY29udGV4dCBtb2RlbCBpcyBzeW5jaHJvbml6ZWQgd2l0aCB0aGUKLQkJICogcmVzb3VyY2UgbW9kZWwgKGFuZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFzIGNoYW5nZWQpIG9yIHdoZW4gYSBjbGllbnQKLQkJICogY2hhbmdlcyBhIG1hcHBpbmcncyBjb252ZXJ0ZXIuCi0JCSAqIFRoZSBhcHByb3ByaWF0ZSBzZXR0aW5nIGluIHRoZSBYTUwgbWFwcGluZyB3aWxsIGJlIGNvbmZpZ3VyZWQgb25jZQotCQkgKiB0aGUgY29udGV4dCBjb252ZXJ0ZXIgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGNvbnRleHQgbW9kZWwgKHNlZSB7QGxpbmsKLQkJICogT3JtQ29udmVydGVyI2luaXRpYWxpemUoKX0uCi0JCSAqIAotCQkgKiBAc2VlICNpc0FjdGl2ZShYbWxDb252ZXJ0aWJsZU1hcHBpbmcpCi0JCSAqLwotCQlPcm1Db252ZXJ0ZXIgYnVpbGROZXdDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KTsKLQotCQkvKioKLQkJICogQ2xlYXIgdGhlIGFkYXB0ZXIncyBYTUwgdmFsdWUgZnJvbSB0aGUgc3BlY2lmaWVkIFhNTCBtYXBwaW5nLgotCQkgKi8KLQkJdm9pZCBjbGVhclhtbFZhbHVlKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtQ29udmVydGlibGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Db252ZXJ0aWJsZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZGFmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Db252ZXJ0aWJsZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gYXR0cmlidXRlIG1hcHBpbmcgdGhhdCBoYXMgYQotICogY29udmVydGVyIChlLmcuIGJhc2ljLCBJRCwgdmVyc2lvbikuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUNvbnZlcnRpYmxlTWFwcGluZwotCWV4dGVuZHMgQ29udmVydGlibGVNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nCi17Ci0JT3JtQ29udmVydGVyIGdldENvbnZlcnRlcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc2YTFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4KLQlleHRlbmRzIERpc2NyaW1pbmF0b3JDb2x1bW4sIE9ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotewotCVhtbERpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0WG1sQ29sdW1uKCk7Ci0JCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBkaXNjcmltaW5hdG9yIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBPcm1SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lcgotCXsKLQkJWG1sRGlzY3JpbWluYXRvckNvbHVtbiBnZXRYbWxDb2x1bW4oKTsKLQkJWG1sRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZFhtbENvbHVtbigpOwotCQl2b2lkIHJlbW92ZVhtbENvbHVtbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4NjFmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVtYmVkZGFibGUKLQlleHRlbmRzIEVtYmVkZGFibGUsIE9ybVR5cGVNYXBwaW5nCi17Ci0JWG1sRW1iZWRkYWJsZSBnZXRYbWxUeXBlTWFwcGluZygpOwotCi0JSmF2YUVtYmVkZGFibGUgZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0KLQlKYXZhRW1iZWRkYWJsZSBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZWMwNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVtYmVkZGVkIElEIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVtYmVkZGVkSWRNYXBwaW5nCi0JZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZywgT3JtQmFzZUVtYmVkZGVkTWFwcGluZwotewotCVhtbEVtYmVkZGVkSWQgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ODdlOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVtYmVkZGVkIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVtYmVkZGVkTWFwcGluZwotCWV4dGVuZHMgRW1iZWRkZWRNYXBwaW5nLCBPcm1CYXNlRW1iZWRkZWRNYXBwaW5nCi17Ci0JWG1sRW1iZWRkZWQgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YWU5OTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5U2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVudGl0eQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRW50aXR5IAotCWV4dGVuZHMgRW50aXR5LCBPcm1UeXBlTWFwcGluZwotewotCVhtbEVudGl0eSBnZXRYbWxUeXBlTWFwcGluZygpOwotCi0JSmF2YUVudGl0eSBnZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQkKLQlKYXZhRW50aXR5IGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0KLQlPcm1UYWJsZSBnZXRUYWJsZSgpOwotCQotCU9ybUlkQ2xhc3NSZWZlcmVuY2UgZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCQotCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCi0KLQkvLyAqKioqKioqKioqIHNlY29uZGFyeSB0YWJsZXMgKioqKioqKioqKgotCi0JTGlzdEl0ZXJhYmxlPFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+IGdldFNlY29uZGFyeVRhYmxlcygpOwkKLQlMaXN0SXRlcmFibGU8T3JtU2Vjb25kYXJ5VGFibGU+IGdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCU9ybVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCk7Ci0JT3JtU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdmlydHVhbCAobm90IHNwZWNpZmllZCkgc2Vjb25kYXJ5IHRhYmxlcy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8T3JtVmlydHVhbFNlY29uZGFyeVRhYmxlPiBnZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCVN0cmluZyBWSVJUVUFMX1NFQ09OREFSWV9UQUJMRVNfTElTVCA9ICJ2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHZpcnR1YWwgc2Vjb25kYXJ5IHRhYmxlcy4KLQkgKi8KLQlpbnQgZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzIG9uIHRoZSBvcm0gZW50aXR5LgotCSAqIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB5b3UgY2FuIGFkZCBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlcy4KLQkgKiBZb3UgbXVzdCBmaXJzdCBtYWtlIHN1cmUgYWxsIHZpcnR1YWwgc2Vjb25kYXJ5IHRhYmxlcyBoYXZlIGJlZW4gc3BlY2lmaWVkCi0JICogaW4geG1sIGJlZm9yZSBhZGRpbmcgbW9yZS4gIFRoaXMgaXMgYmVjYXVzZSBhZGRpbmcgb25lIHNlY29uZGFyeSB0YWJsZSB0byB4bWwKLQkgKiB3aWxsIG92ZXJyaWRlIGFsbCB0aGUgc2Vjb25kYXJ5IHRhYmxlcyBzcGVjaWZpZWQgaW4gdGhlIGphdmEgZW50aXR5Ci0JICovCi0JYm9vbGVhbiBzZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwoKTsKLQkKLQkvKioKLQkgKiBJZiB0cnVlLCB0aGVuIGFsbCB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMgYXJlIGFkZGVkIGluIGFzIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzIHRvIHRoZSB4bWwuCi0JICogSWYgZmFsc2UsIHRoZW4gYWxsIHRoZSBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlcyBhcmUgcmVtdm9lZCBmcm9tIHRoZSB4bWwuCi0JICovCi0Jdm9pZCBzZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwoYm9vbGVhbiBkZWZpbmVJblhtbCk7Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCUxpc3RJdGVyYWJsZTxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JaW50IGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCVN0cmluZyBERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUID0gImRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY29udGFpbmVycyAqKioqKioqKioqCi0KLQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCU9ybVF1ZXJ5Q29udGFpbmVyIGdldFF1ZXJ5Q29udGFpbmVyKCk7Ci0JT3JtR2VuZXJhdG9yQ29udGFpbmVyIGdldEdlbmVyYXRvckNvbnRhaW5lcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW51bWVyYXRlZENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtRW51bWVyYXRlZENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTU5NDY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUVudW1lcmF0ZWRDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVudW1lcmF0ZWQgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIKLQlleHRlbmRzIEVudW1lcmF0ZWRDb252ZXJ0ZXIsIE9ybUNvbnZlcnRlcgotewotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICovCi0JcHVibGljIGludGVyZmFjZSBPd25lciBleHRlbmRzIE9ybUNvbnZlcnRlci5Pd25lciB7Ci0JCUVudW1UeXBlIGdldFhtbEVudW1UeXBlKCk7Ci0KLQkJdm9pZCBzZXRYbWxFbnVtVHlwZShFbnVtVHlwZSBlbnVtVHlwZSk7Ci0KLQkJVGV4dFJhbmdlIGdldEVudW1UZXh0UmFuZ2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWltcGxlbWVudHMgT3JtQ29udmVydGVyLkFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gRW51bWVyYXRlZENvbnZlcnRlci5jbGFzczsKLQkJfQotCi0JCXB1YmxpYyBPcm1Db252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlYbWxDb252ZXJ0aWJsZU1hcHBpbmcgeG1sTWFwcGluZyA9IChYbWxDb252ZXJ0aWJsZU1hcHBpbmcpIHBhcmVudC5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKHhtbE1hcHBpbmcuZ2V0RW51bWVyYXRlZCgpID09IG51bGwpID8gbnVsbCA6IGZhY3RvcnkuYnVpbGRPcm1FbnVtZXJhdGVkQ29udmVydGVyKHBhcmVudCwgdGhpcy5idWlsZE93bmVyKHhtbE1hcHBpbmcpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1FbnVtZXJhdGVkQ29udmVydGVyLk93bmVyIGJ1aWxkT3duZXIoZmluYWwgWG1sQ29udmVydGlibGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCXJldHVybiBuZXcgT3JtRW51bWVyYXRlZENvbnZlcnRlci5Pd25lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZXRYbWxFbnVtVHlwZShFbnVtVHlwZSBlbnVtVHlwZSkgewotCQkJCQltYXBwaW5nLnNldEVudW1lcmF0ZWQoZW51bVR5cGUpOwotCQkJCX0KLQkJCQlwdWJsaWMgRW51bVR5cGUgZ2V0WG1sRW51bVR5cGUoKSB7Ci0JCQkJCXJldHVybiBtYXBwaW5nLmdldEVudW1lcmF0ZWQoKTsKLQkJCQl9Ci0JCQkJcHVibGljIFRleHRSYW5nZSBnZXRFbnVtVGV4dFJhbmdlKCkgewotCQkJCQlyZXR1cm4gbWFwcGluZy5nZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCk7Ci0JCQkJfQotCQkJCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoQ29udmVydGVyIGNvbnZlcnRlciwgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCQkJcmV0dXJuIEpwdFZhbGlkYXRvci5OdWxsLmluc3RhbmNlKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQkJcmV0dXJuICgoWG1sQ29udmVydGlibGVNYXBwaW5nKSB4bWxNYXBwaW5nKS5nZXRFbnVtZXJhdGVkKCkgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBPcm1Db252ZXJ0ZXIgYnVpbGROZXdDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIocGFyZW50LCB0aGlzLmJ1aWxkT3duZXIoKFhtbENvbnZlcnRpYmxlTWFwcGluZykgcGFyZW50LmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXJYbWxWYWx1ZShYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcpIHsKLQkJCSgoWG1sQ29udmVydGlibGVNYXBwaW5nKSB4bWxNYXBwaW5nKS5zZXRFbnVtZXJhdGVkKG51bGwpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MmU4YzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdGVkVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZ2VuZXJhdGVkIHZhbHVlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1HZW5lcmF0ZWRWYWx1ZQotCWV4dGVuZHMgR2VuZXJhdGVkVmFsdWUsIFhtbENvbnRleHROb2RlCi17Ci0JWG1sR2VuZXJhdGVkVmFsdWUgZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgKGJlc3QgZ3Vlc3MpIHRleHQgbG9jYXRpb24gb2YgdGhlIGdlbmVyYXRvci4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDE3OTFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNlcXVlbmNlIGFuZCB0YWJsZSBnZW5lcmF0b3JzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1HZW5lcmF0b3IKLQlleHRlbmRzIEdlbmVyYXRvciwgWG1sQ29udGV4dE5vZGUKLXsKLQlYbWxHZW5lcmF0b3IgZ2V0WG1sR2VuZXJhdG9yKCk7Ci0KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtR2VuZXJhdG9yQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0b3JDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1OGMyNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1HZW5lcmF0b3JDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGdlbmVyYXRvciBjb250YWluZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUdlbmVyYXRvckNvbnRhaW5lcgotCWV4dGVuZHMgR2VuZXJhdG9yQ29udGFpbmVyLCBYbWxDb250ZXh0Tm9kZQotewotCS8vICoqKioqKioqKiogc2VxdWVuY2UgZ2VuZXJhdG9yICoqKioqKioqKioKLQkKLQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSBnZW5lcmF0b3IgKioqKioqKioqKgotCQotCU9ybVRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQlPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1JZENsYXNzUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1JZENsYXNzUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzYxMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtSWRDbGFzc1JlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzc0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IElEIGNsYXNzIHJlZmVyZW5jZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSWRDbGFzc1JlZmVyZW5jZQotCWV4dGVuZHMgSWRDbGFzc1JlZmVyZW5jZSwgWG1sQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQsIHRoZSBuZXdOYW1lIGlzIHRoZSBuZXcgc2hvcnQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsUGFja2FnZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lciB7Ci0JCVhtbElkQ2xhc3NDb250YWluZXIgZ2V0WG1sSWRDbGFzc0NvbnRhaW5lcigpOwotCQlKYXZhSWRDbGFzc1JlZmVyZW5jZSBnZXRKYXZhSWRDbGFzc1JlZmVyZW5jZUZvckRlZmF1bHRzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2YmUwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gSUQgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSWRNYXBwaW5nIAotCWV4dGVuZHMgSWRNYXBwaW5nLCBPcm1Db2x1bW5NYXBwaW5nLCBPcm1Db252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlYbWxJZCBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0KLQlPcm1HZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7Ci0JCi0JT3JtR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQlPcm1HZW5lcmF0ZWRWYWx1ZSBhZGRHZW5lcmF0ZWRWYWx1ZSgpOwkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzdmNTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSm9pbkNvbHVtbgotCWV4dGVuZHMgSm9pbkNvbHVtbiwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLCBPcm1CYXNlSm9pbkNvbHVtbiwgT3JtQmFzZUNvbHVtbgotewotCVhtbEpvaW5Db2x1bW4gZ2V0WG1sQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTMyNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uQ29udGFpbmVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGpvaW4gY29sdW1uIHJlbGF0aW9uc2hpcAotICogKDE6MSwgMTptLCBtOjEsIGFuZCBhc3NvY2lhdGlvbiBvdmVycmlkZSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLQlleHRlbmRzIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAsIE9ybVJlbGF0aW9uc2hpcAotewotCVhtbEpvaW5Db2x1bW5Db250YWluZXIgZ2V0WG1sQ29udGFpbmVyKCk7Ci0JCi0JT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhZjg4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gam9pbiBjb2x1bW4gcmVsYXRpb25zaGlwIHN0cmF0ZWd5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBPcm1SZWxhdGlvbnNoaXBTdHJhdGVneQotewotCUxpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpOwotCi0JTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JT3JtSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKCk7Ci0JT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQlPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2VjNmMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gam9pbiB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSm9pblRhYmxlCi0JZXh0ZW5kcyBKb2luVGFibGUsIE9ybVJlZmVyZW5jZVRhYmxlCi17Ci0JT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UGFyZW50KCk7Ci0KLQkvLyAqKioqKioqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQotCUxpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQlPcm1Kb2luQ29sdW1uIGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpOwotCU9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCU9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDE1ZGYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZUNvbnRhaW5lcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIHRhYmxlIHJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSwgbTptKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBKb2luVGFibGVSZWxhdGlvbnNoaXAsIE9ybVJlbGF0aW9uc2hpcAotewotCVhtbEpvaW5UYWJsZUNvbnRhaW5lciBnZXRYbWxDb250YWluZXIoKTsKLQkKLQlPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNTM4NGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gam9pbiB0YWJsZSByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSwgT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlPcm1Kb2luVGFibGUgZ2V0Sm9pblRhYmxlKCk7Ci0JCi0JWG1sSm9pblRhYmxlIGdldFhtbEpvaW5UYWJsZSgpOwotCQotCVhtbEpvaW5UYWJsZSBidWlsZFhtbEpvaW5UYWJsZSgpOwotCi0Jdm9pZCByZW1vdmVYbWxKb2luVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybUxvYkNvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTG9iQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YTQ3NDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTG9iQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Mb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IExPQiBjb252ZXJ0ZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTG9iQ29udmVydGVyCi0JZXh0ZW5kcyBMb2JDb252ZXJ0ZXIsIE9ybUNvbnZlcnRlcgotewotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFkYXB0ZXIKLQkJaW1wbGVtZW50cyBPcm1Db252ZXJ0ZXIuQWRhcHRlciwgT3JtQ29udmVydGVyLk93bmVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQkJcmV0dXJuIExvYkNvbnZlcnRlci5jbGFzczsKLQkJfQotCi0JCXB1YmxpYyBPcm1Db252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlYbWxDb252ZXJ0aWJsZU1hcHBpbmcgeG1sTWFwcGluZyA9IChYbWxDb252ZXJ0aWJsZU1hcHBpbmcpIHBhcmVudC5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCQlyZXR1cm4geG1sTWFwcGluZy5pc0xvYigpID8gZmFjdG9yeS5idWlsZE9ybUxvYkNvbnZlcnRlcihwYXJlbnQsIHRoaXMpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQkJcmV0dXJuICgoWG1sQ29udmVydGlibGVNYXBwaW5nKSB4bWxNYXBwaW5nKS5pc0xvYigpOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE5ld0NvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtTG9iQ29udmVydGVyKHBhcmVudCwgdGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhclhtbFZhbHVlKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQkJKChYbWxDb252ZXJ0aWJsZU1hcHBpbmcpIHhtbE1hcHBpbmcpLnNldExvYihmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gSnB0VmFsaWRhdG9yLk51bGwuaW5zdGFuY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTVlNWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtOm0gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFueVRvTWFueU1hcHBpbmcgCi0JZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZywgT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JWG1sTWFueVRvTWFueSBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCi0JT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZjJkN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG06bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIE1hbnlUb01hbnlSZWxhdGlvbnNoaXAsCi0JCU9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwLAotCQlPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwCi17Ci0JWG1sTWFueVRvTWFueSBnZXRYbWxDb250YWluZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJkMDdjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbToxIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYW55VG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nLCBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JWG1sTWFueVRvT25lIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkKLQlPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFueVRvT25lUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiNDdmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbToxIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFueVRvT25lUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbnNoaXAsIE9ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwCi17Ci0JWG1sTWFueVRvT25lIGdldFhtbENvbnRhaW5lcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZEJ5UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYzE5MjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZEJ5TWFwcGluZzsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiAibWFwcGVkIGJ5IiByZWxhdGlvbnNoaXAgKDE6MSwgMTptLCBtOm0pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgTWFwcGVkQnlSZWxhdGlvbnNoaXAsIE9ybVJlbGF0aW9uc2hpcAotewotCVhtbE1hcHBlZEJ5TWFwcGluZyBnZXRYbWxDb250YWluZXIoKTsKLQkKLQlPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyNTBmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiAibWFwcGVkIGJ5IiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIE9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3Njc1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGVkIHN1cGVyY2xhc3MKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hcHBlZFN1cGVyY2xhc3MKLQlleHRlbmRzIE1hcHBlZFN1cGVyY2xhc3MsIE9ybVR5cGVNYXBwaW5nCi17Ci0JWG1sTWFwcGVkU3VwZXJjbGFzcyBnZXRYbWxUeXBlTWFwcGluZygpOwotCi0JT3JtSWRDbGFzc1JlZmVyZW5jZSBnZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0KLQlKYXZhTWFwcGVkU3VwZXJjbGFzcyBnZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQotCUphdmFNYXBwZWRTdXBlcmNsYXNzIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0ODQ2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtYXBwaW5nIGpvaW4gY29sdW1uIHJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLQlleHRlbmRzIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAsIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjQwM2JiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGluZyBqb2luIHRhYmxlIHJlbGF0aW9uc2hpcCAoMToxLCAxOm0sIG06MSwgbTptKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXAsCi0JCU9ybU1hcHBpbmdSZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY2NjcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU1hcHBpbmdSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHBpbmcgcmVsYXRpb25zaGlwICgxOjEsIDE6bSwgbToxLCBtOm0pCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYXBwaW5nUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBNYXBwaW5nUmVsYXRpb25zaGlwLCBPcm1SZWxhdGlvbnNoaXAKLXsKLQlPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIGdldE1hcHBpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjYyMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG11bHRpLXZhbHVlZCByZWxhdGlvbnNoaXAgKDE6bSwgbTptKSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIAotCWV4dGVuZHMgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLCBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nLCBPcm1Db2xsZWN0aW9uTWFwcGluZwotewotCUFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAzNGJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4KLSAqIDx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8bGk+ZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxsaT5vcmRlciBjb2x1bW4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTmFtZWRDb2x1bW4KLQlleHRlbmRzIE5hbWVkQ29sdW1uLCBPcm1SZWFkT25seU5hbWVkQ29sdW1uCi17Ci0JWG1sTmFtZWRDb2x1bW4gZ2V0WG1sQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjBiYzJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci0KLS8qKgotICogT3JtIGJhc2UgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotCWV4dGVuZHMgTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLCBPcm1OYW1lZENvbHVtbgotewotCS8vY29tYmluaW5nIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQyZjJjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG5hbWVkIG5hdGl2ZSBxdWVyeQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTmFtZWROYXRpdmVRdWVyeQotCWV4dGVuZHMgT3JtUXVlcnksIE5hbWVkTmF0aXZlUXVlcnkKLXsKLQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IGdldFhtbFF1ZXJ5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1OYW1lZFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYmFjMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG5hbWVkIHF1ZXJ5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU5hbWVkUXVlcnkKLQlleHRlbmRzIE9ybVF1ZXJ5LCBOYW1lZFF1ZXJ5Ci17Ci0JWG1sTmFtZWRRdWVyeSBnZXRYbWxRdWVyeSgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTg0Y2I5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiAxOm0gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9NYW55TWFwcGluZwotCWV4dGVuZHMgT25lVG9NYW55TWFwcGluZywgT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JWG1sT25lVG9NYW55IGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkKLQlPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM3ZDY0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gMTptIHJlbGF0aW9uc2hpcCByZWZlcmVuY2UKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgT25lVG9NYW55UmVsYXRpb25zaGlwLAotCQlPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcCwKLQkJT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcAotewotCVhtbE9uZVRvTWFueSBnZXRYbWxDb250YWluZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYmZlOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IDE6MSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9PbmVNYXBwaW5nIAotCWV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JWG1sT25lVG9PbmUgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCQotCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvT25lUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ3YWFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU9uZVRvT25lUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiAxOjEgcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1PbmVUb09uZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgT25lVG9PbmVSZWxhdGlvbnNoaXAsCi0JCU9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwLAotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCwKLQkJT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLXsKLQlYbWxPbmVUb09uZSBnZXRYbWxDb250YWluZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU9yZGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT3JkZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Yzc4MDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT3JkZXJhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBNdWx0aS12YWx1ZWQgKDE6bSwgbTptKSByZWxhdGlvbnNoaXAgbWFwcGluZ3Mgc3VwcG9ydCBvcmRlcmluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU9yZGVyYWJsZQotCWV4dGVuZHMgT3JkZXJhYmxlLCBYbWxDb250ZXh0Tm9kZQotewotCU9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1PdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxNGRkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZV87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPdmVycmlkZTsKLQotLyoqCi0gKiA8ZW0+U3BlY2lmaWVkPC9lbT4gPGNvZGU+b3JtLnhtbDwvY29kZT4gb3ZlcnJpZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT3ZlcnJpZGUKLQlleHRlbmRzIE92ZXJyaWRlXywgT3JtUmVhZE9ubHlPdmVycmlkZQotewotCVhtbE92ZXJyaWRlIGdldFhtbE92ZXJyaWRlKCk7Ci0KLQkvLyBjb3ZhcmlhbnQgb3ZlcnJpZGVzCi0JT3JtVmlydHVhbE92ZXJyaWRlIGNvbnZlcnRUb1ZpcnR1YWwoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1PdmVycmlkZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzM1NzUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU92ZXJyaWRlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVfOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE92ZXJyaWRlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbiBvdmVycmlkZSBjb250YWluZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBPdmVycmlkZUNvbnRhaW5lciwgWG1sQ29udGV4dE5vZGUKLXsKLQkvLyBjb3ZhcmlhbnQgb3ZlcnJpZGVzCi0JLyoqCi0JICogV2UgbmVlZCB0aGlzIGNvdmFyaWFudCBvdmVycmlkZSBiZWNhdXNlIHRoZXJlIGlzIG5vIG92ZXJyaWRlCi0JICogPGVtPmNvbnRhaW5lcjwvZW0+IGVsZW1lbnQgaW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGU7Ci0JICogdGhlcmUgaXMgc2ltcGx5IGEgbGlzdCBvZiBvdmVycmlkZXMuCi0JICovCi0JWG1sQ29udGV4dE5vZGUgZ2V0UGFyZW50KCk7Ci0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBPcm1SZWFkT25seU92ZXJyaWRlPiBnZXRPdmVycmlkZXMoKTsKLQlPcm1SZWFkT25seU92ZXJyaWRlIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpOwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgT3JtT3ZlcnJpZGU+IGdldFNwZWNpZmllZE92ZXJyaWRlcygpOwotCU9ybU92ZXJyaWRlIGdldFNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCk7Ci0JT3JtT3ZlcnJpZGUgZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSk7Ci0JTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBPcm1WaXJ0dWFsT3ZlcnJpZGU+IGdldFZpcnR1YWxPdmVycmlkZXMoKTsKLQlPcm1WaXJ0dWFsT3ZlcnJpZGUgY29udmVydE92ZXJyaWRlVG9WaXJ0dWFsKE92ZXJyaWRlXyBzcGVjaWZpZWRPdmVycmlkZSk7Ci0JT3JtT3ZlcnJpZGUgY29udmVydE92ZXJyaWRlVG9TcGVjaWZpZWQoVmlydHVhbE92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSk7Ci0KLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIE92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewkJCi0JCTxUIGV4dGVuZHMgWG1sT3ZlcnJpZGU+IEVMaXN0PFQ+IGdldFhtbE92ZXJyaWRlcygpOwotCQkKLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgb3ZlcnJpZGVzLCBzcGVjaWZpZWQgYW5kCi0JCSAqIHZpcnR1YWwuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgSmF2YSBvdmVycmlkZXMgYXJlIG5vdCByZWxldmFudAotCQkgKiAoaS5lLiB0aGUgcGFyZW50IGlzIG5vdCBhbiBlbnRpdHksIHRoZSBwYXJlbnQgZW50aXR5IGhhcyBubyAKLQkJICogY29ycmVzcG9uZGluZyBKYXZhIGVudGl0eSwgb3IgdGhlIHBhcmVudCBlbnRpdHkgaXMgPGVtPm1ldGFkYXRhCi0JCSAqIGNvbXBsZXRlPC9lbT4pLiBSZXR1cm4gYW4gZW1wdHkgbGlzdCBpZiB0aGUgSmF2YSBvdmVycmlkZXMgYXJlCi0JCSAqIDxlbT5wb3NzaWJsZTwvZW0+IGJ1dCB0aGVyZSBhcmUgc2ltcGx5IG5vbmUuCi0JCSAqIDxwPgotCQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBVbmxpa2Ugb3ZlcnJpZGVzIGFzc29jaWF0ZWQgd2l0aCBhdHRyaWJ1dGUKLQkJICogbWFwcGluZ3MsIHRoZSBvdmVycmlkZXMgYXNzb2NpYXRlZCB3aXRoIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+Ci0JCSAqIGVudGl0eSBhcmUgPGVtPmFkZGl0aXZlPC9lbT4gdG8gYW55IHNwZWNpZmllZCBKYXZhIG92ZXJyaWRlcy4gQW4KLQkJICogPGNvZGU+b3JtLnhtbDwvY29kZT4gb3ZlcnJpZGUgb25seSBvdmVycmlkZXMgdGhlIEphdmEgb3ZlcnJpZGUgd2l0aAotCQkgKiB0aGUgc2FtZSBuYW1lLiBbSlBBIHNwZWMgMTAuMS4zLjEzLTE0OyBKUEEgMi4wIHNwZWMgMTIuMi4zLjE0LTE1XQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPdmVycmlkZUNvbnRhaW5lciNnZXRPdmVycmlkZU5hbWVzKCkKLQkJICovCi0JCUl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YU92ZXJyaWRlTmFtZXMoKTsKLQotCQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCi0JCU9ybVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybU92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlMGE2MGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAgCi0JZXh0ZW5kcyBPdmVycmlkZVJlbGF0aW9uc2hpcCwKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotewotCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0WG1sQ29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3Y2VkNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci0KLS8qKgotICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICogWE1MIHJlc291cmNlIG1vZGVsIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzfSwKLSAqIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPC9jb2RlPiBlbGVtZW50Ci0gKiBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JZXh0ZW5kcyBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBBY2Nlc3NIb2xkZXIKLXsKLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0UGFyZW50KCk7Ci0KLQkvLyAqKioqKioqKioqIHNjaGVtYSBjb250YWluZXIgKioqKioqKioqKgotCVNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgbmV3U3BlY2lmaWVkQ2F0YWxvZyk7Ci0JCVN0cmluZyBTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSA9ICJzcGVjaWZpZWRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpOwotCQlTdHJpbmcgREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZID0gImRlZmF1bHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCUNhdGFsb2cgZ2V0RGJDYXRhbG9nKCk7Ci0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0JU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBuZXdTcGVjaWZpZWRTY2hlbWEpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKTsKLQkJU3RyaW5nIERFRkFVTFRfU0NIRU1BX1BST1BFUlRZID0gImRlZmF1bHRTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0JU2NoZW1hIGdldERiU2NoZW1hKCk7Ci0KLQkvLyAqKioqKioqKioqIGNhc2NhZGUgcGVyc2lzdCAqKioqKioqKioqCi0Jdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIHZhbHVlKTsKLQkJU3RyaW5nIENBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSA9ICJjYXNjYWRlUGVyc2lzdCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTg3ZmZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCi0vKioKLSAqIENvbnRleHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVuY2UgdW5pdCBtZXRhZGF0YS4KLSAqIENvbnRleHQgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIFhNTCByZXNvdXJjZSBtb2RlbCB7QGxpbmsgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGF9LAotICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGE8L2NvZGU+IGVsZW1lbnQKLSAqIGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotCWV4dGVuZHMgTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotewotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlFbnRpdHlNYXBwaW5ncyBnZXRQYXJlbnQoKTsKLQotCS8qKgotCSAqIFRoaXMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+LiBUaGUgY29udGV4dCBtZXRhZGF0YSBpcyBhbHdheXMgcHJlc2VudCwKLQkgKiBldmVuIGlmIHRoZSBYTUwgbWV0YWRhdGEgaXMgbWlzc2luZy4KLQkgKi8KLQlYbWxFbnRpdHlNYXBwaW5ncyBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCXZvaWQgc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoYm9vbGVhbiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7Ci0JCVN0cmluZyBYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSA9ICJ4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0KLQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRm9yVXBkYXRlKCk7Ci0Jdm9pZCByZW1vdmVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUlmVW5zZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2MDUwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogQ29udGV4dCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW50IDxlbT5hdHRyaWJ1dGU8L2VtPgotICogKGZpZWxkIG9yIHByb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZQotCWV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0JLyoqCi0JICogUmV0dXJuIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHBpbmcgc2luY2UgdGhlIGF0dHJpYnV0ZSBpcwotCSAqIDxlbT5zcGVjaWZpZWQ8L2VtPi4KLQkgKi8KLQlPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldE1hcHBpbmcoKTsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIChjdXJyZW50bHkgc3BlY2lmaWVkKSBhdHRyaWJ1dGUgdG8gYSB2aXJ0dWFsIGF0dHJpYnV0ZS4KLQkgKiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZAotCSAqIGZyb20gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkIGF0dHJpYnV0ZXMKLQkgKiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLiBSZXR1cm4gdGhlIG5ldyBhdHRyaWJ1dGUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhdHRyaWJ1dGUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbgotCSAqIGF0dHJpYnV0ZSBpbiB0aGUgSmF2YSBwZXJzaXN0ZW50IHR5cGUuCi0JICogPHA+Ci0JICogQHNlZSAjaXNWaXJ0dWFsKCkKLQkgKiBAc2VlICNzZXRNYXBwaW5nS2V5KFN0cmluZykKLQkgKi8KLQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udmVydFRvVmlydHVhbCgpOwotCi0JT3JtQXR0cmlidXRlTWFwcGluZyBzZXRNYXBwaW5nS2V5KFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nIHdoZW4gaXQncyBuYW1lIGNoYW5nZXMsCi0JICogZWZmZWN0aXZlbHkgY2hhbmdpbmcgdGhlIGF0dHJpYnV0ZSdzIG5hbWUuCi0JICovCi0Jdm9pZCBuYW1lQ2hhbmdlZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpOwotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQsIHRoZSBuZXdOYW1lIGlzIHRoZSBuZXcgc2hvcnQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsUGFja2FnZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjg4MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW50IHR5cGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUGVyc2lzdGVudFR5cGUKLQlleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCBQZXJzaXN0ZW50VHlwZS5Pd25lciwgWG1sQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIGNvdmFyaWFudCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JRW50aXR5TWFwcGluZ3MgZ2V0UGFyZW50KCk7Ci0KLQlPcm1UeXBlTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBjb21iaW5hdGlvbiBvZiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgPGVtPnNwZWNpZmllZDwvZW0+IGFuZAotCSAqIDxlbT52aXJ0dWFsPC9lbT4gYXR0cmlidXRlcy4gVGhlIDxlbT5zcGVjaWZpZWQ8L2VtPiBhdHRyaWJ1dGVzIGFyZSB0aG9zZQotCSAqIGV4cGxpY2l0bHkgbGlzdGVkIGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlOyB3aGlsZSB0aGUKLQkgKiA8ZW0+dmlydHVhbDwvZW0+IGF0dHJpYnV0ZXMgYXJlIHRob3NlIGRlcml2ZWQgZnJvbSB0aGUgY29ycmVzcG9uZGluZwotCSAqIEphdmEgcGVyc2lzdGVudCB0eXBlLgotCSAqLwotCUxpc3RJdGVyYWJsZTxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKTsKLQotCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVOYW1lZChTdHJpbmcgYXR0cmlidXRlTmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGF0dHJpYnV0ZXMgKioqKioqKioqKgotCi0JU3RyaW5nIFNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QgPSAic3BlY2lmaWVkQXR0cmlidXRlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlJ3Mgc3BlY2lmaWVkIGF0dHJpYnV0ZXMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRoZSBwZXJzaXN0ZW50IHR5cGUncyBzcGVjaWZpZWQgYXR0cmlidXRlcy4KLQkgKi8KLQlpbnQgZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKTsKLQotCS8vIFRPRE8gdGhpcyBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHRlc3RzOyByZW1vdmUgaXQgYW5kIGNoYW5nZSB0ZXN0cyB0byB1c2UKLQkvLyBPcm1SZWFkT25seVBlcnNpc3RlbkF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoU3RyaW5nIG1hcHBpbmdLZXkpCi0JT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRTcGVjaWZpZWRBdHRyaWJ1dGUoU3RyaW5nIG1hcHBpbmdLZXksIFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotLy8gVE9ETyBianYgcmVuYW1lIHRvICdkZWZhdWx0QXR0cmlidXRlcycKLQkvLyAqKioqKioqKioqIGRlZmF1bHQgYXR0cmlidXRlcyAqKioqKioqKioqCi0KLQlTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QgPSAidmlydHVhbEF0dHJpYnV0ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdmlydHVhbCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW50IGF0dHJpYnV0ZXMuIFRoZXNlCi0JICogYXJlIGF0dHJpYnV0ZXMgdGhhdCBleGlzdCBpbiB0aGUgY29ycmVzcG9uZGluZyBKYXZhIGNsYXNzLCBidXQgYXJlIG5vdAotCSAqIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4uCi0JICovCi0JTGlzdEl0ZXJhYmxlPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHZpcnR1YWwgPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCBhdHRyaWJ1dGVzLgotCSAqIEBzZWUgI2dldFZpcnR1YWxBdHRyaWJ1dGVzKCkKLQkgKi8KLQlpbnQgZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIHRvIGEgdmlydHVhbCBhdHRyaWJ1dGUuIFJlbW92ZSB0aGUKLQkgKiBhdHRyaWJ1dGUgZnJvbSB0aGUgdHlwZSdzIGxpc3Qgb2Ygc3BlY2lmaWVkIGF0dHJpYnV0ZXMKLQkgKiBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuIFJldHVybiB0aGUgbmV3Ci0JICogKHZpcnR1YWwpIGF0dHJpYnV0ZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZG9lcyBub3QgY29ycmVzcG9uZAotCSAqIHRvIGFuIGF0dHJpYnV0ZSBpbiB0aGUgSmF2YSBwZXJzaXN0ZW50IHR5cGUuCi0JICogPHA+Ci0JICogVGhyb3cgYW4ge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbHJlYWR5Ci0JICogdmlydHVhbC4KLQkgKgotCSAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSNjb252ZXJ0VG9WaXJ0dWFsKCkKLQkgKi8KLQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udmVydEF0dHJpYnV0ZVRvVmlydHVhbChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZEF0dHJpYnV0ZSk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4uCi0JICogVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhbmQgbW92ZWQKLQkgKiBmcm9tIHRoZSBsaXN0IG9mIHZpcnR1YWwgYXR0cmlidXRlcyB0byB0aGUgbGlzdAotCSAqIG9mIHNwZWNpZmllZCBhdHRyaWJ1dGVzLiBJdCB3aWxsIGtlZXAgdGhlIHNhbWUgbWFwcGluZyBpdCBoYWQsIGVpdGhlcgotCSAqIHNwZWNpZmllZCBpbiBhIEphdmEgYW5ub3RhdGlvbiBvciB0aGUgZGVmYXVsdC4KLQkgKiA8cD4KLQkgKiBUaHJvdyBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpZiB0aGUgYXR0cmlidXRlIGlzIGFscmVhZHkKLQkgKiBzcGVjaWZpZWQuCi0JICoKLQkgKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUjY29udmVydFRvU3BlY2lmaWVkKCkKLQkgKi8KLQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnZlcnRBdHRyaWJ1dGVUb1NwZWNpZmllZChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSB0byB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbWFwcGluZy4gVGhlIGF0dHJpYnV0ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZQotCSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGFuZCBtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHZpcnR1YWwgYXR0cmlidXRlcyB0bwotCSAqIHRoZSBsaXN0IG9mIHNwZWNpZmllZCBhdHRyaWJ1dGVzLgotCSAqIDxwPgotCSAqIFRocm93IGFuIHtAbGluayBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IGlmIHRoZSBhdHRyaWJ1dGUgaXMgYWxyZWFkeQotCSAqIHNwZWNpZmllZC4KLQkgKgotCSAqIEBzZWUgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSNjb252ZXJ0VG9TcGVjaWZpZWQoU3RyaW5nKQotCSAqLwotCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udmVydEF0dHJpYnV0ZVRvU3BlY2lmaWVkKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlLCBTdHJpbmcgbWFwcGluZ0tleSk7Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyBtb3JwaGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgYXR0cmlidXRlJ3MgbWFwcGluZyBpcwotCSAqIGNoYW5nZWQgYXMgc3BlY2lmaWVkLgotCSAqLwotCXZvaWQgY2hhbmdlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUF0dHJpYnV0ZU1hcHBpbmcgb2xkTWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKTsKLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGlzIHtAbGluayBPcm1QZXJzaXN0ZW50VHlwZSNpc0ZvcihTdHJpbmcpfSB0aGUgZ2l2ZW4gSVR5cGUsIGNyZWF0ZSBhIHRleHQgCi0JICogRGVsZXRlRWRpdCBmb3IgZGVsZXRpbmcgdGhlIHR5cGUgbWFwcGluZyBlbGVtZW50IGFuZCBhbnkgdGV4dCB0aGF0IHByZWNlZGVzIGl0LgotCSAqIE90aGVyd2lzZSByZXR1cm4gYW4gRW1wdHlJdGVyYWJsZS4KLQkgKiBUaG91Z2ggdGhpcyB3aWxsIGNvbnRhaW4gMSBvciAwIERlbGV0ZUVkaXRzLCB1c2luZyBhbiBJdGVyYWJsZQotCSAqIGZvciBlYXNlIG9mIHVzZSB3aXRoIG90aGVyIGNyZWF0ZURlbGV0ZUVkaXQgQVBJLgotCSAqLwotCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZURlbGV0ZVR5cGVFZGl0cyhJVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQsIHRoZSBuZXdOYW1lIGlzIHRoZSBuZXcgc2hvcnQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsUGFja2FnZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgbWFwcGluZyB3aGVuIGl0cyBjbGFzcwotCSAqIChuYW1lKSBjaGFuZ2VzLgotCSAqLwotCXZvaWQgbWFwcGluZ0NsYXNzQ2hhbmdlZChTdHJpbmcgb2xkQ2xhc3MsIFN0cmluZyBuZXdDbGFzcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgcGVyc2lzdGVudCB0eXBlIHRoYXQgaXMgcmVmZXJyZWQgdG8gYnkgdGhlCi0JICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyBtaXNzaW5nLgotCSAqLwotCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJU3RyaW5nIEpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZID0gImphdmFQZXJzaXN0ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgZGVmYXVsdCBwYWNrYWdlLCBhcyBzZXQgaW4gaXRzIGVudGl0eQotCSAqIG1hcHBpbmdzLgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0UGFja2FnZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNDUxY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbgotCWV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW4sIE9ybUJhc2VKb2luQ29sdW1uCi17CQotCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGdldFhtbENvbHVtbigpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZENvbHVtbik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkMzA0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVsYXRpb25zaGlwICgxOjEpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcAotCWV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAsIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXAKLXsKLQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciBnZXRYbWxDb250YWluZXIoKTsKLQkKLQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3koKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhZWYzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIE9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JTGlzdEl0ZXJhYmxlPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzViZWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbmFtZWQgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVF1ZXJ5Ci0JZXh0ZW5kcyBRdWVyeSwgWG1sQ29udGV4dE5vZGUKLXsKLQlYbWxRdWVyeSBnZXRYbWxRdWVyeSgpOwotCi0KLQkvLyAqKioqKioqKioqIGhpbnRzICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxPcm1RdWVyeUhpbnQ+IGdldEhpbnRzKCk7Ci0KLQlPcm1RdWVyeUhpbnQgYWRkSGludCgpOwotCi0JT3JtUXVlcnlIaW50IGFkZEhpbnQoaW50IGluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXZvaWQgdmFsaWRhdGUoSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKTsKLQotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci0KLQlUZXh0UmFuZ2UgZ2V0UXVlcnlUZXh0UmFuZ2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUXVlcnlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0MjAwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBxdWVyeSBjb250YWluZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVF1ZXJ5Q29udGFpbmVyCi0JZXh0ZW5kcyBRdWVyeUNvbnRhaW5lciwgWG1sQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIG5hbWVkIHF1ZXJpZXMgKioqKioqKioqKgotCi0JTGlzdEl0ZXJhYmxlPE9ybU5hbWVkUXVlcnk+IGdldE5hbWVkUXVlcmllcygpOwotCi0JT3JtTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KCk7Ci0KLQlPcm1OYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoaW50IGluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBuYW1lZCBuYXRpdmUgcXVlcmllcyAqKioqKioqKioqCi0KLQlMaXN0SXRlcmFibGU8T3JtTmFtZWROYXRpdmVRdWVyeT4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0KLQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoKTsKLQotCU9ybU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1RdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc1NWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQ7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcXVlcnkgaGludAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUXVlcnlIaW50Ci0JZXh0ZW5kcyBRdWVyeUhpbnQsIFhtbENvbnRleHROb2RlCi17Ci0JWG1sUXVlcnlIaW50IGdldFhtbFF1ZXJ5SGludCgpOwotCQotCWJvb2xlYW4gaXNJZGVudGljYWwoUXVlcnlIaW50IHF1ZXJ5SGludCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY4MGVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gYXNzb2NpYXRpb24gb3ZlcnJpZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUsIE9ybVJlYWRPbmx5T3ZlcnJpZGUKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU0NDZjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci0KLS8qKgotICogUmVhZC1vbmx5IDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZSBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlCi0JZXh0ZW5kcyBSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlLCBPcm1SZWFkT25seU92ZXJyaWRlCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seUJhc2VDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzlkOWVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcmVhZC1vbmx5IGNvbHVtbiBvciBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seUJhc2VDb2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5QmFzZUNvbHVtbiwgT3JtUmVhZE9ubHlUYWJsZUNvbHVtbgotewotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpbnRlcmZhY2UgYWxsb3dpbmcgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChlLmcuIGJhc2ljIG1hcHBpbmdzIGFuZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIFJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lciwgT3JtUmVhZE9ubHlUYWJsZUNvbHVtbi5Pd25lcgotCXsKLQkJLy8gY29tYmluZSB0d28gaW50ZXJmYWNlcwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNjE5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seUJhc2VKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHJlYWQtb25seSBqb2luIGNvbHVtbiBvciBwcmltYXJ5IGtleSBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seUJhc2VKb2luQ29sdW1uCi0JZXh0ZW5kcyBSZWFkT25seUJhc2VKb2luQ29sdW1uLCBPcm1SZWFkT25seU5hbWVkQ29sdW1uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSAoYmVzdCBndWVzcykgdGV4dCBsb2NhdGlvbiBvZiB0aGUgY29sdW1uJ3MKLQkgKiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBqb2luIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiAxOjEgbWFwcGluZ3MgYW5kIGpvaW4gdGFibGVzKQotCSAqLwotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIsIE9ybVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIKLQl7Ci0JCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5Sm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWFiODRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5Sm9pbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcmVhZC1vbmx5IGpvaW4gY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seUpvaW5Db2x1bW4KLQlleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtbiwgT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiwgT3JtUmVhZE9ubHlCYXNlQ29sdW1uCi17Ci0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIsIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIsIE9ybVJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lcgotCXsKLQkJLy8gY29tYmluZSBpbnRlcmZhY2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlOYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzZmNmNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5TmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcmVhZC1vbmx5Ci0gKiA8dWw+Ci0gKiA8bGk+Y29sdW1uCi0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDxsaT5wcmltYXJ5IGtleSBqb2luIGNvbHVtbgotICogPGxpPmRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8bGk+b3JkZXIgY29sdW1uCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUmVhZE9ubHlOYW1lZENvbHVtbgotCWV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbiwgWG1sQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIChiZXN0IGd1ZXNzKSB0ZXh0IGxvY2F0aW9uIG9mIHRoZSBjb2x1bW4ncyBuYW1lLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoZS5nLiBiYXNpYyBtYXBwaW5ncyBhbmQgYXR0cmlidXRlIG92ZXJyaWRlcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyCi0JewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb2x1bW4gb3duZXIncyB0ZXh0IHJhbmdlLiBUaGlzIGNhbiBiZSByZXR1cm5lZCBieSB0aGUKLQkJICogY29sdW1uIHdoZW4gaXRzIGFubm90YXRpb24gaXMgbm90IHByZXNlbnQuCi0JCSAqLwotCQlUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWM5ZGEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotCi0KLS8qKgotICogT3JtIG5hbWVkIGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotCWV4dGVuZHMgUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4sIE9ybVJlYWRPbmx5TmFtZWRDb2x1bW4KLXsKLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIGRpc2NyaW1pbmF0b3IgY29sdW1ucyB0byBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcwotCSAqIChidXQgcHJldHR5IG11Y2gganVzdCBlbnRpdGllcykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciwgT3JtUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLy9jb21iaW5pbmcgaW50ZXJmYWNlcwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5T3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5T3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4YzBhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotCi0vKioKLSAqIFJlYWQtb25seSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seU92ZXJyaWRlCi0JZXh0ZW5kcyBSZWFkT25seU92ZXJyaWRlLCBYbWxDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgKGJlc3QgZ3Vlc3MpIHRleHQgbG9jYXRpb24gb2YgdGhlIG92ZXJyaWRlJ3MgbmFtZS4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkNjAxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLS8qKgotICogUmVhZC1vbmx5IGNvbnRleHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCA8ZW0+YXR0cmlidXRlPC9lbT4KLSAqIChmaWVsZCBvciBwcm9wZXJ0eSkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZQotCWV4dGVuZHMgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBYbWxDb250ZXh0Tm9kZQotewotCS8qKgotCSAqIEEgPGVtPnNwZWNpZmllZDwvZW0+IDxjb2RlPm9ybS54bWw8L2NvZGU+IGF0dHJpYnV0ZSB3aWxsIHJldHVybiBhbgotCSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHBpbmcsIHdoaWxlIGEgPGVtPnZpcnR1YWw8L2VtPiBhdHRyaWJ1dGUgd2lsbAotCSAqIHJldHVybiBhIEphdmEgbWFwcGluZy4gSWYgdGhlIGF0dHJpYnV0ZSBpcyA8ZW0+dmlydHVhbDwvZW0+LCB0aGUgcmV0dXJuZWQKLQkgKiAoSmF2YSkgbWFwcGluZyBpcyBhbHNvIDxlbT52aXJ0dWFsPC9lbT47IGkuZS4gaXQgaXMgcmVhZC1vbmx5IGFuZCBpcyBub3QgdG8KLQkgKiBiZSBtb2RpZmllZCAobm9yIGFyZSBhbnkgb2YgaXRzIHBhcnRzKS4gVGhlIG1vZGlmaWFibGUgSmF2YQotCSAqIG1hcHBpbmcgY2FuIGJlIHJldHJpZXZlZCB2aWEgdGhlIG1vZGlmaWFibGUgSmF2YSBhdHRyaWJ1dGU6Ci0JICoge0BsaW5rICNyZXNvbHZlSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKX0uCi0JICovCi0JQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCk7Ci0KLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpOwotCi0JT3JtVHlwZU1hcHBpbmcgZ2V0T3duaW5nVHlwZU1hcHBpbmcoKTsKLQotCS8qKgotCSAqIElmIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhdHRyaWJ1dGUgaXMgPGVtPnZpcnR1YWw8L2VtPiwgdGhlIHJldHVybmVkIEphdmEKLQkgKiBhdHRyaWJ1dGUgaXMgYWxzbyA8ZW0+dmlydHVhbDwvZW0+OyBpLmUuIGl0IGlzIHJlYWQtb25seSBhbmQgaXMgbm90IHRvCi0JICogYmUgbW9kaWZpZWQgKG5vciBhcmUgYW55IG9mIGl0cyBwYXJ0cyBbZS5nLiBjb2x1bW5dKS4gVGhlIG1vZGlmaWFibGUgSmF2YQotCSAqIGF0dHJpYnV0ZSBjYW4gYmUgcmV0cmlldmVkIHZpYSB7QGxpbmsgI3Jlc29sdmVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpfS4KLQkgKi8KLQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlTdHJpbmcgSkFWQV9QRVJTSVNURU5UX0FUVFJJQlVURV9QUk9QRVJUWSA9ICJqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gYXR0cmlidXRlJ3MgSmF2YSBhdHRyaWJ1dGU7IHdoaWNoLCBpbiB0aGUKLQkgKiBjYXNlIG9mIDxlbT52aXJ0dWFsPC9lbT4gYXR0cmlidXRlcywgaXMgbm90IHRoZSBzYW1lIEphdmEgYXR0cmlidXRlIGFzCi0JICogcmV0dXJuZWQgYnkge0BsaW5rICNnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpfS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHByb2JhYmx5IHVzZWZ1bCBvbmx5IHRvIHRlc3RzOyBzaW5jZSBub3RoaW5nIGVsc2Ugd2lsbCB3YW50IHRvCi0JICogbW9kaWZ5IHRoZSByZXR1cm5lZCBKYXZhIGF0dHJpYnV0ZS4KLQkgKi8KLQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQotCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCWJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlRmllbGQgamF2YVJlc291cmNlRmllbGQpOwotCi0JYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlU2V0dGVyKTsKLQotCWJvb2xlYW4gY29udGFpbnMoaW50IHRleHRPZmZzZXQpOwotCi0KLQkvLyAqKioqKioqKioqIHZpcnR1YWwgLT4gc3BlY2lmaWVkICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIChjdXJyZW50bHkgdmlydHVhbCkgYXR0cmlidXRlIHRvIGEgc3BlY2lmaWVkCi0JICogYXR0cmlidXRlLiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkCi0JICogYXR0cmlidXRlcyBhbmQgYWRkZWQgdG8gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuIFRoZSBtYXBwaW5nIHdpbGwKLQkgKiByZW1haW4gdGhlIHNhbWUuIFJldHVybiB0aGUgbmV3IGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1ZpcnR1YWwoKQotCSAqIEB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZAotCSAqLwotCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSAoY3VycmVudGx5IHZpcnR1YWwpIHBlcnNpc3RlbnQgYXR0cmlidXRlIHRvIGEgc3BlY2lmaWVkCi0JICogYXR0cmlidXRlLiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2Ygc3BlY2lmaWVkCi0JICogYXR0cmlidXRlcyBhbmQgYWRkZWQgdG8gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuIFRoZSBtYXBwaW5nIHdpbGwKLQkgKiBiZSBjaGFuZ2VkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIG1hcHBpbmcga2V5LgotCSAqIFJldHVybiB0aGUgbmV3IGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1ZpcnR1YWwoKQotCSAqIEB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZAotCSAqLwotCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udmVydFRvU3BlY2lmaWVkKFN0cmluZyBtYXBwaW5nS2V5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWUzYjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcmVsYXRpb25zaGlwIChqb2luIGNvbHVtbiwgam9pbiB0YWJsZSwgbWFwcGVkIGJ5LAotICogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4sIG1hcHBpbmcpCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWFkT25seVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgUmVhZE9ubHlSZWxhdGlvbnNoaXAsIFhtbENvbnRleHROb2RlCi17Ci0JT3JtUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGUyMDQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHJlYWQtb25seSByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSwgWG1sQ29udGV4dE5vZGUKLXsKLQlPcm1SZWFkT25seVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5VGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MzEyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcmVhZC1vbmx5IHRhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVJlYWRPbmx5VGFibGUKLQlleHRlbmRzIFJlYWRPbmx5VGFibGUsIFhtbENvbnRleHROb2RlCi17Ci0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKLQlUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKCk7Ci0JVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5VGFibGVDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5VGFibGVDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRjZDYzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWFkT25seVRhYmxlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHJlYWQtb25seSBjb2x1bW4gb3Igam9pbiBjb2x1bW4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUmVhZE9ubHlUYWJsZUNvbHVtbgotCWV4dGVuZHMgUmVhZE9ubHlUYWJsZUNvbHVtbiwgT3JtUmVhZE9ubHlOYW1lZENvbHVtbgotewotCS8qKgotCSAqIFJldHVybiB0aGUgKGJlc3QgZ3Vlc3MpIHRleHQgbG9jYXRpb24gb2YgdGhlIGNvbHVtbidzIHRhYmxlLgotCSAqLwotCVRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBjb2x1bW5zIHRvIGJlIHVzZWQgaW4gbXVsdGlwbGUgcGxhY2VzCi0JICogKGUuZy4gYmFzaWMgbWFwcGluZ3MgYW5kIGF0dHJpYnV0ZSBvdmVycmlkZXMpCi0JICovCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgUmVhZE9ubHlUYWJsZUNvbHVtbi5Pd25lciwgT3JtUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJLy8gY29tYmluZSB0d28gaW50ZXJmYWNlcwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4ZjhmMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiByZWFkLW9ubHkgdW5pcXVlIGNvbnN0cmFpbnQKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50LCBYbWxDb250ZXh0Tm9kZQotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVmZXJlbmNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlZmVyZW5jZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1MTE4YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVmZXJlbmNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVmZXJlbmNlVGFibGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gam9pbiB0YWJsZSBvciBjb2xsZWN0aW9uIHRhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWZlcmVuY2VUYWJsZQotCWV4dGVuZHMgUmVmZXJlbmNlVGFibGUsIE9ybVRhYmxlCi17Ci0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0KLQlMaXN0SXRlcmFibGU8T3JtSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQlPcm1Kb2luQ29sdW1uIGdldFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQlPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKTsKLQlPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCU9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmE2MTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHJlbGF0aW9uc2hpcCAoam9pbiBjb2x1bW4sIGpvaW4gdGFibGUsIG1hcHBlZCBieSwKLSAqIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLCBtYXBwaW5nKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXAsIE9ybVJlYWRPbmx5UmVsYXRpb25zaGlwCi17Ci0JT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0U3RyYXRlZ3koKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM5ZDQ2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcmVsYXRpb25zaGlwICgxOjEsIDE6bSwgbToxLCBtOm0pIG1hcHBpbmcuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nLCBPcm1BdHRyaWJ1dGVNYXBwaW5nCi17Ci0JQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkKLQlPcm1DYXNjYWRlIGdldENhc2NhZGUoKTsKLQotCU9ybU1hcHBpbmdSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwNGNhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kgCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXBTdHJhdGVneSwgT3JtUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCU9ybVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1TZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y0NzZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNlY29uZGFyeSB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1TZWNvbmRhcnlUYWJsZQotCWV4dGVuZHMgU2Vjb25kYXJ5VGFibGUsIE9ybVRhYmxlCi17Ci0JT3JtRW50aXR5IGdldFBhcmVudCgpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seVNlY29uZGFyeVRhYmxlIG9sZFNlY29uZGFyeVRhYmxlKTsKLQotCVhtbFNlY29uZGFyeVRhYmxlIGdldFhtbFRhYmxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCUxpc3RJdGVyYWJsZTxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JTGlzdEl0ZXJhYmxlPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQxNThhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNlcXVlbmNlIGdlbmVyYXRvcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtU2VxdWVuY2VHZW5lcmF0b3IKLQlleHRlbmRzIFNlcXVlbmNlR2VuZXJhdG9yLCBPcm1HZW5lcmF0b3IKLXsKLQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRYbWxHZW5lcmF0b3IoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZlODc3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gc2luZ2xlICgxOjEsIG06MSkgbWFwcGluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgCi0JZXh0ZW5kcyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLCBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nCi17Ci0JQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVN0cnVjdHVyZU5vZGVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1TdHJ1Y3R1cmVOb2Rlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJkOWM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVN0cnVjdHVyZU5vZGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotCi0vKioKLSAqIAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtU3RydWN0dXJlTm9kZXMgCi17Ci0JCi0JU3RyaW5nIEVOVElUWV9NQVBQSU5HU19JRCA9IEpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5vcm0uZW50aXR5TWFwcGluZ3MiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9JRCA9IEpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lEICsgIi5vcm0ucGVyc2lzdGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lEID0gSnB0SnBhQ29yZVBsdWdpbi5QTFVHSU5fSUQgKyAiLm9ybS5wZXJzaXN0ZW50QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODllNWQ5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHRhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1UYWJsZQotCWV4dGVuZHMgVGFibGUsIE9ybVJlYWRPbmx5VGFibGUKLXsKLQlMaXN0SXRlcmFibGU8T3JtVW5pcXVlQ29uc3RyYWludD4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKLQlPcm1VbmlxdWVDb25zdHJhaW50IGdldFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQlPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQlPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVRhYmxlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1UYWJsZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDNjYjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVRhYmxlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlQ29sdW1uOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGNvbHVtbiBvciBqb2luIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVGFibGVDb2x1bW4KLQlleHRlbmRzIFRhYmxlQ29sdW1uLCBPcm1SZWFkT25seVRhYmxlQ29sdW1uCi17Ci0JLy9jb21iaW5pbmcgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVRhYmxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNmQ1YmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0YWJsZSBnZW5lcmF0b3IKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMQotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVRhYmxlR2VuZXJhdG9yCi0JZXh0ZW5kcyBUYWJsZUdlbmVyYXRvciwgT3JtR2VuZXJhdG9yCi17Ci0JWG1sVGFibGVHZW5lcmF0b3IgZ2V0WG1sR2VuZXJhdG9yKCk7Ci0KLQotCS8vICoqKioqKioqKiogdW5pcXVlIGNvbnN0cmFpbnRzICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUl0ZXJhYmxlPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0KLQlPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQotCU9ybVVuaXF1ZUNvbnN0cmFpbnQgYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1UZW1wb3JhbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVGVtcG9yYWxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1MTVlZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1UZW1wb3JhbENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Db252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvblRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk9ybVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZzsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0ZW1wb3JhbCBjb252ZXJ0ZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVGVtcG9yYWxDb252ZXJ0ZXIKLQlleHRlbmRzIFRlbXBvcmFsQ29udmVydGVyLCBPcm1Db252ZXJ0ZXIKLXsKLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgT3duZXIgCi0JCWV4dGVuZHMgT3JtQ29udmVydGVyLk93bmVyCi0JewotCQlUZW1wb3JhbFR5cGUgZ2V0WG1sVGVtcG9yYWxUeXBlKCk7Ci0KLQkJdm9pZCBzZXRYbWxUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSk7Ci0KLQkJVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQlwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2ljQWRhcHRlciBleHRlbmRzIEFic3RyYWN0QWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBCYXNpY0FkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCi0JCXByaXZhdGUgQmFzaWNBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3duZXIgYnVpbGRPd25lcihmaW5hbCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcgbWFwcGluZykgewotCQkJcmV0dXJuIG5ldyBPcm1UZW1wb3JhbENvbnZlcnRlci5Pd25lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZXRYbWxUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSkgewotCQkJCQltYXBwaW5nLnNldFRlbXBvcmFsKHRlbXBvcmFsVHlwZSk7Ci0JCQkJfQotCQkJCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0WG1sVGVtcG9yYWxUeXBlKCkgewotCQkJCQlyZXR1cm4gbWFwcGluZy5nZXRUZW1wb3JhbCgpOwotCQkJCX0KLQkJCQlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgewotCQkJCQlyZXR1cm4gbWFwcGluZy5nZXRUZW1wb3JhbFRleHRSYW5nZSgpOwotCQkJCX0KLQkJCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQkJCXJldHVybiBuZXcgT3JtVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IoKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgRWxlbWVudENvbGxlY3Rpb25BZGFwdGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQotCQlwcml2YXRlIEVsZW1lbnRDb2xsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE93bmVyIGJ1aWxkT3duZXIoZmluYWwgWG1sQ29udmVydGlibGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCXJldHVybiBuZXcgT3JtVGVtcG9yYWxDb252ZXJ0ZXIuT3duZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2V0WG1sVGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJCQkJbWFwcGluZy5zZXRUZW1wb3JhbCh0ZW1wb3JhbFR5cGUpOwotCQkJCX0KLQkJCQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFhtbFRlbXBvcmFsVHlwZSgpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmcuZ2V0VGVtcG9yYWwoKTsKLQkJCQl9Ci0JCQkJcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmcuZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKLQkJCQl9Ci0JCQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZFZhbGlkYXRvcihDb252ZXJ0ZXIgY29udmVydGVyLCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJCQlyZXR1cm4gbmV3IE9ybUVsZW1lbnRDb2xsZWN0aW9uVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IoKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCi0JYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0QWRhcHRlcgotCQlpbXBsZW1lbnRzIE9ybUNvbnZlcnRlci5BZGFwdGVyCi0JewotCQlBYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3M7Ci0JCX0KLQotCQlwdWJsaWMgT3JtQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQkJWG1sQ29udmVydGlibGVNYXBwaW5nIHhtbE1hcHBpbmcgPSAoWG1sQ29udmVydGlibGVNYXBwaW5nKSBwYXJlbnQuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCQkJcmV0dXJuICh4bWxNYXBwaW5nLmdldFRlbXBvcmFsKCkgPT0gbnVsbCkgPyBudWxsIDogZmFjdG9yeS5idWlsZE9ybVRlbXBvcmFsQ29udmVydGVyKHBhcmVudCwgdGhpcy5idWlsZE93bmVyKHhtbE1hcHBpbmcpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1UZW1wb3JhbENvbnZlcnRlci5Pd25lciBidWlsZE93bmVyKGZpbmFsIFhtbENvbnZlcnRpYmxlTWFwcGluZyBtYXBwaW5nKTsgCi0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZShYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcpIHsKLQkJCXJldHVybiAoKFhtbENvbnZlcnRpYmxlTWFwcGluZykgeG1sTWFwcGluZykuZ2V0VGVtcG9yYWwoKSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE5ld0NvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtVGVtcG9yYWxDb252ZXJ0ZXIocGFyZW50LCB0aGlzLmJ1aWxkT3duZXIoKFhtbENvbnZlcnRpYmxlTWFwcGluZykgcGFyZW50LmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXJYbWxWYWx1ZShYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcpIHsKLQkJCSgoWG1sQ29udmVydGlibGVNYXBwaW5nKSB4bWxNYXBwaW5nKS5zZXRUZW1wb3JhbChudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlMWU0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdHJhbnNpZW50ICJtYXBwaW5nIgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVHJhbnNpZW50TWFwcGluZwotCWV4dGVuZHMgVHJhbnNpZW50TWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZwotewotCVhtbFRyYW5zaWVudCBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTczZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0eXBlIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVR5cGVNYXBwaW5nCi0JZXh0ZW5kcyBUeXBlTWFwcGluZywgWG1sQ29udGV4dE5vZGUKLXsKLQkvLyAqKioqKioqKioqIGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoaXMgbWF5IGJlIGEgcGFydGlhbCBuYW1lIHRvIGJlIHByZWZpeGVkIGJ5IHRoZQotCSAqIGVudGl0eSBtYXBwaW5ncydzIHBhY2thZ2UgdmFsdWUuCi0JICogCi0JICogQHNlZSBFbnRpdHlNYXBwaW5ncyNnZXRQYWNrYWdlKCkKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3NfKCk7Ci0KLQkvKioKLQkgKiBAc2VlICNnZXRDbGFzc18oKQotCSAqLwotCXZvaWQgc2V0Q2xhc3MoU3RyaW5nIGNsYXNzXyk7Ci0JCVN0cmluZyBDTEFTU19QUk9QRVJUWSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIElUeXBlfSB0aGF0IGlzIHJlc29sdmVkIGZyb20gdGhlIGNsYXNzIG5hbWUKLQkgKiBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCUlUeXBlIGdldEpkdFR5cGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBtZXRhZGF0YSBjb21wbGV0ZSAqKioqKioqKioqCi0KLQlib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuIG1ldGFkYXRhQ29tcGxldGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZID0gInNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBPdmVycmlkZSBtZXRhZGF0YSBjb21wbGV0ZSBpcyB0cnVlIGlmIHRoZSB0eXBlIG1hcHBpbmcncyBwZXJzaXN0ZW5jZQotCSAqIHVuaXQgaXMgbWFya2VkICJYTUwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZSIuCi0JICovCi0JYm9vbGVhbiBpc092ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpOwotCQlTdHJpbmcgT1ZFUlJJREVfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFkgPSAib3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIFhNTCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUeXBlIG1hcHBpbmdzIGFyZSBhIHNlcXVlbmNlIGluIHRoZSBvcm0gc2NoZW1hLiBXZSBtdXN0IGtlZXAKLQkgKiB0aGUgbGlzdCBvZiB0eXBlIG1hcHBpbmdzIGluIHRoZSBhcHByb3ByaWF0ZSBvcmRlciBzbyB0aGUgd3RwIHhtbCAKLQkgKiB0cmFuc2xhdG9ycyB3aWxsIHdyaXRlIHRoZW0gdG8gdGhlIHhtbCBpbiB0aGF0IG9yZGVyIGFuZCB0aGV5Ci0JICogd2lsbCBhZGhlcmUgdG8gdGhlIHNjaGVtYS4KLQkgKiA8cD4KLQkgKiBFYWNoIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG11c3QgaW1wbGVtZW50IHRoaXMKLQkgKiBtZXRob2QgYW5kIHJldHVybiBhbiBpbnQgdGhhdCBtYXRjaGVzIGl0cyBvcmRlciBpbiB0aGUgc2NoZW1hLgotCSAqLwotCWludCBnZXRYbWxTZXF1ZW5jZSgpOwotCQotCS8qKgotCSAqIEFkZCB0aGUgdHlwZSBtYXBwaW5nJ3MgWE1MIHR5cGUgbWFwcGluZyB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdAotCSAqIGluIHRoZSBzcGVjaWZpZWQgWE1MIGVudGl0eSBtYXBwaW5ncy4KLQkgKi8KLQl2b2lkIGFkZFhtbFR5cGVNYXBwaW5nVG8oWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSB0eXBlIG1hcHBpbmcncyBYTUwgdHlwZSBtYXBwaW5nIGZyb20gdGhlIGFwcHJvcHJpYXRlIGxpc3QKLQkgKiBpbiB0aGUgc3BlY2lmaWVkIFhNTCBlbnRpdHkgbWFwcGluZ3MuCi0JICovCi0Jdm9pZCByZW1vdmVYbWxUeXBlTWFwcGluZ0Zyb20oWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpOwotCi0JWG1sVHlwZU1hcHBpbmcgZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQotCVRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQotCVRleHRSYW5nZSBnZXRDbGFzc1RleHRSYW5nZSgpOwotCi0JVGV4dFJhbmdlIGdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKTsKLQkKLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgdHlwZSBtYXBwaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+Ci0JICogdHlwZSBtYXBwaW5nLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gc3VjaCBKYXZhIHR5cGUKLQkgKiBtYXBwaW5nOyBpLmUuIGl0IGRvZXMgbm90IGV4aXN0IG9yIGl0IGlzIG5vdCB0aGUgc2FtZSB0eXBlIG9mIHR5cGUKLQkgKiBtYXBwaW5nIChlbnRpdHksIG1hcHBlZCBzdXBlcmNsYXNzLCBlbWJlZGRhYmxlKS4KLQkgKiAKLQkgKiBAc2VlICNnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpCi0JICovCi0JSmF2YVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZygpOwotCQotCS8qKgotCSAqIENoZWNrICJtZXRhZGF0YSBjb21wbGV0ZSIgYmVmb3JlIHJldHVybmluZyB0aGUgSmF2YSB0eXBlIG1hcHBpbmcuCi0JICogRm9yIDxjb2RlPm9ybS54bWw8L2NvZGU+IGRlZmF1bHRzLCBpZiAibWV0YWRhdGEgY29tcGxldGUiIGlzCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlICNnZXRKYXZhVHlwZU1hcHBpbmcoKQotCSAqLwotCUphdmFUeXBlTWFwcGluZyBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSB0ZXh0IERlbGV0ZUVkaXQgZm9yIGRlbGV0aW5nIHRoZSB0eXBlIG1hcHBpbmcgZWxlbWVudCBhbmQgYW55IHRleHQgdGhhdCBwcmVjZWRlcyBpdAotCSAqLwotCURlbGV0ZUVkaXQgY3JlYXRlRGVsZXRlRWRpdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgcmVuYW1pbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9yaWdpbmFsVHlwZSB0byB0aGUgbmV3TmFtZS4KLQkgKiBUaGUgb3JpZ2luYWxUeXBlIGhhcyBub3QgeWV0IGJlZW4gcmVuYW1lZCwgdGhlIG5ld05hbWUgaXMgdGhlIG5ldyBzaG9ydCBuYW1lLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciBtb3ZpbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9yaWdpbmFsVHlwZSB0byB0aGUgbmV3UGFja2FnZS4KLQkgKiBUaGUgb3JpZ2luYWxUeXBlIGhhcyBub3QgeWV0IGJlZW4gbW92ZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgcmVuYW1pbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9yaWdpbmFsUGFja2FnZSB0byB0aGUgbmV3TmFtZS4KLQkgKiBUaGUgb3JpZ2luYWxQYWNrYWdlIGhhcyBub3QgeWV0IGJlZW4gcmVuYW1lZC4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpOwotCi0Jdm9pZCBpbml0aWFsaXplRnJvbShPcm1UeXBlTWFwcGluZyBvbGRNYXBwaW5nKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjRiN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLQotLyoqCi0gKiBQYXJ0IG9mIG1lY2hhbmlzbSB0byBleHRlbmQgdGhlIHR5cGVzIG9mIDxjb2RlPm9ybS54bWw8L2NvZGU+IHR5cGUgbWFwcGluZ3MuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmluaXRpb24ncyBtYXBwaW5nIGtleS4KLQkgKiBAc2VlIE1hcHBpbmdLZXlzCi0JICovCi0JU3RyaW5nIGdldEtleSgpOwotCQotCS8qKgotCSAqIEJ1aWxkIGEgcmVzb3VyY2UgbWFwcGluZyB1c2luZyB0aGUgc3BlY2lmZWQgZmFjdG9yeS4KLQkgKi8KLQlYbWxUeXBlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBCdWlsZCBhIGNvbnRleHQgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZCBwYXJlbnQgYW5kIHJlc291cmNlIG1hcHBpbmcsCi0JICogdXNpbmcgdGhlIHNwZWNpZmllZCBmYWN0b3J5LgotCSAqLwotCU9ybVR5cGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIAotCQkJWG1sVHlwZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzN2NhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1VbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHVuaXF1ZSBjb25zdHJhaW50Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1VbmlxdWVDb25zdHJhaW50Ci0JZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50LCBPcm1SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQKLXsKLQlYbWxVbmlxdWVDb25zdHJhaW50IGdldFhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQotCWJvb2xlYW4gaXNJZGVudGljYWwoT3JtVW5pcXVlQ29uc3RyYWludCBvcm1VbmlxdWVDb25zdHJhaW50KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjI5Y2YzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2ZXJzaW9uIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZlcnNpb25NYXBwaW5nCi0JZXh0ZW5kcyBWZXJzaW9uTWFwcGluZywgT3JtQ29sdW1uTWFwcGluZywgT3JtQ29udmVydGlibGVNYXBwaW5nCi17Ci0JWG1sVmVyc2lvbiBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjNjNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gPGVtPnZpcnR1YWw8L2VtPiBhc3NvY2lhdGlvbiBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZQotCWV4dGVuZHMgVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUsCi0JCQlPcm1WaXJ0dWFsT3ZlcnJpZGUsCi0JCQlPcm1SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUKLXsKLQlPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnZlcnRUb1NwZWNpZmllZCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3MDUzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotCi0vKioKLSAqIEphdmEgPGVtPnZpcnR1YWw8L2VtPiBhdHRyaWJ1dGUgb3ZlcnJpZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlCi0JZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUsCi0JCQlPcm1WaXJ0dWFsT3ZlcnJpZGUsCi0JCQlPcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlCi17Ci0JT3JtQXR0cmlidXRlT3ZlcnJpZGUgY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQlPcm1WaXJ0dWFsQ29sdW1uIGdldENvbHVtbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGVhZmJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbENvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsQ29sdW1uCi0JZXh0ZW5kcyBWaXJ0dWFsQ29sdW1uLCBPcm1SZWFkT25seUJhc2VDb2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgb3ZlcnJpZGRlbiBjb2x1bW4gY2FuIGJlIGVpdGhlciBhIEphdmEgam9pbiBjb2x1bW4gb3IgYW4KLQkgKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIGNvbHVtbjsgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSByZXR1cm4gdHlwZQotCSAqIGhlcmUuCi0JICovCi0JUmVhZE9ubHlDb2x1bW4gZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIFZpcnR1YWxDb2x1bW4uT3duZXIsIE9ybVJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lcgotCXsKLQkJLyoqCi0JCSAqIFRoZSBvdmVycmlkZGVuIGNvbHVtbiBjYW4gYmUgZWl0aGVyIGEgSmF2YSBjb2x1bW4gb3IgYW4KLQkJICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY29sdW1uOyBzbyB3ZSBkb24ndCBjaGFuZ2UgdGhlIHJldHVybiB0eXBlIGhlcmUuCi0JCSAqLwotCQlSZWFkT25seUNvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZmMTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pbkNvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGpvaW4gY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZpcnR1YWxKb2luQ29sdW1uCi0JZXh0ZW5kcyBWaXJ0dWFsSm9pbkNvbHVtbiwgT3JtUmVhZE9ubHlKb2luQ29sdW1uCi17Ci0JLyoqCi0JICogVGhlIG92ZXJyaWRkZW4gam9pbiBjb2x1bW4gY2FuIGJlIGVpdGhlciBhIEphdmEgam9pbiBjb2x1bW4gb3IgYW4KLQkgKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIGNvbHVtbjsgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZSByZXR1cm4gdHlwZQotCSAqIGhlcmUuCi0JICovCi0JUmVhZE9ubHlKb2luQ29sdW1uIGdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQ0MTU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdmlydHVhbCBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLQlleHRlbmRzIFZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwLAotCQkJT3JtVmlydHVhbFJlbGF0aW9uc2hpcAotewotCU9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzgwOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdmlydHVhbCBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3ksIE9ybVZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCUxpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCU9ybVZpcnR1YWxKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjAwMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbEpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pblRhYmxlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHZpcnR1YWwgam9pbiB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsSm9pblRhYmxlCi0JZXh0ZW5kcyBWaXJ0dWFsSm9pblRhYmxlLCBPcm1SZWFkT25seVRhYmxlCi17Ci0JT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFBhcmVudCgpOwotCi0JTGlzdEl0ZXJhYmxlPE9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCU9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGdldFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQotCUxpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCU9ybVZpcnR1YWxKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0KLQlMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+IGdldEludmVyc2VKb2luQ29sdW1ucygpOwotCUxpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQlPcm1WaXJ0dWFsSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQotCS8qKgotCSAqIFRoZSBvdmVycmlkZGVuIHRhYmxlIGNhbiBiZSBlaXRoZXIgYSBKYXZhIHRhYmxlCi0JICogb3IgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gdGFibGU7IHNvIHdlIGRvbid0IGNoYW5nZSB0aGUKLQkgKiByZXR1cm4gdHlwZSBoZXJlLgotCSAqLwotCXB1YmxpYyBSZWFkT25seUpvaW5UYWJsZSBnZXRPdmVycmlkZGVuVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjViNThjNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGpvaW4gdGFibGUgcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIFZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAsCi0JCQlPcm1WaXJ0dWFsUmVsYXRpb25zaGlwCi17Ci0JT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDcyZTcyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGpvaW4gdGFibGUgcmVsYXRpb25zaGlwIHN0cmF0ZWd5LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSwgT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JT3JtVmlydHVhbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbE92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYWJiYmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbE92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxPdmVycmlkZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiA8ZW0+dmlydHVhbDwvZW0+PHVsPgotICogPGxpPmF0dHJpYnV0ZSBvdmVycmlkZQotICogPGxpPmFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVmlydHVhbE92ZXJyaWRlCi0JZXh0ZW5kcyBWaXJ0dWFsT3ZlcnJpZGUsIE9ybVJlYWRPbmx5T3ZlcnJpZGUKLXsKLQlPcm1PdmVycmlkZSBjb252ZXJ0VG9TcGVjaWZpZWQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhZTM2MzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHZpcnR1YWwgYXNzb2NpYXRpb24gb3ZlcnJpZGUgcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwLAotCQkJT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Mzg4MjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLiBUaGlzIHJlcHJlc2VudHMKLSAqIGEgZGVmYXVsdCBjb2x1bW4gdGFrZW4gZnJvbSB0aGUgSmF2YSBlbnRpdHkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCWV4dGVuZHMgVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uLCBPcm1SZWFkT25seUJhc2VKb2luQ29sdW1uCi17Ci0JLyoqCi0JICogVGhpcyBpcyBub3QgdGhlIGJlc3QgbWV0aG9kIG5hbWU7IHdlIGFyZSBzaW1wbHkgb3ZlcmxvYWRpbmcgdGhlIG1lYW5pbmcKLQkgKiBvZiB0aGUgaW5oZXJpdGVkIG1ldGhvZC4gQSBiZXR0ZXIgbWV0aG9kIG5hbWUgd291bGQgYmUgc29tZXRoaW5nIGxpa2UKLQkgKiA8Y29kZT5nZXRKYXZhQ29sdW1uKCk8L2NvZGU+Ci0JICovCi0JSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzczOGUyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbFJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBWaXJ0dWFsUmVsYXRpb25zaGlwLCBPcm1SZWFkT25seVJlbGF0aW9uc2hpcAotewotCU9ybVZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjMjA5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdmlydHVhbCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIFZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneSwgT3JtUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCU9ybVZpcnR1YWxSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzc5MTNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdmlydHVhbCBzZWNvbmRhcnkgdGFibGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlCi0JZXh0ZW5kcyBWaXJ0dWFsU2Vjb25kYXJ5VGFibGUsIE9ybVJlYWRPbmx5VGFibGUKLXsKLQlMaXN0SXRlcmFibGU8T3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlMaXN0SXRlcmFibGU8T3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQlPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0KLQlKYXZhU2Vjb25kYXJ5VGFibGUgZ2V0T3ZlcnJpZGRlblRhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyYzFhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsVW5pcXVlQ29uc3RyYWludDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGRhdGFiYXNlIHVuaXF1ZSBjb25zdHJhaW50Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50Ci0JZXh0ZW5kcyBWaXJ0dWFsVW5pcXVlQ29uc3RyYWludCwgT3JtUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Ci17Ci0JLyoqCi0JICogVGhlIG92ZXJyaWRkZW4gdW5pcXVlIGNvbnN0cmFpbnQgY2FuIGJlIGVpdGhlciBhIEphdmEgdW5pcXVlIGNvbnN0cmFpbnQKLQkgKiBvciBhbiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB1bmlxdWUgY29uc3RyYWludDsgc28gd2UgZG9uJ3QgY2hhbmdlIHRoZQotCSAqIHJldHVybiB0eXBlIGhlcmUuCi0JICovCi0JUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IGdldE92ZXJyaWRkZW5VbmlxdWVDb25zdHJhaW50KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1YbWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjRhNTA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVhtbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLQotLyoqCi0gKiBKUEEgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVhtbAotCWV4dGVuZHMgTWFwcGluZ0ZpbGUKLXsKLQkvLyAqKioqKioqKioqIHJvb3QgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZQotCSAqIDxjb2RlPmVudGl0eS1tYXBwaW5nczwvY29kZT4gcHJvcGVydHkKLQkgKi8KLQlTdHJpbmcgUk9PVF9QUk9QRVJUWSA9ICJyb290IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCUVudGl0eU1hcHBpbmdzIGdldFJvb3QoKTsKLQotCU9ybVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTAwZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBjb250ZXh0IG5vZGUgZmFjdG9yeQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotLy8gVE9ETyBianYgd2UgbmVlZCBhIGZhY3RvcnkgaW50ZXJmYWNlIGZvciBhIDEuMCBvcm0ueG1sIGluIGEgMi4wIHByb2plY3QuLi4KLS8vIHNpbmNlIGl0IG11c3QgcmV0dXJuIHNsaWdodGx5IGRpZmZlcmVudCBvYmplY3RzIChlLmcuIDIuMCBhdHRyaWJ1dGUgbWFwcGluZ3MpCi0vLyBPcm1YbWwxXzBDb250ZXh0Tm9kZUZhY3RvcnkyXzAgPwotcHVibGljIGludGVyZmFjZSBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLXsKLQlFbnRpdHlNYXBwaW5ncyBidWlsZEVudGl0eU1hcHBpbmdzKE9ybVhtbCBwYXJlbnQsIFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKTsKLQotCU9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGJ1aWxkT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRW50aXR5TWFwcGluZ3MgcGFyZW50KTsKLQotCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGFyZW50KTsKLQotCS8qKgotCSAqIE5COiBBIGZhY3RvcnkgZm9yIGEgdmVyc2lvbiAxLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gaW4gYSBKUEEgMi4wIHByb2plY3QKLQkgKiBtdXN0IGJ1aWxkIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5QZXJzaXN0ZW50VHlwZTJfMCNnZXREZWNsYXJpbmdUeXBlTmFtZSgpCi0JICovCi0JT3JtUGVyc2lzdGVudFR5cGUgYnVpbGRPcm1QZXJzaXN0ZW50VHlwZShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFhtbFR5cGVNYXBwaW5nIHJlc291cmNlTWFwcGluZyk7Ci0KLQlPcm1FbnRpdHkgYnVpbGRPcm1FbnRpdHkoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbnRpdHkgcmVzb3VyY2VNYXBwaW5nKTsKLQotCU9ybU1hcHBlZFN1cGVyY2xhc3MgYnVpbGRPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBpbmcpOwotCi0JT3JtRW1iZWRkYWJsZSBidWlsZE9ybUVtYmVkZGFibGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbWJlZGRhYmxlIHJlc291cmNlTWFwcGluZyk7Ci0KLQkvKioKLQkgKiBOQjogQSBmYWN0b3J5IGZvciBhIHZlcnNpb24gMS4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IGluIGEgSlBBIDIuMCBwcm9qZWN0Ci0JICogbXVzdCBidWlsZCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlMl8wCi0JICovCi0JT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcpOwotCi0JLyoqCi0JICogTkI6IEEgZmFjdG9yeSBmb3IgYSB2ZXJzaW9uIDEuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBpbiBhIEpQQSAyLjAgcHJvamVjdAotCSAqIG11c3QgYnVpbGQgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTJfMAotCSAqLwotCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFZpcnR1YWxPcm1QZXJzaXN0ZW50RmllbGQoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCBqYXZhUmVzb3VyY2VGaWVsZCk7Ci0KLQkvKioKLQkgKiBOQjogQSBmYWN0b3J5IGZvciBhIHZlcnNpb24gMS4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IGluIGEgSlBBIDIuMCBwcm9qZWN0Ci0JICogbXVzdCBidWlsZCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlMl8wCi0JICovCi0JT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkVmlydHVhbE9ybVBlcnNpc3RlbnRQcm9wZXJ0eShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCBqYXZhUmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCBqYXZhUmVzb3VyY2VTZXR0ZXIpOwotCi0JT3JtVGFibGUgYnVpbGRPcm1UYWJsZShPcm1FbnRpdHkgcGFyZW50LCBUYWJsZS5Pd25lciBvd25lcik7Ci0KLQlPcm1TZWNvbmRhcnlUYWJsZSBidWlsZE9ybVNlY29uZGFyeVRhYmxlKE9ybUVudGl0eSBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyLCBYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSk7Ci0KLQlPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUgYnVpbGRPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUoT3JtRW50aXR5IHBhcmVudCwgUmVhZE9ubHlUYWJsZS5Pd25lciBvd25lciwgSmF2YVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSk7Ci0KLQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lciwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0KLQlPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1SZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQotCU9ybUpvaW5UYWJsZSBidWlsZE9ybUpvaW5UYWJsZShPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyKTsKLQotCU9ybVZpcnR1YWxKb2luVGFibGUgYnVpbGRPcm1WaXJ0dWFsSm9pblRhYmxlKE9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBwYXJlbnQsIFJlYWRPbmx5VGFibGUuT3duZXIgb3duZXIsIFJlYWRPbmx5Sm9pblRhYmxlIG92ZXJyaWRkZW5UYWJsZSk7Ci0KLQlPcm1Kb2luQ29sdW1uIGJ1aWxkT3JtSm9pbkNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgWG1sSm9pbkNvbHVtbiByZXNvdXJjZUpvaW5Db2x1bW4pOwotCi0JT3JtVmlydHVhbEpvaW5Db2x1bW4gYnVpbGRPcm1WaXJ0dWFsSm9pbkNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgUmVhZE9ubHlKb2luQ29sdW1uIG92ZXJyaWRkZW5Db2x1bW4pOwotCi0JT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKTsKLQotCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcik7Ci0KLQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgWG1sQXR0cmlidXRlT3ZlcnJpZGUgeG1sT3ZlcnJpZGUpOwotCi0JT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIG5hbWUpOwotCi0JT3JtQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUoT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sT3ZlcnJpZGUpOwotCi0JT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIG5hbWUpOwotCi0JT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAgYnVpbGRPcm1PdmVycmlkZVJlbGF0aW9uc2hpcChPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCk7Ci0KLQlPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAgYnVpbGRPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAoT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgcGFyZW50KTsKLQotCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRPcm1EaXNjcmltaW5hdG9yQ29sdW1uKE9ybUVudGl0eSBwYXJlbnQsIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgb3duZXIpOwotCi0JT3JtQ29sdW1uIGJ1aWxkT3JtQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQ29sdW1uLk93bmVyIG93bmVyKTsKLQotCU9ybVZpcnR1YWxDb2x1bW4gYnVpbGRPcm1WaXJ0dWFsQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtVmlydHVhbENvbHVtbi5Pd25lciBvd25lcik7Ci0KLQlPcm1HZW5lcmF0ZWRWYWx1ZSBidWlsZE9ybUdlbmVyYXRlZFZhbHVlKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sR2VuZXJhdGVkVmFsdWUgcmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSk7Ci0KLQlPcm1HZW5lcmF0b3JDb250YWluZXIgYnVpbGRPcm1HZW5lcmF0b3JDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxHZW5lcmF0b3JDb250YWluZXIgcmVzb3VyY2VHZW5lcmF0b3JDb250YWluZXIpOwotCi0JT3JtU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFNlcXVlbmNlR2VuZXJhdG9yIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOwotCi0JT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRPcm1UYWJsZUdlbmVyYXRvcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFRhYmxlR2VuZXJhdG9yIHJlc291cmNlVGFibGVHZW5lcmF0b3IpOwotCi0JT3JtUXVlcnlDb250YWluZXIgYnVpbGRPcm1RdWVyeUNvbnRhaW5lcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFF1ZXJ5Q29udGFpbmVyIHJlc291cmNlUXVlcnlDb250YWluZXIpOwotCi0JT3JtTmFtZWROYXRpdmVRdWVyeSBidWlsZE9ybU5hbWVkTmF0aXZlUXVlcnkoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHJlc291cmNlTmFtZWRRdWVyeSk7Ci0KLQlPcm1OYW1lZFF1ZXJ5IGJ1aWxkT3JtTmFtZWRRdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbE5hbWVkUXVlcnkgcmVzb3VyY2VOYW1lZFF1ZXJ5KTsKLQotCU9ybVF1ZXJ5SGludCBidWlsZE9ybVF1ZXJ5SGludChPcm1RdWVyeSBwYXJlbnQsIFhtbFF1ZXJ5SGludCByZXNvdXJjZVF1ZXJ5aGludCk7Ci0KLQkvKioKLQkgKiBOQjogQSBmYWN0b3J5IGZvciBhIHZlcnNpb24gMS4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IGluIGEgSlBBIDIuMCBwcm9qZWN0Ci0JICogbXVzdCBidWlsZCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzJfMAotCSAqLwotCU9ybUJhc2ljTWFwcGluZyBidWlsZE9ybUJhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWMgcmVzb3VyY2VNYXBwaW5nKTsKLQotCS8qKgotCSAqIE5COiBBIGZhY3RvcnkgZm9yIGEgdmVyc2lvbiAxLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gaW4gYSBKUEEgMi4wIHByb2plY3QKLQkgKiBtdXN0IGJ1aWxkIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wCi0JICovCi0JT3JtTWFueVRvTWFueU1hcHBpbmcgYnVpbGRPcm1NYW55VG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTWFueVRvTWFueSByZXNvdXJjZU1hcHBpbmcpOwotCi0JLyoqCi0JICogTkI6IEEgZmFjdG9yeSBmb3IgYSB2ZXJzaW9uIDEuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBpbiBhIEpQQSAyLjAgcHJvamVjdAotCSAqIG11c3QgYnVpbGQgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmcyXzAKLQkgKi8KLQlPcm1PbmVUb01hbnlNYXBwaW5nIGJ1aWxkT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyk7Ci0KLQkvKioKLQkgKiBOQjogQSBmYWN0b3J5IGZvciBhIHZlcnNpb24gMS4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IGluIGEgSlBBIDIuMCBwcm9qZWN0Ci0JICogbXVzdCBidWlsZCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzJfMAotCSAqLwotCU9ybU1hbnlUb09uZU1hcHBpbmcgYnVpbGRPcm1NYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9PbmUgcmVzb3VyY2VNYXBwaW5nKTsKLQotCS8qKgotCSAqIE5COiBBIGZhY3RvcnkgZm9yIGEgdmVyc2lvbiAxLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gaW4gYSBKUEEgMi4wIHByb2plY3QKLQkgKiBtdXN0IGJ1aWxkIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wCi0JICovCi0JT3JtT25lVG9PbmVNYXBwaW5nIGJ1aWxkT3JtT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcpOwotCi0JLyoqCi0JICogTkI6IEEgZmFjdG9yeSBmb3IgYSB2ZXJzaW9uIDEuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBpbiBhIEpQQSAyLjAgcHJvamVjdAotCSAqIG11c3QgYnVpbGQgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmcyXzAKLQkgKi8KLQlPcm1FbWJlZGRlZElkTWFwcGluZyBidWlsZE9ybUVtYmVkZGVkSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxFbWJlZGRlZElkIHJlc291cmNlTWFwcGluZyk7Ci0KLQkvKioKLQkgKiBOQjogQSBmYWN0b3J5IGZvciBhIHZlcnNpb24gMS4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IGluIGEgSlBBIDIuMCBwcm9qZWN0Ci0JICogbXVzdCBidWlsZCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzJfMAotCSAqLwotCU9ybUVtYmVkZGVkTWFwcGluZyBidWlsZE9ybUVtYmVkZGVkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRW1iZWRkZWQgcmVzb3VyY2VNYXBwaW5nKTsKLQotCS8qKgotCSAqIE5COiBBIGZhY3RvcnkgZm9yIGEgdmVyc2lvbiAxLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gaW4gYSBKUEEgMi4wIHByb2plY3QKLQkgKiBtdXN0IGJ1aWxkIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wCi0JICovCi0JT3JtSWRNYXBwaW5nIGJ1aWxkT3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxJZCByZXNvdXJjZU1hcHBpbmcpOwotCi0JLyoqCi0JICogTkI6IEEgZmFjdG9yeSBmb3IgYSB2ZXJzaW9uIDEuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBpbiBhIEpQQSAyLjAgcHJvamVjdAotCSAqIG11c3QgYnVpbGQgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmcyXzAKLQkgKi8KLQlPcm1UcmFuc2llbnRNYXBwaW5nIGJ1aWxkT3JtVHJhbnNpZW50TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVHJhbnNpZW50IHJlc291cmNlTWFwcGluZyk7Ci0KLQkvKioKLQkgKiBOQjogQSBmYWN0b3J5IGZvciBhIHZlcnNpb24gMS4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IGluIGEgSlBBIDIuMCBwcm9qZWN0Ci0JICogbXVzdCBidWlsZCBvYmplY3RzIHRoYXQgaW1wbGVtZW50IHRoZSBhcHByb3ByaWF0ZSBiZWhhdmlvci4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzJfMAotCSAqLwotCU9ybVZlcnNpb25NYXBwaW5nIGJ1aWxkT3JtVmVyc2lvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFZlcnNpb24gcmVzb3VyY2VNYXBwaW5nKTsKLQotCS8qKgotCSAqIE5COiBBIGZhY3RvcnkgZm9yIGEgdmVyc2lvbiAxLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gaW4gYSBKUEEgMi4wIHByb2plY3QKLQkgKiBtdXN0IGJ1aWxkIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wCi0JICovCi0JT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZE9ybU51bGxBdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpOwotCi0JLyoqCi0JICogTkI6IEEgZmFjdG9yeSBmb3IgYSB2ZXJzaW9uIDEuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBpbiBhIEpQQSAyLjAgcHJvamVjdAotCSAqIG11c3QgYnVpbGQgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmcyXzAKLQkgKi8KLQlPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpOwotCi0JT3JtVW5pcXVlQ29uc3RyYWludCBidWlsZE9ybVVuaXF1ZUNvbnN0cmFpbnQoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBVbmlxdWVDb25zdHJhaW50Lk93bmVyIG93bmVyLCBYbWxVbmlxdWVDb25zdHJhaW50IHJlc291cmNlVW5pcXVlQ29uc3RyYWludCk7Ci0KLQlPcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludCBidWlsZE9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50KFhtbENvbnRleHROb2RlIHBhcmVudCwgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IG92ZXJyaWRkZW5VbmlxdWVDb25zdHJhaW50KTsKLQotCU9ybUNvbnZlcnRlciBidWlsZE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIuT3duZXIgb3duZXIpOwotCi0JT3JtQ29udmVydGVyIGJ1aWxkT3JtVGVtcG9yYWxDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybVRlbXBvcmFsQ29udmVydGVyLk93bmVyIG93bmVyKTsKLQotCU9ybUNvbnZlcnRlciBidWlsZE9ybUxvYkNvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtQ29udmVydGVyLk93bmVyIG93bmVyKTsKLQotCS8qKgotCSAqIEpQQSAxLjAgb25seQotCSAqIDxwPgotCSAqIE5COiBBIGZhY3RvcnkgZm9yIGEgdmVyc2lvbiAxLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gaW4gYSBKUEEgMi4wIHByb2plY3QKLQkgKiBtdXN0IGJ1aWxkIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlIGFwcHJvcHJpYXRlIGJlaGF2aW9yLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wCi0JICovCi0JT3JtT3JkZXJhYmxlIGJ1aWxkT3JtT3JkZXJhYmxlKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvb3JtL09ybVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkMTc3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9Pcm1YbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGRlZmluaXRpb24KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtWG1sRGVmaW5pdGlvbgotCWV4dGVuZHMgTWFwcGluZ0ZpbGVEZWZpbml0aW9uCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBmYWN0b3J5IGZvciBidWlsZGluZyBYTUwgcmVzb3VyY2Ugbm9kZXMuCi0JICovCi0JRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmYWN0b3J5IGZvciBidWlsZGluZyBYTUwgY29udGV4dCBub2Rlcy4KLQkgKi8KLQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0KLQotCS8vICoqKioqKioqKiogdHlwZS9hdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGEgdHlwZSBtYXBwaW5nIGRlZmluaXRvbiBmb3IgdGhlIHNwZWNpZmllZCBtYXBwaW5nIGtleS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgbWFwcGluZyBrZXkgaXMgbm90Ci0JICogc3VwcG9ydGVkCi0JICovCi0JT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldFR5cGVNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdG9uIGZvciB0aGUgc3BlY2lmaWVkIG1hcHBpbmcga2V5LgotCSAqIE5ldmVyIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9VbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L29ybS9VbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNzU4ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9vcm0vVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nKHBhcmVudCwgKFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwMmU5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0NsYXNzUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIENvbnRleHQgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgWE1MIHJlc291cmNlIG1vZGVsCi0gKiB7QGxpbmsgWG1sSmF2YUNsYXNzUmVmfSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmNsYXNzPGNvZGU+IGVsZW1lbnQKLSAqIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0gKiBUaGlzIGlzIGFsc28gdXNlZCBmb3IgImltcGxpZWQiIGNsYXNzIHJlZnM7IGkuZS4gY2xhc3MgcmVmcyB0aGF0IGFyZSBub3QKLSAqIGV4cGxpY2l0bHkgbGlzdGVkIGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDbGFzc1JlZgotCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUsIFBlcnNpc3RlbnRUeXBlLk93bmVyCi17Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNsYXNzIHJlZiBpcyBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCi0JICovCi0JYm9vbGVhbiBpc0ZvcihTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtYXBwaW5nIGZpbGUgcmVmIGlzIDxlbT52aXJ0dWFsPC9lbT47Ci0JICogcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgbWFwcGluZyBmaWxlIHJlZiBpcyByZXByZXNlbnRlZCBieSBhbgotCSAqIGVudHJ5IGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0JICovCi0JYm9vbGVhbiBpc1ZpcnR1YWwoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY2xhc3MgcmVmJ3MgY29ycmVzcG9uZGluZyByZXNvdXJjZSBjbGFzcyByZWYuCi0JICogVGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgPGVtPmltcGxpZWQ8L2VtPiBjbGFzcyByZWZzLgotCSAqLwotCVhtbEphdmFDbGFzc1JlZiBnZXRYbWxDbGFzc1JlZigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwZXJzaXN0ZW5jZSB1bml0IGNvbnRhaW5zCi0JICogdGhlIGdpdmVuIHRleHQgb2Zmc2V0Ci0JICovCi0JYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCk7Ci0KLQotCS8vICoqKioqKioqKiogY2xhc3MgbmFtZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGNsYXNzIG5hbWUKLQkgKi8KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05BTUVfUFJPUEVSVFkgPSAiY2xhc3NOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyByZWYuCi0JICovCi0JU3RyaW5nIGdldENsYXNzTmFtZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyByZWYuCi0JICovCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogamF2YSBwZXJzaXN0ZW50IHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBqYXZhIHBlcnNpc3RlbnQgdHlwZQotCSAqLwotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSkFWQV9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFkgPSAiamF2YVBlcnNpc3RlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhUGVyc2lzdGVudFR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIElDbGFzc1JlZi4KLQkgKiBUaGlzIGNhbiBiZSBudWxsLgotCSAqIFRoaXMgaXMgbm90IHNldHRhYmxlIGJ5IHVzZXJzIG9mIHRoaXMgQVBJLgotCSAqLwotCUphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB0aGlzIHtAbGluayAjaXNGb3IoU3RyaW5nKX0gdGhlIGdpdmVuIElUeXBlLCBjcmVhdGUgYSB0ZXh0IAotCSAqIERlbGV0ZUVkaXQgZm9yIGRlbGV0aW5nIHRoZSBjbGFzcyBlbGVtZW50IGFuZCBhbnkgdGV4dCB0aGF0IHByZWNlZGVzIGl0LgotCSAqIE90aGVyd2lzZSByZXR1cm4gYW4gRW1wdHlJdGVyYWJsZS4KLQkgKiBUaG91Z2ggdGhpcyB3aWxsIGNvbnRhaW4gMSBvciAwIERlbGV0ZUVkaXRzLCB1c2luZyBhbiBJdGVyYWJsZQotCSAqIGZvciBlYXNlIG9mIHVzZSB3aXRoIG90aGVyIGNyZWF0ZURlbGV0ZUVkaXQgQVBJLgotCSAqLwotCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZURlbGV0ZVR5cGVFZGl0cyhJVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIHRoZSBjbGFzcyBlbGVtZW50IHRvIHRoZSBuZXdOYW1lLgotCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLCB0aGUgbmV3TmFtZSBpcyB0aGUgbmV3IHNob3J0IG5hbWUuCi0JICogSWYgdGhpcyBDbGFzc1JlZiBkb2VzIG5vdCBtYXRjaCB0aGUgb3JpZ2luYWwgdHlwZSwgdGhlbiByZXR1cm4gYW4gZW1wdHkgSXRlcmFibGUuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIG1vdmluZyBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb3JpZ2luYWxUeXBlIHRvIHRoZSBuZXdQYWNrYWdlLgotCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZC4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciByZW5hbWluZyB0aGUgY2xhc3MncyBwYWNrYWdlIHRvIHRoZSBuZXdOYW1lLgotCSAqIFRoZSBvcmlnaW5hbFBhY2thZ2UgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLgotCSAqIElmIHRoaXMgY2xhc3MgaXMgbm90IGEgcGFydCBvZiB0aGUgb3JpZ2luYWwgcGFja2FnZSwgdGhlbiByZXR1cm4gYW4gZW1wdHkgSXRlcmFibGUuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9KYXJGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0phckZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFlN2QzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL0phckZpbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICogWE1MIHJlc291cmNlIG1vZGVsIHtAbGluayBYbWxKYXJGaWxlUmVmfSwKLSAqIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5qYXItZmlsZTwvY29kZT4KLSAqIGVsZW1lbnQgaW4gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphckZpbGVSZWYKLQlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlLCBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lcgotewotCS8vICoqKioqKioqKiogZmlsZSBuYW1lICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZmlsZSBuYW1lLgotCSAqLwotCVN0cmluZyBGSUxFX05BTUVfUFJPUEVSVFkgPSAiZmlsZU5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpbGUgbmFtZSBvZiB0aGUgamFyIGZpbGUgcmVmLgotCSAqLwotCVN0cmluZyBnZXRGaWxlTmFtZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBmaWxlIG5hbWUgb2YgdGhlIGphciBmaWxlIHJlZi4KLQkgKi8KLQl2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogSkFSIGZpbGUgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBKQVIgZmlsZS4KLQkgKi8KLQlTdHJpbmcgSkFSX0ZJTEVfUFJPUEVSVFkgPSAiamFyRmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkFSIGZpbGUgcmVmJ3MgSkFSIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZSBuYW1lLgotCSAqLwotCUphckZpbGUgZ2V0SmFyRmlsZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbEZvbGRlciB0byB0aGUgbmV3TmFtZS4KLQkgKiBUaGUgb3JpZ2luYWxGb2xkZXIgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZXBsYWNlRm9sZGVyRWRpdHMoSUZvbGRlciBvcmlnaW5hbEZvbGRlciwgU3RyaW5nIG5ld05hbWUpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JWG1sSmFyRmlsZVJlZiBnZXRYbWxKYXJGaWxlUmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgSkFSIGZpbGUgcmVmIGNvbnRhaW5zCi0JICogdGhlIHNwZWNpZmllZCB0ZXh0IG9mZnNldC4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzNDFiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL01hcHBpbmdGaWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIENvbnRleHQgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUKLSAqIFhNTCByZXNvdXJjZSBtb2RlbCB7QGxpbmsgWG1sTWFwcGluZ0ZpbGVSZWZ9LAotICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPm1hcHBpbmctZmlsZTwvY29kZT4gZWxlbWVudAotICogaW4gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdGaWxlUmVmCi0JZXh0ZW5kcyBYbWxDb250ZXh0Tm9kZSwgSnBhU3RydWN0dXJlTm9kZSwgUGVyc2lzdGVudFR5cGVDb250YWluZXIKLXsKLQkvKioKLQkgKiBDb3ZhcmlhbnQgb3ZlcnJpZGUuCi0JICovCi0JUGVyc2lzdGVuY2VVbml0IGdldFBhcmVudCgpOwotCi0KLQkvLyAqKioqKioqKioqIGZpbGUgbmFtZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIGZpbGUgbmFtZS4KLQkgKi8KLQlTdHJpbmcgRklMRV9OQU1FX1BST1BFUlRZID0gImZpbGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWxlIG5hbWUgb2YgdGhlIG1hcHBpbmcgZmlsZSByZWYuCi0JICovCi0JU3RyaW5nIGdldEZpbGVOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGZpbGUgbmFtZSBvZiB0aGUgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQl2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFwcGluZyBmaWxlIHJlZiBpcyBhIHJlZmVyZW5jZSB0byB0aGUgc3BlY2lmaWVkIGZpbGUuCi0JICovCi0JYm9vbGVhbiBpc0ZvcihJRmlsZSBmaWxlKTsKLQotCi0JLy8gKioqKioqKioqKiBtYXBwaW5nIGZpbGUgKG9ybS54bWwpICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgbWFwcGluZyBmaWxlLgotCSAqLwotCVN0cmluZyBNQVBQSU5HX0ZJTEVfUFJPUEVSVFkgPSAibWFwcGluZ0ZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gbWFwcGluZyBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hcHBpbmcgZmlsZSByZWYncyBmaWxlIG5hbWUuCi0JICogVGhpcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGZpbGUgbmFtZSBpcyBpbnZhbGlkLgotCSAqLwotCU1hcHBpbmdGaWxlIGdldE1hcHBpbmdGaWxlKCk7Ci0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdCBtZXRhZGF0YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcgZmlsZSdzIHBlcnNpc3RlbmNlIHVuaXQgbWV0YWRhdGEuCi0JICovCi0JTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgZmlsZSdzIHBlcnNpc3RlbmNlIHVuaXQgbWV0YWRhdGEgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUV4aXN0cygpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nIGZpbGUgcmVmJ3MgY29ycmVzcG9uZGluZyBYTUwgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQlYbWxNYXBwaW5nRmlsZVJlZiBnZXRYbWxNYXBwaW5nRmlsZVJlZigpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgZmlsZSByZWYgaXMgImltcGxpZWQiIGJ5IChhcyBvcHBvc2VkIHRvCi0JICogZXhwbGljaXRseSBzcGVjaWZpZWQgaW4pIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LgotCSAqLwotCWJvb2xlYW4gaXNJbXBsaWVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHRleHQgb2Zmc2V0IGlzIHdpdGhpbgotCSAqIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtYXBwaW5nIGZpbGUuCi0JICovCi0JYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCk7Ci0KLQkvKioKLQkgKiBAc2VlIE1hcHBpbmdGaWxlI2dldE1hcHBpbmdGaWxlUXVlcmllcygpCi0JICovCi0JSXRlcmFibGU8UXVlcnk+IGdldE1hcHBpbmdGaWxlUXVlcmllcygpOwotCi0JLyoqCi0JICogQHNlZSBNYXBwaW5nRmlsZSNnZXRNYXBwaW5nRmlsZUdlbmVyYXRvcnMoKQotCSAqLwotCUl0ZXJhYmxlPEdlbmVyYXRvcj4gZ2V0TWFwcGluZ0ZpbGVHZW5lcmF0b3JzKCk7Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlIERlbGV0ZUVkaXRzIGZvciBkZWxldGluZyBhbnkgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gdHlwZSAKLQkgKiB0aGF0IGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQuCi0JICogUmV0dXJuIGFuIEVtcHR5SXRlcmFibGUgaWYgdGhlcmUgYXJlIG5vdCBhbnkgcmVmZXJlbmNlcyB0byB0aGUgZ2l2ZW4gdHlwZS4KLQkgKi8KLQlJdGVyYWJsZTxEZWxldGVFZGl0PiBjcmVhdGVEZWxldGVUeXBlRWRpdHMoSVR5cGUgdHlwZSk7Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHtAbGluayAjaXNGb3IoSUZpbGUpfSB0aGUgZ2l2ZW4gSUZpbGUsIGNyZWF0ZSBhIHRleHQgCi0JICogRGVsZXRlRWRpdCBmb3IgZGVsZXRpbmcgdGhlIG1hcHBpbmcgZmlsZSBlbGVtZW50IGFuZCBhbnkgdGV4dCB0aGF0IHByZWNlZGVzIGl0Ci0JICogZnJvbSB0aGUgcGVyc2lzdGVuY2UueG1sLgotCSAqIE90aGVyd2lzZSByZXR1cm4gYW4gRW1wdHlJdGVyYWJsZS4KLQkgKiBUaG91Z2ggdGhpcyB3aWxsIGNvbnRhaW4gMSBvciAwIERlbGV0ZUVkaXRzLCB1c2luZyBhbiBJdGVyYWJsZQotCSAqIGZvciBlYXNlIG9mIHVzZSB3aXRoIG90aGVyIGNyZWF0ZURlbGV0ZUVkaXQgQVBJLgotCSAqLwotCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZURlbGV0ZU1hcHBpbmdGaWxlRWRpdHMoSUZpbGUgZmlsZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciByZW5hbWluZyBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb3JpZ2luYWxUeXBlIHRvIHRoZSBuZXdOYW1lLgotCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLCB0aGUgbmV3TmFtZSBpcyB0aGUgbmV3IHNob3J0IG5hbWUuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIG1vdmluZyBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb3JpZ2luYWxUeXBlIHRvIHRoZSBuZXdQYWNrYWdlLgotCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZC4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciByZW5hbWluZyBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb3JpZ2luYWxQYWNrYWdlIHRvIHRoZSBuZXdOYW1lLgotCSAqIFRoZSBvcmlnaW5hbFBhY2thZ2UgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbEZvbGRlciB0byB0aGUgbmV3TmFtZS4KLQkgKiBUaGUgb3JpZ2luYWxGb2xkZXIgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVGb2xkZXJFZGl0cyhJRm9sZGVyIG9yaWdpbmFsRm9sZGVyLCBTdHJpbmcgbmV3TmFtZSk7Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHtAbGluayAjaXNGb3IoSUZpbGUpfSB0aGUgZ2l2ZW4gSUZpbGUsIGNyZWF0ZSBhIHRleHQgCi0JICogUmVwbGFjZUVkaXQgZm9yIHJlbmFtaW5nIHRoZSBtYXBwaW5nIGZpbGUgZWxlbWVudCB0byB0aGUgbmV3IG5hbWUuCi0JICogT3RoZXJ3aXNlIHJldHVybiBhbiBFbXB0eUl0ZXJhYmxlLgotCSAqIFRob3VnaCB0aGlzIHdpbGwgY29udGFpbiAxIG9yIDAgUmVwbGFjZUVkaXRzLCB1c2luZyBhbiBJdGVyYWJsZQotCSAqIGZvciBlYXNlIG9mIHVzZSB3aXRoIG90aGVyIGNyZWF0ZVJlcGxhY2VNYXBwaW5nRmlsZUVkaXRzIEFQSS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lTWFwcGluZ0ZpbGVFZGl0cyhJRmlsZSBvcmlnaW5hbEZpbGUsIFN0cmluZyBuZXdOYW1lKTsKLQotCS8qKgotCSAqIElmIHRoaXMge0BsaW5rICNpc0ZvcihJRmlsZSl9IHRoZSBnaXZlbiBJRmlsZSBjcmVhdGUgYSB0ZXh0Ci0JICogUmVwbGFjZUVkaXQgZm9yIG1vdmluZyB0aGUgb3JpZ2luYWxGaWxlIHRvIHRoZSBkZXN0aW5hdGlvbi4KLQkgKiBPdGhlcndpc2UgcmV0dXJuIGFuIEVtcHR5SXRlcmFibGUuCi0JICogVGhlIG9yaWdpbmFsRmlsZSBoYXMgbm90IGJlZW4gbW92ZWQgeWV0LgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlTWFwcGluZ0ZpbGVFZGl0cyhJRmlsZSBvcmlnaW5hbEZpbGUsIElQYXRoIHJ1bnRpbmVEZXN0aW5hdGlvbik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciBtb3ZpbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9yaWdpbmFsRm9sZGVyIHRvIHRoZSBydW50aW1lRGVzdGluYXRpb24uCi0JICogVGhlIHJ1bnRpbWVEZXN0aW5hdGlvbiBhbHJlYWR5IGluY2x1ZGVzIHRoZSBvcmlnaW5hbCBmb2xkZXIgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZUZvbGRlckVkaXRzKElGb2xkZXIgb3JpZ2luYWxGb2xkZXIsIElQYXRoIHJ1bnRpbWVEZXN0aW5hdGlvbik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMDhhZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBDb250ZXh0IG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFhNTCByZXNvdXJjZSBtb2RlbCB7QGxpbmsgWG1sUGVyc2lzdGVuY2V9LAotICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPnBlcnNpc3RlbmNlPC9jb2RlPiBlbGVtZW50IGluIHRoZQotICogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2UKLQlleHRlbmRzIFhtbENvbnRleHROb2RlLCBKcGFTdHJ1Y3R1cmVOb2RlCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtb2RlbCBvYmplY3QKLQkgKi8KLQlYbWxQZXJzaXN0ZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZSgpOwotCQotCS8qKgotCSAqIENvdmFyaWFudCBvdmVycmlkZS4KLQkgKi8KLQlQZXJzaXN0ZW5jZVhtbCBnZXRQYXJlbnQoKTsKLQkKLQotCS8vICoqKioqKioqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXRzIGxpc3QKLQkgKi8KLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCA9ICJwZXJzaXN0ZW5jZVVuaXRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgZWxlbWVudCdzIHBlcnNpc3RlbmNlIHVuaXRzLgotCSAqLwotCUxpc3RJdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQ+IGdldFBlcnNpc3RlbmNlVW5pdHMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBwZXJzaXN0ZW5jZSB1bml0cy4KLQkgKi8KLQlpbnQgZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKTsKLQkKLQkvKioKLQkgKiBBZGQgYSBwZXJzaXN0ZW5jZSB1bml0IGFuZCByZXR1cm4gaXQuCi0JICovCi0JUGVyc2lzdGVuY2VVbml0IGFkZFBlcnNpc3RlbmNlVW5pdCgpOwotCQotCS8qKgotCSAqIEFkZCBhIHBlcnNpc3RlbmNlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBhbmQgcmV0dXJuIGl0LgotCSAqLwotCVBlcnNpc3RlbmNlVW5pdCBhZGRQZXJzaXN0ZW5jZVVuaXQoaW50IGluZGV4KTsKLQkKLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBwZXJzaXN0ZW5jZSB1bml0IGZyb20gdGhlIHBlcnNpc3RlbmNlIG5vZGUuCi0JICovCi0Jdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCk7Ci0JCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgcGVyc2lzdGVuY2Ugbm9kZS4KLQkgKi8KLQl2b2lkIHJlbW92ZVBlcnNpc3RlbmNlVW5pdChpbnQgaW5kZXgpOwotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdGV4dCByYW5nZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHBlcnNpc3RlbmNlIGNvbnRhaW5zCi0JICogdGhlIHNwZWNpZmllZCB0ZXh0IG9mZnNldC4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMzQwNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzIAotewotCVN0cmluZyBQUkVGSVggPSBKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRF8gKyAicGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBSRUZJWF8gPSBQUkVGSVggKyAnLic7Ci0KLQlTdHJpbmcgUEVSU0lTVEVOQ0VfSUQgPSBQUkVGSVhfICsgInBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX0lEID0gUFJFRklYXyArICJwZXJzaXN0ZW5jZVVuaXQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENMQVNTX1JFRl9JRCA9IFBSRUZJWF8gKyAiY2xhc3NSZWYiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1BUFBJTkdfRklMRV9SRUZfSUQgPSBQUkVGSVhfICsgIm1hcHBpbmdGaWxlUmVmIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVJfRklMRV9SRUZfSUQgPSBQUkVGSVhfICsgImphckZpbGVSZWYiOyAvLyROT04tTkxTLTEkCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIzZTE1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIENvbnRleHQgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgWE1MIHJlc291cmNlIG1vZGVsIHtAbGluayBYbWxQZXJzaXN0ZW5jZVVuaXR9LAotICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLXVuaXQ8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCi0gKiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlVW5pdAotCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIEpwYVN0cnVjdHVyZU5vZGUsIFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyCi17Ci0JLyoqCi0JICogQ292YXJpYW50IG92ZXJyaWRlLgotCSAqLwotCVBlcnNpc3RlbmNlIGdldFBhcmVudCgpOwotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbmFtZS4KLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zYWN0aW9uIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSnBhSnBxbFF1ZXJ5SGVscGVyfSB0aGF0IHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgcmVsYXRlZCB0byBKUFFMIHF1ZXJpZXMuCi0JICovCi0JSnBhSnBxbFF1ZXJ5SGVscGVyIGNyZWF0ZUpwcWxRdWVyeUhlbHBlcigpOwotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zYWN0aW9uIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgdHJhbnNhY3Rpb24gdHlwZSwKLQkgKiB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQuCi0JICovCi0JUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFRyYW5zYWN0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBzcGVjaWZpZWQgdHJhbnNhY3Rpb24gdHlwZQotCSAqLwotCVN0cmluZyBTUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzcGVjaWZpZWQgdHJhbnNhY3Rpb24gdHlwZS4KLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzcGVjaWZpZWQgdHJhbnNhY3Rpb24gdHlwZS4KLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdHJhbnNhY3Rpb25UeXBlKTsKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCi0JICogZGVmYXVsdCB0cmFuc2FjdGlvbiB0eXBlIChub3QgdHlwaWNhbGx5IGNoYW5nZWQpLgotCSAqLwotCVN0cmluZyBERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkgPSAiZGVmYXVsdFRyYW5zYWN0aW9uVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlZmF1bHQgdHJhbnNhY3Rpb24gdHlwZS4KLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0RGVmYXVsdFRyYW5zYWN0aW9uVHlwZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGRlc2NyaXB0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0cmluZyBERVNDUklQVElPTl9QUk9QRVJUWSA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0KLQkvLyAqKioqKioqKioqIHByb3ZpZGVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3ZpZGVyLgotCSAqLwotCVN0cmluZyBQUk9WSURFUl9QUk9QRVJUWSA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3ZpZGVyLgotCSAqLwotCVN0cmluZyBnZXRQcm92aWRlcigpOwotCi0JLyoqCi0JICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgcHJvdmlkZXIuCi0JICovCi0Jdm9pZCBzZXRQcm92aWRlcihTdHJpbmcgcHJvdmlkZXIpOwotCi0KLQkvLyAqKioqKioqKioqIEpUQSBkYXRhIHNvdXJjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBKVEEgZGF0YSBzb3VyY2UKLQkgKi8KLQlTdHJpbmcgSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZID0gImp0YURhdGFTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBKVEEgZGF0YSBzb3VyY2UuCi0JICovCi0JU3RyaW5nIGdldEp0YURhdGFTb3VyY2UoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIEpUQSBkYXRhIHNvdXJjZS4KLQkgKi8KLQl2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIGp0YURhdGFTb3VyY2UpOwotCi0KLQkvLyAqKioqKioqKioqIG5vbi1KVEEgZGF0YSBzb3VyY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgbm9uLUpUQSBkYXRhIHNvdXJjZQotCSAqLwotCVN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZID0gIm5vbkp0YURhdGFTb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBub24tSlRBIGRhdGEgc291cmNlLgotCSAqLwotCVN0cmluZyBnZXROb25KdGFEYXRhU291cmNlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBub24tSlRBIGRhdGEgc291cmNlLgotCSAqLwotCXZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZShTdHJpbmcgbm9uSnRhRGF0YVNvdXJjZSk7Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyBmaWxlIHJlZnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGUgcmVmcywKLQkgKiBib3RoIHNwZWNpZmllZCBhbmQgaW1wbGllZC4KLQkgKi8KLQlMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldE1hcHBpbmdGaWxlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGUgcmVmcywKLQkgKiBib3RoIHNwZWNpZmllZCBhbmQgaW1wbGllZC4KLQkgKi8KLQlpbnQgZ2V0TWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIGFsbCB0aGUgbWFwcGluZyBmaWxlIHJlZnMsIGJvdGggc3BlY2lmaWVkIGFuZCBpbXBsaWVkLAotCSAqIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCB0eXBlLgotCSAqLwotCUl0ZXJhYmxlPE1hcHBpbmdGaWxlUmVmPiBnZXRNYXBwaW5nRmlsZVJlZnNDb250YWluaW5nKFN0cmluZyB0eXBlTmFtZSk7Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCi0JICogc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLgotCSAqLwotCVN0cmluZyBTUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRlNfTElTVCA9ICJzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBsaXN0IG9mIHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmcy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZnMuCi0JICovCi0JaW50IGdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIG5ldyBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdDsKLQkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQlNYXBwaW5nRmlsZVJlZiBhZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihTdHJpbmcgZmlsZU5hbWUpOwotCi0JLyoqCi0JICogQWRkIGEgbmV3IHNwZWNpZmllZCBtYXBwaW5nIGZpbGUgcmVmIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXg7Ci0JICogcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIG1hcHBpbmcgZmlsZSByZWYuCi0JICovCi0JTWFwcGluZ0ZpbGVSZWYgYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoaW50IGluZGV4LCBTdHJpbmcgZmlsZU5hbWUpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihpbnQgaW5kZXgpOwotCi0KLQkvLyAqKioqKioqKioqIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQlTdHJpbmcgSU1QTElFRF9NQVBQSU5HX0ZJTEVfUkVGX1BST1BFUlRZID0gImltcGxpZWRNYXBwaW5nRmlsZVJlZiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQlNYXBwaW5nRmlsZVJlZiBnZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQotCi0JLy8gKioqKioqKioqKiBqYXIgZmlsZSByZWZzICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCi0JICogSkFSIGZpbGUgcmVmcy4KLQkgKi8KLQlTdHJpbmcgSkFSX0ZJTEVfUkVGU19MSVNUID0gImphckZpbGVSZWZzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBKQVIgZmlsZSByZWZzLgotCSAqLwotCUxpc3RJdGVyYWJsZTxKYXJGaWxlUmVmPiBnZXRKYXJGaWxlUmVmcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBKQVIgZmlsZSByZWZzLgotCSAqLwotCWludCBnZXRKYXJGaWxlUmVmc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCBhIG5ldyBKQVIgZmlsZSByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQ7Ci0JICogcmV0dXJuIHRoZSBuZXdseS1jcmVhdGVkIEpBUiBmaWxlIHJlZi4KLQkgKi8KLQlKYXJGaWxlUmVmIGFkZEphckZpbGVSZWYoU3RyaW5nIGZpbGVOYW1lKTsKLQotCS8qKgotCSAqIEFkZCBhIG5ldyBKQVIgZmlsZSByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleDsKLQkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgSkFSIGZpbGUgcmVmLgotCSAqLwotCUphckZpbGVSZWYgYWRkSmFyRmlsZVJlZihpbnQgaW5kZXgsIFN0cmluZyBmaWxlTmFtZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBKQVIgZmlsZSByZWYgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHJlbW92ZUphckZpbGVSZWYoSmFyRmlsZVJlZiBqYXJGaWxlUmVmKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgSkFSIGZpbGUgcmVmIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHJlbW92ZUphckZpbGVSZWYoaW50IGluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBjbGFzcyByZWZzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgY2xhc3MgcmVmcywKLQkgKiBib3RoIHNwZWNpZmllZCBhbmQgaW1wbGllZC4KLQkgKi8KLQlJdGVyYWJsZTxDbGFzc1JlZj4gZ2V0Q2xhc3NSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBsaXN0IG9mIGNsYXNzIHJlZnMsCi0JICogYm90aCBzcGVjaWZpZWQgYW5kIGltcGxpZWQuCi0JICovCi0JaW50IGdldENsYXNzUmVmc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqIHNwZWNpZmllZCBjbGFzcyByZWZzLgotCSAqLwotCVN0cmluZyBTUEVDSUZJRURfQ0xBU1NfUkVGU19MSVNUID0gInNwZWNpZmllZENsYXNzUmVmcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2Ygc3BlY2lmaWVkIGNsYXNzIHJlZnMuCi0JICovCi0JTGlzdEl0ZXJhYmxlPENsYXNzUmVmPiBnZXRTcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2Ygc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWZzLgotCSAqLwotCWludCBnZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBuZXcgc3BlY2lmaWVkIGNsYXNzIHJlZiB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdDsKLQkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgY2xhc3MgcmVmLgotCSAqLwotCUNsYXNzUmVmIGFkZFNwZWNpZmllZENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpOwotCi0JLyoqCi0JICogQWRkIGEgbmV3IHNwZWNpZmllZCBjbGFzcyByZWYgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleDsKLQkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgY2xhc3MgcmVmLgotCSAqLwotCUNsYXNzUmVmIGFkZFNwZWNpZmllZENsYXNzUmVmKGludCBpbmRleCwgU3RyaW5nIGNsYXNzTmFtZSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjbGFzcyByZWYgZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZENsYXNzUmVmKENsYXNzUmVmIGNsYXNzUmVmKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNsYXNzIHJlZiBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpOwotCi0KLQkvLyAqKioqKioqKioqIGltcGxpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqIGltcGxpZWQgY2xhc3MgcmVmcy4KLQkgKi8KLQlTdHJpbmcgSU1QTElFRF9DTEFTU19SRUZTX0NPTExFQ1RJT04gPSAiaW1wbGllZENsYXNzUmVmcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgaW1wbGllZCBjbGFzcyByZWZzLgotCSAqLwotCUl0ZXJhYmxlPENsYXNzUmVmPiBnZXRJbXBsaWVkQ2xhc3NSZWZzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBsaXN0IG9mIGltcGxpZWQgY2xhc3MgcmVmcy4KLQkgKi8KLQlpbnQgZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHBlcnNpc3RlbmNlIHVuaXQgZXhjbHVkZXMgdW5saXN0ZWQgY2xhc3Nlcy4KLQkgKi8KLQlib29sZWFuIGV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqICJleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMiIGZsYWcuCi0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkgPSAic3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNwZWNpZmllZCAiZXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzIiBmbGFnLgotCSAqLwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCi0JLyoqCi0JICogU2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc3BlY2lmaWVkICJleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMiIGZsYWcuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4gZXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqIGRlZmF1bHQgImV4Y2x1ZGUgdW5saXN0ZWQgY2xhc3NlcyIgZmxhZyAobm90IHR5cGljYWxseSBjaGFuZ2VkKS4KLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkgPSAiZGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBleGNsdWRlcyB1bmxpc3RlZCBjbGFzc2VzIGJ5IGRlZmF1bHQuCi0JICovCi0JYm9vbGVhbiBnZXREZWZhdWx0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBwcm9wZXJ0aWVzLgotCSAqLwotCVN0cmluZyBQUk9QRVJUSUVTX0xJU1QgPSAicHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgcHJvcGVydGllcy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8UHJvcGVydHk+IGdldFByb3BlcnRpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgcHJvcGVydGllcy4KLQkgKi8KLQlpbnQgZ2V0UHJvcGVydGllc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgKmZpcnN0KiBwcm9wZXJ0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3BlcnR5IGxpc3Qgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgbmFtZS4gUmV0dXJuIG51bGwgaWYgdGhlIGxpc3QgZG9lcyBub3QgY29udGFpbiBhIHByb3BlcnR5Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0JUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHdpdGggdGhlIHNwZWNpZmllZAotCSAqIG5hbWUuIFJldHVybiBhbiBlbXB0eSBJdGVyYWJsZSBpZiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBkb2VzIG5vdCBjb250YWluCi0JICogYSBwcm9wZXJ0eSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxQcm9wZXJ0eT4gZ2V0UHJvcGVydGllc05hbWVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgcHJvcGVydGllcyB3aXRoIG5hbWVzIGJlZ2lubmluZyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBwcmVmaXguCi0JICovCi0JSXRlcmFibGU8UHJvcGVydHk+IGdldFByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChTdHJpbmcgcHJvcGVydHlOYW1lUHJlZml4KTsKLQotCS8qKgotCSAqIEFkZCBhIG5ldyBwcm9wZXJ0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdDsKLQkgKiByZXR1cm4gdGhlIG5ld2x5LWNyZWF0ZWQgcHJvcGVydHkuCi0JICovCi0JUHJvcGVydHkgYWRkUHJvcGVydHkoKTsKLQotCS8qKgotCSAqIEFkZCBhIG5ldyBwcm9wZXJ0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4OwotCSAqIHJldHVybiB0aGUgbmV3bHktY3JlYXRlZCBwcm9wZXJ0eS4KLQkgKi8KLQlQcm9wZXJ0eSBhZGRQcm9wZXJ0eShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB0aGUgKmZpcnN0KiBwcm9wZXJ0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3BlcnR5Ci0JICogbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLCBjcmVhdGluZyBhIG5ldwotCSAqIHByb3BlcnR5IGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBJZiBhIHByb3BlcnR5IGV4aXN0cyBhbmQgdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlIGlzIG51bGwsIHRoZSBleGlzdGluZyBwcm9wZXJ0eSBpcyByZW1vdmVkLgotCSAqLwotCXZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBjcmVhdGluZyBhIG5ldwotCSAqIHByb3BlcnR5IGlmIG9uZSBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgc3BlY2lmaWVkIGZsYWcgaW5kaWNhdGVzCi0JICogZHVwbGljYXRlIHByb3BlcnR5IG5hbWVzIGFyZSBhbGxvd2VkLiBJZiBhIHByb3BlcnR5IGV4aXN0cyBhbmQgZHVwbGljYXRlCi0JICogdmFsdWVzIGFyZSBub3QgYWxsb3dlZCBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLCB0aGUgZXhpc3RpbmcKLQkgKiBwcm9wZXJ0eSBpcyByZW1vdmVkLgotCSAqLwotCXZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGR1cGxpY2F0ZVByb3BlcnR5TmFtZXNBbGxvd2VkKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eShQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlICpmaXJzdCogcHJvcGVydHkgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBwcm9wZXJ0eSBsaXN0Ci0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICovCi0Jdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgKmZpcnN0KiBwcm9wZXJ0eSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHByb3BlcnR5IGxpc3QKLQkgKiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgdmFsdWUsIGFsbG93aW5nIHRoZSByZW1vdmFsIG9mIHByb3BlcnRpZXMKLQkgKiB3aXRoIGR1cGxpY2F0ZSBwcm9wZXJ0eSBuYW1lcy4KLQkgKi8KLQl2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBDYWxsIGJhY2sgbWV0aG9kIGZvciBQcm9wZXJ0eSBuYW1lIGNoYW5naW5nLgotCSAqLwotCXZvaWQgcHJvcGVydHlOYW1lQ2hhbmdlZChTdHJpbmcgb2xkUHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3UHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogQ2FsbCBiYWNrIG1ldGhvZCBmb3IgUHJvcGVydHkgdmFsdWUgY2hhbmdpbmcuCi0JICovCi0Jdm9pZCBwcm9wZXJ0eVZhbHVlQ2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgbmV3VmFsdWUpOwotCi0JLyoqCi0JICogU2ltcGxlIHByb3BlcnR5IGludGVyZmFjZS4KLQkgKi8KLQlpbnRlcmZhY2UgUHJvcGVydHkKLQkJZXh0ZW5kcyBYbWxDb250ZXh0Tm9kZQotCXsKLQkJUGVyc2lzdGVuY2VVbml0IGdldFBhcmVudCgpOwotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJoaWRpbmciKQotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZ2V0TmFtZSgpOwotCQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGdldFZhbHVlKCk7Ci0JCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCQlYbWxQcm9wZXJ0eSBnZXRYbWxQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciByZW5hbWluZyB0aGUgcHJvcGVydHkgdmFsdWUgdG8gdGhlIG5ld05hbWUuCi0JCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLCB0aGUgbmV3TmFtZSBpcyB0aGUgbmV3IHNob3J0IG5hbWUuCi0JCSAqIElmIHRoaXMgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIG9yaWdpbmFsIHR5cGUsIHRoZW4gcmV0dXJuIGFuIGVtcHR5IEl0ZXJhYmxlLgotCQkgKi8KLQkJSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKTsKLQotCQkvKioKLQkJICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZC4KLQkJICovCi0JCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCQkvKioKLQkJICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgcmVuYW1pbmcgdGhlIHByb3BlcnR5IHZhbHVlIHBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JCSAqIFRoZSBvcmlnaW5hbFBhY2thZ2UgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLgotCQkgKiBJZiB0aGlzIHZhbHVlIGlzIG5vdCBpbiB0aGUgb3JpZ2luYWxQYWNrYWdlLCB0aGVuIHJldHVybiBhbiBlbXB0eSBJdGVyYWJsZS4KLQkJICovCi0JCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyBmaWxlIChvcm0ueG1sKSBwZXJzaXN0ZW5jZSB1bml0IG1ldGFkYXRhICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCi0JICogIlhNTCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlIiBmbGFnLgotCSAqLwotCVN0cmluZyBYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSA9ICJ4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAiWE1MIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGUiIGZsYWcgZnJvbSB0aGUKLQkgKiBmaXJzdCBwZXJzaXN0ZW5jZSB1bml0IG1ldGFkYXRhCi0JICogZm91bmQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBsaXN0IG9mIG1hcHBpbmcgZmlsZXMuCi0JICovCi0JYm9vbGVhbiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqIGRlZmF1bHQgYWNjZXNzIHR5cGUuCi0JICovCi0JU3RyaW5nIERFRkFVTFRfQUNDRVNTX1BST1BFUlRZID0gImRlZmF1bHRBY2Nlc3MiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgYWNjZXNzIHR5cGUgZnJvbSB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgdW5pdCBtZXRhZGF0YQotCSAqIGZvdW5kIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGVzLgotCSAqLwotCUFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpOwotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBkZWZhdWx0IGRhdGFiYXNlIGNhdGFsb2cuCi0JICovCi0JU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSA9ICJkZWZhdWx0Q2F0YWxvZyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBkYXRhYmFzZSBjYXRhbG9nIGZyb20gdGhlIGZpcnN0IHBlcnNpc3RlbmNlIHVuaXQgbWV0YWRhdGEKLQkgKiBmb3VuZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgbWFwcGluZyBmaWxlcy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzCi0JICogZGVmYXVsdCBkYXRhYmFzZSBzY2hlbWEuCi0JICovCi0JU3RyaW5nIERFRkFVTFRfU0NIRU1BX1BST1BFUlRZID0gImRlZmF1bHRTY2hlbWEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgZGF0YWJhc2Ugc2NoZW1hIGZyb20gdGhlIGZpcnN0IHBlcnNpc3RlbmNlIHVuaXQgbWV0YWRhdGEKLQkgKiBmb3VuZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgbWFwcGluZyBmaWxlcy4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBkZWZhdWx0ICJjYXNjYWRlIHBlcnNpc3QiIGZsYWcuCi0JICovCi0JU3RyaW5nIERFRkFVTFRfQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZID0gImRlZmF1bHRDYXNjYWRlUGVyc2lzdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCAiY2FzY2FkZSBwZXJzaXN0IiBmbGFnIGZyb20gdGhlIGZpcnN0IHBlcnNpc3RlbmNlIHVuaXQgbWV0YWRhdGEKLQkgKiBmb3VuZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGxpc3Qgb2YgbWFwcGluZyBmaWxlcy4KLQkgKi8KLQlib29sZWFuIGdldERlZmF1bHRDYXNjYWRlUGVyc2lzdCgpOwotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRvcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBjb2xsZWN0aW9uIG9mICJnbG9iYWwiIGdlbmVyYXRvcnMuCi0JICovCi0JU3RyaW5nIEdFTkVSQVRPUlNfQ09MTEVDVElPTiA9ICJnZW5lcmF0b3JzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYWN0aXZlIiBnZW5lcmF0b3JzIGRlZmluZWQgd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc2NvcGUsCi0JICogaW5jbHVkaW5nIGdlbmVyYXRvcnMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuICJBY3RpdmUiIGdlbmVyYXRvcnMgYXJlOjx1bD4KLQkgKiA8bGk+YW55IGdlbmVyYXRvciBkZWZpbmVkIGluIG1hcHBpbmcgZmlsZXMKLQkgKiA8bGk+YW55IGdlbmVyYXRvciBkZWZpbmVkIHZpYSBKYXZhIGFubm90YXRpb25zIHRoYXQgaXMgbm90ICJvdmVycmlkZGVuIgotCSAqICAgICBieSBhIG1hcHBpbmcgZmlsZSBnZW5lcmF0b3Igd2l0aCB0aGUgc2FtZSBuYW1lCi0JICogPC91bD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBBIEphdmEgZ2VuZXJhdG9yIGRlZmluZWQgb24gYSBjbGFzcyBvciBhdHRyaWJ1dGUKLQkgKiB0aGF0IGlzIG92ZXJyaWRkZW4gaW4gYSBtYXBwaW5nIGZpbGUgaXMgPGVtPm5vdDwvZW0+LCBhcyBhIHJlc3VsdCwKLQkgKiBpdHNlbGYgb3ZlcnJpZGRlbi4gQSBKYXZhIGdlbmVyYXRvciBjYW4gb25seSBiZSBvdmVycmlkZGVuIGJ5IGEgbWFwcGluZwotCSAqIGZpbGUgZ2VuZXJhdG9yIHdpdGggdGhlIHNhbWUgbmFtZS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBBIEphdmEgZ2VuZXJhdG9yIGRlZmluZWQgb24gYSBjbGFzcyBvciBhdHRyaWJ1dGUKLQkgKiB3aG9zZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZmlsZSBtYXBwaW5nIChvciBtYXBwaW5nIGZpbGUpIGlzIG1hcmtlZAotCSAqICJtZXRhZGF0YSBjb21wbGV0ZSIgaXMgaWdub3JlZC4KLQkgKi8KLQlJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mICJhY3RpdmUiIGdlbmVyYXRvcnMgZGVmaW5lZCB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlCi0JICogdW5pdCdzIHNjb3BlLgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcnMoKQotCSAqLwotCWludCBnZXRHZW5lcmF0b3JzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgImFjdGl2ZSIgZ2VuZXJhdG9ycyBkZWZpbmVkIGluIHRoZSBwZXJzaXN0ZW5jZQotCSAqIHVuaXQncyBzY29wZSwgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRVbmlxdWVHZW5lcmF0b3JOYW1lcygpOwotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGNvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBjb2xsZWN0aW9uIG9mICJnbG9iYWwiIHF1ZXJpZXMuCi0JICovCi0JU3RyaW5nIFFVRVJJRVNfQ09MTEVDVElPTiA9ICJxdWVyaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSAiYWN0aXZlIiBxdWVyaWVzIGRlZmluZWQgd2l0aGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc2NvcGUsCi0JICogaW5jbHVkaW5nIHF1ZXJpZXMgd2l0aCBkdXBsaWNhdGUgbmFtZXMuIFRoZXNlIGFyZSB2ZXJ5IHNpbWlsYXIgdG8KLQkgKiBnZW5lcmF0b3JzLgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcnMoKQotCSAqLwotCUl0ZXJhYmxlPFF1ZXJ5PiBnZXRRdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiAiYWN0aXZlIiBxdWVyaWVzIGRlZmluZWQgd2l0aGluIHRoZSBwZXJzaXN0ZW5jZQotCSAqIHVuaXQncyBzY29wZS4KLQkgKiBAc2VlICNnZXRRdWVyaWVzKCkKLQkgKi8KLQlpbnQgZ2V0UXVlcmllc1NpemUoKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHF1ZXJ5ICh0aGF0IGlzIGRlZmluZWQgZWxzZXdoZXJlKSB0byB0aGUKLQkgKiBsaXN0IG9mIHF1ZXJpZXMgZGVmaW5lZCB3aXRoaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzY29wZS4KLQkgKi8KLQl2b2lkIGFkZFF1ZXJ5KFF1ZXJ5IHF1ZXJ5KTsKLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgWE1MIHJlc291cmNlIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0JICogcGVyc2lzdGVuY2UgdW5pdC4KLQkgKi8KLQlYbWxQZXJzaXN0ZW5jZVVuaXQgZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBzcGVjaWZpZXMgYSBwZXJzaXN0ZW50IHR5cGUgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZSAoaS5lLiB0aGUgdHlwZSBpcyBsaXN0ZWQgZWl0aGVyIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MKLQkgKiBsaXN0IG9mIHNwZWNpZmllZCBjbGFzc2VzIG9yIGluIG9uZSBvZiB0aGUgcGVyc2lzdGVudCB1bml0J3MgbWFwcGluZyBmaWxlcykuCi0JICovCi0JYm9vbGVhbiBzcGVjaWZpZXNQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgZW50aXRpZXMuCi0JICovCi0JSXRlcmFibGU8RW50aXR5PiBnZXRFbnRpdGllcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBlbnRpdHkgc3BlY2lmaWVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIHBlcnNpc3RlbnQgdHlwZQotCSAqIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIG9yIGlmIHRoZSBwZXJzaXN0ZW50IHR5cGUgaXMgbm90IG1hcHBlZCBhcyBhbgotCSAqIGVudGl0eS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5cyNFTlRJVFlfVFlQRV9NQVBQSU5HX0tFWQotCSAqLwotCUVudGl0eSBnZXRFbnRpdHkoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZW1iZWRkYWJsZSBzcGVjaWZpZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gUmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gcGVyc2lzdGVudCB0eXBlCi0JICogd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb3IgaWYgdGhlIHBlcnNpc3RlbnQgdHlwZSBpcyBub3QgbWFwcGVkIGFzIGFuCi0JICogZW1iZWRkYWJsZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5cyNFTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkKLQkgKi8KLQlFbWJlZGRhYmxlIGdldEVtYmVkZGFibGUoU3RyaW5nIHR5cGVOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcGVyc2lzdGVuY2UgdW5pdCBjb250YWlucwotCSAqIHRoZSBnaXZlbiB0ZXh0IG9mZnNldAotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpOwotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHZhbGlkYXRlcyBhZ2FpbnMgZGF0YWJhc2UgbWV0YWRhdGEuCi0JICogKEZvciBpbnN0YW5jZSwgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbm90IGFjdGl2ZSwgdGhlbiBpdCBzaG91bGQgbm90LikKLQkgKi8KLQlib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENyZWF0ZSBEZWxldGVFZGl0cyBmb3IgZGVsZXRpbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIGRlbGV0ZWQgdHlwZS4KLQkgKiBSZXR1cm4gYW4gRW1wdHlJdGVyYWJsZSBpZiB0aGVyZSBhcmUgbm90IGFueSByZWZlcmVuY2VzLgotCSAqLwotCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZURlbGV0ZVR5cGVFZGl0cyhJVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBEZWxldGVFZGl0cyBmb3IgZGVsZXRpbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIGRlbGV0ZWQgZmlsZQotCSAqIFJldHVybiBhbiBFbXB0eUl0ZXJhYmxlIGlmIHRoZXJlIGFyZSBub3QgYW55IHJlZmVyZW5jZXMuCi0JICovCi0JSXRlcmFibGU8RGVsZXRlRWRpdD4gY3JlYXRlRGVsZXRlTWFwcGluZ0ZpbGVFZGl0cyhJRmlsZSBmaWxlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQsIHRoZSBuZXdOYW1lIGlzIHRoZSBuZXcgc2hvcnQgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFR5cGUgdG8gdGhlIG5ld1BhY2thZ2UuCi0JICogVGhlIG9yaWdpbmFsVHlwZSBoYXMgbm90IHlldCBiZWVuIG1vdmVkLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgdG8gdGhlIG5ld05hbWUuCi0JICogVGhlIG9yaWdpbmFsUGFja2FnZSBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgcmVuYW1pbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9yaWdpbmFsRm9sZGVyIHRvIHRoZSBuZXdOYW1lLgotCSAqIFRoZSBvcmlnaW5hbEZvbGRlciBoYXMgbm90IHlldCBiZWVuIHJlbmFtZWQuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZUZvbGRlckVkaXRzKElGb2xkZXIgb3JpZ2luYWxGb2xkZXIsIFN0cmluZyBuZXdOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIHJlbmFtaW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbEZpbGUgdG8gdGhlIG5ld05hbWUuCi0JICogUmV0dXJuIGFuIEVtcHR5SXRlcmFibGUgaWYgdGhlcmUgYXJlIG5vdCBhbnkgcmVmZXJlbmNlcy4KLQkgKiBUaGUgb3JpZ2luYWxGaWxlIGhhcyBub3QgeWV0IGJlZW4gcmVuYW1lZCwgdGhlIG5ld05hbWUgaXMgdGhlIG5ldyBzaG9ydCBuYW1lLgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVNYXBwaW5nRmlsZUVkaXRzKElGaWxlIG9yaWdpbmFsRmlsZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JLyoqCi0JICogQ3JlYXRlIFJlcGxhY2VFZGl0cyBmb3IgbW92aW5nIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvcmlnaW5hbEZpbGUgdG8gdGhlIGRlc3RpbmF0aW9uLgotCSAqIFJldHVybiBhbiBFbXB0eUl0ZXJhYmxlIGlmIHRoZXJlIGFyZSBub3QgYW55IHJlZmVyZW5jZXMuCi0JICogVGhlIG9yaWdpbmFsRmlsZSBoYXMgbm90IGJlZW4gbW92ZWQgeWV0LgotCSAqLwotCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlTWFwcGluZ0ZpbGVFZGl0cyhJRmlsZSBvcmlnaW5hbEZpbGUsIElQYXRoIHJ1bnRpbmVEZXN0aW5hdGlvbik7Ci0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciBtb3ZpbmcgYW55IHJlZmVyZW5jZXMgdG8gdGhlIG9yaWdpbmFsRm9sZGVyIHRvIHRoZSBydW50aW1lRGVzdGluYXRpb24uCi0JICogVGhlIHJ1bnRpbWVEZXN0aW5hdGlvbiBhbHJlYWR5IGluY2x1ZGVzIHRoZSBvcmlnaW5hbCBmb2xkZXIgbmFtZS4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZUZvbGRlckVkaXRzKElGb2xkZXIgb3JpZ2luYWxGb2xkZXIsIElQYXRoIHJ1bnRpbWVEZXN0aW5hdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwZXJzaXN0ZW5jZS54bWwgZm9yCi0JICogaW5zZXJ0aW5nIGEgbmV3IG1hcHBpbmctZmlsZSBlbGVtZW50LiBJZiB0aGVyZSBhcmUgZXhpc3RpbmcgbWFwcGluZyBmaWxlcywKLQkgKiB0aGUgbG9jYXRpb24gc2hvdWxkIGJlIGFmdGVyIHRob3NlLiBJZiBubyBleGlzdGluZyBtYXBwaW5nIGZpbGVzIHRoZW4gbWFrZQotCSAqIHN1cmUgdGhlIGxvY2F0aW9uIGRvZXMgbm90IHZpb2xhdGUgdGhlIHBlcnNpc3RlbmNlLnhtbCBzY2hlbWEuCi0JICovCi0JaW50IGZpbmRJbnNlcnRMb2NhdGlvbkZvck1hcHBpbmdGaWxlUmVmKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTA3MjNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBleHRlbmRzIE1vZGVsCi17Ci0JLyoqCi0JICogTWV0aG9kIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHRoZSBnaXZlbiBwcm9wZXJ0eS4KLQkgKi8KLQlib29sZWFuIGl0ZW1Jc1Byb3BlcnR5KFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBpdGVtKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb3BlcnR5IG5hbWUgdXNlZCBmb3IgY2hhbmdlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JU3RyaW5nIHByb3BlcnR5SWRPZihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgUGVyc2lzdGVuY2VVbml0IG9mIHRoaXMgUHJvcGVydGllcy4KLQkgKi8KLQlQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCB0aGUgUGVyc2lzdGVuY2VVbml0IGJlbG9uZ3MgdG8uCi0JICovCi0JSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCk7Ci0JCi0JLyoqCi0JICogQSBQcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIGhhZCBpdHMgdmFsdWUgY2hhbmdlZAotCSAqLwotCXZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKTsKLQkKLQkvKioKLQkgKiBBIFByb3BlcnR5IHdpdGggdGhlIGdpdmVuIG5hbWUgd2FzIHJlbW92ZWQKLQkgKi8KLQl2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCi0JLy8gKioqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciByZW5hbWluZyBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb3JpZ2luYWxUeXBlIHRvIHRoZSBuZXdOYW1lLgotCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiByZW5hbWVkLCB0aGUgbmV3TmFtZSBpcyB0aGUgbmV3IHNob3J0IG5hbWUuCi0JICovCi0JSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKTsKLQotCS8qKgotCSAqIENyZWF0ZSBSZXBsYWNlRWRpdHMgZm9yIG1vdmluZyBhbnkgcmVmZXJlbmNlcyB0byB0aGUgb3JpZ2luYWxUeXBlIHRvIHRoZSBuZXdQYWNrYWdlLgotCSAqIFRoZSBvcmlnaW5hbFR5cGUgaGFzIG5vdCB5ZXQgYmVlbiBtb3ZlZC4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgUmVwbGFjZUVkaXRzIGZvciByZW5hbWluZyBhbnkgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbFBhY2thZ2UgbmV3TmFtZS4KLQkgKiBUaGUgb3JpZ2luYWxQYWNrYWdlIGhhcyBub3QgeWV0IGJlZW4gcmVuYW1lZC4KLQkgKi8KLQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk0NzhkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci0KLS8qKgotICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBYTUwgcmVzb3VyY2UgbW9kZWwKLSAqIHtAbGluayBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGV9LAotICogd2hpY2ggY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPnRyYW5zYWN0aW9uLXR5cGU8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCi0gKiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGVudW0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIAotewotCS8qKiBDb3JyZXNwb25kcyB0byBKVEEgdHJhbnNhY3Rpb24gdHlwZSAqLwotCUpUQSwKLQkKLQkvKiogQ29ycmVzcG9uZHMgdG8gUkVTT1VSQ0VfTE9DQUwgdHJhbnNhY3Rpb24gdHlwZSAqLwotCVJFU09VUkNFX0xPQ0FMOwotCQotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGZyb21YbWxSZXNvdXJjZU1vZGVsKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUpIHsKLQkJaWYgKHRyYW5zYWN0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKHRyYW5zYWN0aW9uVHlwZSkgewotCQkJY2FzZSBKVEE6Ci0JCQkJcmV0dXJuIEpUQTsKLQkJCWNhc2UgUkVTT1VSQ0VfTE9DQUw6Ci0JCQkJcmV0dXJuIFJFU09VUkNFX0xPQ0FMOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmtub3duIHRyYW5zYWN0aW9uIHR5cGU6ICIgKyB0cmFuc2FjdGlvblR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdG9YbWxSZXNvdXJjZU1vZGVsKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUpIHsKLQkJaWYgKHRyYW5zYWN0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKHRyYW5zYWN0aW9uVHlwZSkgewotCQkJY2FzZSBKVEE6Ci0JCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEE7Ci0JCQljYXNlIFJFU09VUkNFX0xPQ0FMOgotCQkJCXJldHVybiBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUw7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVua25vd24gdHJhbnNhY3Rpb24gdHlwZTogIiArIHRyYW5zYWN0aW9uVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYxYzAzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sRmlsZTsKLQotLyoqCi0gKiBKUEEgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWwKLQlleHRlbmRzIFhtbEZpbGUKLXsKLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlICoqKioqKioqKioKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9QUk9QRVJUWSA9ICJwZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGVudCByZXByZXNlbnRlZCBieSB0aGUgcm9vdCBvZiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgotCSAqIFRoaXMgbWF5IGJlIG51bGwuCi0JICovCi0JUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY3MGQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHk7Ci0KLS8qKgotICogSW50ZXJmYWNlIHVzZWQgYnkgcGVyc2lzdGVuY2UgdW5pdCB0byBnYXRoZXIgdXAgcGVyc2lzdGVudCB0eXBlcy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17CQotCVBlcnNpc3RlbmNlIGJ1aWxkUGVyc2lzdGVuY2UoUGVyc2lzdGVuY2VYbWwgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZSByZXNvdXJjZVBlcnNpc3RlbmNlKTsKLQkKLQlQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcmVzb3VyY2VQZXJzaXN0ZW5jZVVuaXQpOwotCQotCS8qKgotCSAqIEJ1aWxkIGEgInNwZWNpZmllZCIgbWFwcGluZyBmaWxlIHJlZi4KLQkgKi8KLQlNYXBwaW5nRmlsZVJlZiBidWlsZE1hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQotCS8qKgotCSAqIEJ1aWxkIGEgImltcGxpZWQiIG1hcHBpbmcgZmlsZSByZWYuCi0JICovCi0JTWFwcGluZ0ZpbGVSZWYgYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhICJzcGVjaWZpZWQiIGNsYXNzIHJlZi4KLQkgKi8KLQlDbGFzc1JlZiBidWlsZENsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZik7Ci0JCi0JLyoqCi0JICogQnVpbGQgYW4gImltcGxpZWQiIGNsYXNzIHJlZi4KLQkgKi8KLQlDbGFzc1JlZiBidWlsZENsYXNzUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBjbGFzc05hbWUpOwotCQotCUphckZpbGVSZWYgYnVpbGRKYXJGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphckZpbGVSZWYgeG1sSmFyRmlsZVJlZik7Ci0KLQlKYXJGaWxlIGJ1aWxkSmFyRmlsZShKYXJGaWxlUmVmIHBhcmVudCwgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBqYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QpOwotCi0JUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGJ1aWxkUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sUHJvcGVydHkgcHJvcGVydHkpOwotCQotCVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpOwotCQotCVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRPcHRpb25zKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4Yjg4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOwotCi0vKioKLSAqIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZGVmaW5pdGlvbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIAotCWV4dGVuZHMgUmVzb3VyY2VEZWZpbml0aW9uCi17Ci0JRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpOwotCi0JUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sRW51bVZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sRW51bVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNTllNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi0vKioKLSAqIEFuIGVudW0gdGhhdCBpcyB1c2VkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwgcHJvcGVydGllcyBjYW4gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlCi0gKiBhbmQgdGFrZSBhZHZhbnRhZ2Ugb2YgaGVscGVyIG1ldGhvZHMgaW4gQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGZvcgotICogZ2V0dGluZyBhbmQgc2V0dGluZyBwcm9wZXJ0aWVzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIHRvIGJlIHVzZWQgaW4gdGhlIHByb3BlcnR5IGtleS92YWx1ZSBwYWlyCi0JICovCi0JU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoKTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVudFR5cGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVudFR5cGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjOWQ5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbnRUeXBlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotCi0vKioKLSAqIEludGVyZmFjZSB1c2VkIGJ5IHBlcnNpc3RlbmNlIHVuaXQgdG8gZ2F0aGVyIHVwIHBlcnNpc3RlbnQgdHlwZXMuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIHBlcnNpc3RlbnQgdHlwZXMuIFRoZSByZXR1cm5lZCBsaXN0IG1heSBjb250YWluCi0JICogbXVsdGlwbGUgcGVyc2lzdGVudCB0eXBlcyBmb3IgdGhlIHNhbWUgSmF2YSBjbGFzczsgZS5nLjx1bD4KLQkgKiA8bGk+dGhlIHNhbWUgdHlwZSBpcyBzcGVjaWZpZWQgaW4gYm90aCB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBhbmQKLQkgKiAgICAgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZXMKLQkgKiA8TGk+dGhlIHNhbWUgdHlwZSBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMgaW4gdGhlIHNhbWUKLQkgKiAgICAgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBvciA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlCi0JICogPGxpPnRoZSBzYW1lIHR5cGUgaXMgaW4gYSBqYXIgZmlsZSBzcGVjaWZpZWQgaW4gdGhlCi0JICogICAgIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZSBhbmQgaXMgc3BlY2lmaWVkIGluIHRoZQotCSAqICAgICA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUgYW5kL29yIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUKLQkgKiA8L3VsPgotCSAqLwotCUl0ZXJhYmxlPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4gZ2V0UGVyc2lzdGVudFR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbnQgdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBlcnNpc3RlbnQgdHlwZSBpcyBub3QgZm91bmQuCi0JICogSWYgdGhlIHBlcnNpc3RlbnQgdW5pdCBoYXMgbW9yZSB0aGFuIG9uZSBwZXJzaXN0ZW50IHR5cGUgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZSwgcmV0dXJuIHRoZSBmaXJzdCBvbmUgZm91bmQsIHVzaW5nIHRoZSBmb2xsb3dpbmcKLQkgKiBzZWFyY2ggb3JkZXI6PHVsPgotCSAqIDxsaT5tYXBwaW5nIGZpbGVzCi0JICogPGxpPmNsYXNzZXMKLQkgKiA8bGk+amFyIGZpbGVzCi0JICogPC91bD4KLQkgKi8KLQlQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpOwotCi0KLQlUcmFuc2Zvcm1lcjxQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciwgSXRlcmFibGU8PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlPj4gVFJBTlNGT1JNRVIgPQotCQluZXcgVHJhbnNmb3JtZXI8UGVyc2lzdGVudFR5cGVDb250YWluZXIsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4+KCkgewotCQkJcHVibGljIEl0ZXJhYmxlPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4gdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyIGNvbnRhaW5lcikgewotCQkJCXJldHVybiBjb250YWluZXIuZ2V0UGVyc2lzdGVudFR5cGVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJQZXJzaXN0ZW50VHlwZUNvbnRhaW5lci5UUkFOU0ZPUk1FUiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZWZlNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotCWltcGxlbWVudHMgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotewotCXByb3RlY3RlZCBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9uczsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnM7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFubm90YXRpb24gZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBJdGVyYWJsZTxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGJ1aWxkQW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQkJdGhpcy5hZGRBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCXJldHVybiBkZWZpbml0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKTsKLQotCi0JLy8gKioqKioqKioqKiBuZXN0YWJsZSBhbm5vdGF0aW9uIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLm5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMubmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMgPSB0aGlzLmJ1aWxkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5uZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24+IGJ1aWxkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSB7Ci0JCUFycmF5TGlzdDxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4oKTsKLQkJdGhpcy5hZGROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJcmV0dXJuIGRlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zVG8oQXJyYXlMaXN0PE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKTsKLQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpwYUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTMyYzc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFMb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFWaXJ0dWFsSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5HZW5lcmljSnBhRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5HZW5lcmljSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5HZW5lcmljSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFHZW5lcmF0b3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUxvYkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVZpcnR1YWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVmlydHVhbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbXBsZXRlSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLQotLyoqCi0gKiBDZW50cmFsIGNsYXNzIHRoYXQgYWxsb3dzIGV4dGVuZGVycyB0byBlYXNpbHkgcmVwbGFjZSBpbXBsZW1lbnRhdGlvbnMgb2YKLSAqIHZhcmlvdXMgRGFsaSBpbnRlcmZhY2VzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFGYWN0b3J5Ci0JaW1wbGVtZW50cyBKcGFGYWN0b3J5Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0SnBhRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBDb3JlIE1vZGVsICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoSnBhUHJvamVjdC5Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVByb2plY3QoY29uZmlnKTsKLQl9Ci0JCi0JcHVibGljIEpwYURhdGFTb3VyY2UgYnVpbGRKcGFEYXRhU291cmNlKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFEYXRhU291cmNlKGpwYVByb2plY3QsIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBKcGFGaWxlIGJ1aWxkSnBhRmlsZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSwgSnB0UmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYUZpbGUoanBhUHJvamVjdCwgZmlsZSwgY29udGVudFR5cGUsIHJlc291cmNlTW9kZWwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb250ZXh0IE5vZGVzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhUm9vdENvbnRleHROb2RlIGJ1aWxkUm9vdENvbnRleHROb2RlKEpwYVByb2plY3QgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZShwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYTUwgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCi0KLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgYnVpbGRQZXJzaXN0ZW5jZVhtbChKcGFSb290Q29udGV4dE5vZGUgcGFyZW50LCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVhtbChwYXJlbnQsIHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIE9ybVhtbCBidWlsZE1hcHBpbmdGaWxlKE1hcHBpbmdGaWxlUmVmIHBhcmVudCwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtWG1sKHBhcmVudCwgcmVzb3VyY2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIENvbnRleHQgTW9kZWwgKioqKioqKioqKgotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUuT3duZXIgb3duZXIsIEphdmFSZXNvdXJjZVR5cGUganJ0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZShvd25lciwganJ0KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEFjY2Vzc29yIGFjY2Vzc29yKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCwgYWNjZXNzb3IpOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50RmllbGQoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCwgcmVzb3VyY2VGaWVsZCk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRQcm9wZXJ0eShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKHBhcmVudCwgcmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGJ1aWxkSmF2YU51bGxUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YU51bGxUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW50aXR5QW5ub3RhdGlvbiBlbnRpdHlBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFFbnRpdHkocGFyZW50LCBlbnRpdHlBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YU1hcHBlZFN1cGVyY2xhc3MgYnVpbGRKYXZhTWFwcGVkU3VwZXJjbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbiBtYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQsIG1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVtYmVkZGFibGUgYnVpbGRKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbWJlZGRhYmxlQW5ub3RhdGlvbiBlbWJlZGRhYmxlQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkYWJsZShwYXJlbnQsIGVtYmVkZGFibGVBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIEphdmFUYWJsZSBidWlsZEphdmFUYWJsZShKYXZhRW50aXR5IHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVRhYmxlKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUNvbHVtbiBidWlsZEphdmFDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVZpcnR1YWxDb2x1bW4gYnVpbGRKYXZhVmlydHVhbENvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhVmlydHVhbENvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVmlydHVhbENvbHVtbihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4oSmF2YUVudGl0eSBwYXJlbnQsIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYnVpbGRKYXZhSm9pbkNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBDb21wbGV0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFKb2luQ29sdW1uKHBhcmVudCwgb3duZXIsIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpcnR1YWxKb2luQ29sdW1uIGJ1aWxkSmF2YVZpcnR1YWxKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFJlYWRPbmx5Sm9pbkNvbHVtbiBvdmVycmlkZGVuQ29sdW1uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFWaXJ0dWFsSm9pbkNvbHVtbihwYXJlbnQsIG93bmVyLCBvdmVycmlkZGVuQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIEphdmFKb2luVGFibGUgYnVpbGRKYXZhSm9pblRhYmxlKEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFKb2luVGFibGUocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhVmlydHVhbEpvaW5UYWJsZSBidWlsZEphdmFWaXJ0dWFsSm9pblRhYmxlKEphdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgcGFyZW50LCBSZWFkT25seVRhYmxlLk93bmVyIG93bmVyLCBSZWFkT25seUpvaW5UYWJsZSBvdmVycmlkZGVuVGFibGUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVZpcnR1YWxKb2luVGFibGUocGFyZW50LCBvd25lciwgb3ZlcnJpZGRlblRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIEphdmFTZWNvbmRhcnlUYWJsZSBidWlsZEphdmFTZWNvbmRhcnlUYWJsZShKYXZhRW50aXR5IHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlKHBhcmVudCwgb3duZXIsIHRhYmxlQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBKYXZhQmFzaWNNYXBwaW5nIGJ1aWxkSmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUJhc2ljTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGJ1aWxkSmF2YUVtYmVkZGVkSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFFbWJlZGRlZE1hcHBpbmcgYnVpbGRKYXZhRW1iZWRkZWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhSWRNYXBwaW5nIGJ1aWxkSmF2YUlkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUlkTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFNYW55VG9PbmVNYXBwaW5nIGJ1aWxkSmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZyBidWlsZEphdmFPbmVUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU9uZVRvT25lTWFwcGluZyBidWlsZEphdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFUcmFuc2llbnRNYXBwaW5nIGJ1aWxkSmF2YVRyYW5zaWVudE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVmVyc2lvbk1hcHBpbmcgYnVpbGRKYXZhVmVyc2lvbk1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUdlbmVyYXRvckNvbnRhaW5lciBidWlsZEphdmFHZW5lcmF0b3JDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUdlbmVyYXRvckNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhR2VuZXJhdG9yQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yKHBhcmVudCwgc2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIEphdmFUYWJsZUdlbmVyYXRvciBidWlsZEphdmFUYWJsZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcihwYXJlbnQsIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWUgYnVpbGRKYXZhR2VuZXJhdGVkVmFsdWUoSmF2YUlkTWFwcGluZyBwYXJlbnQsIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlKHBhcmVudCwgZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lciwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbkFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHBhcmVudCwgb3duZXIsIHBrSm9pbkNvbHVtbkFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZShwYXJlbnQsIGFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBidWlsZEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShwYXJlbnQsIG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUocGFyZW50LCBhbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBidWlsZEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShwYXJlbnQsIG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwIGJ1aWxkSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAgYnVpbGRKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwKEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVF1ZXJ5Q29udGFpbmVyIGJ1aWxkSmF2YVF1ZXJ5Q29udGFpbmVyKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFRdWVyeUNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUXVlcnlDb250YWluZXIocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhTmFtZWRRdWVyeSBidWlsZEphdmFOYW1lZFF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnlBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFOYW1lZFF1ZXJ5KHBhcmVudCwgbmFtZWRRdWVyeUFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgSmF2YU5hbWVkTmF0aXZlUXVlcnkgYnVpbGRKYXZhTmFtZWROYXRpdmVRdWVyeShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeShwYXJlbnQsIG5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIEphdmFRdWVyeUhpbnQgYnVpbGRKYXZhUXVlcnlIaW50KEphdmFRdWVyeSBwYXJlbnQsIFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhUXVlcnlIaW50KHBhcmVudCwgcXVlcnlIaW50QW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBKYXZhVW5pcXVlQ29uc3RyYWludCBidWlsZEphdmFVbmlxdWVDb25zdHJhaW50KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgb3duZXIsIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50KHBhcmVudCwgb3duZXIsIGNvbnN0cmFpbnRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludCBidWlsZEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgb3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50KHBhcmVudCwgb3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIgYnVpbGRKYXZhRW51bWVyYXRlZENvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGFubm90YXRpb24sIEphdmFDb252ZXJ0ZXIuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIocGFyZW50LCBhbm5vdGF0aW9uLCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVtcG9yYWxDb252ZXJ0ZXIgYnVpbGRKYXZhVGVtcG9yYWxDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBUZW1wb3JhbEFubm90YXRpb24gYW5ub3RhdGlvbiwgSmF2YUNvbnZlcnRlci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIocGFyZW50LCBhbm5vdGF0aW9uLCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhTG9iQ29udmVydGVyIGJ1aWxkSmF2YUxvYkNvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIExvYkFubm90YXRpb24gYW5ub3RhdGlvbiwgSmF2YUNvbnZlcnRlci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTG9iQ29udmVydGVyKHBhcmVudCwgYW5ub3RhdGlvbiwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgSmF2YU9yZGVyYWJsZSBidWlsZEphdmFPcmRlcmFibGUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlcmFibGUocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpwYU5vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI2NDIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5KRFRNb2RpZmllZERlY2xhcmF0aW9uLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFzcGVjdENoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkNoYW5nZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi0vKioKLSAqIFNvbWUgY29tbW9uIERhbGkgYmVoYXZpb3I6PHVsPgotICogPGxpPmNvbnRhaW5tZW50IGhpZXJhcmNoeQotICogPGxpPkVjbGlwc2UgYWRhcHRhYmxlCi0gKiA8bGk+dXBkYXRlIHRyaWdnZXJzCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFOb2RlCi0JZXh0ZW5kcyBBYnN0cmFjdE1vZGVsCi0JaW1wbGVtZW50cyBKcGFOb2RlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEpwYU5vZGUgcGFyZW50OwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdEpwYU5vZGUoSnBhTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jaGVja1BhcmVudChwYXJlbnQpOwotCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChKcGFOb2RlIHApIHsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMucmVxdWlyZXNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIGNhbm5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmZvcmJpZHNQYXJlbnQoKSkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIidwYXJlbnQnIG11c3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc1BhcmVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gZm9yYmlkc1BhcmVudCgpIHsKLQkJcmV0dXJuICEgdGhpcy5yZXF1aXJlc1BhcmVudCgpOyAgLy8gYXNzdW1lICdwYXJlbnQnIGlzIG5vdCBvcHRpb25hbAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDaGFuZ2VTdXBwb3J0IGJ1aWxkQ2hhbmdlU3VwcG9ydCgpIHsKLQkJcmV0dXJuIG5ldyBBc3BlY3RDaGFuZ2VTdXBwb3J0KHRoaXMsIHRoaXMuYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzcGVjdENoYW5nZVN1cHBvcnQuTGlzdGVuZXIgYnVpbGRDaGFuZ2VTdXBwb3J0TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgQXNwZWN0Q2hhbmdlU3VwcG9ydC5MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFzcGVjdENoYW5nZWQoU3RyaW5nIGFzcGVjdE5hbWUpIHsKLQkJCQlBYnN0cmFjdEpwYU5vZGUudGhpcy5hc3BlY3RDaGFuZ2VkKGFzcGVjdE5hbWUpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJQWRhcHRhYmxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UmVzb3VyY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybS5WZXJzaW9uIGdldEpwYVBsYXRmb3JtVmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKcGFWZXJzaW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKcGEyXzBDb21wYXRpYmxlKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5ub2RlSXNKcGEyXzBDb21wYXRpYmxlKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENhbGwge0BsaW5rICNpc0pwYTJfMENvbXBhdGlibGUoKX0gYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIEpwYUZhY3RvcnkyXzAgZ2V0SnBhRmFjdG9yeTJfMCgpIHsKLQkJcmV0dXJuIChKcGFGYWN0b3J5Ml8wKSB0aGlzLmdldEpwYUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhRmFjdG9yeSBnZXRKcGFGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldEpwYUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gZ2V0SnBhUGxhdGZvcm1WYXJpYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVBsYXRmb3JtKCkuZ2V0SnBhVmFyaWF0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlKGZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBKcGFEYXRhU291cmNlIGdldERhdGFTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREYXRhU291cmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhU291cmNlKCkuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhU291cmNlKCkuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCX0KLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IHNwZWNpZmllZCBjYXRhbG9nIDxlbT5pZGVudGlmaWVyPC9lbT4gaXMgbm90Ci0JICogPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gRG8gbm90IHVzZSB0aGUgY2F0YWxvZyA8ZW0+bmFtZTwvZW0+LgotCSAqLwotCXByb3RlY3RlZCBDYXRhbG9nIHJlc29sdmVEYkNhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGF0YWJhc2UgPT0gbnVsbCkgPyBudWxsIDogZGF0YWJhc2UuZ2V0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoY2F0YWxvZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzcGVjdENoYW5nZVN1cHBvcnQuTGlzdGVuZXIgc3VwcG9ydCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBhc3BlY3RDaGFuZ2VkKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCWlmICh0aGlzLmFzcGVjdFRyaWdnZXJzVXBkYXRlKGFzcGVjdE5hbWUpKSB7Ci0vLwkJCVN0cmluZyBtc2cgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiBhc3BlY3QgY2hhbmdlOiAiICsgdGhpcyArICI6ICIgKyBhc3BlY3ROYW1lOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLS8vCQkJbmV3IEV4Y2VwdGlvbihtc2cpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJCXRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhc3BlY3RUcmlnZ2Vyc1VwZGF0ZShTdHJpbmcgYXNwZWN0TmFtZSkgewotCQlyZXR1cm4gISB0aGlzLmFzcGVjdERvZXNOb3RUcmlnZ2VyVXBkYXRlKGFzcGVjdE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGFzcGVjdERvZXNOb3RUcmlnZ2VyVXBkYXRlKFN0cmluZyBhc3BlY3ROYW1lKSB7Ci0JCS8vIGlnbm9yZSBzdGF0ZSBjaGFuZ2VzIHNvIHdlIGRvbid0IGdldCBhIHN0YWNrIG92ZXJmbG93IDotKQotCQkvLyAoYW5kIHdlIGRvbid0IHVzZSBzdGF0ZSBjaGFuZ2VzIGV4Y2VwdCBoZXJlKQotCQlyZXR1cm4gKGFzcGVjdE5hbWUgPT0gbnVsbCkgfHwKLQkJCQl0aGlzLm5vblVwZGF0ZUFzcGVjdE5hbWVzKCkuY29udGFpbnMoYXNwZWN0TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKE5PTl9VUERBVEVfQVNQRUNUX05BTUVfU0VUUykgewotCQkJSGFzaFNldDxTdHJpbmc+IG5vblVwZGF0ZUFzcGVjdE5hbWVzID0gTk9OX1VQREFURV9BU1BFQ1RfTkFNRV9TRVRTLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKG5vblVwZGF0ZUFzcGVjdE5hbWVzID09IG51bGwpIHsKLQkJCQlub25VcGRhdGVBc3BlY3ROYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCQl0aGlzLmFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8obm9uVXBkYXRlQXNwZWN0TmFtZXMpOwotCQkJCU5PTl9VUERBVEVfQVNQRUNUX05BTUVfU0VUUy5wdXQodGhpcy5nZXRDbGFzcygpLCBub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9uVXBkYXRlQXNwZWN0TmFtZXM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGU+LCBIYXNoU2V0PFN0cmluZz4+IE5PTl9VUERBVEVfQVNQRUNUX05BTUVfU0VUUyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGU+LCBIYXNoU2V0PFN0cmluZz4+KCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgewotCS8vIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBkb24ndCBmb3JnZXQgdG8gaW5jbHVkZToKLQkvLwlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCXRoaXMuZmlyZVN0YXRlQ2hhbmdlZCgpOwotCQlpZiAodGhpcy5wYXJlbnQgIT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnQuc3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2Ugc3R1ZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogVXNlZnVsIGZvciBidWlsZGluZyB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZOwotCi0KLQkvKioKLQkgKiBBZGFwdGVyIHVzZWQgdG8gc3luY2hyb25pemUgYSBjb250ZXh0IGNvbGxlY3Rpb24gY29udGFpbmVyIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiByZXNvdXJjZSBjb250YWluZXIuCi0JICogQHBhcmFtIDxDPiB0aGUgdHlwZSBvZiBjb250ZXh0IGVsZW1lbnRzCi0JICogQHBhcmFtIDxSPiB0aGUgdHlwZSBvZiByZXNvdXJjZSBlbGVtZW50cwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uQ29udGFpbmVyPEMsIFI+IHsKLQotCQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEM+IGNvbnRleHRFbGVtZW50cyA9IG5ldyBWZWN0b3I8Qz4oKTsKLQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkNvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb250YWluZXIncyBjdXJyZW50IHNldCBvZiByZXNvdXJjZSBlbGVtZW50cy4KLQkJICogVGhlc2UgYXJlIHdoYXQgdGhlIGNvbnRleHQgZWxlbWVudHMgd2lsbCBiZSBzeW5jaHJvbml6ZWQgdG8uCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8Uj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNvbnRleHQKLQkJICogZWxlbWVudC4KLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBSIGdldFJlc291cmNlRWxlbWVudChDIGNvbnRleHRFbGVtZW50KTsKLQotCQkvKioKLQkJICogQnVpbGQgYW5kIHJldHVybiBhIGNvbnRleHQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIHJlc291cmNlIGVsZW1lbnQKLQkJICovCi0JCXByb3RlY3RlZCBhYnN0cmFjdCBDIGJ1aWxkQ29udGV4dEVsZW1lbnQoUiByZXNvdXJjZUVsZW1lbnQpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHByb3BlcnR5IG5hbWUgZm9yIGV2ZW50IG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBjb2xsZWN0aW9uIGlzIGNoYW5nZWQuCi0JCSAqLwotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpOwotCi0JCS8qKgotCQkgKiBjbGllbnRzIG5lZWRzIHRvIGNhbGwgaW5pdGlhbGl6ZSBpZiBuZWNlc3NhcnkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCQlmb3IgKFIgcmVzb3VyY2VFbGVtZW50IDogdGhpcy5nZXRSZXNvdXJjZUVsZW1lbnRzKCkpIHsKLQkJCQl0aGlzLmNvbnRleHRFbGVtZW50cy5hZGQodGhpcy5idWlsZENvbnRleHRFbGVtZW50KHJlc291cmNlRWxlbWVudCkpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiBhbiBJdGVyYWJsZSBvZiB0aGUgY29udGV4dCBlbGVtZW50cwotCQkgKi8KLQkJcHVibGljIEl0ZXJhYmxlPEM+IGdldENvbnRleHRFbGVtZW50cygpIHsKLQkJCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8Qz4odGhpcy5jb250ZXh0RWxlbWVudHMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29udGV4dCBlbGVtZW50cyBjb2xsZWN0aW9uCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldENvbnRleHRFbGVtZW50c1NpemUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb250ZXh0RWxlbWVudHMuc2l6ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEFkZCBhIGNvbnRleHQgZWxlbWVudCBmb3IgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBlbGVtZW50IGF0IHRoZQotCQkgKiBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQlwdWJsaWMgQyBhZGRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIFIgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gdGhpcy5hZGRDb250ZXh0RWxlbWVudF8oaW5kZXgsIHRoaXMuYnVpbGRDb250ZXh0RWxlbWVudChyZXNvdXJjZUVsZW1lbnQpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGQgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gaWdub3JpbmcKLQkJICogdGhlIHNwZWNpZmllZCBpbmRleCBhcyB3ZSBvbmx5IGhhdmUgYSBjb2xsZWN0aW9uCi0JCSAqLwotCQlwcm90ZWN0ZWQgQyBhZGRDb250ZXh0RWxlbWVudF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGludCBpbmRleCwgQyBjb250ZXh0RWxlbWVudCkgewotCQkJQWJzdHJhY3RKcGFOb2RlLnRoaXMuYWRkSXRlbVRvQ29sbGVjdGlvbihjb250ZXh0RWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudCBmcm9tIHRoZSBjb250YWluZXIuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChDIGVsZW1lbnQpIHsKLQkJCUFic3RyYWN0SnBhTm9kZS50aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihlbGVtZW50LCB0aGlzLmNvbnRleHRFbGVtZW50cywgdGhpcy5nZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgCi0JCXByb3RlY3RlZCB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIEMgZWxlbWVudCkgewotCQkJLy9uby1vcCwgbm90IGEgbGlzdAotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIHRvIHN5bmNocm9uaXplIGEgY29udGV4dCBjb2xsZWN0aW9uIGNvbnRhaW5lciB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCi0JICogcmVzb3VyY2UgY29udGFpbmVyLgotCSAqIEBwYXJhbSA8Qz4gdGhlIHR5cGUgb2YgY29udGV4dCBlbGVtZW50cwotCSAqIEBwYXJhbSA8Uj4gdGhlIHR5cGUgb2YgcmVzb3VyY2UgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQ29udGV4dENvbGxlY3Rpb25Db250YWluZXI8QyBleHRlbmRzIEpwYUNvbnRleHROb2RlLCBSPiBleHRlbmRzIENvbGxlY3Rpb25Db250YWluZXI8QywgUj4gewotCi0JCXByb3RlY3RlZCBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVXNpbmcgdGhlIHNwZWNpZmllZCBhZGFwdGVyLCBzeW5jaHJvbml6ZSBhIGNvbnRleHQgY29udGFpbmVyIHdpdGggaXRzCi0JCSAqIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgY29udGFpbmVyOiBtb3ZpbmcsIHJlbW92aW5nLCBhbmQgYWRkaW5nIGVsZW1lbnRzCi0JCSAqIGFzIG5lY2Vzc2FyeS4KLQkJICogPHA+Ci0JCSAqIFdlIGNhbiBkbyB0aGlzIGJlY2F1c2U6PHVsPgotCQkgKiA8bGk+dGhlIFhNTCB0cmFuc2xhdG9ycyB3aWxsIDxlbT5tb3ZlPC9lbT4gdGhlIEVNRiBlbGVtZW50cyB3aGVuCi0JCSAqIGFwcHJvcHJpYXRlIChhcyBvcHBvc2VkIHRvIHNpbXBseSByZWJ1aWxkaW5nIHRoZW0gaW4gcGxhY2UpLgotCQkgKiA8bGk+dGhlIEphdmEgcmVzb3VyY2UgbW9kZWwgd2lsbCByZS11c2UgZXhpc3RpbmcgYW5ub3RhdGlvbnMgd2hlbgotCQkgKiBhcHByb3ByaWF0ZSAoYXMgb3Bwb3NlZCB0byBzaW1wbHkgcmVidWlsZGluZyB0aGVtIGluIHBsYWNlKS4KLQkJICogPC91bD4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCQlzeW5jKHRydWUpOyAgLy8gdHJ1ZSA9IHN5bmMKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlICNzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKEFkYXB0ZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlzeW5jKGZhbHNlKTsgIC8vIGZhbHNlID0gdXBkYXRlCi0JCX0KLQotCQkvKioKLQkJICogVGhlIHNwZWNpZmllZCA8Y29kZT5zeW5jPC9jb2RlPiBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgYW55IHN1cnZpdmluZwotCQkgKiBjb250ZXh0IG5vZGVzIGFyZSBlaXRoZXIgPGVtPnN5bmNocm9uaXplZDwvZW0+ICg8Y29kZT50cnVlPC9jb2RlPikgb3IKLQkJICogPGVtPnVwZGF0ZWQ8L2VtPiAoPGNvZGU+ZmFsc2U8L2NvZGU+KS4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIHN5bmMoYm9vbGVhbiBzeW5jKSB7Ci0JCQlIYXNoU2V0PEM+IGNvbnRleHRFbGVtZW50cyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5nZXRDb250ZXh0RWxlbWVudHMoKSk7Ci0JCQlBcnJheUxpc3Q8Qz4gY29udGV4dEVsZW1lbnRzVG9TeW5jID0gbmV3IEFycmF5TGlzdDxDPihjb250ZXh0RWxlbWVudHMuc2l6ZSgpKTsKLQkJCWludCByZXNvdXJjZUluZGV4ID0gMDsKLQotCQkJZm9yIChSIHJlc291cmNlRWxlbWVudCA6IHRoaXMuZ2V0UmVzb3VyY2VFbGVtZW50cygpKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3I8Qz4gc3RyZWFtID0gY29udGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCQlDIGNvbnRleHRFbGVtZW50ID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0UmVzb3VyY2VFbGVtZW50KGNvbnRleHRFbGVtZW50KSwgcmVzb3VyY2VFbGVtZW50KSkgewotCQkJCQkJLy8gd2UgZG9uJ3Qga25vdyB0aGUgc291cmNlIGluZGV4IGJlY2F1c2UgdGhlIGVsZW1lbnQgaGFzIGJlZW4gbW92ZWQgYnkgcHJldmlvdXNseSBtb3ZlZCBlbGVtZW50cwotCQkJCQkJdGhpcy5tb3ZlQ29udGV4dEVsZW1lbnQocmVzb3VyY2VJbmRleCwgY29udGV4dEVsZW1lbnQpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJLy8gVE9ETyBwZXJmb3JtIHVwZGF0ZSBoZXJlIHNvbWVkYXkuLi4KLQkJCQkJCWNvbnRleHRFbGVtZW50c1RvU3luYy5hZGQoY29udGV4dEVsZW1lbnQpOwotCQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCAhIG1hdGNoKSB7Ci0JCQkJCS8vIGFkZGVkIGVsZW1lbnRzIGFyZSBzeW5jJ2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb3Igd2lsbCBiZQotCQkJCQkvLyB1cGRhdGVkIGR1cmluZyB0aGUgbmV4dCAidXBkYXRlIiAod2hpY2ggaXMgdHJpZ2dlcmVkIGJ5Ci0JCQkJCS8vIHRoZWlyIGFkZGl0aW9uIHRvIHRoZSBtb2RlbCkKLQkJCQkJdGhpcy5hZGRDb250ZXh0RWxlbWVudChyZXNvdXJjZUluZGV4LCByZXNvdXJjZUVsZW1lbnQpOwotCQkJCX0KLQkJCQlyZXNvdXJjZUluZGV4Kys7Ci0JCQl9Ci0JCQkvLyByZW1vdmUgYW55IGxlZnRvdmVyIGNvbnRleHQgZWxlbWVudHMKLQkJCWZvciAoQyBjb250ZXh0RWxlbWVudCA6IGNvbnRleHRFbGVtZW50cykgewotCQkJCXJlbW92ZUNvbnRleHRFbGVtZW50KGNvbnRleHRFbGVtZW50KTsKLQkJCX0KLQkJCS8vIFRPRE8gYmp2Ci0JCQkvLyB0YWtlIGNhcmUgb2YgdGhlIHN0cnVjdHVyYWwgY2hhbmdlcyBiZWZvcmUgc3luYydpbmcgdGhlIHJlbWFpbmluZyBlbGVtZW50czsKLQkJCS8vIHdlIG1pZ2h0IGJlIGFibGUgdG8gZG8gdGhpcyBpbmxpbmUgb25jZSB3ZSBnZXQgcmlkIG9mIHRoZSAibGlzdCBjaGFuZ2UiIGV2ZW50cwotCQkJLy8gYW5kIGdvIHdpdGggb25seSBhZGQsIHJlbW92ZSwgZXRjLiBsaXN0IGV2ZW50cwotCQkJLy8gKHRoZXNlIHN5bmNzIHdpbGwgdHJpZ2dlciAibGlzdCBjaGFuZ2UiIGV2ZW50cyB3aXRoIGxpc3QgYXNwZWN0IGFkYXB0ZXJzLCB3aGljaAotCQkJLy8gdHJpZ2dlciByZWZyZXNoZXMgb2YgVUkgYWRhcHRlcnMgKGUuZy4gVGFibGVNb2RlbEFkYXB0ZXIpIHdoaWNoIHdpbGwgcHJlbWF0dXJlbHkKLQkJCS8vIGRpc2NvdmVyIGFueSBzdHJ1Y3R1cmFsIGNoYW5nZXMuLi4gOiggKQotCQkJLy8gc2VlIEl0ZW1Bc3BlY3RMaXN0VmFsdWVNb2RlbEFkYXB0ZXIuaXRlbUFzcGVjdENoYW5nZWQoRXZlbnRPYmplY3QpCi0JCQlmb3IgKEMgY29udGV4dEVsZW1lbnQgOiBjb250ZXh0RWxlbWVudHNUb1N5bmMpIHsKLQkJCQlpZiAoc3luYykgewotCQkJCQljb250ZXh0RWxlbWVudC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dEVsZW1lbnQudXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIHRvIHN5bmNocm9uaXplIGEgY29udGV4dCBsaXN0IGNvbnRhaW5lciB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCi0JICogcmVzb3VyY2UgY29udGFpbmVyLgotCSAqIEBwYXJhbSA8Qz4gdGhlIHR5cGUgb2YgY29udGV4dCBlbGVtZW50cwotCSAqIEBwYXJhbSA8Uj4gdGhlIHR5cGUgb2YgcmVzb3VyY2UgZWxlbWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgTGlzdENvbnRhaW5lcjxDLCBSPgotCQlleHRlbmRzIENvbGxlY3Rpb25Db250YWluZXI8QywgUj4gewotCi0JCXByb3RlY3RlZCBMaXN0Q29udGFpbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEM+IGdldENvbnRleHRFbGVtZW50cygpIHsKLQkJCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEM+KHRoaXMuY29udGV4dEVsZW1lbnRzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdEl0ZXJhYmxlPFI+IGdldFJlc291cmNlRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudC4KLQkJICovCi0JCXB1YmxpYyBpbnQgaW5kZXhPZkNvbnRleHRFbGVtZW50KEMgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRleHRFbGVtZW50cy5pbmRleE9mKGNvbnRleHRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBDIGdldENvbnRleHRFbGVtZW50KGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuY29udGV4dEVsZW1lbnRzLmVsZW1lbnRBdChpbmRleCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgY29udGV4dCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGVsZW1lbnQgYXQgdGhlCi0JCSAqIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQyBhZGRDb250ZXh0RWxlbWVudF8oaW50IGluZGV4LCBDIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEpwYU5vZGUudGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBjb250ZXh0RWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1vdmUgdGhlIGNvbnRleHQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleCB0byB0aGUgCi0JCSAqIHNwZWNpZmllZCBzb3VyY2UgaW5kZXguCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXRoaXMubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCB0aGlzLmNvbnRleHRFbGVtZW50cy5nZXQoc291cmNlSW5kZXgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgY29udGV4dCBlbGVtZW50IHRvIHRoZSBzcGVjaWZpZWQgaW5kZXguCi0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgQyBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEpwYU5vZGUudGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgZWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgY29udGV4dCBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGUgY29udGFpbmVyLgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4KSB7Ci0JCQlBYnN0cmFjdEpwYU5vZGUudGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoaW5kZXgsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCQlMaXN0SXRlcmFibGU8Uj4gcmVzb3VyY2VFbGVtZW50cyA9IGdldFJlc291cmNlRWxlbWVudHMoKTsKLQkJCQotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoUiByZXNvdXJjZUVsZW1lbnQgOiByZXNvdXJjZUVsZW1lbnRzKSB7Ci0JCQkJaWYgKHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpID4gaW5kZXgpIHsKLQkJCQkJaWYgKHRoaXMuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpICE9IHJlc291cmNlRWxlbWVudCkgewotCQkJCQkJdGhpcy5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsJCQkKLQkJCQl9Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJCQotCQkJZm9yICggOyBpbmRleCA8IHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOyApIHsKLQkJCQl0aGlzLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkYXB0ZXIgdXNlZCB0byBzeW5jaHJvbml6ZSBhIGNvbnRleHQgbGlzdCBjb250YWluZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZwotCSAqIHJlc291cmNlIGNvbnRhaW5lci4KLQkgKiBAcGFyYW0gPEM+IHRoZSB0eXBlIG9mIGNvbnRleHQgZWxlbWVudHMKLQkgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIHJlc291cmNlIGVsZW1lbnRzCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIENvbnRleHRMaXN0Q29udGFpbmVyPEMgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgUj4KLQkJZXh0ZW5kcyBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcjxDLCBSPiB7Ci0KLQkJcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEM+IGdldENvbnRleHRFbGVtZW50cygpIHsKLQkJCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEM+KHRoaXMuY29udGV4dEVsZW1lbnRzKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdEl0ZXJhYmxlPFI+IGdldFJlc291cmNlRWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudC4KLQkJICovCi0JCXB1YmxpYyBpbnQgaW5kZXhPZkNvbnRleHRFbGVtZW50KEMgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiB0aGlzLmNvbnRleHRFbGVtZW50cy5pbmRleE9mKGNvbnRleHRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBDIGdldENvbnRleHRFbGVtZW50KGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMuY29udGV4dEVsZW1lbnRzLmVsZW1lbnRBdChpbmRleCk7Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgY29udGV4dCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGVsZW1lbnQgYXQgdGhlCi0JCSAqIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQyBhZGRDb250ZXh0RWxlbWVudF8oaW50IGluZGV4LCBDIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEpwYU5vZGUudGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBjb250ZXh0RWxlbWVudCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIE1vdmUgdGhlIGNvbnRleHQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHRhcmdldCBpbmRleCB0byB0aGUgCi0JCSAqIHNwZWNpZmllZCBzb3VyY2UgaW5kZXguCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJCXRoaXMubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCB0aGlzLmNvbnRleHRFbGVtZW50cy5nZXQoc291cmNlSW5kZXgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBjbGVhciB0aGUgbGlzdCBvZiBjb250ZXh0IGVsZW1lbnRzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjbGVhckNvbnRleHRMaXN0KCkgewotCQkJQWJzdHJhY3RKcGFOb2RlLnRoaXMuY2xlYXJMaXN0KHRoaXMuY29udGV4dEVsZW1lbnRzLCBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogTW92ZSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudCB0byB0aGUgc3BlY2lmaWVkIGluZGV4LgotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIEMgZWxlbWVudCkgewotCQkJQWJzdHJhY3RKcGFOb2RlLnRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIGVsZW1lbnQsIHRoaXMuY29udGV4dEVsZW1lbnRzLCB0aGlzLmdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZW1vdmUgdGhlIGNvbnRleHQgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhlIGNvbnRhaW5lci4KLQkJICovCi0JCXB1YmxpYyBDIHJlbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCkgewotCQkJcmV0dXJuIEFic3RyYWN0SnBhTm9kZS50aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5jb250ZXh0RWxlbWVudHMsIHRoaXMuZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRFbGVtZW50KEMgY29udGV4dEVsZW1lbnQpIHsKLQkJCXRoaXMucmVtb3ZlQ29udGV4dEVsZW1lbnQodGhpcy5pbmRleE9mQ29udGV4dEVsZW1lbnQoY29udGV4dEVsZW1lbnQpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTA2OGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuUmVzb3VyY2VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcgotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1Qcm92aWRlcgotewotCXByb3RlY3RlZCBBcnJheUxpc3Q8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiByZXNvdXJjZU1vZGVsUHJvdmlkZXJzOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBqYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uczsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnM7Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gc3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uczsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiByZXNvdXJjZURlZmluaXRpb25zOwotCi0KLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSXRlcmFibGU8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBnZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQlpZiAodGhpcy5yZXNvdXJjZU1vZGVsUHJvdmlkZXJzID09IG51bGwpIHsKLQkJCXRoaXMucmVzb3VyY2VNb2RlbFByb3ZpZGVycyA9IHRoaXMuYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VNb2RlbFByb3ZpZGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4gYnVpbGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzKCkgewotCQlBcnJheUxpc3Q8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4oKTsKLQkJdGhpcy5hZGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzVG8ocHJvdmlkZXJzKTsKLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzVG8oQXJyYXlMaXN0PEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4gcHJvdmlkZXJzKTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBJdGVyYWJsZTxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuamF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5qYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gYnVpbGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJQXJyYXlMaXN0PEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPigpOwotCQl0aGlzLmFkZEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOwotCQlyZXR1cm4gZGVmaW5pdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVG8gdGhlIHNwZWNpZmllZCBsaXN0LCBhZGQgbWFwcGluZyBkZWZpbml0aW9ucyB0byB1c2UgZm9yIGFuYWx5emluZyB0aGUKLQkgKiBtYXBwaW5nIG9mIGEgdHlwZSBnaXZlbiBhbGwgYW5ub3RhdGlvbnMgb24gaXQuIFRoZSBvcmRlciBpcyBpbXBvcnRhbnQsCi0JICogYXMgb25jZSBhIG1hcHBpbmcgZGVmaW5pdGlvbiB0ZXN0cyBwb3NpdGl2ZSBmb3IgYQotCSAqIHR5cGUsIGFsbCBmb2xsb3dpbmcgbWFwcGluZyBkZWZpbml0aW9ucyBhcmUgaWdub3JlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucyk7Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBJdGVyYWJsZTxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gYnVpbGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPigpOwotCQl0aGlzLmFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOwotCQlyZXR1cm4gZGVmaW5pdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogVG8gdGhlIHNwZWNpZmllZCBsaXN0LCBhZGQgbWFwcGluZyBkZWZpbml0aW9ucyB0byB1c2UgZm9yIGFuYWx5emluZyB0aGUKLQkgKiBkZWZhdWx0IG1hcHBpbmcgb2YgYW4gYXR0cmlidXRlLiBUaGUgb3JkZXIgaXMgaW1wb3J0YW50LAotCSAqIGFzIG9uY2UgYSBtYXBwaW5nIGRlZmluaXRpb24gdGVzdHMgcG9zaXRpdmUgZm9yIGFuIGF0dHJpYnV0ZSwKLQkgKiBhbGwgZm9sbG93aW5nIG1hcHBpbmcgZGVmaW5pdGlvbnMgYXJlIGlnbm9yZWQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBJdGVyYWJsZTxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5zcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zID0gdGhpcy5idWlsZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBidWlsZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCUFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+KCk7Ci0JCXRoaXMuYWRkU3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJcmV0dXJuIGRlZmluaXRpb25zOwotCX0KLQotCS8qKgotCSAqIFRvIHRoZSBzcGVjaWZpZWQgbGlzdCwgYWRkIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhbmFseXppbmcgdGhlCi0JICogc3BlY2lmaWVkIG1hcHBpbmcgb2YgYW4gYXR0cmlidXRlIGdpdmVuIGFsbCBhbm5vdGF0aW9ucyBvbiBpdC4gVGhlIG9yZGVyCi0JICogaXMgaW1wb3J0YW50LCBhcyBvbmNlIGEgbWFwcGluZyBkZWZpbml0aW9uIHRlc3RzIHBvc2l0aXZlIGZvciBhbgotCSAqIGF0dHJpYnV0ZSwgYWxsIGZvbGxvd2luZyBtYXBwaW5nIGRlZmluaXRpb25zIGFyZSBpZ25vcmVkLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucyk7Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBJdGVyYWJsZTxSZXNvdXJjZURlZmluaXRpb24+IGdldFJlc291cmNlRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLnJlc291cmNlRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5yZXNvdXJjZURlZmluaXRpb25zID0gdGhpcy5idWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZURlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBidWlsZFJlc291cmNlRGVmaW5pdGlvbnMoKSB7Ci0JCUFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+KCk7Ci0JCXRoaXMuYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJcmV0dXJuIGRlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucyk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9BYnN0cmFjdEpwYVByb2plY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWRkYTM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0Fic3RyYWN0SnBhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVR5cGVDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlVHlwZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5QbGF0Zm9ybVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5SZXNvdXJjZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmRFeGVjdXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5CaXRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNuYXBzaG90Q2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmxpYnByb3YuSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC5Xb3JrYmVuY2hSZXNvdXJjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKUEEgcHJvamVjdC4gSG9sZHMgYWxsIHRoZSBKUEEgc3R1ZmYuCi0gKgotICogVGhlIEpQQSBwbGF0Zm9ybSBwcm92aWRlcyB0aGUgaG9va3MgZm9yIHZlbmRvci1zcGVjaWZpYyBzdHVmZi4KLSAqCi0gKiBUaGUgSlBBIGZpbGVzIGFyZSB0aGUgInJlc291cmNlIiBtb2RlbCAoaS5lLiBvYmplY3RzIHRoYXQgY29ycmVzcG9uZCBkaXJlY3RseQotICogdG8gRWNsaXBzZSByZXNvdXJjZXM7IGUuZy4gSmF2YSBzb3VyY2UgY29kZSBmaWxlcywgWE1MIGZpbGVzLCBKQVIgZmlsZXMpLgotICoKLSAqIFRoZSByb290IGNvbnRleHQgbm9kZSBpcyB0aGUgImNvbnRleHQibW9kZWwgKGkuZS4gb2JqZWN0cyB0aGF0IGF0dGVtcHQgdG8KLSAqIG1vZGVsIHRoZSBKUEEgc3BlYywgdXNpbmcgdGhlICJyZXNvdXJjZSIgbW9kZWwgYXMgYW4gYWRhcHRlciB0byB0aGUgRWNsaXBzZQotICogcmVzb3VyY2VzKS4KLSAqCi0gKiBUaGUgZGF0YSBzb3VyY2UgaXMgYW4gYWRhcHRlciB0byB0aGUgRFRQIG1ldGEtZGF0YSBtb2RlbC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhUHJvamVjdAotCWV4dGVuZHMgQWJzdHJhY3RKcGFOb2RlCi0JaW1wbGVtZW50cyBKcGFQcm9qZWN0Ml8wCi17Ci0JLyoqCi0JICogVGhlIEVjbGlwc2UgcHJvamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBKUEEgcHJvamVjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQotCS8qKgotCSAqIFRoZSB2ZW5kb3Itc3BlY2lmaWMgSlBBIHBsYXRmb3JtIHRoYXQgYnVpbGRzIHRoZSBKUEEgcHJvamVjdAotCSAqIGFuZCBhbGwgaXRzIGNvbnRlbnRzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybTsKLQotCS8qKgotCSAqIFRoZSBKUEEgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBKUEEgcHJvamVjdDoKLQkgKiAgICAgcGVyc2lzdGVuY2UueG1sCi0JICogICAgIG9ybS54bWwKLQkgKiAgICAgamF2YQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8SnBhRmlsZT4ganBhRmlsZXMgPSBuZXcgVmVjdG9yPEpwYUZpbGU+KCk7Ci0KLQkvKioKLQkgKiBUaGUgImV4dGVybmFsIiBKYXZhIHJlc291cmNlIGNvbXBpbGF0aW9uIHVuaXRzIChzb3VyY2UpLiBQb3B1bGF0ZWQgdXBvbiBkZW1hbmQuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+IGV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cyA9IG5ldyBWZWN0b3I8SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0PigpOwotCi0JLyoqCi0JICogVGhlICJleHRlcm5hbCIgSmF2YSByZXNvdXJjZSB0eXBlcyAoYmluYXJ5KS4gUG9wdWxhdGVkIHVwb24gZGVtYW5kLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VUeXBlQ2FjaGUgZXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlQ2FjaGU7Ci0KLQkvKioKLQkgKiBSZXNvdXJjZSBtb2RlbHMgbm90aWZ5IHRoaXMgbGlzdGVuZXIgd2hlbiB0aGV5IGNoYW5nZS4gQSBwcm9qZWN0IHVwZGF0ZQotCSAqIHNob3VsZCBvY2N1ciBhbnkgdGltZSBhIHJlc291cmNlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciByZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBvZiB0aGUgbW9kZWwgcmVwcmVzZW50aW5nIHRoZSBjb2xsYXRlZCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoCi0JICogdGhlIEpQQSBwcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFSb290Q29udGV4dE5vZGUgcm9vdENvbnRleHROb2RlOwotCi0JLyoqCi0JICogQSBwbHVnZ2FibGUgc3luY2hyb25pemVyIHRoYXQga2VlcHMgdGhlIEpQQQotCSAqIHByb2plY3QncyBjb250ZXh0IG1vZGVsIHN5bmNocm9uaXplZCB3aXRoIGl0cyByZXNvdXJjZSBtb2RlbCwgZWl0aGVyCi0JICogc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseSAob3Igbm90IGF0IGFsbCkuIEEgc3luY2hyb25vdXMgc3luY2hyb25pemVyCi0JICogaXMgdGhlIGRlZmF1bHQuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhIFVJIHNob3VsZAotCSAqIGltbWVkaWF0ZWx5IGNoYW5nZSB0aGlzIHRvIGFuIGFzeW5jaHJvbm91cyBzeW5jaHJvbml6ZXIuIEEgc3luY2hyb25vdXMKLQkgKiBzeW5jaHJvbml6ZXIgY2FuIGJlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBpcyBiZWluZyBtYW5pcHVsYXRlZCBieSBhICJiYXRjaCIKLQkgKiAob3Igbm9uLVVJKSBjbGllbnQgKGUuZy4gd2hlbiB0ZXN0aW5nICJzeW5jaHJvbml6YXRpb24iKS4gQSBudWxsIHVwZGF0ZXIKLQkgKiBjYW4gdXNlZCBkdXJpbmcgdGVzdHMgdGhhdCBkbyBub3QgY2FyZSB3aGV0aGVyICJzeW5jaHJvbml6YXRpb24iIG9jY3VyLgotCSAqIENsaWVudHMgd2lsbCBuZWVkIHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIHRoZSBzeW5jaHJvbml6ZXIgaWYgdGhleSByZXF1aXJlCi0JICogYW4gYXN5bmNocm9ub3VzIHN5bmNocm9uaXplci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgU3luY2hyb25pemVyIGNvbnRleHRNb2RlbFN5bmNocm9uaXplcjsKLQlwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBzeW5jaHJvbml6aW5nQ29udGV4dE1vZGVsID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBBIHBsdWdnYWJsZSBzeW5jaHJvbml6ZXIgdGhhdCAidXBkYXRlcyIgdGhlIEpQQSBwcm9qZWN0LCBlaXRoZXIKLQkgKiBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5IChvciBub3QgYXQgYWxsKS4gQSBzeW5jaHJvbm91cyB1cGRhdGVyCi0JICogaXMgdGhlIGRlZmF1bHQsIGFsbG93aW5nIGEgbmV3bHktY29uc3RydWN0ZWQgSlBBIHByb2plY3QgdG8gYmUgInVwZGF0ZWQiCi0JICogdXBvbiByZXR1cm4gZnJvbSB0aGUgY29uc3RydWN0b3IuIEZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBhIFVJIHNob3VsZAotCSAqIGltbWVkaWF0ZWx5IGNoYW5nZSB0aGlzIHRvIGFuIGFzeW5jaHJvbm91cyB1cGRhdGVyLiBBIHN5bmNocm9ub3VzCi0JICogdXBkYXRlciBjYW4gYmUgdXNlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIGJlaW5nIG1hbmlwdWxhdGVkIGJ5IGEgImJhdGNoIgotCSAqIChvciBub24tVUkpIGNsaWVudCAoZS5nLiB3aGVuIHRlc3RpbmcgdGhlICJ1cGRhdGUiIGJlaGF2aW9yKS4gQSBudWxsCi0JICogdXBkYXRlciBjYW4gdXNlZCBkdXJpbmcgdGVzdHMgdGhhdCBkbyBub3QgY2FyZSB3aGV0aGVyICJzeW5jaHJvbml6YXRpb24iCi0JICogb2NjdXIuCi0JICogQ2xpZW50cyB3aWxsIG5lZWQgdG8gZXhwbGljaXRseSBjb25maWd1cmUgdGhlIHVwZGF0ZXIgaWYgdGhleSByZXF1aXJlCi0JICogYW4gYXN5bmNocm9ub3VzIHVwZGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvbGF0aWxlIENhbGxiYWNrU3luY2hyb25pemVyIHVwZGF0ZVN5bmNocm9uaXplcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ2FsbGJhY2tTeW5jaHJvbml6ZXIuTGlzdGVuZXIgdXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgZGF0YSBzb3VyY2UgdGhhdCB3cmFwcyB0aGUgRFRQIG1vZGVsLgotCSAqLwotCS8vIFRPRE8gbW92ZSB0byBwZXJzaXN0ZW5jZSB1bml0Li4uIDotKAotCXByb3RlY3RlZCBmaW5hbCBKcGFEYXRhU291cmNlIGRhdGFTb3VyY2U7Ci0KLQkvKioKLQkgKiBBIGNhdGFsb2cgbmFtZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBjb25uZWN0aW9uJ3MgZGVmYXVsdCBjYXRhbG9nLgotCSAqLwotCXByb3RlY3RlZCB2b2xhdGlsZSBTdHJpbmcgdXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2c7Ci0KLQkvKioKLQkgKiBBIHNjaGVtYSBuYW1lIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGNvbm5lY3Rpb24ncyBkZWZhdWx0IHNjaGVtYS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWE7Ci0KLQkvKioKLQkgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcHJvamVjdCBzaG91bGQgImRpc2NvdmVyIiBhbm5vdGF0ZWQKLQkgKiBjbGFzc2VzIGF1dG9tYXRpY2FsbHksIGFzIG9wcG9zZWQgdG8gcmVxdWlyaW5nIHRoZSBjbGFzc2VzIHRvIGJlCi0JICogbGlzdGVkIGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uIFN0b3JlZCBhcyBhIHByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyhib29sZWFuKQotCSAqLwotCXByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXM7Ci0KLQkvKioKLQkgKiBTdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgbW9kaWZ5U2hhcmVkRG9jdW1lbnRDb21tYW5kRXhlY3V0b3I7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiB0aGUgSmF2YSBwcm9qZWN0IHNvdXJjZSBmb2xkZXIgdGhhdCBob2xkcyB0aGUgZ2VuZXJhdGVkCi0JICogbWV0YW1vZGVsLiBJZiB0aGUgbmFtZSBpcyA8Y29kZT5udWxsPC9jb2RlPiB0aGUgbWV0YW1vZGVsIGlzIG5vdAotCSAqIGdlbmVyYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9sYXRpbGUgU3RyaW5nIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEFic3RyYWN0SnBhUHJvamVjdChKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHsKLQkJc3VwZXIobnVsbCk7ICAvLyBKUEEgcHJvamVjdCBpcyB0aGUgcm9vdCBvZiB0aGUgY29udGFpbm1lbnQgdHJlZQotCQlpZiAoKGNvbmZpZy5nZXRQcm9qZWN0KCkgPT0gbnVsbCkgfHwgKGNvbmZpZy5nZXRKcGFQbGF0Zm9ybSgpID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnByb2plY3QgPSBjb25maWcuZ2V0UHJvamVjdCgpOwotCQl0aGlzLmpwYVBsYXRmb3JtID0gY29uZmlnLmdldEpwYVBsYXRmb3JtKCk7Ci0JCXRoaXMuZGF0YVNvdXJjZSA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSnBhRGF0YVNvdXJjZSh0aGlzLCBjb25maWcuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCkpOwotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nID0gY29uZmlnLmdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7Ci0JCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSA9IGNvbmZpZy5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7Ci0JCXRoaXMuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyA9IGNvbmZpZy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMoKTsKLQotCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yID0gdGhpcy5idWlsZE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCk7Ci0KLQkJdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUmVzb3VyY2VNb2RlbExpc3RlbmVyKCk7Ci0JCS8vIGJ1aWxkIHRoZSBKUEEgZmlsZXMgY29ycmVzcG9uZGluZyB0byB0aGUgRWNsaXBzZSBwcm9qZWN0J3MgZmlsZXMKLQkJSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yIHZpc2l0b3IgPSB0aGlzLmJ1aWxkSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCk7Ci0JCXZpc2l0b3IudmlzaXRQcm9qZWN0KHRoaXMucHJvamVjdCk7Ci0KLQkJdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZVR5cGVDYWNoZSA9IHRoaXMuYnVpbGRFeHRlcm5hbEphdmFSZXNvdXJjZVR5cGVDYWNoZSgpOwotCi0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQl0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUgPSAoKEpwYVByb2plY3QyXzAuQ29uZmlnKSBjb25maWcpLmdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKTsKLQkJCWlmICh0aGlzLm1ldGFtb2RlbFNvdXJlRm9sZGVyTmFtZUlzSW52YWxpZCgpKSB7Ci0JCQkJdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXRoaXMucm9vdENvbnRleHROb2RlID0gdGhpcy5idWlsZFJvb3RDb250ZXh0Tm9kZSgpOwotCi0JCS8vIHRoZXJlICpzaG91bGRuJ3QqIGJlIGFueSBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBtb2RlbC4uLgotCQl0aGlzLnNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcl8odGhpcy5idWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyKCkpOwotCi0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIoKTsKLQkJLy8gInVwZGF0ZSIgdGhlIHByb2plY3QgYmVmb3JlIHJldHVybmluZwotCQl0aGlzLnNldFVwZGF0ZVN5bmNocm9uaXplcl8odGhpcy5idWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyKCkpOwotCi0JCS8vIHN0YXJ0IGxpc3RlbmluZyB0byB0aGlzIGNhY2hlIG9uY2UgdGhlIGNvbnRleHQgbW9kZWwgaGFzIGJlZW4gYnVpbHQKLQkJLy8gYW5kIGFsbCB0aGUgZXh0ZXJuYWwgdHlwZXMgYXJlIGZhdWx0ZWQgaW4KLQkJdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZVR5cGVDYWNoZS5hZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHJlcXVpcmVzUGFyZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZUNhY2hlIGJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlQ2FjaGUoKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5VHlwZUNhY2hlKHRoaXMuanBhUGxhdGZvcm0uZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFSb290Q29udGV4dE5vZGUgYnVpbGRSb290Q29udGV4dE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZFJvb3RDb250ZXh0Tm9kZSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbCByZXNvdXJjZSBwcm94eSB2aXNpdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IgYnVpbGRJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgSW5pdGlhbFJlc291cmNlUHJveHlWaXNpdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEluaXRpYWxSZXNvdXJjZVByb3h5VmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JCXByb3RlY3RlZCBJbml0aWFsUmVzb3VyY2VQcm94eVZpc2l0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIHZpc2l0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCQl0cnkgewotCQkJCXAuYWNjZXB0KHRoaXMsIElSZXNvdXJjZS5OT05FKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkvLyBzaG91bGRuJ3QgaGFwcGVuIC0gd2UgZG9uJ3QgdGhyb3cgYW55IENvcmVFeGNlcHRpb25zCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOwotCQkJfQotCQl9Ci0JCS8vIGFkZCBhIEpQQSBmaWxlIGZvciBldmVyeSBbYXBwcm9wcmlhdGVdIGZpbGUgZW5jb3VudGVyZWQgYnkgdGhlIHZpc2l0b3IKLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcmVzb3VyY2UpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUk9PVCA6ICAvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5QUk9KRUNUIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZPTERFUiA6Ci0JCQkJCXJldHVybiB0cnVlOyAgLy8gdmlzaXQgY2hpbGRyZW4KLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJQWJzdHJhY3RKcGFQcm9qZWN0LnRoaXMuYWRkSnBhRmlsZV8oKElGaWxlKSByZXNvdXJjZS5yZXF1ZXN0UmVzb3VyY2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBmYWxzZTsgIC8vIG5vIGNoaWxkcmVuCi0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZ25vcmUgY2hhbmdlcyB0byB0aGlzIGNvbGxlY3Rpb24uIEFkZHMgY2FuIGJlIGlnbm9yZWQgc2luY2UgdGhleSBhcmUgdHJpZ2dlcmVkCi0JICogYnkgcmVxdWVzdHMgdGhhdCB3aWxsLCB0aGVtc2VsdmVzLCB0cmlnZ2VyIHVwZGF0ZXMgKHR5cGljYWxseSBkdXJpbmcgdGhlCi0JICogdXBkYXRlIG9mIGFuIG9iamVjdCB0aGF0IGNhbGxzIGEgc2V0dGVyIHdpdGggdGhlIG5ld2x5LWNyZWF0ZWQgcmVzb3VyY2UKLQkgKiB0eXBlKS4gRGVsZXRlcyB3aWxsIGJlIGFjY29tcGFuaWVkIGJ5IG1hbnVhbCB1cGRhdGVzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE5vblVwZGF0ZUFzcGVjdE5hbWVzVG8oU2V0PFN0cmluZz4gbm9uVXBkYXRlQXNwZWN0TmFtZXMpIHsKLQkJc3VwZXIuYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhub25VcGRhdGVBc3BlY3ROYW1lcyk7Ci0JCW5vblVwZGF0ZUFzcGVjdE5hbWVzLmFkZChFWFRFUk5BTF9KQVZBX1JFU09VUkNFX0NPTVBJTEFUSU9OX1VOSVRTX0NPTExFQ1RJT04pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmFsIHF1ZXJpZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wcm9qZWN0LmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLnByb2plY3Q7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZSh0aGlzLnByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBnZXRKcGFQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm07Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZ2V0Q29tYmluZWRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4oCi0JCQkJCXRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCksCi0JCQkJCXRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkKLQkJCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhRGF0YVNvdXJjZSBnZXREYXRhU291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhU291cmNlOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KLQkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZyBnZXREZWZhdWx0RGJDYXRhbG9nKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gY2F0YWxvZyA6IHRoaXMuZ2V0RGF0YWJhc2VEZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VEZWZhdWx0Q2F0YWxvZygpIHsKLQkJRGF0YWJhc2UgZGIgPSB0aGlzLmdldERhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGIgPT0gbnVsbCApID8gbnVsbCA6IGRiLmdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4gY2F0YWxvZyksCi0JICogdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9nczsgYW5kIHdlIG5lZWQgdG8KLQkgKiBnZXQgdGhlIHNjaGVtYSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZS4KLQkgKi8KLQlwdWJsaWMgU2NoZW1hQ29udGFpbmVyIGdldERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyAhPSBudWxsKSA/IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERlZmF1bHREYlNjaGVtYSgpIHsKLQkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5nZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJcmV0dXJuIChzYyA9PSBudWxsKSA/IG51bGwgOiBzYy5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCVN0cmluZyBzY2hlbWEgPSB0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gc2NoZW1hOwotCQl9Ci0KLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCWlmIChjYXRhbG9nID09IG51bGwpIHsKLQkJCS8vIGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgY2F0YWxvZyAoZWl0aGVyIHVzZXItb3ZlcnJpZGUgb3IgZGF0YWJhc2UtZGV0ZXJtaW5lZCksCi0JCQkvLyB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9nczsKLQkJCS8vIHJldHVybiB0aGUgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYQotCQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VEZWZhdWx0U2NoZW1hKCk7Ci0JCX0KLQotCQlDYXRhbG9nIGRiQ2F0YWxvZyA9IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKTsKLQkJaWYgKGRiQ2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGJDYXRhbG9nLmdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCk7Ci0JCX0KLQotCQkvLyBpZiB3ZSBjb3VsZCBub3QgZmluZCBhIGNhdGFsb2cgb24gdGhlIGRhdGFiYXNlIHRoYXQgbWF0Y2hlcyB0aGUgZGVmYXVsdAotCQkvLyBjYXRhbG9nIG5hbWUsIHJldHVybiB0aGUgZGF0YWJhc2UncyBkZWZhdWx0IHNjaGVtYSg/KSAtIGhtbW0KLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YWJhc2VEZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZURlZmF1bHRTY2hlbWEoKSB7Ci0JCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiID09IG51bGwgKSA/IG51bGwgOiBkYi5nZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7Ci0JCUpwdEpwYUNvcmVQbHVnaW4uc2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2codGhpcy5wcm9qZWN0LCBjYXRhbG9nKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYTsKLQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hID0gc2NoZW1hOwotCQlKcHRKcGFDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEodGhpcy5wcm9qZWN0LCBzY2hlbWEpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoYm9vbGVhbiBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzOwotCQl0aGlzLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMgPSBkaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzOwotCQlKcHRKcGFDb3JlUGx1Z2luLnNldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyh0aGlzLnByb2plY3QsIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTQ09WRVJTX0FOTk9UQVRFRF9DTEFTU0VTX1BST1BFUlRZLCBvbGQsIGRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKUEEgZmlsZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEpwYUZpbGU+IGdldEpwYUZpbGVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEpwYUZpbGU+KHRoaXMuanBhRmlsZXMpOyAgLy8gcmVhZC1vbmx5Ci0JfQotCi0JcHVibGljIGludCBnZXRKcGFGaWxlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpwYUZpbGVzLnNpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SnBhRmlsZT4gZ2V0SnBhRmlsZXMoZmluYWwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SnBhRmlsZT4odGhpcy5nZXRKcGFGaWxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKcGFGaWxlIGpwYUZpbGUpIHsKLQkJCQlyZXR1cm4ganBhRmlsZS5nZXRDb250ZW50VHlwZSgpLmlzS2luZE9mKGNvbnRlbnRUeXBlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpIHsKLQkJZm9yIChKcGFGaWxlIGpwYUZpbGUgOiB0aGlzLmdldEpwYUZpbGVzKCkpIHsKLQkJCWlmIChqcGFGaWxlLmdldEZpbGUoKS5lcXVhbHMoZmlsZSkpIHsKLQkJCQlyZXR1cm4ganBhRmlsZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYSBKUEEgZmlsZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLCBpZiBhcHByb3ByaWF0ZS4KLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhIEpQQSBGaWxlIHdhcyBjcmVhdGVkIGFuZCBhZGRlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWRkSnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuYWRkSnBhRmlsZV8oZmlsZSk7Ci0JCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChKUEFfRklMRVNfQ09MTEVDVElPTiwganBhRmlsZSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkIGEgSlBBIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZSwgaWYgYXBwcm9wcmlhdGUsIHdpdGhvdXQgZmlyaW5nCi0JICogYW4gZXZlbnQ7IHVzZWZ1bCBkdXJpbmcgY29uc3RydWN0aW9uLgotCSAqIFJldHVybiB0aGUgbmV3IEpQQSBmaWxlLCBudWxsIGlmIGl0IHdhcyBub3QgY3JlYXRlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhRmlsZSBhZGRKcGFGaWxlXyhJRmlsZSBmaWxlKSB7Ci0JCWlmICh0aGlzLmZpbGVJc0phdmFSZWxhdGVkKGZpbGUpKSB7Ci0JCQlpZiAoICEgdGhpcy5nZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgoZmlsZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsgIC8vIGphdmEtcmVsYXRlZCBmaWxlcyBtdXN0IGJlIG9uIHRoZSBKYXZhIGNsYXNzcGF0aAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCAhIHRoaXMuZmlsZVJlc291cmNlTG9jYXRpb25Jc1ZhbGlkKGZpbGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuYnVpbGRKcGFGaWxlKGZpbGUpOwotCQlpZiAoanBhRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKS5hZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOwotCQl0aGlzLmpwYUZpbGVzLmFkZChqcGFGaWxlKTsKLQkJcmV0dXJuIGpwYUZpbGU7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+LmphdmE8L2NvZGU+IG9yIDxjb2RlPi5qYXI8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUlzSmF2YVJlbGF0ZWQoSUZpbGUgZmlsZSkgewotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQlyZXR1cm4gKGNvbnRlbnRUeXBlICE9IG51bGwpICYmIHRoaXMuY29udGVudFR5cGVJc0phdmFSZWxhdGVkKGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBjb250ZW50IHR5cGUgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGVudFR5cGVJc0phdmFSZWxhdGVkKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gY29udGVudFR5cGUuaXNLaW5kT2YoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpIHx8Ci0JCQkJY29udGVudFR5cGUuaXNLaW5kT2YoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlUmVzb3VyY2VMb2NhdGlvbklzVmFsaWQoSUZpbGUgZmlsZSkgewotCQlSZXNvdXJjZUxvY2F0b3IgcmVzb3VyY2VMb2NhdG9yID0gSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IodGhpcy5nZXRQcm9qZWN0KCkpOwotCQlyZXR1cm4gcmVzb3VyY2VMb2NhdG9yLmFjY2VwdFJlc291cmNlTG9jYXRpb24odGhpcy5nZXRQcm9qZWN0KCksIGZpbGUuZ2V0UGFyZW50KCkpOwotCX0KLQotCS8qKgotCSAqIExvZyBhbnkgZGV2ZWxvcGVyIGV4Y2VwdGlvbnMgYW5kIGRvbid0IGJ1aWxkIGEgSlBBIGZpbGUgcmF0aGVyCi0JICogdGhhbiBjb21wbGV0ZWx5IGZhaWxpbmcgdG8gYnVpbGQgdGhlIEpQQSBQcm9qZWN0LgotCSAqLwotCXByb3RlY3RlZCBKcGFGaWxlIGJ1aWxkSnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmJ1aWxkSnBhRmlsZSh0aGlzLCBmaWxlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgSlBBIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIElGaWxlLCBpZiBpdCBleGlzdHMuCi0JICogUmV0dXJuIHRydWUgaWYgYSBKUEEgRmlsZSB3YXMgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlSnBhRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZShmaWxlKTsKLQkJaWYgKGpwYUZpbGUgIT0gbnVsbCkgeyAgLy8gYSBKcGFGaWxlIGlzIG5vdCBhZGRlZCBmb3IgZXZlcnkgSUZpbGUKLQkJCXRoaXMucmVtb3ZlSnBhRmlsZShqcGFGaWxlKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9wIGxpc3RlbmluZyB0byB0aGUgSlBBIGZpbGUgYW5kIHJlbW92ZSBpdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVKcGFGaWxlKEpwYUZpbGUganBhRmlsZSkgewotCQlqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKS5yZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOwotCQlpZiAoICEgdGhpcy5yZW1vdmVJdGVtRnJvbUNvbGxlY3Rpb24oanBhRmlsZSwgdGhpcy5qcGFGaWxlcywgSlBBX0ZJTEVTX0NPTExFQ1RJT04pKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGpwYUZpbGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZXh0ZXJuYWwgSmF2YSByZXNvdXJjZSB0eXBlcyAoc291cmNlIG9yIGJpbmFyeSkgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBidWlsZEV4dGVybmFsSmF2YVJlc291cmNlVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJSVR5cGUgamR0VHlwZSA9IHRoaXMuZmluZFR5cGUodHlwZU5hbWUpOwotCQlyZXR1cm4gKGpkdFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEV4dGVybmFsSmF2YVJlc291cmNlVHlwZShqZHRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGUgZmluZFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIGlnbm9yZSBleGNlcHRpb24/Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlKElUeXBlIGpkdFR5cGUpIHsKLQkJcmV0dXJuIGpkdFR5cGUuaXNCaW5hcnkoKSA/Ci0JCQkJdGhpcy5idWlsZEJpbmFyeUV4dGVybmFsSmF2YVJlc291cmNlVHlwZShqZHRUeXBlKSA6Ci0JCQkJdGhpcy5idWlsZFNvdXJjZUV4dGVybmFsSmF2YVJlc291cmNlVHlwZShqZHRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGJ1aWxkQmluYXJ5RXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlKElUeXBlIGpkdFR5cGUpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlQ2FjaGUuYWRkVHlwZShqZHRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGJ1aWxkU291cmNlRXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlKElUeXBlIGpkdFR5cGUpIHsKLQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSB0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KGpkdFR5cGUuZ2V0Q29tcGlsYXRpb25Vbml0KCkpOwotCQlTdHJpbmcgamR0VHlwZU5hbWUgPSBqZHRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpOyAgLy8gSkRUIG1lbWJlciB0eXBlIG5hbWVzIHVzZSAnJCcKLQkJZm9yIChKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhdCA6IGpyY3UuZ2V0VHlwZXMoKSkgewotCQkJaWYgKGpyYXQuZ2V0UXVhbGlmaWVkTmFtZSgpLmVxdWFscyhqZHRUeXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4ganJhdDsKLQkJCX0KLQkJfQotCQkvLyB3ZSBjYW4gZ2V0IGhlcmUgaWYgdGhlIHByb2plY3QgSlJFIGlzIHJlbW92ZWQ7Ci0JCS8vIHNlZSBTb3VyY2VDb21waWxhdGlvblVuaXQjZ2V0UHJpbWFyeVR5cGUoQ29tcGlsYXRpb25Vbml0KQotCQkvLyBidWcgMjI1MzMyCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleHRlcm5hbCBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZXMgKGJpbmFyeSkgKioqKioqKioqKgotCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGVDYWNoZSBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZVR5cGVDYWNoZSgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlQ2FjaGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMgKHNvdXJjZSkgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4odGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMpOyAgLy8gcmVhZC1vbmx5Ci0JfQotCi0JcHVibGljIGludCBnZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgY29tcGlsYXRpb24gdW5pdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQKLQkgKiBKRFQgY29tcGlsYXRpb24gdW5pdC4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGJ1aWxkIGl0LgotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoSUNvbXBpbGF0aW9uVW5pdCBqZHRDb21waWxhdGlvblVuaXQpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQganJjdSA6IHRoaXMuZ2V0RXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpIHsKLQkJCWlmIChqcmN1LmdldENvbXBpbGF0aW9uVW5pdCgpLmVxdWFscyhqZHRDb21waWxhdGlvblVuaXQpKSB7Ci0JCQkJLy8gd2Ugd2lsbCBnZXQgaGVyZSBpZiB0aGUgSlJDVSBjb3VsZCBub3QgYnVpbGQgaXRzIHBlcnNpc3RlbnQgdHlwZS4uLgotCQkJCXJldHVybiBqcmN1OwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmFkZEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KGpkdENvbXBpbGF0aW9uVW5pdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkIGFuIGV4dGVybmFsIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGFkZEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KElDb21waWxhdGlvblVuaXQgamR0Q29tcGlsYXRpb25Vbml0KSB7Ci0JCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqZHRDb21waWxhdGlvblVuaXQpOwotCQl0aGlzLmFkZEl0ZW1Ub0NvbGxlY3Rpb24oanJjdSwgdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMsIEVYVEVSTkFMX0pBVkFfUkVTT1VSQ0VfQ09NUElMQVRJT05fVU5JVFNfQ09MTEVDVElPTik7Ci0JCWpyY3UuYWRkUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLQkJcmV0dXJuIGpyY3U7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBidWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGpkdENvbXBpbGF0aW9uVW5pdCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVR5cGVDb21waWxhdGlvblVuaXQoCi0JCQkJCWpkdENvbXBpbGF0aW9uVW5pdCwKLQkJCQkJdGhpcy5qcGFQbGF0Zm9ybS5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKSwKLQkJCQkJdGhpcy5qcGFQbGF0Zm9ybS5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpLAotCQkJCQl0aGlzLm1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yCi0JCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJRmlsZSBmaWxlKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgOiB0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKSB7Ci0JCQlpZiAoanJjdS5nZXRGaWxlKCkuZXF1YWxzKGZpbGUpKSB7Ci0JCQkJdGhpcy5yZW1vdmVFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChqcmN1KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UpIHsKLQkJanJjdS5yZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIodGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXIpOwotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tQ29sbGVjdGlvbihqcmN1LCB0aGlzLmV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cywgRVhURVJOQUxfSkFWQV9SRVNPVVJDRV9DT01QSUxBVElPTl9VTklUU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGV4dCBtb2RlbCAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhUm9vdENvbnRleHROb2RlIGdldFJvb3RDb250ZXh0Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucm9vdENvbnRleHROb2RlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1dGlsaXR5ICoqKioqKioqKioKLQotCXB1YmxpYyBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoSVBhdGggcnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UGxhdGZvcm1GaWxlKHRoaXMucHJvamVjdCwgcnVudGltZVBhdGgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYTUwgZmlsZXMgKioqKioqKioqKgotCi0JcHVibGljIEpwYVhtbFJlc291cmNlIGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoSnBhWG1sUmVzb3VyY2UpIHRoaXMuZ2V0UmVzb3VyY2VNb2RlbCgKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfUEVSU0lTVEVOQ0VfWE1MX1JVTlRJTUVfUEFUSCwKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUKLQkJCSk7Ci0JfQotCi0JcHVibGljIEpwYVhtbFJlc291cmNlIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCX0KLQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZSBnZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiAoSnBhWG1sUmVzb3VyY2UpIHRoaXMuZ2V0UmVzb3VyY2VNb2RlbChydW50aW1lUGF0aCwgSnB0SnBhQ29yZVBsdWdpbi5NQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIGZpbGUgZXhpc3RzLCBpcyBzaWduaWZpY2FudCB0byB0aGUgSlBBIHByb2plY3QsIGFuZCBpdHMKLQkgKiBjb250ZW50IGlzIGEgImtpbmQgb2YiIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlLCByZXR1cm4gdGhlIEpQQQotCSAqIHJlc291cmNlIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpbGU7IG90aGVyd2lzZSwgcmV0dXJuIG51bGwuCi0JICovCi0JcHJvdGVjdGVkIEpwdFJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbChJUGF0aCBydW50aW1lUGF0aCwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUlGaWxlIGZpbGUgPSB0aGlzLmdldFBsYXRmb3JtRmlsZShydW50aW1lUGF0aCk7Ci0JCXJldHVybiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpID8gdGhpcy5nZXRSZXNvdXJjZU1vZGVsKGZpbGUsIGNvbnRlbnRUeXBlKSA6ICBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgZmlsZSBpcyBzaWduaWZpY2FudCB0byB0aGUgSlBBIHByb2plY3QgYW5kIGl0cyBjb250ZW50Ci0JICogaXMgYSAia2luZCBvZiIgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUsIHJldHVybiB0aGUgSlBBIHJlc291cmNlIG1vZGVsCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZTsgb3RoZXJ3aXNlLCByZXR1cm4gbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSnB0UmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0JCXJldHVybiAoanBhRmlsZSA9PSBudWxsKSA/IG51bGwgOiBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoY29udGVudFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0ZWQgSmF2YSBzb3VyY2UgY2xhc3NlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbm5vdGF0ZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSwgU3RyaW5nPih0aGlzLmdldEludGVybmFsQW5ub3RhdGVkU291cmNlSmF2YVJlc291cmNlVHlwZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhVHlwZSkgewotCQkJCXJldHVybiBqcmFUeXBlLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aG9zZSB2YWxpZCBhbm5vdGF0ZWQgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzIHRoYXQgYXJlCi0JICogZGlyZWN0bHkgcGFydCBvZiB0aGUgSlBBIHByb2plY3QsIGlnbm9yaW5nIHRob3NlIGluIEpBUnMgcmVmZXJlbmNlZCBpbgotCSAqIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuSlBUVG9vbHMjdHlwZUlzUGVyc2lzdGFibGUob3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkpQVFRvb2xzLlR5cGVBZGFwdGVyKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEludGVybmFsQW5ub3RhdGVkU291cmNlSmF2YVJlc291cmNlVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPih0aGlzLmdldEludGVybmFsU291cmNlSmF2YVJlc291cmNlVHlwZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGpyYVR5cGUpIHsKLQkJCQlyZXR1cm4ganJhVHlwZS5pc0Fubm90YXRlZCgpOyAgLy8gaS5lLiB0aGUgdHlwZSBoYXMgYSB2YWxpZCB0eXBlIGFubm90YXRpb24KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gb25seSB0aGUgbmFtZXMgb2YgdGhvc2UgdmFsaWQgPGVtPm1hcHBlZDwvZW0+IChpLmUuIGFubm90YXRlZCB3aXRoCi0JICogPGNvZGU+QEVudGl0eTwvY29kZT4sIDxjb2RlPkBFbWJlZGRhYmxlPC9jb2RlPiwgZXRjLikgSmF2YSByZXNvdXJjZQotCSAqIHBlcnNpc3RlbnQgdHlwZXMgdGhhdCBhcmUgZGlyZWN0bHkgcGFydCBvZiB0aGUgSlBBIHByb2plY3QsIGlnbm9yaW5nCi0JICogdGhvc2UgaW4gSkFScyByZWZlcmVuY2VkIGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uCi0JICovCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TWFwcGVkSmF2YVNvdXJjZUNsYXNzTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUsIFN0cmluZz4odGhpcy5nZXRJbnRlcm5hbE1hcHBlZFNvdXJjZUphdmFSZXNvdXJjZVR5cGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGpyYVR5cGUpIHsKLQkJCQlyZXR1cm4ganJhVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhvc2UgdmFsaWQgPGVtPm1hcHBlZDwvZW0+IChpLmUuIGFubm90YXRlZCB3aXRoCi0JICogPGNvZGU+QEVudGl0eTwvY29kZT4sIDxjb2RlPkBFbWJlZGRhYmxlPC9jb2RlPiwgZXRjLikgSmF2YSByZXNvdXJjZQotCSAqIHBlcnNpc3RlbnQgdHlwZXMgdGhhdCBhcmUgZGlyZWN0bHkgcGFydCBvZiB0aGUgSlBBIHByb2plY3QsIGlnbm9yaW5nCi0JICogdGhvc2UgaW4gSkFScyByZWZlcmVuY2VkIGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0SW50ZXJuYWxNYXBwZWRTb3VyY2VKYXZhUmVzb3VyY2VUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+KHRoaXMuZ2V0SW50ZXJuYWxBbm5vdGF0ZWRTb3VyY2VKYXZhUmVzb3VyY2VUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhVHlwZSkgewotCQkJCXJldHVybiBqcmFUeXBlLmlzQW5ub3RhdGVkV2l0aChnZXRUeXBlTWFwcGluZ0Fubm90YXRpb25zKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVNYXBwaW5nQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uLCBTdHJpbmc+KGdldEpwYVBsYXRmb3JtKCkuZ2V0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIG8pIHsKLQkJCQlyZXR1cm4gby5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBvbmx5IHRob3NlIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlcyB0aGF0IGFyZSBkaXJlY3RseQotCSAqIHBhcnQgb2YgdGhlIEpQQSBwcm9qZWN0LCBpZ25vcmluZyB0aG9zZSBpbiBKQVJzIHJlZmVyZW5jZWQgaW4KLQkgKiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0SW50ZXJuYWxTb3VyY2VKYXZhUmVzb3VyY2VUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+KHRoaXMuZ2V0SW50ZXJuYWxTb3VyY2VKYXZhUmVzb3VyY2VUeXBlTGlzdHMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIG9ubHkgdGhvc2UgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzIHRoYXQgYXJlIGRpcmVjdGx5Ci0JICogcGFydCBvZiB0aGUgSlBBIHByb2plY3QsIGlnbm9yaW5nIHRob3NlIGluIEpBUnMgcmVmZXJlbmNlZCBpbgotCSAqIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPj4gZ2V0SW50ZXJuYWxTb3VyY2VKYXZhUmVzb3VyY2VUeXBlTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQsIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4+KHRoaXMuZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gdHJhbnNmb3JtKGZpbmFsIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQpIHsKLQkJCQlyZXR1cm4gY29tcGlsYXRpb25Vbml0LmdldFR5cGVzKCk7ICAvLyAqYWxsKiB0aGUgdHlwZXMgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdHMuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdD4gZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SnBhRmlsZSwgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0Pih0aGlzLmdldEphdmFTb3VyY2VKcGFGaWxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgdHJhbnNmb3JtKEpwYUZpbGUganBhRmlsZSkgewotCQkJCXJldHVybiAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwcm9qZWN0J3MgSlBBIGZpbGVzIHdpdGggSmF2YSBzb3VyY2UgPGVtPmNvbnRlbnQ8L2VtPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SnBhRmlsZT4gZ2V0SmF2YVNvdXJjZUpwYUZpbGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlcyhKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlIGxvb2stdXAgKioqKioqKioqKgotCi0JcHVibGljIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBqcmFUeXBlIDogdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlcygpKSB7Ci0JCQlpZiAoanJhVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgewotCQkJCXJldHVybiBqcmFUeXBlOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGRvbid0IGhhdmUgYSB0eXBlIGFscmVhZHksIHRyeSB0byBidWlsZCBuZXcgb25lIGZyb20gdGhlIHByb2plY3QgY2xhc3NwYXRoCi0JCXJldHVybiB0aGlzLmJ1aWxkRXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlKHR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoU3RyaW5nIHR5cGVOYW1lLCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUuS2luZCBraW5kKSB7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBnZXRKYXZhUmVzb3VyY2VUeXBlKHR5cGVOYW1lKTsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsIHx8IHJlc291cmNlVHlwZS5nZXRLaW5kKCkgIT0ga2luZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlVHlwZTsKLQl9Ci0KLQotCS8qKgotCSAqIHJldHVybiAqYWxsKiB0aGUgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzLCBpbmNsdWRpbmcgdGhvc2UgaW4gSkFScyByZWZlcmVuY2VkIGluCi0JICogcGVyc2lzdGVuY2UueG1sCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0SmF2YVJlc291cmNlVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPih0aGlzLmdldEphdmFSZXNvdXJjZVR5cGVTZXRzKCkpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiAqYWxsKiB0aGUgSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHR5cGVzLCBpbmNsdWRpbmcgdGhvc2UgaW4gSkFScyByZWZlcmVuY2VkIGluCi0JICogcGVyc2lzdGVuY2UueG1sCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4+IGdldEphdmFSZXNvdXJjZVR5cGVTZXRzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlTm9kZS5Sb290LCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+Pih0aGlzLmdldEphdmFSZXNvdXJjZU5vZGVSb290cygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IHRyYW5zZm9ybShmaW5hbCBKYXZhUmVzb3VyY2VOb2RlLlJvb3Qgcm9vdCkgewotCQkJCXJldHVybiByb290LmdldFR5cGVzKCk7ICAvLyAqYWxsKiB0aGUgdHlwZXMgaGVsZCBieSB0aGUgcm9vdAotCQkJfQotCQl9OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VOb2RlLlJvb3Q+IGdldEphdmFSZXNvdXJjZU5vZGVSb290cygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxKYXZhUmVzb3VyY2VOb2RlLlJvb3Q+KAotCQkJCQl0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpLAotCQkJCQl0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdHMoKSwKLQkJCQkJdGhpcy5nZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSwKLQkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uKHRoaXMuZXh0ZXJuYWxKYXZhUmVzb3VyY2VUeXBlQ2FjaGUpCi0JCQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSByZXNvdXJjZSBwZXJzaXN0ZW50IHBhY2thZ2UgbG9vay11cCAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVJlc291cmNlUGFja2FnZSBnZXRKYXZhUmVzb3VyY2VQYWNrYWdlKFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZVBhY2thZ2UganJwIDogdGhpcy5nZXRKYXZhUmVzb3VyY2VQYWNrYWdlcygpKSB7Ci0JCQlpZiAoanJwLmdldE5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGpycDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZT4gZ2V0SmF2YVJlc291cmNlUGFja2FnZXMoKXsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VQYWNrYWdlPigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKcGFGaWxlLCBKYXZhUmVzb3VyY2VQYWNrYWdlPih0aGlzLmdldFBhY2thZ2VJbmZvU291cmNlSnBhRmlsZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlIHRyYW5zZm9ybShKcGFGaWxlIGpwYUZpbGUpIHsKLQkJCQkJcmV0dXJuICgoSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQpIGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpKS5nZXRQYWNrYWdlKCk7Ci0JCQkJfQotCQkJfSkKLQkJCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZVBhY2thZ2UgcGFja2FnZUluZm8pIHsKLQkJCQlyZXR1cm4gcGFja2FnZUluZm8gIT0gbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gSlBBIGZpbGVzIHdpdGggcGFja2FnZS1pbmZvIHNvdXJjZSAiY29udGVudCIKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SnBhRmlsZT4gZ2V0UGFja2FnZUluZm9Tb3VyY2VKcGFGaWxlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmlsZXMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSkFScyAqKioqKioqKioqCi0KLQkvLyBUT0RPCi0JcHVibGljIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdChTdHJpbmcgamFyRmlsZU5hbWUpIHsKLS8vCQlyZXR1cm4gdGhpcy5nZXRKYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5jb252ZXJ0VG9QbGF0Zm9ybUZpbGUoamFyRmlsZU5hbWUpKTsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCh0aGlzLmdldFByb2plY3QoKS5nZXRGaWxlKGphckZpbGVOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdChJRmlsZSBqYXJGaWxlKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgOiB0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdHMoKSkgewotCQkJaWYgKHBmci5nZXRGaWxlKCkuZXF1YWxzKGphckZpbGUpKSB7Ci0JCQkJcmV0dXJuIHBmcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0SW50ZXJuYWxKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEpwYUZpbGUsIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q+KHRoaXMuZ2V0SmFySnBhRmlsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCB0cmFuc2Zvcm0oSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gSlBBIGZpbGVzIHdpdGggSkFSICJjb250ZW50IgotCSAqLwotCXB1YmxpYyBJdGVyYWJsZTxKcGFGaWxlPiBnZXRKYXJKcGFGaWxlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmlsZXMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+IGdldEdlbmVyYXRlZE1ldGFtb2RlbFRvcExldmVsVHlwZXMoKSB7Ci0JCWlmICh0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQlmaW5hbCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZW5Tb3VyY2VGb2xkZXIgPSB0aGlzLmdldE1ldGFtb2RlbFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU+KHRoaXMuZ2V0SW50ZXJuYWxTb3VyY2VKYXZhUmVzb3VyY2VUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhdCkgewotCQkJCXJldHVybiBNZXRhbW9kZWxUb29scy5pc0dlbmVyYXRlZE1ldGFtb2RlbFRvcExldmVsVHlwZShqcmF0LCBnZW5Tb3VyY2VGb2xkZXIpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0R2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlKElGaWxlIGZpbGUpIHsKLQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSB0aGlzLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChmaWxlKTsKLQkJaWYgKGpyY3UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7ICAvLyBobW1tLi4uCi0JCX0KLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHByaW1hcnlUeXBlID0ganJjdS5nZXRQcmltYXJ5VHlwZSgpOwotCQlpZiAocHJpbWFyeVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7ICAvLyBubyB0eXBlcyBpbiB0aGUgZmlsZQotCQl9Ci0JCXJldHVybiBNZXRhbW9kZWxUb29scy5pc0dlbmVyYXRlZE1ldGFtb2RlbFRvcExldmVsVHlwZShwcmltYXJ5VHlwZSkgPyBwcmltYXJ5VHlwZSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBnZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCkgdGhpcy5nZXRSZXNvdXJjZU1vZGVsKGZpbGUsIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZShTdHJpbmcgZm9sZGVyTmFtZSkgewotCQlpZiAodGhpcy5zZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lXyhmb2xkZXJOYW1lKSkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5zZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKHRoaXMucHJvamVjdCwgZm9sZGVyTmFtZSk7Ci0JCQlpZiAoZm9sZGVyTmFtZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5kaXNwb3NlTWV0YW1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuaW5pdGlhbGl6ZU1ldGFtb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZV8oU3RyaW5nIGZvbGRlck5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZTsKLQkJdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lID0gZm9sZGVyTmFtZTsKLQkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNRVRBTU9ERUxfU09VUkNFX0ZPTERFUl9OQU1FX1BST1BFUlRZLCBvbGQsIGZvbGRlck5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZXRhbW9kZWwoKSB7Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQkoKEpwYVJvb3RDb250ZXh0Tm9kZTJfMCkgdGhpcy5yb290Q29udGV4dE5vZGUpLmluaXRpYWxpemVNZXRhbW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN5bmNocm9uaXplIHRoZSBtZXRhbW9kZWwgZm9yIDIuMC1jb21wYXRpYmxlIEpQQSBwcm9qZWN0cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbCgpIHsKLQkJaWYgKHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkpIHsKLQkJCWlmICh0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUgIT0gbnVsbCkgewotCQkJCSgoSnBhUm9vdENvbnRleHROb2RlMl8wKSB0aGlzLnJvb3RDb250ZXh0Tm9kZSkuc3luY2hyb25pemVNZXRhbW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2VNZXRhbW9kZWwoKSB7Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQkoKEpwYVJvb3RDb250ZXh0Tm9kZTJfMCkgdGhpcy5yb290Q29udGV4dE5vZGUpLmRpc3Bvc2VNZXRhbW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRNZXRhbW9kZWxQYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3QodGhpcy5nZXRNZXRhTW9kZWxTb3VyY2VGb2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElGb2xkZXIgZ2V0TWV0YU1vZGVsU291cmNlRm9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKHRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIG1ldGFtb2RlbCBzb3VyY2UgZm9sZGVyIGlzIG5vIGxvbmdlciBhIEphdmEgcHJvamVjdCBzb3VyY2UKLQkgKiBmb2xkZXIsIGNsZWFyIGl0IG91dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja01ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKSB7Ci0JCWlmICh0aGlzLm1ldGFtb2RlbFNvdXJlRm9sZGVyTmFtZUlzSW52YWxpZCgpKSB7Ci0JCQl0aGlzLnNldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhbW9kZWxTb3VyZUZvbGRlck5hbWVJc0ludmFsaWQoKSB7Ci0JCXJldHVybiAhIHRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZUlzVmFsaWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lSXNWYWxpZCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldEphdmFTb3VyY2VGb2xkZXJOYW1lcygpLCB0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHNvdXJjZSBmb2xkZXIgbmFtZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YVNvdXJjZUZvbGRlck5hbWVzKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVNvdXJjZUZvbGRlck5hbWVzXygpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhU291cmNlRm9sZGVyTmFtZXNfKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdCwgU3RyaW5nPih0aGlzLmdldEphdmFTb3VyY2VGb2xkZXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHRoaXMudHJhbnNmb3JtXyhwZnIpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJCQlyZXR1cm4gIkVycm9yOiAiICsgcGZyLmdldFBhdGgoKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgU3RyaW5nIHRyYW5zZm9ybV8oSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCQlyZXR1cm4gcGZyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4gZ2V0SmF2YVNvdXJjZUZvbGRlcnMoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4oCi0JCQkJdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpLAotCQkJCVNPVVJDRV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1RfRklMVEVSCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmlsdGVyPElQYWNrYWdlRnJhZ21lbnRSb290PiBTT1VSQ0VfUEFDS0FHRV9GUkFHTUVOVF9ST09UX0ZJTFRFUiA9Ci0JCW5ldyBGaWx0ZXI8SVBhY2thZ2VGcmFnbWVudFJvb3Q+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiB0aGlzLmFjY2VwdF8ocGZyKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXByaXZhdGUgYm9vbGVhbiBhY2NlcHRfKElQYWNrYWdlRnJhZ21lbnRSb290IHBmcikgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQkJcmV0dXJuIHBmci5leGlzdHMoKSAmJiAocGZyLmdldEtpbmQoKSA9PSBJUGFja2FnZUZyYWdtZW50Um9vdC5LX1NPVVJDRSk7Ci0JCQl9Ci0JCX07Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SVBhY2thZ2VGcmFnbWVudFJvb3Q+IGdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxJUGFja2FnZUZyYWdtZW50Um9vdD4odGhpcy5nZXRKYXZhUHJvamVjdCgpLmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGV2ZW50cyAqKioqKioqKioqCi0KLQkvLyBUT0RPIGhhbmRsZSBjaGFuZ2VzIHRvIGV4dGVybmFsIHByb2plY3RzCi0JcHVibGljIHZvaWQgamF2YUVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhKGV2ZW50LmdldERlbHRhKCkpOwotCX0KLQotCS8qKgotCSAqIFdlIHJlY3Vyc2UgYmFjayBoZXJlIGZyb20ge0BsaW5rICNwcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oSUphdmFFbGVtZW50RGVsdGEpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXN3aXRjaCAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgotCQkJCXRoaXMucHJvY2Vzc0phdmFNb2RlbERlbHRhKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQkJdGhpcy5wcm9jZXNzSmF2YVByb2plY3REZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QgOgotCQkJCXRoaXMucHJvY2Vzc0phdmFQYWNrYWdlRnJhZ21lbnRSb290RGVsdGEoZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVCA6Ci0JCQkJdGhpcy5wcm9jZXNzSmF2YVBhY2thZ2VGcmFnbWVudERlbHRhKGRlbHRhKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJCXRoaXMucHJvY2Vzc0phdmFDb21waWxhdGlvblVuaXREZWx0YShkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsgLy8gaWdub3JlIHRoZSBlbGVtZW50cyBpbnNpZGUgYSBjb21waWxhdGlvbiB1bml0Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJZm9yIChJSmF2YUVsZW1lbnREZWx0YSBjaGlsZCA6IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKSkgewotCQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhKGNoaWxkKTsgLy8gcmVjdXJzZQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBKYXZhIGVsZW1lbnQgZGVsdGEgaXMgZm9yIGEKLQkgKiB7QGxpbmsgSUphdmFFbGVtZW50RGVsdGEjQ0hBTkdFRCBDSEFOR0VEfQotCSAqIChhcyBvcHBvc2VkIHRvIHtAbGluayBJSmF2YUVsZW1lbnREZWx0YSNBRERFRCBBRERFRH0gb3IKLQkgKiB7QGxpbmsgSUphdmFFbGVtZW50RGVsdGEjUkVNT1ZFRCBSRU1PVkVEfSkgSmF2YSBlbGVtZW50Ci0JICogYW5kIHRoZSBzcGVjaWZpZWQgZmxhZyBpcyBzZXQuCi0JICogKFRoZSBkZWx0YSBmbGFncyBhcmUgb25seSBzaWduaWZpY2FudCBpZiB0aGUgZGVsdGEKLQkgKiB7QGxpbmsgSUphdmFFbGVtZW50RGVsdGEjZ2V0S2luZCgpIGtpbmR9IGlzCi0JICoge0BsaW5rIElKYXZhRWxlbWVudERlbHRhI0NIQU5HRUQgQ0hBTkdFRH0uKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlbHRhRmxhZ0lzU2V0KElKYXZhRWxlbWVudERlbHRhIGRlbHRhLCBpbnQgZmxhZykgewotCQlyZXR1cm4gKGRlbHRhLmdldEtpbmQoKSA9PSBJSmF2YUVsZW1lbnREZWx0YS5DSEFOR0VEKSAmJgotCQkJCUJpdFRvb2xzLmZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBmbGFnKTsKLQl9Ci0KLQkvLyAqKioqKiBtb2RlbAotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhTW9kZWxEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQkvLyBwcm9jZXNzIHRoZSBKYXZhIG1vZGVsJ3MgcHJvamVjdHMKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCX0KLQotCS8vICoqKioqIHByb2plY3QKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YVByb2plY3REZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQkvLyBwcm9jZXNzIHRoZSBKYXZhIHByb2plY3QncyBwYWNrYWdlIGZyYWdtZW50IHJvb3RzCi0JCXRoaXMucHJvY2Vzc0phdmFEZWx0YUNoaWxkcmVuKGRlbHRhKTsKLQotCQkvLyBhIGNsYXNzcGF0aCBjaGFuZ2UgY2FuIGhhdmUgcHJldHR5IGZhci1yZWFjaGluZyBlZmZlY3RzLi4uCi0JCWlmICh0aGlzLmNsYXNzcGF0aEhhc0NoYW5nZWQoZGVsdGEpKSB7Ci0JCQl0aGlzLnJlYnVpbGQoKElKYXZhUHJvamVjdCkgZGVsdGEuZ2V0RWxlbWVudCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgSmF2YSBwcm9qZWN0J3MgY2xhc3NwYXRoIGNoYW5nZWQuIFJlYnVpbGQgdGhlIEpQQSBwcm9qZWN0Ci0JICogYXMgYXBwcm9wcmlhdGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVidWlsZChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJLy8gaWYgdGhlIGNsYXNzcGF0aCBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byB1cGRhdGUgZXZlcnl0aGluZyBzaW5jZQotCQkvLyBjbGFzcyByZWZlcmVuY2VzIGNvdWxkIG5vdyBiZSByZXNvbHZlZCAob3Igbm90KSBldGMuCi0JCWlmIChqYXZhUHJvamVjdC5lcXVhbHModGhpcy5nZXRKYXZhUHJvamVjdCgpKSkgewotCQkJdGhpcy5yZW1vdmVEZWFkSnBhRmlsZXMoKTsKLQkJCXRoaXMuY2hlY2tNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKCk7Ci0JCQl0aGlzLnN5bmNocm9uaXplV2l0aEphdmFTb3VyY2UodGhpcy5nZXRJbnRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBUT0RPIHNlZSBpZiBjaGFuZ2VkIHByb2plY3QgaXMgb24gb3VyIGNsYXNzcGF0aD8KLQkJCXRoaXMuc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSh0aGlzLmdldEV4dGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIExvb3AgdGhyb3VnaCBhbGwgb3VyIEpQQSBmaWxlcywgcmVtb3ZlIGFueSB0aGF0IGFyZSBubyBsb25nZXIgb24gdGhlCi0JICogY2xhc3NwYXRoLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZURlYWRKcGFGaWxlcygpIHsKLQkJZm9yIChKcGFGaWxlIGpwYUZpbGUgOiB0aGlzLmdldEpwYUZpbGVzKCkpIHsKLQkJCWlmICh0aGlzLmpwYUZpbGVJc0RlYWQoanBhRmlsZSkpIHsKLQkJCQl0aGlzLnJlbW92ZUpwYUZpbGUoanBhRmlsZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBqcGFGaWxlSXNEZWFkKEpwYUZpbGUganBhRmlsZSkgewotCQlyZXR1cm4gISB0aGlzLmpwYUZpbGVJc0FsaXZlKGpwYUZpbGUpOwotCX0KLQotCS8qKgotCSAqIFNvbWV0aW1lcyAoZS5nLiBkdXJpbmcgdGVzdHMpLCB3aGVuIGEgcHJvamVjdCBoYXMgYmVlbiBkZWxldGVkLCB3ZSBnZXQgYQotCSAqIEphdmEgY2hhbmdlIGV2ZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBKYXZhIHByb2plY3QgaXMgQ0hBTkdFRCAoYXMKLQkgKiBvcHBvc2VkIHRvIFJFTU9WRUQsIHdoaWNoIGlzIHdoYXQgdHlwaWNhbGx5IGhhcHBlbnMpLiBUaGUgZXZlbnQncyBkZWx0YQotCSAqIGluZGljYXRlcyB0aGF0IGV2ZXJ5dGhpbmcgaW4gdGhlIEphdmEgcHJvamVjdCBoYXMgYmVlbiBkZWxldGVkIGFuZCB0aGUKLQkgKiBjbGFzc3BhdGggaGFzIGNoYW5nZWQuIEFsbCBlbnRyaWVzIGluIHRoZSBjbGFzc3BhdGggaGF2ZSBiZWVuIHJlbW92ZWQ7Ci0JICogYnV0IHNpbmdsZSBlbnRyeSBmb3IgdGhlIEphdmEgcHJvamVjdCdzIHJvb3QgZm9sZGVyIGhhcyBiZWVuIGFkZGVkLiAoISkKLQkgKiBUaGlzIG1lYW5zIGFueSBmaWxlIGluIHRoZSBwcm9qZWN0IGlzIG9uIHRoZSBKYXZhIHByb2plY3QncyBjbGFzc3BhdGguCi0JICogVGhpcyBjbGFzc3BhdGggY2hhbmdlIGlzIHdoYXQgdHJpZ2dlcnMgdXMgdG8gcmVidWlsZCB0aGUgSlBBIHByb2plY3Q7IHNvCi0JICogd2UgcHV0IGFuIGV4dHJhIGNoZWNrIGhlcmUgdG8gbWFrZSBzdXJlIHRoZSBKUEEgZmlsZSdzIHJlc291cmNlIGZpbGUgaXMKLQkgKiBzdGlsbCBwcmVzZW50LgotCSAqIDxwPgotCSAqIFRoaXMgd291bGQgbm90IGJlIGEgcHJvYmxlbSBpZiBEYWxpIHJlY2VpdmVkIHRoZSByZXNvdXJjZSBjaGFuZ2UgZXZlbnQKLQkgKiA8ZW0+YmVmb3JlPC9lbT4gSkRUIGFuZCBzaW1wbHkgcmVtb3ZlZCB0aGUgSlBBIHByb2plY3Q7IGJ1dCBKRFQgcmVjZWl2ZXMKLQkgKiB0aGUgcmVzb3VyY2UgY2hhbmdlIGV2ZW50IGZpcnN0IGFuZCBjb252ZXJ0cyBpdCBpbnRvIHRoZSBwcm9ibGVtYXRpYwotCSAqIEphdmEgY2hhbmdlIGV2ZW50Li4uLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGpwYUZpbGVJc0FsaXZlKEpwYUZpbGUganBhRmlsZSkgewotCQlJRmlsZSBmaWxlID0ganBhRmlsZS5nZXRGaWxlKCk7Ci0JCWlmICghIGZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZmlsZUlzSmF2YVJlbGF0ZWQoZmlsZSkpIHsKLQkJCXJldHVybiBnZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgoZmlsZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmlsZVJlc291cmNlTG9jYXRpb25Jc1ZhbGlkKGZpbGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjoKLQkgKiBkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2xhc3NwYXRoSGFzQ2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9SRVNPTFZFRF9DTEFTU1BBVEhfQ0hBTkdFRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZShJdGVyYWJsZTxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ+IGphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IDogamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cykgewotCQkJamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0LnN5bmNocm9uaXplV2l0aEphdmFTb3VyY2UoKTsKLQkJfQotCX0KLQotCS8vICoqKioqIHBhY2thZ2UgZnJhZ21lbnQgcm9vdAotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50Um9vdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCS8vIHByb2Nlc3MgdGhlIEphdmEgcGFja2FnZSBmcmFnbWVudCByb290J3MgcGFja2FnZSBmcmFnbWVudHMKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCi0JCWlmICh0aGlzLmNsYXNzcGF0aEVudHJ5SGFzQmVlbkFkZGVkKGRlbHRhKSkgewotCQkJLy8gVE9ETyBidWcgMjc3MjE4Ci0JCX0gZWxzZSBpZiAodGhpcy5jbGFzc3BhdGhFbnRyeUhhc0JlZW5SZW1vdmVkKGRlbHRhKSkgeyAgLy8gc2hvdWxkIGJlIG11dHVhbGx5LWV4Y2x1c2l2ZSB3L2FkZGVkICg/KQotCQkJLy8gVE9ETyBidWcgMjc3MjE4Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOgotCSAqIGRlbHRhLmdldEVsZW1lbnQoKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjbGFzc3BhdGhFbnRyeUhhc0JlZW5BZGRlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlyZXR1cm4gdGhpcy5kZWx0YUZsYWdJc1NldChkZWx0YSwgSUphdmFFbGVtZW50RGVsdGEuRl9BRERFRF9UT19DTEFTU1BBVEgpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246Ci0JICogZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNsYXNzcGF0aEVudHJ5SGFzQmVlblJlbW92ZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJcmV0dXJuIHRoaXMuZGVsdGFGbGFnSXNTZXQoZGVsdGEsIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCk7Ci0JfQotCi0JLy8gKioqKiogcGFja2FnZSBmcmFnbWVudAotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKYXZhUGFja2FnZUZyYWdtZW50RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gcHJvY2VzcyB0aGUgamF2YSBwYWNrYWdlIGZyYWdtZW50J3MgY29tcGlsYXRpb24gdW5pdHMKLQkJdGhpcy5wcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCX0KLQotCS8vICoqKioqIGNvbXBpbGF0aW9uIHVuaXQKLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSmF2YUNvbXBpbGF0aW9uVW5pdERlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWlmICh0aGlzLmphdmFDb21waWxhdGlvblVuaXREZWx0YUlzUmVsZXZhbnQoZGVsdGEpKSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IChJQ29tcGlsYXRpb25Vbml0KSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRDb21iaW5lZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgewotCQkJCWlmIChqcmN1LmdldENvbXBpbGF0aW9uVW5pdCgpLmVxdWFscyhjb21waWxhdGlvblVuaXQpKSB7Ci0JCQkJCWpyY3Uuc3luY2hyb25pemVXaXRoSmF2YVNvdXJjZSgpOwotCQkJCQkvLyBUT0RPID8gdGhpcy5yZXNvbHZlSmF2YVR5cGVzKCk7ICAvLyBtaWdodCBoYXZlIG5ldyBtZW1iZXIgdHlwZXMgbm93Li4uCi0JCQkJCWJyZWFrOyAgLy8gdGhlcmUgKnNob3VsZG4ndCogYmUgYW55IG1vcmUuLi4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWdub3JlIHRoZSBqYXZhIGNvbXBpbGF0aW9uIHVuaXQncyBjaGlsZHJlbgotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGphdmFDb21waWxhdGlvblVuaXREZWx0YUlzUmVsZXZhbnQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJLy8gaWdub3JlIGNoYW5nZXMgdG8vZnJvbSBwcmltYXJ5IHdvcmtpbmcgY29weSAtIG5vIGNvbnRlbnQgaGFzIGNoYW5nZWQ7Ci0JCS8vIGFuZCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG90aGVyIGZsYWdzIHNldCB0aGF0IGluZGljYXRlICpib3RoKiBhCi0JCS8vIGNoYW5nZSB0by9mcm9tIHByaW1hcnkgd29ya2luZyBjb3B5ICphbmQqIGNvbnRlbnQgaGFzIGNoYW5nZWQKLQkJaWYgKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGlnbm9yZSBqYXZhIG5vdGlmaWNhdGlvbiBmb3IgQURERUQgb3IgUkVNT1ZFRDsKLQkJLy8gdGhlc2UgYXJlIGhhbmRsZWQgdmlhIHJlc291cmNlIG5vdGlmaWNhdGlvbgotCQlyZXR1cm4gZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPElNZXNzYWdlPiBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUxpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxJTWVzc2FnZT4oKTsKLQkJdGhpcy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlyZXR1cm4gbmV3IFNuYXBzaG90Q2xvbmVJdGVyYWJsZTxJTWVzc2FnZT4obWVzc2FnZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy52YWxpZGF0ZUxpYnJhcnlQcm92aWRlcihtZXNzYWdlcyk7Ci0JCXRoaXMudmFsaWRhdGVDb25uZWN0aW9uKG1lc3NhZ2VzKTsKLQkJdGhpcy5yb290Q29udGV4dE5vZGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxpYnJhcnlQcm92aWRlcihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQl0cnkgewotCQkJdGhpcy52YWxpZGF0ZUxpYnJhcnlQcm92aWRlcl8obWVzc2FnZXMpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUxpYnJhcnlQcm92aWRlcl8oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBlbmFibGVtZW50VmFyaWFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCWVuYWJsZW1lbnRWYXJpYWJsZXMucHV0KEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuSlBBX1BMQVRGT1JNX0VOQUJMRU1FTlRfRVhQLCBnZXRKcGFQbGF0Zm9ybSgpLmdldElkKCkpOwotCQllbmFibGVtZW50VmFyaWFibGVzLnB1dChKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLkpQQV9QTEFURk9STV9ERVNDUklQVElPTl9FTkFCTEVNRU5UX0VYUCwgZ2V0SnBhUGxhdGZvcm0oKS5nZXREZXNjcmlwdGlvbigpKTsKLQotCQlJTGlicmFyeVByb3ZpZGVyIGxpYnJhcnlQcm92aWRlciA9IExpYnJhcnlQcm92aWRlckZyYW1ld29yay5nZXRDdXJyZW50UHJvdmlkZXIoZ2V0UHJvamVjdCgpLCBKcGFGYWNldC5GQUNFVCk7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShnZXRQcm9qZWN0KCkpOwotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmYWNldFZlcnNpb24gPSBmYWNldGVkUHJvamVjdC5nZXRJbnN0YWxsZWRWZXJzaW9uKEpwYUZhY2V0LkZBQ0VUKTsKLQkJaWYgKCAhIGxpYnJhcnlQcm92aWRlci5pc0VuYWJsZWRGb3IoZmFjZXRlZFByb2plY3QsIGZhY2V0VmVyc2lvbiwgZW5hYmxlbWVudFZhcmlhYmxlcykpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSLAotCQkJCQl0aGlzCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ29ubmVjdGlvbihMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlTdHJpbmcgY3BOYW1lID0gdGhpcy5kYXRhU291cmNlLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShjcE5hbWUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTk9fQ09OTkVDVElPTiwKLQkJCQkJdGhpcwotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNwID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJPSkVDVF9JTlZBTElEX0NPTk5FQ1RJT04sCi0JCQkJCW5ldyBTdHJpbmdbXSB7Y3BOYW1lfSwKLQkJCQkJdGhpcwotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGNwLmlzSW5hY3RpdmUoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04sCi0JCQkJCW5ldyBTdHJpbmdbXSB7Y3BOYW1lfSwKLQkJCQkJdGhpcwotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzcG9zZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmNvbnRleHRNb2RlbFN5bmNocm9uaXplci5zdG9wKCk7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnN0b3AoKTsKLQkJdGhpcy51cGRhdGVTeW5jaHJvbml6ZXIucmVtb3ZlTGlzdGVuZXIodGhpcy51cGRhdGVTeW5jaHJvbml6ZXJMaXN0ZW5lcik7Ci0JCXRoaXMuZGF0YVNvdXJjZS5kaXNwb3NlKCk7Ci0JCS8vIHRoZSBYTUwgcmVzb3VyY2VzIGFyZSBoZWxkIGluZGVmaW5pdGVseSBieSB0aGUgV1RQIHRyYW5zbGF0b3IgZnJhbWV3b3JrLAotCQkvLyBzbyB3ZSBiZXR0ZXIgcmVtb3ZlIG91ciBsaXN0ZW5lciBvciB0aGUgSlBBIHByb2plY3Qgd2lsbCBub3QgYmUgR0NlZAotCQlmb3IgKEpwYUZpbGUganBhRmlsZSA6IHRoaXMuZ2V0SnBhRmlsZXMoKSkgewotCQkJanBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCkucmVtb3ZlUmVzb3VyY2VNb2RlbExpc3RlbmVyKHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSBtb2RlbCBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGJ1aWxkUmVzb3VyY2VNb2RlbExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGVmYXVsdFJlc291cmNlTW9kZWxMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lcgotCXsKLQkJcHJvdGVjdGVkIERlZmF1bHRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbENoYW5nZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKSB7Ci0vLwkJCVN0cmluZyBtc2cgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpICsgIiByZXNvdXJjZSBtb2RlbCBjaGFuZ2U6ICIgKyBqcGFSZXNvdXJjZU1vZGVsOwotLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4obXNnKTsKLS8vCQkJbmV3IEV4Y2VwdGlvbihtc2cpLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKLQkJCUFic3RyYWN0SnBhUHJvamVjdC50aGlzLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKGpwYVJlc291cmNlTW9kZWwpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VNb2RlbFJldmVydGVkKEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoKEpwYVhtbFJlc291cmNlKWpwYVJlc291cmNlTW9kZWwpOwotCQkJQWJzdHJhY3RKcGFQcm9qZWN0LnRoaXMucmVtb3ZlSnBhRmlsZShmaWxlKTsKLQkJCUFic3RyYWN0SnBhUHJvamVjdC50aGlzLmFkZEpwYUZpbGUoZmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNvdXJjZU1vZGVsVW5sb2FkZWQoSnB0UmVzb3VyY2VNb2RlbCBqcGFSZXNvdXJjZU1vZGVsKSB7Ci0JCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZSgoSnBhWG1sUmVzb3VyY2UpanBhUmVzb3VyY2VNb2RlbCk7Ci0JCQlBYnN0cmFjdEpwYVByb2plY3QudGhpcy5yZW1vdmVKcGFGaWxlKGZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY2hyb25pemVDb250ZXh0TW9kZWwoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEpwdFJlc291cmNlTW9kZWwganBhUmVzb3VyY2VNb2RlbCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGV2ZW50cyAqKioqKioqKioqCi0KLQkvLyBUT0RPIG5lZWQgdG8gZG8gdGhlIHNhbWUgdGhpbmcgZm9yIGV4dGVybmFsIHByb2plY3RzIGFuZCBjb21waWxhdGlvbiB1bml0cwotCXB1YmxpYyB2b2lkIHByb2plY3RDaGFuZ2VkKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWlmIChkZWx0YS5nZXRSZXNvdXJjZSgpLmVxdWFscyh0aGlzLmdldFByb2plY3QoKSkpIHsKLQkJCXRoaXMuaW50ZXJuYWxQcm9qZWN0Q2hhbmdlZChkZWx0YSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4dGVybmFsUHJvamVjdENoYW5nZWQoZGVsdGEpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxQcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCXRoaXMuc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKFN5bmNocm9uaXplci5OdWxsLmluc3RhbmNlKCkpOwotCQkJdGhpcy5zZXRVcGRhdGVTeW5jaHJvbml6ZXIoQ2FsbGJhY2tTeW5jaHJvbml6ZXIuTnVsbC5pbnN0YW5jZSgpKTsKLQkJfQotCQlSZXNvdXJjZURlbHRhVmlzaXRvciByZXNvdXJjZURlbHRhVmlzaXRvciA9IHRoaXMuYnVpbGRJbnRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yKCk7Ci0JCXJlc291cmNlRGVsdGFWaXNpdG9yLnZpc2l0RGVsdGEoZGVsdGEpOwotCQkvLyBhdCB0aGlzIHBvaW50LCBpZiB3ZSBoYXZlIGFkZGVkIGFuZC9vciByZW1vdmVkIEpwYUZpbGVzLCBhbiAidXBkYXRlIiB3aWxsIGhhdmUgYmVlbiB0cmlnZ2VyZWQ7Ci0JCS8vIGFueSBjaGFuZ2VzIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBkdXJpbmcgdGhlICJyZXNvbHZlIiB3aWxsIHRyaWdnZXIgZnVydGhlciAidXBkYXRlcyI7Ci0JCS8vIHRoZXJlIHNob3VsZCBiZSBubyBuZWVkIHRvICJyZXNvbHZlIiBleHRlcm5hbCBKYXZhIHR5cGVzICh0aGV5IGNhbid0IGhhdmUgcmVmZXJlbmNlcyB0bwotCQkvLyB0aGUgaW50ZXJuYWwgSmF2YSB0eXBlcykKLQkJaWYgKHJlc291cmNlRGVsdGFWaXNpdG9yLmVuY291bnRlcmVkU2lnbmlmaWNhbnRDaGFuZ2UoKSkgewotCQkJdGhpcy5yZXNvbHZlSW50ZXJuYWxKYXZhVHlwZXMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZURlbHRhVmlzaXRvciBidWlsZEludGVybmFsUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgSW50ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yIGV4dGVuZHMgUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwcm90ZWN0ZWQgSW50ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGZpbGVDaGFuZ2VJc1NpZ25pZmljYW50KElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKLQkJCXJldHVybiBBYnN0cmFjdEpwYVByb2plY3QudGhpcy5zeW5jaHJvbml6ZUpwYUZpbGVzKGZpbGUsIGRlbHRhS2luZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCByZXNvdXJjZSBkZWx0YSB2aXNpdG9yIGNhbGxiYWNrLgotCSAqIFJldHVybiB0cnVlIGlmIGEgSnBhRmlsZSB3YXMgZWl0aGVyIGFkZGVkIG9yIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3luY2hyb25pemVKcGFGaWxlcyhJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCXN3aXRjaCAoZGVsdGFLaW5kKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQlyZXR1cm4gdGhpcy5hZGRKcGFGaWxlKGZpbGUpOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEIDoKLQkJCQlyZXR1cm4gdGhpcy5yZW1vdmVKcGFGaWxlKGZpbGUpOwotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDoKLQkJCQlyZXR1cm4gdGhpcy5jaGVja0ZvckNoYW5nZWRGaWxlQ29udGVudChmaWxlKTsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0JCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDoKLQkJCQlicmVhazsgIC8vIGlnbm9yZQotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7ICAvLyBvbmx5IHdvcnJpZWQgYWJvdXQgYWRkZWQvcmVtb3ZlZC9jaGFuZ2VkIGZpbGVzCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2hlY2tGb3JDaGFuZ2VkRmlsZUNvbnRlbnQoSUZpbGUgZmlsZSkgewotCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWlmIChqcGFGaWxlID09IG51bGwpIHsKLQkJCS8vIHRoZSBmaWxlIG1pZ2h0IGhhdmUgY2hhbmdlZCBpdHMgY29udGVudCB0byBzb21ldGhpbmcgdGhhdCB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIHRoaXMuYWRkSnBhRmlsZShmaWxlKTsKLQkJfQotCi0JCWlmIChqcGFGaWxlLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSkpKSB7Ci0JCQkvLyBjb250ZW50IGhhcyBub3QgY2hhbmdlZCAtIGlnbm9yZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gdGhlIGNvbnRlbnQgdHlwZSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIGJ1aWxkIGEgbmV3IEpQQSBmaWxlCi0JCS8vIChlLmcuIHRoZSBzY2hlbWEgb2YgYW4gb3JtLnhtbCBmaWxlIGNoYW5nZWQgZnJvbSBKUEEgdG8gRWNsaXBzZUxpbmspCi0JCXRoaXMucmVtb3ZlSnBhRmlsZShqcGFGaWxlKTsKLQkJdGhpcy5hZGRKcGFGaWxlKGZpbGUpOwotCQlyZXR1cm4gdHJ1ZTsgIC8vIGF0IHRoZSBsZWFzdCwgd2UgaGF2ZSByZW1vdmVkIGEgSlBBIGZpbGUKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNvbHZlSW50ZXJuYWxKYXZhVHlwZXMoKSB7Ci0JCWZvciAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgOiB0aGlzLmdldEludGVybmFsSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0cygpKSB7Ci0JCQlqcmN1LnJlc29sdmVUeXBlcygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZXh0ZXJuYWxQcm9qZWN0Q2hhbmdlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQlpZiAodGhpcy5nZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgoZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCVJlc291cmNlRGVsdGFWaXNpdG9yIHJlc291cmNlRGVsdGFWaXNpdG9yID0gdGhpcy5idWlsZEV4dGVybmFsUmVzb3VyY2VEZWx0YVZpc2l0b3IoKTsKLQkJCXJlc291cmNlRGVsdGFWaXNpdG9yLnZpc2l0RGVsdGEoZGVsdGEpOwotCQkJLy8gZm9yY2UgYW4gInVwZGF0ZSIgaGVyZSBzaW5jZSBhZGRpbmcgYW5kL29yIHJlbW92aW5nIGFuIGV4dGVybmFsIEphdmEgdHlwZQotCQkJLy8gd2lsbCBvbmx5IHRyaWdnZXIgYW4gInVwZGF0ZSIgaWYgdGhlICJyZXNvbHZlIiBjYXVzZXMgc29tZXRoaW5nIGluIHRoZSByZXNvdXJjZSBtb2RlbCB0byBjaGFuZ2UKLQkJCWlmIChyZXNvdXJjZURlbHRhVmlzaXRvci5lbmNvdW50ZXJlZFNpZ25pZmljYW50Q2hhbmdlKCkpIHsKLQkJCQl0aGlzLnVwZGF0ZSgpOwotCQkJCXRoaXMucmVzb2x2ZUV4dGVybmFsSmF2YVR5cGVzKCk7Ci0JCQkJdGhpcy5yZXNvbHZlSW50ZXJuYWxKYXZhVHlwZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBSZXNvdXJjZURlbHRhVmlzaXRvciBidWlsZEV4dGVybmFsUmVzb3VyY2VEZWx0YVZpc2l0b3IoKSB7Ci0JCXJldHVybiBuZXcgRXh0ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBFeHRlcm5hbFJlc291cmNlRGVsdGFWaXNpdG9yIGV4dGVuZHMgUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwcm90ZWN0ZWQgRXh0ZXJuYWxSZXNvdXJjZURlbHRhVmlzaXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGZpbGVDaGFuZ2VJc1NpZ25pZmljYW50KElGaWxlIGZpbGUsIGludCBkZWx0YUtpbmQpIHsKLQkJCXJldHVybiBBYnN0cmFjdEpwYVByb2plY3QudGhpcy5zeW5jaHJvbml6ZUV4dGVybmFsRmlsZXMoZmlsZSwgZGVsdGFLaW5kKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGV4dGVybmFsIHJlc291cmNlIGRlbHRhIHZpc2l0b3IgY2FsbGJhY2sKLQkgKiBSZXR1cm4gdHJ1ZSBpZiBhbiAiZXh0ZXJuYWwiIEphdmEgcmVzb3VyY2UgY29tcGlsYXRpb24gdW5pdAotCSAqIHdhcyBhZGRlZCBvciByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHN5bmNocm9uaXplRXh0ZXJuYWxGaWxlcyhJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKSB7Ci0JCXN3aXRjaCAoZGVsdGFLaW5kKSB7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDoKLQkJCQlyZXR1cm4gdGhpcy5leHRlcm5hbEZpbGVBZGRlZChmaWxlKTsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxGaWxlUmVtb3ZlZChmaWxlKTsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCA6Ci0JCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERURfUEhBTlRPTSA6Ci0JCQkJYnJlYWs7ICAvLyBpZ25vcmUKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRF9QSEFOVE9NIDoKLQkJCQlicmVhazsgIC8vIGlnbm9yZQotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7ICAvLyBvbmx5IHdvcnJpZWQgYWJvdXQgYWRkZWQvcmVtb3ZlZC9jaGFuZ2VkIGZpbGVzCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZXJuYWxGaWxlQWRkZWQoSUZpbGUgZmlsZSkgewotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpOwotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleHRlcm5hbEZpbGVSZW1vdmVkKElGaWxlIGZpbGUpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm1Ub29scy5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIHRoaXMucmVtb3ZlRXh0ZXJuYWxKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoZmlsZSk7Ci0JCX0KLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gdGhpcy5leHRlcm5hbEphdmFSZXNvdXJjZVR5cGVDYWNoZS5yZW1vdmVUeXBlcyhmaWxlKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzb2x2ZUV4dGVybmFsSmF2YVR5cGVzKCkgewotCQlmb3IgKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1IDogdGhpcy5nZXRFeHRlcm5hbEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdHMoKSkgewotCQkJanJjdS5yZXNvbHZlVHlwZXMoKTsKLQkJfQotCX0KLQotCS8vICoqKioqIHJlc291cmNlIGRlbHRhIHZpc2l0b3JzCi0JLyoqCi0JICogYWRkIG9yIHJlbW92ZSBhIEpQQSBmaWxlIGZvciBldmVyeSBbYXBwcm9wcmlhdGVdIGZpbGUgZW5jb3VudGVyZWQgYnkgdGhlIHZpc2l0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgUmVzb3VyY2VEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwcm90ZWN0ZWQgYm9vbGVhbiBlbmNvdW50ZXJlZFNpZ25pZmljYW50Q2hhbmdlID0gZmFsc2U7Ci0KLQkJcHJvdGVjdGVkIFJlc291cmNlRGVsdGFWaXNpdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHZpc2l0RGVsdGEoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCXRyeSB7Ci0JCQkJZGVsdGEuYWNjZXB0KHRoaXMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4gLSB3ZSBkb24ndCB0aHJvdyBhbnkgQ29yZUV4Y2VwdGlvbnMKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJSVJlc291cmNlIHJlcyA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlzd2l0Y2ggKHJlcy5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIElSZXNvdXJjZS5ST09UIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLlBST0pFQ1QgOgotCQkJCQlyZXR1cm4gdHJ1ZTsgIC8vIHZpc2l0IGNoaWxkcmVuCi0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQl0aGlzLmZpbGVDaGFuZ2VkKChJRmlsZSkgcmVzLCBkZWx0YS5nZXRLaW5kKCkpOwotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbgotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBubyBjaGlsZHJlbiAocHJvYmFibHkgc2hvdWxkbid0IGdldCBoZXJlLi4uKQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmlsZUNoYW5nZWQoSUZpbGUgZmlsZSwgaW50IGRlbHRhS2luZCkgewotCQkJaWYgKHRoaXMuZmlsZUNoYW5nZUlzU2lnbmlmaWNhbnQoZmlsZSwgZGVsdGFLaW5kKSkgewotCQkJCXRoaXMuZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBmaWxlQ2hhbmdlSXNTaWduaWZpY2FudChJRmlsZSBmaWxlLCBpbnQgZGVsdGFLaW5kKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHdoZXRoZXIgdGhlIHZpc2l0b3IgZW5jb3VudGVyZWQgc29tZSBzb3J0IG9mICJzaWduaWZpY2FudCIKLQkJICogY2hhbmdlIHdoaWxlIHRyYXZlcnNpbmcgdGhlIElSZXNvdXJjZURlbHRhCi0JCSAqIChlLmcuIGEgSlBBIGZpbGUgd2FzIGFkZGVkIG9yIHJlbW92ZWQpLgotCQkgKi8KLQkJcHJvdGVjdGVkIGJvb2xlYW4gZW5jb3VudGVyZWRTaWduaWZpY2FudENoYW5nZSgpIHsKLQkJCXJldHVybiB0aGlzLmVuY291bnRlcmVkU2lnbmlmaWNhbnRDaGFuZ2U7Ci0JCX0KLQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBwb3J0IGZvciBtb2RpZnlpbmcgZG9jdW1lbnRzIHNoYXJlZCB3aXRoIHRoZSBVSSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzZXRUaHJlYWRMb2NhbE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKENvbW1hbmRFeGVjdXRvciBjb21tYW5kRXhlY3V0b3IpIHsKLQkJdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvci5zZXQoY29tbWFuZEV4ZWN1dG9yKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbWFuZEV4ZWN1dG9yIGdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkgewotCQlyZXR1cm4gdGhpcy5tb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGhyZWFkTG9jYWxDb21tYW5kRXhlY3V0b3IgYnVpbGRNb2RpZnlTaGFyZWREb2N1bWVudENvbW1hbmRFeGVjdXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUaHJlYWRMb2NhbENvbW1hbmRFeGVjdXRvcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSBjb250ZXh0IG1vZGVsIHdpdGggcmVzb3VyY2UgbW9kZWwgKioqKioqKioqKgotCi0JcHVibGljIFN5bmNocm9uaXplciBnZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRleHRNb2RlbFN5bmNocm9uaXplcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQlpZiAoc3luY2hyb25pemVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuY29udGV4dE1vZGVsU3luY2hyb25pemVyLnN0b3AoKTsKLQkJdGhpcy5zZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJfKHN5bmNocm9uaXplcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyXyhTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyKSB7Ci0JCXRoaXMuY29udGV4dE1vZGVsU3luY2hyb25pemVyID0gc3luY2hyb25pemVyOwotCQl0aGlzLmNvbnRleHRNb2RlbFN5bmNocm9uaXplci5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIERlbGVnYXRlIHRvIHRoZSBjb250ZXh0IG1vZGVsIHN5bmNocm9uaXplciBzbyBjbGllbnRzIGNhbiBjb25maWd1cmUgaG93Ci0JICogc3luY2hyb25pemF0aW9ucyBvY2N1ci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpIHsKLQkJdGhpcy5zeW5jaHJvbml6aW5nQ29udGV4dE1vZGVsID0gdHJ1ZTsKLQkJdGhpcy5jb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIuc3luY2hyb25pemUoKTsKLQkJdGhpcy5zeW5jaHJvbml6aW5nQ29udGV4dE1vZGVsID0gZmFsc2U7Ci0KLQkJLy8gVGhlcmUgYXJlIHNvbWUgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UgbW9kZWwgdGhhdCB3aWxsIG5vdCBjaGFuZ2UKLQkJLy8gdGhlIGV4aXN0aW5nIGNvbnRleHQgbW9kZWwgYW5kIHRyaWdnZXIgYW4gdXBkYXRlIChlLmcuIGFkZGluZyBhbgotCQkvLyBARW50aXR5IGFubm90YXRpb24gd2hlbiB0aGUgSlBBIHByb2plY3QgaXMgYXV0b21hdGljYWxseQotCQkvLyBkaXNjb3ZlcmluZyBhbm5vdGF0ZWQgY2xhc3Nlcyk7IHNvIHdlIGV4cGxpY2l0bHkgZXhlY3V0ZSBhbiB1cGRhdGUKLQkJLy8gaGVyZSB0byBkaXNjb3ZlciB0aG9zZSBjaGFuZ2VzLgotCQl0aGlzLnVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgY29udGV4dCBtb2RlbCBzeW5jaHJvbml6ZXIuCi0JICovCi0JcHVibGljIElTdGF0dXMgc3luY2hyb25pemVDb250ZXh0TW9kZWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMucm9vdENvbnRleHROb2RlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVDb250ZXh0TW9kZWxBbmRXYWl0KCkgewotCQlTeW5jaHJvbml6ZXIgdGVtcCA9IHRoaXMuY29udGV4dE1vZGVsU3luY2hyb25pemVyOwotCQl0aGlzLnNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKSk7Ci0JCXRoaXMuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdGhpcy5zZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIodGVtcCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgY29udGV4dCBtb2RlbCBzeW5jaHJvbml6ZXIgKHN5bmNocm9ub3VzKSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgU3luY2hyb25pemVyIGJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBidWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kCi0JCWltcGxlbWVudHMgQ29tbWFuZAotCXsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCUFic3RyYWN0SnBhUHJvamVjdC50aGlzLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByb2plY3QgInVwZGF0ZSIgKioqKioqKioqKgotCi0JcHVibGljIENhbGxiYWNrU3luY2hyb25pemVyIGdldFVwZGF0ZVN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRlU3luY2hyb25pemVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVN5bmNocm9uaXplcihDYWxsYmFja1N5bmNocm9uaXplciBzeW5jaHJvbml6ZXIpIHsKLQkJaWYgKHN5bmNocm9uaXplciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplci5zdG9wKCk7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnJlbW92ZUxpc3RlbmVyKHRoaXMudXBkYXRlU3luY2hyb25pemVyTGlzdGVuZXIpOwotCQl0aGlzLnNldFVwZGF0ZVN5bmNocm9uaXplcl8oc3luY2hyb25pemVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcGRhdGVTeW5jaHJvbml6ZXJfKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplciA9IHN5bmNocm9uaXplcjsKLQkJdGhpcy51cGRhdGVTeW5jaHJvbml6ZXIuYWRkTGlzdGVuZXIodGhpcy51cGRhdGVTeW5jaHJvbml6ZXJMaXN0ZW5lcik7Ci0JCXRoaXMudXBkYXRlU3luY2hyb25pemVyLnN0YXJ0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKCkgewotCQlzdXBlci5zdGF0ZUNoYW5nZWQoKTsKLQkJdGhpcy51cGRhdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgSlBBIHByb2plY3QncyBzdGF0ZSBoYXMgY2hhbmdlZCwgInVwZGF0ZSIgdGhvc2UgcGFydHMgb2YgdGhlCi0JICogSlBBIHByb2plY3QgdGhhdCBhcmUgZGVwZW5kZW50IG9uIG90aGVyIHBhcnRzIG9mIHRoZSBKUEEgcHJvamVjdC4KLQkgKiA8cD4KLQkgKiBEZWxlZ2F0ZSB0byB0aGUgdXBkYXRlIHN5bmNocm9uaXplciBzbyBjbGllbnRzIGNhbiBjb25maWd1cmUgaG93Ci0JICogdXBkYXRlcyBvY2N1ci4KLQkgKiA8cD4KLQkgKiBJZ25vcmUgYW55IDxlbT51cGRhdGVzPC9lbT4gdGhhdCBvY2N1ciB3aGlsZSB3ZSBhcmUgc3luY2hyb25pemluZwotCSAqIHRoZSBjb250ZXh0IG1vZGVsIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIGJlY2F1c2Ugd2Ugd2lsbCA8ZW0+dXBkYXRlPC9lbT4KLQkgKiB0aGUgY29udGV4dCBtb2RlbCBhdCB0aGUgY29tcGxldGlvbiBvZiB0aGUgPGVtPnN5bmM8L2VtPi4gVGhpcyBpcyByZWFsbHkKLQkgKiBvbmx5IHVzZWZ1bCBmb3Igc3luY2hyb25vdXMgPGVtPnN5bmNzPC9lbT4gYW5kIDxlbT51cGRhdGVzPC9lbT47IHNpbmNlCi0JICogdGhlIGpvYiBzY2hlZHVsaW5nIHJ1bGVzIHdpbGwgcHJldmVudCB0aGUgPGVtPnN5bmM8L2VtPiBhbmQKLQkgKiA8ZW0+dXBkYXRlPC9lbT4gam9icyBmcm9tIHJ1bm5pbmcgY29uY3VycmVudGx5LgotCSAqCi0JICogQHNlZSAjdXBkYXRlQW5kV2FpdCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoICEgdGhpcy5zeW5jaHJvbml6aW5nQ29udGV4dE1vZGVsKSB7Ci0JCQl0aGlzLnVwZGF0ZVN5bmNocm9uaXplci5zeW5jaHJvbml6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHRoZSB1cGRhdGUgc3luY2hyb25pemVyLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHVwZGF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdGhpcy5yb290Q29udGV4dE5vZGUudXBkYXRlKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHVzZWQgYnkgdGhlIHVwZGF0ZSBzeW5jaHJvbml6ZXIgdG8gbm90aWZ5IHRoZSBKUEEKLQkgKiBwcm9qZWN0IHRoYXQgdGhlICJ1cGRhdGUiIGhhcyBxdWllc2NlZCAoaS5lLiB0aGUgInVwZGF0ZSIgaGFzIGNvbXBsZXRlZAotCSAqIGFuZCB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgcmVxdWVzdHMgZm9yIGZ1cnRoZXIgInVwZGF0ZXMiKS4KLQkgKi8KLSAJcHVibGljIHZvaWQgdXBkYXRlUXVpZXNjZWQoKSB7Ci0JCXRoaXMuc3luY2hyb25pemVNZXRhbW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVBbmRXYWl0KCkgewotCQlDYWxsYmFja1N5bmNocm9uaXplciB0ZW1wID0gdGhpcy51cGRhdGVTeW5jaHJvbml6ZXI7Ci0JCXRoaXMuc2V0VXBkYXRlU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplcigpKTsKLQkJdGhpcy51cGRhdGUoKTsKLQkJdGhpcy5zZXRVcGRhdGVTeW5jaHJvbml6ZXIodGVtcCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgdXBkYXRlIHN5bmNocm9uaXplciAoc3luY2hyb25vdXMpICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDYWxsYmFja1N5bmNocm9uaXplciBidWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gbmV3IENhbGxiYWNrU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBidWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kCi0JCWltcGxlbWVudHMgQ29tbWFuZAotCXsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCUFic3RyYWN0SnBhUHJvamVjdC50aGlzLnVwZGF0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGUgc3luY2hyb25pemVyIGxpc3RlbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDYWxsYmFja1N5bmNocm9uaXplci5MaXN0ZW5lciBidWlsZFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFVwZGF0ZVN5bmNocm9uaXplckxpc3RlbmVyCi0JCWltcGxlbWVudHMgQ2FsbGJhY2tTeW5jaHJvbml6ZXIuTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXphdGlvblF1aWVzY2VkKENhbGxiYWNrU3luY2hyb25pemVyIHN5bmNocm9uaXplcikgewotCQkJQWJzdHJhY3RKcGFQcm9qZWN0LnRoaXMudXBkYXRlUXVpZXNjZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0dlbmVyaWNFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTRkNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0VudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBTaW5nbGV0b24gdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIGRiIG9iamVjdCBwYXNzZWQgaW4uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIKLQlpbXBsZW1lbnRzIEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBJTlNUQU5DRQotCQkJCT0gbmV3IEdlbmVyaWNFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpOwotCi0JcHVibGljIHN0YXRpYyBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQlwcml2YXRlIEdlbmVyaWNFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgZW50aXR5TmFtZSwgVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRhYmxlLmdldElkZW50aWZpZXIoZW50aXR5TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiBjb2x1bW4uZ2V0SWRlbnRpZmllcihhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJcmV0dXJuIGZvcmVpZ25LZXkuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gY29sdW1uLmdldElkZW50aWZpZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIHRhYmxlLmdldElkZW50aWZpZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTE5M2Q4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWRRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb25EZWZpbml0aW9uc1RvKEFycmF5TGlzdDxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgQU5OT1RBVElPTl9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbltdIEFOTk9UQVRJT05fREVGSU5JVElPTlMgPSBuZXcgQW5ub3RhdGlvbkRlZmluaXRpb25bXSB7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVudGl0eUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUlkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlMb2JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyA9IG5ldyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQl9OwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhSnBxbFF1ZXJ5SGVscGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhSnBxbFF1ZXJ5SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NjQ3MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYUpwcWxRdWVyeUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGkuR2VuZXJpY01hcHBpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkFic3RyYWN0Q29udGVudEFzc2lzdFZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuQWJzdHJhY3RHcmFtbWFyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkFic3RyYWN0U2VtYW50aWNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuRGVmYXVsdENvbnRlbnRBc3Npc3RWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkRlZmF1bHRHcmFtbWFyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkRlZmF1bHRKUFFMUXVlcnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkRlZmF1bHRTZW1hbnRpY1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5KUFFMUXVlcnlDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnBhcnNlci5KUFFMR3JhbW1hcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hcHBpbmdCdWlsZGVyOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBKcGFKcHFsUXVlcnlIZWxwZXJ9IHRoYXQgcHJvdmlkZXMgc3VwcG9ydCBiYXNlZCBvbiB0aGUgSmF2YQotICogUGVyc2lzdGVuY2UgZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9uICh2ZXJzaW9uIDEuMCBhbmQgMi4wKS4KLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjEKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYUpwcWxRdWVyeUhlbHBlciBleHRlbmRzIEpwYUpwcWxRdWVyeUhlbHBlciB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0SnBhSnBxbFF1ZXJ5SGVscGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBqcHFsR3JhbW1hciBUaGUgZ3JhbW1hciB0aGF0IGRlZmluZXMgaG93IHRvIHBhcnNlIGEgSlBRTCBxdWVyeQotCSAqLwotCXB1YmxpYyBHZW5lcmljSnBhSnBxbFF1ZXJ5SGVscGVyKEpQUUxHcmFtbWFyIGpwcWxHcmFtbWFyKSB7Ci0JCXN1cGVyKGpwcWxHcmFtbWFyKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFic3RyYWN0Q29udGVudEFzc2lzdFZpc2l0b3IgYnVpbGRDb250ZW50QXNzaXN0VmlzaXRvcihKUFFMUXVlcnlDb250ZXh0IHF1ZXJ5Q29udGV4dCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRDb250ZW50QXNzaXN0VmlzaXRvcihxdWVyeUNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RHcmFtbWFyVmFsaWRhdG9yIGJ1aWxkR3JhbW1hclZhbGlkYXRvcihKUFFMUXVlcnlDb250ZXh0IHF1ZXJ5Q29udGV4dCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRHcmFtbWFyVmFsaWRhdG9yKHF1ZXJ5Q29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKUFFMUXVlcnlDb250ZXh0IGJ1aWxkSlBRTFF1ZXJ5Q29udGV4dChKUFFMR3JhbW1hciBqcHFsR3JhbW1hcikgewotCQlyZXR1cm4gbmV3IERlZmF1bHRKUFFMUXVlcnlDb250ZXh0KGpwcWxHcmFtbWFyKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNYXBwaW5nQnVpbGRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZE1hcHBpbmdCdWlsZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNNYXBwaW5nQnVpbGRlcigpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RTZW1hbnRpY1ZhbGlkYXRvciBidWlsZFNlbWFudGljVmFsaWRhdG9yKEpQUUxRdWVyeUNvbnRleHQgcXVlcnlDb250ZXh0KSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFNlbWFudGljVmFsaWRhdG9yKHF1ZXJ5Q29udGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFQbGF0Zm9ybS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMDRhMGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWRpdEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuRW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkpwdEpwYURiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnBhcnNlci5KUFFMR3JhbW1hcjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVBsYXRmb3JtCi0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybQotewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBmaW5hbCBWZXJzaW9uIGpwYVZlcnNpb247Ci0KLQlwcml2YXRlIGZpbmFsIEpwYUZhY3RvcnkganBhRmFjdG9yeTsKLQotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvblByb3ZpZGVyIGFubm90YXRpb25Qcm92aWRlcjsKLQotCXByaXZhdGUgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBwbGF0Zm9ybVByb3ZpZGVyOwotCi0JcHJpdmF0ZSBmaW5hbCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBqcGFWYXJpYXRpb247Ci0KLQlwcml2YXRlIGZpbmFsIEpQUUxHcmFtbWFyIGpwcWxHcmFtbWFyOwotCi0KLQlwdWJsaWMgR2VuZXJpY0pwYVBsYXRmb3JtKFN0cmluZyBpZCwgVmVyc2lvbiBqcGFWZXJzaW9uLCBKcGFGYWN0b3J5IGpwYUZhY3RvcnksIEFubm90YXRpb25Qcm92aWRlciBhbm5vdGF0aW9uUHJvdmlkZXIsIEpwYVBsYXRmb3JtUHJvdmlkZXIgcGxhdGZvcm1Qcm92aWRlciwgSnBhUGxhdGZvcm1WYXJpYXRpb24ganBhVmFyaWF0aW9uLCBKUFFMR3JhbW1hciBqcHFsR3JhbW1hcikgewotCQlzdXBlcigpOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMuanBhVmVyc2lvbiA9IGpwYVZlcnNpb247Ci0JCXRoaXMuanBhRmFjdG9yeSA9IGpwYUZhY3Rvcnk7Ci0JCXRoaXMuYW5ub3RhdGlvblByb3ZpZGVyID0gYW5ub3RhdGlvblByb3ZpZGVyOwotCQl0aGlzLmpwYVZhcmlhdGlvbiA9IGpwYVZhcmlhdGlvbjsKLQkJdGhpcy5wbGF0Zm9ybVByb3ZpZGVyID0gcGxhdGZvcm1Qcm92aWRlcjsKLQkJdGhpcy5qcHFsR3JhbW1hciA9IGpwcWxHcmFtbWFyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhIHN0dWZmICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQotCXB1YmxpYyBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybSh0aGlzLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmpwYVZlcnNpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgKioqKioqKioqKgotCi0JcHVibGljIEpwYUZhY3RvcnkgZ2V0SnBhRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhRmFjdG9yeTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGxhdGZvcm0gcHJvdmlkZXJzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVByb3ZpZGVyIGdldFBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvdmlkZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpQQSBmaWxlL3Jlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhRmlsZSBidWlsZEpwYUZpbGUoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGVudFR5cGUoZmlsZSk7Ci0JCXJldHVybiAoY29udGVudFR5cGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEpwYUZpbGUoanBhUHJvamVjdCwgZmlsZSwgY29udGVudFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBKcGFGaWxlIGJ1aWxkSnBhRmlsZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlKcHRSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSB0aGlzLmJ1aWxkUmVzb3VyY2VNb2RlbChqcGFQcm9qZWN0LCBmaWxlLCBjb250ZW50VHlwZSk7Ci0JCXJldHVybiAocmVzb3VyY2VNb2RlbCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmpwYUZhY3RvcnkuYnVpbGRKcGFGaWxlKGpwYVByb2plY3QsIGZpbGUsIGNvbnRlbnRUeXBlLCByZXNvdXJjZU1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0UmVzb3VyY2VNb2RlbCBidWlsZFJlc291cmNlTW9kZWwoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJRmlsZSBmaWxlLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIHByb3ZpZGVyID0gdGhpcy5nZXRSZXNvdXJjZU1vZGVsUHJvdmlkZXIoY29udGVudFR5cGUpOwotCQlyZXR1cm4gKHByb3ZpZGVyID09IG51bGwpID8gbnVsbCA6IHByb3ZpZGVyLmJ1aWxkUmVzb3VyY2VNb2RlbChqcGFQcm9qZWN0LCBmaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbnVsbCBpZiB3ZSBkb24ndCBoYXZlIGEgcHJvdmlkZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlCi0JICogKHNpbmNlIHdlIGRvbid0IGhhdmUgY29udHJvbCBvdmVyIHRoZSBwb3NzaWJsZSBjb250ZW50IHR5cGVzKS4KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGdldFJlc291cmNlTW9kZWxQcm92aWRlcihJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJZm9yIChKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgOiB0aGlzLnBsYXRmb3JtUHJvdmlkZXIuZ2V0UmVzb3VyY2VNb2RlbFByb3ZpZGVycygpKSB7Ci0JCQlpZiAoY29udGVudFR5cGUuZXF1YWxzKHByb3ZpZGVyLmdldENvbnRlbnRUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGFubm90YXRpb25zICoqKioqKioqKioKLQotCXB1YmxpYyBBbm5vdGF0aW9uUHJvdmlkZXIgZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0aW9uUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25FZGl0Rm9ybWF0dGVyIGdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCkgewotCQlyZXR1cm4gRGVmYXVsdEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtUHJvdmlkZXIuZ2V0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0U3BlY2lmaWVkSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm92aWRlci5nZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3ZpZGVyLmdldERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIHR5cGVzIGFuZCBkZWZpbml0aW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c1Jlc291cmNlVHlwZShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCWZvciAoUmVzb3VyY2VEZWZpbml0aW9uIHJlc291cmNlRGVmaW5pdGlvbiA6IHRoaXMucGxhdGZvcm1Qcm92aWRlci5nZXRSZXNvdXJjZURlZmluaXRpb25zKCkpIHsKLQkJCWlmIChyZXNvdXJjZURlZmluaXRpb24uZ2V0UmVzb3VyY2VUeXBlKCkuZXF1YWxzKHJlc291cmNlVHlwZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlRGVmaW5pdGlvbiBnZXRSZXNvdXJjZURlZmluaXRpb24oSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlmb3IgKFJlc291cmNlRGVmaW5pdGlvbiByZXNvdXJjZURlZmluaXRpb24gOiB0aGlzLnBsYXRmb3JtUHJvdmlkZXIuZ2V0UmVzb3VyY2VEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAocmVzb3VyY2VEZWZpbml0aW9uLmdldFJlc291cmNlVHlwZSgpLmVxdWFscyhyZXNvdXJjZVR5cGUpKSB7Ci0JCQkJcmV0dXJuIHJlc291cmNlRGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHJlc291cmNlIHR5cGU6ICIgKyByZXNvdXJjZVR5cGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3ZpZGVyLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoY29udGVudFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSAqKioqKioqKioqCi0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIEpwdEpwYURiUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBnZXRFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpIHsKLQkJcmV0dXJuIEdlbmVyaWNFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBnZXRKcGFWYXJpYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmpwYVZhcmlhdGlvbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSGVybWVzIGludGVncmF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKUFFMR3JhbW1hciBnZXRKcHFsR3JhbW1hcigpIHsKLQkJcmV0dXJuIGpwcWxHcmFtbWFyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExY2MxMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLkdlbmVyaWNKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnBhcnNlci5KUFFMR3JhbW1hcjFfMDsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBKUEEgcGxhdGZvcm0gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZQotICogaXQgaXMgaW5pdGlhbGl6ZWQpLgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVBsYXRmb3JtRmFjdG9yeQotCWltcGxlbWVudHMgSnBhUGxhdGZvcm1GYWN0b3J5Ci17Ci0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBHZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtKFN0cmluZyBpZCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybSgKLQkJCWlkLAotCQkJdGhpcy5idWlsZEpwYVZlcnNpb24oKSwKLQkJCW5ldyBHZW5lcmljSnBhRmFjdG9yeSgpLAotCQkJbmV3IEpwYUFubm90YXRpb25Qcm92aWRlcihHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKSwKLQkJCUdlbmVyaWNKcGFQbGF0Zm9ybVByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQl0aGlzLmJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSwKLQkJCUpQUUxHcmFtbWFyMV8wLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgSnBhUGxhdGZvcm0uVmVyc2lvbiBidWlsZEpwYVZlcnNpb24oKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVmVyc2lvbihKcGFGYWNldC5WRVJTSU9OXzFfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVZhcmlhdGlvbiBidWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQlyZXR1cm4gbmV3IEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQkJcHVibGljIFN1cHBvcnRlZCBnZXRUYWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkKCkgewotCQkJCXJldHVybiBTdXBwb3J0ZWQuTUFZQkU7Ci0JCQl9Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc0pvaW5UYWJsZU92ZXJyaWRhYmxlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXB1YmxpYyBBY2Nlc3NUeXBlW10gZ2V0U3VwcG9ydGVkQWNjZXNzVHlwZXMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQkJCXJldHVybiBHRU5FUklDX1NVUFBPUlRFRF9BQ0NFU1NfVFlQRVM7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVWZXJzaW9uIGltcGxlbWVudHMgSnBhUGxhdGZvcm0uVmVyc2lvbiB7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcganBhVmVyc2lvbjsKLQotCQlwdWJsaWMgU2ltcGxlVmVyc2lvbihTdHJpbmcganBhVmVyc2lvbikgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuanBhVmVyc2lvbiA9IGpwYVZlcnNpb247Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIGdlbmVyaWMgcGxhdGZvcm0ncyB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBKUEEgdmVyc2lvbi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCXJldHVybiB0aGlzLmdldEpwYVZlcnNpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SnBhVmVyc2lvbigpIHsKLQkJCXJldHVybiB0aGlzLmpwYVZlcnNpb247Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIG5vdywgZ2VuZXJpYyBwbGF0Zm9ybXMgYXJlIGJhY2t3YXJkLWNvbXBhdGlibGUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGVXaXRoSnBhVmVyc2lvbihTdHJpbmcgdmVyc2lvbikgewotCQkJcmV0dXJuIFZFUlNJT05fQ09NUEFSQVRPUi5jb21wYXJlKHRoaXMuanBhVmVyc2lvbiwgdmVyc2lvbikgPj0gMDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKUEEgdmVyc2lvbjogIiArIHRoaXMuZ2V0SnBhVmVyc2lvbigpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0dlbmVyaWNKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNWVmMzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRW50aXR5RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMV8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlTW9kZWxQcm92aWRlcnNUbyhBcnJheUxpc3Q8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChwcm92aWRlcnMsIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyk7Ci0JfQotCi0JLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTID0gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IHRoZSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKEVjbGlwc2VMaW5rKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBSRVNPVVJDRV9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvdXJjZURlZmluaXRpb25bXSBSRVNPVVJDRV9ERUZJTklUSU9OUyA9IG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCUdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJR2VuZXJpY09ybVhtbERlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0phclJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2M4YjBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0phclJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLQotLyoqCi0gKiBKQVIgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIEphclJlc291cmNlTW9kZWxQcm92aWRlcgotCWltcGxlbWVudHMgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphclJlc291cmNlTW9kZWxQcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogTkI6IERlc3BpdGUgdGhlIGNoZWNrIGluIEdlbmVyaWNKcGFQcm9qZWN0LmFkZEpwYUZpbGVfKElGaWxlKSwKLQkgKiB3ZSBjYW4gZ2V0IGhlcmUgYW5kCi0JICogdGhlIFBGUiB3aWxsIGJlIG51bGwgaWYgdGhlIEpBUiBpcyB1bmRlcm5lYXRoIGEgZGlyZWN0b3J5IG9uIHRoZQotCSAqIGNsYXNzcGF0aCBidXQgdGhlIEpBUiBpdHNlbGYgaXMgbm90IG9uIHRoZSBjbGFzc3BhdGguCi0JICogUmV0dXJuaW5nIG51bGwgc2hvdWxkIGJlIE9LLgotCSAqLwotCXB1YmxpYyBKcHRSZXNvdXJjZU1vZGVsIGJ1aWxkUmVzb3VyY2VNb2RlbChKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyID0gSmF2YUNvcmUuY3JlYXRlSmFyUGFja2FnZUZyYWdtZW50Um9vdEZyb20oZmlsZSk7Ci0JCXJldHVybiAocGZyID09bnVsbCkgPyBudWxsIDogbmV3IEJpbmFyeVBhY2thZ2VGcmFnbWVudFJvb3QocGZyLCBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvSmF2YVBhY2thZ2VJbmZvUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyMWRkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBKYXZhIHBhY2thZ2UtaW5mby5qYXZhIHNvdXJjZSBjb2RlCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhUGFja2FnZUluZm9SZXNvdXJjZU1vZGVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFQYWNrYWdlSW5mb1Jlc291cmNlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9QQUNLQUdFX0lORk9fQ09OVEVOVF9UWVBFOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgYnVpbGRSZXNvdXJjZU1vZGVsKEpwYVByb2plY3QganBhUHJvamVjdCwgSUZpbGUgZmlsZSkgewotCQlJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JCXRyeSB7Ci0JCQlpZiAoY29tcGlsYXRpb25Vbml0LmdldFBhY2thZ2VEZWNsYXJhdGlvbnMoKS5sZW5ndGggPiAwKXsKLQkJCQlyZXR1cm4gbmV3IFNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0KAotCQkJCQkJY29tcGlsYXRpb25Vbml0LAotCQkJCQkJanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldEFubm90YXRpb25Qcm92aWRlcigpLAotCQkJCQkJanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldEFubm90YXRpb25FZGl0Rm9ybWF0dGVyKCksCi0JCQkJCQlqcGFQcm9qZWN0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkpOwotCQkJfSAKLQkJCS8vaWdub3JlIHBhY2thZ2UtaW5mbyBwbGFjZWQgaW4gZGVmYXVsdCBwYWNrYWdlIGFzCi0JCQkvL2l0IGRvZXNuJ3QgaGF2ZSBwYWNrYWdlIGRlY2xhcmF0aW9uIGFuZCBjYW4ndCBob2xkIGFubm90YXRpb25zCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGUpOwotCQkJLy8gSWdub3JlIC0tIHByb2plY3QgaXMgaW4gYSBiYWQgc3RhdGUuIFRoaXMgd2lsbCBnZXQgcmVjYWxsZWQgaWYgbmVjZXNzYXJ5Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjQ4Zjc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0phdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotCi0vKioKLSAqIEphdmEgc291cmNlIGNvZGUKLSAqLwotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGJ1aWxkUmVzb3VyY2VNb2RlbChKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0KAotCQkJCQlKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpLAotCQkJCQlqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0QW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQkJCWpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRBbm5vdGF0aW9uRWRpdEZvcm1hdHRlcigpLAotCQkJCQlqcGFQcm9qZWN0LmdldE1vZGlmeVNoYXJlZERvY3VtZW50Q29tbWFuZEV4ZWN1dG9yKCkKLQkJCQkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvSnBhQW5ub3RhdGlvblByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjYmIyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KcGFBbm5vdGF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotCi0vKioKLSAqIERlbGVnYXRlIHRvIGFubm90YXRpb24gZGVmaW5pdGlvbiBwcm92aWRlcnMuCi0gKiBUaGUgcGxhdGZvcm0gZmFjdG9yeSB3aWxsIGJ1aWxkIGFuIGluc3RhbmNlIG9mIHRoaXMgYW5ub3RhdGlvbiBwcm92aWRlciwKLSAqIHBhc3NpbmcgaW4gdGhlIGFwcHJvcHJpYXRlIGFycmF5IG9mIGFubm90YXRpb24gZGVmaW5pdGlvbiBwcm92aWRlcnMgbmVjZXNzYXJ5Ci0gKiB0byBidWlsZCB0aGUgYW5ub3RhdGlvbnMgZm9yIHRoZSBwbGF0Zm9ybSAodmVuZG9yIGFuZC9vciB2ZXJzaW9uKS4KLSAqLwotcHVibGljIGNsYXNzIEpwYUFubm90YXRpb25Qcm92aWRlcgotCWltcGxlbWVudHMgQW5ub3RhdGlvblByb3ZpZGVyCi17Ci0JcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyPiBhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyczsKLQotCi0JcHVibGljIEpwYUFubm90YXRpb25Qcm92aWRlcihKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLi4uIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXJzKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcnMgPSBuZXcgQXJyYXlJdGVyYWJsZTxKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyPihhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVycyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHR5cGUgYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QW5ub3RhdGlvbkRlZmluaXRpb24sIFN0cmluZz4oZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLCBTdHJpbmc+KGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbikgewotCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbi5nZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiwgU3RyaW5nPihnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24pIHsKLQkJCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb24uZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEFubm90YXRpb25EZWZpbml0aW9uPiAoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLCBJdGVyYWJsZTxBbm5vdGF0aW9uRGVmaW5pdGlvbj4+KHRoaXMuYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcnMpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8QW5ub3RhdGlvbkRlZmluaXRpb24+IHRyYW5zZm9ybShKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIpIHsKLQkJCQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiAoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPj4odGhpcy5hbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVycykgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uPiB0cmFuc2Zvcm0oSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyKSB7Ci0JCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uRGVmaW5pdGlvbihhbm5vdGF0aW9uTmFtZSkuYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKS5idWlsZE51bGxBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb25EZWZpbml0aW9uKGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKSkuYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKGpkdEFubm90YXRpb24uZ2V0RWxlbWVudE5hbWUoKSkuYnVpbGRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbiwgaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXRBbm5vdGF0aW9uRGVmaW5pdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJQW5ub3RhdGlvbkRlZmluaXRpb24gYW5ub3RhdGlvbkRlZmluaXRpb24gPSB0aGlzLnNlbGVjdEFubm90YXRpb25EZWZpbml0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbkRlZmluaXRpb25zKCksIGFubm90YXRpb25OYW1lKTsKLQkJaWYgKGFubm90YXRpb25EZWZpbml0aW9uID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVuc3VwcG9ydGVkIGFubm90YXRpb246ICIgKyBhbm5vdGF0aW9uTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYW5ub3RhdGlvbkRlZmluaXRpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQlOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIGFubm90YXRpb25EZWZpbml0aW9uID0gdGhpcy5zZWxlY3ROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKHRoaXMuZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnMoKSwgYW5ub3RhdGlvbk5hbWUpOwotCQlpZiAoYW5ub3RhdGlvbkRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5zdXBwb3J0ZWQgbnNldGFibGUgYW5ub3RhdGlvbjogIiArIGFubm90YXRpb25OYW1lKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUsIGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5nZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKGFubm90YXRpb25OYW1lKS5idWlsZEFubm90YXRpb24ocGFyZW50LCBlbGVtZW50LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlyZXR1cm4gZ2V0TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbkZvckNvbnRhaW5lcihjb250YWluZXJBbm5vdGF0aW9uTmFtZSkuZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSkuZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlRWxlbWVudE5hbWUoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUpIHsKLQkJcmV0dXJuIGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24obmVzdGFibGVBbm5vdGF0aW9uTmFtZSkuZ2V0RWxlbWVudE5hbWUoKTsJCQotCX0KLQotCXByaXZhdGUgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBnZXROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uRm9yQ29udGFpbmVyKFN0cmluZyBjb250YWluZXJBbm5vdGF0aW9uTmFtZSkgewotCQlmb3IgKE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gbmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGdldE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb25zKCkpIHsKLQkJCWlmIChuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uLmdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkuZXF1YWxzKGNvbnRhaW5lckFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBuZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBzZWxlY3RBbm5vdGF0aW9uRGVmaW5pdGlvbihJdGVyYWJsZTxBbm5vdGF0aW9uRGVmaW5pdGlvbj4gYW5ub3RhdGlvbkRlZmluaXRpb25zLCBTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJZm9yIChBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotCQkJaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldEFubm90YXRpb25OYW1lKCkuZXF1YWxzKGFubm90YXRpb25OYW1lKSkgewotCQkJCXJldHVybiBhbm5vdGF0aW9uRGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBzZWxlY3ROZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uKEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24+IGFubm90YXRpb25EZWZpbml0aW9ucywgU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCWZvciAoTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBhbm5vdGF0aW9uRGVmaW5pdGlvbiA6IGFubm90YXRpb25EZWZpbml0aW9ucykgewotCQkJaWYgKGFubm90YXRpb25EZWZpbml0aW9uLmdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKS5lcXVhbHMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJcmV0dXJuIGFubm90YXRpb25EZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0pwYVBsYXRmb3JtVGVzdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KcGFQbGF0Zm9ybVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODUwNTZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0pwYVBsYXRmb3JtVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAgICAgICAgCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUubGlicHJvdi5KcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVRlc3RlciBleHRlbmRzIFByb3BlcnR5VGVzdGVyIHsKLQkKLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAoISAocHJvcGVydHkuZXF1YWxzKCJqcGFQbGF0Zm9ybSIpIHx8IHByb3BlcnR5LmVxdWFscygianBhUGxhdGZvcm1Hcm91cCIpKQotCQkJCXx8ICEgKGV4cGVjdGVkVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBwbGF0Zm9ybSA9IG51bGw7Ci0JCQotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCXBsYXRmb3JtID0gcGxhdGZvcm0oKChJUmVzb3VyY2UpIHJlY2VpdmVyKS5nZXRQcm9qZWN0KCkpOwotCQl9IAotCQllbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIElKYXZhRWxlbWVudCkgewotCQkJcGxhdGZvcm0gPSBwbGF0Zm9ybSgoKElKYXZhRWxlbWVudCkgcmVjZWl2ZXIpLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKTsKLQkJfQotCQllbHNlIGlmIChyZWNlaXZlciBpbnN0YW5jZW9mIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24pIHsKLQkJCXBsYXRmb3JtID0gKEpwYVBsYXRmb3JtRGVzY3JpcHRpb24pIHJlY2VpdmVyOwotCQl9Ci0JCWVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgewotCQkJcGxhdGZvcm0gPSAoKEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIHJlY2VpdmVyKS5nZXRKcGFQbGF0Zm9ybSgpOwotCQl9Ci0JCQotCQlpZiAocHJvcGVydHkuZXF1YWxzKCJqcGFQbGF0Zm9ybSIpKSB7Ci0JCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIG90aGVyUGxhdGZvcm0gPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKChTdHJpbmcpIGV4cGVjdGVkVmFsdWUpOwotCQkJcmV0dXJuIHBsYXRmb3JtID09IG51bGwgPyBmYWxzZSA6IHBsYXRmb3JtLmVxdWFscyhvdGhlclBsYXRmb3JtKTsKLQkJfQotCQlpZiAocHJvcGVydHkuZXF1YWxzKCJqcGFQbGF0Zm9ybUdyb3VwIikpIHsKLQkJCUpwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbiBncm91cCA9IChwbGF0Zm9ybSA9PSBudWxsKSA/IG51bGwgOiBwbGF0Zm9ybS5nZXRHcm91cCgpOwotCQkJSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIG90aGVyR3JvdXAgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtR3JvdXAoKFN0cmluZykgZXhwZWN0ZWRWYWx1ZSk7Ci0JCQlyZXR1cm4gZ3JvdXAgPT0gbnVsbCA/IGZhbHNlIDogZ3JvdXAuZXF1YWxzKG90aGVyR3JvdXApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHBsYXRmb3JtKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIChwcm9qZWN0ID09IG51bGwpIAotCQkJCT8gbnVsbCAKLQkJCQk6IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybUlkKHByb2plY3QpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KcGFUZXN0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0pwYVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDYyYjAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0pwYVRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJFQSBTeXN0ZW1zLCBJbmMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS29uc3RhbnRpbiBLb21pc3NhcmNoaWsgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKiAgICBPcmFjbGUgLSBjb3BpZWQgYW5kIG1vZGlmaWVkIGZyb20gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3RQcm9wZXJ0eVRlc3RlcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci0KLXB1YmxpYyBjbGFzcyBKcGFUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlciB7Ci0JCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJaWYgKCFwcm9wZXJ0eS5lcXVhbHMoInByb2plY3RGYWNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotICAgICAgICBpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLSAgICAgICAgCUlQcm9qZWN0IHByb2plY3QgPSAoKElKYXZhRWxlbWVudCkgcmVjZWl2ZXIpLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpOyAgICAgICAgCQotICAgICAgICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIGV4cGVjdGVkVmFsdWU7Ci0gICAgICAgICAgICAgICAgaW50IGNvbG9uID0gdmFsLmluZGV4T2YoICc6JyApOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmFjZXRJRDsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmFjZXRWZXI7Ci0gICAgICAgICAgICAgICAgaWYoIGNvbG9uID09IC0xIHx8IGNvbG9uID09IHZhbC5sZW5ndGgoKSAtIDEgKSAgewotICAgICAgICAgICAgICAgICAgICBmYWNldElEID0gdmFsOwotICAgICAgICAgICAgICAgICAgICBmYWNldFZlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmFjZXRJRCA9IHZhbC5zdWJzdHJpbmcoIDAsIGNvbG9uICk7Ci0gICAgICAgICAgICAgICAgICAgIGZhY2V0VmVyID0gdmFsLnN1YnN0cmluZyggY29sb24gKyAxICk7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgIAkKLSAgICAgICAgICAgIAl0cnkgeyAgICAgICAgICAgIAkJCi0gICAgICAgICAgICAJCXJldHVybiBGYWNldGVkUHJvamVjdEZyYW1ld29yay5oYXNQcm9qZWN0RmFjZXQoIHByb2plY3QsIGZhY2V0SUQsIGZhY2V0VmVyICk7ICAgICAgICAgICAgCQkKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gICAgIAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQkJCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9KcHRDb3JlTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0pwdENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjVlYzhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL0pwdENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgY29yZS4KLSAqLwotcHVibGljIGNsYXNzIEpwdENvcmVNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT05FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0pPQjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9QUk9KRUNUX05PVF9KUEE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUFJPSkVDVF9JTVBST1BFUl9QTEFURk9STTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9DT05UQUlORVJfUVVFU1RJT05BQkxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0ZJTEVfVkVSU0lPTl9OT1RfU1VQUE9SVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0ZJTEVfVkVSU0lPTl9OT1RfU1VQUE9SVEVEX0ZPUl9GQUNFVF9WRVJTSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfRE9FU19OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfTk9UX0lOX1BST0pFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfUExBVEZPUk1fTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9QTEFURk9STV9ET0VTX05PVF9TVVBQT1JUX0ZBQ0VUX1ZFUlNJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfTElCUkFSWV9QUk9WSURFUl9JTlZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTk5FQ1RJT05fTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9DT05ORUNUSU9OX0lOVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTk5FQ1RJT05fRE9FU05UX0NPTlRBSU5fQ0FUQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9ERUZBVUxUX1NDSEVNQV9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0NPTk5FQ1RJT05fRE9FU05UX0NPTlRBSU5fU0NIRU1BOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX1JVTlRJTUVfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxJREFURV9SVU5USU1FX0RPRVNfTk9UX1NVUFBPUlRfRUpCXzMwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZBTElEQVRFX0xJQlJBUllfTk9UX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTWU5DSFJPTklaRV9DTEFTU0VTX0pPQjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTWU5DSFJPTklaSU5HX0NMQVNTRVNfVEFTSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1BFUlNJU1RFTkNFX1hNTF9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVSUk9SX1NZTkNIUk9OSVpJTkdfQ0xBU1NFU19DT1VMRF9OT1RfVkFMSURBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVJST1JfV1JJVElOR19GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX01JU1NJTkdfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0lOVkFMSURfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUkVHSVNUUllfRFVQTElDQVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0ZBSUxFRF9DTEFTU19MT0FEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFR0lTVFJZX0ZBSUxFRF9JTlRFUkZBQ0VfQVNTSUdOTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSRUdJU1RSWV9GQUlMRURfSU5TVEFOVElBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT05URVhUX01PREVMX1NZTkNfSk9CX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVVBEQVRFX0pPQl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBMQVRGT1JNX0lEX0RPRVNfTk9UX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSRUZFUkVOQ0VTX0ZMVVNIX0pPQl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9TR0lfQlVORExFU19MSUJSQVJZX1ZBTElEQVRPUl9fQlVORExFX05PVF9GT1VORDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPU0dJX0JVTkRMRVNfTElCUkFSWV9WQUxJREFUT1JfX0lNUFJPUEVSX0JVTkRMRV9WRVJTSU9OOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcGFfY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRDb3JlTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRDb3JlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0ZTVjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9Pcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS5Pcm1YbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci0KLS8qKgotICogb3JtLnhtbAotICovCi1wdWJsaWMgY2xhc3MgT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVJlc291cmNlTW9kZWxQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1SZXNvdXJjZU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEU7Ci0JfQotCi0JcHVibGljIEpwYVhtbFJlc291cmNlIGJ1aWxkUmVzb3VyY2VNb2RlbChKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIE9ybVhtbFJlc291cmNlUHJvdmlkZXIuZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihmaWxlKS5nZXRYbWxSZXNvdXJjZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDdlNDk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLQotLyoqCi0gKiBwZXJzaXN0ZW5jZS54bWwKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEU7Ci0JfQotCi0JcHVibGljIEpwYVhtbFJlc291cmNlIGJ1aWxkUmVzb3VyY2VNb2RlbChKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VQcm92aWRlci5nZXRYbWxSZXNvdXJjZVByb3ZpZGVyKGZpbGUpLmdldFhtbFJlc291cmNlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9Qcm9qZWN0QWRhcHRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL1Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFkMmNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL1Byb2plY3RBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBbRG91YmxlLWR1dHldIGZhY3RvcnkgdG8gYnVpbGQgYWRhcHRlcnMgZm9yIGVpdGhlciBzdGFuZGFyZCBwcm9qZWN0cyBvcgotICogSmF2YSBwcm9qZWN0czoKLSAqICAgLSBKUEEgcHJvamVjdAotICogCi0gKiBTZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlIHBsdWdpbi54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9qZWN0QWRhcHRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQURBUFRFUl9MSVNUID0gbmV3IENsYXNzW10geyBKcGFQcm9qZWN0LmNsYXNzIH07Ci0KLQlwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGVPYmplY3QsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBDbGFzcyBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiB0aGlzLmdldEFkYXB0ZXIoKElQcm9qZWN0KSBhZGFwdGFibGVPYmplY3QsIGFkYXB0ZXJUeXBlKTsKLQkJfQotCQlpZiAoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJSmF2YVByb2plY3QpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0KLQlwcml2YXRlIE9iamVjdCBnZXRBZGFwdGVyKElQcm9qZWN0IHByb2plY3QsIENsYXNzIDw/PmFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGVyVHlwZSA9PSBKcGFQcm9qZWN0LmNsYXNzKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBDbGFzcyA8Pz5hZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSnBhUHJvamVjdC5jbGFzcykgewotCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdChqYXZhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL1NpbXBsZUpwYVByb2plY3RDb25maWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL1NpbXBsZUpwYVByb2plY3RDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc1MzVkNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9TaW1wbGVKcGFQcm9qZWN0Q29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuSnBhUHJvamVjdDJfMDsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEpQQSBwcm9qZWN0IGNvbmZpZy4KLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUpwYVByb2plY3RDb25maWcgaW1wbGVtZW50cyBKcGFQcm9qZWN0Ml8wLkNvbmZpZyB7Ci0JcHJvdGVjdGVkIElQcm9qZWN0IHByb2plY3Q7Ci0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtOwotCXByb3RlY3RlZCBTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgdXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2c7Ci0JcHJvdGVjdGVkIFN0cmluZyB1c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hOwotCXByb3RlY3RlZCBib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWU7Ci0KLQlwdWJsaWMgU2ltcGxlSnBhUHJvamVjdENvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gZ2V0SnBhUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpwYVBsYXRmb3JtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEpwYVBsYXRmb3JtKEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKSB7Ci0JCXRoaXMuanBhUGxhdGZvcm0gPSBqcGFQbGF0Zm9ybTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbm5lY3Rpb25Qcm9maWxlTmFtZShTdHJpbmcgY29ubmVjdGlvblByb2ZpbGVOYW1lKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lID0gY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWE7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoU3RyaW5nIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEpIHsKLQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hID0gdXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2c7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKFN0cmluZyB1c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZykgewotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nID0gdXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2c7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpIHsKLQkJcmV0dXJuIHRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlcyhib29sZWFuIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcykgewotCQl0aGlzLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyA9IGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZShTdHJpbmcgbWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSkgewotCQl0aGlzLm1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUgPSBtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMucHJvamVjdC5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdEpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SnBhQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1MDdlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Fic3RyYWN0SnBhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZQotCWV4dGVuZHMgQWJzdHJhY3RKcGFOb2RlCi0JaW1wbGVtZW50cyBKcGFDb250ZXh0Tm9kZQotewotCXByb3RlY3RlZCBBYnN0cmFjdEpwYUNvbnRleHROb2RlKEpwYU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQkvLyBOT1AKLQl9Ci0KLQkvKioKLQkgKiBjb252ZW5pZW5jZSBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jaHJvbml6ZU5vZGVzV2l0aFJlc291cmNlTW9kZWwoSXRlcmFibGU8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPiBub2RlcykgewotCQlmb3IgKEpwYUNvbnRleHROb2RlIG5vZGUgOiBub2RlcykgewotCQkJbm9kZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCS8vIE5PUAotCX0KLQotCS8qKgotCSAqIGNvbnZlbmllbmNlIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU5vZGVzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4gbm9kZXMpIHsKLQkJZm9yIChKcGFDb250ZXh0Tm9kZSBub2RlIDogbm9kZXMpIHsKLQkJCW5vZGUudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udGFpbm1lbnQgaGllcmFyY2h5ICoqKioqKioqKioKLQotCS8qKgotCSAqIGNvdmFyaWFudCBvdmVycmlkZQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gaW46PHVsPgotCSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZSNnZXRSZXNvdXJjZVR5cGUoKSBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZX0KLQkgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmFyRmlsZSNnZXRSZXNvdXJjZVR5cGUoKSBHZW5lcmljSmFyRmlsZX0KLQkgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWwjZ2V0UmVzb3VyY2VUeXBlKCkgR2VuZXJpY09ybVhtbH0KLQkgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlWG1sI2dldFJlc291cmNlVHlwZSgpIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbH0KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRSZXNvdXJjZVR5cGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiBpbjo8dWw+Ci0JICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdCNnZXRQZXJzaXN0ZW5jZVVuaXQoKSBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdH0KLQkgKiB0byByZXR1cm4gaXRzZWxmCi0JICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNSb290Q29udGV4dE5vZGUjZ2V0UGVyc2lzdGVuY2VVbml0KCkgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZX0KLQkgKiB0byByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkZGVuIGluOjx1bD4KLQkgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdEVudGl0eU1hcHBpbmdzI2dldE1hcHBpbmdGaWxlUm9vdCgpIEFic3RyYWN0RW50aXR5TWFwcGluZ3N9Ci0JICogdG8gcmV0dXJuIGl0c2VsZgotCSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5HZW5lcmljUm9vdENvbnRleHROb2RlI2dldE1hcHBpbmdGaWxlUm9vdCgpIEdlbmVyaWNSb290Q29udGV4dE5vZGV9Ci0JICogdG8gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgTWFwcGluZ0ZpbGVSb290IGdldE1hcHBpbmdGaWxlUm9vdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0TWFwcGluZ0ZpbGVSb290KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKLQotCXB1YmxpYyBTY2hlbWEgZ2V0Q29udGV4dERlZmF1bHREYlNjaGVtYSgpIHsKLQkJU2NoZW1hQ29udGFpbmVyIGRiU2NoZW1hQ29udGFpbmVyID0gdGhpcy5nZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCXJldHVybiAoZGJTY2hlbWFDb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldENvbnRleHREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKSB7Ci0JCU1hcHBpbmdGaWxlUm9vdCBtZnIgPSB0aGlzLmdldE1hcHBpbmdGaWxlUm9vdCgpOwotCQlyZXR1cm4gKG1mciAhPSBudWxsKSA/IG1mci5nZXRTY2hlbWEoKSA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4gY2F0YWxvZyksCi0JICogdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9nczsgYW5kIHdlIG5lZWQgdG8KLQkgKiBnZXQgdGhlIHNjaGVtYSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZS4KLQkgKi8KLQlwdWJsaWMgU2NoZW1hQ29udGFpbmVyIGdldENvbnRleHREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpIDogdGhpcy5nZXREYXRhYmFzZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KLQkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZyBnZXRDb250ZXh0RGVmYXVsdERiQ2F0YWxvZygpIHsKLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCkgewotCQlNYXBwaW5nRmlsZVJvb3QgbWZyID0gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKTsKLQkJcmV0dXJuIChtZnIgIT0gbnVsbCkgPyBtZnIuZ2V0Q2F0YWxvZygpIDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvQWJzdHJhY3RYbWxDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdFhtbENvbnRleHROb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzE0YjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BYnN0cmFjdFhtbENvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxDb250ZXh0Tm9kZQotCWV4dGVuZHMgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgWG1sQ29udGV4dE5vZGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxDb250ZXh0Tm9kZShKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGwgc3ViY2xhc3MgaW1wbGVtZW50YXRpb25zIHNob3VsZCBiZSBoYXZlIGEgInN1cGVyIiBjYWxsIHRvIHRoaXMgbWV0aG9kLgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgc3BlY2lmaWVkIG5vZGUgaWYgaXQgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTm9kZShYbWxDb250ZXh0Tm9kZSBub2RlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCW5vZGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgbm9kZXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOb2RlcyhJdGVyYWJsZTw/IGV4dGVuZHMgWG1sQ29udGV4dE5vZGU+IG5vZGVzLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZvciAoWG1sQ29udGV4dE5vZGUgbm9kZSA6IG5vZGVzKSB7Ci0JCQlub2RlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCB0ZXh0IHJhbmdlIGlmIGl0IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPjsgaWYgaXQgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgcmV0dXJuIHRoZSBub2RlJ3MgdmFsaWRhdGlvbiB0ZXh0IHJhbmdlLgotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvQXR0cmlidXRlTWFwcGluZ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NmNiMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIEdhdGhlciBzb21lIG9mIHRoZSBiZWhhdmlvciBjb21tb24gdG8gdGhlIEphdmEgYW5kIFhNTCBtb2RlbHMuIDotKAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0cmlidXRlTWFwcGluZ1Rvb2xzCi17Ci0KLQkvLyAqKioqKioqKioqIGFsbCBtYXBwaW5nIG5hbWVzIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4gQUxMX01BUFBJTkdfTkFNRVNfVFJBTlNGT1JNRVIgPSBuZXcgQWxsTWFwcGluZ05hbWVzVHJhbnNmb3JtZXIoKTsKLQlzdGF0aWMgY2xhc3MgQWxsTWFwcGluZ05hbWVzVHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+PgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQkJcmV0dXJuIG1hcHBpbmcuZ2V0QWxsTWFwcGluZ05hbWVzKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWxsIG92ZXJyaWRhYmxlIGF0dHJpYnV0ZSBtYXBwaW5nIG5hbWVzIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4gQUxMX09WRVJSSURBQkxFX0FUVFJJQlVURV9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSID0gbmV3IEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzVHJhbnNmb3JtZXIoKTsKLQlzdGF0aWMgY2xhc3MgQWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXNUcmFuc2Zvcm1lcgotCQlpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiB0cmFuc2Zvcm0oQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFsbCBvdmVycmlkYWJsZSBhc3NvY2lhdGlvbiBtYXBwaW5nIG5hbWVzIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4gQUxMX09WRVJSSURBQkxFX0FTU09DSUFUSU9OX01BUFBJTkdfTkFNRVNfVFJBTlNGT1JNRVIgPSBuZXcgQWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lc1RyYW5zZm9ybWVyKCk7Ci0Jc3RhdGljIGNsYXNzIEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXNUcmFuc2Zvcm1lcgotCQlpbXBsZW1lbnRzIFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiB0cmFuc2Zvcm0oQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIEF0dHJpYnV0ZU1hcHBpbmdUb29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9CYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Jhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxOGUxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0Jhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byByZXNvbHZlIHRleHQgcmFuZ2VzIG9uIGpvaW4gY29sdW1ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgZXh0ZW5kcyBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyCi17Ci0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0NvbnRleHRDb250YWluZXJUb29scy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9Db250ZXh0Q29udGFpbmVyVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjOTU4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0NvbnRleHRDb250YWluZXJUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgZm9yIG1hbmlwdWxhdGluZyBjb250ZXh0IGNvbnRhaW5lcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0Q29udGFpbmVyVG9vbHMgewotCi0JLyoqCi0JICogQWRhcHRlciB1c2VkIHRvIHN5bmNocm9uaXplIGEgY29udGV4dCBjb250YWluZXIgd2l0aCBpdHMgY29ycmVzcG9uZGluZwotCSAqIHJlc291cmNlIGNvbnRhaW5lci4KLQkgKiAKLQkgKiBAcGFyYW0gPEM+IHRoZSB0eXBlIG9mIGNvbnRleHQgZWxlbWVudHMKLQkgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIHJlc291cmNlIGVsZW1lbnRzCi0JICovCi0JcHVibGljIGludGVyZmFjZSBBZGFwdGVyPEMgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgUj4gewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIGNvbnRleHQgZWxlbWVudHMuCi0JCSAqLwotCQlJdGVyYWJsZTxDPiBnZXRDb250ZXh0RWxlbWVudHMoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBjb250YWluZXIncyBjdXJyZW50IHNldCBvZiByZXNvdXJjZSBlbGVtZW50cy4KLQkJICogVGhlc2UgYXJlIHdoYXQgdGhlIGNvbnRleHQgZWxlbWVudHMgd2lsbCBiZSBzeW5jaHJvbml6ZWQgdG8uCi0JCSAqLwotCQlJdGVyYWJsZTxSPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgZWxlbWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dAotCQkgKiBlbGVtZW50LgotCQkgKi8KLQkJUiBnZXRSZXNvdXJjZUVsZW1lbnQoQyBjb250ZXh0RWxlbWVudCk7Ci0KLQkJLyoqCi0JCSAqIE1vdmUgdGhlIHNwZWNpZmllZCBjb250ZXh0IGVsZW1lbnQgdG8gdGhlIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCXZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgQyBlbGVtZW50KTsKLQotCQkvKioKLQkJICogQWRkIGEgY29udGV4dCBlbGVtZW50IGZvciB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGVsZW1lbnQgYXQgdGhlCi0JCSAqIHNwZWNpZmllZCBpbmRleC4KLQkJICovCi0JCXZvaWQgYWRkQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBSIHJlc291cmNlRWxlbWVudCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGNvbnRleHQgZWxlbWVudCBmcm9tIHRoZSBjb250YWluZXIuCi0JCSAqLwotCQl2b2lkIHJlbW92ZUNvbnRleHRFbGVtZW50KEMgZWxlbWVudCk7Ci0JfQotCi0KLQkvKioKLQkgKiBVc2luZyB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIsIHN5bmNocm9uaXplIGEgY29udGV4dCBjb250YWluZXIgd2l0aCBpdHMKLQkgKiBjb3JyZXNwb25kaW5nIHJlc291cmNlIGNvbnRhaW5lcjogbW92aW5nLCByZW1vdmluZywgYW5kIGFkZGluZyBlbGVtZW50cwotCSAqIGFzIG5lY2Vzc2FyeS4KLQkgKiA8cD4KLQkgKiBXZSBjYW4gZG8gdGhpcyBiZWNhdXNlOjx1bD4KLQkgKiA8bGk+dGhlIFhNTCB0cmFuc2xhdG9ycyB3aWxsIDxlbT5tb3ZlPC9lbT4gdGhlIEVNRiBlbGVtZW50cyB3aGVuCi0JICogYXBwcm9wcmlhdGUgKGFzIG9wcG9zZWQgdG8gc2ltcGx5IHJlYnVpbGRpbmcgdGhlbSBpbiBwbGFjZSkuCi0JICogPGxpPnRoZSBKYXZhIHJlc291cmNlIG1vZGVsIHdpbGwgcmUtdXNlIGV4aXN0aW5nIGFubm90YXRpb25zIHdoZW4KLQkgKiBhcHByb3ByaWF0ZSAoYXMgb3Bwb3NlZCB0byBzaW1wbHkgcmVidWlsZGluZyB0aGVtIGluIHBsYWNlKS4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgPEMgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgUj4gdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKEFkYXB0ZXI8QywgUj4gYWRhcHRlcikgewotCQlzeW5jKGFkYXB0ZXIsIHRydWUpOyAgLy8gdHJ1ZSA9IHN5bmMKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICNzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKEFkYXB0ZXIpCi0JICovCi0JcHVibGljIHN0YXRpYyA8QyBleHRlbmRzIEpwYUNvbnRleHROb2RlLCBSPiB2b2lkIHVwZGF0ZShBZGFwdGVyPEMsIFI+IGFkYXB0ZXIpIHsKLQkJc3luYyhhZGFwdGVyLCBmYWxzZSk7ICAvLyBmYWxzZSA9IHVwZGF0ZQotCX0KLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgPGNvZGU+c3luYzwvY29kZT4gZmxhZyBjb250cm9scyB3aGV0aGVyIGFueSBzdXJ2aXZpbmcKLQkgKiBjb250ZXh0IG5vZGVzIGFyZSBlaXRoZXIgPGVtPnN5bmNocm9uaXplZDwvZW0+ICg8Y29kZT50cnVlPC9jb2RlPikgb3IKLQkgKiA8ZW0+dXBkYXRlZDwvZW0+ICg8Y29kZT5mYWxzZTwvY29kZT4pLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgPEMgZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZSwgUj4gdm9pZCBzeW5jKEFkYXB0ZXI8QywgUj4gYWRhcHRlciwgYm9vbGVhbiBzeW5jKSB7Ci0JCUhhc2hTZXQ8Qz4gY29udGV4dEVsZW1lbnRzID0gQ29sbGVjdGlvblRvb2xzLnNldChhZGFwdGVyLmdldENvbnRleHRFbGVtZW50cygpKTsKLQkJQXJyYXlMaXN0PEM+IGNvbnRleHRFbGVtZW50c1RvU3luYyA9IG5ldyBBcnJheUxpc3Q8Qz4oY29udGV4dEVsZW1lbnRzLnNpemUoKSk7Ci0JCWludCByZXNvdXJjZUluZGV4ID0gMDsKLQotCQlmb3IgKFIgcmVzb3VyY2VFbGVtZW50IDogYWRhcHRlci5nZXRSZXNvdXJjZUVsZW1lbnRzKCkpIHsKLQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCWZvciAoSXRlcmF0b3I8Qz4gc3RyZWFtID0gY29udGV4dEVsZW1lbnRzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCUMgY29udGV4dEVsZW1lbnQgPSBzdHJlYW0ubmV4dCgpOwotCQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChhZGFwdGVyLmdldFJlc291cmNlRWxlbWVudChjb250ZXh0RWxlbWVudCksIHJlc291cmNlRWxlbWVudCkpIHsKLQkJCQkJLy8gd2UgZG9uJ3Qga25vdyB0aGUgc291cmNlIGluZGV4IGJlY2F1c2UgdGhlIGVsZW1lbnQgaGFzIGJlZW4gbW92ZWQgYnkgcHJldmlvdXNseSBtb3ZlZCBlbGVtZW50cwotCQkJCQlhZGFwdGVyLm1vdmVDb250ZXh0RWxlbWVudChyZXNvdXJjZUluZGV4LCBjb250ZXh0RWxlbWVudCk7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJLy8gVE9ETyBwZXJmb3JtIHVwZGF0ZSBoZXJlIHNvbWVkYXkuLi4KLQkJCQkJY29udGV4dEVsZW1lbnRzVG9TeW5jLmFkZChjb250ZXh0RWxlbWVudCk7Ci0JCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCAhIG1hdGNoKSB7Ci0JCQkJLy8gYWRkZWQgZWxlbWVudHMgYXJlIHN5bmMnZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBvciB3aWxsIGJlCi0JCQkJLy8gdXBkYXRlZCBkdXJpbmcgdGhlIG5leHQgInVwZGF0ZSIgKHdoaWNoIGlzIHRyaWdnZXJlZCBieQotCQkJCS8vIHRoZWlyIGFkZGl0aW9uIHRvIHRoZSBtb2RlbCkKLQkJCQlhZGFwdGVyLmFkZENvbnRleHRFbGVtZW50KHJlc291cmNlSW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXNvdXJjZUluZGV4Kys7Ci0JCX0KLQkJLy8gcmVtb3ZlIGFueSBsZWZ0b3ZlciBjb250ZXh0IGVsZW1lbnRzCi0JCWZvciAoQyBjb250ZXh0RWxlbWVudCA6IGNvbnRleHRFbGVtZW50cykgewotCQkJYWRhcHRlci5yZW1vdmVDb250ZXh0RWxlbWVudChjb250ZXh0RWxlbWVudCk7Ci0JCX0KLQkJLy8gVE9ETyBianYKLQkJLy8gdGFrZSBjYXJlIG9mIHRoZSBzdHJ1Y3R1cmFsIGNoYW5nZXMgYmVmb3JlIHN5bmMnaW5nIHRoZSByZW1haW5pbmcgZWxlbWVudHM7Ci0JCS8vIHdlIG1pZ2h0IGJlIGFibGUgdG8gZG8gdGhpcyBpbmxpbmUgb25jZSB3ZSBnZXQgcmlkIG9mIHRoZSAibGlzdCBjaGFuZ2UiIGV2ZW50cwotCQkvLyBhbmQgZ28gd2l0aCBvbmx5IGFkZCwgcmVtb3ZlLCBldGMuIGxpc3QgZXZlbnRzCi0JCS8vICh0aGVzZSBzeW5jcyB3aWxsIHRyaWdnZXIgImxpc3QgY2hhbmdlIiBldmVudHMgd2l0aCBsaXN0IGFzcGVjdCBhZGFwdGVycywgd2hpY2gKLQkJLy8gdHJpZ2dlciByZWZyZXNoZXMgb2YgVUkgYWRhcHRlcnMgKGUuZy4gVGFibGVNb2RlbEFkYXB0ZXIpIHdoaWNoIHdpbGwgcHJlbWF0dXJlbHkKLQkJLy8gZGlzY292ZXIgYW55IHN0cnVjdHVyYWwgY2hhbmdlcy4uLiA6KCApCi0JCS8vIHNlZSBJdGVtQXNwZWN0TGlzdFZhbHVlTW9kZWxBZGFwdGVyLml0ZW1Bc3BlY3RDaGFuZ2VkKEV2ZW50T2JqZWN0KQotCQlmb3IgKEMgY29udGV4dEVsZW1lbnQgOiBjb250ZXh0RWxlbWVudHNUb1N5bmMpIHsKLQkJCWlmIChzeW5jKSB7Ci0JCQkJY29udGV4dEVsZW1lbnQuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQljb250ZXh0RWxlbWVudC51cGRhdGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ29udGV4dENvbnRhaW5lclRvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VudGl0eVRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0VudGl0eVRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjExOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9FbnRpdHlUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLQotcHVibGljIGludGVyZmFjZSBFbnRpdHlUZXh0UmFuZ2VSZXNvbHZlcgotCWV4dGVuZHMgUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyCi17Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QyMzdkYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHJlc29sdmUgdGV4dCByYW5nZXMgb24gam9pbiBjb2x1bW5zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyCi0JZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pwdFZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9KcHRWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzZWNiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L0pwdFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSnB0VmFsaWRhdG9yCi17Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNsaWVudCBzaG91bGQgY29udGludWUgdmFsaWRhdGluZy4KLQkgKi8KLQlib29sZWFuIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCi0KLQlmaW5hbCBjbGFzcyBOdWxsCi0JCWltcGxlbWVudHMgSnB0VmFsaWRhdG9yCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcHRWYWxpZGF0b3IgSU5TVEFOQ0UgPSBuZXcgTnVsbCgpOwotCQlwdWJsaWMgc3RhdGljIEpwdFZhbGlkYXRvciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCXByaXZhdGUgTnVsbCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkJcmV0dXJuIHRydWU7ICAvLyBjb250aW51ZSB2YWxpZGF0aW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRTaW5nbGV0b25Ub1N0cmluZyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvTWFwcGluZ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L01hcHBpbmdUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDkwYmNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvTWFwcGluZ1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWZlcmVuY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogR2F0aGVyIHNvbWUgb2YgdGhlIGJlaGF2aW9yIGNvbW1vbiB0byB0aGUgSmF2YSBhbmQgWE1MIG1vZGVscy4gOi0oCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBwaW5nVG9vbHMgewotCi0JLyoqCi0JICogRGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgZnJvbSB0aGUgSlBBIHNwZWM6PGJyPgotCSAqIAkiVGhlIGNvbmNhdGVuYXRlZCBuYW1lcyBvZiB0aGUgdHdvIGFzc29jaWF0ZWQgcHJpbWFyeQotCSAqIAllbnRpdHkgdGFibGVzLCBzZXBhcmF0ZWQgYnkgYSB1bmRlcnNjb3JlLiIKLQkgKiA8cHJlPgotCSAqIFtvd25pbmcgdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotCSAqIDwvcHJlPgotCSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFRoZSA8ZW0+bmFtZXM8L2VtPiBhcmUgY29uY2F0ZW5hdGVkLAotCSAqIDxlbT5ub3Q8L2VtPiB0aGUgPGVtPmlkZW50aWZpZXJzPC9lbT4uCi0JICogRS5nLiB0aGUgam9pbiB0YWJsZSBmb3IgPGNvZGU+IkZvbyI8L2NvZGU+IGFuZCA8Y29kZT4iYmFSIjwvY29kZT4KLQkgKiAod2hlcmUgdGhlICJkZWxpbWl0ZWQiIGlkZW50aWZpZXIgaXMgcmVxdWlyZWQpIGlzOgotCSAqIDxwcmU+Ci0JICogICAgICJGb29fYmFSIgotCSAqIDwvcHJlPgotCSAqIG5vdAotCSAqIDxwcmU+Ci0JICogICAgICJGb28iXyJiYVIiCi0JICogPC9wcmU+Ci0JICogQXMgYSByZXN1bHQsIHdlIGNhbm5vdCBob25lc3RseSBjYWxjdWxhdGUgdGhlIGRlZmF1bHQgbmFtZSB3aXRob3V0IGEKLQkgKiBkYXRhYmFzZSBjb25uZWN0aW9uLiBXZSBuZWVkIHRoZSBkYXRhYmFzZSB0byBjb252ZXJ0IHRoZSByZXN1bHRpbmcgbmFtZQotCSAqIHRvIGFuIGlkZW50aWZpZXIgYXBwcm9wcmlhdGUgdG8gdGhlIGN1cnJlbnQgZGF0YWJhc2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZShSZWFkT25seVJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXApIHsKLQkJaWYgKHJlbGF0aW9uc2hpcC5nZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgewotCQkJcmV0dXJuIGJ1aWxkRGJKb2luVGFibGVEZWZhdWx0TmFtZShyZWxhdGlvbnNoaXApOwotCQl9Ci0JCS8vIGNvbnRpbnVlIHdpdGggYSAiYmVzdCBlZmZvcnQiOgotCQlTdHJpbmcgb3duaW5nVGFibGVOYW1lID0gcmVsYXRpb25zaGlwLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCQlpZiAob3duaW5nVGFibGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IHJlbGF0aW9uc2hpcC5nZXRNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHRhcmdldFRhYmxlTmFtZSA9IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JCWlmICh0YXJnZXRUYWJsZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG93bmluZ1RhYmxlTmFtZSArICdfJyArIHRhcmdldFRhYmxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIGRhdGFiYXNlIHRvIGJ1aWxkIGEgbW9yZSBhY2N1cmF0ZSBkZWZhdWx0IG5hbWUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkRGJKb2luVGFibGVEZWZhdWx0TmFtZShSZWFkT25seVJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXApIHsKLQkJVGFibGUgb3duaW5nVGFibGUgPSByZWxhdGlvbnNoaXAuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQlpZiAob3duaW5nVGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gcmVsYXRpb25zaGlwLmdldE1hcHBpbmcoKTsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlUYWJsZSB0YXJnZXRUYWJsZSA9IHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQlpZiAodGFyZ2V0VGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSBvd25pbmdUYWJsZS5nZXROYW1lKCkgKyAnXycgKyB0YXJnZXRUYWJsZS5nZXROYW1lKCk7Ci0JCXJldHVybiBvd25pbmdUYWJsZS5nZXREYXRhYmFzZSgpLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgY29sbGVjdGlvbiB0YWJsZSBuYW1lIGZyb20gdGhlIEpQQSBzcGVjOjxicj4KLQkgKiAJIlRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBuYW1lIG9mIHRoZSBjb250YWluaW5nIGVudGl0eSBhbmQKLQkgKiAgdGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24gYXR0cmlidXRlLCBzZXBhcmF0ZWQgYnkgYW4gdW5kZXJzY29yZS4iCi0JICogPHByZT4KLQkgKiBbb3duaW5nIGVudGl0eSBuYW1lXV9bYXR0cmlidXRlIG5hbWVdCi0JICogPC9wcmU+Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVpbGRDb2xsZWN0aW9uVGFibGVEZWZhdWx0TmFtZShFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgbWFwcGluZykgewotCQlFbnRpdHkgZW50aXR5ID0gbWFwcGluZy5nZXRFbnRpdHkoKTsKLQkJaWYgKGVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgb3duaW5nRW50aXR5TmFtZSA9IGVudGl0eS5nZXROYW1lKCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbWFwcGluZy5nZXROYW1lKCk7Ci0JCXJldHVybiBvd25pbmdFbnRpdHlOYW1lICsgJ18nICsgYXR0cmlidXRlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGpvaW4gY29sdW1uJ3MgZGVmYXVsdCBuYW1lOwotCSAqIHdoaWNoIGlzIHR5cGljYWxseTxwcmU+Ci0JICogICAgIFthdHRyaWJ1dGUgbmFtZV1fW3JlZmVyZW5jZWQgY29sdW1uIG5hbWVdCi0JICogPC9wcmU+Ci0JICogQnV0LCBpZiB3ZSBkb24ndCBoYXZlIGFuIGF0dHJpYnV0ZSBuYW1lIChlLmcuIGluIGEgdW5pZGlyZWN0aW9uYWwKLQkgKiBvbmUtdG8tbWFueSBvciBtYW55LXRvLW1hbnkpIGlzPHByZT4KLQkgKiAgICAgW3RhcmdldCBlbnRpdHkgbmFtZV1fW3JlZmVyZW5jZWQgY29sdW1uIG5hbWVdCi0JICogPC9wcmU+Ci0JICogQHNlZSAjYnVpbGRKb2luVGFibGVEZWZhdWx0TmFtZShSZWFkT25seVJlbGF0aW9uc2hpcCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZShSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCWlmIChvd25lci5nZXRKb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgcHJlZml4ID0gb3duZXIuZ2V0QXR0cmlidXRlTmFtZSgpOwotCQlpZiAocHJlZml4ID09IG51bGwpIHsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSBvd25lci5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcHJlZml4ID0gdGFyZ2V0RW50aXR5LmdldE5hbWUoKTsKLQkJfQotCQkvLyBJdCdzIG5vdCBjbGVhciB3aGljaCBvZiB0aGVzZSBpcyBjb3JyZWN0Li4uLgotCQkvLyBUaGUgc3BlYyBpbXBsaWVzIHRoYXQgdGhlIHJlZmVyZW5jZWQgY29sdW1uIGlzIGFsd2F5cyB0aGUKLQkJLy8gKnByaW1hcnkga2V5KiBjb2x1bW4gb2YgdGhlIHRhcmdldCBlbnRpdHk7IGkuZS4gdGhlIHByaW1hcnkga2V5IGFzCi0JCS8vIGRlZmluZWQgb24gdGhlICpkYXRhYmFzZSogKG9yLCBwb3NzaWJseSwgdGhlIHByaW1hcnkga2V5IGFzIGRlZmluZWQKLQkJLy8gYnkgdGhlIHRhcmdldCBlbnRpdHkncyBJZCBtYXBwaW5nPyksIG5vdCB0aGUgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZAotCQkvLyBjb2x1bW4gaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgaXQgaXMgdGhlIHByaW1hcnkga2V5IG9uIHRoZSB0YXJnZXQKLQkJLy8gZW50aXR5J3MgdGFibGUuIEJ1dCB0aGlzIHNlZW1zIGxpa2UgaXQgd291bGQgYmUgd3Jvbmc7IHNpbmNlIHRoZQotCQkvLyByZWZlcmVuY2VkIGNvbHVtbiBuZWVkIG5vdCBiZSBhIHByaW1hcnkga2V5IGFuZCB3ZSBkb24ndCBhbHdheXMgaGF2ZQotCQkvLyBhY2Nlc3MgdG8gdGhlIGRhdGFiYXNlLgotCQkvLwotCQkvLyBDb2x1bW4gdGFyZ2V0Q29sdW1uID0gam9pbkNvbHVtbi5nZXRUYXJnZXRQcmltYXJ5S2V5RGJDb2x1bW4oKTsKLQkJU3RyaW5nIHRhcmdldENvbHVtbk5hbWUgPSBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCWlmICh0YXJnZXRDb2x1bW5OYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gcHJlZml4ICsgJ18nICsgdGFyZ2V0Q29sdW1uTmFtZTsKLQkJLy8gQWdhaW4sIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9mIHRoZXNlIGlzIGNvcnJlY3QuLi4uCi0JCS8vIENvbnZlcnRpbmcgdGhlIG5hbWUgdG8gYW4gaWRlbnRpZmllciB3aWxsIHJlc3VsdCBpbiB0aGUgaWRlbnRpZmllcgotCQkvLyBiZWluZyBkZWxpbWl0ZWQgbmVhcmx5IGV2ZXJ5IHRpbWUgKGF0IGxlYXN0IG9uIG5vbi1TeWJhc2UvTVMKLQkJLy8gZGF0YWJhc2VzKTsgYnV0IHRoYXQgcHJvYmFibHkgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhlIHNwZWMuLi4uCi0JCS8vCi0JCS8vIHJldHVybiB0YXJnZXRDb2x1bW4uZ2V0RGF0YWJhc2UoKS5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihuYW1lKTsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIHNwZWNpZmllZCBtYXBwaW5nJ3MgdGFyZ2V0IGVudGl0eQotCSAqIHRoYXQgaXMgb3duZWQgYnkgdGhlIG1hcHBpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0QXR0cmlidXRlTmFtZShSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJaWYgKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0YXJnZXRFbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzT3duZWRCeShyZWxhdGlvbnNoaXBNYXBwaW5nKSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIGFwcHJvcHJpYXRlLCByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlCi0JICogcmVsYXRpb25zaGlwIHRhcmdldC4KLQkgKiBTcGVjIHN0YXRlczo8YnI+Ci0JICogICAgICJUaGUgc2FtZSBuYW1lIGFzIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb2YgdGhlIHJlZmVyZW5jZWQgdGFibGUuIjxicj4KLQkgKiBXZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgcHJpbWFyeSBrZXkgY29sdW1uIGlzIGRlZmluZWQgYnkgdGhlIG1hcHBpbmdzIGluc3RlYWQgb2YgdGhlIGRhdGFiYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyKSB7Ci0JCWlmIChqb2luQ29sdW1uT3duZXIuZ2V0Sm9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IGpvaW5Db2x1bW5Pd25lci5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJaWYgKHRhcmdldEVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFyZ2V0RW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2x1bW5NYXBwaW5nIGdldENvbHVtbk1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7Ci0JCWlmICgoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB8fCAocGVyc2lzdGVudFR5cGUgPT0gbnVsbCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNBdHRyaWJ1dGUgOiBwZXJzaXN0ZW50VHlwZS5nZXRBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhwZXJzQXR0cmlidXRlLmdldE5hbWUoKSkpIHsKLQkJCQlpZiAocGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBDb2x1bW5NYXBwaW5nKSB7Ci0JCQkJCXJldHVybiAoQ29sdW1uTWFwcGluZykgcGVyc0F0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQkJfQotCQkJCS8vIGtlZXAgbG9va2luZyBvciByZXR1cm4gbnVsbD8/PwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlpZiAoKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgfHwgKHR5cGVNYXBwaW5nID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA6IHR5cGVNYXBwaW5nLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhhdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKSkpIHsKLQkJCQlpZiAoYXR0cmlidXRlTWFwcGluZyBpbnN0YW5jZW9mIFJlbGF0aW9uc2hpcE1hcHBpbmcpIHsKLQkJCQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBhdHRyaWJ1dGVNYXBwaW5nOwotCQkJCX0KLQkJCQkvLyBrZWVwIGxvb2tpbmcgb3IgcmV0dXJuIG51bGw/Pz8KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydFJlZmVyZW5jZVRhYmxlRGVmYXVsdFRvU3BlY2lmaWVkSm9pbkNvbHVtbihSZWZlcmVuY2VUYWJsZSByZWZlcmVuY2VUYWJsZSkgewotCQlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gcmVmZXJlbmNlVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJaWYgKGRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gcmVmZXJlbmNlVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpOwotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29udmVydEpvaW5UYWJsZURlZmF1bHRUb1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKEpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJSm9pbkNvbHVtbiBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCWlmIChkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlTmFtZShDb2xsZWN0aW9uTWFwcGluZzJfMCBtYXBwaW5nKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHRhcmdldFR5cGUgPSBtYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0VHlwZSgpOwotCQlTdHJpbmcgbWFwS2V5ID0gbWFwcGluZy5nZXRNYXBLZXkoKTsKLQkJaWYgKChtYXBLZXkgPT0gbnVsbCkgfHwgKHRhcmdldFR5cGUgPT0gbnVsbCkpIHsKLQkJCVN0cmluZyBtYXBLZXlDbGFzcyA9IG1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKTsKLQkJCXJldHVybiBtYXBLZXlDbGFzcyAhPSBudWxsID8gbWFwS2V5Q2xhc3MgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQkJfQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFwS2V5QXR0cmlidXRlID0gdGFyZ2V0VHlwZS5yZXNvbHZlQXR0cmlidXRlKG1hcEtleSk7Ci0JCWlmIChtYXBLZXlBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCQl9Ci0JCUF0dHJpYnV0ZU1hcHBpbmcyXzAgbWFwS2V5TWFwcGluZyA9IChBdHRyaWJ1dGVNYXBwaW5nMl8wKSBtYXBLZXlBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlpZiAobWFwS2V5TWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIG1hcEtleU1hcHBpbmcuZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKTsKLQl9Ci0KLQkvLyBUT0RPIG1vdmUgdG8gVHlwZU1hcHBpbmc/IG1heSBuZWVkIGRpZmZlcmVudCBuYW1lIChvciBtYXkgbmVlZCB0byByZW5hbWUgZXhpc3RpbmcgI3Jlc29sdmUuLi4pCi0JcHVibGljIHN0YXRpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oVHlwZU1hcHBpbmcgb3ZlcnJpZGFibGVUeXBlTWFwcGluZywgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gY29udmVuaWVuY2UgbnVsbCBjaGVjayB0byBzaW1wbGlmeSBjbGllbnQgY29kZQotCQlpZiAob3ZlcnJpZGFibGVUeXBlTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiBvdmVycmlkYWJsZVR5cGVNYXBwaW5nLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSB0eXBlTWFwcGluZy5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gVE9ETyBtb3ZlIHRvIFR5cGVNYXBwaW5nPyBtYXkgbmVlZCBkaWZmZXJlbnQgbmFtZSAob3IgbWF5IG5lZWQgdG8gcmVuYW1lIGV4aXN0aW5nICNyZXNvbHZlLi4uKQotCXB1YmxpYyBzdGF0aWMgUmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFR5cGVNYXBwaW5nIG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCS8vIGNvbnZlbmllbmNlIG51bGwgY2hlY2sgdG8gc2ltcGxpZnkgY2xpZW50IGNvZGUKLQkJaWYgKG92ZXJyaWRhYmxlVHlwZU1hcHBpbmcgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nIDogb3ZlcnJpZGFibGVUeXBlTWFwcGluZy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gdHlwZU1hcHBpbmcucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAocmVsYXRpb25zaGlwICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVsYXRpb25zaGlwOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKEVudGl0eSBlbnRpdHkpIHsKLQkJU3RyaW5nIHBrQ29sdW1uTmFtZSA9IG51bGw7Ci0JCWZvciAoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEFsbEF0dHJpYnV0ZXMoKSkgewotCQkJU3RyaW5nIGN1cnJlbnQgPSBhdHRyaWJ1dGUuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCQkvLyAyMjk0MjMgLSBpZiB0aGUgYXR0cmlidXRlIGlzIGEgcHJpbWFyeSBrZXksIGJ1dCBpdCBoYXMgYW4gYXR0cmlidXRlIG92ZXJyaWRlLAotCQkJCS8vIHVzZSB0aGUgb3ZlcnJpZGUgY29sdW1uIGluc3RlYWQKLQkJCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoYXR0cmlidXRlT3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJCQljdXJyZW50ID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChwa0NvbHVtbk5hbWUgPT0gbnVsbCkgewotCQkJCXBrQ29sdW1uTmFtZSA9IGN1cnJlbnQ7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChjdXJyZW50ICE9IG51bGwpIHsKLQkJCQkJLy8gaWYgd2UgZW5jb3VudGVyIGEgY29tcG9zaXRlIHByaW1hcnkga2V5LCByZXR1cm4gbnVsbAotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgZW5jb3VudGVyIG9ubHkgYSBzaW5nbGUgcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUsIHJldHVybiBpdAotCQlyZXR1cm4gcGtDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqICJVbnF1YWxpZnkiIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG5hbWUsIHJlbW92aW5nIHRoZSBtYXBwaW5nJ3MgbmFtZQotCSAqIGZyb20gdGhlIGZyb250IG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSBpZiBpdCBpcyBwcmVzZW50LiBGb3IgZXhhbXBsZSwgaWYKLQkgKiB0aGUgbWFwcGluZydzIG5hbWUgaXMgPGNvZGU+ImZvbyI8L2NvZGU+LCB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKiA8Y29kZT4iZm9vLmJhciI8L2NvZGU+IHdvdWxkIGJlIGNvbnZlcnRlZCB0byA8Y29kZT4iYmFyIjwvY29kZT4pLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlIG5hbWUgY2Fubm90IGJlICJ1bnF1YWxpZmllZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5xdWFsaWZ5KFN0cmluZyBtYXBwaW5nTmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJaWYgKG1hcHBpbmdOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICggISBhdHRyaWJ1dGVOYW1lLnN0YXJ0c1dpdGgobWFwcGluZ05hbWUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgbWFwcGluZ05hbWVMZW5ndGggPSBtYXBwaW5nTmFtZS5sZW5ndGgoKTsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUubGVuZ3RoKCkgPD0gbWFwcGluZ05hbWVMZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoYXR0cmlidXRlTmFtZS5jaGFyQXQobWFwcGluZ05hbWVMZW5ndGgpID09ICcuJykgPyBhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZyhtYXBwaW5nTmFtZUxlbmd0aCArIDEpIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHRyYW5zZm9ybWVyIHdpbGwgcHJlcGVuZCBhIHNwZWNpZmllZCBxdWFsaWZpZXIsIGZvbGxvd2VkIGJ5IGEKLQkgKiBkb3QgKCcuJyksIHRvIGEgc3RyaW5nLiBGb3IgZXhhbXBsZSwgaWYgYSBtYXBwaW5nJ3MgbmFtZSBpcwotCSAqIDxjb2RlPiJmb28iPC9jb2RlPiBhbmQgb25lIG9mIGl0cyBhdHRyaWJ1dGUncyBpcyBuYW1lZAotCSAqIDxjb2RlPiJiYXIiPC9jb2RlPiwgdGhlIGF0dHJpYnV0ZSdzIG5hbWUgd2lsbCBiZSB0cmFuc2Zvcm1lZAotCSAqIGludG8gPGNvZGU+ImZvby5iYXIiPC9jb2RlPi4gSWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZXIgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiAob3IgYW4gZW1wdHkgc3RyaW5nKSwgb25seSBhIGRvdCB3aWxsIGJlIHByZXBlbmRlZAotCSAqIHRvIGEgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUXVhbGlmaWVyVHJhbnNmb3JtZXIKLQkJaW1wbGVtZW50cyBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4KLQl7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKLQkJcHVibGljIFF1YWxpZmllclRyYW5zZm9ybWVyKFN0cmluZyBxdWFsaWZpZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnByZWZpeCA9IChxdWFsaWZpZXIgPT0gbnVsbCkgPyAiLiIgOiBxdWFsaWZpZXIgKyAnLic7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgcykgewotCQkJcmV0dXJuIHRoaXMucHJlZml4ICsgczsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdXBwcmVzcyBkZWZhdWx0IGNvbnN0cnVjdG9yLCBlbnN1cmluZyBub24taW5zdGFudGlhYmlsaXR5LgotCSAqLwotCXByaXZhdGUgTWFwcGluZ1Rvb2xzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L05hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTQ3NzM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHJlc29sdmUgdGV4dCByYW5nZXMgb24gbmFtZWQgY29sdW1ucwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L092ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxZWFlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L092ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byByZXNvbHZlIHRleHQgcmFuZ2VzIG9uIG5hbWVkIGNvbHVtbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyCi17Ci0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZVByb3BlcnR5VGVzdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L1BlcnNpc3RlbnRBdHRyaWJ1dGVQcm9wZXJ0eVRlc3Rlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjIwYTA0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlUHJvcGVydHlUZXN0ZXIKLQlleHRlbmRzIFByb3BlcnR5VGVzdGVyIAotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX01BUFBFRCA9ICJpc01hcHBlZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX1ZJUlRVQUwgPSAiaXNWaXJ0dWFsIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICggISAoZXhwZWN0ZWRWYWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudGVzdF8ocmVjZWl2ZXIsIHByb3BlcnR5LCAoKEJvb2xlYW4pIGV4cGVjdGVkVmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBwcm9wZXJ0eSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0ZXN0XyhPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgYm9vbGVhbiBleHBlY3RlZCkgewotCQlpZiAocHJvcGVydHkuZXF1YWxzKElTX01BUFBFRCkpIHsKLQkJCWJvb2xlYW4gYWN0dWFsID0gKChSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHJlY2VpdmVyKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkgIT0gbnVsbDsKLQkJCXJldHVybiBhY3R1YWwgPT0gZXhwZWN0ZWQ7Ci0JCX0KLQkJaWYgKHByb3BlcnR5LmVxdWFscyhJU19WSVJUVUFMKSkgewotCQkJYm9vbGVhbiBhY3R1YWwgPSAoKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSkgcmVjZWl2ZXIpLmlzVmlydHVhbCgpOwotCQkJcmV0dXJuIGFjdHVhbCA9PSBleHBlY3RlZDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMzQ1Y2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byByZXNvbHZlIHRleHQgcmFuZ2VzIG9uIHBlcnNpc3RlbnQgYXR0cmlidXRlcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlcgotewotCVRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L1ByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTc1OWVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcmVzb2x2ZSB0ZXh0IHJhbmdlcyBvbiBwZXJzaXN0ZW50IHR5cGUgbWFwcGluZ3MgdGhhdCBjYW4gZGVmaW5lIHByaW1hcnkga2V5cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciBleHRlbmRzIFR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQkKLQlUZXh0UmFuZ2UgZ2V0SWRDbGFzc1RleHRSYW5nZSgpOwotCQotCVRleHRSYW5nZSBnZXRBdHRyaWJ1dGVNYXBwaW5nVGV4dFJhbmdlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3N2IzOTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcmVzb2x2ZSB0ZXh0IHJhbmdlcyBvbiBuYW1lZCBjb2x1bW5zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBleHRlbmRzIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvVGFibGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9UYWJsZVRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYjc0NGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9UYWJsZVRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIEludGVyZmFjZSB0byByZXNvbHZlIHRleHQgcmFuZ2VzIG9uIHRhYmxlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZVRleHRSYW5nZVJlc29sdmVyCi17Ci0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKLQotCVRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoKTsKLQotCVRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L1R5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzBjYWMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHJlc29sdmUgdGV4dCByYW5nZXMgb24gcGVyc2lzdGVudCB0eXBlIG1hcHBpbmdzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcgotewotCVRleHRSYW5nZSBnZXRUeXBlTWFwcGluZ1RleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9UeXBlTWFwcGluZ1Rvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L1R5cGVNYXBwaW5nVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliMDI4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L1R5cGVNYXBwaW5nVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5EZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci0KLS8qKgotICogR2F0aGVyIHNvbWUgb2YgdGhlIGJlaGF2aW9yIGNvbW1vbiB0byB0aGUgSmF2YSBhbmQgWE1MIG1vZGVscy4gOi0oCi0gKi8KLXB1YmxpYyBjbGFzcyBUeXBlTWFwcGluZ1Rvb2xzIHsKLQotCS8vICoqKioqKioqKiogc2luZ2xlIHJlbGF0aW9uc2hpcCBtYXBwaW5ncyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBpcyBhIGRlcml2ZWQgSUQgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiB0eXBlIG1hcHBpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGF0dHJpYnV0ZUlzRGVyaXZlZElkKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nLCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLy8gdGhlIGF0dHJpYnV0ZSBuYW1lIG1heSBiZSBxdWFsaWZpZWQgLSB3ZSB0ZXN0IG9ubHkgdGhlIGZpcnN0IGF0dHJpYnV0ZSBuYW1lCi0JCWludCBkb3RJbmRleCA9IGF0dHJpYnV0ZU5hbWUuaW5kZXhPZignLicpOwotCQlhdHRyaWJ1dGVOYW1lID0gKGRvdEluZGV4ID09IC0xKSA/IGF0dHJpYnV0ZU5hbWUgOiBhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZygwLCBkb3RJbmRleCk7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZ2V0TWFwc0lkRGVyaXZlZElkQXR0cmlidXRlTmFtZXModHlwZU1hcHBpbmcpLCBhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIGFsbCB0aGUgSUQgYXR0cmlidXRlcyBkZXJpdmVkIGZyb20KLQkgKiBzaW5nbGUtcmVsYXRpb25zaGlwIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbWFwcGluZwotCSAqIChpLmUuIHRoZSBuYW1lcyBvZiB0aGUgSUQgYXR0cmlidXRlcyB0aGF0IGFyZSBzcGVjaWZpZWQgYnkgYSBzaW5nbGUtCi0JICogcmVsYXRpb25zaGlwIG1hcHBpbmcncyAibWFwcyBJRCIgc2V0dGluZykuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE1hcHNJZERlcml2ZWRJZEF0dHJpYnV0ZU5hbWVzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCwgU3RyaW5nPihnZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVnaWVzKHR5cGVNYXBwaW5nKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIHN0cmF0ZWd5KSB7Ci0JCQkJCXJldHVybiBzdHJhdGVneS5nZXRJZEF0dHJpYnV0ZU5hbWUoKTsKLQkJCQl9Ci0JCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIHNpbmdsZS1yZWxhdGlvbnNoaXAgIm1hcHMgSUQiIGRlcml2ZWQgaWRlbnRpdHkgc3RyYXRlZ2llcwotCSAqIGZvciB0aGUgc3BlY2lmaWVkIHR5cGUgbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEl0ZXJhYmxlPE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wPiBnZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVnaWVzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEZXJpdmVkSWRlbnRpdHkyXzAsIE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wPihnZXRNYXBzSWREZXJpdmVkSWRlbnRpdGllcyh0eXBlTWFwcGluZykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIHRyYW5zZm9ybShEZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5KSB7Ci0JCQkJcmV0dXJuIGRlcml2ZWRJZGVudGl0eS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIHNpbmdsZS1yZWxhdGlvbnNoaXAgIm1hcHMgSUQiIGRlcml2ZWQgaWRlbnRpdGllcyBmb3IgdGhlCi0JICogc3BlY2lmaWVkIHR5cGUgbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEl0ZXJhYmxlPERlcml2ZWRJZGVudGl0eTJfMD4gZ2V0TWFwc0lkRGVyaXZlZElkZW50aXRpZXMoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxEZXJpdmVkSWRlbnRpdHkyXzA+KGdldERlcml2ZWRJZGVudGl0aWVzKHR5cGVNYXBwaW5nKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChEZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5KSB7Ci0JCQkJCXJldHVybiBkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBzaW5nbGUtcmVsYXRpb25zaGlwIGRlcml2ZWQgaWRlbnRpdGllcyBmb3IgdGhlIHNwZWNpZmllZAotCSAqIHR5cGUgbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIEl0ZXJhYmxlPERlcml2ZWRJZGVudGl0eTJfMD4gZ2V0RGVyaXZlZElkZW50aXRpZXMoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAsIERlcml2ZWRJZGVudGl0eTJfMD4oZ2V0U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ3ModHlwZU1hcHBpbmcpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZXJpdmVkSWRlbnRpdHkyXzAgdHJhbnNmb3JtKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgbWFwcGluZykgewotCQkJCXJldHVybiBtYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIHNpbmdsZS1yZWxhdGlvbnNoaXAgYXR0cmlidXRlIG1hcHBpbmdzIGZvciB0aGUgc3BlY2lmaWVkCi0JICogdHlwZSBtYXBwaW5nLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgSXRlcmFibGU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMD4gZ2V0U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ3MoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBTdWJJdGVyYWJsZVdyYXBwZXI8QXR0cmlidXRlTWFwcGluZywgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMD4oZ2V0U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ3NfKHR5cGVNYXBwaW5nKSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHN0YXRpYyBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nc18oVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPigKLQkJCQkJdHlwZU1hcHBpbmcuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpLAotCQkJCQl0eXBlTWFwcGluZy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpCi0JCQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG1hcHBpbmdzIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+PiBBVFRSSUJVVEVfTUFQUElOR1NfVFJBTlNGT1JNRVIgPSBuZXcgQXR0cmlidXRlTWFwcGluZ3NUcmFuc2Zvcm1lcigpOwotCXN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVNYXBwaW5nc1RyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+PgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IHRyYW5zZm9ybShUeXBlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbWFwcGluZy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFzc29jaWF0ZWQgdGFibGVzIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+PiBBU1NPQ0lBVEVEX1RBQkxFU19UUkFOU0ZPUk1FUiA9IG5ldyBBc3NvY2lhdGVkVGFibGVzVHJhbnNmb3JtZXIoKTsKLQlzdGF0aWMgY2xhc3MgQXNzb2NpYXRlZFRhYmxlc1RyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+PgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IHRyYW5zZm9ybShUeXBlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbWFwcGluZy5nZXRBc3NvY2lhdGVkVGFibGVzKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGFibGUgYXR0cmlidXRlIG5hbWVzIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IE9WRVJSSURBQkxFX0FUVFJJQlVURV9OQU1FU19UUkFOU0ZPUk1FUiA9IG5ldyBPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzVHJhbnNmb3JtZXIoKTsKLQlzdGF0aWMgY2xhc3MgT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc1RyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQkJcmV0dXJuIG1hcHBpbmcuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRhYmxlIGFzc29jaWF0aW9uIG5hbWVzIHRyYW5zZm9ybWVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IE9WRVJSSURBQkxFX0FTU09DSUFUSU9OX05BTUVTX1RSQU5TRk9STUVSID0gbmV3IE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lc1RyYW5zZm9ybWVyKCk7Ci0Jc3RhdGljIGNsYXNzIE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lc1RyYW5zZm9ybWVyCi0JCWltcGxlbWVudHMgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQkJcmV0dXJuIG1hcHBpbmcuZ2V0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JLyoqCi0JICogU3VwcHJlc3MgZGVmYXVsdCBjb25zdHJ1Y3RvciwgZW5zdXJpbmcgbm9uLWluc3RhbnRpYWJpbGl0eS4KLQkgKi8KLQlwcml2YXRlIFR5cGVNYXBwaW5nVG9vbHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEFjY2Vzc29yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RBY2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDYxNTAwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEFjY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkFjY2Vzc29yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBY2Nlc3NvciAKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlIAotCWltcGxlbWVudHMgQWNjZXNzb3IKLXsKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RBY2Nlc3NvcihSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuYW5ub3RhdGVkIEphdmEgcmVzb3VyY2UgbWVtYmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgYW5vdGhlciBKYXZhIHJlc291cmNlIG1lbWJlciBhbmQgc3VwcHJlc3MgYWxsIGl0cyBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VNZW1iZXI8TSBleHRlbmRzIEphdmFSZXNvdXJjZU1lbWJlcj4KLQkJZXh0ZW5kcyBTb3VyY2VOb2RlCi0JCWltcGxlbWVudHMgSmF2YVJlc291cmNlTWVtYmVyCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgTSBtZW1iZXI7Ci0KLQkJLyoqCi0JCSAqIHRoZXNlIGFyZSBidWlsdCBhcyBuZWVkZWQKLQkJICovCi0JCXByb3RlY3RlZCBmaW5hbCBIYXNoTWFwPFN0cmluZywgQW5ub3RhdGlvbj4gbnVsbEFubm90YXRpb25zQ2FjaGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFubm90YXRpb24+KCk7Ci0KLQotCQlwcm90ZWN0ZWQgVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VNZW1iZXIoTSBtZW1iZXIpIHsKLQkJCXN1cGVyKG1lbWJlci5nZXRQYXJlbnQoKSk7Ci0JCQl0aGlzLm1lbWJlciA9IG1lbWJlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCS8vIE5PUAotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBOT1AKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQkJcHVibGljIEl0ZXJhYmxlPEFubm90YXRpb24+IGdldEFubm90YXRpb25zKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0QW5ub3RhdGlvbnNTaXplKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIEFubm90YXRpb24gZ2V0Tm9uTnVsbEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLm51bGxBbm5vdGF0aW9uc0NhY2hlLmdldChhbm5vdGF0aW9uTmFtZSk7Ci0JCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJYW5ub3RhdGlvbiA9IHRoaXMuYnVpbGROdWxsQW5ub3RhdGlvbihhbm5vdGF0aW9uTmFtZSk7Ci0JCQkJdGhpcy5udWxsQW5ub3RhdGlvbnNDYWNoZS5wdXQoYW5ub3RhdGlvbk5hbWUsIGFubm90YXRpb24pOwotCQkJfQotCQkJcmV0dXJuIGFubm90YXRpb247Ci0JCX0KLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uTmFtZSk7Ci0KLQkJcHVibGljIExpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldEFubm90YXRpb25zKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0QW5ub3RhdGlvbnNTaXplKFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gZ2V0QW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIGFkZEFubm90YXRpb24oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdmVBbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4LCBTdHJpbmcgY29udGFpbmVyQW5ub3RhdGlvbk5hbWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQW5ub3RhdGlvbihpbnQgaW5kZXgsIFN0cmluZyBuZXN0YWJsZUFubm90YXRpb25OYW1lKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBBbm5vdGF0aW9uIHNldFByaW1hcnlBbm5vdGF0aW9uKFN0cmluZyBwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIEl0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcykgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0JCQotCQlwdWJsaWMgSXRlcmFibGU8QW5ub3RhdGlvbj4gZ2V0QWxsQW5ub3RhdGlvbnMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGVkV2l0aChJdGVyYWJsZTxTdHJpbmc+IGFubm90YXRpb25OYW1lcykgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5pc0ZpbmFsKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1B1YmxpYygpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5pc1B1YmxpYygpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuaXNTdGF0aWMoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmlzVHJhbnNpZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Byb3RlY3RlZCgpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5pc1Byb3RlY3RlZCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQdWJsaWNPclByb3RlY3RlZCgpIHsKLQkJCXJldHVybiBpc1B1YmxpYygpIHx8IGlzUHJvdGVjdGVkKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgbWVtYmVyTmFtZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5pc0ZvcihtZW1iZXJOYW1lLCBvY2N1cnJlbmNlKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJLy8gc2hvdWxkIG5ldmVyIGJlIG51bGwKLQkJCXJldHVybiB0aGlzLm1lbWJlci5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRUZXh0UmFuZ2UoU3RyaW5nIG5lc3RhYmxlQW5ub3RhdGlvbk5hbWUsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQkvLyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmdldFRleHRSYW5nZShuZXN0YWJsZUFubm90YXRpb25OYW1lLCBhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc29sdmVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJLy8gTk9QCi0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIHVuYW5ub3RhdGVkIEphdmEgcmVzb3VyY2UgYXR0cmlidXRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFdyYXAgYW5vdGhlciBKYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBhbmQgc3VwcHJlc3MgYWxsIGl0cyBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VBdHRyaWJ1dGU8QSBleHRlbmRzIEphdmFSZXNvdXJjZUF0dHJpYnV0ZT4KLQkJZXh0ZW5kcyBVbmFubm90YXRlZEphdmFSZXNvdXJjZU1lbWJlcjxBPgotCQlpbXBsZW1lbnRzIEphdmFSZXNvdXJjZUF0dHJpYnV0ZQotCXsKLQkJcHVibGljIFVuYW5ub3RhdGVkSmF2YVJlc291cmNlQXR0cmlidXRlKEEgYXR0cmlidXRlKXsKLQkJCXN1cGVyKGF0dHJpYnV0ZSk7Ci0JCX0KLQotCQkvLyAqKioqKioqKioqIGFubm90YXRpb25zICoqKioqKioqKioKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihTdHJpbmcgYW5ub3RhdGlvbk5hbWUpIHsKLQkJCXJldHVybiAoYW5ub3RhdGlvbk5hbWUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZE51bGxBbm5vdGF0aW9uXyhhbm5vdGF0aW9uTmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbl8oU3RyaW5nIGFubm90YXRpb25OYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uUHJvdmlkZXIoKS5idWlsZE51bGxBbm5vdGF0aW9uKHRoaXMsIGFubm90YXRpb25OYW1lKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBkZWxlZ2F0ZWQgYmVoYXZpb3IgKioqKioqKioqKgotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0UGFyZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdHlwZUlzU3ViVHlwZU9mKFN0cmluZyB0bikgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLnR5cGVJc1N1YlR5cGVPZih0bik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci50eXBlSXNWYXJpYWJsZVByaW1pdGl2ZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNb2RpZmllcnMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0TW9kaWZpZXJzKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmdldFR5cGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNJbnRlcmZhY2UoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIudHlwZUlzSW50ZXJmYWNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNFbnVtKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLnR5cGVJc0VudW0oKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHR5cGVJc0FycmF5KCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLnR5cGVJc0FycmF5KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBpbnQgZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0VHlwZUFycmF5RGltZW5zaW9uYWxpdHkoKTsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5nZXRUeXBlQXJyYXlDb21wb25lbnRUeXBlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVTdXBlcmNsYXNzTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0VHlwZVN1cGVyY2xhc3NOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VHlwZUludGVyZmFjZU5hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmdldFR5cGVJbnRlcmZhY2VOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVUeXBlQXJndW1lbnROYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFR5cGVUeXBlQXJndW1lbnROYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmdldFR5cGVUeXBlQXJndW1lbnROYW1lKGluZGV4KTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTQwNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuU2ltcGxlTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5nCi0gKiA8cD4KLSAqIFRoZSBtYXBwaW5nIGFubm90YXRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGRlZmF1bHQgbWFwcGluZ3MuCi0gKiBJdCB3aWxsIGJlIGZhdWx0ZWQgaW50byBleGlzdGVuY2Ugd2hlbmV2ZXIge0BsaW5rICNnZXRBbm5vdGF0aW9uRm9yVXBkYXRlKCl9Ci0gKiBpcyBjYWxsZWQuIEl0IHdpbGwgPGVtPm5vdDwvZW0+IHJldHVybiB0byA8Y29kZT5udWxsPC9jb2RlPiBhdXRvbWF0aWNhbGx5Ci0gKiB3aGVuIGFsbCBpdHMgc3RhdGUgaXMgZGVmYXVsdGVkOyBpdCBtdXN0IGJlIGV4cGxpY2l0bHkgY2xlYXJlZCB2aWEKLSAqIHtAbGluayBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSNzZXRNYXBwaW5nS2V5KFN0cmluZyl9LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxBIGV4dGVuZHMgQW5ub3RhdGlvbj4KLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZywgQXR0cmlidXRlTWFwcGluZzJfMAotewotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRfOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5kZWZhdWx0XyA9IHRoaXMuYnVpbGREZWZhdWx0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBBIGdldE1hcHBpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEEpIHRoaXMuZ2V0QW5ub3RhdGlvbl8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRBbm5vdGF0aW9uXygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIG1hcHBpbmdzIHRoYXQgY2FuIG9jY3VyIGJ5IGRlZmF1bHQKLQkgKiAoZS5nLiA8Y29kZT5CYXNpYzwvY29kZT4sIDxjb2RlPkVtYmVkZGVkPC9jb2RlPiwgPGNvZGU+T25lVG9PbmU8L2NvZGU+LAotCSAqIGFuZCA8Y29kZT5PbmVUb01hbnk8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQSBnZXRBbm5vdGF0aW9uRm9yVXBkYXRlKCkgewotCQlBIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCXRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLnNldE1hcHBpbmdLZXkodGhpcy5nZXRLZXkoKSk7Ci0JCQlhbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1pc3NpbmcgYW5ub3RhdGlvbjogIiArIHRoaXMpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm90YXRpb247Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0XzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gZGVmYXVsdF8pIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRfOwotCQl0aGlzLmRlZmF1bHRfID0gZGVmYXVsdF87Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRfKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVEZWZhdWx0KCkgewotCQl0aGlzLnNldERlZmF1bHQodGhpcy5idWlsZERlZmF1bHQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpID09IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE93bmluZ1R5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3duZWRCeShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRHZW5lcmF0b3JzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZW1iZWRkZWQgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0TmFtZSgpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXROYW1lKCkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUNvbHVtbk1hcHBpbmcgbWFwcGluZyA9IHRoaXMucmVzb2x2ZUNvbHVtbk1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBtYXBwaW5nLmdldENvbHVtbigpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW5NYXBwaW5nIHJlc29sdmVDb2x1bW5NYXBwaW5nKFN0cmluZyBuYW1lKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IHRoaXMucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcobmFtZSk7Ci0JCXJldHVybiAoKG1hcHBpbmcgIT0gbnVsbCkgJiYgbWFwcGluZy5pc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpKSA/IChDb2x1bW5NYXBwaW5nKSBtYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IHRoaXMucmVzb2x2ZVJlbGF0aW9uc2hpcE1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBNYXBwaW5nIHJlc29sdmVSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBuYW1lKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IHRoaXMucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcobmFtZSk7Ci0JCXJldHVybiAoKG1hcHBpbmcgIT0gbnVsbCkgJiYgbWFwcGluZy5pc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkpID8gKFJlbGF0aW9uc2hpcE1hcHBpbmcpIG1hcHBpbmcgOiBudWxsOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlTmFtZSkgPyB0aGlzIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHJhbnNmb3JtZXI8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkUXVhbGlmaWVyVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwcGluZ1Rvb2xzLlF1YWxpZmllclRyYW5zZm9ybWVyKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHVucXVhbGlmeShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnVucXVhbGlmeSh0aGlzLmdldE5hbWUoKSwgYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqCi0KLQlwdWJsaWMgTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlTWV0YW1vZGVsRmllbGQoCi0JCQkJdGhpcy5nZXRNZXRhbW9kZWxGaWVsZE1vZGlmaWVycygpLAotCQkJCXRoaXMuZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpLAotCQkJCXRoaXMuZ2V0TWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lcygpLAotCQkJCXRoaXMuZ2V0TWV0YW1vZGVsRmllbGROYW1lKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0TWV0YW1vZGVsRmllbGRNb2RpZmllcnMoKSB7Ci0JCXJldHVybiBTVEFOREFSRF9NRVRBTU9ERUxfRklFTERfTU9ESUZJRVJTOwotCX0KLQotCS8qKgotCSAqIG1vc3QgbWFwcGluZ3MgYXJlICJzaW5ndWxhciIKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuU0lOR1VMQVJfQVRUUklCVVRFOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXMoKSB7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IHR5cGVBcmd1bWVudE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KDMpOwotCQl0eXBlQXJndW1lbnROYW1lcy5hZGQodGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJdGhpcy5hZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8odHlwZUFyZ3VtZW50TmFtZXMpOwotCQlyZXR1cm4gdHlwZUFyZ3VtZW50TmFtZXM7Ci0JfQotCi0JLyoqCi0JICogYnkgZGVmYXVsdCwgd2UgYWRkIG9ubHkgdGhlIG1hcHBpbmcncyBhdHRyaWJ1dGUgdHlwZSBuYW1lOwotCSAqIGJ1dCBjb2xsZWN0aW9uIHJlbGF0aW9uc2hpcCBtYXBwaW5ncyB3aWxsIGFsc28gbmVlZCB0byBhZGQgdGhlIGtleSB0eXBlCi0JICogbmFtZSBpZiB0aGUgImNvbGxlY3Rpb24iIGlzIG9mIHR5cGUgamF2YS51dGlsLk1hcAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQl0eXBlQXJndW1lbnROYW1lcy5hZGQodGhpcy5nZXRNZXRhbW9kZWxUeXBlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgewotCQlyZXR1cm4gKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpLmdldE1ldGFtb2RlbFR5cGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlTWFwcGluZ1R5cGUobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwcGluZ1R5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICggISB0aGlzLmdldFR5cGVNYXBwaW5nKCkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQodGhpcy5nZXRLZXkoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORywKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldE1hcHBpbmdBbm5vdGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUEgYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDY2NDU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgY29sdW1uIG9yIGpvaW4gY29sdW1uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFCYXNlQ29sdW1uPEEgZXh0ZW5kcyBCYXNlQ29sdW1uQW5ub3RhdGlvbiwgTyBleHRlbmRzIEphdmFSZWFkT25seUJhc2VDb2x1bW4uT3duZXI+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFOYW1lZENvbHVtbjxBLCBPPgotCWltcGxlbWVudHMgSmF2YUJhc2VDb2x1bW4KLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhYmxlOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhYmxlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVW5pcXVlOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRVbmlxdWU7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWROdWxsYWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0TnVsbGFibGU7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRJbnNlcnRhYmxlOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRJbnNlcnRhYmxlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVXBkYXRhYmxlOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRVcGRhdGFibGU7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFCYXNlQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE8gb3duZXIpIHsKLQkJdGhpcyhwYXJlbnQsIG93bmVyLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQmFzZUNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPIG93bmVyLCBBIGNvbHVtbkFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBvd25lciwgY29sdW1uQW5ub3RhdGlvbik7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVW5pcXVlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTnVsbGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gdGhpcy5idWlsZFNwZWNpZmllZEluc2VydGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVbmlxdWVfKHRoaXMuYnVpbGRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0VGFibGUodGhpcy5idWlsZERlZmF1bHRUYWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VW5pcXVlKHRoaXMuYnVpbGREZWZhdWx0VW5pcXVlKCkpOwotCQl0aGlzLnNldERlZmF1bHROdWxsYWJsZSh0aGlzLmJ1aWxkRGVmYXVsdE51bGxhYmxlKCkpOwotCQl0aGlzLnNldERlZmF1bHRJbnNlcnRhYmxlKHRoaXMuYnVpbGREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VXBkYXRhYmxlKHRoaXMuYnVpbGREZWZhdWx0VXBkYXRhYmxlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFRhYmxlIDogdGhpcy5kZWZhdWx0VGFibGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIHRhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFRhYmxlLCB0YWJsZSkpIHsKLQkJCXRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLnNldFRhYmxlKHRhYmxlKTsKLQkJCXRoaXMucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVfKHRhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlXyhTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0VGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFRhYmxlOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRUYWJsZVRleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuaXF1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFVuaXF1ZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVW5pcXVlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRVbmlxdWUoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFVuaXF1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkVW5pcXVlLCB1bmlxdWUpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRVbmlxdWUodW5pcXVlKTsKLQkJCXRoaXMucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVW5pcXVlXyh1bmlxdWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVW5pcXVlXyhCb29sZWFuIHVuaXF1ZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVW5pcXVlOwotCQl0aGlzLnNwZWNpZmllZFVuaXF1ZSA9IHVuaXF1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFksIG9sZCwgdW5pcXVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFVuaXF1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldFVuaXF1ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVuaXF1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFVuaXF1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VW5pcXVlKGJvb2xlYW4gdW5pcXVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0VW5pcXVlOwotCQl0aGlzLmRlZmF1bHRVbmlxdWUgPSB1bmlxdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1VOSVFVRV9QUk9QRVJUWSwgb2xkLCB1bmlxdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFVuaXF1ZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVU5JUVVFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBudWxsYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTnVsbGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE51bGxhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHROdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZE51bGxhYmxlLCBudWxsYWJsZSkpIHsKLQkJCXRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLnNldE51bGxhYmxlKG51bGxhYmxlKTsKLQkJCXRoaXMucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGVfKG51bGxhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE51bGxhYmxlXyhCb29sZWFuIG51bGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IG51bGxhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZLCBvbGQsIG51bGxhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0TnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE51bGxhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROdWxsYWJsZShib29sZWFuIG51bGxhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0TnVsbGFibGU7Ci0JCXRoaXMuZGVmYXVsdE51bGxhYmxlID0gbnVsbGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX05VTExBQkxFX1BST1BFUlRZLCBvbGQsIG51bGxhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTlVMTEFCTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEluc2VydGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSwgaW5zZXJ0YWJsZSkpIHsKLQkJCXRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLnNldEluc2VydGFibGUoaW5zZXJ0YWJsZSk7Ci0JCQl0aGlzLnJlbW92ZUNvbHVtbkFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZEluc2VydGFibGVfKGluc2VydGFibGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZV8oQm9vbGVhbiBpbnNlcnRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlOwotCQl0aGlzLnNwZWNpZmllZEluc2VydGFibGUgPSBpbnNlcnRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOU0VSVEFCTEVfUFJPUEVSVFksIG9sZCwgaW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0SW5zZXJ0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEluc2VydGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbnNlcnRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRJbnNlcnRhYmxlKGJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdEluc2VydGFibGU7Ci0JCXRoaXMuZGVmYXVsdEluc2VydGFibGUgPSBpbnNlcnRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTlNFUlRBQkxFX1BST1BFUlRZLCBvbGQsIGluc2VydGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdEluc2VydGFibGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0lOU0VSVEFCTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRVcGRhdGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlLCB1cGRhdGFibGUpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRVcGRhdGFibGUodXBkYXRhYmxlKTsKLQkJCXRoaXMucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVXBkYXRhYmxlXyh1cGRhdGFibGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlXyhCb29sZWFuIHVwZGF0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFksIG9sZCwgdXBkYXRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldFVwZGF0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFVwZGF0YWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VXBkYXRhYmxlKGJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0VXBkYXRhYmxlOwotCQl0aGlzLmRlZmF1bHRVcGRhdGFibGUgPSB1cGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1VQREFUQUJMRV9QUk9QRVJUWSwgb2xkLCB1cGRhdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVBEQVRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5QmFzZUNvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVW5pcXVlKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGUob2xkQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEluc2VydGFibGUob2xkQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5QmFzZUNvbHVtbiB2aXJ0dWFsQ29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tVmlydHVhbCh2aXJ0dWFsQ29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZSh2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQkvLyBpZ25vcmUgb3RoZXIgc2V0dGluZ3M/Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlVGFibGVOYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkudGFibGVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNhbmRpZGF0ZVRhYmxlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci50YWJsZU5hbWVJc0ludmFsaWQodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NWEwMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbWJlZGRhYmxlT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVtYmVkZGVkIG9yIGVtYmVkZGVkIElEIG1hcHBpbmcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc8QSBleHRlbmRzIEFubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEE+Ci0JaW1wbGVtZW50cyBKYXZhQmFzZUVtYmVkZGVkTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkYWJsZSB0YXJnZXRFbWJlZGRhYmxlOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFRhcmdldEVtYmVkZGFibGUodGhpcy5idWlsZFRhcmdldEVtYmVkZGFibGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIodGhpcywgdGhpcy5idWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKTsKLQotCi0JLy8gKioqKioqKioqKiB0YXJnZXQgZW1iZWRkYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRW1iZWRkYWJsZSBnZXRUYXJnZXRFbWJlZGRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRFbWJlZGRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldEVtYmVkZGFibGUoRW1iZWRkYWJsZSBlbWJlZGRhYmxlKSB7Ci0JCUVtYmVkZGFibGUgb2xkID0gdGhpcy50YXJnZXRFbWJlZGRhYmxlOwotCQl0aGlzLnRhcmdldEVtYmVkZGFibGUgPSBlbWJlZGRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0VNQkVEREFCTEVfUFJPUEVSVFksIG9sZCwgZW1iZWRkYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgYnVpbGRUYXJnZXRFbWJlZGRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0RW1iZWRkYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbWJlZGRlZCBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgOgotCQkJCXN1cGVyLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWFsaWZpZWRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9PVkVSUklEQUJMRV9BVFRSSUJVVEVfTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKSA6Ci0JCQkJc3VwZXIuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEVtYmVkZGFibGVPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWFsaWZpZWRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9PVkVSUklEQUJMRV9BU1NPQ0lBVElPTl9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRRdWFsaWZpZWRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPih0aGlzLmdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXModHJhbnNmb3JtZXIpLCB0aGlzLmJ1aWxkUXVhbGlmaWVyVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcyhUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+PiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzTGlzdHModHJhbnNmb3JtZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGxpc3RzOyBlYWNoIG5lc3RlZCBsaXN0IGhvbGRzIHRoZSBuYW1lcyBmb3Igb25lIG9mIHRoZQotCSAqIGVtYmVkZGVkIG1hcHBpbmcncyB0YXJnZXQgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcncyBhdHRyaWJ1dGUgbWFwcGluZ3MKLQkgKiAoYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uIG1hcHBpbmdzLCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm1lcikuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFN0cmluZz4+IGdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXNMaXN0cyhUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+PiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4odGhpcy5nZXRFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFyZ2V0IGVtYmVkZGFibGUncyBhdHRyaWJ1dGUgbWFwcGluZ3MuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpIHsKLQkJcmV0dXJuICgodGhpcy50YXJnZXRFbWJlZGRhYmxlICE9IG51bGwpICYmICh0aGlzLnRhcmdldEVtYmVkZGFibGUgIT0gdGhpcy5nZXRUeXBlTWFwcGluZygpKSkgPwotCQkJCXRoaXMudGFyZ2V0RW1iZWRkYWJsZS5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxBdHRyaWJ1dGVNYXBwaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW5fKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uXyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlhdHRyaWJ1dGVOYW1lID0gdGhpcy51bnF1YWxpZnkoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlID0gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQkvLyByZWN1cnNlIGludG8gdGhlIHRhcmdldCBlbWJlZGRhYmxlIGlmIG5lY2Vzc2FyeQotCQlyZXR1cm4gKG92ZXJyaWRlICE9IG51bGwpID8gb3ZlcnJpZGUuZ2V0Q29sdW1uKCkgOiB0aGlzLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uSW5UYXJnZXRFbWJlZGRhYmxlKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW5JblRhcmdldEVtYmVkZGFibGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLnRhcmdldEVtYmVkZGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy50YXJnZXRFbWJlZGRhYmxlLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQotCQlpZiAodGhpcy52YWxpZGF0ZVRhcmdldEVtYmVkZGFibGUobWVzc2FnZXMsIGFzdFJvb3QpKSB7Ci0JCQl0aGlzLnZhbGlkYXRlT3ZlcnJpZGVzKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVRhcmdldEVtYmVkZGFibGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLnRhcmdldEVtYmVkZGFibGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJU3RyaW5nIHRhcmdldEVtYmVkZGFibGVUeXBlTmFtZSA9IHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCk7Ci0JCS8vIGlmIHRoZSB0eXBlIGlzbid0IHJlc29sdmFibGUsIHRoZXJlIHdpbGwgYWxyZWFkeSBiZSBhIGphdmEgY29tcGlsZSBlcnJvcgotCQlpZiAodGFyZ2V0RW1iZWRkYWJsZVR5cGVOYW1lICE9IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9OT1RfQU5fRU1CRUREQUJMRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0YXJnZXRFbWJlZGRhYmxlVHlwZU5hbWV9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU92ZXJyaWRlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIgb3duZXIgKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcgotCXsKLQkJcHVibGljIEphdmFSZXNvdXJjZU1lbWJlciBnZXRSZXNvdXJjZU1lbWJlcigpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRUYXJnZXRFbWJlZGRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzKCkgewotCQkJVHlwZU1hcHBpbmcgb3ZlcnJpZGRlblR5cGVNYXBwaW5nID0gdGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKG92ZXJyaWRkZW5UeXBlTWFwcGluZyAhPSBudWxsKSA/IHRoaXMuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc18ob3ZlcnJpZGRlblR5cGVNYXBwaW5nKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHByZS1jb25kaXRpb246IHR5cGUgbWFwcGluZyBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLQkJICogPHA+Ci0JCSAqIE5COiBPdmVycmlkZGVuIGluIHtAbGluayBHZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nLkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXJ9Ci0JCSAqLwotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzXyhUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcpIHsKLQkJCXJldHVybiBvdmVycmlkZGVuVHlwZU1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbih0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFBvc3NpYmxlUHJlZml4KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFdyaXRlUHJlZml4KCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBubyBtYXBzLCBzbyBhbGwgb3ZlcnJpZGVzIGFyZSByZWxldmFudAotCQlwdWJsaWMgYm9vbGVhbiBpc1JlbGV2YW50KFN0cmluZyBvdmVycmlkZU5hbWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZy50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIChBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIGNvbHVtbiwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmZTlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFCYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUxvYkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5OYW1lZENvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuTnVsbEphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIGJhc2ljIG1hcHBpbmcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzxCYXNpY0Fubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhQmFzaWNNYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGRlZmF1bHRGZXRjaDsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRPcHRpb25hbDsKLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGNvbnZlcnRlcjsgIC8vIG5ldmVyIG51bGwKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQ29udmVydGVyLkFkYXB0ZXJbXSBDT05WRVJURVJfQURBUFRFUl9BUlJBWSA9IG5ldyBKYXZhQ29udmVydGVyLkFkYXB0ZXJbXSB7Ci0JCUphdmFFbnVtZXJhdGVkQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJSmF2YVRlbXBvcmFsQ29udmVydGVyLkJhc2ljQWRhcHRlci5pbnN0YW5jZSgpLAotCQlKYXZhTG9iQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKQotCX07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+IENPTlZFUlRFUl9BREFQVEVSUyA9IG5ldyBBcnJheUl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4oQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkpOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbHVtbiA9IHRoaXMuYnVpbGRDb2x1bW4oKTsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRGZXRjaCgpOwotCQl0aGlzLnNwZWNpZmllZE9wdGlvbmFsID0gdGhpcy5idWlsZFNwZWNpZmllZE9wdGlvbmFsKCk7Ci0JCXRoaXMuY29udmVydGVyID0gdGhpcy5idWlsZENvbnZlcnRlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNvbHVtbi5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKHRoaXMuYnVpbGRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRPcHRpb25hbF8odGhpcy5idWlsZFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQl0aGlzLnN5bmNDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbHVtbi51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0RmV0Y2godGhpcy5idWlsZERlZmF1bHRGZXRjaCgpKTsKLQkJdGhpcy5zZXREZWZhdWx0T3B0aW9uYWwodGhpcy5idWlsZERlZmF1bHRPcHRpb25hbCgpKTsKLQkJdGhpcy5jb252ZXJ0ZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbHVtbiBidWlsZENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEZldGNoICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRGZXRjaCA6IHRoaXMuZGVmYXVsdEZldGNoOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQoZmV0Y2gsIHRoaXMuc3BlY2lmaWVkRmV0Y2gpKSB7Ci0JCQl0aGlzLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKS5zZXRGZXRjaChGZXRjaFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChmZXRjaCkpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8oZmV0Y2gpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkU3BlY2lmaWVkRmV0Y2goKSB7Ci0JCUJhc2ljQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogRmV0Y2hUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChhbm5vdGF0aW9uLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JCXRoaXMuZGVmYXVsdEZldGNoID0gZmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkRGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcHRpb25hbCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE9wdGlvbmFsLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRPcHRpb25hbCgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChvcHRpb25hbCwgdGhpcy5zcGVjaWZpZWRPcHRpb25hbCkpIHsKLQkJCXRoaXMuZ2V0QW5ub3RhdGlvbkZvclVwZGF0ZSgpLnNldE9wdGlvbmFsKG9wdGlvbmFsKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKG9wdGlvbmFsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IG9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE9wdGlvbmFsKCkgewotCQlCYXNpY0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0T3B0aW9uYWwoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9wdGlvbmFsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0T3B0aW9uYWw7Ci0JCXRoaXMuZGVmYXVsdE9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfT1BUSU9OQUw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IGNvbnZlcnRlclR5cGUpIHsKLQkJCXRoaXMuY29udmVydGVyLmRpc3Bvc2UoKTsKLQkJCUphdmFDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJdGhpcy5yZXRhaW5Db252ZXJ0ZXJBbm5vdGF0aW9uKGNvbnZlcnRlckFkYXB0ZXIpOwotCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyQWRhcHRlcikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJIHJldHVybiAoY29udmVydGVyQWRhcHRlciAhPSBudWxsKSA/Ci0JCQkJY29udmVydGVyQWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyXyhKYXZhQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlDb252ZXJ0ZXIgb2xkID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgYWxsIHRoZSBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMgPGVtPmV4Y2VwdDwvZW0+IGZvciB0aGUgYW5ub3RhdGlvbgotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyLiBJZiB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgcmVtb3ZlIDxlbT5hbGw8L2VtPiB0aGUgY29udmVydGVyIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJldGFpbkNvbnZlcnRlckFubm90YXRpb24oSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlciAhPSBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCQkJYWRhcHRlci5yZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKCkgewotCQlKcGFGYWN0b3J5IGpwYUZhY3RvcnkgPSB0aGlzLmdldEpwYUZhY3RvcnkoKTsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLCBqcGFGYWN0b3J5KTsKLQkJCWlmIChqYXZhQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ29udmVydGVyKCkgewotCQlBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+IGFzc29jID0gdGhpcy5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhc3NvYyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8odGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA9IGFzc29jLmdldEtleSgpOwotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXNzb2MuZ2V0VmFsdWUoKTsKLQkJCWlmICgodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSAmJgotCQkJCQkodGhpcy5jb252ZXJ0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpID09IGFubm90YXRpb24pKSB7Ci0JCQkJdGhpcy5jb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8oYWRhcHRlci5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCB0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBjb252ZXJ0ZXIgYW5ub3RhdGlvbiB3ZSBmaW5kIGFsb25nIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiBhZGFwdGVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNvbnZlcnRlciBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb248SmF2YUNvbnZlcnRlci5BZGFwdGVyLCBBbm5vdGF0aW9uPiBnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+KGFkYXB0ZXIsIGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkTnVsbENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsSmF2YUNvbnZlcnRlcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIuQWRhcHRlciBnZXRDb252ZXJ0ZXJBZGFwdGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIENPTlZFUlRFUl9BREFQVEVSUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2wsIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZENvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMuY29sdW1uLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMuY29udmVydGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuY29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YjVlM2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFbWJlZGRhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZzxFbWJlZGRhYmxlQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFFbWJlZGRhYmxlCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUVtYmVkZGFibGUoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW1iZWRkYWJsZUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBtYXBwaW5nQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJZENsYXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjYwNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSBlbWJlZGRlZCBJRCBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFbWJlZGRlZElkTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQmFzZUVtYmVkZGVkTWFwcGluZzxFbWJlZGRlZElkQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEVtYmVkZGVkSWRNYXBwaW5nMl8wLCBKYXZhRW1iZWRkZWRJZE1hcHBpbmcKLXsKLQkvKiBKUEEgMi4wIC0gdGhlIGVtYmVkZGVkIGlkIG1heSBiZSBkZXJpdmVkIGZyb20gYSByZWxhdGlvbnNoaXAgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXJpdmVkOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRW1iZWRkZWRJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlcml2ZWQodGhpcy5idWlsZERlcml2ZWQoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlcml2ZWQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEZXJpdmVkKCkgewotCQlyZXR1cm4gdGhpcy5kZXJpdmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlcml2ZWQoYm9vbGVhbiBkZXJpdmVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZXJpdmVkOwotCQl0aGlzLmRlcml2ZWQgPSBkZXJpdmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVSSVZFRF9QUk9QRVJUWSwgb2xkLCBkZXJpdmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlcml2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpICYmIHRoaXMuYnVpbGREZXJpdmVkXygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVyaXZlZF8oKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuYXR0cmlidXRlSXNEZXJpdmVkSWQodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gKHRoaXMuZGVyaXZlZCkgPwotCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkgOgotCQkJc3VwZXIuZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0KLQkJLy8gW0pQQSAyLjBdIGlmIHRoZSBlbWJlZGRlZCBpZCBpcyBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAsIHRoZW4gYW55IHNwZWNpZmllZAotCQkvLyBhdHRyaWJ1dGUgb3ZlcnJpZGVzIGFyZSBpbiBlcnJvcgotCQkvLyAoaW4gSlBBIDEuMCwgdGhpcyB3aWxsIG9idmlvdXNseSBuZXZlciBiZSByZWFjaGVkKQotCQlpZiAodGhpcy5kZXJpdmVkCi0JCQkJJiYgKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpID4gMCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVNQkVEREVEX0lEX01BUFBJTkdfTUFQUEVEX0JZX1JFTEFUSU9OU0hJUF9BTkRfQVRUUklCVVRFX09WRVJSSURFU19TUEVDSUZJRUQsCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwKLQkJCQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyIG93bmVyICoqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPEVtYmVkZGVkSWRBbm5vdGF0aW9uPi5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbWJlZGRlZElkTWFwcGluZy50aGlzLmlzRGVyaXZlZCgpID8KLQkJCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkgOgotCQkJCQlzdXBlci5nZXRBbGxPdmVycmlkYWJsZU5hbWVzKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc18oVHlwZU1hcHBpbmcgb3ZlcnJpZGRlblR5cGVNYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oc3VwZXIuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc18ob3ZlcnJpZGRlblR5cGVNYXBwaW5nKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJCQlyZXR1cm4gISBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5hdHRyaWJ1dGVJc0Rlcml2ZWRJZChhdHRyaWJ1dGVOYW1lKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDkwNTNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Kb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSBlbWJlZGRlZCBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFFbWJlZGRlZE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2VFbWJlZGRlZE1hcHBpbmc8RW1iZWRkZWRBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YUVtYmVkZGVkTWFwcGluZzJfMAotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRW1iZWRkZWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldEpwYUZhY3RvcnkyXzAoKS5idWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIHRoaXMuYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSkgOgotCQkJCW5ldyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIodGhpcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lck93bmVyKCkgewotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbWJlZGRlZCBtYXBwaW5ncyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIG9ubHkgdG8gYnVpbGQgdGhlIGNob2ljZXMgZm9yIGEgIm1hcHBlZCBieSIgc2V0dGluZyBpbiBhCi0JICogcmVsYXRpb25zaGlwIG1hcHBpbmcuIEpQQSAyLjAgZG9lcyBub3Qgc3VwcG9ydCByZWxhdGlvbnNoaXAgbWFwcGluZ3MKLQkgKiBpbiBhbiBlbWJlZGRlZCBJRCBjbGFzczsgc28gd2Ugb25seSBwdXQgdGhpcyBsb2dpYyBoZXJlLgotCSAqLwotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCW5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KHN1cGVyLmdldEFsbE1hcHBpbmdOYW1lcygpLCB0aGlzLmdldEFsbEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSkgOgotCQkJCXN1cGVyLmdldEFsbE1hcHBpbmdOYW1lcygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFF1YWxpZmllZEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lcyhBdHRyaWJ1dGVNYXBwaW5nVG9vbHMuQUxMX01BUFBJTkdfTkFNRVNfVFJBTlNGT1JNRVIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZWRNYXBwaW5nID0gc3VwZXIucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChyZXNvbHZlZE1hcHBpbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc29sdmVkTWFwcGluZzsKLQkJfQotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/IHRoaXMucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmdfKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZ18oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJYXR0cmlidXRlTmFtZSA9IHRoaXMudW5xdWFsaWZ5KGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyByZWN1cnNlIGludG8gdGhlIGVtYmVkZGFibGUgbWFwcGluZ3MKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgOiB0aGlzLmdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpKSB7Ci0JCQlBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVkTWFwcGluZyA9IG1hcHBpbmcucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAocmVzb2x2ZWRNYXBwaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyB0aGlzLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwXyhhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcF8oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJYXR0cmlidXRlTmFtZSA9IHRoaXMudW5xdWFsaWZ5KGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCS8vIHJlY3Vyc2UgaW50byB0aGUgdGFyZ2V0IGVtYmVkZGFibGUgaWYgbmVjZXNzYXJ5Ci0JCXJldHVybiAob3ZlcnJpZGUgIT0gbnVsbCkgPyBvdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSA6IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXBJblRhcmdldEVtYmVkZGFibGUoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcEluVGFyZ2V0RW1iZWRkYWJsZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKHRoaXMudGFyZ2V0RW1iZWRkYWJsZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnRhcmdldEVtYmVkZGFibGUucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlT3ZlcnJpZGVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlT3ZlcnJpZGVzKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyIG93bmVyICoqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEphdmFCYXNlRW1iZWRkZWRNYXBwaW5nPEVtYmVkZGVkQW5ub3RhdGlvbj4uQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCXsKLQkJLy8gbm90aGluZyB5ZXQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJaW1wbGVtZW50cyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcgotCXsKLQkJcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRSZXNvdXJjZU1lbWJlcigpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVtYmVkZGVkTWFwcGluZy50aGlzLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRUYXJnZXRFbWJlZGRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzKCkgewotCQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgPyB0eXBlTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCh0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UG9zc2libGVQcmVmaXgoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0V3JpdGVQcmVmaXgoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG5vIG1hcHMsIHNvIGFsbCBvdmVycmlkZXMgYXJlIHJlbGV2YW50Ci0JCXB1YmxpYyBib29sZWFuIGlzUmVsZXZhbnQoU3RyaW5nIG92ZXJyaWRlTmFtZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZE92ZXJyaWRlVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIE92ZXJyaWRlQ29udGFpbmVyIGNvbnRhaW5lciwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlKSBvdmVycmlkZSwgKEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIpIGNvbnRhaW5lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbWJlZGRhYmxlT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBSZWFkT25seUJhc2VDb2x1bW4uT3duZXIgb3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUpIG92ZXJyaWRlLCAoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIChSZWFkT25seUpvaW5Db2x1bW4uT3duZXIpIG93bmVyLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIG92ZXJyaWRlLCBjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEpvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgb3ZlcnJpZGUsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgSm9pblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZVZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgb3ZlcnJpZGUsIChSZWFkT25seUpvaW5UYWJsZSkgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVtYmVkZGVkTWFwcGluZy50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2YjRhNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm90TnVsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb24uU3VwcG9ydGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5CYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVudGl0eVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVHlwZU1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVudGl0eVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuR2VuZXJpY0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Kb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuU2Vjb25kYXJ5VGFibGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5UYWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3ZlcnJpZGVDb250YWluZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSBlbnRpdHkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUVudGl0eQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmc8RW50aXR5QW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFFbnRpdHksIEphdmFDYWNoZWFibGVIb2xkZXIyXzAsIEphdmFHZW5lcmF0b3JDb250YWluZXIuT3duZXIsIEphdmFRdWVyeUNvbnRhaW5lci5Pd25lcgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotCi0JcHJvdGVjdGVkIEVudGl0eSByb290RW50aXR5OwotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8RW50aXR5PiBkZXNjZW5kYW50cyA9IG5ldyBWZWN0b3I8RW50aXR5PigpOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWZlcmVuY2U7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVRhYmxlIHRhYmxlOwotCXByb3RlY3RlZCBib29sZWFuIHNwZWNpZmllZFRhYmxlSXNBbGxvd2VkOwotCXByb3RlY3RlZCBib29sZWFuIHRhYmxlSXNVbmRlZmluZWQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVNlY29uZGFyeVRhYmxlLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBUYWJsZS5Pd25lciBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZU93bmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgcHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcjsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3k7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkOwotCXByb3RlY3RlZCBib29sZWFuIGRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGRpc2NyaW1pbmF0b3JDb2x1bW47Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQ7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFHZW5lcmF0b3JDb250YWluZXIgZ2VuZXJhdG9yQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUXVlcnlDb250YWluZXIgcXVlcnlDb250YWluZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW50aXR5QW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIG1hcHBpbmdBbm5vdGF0aW9uKTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gdGhpcy5tYXBwaW5nQW5ub3RhdGlvbi5nZXROYW1lKCk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZSA9IHRoaXMuYnVpbGRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZU93bmVyID0gdGhpcy5idWlsZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lcigpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gdGhpcy5nZXREaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uID0gdGhpcy5idWlsZERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJLy8gc3RhcnQgd2l0aCB0aGUgZW50aXR5IGFzIHRoZSByb290IC0gaXQgd2lsbCBiZSByZWNhbGN1bGF0ZWQgaW4gdXBkYXRlKCkKLQkJdGhpcy5yb290RW50aXR5ID0gdGhpczsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lciA9IHRoaXMuYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKTsKLQkJdGhpcy5xdWVyeUNvbnRhaW5lciA9IHRoaXMuYnVpbGRRdWVyeUNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRoaXMubWFwcGluZ0Fubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJdGhpcy5pZENsYXNzUmVmZXJlbmNlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy50YWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQl0aGlzLnN5bmNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVfKHRoaXMuZ2V0RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbigpLmdldFZhbHVlKCkpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5idWlsZERlZmF1bHROYW1lKCkpOwotCi0JCS8vIGNhbGN1bGF0ZSByb290IGVudGl0eSBlYXJseSAtIG90aGVyIHRoaW5ncyBkZXBlbmQgb24gaXQKLQkJdGhpcy5zZXRSb290RW50aXR5KHRoaXMuYnVpbGRSb290RW50aXR5KCkpOwotCQl0aGlzLnVwZGF0ZURlc2NlbmRhbnRzKCk7Ci0KLQkJdGhpcy5pZENsYXNzUmVmZXJlbmNlLnVwZGF0ZSgpOwotCi0JCXRoaXMudGFibGUudXBkYXRlKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVJc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKCkpOwotCQl0aGlzLnNldFRhYmxlSXNVbmRlZmluZWQodGhpcy5idWlsZFRhYmxlSXNVbmRlZmluZWQoKSk7Ci0KLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNlY29uZGFyeVRhYmxlcygpKTsKLQotCQl0aGlzLnVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCi0JCXRoaXMuc2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3kodGhpcy5idWlsZERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCi0JCXRoaXMuc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSh0aGlzLmJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpKTsKLQkJdGhpcy5zZXREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCh0aGlzLmJ1aWxkRGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0KLQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLnVwZGF0ZSgpOwotCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0JCXRoaXMuc2V0RGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKHRoaXMuYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSk7Ci0KLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnVwZGF0ZSgpOwotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE5hbWUgOiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubWFwcGluZ0Fubm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyhuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm9vdCBlbnRpdHkgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eSBnZXRSb290RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5yb290RW50aXR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJvb3RFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlFbnRpdHkgb2xkID0gdGhpcy5yb290RW50aXR5OwotCQl0aGlzLnJvb3RFbnRpdHkgPSBlbnRpdHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChST09UX0VOVElUWV9QUk9QRVJUWSwgb2xkLCBlbnRpdHkpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHkgYnVpbGRSb290RW50aXR5KCkgewotCQlFbnRpdHkgcm9vdCA9IHRoaXM7Ci0JCWZvciAoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgOiB0aGlzLmdldEFuY2VzdG9ycygpKSB7Ci0JCQlpZiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlyb290ID0gKEVudGl0eSkgdHlwZU1hcHBpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlc2NlbmRhbnRzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxFbnRpdHk+IGdldERlc2NlbmRhbnRzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxFbnRpdHk+KHRoaXMuZGVzY2VuZGFudHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlc2NlbmRhbnRzKCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbih0aGlzLmJ1aWxkRGVzY2VuZGFudHMoKSwgdGhpcy5kZXNjZW5kYW50cywgREVTQ0VOREFOVFNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEVudGl0eT4gYnVpbGREZXNjZW5kYW50cygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxFbnRpdHk+KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXRpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRW50aXR5IGVudGl0eSkgewotCQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5lbnRpdHlJc0Rlc2NlbmRhbnQoZW50aXR5KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBzcGVjaWZpZWQgZW50aXR5IGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgZW50aXR5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGVudGl0eUlzRGVzY2VuZGFudChFbnRpdHkgZW50aXR5KSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBlbnRpdHlUeXBlTmFtZSA9IGVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJvb3RFbnRpdHlUeXBlTmFtZSA9IGVudGl0eS5nZXRSb290RW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodHlwZU5hbWUsIGVudGl0eVR5cGVOYW1lKSAmJgotCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHR5cGVOYW1lLCByb290RW50aXR5VHlwZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZCBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUlkQ2xhc3NSZWZlcmVuY2UgZ2V0SWRDbGFzc1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzc1JlZmVyZW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUlkQ2xhc3NSZWZlcmVuY2UgYnVpbGRJZENsYXNzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhSWRDbGFzc1JlZmVyZW5jZSh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldElkQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3NSZWZlcmVuY2UuZ2V0SWRDbGFzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVRhYmxlIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVRhYmxlIGJ1aWxkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFUYWJsZSh0aGlzLCB0aGlzLmJ1aWxkVGFibGVPd25lcigpKTsgIAotCX0KLQotCXByb3RlY3RlZCBKYXZhVGFibGUuT3duZXIgYnVpbGRUYWJsZU93bmVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlT3duZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoYm9vbGVhbiBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQgPSBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9JU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKCkgewotCQlyZXR1cm4gISB0aGlzLmlzQWJzdHJhY3RUYWJsZVBlckNsYXNzKCkgJiYgISB0aGlzLmlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVJc1VuZGVmaW5lZCgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVJc1VuZGVmaW5lZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUlzVW5kZWZpbmVkKGJvb2xlYW4gdGFibGVJc1VuZGVmaW5lZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMudGFibGVJc1VuZGVmaW5lZDsKLQkJdGhpcy50YWJsZUlzVW5kZWZpbmVkID0gdGFibGVJc1VuZGVmaW5lZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCB0YWJsZUlzVW5kZWZpbmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFRhYmxlSXNVbmRlZmluZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzQWJzdHJhY3RUYWJsZVBlckNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogPHVsPgotCSAqIDxsaT5JZiB0aGUgZW50aXR5IGlzIHBhcnQgb2YgYSBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LCB0aGUgdGFibGUKLQkgKiBuYW1lIGRlZmF1bHRzIHRvIHRoZSByb290IGVudGl0eSdzIHRhYmxlIG5hbWUuCi0JICogPGxpPklmIHRoZSBlbnRpdHkgaXMgYWJzdHJhY3QgYW5kIHBhcnQgb2YgYSB0YWJsZSBwZXIgY2xhc3MKLQkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHRoZSB0YWJsZSBuYW1lIGRlZmF1bHRzIHRvIG51bGwsIGFzIG5vIHRhYmxlIGFwcGxpZXMuCi0JICogPGxpPk90aGVyd2lzZSwgdGhlIHRhYmxlIG5hbWUgZGVmYXVsdHMgdG8gdGhlIGVudGl0eSBuYW1lLgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5pc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpID8KLQkJCQl0aGlzLnJvb3RFbnRpdHkuZ2V0VGFibGUoKS5nZXROYW1lKCkgOgotCQkJCXRoaXMuaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSA/IG51bGwgOiB0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICNnZXREZWZhdWx0VGFibGVOYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCkgPwotCQkJCXRoaXMucm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldFNjaGVtYSgpIDoKLQkJCQl0aGlzLmlzQWJzdHJhY3RUYWJsZVBlckNsYXNzKCkgPyBudWxsIDogdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgI2dldERlZmF1bHRUYWJsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCkgPwotCQkJCXRoaXMucm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldENhdGFsb2coKSA6Ci0JCQkJdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpID8gbnVsbCA6IHRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlY29uZGFyeSB0YWJsZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhU2Vjb25kYXJ5VGFibGU+IGdldFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVNlY29uZGFyeVRhYmxlPiBnZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHRoaXMuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYWRkU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKGluZGV4KTsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gYWRkU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQlyZXR1cm4gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSh0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCgoSmF2YVNlY29uZGFyeVRhYmxlKSBzZWNvbmRhcnlUYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVNlY29uZGFyeVRhYmxlIGJ1aWxkU2Vjb25kYXJ5VGFibGUoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhU2Vjb25kYXJ5VGFibGUodGhpcywgdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZU93bmVyLCBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8U2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPiBnZXRTZWNvbmRhcnlUYWJsZUFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTZWNvbmRhcnlUYWJsZUFubm90YXRpb25zXygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8U2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPiBnZXRTZWNvbmRhcnlUYWJsZUFubm90YXRpb25zXygpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uc18oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldE5lc3RhYmxlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uc18oKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhU2Vjb25kYXJ5VGFibGUsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4gYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhU2Vjb25kYXJ5VGFibGUsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF2YVNlY29uZGFyeVRhYmxlIGJ1aWxkQ29udGV4dEVsZW1lbnQoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmJ1aWxkU2Vjb25kYXJ5VGFibGUocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0U2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChKYXZhU2Vjb25kYXJ5VGFibGUgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRUYWJsZUFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBUYWJsZS5Pd25lciBidWlsZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIDogdGhpcy5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW5kZXgpOwotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKGluZGV4LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25zXygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25zXygpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uc18oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uc18oKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lciwgcHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4sIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldENvbHVtbkFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBwa0pvaW5Db2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1BST1BFUlRZLCBvbGQsIHBrSm9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJaWYgKHRoaXMuYnVpbGRzRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpIHsKLQkJCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5idWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4udXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkc0RlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKG5ldyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaGVyaXRhbmNlIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgOiB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSwgaW5oZXJpdGFuY2VUeXBlKSkgewotCQkJdGhpcy5nZXRJbmhlcml0YW5jZUFubm90YXRpb24oKS5zZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChpbmhlcml0YW5jZVR5cGUpKTsKLQkJCXRoaXMucmVtb3ZlSW5oZXJpdGFuY2VBbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5Xyhpbmhlcml0YW5jZVR5cGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8oSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSkgewotCQlJbmhlcml0YW5jZVR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCQl0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPSBpbmhlcml0YW5jZVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgaW5oZXJpdGFuY2VUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGJ1aWxkU3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIEluaGVyaXRhbmNlVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGhpcy5nZXRJbmhlcml0YW5jZUFubm90YXRpb24oKS5nZXRTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCUluaGVyaXRhbmNlVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCQl0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5ID0gaW5oZXJpdGFuY2VUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTkhFUklUQU5DRV9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBpbmhlcml0YW5jZVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgYnVpbGREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNSb290RW50aXR5KCkgPyBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFIDogdGhpcy5yb290RW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5oZXJpdGFuY2UgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VBbm5vdGF0aW9uIGdldEluaGVyaXRhbmNlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChJbmhlcml0YW5jZUFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUluaGVyaXRhbmNlQW5ub3RhdGlvbklmVW5zZXQoKSB7Ci0JCWlmICh0aGlzLmdldEluaGVyaXRhbmNlQW5ub3RhdGlvbigpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVJbmhlcml0YW5jZUFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUluaGVyaXRhbmNlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihJbmhlcml0YW5jZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzY3JpbWluYXRvciB2YWx1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlIDogdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKFN0cmluZyBkaXNjcmltaW5hdG9yVmFsdWUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlLCBkaXNjcmltaW5hdG9yVmFsdWUpKSB7Ci0JCQl0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oKS5zZXRWYWx1ZShkaXNjcmltaW5hdG9yVmFsdWUpOwotCQkJdGhpcy5yZW1vdmVEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVfKGRpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVfKFN0cmluZyBkaXNjcmltaW5hdG9yVmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSA9IGRpc2NyaW1pbmF0b3JWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGRpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlOwotCQl0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUgPSBkaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIG9sZCwgZGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBGcm9tIHRoZSBTcGVjOgotCSAqIElmIHRoZSBEaXNjcmltaW5hdG9yVmFsdWUgYW5ub3RhdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBhCi0JICogcHJvdmlkZXItc3BlY2lmaWMgZnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSB2YWx1ZSByZXByZXNlbnRpbmcKLQkgKiB0aGUgZW50aXR5IHR5cGUgaXMgdXNlZCBmb3IgdGhlIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yCi0JICogY29sdW1uLiBJZiB0aGUgRGlzY3JpbWluYXRvclR5cGUgaXMgU1RSSU5HLCB0aGUgZGlzY3JpbWluYXRvcgotCSAqIHZhbHVlIGRlZmF1bHQgaXMgdGhlIGVudGl0eSBuYW1lLgotCSAqLwotCS8vIFRPRE8gZXh0ZW5zaW9uIHBvaW50IGZvciBwcm92aWRlci1zcGVjaWZpYyBmdW5jdGlvbj8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAodGhpcy5nZXREaXNjcmltaW5hdG9yVHlwZSgpID09IERpc2NyaW1pbmF0b3JUeXBlLlNUUklORykgPyB0aGlzLmdldE5hbWUoKSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKGJvb2xlYW4gYWxsb3dlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCA9IGFsbG93ZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9WQUxVRV9JU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIGFsbG93ZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkKCkgewotCQlyZXR1cm4gISB0aGlzLmlzVGFibGVQZXJDbGFzcygpICYmICEgdGhpcy5pc0Fic3RyYWN0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKGJvb2xlYW4gdW5kZWZpbmVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZDsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCA9IHVuZGVmaW5lZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0NSSU1JTkFUT1JfVkFMVUVfSVNfVU5ERUZJTkVEX1BST1BFUlRZLCBvbGQsIHVuZGVmaW5lZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYWJsZVBlckNsYXNzKCkgfHwKLQkJCQl0aGlzLmlzQWJzdHJhY3QoKSB8fAotCQkJCXRoaXMuaXNSb290Tm9EZXNjZW5kYW50c05vU3RyYXRlZ3lEZWZpbmVkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgdmFsdWUgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBnZXREaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uSWZVbnNldCgpIHsKLQkJaWYgKHRoaXMuZ2V0RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbigpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5yZW1vdmVBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzY3JpbWluYXRvciBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4odGhpcywgdGhpcy5idWlsZERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKGJvb2xlYW4gYWxsb3dlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZDsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkID0gYWxsb3dlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX0NPTFVNTl9JU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIGFsbG93ZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSAmJiB0aGlzLmlzUm9vdEVudGl0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZChib29sZWFuIHVuZGVmaW5lZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCA9IHVuZGVmaW5lZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0NSSU1JTkFUT1JfQ09MVU1OX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCB1bmRlZmluZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSB8fAotCQkJCXRoaXMuaXNSb290Tm9EZXNjZW5kYW50c05vU3RyYXRlZ3lEZWZpbmVkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIodGhpcywgbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQlyZXR1cm4gKHN1cGVyUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPyBudWxsIDogc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcih0aGlzLCBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lck93bmVyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gY2hlY2sgZm9yIGFuIG92ZXJyaWRlIGJlZm9yZSBsb29raW5nIGF0IGF0dHJpYnV0ZSBtYXBwaW5ncwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiAob3ZlcnJpZGUgIT0gbnVsbCkgPyBvdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSA6IHN1cGVyLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0b3IgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhR2VuZXJhdG9yQ29udGFpbmVyIGdldEdlbmVyYXRvckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhR2VuZXJhdG9yQ29udGFpbmVyIGJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhR2VuZXJhdG9yQ29udGFpbmVyKHRoaXMsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VUeXBlIGdldFJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8R2VuZXJhdG9yPigKLQkJCQkJc3VwZXIuZ2V0R2VuZXJhdG9ycygpLAotCQkJCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lci5nZXRHZW5lcmF0b3JzKCkKLQkJCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyeSBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFRdWVyeUNvbnRhaW5lciBnZXRRdWVyeUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFRdWVyeUNvbnRhaW5lciBidWlsZFF1ZXJ5Q29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUXVlcnlDb250YWluZXIodGhpcywgdGhpcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeUNvbnRhaW5lci5nZXRRdWVyaWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFzc29jaWF0ZWQgdGFibGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxSZWFkT25seVRhYmxlPiBnZXRBc3NvY2lhdGVkVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+KHRoaXMudGFibGUsIHRoaXMuZ2V0U2Vjb25kYXJ5VGFibGVzKCkpOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IGdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4odGhpcy5hbGxBc3NvY2lhdGVkVGFibGVzTGlzdHMoKSk7Ci0JfQotCi0JLy8gVE9ETyBlbGltaW5hdGUgZHVwbGljYXRlIHRhYmxlcz8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8UmVhZE9ubHlUYWJsZT4+IGFsbEFzc29jaWF0ZWRUYWJsZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFR5cGVNYXBwaW5nLCBJdGVyYWJsZTxSZWFkT25seVRhYmxlPj4odGhpcy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpLCBUeXBlTWFwcGluZ1Rvb2xzLkFTU09DSUFURURfVEFCTEVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvTmFtZXModGhpcy5nZXRBbGxBc3NvY2lhdGVkVGFibGVzKCkpOwotCX0KLQotCS8qKgotCSAqIHN0cmlwIG91dCA8Y29kZT5udWxsPC9jb2RlPiBuYW1lcwotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGNvbnZlcnRUb05hbWVzKEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IHRhYmxlcykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5jb252ZXJ0VG9OYW1lc18odGFibGVzKSwgTm90TnVsbEZpbHRlci48U3RyaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGNvbnZlcnRUb05hbWVzXyhJdGVyYWJsZTxSZWFkT25seVRhYmxlPiB0YWJsZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFJlYWRPbmx5VGFibGUsIFN0cmluZz4odGFibGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFJlYWRPbmx5VGFibGUgdCkgewotCQkJCXJldHVybiB0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gISB0aGlzLnRhYmxlTmFtZUlzVmFsaWQodGFibGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YWJsZU5hbWVJc1ZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVJc1VuZGVmaW5lZCB8fCB0aGlzLnRhYmxlTmFtZUlzVmFsaWRfKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVOYW1lSXNWYWxpZF8oU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkgPwotCQkJCSh0aGlzLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSkgIT0gbnVsbCkgOgotCQkJCUNvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCksIHRhYmxlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeVRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuZ2V0TmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFByaW1hcnlEYlRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5nZXREYlRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkvLyBtYXRjaGluZyBkYXRhYmFzZSBvYmplY3RzIGFuZCBpZGVudGlmaWVycyBpcyBkYXRhYmFzZSBwbGF0Zm9ybS1zcGVjaWZpYwotCQlyZXR1cm4gdGhpcy5nZXREYXRhU291cmNlKCkuc2VsZWN0VGFibGVGb3JJZGVudGlmaWVyKHRoaXMuZ2V0QWxsQXNzb2NpYXRlZERiVGFibGVzKCksIHRhYmxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogc3RyaXAgb3V0IG51bGwgZGIgdGFibGVzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU+IGdldEFsbEFzc29jaWF0ZWREYlRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlPih0aGlzLmdldEFsbEFzc29jaWF0ZWREYlRhYmxlc18oKSwgTm90TnVsbEZpbHRlci48b3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZT5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8b3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZT4gZ2V0QWxsQXNzb2NpYXRlZERiVGFibGVzXygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFJlYWRPbmx5VGFibGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU+KHRoaXMuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHRyYW5zZm9ybShSZWFkT25seVRhYmxlIGVudGl0eVRhYmxlKSB7Ci0JCQkJcmV0dXJuIGVudGl0eVRhYmxlLmdldERiVGFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5nZXREYlNjaGVtYSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKHRoaXMpOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlIGdldElkQXR0cmlidXRlKCkgewotCQlJdGVyYXRvcjxBdHRyaWJ1dGVNYXBwaW5nPiBpZEF0dHJpYnV0ZU1hcHBpbmdzID0gdGhpcy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpLml0ZXJhdG9yKCk7Ci0JCWlmIChpZEF0dHJpYnV0ZU1hcHBpbmdzLmhhc05leHQoKSkgewotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBpZEF0dHJpYnV0ZU1hcHBpbmdzLm5leHQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQlyZXR1cm4gaWRBdHRyaWJ1dGVNYXBwaW5ncy5oYXNOZXh0KCkgPyBudWxsIC8qbW9yZSB0aGFuIG9uZSovOiBhdHRyaWJ1dGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJLy8gY2hlY2sgZm9yIGFuIG92ZXJyaWRlIGJlZm9yZSBsb29raW5nIGF0IGF0dHJpYnV0ZSBtYXBwaW5ncwotCQlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuIChvdmVycmlkZSAhPSBudWxsKSA/IG92ZXJyaWRlLmdldENvbHVtbigpIDogc3VwZXIucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYWJsZVBlckNsYXNzKCkgPwotCQkJCXN1cGVyLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSA/Ci0JCQkJc3VwZXIuZ2V0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nIDogdGhpcy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpKSB7Ci0JCQlBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVkTWFwcGluZyA9IGF0dHJpYnV0ZU1hcHBpbmcucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcobmFtZSk7Ci0JCQlpZiAocmVzb2x2ZWRNYXBwaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmhlcml0YW5jZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRW50aXR5IGdldFBhcmVudEVudGl0eSgpIHsKLQkJZm9yIChUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA6IHRoaXMuZ2V0QW5jZXN0b3JzKCkpIHsKLQkJCWlmICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXJldHVybiAoRW50aXR5KSB0eXBlTWFwcGluZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzID09IHRoaXMucm9vdEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGEgZGVzY2VuZGFudCBpbiAoYXMgb3Bwb3NlZCB0byB0aGUgcm9vdCBvZikKLQkgKiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZXNjZW5kYW50KCkgewotCQlyZXR1cm4gISB0aGlzLmlzUm9vdEVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSByb290IGVudGl0eQotCSAqIG9mIGEgInNpbmdsZSB0YWJsZSIgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCkgewotCQlyZXR1cm4gdGhpcy5pc0Rlc2NlbmRhbnQoKSAmJgotCQkJCSh0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIHRoZSB0b3Agb2YgYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0JICogYW5kIGhhcyBubyBkZXNjZW5kYW50cyBhbmQgbm8gc3BlY2lmaWVkIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGhhcyBiZWVuIGRlZmluZWQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSb290Tm9EZXNjZW5kYW50c05vU3RyYXRlZ3lEZWZpbmVkKCkgewotCQlyZXR1cm4gdGhpcy5pc1Jvb3RFbnRpdHkoKSAmJgotCQkJCXRoaXMuZGVzY2VuZGFudHMuaXNFbXB0eSgpICYmCi0JCQkJKHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSA9PSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGFic3RyYWN0IGFuZCBpcyBhIHBhcnQgb2YgYQotCSAqICJ0YWJsZSBwZXIgY2xhc3MiIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNBYnN0cmFjdCgpICYmIHRoaXMuaXNUYWJsZVBlckNsYXNzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyBhIHBhcnQgb2YgYSAidGFibGUgcGVyIGNsYXNzIgotCSAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlUGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgYSBwYXJ0IG9mIGEgInRhYmxlIHBlciBjbGFzcyIKLQkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZVBlckNsYXNzRGVzY2VuZGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYWJsZVBlckNsYXNzKCkgJiYgdGhpcy5pc0Rlc2NlbmRhbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgdHlwZSBpcyBhYnN0cmFjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Fic3RyYWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuaXNBYnN0cmFjdCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkncyB0eXBlIGlzIGZpbmFsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRmluYWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5pc0ZpbmFsKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSdzIHR5cGUgaXMgYSBtZW1iZXIgb2YgYW5vdGhlciB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWVtYmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuaXNNZW1iZXJUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSdzIHR5cGUgaXMgc3RhdGljLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3RhdGljKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuaXNTdGF0aWMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy50YWJsZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA6IHRoaXMuZ2V0U2Vjb25kYXJ5VGFibGVzKCkpIHsKLQkJCXJlc3VsdCA9IHNlY29uZGFyeVRhYmxlLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogdGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJcmVzdWx0ID0gcGtKb2luQ29sdW1uLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0KLQkJdGhpcy52YWxpZGF0ZVByaW1hcnlLZXkobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy52YWxpZGF0ZVRhYmxlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWZvciAoSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlIDogdGhpcy5nZXRTZWNvbmRhcnlUYWJsZXMoKSkgewotCQkJc2Vjb25kYXJ5VGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQl0aGlzLnZhbGlkYXRlSW5oZXJpdGFuY2UobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogdGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJcGtKb2luQ29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5xdWVyeUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlRW50aXR5TmFtZShtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpICYmICEgdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRW50aXR5TmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXROYW1lKCkpKXsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX05BTUVfTUlTU0lORywKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCl9LCAKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByaW1hcnlLZXkoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5idWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkUHJpbWFyeUtleVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yKHRoaXMsIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVudGl0eVRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRW50aXR5VGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUYWJsZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpKSB7Ci0JCQlpZiAodGhpcy50YWJsZS5pc1NwZWNpZmllZEluUmVzb3VyY2UoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9BQlNUUkFDVF9UQUJMRV9QRVJfQ0xBU1NfREVGSU5FU19UQUJMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMudGFibGUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5pc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpICYmIHRoaXMuZ2V0RGF0YVNvdXJjZSgpLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKSkgewotCQkJaWYgKHRoaXMuc3BlY2lmaWVkVGFibGVEb2VzTm90TWF0Y2hSb290VGFibGUoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy50YWJsZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMudGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IHNwZWNpZmllcyBhIHRhYmxlIGFuZCBpdCBpcyBhIGRpZmZlcmVudCB0YWJsZQotCSAqIHRoYW4gdGhlIHJvb3QgZW50aXR5J3MgdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkVGFibGVEb2VzTm90TWF0Y2hSb290VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLmlzU3BlY2lmaWVkSW5SZXNvdXJjZSgpICYmCi0JCQkodGhpcy50YWJsZS5nZXREYlRhYmxlKCkgIT0gdGhpcy5nZXRSb290RW50aXR5KCkuZ2V0VGFibGUoKS5nZXREYlRhYmxlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW5oZXJpdGFuY2UoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWxpZGF0ZUluaGVyaXRhbmNlU3RyYXRlZ3kobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlRGlzY3JpbWluYXRvckNvbHVtbihtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlRGlzY3JpbWluYXRvclZhbHVlKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCAmJiAhIHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKSB7Ci0JCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQllbHNlIGlmICh0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uaXNSZXNvdXJjZVNwZWNpZmllZCgpKSB7Ci0JCQlpZiAodGhpcy5pc0Rlc2NlbmRhbnQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVELAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXREaXNjcmltaW5hdG9yQ29sdW1uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0RGlzY3JpbWluYXRvckNvbHVtblRleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRGlzY3JpbWluYXRvclZhbHVlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCAmJiAodGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgIT0gbnVsbCkpIHsKLQkJCWlmICh0aGlzLmlzQWJzdHJhY3QoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0RGlzY3JpbWluYXRvclZhbHVlVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSW5oZXJpdGFuY2VTdHJhdGVneShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3VwcG9ydGVkIHRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQgPSB0aGlzLmdldEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkuZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpOwotCQlpZiAodGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCA9PSBTdXBwb3J0ZWQuWUVTKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCh0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSA9PSBJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSAmJiB0aGlzLmlzUm9vdEVudGl0eSgpKSB7Ci0JCQlpZiAodGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCA9PSBTdXBwb3J0ZWQuTk8pIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0sCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1BPUlRBQkxFX09OX1BMQVRGT1JNLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5VGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXREaXNjcmltaW5hdG9yVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0RGlzY3JpbWluYXRvckNvbHVtblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldEluaGVyaXRhbmNlQW5ub3RhdGlvbigpLmdldFN0cmF0ZWd5VGV4dFJhbmdlKGFzdFJvb3QpLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT3JtT3ZlcnJpZGVDb250YWluZXIuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogc29tZSBjb21tb24gYmVoYXZpb3IKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlpbXBsZW1lbnRzIEphdmFPdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcgotCXsKLQkJcHVibGljIEphdmFSZXNvdXJjZU1lbWJlciBnZXRSZXNvdXJjZU1lbWJlcigpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCX0KLQotCQlwdWJsaWMgQWJzdHJhY3RKYXZhRW50aXR5IGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCQlUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAob3ZlcnJpZGRlblR5cGVNYXBwaW5nICE9IG51bGwpID8gdGhpcy5nZXRBbGxPdmVycmlkYWJsZU5hbWVzXyhvdmVycmlkZGVuVHlwZU1hcHBpbmcpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogcHJlLWNvbmRpdGlvbjogPGNvZGU+dHlwZU1hcHBpbmc8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lc18oVHlwZU1hcHBpbmcgb3ZlcnJpZGRlblR5cGVNYXBwaW5nKTsKLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQb3NzaWJsZVByZWZpeCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRXcml0ZVByZWZpeCgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gbm8gbWFwcywgc28gYWxsIG92ZXJyaWRlcyBhcmUgcmVsZXZhbnQKLQkJcHVibGljIGJvb2xlYW4gaXNSZWxldmFudChTdHJpbmcgb3ZlcnJpZGVOYW1lKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlleHRlbmRzIE92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzXyhUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPihvdmVycmlkZGVuVHlwZU1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCQkJCXJldHVybiAhIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIudGhpcy5nZXRUeXBlTWFwcGluZygpLmF0dHJpYnV0ZUlzRGVyaXZlZElkKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4odGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCksIGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZE92ZXJyaWRlVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIE92ZXJyaWRlQ29udGFpbmVyIGNvbnRhaW5lciwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvcigoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIChBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IE1hcHBlZFN1cGVyY2xhc3NPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lck93bmVyCi0JCWV4dGVuZHMgT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlpbXBsZW1lbnRzIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wLk93bmVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lc18oVHlwZU1hcHBpbmcgb3ZlcnJpZGRlblR5cGVNYXBwaW5nKSB7Ci0JCQlyZXR1cm4gb3ZlcnJpZGRlblR5cGVNYXBwaW5nLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCh0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVWYWxpZGF0b3IoKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSkgb3ZlcnJpZGUsIChBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKSBjb250YWluZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgTWFwcGVkU3VwZXJjbGFzc092ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uVmFsaWRhdG9yKChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUpIG92ZXJyaWRlLCAoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIChSZWFkT25seUpvaW5Db2x1bW4uT3duZXIpIG93bmVyLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3Iob3ZlcnJpZGUsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgSm9pblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKG92ZXJyaWRlLCBjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEpvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seVRhYmxlIHQsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVZhbGlkYXRvcihvdmVycmlkZSwgKFJlYWRPbmx5Sm9pblRhYmxlKSB0LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YU5hbWVkQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIHNvbWUgY29tbW9uIGJlaGF2aW9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIE5hbWVkQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBKYXZhUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lcgotCXsKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRW50aXR5LnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhQmFzZUpvaW5Db2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIKLQkJZXh0ZW5kcyBOYW1lZENvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgSmF2YVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJRW50aXR5IHBhcmVudEVudGl0eSA9IEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldFBhcmVudEVudGl0eSgpOwotCQkJcmV0dXJuIChwYXJlbnRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogcGFyZW50RW50aXR5LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBqb2luQ29sdW1uSXNEZWZhdWx0KFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJaWYgKHRoaXMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRW50aXR5IHBhcmVudEVudGl0eSA9IEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmdldFBhcmVudEVudGl0eSgpOwotCQkJcmV0dXJuIChwYXJlbnRFbnRpdHkgPT0gbnVsbCkgPyBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIDogcGFyZW50RW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEVudGl0eVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yKChSZWFkT25seUJhc2VKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMsIChCYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcgotCQlleHRlbmRzIE5hbWVkQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lcgotCXsKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIHRoaXMuaXNEZXNjZW5kYW50KCkgPwotCQkJCQl0aGlzLmdldFJvb3REaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpIDoKLQkJCQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSA/IG51bGwgOiBEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJCXJldHVybiB0aGlzLmlzRGVzY2VuZGFudCgpID8KLQkJCQkJdGhpcy5nZXRSb290RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpIDoKLQkJCQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSA/IDAgOiBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSDsKLQkJfQotCi0JCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5pc0Rlc2NlbmRhbnQoKSA/Ci0JCQkJCXRoaXMuZ2V0Um9vdERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpIDoKLQkJCQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSA/IG51bGwgOiBSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGlzRGVzY2VuZGFudCgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbnRpdHkudGhpcy5pc0Rlc2NlbmRhbnQoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yQ29sdW1uIGdldFJvb3REaXNjcmltaW5hdG9yQ29sdW1uKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLnJvb3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVudGl0eS50aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZDsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgRGlzY3JpbWluYXRvckNvbHVtblZhbGlkYXRvcihjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGFibGVPd25lcgotCQlpbXBsZW1lbnRzIFJlYWRPbmx5VGFibGUuT3duZXIKLQl7Ci0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcihSZWFkT25seVRhYmxlIHQsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgVGFibGVWYWxpZGF0b3IodCwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlY29uZGFyeSB0YWJsZSBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgU2Vjb25kYXJ5VGFibGVPd25lcgotCQlpbXBsZW1lbnRzIFJlYWRPbmx5VGFibGUuT3duZXIKLQl7Ci0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcihSZWFkT25seVRhYmxlIHQsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVWYWxpZGF0b3IoKFJlYWRPbmx5U2Vjb25kYXJ5VGFibGUpIHQsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0NTM4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIHNlcXVlbmNlIG9yIHRhYmxlIGdlbmVyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhR2VuZXJhdG9yPEEgZXh0ZW5kcyBHZW5lcmF0b3JBbm5vdGF0aW9uPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFHZW5lcmF0b3IKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQSBnZW5lcmF0b3JBbm5vdGF0aW9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkSW5pdGlhbFZhbHVlOwotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEluaXRpYWxWYWx1ZTsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEFsbG9jYXRpb25TaXplOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEEgZ2VuZXJhdG9yQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmdlbmVyYXRvckFubm90YXRpb24gPSBnZW5lcmF0b3JBbm5vdGF0aW9uOwotCQl0aGlzLm5hbWUgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldE5hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSAgZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRJbml0aWFsVmFsdWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IGdlbmVyYXRvckFubm90YXRpb24uZ2V0QWxsb2NhdGlvblNpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmdlbmVyYXRvckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemVfKHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRJbml0aWFsVmFsdWUodGhpcy5idWlsZERlZmF1bHRJbml0aWFsVmFsdWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKHRoaXMuYnVpbGREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCQl0aGlzLnNldE5hbWVfKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUuaW50VmFsdWUoKSA6IHRoaXMuZGVmYXVsdEluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlciB2YWx1ZSkgewotCQl0aGlzLmdlbmVyYXRvckFubm90YXRpb24uc2V0SW5pdGlhbFZhbHVlKHZhbHVlKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbml0aWFsVmFsdWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRJbml0aWFsVmFsdWUoaW50IHZhbHVlKSB7Ci0JCWludCBvbGQgPSB0aGlzLmRlZmF1bHRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdEluaXRpYWxWYWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGJ1aWxkRGVmYXVsdEluaXRpYWxWYWx1ZSgpOwotCQotCi0JLy8gKioqKioqKioqKiBhbGxvY2F0aW9uIHNpemUgKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZS5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0QWxsb2NhdGlvblNpemU7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIgc2l6ZSkgewotCQl0aGlzLmdlbmVyYXRvckFubm90YXRpb24uc2V0QWxsb2NhdGlvblNpemUoc2l6ZSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemVfKHNpemUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplXyhJbnRlZ2VyIHNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQl0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gc2l6ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFksIG9sZCwgc2l6ZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBbGxvY2F0aW9uU2l6ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKGludCBzaXplKSB7Ci0JCWludCBvbGQgPSB0aGlzLmRlZmF1bHRBbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5kZWZhdWx0QWxsb2NhdGlvblNpemUgPSBzaXplOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFksIG9sZCwgc2l6ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBidWlsZERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfQUxMT0NBVElPTl9TSVpFOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkpewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX05BTUVfVU5ERUZJTkVELAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50aWNhbChHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXROYW1lKCksIGdlbmVyYXRvci5nZXROYW1lKCkpICYmCi0JCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpLCBnZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSkgJiYKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpLCBnZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJU2NoZW1hQ29udGFpbmVyIGRiU2NoZW1hQ29udGFpbmVyID0gdGhpcy5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQlyZXR1cm4gKGRiU2NoZW1hQ29udGFpbmVyID09IG51bGwpID8gbnVsbCA6IGRiU2NoZW1hQ29udGFpbmVyLmdldFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPiBjYXRhbG9nKSwKLQkgKiB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzOyBhbmQgd2UgbmVlZCB0bwotCSAqIGdldCB0aGUgc2NoZW1hIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqLwotCXB1YmxpYyBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyAhPSBudWxsKSA/IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNjaGVtYSgpOwotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgotCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqLwotCXB1YmxpYyBDYXRhbG9nIGdldERiQ2F0YWxvZygpIHsKLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENhdGFsb2coKTsKLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFKcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEEgZ2V0R2VuZXJhdG9yQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQzMjFiZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTmFtZWRDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLk51bGxKYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuSWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSBJRCBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFJZE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8SWRBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YUlkTWFwcGluZywgSWRNYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFHZW5lcmF0b3JDb250YWluZXIgZ2VuZXJhdG9yQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIEphdmFHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGNvbnZlcnRlcjsgIC8vIG5ldmVyIG51bGwKLQotCS8qIEpQQSAyLjAgLSB0aGUgZW1iZWRkZWQgaWQgbWF5IGJlIGRlcml2ZWQgZnJvbSBhIHJlbGF0aW9uc2hpcCAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlcml2ZWQ7Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YUNvbnZlcnRlci5BZGFwdGVyW10gQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkgPSBuZXcgSmF2YUNvbnZlcnRlci5BZGFwdGVyW10gewotCQlKYXZhVGVtcG9yYWxDb252ZXJ0ZXIuQmFzaWNBZGFwdGVyLmluc3RhbmNlKCksCi0JfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gQ09OVkVSVEVSX0FEQVBURVJTID0gbmV3IEFycmF5SXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPihDT05WRVJURVJfQURBUFRFUl9BUlJBWSk7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFJZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOwotCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lciA9IHRoaXMuYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZSA9IHRoaXMuYnVpbGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQl0aGlzLmNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY0dlbmVyYXRlZFZhbHVlKCk7Ci0JCXRoaXMuc3luY0NvbnZlcnRlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSgpOwotCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lci51cGRhdGUoKTsKLQkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS51cGRhdGUoKTsKLQkJfQotCQl0aGlzLmNvbnZlcnRlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZXJpdmVkKHRoaXMuYnVpbGREZXJpdmVkKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4gYnVpbGRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDb2x1bW4odGhpcywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRvciBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFHZW5lcmF0b3JDb250YWluZXIgZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFHZW5lcmF0b3JDb250YWluZXIgYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFHZW5lcmF0b3JDb250YWluZXIodGhpcywgdGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPEdlbmVyYXRvcj4gZ2V0R2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLmdldEdlbmVyYXRvcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdGVkIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCX0KLQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWUgYWRkR2VuZXJhdGVkVmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdlbmVyYXRlZCB2YWx1ZSBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuZ2VuZXJhdGVkVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmJ1aWxkR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCk7Ci0JCUphdmFHZW5lcmF0ZWRWYWx1ZSB2YWx1ZSA9IHRoaXMuYnVpbGRHZW5lcmF0ZWRWYWx1ZShhbm5vdGF0aW9uKTsKLQkJdGhpcy5zZXRHZW5lcmF0ZWRWYWx1ZSh2YWx1ZSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGJ1aWxkR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlR2VuZXJhdGVkVmFsdWUoKSB7Ci0JCWlmICh0aGlzLmdlbmVyYXRlZFZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImdlbmVyYXRlZCB2YWx1ZSBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRoaXMuc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFHZW5lcmF0ZWRWYWx1ZSBidWlsZEdlbmVyYXRlZFZhbHVlKCkgewotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0R2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkR2VuZXJhdGVkVmFsdWUoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZXRHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUdlbmVyYXRlZFZhbHVlIGJ1aWxkR2VuZXJhdGVkVmFsdWUoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhR2VuZXJhdGVkVmFsdWUodGhpcywgZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jR2VuZXJhdGVkVmFsdWUoKSB7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgJiYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKCkgPT0gYW5ub3RhdGlvbikpIHsKLQkJCQl0aGlzLmdlbmVyYXRlZFZhbHVlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRHZW5lcmF0ZWRWYWx1ZSh0aGlzLmJ1aWxkR2VuZXJhdGVkVmFsdWUoYW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0R2VuZXJhdGVkVmFsdWUoSmF2YUdlbmVyYXRlZFZhbHVlIHZhbHVlKSB7Ci0JCUphdmFHZW5lcmF0ZWRWYWx1ZSBvbGQgPSB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChHRU5FUkFURURfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQl0aGlzLmNvbnZlcnRlci5kaXNwb3NlKCk7Ci0JCQlKYXZhQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlciA9IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJCXRoaXMucmV0YWluQ29udmVydGVyQW5ub3RhdGlvbihjb252ZXJ0ZXJBZGFwdGVyKTsKLQkJCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkQ29udmVydGVyKGNvbnZlcnRlckFkYXB0ZXIpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCSByZXR1cm4gKGNvbnZlcnRlckFkYXB0ZXIgIT0gbnVsbCkgPwotCQkJCWNvbnZlcnRlckFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRKcGFGYWN0b3J5KCkpIDoKLQkJCQl0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcl8oSmF2YUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJQ29udmVydGVyIG9sZCA9IHRoaXMuY29udmVydGVyOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXIpOwotCX0KLQotCS8qKgotCSAqIENsZWFyIGFsbCB0aGUgY29udmVydGVyIGFubm90YXRpb25zIDxlbT5leGNlcHQ8L2VtPiBmb3IgdGhlIGFubm90YXRpb24KLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgYWRhcHRlci4gSWYgdGhlIHNwZWNpZmllZCBhZGFwdGVyIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIHJlbW92ZSA8ZW0+YWxsPC9lbT4gdGhlIGNvbnZlcnRlciBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXRhaW5Db252ZXJ0ZXJBbm5vdGF0aW9uKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIgIT0gY29udmVydGVyQWRhcHRlcikgewotCQkJCWFkYXB0ZXIucmVtb3ZlQ29udmVydGVyQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlciBidWlsZENvbnZlcnRlcigpIHsKLQkJSnBhRmFjdG9yeSBqcGFGYWN0b3J5ID0gdGhpcy5nZXRKcGFGYWN0b3J5KCk7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCUphdmFDb252ZXJ0ZXIgamF2YUNvbnZlcnRlciA9IGFkYXB0ZXIuYnVpbGRDb252ZXJ0ZXIodGhpcywganBhRmFjdG9yeSk7Ci0JCQlpZiAoamF2YUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGphdmFDb252ZXJ0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NvbnZlcnRlcigpIHsKLQkJQXNzb2NpYXRpb248SmF2YUNvbnZlcnRlci5BZGFwdGVyLCBBbm5vdGF0aW9uPiBhc3NvYyA9IHRoaXMuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpOwotCQlpZiAoYXNzb2MgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGROdWxsQ29udmVydGVyKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgPSBhc3NvYy5nZXRLZXkoKTsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFzc29jLmdldFZhbHVlKCk7Ci0JCQlpZiAoKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSA9PSBhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSkgJiYKLQkJCQkJKHRoaXMuY29udmVydGVyLmdldENvbnZlcnRlckFubm90YXRpb24oKSA9PSBhbm5vdGF0aW9uKSkgewotCQkJCXRoaXMuY29udmVydGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKGFkYXB0ZXIuYnVpbGRDb252ZXJ0ZXIoYW5ub3RhdGlvbiwgdGhpcywgdGhpcy5nZXRKcGFGYWN0b3J5KCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgY29udmVydGVyIGFubm90YXRpb24gd2UgZmluZCBhbG9uZyB3aXRoIGl0cyBjb3JyZXNwb25kaW5nCi0JICogYWRhcHRlci4gUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uPEphdmFDb252ZXJ0ZXIuQWRhcHRlciwgQW5ub3RhdGlvbj4gZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhZGFwdGVyLmdldENvbnZlcnRlckFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU2ltcGxlQXNzb2NpYXRpb248SmF2YUNvbnZlcnRlci5BZGFwdGVyLCBBbm5vdGF0aW9uPihhZGFwdGVyLCBhbm5vdGF0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlciBidWlsZE51bGxDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTnVsbEphdmFDb252ZXJ0ZXIodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnZlcnRlciBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyLkFkYXB0ZXIgZ2V0Q29udmVydGVyQWRhcHRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBDT05WRVJURVJfQURBUFRFUlM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlcml2ZWQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEZXJpdmVkKCkgewotCQlyZXR1cm4gdGhpcy5kZXJpdmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlcml2ZWQoYm9vbGVhbiBkZXJpdmVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZXJpdmVkOwotCQl0aGlzLmRlcml2ZWQgPSBkZXJpdmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVSSVZFRF9QUk9QRVJUWSwgb2xkLCBkZXJpdmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlcml2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpICYmIHRoaXMuYnVpbGREZXJpdmVkXygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVyaXZlZF8oKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuYXR0cmlidXRlSXNEZXJpdmVkSWQodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sdW1uSXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgIT0gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFHZW5lcmF0b3JDb250YWluZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEphdmFSZXNvdXJjZU1lbWJlciBnZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmFDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChDb2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiAodGhpcy5kZXJpdmVkICYmICEgdGhpcy5jb2x1bW5Jc1NwZWNpZmllZCgpKSA/IG51bGwgOiB0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5kZXJpdmVkICYmICEgdGhpcy5jb2x1bW5Jc1NwZWNpZmllZCgpKSA/IG51bGwgOiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2wsIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZENvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcmVzdWx0ID0gdGhpcy5jb2x1bW4uZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlyZXN1bHQgPSB0aGlzLmdlbmVyYXRvckNvbnRhaW5lci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWlmICh0aGlzLmdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVkVmFsdWUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMuY29udmVydGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0KLQkJLy8gSlBBIDIuMDogSWYgdGhlIGNvbHVtbiBpcyBzcGVjaWZpZWQgb3IgaWYgdGhlIElEIGlzIG5vdCBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAsCi0JCS8vIHRoZSBjb2x1bW4gaXMgdmFsaWRhdGVkLgotCQkvLyBKUEEgMS4wOiBUaGUgY29sdW1uIGlzIGFsd2F5cyBiZSB2YWxpZGF0ZWQsIHNpbmNlIHRoZSBJRCBpcyBuZXZlciBtYXBwZWQgYnkgYQotCQkvLyByZWxhdGlvbnNoaXAuCi0JCWlmICh0aGlzLmNvbHVtbklzU3BlY2lmaWVkKCkgfHwgISB0aGlzLmRlcml2ZWQpIHsKLQkJCXRoaXMuY29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQotCQkvLyBKUEEgMi4wOiBJZiB0aGUgY29sdW1uIGlzIHNwZWNpZmllZCBhbmQgdGhlIElEIGlzIG1hcHBlZCBieSBhIHJlbGF0aW9uc2hpcCwKLQkJLy8gd2UgaGF2ZSBhbiBlcnJvci4KLQkJLy8gSlBBIDEuMDogVGhlIElEIGNhbm5vdCBiZSBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAuCi0JCWlmICh0aGlzLmNvbHVtbklzU3BlY2lmaWVkKCkgJiYgdGhpcy5kZXJpdmVkKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZENvbHVtblNwZWNpZmllZEFuZERlcml2ZWRNZXNzYWdlKGFzdFJvb3QpKTsKLQkJfQotCi0JCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdGVkVmFsdWUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCQl0aGlzLmNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZENvbHVtblNwZWNpZmllZEFuZERlcml2ZWRNZXNzYWdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWVzc2FnZSgKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9DT0xVTU5fU1BFQ0lGSUVELAotCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQl0aGlzLmNvbHVtbi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoU3RyaW5nIG1zZ0lELCBTdHJpbmdbXSBwYXJtcywgVGV4dFJhbmdlIHRleHRSYW5nZSkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQltc2dJRCwKLQkJCQlBcnJheVRvb2xzLmFkZChwYXJtcywgMCwgdGhpcy5idWlsZEF0dHJpYnV0ZURlc2NyaXB0aW9uKCkpLAotCQkJCXRoaXMsCi0JCQkJdGV4dFJhbmdlCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRBdHRyaWJ1dGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIE5MUy5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlRGVzY3JpcHRpb25UZW1wbGF0ZSgpLCB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlRGVzY3JpcHRpb25UZW1wbGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpID8KLQkJCQlKcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9ERVNDIDoKLQkJCQlKcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlcy5BVFRSSUJVVEVfREVTQzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwN2ZjOTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUpvaW5Db2x1bW4sIEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBzcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneShKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5nZXREZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYWRkSm9pbkNvbHVtbkFubm90YXRpb24oaW5kZXgpOwotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCgoSmF2YUpvaW5Db2x1bW4pIGpvaW5Db2x1bW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKGluZGV4KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm1vdmVKb2luQ29sdW1uQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhSm9pbkNvbHVtbiwgSm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFKb2luQ29sdW1uLCBKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KEpvaW5Db2x1bW5Bbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmJ1aWxkSm9pbkNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBjb250ZXh0RWxlbWVudC5nZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpOwotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Sm9pbkNvbHVtbihKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCUphdmFKb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPiBnZXREZWZhdWx0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48SmF2YUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0Sm9pbkNvbHVtbigpKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbih0aGlzLmJ1aWxkSm9pbkNvbHVtbih0aGlzLmJ1aWxkTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpICYmCi0JCQkJdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5tYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25zKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbkFubm90YXRpb24oaW50IGluZGV4KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbW92ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKGludCBpbmRleCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBtb3ZlSm9pbkNvbHVtbkFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKCk7Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIHRoaXMuam9pbkNvbHVtbk93bmVyLCBqb2luQ29sdW1uQW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpIHsKLQkJZm9yIChSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IG9sZFN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpLmluaXRpYWxpemVGcm9tKGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHZpcnR1YWxTdHJhdGVneSkgewotCQlmb3IgKFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uIDogdmlydHVhbFN0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpLmluaXRpYWxpemVGcm9tVmlydHVhbChqb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlbGF0aW9uc2hpcFNvdXJjZSgpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IHR5cGVNYXBwaW5nLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogdHlwZU1hcHBpbmcucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgJiYgdHlwZU1hcHBpbmcudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JLy8gc3ViY2xhc3NlcyBsaWtlIHRoaXMgdG8gYmUgcHVibGljCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQlUeXBlTWFwcGluZyByZWxhdGlvbnNoaXBUYXJnZXQgPSB0aGlzLmdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCQlyZXR1cm4gKHJlbGF0aW9uc2hpcFRhcmdldCA9PSBudWxsKSA/IG51bGwgOiByZWxhdGlvbnNoaXBUYXJnZXQuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgPyB0eXBlTWFwcGluZy5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpID09IDApIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7Ci0JCWZvciAoaW50IGkgPSB0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCXJlc3VsdCA9IGpvaW5Db2x1bW4uZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQlmb3IgKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCWpvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWYyNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBSZWFkT25seVRhYmxlLk93bmVyCi17Ci0JcHJvdGVjdGVkIEphdmFKb2luVGFibGUgam9pblRhYmxlOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3koSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuam9pblRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlSm9pblRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Sm9pblRhYmxlKEphdmFKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCUphdmFKb2luVGFibGUgb2xkID0gdGhpcy5qb2luVGFibGU7Ci0JCXRoaXMuam9pblRhYmxlID0gam9pblRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSk9JTl9UQUJMRV9QUk9QRVJUWSwgb2xkLCBqb2luVGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpvaW5UYWJsZSgpIHsKLQkJaWYgKHRoaXMuYnVpbGRzSm9pblRhYmxlKCkpIHsKLQkJCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRKb2luVGFibGUodGhpcy5idWlsZEpvaW5UYWJsZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5qb2luVGFibGUudXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Sm9pblRhYmxlKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmF0ZWd5IGNhbiBoYXZlIGEgam9pbiB0YWJsZSBpZiBlaXRoZXIgdGhlIHRhYmxlIGFubm90YXRpb24gaXMgcHJlc2VudAotCSAqIG9yIHRoZSBbbWFwcGluZ10gcmVsYXRpb25zaGlwIHN1cHBvcnRzIGEgZGVmYXVsdCBqb2luIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkc0pvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Sm9pblRhYmxlQW5ub3RhdGlvbigpLmlzU3BlY2lmaWVkKCkKLQkJCXx8IHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkubWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5UYWJsZSBidWlsZEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5UYWJsZSh0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKb2luVGFibGVBbm5vdGF0aW9uIGFkZEpvaW5UYWJsZUFubm90YXRpb24oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHJlbW92ZUpvaW5UYWJsZUFubm90YXRpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IG9sZFN0cmF0ZWd5KSB7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IG9sZFN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlpZiAob2xkSm9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkU3RyYXRlZ3koKTsKLQkJCXRoaXMuam9pblRhYmxlLmluaXRpYWxpemVGcm9tKG9sZEpvaW5UYWJsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSB2aXJ0dWFsU3RyYXRlZ3kpIHsKLQkJUmVhZE9ubHlKb2luVGFibGUgb2xkSm9pblRhYmxlID0gdmlydHVhbFN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlpZiAob2xkSm9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkU3RyYXRlZ3koKTsKLQkJCXRoaXMuam9pblRhYmxlLmluaXRpYWxpemVGcm9tVmlydHVhbChvbGRKb2luVGFibGUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5qb2luVGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5qb2luVGFibGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmpvaW5UYWJsZS5nZXREYlRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldFRhYmxlTmFtZSgpLCB0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuRE9FU19OT1RfTUFUQ0hfSk9JTl9UQUJMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZURlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pblRhYmxlRGVmYXVsdE5hbWUodGhpcy5nZXRSZWxhdGlvbnNoaXAoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmFkZEpvaW5UYWJsZUFubm90YXRpb24oKTsKLQkJCXRoaXMuc2V0Sm9pblRhYmxlKHRoaXMuYnVpbGRKb2luVGFibGUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJhdGVneSgpIHsKLQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlSm9pblRhYmxlQW5ub3RhdGlvbigpOwotCQkJdGhpcy5zZXRKb2luVGFibGUobnVsbCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMuam9pblRhYmxlLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmpvaW5UYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1ZjM0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLm1vZGVsLmludGVybmFsLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNhbmNlbGxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlleHRlbmRzIEFic3RyYWN0SnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFKcGFDb250ZXh0Tm9kZQotewotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZShKcGFDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7Ci0JCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHRoaXMuZ2V0Q29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIHRoZSBkYXRhYmFzZSBpcyBjb25uZWN0ZWQsIGFsbG93aW5nIHVzIHRvCi0JICogZ2V0IGNhbmRpZGF0ZXMgZnJvbSB0aGUgdmFyaW91cyBkYXRhYmFzZSB0YWJsZXMgZXRjLgotCSAqIFRoaXMgbWV0aG9kIHNob3VsZCA8ZW0+bm90PC9lbT4gYmUgY2FzY2FkZWQgdG8gImNoaWxkIiBvYmplY3RzOyBpdCBzaG91bGQKLQkgKiBvbmx5IHJldHVybiBjYW5kaWRhdGVzIGZvciB0aGUgY3VycmVudCBvYmplY3QuIFRoZSBjYXNjYWRpbmcgaXMKLQkgKiBoYW5kbGVkIGJ5IHtAbGluayAjZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50LCBGaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCl9LgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JLyoqCi0JICogQWxsIHN1YmNsYXNzIGltcGxlbWVudGF0aW9ucwotCSAqIHNob3VsZCBiZSBwcmVjZWRlZCBieSBhICJzdXBlciIgY2FsbCB0byB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBzcGVjaWZpZWQgbm9kZSBpZiBpdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOb2RlKEphdmFKcGFDb250ZXh0Tm9kZSBub2RlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlub2RlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZSB0aGUgc3BlY2lmaWVkIG5vZGVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTm9kZXMoSXRlcmFibGU8PyBleHRlbmRzIEphdmFKcGFDb250ZXh0Tm9kZT4gbm9kZXMsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWZvciAoSmF2YUpwYUNvbnRleHROb2RlIG5vZGUgOiBub2RlcykgewotCQkJbm9kZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZSBpZiBpdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT47IGlmIGl0IGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4sIHJldHVybiB0aGUgbm9kZSdzIHZhbGlkYXRpb24gdGV4dCByYW5nZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoVGV4dFJhbmdlIHRleHRSYW5nZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjNWQ4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ1JlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFNYW55VG9NYW55TWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPE1hbnlUb01hbnlBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YU1hbnlUb01hbnlNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWxhdGlvbnNoaXAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChKYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcCkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFNYXBwaW5nUmVsYXRpb25zaGlwIGJ1aWxkUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJhOTNiOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFNYW55VG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPE1hbnlUb09uZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhTWFueVRvT25lTWFwcGluZzJfMAotewotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFNYW55VG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWxhdGlvbnNoaXAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gKEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXApIHN1cGVyLmdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwIGJ1aWxkUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwKHRoaXMpOwotCX0JCi0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZjM0ZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgbWFwcGVkIHN1cGVyY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3MKLQlleHRlbmRzIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nPE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YU1hcHBlZFN1cGVyY2xhc3MsIEphdmFRdWVyeUNvbnRhaW5lci5Pd25lcgotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhSWRDbGFzc1JlZmVyZW5jZSBpZENsYXNzUmVmZXJlbmNlOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUXVlcnlDb250YWluZXIgcXVlcnlDb250YWluZXI7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFNYXBwZWRTdXBlcmNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCQl0aGlzLmlkQ2xhc3NSZWZlcmVuY2UgPSB0aGlzLmJ1aWxkSWRDbGFzc1JlZmVyZW5jZSgpOwotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyID0gdGhpcy5idWlsZFF1ZXJ5Q29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucXVlcnlDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS51cGRhdGUoKTsKLQkJdGhpcy5xdWVyeUNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWQgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIEphdmFJZENsYXNzUmVmZXJlbmNlIGdldElkQ2xhc3NSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3NSZWZlcmVuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFJZENsYXNzUmVmZXJlbmNlIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUlkQ2xhc3NSZWZlcmVuY2UodGhpcyk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJZENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5pZENsYXNzUmVmZXJlbmNlLmdldElkQ2xhc3MoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcnkgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUXVlcnlDb250YWluZXIgZ2V0UXVlcnlDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5Q29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUXVlcnlDb250YWluZXIgYnVpbGRRdWVyeUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVF1ZXJ5Q29udGFpbmVyKHRoaXMsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNZW1iZXIgZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeUNvbnRhaW5lci5nZXRRdWVyaWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy52YWxpZGF0ZVByaW1hcnlLZXkobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5pZENsYXNzUmVmZXJlbmNlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMucXVlcnlDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByaW1hcnlLZXkoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5idWlsZFByaW1hcnlLZXlWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkUHJpbWFyeUtleVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCQkvLyBUT0RPIC0gSlBBIDIuMCB2YWxpZGF0aW9uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXh0UmFuZ2VSZXNvbHZlcih0aGlzLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU1hcHBpbmdSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5Mzg3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci0KLS8qKgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU3ViY2xhc3NlcyBtYXkgd2FudCB0byBzZXQgdGhlIHtAbGluayAjc3RyYXRlZ3l9IGF0IHRoZQotICogZW5kIG9mIHRoZWlyIGNvbnN0cnVjdG9yczsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIDxjb2RlPm51bGw8L2NvZGU+IHVudGlsIGl0Ci0gKiBpcyBzZXQgZHVyaW5nIHtAbGluayAjdXBkYXRlKCl9LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcDxNIGV4dGVuZHMgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXAKLXsKLQlwcm90ZWN0ZWQgSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBzdHJhdGVneTsKLQotCi0JcHVibGljIEFic3RyYWN0SmF2YU1hcHBpbmdSZWxhdGlvbnNoaXAoTSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN0cmF0ZWd5KEphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgc3RyYXRlZ3kpIHsKLQkJUmVsYXRpb25zaGlwU3RyYXRlZ3kgb2xkID0gdGhpcy5zdHJhdGVneTsKLQkJdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMgd2hlbiB0aGUgdmFyaW91cyBzdXBwb3J0ZWQgc3RyYXRlZ2llcyBhcmUKLQkgKiBhZGRlZCBvciByZW1vdmVkOyBhbGxvd2luZyB0aGUgc3RyYXRlZ3kgdG8gYmUgc2V0IHN5bmNocm9ub3VzbHkuICg/KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0cmF0ZWd5KCkgewotCQl0aGlzLnNldFN0cmF0ZWd5KHRoaXMuYnVpbGRTdHJhdGVneSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCW9sZFJlbGF0aW9uc2hpcC5pbml0aWFsaXplT24odGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21NYXBwZWRCeVJlbGF0aW9uc2hpcChNYXBwZWRCeVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCS8vIE5PUAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCS8vIE5PUAotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBNIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChNKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldEVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFR5cGVNYXBwaW5nKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFbnRpdHkpID8gKEVudGl0eSkgdHlwZU1hcHBpbmcgOiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5LmlzT3ZlcnJpZGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhMjBhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuRW1iZWRkYWJsZU92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5NYXBLZXlDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5SZWxhdGlvbnNoaXBTdHJhdGVneVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuTnVsbEphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5NYXBLZXlKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YU1hcEtleUNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk51bGxNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBLZXlFbnVtZXJhdGVkQ29udmVydGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgbXVsdGktcmVsYXRpb25zaGlwIChtOm0sIDE6bSkgbWFwcGluZwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPEEgZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbj4KLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc8QT4KLQlpbXBsZW1lbnRzIEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcsIEphdmFDb2xsZWN0aW9uTWFwcGluZzJfMAotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhT3JkZXJhYmxlIG9yZGVyYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTWFwS2V5OwotCXByb3RlY3RlZCBib29sZWFuIG5vTWFwS2V5ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcGtNYXBLZXkgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjdXN0b21NYXBLZXkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTWFwS2V5Q2xhc3M7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TWFwS2V5Q2xhc3M7Ci0JcHJvdGVjdGVkIFN0cmluZyBmdWxseVF1YWxpZmllZE1hcEtleUNsYXNzOwotCi0JcHJvdGVjdGVkIFR5cGUgdmFsdWVUeXBlOwotCXByb3RlY3RlZCBUeXBlIGtleVR5cGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbHVtbiBtYXBLZXlDb2x1bW47Ci0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgbWFwS2V5Q29udmVydGVyOyAgLy8gbWFwIGtleSBjb252ZXJ0ZXIgLSBuZXZlciBudWxsCi0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUpvaW5Db2x1bW4sIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uPiBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG1hcEtleUpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBkZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEphdmFDb252ZXJ0ZXIuQWRhcHRlcltdIE1BUF9LRVlfQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkgPSBuZXcgSmF2YUNvbnZlcnRlci5BZGFwdGVyW10gewotCQlKYXZhTWFwS2V5RW51bWVyYXRlZENvbnZlcnRlcjJfMC5BZGFwdGVyLmluc3RhbmNlKCksCi0JCUphdmFNYXBLZXlUZW1wb3JhbENvbnZlcnRlcjJfMC5BZGFwdGVyLmluc3RhbmNlKCkKLQl9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBNQVBfS0VZX0NPTlZFUlRFUl9BREFQVEVSUyA9IG5ldyBBcnJheUl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4oTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUl9BUlJBWSk7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3JkZXJhYmxlID0gdGhpcy5idWlsZE9yZGVyYWJsZSgpOwotCi0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5ID0gdGhpcy5idWlsZFNwZWNpZmllZE1hcEtleSgpOwotCQl0aGlzLm5vTWFwS2V5ID0gdGhpcy5idWlsZE5vTWFwS2V5KCk7Ci0JCXRoaXMucGtNYXBLZXkgPSB0aGlzLmJ1aWxkUGtNYXBLZXkoKTsKLQkJdGhpcy5jdXN0b21NYXBLZXkgPSB0aGlzLmJ1aWxkQ3VzdG9tTWFwS2V5KCk7Ci0KLQkJdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzcyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBLZXlDbGFzcygpOwotCi0JCXRoaXMubWFwS2V5Q29sdW1uID0gdGhpcy5idWlsZE1hcEtleUNvbHVtbigpOwotCQl0aGlzLm1hcEtleUNvbnZlcnRlciA9IHRoaXMuYnVpbGRNYXBLZXlDb252ZXJ0ZXIoKTsKLQkJdGhpcy5tYXBLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5vcmRlcmFibGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkTWFwS2V5KCkpOwotCQl0aGlzLnNldE5vTWFwS2V5Xyh0aGlzLmJ1aWxkTm9NYXBLZXkoKSk7Ci0JCXRoaXMuc2V0UGtNYXBLZXlfKHRoaXMuYnVpbGRQa01hcEtleSgpKTsKLQkJdGhpcy5zZXRDdXN0b21NYXBLZXlfKHRoaXMuYnVpbGRDdXN0b21NYXBLZXkoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzc18odGhpcy5idWlsZFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCi0JCXRoaXMubWFwS2V5Q29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jTWFwS2V5Q29udmVydGVyKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0KLQkJdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLm9yZGVyYWJsZS51cGRhdGUoKTsKLQotCQl0aGlzLnNldERlZmF1bHRNYXBLZXlDbGFzcyh0aGlzLmJ1aWxkRGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3ModGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0KLQkJdGhpcy5zZXRWYWx1ZVR5cGUodGhpcy5idWlsZFZhbHVlVHlwZSgpKTsKLQkJdGhpcy5zZXRLZXlUeXBlKHRoaXMuYnVpbGRLZXlUeXBlKCkpOwotCi0JCXRoaXMubWFwS2V5Q29sdW1uLnVwZGF0ZSgpOwotCQl0aGlzLm1hcEtleUNvbnZlcnRlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCk7Ci0KLQkJdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JkZXJhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhT3JkZXJhYmxlIGdldE9yZGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJhYmxlOwotCX0KLQotCXByb3RlY3RlZCBKYXZhT3JkZXJhYmxlIGJ1aWxkT3JkZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJdGhpcy5nZXRKcGFGYWN0b3J5Ml8wKCkuYnVpbGRKYXZhT3JkZXJhYmxlKHRoaXMsIHRoaXMuYnVpbGRPcmRlcmFibGVPd25lcigpKSA6Ci0JCQkJdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhT3JkZXJhYmxlKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBPcmRlcmFibGUyXzAuT3duZXIgYnVpbGRPcmRlcmFibGVPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBPcmRlcmFibGVPd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBPcmRlcmFibGVPd25lcgotCQlpbXBsZW1lbnRzIE9yZGVyYWJsZTJfMC5Pd25lcgotCXsKLQkJcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQkJcHJvdGVjdGVkIEphdmFSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRNYXBLZXkoKSB7Ci0JCWlmICh0aGlzLm5vTWFwS2V5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5wa01hcEtleSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGVOYW1lKCk7Ci0JCX0KLQkJaWYgKHRoaXMuY3VzdG9tTWFwS2V5KSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBLZXk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBtYXAga2V5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXkoU3RyaW5nIG1hcEtleSkgewotCQlpZiAobWFwS2V5ICE9IG51bGwpIHsKLQkJCXRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbkZvclVwZGF0ZSgpLnNldE5hbWUobWFwS2V5KTsKLQotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlfKG1hcEtleSk7Ci0JCQl0aGlzLnNldE5vTWFwS2V5XyhmYWxzZSk7Ci0JCQl0aGlzLnNldFBrTWFwS2V5XyhmYWxzZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU1hcEtleV8odHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldFBrTWFwS2V5KHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTWFwS2V5XyhTdHJpbmcgbWFwS2V5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE1hcEtleTsKLQkJdGhpcy5zcGVjaWZpZWRNYXBLZXkgPSBtYXBLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBtYXBLZXkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRNYXBLZXkoKSB7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKG1hcEtleUFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogbWFwS2V5QW5ub3RhdGlvbi5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5vIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNOb01hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMubm9NYXBLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9NYXBLZXkoYm9vbGVhbiBub01hcEtleSkgewotCQlpZiAobm9NYXBLZXkpIHsKLQkJCWlmICh0aGlzLmdldE1hcEtleUFubm90YXRpb24oKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5yZW1vdmVNYXBLZXlBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5XyhudWxsKTsKLQkJCXRoaXMuc2V0Tm9NYXBLZXlfKHRydWUpOwotCQkJdGhpcy5zZXRQa01hcEtleV8oZmFsc2UpOwotCQkJdGhpcy5zZXRDdXN0b21NYXBLZXlfKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0UGtNYXBLZXkodHJ1ZSk7ICAvLyBobW1tLi4uCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROb01hcEtleV8oYm9vbGVhbiBub01hcEtleSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMubm9NYXBLZXk7Ci0JCXRoaXMubm9NYXBLZXkgPSBub01hcEtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgbm9NYXBLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkTm9NYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcEtleUFubm90YXRpb24oKSA9PSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwayBtYXAga2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUGtNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnBrTWFwS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBrTWFwS2V5KGJvb2xlYW4gcGtNYXBLZXkpIHsKLQkJaWYgKHBrTWFwS2V5KSB7Ci0JCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUFubm90YXRpb24oKTsKLQkJCWlmIChtYXBLZXlBbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQltYXBLZXlBbm5vdGF0aW9uID0gdGhpcy5hZGRNYXBLZXlBbm5vdGF0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCW1hcEtleUFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJCX0KLQotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlfKG51bGwpOwotCQkJdGhpcy5zZXROb01hcEtleV8oZmFsc2UpOwotCQkJdGhpcy5zZXRQa01hcEtleV8odHJ1ZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU1hcEtleV8oZmFsc2UpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXROb01hcEtleSh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFBrTWFwS2V5Xyhib29sZWFuIHBrTWFwS2V5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5wa01hcEtleTsKLQkJdGhpcy5wa01hcEtleSA9IHBrTWFwS2V5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBwa01hcEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRQa01hcEtleSgpIHsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBLZXlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAobWFwS2V5QW5ub3RhdGlvbiAhPSBudWxsKSAmJiAobWFwS2V5QW5ub3RhdGlvbi5nZXROYW1lKCkgPT0gbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBtYXAga2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQ3VzdG9tTWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21NYXBLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tTWFwS2V5KGJvb2xlYW4gY3VzdG9tTWFwS2V5KSB7Ci0JCWlmIChjdXN0b21NYXBLZXkpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJdGhpcy5zZXROb01hcEtleSh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbU1hcEtleV8oYm9vbGVhbiBjdXN0b21NYXBLZXkpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmN1c3RvbU1hcEtleTsKLQkJdGhpcy5jdXN0b21NYXBLZXkgPSBjdXN0b21NYXBLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBjdXN0b21NYXBLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkQ3VzdG9tTWFwS2V5KCkgewotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUFubm90YXRpb24oKTsKLQkJcmV0dXJuIChtYXBLZXlBbm5vdGF0aW9uICE9IG51bGwpICYmIChtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSAhPSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBNYXBLZXlBbm5vdGF0aW9uIGdldE1hcEtleUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoTWFwS2V5QW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBNYXBLZXlBbm5vdGF0aW9uIGdldE1hcEtleUFubm90YXRpb25Gb3JVcGRhdGUoKSB7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKG1hcEtleUFubm90YXRpb24gIT0gbnVsbCkgPyBtYXBLZXlBbm5vdGF0aW9uIDogdGhpcy5hZGRNYXBLZXlBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcEtleUFubm90YXRpb24gYWRkTWFwS2V5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChNYXBLZXlBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWFwS2V5QW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgOiB0aGlzLmRlZmF1bHRNYXBLZXlDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhTdHJpbmcgbWFwS2V5Q2xhc3MpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG1hcEtleUNsYXNzLCB0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzKSkgewotCQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUNsYXNzQW5ub3RhdGlvbigpOwotCQkJaWYgKG1hcEtleUNsYXNzID09IG51bGwpIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucmVtb3ZlTWFwS2V5Q2xhc3NBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWFubm90YXRpb24gPSB0aGlzLmFkZE1hcEtleUNsYXNzQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uLnNldFZhbHVlKG1hcEtleUNsYXNzKTsKLQkJCX0KLQotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzc18obWFwS2V5Q2xhc3MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3NfKFN0cmluZyBtYXBLZXlDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzczsKLQkJdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzcyA9IG1hcEtleUNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFksIG9sZCwgbWFwS2V5Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRNYXBLZXlDbGFzcygpIHsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUNsYXNzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwS2V5Q2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE1hcEtleUNsYXNzKFN0cmluZyBtYXBLZXlDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0TWFwS2V5Q2xhc3M7Ci0JCXRoaXMuZGVmYXVsdE1hcEtleUNsYXNzID0gbWFwS2V5Q2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFksIG9sZCwgbWFwS2V5Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRNYXBLZXlDbGFzcyhTdHJpbmcgbWFwS2V5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRNYXBLZXlDbGFzczsKLQkJdGhpcy5mdWxseVF1YWxpZmllZE1hcEtleUNsYXNzID0gbWFwS2V5Q2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfTUFQX0tFWV9DTEFTU19QUk9QRVJUWSwgb2xkLCBtYXBLZXlDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3NfKCkgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZE1hcEtleUNsYXNzXygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzID09IG51bGwpID8KLQkJCQl0aGlzLmRlZmF1bHRNYXBLZXlDbGFzcyA6Ci0JCQkJdGhpcy5nZXRNYXBLZXlDbGFzc0Fubm90YXRpb24oKS5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldE1hcEtleUNsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICcuJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb2x2ZWQgbWFwIGtleSBlbWJlZGRhYmxlL2VudGl0eSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRW1iZWRkYWJsZSBnZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVtYmVkZGFibGUodGhpcy5mdWxseVF1YWxpZmllZE1hcEtleUNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IGdldFJlc29sdmVkTWFwS2V5RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkodGhpcy5mdWxseVF1YWxpZmllZE1hcEtleUNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgSVR5cGUgZ2V0TWFwS2V5Q2xhc3NKZHRUeXBlKCkgewotCQlyZXR1cm4gSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3MpOwotCX0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjbGFzcyBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBNYXBLZXlDbGFzczJfMEFubm90YXRpb24gZ2V0TWFwS2V5Q2xhc3NBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/IHRoaXMuZ2V0TWFwS2V5Q2xhc3NBbm5vdGF0aW9uXygpIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIGdldE1hcEtleUNsYXNzQW5ub3RhdGlvbl8oKSB7Ci0JCXJldHVybiAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIGFkZE1hcEtleUNsYXNzQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcEtleUNsYXNzQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFR5cGUgZ2V0VmFsdWVUeXBlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVUeXBlKFR5cGUgdmFsdWVUeXBlKSB7Ci0JCVR5cGUgb2xkID0gdGhpcy52YWx1ZVR5cGU7Ci0JCXRoaXMudmFsdWVUeXBlID0gdmFsdWVUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfVFlQRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBUeXBlIGJ1aWxkVmFsdWVUeXBlKCkgewotCQlpZiAodGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBUeXBlLkVOVElUWV9UWVBFOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBUeXBlLkVNQkVEREFCTEVfVFlQRTsKLQkJfQotCQlpZiAodGhpcy5nZXRUYXJnZXRFbnRpdHkoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5OT19UWVBFOwotCQl9Ci0JCXJldHVybiBUeXBlLkJBU0lDX1RZUEU7Ci0JfQotCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbWJlZGRhYmxlKHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBrZXkgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgVHlwZSBnZXRLZXlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5rZXlUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEtleVR5cGUoVHlwZSBrZXlUeXBlKSB7Ci0JCVR5cGUgb2xkID0gdGhpcy5rZXlUeXBlOwotCQl0aGlzLmtleVR5cGUgPSBrZXlUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoS0VZX1RZUEVfUFJPUEVSVFksIG9sZCwga2V5VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGUgYnVpbGRLZXlUeXBlKCkgewotCQlpZiAodGhpcy5nZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTUJFRERBQkxFX1RZUEU7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTlRJVFlfVFlQRTsKLQkJfQotCQlpZiAodGhpcy5nZXRNYXBLZXlDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiBUeXBlLk5PX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIFR5cGUuQkFTSUNfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlDb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4gYnVpbGRNYXBLZXlDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldEpwYUZhY3RvcnkyXzAoKS5idWlsZEphdmFNYXBLZXlDb2x1bW4odGhpcywgdGhpcy5idWlsZE1hcEtleUNvbHVtbk93bmVyKCkpIDoKLQkJCQluZXcgTnVsbEphdmFNYXBLZXlDb2x1bW4yXzAodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4uT3duZXIgYnVpbGRNYXBLZXlDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlDb2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGdldE1hcEtleUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8gdGhpcy5nZXRNYXBLZXlDb2x1bW5Bbm5vdGF0aW9uXygpIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBnZXRNYXBLZXlDb2x1bW5Bbm5vdGF0aW9uXygpIHsKLQkJcmV0dXJuIChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcEtleUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQl0aGlzLnJlbW92ZU1hcEtleUNvbHVtbkFubm90YXRpb25fKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVNYXBLZXlDb2x1bW5Bbm5vdGF0aW9uXygpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXRNYXBLZXlDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLm1hcEtleUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IGNvbnZlcnRlclR5cGUpIHsKLQkJCXRoaXMubWFwS2V5Q29udmVydGVyLmRpc3Bvc2UoKTsKLQkJCUphdmFDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRLZXlDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJdGhpcy5yZXRhaW5NYXBLZXlDb252ZXJ0ZXJBbm5vdGF0aW9uKGNvbnZlcnRlckFkYXB0ZXIpOwotCQkJdGhpcy5zZXRNYXBLZXlDb252ZXJ0ZXJfKHRoaXMuYnVpbGRNYXBLZXlDb252ZXJ0ZXIoY29udmVydGVyQWRhcHRlcikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRNYXBLZXlDb252ZXJ0ZXIoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJIHJldHVybiAoY29udmVydGVyQWRhcHRlciAhPSBudWxsKSA/Ci0JCQkJY29udmVydGVyQWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsTWFwS2V5Q29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwS2V5Q29udmVydGVyXyhKYXZhQ29udmVydGVyIG1hcEtleUNvbnZlcnRlcikgewotCQlDb252ZXJ0ZXIgb2xkID0gdGhpcy5tYXBLZXlDb252ZXJ0ZXI7Ci0JCXRoaXMubWFwS2V5Q29udmVydGVyID0gbWFwS2V5Q29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQX0tFWV9DT05WRVJURVJfUFJPUEVSVFksIG9sZCwgbWFwS2V5Q29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciBhbGwgdGhlIGNvbnZlcnRlciBhbm5vdGF0aW9ucyA8ZW0+ZXhjZXB0PC9lbT4gZm9yIHRoZSBhbm5vdGF0aW9uCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuIElmIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCByZW1vdmUgPGVtPmFsbDwvZW0+IHRoZSBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmV0YWluTWFwS2V5Q29udmVydGVyQW5ub3RhdGlvbihKYXZhQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlcikgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyICE9IGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJCQlhZGFwdGVyLnJlbW92ZUNvbnZlcnRlckFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRNYXBLZXlDb252ZXJ0ZXIoKSB7Ci0JCWlmIChpc0pwYTJfMENvbXBhdGlibGUoKSkgewotCQkJSnBhRmFjdG9yeSBqcGFGYWN0b3J5ID0gdGhpcy5nZXRKcGFGYWN0b3J5KCk7Ci0JCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRNYXBLZXlDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLCBqcGFGYWN0b3J5KTsKLQkJCQlpZiAoamF2YUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBqYXZhQ29udmVydGVyOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxNYXBLZXlDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jTWFwS2V5Q29udmVydGVyKCkgewotCQlBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+IGFzc29jID0gdGhpcy5nZXRNYXBLZXlDb252ZXJ0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhc3NvYyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldE1hcEtleUNvbnZlcnRlcl8odGhpcy5idWlsZE51bGxNYXBLZXlDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA9IGFzc29jLmdldEtleSgpOwotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXNzb2MuZ2V0VmFsdWUoKTsKLQkJCWlmICgodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSAmJgotCQkJCQkodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpID09IGFubm90YXRpb24pKSB7Ci0JCQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldE1hcEtleUNvbnZlcnRlcl8oYWRhcHRlci5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCB0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBjb252ZXJ0ZXIgYW5ub3RhdGlvbiB3ZSBmaW5kIGFsb25nIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiBhZGFwdGVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNvbnZlcnRlciBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb248SmF2YUNvbnZlcnRlci5BZGFwdGVyLCBBbm5vdGF0aW9uPiBnZXRNYXBLZXlDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlpZiAoaXNKcGEyXzBDb21wYXRpYmxlKCkpIHsKLQkJCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhZGFwdGVyLmdldENvbnZlcnRlckFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+KGFkYXB0ZXIsIGFubm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlciBidWlsZE51bGxNYXBLZXlDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTnVsbEphdmFDb252ZXJ0ZXIodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIuQWRhcHRlciBnZXRLZXlDb252ZXJ0ZXJBZGFwdGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBnZXRNYXBLZXlDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIE1BUF9LRVlfQ09OVkVSVEVSX0FEQVBURVJTOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPiBnZXRNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5nZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBtYXAga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKHRoaXMuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGRNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhSm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW5kZXgpOwotCQl0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZU1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFKb2luQ29sdW1uLCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbj4gYnVpbGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCkgewotCQlTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIG1hcCBrZXkgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhSm9pbkNvbHVtbiwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX01BUF9LRVlfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldE1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBjb250ZXh0RWxlbWVudC5nZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZE1hcEtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBtYXAga2V5IGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlKYXZhSm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTUFQX0tFWV9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPiBnZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiAhPSBudWxsKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48SmF2YUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbih0aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbih0aGlzLmJ1aWxkTnVsbE1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIAlpc0pwYTJfMENvbXBhdGlibGUoKSAmJgotCQkJCSF0aGlzLmhhc1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgJiYKLQkJCQlnZXRLZXlUeXBlKCkgPT0gVHlwZS5FTlRJVFlfVFlQRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRNYXBLZXlKb2luQ29sdW1uKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIHRoaXMubWFwS2V5Sm9pbkNvbHVtbk93bmVyLCBqb2luQ29sdW1uQW5ub3RhdGlvbik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGpvaW4gY29sdW1uIGFubm90YXRpb25zICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24+IGdldE1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpIHsKLQkJaWYgKGlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQlyZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbj4odGhpcy5nZXROZXN0YWJsZU1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpKTsKLQkJfQotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnMoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gYWRkTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKGluZGV4LCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKGludCBpbmRleCkgewotCQl0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gYnVpbGROdWxsTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiBuZXcgTnVsbE1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcih0aGlzLCB0aGlzLmJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBidWlsZERlZmF1bHRGZXRjaCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRkVUQ0hfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlyZXN1bHQgPSB0aGlzLm9yZGVyYWJsZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCWlmICh0aGlzLm1hcEtleU5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLmphdmFDYW5kaWRhdGVNYXBLZXlOYW1lcyhmaWx0ZXIpOwotCQl9Ci0KLQkJcmVzdWx0ID0gdGhpcy5tYXBLZXlDb2x1bW4uZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLmdldE1hcEtleUpvaW5Db2x1bW5zKCkpIHsKLQkJCXJlc3VsdCA9IGpvaW5Db2x1bW4uZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hcEtleU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKG1hcEtleUFubm90YXRpb24gIT0gbnVsbCkgJiYgbWFwS2V5QW5ub3RhdGlvbi5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGphdmFDYW5kaWRhdGVNYXBLZXlOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU1hcEtleU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdGhpcy5hZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JCXN1cGVyLmFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyh0eXBlQXJndW1lbnROYW1lcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlQXJndW1lbnROYW1lVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJU3RyaW5nIGtleVR5cGVOYW1lID0gKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKLQkJaWYgKGtleVR5cGVOYW1lICE9IG51bGwpIHsKLQkJCXR5cGVBcmd1bWVudE5hbWVzLmFkZChrZXlUeXBlTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0TWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlTmFtZSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlTWFwS2V5Q2xhc3MobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl0aGlzLm9yZGVyYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlTWFwS2V5KG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBLZXkoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpICE9IG51bGwpIHsvL0lmIE1hcEtleSBhbm5vdGF0aW9uIHNwZWNpZmllZCwgbm8gb3RoZXIgTWFwS2V5KiBhbm5vdGF0aW9ucyBjYW4gYmUgc3BlY2lmaWVkLCBkb24ndCB2YWxpZGF0ZSB0aGVtCi0JCQkvL1RPRE8gdmFsaWRhdGUgdGhhdCB0aGUgbWFwIGtleSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYXR0cmlidXRlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0S2V5VHlwZSgpID09IFR5cGUuQkFTSUNfVFlQRSkgewotCQkJdGhpcy5tYXBLZXlDb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCXRoaXMubWFwS2V5Q29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nZXRLZXlUeXBlKCkgPT0gVHlwZS5FTlRJVFlfVFlQRSkgewotCQkJZm9yIChKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogdGhpcy5nZXRNYXBLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJam9pbkNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZ2V0S2V5VHlwZSgpID09IFR5cGUuRU1CRUREQUJMRV9UWVBFKSB7Ci0JCQl0aGlzLm1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQkvL3ZhbGlkYXRlIG1hcCBrZXkgYXNzb2NpYXRpb24gb3ZlcnJpZGVzIC0gZm9yIGVjbGlwc2VsaW5rCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcEtleUNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbigpLmlzTWFwKCkpIHsKLQkJCXRoaXMudmFsaWRhdGVNYXBLZXlDbGFzc18obWVzc2FnZXMsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBLZXlDbGFzc18oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmdldE1hcEtleUNsYXNzKCkgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkJKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCwKLQkJCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzb21lIGNvbW1vbiBiZWhhdmlvcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE93bmVyCi0JewotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIE1hcEtleUNvbHVtbk93bmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RPd25lcgotCQlpbXBsZW1lbnRzIEphdmFDb2x1bW4uT3duZXIKLQl7Ci0JCXB1YmxpYyBNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0TWFwS2V5Q29sdW1uQW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJCUFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLnJlbW92ZU1hcEtleUNvbHVtbkFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXROYW1lKCkgKyAiX0tFWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlDb2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUJhc2VDb2x1bW4pIGNvbHVtbiwgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgUmVsYXRpb25zaGlwU3RyYXRlZ3lUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIodGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdE93bmVyCi0JCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyMl8wLk93bmVyCi0JewotCQlwdWJsaWMgSmF2YVJlc291cmNlQXR0cmlidXRlIGdldFJlc291cmNlTWVtYmVyKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCB0YWJsZSBuYW1lIGl0IG5lZWRzIHRvIGJlIHRoZSBzYW1lCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUuICB0aGUgdGFibGUgaXMgYWx3YXlzIHRoZSBjb2xsZWN0aW9uIHRhYmxlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldERlZmF1bHRUYWJsZU5hbWUoKSwgdGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCQlUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAob3ZlcnJpZGRlblR5cGVNYXBwaW5nICE9IG51bGwpID8gb3ZlcnJpZGRlblR5cGVNYXBwaW5nLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TU0lCTEVfUFJFRklYID0gImtleSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIFN0cmluZyBnZXRQb3NzaWJsZVByZWZpeCgpIHsKLQkJCXJldHVybiBQT1NTSUJMRV9QUkVGSVg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFdyaXRlUHJlZml4KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UG9zc2libGVQcmVmaXgoKTsKLQkJfQotCi0JCS8vIHNpbmNlIG9ubHkgYSBtYXAncyBrZXkgY2FuIGJlIGFuIGVtYmVkZGFibGUgb24gYSAxLW0gb3IgbS1tOwotCQkvLyBhbGwgb3ZlcnJpZGVzIGFyZSByZWxldmFudAotCQlwdWJsaWMgYm9vbGVhbiBpc1JlbGV2YW50KFN0cmluZyBvdmVycmlkZU5hbWUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbih0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIChBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQkJCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIGNvbHVtbiwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBSZWxhdGlvbnNoaXBTdHJhdGVneVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcih0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBNYXBLZXlKb2luQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyCi0JewotCQlwcm90ZWN0ZWQgTWFwS2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldE5hbWUoKSArICJfS0VZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0U3RyYXRlZ3koKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGUgbWFwIGtleSBqb2luIGNvbHVtbiBjYW4gYmUgb24gYSBzZWNvbmRhcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlKb2luQ29sdW1uVmFsaWRhdG9yKAotCQkJCXRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLAotCQkJCShSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwKLQkJCQl0aGlzLCAKLQkJCQkoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQluZXcgUmVsYXRpb25zaGlwU3RyYXRlZ3lUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoZ2V0UmVsYXRpb25zaGlwKCkuZ2V0U3RyYXRlZ3koKSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNmOThmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YTx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPmRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKiA8bGk+b3JkZXIgY29sdW1uCi0gKiA8bGk+cHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDwvdWw+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBhbnkgc3ViY2xhc3MgdGhhdCBkaXJlY3RseSBob2xkcyBpdHMgY29sdW1uIGFubm90YXRpb24KLSAqIG11c3Q6PHVsPgotICogPGxpPmNhbGwgdGhlICJzdXBlciIgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIGNvbHVtbiBhbm5vdGF0aW9uCi0gKiAgICAge0BsaW5rICNBYnN0cmFjdEphdmFOYW1lZENvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUsIEphdmFSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyLCBOYW1lZENvbHVtbkFubm90YXRpb24pfQotICogPGxpPm92ZXJyaWRlIHtAbGluayAjc2V0Q29sdW1uQW5ub3RhdGlvbihOYW1lZENvbHVtbkFubm90YXRpb24pfSB0byBzZXQgdGhlIGNvbHVtbiBhbm5vdGF0aW9uCi0gKiAgICAgc28gaXQgaXMgaW4gcGxhY2UgYmVmb3JlIHRoZSBjb2x1bW4ncyBzdGF0ZSAoZS5nLiB7QGxpbmsgI3NwZWNpZmllZE5hbWV9KQotICogICAgIGlzIGluaXRpYWxpemVkCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW48QSBleHRlbmRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbiwgTyBleHRlbmRzIEphdmFSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFOYW1lZENvbHVtbgotewotCXByb3RlY3RlZCBmaW5hbCBPIG93bmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbkRlZmluaXRpb247Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFOYW1lZENvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPIG93bmVyKSB7Ci0JCXRoaXMocGFyZW50LCBvd25lciwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YU5hbWVkQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE8gb3duZXIsIEEgY29sdW1uQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuc2V0Q29sdW1uQW5ub3RhdGlvbihjb2x1bW5Bbm5vdGF0aW9uKTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gdGhpcy5idWlsZFNwZWNpZmllZE5hbWUoKTsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uID0gdGhpcy5idWlsZENvbHVtbkRlZmluaXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTmFtZSgpKTsKLQkJdGhpcy5zZXRDb2x1bW5EZWZpbml0aW9uXyh0aGlzLmJ1aWxkQ29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIGFubm90YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKYXZhIGNvbHVtbiBhbm5vdGF0aW9uLiBEbyBub3QgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIEphdmEgYW5ub3RhdGlvbiBkb2VzIG5vdCBleGlzdDsgcmV0dXJuIGEgPGVtPm51bGw8L2VtPiBjb2x1bW4gYW5ub3RhdGlvbgotCSAqIGluc3RlYWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEEgZ2V0Q29sdW1uQW5ub3RhdGlvbigpOwotCi0JLyoqCi0JICogc2VlIGNsYXNzIGNvbW1lbnQuLi4gKHtAbGluayBBYnN0cmFjdEphdmFOYW1lZENvbHVtbn0pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29sdW1uQW5ub3RhdGlvbihBIGNvbHVtbkFubm90YXRpb24pIHsKLQkJaWYgKGNvbHVtbkFubm90YXRpb24gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhpcyBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuIGlmIHRoZSBjb2x1bW4gYW5ub3RhdGlvbiBpcyBub3QgbnVsbDogIiArIGNvbHVtbkFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWROYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWROYW1lIDogdGhpcy5kZWZhdWx0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWROYW1lLCBuYW1lKSkgewotCQkJdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuc2V0TmFtZShuYW1lKTsKLQkJCXRoaXMucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkTmFtZV8obmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdENvbHVtbk5hbWUodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBkZWZpbml0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmNvbHVtbkRlZmluaXRpb24sIGNvbHVtbkRlZmluaXRpb24pKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbkRlZmluaXRpb24pOwotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRDb2x1bW5EZWZpbml0aW9uXyhjb2x1bW5EZWZpbml0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbHVtbkRlZmluaXRpb25fKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW5EZWZpbml0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGJ1aWxkQ29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldENvbHVtbkRlZmluaXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbHVtbiBnZXREYkNvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIucmVzb2x2ZURiVGFibGUodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLiBUaGlzIGlzIG92ZXJyaWRkZW4KLQkgKiBpbiB7QGxpbmsgQWJzdHJhY3RKYXZhQmFzZUNvbHVtbn0gd2hlcmUgYSB0YWJsZSBjYW4gYmUgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGJDb2x1bW4oKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRDb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ2FuZGlkYXRlTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5nZXRDYW5kaWRhdGVOYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0Q2FuZGlkYXRlTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVOYW1lcygpIHsKLQkJVGFibGUgZGJUYWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOwotCQlyZXR1cm4gKGRiVGFibGUgIT0gbnVsbCkgPyBkYlRhYmxlLmdldFNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+IGluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5idWlsZFZhbGlkYXRvcihhc3RSb290KS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuYnVpbGRDb2x1bW5WYWxpZGF0b3IodGhpcywgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5vd25lci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgc3ViY2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiNpc1ZpcnR1YWwoKX0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlOYW1lZENvbHVtbiBvbGRDb2x1bW4pIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lKG9sZENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb24ob2xkQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5TmFtZWRDb2x1bW4gdmlydHVhbENvbHVtbikgewotCQl0aGlzLnNldFNwZWNpZmllZE5hbWUodmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb24odmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJU3RyaW5nIHRhYmxlID0gdGhpcy5nZXRUYWJsZSgpOwotCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKHRhYmxlKTsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQl9Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTM5ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjxDIGV4dGVuZHMgSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4+Ci0JaW1wbGVtZW50cyBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEMgY29sdW1uOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290OwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcihDIGNvbHVtbiwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JCXRoaXMuYXN0Um9vdCA9IGFzdFJvb3Q7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSh0aGlzLmFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT25lVG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzYxNGI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ1JlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuTnVsbEphdmFPcnBoYW5SZW1vdmFsMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxPbmVUb01hbnlBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAsIEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgb3JwaGFuUmVtb3ZhbDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YU9uZVRvTWFueU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3JwaGFuUmVtb3ZhbCA9IHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMub3JwaGFuUmVtb3ZhbC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWxhdGlvbnNoaXAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gKEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXApIHN1cGVyLmdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcCBidWlsZFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcCh0aGlzLCB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JwaGFuIHJlbW92YWwgKioqKioqKioqKgotCi0JcHVibGljIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBidWlsZE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8gCi0JCQkJdGhpcy5nZXRKcGFGYWN0b3J5Ml8wKCkuYnVpbGRKYXZhT3JwaGFuUmVtb3ZhbCh0aGlzKSA6IAotCQkJCW5ldyBOdWxsSmF2YU9ycGhhblJlbW92YWwyXzAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjYTVlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT25lVG9PbmVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YU9ycGhhblJlbW92YWwyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPE9uZVRvT25lQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFPbmVUb09uZU1hcHBpbmcyXzAsIEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgb3JwaGFuUmVtb3ZhbDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsID0gdGhpcy5idWlsZE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm9ycGhhblJlbW92YWwudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXApIHN1cGVyLmdldFJlbGF0aW9uc2hpcCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAgYnVpbGRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPbmVUb09uZVJlbGF0aW9uc2hpcCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JwaGFuIHJlbW92YWwgKioqKioqKioqKgotCi0JcHVibGljIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBidWlsZE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldEpwYUZhY3RvcnkyXzAoKS5idWlsZEphdmFPcnBoYW5SZW1vdmFsKHRoaXMpIDoKLQkJCQluZXcgTnVsbEphdmFPcnBoYW5SZW1vdmFsMl8wKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg2ZDZhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGVDb2x1bW4uT3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlQ29udGFpbmVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogU3BlY2lmaWVkIEphdmEgb3ZlcnJpZGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU92ZXJyaWRlPEMgZXh0ZW5kcyBKYXZhT3ZlcnJpZGVDb250YWluZXIsIEEgZXh0ZW5kcyBPdmVycmlkZUFubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YU92ZXJyaWRlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEEgb3ZlcnJpZGVBbm5vdGF0aW9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhT3ZlcnJpZGUoQyBwYXJlbnQsIEEgb3ZlcnJpZGVBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3ZlcnJpZGVBbm5vdGF0aW9uID0gb3ZlcnJpZGVBbm5vdGF0aW9uOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCB0aGUgcHJlZml4IChpZiBuZWNlc3NhcnkpIGJlZm9yZSBzdG9yaW5nIHRoZSBuYW1lIGluIHRoZSBjb250ZXh0Ci0JICogbW9kZWwuIFBhc3MgdGhlIHVuY2hhbmdlZCBuYW1lIHRvIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5vdmVycmlkZUFubm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLnN0cmlwUHJlZml4KG5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJpcCB0aGUgcHJlZml4IChpZiBuZWNlc3NhcnkpIGZyb20gdGhlIG5hbWUgdGFrZW4gZnJvbSB0aGUgYW5ub3RhdGlvbgotCSAqIGJlZm9yZSBzdG9yaW5nIGl0IGluIHRoZSBjb250ZXh0IG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zdHJpcFByZWZpeCh0aGlzLm92ZXJyaWRlQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgc3RyaXBQcmVmaXgoU3RyaW5nIHJhd05hbWUpIHsKLQkJaWYgKHJhd05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHByZWZpeCA9IHRoaXMuZ2V0UG9zc2libGVQcmVmaXgoKTsKLQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcmF3TmFtZTsKLQkJfQotCQlpbnQgcHJlZml4TGVuZ3RoID0gcHJlZml4Lmxlbmd0aCgpOwotCQlpZiAoKHJhd05hbWUubGVuZ3RoKCkgPiBwcmVmaXhMZW5ndGgpICYmCi0JCQkJKHJhd05hbWUuY2hhckF0KHByZWZpeExlbmd0aCkgPT0gJy4nKSAmJgotCQkJCXJhd05hbWUuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0JCQlyZXR1cm4gcmF3TmFtZS5zdWJzdHJpbmcocHJlZml4TGVuZ3RoICsgMSk7Ci0JCX0KLQkJcmV0dXJuIHJhd05hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQb3NzaWJsZVByZWZpeCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyB0aGlzLmdldENvbnRhaW5lcjJfMCgpLmdldFBvc3NpYmxlUHJlZml4KCkgOiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQvdmlydHVhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpcnR1YWxPdmVycmlkZSBjb252ZXJ0VG9WaXJ0dWFsKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5jb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEMgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEMpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBDIGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFPdmVycmlkZUNvbnRhaW5lcjJfMCBnZXRDb250YWluZXIyXzAoKSB7Ci0JCXJldHVybiAoSmF2YU92ZXJyaWRlQ29udGFpbmVyMl8wKSB0aGlzLmdldENvbnRhaW5lcigpOwotCX0KLQotCXB1YmxpYyBBIGdldE92ZXJyaWRlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGVBbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5T3ZlcnJpZGUgb2xkT3ZlcnJpZGUpIHsKLQkJdGhpcy5zZXROYW1lKHRoaXMucHJlZml4KG9sZE92ZXJyaWRlLmdldE5hbWUoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seU92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSkgewotCQl0aGlzLnNldE5hbWUodGhpcy5wcmVmaXgodmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIE93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKHRoaXMsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByZWZpeChTdHJpbmcgb2xkTmFtZSkgewotCQlpZiAob2xkTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgcHJlZml4ID0gdGhpcy5nZXRXcml0ZVByZWZpeCgpOwotCQlyZXR1cm4gKHByZWZpeCA9PSBudWxsKSA/IG9sZE5hbWUgOiAocHJlZml4ICsgJy4nICsgb2xkTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRXcml0ZVByZWZpeCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyB0aGlzLmdldENvbnRhaW5lcjJfMCgpLmdldFdyaXRlUHJlZml4KCkgOiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0aGlzLm5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFDYW5kaWRhdGVOYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRlQW5ub3RhdGlvbi5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZU5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0Q2FuZGlkYXRlTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVOYW1lcygpOwotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuYnVpbGRWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IodGhpcywgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotCi0JcHJvdGVjdGVkIE92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEphdmFPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyKHRoaXMsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5vdmVycmlkZUFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLm92ZXJyaWRlQW5ub3RhdGlvbi5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2M2Y4NDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEFjY2Vzc29yIGFjY2Vzc29yOwotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZGVmYXVsdEFjY2VzczsKLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3M7Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZzsgIC8vIG5ldmVyIG51bGwKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRNYXBwaW5nS2V5OwotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYWNjZXNzb3IgPSBuZXcgRmllbGRBY2Nlc3Nvcih0aGlzLCByZXNvdXJjZUZpZWxkKTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFjY2Vzc29yID0gbmV3IFByb3BlcnR5QWNjZXNzb3IodGhpcywgcmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyKTsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBBY2Nlc3NvciBhY2Nlc3NvcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmFjY2Vzc29yID0gYWNjZXNzb3I7Ci0JCXRoaXMuaW5pdGlhbGl6ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIHRoaXMgaXMgZGV0ZXJtaW5lZCBkaXJlY3RseSBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSB0aGlzLmJ1aWxkRGVmYXVsdEFjY2VzcygpOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKTsKLQotCQkvLyBrZWVwIG5vbi1udWxsIGF0IGFsbCB0aW1lcwotCQl0aGlzLm1hcHBpbmcgPSB0aGlzLmJ1aWxkTWFwcGluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJLy8gdGhpcyBpcyBkZXRlcm1pbmVkIGRpcmVjdGx5IGZyb20gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRoaXMuc2V0RGVmYXVsdEFjY2Vzcyh0aGlzLmJ1aWxkRGVmYXVsdEFjY2VzcygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3NfKHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCXRoaXMuc3luY01hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU1hcHBpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JLyoqCi0JICogbmFtZSB3aWxsIG5vdCBjaGFuZ2UgaW4gamF2YSwgYSBuZXcgcGVyc2lzdGVudCBhdHRyaWJ1dGUgd2lsbCBiZSBidWlsdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCi0JcHVibGljIEFjY2Vzc29yIGdldEFjY2Vzc29yKCkgewotCQlyZXR1cm4gdGhpcy5hY2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmlzRm9yKHJlc291cmNlRmllbGQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmlzRm9yKHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcik7Ci0JfQotCQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJQWNjZXNzVHlwZSBhY2Nlc3MgPSB0aGlzLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQlyZXR1cm4gKGFjY2VzcyAhPSBudWxsKSA/IGFjY2VzcyA6IHRoaXMuZGVmYXVsdEFjY2VzczsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JCXRoaXMuZGVmYXVsdEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gZ2V0QWNjZXNzb3IoKS5nZXREZWZhdWx0QWNjZXNzKCk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0U3BlY2lmaWVkQWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogRG9uJ3Qgc3VwcG9ydCBjaGFuZ2luZyB0byBzcGVjaWZpZWQgYWNjZXNzIG9uIGEgamF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSwgdGhpcwotCSAqIGludm9sdmVzIGEgbGFyZ2VyIHByb2Nlc3Mgb2YgbW92aW5nIHRoZSBhbm5vdGF0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyBmaWVsZC9wcm9wZXJ0eQotCSAqIHdoaWNoIG1heSBvciBtYXkgbm90IGV4aXN0IG9yIG1pZ2h0IG5lZWQgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzXyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZCwgYWNjZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBhIHNwZWNpZmllZCBBY2Nlc3MgYW5ub3RhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBieSBKUEEgMi4wLCBidXQKLQkgKiBwdXR0aW5nIHRoaXMgY29kZSBoZXJlIHRvIHNpbXBsaWZ5LiBBIDEuMCBwZXJzaXN0ZW50IGF0dHJpYnV0ZQotCSAqIHdpbGwgbmV2ZXIgaGF2ZSBhbiBBY2Nlc3MgYW5ub3RhdGlvbiBvbiBpdCwgc3BlY2lmaWVkQWNjZXNzIHdpbGwKLQkgKiBhbHdheXMgYmUgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZFNwZWNpZmllZEFjY2VzcygpIHsKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbiBhY2Nlc3NBbm5vdGF0aW9uID0gdGhpcy5nZXRBY2Nlc3NBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYWNjZXNzQW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBBY2Nlc3NUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChhY2Nlc3NBbm5vdGF0aW9uLmdldFZhbHVlKCksIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKSwgdGhpcy5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjY2VzczJfMEFubm90YXRpb24gZ2V0QWNjZXNzQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChBY2Nlc3MyXzBBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHBpbmcgKioqKioqKioqKgotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogQ2xpZW50cyBkbyBub3Qgc2V0IHRoZSBtYXBwaW5nIGRpcmVjdGx5LgotCSAqIEBzZWUgI3NldE1hcHBpbmdLZXkoU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmcoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBvbGQgPSB0aGlzLm1hcHBpbmc7Ci0JCXRoaXMubWFwcGluZyA9IG1hcHBpbmc7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQSU5HX1BST1BFUlRZLCBvbGQsIG1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRLZXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB0cmFuc2l0aW9uczoKLQkgKiA8dGFibGUgYm9yZGVyPgotCSAqIDx0aD4KLQkgKiA8dGg+bnVsbCBtYXBwaW5nL2RlZmF1bHQ8YnI+Ci0JICogICAgIDxjb2RlPmtleSA9IG51bGw8L2NvZGU+Ci0JICogPHRoPnNwZWNpZmllZCBtYXBwaW5nIEE8YnI+Ci0JICogICAgIDxjb2RlPmtleSA9ICJBIjwvY29kZT4KLQkgKiA8dGg+c3BlY2lmaWVkIG1hcHBpbmcgQjxicj4KLQkgKiAgICAgPGNvZGU+a2V5ID0gIkIiPC9jb2RlPgotCSAqIDx0cj4KLQkgKiA8dGg+W2RlZmF1bHRdIG51bGwgbWFwcGluZwotCSAqICAgPHRkPmRvIG5vdGhpbmcKLQkgKiAgIDx0ZD5hZGQgYW5ub3RhdGlvbiBBPGJyPgotCSAqICAgICAgIHNldCBuZXcgbWFwcGluZyBBCi0JICogICA8dGQ+YWRkIGFubm90YXRpb24gQjxicj4KLQkgKiAgICAgICBzZXQgbmV3IG1hcHBpbmcgQgotCSAqIDx0cj4KLQkgKiA8dGg+ZGVmYXVsdCBtYXBwaW5nIEEKLQkgKiAgIDx0ZD5kbyBub3RoaW5nCi0JICogICA8dGQ+YWRkIGFubm90YXRpb24gQTxicj4KLQkgKiAgICAgICA8ZW0+cmUtdXNlPC9lbT4gZGVmYXVsdCBtYXBwaW5nIEEKLQkgKiAgIDx0ZD5hZGQgYW5ub3RhdGlvbiBCPGJyPgotCSAqICAgICAgIHNldCBuZXcgbWFwcGluZyBCCi0JICogPHRyPgotCSAqIDx0aD5zcGVjaWZpZWQgbWFwcGluZyBBCi0JICogICA8dGQ+cmVtb3ZlIGFubm90YXRpb24gQTxicj4KLQkgKiAgICAgICBzZXQgbmV3IGRlZmF1bHQgb3IgbnVsbCBtYXBwaW5nCi0JICogICA8dGQ+ZG8gbm90aGluZwotCSAqICAgPHRkPnJlbW92ZSBhbm5vdGF0aW9uIEE8YnI+Ci0JICogICAgICAgYWRkIGFubm90YXRpb24gQjxicj4KLQkgKiAgICAgICBzZXQgbmV3IG1hcHBpbmcgQgotCSAqIDwvdGFibGU+Ci0JICogVGhlICJkbyBub3RoaW5nIiB0cmFuc2l0aW9ucyBhcmUgaGFuZGxlZCBpbiB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KSB7Ci0JCWlmICh0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkpIHsKLQkJCWlmIChrZXkgPT0gbnVsbCkgewotCQkJCS8vIGxlYXZlIHRoZSBkZWZhdWx0IG1hcHBpbmcgdW5jaGFuZ2VkCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0TWFwcGluZ0tleV8oa2V5KTsgIC8vIHJlcGxhY2UgdGhlIGRlZmF1bHQgbWFwcGluZwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwoa2V5LCB0aGlzLm1hcHBpbmcuZ2V0S2V5KCkpKSB7Ci0JCQkJLy8gbGVhdmUgdGhlIHNwZWNpZmllZCBtYXBwaW5nIHVuY2hhbmdlZAotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldE1hcHBpbmdLZXlfKGtleSk7ICAvLyByZXBsYWNlIHRoZSBzcGVjaWZpZWQgbWFwcGluZwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogV2UgaGF2ZSBlaXRoZXI6PHVsPgotCSAqIDxsaT5hIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZyBhbmQgYSBub24tPGNvZGU+bnVsbDwvY29kZT4ga2V5Ci0JICogPC91bD5vcjx1bD4KLQkgKiA8bGk+YSA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZyBhbmQgYSBkaWZmZXJlbnQgKHBvc3NpYmx5Ci0JICogICAgIDxjb2RlPm51bGw8L2NvZGU+KSBrZXkKLQkgKiA8L3VsPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdLZXlfKFN0cmluZyBrZXkpIHsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gPSB0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9uKGtleSk7Ci0JCWlmIChkZWZpbml0aW9uID09IG51bGwpIHsKLQkJCS8vIG91ciBtYXBwaW5nIGlzICJzcGVjaWZpZWQiIGFuZCB0aGUga2V5IGlzIG51bGw7Ci0JCQkvLyBjaGVjayBmb3IgYSBkZWZhdWx0IGRlZmluaXRpb24KLQkJCWRlZmluaXRpb24gPSB0aGlzLmdldERlZmF1bHRNYXBwaW5nRGVmaW5pdGlvbigpOwotCQkJSXRlcmFibGU8U3RyaW5nPiBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzID0gKGRlZmluaXRpb24gIT0gbnVsbCkgPyBkZWZpbml0aW9uLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQkJLy8gY2xlYXIgYW55IG1hcHBpbmcgYW5ub3RhdGlvbihzKTsKLQkJCS8vIGxlYXZlIHRoZSAiZGVmYXVsdCIgbWFwcGluZydzIHN1cHBvcnRpbmcgYW5ub3RhdGlvbnM7Ci0JCQkvLyBpZiB0aGVyZSBpcyBubyAiZGVmYXVsdCIgbWFwcGluZywgY2xlYXIgYWxsIHN1cHBvcnRpbmcgYW5ub3RhdGlvbnMgdG9vKD8pCi0JCQl0aGlzLnNldE1hcHBpbmdBbm5vdGF0aW9uKG51bGwsIHN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRNYXBwaW5nQW5ub3RhdGlvbihkZWZpbml0aW9uKTsKLQkJfQotCQkvLyBub3RlOiAnZGVmaW5pdGlvbicgY2FuIHN0aWxsIGJlIG51bGwgKGlmIHRoZSBrZXkgaXMgbnVsbCBhbmQgdGhlcmUgaXMgbm8gImRlZmF1bHQiIG1hcHBpbmcpCi0JCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZyhkZWZpbml0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogZGVmaW5pdGlvbiBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nQW5ub3RhdGlvbihKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbikgewotCQl0aGlzLnNldE1hcHBpbmdBbm5vdGF0aW9uKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSwgZGVmaW5pdGlvbi5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdBbm5vdGF0aW9uKFN0cmluZyBwcmltYXJ5QW5ub3RhdGlvbk5hbWUsIEl0ZXJhYmxlPFN0cmluZz4gc3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcykgewotCQl0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuc2V0UHJpbWFyeUFubm90YXRpb24ocHJpbWFyeUFubm90YXRpb25OYW1lLCBzdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCXJldHVybiAoZGVmaW5pdGlvbiA9PSBudWxsKSA/IHRoaXMuYnVpbGROdWxsTWFwcGluZygpIDogdGhpcy5idWlsZE1hcHBpbmdfKGRlZmluaXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE51bGxNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogZGVmaW5pdGlvbiBpcyBub3QgbnVsbAotCSAqIDxwPgotCSAqIElmIHdlIGFyZSBjb252ZXJ0aW5nIGEgPGVtPmRlZmF1bHQ8L2VtPiBtYXBwaW5nIHRvIGl0cyA8ZW0+c3BlY2lmaWVkPC9lbT4KLQkgKiBtYW5pZmVzdGF0aW9uLCB3ZSBqdXN0IGtlZXAgdGhlIHNhbWUgbWFwcGluZyBhbmQgY3JlYXRlIGl0cyBhbm5vdGF0aW9uLgotCSAqIFdlIGRvIDxlbT5ub3Q8L2VtPiBkbyB0aGUgc2FtZSB0aGluZyB3aGVuIGNvbnZlcnRpbmcgYSA8ZW0+c3BlY2lmaWVkPC9lbT4KLQkgKiBtYXBwaW5nIHRvIGl0cyA8ZW0+ZGVmYXVsdDwvZW0+IG1hbmlmZXN0YXRpb24uIFdlIHJlYnVpbGQgdGhlCi0JICogZW50aXJlIG1hcHBpbmcsIHNpbXBsaWZ5aW5nIHRoZSBjbGVhcmluZyBvZiBhbGwgaXRzIHN0YXRlLiBXZSBkbyB0aGlzCi0JICogYmVjYXVzZSB3ZSBhbGxvdyBjbGllbnRzIHRvIG1vZGlmeSBhIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZyAob3IgYW55IG9mCi0JICogaXRzIGNvbXBvbmVudHMpIGRpcmVjdGx5LAotCSAqIG1vZGlmeWluZyBpdHMgc3RhdGUgYW5kIHRyaWdnZXJpbmcgYSBjb252ZXJzaW9uIHRvIGEgPGVtPnNwZWNpZmllZDwvZW0+Ci0JICogbWFwcGluZy4gVGhlIG9ubHkgd2F5IHRvIGNvbnZlcnQgYSA8ZW0+c3BlY2lmaWVkPC9lbT4gbWFwcGluZyB0byBhCi0JICogPGVtPmRlZmF1bHQ8L2VtPiBtYXBwaW5nIGlzIGJ5IHtAbGluayAjc2V0TWFwcGluZ0tleShTdHJpbmcpIHNldHRpbmcgdGhlCi0JICogbWFwcGluZyBrZXl9IHRvIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmdfKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCS8vICdtYXBwaW5nJyBpcyBudWxsIGR1cmluZyBjb25zdHJ1Y3Rpb24KLQkJaWYgKCh0aGlzLm1hcHBpbmcgIT0gbnVsbCkgJiYgdGhpcy5tYXBwaW5nLmlzRGVmYXVsdCgpICYmIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMubWFwcGluZy5nZXRLZXkoKSwgZGVmaW5pdGlvbi5nZXRLZXkoKSkpIHsKLQkJCXRoaXMubWFwcGluZy51cGRhdGVEZWZhdWx0KCk7ICAvLyBzaW5jZSBub3RoaW5nIGhlcmUgY2hhbmdlcywgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG1hcHBpbmcncyBmbGFnCi0JCQlyZXR1cm4gdGhpcy5tYXBwaW5nOwotCQl9Ci0JCXJldHVybiBkZWZpbml0aW9uLmJ1aWxkTWFwcGluZyh0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSk7Ci0JfQotCi0JLyoqCi0JICogV2Ugb25seSBsb29rIGZvciBhIDxlbT5zcGVjaWZpZWQ8L2VtPiBtYXBwaW5nIGhlcmUuCi0JICogV2UgbG9vayBmb3IgYSBkZWZhdWx0IG1hcHBpbmcgZHVyaW5nIDxlbT51cGRhdGU8L2VtPi4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1hcHBpbmcodGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb29rIGZvciBhIDxlbT5zcGVjaWZpZWQ8L2VtPiBtYXBwaW5nIGFuZCBzeW5jIG91ciBtYXBwaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNNYXBwaW5nKCkgewotCQlKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb24oKTsKLQkJaWYgKGRlZmluaXRpb24gPT0gbnVsbCkgewotCQkJaWYgKHRoaXMubWFwcGluZy5pc0RlZmF1bHQoKSkgewotCQkJCS8vIG51bGwvZGVmYXVsdCA9PiBudWxsL2RlZmF1bHQKLQkJCQl0aGlzLm1hcHBpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBzcGVjaWZpZWQgPT4gbnVsbC9kZWZhdWx0Ci0JCQkJZGVmaW5pdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCQkJdGhpcy5zZXRNYXBwaW5nKHRoaXMuYnVpbGRNYXBwaW5nKGRlZmluaXRpb24pKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLm1hcHBpbmcuaXNEZWZhdWx0KCkpIHsKLQkJCQkvLyBudWxsL2RlZmF1bHQgPT4gc3BlY2lmaWVkCi0JCQkJdGhpcy5zZXRNYXBwaW5nKHRoaXMuYnVpbGRNYXBwaW5nKGRlZmluaXRpb24pKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gc3BlY2lmaWVkID0+IHNwZWNpZmllZAotCQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0S2V5KCksIHRoaXMubWFwcGluZy5nZXRLZXkoKSkpIHsKLQkJCQkJdGhpcy5tYXBwaW5nLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLnNldE1hcHBpbmcodGhpcy5idWlsZE1hcHBpbmcoZGVmaW5pdGlvbikpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgInNwZWNpZmllZCIgbWFwcGluZyBkZWZpbml0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGtleS4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBkZWZpbml0aW9uIDogdGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0S2V5KCksIGtleSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIG1hcHBpbmcga2V5OiAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbWFwcGluZyBkZWZpbml0aW9uIGZvciB0aGUgbWFwcGluZyBjdXJyZW50bHkgc3BlY2lmaWVkIGluIHRoZQotCSAqIHNvdXJjZSBjb2RlLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0U3BlY2lmaWVkTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCWZvciAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiB0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoZGVmaW5pdGlvbi5pc1NwZWNpZmllZCh0aGlzKSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGdldFNwZWNpZmllZE1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXRTcGVjaWZpZWRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgbWFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwcGluZ0tleTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TWFwcGluZ0tleShTdHJpbmcgbWFwcGluZ0tleSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0TWFwcGluZ0tleTsKLQkJdGhpcy5kZWZhdWx0TWFwcGluZ0tleSA9IG1hcHBpbmdLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01BUFBJTkdfS0VZX1BST1BFUlRZLCBvbGQsIG1hcHBpbmdLZXkpOwotCX0KLQotCS8qKgotCSAqIElmIGEgbWFwcGluZyBhbm5vdGF0aW9uIGlzIHNwZWNpZmllZCwgd2Ugd291bGQgaGF2ZSBhbHJlYWR5IHNldCBhCi0JICogPGVtPnNwZWNpZmllZDwvZW0+IG1hcHBpbmcgaW4ge0BsaW5rICNzeW5jTWFwcGluZygpfS4gV2UgbmVlZCBvbmx5IGNoZWNrCi0JICogZm9yIGNoYW5nZXMgdG8gdGhlIDxlbT5kZWZhdWx0PC9lbT4gbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwaW5nKCkgewotCQlKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IHRoaXMuZ2V0RGVmYXVsdE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCVN0cmluZyBuZXdEZWZhdWx0S2V5ID0gKGRlZmluaXRpb24gPT0gbnVsbCkgPyBudWxsIDogZGVmaW5pdGlvbi5nZXRLZXkoKTsKLQkJaWYgKHRoaXMubWFwcGluZy5pc0RlZmF1bHQoKSAmJiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5tYXBwaW5nLmdldEtleSgpLCBuZXdEZWZhdWx0S2V5KSkgewotCQkJdGhpcy5zZXRNYXBwaW5nKHRoaXMuYnVpbGRNYXBwaW5nKGRlZmluaXRpb24pKTsgIC8vIHRoZSBkZWZhdWx0IG1hcHBpbmcgaGFzIGNoYW5nZWQKLQkJfSBlbHNlIHsKLQkJCXRoaXMubWFwcGluZy51cGRhdGUoKTsKLQkJfQotCQl0aGlzLnNldERlZmF1bHRNYXBwaW5nS2V5KG5ld0RlZmF1bHRLZXkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVmYXVsdE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlmb3IgKERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IHRoaXMuZ2V0RGVmYXVsdE1hcHBpbmdEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoZGVmaW5pdGlvbi5pc0RlZmF1bHQodGhpcykpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZ2V0RGVmYXVsdE1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBKYXZhU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQ7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcGlsYXRpb25Vbml0IGJ1aWxkQVNUUm9vdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5idWlsZEFTVFJvb3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBub3RoaW5nIHRvIGRpc3Bvc2UKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHlwZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBGcm9tIHRoZSBKUEEgc3BlYywgd2hlbiB0aGUgYmFzaWMgbWFwcGluZyBhcHBsaWVzOjxicj4KLQkgKiBJZiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcKLQkgKiBpdCBtdXN0IGJlIG1hcHBlZCBhcyA8Y29kZT5AamF2YXgucGVyc2lzdGVuY2UuQmFzaWM8L2NvZGU+Ojx1bD4KLQkgKiA8bGk+PGNvZGU+Ynl0ZVtdPC9jb2RlPgotCSAqIDxsaT48Y29kZT5qYXZhLmxhbmcuQnl0ZVtdPC9jb2RlPgotCSAqIDxsaT48Y29kZT5jaGFyW108L2NvZGU+Ci0JICogPGxpPjxjb2RlPmphdmEubGFuZy5DaGFyYWN0ZXJbXTwvY29kZT4KLQkgKiA8bGk+cHJpbWl0aXZlIHR5cGVzIChleGNlcHQgPGNvZGU+dm9pZDwvY29kZT4pCi0JICogPGxpPnByaW1pdGl2ZSB3cmFwcGVycyAoZXhjZXB0IDxjb2RlPmphdmEubGFuZy5Wb2lkPC9jb2RlPikKLQkgKiA8bGk+PGNvZGU+amF2YS5sYW5nLlN0cmluZzwvY29kZT4KLQkgKiA8bGk+PGNvZGU+amF2YS5tYXRoLkJpZ0ludGVnZXI8L2NvZGU+Ci0JICogPGxpPjxjb2RlPmphdmEubWF0aC5CaWdEZWNpbWFsPC9jb2RlPgotCSAqIDxsaT48Y29kZT5qYXZhLnV0aWwuRGF0ZTwvY29kZT4KLQkgKiA8bGk+PGNvZGU+amF2YS51dGlsLkNhbGVuZGFyPC9jb2RlPgotCSAqIDxsaT48Y29kZT5qYXZhLnNxbC5EYXRlPC9jb2RlPgotCSAqIDxsaT48Y29kZT5qYXZhLnNxbC5UaW1lPC9jb2RlPgotCSAqIDxsaT48Y29kZT5qYXZhLnNxbC5UaW1lc3RhbXA8L2NvZGU+Ci0JICogPGxpPjxjb2RlPmVudW08L2NvZGU+cwotCSAqIDxsaT5hbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgPGNvZGU+amF2YS5pby5TZXJpYWxpemFibGU8L2NvZGU+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB0eXBlSXNCYXNpYygpIHsKLQkJLy8gJ3R5cGVOYW1lJyBtYXkgaW5jbHVkZSBhcnJheSBicmFja2V0cyBidXQgbm90IGdlbmVyaWMgdHlwZSBhcmd1bWVudHMKLQkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5nZXRUeXBlTmFtZSgpOwotCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaW50IGFycmF5RGVwdGggPSBSZWZsZWN0aW9uVG9vbHMuZ2V0QXJyYXlEZXB0aEZvclR5cGVEZWNsYXJhdGlvbih0eXBlTmFtZSk7Ci0JCWlmIChhcnJheURlcHRoID4gMSkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkCi0JCX0KLQotCQlpZiAoYXJyYXlEZXB0aCA9PSAxKSB7Ci0JCQlTdHJpbmcgZWxlbWVudFR5cGVOYW1lID0gUmVmbGVjdGlvblRvb2xzLmdldEVsZW1lbnRUeXBlTmFtZUZvclR5cGVEZWNsYXJhdGlvbih0eXBlTmFtZSwgMSk7Ci0JCQlyZXR1cm4gSkRUVG9vbHMuZWxlbWVudFR5cGVJc1ZhbGlkRm9yQmFzaWNBcnJheShlbGVtZW50VHlwZU5hbWUpOwotCQl9Ci0KLQkJLy8gYXJyYXlEZXB0aCA9PSAwCi0JCWlmIChDbGFzc05hbWUuaXNWYXJpYWJsZVByaW1pdGl2ZSh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYW55IHByaW1pdGl2ZSBidXQgJ3ZvaWQnCi0JCX0KLQkJaWYgKENsYXNzTmFtZS5pc1ZhcmlhYmxlUHJpbWl0aXZlV3JhcHBlcih0eXBlTmFtZSkpIHsKLQkJCXJldHVybiB0cnVlOyAgLy8gYW55IHByaW1pdGl2ZSB3cmFwcGVyIGJ1dCAnamF2YS5sYW5nLlZvaWQnCi0JCX0KLQkJaWYgKEpEVFRvb2xzLnR5cGVJc090aGVyVmFsaWRCYXNpY1R5cGUodHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAodGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnR5cGVJc0VudW0oKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS50eXBlSXNTdWJUeXBlT2YoU0VSSUFMSVpBQkxFX1RZUEVfTkFNRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJJQUxJWkFCTEVfVFlQRV9OQU1FID0gamF2YS5pby5TZXJpYWxpemFibGUuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRTaW5nbGVSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpIHsKLQkJLy8gJ3R5cGVOYW1lJyBtYXkgaW5jbHVkZSBhcnJheSBicmFja2V0cyAoIltdIikKLQkJLy8gYnV0IG5vdCBnZW5lcmljIHR5cGUgYXJndW1lbnRzIChlLmcuICI8amF2YS5sYW5nLlN0cmluZz4iKQotCQlTdHJpbmcgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoUmVmbGVjdGlvblRvb2xzLmdldEFycmF5RGVwdGhGb3JUeXBlRGVjbGFyYXRpb24odHlwZU5hbWUpICE9IDApIHsKLQkJCXJldHVybiBudWxsOyAgLy8gYXJyYXlzIGNhbm5vdCBiZSBlbnRpdGllcwotCQl9Ci0JCWlmICh0aGlzLnR5cGVJc0NvbnRhaW5lcih0eXBlTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gImNvbnRhaW5lcnMiIGNhbm5vdCBiZSBlbnRpdGllcwotCQl9Ci0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUNvbnRhaW5lckRlZmluaXRpb24oKS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNdWx0aVJlZmVyZW5jZU1hcEtleVR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFDb250YWluZXJEZWZpbml0aW9uKCkuZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZSh0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBvbmUgb2YgdGhlIGNvbnRhaW5lcgotCSAqIHR5cGVzIGFsbG93ZWQgYnkgdGhlIEpQQSBzcGVjCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdHlwZUlzQ29udGFpbmVyKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFDb250YWluZXJEZWZpbml0aW9uKHR5cGVOYW1lKS5pc0NvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldE93bmluZ1R5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmFjY2Vzc29yLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgZnVsbFRleHRSYW5nZSA9IHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCS8vICdmdWxsVGV4dFJhbmdlJyB3aWxsIGJlIG51bGwgaWYgdGhlIGF0dHJpYnV0ZSBubyBsb25nZXIgZXhpc3RzIGluIHRoZSBqYXZhOwotCQkvLyB0aGUgY29udGV4dCBtb2RlbCBjYW4gYmUgb3V0IG9mIHN5bmNoIHdpdGggdGhlIHJlc291cmNlIG1vZGVsCi0JCS8vIHdoZW4gYSBzZWxlY3Rpb24gZXZlbnQgb2NjdXJzIGJlZm9yZSB0aGUgY29udGV4dCBtb2RlbCBoYXMgYQotCQkvLyBjaGFuY2UgdG8gc3luY2ggd2l0aCB0aGUgcmVzb3VyY2UgbW9kZWwgdmlhIHRoZSB1cGRhdGUgdGhyZWFkCi0JCXJldHVybiAoZnVsbFRleHRSYW5nZSA9PSBudWxsKSA/IGZhbHNlIDogZnVsbFRleHRSYW5nZS5pbmNsdWRlcyhvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBFbWJlZGRhYmxlIGdldEVtYmVkZGFibGUoKSB7Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHRoaXMuZ2V0VHlwZU5hbWUoKTsKLQkJcmV0dXJuICh0eXBlTmFtZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVtYmVkZGFibGUodHlwZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuaXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgOgotCQkJCXRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5tYXBwaW5nLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5idWlsZEF0dHJpYnV0ZVZhbGlkYXRvcihhc3RSb290KS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKcHRWYWxpZGF0b3IgYnVpbGRBdHRyaWJ1dGVWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlcih0aGlzLCBhc3RSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgYXR0cmlidXRlJ3Mgb3duaW5nIHR5cGUgaXMgYW4gPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudAotCSAqIHR5cGUsIHRoZSBhdHRyaWJ1dGUgbXVzdCBiZSBvbmUgb2YgdGhlIHR5cGUncyBkZWZhdWx0IGF0dHJpYnV0ZXMuCi0JICogKEFjdHVhbGx5LCB0aGUgSmF2YSBhdHRyaWJ1dGUgaXMgaGVsZCBieSBhIDxlbT52aXJ0dWFsPC9lbT4KLQkgKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhdHRyaWJ1dGUKLQkgKiAoc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGV9KQotCSAqIHRoYXQgaXMgaGVsZCBieSB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gdHlwZS4KLQkgKiBUaGUgPGVtPnZpcnR1YWw8L2VtPiBhdHRyaWJ1dGUgcmV0dXJucyB0aGUgSmF2YSBhdHRyaWJ1dGUncyBtYXBwaW5nCi0JICogYXMgaXRzIG93bi4pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlJQ29udGVudFR5cGUgcGVyc2lzdGVudFR5cGVDb250ZW50VHlwZSA9IHRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5nZXRSZXNvdXJjZVR5cGUoKS5nZXRDb250ZW50VHlwZSgpOwotCQlyZXR1cm4gISBwZXJzaXN0ZW50VHlwZUNvbnRlbnRUeXBlLmlzS2luZE9mKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKQotCQkJCSYmICEgcGVyc2lzdGVudFR5cGVDb250ZW50VHlwZS5pc0tpbmRPZihKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbigpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUNvbnRhaW5lckRlZmluaXRpb24oKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKChDb2xsZWN0aW9uTWFwcGluZykgdGhpcy5tYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgewotCQlTdHJpbmcgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JCX0KLQkJaWYgKENsYXNzTmFtZS5pc1ByaW1pdGl2ZSh0eXBlTmFtZSkpIHsKLQkJCXJldHVybiBDbGFzc05hbWUuZ2V0V3JhcHBlckNsYXNzTmFtZSh0eXBlTmFtZSk7ICAvLyA/Pz8KLQkJfQotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpQQSBjb250YWluZXIgZGVmaW5pdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhQ29udGFpbmVyRGVmaW5pdGlvbiBnZXRKcGFDb250YWluZXJEZWZpbml0aW9uKCkgewotCQkvLyAndHlwZU5hbWUnIG1heSBpbmNsdWRlIGFycmF5IGJyYWNrZXRzICgiW10iKQotCQkvLyBidXQgbm90IGdlbmVyaWMgdHlwZSBhcmd1bWVudHMgKGUuZy4gIjxqYXZhLmxhbmcuU3RyaW5nPiIpCi0JCXJldHVybiB0aGlzLmdldEpwYUNvbnRhaW5lckRlZmluaXRpb24odGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSlBBIGNvbnRhaW5lciBkZWZpbml0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlOwotCSAqIHJldHVybiBhICJudWxsIiBkZWZpbml0aW9uIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyBub3QgImFzc2lnbmFibGUgdG8iIG9uZSBvZiB0aGUKLQkgKiBjb250YWluZXIgdHlwZXMgYWxsb3dlZCBieSB0aGUgSlBBIHNwZWMuCi0JICovCi0JcHJvdGVjdGVkIEpwYUNvbnRhaW5lckRlZmluaXRpb24gZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJZm9yIChKcGFDb250YWluZXJEZWZpbml0aW9uIGRlZmluaXRpb24gOiB0aGlzLmdldEpwYUNvbnRhaW5lckRlZmluaXRpb25zKCkpIHsKLQkJCWlmIChkZWZpbml0aW9uLmlzQXNzaWduYWJsZUZyb20odHlwZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEpwYUNvbnRhaW5lckRlZmluaXRpb24uTnVsbC5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFDb250YWluZXJEZWZpbml0aW9uPiBnZXRKcGFDb250YWluZXJEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIEpQQV9DT05UQUlORVJfREVGSU5JVElPTlM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKcGFDb250YWluZXJEZWZpbml0aW9uW10gSlBBX0NPTlRBSU5FUl9ERUZJTklUSU9OX0FSUkFZID0gbmV3IEpwYUNvbnRhaW5lckRlZmluaXRpb25bXSB7Ci0JCW5ldyBDb2xsZWN0aW9uSnBhQ29udGFpbmVyRGVmaW5pdGlvbihqYXZhLnV0aWwuU2V0LmNsYXNzLCBKUEEyXzAuU0VUX0FUVFJJQlVURSksCi0JCW5ldyBDb2xsZWN0aW9uSnBhQ29udGFpbmVyRGVmaW5pdGlvbihqYXZhLnV0aWwuTGlzdC5jbGFzcywgSlBBMl8wLkxJU1RfQVRUUklCVVRFKSwKLQkJbmV3IENvbGxlY3Rpb25KcGFDb250YWluZXJEZWZpbml0aW9uKGphdmEudXRpbC5Db2xsZWN0aW9uLmNsYXNzLCBKUEEyXzAuQ09MTEVDVElPTl9BVFRSSUJVVEUpLAotCQluZXcgTWFwSnBhQ29udGFpbmVyRGVmaW5pdGlvbihqYXZhLnV0aWwuTWFwLmNsYXNzLCBKUEEyXzAuTUFQX0FUVFJJQlVURSkKLQl9OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxKcGFDb250YWluZXJEZWZpbml0aW9uPiBKUEFfQ09OVEFJTkVSX0RFRklOSVRJT05TID0gbmV3IEFycmF5SXRlcmFibGU8SnBhQ29udGFpbmVyRGVmaW5pdGlvbj4oSlBBX0NPTlRBSU5FUl9ERUZJTklUSU9OX0FSUkFZKTsKLQotCi0JLyoqCi0JICogQWJzdHJhY3QgSlBBIGNvbnRhaW5lciBkZWZpbml0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdEpwYUNvbnRhaW5lckRlZmluaXRpb24KLQkJaW1wbGVtZW50cyBKcGFDb250YWluZXJEZWZpbml0aW9uCi0JewotCQlwcm90ZWN0ZWQgZmluYWwgQ2xhc3M8Pz4gY29udGFpbmVyQ2xhc3M7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgbWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZTsKLQotCQlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFDb250YWluZXJEZWZpbml0aW9uKENsYXNzPD8+IGNvbnRhaW5lckNsYXNzLCBTdHJpbmcgbWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCWlmICgoY29udGFpbmVyQ2xhc3MgPT0gbnVsbCkgfHwgKG1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUgPT0gbnVsbCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuY29udGFpbmVyQ2xhc3MgPSBjb250YWluZXJDbGFzczsKLQkJCXRoaXMubWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSA9IG1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVGcm9tKFN0cmluZyB0eXBlTmFtZSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gdGhpcy5jb250YWluZXJDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKENsYXNzLmZvck5hbWUodHlwZU5hbWUpKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ29sbGVjdGlvbiBKUEEgY29udGFpbmVyIGRlZmluaXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbGxlY3Rpb25KcGFDb250YWluZXJEZWZpbml0aW9uCi0JCWV4dGVuZHMgQWJzdHJhY3RKcGFDb250YWluZXJEZWZpbml0aW9uCi0JewotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvbkpwYUNvbnRhaW5lckRlZmluaXRpb24oQ2xhc3M8Pz4gY29sbGVjdGlvbkNsYXNzLCBTdHJpbmcgc3RhdGljTWV0YW1vZGVsVHlwZURlY2xhcmF0aW9uVHlwZU5hbWUpIHsKLQkJCXN1cGVyKGNvbGxlY3Rpb25DbGFzcywgc3RhdGljTWV0YW1vZGVsVHlwZURlY2xhcmF0aW9uVHlwZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXNTaXplKCkgPT0gMSkgPwotCQkJCXJlc291cmNlQXR0cmlidXRlLmdldFR5cGVUeXBlQXJndW1lbnROYW1lKDApIDoKLQkJCQkJCW51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlTWFwS2V5VHlwZU5hbWUoSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRNYXBLZXlUeXBlTmFtZShDb2xsZWN0aW9uTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTWFwKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwIEpQQSBjb250YWluZXIgZGVmaW5pdGlvbgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgTWFwSnBhQ29udGFpbmVyRGVmaW5pdGlvbgotCQlleHRlbmRzIEFic3RyYWN0SnBhQ29udGFpbmVyRGVmaW5pdGlvbgotCXsKLQkJcHJvdGVjdGVkIE1hcEpwYUNvbnRhaW5lckRlZmluaXRpb24oQ2xhc3M8Pz4gbWFwQ2xhc3MsIFN0cmluZyBzdGF0aWNNZXRhbW9kZWxUeXBlRGVjbGFyYXRpb25UeXBlTmFtZSkgewotCQkJc3VwZXIobWFwQ2xhc3MsIHN0YXRpY01ldGFtb2RlbFR5cGVEZWNsYXJhdGlvblR5cGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZShKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiAocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWVzU2l6ZSgpID09IDIpID8KLQkJCQkJCXJlc291cmNlQXR0cmlidXRlLmdldFR5cGVUeXBlQXJndW1lbnROYW1lKDEpIDoKLQkJCQkJCW51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE11bHRpUmVmZXJlbmNlTWFwS2V5VHlwZU5hbWUoSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKHJlc291cmNlQXR0cmlidXRlLmdldFR5cGVUeXBlQXJndW1lbnROYW1lc1NpemUoKSA9PSAyKSA/Ci0JCQkJCQlyZXNvdXJjZUF0dHJpYnV0ZS5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZSgwKSA6Ci0JCQkJCQludWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKENvbGxlY3Rpb25NYXBwaW5nIG1hcHBpbmcpIHsKLQkJCXJldHVybiBtYXBwaW5nLmdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTWFwKCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFQZXJzaXN0ZW50VHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTBmNTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5tb2RlbC5pbnRlcm5hbC52YWxpZGF0aW9uLlZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIHBlcnNpc3RlbnQgdHlwZTo8dWw+Ci0gKiA8bGk+bmFtZQotICogPGxpPmFjY2VzcwotICogPGxpPm1hcHBpbmcKLSAqIDxsaT5hdHRyaWJ1dGVzCi0gKiA8bGk+c3VwZXIgcGVyc2lzdGVudCB0eXBlCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhUGVyc2lzdGVudFR5cGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZTsKLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzOyAgLy8gbmV2ZXIgbnVsbAotCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBtYXBwaW5nOyAgLy8gbmV2ZXIgbnVsbAotCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBWZWN0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZS5Pd25lciBwYXJlbnQsIEphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucmVzb3VyY2VUeXBlID0gcmVzb3VyY2VUeXBlOwotCQl0aGlzLm5hbWUgPSB0aGlzLnJlc291cmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gdGhpcy5idWlsZFNwZWNpZmllZEFjY2VzcygpOwotCi0JCS8vIGtlZXAgdGhpcyBub24tbnVsbAotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBBY2Nlc3NUeXBlLkZJRUxEOwotCi0JCXRoaXMubWFwcGluZyA9IHRoaXMuYnVpbGRNYXBwaW5nKCk7Ci0JCXRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZXMoKTsKLQkJCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0TmFtZSh0aGlzLnJlc291cmNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18odGhpcy5idWlsZFNwZWNpZmllZEFjY2VzcygpKTsKLQkJdGhpcy5zeW5jTWFwcGluZygpOwotCQl0aGlzLnN5bmNocm9uaXplTm9kZXNXaXRoUmVzb3VyY2VNb2RlbCh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCQl0aGlzLnNldERlZmF1bHRBY2Nlc3ModGhpcy5idWlsZERlZmF1bHRBY2Nlc3MoKSk7Ci0JCXRoaXMubWFwcGluZy51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVBdHRyaWJ1dGVzKCk7Ci0JCXRoaXMucmVnaXN0ZXJSb290U3RydWN0dXJlTm9kZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNpbXBsZU5hbWUoKXsKLQkJcmV0dXJuIENsYXNzTmFtZS5nZXRTaW1wbGVOYW1lKHRoaXMubmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3VwZXIgcGVyc2lzdGVudCB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN1cGVyUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSkgewotCQlQZXJzaXN0ZW50VHlwZSBvbGQgPSB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSA9IHN1cGVyUGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTVVBFUl9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFksIG9sZCwgc3VwZXJQZXJzaXN0ZW50VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIGJ1aWxkU3VwZXJQZXJzaXN0ZW50VHlwZSgpIHsKLQkJSGFzaFNldDxKYXZhUmVzb3VyY2VUeXBlPiB2aXNpdGVkID0gbmV3IEhhc2hTZXQ8SmF2YVJlc291cmNlVHlwZT4oKTsKLQkJdmlzaXRlZC5hZGQodGhpcy5yZXNvdXJjZVR5cGUpOwotCQlQZXJzaXN0ZW50VHlwZSBzcHQgPSB0aGlzLnJlc29sdmVTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMucmVzb3VyY2VUeXBlLmdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCksIHZpc2l0ZWQpOwotCQlpZiAoc3B0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoc3B0LmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCksIHRoaXMpKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIHNob3J0LWNpcmN1aXQgaW4gdGhpcyBjYXNlLCB3ZSBoYXZlIGNpcmN1bGFyIGluaGVyaXRhbmNlCi0JCX0KLQkJcmV0dXJuIHNwdC5pc01hcHBlZCgpID8gc3B0IDogc3B0LmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgSlBBIHNwZWMgYWxsb3dzIG5vbi1wZXJzaXN0ZW50IHR5cGVzIGluIGEgcGVyc2lzdGVudCB0eXBlJ3MKLQkgKiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFdlIGNoZWNrIGZvciBhIHBlcnNpc3RlbnQgdHlwZSB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LiBJZiBpdCBpcyBub3QgZm91bmQgd2UgdXNlCi0JICogcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlIGFuZCBsb29rIGZvciA8ZW0+aXRzPC9lbT4gc3VwZXIgdHlwZS4KLQkgKiA8cD4KLQkgKiBUaGUgPGNvZGU+dmlzaXRlZDwvY29kZT4gY29sbGVjdGlvbiBpcyB1c2VkIHRvIGRldGVjdCBhIGN5Y2xlIGluIHRoZQotCSAqIDxlbT5yZXNvdXJjZTwvZW0+IHR5cGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGFuZCBwcmV2ZW50IHRoZSByZXN1bHRpbmcKLQkgKiBzdGFjayBvdmVyZmxvdy4gQW55IGN5Y2xlcyBpbiB0aGUgPGVtPmNvbnRleHQ8L2VtPiB0eXBlIGluaGVyaXRhbmNlCi0JICogaGllcmFyY2h5IGFyZSBoYW5kbGVkIGluIHtAbGluayAjYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCl9LgotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSByZXNvbHZlU3VwZXJQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUsIENvbGxlY3Rpb248SmF2YVJlc291cmNlVHlwZT4gdmlzaXRlZCkgewotCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZSh0eXBlTmFtZSwgSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kLlRZUEUpOwotCQlpZiAoKHJlc291cmNlVHlwZSA9PSBudWxsKSB8fCB2aXNpdGVkLmNvbnRhaW5zKHJlc291cmNlVHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXZpc2l0ZWQuYWRkKHJlc291cmNlVHlwZSk7Ci0JCVBlcnNpc3RlbnRUeXBlIHNwdCA9IHRoaXMucmVzb2x2ZVBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKTsKLQkJcmV0dXJuIChzcHQgIT0gbnVsbCkgPyBzcHQgOiB0aGlzLnJlc29sdmVTdXBlclBlcnNpc3RlbnRUeXBlKHJlc291cmNlVHlwZS5nZXRTdXBlcmNsYXNzUXVhbGlmaWVkTmFtZSgpLCB2aXNpdGVkKTsgIC8vIHJlY3Vyc2UKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgcmVzb2x2ZVBlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2VzcyBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBY2Nlc3MyXzBBbm5vdGF0aW9uIGdldEFjY2Vzc0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQWNjZXNzMl8wQW5ub3RhdGlvbikgdGhpcy5yZXNvdXJjZVR5cGUuZ2V0Tm9uTnVsbEFubm90YXRpb24odGhpcy5nZXRBY2Nlc3NBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBY2Nlc3NBbm5vdGF0aW9uSWZVbnNldCgpIHsKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbiBhY2Nlc3NBbm5vdGF0aW9uID0gdGhpcy5nZXRBY2Nlc3NBbm5vdGF0aW9uKCk7Ci0JCWlmIChhY2Nlc3NBbm5vdGF0aW9uICE9IG51bGwgJiYgYWNjZXNzQW5ub3RhdGlvbi5pc1Vuc2V0KCkpIHsKLQkJCXRoaXMucmVtb3ZlQWNjZXNzQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWNjZXNzQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5yZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldEFjY2Vzc0Fubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWNjZXNzQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2VzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWNjZXNzIDogdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRBY2Nlc3MsIGFjY2VzcykpIHsKLQkJCXRoaXMuZ2V0QWNjZXNzQW5ub3RhdGlvbigpLnNldFZhbHVlKEFjY2Vzc1R5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChhY2Nlc3MpKTsKLQkJCXRoaXMucmVtb3ZlQWNjZXNzQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzXyhhY2Nlc3MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzXyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZCwgYWNjZXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0QWNjZXNzQW5ub3RhdGlvbigpLmdldFZhbHVlKCksIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKSwgdGhpcy5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEFjY2VzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5kZWZhdWx0QWNjZXNzOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBhY2Nlc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSwgb2xkLCBhY2Nlc3MpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRoZSBhY2Nlc3MgInNwZWNpZmllZCIgYnkgdGhlIEphdmEgcmVzb3VyY2UgbW9kZWw6PHVsPgotCSAqIDxsaT5DaGVjayBKYXZhIGFubm90YXRpb25zIGZpcnN0Ci0JICogPGxpPklmIDxjb2RlPm51bGw8L2NvZGU+LCBjaGVjayBYTUwgbWFwcGluZyBzcGVjaWZpZWQgYWNjZXNzCi0JICogPGxpPklmIHN0aWxsIDxjb2RlPm51bGw8L2NvZGU+LCBjaGVjayB7QGxpbmsgI3N1cGVyUGVyc2lzdGVudFR5cGV9IGFjY2VzcwotCSAqIDxsaT5JZiBzdGlsbCA8Y29kZT5udWxsPC9jb2RlPiwgY2hlY2sgPGNvZGU+ZW50aXR5LW1hcHBpbmdzPC9jb2RlPgotCSAqICAgICBzcGVjaWZpZWQgYWNjZXNzIHNldHRpbmcgaWYgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+cGVyc2lzdGVudC10eXBlPC9jb2RlPgotCSAqICAgICBpcyBsaXN0ZWQgaW4gYSBtYXBwaW5nICg8Y29kZT5vcm0ueG1sPC9jb2RlPikgZmlsZQotCSAqIDxsaT5JZiBzdGlsbCA8Y29kZT5udWxsPC9jb2RlPiwgY2hlY2sgdGhlIDxjb2RlPnBlcnNpc3RlbmNlLXVuaXQ8L2NvZGU+Ci0JICogICAgIGRlZmF1bHQgQWNjZXNzCi0JICogPGxpPkRlZmF1bHQgdG8ge0BsaW5rIEFjY2Vzc1R5cGUjRklFTEQgRklFTER9IGlmIGFsbCBlbHNlIGZhaWxzLgotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGREZWZhdWx0QWNjZXNzKCkgewotCQlBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgPSBidWlsZEFjY2Vzcyh0aGlzLnJlc291cmNlVHlwZSk7Ci0JCWlmIChhY2Nlc3NUeXBlICE9IG51bGwpIHsKLQkJCXJldHVybiBhY2Nlc3NUeXBlOwotCQl9Ci0JCWFjY2Vzc1R5cGUgPSB0aGlzLmdldE93bmVyT3ZlcnJpZGVBY2Nlc3MoKTsKLQkJaWYgKGFjY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCX0KLQotCQlpZiAodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCWFjY2Vzc1R5cGUgPSB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCk7Ci0JCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCQl9Ci0JCX0KLQotCQlhY2Nlc3NUeXBlID0gdGhpcy5nZXRPd25lckRlZmF1bHRBY2Nlc3MoKTsKLQkJaWYgKGFjY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCX0KLQotCQkvLyBsYXN0IGRpdGNoIGF0dGVtcHQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gYW5ub3RhdGUgKnNvbWV0aGluZyoKLQkJcmV0dXJuIEFjY2Vzc1R5cGUuRklFTEQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtYXBwaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0S2V5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcga2V5KSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChrZXksIHRoaXMuZ2V0TWFwcGluZ0tleSgpKSkgewotCQkJdGhpcy5zZXRNYXBwaW5nKHRoaXMuYnVpbGRNYXBwaW5nKGtleSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoU3RyaW5nIGtleSkgewotCQlmb3IgKEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IHRoaXMuZ2V0TWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBrZXkpKSB7Ci0JCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5yZXNvdXJjZVR5cGUuc2V0UHJpbWFyeUFubm90YXRpb24oZGVmaW5pdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpLCBkZWZpbml0aW9uLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSk7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb24uYnVpbGRNYXBwaW5nKHRoaXMsIGFubm90YXRpb24sIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlc291cmNlVHlwZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTnVsbE1hcHBpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIGRvIG5vdCBzZXQgdGhlIG1hcHBpbmcgZGlyZWN0bHkuCi0JICogQHNlZSAjc2V0TWFwcGluZ0tleShTdHJpbmcpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGluZyhKYXZhVHlwZU1hcHBpbmcgbWFwcGluZykgewotCQlKYXZhVHlwZU1hcHBpbmcgb2xkID0gdGhpcy5tYXBwaW5nOwotCQl0aGlzLm1hcHBpbmcgPSBtYXBwaW5nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUElOR19QUk9QRVJUWSwgb2xkLCBtYXBwaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nIGJ1aWxkTWFwcGluZygpIHsKLQkJZm9yIChKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24gOiB0aGlzLmdldE1hcHBpbmdEZWZpbml0aW9ucygpKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLnJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb24uYnVpbGRNYXBwaW5nKHRoaXMsIGFubm90YXRpb24sIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY01hcHBpbmcoKSB7Ci0JCUphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA9IG51bGw7Ci0JCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3I8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gc3RyZWFtID0gdGhpcy5tYXBwaW5nRGVmaW5pdGlvbnMoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlkZWZpbml0aW9uID0gc3RyZWFtLm5leHQoKTsKLQkJCWFubm90YXRpb24gPSB0aGlzLnJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKGRlZmluaXRpb24uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gJ2Fubm90YXRpb24nIGNhbiBzdGlsbCBiZSBudWxsIHdoZW4gd2UgZ2V0IGhlcmUKLQkJaWYgKHRoaXMubWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpID09IGFubm90YXRpb24pIHsKLQkJCXRoaXMubWFwcGluZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldE1hcHBpbmcodGhpcy5idWlsZE1hcHBpbmcoYW5ub3RhdGlvbiwgZGVmaW5pdGlvbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8KLQkJCQlkZWZpbml0aW9uLmJ1aWxkTWFwcGluZyh0aGlzLCBhbm5vdGF0aW9uLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsTWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBtYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmdEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24+IGdldE1hcHBpbmdEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9ucygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmcgYnVpbGROdWxsTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU51bGxUeXBlTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5pc01hcHBlZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmF0dHJpYnV0ZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QXR0cmlidXRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSB0aGlzLmdldEF0dHJpYnV0ZXNOYW1lZChhdHRyaWJ1dGVOYW1lKS5pdGVyYXRvcigpOwotCQlyZXR1cm4gc3RyZWFtLmhhc05leHQoKSA/IHN0cmVhbS5uZXh0KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSmF2YVJlc291cmNlQXR0cmlidXRlIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSkgewotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUgOiB0aGlzLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJaWYgKGphdmFBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSA9PSBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpIHsKLQkJCQlyZXR1cm4gamF2YUF0dHJpYnV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBbGxBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4oCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVudFR5cGUsIEl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHB0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHB0LmdldEF0dHJpYnV0ZXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLmdldEFsbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzTmFtZWQoZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4odGhpcy5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IHRoaXMuZ2V0QXR0cmlidXRlc05hbWVkKGF0dHJpYnV0ZU5hbWUpLml0ZXJhdG9yKCk7Ci0JCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJLy8gcmV0dXJuIG51bGwgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gb25lCi0JCQlyZXR1cm4gc3RyZWFtLmhhc05leHQoKSA/IG51bGwgOiBhdHRyaWJ1dGU7Ci0JCX0KLQkJLy8gcmVjdXJzZQotCQlyZXR1cm4gKHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBjb252ZXJ0VG9OYW1lcyhJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRycykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBTdHJpbmc+KGF0dHJzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRGaWVsZChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKHRoaXMsIHJlc291cmNlRmllbGQpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFByb3BlcnR5KEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiBnZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudFByb3BlcnR5KHRoaXMsIHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQW55QW5ub3RhdGVkQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlLmhhc0FueUFubm90YXRlZEZpZWxkcygpIHx8IHRoaXMucmVzb3VyY2VUeXBlLmhhc0FueUFubm90YXRlZE1ldGhvZHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQXR0cmlidXRlKGludCBpbmRleCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIGF0dHJpYnV0ZSwgdGhpcy5hdHRyaWJ1dGVzLCBBVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZShpbnQgaW5kZXgsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCBwZXJzaXN0ZW50QXR0cmlidXRlLCB0aGlzLmF0dHJpYnV0ZXMsIEFUVFJJQlVURVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChhdHRyaWJ1dGUsIHRoaXMuYXR0cmlidXRlcywgQVRUUklCVVRFU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlcygpIHsKLQkJaWYgKGdldEFjY2VzcygpID09IEFjY2Vzc1R5cGUuRklFTEQpIHsKLQkJCXRoaXMuaW50aWFsaXplRmllbGRBY2Nlc3NBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0QWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgewotCQkJdGhpcy5pbnRpYWxpemVQcm9wZXJ0eUFjY2Vzc0F0dHJpYnV0ZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZXMgZm9yIEFjY2Vzc1R5cGUuRklFTEQKLQkgKiAxLiBhbGwgbm9uLXRyYW5zaWVudCwgbm9uLXN0YXRpYyBmaWVsZHMKLQkgKiAyLiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgKGdldHRlcnMvc2V0dGVycykKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50aWFsaXplRmllbGRBY2Nlc3NBdHRyaWJ1dGVzKCkgewotCQl0aGlzLmluaXRpYWxpemVGaWVsZEF0dHJpYnV0ZXMoYnVpbGROb25UcmFuc2llbnROb25TdGF0aWNSZXNvdXJjZUZpZWxkc0ZpbHRlcigpKTsKLQkJdGhpcy5pbml0aWFsaXplQW5ub3RhdGVkUHJvcGVydHlBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGaWVsZEF0dHJpYnV0ZXMoRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBmaWx0ZXIpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkIDogdGhpcy5nZXRSZXNvdXJjZUZpZWxkcyhmaWx0ZXIpKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRGaWVsZChyZXNvdXJjZUZpZWxkKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGVzIGZvciBYbWxBY2Nlc3NUeXBlLlBST1BFUlRZCi0JICogMS4gYWxsIGdldHRlci9zZXR0ZXIgamF2YWJlYW5zIHBhaXJzCi0JICogMi4gYWxsIGFubm90YXRlZCBmaWVsZHMKLQkgKiAzLiBhbGwgYW5ub3RhdGVkIG1ldGhvZHMgZ2V0dGVycy9zZXR0ZXJzIHRoYXQgZG9uJ3QgaGF2ZSBhIG1hdGNoaW5nIHBhaXIKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50aWFsaXplUHJvcGVydHlBY2Nlc3NBdHRyaWJ1dGVzKCkgewotCQl0aGlzLmluaXRpYWxpemVGaWVsZEF0dHJpYnV0ZXMoQU5OT1RBVEVEX1JFU09VUkNFX0ZJRUxEU19GSUxURVIpOwotCi0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJLy9pdGVyYXRlIHRocm91Z2ggYWxsIHJlc291cmNlIG1ldGhvZHMgc2VhcmNoaW5nIGZvciBwZXJzaXN0YWJsZSBnZXR0ZXJzCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCA6IHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKHRoaXMuYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcigpKSkgewotCQkJSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCA9IGdldFZhbGlkU2libGluZ1NldE1ldGhvZChnZXR0ZXJNZXRob2QsIHJlc291cmNlTWV0aG9kcyk7Ci0JCQlpZiAobWV0aG9kc0FyZVBlcnNpc3RhYmxlUHJvcGVydGllcyhnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpIHsKLQkJCQl0aGlzLmF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRQcm9wZXJ0eShnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpOwotCQkJfQotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShnZXR0ZXJNZXRob2QpOwotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShzZXR0ZXJNZXRob2QpOwotCQl9Ci0JCXRoaXMuaW5pdGlhbGl6ZVJlbWFpbmluZ1Jlc291cmNlTWV0aG9kQXR0cmlidXRlcyhyZXNvdXJjZU1ldGhvZHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQW5ub3RhdGVkUHJvcGVydHlBdHRyaWJ1dGVzKCkgewotCQlDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRSZXNvdXJjZU1ldGhvZHMoKSk7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIGFsbCByZXNvdXJjZSBtZXRob2RzIHNlYXJjaGluZyBmb3IgcGVyc2lzdGFibGUgZ2V0dGVycwotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QgOiB0aGlzLmdldFJlc291cmNlTWV0aG9kcyhidWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kID0gZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKGdldHRlck1ldGhvZCwgcmVzb3VyY2VNZXRob2RzKTsKLQkJCWlmIChnZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSB8fCAoc2V0dGVyTWV0aG9kICE9IG51bGwgJiYgc2V0dGVyTWV0aG9kLmlzQW5ub3RhdGVkKCkpKSB7Ci0JCQkJdGhpcy5hdHRyaWJ1dGVzLmFkZCh0aGlzLmJ1aWxkUHJvcGVydHkoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKTsKLQkJCX0KLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoZ2V0dGVyTWV0aG9kKTsKLQkJCXJlc291cmNlTWV0aG9kcy5yZW1vdmUoc2V0dGVyTWV0aG9kKTsKLQkJfQotCQl0aGlzLmluaXRpYWxpemVSZW1haW5pbmdSZXNvdXJjZU1ldGhvZEF0dHJpYnV0ZXMocmVzb3VyY2VNZXRob2RzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJlbWFpbmluZ1Jlc291cmNlTWV0aG9kQXR0cmlidXRlcyhDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzKSB7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIHJlbWFpbmluZyByZXNvdXJjZSBtZXRob2RzIGFuZCBzZWFyY2ggZm9yIHRob3NlIHRoYXQgYXJlIGFubm90YXRlZC4KLQkJLy9hbGwgZ2V0dGVyIG1ldGhvZHMgd2lsbCBhbHJlYWR5IGJlIHVzZWQuCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kIDogcmVzb3VyY2VNZXRob2RzKSB7Ci0JCQlpZiAocmVzb3VyY2VNZXRob2QuaXNBbm5vdGF0ZWQoKSkgewotCQkJCS8vYW5ub3RhdGVkIHNldHRlcihvciBvdGhlciByYW5kb20gbWV0aG9kKSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZ2V0dGVyLCBicmluZyBpbnRvIGNvbnRleHQgbW9kZWwgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMKLQkJCQl0aGlzLmF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRQcm9wZXJ0eShudWxsLCByZXNvdXJjZU1ldGhvZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGF0dHJpYnV0ZXMgYXJlIHN5bmNocm9uaXplZCBkdXJpbmcgdGhlIDxlbT51cGRhdGU8L2VtPiBiZWNhdXNlCi0JICogdGhlIGxpc3Qgb2YgcmVzb3VyY2UgYXR0cmlidXRlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhY2Nlc3MgdHlwZQotCSAqIHdoaWNoIGNhbiBiZSBjb250cm9sbGVkIGluIGEgbnVtYmVyIG9mIGRpZmZlcmVudCBwbGFjZXMuLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQXR0cmlidXRlcygpIHsKLQkJaWYgKGdldEFjY2VzcygpID09IEFjY2Vzc1R5cGUuRklFTEQpIHsKLQkJCXRoaXMuc3luY0ZpZWxkQWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JCWVsc2UgaWYgKGdldEFjY2VzcygpID09IEFjY2Vzc1R5cGUuUFJPUEVSVFkpIHsKLQkJCXRoaXMuc3luY1Byb3BlcnR5QWNjZXNzQXR0cmlidXRlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgQWNjZXNzVHlwZS5GSUVMRAotCSAqIDEuIGFsbCBub24tdHJhbnNpZW50LCBub24tc3RhdGljIGZpZWxkcwotCSAqIDIuIGFsbCBhbm5vdGF0ZWQgbWV0aG9kcyhnZXR0ZXJzL3NldHRlcnMpCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNGaWVsZEFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0KLQkJdGhpcy5zeW5jRmllbGRBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCB0aGlzLmJ1aWxkTm9uVHJhbnNpZW50Tm9uU3RhdGljUmVzb3VyY2VGaWVsZHNGaWx0ZXIoKSk7Ci0JCXRoaXMuc3luY0Fubm90YXRlZFByb3BlcnR5QXR0cmlidXRlcyhjb250ZXh0QXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgYXR0cmlidXRlcyBmb3IgWG1sQWNjZXNzVHlwZS5QUk9QRVJUWQotCSAqIDEuIGFsbCBnZXR0ZXIvc2V0dGVyIGphdmFiZWFucyBwYWlycwotCSAqIDIuIGFsbCBhbm5vdGF0ZWQgZmllbGRzCi0JICogMy4gYWxsIGFubm90YXRlZCBtZXRob2RzIGdldHRlcnMvc2V0dGVycyB0aGF0IGRvbid0IGhhdmUgYSBtYXRjaGluZyBwYWlyCi0JICovCi0JcHJpdmF0ZSB2b2lkIHN5bmNQcm9wZXJ0eUFjY2Vzc0F0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldEF0dHJpYnV0ZXMoKSk7Ci0KLQkJdGhpcy5zeW5jRmllbGRBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCBBTk5PVEFURURfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUik7Ci0KLQkJQ29sbGVjdGlvbjxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKCkpOwotCQkvL2l0ZXJhdGUgdGhyb3VnaCBhbGwgcmVzb3VyY2UgbWV0aG9kcyBzZWFyY2hpbmcgZm9yIHBlcnNpc3RhYmxlIGdldHRlcnMKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kIDogdGhpcy5nZXRSZXNvdXJjZU1ldGhvZHModGhpcy5idWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkpKSB7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2Qgc2V0dGVyTWV0aG9kID0gZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKGdldHRlck1ldGhvZCwgcmVzb3VyY2VNZXRob2RzKTsKLQkJCWlmIChtZXRob2RzQXJlUGVyc2lzdGFibGVQcm9wZXJ0aWVzKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQlmb3IgKEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKGNvbnRleHRBdHRyaWJ1dGUuaXNGb3IoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFtYXRjaCkgewotCQkJCQl0aGlzLmFkZEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVzU2l6ZSgpLCB0aGlzLmJ1aWxkUHJvcGVydHkoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKGdldHRlck1ldGhvZCk7Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHNldHRlck1ldGhvZCk7Ci0JCX0KLQkJdGhpcy5zeW5jUmVtYWluaW5nUmVzb3VyY2VNZXRob2RzKGNvbnRleHRBdHRyaWJ1dGVzLCByZXNvdXJjZU1ldGhvZHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQW5ub3RhdGVkUHJvcGVydHlBdHRyaWJ1dGVzKEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzKSB7Ci0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldFJlc291cmNlTWV0aG9kcygpKTsKLQkJLy9pdGVyYXRlIHRocm91Z2ggYWxsIHJlc291cmNlIG1ldGhvZHMgc2VhcmNoaW5nIGZvciBwZXJzaXN0YWJsZSBnZXR0ZXJzCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCA6IHRoaXMuZ2V0UmVzb3VyY2VNZXRob2RzKGJ1aWxkUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlck1ldGhvZHNGaWx0ZXIoKSkpIHsKLQkJCUphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QgPSBnZXRWYWxpZFNpYmxpbmdTZXRNZXRob2QoZ2V0dGVyTWV0aG9kLCByZXNvdXJjZU1ldGhvZHMpOwotCQkJaWYgKGdldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpIHx8IChzZXR0ZXJNZXRob2QgIT0gbnVsbCAmJiBzZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSkpIHsKLQkJCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQkJZm9yIChJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gY29udGV4dEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmlzRm9yKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCQkJbWF0Y2ggPSB0cnVlOwotCQkJCQkJY29udGV4dEF0dHJpYnV0ZS51cGRhdGUoKTsKLQkJCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghbWF0Y2gpIHsKLQkJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoZ2V0QXR0cmlidXRlc1NpemUoKSwgdGhpcy5idWlsZFByb3BlcnR5KGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSk7Ci0JCQkJfQotCQkJfQotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShnZXR0ZXJNZXRob2QpOwotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShzZXR0ZXJNZXRob2QpOwotCQl9Ci0JCXRoaXMuc3luY1JlbWFpbmluZ1Jlc291cmNlTWV0aG9kcyhjb250ZXh0QXR0cmlidXRlcywgcmVzb3VyY2VNZXRob2RzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0ZpZWxkQXR0cmlidXRlcyhIYXNoU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBjb250ZXh0QXR0cmlidXRlcywgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBmaWx0ZXIpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkIDogdGhpcy5nZXRSZXNvdXJjZUZpZWxkcyhmaWx0ZXIpKSB7Ci0JCQlib29sZWFuIG1hdGNoID0gZmFsc2U7Ci0JCQlmb3IgKEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoY29udGV4dEF0dHJpYnV0ZS5pc0ZvcihyZXNvdXJjZUZpZWxkKSkgewotCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCWNvbnRleHRBdHRyaWJ1dGUudXBkYXRlKCk7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCS8vIGFkZGVkIGVsZW1lbnRzIGFyZSBzeW5jJ2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb3Igd2lsbCBiZQotCQkJCS8vIHVwZGF0ZWQgZHVyaW5nIHRoZSBuZXh0ICJ1cGRhdGUiICh3aGljaCBpcyB0cmlnZ2VyZWQgYnkKLQkJCQkvLyB0aGVpciBhZGRpdGlvbiB0byB0aGUgbW9kZWwpCi0JCQkJdGhpcy5hZGRBdHRyaWJ1dGUodGhpcy5nZXRBdHRyaWJ1dGVzU2l6ZSgpLCB0aGlzLmJ1aWxkRmllbGQocmVzb3VyY2VGaWVsZCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZW1haW5pbmdSZXNvdXJjZU1ldGhvZHMoSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXMsIENvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJLy9pdGVyYXRlIHRocm91Z2ggcmVtYWluaW5nIHJlc291cmNlIG1ldGhvZHMgYW5kIHNlYXJjaCBmb3IgdGhvc2UgdGhhdCBhcmUgYW5ub3RhdGVkLgotCQkvL2FsbCBnZXR0ZXIgbWV0aG9kcyB3aWxsIGFscmVhZHkgYmUgdXNlZC4KLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgOiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJCWlmIChyZXNvdXJjZU1ldGhvZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCS8vYW5ub3RhdGVkIHNldHRlcihvciBvdGhlciByYW5kb20gbWV0aG9kKSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZ2V0dGVyLCBicmluZyBpbnRvIGNvbnRleHQgbW9kZWwgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMKLQkJCQlmb3IgKEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzdHJlYW0gPSBjb250ZXh0QXR0cmlidXRlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOykgewotCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJaWYgKGNvbnRleHRBdHRyaWJ1dGUuaXNGb3IobnVsbCwgcmVzb3VyY2VNZXRob2QpKSB7Ci0JCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOwotCQkJCQkJc3RyZWFtLnJlbW92ZSgpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFtYXRjaCkgewotCQkJCQl0aGlzLmFkZEF0dHJpYnV0ZShnZXRBdHRyaWJ1dGVzU2l6ZSgpLCB0aGlzLmJ1aWxkUHJvcGVydHkobnVsbCwgcmVzb3VyY2VNZXRob2QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyByZW1vdmUgYW55IGxlZnRvdmVyIGNvbnRleHQgYXR0cmlidXRlcwotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgOiBjb250ZXh0QXR0cmlidXRlcykgewotCQkJdGhpcy5yZW1vdmVBdHRyaWJ1dGUoY29udGV4dEF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4gZ2V0UmVzb3VyY2VGaWVsZHMoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRGaWVsZHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRSZXNvdXJjZU1ldGhvZHMoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRNZXRob2RzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPiBnZXRSZXNvdXJjZUZpZWxkcyhGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPihnZXRSZXNvdXJjZUZpZWxkcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IGdldFJlc291cmNlTWV0aG9kcyhGaWx0ZXI8SmF2YVJlc291cmNlTWV0aG9kPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+KGdldFJlc291cmNlTWV0aG9kcygpLCBmaWx0ZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBidWlsZE5vblRyYW5zaWVudE5vblN0YXRpY1Jlc291cmNlRmllbGRzRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxKYXZhUmVzb3VyY2VGaWVsZD4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQkJCXJldHVybiBtZW1iZXJJc05vblRyYW5zaWVudE5vblN0YXRpYyhyZXNvdXJjZUZpZWxkKSB8fCByZXNvdXJjZUZpZWxkLmlzQW5ub3RhdGVkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIG1lbWJlcklzTm9uVHJhbnNpZW50Tm9uU3RhdGljKEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlcikgewotCQlyZXR1cm4gIXJlc291cmNlTWVtYmVyLmlzVHJhbnNpZW50KCkgJiYgIXJlc291cmNlTWVtYmVyLmlzU3RhdGljKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+IEFOTk9UQVRFRF9SRVNPVVJDRV9GSUVMRFNfRklMVEVSID0gCi0JCW5ldyBGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2VGaWVsZC5pc0Fubm90YXRlZCgpOwotCQkJfQotCQl9OwotCi0JcHJvdGVjdGVkIEZpbHRlcjxKYXZhUmVzb3VyY2VNZXRob2Q+IGJ1aWxkUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlck1ldGhvZHNGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPEphdmFSZXNvdXJjZU1ldGhvZD4oKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihyZXNvdXJjZU1ldGhvZCwgZ2V0UmVzb3VyY2VNZXRob2RzKCkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGEgImdldHRlciIgbWV0aG9kIHRoYXQKLQkgKiByZXByZXNlbnRzIGEgcHJvcGVydHkgdGhhdCBtYXkgYmUgInBlcnNpc3RlZCIuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcihKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QsIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gYWxsTWV0aG9kcykgewotCQlpZiAobWV0aG9kSGFzSW52YWxpZE1vZGlmaWVycyhyZXNvdXJjZU1ldGhvZCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAocmVzb3VyY2VNZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlTdHJpbmcgcmV0dXJuVHlwZU5hbWUgPSByZXNvdXJjZU1ldGhvZC5nZXRUeXBlTmFtZSgpOwotCQlpZiAocmV0dXJuVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gRE9NIG1ldGhvZCBiaW5kaW5ncyBjYW4gaGF2ZSBhIG51bGwgbmFtZQotCQl9Ci0JCWlmIChyZXR1cm5UeXBlTmFtZS5lcXVhbHMoInZvaWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEhhc1BhcmFtZXRlcnMocmVzb3VyY2VNZXRob2QpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlib29sZWFuIGJvb2xlYW5HZXR0ZXIgPSBtZXRob2RJc0Jvb2xlYW5HZXR0ZXIocmVzb3VyY2VNZXRob2QpOwotCi0JCS8vIGlmIHRoZSB0eXBlIGhhcyBib3RoIG1ldGhvZHM6Ci0JCS8vICAgICBib29sZWFuIGlzUHJvcGVydHkoKQotCQkvLyAgICAgYm9vbGVhbiBnZXRQcm9wZXJ0eSgpCi0JCS8vIHRoZW4gI2lzUHJvcGVydHkoKSB0YWtlcyBwcmVjZWRlbmNlIGFuZCB3ZSBpZ25vcmUgI2dldFByb3BlcnR5KCk7Ci0JCS8vIGJ1dCBvbmx5IGhhdmluZyAjZ2V0UHJvcGVydHkoKSBpcyBPSyB0b28KLQkJLy8gKHNlZSB0aGUgSmF2YUJlYW5zIHNwZWMgMS4wMSkKLQkJaWYgKGJvb2xlYW5HZXR0ZXIgJiYgbWV0aG9kSGFzVmFsaWRTaWJsaW5nSXNNZXRob2QocmVzb3VyY2VNZXRob2QsIGFsbE1ldGhvZHMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBzaW5jZSB0aGUgdHlwZSBhbHNvIGRlZmluZXMgI2lzUHJvcGVydHkoKSwgaWdub3JlICNnZXRQcm9wZXJ0eSgpCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXRob2RJc0Jvb2xlYW5HZXR0ZXIoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCVN0cmluZyByZXR1cm5UeXBlTmFtZSA9IHJlc291cmNlTWV0aG9kLmdldFR5cGVOYW1lKCk7Ci0JCVN0cmluZyBuYW1lID0gcmVzb3VyY2VNZXRob2QuZ2V0TWV0aG9kTmFtZSgpOwotCQlib29sZWFuIGJvb2xlYW5HZXR0ZXIgPSBmYWxzZTsKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiaXMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmV0dXJuVHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCJnZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmV0dXJuVHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJvb2xlYW5HZXR0ZXIgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBib29sZWFuR2V0dGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QncyBtb2RpZmllcnMgcHJldmVudCBpdAotCSAqIGZyb20gYmVpbmcgYSBnZXR0ZXIgb3Igc2V0dGVyIGZvciBhICJwZXJzaXN0ZW50IiBwcm9wZXJ0eS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc0ludmFsaWRNb2RpZmllcnMoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCWludCBtb2RpZmllcnMgPSByZXNvdXJjZU1ldGhvZC5nZXRNb2RpZmllcnMoKTsKLQkJaWYgKE1vZGlmaWVyLmlzU3RhdGljKG1vZGlmaWVycykpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZEhhc1BhcmFtZXRlcnMoSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7Ci0JCXJldHVybiByZXNvdXJjZU1ldGhvZC5nZXRQYXJhbWV0ZXJzU2l6ZSgpICE9IDA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBoYXMgYSBzaWJsaW5nICJpcyIgbWV0aG9kIGZvciB0aGUgc3BlY2lmaWVkCi0JICogcHJvcGVydHkgYW5kIHRoYXQgbWV0aG9kIGlzIHZhbGlkIGZvciBhICJwZXJzaXN0YWJsZSIgcHJvcGVydHkuCi0JICogUHJlLWNvbmRpdGlvbjogdGhlIG1ldGhvZCBpcyBhICJib29sZWFuIGdldHRlciIgKGUuZy4gJ3B1YmxpYyBib29sZWFuIGdldFByb3BlcnR5KCknKTsKLQkgKiB0aGlzIHByZXZlbnRzIHVzIGZyb20gcmV0dXJuaW5nIHRydWUgd2hlbiB0aGUgbWV0aG9kIGl0c2VsZiBpcyBhbgotCSAqICJpcyIgbWV0aG9kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWV0aG9kSGFzVmFsaWRTaWJsaW5nSXNNZXRob2QoSmF2YVJlc291cmNlTWV0aG9kIGdldE1ldGhvZCwgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJU3RyaW5nIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSA9IFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUoZ2V0TWV0aG9kLmdldE5hbWUoKSk7Ci0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIHNpYmxpbmcgOiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJCWlmICgoc2libGluZy5nZXRQYXJhbWV0ZXJzU2l6ZSgpID09IDApCi0JCQkJCSYmIHNpYmxpbmcuZ2V0TWV0aG9kTmFtZSgpLmVxdWFscygiaXMiICsgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG1ldGhvZElzVmFsaWRTaWJsaW5nKHNpYmxpbmcsICJib29sZWFuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1ldGhvZCBoYXMgYSBzaWJsaW5nICJzZXQiIG1ldGhvZAotCSAqIGFuZCB0aGF0IG1ldGhvZCBpcyB2YWxpZCBmb3IgYSAicGVyc2lzdGFibGUiIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVJlc291cmNlTWV0aG9kIGdldFZhbGlkU2libGluZ1NldE1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0TWV0aG9kLCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kcykgewotCQlTdHJpbmcgY2FwaXRhbGl6ZWRBdHRyaWJ1dGVOYW1lID0gU3RyaW5nVG9vbHMuY2FwaXRhbGl6ZShnZXRNZXRob2QuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIHBhcmFtZXRlclR5cGVFcmFzdXJlTmFtZSA9IGdldE1ldGhvZC5nZXRUeXBlTmFtZSgpOwotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBzaWJsaW5nIDogcmVzb3VyY2VNZXRob2RzKSB7Ci0JCQlMaXN0SXRlcmFibGU8U3RyaW5nPiBzaWJsaW5nUGFybVR5cGVOYW1lcyA9IHNpYmxpbmcuZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCk7Ci0JCQlpZiAoKHNpYmxpbmcuZ2V0UGFyYW1ldGVyc1NpemUoKSA9PSAxKQotCQkJCSYmIHNpYmxpbmcuZ2V0TWV0aG9kTmFtZSgpLmVxdWFscygic2V0IiArIGNhcGl0YWxpemVkQXR0cmlidXRlTmFtZSkgLy8kTk9OLU5MUy0xJAotCQkJCSYmIHNpYmxpbmdQYXJtVHlwZU5hbWVzLml0ZXJhdG9yKCkubmV4dCgpLmVxdWFscyhwYXJhbWV0ZXJUeXBlRXJhc3VyZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIG1ldGhvZElzVmFsaWRTaWJsaW5nKHNpYmxpbmcsICJ2b2lkIikgPyBzaWJsaW5nIDogbnVsbDsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbWV0aG9kIGlzIGEgdmFsaWQgc2libGluZyB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCByZXR1cm4gdHlwZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZElzVmFsaWRTaWJsaW5nKEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCwgU3RyaW5nIHJldHVyblR5cGVOYW1lKSB7Ci0JCWlmIChyZXNvdXJjZU1ldGhvZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKG1ldGhvZEhhc0ludmFsaWRNb2RpZmllcnMocmVzb3VyY2VNZXRob2QpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHJlc291cmNlTWV0aG9kLmlzQ29uc3RydWN0b3IoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBydE5hbWUgPSByZXNvdXJjZU1ldGhvZC5nZXRUeXBlTmFtZSgpOwotCQlpZiAocnROYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIERPTSBtZXRob2QgYmluZGluZ3MgY2FuIGhhdmUgYSBudWxsIG5hbWUKLQkJfQotCQlyZXR1cm4gcnROYW1lLmVxdWFscyhyZXR1cm5UeXBlTmFtZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIG1ldGhvZHNBcmVQZXJzaXN0YWJsZVByb3BlcnRpZXMoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCwgSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCkgewotCQlpZiAoc2V0dGVyTWV0aG9kICE9IG51bGwpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGdldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkvL2Fubm90YXRlZCBnZXR0ZXIgd2l0aCBubyBjb3JyZXNwb25kaW5nIHNldHRlciwgYnJpbmcgaW50byBjb250ZXh0IG1vZGVsIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaGVyaXRhbmNlICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldEluaGVyaXRhbmNlSGllcmFyY2h5T2YodGhpcyk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBnZXRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEluaGVyaXRhbmNlSGllcmFyY2h5T2YodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+IGdldEluaGVyaXRhbmNlSGllcmFyY2h5T2YoUGVyc2lzdGVudFR5cGUgc3RhcnQpIHsKLQkJLy8gdXNpbmcgYSBjaGFpbiBpdGVyYWJsZSB0byB0cmF2ZXJzZSB1cCB0aGUgaW5oZXJpdGFuY2UgdHJlZQotCQlyZXR1cm4gbmV3IENoYWluSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+KHN0YXJ0KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBuZXh0TGluayhQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIEphdmFTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX1RZUEVfSUQ7Ci0JfQotCi0JLy8gaXQgd291bGQgYmUgbmljZSBpZiB0aGUgd2UgcGFzc2VkIGluIGFuIGFzdFJvb3QgaGVyZSwgYnV0IHRoZW4gd2UKLQkvLyB3b3VsZCBuZWVkIHRvIHBhc3MgaXQgdG8gdGhlIFhNTCBzdHJ1Y3R1cmUgbm9kZXMgdG9vLi4uCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoKTsKLQotCQlpZiAodGhpcy5jb250YWlucyhvZmZzZXQsIGFzdFJvb3QpKSB7Ci0JCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgOiB0aGlzLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmNvbnRhaW5zKG9mZnNldCwgYXN0Um9vdCkpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnMoaW50IG9mZnNldCwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIGZ1bGxUZXh0UmFuZ2UgPSB0aGlzLnJlc291cmNlVHlwZS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCS8vICdmdWxsVGV4dFJhbmdlJyB3aWxsIGJlIG51bGwgaWYgdGhlIHR5cGUgbm8gbG9uZ2VyIGV4aXN0cyBpbiB0aGUgamF2YTsKLQkJLy8gdGhlIGNvbnRleHQgbW9kZWwgY2FuIGJlIG91dCBvZiBzeW5jaCB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbAotCQkvLyB3aGVuIGEgc2VsZWN0aW9uIGV2ZW50IG9jY3VycyBiZWZvcmUgdGhlIGNvbnRleHQgbW9kZWwgaGFzIGEKLQkJLy8gY2hhbmNlIHRvIHN5bmNoIHdpdGggdGhlIHJlc291cmNlIG1vZGVsIHZpYSB0aGUgdXBkYXRlIHRocmVhZAotCQlyZXR1cm4gKGZ1bGxUZXh0UmFuZ2UgPT0gbnVsbCkgPyBmYWxzZSA6IGZ1bGxUZXh0UmFuZ2UuaW5jbHVkZXMob2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKHRoaXMuYnVpbGRBU1RSb290KCkpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMudW5yZWdpc3RlclJvb3RTdHJ1Y3R1cmVOb2RlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJSb290U3RydWN0dXJlTm9kZSgpIHsKLQkJSnBhRmlsZSBqcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKCk7Ci0JCS8vIHRoZSBKUEEgZmlsZSBjYW4gYmUgbnVsbCBpZiB0aGUgcmVzb3VyY2UgdHlwZSBpcyAiZXh0ZXJuYWwiCi0JCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCWpwYUZpbGUuYWRkUm9vdFN0cnVjdHVyZU5vZGUodGhpcy5uYW1lLCB0aGlzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVucmVnaXN0ZXJSb290U3RydWN0dXJlTm9kZSgpIHsKLQkJSnBhRmlsZSBqcGFGaWxlID0gdGhpcy5nZXRKcGFGaWxlKCk7Ci0JCS8vIHRoZSBKUEEgZmlsZSBjYW4gYmUgbnVsbCBpZiB0aGUgLmphdmEgZmlsZSB3YXMgZGVsZXRlZAotCQkvLyBvciB0aGUgcmVzb3VyY2UgdHlwZSBpcyAiZXh0ZXJuYWwiCi0JCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCWpwYUZpbGUucmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUodGhpcy5uYW1lLCB0aGlzKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlJdGVyYWJsZTxTdHJpbmc+IHZhbHVlcyA9IHRoaXMubWFwcGluZy5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmICh2YWx1ZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIHZhbHVlczsKLQkJfQotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IHRoaXMuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQl2YWx1ZXMgPSBhdHRyaWJ1dGUuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHZhbHVlczsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCXRocm93IG5ldyBWYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gVE9ETyB0ZW1wb3JhcnkgaGFjayBzaW5jZSB3ZSBkb24ndCBrbm93IHlldCB3aGVyZSB0byBwdXQKLQkJLy8gYW55IG1lc3NhZ2VzIGZvciB0eXBlcyBpbiBhbm90aGVyIHByb2plY3QgKGUuZy4gcmVmZXJlbmNlZCBieQotCQkvLyBwZXJzaXN0ZW5jZS54bWwpCi0JCUlGaWxlIGZpbGUgPSB0aGlzLnJlc291cmNlVHlwZS5nZXRGaWxlKCk7Ci0JCS8vICdmaWxlJyB3aWxsIGJlIG51bGwgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgYmluYXJ5OwotCQkvLyB0aGUgZmlsZSB3aWxsIGJlIGluIGEgZGlmZmVyZW50IHByb2plY3QgaWYgdGhlIHR5cGUgaXMgImV4dGVybmFsIiBhbmQgc291cmNlOwotCQkvLyB0aGUgdHlwZSB3aWxsIGJlIGJpbmFyeSBpZiBpdCBpcyBpbiBhIEpBUiBpbiB0aGUgY3VycmVudCBwcm9qZWN0Ci0JCWlmICgoZmlsZSAhPSBudWxsKSAmJiBmaWxlLmdldFByb2plY3QoKS5lcXVhbHModGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSAmJgotCQkJCSh0aGlzLnJlc291cmNlVHlwZSBpbnN0YW5jZW9mIFNvdXJjZU5vZGUpKSB7Ci0JCQkvLyBidWlsZCB0aGUgQVNUIHJvb3QgaGVyZSB0byBwYXNzIGRvd24KLQkJCXRoaXMudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCB0aGlzLmJ1aWxkQVNUUm9vdCgpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVNYXBwaW5nKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGVzKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBwaW5nKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLm1hcHBpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2codCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0aGlzLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIHJlcG9ydGVyLCBtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIElSZXBvcnRlciByZXBvcnRlciwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRyeSB7Ci0JCQlhdHRyaWJ1dGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2codCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlLk93bmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChQZXJzaXN0ZW50VHlwZS5Pd25lcikgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VUeXBlLmdldEZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGU7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3duZXJPdmVycmlkZUFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0T3ZlcnJpZGVQZXJzaXN0ZW50VHlwZUFjY2VzcygpOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldE93bmVyRGVmYXVsdEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZEFTVFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZS5nZXRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoKS5idWlsZEFTVFJvb3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhRmlsZSBnZXRKcGFGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlKHRoaXMucmVzb3VyY2VUeXBlLmdldEZpbGUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0eXBlTmFtZSwgdGhpcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpLCB0aGlzLmdldFBhY2thZ2VOYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRQYWNrYWdlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRPdmVycmlkZGVuUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiBudWxsOyAgLy8gSmF2YSBwZXJzaXN0ZW50IHR5cGVzIGRvIG5vdCBvdmVycmlkZSBhbnl0aGluZwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFjY2VzcyB0eXBlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYWNjZXNzIHR5cGUgY3VycmVudGx5IGltcGxpZWQgYnkgdGhlIHNwZWNpZmllZCBKYXZhIHNvdXJjZQotCSAqIGNvZGUgb3IgY2xhc3MgZmlsZTo8dWw+Ci0JICogPGxpPmlmIGFueSBmaWVsZHMgYXJlIGFubm90YXRlZCA9PgotCSAqICAgICB7QGxpbmsgQWNjZXNzVHlwZSNGSUVMRCBGSUVMRH0KLQkgKiA8bGk+aWYgb25seSBwcm9wZXJ0aWVzIGFyZSBhbm5vdGF0ZWQgPT4KLQkgKiAgICAge0BsaW5rIEFjY2Vzc1R5cGUjUFJPUEVSVFkgUFJPUEVSVFl9Ci0JICogPGxpPmlmIG5laXRoZXIgYXJlIGFubm90YXRlZCA9PgotCSAqICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqICAgICAKLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQWNjZXNzVHlwZSBidWlsZEFjY2VzcyhKYXZhUmVzb3VyY2VUeXBlIGpyVHlwZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZUZpZWxkIGZpZWxkIDoganJUeXBlLmdldEZpZWxkcygpKSB7Ci0JCQlpZiAoZmllbGQuaXNBbm5vdGF0ZWQoKSkgewotCQkJCS8vIGFueSBmaWVsZCBpcyBhbm5vdGF0ZWQgPT4gRklFTEQKLQkJCQlyZXR1cm4gQWNjZXNzVHlwZS5GSUVMRDsKLQkJCX0KLQkJfQotCi0JCWZvciAoSmF2YVJlc291cmNlTWV0aG9kIG1ldGhvZCA6IGpyVHlwZS5nZXRNZXRob2RzKCkpIHsKLQkJCWlmIChtZXRob2QuaXNBbm5vdGF0ZWQoKSkgewotCQkJCS8vIG5vbmUgb2YgdGhlIGZpZWxkcyBhcmUgYW5ub3RhdGVkIGFuZCBhbnkgbWV0aG9kIGlzIGFubm90YXRlZCA9PiBQUk9QRVJUWQotCQkJCXJldHVybiBBY2Nlc3NUeXBlLlBST1BFUlRZOwotCQkJfQotCQl9Ci0KLQkJLy8gbm90aGluZyBpcyBhbm5vdGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhZTIzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSBxdWVyeQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUXVlcnk8QSBleHRlbmRzIFF1ZXJ5QW5ub3RhdGlvbj4KLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhUXVlcnkKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQSBxdWVyeUFubm90YXRpb247Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5OwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFRdWVyeUhpbnQsIFF1ZXJ5SGludEFubm90YXRpb24+IHF1ZXJ5SGludENvbnRhaW5lcjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVF1ZXJ5KEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEEgcXVlcnlBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucXVlcnlBbm5vdGF0aW9uID0gcXVlcnlBbm5vdGF0aW9uOwotCQl0aGlzLm5hbWUgPSBxdWVyeUFubm90YXRpb24uZ2V0TmFtZSgpOwotCQl0aGlzLnF1ZXJ5ID0gcXVlcnlBbm5vdGF0aW9uLmdldFF1ZXJ5KCk7Ci0JCXRoaXMucXVlcnlIaW50Q29udGFpbmVyID0gdGhpcy5idWlsZEhpbnRDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQl0aGlzLnNldFF1ZXJ5Xyh0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5nZXRRdWVyeSgpKTsKLQkJdGhpcy5zeW5jSGludHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0SGludHMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkJdGhpcy5zZXROYW1lXyhuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcnkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7Ci0JCXRoaXMucXVlcnlBbm5vdGF0aW9uLnNldFF1ZXJ5KHF1ZXJ5KTsKLQkJdGhpcy5zZXRRdWVyeV8ocXVlcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFF1ZXJ5XyhTdHJpbmcgcXVlcnkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucXVlcnk7Ci0JCXRoaXMucXVlcnkgPSBxdWVyeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1BST1BFUlRZLCBvbGQsIHF1ZXJ5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaGludHMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhUXVlcnlIaW50PiBnZXRIaW50cygpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlIaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SGludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeUhpbnRDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUXVlcnlIaW50IGFkZEhpbnQoKSB7Ci0JCXJldHVybiB0aGlzLmFkZEhpbnQodGhpcy5nZXRIaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIEphdmFRdWVyeUhpbnQgYWRkSGludChpbnQgaW5kZXgpIHsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5xdWVyeUFubm90YXRpb24uYWRkSGludChpbmRleCk7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5SGludENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSGludChRdWVyeUhpbnQgaGludCkgewotCQl0aGlzLnJlbW92ZUhpbnQodGhpcy5xdWVyeUhpbnRDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhUXVlcnlIaW50KSBoaW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpIHsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24ucmVtb3ZlSGludChpbmRleCk7Ci0JCXRoaXMucXVlcnlIaW50Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5tb3ZlSGludCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnF1ZXJ5SGludENvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVF1ZXJ5SGludCBidWlsZEhpbnQoUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50QW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUXVlcnlIaW50KHRoaXMsIGhpbnRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jSGludHMoKSB7Ci0JCXRoaXMucXVlcnlIaW50Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFF1ZXJ5SGludEFubm90YXRpb24+IGdldEhpbnRBbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlBbm5vdGF0aW9uLmdldEhpbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFRdWVyeUhpbnQsIFF1ZXJ5SGludEFubm90YXRpb24+IGJ1aWxkSGludENvbnRhaW5lcigpIHsKLQkJSGludENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgSGludENvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIHF1ZXJ5IGhpbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEhpbnRDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhUXVlcnlIaW50LCBRdWVyeUhpbnRBbm5vdGF0aW9uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEhJTlRTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhUXVlcnlIaW50IGJ1aWxkQ29udGV4dEVsZW1lbnQoUXVlcnlIaW50QW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFRdWVyeS50aGlzLmJ1aWxkSGludChyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFF1ZXJ5SGludEFubm90YXRpb24+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhUXVlcnkudGhpcy5nZXRIaW50QW5ub3RhdGlvbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFF1ZXJ5SGludEFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFRdWVyeUhpbnQgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRRdWVyeUhpbnRBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShKcGFKcHFsUXVlcnlIZWxwZXIgcXVlcnlIZWxwZXIsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVOYW1lKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJdGhpcy52YWxpZGF0ZVF1ZXJ5KHF1ZXJ5SGVscGVyLCBtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfTkFNRV9VTkRFRklORUQsCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlUXVlcnkoSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLnF1ZXJ5KSl7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5RVUVSWV9TVEFURU1FTlRfVU5ERUZJTkVELAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMubmFtZX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZhbGlkYXRlUXVlcnlfKHF1ZXJ5SGVscGVyLCBtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVRdWVyeV8oSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMucXVlcnlBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5xdWVyeUFubm90YXRpb24uZ2V0TmFtZVRleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudGljYWwoUXVlcnkgcXVlcnkpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldE5hbWUoKSwgcXVlcnkuZ2V0TmFtZSgpKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldFF1ZXJ5KCksIHF1ZXJ5LmdldFF1ZXJ5KCkpICYmCi0JCQkJaGludHNBcmVJZGVudGljYWwocXVlcnkuZ2V0SGludHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhpbnRzQXJlSWRlbnRpY2FsKExpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUXVlcnlIaW50PiBoaW50cykgewotCQlib29sZWFuIGlzSWRlbnRpY2FsID0gdHJ1ZTsKLQkJaWYgKHRoaXMuZ2V0SGludHNTaXplKCkgIT0gQ29sbGVjdGlvblRvb2xzLnNpemUoaGludHMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8dGhpcy5nZXRIaW50c1NpemUoKTsgaSsrKSB7Ci0JCQkJCWlmICghKENvbGxlY3Rpb25Ub29scy5nZXQodGhpcy5nZXRIaW50cygpLCBpKSkuaXNJZGVudGljYWwoQ29sbGVjdGlvblRvb2xzLmdldChoaW50cywgaSkpKSB7Ci0JCQkJCQlpc0lkZW50aWNhbCA9IGZhbHNlOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzSWRlbnRpY2FsOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBBIGdldFF1ZXJ5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlBbm5vdGF0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzYwYTFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQKLXsKLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPFN0cmluZz4gY29sdW1uTmFtZXMgPSBuZXcgVmVjdG9yPFN0cmluZz4oKTsKLQotCi0JcHVibGljIEFic3RyYWN0SmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBuYW1lcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuY29sdW1uTmFtZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uTmFtZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5nZXQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDb2x1bW5OYW1lcygpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QodGhpcy5nZXRSZXNvdXJjZUNvbHVtbk5hbWVzKCksIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZUNvbHVtbk5hbWVzKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbHVtbk5hbWVzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWVhMzVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSByZWxhdGlvbnNoaXAgbWFwcGluZyAoMToxLCAxOm0sIG06MSwgbTptKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUmVsYXRpb25zaGlwTWFwcGluZzxBIGV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEE+Ci0JaW1wbGVtZW50cyBKYXZhUmVsYXRpb25zaGlwTWFwcGluZwotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhcmdldEVudGl0eTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5OwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwaW5nUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcDsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhQ2FzY2FkZSBjYXNjYWRlOwotCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGRlZmF1bHRGZXRjaDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0gdGhpcy5idWlsZFNwZWNpZmllZFRhcmdldEVudGl0eSgpOwotCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHRoaXMuYnVpbGRSZWxhdGlvbnNoaXAoKTsKLQkJdGhpcy5jYXNjYWRlID0gdGhpcy5idWlsZENhc2NhZGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRGZXRjaCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhcmdldEVudGl0eV8odGhpcy5idWlsZFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmNhc2NhZGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZEZldGNoXyh0aGlzLmJ1aWxkU3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0VGFyZ2V0RW50aXR5KHRoaXMuYnVpbGREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAudXBkYXRlKCk7Ci0JCXRoaXMuY2FzY2FkZS51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0RmV0Y2godGhpcy5idWlsZERlZmF1bHRGZXRjaCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFyZ2V0IGVudGl0eSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5IDogdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFN0cmluZyBlbnRpdHkpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KGVudGl0eSwgdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkpKSB7Ci0JCQl0aGlzLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKS5zZXRUYXJnZXRFbnRpdHkoZW50aXR5KTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5XyhlbnRpdHkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5XyhTdHJpbmcgZW50aXR5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eTsKLQkJdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgPSBlbnRpdHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCBlbnRpdHkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB7Ci0JCUEgYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYXJnZXRFbnRpdHkoU3RyaW5nIGVudGl0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCQl0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkgPSBlbnRpdHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZCwgZW50aXR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhcmdldEVudGl0eSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoU3RyaW5nIGVudGl0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eTsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSA9IGVudGl0eTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGQsIGVudGl0eSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID09IG51bGwpID8KLQkJCQl0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkgOgotCQkJCXRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpOwotCX0KLQotCXB1YmxpYyBFbnRpdHkgZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSh0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KTsKLQl9Ci0KLQkvLyBzdWItY2xhc3NlcyBsaWtlIHRoaXMgdG8gYmUgcHVibGljCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFJlc29sdmVkVGFyZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UGVyc2lzdGVudFR5cGUodGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSk7Ci0JfQotCi0JcHVibGljIElUeXBlIGdldFRhcmdldEVudGl0eUpkdFR5cGUoKSB7Ci0JCXJldHVybiBKRFRUb29scy5maW5kVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0VGFyZ2V0RW50aXR5RW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICcuJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVsYXRpb25zaGlwIHJlZmVyZW5jZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXA7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEphdmFNYXBwaW5nUmVsYXRpb25zaGlwIGJ1aWxkUmVsYXRpb25zaGlwKCk7Ci0KLQotCS8vICoqKioqKioqKiogY2FzY2FkZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNhc2NhZGUgZ2V0Q2FzY2FkZSgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNhc2NhZGUgYnVpbGRDYXNjYWRlKCkgewotCQkvLyBOQjogd2UgZG9uJ3QgdXNlIHRoZSBwbGF0Zm9ybQotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ2FzY2FkZSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEZldGNoICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRGZXRjaCA6IHRoaXMuZGVmYXVsdEZldGNoOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQoZmV0Y2gsIHRoaXMuc3BlY2lmaWVkRmV0Y2gpKSB7Ci0JCQl0aGlzLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKS5zZXRGZXRjaChGZXRjaFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChmZXRjaCkpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8oZmV0Y2gpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkU3BlY2lmaWVkRmV0Y2goKSB7Ci0JCUEgYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IEZldGNoVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwoYW5ub3RhdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldERlZmF1bHRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEZldGNoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdEZldGNoOwotCQl0aGlzLmRlZmF1bHRGZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9GRVRDSF9QUk9QRVJUWSwgb2xkLCBmZXRjaCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEZldGNoVHlwZSBidWlsZERlZmF1bHRGZXRjaCgpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwLmlzT3duZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiBtYXBwaW5nLmlzUmVsYXRpb25zaGlwT3duZXIoKSAmJgotCQkJdGhpcy5yZWxhdGlvbnNoaXAuaXNPd25lZEJ5KChSZWxhdGlvbnNoaXBNYXBwaW5nKSBtYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBPd25lcigpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJaWYgKGVudGl0eSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBlbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBbGxBdHRyaWJ1dGVzKCkpIHsKLQkJCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAodGhpcy5pc093bmVkQnkobWFwcGluZykpIHsKLQkJCQlyZXR1cm4gKFJlbGF0aW9uc2hpcE1hcHBpbmcpIG1hcHBpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwLmlzT3ZlcnJpZGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0QWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXNMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8U3RyaW5nPj4gZ2V0QWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+KHRoaXMuZ2V0QWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTWFwcGluZ3MoKSwgQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gZ2V0QWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTWFwcGluZ3MoKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAoZW50aXR5ICE9IG51bGwpID8gZW50aXR5LmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkgOiBFbXB0eUl0ZXJhYmxlLjxBdHRyaWJ1dGVNYXBwaW5nPiBpbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGVOYW1lKCkgewotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIChhdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogYXR0cmlidXRlLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRUYXJnZXRFbnRpdHlJZEF0dHJpYnV0ZSgpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldElkQXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcmVzdWx0ID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSAhPSBudWxsKSA/IHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkgOiBNZXRhbW9kZWxGaWVsZC5ERUZBVUxUX1RZUEVfTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlVGFyZ2V0RW50aXR5KG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVRhcmdldEVudGl0eShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZ2V0VGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgewotCQkJU3RyaW5nIG1zZyA9IHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpID8KLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEIDoKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEOwotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQltc2csCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCWlmIChKRFRUb29scy5maW5kVHlwZShqYXZhUHJvamVjdCwgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSkgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSA9PSBudWxsKSB7Ci0JCQkJaWYgKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWSwKLQkJCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCQkpCi0JCQkJCSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCQkpCi0JCQkJCSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb25UYXJnZXRFbnRpdHlUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvblRhcmdldEVudGl0eVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDIzYjIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFTZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotCi0vKioKLSAqIEphdmEgc2VxdWVuY2UgZ2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFTZXF1ZW5jZUdlbmVyYXRvcjxBIGV4dGVuZHMgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhR2VuZXJhdG9yPEE+Ci0JaW1wbGVtZW50cyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFTZXF1ZW5jZUdlbmVyYXRvcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBBIGdlbmVyYXRvckFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBnZW5lcmF0b3JBbm5vdGF0aW9uKTsKLQkJdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNlcXVlbmNlTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZV8odGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRTZXF1ZW5jZU5hbWUodGhpcy5idWlsZERlZmF1bHRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaXRpYWwgdmFsdWUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBidWlsZERlZmF1bHRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0lOSVRJQUxfVkFMVUU7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBzZXF1ZW5jZSBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWUgOiB0aGlzLmRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLnNldFNlcXVlbmNlTmFtZShuYW1lKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNlcXVlbmNlTmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNlcXVlbmNlTmFtZTsKLQkJdGhpcy5kZWZhdWx0U2VxdWVuY2VOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIFRPRE8gdGhlIGRlZmF1bHQgc2VxdWVuY2UgbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydW50aW1lIHByb3ZpZGVyLi4uCi0JfQotCQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCS8qKgotCSAqIGNhbGxlZCBpZiB0aGUgZGF0YWJhc2UgaXMgY29ubmVjdGVkOgotCSAqIHNlcXVlbmNlTmFtZQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRDb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5zZXF1ZW5jZU5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFDYW5kaWRhdGVTZXF1ZW5jZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXF1ZW5jZU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvckFubm90YXRpb24uc2VxdWVuY2VOYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVTZXF1ZW5jZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5nZXRDYW5kaWRhdGVTZXF1ZW5jZXMoZmlsdGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlU2VxdWVuY2VzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVTZXF1ZW5jZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVTZXF1ZW5jZXMoKSB7Ci0JCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKLQkJcmV0dXJuIChkYlNjaGVtYSAhPSBudWxsKSA/IGRiU2NoZW1hLmdldFNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCQotCXB1YmxpYyBDbGFzczxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yLmNsYXNzOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHN1cGVyLmlzSWRlbnRpY2FsKGdlbmVyYXRvcikgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSwgKChTZXF1ZW5jZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0YTNjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIHNpbmdsZSByZWxhdGlvbnNoaXAgbWFwcGluZyAoMToxLCBtOjEpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPEEgZXh0ZW5kcyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbj4KLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc8QT4KLQlpbXBsZW1lbnRzIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkT3B0aW9uYWw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE9wdGlvbmFsOwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFEZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5OwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRPcHRpb25hbCgpOwotCQl0aGlzLmRlcml2ZWRJZGVudGl0eSA9IHRoaXMuYnVpbGREZXJpdmVkSWRlbnRpdHkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRPcHRpb25hbF8odGhpcy5idWlsZFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQl0aGlzLmRlcml2ZWRJZGVudGl0eS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0T3B0aW9uYWwodGhpcy5idWlsZERlZmF1bHRPcHRpb25hbCgpKTsKLQkJdGhpcy5kZXJpdmVkSWRlbnRpdHkudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9wdGlvbmFsICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRPcHRpb25hbCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRPcHRpb25hbDsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob3B0aW9uYWwsIHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwpKSB7Ci0JCQl0aGlzLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKS5zZXRPcHRpb25hbChvcHRpb25hbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE9wdGlvbmFsXyhvcHRpb25hbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbF8oQm9vbGVhbiBvcHRpb25hbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRPcHRpb25hbCgpIHsKLQkJQSBhbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRPcHRpb25hbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T3B0aW9uYWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE9wdGlvbmFsKGJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRPcHRpb25hbDsKLQkJdGhpcy5kZWZhdWx0T3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgb3B0aW9uYWwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdE9wdGlvbmFsKCkgewotCQlyZXR1cm4gREVGQVVMVF9PUFRJT05BTDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVyaXZlZCBpZGVudGl0eSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YURlcml2ZWRJZGVudGl0eTJfMCBnZXREZXJpdmVkSWRlbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmRlcml2ZWRJZGVudGl0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YURlcml2ZWRJZGVudGl0eTJfMCBidWlsZERlcml2ZWRJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0SnBhRmFjdG9yeTJfMCgpLmJ1aWxkSmF2YURlcml2ZWRJZGVudGl0eSh0aGlzKSA6Ci0JCQkJbmV3IE51bGxKYXZhRGVyaXZlZElkZW50aXR5Ml8wKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBGZXRjaFR5cGUgYnVpbGREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBERUZBVUxUX0ZFVENIX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYXJnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRTaW5nbGVSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMuZGVyaXZlZElkZW50aXR5LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5kZXJpdmVkSWRlbnRpdHkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjRmMGM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzZVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgdGFibGUsIHNlY29uZGFyeSB0YWJsZSwgam9pbiB0YWJsZSwgb3IgY29sbGVjdGlvbiB0YWJsZQotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBhbnkgc3ViY2xhc3MgdGhhdCBkaXJlY3RseSBob2xkcyBpdHMgdGFibGUKLSAqIGFubm90YXRpb24gbXVzdDo8dWw+Ci0gKiA8bGk+Y2FsbCB0aGUgInN1cGVyIiBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgdGFibGUgYW5ub3RhdGlvbgotICogICAgIHtAbGluayAjQWJzdHJhY3RKYXZhVGFibGUoSmF2YUpwYUNvbnRleHROb2RlLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZS5Pd25lciwgQmFzZVRhYmxlQW5ub3RhdGlvbil9Ci0gKiA8bGk+b3ZlcnJpZGUge0BsaW5rICNzZXRUYWJsZUFubm90YXRpb24oQmFzZVRhYmxlQW5ub3RhdGlvbil9IHRvIHNldCB0aGUgdGFibGUKLSAqICAgICBhbm5vdGF0aW9uIHNvIGl0IGlzIGluIHBsYWNlIGJlZm9yZSB0aGUgdGFibGUncyBzdGF0ZQotICogICAgIChlLmcuIHtAbGluayAjc3BlY2lmaWVkTmFtZX0pIGlzIGluaXRpYWxpemVkCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVGFibGU8QSBleHRlbmRzIEJhc2VUYWJsZUFubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YVRhYmxlLCBVbmlxdWVDb25zdHJhaW50Lk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE93bmVyIG93bmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVW5pcXVlQ29uc3RyYWludCwgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXI7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFUYWJsZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lcikgewotCQl0aGlzKHBhcmVudCwgb3duZXIsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFUYWJsZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lciwgQSB0YWJsZUFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnNldFRhYmxlQW5ub3RhdGlvbih0YWJsZUFubm90YXRpb24pOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gdGhpcy5idWlsZFNwZWNpZmllZENhdGFsb2coKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyID0gdGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTmFtZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWFfKHRoaXMuYnVpbGRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGhpcy5idWlsZFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCXRoaXMuc3luY1VuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmJ1aWxkRGVmYXVsdE5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2coKSk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRVbmlxdWVDb25zdHJhaW50cygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEphdmEgdGFibGUgYW5ub3RhdGlvbi4gRG8gbm90IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUKLQkgKiBKYXZhIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3Q7IHJldHVybiBhIDxlbT5udWxsPC9lbT4gdGFibGUgYW5ub3RhdGlvbgotCSAqIGluc3RlYWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IEEgZ2V0VGFibGVBbm5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBzZWUgY2xhc3MgY29tbWVudC4uLiAoe0BsaW5rIEFic3RyYWN0SmF2YVRhYmxlfSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUFubm90YXRpb24oQSB0YWJsZUFubm90YXRpb24pIHsKLQkJaWYgKHRhYmxlQW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4gaWYgdGhlIHRhYmxlIGFubm90YXRpb24gaXMgbm90IG51bGw6ICIgKyB0YWJsZUFubm90YXRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUYWJsZUFubm90YXRpb25JZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRUYWJsZUFubm90YXRpb24oKS5pc1Vuc2V0KCkpIHsKLQkJCXRoaXMucmVtb3ZlVGFibGVBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVUYWJsZUFubm90YXRpb24oKTsKLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkSW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkuaXNTcGVjaWZpZWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWROYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWROYW1lIDogdGhpcy5kZWZhdWx0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWROYW1lLCBuYW1lKSkgewotCQkJdGhpcy5nZXRUYWJsZUFubm90YXRpb24oKS5zZXROYW1lKG5hbWUpOwotCQkJdGhpcy5yZW1vdmVUYWJsZUFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZUFubm90YXRpb24oKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjaGVtYSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NoZW1hIDogdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkU2NoZW1hLCBzY2hlbWEpKSB7Ci0JCQl0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLnNldFNjaGVtYShzY2hlbWEpOwotCQkJdGhpcy5yZW1vdmVUYWJsZUFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8oc2NoZW1hKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLmdldFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA6IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkQ2F0YWxvZywgY2F0YWxvZykpIHsKLQkJCXRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkuc2V0Q2F0YWxvZyhjYXRhbG9nKTsKLQkJCXRoaXMucmVtb3ZlVGFibGVBbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyhjYXRhbG9nKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkuZ2V0Q2F0YWxvZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKTsKLQotCi0JLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgZ2V0VW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIEphdmFVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB7Ci0JCXJldHVybiB0aGlzLmFkZFVuaXF1ZUNvbnN0cmFpbnQodGhpcy5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIEphdmFVbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOwotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQl0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhVW5pcXVlQ29uc3RyYWludCkgdW5pcXVlQ29uc3RyYWludCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkubW92ZVVuaXF1ZUNvbnN0cmFpbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRVbmlxdWVDb25zdHJhaW50KFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFVbmlxdWVDb25zdHJhaW50KHRoaXMsIHRoaXMsIGNvbnN0cmFpbnRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiBnZXRVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFVbmlxdWVDb25zdHJhaW50LCBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gYnVpbGRVbmlxdWVDb25zdHJhaW50Q29udGFpbmVyKCkgewotCQlVbmlxdWVDb25zdHJhaW50Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBVbmlxdWVDb25zdHJhaW50Q29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogdW5pcXVlIGNvbnN0cmFpbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVW5pcXVlQ29uc3RyYWludCwgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhVW5pcXVlQ29uc3RyYWludCBidWlsZENvbnRleHRFbGVtZW50KFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVRhYmxlLnRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50KHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhVGFibGUudGhpcy5nZXRVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChKYXZhVW5pcXVlQ29uc3RyYWludCBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJU2NoZW1hIGRiU2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKGRiU2NoZW1hID09IG51bGwpID8gbnVsbCA6IGRiU2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcih0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJU2NoZW1hQ29udGFpbmVyIGRiU2NoZW1hQ29udGFpbmVyID0gdGhpcy5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQlyZXR1cm4gKGRiU2NoZW1hQ29udGFpbmVyID09IG51bGwpID8gbnVsbCA6IGRiU2NoZW1hQ29udGFpbmVyLmdldFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPiBjYXRhbG9nKSwKLQkgKiB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzOyBhbmQgd2UgbmVlZCB0bwotCSAqIGdldCB0aGUgc2NoZW1hIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqLwotCXB1YmxpYyBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyAhPSBudWxsKSA/IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+Ci0JICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIENhdGFsb2cgZ2V0RGJDYXRhbG9nKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldERiVGFibGUoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNjaGVtYUlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldERiU2NoZW1hKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+Ci0JICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2F0YWxvZ0lzUmVzb2x2ZWQoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSB8fCAodGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpICE9IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50Lk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpIHsKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBkYlRhYmxlID0gdGhpcy5nZXREYlRhYmxlKCk7Ci0JCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUuZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFVbmlxdWVDb25zdHJhaW50IGNvbnN0cmFpbnQgOiB0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpIHsKLQkJCXJlc3VsdCA9IGNvbnN0cmFpbnQuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsZWQgaWYgdGhlIGRhdGFiYXNlIGlzIGNvbm5lY3RlZDoKLQkgKiBuYW1lLCBzY2hlbWEsIGNhdGFsb2cKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0Q29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMubmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNhbmRpZGF0ZU5hbWVzKGZpbHRlcik7Ci0JCX0KLQkJaWYgKHRoaXMuc2NoZW1hVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlU2NoZW1hdGEoZmlsdGVyKTsKLQkJfQotCQlpZiAodGhpcy5jYXRhbG9nVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlQ2F0YWxvZ3MoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZUFubm90YXRpb24oKS5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZU5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU5hbWVzKCkgewotCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoZGJTY2hlbWEgIT0gbnVsbCkgPyBkYlNjaGVtYS5nZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+IGluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZUFubm90YXRpb24oKS5zY2hlbWFUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNhbmRpZGF0ZVNjaGVtYXRhKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuZ2V0Q2FuZGlkYXRlU2NoZW1hdGEoZmlsdGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlU2NoZW1hdGEoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldENhbmRpZGF0ZVNjaGVtYXRhKCksIGZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlU2NoZW1hdGEoKSB7Ci0JCXJldHVybiB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCkuZ2V0U29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZUFubm90YXRpb24oKS5jYXRhbG9nVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVDYXRhbG9ncyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZUNhdGFsb2dzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZUNhdGFsb2dzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVDYXRhbG9ncygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZUNhdGFsb2dzKCkgewotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJcmV0dXJuIChkYiAhPSBudWxsKSA/IGRiLmdldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPiBpbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuYnVpbGRUYWJsZVZhbGlkYXRvcihhc3RSb290KS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5idWlsZFRhYmxlVmFsaWRhdG9yKHRoaXMsIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVGFibGVUZXh0UmFuZ2VSZXNvbHZlcih0aGlzLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRUYWJsZUFubm90YXRpb24oKS5nZXRTY2hlbWFUZXh0UmFuZ2UoYXN0Um9vdCksIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkuZ2V0Q2F0YWxvZ1RleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFKcGFDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUpwYUNvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seVRhYmxlIG9sZFRhYmxlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZShvbGRUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2cob2xkVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWEob2xkVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlmb3IgKFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludCBjb25zdHJhaW50IDogb2xkVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSkgewotCQkJdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KCkuaW5pdGlhbGl6ZUZyb20oY29uc3RyYWludCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlUYWJsZSB2aXJ0dWFsVGFibGUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lKHZpcnR1YWxUYWJsZS5nZXROYW1lKCkpOwotCQkvLyBpZ25vcmUgb3RoZXIgc2V0dGluZ3M/Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5idWlsZFF1YWxpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFF1YWxpZmllZE5hbWUoKSB7Ci0JCXJldHVybiBOYW1lVG9vbHMuYnVpbGRRdWFsaWZpZWREYXRhYmFzZU9iamVjdE5hbWUodGhpcy5nZXRDYXRhbG9nKCksIHRoaXMuZ2V0U2NoZW1hKCksIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjU3NDFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVHlwZU1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNUeXBlTWFwcGluZ1ZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgdHlwZSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFUeXBlTWFwcGluZzxBIGV4dGVuZHMgQW5ub3RhdGlvbj4KLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmcKLXsKLQkvLyB0aGlzIGNhbiBiZSBudWxsIGZvciBhICJudWxsIiB0eXBlIG1hcHBpbmcKLQlwcm90ZWN0ZWQgZmluYWwgQSBtYXBwaW5nQW5ub3RhdGlvbjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVR5cGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEEgbWFwcGluZ0Fubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tYXBwaW5nQW5ub3RhdGlvbiA9IG1hcHBpbmdBbm5vdGF0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFQZXJzaXN0ZW50VHlwZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgQSBnZXRNYXBwaW5nQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZ0Fubm90YXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYXR0cmlidXRlSXNEZXJpdmVkSWQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIFR5cGVNYXBwaW5nVG9vbHMuYXR0cmlidXRlSXNEZXJpdmVkSWQodGhpcywgYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFByaW1hcnlEYlRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4gZ2V0QXNzb2NpYXRlZFRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4gZ2V0QWxsQXNzb2NpYXRlZFRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbmhlcml0YW5jZSAqKioqKioqKioqCi0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0U3VwZXJUeXBlTWFwcGluZygpIHsKLQkJUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7Ci0JCXJldHVybiAoc3VwZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSA/IG51bGwgOiBzdXBlclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8VHlwZU1hcHBpbmc+IGdldEluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9NYXBwaW5ncyh0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG1hcHBpbmcncyAicGVyc2lzdGVuY2UiIGFuY2VzdG9ycywKLQkgKiA8ZW0+ZXhjbHVkaW5nPC9lbT4gdGhlIHR5cGUgbWFwcGluZyBpdHNlbGYuCi0JICogVGhlIHJldHVybmVkIGl0ZXJhdG9yIHdpbGwgcmV0dXJuIGVsZW1lbnRzIGluZmluaXRlbHkgaWYgdGhlIGhpZXJhcmNoeQotCSAqIGhhcyBhIGxvb3AuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFR5cGVNYXBwaW5nPiBnZXRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb01hcHBpbmdzKHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBbmNlc3RvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFR5cGVNYXBwaW5nPiBjb252ZXJ0VG9NYXBwaW5ncyhJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gdHlwZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4odHlwZXMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50VHlwZSB0eXBlKSB7Ci0JCQkJcmV0dXJuIHR5cGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSb290RW50aXR5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRSb290RW50aXR5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxKYXZhQXR0cmlidXRlTWFwcGluZz4gZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUF0dHJpYnV0ZU1hcHBpbmc+KHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIHRyYW5zZm9ybShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IGdldEF0dHJpYnV0ZU1hcHBpbmdzKGZpbmFsIFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZykgewotCQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpLCBtYXBwaW5nS2V5KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4odGhpcy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5nc0xpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPj4gZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3NMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFR5cGVNYXBwaW5nLCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPj4odGhpcy5nZXROb25OdWxsSW5oZXJpdGFuY2VIaWVyYXJjaHkoKSwgVHlwZU1hcHBpbmdUb29scy5BVFRSSUJVVEVfTUFQUElOR1NfVFJBTlNGT1JNRVIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxUeXBlTWFwcGluZz4gZ2V0Tm9uTnVsbEluaGVyaXRhbmNlSGllcmFyY2h5KCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFR5cGVNYXBwaW5nPih0aGlzLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCksIE5vdE51bGxGaWx0ZXIuPFR5cGVNYXBwaW5nPmluc3RhbmNlKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncyhmaW5hbCBTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+KENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZykgewotCQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpLCBtYXBwaW5nS2V5KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFN0cmluZz4+IGdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSwgQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9PVkVSUklEQUJMRV9BVFRSSUJVVEVfTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuYWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc0xpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxTdHJpbmc+PiBhbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxUeXBlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4odGhpcy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpLCBUeXBlTWFwcGluZ1Rvb2xzLk9WRVJSSURBQkxFX0FUVFJJQlVURV9OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA6IHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJQ29sdW1uIGNvbHVtbiA9IGF0dHJpYnV0ZU1hcHBpbmcucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAoY29sdW1uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY29sdW1uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhc3NvY2lhdGlvbiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXNMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8U3RyaW5nPj4gZ2V0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+Pih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdzKCksIEF0dHJpYnV0ZU1hcHBpbmdUb29scy5BTExfT1ZFUlJJREFCTEVfQVNTT0NJQVRJT05fTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXNMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8U3RyaW5nPj4gZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxUeXBlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4odGhpcy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpLCBUeXBlTWFwcGluZ1Rvb2xzLk9WRVJSSURBQkxFX0FTU09DSUFUSU9OX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWZvciAoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nIDogdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpKSB7Ci0JCQlSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gYXR0cmlidXRlTWFwcGluZy5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChyZWxhdGlvbnNoaXAgIT0gbnVsbCkgewotCQkJCXJldHVybiByZWxhdGlvbnNoaXA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEdlbmVyYXRvcj4gZ2V0R2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxHZW5lcmF0b3I+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ0dlbmVyYXRvckxpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxHZW5lcmF0b3I+PiBnZXRBdHRyaWJ1dGVNYXBwaW5nR2VuZXJhdG9yTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKYXZhQXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8R2VuZXJhdG9yPj4odGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8R2VuZXJhdG9yPiB0cmFuc2Zvcm0oSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZykgewotCQkJCQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0R2VuZXJhdG9ycygpOwotCQkJCQl9Ci0JCQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlVHlwZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmJ1aWxkVHlwZU1hcHBpbmdWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVHlwZU1hcHBpbmdWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljVHlwZU1hcHBpbmdWYWxpZGF0b3IodGhpcywgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCksIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLQotCXByb3RlY3RlZCBUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKYXZhVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcih0aGlzLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5tYXBwaW5nQW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThiYjQ4Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlNpbXBsZUFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTmFtZWRDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLk51bGxKYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIHZlcnNpb24gbWFwcGluZwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8VmVyc2lvbkFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhVmVyc2lvbk1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbHVtbiBjb2x1bW47Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlciBjb252ZXJ0ZXI7ICAvLyBuZXZlciBudWxsCi0KLQotCS8vIHRoZSBzcGVjIGRvZXMgbm90IGxpc3QgVGVtcG9yYWwgZXhwbGljaXRseSwKLQkvLyBidXQgaXQgaXMgaW5jbHVkZWQgaW4gdGhlIG9ybS54bWwgc2NoZW1hLi4uCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQ29udmVydGVyLkFkYXB0ZXJbXSBDT05WRVJURVJfQURBUFRFUl9BUlJBWSA9IG5ldyBKYXZhQ29udmVydGVyLkFkYXB0ZXJbXSB7Ci0JCUphdmFUZW1wb3JhbENvbnZlcnRlci5CYXNpY0FkYXB0ZXIuaW5zdGFuY2UoKSwKLQl9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBDT05WRVJURVJfQURBUFRFUlMgPSBuZXcgQXJyYXlJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+KENPTlZFUlRFUl9BREFQVEVSX0FSUkFZKTsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNvbHVtbiA9IHRoaXMuYnVpbGRDb2x1bW4oKTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jQ29udmVydGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4gYnVpbGRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDb2x1bW4odGhpcywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IGNvbnZlcnRlclR5cGUpIHsKLQkJCXRoaXMuY29udmVydGVyLmRpc3Bvc2UoKTsKLQkJCUphdmFDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJdGhpcy5yZXRhaW5Db252ZXJ0ZXJBbm5vdGF0aW9uKGNvbnZlcnRlckFkYXB0ZXIpOwotCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyQWRhcHRlcikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJIHJldHVybiAoY29udmVydGVyQWRhcHRlciAhPSBudWxsKSA/Ci0JCQkJY29udmVydGVyQWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyXyhKYXZhQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlDb252ZXJ0ZXIgb2xkID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgYWxsIHRoZSBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMgPGVtPmV4Y2VwdDwvZW0+IGZvciB0aGUgYW5ub3RhdGlvbgotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyLiBJZiB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgcmVtb3ZlIDxlbT5hbGw8L2VtPiB0aGUgY29udmVydGVyIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJldGFpbkNvbnZlcnRlckFubm90YXRpb24oSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlciAhPSBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCQkJYWRhcHRlci5yZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKCkgewotCQlKcGFGYWN0b3J5IGpwYUZhY3RvcnkgPSB0aGlzLmdldEpwYUZhY3RvcnkoKTsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLCBqcGFGYWN0b3J5KTsKLQkJCWlmIChqYXZhQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ29udmVydGVyKCkgewotCQlBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+IGFzc29jID0gdGhpcy5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhc3NvYyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8odGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA9IGFzc29jLmdldEtleSgpOwotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXNzb2MuZ2V0VmFsdWUoKTsKLQkJCWlmICgodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSAmJgotCQkJCQkodGhpcy5jb252ZXJ0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpID09IGFubm90YXRpb24pKSB7Ci0JCQkJdGhpcy5jb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8oYWRhcHRlci5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCB0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBjb252ZXJ0ZXIgYW5ub3RhdGlvbiB3ZSBmaW5kIGFsb25nIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiBhZGFwdGVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNvbnZlcnRlciBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb248SmF2YUNvbnZlcnRlci5BZGFwdGVyLCBBbm5vdGF0aW9uPiBnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+KGFkYXB0ZXIsIGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkTnVsbENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsSmF2YUNvbnZlcnRlcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIuQWRhcHRlciBnZXRDb252ZXJ0ZXJBZGFwdGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIENPTlZFUlRFUl9BREFQVEVSUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQ29sdW1uQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgTmFtZWRDb2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUJhc2VDb2x1bW4pIGNvbCwgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmNvbnZlcnRlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5jb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZVR5cGUobWVzc2FnZXMsIGFzdFJvb3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZVR5cGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhTVVBQT1JURURfVFlQRV9OQU1FUywgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1ZFUlNJT05fTUFQUElOR19UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmlydHVhbEJhc2VDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFWaXJ0dWFsQmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjcxOGIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFWaXJ0dWFsQmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhVmlydHVhbEJhc2VDb2x1bW48TyBleHRlbmRzIEphdmFSZWFkT25seUJhc2VDb2x1bW4uT3duZXIsIEMgZXh0ZW5kcyBSZWFkT25seUJhc2VDb2x1bW4+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFWaXJ0dWFsTmFtZWRDb2x1bW48TywgQz4KLQlpbXBsZW1lbnRzIFZpcnR1YWxCYXNlQ29sdW1uLCBKYXZhUmVhZE9ubHlCYXNlQ29sdW1uCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFVuaXF1ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0VW5pcXVlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTnVsbGFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE51bGxhYmxlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0SW5zZXJ0YWJsZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFVwZGF0YWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0VXBkYXRhYmxlOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhVmlydHVhbEJhc2VDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgTyBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZSh0aGlzLmJ1aWxkU3BlY2lmaWVkVGFibGUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFRhYmxlKHRoaXMuYnVpbGREZWZhdWx0VGFibGUoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRVbmlxdWUodGhpcy5idWlsZFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VW5pcXVlKHRoaXMuYnVpbGREZWZhdWx0VW5pcXVlKCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGUodGhpcy5idWlsZFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQl0aGlzLnNldERlZmF1bHROdWxsYWJsZSh0aGlzLmJ1aWxkRGVmYXVsdE51bGxhYmxlKCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSh0aGlzLmJ1aWxkU3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0SW5zZXJ0YWJsZSh0aGlzLmJ1aWxkRGVmYXVsdEluc2VydGFibGUoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGUodGhpcy5idWlsZFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VXBkYXRhYmxlKHRoaXMuYnVpbGREZWZhdWx0VXBkYXRhYmxlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFRhYmxlIDogdGhpcy5kZWZhdWx0VGFibGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFibGUoU3RyaW5nIHRhYmxlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFibGUoU3RyaW5nIHRhYmxlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRUYWJsZTsKLQkJdGhpcy5kZWZhdWx0VGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdW5pcXVlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzVW5pcXVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVW5pcXVlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRVbmlxdWUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdFVuaXF1ZSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFVuaXF1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVW5pcXVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuIHVuaXF1ZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVW5pcXVlOwotCQl0aGlzLnNwZWNpZmllZFVuaXF1ZSA9IHVuaXF1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9VTklRVUVfUFJPUEVSVFksIG9sZCwgdW5pcXVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFVuaXF1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVuaXF1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFVuaXF1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VW5pcXVlKGJvb2xlYW4gdW5pcXVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0VW5pcXVlOwotCQl0aGlzLmRlZmF1bHRVbmlxdWUgPSB1bmlxdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1VOSVFVRV9QUk9QRVJUWSwgb2xkLCB1bmlxdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFVuaXF1ZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVU5JUVVFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBudWxsYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTnVsbGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE51bGxhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHROdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IG51bGxhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZLCBvbGQsIG51bGxhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE51bGxhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROdWxsYWJsZShib29sZWFuIG51bGxhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0TnVsbGFibGU7Ci0JCXRoaXMuZGVmYXVsdE51bGxhYmxlID0gbnVsbGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX05VTExBQkxFX1BST1BFUlRZLCBvbGQsIG51bGxhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTlVMTEFCTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEluc2VydGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IGluc2VydGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkLCBpbnNlcnRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZEluc2VydGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5Db2x1bW4oKS5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEluc2VydGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEluc2VydGFibGUoYm9vbGVhbiBpbnNlcnRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0SW5zZXJ0YWJsZTsKLQkJdGhpcy5kZWZhdWx0SW5zZXJ0YWJsZSA9IGluc2VydGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOU0VSVEFCTEVfUFJPUEVSVFksIG9sZCwgaW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfSU5TRVJUQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdXBkYXRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdFVwZGF0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuIHVwZGF0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9VUERBVEFCTEVfUFJPUEVSVFksIG9sZCwgdXBkYXRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFVwZGF0YWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VXBkYXRhYmxlKGJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0VXBkYXRhYmxlOwotCQl0aGlzLmRlZmF1bHRVcGRhdGFibGUgPSB1cGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1VQREFUQUJMRV9QUk9QRVJUWSwgb2xkLCB1cGRhdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVBEQVRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZCgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIudGFibGVOYW1lSXNJbnZhbGlkKHRoaXMuZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZpcnR1YWxOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZpcnR1YWxOYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzViNWQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFWaXJ0dWFsTmFtZWRDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgdmlydHVhbDx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPC91bD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IGFsbCBzdGF0ZSBpcyBzeW5jJ2VkL3VwZGF0ZWQgaW4ge0BsaW5rICN1cGRhdGUoKX0KLSAqIGJlY2F1c2UgPGVtPmFsbDwvZW0+IG9mIGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgY29udGV4dCBtb2RlbCAoaS5lLiBub25lIG9mIGl0Ci0gKiBpcyBkZXJpdmVkIGZyb20gdGhlIHJlc291cmNlIG1vZGVsKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVZpcnR1YWxOYW1lZENvbHVtbjxPIGV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lciwgQyBleHRlbmRzIFJlYWRPbmx5TmFtZWRDb2x1bW4+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgVmlydHVhbE5hbWVkQ29sdW1uLCBKYXZhUmVhZE9ubHlOYW1lZENvbHVtbgotewotCXByb3RlY3RlZCBmaW5hbCBPIG93bmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbkRlZmluaXRpb247Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFWaXJ0dWFsTmFtZWRDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgTyBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZSh0aGlzLmJ1aWxkU3BlY2lmaWVkTmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmJ1aWxkRGVmYXVsdE5hbWUoKSk7Ci0KLQkJdGhpcy5zZXRDb2x1bW5EZWZpbml0aW9uKHRoaXMuYnVpbGRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBDIGdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE5hbWUgOiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0TmFtZTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0Q29sdW1uTmFtZSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIGRlZmluaXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5EZWZpbml0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uID0gY29sdW1uRGVmaW5pdGlvbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZLCBvbGQsIGNvbHVtbkRlZmluaXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29sdW1uIGdldERiQ29sdW1uKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5yZXNvbHZlRGJUYWJsZSh0aGlzLmdldFRhYmxlKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uJ3MgdGFibGUuIFRoaXMgaXMgb3ZlcnJpZGRlbgotCSAqIGluIHtAbGluayBBYnN0cmFjdEphdmFWaXJ0dWFsQmFzZUNvbHVtbn0gd2hlcmUgYSB0YWJsZSBjYW4gYmUgZGVmaW5lZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGJDb2x1bW4oKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuYnVpbGRWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKHRoaXMsIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEphdmFOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyKHRoaXMsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFKcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlTdHJpbmcgdGFibGUgPSB0aGlzLmdldFRhYmxlKCk7Ci0JCWlmICh0YWJsZSAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQodGFibGUpOwotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJc2IuYXBwZW5kKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZpcnR1YWxOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0NGQwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVZpcnR1YWxOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW48TyBleHRlbmRzIEphdmFSZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciwgQyBleHRlbmRzIFJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVmlydHVhbE5hbWVkQ29sdW1uPE8sIEM+Ci0JaW1wbGVtZW50cyBWaXJ0dWFsTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLCBKYXZhUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4KLXsKLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBkZWZhdWx0TGVuZ3RoOwotCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIHNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBkZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKHRoaXMuYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUodGhpcy5idWlsZERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aCh0aGlzLmJ1aWxkU3BlY2lmaWVkTGVuZ3RoKCkpOwotCQl0aGlzLnNldERlZmF1bHRMZW5ndGgodGhpcy5idWlsZERlZmF1bHRMZW5ndGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgOiB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKLQl9Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIHR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBidWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIHR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTEVOR1RIX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBidWlsZERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxlbmd0aCAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZExlbmd0aCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTGVuZ3RoLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkU3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRMZW5ndGgoaW50IGxlbmd0aCkgewotCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCQl0aGlzLmRlZmF1bHRMZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0TGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZpcnR1YWxPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZpcnR1YWxPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTU5MWI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFWaXJ0dWFsT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBWaXJ0dWFsIEphdmEgb3ZlcnJpZGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVZpcnR1YWxPdmVycmlkZTxDIGV4dGVuZHMgSmF2YU92ZXJyaWRlQ29udGFpbmVyPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFWaXJ0dWFsT3ZlcnJpZGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG5hbWU7ICAvLyBuZXZlciBudWxsCi0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFWaXJ0dWFsT3ZlcnJpZGUoQyBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEphdmFPdmVycmlkZSBjb252ZXJ0VG9TcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmNvbnZlcnRPdmVycmlkZVRvU3BlY2lmaWVkKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChDKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQyBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIE93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKHRoaXMsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmJ1aWxkVmFsaWRhdG9yKGFzdFJvb3QpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5idWlsZE92ZXJyaWRlVmFsaWRhdG9yKHRoaXMsIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSk7Ci0JfQotCi0JcHJvdGVjdGVkIE92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEphdmFPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyKHRoaXMsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmlydHVhbFJlZmVyZW5jZVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmlydHVhbFJlZmVyZW5jZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OWYxYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZpcnR1YWxSZWZlcmVuY2VUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlZmVyZW5jZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxSZWZlcmVuY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVZpcnR1YWxSZWZlcmVuY2VUYWJsZTxUIGV4dGVuZHMgUmVhZE9ubHlSZWZlcmVuY2VUYWJsZT4KLQlleHRlbmRzIEFic3RyYWN0SmF2YVZpcnR1YWxUYWJsZTxUPgotCWltcGxlbWVudHMgVmlydHVhbFJlZmVyZW5jZVRhYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFWaXJ0dWFsSm9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW47Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFWaXJ0dWFsUmVmZXJlbmNlVGFibGUoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIsIFQgb3ZlcnJpZGVuVGFibGUpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lciwgb3ZlcnJpZGVuVGFibGUpOwotCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IHRoaXMuYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhVmlydHVhbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpIDogdGhpcy5nZXREZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBKYXZhVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0T3ZlcnJpZGRlbkpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seUpvaW5Db2x1bW4+KHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBKYXZhVmlydHVhbEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KGluZGV4LCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKYXZhVmlydHVhbEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFWaXJ0dWFsSm9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFWaXJ0dWFsSm9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KFJlYWRPbmx5Sm9pbkNvbHVtbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFWaXJ0dWFsUmVmZXJlbmNlVGFibGUudGhpcy5idWlsZEpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhVmlydHVhbFJlZmVyZW5jZVRhYmxlLnRoaXMuZ2V0T3ZlcnJpZGRlbkpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhVmlydHVhbEpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCUphdmFWaXJ0dWFsSm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSk9JTl9DT0xVTU5fUFJPUEVSVFksIG9sZCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXZhVmlydHVhbEpvaW5Db2x1bW4+IGdldERlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxKYXZhVmlydHVhbEpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48SmF2YVZpcnR1YWxKb2luQ29sdW1uPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJaWYgKHRoaXMuYnVpbGRzRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4odGhpcy5idWlsZEpvaW5Db2x1bW4odGhpcy5nZXRPdmVycmlkZGVuVGFibGUoKS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRzRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxKb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5idWlsZEpvaW5Db2x1bW4odGhpcy5qb2luQ29sdW1uT3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgY29sdW1uT3duZXIsIFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFWaXJ0dWFsSm9pbkNvbHVtbih0aGlzLCBjb2x1bW5Pd25lciwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJYm9vbGVhbiBjb250aW51ZVZhbGlkYXRpbmcgPSB0aGlzLmJ1aWxkVGFibGVWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQotCQkvL2pvaW4gY29sdW1uIHZhbGlkYXRpb24gd2lsbCBoYW5kbGUgdGhlIGNoZWNrIGZvciB3aGV0aGVyIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIGRhdGFiYXNlCi0JCS8vc29tZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGFyZSBub3QgZGF0YWJhc2Ugc3BlY2lmaWMuIElmIHRoZSBkYXRhYmFzZSB2YWxpZGF0aW9uIGZvciB0aGUKLQkJLy90YWJsZSBmYWlscyB3ZSB3aWxsIHN0b3AgdGhlcmUgYW5kIG5vdCB2YWxpZGF0ZSB0aGUgam9pbiBjb2x1bW5zIGF0IGFsbAotCQlpZiAoY29udGludWVWYWxpZGF0aW5nKSB7Ci0JCQl0aGlzLnZhbGlkYXRlSm9pbkNvbHVtbnMobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSm9pbkNvbHVtbnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWxpZGF0ZU5vZGVzKHRoaXMuZ2V0Sm9pbkNvbHVtbnMoKSwgbWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmlydHVhbFRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhVmlydHVhbFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZGRlMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YVZpcnR1YWxUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5hbWVUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YVZpcnR1YWxUYWJsZTxUIGV4dGVuZHMgUmVhZE9ubHlUYWJsZT4KLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBWaXJ0dWFsVGFibGUsIEphdmFSZWFkT25seVRhYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE93bmVyIG93bmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFQgb3ZlcnJpZGRlblRhYmxlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQsIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludENvbnRhaW5lcjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0SmF2YVZpcnR1YWxUYWJsZShKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBPd25lciBvd25lciwgVCBvdmVycmlkZW5UYWJsZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMub3ZlcnJpZGRlblRhYmxlID0gb3ZlcnJpZGVuVGFibGU7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lciA9IHRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50Q29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZSh0aGlzLmJ1aWxkU3BlY2lmaWVkTmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TmFtZSh0aGlzLmJ1aWxkRGVmYXVsdE5hbWUoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWEodGhpcy5idWlsZFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZyh0aGlzLmJ1aWxkU3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJdGhpcy51cGRhdGVVbmlxdWVDb25zdHJhaW50cygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIHNob3VsZCBuZXZlciByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFQgZ2V0T3ZlcnJpZGRlblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZGVuVGFibGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTmFtZSA6IHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuVGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjaGVtYSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NoZW1hIDogdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuVGFibGUoKS5nZXRTY2hlbWEoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENhdGFsb2cgOiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0Q2F0YWxvZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKTsKLQotCi0JLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGdldFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ+IGdldE92ZXJyaWRkZW5VbmlxdWVDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Pih0aGlzLmdldE92ZXJyaWRkZW5UYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGNvbnN0cmFpbnQpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudChpbmRleCwgY29uc3RyYWludCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludCBidWlsZFVuaXF1ZUNvbnN0cmFpbnQoUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50KHRoaXMsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGNvbnN0cmFpbnQpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGNvbnN0cmFpbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQsIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludD4gYnVpbGRVbmlxdWVDb25zdHJhaW50Q29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB1bmlxdWUgY29uc3RyYWludCBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVW5pcXVlQ29uc3RyYWludENvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludCwgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50PgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGJ1aWxkQ29udGV4dEVsZW1lbnQoUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YVZpcnR1YWxUYWJsZS50aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludD4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFWaXJ0dWFsVGFibGUudGhpcy5nZXRPdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludCBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBnZXREYlRhYmxlKCkgewotCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoZGJTY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlTY2hlbWFDb250YWluZXIgZGJTY2hlbWFDb250YWluZXIgPSB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCXJldHVybiAoZGJTY2hlbWFDb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWFJc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYlNjaGVtYSgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgotCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhdGFsb2dJc1Jlc29sdmVkKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgfHwgKHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+IGNhdGFsb2cpLAotCSAqIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3M7IGFuZCB3ZSBuZWVkIHRvCi0JICogZ2V0IHRoZSBzY2hlbWEgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YWJhc2UuCi0JICovCi0JcHVibGljIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpIDogdGhpcy5nZXREYXRhYmFzZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KLQkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZyBnZXREYkNhdGFsb2coKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnJlc29sdmVEYkNhdGFsb2coY2F0YWxvZyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGJUYWJsZSgpICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb2x2ZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldERiU2NoZW1hKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+Ci0JICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUmVzb2x2ZWRDYXRhbG9nKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgfHwgKHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSAhPSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmJ1aWxkVGFibGVWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuYnVpbGRUYWJsZVZhbGlkYXRvcih0aGlzLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKGFzdFJvb3QpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUpwYUNvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhSnBhQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRRdWFsaWZpZWROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKHRoaXMuZ2V0Q2F0YWxvZygpLCB0aGlzLmdldFNjaGVtYSgpLCB0aGlzLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0RlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyM2MzNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCXByb3RlY3RlZCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVsZWdhdGUoKS5pc0RlZmF1bHQocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0ZpZWxkQWNjZXNzb3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9GaWVsZEFjY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYWZmYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0ZpZWxkQWNjZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuUGVyc2lzdGVudEZpZWxkVmFsaWRhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmllbGRBY2Nlc3NvciAKLQlleHRlbmRzIEFic3RyYWN0QWNjZXNzb3IKLXsKLQlwcml2YXRlIGZpbmFsIEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQ7Ci0JCi0JcHVibGljIEZpZWxkQWNjZXNzb3IoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlRmllbGQgPSByZXNvdXJjZUZpZWxkOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEZpZWxkKCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUZpZWxkIGdldEZpZWxkKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUZpZWxkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VGaWVsZCA9PSByZXNvdXJjZUZpZWxkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QsIEphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXJNZXRob2QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKSB7Ci0JCXJldHVybiBBY2Nlc3NUeXBlLkZJRUxEOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUZpZWxkLmlzUHVibGljKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGaW5hbCgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2VGaWVsZC5pc0ZpbmFsKCk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEF0dHJpYnV0ZVZhbGlkYXRvcihQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRGaWVsZFZhbGlkYXRvcihwZXJzaXN0ZW50QXR0cmlidXRlLCB0aGlzLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkVW5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlKFBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEphdmFBdHRyaWJ1dGUocGFyZW50LCB0aGlzLmJ1aWxkVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VGaWVsZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIEphdmEgcmVzb3VyY2UgZmllbGQgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgSmF2YSByZXNvdXJjZQotCSAqIGZpZWxkIGFuZCBiZWhhdmVzIGFzIHRob3VnaCBpdCBoYXMgbm8gYW5ub3RhdGlvbnMuIFRoaXMgd2lsbCBjYXVzZQotCSAqIGFsbCB0aGUgc2V0dGluZ3MgaW4gdGhlIEphdmEgPGVtPmNvbnRleHQ8L2VtPiBhdHRyaWJ1dGUgdG8gZGVmYXVsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlRmllbGQgYnVpbGRVbmFubm90YXRlZEphdmFSZXNvdXJjZUZpZWxkKCkgewotCQlyZXR1cm4gbmV3IFVuYW5ub3RhdGVkSmF2YVJlc291cmNlRmllbGQodGhpcy5nZXRGaWVsZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhQXR0cmlidXRlKFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKHBhcmVudCwgcmVzb3VyY2VGaWVsZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuYW5ub3RhdGVkIEphdmEgcmVzb3VyY2UgZmllbGQgKioqKioqKioqKgotCi0JLyoqCi0JICogV3JhcCBhbm90aGVyIEphdmEgcmVzb3VyY2UgZmllbGQgYW5kIHN1cHByZXNzIGFsbCBpdHMgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFVuYW5ub3RhdGVkSmF2YVJlc291cmNlRmllbGQKLQkJZXh0ZW5kcyBVbmFubm90YXRlZEphdmFSZXNvdXJjZUF0dHJpYnV0ZTxKYXZhUmVzb3VyY2VGaWVsZD4KLQkJaW1wbGVtZW50cyBKYXZhUmVzb3VyY2VGaWVsZAotCXsKLQkJcHJvdGVjdGVkIFVuYW5ub3RhdGVkSmF2YVJlc291cmNlRmllbGQoSmF2YVJlc291cmNlRmllbGQgZmllbGQpewotCQkJc3VwZXIoZmllbGQpOwotCQl9Ci0KLQkJcHVibGljIEtpbmQgZ2V0S2luZCgpIHsKLQkJCXJldHVybiBLaW5kLkZJRUxEOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZENsYXNzUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZENsYXNzUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNjM1MTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWRDbGFzc1JlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSBJRCBjbGFzcyByZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSWRDbGFzc1JlZmVyZW5jZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFJZENsYXNzUmVmZXJlbmNlCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBpZENsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkSWRDbGFzc05hbWU7Ci0JLy8gdGhlIHJlZiBob2xkcyB0aGUgdHlwZSBkaXJlY3RseSBiZWNhdXNlIHRoZSByZWYgaXMgdGhlIHR5cGUncyBwYXJlbnQKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3M7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YUlkQ2xhc3NSZWZlcmVuY2UoSmF2YVR5cGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmlkQ2xhc3NOYW1lID0gdGhpcy5idWlsZElkQ2xhc3NOYW1lKCk7Ci0JCS8vICdpZENsYXNzJyBpcyByZXNvbHZlZCBpbiB0aGUgdXBkYXRlCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0SWRDbGFzc05hbWVfKHRoaXMuYnVpbGRJZENsYXNzTmFtZSgpKTsKLQkJaWYgKHRoaXMuaWRDbGFzcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmlkQ2xhc3Muc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZElkQ2xhc3NOYW1lKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZElkQ2xhc3NOYW1lKCkpOwotCQl0aGlzLnVwZGF0ZUlkQ2xhc3MoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWQgY2xhc3MgbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3NOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZElkQ2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChuYW1lLCB0aGlzLmlkQ2xhc3NOYW1lKSkgewotCQkJdGhpcy5nZXRJZENsYXNzQW5ub3RhdGlvbkZvclVwZGF0ZSgpLnNldFZhbHVlKG5hbWUpOwotCQkJdGhpcy5yZW1vdmVJZENsYXNzQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0SWRDbGFzc05hbWVfKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SWRDbGFzc05hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmlkQ2xhc3NOYW1lOwotCQl0aGlzLmlkQ2xhc3NOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JRF9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRJZENsYXNzTmFtZSgpIHsKLQkJSWRDbGFzc0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0SWRDbGFzc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRJZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3NOYW1lICE9IG51bGw7Ci0JfQotCi0JcHVibGljIElUeXBlIGdldElkQ2xhc3NKZHRUeXBlKCkgewotCQlyZXR1cm4gSkRUVG9vbHMuZmluZFR5cGUodGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0aGlzLmdldEZ1bGx5UXVhbGlmaWVkSWRDbGFzc05hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkIGNsYXNzIGFubm90YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGV4aXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgSWRDbGFzc0Fubm90YXRpb24gZ2V0SWRDbGFzc0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoSWRDbGFzc0Fubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRJZENsYXNzQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIGFubm90YXRpb24gaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIElkQ2xhc3NBbm5vdGF0aW9uIGdldElkQ2xhc3NBbm5vdGF0aW9uRm9yVXBkYXRlKCkgewotCQlJZENsYXNzQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRJZENsYXNzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5idWlsZElkQ2xhc3NBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElkQ2xhc3NBbm5vdGF0aW9uIGJ1aWxkSWRDbGFzc0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoSWRDbGFzc0Fubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRJZENsYXNzQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSWRDbGFzc0Fubm90YXRpb25JZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRJZENsYXNzQW5ub3RhdGlvbigpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVJZENsYXNzQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSWRDbGFzc0Fubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRJZENsYXNzQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJZENsYXNzQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZ1bGx5LXF1YWxpZmllZCBpZCBjbGFzcyBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRJZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRJZENsYXNzTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZElkQ2xhc3NOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkSWRDbGFzc05hbWU7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRJZENsYXNzTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfSURfQ0xBU1NfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkSWRDbGFzc05hbWUoKSB7Ci0JCUlkQ2xhc3NBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldElkQ2xhc3NBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkIGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJZENsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvbGQgPSB0aGlzLmlkQ2xhc3M7Ci0JCXRoaXMuaWRDbGFzcyA9IGlkQ2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJRF9DTEFTU19QUk9QRVJUWSwgb2xkLCBpZENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJZENsYXNzKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlSWRDbGFzcyA9IHRoaXMucmVzb2x2ZVJlc291cmNlSWRDbGFzcygpOwotCQlpZiAocmVzb3VyY2VJZENsYXNzID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmlkQ2xhc3MgIT0gbnVsbCkgewotCQkJCXRoaXMuaWRDbGFzcy5kaXNwb3NlKCk7Ci0JCQkJdGhpcy5zZXRJZENsYXNzKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuaWRDbGFzcyA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRJZENsYXNzKHRoaXMuYnVpbGRJZENsYXNzKHJlc291cmNlSWRDbGFzcykpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodGhpcy5pZENsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKSA9PSByZXNvdXJjZUlkQ2xhc3MpIHsKLQkJCQkJdGhpcy5pZENsYXNzLnVwZGF0ZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuaWRDbGFzcy5kaXNwb3NlKCk7Ci0JCQkJCXRoaXMuc2V0SWRDbGFzcyh0aGlzLmJ1aWxkSWRDbGFzcyhyZXNvdXJjZUlkQ2xhc3MpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSByZXNvbHZlUmVzb3VyY2VJZENsYXNzKCkgewotCQlpZiAodGhpcy5mdWxseVF1YWxpZmllZElkQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IAotCQlKYXZhUmVzb3VyY2VUeXBlIGpydCA9IHRoaXMuZ2V0SWRDbGFzc0phdmFSZXNvdXJjZVR5cGUoKTsKLQkJcmV0dXJuIChqcnQgPT0gbnVsbCkgPyBudWxsIDogKGpydC5pc0Fubm90YXRlZFdpdGgoZ2V0SnBhUHJvamVjdCgpLmdldFR5cGVNYXBwaW5nQW5ub3RhdGlvbnMoKSkgPyBudWxsIDoganJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBnZXRJZENsYXNzSmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VUeXBlKSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKHRoaXMuZnVsbHlRdWFsaWZpZWRJZENsYXNzTmFtZSwgS2luZC5UWVBFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSWRDbGFzcyhKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlQ2xhc3MpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMsIHJlc291cmNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldElkQ2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJy4nOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFUeXBlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZS5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRPdmVycmlkZVBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldERlZmF1bHRQZXJzaXN0ZW50VHlwZUFjY2VzcygpIHsKLQkJLy8gdGhpcyBzaG91bGRuJ3QgYmUgbmVlZGVkLCBzaW5jZSB3ZSd2ZSBzcGVjaWZpZWQgYW4gb3ZlcnJpZGUgYWNjZXNzLCBidXQganVzdCB0byBiZSBzYWZlIC4uLgotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVJZENsYXNzKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSWRDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLAlDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlpZiAodGhpcy5pc1NwZWNpZmllZCgpKSB7Ci0JCQlKYXZhUmVzb3VyY2VUeXBlIGpydCA9IHRoaXMuZ2V0SWRDbGFzc0phdmFSZXNvdXJjZVR5cGUoKTsKLQkJCWlmIChqcnQgIT0gbnVsbCkgewotCi0JCQkJaWYgKCFqcnQuaXNQdWJsaWMoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfUFVCTElDLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtqcnQuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCQkJCQkpCi0JCQkJCQkJKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIUpEVFRvb2xzLnR5cGVJc1N1YlR5cGUodGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKSwganJ0LmdldFF1YWxpZmllZE5hbWUoKSwgSkRUVG9vbHMuU0VSSUFMSVpBQkxFX0NMQVNTX05BTUUpKSB7Ci0JCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9JTVBMRU1FTlRfU0VSSUFMSVpBQkxFLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtqcnQuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCQkJCQkpCi0JCQkJCQkJKTsKLQkJCQl9Ci0KLQkJCQlpZiAoIWpydC5oYXNFcXVhbHNNZXRob2QoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX0VRVUFMU19NRVRIT0QsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10ge2pydC5nZXRRdWFsaWZpZWROYW1lKCl9LCAKLQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJCQkJCSkKLQkJCQkJCQkpOwotCQkJCX0KLQotCQkJCWlmICghanJ0Lmhhc0hhc2hDb2RlTWV0aG9kKCkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0QsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10ge2pydC5nZXRRdWFsaWZpZWROYW1lKCl9LCAKLQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJCQkJCSkKLQkJCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0QW5ub3RhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSWRDbGFzc0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0SWRDbGFzc0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiZjY4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55UmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYW55VG9NYW55UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYXBwaW5nUmVsYXRpb25zaGlwPEphdmFNYW55VG9NYW55TWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBtYXBwZWRCeVN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgam9pblRhYmxlU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXAoSmF2YU1hbnlUb01hbnlNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kgPSB0aGlzLmJ1aWxkTWFwcGVkQnlTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0KLQkJdGhpcy5zdHJhdGVneSA9IHRoaXMuYnVpbGRTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kudXBkYXRlKCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCQl9Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBwZWQgYnkgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldE1hcHBlZEJ5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc01hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCkgewotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnVwZGF0ZVN0cmF0ZWd5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF5QmVNYXBwZWRCeShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJcmV0dXJuIG1hcHBpbmcuZ2V0S2V5KCkgPT0gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkTWFwcGVkQnlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc0pvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvSm9pblRhYmxlKCkgewotCQkvLyBqb2luIHRhYmxlIGlzIGRlZmF1bHQgb3B0aW9uLCBzbyBubyBuZWVkIHRvIGFkZCB0byByZXNvdXJjZQotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb25zICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwKSB7Ci0JCW5ld1JlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKHRoaXMpOwotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21NYXBwZWRCeVJlbGF0aW9uc2hpcChNYXBwZWRCeVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21NYXBwZWRCeVJlbGF0aW9uc2hpcChvbGRSZWxhdGlvbnNoaXApOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb20ob2xkUmVsYXRpb25zaGlwLmdldE1hcHBlZEJ5U3RyYXRlZ3koKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb20ob2xkUmVsYXRpb25zaGlwLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTWFueVRvTWFueU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHVibGljIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbkZvclVwZGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kucmVsYXRpb25zaGlwSXNPd25lZEJ5KG1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMubWFwcGVkQnlTdHJhdGVneS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYTRiZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuTnVsbEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFNYXBwaW5nUmVsYXRpb25zaGlwPEphdmFNYW55VG9PbmVNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMAotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luQ29sdW1uU3RyYXRlZ3k7Ci0KLQkvLyBKUEEgMi4wCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgam9pblRhYmxlU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcChKYXZhTWFueVRvT25lTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKTsKLQotCQl0aGlzLnN0cmF0ZWd5ID0gdGhpcy5idWlsZFN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kudXBkYXRlKCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQlpZiAodGhpcy5qb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpIHsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5hZGRTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnVwZGF0ZVN0cmF0ZWd5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJbmV3IEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpIDoKLQkJCQluZXcgTnVsbEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCkgewotCQkvLyBqb2luIGNvbHVtbiBzdHJhdGVneSBpcyB0aGUgZGVmYXVsdDsgc28gbm8gbmVlZCB0byBhZGQgc3R1ZmYsCi0JCS8vIGp1c3QgcmVtb3ZlIGFsbCB0aGUgb3RoZXJzCi0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkgPT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgYnVpbGRKb2luQ29sdW1uU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCkgewotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKHRoaXMpOwotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb20ob2xkUmVsYXRpb25zaGlwLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChvbGRSZWxhdGlvbnNoaXApOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTWFueVRvT25lTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlyZXN1bHQgPSB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTg5YjNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5SZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeUF0dHJpYnV0ZTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneShKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWFwcGVkQnlBdHRyaWJ1dGUgPSB0aGlzLmJ1aWxkTWFwcGVkQnlBdHRyaWJ1dGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRNYXBwZWRCeUF0dHJpYnV0ZV8odGhpcy5idWlsZE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBwZWQgYnkgYXR0cmlidXRlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5QXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5QXR0cmlidXRlKFN0cmluZyBtYXBwZWRCeUF0dHJpYnV0ZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQobWFwcGVkQnlBdHRyaWJ1dGUsIHRoaXMubWFwcGVkQnlBdHRyaWJ1dGUpKSB7Ci0JCQl0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCkuc2V0TWFwcGVkQnkobWFwcGVkQnlBdHRyaWJ1dGUpOwotCQkJdGhpcy5zZXRNYXBwZWRCeUF0dHJpYnV0ZV8obWFwcGVkQnlBdHRyaWJ1dGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGVkQnlBdHRyaWJ1dGVfKFN0cmluZyBtYXBwZWRCeUF0dHJpYnV0ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5tYXBwZWRCeUF0dHJpYnV0ZTsKLQkJdGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSA9IG1hcHBlZEJ5QXR0cmlidXRlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgb2xkLCBtYXBwZWRCeUF0dHJpYnV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZE1hcHBlZEJ5QXR0cmlidXRlKCkgewotCQlPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb25Gb3JVcGRhdGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFNYXBwZWRCeVJlbGF0aW9uc2hpcCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBvbGRTdHJhdGVneSkgewotCQl0aGlzLnNldE1hcHBlZEJ5QXR0cmlidXRlKG9sZFN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIG93bmVyID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBPd25lcigpOwotCQlyZXR1cm4gKG93bmVyID09IG51bGwpID8gbnVsbCA6IG93bmVyLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCkuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBvd25lciA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwT3duZXIoKTsKLQkJcmV0dXJuIChvd25lciA9PSBudWxsKSA/IG51bGwgOiBvd25lci5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBvd25lciA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwT3duZXIoKTsKLQkJcmV0dXJuIChvd25lciAhPSBudWxsKSAmJiBvd25lci5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQkvL3RoaXMgd2lsbCBub3QgYmUgY2FsbGVkIGlmIGdldFJlbGF0aW9uc2hpcE93bmVyKCkgaXMgbnVsbAotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBPd25lcigpLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCkuZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZWxhdGlvbnNoaXBPd25lcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVsYXRpb25zaGlwSXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgb3RoZXJNYXBwaW5nKSB7Ci0JCVN0cmluZyB0aGlzRW50aXR5TmFtZSA9IHRoaXMuZ2V0RW50aXR5TmFtZSgpOwotCQlFbnRpdHkgb3RoZXJFbnRpdHkgPSBvdGhlck1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJU3RyaW5nIG90aGVyRW50aXR5TmFtZSA9IChvdGhlckVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBvdGhlckVudGl0eS5nZXROYW1lKCk7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzRW50aXR5TmFtZSwgb3RoZXJFbnRpdHlOYW1lKSAmJgotCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMubWFwcGVkQnlBdHRyaWJ1dGUsIG90aGVyTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RW50aXR5TmFtZSgpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAoZW50aXR5ID09IG51bGwpID8gbnVsbCA6IGVudGl0eS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kgc2VsZWN0T3ZlcnJpZGVTdHJhdGVneShSZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIG92ZXJyaWRlUmVsYXRpb25zaGlwKSB7Ci0JCXJldHVybiBudWxsOyAgLy8gbWFwcGVkLWJ5IHN0cmF0ZWdpZXMgY2Fubm90IGJlIG92ZXJyaWRkZW4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJhdGVneSgpIHsKLQkJaWYgKHRoaXMubWFwcGVkQnlBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJdGhpcy5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmF0ZWd5KCkgewotCQlpZiAodGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCU93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlpZiAoKGFubm90YXRpb24gIT0gbnVsbCkgJiYgYW5ub3RhdGlvbi5tYXBwZWRCeVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmVzdWx0ID0gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldEFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCi0JCWlmICh0aGlzLm1hcHBlZEJ5QXR0cmlidXRlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLQkJCXJldHVybjsgIC8vIG51bGwgdGFyZ2V0IGVudGl0eSBpcyB2YWxpZGF0ZWQgZWxzZXdoZXJlCi0JCX0KLQotCQlBdHRyaWJ1dGVNYXBwaW5nIG1hcHBlZEJ5TWFwcGluZyA9IHRhcmdldEVudGl0eS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyh0aGlzLm1hcHBlZEJ5QXR0cmlidXRlKTsKLQotCQlpZiAobWFwcGVkQnlNYXBwaW5nID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQl0aGlzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5tYXBwZWRCeUF0dHJpYnV0ZX0sCi0JCQkJCWFzdFJvb3QKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKCAhIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkubWF5QmVNYXBwZWRCeShtYXBwZWRCeU1hcHBpbmcpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJdGhpcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0lOVkFMSURfTUFQUEVEX0JZLAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMubWFwcGVkQnlBdHRyaWJ1dGV9LAotCQkJCQlhc3RSb290Ci0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGlmIG1hcHBlZEJ5TWFwcGluZyBpcyBub3QgYSByZWxhdGlvbnNoaXAgb3duZXIsIHRoZW4gaXQgc2hvdWxkIGhhdmUKLQkJLy8gYmVlbiBmbGFnZ2VkIGluIGFib3ZlIHJ1bGUgKG1hcHBlZEJ5SXNWYWxpZCkKLQkJaWYgKCAhICgoUmVsYXRpb25zaGlwTWFwcGluZykgbWFwcGVkQnlNYXBwaW5nKS5pc1JlbGF0aW9uc2hpcE93bmVyKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQl0aGlzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfTUFQUEVEX0JZX09OX0JPVEhfU0lERVMsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5tYXBwZWRCeUF0dHJpYnV0ZX0sCi0JCQkJCWFzdFJvb3QKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShTdHJpbmcgbXNnSUQsIFN0cmluZ1tdIHBhcm1zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJU3RyaW5nIGF0dHJpYnV0ZURlc2NyaXB0aW9uID0gYXR0cmlidXRlLmlzVmlydHVhbCgpID8KLQkJCQlKcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9ERVNDIDoKLQkJCQlKcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlcy5BVFRSSUJVVEVfREVTQzsKLQkJYXR0cmlidXRlRGVzY3JpcHRpb24gPSBOTFMuYmluZChhdHRyaWJ1dGVEZXNjcmlwdGlvbiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXBhcm1zID0gQXJyYXlUb29scy5hZGQocGFybXMsIDAsIGF0dHJpYnV0ZURlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJbXNnSUQsCi0JCQkJcGFybXMsCi0JCQkJdGhpcywKLQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldEFubm90YXRpb25NYXBwZWRCeVRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uTWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldE1hcHBlZEJ5VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczNGEzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JaW1wbGVtZW50cyBKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotewotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRhcmdldEZvcmVpZ25LZXk7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IGlzIGZvciBhICJzb3VyY2UiIGZvcmVpZ24ga2V5LgotCSAqLwotCXB1YmxpYyBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3koSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3koSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwIHBhcmVudCwgYm9vbGVhbiB0YXJnZXRGb3JlaWduS2V5KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMudGFyZ2V0Rm9yZWlnbktleSA9IHRhcmdldEZvcmVpZ25LZXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIGFubm90YXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldEpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgSm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMuZ2V0TmVzdGFibGVKb2luQ29sdW1uQW5ub3RhdGlvbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldE5lc3RhYmxlSm9pbkNvbHVtbkFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW5Bbm5vdGF0aW9uKGludCBpbmRleCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihpbmRleCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVKb2luQ29sdW1uQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5tb3ZlQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gbmV3IE51bGxKb2luQ29sdW1uQW5ub3RhdGlvbih0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gKEphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCXJldHVybiB0aGlzLnRhcmdldEZvcmVpZ25LZXkgPwotCQkJCW1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSA6Ci0JCQkJbWFwcGluZy5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQlyZXR1cm4gdGhpcy50YXJnZXRGb3JlaWduS2V5ID8KLQkJCQltYXBwaW5nLmdldFR5cGVNYXBwaW5nKCkgOgotCQkJCW1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldEVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdGFyZ2V0ID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJcmV0dXJuICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHkpID8gKEVudGl0eSkgdGFyZ2V0IDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldEZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEZvcmVpZ25LZXk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kgc2VsZWN0T3ZlcnJpZGVTdHJhdGVneShSZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIG92ZXJyaWRlUmVsYXRpb25zaGlwKSB7Ci0JCXJldHVybiBvdmVycmlkZVJlbGF0aW9uc2hpcC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRhYmxlTm90VmFsaWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzLk5PVF9WQUxJRF9GT1JfVEhJU19FTlRJVFk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBKb2luQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gYmUgb24gYSBzZWNvbmRhcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBqb2luQ29sdW1uSXNEZWZhdWx0KFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcywgKEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDljYjE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuTnVsbEphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEFic3RyYWN0SmF2YU1hcHBpbmdSZWxhdGlvbnNoaXA8SmF2YU9uZVRvTWFueU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBtYXBwZWRCeVN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgam9pblRhYmxlU3RyYXRlZ3k7Ci0KLQkvLyBKUEEgMi4wIG9yIEVjbGlwc2VMaW5rCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gc3VwcG9ydHNKb2luQ29sdW1uU3RyYXRlZ3k7Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGpvaW5Db2x1bW5TdHJhdGVneTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhT25lVG9NYW55UmVsYXRpb25zaGlwKEphdmFPbmVUb01hbnlNYXBwaW5nIHBhcmVudCwgYm9vbGVhbiBzdXBwb3J0c0pvaW5Db2x1bW5TdHJhdGVneSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kgPSB0aGlzLmJ1aWxkTWFwcGVkQnlTdHJhdGVneSgpOwotCQl0aGlzLnN1cHBvcnRzSm9pbkNvbHVtblN0cmF0ZWd5ID0gc3VwcG9ydHNKb2luQ29sdW1uU3RyYXRlZ3k7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCi0JCS8vIGJ1aWxkIGpvaW4gdGFibGUgc3RyYXRlZ3kgbGFzdCBzaW5jZSBpdCdzIGRlcGVuZGVudCBvbiB0aGUgb3RoZXIgc3RyYXRlZ2llcwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0KLQkJdGhpcy5zdHJhdGVneSA9IHRoaXMuYnVpbGRTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS51cGRhdGUoKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kudXBkYXRlKCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCQl9Ci0JCWlmICh0aGlzLnN1cHBvcnRzSm9pbkNvbHVtblN0cmF0ZWd5KSB7Ci0JCQlpZiAodGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJCXJldHVybiB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGVkIGJ5IHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRNYXBwZWRCeVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpIHsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUJlTWFwcGVkQnkoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCVN0cmluZyBrZXkgPSBtYXBwaW5nLmdldEtleSgpOwotCQlpZiAoa2V5ID09IE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHRoaXMuc3VwcG9ydHNKb2luQ29sdW1uU3RyYXRlZ3kpIHsKLQkJCXJldHVybiBrZXkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgYnVpbGRNYXBwZWRCeVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKSB7Ci0JCS8vIGpvaW4gdGFibGUgaXMgZGVmYXVsdCwgc28gbm8gbmVlZCB0byBhZGQgYW5ub3RhdGlvbgotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMubWFwcGVkQnlTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGwpICYmCi0JCQkJISB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpIHsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3VwcG9ydHNKb2luQ29sdW1uU3RyYXRlZ3kgPwotCQkJCW5ldyBHZW5lcmljSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcywgdHJ1ZSkgOiAgLy8gdHJ1ZSA9IHRhcmdldCBmb3JlaWduIGtleQotCQkJCW5ldyBOdWxsSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAodGhpcyk7Ci0JCW5ld1JlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcCh0aGlzKTsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKE1hcHBlZEJ5UmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0TWFwcGVkQnlTdHJhdGVneSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAob2xkUmVsYXRpb25zaGlwKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LmluaXRpYWxpemVGcm9tKG9sZFJlbGF0aW9uc2hpcC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPbmVUb01hbnlNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBPbmVUb01hbnlBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgT25lVG9NYW55QW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbkZvclVwZGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kucmVsYXRpb25zaGlwSXNPd25lZEJ5KG1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVGFyZ2V0Rm9yZWlnbktleSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LmlzVGFyZ2V0Rm9yZWlnbktleSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMubWFwcGVkQnlTdHJhdGVneS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMuam9pblRhYmxlU3RyYXRlZ3kuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzM1ZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5OdWxsSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEFic3RyYWN0SmF2YU1hcHBpbmdSZWxhdGlvbnNoaXA8SmF2YU9uZVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFPbmVUb09uZVJlbGF0aW9uc2hpcDJfMAotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgbWFwcGVkQnlTdHJhdGVneTsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFwcGluZ1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgcHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneTsKLQotCS8vIEpQQSAyLjAKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luVGFibGVTdHJhdGVneTsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luQ29sdW1uU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwKEphdmFPbmVUb09uZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneSA9IHRoaXMuYnVpbGRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0KLQkJdGhpcy5zdHJhdGVneSA9IHRoaXMuYnVpbGRTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS51cGRhdGUoKTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyYXRlZ3kgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgYnVpbGRTdHJhdGVneSgpIHsKLQkJaWYgKHRoaXMubWFwcGVkQnlTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3k7Ci0JCX0KLQkJaWYgKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneS5oYXNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneTsKLQkJfQotCQlpZiAodGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSkgewotCQkJaWYgKHRoaXMuam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGVkIGJ5IHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRNYXBwZWRCeVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpIHsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbWFwcGluZy5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkTWFwcGVkQnlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9QcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YU1hcHBpbmdQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc0pvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRTdHJhdGVneVRvSm9pblRhYmxlKCkgewotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgYnVpbGRKb2luVGFibGVTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCW5ldyBHZW5lcmljSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKSA6Ci0JCQkJbmV3IE51bGxKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpIHsKLQkJLy8gam9pbiBjb2x1bW4gc3RyYXRlZ3kgaXMgdGhlIGRlZmF1bHQ7IHNvIG5vIG5lZWQgdG8gYWRkIHN0dWZmLAotCQkvLyBqdXN0IHJlbW92ZSBhbGwgdGhlIG90aGVycwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICh0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID09IDApICYmCi0JCQkJKHRoaXMuam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkgPT0gbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAodGhpcyk7Ci0JCW5ld1JlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcCh0aGlzKTsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcCh0aGlzKTsKLQkJLy8gbm8gb3RoZXIgcGsgam9pbiBjb2x1bW4gcmVsYXRpb25zaGlwcyB5ZXQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKE1hcHBlZEJ5UmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0TWFwcGVkQnlTdHJhdGVneSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAob2xkUmVsYXRpb25zaGlwKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LmluaXRpYWxpemVGcm9tKG9sZFJlbGF0aW9uc2hpcC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPbmVUb09uZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHVibGljIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBnZXRNYXBwaW5nQW5ub3RhdGlvbkZvclVwZGF0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kucmVsYXRpb25zaGlwSXNPd25lZEJ5KG1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMubWFwcGVkQnlTdHJhdGVneS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJlc3VsdCA9IHRoaXMuam9pblRhYmxlU3RyYXRlZ3kuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFkOTM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotewotCXB1YmxpYyBHZW5lcmljSmF2YU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KEphdmFPdmVycmlkZVJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gYW5ub3RhdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZUFubm90YXRpb24oKS5nZXRKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkuYWRkSm9pbkNvbHVtbihpbmRleCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkucmVtb3ZlSm9pbkNvbHVtbihpbmRleCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbW92ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkubW92ZUpvaW5Db2x1bW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGROdWxsSm9pbkNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiBuZXcgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBnZXRPdmVycmlkZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE92ZXJyaWRlQW5ub3RhdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkSm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGFyZ2V0Rm9yZWlnbktleSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCXJldHVybiAocmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSAmJgotCQkJCXJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuaXNUYXJnZXRGb3JlaWduS2V5KCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYXJnZXRGb3JlaWduS2V5KCkgPwotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRUeXBlTWFwcGluZygpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmdUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZ1RhcmdldEVudGl0eSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBtYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXRFbnRpdHkoKSB7Ci0JCVR5cGVNYXBwaW5nIHRhcmdldCA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0JCXJldHVybiAodGFyZ2V0IGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHRhcmdldCA6IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJc3VwZXIuZ2V0VGFibGVOYW1lKCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFyZ2V0Rm9yZWlnbktleSgpID8KLQkJCQlzdXBlci5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYXJnZXRGb3JlaWduS2V5KCkgPwotCQkJCXN1cGVyLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFyZ2V0Rm9yZWlnbktleSgpID8KLQkJCQlzdXBlci5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiAoSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwKSBzdXBlci5nZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gb3duZXIgYWRhcHRlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHJvdGVjdGVkIEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJCXJldHVybiByZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBqb2luQ29sdW1uSXNEZWZhdWx0KFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldEpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcCgpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKChSZWFkT25seUJhc2VDb2x1bW4pIGNvbHVtbiwgdGhpcywgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiNjhjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5PbmVUb09uZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhTWFwcGluZ1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIHByaW1hcnlLZXlKb2luQ29sdW1uT3duZXI7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3koSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1ByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmFkZFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihpbmRleCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqICBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4sIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0Q29sdW1uQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lciwgYW5ub3RhdGlvbik7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBTdWJMaXN0SXRlcmFibGVXcmFwcGVyPE5lc3RhYmxlQW5ub3RhdGlvbiwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gYWRkUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKGludCBpbmRleCkgewotCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oaW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oaW5kZXgsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQXR0cmlidXRlIGdldFJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwaW5nKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuTk9UX1ZBTElEX0ZPUl9USElTX0VOVElUWTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHNlbGVjdE92ZXJyaWRlU3RyYXRlZ3koUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBvdmVycmlkZVJlbGF0aW9uc2hpcCkgewotCQlyZXR1cm4gbnVsbDsgIC8vIHBrIGpvaW4gY29sdW1uIHN0cmF0ZWdpZXMgY2Fubm90IGJlIG92ZXJyaWRkZW4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJhdGVneSgpIHsKLQkJaWYgKHRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID09IDApIHsKLQkJCXRoaXMuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmF0ZWd5KCkgewotCQlmb3IgKGludCBpID0gdGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7IGktLSA+IDA7ICkgewotCQkJdGhpcy5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb2x1bW4gOiB0aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQlmb3IgKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiB0aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQlwa0pvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbiBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIGJlIG9uIGEgc2Vjb25kYXJ5IHRhYmxlCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0JCQlyZXR1cm4gKHRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0YXJnZXRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE9uZVRvT25lUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUJhc2VKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMsIChCYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwZGM3YjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgdmlydHVhbCBqb2luIHRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZpcnR1YWxKb2luVGFibGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YVZpcnR1YWxSZWZlcmVuY2VUYWJsZTxSZWFkT25seUpvaW5UYWJsZT4KLQlpbXBsZW1lbnRzIEphdmFWaXJ0dWFsSm9pblRhYmxlCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVZpcnR1YWxKb2luQ29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4+IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGludmVyc2VKb2luQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxKb2luQ29sdW1uIGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZShKYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHBhcmVudCwgT3duZXIgb3duZXIsIFJlYWRPbmx5Sm9pblRhYmxlIG92ZXJyaWRkZW5UYWJsZSkgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCBvdmVycmlkZGVuVGFibGUpOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgOiB0aGlzLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludmVyc2Ugc3BlY2lmaWVkIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBKYXZhVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldE92ZXJyaWRkZW5JbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5Sm9pbkNvbHVtbj4odGhpcy5nZXRPdmVycmlkZGVuVGFibGUoKS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCwgSmF2YVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4LCBSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oSmF2YVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVZpcnR1YWxKb2luQ29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVZpcnR1YWxKb2luQ29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChSZWFkT25seUpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsSm9pblRhYmxlLnRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVZpcnR1YWxKb2luVGFibGUudGhpcy5nZXRPdmVycmlkZGVuSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IGludmVyc2Ugam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oSmF2YVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJSmF2YVZpcnR1YWxKb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU4sIG9sZCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXZhVmlydHVhbEpvaW5Db2x1bW4+IGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48SmF2YVZpcnR1YWxKb2luQ29sdW1uPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpIHsKLQkJaWYgKHRoaXMuYnVpbGRzRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkpIHsKLQkJCWlmICh0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4odGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4udXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbihudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkc0RlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkSm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBidWlsZEludmVyc2VKb2luQ29sdW1uKFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSm9pbkNvbHVtbih0aGlzLmludmVyc2VKb2luQ29sdW1uT3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS5nZXRKb2luVGFibGVEZWZhdWx0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKb2luQ29sdW1ucyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZUpvaW5Db2x1bW5zKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCXRoaXMudmFsaWRhdGVOb2Rlcyh0aGlzLmdldEludmVyc2VKb2luQ29sdW1ucygpLCBtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gb3duZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIGp1c3QgYSBsaXR0bGUgY29tbW9uIGJlaGF2aW9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHJvdGVjdGVkIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCB0YWJsZSBuYW1lIGl0IG5lZWRzIHRvIGJlIHRoZSBzYW1lCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUuIFRoZSB0YWJsZSBpcyBhbHdheXMgdGhlIGpvaW4gdGFibGUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldERlZmF1bHRUYWJsZU5hbWUoKSwgdGFibGVOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIG9ubHkgYmUgb24gdGhlIGpvaW4gdGFibGUgaXRzZWxmCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChHZW5lcmljSmF2YVZpcnR1YWxKb2luVGFibGUudGhpcy5nZXROYW1lKCksIHRhYmxlTmFtZSkgPwotCQkJCQlHZW5lcmljSmF2YVZpcnR1YWxKb2luVGFibGUudGhpcy5nZXREYlRhYmxlKCkgOgotCQkJCQludWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcywgb2J2aW91c2x5LCBpbiB0aGUgam9pbiB0YWJsZTsKLQkJICogbm90IHN1cmUgd2hldGhlciBpdCBjYW4gYmUgYW55d2hlcmUgZWxzZS4uLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBqb2luIGNvbHVtbnM7Ci0JICogdGhlc2UgcG9pbnQgYXQgdGhlIHNvdXJjZS9vd25pbmcgZW50aXR5Ci0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEpvaW5Db2x1bW5Pd25lcgotCQlleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldFRhcmdldEF0dHJpYnV0ZU5hbWUoR2VuZXJpY0phdmFWaXJ0dWFsSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsSm9pblRhYmxlLnRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldEpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcywgKEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBvd25lciBmb3IgImZvcndhcmQtcG9pbnRlciIgam9pbiBjb2x1bW5zOwotCSAqIHRoZXNlIHBvaW50IGF0IHRoZSB0YXJnZXQvaW52ZXJzZSBlbnRpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5Pd25lcgotCQlleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJCXJldHVybiAocmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBHZW5lcmljSmF2YVZpcnR1YWxKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJCUVudGl0eSByZWxhdGlvbnNoaXBUYXJnZXQgPSB0aGlzLmdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCQkJcmV0dXJuIChyZWxhdGlvbnNoaXBUYXJnZXQgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwVGFyZ2V0LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBqb2luQ29sdW1uSXNEZWZhdWx0KFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsSm9pblRhYmxlLnRoaXMuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcigoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMsIChKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjAzOGI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotLyoqCi0gKiBTaW1wbGlmeSBkZWxlZ2F0aW9uIHRvIGFub3RoZXIgZGVmaW5pdGlvbi4KLSAqIEEgc3ViY2xhc3MgbmVlZCBvbmx5IGltcGxlbWVudCB7QGxpbmsgI2dldERlbGVnYXRlKCl9IGFuZCBvdmVycmlkZSB0aGUKLSAqIGFwcHJvcHJpYXRlIG1ldGhvZChzKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXREZWxlZ2F0ZSgpLmdldEtleSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldERlbGVnYXRlKCkuZ2V0QW5ub3RhdGlvbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiB0aGlzLmdldERlbGVnYXRlKCkuaXNTcGVjaWZpZWQocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVsZWdhdGUoKS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCk7Ci0JfQotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVsZWdhdGUoKS5idWlsZE1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSwgZmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1ODY5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCVRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFCYXNpY01hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUudHlwZUlzQmFzaWMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjlmNTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkYWJsZURlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW1iZWRkYWJsZURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEphdmFFbWJlZGRhYmxlIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIEFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24sIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbWJlZGRhYmxlKHBlcnNpc3RlbnRUeXBlLCAoRW1iZWRkYWJsZUFubm90YXRpb24pIG1hcHBpbmdBbm5vdGF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkNzUyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbmcgdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEuQVRUUklCVVRFX09WRVJSSURFUywKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhRW1iZWRkZWRJZE1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0YTU3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEuQVRUUklCVVRFX09WRVJSSURFUywKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhRW1iZWRkZWRNYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEVtYmVkZGFibGUoKSAhPSBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW50aXR5RGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NGZhYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFFbnRpdHlEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVudGl0eURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YUVudGl0eURlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVudGl0eURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQkJVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCQlKUEEuU0VDT05EQVJZX1RBQkxFUywKLQkJCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCQlKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TLAotCQkJSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQkJSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJCURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCQlKUEEuTkFNRURfUVVFUklFUywKLQkJCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJCUpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUywKLQkJCUpQQS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HLAotCQkJSlBBLkVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMsCi0JCQlKUEEuRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUywKLQkJCUpQQS5FTlRJVFlfTElTVEVORVJTLAotCQkJSlBBLlBSRV9QRVJTSVNULAotCQkJSlBBLlBPU1RfUEVSU0lTVCwKLQkJCUpQQS5QUkVfUkVNT1ZFLAotCQkJSlBBLlBPU1RfUkVNT1ZFLAotCQkJSlBBLlBSRV9VUERBVEUsCi0JCQlKUEEuUE9TVF9VUERBVEUsCi0JCQlKUEEuUE9TVF9MT0FELAotCQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJCUpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTLAotCQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQkJSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUwotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlwdWJsaWMgSmF2YUVudGl0eSBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhRW50aXR5KHBlcnNpc3RlbnRUeXBlLCAoRW50aXR5QW5ub3RhdGlvbikgbWFwcGluZ0Fubm90YXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW50aXR5VGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW50aXR5VGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY3NDIyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVudGl0eVRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVudGl0eVRleHRSYW5nZVJlc29sdmVyCi0JaW1wbGVtZW50cyBFbnRpdHlUZXh0UmFuZ2VSZXNvbHZlcgotewotCXByaXZhdGUgSmF2YUVudGl0eSBlbnRpdHk7Ci0JCi0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgYXN0Um9vdDsKLQkKLQkKLQlwdWJsaWMgSmF2YUVudGl0eVRleHRSYW5nZVJlc29sdmVyKEphdmFFbnRpdHkgZW50aXR5LCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmVudGl0eSA9IGVudGl0eTsKLQkJdGhpcy5hc3RSb290ID0gYXN0Um9vdDsKLQl9Ci0JCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlTWFwcGluZ1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5LmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRJZENsYXNzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVNYXBwaW5nVGV4dFJhbmdlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLgotCQkJCWdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRjMjJhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUlkTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFJZE1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWYzM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIEphdmFKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI8SmF2YVJlYWRPbmx5Sm9pbkNvbHVtbj4KLQlpbXBsZW1lbnRzIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcgotewotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKEphdmFSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlcihjb2x1bW4sIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXRUYWJsZVRleHRSYW5nZSh0aGlzLmFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSh0aGlzLmFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDMwYzVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PcmRlckJ5QW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFueVRvTWFueU1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTZlMjc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFNYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUpQQS5KT0lOX0NPTFVNTlMKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRKYXZhTWFueVRvT25lTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTQwYjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQkJSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQkJTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQkJSlBBLk5BTUVEX1FVRVJJRVMsCi0JCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCQlKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsCi0JCQlKUEEuRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywKLQkJCUpQQS5FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLAotCQkJSlBBLkVOVElUWV9MSVNURU5FUlMsCi0JCQlKUEEuUFJFX1BFUlNJU1QsCi0JCQlKUEEuUE9TVF9QRVJTSVNULAotCQkJSlBBLlBSRV9SRU1PVkUsCi0JCQlKUEEuUE9TVF9SRU1PVkUsCi0JCQlKUEEuUFJFX1VQREFURSwKLQkJCUpQQS5QT1NUX1VQREFURSwKLQkJCUpQQS5QT1NUX0xPQUQKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIEFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24sIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFNYXBwZWRTdXBlcmNsYXNzKHBlcnNpc3RlbnRUeXBlLCAoTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24pIG1hcHBpbmdBbm5vdGF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzMTk3MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXh0UmFuZ2VSZXNvbHZlcgotCWltcGxlbWVudHMgUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyCi17Ci0JcHJpdmF0ZSBKYXZhTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzOwotCQotCXByaXZhdGUgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3Q7Ci0JCi0JCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzVGV4dFJhbmdlUmVzb2x2ZXIoCi0JCQlKYXZhTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzID0gbWFwcGVkU3VwZXJjbGFzczsKLQkJdGhpcy5hc3RSb290ID0gYXN0Um9vdDsKLQl9Ci0JCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlTWFwcGluZ1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkU3VwZXJjbGFzcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SWRDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZU1hcHBpbmdUZXh0UmFuZ2UoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLgotCQkJCWdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZjhkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seU5hbWVkQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI8SmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4+Ci17Ci0JcHVibGljIEphdmFOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyKEphdmFSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIoY29sdW1uLCBhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU51bGxUeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOdWxsVHlwZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI5OGFlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU51bGxUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSmF2YSBudWxsIHR5cGUgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgSmF2YU51bGxUeXBlTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmc8QW5ub3RhdGlvbj4KLXsKLQlwdWJsaWMgSmF2YU51bGxUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJZENsYXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8UXVlcnk+IGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogV2UgYWRkZWQgdGhpcyBtZXNzYWdlIGhlcmUgYmVjYXVzZSB0aGUgbW9zdCBsaWtlbHkgc29sdXRpb24gaXMgdG8gYWRkCi0JICogYW4gYW5ub3RhdGlvbiB0byB0aGUgLmphdmEgZmlsZS4KLQkgKiBUaGlzIG1lc3NhZ2UgdXNlZCB0byBiZSBmb3VuZCBvbiB0aGUgPGNsYXNzPiB0YWcgaW4gcGVyc2lzdGVuY2UueG1sLgotCSAqIFRoZSBvdGhlciBwb3NzaWJsZSB3YXkgdG8gZml4IHRoZSBlcnJvciBpcyB0byByZW1vdmUgaXQgZnJvbSBwZXJzaXN0ZW5jZS54bWwuCi0JICogVGhpcyBjYW4gYmUgYWNjb21wbGlzaGVkIHdpdGggdGhlIFN5bmNocm9uaXplIENsYXNzZXMgYWN0aW9uLgotCSAqIFdlIGNvdWxkIGFsc28gYWRkIGEgcXVpY2sgZml4IGZvciB0aGlzIGVycm9yLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCW1lc3NhZ2VzLmFkZCgKLQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUywKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCl9LAotCQkJCXRoaXMsCi0JCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkpCi0JCSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTU2MjY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEuSk9JTl9DT0xVTU5TCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU9uZVRvTWFueU1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ5ZDA1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEuSk9JTl9DT0xVTU5TLAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZKTsKLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YU9uZVRvT25lTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzM5MjgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIKLQlpbXBsZW1lbnRzIE92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlYWRPbmx5T3ZlcnJpZGUgamF2YU92ZXJyaWRlOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290OwotCi0JcHVibGljIEphdmFPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyKEphdmFSZWFkT25seU92ZXJyaWRlIGphdmFPdmVycmlkZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5qYXZhT3ZlcnJpZGUgPSBqYXZhT3ZlcnJpZGU7Ci0JCXRoaXMuYXN0Um9vdCA9IGFzdFJvb3Q7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhT3ZlcnJpZGUuZ2V0TmFtZVRleHRSYW5nZSh0aGlzLmFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZlNmY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyCi0JaW1wbGVtZW50cyBQZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0JcHJpdmF0ZSBDb21waWxhdGlvblVuaXQgYXN0Um9vdDsKLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCXRoaXMuYXN0Um9vdCA9IGFzdFJvb3Q7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQ4Yzc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5CYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPgotCWltcGxlbWVudHMgQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcgotewotCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb2x1bW4sIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyKGNvbHVtbiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKHRoaXMuYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1MWY3OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlUYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI8SmF2YVJlYWRPbmx5VGFibGVDb2x1bW4+Ci0JaW1wbGVtZW50cyBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyCi17Ci0JcHVibGljIEphdmFUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKEphdmFSZWFkT25seVRhYmxlQ29sdW1uIGNvbHVtbiwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIoY29sdW1uLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQyYmM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIKLQlpbXBsZW1lbnRzIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlYWRPbmx5VGFibGUgdGFibGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3Q7Ci0KLQotCXB1YmxpYyBKYXZhVGFibGVUZXh0UmFuZ2VSZXNvbHZlcihKYXZhUmVhZE9ubHlUYWJsZSB0YWJsZSwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50YWJsZSA9IHRhYmxlOwotCQl0aGlzLmFzdFJvb3QgPSBhc3RSb290OwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuZ2V0TmFtZVRleHRSYW5nZSh0aGlzLmFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuZ2V0Q2F0YWxvZ1RleHRSYW5nZSh0aGlzLmFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5nZXRTY2hlbWFUZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMWZjYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSmF2YVRyYW5zaWVudE1hcHBpbmcocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0MGUxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb247Ci0KLS8qKgotICogU2ltcGxpZnkgZGVsZWdhdGlvbiB0byBhbm90aGVyIGRlZmluaXRpb24uCi0gKiBBIHN1YmNsYXNzIG5lZWQgb25seSBpbXBsZW1lbnQge0BsaW5rICNnZXREZWxlZ2F0ZSgpfSBhbmQgb3ZlcnJpZGUgdGhlCi0gKiBhcHByb3ByaWF0ZSBtZXRob2QocykuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbgotewotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmdldERlbGVnYXRlKCkuZ2V0S2V5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVsZWdhdGUoKS5nZXRBbm5vdGF0aW9uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldERlbGVnYXRlKCkuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVsZWdhdGUoKS5idWlsZE1hcHBpbmcocGVyc2lzdGVudFR5cGUsIGFubm90YXRpb24sIGZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NGU2YjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIEphdmFUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyCi0JaW1wbGVtZW50cyBUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyCi17Ci0JcHJpdmF0ZSBKYXZhVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmc7Ci0KLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBhc3RSb290OwotCi0JcHVibGljIEphdmFUeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyKEphdmFUeXBlTWFwcGluZyB0eXBlTWFwcGluZywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy50eXBlTWFwcGluZyA9IHR5cGVNYXBwaW5nOwotCQl0aGlzLmFzdFJvb3QgPSBhc3RSb290OwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZU1hcHBpbmdUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5hc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRlN2IzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSA9IG5ldyBTdHJpbmdbXSB7Ci0JCUNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWSk7Ci0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFWZXJzaW9uTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvUHJvcGVydHlBY2Nlc3Nvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9qYXZhL1Byb3BlcnR5QWNjZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgzMTQ4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L2phdmEvUHJvcGVydHlBY2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lk1ldGhvZFNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LlBlcnNpc3RlbnRQcm9wZXJ0eVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5QWNjZXNzb3IgCi0JZXh0ZW5kcyBBYnN0cmFjdEFjY2Vzc29yCi17Ci0JcHJpdmF0ZSBmaW5hbCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXI7Ci0KLQlwcml2YXRlIGZpbmFsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcjsKLQkKLQlwdWJsaWMgUHJvcGVydHlBY2Nlc3NvcihSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnJlc291cmNlR2V0dGVyID0gcmVzb3VyY2VHZXR0ZXI7Ci0JCXRoaXMucmVzb3VyY2VTZXR0ZXIgPSByZXNvdXJjZVNldHRlcjsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQXR0cmlidXRlIGdldFJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZUdldHRlciAhPSBudWxsID8gdGhpcy5yZXNvdXJjZUdldHRlciA6IHRoaXMucmVzb3VyY2VTZXR0ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSmF2YVJlc291cmNlTWV0aG9kIGdldHRlck1ldGhvZCwgSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCkgewotCQlyZXR1cm4gKHRoaXMucmVzb3VyY2VHZXR0ZXIgPT0gZ2V0dGVyTWV0aG9kKSAmJiAodGhpcy5yZXNvdXJjZVNldHRlciA9PSBzZXR0ZXJNZXRob2QpOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldERlZmF1bHRBY2Nlc3MoKSB7Ci0JCXJldHVybiBBY2Nlc3NUeXBlLlBST1BFUlRZOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0UmVzb3VyY2VHZXR0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlR2V0dGVyOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0UmVzb3VyY2VTZXR0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlU2V0dGVyOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFVuYW5ub3RhdGVkSmF2YUF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRKYXZhQXR0cmlidXRlKHBhcmVudCwgdGhpcy5idWlsZFVuYW5ub3RhdGVkSmF2YVJlc291cmNlR2V0dGVyKCksIHRoaXMuYnVpbGRVbmFubm90YXRlZEphdmFSZXNvdXJjZVNldHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIEphdmEgcmVzb3VyY2UgbWV0aG9kIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIEphdmEgcmVzb3VyY2UKLQkgKiBnZXR0ZXIgbWV0aG9kIGFuZCBiZWhhdmVzIGFzIHRob3VnaCBpdCBoYXMgbm8gYW5ub3RhdGlvbnMuIFRoaXMgd2lsbCBjYXVzZQotCSAqIGFsbCB0aGUgc2V0dGluZ3MgaW4gdGhlIEphdmEgPGVtPmNvbnRleHQ8L2VtPiBhdHRyaWJ1dGUgdG8gZGVmYXVsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTWV0aG9kIGJ1aWxkVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VHZXR0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VNZXRob2QodGhpcy5nZXRSZXNvdXJjZUdldHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIEphdmEgcmVzb3VyY2UgbWV0aG9kIHRoYXQgd3JhcHMgdGhlIG9yaWdpbmFsIEphdmEgcmVzb3VyY2UKLQkgKiBzZXR0ZXIgbWV0aG9kIGFuZCBiZWhhdmVzIGFzIHRob3VnaCBpdCBoYXMgbm8gYW5ub3RhdGlvbnMuIFRoaXMgd2lsbCBjYXVzZQotCSAqIGFsbCB0aGUgc2V0dGluZ3MgaW4gdGhlIEphdmEgPGVtPmNvbnRleHQ8L2VtPiBhdHRyaWJ1dGUgdG8gZGVmYXVsdC4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTWV0aG9kIGJ1aWxkVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VTZXR0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVW5hbm5vdGF0ZWRKYXZhUmVzb3VyY2VNZXRob2QodGhpcy5nZXRSZXNvdXJjZVNldHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhQXR0cmlidXRlKFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRQcm9wZXJ0eShwYXJlbnQsIHJlc291cmNlR2V0dGVyLCByZXNvdXJjZVNldHRlcik7Ci0JfQotCi0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQXR0cmlidXRlVmFsaWRhdG9yKFBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgUGVyc2lzdGVudFByb3BlcnR5VmFsaWRhdG9yKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRoaXMsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1bmFubm90YXRlZCBKYXZhIHJlc291cmNlIG1ldGhvZCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBXcmFwIGFub3RoZXIgSmF2YSByZXNvdXJjZSBtZXRob2QgYW5kIHN1cHByZXNzIGFsbCBpdHMgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFVuYW5ub3RhdGVkSmF2YVJlc291cmNlTWV0aG9kCi0JCQlleHRlbmRzIFVuYW5ub3RhdGVkSmF2YVJlc291cmNlQXR0cmlidXRlPEphdmFSZXNvdXJjZU1ldGhvZD4KLQkJCWltcGxlbWVudHMgSmF2YVJlc291cmNlTWV0aG9kIHsKLQkJCi0JCXByb3RlY3RlZCBVbmFubm90YXRlZEphdmFSZXNvdXJjZU1ldGhvZChKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kKXsKLQkJCXN1cGVyKG1ldGhvZCk7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgS2luZCBnZXRLaW5kKCkgewotCQkJcmV0dXJuIEtpbmQuTUVUSE9EOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW1iZXIuZ2V0TWV0aG9kTmFtZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0UGFyYW1ldGVyVHlwZU5hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmdldFBhcmFtZXRlclR5cGVOYW1lcygpOwotCQl9Ci0JCQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclR5cGVOYW1lKGludCBpbmRleCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmdldFBhcmFtZXRlclR5cGVOYW1lKGluZGV4KTsKLQkJfQotCQkKLQkJcHVibGljIGludCBnZXRQYXJhbWV0ZXJzU2l6ZSgpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5nZXRQYXJhbWV0ZXJzU2l6ZSgpOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yKCkgewotCQkJcmV0dXJuIHRoaXMubWVtYmVyLmlzQ29uc3RydWN0b3IoKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gaXNGb3IoTWV0aG9kU2lnbmF0dXJlIG1ldGhvZFNpZ25hdHVyZSwgaW50IG9jY3VycmVuY2UpIHsKLQkJCXJldHVybiB0aGlzLm1lbWJlci5pc0ZvcihtZXRob2RTaWduYXR1cmUsIG9jY3VycmVuY2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdEVudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdEVudGl0eU1hcHBpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMWFkMDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RFbnRpdHlNYXBwaW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRDb250YWluZXJUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlCi0gKiA8YnI+Ci0gKiA8Y29kZT5lbnRpdHktbWFwcGluZ3M8L2NvZGU+IGVsZW1lbnQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW50aXR5TWFwcGluZ3MKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEVudGl0eU1hcHBpbmdzCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnZV87ICAvLyAicGFja2FnZSIgaXMgYSBKYXZhIGtleXdvcmQKLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBuZXcgVmVjdG9yPE9ybVBlcnNpc3RlbnRUeXBlPigpOwotCXByb3RlY3RlZCBmaW5hbCBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lckFkYXB0ZXIgcGVyc2lzdGVudFR5cGVDb250YWluZXJBZGFwdGVyID0gbmV3IFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVNlcXVlbmNlR2VuZXJhdG9yLCBYbWxTZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVGFibGVHZW5lcmF0b3IsIFhtbFRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvckNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1RdWVyeUNvbnRhaW5lciBxdWVyeUNvbnRhaW5lcjsKLQotCS8vIExvb2t1cCBvZiBjbGFzc25hbWUgdG8gQ2xhc3MgdG8gcmVzb2x2ZSB3cmFwcGVyIGNsYXNzZXMKLQlwcm90ZWN0ZWQgc3RhdGljIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBQUklNSVRJVkVfV1JBUFBFUl9DTEFTU0VTID0gbnVsbDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0RW50aXR5TWFwcGluZ3MoT3JtWG1sIHBhcmVudCwgWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncyA9IHhtbEVudGl0eU1hcHBpbmdzOwotCi0JCXRoaXMuZGVzY3JpcHRpb24gPSB0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldERlc2NyaXB0aW9uKCk7Ci0JCXRoaXMucGFja2FnZV8gPSB0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFBhY2thZ2UoKTsKLQotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRDYXRhbG9nKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRTY2hlbWEoKTsKLQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplUGVyc2lzdGVudFR5cGVzKCk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDb250YWluZXIgPSB0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb250YWluZXIoKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckNvbnRhaW5lciA9IHRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckNvbnRhaW5lcigpOwotCi0JCXRoaXMucXVlcnlDb250YWluZXIgPSB0aGlzLmJ1aWxkUXVlcnlDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnNldERlc2NyaXB0aW9uXyh0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldERlc2NyaXB0aW9uKCkpOwotCQl0aGlzLnNldFBhY2thZ2VfKHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0UGFja2FnZSgpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18odGhpcy5idWlsZFNwZWNpZmllZEFjY2VzcygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyh0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNjaGVtYSgpKTsKLQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnN5bmNQZXJzaXN0ZW50VHlwZXMoKTsKLQkJdGhpcy5zeW5jU2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JCXRoaXMuc3luY1RhYmxlR2VuZXJhdG9ycygpOwotCi0JCXRoaXMucXVlcnlDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0QWNjZXNzKHRoaXMuYnVpbGREZWZhdWx0QWNjZXNzKCkpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOwotCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0TWV0YWRhdGEudXBkYXRlKCk7Ci0KLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFRhYmxlR2VuZXJhdG9ycygpKTsKLQotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVhtbCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtWG1sKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvLyBUT0RPIGJqdiBhZGQgdG8gaW50ZXJmYWNlCi0JcHVibGljIE9ybVhtbCBnZXRPcm1YbWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRNYXBwaW5nRmlsZVJvb3QoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBPcm1TdHJ1Y3R1cmVOb2Rlcy5FTlRJVFlfTUFQUElOR1NfSUQ7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlmb3IgKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlOiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQlpZiAocGVyc2lzdGVudFR5cGUuY29udGFpbnModGV4dE9mZnNldCkpIHsKLQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA6IHRoaXMuZ2V0UGVyc2lzdGVudFR5cGVzKCkpIHsKLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZS5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRPdmVycmlkZVBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgPyB0aGlzLnNwZWNpZmllZEFjY2VzcyA6IG51bGw7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBY2Nlc3MoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQZXJzaXN0ZW50VHlwZVBhY2thZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhY2thZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgbWV0YWRhdGEgKioqKioqKioqKgotCi0JcHVibGljIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgYnVpbGRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVudGl0eU1hcHBpbmdzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VmVyc2lvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoYW5nZU1hcHBpbmcoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUsIE9ybVR5cGVNYXBwaW5nIG9sZE1hcHBpbmcsIE9ybVR5cGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJQWNjZXNzVHlwZSBzYXZlZEFjY2VzcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQlpbnQgc291cmNlSW5kZXggPSB0aGlzLnBlcnNpc3RlbnRUeXBlcy5pbmRleE9mKG9ybVBlcnNpc3RlbnRUeXBlKTsKLQkJdGhpcy5wZXJzaXN0ZW50VHlwZXMucmVtb3ZlKHNvdXJjZUluZGV4KTsKLQkJb2xkTWFwcGluZy5yZW1vdmVYbWxUeXBlTWFwcGluZ0Zyb20odGhpcy54bWxFbnRpdHlNYXBwaW5ncyk7Ci0JCWludCB0YXJnZXRJbmRleCA9IHRoaXMuY2FsY3VsYXRlSW5zZXJ0aW9uSW5kZXgob3JtUGVyc2lzdGVudFR5cGUpOwotCQl0aGlzLnBlcnNpc3RlbnRUeXBlcy5hZGQodGFyZ2V0SW5kZXgsIG9ybVBlcnNpc3RlbnRUeXBlKTsKLQkJbmV3TWFwcGluZy5hZGRYbWxUeXBlTWFwcGluZ1RvKHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOwotCi0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZyk7Ci0JCS8vbm90IHN1cmUgd2hlcmUgZWxzZSB0byBwdXQgdGhpcywgbmVlZCB0byBzZXQgdGhlIGFjY2VzcyBvbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKHNhdmVkQWNjZXNzKTsKLQkJdGhpcy5maXJlSXRlbU1vdmVkKFBFUlNJU1RFTlRfVFlQRVNfTElTVCwgdGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldE9ybVhtbCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gKHRoaXMueG1sRW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgJiYgdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVzY3JpcHRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXRoaXMuc2V0RGVzY3JpcHRpb25fKGRlc2NyaXB0aW9uKTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVzY3JpcHRpb25fKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZXNjcmlwdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRJT05fUFJPUEVSVFksIG9sZCwgZGVzY3JpcHRpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFja2FnZV87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFja2FnZShTdHJpbmcgcGFja2FnZV8pIHsKLQkJdGhpcy5zZXRQYWNrYWdlXyhwYWNrYWdlXyk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0UGFja2FnZShwYWNrYWdlXyk7Ci0JfQotCi0JLyoqCi0JICogVE9ETyBJZiB0aGUgcGFja2FnZSBjaGFuZ2VzLCB3ZSBzaG91bGQgcHJvYmFibHkgY2xlYXIgb3V0IGFsbCByZXNvbHZlZAotCSAqIHJlZmVyZW5jZXMgdG8gcGVyc2lzdGVudCB0eXBlczo8dWw+Ci0JICogPGxpPntAbGluayBPcm1JZENsYXNzUmVmZXJlbmNlI2dldElkQ2xhc3MoKX0KLQkgKiA8bGk+e0BsaW5rIE9ybVBlcnNpc3RlbnRUeXBlI2dldEphdmFQZXJzaXN0ZW50VHlwZSgpfQotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGFja2FnZV8oU3RyaW5nIHBhY2thZ2VfKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnBhY2thZ2VfOwotCQl0aGlzLnBhY2thZ2VfID0gcGFja2FnZV87Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQQUNLQUdFX1BST1BFUlRZLCBvbGQsIHBhY2thZ2VfKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2VzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWNjZXNzIDogdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18oYWNjZXNzKTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5zZXRBY2Nlc3MoQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwoYWNjZXNzKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzXyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZCwgYWNjZXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRBY2Nlc3MoKSwgdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLCB0aGlzLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JCXRoaXMuZGVmYXVsdEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0QWNjZXNzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA6IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyhjYXRhbG9nKTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5zZXRDYXRhbG9nKGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KLQkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZyBnZXREYkNhdGFsb2coKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnJlc29sdmVEYkNhdGFsb2coY2F0YWxvZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjaGVtYSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NoZW1hIDogdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWFfKHNjaGVtYSk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3Muc2V0U2NoZW1hKHNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJU2NoZW1hQ29udGFpbmVyIGRiU2NoZW1hQ29udGFpbmVyID0gdGhpcy5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQlyZXR1cm4gKGRiU2NoZW1hQ29udGFpbmVyID09IG51bGwpID8gbnVsbCA6IGRiU2NoZW1hQ29udGFpbmVyLmdldFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRTY2hlbWEoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSBjb250YWluZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPiBjYXRhbG9nKSwKLQkgKiB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzOyBhbmQgd2UgbmVlZCB0bwotCSAqIGdldCB0aGUgc2NoZW1hIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqLwotCXB1YmxpYyBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyAhPSBudWxsKSA/IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdGVudCB0eXBlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlPiBnZXRQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlPih0aGlzLnBlcnNpc3RlbnRUeXBlcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQZXJzaXN0ZW50VHlwZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW50VHlwZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgOiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQlpZiAob3JtUGVyc2lzdGVudFR5cGUuaXNGb3IoY2xhc3NOYW1lKSkgewotCQkJCXJldHVybiBvcm1QZXJzaXN0ZW50VHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1BlcnNpc3RlbnRUeXBlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoY2xhc3NOYW1lKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSByZXNvbHZlUGVyc2lzdGVudFR5cGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gKFBlcnNpc3RlbnRUeXBlKSB0aGlzLnJlc29sdmVUeXBlKFBFUlNJU1RFTlRfVFlQRV9MT09LVVBfQURBUFRFUiwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc29sdmVKYXZhUmVzb3VyY2VUeXBlKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUpIHRoaXMucmVzb2x2ZVR5cGUoUkVTT1VSQ0VfVFlQRV9MT09LVVBfQURBUFRFUiwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc29sdmVKYXZhUmVzb3VyY2VUeXBlKFN0cmluZyBjbGFzc05hbWUsIEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZS5LaW5kIGtpbmQpIHsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IHRoaXMucmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUoY2xhc3NOYW1lKTsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsIHx8IHJlc291cmNlVHlwZS5nZXRLaW5kKCkgIT0ga2luZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVR5cGUgcmVzb2x2ZUpkdFR5cGUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlDbGFzczw/PiB3cmFwcGVyQ2xhc3MgPSBnZXRQcmltaXRpdmVXcmFwcGVyQ2xhc3NGb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCWlmICh3cmFwcGVyQ2xhc3MgIT0gbnVsbCkgewotCQkJY2xhc3NOYW1lID0gd3JhcHBlckNsYXNzLmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gKElUeXBlKSB0aGlzLnJlc29sdmVUeXBlKEpEVF9UWVBFX0xPT0tVUF9BREFQVEVSLCBjbGFzc05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgcmVzb2x2ZVR5cGUoVHlwZUxvb2t1cEFkYXB0ZXIgYWRhcHRlciwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZiAoY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JICAgIC8vTm8gZ2xvYmFsIHBhY2thZ2UgZGVmaW5lZCBvciB0aGUgY2xhc3MgbmFtZSBpcyBxdWFsaWZpZWQsIHVzZSB0aGUgY2xhc3NOYW1lLiAKLQkJLy9PdGhlcndpc2UsIHByZXBlbmQgdGhlIGdsb2JhbCBwYWNrYWdlIG5hbWUuCi0JCWlmICh0aGlzLmdldFBhY2thZ2UoKSAhPSBudWxsICYmIGNsYXNzTmFtZS5pbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCWNsYXNzTmFtZSA9IHRoaXMucHJlcGVuZEdsb2JhbFBhY2thZ2UoY2xhc3NOYW1lKTsKLQkJfQotCQkvLyBzdGF0aWMgaW5uZXIgY2xhc3MgbGlzdGVkIGluIG9ybS54bWwgd2lsbCB1c2UgJyQnLCByZXBsYWNlIHdpdGggJy4nCi0JCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQotCQkJcmV0dXJuIGFkYXB0ZXIucmVzb2x2ZVR5cGUodGhpcywgY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmVjb25kaXRpb25zOiAKLQkgKiAJCWdldFBhY2thZ2UoKSBpcyBub3QgbnVsbAotCSAqIAkJdW5xdWFsaWZpZWRDbGFzc05hbWUgaXMgbm90IHF1YWxpZmllZCAoY29udGFpbnMgbm8gJy4nKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJlcGVuZEdsb2JhbFBhY2thZ2UoU3RyaW5nIHVucXVhbGlmaWVkQ2xhc3NOYW1lKSB7Ci0JCS8vIEZvcm1hdCBvZiBnbG9iYWwgcGFja2FnZSBpcyAiZm9vLmJhciIKLQkJcmV0dXJuIHRoaXMuZ2V0UGFja2FnZSgpICsgJy4nICsgdW5xdWFsaWZpZWRDbGFzc05hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIGludGVyZmFjZSBUeXBlTG9va3VwQWRhcHRlciB7Ci0JCU9iamVjdCByZXNvbHZlVHlwZShFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncywgU3RyaW5nIGNsYXNzTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUeXBlTG9va3VwQWRhcHRlciBQRVJTSVNURU5UX1RZUEVfTE9PS1VQX0FEQVBURVIgPQotCQluZXcgVHlwZUxvb2t1cEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IHJlc29sdmVUeXBlKEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJcmV0dXJuIGVudGl0eU1hcHBpbmdzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCX07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFR5cGVMb29rdXBBZGFwdGVyIFJFU09VUkNFX1RZUEVfTE9PS1VQX0FEQVBURVIgPQotCQluZXcgVHlwZUxvb2t1cEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgT2JqZWN0IHJlc29sdmVUeXBlKEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJcmV0dXJuIGVudGl0eU1hcHBpbmdzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKGNsYXNzTmFtZSk7Ci0JCQl9Ci0JCX07Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFR5cGVMb29rdXBBZGFwdGVyIEpEVF9UWVBFX0xPT0tVUF9BREFQVEVSID0KLQkJbmV3IFR5cGVMb29rdXBBZGFwdGVyKCkgewotCQkJcHVibGljIE9iamVjdCByZXNvbHZlVHlwZShFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncywgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGVudGl0eU1hcHBpbmdzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJCXJldHVybiBKRFRUb29scy5maW5kVHlwZShqYXZhUHJvamVjdCwgY2xhc3NOYW1lKTsKLQkJCX0KLQkJfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgQ2xhc3M8Pz4gZ2V0UHJpbWl0aXZlV3JhcHBlckNsYXNzRm9yTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmIChQUklNSVRJVkVfV1JBUFBFUl9DTEFTU0VTID09IG51bGwpIHsKLQkJCVBSSU1JVElWRV9XUkFQUEVSX0NMQVNTRVMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENsYXNzPD8+PigpOwotCQkJUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NFUy5wdXQoIkJvb2xlYW4iLCBCb29sZWFuLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NFUy5wdXQoIkJ5dGUiLCBCeXRlLmNsYXNzKTsgLy8kTk9OLU5MUy0xJAotCQkJUFJJTUlUSVZFX1dSQVBQRVJfQ0xBU1NFUy5wdXQoIkNoYXJhY3RlciIsIENoYXJhY3Rlci5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVBSSU1JVElWRV9XUkFQUEVSX0NMQVNTRVMucHV0KCJEb3VibGUiLCBEb3VibGUuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQlQUklNSVRJVkVfV1JBUFBFUl9DTEFTU0VTLnB1dCgiRmxvYXQiLCBGbG9hdC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVBSSU1JVElWRV9XUkFQUEVSX0NMQVNTRVMucHV0KCJJbnRlZ2VyIiwgSW50ZWdlci5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVBSSU1JVElWRV9XUkFQUEVSX0NMQVNTRVMucHV0KCJMb25nIiwgTG9uZy5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVBSSU1JVElWRV9XUkFQUEVSX0NMQVNTRVMucHV0KCJOdW1iZXIiLCBOdW1iZXIuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0JCQlQUklNSVRJVkVfV1JBUFBFUl9DTEFTU0VTLnB1dCgiU2hvcnQiLCBTaG9ydC5jbGFzcyk7IC8vJE5PTi1OTFMtMSQKLQkJCVBSSU1JVElWRV9XUkFQUEVSX0NMQVNTRVMucHV0KCJTdHJpbmciLCBTdHJpbmcuY2xhc3MpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiAoY2xhc3NOYW1lID09IG51bGwpID8gbnVsbCA6IFBSSU1JVElWRV9XUkFQUEVSX0NMQVNTRVMuZ2V0KGNsYXNzTmFtZSk7IAotICAgIH0KLQotCS8qKgotCSAqIFdlIGhhdmUgdG8gY2FsY3VsYXRlIHRoZSBuZXcgcGVyc2lzdGVudCB0eXBlJ3MgaW5kZXguCi0JICogV2Ugd2lsbCB1c2UgdGhlIHR5cGUncyBzaG9ydCBuYW1lIGlmIHRoZSBlbnRpdHkgbWFwcGluZ3MncwotCSAqIHBhY2thZ2UgaXMgdGhlIHNhbWUgYXMgdGhlIHR5cGUncyBwYWNrYWdlLgotCSAqLwotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBhZGRQZXJzaXN0ZW50VHlwZShTdHJpbmcgbWFwcGluZ0tleSwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gbWQgPSB0aGlzLmdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldFR5cGVNYXBwaW5nRGVmaW5pdGlvbihtYXBwaW5nS2V5KTsKLQkJWG1sVHlwZU1hcHBpbmcgeG1sVHlwZU1hcHBpbmcgPSBtZC5idWlsZFJlc291cmNlTWFwcGluZyh0aGlzLmdldFJlc291cmNlTm9kZUZhY3RvcnkoKSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gdGhpcy5idWlsZFBlcnNpc3RlbnRUeXBlKHhtbFR5cGVNYXBwaW5nKTsKLQkJaW50IGluZGV4ID0gdGhpcy5jYWxjdWxhdGVJbnNlcnRpb25JbmRleChwZXJzaXN0ZW50VHlwZSk7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgcGVyc2lzdGVudFR5cGUsIHRoaXMucGVyc2lzdGVudFR5cGVzLCBQRVJTSVNURU5UX1RZUEVTX0xJU1QpOwotCi0JCXBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5hZGRYbWxUeXBlTWFwcGluZ1RvKHRoaXMueG1sRW50aXR5TWFwcGluZ3MpOwotCi0JCS8vIGFkZHMgc2hvcnQgbmFtZSBpZiBwYWNrYWdlIG5hbWUgaXMgcmVsZXZhbnQKLQkJY2xhc3NOYW1lID0gdGhpcy5ub3JtYWxpemVDbGFzc05hbWUoY2xhc3NOYW1lKTsKLQkJcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldENsYXNzKGNsYXNzTmFtZSk7Ci0KLQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIFNob3J0ZW4gdGhlIHNwZWNpZmllZCBjbGFzcyBuYW1lIGlmIGl0IGlzIGluIHRoZSBlbnRpdHkgbWFwcGluZ3MncyBwYWNrYWdlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbm9ybWFsaXplQ2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJcmV0dXJuICgodGhpcy5wYWNrYWdlXyAhPSBudWxsKSAmJgotCQkJCWNsYXNzTmFtZS5zdGFydHNXaXRoKHRoaXMucGFja2FnZV8pICYmCi0JCQkJKGNsYXNzTmFtZS5jaGFyQXQodGhpcy5wYWNrYWdlXy5sZW5ndGgoKSkgPT0gJy4nKSkgPwotCQkJCQkJY2xhc3NOYW1lLnN1YnN0cmluZyh0aGlzLnBhY2thZ2VfLmxlbmd0aCgpICsgMSkgOgotCQkJCQkJY2xhc3NOYW1lOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50VHlwZSBidWlsZFBlcnNpc3RlbnRUeXBlKFhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUGVyc2lzdGVudFR5cGUodGhpcywgeG1sVHlwZU1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY2FsY3VsYXRlSW5zZXJ0aW9uSW5kZXgoT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pbnNlcnRpb25JbmRleE9mKHRoaXMucGVyc2lzdGVudFR5cGVzLCBvcm1QZXJzaXN0ZW50VHlwZSwgTUFQUElOR19DT01QQVJBVE9SKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IE1BUFBJTkdfQ09NUEFSQVRPUiA9Ci0JCW5ldyBDb21wYXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPcm1QZXJzaXN0ZW50VHlwZSBvMSwgT3JtUGVyc2lzdGVudFR5cGUgbzIpIHsKLQkJCQlpbnQgbzFTZXF1ZW5jZSA9IG8xLmdldE1hcHBpbmcoKS5nZXRYbWxTZXF1ZW5jZSgpOwotCQkJCWludCBvMlNlcXVlbmNlID0gbzIuZ2V0TWFwcGluZygpLmdldFhtbFNlcXVlbmNlKCk7Ci0JCQkJaWYgKG8xU2VxdWVuY2UgPCBvMlNlcXVlbmNlKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJaWYgKG8xU2VxdWVuY2UgPT0gbzJTZXF1ZW5jZSkgewotCQkJCQlyZXR1cm4gMDsKLQkJCQl9Ci0JCQkJcmV0dXJuIDE7Ci0JCQl9Ci0JCX07Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW50VHlwZShpbnQgaW5kZXgpIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSB0aGlzLnJlbW92ZVBlcnNpc3RlbnRUeXBlXyhpbmRleCk7Ci0JCXBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5yZW1vdmVYbWxUeXBlTWFwcGluZ0Zyb20odGhpcy54bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCi0JLyoqCi0JICogZGlzcG9zZSBhbmQgcmV0dXJuIHRoZSBwZXJzaXN0ZW50IHR5cGUKLQkgKi8KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudFR5cGUgcmVtb3ZlUGVyc2lzdGVudFR5cGVfKGludCBpbmRleCkgewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLnBlcnNpc3RlbnRUeXBlcywgUEVSU0lTVEVOVF9UWVBFU19MSVNUKTsKLQkJcGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOwotCQlyZXR1cm4gcGVyc2lzdGVudFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyc2lzdGVudFR5cGUoT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJdGhpcy5yZW1vdmVQZXJzaXN0ZW50VHlwZSh0aGlzLnBlcnNpc3RlbnRUeXBlcy5pbmRleE9mKHBlcnNpc3RlbnRUeXBlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBlcnNpc3RlbnRUeXBlcygpIHsKLQkJZm9yIChYbWxUeXBlTWFwcGluZyB4bWxUeXBlTWFwcGluZyA6IHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmdzKCkpIHsKLQkJCXRoaXMucGVyc2lzdGVudFR5cGVzLmFkZCh0aGlzLmJ1aWxkUGVyc2lzdGVudFR5cGUoeG1sVHlwZU1hcHBpbmcpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCUNvbnRleHRDb250YWluZXJUb29scy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKHRoaXMucGVyc2lzdGVudFR5cGVDb250YWluZXJBZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8WG1sVHlwZU1hcHBpbmc+IGdldFhtbFR5cGVNYXBwaW5ncygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFhtbFR5cGVNYXBwaW5nPih0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFR5cGVNYXBwaW5ncygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlUGVyc2lzdGVudFR5cGVfKGludCBpbmRleCwgT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgcGVyc2lzdGVudFR5cGUsIHRoaXMucGVyc2lzdGVudFR5cGVzLCBQRVJTSVNURU5UX1RZUEVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBlcnNpc3RlbnRUeXBlXyhpbnQgaW5kZXgsIFhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nKSB7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgdGhpcy5idWlsZFBlcnNpc3RlbnRUeXBlKHhtbFR5cGVNYXBwaW5nKSwgdGhpcy5wZXJzaXN0ZW50VHlwZXMsIFBFUlNJU1RFTlRfVFlQRVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUGVyc2lzdGVudFR5cGVfKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7Ci0JCXRoaXMucmVtb3ZlUGVyc2lzdGVudFR5cGVfKHRoaXMucGVyc2lzdGVudFR5cGVzLmluZGV4T2YocGVyc2lzdGVudFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBwZXJzaXN0ZW50IHR5cGUgY29udGFpbmVyIGFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUGVyc2lzdGVudFR5cGVDb250YWluZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgQ29udGV4dENvbnRhaW5lclRvb2xzLkFkYXB0ZXI8T3JtUGVyc2lzdGVudFR5cGUsIFhtbFR5cGVNYXBwaW5nPgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RFbnRpdHlNYXBwaW5ncy50aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYWJsZTxYbWxUeXBlTWFwcGluZz4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEVudGl0eU1hcHBpbmdzLnRoaXMuZ2V0WG1sVHlwZU1hcHBpbmdzKCk7Ci0JCX0KLQkJcHVibGljIFhtbFR5cGVNYXBwaW5nIGdldFJlc291cmNlRWxlbWVudChPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIE9ybVBlcnNpc3RlbnRUeXBlIGVsZW1lbnQpIHsKLQkJCUFic3RyYWN0RW50aXR5TWFwcGluZ3MudGhpcy5tb3ZlUGVyc2lzdGVudFR5cGVfKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIFhtbFR5cGVNYXBwaW5nIHJlc291cmNlRWxlbWVudCkgewotCQkJQWJzdHJhY3RFbnRpdHlNYXBwaW5ncy50aGlzLmFkZFBlcnNpc3RlbnRUeXBlXyhpbmRleCwgcmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChPcm1QZXJzaXN0ZW50VHlwZSBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEVudGl0eU1hcHBpbmdzLnRoaXMucmVtb3ZlUGVyc2lzdGVudFR5cGVfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlcXVlbmNlIGdlbmVyYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNlcXVlbmNlR2VuZXJhdG9yKHRoaXMuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoaW50IGluZGV4KSB7Ci0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbEdlbmVyYXRvciA9IHRoaXMuYnVpbGRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3JDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbEdlbmVyYXRvcik7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuYWRkKGluZGV4LCB4bWxHZW5lcmF0b3IpOwotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkWG1sU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtU2VxdWVuY2VHZW5lcmF0b3IodGhpcywgeG1sU2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXRoaXMucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IodGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoc2VxdWVuY2VHZW5lcmF0b3IpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcihpbnQgaW5kZXgpIHsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NlcXVlbmNlR2VuZXJhdG9ycygpIHsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JzKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbFNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtU2VxdWVuY2VHZW5lcmF0b3IsIFhtbFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQ29udGFpbmVyKCkgewotCQlTZXF1ZW5jZUdlbmVyYXRvckNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU2VxdWVuY2VHZW5lcmF0b3JDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBzZXF1ZW5jZSBnZW5lcmF0b3IgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtU2VxdWVuY2VHZW5lcmF0b3IsIFhtbFNlcXVlbmNlR2VuZXJhdG9yPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNFUVVFTkNFX0dFTkVSQVRPUlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sU2VxdWVuY2VHZW5lcmF0b3IgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RFbnRpdHlNYXBwaW5ncy50aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEVudGl0eU1hcHBpbmdzLnRoaXMuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtU2VxdWVuY2VHZW5lcmF0b3IgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxHZW5lcmF0b3IoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSBnZW5lcmF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVGFibGVHZW5lcmF0b3I+IGdldFRhYmxlR2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3JDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZUdlbmVyYXRvckNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5hZGRUYWJsZUdlbmVyYXRvcih0aGlzLmdldFRhYmxlR2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybVRhYmxlR2VuZXJhdG9yIGFkZFRhYmxlR2VuZXJhdG9yKGludCBpbmRleCkgewotCQlYbWxUYWJsZUdlbmVyYXRvciB4bWxUYWJsZUdlbmVyYXRvciA9IHRoaXMuYnVpbGRYbWxUYWJsZUdlbmVyYXRvcigpOwotCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IHRoaXMudGFibGVHZW5lcmF0b3JDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQkJdGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKS5hZGQoaW5kZXgsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvciBidWlsZFhtbFRhYmxlR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciB4bWxUYWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVRhYmxlR2VuZXJhdG9yKHRoaXMsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVUYWJsZUdlbmVyYXRvcihPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQl0aGlzLnJlbW92ZVRhYmxlR2VuZXJhdG9yKHRoaXMudGFibGVHZW5lcmF0b3JDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KHRhYmxlR2VuZXJhdG9yKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoaW50IGluZGV4KSB7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFRhYmxlR2VuZXJhdG9ycygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVRhYmxlR2VuZXJhdG9yKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VGFibGVHZW5lcmF0b3JzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNUYWJsZUdlbmVyYXRvcnMoKSB7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sVGFibGVHZW5lcmF0b3I+IGdldFhtbFRhYmxlR2VuZXJhdG9ycygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxUYWJsZUdlbmVyYXRvcj4odGhpcy54bWxFbnRpdHlNYXBwaW5ncy5nZXRUYWJsZUdlbmVyYXRvcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVRhYmxlR2VuZXJhdG9yLCBYbWxUYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZUdlbmVyYXRvckNvbnRhaW5lcigpIHsKLQkJVGFibGVHZW5lcmF0b3JDb250YWluZXIgY29udGFpbmVyID0gbmV3IFRhYmxlR2VuZXJhdG9yQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogdGFibGUgZ2VuZXJhdG9yIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBUYWJsZUdlbmVyYXRvckNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVRhYmxlR2VuZXJhdG9yLCBYbWxUYWJsZUdlbmVyYXRvcj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBUQUJMRV9HRU5FUkFUT1JTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1UYWJsZUdlbmVyYXRvciBidWlsZENvbnRleHRFbGVtZW50KFhtbFRhYmxlR2VuZXJhdG9yIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0RW50aXR5TWFwcGluZ3MudGhpcy5idWlsZFRhYmxlR2VuZXJhdG9yKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sVGFibGVHZW5lcmF0b3I+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RFbnRpdHlNYXBwaW5ncy50aGlzLmdldFhtbFRhYmxlR2VuZXJhdG9ycygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVRhYmxlR2VuZXJhdG9yIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sR2VuZXJhdG9yKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcnkgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1RdWVyeUNvbnRhaW5lciBnZXRRdWVyeUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVF1ZXJ5Q29udGFpbmVyIGJ1aWxkUXVlcnlDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUXVlcnlDb250YWluZXIodGhpcywgdGhpcy54bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMvZ2VuZXJhdG9ycyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UXVlcnk+IGdldE1hcHBpbmdGaWxlUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxRdWVyeT4oCi0JCQkJCXRoaXMucXVlcnlDb250YWluZXIuZ2V0UXVlcmllcygpLAotCQkJCQl0aGlzLmdldFR5cGVNYXBwaW5nUXVlcmllcygpCi0JCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UXVlcnk+IGdldFR5cGVNYXBwaW5nUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxRdWVyeT4odGhpcy5nZXRUeXBlTWFwcGluZ1F1ZXJ5TGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFF1ZXJ5Pj4gZ2V0VHlwZU1hcHBpbmdRdWVyeUxpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtVHlwZU1hcHBpbmcsIEl0ZXJhYmxlPFF1ZXJ5Pj4odGhpcy5nZXRUeXBlTWFwcGluZ3MoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFF1ZXJ5PiB0cmFuc2Zvcm0oT3JtVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJCQkJCXJldHVybiB0eXBlTWFwcGluZy5nZXRRdWVyaWVzKCk7Ci0JCQkJCX0KLQkJCQl9OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldE1hcHBpbmdGaWxlR2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxHZW5lcmF0b3I+KAotCQkJCQl0aGlzLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLAotCQkJCQl0aGlzLmdldFRhYmxlR2VuZXJhdG9ycygpLAotCQkJCQl0aGlzLmdldFR5cGVNYXBwaW5nR2VuZXJhdG9ycygpCi0JCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRUeXBlTWFwcGluZ0dlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8R2VuZXJhdG9yPih0aGlzLmdldFR5cGVNYXBwaW5nR2VuZXJhdG9yTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEdlbmVyYXRvcj4+IGdldFR5cGVNYXBwaW5nR2VuZXJhdG9yTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxPcm1UeXBlTWFwcGluZywgSXRlcmFibGU8R2VuZXJhdG9yPj4odGhpcy5nZXRUeXBlTWFwcGluZ3MoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEdlbmVyYXRvcj4gdHJhbnNmb3JtKE9ybVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCQkJCQlyZXR1cm4gdHlwZU1hcHBpbmcuZ2V0R2VuZXJhdG9ycygpOwotCQkJCQl9Ci0JCQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8T3JtVHlwZU1hcHBpbmc+IGdldFR5cGVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlLCBPcm1UeXBlTWFwcGluZz4odGhpcy5nZXRQZXJzaXN0ZW50VHlwZXMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIE9ybVR5cGVNYXBwaW5nIHRyYW5zZm9ybShPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQkJCQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCQkJfQotCQkJCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIGdlbmVyYXRvcnMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0I3ZhbGlkYXRlR2VuZXJhdG9ycyhMaXN0LCBJUmVwb3J0ZXIpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlVmVyc2lvbihtZXNzYWdlcyk7Ci0JCS8vIGdlbmVyYXRvcnMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWZvciAoT3JtUGVyc2lzdGVudFR5cGUgIG9ybVBlcnNpc3RlbnRUeXBlIDogdGhpcy5nZXRQZXJzaXN0ZW50VHlwZXMoKSkgewotCQkJdGhpcy52YWxpZGF0ZVBlcnNpc3RlbnRUeXBlKG9ybVBlcnNpc3RlbnRUeXBlLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWZXJzaW9uKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICghIHRoaXMuZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKCkuZXF1YWxzKHRoaXMueG1sRW50aXR5TWFwcGluZ3MuZ2V0VmVyc2lvbigpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5MT1dfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVkVSU0lPTl9OT1RfTEFURVNULAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLnhtbEVudGl0eU1hcHBpbmdzLmdldFZlcnNpb25UZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMYXRlc3REb2N1bWVudFZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVBsYXRmb3JtKCkuZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZSh0aGlzLmdldENvbnRlbnRUeXBlKCkpLmdldFZlcnNpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBlcnNpc3RlbnRUeXBlKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRyeSB7Ci0JCQlwZXJzaXN0ZW50VHlwZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxEZWxldGVFZGl0PiBjcmVhdGVEZWxldGVUeXBlRWRpdHMoZmluYWwgSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPERlbGV0ZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtUGVyc2lzdGVudFR5cGUsIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+Pih0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+IHRyYW5zZm9ybShPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuY3JlYXRlRGVsZXRlVHlwZUVkaXRzKHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhmaW5hbCBJVHlwZSBvcmlnaW5hbFR5cGUsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtUGVyc2lzdGVudFR5cGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4odGhpcy5nZXRQZXJzaXN0ZW50VHlwZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7Ci0JCQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtUGVyc2lzdGVudFR5cGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4odGhpcy5nZXRQZXJzaXN0ZW50VHlwZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7Ci0JCQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLmNyZWF0ZVBlcnNpc3RlbnRUeXBlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbnRUeXBlUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KHRoaXMuZ2V0UGVyc2lzdGVudFR5cGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoZmluYWwgSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIGZpbmFsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLnBhY2thZ2VfLCBvcmlnaW5hbFBhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMueG1sRW50aXR5TWFwcGluZ3MuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MWRmMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNlRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuU2ltcGxlTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFggZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZywgQXR0cmlidXRlTWFwcGluZzJfMAotewotCS8vIG5ldmVyIG51bGwKLQlwcm90ZWN0ZWQgZmluYWwgWCB4bWxBdHRyaWJ1dGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYIHhtbEF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nID0geG1sQXR0cmlidXRlTWFwcGluZzsKLQkJdGhpcy5uYW1lID0geG1sQXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5zZXROYW1lXyhuYW1lKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJaWYgKHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpKSB7Ci0JCQkvLyB0ZWxsIG91ciBhdHRyaWJ1dGUgaXRzIG5hbWUgaGFzLCBlZmZlY3RpdmVseSwgY2hhbmdlZAotCQkJdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkubmFtZUNoYW5nZWQob2xkLCBuYW1lKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtb3JwaGluZyBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcoT3JtQXR0cmlidXRlTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXRoaXMuc2V0TmFtZShvbGRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1Db2x1bW5NYXBwaW5nKE9ybUNvbHVtbk1hcHBpbmcgb2xkTWFwcGluZykgewotCQl0aGlzLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUJhc2ljTWFwcGluZyhPcm1CYXNpY01hcHBpbmcgb2xkTWFwcGluZykgewotCQl0aGlzLmluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybUlkTWFwcGluZyhPcm1JZE1hcHBpbmcgb2xkTWFwcGluZykgewotCQl0aGlzLmluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU9ybVRyYW5zaWVudE1hcHBpbmcoT3JtVHJhbnNpZW50TWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tT3JtQmFzZUVtYmVkZGVkTWFwcGluZyhPcm1CYXNlRW1iZWRkZWRNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJdGhpcy5pbml0aWFsaXplRnJvbU9ybUF0dHJpYnV0ZU1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1FbWJlZGRlZE1hcHBpbmcoT3JtRW1iZWRkZWRNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJdGhpcy5pbml0aWFsaXplRnJvbU9ybUJhc2VFbWJlZGRlZE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1FbWJlZGRlZElkTWFwcGluZyhPcm1FbWJlZGRlZElkTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZyb21Pcm1CYXNlRW1iZWRkZWRNYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtVmVyc2lvbk1hcHBpbmcoT3JtVmVyc2lvbk1hcHBpbmcgb2xkTWFwcGluZykgewotCQl0aGlzLmluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUmVsYXRpb25zaGlwTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZyb21Pcm1BdHRyaWJ1dGVNYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZyb21Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyhPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJdGhpcy5pbml0aWFsaXplRnJvbU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb01hbnlNYXBwaW5nKE9ybU9uZVRvTWFueU1hcHBpbmcgb2xkTWFwcGluZykgewotCQl0aGlzLmluaXRpYWxpemVGcm9tT3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKG9sZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tT3JtTWFueVRvT25lTWFwcGluZyhPcm1NYW55VG9PbmVNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJdGhpcy5pbml0aWFsaXplRnJvbU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1PbmVUb09uZU1hcHBpbmcoT3JtT25lVG9PbmVNYXBwaW5nIG9sZE1hcHBpbmcpIHsKLQkJdGhpcy5pbml0aWFsaXplRnJvbU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1NYW55VG9NYW55TWFwcGluZyhPcm1NYW55VG9NYW55TWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUZyb21Pcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFggZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0T3duaW5nVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIHJlc29sdmVQZXJzaXN0ZW50VHlwZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZVBlcnNpc3RlbnRUeXBlKGNsYXNzTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWxhdGlvbnNoaXBPd25lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3duZWRCeShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbDsgYWxzbywgdGhlIHBlcnNpc3RlbnQgYXR0cmlidXRlIGRlbGVnYXRlcwotCQkvLyB0byBoZXJlLCBzbyBkb24ndCBkZWxlZ2F0ZSBiYWNrIHRvIGl0IChvciB3ZSB3aWxsIGdldCBhIHN0YWNrIG92ZXJmbG93KQotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWVUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEdlbmVyYXRvcj4gZ2V0R2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbWJlZGRlZCBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiAodGhpcy5uYW1lICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFN0cmluZz4odGhpcy5uYW1lKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiAoKHRoaXMubmFtZSAhPSBudWxsKSAmJiB0aGlzLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFN0cmluZz4odGhpcy5uYW1lKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuICgodGhpcy5uYW1lICE9IG51bGwpICYmIHRoaXMuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxTdHJpbmc+KHRoaXMubmFtZSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJQ29sdW1uTWFwcGluZyBtYXBwaW5nID0gdGhpcy5yZXNvbHZlQ29sdW1uTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwpID8gbnVsbCA6IG1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbk1hcHBpbmcgcmVzb2x2ZUNvbHVtbk1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gdGhpcy5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuICgobWFwcGluZyAhPSBudWxsKSAmJiBtYXBwaW5nLmlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkpID8gKENvbHVtbk1hcHBpbmcpIG1hcHBpbmcgOiBudWxsOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5yZXNvbHZlUmVsYXRpb25zaGlwTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwpID8gbnVsbCA6IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgcmVzb2x2ZVJlbGF0aW9uc2hpcE1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gdGhpcy5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuICgobWFwcGluZyAhPSBudWxsKSAmJiBtYXBwaW5nLmlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSkgPwotCQkJKFJlbGF0aW9uc2hpcE1hcHBpbmcpIG1hcHBpbmcgOgotCQkJbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoYXR0cmlidXRlTmFtZSwgdGhpcy5uYW1lKSA/IHRoaXMgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxTdHJpbmcsIFN0cmluZz4gYnVpbGRRdWFsaWZpZXJUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nVG9vbHMuUXVhbGlmaWVyVHJhbnNmb3JtZXIodGhpcy5uYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHVucXVhbGlmeShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnVucXVhbGlmeSh0aGlzLm5hbWUsIGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgotCi0JcHVibGljIE1ldGFtb2RlbEZpZWxkIGdldE1ldGFtb2RlbEZpZWxkKCkgewotCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgbmFtZSB3ZSBjYW4ndCBidWlsZCBhIG1ldGFtb2RlbCBmaWVsZC4uLgotCQlTdHJpbmcgbWV0YW1vZGVsRmllbGROYW1lID0gdGhpcy5nZXRNZXRhbW9kZWxGaWVsZE5hbWUoKTsKLQkJcmV0dXJuIChtZXRhbW9kZWxGaWVsZE5hbWUgPT0gbnVsbCkgPyBudWxsIDoKLQkJCQkJbmV3IFNpbXBsZU1ldGFtb2RlbEZpZWxkKAotCQkJCQkJdGhpcy5nZXRNZXRhbW9kZWxGaWVsZE1vZGlmaWVycygpLAotCQkJCQkJdGhpcy5nZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCksCi0JCQkJCQl0aGlzLmdldE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXMoKSwKLQkJCQkJCW1ldGFtb2RlbEZpZWxkTmFtZQotCQkJCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldE1ldGFtb2RlbEZpZWxkTW9kaWZpZXJzKCkgewotCQlyZXR1cm4gU1RBTkRBUkRfTUVUQU1PREVMX0ZJRUxEX01PRElGSUVSUzsKLQl9Ci0KLQkvKioKLQkgKiBtb3N0IG1hcHBpbmdzIGFyZSAic2luZ3VsYXIiCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLlNJTkdVTEFSX0FUVFJJQlVURTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzKCkgewotCQlBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigzKTsKLQkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7Ci0JCXRoaXMuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQkJcmV0dXJuIHR5cGVBcmd1bWVudE5hbWVzOwotCX0KLQotCS8qKgotCSAqIGJ5IGRlZmF1bHQsIHdlIGFkZCBvbmx5IHRoZSBtYXBwaW5nJ3MgYXR0cmlidXRlIHR5cGUgbmFtZTsKLQkgKiBidXQgY29sbGVjdGlvbiByZWxhdGlvbnNoaXAgbWFwcGluZ3Mgd2lsbCBhbHNvIG5lZWQgdG8gYWRkIHRoZSBrZXkgdHlwZQotCSAqIG5hbWUgaWYgdGhlICJjb2xsZWN0aW9uIiBpcyBvZiB0eXBlIGphdmEudXRpbC5NYXAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJdHlwZUFyZ3VtZW50TmFtZXMuYWRkKHRoaXMuZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkpLmdldE1ldGFtb2RlbFR5cGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVBdHRyaWJ1dGUobWVzc2FnZXMpOwotCQl0aGlzLnZhbGlkYXRlTWFwcGluZyhtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JLy9UT0RPIHZhbGlkYXRpb24gbWVzc2FnZSAtIGkgdGhpbmsgbW9yZSBpbmZvIGlzIG5lZWRlZCBpbiB0aGlzIG1lc3NhZ2UuICBpbmNsdWRlIHR5cGUgbWFwcGluZyB0eXBlPwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwcGluZyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoICEgdGhpcy5nZXRUeXBlTWFwcGluZygpLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKHRoaXMuZ2V0S2V5KCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX01BUFBJTkcsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5uYW1lfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUJhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhYWM1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUJhc2VDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlQ29sdW1uOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGNvbHVtbiBvciBqb2luIGNvbHVtbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1CYXNlQ29sdW1uPFggZXh0ZW5kcyBYbWxCYXNlQ29sdW1uLCBPIGV4dGVuZHMgT3JtUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1OYW1lZENvbHVtbjxYLCBPPgotCWltcGxlbWVudHMgT3JtQmFzZUNvbHVtbgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFibGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGU7Ci0KLQkvLyBUT0RPIGRlZmF1bHRzIGZyb20gamF2YSBmb3IgYWxsIG9mIHRoZXNlIHNldHRpbmdzCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVW5pcXVlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTnVsbGFibGU7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRJbnNlcnRhYmxlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkVXBkYXRhYmxlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUJhc2VDb2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPIG93bmVyKSB7Ci0JCXRoaXMocGFyZW50LCBvd25lciwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtQmFzZUNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE8gb3duZXIsIFggeG1sQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIHhtbENvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVW5pcXVlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTnVsbGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gdGhpcy5idWlsZFNwZWNpZmllZEluc2VydGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVbmlxdWVfKHRoaXMuYnVpbGRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0VGFibGUodGhpcy5idWlsZERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUYWJsZSA6IHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRUYWJsZSwgdGFibGUpKSB7Ci0JCQlYIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0YWJsZSk7Ci0JCQl4bWxDb2x1bW4uc2V0VGFibGUodGFibGUpOwotCQkJdGhpcy5yZW1vdmVYbWxDb2x1bW5JZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZV8oU3RyaW5nIHRhYmxlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFRhYmxlOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlID0gdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfUFJPUEVSVFksIG9sZCwgdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRUYWJsZSgpIHsKLQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbigpOwotCQlyZXR1cm4gKHhtbENvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB4bWxDb2x1bW4uZ2V0VGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFRhYmxlOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1bmlxdWUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNVbmlxdWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRVbmlxdWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFVuaXF1ZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0VW5pcXVlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkVW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRVbmlxdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4gdW5pcXVlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFVuaXF1ZSwgdW5pcXVlKSkgewotCQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRVbmlxdWVfKHVuaXF1ZSk7Ci0JCQl4bWxDb2x1bW4uc2V0VW5pcXVlKHVuaXF1ZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENvbHVtbklmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFVuaXF1ZV8oQm9vbGVhbiB1bmlxdWUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFVuaXF1ZTsKLQkJdGhpcy5zcGVjaWZpZWRVbmlxdWUgPSB1bmlxdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVU5JUVVFX1BST1BFUlRZLCBvbGQsIHVuaXF1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRVbmlxdWUoKSB7Ci0JCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuICh4bWxDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogeG1sQ29sdW1uLmdldFVuaXF1ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVuaXF1ZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVU5JUVVFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBudWxsYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTnVsbGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE51bGxhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHROdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZE51bGxhYmxlLCBudWxsYWJsZSkpIHsKLQkJCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW5Gb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGVfKG51bGxhYmxlKTsKLQkJCXhtbENvbHVtbi5zZXROdWxsYWJsZShudWxsYWJsZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENvbHVtbklmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE51bGxhYmxlXyhCb29sZWFuIG51bGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWROdWxsYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IG51bGxhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZLCBvbGQsIG51bGxhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZE51bGxhYmxlKCkgewotCQlYIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uKCk7Ci0JCXJldHVybiAoeG1sQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHhtbENvbHVtbi5nZXROdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE51bGxhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9OVUxMQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zZXJ0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0luc2VydGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlLCBpbnNlcnRhYmxlKSkgewotCQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlXyhpbnNlcnRhYmxlKTsKLQkJCXhtbENvbHVtbi5zZXRJbnNlcnRhYmxlKGluc2VydGFibGUpOwotCQkJdGhpcy5yZW1vdmVYbWxDb2x1bW5JZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlXyhCb29sZWFuIGluc2VydGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZEluc2VydGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZSA9IGluc2VydGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkLCBpbnNlcnRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFNwZWNpZmllZEluc2VydGFibGUoKSB7Ci0JCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuICh4bWxDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogeG1sQ29sdW1uLmdldEluc2VydGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9JTlNFUlRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0VXBkYXRhYmxlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSwgdXBkYXRhYmxlKSkgewotCQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGVfKHVwZGF0YWJsZSk7Ci0JCQl4bWxDb2x1bW4uc2V0VXBkYXRhYmxlKHVwZGF0YWJsZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENvbHVtbklmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFVwZGF0YWJsZV8oQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB1cGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZLCBvbGQsIHVwZGF0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRVcGRhdGFibGUoKSB7Ci0JCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuICh4bWxDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogeG1sQ29sdW1uLmdldFVwZGF0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVVBEQVRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5QmFzZUNvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVW5pcXVlKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGUob2xkQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEluc2VydGFibGUob2xkQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5QmFzZUNvbHVtbiB2aXJ0dWFsQ29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tVmlydHVhbCh2aXJ0dWFsQ29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZSh2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQkvLyBpZ25vcmUgb3RoZXIgc2V0dGluZ3M/Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci50YWJsZU5hbWVJc0ludmFsaWQodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldFhtbENvbHVtblRhYmxlVGV4dFJhbmdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sQ29sdW1uVGFibGVUZXh0UmFuZ2UoKSB7Ci0JCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuICh4bWxDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogeG1sQ29sdW1uLmdldFRhYmxlVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNjQ4MmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2VFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbWJlZGRhYmxlT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sRW1iZWRkZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVtYmVkZGVkIG9yIGVtYmVkZGVkIElEIG1hcHBpbmcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZzxYIGV4dGVuZHMgQWJzdHJhY3RYbWxFbWJlZGRlZD4KLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYPgotCWltcGxlbWVudHMgT3JtQmFzZUVtYmVkZGVkTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBFbWJlZGRhYmxlIHRhcmdldEVtYmVkZGFibGU7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFggeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gdGhpcy5idWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VGFyZ2V0RW1iZWRkYWJsZSh0aGlzLmJ1aWxkVGFyZ2V0RW1iZWRkYWJsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIHRoaXMuYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKTsKLQotCi0JLy8gKioqKioqKioqKiB0YXJnZXQgZW1iZWRkYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRW1iZWRkYWJsZSBnZXRUYXJnZXRFbWJlZGRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRFbWJlZGRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhcmdldEVtYmVkZGFibGUoRW1iZWRkYWJsZSBlbWJlZGRhYmxlKSB7Ci0JCUVtYmVkZGFibGUgb2xkID0gdGhpcy50YXJnZXRFbWJlZGRhYmxlOwotCQl0aGlzLnRhcmdldEVtYmVkZGFibGUgPSBlbWJlZGRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0VNQkVEREFCTEVfUFJPUEVSVFksIG9sZCwgZW1iZWRkYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgYnVpbGRUYXJnZXRFbWJlZGRhYmxlKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gKGphdmFBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogamF2YUF0dHJpYnV0ZS5nZXRFbWJlZGRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVtYmVkZGVkIG1hcHBpbmdzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJdGhpcy5nZXRFbWJlZGRhYmxlT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSA6Ci0JCQkJc3VwZXIuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRFbWJlZGRhYmxlT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFF1YWxpZmllZEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lcyhBdHRyaWJ1dGVNYXBwaW5nVG9vbHMuQUxMX09WRVJSSURBQkxFX0FUVFJJQlVURV9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJdGhpcy5nZXRFbWJlZGRhYmxlT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIDoKLQkJCQlzdXBlci5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlQXNzb2NpYXRpb25NYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFF1YWxpZmllZEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lcyhBdHRyaWJ1dGVNYXBwaW5nVG9vbHMuQUxMX09WRVJSSURBQkxFX0FTU09DSUFUSU9OX01BUFBJTkdfTkFNRVNfVFJBTlNGT1JNRVIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFF1YWxpZmllZEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lcyhUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+PiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBTdHJpbmc+KHRoaXMuZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcyh0cmFuc2Zvcm1lciksIHRoaXMuYnVpbGRRdWFsaWZpZXJUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXNMaXN0cyh0cmFuc2Zvcm1lcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgbGlzdHM7IGVhY2ggbmVzdGVkIGxpc3QgaG9sZHMgdGhlIG5hbWVzIGZvciBvbmUgb2YgdGhlCi0JICogZW1iZWRkZWQgbWFwcGluZydzIHRhcmdldCBlbWJlZGRhYmxlIHR5cGUgbWFwcGluZydzIGF0dHJpYnV0ZSBtYXBwaW5ncwotCSAqIChhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24gbWFwcGluZ3MsIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybWVyKS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8U3RyaW5nPj4gZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lc0xpc3RzKFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+Pih0aGlzLmdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YXJnZXQgZW1iZWRkYWJsZSdzIGF0dHJpYnV0ZSBtYXBwaW5ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKCh0aGlzLnRhcmdldEVtYmVkZGFibGUgIT0gbnVsbCkgJiYgKHRoaXMudGFyZ2V0RW1iZWRkYWJsZSAhPSB0aGlzLmdldFR5cGVNYXBwaW5nKCkpKSA/Ci0JCQkJdGhpcy50YXJnZXRFbWJlZGRhYmxlLmdldEF0dHJpYnV0ZU1hcHBpbmdzKCkgOgotCQkJCUVtcHR5SXRlcmFibGUuPEF0dHJpYnV0ZU1hcHBpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbU9ybUJhc2VFbWJlZGRlZE1hcHBpbmcoT3JtQmFzZUVtYmVkZGVkTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tT3JtQmFzZUVtYmVkZGVkTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5pbml0aWFsaXplRnJvbShvbGRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyB0aGlzLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uXyhhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbl8oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJYXR0cmlidXRlTmFtZSA9IHRoaXMudW5xdWFsaWZ5KGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJLy8gcmVjdXJzZSBpbnRvIHRoZSB0YXJnZXQgZW1iZWRkYWJsZSBpZiBuZWNlc3NhcnkKLQkJcmV0dXJuIChvdmVycmlkZSAhPSBudWxsKSA/IG92ZXJyaWRlLmdldENvbHVtbigpIDogdGhpcy5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbkluVGFyZ2V0RW1iZWRkYWJsZShhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uSW5UYXJnZXRFbWJlZGRhYmxlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiAodGhpcy50YXJnZXRFbWJlZGRhYmxlID09IG51bGwpID8gbnVsbCA6IHRoaXMudGFyZ2V0RW1iZWRkYWJsZS5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWlmICh0aGlzLnZhbGlkYXRlVGFyZ2V0RW1iZWRkYWJsZShtZXNzYWdlcykpIHsKLQkJCXRoaXMudmFsaWRhdGVPdmVycmlkZXMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVGFyZ2V0RW1iZWRkYWJsZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy50YXJnZXRFbWJlZGRhYmxlID09IG51bGwpIHsKLQkJCVN0cmluZyB0YXJnZXRFbWJlZGRhYmxlVHlwZU5hbWUgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRUeXBlTmFtZSgpOwotCQkJLy8gaWYgdGhlIHR5cGUgaXNuJ3QgcmVzb2x2YWJsZSwgdGhlcmUnbGwgYWxyZWFkeSBiZSBhIGphdmEgZXJyb3IKLQkJCWlmICh0YXJnZXRFbWJlZGRhYmxlVHlwZU5hbWUgIT0gbnVsbCkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9OT1RfQU5fRU1CRUREQUJMRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGFyZ2V0RW1iZWRkYWJsZVR5cGVOYW1lfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU92ZXJyaWRlcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciBvd25lciAqKioqKioqKioKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyCi0JCWltcGxlbWVudHMgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIKLQl7Ci0JCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0VGFyZ2V0RW1iZWRkYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpIHsKLQkJCVR5cGVNYXBwaW5nIG92ZXJyaWRkZW5UeXBlTWFwcGluZyA9IHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOwotCQkJcmV0dXJuIChvdmVycmlkZGVuVHlwZU1hcHBpbmcgIT0gbnVsbCkgPyB0aGlzLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXNfKG92ZXJyaWRkZW5UeXBlTWFwcGluZykgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBwcmUtY29uZGl0aW9uOiB0eXBlIG1hcHBpbmcgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+Ci0JCSAqIDxwPgotCQkgKiBOQjogT3ZlcnJpZGRlbiBpbiB7QGxpbmsgR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nLkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXJ9Ci0JCSAqLwotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzXyhUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcpIHsKLQkJCXJldHVybiBvdmVycmlkZGVuVHlwZU1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YU92ZXJyaWRlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0WG1sT3ZlcnJpZGVzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZy50aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4odGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCksIGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIChBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lciBvd25lciwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlLCBjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgRW50aXR5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtQmFzZUVtYmVkZGVkTWFwcGluZy50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNpY01hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQmFzaWNNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYmY1ZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1CYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Mb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk5hbWVkQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLk51bGxPcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBiYXNpYyBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUJhc2ljTWFwcGluZzxYIGV4dGVuZHMgWG1sQmFzaWM+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WD4KLQlpbXBsZW1lbnRzIE9ybUJhc2ljTWFwcGluZwotewotCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGRlZmF1bHRGZXRjaDsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRPcHRpb25hbDsKLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgY29udmVydGVyOyAgLy8gbmV2ZXIgbnVsbAotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9ybUNvbnZlcnRlci5BZGFwdGVyW10gQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkgPSBuZXcgT3JtQ29udmVydGVyLkFkYXB0ZXJbXSB7Ci0JCU9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIuQWRhcHRlci5pbnN0YW5jZSgpLAotCQlPcm1UZW1wb3JhbENvbnZlcnRlci5CYXNpY0FkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJT3JtTG9iQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKQotCX07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gQ09OVkVSVEVSX0FEQVBURVJTID0gbmV3IEFycmF5SXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+KENPTlZFUlRFUl9BREFQVEVSX0FSUkFZKTsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtQmFzaWNNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5jb2x1bW4gPSB0aGlzLmJ1aWxkQ29sdW1uKCk7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRmV0Y2goKTsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRPcHRpb25hbCgpOwotCQl0aGlzLmNvbnZlcnRlciA9IHRoaXMuYnVpbGRDb252ZXJ0ZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZEZldGNoXyh0aGlzLmJ1aWxkU3BlY2lmaWVkRmV0Y2goKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKHRoaXMuYnVpbGRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJdGhpcy5zeW5jQ29udmVydGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdEZldGNoKHRoaXMuYnVpbGREZWZhdWx0RmV0Y2goKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE9wdGlvbmFsKHRoaXMuYnVpbGREZWZhdWx0T3B0aW9uYWwoKSk7Ci0JCXRoaXMuY29udmVydGVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29sdW1uIGJ1aWxkQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEZldGNoICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRGZXRjaCA6IHRoaXMuZGVmYXVsdEZldGNoOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQl0aGlzLnNldFNwZWNpZmllZEZldGNoXyhmZXRjaCk7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRGZXRjaChGZXRjaFR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKGZldGNoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkU3BlY2lmaWVkRmV0Y2goKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JCXRoaXMuZGVmYXVsdEZldGNoID0gZmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkRGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcHRpb25hbCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE9wdGlvbmFsLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRPcHRpb25hbCgpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKG9wdGlvbmFsKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE9wdGlvbmFsKG9wdGlvbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRPcHRpb25hbF8oQm9vbGVhbiBvcHRpb25hbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3B0aW9uYWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRPcHRpb25hbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9wdGlvbmFsKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0T3B0aW9uYWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE9wdGlvbmFsKGJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRPcHRpb25hbDsKLQkJdGhpcy5kZWZhdWx0T3B0aW9uYWwgPSBvcHRpb25hbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgb3B0aW9uYWwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdE9wdGlvbmFsKCkgewotCQlyZXR1cm4gREVGQVVMVF9PUFRJT05BTDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Db252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkvLyBub3RlOiB3ZSBtYXkgYWxzbyBjbGVhciB0aGUgWE1MIHZhbHVlIHdlIHdhbnQ7Ci0JCQkvLyBidXQgaWYgd2UgbGVhdmUgaXQsIHRoZSByZXN1bHRpbmcgc3luYyB3aWxsIHNjcmV3IHRoaW5ncyB1cC4uLgotCQkJdGhpcy5jbGVhclhtbENvbnZlcnRlclZhbHVlcygpOwotCQkJT3JtQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlciA9IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkQ29udmVydGVyKGNvbnZlcnRlckFkYXB0ZXIpKTsKLQkJCXRoaXMuY29udmVydGVyLmluaXRpYWxpemUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoT3JtQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlcikgewotCQkgcmV0dXJuIChjb252ZXJ0ZXJBZGFwdGVyICE9IG51bGwpID8KLQkJCQljb252ZXJ0ZXJBZGFwdGVyLmJ1aWxkTmV3Q29udmVydGVyKHRoaXMsIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkpIDoKLQkJCQl0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcl8oT3JtQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlDb252ZXJ0ZXIgb2xkID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJYbWxDb252ZXJ0ZXJWYWx1ZXMoKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJYWRhcHRlci5jbGVhclhtbFZhbHVlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKCkgewotCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSA9IHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJT3JtQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IGFkYXB0ZXIuYnVpbGRDb252ZXJ0ZXIodGhpcywgZmFjdG9yeSk7Ci0JCQlpZiAob3JtQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gb3JtQ29udmVydGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDb252ZXJ0ZXIoKSB7Ci0JCU9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmdldFhtbENvbnZlcnRlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGROdWxsQ29udmVydGVyKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSA9PSBhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSkgewotCQkJCXRoaXMuY29udmVydGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKGFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBhZGFwdGVyIHdob3NlIGNvbnZlcnRlciB2YWx1ZSBpcyBzZXQgaW4gdGhlIFhNTCBtYXBwaW5nLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY29udmVydGVyIHZhbHVlcyBpbiB0aGUgWE1MLgotCSAqLwotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIuQWRhcHRlciBnZXRYbWxDb252ZXJ0ZXJBZGFwdGVyKCkgewotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmlzQWN0aXZlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZykpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkTnVsbENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsT3JtQ29udmVydGVyKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyLkFkYXB0ZXIgZ2V0Q29udmVydGVyQWRhcHRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gQ09OVkVSVEVSX0FEQVBURVJTOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybUJhc2ljTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcoT3JtQ29sdW1uTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDIwOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8oQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCXhtbEF0dHJpYnV0ZXMuZ2V0QmFzaWNzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCXhtbEF0dHJpYnV0ZXMuZ2V0QmFzaWNzKCkucmVtb3ZlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9ybUNvbHVtbi5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0JfQotCi0JcHVibGljIFhtbENvbHVtbiBnZXRYbWxDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JfQotCi0JcHVibGljIFhtbENvbHVtbiBidWlsZFhtbENvbHVtbigpIHsKLQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpOwotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0Q29sdW1uKHhtbENvbHVtbik7Ci0JCXJldHVybiB4bWxDb2x1bW47Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQ29sdW1uKCkgewotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0Q29sdW1uKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5jb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0JCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbCwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gbmV3IE5hbWVkQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlCYXNlQ29sdW1uKSBjb2wsIChUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRW1iZWRkYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjc5N2I5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtRW1iZWRkYWJsZTxYIGV4dGVuZHMgWG1sRW1iZWRkYWJsZT4KLQlleHRlbmRzIEFic3RyYWN0T3JtVHlwZU1hcHBpbmc8WD4KLQlpbXBsZW1lbnRzIE9ybUVtYmVkZGFibGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FbWJlZGRhYmxlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBrZXkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkIGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4gZ2V0QXNzb2NpYXRlZFRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4gZ2V0QWxsQXNzb2NpYXRlZFRhYmxlcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFbWJlZGRhYmxlIGdldEphdmFUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhRW1iZWRkYWJsZSkgc3VwZXIuZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFbWJlZGRhYmxlIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gKEphdmFFbWJlZGRhYmxlKSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbnRpdHkgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDI7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkWG1sVHlwZU1hcHBpbmdUbyhYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQllbnRpdHlNYXBwaW5ncy5nZXRFbWJlZGRhYmxlcygpLmFkZCh0aGlzLnhtbFR5cGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxUeXBlTWFwcGluZ0Zyb20oWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZW50aXR5TWFwcGluZ3MuZ2V0RW1iZWRkYWJsZXMoKS5yZW1vdmUodGhpcy54bWxUeXBlTWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRRdWVyaWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdhNWJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNvbXBvc2l0ZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbi5TdXBwb3J0ZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5U2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5CYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRDb250YWluZXJUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5FbnRpdHlUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlR5cGVNYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkRpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkdlbmVyaWNFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuSm9pblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzc092ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LlNlY29uZGFyeVRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuVGFibGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZW50aXR5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVudGl0eTxYIGV4dGVuZHMgWG1sRW50aXR5PgotCWV4dGVuZHMgQWJzdHJhY3RPcm1UeXBlTWFwcGluZzxYPgotCWltcGxlbWVudHMgT3JtRW50aXR5LCBPcm1DYWNoZWFibGVIb2xkZXIyXzAsIE9ybUlkQ2xhc3NSZWZlcmVuY2UuT3duZXIKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TmFtZTsKLQotCXByb3RlY3RlZCBFbnRpdHkgcm9vdEVudGl0eTsKLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPEVudGl0eT4gZGVzY2VuZGFudHMgPSBuZXcgVmVjdG9yPEVudGl0eT4oKTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1JZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWZlcmVuY2U7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtVGFibGUgdGFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVJc1VuZGVmaW5lZDsKLQotCXByb3RlY3RlZCBmaW5hbCBSZWFkT25seVRhYmxlLk93bmVyIHNlY29uZGFyeVRhYmxlT3duZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVNlY29uZGFyeVRhYmxlLCBYbWxTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSwgSmF2YVNlY29uZGFyeVRhYmxlPiB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lciBwcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyOwotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotCi0JLy8gdGhpcyBpcyB0aGUgZGVmYXVsdCBpZiB0aGVyZSBhcmUgSmF2YSBjb2x1bW5zCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4+IHZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgVmVjdG9yPE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oKTsKLQlwcm90ZWN0ZWQgZmluYWwgVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyQWRhcHRlciB2aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXJBZGFwdGVyID0gbmV3IFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lckFkYXB0ZXIoKTsKLQotCS8vIHRoaXMgaXMgdGhlIGRlZmF1bHQgaWYgdGhlcmUgYXJlICpubyogSmF2YSBjb2x1bW5zCi0JcHJvdGVjdGVkIFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBzcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3k7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkOwotCXByb3RlY3RlZCBib29sZWFuIGRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4gZGlzY3JpbWluYXRvckNvbHVtbjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkOwotCXByb3RlY3RlZCBib29sZWFuIGRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZDsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUdlbmVyYXRvckNvbnRhaW5lciBnZW5lcmF0b3JDb250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybVF1ZXJ5Q29udGFpbmVyIHF1ZXJ5Q29udGFpbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1FbnRpdHkoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYIHhtbEVudGl0eSkgewotCQlzdXBlcihwYXJlbnQsIHhtbEVudGl0eSk7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IHhtbEVudGl0eS5nZXROYW1lKCk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZSA9IHRoaXMuYnVpbGRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoKTsKLQkJdGhpcy5zZWNvbmRhcnlUYWJsZU93bmVyID0gdGhpcy5idWlsZFNlY29uZGFyeVRhYmxlT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lcigpOwotCQl0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXIoKTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyID0gdGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQl0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCQl0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSA9IHhtbEVudGl0eS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uID0gdGhpcy5idWlsZERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJLy8gc3RhcnQgd2l0aCB0aGUgZW50aXR5IGFzIHRoZSByb290IC0gaXQgd2lsbCBiZSByZWNhbGN1bGF0ZWQgaW4gdXBkYXRlKCkKLQkJdGhpcy5yb290RW50aXR5ID0gdGhpczsKLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lciA9IHRoaXMuYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKTsKLQkJdGhpcy5xdWVyeUNvbnRhaW5lciA9IHRoaXMuYnVpbGRRdWVyeUNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZV8odGhpcy54bWxUeXBlTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJdGhpcy50YWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJdGhpcy5zeW5jU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0KLQkJdGhpcy5zeW5jU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5Xyh0aGlzLmJ1aWxkU3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVfKHRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCi0JCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCi0JCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5xdWVyeUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpKTsKLQotCQkvLyBjYWxjdWxhdGUgcm9vdCBlbnRpdHkgZWFybHkgLSBvdGhlciB0aGluZ3MgZGVwZW5kIG9uIGl0Ci0JCXRoaXMuc2V0Um9vdEVudGl0eSh0aGlzLmJ1aWxkUm9vdEVudGl0eSgpKTsKLQkJdGhpcy51cGRhdGVEZXNjZW5kYW50cygpOwotCi0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS51cGRhdGUoKTsKLQotCQl0aGlzLnRhYmxlLnVwZGF0ZSgpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpKTsKLQkJdGhpcy5zZXRUYWJsZUlzVW5kZWZpbmVkKHRoaXMuYnVpbGRUYWJsZUlzVW5kZWZpbmVkKCkpOwotCi0JCXRoaXMudXBkYXRlVmlydHVhbFNlY29uZGFyeVRhYmxlcygpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0U2Vjb25kYXJ5VGFibGVzKCkpOwotCi0JCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCi0JCXRoaXMuc2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3kodGhpcy5idWlsZERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCi0JCXRoaXMuc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSh0aGlzLmJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpKTsKLQkJdGhpcy5zZXREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCh0aGlzLmJ1aWxkRGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0KLQkJdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uLnVwZGF0ZSgpOwotCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQodGhpcy5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0JCXRoaXMuc2V0RGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKHRoaXMuYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQoKSk7Ci0KLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnVwZGF0ZSgpOwotCQl0aGlzLnF1ZXJ5Q29udGFpbmVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE5hbWUgOiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTmFtZV8obmFtZSk7Ci0JCXRoaXMueG1sVHlwZU1hcHBpbmcuc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlpZiAoamF2YUVudGl0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF2YUVudGl0eS5nZXROYW1lKCk7Ci0JCX0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IHRoaXMuZ2V0Q2xhc3NfKCk7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGNsYXNzTmFtZSkgPyBudWxsIDogQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoY2xhc3NOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm9vdCBlbnRpdHkgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eSBnZXRSb290RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5yb290RW50aXR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJvb3RFbnRpdHkoRW50aXR5IGVudGl0eSkgewotCQlFbnRpdHkgb2xkID0gdGhpcy5yb290RW50aXR5OwotCQl0aGlzLnJvb3RFbnRpdHkgPSBlbnRpdHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChST09UX0VOVElUWV9QUk9QRVJUWSwgb2xkLCBlbnRpdHkpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHkgYnVpbGRSb290RW50aXR5KCkgewotCQlFbnRpdHkgcmVzdWx0ID0gdGhpczsKLQkJZm9yIChUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA6IHRoaXMuZ2V0QW5jZXN0b3JzKCkpIHsKLQkJCWlmICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCXJlc3VsdCA9IChFbnRpdHkpIHR5cGVNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlc2NlbmRhbnRzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxFbnRpdHk+IGdldERlc2NlbmRhbnRzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxFbnRpdHk+KHRoaXMuZGVzY2VuZGFudHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlc2NlbmRhbnRzKCkgewotCQl0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbih0aGlzLmJ1aWxkRGVzY2VuZGFudHMoKSwgdGhpcy5kZXNjZW5kYW50cywgREVTQ0VOREFOVFNfQ09MTEVDVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEVudGl0eT4gYnVpbGREZXNjZW5kYW50cygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxFbnRpdHk+KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXRpZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoRW50aXR5IGVudGl0eSkgewotCQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmVudGl0eUlzRGVzY2VuZGFudChlbnRpdHkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHNwZWNpZmllZCBlbnRpdHkgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBlbnRpdHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gZW50aXR5SXNEZXNjZW5kYW50KEVudGl0eSBlbnRpdHkpIHsKLQkJU3RyaW5nIHR5cGVOYW1lID0gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGVudGl0eVR5cGVOYW1lID0gZW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcm9vdEVudGl0eVR5cGVOYW1lID0gZW50aXR5LmdldFJvb3RFbnRpdHkoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKTsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0eXBlTmFtZSwgZW50aXR5VHlwZU5hbWUpICYmCi0JCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodHlwZU5hbWUsIHJvb3RFbnRpdHlUeXBlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGlkIGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1JZENsYXNzUmVmZXJlbmNlIGdldElkQ2xhc3NSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3NSZWZlcmVuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUlkQ2xhc3NSZWZlcmVuY2UgYnVpbGRJZENsYXNzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1JZENsYXNzUmVmZXJlbmNlKHRoaXMsIHRoaXMpOwotCX0KLQotCXB1YmxpYyBYbWxJZENsYXNzQ29udGFpbmVyIGdldFhtbElkQ2xhc3NDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEphdmFJZENsYXNzUmVmZXJlbmNlIGdldEphdmFJZENsYXNzUmVmZXJlbmNlRm9yRGVmYXVsdHMoKSB7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IHRoaXMuZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQkJcmV0dXJuIChqYXZhRW50aXR5ID09IG51bGwpID8gbnVsbCA6IGphdmFFbnRpdHkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzc1JlZmVyZW5jZS5nZXRJZENsYXNzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1UYWJsZSBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVRhYmxlIGJ1aWxkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVGFibGUodGhpcywgdGhpcy5idWlsZFRhYmxlT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlLk93bmVyIGJ1aWxkVGFibGVPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZU93bmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlSXNBbGxvd2VkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhYmxlSXNBbGxvd2VkKGJvb2xlYW4gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFRhYmxlSXNBbGxvd2VkOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlSXNBbGxvd2VkID0gc3BlY2lmaWVkVGFibGVJc0FsbG93ZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVEFCTEVfSVNfQUxMT1dFRF9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRTcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpICYmICEgdGhpcy5pc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlSXNVbmRlZmluZWQoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlSXNVbmRlZmluZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVJc1VuZGVmaW5lZChib29sZWFuIHRhYmxlSXNVbmRlZmluZWQpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnRhYmxlSXNVbmRlZmluZWQ7Ci0JCXRoaXMudGFibGVJc1VuZGVmaW5lZCA9IHRhYmxlSXNVbmRlZmluZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9JU19VTkRFRklORURfUFJPUEVSVFksIG9sZCwgdGFibGVJc1VuZGVmaW5lZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRUYWJsZUlzVW5kZWZpbmVkKCkgewotCQlyZXR1cm4gdGhpcy5pc0Fic3RyYWN0VGFibGVQZXJDbGFzcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlpZiAoamF2YUVudGl0eSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgamF2YU5hbWUgPSBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJaWYgKChqYXZhTmFtZSAhPSBudWxsKSAmJiAhIHRoaXMudGFibGUuaXNTcGVjaWZpZWRJblJlc291cmNlKCkpIHsKLQkJCQlyZXR1cm4gamF2YU5hbWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaXNTaW5nbGVUYWJsZURlc2NlbmRhbnQoKSA/Ci0JCQkJdGhpcy5yb290RW50aXR5LmdldFRhYmxlKCkuZ2V0TmFtZSgpIDoKLQkJCQl0aGlzLmlzQWJzdHJhY3RUYWJsZVBlckNsYXNzKCkgPwotCQkJCQkJbnVsbCA6Ci0JCQkJCQl0aGlzLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IHRoaXMuZ2V0SmF2YVR5cGVNYXBwaW5nRm9yRGVmYXVsdHMoKTsKLQkJaWYgKGphdmFFbnRpdHkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGphdmFTY2hlbWEgPSBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQlpZiAoKGphdmFTY2hlbWEgIT0gbnVsbCkgJiYgISB0aGlzLnRhYmxlLmlzU3BlY2lmaWVkSW5SZXNvdXJjZSgpKSB7Ci0JCQkJcmV0dXJuIGphdmFTY2hlbWE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaXNTaW5nbGVUYWJsZURlc2NlbmRhbnQoKSA/Ci0JCQkJdGhpcy5yb290RW50aXR5LmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkgOgotCQkJCXRoaXMuaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSA/Ci0JCQkJCQludWxsIDoKLQkJCQkJCXRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCWlmIChqYXZhRW50aXR5ICE9IG51bGwpIHsKLQkJCVN0cmluZyBqYXZhQ2F0YWxvZyA9IGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQlpZiAoKGphdmFDYXRhbG9nICE9IG51bGwpICYmICEgdGhpcy50YWJsZS5pc1NwZWNpZmllZEluUmVzb3VyY2UoKSkgewotCQkJCXJldHVybiBqYXZhQ2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5pc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpID8KLQkJCQl0aGlzLnJvb3RFbnRpdHkuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkgOgotCQkJCXRoaXMuaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSA/Ci0JCQkJCQludWxsIDoKLQkJCQkJCXRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBUYWJsZU93bmVyCi0JCWltcGxlbWVudHMgUmVhZE9ubHlUYWJsZS5Pd25lcgotCXsKLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgVGFibGVWYWxpZGF0b3IodGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZWNvbmRhcnkgdGFibGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4gZ2V0U2Vjb25kYXJ5VGFibGVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkgPT0gMCA/Ci0JCQl0aGlzLmdldFJlYWRPbmx5VmlydHVhbFNlY29uZGFyeVRhYmxlcygpIDoKLQkJCXRoaXMuZ2V0UmVhZE9ubHlTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNlY29uZGFyeVRhYmxlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSA9PSAwID8KLQkJCXRoaXMuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSA6Ci0JCQkJdGhpcy5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtU2Vjb25kYXJ5VGFibGU+IGdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVNlY29uZGFyeVRhYmxlPiBnZXRSZWFkT25seVNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4odGhpcy5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybVNlY29uZGFyeVRhYmxlIGFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSh0aGlzLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JfQotCi0JLyoqCi0JICogbm8gc3RhdGUgY2hlY2sKLQkgKi8KLQlwcm90ZWN0ZWQgT3JtU2Vjb25kYXJ5VGFibGUgYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVfKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZV8odGhpcy5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgI3NldFNlY29uZGFyeVRhYmxlc0FyZURlZmluZWRJblhtbChib29sZWFuKQotCSAqLwotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgaW5kZXgpIHsKLQkJaWYgKCAhIHRoaXMuc2Vjb25kYXJ5VGFibGVzQXJlRGVmaW5lZEluWG1sKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInZpcnR1YWwgc2Vjb25kYXJ5IHRhYmxlcyBleGlzdCAtIGNhbGwgT3JtRW50aXR5LnNldFNlY29uZGFyeVRhYmxlc0FyZURlZmluZWRJblhtbCh0cnVlKSBmaXJzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVfKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBubyBzdGF0ZSBjaGVjawotCSAqLwotCXByb3RlY3RlZCBPcm1TZWNvbmRhcnlUYWJsZSBhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZV8oaW50IGluZGV4KSB7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlID0gdGhpcy5idWlsZFhtbFNlY29uZGFyeVRhYmxlKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gdGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sU2Vjb25kYXJ5VGFibGUpOwotCQl0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChpbmRleCwgeG1sU2Vjb25kYXJ5VGFibGUpOwotCQlyZXR1cm4gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFNlY29uZGFyeVRhYmxlIGJ1aWxkWG1sU2Vjb25kYXJ5VGFibGUoKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUodGhpcy5zcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKE9ybVNlY29uZGFyeVRhYmxlKSBzZWNvbmRhcnlUYWJsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKGludCBpbmRleCkgewotCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy54bWxUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFNlY29uZGFyeVRhYmxlcygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtU2Vjb25kYXJ5VGFibGUgYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZShYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVNlY29uZGFyeVRhYmxlKHRoaXMsIHRoaXMuc2Vjb25kYXJ5VGFibGVPd25lciwgeG1sU2Vjb25kYXJ5VGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkgewotCQl0aGlzLnNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyLmNsZWFyQ29udGV4dExpc3QoKTsKLQkJdGhpcy54bWxUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKS5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sU2Vjb25kYXJ5VGFibGU+IGdldFhtbFNlY29uZGFyeVRhYmxlcygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxTZWNvbmRhcnlUYWJsZT4odGhpcy54bWxUeXBlTWFwcGluZy5nZXRTZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVNlY29uZGFyeVRhYmxlLCBYbWxTZWNvbmRhcnlUYWJsZT4gYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZFNlY29uZGFyeVRhYmxlQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZSBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1TZWNvbmRhcnlUYWJsZSwgWG1sU2Vjb25kYXJ5VGFibGU+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX1NFQ09OREFSWV9UQUJMRVNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybVNlY29uZGFyeVRhYmxlIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sU2Vjb25kYXJ5VGFibGUgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5idWlsZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sU2Vjb25kYXJ5VGFibGU+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRYbWxTZWNvbmRhcnlUYWJsZXMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbFNlY29uZGFyeVRhYmxlIGdldFJlc291cmNlRWxlbWVudChPcm1TZWNvbmRhcnlUYWJsZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbFRhYmxlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVmlydHVhbFNlY29uZGFyeVRhYmxlPiBnZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVNlY29uZGFyeVRhYmxlPiBnZXRSZWFkT25seVZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+KHRoaXMuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlcygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyVmlydHVhbFNlY29uZGFyeVRhYmxlcygpIHsKLQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXIuY2xlYXJDb250ZXh0TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWVkIHNlY29uZGFyeSB0YWJsZXMsIHRoZW4gdGhlcmUgYXJlIG5vIHZpcnR1YWwKLQkgKiBzZWNvbmRhcnkgdGFibGVzLgotCSAqIElmIHRoZXJlIGFyZSBKYXZhIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGVzLCB0aGVuIHRob3NlIGFyZSB0aGUgdmlydHVhbAotCSAqIHNlY29uZGFyeSB0YWJsZXMuCi0JICogQHNlZSAjZ2V0SmF2YVNlY29uZGFyeVRhYmxlc0ZvclZpcnR1YWxzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkgewotCQl0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZUNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFTZWNvbmRhcnlUYWJsZT4gZ2V0SmF2YVNlY29uZGFyeVRhYmxlc0ZvclZpcnR1YWxzKCkgewotCQlpZiAodGhpcy5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YUVudGl0eSA9PSBudWxsKSA/Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPEphdmFTZWNvbmRhcnlUYWJsZT5pbnN0YW5jZSgpIDoKLQkJCQlqYXZhRW50aXR5LmdldFNlY29uZGFyeVRhYmxlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVWaXJ0dWFsU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4LCBPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KGluZGV4LCBzZWNvbmRhcnlUYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSBhZGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGUoaW50IGluZGV4LCBKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLnZpcnR1YWxTZWNvbmRhcnlUYWJsZUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgamF2YVNlY29uZGFyeVRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlIGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlKEphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUodGhpcywgdGhpcy5zZWNvbmRhcnlUYWJsZU93bmVyLCBqYXZhU2Vjb25kYXJ5VGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVZpcnR1YWxTZWNvbmRhcnlUYWJsZShPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJdGhpcy52aXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoc2Vjb25kYXJ5VGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUsIEphdmFTZWNvbmRhcnlUYWJsZT4gYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbFNlY29uZGFyeVRhYmxlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogdmlydHVhbCBzZWNvbmRhcnkgdGFibGUgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFZpcnR1YWxTZWNvbmRhcnlUYWJsZUNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSwgSmF2YVNlY29uZGFyeVRhYmxlPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlIGJ1aWxkQ29udGV4dEVsZW1lbnQoSmF2YVNlY29uZGFyeVRhYmxlIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGUocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXZhU2Vjb25kYXJ5VGFibGU+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRKYXZhU2Vjb25kYXJ5VGFibGVzRm9yVmlydHVhbHMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFTZWNvbmRhcnlUYWJsZSBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlblRhYmxlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2Vjb25kYXJ5IHRhYmxlIHRyYW5zaXRpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIElmIHRoZSBsaXN0IG9mIHZpcnR1YWwgc2Vjb25kYXJ5IHRhYmxlcyBpcyBlbXB0eSwgdGhlbiBlaXRoZXIgdGhlCi0JICogc2Vjb25kYXJ5IHRhYmxlcyBhcmUgZGVmaW5lZCBpbiBYTUwgb3IgdGhlcmUgYXJlIG5vIHNlY29uZGFyeSB0YWJsZXMgYXQKLQkgKiBhbGwgKGltcGx5aW5nIHRoZXkgYXJlIGRlZmluZWQgaW4gWE1MKS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwoYm9vbGVhbiBkZWZpbmVJblhtbCkgewotCQlpZiAoZGVmaW5lSW5YbWwgIT0gdGhpcy5zZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwoKSkgewotCQkJdGhpcy5zZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWxfKGRlZmluZUluWG1sKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNlY29uZGFyeVRhYmxlc0FyZURlZmluZWRJblhtbF8oYm9vbGVhbiBkZWZpbmVJblhtbCkgewotCQlpZiAoZGVmaW5lSW5YbWwpIHsKLQkJCXRoaXMuc3BlY2lmeVNlY29uZGFyeVRhYmxlc0luWG1sKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnJlbW92ZVNlY29uZGFyeVRhYmxlc0Zyb21YbWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB0byB0YWtlIGFsbCB0aGUgSmF2YSBzZWNvbmRhcnkgdGFibGVzIGFuZCBzcGVjaWZ5IHRoZW0gaW4KLQkgKiB0aGUgWE1MLiBZb3UgbXVzdCB1c2Uge0BsaW5rICNzZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwoYm9vbGVhbil9Ci0JICogYmVmb3JlIGNhbGxpbmcge0BsaW5rICNhZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpfS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzcGVjaWZ5U2Vjb25kYXJ5VGFibGVzSW5YbWwoKSB7Ci0JCWZvciAoT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlIG9sZFZpcnR1YWxTZWNvbmRhcnlUYWJsZSA6IGdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZV8oKS5pbml0aWFsaXplRnJvbShvbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGUpOwotCQl9Ci0JCS8vIHRoZSB2aXJ0dWFsIHNlY29uZGFyeSB0YWJsZXMgd2lsbCBiZSBjbGVhcmVkIGR1cmluZyB0aGUgdXBkYXRlCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU2Vjb25kYXJ5VGFibGVzRnJvbVhtbCgpIHsKLQkJdGhpcy5jbGVhclNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpOwotCQkvLyB0aGUgdmlydHVhbCBzZWNvbmRhcnkgdGFibGVzIHdpbGwgYmUgYnVpbHQgZHVyaW5nIHRoZSB1cGRhdGUKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGUuT3duZXIgYnVpbGRTZWNvbmRhcnlUYWJsZU93bmVyKCkgewotCQlyZXR1cm4gbmV3IFNlY29uZGFyeVRhYmxlT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFNlY29uZGFyeVRhYmxlT3duZXIKLQkJaW1wbGVtZW50cyBSZWFkT25seVRhYmxlLk93bmVyCi0JewotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlUYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZVZhbGlkYXRvcigoUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSkgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA9PSAwID8KLQkJCQl0aGlzLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA6Ci0JCQkJdGhpcy5nZXRSZWFkT25seVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID09IDAgPwotCQkJCXRoaXMuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA6Ci0JCQkJdGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4geG1sUGtKb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyLCB4bWxQa0pvaW5Db2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRSZWFkT25seVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLmNsZWFyRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOyAvLyBjb3VsZCBsZWF2ZSBmb3IgdXBkYXRlPwotCi0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFBrSm9pbkNvbHVtbiA9IHRoaXMuYnVpbGRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxQa0pvaW5Db2x1bW4pOwotCQl0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChpbmRleCwgeG1sUGtKb2luQ29sdW1uKTsKLQkJcmV0dXJuIHBrSm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCgoT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4pIHByaW1hcnlLZXlKb2luQ29sdW1uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4sIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCkgewotCQlTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4sIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGdldFJlc291cmNlRWxlbWVudChPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbENvbHVtbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJaW50IHZpcnR1YWxTaXplID0gdGhpcy52aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKLQkJcmV0dXJuICh2aXJ0dWFsU2l6ZSAhPSAwKSA/Ci0JCQkJdGhpcy5nZXRSZWFkT25seVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA6Ci0JCQkJdGhpcy5nZXRSZWFkT25seURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlpbnQgdmlydHVhbFNpemUgPSB0aGlzLnZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMuc2l6ZSgpOwotCQlyZXR1cm4gKHZpcnR1YWxTaXplICE9IDApID8KLQkJCQl2aXJ0dWFsU2l6ZSA6Ci0JCQkJKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpID8gMSA6IDA7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyAoYmxpbmRseSkgY2FsbGVkIHdoZW5ldmVyIGEgc3BlY2lmaWVkIHBrIGpvaW4gY29sdW1uIGlzIGFkZGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJaW50IHZpcnR1YWxTaXplID0gdGhpcy52aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKTsKLQkJaWYgKHZpcnR1YWxTaXplICE9IDApIHsKLQkJCXRoaXMuY2xlYXJWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCXRoaXMucmVtb3ZlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIG5vdGhpbmcgdG8gY2xlYXIKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIElmIHRoZXJlIGFyZSBhbnkgc3BlY2lmaWVkIHBrIGpvaW4gY29sdW1ucywgdGhlbiB0aGVyZSBhcmUgbm8gZGVmYXVsdAotCSAqIHBrIGpvaW4gY29sdW1ucy4KLQkgKiBJZiB0aGVyZSBhcmUgSmF2YSBzcGVjaWZpZWQgcGsgam9pbiBjb2x1bW5zLCB0aGVuIHRob3NlIGFyZSB0aGUgZGVmYXVsdAotCSAqIHBrIGpvaW4gY29sdW1ucy4KLQkgKiBPdGhlcndpc2UsIHRoZXJlIGlzIGEgc2luZ2xlLCBzcGVjLWRlZmluZWQsIGRlZmF1bHQgcGsgam9pbiBjb2x1bW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID4gMCkgewotCQkJLy8gc3BlY2lmaWVkL2phdmEvZGVmYXVsdCA9PiBzcGVjaWZpZWQKLQkJCXRoaXMuY2xlYXJEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzcGVjaWZpZWQKLQkJCWlmICh0aGlzLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgewotCQkJCWlmICh0aGlzLmphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNXaWxsQmVEZWZhdWx0cygpKSB7Ci0JCQkJCS8vIHNwZWNpZmllZCA9PiBqYXZhCi0JCQkJCXRoaXMuaW5pdGlhbGl6ZVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBzcGVjaWZpZWQgPT4gZGVmYXVsdAotCQkJCQl0aGlzLmFkZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZGVmYXVsdAotCQkJCWlmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJCWlmICh0aGlzLmphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNXaWxsQmVEZWZhdWx0cygpKSB7Ci0JCQkJCQkvLyBkZWZhdWx0ID0+IGphdmEKLQkJCQkJCXRoaXMucmVtb3ZlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQkJCQl0aGlzLmluaXRpYWxpemVWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyBkZWZhdWx0ID0+IGRlZmF1bHQgKG5vIGNoYW5nZSkKLQkJCQkJfQotCQkJCS8vIGphdmEKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAodGhpcy5qYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zV2lsbEJlRGVmYXVsdHMoKSkgewotCQkJCQkJLy8gamF2YSA9PiBqYXZhICgibm9ybWFsIiB1cGRhdGUpCi0JCQkJCQl0aGlzLnVwZGF0ZVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGphdmEgPT4gZGVmYXVsdAotCQkJCQkJdGhpcy5jbGVhclZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJCQkJCXRoaXMuYWRkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlDb250ZXh0Q29udGFpbmVyVG9vbHMudXBkYXRlKHRoaXMudmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgd2UgaGF2ZSBKYXZhIHBrIGpvaW4gY29sdW1ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBwb3B1bGF0ZQotCSAqIG91ciB2aXJ0dWFsIHBrIGpvaW4gY29sdW1uIGNvbGxlY3Rpb24uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gamF2YVByaW1hcnlLZXlKb2luQ29sdW1uc1dpbGxCZURlZmF1bHRzKCkgewotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YUVudGl0eSAhPSBudWxsKSAmJiAoamF2YUVudGl0eS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmlydHVhbCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy52aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFJlYWRPbmx5VmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy52aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVBrSm9pbkNvbHVtbiA6IHRoaXMuZ2V0SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0ZvclZpcnR1YWxzKCkpIHsKLQkJCXRoaXMuYWRkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuYnVpbGRWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oamF2YVBrSm9pbkNvbHVtbikpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4pIHsKLQkJdGhpcy5hZGRWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy52aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zLnNpemUoKSwgcGtKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgcGtKb2luQ29sdW1uLCB0aGlzLnZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMsIERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5jbGVhckxpc3QodGhpcy52aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgSmF2YSBwayBqb2luIGNvbHVtbnMgdG8gcmV0dXJuLgotCSAqIEBzZWUgI2phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNXaWxsQmVEZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0ZvclZpcnR1YWxzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uKSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIHBrSm9pbkNvbHVtbiwgdGhpcy52aXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zLCBERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IHRoaXMuYnVpbGRWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oamF2YVByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQkJdGhpcy5hZGRWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgsIHBrSm9pbkNvbHVtbik7Ci0JCXJldHVybiBwa0pvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVByaW1hcnlLZXlKb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lciwgamF2YVByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChwa0pvaW5Db2x1bW4sIHRoaXMudmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1ucywgREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCk7Ci0JfQotCi0JLyoqCi0JICogdmlydHVhbCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjb250YWluZXIgYWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgQ29udGV4dENvbnRhaW5lclRvb2xzLkFkYXB0ZXI8T3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uLCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8T3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRWaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmdldEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNGb3JWaXJ0dWFscygpOwotCQl9Ci0JCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldE92ZXJyaWRkZW5Db2x1bW4oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gZWxlbWVudCkgewotCQkJQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5tb3ZlVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCUFic3RyYWN0T3JtRW50aXR5LnRoaXMuYWRkVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4LCByZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRFbGVtZW50KE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdE9ybUVudGl0eS50aGlzLnJlbW92ZVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbihlbGVtZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UmVhZE9ubHlEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKERFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QsIDAsIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCVJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gbnVsbDsKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCwgMCwgb2xkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSA6IHRoaXMuZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5LCBpbmhlcml0YW5jZVR5cGUpKSB7Ci0JCQlJbmhlcml0YW5jZSB4bWxJbmhlcml0YW5jZSA9IHRoaXMuZ2V0WG1sSW5oZXJpdGFuY2VGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8oaW5oZXJpdGFuY2VUeXBlKTsKLQkJCXhtbEluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS50b09ybVJlc291cmNlTW9kZWwoaW5oZXJpdGFuY2VUeXBlKSk7Ci0JCQl0aGlzLnJlbW92ZVhtbEluaGVyaXRhbmNlSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneV8oSW5oZXJpdGFuY2VUeXBlIGluaGVyaXRhbmNlVHlwZSkgewotCQlJbmhlcml0YW5jZVR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCQl0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPSBpbmhlcml0YW5jZVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgaW5oZXJpdGFuY2VUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGJ1aWxkU3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJSW5oZXJpdGFuY2UgeG1sSW5oZXJpdGFuY2UgPSB0aGlzLnhtbFR5cGVNYXBwaW5nLmdldEluaGVyaXRhbmNlKCk7Ci0JCXJldHVybiAoeG1sSW5oZXJpdGFuY2UgPT0gbnVsbCkgPyBudWxsIDogSW5oZXJpdGFuY2VUeXBlLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHhtbEluaGVyaXRhbmNlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZSBnZXRYbWxJbmhlcml0YW5jZUZvclVwZGF0ZSgpIHsKLQkJSW5oZXJpdGFuY2UgeG1sSW5oZXJpdGFuY2UgPSB0aGlzLnhtbFR5cGVNYXBwaW5nLmdldEluaGVyaXRhbmNlKCk7Ci0JCXJldHVybiAoeG1sSW5oZXJpdGFuY2UgIT0gbnVsbCkgPyB4bWxJbmhlcml0YW5jZSA6IHRoaXMuYnVpbGRYbWxJbmhlcml0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZSBidWlsZFhtbEluaGVyaXRhbmNlKCkgewotCQlJbmhlcml0YW5jZSB4bWxJbmhlcml0YW5jZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaGVyaXRhbmNlKCk7Ci0JCXRoaXMueG1sVHlwZU1hcHBpbmcuc2V0SW5oZXJpdGFuY2UoeG1sSW5oZXJpdGFuY2UpOwotCQlyZXR1cm4geG1sSW5oZXJpdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sSW5oZXJpdGFuY2VJZlVuc2V0KCkgewotCQlpZiAodGhpcy54bWxUeXBlTWFwcGluZy5nZXRJbmhlcml0YW5jZSgpLmlzVW5zZXQoKSkgewotCQkJdGhpcy54bWxUeXBlTWFwcGluZy5zZXRJbmhlcml0YW5jZShudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBpbmhlcml0YW5jZVR5cGUpIHsKLQkJSW5oZXJpdGFuY2VUeXBlIG9sZCA9IHRoaXMuZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3k7Ci0JCXRoaXMuZGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3kgPSBpbmhlcml0YW5jZVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOSEVSSVRBTkNFX1NUUkFURUdZX1BST1BFUlRZLCBvbGQsIGluaGVyaXRhbmNlVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBidWlsZERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCWlmICgoamF2YUVudGl0eSAhPSBudWxsKSAmJiAodGhpcy54bWxUeXBlTWFwcGluZy5nZXRJbmhlcml0YW5jZSgpID09IG51bGwpKSB7Ci0JCQlyZXR1cm4gamF2YUVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaXNSb290RW50aXR5KCkgPwotCQkJCUluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUgOgotCQkJCXRoaXMucm9vdEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSA6IHRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgZGlzY3JpbWluYXRvclZhbHVlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlXyhkaXNjcmltaW5hdG9yVmFsdWUpOwotCQl0aGlzLnhtbFR5cGVNYXBwaW5nLnNldERpc2NyaW1pbmF0b3JWYWx1ZShkaXNjcmltaW5hdG9yVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZV8oU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlID0gZGlzY3JpbWluYXRvclZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFksIG9sZCwgZGlzY3JpbWluYXRvclZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgZGlzY3JpbWluYXRvclZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSA9IGRpc2NyaW1pbmF0b3JWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEZyb20gdGhlIFNwZWM6Ci0JICogSWYgdGhlIERpc2NyaW1pbmF0b3JWYWx1ZSBhbm5vdGF0aW9uIGlzIG5vdCBzcGVjaWZpZWQsIGEKLQkgKiBwcm92aWRlci1zcGVjaWZpYyBmdW5jdGlvbiB0byBnZW5lcmF0ZSBhIHZhbHVlIHJlcHJlc2VudGluZwotCSAqIHRoZSBlbnRpdHkgdHlwZSBpcyB1c2VkIGZvciB0aGUgdmFsdWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IKLQkgKiBjb2x1bW4uIElmIHRoZSBEaXNjcmltaW5hdG9yVHlwZSBpcyBTVFJJTkcsIHRoZSBkaXNjcmltaW5hdG9yCi0JICogdmFsdWUgZGVmYXVsdCBpcyB0aGUgZW50aXR5IG5hbWUuCi0JICovCi0JLy8gVE9ETyBleHRlbnNpb24gcG9pbnQgZm9yIHByb3ZpZGVyLXNwZWNpZmljIGZ1bmN0aW9uPwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgewotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCk7Ci0JCWlmIChqYXZhRW50aXR5ICE9IG51bGwpIHsKLQkJCXJldHVybiBqYXZhRW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQl9Ci0JCWlmICh0aGlzLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKHRoaXMuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSA9PSBEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcpID8gdGhpcy5nZXROYW1lKCkgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZChib29sZWFuIGFsbG93ZWQpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZDsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQgPSBhbGxvd2VkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfSVNfQUxMT1dFRF9QUk9QRVJUWSwgb2xkLCBhbGxvd2VkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZUlzQWxsb3dlZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSAmJiAhIHRoaXMuaXNBYnN0cmFjdCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZChib29sZWFuIHVuZGVmaW5lZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQ7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQgPSB1bmRlZmluZWQ7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChESVNDUklNSU5BVE9SX1ZBTFVFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCB1bmRlZmluZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFibGVQZXJDbGFzcygpIHx8Ci0JCQkJdGhpcy5pc0Fic3RyYWN0KCkgfHwKLQkJCQl0aGlzLmlzUm9vdE5vRGVzY2VuZGFudHNOb1N0cmF0ZWd5RGVmaW5lZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkaXNjcmltaW5hdG9yIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtRGlzY3JpbWluYXRvckNvbHVtbiBnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCBPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1EaXNjcmltaW5hdG9yQ29sdW1uKHRoaXMsIHRoaXMuYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgYnVpbGREaXNjcmltaW5hdG9yQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzY3JpbWluYXRvckNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKGJvb2xlYW4gYWxsb3dlZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZDsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkID0gYWxsb3dlZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9ESVNDUklNSU5BVE9SX0NPTFVNTl9JU19BTExPV0VEX1BST1BFUlRZLCBvbGQsIGFsbG93ZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSAmJiB0aGlzLmlzUm9vdEVudGl0eSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCgpIHsKLQkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZChib29sZWFuIHVuZGVmaW5lZCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JDb2x1bW5Jc1VuZGVmaW5lZCA9IHVuZGVmaW5lZDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0NSSU1JTkFUT1JfQ09MVU1OX0lTX1VOREVGSU5FRF9QUk9QRVJUWSwgb2xkLCB1bmRlZmluZWQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbklzVW5kZWZpbmVkKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSB8fAotCQkJCXRoaXMuaXNSb290Tm9EZXNjZW5kYW50c05vU3RyYXRlZ3lEZWZpbmVkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSmF2YUVudGl0eSBnZXRKYXZhT3ZlcnJpZGVDb250YWluZXJFbnRpdHkoKSB7Ci0JCWlmICh0aGlzLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVR5cGUgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlpZiAoamF2YVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSmF2YVR5cGVNYXBwaW5nIGphdmFUeXBlTWFwcGluZyA9IGphdmFUeXBlLmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIChqYXZhVHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhRW50aXR5KSA/IChKYXZhRW50aXR5KSBqYXZhVHlwZU1hcHBpbmcgOiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIodGhpcywgbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQlyZXR1cm4gKHN1cGVyUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPyBudWxsIDogc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5Q29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uRm9yQXR0cmlidXRlT3ZlcnJpZGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJaWYgKCAhIHRoaXMuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhVHlwZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQlpZiAoamF2YVR5cGUgIT0gbnVsbCkgewotCQkJCUNvbHVtbiBjb2x1bW4gPSBqYXZhVHlwZS5nZXRNYXBwaW5nKCkucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7Ci0JCQkJaWYgKGNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBjb2x1bW47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4odGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCksIGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBnZXRKYXZhQXR0cmlidXRlT3ZlcnJpZGVOYW1lZEZvclZpcnR1YWwoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogamF2YUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlpZiAodGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSkgewotCQkJLy8gc3RyaXAgb2ZmIHRoZSBmaXJzdCBzZWdtZW50Ci0JCQlpbnQgZG90SW5kZXggPSBhdHRyaWJ1dGVOYW1lLmluZGV4T2YoJy4nKTsKLQkJCWlmIChkb3RJbmRleCAhPSAtMSkgewotCQkJCUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZyhkb3RJbmRleCArIDEpKTsKLQkJCQlpZiAob3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gb3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXBGb3JBc3NvY2lhdGlvbk92ZXJyaWRlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWlmICggISB0aGlzLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVR5cGUgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJaWYgKGphdmFUeXBlICE9IG51bGwpIHsKLQkJCQlSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gamF2YVR5cGUuZ2V0TWFwcGluZygpLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKGF0dHJpYnV0ZU5hbWUpOwotCQkJCWlmIChyZWxhdGlvbnNoaXAgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gcmVsYXRpb25zaGlwOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpLCBhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdG9yIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtR2VuZXJhdG9yQ29udGFpbmVyIGdldEdlbmVyYXRvckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1HZW5lcmF0b3JDb250YWluZXIgYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtR2VuZXJhdG9yQ29udGFpbmVyKHRoaXMsIHRoaXMueG1sVHlwZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8R2VuZXJhdG9yPigKLQkJCQkJc3VwZXIuZ2V0R2VuZXJhdG9ycygpLAotCQkJCQl0aGlzLmdlbmVyYXRvckNvbnRhaW5lci5nZXRHZW5lcmF0b3JzKCkKLQkJCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyeSBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybVF1ZXJ5Q29udGFpbmVyIGdldFF1ZXJ5Q29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUXVlcnlDb250YWluZXIgYnVpbGRRdWVyeUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1RdWVyeUNvbnRhaW5lcih0aGlzLCB0aGlzLnhtbFR5cGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UXVlcnk+IGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5Q29udGFpbmVyLmdldFF1ZXJpZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXNzb2NpYXRlZCB0YWJsZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IGdldEFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4odGhpcy50YWJsZSwgdGhpcy5nZXRTZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IGdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaXRlcmFibGUodGhpcy5hbGxBc3NvY2lhdGVkVGFibGVzKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvcjxSZWFkT25seVRhYmxlPiBhbGxBc3NvY2lhdGVkVGFibGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhdG9yPFJlYWRPbmx5VGFibGU+KHRoaXMuYWxsQXNzb2NpYXRlZFRhYmxlc0xpc3RzKCkpOwotCX0KLQotCS8vIFRPRE8gZWxpbWluYXRlIGR1cGxpY2F0ZSB0YWJsZXM/Ci0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+PiBhbGxBc3NvY2lhdGVkVGFibGVzTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxUeXBlTWFwcGluZywgSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4+KHRoaXMuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSwgVHlwZU1hcHBpbmdUb29scy5BU1NPQ0lBVEVEX1RBQkxFU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb05hbWVzKHRoaXMuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBzdHJpcCBvdXQgPGNvZGU+bnVsbDwvY29kZT4gbmFtZXMKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBjb252ZXJ0VG9OYW1lcyhJdGVyYWJsZTxSZWFkT25seVRhYmxlPiB0YWJsZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuY29udmVydFRvTmFtZXNfKHRhYmxlcyksIE5vdE51bGxGaWx0ZXIuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBjb252ZXJ0VG9OYW1lc18oSXRlcmFibGU8UmVhZE9ubHlUYWJsZT4gdGFibGVzKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxSZWFkT25seVRhYmxlLCBTdHJpbmc+KHRhYmxlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShSZWFkT25seVRhYmxlIHQpIHsKLQkJCQlyZXR1cm4gdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy50YWJsZU5hbWVJc1ZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVOYW1lSXNWYWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlSXNVbmRlZmluZWQgfHwgdGhpcy50YWJsZU5hbWVJc1ZhbGlkXyh0YWJsZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRhYmxlTmFtZUlzVmFsaWRfKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpID8KLQkJCQkodGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpICE9IG51bGwpIDoKLQkJCQlDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpLCB0YWJsZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGdldEphdmFUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhRW50aXR5KSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVudGl0eSBnZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpIHsKLQkJcmV0dXJuIChKYXZhRW50aXR5KSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBnZXRQcmltYXJ5RGJUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuZ2V0RGJUYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJLy8gbWF0Y2hpbmcgZGF0YWJhc2Ugb2JqZWN0cyBhbmQgaWRlbnRpZmllcnMgaXMgZGF0YWJhc2UgcGxhdGZvcm0tc3BlY2lmaWMKLQkJcmV0dXJuIHRoaXMuZ2V0RGF0YVNvdXJjZSgpLnNlbGVjdFRhYmxlRm9ySWRlbnRpZmllcih0aGlzLmdldEFsbEFzc29jaWF0ZWREYlRhYmxlcygpLCB0YWJsZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHN0cmlwIG91dCBudWxsIGRiIHRhYmxlcwotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlPiBnZXRBbGxBc3NvY2lhdGVkRGJUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8b3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZT4odGhpcy5nZXRBbGxBc3NvY2lhdGVkRGJUYWJsZXNfKCksIE5vdE51bGxGaWx0ZXIuPG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU+IGdldEFsbEFzc29jaWF0ZWREYlRhYmxlc18oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxSZWFkT25seVRhYmxlLCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlPih0aGlzLmdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSB0cmFuc2Zvcm0oUmVhZE9ubHlUYWJsZSB0KSB7Ci0JCQkJcmV0dXJuIHQuZ2V0RGJUYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLmdldERiU2NoZW1hKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUodGhpcyk7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SWRBdHRyaWJ1dGUoKSB7Ci0JCUl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmc+IGlkQXR0cmlidXRlTWFwcGluZ3MgPSB0aGlzLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkuaXRlcmF0b3IoKTsKLQkJaWYgKGlkQXR0cmlidXRlTWFwcGluZ3MuaGFzTmV4dCgpKSB7Ci0JCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGlkQXR0cmlidXRlTWFwcGluZ3MubmV4dCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCXJldHVybiBpZEF0dHJpYnV0ZU1hcHBpbmdzLmhhc05leHQoKSA/IG51bGwgLyptb3JlIHRoYW4gb25lKi86IGF0dHJpYnV0ZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKioga2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVudGl0eSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRYbWxUeXBlTWFwcGluZ1RvKFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCWVudGl0eU1hcHBpbmdzLmdldEVudGl0aWVzKCkuYWRkKHRoaXMueG1sVHlwZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFR5cGVNYXBwaW5nRnJvbShYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQllbnRpdHlNYXBwaW5ncy5nZXRFbnRpdGllcygpLnJlbW92ZSh0aGlzLnhtbFR5cGVNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJaWYgKHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkpIHsKLQkJCS8vIHN0cmlwIG9mZiB0aGUgZmlyc3Qgc2VnbWVudAotCQkJaW50IGRvdEluZGV4ID0gYXR0cmlidXRlTmFtZS5pbmRleE9mKCcuJyk7Ci0JCQlpZiAoZG90SW5kZXggIT0gLTEpIHsKLQkJCQlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lLnN1YnN0cmluZyhkb3RJbmRleCArIDEpKTsKLQkJCQlpZiAob3ZlcnJpZGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gb3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSA/Ci0JCQkJc3VwZXIuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFibGVQZXJDbGFzcygpID8KLQkJCQlzdXBlci5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgOiB0aGlzLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKLQkJCUF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZWRNYXBwaW5nID0gYXR0cmlidXRlTWFwcGluZy5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhuYW1lKTsKLQkJCWlmIChyZXNvbHZlZE1hcHBpbmcgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvbHZlZE1hcHBpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGluaGVyaXRhbmNlICoqKioqKioqKioKLQotCXB1YmxpYyBFbnRpdHkgZ2V0UGFyZW50RW50aXR5KCkgewotCQlmb3IgKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nIDogdGhpcy5nZXRBbmNlc3RvcnMoKSkgewotCQkJaWYgKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJcmV0dXJuIChFbnRpdHkpIHR5cGVNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkgaXMgdGhlIHRvcCBvZiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNSb290RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcyA9PSB0aGlzLnJvb3RFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyBhIGRlc2NlbmRhbnQgaW4gKGFzIG9wcG9zZWQgdG8gdGhlIHJvb3Qgb2YpCi0JICogYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzRGVzY2VuZGFudCgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc1Jvb3RFbnRpdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGEgZGVzY2VuZGFudCBvZiB0aGUgcm9vdCBlbnRpdHkKLQkgKiBvZiBhICJzaW5nbGUgdGFibGUiIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbmdsZVRhYmxlRGVzY2VuZGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNEZXNjZW5kYW50KCkgJiYKLQkJCQkodGhpcy5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgPT0gSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyB0aGUgdG9wIG9mIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCSAqIGFuZCBoYXMgbm8gZGVzY2VuZGFudHMgYW5kIG5vIHNwZWNpZmllZCBpbmhlcml0YW5jZSBzdHJhdGVneSBoYXMgYmVlbiBkZWZpbmVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUm9vdE5vRGVzY2VuZGFudHNOb1N0cmF0ZWd5RGVmaW5lZCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNSb290RW50aXR5KCkgJiYKLQkJCQl0aGlzLmRlc2NlbmRhbnRzLmlzRW1wdHkoKSAmJgotCQkJCSh0aGlzLnNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBpcyBhYnN0cmFjdCBhbmQgaXMgYSBwYXJ0IG9mIGEKLQkgKiAidGFibGUgcGVyIGNsYXNzIiBpbmhlcml0YW5jZSBoaWVyYXJjaHkuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlzQWJzdHJhY3QoKSAmJiB0aGlzLmlzVGFibGVQZXJDbGFzcygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlc291cmNlVGFibGVJc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGUuaXNTcGVjaWZpZWRJblJlc291cmNlKCkgfHwgdGhpcy5qYXZhUmVzb3VyY2VUYWJsZUlzU3BlY2lmaWVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gamF2YVJlc291cmNlVGFibGVJc1NwZWNpZmllZCgpIHsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQkJcmV0dXJuIChqYXZhRW50aXR5ICE9IG51bGwpICYmIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5pc1NwZWNpZmllZEluUmVzb3VyY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGlzIGEgcGFydCBvZiBhICJ0YWJsZSBwZXIgY2xhc3MiCi0JICogaW5oZXJpdGFuY2UgaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVQZXJDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpID09IEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgaXMgYWJzdHJhY3Q7IGZhbHNlIGlmIG5vIGphdmEgdHlwZSBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBYnN0cmFjdCgpIHsKLQkJSmF2YVJlc291cmNlVHlwZSBqcnQgPSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJcmV0dXJuIChqcnQgIT0gbnVsbCkgJiYganJ0LmlzQWJzdHJhY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5J3MgdHlwZSBpcyBhYnN0cmFjdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZpbmFsKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIGpydCA9IHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlyZXR1cm4gKGpydCAhPSBudWxsKSAmJiBqcnQuaXNGaW5hbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkncyB0eXBlIGlzIGEgbWVtYmVyIG9mIGFub3RoZXIgdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc01lbWJlcigpIHsKLQkJSmF2YVJlc291cmNlVHlwZSBqcnQgPSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJcmV0dXJuIChqcnQgIT0gbnVsbCkgJiYganJ0LmlzTWVtYmVyVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBlbnRpdHkncyB0eXBlIGlzIHN0YXRpYy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N0YXRpYygpIHsKLQkJSmF2YVJlc291cmNlVHlwZSBqcnQgPSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJcmV0dXJuIChqcnQgIT0gbnVsbCkgJiYganJ0LmlzU3RhdGljKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCQl0aGlzLmNyZWF0ZUlkQ2xhc3NSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVJZENsYXNzUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzc1JlZmVyZW5jZS5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJCXN1cGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQkJdGhpcy5jcmVhdGVJZENsYXNzTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZUlkQ2xhc3NNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3NSZWZlcmVuY2UuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZUlkQ2xhc3NSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVJZENsYXNzUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5pZENsYXNzUmVmZXJlbmNlLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQotCQl0aGlzLnZhbGlkYXRlUHJpbWFyeUtleShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlVGFibGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJZm9yIChPcm1TZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA6IHRoaXMuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkpIHsKLQkJCXNlY29uZGFyeVRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQkJdGhpcy52YWxpZGF0ZUluaGVyaXRhbmNlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWZvciAoT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogdGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJcGtKb2luQ29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQkJdGhpcy5hdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5xdWVyeUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlRW50aXR5TmFtZShtZXNzYWdlcyk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRW50aXR5TmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmdldE5hbWUoKSkpewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTkFNRV9NSVNTSU5HLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRDbGFzc18oKX0sIAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJpbWFyeUtleShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMuYnVpbGRQcmltYXJ5S2V5VmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkUHJpbWFyeUtleVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljRW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JCS8vIFRPRE8gLSBKUEEgMi4wIHZhbGlkYXRpb24KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRW50aXR5VGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1FbnRpdHlUZXh0UmFuZ2VSZXNvbHZlcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVRhYmxlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMuaXNBYnN0cmFjdFRhYmxlUGVyQ2xhc3MoKSkgewotCQkJaWYgKHRoaXMucmVzb3VyY2VUYWJsZUlzU3BlY2lmaWVkKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLnRhYmxlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQkJCi0JCWlmICh0aGlzLmlzU2luZ2xlVGFibGVEZXNjZW5kYW50KCkgJiYgdGhpcy5nZXREYXRhU291cmNlKCkuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpKSB7Ci0JCQlpZiAodGhpcy5zcGVjaWZpZWRUYWJsZURvZXNOb3RNYXRjaFJvb3RUYWJsZSgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEUsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLnRhYmxlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGVudGl0eSBzcGVjaWZpZXMgYSB0YWJsZSBhbmQgaXQgaXMgYSBkaWZmZXJlbnQgdGFibGUKLQkgKiB0aGFuIHRoZSByb290IGVudGl0eSdzIHRhYmxlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHNwZWNpZmllZFRhYmxlRG9lc05vdE1hdGNoUm9vdFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5pc1NwZWNpZmllZEluUmVzb3VyY2UoKSAmJgotCQkJKHRoaXMudGFibGUuZ2V0RGJUYWJsZSgpICE9IHRoaXMuZ2V0Um9vdEVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGJUYWJsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUluaGVyaXRhbmNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy52YWxpZGF0ZUluaGVyaXRhbmNlU3RyYXRlZ3kobWVzc2FnZXMpOwotCQl0aGlzLnZhbGlkYXRlRGlzY3JpbWluYXRvckNvbHVtbihtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlRGlzY3JpbWluYXRvclZhbHVlKG1lc3NhZ2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZURpc2NyaW1pbmF0b3JDb2x1bW4oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAodGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkICYmICEgdGhpcy5kaXNjcmltaW5hdG9yQ29sdW1uSXNVbmRlZmluZWQpIHsKLQkJCXRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZGlzY3JpbWluYXRvckNvbHVtbi5pc1Jlc291cmNlU3BlY2lmaWVkKCkpIHsKLQkJCWlmICh0aGlzLmlzRGVzY2VuZGFudCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX05PTl9ST09UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JDb2x1bW5UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuaXNUYWJsZVBlckNsYXNzKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JDb2x1bW5UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVEaXNjcmltaW5hdG9yVmFsdWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQgJiYgKHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlICE9IG51bGwpKSB7Ci0JCQlpZiAodGhpcy5pc0Fic3RyYWN0KCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9BQlNUUkFDVF9ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5pc1RhYmxlUGVyQ2xhc3MoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0TmFtZSgpfSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZSgpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJbmhlcml0YW5jZVN0cmF0ZWd5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCVN1cHBvcnRlZCB0YWJsZVBlckNvbmNyZXRlQ2xhc3NJbmhlcml0YW5jZUlzU3VwcG9ydGVkID0gdGhpcy5nZXRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpLmdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKTsKLQkJaWYgKHRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQgPT0gU3VwcG9ydGVkLllFUykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgodGhpcy5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgPT0gSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykgJiYgdGhpcy5pc1Jvb3RFbnRpdHkoKSkgewotCQkJaWYgKHRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQgPT0gU3VwcG9ydGVkLk5PKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfU1VQUE9SVEVEX09OX1BMQVRGT1JNLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5VGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1BPUlRBQkxFX09OX1BMQVRGT1JNLAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5VGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbFR5cGVNYXBwaW5nLmdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldERpc2NyaW1pbmF0b3JDb2x1bW5UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxUeXBlTWFwcGluZy5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxUeXBlTWFwcGluZy5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5VGV4dFJhbmdlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPcm1PdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzb21lIGNvbW1vbiBiZWhhdmlvcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBPdmVycmlkZUNvbnRhaW5lck93bmVyCi0JCWltcGxlbWVudHMgT3JtT3ZlcnJpZGVDb250YWluZXIuT3duZXIKLQl7Ci0JCXB1YmxpYyBBYnN0cmFjdE9ybUVudGl0eTw/PiBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQl9Ci0KLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7Ci0JCX0KLQotCQkvKioKLQkJICogVXNlIHRoZSBKYXZhIG92ZXJyaWRlcyBpZiBhcHByb3ByaWF0ZSwgc28gd2UgYnJpbmcgb3ZlciBhbnkgaW52YWxpZAotCQkgKiBvdmVycmlkZXMgYWxzby4KLQkJICogQHNlZSBKYXZhT3ZlcnJpZGVDb250YWluZXIjZ2V0T3ZlcnJpZGVOYW1lcygpCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhT3ZlcnJpZGVOYW1lcygpIHsKLQkJCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IHRoaXMuZ2V0SmF2YU92ZXJyaWRlQ29udGFpbmVyRW50aXR5KCk7Ci0JCQlyZXR1cm4gKGphdmFFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXRPdmVycmlkZUNvbnRhaW5lcihqYXZhRW50aXR5KS5nZXRPdmVycmlkZU5hbWVzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBKYXZhIGVudGl0eSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIG92ZXJyaWRlIGNvbnRhaW5lci4KLQkJICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBhcHByb3ByaWF0ZS4KLQkJICovCi0JCXByb3RlY3RlZCBKYXZhRW50aXR5IGdldEphdmFPdmVycmlkZUNvbnRhaW5lckVudGl0eSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmdldEphdmFPdmVycmlkZUNvbnRhaW5lckVudGl0eSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IEphdmFPdmVycmlkZUNvbnRhaW5lciBnZXRPdmVycmlkZUNvbnRhaW5lcihKYXZhRW50aXR5IGphdmFFbnRpdHkpOwotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCQlUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAob3ZlcnJpZGRlblR5cGVNYXBwaW5nICE9IG51bGwpID8gdGhpcy5nZXRBbGxPdmVycmlkYWJsZU5hbWVzXyhvdmVycmlkZGVuVHlwZU1hcHBpbmcpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQkvKioKLQkJICogcHJlLWNvbmRpdGlvbjogPGNvZGU+dHlwZU1hcHBpbmc8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgotCQkgKi8KLQkJcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lc18oVHlwZU1hcHBpbmcgb3ZlcnJpZGRlblR5cGVNYXBwaW5nKTsKLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJZXh0ZW5kcyBPdmVycmlkZUNvbnRhaW5lck93bmVyCi0JCWltcGxlbWVudHMgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF2YU92ZXJyaWRlQ29udGFpbmVyIGdldE92ZXJyaWRlQ29udGFpbmVyKEphdmFFbnRpdHkgamF2YUVudGl0eSkgewotCQkJcmV0dXJuIGphdmFFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzXyhUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcpIHsKLQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPihvdmVycmlkZGVuVHlwZU1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCQkJCXJldHVybiAhIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIudGhpcy5nZXRUeXBlTWFwcGluZygpLmF0dHJpYnV0ZUlzRGVyaXZlZElkKGF0dHJpYnV0ZU5hbWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0WG1sT3ZlcnJpZGVzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yKChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSwgKEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKSBjb250YWluZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgTWFwcGVkU3VwZXJjbGFzc092ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBSZWFkT25seUNvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhT3ZlcnJpZGVDb250YWluZXJFbnRpdHkoKTsKLQkJCXJldHVybiAoamF2YUVudGl0eSAhPSBudWxsKSA/IAotCQkJCQlqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVDb2x1bW4oYXR0cmlidXRlTmFtZSkgOgotCQkJCQlBYnN0cmFjdE9ybUVudGl0eS50aGlzLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uRm9yQXR0cmlidXRlT3ZlcnJpZGUoYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lck93bmVyCi0JCWV4dGVuZHMgT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlpbXBsZW1lbnRzIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIKLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF2YU92ZXJyaWRlQ29udGFpbmVyIGdldE92ZXJyaWRlQ29udGFpbmVyKEphdmFFbnRpdHkgamF2YUVudGl0eSkgewotCQkJcmV0dXJuIGphdmFFbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXNfKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCQlyZXR1cm4gdHlwZU1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0WG1sT3ZlcnJpZGVzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBSZWFkT25seVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhT3ZlcnJpZGVDb250YWluZXJFbnRpdHkoKTsKLQkJCXJldHVybiAoamF2YUVudGl0eSAhPSBudWxsKSA/IAotCQkJCQlqYXZhRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZVJlbGF0aW9uc2hpcChhdHRyaWJ1dGVOYW1lKSA6Ci0JCQkJCUFic3RyYWN0T3JtRW50aXR5LnRoaXMucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXBGb3JBc3NvY2lhdGlvbk92ZXJyaWRlKGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZE92ZXJyaWRlVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIE92ZXJyaWRlQ29udGFpbmVyIGNvbnRhaW5lciwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlVmFsaWRhdG9yKChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUpIG92ZXJyaWRlLCAoQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IE1hcHBlZFN1cGVyY2xhc3NPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lciBvd25lciwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvcigoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlKSBvdmVycmlkZSwgKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCAoUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyKSBvd25lciwgKEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uVmFsaWRhdG9yKG92ZXJyaWRlLCBjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEpvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihvdmVycmlkZSwgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBKb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlUYWJsZSB0LCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVWYWxpZGF0b3Iob3ZlcnJpZGUsIChSZWFkT25seUpvaW5UYWJsZSkgdCwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9ybU5hbWVkQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIHNvbWUgY29tbW9uIGJlaGF2aW9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIE5hbWVkQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1SZWFkT25seU5hbWVkQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9ybUJhc2VKb2luQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyCi0JCWV4dGVuZHMgTmFtZWRDb2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJRW50aXR5IHBhcmVudEVudGl0eSA9IEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiBwYXJlbnRFbnRpdHkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCksIGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJaWYgKHRoaXMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRW50aXR5IHBhcmVudEVudGl0eSA9IEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IEFic3RyYWN0T3JtRW50aXR5LnRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSA6IHBhcmVudEVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBFbnRpdHlQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcigoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5Pd25lcgotCQlleHRlbmRzIE5hbWVkQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1EaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlpZiAodGhpcy5nZXRYbWxDb2x1bW4oKSA9PSBudWxsKSB7Ci0JCQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKTsKLQkJCQlpZiAoamF2YUVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gamF2YUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbmFtZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmlzRGVzY2VuZGFudCgpID8KLQkJCQkJdGhpcy5nZXRSb290RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSA6Ci0JCQkJCXRoaXMuaXNUYWJsZVBlckNsYXNzKCkgPyBudWxsIDogRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldERlZmF1bHRMZW5ndGgoKSB7Ci0JCQlpZiAodGhpcy5nZXRYbWxDb2x1bW4oKSA9PSBudWxsKSB7Ci0JCQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gdGhpcy5nZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKTsKLQkJCQlpZiAoamF2YUVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCUludGVnZXIgbGVuZ3RoID0gamF2YUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JCQkJCWlmIChsZW5ndGggIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGxlbmd0aC5pbnRWYWx1ZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuaXNEZXNjZW5kYW50KCkgPwotCQkJCQl0aGlzLmdldFJvb3REaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkgOgotCQkJCQl0aGlzLmlzVGFibGVQZXJDbGFzcygpID8gMCA6IFJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RIOwotCQl9Ci0KLQkJcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJCWlmICh0aGlzLmdldFhtbENvbHVtbigpID09IG51bGwpIHsKLQkJCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSB0aGlzLmdldEphdmFFbnRpdHlGb3JEZWZhdWx0cygpOwotCQkJCWlmIChqYXZhRW50aXR5ICE9IG51bGwpIHsKLQkJCQkJRGlzY3JpbWluYXRvclR5cGUgZHQgPSBqYXZhRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpOwotCQkJCQlpZiAoZHQgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIGR0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuaXNEZXNjZW5kYW50KCkgPwotCQkJCQl0aGlzLmdldFJvb3REaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSA6Ci0JCQkJCXRoaXMuaXNUYWJsZVBlckNsYXNzKCkgPyBudWxsIDogUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEU7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IERpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IoY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQotCQlwdWJsaWMgWG1sRGlzY3JpbWluYXRvckNvbHVtbiBnZXRYbWxDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRYbWxFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCX0KLQotCQlwdWJsaWMgWG1sRGlzY3JpbWluYXRvckNvbHVtbiBidWlsZFhtbENvbHVtbigpIHsKLQkJCVhtbERpc2NyaW1pbmF0b3JDb2x1bW4geG1sQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkJdGhpcy5nZXRYbWxFbnRpdHkoKS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKHhtbENvbHVtbik7Ci0JCQlyZXR1cm4geG1sQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlWG1sQ29sdW1uKCkgewotCQkJdGhpcy5nZXRYbWxFbnRpdHkoKS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFhtbEVudGl0eSBnZXRYbWxFbnRpdHkoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRYbWxUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0Um9vdERpc2NyaW1pbmF0b3JDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5yb290RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGlzTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVudGl0eS50aGlzLmlzTWV0YWRhdGFDb21wbGV0ZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZVBlckNsYXNzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRW50aXR5LnRoaXMuaXNUYWJsZVBlckNsYXNzKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YUVudGl0eSBnZXRKYXZhRW50aXR5Rm9yRGVmYXVsdHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbnRpdHkudGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1HZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczYmIyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBzZXF1ZW5jZSBvciB0YWJsZSBnZW5lcmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtR2VuZXJhdG9yPFggZXh0ZW5kcyBYbWxHZW5lcmF0b3I+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1HZW5lcmF0b3IKLXsKLQlwcm90ZWN0ZWQgZmluYWwgWCB4bWxHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRJbml0aWFsVmFsdWU7Ci0JcHJvdGVjdGVkIGludCBkZWZhdWx0SW5pdGlhbFZhbHVlOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JcHJvdGVjdGVkIGludCBkZWZhdWx0QWxsb2NhdGlvblNpemU7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUdlbmVyYXRvcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFggeG1sR2VuZXJhdG9yKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yID0geG1sR2VuZXJhdG9yOwotCQl0aGlzLm5hbWUgPSB4bWxHZW5lcmF0b3IuZ2V0TmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZSA9IHhtbEdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSA9IHhtbEdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMueG1sR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlXyh0aGlzLnhtbEdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemVfKHRoaXMueG1sR2VuZXJhdG9yLmdldEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdEluaXRpYWxWYWx1ZSh0aGlzLmJ1aWxkRGVmYXVsdEluaXRpYWxWYWx1ZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0QWxsb2NhdGlvblNpemUodGhpcy5idWlsZERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLnNldE5hbWVfKG5hbWUpOwotCQl0aGlzLnhtbEdlbmVyYXRvci5zZXROYW1lKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0SW5pdGlhbFZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkSW5pdGlhbFZhbHVlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUuaW50VmFsdWUoKSA6IHRoaXMuZGVmYXVsdEluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlciBzcGVjaWZpZWRJbml0aWFsVmFsdWUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWVfKHNwZWNpZmllZEluaXRpYWxWYWx1ZSk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShzcGVjaWZpZWRJbml0aWFsVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluaXRpYWxWYWx1ZV8oSW50ZWdlciBzcGVjaWZpZWRJbml0aWFsVmFsdWUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZEluaXRpYWxWYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRJbml0aWFsVmFsdWUgPSBzcGVjaWZpZWRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSU5JVElBTF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBzcGVjaWZpZWRJbml0aWFsVmFsdWUpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5pdGlhbFZhbHVlKGludCBkZWZhdWx0SW5pdGlhbFZhbHVlKSB7Ci0JCWludCBvbGQgPSB0aGlzLmRlZmF1bHRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdEluaXRpYWxWYWx1ZSA9IGRlZmF1bHRJbml0aWFsVmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFksIG9sZCwgZGVmYXVsdEluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGludCBidWlsZERlZmF1bHRJbml0aWFsVmFsdWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBhbGxvY2F0aW9uIHNpemUgKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZS5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0QWxsb2NhdGlvblNpemU7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIgc3BlY2lmaWVkQWxsb2NhdGlvblNpemUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZV8oc3BlY2lmaWVkQWxsb2NhdGlvblNpemUpOwotCQl0aGlzLnhtbEdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShzcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemVfKEludGVnZXIgc3BlY2lmaWVkQWxsb2NhdGlvblNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplOwotCQl0aGlzLnNwZWNpZmllZEFsbG9jYXRpb25TaXplID0gc3BlY2lmaWVkQWxsb2NhdGlvblNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZEFsbG9jYXRpb25TaXplKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEFsbG9jYXRpb25TaXplOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBbGxvY2F0aW9uU2l6ZShpbnQgZGVmYXVsdEFsbG9jYXRpb25TaXplKSB7Ci0JCWludCBvbGQgPSB0aGlzLmRlZmF1bHRBbGxvY2F0aW9uU2l6ZTsKLQkJdGhpcy5kZWZhdWx0QWxsb2NhdGlvblNpemUgPSBkZWZhdWx0QWxsb2NhdGlvblNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FMTE9DQVRJT05fU0laRV9QUk9QRVJUWSwgb2xkLCBkZWZhdWx0QWxsb2NhdGlvblNpemUpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0QWxsb2NhdGlvblNpemUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0FMTE9DQVRJT05fU0laRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSl7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfTkFNRV9VTkRFRklORUQsCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy54bWxHZW5lcmF0b3IuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEdlbmVyYXRvci5nZXROYW1lVGV4dFJhbmdlKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldE5hbWUoKSwgZ2VuZXJhdG9yLmdldE5hbWUoKSkgJiYKLQkJCQlUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCksIGdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKSAmJgotCQkJCVRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCksIGdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlTY2hlbWFDb250YWluZXIgZGJTY2hlbWFDb250YWluZXIgPSB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCXJldHVybiAoZGJTY2hlbWFDb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+IGNhdGFsb2cpLAotCSAqIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3M7IGFuZCB3ZSBuZWVkIHRvCi0JICogZ2V0IHRoZSBzY2hlbWEgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YWJhc2UuCi0JICovCi0JcHVibGljIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpIDogdGhpcy5nZXREYXRhYmFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+Ci0JICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIENhdGFsb2cgZ2V0RGJDYXRhbG9nKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChYbWxDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFggZ2V0WG1sR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy54bWxHZW5lcmF0b3I7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUlkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmI5MjFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk5hbWVkQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLk51bGxPcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5JZE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gSUQgbWFwcGluZwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1JZE1hcHBpbmc8WCBleHRlbmRzIFhtbElkPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nPFg+Ci0JaW1wbGVtZW50cyBPcm1JZE1hcHBpbmcsIElkTWFwcGluZzJfMAotewotCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gY29sdW1uOwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUdlbmVyYXRvckNvbnRhaW5lciBnZW5lcmF0b3JDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgT3JtR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGNvbnZlcnRlcjsgIC8vIG5ldmVyIG51bGwKLQotCS8qIEpQQSAyLjAgLSB0aGUgZW1iZWRkZWQgaWQgbWF5IGJlIGRlcml2ZWQgZnJvbSBhIHJlbGF0aW9uc2hpcCAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlcml2ZWQ7Ci0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JtQ29udmVydGVyLkFkYXB0ZXJbXSBDT05WRVJURVJfQURBUFRFUl9BUlJBWSA9IG5ldyBPcm1Db252ZXJ0ZXIuQWRhcHRlcltdIHsKLQkJT3JtVGVtcG9yYWxDb252ZXJ0ZXIuQmFzaWNBZGFwdGVyLmluc3RhbmNlKCksCi0JfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPiBDT05WRVJURVJfQURBUFRFUlMgPSBuZXcgQXJyYXlJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4oQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkpOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1JZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFggeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLmNvbHVtbiA9IHRoaXMuYnVpbGRDb2x1bW4oKTsKLQkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIgPSB0aGlzLmJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCk7Ci0JCXRoaXMuZ2VuZXJhdGVkVmFsdWUgPSB0aGlzLmJ1aWxkR2VuZXJhdGVkVmFsdWUoKTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNHZW5lcmF0ZWRWYWx1ZSgpOwotCQl0aGlzLnN5bmNDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbHVtbi51cGRhdGUoKTsKLQkJdGhpcy5nZW5lcmF0b3JDb250YWluZXIudXBkYXRlKCk7Ci0JCWlmICh0aGlzLmdlbmVyYXRlZFZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdGVkVmFsdWUudXBkYXRlKCk7Ci0JCX0KLQkJdGhpcy5jb252ZXJ0ZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVyaXZlZCh0aGlzLmJ1aWxkRGVyaXZlZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Db2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbHVtbiBidWlsZENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Db2x1bW4odGhpcywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRvciBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybUdlbmVyYXRvckNvbnRhaW5lciBnZXRHZW5lcmF0b3JDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvckNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtR2VuZXJhdG9yQ29udGFpbmVyIGJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUdlbmVyYXRvckNvbnRhaW5lcih0aGlzLCB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvckNvbnRhaW5lci5nZXRHZW5lcmF0b3JzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRlZCB2YWx1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtR2VuZXJhdGVkVmFsdWUgZ2V0R2VuZXJhdGVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCX0KLQotCXB1YmxpYyBPcm1HZW5lcmF0ZWRWYWx1ZSBhZGRHZW5lcmF0ZWRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZ2VuZXJhdGVkIHZhbHVlIGFscmVhZHkgZXhpc3RzOiAiICsgdGhpcy5nZW5lcmF0ZWRWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlYbWxHZW5lcmF0ZWRWYWx1ZSB4bWxHZW5lcmF0ZWRWYWx1ZSA9IHRoaXMuYnVpbGRYbWxHZW5lcmF0ZWRWYWx1ZSgpOwotCQlPcm1HZW5lcmF0ZWRWYWx1ZSB2YWx1ZSA9IHRoaXMuYnVpbGRHZW5lcmF0ZWRWYWx1ZSh4bWxHZW5lcmF0ZWRWYWx1ZSk7Ci0JCXRoaXMuc2V0R2VuZXJhdGVkVmFsdWUodmFsdWUpOwotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0R2VuZXJhdGVkVmFsdWUoeG1sR2VuZXJhdGVkVmFsdWUpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEdlbmVyYXRlZFZhbHVlIGJ1aWxkWG1sR2VuZXJhdGVkVmFsdWUoKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxHZW5lcmF0ZWRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUdlbmVyYXRlZFZhbHVlKCkgewotCQlpZiAodGhpcy5nZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJnZW5lcmF0ZWQgdmFsdWUgZG9lcyBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRHZW5lcmF0ZWRWYWx1ZShudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRHZW5lcmF0ZWRWYWx1ZShPcm1HZW5lcmF0ZWRWYWx1ZSB2YWx1ZSkgewotCQlPcm1HZW5lcmF0ZWRWYWx1ZSBvbGQgPSB0aGlzLmdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLmdlbmVyYXRlZFZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChHRU5FUkFURURfVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBPcm1HZW5lcmF0ZWRWYWx1ZSBidWlsZEdlbmVyYXRlZFZhbHVlKCkgewotCQlYbWxHZW5lcmF0ZWRWYWx1ZSB4bWxHZW5lcmF0ZWRWYWx1ZSA9IHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlyZXR1cm4gKHhtbEdlbmVyYXRlZFZhbHVlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRHZW5lcmF0ZWRWYWx1ZSh4bWxHZW5lcmF0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUdlbmVyYXRlZFZhbHVlIGJ1aWxkR2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgeG1sR2VuZXJhdGVkVmFsdWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1HZW5lcmF0ZWRWYWx1ZSh0aGlzLCB4bWxHZW5lcmF0ZWRWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0dlbmVyYXRlZFZhbHVlKCkgewotCQlYbWxHZW5lcmF0ZWRWYWx1ZSB4bWxHZW5lcmF0ZWRWYWx1ZSA9IHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZiAoeG1sR2VuZXJhdGVkVmFsdWUgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0R2VuZXJhdGVkVmFsdWUobnVsbCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgJiYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUuZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKSA9PSB4bWxHZW5lcmF0ZWRWYWx1ZSkpIHsKLQkJCQl0aGlzLmdlbmVyYXRlZFZhbHVlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRHZW5lcmF0ZWRWYWx1ZSh0aGlzLmJ1aWxkR2VuZXJhdGVkVmFsdWUoeG1sR2VuZXJhdGVkVmFsdWUpKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbnZlcnRlciBnZXRDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IGNvbnZlcnRlclR5cGUpIHsKLQkJCS8vIG5vdGU6IHdlIG1heSBhbHNvIGNsZWFyIHRoZSBYTUwgdmFsdWUgd2Ugd2FudDsKLQkJCS8vIGJ1dCBpZiB3ZSBsZWF2ZSBpdCwgdGhlIHJlc3VsdGluZyBzeW5jIHdpbGwgc2NyZXcgdGhpbmdzIHVwLi4uCi0JCQl0aGlzLmNsZWFyWG1sQ29udmVydGVyVmFsdWVzKCk7Ci0JCQlPcm1Db252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGRDb252ZXJ0ZXIoY29udmVydGVyQWRhcHRlcikpOwotCQkJdGhpcy5jb252ZXJ0ZXIuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihPcm1Db252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCSByZXR1cm4gKGNvbnZlcnRlckFkYXB0ZXIgIT0gbnVsbCkgPwotCQkJCWNvbnZlcnRlckFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29udmVydGVyXyhPcm1Db252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCUNvbnZlcnRlciBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhclhtbENvbnZlcnRlclZhbHVlcygpIHsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlhZGFwdGVyLmNsZWFyWG1sVmFsdWUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoKSB7Ci0JCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5ID0gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlPcm1Db252ZXJ0ZXIgb3JtQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLCBmYWN0b3J5KTsKLQkJCWlmIChvcm1Db252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBvcm1Db252ZXJ0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVpbGROdWxsQ29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0NvbnZlcnRlcigpIHsKLQkJT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA9IHRoaXMuZ2V0WG1sQ29udmVydGVyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8odGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5jb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSB7Ci0JCQkJdGhpcy5jb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldENvbnZlcnRlcl8oYWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGFkYXB0ZXIgd2hvc2UgY29udmVydGVyIHZhbHVlIGlzIHNldCBpbiB0aGUgWE1MIG1hcHBpbmcuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBjb252ZXJ0ZXIgdmFsdWVzIGluIHRoZSBYTUwuCi0JICovCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlci5BZGFwdGVyIGdldFhtbENvbnZlcnRlckFkYXB0ZXIoKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuaXNBY3RpdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgYnVpbGROdWxsQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IE51bGxPcm1Db252ZXJ0ZXIodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnZlcnRlciBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIuQWRhcHRlciBnZXRDb252ZXJ0ZXJBZGFwdGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlci5nZXRDb252ZXJ0ZXJUeXBlKCkgPT0gY29udmVydGVyVHlwZSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gZ2V0Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBDT05WRVJURVJfQURBUFRFUlM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlcml2ZWQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEZXJpdmVkKCkgewotCQlyZXR1cm4gdGhpcy5kZXJpdmVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlcml2ZWQoYm9vbGVhbiBkZXJpdmVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZXJpdmVkOwotCQl0aGlzLmRlcml2ZWQgPSBkZXJpdmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVSSVZFRF9QUk9QRVJUWSwgb2xkLCBkZXJpdmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlcml2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpICYmIHRoaXMuYnVpbGREZXJpdmVkXygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVyaXZlZF8oKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuYXR0cmlidXRlSXNEZXJpdmVkSWQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1JZE1hcHBpbmcodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1Db2x1bW5NYXBwaW5nKE9ybUNvbHVtbk1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemVGcm9tKG9sZE1hcHBpbmcuZ2V0Q29sdW1uKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbi5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0SWRzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldElkcygpLnJlbW92ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPcm1Db2x1bW4uT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gKHRoaXMuZGVyaXZlZCAmJiAhIHRoaXMuaXNDb2x1bW5TcGVjaWZpZWQoKSkgPyBudWxsIDogdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlcml2ZWQgJiYgISB0aGlzLmlzQ29sdW1uU3BlY2lmaWVkKCkpID8gbnVsbCA6IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0WG1sQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldENvbHVtbigpOwotCX0KLQotCXB1YmxpYyBYbWxDb2x1bW4gYnVpbGRYbWxDb2x1bW4oKSB7Ci0JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldENvbHVtbih4bWxDb2x1bW4pOwotCQlyZXR1cm4geG1sQ29sdW1uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbENvbHVtbigpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldENvbHVtbihudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbHVtblNwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0KLQkJLy8gSlBBIDIuMDogSWYgdGhlIGNvbHVtbiBpcyBzcGVjaWZpZWQgb3IgaWYgdGhlIElEIGlzIG5vdCBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAsCi0JCS8vIHRoZSBjb2x1bW4gaXMgdmFsaWRhdGVkLgotCQkvLyBKUEEgMS4wOiBUaGUgY29sdW1uIGlzIGFsd2F5cyBiZSB2YWxpZGF0ZWQsIHNpbmNlIHRoZSBJRCBpcyBuZXZlciBtYXBwZWQgYnkgYQotCQkvLyByZWxhdGlvbnNoaXAuCi0JCWlmICh0aGlzLmlzQ29sdW1uU3BlY2lmaWVkKCkgfHwgISB0aGlzLmRlcml2ZWQpIHsKLQkJCXRoaXMuY29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQotCQkvLyBKUEEgMi4wOiBJZiB0aGUgY29sdW1uIGlzIHNwZWNpZmllZCBhbmQgdGhlIElEIGlzIG1hcHBlZCBieSBhIHJlbGF0aW9uc2hpcCwKLQkJLy8gd2UgaGF2ZSBhbiBlcnJvci4KLQkJLy8gSlBBIDEuMDogVGhlIElEIGNhbm5vdCBiZSBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAuCi0JCWlmICh0aGlzLmlzQ29sdW1uU3BlY2lmaWVkKCkgJiYgdGhpcy5kZXJpdmVkKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZENvbHVtblNwZWNpZmllZEFuZERlcml2ZWRNZXNzYWdlKCkpOwotCQl9Ci0KLQkJaWYgKHRoaXMuZ2VuZXJhdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JCXRoaXMuZ2VuZXJhdG9yQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29udmVydGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkQ29sdW1uU3BlY2lmaWVkQW5kRGVyaXZlZE1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkTWVzc2FnZSgKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9DT0xVTU5fU1BFQ0lGSUVELAotCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQl0aGlzLmNvbHVtbi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkTWVzc2FnZShTdHJpbmcgbXNnSUQsIFN0cmluZ1tdIHBhcm1zLCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCW1zZ0lELAotCQkJCUFycmF5VG9vbHMuYWRkKHBhcm1zLCAwLCB0aGlzLmJ1aWxkQXR0cmlidXRlRGVzY3JpcHRpb24oKSksCi0JCQkJdGhpcywKLQkJCQl0ZXh0UmFuZ2UKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZEF0dHJpYnV0ZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gTkxTLmJpbmQodGhpcy5nZXRBdHRyaWJ1dGVEZXNjcmlwdGlvblRlbXBsYXRlKCksIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVEZXNjcmlwdGlvblRlbXBsYXRlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuQVRUUklCVVRFX0RFU0M7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbCwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gbmV3IE5hbWVkQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlCYXNlQ29sdW1uKSBjb2wsIChUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1MmYwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotewotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1Kb2luQ29sdW1uLCBYbWxKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyOwotCi0JcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW47Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneShPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IHRoaXMuYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBqb2luIGNvbHVtbiBjb250YWluZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW5Db250YWluZXIgZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0WG1sQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpIDogdGhpcy5nZXREZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCVhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbiA9IHRoaXMuYnVpbGRYbWxKb2luQ29sdW1uKCk7Ci0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sSm9pbkNvbHVtbik7Ci0JCXRoaXMuZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcigpLmdldEpvaW5Db2x1bW5zKCkuYWRkKGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJcmV0dXJuIGpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW4gYnVpbGRYbWxKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1Kb2luQ29sdW1uKSBqb2luQ29sdW1uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy5nZXRYbWxKb2luQ29sdW1uQ29udGFpbmVyKCkuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRYbWxKb2luQ29sdW1uQ29udGFpbmVyKCkuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSm9pbkNvbHVtbj4gZ2V0WG1sSm9pbkNvbHVtbnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sSm9pbkNvbHVtbj4odGhpcy5nZXRYbWxKb2luQ29sdW1uQ29udGFpbmVyKCkuZ2V0Sm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUpvaW5Db2x1bW4sIFhtbEpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUpvaW5Db2x1bW4sIFhtbEpvaW5Db2x1bW4+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5idWlsZEpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxKb2luQ29sdW1uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0WG1sSm9pbkNvbHVtbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KE9ybUpvaW5Db2x1bW4gY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxDb2x1bW4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Sm9pbkNvbHVtbihPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJT3JtSm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSk9JTl9DT0xVTU5fUFJPUEVSVFksIG9sZCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXREZWZhdWx0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8T3JtSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxPcm1Kb2luQ29sdW1uPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJaWYgKHRoaXMuYnVpbGRzRGVmYXVsdEpvaW5Db2x1bW4oKSkgewotCQkJaWYgKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4odGhpcy5idWlsZEpvaW5Db2x1bW4obnVsbCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmRlZmF1bHRKb2luQ29sdW1uLnVwZGF0ZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbihudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkc0RlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgJiYKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLm1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Kb2luQ29sdW1uKHRoaXMsIHRoaXMuam9pbkNvbHVtbk93bmVyLCB4bWxKb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBvbGRTdHJhdGVneSkgewotCQlmb3IgKFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uIDogb2xkU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkuaW5pdGlhbGl6ZUZyb20oam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgdmlydHVhbFN0cmF0ZWd5KSB7Ci0JCWZvciAoUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB2aXJ0dWFsU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogdHlwZU1hcHBpbmcuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBTb3VyY2UoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiB0eXBlTWFwcGluZy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBTb3VyY2UoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyAhPSBudWxsKSAmJiB0eXBlTWFwcGluZy50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQl9Ci0KLQkvLyBzdWJjbGFzc2VzIGxpa2UgdGhpcyB0byBiZSBwdWJsaWMKLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCVR5cGVNYXBwaW5nIHJlbGF0aW9uc2hpcFRhcmdldCA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0JCXJldHVybiAocmVsYXRpb25zaGlwVGFyZ2V0ID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcFRhcmdldC5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgPyB0eXBlTWFwcGluZy5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpID09IDApIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7Ci0JCWZvciAoaW50IGkgPSB0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOyBpLS0gPiAwOyApIHsKLQkJCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJZm9yIChPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCWpvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg0ZmQyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBSZWFkT25seVRhYmxlLk93bmVyCi17Ci0JcHJvdGVjdGVkIE9ybUpvaW5UYWJsZSBqb2luVGFibGU7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuam9pblRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlSm9pblRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKb2luVGFibGUoT3JtSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlPcm1Kb2luVGFibGUgb2xkID0gdGhpcy5qb2luVGFibGU7Ci0JCXRoaXMuam9pblRhYmxlID0gam9pblRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSk9JTl9UQUJMRV9QUk9QRVJUWSwgb2xkLCBqb2luVGFibGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUpvaW5UYWJsZSgpIHsKLQkJaWYgKHRoaXMuYnVpbGRzSm9pblRhYmxlKCkpIHsKLQkJCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRKb2luVGFibGUodGhpcy5idWlsZEpvaW5UYWJsZSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5qb2luVGFibGUudXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Sm9pblRhYmxlKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0cmF0ZWd5IGNhbiBoYXZlIGEgam9pbiB0YWJsZSBpZiBlaXRoZXIgdGhlIFhNTCB0YWJsZSBpcyBwcmVzZW50Ci0JICogb3IgdGhlIFttYXBwaW5nXSByZWxhdGlvbnNoaXAgc3VwcG9ydHMgYSBkZWZhdWx0IGpvaW4gdGFibGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuZ2V0WG1sSm9pblRhYmxlKCkgIT0gbnVsbCkgfHwKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLm1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUpvaW5UYWJsZSBidWlsZEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Kb2luVGFibGUodGhpcywgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBqb2luIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0WG1sSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxKb2luVGFibGVDb250YWluZXIoKS5nZXRKb2luVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sSm9pblRhYmxlIGJ1aWxkWG1sSm9pblRhYmxlKCkgewotCQlYbWxKb2luVGFibGUgeG1sSm9pblRhYmxlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCk7Ci0JCXRoaXMuZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyKCkuc2V0Sm9pblRhYmxlKHhtbEpvaW5UYWJsZSk7Ci0JCXJldHVybiB4bWxKb2luVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSm9pblRhYmxlKCkgewotCQl0aGlzLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcigpLnNldEpvaW5UYWJsZShudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlQ29udGFpbmVyIGdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0WG1sQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlpZiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5qb2luVGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IG9sZFN0cmF0ZWd5KSB7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IG9sZFN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlpZiAob2xkSm9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkU3RyYXRlZ3koKTsKLQkJCXRoaXMuam9pblRhYmxlLmluaXRpYWxpemVGcm9tKG9sZEpvaW5UYWJsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSB2aXJ0dWFsU3RyYXRlZ3kpIHsKLQkJUmVhZE9ubHlKb2luVGFibGUgb2xkSm9pblRhYmxlID0gdmlydHVhbFN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlpZiAob2xkSm9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkU3RyYXRlZ3koKTsKLQkJCXRoaXMuam9pblRhYmxlLmluaXRpYWxpemVGcm9tVmlydHVhbChvbGRKb2luVGFibGUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5qb2luVGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5qb2luVGFibGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmpvaW5UYWJsZS5nZXREYlRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldFRhYmxlTmFtZSgpLCB0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuRE9FU19OT1RfTUFUQ0hfSk9JTl9UQUJMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZURlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pblRhYmxlRGVmYXVsdE5hbWUodGhpcy5nZXRSZWxhdGlvbnNoaXAoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldEpvaW5UYWJsZSh0aGlzLmJ1aWxkSm9pblRhYmxlKCkpOwotCQkJdGhpcy5idWlsZFhtbEpvaW5UYWJsZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNldEpvaW5UYWJsZShudWxsKTsKLQkJCXRoaXMucmVtb3ZlWG1sSm9pblRhYmxlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMzFjZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGluZ1JlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZzxYIGV4dGVuZHMgWG1sTWFueVRvTWFueT4KLQlleHRlbmRzIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nPFg+Ci0JaW1wbGVtZW50cyBPcm1NYW55VG9NYW55TWFwcGluZzJfMAotewotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVsYXRpb25zaGlwICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwKSBzdXBlci5nZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcCBidWlsZFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDcwOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybU1hbnlUb01hbnlNYXBwaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TWFueVRvTWFueXMoKS5hZGQodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxBdHRyaWJ1dGVNYXBwaW5nRnJvbShBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TWFueVRvTWFueXMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTkyN2JkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gMToxIG1hcHBpbmcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZzxYIGV4dGVuZHMgWG1sTWFueVRvT25lPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nPFg+Ci0JaW1wbGVtZW50cyBPcm1NYW55VG9PbmVNYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWCB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wIGJ1aWxkUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiAoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBzdXBlci5nZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gNDA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtTWFueVRvT25lTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldE1hbnlUb09uZXMoKS5hZGQodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxBdHRyaWJ1dGVNYXBwaW5nRnJvbShBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0TWFueVRvT25lcygpLnJlbW92ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZGEzZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuR2VuZXJpY01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGVkIHN1cGVyY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTWFwcGVkU3VwZXJjbGFzczxYIGV4dGVuZHMgWG1sTWFwcGVkU3VwZXJjbGFzcz4KLQlleHRlbmRzIEFic3RyYWN0T3JtVHlwZU1hcHBpbmc8WD4KLQlpbXBsZW1lbnRzIE9ybU1hcHBlZFN1cGVyY2xhc3MsIE9ybUlkQ2xhc3NSZWZlcmVuY2UuT3duZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtSWRDbGFzc1JlZmVyZW5jZSBpZENsYXNzUmVmZXJlbmNlOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWCB4bWxNYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGVkU3VwZXJjbGFzcyk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZSA9IHRoaXMuYnVpbGRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5pZENsYXNzUmVmZXJlbmNlLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBrZXkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZCBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtSWRDbGFzc1JlZmVyZW5jZSBnZXRJZENsYXNzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gdGhpcy5pZENsYXNzUmVmZXJlbmNlOwotCX0KLQotCXByb3RlY3RlZCBPcm1JZENsYXNzUmVmZXJlbmNlIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtSWRDbGFzc1JlZmVyZW5jZSh0aGlzLCB0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldElkQ2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmlkQ2xhc3NSZWZlcmVuY2UuZ2V0SWRDbGFzcygpOwotCX0KLQotCXB1YmxpYyBYbWxJZENsYXNzQ29udGFpbmVyIGdldFhtbElkQ2xhc3NDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEphdmFJZENsYXNzUmVmZXJlbmNlIGdldEphdmFJZENsYXNzUmVmZXJlbmNlRm9yRGVmYXVsdHMoKSB7Ci0JCUphdmFNYXBwZWRTdXBlcmNsYXNzIGphdmFNYXBwZWRTdXBlcmNsYXNzID0gdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlyZXR1cm4gKGphdmFNYXBwZWRTdXBlcmNsYXNzID09IG51bGwpID8gbnVsbCA6IGphdmFNYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZW50aXR5IG1hcHBpbmdzICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFhtbFR5cGVNYXBwaW5nVG8oWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MpIHsKLQkJZW50aXR5TWFwcGluZ3MuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuYWRkKHRoaXMueG1sVHlwZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbFR5cGVNYXBwaW5nRnJvbShYbWxFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncykgewotCQllbnRpdHlNYXBwaW5ncy5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5yZW1vdmUodGhpcy54bWxUeXBlTWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzIGdldEphdmFUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhTWFwcGVkU3VwZXJjbGFzcykgc3VwZXIuZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gKEphdmFNYXBwZWRTdXBlcmNsYXNzKSBzdXBlci5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IGdldEFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlYWRPbmx5VGFibGU+IGdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxRdWVyeT4gZ2V0UXVlcmllcygpIHsKLQkJLy8gdGhlIG9ybS54bWwgbWFwcGVkIHN1cGVyY2xhc3MgZG9lcyBOT1QgaGF2ZSBxdWVyaWVzKCEpCi0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVJZENsYXNzUmVwbGFjZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlSWRDbGFzc1JlcGxhY2VUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5pZENsYXNzUmVmZXJlbmNlLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVJZENsYXNzTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlSWRDbGFzc01vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzc1JlZmVyZW5jZS5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlSWRDbGFzc1JlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlSWRDbGFzc1JlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaWRDbGFzc1JlZmVyZW5jZS5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVQcmltYXJ5S2V5KG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuaWRDbGFzc1JlZmVyZW5jZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJpbWFyeUtleShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMuYnVpbGRQcmltYXJ5S2V5VmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkUHJpbWFyeUtleVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IodGhpcywgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCQkvLyBUT0RPIC0gSlBBIDIuMCB2YWxpZGF0aW9uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybU1hcHBlZFN1cGVyY2xhc3NUZXh0UmFuZ2VSZXNvbHZlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU1hcHBpbmdSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDM4N2JjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTWFwcGluZ1JlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGluZ1JlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmc7Ci0KLS8qKgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gU3ViY2xhc3NlcyB3aWxsIHdhbnQgdG8gc2V0IHRoZSB7QGxpbmsgI3N0cmF0ZWd5fSBhdCB0aGUKLSAqIGVuZCBvZiB0aGVpciBjb25zdHJ1Y3RvcnM7IG90aGVyd2lzZSwgaXQgd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPiB1bnRpbCBpdAotICogaXMgc2V0IGR1cmluZyB7QGxpbmsgI3VwZGF0ZSgpfS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTWFwcGluZ1JlbGF0aW9uc2hpcDxNIGV4dGVuZHMgT3JtUmVsYXRpb25zaGlwTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXAKLXsKLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIHN0cmF0ZWd5OwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1NYXBwaW5nUmVsYXRpb25zaGlwKE0gcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZVN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1NYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN0cmF0ZWd5KE9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBzdHJhdGVneSkgewotCQlSZWxhdGlvbnNoaXBTdHJhdGVneSBvbGQgPSB0aGlzLnN0cmF0ZWd5OwotCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZFN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBieSBzdWJjbGFzc2VzIHdoZW4gdGhlIHZhcmlvdXMgc3VwcG9ydGVkIHN0cmF0ZWdpZXMgYXJlCi0JICogYWRkZWQgb3IgcmVtb3ZlZDsgYWxsb3dpbmcgdGhlIHN0cmF0ZWd5IHRvIGJlIHNldCBzeW5jaHJvbm91c2x5LiAoPykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdHJhdGVneSgpIHsKLQkJdGhpcy5zZXRTdHJhdGVneSh0aGlzLmJ1aWxkU3RyYXRlZ3koKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb25zICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5UmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQlvbGRSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZU9uKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAoTWFwcGVkQnlSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCS8vIE5PUAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQkvLyBOT1AKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoTSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE0gZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyBnZXRYbWxNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneS5pc092ZXJyaWRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjk2NzQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTWFwS2V5Q29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuUmVsYXRpb25zaGlwU3RyYXRlZ3lUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uTnVsbE9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lk1hcEtleUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Db2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBLZXlFbnVtZXJhdGVkQ29udmVydGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtdWx0aS1yZWxhdGlvbnNoaXAgKDE6bSwgbTptKSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxYIGV4dGVuZHMgQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmc8WD4KLQlpbXBsZW1lbnRzIE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZywgT3JtQ29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtT3JkZXJhYmxlIG9yZGVyYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTWFwS2V5OwotCXByb3RlY3RlZCBib29sZWFuIG5vTWFwS2V5ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcGtNYXBLZXkgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjdXN0b21NYXBLZXkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTWFwS2V5Q2xhc3M7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TWFwS2V5Q2xhc3M7Ci0KLQlwcm90ZWN0ZWQgVHlwZSB2YWx1ZVR5cGU7Ci0JcHJvdGVjdGVkIFR5cGUga2V5VHlwZTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gbWFwS2V5Q29sdW1uOwotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgbWFwS2V5Q29udmVydGVyOyAgLy8gbWFwIGtleSBjb252ZXJ0ZXIgLSBuZXZlciBudWxsCi0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtSm9pbkNvbHVtbiwgWG1sSm9pbkNvbHVtbj4gc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG1hcEtleUpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGRlZmF1bHRNYXBLZXlKb2luQ29sdW1uOwotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9ybUNvbnZlcnRlci5BZGFwdGVyW10gTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUl9BUlJBWSA9IG5ldyBPcm1Db252ZXJ0ZXIuQWRhcHRlcltdIHsKLQkJT3JtTWFwS2V5RW51bWVyYXRlZENvbnZlcnRlcjJfMC5BZGFwdGVyLmluc3RhbmNlKCksCi0JCU9ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyMl8wLkFkYXB0ZXIuaW5zdGFuY2UoKQotCX07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUlMgPSBuZXcgQXJyYXlJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4oTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUl9BUlJBWSk7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFggeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLm9yZGVyYWJsZSA9IHRoaXMuYnVpbGRPcmRlcmFibGUoKTsKLQotCQl0aGlzLnNwZWNpZmllZE1hcEtleSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBLZXkoKTsKLQkJdGhpcy5ub01hcEtleSA9IHRoaXMuYnVpbGROb01hcEtleSgpOwotCQl0aGlzLnBrTWFwS2V5ID0gdGhpcy5idWlsZFBrTWFwS2V5KCk7Ci0JCXRoaXMuY3VzdG9tTWFwS2V5ID0gdGhpcy5idWlsZEN1c3RvbU1hcEtleSgpOwotCi0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTWFwS2V5Q2xhc3MoKTsKLQotCQl0aGlzLm1hcEtleUNvbHVtbiA9IHRoaXMuYnVpbGRNYXBLZXlDb2x1bW4oKTsKLQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkTWFwS2V5Q29udmVydGVyKCk7Ci0JCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdGhpcy5tYXBLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMub3JkZXJhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleV8odGhpcy5idWlsZFNwZWNpZmllZE1hcEtleSgpKTsKLQkJdGhpcy5zZXROb01hcEtleV8odGhpcy5idWlsZE5vTWFwS2V5KCkpOwotCQl0aGlzLnNldFBrTWFwS2V5Xyh0aGlzLmJ1aWxkUGtNYXBLZXkoKSk7Ci0JCXRoaXMuc2V0Q3VzdG9tTWFwS2V5Xyh0aGlzLmJ1aWxkQ3VzdG9tTWFwS2V5KCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3NfKHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQotCQl0aGlzLm1hcEtleUNvbHVtbi5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY01hcEtleUNvbnZlcnRlcigpOwotCi0JCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJdGhpcy5vcmRlcmFibGUudXBkYXRlKCk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0TWFwS2V5Q2xhc3ModGhpcy5idWlsZERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQl0aGlzLnNldFZhbHVlVHlwZSh0aGlzLmJ1aWxkVmFsdWVUeXBlKCkpOwotCQl0aGlzLnNldEtleVR5cGUodGhpcy5idWlsZEtleVR5cGUoKSk7Ci0KLQkJdGhpcy5tYXBLZXlDb2x1bW4udXBkYXRlKCk7Ci0JCXRoaXMubWFwS2V5Q29udmVydGVyLnVwZGF0ZSgpOwotCi0JCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcmRlcmFibGUgKioqKioqKioqKgotCi0JcHVibGljIE9ybU9yZGVyYWJsZSBnZXRPcmRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm9yZGVyYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtT3JkZXJhYmxlIGJ1aWxkT3JkZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5pc09ybVhtbDJfMENvbXBhdGlibGUoKSA/Ci0JCQkJdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkyXzAoKS5idWlsZE9ybU9yZGVyYWJsZSh0aGlzLCB0aGlzLmJ1aWxkT3JkZXJhYmxlT3duZXIoKSkgOgotCQkJCXRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1PcmRlcmFibGUodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIE9yZGVyYWJsZTJfMC5Pd25lciBidWlsZE9yZGVyYWJsZU93bmVyKCkgewotCQlyZXR1cm4gbmV3IE9yZGVyYWJsZU93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIE9yZGVyYWJsZU93bmVyCi0JCWltcGxlbWVudHMgT3JkZXJhYmxlMl8wLk93bmVyCi0JewotCQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0VGFibGVOYW1lKCk7Ci0JCX0KLQkJcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCQlwcm90ZWN0ZWQgT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRNYXBLZXkoKSB7Ci0JCWlmICh0aGlzLm5vTWFwS2V5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5wa01hcEtleSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGVOYW1lKCk7Ci0JCX0KLQkJaWYgKHRoaXMuY3VzdG9tTWFwS2V5KSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBLZXk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidW5rbm93biBtYXAga2V5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXkoU3RyaW5nIG1hcEtleSkgewotCQlpZiAobWFwS2V5ICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5XyhtYXBLZXkpOwotCQkJdGhpcy5zZXROb01hcEtleV8oZmFsc2UpOwotCQkJdGhpcy5zZXRQa01hcEtleV8oZmFsc2UpOwotCQkJdGhpcy5zZXRDdXN0b21NYXBLZXlfKHRydWUpOwotCi0JCQlNYXBLZXkgeG1sTWFwS2V5ID0gdGhpcy5nZXRYbWxNYXBLZXkoKTsKLQkJCWlmICh4bWxNYXBLZXkgPT0gbnVsbCkgewotCQkJCXhtbE1hcEtleSA9IHRoaXMuYnVpbGRYbWxNYXBLZXkoKTsKLQkJCX0KLQkJCXhtbE1hcEtleS5zZXROYW1lKG1hcEtleSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldFBrTWFwS2V5KHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTWFwS2V5XyhTdHJpbmcgbWFwS2V5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE1hcEtleTsKLQkJdGhpcy5zcGVjaWZpZWRNYXBLZXkgPSBtYXBLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBtYXBLZXkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRNYXBLZXkoKSB7Ci0JCU1hcEtleSB4bWxNYXBLZXkgPSB0aGlzLmdldFhtbE1hcEtleSgpOwotCQlyZXR1cm4gKHhtbE1hcEtleSA9PSBudWxsKSA/IG51bGwgOiB4bWxNYXBLZXkuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBubyBtYXAga2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzTm9NYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm5vTWFwS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vTWFwS2V5KGJvb2xlYW4gbm9NYXBLZXkpIHsKLQkJaWYgKG5vTWFwS2V5KSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleV8obnVsbCk7Ci0JCQl0aGlzLnNldE5vTWFwS2V5Xyh0cnVlKTsKLQkJCXRoaXMuc2V0UGtNYXBLZXlfKGZhbHNlKTsKLQkJCXRoaXMuc2V0Q3VzdG9tTWFwS2V5XyhmYWxzZSk7Ci0KLQkJCWlmICh0aGlzLmdldFhtbE1hcEtleSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnJlbW92ZVhtbE1hcEtleSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRQa01hcEtleSh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5vTWFwS2V5Xyhib29sZWFuIG5vTWFwS2V5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5ub01hcEtleTsKLQkJdGhpcy5ub01hcEtleSA9IG5vTWFwS2V5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBub01hcEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGROb01hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sTWFwS2V5KCkgPT0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGsgbWFwIGtleSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1BrTWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy5wa01hcEtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQa01hcEtleShib29sZWFuIHBrTWFwS2V5KSB7Ci0JCWlmIChwa01hcEtleSkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlfKG51bGwpOwotCQkJdGhpcy5zZXROb01hcEtleV8oZmFsc2UpOwotCQkJdGhpcy5zZXRQa01hcEtleV8odHJ1ZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU1hcEtleV8oZmFsc2UpOwotCi0JCQlNYXBLZXkgeG1sTWFwS2V5ID0gdGhpcy5nZXRYbWxNYXBLZXkoKTsKLQkJCWlmICh4bWxNYXBLZXkgPT0gbnVsbCkgewotCQkJCXRoaXMuYnVpbGRYbWxNYXBLZXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJeG1sTWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldE5vTWFwS2V5KHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGtNYXBLZXlfKGJvb2xlYW4gcGtNYXBLZXkpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnBrTWFwS2V5OwotCQl0aGlzLnBrTWFwS2V5ID0gcGtNYXBLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19NQVBfS0VZX1BST1BFUlRZLCBvbGQsIHBrTWFwS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFBrTWFwS2V5KCkgewotCQlNYXBLZXkgeG1sTWFwS2V5ID0gdGhpcy5nZXRYbWxNYXBLZXkoKTsKLQkJcmV0dXJuICh4bWxNYXBLZXkgIT0gbnVsbCkgJiYgKHhtbE1hcEtleS5nZXROYW1lKCkgPT0gbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGN1c3RvbSBtYXAga2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQ3VzdG9tTWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy5jdXN0b21NYXBLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q3VzdG9tTWFwS2V5KGJvb2xlYW4gY3VzdG9tTWFwS2V5KSB7Ci0JCWlmIChjdXN0b21NYXBLZXkpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJdGhpcy5zZXROb01hcEtleSh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbU1hcEtleV8oYm9vbGVhbiBjdXN0b21NYXBLZXkpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmN1c3RvbU1hcEtleTsKLQkJdGhpcy5jdXN0b21NYXBLZXkgPSBjdXN0b21NYXBLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDVVNUT01fTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBjdXN0b21NYXBLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkQ3VzdG9tTWFwS2V5KCkgewotCQlNYXBLZXkgeG1sTWFwS2V5ID0gdGhpcy5nZXRYbWxNYXBLZXkoKTsKLQkJcmV0dXJuICh4bWxNYXBLZXkgIT0gbnVsbCkgJiYgKHhtbE1hcEtleS5nZXROYW1lKCkgIT0gbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHhtbCBtYXAga2V5ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBNYXBLZXkgZ2V0WG1sTWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcEtleSgpOwotCX0KLQotCXByb3RlY3RlZCBNYXBLZXkgYnVpbGRYbWxNYXBLZXkoKSB7Ci0JCU1hcEtleSBtYXBLZXkgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVNYXBLZXkoKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE1hcEtleShtYXBLZXkpOwotCQlyZXR1cm4gbWFwS2V5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbE1hcEtleSgpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE1hcEtleShudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzIDogdGhpcy5kZWZhdWx0TWFwS2V5Q2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoU3RyaW5nIG1hcEtleUNsYXNzKSB7Ci0JCWlmICh0aGlzLnNldFNwZWNpZmllZE1hcEtleUNsYXNzXyhtYXBLZXlDbGFzcykpIHsKLQkJCVhtbENsYXNzUmVmZXJlbmNlIHhtbENsYXNzUmVmID0gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcEtleUNsYXNzKCk7Ci0JCQlpZiAobWFwS2V5Q2xhc3MgPT0gbnVsbCkgewotCQkJCWlmICh4bWxDbGFzc1JlZiAhPSBudWxsKSB7Ci0JCQkJCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRNYXBLZXlDbGFzcyhudWxsKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh4bWxDbGFzc1JlZiA9PSBudWxsKSB7Ci0JCQkJCXhtbENsYXNzUmVmID0gdGhpcy5idWlsZFhtbE1hcEtleUNsYXNzUmVmZXJlbmNlKCk7Ci0JCQkJfQotCQkJCXhtbENsYXNzUmVmLnNldENsYXNzTmFtZShtYXBLZXlDbGFzcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRTcGVjaWZpZWRNYXBLZXlDbGFzc18oU3RyaW5nIG1hcEtleUNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzOwotCQl0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzID0gbWFwS2V5Q2xhc3M7Ci0JCXJldHVybiB0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFksIG9sZCwgbWFwS2V5Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBidWlsZFhtbE1hcEtleUNsYXNzUmVmZXJlbmNlKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSBtYXBLZXlDbGFzcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCk7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRNYXBLZXlDbGFzcyhtYXBLZXlDbGFzcyk7Ci0JCXJldHVybiBtYXBLZXlDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSB7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIHhtbENsYXNzUmVmID0gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcEtleUNsYXNzKCk7Ci0JCXJldHVybiAoeG1sQ2xhc3NSZWYgPT0gbnVsbCkgPyBudWxsIDogeG1sQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNYXBLZXlDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TWFwS2V5Q2xhc3MoU3RyaW5nIG1hcEtleUNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRNYXBLZXlDbGFzczsKLQkJdGhpcy5kZWZhdWx0TWFwS2V5Q2xhc3MgPSBtYXBLZXlDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTUFQX0tFWV9DTEFTU19QUk9QRVJUWSwgb2xkLCBtYXBLZXlDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRNYXBLZXlDbGFzcygpIHsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIChqYXZhQXR0cmlidXRlID09IG51bGwpID8gbnVsbCA6IGphdmFBdHRyaWJ1dGUuZ2V0TXVsdGlSZWZlcmVuY2VNYXBLZXlUeXBlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldE1hcEtleUNsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICckJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb2x2ZWQgbWFwIGtleSBlbWJlZGRhYmxlL2VudGl0eSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgRW1iZWRkYWJsZSBnZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRSZXNvbHZlZE1hcEtleVR5cGVNYXBwaW5nKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFbWJlZGRhYmxlKSA/IChFbWJlZGRhYmxlKSB0eXBlTWFwcGluZyA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRSZXNvbHZlZE1hcEtleUVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlc29sdmVkTWFwS2V5VHlwZU1hcHBpbmcoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgPyAoRW50aXR5KSB0eXBlTWFwcGluZyA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFJlc29sdmVkTWFwS2V5VHlwZU1hcHBpbmcoKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHJlc29sdmVkTWFwS2V5VHlwZSA9IHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlUeXBlKCk7Ci0JCXJldHVybiAocmVzb2x2ZWRNYXBLZXlUeXBlID09IG51bGwpID8gbnVsbCA6IHJlc29sdmVkTWFwS2V5VHlwZS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIGdldFJlc29sdmVkTWFwS2V5VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb2x2ZVBlcnNpc3RlbnRUeXBlKHRoaXMuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIElUeXBlIGdldE1hcEtleUNsYXNzSmR0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmR0VHlwZSh0aGlzLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBUeXBlIGdldFZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlVHlwZShUeXBlIHZhbHVlVHlwZSkgewotCQlUeXBlIG9sZCA9IHRoaXMudmFsdWVUeXBlOwotCQl0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1RZUEVfUFJPUEVSVFksIG9sZCwgdmFsdWVUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZSBidWlsZFZhbHVlVHlwZSgpIHsKLQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTlRJVFlfVFlQRTsKLQkJfQotCQlpZiAodGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTUJFRERBQkxFX1RZUEU7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0VGFyZ2V0RW50aXR5KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIFR5cGUuTk9fVFlQRTsKLQkJfQotCQlyZXR1cm4gVHlwZS5CQVNJQ19UWVBFOwotCX0KLQotCXByb3RlY3RlZCBFbWJlZGRhYmxlIGdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0VHlwZU1hcHBpbmcoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVtYmVkZGFibGUpID8gKEVtYmVkZGFibGUpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKioga2V5IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFR5cGUgZ2V0S2V5VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMua2V5VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRLZXlUeXBlKFR5cGUga2V5VHlwZSkgewotCQlUeXBlIG9sZCA9IHRoaXMua2V5VHlwZTsKLQkJdGhpcy5rZXlUeXBlID0ga2V5VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEtFWV9UWVBFX1BST1BFUlRZLCBvbGQsIGtleVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBUeXBlIGJ1aWxkS2V5VHlwZSgpIHsKLQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbWJlZGRhYmxlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIFR5cGUuRU1CRUREQUJMRV9UWVBFOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlc29sdmVkTWFwS2V5RW50aXR5KCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIFR5cGUuRU5USVRZX1RZUEU7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0TWFwS2V5Q2xhc3MoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5OT19UWVBFOwotCQl9Ci0JCXJldHVybiBUeXBlLkJBU0lDX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Db2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlDb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbHVtbiBidWlsZE1hcEtleUNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Db2x1bW4odGhpcywgdGhpcy5idWlsZE1hcEtleUNvbHVtbk93bmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBPcm1Db2x1bW4uT3duZXIgYnVpbGRNYXBLZXlDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlDb2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBYbWxDb2x1bW4gZ2V0WG1sTWFwS2V5Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCX0KLQotCXByb3RlY3RlZCBYbWxDb2x1bW4gYnVpbGRYbWxNYXBLZXlDb2x1bW4oKSB7Ci0JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE1hcEtleUNvbHVtbih4bWxDb2x1bW4pOwotCQlyZXR1cm4geG1sQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbE1hcEtleUNvbHVtbigpIHsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE1hcEtleUNvbHVtbihudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbnZlcnRlciBnZXRNYXBLZXlDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLm1hcEtleUNvbnZlcnRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDb252ZXJ0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlpZiAodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IGNvbnZlcnRlclR5cGUpIHsKLQkJCS8vIG5vdGU6IHdlIG1heSBhbHNvIGNsZWFyIHRoZSBYTUwgdmFsdWUgd2Ugd2FudDsKLQkJCS8vIGJ1dCBpZiB3ZSBsZWF2ZSBpdCwgdGhlIHJlc3VsdGluZyBzeW5jIHdpbGwgc2NyZXcgdGhpbmdzIHVwLi4uCi0JCQl0aGlzLmNsZWFyWG1sTWFwS2V5Q29udmVydGVyVmFsdWVzKCk7Ci0JCQlPcm1Db252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyID0gdGhpcy5nZXRNYXBLZXlDb252ZXJ0ZXJBZGFwdGVyKGNvbnZlcnRlclR5cGUpOwotCQkJdGhpcy5zZXRNYXBLZXlDb252ZXJ0ZXJfKHRoaXMuYnVpbGRNYXBLZXlDb252ZXJ0ZXIoY29udmVydGVyQWRhcHRlcikpOwotCQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIuaW5pdGlhbGl6ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZE1hcEtleUNvbnZlcnRlcihPcm1Db252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCSByZXR1cm4gKGNvbnZlcnRlckFkYXB0ZXIgIT0gbnVsbCkgPwotCQkJCWNvbnZlcnRlckFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSkgOgotCQkJCXRoaXMuYnVpbGROdWxsTWFwS2V5Q29udmVydGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwS2V5Q29udmVydGVyXyhPcm1Db252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCUNvbnZlcnRlciBvbGQgPSB0aGlzLm1hcEtleUNvbnZlcnRlcjsKLQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBfS0VZX0NPTlZFUlRFUl9QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyWG1sTWFwS2V5Q29udmVydGVyVmFsdWVzKCkgewotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWFkYXB0ZXIuY2xlYXJYbWxWYWx1ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZE1hcEtleUNvbnZlcnRlcigpIHsKLQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkgPSB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpOwotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCU9ybUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBhZGFwdGVyLmJ1aWxkQ29udmVydGVyKHRoaXMsIGZhY3RvcnkpOwotCQkJaWYgKG9ybUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9ybUNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxNYXBLZXlDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jTWFwS2V5Q29udmVydGVyKCkgewotCQlPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyID0gdGhpcy5nZXRYbWxNYXBLZXlDb252ZXJ0ZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCWlmICh0aGlzLm1hcEtleUNvbnZlcnRlci5nZXRUeXBlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0TWFwS2V5Q29udmVydGVyXyh0aGlzLmJ1aWxkTnVsbE1hcEtleUNvbnZlcnRlcigpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLm1hcEtleUNvbnZlcnRlci5nZXRUeXBlKCkgPT0gYWRhcHRlci5nZXRDb252ZXJ0ZXJUeXBlKCkpIHsKLQkJCQl0aGlzLm1hcEtleUNvbnZlcnRlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0TWFwS2V5Q29udmVydGVyXyhhZGFwdGVyLmJ1aWxkTmV3Q29udmVydGVyKHRoaXMsIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgYWRhcHRlciB3aG9zZSBjb252ZXJ0ZXIgdmFsdWUgaXMgc2V0IGluIHRoZSBYTUwgbWFwcGluZy4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNvbnZlcnRlciB2YWx1ZXMgaW4gdGhlIFhNTC4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyLkFkYXB0ZXIgZ2V0WG1sTWFwS2V5Q29udmVydGVyQWRhcHRlcigpIHsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRNYXBLZXlDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0FjdGl2ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZE51bGxNYXBLZXlDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTnVsbE9ybUNvbnZlcnRlcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyLkFkYXB0ZXIgZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IGdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUlM7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcih0aGlzLCB0aGlzLmJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIgYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCkgewotCQlyZXR1cm4gbmV3IE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldFNwZWNpZmllZEphdmFNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUphdmFDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhQ29sbGVjdGlvbk1hcHBpbmcgPSB0aGlzLmdldEphdmFDb2xsZWN0aW9uTWFwcGluZygpOwotCQlyZXR1cm4gKGphdmFDb2xsZWN0aW9uTWFwcGluZyA9PSBudWxsKSA/IG51bGwgOgotCQkJamF2YUNvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbGxlY3Rpb25NYXBwaW5nMl8wIGdldEphdmFDb2xsZWN0aW9uTWFwcGluZygpIHsKLQkJQXR0cmlidXRlTWFwcGluZyBqYXZhQXR0cmlidXRlTWFwcGluZyA9IHRoaXMuZ2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJcmV0dXJuIChqYXZhQXR0cmlidXRlTWFwcGluZy5nZXRLZXkoKSA9PSB0aGlzLmdldEtleSgpKSA/Ci0JCQkJKEphdmFDb2xsZWN0aW9uTWFwcGluZzJfMCkgamF2YUF0dHJpYnV0ZU1hcHBpbmcgOgotCQkJCW51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hcHBpbmcgZ2V0SmF2YUF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCXJldHVybiAoamF2YUF0dHJpYnV0ZSA9PSBudWxsKSA/IG51bGwgOiBqYXZhQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQl9Ci0JLy8gKioqKioqKioqKiBtYXAga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldE1hcEtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpIDogdGhpcy5nZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIG1hcCBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4odGhpcy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gdGhpcy5idWlsZFhtbEpvaW5Db2x1bW4oKTsKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSm9pbkNvbHVtbiBidWlsZFhtbEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKE9ybUpvaW5Db2x1bW4pIGpvaW5Db2x1bW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5zcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxKb2luQ29sdW1uPiBnZXRYbWxNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxKb2luQ29sdW1uPih0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRNYXBLZXlKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtSm9pbkNvbHVtbiwgWG1sSm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCkgewotCQlTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIGpvaW4gY29sdW1uIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtSm9pbkNvbHVtbiwgWG1sSm9pbkNvbHVtbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfTUFQX0tFWV9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChYbWxKb2luQ29sdW1uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuYnVpbGRNYXBLZXlKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSm9pbkNvbHVtbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFhtbE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxKb2luQ29sdW1uIGdldFJlc291cmNlRWxlbWVudChPcm1Kb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29sdW1uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZE1hcEtleUpvaW5Db2x1bW4oWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtSm9pbkNvbHVtbih0aGlzLCB0aGlzLm1hcEtleUpvaW5Db2x1bW5Pd25lciwgeG1sSm9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZE1hcEtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBtYXAga2V5IGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbihPcm1Kb2luQ29sdW1uIG1hcEtleUpvaW5Db2x1bW4pIHsKLQkJT3JtSm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uID0gbWFwS2V5Sm9pbkNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTUFQX0tFWV9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgb2xkLCBtYXBLZXlKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPih0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPE9ybUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbih0aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbihudWxsKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4udXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRzRGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSAmJgotCQkJCWdldEtleVR5cGUoKSA9PSBUeXBlLkVOVElUWV9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBtYXBwaW5nJ3MgSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEphdmFUYXJnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE11bHRpUmVmZXJlbmNlVGFyZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkRGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBbGxUYXJnZXRFbnRpdHlBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQl0aGlzLmFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQkJc3VwZXIuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQlTdHJpbmcga2V5VHlwZU5hbWUgPSAoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKCk7Ci0JCWlmIChrZXlUeXBlTmFtZSAhPSBudWxsKSB7Ci0JCQl0eXBlQXJndW1lbnROYW1lcy5hZGQoa2V5VHlwZU5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVOYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUodGhpcyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZU1hcEtleUNsYXNzUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBLZXlDbGFzc1JlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzICE9IG51bGwpIHsKLQkJCVBlcnNpc3RlbnRUeXBlIG1hcEtleVR5cGUgPSB0aGlzLmdldFJlc29sdmVkTWFwS2V5VHlwZSgpOwotCQkJaWYgKChtYXBLZXlUeXBlICE9IG51bGwpICYmIG1hcEtleVR5cGUuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZU1hcEtleUNsYXNzUmVuYW1lVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZU1hcEtleUNsYXNzUmVuYW1lVHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmNyZWF0ZVJlbmFtZU1hcEtleUNsYXNzRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVNYXBLZXlDbGFzc01vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1hcEtleUNsYXNzTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzcyAhPSBudWxsKSB7Ci0JCQlQZXJzaXN0ZW50VHlwZSBtYXBLZXlUeXBlID0gdGhpcy5nZXRSZXNvbHZlZE1hcEtleVR5cGUoKTsKLQkJCWlmICgobWFwS2V5VHlwZSAhPSBudWxsKSAmJiBtYXBLZXlUeXBlLmlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVNYXBLZXlDbGFzc1JlbmFtZVBhY2thZ2VFZGl0KG5ld1BhY2thZ2UuZ2V0RWxlbWVudE5hbWUoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZU1hcEtleUNsYXNzUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBLZXlDbGFzc1JlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgIT0gbnVsbCkgewotCQkJUGVyc2lzdGVudFR5cGUgbWFwS2V5VHlwZSA9IHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlUeXBlKCk7Ci0JCQlpZiAoKG1hcEtleVR5cGUgIT0gbnVsbCkgJiYgbWFwS2V5VHlwZS5pc0luKG9yaWdpbmFsUGFja2FnZSkpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVNYXBLZXlDbGFzc1JlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlTWFwS2V5Q2xhc3NSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmNyZWF0ZVJlbmFtZU1hcEtleUNsYXNzUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLm9yZGVyYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlTWFwS2V5Q2xhc3MobWVzc2FnZXMpOwotCQl0aGlzLnZhbGlkYXRlTWFwS2V5KG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGVNYXBLZXkoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAodGhpcy5nZXRNYXBLZXkoKSAhPSBudWxsKSB7Ci0JCQkvL1RPRE8gdmFsaWRhdGUgdGhhdCB0aGUgbWFwIGtleSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYXR0cmlidXRlCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHRoaXMua2V5VHlwZSA9PSBUeXBlLkJBU0lDX1RZUEUpIHsKLQkJCXRoaXMubWFwS2V5Q29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQl0aGlzLm1hcEtleUNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMua2V5VHlwZSA9PSBUeXBlLkVOVElUWV9UWVBFKSB7Ci0JCQlmb3IgKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IHRoaXMuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJCWpvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0aGlzLmtleVR5cGUgPT0gVHlwZS5FTUJFRERBQkxFX1RZUEUpIHsKLQkJCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJCS8vdmFsaWRhdGUgbWFwIGtleSBhc3NvY2lhdGlvbiBvdmVycmlkZXMKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwS2V5Q2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKChqYXZhQXR0cmlidXRlICE9IG51bGwpICYmIGphdmFBdHRyaWJ1dGUuZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbigpLmlzTWFwKCkpIHsKLQkJCXRoaXMudmFsaWRhdGVNYXBLZXlDbGFzc18obWVzc2FnZXMpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBLZXlDbGFzc18oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0TWFwS2V5Q2xhc3MoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQsCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRNYXBLZXlDbGFzc1RleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICggISB0aGlzLm1hcEtleUNsYXNzRXhpc3RzKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfQ0xBU1NfTk9UX0VYSVNULAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0TWFwS2V5Q2xhc3NUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXBLZXlDbGFzc0V4aXN0cygpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUpkdFR5cGUodGhpcy5nZXRNYXBLZXlDbGFzcygpKSAhPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0TWFwS2V5Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldE1hcEtleUNsYXNzVGV4dFJhbmdlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhYnN0cmFjdCBvd25lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzb21lIGNvbW1vbiBiZWhhdmlvcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBBYnN0cmFjdE93bmVyCi0JewotCQlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS5nZXRUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBNYXBLZXlDb2x1bW5Pd25lcgotCQlleHRlbmRzIEFic3RyYWN0T3duZXIKLQkJaW1wbGVtZW50cyBPcm1Db2x1bW4uT3duZXIKLQl7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldE5hbWUoKSArICJfS0VZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgWG1sQ29sdW1uIGdldFhtbENvbHVtbigpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFhtbE1hcEtleUNvbHVtbigpOwotCQl9Ci0KLQkJcHVibGljIFhtbENvbHVtbiBidWlsZFhtbENvbHVtbigpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmJ1aWxkWG1sTWFwS2V5Q29sdW1uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVYbWxDb2x1bW4oKSB7Ci0JCQlBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLnJlbW92ZVhtbE1hcEtleUNvbHVtbigpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlDb2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUJhc2VDb2x1bW4pIGNvbHVtbiwgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgUmVsYXRpb25zaGlwU3RyYXRlZ3lUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIodGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RPd25lcgotCQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFJlc29sdmVkTWFwS2V5RW1iZWRkYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpIHsKLQkJCVR5cGVNYXBwaW5nIG92ZXJyaWRkZW5UeXBlTWFwcGluZyA9IHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOwotCQkJcmV0dXJuIChvdmVycmlkZGVuVHlwZU1hcHBpbmcgIT0gbnVsbCkgPyBvdmVycmlkZGVuVHlwZU1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlIGdldFNwZWNpZmllZEphdmFBdHRyaWJ1dGVPdmVycmlkZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRTcGVjaWZpZWRKYXZhTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFPdmVycmlkZU5hbWVzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldFhtbE92ZXJyaWRlcygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uKHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCB0YWJsZSBuYW1lIGl0IG5lZWRzIHRvIGJlIHRoZSBzYW1lCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUuICB0aGUgdGFibGUgaXMgYWx3YXlzIHRoZSBjb2xsZWN0aW9uIHRhYmxlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldERlZmF1bHRUYWJsZU5hbWUoKSwgdGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRPdmVycmlkZVZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBPdmVycmlkZUNvbnRhaW5lciBjb250YWluZXIsIE92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSwgKEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKSBjb250YWluZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgRW1iZWRkYWJsZU92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIGNvbHVtbiwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBSZWxhdGlvbnNoaXBTdHJhdGVneVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcih0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBNYXBLZXlKb2luQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBNYXBLZXlKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0U3RyYXRlZ3koKS5nZXRUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldE5hbWUoKSArICJfS0VZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBtYXAga2V5IGpvaW4gY29sdW1uIGNhbiBiZSBvbiBhIHNlY29uZGFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZy50aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRSZXNvbHZlZE1hcEtleUVudGl0eSgpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBqb2luQ29sdW1uSXNEZWZhdWx0KFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLnRoaXMuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcEtleUpvaW5Db2x1bW5WYWxpZGF0b3IoCi0JCQkJdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksCi0JCQkJKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLAotCQkJCXRoaXMsIAotCQkJCShKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCW5ldyBSZWxhdGlvbnNoaXBTdHJhdGVneVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcihnZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZjgyMTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1OYW1lZENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT48dWw+Ci0gKiA8bGk+Y29sdW1uCi0gKiA8bGk+am9pbiBjb2x1bW4KLSAqIDxsaT5kaXNjcmltaW5hdG9yIGNvbHVtbgotICogPGxpPm9yZGVyIGNvbHVtbgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8L3VsPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gYW55IHN1YmNsYXNzIHRoYXQgZGlyZWN0bHkgaG9sZHMgaXRzIFhNTCBjb2x1bW4gbXVzdDo8dWw+Ci0gKiA8bGk+Y2FsbCB0aGUgInN1cGVyIiBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGFuIFhNTCBjb2x1bW4KLSAqICAgICB7QGxpbmsgI0Fic3RyYWN0T3JtTmFtZWRDb2x1bW4oWG1sQ29udGV4dE5vZGUsIE9ybVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIsIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4pfQotICogPGxpPm92ZXJyaWRlIHtAbGluayAjc2V0WG1sQ29sdW1uKEFic3RyYWN0WG1sTmFtZWRDb2x1bW4pfSB0byBzZXQgdGhlIFhNTCBjb2x1bW4KLSAqICAgICBzbyBpdCBpcyBpbiBwbGFjZSBiZWZvcmUgdGhlIGNvbHVtbidzIHN0YXRlIChlLmcuIHtAbGluayAjc3BlY2lmaWVkTmFtZX0pCi0gKiAgICAgaXMgaW5pdGlhbGl6ZWQKLSAqIDwvdWw+Ci0gKiBUeXBpY2FsbHksIGEgY29sdW1uIGJlbG9uZ2luZyB0byBhIGxpc3Qgb2YgY29sdW1ucyB3aWxsIGRpcmVjdGx5IGhvbGQgaXRzIFhNTAotICogY29sdW1uOyBzaW5jZSB0aGUgY29udGV4dCBjb2x1bW4gb25seSBleGlzdHMgaWYgdGhlIFhNTCBjb2x1bW4gZXhpc3RzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1OYW1lZENvbHVtbjxYIGV4dGVuZHMgWG1sTmFtZWRDb2x1bW4sIE8gZXh0ZW5kcyBPcm1SZWFkT25seU5hbWVkQ29sdW1uLk93bmVyPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtTmFtZWRDb2x1bW4KLXsKLQlwcm90ZWN0ZWQgZmluYWwgTyBvd25lcjsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgTyBvd25lcikgewotCQl0aGlzKHBhcmVudCwgb3duZXIsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgTyBvd25lciwgWCB4bWxDb2x1bW4pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnNldFhtbENvbHVtbih4bWxDb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTmFtZSgpOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSB0aGlzLmJ1aWxkQ29sdW1uRGVmaW5pdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRoaXMuYnVpbGRTcGVjaWZpZWROYW1lKCkpOwotCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb25fKHRoaXMuYnVpbGRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5idWlsZERlZmF1bHROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYTUwgY29sdW1uICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBYTUwgY29sdW1uIGRvZXMgbm90IGV4aXN0cy4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgWCBnZXRYbWxDb2x1bW4oKTsKLQotCS8qKgotCSAqIHNlZSBjbGFzcyBjb21tZW50Li4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sQ29sdW1uKFggeG1sQ29sdW1uKSB7Ci0JCWlmICh4bWxDb2x1bW4gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhpcyBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuIGlmIHRoZSBYTUwgY29sdW1uIGlzIG5vdCBudWxsOiAiICsgeG1sQ29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIFhNTCBjb2x1bW4gaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJvdGVjdGVkIFggZ2V0WG1sQ29sdW1uRm9yVXBkYXRlKCkgewotCQlYIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uKCk7Ci0JCXJldHVybiAoeG1sQ29sdW1uICE9IG51bGwpID8geG1sQ29sdW1uIDogdGhpcy5idWlsZFhtbENvbHVtbigpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBYIGJ1aWxkWG1sQ29sdW1uKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDb2x1bW5JZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxDb2x1bW4oKS5pc1Vuc2V0KCkpIHsKLQkJCXRoaXMucmVtb3ZlWG1sQ29sdW1uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCByZW1vdmVYbWxDb2x1bW4oKTsKLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE5hbWUgOiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZE5hbWUsIG5hbWUpKSB7Ci0JCQlYIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKG5hbWUpOwotCQkJeG1sQ29sdW1uLnNldE5hbWUobmFtZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENvbHVtbklmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkTmFtZSgpIHsKLQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbigpOwotCQlyZXR1cm4gKHhtbENvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB4bWxDb2x1bW4uZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHROYW1lOwotCQl0aGlzLmRlZmF1bHROYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRDb2x1bW5OYW1lKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gZGVmaW5pdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgY29sdW1uRGVmaW5pdGlvbikgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5jb2x1bW5EZWZpbml0aW9uLCBjb2x1bW5EZWZpbml0aW9uKSkgewotCQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRDb2x1bW5EZWZpbml0aW9uXyhjb2x1bW5EZWZpbml0aW9uKTsKLQkJCXhtbENvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbkRlZmluaXRpb24pOwotCQkJdGhpcy5yZW1vdmVYbWxDb2x1bW5JZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uXyhTdHJpbmcgY29sdW1uRGVmaW5pdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSBjb2x1bW5EZWZpbml0aW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZCwgY29sdW1uRGVmaW5pdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuICh4bWxDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogeG1sQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbHVtbiBnZXREYkNvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIucmVzb2x2ZURiVGFibGUodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLiBUaGlzIGlzIG92ZXJyaWRkZW4gaW4KLQkgKiB7QGxpbmsgQWJzdHJhY3RPcm1CYXNlQ29sdW1ufSAoYW5kIG90aGVyIHBsYWNlcykgd2hlcmUgYSB0YWJsZSBjYW4gYmUKLQkgKiBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYkNvbHVtbigpICE9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5idWlsZENvbHVtblZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sQ29sdW1uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5vd25lci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxDb2x1bW5UZXh0UmFuZ2UoKSB7Ci0JCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuICh4bWxDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogeG1sQ29sdW1uLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRYbWxDb2x1bW5OYW1lVGV4dFJhbmdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbigpOwotCQlyZXR1cm4gKHhtbENvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB4bWxDb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgc3ViY2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiNpc1ZpcnR1YWwoKX0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlOYW1lZENvbHVtbiBvbGRDb2x1bW4pIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lKG9sZENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb24ob2xkQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5TmFtZWRDb2x1bW4gdmlydHVhbENvbHVtbikgewotCQl0aGlzLnNldFNwZWNpZmllZE5hbWUodmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQl0aGlzLnNldENvbHVtbkRlZmluaXRpb24odmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJU3RyaW5nIHRhYmxlID0gdGhpcy5nZXRUYWJsZSgpOwotCQlpZiAodGFibGUgIT0gbnVsbCkgewotCQkJc2IuYXBwZW5kKHRhYmxlKTsKLQkJCXNiLmFwcGVuZCgnLicpOwotCQl9Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmODFkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjxDIGV4dGVuZHMgT3JtUmVhZE9ubHlOYW1lZENvbHVtbj4KLQlpbXBsZW1lbnRzIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQyBjb2x1bW47Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIoQyBjb2x1bW4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0YTdjN2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk51bGxPcm1PcnBoYW5SZW1vdmFsMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1PbmVUb01hbnlNYXBwaW5nPFggZXh0ZW5kcyBYbWxPbmVUb01hbnk+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzxYPgotCWltcGxlbWVudHMgT3JtT25lVG9NYW55TWFwcGluZzJfMCwgT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMAotewotCXByb3RlY3RlZCBmaW5hbCBPcm1PcnBoYW5SZW1vdmFibGUyXzAgb3JwaGFuUmVtb3ZhbDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWCB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JCXRoaXMub3JwaGFuUmVtb3ZhbCA9IHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMub3JwaGFuUmVtb3ZhbC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcnBoYW4gcmVtb3ZhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiB0aGlzLm9ycGhhblJlbW92YWw7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU9ycGhhblJlbW92YWJsZTJfMCBidWlsZE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiB0aGlzLmlzT3JtWG1sMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeTJfMCgpLmJ1aWxkT3JtT3JwaGFuUmVtb3ZhbCh0aGlzKSA6Ci0JCQkJbmV3IE51bGxPcm1PcnBoYW5SZW1vdmFsMl8wKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWxhdGlvbnNoaXAgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCBidWlsZFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwKHRoaXMsIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gKE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDUwOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybU9uZVRvTWFueU1hcHBpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCXJlc291cmNlQXR0cmlidXRlcy5nZXRPbmVUb01hbnlzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldE9uZVRvTWFueXMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMwMjExOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBpbmdSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uTnVsbE9ybU9ycGhhblJlbW92YWwyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IDE6MSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZzxYIGV4dGVuZHMgWG1sT25lVG9PbmU+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8WD4KLQlpbXBsZW1lbnRzIE9ybU9uZVRvT25lTWFwcGluZzJfMCwgT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMAotewotCXByb3RlY3RlZCBmaW5hbCBPcm1PcnBoYW5SZW1vdmFibGUyXzAgb3JwaGFuUmVtb3ZhbDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtT25lVG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsID0gdGhpcy5idWlsZE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm9ycGhhblJlbW92YWwudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9ycGhhbiByZW1vdmFsICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkT3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNPcm1YbWwyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5Ml8wKCkuYnVpbGRPcm1PcnBoYW5SZW1vdmFsKHRoaXMpIDoKLQkJCQluZXcgTnVsbE9ybU9ycGhhblJlbW92YWwyXzAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gKE9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBzdXBlci5nZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcCBidWlsZFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gNjA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtT25lVG9PbmVNYXBwaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyhBdHRyaWJ1dGVzIHJlc291cmNlQXR0cmlidXRlcykgewotCQlyZXNvdXJjZUF0dHJpYnV0ZXMuZ2V0T25lVG9PbmVzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldE9uZVRvT25lcygpLnJlbW92ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJiYTRmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkV4cHJlc3Npb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHF1ZXJ5Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVF1ZXJ5PFggZXh0ZW5kcyBYbWxRdWVyeT4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVF1ZXJ5Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFggeG1sUXVlcnk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHF1ZXJ5OwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVF1ZXJ5SGludCwgWG1sUXVlcnlIaW50PiBxdWVyeUhpbnRDb250YWluZXI7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVF1ZXJ5KFhtbENvbnRleHROb2RlIHBhcmVudCwgWCB4bWxRdWVyeSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbFF1ZXJ5ID0geG1sUXVlcnk7Ci0JCXRoaXMubmFtZSA9IHhtbFF1ZXJ5LmdldE5hbWUoKTsKLQkJdGhpcy5xdWVyeSA9IHRoaXMuZ2V0VW5lc2NhcGVkUXVlcnkoKTsKLQkJdGhpcy5xdWVyeUhpbnRDb250YWluZXIgPSB0aGlzLmJ1aWxkSGludENvbnRhaW5lcigpOwotCX0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLnhtbFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCXRoaXMuc2V0UXVlcnlfKHRoaXMuZ2V0VW5lc2NhcGVkUXVlcnkoKSk7Ci0JCXRoaXMuc3luY0hpbnRzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldEhpbnRzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuc2V0TmFtZV8obmFtZSk7Ci0JCXRoaXMueG1sUXVlcnkuc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcnkgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KSB7Ci0JCXRoaXMuc2V0UXVlcnlfKHF1ZXJ5KTsKLQkJdGhpcy54bWxRdWVyeS5zZXRRdWVyeShxdWVyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UXVlcnlfKFN0cmluZyBxdWVyeSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5xdWVyeTsKLQkJdGhpcy5xdWVyeSA9IHF1ZXJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfUFJPUEVSVFksIG9sZCwgcXVlcnkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5lc2NhcGVkUXVlcnkoKSB7Ci0JCVN0cmluZyBxdWVyeVN0cmluZyA9IHRoaXMueG1sUXVlcnkuZ2V0UXVlcnkoKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkocXVlcnlTdHJpbmcpKSB7Ci0JCQlxdWVyeVN0cmluZyA9IEV4cHJlc3Npb25Ub29scy51bmVzY2FwZShxdWVyeVN0cmluZywgbmV3IGludFsxXSk7Ci0JCX0KLQkJcmV0dXJuIHF1ZXJ5U3RyaW5nOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBoaW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVF1ZXJ5SGludD4gZ2V0SGludHMoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5SGludENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEhpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlIaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtUXVlcnlIaW50IGFkZEhpbnQoKSB7Ci0JCXJldHVybiB0aGlzLmFkZEhpbnQodGhpcy5nZXRIaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybVF1ZXJ5SGludCBhZGRIaW50KGludCBpbmRleCkgewotCQlYbWxRdWVyeUhpbnQgeG1sSGludCA9IHRoaXMuYnVpbGRYbWxRdWVyeUhpbnQoKTsKLQkJT3JtUXVlcnlIaW50IGhpbnQgPSB0aGlzLnF1ZXJ5SGludENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sSGludCk7Ci0JCXRoaXMueG1sUXVlcnkuZ2V0SGludHMoKS5hZGQoaW5kZXgsIHhtbEhpbnQpOwotCQlyZXR1cm4gaGludDsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUXVlcnlIaW50IGJ1aWxkWG1sUXVlcnlIaW50KCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUXVlcnlIaW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSGludChRdWVyeUhpbnQgaGludCkgewotCQl0aGlzLnJlbW92ZUhpbnQodGhpcy5xdWVyeUhpbnRDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1RdWVyeUhpbnQpIGhpbnQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVIaW50KGludCBpbmRleCkgewotCQl0aGlzLnF1ZXJ5SGludENvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JCXRoaXMueG1sUXVlcnkuZ2V0SGludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMucXVlcnlIaW50Q29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnhtbFF1ZXJ5LmdldEhpbnRzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1RdWVyeUhpbnQgYnVpbGRIaW50KFhtbFF1ZXJ5SGludCB4bWxIaW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUXVlcnlIaW50KHRoaXMsIHhtbEhpbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNIaW50cygpIHsKLQkJdGhpcy5xdWVyeUhpbnRDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUXVlcnlIaW50PiBnZXRYbWxIaW50cygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxRdWVyeUhpbnQ+KHRoaXMueG1sUXVlcnkuZ2V0SGludHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVF1ZXJ5SGludCwgWG1sUXVlcnlIaW50PiBidWlsZEhpbnRDb250YWluZXIoKSB7Ci0JCUhpbnRDb250YWluZXIgY29udGFpbmVyID0gbmV3IEhpbnRDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBxdWVyeSBoaW50IGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBIaW50Q29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtUXVlcnlIaW50LCBYbWxRdWVyeUhpbnQ+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gSElOVFNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybVF1ZXJ5SGludCBidWlsZENvbnRleHRFbGVtZW50KFhtbFF1ZXJ5SGludCByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVF1ZXJ5LnRoaXMuYnVpbGRIaW50KHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUXVlcnlIaW50PiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtUXVlcnkudGhpcy5nZXRYbWxIaW50cygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sUXVlcnlIaW50IGdldFJlc291cmNlRWxlbWVudChPcm1RdWVyeUhpbnQgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxRdWVyeUhpbnQoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEpwYUpwcWxRdWVyeUhlbHBlciBxdWVyeUhlbHBlciwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlTmFtZShtZXNzYWdlcyk7Ci0JCXRoaXMudmFsaWRhdGVRdWVyeShxdWVyeUhlbHBlciwgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfTkFNRV9VTkRFRklORUQsCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRdWVyeShKcGFKcHFsUXVlcnlIZWxwZXIgcXVlcnlIZWxwZXIsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5xdWVyeSkpewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfU1RBVEVNRU5UX1VOREVGSU5FRCwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLm5hbWV9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnZhbGlkYXRlUXVlcnlfKHF1ZXJ5SGVscGVyLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVRdWVyeV8oSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMueG1sUXVlcnkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbFF1ZXJ5LmdldE5hbWVUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRRdWVyeVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbFF1ZXJ5LmdldFF1ZXJ5VGV4dFJhbmdlKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXROYW1lKCksIHF1ZXJ5LmdldE5hbWUoKSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRRdWVyeSgpLCBxdWVyeS5nZXRRdWVyeSgpKSAmJgotCQkJCWhpbnRzQXJlSWRlbnRpY2FsKHF1ZXJ5LmdldEhpbnRzKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoaW50c0FyZUlkZW50aWNhbChMaXN0SXRlcmFibGU8PyBleHRlbmRzIFF1ZXJ5SGludD4gaGludHMpIHsKLQkJYm9vbGVhbiBpc0lkZW50aWNhbCA9IHRydWU7Ci0JCWlmICh0aGlzLmdldEhpbnRzU2l6ZSgpICE9IENvbGxlY3Rpb25Ub29scy5zaXplKGhpbnRzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaT0wOyBpPHRoaXMuZ2V0SGludHNTaXplKCk7IGkrKykgewotCQkJCQlpZiAoIShDb2xsZWN0aW9uVG9vbHMuZ2V0KHRoaXMuZ2V0SGludHMoKSwgaSkpLmlzSWRlbnRpY2FsKENvbGxlY3Rpb25Ub29scy5nZXQoaGludHMsIGkpKSkgewotCQkJCQkJaXNJZGVudGljYWwgPSBmYWxzZTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0lkZW50aWNhbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChYbWxDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFggZ2V0WG1sUXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFF1ZXJ5OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTk3ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxTdHJpbmc+IGNvbHVtbk5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQotCXB1YmxpYyBBYnN0cmFjdE9ybVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludChYbWxDb250ZXh0Tm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIG5hbWVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMuY29sdW1uTmFtZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uTmFtZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5nZXQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDb2x1bW5OYW1lcygpIHsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QodGhpcy5nZXRSZXNvdXJjZUNvbHVtbk5hbWVzKCksIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZUNvbHVtbk5hbWVzKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmNvbHVtbk5hbWVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjM0NThiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiByZWxhdGlvbnNoaXAgbWFwcGluZyAoMToxLCAxOm0sIG06MSwgbTptKQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBNYXBwaW5nPFggZXh0ZW5kcyBBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WD4KLQlpbXBsZW1lbnRzIE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhcmdldEVudGl0eTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYXJnZXRFbnRpdHk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXA7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ2FzY2FkZSBjYXNjYWRlOwotCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBzcGVjaWZpZWRGZXRjaDsKLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGRlZmF1bHRGZXRjaDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWCB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5ID0geG1sTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAgPSB0aGlzLmJ1aWxkUmVsYXRpb25zaGlwKCk7Ci0JCXRoaXMuY2FzY2FkZSA9IHRoaXMuYnVpbGRDYXNjYWRlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRmV0Y2goKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHlfKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCXRoaXMucmVsYXRpb25zaGlwLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jYXNjYWRlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8odGhpcy5idWlsZFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFRhcmdldEVudGl0eSh0aGlzLmJ1aWxkRGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAudXBkYXRlKCk7Ci0JCXRoaXMuY2FzY2FkZS51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0RmV0Y2godGhpcy5idWlsZERlZmF1bHRGZXRjaCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFyZ2V0IGVudGl0eSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5IDogdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFN0cmluZyBlbnRpdHkpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHlfKGVudGl0eSk7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRUYXJnZXRFbnRpdHkoZW50aXR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHlfKFN0cmluZyBlbnRpdHkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFyZ2V0RW50aXR5OwotCQl0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSA9IGVudGl0eTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQVJHRVRfRU5USVRZX1BST1BFUlRZLCBvbGQsIGVudGl0eSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYXJnZXRFbnRpdHkoU3RyaW5nIGVudGl0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VGFyZ2V0RW50aXR5OwotCQl0aGlzLmRlZmF1bHRUYXJnZXRFbnRpdHkgPSBlbnRpdHk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RBUkdFVF9FTlRJVFlfUFJPUEVSVFksIG9sZCwgZW50aXR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXRKYXZhVGFyZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBtYXBwaW5nJ3MgSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEphdmFUYXJnZXRUeXBlKCk7Ci0KLQlwdWJsaWMgRW50aXR5IGdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRUeXBlTWFwcGluZygpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0UmVzb2x2ZWRUYXJnZXRUeXBlTWFwcGluZygpIHsKLQkJUGVyc2lzdGVudFR5cGUgcmVzb2x2ZWRUYXJnZXRUeXBlID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldFR5cGUoKTsKLQkJcmV0dXJuIChyZXNvbHZlZFRhcmdldFR5cGUgPT0gbnVsbCkgPyBudWxsIDogcmVzb2x2ZWRUYXJnZXRUeXBlLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQkvLyBzdWItY2xhc3NlcyBsaWtlIHRoaXMgdG8gYmUgcHVibGljCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFJlc29sdmVkVGFyZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVzb2x2ZVBlcnNpc3RlbnRUeXBlKHRoaXMuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQotCXB1YmxpYyBjaGFyIGdldFRhcmdldEVudGl0eUVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiAnJCc7Ci0JfQotCi0JcHVibGljIElUeXBlIGdldFRhcmdldEVudGl0eUpkdFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUpkdFR5cGUodGhpcy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCByZWZlcmVuY2UgKioqKioqKioqKgotCi0JcHVibGljIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXA7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9ybU1hcHBpbmdSZWxhdGlvbnNoaXAgYnVpbGRSZWxhdGlvbnNoaXAoKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXNjYWRlICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1DYXNjYWRlIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGU7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNhc2NhZGUgYnVpbGRDYXNjYWRlKCkgewotCQkvLyBOQjogd2UgZG9uJ3QgdXNlIHRoZSBwbGF0Zm9ybQotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1DYXNjYWRlKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmZXRjaCAqKioqKioqKioqCi0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRmV0Y2ggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEZldGNoIDogdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXRTcGVjaWZpZWRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKGZldGNoKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldEZldGNoKEZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwoZmV0Y2gpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gZmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwotCX0KLQotCXByb3RlY3RlZCBGZXRjaFR5cGUgYnVpbGRTcGVjaWZpZWRGZXRjaCgpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRGZXRjaDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRGZXRjaDsKLQkJdGhpcy5kZWZhdWx0RmV0Y2ggPSBmZXRjaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBGZXRjaFR5cGUgYnVpbGREZWZhdWx0RmV0Y2goKTsKLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcC5pc093bmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbWFwcGluZy5pc1JlbGF0aW9uc2hpcE93bmVyKCkgJiYKLQkJCXRoaXMucmVsYXRpb25zaGlwLmlzT3duZWRCeSgoUmVsYXRpb25zaGlwTWFwcGluZykgbWFwcGluZyk7Ci0JfQotCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwT3duZXIoKSB7Ci0JCUVudGl0eSBlbnRpdHkgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCWlmIChlbnRpdHkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWxsQXR0cmlidXRlcygpKSB7Ci0JCQlBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJaWYgKHRoaXMuaXNPd25lZEJ5KG1hcHBpbmcpKSB7Ci0JCQkJcmV0dXJuIChSZWxhdGlvbnNoaXBNYXBwaW5nKSBtYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcC5pc092ZXJyaWRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1SZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU9ybVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG9sZE1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEZldGNoKG9sZE1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCW9sZE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuaW5pdGlhbGl6ZU9uKHRoaXMucmVsYXRpb25zaGlwKTsKLQkJdGhpcy5jYXNjYWRlLmluaXRpYWxpemVGcm9tKG9sZE1hcHBpbmcuZ2V0Q2FzY2FkZSgpKTsKLQkJLy9UT0RPIHNob3VsZCB3ZSBzZXQgdGhlIGZldGNoIHR5cGUgZnJvbSBhIEJhc2ljTWFwcGluZz8/Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldEFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFN0cmluZz4+IGdldEFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU5hbWVzTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+Pih0aGlzLmdldEFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU1hcHBpbmdzKCksIEF0dHJpYnV0ZU1hcHBpbmdUb29scy5BTExfTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbFRhcmdldEVudGl0eUF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlyZXR1cm4gKGVudGl0eSAhPSBudWxsKSA/IGVudGl0eS5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpIDogRW1wdHlJdGVyYWJsZS48QXR0cmlidXRlTWFwcGluZz5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGVOYW1lKCkgewotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRoaXMuZ2V0VGFyZ2V0RW50aXR5SWRBdHRyaWJ1dGUoKTsKLQkJcmV0dXJuIChhdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogYXR0cmlidXRlLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRUYXJnZXRFbnRpdHlJZEF0dHJpYnV0ZSgpIHsKLQkJRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldElkQXR0cmlidXRlKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVUYXJnZXRFbnRpdHlSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVRhcmdldEVudGl0eVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSAhPSBudWxsKSB7Ci0JCQlQZXJzaXN0ZW50VHlwZSB0YXJnZXRUeXBlID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldFR5cGUoKTsKLQkJCWlmICgodGFyZ2V0VHlwZSAhPSBudWxsKSAmJiB0YXJnZXRUeXBlLmlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVUYXJnZXRFbnRpdHlSZW5hbWVUeXBlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVUYXJnZXRFbnRpdHlSZW5hbWVUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuY3JlYXRlUmVuYW1lVGFyZ2V0RW50aXR5RWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQkJdGhpcy5jcmVhdGVUYXJnZXRFbnRpdHlNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVUYXJnZXRFbnRpdHlNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZFRhcmdldEVudGl0eSAhPSBudWxsKSB7Ci0JCQlQZXJzaXN0ZW50VHlwZSB0YXJnZXRUeXBlID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldFR5cGUoKTsKLQkJCWlmICgodGFyZ2V0VHlwZSAhPSBudWxsKSAmJiB0YXJnZXRUeXBlLmlzRm9yKG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVUYXJnZXRFbnRpdHlSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZVRhcmdldEVudGl0eVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlVGFyZ2V0RW50aXR5UmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRUYXJnZXRFbnRpdHkgIT0gbnVsbCkgewotCQkJUGVyc2lzdGVudFR5cGUgdGFyZ2V0VHlwZSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRUeXBlKCk7Ci0JCQlpZiAoKHRhcmdldFR5cGUgIT0gbnVsbCkgJiYgdGFyZ2V0VHlwZS5pc0luKG9yaWdpbmFsUGFja2FnZSkpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVUYXJnZXRFbnRpdHlSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlVGFyZ2V0RW50aXR5UmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5jcmVhdGVSZW5hbWVUYXJnZXRFbnRpdHlQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVUYXJnZXRFbnRpdHkobWVzc2FnZXMpOwotCQl0aGlzLnJlbGF0aW9uc2hpcC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVGFyZ2V0RW50aXR5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0VGFyZ2V0RW50aXR5KCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVELAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLnRhcmdldEVudGl0eUV4aXN0cygpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQVJHRVRfRU5USVRZX05PVF9FWElTVCwKLQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWSwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldFRhcmdldEVudGl0eSgpfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXJnZXRFbnRpdHlFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKZHRUeXBlKHRoaXMuZ2V0VGFyZ2V0RW50aXR5KCkpICE9IG51bGw7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFRhcmdldEVudGl0eVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpIHsKLQkJUGVyc2lzdGVudFR5cGUgcmVzb2x2ZWRUYXJnZXRUeXBlID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldFR5cGUoKTsKLQkJaWYgKHJlc29sdmVkVGFyZ2V0VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JCX0KLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gcmVzb2x2ZWRUYXJnZXRUeXBlLmdldE5hbWUoKTsKLQkJcmV0dXJuICh0YXJnZXRUeXBlTmFtZSAhPSBudWxsKSA/IHRhcmdldFR5cGVOYW1lIDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhM2Q1ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBzZXF1ZW5jZSBnZW5lcmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3IKLQlleHRlbmRzIEFic3RyYWN0T3JtR2VuZXJhdG9yPFhtbFNlcXVlbmNlR2VuZXJhdG9yPgotCWltcGxlbWVudHMgT3JtU2VxdWVuY2VHZW5lcmF0b3IKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVNlcXVlbmNlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sU2VxdWVuY2VHZW5lcmF0b3IgeG1sU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCXRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lID0geG1sU2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lXyh0aGlzLnhtbEdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0U2VxdWVuY2VOYW1lKHRoaXMuYnVpbGREZWZhdWx0U2VxdWVuY2VOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsIHZhbHVlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0SW5pdGlhbFZhbHVlKCkgewotCQlyZXR1cm4gREVGQVVMVF9JTklUSUFMX1ZBTFVFOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogc2VxdWVuY2UgbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lIDogdGhpcy5kZWZhdWx0U2VxdWVuY2VOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTZXF1ZW5jZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKFN0cmluZyBzcGVjaWZpZWRTZXF1ZW5jZU5hbWUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKHNwZWNpZmllZFNlcXVlbmNlTmFtZSk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yLnNldFNlcXVlbmNlTmFtZShzcGVjaWZpZWRTZXF1ZW5jZU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWVfKFN0cmluZyBzcGVjaWZpZWRTZXF1ZW5jZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2VxdWVuY2VOYW1lOwotCQl0aGlzLnNwZWNpZmllZFNlcXVlbmNlTmFtZSA9IHNwZWNpZmllZFNlcXVlbmNlTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZLCBvbGQsIHNwZWNpZmllZFNlcXVlbmNlTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2VxdWVuY2VOYW1lOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2VxdWVuY2VOYW1lKFN0cmluZyBkZWZhdWx0U2VxdWVuY2VOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0JCXRoaXMuZGVmYXVsdFNlcXVlbmNlTmFtZSA9IGRlZmF1bHRTZXF1ZW5jZU5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NFUVVFTkNFX05BTUVfUFJPUEVSVFksIG9sZCwgZGVmYXVsdFNlcXVlbmNlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTZXF1ZW5jZU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBUT0RPIHRoZSBkZWZhdWx0IHNlcXVlbmNlIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVudGltZSBwcm92aWRlci4uLgotCX0KLQkKLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCQotCXB1YmxpYyBDbGFzczxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yLmNsYXNzOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHN1cGVyLmlzSWRlbnRpY2FsKGdlbmVyYXRvcikgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSwgKChTZXF1ZW5jZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU0MTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uTnVsbE9ybURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1EZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNpbmdsZSByZWxhdGlvbnNoaXAgbWFwcGluZyAoMToxLCBtOjEpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc8WCBleHRlbmRzIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZzxYPgotCWltcGxlbWVudHMgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAotewotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9wdGlvbmFsOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRPcHRpb25hbDsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1EZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5OwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IHhtbE1hcHBpbmcuZ2V0T3B0aW9uYWwoKTsKLQkJdGhpcy5kZXJpdmVkSWRlbnRpdHkgPSB0aGlzLmJ1aWxkRGVyaXZlZElkZW50aXR5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3B0aW9uYWxfKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRPcHRpb25hbCgpKTsKLQkJdGhpcy5kZXJpdmVkSWRlbnRpdHkuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE9wdGlvbmFsKHRoaXMuYnVpbGREZWZhdWx0T3B0aW9uYWwoKSk7Ci0JCXRoaXMuZGVyaXZlZElkZW50aXR5LnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcHRpb25hbCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkT3B0aW9uYWwgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE9wdGlvbmFsLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0T3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRPcHRpb25hbF8ob3B0aW9uYWwpOwotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0T3B0aW9uYWwob3B0aW9uYWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9wdGlvbmFsXyhCb29sZWFuIG9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRPcHRpb25hbDsKLQkJdGhpcy5zcGVjaWZpZWRPcHRpb25hbCA9IG9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9wdGlvbmFsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0T3B0aW9uYWw7Ci0JCXRoaXMuZGVmYXVsdE9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09QVElPTkFMX1BST1BFUlRZLCBvbGQsIG9wdGlvbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfT1BUSU9OQUw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlcml2ZWQgaWRlbnRpdHkgKioqKioqKioqKgotCi0JcHVibGljIE9ybURlcml2ZWRJZGVudGl0eTJfMCBnZXREZXJpdmVkSWRlbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmRlcml2ZWRJZGVudGl0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRGVyaXZlZElkZW50aXR5Ml8wIGJ1aWxkRGVyaXZlZElkZW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5pc09ybVhtbDJfMENvbXBhdGlibGUoKSA/Ci0JCQkJdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkyXzAoKS5idWlsZE9ybURlcml2ZWRJZGVudGl0eSh0aGlzKSA6Ci0JCQkJbmV3IE51bGxPcm1EZXJpdmVkSWRlbnRpdHkyXzAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgb2xkTWFwcGluZykgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcob2xkTWFwcGluZyk7Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQl0aGlzLmRlcml2ZWRJZGVudGl0eS5pbml0aWFsaXplRnJvbSgoKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzApIG9sZE1hcHBpbmcpLmdldERlcml2ZWRJZGVudGl0eSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBtYXBwaW5nJ3MgSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBpcyBub3QKLQkgKiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEphdmFUYXJnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFNpbmdsZVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBidWlsZERlZmF1bHRGZXRjaCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfRkVUQ0hfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuZGVyaXZlZElkZW50aXR5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjc2NGY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5OYW1lVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdGFibGUsIHNlY29uZGFyeSB0YWJsZSwgam9pbiB0YWJsZSwgb3IgY29sbGVjdGlvbiB0YWJsZQotICogPHA+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBhbnkgc3ViY2xhc3MgdGhhdCBkaXJlY3RseSBob2xkcyBpdHMgWE1MIHRhYmxlIG11c3Q6PHVsPgotICogPGxpPmNhbGwgdGhlICJzdXBlciIgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhbiBYTUwgdGFibGUKLSAqICAgICB7QGxpbmsgI0Fic3RyYWN0T3JtVGFibGUoWG1sQ29udGV4dE5vZGUsIE93bmVyLCBBYnN0cmFjdFhtbFRhYmxlKX0KLSAqIDxsaT5vdmVycmlkZSB7QGxpbmsgI3NldFhtbFRhYmxlKEFic3RyYWN0WG1sVGFibGUpfSB0byBzZXQgdGhlIFhNTCB0YWJsZQotICogICAgIHNvIGl0IGlzIGluIHBsYWNlIGJlZm9yZSB0aGUgdGFibGUncyBzdGF0ZSAoZS5nLiB7QGxpbmsgI3NwZWNpZmllZE5hbWV9KQotICogICAgIGlzIGluaXRpYWxpemVkCi0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1UYWJsZTxYIGV4dGVuZHMgQWJzdHJhY3RYbWxUYWJsZT4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVRhYmxlLCBVbmlxdWVDb25zdHJhaW50Lk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE93bmVyIG93bmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1VbmlxdWVDb25zdHJhaW50LCBYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50Q29udGFpbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVRhYmxlKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJdGhpcyhwYXJlbnQsIG93bmVyLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1UYWJsZShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE93bmVyIG93bmVyLCBYIHhtbFRhYmxlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5zZXRYbWxUYWJsZSh4bWxUYWJsZSk7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWROYW1lKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gdGhpcy5idWlsZFNwZWNpZmllZFNjaGVtYSgpOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQ2F0YWxvZygpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIgPSB0aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludENvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZE5hbWVfKHRoaXMuYnVpbGRTcGVjaWZpZWROYW1lKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy5idWlsZFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyh0aGlzLmJ1aWxkU3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJdGhpcy5zeW5jVW5pcXVlQ29uc3RyYWludHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHROYW1lKHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYTUwgdGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIG51bGwgaWYgWE1MIHRhYmxlIGRvZXMgbm90IGV4aXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgWCBnZXRYbWxUYWJsZSgpOwotCi0JLyoqCi0JICogc2VlIGNsYXNzIGNvbW1lbnQuLi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRYbWxUYWJsZShYIHhtbFRhYmxlKSB7Ci0JCWlmICh4bWxUYWJsZSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ0aGlzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4gaWYgdGhlIFhNTCB0YWJsZSBpcyBub3QgbnVsbDogIiArIHhtbFRhYmxlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIFhNTCB0YWJsZSBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgWCBnZXRYbWxUYWJsZUZvclVwZGF0ZSgpIHsKLQkJWCB4bWxUYWJsZSA9IHRoaXMuZ2V0WG1sVGFibGUoKTsKLQkJcmV0dXJuICh4bWxUYWJsZSAhPSBudWxsKSA/IHhtbFRhYmxlIDogdGhpcy5idWlsZFhtbFRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFggYnVpbGRYbWxUYWJsZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sVGFibGVJZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxUYWJsZSgpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVYbWxUYWJsZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcmVtb3ZlWG1sVGFibGUoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkSW5SZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sVGFibGUoKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE5hbWUgOiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZE5hbWUsIG5hbWUpKSB7Ci0JCQlYIHhtbFRhYmxlID0gdGhpcy5nZXRYbWxUYWJsZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lXyhuYW1lKTsKLQkJCXhtbFRhYmxlLnNldE5hbWUobmFtZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbFRhYmxlSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWROYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWROYW1lKCkgewotCQlYIHhtbFRhYmxlID0gdGhpcy5nZXRYbWxUYWJsZSgpOwotCQlyZXR1cm4gKHhtbFRhYmxlID09IG51bGwpID8gbnVsbCA6IHhtbFRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0TmFtZTsKLQkJdGhpcy5kZWZhdWx0TmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBidWlsZERlZmF1bHROYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2NoZW1hICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTY2hlbWEgOiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRTY2hlbWEsIHNjaGVtYSkpIHsKLQkJCVggeG1sVGFibGUgPSB0aGlzLmdldFhtbFRhYmxlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8oc2NoZW1hKTsKLQkJCXhtbFRhYmxlLnNldFNjaGVtYShzY2hlbWEpOwotCQkJdGhpcy5yZW1vdmVYbWxUYWJsZUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCVggeG1sVGFibGUgPSB0aGlzLmdldFhtbFRhYmxlKCk7Ci0JCXJldHVybiAoeG1sVGFibGUgPT0gbnVsbCkgPyBudWxsIDogeG1sVGFibGUuZ2V0U2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCk7Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRDYXRhbG9nLCBjYXRhbG9nKSkgewotCQkJWCB4bWxUYWJsZSA9IHRoaXMuZ2V0WG1sVGFibGVGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18oY2F0YWxvZyk7Ci0JCQl4bWxUYWJsZS5zZXRDYXRhbG9nKGNhdGFsb2cpOwotCQkJdGhpcy5yZW1vdmVYbWxUYWJsZUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJWCB4bWxUYWJsZSA9IHRoaXMuZ2V0WG1sVGFibGUoKTsKLQkJcmV0dXJuICh4bWxUYWJsZSA9PSBudWxsKSA/IG51bGwgOiB4bWxUYWJsZS5nZXRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBjYXRhbG9nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZygpOwotCi0KLQkvLyAqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVW5pcXVlQ29uc3RyYWludCBnZXRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KHRoaXMuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCVggeG1sVGFibGUgPSB0aGlzLmdldFhtbFRhYmxlRm9yVXBkYXRlKCk7Ci0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sQ29uc3RyYWludCA9IHRoaXMuYnVpbGRYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCU9ybVVuaXF1ZUNvbnN0cmFpbnQgY29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sQ29uc3RyYWludCk7Ci0JCXhtbFRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKGluZGV4LCB4bWxDb25zdHJhaW50KTsKLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRYbWxVbmlxdWVDb25zdHJhaW50KCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1VbmlxdWVDb25zdHJhaW50KSB1bmlxdWVDb25zdHJhaW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy5nZXRYbWxUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5yZW1vdmVYbWxUYWJsZUlmVW5zZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0WG1sVGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVW5pcXVlQ29uc3RyYWludCBidWlsZFVuaXF1ZUNvbnN0cmFpbnQoWG1sVW5pcXVlQ29uc3RyYWludCB4bWxDb25zdHJhaW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLCB4bWxDb25zdHJhaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sVW5pcXVlQ29uc3RyYWludD4gZ2V0WG1sVW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCVggeG1sVGFibGUgPSB0aGlzLmdldFhtbFRhYmxlKCk7Ci0JCXJldHVybiAoeG1sVGFibGUgPT0gbnVsbCkgPwotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxYbWxVbmlxdWVDb25zdHJhaW50Pmluc3RhbmNlKCkgOgotCQkJCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJCQluZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+KHhtbFRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1VbmlxdWVDb25zdHJhaW50LCBYbWxVbmlxdWVDb25zdHJhaW50PiBidWlsZFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKSB7Ci0JCVVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIgY29udGFpbmVyID0gbmV3IFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiB1bmlxdWUgY29uc3RyYWludCBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVW5pcXVlQ29uc3RyYWludENvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVVuaXF1ZUNvbnN0cmFpbnQsIFhtbFVuaXF1ZUNvbnN0cmFpbnQ+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1VbmlxdWVDb25zdHJhaW50IGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sVW5pcXVlQ29uc3RyYWludCByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVRhYmxlLnRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50KHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sVW5pcXVlQ29uc3RyYWludD4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybVRhYmxlLnRoaXMuZ2V0WG1sVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbFVuaXF1ZUNvbnN0cmFpbnQgZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVVuaXF1ZUNvbnN0cmFpbnQgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJU2NoZW1hIGRiU2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKGRiU2NoZW1hID09IG51bGwpID8gbnVsbCA6IGRiU2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcih0aGlzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFNjaGVtYSBnZXREYlNjaGVtYSgpIHsKLQkJU2NoZW1hQ29udGFpbmVyIGRiU2NoZW1hQ29udGFpbmVyID0gdGhpcy5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQlyZXR1cm4gKGRiU2NoZW1hQ29udGFpbmVyID09IG51bGwpID8gbnVsbCA6IGRiU2NoZW1hQ29udGFpbmVyLmdldFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPiBjYXRhbG9nKSwKLQkgKiB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzOyBhbmQgd2UgbmVlZCB0bwotCSAqIGdldCB0aGUgc2NoZW1hIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqLwotCXB1YmxpYyBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyAhPSBudWxsKSA/IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+Ci0JICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIENhdGFsb2cgZ2V0RGJDYXRhbG9nKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldERiVGFibGUoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNjaGVtYUlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldERiU2NoZW1hKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+Ci0JICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2F0YWxvZ0lzUmVzb2x2ZWQoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSB8fCAodGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpICE9IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBVbmlxdWVDb25zdHJhaW50Lk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVVuaXF1ZUNvbnN0cmFpbnRDb2x1bW5OYW1lcygpIHsKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBkYlRhYmxlID0gdGhpcy5nZXREYlRhYmxlKCk7Ci0JCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUuZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5idWlsZFRhYmxlVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmJ1aWxkVGFibGVWYWxpZGF0b3IodGhpcywgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtVGFibGVUZXh0UmFuZ2VSZXNvbHZlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldFhtbFRhYmxlVmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sVGFibGVWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlYIHhtbFRhYmxlID0gdGhpcy5nZXRYbWxUYWJsZSgpOwotCQlyZXR1cm4gKHhtbFRhYmxlID09IG51bGwpID8gbnVsbCA6IHhtbFRhYmxlLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRYbWxUYWJsZU5hbWVUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxUYWJsZU5hbWVUZXh0UmFuZ2UoKSB7Ci0JCVggeG1sVGFibGUgPSB0aGlzLmdldFhtbFRhYmxlKCk7Ci0JCXJldHVybiAoeG1sVGFibGUgPT0gbnVsbCkgPyBudWxsIDogeG1sVGFibGUuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuZ2V0WG1sVGFibGVTY2hlbWFUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxUYWJsZVNjaGVtYVRleHRSYW5nZSgpIHsKLQkJWCB4bWxUYWJsZSA9IHRoaXMuZ2V0WG1sVGFibGUoKTsKLQkJcmV0dXJuICh4bWxUYWJsZSA9PSBudWxsKSA/IG51bGwgOiB4bWxUYWJsZS5nZXRTY2hlbWFUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy5nZXRYbWxUYWJsZUNhdGFsb2dUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxUYWJsZUNhdGFsb2dUZXh0UmFuZ2UoKSB7Ci0JCVggeG1sVGFibGUgPSB0aGlzLmdldFhtbFRhYmxlKCk7Ci0JCXJldHVybiAoeG1sVGFibGUgPT0gbnVsbCkgPyBudWxsIDogeG1sVGFibGUuZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCS8qKgotCSAqIGNvdmFyaWFudCBvdmVycmlkZQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5VGFibGUgb2xkVGFibGUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWROYW1lKG9sZFRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhvbGRUYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYShvbGRUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWZvciAoUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IGNvbnN0cmFpbnQgOiBvbGRUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpKSB7Ci0JCQl0aGlzLmFkZFVuaXF1ZUNvbnN0cmFpbnQoKS5pbml0aWFsaXplRnJvbShjb25zdHJhaW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seVRhYmxlIHZpcnR1YWxUYWJsZSkgewotCQl0aGlzLnNldFNwZWNpZmllZE5hbWUodmlydHVhbFRhYmxlLmdldE5hbWUoKSk7Ci0JCS8vIGlnbm9yZSBvdGhlciBzZXR0aW5ncz8KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmJ1aWxkUXVhbGlmaWVkTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkUXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIE5hbWVUb29scy5idWlsZFF1YWxpZmllZERhdGFiYXNlT2JqZWN0TmFtZSh0aGlzLmdldENhdGFsb2coKSwgdGhpcy5nZXRTY2hlbWEoKSwgdGhpcy5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1UeXBlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1UeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWI4NTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVHlwZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlR5cGVNYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5HZW5lcmljVHlwZU1hcHBpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdHlwZSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVR5cGVNYXBwaW5nPFggZXh0ZW5kcyBYbWxUeXBlTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nCi17Ci0JLy8gbmV2ZXIgbnVsbAotCXByb3RlY3RlZCBmaW5hbCBYIHhtbFR5cGVNYXBwaW5nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc187Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlOwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZTsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtVHlwZU1hcHBpbmcoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYIHhtbFR5cGVNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sVHlwZU1hcHBpbmcgPSB4bWxUeXBlTWFwcGluZzsKLQkJdGhpcy5jbGFzc18gPSB4bWxUeXBlTWFwcGluZy5nZXRDbGFzc05hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlID0geG1sVHlwZU1hcHBpbmcuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldENsYXNzXyh0aGlzLnhtbFR5cGVNYXBwaW5nLmdldENsYXNzTmFtZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlXyh0aGlzLnhtbFR5cGVNYXBwaW5nLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRPdmVycmlkZU1ldGFkYXRhQ29tcGxldGUodGhpcy5idWlsZE92ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc18oKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzXzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGFzcyhTdHJpbmcgY2xhc3NfKSB7Ci0JCXRoaXMuc2V0Q2xhc3NfKGNsYXNzXyk7Ci0JCXRoaXMueG1sVHlwZU1hcHBpbmcuc2V0Q2xhc3NOYW1lKGNsYXNzXyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NfKFN0cmluZyBjbGFzc18pIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY2xhc3NfOwotCQl0aGlzLmNsYXNzXyA9IGNsYXNzXzsKLQkJaWYgKHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDTEFTU19QUk9QRVJUWSwgb2xkLCBjbGFzc18pKSB7Ci0JCQl0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkubWFwcGluZ0NsYXNzQ2hhbmdlZChvbGQsIGNsYXNzXyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YWRhdGEgY29tcGxldGUgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgPGNvZGU+ZW50aXR5LW1hcHBpbmdzL3BlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEveG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGU8L2NvZGU+Ci0JICogaXMgc3BlY2lmaWVkLCBpdCBvdmVycmlkZXMgYW55dGhpbmcgc2V0IGhlcmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlpZiAodGhpcy5vdmVycmlkZU1ldGFkYXRhQ29tcGxldGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlLmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQl0aGlzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGVfKG1ldGFkYXRhQ29tcGxldGUpOwotCQl0aGlzLnhtbFR5cGVNYXBwaW5nLnNldE1ldGFkYXRhQ29tcGxldGUobWV0YWRhdGFDb21wbGV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZV8oQm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLnNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUgPSBtZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZLCBvbGQsIG1ldGFkYXRhQ29tcGxldGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZU1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gbWV0YWRhdGFDb21wbGV0ZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMub3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLm92ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSA9IG1ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPVkVSUklERV9NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSwgb2xkLCBtZXRhZGF0YUNvbXBsZXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE92ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZygpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFUeXBlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJaWYgKGphdmFUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoamF2YVR5cGUuZ2V0TWFwcGluZ0tleSgpID09IHRoaXMuZ2V0S2V5KCkpID8gamF2YVR5cGUuZ2V0TWFwcGluZygpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGVNYXBwaW5nIGdldEphdmFUeXBlTWFwcGluZ0ZvckRlZmF1bHRzKCkgewotCQlyZXR1cm4gdGhpcy5pc01ldGFkYXRhQ29tcGxldGUoKSA/IG51bGwgOiB0aGlzLmdldEphdmFUeXBlTWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVR5cGUgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlyZXR1cm4gKGphdmFUeXBlID09IG51bGwpID8gbnVsbCA6IGphdmFUeXBlLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVR5cGUgZ2V0SmR0VHlwZSgpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUpkdFR5cGUodGhpcy5nZXRDbGFzc18oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQSB0eXBlJ3MgbWFwcGluZyBpcyBiZWluZyBjaGFuZ2VkLiBDb3B5IHRoZSBjb21tb24gc2V0dGluZ3MgZnJvbSB0aGUgb2xkCi0JICogbWFwcGluZyB0byB0aGUgbmV3ICh0aGlzKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShPcm1UeXBlTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXRoaXMuc2V0Q2xhc3Mob2xkTWFwcGluZy5nZXRDbGFzc18oKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShvbGRNYXBwaW5nLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCXRoaXMuc2V0T3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKG9sZE1hcHBpbmcuaXNPdmVycmlkZU1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCi0JcHVibGljIFggZ2V0WG1sVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFR5cGVNYXBwaW5nOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGF0dHJpYnV0ZUlzRGVyaXZlZElkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBUeXBlTWFwcGluZ1Rvb2xzLmF0dHJpYnV0ZUlzRGVyaXZlZElkKHRoaXMsIGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZXMgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5VGFibGVOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0UHJpbWFyeURiVGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBBdHRyaWJ1dGVNYXBwaW5nPih0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nIHRyYW5zZm9ybShPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+KHRoaXMuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3NMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxUeXBlTWFwcGluZywgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4+KHRoaXMuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSwgVHlwZU1hcHBpbmdUb29scy5BVFRSSUJVVEVfTUFQUElOR1NfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXNMaXN0cygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SXRlcmFibGU8U3RyaW5nPj4gZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc0xpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4odGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpLCBBdHRyaWJ1dGVNYXBwaW5nVG9vbHMuQUxMX09WRVJSSURBQkxFX0FUVFJJQlVURV9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFN0cmluZz4+IGdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFR5cGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+Pih0aGlzLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCksIFR5cGVNYXBwaW5nVG9vbHMuT1ZFUlJJREFCTEVfQVRUUklCVVRFX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gZ2V0QXR0cmlidXRlTWFwcGluZ3MoZmluYWwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPihDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdzKCkpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChBdHRyaWJ1dGVNYXBwaW5nIG8pIHsKLQkJCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoby5nZXRLZXkoKSwgbWFwcGluZ0tleSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKGZpbmFsIFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQXR0cmlidXRlTWFwcGluZyBvKSB7Ci0JCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKG8uZ2V0S2V5KCksIG1hcHBpbmdLZXkpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgOiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKLQkJCUNvbHVtbiBjb2x1bW4gPSBhdHRyaWJ1dGVNYXBwaW5nLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uKGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKGNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbjsKLQkJCX0KLQkJfQotCQlpZiAoICEgdGhpcy5pc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lc0xpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxTdHJpbmc+PiBnZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSwgQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9PVkVSUklEQUJMRV9BU1NPQ0lBVElPTl9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lc0xpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxTdHJpbmc+PiBnZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFR5cGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+Pih0aGlzLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCksIFR5cGVNYXBwaW5nVG9vbHMuT1ZFUlJJREFCTEVfQVNTT0NJQVRJT05fTkFNRVNfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgOiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKLQkJCVJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgPSBhdHRyaWJ1dGVNYXBwaW5nLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKGF0dHJpYnV0ZU5hbWUpOwotCQkJaWYgKHJlbGF0aW9uc2hpcCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlbGF0aW9uc2hpcDsKLQkJCX0KLQkJfQotCQlpZiAoICEgdGhpcy5pc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQlpZiAoamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChhdHRyaWJ1dGVOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5oZXJpdGFuY2UgaGllcmFyY2h5ICoqKioqKioqKioKLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRTdXBlclR5cGVNYXBwaW5nKCkgewotCQlQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJcmV0dXJuIChzdXBlclBlcnNpc3RlbnRUeXBlID09IG51bGwpID8gbnVsbCA6IHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxUeXBlTWFwcGluZz4gZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb01hcHBpbmdzKHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHR5cGUgbWFwcGluZydzICJwZXJzaXN0ZW5jZSIgYW5jZXN0b3JzLAotCSAqIDxlbT5leGNsdWRpbmc8L2VtPiB0aGUgdHlwZSBtYXBwaW5nIGl0c2VsZi4KLQkgKiBUaGUgcmV0dXJuZWQgaXRlcmF0b3Igd2lsbCByZXR1cm4gZWxlbWVudHMgaW5maW5pdGVseSBpZiB0aGUgaGllcmFyY2h5Ci0JICogaGFzIGEgbG9vcC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8VHlwZU1hcHBpbmc+IGdldEFuY2VzdG9ycygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydFRvTWFwcGluZ3ModGhpcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEFuY2VzdG9ycygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8VHlwZU1hcHBpbmc+IGNvbnZlcnRUb01hcHBpbmdzKEl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiB0eXBlcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVudFR5cGUsIFR5cGVNYXBwaW5nPih0eXBlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHR5cGUpIHsKLQkJCQlyZXR1cm4gdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3RFbnRpdHkoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldFJvb3RFbnRpdHkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqKioqKiogdGV4dCByYW5nZXMgKioqKioqKioqKgotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzLnhtbFR5cGVNYXBwaW5nLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkgPyB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxUeXBlTWFwcGluZy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENsYXNzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0Q2xhc3NUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sVHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlc1RleHRSYW5nZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxUeXBlTWFwcGluZy5nZXROYW1lVGV4dFJhbmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gdGhpcy54bWxUeXBlTWFwcGluZy5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKgotCi0JcHVibGljIERlbGV0ZUVkaXQgY3JlYXRlRGVsZXRlRWRpdCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sVHlwZU1hcHBpbmcuY3JlYXRlRGVsZXRlRWRpdCgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbFR5cGVNYXBwaW5nLmNyZWF0ZVJlbmFtZVR5cGVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5pc0luKG9yaWdpbmFsUGFja2FnZSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxUeXBlTWFwcGluZy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRHZW5lcmF0b3JzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEdlbmVyYXRvcj4odGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nR2VuZXJhdG9yTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEdlbmVyYXRvcj4+IGdldEF0dHJpYnV0ZU1hcHBpbmdHZW5lcmF0b3JMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPEdlbmVyYXRvcj4+KHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEdlbmVyYXRvcj4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZykgewotCQkJCQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0R2VuZXJhdG9ycygpOwotCQkJCQl9Ci0JCQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVDbGFzcyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQ2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNsYXNzXykpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUywKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRDbGFzc1RleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLmJ1aWxkVHlwZU1hcHBpbmdWYWxpZGF0b3IoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUeXBlTWFwcGluZ1ZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljVHlwZU1hcHBpbmdWYWxpZGF0b3IodGhpcywgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCksIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybVR5cGVNYXBwaW5nVGV4dFJhbmdlUmVzb2x2ZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCS8vIHRoaXMgc2hvdWxkIG5ldmVyIGJlIG51bGw7IGFsc28sIHRoZSBwZXJzaXN0ZW50IHR5cGUgZGVsZWdhdGVzCi0JCS8vIHRvIGhlcmUsIHNvIGRvbid0IGRlbGVnYXRlIGJhY2sgdG8gaXQgKG9yIHdlIHdpbGwgZ2V0IGEgc3RhY2sgb3ZlcmZsb3cpICBidWcgMzU1NDE1Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLnhtbFR5cGVNYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJLy8qcmV0dXJuIGFuIEVtcHR5IHRleHQgcmFuZ2UgYmVjYXVzZSB2YWxpZGF0aW9uIHNvbWV0aW1lcyBydW4gY29uY3VycmVudGx5Ci0JCS8vd2l0aCB0aGUgY29kZSBhZGRpbmcgdGhlIHR5cGUgbWFwcGluZyB0byB4bWw7IHRoZSBJRE9NTm9kZSBtaWdodCBub3QKLQkJLy9iZSBzZXQgd2hlbiB0aGlzIGlzIGNhbGxlZC4gQnJpYW4ncyBiYXRjaCB1cGRhdGUgY2hhbmdlcyBpbiAzLjIgc2hvdWxkCi0JCS8vZml4IHRoaXMgcHJvYmxlbS4gIGJ1ZyAzNTg3NDUKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVZlcnNpb25NYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVZlcnNpb25NYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlN2MyMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW5NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5OYW1lZENvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5OdWxsT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2ZXJzaW9uIG1hcHBpbmcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmc8WCBleHRlbmRzIFhtbFZlcnNpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WD4KLQlpbXBsZW1lbnRzIE9ybVZlcnNpb25NYXBwaW5nCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUNvbHVtbiBjb2x1bW47Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGNvbnZlcnRlcjsgIC8vIG5ldmVyIG51bGwKLQotCi0JLy8gdGhlIHNwZWMgZG9lcyBub3QgbGlzdCBUZW1wb3JhbCBleHBsaWNpdGx5LAotCS8vIGJ1dCBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgb3JtLnhtbCBzY2hlbWEuLi4KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9ybUNvbnZlcnRlci5BZGFwdGVyW10gQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkgPSBuZXcgT3JtQ29udmVydGVyLkFkYXB0ZXJbXSB7Ci0JCU9ybVRlbXBvcmFsQ29udmVydGVyLkJhc2ljQWRhcHRlci5pbnN0YW5jZSgpLAotCX07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gQ09OVkVSVEVSX0FEQVBURVJTID0gbmV3IEFycmF5SXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+KENPTlZFUlRFUl9BREFQVEVSX0FSUkFZKTsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtVmVyc2lvbk1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFggeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCQl0aGlzLmNvbHVtbiA9IHRoaXMuYnVpbGRDb2x1bW4oKTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jQ29udmVydGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5jb2x1bW4udXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29sdW1uIGJ1aWxkQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Db252ZXJ0ZXIgZ2V0Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udmVydGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkvLyBub3RlOiB3ZSBtYXkgYWxzbyBjbGVhciB0aGUgWE1MIHZhbHVlIHdlIHdhbnQ7Ci0JCQkvLyBidXQgaWYgd2UgbGVhdmUgaXQsIHRoZSByZXN1bHRpbmcgc3luYyB3aWxsIHNjcmV3IHRoaW5ncyB1cC4uLgotCQkJdGhpcy5jbGVhclhtbENvbnZlcnRlclZhbHVlcygpOwotCQkJT3JtQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlciA9IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkQ29udmVydGVyKGNvbnZlcnRlckFkYXB0ZXIpKTsKLQkJCXRoaXMuY29udmVydGVyLmluaXRpYWxpemUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoT3JtQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlcikgewotCQkgcmV0dXJuIChjb252ZXJ0ZXJBZGFwdGVyICE9IG51bGwpID8KLQkJCQljb252ZXJ0ZXJBZGFwdGVyLmJ1aWxkTmV3Q29udmVydGVyKHRoaXMsIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkpIDoKLQkJCQl0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENvbnZlcnRlcl8oT3JtQ29udmVydGVyIGNvbnZlcnRlcikgewotCQlDb252ZXJ0ZXIgb2xkID0gdGhpcy5jb252ZXJ0ZXI7Ci0JCXRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJYbWxDb252ZXJ0ZXJWYWx1ZXMoKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJYWRhcHRlci5jbGVhclhtbFZhbHVlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKCkgewotCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSA9IHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJT3JtQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IGFkYXB0ZXIuYnVpbGRDb252ZXJ0ZXIodGhpcywgZmFjdG9yeSk7Ci0JCQlpZiAob3JtQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gb3JtQ29udmVydGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDb252ZXJ0ZXIoKSB7Ci0JCU9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmdldFhtbENvbnZlcnRlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKHRoaXMuYnVpbGROdWxsQ29udmVydGVyKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuY29udmVydGVyLmdldFR5cGUoKSA9PSBhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSkgewotCQkJCXRoaXMuY29udmVydGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRDb252ZXJ0ZXJfKGFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBhZGFwdGVyIHdob3NlIGNvbnZlcnRlciB2YWx1ZSBpcyBzZXQgaW4gdGhlIFhNTCBtYXBwaW5nLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY29udmVydGVyIHZhbHVlcyBpbiB0aGUgWE1MLgotCSAqLwotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIuQWRhcHRlciBnZXRYbWxDb252ZXJ0ZXJBZGFwdGVyKCkgewotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmlzQWN0aXZlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZykpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkTnVsbENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsT3JtQ29udmVydGVyKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyLkFkYXB0ZXIgZ2V0Q29udmVydGVyQWRhcHRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJaWYgKGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpID09IGNvbnZlcnRlclR5cGUpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gQ09OVkVSVEVSX0FEQVBURVJTOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDMwOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1WZXJzaW9uTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbU9ybUNvbHVtbk1hcHBpbmcoT3JtQ29sdW1uTWFwcGluZyBvbGRNYXBwaW5nKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tT3JtQ29sdW1uTWFwcGluZyhvbGRNYXBwaW5nKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZUZyb20ob2xkTWFwcGluZy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKEF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcykgewotCQl4bWxBdHRyaWJ1dGVzLmdldFZlcnNpb25zKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCXhtbEF0dHJpYnV0ZXMuZ2V0VmVyc2lvbnMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT3JtQ29sdW1uLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sQ29sdW1uIGdldFhtbENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRDb2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgWG1sQ29sdW1uIGJ1aWxkWG1sQ29sdW1uKCkgewotCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCk7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRDb2x1bW4oeG1sQ29sdW1uKTsKLQkJcmV0dXJuIHhtbENvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVYbWxDb2x1bW4oKSB7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRDb2x1bW4obnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlQXR0cmlidXRlVHlwZShtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhTVVBQT1JURURfVFlQRV9OQU1FUywgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1ZFUlNJT05fTUFQUElOR19UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2wsIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBOYW1lZENvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsQmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzYyYTcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmlydHVhbEJhc2VDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVZpcnR1YWxCYXNlQ29sdW1uPE8gZXh0ZW5kcyBPcm1SZWFkT25seUJhc2VDb2x1bW4uT3duZXIsIEMgZXh0ZW5kcyBSZWFkT25seUJhc2VDb2x1bW4+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVZpcnR1YWxOYW1lZENvbHVtbjxPLCBDPgotCWltcGxlbWVudHMgVmlydHVhbEJhc2VDb2x1bW4sIE9ybVJlYWRPbmx5QmFzZUNvbHVtbgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFibGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGU7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVbmlxdWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFVuaXF1ZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE51bGxhYmxlOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHROdWxsYWJsZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEluc2VydGFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdEluc2VydGFibGU7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVcGRhdGFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdFVwZGF0YWJsZTsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtVmlydHVhbEJhc2VDb2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlKHRoaXMuYnVpbGRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VGFibGUodGhpcy5idWlsZERlZmF1bHRUYWJsZSgpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFVuaXF1ZSh0aGlzLmJ1aWxkU3BlY2lmaWVkVW5pcXVlKCkpOwotCQl0aGlzLnNldERlZmF1bHRVbmlxdWUodGhpcy5idWlsZERlZmF1bHRVbmlxdWUoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWROdWxsYWJsZSh0aGlzLmJ1aWxkU3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE51bGxhYmxlKHRoaXMuYnVpbGREZWZhdWx0TnVsbGFibGUoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKHRoaXMuYnVpbGRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQl0aGlzLnNldERlZmF1bHRJbnNlcnRhYmxlKHRoaXMuYnVpbGREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFVwZGF0YWJsZSh0aGlzLmJ1aWxkU3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQl0aGlzLnNldERlZmF1bHRVcGRhdGFibGUodGhpcy5idWlsZERlZmF1bHRVcGRhdGFibGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUYWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVGFibGUgOiB0aGlzLmRlZmF1bHRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFRhYmxlOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1bmlxdWUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNVbmlxdWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRVbmlxdWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFVuaXF1ZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0VW5pcXVlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkVW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRVbmlxdWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4gdW5pcXVlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRVbmlxdWU7Ci0JCXRoaXMuc3BlY2lmaWVkVW5pcXVlID0gdW5pcXVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSwgb2xkLCB1bmlxdWUpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkVW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkVW5pcXVlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VW5pcXVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VW5pcXVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRVbmlxdWUoYm9vbGVhbiB1bmlxdWUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRVbmlxdWU7Ci0JCXRoaXMuZGVmYXVsdFVuaXF1ZSA9IHVuaXF1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVU5JUVVFX1BST1BFUlRZLCBvbGQsIHVuaXF1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0VW5pcXVlKCkgewotCQlyZXR1cm4gREVGQVVMVF9VTklRVUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG51bGxhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWROdWxsYWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTnVsbGFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdE51bGxhYmxlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE51bGxhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE51bGxhYmxlOwotCQl0aGlzLnNwZWNpZmllZE51bGxhYmxlID0gbnVsbGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFksIG9sZCwgbnVsbGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5Db2x1bW4oKS5nZXRTcGVjaWZpZWROdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TnVsbGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE51bGxhYmxlKGJvb2xlYW4gbnVsbGFibGUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHROdWxsYWJsZTsKLQkJdGhpcy5kZWZhdWx0TnVsbGFibGUgPSBudWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTlVMTEFCTEVfUFJPUEVSVFksIG9sZCwgbnVsbGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdE51bGxhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9OVUxMQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zZXJ0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0luc2VydGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZLCBvbGQsIGluc2VydGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SW5zZXJ0YWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5zZXJ0YWJsZShib29sZWFuIGluc2VydGFibGUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRJbnNlcnRhYmxlOwotCQl0aGlzLmRlZmF1bHRJbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkLCBpbnNlcnRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9JTlNFUlRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0VXBkYXRhYmxlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlID0gdXBkYXRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSwgb2xkLCB1cGRhdGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkVXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VXBkYXRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRVcGRhdGFibGUoYm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRVcGRhdGFibGU7Ci0JCXRoaXMuZGVmYXVsdFVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLCBvbGQsIHVwZGF0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0VXBkYXRhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9VUERBVEFCTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci50YWJsZU5hbWVJc0ludmFsaWQodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVZpcnR1YWxOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsTmFtZWRDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0ZjJlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVZpcnR1YWxOYW1lZENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdmlydHVhbDx1bD4KLSAqIDxsaT5jb2x1bW4KLSAqIDxsaT5qb2luIGNvbHVtbgotICogPGxpPnByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKiA8L3VsPgotICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gYWxsIHN0YXRlIGlzIHN5bmMnZWQvdXBkYXRlZCBpbiB7QGxpbmsgI3VwZGF0ZSgpfQotICogYmVjYXVzZSA8ZW0+YWxsPC9lbT4gb2YgaXRzIGRlcml2ZWQgZnJvbSB0aGUgY29udGV4dCBtb2RlbCAoaS5lLiBub25lIG9mIGl0Ci0gKiBpcyBkZXJpdmVkIGZyb20gdGhlIHJlc291cmNlIG1vZGVsKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtVmlydHVhbE5hbWVkQ29sdW1uPE8gZXh0ZW5kcyBSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyLCBDIGV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbj4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFZpcnR1YWxOYW1lZENvbHVtbiwgT3JtUmVhZE9ubHlOYW1lZENvbHVtbgotewotCXByb3RlY3RlZCBmaW5hbCBPIG93bmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWROYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE5hbWU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbkRlZmluaXRpb247Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVZpcnR1YWxOYW1lZENvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE8gb3duZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZE5hbWUodGhpcy5idWlsZFNwZWNpZmllZE5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5idWlsZERlZmF1bHROYW1lKCkpOwotCi0JCXRoaXMuc2V0Q29sdW1uRGVmaW5pdGlvbih0aGlzLmJ1aWxkQ29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIG5ldmVyIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgQyBnZXRPdmVycmlkZGVuQ29sdW1uKCk7Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWROYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWROYW1lIDogdGhpcy5kZWZhdWx0TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWROYW1lOwotCQl0aGlzLnNwZWNpZmllZE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5Db2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE5hbWU7Ci0JCXRoaXMuZGVmYXVsdE5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdENvbHVtbk5hbWUodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBkZWZpbml0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW5EZWZpbml0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQ29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIENvbHVtbiBnZXREYkNvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIucmVzb2x2ZURiVGFibGUodGhpcy5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYkNvbHVtbigpICE9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5idWlsZENvbHVtblZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCBieSB0aGUgc3ViY2xhc3NlcyB0aGF0IGltcGxlbWVudCB7QGxpbmsgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiNpc1ZpcnR1YWwoKX0uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCVN0cmluZyB0YWJsZSA9IHRoaXMuZ2V0VGFibGUoKTsKLQkJaWYgKHRhYmxlICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZCh0YWJsZSk7Ci0JCQlzYi5hcHBlbmQoJy4nKTsKLQkJfQotCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmlydHVhbE5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYjdlOTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkRpc2NyaW1pbmF0b3JUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1WaXJ0dWFsTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uPE8gZXh0ZW5kcyBPcm1SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciwgQyBleHRlbmRzIFJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1WaXJ0dWFsTmFtZWRDb2x1bW48TywgQz4KLQlpbXBsZW1lbnRzIFZpcnR1YWxOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4sIE9ybVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uCi17Ci0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOwotCXByb3RlY3RlZCBpbnQgZGVmYXVsdExlbmd0aDsKLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBzcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1WaXJ0dWFsTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgTyBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSh0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKHRoaXMuYnVpbGREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGgodGhpcy5idWlsZFNwZWNpZmllZExlbmd0aCgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TGVuZ3RoKHRoaXMuYnVpbGREZWZhdWx0TGVuZ3RoKCkpOwotCX0KLQotCi0KLQkvLyAqKioqKioqKioqIGRpc2NyaW1pbmF0b3IgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgOiB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKLQl9Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIHR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IHR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBidWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIHR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlID0gdHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTEVOR1RIX1BST1BFUlRZLCBvbGQsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBidWlsZERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxlbmd0aCAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZExlbmd0aCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTGVuZ3RoLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkU3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRMZW5ndGgoaW50IGxlbmd0aCkgewotCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCQl0aGlzLmRlZmF1bHRMZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0TGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsUmVmZXJlbmNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmlydHVhbFJlZmVyZW5jZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YmI4OTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsUmVmZXJlbmNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbFJlZmVyZW5jZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVZpcnR1YWxSZWZlcmVuY2VUYWJsZTxUIGV4dGVuZHMgUmVhZE9ubHlSZWZlcmVuY2VUYWJsZT4KLQlleHRlbmRzIEFic3RyYWN0T3JtVmlydHVhbFRhYmxlPFQ+Ci0JaW1wbGVtZW50cyBWaXJ0dWFsUmVmZXJlbmNlVGFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVmlydHVhbEpvaW5Db2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtVmlydHVhbFJlZmVyZW5jZVRhYmxlKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIsIFQgb3ZlcnJpZGVuVGFibGUpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lciwgb3ZlcnJpZGVuVGFibGUpOwotCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IHRoaXMuYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZ2V0RGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0T3ZlcnJpZGRlbkpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seUpvaW5Db2x1bW4+KHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4LCBPcm1WaXJ0dWFsSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCwgUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihPcm1WaXJ0dWFsSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtVmlydHVhbEpvaW5Db2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsSm9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybVZpcnR1YWxKb2luQ29sdW1uIGJ1aWxkQ29udGV4dEVsZW1lbnQoUmVhZE9ubHlKb2luQ29sdW1uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtVmlydHVhbFJlZmVyZW5jZVRhYmxlLnRoaXMuYnVpbGRKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UmVhZE9ubHlKb2luQ29sdW1uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtVmlydHVhbFJlZmVyZW5jZVRhYmxlLnRoaXMuZ2V0T3ZlcnJpZGRlbkpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVZpcnR1YWxKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybVZpcnR1YWxKb2luQ29sdW1uIGdldERlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Sm9pbkNvbHVtbihPcm1WaXJ0dWFsSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCU9ybVZpcnR1YWxKb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE9ybVZpcnR1YWxKb2luQ29sdW1uPiBnZXREZWZhdWx0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48T3JtVmlydHVhbEpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0Sm9pbkNvbHVtbigpKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbih0aGlzLmJ1aWxkSm9pbkNvbHVtbih0aGlzLmdldE92ZXJyaWRkZW5UYWJsZSgpLmdldERlZmF1bHRKb2luQ29sdW1uKCkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsSm9pbkNvbHVtbiBidWlsZEpvaW5Db2x1bW4oUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRKb2luQ29sdW1uKHRoaXMuam9pbkNvbHVtbk93bmVyLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbEpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBjb2x1bW5Pd25lciwgUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1WaXJ0dWFsSm9pbkNvbHVtbih0aGlzLCBjb2x1bW5Pd25lciwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpOwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWJvb2xlYW4gY29udGludWVWYWxpZGF0aW5nID0gdGhpcy5idWlsZFRhYmxlVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQotCQkvL2pvaW4gY29sdW1uIHZhbGlkYXRpb24gd2lsbCBoYW5kbGUgdGhlIGNoZWNrIGZvciB3aGV0aGVyIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIGRhdGFiYXNlCi0JCS8vc29tZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGFyZSBub3QgZGF0YWJhc2Ugc3BlY2lmaWMuIElmIHRoZSBkYXRhYmFzZSB2YWxpZGF0aW9uIGZvciB0aGUKLQkJLy90YWJsZSBmYWlscyB3ZSB3aWxsIHN0b3AgdGhlcmUgYW5kIG5vdCB2YWxpZGF0ZSB0aGUgam9pbiBjb2x1bW5zIGF0IGFsbAotCQlpZiAoY29udGludWVWYWxpZGF0aW5nKSB7Ci0JCQl0aGlzLnZhbGlkYXRlSm9pbkNvbHVtbnMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSm9pbkNvbHVtbnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQl0aGlzLnZhbGlkYXRlTm9kZXModGhpcy5nZXRKb2luQ29sdW1ucygpLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmlydHVhbFRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVZpcnR1YWxUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDI0ODgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmlydHVhbFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVZpcnR1YWxUYWJsZTxUIGV4dGVuZHMgUmVhZE9ubHlUYWJsZT4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFZpcnR1YWxUYWJsZSwgT3JtUmVhZE9ubHlUYWJsZQotewotCXByb3RlY3RlZCBmaW5hbCBPd25lciBvd25lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBUIG92ZXJyaWRkZW5UYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHROYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRDYXRhbG9nOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQsIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludENvbnRhaW5lcjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtVmlydHVhbFRhYmxlKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIsIFQgb3ZlcnJpZGVuVGFibGUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLm92ZXJyaWRkZW5UYWJsZSA9IG92ZXJyaWRlblRhYmxlOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIgPSB0aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludENvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZE5hbWUodGhpcy5idWlsZFNwZWNpZmllZE5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdE5hbWUodGhpcy5idWlsZERlZmF1bHROYW1lKCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hKHRoaXMuYnVpbGRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYSgpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2codGhpcy5idWlsZFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5idWlsZERlZmF1bHRDYXRhbG9nKCkpOwotCi0JCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBzaG91bGQgbmV2ZXIgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBUIGdldE92ZXJyaWRkZW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGRlblRhYmxlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZE5hbWUgOiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHROYW1lOwotCQl0aGlzLmRlZmF1bHROYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKTsKLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2hlbWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjaGVtYSA6IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0U2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCk7Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5UYWJsZSgpLmdldENhdGFsb2coKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCk7Ci0KLQotCS8vICoqKioqKioqKiogdW5pcXVlIGNvbnN0cmFpbnRzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQgZ2V0VW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludD4gZ2V0T3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ+KHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4LCBPcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludCBjb25zdHJhaW50KSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgsIGNvbnN0cmFpbnQpOwotCX0KLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCwgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgdW5pcXVlQ29uc3RyYWludCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGJ1aWxkVW5pcXVlQ29uc3RyYWludChSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50KHRoaXMsIHVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQgY29uc3RyYWludCkgewotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoY29uc3RyYWludCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50LCBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ+IGJ1aWxkVW5pcXVlQ29uc3RyYWludENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBVbmlxdWVDb25zdHJhaW50Q29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogdW5pcXVlIGNvbnN0cmFpbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludCwgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50PgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFVOSVFVRV9DT05TVFJBSU5UU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRDb250ZXh0RWxlbWVudChSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1WaXJ0dWFsVGFibGUudGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnQocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1WaXJ0dWFsVGFibGUudGhpcy5nZXRPdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludCBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRPdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldERiVGFibGUoKSB7Ci0JCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKLQkJcmV0dXJuIChkYlNjaGVtYSA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCVNjaGVtYUNvbnRhaW5lciBkYlNjaGVtYUNvbnRhaW5lciA9IHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJcmV0dXJuIChkYlNjaGVtYUNvbnRhaW5lciA9PSBudWxsKSA/IG51bGwgOiBkYlNjaGVtYUNvbnRhaW5lci5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHRoaXMuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNjaGVtYUlzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldERiU2NoZW1hKCkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+IGNhdGFsb2cpLAotCSAqIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3M7IGFuZCB3ZSBuZWVkIHRvCi0JICogZ2V0IHRoZSBzY2hlbWEgZGlyZWN0bHkgZnJvbSB0aGUgZGF0YWJhc2UuCi0JICovCi0JcHVibGljIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJU3RyaW5nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpIDogdGhpcy5nZXREYXRhYmFzZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KLQkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwdWJsaWMgQ2F0YWxvZyBnZXREYkNhdGFsb2coKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnJlc29sdmVEYkNhdGFsb2coY2F0YWxvZyk7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPgotCSAqIGNhdGFsb2cpLCB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhdGFsb2dJc1Jlc29sdmVkKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgfHwgKHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSAhPSBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYlRhYmxlKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZXNvbHZlZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGJTY2hlbWEoKSAhPSBudWxsOwotCX0KLQotCS8qKgotCSAqIElmIHdlIGRvbid0IGhhdmUgYSBjYXRhbG9nIChpLmUuIHdlIGRvbid0IGV2ZW4gaGF2ZSBhIDxlbT5kZWZhdWx0PC9lbT4KLQkgKiBjYXRhbG9nKSwgdGhlbiB0aGUgZGF0YWJhc2UgcHJvYmFibHkgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNSZXNvbHZlZENhdGFsb2coKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyA9PSBudWxsKSB8fCAodGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpICE9IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5idWlsZFRhYmxlVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmJ1aWxkVGFibGVWYWxpZGF0b3IodGhpcywgdGhpcy5idWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtVGFibGVUZXh0UmFuZ2VSZXNvbHZlcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuYnVpbGRRdWFsaWZpZWROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRRdWFsaWZpZWROYW1lKCkgewotCQlyZXR1cm4gTmFtZVRvb2xzLmJ1aWxkUXVhbGlmaWVkRGF0YWJhc2VPYmplY3ROYW1lKHRoaXMuZ2V0Q2F0YWxvZygpLCB0aGlzLmdldFNjaGVtYSgpLCB0aGlzLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTU2OWVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtRmFjdG9yeS5TaW1wbGVWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0WG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuVmVyc2lvbkZvcm1hdEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBVc2UgdGhpcyBhYnN0cmFjdCBjbGFzcyBmb3IgY29udGV4dCBub2RlcyB0aGF0IGFyZSBwYXJ0IG9mIGFuCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLgotICogVGhpcyB3aWxsIG5vdCB3b3JrIGZvciBhIHB1cmUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlfQotICogaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JZXh0ZW5kcyBBYnN0cmFjdFhtbENvbnRleHROb2RlCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUoSnBhQ29udGV4dE5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eU1hcHBpbmdzIGdldE1hcHBpbmdGaWxlUm9vdCgpIHsKLQkJcmV0dXJuIChFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0TWFwcGluZ0ZpbGVSb290KCk7Ci0JfQotCi0JLy8gVE9ETyBianYgbmVlZCB0byBjYXNjYWRlIHVwIGNvbnRhaW5tZW50IGhpZXJhcmNoeS4uLiAobmVlZCBwdWJsaWMgQVBJOgotCS8vIEpwYUNvbnRleHROb2RlLmdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpID8pCi0JcHJvdGVjdGVkIE9ybVhtbERlZmluaXRpb24gZ2V0TWFwcGluZ0ZpbGVEZWZpbml0aW9uKCkgewotCQlPcm1YbWwgb3JtWG1sID0gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKS5nZXRQYXJlbnQoKTsKLQkJaWYgKG9ybVhtbCBpbnN0YW5jZW9mIEdlbmVyaWNPcm1YbWwpIHsKLQkJCXJldHVybiAoKEdlbmVyaWNPcm1YbWwpIG9ybVhtbCkuZ2V0TWFwcGluZ0ZpbGVEZWZpbml0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIChPcm1YbWxEZWZpbml0aW9uKSB0aGlzLmdldEpwYVBsYXRmb3JtKCkuZ2V0UmVzb3VyY2VEZWZpbml0aW9uKHRoaXMuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCX0KLQotCXByb3RlY3RlZCBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKS5nZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JLy8gVE9ETyBianYgbmVlZCB0byBhZGQgQVBJIGFuZCBkZWxlZ2F0ZSB0byBvcm0ueG1sL2VudGl0eSBtYXBwaW5ncyBpbnRlcmZhY2UuLi4KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc09ybVhtbDJfMENvbXBhdGlibGUoKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gdGhpcy5nZXRNYXBwaW5nRmlsZVJvb3QoKS5nZXRWZXJzaW9uKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKHZlcnNpb24gIT0gbnVsbCkgJiYgU2ltcGxlVmVyc2lvbi5WRVJTSU9OX0NPTVBBUkFUT1IuY29tcGFyZSh2ZXJzaW9uLCAiMi4wIikgPj0gMDsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChWZXJzaW9uRm9ybWF0RXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHtAbGluayAjaXNPcm1YbWwyXzBDb21wYXRpYmxlKCl9IGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCBPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkgZ2V0Q29udGV4dE5vZGVGYWN0b3J5Ml8wKCkgewotCQlyZXR1cm4gKE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeSkgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGdldENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0ZpbGVEZWZpbml0aW9uKCkuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YjgxOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUxvYkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1WaXJ0dWFsQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1WaXJ0dWFsSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLlVuc3VwcG9ydGVkT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JaW1wbGVtZW50cyBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLXsKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgYnVpbGRFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNFbnRpdHlNYXBwaW5ncyhwYXJlbnQsIHhtbEVudGl0eU1hcHBpbmdzKTsKLQl9Ci0JCi0JcHVibGljIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGJ1aWxkT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRW50aXR5TWFwcGluZ3MgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBidWlsZE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBidWlsZE9ybVBlcnNpc3RlbnRUeXBlKEVudGl0eU1hcHBpbmdzIHBhcmVudCwgWG1sVHlwZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybUVudGl0eSBidWlsZE9ybUVudGl0eShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbEVudGl0eSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW50aXR5KHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybU1hcHBlZFN1cGVyY2xhc3MgYnVpbGRPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1FbWJlZGRhYmxlIGJ1aWxkT3JtRW1iZWRkYWJsZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbEVtYmVkZGFibGUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUVtYmVkZGFibGUocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkVmlydHVhbE9ybVBlcnNpc3RlbnRGaWVsZChPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZUZpZWxkIGphdmFSZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBqYXZhUmVzb3VyY2VGaWVsZCk7Ci0JfQotCi0JcHVibGljIE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFZpcnR1YWxPcm1QZXJzaXN0ZW50UHJvcGVydHkoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiBuZXcgVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUocGFyZW50LCBqYXZhUmVzb3VyY2VHZXR0ZXIsIGphdmFSZXNvdXJjZVNldHRlcik7Ci0JfQotCi0JcHVibGljIE9ybVRhYmxlIGJ1aWxkT3JtVGFibGUoT3JtRW50aXR5IHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVGFibGUocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZSBidWlsZE9ybVNlY29uZGFyeVRhYmxlKE9ybUVudGl0eSBwYXJlbnQsIFRhYmxlLk93bmVyIG93bmVyLCBYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZShwYXJlbnQsIG93bmVyLCB4bWxTZWNvbmRhcnlUYWJsZSk7Ci0JfQotCi0JcHVibGljIE9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSBidWlsZE9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZShPcm1FbnRpdHkgcGFyZW50LCBSZWFkT25seVRhYmxlLk93bmVyIG93bmVyLCBKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZShwYXJlbnQsIG93bmVyLCBqYXZhU2Vjb25kYXJ5VGFibGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHJlc291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4ocGFyZW50LCBvd25lciwgcmVzb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JfQotCi0JcHVibGljIE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKHBhcmVudCwgb3duZXIsIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbik7Ci0JfQotCQotCXB1YmxpYyBPcm1Kb2luVGFibGUgYnVpbGRPcm1Kb2luVGFibGUoT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgcGFyZW50LCBUYWJsZS5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luVGFibGUocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1WaXJ0dWFsSm9pblRhYmxlIGJ1aWxkT3JtVmlydHVhbEpvaW5UYWJsZShPcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgcGFyZW50LCBSZWFkT25seVRhYmxlLk93bmVyIG93bmVyLCBSZWFkT25seUpvaW5UYWJsZSBvdmVycmlkZGVuVGFibGUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZShwYXJlbnQsIG93bmVyLCBvdmVycmlkZGVuVGFibGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBidWlsZE9ybUpvaW5Db2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Kb2luQ29sdW1uKHBhcmVudCwgb3duZXIsIHhtbEpvaW5Db2x1bW4pOwotCX0KLQotCXB1YmxpYyBPcm1WaXJ0dWFsSm9pbkNvbHVtbiBidWlsZE9ybVZpcnR1YWxKb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBSZWFkT25seUpvaW5Db2x1bW4gb3ZlcnJpZGRlbkNvbHVtbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1WaXJ0dWFsSm9pbkNvbHVtbihwYXJlbnQsIG93bmVyLCBvdmVycmlkZGVuQ29sdW1uKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRPcm1BdHRyaWJ1dGVPdmVycmlkZShPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbE92ZXJyaWRlKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlKHBhcmVudCwgeG1sT3ZlcnJpZGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKHBhcmVudCwgbmFtZSk7Ci0JfQotCQotCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxPdmVycmlkZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlKHBhcmVudCwgeG1sT3ZlcnJpZGUpOwotCX0KLQkKLQlwdWJsaWMgT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUocGFyZW50LCBuYW1lKTsKLQl9Ci0JCi0JcHVibGljIE9ybU92ZXJyaWRlUmVsYXRpb25zaGlwIGJ1aWxkT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAoT3JtQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCBidWlsZE9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcChPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBPcm1EaXNjcmltaW5hdG9yQ29sdW1uIGJ1aWxkT3JtRGlzY3JpbWluYXRvckNvbHVtbihPcm1FbnRpdHkgcGFyZW50LCBPcm1EaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4ocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1Db2x1bW4gYnVpbGRPcm1Db2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1Db2x1bW4uT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtVmlydHVhbENvbHVtbiBidWlsZE9ybVZpcnR1YWxDb2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1WaXJ0dWFsQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVZpcnR1YWxDb2x1bW4ocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1HZW5lcmF0ZWRWYWx1ZSBidWlsZE9ybUdlbmVyYXRlZFZhbHVlKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sR2VuZXJhdGVkVmFsdWUgcmVzb3VyY2VHZW5lcmF0ZWRWYWx1ZSkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZShwYXJlbnQsIHJlc291cmNlR2VuZXJhdGVkVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgT3JtR2VuZXJhdG9yQ29udGFpbmVyIGJ1aWxkT3JtR2VuZXJhdG9yQ29udGFpbmVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sR2VuZXJhdG9yQ29udGFpbmVyIHJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUdlbmVyYXRvckNvbnRhaW5lcihwYXJlbnQsIHJlc291cmNlR2VuZXJhdG9yQ29udGFpbmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkT3JtU2VxdWVuY2VHZW5lcmF0b3IoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxTZXF1ZW5jZUdlbmVyYXRvciByZXNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yKHBhcmVudCwgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCQotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvciBidWlsZE9ybVRhYmxlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sVGFibGVHZW5lcmF0b3IgcmVzb3VyY2VUYWJsZUdlbmVyYXRvcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcihwYXJlbnQsIHJlc291cmNlVGFibGVHZW5lcmF0b3IpOwotCX0KLQkKLQlwdWJsaWMgT3JtUXVlcnlDb250YWluZXIgYnVpbGRPcm1RdWVyeUNvbnRhaW5lcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFF1ZXJ5Q29udGFpbmVyIHJlc291cmNlUXVlcnlDb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtUXVlcnlDb250YWluZXIocGFyZW50LCByZXNvdXJjZVF1ZXJ5Q29udGFpbmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybU5hbWVkTmF0aXZlUXVlcnkgYnVpbGRPcm1OYW1lZE5hdGl2ZVF1ZXJ5KFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sTmFtZWROYXRpdmVRdWVyeSByZXNvdXJjZU5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTmFtZWROYXRpdmVRdWVyeShwYXJlbnQsIHJlc291cmNlTmFtZWROYXRpdmVRdWVyeSk7Ci0JfQotCQotCXB1YmxpYyBPcm1OYW1lZFF1ZXJ5IGJ1aWxkT3JtTmFtZWRRdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbE5hbWVkUXVlcnkgcmVzb3VyY2VOYW1lZFF1ZXJ5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU5hbWVkUXVlcnkocGFyZW50LCByZXNvdXJjZU5hbWVkUXVlcnkpOwotCX0KLQkKLQlwdWJsaWMgT3JtUXVlcnlIaW50IGJ1aWxkT3JtUXVlcnlIaW50KE9ybVF1ZXJ5IHBhcmVudCwgWG1sUXVlcnlIaW50IHJlc291cmNlUXVlcnlIaW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVF1ZXJ5SGludChwYXJlbnQsIHJlc291cmNlUXVlcnlIaW50KTsKLQl9Ci0JCi0JcHVibGljIE9ybUJhc2ljTWFwcGluZyBidWlsZE9ybUJhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWMgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUJhc2ljTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1FbWJlZGRlZE1hcHBpbmcgYnVpbGRPcm1FbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVtYmVkZGVkIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtRW1iZWRkZWRJZE1hcHBpbmcgYnVpbGRPcm1FbWJlZGRlZElkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sRW1iZWRkZWRJZCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtSWRNYXBwaW5nIGJ1aWxkT3JtSWRNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxJZCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtSWRNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nIGJ1aWxkT3JtTWFueVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybU1hbnlUb09uZU1hcHBpbmcgYnVpbGRPcm1NYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9PbmUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtT25lVG9NYW55TWFwcGluZyBidWlsZE9ybU9uZVRvTWFueU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1PbmVUb09uZU1hcHBpbmcgYnVpbGRPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtVHJhbnNpZW50TWFwcGluZyBidWlsZE9ybVRyYW5zaWVudE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbFRyYW5zaWVudCByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1WZXJzaW9uTWFwcGluZyBidWlsZE9ybVZlcnNpb25NYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxWZXJzaW9uIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1WZXJzaW9uTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkT3JtTnVsbEF0dHJpYnV0ZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyhwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxOdWxsQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgT3JtVW5pcXVlQ29uc3RyYWludCBidWlsZE9ybVVuaXF1ZUNvbnN0cmFpbnQoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBVbmlxdWVDb25zdHJhaW50Lk93bmVyIG93bmVyLCBYbWxVbmlxdWVDb25zdHJhaW50IHJlc291cmNlVW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50KHBhcmVudCwgb3duZXIsIHJlc291cmNlVW5pcXVlQ29uc3RyYWludCk7Ci0JfQotCi0JcHVibGljIE9ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50IGJ1aWxkT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgb3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQocGFyZW50LCBvdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludCk7Ci0JfQotCi0JcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIuT3duZXIgb3duZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW51bWVyYXRlZENvbnZlcnRlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE9ybUxvYkNvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtQ29udmVydGVyLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUxvYkNvbnZlcnRlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE9ybVRlbXBvcmFsQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcm1UZW1wb3JhbENvbnZlcnRlci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1UZW1wb3JhbENvbnZlcnRlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0JCi0JcHVibGljIE9ybU9yZGVyYWJsZSBidWlsZE9ybU9yZGVyYWJsZShPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PcmRlcmFibGUocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtWG1sRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmM5MmYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtWG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBBbGwgdGhlIHN0YXRlIGluIHRoZSBkZWZpbml0aW9uIHNob3VsZCBiZSAic3RhdGljIgotICogKGkuZS4gdW5jaGFuZ2luZyBvbmNlIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtWG1sRGVmaW5pdGlvbgotewotCXByb3RlY3RlZCBmaW5hbCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeTsKLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8T3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uPiB0eXBlTWFwcGluZ0RlZmluaXRpb25zOwotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gYXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zOwotCi0KLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mYWN0b3J5ID0gdGhpcy5idWlsZENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKTsKLQotCXB1YmxpYyBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIG1hcHBpbmcgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBnZXRUeXBlTWFwcGluZ0RlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJZm9yIChPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IHRoaXMuZ2V0VHlwZU1hcHBpbmdEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyBtYXBwaW5nS2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgbWFwcGluZyBkZWZpbml0aW9ucyB0byB1c2UgZm9yIHR5cGVzIGluCi0JICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGluZyBmaWxlcy4KLQkgKiBUaGUgb3JkZXIgaXMgdW5pbXBvcnRhbnQuCi0JICovCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBBcnJheUxpc3Q8T3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy50eXBlTWFwcGluZ0RlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMudHlwZU1hcHBpbmdEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRUeXBlTWFwcGluZ0RlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmdEZWZpbml0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gYnVpbGRUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8T3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8T3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uPigpOwotCQl0aGlzLmFkZFR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCXJldHVybiBkZWZpbml0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TKTsKLQl9Ci0KLQkvKioKLQkgKiBPcmRlciBzaG91bGQgbm90IG1hdHRlciBoZXJlOyBidXQgd2UnbGwgdXNlIHRoZSBzYW1lIG9yZGVyIGFzIGZvciBKYXZhLgotCSAqIEBzZWUgR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIFRZUEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCU9ybUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG1hcHBpbmcgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWZvciAoT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBtYXBwaW5nS2V5KSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgYXR0cmlidXRlcyBpbgotCSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHBpbmcgZmlsZXMuCi0JICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBnZXRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9ucyA9IHRoaXMuYnVpbGRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gYnVpbGRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnMoKSB7Ci0JCUFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPigpOwotCQl0aGlzLmFkZEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJcmV0dXJuIGRlZmluaXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUlkQ2xhc3NSZWZlcmVuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZENsYXNzUmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzZmYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybUlkQ2xhc3NSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0WG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBJRCBjbGFzcyByZWZlcmVuY2UKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1JZENsYXNzUmVmZXJlbmNlCi0JZXh0ZW5kcyBBYnN0cmFjdFhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1JZENsYXNzUmVmZXJlbmNlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE93bmVyIG93bmVyOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRJZENsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRJZENsYXNzTmFtZTsKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3M7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtSWRDbGFzc1JlZmVyZW5jZShPcm1UeXBlTWFwcGluZyBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5zcGVjaWZpZWRJZENsYXNzTmFtZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRJZENsYXNzTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lXyh0aGlzLmJ1aWxkU3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCS8vIHN5bmMgdGhlIGlkIGNsYXNzICphZnRlciogd2UgaGF2ZSB0aGUgc3BlY2lmaWVkIG5hbWUKLQkJdGhpcy5zeW5jSWRDbGFzcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdElkQ2xhc3NOYW1lKHRoaXMuYnVpbGREZWZhdWx0SWRDbGFzc05hbWUoKSk7Ci0JCXRoaXMudXBkYXRlSWRDbGFzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZCBjbGFzcyBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRJZENsYXNzTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkSWRDbGFzc05hbWUgOiB0aGlzLmRlZmF1bHRJZENsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJZENsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJZENsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRJZENsYXNzTmFtZSwgbmFtZSkpIHsKLQkJCVhtbENsYXNzUmVmZXJlbmNlIHhtbENsYXNzUmVmID0gdGhpcy5nZXRYbWxJZENsYXNzUmVmRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lXyhuYW1lKTsKLQkJCXhtbENsYXNzUmVmLnNldENsYXNzTmFtZShuYW1lKTsKLQkJCXRoaXMucmVtb3ZlWG1sSWRDbGFzc1JlZklmVW5zZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIGNsZWFyIG91dCB7QGxpbmsgI2lkQ2xhc3N9IGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgY29tcGFyZSBpdHMgbmFtZQotCSAqIHRvIHRoZSBzcGVjaWZpZWQgbmFtZSwgc2luY2UgaXQgbWF5IGhhdmUgYmVlbiBwcmVmaXhlZCBieSB0aGUgZW50aXR5Ci0JICogbWFwcGluZ3MgcGFja2FnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRJZENsYXNzTmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkSWRDbGFzc05hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkSWRDbGFzc05hbWUgPSBuYW1lOwotCQlpZiAodGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JRF9DTEFTU19OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpKSB7Ci0JCQkvLyBjbGVhciBvdXQgdGhlIEphdmEgdHlwZSBoZXJlLCBpdCB3aWxsIGJlIHJlYnVpbHQgZHVyaW5nICJ1cGRhdGUiCi0JCQlpZiAodGhpcy5pZENsYXNzICE9IG51bGwpIHsKLQkJCQl0aGlzLmlkQ2xhc3MuZGlzcG9zZSgpOwotCQkJCXRoaXMuc2V0SWRDbGFzcyhudWxsKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRJZENsYXNzTmFtZSgpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgeG1sSWRDbGFzc1JlZiA9IHRoaXMuZ2V0WG1sSWRDbGFzc1JlZigpOwotCQlyZXR1cm4gKHhtbElkQ2xhc3NSZWYgPT0gbnVsbCkgPyBudWxsIDogeG1sSWRDbGFzc1JlZi5nZXRDbGFzc05hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRJZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdElkQ2xhc3NOYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRJZENsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0SWRDbGFzc05hbWU7Ci0JCXRoaXMuZGVmYXVsdElkQ2xhc3NOYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSURfQ0xBU1NfTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdElkQ2xhc3NOYW1lKCkgewotCQlKYXZhSWRDbGFzc1JlZmVyZW5jZSBqYXZhUmVmID0gdGhpcy5vd25lci5nZXRKYXZhSWRDbGFzc1JlZmVyZW5jZUZvckRlZmF1bHRzKCk7Ci0JCXJldHVybiAoamF2YVJlZiA9PSBudWxsKSA/IG51bGwgOiBqYXZhUmVmLmdldEZ1bGx5UXVhbGlmaWVkSWRDbGFzc05hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SWRDbGFzc05hbWUoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBJVHlwZSBnZXRJZENsYXNzSmR0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmR0VHlwZSh0aGlzLmdldElkQ2xhc3NOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB4bWwgaWQgY2xhc3MgcmVmICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBYTUwgY2xhc3MgcmVmIGRvZXMgbm90IGV4aXN0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0WG1sSWRDbGFzc1JlZigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sSWRDbGFzc0NvbnRhaW5lcigpLmdldElkQ2xhc3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgWE1MIGNsYXNzIHJlZiBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0WG1sSWRDbGFzc1JlZkZvclVwZGF0ZSgpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgeG1sQ2xhc3NSZWYgPSB0aGlzLmdldFhtbElkQ2xhc3NSZWYoKTsKLQkJcmV0dXJuICh4bWxDbGFzc1JlZiAhPSBudWxsKSA/IHhtbENsYXNzUmVmIDogdGhpcy5idWlsZFhtbElkQ2xhc3NSZWYoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgYnVpbGRYbWxJZENsYXNzUmVmKCkgewotCQlYbWxDbGFzc1JlZmVyZW5jZSByZWYgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpOwotCQl0aGlzLmdldFhtbElkQ2xhc3NDb250YWluZXIoKS5zZXRJZENsYXNzKHJlZik7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sSWRDbGFzc1JlZklmVW5zZXQoKSB7Ci0JCWlmICh0aGlzLmdldFhtbElkQ2xhc3NSZWYoKS5pc1Vuc2V0KCkpIHsKLQkJCXRoaXMucmVtb3ZlWG1sSWRDbGFzc1JlZigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sSWRDbGFzc1JlZigpIHsKLQkJdGhpcy5nZXRYbWxJZENsYXNzQ29udGFpbmVyKCkuc2V0SWRDbGFzcyhudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaWQgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJZENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5pZENsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldElkQ2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG9sZCA9IHRoaXMuaWRDbGFzczsKLQkJdGhpcy5pZENsYXNzID0gaWRDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElEX0NMQVNTX1BST1BFUlRZLCBvbGQsIGlkQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzcGVjaWZpZWQgSUQgY2xhc3MgbmFtZSBjaGFuZ2VzIGR1cmluZwotCSAqIDxlbT5zeW5jPC9lbT4sIHRoZSBJRCBjbGFzcyB3aWxsIGJlIGNsZWFyZWQgb3V0IGluCi0JICoge0BsaW5rICNzZXRTcGVjaWZpZWRJZENsYXNzTmFtZV8oU3RyaW5nKX0uIElmIHdlIGdldCBoZXJlIGFuZAotCSAqIHRoZSBJRCBjbGFzcyBpcyBzdGlsbCBwcmVzZW50LCB3ZSBjYW4KLQkgKiA8Y29kZT5zeW5jPC9jb2RlPiBpdC4gT2YgY291cnNlLCBpdCBtaWdodCBiZSBzdGlsbCBvYnNvbGV0ZSBpZiB0aGUKLQkgKiBlbnRpdHkgbWFwcGluZ3MncyBwYWNrYWdlIGhhcyBjaGFuZ2VkLi4uLgotCSAqCi0JICogQHNlZSAjdXBkYXRlSWRDbGFzcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY0lkQ2xhc3MoKSB7Ci0JCWlmICh0aGlzLmlkQ2xhc3MgIT0gbnVsbCkgewotCQkJdGhpcy5pZENsYXNzLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgI3N5bmNJZENsYXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJZENsYXNzKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlSWRDbGFzcyA9IHRoaXMucmVzb2x2ZUphdmFSZXNvdXJjZUlkQ2xhc3MoKTsKLQkJaWYgKHJlc291cmNlSWRDbGFzcyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5pZENsYXNzICE9IG51bGwpIHsKLQkJCQl0aGlzLmlkQ2xhc3MuZGlzcG9zZSgpOwotCQkJCXRoaXMuc2V0SWRDbGFzcyhudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmlkQ2xhc3MgPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0SWRDbGFzcyh0aGlzLmJ1aWxkSWRDbGFzcyhyZXNvdXJjZUlkQ2xhc3MpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMuaWRDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkgPT0gcmVzb3VyY2VJZENsYXNzKSB7Ci0JCQkJCXRoaXMuaWRDbGFzcy51cGRhdGUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmlkQ2xhc3MuZGlzcG9zZSgpOwotCQkJCQl0aGlzLnNldElkQ2xhc3ModGhpcy5idWlsZElkQ2xhc3MocmVzb3VyY2VJZENsYXNzKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gVE9ETyBJJ20gbm90IHN1cmUgd2Ugc2hvdWxkIGJlIGdvIHRvIHRoZSBlbnRpdHkgbWFwcGluZ3MgdG8gcmVzb2x2ZQotCS8vIG91ciBuYW1lIGlmIGl0IGlzIHRha2VuIGZyb20gdGhlIEphdmEgSUQgY2xhc3MgcmVmZXJlbmNlLi4uCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgcmVzb2x2ZUphdmFSZXNvdXJjZUlkQ2xhc3MoKSB7Ci0JCVN0cmluZyBpZENsYXNzTmFtZSA9IHRoaXMuZ2V0SWRDbGFzc05hbWUoKTsKLQkJaWYgKGlkQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBqcmF0ID0gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKYXZhUmVzb3VyY2VUeXBlKGlkQ2xhc3NOYW1lKTsKLQkJaWYgKGpyYXQgPT0gbnVsbCB8fCBqcmF0LmdldEtpbmQoKSAhPSBLaW5kLlRZUEUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUphdmFSZXNvdXJjZVR5cGUganJ0ID0gKEphdmFSZXNvdXJjZVR5cGUpIGpyYXQ7Ci0JCXJldHVybiBqcnQuaXNBbm5vdGF0ZWRXaXRoKGdldEpwYVByb2plY3QoKS5nZXRUeXBlTWFwcGluZ0Fubm90YXRpb25zKCkpID8gbnVsbCA6IGpydDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSWRDbGFzcyhKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlSWRDbGFzcykgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUodGhpcywgcmVzb3VyY2VJZENsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpIHsKLQkJcmV0dXJuICckJzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybVR5cGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxJZENsYXNzQ29udGFpbmVyIGdldFhtbElkQ2xhc3NDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldFhtbElkQ2xhc3NDb250YWluZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbnRUeXBlLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldE92ZXJyaWRlUGVyc2lzdGVudFR5cGVBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgewotCQkvLyB0aGlzIHNob3VsZG4ndCBiZSBuZWVkZWQsIHNpbmNlIHdlJ3ZlIHNwZWNpZmllZCBhbiBvdmVycmlkZSBhY2Nlc3MsIGJ1dCBqdXN0IHRvIGJlIHNhZmUgLi4uCi0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sSWRDbGFzc1JlZigpLmNyZWF0ZVJlbmFtZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLmlkQ2xhc3MgIT0gbnVsbCkgJiYgdGhpcy5pZENsYXNzLmlzRm9yKHR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNJbihvcmlnaW5hbFBhY2thZ2UpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sSWRDbGFzc1JlZigpLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UpIHsKLQkJcmV0dXJuICh0aGlzLmlkQ2xhc3MgIT0gbnVsbCkgJiYgdGhpcy5pZENsYXNzLmlzSW4ob3JpZ2luYWxQYWNrYWdlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIG1vc3QgdmFsaWRhdGlvbiBpcyBkb25lICJob2xpc3RpY2FsbHkiIGZyb20gdGhlIHR5cGUgbWFwcGluZyBsZXZlbAotCQl0aGlzLnZhbGlkYXRlSWRDbGFzcyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAodGhpcy5pc1NwZWNpZmllZCgpKSB7Ci0JCQlKYXZhUmVzb3VyY2VUeXBlIGpydCA9IHRoaXMuZ2V0SWRDbGFzc0phdmFSZXNvdXJjZVR5cGUoKTsKLQkJCWlmIChqcnQgIT0gbnVsbCkgewotCi0JCQkJaWYgKCFqcnQuaXNQdWJsaWMoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfUFVCTElDLAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtqcnQuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJCQkJCSkKLQkJCQkJCQkpOwotCQkJCX0KLQotCQkJCWlmICghSkRUVG9vbHMudHlwZUlzU3ViVHlwZSh0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLCBqcnQuZ2V0UXVhbGlmaWVkTmFtZSgpLCBKRFRUb29scy5TRVJJQUxJWkFCTEVfQ0xBU1NfTkFNRSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTk9UX0lNUExFTUVOVF9TRVJJQUxJWkFCTEUsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10ge2pydC5nZXRRdWFsaWZpZWROYW1lKCl9LCAKLQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkJCQkJKQotCQkJCQkJCSk7Ci0JCQkJfQotCi0JCQkJaWYgKCFqcnQuaGFzRXF1YWxzTWV0aG9kKCkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19FUVVBTFNfTUVUSE9ELAotCQkJCQkJCQkJbmV3IFN0cmluZ1tdIHtqcnQuZ2V0UXVhbGlmaWVkTmFtZSgpfSwgCi0JCQkJCQkJCQl0aGlzLAotCQkJCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJCQkJCSkKLQkJCQkJCQkpOwotCQkJCX0KLQotCQkJCWlmICghanJ0Lmhhc0hhc2hDb2RlTWV0aG9kKCkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0QsCi0JCQkJCQkJCQluZXcgU3RyaW5nW10ge2pydC5nZXRRdWFsaWZpZWROYW1lKCl9LCAKLQkJCQkJCQkJCXRoaXMsCi0JCQkJCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkJCQkJKQotCQkJCQkJCSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0SWRDbGFzc05hbWUoKSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19OQU1FX0VNUFRZLAotCQkJCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksIAotCQkJCQkJCQl0aGlzLAotCQkJCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkJKQotCQkJCSk7Ci0JCQl9IGVsc2UgaWYgKCAhIHRoaXMuaWRDbGFzc0V4aXN0cygpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTk9UX0VYSVNULAotCQkJCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQkJCXRoaXMsCi0JCQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VUeXBlIGdldElkQ2xhc3NKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gKEphdmFSZXNvdXJjZVR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUodGhpcy5nZXRJZENsYXNzTmFtZSgpLCBLaW5kLlRZUEUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlkQ2xhc3NFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKZHRUeXBlKGdldElkQ2xhc3NOYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIHhtbElkQ2xhc3NSZWYgPSB0aGlzLmdldFhtbElkQ2xhc3NSZWYoKTsKLQkJcmV0dXJuICh4bWxJZENsYXNzUmVmID09IG51bGwpID8gbnVsbCA6IHhtbElkQ2xhc3NSZWYuZ2V0Q2xhc3NOYW1lVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZGE5MmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEFic3RyYWN0T3JtTWFwcGluZ1JlbGF0aW9uc2hpcDxPcm1NYW55VG9NYW55TWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgbWFwcGVkQnlTdHJhdGVneTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgam9pblRhYmxlU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvTWFueVJlbGF0aW9uc2hpcChPcm1NYW55VG9NYW55TWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5ID0gdGhpcy5idWlsZE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneSA9IHRoaXMuYnVpbGRKb2luVGFibGVTdHJhdGVneSgpOwotCi0JCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJhdGVneSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCQl9Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBwZWQgYnkgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIE9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0TWFwcGVkQnlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnlTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzTWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMubWFwcGVkQnlTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvTWFwcGVkQnkoKSB7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5hZGRTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbWFwcGluZy5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXByb3RlY3RlZCBPcm1NYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZE1hcHBlZEJ5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKSB7Ci0JCS8vIGpvaW4gdGFibGUgaXMgdGhlIGRlZmF1bHQgc3RyYXRlZ3ksIHNvIG5vIG5lZWQgdG8gYWRkIHRvIHJlc291cmNlCi0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnVwZGF0ZVN0cmF0ZWd5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgYnVpbGRKb2luVGFibGVTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCkgewotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21NYXBwZWRCeVJlbGF0aW9uc2hpcCh0aGlzKTsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAoTWFwcGVkQnlSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAob2xkUmVsYXRpb25zaGlwKTsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmluaXRpYWxpemVGcm9tKG9sZFJlbGF0aW9uc2hpcC5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcChvbGRSZWxhdGlvbnNoaXApOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LmluaXRpYWxpemVGcm9tKG9sZFJlbGF0aW9uc2hpcC5nZXRKb2luVGFibGVTdHJhdGVneSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sTWFueVRvTWFueSBnZXRYbWxNYXBwaW5nKCkgewotCQlyZXR1cm4gKFhtbE1hbnlUb01hbnkpIHN1cGVyLmdldFhtbE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sTWFueVRvTWFueSBnZXRYbWxDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kucmVsYXRpb25zaGlwSXNPd25lZEJ5KG1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNzkzODguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgQWJzdHJhY3RPcm1NYXBwaW5nUmVsYXRpb25zaGlwPE9ybU1hbnlUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luQ29sdW1uU3RyYXRlZ3k7Ci0KLQkvLyBKUEEgMi4wCi0JcHJvdGVjdGVkIGZpbmFsIE9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luVGFibGVTdHJhdGVneTsKLQotCQotCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvT25lUmVsYXRpb25zaGlwKE9ybU1hbnlUb09uZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0KLQkJdGhpcy5zdHJhdGVneSA9IHRoaXMuYnVpbGRTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJhdGVneSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQlpZiAodGhpcy5qb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKSAhPSBudWxsKXsKLQkJCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKSB7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJbmV3IEdlbmVyaWNPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcykgOgotCQkJCW5ldyBOdWxsT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luQ29sdW1uU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKSB7Ci0JCS8vIGpvaW4gY29sdW1uIHN0cmF0ZWd5IGlzIHRoZSBkZWZhdWx0OyBzbyBubyBuZWVkIHRvIGFkZCBzdHVmZiwKLQkJLy8ganVzdCByZW1vdmUgYWxsIHRoZSBvdGhlcnMKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnVwZGF0ZVN0cmF0ZWd5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKSA9PSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCkgewotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKHRoaXMpOwotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb20ob2xkUmVsYXRpb25zaGlwLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChvbGRSZWxhdGlvbnNoaXApOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxNYW55VG9PbmUgZ2V0WG1sTWFwcGluZygpIHsKLQkJcmV0dXJuIChYbWxNYW55VG9PbmUpIHN1cGVyLmdldFhtbE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sTWFueVRvT25lIGdldFhtbENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3duZXIoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3duZWRCeShSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2E4ZWI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5SZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBtYXBwZWRCeUF0dHJpYnV0ZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5KE9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm1hcHBlZEJ5QXR0cmlidXRlID0gdGhpcy5nZXRYbWxNYXBwZWRCeU1hcHBpbmcoKS5nZXRNYXBwZWRCeSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldE1hcHBlZEJ5QXR0cmlidXRlXyh0aGlzLmdldFhtbE1hcHBlZEJ5TWFwcGluZygpLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBwZWQgYnkgYXR0cmlidXRlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5QXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5QXR0cmlidXRlKFN0cmluZyBtYXBwZWRCeUF0dHJpYnV0ZSkgewotCQl0aGlzLnNldE1hcHBlZEJ5QXR0cmlidXRlXyhtYXBwZWRCeUF0dHJpYnV0ZSk7Ci0JCXRoaXMuZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkuc2V0TWFwcGVkQnkobWFwcGVkQnlBdHRyaWJ1dGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1hcHBlZEJ5QXR0cmlidXRlXyhTdHJpbmcgbWFwcGVkQnlBdHRyaWJ1dGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnlBdHRyaWJ1dGU7Ci0JCXRoaXMubWFwcGVkQnlBdHRyaWJ1dGUgPSBtYXBwZWRCeUF0dHJpYnV0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIG9sZCwgbWFwcGVkQnlBdHRyaWJ1dGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxNYXBwZWRCeU1hcHBpbmcgZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRYbWxDb250YWluZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IG9sZFN0cmF0ZWd5KSB7Ci0JCXRoaXMuc2V0TWFwcGVkQnlBdHRyaWJ1dGUob2xkU3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgb3duZXIgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE93bmVyKCk7Ci0JCXJldHVybiAob3duZXIgPT0gbnVsbCkgPyBudWxsIDogb3duZXIuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0U3RyYXRlZ3koKS5nZXRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIG93bmVyID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBPd25lcigpOwotCQlyZXR1cm4gKG93bmVyID09IG51bGwpID8gbnVsbCA6IG93bmVyLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIG93bmVyID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBPd25lcigpOwotCQlyZXR1cm4gKG93bmVyICE9IG51bGwpICYmIG93bmVyLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UYWJsZU5vdFZhbGlkRGVzY3JpcHRpb24oKSB7Ci0JCS8vIHRoaXMgd2lsbCBub3QgYmUgY2FsbGVkIGlmIGdldFJlbGF0aW9uc2hpcE93bmVyKCkgcmV0dXJucyBudWxsCi0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0U3RyYXRlZ3koKS5nZXRDb2x1bW5UYWJsZU5vdFZhbGlkRGVzY3JpcHRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlbGF0aW9uc2hpcE93bmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWxhdGlvbnNoaXBJc093bmVkQnkoUmVsYXRpb25zaGlwTWFwcGluZyBvdGhlck1hcHBpbmcpIHsKLQkJU3RyaW5nIHRoaXNFbnRpdHlOYW1lID0gdGhpcy5nZXRFbnRpdHlOYW1lKCk7Ci0JCUVudGl0eSBvdGhlckVudGl0eSA9IG90aGVyTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlTdHJpbmcgb3RoZXJFbnRpdHlOYW1lID0gKG90aGVyRW50aXR5ID09IG51bGwpID8gbnVsbCA6IG90aGVyRW50aXR5LmdldE5hbWUoKTsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXNFbnRpdHlOYW1lLCBvdGhlckVudGl0eU5hbWUpICYmCi0JCQkJVG9vbHMudmFsdWVzQXJlRXF1YWwodGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSwgb3RoZXJNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbnRpdHlOYW1lKCkgewotCQlFbnRpdHkgZW50aXR5ID0gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRFbnRpdHkoKTsKLQkJcmV0dXJuIChlbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogZW50aXR5LmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSBzZWxlY3RPdmVycmlkZVN0cmF0ZWd5KFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgb3ZlcnJpZGVSZWxhdGlvbnNoaXApIHsKLQkJcmV0dXJuIG51bGw7ICAvLyBtYXBwZWQtYnkgc3RyYXRlZ2llcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbgotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0cmF0ZWd5KCkgewotCQlpZiAodGhpcy5tYXBwZWRCeUF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNldE1hcHBlZEJ5QXR0cmlidXRlKCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLm1hcHBlZEJ5QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0QWxsVGFyZ2V0RW50aXR5QXR0cmlidXRlTmFtZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0KLQkJaWYgKHRoaXMubWFwcGVkQnlBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRW50aXR5IHRhcmdldEVudGl0eSA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAgLy8gbnVsbCB0YXJnZXQgZW50aXR5IGlzIHZhbGlkYXRlZCBlbHNld2hlcmUKLQkJfQotCi0JCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGVkQnlNYXBwaW5nID0gdGFyZ2V0RW50aXR5LnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKHRoaXMubWFwcGVkQnlBdHRyaWJ1dGUpOwotCi0JCWlmIChtYXBwZWRCeU1hcHBpbmcgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCXRoaXMuYnVpbGRNZXNzYWdlKAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWSwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLm1hcHBlZEJ5QXR0cmlidXRlfQotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoICEgdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5tYXlCZU1hcHBlZEJ5KG1hcHBlZEJ5TWFwcGluZykpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQl0aGlzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlksCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5tYXBwZWRCeUF0dHJpYnV0ZX0KLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaWYgbWFwcGVkQnlNYXBwaW5nIGlzIG5vdCBhIHJlbGF0aW9uc2hpcCBvd25lciwgdGhlbiBpdCBzaG91bGQgaGF2ZQotCQkvLyBiZWVuIGZsYWdnZWQgaW4gYWJvdmUgcnVsZSAobWFwcGVkQnlJc1ZhbGlkKQotCQlpZiAoICEgKChSZWxhdGlvbnNoaXBNYXBwaW5nKSBtYXBwZWRCeU1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCXRoaXMuYnVpbGRNZXNzYWdlKAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUywKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLm1hcHBlZEJ5QXR0cmlidXRlfQotCQkJCSkKLQkJCSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKFN0cmluZyBtc2dJRCwgU3RyaW5nW10gcGFybXMpIHsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVEZXNjcmlwdGlvbiA9IE5MUy5iaW5kKEpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzLkFUVFJJQlVURV9ERVNDLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJcGFybXMgPSBBcnJheVRvb2xzLmFkZChwYXJtcywgMCwgYXR0cmlidXRlRGVzY3JpcHRpb24pOwotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQltc2dJRCwKLQkJCQlwYXJtcywKLQkJCQl0aGlzLAotCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkuZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4YzdkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5SZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWltcGxlbWVudHMgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotewotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIHRhcmdldEZvcmVpZ25LZXk7Ci0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHN0cmF0ZWd5IGlzIGZvciBhICJzb3VyY2UiIGZvcmVpZ24ga2V5LgotCSAqLwotCXB1YmxpYyBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneShPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3koT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXAgcGFyZW50LCBib29sZWFuIHRhcmdldEZvcmVpZ25LZXkpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50YXJnZXRGb3JlaWduS2V5ID0gdGFyZ2V0Rm9yZWlnbktleTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCXJldHVybiB0aGlzLnRhcmdldEZvcmVpZ25LZXkgPwotCQkJCW1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSA6Ci0JCQkJbWFwcGluZy5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQlyZXR1cm4gdGhpcy50YXJnZXRGb3JlaWduS2V5ID8KLQkJCQltYXBwaW5nLmdldFR5cGVNYXBwaW5nKCkgOgotCQkJCW1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldEVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdGFyZ2V0ID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJcmV0dXJuICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHkpID8gKEVudGl0eSkgdGFyZ2V0IDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldEZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEZvcmVpZ25LZXk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kgc2VsZWN0T3ZlcnJpZGVTdHJhdGVneShSZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIG92ZXJyaWRlUmVsYXRpb25zaGlwKSB7Ci0JCXJldHVybiBvdmVycmlkZVJlbGF0aW9uc2hpcC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRhYmxlTm90VmFsaWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzLk5PVF9WQUxJRF9GT1JfVEhJU19FTlRJVFk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBKb2luQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcyBpbiB0aGUgdHlwZSBtYXBwaW5nJ3MgcHJpbWFyeSB0YWJsZQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcFRhcmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgSm9pbkNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhlNTc1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5JbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Kb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Kb2luVGFibGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5SZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0T3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIE9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotewotCXB1YmxpYyBHZW5lcmljT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KE9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpLmlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSBzZWxlY3RPdmVycmlkZVN0cmF0ZWd5KFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgb3ZlcnJpZGVSZWxhdGlvbnNoaXApIHsKLQkJcmV0dXJuIG92ZXJyaWRlUmVsYXRpb25zaGlwLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkudmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCBjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEpvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBKb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luVGFibGVWYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUpvaW5UYWJsZSkgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMzE3MDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uTnVsbE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU1hcHBpbmdSZWxhdGlvbnNoaXA8T3JtT25lVG9NYW55TWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMAotewotCXByb3RlY3RlZCBmaW5hbCBPcm1NYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBtYXBwZWRCeVN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luVGFibGVTdHJhdGVneTsKLQotCS8vIEpQQSAyLjAgb3IgRWNsaXBzZUxpbmsKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzdXBwb3J0c0pvaW5Db2x1bW5TdHJhdGVneTsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luQ29sdW1uU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtT25lVG9NYW55UmVsYXRpb25zaGlwKE9ybU9uZVRvTWFueU1hcHBpbmcgcGFyZW50LCBib29sZWFuIHN1cHBvcnRzSm9pbkNvbHVtblN0cmF0ZWd5KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneSA9IHRoaXMuYnVpbGRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCXRoaXMuc3VwcG9ydHNKb2luQ29sdW1uU3RyYXRlZ3kgPSBzdXBwb3J0c0pvaW5Db2x1bW5TdHJhdGVneTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0KLQkJLy8gYnVpbGQgam9pbiB0YWJsZSBzdHJhdGVneSBsYXN0IHNpbmNlIGl0J3MgZGVwZW5kZW50IG9uIHRoZSBvdGhlciBzdHJhdGVnaWVzCi0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKTsKLQotCQl0aGlzLnN0cmF0ZWd5ID0gdGhpcy5idWlsZFN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS51cGRhdGUoKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyYXRlZ3kgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZFN0cmF0ZWd5KCkgewotCQlpZiAodGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMubWFwcGVkQnlTdHJhdGVneTsKLQkJfQotCQlpZiAodGhpcy5zdXBwb3J0c0pvaW5Db2x1bW5TdHJhdGVneSkgewotCQkJaWYgKHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHBlZCBieSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRNYXBwZWRCeVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpIHsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUJlTWFwcGVkQnkoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCVN0cmluZyBrZXkgPSBtYXBwaW5nLmdldEtleSgpOwotCQlpZiAoa2V5ID09IE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHRoaXMuc3VwcG9ydHNKb2luQ29sdW1uU3RyYXRlZ3kpIHsKLQkJCXJldHVybiBrZXkgPT0gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBPcm1NYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZE1hcHBlZEJ5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKSB7Ci0JCS8vIGpvaW4gdGFibGUgaXMgZGVmYXVsdCwgc28gbm8gbmVlZCB0byBhZGQgdG8gcmVzb3VyY2UKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsKSAmJgotCQkJCSEgdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luQ29sdW1uU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKSB7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3VwcG9ydHNKb2luQ29sdW1uU3RyYXRlZ3kgPwotCQkJCW5ldyBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzLCB0cnVlKSA6ICAvLyB0cnVlID0gdGFyZ2V0IGZvcmVpZ24ga2V5Ci0JCQkJbmV3IE51bGxPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnNpb25zICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihSZWxhdGlvbnNoaXAgbmV3UmVsYXRpb25zaGlwKSB7Ci0JCW5ld1JlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKHRoaXMpOwotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JCW5ld1JlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21NYXBwZWRCeVJlbGF0aW9uc2hpcChNYXBwZWRCeVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21NYXBwZWRCeVJlbGF0aW9uc2hpcChvbGRSZWxhdGlvbnNoaXApOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb20ob2xkUmVsYXRpb25zaGlwLmdldE1hcHBlZEJ5U3RyYXRlZ3koKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb20ob2xkUmVsYXRpb25zaGlwLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChvbGRSZWxhdGlvbnNoaXApOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxPbmVUb01hbnkgZ2V0WG1sTWFwcGluZygpIHsKLQkJcmV0dXJuIChYbWxPbmVUb01hbnkpIHN1cGVyLmdldFhtbE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sT25lVG9NYW55IGdldFhtbENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3duZXIoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSA9PSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3duZWRCeShSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnlTdHJhdGVneS5yZWxhdGlvbnNoaXBJc093bmVkQnkobWFwcGluZyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuaXNUYXJnZXRGb3JlaWduS2V5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lUmVsYXRpb25zaGlwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWE0NmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEFic3RyYWN0T3JtTWFwcGluZ1JlbGF0aW9uc2hpcDxPcm1PbmVUb09uZU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMAotewotCXByb3RlY3RlZCBmaW5hbCBPcm1NYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBtYXBwZWRCeVN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybU1hcHBpbmdQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIHByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3k7Ci0KLQkvLyBKUEEgMi4wCi0JcHJvdGVjdGVkIGZpbmFsIE9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBqb2luVGFibGVTdHJhdGVneTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGpvaW5Db2x1bW5TdHJhdGVneTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1PbmVUb09uZVJlbGF0aW9uc2hpcChPcm1PbmVUb09uZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneSA9IHRoaXMuYnVpbGRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSA9IHRoaXMuYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0KLQkJdGhpcy5zdHJhdGVneSA9IHRoaXMuYnVpbGRTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm1hcHBlZEJ5U3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS51cGRhdGUoKTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyYXRlZ3kgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZFN0cmF0ZWd5KCkgewotCQlpZiAodGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMubWFwcGVkQnlTdHJhdGVneTsKLQkJfQotCQlpZiAodGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5Lmhhc1ByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5OwotCQl9Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQlpZiAodGhpcy5qb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKSAhPSBudWxsKXsKLQkJCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHBlZCBieSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRNYXBwZWRCeVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpIHsKLQkJdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXlCZU1hcHBlZEJ5KEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gbWFwcGluZy5nZXRLZXkoKSA9PSBNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgYnVpbGRNYXBwZWRCeVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9QcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc0pvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvSm9pblRhYmxlKCkgewotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJbmV3IEdlbmVyaWNPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcykgOgotCQkJCW5ldyBOdWxsT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCkgewotCQkvLyBqb2luIGNvbHVtbiBzdHJhdGVneSBpcyB0aGUgZGVmYXVsdDsgc28gbm8gbmVlZCB0byBhZGQgc3R1ZmYsCi0JCS8vIGp1c3QgcmVtb3ZlIGFsbCB0aGUgb3RoZXJzCi0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnVwZGF0ZVN0cmF0ZWd5KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKHRoaXMubWFwcGVkQnlTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGwpICYmCi0JCQkJKHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgPT0gMCkgJiYKLQkJCQkodGhpcy5qb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKSA9PSBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBidWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAodGhpcyk7Ci0JCW5ld1JlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcCh0aGlzKTsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcCh0aGlzKTsKLQkJLy8gbm8gb3RoZXIgcGsgam9pbiBjb2x1bW4gcmVsYXRpb25zaGlwcyB5ZXQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKE1hcHBlZEJ5UmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbU1hcHBlZEJ5UmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0TWFwcGVkQnlTdHJhdGVneSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5UYWJsZVJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAob2xkUmVsYXRpb25zaGlwKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKG9sZFJlbGF0aW9uc2hpcCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LmluaXRpYWxpemVGcm9tKG9sZFJlbGF0aW9uc2hpcC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbE9uZVRvT25lIGdldFhtbE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoWG1sT25lVG9PbmUpIHN1cGVyLmdldFhtbE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sT25lVG9PbmUgZ2V0WG1sQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnlTdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpID09IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPd25lZEJ5KFJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeVN0cmF0ZWd5LnJlbGF0aW9uc2hpcElzT3duZWRCeShtYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMubWFwcGVkQnlTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTg2YjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0T3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JcHVibGljIEdlbmVyaWNPcm1PdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneShPcm1PdmVycmlkZVJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkSm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVGFyZ2V0Rm9yZWlnbktleSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCXJldHVybiAocmVsYXRpb25zaGlwTWFwcGluZyAhPSBudWxsKSAmJgotCQkJCXJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuaXNUYXJnZXRGb3JlaWduS2V5KCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYXJnZXRGb3JlaWduS2V5KCkgPwotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRUeXBlTWFwcGluZygpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmdUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZ1RhcmdldEVudGl0eSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBtYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXRFbnRpdHkoKSB7Ci0JCVR5cGVNYXBwaW5nIHRhcmdldCA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0JCXJldHVybiAodGFyZ2V0IGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHRhcmdldCA6IG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0QXR0cmlidXRlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJc3VwZXIuZ2V0VGFibGVOYW1lKCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFyZ2V0Rm9yZWlnbktleSgpID8KLQkJCQlzdXBlci5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYXJnZXRGb3JlaWduS2V5KCkgPwotCQkJCXN1cGVyLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFyZ2V0Rm9yZWlnbktleSgpID8KLQkJCQlzdXBlci5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU92ZXJyaWRlUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIChPcm1PdmVycmlkZVJlbGF0aW9uc2hpcCkgc3VwZXIuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBKb2luQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldEF0dHJpYnV0ZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBHZW5lcmljT3JtT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gcmVsYXRpb25zaGlwTWFwcGluZyA9PSBudWxsID8gbnVsbCA6IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuYnVpbGRDb2x1bW5WYWxpZGF0b3IoKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sdW1uLCB0aGlzLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMzE1MjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5PbmVUb09uZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1NYXBwaW5nUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotewotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIgcHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcjsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KE9ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1ByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGdldFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gdGhpcy5idWlsZFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChpbmRleCwgeG1sSm9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKSBqb2luQ29sdW1uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4odGhpcy5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4sIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29sdW1uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMsIHRoaXMucHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lciwgeG1sSm9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uLCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIgY29udGFpbmVyID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciBnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0WG1sQ29udGFpbmVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuTk9UX1ZBTElEX0ZPUl9USElTX0VOVElUWTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHNlbGVjdE92ZXJyaWRlU3RyYXRlZ3koUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBvdmVycmlkZVJlbGF0aW9uc2hpcCkgewotCQlyZXR1cm4gbnVsbDsgIC8vIHBrIGpvaW4gY29sdW1uIHN0cmF0ZWdpZXMgY2Fubm90IGJlIG92ZXJyaWRkZW4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJhdGVneSgpIHsKLQkJaWYgKHRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpID09IDApIHsKLQkJCXRoaXMuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmF0ZWd5KCkgewotCQlmb3IgKGludCBpID0gdGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7IGktLSA+IDA7ICkgewotCQkJdGhpcy5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbihpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWZvciAoT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uIDogdGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJcGtKb2luQ29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMgaW4gdGhlIHR5cGUgbWFwcGluZydzIHByaW1hcnkgdGFibGUKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFRhYmxlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJRW50aXR5IHJlbGF0aW9uc2hpcFRhcmdldCA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0JCQlyZXR1cm4gKHJlbGF0aW9uc2hpcFRhcmdldCA9PSBudWxsKSA/IG51bGwgOiByZWxhdGlvbnNoaXBUYXJnZXQuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBPbmVUb09uZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWQ4YjE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsSm9pblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGpvaW4gdGFibGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1WaXJ0dWFsSm9pblRhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVZpcnR1YWxSZWZlcmVuY2VUYWJsZTxSZWFkT25seUpvaW5UYWJsZT4KLQlpbXBsZW1lbnRzIE9ybVZpcnR1YWxKb2luVGFibGUKLXsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsSm9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uPiBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGludmVyc2VKb2luQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbEpvaW5Db2x1bW4gZGVmYXVsdEludmVyc2VKb2luQ29sdW1uOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybVZpcnR1YWxKb2luVGFibGUoT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHBhcmVudCwgT3duZXIgb3duZXIsIFJlYWRPbmx5Sm9pblRhYmxlIG92ZXJyaWRkZW5UYWJsZSkgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCBvdmVycmlkZGVuVGFibGUpOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVZpcnR1YWxKb2luQ29sdW1uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldE92ZXJyaWRkZW5JbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5Sm9pbkNvbHVtbj4odGhpcy5nZXRPdmVycmlkZGVuVGFibGUoKS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCwgT3JtVmlydHVhbEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudChpbmRleCwgam9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxKb2luQ29sdW1uIGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCwgUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKE9ybVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtVmlydHVhbEpvaW5Db2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1uIGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVZpcnR1YWxKb2luQ29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1WaXJ0dWFsSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KFJlYWRPbmx5Sm9pbkNvbHVtbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZS50aGlzLmJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxKb2luVGFibGUudGhpcy5nZXRPdmVycmlkZGVuSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVZpcnR1YWxKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgaW52ZXJzZSBqb2luIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKE9ybVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJT3JtVmlydHVhbEpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE9ybVZpcnR1YWxKb2luQ29sdW1uPiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48T3JtVmlydHVhbEpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkgewotCQkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IG51bGwpIHsKLQkJCQl0aGlzLnNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbih0aGlzLmJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4odGhpcy5nZXRPdmVycmlkZGVuVGFibGUoKS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRzRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxKb2luQ29sdW1uIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4oUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRKb2luQ29sdW1uKHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5Pd25lciwgam9pbkNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmdldEpvaW5UYWJsZURlZmF1bHROYW1lKCk7Ci0JfQotCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpvaW5Db2x1bW5zKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGVKb2luQ29sdW1ucyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlTm9kZXModGhpcy5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSwgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkudmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBqdXN0IGEgbGl0dGxlIGNvbW1vbiBiZWhhdmlvcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHJvdGVjdGVkIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCB0YWJsZSBuYW1lIGl0IG5lZWRzIHRvIGJlIHRoZSBzYW1lCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUuIFRoZSB0YWJsZSBpcyBhbHdheXMgdGhlIGpvaW4gdGFibGUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldERlZmF1bHRUYWJsZU5hbWUoKSwgdGFibGVOYW1lKTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGUgam9pbiBjb2x1bW4gY2FuIG9ubHkgYmUgb24gdGhlIGpvaW4gdGFibGUgaXRzZWxmCi0JCSAqLwotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChHZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldE5hbWUoKSwgdGFibGVOYW1lKSA/Ci0JCQkJCUdlbmVyaWNPcm1WaXJ0dWFsSm9pblRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpIDoKLQkJCQkJbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMsIG9idmlvdXNseSwgaW4gdGhlIGpvaW4gdGFibGU7Ci0JCSAqIG5vdCBzdXJlIHdoZXRoZXIgaXQgY2FuIGJlIGFueXdoZXJlIGVsc2UuLi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1WaXJ0dWFsUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1WaXJ0dWFsSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogb3duZXIgZm9yICJiYWNrLXBvaW50ZXIiIGpvaW4gY29sdW1uczsKLQkgKiB0aGVzZSBwb2ludCBhdCB0aGUgc291cmNlL293bmluZyBlbnRpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0VGFyZ2V0QXR0cmlidXRlTmFtZShHZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBkYlRhYmxlID0gc3VwZXIucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUgOiB0aGlzLmdldFR5cGVNYXBwaW5nKCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxKb2luVGFibGUudGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxKb2luVGFibGUudGhpcy5nZXRKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcywgKEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBvd25lciBmb3IgImZvcndhcmQtcG9pbnRlciIgam9pbiBjb2x1bW5zOwotCSAqIHRoZXNlIHBvaW50IGF0IHRoZSB0YXJnZXQvaW52ZXJzZSBlbnRpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5Pd25lcgotCQlleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IEdlbmVyaWNPcm1WaXJ0dWFsSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQkJcmV0dXJuIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IEdlbmVyaWNPcm1WaXJ0dWFsSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQkJcmV0dXJuIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCW9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZGJUYWJsZSA9IHN1cGVyLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRiVGFibGU7Ci0JCQl9Ci0JCQlFbnRpdHkgcmVsYXRpb25zaGlwVGFyZ2V0ID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJCXJldHVybiAocmVsYXRpb25zaGlwVGFyZ2V0ID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcFRhcmdldC5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlFbnRpdHkgcmVsYXRpb25zaGlwVGFyZ2V0ID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJCXJldHVybiAocmVsYXRpb25zaGlwVGFyZ2V0ID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcFRhcmdldC5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbEpvaW5UYWJsZS50aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxKb2luVGFibGUudGhpcy5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZDhkODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtVmlydHVhbEpvaW5Db2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbjsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3koT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IHRoaXMuYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgOiB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZ2V0RGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0T3ZlcnJpZGRlblNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBvdmVycmlkZGVuU3RyYXRlZ3kgPSB0aGlzLmdldE92ZXJyaWRkZW5TdHJhdGVneSgpOwotCQlyZXR1cm4gKG92ZXJyaWRkZW5TdHJhdGVneSA9PSBudWxsKSA/Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPFJlYWRPbmx5Sm9pbkNvbHVtbj5pbnN0YW5jZSgpIDoKLQkJCQluZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5Sm9pbkNvbHVtbj4ob3ZlcnJpZGRlblN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsSm9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVZpcnR1YWxKb2luQ29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtVmlydHVhbEpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChSZWFkT25seUpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmJ1aWxkSm9pbkNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0T3ZlcnJpZGRlblNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KE9ybVZpcnR1YWxKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBqb2luIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtVmlydHVhbEpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKE9ybVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJT3JtVmlydHVhbEpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OX1BST1BFUlRZLCBvbGQsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtVmlydHVhbEpvaW5Db2x1bW4+IGdldERlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxPcm1WaXJ0dWFsSm9pbkNvbHVtbj5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCVJlYWRPbmx5Sm9pbkNvbHVtbiBvdmVycmlkZGVuRGVmYXVsdEpvaW5Db2x1bW4gPSB0aGlzLmdldE92ZXJyaWRkZW5EZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlpZiAob3ZlcnJpZGRlbkRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpICYmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uLmdldE92ZXJyaWRkZW5Db2x1bW4oKSA9PSBvdmVycmlkZGVuRGVmYXVsdEpvaW5Db2x1bW4pKSB7Ci0JCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbih0aGlzLmJ1aWxkSm9pbkNvbHVtbihvdmVycmlkZGVuRGVmYXVsdEpvaW5Db2x1bW4pKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW4gZ2V0T3ZlcnJpZGRlbkRlZmF1bHRKb2luQ29sdW1uKCkgewotCQlSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBvdmVycmlkZGVuU3RyYXRlZ3kgPSB0aGlzLmdldE92ZXJyaWRkZW5TdHJhdGVneSgpOwotCQlyZXR1cm4gKG92ZXJyaWRkZW5TdHJhdGVneSA9PSBudWxsKSA/IG51bGwgOiBvdmVycmlkZGVuU3RyYXRlZ3kuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0T3ZlcnJpZGRlblN0cmF0ZWd5KCkgewotCQlSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gdGhpcy5nZXRPdmVycmlkZGVuSm9pbkNvbHVtblJlbGF0aW9uc2hpcCgpOwotCQlyZXR1cm4gKHJlbGF0aW9uc2hpcCA9PSBudWxsKSA/IG51bGwgOiByZWxhdGlvbnNoaXAuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCBnZXRPdmVycmlkZGVuSm9pbkNvbHVtblJlbGF0aW9uc2hpcCgpIHsKLQkJUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gdGhpcy5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCgpOwotCQlyZXR1cm4gKHJlbGF0aW9uc2hpcCBpbnN0YW5jZW9mIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgPyAoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwKSByZWxhdGlvbnNoaXAgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RhcmdldEZvcmVpZ25LZXkoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQlyZXR1cm4gKHJlbGF0aW9uc2hpcE1hcHBpbmcgIT0gbnVsbCkgJiYKLQkJCQlyZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmlzVGFyZ2V0Rm9yZWlnbktleSgpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFyZ2V0Rm9yZWlnbktleSgpID8KLQkJCQkvLyByZWxhdGlvbnNoaXAgbWFwcGluZyBpcyBub3QgbnVsbAotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRUeXBlTWFwcGluZygpIDoKLQkJCQkvLyByZWxhdGlvbnNoaXAgbWFwcGluZyBtYXkgc3RpbGwgYmUgbnVsbAotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZ1RhcmdldEVudGl0eSgpOwotCX0KLQotCXByb3RlY3RlZCBUeXBlTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nVGFyZ2V0RW50aXR5KCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwpID8gbnVsbCA6IG1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldEVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdGFyZ2V0ID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJcmV0dXJuICh0YXJnZXQgaW5zdGFuY2VvZiBFbnRpdHkpID8gKEVudGl0eSkgdGFyZ2V0IDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFyZ2V0Rm9yZWlnbktleSgpID8KLQkJCQl0aGlzLmdldFRhcmdldERlZmF1bHRUYWJsZU5hbWUoKSA6Ci0JCQkJdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogdHlwZU1hcHBpbmcuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmlzVGFyZ2V0Rm9yZWlnbktleSgpID8KLQkJCQl0aGlzLnJlc29sdmVUYXJnZXREYlRhYmxlKHRhYmxlTmFtZSkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGUgcmVzb2x2ZVRhcmdldERiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogdHlwZU1hcHBpbmcucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJdGhpcy50YXJnZXRUYWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKSA6Ci0JCQkJdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YXJnZXRUYWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgJiYgdHlwZU1hcHBpbmcudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQlUeXBlTWFwcGluZyByZWxhdGlvbnNoaXBUYXJnZXQgPSB0aGlzLmdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCQlyZXR1cm4gKHJlbGF0aW9uc2hpcFRhcmdldCA9PSBudWxsKSA/IG51bGwgOiByZWxhdGlvbnNoaXBUYXJnZXQuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJdGhpcy5nZXRUYXJnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFRhcmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyAhPSBudWxsKSA/IHR5cGVNYXBwaW5nLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldEF0dHJpYnV0ZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbEpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKFJlYWRPbmx5Sm9pbkNvbHVtbiBvdmVycmlkZGVuSm9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVZpcnR1YWxKb2luQ29sdW1uKHRoaXMsIHRoaXMuam9pbkNvbHVtbk93bmVyLCBvdmVycmlkZGVuSm9pbkNvbHVtbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlmb3IgKE9ybVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCWpvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbiBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldEF0dHJpYnV0ZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXBUYXJnZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuYnVpbGRDb2x1bW5WYWxpZGF0b3IoKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sdW1uLCB0aGlzLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTQ4ZDU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LlNlY29uZGFyeVRhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHZpcnR1YWwgc2Vjb25kYXJ5IHRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVZpcnR1YWxUYWJsZTxKYXZhU2Vjb25kYXJ5VGFibGU+Ci0JaW1wbGVtZW50cyBPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUKLXsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4sIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIgcHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZShPcm1FbnRpdHkgcGFyZW50LCBPd25lciBvd25lciwgSmF2YVNlY29uZGFyeVRhYmxlIG92ZXJyaWRkZW5UYWJsZSkgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCBvdmVycmlkZGVuVGFibGUpOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIDogdGhpcy5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0T3ZlcnJpZGRlblByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlblRhYmxlKCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCwgT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudChpbmRleCwgcGtKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCwgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGphdmFDb2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4pIHsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChwa0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4sIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4sIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS50aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS50aGlzLmdldE92ZXJyaWRkZW5QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbikgewotCQlPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gcGtKb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgb2xkLCBwa0pvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvdmVycmlkZGVuQ29sdW1uID0gdGhpcy5nZXRPdmVycmlkZGVuVGFibGUoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJaWYgKG92ZXJyaWRkZW5Db2x1bW4gPT0gbnVsbCkgewotCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpICYmICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRPdmVycmlkZGVuQ29sdW1uKCkgPT0gb3ZlcnJpZGRlbkNvbHVtbikpIHsKLQkJCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKG92ZXJyaWRkZW5Db2x1bW4pKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1FbnRpdHkgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUVudGl0eSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4oSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyLCBqYXZhQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWJvb2xlYW4gY29udGludWVWYWxpZGF0aW5nID0gdGhpcy5idWlsZFRhYmxlVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQotCQkvL2pvaW4gY29sdW1uIHZhbGlkYXRpb24gd2lsbCBoYW5kbGUgdGhlIGNoZWNrIGZvciB3aGV0aGVyIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIGRhdGFiYXNlCi0JCS8vc29tZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGFyZSBub3QgZGF0YWJhc2Ugc3BlY2lmaWMuIElmIHRoZSBkYXRhYmFzZSB2YWxpZGF0aW9uIGZvciB0aGUKLQkJLy90YWJsZSBmYWlscyB3ZSB3aWxsIHN0b3AgdGhlcmUgYW5kIG5vdCB2YWxpZGF0ZSB0aGUgam9pbiBjb2x1bW5zIGF0IGFsbAotCQlpZiAoY29udGludWVWYWxpZGF0aW5nKSB7Ci0JCQl0aGlzLnZhbGlkYXRlTm9kZXModGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSwgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBhIHNlY29uZGFyeSB0YWJsZSBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IG5hbWUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHJvdGVjdGVkIE9ybUVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS50aGlzLmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlpZiAodGhpcy5nZXRKb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gdGhpcy5nZXRFbnRpdHkoKS5nZXRQYXJlbnRFbnRpdHkoKTsKLQkJCXJldHVybiAocGFyZW50RW50aXR5ICE9IG51bGwpID8KLQkJCQkJcGFyZW50RW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgOgotCQkJCQl0aGlzLmdldEVudGl0eSgpLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUudGhpcy5nZXREYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlLnRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHkoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IFNlY29uZGFyeVRhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IoR2VuZXJpY09ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZS50aGlzLCAoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzExYmJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlRmFjdG9yeQotewotCS8vIG5vdGhpbmcKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL051bGxPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vTnVsbE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MDI1MzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vTnVsbE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotcHVibGljIGNsYXNzIE51bGxPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wCi17Ci0JcHVibGljIE51bGxPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneShPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYTUwgam9pbiB0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgWG1sSm9pblRhYmxlIGdldFhtbEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFhtbEpvaW5UYWJsZSBidWlsZFhtbEpvaW5UYWJsZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sSm9pblRhYmxlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBvbGRTdHJhdGVneSkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSB2aXJ0dWFsU3RyYXRlZ3kpIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZURlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSBzZWxlY3RPdmVycmlkZVN0cmF0ZWd5KFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgb3ZlcnJpZGVSZWxhdGlvbnNoaXApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7Ci0JCS8vIE5PUAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmF0ZWd5KCkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDMxMjdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotCi1wdWJsaWMgY2xhc3MgT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWMoKSwgCi0JCQkJWG1sQmFzaWMuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybUJhc2ljTWFwcGluZyhwYXJlbnQsIChYbWxCYXNpYykgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiOWVmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRhYmxlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci0KLS8qKgotICogZGVmYXVsdCBPUk0gRW1iZWRkYWJsZSBwcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkYWJsZURlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVtYmVkZGFibGVEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRW1iZWRkYWJsZURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1FbWJlZGRhYmxlRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBYbWxUeXBlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkYWJsZSgpLCAKLQkJCQlYbWxFbWJlZGRhYmxlLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUVtYmVkZGFibGUgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgCi0JCQlYbWxUeXBlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbWJlZGRhYmxlKHBhcmVudCwgKFhtbEVtYmVkZGFibGUpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3M2U4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZCgpLCAKLQkJCQlYbWxFbWJlZGRlZElkLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtRW1iZWRkZWRJZE1hcHBpbmcocGFyZW50LCAoWG1sRW1iZWRkZWRJZCkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMDVhNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWQoKSwgCi0JCQkJWG1sRW1iZWRkZWQuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbWJlZGRlZE1hcHBpbmcocGFyZW50LCAoWG1sRW1iZWRkZWQpIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5RGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW50aXR5RGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjQ5MzFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLQotLyoqCi0gKiBkZWZhdWx0IE9STSBFbnRpdHkgcHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVudGl0eURlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nRGVmaW5pdGlvbgotewkKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1FbnRpdHlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRW50aXR5RGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVudGl0eURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBYbWxUeXBlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5KCksIAotCQkJCVhtbEVudGl0eS5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBPcm1FbnRpdHkgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgCi0JCQlYbWxUeXBlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1FbnRpdHkocGFyZW50LCAoWG1sRW50aXR5KSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjdkN2MwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkVudGl0eVRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgT3JtRW50aXR5VGV4dFJhbmdlUmVzb2x2ZXIKLQlpbXBsZW1lbnRzIEVudGl0eVRleHRSYW5nZVJlc29sdmVyCi17Ci0JcHJpdmF0ZSBPcm1FbnRpdHkgZW50aXR5OwotCQotCQotCXB1YmxpYyBPcm1FbnRpdHlUZXh0UmFuZ2VSZXNvbHZlcihPcm1FbnRpdHkgZW50aXR5KSB7Ci0JCXRoaXMuZW50aXR5ID0gZW50aXR5OwotCX0KLQkKLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFR5cGVNYXBwaW5nVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5lbnRpdHkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldElkQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZU1hcHBpbmdUZXh0UmFuZ2UoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlTmFtZWQoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZW50aXR5LmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjBhMmE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLQotcHVibGljIGNsYXNzIE9ybUlkTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1JZE1hcHBpbmdEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1JZE1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbElkKCksIAotCQkJCVhtbElkLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtSWRNYXBwaW5nKHBhcmVudCwgKFhtbElkKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OWJhYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgT3JtSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI8T3JtUmVhZE9ubHlKb2luQ29sdW1uPgotCWltcGxlbWVudHMgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyCi17Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKE9ybVJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4pIHsKLQkJc3VwZXIoY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2VhYzNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpLCAKLQkJCQlYbWxNYW55VG9NYW55LmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtTWFueVRvTWFueU1hcHBpbmcocGFyZW50LCAoWG1sTWFueVRvTWFueSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThhOGE0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLQotcHVibGljIGNsYXNzIE9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hbnlUb09uZSgpLCAKLQkJCQlYbWxNYW55VG9PbmUuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1NYW55VG9PbmVNYXBwaW5nKHBhcmVudCwgKFhtbE1hbnlUb09uZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAzMjhlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuRW1mVG9vbHM7Ci0KLS8qKgotICogZGVmYXVsdCBPUk0gTWFwcGVkU3VwZXJjbGFzcyBkZWZpbml0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uCi17CQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1NYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sVHlwZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3MoKSwgCi0JCQkJWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIAotCQkJWG1sVHlwZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtTWFwcGVkU3VwZXJjbGFzcyhwYXJlbnQsIChYbWxNYXBwZWRTdXBlcmNsYXNzKSByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NUZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1RleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYzEzOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1RleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYXBwZWRTdXBlcmNsYXNzVGV4dFJhbmdlUmVzb2x2ZXIKLQlpbXBsZW1lbnRzIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlcgotewotCXByaXZhdGUgT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzOwotCQotCQotCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzVGV4dFJhbmdlUmVzb2x2ZXIoT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCXRoaXMubWFwcGVkU3VwZXJjbGFzcyA9IG1hcHBlZFN1cGVyY2xhc3M7Ci0JfQotCQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VHlwZU1hcHBpbmdUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZFN1cGVyY2xhc3MuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldElkQ2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVNYXBwaW5nVGV4dFJhbmdlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMWNkNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seU5hbWVkQ29sdW1uOwotCi1wdWJsaWMgY2xhc3MgT3JtTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcgotCWV4dGVuZHMgQWJzdHJhY3RPcm1OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyPE9ybVJlYWRPbmx5TmFtZWRDb2x1bW4+Ci17Ci0JcHVibGljIE9ybU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIoT3JtUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJc3VwZXIoY29sdW1uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwMjE0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9uZVRvTWFueSgpLCAKLQkJCQlYbWxPbmVUb01hbnkuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1PbmVUb01hbnlNYXBwaW5nKHBhcmVudCwgKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMjczOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotCi1wdWJsaWMgY2xhc3MgT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBYbWxBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkUmVzb3VyY2VNYXBwaW5nKEVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIEVtZlRvb2xzLmNyZWF0ZSgKLQkJCQlmYWN0b3J5LCAKLQkJCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPbmVUb09uZSgpLCAKLQkJCQlYbWxPbmVUb09uZS5jbGFzcyk7Ci0JfQotCQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkQ29udGV4dE1hcHBpbmcoCi0JCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgCi0JCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHJlc291cmNlTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gZmFjdG9yeS5idWlsZE9ybU9uZVRvT25lTWFwcGluZyhwYXJlbnQsIChYbWxPbmVUb09uZSkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOTBhZjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIE9ybU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIKLQlpbXBsZW1lbnRzIE92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlPdmVycmlkZSBvcm1PdmVycmlkZTsKLQotCXB1YmxpYyBPcm1PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyKE9ybVJlYWRPbmx5T3ZlcnJpZGUgb3JtT3ZlcnJpZGUpIHsKLQkJdGhpcy5vcm1PdmVycmlkZSA9IG9ybU92ZXJyaWRlOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtT3ZlcnJpZGUuZ2V0TmFtZVRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOWI4MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyCi0JaW1wbGVtZW50cyBQZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlwcml2YXRlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXIoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg1YWVmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI8T3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbj4KLQlpbXBsZW1lbnRzIEJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQotCXB1YmxpYyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gY29sdW1uKSB7Ci0JCXN1cGVyKGNvbHVtbik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzk1MGViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5VGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIE9ybVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIKLQlleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjxPcm1SZWFkT25seVRhYmxlQ29sdW1uPgotCWltcGxlbWVudHMgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcgotewotCi0JcHVibGljIE9ybVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIoT3JtUmVhZE9ubHlUYWJsZUNvbHVtbiBjb2x1bW4pIHsKLQkJc3VwZXIoY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uZ2V0VGFibGVUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZVRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZVRleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZWY1MzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIE9ybVRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIKLQlpbXBsZW1lbnRzIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlUYWJsZSB0YWJsZTsKLQotCi0JcHVibGljIE9ybVRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIoT3JtUmVhZE9ubHlUYWJsZSB0YWJsZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5nZXROYW1lVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZS5nZXRDYXRhbG9nVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLmdldFNjaGVtYVRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjVlNjEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotCi1wdWJsaWMgY2xhc3MgT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRyYW5zaWVudCgpLCAKLQkJCQlYbWxUcmFuc2llbnQuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBidWlsZENvbnRleHRNYXBwaW5nKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIAotCQkJWG1sQXR0cmlidXRlTWFwcGluZyByZXNvdXJjZU1hcHBpbmcsIAotCQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuIGZhY3RvcnkuYnVpbGRPcm1UcmFuc2llbnRNYXBwaW5nKHBhcmVudCwgKFhtbFRyYW5zaWVudCkgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzY5NTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyOwotCi1wdWJsaWMgY2xhc3MgT3JtVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcgotCWltcGxlbWVudHMgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcgotewotCXByaXZhdGUgT3JtVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmc7Ci0KLQlwdWJsaWMgT3JtVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcihPcm1UeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQl0aGlzLnR5cGVNYXBwaW5nID0gdHlwZU1hcHBpbmc7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUeXBlTWFwcGluZ1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmcuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmODI0NzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLQotcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBidWlsZFJlc291cmNlTWFwcGluZyhFRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBFbWZUb29scy5jcmVhdGUoCi0JCQkJZmFjdG9yeSwgCi0JCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVmVyc2lvbigpLCAKLQkJCQlYbWxWZXJzaW9uLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VNYXBwaW5nLCAKLQkJCU9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtVmVyc2lvbk1hcHBpbmcocGFyZW50LCAoWG1sVmVyc2lvbikgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9TcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L29ybS9TcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZmMzM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vU3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGVtPnNwZWNpZmllZDwvZW0+IDxjb2RlPm9ybS54bWw8L2NvZGU+IHBlcnNpc3RlbnQgYXR0cmlidXRlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wCi17Ci0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZzsgIC8vIG5ldmVyIG51bGwKLQotCS8qKgotCSAqIFRoaXMgd2lsbCBwb2ludCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZzo8dWw+Ci0JICogPGxpPmFuIGV4aXN0aW5nIEphdmEgYXR0cmlidXRlICh0YWtlbiBmcm9tIHRoZSBhcHByb3ByaWF0ZSBKYXZhIHR5cGUpCi0JICogPGxpPntAbGluayAjY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGV9IGlmIHRoZXJlIGlzIG5vIHN1Y2ggSmF2YQotCSAqICAgICBhdHRyaWJ1dGUgKGkuZS4gdGhlIEphdmEgdHlwZSdzIGFjY2VzcyB0eXBlIGlzIGRpZmZlcmVudCBvciBpdCBpcwotCSAqICAgICBpbmhlcml0ZWQgZnJvbSBhIG5vbi1wZXJzaXN0ZW50IHN1cGVyY2xhc3MpCi0JICogPGxpPjxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIG1hdGNoaW5nIEphdmEgcmVzb3VyY2UgYXR0cmlidXRlCi0JICogPC91bD4KLQkgKiBAc2VlICNidWlsZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQkvKioKLQkgKiBJZiBwcmVzZW50LCB0aGlzIEphdmEgYXR0cmlidXRlJ3MgcGFyZW50IGlzIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPgotCSAqIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzOwotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3M7Ci0KLQotCXByb3RlY3RlZCBTcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWFwcGluZyA9IHRoaXMuYnVpbGRNYXBwaW5nKHhtbE1hcHBpbmcpOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3NfKHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCXRoaXMubWFwcGluZy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCWlmICh0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXRoaXMuY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0QWNjZXNzKHRoaXMuYnVpbGREZWZhdWx0QWNjZXNzKCkpOwotCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKHRoaXMuYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJdGhpcy5tYXBwaW5nLnVwZGF0ZSgpOwotCQlpZiAodGhpcy5jYWNoZWRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLnVwZGF0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHBpbmcgKioqKioqKioqKgotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0S2V5KCk7Ci0JfQotCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgc2V0TWFwcGluZ0tleShTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5nZXRNYXBwaW5nS2V5KCksIG1hcHBpbmdLZXkpKSB7Ci0JCQl0aGlzLnNldE1hcHBpbmdLZXlfKG1hcHBpbmdLZXkpOwotCQl9Ci0JCXJldHVybiB0aGlzLm1hcHBpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGluZ0tleV8oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmluaXRpb24gPSB0aGlzLmdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKG1hcHBpbmdLZXkpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbEF0dHJpYnV0ZU1hcHBpbmcgPSBtYXBwaW5nRGVmaW5pdGlvbi5idWlsZFJlc291cmNlTWFwcGluZyh0aGlzLmdldFJlc291cmNlTm9kZUZhY3RvcnkoKSk7Ci0JCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZyh4bWxBdHRyaWJ1dGVNYXBwaW5nKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sQXR0cmlidXRlTWFwcGluZykgewotCQlPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBtZCA9IHRoaXMuZ2V0TWFwcGluZ0ZpbGVEZWZpbml0aW9uKCkuZ2V0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24oeG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBwaW5nS2V5KCkpOwotCQlyZXR1cm4gbWQuYnVpbGRDb250ZXh0TWFwcGluZyh0aGlzLCB4bWxBdHRyaWJ1dGVNYXBwaW5nLCB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlPcm1BdHRyaWJ1dGVNYXBwaW5nIG9sZCA9IHRoaXMubWFwcGluZzsKLQkJdGhpcy5tYXBwaW5nID0gbWFwcGluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBJTkdfUFJPUEVSVFksIG9sZCwgbWFwcGluZyk7Ci0JCXRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5jaGFuZ2VNYXBwaW5nKHRoaXMsIG9sZCwgbWFwcGluZyk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+b3JtLnhtbDwvY29kZT4gYXR0cmlidXRlcyBkbyBub3QgaGF2ZSBhIGRlZmF1bHQgbWFwcGluZzsKLQkgKiB0aGV5IGFyZSBhbHdheXMgc3BlY2lmaWVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBYbWxBdHRyaWJ1dGVNYXBwaW5nIGdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbmFtZUNoYW5nZWQoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGROYW1lLCBuZXdOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlID09IG51bGwgPyBudWxsIDogdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZUZpZWxkIGphdmFSZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpID09IG51bGwgPyBmYWxzZSA6IGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNGb3IoamF2YVJlc291cmNlRmllbGQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZU1ldGhvZCBqYXZhUmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCBqYXZhUmVzb3VyY2VTZXR0ZXIpIHsKLQkJcmV0dXJuIGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkgPT0gbnVsbCA/IGZhbHNlIDogZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc0ZvcihqYXZhUmVzb3VyY2VHZXR0ZXIsIGphdmFSZXNvdXJjZVNldHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2xkID0gdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSkFWQV9QRVJTSVNURU5UX0FUVFJJQlVURV9QUk9QRVJUWSwgb2xkLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhVHlwZSA9IHRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGVKYXZhVHlwZSgpOwotCQlpZiAoamF2YVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcEF0dHJpYnV0ZSA9IGphdmFUeXBlLnJlc29sdmVBdHRyaWJ1dGUobmFtZSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFBdHRyaWJ1dGUgPSAocEF0dHJpYnV0ZSA9PSBudWxsKSA/IG51bGwgOiBwQXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCWlmICgoamF2YUF0dHJpYnV0ZSAhPSBudWxsKSAmJiAoamF2YUF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSA9PSB0aGlzLmdldEFjY2VzcygpKSkgewotCQkJLy8gd2Ugb25seSB3YW50IHRvIGNhY2hlIHRoZSBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlIGlmIHdlIGJ1aWx0IGl0Ci0JCQl0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gbnVsbDsKLQkJCXJldHVybiBqYXZhQXR0cmlidXRlOwotCQl9Ci0KLQkJLy8gSWYgJ2phdmFBdHRyaWJ1dGUnIGlzIG51bGwsIGl0IG1pZ2h0IGV4aXN0IGluIGEgc3VwZXJjbGFzcyB0aGF0Ci0JCS8vIGlzIG5vdCBwZXJzaXN0ZW50LiBJbiB0aGF0IGNhc2Ugd2UgbmVlZCB0byBidWlsZCBpdCBvdXJzZWx2ZXMuCi0JCS8vIElmICdqYXZhQXR0cmlidXRlJyBhY2Nlc3MgaXMgZGlmZmVyZW50LCAnamF2YVR5cGUnIHdpbGwgbm90IGhvbGQKLQkJLy8gYSBjb3JyZXNwb25kaW5nIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUuIFNvLCBhZ2Fpbiwgd2UgbmVlZAotCQkvLyB0byBidWlsZCBpdCBvdXJzZWx2ZXMuCi0JCXJldHVybiB0aGlzLmdldENhY2hlZEphdmFBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0Q2FjaGVkSmF2YUF0dHJpYnV0ZSgpIHsKLQkJSmF2YVJlc291cmNlVHlwZSBqYXZhUmVzb3VyY2VUeXBlID0gdGhpcy5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZUphdmFUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCQlpZiAoZ2V0QWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5GSUVMRCkgewotCQkJSmF2YVJlc291cmNlRmllbGQgamF2YVJlc291cmNlRmllbGQgPSB0aGlzLmdldEphdmFSZXNvdXJjZUZpZWxkKGphdmFSZXNvdXJjZVR5cGUpOwotCQkJaWYgKGphdmFSZXNvdXJjZUZpZWxkID09IG51bGwpIHsKLQkJCQkvLyBub3RoaW5nIGluIHRoZSByZXNvdXJjZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgbWF0Y2hlcyBvdXIgbmFtZSAqYW5kKiBhY2Nlc3MgdHlwZQotCQkJCXRoaXMuY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoKHRoaXMuY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPT0gbnVsbCkgfHwKLQkJCQkJCSEodGhpcy5jYWNoZWRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5pc0ZvcihqYXZhUmVzb3VyY2VGaWVsZCkpKSB7Ci0JCQkJCS8vIGNhY2hlIGlzIHN0YWxlCi0JCQkJCXRoaXMuY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB0aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRGaWVsZChqYXZhUmVzb3VyY2VGaWVsZCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChnZXRBY2Nlc3MoKSA9PSBBY2Nlc3NUeXBlLlBST1BFUlRZKSB7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlR2V0dGVyID0gdGhpcy5nZXRKYXZhUmVzb3VyY2VHZXR0ZXIoamF2YVJlc291cmNlVHlwZSk7Ci0JCQlKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlU2V0dGVyID0gamF2YVJlc291cmNlR2V0dGVyID09IG51bGwgPyBudWxsIDogQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0VmFsaWRTaWJsaW5nU2V0TWV0aG9kKGphdmFSZXNvdXJjZUdldHRlciwgamF2YVJlc291cmNlVHlwZS5nZXRNZXRob2RzKCkpOwotCQkJaWYgKGphdmFSZXNvdXJjZUdldHRlciA9PSBudWxsICYmIGphdmFSZXNvdXJjZVNldHRlciA9PSBudWxsKSB7Ci0JCQkJLy8gbm90aGluZyBpbiB0aGUgcmVzb3VyY2UgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG1hdGNoZXMgb3VyIG5hbWUgKmFuZCogYWNjZXNzIHR5cGUKLQkJCQl0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gbnVsbDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKCh0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlID09IG51bGwpIHx8Ci0JCQkJCQkhKHRoaXMuY2FjaGVkSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNGb3IoamF2YVJlc291cmNlR2V0dGVyLCBqYXZhUmVzb3VyY2VTZXR0ZXIpKSkgewotCQkJCQkvLyBjYWNoZSBpcyBzdGFsZQotCQkJCQl0aGlzLmNhY2hlZEphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gdGhpcy5idWlsZEphdmFQZXJzaXN0ZW50UHJvcGVydHkoamF2YVJlc291cmNlR2V0dGVyLCBqYXZhUmVzb3VyY2VTZXR0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5jYWNoZWRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggdGhlIHNwZWNpZmllZCBKYXZhIHJlc291cmNlIHR5cGUgZm9yIHRoZSByZXNvdXJjZSBhdHRyaWJ1dGUKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgPGNvZGU+b3JtLnhtbDwvY29kZT4gYXR0cmlidXRlIChpLmUuIHRoZSBKYXZhCi0JICogcmVzb3VyY2UgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSkuIElmIHRoZSBzcGVjaWZpZWQgSmF2YSByZXNvdXJjZQotCSAqIHR5cGUgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlLCBzZWFyY2ggdXAgaXRzIGluaGVyaXRhbmNlCi0JICogaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VGaWVsZCBnZXRKYXZhUmVzb3VyY2VGaWVsZChKYXZhUmVzb3VyY2VUeXBlIGphdmFSZXNvdXJjZVR5cGUpIHsKLQkJZm9yIChKYXZhUmVzb3VyY2VGaWVsZCBqYXZhUmVzb3VyY2VGaWVsZCA6IHRoaXMuZ2V0SmF2YVJlc291cmNlRmllbGRzKGphdmFSZXNvdXJjZVR5cGUpKSB7Ci0JCQlpZiAoamF2YVJlc291cmNlRmllbGQuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gamF2YVJlc291cmNlRmllbGQ7Ci0JCQl9Ci0JCX0KLQkJLy8gY2xpbWIgdXAgaW5oZXJpdGFuY2UgaGllcmFyY2h5Ci0JCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IGphdmFSZXNvdXJjZVR5cGUuZ2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKTsKLQkJaWYgKHN1cGVyY2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUphdmFSZXNvdXJjZVR5cGUgc3VwZXJjbGFzcyA9IChKYXZhUmVzb3VyY2VUeXBlKSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKHN1cGVyY2xhc3NOYW1lLCBLaW5kLlRZUEUpOwotCQlpZiAoc3VwZXJjbGFzcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyByZWN1cnNlCi0JCXJldHVybiB0aGlzLmdldEphdmFSZXNvdXJjZUZpZWxkKHN1cGVyY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UgYXR0cmlidXRlcyB3aXRoIGNvbXBhdGlibGUgYWNjZXNzIHR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4gZ2V0SmF2YVJlc291cmNlRmllbGRzKEphdmFSZXNvdXJjZVR5cGUgamF2YVJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gamF2YVJlc291cmNlVHlwZS5nZXRGaWVsZHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWFyY2ggdGhlIHNwZWNpZmllZCBKYXZhIHJlc291cmNlIHR5cGUgZm9yIHRoZSByZXNvdXJjZSBhdHRyaWJ1dGUKLQkgKiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgPGNvZGU+b3JtLnhtbDwvY29kZT4gYXR0cmlidXRlIChpLmUuIHRoZSBKYXZhCi0JICogcmVzb3VyY2UgYXR0cmlidXRlIHdpdGggdGhlIHNhbWUgbmFtZSkuIElmIHRoZSBzcGVjaWZpZWQgSmF2YSByZXNvdXJjZQotCSAqIHR5cGUgZG9lcyBub3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlLCBzZWFyY2ggdXAgaXRzIGluaGVyaXRhbmNlCi0JICogaGllcmFyY2h5LgotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VNZXRob2QgZ2V0SmF2YVJlc291cmNlR2V0dGVyKEphdmFSZXNvdXJjZVR5cGUgamF2YVJlc291cmNlVHlwZSkgewotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBqYXZhUmVzb3VyY2VHZXR0ZXIgOiB0aGlzLmdldEphdmFSZXNvdXJjZUdldHRlcnMoamF2YVJlc291cmNlVHlwZSkpIHsKLQkJCWlmIChqYXZhUmVzb3VyY2VHZXR0ZXIuZ2V0TmFtZSgpLmVxdWFscyh0aGlzLmdldE5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gamF2YVJlc291cmNlR2V0dGVyOwotCQkJfQotCQl9Ci0JCS8vIGNsaW1iIHVwIGluaGVyaXRhbmNlIGhpZXJhcmNoeQotCQlTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSBqYXZhUmVzb3VyY2VUeXBlLmdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCk7Ci0JCWlmIChzdXBlcmNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlKYXZhUmVzb3VyY2VUeXBlIHN1cGVyY2xhc3MgPSAoSmF2YVJlc291cmNlVHlwZSkgdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShzdXBlcmNsYXNzTmFtZSwgS2luZC5UWVBFKTsKLQkJaWYgKHN1cGVyY2xhc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gcmVjdXJzZQotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUmVzb3VyY2VHZXR0ZXIoc3VwZXJjbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0UmVzb3VyY2VNZXRob2RzKGZpbmFsIEphdmFSZXNvdXJjZVR5cGUgamF2YVJlc291cmNlVHlwZSwgRmlsdGVyPEphdmFSZXNvdXJjZU1ldGhvZD4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPihqYXZhUmVzb3VyY2VUeXBlLmdldE1ldGhvZHMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsdGVyPEphdmFSZXNvdXJjZU1ldGhvZD4gYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcihmaW5hbCBKYXZhUmVzb3VyY2VUeXBlIGphdmFSZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXI8SmF2YVJlc291cmNlTWV0aG9kPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKLQkJCQlyZXR1cm4gQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUubWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyKHJlc291cmNlTWV0aG9kLCBqYXZhUmVzb3VyY2VUeXBlLmdldE1ldGhvZHMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZXNvdXJjZSBhdHRyaWJ1dGVzIHdpdGggY29tcGF0aWJsZSBhY2Nlc3MgdHlwZXMuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0SmF2YVJlc291cmNlR2V0dGVycyhKYXZhUmVzb3VyY2VUeXBlIGphdmFSZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlTWV0aG9kcyhqYXZhUmVzb3VyY2VUeXBlLCBidWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKGphdmFSZXNvdXJjZVR5cGUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKEphdmFSZXNvdXJjZUZpZWxkIGphdmFSZXNvdXJjZUZpZWxkKSB7Ci0JCS8vIHBhc3MgaW4gb3VyIHBhcmVudCBvcm0gcGVyc2lzdGVudCB0eXBlIGFzIHRoZSBwYXJlbnQgdG8gdGhlIGNhY2hlZCBKYXZhIGF0dHJpYnV0ZS4uLgotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEZpZWxkKHRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKSwgamF2YVJlc291cmNlRmllbGQpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZEphdmFQZXJzaXN0ZW50UHJvcGVydHkoSmF2YVJlc291cmNlTWV0aG9kIGphdmFSZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIGphdmFSZXNvdXJjZVNldHRlcikgewotCQkvLyBwYXNzIGluIG91ciBwYXJlbnQgb3JtIHBlcnNpc3RlbnQgdHlwZSBhcyB0aGUgcGFyZW50IHRvIHRoZSBjYWNoZWQgSmF2YSBhdHRyaWJ1dGUuLi4KLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVBlcnNpc3RlbnRQcm9wZXJ0eSh0aGlzLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCksIGphdmFSZXNvdXJjZUdldHRlciwgamF2YVJlc291cmNlU2V0dGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJQWNjZXNzVHlwZSBzcGVjaWZpZWRBY2Nlc3MgPSB0aGlzLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQlyZXR1cm4gKHNwZWNpZmllZEFjY2VzcyAhPSBudWxsKSA/IHNwZWNpZmllZEFjY2VzcyA6IHRoaXMuZGVmYXVsdEFjY2VzczsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JCXRoaXMuZGVmYXVsdEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18oYWNjZXNzKTsKLQkJdGhpcy5nZXRYbWxBY2Nlc3NIb2xkZXIoKS5zZXRBY2Nlc3MoQWNjZXNzVHlwZS50b09ybVJlc291cmNlTW9kZWwoYWNjZXNzKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQWNjZXNzXyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9BQ0NFU1NfUFJPUEVSVFksIG9sZCwgYWNjZXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBidWlsZFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy5nZXRYbWxBY2Nlc3NIb2xkZXIoKS5nZXRBY2Nlc3MoKSwgdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLCB0aGlzLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQWNjZXNzSG9sZGVyIGdldFhtbEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQvZGVmYXVsdCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnZlcnRUb1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuY29udmVydEF0dHJpYnV0ZVRvVmlydHVhbCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb252ZXJ0VG9TcGVjaWZpZWQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnZlcnRUb1NwZWNpZmllZChTdHJpbmcgbWFwcGluZ0tleSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gT3JtU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSUQ7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuY29udGFpbnModGV4dE9mZnNldCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbm90aGluZyB0byBkaXNwb3NlCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlQXR0cmlidXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMubWFwcGluZy52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlQXR0cmlidXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJdGhpcy5nZXROYW1lKCksCi0JCQkJCQl0aGlzLmdldE93bmluZ1R5cGVNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkKLQkJCQkJfSwKLQkJCQkJdGhpcy5tYXBwaW5nLAotCQkJCQl0aGlzLm1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuYnVpbGRBdHRpYnV0ZVZhbGlkYXRvcigpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKcHRWYWxpZGF0b3IgYnVpbGRBdHRpYnV0ZVZhbGlkYXRvcigpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbigpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUNvbnRhaW5lckRlZmluaXRpb24oKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKChDb2xsZWN0aW9uTWFwcGluZykgdGhpcy5tYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCBqYXZhQXR0cmlidXRlID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCQlyZXR1cm4gKGphdmFBdHRyaWJ1dGUgIT0gbnVsbCkgPwotCQkJCWphdmFBdHRyaWJ1dGUuZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSA6Ci0JCQkJTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLkpwYUNvbnRhaW5lckRlZmluaXRpb24gZ2V0SnBhQ29udGFpbmVyRGVmaW5pdGlvbigpIHsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAgamF2YUF0dHJpYnV0ZSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgdGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJcmV0dXJuIChqYXZhQXR0cmlidXRlICE9IG51bGwpID8KLQkJCQlqYXZhQXR0cmlidXRlLmdldEpwYUNvbnRhaW5lckRlZmluaXRpb24oKSA6Ci0JCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuSnBhQ29udGFpbmVyRGVmaW5pdGlvbi5OdWxsLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1QZXJzaXN0ZW50VHlwZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGdldE93bmluZ1BlcnNpc3RlbnRUeXBlSmF2YVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHVibGljIE9ybVR5cGVNYXBwaW5nIGdldE93bmluZ1R5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5tYXBwaW5nLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlID09IG51bGwpID8gbnVsbCA6IHRoaXMuamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vU3BlY2lmaWVkT3JtUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1NwZWNpZmllZE9ybVBlcnNpc3RlbnRUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTU2YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vU3BlY2lmaWVkT3JtUGVyc2lzdGVudFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LkJvZHlTb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5DaGFpbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQ29udGV4dENvbnRhaW5lclRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5Qcm9wZXJ0eUFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5FbWZUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIHNwZWNpZmllZCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW50IHR5cGU6PHVsPgotICogPGxpPm1hcHBpbmcKLSAqIDxsaT5hY2Nlc3MKLSAqIDxsaT5hdHRyaWJ1dGVzCi0gKiA8bGk+c3VwZXIgcGVyc2lzdGVudCB0eXBlCi0gKiA8bGk+SmF2YSBwZXJzaXN0ZW50IHR5cGUKLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTcGVjaWZpZWRPcm1QZXJzaXN0ZW50VHlwZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtUGVyc2lzdGVudFR5cGUyXzAKLXsKLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmcgbWFwcGluZzsgIC8vIG5ldmVyIG51bGwKLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlOwotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgc3BlY2lmaWVkQWNjZXNzOwotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGRlZmF1bHRBY2Nlc3M7ICAvLyBuZXZlciBudWxsCi0KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBuZXcgVmVjdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JcHJvdGVjdGVkIGZpbmFsIFNwZWNpZmllZEF0dHJpYnV0ZUNvbnRhaW5lckFkYXB0ZXIgc3BlY2lmaWVkQXR0cmlidXRlQ29udGFpbmVyQWRhcHRlciA9IG5ldyBTcGVjaWZpZWRBdHRyaWJ1dGVDb250YWluZXJBZGFwdGVyKCk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gdmlydHVhbEF0dHJpYnV0ZXMgPSBuZXcgVmVjdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBzdXBlclBlcnNpc3RlbnRUeXBlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZTsKLQotCXByb3RlY3RlZCBmaW5hbCBNZXRhbW9kZWxTb3VyY2VUeXBlLlN5bmNocm9uaXplciBtZXRhbW9kZWxTeW5jaHJvbml6ZXI7Ci0KLQotCXByb3RlY3RlZCBTcGVjaWZpZWRPcm1QZXJzaXN0ZW50VHlwZShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMubWFwcGluZyA9IHRoaXMuYnVpbGRNYXBwaW5nKHhtbFR5cGVNYXBwaW5nKTsKLQkJLy8gJ2phdmFQZXJzaXN0ZW50VHlwZScgaXMgcmVzb2x2ZWQgaW4gdGhlIHVwZGF0ZQotCQl0aGlzLnNwZWNpZmllZEFjY2VzcyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKTsKLQkJdGhpcy5kZWZhdWx0QWNjZXNzID0gQWNjZXNzVHlwZS5GSUVMRDsgIC8vIGtlZXAgdGhpcyBub24tbnVsbAotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRBdHRyaWJ1dGVzKCk7Ci0JCXRoaXMubWV0YW1vZGVsU3luY2hyb25pemVyID0gdGhpcy5idWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm1hcHBpbmcuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3NfKHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJdGhpcy5zeW5jaHJvbml6ZU5vZGVzV2l0aFJlc291cmNlTW9kZWwodGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlcygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLm1hcHBpbmcudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdEFjY2Vzcyh0aGlzLmJ1aWxkRGVmYXVsdEFjY2VzcygpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKSk7Ci0JCXRoaXMudXBkYXRlVmlydHVhbEF0dHJpYnV0ZXMoKTsKLQkJdGhpcy5zZXRTdXBlclBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCQl0aGlzLnNldERlY2xhcmluZ1R5cGVOYW1lKHRoaXMuYnVpbGREZWNsYXJpbmdUeXBlTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0S2V5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGluZ0tleShTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5nZXRNYXBwaW5nS2V5KCksIG1hcHBpbmdLZXkpKSB7Ci0JCQl0aGlzLnNldE1hcHBpbmdLZXlfKG1hcHBpbmdLZXkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGluZ0tleV8oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJT3JtVHlwZU1hcHBpbmcgb2xkID0gdGhpcy5tYXBwaW5nOwotCQlPcm1UeXBlTWFwcGluZ0RlZmluaXRpb24gbWFwcGluZ0RlZmluaXRpb24gPSB0aGlzLmdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldFR5cGVNYXBwaW5nRGVmaW5pdGlvbihtYXBwaW5nS2V5KTsKLQkJWG1sVHlwZU1hcHBpbmcgeG1sVHlwZU1hcHBpbmcgPSBtYXBwaW5nRGVmaW5pdGlvbi5idWlsZFJlc291cmNlTWFwcGluZyh0aGlzLmdldFJlc291cmNlTm9kZUZhY3RvcnkoKSk7Ci0JCXRoaXMubWFwcGluZyA9IHRoaXMuYnVpbGRNYXBwaW5nKHhtbFR5cGVNYXBwaW5nKTsKLQkJdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLmNoYW5nZU1hcHBpbmcodGhpcywgb2xkLCB0aGlzLm1hcHBpbmcpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUElOR19QUk9QRVJUWSwgb2xkLCB0aGlzLm1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoWG1sVHlwZU1hcHBpbmcgeG1sVHlwZU1hcHBpbmcpIHsKLQkJT3JtVHlwZU1hcHBpbmdEZWZpbml0aW9uIG1kID0gdGhpcy5nZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKS5nZXRUeXBlTWFwcGluZ0RlZmluaXRpb24oeG1sVHlwZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpKTsKLQkJcmV0dXJuIG1kLmJ1aWxkQ29udGV4dE1hcHBpbmcodGhpcywgeG1sVHlwZU1hcHBpbmcsIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkpOwotCX0KLQotCXByb3RlY3RlZCBYbWxUeXBlTWFwcGluZyBnZXRYbWxUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRYbWxUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWFwcGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgPwotCQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSA6Ci0JCQkJdGhpcy5nZXRNYXBwaW5nQ2xhc3NOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwaW5nQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0TWFwcGluZ0NsYXNzTmFtZSh0aGlzLm1hcHBpbmcuZ2V0Q2xhc3NfKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlTmFtZSgpewotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGNsYXNzTmFtZSkgPyBudWxsIDogQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBjbGVhciBvdXQge0BsaW5rICNqYXZhUGVyc2lzdGVudFR5cGV9IGhlcmUgYmVjYXVzZSB3ZSBjYW5ub3QgY29tcGFyZSBpdHMgbmFtZQotCSAqIHRvIHRoZSBtYXBwaW5nJ3MgY2xhc3MgbmFtZSwgc2luY2UgaXQgbWF5IGhhdmUgYmVlbiBwcmVmaXhlZCBieSB0aGUgZW50aXR5Ci0JICogbWFwcGluZ3MgcGFja2FnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBtYXBwaW5nQ2xhc3NDaGFuZ2VkKFN0cmluZyBvbGRDbGFzcywgU3RyaW5nIG5ld0NsYXNzKSB7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCB0aGlzLmNvbnZlcnRNYXBwaW5nQ2xhc3NOYW1lKG9sZENsYXNzKSwgdGhpcy5jb252ZXJ0TWFwcGluZ0NsYXNzTmFtZShuZXdDbGFzcykpOwotCQkvLyBjbGVhciBvdXQgdGhlIEphdmEgdHlwZSBoZXJlLCBpdCB3aWxsIGJlIHJlYnVpbHQgZHVyaW5nICJ1cGRhdGUiCi0JCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5kaXNwb3NlKCk7Ci0JCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50VHlwZShudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5lc3RlZCBjbGFzcyBuYW1lcyBhcmUgc3BlY2lmaWVkIHdpdGggYSA8Y29kZT4nJCc8L2NvZGU+Ci0JICogaW4gPGNvZGU+b3JtLnhtbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0TWFwcGluZ0NsYXNzTmFtZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyBudWxsIDogbmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBwZXJzaXN0ZW50IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb2xkID0gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID0gamF2YVBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSkFWQV9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFksIG9sZCwgamF2YVBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgbWFwcGluZydzIGNsYXNzIChuYW1lKSBjaGFuZ2VzIGR1cmluZwotCSAqIDxlbT5zeW5jPC9lbT4sIHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSB3aWxsIGJlIGNsZWFyZWQgb3V0IGluCi0JICoge0BsaW5rICNtYXBwaW5nQ2xhc3NDaGFuZ2VkKFN0cmluZywgU3RyaW5nKX0uIElmIHdlIGdldCBoZXJlIGFuZAotCSAqIHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSBpcyBzdGlsbCBwcmVzZW50LCB3ZSBjYW4KLQkgKiA8ZW0+c3luYzwvZW0+IGl0LiBPZiBjb3Vyc2UsIGl0IG1pZ2h0IHN0aWxsIGJlIG9ic29sZXRlIGlmIHRoZQotCSAqIGVudGl0eSBtYXBwaW5ncydzIHBhY2thZ2UgaGFzIGNoYW5nZWQuLi4uCi0JICoKLQkgKiBAc2VlICN1cGRhdGVKYXZhUGVyc2lzdGVudFR5cGUoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlICNzeW5jSmF2YVBlcnNpc3RlbnRUeXBlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKYXZhUGVyc2lzdGVudFR5cGUoKSB7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLnJlc29sdmVKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCWlmIChyZXNvdXJjZVR5cGUgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5kaXNwb3NlKCk7Ci0JCQkJdGhpcy5zZXRKYXZhUGVyc2lzdGVudFR5cGUobnVsbCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0SmF2YVBlcnNpc3RlbnRUeXBlKHRoaXMuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUocmVzb3VyY2VUeXBlKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkgPT0gcmVzb3VyY2VUeXBlKSB7Ci0JCQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLnVwZGF0ZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKLQkJCQkJdGhpcy5zZXRKYXZhUGVyc2lzdGVudFR5cGUodGhpcy5idWlsZEphdmFQZXJzaXN0ZW50VHlwZShyZXNvdXJjZVR5cGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2Uge0BsaW5rIE9ybVR5cGVNYXBwaW5nI2dldENsYXNzXygpfSBpbnN0ZWFkIG9mIHtAbGluayAjZ2V0TmFtZSgpfSB0bwotCSAqIGxvb2sgdXAgdGhlIEphdmEgcmVzb3VyY2UgdHlwZSBiZWNhdXNlIHtAbGluayAjZ2V0TmFtZSgpfQotCSAqIHNpbXBseSBkZWxlZ2F0ZXMgdG8gdGhlIGV4aXN0aW5nIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlLiAoSW4KLQkgKiB3aGljaCBjYXNlIHdlIHdvdWxkbid0IG5lZWQgdG8gcmVzb2x2ZSBpdCwgd291bGQgd2U/KSBbYnVnIDMzOTU2MF0KLQkgKiBAc2VlICN1cGRhdGVKYXZhUGVyc2lzdGVudFR5cGUoKQotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkucmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUodGhpcy5tYXBwaW5nLmdldENsYXNzXygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbnVsbCBpdCdzIGFuIGVudW07IGRvbid0IGJ1aWxkIGEgSmF2YVBlcnNpc3RlbnRUeXBlCi0JICovCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhdCkgewotCQlyZXR1cm4ganJhdC5nZXRLaW5kKCkgPT0gS2luZC5UWVBFID8gdGhpcy5idWlsZEphdmFQZXJzaXN0ZW50VHlwZSgoSmF2YVJlc291cmNlVHlwZSkganJhdCkgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoSmF2YVJlc291cmNlVHlwZSBqcnB0KSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQZXJzaXN0ZW50VHlwZSh0aGlzLCBqcnB0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEFjY2VzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQWNjZXNzIDogdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFNwZWNpZmllZEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIGFjY2VzcykgewotCQl0aGlzLnNldFNwZWNpZmllZEFjY2Vzc18oYWNjZXNzKTsKLQkJdGhpcy5nZXRYbWxUeXBlTWFwcGluZygpLnNldEFjY2VzcyhBY2Nlc3NUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChhY2Nlc3MpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3NfKEFjY2Vzc1R5cGUgYWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7Ci0JCXRoaXMuc3BlY2lmaWVkQWNjZXNzID0gYWNjZXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0FDQ0VTU19QUk9QRVJUWSwgb2xkLCBhY2Nlc3MpOwotCX0KLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkU3BlY2lmaWVkQWNjZXNzKCkgewotCQlyZXR1cm4gQWNjZXNzVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0QWNjZXNzKCksIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKSwgdGhpcy5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEFjY2VzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0QWNjZXNzKEFjY2Vzc1R5cGUgYWNjZXNzKSB7Ci0JCUFjY2Vzc1R5cGUgb2xkID0gdGhpcy5kZWZhdWx0QWNjZXNzOwotCQl0aGlzLmRlZmF1bHRBY2Nlc3MgPSBhY2Nlc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0FDQ0VTU19QUk9QRVJUWSwgb2xkLCBhY2Nlc3MpOwotCX0KLQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkRGVmYXVsdEFjY2VzcygpIHsKLQkJaWYgKCAhIHRoaXMubWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGVIYXNTcGVjaWZpZWRBY2Nlc3MoKSkgewotCQkJCQlyZXR1cm4gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCk7Ci0JCQkJfQotCQkJCWlmICh0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlBY2Nlc3NUeXBlIGFjY2VzcyA9IHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290KCkuZ2V0QWNjZXNzKCk7Ci0JCXJldHVybiAoYWNjZXNzICE9IG51bGwpID8gYWNjZXNzIDogQWNjZXNzVHlwZS5GSUVMRDsgIC8vIGRlZmF1bHQgdG8gRklFTEQgaWYgbm8gc3BlY2lmaWVkIGFjY2VzcyBmb3VuZAotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHtAbGluayAjamF2YVBlcnNpc3RlbnRUeXBlfSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBqYXZhUGVyc2lzdGVudFR5cGVIYXNTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkgIT0gbnVsbCkgfHwKLQkJCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5oYXNBbnlBbm5vdGF0ZWRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3duZXJPdmVycmlkZUFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRPdmVycmlkZVBlcnNpc3RlbnRUeXBlQWNjZXNzKCk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3duZXJEZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRQZXJzaXN0ZW50VHlwZUFjY2VzcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGVzICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0UmVhZE9ubHlTcGVjaWZpZWRBdHRyaWJ1dGVzKCksIHRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSArIHRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QXR0cmlidXRlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnZlcnRUb05hbWVzKHRoaXMuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gdGhpcy5nZXRBdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSkuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIHN0cmVhbS5oYXNOZXh0KCkgPyBzdHJlYW0ubmV4dCgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBbGxBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4oCi0JCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVudFR5cGUsIEl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4+KHRoaXMuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gdHJhbnNmb3JtKFBlcnNpc3RlbnRUeXBlIHB0KSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHB0LmdldEF0dHJpYnV0ZXMoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0VG9OYW1lcyh0aGlzLmdldEFsbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlc05hbWVkKGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gdGhpcy5nZXRBdHRyaWJ1dGVzTmFtZWQoYXR0cmlidXRlTmFtZSkuaXRlcmF0b3IoKTsKLQkJaWYgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKSB7Ci0JCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCQlyZXR1cm4gYXR0cmlidXRlcy5oYXNOZXh0KCkgPyBudWxsIC8qIG1vcmUgdGhhbiBvbmUgKi86IGF0dHJpYnV0ZTsKLQkJfQotCQkvLyByZWN1cnNlCi0JCXJldHVybiAodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlID09IG51bGwpID8gbnVsbCA6IHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZS5yZXNvbHZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGNvbnZlcnRUb05hbWVzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihhdHRyaWJ1dGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIGNvbnZlcnNpb25zICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnZlcnRBdHRyaWJ1dGVUb1NwZWNpZmllZChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0QXR0cmlidXRlVG9TcGVjaWZpZWQodmlydHVhbEF0dHJpYnV0ZSwgdmlydHVhbEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnZlcnRBdHRyaWJ1dGVUb1NwZWNpZmllZChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJaWYgKCAhIHZpcnR1YWxBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHNwZWNpZmllZDogIiArIHZpcnR1YWxBdHRyaWJ1dGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJLy8gdGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBkb2VzIG5vdCBoYXZlIGEgbWFwcGluZwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNlIGNvbnZlcnRBdHRyaWJ1dGVUb1NwZWNpZmllZChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZykgaW5zdGVhZCBhbmQgc3BlY2lmeSBhIG1hcHBpbmcga2V5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdGhpcy5jb252ZXJ0QXR0cmlidXRlVG9TcGVjaWZpZWRfKHZpcnR1YWxBdHRyaWJ1dGUsIG1hcHBpbmdLZXkpOwotCX0KLQotCS8qKgotCSAqIDxlbT5TaWxlbnRseTwvZW0+IHJlbW92ZSB0aGUgdmlydHVhbCBhdHRyaWJ1dGUgYW5kIGFkZCBzcGVjaWZpZWQKLQkgKiBhdHRyaWJ1dGUgYmVmb3JlIHRyaWdnZXJpbmcgYW4gPGVtPnVwZGF0ZTwvZW0+IG9yIHRoZSBkYW5nbGluZwotCSAqIHZpcnR1YWwgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBwcmVlbXB0aXZlbHkuCi0JICovCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udmVydEF0dHJpYnV0ZVRvU3BlY2lmaWVkXyhPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJLy8gc2lsZW50bHkgcmVtb3ZlIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZQotCQlpbnQgdmlydHVhbEluZGV4ID0gdGhpcy52aXJ0dWFsQXR0cmlidXRlcy5pbmRleE9mKHZpcnR1YWxBdHRyaWJ1dGUpOwotCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVzLnJlbW92ZSh2aXJ0dWFsSW5kZXgpOwotCQl2aXJ0dWFsQXR0cmlidXRlLmRpc3Bvc2UoKTsKLQotCQkvLyBzaWxlbnRseSBhZGQgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUKLQkJT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gbWQgPSB0aGlzLmdldE1hcHBpbmdGaWxlRGVmaW5pdGlvbigpLmdldEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKG1hcHBpbmdLZXkpOwotCQlYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcgPSBtZC5idWlsZFJlc291cmNlTWFwcGluZyh0aGlzLmdldFJlc291cmNlTm9kZUZhY3RvcnkoKSk7Ci0KLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRBdHRyaWJ1dGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlKHhtbE1hcHBpbmcpOwotCQkvLyB3ZSBuZWVkIHRvIGFkZCB0aGUgYXR0cmlidXRlIHRvIHRoZSByaWdodCBzcG90IGluIHRoZSBsaXN0IC0gc3R1cGlkIHNwZWMuLi4KLQkJaW50IHNwZWNpZmllZEluZGV4ID0gdGhpcy5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVJbnNlcnRpb25JbmRleChzcGVjaWZpZWRBdHRyaWJ1dGUpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMuYWRkKHNwZWNpZmllZEluZGV4LCBzcGVjaWZpZWRBdHRyaWJ1dGUpOwotCi0JCS8vIHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBpbml0aWFsIHVwZGF0ZTsKLQkJLy8gbm8gY2hhbmdlcyB0byBlaXRoZXIgY29sbGVjdGlvbiAodmlydHVhbCBvciBzcGVjaWZpZWQpIHNob3VsZCBiZSBkZXRlY3RlZCBhdCB0aGlzIHBvaW50Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuc2V0TmFtZSh2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0KLQkJLy8gZmlyZSB0aGUgbGlzdCBjaGFuZ2UgZXZlbnRzCi0JCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFZJUlRVQUxfQVRUUklCVVRFU19MSVNULCB2aXJ0dWFsSW5kZXgsIHZpcnR1YWxBdHRyaWJ1dGUpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCwgc3BlY2lmaWVkSW5kZXgsIHNwZWNpZmllZEF0dHJpYnV0ZSk7Ci0KLQkJLy8gaXQgc2hvdWxkIGJlIHNhZmUgdG8gdXBkYXRlIHRoZSBYTUwgbm93Ci0JCUF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcyA9IHRoaXMuZ2V0WG1sQXR0cmlidXRlc0ZvclVwZGF0ZSgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyh4bWxBdHRyaWJ1dGVzKTsKLQkJLy8gcG9zc2libHkgYSBOT1AsIGJ1dCBuZWVkZWQgd2hlbiB3ZSB0cmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyAnYXR0cmlidXRlcycKLQkJdGhpcy5nZXRYbWxUeXBlTWFwcGluZygpLnNldEF0dHJpYnV0ZXMoeG1sQXR0cmlidXRlcyk7Ci0KLQkJLy8gY29weSBvdmVyIHRoZSBzcGVjaWZpZWQgYWNjZXNzKD8pCi0JCUFjY2Vzc1R5cGUgb2xkQWNjZXNzID0gdmlydHVhbEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQlpZiAob2xkQWNjZXNzICE9IG51bGwpIHsKLQkJCXNwZWNpZmllZEF0dHJpYnV0ZS5zZXRTcGVjaWZpZWRBY2Nlc3Mob2xkQWNjZXNzKTsKLQkJfQotCQlyZXR1cm4gc3BlY2lmaWVkQXR0cmlidXRlOwotCX0KLQotCS8vIFRPRE8gdGhpcyBpcyB1c2VkIG9ubHkgYnkgb3VyIHRlc3RzLi4uCi0JLy8gd2UgY2Fubm90IGRlbGVnYXRlIHRvIGdldEF0dHJpYnV0ZU5hbWVkKFN0cmluZykuY29udmVydFRvU3BlY2lmaWVkKCkKLQkvLyBiZWNhdXNlIHRoZSB0ZXN0cyB1c2UgdGhpcyBtZXRob2QgdG8gYWRkICJvcnBoYW4iIHhtbCBhdHRyaWJ1dGVzICh0aGF0Ci0JLy8gZG8gbm90IGhhdmUgYSBjb3JyZXNwb25kaW5nIGphdmEgYXR0cmlidXRlIDooICkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRTcGVjaWZpZWRBdHRyaWJ1dGUoU3RyaW5nIG1hcHBpbmdLZXksIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCS8vIGZvcmNlIHRoZSBjcmVhdGlvbiBvZiBhbiBlbXB0eSB4bWwgYXR0cmlidXRlIGNvbnRhaW5lciBiZWZvcmVoYW5kIG9yIGl0IHdpbGwgdHJpZ2dlcgotCQkvLyBhIHN5bmMgYW5kLCBpZiB3ZSBkbyB0aGlzIGFmdGVyIGFkZGluZyB0aGUgYXR0cmlidXRlLCBjbGVhciBvdXQgb3VyIGNvbnRleHQgYXR0cmlidXRlcwotCQlBdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMgPSB0aGlzLmdldFhtbEF0dHJpYnV0ZXNGb3JVcGRhdGUoKTsKLQkJdGhpcy5nZXRYbWxUeXBlTWFwcGluZygpLnNldEF0dHJpYnV0ZXMoeG1sQXR0cmlidXRlcyk7ICAvLyBwb3NzaWJseSBhIE5PUAotCi0JCU9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIG1kID0gdGhpcy5nZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKS5nZXRBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbihtYXBwaW5nS2V5KTsKLQkJWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nID0gbWQuYnVpbGRSZXNvdXJjZU1hcHBpbmcodGhpcy5nZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkQXR0cmlidXRlID0gdGhpcy5idWlsZFNwZWNpZmllZEF0dHJpYnV0ZSh4bWxNYXBwaW5nKTsKLQkJLy8gd2UgbmVlZCB0byBhZGQgdGhlIGF0dHJpYnV0ZSB0byB0aGUgcmlnaHQgc3BvdCBpbiB0aGUgbGlzdCAtIHN0dXBpZCBzcGVjLi4uCi0JCWludCBzcGVjaWZpZWRJbmRleCA9IHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlSW5zZXJ0aW9uSW5kZXgoc3BlY2lmaWVkQXR0cmlidXRlKTsKLQkJLy8gdGhlIHZpcnR1YWwgYXR0cmlidXRlcyBsaXN0IHNob3VsZCByZW1haW4gdW5jaGFuZ2VkIHNpbmNlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGhhcyBubyBuYW1lCi0JCXRoaXMuYWRkSXRlbVRvTGlzdChzcGVjaWZpZWRJbmRleCwgc3BlY2lmaWVkQXR0cmlidXRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMsIFNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyh4bWxBdHRyaWJ1dGVzKTsKLQotCQkvLyB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgdXBkYXRlIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZXMgbGlzdAotCQlzcGVjaWZpZWRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnNldE5hbWUoYXR0cmlidXRlTmFtZSk7Ci0KLQkJcmV0dXJuIHNwZWNpZmllZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldFNwZWNpZmllZEF0dHJpYnV0ZUluc2VydGlvbkluZGV4KE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaW5zZXJ0aW9uSW5kZXhPZih0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSwgdGhpcy5nZXRBdHRyaWJ1dGVDb21wYXJhdG9yKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZUNvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBBVFRSSUJVVEVfQ09NUEFSQVRPUjsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gQVRUUklCVVRFX0NPTVBBUkFUT1IgPQotCQluZXcgQ29tcGFyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZTEsIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMikgewotCQkJCWludCBzZXExID0gYXR0cmlidXRlMS5nZXRNYXBwaW5nKCkuZ2V0WG1sU2VxdWVuY2UoKTsKLQkJCQlpbnQgc2VxMiA9IGF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLmdldFhtbFNlcXVlbmNlKCk7Ci0JCQkJcmV0dXJuIChzZXExID09IHNlcTIpID8gMCA6IChzZXExIDwgc2VxMikgPyAtMSA6IDE7Ci0JCQl9Ci0JCX07Ci0KLQkvKioKLQkgKiA8ZW0+U2lsZW50bHk8L2VtPiBhZGQgdGhlIG5ldyB2aXJ0dWFsIGF0dHJpYnV0ZSBiZWZvcmUgcmVtb3ZpbmcgdGhlCi0JICogc3BlY2lmaWVkIGF0dHJpYnV0ZSwgb3IgdGhlIDxlbT51cGRhdGU8L2VtPiB3aWxsIGRpc2NvdmVyIHRoZSBtaXNzaW5nCi0JICogdmlydHVhbCBhdHRyaWJ1dGUgYW5kIGFkZCBpdCBwcmVlbXB0aXZlbHkuCi0JICovCi0JcHVibGljIE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb252ZXJ0QXR0cmlidXRlVG9WaXJ0dWFsKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkQXR0cmlidXRlKSB7Ci0JCWlmIChzcGVjaWZpZWRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF0dHJpYnV0ZSBpcyBhbHJlYWR5IHZpcnR1YWw6ICIgKyBzcGVjaWZpZWRBdHRyaWJ1dGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpbnQgdmlydHVhbEluZGV4ID0gdGhpcy52aXJ0dWFsQXR0cmlidXRlcy5zaXplKCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gbnVsbDsKLQkJLy8gbWFrZSBzdXJlIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIEphdmEgYXR0cmlidXRlIGFjdHVhbGx5IGV4aXN0cyBpbiB0aGUgKmN1cnJlbnQqIHR5cGU7Ci0JCS8vIGRvICpub3QqIHRha2UgdGhlIGNvbnRleHQgSmF2YSBhdHRyaWJ1dGUgZGlyZWN0bHkgZnJvbSB0aGUgc3BlY2lmaWVkIE9STQotCQkvLyBhdHRyaWJ1dGUgd2UgYXJlIGNvbnZlcnRpbmcgc2luY2UgaXQgbWF5IGhhdmUgY29tZSBmcm9tIGEgc3VwZXJjbGFzczsKLQkJLy8gaW5zdGVhZCwgdXNlIGl0cyByZXNvdXJjZSBKYXZhIGF0dHJpYnV0ZSAod2hpY2ggd2lsbCBtYXRjaCBib3RoIG5hbWUgYW5kIGFjY2VzcyB0eXBlLAotCQkvLyBidXQgd2Ugc3RpbGwgbmVlZCB0byBjaGVjayBpdHMgcGFyZW50IHR5cGUpCi0JCWlmIChzcGVjaWZpZWRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkgIT0gbnVsbCkgewotCQkJaWYgKHNwZWNpZmllZEF0dHJpYnV0ZS5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCkgewotCQkJCUphdmFSZXNvdXJjZUZpZWxkIGphdmFSZXNvdXJjZUZpZWxkID0gKEphdmFSZXNvdXJjZUZpZWxkKSBzcGVjaWZpZWRBdHRyaWJ1dGUuZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQkJaWYgKHRoaXMuamF2YVJlc291cmNlRmllbGRXaWxsQmVWaXJ0dWFsKGphdmFSZXNvdXJjZUZpZWxkLCBzcGVjaWZpZWRBdHRyaWJ1dGUpKSB7Ci0JCQkJCXZpcnR1YWxBdHRyaWJ1dGUgPSB0aGlzLmJ1aWxkVmlydHVhbEF0dHJpYnV0ZShqYXZhUmVzb3VyY2VGaWVsZCk7Ci0JCQkJCXRoaXMudmlydHVhbEF0dHJpYnV0ZXMuYWRkKHZpcnR1YWxJbmRleCwgdmlydHVhbEF0dHJpYnV0ZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJUHJvcGVydHlBY2Nlc3NvciBwcm9wZXJ0eUFjY2Vzc29yID0gKFByb3BlcnR5QWNjZXNzb3IpIHNwZWNpZmllZEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2Vzc29yKCk7Ci0JCQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyID0gcHJvcGVydHlBY2Nlc3Nvci5nZXRSZXNvdXJjZUdldHRlcigpOwotCQkJCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZVNldHRlciA9IHByb3BlcnR5QWNjZXNzb3IuZ2V0UmVzb3VyY2VTZXR0ZXIoKTsKLQkJCQkKLQkJCQlpZiAodGhpcy5qYXZhUmVzb3VyY2VQcm9wZXJ0eVdpbGxCZVZpcnR1YWwocmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyLCBzcGVjaWZpZWRBdHRyaWJ1dGUpKSB7Ci0JCQkJCXZpcnR1YWxBdHRyaWJ1dGUgPSB0aGlzLmJ1aWxkVmlydHVhbEF0dHJpYnV0ZShyZXNvdXJjZUdldHRlciwgcmVzb3VyY2VTZXR0ZXIpOwotCQkJCQl0aGlzLnZpcnR1YWxBdHRyaWJ1dGVzLmFkZCh2aXJ0dWFsSW5kZXgsIHZpcnR1YWxBdHRyaWJ1dGUpOwotCQkJCX0JCQotCQkJfQotCQl9Ci0KLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGUoc3BlY2lmaWVkQXR0cmlidXRlKTsgIC8vIHRyaWdnZXIgdXBkYXRlCi0KLQkJaWYgKHZpcnR1YWxBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJdGhpcy5maXJlSXRlbUFkZGVkKFZJUlRVQUxfQVRUUklCVVRFU19MSVNULCB2aXJ0dWFsSW5kZXgsIHZpcnR1YWxBdHRyaWJ1dGUpOwotCQl9Ci0JCXJldHVybiB2aXJ0dWFsQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSmF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgd2lsbCBiZSBhCi0JICogPGVtPnZpcnR1YWw8L2VtPiBhdHRyaWJ1dGUgd2hlbiB0aGUgc3BlY2lmaWVkIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMKLQkgKiByZW1vdmVkIGZyb20gdGhlIHR5cGUuIFRoZSBKYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBtdXN0IGJlIGFtb25nIHRoZQotCSAqIHZhbGlkIEphdmEgcmVzb3VyY2UgYXR0cmlidXRlcyBhbmQgaXQgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbnkgb2YgdGhlCi0JICogcmVtYWluaW5nIHNwZWNpZmllZCBhdHRyaWJ1dGVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGphdmFSZXNvdXJjZUZpZWxkV2lsbEJlVmlydHVhbChKYXZhUmVzb3VyY2VGaWVsZCBqYXZhUmVzb3VyY2VGaWVsZCwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRBdHRyaWJ1dGVUb0JlUmVtb3ZlZCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0SmF2YVJlc291cmNlRmllbGRzKCksIGphdmFSZXNvdXJjZUZpZWxkKSAmJgotCQkJCSh0aGlzLmdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcihqYXZhUmVzb3VyY2VGaWVsZCwgc3BlY2lmaWVkQXR0cmlidXRlVG9CZVJlbW92ZWQpID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSmF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgd2lsbCBiZSBhCi0JICogPGVtPnZpcnR1YWw8L2VtPiBhdHRyaWJ1dGUgd2hlbiB0aGUgc3BlY2lmaWVkIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMKLQkgKiByZW1vdmVkIGZyb20gdGhlIHR5cGUuIFRoZSBKYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBtdXN0IGJlIGFtb25nIHRoZQotCSAqIHZhbGlkIEphdmEgcmVzb3VyY2UgYXR0cmlidXRlcyBhbmQgaXQgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbnkgb2YgdGhlCi0JICogcmVtYWluaW5nIHNwZWNpZmllZCBhdHRyaWJ1dGVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGphdmFSZXNvdXJjZVByb3BlcnR5V2lsbEJlVmlydHVhbChKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlU2V0dGVyLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZEF0dHJpYnV0ZVRvQmVSZW1vdmVkKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRKYXZhUmVzb3VyY2VNZXRob2RzKCksIGphdmFSZXNvdXJjZUdldHRlcikgJiYKLQkJCQlDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRKYXZhUmVzb3VyY2VNZXRob2RzKCksIGphdmFSZXNvdXJjZVNldHRlcikgJiYKLQkJCQkodGhpcy5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3IoamF2YVJlc291cmNlR2V0dGVyLCBqYXZhUmVzb3VyY2VTZXR0ZXIsIHNwZWNpZmllZEF0dHJpYnV0ZVRvQmVSZW1vdmVkKSA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogeG1sIGF0dHJpYnV0ZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSA8Y29kZT5hdHRyaWJ1dGVzPC9jb2RlPiBlbGVtZW50IGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZXMgZ2V0WG1sQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKS5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgYSBuZXcgPGNvZGU+YXR0cmlidXRlczwvY29kZT4gZWxlbWVudCBpZiBpdCBpcyBub3QgcHJlc2VudDsKLQkgKiBidXQgZG8gPGVtPm5vdDwvZW0+IGFkZCBpdCB0byB0aGUgWE1MIHR5cGUgbWFwcGluZy4gQ2FsbGVycyB3aWxsIGhhdmUKLQkgKiB0byBhZGQgaXQgdG8gdGhlIFhNTCB0eXBlIG1hcHBpbmcgd2hlbiBhcHByb3ByaWF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQXR0cmlidXRlcyBnZXRYbWxBdHRyaWJ1dGVzRm9yVXBkYXRlKCkgewotCQlBdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMgPSB0aGlzLmdldFhtbEF0dHJpYnV0ZXMoKTsKLQkJcmV0dXJuICh4bWxBdHRyaWJ1dGVzICE9IG51bGwpID8geG1sQXR0cmlidXRlcyA6IHRoaXMuYnVpbGRYbWxBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZXMgYnVpbGRYbWxBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKHRoaXMuZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzKCksIEF0dHJpYnV0ZXMuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZXNJZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxBdHRyaWJ1dGVzKCkuaXNVbnNldCgpKSB7Ci0JCQl0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCkuc2V0QXR0cmlidXRlcyhudWxsKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgYXR0cmlidXRlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldFJlYWRPbmx5U3BlY2lmaWVkQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlcy5zaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlXyhhdHRyaWJ1dGUpOwotCQlhdHRyaWJ1dGUuZ2V0TWFwcGluZygpLnJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKHRoaXMuZ2V0WG1sQXR0cmlidXRlcygpKTsKLQkJdGhpcy5yZW1vdmVYbWxBdHRyaWJ1dGVzSWZVbnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNoYW5nZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUsIE9ybUF0dHJpYnV0ZU1hcHBpbmcgb2xkTWFwcGluZywgT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCS8vIGtlZXAgdGhlIGNvbnRleHQgbW9kZWwgaW4gc3luYyB3aXRoIGVhY2ggY2hhbmdlIHRvIHRoZSByZXNvdXJjZSBtb2RlbAotCQlpbnQgc291cmNlSW5kZXggPSB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMuaW5kZXhPZihhdHRyaWJ1dGUpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMucmVtb3ZlKHNvdXJjZUluZGV4KTsKLQkJb2xkTWFwcGluZy5yZW1vdmVYbWxBdHRyaWJ1dGVNYXBwaW5nRnJvbSh0aGlzLmdldFhtbEF0dHJpYnV0ZXMoKSk7Ci0KLQkJaW50IHRhcmdldEluZGV4ID0gdGhpcy5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVJbnNlcnRpb25JbmRleChhdHRyaWJ1dGUpOwotCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMuYWRkKHRhcmdldEluZGV4LCBhdHRyaWJ1dGUpOwotCQluZXdNYXBwaW5nLmFkZFhtbEF0dHJpYnV0ZU1hcHBpbmdUbyh0aGlzLmdldFhtbEF0dHJpYnV0ZXMoKSk7Ci0KLQkJb2xkTWFwcGluZy5pbml0aWFsaXplT24obmV3TWFwcGluZyk7Ci0KLQkJdGhpcy5maXJlSXRlbU1vdmVkKFNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZEF0dHJpYnV0ZXMoKSB7Ci0JCWZvciAoWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nIDogdGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5ncygpKSB7Ci0JCQl0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMuYWRkKHRoaXMuYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGUoeG1sTWFwcGluZykpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFhtbEF0dHJpYnV0ZU1hcHBpbmc+IGdldFhtbEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlBdHRyaWJ1dGVzIHhtbEF0dHJpYnV0ZXMgPSB0aGlzLmdldFhtbEF0dHJpYnV0ZXMoKTsKLQkJcmV0dXJuICh4bWxBdHRyaWJ1dGVzICE9IG51bGwpID8geG1sQXR0cmlidXRlcy5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpIDogRW1wdHlJdGVyYWJsZS48WG1sQXR0cmlidXRlTWFwcGluZz5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUodGhpcywgeG1sTWFwcGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEF0dHJpYnV0ZXMoKSB7Ci0JCUNvbnRleHRDb250YWluZXJUb29scy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlQ29udGFpbmVyQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVNwZWNpZmllZEF0dHJpYnV0ZV8oaW50IGluZGV4LCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KGluZGV4LCBhdHRyaWJ1dGUsIHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlcywgU1BFQ0lGSUVEX0FUVFJJQlVURVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWVkQXR0cmlidXRlXyhpbnQgaW5kZXgsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRBdHRyaWJ1dGUoeG1sTWFwcGluZyk7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgYXR0cmlidXRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMsIFNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZV8oT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QoYXR0cmlidXRlLCB0aGlzLnNwZWNpZmllZEF0dHJpYnV0ZXMsIFNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBhdHRyaWJ1dGUgY29udGFpbmVyIGFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkQXR0cmlidXRlQ29udGFpbmVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIENvbnRleHRDb250YWluZXJUb29scy5BZGFwdGVyPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFhtbEF0dHJpYnV0ZU1hcHBpbmc+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIFNwZWNpZmllZE9ybVBlcnNpc3RlbnRUeXBlLnRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYWJsZTxYbWxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIFNwZWNpZmllZE9ybVBlcnNpc3RlbnRUeXBlLnRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ3MoKTsKLQkJfQotCQlwdWJsaWMgWG1sQXR0cmlidXRlTWFwcGluZyBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldE1hcHBpbmcoKS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlbGVtZW50KSB7Ci0JCQlTcGVjaWZpZWRPcm1QZXJzaXN0ZW50VHlwZS50aGlzLm1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVfKGluZGV4LCBlbGVtZW50KTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhZGRDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIFhtbEF0dHJpYnV0ZU1hcHBpbmcgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlTcGVjaWZpZWRPcm1QZXJzaXN0ZW50VHlwZS50aGlzLmFkZFNwZWNpZmllZEF0dHJpYnV0ZV8oaW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBlbGVtZW50KSB7Ci0JCQlTcGVjaWZpZWRPcm1QZXJzaXN0ZW50VHlwZS50aGlzLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZV8oZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmlydHVhbCBhdHRyaWJ1dGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRWaXJ0dWFsQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPih0aGlzLnZpcnR1YWxBdHRyaWJ1dGVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbEF0dHJpYnV0ZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBhdHRyaWJ1dGVzIGFyZSBzeW5jaHJvbml6ZWQgZHVyaW5nIHRoZSA8ZW0+dXBkYXRlPC9lbT4gYmVjYXVzZQotCSAqIHRoZSBsaXN0IG9mIHJlc291cmNlIGF0dHJpYnV0ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWNjZXNzIHR5cGUKLQkgKiB3aGljaCBjYW4gYmUgY29udHJvbGxlZCBpbiBhIG51bWJlciBvZiBkaWZmZXJlbnQgcGxhY2VzLi4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxBdHRyaWJ1dGVzKCkgewotCQlpZiAoZ2V0VmlydHVhbEphdmFBY2Nlc3MoKSA9PSBBY2Nlc3NUeXBlLkZJRUxEKSB7Ci0JCQl0aGlzLnN5bmNGaWVsZEFjY2Vzc1ZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0VmlydHVhbEphdmFBY2Nlc3MoKSA9PSBBY2Nlc3NUeXBlLlBST1BFUlRZKSB7Ci0JCQl0aGlzLnN5bmNQcm9wZXJ0eUFjY2Vzc1ZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoZSBhdHRyaWJ1dGVzIGZvciBBY2Nlc3NUeXBlLkZJRUxECi0JICogMS4gYWxsIG5vbi10cmFuc2llbnQsIG5vbi1zdGF0aWMgZmllbGRzCi0JICogMi4gYWxsIGFubm90YXRlZCBtZXRob2RzKGdldHRlcnMvc2V0dGVycykKLQkgKi8KLQlwcml2YXRlIHZvaWQgc3luY0ZpZWxkQWNjZXNzVmlydHVhbEF0dHJpYnV0ZXMoKSB7Ci0JCUhhc2hTZXQ8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBjb250ZXh0QXR0cmlidXRlcyA9IENvbGxlY3Rpb25Ub29scy5zZXQodGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlcygpKTsKLQotCQl0aGlzLnN5bmNGaWVsZFZpcnR1YWxBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCBidWlsZE5vblRyYW5zaWVudE5vblN0YXRpY1Jlc291cmNlRmllbGRzRmlsdGVyKCkpOwotCQlpZiAoIWdldE1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSkgewotCQkJdGhpcy5zeW5jQW5ub3RhdGVkUHJvcGVydHlWaXJ0dWFsQXR0cmlidXRlcyhjb250ZXh0QXR0cmlidXRlcyk7Ci0JCX0KLQotCQkvLyByZW1vdmUgYW55IGxlZnRvdmVyIGNvbnRleHQgYXR0cmlidXRlcwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlIDogY29udGV4dEF0dHJpYnV0ZXMpIHsKLQkJCXRoaXMucmVtb3ZlVmlydHVhbEF0dHJpYnV0ZShjb250ZXh0QXR0cmlidXRlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIGF0dHJpYnV0ZXMgZm9yIFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkKLQkgKiAxLiBhbGwgZ2V0dGVyL3NldHRlciBqYXZhYmVhbnMgcGFpcnMKLQkgKiAyLiBhbGwgYW5ub3RhdGVkIGZpZWxkcwotCSAqIDMuIGFsbCBhbm5vdGF0ZWQgbWV0aG9kcyBnZXR0ZXJzL3NldHRlcnMgdGhhdCBkb24ndCBoYXZlIGEgbWF0Y2hpbmcgcGFpcgotCSAqLwotCXByaXZhdGUgdm9pZCBzeW5jUHJvcGVydHlBY2Nlc3NWaXJ0dWFsQXR0cmlidXRlcygpIHsKLQkJSGFzaFNldDxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzID0gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkpOwotCi0JCWlmICghZ2V0TWFwcGluZygpLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQl0aGlzLnN5bmNGaWVsZFZpcnR1YWxBdHRyaWJ1dGVzKGNvbnRleHRBdHRyaWJ1dGVzLCBBYnN0cmFjdEphdmFQZXJzaXN0ZW50VHlwZS5BTk5PVEFURURfUkVTT1VSQ0VfRklFTERTX0ZJTFRFUik7Ci0JCX0KLQotCQlDb2xsZWN0aW9uPEphdmFSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzID0gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRKYXZhUmVzb3VyY2VNZXRob2RzKCkpOwotCQkvL2l0ZXJhdGUgdGhyb3VnaCBhbGwgcmVzb3VyY2UgbWV0aG9kcyBzZWFyY2hpbmcgZm9yIHBlcnNpc3RhYmxlIGdldHRlcnMKLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgZ2V0dGVyTWV0aG9kIDogdGhpcy5nZXRKYXZhUmVzb3VyY2VNZXRob2RzKHRoaXMuYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcigpKSkgewotCQkJSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCA9IEFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlLmdldFZhbGlkU2libGluZ1NldE1ldGhvZChnZXR0ZXJNZXRob2QsIHJlc291cmNlTWV0aG9kcyk7Ci0JCQlpZiAoamF2YVJlc291cmNlUHJvcGVydHlJc1ZpcnR1YWwoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJaWYgKEFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlLm1ldGhvZHNBcmVQZXJzaXN0YWJsZVByb3BlcnRpZXMoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQkJZm9yIChJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGNvbnRleHRBdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkJCQlpZiAoY29udGV4dEF0dHJpYnV0ZS5pc0ZvcihnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpIHsKLQkJCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCQkJY29udGV4dEF0dHJpYnV0ZS51cGRhdGUoKTsKLQkJCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFtYXRjaCkgewotCQkJCQkJdGhpcy5hZGRWaXJ0dWFsQXR0cmlidXRlKGdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpLCB0aGlzLmJ1aWxkVmlydHVhbEF0dHJpYnV0ZShnZXR0ZXJNZXRob2QsIHNldHRlck1ldGhvZCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShnZXR0ZXJNZXRob2QpOwotCQkJcmVzb3VyY2VNZXRob2RzLnJlbW92ZShzZXR0ZXJNZXRob2QpOwotCQl9Ci0JCXRoaXMuc3luY1JlbWFpbmluZ1Jlc291cmNlVmlydHVhbE1ldGhvZHMoY29udGV4dEF0dHJpYnV0ZXMsIHJlc291cmNlTWV0aG9kcyk7Ci0KLQkJLy8gcmVtb3ZlIGFueSBsZWZ0b3ZlciBjb250ZXh0IGF0dHJpYnV0ZXMKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA6IGNvbnRleHRBdHRyaWJ1dGVzKSB7Ci0JCQl0aGlzLnJlbW92ZVZpcnR1YWxBdHRyaWJ1dGUoY29udGV4dEF0dHJpYnV0ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Fubm90YXRlZFByb3BlcnR5VmlydHVhbEF0dHJpYnV0ZXMoSGFzaFNldDxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzKSB7Ci0JCUNvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLmdldEphdmFSZXNvdXJjZU1ldGhvZHMoKSk7Ci0JCS8vaXRlcmF0ZSB0aHJvdWdoIGFsbCByZXNvdXJjZSBtZXRob2RzIHNlYXJjaGluZyBmb3IgcGVyc2lzdGFibGUgZ2V0dGVycwotCQlmb3IgKEphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXJNZXRob2QgOiB0aGlzLmdldEphdmFSZXNvdXJjZU1ldGhvZHMoYnVpbGRQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyTWV0aG9kc0ZpbHRlcigpKSkgewotCQkJSmF2YVJlc291cmNlTWV0aG9kIHNldHRlck1ldGhvZCA9IEFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlLmdldFZhbGlkU2libGluZ1NldE1ldGhvZChnZXR0ZXJNZXRob2QsIHJlc291cmNlTWV0aG9kcyk7Ci0JCQlpZiAoamF2YVJlc291cmNlUHJvcGVydHlJc1ZpcnR1YWwoZ2V0dGVyTWV0aG9kLCBzZXR0ZXJNZXRob2QpKSB7Ci0JCQkJaWYgKGdldHRlck1ldGhvZC5pc0Fubm90YXRlZCgpIHx8IChzZXR0ZXJNZXRob2QgIT0gbnVsbCAmJiBzZXR0ZXJNZXRob2QuaXNBbm5vdGF0ZWQoKSkpIHsKLQkJCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCQlmb3IgKEl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gY29udGV4dEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQkJCWlmIChjb250ZXh0QXR0cmlidXRlLmlzRm9yKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSkgewotCQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJCQljb250ZXh0QXR0cmlidXRlLnVwZGF0ZSgpOwotCQkJCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIW1hdGNoKSB7Ci0JCQkJCQl0aGlzLmFkZFZpcnR1YWxBdHRyaWJ1dGUoZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCksIHRoaXMuYnVpbGRWaXJ0dWFsQXR0cmlidXRlKGdldHRlck1ldGhvZCwgc2V0dGVyTWV0aG9kKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKGdldHRlck1ldGhvZCk7Ci0JCQlyZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHNldHRlck1ldGhvZCk7Ci0JCX0KLQkJdGhpcy5zeW5jUmVtYWluaW5nUmVzb3VyY2VWaXJ0dWFsTWV0aG9kcyhjb250ZXh0QXR0cmlidXRlcywgcmVzb3VyY2VNZXRob2RzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0ZpZWxkVmlydHVhbEF0dHJpYnV0ZXMoSGFzaFNldDxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGNvbnRleHRBdHRyaWJ1dGVzLCBGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+IGZpbHRlcikgewotCQlmb3IgKEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgOiB0aGlzLmdldFZpcnR1YWxKYXZhUmVzb3VyY2VGaWVsZHMoZmlsdGVyKSkgewotCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHN0cmVhbSA9IGNvbnRleHRBdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gc3RyZWFtLm5leHQoKTsKLQkJCQlpZiAoY29udGV4dEF0dHJpYnV0ZS5pc0ZvcihyZXNvdXJjZUZpZWxkKSkgewotCQkJCQltYXRjaCA9IHRydWU7Ci0JCQkJCWNvbnRleHRBdHRyaWJ1dGUudXBkYXRlKCk7Ci0JCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXRjaCkgewotCQkJCS8vIGFkZGVkIGVsZW1lbnRzIGFyZSBzeW5jJ2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb3Igd2lsbCBiZQotCQkJCS8vIHVwZGF0ZWQgZHVyaW5nIHRoZSBuZXh0ICJ1cGRhdGUiICh3aGljaCBpcyB0cmlnZ2VyZWQgYnkKLQkJCQkvLyB0aGVpciBhZGRpdGlvbiB0byB0aGUgbW9kZWwpCi0JCQkJdGhpcy5hZGRWaXJ0dWFsQXR0cmlidXRlKHRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCksIHRoaXMuYnVpbGRWaXJ0dWFsQXR0cmlidXRlKHJlc291cmNlRmllbGQpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUmVtYWluaW5nUmVzb3VyY2VWaXJ0dWFsTWV0aG9kcyhIYXNoU2V0PE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gY29udGV4dEF0dHJpYnV0ZXMsIENvbGxlY3Rpb248SmF2YVJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJLy9pdGVyYXRlIHRocm91Z2ggcmVtYWluaW5nIHJlc291cmNlIG1ldGhvZHMgYW5kIHNlYXJjaCBmb3IgdGhvc2UgdGhhdCBhcmUgYW5ub3RhdGVkLgotCQkvL2FsbCBnZXR0ZXIgbWV0aG9kcyB3aWxsIGFscmVhZHkgYmUgdXNlZC4KLQkJZm9yIChKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgOiByZXNvdXJjZU1ldGhvZHMpIHsKLQkJCWlmIChyZXNvdXJjZU1ldGhvZC5pc0Fubm90YXRlZCgpKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaCA9IGZhbHNlOwotCQkJCS8vYW5ub3RhdGVkIHNldHRlcihvciBvdGhlciByYW5kb20gbWV0aG9kKSB3aXRoIG5vIGNvcnJlc3BvbmRpbmcgZ2V0dGVyLCBicmluZyBpbnRvIGNvbnRleHQgbW9kZWwgZm9yIHZhbGlkYXRpb24gcHVycG9zZXMKLQkJCQlmb3IgKEl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gc3RyZWFtID0gY29udGV4dEF0dHJpYnV0ZXMuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTspIHsKLQkJCQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCQlpZiAoY29udGV4dEF0dHJpYnV0ZS5pc0ZvcihudWxsLCByZXNvdXJjZU1ldGhvZCkpIHsKLQkJCQkJCW1hdGNoID0gdHJ1ZTsKLQkJCQkJCWNvbnRleHRBdHRyaWJ1dGUudXBkYXRlKCk7Ci0JCQkJCQlzdHJlYW0ucmVtb3ZlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW1hdGNoKSB7Ci0JCQkJCXRoaXMuYWRkVmlydHVhbEF0dHJpYnV0ZShnZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSwgdGhpcy5idWlsZFZpcnR1YWxBdHRyaWJ1dGUobnVsbCwgcmVzb3VyY2VNZXRob2QpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBKYXZhIHJlc291cmNlIGZpZWxkcyB0aGF0IGRvIG5vdCBoYXZlIGEgCi0JICogY29ycmVzcG9uZGluZyA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtYXBwaW5nIGN1cnJlbnRseQotCSAqIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4gZ2V0VmlydHVhbEphdmFSZXNvdXJjZUZpZWxkcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4odGhpcy5nZXRKYXZhUmVzb3VyY2VGaWVsZHMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChKYXZhUmVzb3VyY2VGaWVsZCBqYXZhUmVzb3VyY2VGaWVsZCkgewotCQkJCQlyZXR1cm4gU3BlY2lmaWVkT3JtUGVyc2lzdGVudFR5cGUudGhpcy5qYXZhUmVzb3VyY2VGaWVsZElzVmlydHVhbChqYXZhUmVzb3VyY2VGaWVsZCk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlRmllbGQ+IGdldEphdmFSZXNvdXJjZUZpZWxkcygpIHsKLQkJSmF2YVJlc291cmNlVHlwZSBqYXZhUmVzb3VyY2VUeXBlID0gdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCWlmIChqYXZhUmVzb3VyY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBqYXZhUmVzb3VyY2VUeXBlLmdldEZpZWxkcygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VGaWVsZD4gZ2V0VmlydHVhbEphdmFSZXNvdXJjZUZpZWxkcyhGaWx0ZXI8SmF2YVJlc291cmNlRmllbGQ+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkPihnZXRWaXJ0dWFsSmF2YVJlc291cmNlRmllbGRzKCksIGZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZU1ldGhvZD4gZ2V0SmF2YVJlc291cmNlTWV0aG9kcyhGaWx0ZXI8SmF2YVJlc291cmNlTWV0aG9kPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKYXZhUmVzb3VyY2VNZXRob2Q+KGdldEphdmFSZXNvdXJjZU1ldGhvZHMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlTWV0aG9kPiBnZXRKYXZhUmVzb3VyY2VNZXRob2RzKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIGphdmFSZXNvdXJjZVR5cGUgPSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJaWYgKGphdmFSZXNvdXJjZVR5cGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGphdmFSZXNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsdGVyPEphdmFSZXNvdXJjZUZpZWxkPiBidWlsZE5vblRyYW5zaWVudE5vblN0YXRpY1Jlc291cmNlRmllbGRzRmlsdGVyKCkgewotCQlyZXR1cm4gQWJzdHJhY3RKYXZhUGVyc2lzdGVudFR5cGUuYnVpbGROb25UcmFuc2llbnROb25TdGF0aWNSZXNvdXJjZUZpZWxkc0ZpbHRlcigpOwotCX0KLQotCXByb3RlY3RlZCBGaWx0ZXI8SmF2YVJlc291cmNlTWV0aG9kPiBidWlsZFBlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXJNZXRob2RzRmlsdGVyKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcjxKYXZhUmVzb3VyY2VNZXRob2Q+KCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgewotCQkJCXJldHVybiBBYnN0cmFjdEphdmFQZXJzaXN0ZW50VHlwZS5tZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIocmVzb3VyY2VNZXRob2QsIGdldEphdmFSZXNvdXJjZU1ldGhvZHMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY2Nlc3MgdHlwZSB0aGF0IGRldGVybWluZXMgd2hpY2ggSmF2YSBhdHRyaWJ1dGVzIGFyZSB0byBiZQotCSAqIHVzZWQgZm9yIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0eXBlJ3MgPGVtPnZpcnR1YWw8L2VtPiBhdHRyaWJ1dGVzLgotCSAqLwotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldFZpcnR1YWxKYXZhQWNjZXNzKCkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRBY2Nlc3MgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQWNjZXNzOwotCQl9Ci0JCWlmICh0aGlzLm1hcHBpbmcuaXNNZXRhZGF0YUNvbXBsZXRlKCkpIHsKLQkJCXJldHVybiB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JCX0KLQkJQWNjZXNzVHlwZSBqYXZhQWNjZXNzID0gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQkJcmV0dXJuIChqYXZhQWNjZXNzICE9IG51bGwpID8gamF2YUFjY2VzcyA6IHRoaXMuZGVmYXVsdEFjY2VzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBqYXZhUmVzb3VyY2VGaWVsZElzVmlydHVhbChKYXZhUmVzb3VyY2VGaWVsZCBqYXZhUmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3IoamF2YVJlc291cmNlRmllbGQpID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9yKEphdmFSZXNvdXJjZUZpZWxkIGphdmFSZXNvdXJjZUZpZWxkKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcihqYXZhUmVzb3VyY2VGaWVsZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBKYXZhCi0JICogcmVzb3VyY2UgZmllbGQsIGlnbm9yaW5nIHRoZSBzcGVjaWZpZWQgZXhjbHVkZWQgYXR0cmlidXRlIChzaW5jZQotCSAqIHRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIHNwZWNpZmllZCBhdHRyaWJ1dGUgcGVyIEphdmEgcmVzb3VyY2UKLQkgKiBhdHRyaWJ1dGU7IGFsYmVpdCBlcnJvbmVvdXNseSkuCi0JICovCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0U3BlY2lmaWVkQXR0cmlidXRlRm9yKEphdmFSZXNvdXJjZUZpZWxkIGphdmFSZXNvdXJjZUZpZWxkLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGV4Y2x1ZGUpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybUF0dHJpYnV0ZSA6IHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpKSB7Ci0JCQlpZiAob3JtQXR0cmlidXRlID09IGV4Y2x1ZGUpIHsKLQkJCQljb250aW51ZTsgIC8vIHNraXAKLQkJCX0KLQkJCWlmIChvcm1BdHRyaWJ1dGUuaXNGb3IoamF2YVJlc291cmNlRmllbGQpKSB7Ci0JCQkJcmV0dXJuIG9ybUF0dHJpYnV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBqYXZhUmVzb3VyY2VQcm9wZXJ0eUlzVmlydHVhbChKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcihqYXZhUmVzb3VyY2VHZXR0ZXIsIGphdmFSZXNvdXJjZVNldHRlcikgPT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3IoSmF2YVJlc291cmNlTWV0aG9kIGphdmFSZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIGphdmFSZXNvdXJjZVNldHRlcikgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVGb3IoamF2YVJlc291cmNlR2V0dGVyLCBqYXZhUmVzb3VyY2VTZXR0ZXIsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgSmF2YQotCSAqIHJlc291cmNlIGZpZWxkLCBpZ25vcmluZyB0aGUgc3BlY2lmaWVkIGV4Y2x1ZGVkIGF0dHJpYnV0ZSAoc2luY2UKLQkgKiB0aGVyZSBjYW4gYmUgbW9yZSB0aGFuIG9uZSBzcGVjaWZpZWQgYXR0cmlidXRlIHBlciBKYXZhIHJlc291cmNlCi0JICogYXR0cmlidXRlOyBhbGJlaXQgZXJyb25lb3VzbHkpLgotCSAqLwotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFNwZWNpZmllZEF0dHJpYnV0ZUZvcihKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlU2V0dGVyLCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGV4Y2x1ZGUpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybUF0dHJpYnV0ZSA6IHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpKSB7Ci0JCQlpZiAob3JtQXR0cmlidXRlID09IGV4Y2x1ZGUpIHsKLQkJCQljb250aW51ZTsgIC8vIHNraXAKLQkJCX0KLQkJCWlmIChvcm1BdHRyaWJ1dGUuaXNGb3IoamF2YVJlc291cmNlR2V0dGVyLCBqYXZhUmVzb3VyY2VTZXR0ZXIpKSB7Ci0JCQkJcmV0dXJuIG9ybUF0dHJpYnV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlVmlydHVhbEF0dHJpYnV0ZShpbnQgaW5kZXgsIE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlKSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIHZpcnR1YWxBdHRyaWJ1dGUsIHRoaXMudmlydHVhbEF0dHJpYnV0ZXMsIFZJUlRVQUxfQVRUUklCVVRFU19MSVNUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRWaXJ0dWFsQXR0cmlidXRlKGludCBpbmRleCwgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUpIHsKLQkJdGhpcy5hZGRJdGVtVG9MaXN0KGluZGV4LCB2aXJ0dWFsQXR0cmlidXRlLCB0aGlzLnZpcnR1YWxBdHRyaWJ1dGVzLCBWSVJUVUFMX0FUVFJJQlVURVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGUoSmF2YVJlc291cmNlRmllbGQgamF2YVJlc291cmNlRmllbGQpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRWaXJ0dWFsT3JtUGVyc2lzdGVudEZpZWxkKHRoaXMsIGphdmFSZXNvdXJjZUZpZWxkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZShKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgamF2YVJlc291cmNlU2V0dGVyKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkVmlydHVhbE9ybVBlcnNpc3RlbnRQcm9wZXJ0eSh0aGlzLCBqYXZhUmVzb3VyY2VHZXR0ZXIsIGphdmFSZXNvdXJjZVNldHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbEF0dHJpYnV0ZShPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSkgewotCQl2aXJ0dWFsQXR0cmlidXRlLmRpc3Bvc2UoKTsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3QodmlydHVhbEF0dHJpYnV0ZSwgdGhpcy52aXJ0dWFsQXR0cmlidXRlcywgVklSVFVBTF9BVFRSSUJVVEVTX0xJU1QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdXBlciBwZXJzaXN0ZW50IHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3VwZXJQZXJzaXN0ZW50VHlwZShQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQlQZXJzaXN0ZW50VHlwZSBvbGQgPSB0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGU7Ci0JCXRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSA9IHBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1VQRVJfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZLCBvbGQsIHBlcnNpc3RlbnRUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgYnVpbGRTdXBlclBlcnNpc3RlbnRUeXBlKCkgewotCQlQZXJzaXN0ZW50VHlwZSBzcHQgPSB0aGlzLmJ1aWxkU3VwZXJQZXJzaXN0ZW50VHlwZV8oKTsKLQkJaWYgKHNwdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyBjaGVjayBmb3IgY2lyY3VsYXIgaW5oZXJpdGFuY2UKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyhzcHQuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKSwgdGhpcykgPyBudWxsIDogc3B0OwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBidWlsZFN1cGVyUGVyc2lzdGVudFR5cGVfKCkgewotCQlyZXR1cm4gKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlID09IG51bGwpID8gbnVsbCA6IHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5oZXJpdGFuY2UgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBnZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHlPZih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+IGdldEFuY2VzdG9ycygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHlPZih0aGlzLnN1cGVyUGVyc2lzdGVudFR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHlPZihQZXJzaXN0ZW50VHlwZSBzdGFydCkgewotCQkvLyB1c2luZyBhIGNoYWluIGl0ZXJhYmxlIHRvIHRyYXZlcnNlIHVwIHRoZSBpbmhlcml0YW5jZSB0cmVlCi0JCXJldHVybiBuZXcgQ2hhaW5JdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4oc3RhcnQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRUeXBlIG5leHRMaW5rKFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVjbGFyaW5nIHR5cGUgbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ1R5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWNsYXJpbmdUeXBlTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWNsYXJpbmdUeXBlTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWNsYXJpbmdUeXBlTmFtZTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUNMQVJJTkdfVFlQRV9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWNsYXJpbmdUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyB0aGlzLmJ1aWxkRGVjbGFyaW5nVHlwZU5hbWVfKCkgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWNsYXJpbmdUeXBlTmFtZV8oKSB7Ci0JCXJldHVybiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPwotCQkJCW51bGwgOiAoKEphdmFQZXJzaXN0ZW50VHlwZTJfMCkgdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUpLmdldERlY2xhcmluZ1R5cGVOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTWV0YW1vZGVsU291cmNlVHlwZS5TeW5jaHJvbml6ZXIgYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldEpwYUZhY3RvcnkyXzAoKS5idWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcih0aGlzKSA6Ci0JCQkJbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0TWV0YW1vZGVsRmlsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLm1ldGFtb2RlbFN5bmNocm9uaXplci5nZXRGaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU1ldGFtb2RlbCgpIHsKLQkJLy8gZG8gbm90aGluZyAtIHByb2JhYmx5IHNob3VsZG4ndCBiZSBjYWxsZWQuLi4KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEFsbCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW50IHR5cGVzIG11c3QgYmUgYWJsZSB0byBnZW5lcmF0ZSBhIHN0YXRpYyBtZXRhbW9kZWwKLQkgKiBiZWNhdXNlIDEuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlcyBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIDIuMCBwZXJzaXN0ZW5jZS54bWwgZmlsZXMuCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUpIHsKLQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCXRoaXMubWV0YW1vZGVsU3luY2hyb25pemVyLnN5bmNocm9uaXplKG1lbWJlclR5cGVUcmVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50Qm9keVNvdXJjZU9uKEJvZHlTb3VyY2VXcml0ZXIgcHcsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB7Ci0JCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLm1ldGFtb2RlbFN5bmNocm9uaXplci5wcmludEJvZHlTb3VyY2VPbihwdywgbWVtYmVyVHlwZVRyZWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZU1ldGFtb2RlbCgpIHsKLQkJLy8gZG8gbm90aGluZyAtIHByb2JhYmx5IHNob3VsZG4ndCBiZSBjYWxsZWQuLi4KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gT3JtU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEOwotCX0KLQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJZm9yIChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoYXR0cmlidXRlLmNvbnRhaW5zKHRleHRPZmZzZXQpKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOwotCQl9Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgOiB0aGlzLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkpIHsKLQkJCXZpcnR1YWxBdHRyaWJ1dGUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbnRUeXBlLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldE92ZXJyaWRlUGVyc2lzdGVudFR5cGVBY2Nlc3MoKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZEFjY2VzcyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBY2Nlc3M7Ci0JCX0KLQotCQlpZiAodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJCUFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA9ICgoT3JtUGVyc2lzdGVudFR5cGUpIHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSkuZ2V0U3BlY2lmaWVkQWNjZXNzKCk7Ci0JCQlpZiAoYWNjZXNzVHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGhpcy5tYXBwaW5nLmlzTWV0YWRhdGFDb21wbGV0ZSgpKSB7Ci0JCQlBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgPSB0aGlzLmdldE93bmVyRGVmYXVsdEFjY2VzcygpOwotCQkJaWYgKGFjY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBhY2Nlc3NUeXBlOwotCQkJfQotCQl9Ci0KLQkJLy8gbm8gb3ZlcnJpZGUgYWNjZXNzIHR5cGUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgewotCQlpZiAodGhpcy5zdXBlclBlcnNpc3RlbnRUeXBlIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJCUFjY2Vzc1R5cGUgYWNjZXNzVHlwZSA9ICgoT3JtUGVyc2lzdGVudFR5cGUpIHRoaXMuc3VwZXJQZXJzaXN0ZW50VHlwZSkuZ2V0RGVmYXVsdEFjY2VzcygpOwotCQkJaWYgKGFjY2Vzc1R5cGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBhY2Nlc3NUeXBlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXJEZWZhdWx0QWNjZXNzKCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8RGVsZXRlRWRpdD4gY3JlYXRlRGVsZXRlVHlwZUVkaXRzKElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3IodHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RGVsZXRlRWRpdD4odGhpcy5tYXBwaW5nLmNyZWF0ZURlbGV0ZUVkaXQoKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPERlbGV0ZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXRoaXMubWFwcGluZy5jcmVhdGVSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZVNwZWNpZmllZEF0dHJpYnV0ZXNSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVNwZWNpZmllZEF0dHJpYnV0ZXNSZW5hbWVUeXBlRWRpdHMoZmluYWwgSVR5cGUgb3JpZ2luYWxUeXBlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4odGhpcy5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLm1hcHBpbmcuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3JlYXRlU3BlY2lmaWVkQXR0cmlidXRlc01vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVNwZWNpZmllZEF0dHJpYnV0ZXNNb3ZlVHlwZUVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZS5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQl0aGlzLm1hcHBpbmcuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVTcGVjaWZpZWRBdHRyaWJ1dGVzUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVTcGVjaWZpZWRBdHRyaWJ1dGVzUmVuYW1lUGFja2FnZUVkaXRzKGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4odGhpcy5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZUNsYXNzKG1lc3NhZ2VzKTsKLQkJdGhpcy52YWxpZGF0ZU1hcHBpbmcobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZXMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUywKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMubWFwcGluZy5nZXRDbGFzc1RleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwcGluZyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLm1hcHBpbmcudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2codCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiB0aGlzLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZShhdHRyaWJ1dGUsIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUF0dHJpYnV0ZShPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRyeSB7Ci0JCQlhdHRyaWJ1dGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfSBjYXRjaChUaHJvd2FibGUgdCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2codCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFja2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobmFtZS5lcXVhbHModHlwZU5hbWUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlTdHJpbmcgZGVmYXVsdFBhY2thZ2UgPSB0aGlzLmdldERlZmF1bHRQYWNrYWdlKCk7Ci0JCWlmIChkZWZhdWx0UGFja2FnZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIChkZWZhdWx0UGFja2FnZSArICcuJyArICBuYW1lKS5lcXVhbHModHlwZU5hbWUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW4oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gdGhpcy5nZXRQYWNrYWdlTmFtZSgpOwotCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwocGFja2FnZU5hbWUsIHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJU3RyaW5nIGRlZmF1bHRQYWNrYWdlID0gdGhpcy5nZXREZWZhdWx0UGFja2FnZSgpOwotCQlpZiAoZGVmYXVsdFBhY2thZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXBhY2thZ2VOYW1lID0gKHBhY2thZ2VOYW1lID09IG51bGwpID8gZGVmYXVsdFBhY2thZ2UgOiBkZWZhdWx0UGFja2FnZSArICcuJyArIHBhY2thZ2VOYW1lOwotCQlyZXR1cm4gcGFja2FnZU5hbWUuZXF1YWxzKHBhY2thZ2VGcmFnbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxhc3RQZXJpb2QgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJcmV0dXJuIChsYXN0UGVyaW9kID09IC0xKSA/IG51bGwgOiBjbGFzc05hbWUuc3Vic3RyaW5nKDAsIGxhc3RQZXJpb2QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldE92ZXJyaWRkZW5QZXJzaXN0ZW50VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5pc01ldGFkYXRhQ29tcGxldGUoKSA/IG51bGwgOiB0aGlzLmphdmFQZXJzaXN0ZW50VHlwZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvb3JtL1ZpcnR1YWxPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWRmOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9vcm0vVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRmllbGRBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLlByb3BlcnR5QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxlbT52aXJ0dWFsPC9lbT4gPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCBhdHRyaWJ1dGUKLSAqLwotcHVibGljIGNsYXNzIFZpcnR1YWxPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQWNjZXNzb3IgamF2YUFjY2Vzc29yOwotCi0JLyoqCi0JICogVGhpcyBpcyBhbiAiYW5ub3RhdGVkIiBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlIHdob3NlIHN0YXRlIGlzCi0JICogZGV0ZXJtaW5lZCBieSBpdHMgYW5ub3RhdGlvbnMgKGp1c3QgbGlrZSBhICJub3JtYWwiIEphdmEgYXR0cmlidXRlKS4KLQkgKiBJdHMgcGFyZW50IGlzIGFuIDxjb2RlPm9ybS54bWw8L2NvZGU+IHBlcnNpc3RlbnQgdHlwZS4gVGhpcyBpcyBuZWNlc3NhcnkKLQkgKiBiZWNhdXNlIHRoZSBKYXZhIGF0dHJpYnV0ZSdzIDxlbT5jb250ZXh0PC9lbT4gaXMgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+Ci0JICogdHlwZSAoZS5nLiB0aGUgSmF2YSBhdHRyaWJ1dGUncyBkZWZhdWx0IHRhYmxlIGlzIHRoZSB0YWJsZSBzZXQgaW4gdGhlCi0JICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdHlwZSwgbm90IHRoZSBKYXZhIHR5cGUpLgotCSAqIFRoZSB7QGxpbmsgI29yaWdpbmFsSmF2YUF0dHJpYnV0ZUxpc3RlbmVyfSBrZWVwcyB0aGlzIGF0dHJpYnV0ZSBpbiBzeW5jCi0JICogd2l0aCBhbnkgY2hhbmdlcyBtYWRlIHZpYSB0aGUgSmF2YSBjb250ZXh0IG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRKYXZhQXR0cmlidXRlOwotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgIm9yaWdpbmFsIiBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8KLQkgKiB7QGxpbmsgI2phdmFSZXNvdXJjZUF0dHJpYnV0ZX0gZnJvbSB0aGUgSmF2YSBjb250ZXh0IG1vZGVsLgotCSAqIElmIGl0IGlzIGZvdW5kIChpdCBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+Ci0JICogYWNjZXNzIHR5cGUgZGlmZmVycyBmcm9tIHRoZSBKYXZhIGFjY2VzcyB0eXBlKSwgd2UgbmVlZCB0byBsaXN0ZW4gdG8gaXQKLQkgKiBmb3IgY2hhbmdlcyBzbyB3ZSBjYW4gcmVmcmVzaCBvdXIgImxvY2FsIiBKYXZhIGF0dHJpYnV0ZXMgKHNpbmNlIHRoZQotCSAqIEphdmEgcmVzb3VyY2UgbW9kZWwgZG9lcyBub3QgZmlyZSBjaGFuZ2UgZXZlbnRzLCBhbmQgdHJpZ2dlciBhCi0JICogPGVtPnN5bmM8L2VtPiwgd2hlbiBpdCBpcyBtb2RpZmllZCBieSB0aGUgSmF2YSBjb250ZXh0IG1vZGVsIC0gaWYgdGhlcmUKLQkgKiBpcyBubyBKYXZhIGNvbnRleHQgYXR0cmlidXRlLCB0aGUgSmF2YSByZXNvdXJjZSBtb2RlbCBjYW4gb25seSBiZQotCSAqIG1vZGlmaWVkIHZpYSBzb3VyY2UgY29kZSBlZGl0aW5nIGFuZCB3ZSB3aWxsIDxlbT5zeW5jPC9lbT4gYXBwcm9wcmlhdGVseSkuCi0JICovCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG9yaWdpbmFsSmF2YUF0dHJpYnV0ZTsKLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBvcmlnaW5hbEphdmFBdHRyaWJ1dGVMaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBzaW11bGF0ZWQgInVuYW5ub3RhdGVkIiBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlLiBJdCBpcyBidWlsdAotCSAqIG9ubHkgaWYgbmVjZXNzYXJ5IChpLmUuIHdoZW4gdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+IHBlcnNpc3RlbnQgdHlwZQotCSAqIGhhcyBiZWVuIHRhZ2dlZCA8ZW0+bWV0YWRhdGEgY29tcGxldGU8L2VtPikuIExpa2UKLQkgKiB7QGxpbmsgI2Fubm90YXRlZEphdmFBdHRyaWJ1dGV9LCBpdHMgcGFyZW50IGlzIGFuCi0JICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlLgotCSAqIFRoZSB7QGxpbmsgI29yaWdpbmFsSmF2YUF0dHJpYnV0ZUxpc3RlbmVyfSBrZWVwcyB0aGlzIGF0dHJpYnV0ZSBpbiBzeW5jCi0JICogd2l0aCBhbnkgY2hhbmdlcyBtYWRlIHZpYSB0aGUgSmF2YSBjb250ZXh0IG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSB1bmFubm90YXRlZEphdmFBdHRyaWJ1dGU7Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZzsgIC8vIG5ldmVyIG51bGwKLQotCi0JcHVibGljIFZpcnR1YWxPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmphdmFBY2Nlc3NvciA9IG5ldyBGaWVsZEFjY2Vzc29yKHRoaXMsIHJlc291cmNlRmllbGQpOwotCQl0aGlzLmFubm90YXRlZEphdmFBdHRyaWJ1dGUgPSB0aGlzLmJ1aWxkQW5ub3RhdGVkSmF2YUF0dHJpYnV0ZSgpOwotCQl0aGlzLm1hcHBpbmcgPSB0aGlzLmJ1aWxkTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBWaXJ0dWFsT3JtUGVyc2lzdGVudEF0dHJpYnV0ZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUdldHRlciwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuamF2YUFjY2Vzc29yID0gbmV3IFByb3BlcnR5QWNjZXNzb3IodGhpcywgcmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyKTsKLQkJdGhpcy5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlID0gdGhpcy5idWlsZEFubm90YXRlZEphdmFBdHRyaWJ1dGUoKTsKLQkJdGhpcy5tYXBwaW5nID0gdGhpcy5idWlsZE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBBY2Nlc3NvciBqYXZhQWNjZXNzb3IpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qYXZhQWNjZXNzb3IgPSBqYXZhQWNjZXNzb3I7Ci0JCXRoaXMuYW5ub3RhdGVkSmF2YUF0dHJpYnV0ZSA9IHRoaXMuYnVpbGRBbm5vdGF0ZWRKYXZhQXR0cmlidXRlKCk7Ci0JCXRoaXMubWFwcGluZyA9IHRoaXMuYnVpbGRNYXBwaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY0xvY2FsSmF2YUF0dHJpYnV0ZXMoKTsKLQkJLy8gJ21hcHBpbmcnIGJlbG9uZ3MgdG8gb25lIG9mIHRoZSAibG9jYWwiIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGVzCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVPcmlnaW5hbEphdmFBdHRyaWJ1dGUoKTsKLQkJdGhpcy51cGRhdGVMb2NhbEphdmFBdHRyaWJ1dGVzKCk7Ci0JCXRoaXMuc2V0TWFwcGluZyh0aGlzLmJ1aWxkTWFwcGluZygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBwaW5nKEphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgb2xkID0gdGhpcy5tYXBwaW5nOwotCQl0aGlzLm1hcHBpbmcgPSBtYXBwaW5nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9NQVBQSU5HX0tFWV9QUk9QRVJUWSwgb2xkLCBtYXBwaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0S2V5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZy5nZXRLZXkoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duaW5nVHlwZU1hcHBpbmcoKS5pc01ldGFkYXRhQ29tcGxldGUoKSA/Ci0JCQkJdGhpcy5nZXRVbmFubm90YXRlZEphdmFBdHRyaWJ1dGUoKSA6Ci0JCQkJdGhpcy5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhVHlwZSA9IHRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJcmV0dXJuIChqYXZhVHlwZSA9PSBudWxsKSA/IG51bGwgOiBqYXZhVHlwZS5nZXRBdHRyaWJ1dGVGb3IodGhpcy5nZXRKYXZhUmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wIGdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKCkgewotCQlyZXR1cm4gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGJ1aWxkQW5ub3RhdGVkSmF2YUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGJ1aWxkSmF2YUF0dHJpYnV0ZSh0aGlzLmphdmFBY2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFVuYW5ub3RhdGVkSmF2YUF0dHJpYnV0ZSgpIHsKLQkJaWYgKHRoaXMudW5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlID09IG51bGwpIHsKLQkJCXRoaXMudW5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlID0gdGhpcy5idWlsZFVuYW5ub3RhdGVkSmF2YUF0dHJpYnV0ZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnVuYW5ub3RhdGVkSmF2YUF0dHJpYnV0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRVbmFubm90YXRlZEphdmFBdHRyaWJ1dGUoKSB7Ci0JCS8vIHBhc3MgaW4gdGhlIG9ybSBwZXJzaXN0ZW50IHR5cGUgYXMgdGhlIHBhcmVudC4uLgotCQlyZXR1cm4gdGhpcy5qYXZhQWNjZXNzb3IuYnVpbGRVbmFubm90YXRlZEphdmFBdHRyaWJ1dGUodGhpcy5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYnVpbGRKYXZhQXR0cmlidXRlKEFjY2Vzc29yIGFjY2Vzc29yKSB7Ci0JCS8vIHBhc3MgaW4gdGhlIG9ybSBwZXJzaXN0ZW50IHR5cGUgYXMgdGhlIHBhcmVudC4uLgotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSh0aGlzLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCksIGFjY2Vzc29yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jTG9jYWxKYXZhQXR0cmlidXRlcygpIHsKLQkJdGhpcy5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJaWYgKHRoaXMudW5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXRoaXMudW5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUxvY2FsSmF2YUF0dHJpYnV0ZXMoKSB7Ci0JCXRoaXMuYW5ub3RhdGVkSmF2YUF0dHJpYnV0ZS51cGRhdGUoKTsKLQkJaWYgKHRoaXMudW5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXRoaXMudW5hbm5vdGF0ZWRKYXZhQXR0cmlidXRlLnVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIEFjY2Vzc29yIGdldEphdmFBY2Nlc3NvcigpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFjY2Vzc29yOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0SmF2YVJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQWNjZXNzb3IuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihKYXZhUmVzb3VyY2VGaWVsZCBqYXZhUmVzb3VyY2VGaWVsZCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQWNjZXNzb3IuaXNGb3IoamF2YVJlc291cmNlRmllbGQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKEphdmFSZXNvdXJjZU1ldGhvZCBqYXZhUmVzb3VyY2VHZXR0ZXIsIEphdmFSZXNvdXJjZU1ldGhvZCBqYXZhUmVzb3VyY2VTZXR0ZXIpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFjY2Vzc29yLmlzRm9yKGphdmFSZXNvdXJjZUdldHRlciwgamF2YVJlc291cmNlU2V0dGVyKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG9yaWdpbmFsIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlT3JpZ2luYWxKYXZhQXR0cmlidXRlKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdKYXZhQXR0cmlidXRlID0gdGhpcy5yZXNvbHZlSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJaWYgKG5ld0phdmFBdHRyaWJ1dGUgIT0gdGhpcy5vcmlnaW5hbEphdmFBdHRyaWJ1dGUpIHsKLQkJCWlmIChuZXdKYXZhQXR0cmlidXRlID09IG51bGwpIHsKLQkJCQl0aGlzLm9yaWdpbmFsSmF2YUF0dHJpYnV0ZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuZ2V0T3JpZ2luYWxKYXZhQXR0cmlidXRlTGlzdGVuZXIoKSk7Ci0JCQkJdGhpcy5vcmlnaW5hbEphdmFBdHRyaWJ1dGUgPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodGhpcy5vcmlnaW5hbEphdmFBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQl0aGlzLm9yaWdpbmFsSmF2YUF0dHJpYnV0ZS5yZW1vdmVTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuZ2V0T3JpZ2luYWxKYXZhQXR0cmlidXRlTGlzdGVuZXIoKSk7Ci0JCQkJfQotCQkJCXRoaXMub3JpZ2luYWxKYXZhQXR0cmlidXRlID0gbmV3SmF2YUF0dHJpYnV0ZTsKLQkJCQl0aGlzLm9yaWdpbmFsSmF2YUF0dHJpYnV0ZS5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuZ2V0T3JpZ2luYWxKYXZhQXR0cmlidXRlTGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RhdGVDaGFuZ2VMaXN0ZW5lciBnZXRPcmlnaW5hbEphdmFBdHRyaWJ1dGVMaXN0ZW5lcigpIHsKLQkJaWYgKHRoaXMub3JpZ2luYWxKYXZhQXR0cmlidXRlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJdGhpcy5vcmlnaW5hbEphdmFBdHRyaWJ1dGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRPcmlnaW5hbEphdmFBdHRyaWJ1dGVMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLm9yaWdpbmFsSmF2YUF0dHJpYnV0ZUxpc3RlbmVyOwotCX0KLQotCXByb3RlY3RlZCBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkT3JpZ2luYWxKYXZhQXR0cmlidXRlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdlZChTdGF0ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUudGhpcy5vcmlnaW5hbEphdmFBdHRyaWJ1dGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlICJvcmlnaW5hbCIgSmF2YSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSAob3IgYW55IG9mIGl0cyBwYXJ0cykgY2hhbmdlcwotCSAqIHdlIG5lZWQgdG8gc3luYyBvdXIgImxvY2FsIiBKYXZhIHBlcnNpc3RlbnQgYXR0cmlidXRlcyB3aXRoIGFueSBwb3NzaWJsZQotCSAqIGNoYW5nZXMgdG8gdGhlIEphdmEgcmVzb3VyY2UgbW9kZWwuIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciB3aGVuIHRoZSBKYXZhCi0JICogY29udGV4dCBtb2RlbCBpcyBtb2RpZnlpbmcgdGhlIEphdmEgcmVzb3VyY2UgbW9kZWwsIGJ1dCBpcyByZWR1bmRhbnQgd2hlbgotCSAqIHRoZSBKYXZhIHJlc291cmNlIG1vZGVsIGlzIHRyaWdnZXJpbmcgYSA8ZW0+c3luYzwvZW0+LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9yaWdpbmFsSmF2YUF0dHJpYnV0ZUNoYW5nZWQoKSB7Ci0JCXRoaXMuc3luY0xvY2FsSmF2YUF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYWNjZXNzICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldEFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkL2RlZmF1bHQgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnZlcnRUb1ZpcnR1YWwoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnZlcnRUb1NwZWNpZmllZCgpIHsKLQkJaWYgKHRoaXMubWFwcGluZy5nZXRLZXkoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJVc2UgY29udmVydFRvU3BlY2lmaWVkKFN0cmluZykgaW5zdGVhZCBhbmQgc3BlY2lmeSBhIG1hcHBpbmcgdHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5jb252ZXJ0QXR0cmlidXRlVG9TcGVjaWZpZWQodGhpcyk7Ci0JfQotCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udmVydFRvU3BlY2lmaWVkKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuY29udmVydEF0dHJpYnV0ZVRvU3BlY2lmaWVkKHRoaXMsIG1hcHBpbmdLZXkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBPcm1TdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JRDsKLQl9Ci0KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5vcmlnaW5hbEphdmFBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJdGhpcy5vcmlnaW5hbEphdmFBdHRyaWJ1dGUucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLmdldE9yaWdpbmFsSmF2YUF0dHJpYnV0ZUxpc3RlbmVyKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyB0aGUgSmF2YSBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBuZWVkIGFuIEFTVCBmb3IgdmFsaWRhdGlvbiBmcm9tIGhlcmUKLQkJdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25pbmdUeXBlTWFwcGluZygpLmdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAoKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZFR5cGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCgpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCgpLmdldE1ldGFtb2RlbFR5cGVOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1QZXJzaXN0ZW50VHlwZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVBlcnNpc3RlbnRUeXBlIGdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVHlwZU1hcHBpbmcgZ2V0T3duaW5nVHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmcuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RKYXJGaWxlUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0SmFyRmlsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzhmMzY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RKYXJGaWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlCi0gKiA8YnI+Ci0gKiA8Y29kZT5qYXItZmlsZTwvY29kZT4gZWxlbWVudAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXJGaWxlUmVmCi0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphckZpbGVSZWYKLXsKLQlwcm90ZWN0ZWQgZmluYWwgWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmOwotCi0JcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZTsKLQotCS8qKgotCSAqIHRoZSBqYXIgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWYncyBmaWxlIG5hbWU7Ci0JICogdGhpcyBjYW4gYmUgbnVsbCBpZiB0aGUgbmFtZSBpcyBpbnZhbGlkCi0JICovCi0JcHJvdGVjdGVkIEphckZpbGUgamFyRmlsZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24vaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFic3RyYWN0SmFyRmlsZVJlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxKYXJGaWxlUmVmIHhtbEphckZpbGVSZWYpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxKYXJGaWxlUmVmID0geG1sSmFyRmlsZVJlZjsKLQkJdGhpcy5maWxlTmFtZSA9IHhtbEphckZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKLQkJdGhpcy5qYXJGaWxlID0gdGhpcy5idWlsZEphckZpbGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRGaWxlTmFtZV8odGhpcy54bWxKYXJGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCQl0aGlzLnN5bmNKYXJGaWxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVKYXJGaWxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuSkFSX0ZJTEVfUkVGX0lEOwotCX0KLQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFN0cnVjdHVyZU5vZGUoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiAodGhpcy54bWxKYXJGaWxlUmVmID09IG51bGwpID8gbnVsbCA6IHRoaXMueG1sSmFyRmlsZVJlZi5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5qYXJGaWxlICE9IG51bGwpIHsKLQkJCXRoaXMuamFyRmlsZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmlsZSBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmZpbGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQl0aGlzLnNldEZpbGVOYW1lXyhmaWxlTmFtZSk7Ci0JCXRoaXMueG1sSmFyRmlsZVJlZi5zZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogV2UgY2xlYXIgb3V0IHtAbGluayAjamFyRmlsZX0gaGVyZSBiZWNhdXNlIHdlIGNhbm5vdCBjb21wYXJlIGl0cyBmaWxlCi0JICogbmFtZSB0byB0aGUgcmVmJ3MgZmlsZSBuYW1lLCBzaW5jZSBpdCBtYXkgaGF2ZSBiZWVuIG11bmdlZCAoc2VlCi0JICoge0BsaW5rICNyZXNvbHZlSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdF8oKX0pLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEZpbGVOYW1lXyhTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZmlsZU5hbWU7Ci0JCXRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJaWYgKHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgZmlsZU5hbWUpKSB7Ci0JCQkvLyBjbGVhciBvdXQgdGhlIGphciBmaWxlIGhlcmUsIGl0IHdpbGwgYmUgcmVidWlsdCBkdXJpbmcgInVwZGF0ZSIKLQkJCWlmICh0aGlzLmphckZpbGUgIT0gbnVsbCkgewotCQkJCXRoaXMuamFyRmlsZS5kaXNwb3NlKCk7Ci0JCQkJdGhpcy5zZXRKYXJGaWxlKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGphciBmaWxlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXJGaWxlIGdldEphckZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmphckZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SmFyRmlsZShKYXJGaWxlIGphckZpbGUpIHsKLQkJSmFyRmlsZSBvbGQgPSB0aGlzLmphckZpbGU7Ci0JCXRoaXMuamFyRmlsZSA9IGphckZpbGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKQVJfRklMRV9QUk9QRVJUWSwgb2xkLCBqYXJGaWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmFyRmlsZSBidWlsZEphckZpbGUoKSB7Ci0JCUphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QganJwZnIgPSB0aGlzLnJlc29sdmVKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KCk7Ci0JCXJldHVybiAoanJwZnIgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEphckZpbGUoanJwZnIpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBmaWxlIG5hbWUgY2hhbmdlcyBkdXJpbmcgPGVtPnN5bmM8L2VtPiwgdGhlIGphciBmaWxlIHdpbGwgYmUKLQkgKiBjbGVhcmVkIG91dCBpbiB7QGxpbmsgI3NldEZpbGVOYW1lXyhTdHJpbmcpfS4gSWYgd2UgZ2V0IGhlcmUgYW5kIHRoZSBqYXIKLQkgKiBmaWxlIGlzIHN0aWxsIHByZXNlbnQsIHdlIGNhbiA8Y29kZT5zeW5jPC9jb2RlPiBpdC4gT2YgY291cnNlLCBpdCBtaWdodAotCSAqIHN0aWxsIGJlIG9ic29sZXRlIGlmIG90aGVyIHRoaW5ncyBoYXZlIGNoYW5nZWQuLi4uCi0JICogCi0JICogQHNlZSAjdXBkYXRlSmFyRmlsZSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY0phckZpbGUoKSB7Ci0JCWlmICh0aGlzLmphckZpbGUgIT0gbnVsbCkgewotCQkJdGhpcy5qYXJGaWxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgI3N5bmNKYXJGaWxlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKYXJGaWxlKCkgewotCQlKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGpycGZyID0gdGhpcy5yZXNvbHZlSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCgpOwotCQlpZiAoanJwZnIgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuamFyRmlsZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5qYXJGaWxlLmRpc3Bvc2UoKTsKLQkJCQl0aGlzLnNldEphckZpbGUobnVsbCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAodGhpcy5qYXJGaWxlID09IG51bGwpIHsKLQkJCQl0aGlzLnNldEphckZpbGUodGhpcy5idWlsZEphckZpbGUoanJwZnIpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMuamFyRmlsZS5nZXRKYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QoKSA9PSBqcnBmcikgewotCQkJCQl0aGlzLmphckZpbGUudXBkYXRlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5qYXJGaWxlLmRpc3Bvc2UoKTsKLQkJCQkJdGhpcy5zZXRKYXJGaWxlKHRoaXMuYnVpbGRKYXJGaWxlKGpycGZyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgcmVzb2x2ZUphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZmlsZU5hbWUpID8gbnVsbCA6IHRoaXMucmVzb2x2ZUphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3RfKCk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ2ZpbGVOYW1lJyBpcyBuZWl0aGVyIG51bGwgbm9yIGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgcmVzb2x2ZUphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3RfKCkgewotCQkvLyBmaXJzdCwgYXR0ZW1wdCB0byByZXNvbHZlIGxvY2F0aW9uIHNwZWNpZmljYWxseS4uLgotCQlKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGpycGZyID0gdGhpcy5yZXNvbHZlSnJwZnJPbkRlcGxveW1lbnRQYXRoKCk7Ci0JCS8vIC4uLnRoZW4gZ3Vlc3MsIGJhc2ljYWxseQotCQlyZXR1cm4gKGpycGZyICE9IG51bGwpID8ganJwZnIgOiB0aGlzLnJlc29sdmVKcnBmckJlc3RNYXRjaCgpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICdmaWxlTmFtZScgaXMgbmVpdGhlciBudWxsIG5vciBlbXB0eQotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IHJlc29sdmVKcnBmck9uRGVwbG95bWVudFBhdGgoKSB7Ci0JCWZvciAoSVBhdGggcnVudGltZVBhdGggOiB0aGlzLmJ1aWxkUnVudGltZUphckZpbGVQYXRoKG5ldyBQYXRoKHRoaXMuZmlsZU5hbWUpKSkgewotCQkJSVZpcnR1YWxGaWxlIHZpcnR1YWxKYXIgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUZpbGUodGhpcy5nZXRQcm9qZWN0KCksIHJ1bnRpbWVQYXRoKTsKLQkJCUlGaWxlIHJlYWxKYXIgPSB2aXJ0dWFsSmFyLmdldFVuZGVybHlpbmdGaWxlKCk7Ci0JCQlpZiAocmVhbEphci5leGlzdHMoKSAmJiByZWFsSmFyLmdldFByb2plY3QoKS5lcXVhbHModGhpcy5nZXRQcm9qZWN0KCkpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QocmVhbEphci5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIHJ1bnRpbWUgcGF0aHMgdGhhdCBtYXkgY29ycmVzcG9uZAotCSAqIHRvIHRoZSBnaXZlbiBwZXJzaXN0ZW5jZS54bWwgamFyIGZpbGUgZW50cnkKLQkgKi8KLQlwcm90ZWN0ZWQgSVBhdGhbXSBidWlsZFJ1bnRpbWVKYXJGaWxlUGF0aChJUGF0aCBqYXJGaWxlUGF0aCkgewotCQlJUGF0aCByb290ID0gdGhpcy5nZXRKYXJSdW50aW1lUm9vdFBhdGgoKTsKLQkJcmV0dXJuIHRoaXMucHJvamVjdEhhc1dlYkZhY2V0KCkgPwotCQkJCXRoaXMuYnVpbGRSdW50aW1lSmFyRmlsZVBhdGhXZWIocm9vdCwgamFyRmlsZVBhdGgpIDoKLQkJCQl0aGlzLmJ1aWxkUnVudGltZUphckZpbGVQYXRoTm9uV2ViKHJvb3QsIGphckZpbGVQYXRoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGggZ2V0SmFyUnVudGltZVJvb3RQYXRoKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5nZXRKYXJSdW50aW1lUm9vdFBhdGgodGhpcy5nZXRQcm9qZWN0KCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByb2plY3RIYXNXZWJGYWNldCgpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4ucHJvamVjdEhhc1dlYkZhY2V0KHRoaXMuZ2V0UHJvamVjdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhdGhbXSBidWlsZFJ1bnRpbWVKYXJGaWxlUGF0aFdlYihJUGF0aCByb290LCBJUGF0aCBqYXJGaWxlUGF0aCkgewotCQlyZXR1cm4gbmV3IElQYXRoW10gewotCQkJCS8vIGZpcnN0IHBhdGggZW50cnkgYXNzdW1lcyBmb3JtICIuLi9saWIvb3RoZXIuamFyIgotCQkJCXJvb3QuYXBwZW5kKGphckZpbGVQYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMSkpLAotCQkJCS8vIHNlY29uZCBwYXRoIGVudHJ5IGFzc3VtZXMgZm9ybSBvZiBmaXJzdCwgd2l0aG91dCAiLi4iICgibGliL290aGVyLmphciIpCi0JCQkJcm9vdC5hcHBlbmQoamFyRmlsZVBhdGgpCi0JCQl9OwotCX0KLQotCXByb3RlY3RlZCBJUGF0aFtdIGJ1aWxkUnVudGltZUphckZpbGVQYXRoTm9uV2ViKElQYXRoIHJvb3QsIElQYXRoIGphckZpbGVQYXRoKSB7Ci0JCXJldHVybiBuZXcgSVBhdGhbXSB7Ci0JCQkJLy8gYXNzdW1lcyBmb3JtICIuLi9saWIvb3RoZXIuamFyIgotCQkJCXJvb3QuYXBwZW5kKGphckZpbGVQYXRoKQotCQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAnZmlsZU5hbWUnIGlzIG5laXRoZXIgbnVsbCBub3IgZW1wdHkKLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCByZXNvbHZlSnJwZnJCZXN0TWF0Y2goKSB7Ci0JCVN0cmluZyBqYXJGaWxlTmFtZSA9IG5ldyBQYXRoKHRoaXMuZmlsZU5hbWUpLmxhc3RTZWdtZW50KCk7Ci0JCWZvciAoSnBhRmlsZSBqcGFGaWxlIDogdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmFySnBhRmlsZXMoKSkgewotCQkJaWYgKGpwYUZpbGUuZ2V0RmlsZSgpLmdldE5hbWUoKS5lcXVhbHMoamFyRmlsZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIChKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KSBqcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAnanJwZnInIGlzIG5vdCBudWxsCi0JICovCi0JcHJvdGVjdGVkIEphckZpbGUgYnVpbGRKYXJGaWxlKEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QganJwZnIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRKYXJGaWxlKHRoaXMsIGpycGZyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmFyRmlsZVJlZiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgWG1sSmFyRmlsZVJlZiBnZXRYbWxKYXJGaWxlUmVmKCkgewotCQlyZXR1cm4gdGhpcy54bWxKYXJGaWxlUmVmOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLmphckZpbGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5qYXJGaWxlLmdldFBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gKHRoaXMueG1sSmFyRmlsZVJlZiAhPSBudWxsKSAmJiB0aGlzLnhtbEphckZpbGVSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IGdldFBlcnNpc3RlbnRUeXBlcygpIHsKLQkJcmV0dXJuICh0aGlzLmphckZpbGUgIT0gbnVsbCkgPyB0aGlzLmphckZpbGUuZ2V0UGVyc2lzdGVudFR5cGVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxKYXZhUGVyc2lzdGVudFR5cGU+aW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWG1sQ29udGV4dE5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxKYXJGaWxlUmVmVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxKYXJGaWxlUmVmVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gKHRoaXMueG1sSmFyRmlsZVJlZiA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnhtbEphckZpbGVSZWYuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlcGxhY2VGb2xkZXJFZGl0cyhJRm9sZGVyIG9yaWdpbmFsRm9sZGVyLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc0luKG9yaWdpbmFsRm9sZGVyKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZXBsYWNlRm9sZGVyRWRpdChvcmlnaW5hbEZvbGRlciwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZXBsYWNlRm9sZGVyRWRpdChJRm9sZGVyIG9yaWdpbmFsRm9sZGVyLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxKYXJGaWxlUmVmLmNyZWF0ZVJlcGxhY2VGb2xkZXJFZGl0KG9yaWdpbmFsRm9sZGVyLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luKElGb2xkZXIgZm9sZGVyKSB7Ci0JCXJldHVybiAodGhpcy5qYXJGaWxlICE9IG51bGwpICYmIHRoaXMuamFyRmlsZS5pc0luKGZvbGRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCi0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMueG1sSmFyRmlsZVJlZi5nZXRGaWxlTmFtZSgpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9KQVJfRklMRSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJbWVzc2FnZXMuYWRkKAotCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HLAotCQkJCXRoaXMsCi0JCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCSkKLQkJKTsKLQotCQlpZiAodGhpcy5qYXJGaWxlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfSkFSX0ZJTEUsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy54bWxKYXJGaWxlUmVmLmdldEZpbGVOYW1lKCl9LAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLmphckZpbGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCh0aGlzLmZpbGVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RNYXBwaW5nRmlsZVJlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdE1hcHBpbmdGaWxlUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0MGI2NTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdE1hcHBpbmdGaWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlCi0gKiA8YnI+Ci0gKiA8Y29kZT5tYXBwaW5nLWZpbGU8L2NvZGU+IGVsZW1lbnQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwcGluZ0ZpbGVSZWYKLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgTWFwcGluZ0ZpbGVSZWYKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZpbGVOYW1lOwotCi0JLyoqCi0JICogVGhlIG1hcHBpbmcgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWYncyBmaWxlIG5hbWUuCi0JICogVGhpcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIG5hbWUgaXMgaW52YWxpZC4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgbWFwcGluZ0ZpbGU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBmaWxlTmFtZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7Ci0JCXRoaXMubWFwcGluZ0ZpbGUgPSB0aGlzLmJ1aWxkTWFwcGluZ0ZpbGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jTWFwcGluZ0ZpbGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU1hcHBpbmdGaWxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZpbGUgbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5maWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiAodGhpcy5tYXBwaW5nRmlsZSAhPSBudWxsKSAmJiBmaWxlLmVxdWFscyh0aGlzLm1hcHBpbmdGaWxlLmdldFhtbFJlc291cmNlKCkuZ2V0RmlsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luKElGb2xkZXIgZm9sZGVyKSB7Ci0JCXJldHVybiAodGhpcy5tYXBwaW5nRmlsZSAhPSBudWxsKSAmJiB0aGlzLm1hcHBpbmdGaWxlLmlzSW4oZm9sZGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwcGluZyBmaWxlICoqKioqKioqKioKLQotCXB1YmxpYyBNYXBwaW5nRmlsZSBnZXRNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGluZ0ZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGluZ0ZpbGUoTWFwcGluZ0ZpbGUgbWFwcGluZ0ZpbGUpIHsKLQkJTWFwcGluZ0ZpbGUgb2xkID0gdGhpcy5tYXBwaW5nRmlsZTsKLQkJdGhpcy5tYXBwaW5nRmlsZSA9IG1hcHBpbmdGaWxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUElOR19GSUxFX1BST1BFUlRZLCBvbGQsIG1hcHBpbmdGaWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgYnVpbGRNYXBwaW5nRmlsZSgpIHsKLQkJSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSB0aGlzLnJlc29sdmVNYXBwaW5nRmlsZVhtbFJlc291cmNlKCk7Ci0JCXJldHVybiAoeG1sUmVzb3VyY2UgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZE1hcHBpbmdGaWxlKHhtbFJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jTWFwcGluZ0ZpbGUoKSB7Ci0JCXRoaXMuc3luY01hcHBpbmdGaWxlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIFdlIGNhbGwgdGhpcyBtZXRob2QgZnJvbSBib3RoIHtAbGluayAjc3luY01hcHBpbmdGaWxlKCl9IGFuZAotCSAqIHtAbGluayAjdXBkYXRlTWFwcGluZ0ZpbGUoKX0gYmVjYXVzZTx1bD4KLQkgKiA8bGk+YSA8ZW0+c3luYzwvZW0+IHdpbGwgb2NjdXIgd2hlbiB0aGUgZmlsZSBpcyBlZGl0ZWQgZGlyZWN0bHk7Ci0JICogICAgIGFuZCB0aGUgdXNlciBjb3VsZCBtb2RpZnkgc29tZXRoaW5nIChlLmcuIHRoZSB2ZXJzaW9uIG51bWJlcikgdGhhdAotCSAqICAgICB0cmlnZ2VycyB0aGUgZmlsZSBiZWluZyAicmVzb2x2ZWQiIG9yIG5vdDsKLQkgKiAgICAgc2VlIHtAbGluayAjcmVzb2x2ZU1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoKX0KLQkgKiA8bGk+YW4gPGVtPnVwZGF0ZTwvZW0+IHdpbGwgb2NjdXIgd2hlbmV2ZXIgdGhlIGVudGlyZSBmaWxlIGlzIGFkZGVkIG9yCi0JICogICAgIHJlbW92ZWQKLQkgKiA8L3VsPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNNYXBwaW5nRmlsZShib29sZWFuIHN5bmMpIHsKLQkJSnBhWG1sUmVzb3VyY2UgbmV3WG1sUmVzb3VyY2UgPSB0aGlzLnJlc29sdmVNYXBwaW5nRmlsZVhtbFJlc291cmNlKCk7Ci0JCWlmIChuZXdYbWxSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5tYXBwaW5nRmlsZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5tYXBwaW5nRmlsZS5kaXNwb3NlKCk7Ci0JCQkJdGhpcy5zZXRNYXBwaW5nRmlsZShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLm1hcHBpbmdGaWxlID09IG51bGwpIHsKLQkJCQl0aGlzLnNldE1hcHBpbmdGaWxlKHRoaXMuYnVpbGRNYXBwaW5nRmlsZShuZXdYbWxSZXNvdXJjZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAodGhpcy5tYXBwaW5nRmlsZS5nZXRYbWxSZXNvdXJjZSgpID09IG5ld1htbFJlc291cmNlKSB7Ci0JCQkJCWlmIChzeW5jKSB7Ci0JCQkJCQl0aGlzLm1hcHBpbmdGaWxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXRoaXMubWFwcGluZ0ZpbGUudXBkYXRlKCk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyBbc2VlbXMgbGlrZSB3ZSBzaG91bGQgbmV2ZXIgZ2V0IGhlcmU7IHNpbmNlIGlmIHRoZSBmaWxlJ3MKLQkJCQkJLy8gY29udGVudCB0eXBlIGNoYW5nZWQsIHRoZSBKUEEgcHJvamVjdCB3b3VsZCByZXR1cm4gbnVsbC4uLiAgfmJqdl0KLQkJCQkJLy8gaWYgdGhlIHJlc291cmNlJ3MgY29udGVudCB0eXBlIGhhcyBjaGFuZ2VkLCB3ZSBjb21wbGV0ZWx5IHJlYnVpbGQgdGhlIG1hcHBpbmcgZmlsZQotCQkJCQl0aGlzLm1hcHBpbmdGaWxlLmRpc3Bvc2UoKTsKLQkJCQkJdGhpcy5zZXRNYXBwaW5nRmlsZSh0aGlzLmJ1aWxkTWFwcGluZ0ZpbGUobmV3WG1sUmVzb3VyY2UpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWFwcGluZyBmaWxlIHJlZiByZXNvdXJjZSBpcyBpbiB0aGUgcGVyc2lzdGVuY2UgeG1sIHJlc291cmNlCi0JICogKDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4pLiBUaGlzIHJldHVybnMgdGhlIHJlc291cmNlIG9mCi0JICogdGhlIG1hcHBpbmcgZmlsZSBpdHNlbGYgKDxjb2RlPm9ybS54bWw8L2NvZGU+KS4KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgcmVzb2x2ZU1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoKSB7Ci0JCWlmICh0aGlzLmZpbGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCh0aGlzLmZpbGVOYW1lKSk7Ci0JCWlmICh4bWxSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoeG1sUmVzb3VyY2UuaXNSZXZlcnRpbmcoKSkgewotCQkJLy8gMzA4MjU0IC0gdGhpcyBjYW4gaGFwcGVuIHdoZW4gb3JtLnhtbCBpcyBjbG9zZWQgd2l0aG91dCBzYXZpbmc7Ci0JCQkvLyB0aGUgbW9kZWwgaXMgY29tcGxldGVseSB3aGFja2VkIGluIGFub3RoZXIgdGhyZWFkIC0gc28gd2lwZSBvdXIgbW9kZWwoPykKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB4bWxSZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKTsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoICEgdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLnN1cHBvcnRzUmVzb3VyY2VUeXBlKHJlc291cmNlVHlwZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB4bWxSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiAneG1sUmVzb3VyY2UnIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBNYXBwaW5nRmlsZSBidWlsZE1hcHBpbmdGaWxlKEpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZE1hcHBpbmdGaWxlKHRoaXMsIHhtbFJlc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVNYXBwaW5nRmlsZSgpIHsKLQkJdGhpcy5zeW5jTWFwcGluZ0ZpbGUoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzLk1BUFBJTkdfRklMRV9SRUZfSUQ7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5tYXBwaW5nRmlsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcHBpbmdGaWxlLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzL2dlbmVyYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRNYXBwaW5nRmlsZVF1ZXJpZXMoKSB7Ci0JCXJldHVybiAodGhpcy5tYXBwaW5nRmlsZSAhPSBudWxsKSA/IHRoaXMubWFwcGluZ0ZpbGUuZ2V0TWFwcGluZ0ZpbGVRdWVyaWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxRdWVyeT5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldE1hcHBpbmdGaWxlR2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuICh0aGlzLm1hcHBpbmdGaWxlICE9IG51bGwpID8gdGhpcy5tYXBwaW5nRmlsZS5nZXRNYXBwaW5nRmlsZUdlbmVyYXRvcnMoKSA6IEVtcHR5SXRlcmFibGUuPEdlbmVyYXRvcj5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRXhpc3RzKCkgewotCQlNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIG1ldGFkYXRhID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlyZXR1cm4gKG1ldGFkYXRhICE9IG51bGwpICYmIG1ldGFkYXRhLnJlc291cmNlRXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7Ci0JCU1hcHBpbmdGaWxlUm9vdCByb290ID0gdGhpcy5nZXRDaGlsZE1hcHBpbmdGaWxlUm9vdCgpOwotCQlyZXR1cm4gKHJvb3QgPT0gbnVsbCkgPyBudWxsIDogcm9vdC5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBtZXRob2Qge0BsaW5rICNnZXRNYXBwaW5nRmlsZVJvb3QoKX0gaXMgYWxyZWFkeSBkZWZpbmVkIGJ5Ci0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0SnBhQ29udGV4dE5vZGV9Ci0JICogZm9yIGdldHRpbmcgd2hhdCB3b3VsZCBiZSB0aGUgIm1hcHBpbmcgZmlsZSByb290IiB0aGF0IDxlbT5jb250YWluczwvZW0+Ci0JICogdGhlIGNvbnRleHQgbm9kZS4gV2Ugd2FudCBzb21ldGhpbmcgc2xpZ2h0bHkgZGlmZmVyZW50IGhlcmU6IGkuZS4gdGhlCi0JICogIm1hcHBpbmcgZmlsZSByb290IiBjb250YWluZWQgYnkgdGhlIG1hcHBpbmcgZmlsZSByZWYgKHNpbmNlLCBhY3R1YWxseSwKLQkgKiB0aGUgbWFwcGluZyBmaWxlIHJlZiBpcyBub3QgZXZlbiBjb250YWluZWQgYnkgYSAibWFwcGluZyBmaWxlIHJvb3QiKS4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSb290IGdldENoaWxkTWFwcGluZ0ZpbGVSb290KCkgewotCQlyZXR1cm4gKHRoaXMubWFwcGluZ0ZpbGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5tYXBwaW5nRmlsZS5nZXRSb290KCk7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gKHRoaXMubWFwcGluZ0ZpbGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5tYXBwaW5nRmlsZS5nZXRQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKHRoaXMuZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IGdldFBlcnNpc3RlbnRUeXBlcygpIHsKLQkJcmV0dXJuICh0aGlzLm1hcHBpbmdGaWxlICE9IG51bGwpID8gdGhpcy5tYXBwaW5nRmlsZS5nZXRQZXJzaXN0ZW50VHlwZXMoKSA6IEVtcHR5SXRlcmFibGUuPEphdmFQZXJzaXN0ZW50VHlwZT5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmZpbGVOYW1lKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUsCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICh0aGlzLm1hcHBpbmdGaWxlID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkTWFwcGluZ0ZpbGVWYWxpZGF0aW9uTWVzc2FnZSgpKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMubWFwcGluZ0ZpbGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRNYXBwaW5nRmlsZVZhbGlkYXRpb25NZXNzYWdlKCkgewotCQlpbnQgc2V2ZXJpdHkgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQlJRmlsZSBmaWxlID0gdGhpcy5nZXRQbGF0Zm9ybUZpbGUoKTsKLQkJaWYgKCAhIGZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJc2V2ZXJpdHksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRSwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmZpbGVOYW1lfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkpOwotCQl9Ci0JCVN0cmluZyBtc2dUZXh0ID0gdGhpcy5tYXBwaW5nRmlsZUNvbnRlbnRJc1Vuc3VwcG9ydGVkKCkgPwotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNVUFBPUlRFRF9NQVBQSU5HX0ZJTEVfQ09OVEVOVCA6Ci0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFOwotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJc2V2ZXJpdHksCi0JCQkJbXNnVGV4dCwKLQkJCQluZXcgU3RyaW5nW10ge2ZpbGUuZ2V0TmFtZSgpfSwKLQkJCQlmaWxlCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQbGF0Zm9ybUZpbGUobmV3IFBhdGgodGhpcy5maWxlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHtAbGluayAjZ2V0UGxhdGZvcm1GaWxlKCl9IGV4aXN0cwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hcHBpbmdGaWxlQ29udGVudElzVW5zdXBwb3J0ZWQoKSB7Ci0JCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCh0aGlzLmZpbGVOYW1lKSk7Ci0JCXJldHVybiAoeG1sUmVzb3VyY2UgIT0gbnVsbCkgJiYgISB0aGlzLmdldEpwYVBsYXRmb3JtKCkuc3VwcG9ydHNSZXNvdXJjZVR5cGUoeG1sUmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8RGVsZXRlRWRpdD4gY3JlYXRlRGVsZXRlVHlwZUVkaXRzKElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuICh0aGlzLm1hcHBpbmdGaWxlICE9IG51bGwpID8KLQkJCQl0aGlzLm1hcHBpbmdGaWxlLmNyZWF0ZURlbGV0ZVR5cGVFZGl0cyh0eXBlKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48RGVsZXRlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuICh0aGlzLm1hcHBpbmdGaWxlICE9IG51bGwpID8KLQkJCQl0aGlzLm1hcHBpbmdGaWxlLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gKHRoaXMubWFwcGluZ0ZpbGUgIT0gbnVsbCkgPwotCQkJCXRoaXMubWFwcGluZ0ZpbGUuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gKHRoaXMubWFwcGluZ0ZpbGUgIT0gbnVsbCkgPwotCQkJCXRoaXMubWFwcGluZ0ZpbGUuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVNYXBwaW5nRmlsZUVkaXRzKElGaWxlIG9yaWdpbmFsRmlsZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3Iob3JpZ2luYWxGaWxlKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVFZGl0KG9yaWdpbmFsRmlsZSwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElGaWxlIG9yaWdpbmFsRmlsZSwgU3RyaW5nIG5ld05hbWUpOwotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlTWFwcGluZ0ZpbGVFZGl0cyhJRmlsZSBvcmlnaW5hbEZpbGUsIElQYXRoIHJ1bnRpbmVEZXN0aW5hdGlvbikgewotCQlyZXR1cm4gdGhpcy5pc0ZvcihvcmlnaW5hbEZpbGUpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZU1vdmVFZGl0KG9yaWdpbmFsRmlsZSwgcnVudGluZURlc3RpbmF0aW9uKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFJlcGxhY2VFZGl0IGNyZWF0ZU1vdmVFZGl0KElGaWxlIG9yaWdpbmFsRmlsZSwgSVBhdGggcnVudGluZURlc3RpbmF0aW9uKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiYWM0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VVbml0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LkJvZHlTb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vbkVtcHR5U3RyaW5nRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYU5hbWVkQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW50VHlwZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5KcGFGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLkpwYVByb2plY3QyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlBlcnNpc3RlbnRUeXBlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlZhbGlkYXRpb25Nb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlCi0gKiA8YnI+Ci0gKiA8Y29kZT5wZXJzaXN0ZW5jZS11bml0PC9jb2RlPiBlbGVtZW50Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdAotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVVuaXQyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdDsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZTsKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGRlZmF1bHRUcmFuc2FjdGlvblR5cGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCi0JcHJvdGVjdGVkIFN0cmluZyBwcm92aWRlcjsKLQotCXByb3RlY3RlZCBTdHJpbmcganRhRGF0YVNvdXJjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5vbkp0YURhdGFTb3VyY2U7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8TWFwcGluZ0ZpbGVSZWYsIFhtbE1hcHBpbmdGaWxlUmVmPiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgaW1wbGllZE1hcHBpbmdGaWxlUmVmOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEphckZpbGVSZWYsIFhtbEphckZpbGVSZWY+IGphckZpbGVSZWZDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8Q2xhc3NSZWYsIFhtbEphdmFDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dENvbGxlY3Rpb25Db250YWluZXI8Q2xhc3NSZWYsIFN0cmluZz4gaW1wbGllZENsYXNzUmVmQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPFByb3BlcnR5LCBYbWxQcm9wZXJ0eT4gcHJvcGVydHlDb250YWluZXI7Ci0KLQkvKiBnbG9iYWwgZ2VuZXJhdG9yIGRlZmluaXRpb25zLCBkZWZpbmVkIGVsc2V3aGVyZSBpbiBtb2RlbCAqLwotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8R2VuZXJhdG9yPiBnZW5lcmF0b3JzID0gbmV3IFZlY3RvcjxHZW5lcmF0b3I+KCk7Ci0KLQkvKiBnbG9iYWwgcXVlcnkgZGVmaW5pdGlvbnMsIGRlZmluZWQgZWxzZXdoZXJlIGluIG1vZGVsICovCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxRdWVyeT4gcXVlcmllcyA9IG5ldyBWZWN0b3I8UXVlcnk+KCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBkZWZhdWx0QWNjZXNzOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdENhdGFsb2c7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCXByb3RlY3RlZCBib29sZWFuIGRlZmF1bHRDYXNjYWRlUGVyc2lzdDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0RGVsaW1pdGVkSWRlbnRpZmllcnM7Ci0KLQkvLyoqKioqKiBKUEEgMi4wIGZlYXR1cmVzCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgY29ubmVjdGlvbjsKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBvcHRpb25zOwotCi0JcHJvdGVjdGVkIFNoYXJlZENhY2hlTW9kZSBzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGU7Ci0JcHJvdGVjdGVkIFNoYXJlZENhY2hlTW9kZSBkZWZhdWx0U2hhcmVkQ2FjaGVNb2RlOwotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25Nb2RlIHNwZWNpZmllZFZhbGlkYXRpb25Nb2RlOwotCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBkZWZhdWx0VmFsaWRhdGlvbk1vZGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgU2V0PElGaWxlPiBtZXRhbW9kZWxGaWxlcyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZFNldChuZXcgSGFzaFNldDxJRmlsZT4oKSk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIE5COiBCZSBjYXJlZnVsIGNoYW5naW5nIHRoZSBvcmRlciBvZiB0aGUgc3RhdGVtZW50cyBpbiB0aGlzIG1ldGhvZAotCSAqIChidWcgMjU4NzAxIGlzIG9uZSByZWFzb24pLgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZVVuaXQ7Ci0JCXRoaXMubmFtZSA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCk7Ci0JCXRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyA9IHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7Ci0JCXRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlID0gdGhpcy5idWlsZFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOwotCQl0aGlzLmRlc2NyaXB0aW9uID0geG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCk7Ci0JCXRoaXMucHJvdmlkZXIgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKTsKLQkJdGhpcy5qdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0geG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQotCQkvLyBpbml0aWFsaXplIHRoZSBwcm9wZXJ0aWVzIGVhcmx5IGJlY2F1c2Ugb3RoZXIgdGhpbmdzIHdpbGwgbmVlZCB0aGVtLi4uKD8pCi0JCXRoaXMucHJvcGVydHlDb250YWluZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDb250YWluZXIoKTsKLQkJdGhpcy5pbml0aWFsaXplUHJvcGVydGllcygpOwotCi0JCXRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZDb250YWluZXIgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZDb250YWluZXIoKTsKLQkJdGhpcy5qYXJGaWxlUmVmQ29udGFpbmVyID0gdGhpcy5idWlsZEphckZpbGVSZWZDb250YWluZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRDbGFzc1JlZkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDbGFzc1JlZkNvbnRhaW5lcigpOwotCQl0aGlzLmltcGxpZWRDbGFzc1JlZkNvbnRhaW5lciA9IHRoaXMuYnVpbGRJbXBsaWVkQ2xhc3NSZWZDb250YWluZXIoKTsKLQotCQl0aGlzLnNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZU1ldGFtb2RlbEZpbGVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0KLQkJdGhpcy5zZXROYW1lXyh0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXNfKHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uXyh0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJdGhpcy5zZXRQcm92aWRlcl8odGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCXRoaXMuc2V0SnRhRGF0YVNvdXJjZV8odGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJdGhpcy5zZXROb25KdGFEYXRhU291cmNlXyh0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCi0JCXRoaXMuc3luY1NwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwotCQl0aGlzLnN5bmNJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQotCQl0aGlzLnN5bmNKYXJGaWxlUmVmcygpOwotCi0JCXRoaXMuc3luY1NwZWNpZmllZENsYXNzUmVmcygpOwotCQl0aGlzLnN5bmNocm9uaXplTm9kZXNXaXRoUmVzb3VyY2VNb2RlbCh0aGlzLmdldEltcGxpZWRDbGFzc1JlZnMoKSk7Ci0KLQkJdGhpcy5zeW5jUHJvcGVydGllcygpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldERlZmF1bHRUcmFuc2FjdGlvblR5cGUodGhpcy5idWlsZERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKSk7Ci0KLQkJLy8gdXBkYXRlIHNwZWNpZmllZCBjbGFzcyByZWZzIGJlZm9yZSBtYXBwaW5nIGZpbGUgcmVmcyBiZWNhdXNlIG9mCi0JCS8vIEpwYUZpbGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgLSB3ZSB3YW50IHRoZSBtYXBwaW5nIGZpbGUgdG8gIndpbiIsCi0JCS8vIGFzIGl0IHdvdWxkIGluIGEgSlBBIHJ1bnRpbWUgaW1wbGVtZW50YXRpb24KLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZENsYXNzUmVmcygpKTsKLQotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpOwotCQl0aGlzLnVwZGF0ZUltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwotCi0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRKYXJGaWxlUmVmcygpKTsKLQotCQkvLyB1cGRhdGUgdGhlIGltcGxpZWQgY2xhc3MgcmVmcyBhZnRlciBhbGwgdGhlIG90aGVyIHR5cGVzLCBib3RoCi0JCS8vIHNwZWNpZmllZCBoZXJlIGFuZCBzcGVjaWZpZWQgaW4gdGhlIG1hcHBpbmcgZmlsZXMsIGFyZSBpbiBwbGFjZQotCQl0aGlzLnVwZGF0ZUltcGxpZWRDbGFzc1JlZnMoKTsKLQotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0UHJvcGVydGllcygpKTsKLQotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0KLQkJdGhpcy5zZXRHZW5lcmF0b3JzKHRoaXMuYnVpbGRHZW5lcmF0b3JzKCkpOwotCQl0aGlzLnNldFF1ZXJpZXModGhpcy5idWlsZFF1ZXJpZXMoKSk7Ci0KLQkJdGhpcy5zZXREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKHRoaXMuYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQl0aGlzLnNldERlZmF1bHRWYWxpZGF0aW9uTW9kZSh0aGlzLmJ1aWxkRGVmYXVsdFZhbGlkYXRpb25Nb2RlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFDb250ZXh0Tm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2UgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5DRV9VTklUX0lEOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IHRoaXMuZ2V0Q2xhc3NSZWZzKCkpIHsKLQkJCWNsYXNzUmVmLmRpc3Bvc2UoKTsKLQkJfQotCQlmb3IgKEphckZpbGVSZWYgamFyRmlsZVJlZiA6IHRoaXMuZ2V0SmFyRmlsZVJlZnMoKSkgewotCQkJamFyRmlsZVJlZi5kaXNwb3NlKCk7Ci0JCX0KLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IHRoaXMuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCW1hcHBpbmdGaWxlUmVmLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuc2V0TmFtZV8obmFtZSk7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zYWN0aW9uIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSA6IHRoaXMuZGVmYXVsdFRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdHJhbnNhY3Rpb25UeXBlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlXyh0cmFuc2FjdGlvblR5cGUpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLnRvWG1sUmVzb3VyY2VNb2RlbCh0cmFuc2FjdGlvblR5cGUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGVfKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB0cmFuc2FjdGlvblR5cGUpIHsKLQkJUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlOwotCQl0aGlzLnNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSA9IHRyYW5zYWN0aW9uVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLCBvbGQsIHRyYW5zYWN0aW9uVHlwZSk7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VHJhbnNhY3Rpb25UeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSkgewotCQlQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgb2xkID0gdGhpcy5kZWZhdWx0VHJhbnNhY3Rpb25UeXBlOwotCQl0aGlzLmRlZmF1bHRUcmFuc2FjdGlvblR5cGUgPSB0cmFuc2FjdGlvblR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFksIG9sZCwgdHJhbnNhY3Rpb25UeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkU3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmZyb21YbWxSZXNvdXJjZU1vZGVsKHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPIC0gY2FsY3VsYXRlIGRlZmF1bHQKLQkgKiBGcm9tIHRoZSBKUEEgc3BlYzogIkluIGEgSmF2YSBFRSBlbnZpcm9ubWVudCwgaWYgdGhpcyBlbGVtZW50IGlzIG5vdAotCSAqIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgaXMgSlRBLiBJbiBhIEphdmEgU0UgZW52aXJvbm1lbnQsIGlmIHRoaXMgZWxlbWVudAotCSAqIGlzIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdCBvZiBSRVNPVVJDRV9MT0NBTCBtYXkgYmUgYXNzdW1lZC4iCi0JICovCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBidWlsZERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOyAvL3JldHVybiBKVEEgZm9yIG5vdywgZml4aW5nIHJlZ3Jlc3Npb24gaW4gYnVnIDI3NzUyNAotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXNjcmlwdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbl8oZGVzY3JpcHRpb24pOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVzY3JpcHRpb25fKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZXNjcmlwdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVTQ1JJUFRJT05fUFJPUEVSVFksIG9sZCwgZGVzY3JpcHRpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm92aWRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyKCkgewotCQlyZXR1cm4gdGhpcy5wcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihTdHJpbmcgcHJvdmlkZXIpIHsKLQkJdGhpcy5zZXRQcm92aWRlcl8ocHJvdmlkZXIpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcihwcm92aWRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvdmlkZXJfKFN0cmluZyBwcm92aWRlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wcm92aWRlcjsKLQkJdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJPVklERVJfUFJPUEVSVFksIG9sZCwgcHJvdmlkZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKVEEgZGF0YSBzb3VyY2UgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRKdGFEYXRhU291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5qdGFEYXRhU291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEp0YURhdGFTb3VyY2UoU3RyaW5nIGp0YURhdGFTb3VyY2UpIHsKLQkJdGhpcy5zZXRKdGFEYXRhU291cmNlXyhqdGFEYXRhU291cmNlKTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZShqdGFEYXRhU291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKdGFEYXRhU291cmNlXyhTdHJpbmcganRhRGF0YVNvdXJjZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5qdGFEYXRhU291cmNlOwotCQl0aGlzLmp0YURhdGFTb3VyY2UgPSBqdGFEYXRhU291cmNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZLCBvbGQsIGp0YURhdGFTb3VyY2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBub24tSlRBIGRhdGEgc291cmNlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb25KdGFEYXRhU291cmNlKFN0cmluZyBub25KdGFEYXRhU291cmNlKSB7Ci0JCXRoaXMuc2V0Tm9uSnRhRGF0YVNvdXJjZV8obm9uSnRhRGF0YVNvdXJjZSk7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2Uobm9uSnRhRGF0YVNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm9uSnRhRGF0YVNvdXJjZV8oU3RyaW5nIG5vbkp0YURhdGFTb3VyY2UpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy5ub25KdGFEYXRhU291cmNlID0gbm9uSnRhRGF0YVNvdXJjZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFksIG9sZCwgbm9uSnRhRGF0YVNvdXJjZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHBpbmcgZmlsZSByZWZzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldE1hcHBpbmdGaWxlUmVmcygpIHsKLQkJcmV0dXJuICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiA9PSBudWxsKSA/Ci0JCQkJdGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSA6Ci0JCQkJdGhpcy5nZXRDb21iaW5lZE1hcHBpbmdGaWxlUmVmcygpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldENvbWJpbmVkTWFwcGluZ0ZpbGVSZWZzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4oCi0JCQkJdGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKSwKLQkJCQl0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZgotCQkJKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgPwotCQkJCXRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpIDoKLQkJCQl0aGlzLmdldENvbWJpbmVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0Q29tYmluZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkgKyAxOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4gZ2V0TWFwcGluZ0ZpbGVSZWZzQ29udGFpbmluZyhmaW5hbCBTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4gKHRoaXMuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLmdldFBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKSAhPSBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxNYXBwaW5nRmlsZT4gZ2V0TWFwcGluZ0ZpbGVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPE1hcHBpbmdGaWxlPih0aGlzLmdldE1hcHBpbmdGaWxlc18oKSwgTm90TnVsbEZpbHRlci48TWFwcGluZ0ZpbGU+aW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE1hcHBpbmdGaWxlPiBnZXRNYXBwaW5nRmlsZXNfKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8TWFwcGluZ0ZpbGVSZWYsIE1hcHBpbmdGaWxlPih0aGlzLmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZSB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGVSZWYgcmVmKSB7Ci0JCQkJcmV0dXJuIHJlZi5nZXRNYXBwaW5nRmlsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgbWFwcGluZyBmaWxlIHJlZnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4gZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpLCBmaWxlTmFtZSk7Ci0JfQotCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKGludCBpbmRleCwgU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmID0gdGhpcy5idWlsZFhtbE1hcHBpbmdGaWxlUmVmKGZpbGVOYW1lKTsKLQkJTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSB0aGlzLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZChpbmRleCwgeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWY7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbE1hcHBpbmdGaWxlUmVmIGJ1aWxkWG1sTWFwcGluZ0ZpbGVSZWYoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIHJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJcmVmLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE1hcHBpbmdGaWxlUmVmKHRoaXMsIHhtbE1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKHRoaXMuc3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KG1hcHBpbmdGaWxlUmVmKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYoaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKGluZGV4KTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBtYXBwaW5nIGZpbGUgcmVmCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZfKGludCBpbmRleCkgewotCQl0aGlzLnNwZWNpZmllZE1hcHBpbmdGaWxlUmVmQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KS5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpIHsKLQkJdGhpcy5zcGVjaWZpZWRNYXBwaW5nRmlsZVJlZkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxNYXBwaW5nRmlsZVJlZj4gZ2V0WG1sTWFwcGluZ0ZpbGVSZWZzKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbE1hcHBpbmdGaWxlUmVmPih0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPE1hcHBpbmdGaWxlUmVmLCBYbWxNYXBwaW5nRmlsZVJlZj4gYnVpbGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZkNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZDb250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIG1hcHBpbmcgZmlsZSByZWYgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8TWFwcGluZ0ZpbGVSZWYsIFhtbE1hcHBpbmdGaWxlUmVmPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9NQVBQSU5HX0ZJTEVfUkVGU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRDb250ZXh0RWxlbWVudChYbWxNYXBwaW5nRmlsZVJlZiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdC50aGlzLmJ1aWxkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxNYXBwaW5nRmlsZVJlZj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdC50aGlzLmdldFhtbE1hcHBpbmdGaWxlUmVmcygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sTWFwcGluZ0ZpbGVSZWYgZ2V0UmVzb3VyY2VFbGVtZW50KE1hcHBpbmdGaWxlUmVmIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbXBsaWVkIG1hcHBpbmcgZmlsZSByZWYgKioqKioqKioqKgotCi0JcHVibGljIE1hcHBpbmdGaWxlUmVmIGdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpIHsKLQkJcmV0dXJuIHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmOwotCX0KLQotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBhZGRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSB7Ci0JCWlmICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgaW1wbGllZCBtYXBwaW5nIGZpbGUgcmVmIGlzIGFscmVhZHkgc2V0OiAiICsgdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPSB0aGlzLmJ1aWxkSW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksIG51bGwsIHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmKTsKLQkJcmV0dXJuIHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmOwotCX0KLQotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVJlZiBidWlsZEltcGxpZWRNYXBwaW5nRmlsZVJlZigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAodGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGltcGxpZWQgbWFwcGluZyBmaWxlIHJlZiBpcyBhbHJlYWR5IHVuc2V0LiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTWFwcGluZ0ZpbGVSZWYgb2xkID0gdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWY7Ci0JCXRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmID0gbnVsbDsKLQkJb2xkLmRpc3Bvc2UoKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElNUExJRURfTUFQUElOR19GSUxFX1JFRl9QUk9QRVJUWSwgb2xkLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jSW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAodGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYgIT0gbnVsbCkgewotCQkJdGhpcy5pbXBsaWVkTWFwcGluZ0ZpbGVSZWYuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSW1wbGllZE1hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAodGhpcy5idWlsZHNJbXBsaWVkTWFwcGluZ0ZpbGUoKSkgewotCQkJaWYgKHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlUmVmID09IG51bGwpIHsKLQkJCQl0aGlzLmFkZEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmltcGxpZWRNYXBwaW5nRmlsZVJlZiAhPSBudWxsKSB7Ci0JCQkJdGhpcy5yZW1vdmVJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkc0ltcGxpZWRNYXBwaW5nRmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW1wbGllZE1hcHBpbmdGaWxlSXNOb3RTcGVjaWZpZWQoKSAmJiB0aGlzLmltcGxpZWRNYXBwaW5nRmlsZUV4aXN0cygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGltcGxpZWRNYXBwaW5nRmlsZUlzTm90U3BlY2lmaWVkKCkgewotCQlyZXR1cm4gISB0aGlzLmltcGxpZWRNYXBwaW5nRmlsZUlzU3BlY2lmaWVkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wbGllZE1hcHBpbmdGaWxlSXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmdGaWxlSXNTcGVjaWZpZWQoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hcHBpbmdGaWxlSXNTcGVjaWZpZWQoU3RyaW5nIGltcGxpZWRNYXBwaW5nRmlsZU5hbWUpIHsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZiA6IHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChzcGVjaWZpZWRNYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpLCBpbXBsaWVkTWFwcGluZ0ZpbGVOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbXBsaWVkTWFwcGluZ0ZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKQVIgZmlsZSByZWZzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmFyRmlsZVJlZj4gZ2V0SmFyRmlsZVJlZnMoKSB7Ci0JCXJldHVybiB0aGlzLmphckZpbGVSZWZDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKYXJGaWxlUmVmc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmphckZpbGVSZWZDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKYXJGaWxlUmVmIGFkZEphckZpbGVSZWYoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZEphckZpbGVSZWYodGhpcy5nZXRKYXJGaWxlUmVmc1NpemUoKSwgZmlsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBKYXJGaWxlUmVmIGFkZEphckZpbGVSZWYoaW50IGluZGV4LCBTdHJpbmcgZmlsZU5hbWUpIHsKLQkJWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmID0gdGhpcy5idWlsZFhtbEphckZpbGVSZWYoZmlsZU5hbWUpOwotCQlKYXJGaWxlUmVmIGphckZpbGVSZWYgPSB0aGlzLmphckZpbGVSZWZDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbEphckZpbGVSZWYpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKYXJGaWxlcygpLmFkZChpbmRleCwgeG1sSmFyRmlsZVJlZik7Ci0JCXJldHVybiBqYXJGaWxlUmVmOwotCX0KLQotCXByb3RlY3RlZCBYbWxKYXJGaWxlUmVmIGJ1aWxkWG1sSmFyRmlsZVJlZihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJWG1sSmFyRmlsZVJlZiByZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphckZpbGVSZWYoKTsKLQkJcmVmLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJcmV0dXJuIHJlZjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmFyRmlsZVJlZiBidWlsZEphckZpbGVSZWYoWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkSmFyRmlsZVJlZih0aGlzLCB4bWxKYXJGaWxlUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKYXJGaWxlUmVmKEphckZpbGVSZWYgamFyRmlsZVJlZikgewotCQl0aGlzLnJlbW92ZUphckZpbGVSZWYodGhpcy5qYXJGaWxlUmVmQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudChqYXJGaWxlUmVmKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSmFyRmlsZVJlZihpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVKYXJGaWxlUmVmXyhpbmRleCk7Ci0JCXRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldEphckZpbGVzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBKQVIgZmlsZSByZWYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVKYXJGaWxlUmVmXyhpbnQgaW5kZXgpIHsKLQkJdGhpcy5qYXJGaWxlUmVmQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KS5kaXNwb3NlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0phckZpbGVSZWZzKCkgewotCQl0aGlzLmphckZpbGVSZWZDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSmFyRmlsZVJlZj4gZ2V0WG1sSmFyRmlsZVJlZnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sSmFyRmlsZVJlZj4odGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SmFyRmlsZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphckZpbGVSZWYsIFhtbEphckZpbGVSZWY+IGJ1aWxkSmFyRmlsZVJlZkNvbnRhaW5lcigpIHsKLQkJSmFyRmlsZVJlZkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgSmFyRmlsZVJlZkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIEpBUiBmaWxlIHJlZiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSmFyRmlsZVJlZkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphckZpbGVSZWYsIFhtbEphckZpbGVSZWY+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gSkFSX0ZJTEVfUkVGU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmFyRmlsZVJlZiBidWlsZENvbnRleHRFbGVtZW50KFhtbEphckZpbGVSZWYgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQudGhpcy5idWlsZEphckZpbGVSZWYocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxKYXJGaWxlUmVmPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0LnRoaXMuZ2V0WG1sSmFyRmlsZVJlZnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEphckZpbGVSZWYgZ2V0UmVzb3VyY2VFbGVtZW50KEphckZpbGVSZWYgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxKYXJGaWxlUmVmKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIGNsYXNzIHJlZnMgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPENsYXNzUmVmPiBnZXRDbGFzc1JlZnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8Q2xhc3NSZWY+KAotCQkJCQkJdGhpcy5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKSwKLQkJCQkJCXRoaXMuZ2V0SW1wbGllZENsYXNzUmVmcygpCi0JCQkJCSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDbGFzc1JlZnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkgKyB0aGlzLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgY2xhc3MgcmVmcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPENsYXNzUmVmPiBnZXRTcGVjaWZpZWRDbGFzc1JlZnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENsYXNzUmVmQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBDbGFzc1JlZiBhZGRTcGVjaWZpZWRDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZENsYXNzUmVmKHRoaXMuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpLCBjbGFzc05hbWUpOwotCX0KLQotCXB1YmxpYyBDbGFzc1JlZiBhZGRTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gdGhpcy5idWlsZFhtbEphdmFDbGFzc1JlZihjbGFzc05hbWUpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IHRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbENsYXNzUmVmKTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZChpbmRleCwgeG1sQ2xhc3NSZWYpOwotCQlyZXR1cm4gY2xhc3NSZWY7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEphdmFDbGFzc1JlZiBidWlsZFhtbEphdmFDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVhtbEphdmFDbGFzc1JlZiByZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQlyZWYuc2V0SmF2YUNsYXNzKGNsYXNzTmFtZSk7Ci0JCXJldHVybiByZWY7Ci0JfQotCi0JcHJvdGVjdGVkIENsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkQ2xhc3NSZWYodGhpcywgeG1sQ2xhc3NSZWYpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZENsYXNzUmVmKENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYodGhpcy5zcGVjaWZpZWRDbGFzc1JlZkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoY2xhc3NSZWYpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRDbGFzc1JlZihpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZl8oaW5kZXgpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBkaXNwb3NlIHRoZSBjbGFzcyByZWYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRDbGFzc1JlZl8oaW50IGluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkQ2xhc3NSZWZDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3BlY2lmaWVkQ2xhc3NSZWZzKCkgewotCQl0aGlzLnNwZWNpZmllZENsYXNzUmVmQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbEphdmFDbGFzc1JlZj4gZ2V0WG1sQ2xhc3NSZWZzKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbEphdmFDbGFzc1JlZj4odGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8Q2xhc3NSZWYsIFhtbEphdmFDbGFzc1JlZj4gYnVpbGRTcGVjaWZpZWRDbGFzc1JlZkNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkQ2xhc3NSZWZDb250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZENsYXNzUmVmQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIGNsYXNzIHJlZiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkQ2xhc3NSZWZDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxDbGFzc1JlZiwgWG1sSmF2YUNsYXNzUmVmPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9DTEFTU19SRUZTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDbGFzc1JlZiBidWlsZENvbnRleHRFbGVtZW50KFhtbEphdmFDbGFzc1JlZiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdC50aGlzLmJ1aWxkQ2xhc3NSZWYocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxKYXZhQ2xhc3NSZWY+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQudGhpcy5nZXRYbWxDbGFzc1JlZnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEphdmFDbGFzc1JlZiBnZXRSZXNvdXJjZUVsZW1lbnQoQ2xhc3NSZWYgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxDbGFzc1JlZigpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZpcnR1YWwgY2xhc3MgcmVmcyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8Q2xhc3NSZWY+IGdldEltcGxpZWRDbGFzc1JlZnMoKSB7Ci0JCXJldHVybiB0aGlzLmltcGxpZWRDbGFzc1JlZkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5pbXBsaWVkQ2xhc3NSZWZDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBDbGFzc1JlZiBhZGRJbXBsaWVkQ2xhc3NSZWYoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlyZXR1cm4gdGhpcy5pbXBsaWVkQ2xhc3NSZWZDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSwgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3NSZWYgYnVpbGRDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkQ2xhc3NSZWYodGhpcywgY2xhc3NOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVJbXBsaWVkQ2xhc3NSZWZzKCkgewotCQl0aGlzLmltcGxpZWRDbGFzc1JlZkNvbnRhaW5lci51cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRJbXBsaWVkQ2xhc3NOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSA/Ci0JCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkgOgotCQkJCXRoaXMuZ2V0SW1wbGllZENsYXNzTmFtZXNfKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgdGhlIEphdmEgY2xhc3NlcyBpbiB0aGUgSlBBIHByb2plY3QgdGhhdCBhcmUKLQkgKiBtYXBwZWQgKGkuZS4gaGF2ZSB0aGUgYXBwcm9wcmlhdGUgYW5ub3RhdGlvbiBldGMuKSBidXQgbm90IHNwZWNpZmllZAotCSAqIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEltcGxpZWRDbGFzc05hbWVzXygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBlZEphdmFTb3VyY2VDbGFzc05hbWVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU3RyaW5nIG1hcHBlZENsYXNzTmFtZSkgewotCQkJCQlyZXR1cm4gISBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdC50aGlzLnNwZWNpZmllc1BlcnNpc3RlbnRUeXBlKG1hcHBlZENsYXNzTmFtZSk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dENvbGxlY3Rpb25Db250YWluZXI8Q2xhc3NSZWYsIFN0cmluZz4gYnVpbGRJbXBsaWVkQ2xhc3NSZWZDb250YWluZXIoKSB7Ci0JCXJldHVybiBuZXcgSW1wbGllZENsYXNzUmVmQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogVmlydHVhbCBjbGFzcyByZWYgY29udGFpbmVyIGFkYXB0ZXIuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGNvbnRleHQgY2xhc3MgcmVmIGlzIG1hdGNoZWQgd2l0aCBhIHJlc291cmNlCi0JICogY2xhc3MgYnkgbmFtZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIHVzZWQgZHVyaW5nIDxzdHJvbmc+Ym90aDwvc3Ryb25nPiA8ZW0+c3luYzwvZW0+IGFuZAotCSAqIDxlbT51cGRhdGU8L2VtPiBiZWNhdXNlIHRoZSBsaXN0IG9mIGltcGxpZWQgY2xhc3MgcmVmcyBjYW4gYmUgbW9kaWZpZWQKLQkgKiBpbiBlaXRoZXIgc2l0dWF0aW9uLiBJbiBwYXJ0aWN1bGFyLCB3ZSBjYW5ub3Qgc2ltcGx5IHJlbHkgb24KLQkgKiA8ZW0+dXBkYXRlPC9lbT4gYmVjYXVzZSB0aGVyZSBhcmUgc2l0dWF0aW9ucyB3aGVyZSBhIDxlbT5zeW5jPC9lbT4gaXMKLQkgKiB0cmlnZ2VyZWQgYnV0IGEgZm9sbG93LXVwIDxlbT51cGRhdGU8L2VtPiBpcyBub3QuIChPZiBjb3Vyc2UsIGFueQotCSAqIGNoYW5nZSBkaXNjb3ZlcmVkIGhlcmUgd2lsbCB0cmlnZ2VyIGFuIDxlbT51cGRhdGU8L2VtPi4pCi0JICogPHA+Ci0JICogVGhlIG1vc3Qgb2J2aW91cyBleGFtcGxlIGlzIHdoZW4gdGhlIEpQQSBwcm9qZWN0IGlzIGNvbmZpZ3VyZWQgdG8KLQkgKiBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBhbmQgYSBKYXZhIGNsYXNzIGlzIGFubm90YXRlZCBmb3IgdGhlIGZpcnN0Ci0JICogdGltZSAodmlhIGNvZGUgZWRpdGluZywgbm90IHZpYSB0aGUgY29udGV4dCBtb2RlbCkuIFRoaXMgd2lsbCB0cmlnZ2VyCi0JICogYSA8ZW0+c3luYzwvZW0+OyBidXQsIHNpbmNlIHRoZSB1bmFubm90YXRlZCBjbGFzcyBpcyBub3QgeWV0IGluIHRoZQotCSAqIGNvbnRleHQgbW9kZWwgYW5kLCBhcyBhIHJlc3VsdCwgdGhlIGNvbnRleHQgbW9kZWwncyBzdGF0ZSBpcyB1bnRvdWNoZWQsCi0JICogYW4gPGVtPnVwZGF0ZTwvZW0+IHdpbGwgbm90IGJlIHRyaWdnZXJlZC4KLQkgKiA8cD4KLQkgKiBPYnZpb3VzbHksIG90aGVyIGNvbnRleHQgbW9kZWwgY2hhbmdlcyBjYW4gY2hhbmdlIHRoaXMgY29sbGVjdGlvbiAoZS5nLgotCSAqIHNldHRpbmcgd2hldGhlciB0aGUgcGVyc2lzdGVuY2UgdW5pdCBleGNsdWRlcyB1bmxpc3RlZCBjbGFzc2VzKTsgbyB0aGUKLQkgKiBjb2xsZWN0aW9uIG11c3QgYWxzbyBiZSBzeW5jaHJvbml6ZWQgZHVyaW5nIDxlbT51cGRhdGU8L2VtPi4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSW1wbGllZENsYXNzUmVmQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dENvbGxlY3Rpb25Db250YWluZXI8Q2xhc3NSZWYsIFN0cmluZz4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBJTVBMSUVEX0NMQVNTX1JFRlNfQ09MTEVDVElPTjsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENsYXNzUmVmIGJ1aWxkQ29udGV4dEVsZW1lbnQoU3RyaW5nIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0LnRoaXMuYnVpbGRDbGFzc1JlZihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0LnRoaXMuZ2V0SW1wbGllZENsYXNzTmFtZXMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZUVsZW1lbnQoQ2xhc3NSZWYgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRDbGFzc05hbWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoQ2xhc3NSZWYgZWxlbWVudCkgewotCQkJc3VwZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoZWxlbWVudCk7Ci0JCQllbGVtZW50LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGNsdWRlIHVubGlzdGVkIGNsYXNzZXMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5nZXREZWZhdWx0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuIHNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzXyhzcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyh0aGlzLnNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXNfKEJvb2xlYW4gZXhjbHVkZVVubGlzdGVkQ2xhc3NlcykgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJdGhpcy5zcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gZXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFksIG9sZCwgZXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsgIC8vID8/PwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8UHJvcGVydHk+IGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJvcGVydGllc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWZvciAoUHJvcGVydHkgcHJvcGVydHkgOiB0aGlzLmdldFByb3BlcnRpZXMoKSkgewotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMocHJvcGVydHkuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybiBwcm9wZXJ0eTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UHJvcGVydHk+IGdldFByb3BlcnRpZXNOYW1lZChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxQcm9wZXJ0eT4odGhpcy5nZXRQcm9wZXJ0aWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHlOYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UHJvcGVydHk+IGdldFByb3BlcnRpZXNXaXRoTmFtZVByZWZpeChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lUHJlZml4KSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWVQcmVmaXggPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxQcm9wZXJ0eT4odGhpcy5nZXRQcm9wZXJ0aWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCQkJU3RyaW5nIHBOYW1lID0gcHJvcGVydHkuZ2V0TmFtZSgpOwotCQkJCXJldHVybiAocE5hbWUgIT0gbnVsbCkgJiYgcE5hbWUuc3RhcnRzV2l0aChwcm9wZXJ0eU5hbWVQcmVmaXgpOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0eSBhZGRQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRkUHJvcGVydHkodGhpcy5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHkgYWRkUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gdGhpcy5idWlsZFhtbFByb3BlcnR5KCk7Ci0JCVByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5hZGRQcm9wZXJ0eV8oaW5kZXgsIHhtbFByb3BlcnR5KTsKLQotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSB0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWlmICh4bWxQcm9wZXJ0aWVzID09IG51bGwpIHsKLQkJCXhtbFByb3BlcnRpZXMgPSB0aGlzLmJ1aWxkWG1sUHJvcGVydGllcygpOwotCQkJdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJfQotCi0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZChpbmRleCwgeG1sUHJvcGVydHkpOwotCQlpZiAocHJvcGVydHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXRoaXMucHJvcGVydHlBZGRlZChwcm9wZXJ0eS5nZXROYW1lKCksIHByb3BlcnR5LmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUHJvcGVydHkgYnVpbGRYbWxQcm9wZXJ0eSgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHkgYnVpbGRQcm9wZXJ0eShYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZFByb3BlcnR5KHRoaXMsIHhtbFByb3BlcnR5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUHJvcGVydGllcyBidWlsZFhtbFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGR1cGxpY2F0ZVByb3BlcnR5TmFtZXNBbGxvd2VkKSB7Ci0JCVByb3BlcnR5IHByZXYgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCWlmIChwcmV2ID09IG51bGwpIHsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5hZGRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHZhbHVlKTsgIC8vIGFkZCBbZmlyc3RdIHByb3BlcnR5Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZHVwbGljYXRlUHJvcGVydHlOYW1lc0FsbG93ZWQpIHsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3RoaW5nPwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMuYWRkUHJvcGVydHkocHJvcGVydHlOYW1lLCB2YWx1ZSk7ICAvLyBhZGQgW2R1cGxpY2F0ZV0gcHJvcGVydHkKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXRoaXMucmVtb3ZlUHJvcGVydHkocHJldik7ICAvLyByZW1vdmUgZXhpc3RpbmcgcHJvcGVydHkKLQkJCQl9IGVsc2UgewotCQkJCQlwcmV2LnNldFZhbHVlKHZhbHVlKTsgIC8vIGNoYW5nZSBleGlzdGluZyBwcm9wZXJ0eQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuYWRkUHJvcGVydHkoKTsKLQkJcHJvcGVydHkuc2V0TmFtZShwcm9wZXJ0eU5hbWUpOwotCQlwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoUHJvcGVydHkgcHJvcGVydHkpIHsKLQkJdGhpcy5yZW1vdmVQcm9wZXJ0eSh0aGlzLnByb3BlcnR5Q29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudChwcm9wZXJ0eSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlmb3IgKFByb3BlcnR5IHByb3BlcnR5IDogdGhpcy5nZXRQcm9wZXJ0aWVzKCkpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKHByb3BlcnR5LmdldE5hbWUoKSkpIHsKLQkJCQl0aGlzLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBwcm9wZXJ0eSBuYW1lOiAiICsgcHJvcGVydHlOYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoKHByb3BlcnR5TmFtZSA9PSBudWxsKSB8fCAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWZvciAoUHJvcGVydHkgcHJvcGVydHkgOiB0aGlzLmdldFByb3BlcnRpZXMoKSkgewotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMocHJvcGVydHkuZ2V0TmFtZSgpKSAmJiB2YWx1ZS5lcXVhbHMocHJvcGVydHkuZ2V0VmFsdWUoKSkpIHsKLQkJCQl0aGlzLnJlbW92ZVByb3BlcnR5KHByb3BlcnR5KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBwcm9wZXJ0eSBuYW1lL3ZhbHVlIHBhaXI6ICIgKyBwcm9wZXJ0eU5hbWUgKyAiID0gIiArIHZhbHVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCVByb3BlcnR5IHJlbW92ZWRQcm9wZXJ0eSA9IHRoaXMucHJvcGVydHlDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnJlbW92ZShpbmRleCk7Ci0KLQkJaWYgKHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0aWVzKG51bGwpOwotCQl9Ci0KLQkJaWYgKHJlbW92ZWRQcm9wZXJ0eS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJdGhpcy5wcm9wZXJ0eVJlbW92ZWQocmVtb3ZlZFByb3BlcnR5LmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eU5hbWVDaGFuZ2VkKFN0cmluZyBvbGRQcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdQcm9wZXJ0eU5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoKG9sZFByb3BlcnR5TmFtZSA9PSBudWxsKSAmJiAodmFsdWUgPT0gbnVsbCkpIHsKLQkJCS8vdGhpcyBpcyBhIHByb3BlcnR5IHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGFkZGVkLCB3ZSBkb24ndCBuZWVkIHRvIGRlYWwgd2l0aCBpdCB1bnRpbCB0aGUgdmFsdWUgaXMgc2V0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG9sZFByb3BlcnR5TmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnByb3BlcnR5UmVtb3ZlZChvbGRQcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCWlmIChuZXdQcm9wZXJ0eU5hbWUgIT0gbnVsbCkgewotCQkJdGhpcy5wcm9wZXJ0eUFkZGVkKG5ld1Byb3BlcnR5TmFtZSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXRoaXMuY29ubmVjdGlvbi5wcm9wZXJ0eVZhbHVlQ2hhbmdlZChwcm9wZXJ0eU5hbWUsIG5ld1ZhbHVlKTsKLQkJdGhpcy5vcHRpb25zLnByb3BlcnR5VmFsdWVDaGFuZ2VkKHByb3BlcnR5TmFtZSwgbmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5QWRkZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlWYWx1ZUNoYW5nZWQocHJvcGVydHlOYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJdGhpcy5jb25uZWN0aW9uLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLm9wdGlvbnMucHJvcGVydHlSZW1vdmVkKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXRoaXMuY29ubmVjdGlvbiA9IHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uKHRoaXMpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3B0aW9ucyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jUHJvcGVydGllcygpIHsKLQkJdGhpcy5wcm9wZXJ0eUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxQcm9wZXJ0eT4gZ2V0WG1sUHJvcGVydGllcygpIHsKLQkJWG1sUHJvcGVydGllcyB4bWxQcm9wZXJ0aWVzID0gdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpOwotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiAoeG1sUHJvcGVydGllcyA9PSBudWxsKSA/Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPFhtbFByb3BlcnR5Pmluc3RhbmNlKCkgOgotCQkJCW5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sUHJvcGVydHk+KHhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHkgYWRkUHJvcGVydHlfKGludCBpbmRleCwgWG1sUHJvcGVydHkgeG1sUHJvcGVydHkpIHsKLQkJUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLnByb3BlcnR5Q29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxQcm9wZXJ0eSk7Ci0JCWlmIChwcm9wZXJ0eS5nZXROYW1lKCkgIT0gbnVsbCkgewotCQkJdGhpcy5wcm9wZXJ0eUFkZGVkKHByb3BlcnR5LmdldE5hbWUoKSwgcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnR5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3BlcnR5XyhQcm9wZXJ0eSBwcm9wZXJ0eSkgewotCQl0aGlzLnByb3BlcnR5Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KHByb3BlcnR5KTsKLQkJaWYgKHByb3BlcnR5LmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnByb3BlcnR5UmVtb3ZlZChwcm9wZXJ0eS5nZXROYW1lKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPFByb3BlcnR5LCBYbWxQcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0eUNvbnRhaW5lcigpIHsKLQkJUHJvcGVydHlDb250YWluZXIgY29udGFpbmVyID0gbmV3IFByb3BlcnR5Q29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogcHJvcGVydHkgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFByb3BlcnR5Q29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8UHJvcGVydHksIFhtbFByb3BlcnR5PgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFBST1BFUlRJRVNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByb3BlcnR5IGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sUHJvcGVydHkgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQudGhpcy5idWlsZFByb3BlcnR5KHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUHJvcGVydHk+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQudGhpcy5nZXRYbWxQcm9wZXJ0aWVzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxQcm9wZXJ0eSBnZXRSZXNvdXJjZUVsZW1lbnQoUHJvcGVydHkgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxQcm9wZXJ0eSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUHJvcGVydHkgYWRkQ29udGV4dEVsZW1lbnRfKGludCBpbmRleCwgUHJvcGVydHkgY29udGV4dEVsZW1lbnQpIHsKLQkJCXN1cGVyLmFkZENvbnRleHRFbGVtZW50XyhpbmRleCwgY29udGV4dEVsZW1lbnQpOwotCQkJaWYgKGNvbnRleHRFbGVtZW50LmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydHlBZGRlZChjb250ZXh0RWxlbWVudC5nZXROYW1lKCksIGNvbnRleHRFbGVtZW50LmdldFZhbHVlKCkpOwotCQkJfQotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50OwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0RWxlbWVudChQcm9wZXJ0eSBjb250ZXh0RWxlbWVudCkgewotCQkJc3VwZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoY29udGV4dEVsZW1lbnQpOwotCQkJaWYgKGNvbnRleHRFbGVtZW50LmdldE5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJcHJvcGVydHlSZW1vdmVkKGNvbnRleHRFbGVtZW50LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIG1hcHBpbmcgZmlsZSAob3JtLnhtbCkgcGVyc2lzdGVuY2UgdW5pdCBtZXRhZGF0YSAmIGRlZmF1bHRzICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSwgb2xkLCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIG1ldGFkYXRhKSB7Ci0JCXJldHVybiAobWV0YWRhdGEgPT0gbnVsbCkgPyBmYWxzZSA6IG1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0QWNjZXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRBY2Nlc3M7Ci0JCXRoaXMuZGVmYXVsdEFjY2VzcyA9IGFjY2VzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBjYXRhbG9nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZyhNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGRlZmF1bHRzKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gKGRlZmF1bHRzID09IG51bGwpID8gbnVsbCA6IGRlZmF1bHRzLmdldENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nICE9IG51bGwpID8gY2F0YWxvZyA6IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0U2NoZW1hOwotCQl0aGlzLmRlZmF1bHRTY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMpIHsKLQkJU3RyaW5nIHNjaGVtYSA9IChkZWZhdWx0cyA9PSBudWxsKSA/IG51bGwgOiBkZWZhdWx0cy5nZXRTY2hlbWEoKTsKLQkJcmV0dXJuIChzY2hlbWEgIT0gbnVsbCkgPyBzY2hlbWEgOiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2FzY2FkZVBlcnNpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gY2FzY2FkZVBlcnNpc3QpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRDYXNjYWRlUGVyc2lzdDsKLQkJdGhpcy5kZWZhdWx0Q2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZLCBvbGQsIGNhc2NhZGVQZXJzaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRDYXNjYWRlUGVyc2lzdChNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGRlZmF1bHRzKSB7Ci0JCXJldHVybiAoZGVmYXVsdHMgPT0gbnVsbCkgPyBmYWxzZSA6IGRlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0RGVsaW1pdGVkSWRlbnRpZmllcnMoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHREZWxpbWl0ZWRJZGVudGlmaWVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RGVsaW1pdGVkSWRlbnRpZmllcnMoYm9vbGVhbiBkZWxpbWl0ZWRJZGVudGlmaWVycykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdERlbGltaXRlZElkZW50aWZpZXJzOwotCQl0aGlzLmRlZmF1bHREZWxpbWl0ZWRJZGVudGlmaWVycyA9IGRlbGltaXRlZElkZW50aWZpZXJzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9ERUxJTUlURURfSURFTlRJRklFUlNfUFJPUEVSVFksIG9sZCwgZGVsaW1pdGVkSWRlbnRpZmllcnMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdERlbGltaXRlZElkZW50aWZpZXJzKE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZGVmYXVsdHMpIHsKLQkJcmV0dXJuICggISB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSA/IGZhbHNlIDoKLQkJCQkoZGVmYXVsdHMgPT0gbnVsbCkgPyBmYWxzZSA6ICgoTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMCkgZGVmYXVsdHMpLmlzRGVsaW1pdGVkSWRlbnRpZmllcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBtZXRhZGF0YSA9IHRoaXMuZ2V0TWV0YWRhdGEoKTsKLQkJdGhpcy5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0aGlzLmJ1aWxkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUobWV0YWRhdGEpKTsKLQotCQlNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGRlZmF1bHRzID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdEFjY2VzcygoZGVmYXVsdHMgPT0gbnVsbCkgPyBudWxsIDogZGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZyhkZWZhdWx0cykpOwotCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5idWlsZERlZmF1bHRTY2hlbWEoZGVmYXVsdHMpKTsKLQkJdGhpcy5zZXREZWZhdWx0RGVsaW1pdGVkSWRlbnRpZmllcnModGhpcy5idWlsZERlZmF1bHREZWxpbWl0ZWRJZGVudGlmaWVycyhkZWZhdWx0cykpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgdW5pdCBtZXRhZGF0YSB3ZSBlbmNvdW50ZXIKLQkgKiBpbiBhIG1hcHBpbmcgZmlsZQotCSAqLwotCXByb3RlY3RlZCBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldE1ldGFkYXRhKCkgewotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogdGhpcy5nZXRNYXBwaW5nRmlsZVJlZnMoKSkgewotCQkJaWYgKG1hcHBpbmdGaWxlUmVmLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRXhpc3RzKCkpIHsKLQkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUGVyc2lzdGVuY2VVbml0Ml8wIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldENvbm5lY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0T3B0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2hhcmVkIGNhY2hlIG1vZGUgKioqKioqKioqKgotCi0JcHVibGljIFNoYXJlZENhY2hlTW9kZSBnZXRTaGFyZWRDYWNoZU1vZGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSA6IHRoaXMuZGVmYXVsdFNoYXJlZENhY2hlTW9kZTsKLQl9Ci0KLQlwdWJsaWMgU2hhcmVkQ2FjaGVNb2RlIGdldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUgc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlXyhzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLnRvWG1sUmVzb3VyY2VNb2RlbChzcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGVfKFNoYXJlZENhY2hlTW9kZSBzaGFyZWRDYWNoZU1vZGUpIHsKLQkJU2hhcmVkQ2FjaGVNb2RlIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlOwotCQl0aGlzLnNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSA9IHNoYXJlZENhY2hlTW9kZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TSEFSRURfQ0FDSEVfTU9ERV9QUk9QRVJUWSwgb2xkLCBzaGFyZWRDYWNoZU1vZGUpOwotCX0KLQotCXB1YmxpYyBTaGFyZWRDYWNoZU1vZGUgZ2V0RGVmYXVsdFNoYXJlZENhY2hlTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNoYXJlZENhY2hlTW9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZSBkZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKSB7Ci0JCVNoYXJlZENhY2hlTW9kZSBvbGQgPSB0aGlzLmRlZmF1bHRTaGFyZWRDYWNoZU1vZGU7Ci0JCXRoaXMuZGVmYXVsdFNoYXJlZENhY2hlTW9kZSA9IGRlZmF1bHRTaGFyZWRDYWNoZU1vZGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRTaGFyZWRDYWNoZU1vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCVNoYXJlZENhY2hlTW9kZSBzaGFyZWRDYWNoZU1vZGUgPSB0aGlzLmdldFNoYXJlZENhY2hlTW9kZSgpOwotCQlpZiAoc2hhcmVkQ2FjaGVNb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsgIC8vIHRoaXMgY2FuIGhhcHBlbiBkdXJpbmcgaW5pdGlhbCB1cGRhdGUuLi4KLQkJfQotCQlzd2l0Y2ggKHNoYXJlZENhY2hlTW9kZSkgewotCQkJY2FzZSBOT05FOgotCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgotCQkJY2FzZSBVTlNQRUNJRklFRDoKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQljYXNlIEFMTDoKLQkJCWNhc2UgRElTQUJMRV9TRUxFQ1RJVkU6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24gbW9kZTogIiArIHNoYXJlZENhY2hlTW9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgYnVpbGRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoKSB7Ci0JCXJldHVybiBTaGFyZWRDYWNoZU1vZGUuZnJvbVhtbFJlc291cmNlTW9kZWwodGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCX0KLQotCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgYnVpbGREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKCkgewotCQlyZXR1cm4gU2hhcmVkQ2FjaGVNb2RlLlVOU1BFQ0lGSUVEOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiBtb2RlICoqKioqKioqKioKLQotCXB1YmxpYyBWYWxpZGF0aW9uTW9kZSBnZXRWYWxpZGF0aW9uTW9kZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFZhbGlkYXRpb25Nb2RlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSA6IHRoaXMuZGVmYXVsdFZhbGlkYXRpb25Nb2RlOwotCX0KLQotCXB1YmxpYyBWYWxpZGF0aW9uTW9kZSBnZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoVmFsaWRhdGlvbk1vZGUgc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZV8oc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5zZXRWYWxpZGF0aW9uTW9kZShWYWxpZGF0aW9uTW9kZS50b1htbFJlc291cmNlTW9kZWwoc3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZV8oVmFsaWRhdGlvbk1vZGUgdmFsaWRhdGlvbk1vZGUpIHsKLQkJVmFsaWRhdGlvbk1vZGUgb2xkID0gdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZTsKLQkJdGhpcy5zcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSA9IHZhbGlkYXRpb25Nb2RlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1ZBTElEQVRJT05fTU9ERV9QUk9QRVJUWSwgb2xkLCB2YWxpZGF0aW9uTW9kZSk7Ci0JfQotCi0JcHVibGljIFZhbGlkYXRpb25Nb2RlIGdldERlZmF1bHRWYWxpZGF0aW9uTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFZhbGlkYXRpb25Nb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRWYWxpZGF0aW9uTW9kZShWYWxpZGF0aW9uTW9kZSBkZWZhdWx0VmFsaWRhdGlvbk1vZGUpIHsKLQkJVmFsaWRhdGlvbk1vZGUgb2xkID0gdGhpcy5kZWZhdWx0VmFsaWRhdGlvbk1vZGU7Ci0JCXRoaXMuZGVmYXVsdFZhbGlkYXRpb25Nb2RlID0gZGVmYXVsdFZhbGlkYXRpb25Nb2RlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFksIG9sZCwgZGVmYXVsdFZhbGlkYXRpb25Nb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgYnVpbGRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpIHsKLQkJcmV0dXJuIFZhbGlkYXRpb25Nb2RlLmZyb21YbWxSZXNvdXJjZU1vZGVsKHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldFZhbGlkYXRpb25Nb2RlKCkpOwotCX0KLQotCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBidWlsZERlZmF1bHRWYWxpZGF0aW9uTW9kZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfVkFMSURBVElPTl9NT0RFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lSXRlcmFibGU8R2VuZXJhdG9yPih0aGlzLmdlbmVyYXRvcnMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0R2VuZXJhdG9yc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvcnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFVuaXF1ZUdlbmVyYXRvck5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNldCh0aGlzLmdldE5vbkVtcHR5R2VuZXJhdG9yTmFtZXMoKSwgdGhpcy5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROb25FbXB0eUdlbmVyYXRvck5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRHZW5lcmF0b3JOYW1lcygpLCBOb25FbXB0eVN0cmluZ0ZpbHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRHZW5lcmF0b3JOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEdlbmVyYXRvciwgU3RyaW5nPih0aGlzLmdldEdlbmVyYXRvcnMoKSwgSnBhTmFtZWRDb250ZXh0Tm9kZS5OYW1lVHJhbnNmb3JtZXIuPEdlbmVyYXRvcj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRHZW5lcmF0b3JzKEl0ZXJhYmxlPEdlbmVyYXRvcj4gZ2VuZXJhdG9ycykgewotCQl0aGlzLnN5bmNocm9uaXplQ29sbGVjdGlvbihnZW5lcmF0b3JzLCB0aGlzLmdlbmVyYXRvcnMsIEdFTkVSQVRPUlNfQ09MTEVDVElPTik7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdG9ycyBhcmUgbXVjaCBsaWtlIHF1ZXJpZXMuCi0JICogQHNlZSAjYnVpbGRRdWVyaWVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8R2VuZXJhdG9yPiBidWlsZEdlbmVyYXRvcnMoKSB7Ci0JCUFycmF5TGlzdDxHZW5lcmF0b3I+IHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZ2V0TWFwcGluZ0ZpbGVHZW5lcmF0b3JzKCkpOwotCi0JCUhhc2hTZXQ8U3RyaW5nPiBtYXBwaW5nRmlsZUdlbmVyYXRvck5hbWVzID0gdGhpcy5jb252ZXJ0VG9OYW1lcyhyZXN1bHQpOwotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PEdlbmVyYXRvcj4+IGphdmFHZW5lcmF0b3JzID0gdGhpcy5tYXBCeU5hbWUodGhpcy5nZXRBbGxKYXZhR2VuZXJhdG9ycygpKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8R2VuZXJhdG9yPj4gZW50cnkgOiBqYXZhR2VuZXJhdG9ycy5lbnRyeVNldCgpKSB7Ci0JCQlpZiAoICEgbWFwcGluZ0ZpbGVHZW5lcmF0b3JOYW1lcy5jb250YWlucyhlbnRyeS5nZXRLZXkoKSkpIHsKLQkJCQlyZXN1bHQuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRNYXBwaW5nRmlsZUdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8R2VuZXJhdG9yPih0aGlzLmdldE1hcHBpbmdGaWxlR2VuZXJhdG9yTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEdlbmVyYXRvcj4+IGdldE1hcHBpbmdGaWxlR2VuZXJhdG9yTGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nRmlsZVJlZiwgSXRlcmFibGU8R2VuZXJhdG9yPj4odGhpcy5nZXRNYXBwaW5nRmlsZVJlZnMoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEdlbmVyYXRvcj4gdHJhbnNmb3JtKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCQkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuZ2V0TWFwcGluZ0ZpbGVHZW5lcmF0b3JzKCk7Ci0JCQkJCX0KLQkJCQl9OwotCX0KLQotCS8qKgotCSAqIEluY2x1ZGUgIm92ZXJyaWRkZW4iIEphdmEgZ2VuZXJhdG9ycy4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRBbGxKYXZhR2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxHZW5lcmF0b3I+KHRoaXMuZ2V0QWxsSmF2YVR5cGVNYXBwaW5nR2VuZXJhdG9yTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPEdlbmVyYXRvcj4+IGdldEFsbEphdmFUeXBlTWFwcGluZ0dlbmVyYXRvckxpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8VHlwZU1hcHBpbmcsIEl0ZXJhYmxlPEdlbmVyYXRvcj4+KHRoaXMuZ2V0QWxsSmF2YVR5cGVNYXBwaW5nc1VuaXF1ZSgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8R2VuZXJhdG9yPiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJCQkJCXJldHVybiB0eXBlTWFwcGluZy5nZXRHZW5lcmF0b3JzKCk7Ci0JCQkJCX0KLQkJCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxRdWVyeT4gZ2V0UXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxRdWVyeT4odGhpcy5xdWVyaWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyaWVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRRdWVyeShRdWVyeSBxdWVyeSkgewotCQl0aGlzLnF1ZXJpZXMuYWRkKHF1ZXJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRRdWVyaWVzKEl0ZXJhYmxlPFF1ZXJ5PiBxdWVyaWVzKSB7Ci0JCXRoaXMuc3luY2hyb25pemVDb2xsZWN0aW9uKHF1ZXJpZXMsIHRoaXMucXVlcmllcywgUVVFUklFU19DT0xMRUNUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGVyc2lzdGVuY2UgdW5pdCBob2xkcyBvbmx5IDxlbT5hY3RpdmU8L2VtPiBxdWVyaWVzOwotCSAqIGkuZS4gdGhlIG1hcHBpbmcgZmlsZSBxdWVyaWVzIGFuZCB0aGUgSmF2YSBxdWVyaWVzIHRoYXQgYXJlIG5vdAotCSAqICJvdmVycmlkZGVuIiBieSBtYXBwaW5nIGZpbGUgcXVlcmllcyAoYnkgcXVlcnkgbmFtZSkuCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlIGxpc3QgY2FuIGNvbnRhaW4gcXVlcmllcyB3aXRoIGR1cGxpY2F0ZSBuYW1lczsKLQkgKiBlaXRoZXIgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgbWFwcGluZyBmaWxlIHF1ZXJpZXMgd2l0aCB0aGUgc2FtZSBuYW1lCi0JICogb3IgbXVsdGlwbGUsIG5vbi1vdmVycmlkZGVuIEphdmEgcXVlcmllcyB3aXRoIHRoZSBzYW1lIG5hbWUuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFF1ZXJ5PiBidWlsZFF1ZXJpZXMoKSB7Ci0JCUFycmF5TGlzdDxRdWVyeT4gcmVzdWx0ID0gQ29sbGVjdGlvblRvb2xzLmxpc3QodGhpcy5nZXRNYXBwaW5nRmlsZVF1ZXJpZXMoKSk7Ci0KLQkJSGFzaFNldDxTdHJpbmc+IG1hcHBpbmdGaWxlUXVlcnlOYW1lcyA9IHRoaXMuY29udmVydFRvTmFtZXMocmVzdWx0KTsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxRdWVyeT4+IGphdmFRdWVyaWVzID0gdGhpcy5tYXBCeU5hbWUodGhpcy5nZXRBbGxKYXZhUXVlcmllcygpKTsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8UXVlcnk+PiBlbnRyeSA6IGphdmFRdWVyaWVzLmVudHJ5U2V0KCkpIHsKLQkJCWlmICggISBtYXBwaW5nRmlsZVF1ZXJ5TmFtZXMuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0JCQkJcmVzdWx0LmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRNYXBwaW5nRmlsZVF1ZXJpZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UXVlcnk+KHRoaXMuZ2V0TWFwcGluZ0ZpbGVRdWVyeUxpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxRdWVyeT4+IGdldE1hcHBpbmdGaWxlUXVlcnlMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPE1hcHBpbmdGaWxlUmVmLCBJdGVyYWJsZTxRdWVyeT4+KHRoaXMuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxRdWVyeT4gdHJhbnNmb3JtKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCQkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuZ2V0TWFwcGluZ0ZpbGVRdWVyaWVzKCk7Ci0JCQkJCX0KLQkJCQl9OwotCX0KLQotCXByb3RlY3RlZCBIYXNoU2V0PFN0cmluZz4gY29udmVydFRvTmFtZXMoQ29sbGVjdGlvbjw/IGV4dGVuZHMgSnBhTmFtZWRDb250ZXh0Tm9kZT4gbm9kZXMpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihub2Rlcy5zaXplKCkpOwotCQlmb3IgKEpwYU5hbWVkQ29udGV4dE5vZGUgbm9kZSA6IG5vZGVzKSB7Ci0JCQluYW1lcy5hZGQobm9kZS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiBJbmNsdWRlICJvdmVycmlkZGVuIiBKYXZhIHF1ZXJpZXMuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFF1ZXJ5PiBnZXRBbGxKYXZhUXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxRdWVyeT4odGhpcy5nZXRBbGxKYXZhVHlwZU1hcHBpbmdRdWVyeUxpc3RzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxRdWVyeT4+IGdldEFsbEphdmFUeXBlTWFwcGluZ1F1ZXJ5TGlzdHMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxUeXBlTWFwcGluZywgSXRlcmFibGU8UXVlcnk+Pih0aGlzLmdldEFsbEphdmFUeXBlTWFwcGluZ3NVbmlxdWUoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFF1ZXJ5PiB0cmFuc2Zvcm0oVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJCQkJCXJldHVybiB0eXBlTWFwcGluZy5nZXRRdWVyaWVzKCk7Ci0JCQkJCX0KLQkJCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxUeXBlTWFwcGluZz4gZ2V0QWxsSmF2YVR5cGVNYXBwaW5nc1VuaXF1ZSgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4odGhpcy5nZXRBbGxKYXZhUGVyc2lzdGVudFR5cGVzVW5pcXVlKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJCQkJCXJldHVybiBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQkJCX0KLQkJCQl9OwotCX0KLQotCXByb3RlY3RlZCA8TiBleHRlbmRzIEpwYU5hbWVkQ29udGV4dE5vZGU+IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8Tj4+IG1hcEJ5TmFtZShJdGVyYWJsZTxOPiBub2RlcykgewotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE4+PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxOPj4oKTsKLQkJZm9yIChOIG5vZGUgOiBub2RlcykgewotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlBcnJheUxpc3Q8Tj4gbGlzdCA9IG1hcC5nZXQobm9kZU5hbWUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PE4+KCk7Ci0JCQkJbWFwLnB1dChub2RlTmFtZSwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChub2RlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW50IHR5cGVzICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0UGVyc2lzdGVudFR5cGVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPigKLQkJCQl0aGlzLmdldE1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVzKCksCi0JCQkJdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGVzKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBnZXRNYXBwaW5nRmlsZVBlcnNpc3RlbnRUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4odGhpcy5nZXRNYXBwaW5nRmlsZVBlcnNpc3RlbnRUeXBlTGlzdHMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZT4+IGdldE1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyLCBJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+PigKLQkJCQkJdGhpcy5nZXRNYXBwaW5nRmlsZVJlZnMoKSwKLQkJCQkJUGVyc2lzdGVudFR5cGVDb250YWluZXIuVFJBTlNGT1JNRVIKLQkJCQkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIEphdmEgcGVyc2lzdGVudCB0eXBlcywgYXMgc3BlY2lmaWVkIGJ5Ci0JICogdGhlIGNsYXNzIHJlZnMgKGJvdGggc3BlY2lmaWVkIGFuZCBpbXBsaWVkKSBhbmQgamFyIGZpbGVzLgotCSAqIFRoZXJlIGNhbiBiZSBkdXBsaWNhdGUgdHlwZXMsIGFuZCBhbnkgb2YgdGhlbSBtYXkgYmUgb3ZlcnJpZGRlbiBieSBhCi0JICogbWFwcGluZyBmaWxlIHBlcnNpc3RlbmNlIHR5cGUuCi0JICogQHNlZSAjZ2V0TWFwcGluZ0ZpbGVQZXJzaXN0ZW50VHlwZXMoKQotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4oCi0JCQkJdGhpcy5nZXRDbGFzc1JlZlBlcnNpc3RlbnRUeXBlcygpLAotCQkJCXRoaXMuZ2V0SmFyRmlsZVBlcnNpc3RlbnRUeXBlcygpCi0JCQkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGNsYXNzIHJlZiBwZXJzaXN0ZW50IHR5cGVzLAotCSAqIGJvdGggc3BlY2lmaWVkIGFuZCBpbXBsaWVkLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0Q2xhc3NSZWZQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+KAotCQkJCQl0aGlzLmdldENsYXNzUmVmUGVyc2lzdGVudFR5cGVzXygpLAotCQkJCQlOb3ROdWxsRmlsdGVyLjxQZXJzaXN0ZW50VHlwZT5pbnN0YW5jZSgpCi0JCQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBCb3RoIHNwZWNpZmllZCBhbmQgaW1wbGllZC4gTWF5IGNvbnRhaW4gPGNvZGU+bnVsbDwvY29kZT5zLgotCSAqIEBzZWUgI2dldENsYXNzUmVmUGVyc2lzdGVudFR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+IGdldENsYXNzUmVmUGVyc2lzdGVudFR5cGVzXygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPENsYXNzUmVmLCBQZXJzaXN0ZW50VHlwZT4odGhpcy5nZXRDbGFzc1JlZnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgdHJhbnNmb3JtKENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCQkJcmV0dXJuIGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFdlIG9ubHkgZ2V0IDxlbT5hbm5vdGF0ZWQ8L2VtPiB0eXBlcyBmcm9tIGphciBmaWxlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+IGdldEphckZpbGVQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+KHRoaXMuZ2V0SmFyRmlsZVBlcnNpc3RlbnRUeXBlTGlzdHMoKSk7Ci0JfQotCi0JLyoqCi0JICogV2Ugb25seSBnZXQgPGVtPmFubm90YXRlZDwvZW0+IHR5cGVzIGZyb20gamFyIGZpbGVzLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+PiBnZXRKYXJGaWxlUGVyc2lzdGVudFR5cGVMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyLCBJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+PigKLQkJCQl0aGlzLmdldEphckZpbGVSZWZzKCksCi0JCQkJUGVyc2lzdGVudFR5cGVDb250YWluZXIuVFJBTlNGT1JNRVIKLQkJCSk7Ci0JfQotCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gc2VhcmNoIG9yZGVyIGlzIHNpZ25pZmljYW50KD8pCi0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiB0aGlzLmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IG1hcHBpbmdGaWxlUmVmLmdldFBlcnNpc3RlbnRUeXBlKHR5cGVOYW1lKTsKLQkJCWlmIChwZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbnRUeXBlOwotCQkJfQotCQl9Ci0JCWZvciAoQ2xhc3NSZWYgY2xhc3NSZWYgOiB0aGlzLmdldENsYXNzUmVmcygpKSB7Ci0JCQlpZiAoY2xhc3NSZWYuaXNGb3IodHlwZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9Ci0JCWZvciAoSmFyRmlsZVJlZiBqYXJGaWxlUmVmIDogdGhpcy5nZXRKYXJGaWxlUmVmcygpKSB7Ci0JCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGphckZpbGVSZWYuZ2V0UGVyc2lzdGVudFR5cGUodHlwZU5hbWUpOwotCQkJaWYgKHBlcnNpc3RlbnRUeXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSWdub3JlIGltcGxpZWQgY2xhc3MgcmVmcyBhbmQgamFyIGZpbGVzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNwZWNpZmllc1BlcnNpc3RlbnRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogdGhpcy5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKSkgewotCQkJaWYgKGNsYXNzUmVmLmlzRm9yKHR5cGVOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiB0aGlzLmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQlpZiAobWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVudFR5cGUodHlwZU5hbWUpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiA8ZW0+YWxsPC9lbT4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBKYXZhIHBlcnNpc3RlbnQKLQkgKiB0eXBlcyAoaW5jbHVkaW5nIHRob3NlIHJlZmVyZW5jZWQgYnkgdGhlIG1hcHBpbmcgZmlsZXMgdGhhdCBhcmUgbm90Ci0JICogbWFya2VkICJtZXRhZGF0YSBjb21wbGV0ZSIpIHdpdGggdGhvc2Ugd2l0aCBkdXBsaWNhdGUgbmFtZXMgcmVtb3ZlZC4KLQkgKiBBbHRob3VnaCB0aGlzIG1heSBub3QgYWx3YXlzIGJlIHRydWUsIGFzc3VtZSBwZXJzaXN0ZW50IHR5cGVzIHdpdGgKLQkgKiB0aGUgc2FtZSBuYW1lIHJlZmVyZW5jZSB0aGUgc2FtZSBKYXZhIHR5cGUuICg8c3Ryb25nPk5COjwvc3Ryb25nPgotCSAqIEl0J3MgcG9zc2libGUgdGhhdCBhIEphdmEgY2xhc3MgaW4gYSBqYXIgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhCi0JICogSmF2YSBjbGFzcyBpbiB0aGUgcHJvamVjdCBhbmQgdGhleSBiZSBkaWZmZXJlbnQuLi4uKQotCSAqIDxwPgotCSAqIFRoaXMgaXMgcmVhbGx5IG9ubHkgdXNlZnVsIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgZ2VuZXJhdG9ycyBhbmQgcXVlcmllcywKLQkgKiB3aGljaCBjYW4gYmUgZGVmaW5lZCBpbiBKYXZhIGFubm90YXRpb25zIGJ1dCBzdGlsbCBiZSAiYWN0aXZlIiBldmVuCi0JICogdGhvdWdoIHRoZWlyIGNvcnJlc3BvbmRpbmcgSmF2YSB0eXBlcy9hdHRyaWJ1dGVzIGhhdmUgYmVlbiBvdmVycmlkZGVuIGluCi0JICogYSBtYXBwaW5nIGZpbGUuCi0JICogPHA+Ci0JICogVGhlIG9yZGVyIG9mIHByZWNlZGVuY2U6PHVsPgotCSAqIDxsaT5tYXBwaW5nIGZpbGVzCi0JICogPGxpPnBlcnNpc3RlbmNlIHVuaXQgY2xhc3MgcmVmcwotCSAqIDxsaT5qYXIgZmlsZXMKLQkgKiA8L3VsPgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0QWxsSmF2YVBlcnNpc3RlbnRUeXBlc1VuaXF1ZSgpIHsKLQkJLy8gb3JkZXIgaXMgc2lnbmlmaWNhbnQoPykKLQkJSGFzaE1hcDxTdHJpbmcsIFBlcnNpc3RlbnRUeXBlPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFBlcnNpc3RlbnRUeXBlPigpOwotCQl0aGlzLmFkZFBlcnNpc3RlbnRUeXBlc1RvKHRoaXMuZ2V0SmFyRmlsZVBlcnNpc3RlbnRUeXBlcygpLCBtYXApOwotCQl0aGlzLmFkZFBlcnNpc3RlbnRUeXBlc1RvKHRoaXMuZ2V0Q2xhc3NSZWZQZXJzaXN0ZW50VHlwZXMoKSwgbWFwKTsKLQkJdGhpcy5hZGRQZXJzaXN0ZW50VHlwZXNUbyh0aGlzLmdldE1hcHBpbmdGaWxlSmF2YVBlcnNpc3RlbnRUeXBlcygpLCBtYXApOwotCQlyZXR1cm4gbWFwLnZhbHVlcygpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgc3BlY2lmaWVkIHBlcnNpc3RlbnQgdHlwZXMgdG8KLQkgKiB0aGUgc3BlY2lmaWVkIG1hcCBrZXllZCBieSBwZXJzaXN0ZW50IHR5cGUgbmFtZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJzaXN0ZW50VHlwZXNUbyhJdGVyYWJsZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IHBlcnNpc3RlbnRUeXBlcywgSGFzaE1hcDxTdHJpbmcsIFBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZU1hcCkgewotCQlmb3IgKFBlcnNpc3RlbnRUeXBlIHB0IDogcGVyc2lzdGVudFR5cGVzKSB7Ci0JCQlTdHJpbmcgcHROYW1lID0gcHQuZ2V0TmFtZSgpOwotCQkJaWYgKHB0TmFtZSAhPSBudWxsKSB7Ci0JCQkJcGVyc2lzdGVudFR5cGVNYXAucHV0KHB0TmFtZSwgcHQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBub24tPGNvZGU+bnVsbDwvY29kZT4gbWFwcGluZyBmaWxlIEphdmEgcGVyc2lzdGVudCB0eXBlczsKLQkgKiBpLmUuIHRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbWFwcGluZyBmaWxlCi0JICogcGVyc2lzdGVudCB0eXBlcyB0aGF0IGFyZSBub3QgbWFya2VkICJtZXRhZGF0YSBjb21wbGV0ZSIuCi0JICogQHNlZSAjZ2V0QWxsSmF2YVBlcnNpc3RlbnRUeXBlc1VuaXF1ZSgpCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlPiBnZXRNYXBwaW5nRmlsZUphdmFQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8UGVyc2lzdGVudFR5cGU+KAotCQkJCQl0aGlzLmdldE1hcHBpbmdGaWxlSmF2YVBlcnNpc3RlbnRUeXBlc18oKSwKLQkJCQkJTm90TnVsbEZpbHRlci48UGVyc2lzdGVudFR5cGU+aW5zdGFuY2UoKQotCQkJCSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJldHVybmVkIGxpc3Qgd2lsbCBjb250YWluIGEgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGVhY2ggbWFwcGluZyBmaWxlCi0JICogcGVyc2lzdGVudCB0eXBlIHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbiBleGlzdGluZyBKYXZhIHR5cGUgb3IgaXMKLQkgKiBtYXJrZWQgIm1ldGFkYXRhIGNvbXBsZXRlIi4KLQkgKiBAc2VlICNnZXRNYXBwaW5nRmlsZUphdmFQZXJzaXN0ZW50VHlwZXMoKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxQZXJzaXN0ZW50VHlwZT4gZ2V0TWFwcGluZ0ZpbGVKYXZhUGVyc2lzdGVudFR5cGVzXygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlLCBQZXJzaXN0ZW50VHlwZT4odGhpcy5nZXRNYXBwaW5nRmlsZVBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgbWFwcGluZ0ZpbGVQZXJzaXN0ZW50VHlwZSkgewotCQkJCXJldHVybiBtYXBwaW5nRmlsZVBlcnNpc3RlbnRUeXBlLmdldE92ZXJyaWRkZW5QZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0eXBlIG1hcHBpbmdzICoqKioqKioqKioKLQotCXB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5KFN0cmluZyB0eXBlTmFtZSkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0VHlwZU1hcHBpbmcodHlwZU5hbWUpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkYWJsZSBnZXRFbWJlZGRhYmxlKFN0cmluZyB0eXBlTmFtZSkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0VHlwZU1hcHBpbmcodHlwZU5hbWUpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW1iZWRkYWJsZSkgPyAoRW1iZWRkYWJsZSkgdHlwZU1hcHBpbmcgOiBudWxsOwotCX0KLQotCS8vIFRPRE8gYmp2IC0gdGhpcyBzaG91bGQgcHJvYmFibHkgKm5vdCogcmV0dXJuIEphdmEgdHlwZSBtYXBwaW5ncyB3aGVuIFBVIGlzICJtZXRhZGF0YSBjb21wbGV0ZSIuLi4KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXRQZXJzaXN0ZW50VHlwZSh0eXBlTmFtZSk7Ci0JCXJldHVybiAocGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgPyBudWxsIDogcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxFbnRpdHk+IGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXJUb0VudGl0aWVzKHRoaXMuZ2V0VHlwZU1hcHBpbmdzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxFbnRpdHk+IGZpbHRlclRvRW50aXRpZXMoSXRlcmFibGU8VHlwZU1hcHBpbmc+IHR5cGVNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxUeXBlTWFwcGluZywgRW50aXR5Pih0aGlzLmZpbHRlclRvRW50aXRpZXNfKHR5cGVNYXBwaW5ncykpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxUeXBlTWFwcGluZz4gZmlsdGVyVG9FbnRpdGllc18oSXRlcmFibGU8VHlwZU1hcHBpbmc+IHR5cGVNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFR5cGVNYXBwaW5nPih0eXBlTWFwcGluZ3MpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJCQkJcmV0dXJuIHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5OwotCQkJCX0KLQkJCX07Ci0JfQotCi0JLy8gVE9ETyBianYgLSB0aGlzIHNob3VsZCBwcm9iYWJseSAqbm90KiByZXR1cm4gSmF2YSB0eXBlIG1hcHBpbmdzIHdoZW4gUFUgaXMgIm1ldGFkYXRhIGNvbXBsZXRlIi4uLgotCXByb3RlY3RlZCBJdGVyYWJsZTxUeXBlTWFwcGluZz4gZ2V0VHlwZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVudFR5cGUsIFR5cGVNYXBwaW5nPih0aGlzLmdldFBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSkgewotCQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOyAgLy8gdGhlIG1hcHBpbmcgc2hvdWxkIG5ldmVyIGJlIG51bGwKLQkJCQl9Ci0JCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgImFjdGl2ZSIgZW50aXRpZXMuCi0JICogQHNlZSAjZ2V0QWN0aXZlVHlwZU1hcHBpbmdzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8RW50aXR5PiBnZXRBY3RpdmVFbnRpdGllcygpIHsKLQkJcmV0dXJuIHRoaXMuZmlsdGVyVG9FbnRpdGllcyh0aGlzLmdldEFjdGl2ZVR5cGVNYXBwaW5ncygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlICJhY3RpdmUiIHR5cGUgbWFwcGluZ3MsIGkuZS4gdGhlIG1hcHBpbmcgZmlsZSB0eXBlIG1hcHBpbmdzIGFuZAotCSAqIHRoZSBKYXZhIHR5cGUgbWFwcGluZ3MgdGhhdCBhcmUgbm90ICJvdmVycmlkZGVuIiBieSBtYXBwaW5nIGZpbGUKLQkgKiB0eXBlIG1hcHBpbmdzIChieSBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lKS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8VHlwZU1hcHBpbmc+IGdldEFjdGl2ZVR5cGVNYXBwaW5ncygpewotCQlBcnJheUxpc3Q8VHlwZU1hcHBpbmc+IHJlc3VsdCA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZ2V0TWFwcGluZ0ZpbGVUeXBlTWFwcGluZ3MoKSk7Ci0KLQkJSGFzaFNldDxTdHJpbmc+IG1hcHBpbmdGaWxlQ2xhc3NOYW1lcyA9IHRoaXMuY29udmVydFRvQ2xhc3NOYW1lcyhyZXN1bHQpOwotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PFR5cGVNYXBwaW5nPj4gamF2YVR5cGVNYXBwaW5ncyA9IHRoaXMubWFwVHlwZU1hcHBpbmdzQnlDbGFzc05hbWUodGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdzKCkpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxUeXBlTWFwcGluZz4+IGVudHJ5IDogamF2YVR5cGVNYXBwaW5ncy5lbnRyeVNldCgpKSB7Ci0JCQlpZiAoICEgbWFwcGluZ0ZpbGVDbGFzc05hbWVzLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgewotCQkJCXJlc3VsdC5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIHR5cGUgbWFwcGluZ3MgZGVmaW5lZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIG1hcHBpbmcKLQkgKiBmaWxlcyAoaS5lLiBleGNsdWRpbmcgdGhlIEphdmEgdHlwZSBtYXBwaW5ncykuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFR5cGVNYXBwaW5nPiBnZXRNYXBwaW5nRmlsZVR5cGVNYXBwaW5ncygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4odGhpcy5nZXRNYXBwaW5nRmlsZVBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBIYXNoU2V0PFN0cmluZz4gY29udmVydFRvQ2xhc3NOYW1lcyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gdHlwZU1hcHBpbmdzKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPih0eXBlTWFwcGluZ3Muc2l6ZSgpKTsKLQkJZm9yIChUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA6IHR5cGVNYXBwaW5ncykgewotCQkJY2xhc3NOYW1lcy5hZGQodHlwZU1hcHBpbmcuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIG1hcCBvZiB0aGUgdHlwZSBtYXBwaW5ncyBrZXllZCBieSBmdWxsIHF1YWxpZmllZCBjbGFzcyBuYW1lLgotCSAqIFNpbmNlIHRoZXJlIGNhbiBiZSBkdXBsaWNhdGUgKGVycm9uZW91c2x5KSBjbGFzcyBuYW1lcywKLQkgKiBlYWNoIGNsYXNzIG5hbWUgaXMgbWFwcGVkIHRvIGEgPGVtPmxpc3Q8L2VtPiBvZiB0eXBlIG1hcHBpbmdzLgotCSAqLwotCXByb3RlY3RlZCA8TSBleHRlbmRzIFR5cGVNYXBwaW5nPiBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE0+PiBtYXBUeXBlTWFwcGluZ3NCeUNsYXNzTmFtZShJdGVyYWJsZTxNPiB0eXBlTWFwcGluZ3MpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxNPj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8TT4+KCk7Ci0JCWZvciAoTSB0eXBlTWFwcGluZyA6IHR5cGVNYXBwaW5ncykgewotCQkJU3RyaW5nIHR5cGVNYXBwaW5nTmFtZSA9IHR5cGVNYXBwaW5nLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpOwotCQkJQXJyYXlMaXN0PE0+IGxpc3QgPSBtYXAuZ2V0KHR5cGVNYXBwaW5nTmFtZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8TT4oKTsKLQkJCQltYXAucHV0KHR5cGVNYXBwaW5nTmFtZSwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZCh0eXBlTWFwcGluZyk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQkvKioKLQkgKiBUaGVzZSBtYXkgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgbWFwcGluZyBmaWxlcy4KLQkgKiBAc2VlICNnZXRKYXZhUGVyc2lzdGVudFR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8VHlwZU1hcHBpbmc+IGdldEphdmFUeXBlTWFwcGluZ3MoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxQZXJzaXN0ZW50VHlwZSwgVHlwZU1hcHBpbmc+KHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0cmFuc2Zvcm0oUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQkJCQlyZXR1cm4gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXQgZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQ7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlmb3IgKEphckZpbGVSZWYgamFyRmlsZVJlZiA6IHRoaXMuZ2V0SmFyRmlsZVJlZnMoKSkgewotCQkJaWYgKGphckZpbGVSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCkpIHsKLQkJCQlyZXR1cm4gamFyRmlsZVJlZjsKLQkJCX0KLQkJfQotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogdGhpcy5nZXRNYXBwaW5nRmlsZVJlZnMoKSkgewotCQkJaWYgKG1hcHBpbmdGaWxlUmVmLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmOwotCQkJfQotCQl9Ci0JCWZvciAoQ2xhc3NSZWYgY2xhc3NSZWYgOiB0aGlzLmdldENsYXNzUmVmcygpKSB7Ci0JCQlpZiAoY2xhc3NSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCkpIHsKLQkJCQlyZXR1cm4gY2xhc3NSZWY7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuICh0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSAmJiB0aGlzLnhtbFBlcnNpc3RlbmNlVW5pdC5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXN1cGVyLnRvU3RyaW5nKHNiKTsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlTWFwcGluZ0ZpbGVzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVDbGFzc1JlZnMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZUphckZpbGVSZWZzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVQcm9wZXJ0aWVzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVHZW5lcmF0b3JzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVRdWVyaWVzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVFbnRpdHlOYW1lcyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwcGluZ0ZpbGVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy5jaGVja0Zvck11bHRpcGxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobWVzc2FnZXMpOwotCQl0aGlzLmNoZWNrRm9yRHVwbGljYXRlTWFwcGluZ0ZpbGVSZWZzKG1lc3NhZ2VzKTsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IHRoaXMuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCW1hcHBpbmdGaWxlUmVmLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQkJdGhpcy5jaGVja0ZvckR1cGxpY2F0ZU1hcHBpbmdGaWxlQ2xhc3NlcyhtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JNdWx0aXBsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUFycmF5TGlzdDxNYXBwaW5nRmlsZVJlZj4gcHVtZE1hcHBpbmdGaWxlUmVmcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGFNYXBwaW5nRmlsZVJlZnMoKSk7Ci0JCWlmIChwdW1kTWFwcGluZ0ZpbGVSZWZzLnNpemUoKSA+IDEpIHsKLQkJCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBwdW1kTWFwcGluZ0ZpbGVSZWZzKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX0ZJTEVfRVhUUkFORU9VU19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBLAotCQkJCQkJbmV3IFN0cmluZ1tdIHttYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpfSwKLQkJCQkJCW1hcHBpbmdGaWxlUmVmLmdldE1hcHBpbmdGaWxlKCksCi0JCQkJCQltYXBwaW5nRmlsZVJlZi5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxNYXBwaW5nRmlsZVJlZj4gZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGFNYXBwaW5nRmlsZVJlZnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+KHRoaXMuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLnBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRXhpc3RzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JEdXBsaWNhdGVNYXBwaW5nRmlsZVJlZnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8TWFwcGluZ0ZpbGVSZWY+PiBlbnRyeSA6IHRoaXMubWFwTWFwcGluZ0ZpbGVSZWZzQnlGaWxlTmFtZSgpLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IGVudHJ5LmdldEtleSgpOwotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzTm90RW1wdHkoZmlsZU5hbWUpKSB7Ci0JCQkJQXJyYXlMaXN0PE1hcHBpbmdGaWxlUmVmPiBkdXBzID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZHVwcy5zaXplKCkgPiAxKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1tdIHtmaWxlTmFtZX07Ci0JCQkJCWZvciAoTWFwcGluZ0ZpbGVSZWYgZHVwIDogZHVwcykgewotCQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfTUFQUElOR19GSUxFLAotCQkJCQkJCQlwYXJtcywKLQkJCQkJCQkJZHVwLAotCQkJCQkJCQlkdXAuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCQkJKQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIG1hcHBpbmcgZmlsZSByZWZzLCBib3RoIGRlZmF1bHQgYW5kCi0JICogc3BlY2lmaWVkLCBrZXllZCBieSB0aGVpciBmaWxlIG5hbWVzLgotCSAqLwotCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE1hcHBpbmdGaWxlUmVmPj4gbWFwTWFwcGluZ0ZpbGVSZWZzQnlGaWxlTmFtZSgpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxNYXBwaW5nRmlsZVJlZj4+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE1hcHBpbmdGaWxlUmVmPj4odGhpcy5nZXRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogdGhpcy5nZXRNYXBwaW5nRmlsZVJlZnMoKSkgewotCQkJU3RyaW5nIGZpbGVOYW1lID0gbWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKLQkJCUFycmF5TGlzdDxNYXBwaW5nRmlsZVJlZj4gbGlzdCA9IG1hcC5nZXQoZmlsZU5hbWUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PE1hcHBpbmdGaWxlUmVmPigpOwotCQkJCW1hcC5wdXQoZmlsZU5hbWUsIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JEdXBsaWNhdGVNYXBwaW5nRmlsZUNsYXNzZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8UGVyc2lzdGVudFR5cGU+PiBlbnRyeSA6IHRoaXMubWFwTWFwcGluZ0ZpbGVQZXJzaXN0ZW50VHlwZXNCeU5hbWUoKS5lbnRyeVNldCgpKSB7Ci0JCQlTdHJpbmcgcHROYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNOb3RFbXB0eShwdE5hbWUpKSB7Ci0JCQkJQXJyYXlMaXN0PFBlcnNpc3RlbnRUeXBlPiBkdXBzID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZHVwcy5zaXplKCkgPiAxKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1tdIHtwdE5hbWV9OwotCQkJCQlmb3IgKFBlcnNpc3RlbnRUeXBlIGR1cCA6IGR1cHMpIHsKLQkJCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX0RVUExJQ0FURV9DTEFTUywKLQkJCQkJCQkJcGFybXMsCi0JCQkJCQkJCWR1cCwKLQkJCQkJCQkJZHVwLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkJCSkKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBtYXBwaW5nIGZpbGUgcGVyc2lzdGVudCB0eXBlcwotCSAqIGtleWVkIGJ5IHRoZWlyIGNsYXNzIG5hbWVzLgotCSAqLwotCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PFBlcnNpc3RlbnRUeXBlPj4gbWFwTWFwcGluZ0ZpbGVQZXJzaXN0ZW50VHlwZXNCeU5hbWUoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8UGVyc2lzdGVudFR5cGU+PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxQZXJzaXN0ZW50VHlwZT4+KCk7Ci0JCWZvciAoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgOiB0aGlzLmdldE1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVzKCkpIHsKLQkJCVN0cmluZyBwdE5hbWUgPSBwZXJzaXN0ZW50VHlwZS5nZXROYW1lKCk7Ci0JCQlBcnJheUxpc3Q8UGVyc2lzdGVudFR5cGU+IGxpc3QgPSBtYXAuZ2V0KHB0TmFtZSk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3Q8UGVyc2lzdGVudFR5cGU+KCk7Ci0JCQkJbWFwLnB1dChwdE5hbWUsIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQocGVyc2lzdGVudFR5cGUpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVDbGFzc1JlZnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQl0aGlzLmNoZWNrRm9yRHVwbGljYXRlQ2xhc3NSZWZzKG1lc3NhZ2VzKTsKLQkJZm9yIChDbGFzc1JlZiBjbGFzc1JlZiA6IHRoaXMuZ2V0Q2xhc3NSZWZzKCkpIHsKLQkJCWNsYXNzUmVmLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckR1cGxpY2F0ZUNsYXNzUmVmcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxDbGFzc1JlZj4+IGVudHJ5IDogdGhpcy5tYXBDbGFzc1JlZnNCeU5hbWUoKS5lbnRyeVNldCgpKSB7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNOb3RFbXB0eShjbGFzc05hbWUpKSB7Ci0JCQkJQXJyYXlMaXN0PENsYXNzUmVmPiBkdXBzID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZHVwcy5zaXplKCkgPiAxKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1tdIHtjbGFzc05hbWV9OwotCQkJCQlmb3IgKENsYXNzUmVmIGR1cCA6IGR1cHMpIHsKLQkJCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTLAotCQkJCQkJCQlwYXJtcywKLQkJCQkJCQkJZHVwLAotCQkJCQkJCQlkdXAuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJCQkJKQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGNsYXNzIHJlZnMsIGJvdGggc3BlY2lmaWVkIGFuZCBpbXBsaWVkLAotCSAqIGtleWVkIGJ5IHRoZWlyIGNsYXNzIG5hbWVzLgotCSAqLwotCXByb3RlY3RlZCBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PENsYXNzUmVmPj4gbWFwQ2xhc3NSZWZzQnlOYW1lKCkgewotCQlIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PENsYXNzUmVmPj4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8Q2xhc3NSZWY+Pih0aGlzLmdldENsYXNzUmVmc1NpemUoKSk7Ci0JCWZvciAoQ2xhc3NSZWYgY2xhc3NSZWYgOiB0aGlzLmdldENsYXNzUmVmcygpKSB7Ci0JCQlTdHJpbmcgcmVmTmFtZSA9IGNsYXNzUmVmLmdldENsYXNzTmFtZSgpOwotCQkJQXJyYXlMaXN0PENsYXNzUmVmPiBsaXN0ID0gbWFwLmdldChyZWZOYW1lKTsKLQkJCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxDbGFzc1JlZj4oKTsKLQkJCQltYXAucHV0KHJlZk5hbWUsIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQoY2xhc3NSZWYpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKYXJGaWxlUmVmcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMuY2hlY2tGb3JEdXBsaWNhdGVKYXJGaWxlUmVmcyhtZXNzYWdlcyk7Ci0JCWZvciAoSmFyRmlsZVJlZiBqYXJGaWxlUmVmIDogdGhpcy5nZXRKYXJGaWxlUmVmcygpKSB7Ci0JCQlqYXJGaWxlUmVmLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckR1cGxpY2F0ZUphckZpbGVSZWZzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWZvciAoTWFwLkVudHJ5PFN0cmluZywgQXJyYXlMaXN0PEphckZpbGVSZWY+PiBlbnRyeSA6IHRoaXMubWFwSmFyRmlsZVJlZnNCeU5hbWUoKS5lbnRyeVNldCgpKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc05vdEVtcHR5KGZpbGVOYW1lKSkgewotCQkJCUFycmF5TGlzdDxKYXJGaWxlUmVmPiBkdXBzID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZHVwcy5zaXplKCkgPiAxKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1tdIHtmaWxlTmFtZX07Ci0JCQkJCWZvciAoSmFyRmlsZVJlZiBkdXAgOiBkdXBzKSB7Ci0JCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9KQVJfRklMRSwKLQkJCQkJCQkJcGFybXMsCi0JCQkJCQkJCWR1cCwKLQkJCQkJCQkJZHVwLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCQkJCSkKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBqYXIgZmlsZSByZWZzCi0JICoga2V5ZWQgYnkgdGhlaXIgZmlsZSBuYW1lcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxKYXJGaWxlUmVmPj4gbWFwSmFyRmlsZVJlZnNCeU5hbWUoKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8SmFyRmlsZVJlZj4+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PEphckZpbGVSZWY+Pih0aGlzLmdldEphckZpbGVSZWZzU2l6ZSgpKTsKLQkJZm9yIChKYXJGaWxlUmVmIGphckZpbGVSZWYgOiB0aGlzLmdldEphckZpbGVSZWZzKCkpIHsKLQkJCVN0cmluZyByZWZOYW1lID0gamFyRmlsZVJlZi5nZXRGaWxlTmFtZSgpOwotCQkJQXJyYXlMaXN0PEphckZpbGVSZWY+IGxpc3QgPSBtYXAuZ2V0KHJlZk5hbWUpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0PEphckZpbGVSZWY+KCk7Ci0JCQkJbWFwLnB1dChyZWZOYW1lLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKGphckZpbGVSZWYpOwotCQl9Ci0JCXJldHVybiBtYXA7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVQcm9wZXJ0aWVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCi0JLyoqCi0JICogV2UgdmFsaWRhdGUgZ2VuZXJhdG9ycyBoZXJlIGJlY2F1c2UgSmF2YSBwZXJzaXN0ZW50IHR5cGVzIHRoYXQgYXJlCi0JICogb3ZlcnJpZGRlbiBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZSBhcmUKLQkgKiBub3QgdmFsaWRhdGVkLCBidXQgdGhleSBtYXkgY29udGFpbiBnZW5lcmF0b3JzIHRoYXQgYXJlIHN0aWxsICJhY3RpdmUiCi0JICogYW5kIG5lZWQgdG8gYmUgdmFsaWRhdGVkCi0JICogKGkuZS4gYSBnZW5lcmF0b3IgaXMgPGVtPm5vdDwvZW0+IG92ZXJyaWRkZW4gd2hlbiBpdHMgZW50aXR5IG9yIElECi0JICogbWFwcGluZyBpcyBvdmVycmlkZGVuIGluIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlKS4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiA8ZW0+QW55PC9lbT4gPGNvZGU+b3JtLnhtbDwvY29kZT4gZ2VuZXJhdG9yIGNhbgotCSAqIG92ZXJyaWRlIDxlbT5hbnk8L2VtPiBKYXZhIGdlbmVyYXRvciB3aXRoIHRoZSBzYW1lIG5hbWU7IHRoZXkgbmVlZCBub3QKLQkgKiBiZSBkZWZpbmVkIG9uIHRoZSBzYW1lIGVudGl0eSBvciBJRCBtYXBwaW5nLiBKdXN0IGEgYml0IGluY29uc2lzdGVudCB3aXRoCi0JICogdGhlIHR5cGljYWwgIm92ZXJyaWRlIiBpbiBKUEEuLi4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVHZW5lcmF0b3JzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy5jaGVja0ZvckR1cGxpY2F0ZUdlbmVyYXRvcnMobWVzc2FnZXMpOwotCQlmb3IgKEdlbmVyYXRvciBnZW5lcmF0b3IgOiB0aGlzLmdldEdlbmVyYXRvcnMoKSkgewotCQkJdGhpcy52YWxpZGF0ZShnZW5lcmF0b3IsIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0ZvckR1cGxpY2F0ZUdlbmVyYXRvcnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxHZW5lcmF0b3I+PiBnZW5lcmF0b3JzQnlOYW1lID0gdGhpcy5tYXBCeU5hbWUodGhpcy5nZXRHZW5lcmF0b3JzKCkpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxHZW5lcmF0b3I+PiBlbnRyeSA6IGdlbmVyYXRvcnNCeU5hbWUuZW50cnlTZXQoKSkgewotCQkJU3RyaW5nIGdlbmVyYXRvck5hbWUgPSBlbnRyeS5nZXRLZXkoKTsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc05vdEVtcHR5KGdlbmVyYXRvck5hbWUpKSB7ICAvLyBpZ25vcmUgZW1wdHkgbmFtZXMKLQkJCQlBcnJheUxpc3Q8R2VuZXJhdG9yPiBkdXBzID0gZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQlpZiAoZHVwcy5zaXplKCkgPiAxKSB7Ci0JCQkJCVN0cmluZ1tdIHBhcm1zID0gbmV3IFN0cmluZ1tdIHtnZW5lcmF0b3JOYW1lfTsKLQkJCQkJZm9yIChHZW5lcmF0b3IgZHVwIDogZHVwcykgewotCQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FLAotCQkJCQkJCQlwYXJtcywKLQkJCQkJCQkJZHVwLAotCQkJCQkJCQl0aGlzLmV4dHJhY3ROYW1lVGV4dFJhbmdlKGR1cCkKLQkJCQkJCQkpCi0JCQkJCQkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gVE9ETyBianYgaXNuJ3QgaXQgb2J2aW91cz8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGV4dHJhY3ROYW1lVGV4dFJhbmdlKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJcmV0dXJuIChnZW5lcmF0b3IgaW5zdGFuY2VvZiBPcm1HZW5lcmF0b3IpID8KLQkJCQkoKE9ybUdlbmVyYXRvcikgZ2VuZXJhdG9yKS5nZXROYW1lVGV4dFJhbmdlKCkgOgotCQkJCSgoSmF2YUdlbmVyYXRvcikgZ2VuZXJhdG9yKS5nZXROYW1lVGV4dFJhbmdlKG51bGwpOwotCX0KLQotCS8vIFRPRE8gYmp2IGlzbid0IGl0IG9idmlvdXM/Ci0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoR2VuZXJhdG9yIGdlbmVyYXRvciwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgT3JtR2VuZXJhdG9yKSB7Ci0JCQkoKE9ybUdlbmVyYXRvcikgZ2VuZXJhdG9yKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9IGVsc2UgewotCQkJKChKYXZhR2VuZXJhdG9yKSBnZW5lcmF0b3IpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBXZSB2YWxpZGF0ZSBxdWVyaWVzIGhlcmUuCi0JICogQHNlZSAjdmFsaWRhdGVHZW5lcmF0b3JzKExpc3QsIElSZXBvcnRlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVF1ZXJpZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQl0aGlzLmNoZWNrRm9yRHVwbGljYXRlUXVlcmllcyhtZXNzYWdlcyk7Ci0KLQkJSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyID0gdGhpcy5jcmVhdGVKcHFsUXVlcnlIZWxwZXIoKTsKLQotCQlmb3IgKFF1ZXJ5IHF1ZXJ5IDogdGhpcy5nZXRRdWVyaWVzKCkpIHsKLQkJCXRoaXMudmFsaWRhdGUocXVlcnksIHF1ZXJ5SGVscGVyLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JEdXBsaWNhdGVRdWVyaWVzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8UXVlcnk+PiBxdWVyaWVzQnlOYW1lID0gdGhpcy5tYXBCeU5hbWUodGhpcy5nZXRRdWVyaWVzKCkpOwotCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxRdWVyeT4+IGVudHJ5IDogcXVlcmllc0J5TmFtZS5lbnRyeVNldCgpKSB7Ci0JCQlTdHJpbmcgcXVlcnlOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNOb3RFbXB0eShxdWVyeU5hbWUpKSB7ICAvLyBpZ25vcmUgZW1wdHkgbmFtZXMKLQkJCQlBcnJheUxpc3Q8UXVlcnk+IGR1cHMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChkdXBzLnNpemUoKSA+IDEpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nW10ge3F1ZXJ5TmFtZX07Ci0JCQkJCWZvciAoUXVlcnkgZHVwIDogZHVwcykgewotCQkJCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUVVFUllfRFVQTElDQVRFX05BTUUsCi0JCQkJCQkJCXBhcm1zLAotCQkJCQkJCQlkdXAsCi0JCQkJCQkJCXRoaXMuZXh0cmFjdE5hbWVUZXh0UmFuZ2UoZHVwKQotCQkJCQkJCSkKLQkJCQkJCSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPIGJqdiBpc24ndCBpdCBvYnZpb3VzPwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZXh0cmFjdE5hbWVUZXh0UmFuZ2UoUXVlcnkgcXVlcnkpIHsKLQkJcmV0dXJuIChxdWVyeSBpbnN0YW5jZW9mIE9ybVF1ZXJ5KSA/Ci0JCQkJKChPcm1RdWVyeSkgcXVlcnkpLmdldE5hbWVUZXh0UmFuZ2UoKSA6Ci0JCQkJKChKYXZhUXVlcnkpIHF1ZXJ5KS5nZXROYW1lVGV4dFJhbmdlKG51bGwpOwotCX0KLQotCS8vIFRPRE8gYmp2IGlzbid0IGl0IG9idmlvdXM/Ci0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGUoUXVlcnkgcXVlcnksIEpwYUpwcWxRdWVyeUhlbHBlciBxdWVyeUhlbHBlciwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBPcm1RdWVyeSkgewotCQkJKChPcm1RdWVyeSkgcXVlcnkpLnZhbGlkYXRlKHF1ZXJ5SGVscGVyLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJKChKYXZhUXVlcnkpIHF1ZXJ5KS52YWxpZGF0ZShxdWVyeUhlbHBlciwgbWVzc2FnZXMsIHJlcG9ydGVyLCBudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRW50aXR5TmFtZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBBcnJheUxpc3Q8RW50aXR5Pj4gZW50cnkgOiB0aGlzLm1hcFR5cGVNYXBwaW5nc0J5TmFtZSh0aGlzLmdldEFjdGl2ZUVudGl0aWVzKCkpLmVudHJ5U2V0KCkpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gZW50cnkuZ2V0S2V5KCk7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNOb3RFbXB0eShlbnRpdHlOYW1lKSkgewotCQkJCUFycmF5TGlzdDxFbnRpdHk+IGR1cHMgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCWlmIChkdXBzLnNpemUoKSA+IDEpIHsKLQkJCQkJU3RyaW5nW10gcGFybXMgPSBuZXcgU3RyaW5nW10ge2VudGl0eU5hbWV9OwotCQkJCQlmb3IgKEVudGl0eSBkdXAgOiBkdXBzKSB7Ci0JCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTkFNRV9EVVBMSUNBVEVELAotCQkJCQkJCQlwYXJtcywKLQkJCQkJCQkJZHVwLAotCQkJCQkJCQl0aGlzLmV4dHJhY3ROYW1lVGV4dFJhbmdlKGR1cCkKLQkJCQkJCQkpCi0JCQkJCQkpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBtYXAgb2YgdGhlIHR5cGUgbWFwcGluZ3Mga2V5ZWQgYnkgdHlwZSBtYXBwaW5nIG5hbWUgKHR5cGljYWxseQotCSAqIHRoZSBzaG9ydCBjbGFzcyBuYW1lKS4KLQkgKiBTaW5jZSB0aGVyZSBjYW4gYmUgKGVycm9uZW91c2x5KSBkdXBsaWNhdGUgdHlwZSBtYXBwaW5nIG5hbWVzLAotCSAqIGVhY2ggdHlwZSBtYXBwaW5nIG5hbWUgaXMgbWFwcGVkIHRvIGEgPGVtPmxpc3Q8L2VtPiBvZiB0eXBlIG1hcHBpbmdzLgotCSAqLwotCXByb3RlY3RlZCA8TSBleHRlbmRzIFR5cGVNYXBwaW5nPiBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE0+PiBtYXBUeXBlTWFwcGluZ3NCeU5hbWUoSXRlcmFibGU8TT4gdHlwZU1hcHBpbmdzKSB7Ci0JCUhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8TT4+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PE0+PigpOwotCQlmb3IgKE0gdHlwZU1hcHBpbmcgOiB0eXBlTWFwcGluZ3MpIHsKLQkJCVN0cmluZyB0eXBlTWFwcGluZ05hbWUgPSB0eXBlTWFwcGluZy5nZXROYW1lKCk7Ci0JCQlBcnJheUxpc3Q8TT4gbGlzdCA9IG1hcC5nZXQodHlwZU1hcHBpbmdOYW1lKTsKLQkJCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCQlsaXN0ID0gbmV3IEFycmF5TGlzdDxNPigpOwotCQkJCW1hcC5wdXQodHlwZU1hcHBpbmdOYW1lLCBsaXN0KTsKLQkJCX0KLQkJCWxpc3QuYWRkKHR5cGVNYXBwaW5nKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZXh0cmFjdE5hbWVUZXh0UmFuZ2UoRW50aXR5IGVudGl0eSkgewotCQlyZXR1cm4gKGVudGl0eSBpbnN0YW5jZW9mIE9ybUVudGl0eSkgPwotCQkJCSgoT3JtRW50aXR5KSBlbnRpdHkpLmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0TmFtZVRleHRSYW5nZSgpOgotCQkJCSgoSmF2YUVudGl0eSkgZW50aXR5KS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpLmdldE5hbWVUZXh0UmFuZ2UobnVsbCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy54bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGVyc2lzdGVuY2UoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxEZWxldGVFZGl0PiBjcmVhdGVEZWxldGVUeXBlRWRpdHMoZmluYWwgSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPERlbGV0ZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8Q2xhc3NSZWYsIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+Pih0aGlzLmdldFNwZWNpZmllZENsYXNzUmVmcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+IHRyYW5zZm9ybShDbGFzc1JlZiBjbGFzc1JlZikgewotCQkJCQlyZXR1cm4gY2xhc3NSZWYuY3JlYXRlRGVsZXRlVHlwZUVkaXRzKHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8RGVsZXRlRWRpdD4gY3JlYXRlRGVsZXRlTWFwcGluZ0ZpbGVFZGl0cyhmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8RGVsZXRlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nRmlsZVJlZiwgSXRlcmFibGU8RGVsZXRlRWRpdD4+KHRoaXMuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8RGVsZXRlRWRpdD4gdHJhbnNmb3JtKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7Ci0JCQkJCXJldHVybiBtYXBwaW5nRmlsZVJlZi5jcmVhdGVEZWxldGVNYXBwaW5nRmlsZUVkaXRzKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCQl0aGlzLmNyZWF0ZVNwZWNpZmllZENsYXNzUmVmUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJCXRoaXMuY3JlYXRlUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc1JlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVNwZWNpZmllZENsYXNzUmVmUmVuYW1lVHlwZUVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxDbGFzc1JlZiwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldFNwZWNpZmllZENsYXNzUmVmcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oQ2xhc3NSZWYgY2xhc3NSZWYpIHsKLQkJCQkJcmV0dXJuIGNsYXNzUmVmLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5vcHRpb25zLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlU3BlY2lmaWVkQ2xhc3NSZWZNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSksCi0JCQl0aGlzLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlU3BlY2lmaWVkQ2xhc3NSZWZNb3ZlVHlwZUVkaXRzKGZpbmFsIElUeXBlIG9yaWdpbmFsVHlwZSwgZmluYWwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8Q2xhc3NSZWYsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4odGhpcy5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKENsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCQkJCXJldHVybiBjbGFzc1JlZi5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc01vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9ucy5jcmVhdGVNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSk7Ci0JfQotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQl0aGlzLmNyZWF0ZVNwZWNpZmllZENsYXNzUmVmUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQl0aGlzLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVTcGVjaWZpZWRDbGFzc1JlZlJlbmFtZVBhY2thZ2VFZGl0cyhmaW5hbCBJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxDbGFzc1JlZiwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldFNwZWNpZmllZENsYXNzUmVmcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oQ2xhc3NSZWYgY2xhc3NSZWYpIHsKLQkJCQkJcmV0dXJuIGNsYXNzUmVmLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnMuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVGb2xkZXJFZGl0cyhmaW5hbCBJRm9sZGVyIG9yaWdpbmFsRm9sZGVyLCBmaW5hbCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVNYXBwaW5nRmlsZVJlZlJlbmFtZUZvbGRlckVkaXRzKG9yaWdpbmFsRm9sZGVyLCBuZXdOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1hcHBpbmdGaWxlUmVmUmVuYW1lRm9sZGVyRWRpdHMoZmluYWwgSUZvbGRlciBvcmlnaW5hbEZvbGRlciwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nRmlsZVJlZiwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLmNyZWF0ZVJlbmFtZUZvbGRlckVkaXRzKG9yaWdpbmFsRm9sZGVyLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVNYXBwaW5nRmlsZUVkaXRzKGZpbmFsIElGaWxlIG9yaWdpbmFsRmlsZSwgZmluYWwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nRmlsZVJlZiwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLmNyZWF0ZVJlbmFtZU1hcHBpbmdGaWxlRWRpdHMob3JpZ2luYWxGaWxlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIGludCBmaW5kSW5zZXJ0TG9jYXRpb25Gb3JNYXBwaW5nRmlsZVJlZigpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGVyc2lzdGVuY2VVbml0LmdldExvY2F0aW9uVG9JbnNlcnRNYXBwaW5nRmlsZVJlZigpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZU1hcHBpbmdGaWxlRWRpdHMoZmluYWwgSUZpbGUgb3JpZ2luYWxGaWxlLCBmaW5hbCBJUGF0aCBydW50aW5lRGVzdGluYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nRmlsZVJlZiwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLmNyZWF0ZU1vdmVNYXBwaW5nRmlsZUVkaXRzKG9yaWdpbmFsRmlsZSwgcnVudGluZURlc3RpbmF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlRm9sZGVyRWRpdHMoZmluYWwgSUZvbGRlciBvcmlnaW5hbEZvbGRlciwgZmluYWwgSVBhdGggcnVudGltZURlc3RpbmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZU1hcHBpbmdGaWxlUmVmTW92ZUZvbGRlclJlcGxhY2VFZGl0cyhvcmlnaW5hbEZvbGRlciwgcnVudGltZURlc3RpbmF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1hcHBpbmdGaWxlUmVmTW92ZUZvbGRlclJlcGxhY2VFZGl0cyhmaW5hbCBJRm9sZGVyIG9yaWdpbmFsRm9sZGVyLCBmaW5hbCBJUGF0aCBydW50aW1lRGVzdGluYXRpb24pIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nRmlsZVJlZiwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLmNyZWF0ZU1vdmVGb2xkZXJFZGl0cyhvcmlnaW5hbEZvbGRlciwgcnVudGltZURlc3RpbmF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqCi0JLy8gcHV0IG1ldGFtb2RlbCBzdHVmZiBoZXJlIHNvIGl0IGNhbiBiZSBzaGFyZWQgYnkgR2VuZXJpYyBhbmQgRWNsaXBzZUxpbmsgaW1wbGVtZW50YXRpb25zCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTWV0YW1vZGVsKCkgewotCQl0aGlzLmluaXRpYWxpemVNZXRhbW9kZWxGaWxlc18oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWV0YW1vZGVsRmlsZXMoKSB7Ci0JCWlmICh0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpKSB7Ci0JCQl0aGlzLmluaXRpYWxpemVNZXRhbW9kZWxGaWxlc18oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNZXRhbW9kZWxGaWxlc18oKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodGhpcy5tZXRhbW9kZWxGaWxlcywgdGhpcy5nZXRHZW5lcmF0ZWRNZXRhbW9kZWxGaWxlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SUZpbGU+IGdldEdlbmVyYXRlZE1ldGFtb2RlbEZpbGVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlLCBJRmlsZT4odGhpcy5nZXRHZW5lcmF0ZWRNZXRhbW9kZWxUb3BMZXZlbFR5cGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElGaWxlIHRyYW5zZm9ybShKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJwdCkgewotCQkJCXJldHVybiBqcnB0LmdldEZpbGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRHZW5lcmF0ZWRNZXRhbW9kZWxUb3BMZXZlbFR5cGVzKCkgewotCQlyZXR1cm4gKChKcGFQcm9qZWN0Ml8wKSB0aGlzLmdldEpwYVByb2plY3QoKSkuZ2V0R2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlcygpOwotCX0KLQotCS8qKgotCSAqIE5vdCB0aGUgcHJldHRpZXN0IGNvZGUuLi4uCi0JICovCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoKSB7Ci0JCS8vIGdhdGhlciB1cCB0aGUgcGVyc2lzdGVudCB1bml0J3MgdHlwZXMsIGVsaW1pbmF0aW5nIGR1cGxpY2F0ZXM7Ci0JCS8vIGlmIHdlIGhhdmUgcGVyc2lzdGVudCB0eXBlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gbXVsdGlwbGUgbG9jYXRpb25zLAotCQkvLyB0aGUgbGFzdCBvbmUgd2UgZW5jb3VudGVyIHdpbnMgKGkuZS4gdGhlIGNsYXNzZXMgaW4gdGhlIG9ybS54bWwgdGFrZQotCQkvLyBwcmVjZWRlbmNlKQotCQlIYXNoTWFwPFN0cmluZywgUGVyc2lzdGVudFR5cGU+IGFsbFBlcnNpc3RlbnRUeXBlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGVyc2lzdGVudFR5cGU+KCk7Ci0JCXRoaXMuYWRkUGVyc2lzdGVudFR5cGVzVG8odGhpcy5nZXRKYXJGaWxlUGVyc2lzdGVudFR5cGVzKCksIGFsbFBlcnNpc3RlbnRUeXBlcyk7Ci0JCXRoaXMuYWRkUGVyc2lzdGVudFR5cGVzVG8odGhpcy5nZXRDbGFzc1JlZlBlcnNpc3RlbnRUeXBlcygpLCBhbGxQZXJzaXN0ZW50VHlwZXMpOwotCQl0aGlzLmFkZFBlcnNpc3RlbnRUeXBlc1RvKHRoaXMuZ2V0TWFwcGluZ0ZpbGVQZXJzaXN0ZW50VHlwZXMoKSwgYWxsUGVyc2lzdGVudFR5cGVzKTsKLQotCQkvLyBidWlsZCBhIGxpc3Qgb2YgdGhlIHRvcC1sZXZlbCB0eXBlcyBhbmQgYSB0cmVlIG9mIHRoZWlyIGFzc29jaWF0ZWQKLQkJLy8gbWVtYmVyIHR5cGVzIGV0Yy4KLQkJQXJyYXlMaXN0PE1ldGFtb2RlbFNvdXJjZVR5cGU+IHRvcExldmVsVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE1ldGFtb2RlbFNvdXJjZVR5cGU+KGFsbFBlcnNpc3RlbnRUeXBlcy5zaXplKCkpOwotCQlIYXNoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+KCk7Ci0JCWZvciAoUGVyc2lzdGVudFR5cGUgdHlwZTFfMCA6IGFsbFBlcnNpc3RlbnRUeXBlcy52YWx1ZXMoKSkgewotCQkJUGVyc2lzdGVudFR5cGUyXzAgdHlwZSA9IChQZXJzaXN0ZW50VHlwZTJfMCkgdHlwZTFfMDsKLQkJCVN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZSA9IHR5cGUuZ2V0RGVjbGFyaW5nVHlwZU5hbWUoKTsKLQkJCU1ldGFtb2RlbFNvdXJjZVR5cGUgbWVtYmVyVHlwZSA9IHR5cGU7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWlmIChkZWNsYXJpbmdUeXBlTmFtZSA9PSBudWxsKSB7Ci0JCQkJCXRvcExldmVsVHlwZXMuYWRkKG1lbWJlclR5cGUpOwotCQkJCQlicmVhazsgIC8vIHN0b3AgYXQgdGhlIHRvcC1sZXZlbCB0eXBlCi0JCQkJfQotCi0JCQkJLy8gYXNzb2NpYXRlIHRoZSBtZW1iZXIgdHlwZSB3aXRoIGl0cyBkZWNsYXJpbmcgdHlwZQotCQkJCUNvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4gbWVtYmVyVHlwZXMgPSBtZW1iZXJUeXBlVHJlZS5nZXQoZGVjbGFyaW5nVHlwZU5hbWUpOwotCQkJCWlmIChtZW1iZXJUeXBlcyA9PSBudWxsKSB7Ci0JCQkJCW1lbWJlclR5cGVzID0gbmV3IEFycmF5TGlzdDxNZXRhbW9kZWxTb3VyY2VUeXBlPigpOwotCQkJCQltZW1iZXJUeXBlVHJlZS5wdXQoZGVjbGFyaW5nVHlwZU5hbWUsIG1lbWJlclR5cGVzKTsKLQkJCQl9Ci0JCQkJbWVtYmVyVHlwZXMuYWRkKG1lbWJlclR5cGUpOwotCi0JCQkJLy8gbW92ZSBvdXQgdG8gdGhlIG1lbWJlciB0eXBlJ3MgZGVjbGFyaW5nIHR5cGUKLQkJCQlTdHJpbmcgbWVtYmVyVHlwZU5hbWUgPSBkZWNsYXJpbmdUeXBlTmFtZTsKLQkJCQkvLyBjaGVjayBmb3IgYSBjb250ZXh0IHBlcnNpc3RlbnQgdHlwZQotCQkJCW1lbWJlclR5cGUgPSAoUGVyc2lzdGVudFR5cGUyXzApIGFsbFBlcnNpc3RlbnRUeXBlcy5nZXQobWVtYmVyVHlwZU5hbWUpOwotCQkJCWlmIChtZW1iZXJUeXBlICE9IG51bGwpIHsKLQkJCQkJYnJlYWs7ICAvLyBzdG9wIC0gdGhpcyB3aWxsIGJlIHByb2Nlc3NlZCBpbiB0aGUgb3V0ZXIgJ2ZvcicgbG9vcAotCQkJCX0KLQkJCQkvLyBjaGVjayBmb3IgYSBKYXZhIHJlc291cmNlIHBlcnNpc3RlbnQgdHlwZQotCQkJCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBqcmF0ID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShtZW1iZXJUeXBlTmFtZSk7Ci0JCQkJaWYgKGpyYXQgIT0gbnVsbCkgewotCQkJCQlkZWNsYXJpbmdUeXBlTmFtZSA9IGpyYXQuZ2V0RGVjbGFyaW5nVHlwZU5hbWUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBjaGVjayBmb3IgYSBKRFQgdHlwZQotCQkJCQlJVHlwZSBqZHRUeXBlID0gdGhpcy5maW5kSmR0VHlwZShtZW1iZXJUeXBlTmFtZSk7Ci0JCQkJCWlmIChqZHRUeXBlICE9IG51bGwpIHsKLQkJCQkJCUlUeXBlIGpkdERlY2xhcmluZ1R5cGUgPSBqZHRUeXBlLmdldERlY2xhcmluZ1R5cGUoKTsKLQkJCQkJCWRlY2xhcmluZ1R5cGVOYW1lID0gKGpkdERlY2xhcmluZ1R5cGUgPT0gbnVsbCkgPyBudWxsIDogamR0RGVjbGFyaW5nVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGFzc3VtZSB3ZSBoYXZlIGEgbm9uLXBlcnNpc3RlbnQgdG9wLWxldmVsIHR5cGUuLi4/Ci0JCQkJCQlkZWNsYXJpbmdUeXBlTmFtZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGRlY2xhcmluZ1R5cGVOYW1lID09IG51bGwpIHsKLQkJCQkJbWVtYmVyVHlwZSA9IHRoaXMuc2VsZWN0U291cmNlVHlwZSh0b3BMZXZlbFR5cGVzLCBtZW1iZXJUeXBlTmFtZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbWVtYmVyVHlwZSA9IHRoaXMuc2VsZWN0U291cmNlVHlwZShtZW1iZXJUeXBlVHJlZS5nZXQoZGVjbGFyaW5nVHlwZU5hbWUpLCBtZW1iZXJUeXBlTmFtZSk7Ci0JCQkJfQotCQkJCWlmIChtZW1iZXJUeXBlICE9IG51bGwpIHsKLQkJCQkJYnJlYWs7ICAvLyBzdG9wIC0gdGhpcyB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkCi0JCQkJfQotCQkJCW1lbWJlclR5cGUgPSB0aGlzLmJ1aWxkTm9uUGVyc2lzdGVudE1ldGFtb2RlbFNvdXJjZVR5cGUobWVtYmVyVHlwZU5hbWUpOwotCQkJfQotCQl9Ci0KLQkJLy8gcmVtb3ZlIGFueSB0b3AtbGV2ZWwgdHlwZSB3aG9zZSBuYW1lIGRpZmZlcnMgZnJvbSBhbm90aGVyIG9ubHkgYnkgY2FzZSwKLQkJLy8gc2luY2UsIG9uIFdpbmRvd3MsIGZpbGUgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmUgOi0oCi0JCS8vIHNvcnQgdGhlIG9yaWdpbmFsIGxpc3Qgc28gd2UgZW5kIHVwIHdpdGggdGhlIHNhbWUgdG9wLWxldmVsIHR5cGUKLQkJLy8gcmVtYWluaW5nIGV2ZXJ5IHRpbWUgKGkuZS4gdGhlIG9uZSB0aGF0IHNvcnRzIG91dCBmaXJzdCkKLQkJQ29sbGVjdGlvbnMuc29ydCh0b3BMZXZlbFR5cGVzLCBNZXRhbW9kZWxTb3VyY2VUeXBlLkNPTVBBUkFUT1IpOwotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KHRvcExldmVsVHlwZXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvcjxNZXRhbW9kZWxTb3VyY2VUeXBlPiBzdHJlYW0gPSB0b3BMZXZlbFR5cGVzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJTWV0YW1vZGVsU291cmNlVHlwZSB0b3BMZXZlbFR5cGUgPSBzdHJlYW0ubmV4dCgpOwotCQkJLy8gaG9wZWZ1bGx5IHRoaXMgaXMgY2FzZS1pbnNlbnNpdGl2ZSBlbm91Z2guLi4KLQkJCWlmICggISBuYW1lcy5hZGQodG9wTGV2ZWxUeXBlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpKSkgewotCQkJCXN0cmVhbS5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGNvcHkgdGhlIGxpc3Qgb2YgbWV0YW1vZGVsIGZpbGVzLi4uCi0JCUhhc2hTZXQ8SUZpbGU+IGRlYWRNZXRhbW9kZWxGaWxlcyA9IG5ldyBIYXNoU2V0PElGaWxlPih0aGlzLm1ldGFtb2RlbEZpbGVzKTsKLQkJdGhpcy5tZXRhbW9kZWxGaWxlcy5jbGVhcigpOwotCQlmb3IgKE1ldGFtb2RlbFNvdXJjZVR5cGUgdG9wTGV2ZWxUeXBlIDogdG9wTGV2ZWxUeXBlcykgewotCQkJSUZpbGUgbWV0YW1vZGVsRmlsZSA9IHRvcExldmVsVHlwZS5nZXRNZXRhbW9kZWxGaWxlKCk7Ci0JCQkvLyAuLi5yZW1vdmUgd2hhdGV2ZXIgZmlsZXMgYXJlIHN0aWxsIHByZXNlbnQuLi4KLQkJCWRlYWRNZXRhbW9kZWxGaWxlcy5yZW1vdmUobWV0YW1vZGVsRmlsZSk7Ci0JCQkvLyAuLi5yZWJ1aWxkIHRoZSBsaXN0IG9mIG1ldGFtb2RlbCBmaWxlcy4uLgotCQkJaWYgKHRoaXMuZmlsZUlzR2VuZXJhdGVkTWV0YW1vZGVsKG1ldGFtb2RlbEZpbGUpKSB7ICAvLyBvbmx5IGFkZCBmaWxlcyB3aXRoIHRoZSBEYWxpIHRhZwotCQkJCXRoaXMubWV0YW1vZGVsRmlsZXMuYWRkKG1ldGFtb2RlbEZpbGUpOwotCQkJfQotCQl9Ci0JCS8vIC4uLmRlbGV0ZSB0aGUgZmlsZXMgdGhhdCBhcmUgbm93IGdvbmUKLQkJLy8gW3BlcmZvcm0gdGhlIGRlbGV0ZXMgZmlyc3QgLSB0aGlzIGlzIGNyaXRpY2FsIHdoZW4gYSBmaWxlIGhhcyBiZWVuCi0JCS8vIHJlbmFtZWQgYnkgb25seSBhbHRlcmluZyBpdHMgbmFtZSdzIGNhc2U7IHNpbmNlIHdlIHdpbGwgdHJ5IHRvIHdyaXRlCi0JCS8vIG91dCBhIG5ldyBmaWxlIHRoYXQsIG9uIFdpbmRvd3MsIGNvbGxpZGVzIHdpdGggdGhlIG9sZCBmaWxlIDotKCBdCi0JCWZvciAoSUZpbGUgZGVhZE1ldGFtb2RlbEZpbGUgOiBkZWFkTWV0YW1vZGVsRmlsZXMpIHsKLQkJCXRoaXMuZGVsZXRlTWV0YW1vZGVsRmlsZShkZWFkTWV0YW1vZGVsRmlsZSk7Ci0JCX0KLQotCQkvLyBub3cgZ2VuZXJhdGUgdGhlIG1ldGFtb2RlbCBjbGFzc2VzCi0JCWZvciAoTWV0YW1vZGVsU291cmNlVHlwZSB0b3BMZXZlbFR5cGUgOiB0b3BMZXZlbFR5cGVzKSB7Ci0JCQl0b3BMZXZlbFR5cGUuc3luY2hyb25pemVNZXRhbW9kZWwobWVtYmVyVHlwZVRyZWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGFtb2RlbFNvdXJjZVR5cGUgc2VsZWN0U291cmNlVHlwZShJdGVyYWJsZTxNZXRhbW9kZWxTb3VyY2VUeXBlPiB0eXBlcywgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKE1ldGFtb2RlbFNvdXJjZVR5cGUgdHlwZSA6IHR5cGVzKSB7Ci0JCQkJaWYgKHR5cGUuZ2V0TmFtZSgpLmVxdWFscyh0eXBlTmFtZSkpIHsKLQkJCQkJcmV0dXJuIHR5cGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBNZXRhbW9kZWxTb3VyY2VUeXBlIGJ1aWxkTm9uUGVyc2lzdGVudE1ldGFtb2RlbFNvdXJjZVR5cGUoU3RyaW5nIG5vblBlcnNpc3RlbnRUeXBlTmFtZSkgewotCQlyZXR1cm4gbmV3IE5vblBlcnNpc3RlbnRNZXRhbW9kZWxTb3VyY2VUeXBlKG5vblBlcnNpc3RlbnRUeXBlTmFtZSwgdGhpcy5nZXRKcGFQcm9qZWN0KCkpOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBmaW5kSmR0VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU1ldGFtb2RlbEZpbGUoSUZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJdGhpcy5kZWxldGVNZXRhbW9kZWxGaWxlXyhmaWxlKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlTWV0YW1vZGVsRmlsZV8oSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAodGhpcy5maWxlSXNHZW5lcmF0ZWRNZXRhbW9kZWwoZmlsZSkpIHsKLQkJCWZpbGUuZGVsZXRlKHRydWUsIG51bGwpOyAgLy8gdHJ1ZSA9IGZvcmNlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlSXNHZW5lcmF0ZWRNZXRhbW9kZWwoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gKChKcGFQcm9qZWN0Ml8wKSB0aGlzLmdldEpwYVByb2plY3QoKSkuZ2V0R2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlKGZpbGUpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZU1ldGFtb2RlbCgpIHsKLQkJdGhpcy5tZXRhbW9kZWxGaWxlcy5jbGVhcigpOwotCX0KLQotCi0JLy8gKioqKiogTWV0YW1vZGVsIHNvdXJjZSBmb3Igbm9uLXBlcnNpc3RlbnQgdHlwZXMKLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5vblBlcnNpc3RlbnRNZXRhbW9kZWxTb3VyY2VUeXBlCi0JCWltcGxlbWVudHMgTWV0YW1vZGVsU291cmNlVHlwZQotCXsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBuYW1lOwotCQlwcm90ZWN0ZWQgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCQlwcm90ZWN0ZWQgZmluYWwgTWV0YW1vZGVsU291cmNlVHlwZS5TeW5jaHJvbml6ZXIgbWV0YW1vZGVsU3luY2hyb25pemVyOwotCi0JCXByb3RlY3RlZCBOb25QZXJzaXN0ZW50TWV0YW1vZGVsU291cmNlVHlwZShTdHJpbmcgbmFtZSwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCQl0aGlzLm1ldGFtb2RlbFN5bmNocm9uaXplciA9IHRoaXMuYnVpbGRNZXRhbW9kZWxTeW5jaHJvbml6ZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBNZXRhbW9kZWxTb3VyY2VUeXBlLlN5bmNocm9uaXplciBidWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcigpIHsKLQkJCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcih0aGlzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBKcGFGYWN0b3J5Ml8wIGdldEpwYUZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gKEpwYUZhY3RvcnkyXzApIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SnBhRmFjdG9yeSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzTWFuYWdlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBJRmlsZSBnZXRNZXRhbW9kZWxGaWxlKCkgewotCQkJcmV0dXJuIHRoaXMubWV0YW1vZGVsU3luY2hyb25pemVyLmdldEZpbGUoKTsKLQkJfQotCi0JCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUpIHsKLQkJCXRoaXMubWV0YW1vZGVsU3luY2hyb25pemVyLnN5bmNocm9uaXplKG1lbWJlclR5cGVUcmVlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHByaW50Qm9keVNvdXJjZU9uKEJvZHlTb3VyY2VXcml0ZXIgcHcsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB7Ci0JCQl0aGlzLm1ldGFtb2RlbFN5bmNocm9uaXplci5wcmludEJvZHlTb3VyY2VPbihwdywgbWVtYmVyVHlwZVRyZWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYWE5ZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGV4dGVuZHMgQWJzdHJhY3RNb2RlbAotCQkJCWltcGxlbWVudHMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotewotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdDsKLQotCS8vIGtleSA9IFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSBrZXk7IHZhbHVlID0gcHJvcGVydHkgaWQKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydHlOYW1lczsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTFVFX0RFTElNSVRFUiA9ICIsIjsJLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzIC8gaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCXByb3RlY3RlZCBBYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlzdXBlcigpOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQkJdGhpcy5pbml0aWFsaXplKHBhcmVudCk7Ci0JCXRoaXMucG9zdEluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBCYXNlIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMucHJvcGVydHlOYW1lcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemF0aW9uIGJhc2VkIG9uIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdCA9IHBhcmVudDsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZVByb3BlcnR5TmFtZXMoKTsKLQkJdGhpcy5pbml0aWFsaXplUHJvcGVydGllcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0eU5hbWVzKCkgewotCQl0aGlzLmFkZFByb3BlcnR5TmFtZXModGhpcy5wcm9wZXJ0eU5hbWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKLQotCS8qKgotICAgICAqIERvZXMgYWxsIHBvc3QgdHJlYXRtZW50IGluIHRoaXMgbWV0aG9kIGFmdGVyIHRoZSBwcm9wZXJ0aWVzIGFyZSBpbml0aWFsaXplZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBvc3RJbml0aWFsaXplKCkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0OwotCX0KLQkKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgdXNlZCBieSB0aGUgbWV0aG9kczogaXRlbUlzUHJvcGVydHkKLQkgKiBhbmQgcHJvcGVydHlJZEZvci4KLQkgKiAKLQkgKiBrZXkgPSBwcm9wZXJ0eSBrZXk7IHZhbHVlID0gcHJvcGVydHkgaWQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKE1hcDxTdHJpbmcsIFN0cmluZz4gcE5hbWVzKTsKLQotCS8qKgotCSAqIE1ldGhvZCB1c2VkIGZvciBpZGVudGlmeWluZyB0aGUgZ2l2ZW4gcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXRlbUlzUHJvcGVydHkoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IGl0ZW0pIHsKLQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMucHJvcGVydHlOYW1lcygpLmtleVNldCgpLmNvbnRhaW5zKGl0ZW0uZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgZm9yIGNoYW5nZSBub3RpZmljYXRpb24gb2YgdGhlIGdpdmVuCi0JICogcHJvcGVydHkuCi0JICovCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkT2YoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eUlkID0gdGhpcy5wcm9wZXJ0eU5hbWVzKCkuZ2V0KHByb3BlcnR5LmdldE5hbWUoKSk7Ci0JCWlmIChwcm9wZXJ0eUlkID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgcHJvcGVydHk6ICIgKyBwcm9wZXJ0eSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlJZDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUlkT2YoU3RyaW5nIGVjbGlwc2VMaW5ra2V5KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eUlkID0gdGhpcy5wcm9wZXJ0eU5hbWVzKCkuZ2V0KGVjbGlwc2VMaW5ra2V5KTsKLQkJaWYgKHByb3BlcnR5SWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBwcm9wZXJ0eTogIiArIGVjbGlwc2VMaW5ra2V5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eUlkOwotCX0KLQotCS8qCi0JICogR2V0IHRoZSBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkga2V5IG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleU9mKFN0cmluZyBwcm9wZXJ0eUlkKSB7Ci0JCWZvciAoU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSA6IHRoaXMucHJvcGVydHlOYW1lcygpLmtleVNldCgpKSB7Ci0JCQlpZiAodGhpcy5wcm9wZXJ0eU5hbWVzKCkuZ2V0KHBlcnNpc3RlbmNlVW5pdEtleSkuZXF1YWxzKHByb3BlcnR5SWQpKSB7Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdEtleTsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHByb3BlcnR5IElEOiAiICsgcHJvcGVydHlJZCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLy8gKioqKioqKiogQ29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKgotCS8qKgotCSAqIFB1dCBpbnRvIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eUlkIC0KLQkgKiAgICAgICAgICAgIHByb3BlcnR5IG5hbWUKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlJZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydHlJZCwgdmFsdWUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlJZCwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlcykgewotCQlTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5ID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlPZihwcm9wZXJ0eUlkKTsKLQkJdGhpcy5wdXRQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXksIG51bGwsIHZhbHVlLCBhbGxvd0R1cGxpY2F0ZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUlkLCBCb29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMucHV0UHJvcGVydHkocHJvcGVydHlJZCwgdmFsdWUsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlJZCwgQm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0eUlkLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih2YWx1ZSksIGFsbG93RHVwbGljYXRlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHV0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5SWQsIEludGVnZXIgdmFsdWUpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0eUlkLCB2YWx1ZSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUlkLCBJbnRlZ2VyIHZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlcykgewotCQl0aGlzLnB1dFByb3BlcnR5KHByb3BlcnR5SWQsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHZhbHVlKSwgYWxsb3dEdXBsaWNhdGVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlJZCwgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWUgdmFsdWUpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0eUlkLCB2YWx1ZSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUlkLCBQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZSB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKLQkJdGhpcy5wdXRQcm9wZXJ0eShwcm9wZXJ0eUlkLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih2YWx1ZSksIGFsbG93RHVwbGljYXRlcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlJZCAtCi0JICogICAgICAgICAgICBwcm9wZXJ0eSBuYW1lCi0JICogQHBhcmFtIHZhbHVlIC0KLQkgKiAgICAgICAgICAgIHByb3BlcnR5IHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5SWQsIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5ID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXRLZXlPZihwcm9wZXJ0eUlkKTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXksIHZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgd2hlbiB0aGUgZ2l2ZW4ga2V5IGV4aXRzIGluIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0ZW5jZVVuaXRLZXlFeGlzdHMoU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSkgewotCQlyZXR1cm4gKHRoaXMuZ2V0U3RyaW5nVmFsdWUocGVyc2lzdGVuY2VVbml0S2V5KSAhPSBudWxsKTsKLQl9Ci0JCi0JLy8gKioqKioqIGdldC9zZXQgU3RyaW5nIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gUHJvcGVydHkgZnJvbSB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTdHJpbmdWYWx1ZShTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5KSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXkpOwotCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogcC5nZXRWYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdHJpbmdWYWx1ZSgoa2V5U3VmZml4ID09IG51bGwpID8ga2V5IDoga2V5ICsga2V5U3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIFN0cmluZyB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5IC0KLQkgKiAgICAgICAgICAgIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTdHJpbmdWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJdGhpcy5wdXRTdHJpbmdWYWx1ZShrZXksIG51bGwsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBTdHJpbmcgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dFN0cmluZ1ZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgewotCQl0aGlzLnB1dFN0cmluZ1ZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGFsbG93RHVwbGljYXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIFN0cmluZyB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0ga2V5U3VmZml4Ci0JICogICAgICAgICAgICBlLmcuIGVudGl0eSBuYW1lCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dFN0cmluZ1ZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgsIFN0cmluZyBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgewotCQl0aGlzLnB1dFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KGtleSwga2V5U3VmZml4LCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8vICoqKioqKiBJbnRlZ2VyIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCS8qKgotCSAqIFJldHVybnMgdGhlIEludGVnZXIgdmFsdWUgb2YgdGhlIGdpdmVuIFByb3BlcnR5IGZyb20gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGdldEludGVnZXJWYWx1ZShTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5KSB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXkpOwotCQlyZXR1cm4gKHAgPT0gbnVsbCkgPyBudWxsIDogZ2V0SW50ZWdlclZhbHVlT2YocC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBnZXRJbnRlZ2VyVmFsdWVPZihTdHJpbmcgcHVTdHJpbmdWYWx1ZSkgewotCQlpZiAgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHVTdHJpbmdWYWx1ZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHB1U3RyaW5nVmFsdWUpOwotCQl9Ci0JCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGdldEludGVnZXJWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4KSB7Ci0JCXJldHVybiB0aGlzLmdldEludGVnZXJWYWx1ZSgoa2V5U3VmZml4ID09IG51bGwpID8ga2V5IDoga2V5ICsga2V5U3VmZml4KTsKLQl9Ci0KLQkvKioKLQkgKiBQdXQgdGhlIGdpdmVuIEludGVnZXIgdmFsdWUgaW50byB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICogQHBhcmFtIGtleSAtCi0JICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0SW50ZWdlclZhbHVlKFN0cmluZyBrZXksIEludGVnZXIgbmV3VmFsdWUpIHsKLQkJdGhpcy5wdXRJbnRlZ2VyVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gSW50ZWdlciB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICogQHBhcmFtIGFsbG93RHVwbGljYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0SW50ZWdlclZhbHVlKFN0cmluZyBrZXksIEludGVnZXIgbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKLQkJdGhpcy5wdXRJbnRlZ2VyVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gSW50ZWdlciB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0ga2V5U3VmZml4Ci0JICogICAgICAgICAgICBlLmcuIGVudGl0eSBuYW1lCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dEludGVnZXJWYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBJbnRlZ2VyIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCXRoaXMucHV0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoa2V5LCBrZXlTdWZmaXgsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld1ZhbHVlKSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8vICoqKioqKiBCb29sZWFuIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBCb29sZWFuIHZhbHVlIG9mIHRoZSBnaXZlbiBQcm9wZXJ0eSBmcm9tIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXRCb29sZWFuVmFsdWUoU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSkgewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocGVyc2lzdGVuY2VVbml0S2V5KTsKLQkJcmV0dXJuIChwID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0Qm9vbGVhblZhbHVlT2YocC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlT2YoU3RyaW5nIHB1U3RyaW5nVmFsdWUpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocHVTdHJpbmdWYWx1ZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YocHVTdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2V0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhblZhbHVlKChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXgpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIEJvb2xlYW4gbmV3VmFsdWUpIHsKLQkJdGhpcy5wdXRCb29sZWFuVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gbmV3VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5Ci0JICogQHBhcmFtIGFsbG93RHVwbGljYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHV0Qm9vbGVhblZhbHVlKFN0cmluZyBrZXksIEJvb2xlYW4gbmV3VmFsdWUsIGJvb2xlYW4gYWxsb3dEdXBsaWNhdGUpIHsKLQkJdGhpcy5wdXRCb29sZWFuVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8qKgotCSAqIFB1dCB0aGUgZ2l2ZW4gQm9vbGVhbiB2YWx1ZSBpbnRvIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKiBAcGFyYW0ga2V5Ci0JICogICAgICAgICAgICBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0ga2V5U3VmZml4Ci0JICogICAgICAgICAgICBlLmcuIGVudGl0eSBuYW1lCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleQotCSAqIEBwYXJhbSBhbGxvd0R1cGxpY2F0ZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHB1dEJvb2xlYW5WYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBCb29sZWFuIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCXRoaXMucHV0UGVyc2lzdGVuY2VVbml0UHJvcGVydHkoa2V5LCBrZXlTdWZmaXgsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld1ZhbHVlKSwgYWxsb3dEdXBsaWNhdGUpOwotCX0KLQotCS8vICoqKioqKiBFbnVtIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBFbnVtIHZhbHVlIG9mIHRoZSBnaXZlbiBQcm9wZXJ0eSBmcm9tIHRoZSBQZXJzaXN0ZW5jZVhtbC4KLQkgKi8KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZT4gVCBnZXRFbnVtVmFsdWUoU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSwgVFtdIGVudW1WYWx1ZXMpIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHAgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHBlcnNpc3RlbmNlVW5pdEtleSk7Ci0JCXJldHVybiAocCA9PSBudWxsKSA/IG51bGwgOiBnZXRFbnVtVmFsdWVPZihwLmdldFZhbHVlKCksIGVudW1WYWx1ZXMpOwotCX0KLQotCXByb3RlY3RlZCA8VCBleHRlbmRzIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlPiBUIGdldEVudW1WYWx1ZShTdHJpbmcga2V5LCBTdHJpbmcga2V5U3VmZml4LCBUW10gZW51bVZhbHVlcykgewotCQlyZXR1cm4gdGhpcy5nZXRFbnVtVmFsdWUoKGtleVN1ZmZpeCA9PSBudWxsKSA/IGtleSA6IGtleSArIGtleVN1ZmZpeCwgZW51bVZhbHVlcyk7Ci0JfQotCi0JLyoqCi0JICogUHV0IHRoZSBnaXZlbiBFbnVtIHZhbHVlIGludG8gdGhlIFBlcnNpc3RlbmNlWG1sLgotCSAqIAotCSAqIEBwYXJhbSBrZXkgLQotCSAqICAgICAgICAgICAgcHJvcGVydHkga2V5Ci0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU+IHZvaWQgcHV0RW51bVZhbHVlKFN0cmluZyBrZXksIFQgbmV3VmFsdWUpIHsKLQkJdGhpcy5wdXRFbnVtVmFsdWUoa2V5LCBudWxsLCBuZXdWYWx1ZSwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCA8VCBleHRlbmRzIFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlPiB2b2lkIHB1dEVudW1WYWx1ZShTdHJpbmcga2V5LCBUIG5ld1ZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlKSB7Ci0JCXRoaXMucHV0RW51bVZhbHVlKGtleSwgbnVsbCwgbmV3VmFsdWUsIGFsbG93RHVwbGljYXRlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgPFQgZXh0ZW5kcyBQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZT4gdm9pZCBwdXRFbnVtVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIGtleVN1ZmZpeCwgVCBuZXdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZSkgewotCQl0aGlzLnB1dFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KGtleSwga2V5U3VmZml4LCBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YobmV3VmFsdWUpLCBhbGxvd0R1cGxpY2F0ZSk7Ci0JfQotCi0JLy8gKioqKioqIGdldC9zZXQgQ29tcG9zaXRlVmFsdWUgY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU3RyaW5nIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gUHJvcGVydHkgZnJvbSB0aGUgUGVyc2lzdGVuY2VYbWwuCi0JICovCi0JcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBnZXRDb21wb3NpdGVWYWx1ZShTdHJpbmcgcGVyc2lzdGVuY2VVbml0S2V5KSB7Ci0JCVN0cmluZyB2YWx1ZXMgPSB0aGlzLmdldFN0cmluZ1ZhbHVlKHBlcnNpc3RlbmNlVW5pdEtleSk7Ci0JCXJldHVybiB0aGlzLmV4dHJhY3RDb21wb3NpdGVWYWx1ZSh2YWx1ZXMpOwotCX0KLQkKLQkvKioKLQkgKiBQdXQgaW50byBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcy4gSWYgdGhlIHByb3BlcnR5IGFscmVhZHkgZXhpc3RzLCAKLQkgKiBpdCBhcHBlbmRzIHRoZSBnaXZlbiB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5Ci0JICogQHBhcmFtIHZhbHVlVG9BcHBlbmQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwdXRQcm9wZXJ0eUNvbXBvc2l0ZVZhbHVlKFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZVRvQXBwZW5kKSB7Ci0JCVN0cmluZyBwZXJzaXN0ZW5jZVVuaXRLZXkgPSB0aGlzLnBlcnNpc3RlbmNlVW5pdEtleU9mKGtleSk7Ci0KLQkJIFN0cmluZyBwZXJzaXN0ZW5jZVVuaXRWYWx1ZSA9IHRoaXMuYnVpbGRDb21wb3NpdGVWYWx1ZSgKLQkJCSAJCQkJCQkJCQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUocGVyc2lzdGVuY2VVbml0S2V5KSwgdmFsdWVUb0FwcGVuZCk7Ci0KLQkJdGhpcy5wdXRQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXksIG51bGwsIHBlcnNpc3RlbmNlVW5pdFZhbHVlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhIHZhbHVlIGZyb20gYSBwcm9wZXJ0eSB3aXRoIGNvbXBvc2l0ZSB2YWx1ZXMuCi0JICogSWYgdGhlIHJlc3VsdGluZyB2YWx1ZSBpcyBlbXB0eSwgdGhlIHByb3BlcnR5IGlzIHJlbW92ZWQgZnJvbSB0aGUgcGVyc2lzdGVuY2VVbml0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkgLQotCSAqICAgICAgICAgICAgcHJvcGVydHkgbmFtZQotCSAqIEBwYXJhbSB2YWx1ZVRvUmVtb3ZlIC0KLQkgKiAgICAgICAgICAgIHZhbHVlIHRvIHJlbW92ZSBmcm9tIHRoZSBwcm9wZXJ0eQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVByb3BlcnR5Q29tcG9zaXRlVmFsdWUoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlVG9SZW1vdmUpIHsKLQkJU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSA9IHRoaXMucGVyc2lzdGVuY2VVbml0S2V5T2Yoa2V5KTsKLQkJCi0JCVN0cmluZyBwZXJzaXN0ZW5jZVVuaXRWYWx1ZSA9IHRoaXMucmVtb3ZlVmFsdWVGcm9tKAotCQkJIAkJCQkJCQkJCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShwZXJzaXN0ZW5jZVVuaXRLZXkpLCB2YWx1ZVRvUmVtb3ZlLnRyaW0oKSk7Ci0KLQkJdGhpcy5wdXRQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eShwZXJzaXN0ZW5jZVVuaXRLZXksIG51bGwsIHBlcnNpc3RlbmNlVW5pdFZhbHVlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW51bSBjb25zdGFudCBvZiB0aGUgc3BlY2lmaWVkIGVudW0gdHlwZSB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBQcm9wZXJ0eSBzdHJpbmcgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWU+IFQgZ2V0RW51bVZhbHVlT2YoU3RyaW5nIHB1U3RyaW5nVmFsdWUsIFRbXSBlbnVtVmFsdWVzKSB7Ci0JCWZvciAoVCBlbnVtVmFsdWUgOiBlbnVtVmFsdWVzKSB7Ci0JCQlpZiAoZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKGVudW1WYWx1ZSkuZXF1YWxzKHB1U3RyaW5nVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGVudW1WYWx1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBQcm9wZXJ0eSBzdHJpbmcgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5IHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKFBlcnNpc3RlbmNlWG1sRW51bVZhbHVlIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdmFsdWUuZ2V0UHJvcGVydHlWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFByb3BlcnR5IHN0cmluZyB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoQm9vbGVhbiB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgUHJvcGVydHkgc3RyaW5nIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihJbnRlZ2VyIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnByb3BlcnR5TmFtZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1dFBlcnNpc3RlbmNlVW5pdFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBrZXlTdWZmaXgsIFN0cmluZyBzdHJpbmdWYWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKLQkJU3RyaW5nIHBlcnNpc3RlbmNlVW5pdEtleSA9IChrZXlTdWZmaXggPT0gbnVsbCkgPyBrZXkgOiBrZXkgKyBrZXlTdWZmaXg7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkocGVyc2lzdGVuY2VVbml0S2V5LCBzdHJpbmdWYWx1ZSwgYWxsb3dEdXBsaWNhdGVzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENvbXBvc2l0ZVZhbHVlKFN0cmluZyB2YWx1ZSwgU3RyaW5nIHZhbHVlVG9BcHBlbmQpIHsKLQkJaWYoKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodmFsdWVUb0FwcGVuZCkpICkgewotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh2YWx1ZSkpID8gCi0JCQkJCQl2YWx1ZVRvQXBwZW5kIDogCi0JCQkJCQkodmFsdWUgKyBQUk9QRVJUWV9WQUxVRV9ERUxJTUlURVIgKyB2YWx1ZVRvQXBwZW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGV4dHJhY3RDb21wb3NpdGVWYWx1ZShTdHJpbmcgY29tcG9zaXRlVmFsdWUpIHsKLQkJaWYoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShjb21wb3NpdGVWYWx1ZSkpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oMCk7Ci0JCX0KLQkJU3RyaW5nW10gdmFsdWVzID0gY29tcG9zaXRlVmFsdWUuc3BsaXQoUFJPUEVSVFlfVkFMVUVfREVMSU1JVEVSKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4odmFsdWVzLmxlbmd0aCk7Ci0JCWZvcihTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLQkJCXJlc3VsdHMuYWRkKHZhbHVlLnRyaW0oKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsdWVGcm9tKFN0cmluZyBjb21wb3NpdGVWYWx1ZSwgU3RyaW5nIHZhbHVlVG9SZW1vdmUpIHsKLQkJaWYoKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodmFsdWVUb1JlbW92ZSkpKSB7Ci0JCQlyZXR1cm4gY29tcG9zaXRlVmFsdWU7Ci0JCX0KLQkJU3RyaW5nW10gdmFsdWVzID0gY29tcG9zaXRlVmFsdWUuc3BsaXQoUFJPUEVSVFlfVkFMVUVfREVMSU1JVEVSKTsKLQkJQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPih2YWx1ZXMubGVuZ3RoKTsKLQkJCi0JCWZvcihTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKLQkJCWlmKHZhbHVlLnRyaW0oKS5lcXVhbHModmFsdWVUb1JlbW92ZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCXJlc3VsdHMuYWRkKHZhbHVlKTsKLQkJfQotCQlpZihyZXN1bHRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHZhbHVlcy5sZW5ndGgpOwotCQlmb3IoU3RyaW5nIHZhbHVlIDogcmVzdWx0cykgewotCQkJc2IuYXBwZW5kKHZhbHVlKS5hcHBlbmQoUFJPUEVSVFlfVkFMVUVfREVMSU1JVEVSKTsKLQkJfQotCQlzYi5kZWxldGVDaGFyQXQoc2IubGVuZ3RoKCkgLSAxKTsgCS8vIHJlbW92ZSB0aGUgbGFzdCBkZWxpbWl0ZXIKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQzMWQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkFic3RyYWN0WG1sQ29udGV4dE5vZGU7Ci0KLS8qKgotICogVXNlIHRoaXMgYWJzdHJhY3QgY2xhc3MgZm9yIGNvbnRleHQgbm9kZXMgdGhhdCBhcmUgcGFydCBvZiBhbgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS4KLSAqIFRoaXMgd2lsbCBub3Qgd29yayBmb3IgYSBwdXJlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZX0KLSAqIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCi0JZXh0ZW5kcyBBYnN0cmFjdFhtbENvbnRleHROb2RlCi17Ci0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlKEpwYUNvbnRleHROb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gZ2V0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbikgdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldFJlc291cmNlRGVmaW5pdGlvbih0aGlzLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCkuZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBnZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpLmdldENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTMzM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY0NsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY0phckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuSW1wbGllZE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgaW1wbGVtZW50cyBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotewotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZSBidWlsZFBlcnNpc3RlbmNlKFBlcnNpc3RlbmNlWG1sIHBhcmVudCwgWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljUGVyc2lzdGVuY2UocGFyZW50LCB4bWxQZXJzaXN0ZW5jZSk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2UgcGFyZW50LCBYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdChwYXJlbnQsIHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCQotCXB1YmxpYyBNYXBwaW5nRmlsZVJlZiBidWlsZE1hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY01hcHBpbmdGaWxlUmVmKHBhcmVudCwgeG1sTWFwcGluZ0ZpbGVSZWYpOwotCX0KLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEltcGxpZWRNYXBwaW5nRmlsZVJlZihwYXJlbnQsIEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIENsYXNzUmVmIGJ1aWxkQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0NsYXNzUmVmKHBhcmVudCwgY2xhc3NSZWYpOwotCX0KLQkKLQlwdWJsaWMgQ2xhc3NSZWYgYnVpbGRDbGFzc1JlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0NsYXNzUmVmKHBhcmVudCwgY2xhc3NOYW1lKTsKLQl9Ci0JCi0JcHVibGljIEphckZpbGVSZWYgYnVpbGRKYXJGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphckZpbGVSZWYgeG1sSmFyRmlsZVJlZikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXJGaWxlUmVmKHBhcmVudCwgeG1sSmFyRmlsZVJlZik7Ci0JfQotCi0JcHVibGljIEphckZpbGUgYnVpbGRKYXJGaWxlKEphckZpbGVSZWYgcGFyZW50LCBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXJGaWxlKHBhcmVudCwgamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBidWlsZFByb3BlcnR5KFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbFByb3BlcnR5IHhtbFByb3BlcnR5KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdFByb3BlcnR5KHBhcmVudCwgeG1sUHJvcGVydHkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyZWY3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgZGVmaW5pdGlvbiBzaG91bGQgYmUgInN0YXRpYyIKLSAqIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBmYWN0b3J5OwotCi0KLQkvKioKLQkgKiB6ZXJvLWFyZ3VtZW50IGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmZhY3RvcnkgPSB0aGlzLmJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMyOWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLk51bGxDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5OdWxsT3B0aW9uczJfMDsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeQotewotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29ubmVjdGlvbjJfMChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBidWlsZE9wdGlvbnMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxPcHRpb25zMl8wKHBhcmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9GYWNldFRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9GYWNldFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNDMxOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvRmFjZXRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGNsYXNzIEZhY2V0VG9vbHMgewotCQotCXB1YmxpYyBzdGF0aWMgSUdyb3VwIE1PRFVMRVNfR1JPVVAgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRHcm91cCgibW9kdWxlcyIpOyAgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNb2R1bGVGYWNldChJRmFjZXRlZFByb2plY3RCYXNlIGZwcm9qKSB7Ci0JCWZvciAoSVByb2plY3RGYWNldFZlcnNpb24gZnYgOiBmcHJvai5nZXRQcm9qZWN0RmFjZXRzKCkpIHsKLQkJCWlmIChNT0RVTEVTX0dST1VQLmdldE1lbWJlcnMoKS5jb250YWlucyhmdikpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0TW9kdWxlRmFjZXQoSUZhY2V0ZWRQcm9qZWN0QmFzZSBmcHJvaikgewotCQlmb3IgKElQcm9qZWN0RmFjZXRWZXJzaW9uIGZ2IDogZnByb2ouZ2V0UHJvamVjdEZhY2V0cygpKSB7Ci0JCQlpZiAoTU9EVUxFU19HUk9VUC5nZXRNZW1iZXJzKCkuY29udGFpbnMoZnYpKSB7Ci0JCQkJcmV0dXJuIGZ2OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0ODVjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBQZXJmb3JtcyB0aGluZ3MgY29tbW9uIHRvIGluc3RhbGwsIHZlcnNpb24gY2hhbmdlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKcGFGYWNldEFjdGlvbkRlbGVnYXRlCi0JaW1wbGVtZW50cyBJRGVsZWdhdGUsIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCXB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoCi0JCQlJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0JCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCXRoaXMuZXhlY3V0ZV8ocHJvamVjdCwgZnYsIGNvbmZpZywgbW9uaXRvcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVfKAotCQkJSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdWJNb25pdG9yIHN1Yk1vbml0b3IgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgNyk7Ci0JCQotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCQotCQkvLyBwcm9qZWN0IHNldHRpbmdzCi0JCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0gPSAoSnBhUGxhdGZvcm1EZXNjcmlwdGlvbikgZGF0YU1vZGVsLmdldFByb3BlcnR5KFBMQVRGT1JNKTsKLQkJSnB0SnBhQ29yZVBsdWdpbi5zZXRKcGFQbGF0Zm9ybUlkKHByb2plY3QsIHBsYXRmb3JtLmdldElkKCkpOwotCQlzdWJNb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCS8vIGRvIE5PVCB1c2UgSURhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShTdHJpbmcpIC0gb3IgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBuYW1lIGNhbgotCQkvLyBiZSBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIC0gd2Ugd2FudCBpdCB0byBiZSBudWxsCi0JCUpwdEpwYUNvcmVQbHVnaW4uc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKHByb2plY3QsIChTdHJpbmcpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShDT05ORUNUSU9OKSk7Ci0JCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQkKLQkJaWYgKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLnNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKHByb2plY3QsIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRykpOwotCQl9Ci0JCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQkKLQkJaWYgKGRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4uc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShwcm9qZWN0LCBkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpOwotCQl9Ci0JCXN1Yk1vbml0b3Iud29ya2VkKDEpOwotCQkKLQkJSnB0SnBhQ29yZVBsdWdpbi5zZXREaXNjb3ZlckFubm90YXRlZENsYXNzZXMocHJvamVjdCwgZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpOwotCQlzdWJNb25pdG9yLndvcmtlZCgxKTsKLQkJCi0JCS8vIGRlZmF1bHRzIHNldHRpbmdzCi0JCUpwdEpwYUNvcmVQbHVnaW4uc2V0RGVmYXVsdEpwYVBsYXRmb3JtSWQoZnYuZ2V0VmVyc2lvblN0cmluZygpLCBwbGF0Zm9ybS5nZXRJZCgpKTsKLQkJc3ViTW9uaXRvci53b3JrZWQoMSk7Ci0JCQotCQkvL0RlbGVnYXRlIHRvIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgdG8gY29uZmlndXJlIHRoZSBwcm9qZWN0IGNsYXNzcGF0aAotCQkoKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIGRhdGFNb2RlbC5nZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURSkpLmV4ZWN1dGUoc3ViTW9uaXRvci5uZXdDaGlsZCgxKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzYzFiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzCi0JZXh0ZW5kcyBJRGF0YU1vZGVsUHJvcGVydGllcwotewotCVN0cmluZyBQUkVGSVggPSAiSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzIjsKLQlTdHJpbmcgUFJFRklYXyA9IFBSRUZJWCArICcuJzsKLQkKLQkvKioKLQkgKiBJbnRlcm5hbCwgdHlwZSBJUnVudGltZSwgaWRlbnRpZmllcyBydW50aW1lIGFzc29jaWF0ZWQgd2l0aCBwcm9qZWN0Ci0JICogVXNlZCBvbmx5IGluIGNvbmp1bmN0aW9uIHdpdGggdmFsaWRhdGlvbiBvZiBvdGhlciBwcm9wZXJ0aWVzLCBiZWNhdXNlIHRoaXMgaW5mb3JtYXRpb24KLQkgKiBpcyBvdGhlcndpc2UgaW5hY2Nlc3NpYmxlIHRvIHRoaXMgZGF0YSBtb2RlbAotCSAqLwotCVN0cmluZyBSVU5USU1FID0gUFJFRklYXyArICJSVU5USU1FIjsKLQkKLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uLCBpZGVudGlmaWVzIEpwYSBQbGF0Zm9ybQotCSAqLwotCVN0cmluZyBQTEFURk9STSA9IFBSRUZJWF8gKyAiUExBVEZPUk0iOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUsIHRoZSBsaWJyYXJ5IGluc3RhbGwgZGVsZWdhdGUgdXNlZCB0byBjb25maWd1cmUgSlBBIHByb3ZpZGVyIGxpYnJhcnkKLQkgKi8KLSAgICBTdHJpbmcgTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURSA9IFBSRUZJWF8gKyAiTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURSI7Ci0JCi0gICAgLyoqCi0JICogTm90IHJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyBkYXRhYmFzZSBjb25uZWN0aW9uCi0JICovCi0JU3RyaW5nIENPTk5FQ1RJT04gPSBQUkVGSVhfICsgIkNPTk5FQ1RJT04iOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIGlkZW50aWZpZXMgd2hldGhlciBkYXRhYmFzZSBjb25uZWN0aW9uIGlzIGFjdGl2ZQotCSAqLwotCVN0cmluZyBDT05ORUNUSU9OX0FDVElWRSA9IFBSRUZJWF8gKyAiQ09OTkVDVElPTl9BQ1RJVkUiOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIGlkZW50aWZpZXMgaWYgdGhlIHVzZXIgd2lzaGVzIHRvIG92ZXJyaWRlIGRlZmF1bHQgQ2F0YWxvZyBuYW1lCi0JICovCi0JU3RyaW5nIFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HID0gUFJFRklYXyArICJVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRyI7Ci0JCi0JLyoqCi0JICogTm90IHJlcXVpcmVkLCB0eXBlIFN0cmluZywgaWRlbnRpZmllcyB0aGUgdXNlciBvdmVycmlkZGVuIGRlZmF1bHQgQ2F0YWxvZyBuYW1lCi0JICovCi0JU3RyaW5nIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HID0gUFJFRklYXyArICJVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRyI7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBCb29sZWFuLCBpZGVudGlmaWVzIGlmIHRoZSB1c2VyIHdpc2hlcyB0byBvdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBuYW1lCi0JICovCi0JU3RyaW5nIFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEgPSBQUkVGSVhfICsgIlVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEiOwotCQotCS8qKgotCSAqIE5vdCByZXF1aXJlZCwgdHlwZSBTdHJpbmcsIGlkZW50aWZpZXMgdGhlIHVzZXIgb3ZlcnJpZGRlbiBkZWZhdWx0IHNjaGVtYSBuYW1lCi0JICovCi0JU3RyaW5nIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEgPSBQUkVGSVhfICsgIlVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEiOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIGJvb2xlYW4sIG9wcG9zaXRlIG9mIExJU1RfQU5OT1RBVEVEX0NMQVNTRVMsIGlkZW50aWZpZXMgCi0JICogd2hldGhlciBhbGwgYW5ub3RhdGVkIGNsYXNzZXMgYXJlIHRvIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYXMgcGFydCBvZiAKLQkgKiBhbGwgcGVyc2lzdGVuY2UgdW5pdHMKLQkgKi8KLQlTdHJpbmcgRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMgPSBQUkVGSVhfICsgIkRJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTIjsKLQkKLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBib29sZWFuLCBvcHBvc2l0ZSBvZiBESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgaWRlbnRpZmllcwotCSAqIGlmIGFubm90YXRlZCBjbGFzc2VzIHNob3VsZCBiZSBsaXN0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBpbiBvcmRlciB0bwotCSAqIGJlIGNvbnNpZGVyZWQgcGFydCBvZiBhIHBlcnNpc3RlbmNlIHVuaXQKLQkgKiAoVGhpcyBhZGRpdGlvbmFsIHNldHRpbmcgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHVzZSBzeW5jaEhlbHBlciB3aXRoaW4KLQkgKiB0aGUgd2l6YXJkIC0gdGhlcmUgbXVzdCBiZSBhIHVuaXF1ZSBwcm9wZXJ0eSBmb3IgZWFjaCByYWRpbyBidXR0b24uIFN0dXBpZAotCSAqIGJ1dCB0cnVlKQotCSAqLwotCVN0cmluZyBMSVNUX0FOTk9UQVRFRF9DTEFTU0VTID0gUFJFRklYXyArICJMSVNUX0FOTk9UQVRFRF9DTEFTU0VTIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0ZWY1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUubGlicHJvdi5KcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5JTGlicmFyeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5MaWJyYXJ5SW5zdGFsbERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlcgotCWV4dGVuZHMgRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcwotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVKQl9GQUNFVF9JRCA9IElNb2R1bGVDb25zdGFudHMuSlNUX0VKQl9NT0RVTEU7Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFBMQVRGT1JNX05PVF9TUEVDSUZJRURfU1RBVFVTID0gCi0JCQlidWlsZEVycm9yU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QTEFURk9STV9OT1RfU1BFQ0lGSUVEKTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgQ09OTkVDVElPTl9OT1RfQ09OTkVDVEVEX1NUQVRVUyA9IAotCQkJYnVpbGRJbmZvU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05ORUNUSU9OX05PVF9DT05ORUNURUQpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEX1NUQVRVUyA9IAotCQkJYnVpbGRFcnJvclN0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfREVGQVVMVF9DQVRBTE9HX05PVF9TUEVDSUZJRUQpOwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSVN0YXR1cyBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BX05PVF9TUEVDSUZJRURfU1RBVFVTID0gCi0JCQlidWlsZEVycm9yU3RhdHVzKEpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9ERUZBVUxUX1NDSEVNQV9OT1RfU1BFQ0lGSUVEKTsKLQkKLQkKLQlwcml2YXRlIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgZGVmYXVsdExpYnJhcnlQcm92aWRlcjsKLQkKLQkvKiogY2FjaGUgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSAtIGNoYW5nZSBpdCB3aGVuZXZlciB0aGUgdXNlciBzZWxlY3RzIGEgZGlmZmVyZW50IG5hbWUgKi8KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCQotCQotCS8qKgotCSAqIHJlcXVpcmVkIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSnBhRmFjZXREYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBTZXQ8U3RyaW5nPiBwcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0UHJvcGVydHlOYW1lcygpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChSVU5USU1FKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUExBVEZPUk0pOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQ09OTkVDVElPTik7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKENPTk5FQ1RJT05fQUNUSVZFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChMSVNUX0FOTk9UQVRFRF9DTEFTU0VTKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKSB7Ci0JCXJldHVybiAoSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkpIHRoaXMuZ2V0UHJvcGVydHkoRkFDRVRFRF9QUk9KRUNUX1dPUktJTkdfQ09QWSk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0VmVyc2lvbiBnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gKElQcm9qZWN0RmFjZXRWZXJzaW9uKSB0aGlzLmdldFByb3BlcnR5KEZBQ0VUX1ZFUlNJT04pOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgZ2V0UnVudGltZSgpIHsKLQkJcmV0dXJuIChJUnVudGltZSkgdGhpcy5nZXRQcm9wZXJ0eShSVU5USU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiAoSnBhUGxhdGZvcm1EZXNjcmlwdGlvbikgZ2V0UHJvcGVydHkoUExBVEZPUk0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBnZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCkgewotCQlyZXR1cm4gKExpYnJhcnlJbnN0YWxsRGVsZWdhdGUpIHRoaXMuZ2V0UHJvcGVydHkoTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURSk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29ubmVjdGlvbk5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldFByb3BlcnR5KENPTk5FQ1RJT04pOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRyk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGVuYWJsZWQgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7Ci0JCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uSXNBY3RpdmUoKSAmJiB0aGlzLmRhdGFiYXNlU3VwcG9ydHNDYXRhbG9ncygpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKSkgewotCQkJcmV0dXJuIHRoaXMudXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKLQkJCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Jc0FjdGl2ZSgpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlyZXR1cm4gdGhpcy51c2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBkZWZhdWx0cyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVF9JRCkpIHsKLQkJCXJldHVybiBKcGFGYWNldC5JRDsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhSVU5USU1FKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdFBsYXRmb3JtKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURSkpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0TGlicmFyeVByb3ZpZGVyKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0Q29ubmVjdGlvbigpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT05fQUNUSVZFKSkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLmNvbm5lY3Rpb25Jc0FjdGl2ZSgpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRykpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0VXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0VXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMpKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdERpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcygpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExJU1RfQU5OT1RBVEVEX0NMQVNTRVMpKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdExpc3RBbm5vdGF0ZWRDbGFzc2VzKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKCk7Ci0JCi0JcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgZ2V0RGVmYXVsdExpYnJhcnlQcm92aWRlcigpIHsKLQkJLy8gZGVsZWdhdGUgaXRzZWxmIGNoYW5nZXMgb25seSB3aGVuIGZhY2V0IHZlcnNpb24gY2hhbmdlcwotCQlpZiAodGhpcy5kZWZhdWx0TGlicmFyeVByb3ZpZGVyID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdExpYnJhcnlQcm92aWRlciA9IGJ1aWxkRGVmYXVsdExpYnJhcnlQcm92aWRlcigpOwotCQl9Ci0JCWVsc2UgaWYgKCEgdGhpcy5kZWZhdWx0TGlicmFyeVByb3ZpZGVyLmdldFByb2plY3RGYWNldFZlcnNpb24oKS5lcXVhbHMoZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKSkgewotCQkJdGhpcy5kZWZhdWx0TGlicmFyeVByb3ZpZGVyLmRpc3Bvc2UoKTsKLQkJCXRoaXMuZGVmYXVsdExpYnJhcnlQcm92aWRlciA9IGJ1aWxkRGVmYXVsdExpYnJhcnlQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0TGlicmFyeVByb3ZpZGVyOwotCX0KLQkKLQlwcm90ZWN0ZWQgIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgYnVpbGREZWZhdWx0TGlicmFyeVByb3ZpZGVyKCkgewotCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcGp3YyA9IHRoaXMuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpOwotCQlpZiAoZnBqd2MgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSVByb2plY3RGYWNldFZlcnNpb24gcGZ2ID0gdGhpcy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCk7Ci0JCWlmIChwZnYgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCU1hcDxTdHJpbmcsIE9iamVjdD4gY3VzdG9tRW5hYmxlbWVudFZhcmlhYmxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOwotCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGpwYVBsYXRmb3JtID0gZ2V0UGxhdGZvcm0oKTsKLQkJU3RyaW5nIGpwYVBsYXRmb3JtSWQgPSAoanBhUGxhdGZvcm0gPT0gbnVsbCkgPyAiIiA6IGpwYVBsYXRmb3JtLmdldElkKCk7Ci0JCWN1c3RvbUVuYWJsZW1lbnRWYXJpYWJsZXMucHV0KAotCQkJCQlKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLkpQQV9QTEFURk9STV9FTkFCTEVNRU5UX0VYUCwganBhUGxhdGZvcm1JZCk7Ci0JCWN1c3RvbUVuYWJsZW1lbnRWYXJpYWJsZXMucHV0KAotCQkJCQlKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLkpQQV9QTEFURk9STV9ERVNDUklQVElPTl9FTkFCTEVNRU5UX0VYUCwganBhUGxhdGZvcm0pOwotCQkKLQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBscCA9IG5ldyBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKGZwandjLCBwZnYsIGN1c3RvbUVuYWJsZW1lbnRWYXJpYWJsZXMpOwotCQlscC5hZGRMaXN0ZW5lcihidWlsZExpYnJhcnlQcm92aWRlckxpc3RlbmVyKCkpOwotCQlyZXR1cm4gbHA7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZExpYnJhcnlQcm92aWRlckxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHksIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlICkgewotCQkJCQlpZiAoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZS5QUk9QX0FWQUlMQUJMRV9QUk9WSURFUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJCQkJYWRqdXN0TGlicmFyeVByb3ZpZGVycygpOwotCQkJCQl9Ci0JCQkJCUpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIudGhpcy5nZXREYXRhTW9kZWwoKS5ub3RpZnlQcm9wZXJ0eUNoYW5nZSgKLQkJCQkJCQlMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFLCBJRGF0YU1vZGVsLlZBTFVFX0NIRyk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0Q29ubmVjdGlvbigpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBCb29sZWFuIGdldERlZmF1bHRVc2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBCb29sZWFuIGdldERlZmF1bHRVc2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQm9vbGVhbiBnZXREZWZhdWx0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCk7Ci0JCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2V0RGVmYXVsdExpc3RBbm5vdGF0ZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCAhIHRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBydW50aW1lU3VwcG9ydHNFamIzMCgpIHsKLQkJSVJ1bnRpbWUgcnVudGltZSA9IHRoaXMuZ2V0UnVudGltZSgpOwotCQlyZXR1cm4gKHJ1bnRpbWUgIT0gbnVsbCkgJiYgcnVudGltZS5zdXBwb3J0cyh0aGlzLmdldEVKQjMwKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0RUpCMzAoKSB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoRUpCX0ZBQ0VUX0lEKS5nZXRWZXJzaW9uKCIzLjAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplIGRhdGEgbW9kZWwgKioqKioqKioqKgotCQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvcGVydHkncyB2YWx1ZSBoYXMgY2hhbmdlZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgotCSAqIFJldHVybiB3aGV0aGVyIHRvIGZpcmUgYSBWQUxVRV9DSEcgRGF0YU1vZGVsRXZlbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKSkgewotCQkJLy9uby1vcAotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRkFDRVRfVkVSU0lPTikpIHsKLQkJCWFkanVzdExpYnJhcnlQcm92aWRlcnMoKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUExBVEZPUk0sIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFJVTlRJTUUpKSB7Ci0JCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IHRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQkJaWYgKGxpZCAhPSBudWxsKSB7Ci0JCQkJLy8gbWF5IGJlIG51bGwgd2hpbGUgbW9kZWwgaXMgYmVpbmcgYnVpbHQgdXAKLQkJCQkvLyAuLi4gb3IgaW4gdGVzdHMKLQkJCQlsaWQucmVmcmVzaCgpOwotCQkJfQotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKExJU1RfQU5OT1RBVEVEX0NMQVNTRVMsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUExBVEZPUk0pKSB7Ci0JCQlhZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDT05ORUNUSU9OKSkgewotCQkJdGhpcy5zZXRCb29sZWFuUHJvcGVydHkoQ09OTkVDVElPTl9BQ1RJVkUsIHRoaXMuY29ubmVjdGlvbklzQWN0aXZlKCkpOwotCQkJCi0JCQkvLyBKcGFGYWNldFdpemFyZFBhZ2Ugc2V0cyB0aGUgY29ubmVjdGlvbiB3aGVuIHRoZSB1c2VyIGFkZHMgYSBuZXcgY29ubmVjdGlvbgotCQkJLy8gaW1wbHlpbmcgdGhhdCB0aGVyZSBpcyBhIG5ldyBzZXQgb2YgdmFsaWQgY29ubmVjdGlvbnMgdG8gY2hvb3NlIGZyb20KLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoQ09OTkVDVElPTiwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQotCQkJLy8gY2F0YWxvZwotCQkJaWYgKChwcm9wZXJ0eVZhbHVlICE9IG51bGwpICYmIHRoaXMuZGF0YWJhc2VTdXBwb3J0c0NhdGFsb2dzKCkpIHsgIC8vIGNvbm5lY3Rpb24gc2V0IHRvIHNvbWV0aGluZyB0aGF0IHN1cHBvcnRzIGNhdGFsb2dzCi0JCQkJdGhpcy5zZXRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgdGhpcy5nZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKSk7Ci0JCQl9IGVsc2UgeyAgLy8gY29ubmVjdGlvbiBlaXRoZXIgJzxOb25lPicgb3Igbm9uLWNhdGFsb2cgZGF0YWJhc2UKLQkJCQl0aGlzLnNldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgZmFsc2UpOwotCQkJfQotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQotCQkJLy8gc2NoZW1hCi0JCQlpZiAocHJvcGVydHlWYWx1ZSA9PSBudWxsKSB7ICAvLyBjb25uZWN0aW9uIHNldCB0byAnPE5vbmU+JwotCQkJCXRoaXMuc2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCB0aGlzLmdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCkpOwotCQkJfQotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT05fQUNUSVZFKSkgewotCQkJLy8gY2F0YWxvZwotCQkJaWYgKHRoaXMucHJvcGVydHlWYWx1ZUlzRmFsc2UocHJvcGVydHlWYWx1ZSkpIHsgIC8vIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUKLQkJCQl0aGlzLnNldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgZmFsc2UpOwotCQkJfQotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQotCQkJLy8gc2NoZW1hCi0JCQlpZiAodGhpcy5wcm9wZXJ0eVZhbHVlSXNGYWxzZShwcm9wZXJ0eVZhbHVlKSkgeyAgLy8gY29ubmVjdGlvbiBpcyBpbmFjdGl2ZQotCQkJCXRoaXMuc2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIGZhbHNlKTsKLQkJCX0KLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuVkFMSURfVkFMVUVTX0NIRyk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRykpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQlpZiAodGhpcy5wcm9wZXJ0eVZhbHVlSXNGYWxzZShwcm9wZXJ0eVZhbHVlKSkgewotCQkJCXRoaXMuc2V0UHJvcGVydHkoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csIG51bGwpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7Ci0JCQl0aGlzLnNldFByb3BlcnR5KFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKSk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBJRGF0YU1vZGVsLlZBTElEX1ZBTFVFU19DSEcpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCWlmICh0aGlzLnByb3BlcnR5VmFsdWVJc0ZhbHNlKHByb3BlcnR5VmFsdWUpKSB7Ci0JCQkJdGhpcy5zZXRQcm9wZXJ0eShVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCBudWxsKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTKSkgewotCQkJdGhpcy5zZXRCb29sZWFuUHJvcGVydHkoTElTVF9BTk5PVEFURURfQ0xBU1NFUywgdGhpcy5wcm9wZXJ0eVZhbHVlSXNGYWxzZShwcm9wZXJ0eVZhbHVlKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSVNUX0FOTk9UQVRFRF9DTEFTU0VTKSkgewotCQkJdGhpcy5zZXRCb29sZWFuUHJvcGVydHkoRElTQ09WRVJfQU5OT1RBVEVEX0NMQVNTRVMsIHRoaXMucHJvcGVydHlWYWx1ZUlzRmFsc2UocHJvcGVydHlWYWx1ZSkpOwotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvcGVydHlWYWx1ZUlzRmFsc2UoT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJcmV0dXJuICEgdGhpcy5wcm9wZXJ0eVZhbHVlSXNUcnVlKHByb3BlcnR5VmFsdWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9wZXJ0eVZhbHVlSXNUcnVlKE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIHByb3BlcnR5VmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGp1c3RMaWJyYXJ5UHJvdmlkZXJzKCkgewotCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IHRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpOwotCQkKLQkJaWYgKGxpZCAhPSBudWxsKSB7Ci0JCQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGpwYVBsYXRmb3JtID0gZ2V0UGxhdGZvcm0oKTsKLQkJCVN0cmluZyBqcGFQbGF0Zm9ybUlkID0gKGpwYVBsYXRmb3JtID09IG51bGwpID8gIiIgOiBqcGFQbGF0Zm9ybS5nZXRJZCgpOwotCQkJCi0JCQlsaWQuc2V0RW5hYmxlbWVudENvbnRleHRWYXJpYWJsZSgKLQkJCQkJSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5KUEFfUExBVEZPUk1fRU5BQkxFTUVOVF9FWFAsIGpwYVBsYXRmb3JtSWQpOwotCQkJbGlkLnNldEVuYWJsZW1lbnRDb250ZXh0VmFyaWFibGUoCi0JCQkJCUpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuSlBBX1BMQVRGT1JNX0RFU0NSSVBUSU9OX0VOQUJMRU1FTlRfRVhQLCBqcGFQbGF0Zm9ybSk7Ci0JCQkKLQkJCUxpc3Q8SnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4ganBhQ29uZmlncyAKLQkJCQkJPSBuZXcgQXJyYXlMaXN0PEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc+KCk7Ci0JCQkvLyBhZGQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvbmUgZmlyc3QKLQkJCUpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY3VycmVudEpwYUNvbmZpZyA9IG51bGw7Ci0JCQlMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb25Db25maWcgY29uZmlnID0gbGlkLmdldExpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZygpOwotCQkJaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIHsKLQkJCQljdXJyZW50SnBhQ29uZmlnID0gKEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZzsKLQkJCQlqcGFDb25maWdzLmFkZChjdXJyZW50SnBhQ29uZmlnKTsKLQkJCX0KLQkJCWZvciAoSUxpYnJhcnlQcm92aWRlciBscCA6IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJzKCkpIHsKLQkJCQljb25maWcgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKGxwKTsKLQkJCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZwotCQkJCQkJJiYgISBjb25maWcuZXF1YWxzKGN1cnJlbnRKcGFDb25maWcpKSB7Ci0JCQkJCWpwYUNvbmZpZ3MuYWRkKChKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKSBjb25maWcpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBqcGFDb25maWcgOiBqcGFDb25maWdzKSB7Ci0JCQkJanBhQ29uZmlnLnNldEpwYVBsYXRmb3JtKGdldFBsYXRmb3JtKCkpOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcHJvcGVydHkgZGVzY3JpcHRvcnMgKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STSkpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsaWRDb25uZWN0aW9uRGVzY3JpcHRvcnMoKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRykpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsaWRDYXRhbG9nRGVzY3JpcHRvcnMoKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFNjaGVtYURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzKCkgewotCQlJdGVyYWJsZTxKcGFQbGF0Zm9ybURlc2NyaXB0aW9uPiB2YWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zID0gYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRpb25zKCk7Ci0JCUl0ZXJhYmxlPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gdmFsaWRQbGF0Zm9ybURlc2NyaXB0b3JzID0KLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKcGFQbGF0Zm9ybURlc2NyaXB0aW9uLCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I+KHZhbGlkUGxhdGZvcm1EZXNjcmlwdGlvbnMpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IgdHJhbnNmb3JtKEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZGVzYykgewotCQkJCQkJcmV0dXJuIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKGRlc2MpOwotCQkJCQl9Ci0JCQkJfTsKLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChBcnJheVRvb2xzLmFycmF5KHZhbGlkUGxhdGZvcm1EZXNjcmlwdG9ycywgRU1QVFlfRE1QRF9BUlJBWSksIERFU0NSSVBUT1JfQ09NUEFSQVRPUik7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFQbGF0Zm9ybURlc2NyaXB0aW9uPiBidWlsZFZhbGlkUGxhdGZvcm1EZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SnBhUGxhdGZvcm1EZXNjcmlwdGlvbj4oCi0JCQkJCUpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm1zKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBvKSB7Ci0JCQkJCXJldHVybiBvLnN1cHBvcnRzSnBhRmFjZXRWZXJzaW9uKGdldFByb2plY3RGYWNldFZlcnNpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4gREVTQ1JJUFRPUl9DT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcj4oKSB7Ci0JCQkJcHVibGljIGludCBjb21wYXJlKERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBkbXBkMSwgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGRtcGQyKSB7Ci0JCQkJCXJldHVybiBkbXBkMS5nZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkuY29tcGFyZVRvKGRtcGQyLmdldFByb3BlcnR5RGVzY3JpcHRpb24oKSk7Ci0JCQkJfQotCQkJfTsKLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYnVpbGRWYWxpZENvbm5lY3Rpb25EZXNjcmlwdG9ycygpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbm5lY3Rpb25OYW1lcyA9IHRoaXMuYnVpbGRWYWxpZENvbm5lY3Rpb25OYW1lcygpOwotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbY29ubmVjdGlvbk5hbWVzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWRlc2NyaXB0b3JzW2ldID0gdGhpcy5idWlsZENvbm5lY3Rpb25EZXNjcmlwdG9yKGNvbm5lY3Rpb25OYW1lcy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0JCi0JLyoqCi0JICogcHV0IGEgbnVsbCBlbnRyeSBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0IChmb3IgPG5vbmU+KQotCSAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRWYWxpZENvbm5lY3Rpb25OYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IGNvbm5lY3Rpb25OYW1lcyA9IENvbGxlY3Rpb25Ub29scy5zb3J0KENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpKSk7Ci0JCWNvbm5lY3Rpb25OYW1lcy5hZGQoMCwgbnVsbCk7Ci0JCXJldHVybiBjb25uZWN0aW9uTmFtZXM7Ci0JfQotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBidWlsZFZhbGlkQ2F0YWxvZ0Rlc2NyaXB0b3JzKCkgewotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJcmV0dXJuIChkYiA9PSBudWxsKSA/IEVNUFRZX0RNUERfQVJSQVkgOiB0aGlzLmJ1aWxkRGVzY3JpcHRvcnModGhpcy5idWlsZFZhbGlkQ2F0YWxvZ0lkZW50aWZpZXJzKGRiKSk7Ci0JfQotCQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICdkYicgaXMgbm90IG51bGwKLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IGJ1aWxkVmFsaWRDYXRhbG9nSWRlbnRpZmllcnMoRGF0YWJhc2UgZGIpIHsKLQkJLy8gdXNlIGNhdGFsb2cgKmlkZW50aWZpZXJzKiBzaW5jZSB0aGUgc3RyaW5nIGVuZHMgdXAgYmVpbmcgdGhlICJkZWZhdWx0IiBmb3IgdmFyaW91cyB0ZXh0IGVudHJpZXMKLQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFN0cmluZ3MoZGIuZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCksIHRoaXMuZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYnVpbGRWYWxpZFNjaGVtYURlc2NyaXB0b3JzKCkgewotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJcmV0dXJuIChkYiA9PSBudWxsKSA/IEVNUFRZX0RNUERfQVJSQVkgOiB0aGlzLmJ1aWxkRGVzY3JpcHRvcnModGhpcy5idWlsZFZhbGlkU2NoZW1hSWRlbnRpZmllcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRWYWxpZFNjaGVtYUlkZW50aWZpZXJzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkU3RyaW5ncyh0aGlzLmdldFNjaGVtYUlkZW50aWZpZXJzKCksIHRoaXMuZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFNjaGVtYUlkZW50aWZpZXJzKCkgewotCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldFNjaGVtYUNvbnRhaW5lcigpOwotCQkvLyB1c2Ugc2NoZW1hICppZGVudGlmaWVycyogc2luY2UgdGhlIHN0cmluZyBlbmRzIHVwIGJlaW5nIHRoZSAiZGVmYXVsdCIgZm9yIHZhcmlvdXMgdGV4dCBlbnRyaWVzCi0JCXJldHVybiAoc2MgIT0gbnVsbCkgPyBzYy5nZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCQotCS8qKgotCSAqIHB1dCBhbiBlbnRyeSBmb3IgdGhlIGRlZmF1bHQgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0PFN0cmluZz4gYnVpbGRWYWxpZFN0cmluZ3MoSXRlcmFibGU8U3RyaW5nPiBzdHJpbmdzLCBTdHJpbmcgZGVmYXVsdFN0cmluZykgewotCQlMaXN0PFN0cmluZz4gdmFsaWRTdHJpbmdzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qoc3RyaW5ncyk7Ci0JCWlmICgoZGVmYXVsdFN0cmluZyAhPSBudWxsKSAmJiAhIHZhbGlkU3RyaW5ncy5jb250YWlucyhkZWZhdWx0U3RyaW5nKSkgewotCQkJdmFsaWRTdHJpbmdzLmFkZCgwLCBkZWZhdWx0U3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gdmFsaWRTdHJpbmdzOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYnVpbGREZXNjcmlwdG9ycyhMaXN0PFN0cmluZz4gc3RyaW5ncykgewotCQlEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Jbc3RyaW5ncy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZXNjcmlwdG9yc1tpXSA9IG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3Ioc3RyaW5ncy5nZXQoaSkpOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBFTVBUWV9ETVBEX0FSUkFZID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvclswXTsKLQkKLQkvKioKLQkgKiBwbGF0Zm9ybSBhbmQgY29ubmVjdGlvbiBoYXZlICdkZXNjcmlwdGlvbidzIChpbiBhZGRpdGlvbiB0byAndmFsdWUncykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGdldFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJcmV0dXJuIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKHRoaXMuZ2V0UGxhdGZvcm0oKSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKLQkJCXJldHVybiBidWlsZENvbm5lY3Rpb25EZXNjcmlwdG9yKHRoaXMuZ2V0Q29ubmVjdGlvbk5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGJ1aWxkUGxhdGZvcm1EZXNjcmlwdG9yKEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0pIHsKLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IocGxhdGZvcm0sIHBsYXRmb3JtLmdldExhYmVsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtTGFiZWwoU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0ocGxhdGZvcm1JZCkuZ2V0TGFiZWwoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBidWlsZENvbm5lY3Rpb25EZXNjcmlwdG9yKFN0cmluZyBjb25uZWN0aW9uTmFtZSkgewotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSAoY29ubmVjdGlvbk5hbWUgPT0gbnVsbCkgPyBKcHRDb3JlTWVzc2FnZXMuTk9ORSA6IG51bGw7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKGNvbm5lY3Rpb25OYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZGF0YWJhc2UgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0U2NoZW1hQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKSA/IHRoaXMuZ2V0Q2F0YWxvZygpIDogdGhpcy5nZXREYXRhYmFzZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXRDYXRhbG9nKCkgewotCQlTdHJpbmcgbmFtZSA9IHRoaXMuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKLQkJcmV0dXJuIChuYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0Q2F0YWxvZyhuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ25hbWUnIGlzIG5vdCBudWxsCi0JICovCi0JcHJvdGVjdGVkIENhdGFsb2cgZ2V0Q2F0YWxvZyhTdHJpbmcgbmFtZSkgewotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJcmV0dXJuIChkYiA9PSBudWxsKSA/IG51bGwgOiBkYi5nZXRDYXRhbG9nRm9ySWRlbnRpZmllcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZGF0YWJhc2VTdXBwb3J0c0NhdGFsb2dzKCkgewotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJcmV0dXJuIChkYiAhPSBudWxsKSAmJiBkYi5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyBudWxsIDogY3AuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29ubmVjdGlvbklzQWN0aXZlKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJcmV0dXJuIChjcCAhPSBudWxsKSAmJiBjcC5pc0FjdGl2ZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXRDb25uZWN0aW9uTmFtZSgpOwotCQlyZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZShuYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogJ25hbWUnIGlzIG5vdCBudWxsCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLmNhY2hlZENvbm5lY3Rpb25Qcm9maWxlSXNTdGFsZShuYW1lKSkgewotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9IHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FjaGVkQ29ubmVjdGlvblByb2ZpbGVJc1N0YWxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAodGhpcy5jb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB8fCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCS8vIHdlIGRvbid0IGhhdmUgYSBKUEEgcHJvamVjdCB5ZXQsIHNvIGdvIHRvIHRoZSBkYiBwbHVnLWluIGRpcmVjdGx5IHRvIGdldCB0aGUgZmFjdG9yeQotCQlyZXR1cm4gSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQTEFURk9STSkpIHsKLQkJCXJldHVybiB0aGlzLnZhbGlkYXRlUGxhdGZvcm0oKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMSUJSQVJZX1BST1ZJREVSX0RFTEVHQVRFKSkgewotCQkgICAgcmV0dXJuIHRoaXMuZ2V0TGlicmFyeUluc3RhbGxEZWxlZ2F0ZSgpLnZhbGlkYXRlKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ09OTkVDVElPTikpIHsKLQkJCXJldHVybiB0aGlzLnZhbGlkYXRlQ29ubmVjdGlvbigpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HKQotCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSkKLQkJCQl8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUEpKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZVVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUykpIHsKLQkJCXJldHVybiB0aGlzLnZhbGlkYXRlUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFBsYXRmb3JtKCkgPT0gbnVsbCkgPyBQTEFURk9STV9OT1RfU1BFQ0lGSUVEX1NUQVRVUyA6IE9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVDb25uZWN0aW9uKCkgewotCQlTdHJpbmcgY29ubmVjdGlvbk5hbWUgPSB0aGlzLmdldENvbm5lY3Rpb25OYW1lKCk7Ci0JCXJldHVybiAoY29ubmVjdGlvbk5hbWUgPT0gbnVsbCkgPyBPS19TVEFUVVMgOiB0aGlzLnZhbGlkYXRlTm9uTnVsbENvbm5lY3Rpb24oY29ubmVjdGlvbk5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZU5vbk51bGxDb25uZWN0aW9uKFN0cmluZyBjb25uZWN0aW9uTmFtZSkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoY29ubmVjdGlvbk5hbWUpOwotCQlpZiAoY3AgPT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkRXJyb3JTdGF0dXMoTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0NPTk5FQ1RJT05fSU5WQUxJRCwgY29ubmVjdGlvbk5hbWUpKTsKLQkJfQotCQlpZiAoICEgY3AuaXNBY3RpdmUoKSkgewotCQkJcmV0dXJuIENPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRF9TVEFUVVM7Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpIHsKLQkJaWYgKHRoaXMudXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRDYXRhbG9nKCkpIHsKLQkJCWlmICh0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEX1NUQVRVUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7Ci0JCWlmICh0aGlzLnVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkpIHsKLQkJCWlmICh0aGlzLmdldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIFVTRVJfT1ZFUlJJREVfREVGQVVMVF9TQ0hFTUFfTk9UX1NQRUNJRklFRF9TVEFUVVM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQZXJzaXN0ZW50Q2xhc3NNYW5hZ2VtZW50KCkgewotCQkvLyBUT0RPIHdhcm5pbmcgaWYgImRpc2NvdmVyeSIgaXMgdXNlZCwgYnV0IG5vIHJ1bnRpbWUgc3BlY2lmaWVkID8/Ci0JCS8vIGJvb2xlYW4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzID0gdGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXMoKTsKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGJ1aWxkSW5mb1N0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gYnVpbGRTdGF0dXMoSVN0YXR1cy5JTkZPLCBtZXNzYWdlKTsKLQl9Ci0JCi0vLwlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIGJ1aWxkV2FybmluZ1N0YXR1cyhTdHJpbmcgbWVzc2FnZSkgewotLy8JCXJldHVybiBidWlsZFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIG1lc3NhZ2UpOwotLy8JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgSVN0YXR1cyBidWlsZEVycm9yU3RhdHVzKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBidWlsZFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBtZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGJ1aWxkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoc2V2ZXJpdHksIEpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmM0MjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi0JZXh0ZW5kcyBKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlTdHJpbmcgUFJFRklYID0gIkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMiOwotCVN0cmluZyBQUkVGSVhfID0gUFJFRklYICsgJy4nOwotCQotCS8qKgotCSAqIFJlcXVpcmVkLCB0eXBlIEJvb2xlYW4sIGlkZW50aWZpZXMgaWYgdGhlIHVzZXIgd2lzaGVzIHRvIGFkZCB0aGUgZGF0YWJhc2UgZHJpdmVyIGphcnMgdG8gdGhlIGNsYXNzcGF0aAotCSAqLwotCVN0cmluZyBVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEggPSBQUkVGSVhfICsgIlVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCI7Ci0KLQkvKioKLQkgKiBOb3QgcmVxdWlyZWQsIHR5cGUgU3RyaW5nLCBpZGVudGlmaWVzIHRoZSBkYXRhYmFzZSBkcml2ZXIgbGlicmFyeSBhZGRlZCB0byB0aGUgY2xhc3NwYXRoCi0JICovCi0JU3RyaW5nIERCX0RSSVZFUl9OQU1FID0gUFJFRklYXyArICJEQl9EUklWRVJfTkFNRSI7Ci0KLQkvKioKLQkgKiBSZXF1aXJlZCwgdHlwZSBib29sZWFuLCBkZXRhaWxzIHdoZXRoZXIgb3JtLnhtbCBzaG91bGQgYmUgY3JlYXRlZAotCSAqLwotCVN0cmluZyBDUkVBVEVfT1JNX1hNTCA9IFBSRUZJWF8gKyAiQ1JFQVRFX09STV9YTUwiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MGUwNjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIKLQlleHRlbmRzIEpwYUZhY2V0RGF0YU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQkvKioKLQkgKiByZXF1aXJlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKLQkJU2V0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IHN1cGVyLmdldFByb3BlcnR5TmFtZXMoKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRIKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoREJfRFJJVkVSX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChDUkVBVEVfT1JNX1hNTCk7Ci0JCXJldHVybiBwcm9wZXJ0eU5hbWVzOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBib29sZWFuIHVzZXJXYW50c1RvQWRkRGJEcml2ZXJKYXJzVG9DbGFzc3BhdGgoKSB7Ci0JCXJldHVybiB0aGlzLmdldEJvb2xlYW5Qcm9wZXJ0eShVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldFByb3BlcnR5KERCX0RSSVZFUl9OQU1FKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBlbmFibGVkICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCkpIHsKLQkJCXJldHVybiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpICE9IG51bGwpOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERCX0RSSVZFUl9OQU1FKSkgewotCQkJcmV0dXJuIHRoaXMudXNlcldhbnRzVG9BZGREYkRyaXZlckphcnNUb0NsYXNzcGF0aCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuaXNQcm9wZXJ0eUVuYWJsZWQocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBkZWZhdWx0cyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX1dBTlRTX1RPX0FERF9EQl9EUklWRVJfSkFSU19UT19DTEFTU1BBVEgpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhEQl9EUklWRVJfTkFNRSkpIHsKLQkJCXJldHVybiB0aGlzLmdldERlZmF1bHREcml2ZXJOYW1lKCk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ1JFQVRFX09STV9YTUwpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXREZWZhdWx0UGxhdGZvcm0oKSB7Ci0JCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLmdldERlZmF1bHRKcGFQbGF0Zm9ybShnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2V0RGVmYXVsdFVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2dJZGVudGlmaWVyKCkgewotCQlEYXRhYmFzZSBkYiA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJcmV0dXJuIChkYiA9PSBudWxsKSA/IG51bGwgOiBkYi5nZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJvb2xlYW4gZ2V0RGVmYXVsdFVzZXJXYW50c1RvT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpICB7Ci0JCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0U2NoZW1hQ29udGFpbmVyKCk7Ci0JCXJldHVybiAoc2MgPT0gbnVsbCkgPyBudWxsIDogc2MuZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyTmFtZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyBudWxsIDogY3AuZ2V0RHJpdmVyTmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXREZWZhdWx0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMucnVudGltZVN1cHBvcnRzRWpiMzAoKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUgZGF0YSBtb2RlbCAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVGhlIHNwZWNpZmllZCBwcm9wZXJ0eSdzIHZhbHVlIGhhcyBjaGFuZ2VkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCi0JICogUmV0dXJuIHdoZXRoZXIgdG8gZmlyZSBhIFZBTFVFX0NIRyBEYXRhTW9kZWxFdmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBwcm9wZXJ0eVNldChTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgcHJvcGVydHlWYWx1ZSkgewotCQlib29sZWFuIG9rID0gc3VwZXIucHJvcGVydHlTZXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7Ci0JCQkvLyBkYiBkcml2ZXIKLQkJCWlmIChwcm9wZXJ0eVZhbHVlID09IG51bGwpIHsgIC8vIGNvbm5lY3Rpb24gc2V0IHRvICc8Tm9uZT4nCi0JCQkJdGhpcy5zZXRCb29sZWFuUHJvcGVydHkoVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRILCBmYWxzZSk7Ci0JCQl9Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoREJfRFJJVkVSX05BTUUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShEQl9EUklWRVJfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCkpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoREJfRFJJVkVSX05BTUUsIElEYXRhTW9kZWwuRU5BQkxFX0NIRyk7Ci0JCQlpZiAodGhpcy5wcm9wZXJ0eVZhbHVlSXNGYWxzZShwcm9wZXJ0eVZhbHVlKSkgewotCQkJCXRoaXMuc2V0UHJvcGVydHkoREJfRFJJVkVSX05BTUUsIG51bGwpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gb2s7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcHJvcGVydHkgZGVzY3JpcHRvcnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBMQVRGT1JNKSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFBsYXRmb3JtRGVzY3JpcHRvcnMoKTsKLQkJfQotCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTk5FQ1RJT04pKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkQ29ubmVjdGlvbkRlc2NyaXB0b3JzKCk7Ci0JCX0KLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhEQl9EUklWRVJfTkFNRSkpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkVmFsaWREcml2ZXJEZXNjcmlwdG9ycygpOwotCQl9Ci0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0cpKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZFZhbGlkQ2F0YWxvZ0Rlc2NyaXB0b3JzKCk7Ci0JCX0KLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BKSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRWYWxpZFNjaGVtYURlc2NyaXB0b3JzKCk7Ci0JCX0KLQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbXSBidWlsZFZhbGlkRHJpdmVyRGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10geyBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMuZ2V0RHJpdmVyTmFtZSgpKSB9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRIKQotCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoREJfRFJJVkVSX05BTUUpKSB7Ci0JCQlyZXR1cm4gdGhpcy52YWxpZGF0ZURiRHJpdmVyTmFtZSgpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIudmFsaWRhdGUocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVEYkRyaXZlck5hbWUoKSB7Ci0JCXJldHVybiBPS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0SW5zdGFsbERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDcyNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRIOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLlJlc291cmNlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uRnJhbWV3b3JrOwotCi0vKioKLSAqIFdlIGRvbid0IHJlYWxseSAiaW5zdGFsbCIgdGhlIEpQQSBmYWNldCBoZXJlLiBXZSBzaW1wbHkgc3RvcmUgYWxsIHRoZSB2YXJpb3VzCi0gKiBkYXRhIG1vZGVsIHByb3BlcnRpZXMgaW4gdGhlIGFwcHJvcHJpYXRlIHByZWZlcmVuY2VzLiBUaGVzZSBzZXR0aW5ncyB3aWxsCi0gKiB1c2VkIGluIHRoZSBQT1NUX0lOU1RBTEwgZXZlbnQgbGlzdGVuZXIgdG8gYnVpbGQgdGhlIEpQQSBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgSnBhRmFjZXRJbnN0YWxsRGVsZWdhdGUgCi0JZXh0ZW5kcyBKcGFGYWNldEFjdGlvbkRlbGVnYXRlCi0JaW1wbGVtZW50cyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZV8oCi0JCQlJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwgCi0JCQlPYmplY3QgY29uZmlnLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCi0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMTApOwotCQkKLQkJVmFsaWRhdGlvbkZyYW1ld29yay5nZXREZWZhdWx0KCkuYWRkVmFsaWRhdGlvbkJ1aWxkZXIocHJvamVjdCk7Ci0JCQotCQlzdXBlci5leGVjdXRlXyhwcm9qZWN0LCBmdiwgY29uZmlnLCBzbS5uZXdDaGlsZCgxKSk7Ci0JCQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIGNvbmZpZzsKLQkJCi0JCS8vIHByb2plY3Qgc2V0dGluZ3MKLQkJdGhpcy5hZGREYkRyaXZlckxpYnJhcnlUb0NsYXNzcGF0aChqYXZhUHJvamVjdCwgZGF0YU1vZGVsLCBzbS5uZXdDaGlsZCgxKSk7Ci0KLQkJLy8gY3JlYXRlIHByb2plY3QgWE1MIGZpbGVzCi0JCXRoaXMuY3JlYXRlUHJvamVjdFhtbChwcm9qZWN0LCBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KENSRUFURV9PUk1fWE1MKSwgc20ubmV3Q2hpbGQoOCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGREYkRyaXZlckxpYnJhcnlUb0NsYXNzcGF0aCgKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSURhdGFNb2RlbCBkYXRhTW9kZWwsIAotCQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlpZiggISBkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KFVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZHJpdmVyTmFtZSA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShEQl9EUklWRVJfTkFNRSk7Ci0JCQotCQlJQ2xhc3NwYXRoQ29udGFpbmVyIGNvbnRhaW5lciA9IEpwdEpwYURiUGx1Z2luLmluc3RhbmNlKCkuYnVpbGREcml2ZXJDbGFzc3BhdGhDb250YWluZXJGb3IoZHJpdmVyTmFtZSk7Ci0JCUlDbGFzc3BhdGhFbnRyeSBlbnRyeSA9IEphdmFDb3JlLm5ld0NvbnRhaW5lckVudHJ5KGNvbnRhaW5lci5nZXRQYXRoKCkpOwotCQl0aGlzLmFkZENsYXNzcGF0aEVudHJ5VG9Qcm9qZWN0KGVudHJ5LCBqYXZhUHJvamVjdCwgbW9uaXRvcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRDbGFzc3BhdGhFbnRyeVRvUHJvamVjdCgKLQkJCUlDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJLy8gaWYgdGhlIGNsYXNzcGF0aEVudHJ5IGlzIGFscmVhZHkgdGhlcmUsIGRvIG5vdGhpbmcKLQkJSUNsYXNzcGF0aEVudHJ5W10gY2xhc3NwYXRoID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCWlmIChBcnJheVRvb2xzLmNvbnRhaW5zKGNsYXNzcGF0aCwgY2xhc3NwYXRoRW50cnkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCS8vIGFkZCB0aGUgZ2l2ZW4gY2xhc3NwYXRoRW50cnkgdG8gdGhlIHByb2plY3QgY2xhc3NwYXRoCi0JCWludCBsZW4gPSBjbGFzc3BhdGgubGVuZ3RoOwotCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdDbGFzc3BhdGggPSBuZXcgSUNsYXNzcGF0aEVudHJ5W2xlbiArIDFdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGNsYXNzcGF0aCwgMCwgbmV3Q2xhc3NwYXRoLCAwLCBsZW4pOwotCQluZXdDbGFzc3BhdGhbbGVuXSA9IGNsYXNzcGF0aEVudHJ5OwotCQlqYXZhUHJvamVjdC5zZXRSYXdDbGFzc3BhdGgobmV3Q2xhc3NwYXRoLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2plY3RYbWwoSVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBidWlsZE9ybVhtbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWludCB0YXNrcyA9IDEgKyAoYnVpbGRPcm1YbWwgPyAxIDogMCk7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgdGFza3MpOwotCi0JCXRoaXMuY3JlYXRlUGVyc2lzdGVuY2VYbWwocHJvamVjdCwgc20ubmV3Q2hpbGQoMSkpOwotCQlpZiAoYnVpbGRPcm1YbWwpIHsKLQkJCXRoaXMuY3JlYXRlT3JtWG1sKHByb2plY3QsIHNtLm5ld0NoaWxkKDEpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQZXJzaXN0ZW5jZVhtbChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCA1KTsKLQotCQlJRGF0YU1vZGVsIGNvbmZpZyA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoQ09OVEFJTkVSX1BBVEgsIGRlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKHByb2plY3QpKTsKLQkJc20ud29ya2VkKDEpOwotCQkvLyBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG90aGVyIHByb3BlcnRpZXMgc2hvdWxkIHN1ZmZpY2UKLQkJdHJ5IHsKLQkJCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShzbS5uZXdDaGlsZCg0KSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9ybVhtbChJUHJvamVjdCBwcm9qZWN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCA1KTsKLQkJCi0JCUlEYXRhTW9kZWwgY29uZmlnID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoQ09OVEFJTkVSX1BBVEgsIGRlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKHByb2plY3QpKTsKLQkJc20ud29ya2VkKDEpOwotCQkvLyBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG90aGVyIHByb3BlcnRpZXMgc2hvdWxkIHN1ZmZpY2UKLQkJdHJ5IHsKLQkJCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShzbS5uZXdDaGlsZCg0KSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJUGF0aCBkZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVJlc291cmNlTG9jYXRvciByZXNvdXJjZUxvY2F0b3IgPSBKcHRDb21tb25Db3JlUGx1Z2luLmdldFJlc291cmNlTG9jYXRvcihwcm9qZWN0KTsKLQkJaWYgKHJlc291cmNlTG9jYXRvciA9PSBudWxsKSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZygiTm8gcmVzb3VyY2UgbG9jYXRvciBmb3IgcHJvamVjdCIpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlTG9jYXRvci5nZXREZWZhdWx0UmVzb3VyY2VMb2NhdGlvbihwcm9qZWN0KS5nZXRGdWxsUGF0aCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L0pwYUZhY2V0VW5pbnN0YWxsRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcxYjJjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFVuaW5zdGFsbERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklEZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEpwYUZhY2V0VW5pbnN0YWxsRGVsZWdhdGUgCi0JaW1wbGVtZW50cyBJRGVsZWdhdGUgCi17Ci0JcHVibGljIHZvaWQgZXhlY3V0ZShJUHJvamVjdCBwcm9qZWN0LCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiwKLQkJCU9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJSnB0SnBhQ29yZVBsdWdpbi5jbGVhclByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJSnB0SnBhQ29yZVBsdWdpbi5jbGVhclByb2plY3RQZXJzaXN0ZW50UHJvcGVydGllcyhwcm9qZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwNmJmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFZlcnNpb25DaGFuZ2VEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLQotcHVibGljIGNsYXNzIEpwYUZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3ZpZGVyCi0JZXh0ZW5kcyBKcGFGYWNldERhdGFNb2RlbFByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIElTdGF0dXMgUExBVEZPUk1fRE9FU19OT1RfU1VQUE9SVF9GQUNFVF9WRVJTSU9OX1NUQVRVUyA9IAotCQkJYnVpbGRFcnJvclN0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUExBVEZPUk1fRE9FU19OT1RfU1VQUE9SVF9GQUNFVF9WRVJTSU9OKTsKLQkKLQkKLQkvKioKLQkgKiByZXF1aXJlZCBkZWZhdWx0IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwYUZhY2V0VmVyc2lvbkNoYW5nZURhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChnZXRQcm9qZWN0TmFtZSgpKTsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkZWZhdWx0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdFBsYXRmb3JtKCkgewotCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0Q29ubmVjdGlvbigpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREYXRhU291cmNlKCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuIGdldERlZmF1bHRVc2VyV2FudHNUb092ZXJyaWRlRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKSAhPSBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXREZWZhdWx0VXNlcldhbnRzVG9PdmVycmlkZURlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpICE9IG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYUlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQm9vbGVhbiBnZXREZWZhdWx0RGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKCkgewotCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZCBwcm9wZXJ0eSBkZXNjcmlwdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYVBsYXRmb3JtRGVzY3JpcHRpb24+IGJ1aWxkVmFsaWRQbGF0Zm9ybURlc2NyaXB0aW9ucygpIHsKLQkJLy8gYWRkIGV4aXN0aW5nIHBsYXRmb3JtIHRvIGxpc3Qgb2YgY2hvaWNlcwotCQlJdGVyYWJsZTxKcGFQbGF0Zm9ybURlc2NyaXB0aW9uPiB2YWxpZFBsYXRmb3JtRGVzY3MgPSBzdXBlci5idWlsZFZhbGlkUGxhdGZvcm1EZXNjcmlwdGlvbnMoKTsKLQkJaWYgKCEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHZhbGlkUGxhdGZvcm1EZXNjcywgZ2V0RGVmYXVsdFBsYXRmb3JtKCkpKSB7Ci0JCQl2YWxpZFBsYXRmb3JtRGVzY3MgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGUoZ2V0RGVmYXVsdFBsYXRmb3JtKCksIHZhbGlkUGxhdGZvcm1EZXNjcyk7Ci0JCX0KLQkJcmV0dXJuIHZhbGlkUGxhdGZvcm1EZXNjczsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVQbGF0Zm9ybSgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZVBsYXRmb3JtKCk7Ci0JCQotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJaWYgKCEgZ2V0UGxhdGZvcm0oKS5zdXBwb3J0c0pwYUZhY2V0VmVyc2lvbihnZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkpKSB7Ci0JCQkJc3RhdHVzID0gUExBVEZPUk1fRE9FU19OT1RfU1VQUE9SVF9GQUNFVF9WRVJTSU9OX1NUQVRVUzsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvZmFjZXQvSnBhRmFjZXRWZXJzaW9uQ2hhbmdlRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzNTQzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9KcGFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBKcGFGYWNldFZlcnNpb25DaGFuZ2VEZWxlZ2F0ZQotCWV4dGVuZHMgSnBhRmFjZXRBY3Rpb25EZWxlZ2F0ZQotewotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGVfKAotCQkJSVByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYsIAotCQkJT2JqZWN0IGNvbmZpZywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCXsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCAyKTsKLQkJc3VwZXIuZXhlY3V0ZV8ocHJvamVjdCwgZnYsIGNvbmZpZywgc20ubmV3Q2hpbGQoMSkpOwotCi0JCUpwdEpwYUNvcmVQbHVnaW4ucmVidWlsZEpwYVByb2plY3QocHJvamVjdCk7Ci0JCXNtLndvcmtlZCgxKTsKLQkJLy8gbm90aGluZyBmdXJ0aGVyIHRvIGRvIGhlcmUgKmp1c3QqIHlldAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L1J1bnRpbWVDaGFuZ2VkTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2ZhY2V0L1J1bnRpbWVDaGFuZ2VkTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkODgxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9mYWNldC9SdW50aW1lQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmxpYnByb3YuSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0QmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotCi1wdWJsaWMgY2xhc3MgUnVudGltZUNoYW5nZWRMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyIHsKLQkKLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBmYWNldGVkUHJvamVjdEV2ZW50KSB7Ci0JCQotCQlJRmFjZXRlZFByb2plY3RCYXNlIGZwYiA9IGZhY2V0ZWRQcm9qZWN0RXZlbnQuZ2V0V29ya2luZ0NvcHkoKTsKLQkJaWYgKGZwYiA9PSBudWxsKSB7Ci0JCQlmcGIgPSBmYWNldGVkUHJvamVjdEV2ZW50LmdldFByb2plY3QoKTsKLQkJfQotCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBwZnYgPSBmcGIuZ2V0UHJvamVjdEZhY2V0VmVyc2lvbihKcGFGYWNldC5GQUNFVCk7Ci0JCWlmIChwZnYgIT0gbnVsbCkgewotCQkJTWFwPFN0cmluZywgT2JqZWN0PiBlbmFibGVtZW50VmFyaWFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQllbmFibGVtZW50VmFyaWFibGVzLnB1dChKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLkpQQV9QTEFURk9STV9FTkFCTEVNRU5UX0VYUCwgZ2V0SnBhUGxhdGZvcm1JZChmcGIuZ2V0UHJvamVjdCgpKSk7Ci0JCQllbmFibGVtZW50VmFyaWFibGVzLnB1dChKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLkpQQV9QTEFURk9STV9ERVNDUklQVElPTl9FTkFCTEVNRU5UX0VYUCwgZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbihmcGIuZ2V0UHJvamVjdCgpKSk7Ci0JCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxwID0gbmV3IExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoZnBiLCBwZnYsIGVuYWJsZW1lbnRWYXJpYWJsZXMpOwotCQkJdHJ5IHsKLQkJCQlscC5leGVjdXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhjZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKcGFQbGF0Zm9ybUlkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQlyZXR1cm4gKGpwYVByb2plY3QgPT0gbnVsbCkgPyBudWxsIDoganBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiAoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0RGVzY3JpcHRpb24oKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL0dlbmVyaWNKcGFEYXRhU291cmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL0dlbmVyaWNKcGFEYXRhU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDE5MGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRGF0YVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBHZW5lcmljSnBhRGF0YVNvdXJjZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYURhdGFTb3VyY2UKLQlleHRlbmRzIEFic3RyYWN0SnBhTm9kZQotCWltcGxlbWVudHMgSnBhRGF0YVNvdXJjZQotewotCS8qKgotCSAqIGNhY2hlIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZSBzbyB3ZSBjYW4gZGV0ZWN0IHdoZW4KLQkgKiBpdCBjaGFuZ2VzIGFuZCBub3RpZnkgbGlzdGVuZXJzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb25uZWN0aW9uUHJvZmlsZU5hbWU7Ci0KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0JLyoqCi0JICogbGlzdGVuIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBhZGRlZCBvciByZW1vdmVkIG9yIGl0cyBuYW1lIGNoYW5nZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBjb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotCi0JLyoqCi0JICogbGlzdGVuIGZvciB0aGUgY29ubmVjdGlvbiB0byBiZSBvcGVuZWQgb3IgY2xvc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEdlbmVyaWNKcGFEYXRhU291cmNlKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIGNvbm5lY3Rpb25Qcm9maWxlTmFtZSkgewotCQlzdXBlcihqcGFQcm9qZWN0KTsKLQkJLy9tb3ZpbmcgdGhlIGJ1aWxkaW5nIG9mIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgYmVmb3JlIHRoZSBjb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyCi0JCS8vaXMgYWRkZWQuICBOZWVkIHRvIG1ha2Ugc3VyZSB0aGUgbG9hZGluZyBvZiBkYiBwcm9maWxlcyBpcyBjb21wbGV0ZWQgYmVmb3JlCi0JCS8vbGlzdGVuaW5nLCBvdGhlcndpc2Ugd2UgZ2V0IG5vdGlmaWNhdGlvbnMgYmVmb3JlIG91ciBtb2RlbCBpcyBmaW5pc2hlZCBiZWluZyBidWlsdC4KLQkJLy90aGlzIG1lYW5zIG91ciB1cGRhdGVyIGlzIGNhbGxlZCBiZWZvcmUgaXQgaXMgc2V0IHdoaWNoIHJlc3VsdHMgaW4gYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uLgotCQkvL0hvcGVmdWxseSB0aGlzIGNoYW5nZSBpcyB0ZW1wb3JhcnkgYW5kIERUUCB3aWxsIGZpeCBidWcgMjQ2MjcwIHdoZXJlIEkgc3VnZ2VzdCB0aGV5Ci0JCS8vbm90IGZpcmUgZXZlbnRzIHdoZW4gYnVpbGRpbmcgcHJvZmlsZXMuCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lID0gY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNvbm5lY3Rpb25Qcm9maWxlTmFtZSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKHRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMb2NhbENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYURhdGFTb3VyY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGVOYW1lOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZSA9IG5hbWU7Ci0JCWlmICh0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09OTkVDVElPTl9QUk9GSUxFX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSkpIHsKLQkJCSAvLyBzeW5jaCB0aGUgY29ubmVjdGlvbiBwcm9maWxlIHdoZW4gdGhlIG5hbWUgY2hhbmdlcwotCQkJdGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUobmFtZSkpOwotCQkJSnB0SnBhQ29yZVBsdWdpbi5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUodGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLCBuYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlOwotCQlyZXR1cm4gKGNwICE9IG51bGwpICYmIGNwLmlzQWN0aXZlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGU7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyBudWxsIDogY3AuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgc2VsZWN0VGFibGVGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFRhYmxlPiB0YWJsZXMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiID09IG51bGwpID8gbnVsbCA6IGRiLnNlbGVjdFRhYmxlRm9ySWRlbnRpZmllcih0YWJsZXMsIGlkZW50aWZpZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLnJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUsIHRoaXMuYnVpbGREYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGJ1aWxkRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0SnBhRmFjdG9yeTJfMCgpLmJ1aWxkRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcih0aGlzKSA6Ci0JCQkJRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0Lmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29ubmVjdGlvblByb2ZpbGUoQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgb2xkID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQlvbGQucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gY29ubmVjdGlvblByb2ZpbGU7Ci0JCWlmIChjb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQljb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05ORUNUSU9OX1BST0ZJTEVfUFJPUEVSVFksIG9sZCwgY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5jb25uZWN0aW9uUHJvZmlsZU5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBMaXN0ZW4gZm9yIGEgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggb3VyIG5hbWUgYmVpbmcgcmVtb3ZlZC4KLQkgKiBBbHNvIGxpc3RlbiBmb3Igb3VyIGNvbm5lY3Rpb24ncyBuYW1lIGJlaW5nIGNoYW5nZWQuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIExvY2FsQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIKLQl7Ci0JCXByb3RlY3RlZCBMb2NhbENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVBZGRlZChTdHJpbmcgbmFtZSkgewotCQkJLy8gY2hlY2sgdG8gc2VlIGlmIGEgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggb3VyIG5hbWUgd2FzIGFkZGVkCi0JCQkvLyAoYXNzdW1lIG91ciBjb25uZWN0aW9uIHByb2ZpbGUgaXMgbnVsbCkKLQkJCWlmIChHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmNvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCQlpZiAobmFtZS5lcXVhbHMoR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUoKSkpIHsKLQkJCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUobmFtZSk7ICAvLyB0aGlzIHdpbGwgdHJpZ2dlciBjcmVhdGlvbiBvZiBDUAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSkgewotCQkJaWYgKEdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChuYW1lLmVxdWFscyhHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSkpIHsKLQkJCQlHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLnNldENvbm5lY3Rpb25Qcm9maWxlKG51bGwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQkJaWYgKEdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCWlmIChuZXdOYW1lLmVxdWFscyhHZW5lcmljSnBhRGF0YVNvdXJjZS50aGlzLmNvbm5lY3Rpb25Qcm9maWxlTmFtZSkpIHsKLQkJCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUobmV3TmFtZSk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgd2lsbCBhbHJlYWR5IGhhdmUgdGhlIG5ldyBuYW1lLAotCQkJLy8gd2UganVzdCBuZWVkIHRvIHN5bmNoIHRoZSBuYW1lIGhlbGQgYnkgdGhlIGRhdGEgc291cmNlCi0JCQlpZiAobmV3TmFtZS5lcXVhbHMoR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJR2VuZXJpY0pwYURhdGFTb3VyY2UudGhpcy5zZXRDb25uZWN0aW9uUHJvZmlsZU5hbWUobmV3TmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFdoZW5ldmVyIHRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBvciBjbG9zZWQgdHJpZ2dlciBhIHByb2plY3QgdXBkYXRlLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcgotCQlleHRlbmRzIENvbm5lY3Rpb25BZGFwdGVyCi0JewotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCUdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCUdlbmVyaWNKcGFEYXRhU291cmNlLnRoaXMuc3RhdGVDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL0dlbmVyaWNKcGFGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL0dlbmVyaWNKcGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDQyMzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci0KLS8qKgotICogR2VuZXJpYyBKUEEKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYUZhY3RvcnkKLXsKLQlwdWJsaWMgR2VuZXJpY0pwYUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRmlsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9HZW5lcmljSnBhRmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzE2NDYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYUZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFOb2RlOwotCi0vKioKLSAqIFRoZSB0cmFuc2l0aW9uIGJldHdlZW4gYSBKUEEgcHJvamVjdCBhbmQgdGhlIHJlc291cmNlIG1vZGVsIGFzc29jaWF0ZWQKLSAqIHdpdGggYSBmaWxlLgotICogSG9sZCB0aGUgYXNzb2NpYXRlZCByb290IHN0cnVjdHVyZSBub2Rlcywgd2hpY2ggYXJlIGhvb2tzIHRvIHRoZQotICogY29udGV4dCBtb2RlbC4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFGaWxlCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYU5vZGUKLQlpbXBsZW1lbnRzIEpwYUZpbGUKLXsKLQkvKioKLQkgKiB0eXBpY2FsbHkgYSAuamF2YSBvciAueG1sIGZpbGUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElGaWxlIGZpbGU7Ci0KLQkvKioKLQkgKiBjYWNoZSB0aGUgY29udGVudCB0eXBlIC0gaWYgdGhlIGNvbnRlbnQgdHlwZSBjaGFuZ2VzLCB0aGUgSlBBIHByb2plY3QKLQkgKiB3aWxsIHRocm93IG91dCB0aGUgSlBBIGZpbGUgYW5kIGJ1aWxkIGEgbmV3IG9uZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJQ29udGVudFR5cGUgY29udGVudFR5cGU7Ci0KLQkvKioKLQkgKiB0aGUgcmVzb3VyY2UgbW9kZWwgY29ycmVzcG9uZGluZyB0byB0aGUgZmlsZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcHRSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWw7Ci0KLQkvKioKLQkgKiB0aGUgcm9vdCBzdHJ1Y3R1cmUgKGNvbnRleHQgbW9kZWwpIG5vZGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlc291cmNlCi0JICogbW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSGFzaHRhYmxlPE9iamVjdCwgSnBhU3RydWN0dXJlTm9kZT4gcm9vdFN0cnVjdHVyZU5vZGVzID0gbmV3IEhhc2h0YWJsZTxPYmplY3QsIEpwYVN0cnVjdHVyZU5vZGU+KCk7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmljSnBhRmlsZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIElGaWxlIGZpbGUsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSwgSnB0UmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7Ci0JCXN1cGVyKGpwYVByb2plY3QpOwotCQl0aGlzLmZpbGUgPSBmaWxlOwotCQl0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0byB7QGxpbmsgI1JPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT059IGRvIG5vdCBuZWVkIHRvIHRyaWdnZXIgYQotCSAqIHByb2plY3QgdXBkYXRlLiBPbmx5IHRoZSBVSSBjYXJlcyBhYm91dCB0aGUgcm9vdCBzdHJ1Y3R1cmUgbm9kZXMuCi0JICogSWYgYSBwcm9qZWN0IHVwZGF0ZSBpcyBhbGxvd2VkIHRvIGhhcHBlbiwgYW4gaW5maW5pdGUgbG9vcCB3aWxsIHJlc3VsdAotCSAqIGlmIGFueSBKYXZhIGNsYXNzIGlzIHNwZWNpZmllZCBpbiBtb3JlIHRoYW4gb25lIGxvY2F0aW9uIGluIHRoZQotCSAqIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9uVXBkYXRlQXNwZWN0TmFtZXNUbyhTZXQ8U3RyaW5nPiBub25VcGRhdGVBc3BlY3ROYW1lcykgewotCQlzdXBlci5hZGROb25VcGRhdGVBc3BlY3ROYW1lc1RvKG5vblVwZGF0ZUFzcGVjdE5hbWVzKTsKLQkJbm9uVXBkYXRlQXNwZWN0TmFtZXMuYWRkKFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWxlICoqKioqKioqKioKLQotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5maWxlOwotCX0KLQotCXB1YmxpYyBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlTW9kZWw7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbChJQ29udGVudFR5cGUgY3QpIHsKLQkJcmV0dXJuIHRoaXMuY29udGVudFR5cGUuaXNLaW5kT2YoY3QpID8gdGhpcy5yZXNvdXJjZU1vZGVsIDogbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEpwYVN0cnVjdHVyZU5vZGU+IGdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPih0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy52YWx1ZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5yb290U3RydWN0dXJlTm9kZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFJvb3RTdHJ1Y3R1cmVOb2RlKE9iamVjdCBrZXksIEpwYVN0cnVjdHVyZU5vZGUgcm9vdFN0cnVjdHVyZU5vZGUpIHsKLQkJSnBhU3RydWN0dXJlTm9kZSBvbGQgPSB0aGlzLnJvb3RTdHJ1Y3R1cmVOb2Rlcy5wdXQoa2V5LCByb290U3RydWN0dXJlTm9kZSk7Ci0JCWlmIChyb290U3RydWN0dXJlTm9kZSAhPSBvbGQpIHsKLQkJCWlmIChvbGQgIT0gbnVsbCkgewotCQkJCXRoaXMuZmlyZUl0ZW1SZW1vdmVkKFJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04sIG9sZCk7Ci0JCQl9Ci0JCQl0aGlzLmZpcmVJdGVtQWRkZWQoUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiwgcm9vdFN0cnVjdHVyZU5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUm9vdFN0cnVjdHVyZU5vZGUoT2JqZWN0IGtleSwgSnBhU3RydWN0dXJlTm9kZSByb290U3RydWN0dXJlTm9kZSkgewotCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwocm9vdFN0cnVjdHVyZU5vZGUsIHRoaXMucm9vdFN0cnVjdHVyZU5vZGVzLmdldChrZXkpKSkgewotCQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoUk9PVF9TVFJVQ1RVUkVfTk9ERVNfQ09MTEVDVElPTiwgdGhpcy5yb290U3RydWN0dXJlTm9kZXMucmVtb3ZlKGtleSkpOwotCQl9Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlmb3IgKEpwYVN0cnVjdHVyZU5vZGUgcm9vdE5vZGUgOiB0aGlzLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpKSB7Ci0JCQlKcGFTdHJ1Y3R1cmVOb2RlIG5vZGUgPSByb290Tm9kZS5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZmlsZSk7Ci0JCXNiLmFwcGVuZCgnWycpOwotCQlzYi5hcHBlbmQodGhpcy5jb250ZW50VHlwZS5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoJ10nKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYVByb2plY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvR2VuZXJpY0pwYVByb2plY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUwMmYxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL0dlbmVyaWNKcGFQcm9qZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkFic3RyYWN0SnBhUHJvamVjdDsKLQotLyoqCi0gKiBOb3QgbXVjaCBkaWZmZXJlbnQgZnJvbSB0aGUgYWJzdHJhY3QgSlBBIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhUHJvamVjdAotCWV4dGVuZHMgQWJzdHJhY3RKcGFQcm9qZWN0Ci17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmljSnBhUHJvamVjdChKcGFQcm9qZWN0LkNvbmZpZyBjb25maWcpIHsKLQkJc3VwZXIoY29uZmlnKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdEVudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdEVudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEzN2Y5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IgZXh0ZW5kcwotCQlBYnN0cmFjdFByaW1hcnlLZXlWYWxpZGF0b3IgewotCi0JcHJvdGVjdGVkIEFic3RyYWN0RW50aXR5UHJpbWFyeUtleVZhbGlkYXRvcihFbnRpdHkgZW50aXR5LAotCQkJUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKGVudGl0eSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHkgZW50aXR5KCkgewotCQlyZXR1cm4gKEVudGl0eSkgdGhpcy50eXBlTWFwcGluZygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSWRDbGFzc1JlZmVyZW5jZSBpZENsYXNzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIGlmIGFuIGVudGl0eSBpcyBub24tcm9vdCwgaXQgaXMgbm90IGFsbG93ZWQgdG8gZGVmaW5lIHByaW1hcnkga2V5cwotCQlpZiAoISBlbnRpdHkoKS5pc1Jvb3RFbnRpdHkoKSkgewotCQkJdmFsaWRhdGVQcmltYXJ5S2V5Rm9yTm9uUm9vdChtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JCWVsc2UgewotCQkJdmFsaWRhdGVQcmltYXJ5S2V5Rm9yUm9vdChtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVByaW1hcnlLZXlGb3JOb25Sb290KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdmFsaWRhdGVOb25Sb290RW50aXR5RG9lc05vdFNwZWNpZnlJZENsYXNzKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXZhbGlkYXRlTm9uUm9vdEVudGl0eURvZXNOb3RTcGVjaWZ5UHJpbWFyeUtleUF0dHJpYnV0ZXMobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcmltYXJ5S2V5Rm9yUm9vdChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXZhbGlkYXRlUHJpbWFyeUtleUlzTm90UmVkZWZpbmVkKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXZhbGlkYXRlSWRDbGFzc0lzVXNlZElmTmVjZXNzYXJ5KG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQotCQkvLyBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgbm90IGRlZmluZWQgb24gYW4gYW5jZXN0b3IsIGl0IG11c3QgYmUgZGVmaW5lZCBoZXJlCi0JCWlmICghIGRlZmluZXNQcmltYXJ5S2V5KHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9fUEssCi0JCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQllbnRpdHkoKSwKLQkJCQkJCXRleHRSYW5nZVJlc29sdmVyKCkuZ2V0VHlwZU1hcHBpbmdUZXh0UmFuZ2UoKSkpOwotCQl9Ci0JCQotCQkvLyBpZiBwcmltYXJ5IGtleSBpcyBjb21wb3NpdGUsIGl0IG1heSBlaXRoZXIgdXNlIGFuIGlkIGNsYXNzIG9yIGVtYmVkZGVkIGlkLCBub3QgYm90aAotCQl2YWxpZGF0ZU9uZU9mSWRDbGFzc09yRW1iZWRkZWRJZElzVXNlZChtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyAuLi4gYW5kIG9ubHkgb25lIGVtYmVkZGVkIGlkCi0JCXZhbGlkYXRlT25lRW1iZWRkZWRJZChtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkKLQkJdmFsaWRhdGVNYXBzSWRNYXBwaW5ncyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkKLQkJaWYgKHNwZWNpZmllc0lkQ2xhc3MoKSkgewotCQkJdmFsaWRhdGVJZENsYXNzKGlkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCksIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOb25Sb290RW50aXR5RG9lc05vdFNwZWNpZnlJZENsYXNzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGlkQ2xhc3NSZWZlcmVuY2UoKS5pc1NwZWNpZmllZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9OX1JPT1RfSURfQ0xBU1NfU1BFQ0lGSUVELAotCQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQkJZW50aXR5KCksCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTm9uUm9vdEVudGl0eURvZXNOb3RTcGVjaWZ5UHJpbWFyeUtleUF0dHJpYnV0ZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgZWFjaCA6IGdldFByaW1hcnlLZXlNYXBwaW5nc0RlZmluZWRMb2NhbGx5KHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9OX1JPT1RfSURfQVRUUklCVVRFX1NQRUNJRklFRCwKLQkJCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJCWVhY2gsCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldEF0dHJpYnV0ZU1hcHBpbmdUZXh0UmFuZ2UoZWFjaC5nZXROYW1lKCkpKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RKb2luVGFibGVWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdEpvaW5UYWJsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQ5YWUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdEpvaW5UYWJsZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKb2luVGFibGVWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0VGFibGVWYWxpZGF0b3IKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIodGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIFJlYWRPbmx5Sm9pblRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkQ2F0YWxvZ01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkU2NoZW1hTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDY2OTAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0UHJpbWFyeUtleVZhbGlkYXRvcgotewotCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yKAotCQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzLCBQcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCi0JCXN1cGVyKG1hcHBlZFN1cGVyY2xhc3MsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcygpIHsKLQkJcmV0dXJuIChNYXBwZWRTdXBlcmNsYXNzKSB0aGlzLnR5cGVNYXBwaW5nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiBtYXBwZWRTdXBlcmNsYXNzKCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXZhbGlkYXRlUHJpbWFyeUtleUlzTm90UmVkZWZpbmVkKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXZhbGlkYXRlSWRDbGFzc0lzVXNlZElmTmVjZXNzYXJ5KG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQotCQkvLyBpZiBwcmltYXJ5IGtleSBpcyBjb21wb3NpdGUsIGl0IG1heSBlaXRoZXIgdXNlIGFuIGlkIGNsYXNzIG9yIGVtYmVkZGVkIGlkLCBub3QgYm90aAotCQl2YWxpZGF0ZU9uZU9mSWRDbGFzc09yRW1iZWRkZWRJZElzVXNlZChtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyAuLi4gYW5kIG9ubHkgb25lIGVtYmVkZGVkIGlkCi0JCXZhbGlkYXRlT25lRW1iZWRkZWRJZChtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkKLQkJaWYgKHNwZWNpZmllc0lkQ2xhc3MoKSkgewotCQkJdmFsaWRhdGVJZENsYXNzKGlkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCksIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNTkyYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYW1lZENvbHVtblZhbGlkYXRvcjxDIGV4dGVuZHMgUmVhZE9ubHlOYW1lZENvbHVtbiwgUiBleHRlbmRzIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI+Ci0JaW1wbGVtZW50cyBKcHRWYWxpZGF0b3IKLXsKLQkvKiogdGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgY29sdW1ucyBkZWZpbmVkIG9uIGVudGl0aWVzIGFuZCBzZWNvbmRhcnkgdGFibGVzICovCi0JcHJvdGVjdGVkIGZpbmFsIFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlOwotCi0JcHJvdGVjdGVkIGZpbmFsIEMgY29sdW1uOwotCi0JcHJvdGVjdGVkIGZpbmFsIFIgdGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyIHRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBKcHRWYWxpZGF0b3IgdGFibGVWYWxpZGF0b3I7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yKAotCQkJCUMgY29sdW1uLAotCQkJCVIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJdGhpcyhudWxsLCBjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROYW1lZENvbHVtblZhbGlkYXRvcigKLQkJCQlDIGNvbHVtbiwKLQkJCQlSIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlcikgewotCQl0aGlzKG51bGwsIGNvbHVtbiwgdGV4dFJhbmdlUmVzb2x2ZXIsIHByb3ZpZGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3ROYW1lZENvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwKLQkJCQlDIGNvbHVtbiwKLQkJCQlSIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXRoaXMocGVyc2lzdGVudEF0dHJpYnV0ZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyLk51bGwuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsCi0JCQkJQyBjb2x1bW4sCi0JCQkJUiB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgdGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKSB7Ci0JCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCXRoaXMuY29sdW1uID0gY29sdW1uOwotCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyID0gdGV4dFJhbmdlUmVzb2x2ZXI7Ci0JCXRoaXMudGFibGVEZXNjcmlwdGlvblByb3ZpZGVyID0gdGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotCQl0aGlzLnRhYmxlVmFsaWRhdG9yID0gdGhpcy5idWlsZFRhYmxlVmFsaWRhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gSnB0VmFsaWRhdG9yLk51bGwuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmICh0aGlzLnRhYmxlVmFsaWRhdG9yLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcikpIHsKLQkJCS8vIHZhbGlkYXRlIHRoZSBuYW1lIG9ubHkgaWYgdGhlIHRhYmxlIGlzIHZhbGlkCi0JCQl0aGlzLnZhbGlkYXRlTmFtZShtZXNzYWdlcyk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCVRhYmxlIGRiVGFibGUgPSB0aGlzLmNvbHVtbi5nZXREYlRhYmxlKCk7Ci0JCWlmICgoZGJUYWJsZSAhPSBudWxsKSAmJiAhIHRoaXMuY29sdW1uLmlzUmVzb2x2ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbklzUGFydE9mVmlydHVhbEF0dHJpYnV0ZSgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIDoKLQkJCQl0aGlzLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKHRoaXMuZ2V0VW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQltZXNzYWdlLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMuY29sdW1uLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0RGJUYWJsZSgpLmdldE5hbWUoKQotCQkJCX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKTsKLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0RGJUYWJsZSgpLmdldE5hbWUoKQotCQkJCX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb2x1bW5Jc1BhcnRPZlZpcnR1YWxBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAodGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlICE9IG51bGwpICYmCi0JCQkJdGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSBkZXNjcmlwdGlvbiBwcm92aWRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50ZXJmYWNlIFRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciB7Ci0JCVN0cmluZyBnZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpOwotCi0JCWZpbmFsIGNsYXNzIE51bGwKLQkJCWltcGxlbWVudHMgVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyCi0JCXsKLQkJCXByaXZhdGUgc3RhdGljIGZpbmFsIFRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCQlwdWJsaWMgc3RhdGljIFRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCQl9Ci0JCQkvLyBlbnN1cmUgc2luZ2xlIGluc3RhbmNlCi0JCQlwcml2YXRlIE51bGwoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVEZXNjcmlwdGlvbk1lc3NhZ2UoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkU2luZ2xldG9uVG9TdHJpbmcodGhpcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogYmFzZSBjb2x1bW4gdGFibGUgdmFsaWRhdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgY29sdW1uIHRhYmxlIHZhbGlkYXRvciAob3IgaXRzIHN1YmNsYXNzZXMpIGNhbiBvbmx5IGJlIHVzZWQgYnkKLQkgKiBhIHZhbGlkYXRvciBmb3IgYSA8ZW0+YmFzZTwvZW0+IGNvbHVtbiwgd2hpY2ggc3BlY2lmaWVzIGEgdGFibGUuIFRoaXMKLQkgKiBpbmNsdWRlcyBib3RoIG5vcm1hbCBjb2x1bW5zIGFuZCBqb2luIGNvbHVtbnMuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEJhc2VDb2x1bW5UYWJsZVZhbGlkYXRvcgotCQlpbXBsZW1lbnRzIEpwdFZhbGlkYXRvcgotCXsKLQkJcHJvdGVjdGVkIEJhc2VDb2x1bW5UYWJsZVZhbGlkYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCQlpZiAodGhpcy5nZXRDb2x1bW4oKS50YWJsZU5hbWVJc0ludmFsaWQoKSkgewotCQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkKLQkJcHJvdGVjdGVkIFJlYWRPbmx5VGFibGVDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQkJcmV0dXJuIChSZWFkT25seVRhYmxlQ29sdW1uKSBBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yLnRoaXMuY29sdW1uOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3ROYW1lZENvbHVtblZhbGlkYXRvci50aGlzLmNvbHVtbklzUGFydE9mVmlydHVhbEF0dHJpYnV0ZSgpID8KLQkJCQkJdGhpcy5idWlsZFZpcnR1YWxBdHRyaWJ1dGVUYWJsZU5vdFZhbGlkTWVzc2FnZSgpIDoKLQkJCQkJdGhpcy5idWlsZFRhYmxlTm90VmFsaWRNZXNzYWdlXygpOwotCQl9Ci0JCi0JCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFRhYmxlTm90VmFsaWRNZXNzYWdlXygpIHsKLQkJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJdGhpcy5nZXRDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJdGhpcy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW4oKS5nZXROYW1lKCksCi0JCQkJCQl0aGlzLmdldENvbHVtblRhYmxlRGVzY3JpcHRpb25NZXNzYWdlKCkKLQkJCQkJfSwKLQkJCQkJdGhpcy5nZXRDb2x1bW4oKSwKLQkJCQkJdGhpcy5nZXRUZXh0UmFuZ2VSZXNvbHZlcigpLmdldFRhYmxlVGV4dFJhbmdlKCkKLQkJCQkpOwotCQl9Ci0JCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCX0KLQkKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpICB7Ci0JCQlyZXR1cm4gQWJzdHJhY3ROYW1lZENvbHVtblZhbGlkYXRvci50aGlzLnRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5nZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpOwotCQl9Ci0JCi0JCXByb3RlY3RlZCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIGdldFRleHRSYW5nZVJlc29sdmVyKCkgewotCQkJcmV0dXJuIChUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKSBBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yLnRoaXMudGV4dFJhbmdlUmVzb2x2ZXI7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZUNvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCksCi0JCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yLnRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCQl0aGlzLmdldENvbHVtbigpLmdldFRhYmxlKCksCi0JCQkJCQl0aGlzLmdldENvbHVtbigpLmdldE5hbWUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uVGFibGVEZXNjcmlwdGlvbk1lc3NhZ2UoKQotCQkJCQl9LAotCQkJCQl0aGlzLmdldENvbHVtbigpLAotCQkJCQl0aGlzLmdldFRleHRSYW5nZVJlc29sdmVyKCkuZ2V0VGFibGVUZXh0UmFuZ2UoKQotCQkJCSk7Ci0JCX0KLQkKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjAxZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0UGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBKcHRWYWxpZGF0b3IKLXsKLQlwcm90ZWN0ZWQgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yKAotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIgPSB0ZXh0UmFuZ2VSZXNvbHZlcjsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpICE9IE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXRoaXMudmFsaWRhdGVNYXBwZWRBdHRyaWJ1dGUobWVzc2FnZXMpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlTWFwcGVkQXR0cmlidXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKTsKLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZEF0dHJpYnV0ZU1lc3NhZ2UoU3RyaW5nIG1zZ0lEKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQltc2dJRCwKLQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKX0sCi0JCQl0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUsIAotCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdFByaW1hcnlLZXlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdFByaW1hcnlLZXlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxYzEzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNsYXNzTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5IYXNoQmFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuUHJvcGVydHlBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJpbWFyeUtleVZhbGlkYXRvcgotCWltcGxlbWVudHMgSnB0VmFsaWRhdG9yCi17Ci0JcHJpdmF0ZSBmaW5hbCBUeXBlTWFwcGluZyB0eXBlTWFwcGluZzsKLQkKLQlwcml2YXRlIGZpbmFsIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVNUFRZX1NUUklOR19BUlJBWSA9IFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWTsKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RQcmltYXJ5S2V5VmFsaWRhdG9yKAotCQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcsIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkKLQkJdGhpcy50eXBlTWFwcGluZyA9IHR5cGVNYXBwaW5nOwotCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyID0gdGV4dFJhbmdlUmVzb2x2ZXI7Ci0JfQotCQotCQotCXByb3RlY3RlZCBUeXBlTWFwcGluZyB0eXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMudHlwZU1hcHBpbmc7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWZlcmVuY2UoKTsKLQkKLQlwcm90ZWN0ZWQgUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gdGhpcy50ZXh0UmFuZ2VSZXNvbHZlcjsKLQl9Ci0JCi0JLy8gZm9yIEpQQSBwb3J0YWJpbGl0eSwgYSBoaWVyYXJjaHkgbXVzdCBkZWZpbmUgaXRzIHByaW1hcnkga2V5IG9uIG9uZSBjbGFzcyAKLQkvLyAoZW50aXR5ICpvciogbWFwcGVkIHN1cGVyY2xhc3MpCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVQcmltYXJ5S2V5SXNOb3RSZWRlZmluZWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoZGVmaW5lc1ByaW1hcnlLZXlPbkFuY2VzdG9yKHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQlpZiAoaWRDbGFzc1JlZmVyZW5jZSgpLmlzU3BlY2lmaWVkKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfUEtfUkVERUZJTkVEX0lEX0NMQVNTLAotCQkJCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQkJCXRleHRSYW5nZVJlc29sdmVyKCkuZ2V0SWRDbGFzc1RleHRSYW5nZSgpKSk7Ci0JCQl9Ci0JCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgZWFjaCA6IGdldFByaW1hcnlLZXlNYXBwaW5nc0RlZmluZWRMb2NhbGx5KHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX1BLX1JFREVGSU5FRF9JRF9BVFRSSUJVVEUsCi0JCQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQkJCWVhY2gsCi0JCQkJCQkJdGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRBdHRyaWJ1dGVNYXBwaW5nVGV4dFJhbmdlKGVhY2guZ2V0TmFtZSgpKSkpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCS8vIGlmIGEgcHJpbWFyeSBrZXkgZGVmaW5pbmcgY2xhc3MgaGFzIG11bHRpcGxlIHByaW1hcnkga2V5cywgaXQgbXVzdCB1c2UgYW4gaWQgY2xhc3MKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3NJc1VzZWRJZk5lY2Vzc2FyeShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmICghIHNwZWNpZmllc0lkQ2xhc3MoKSAmJiBpZENsYXNzSXNSZXF1aXJlZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfUkVRVUlSRUQsCi0JCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQkJdGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRUeXBlTWFwcGluZ1RleHRSYW5nZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JLy8gb25seSBvbmUgY29tcG9zaXRlIHByaW1hcnkga2V5IHN0cmF0ZWd5IG1heSBiZSB1c2VkCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVPbmVPZklkQ2xhc3NPckVtYmVkZGVkSWRJc1VzZWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoaWRDbGFzc1JlZmVyZW5jZSgpLmlzU3BlY2lmaWVkKCkKLQkJCQkmJiBDb2xsZWN0aW9uVG9vbHMuc2l6ZSh0eXBlTWFwcGluZygpLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpID4gMCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FORF9FTUJFRERFRF9JRF9CT1RIX1VTRUQsCi0JCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQkJdGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRUeXBlTWFwcGluZ1RleHRSYW5nZSgpKSk7Ci0JCX0KLQl9Ci0JCi0JLy8gb25seSBvbmUgZW1iZWRkZWQgaWQgbWF5IGJlIHVzZWQKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9uZUVtYmVkZGVkSWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0RW1iZWRkZWRJZE1hcHBpbmdzKHR5cGVNYXBwaW5nKCkpKSA+IDEpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19NVUxUSVBMRV9FTUJFRERFRF9JRCwKLQkJCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJCXR5cGVNYXBwaW5nKCksCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldFR5cGVNYXBwaW5nVGV4dFJhbmdlKCkpKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHNJZE1hcHBpbmdzKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJZm9yIChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIG1hcHNJZFJlbGF0aW9uc2hpcE1hcHBpbmcgOiBnZXRNYXBzSWRNYXBwaW5nc0RlZmluZWRMb2NhbGx5KHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQkvLyBjYW4ndCB1c2UgbWFwcyBpZCBtYXBwaW5ncyB3aXRoIGFuIGlkIGNsYXNzCi0JCQlpZiAoZGVmaW5lc0lkQ2xhc3ModHlwZU1hcHBpbmcoKSkpIHsKLQkJCQltZXNzYWdlcy5hZGQoRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19XSVRIX01BUFNfSUQsCi0JCQkJCQluZXcgU3RyaW5nW10ge21hcHNJZFJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0TmFtZSgpfSwKLQkJCQkJCW1hcHNJZFJlbGF0aW9uc2hpcE1hcHBpbmcsCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldEF0dHJpYnV0ZU1hcHBpbmdUZXh0UmFuZ2UobWFwc0lkUmVsYXRpb25zaGlwTWFwcGluZy5nZXROYW1lKCkpKSk7Ci0JCQl9Ci0JCQkKLQkJCUF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZWRBdHRyaWJ1dGVNYXBwaW5nID0gCi0JCQkJCW1hcHNJZFJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXREZXJpdmVkSWRBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCQlpZiAocmVzb2x2ZWRBdHRyaWJ1dGVNYXBwaW5nICE9IG51bGwgCi0JCQkJCSYmICEgQ2xhc3NOYW1lLmFyZUF1dG9ib3hFcXVpdmFsZW50cygKLQkJCQkJCXJlc29sdmVkQXR0cmlidXRlTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKSwgCi0JCQkJCQlnZXRUYXJnZXRFbnRpdHlQcmltYXJ5S2V5VHlwZU5hbWUobWFwc0lkUmVsYXRpb25zaGlwTWFwcGluZykpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfTUFQU19JRF9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9BR1JFRSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7bWFwc0lkUmVsYXRpb25zaGlwTWFwcGluZy5nZXROYW1lKCl9LAotCQkJCQkJbWFwc0lkUmVsYXRpb25zaGlwTWFwcGluZywKLQkJCQkJCXRleHRSYW5nZVJlc29sdmVyKCkuZ2V0QXR0cmlidXRlTWFwcGluZ1RleHRSYW5nZShtYXBzSWRSZWxhdGlvbnNoaXBNYXBwaW5nLmdldE5hbWUoKSkpKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gdGhlcmUgc2hvdWxkIGFscmVhZHkgYmUgYSB2YWxpZGF0aW9uIGVycm9yIGlmIHRoZSBpZCBjbGFzcyBkb2VzIG5vdCByZXNvbHZlIHRvIGEgY2xhc3MKLQkJaWYgKGlkQ2xhc3MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAoaGFzRGVyaXZlZElkTWFwcGluZ01hdGNoaW5nSWRDbGFzcyhpZENsYXNzKSkgewotCQkJdmFsaWRhdGVJZENsYXNzX2Rlcml2ZWRJZE1hcHBpbmdNYXRjaGluZ0lkQ2xhc3MoaWRDbGFzcywgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRDbGFzc0F0dHJpYnV0ZSA6IHRoaXMuZ2V0QWxsSWRDbGFzc0F0dHJpYnV0ZXMoaWRDbGFzcykpIHsKLQkJCWJvb2xlYW4gZm91bmRNYXRjaCA9IGZhbHNlOwotCQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgOiBnZXRBdHRyaWJ1dGVNYXBwaW5ncyh0eXBlTWFwcGluZygpKSkgewotCQkJCWlmIChpZENsYXNzQXR0cmlidXRlLmdldE5hbWUoKS5lcXVhbHMoYXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCkpKSB7Ci0JCQkJCWZvdW5kTWF0Y2ggPSB0cnVlOwotCQkJCQkKLQkJCQkJLy8gdGhlIG1hdGNoaW5nIGF0dHJpYnV0ZSBzaG91bGQgYmUgYSBwcmltYXJ5IGtleQotCQkJCQlpZiAoISBkZWZpbmVzUHJpbWFyeUtleShhdHRyaWJ1dGVNYXBwaW5nKSkgewotCQkJCQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9OT1RfUFJJTUFSWV9LRVksCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7aWRDbGFzc0F0dHJpYnV0ZS5nZXROYW1lKCl9LAotCQkJCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQkJCQl9Ci0JCQkJCQotCQkJCQkvLyB0aGUgbWF0Y2hpbmcgYXR0cmlidXRlJ3MgdHlwZSBzaG91bGQgYWdyZWUKLQkJCQkJU3RyaW5nIGlkQ2xhc3NBdHRyaWJ1dGVUeXBlTmFtZSA9IGlkQ2xhc3NBdHRyaWJ1dGUuZ2V0VHlwZU5hbWUoKTsKLQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU1hcHBpbmdUeXBlTmFtZSA9IGdldFR5cGVOYW1lRm9ySWRDbGFzcyhhdHRyaWJ1dGVNYXBwaW5nKTsKLQkJCQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmdUeXBlTmFtZSAhPSBudWxsIAkvLyBpZiBpdCdzIG51bGwsIHRoZXJlIHNob3VsZCBiZSAKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbm90aGVyIGZhaWxpbmcgdmFsaWRhdGlvbiBlbHNld2hlcmUKLQkJCQkJCQkmJiAhIENsYXNzTmFtZS5hcmVBdXRvYm94RXF1aXZhbGVudHMoaWRDbGFzc0F0dHJpYnV0ZVR5cGVOYW1lLCBhdHRyaWJ1dGVNYXBwaW5nVHlwZU5hbWUpKSB7Ci0JCQkJCQltZXNzYWdlcy5hZGQoRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfQUdSRUUsCi0JCQkJCQkJCW5ldyBTdHJpbmdbXSB7aWRDbGFzc0F0dHJpYnV0ZS5nZXROYW1lKCksIGlkQ2xhc3NBdHRyaWJ1dGVUeXBlTmFtZX0sCi0JCQkJCQkJCXR5cGVNYXBwaW5nKCksCi0JCQkJCQkJCXRleHRSYW5nZVJlc29sdmVyKCkuZ2V0SWRDbGFzc1RleHRSYW5nZSgpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCWlmICghIGZvdW5kTWF0Y2gpIHsKLQkJCQltZXNzYWdlcy5hZGQoRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTk9fTUFUQ0gsCi0JCQkJCQluZXcgU3RyaW5nW10ge2lkQ2xhc3NBdHRyaWJ1dGUuZ2V0TmFtZSgpfSwKLQkJCQkJCXR5cGVNYXBwaW5nKCksCi0JCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQkJfQotCQl9Ci0KLQkJLy8gVGhpcyBpcyBmb3IgdmFsaWRhdGluZyBpZiBhIHR5cGUgbWFwcGluZyBoYXMgZXh0cmEgaWQgYXR0cmlidXRlcyB0aGF0IGRvIG5vdCBtYXRjaAotCQkvLyBhbiBhdHRyaWJ1dGUgb24gdGhlIGlkIGNsYXNzLCB3aGljaCBpcyBhIHN1cHBsZW1lbnQgb2YgdGhlIHZhbGlkYXRpb24gcmlnaHQgYWJvdmUKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgOiBnZXRQcmltYXJ5S2V5TWFwcGluZ3ModHlwZU1hcHBpbmcoKSkpIHsKLQkJCUFjY2Vzc1R5cGUgdHlwZSA9IGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCk7Ci0JCQlpZiAodHlwZSA9PSBBY2Nlc3NUeXBlLkZJRUxEKSB7Ci0JCQkJY2hlY2tNaXNzaW5nQXR0cmlidXRlKGlkQ2xhc3MsIGF0dHJpYnV0ZU1hcHBpbmcsIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQl9IGVsc2UgaWYgKHR5cGUgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgewotCQkJCS8vIEVjbGlwc2VMaW5rIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGV4aXN0ZW5jZSBzdGF0dXMgb2YgcHJvcGVydHkgbWV0aG9kcywKLQkJCQkvLyBidXQgdGhlIG1hdGNoaW5nIGZpZWxkIGluIHRoZSBpZCBjbGFzcyBzdGlsbCBuZWVkcyB0byBleGlzdAotCQkJCWlmICghQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKGdldElkQ2xhc3NGaWVsZE5hbWVzKGlkQ2xhc3MpLCBhdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKSkpIHsKLQkJCQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfRE9FU19OT1RfRVhJU1QsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHthdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKX0sCi0JCQkJCQkJdHlwZU1hcHBpbmcoKSwKLQkJCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFZhbGlkYXRpb24gZm9yIG1pc3NpbmcgcHJvcGVydHkgbWV0aG9kcyBpcyBvbmx5IGZvciBnZW5lcmljIHBsYXRmb3JtCi0JCQkJCWNoZWNrTWlzc2luZ0F0dHJpYnV0ZVdpdGhQcm9wZXJ0eUFjY2VzcyhpZENsYXNzLCBhdHRyaWJ1dGVNYXBwaW5nLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIFRoaXMgaXMgZm9yIHZhbGlkYXRpbmcgY2FzZXMgd2hlbiBpZCBjbGFzcyBoYXMgcHJvcGVydHktYmFzZWQgYWNjZXNzCi0JCWlmICh0eXBlTWFwcGluZygpLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkgPT0gQWNjZXNzVHlwZS5QUk9QRVJUWSkgewotCQkJdmFsaWRhdGVJZENsYXNzQXR0cmlidXRlc1dpdGhQcm9wZXJ0eUFjY2VzcyhpZENsYXNzLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0KLQkJdmFsaWRhdGVJZENsYXNzQ29uc3RydWN0b3IoaWRDbGFzcywgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja01pc3NpbmdBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MsCi0JCQlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuY29udGFpbnMoZ2V0SWRDbGFzc0F0dHJpYnV0ZU5hbWVzKGlkQ2xhc3MpLCBhdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZChEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfRE9FU19OT1RfRVhJU1QsCi0JCQkJCW5ldyBTdHJpbmdbXSB7YXR0cmlidXRlTWFwcGluZy5nZXROYW1lKCl9LAotCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZhbGlkYXRlSWRDbGFzc0F0dHJpYnV0ZXNXaXRoUHJvcGVydHlBY2Nlc3MoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgaWRDbGFzcywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsCi0JCQlJUmVwb3J0ZXIgcmVwb3J0ZXIpOwotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZENsYXNzQ29uc3RydWN0b3IoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MsCi0JCQlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmICghaWRDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuaGFzTm9BcmdDb25zdHJ1Y3RvcigpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUiwKLQkJCQkJCQluZXcgU3RyaW5nW10ge2lkQ2xhc3MuZ2V0TmFtZSgpfSwgCi0JCQkJCQkJdHlwZU1hcHBpbmcoKSwKLQkJCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkKLQkJCQkJKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjaGVja01pc3NpbmdBdHRyaWJ1dGVXaXRoUHJvcGVydHlBY2Nlc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MsCi0JCQlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcsIAotCQkJTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZENsYXNzX2Rlcml2ZWRJZE1hcHBpbmdNYXRjaGluZ0lkQ2xhc3MoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgaWRDbGFzcywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkKLQkJQ29sbGVjdGlvbjxBdHRyaWJ1dGVNYXBwaW5nPiBlcnJvck1hcHBpbmdzID0gbmV3IEhhc2hCYWc8QXR0cmlidXRlTWFwcGluZz4oKTsKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIGVhY2ggCi0JCQkJOiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4oZ2V0SWRNYXBwaW5ncyh0eXBlTWFwcGluZygpKSwgZ2V0RW1iZWRkZWRJZE1hcHBpbmdzKHR5cGVNYXBwaW5nKCkpKSkgewotCQkJZXJyb3JNYXBwaW5ncy5hZGQoZWFjaCk7Ci0JCX0KLQkJQ29sbGVjdGlvbjxBdHRyaWJ1dGVNYXBwaW5nPiBlcnJvckRlcml2ZWRJZE1hcHBpbmdzID0gbmV3IEhhc2hCYWc8QXR0cmlidXRlTWFwcGluZz4oKTsKLQkJZm9yIChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGVhY2ggOiBnZXREZXJpdmVkSWRNYXBwaW5ncyh0eXBlTWFwcGluZygpKSkgewotCQkJaWYgKGlkQ2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhnZXRUYXJnZXRFbnRpdHlQcmltYXJ5S2V5VHlwZU5hbWUoZWFjaCkpKSB7Ci0JCQkJZXJyb3JEZXJpdmVkSWRNYXBwaW5ncy5hZGQoZWFjaCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllcnJvck1hcHBpbmdzLmFkZChlYWNoKTsKLQkJCX0KLQkJfQotCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgZWFjaCA6IGVycm9yTWFwcGluZ3MpIHsKLQkJCWFkZE5vSWRDbGFzc0F0dHJpYnV0ZU1hdGNoRXJyb3IoZWFjaCwgbWVzc2FnZXMpOwotCQl9Ci0JCWlmIChDb2xsZWN0aW9uVG9vbHMuc2l6ZShlcnJvckRlcml2ZWRJZE1hcHBpbmdzKSA+IDEpIHsKLQkJCWZvciAoQXR0cmlidXRlTWFwcGluZyBlYWNoIDogZXJyb3JEZXJpdmVkSWRNYXBwaW5ncykgewotCQkJCWFkZER1cGxpY2F0ZUlkQ2xhc3NBdHRyaWJ1dGVNYXRjaEVycm9yKGVhY2gsIG1lc3NhZ2VzKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGROb0lkQ2xhc3NBdHRyaWJ1dGVNYXRjaEVycm9yKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTUFQUElOR19OT19NQVRDSCwKLQkJCQluZXcgU3RyaW5nW10ge2F0dHJpYnV0ZU1hcHBpbmcuZ2V0TmFtZSgpfSwKLQkJCQl0eXBlTWFwcGluZygpLAotCQkJCXRleHRSYW5nZVJlc29sdmVyKCkuZ2V0SWRDbGFzc1RleHRSYW5nZSgpKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZER1cGxpY2F0ZUlkQ2xhc3NBdHRyaWJ1dGVNYXRjaEVycm9yKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTUFQUElOR19EVVBMSUNBVEVfTUFUQ0gsCi0JCQkJbmV3IFN0cmluZ1tdIHthdHRyaWJ1dGVNYXBwaW5nLmdldE5hbWUoKX0sCi0JCQkJdHlwZU1hcHBpbmcoKSwKLQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3NQcm9wZXJ0eU1ldGhvZHMoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgaWRDbGFzcywgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCi0JCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGdldEFsbElkQ2xhc3NBdHRyaWJ1dGVzKGlkQ2xhc3MpKSB7Ci0JCQkJUHJvcGVydHlBY2Nlc3NvciBhY2Nlc3NvciA9IChQcm9wZXJ0eUFjY2Vzc29yKWF0dHJpYnV0ZS5nZXRBY2Nlc3NvcigpOwotCi0JCQkJLy8gdmFsaWRhdGUgZ2V0dGVyIG1ldGhvZAotCQkJCUphdmFSZXNvdXJjZU1ldGhvZCBnZXR0ZXIgPSBhY2Nlc3Nvci5nZXRSZXNvdXJjZUdldHRlcigpOwotCQkJCWlmIChnZXR0ZXIgIT0gbnVsbCkgewotCQkJCQl2YWxpZGF0ZVByb3BlcnR5TWV0aG9kKGlkQ2xhc3MsIGdldHRlci5nZXRNZXRob2ROYW1lKCksIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQkJfQotCi0JCQkJLy8gdmFsaWRhdGUgc2V0dGVyIG1ldGhvZAotCQkJCUphdmFSZXNvdXJjZU1ldGhvZCBzZXR0ZXIgPSBhY2Nlc3Nvci5nZXRSZXNvdXJjZVNldHRlcigpOwotCQkJCWlmIChzZXR0ZXIgIT0gbnVsbCkgewotCQkJCQl2YWxpZGF0ZVByb3BlcnR5TWV0aG9kKGlkQ2xhc3MsIHNldHRlci5nZXRNZXRob2ROYW1lKCksIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQkJfQotCQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5TWV0aG9kKEphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzLAotCQkJU3RyaW5nIG1ldGhvZE5hbWUsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlKYXZhUmVzb3VyY2VNZXRob2QgbWV0aG9kID0gaWRDbGFzcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0TWV0aG9kKG1ldGhvZE5hbWUpOwotCi0JCWlmICghbWV0aG9kLmlzUHVibGljT3JQcm90ZWN0ZWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1BST1BFUlRZX01FVEhPRF9OT1RfUFVCTElDLAotCQkJCQluZXcgU3RyaW5nW10ge2lkQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldFF1YWxpZmllZE5hbWUoKSwgbWV0aG9kTmFtZX0sCi0JCQkJCXR5cGVNYXBwaW5nKCksIAotCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKQotCQkJCQkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldElkQ2xhc3NBdHRyaWJ1dGVOYW1lcyhKYXZhUGVyc2lzdGVudFR5cGUgaWRDbGFzcykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oZ2V0QWxsSWRDbGFzc0F0dHJpYnV0ZXMoaWRDbGFzcykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBbGxJZENsYXNzQXR0cmlidXRlcyhKYXZhUGVyc2lzdGVudFR5cGUgaWRDbGFzcykgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPihpZENsYXNzLmdldEFsbEF0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SWRDbGFzc0ZpZWxkTmFtZXMoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEphdmFSZXNvdXJjZUZpZWxkLCBTdHJpbmc+KGlkQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEZpZWxkcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEphdmFSZXNvdXJjZUZpZWxkIGF0dHJpYnV0ZSkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHByaW1hcnkga2V5IG92ZXJhbGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbiBhbmNlc3RvciBjbGFzcyBoYXMgZGVmaW5lZCBhbnkgYXNwZWN0IG9mIHRoZSBwcmltYXJ5IGtleQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNQcmltYXJ5S2V5T25BbmNlc3RvcihUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlmb3IgKFR5cGVNYXBwaW5nIGVhY2ggOiB0eXBlTWFwcGluZy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlpZiAoZWFjaCAhPSB0eXBlTWFwcGluZyAmJiBkZWZpbmVzUHJpbWFyeUtleShlYWNoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgbWFwcGluZyBoYXMgZGVmaW5lZCBhbnkgYXNwZWN0IG9mIHRoZSBwcmltYXJ5IGtleQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNQcmltYXJ5S2V5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBnZXRJZENsYXNzKHR5cGVNYXBwaW5nKSAhPSBudWxsCi0JCQkJfHwgISBDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShnZXRQcmltYXJ5S2V5TWFwcGluZ3ModHlwZU1hcHBpbmcpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgbWFwcGluZyBoYXMgZGVmaW5lZCBhbnkgYXNwZWN0IG9mIGEgY29tcGxleCBwcmltYXJ5IGtleQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNDb21wbGV4UHJpbWFyeUtleShUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlyZXR1cm4gZGVmaW5lc0lkQ2xhc3ModHlwZU1hcHBpbmcpCi0JCQkJfHwgZ2V0RW1iZWRkZWRJZE1hcHBpbmcodHlwZU1hcHBpbmcpICE9IG51bGw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgb3ZlcnJpZGluZyB0eXBlIG5hbWUgb2YgdGhlIHByaW1hcnkga2V5IGZvciB0aGUgdHlwZSBtYXBwaW5nLgotCSAqIFRoaXMgbWF5IGJlCi0JICogLSB0eXBlIG9mIHRoZSBzaW5nbGUgc2ltcGxlIHByaW1hcnkga2V5IChpZCkgYXR0cmlidXRlCi0JICogLSB0eXBlIG9mIHRoZSBzaW5nbGUgY29tcGxleCBwcmltYXJ5IGtleSAoZW1iZWRkZWQgaWQpIGF0dHJpYnV0ZQotCSAqIC0gdHlwZSBvZiB0aGUgaWQgY2xhc3MKLQkgKiAtIG51bGwgaWYgbm9uZSBvZiB0aGUgYWJvdmUgYXJlIGNvaGVyZW50IChpLmUuIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzLCBvciB0aGUgCi0JICogCQlwcmltYXJ5IGtleSBpcyBpbnZhbGlkKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJpbWFyeUtleVR5cGVOYW1lKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzID0gZ2V0SWRDbGFzcyh0eXBlTWFwcGluZyk7Ci0JCWlmIChpZENsYXNzICE9IG51bGwpIHsKLQkJCXJldHVybiBpZENsYXNzLmdldE5hbWUoKTsKLQkJfQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkID0gZ2V0RW1iZWRkZWRJZE1hcHBpbmcodHlwZU1hcHBpbmcpOwotCQlpZiAoZW1iZWRkZWRJZCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZW1iZWRkZWRJZC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKTsKLQkJfQotCQlJZE1hcHBpbmcgaWQgPSBnZXRJZE1hcHBpbmcodHlwZU1hcHBpbmcpOwotCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGlkLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRUeXBlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYXR0cmlidXRlIG1hcHBpbmcgaGFzIGRlZmluZWQgYW55IGFzcGVjdCBvZiB0aGUgcHJpbWFyeSBrZXkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZpbmVzUHJpbWFyeUtleShBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0SWRNYXBwaW5nS2V5cygpLCBtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdLZXlzKCksIG1hcHBpbmdLZXkpKSB7Ci0JCQlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCkgYXR0cmlidXRlTWFwcGluZzsKLQkJCXJldHVybiAocmVsYXRpb25zaGlwTWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpCi0JCQkJCXx8IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRJZE1hcHBpbmdLZXlzKCkgewotCQlyZXR1cm4gSURfTUFQUElOR19LRVlTOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gSURfTUFQUElOR19LRVlTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLAotCQlNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkKLQl9OwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBJRF9NQVBQSU5HX0tFWVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KElEX01BUFBJTkdfS0VZU19BUlJBWSk7Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nS2V5cygpIHsKLQkJcmV0dXJuIFNJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19LRVlTOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0tFWVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksCi0JCU1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZCi0JfTsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0tFWVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19LRVlTX0FSUkFZKTsKLQotCQotCS8vICoqKioqKioqKioqKioqKiogaWQgY2xhc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCBib29sZWFuIHNwZWNpZmllc0lkQ2xhc3MoKSB7Ci0JCXJldHVybiBpZENsYXNzUmVmZXJlbmNlKCkuaXNTcGVjaWZpZWQoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW4gaWQgY2xhc3MgaXMgZGVmaW5lZCBvbiB0aGUgY2xhc3MKLQkgKiBOT1RFOiB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHdoZXRoZXIgYW4gaWQgY2xhc3MgaXMgKnNwZWNpZmllZCouICBJZiBhIHNwZWNpZmllZCBpZCBjbGFzcwotCSAqIAkJaXMgbm90IHJlc29sdmVkLCBpdCBpcyBub3QgZGVmaW5lZC4gIFRoZXJlIHdpbGwgYmUgYSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoYXQgZWZmZWN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNJZENsYXNzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBnZXRJZENsYXNzKHR5cGVNYXBwaW5nKSAhPSBudWxsOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbiBhbmNlc3RvciBjbGFzcyBoYXMgZGVmaW5lZCBhbiBpZCBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlZmluZXNJZENsYXNzT25BbmNlc3RvcihUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlmb3IgKFR5cGVNYXBwaW5nIGVhY2ggOiB0eXBlTWFwcGluZy5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpKSB7Ci0JCQlpZiAoZWFjaCAhPSB0eXBlTWFwcGluZyAmJiBkZWZpbmVzSWRDbGFzcyhlYWNoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpZCBjbGFzcyB0byBiZSB1c2VkIGZvciB0aGUgdHlwZSBtYXBwaW5nLCB3aGV0aGVyIHRoYXQgYmUgbG9jYWxseQotCSAqIG9yIG9uIGFuIGFuY2VzdG9yCi0JICovCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJZENsYXNzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCWZvciAoVHlwZU1hcHBpbmcgZWFjaCA6IHR5cGVNYXBwaW5nLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCkpIHsKLQkJCWlmIChlYWNoLmdldElkQ2xhc3MoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGVhY2guZ2V0SWRDbGFzcygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGF0dHJpYnV0ZSBtYXBwaW5ncyBpbiBnZW5lcmFsICoqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHRoZSBhdHRyaWJ1dGUgbWFwcGluZ3Mgb2YgdGhlIGdpdmVuIHR5cGUgIAotCSAqIG1hcHBpbmcgd2l0aCB0cmFuc2llbnQgYXR0cmlidXRlIG1hcHBpbmdzIGJlaW5nIGV4Y2x1ZGVkCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEF0dHJpYnV0ZU1hcHBpbmdzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odHlwZU1hcHBpbmcuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEF0dHJpYnV0ZU1hcHBpbmcgbykgewotCQkJCXJldHVybiAhU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKG8uZ2V0S2V5KCksIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gYWxsIHByaW1hcnkga2V5IG1hcHBpbmdzLCBkZWZpbmVkIG9uIGFuZCBhYm92ZSB0aGUgdHlwZSBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldFByaW1hcnlLZXlNYXBwaW5ncyhUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+KAotCQkJCWdldElkTWFwcGluZ3ModHlwZU1hcHBpbmcpLAotCQkJCWdldEVtYmVkZGVkSWRNYXBwaW5ncyh0eXBlTWFwcGluZyksCi0JCQkJZ2V0RGVyaXZlZElkTWFwcGluZ3ModHlwZU1hcHBpbmcpLAotCQkJCWdldE1hcHNJZE1hcHBpbmdzKHR5cGVNYXBwaW5nKSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBwcmltYXJ5IGtleSBtYXBwaW5ncyBkZWNsYXJlZCBkaXJlY3RseSBvbiB0aGUgdHlwZSBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldFByaW1hcnlLZXlNYXBwaW5nc0RlZmluZWRMb2NhbGx5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4oCi0JCQkJZ2V0SWRNYXBwaW5nc0RlZmluZWRMb2NhbGx5KHR5cGVNYXBwaW5nKSwKLQkJCQlnZXRFbWJlZGRlZElkTWFwcGluZ3NEZWZpbmVkTG9jYWxseSh0eXBlTWFwcGluZyksCi0JCQkJZ2V0RGVyaXZlZElkTWFwcGluZ3NEZWZpbmVkTG9jYWxseSh0eXBlTWFwcGluZyksCi0JCQkJZ2V0TWFwc0lkTWFwcGluZ3NEZWZpbmVkTG9jYWxseSh0eXBlTWFwcGluZykpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNBbnlQcmltYXJ5S2V5TWFwcGluZ3MoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuICEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoZ2V0UHJpbWFyeUtleU1hcHBpbmdzKHR5cGVNYXBwaW5nKSk7Ci0JfQotCQotCS8vICoqKioqKioqKioqKioqKiogaWQgbWFwcGluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCBJZE1hcHBpbmcgZ2V0SWRNYXBwaW5nKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCUl0ZXJhYmxlPElkTWFwcGluZz4gaWRNYXBwaW5ncyA9IGdldElkTWFwcGluZ3ModHlwZU1hcHBpbmcpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLnNpemUoaWRNYXBwaW5ncykgPT0gMSkgewotCQkJcmV0dXJuIGlkTWFwcGluZ3MuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxJZE1hcHBpbmc+IGdldElkTWFwcGluZ3MoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBTdWJJdGVyYWJsZVdyYXBwZXI8QXR0cmlidXRlTWFwcGluZywgSWRNYXBwaW5nPigKLQkJCQl0eXBlTWFwcGluZy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElkTWFwcGluZz4gZ2V0SWRNYXBwaW5nc0RlZmluZWRMb2NhbGx5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEF0dHJpYnV0ZU1hcHBpbmcsIElkTWFwcGluZz4oCi0JCQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlTWFwcGluZ3MoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogZW1iZWRkZWQgaWQgbWFwcGluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFuIGVtYmVkZGVkIGlkIGlzIGRlZmluZWQgZm9yIHRoaXMgY2xhc3MsIHdoZXRoZXIgdGhhdCBiZSBsb2NhbGx5Ci0JICogb3Igb24gYW4gYW5jZXN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZpbmVzRW1iZWRkZWRJZE1hcHBpbmcoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuICEgQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkoZ2V0RW1iZWRkZWRJZE1hcHBpbmdzKHR5cGVNYXBwaW5nKSk7Ci0JfQotCQotCXByb3RlY3RlZCBFbWJlZGRlZElkTWFwcGluZyBnZXRFbWJlZGRlZElkTWFwcGluZyhUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlJdGVyYWJsZTxFbWJlZGRlZElkTWFwcGluZz4gZW1iZWRkZWRJZE1hcHBpbmdzID0gZ2V0RW1iZWRkZWRJZE1hcHBpbmdzKHR5cGVNYXBwaW5nKTsKLQkJaWYgKENvbGxlY3Rpb25Ub29scy5zaXplKGVtYmVkZGVkSWRNYXBwaW5ncykgPT0gMSkgewotCQkJcmV0dXJuIGVtYmVkZGVkSWRNYXBwaW5ncy5pdGVyYXRvcigpLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEVtYmVkZGVkSWRNYXBwaW5nPiBnZXRFbWJlZGRlZElkTWFwcGluZ3MoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBTdWJJdGVyYWJsZVdyYXBwZXI8QXR0cmlidXRlTWFwcGluZywgRW1iZWRkZWRJZE1hcHBpbmc+KAotCQkJCXR5cGVNYXBwaW5nLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8RW1iZWRkZWRJZE1hcHBpbmc+IGdldEVtYmVkZGVkSWRNYXBwaW5nc0RlZmluZWRMb2NhbGx5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEF0dHJpYnV0ZU1hcHBpbmcsIEVtYmVkZGVkSWRNYXBwaW5nPigKLQkJCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVNYXBwaW5ncyhNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBkZXJpdmVkIGlkIG1hcHBpbmdzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA+IGdldERlcml2ZWRJZE1hcHBpbmdzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMD4odGhpcy5nZXRBbGxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5ncyh0eXBlTWFwcGluZykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgbykgewotCQkJCXJldHVybiBvLmdldERlcml2ZWRJZGVudGl0eSgpLnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wPiBnZXRBbGxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5ncyhUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxBdHRyaWJ1dGVNYXBwaW5nLCBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wPih0aGlzLmdldEFsbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdzXyh0eXBlTWFwcGluZykpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gZ2V0QWxsU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ3NfKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4oCi0JCQkJCXR5cGVNYXBwaW5nLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSwKLQkJCQkJdHlwZU1hcHBpbmcuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKQotCQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA+IGdldERlcml2ZWRJZE1hcHBpbmdzRGVmaW5lZExvY2FsbHkoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wPih0aGlzLmdldFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdzKHR5cGVNYXBwaW5nKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBvKSB7Ci0JCQkJcmV0dXJuIG8uZ2V0RGVyaXZlZElkZW50aXR5KCkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA+IGdldFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdzKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgU3ViSXRlcmFibGVXcmFwcGVyPEF0dHJpYnV0ZU1hcHBpbmcsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA+KHRoaXMuZ2V0U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ3NfKHR5cGVNYXBwaW5nKSk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nc18oVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPigKLQkJCQkJdHlwZU1hcHBpbmcuZ2V0QXR0cmlidXRlTWFwcGluZ3MoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpLAotCQkJCQl0eXBlTWFwcGluZy5nZXRBdHRyaWJ1dGVNYXBwaW5ncyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpCi0JCQkJKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqKioqKioqIG1hcHMgaWQgbWFwcGluZ3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMD4gZ2V0TWFwc0lkTWFwcGluZ3MoVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wPih0aGlzLmdldEFsbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdzKHR5cGVNYXBwaW5nKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBvKSB7Ci0JCQkJcmV0dXJuIG8uZ2V0RGVyaXZlZElkZW50aXR5KCkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wPiBnZXRNYXBzSWRNYXBwaW5nc0RlZmluZWRMb2NhbGx5KFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMD4odGhpcy5nZXRTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5ncyh0eXBlTWFwcGluZykpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgbykgewotCQkJCXJldHVybiBvLmdldERlcml2ZWRJZGVudGl0eSgpLnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG1pc2MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbiBpZCBjbGFzcyBpcyByZXF1aXJlZCBmb3IgdGhpcyBjbGFzcwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlkQ2xhc3NJc1JlcXVpcmVkKCkgewotCQkvLyBBbiBpZCBjbGFzcyBpcyByZXF1aXJlZCBpZgotCQkvLyAtIHRoZXJlIGFyZSBtdWx0aXBsZSAic2ltcGxlIiBwcmltYXJ5IGtleSBtYXBwaW5ncwotCQkvLyAtIG9yIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSAiY29tcGxleCIgcHJpbWFyeSBrZXkgbWFwcGluZwotCQkvLyBBIHNpbXBsZSBwcmltYXJ5IGtleSBtYXBwaW5nIGNhbiBiZQotCQkvLyAtIGFuIGlkIG1hcHBpbmcKLQkJLy8gLSBhIGRlcml2ZWQgaWQgcmVsYXRpb25zaGlwIG1hcHBpbmcgdG8gYW4gZW50aXR5IHdpdGggYSBzaW1wbGUgcHJpbWFyeSBrZXkKLQkJLy8gQSBjb21wbGV4IHByaW1hcnkga2V5IG1hcHBpbmcgY2FuIGJlIAotCQkvLyAtIGEgZGVyaXZlZCBpZCByZWxhdGlvbnNoaXAgbWFwcGluZyB0byBhbiBlbnRpdHkgd2l0aCBhIGNvbXBsZXggcHJpbWFyeSBrZXkKLQkJaW50IHNpbXBsZVByaW1hcnlLZXlNYXBwaW5nQ291bnQgPSAKLQkJCQlDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRJZE1hcHBpbmdzKHR5cGVNYXBwaW5nKCkpKTsKLQkJaWYgKHNpbXBsZVByaW1hcnlLZXlNYXBwaW5nQ291bnQgPiAxKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcmVsYXRpb25zaGlwTWFwcGluZyA6IGdldERlcml2ZWRJZE1hcHBpbmdzKHR5cGVNYXBwaW5nKCkpKSB7Ci0JCQlFbnRpdHkgZW50aXR5ID0gcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQkJaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlZmluZXNDb21wbGV4UHJpbWFyeUtleShlbnRpdHkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlzaW1wbGVQcmltYXJ5S2V5TWFwcGluZ0NvdW50Kys7Ci0JCQkJaWYgKHNpbXBsZVByaW1hcnlLZXlNYXBwaW5nQ291bnQgPiAxKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGhhc0Rlcml2ZWRJZE1hcHBpbmdNYXRjaGluZ0lkQ2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MpIHsKLQkJZm9yIChTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGVhY2ggOiBnZXREZXJpdmVkSWRNYXBwaW5ncyh0eXBlTWFwcGluZygpKSkgewotCQkJU3RyaW5nIHByaW1hcnlLZXlUeXBlTmFtZSA9IGdldFRhcmdldEVudGl0eVByaW1hcnlLZXlUeXBlTmFtZShlYWNoKTsKLQkJCWlmIChpZENsYXNzLmdldE5hbWUoKS5lcXVhbHMocHJpbWFyeUtleVR5cGVOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYXJnZXRFbnRpdHlQcmltYXJ5S2V5VHlwZU5hbWUoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCByZWxhdGlvbnNoaXBNYXBwaW5nKSB7Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCWlmICh0YXJnZXRFbnRpdHkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFByaW1hcnlLZXlUeXBlTmFtZSh0YXJnZXRFbnRpdHkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lRm9ySWRDbGFzcyhBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpOwotCQlpZiAoQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0SWRNYXBwaW5nS2V5cygpLCBtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFR5cGVOYW1lKCk7Ci0JCX0KLQkJaWYgKENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdLZXlzKCksIG1hcHBpbmdLZXkpKSB7Ci0JCQlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCkgYXR0cmlidXRlTWFwcGluZzsKLQkJCUVudGl0eSB0YXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCQlpZiAodGFyZ2V0RW50aXR5ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleVR5cGVOYW1lKHRhcmdldEVudGl0eSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0VGFibGVWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdFRhYmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTk5YTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0VGFibGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFibGVWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIEpwdFZhbGlkYXRvcgotewotCS8qKiB0aGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0YWJsZXMgZGVmaW5lZCBvbiBlbnRpdGllcyAqLwotCXByb3RlY3RlZCBmaW5hbCBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotCXByb3RlY3RlZCBmaW5hbCBSZWFkT25seVRhYmxlIHRhYmxlOwotCi0JcHJvdGVjdGVkIGZpbmFsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUYWJsZVZhbGlkYXRvcigKLQkJCQlSZWFkT25seVRhYmxlIHRhYmxlLAotCQkJCVRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJdGhpcyhudWxsLCB0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdFRhYmxlVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5VGFibGUgdGFibGUsCi0JCQkJVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50QXR0cmlidXRlOwotCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIgPSB0ZXh0UmFuZ2VSZXNvbHZlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciBnZXRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIHRoaXMudGV4dFJhbmdlUmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlyZXR1cm4gdGhpcy52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSAmJgotCQkJIAl0aGlzLnZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKG1lc3NhZ2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlLnZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQWdhaW5zdERhdGFiYXNlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICggISB0aGlzLnRhYmxlLmNhdGFsb2dJc1Jlc29sdmVkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCAhIHRoaXMudGFibGUuc2NoZW1hSXNSZXNvbHZlZCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZFVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKCAhIHRoaXMudGFibGUuaXNSZXNvbHZlZCgpKSB7Ci0JCQlpZiAodGhpcy50YWJsZS5nZXROYW1lKCkgIT0gbnVsbCkgeyAvL2lmIG5hbWUgaXMgbnVsbCwgdGhlIHZhbGlkYXRpb24gd2lsbCBiZSBoYW5kbGVkIGVsc2V3aGVyZSwgc3VjaCBhcyB0aGUgdGFyZ2V0IGVudGl0eSBpcyBub3QgZGVmaW5lZAotCQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVJc1BhcnRPZlZpcnR1YWxBdHRyaWJ1dGUoKSA/Ci0JCQkJdGhpcy5idWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkQ2F0YWxvZ01lc3NhZ2UoKSA6Ci0JCQkJdGhpcy5idWlsZFVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSh0aGlzLmdldFVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpOwotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQltZXNzYWdlLAotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQl0aGlzLnRhYmxlLmdldENhdGFsb2coKSwKLQkJCQl0aGlzLnRhYmxlLmdldE5hbWUoKQotCQkJfSwKLQkJCXRoaXMudGFibGUsCi0JCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldENhdGFsb2dUZXh0UmFuZ2UoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkQ2F0YWxvZ01lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQl0aGlzLmdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkQ2F0YWxvZ01lc3NhZ2UoKSwKLQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJdGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSwKLQkJCQl0aGlzLnRhYmxlLmdldENhdGFsb2coKSwKLQkJCQl0aGlzLnRhYmxlLmdldE5hbWUoKQotCQkJfSwKLQkJCXRoaXMudGFibGUsCi0JCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldENhdGFsb2dUZXh0UmFuZ2UoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpOwotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlSXNQYXJ0T2ZWaXJ0dWFsQXR0cmlidXRlKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKSA6Ci0JCQkJdGhpcy5idWlsZFVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKHRoaXMuZ2V0VW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVbnJlc29sdmVkU2NoZW1hTWVzc2FnZSgpOwotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCW1lc3NhZ2UsCi0JCQluZXcgU3RyaW5nW10gewotCQkJCXRoaXMudGFibGUuZ2V0U2NoZW1hKCksCi0JCQkJdGhpcy50YWJsZS5nZXROYW1lKCkKLQkJCX0sCi0JCQl0aGlzLnRhYmxlLAotCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRTY2hlbWFUZXh0UmFuZ2UoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkU2NoZW1hTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKCksCi0JCQluZXcgU3RyaW5nW10gewotCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJdGhpcy50YWJsZS5nZXRTY2hlbWEoKSwKLQkJCQl0aGlzLnRhYmxlLmdldE5hbWUoKQotCQkJfSwKLQkJCXRoaXMudGFibGUsCi0JCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldFNjaGVtYVRleHRSYW5nZSgpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKTsKLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVJc1BhcnRPZlZpcnR1YWxBdHRyaWJ1dGUoKSA/Ci0JCQkJdGhpcy5idWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSA6Ci0JCQkJdGhpcy5idWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSh0aGlzLmdldFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpOwotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQltZXNzYWdlLAotCQkJbmV3IFN0cmluZ1tdIHt0aGlzLnRhYmxlLmdldE5hbWUoKX0sCi0JCQl0aGlzLnRhYmxlLAotCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCksCi0JCQluZXcgU3RyaW5nW10gewotCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJdGhpcy50YWJsZS5nZXROYW1lKCkKLQkJCX0sCi0JCQl0aGlzLnRhYmxlLAotCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIHRhYmxlSXNQYXJ0T2ZWaXJ0dWFsQXR0cmlidXRlKCkgewotCQlyZXR1cm4gKHRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsKSAmJgotCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1YTY1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBKcHRWYWxpZGF0b3IKLXsKLQlwcm90ZWN0ZWQgZmluYWwgVGVtcG9yYWxDb252ZXJ0ZXIgY29udmVydGVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IoVGVtcG9yYWxDb252ZXJ0ZXIgY29udmVydGVyLCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlciA9IHRleHRSYW5nZVJlc29sdmVyOwotCX0KLQotCXByb3RlY3RlZCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciBnZXRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIHRoaXMudGV4dFJhbmdlUmVzb2x2ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hcHBpbmcgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlyZXR1cm4gdGhpcy52YWxpZGF0ZUF0dHJpYnV0ZVR5cGVXaXRoVGVtcG9yYWwobWVzc2FnZXMpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlQXR0cmlidXRlVHlwZVdpdGhUZW1wb3JhbChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlTdHJpbmcgdHlwZU5hbWUgPSB0aGlzLmdldFR5cGVOYW1lKCk7Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQkvL3ZhbGlkYXRpb24gZm9yIGEgbnVsbCB0eXBlIG5hbWUgaXMgaGFuZGxlZCBlbHNld2hlcmUsIG5vIG5lZWQgdG8gaGF2ZSBhIHRlbXBvcmFsIHZhbGlkYXRpb24gZXJyb3IKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmICghQXJyYXlUb29scy5jb250YWlucyhUZW1wb3JhbENvbnZlcnRlci5URU1QT1JBTF9NQVBQSU5HX1NVUFBPUlRFRF9UWVBFUywgdHlwZU5hbWUpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZEludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlTWVzc2FnZSgpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRJbnZhbGlkVGVtcG9yYWxNYXBwaW5nVHlwZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSA/Ci0JCQkJdGhpcy5idWlsZFZpcnR1YWxBdHRyaWJ1dGVJbnZhbGlkVGVtcG9yYWxNYXBwaW5nVHlwZU1lc3NhZ2UoKSA6Ci0JCQkJdGhpcy5idWlsZEludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlTWVzc2FnZV8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRJbnZhbGlkVGVtcG9yYWxNYXBwaW5nVHlwZU1lc3NhZ2VfKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJdGhpcy5nZXRJbnZhbGlkVGVtcG9yYWxNYXBwaW5nVHlwZSgpLAotCQkJU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJdGhpcy5jb252ZXJ0ZXIsCi0JCQl0aGlzLmdldFRleHRSYW5nZVJlc29sdmVyKCkuZ2V0Q29udmVydGVyVGV4dFJhbmdlKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlSW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlSW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGUoKSwKLQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpfSwKLQkJCXRoaXMuY29udmVydGVyLAotCQkJdGhpcy5nZXRUZXh0UmFuZ2VSZXNvbHZlcigpLmdldENvbnZlcnRlclRleHRSYW5nZSgpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlSW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0VHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BYnN0cmFjdFR5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOGJhZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fic3RyYWN0VHlwZU1hcHBpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UeXBlTWFwcGluZ1RleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHlwZU1hcHBpbmdWYWxpZGF0b3I8VCBleHRlbmRzIFR5cGVNYXBwaW5nPgotCWltcGxlbWVudHMgSnB0VmFsaWRhdG9yCi17Ci0JcHJvdGVjdGVkIFQgdHlwZU1hcHBpbmc7Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBqcnQ7Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcjsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0VHlwZU1hcHBpbmdWYWxpZGF0b3IoCi0JCQlUIHR5cGVNYXBwaW5nLCBKYXZhUmVzb3VyY2VUeXBlIGpydCwgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQl0aGlzLnR5cGVNYXBwaW5nID0gdHlwZU1hcHBpbmc7Ci0JCXRoaXMuanJ0ID0ganJ0OwotCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyID0gdGV4dFJhbmdlUmVzb2x2ZXI7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMudmFsaWRhdGVUeXBlKG1lc3NhZ2VzKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzTWVtYmVyVHlwZSgpIHsKLQkJaWYgKHRoaXMuanJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qcnQuaXNNZW1iZXJUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTdGF0aWNUeXBlKCkgewotCQlpZiAodGhpcy5qcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmpydC5pc1N0YXRpYygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRmluYWxUeXBlKCkgewotCQlpZiAodGhpcy5qcnQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmpydC5pc0ZpbmFsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzUHJpdmF0ZU5vQXJnQ29uc3RydWN0b3IoKSB7Ci0JCWlmICh0aGlzLmpydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuanJ0Lmhhc1ByaXZhdGVOb0FyZ0NvbnN0cnVjdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTm9BcmdDb25zdHJ1Y3RvcigpIHsKLQkJaWYgKHRoaXMuanJ0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5qcnQuaGFzTm9BcmdDb25zdHJ1Y3RvcigpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFR5cGVNZXNzYWdlKFN0cmluZyBtc2dJRCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQltc2dJRCwKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMudHlwZU1hcHBpbmcuZ2V0TmFtZSgpfSwKLQkJCQl0aGlzLnR5cGVNYXBwaW5nLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0VHlwZU1hcHBpbmdUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZGYzZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yCi0JZXh0ZW5kcyBJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcgotewotCWZpbmFsIFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZTsKLQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLAotCQkJCVJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sCi0JCQkJUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lciwKLQkJCQlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKGNvbHVtbiwgam9pbkNvbHVtbk93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCQl0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGU7Ci0JfQotCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwKLQkJCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwKLQkJCQlSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyLAotCQkJCUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgY29sdW1uLCBqb2luQ29sdW1uT3duZXIsIHRleHRSYW5nZVJlc29sdmVyLCBwcm92aWRlcik7Ci0JCXRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVWYWxpZGF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRlLmlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbE92ZXJyaWRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwKLQkJCQluZXcgU3RyaW5nW10gewotCQkJCQl0aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXREYlRhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQl0aGlzLmdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSwKLQkJCQluZXcgU3RyaW5nW10gewotCQkJCQl0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXREYlRhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGUuaXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsT3ZlcnJpZGVVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpLmdldE5hbWUoKQotCQkJCX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQl0aGlzLmdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCksCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJdGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5vdmVycmlkZS5nZXROYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGUuaXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsT3ZlcnJpZGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIDoKLQkJCQlzdXBlci5idWlsZFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbE92ZXJyaWRlVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUywKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCksCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJdGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5vdmVycmlkZS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRlLmlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbE92ZXJyaWRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMsCi0JCQkJbmV3IFN0cmluZ1tdIHt0aGlzLm92ZXJyaWRlLmdldE5hbWUoKX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgdmFsaWRhdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBjbGFzcyBUYWJsZVZhbGlkYXRvcgotCQlleHRlbmRzIEludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yLlRhYmxlVmFsaWRhdG9yCi0JewotCQlwcm90ZWN0ZWQgVGFibGVWYWxpZGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFRhYmxlTm90VmFsaWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvci50aGlzLm92ZXJyaWRlLmlzVmlydHVhbCgpID8KLQkJCQkJdGhpcy5idWlsZFZpcnR1YWxPdmVycmlkZUNvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCkgOgotCQkJCQlzdXBlci5idWlsZFRhYmxlTm90VmFsaWRNZXNzYWdlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsT3ZlcnJpZGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJdGhpcy5nZXRWaXJ0dWFsT3ZlcnJpZGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJQXNzb2NpYXRpb25PdmVycmlkZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yLnRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW4oKS5nZXROYW1lKCksCi0JCQkJCQl0aGlzLmdldENvbHVtblRhYmxlRGVzY3JpcHRpb25NZXNzYWdlKCkKLQkJCQkJfSwKLQkJCQkJdGhpcy5nZXRDb2x1bW4oKSwKLQkJCQkJdGhpcy5nZXRUZXh0UmFuZ2VSZXNvbHZlcigpLmdldFRhYmxlVGV4dFJhbmdlKCkKLQkJCQkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsT3ZlcnJpZGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZUNvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCksCi0JCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlBc3NvY2lhdGlvbk92ZXJyaWRlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IudGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSwKLQkJCQkJCUFzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvci50aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpCi0JCQkJCX0sCi0JCQkJCXRoaXMuZ2V0Q29sdW1uKCksCi0JCQkJCXRoaXMuZ2V0VGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRUYWJsZVRleHRSYW5nZSgpCi0JCQkJKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk1NDQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3IKLQlleHRlbmRzIEpvaW5Db2x1bW5WYWxpZGF0b3IKLXsKLQlmaW5hbCBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGU7Ci0KLQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwKLQkJCQlSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyLAotCQkJCUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoY29sdW1uLCBqb2luQ29sdW1uT3duZXIsIHRleHRSYW5nZVJlc29sdmVyLCBwcm92aWRlcik7Ci0JCXRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKLQl9Ci0KLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsCi0JCQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLAotCQkJCVJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sCi0JCQkJUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lciwKLQkJCQlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGNvbHVtbiwgam9pbkNvbHVtbk93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCQl0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlVmFsaWRhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZS5pc1ZpcnR1YWwoKSA/Ci0JCQkJdGhpcy5idWlsZFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIDoKLQkJCQlzdXBlci5idWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXROYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldERiVGFibGUoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXROYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldERiVGFibGUoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGUuaXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsT3ZlcnJpZGVVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwKLQkJCQluZXcgU3RyaW5nW10gewotCQkJCQl0aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpLmdldE5hbWUoKQotCQkJCX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZS5pc1ZpcnR1YWwoKSA/Ci0JCQkJdGhpcy5idWlsZFZpcnR1YWxPdmVycmlkZVVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsT3ZlcnJpZGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsCi0JCQkJbmV3IFN0cmluZ1tdIHt0aGlzLm92ZXJyaWRlLmdldE5hbWUoKX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQl0aGlzLmdldFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRlLmlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbE92ZXJyaWRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCksCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJdGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5vdmVycmlkZS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIHZhbGlkYXRvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGFibGVWYWxpZGF0b3IKLQkJZXh0ZW5kcyBKb2luQ29sdW1uVmFsaWRhdG9yLlRhYmxlVmFsaWRhdG9yCi0JewotCQlwcm90ZWN0ZWQgVGFibGVWYWxpZGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFRhYmxlTm90VmFsaWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uVmFsaWRhdG9yLnRoaXMub3ZlcnJpZGUuaXNWaXJ0dWFsKCkgPwotCQkJCQl0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSA6Ci0JCQkJCXN1cGVyLmJ1aWxkVGFibGVOb3RWYWxpZE1lc3NhZ2UoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxPdmVycmlkZUNvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQl0aGlzLmdldFZpcnR1YWxPdmVycmlkZUNvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCksCi0JCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCQlBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvci50aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpCi0JCQkJCX0sCi0JCQkJCXRoaXMuZ2V0Q29sdW1uKCksCi0JCQkJCXRoaXMuZ2V0VGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRUYWJsZVRleHRSYW5nZSgpCi0JCQkJKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbE92ZXJyaWRlQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVUYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCUFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uVmFsaWRhdG9yLnRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCQlBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvci50aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpCi0JCQkJCX0sCi0JCQkJCXRoaXMuZ2V0Q29sdW1uKCksCi0JCQkJCXRoaXMuZ2V0VGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRUYWJsZVRleHRSYW5nZSgpCi0JCQkJKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzMxYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RKb2luVGFibGVWYWxpZGF0b3IKLXsKLQlwcml2YXRlIGZpbmFsIFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZTsKLQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwKLQkJCQlSZWFkT25seUpvaW5UYWJsZSB0YWJsZSwKLQkJCQlUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCXRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKLQl9Ci0KLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVZhbGlkYXRvcigKLQkJCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwKLQkJCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIAotCQkJCVJlYWRPbmx5Sm9pblRhYmxlIHRhYmxlLCAKLQkJCQlUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCXRoaXMub3ZlcnJpZGUgPSBvdmVycmlkZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRlLmlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbE92ZXJyaWRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUsCi0JCQluZXcgU3RyaW5nW10gewotCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCXRoaXMudGFibGUuZ2V0TmFtZSgpCi0JCQl9LAotCQkJdGhpcy50YWJsZSwgCi0JCQl0aGlzLmdldFRleHRSYW5nZVJlc29sdmVyKCkuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZS5pc1ZpcnR1YWwoKSA/Ci0JCQkJdGhpcy5idWlsZFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpIDoKLQkJCQlzdXBlci5idWlsZFVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HLAotCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQl0aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQl0aGlzLnRhYmxlLmdldENhdGFsb2coKQotCQkJfSwKLQkJCXRoaXMudGFibGUsIAotCQkJdGhpcy5nZXRUZXh0UmFuZ2VSZXNvbHZlcigpLmdldENhdGFsb2dUZXh0UmFuZ2UoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZS5pc1ZpcnR1YWwoKSA/Ci0JCQkJdGhpcy5idWlsZFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsT3ZlcnJpZGVVbnJlc29sdmVkU2NoZW1hTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsCi0JCQluZXcgU3RyaW5nW10gewotCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCXRoaXMudGFibGUuZ2V0U2NoZW1hKCkKLQkJCX0sCi0JCQl0aGlzLnRhYmxlLCAKLQkJCXRoaXMuZ2V0VGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRTY2hlbWFUZXh0UmFuZ2UoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXRocm93IHRoaXMuYnVpbGROZXN0ZWRKb2luVGFibGVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkTmVzdGVkSm9pblRhYmxlTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkTmVzdGVkSm9pblRhYmxlTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkTmVzdGVkSm9pblRhYmxlTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKSB7Ci0JCXRocm93IHRoaXMuYnVpbGROZXN0ZWRKb2luVGFibGVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXRocm93IHRoaXMuYnVpbGROZXN0ZWRKb2luVGFibGVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYnVpbGROZXN0ZWRKb2luVGFibGVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKSB7Ci0JCXJldHVybiBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkEgbmVzdGVkIHJlbGF0aW9uc2hpcCBtYXBwaW5nIGNhbm5vdCBzcGVjaWZ5IGEgam9pbiB0YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDE3YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Fzc29jaWF0aW9uT3ZlcnJpZGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZVZhbGlkYXRvcgotCWV4dGVuZHMgT3ZlcnJpZGVWYWxpZGF0b3IKLXsKLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZVZhbGlkYXRvcigKLQkJCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBjb250YWluZXIsCi0JCQkJT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIgb3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyKSB7Ci0JCXN1cGVyKG92ZXJyaWRlLCBjb250YWluZXIsIHRleHRSYW5nZVJlc29sdmVyLCBvdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwKLQkJCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGNvbnRhaW5lciwKLQkJCQlPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCU92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlciBvdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgb3ZlcnJpZGUsIGNvbnRhaW5lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsT3ZlcnJpZGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0F0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y1MTQ3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3IKLQlleHRlbmRzIE5hbWVkQ29sdW1uVmFsaWRhdG9yCi17Ci0JZmluYWwgUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZTsKLQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlLAotCQkJCVJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sCi0JCQkJVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgbWVzc2FnZSkgewotCQlzdXBlcihjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyLCBtZXNzYWdlKTsKLQkJdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwKLQkJCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlLAotCQkJCVJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sCi0JCQkJVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgbWVzc2FnZSkgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyLCBtZXNzYWdlKTsKLQkJdGhpcy5vdmVycmlkZSA9IG92ZXJyaWRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVZhbGlkYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGUuaXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsQ29sdW1uVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbENvbHVtblVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJdGhpcy5nZXRWaXJ0dWFsT3ZlcnJpZGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSwKLQkJCQluZXcgU3RyaW5nW10gewotCQkJCQl0aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXREYlRhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldE5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmNvbHVtbi5nZXROYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldERiVGFibGUoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgdmFsaWRhdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBUYWJsZVZhbGlkYXRvcgotCQlleHRlbmRzIEJhc2VDb2x1bW5UYWJsZVZhbGlkYXRvcgotCXsKLQkJcHJvdGVjdGVkIFRhYmxlVmFsaWRhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRUYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvci50aGlzLm92ZXJyaWRlLmlzVmlydHVhbCgpID8KLQkJCQkJdGhpcy5idWlsZFZpcnR1YWxPdmVycmlkZUNvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCkgOgotCQkJCQlzdXBlci5idWlsZFRhYmxlTm90VmFsaWRNZXNzYWdlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsT3ZlcnJpZGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJdGhpcy5nZXRWaXJ0dWFsT3ZlcnJpZGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpLAotCQkJCQluZXcgU3RyaW5nW10gewotCQkJCQkJQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3IudGhpcy5vdmVycmlkZS5nZXROYW1lKCksCi0JCQkJCQl0aGlzLmdldENvbHVtbigpLmdldFRhYmxlKCksCi0JCQkJCQl0aGlzLmdldENvbHVtbigpLmdldE5hbWUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uVGFibGVEZXNjcmlwdGlvbk1lc3NhZ2UoKQotCQkJCQl9LAotCQkJCQl0aGlzLmdldENvbHVtbigpLAotCQkJCQl0aGlzLmdldFRleHRSYW5nZVJlc29sdmVyKCkuZ2V0VGFibGVUZXh0UmFuZ2UoKQotCQkJCSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxPdmVycmlkZUNvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVUYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yLnRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCQlBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvci50aGlzLm92ZXJyaWRlLmdldE5hbWUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSwKLQkJCQkJCXRoaXMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpLAotCQkJCQkJdGhpcy5nZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpCi0JCQkJCX0sCi0JCQkJCXRoaXMuZ2V0Q29sdW1uKCksCi0JCQkJCXRoaXMuZ2V0VGV4dFJhbmdlUmVzb2x2ZXIoKS5nZXRUYWJsZVRleHRSYW5nZSgpCi0JCQkJKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjgyMGE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9BdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yCi0JZXh0ZW5kcyBPdmVycmlkZVZhbGlkYXRvcgotewotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvcigKLQkJCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlLAotCQkJCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGNvbnRhaW5lciwKLQkJCQlPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCU92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlciBvdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIpIHsKLQkJc3VwZXIob3ZlcnJpZGUsIGNvbnRhaW5lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLAotCQkJCU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyIG92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBvdmVycmlkZSwgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgb3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQmFzZUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9CYXNlSm9pbkNvbHVtblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmFiMDNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9CYXNlSm9pbkNvbHVtblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUpvaW5Db2x1bW5WYWxpZGF0b3I8QyBleHRlbmRzIFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4sIFIgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyPgotCWV4dGVuZHMgQWJzdHJhY3ROYW1lZENvbHVtblZhbGlkYXRvcjxDLCBSPgotewotCXByaXZhdGUgZmluYWwgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgQmFzZUpvaW5Db2x1bW5WYWxpZGF0b3IoCi0JCQkJQyBjb2x1bW4sCi0JCQkJUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXIsCi0JCQkJUiB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIoY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IGpvaW5Db2x1bW5Pd25lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgQmFzZUpvaW5Db2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsCi0JCQkJQyBjb2x1bW4sCi0JCQkJUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXIsCi0JCQkJUiB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IGpvaW5Db2x1bW5Pd25lcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvL3RoaXMgbWV0aG9kIHdpbGwgb25seSBiZSBjYWxsZWQgaWYgdGhlIHRhYmxlIHZhbGlkYXRlcyBjb3JyZWN0bHkKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU5hbWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJdGhpcy52YWxpZGF0ZUpvaW5Db2x1bW5OYW1lKG1lc3NhZ2VzKTsKLQkJdGhpcy52YWxpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lKG1lc3NhZ2VzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUpvaW5Db2x1bW5OYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICgodGhpcy5jb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpICYmICh0aGlzLmpvaW5Db2x1bW5Pd25lci5nZXRKb2luQ29sdW1uc1NpemUoKSA+IDEpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuY29sdW1uLmdldE5hbWUoKSAhPSBudWxsKXsKLQkJCXN1cGVyLnZhbGlkYXRlTmFtZShtZXNzYWdlcyk7Ci0JCX0KLQkJLy9JZiB0aGUgbmFtZSBpcyBudWxsIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBqb2luLWNvbHVtbiwgb25lIG9mIHRoZXNlIHZhbGlkYXRpb24gbWVzc2FnZXMgd2lsbCBhcHBseQotCQkvLyAxLiB0YXJnZXQgZW50aXR5IGRvZXMgbm90IGhhdmUgYSBwcmltYXJ5IGtleQotCQkvLyAyLiB0YXJnZXQgZW50aXR5IGlzIG5vdCBzcGVjaWZpZWQKLQkJLy8gMy4gdGFyZ2V0IGVudGl0eSBpcyBub3QgYW4gZW50aXR5Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoKHRoaXMuY29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgJiYgKHRoaXMuam9pbkNvbHVtbk93bmVyLmdldEpvaW5Db2x1bW5zU2l6ZSgpID4gMSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkpOwotCQl9Ci0JCS8vYnVnIDMxNTI5MiBpcyB0aGUgcmVhc29uIHdlIGFyZSBvbmx5IHZhbGlkYXRpbmcgaWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQotCQllbHNlIGlmICh0aGlzLmNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpICE9IG51bGwpIHsKLQkJCWlmICgodGhpcy5jb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSAhPSBudWxsKSAmJiAhIHRoaXMuY29sdW1uLnJlZmVyZW5jZWRDb2x1bW5Jc1Jlc29sdmVkKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZFVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJLy9JZiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBpcyBudWxsIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBqb2luLWNvbHVtbiwgb25lIG9mIHRoZXNlIHZhbGlkYXRpb24gbWVzc2FnZXMgd2lsbCBhcHBseQotCQkvLyAxLiB0YXJnZXQgZW50aXR5IGRvZXMgbm90IGhhdmUgYSBwcmltYXJ5IGtleQotCQkvLyAyLiB0YXJnZXQgZW50aXR5IGlzIG5vdCBzcGVjaWZpZWQKLQkJLy8gMy4gdGFyZ2V0IGVudGl0eSBpcyBub3QgYW4gZW50aXR5Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uSXNQYXJ0T2ZWaXJ0dWFsQXR0cmlidXRlKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIDoKLQkJCQl0aGlzLmJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSh0aGlzLmdldFVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCW1lc3NhZ2UsCi0JCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpOwotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbklzUGFydE9mVmlydHVhbEF0dHJpYnV0ZSgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgOgotCQkJCXRoaXMuYnVpbGRVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSh0aGlzLmdldFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKTsKLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCW1lc3NhZ2UsCi0JCQkJU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJdGhpcy5nZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSwKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbklzUGFydE9mVmlydHVhbEF0dHJpYnV0ZSgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIDoKLQkJCQl0aGlzLmJ1aWxkVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKHRoaXMuZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJbWVzc2FnZSwKLQkJCQlTdHJpbmdUb29scy5FTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5wZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0NvbGxlY3Rpb25UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0NvbGxlY3Rpb25UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTBkZWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Db2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEFic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3IuVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzLkRPRVNfTk9UX01BVENIX0NPTExFQ1RJT05fVEFCTEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0NvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzZmQ4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gcmVzb2x2ZSB0ZXh0IHJhbmdlcyBvbiBjb252ZXJ0ZXJzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyCi17Ci0JVGV4dFJhbmdlIGdldENvbnZlcnRlclRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9EaXNjcmltaW5hdG9yQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OTNjMDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0Rpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5WYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3I8UmVhZE9ubHlOYW1lZENvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcj4KLXsKLQlwdWJsaWMgRGlzY3JpbWluYXRvckNvbHVtblZhbGlkYXRvcigKLQkJCVJlYWRPbmx5TmFtZWRDb2x1bW4gbmFtZWRDb2x1bW4sCi0JCQlOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKG5hbWVkQ29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRElTQ1JJTUlOQVRPUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0VtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9FbWJlZGRhYmxlT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNWUxYzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0VtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk92ZXJyaWRlVmFsaWRhdG9yLk92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIKLXsKLQlwdWJsaWMgU3RyaW5nIGdldE92ZXJyaWRlRGVzY3JpcHRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuT05fRU1CRUREQUJMRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9FbnRpdHlQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0VudGl0eVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZmMyZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0VudGl0eVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLQotcHVibGljIGNsYXNzIEVudGl0eVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yCi0JZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcgotewotCXB1YmxpYyBFbnRpdHlQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uIGNvbHVtbiwKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyLAotCQkJCUJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0VudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0VudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmEwMGFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEFic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3IuVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzLk5PVF9WQUxJRF9GT1JfVEhJU19FTlRJVFk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0dlbmVyaWNFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvR2VuZXJpY0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU4ZjdiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvR2VuZXJpY0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDEyICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNFbnRpdHlQcmltYXJ5S2V5VmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IKLXsKLQlwdWJsaWMgR2VuZXJpY0VudGl0eVByaW1hcnlLZXlWYWxpZGF0b3IoRW50aXR5IGVudGl0eSwgUHJpbWFyeUtleVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKGVudGl0eSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpZENsYXNzSXNSZXF1aXJlZCgpIHsKLQkJLy9TaG9ydCBjaXJjdWl0IGNoZWNrIGZvciBpZENsYXNzSXNSZXF1aXJlZCBpZiBhbnkgcGFydCBvZiB0aGUgcHJpbWFyeSBrZXkgaXMgZGVmaW5lZAotCQkvL2luIGEgc3VwZXJjbGFzcyBmb3IgR2VuZXJpYyB0eXBlcy4gIE90aGVyIHZhbGlkYXRpb24gd2lsbCBleGlzdCBhbmQgbmVlZHMgdG8gYmUKLQkJLy9hZGRyZXNzZWQgZmlyc3QKLQkJaWYoZGVmaW5lc1ByaW1hcnlLZXlPbkFuY2VzdG9yKHR5cGVNYXBwaW5nKCkpKXsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuaWRDbGFzc0lzUmVxdWlyZWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3NDb25zdHJ1Y3RvcihKYXZhUGVyc2lzdGVudFR5cGUgaWRDbGFzcywKLQkJCUxpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKCFpZENsYXNzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5oYXNQdWJsaWNOb0FyZ0NvbnN0cnVjdG9yKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZChEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX1BVQkxJQ19OT19BUkdfQ09OU1RSVUNUT1IsCi0JCQkJCW5ldyBTdHJpbmdbXSB7aWRDbGFzcy5nZXROYW1lKCl9LAotCQkJCQl0eXBlTWFwcGluZygpLAotCQkJCQl0ZXh0UmFuZ2VSZXNvbHZlcigpLmdldElkQ2xhc3NUZXh0UmFuZ2UoKSkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tNaXNzaW5nQXR0cmlidXRlV2l0aFByb3BlcnR5QWNjZXNzKEphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzLCBBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcsIAotCQkJTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBNaXNzaW5nIGF0dHJpYnV0ZSBpcyByZXBvcnRlZCBpZiBtaXNzaW5nIGdldHRlciBvci9hbmQgc2V0dGVyIAotCQkvLyBwcm9wZXJ0eSBtZXRob2QocykgaW4gSWQgY2xhc3Mgd2l0aCBwcm9wZXJ0eSBhY2Nlc3MKLQkJY2hlY2tNaXNzaW5nQXR0cmlidXRlKGlkQ2xhc3MsIGF0dHJpYnV0ZU1hcHBpbmcsIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJZENsYXNzQXR0cmlidXRlc1dpdGhQcm9wZXJ0eUFjY2VzcygKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywKLQkJCUlSZXBvcnRlciByZXBvcnRlcikgewotCQl2YWxpZGF0ZUlkQ2xhc3NQcm9wZXJ0eU1ldGhvZHMoaWRDbGFzcywgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvR2VuZXJpY01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvR2VuZXJpY01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MzE0OTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0dlbmVyaWNNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5QcmltYXJ5S2V5VGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvciBleHRlbmRzCi0JCUFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlWYWxpZGF0b3IgewotCi0JcHVibGljIEdlbmVyaWNNYXBwZWRTdXBlcmNsYXNzUHJpbWFyeUtleVZhbGlkYXRvcihNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MsIFByaW1hcnlLZXlUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJc3VwZXIobWFwcGVkU3VwZXJjbGFzcywgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl9Ci0JCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlkQ2xhc3NJc1JlcXVpcmVkKCkgewotCQkvL1Nob3J0IGNpcmN1aXQgY2hlY2sgZm9yIGlkQ2xhc3NJc1JlcXVpcmVkIGlmIGFueSBwYXJ0IG9mIHRoZSBwcmltYXJ5IGtleSBpcyBkZWZpbmVkCi0JCS8vaW4gYSBzdXBlcmNsYXNzIGZvciBHZW5lcmljIHR5cGVzLiAgT3RoZXIgdmFsaWRhdGlvbiB3aWxsIGV4aXN0IGFuZCBuZWVkcyB0byBiZQotCQkvL2FkZHJlc3NlZCBmaXJzdAotCQlpZihkZWZpbmVzUHJpbWFyeUtleU9uQW5jZXN0b3IodHlwZU1hcHBpbmcoKSkpewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBzdXBlci5pZENsYXNzSXNSZXF1aXJlZCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSWRDbGFzc0NvbnN0cnVjdG9yKEphdmFQZXJzaXN0ZW50VHlwZSBpZENsYXNzLAotCQkJTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAoIWlkQ2xhc3MuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmhhc1B1YmxpY05vQXJnQ29uc3RydWN0b3IoKSkgewotCQkJbWVzc2FnZXMuYWRkKERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfUFVCTElDX05PX0FSR19DT05TVFJVQ1RPUiwKLQkJCQkJbmV3IFN0cmluZ1tdIHtpZENsYXNzLmdldE5hbWUoKX0sCi0JCQkJCXR5cGVNYXBwaW5nKCksCi0JCQkJCXRleHRSYW5nZVJlc29sdmVyKCkuZ2V0SWRDbGFzc1RleHRSYW5nZSgpKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjaGVja01pc3NpbmdBdHRyaWJ1dGVXaXRoUHJvcGVydHlBY2Nlc3MoSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MsIEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZywgCi0JCQlMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIE1pc3NpbmcgYXR0cmlidXRlIGlzIHJlcG9ydGVkIGlmIG1pc3NpbmcgZ2V0dGVyIG9yL2FuZCBzZXR0ZXIgCi0JCS8vIHByb3BlcnR5IG1ldGhvZChzKSBpbiBJZCBjbGFzcyB3aXRoIHByb3BlcnR5IGFjY2VzcwotCQljaGVja01pc3NpbmdBdHRyaWJ1dGUoaWRDbGFzcywgYXR0cmlidXRlTWFwcGluZywgbWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUlkQ2xhc3NBdHRyaWJ1dGVzV2l0aFByb3BlcnR5QWNjZXNzKAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGlkQ2xhc3MsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLAotCQkJSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXZhbGlkYXRlSWRDbGFzc1Byb3BlcnR5TWV0aG9kcyhpZENsYXNzLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDZjNDY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9HZW5lcmljUm9vdENvbnRleHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkhhc2hCYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdEpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1ldGFtb2RlbFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUubW9kZWwuaW50ZXJuYWwudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ2FuY2VsbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogdGhlIGNvbnRleHQgbW9kZWwgcm9vdAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Jvb3RDb250ZXh0Tm9kZQotCWV4dGVuZHMgQWJzdHJhY3RKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSnBhUm9vdENvbnRleHROb2RlMl8wCi17Ci0JLyogVGhpcyBvYmplY3QgaGFzIG5vIHBhcmVudCwgc28gaXQgbXVzdCBwb2ludCB0byB0aGUgSlBBIHByb2plY3QgZXhwbGljaXRseS4gKi8KLQlwcm90ZWN0ZWQgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JLyogTWFpbiBjb250ZXh0IG9iamVjdC4gKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWw7Ci0KLQotCXB1YmxpYyBHZW5lcmljUm9vdENvbnRleHROb2RlKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlzdXBlcihudWxsKTsgIC8vIHRoZSBKUEEgcHJvamVjdCBpcyBub3QgcmVhbGx5IGEgInBhcmVudCIuLi4KLQotCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnBlcnNpc3RlbmNlWG1sID0gdGhpcy5idWlsZFBlcnNpc3RlbmNlWG1sKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1BlcnNpc3RlbmNlWG1sKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVhtbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW5jZS54bWwgKioqKioqKioqKgotCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sIGdldFBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVhtbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0ZW5jZVhtbChQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCkgewotCQlQZXJzaXN0ZW5jZVhtbCBvbGQgPSB0aGlzLnBlcnNpc3RlbmNlWG1sOwotCQl0aGlzLnBlcnNpc3RlbmNlWG1sID0gcGVyc2lzdGVuY2VYbWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNURU5DRV9YTUxfUFJPUEVSVFksIG9sZCwgcGVyc2lzdGVuY2VYbWwpOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBidWlsZFBlcnNpc3RlbmNlWG1sKCkgewotCQlKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IHRoaXMucmVzb2x2ZVBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJcmV0dXJuICh4bWxSZXNvdXJjZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VYbWwoeG1sUmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNQZXJzaXN0ZW5jZVhtbCgpIHsKLQkJdGhpcy5zeW5jUGVyc2lzdGVuY2VYbWwodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGJvdGgge0BsaW5rICNzeW5jUGVyc2lzdGVuY2VYbWwoKX0gYW5kCi0JICoge0BsaW5rICN1cGRhdGVQZXJzaXN0ZW5jZVhtbCgpfSBiZWNhdXNlPHVsPgotCSAqIDxsaT5hIDxlbT5zeW5jPC9lbT4gd2lsbCBvY2N1ciB3aGVuIHRoZSBmaWxlIGlzIGVkaXRlZCBkaXJlY3RseTsKLQkgKiAgICAgYW5kIHRoZSB1c2VyIGNvdWxkIG1vZGlmeSBzb21ldGhpbmcgKGUuZy4gdGhlIHZlcnNpb24gbnVtYmVyKSB0aGF0Ci0JICogICAgIHRyaWdnZXJzIHRoZSBmaWxlIGJlaW5nICJyZXNvbHZlZCIgb3Igbm90OwotCSAqICAgICBzZWUge0BsaW5rICNyZXNvbHZlUGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpfQotCSAqIDxsaT5hbiA8ZW0+dXBkYXRlPC9lbT4gd2lsbCBvY2N1ciB3aGVuZXZlciB0aGUgZW50aXJlIGZpbGUgaXMgYWRkZWQgb3IKLQkgKiAgICAgcmVtb3ZlZAotCSAqIDwvdWw+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3luY1BlcnNpc3RlbmNlWG1sKGJvb2xlYW4gc3luYykgewotCQlKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IHRoaXMucmVzb2x2ZVBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJaWYgKHhtbFJlc291cmNlID09IG51bGwpIHsKLQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sICE9IG51bGwpIHsKLQkJCQl0aGlzLnBlcnNpc3RlbmNlWG1sLmRpc3Bvc2UoKTsKLQkJCQl0aGlzLnNldFBlcnNpc3RlbmNlWG1sKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0UGVyc2lzdGVuY2VYbWwodGhpcy5idWlsZFBlcnNpc3RlbmNlWG1sKHhtbFJlc291cmNlKSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChzeW5jKSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVuY2VYbWwuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVuY2VYbWwudXBkYXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIHJlc29sdmVQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkgewotCQlKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IHRoaXMuanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCWlmICh4bWxSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoeG1sUmVzb3VyY2UuaXNSZXZlcnRpbmcoKSkgewotCQkJLy8gMzA4MjU0IC0gdGhpcyBjYW4gaGFwcGVuIHdoZW4gcGVyc2lzdGVuY2UueG1sIGlzIGNsb3NlZCB3aXRob3V0IHNhdmluZzsKLQkJCS8vIHRoZSBtb2RlbCBpcyBjb21wbGV0ZWx5IHdoYWNrZWQgaW4gYW5vdGhlciB0aHJlYWQgLSBzbyB3aXBlIG91ciBtb2RlbCg/KQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHhtbFJlc291cmNlLmdldFJlc291cmNlVHlwZSgpOwotCQlpZiAocmVzb3VyY2VUeXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICggISB0aGlzLmdldEpwYVBsYXRmb3JtKCkuc3VwcG9ydHNSZXNvdXJjZVR5cGUocmVzb3VyY2VUeXBlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHhtbFJlc291cmNlOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246ICd4bWxSZXNvdXJjZScgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGJ1aWxkUGVyc2lzdGVuY2VYbWwoSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkUGVyc2lzdGVuY2VYbWwodGhpcywgeG1sUmVzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBlcnNpc3RlbmNlWG1sKCkgewotCQl0aGlzLnN5bmNQZXJzaXN0ZW5jZVhtbChmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNQYXJlbnQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoKSB7Ci0JCXN1cGVyLnN0YXRlQ2hhbmdlZCgpOwotCQkvLyBmb3J3YXJkIHRvIEpQQSBwcm9qZWN0Ci0JCXRoaXMuanBhUHJvamVjdC5zdGF0ZUNoYW5nZWQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb2plY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBNYXBwaW5nRmlsZVJvb3QgZ2V0TWFwcGluZ0ZpbGVSb290KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZXRhbW9kZWwoKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sICE9IG51bGwpIHsKLQkJCSgoUGVyc2lzdGVuY2VYbWwyXzApIHRoaXMucGVyc2lzdGVuY2VYbWwpLmluaXRpYWxpemVNZXRhbW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTWV0YW1vZGVsKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVhtbCAhPSBudWxsKSB7Ci0JCQkoKFBlcnNpc3RlbmNlWG1sMl8wKSB0aGlzLnBlcnNpc3RlbmNlWG1sKS5zeW5jaHJvbml6ZU1ldGFtb2RlbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZU1ldGFtb2RlbCgpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VYbWwgIT0gbnVsbCkgewotCQkJKChQZXJzaXN0ZW5jZVhtbDJfMCkgdGhpcy5wZXJzaXN0ZW5jZVhtbCkuZGlzcG9zZU1ldGFtb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJdGhyb3cgbmV3IFZhbGlkYXRpb25DYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJfQotCi0JCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZChidWlsZFBlcnNpc3RlbmNlWG1sVmFsaWRhdGlvbk1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKCAhIHRoaXMuanBhUHJvamVjdC5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpIHsKLQkJCXRoaXMudmFsaWRhdGVPcnBoYW5DbGFzc2VzKG1lc3NhZ2VzKTsKLQkJfQotCQl0aGlzLnBlcnNpc3RlbmNlWG1sLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkUGVyc2lzdGVuY2VYbWxWYWxpZGF0aW9uTWVzc2FnZSgpIHsKLQkJaW50IHNldmVyaXR5ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJSUZpbGUgZmlsZSA9IGdldFBsYXRmb3JtRmlsZSgpOwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gdGhpcy5qcGFQcm9qZWN0LmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJCWlmICh4bWxSZXNvdXJjZSAhPSBudWxsIAotCQkJCQkmJiAhIGdldEpwYVBsYXRmb3JtKCkuc3VwcG9ydHNSZXNvdXJjZVR5cGUoeG1sUmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpKSB7Ci0JCQkJcmV0dXJuIERlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlzZXZlcml0eSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1hNTF9VTlNVUFBPUlRFRF9DT05URU5ULAotCQkJCQlmaWxlKTsKLQkJCX0KLQkJCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlzZXZlcml0eSwKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVCwKLQkJCQlmaWxlKTsKLQkJfQotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQlzZXZlcml0eSwKLQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCwKLQkJCXRoaXMpOwotCX0KLQotCXByb3RlY3RlZCBJRmlsZSBnZXRQbGF0Zm9ybUZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3QuZ2V0UGxhdGZvcm1GaWxlKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9QRVJTSVNURU5DRV9YTUxfUlVOVElNRV9QQVRIKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU9ycGhhbkNsYXNzZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSB0aGlzLnBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47ICAvLyBoYW5kbGVkIHdpdGggb3RoZXIgdmFsaWRhdGlvbgotCQl9Ci0JCWlmIChwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybjsgIC8vIHRoZSBjb250ZXh0IG1vZGVsIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgcGVyc2lzdGVuY2UgdW5pdAotCQl9Ci0KLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSGFzaEJhZzxTdHJpbmc+IGFubm90YXRlZENsYXNzTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMuYmFnKHRoaXMuanBhUHJvamVjdC5nZXRBbm5vdGF0ZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpKTsKLQkJSGFzaEJhZzxTdHJpbmc+IG9ycGhhbnMgPSBhbm5vdGF0ZWRDbGFzc05hbWVzLmNsb25lKCk7Ci0JCWZvciAoU3RyaW5nIGFubm90YXRlZENsYXNzTmFtZSA6IGFubm90YXRlZENsYXNzTmFtZXMpIHsKLQkJCWlmIChwZXJzaXN0ZW5jZVVuaXQuc3BlY2lmaWVzUGVyc2lzdGVudFR5cGUoYW5ub3RhdGVkQ2xhc3NOYW1lKSkgewotCQkJCW9ycGhhbnMucmVtb3ZlKGFubm90YXRlZENsYXNzTmFtZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChNZXRhbW9kZWxTeW5jaHJvbml6ZXIuTWV0YW1vZGVsVG9vbHMuaXNNZXRhbW9kZWwoZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoYW5ub3RhdGVkQ2xhc3NOYW1lKSkpIHsKLQkJCQlvcnBoYW5zLnJlbW92ZShhbm5vdGF0ZWRDbGFzc05hbWUpOwotCQkJfQotCQl9Ci0KLQkJLy8gVE9ETyByZW1vdmUgJ2pyY3UnCi0JCS8vIHJlcGxhY2UganJjdS5nZXRGaWxlKCkgd2l0aCBqcnB0LmdldEZpbGUoKQotCQkvLyByZXBsYWNlIGpycHQuZ2V0TWFwcGluZ0Fubm90YXRpb24oKS5nZXRUZXh0UmFuZ2UoanJjdS5idWlsZEFTVFJvb3QoKSkKLQkJLy8gICAgd2l0aCBqcnB0LmdldE1hcHBpbmdBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKCkKLQkJLy8gICAgKG5ldyBtZXRob2QgI2dldFRleHRSYW5nZSgpID8pCi0JCWZvciAoU3RyaW5nIG9ycGhhbiA6IG9ycGhhbnMpIHsKLQkJCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBqcnQgPSB0aGlzLmpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZShvcnBoYW4pOwotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSBqcnQuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQlpZiAoanJ0LmlzQW5ub3RhdGVkV2l0aCh0aGlzLmpwYVByb2plY3QuZ2V0VHlwZU1hcHBpbmdBbm5vdGF0aW9ucygpKSkgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklULAotCQkJCQkJbmV3IFN0cmluZ1tdIHtqcnQuZ2V0UXVhbGlmaWVkTmFtZSgpfSwKLQkJCQkJCWpydC5nZXRGaWxlKCksCi0JCQkJCQlqcnQuZ2V0TmFtZVRleHRSYW5nZShqcmN1LmJ1aWxkQVNUUm9vdCgpKQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX0FOTk9UQVRFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQsCi0JCQkJCQluZXcgU3RyaW5nW10ge2pydC5nZXROYW1lKCl9LAotCQkJCQkJanJ0LmdldEZpbGUoKSwKLQkJCQkJCWpydC5nZXROYW1lVGV4dFJhbmdlKGpyY3UuYnVpbGRBU1RSb290KCkpCi0JCQkJCSkKLQkJCQkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvR2VuZXJpY1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvR2VuZXJpY1R5cGVNYXBwaW5nVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZTUwNWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0dlbmVyaWNUeXBlTWFwcGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNUeXBlTWFwcGluZ1ZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RUeXBlTWFwcGluZ1ZhbGlkYXRvcjxUeXBlTWFwcGluZz4KLXsKLQlwdWJsaWMgR2VuZXJpY1R5cGVNYXBwaW5nVmFsaWRhdG9yKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nLCBKYXZhUmVzb3VyY2VUeXBlIGpydCwgVHlwZU1hcHBpbmdUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcih0eXBlTWFwcGluZywganJ0LCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVUeXBlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLmlzRmluYWxUeXBlKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVHlwZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19GSU5BTF9DTEFTUykpOwotCQl9Ci0JCWlmICh0aGlzLmlzTWVtYmVyVHlwZSgpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZFR5cGVNZXNzYWdlKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTKSk7Ci0JCX0KLQkJaWYgKHRoaXMuaGFzTm9BcmdDb25zdHJ1Y3RvcigpKSB7Ci0JCQlpZiAodGhpcy5oYXNQcml2YXRlTm9BcmdDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRUeXBlTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0NMQVNTX1BSSVZBVEVfTk9fQVJHX0NPTlNUUlVDVE9SKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZFR5cGVNZXNzYWdlKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfQ0xBU1NfTUlTU0lOR19OT19BUkdfQ09OU1RSVUNUT1IpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9JbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0ludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0OTVjYzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0ludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IKLQlleHRlbmRzIEJhc2VKb2luQ29sdW1uVmFsaWRhdG9yPFJlYWRPbmx5Sm9pbkNvbHVtbiwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyPgotewotCXByb3RlY3RlZCBJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLAotCQkJCVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXIsCi0JCQkJSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihjb2x1bW4sIGpvaW5Db2x1bW5Pd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIHByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsCi0JCQkJUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwKLQkJCQlSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgam9pbkNvbHVtbk93bmVyLAotCQkJCUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgY29sdW1uLCBqb2luQ29sdW1uT3duZXIsIHRleHRSYW5nZVJlc29sdmVyLCBwcm92aWRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlVmFsaWRhdG9yKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIHZhbGlkYXRvciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVGFibGVWYWxpZGF0b3IKLQkJZXh0ZW5kcyBCYXNlQ29sdW1uVGFibGVWYWxpZGF0b3IKLQl7Ci0JCXByb3RlY3RlZCBUYWJsZVZhbGlkYXRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0pvaW5Db2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Kb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGRmMTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0pvaW5Db2x1bW5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uVmFsaWRhdG9yCi0JZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblZhbGlkYXRvcjxSZWFkT25seUpvaW5Db2x1bW4sIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcj4KLXsKLQlwcm90ZWN0ZWQgSm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLAotCQkJCVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXIsCi0JCQkJSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihjb2x1bW4sIGpvaW5Db2x1bW5Pd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIHByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwKLQkJCQlSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLAotCQkJCVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXIsCi0JCQkJSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBjb2x1bW4sIGpvaW5Db2x1bW5Pd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIHByb3ZpZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVWYWxpZGF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSB2YWxpZGF0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFRhYmxlVmFsaWRhdG9yCi0JCWV4dGVuZHMgQmFzZUNvbHVtblRhYmxlVmFsaWRhdG9yCi0JewotCQlwcm90ZWN0ZWQgVGFibGVWYWxpZGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0pvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0pvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEwZmJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Kb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBKb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEFic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3IuVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyCi17Ci0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UYWJsZURlc2NyaXB0aW9uTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzLkRPRVNfTk9UX01BVENIX0pPSU5fVEFCTEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0pvaW5UYWJsZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L0pvaW5UYWJsZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJkN2MxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9Kb2luVGFibGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEpvaW5UYWJsZVZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RKb2luVGFibGVWYWxpZGF0b3IKLXsKLQlwdWJsaWMgSm9pblRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBSZWFkT25seUpvaW5UYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCB0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkU2NoZW1hTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWMzYzJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3IKLQlleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yCi17Ci0JcHVibGljIE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwKLQkJCQlUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBvdmVycmlkZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVZhbGlkYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbE92ZXJyaWRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgdmFsaWRhdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBUYWJsZVZhbGlkYXRvcgotCQlleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yLlRhYmxlVmFsaWRhdG9yCi0JewotCQlwcm90ZWN0ZWQgVGFibGVWYWxpZGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbE92ZXJyaWRlQ29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MWJkNTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3IKLQlleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yCi17Ci0JcHVibGljIE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLAotCQkJCU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyIG92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBvdmVycmlkZSwgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgb3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9NYXBLZXlDb2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9NYXBLZXlDb2x1bW5WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VjZWQyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvTWFwS2V5Q29sdW1uVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTWFwS2V5Q29sdW1uVmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yPFJlYWRPbmx5QmFzZUNvbHVtbiwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcj4KLXsKLQlwdWJsaWMgTWFwS2V5Q29sdW1uVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sCi0JCQkJVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVZhbGlkYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSB2YWxpZGF0b3IgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFRhYmxlVmFsaWRhdG9yCi0JCWV4dGVuZHMgQmFzZUNvbHVtblRhYmxlVmFsaWRhdG9yCi0JewotCQlwcm90ZWN0ZWQgVGFibGVWYWxpZGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L01hcHBlZFN1cGVyY2xhc3NPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9NYXBwZWRTdXBlcmNsYXNzT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTdkYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L01hcHBlZFN1cGVyY2xhc3NPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk92ZXJyaWRlVmFsaWRhdG9yLk92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIKLXsKLQlwdWJsaWMgU3RyaW5nIGdldE92ZXJyaWRlRGVzY3JpcHRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuT05fTUFQUEVEX1NVUEVSQ0xBU1M7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvTmFtZWRDb2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9OYW1lZENvbHVtblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg3Zjc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9OYW1lZENvbHVtblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5hbWVkQ29sdW1uVmFsaWRhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yPFJlYWRPbmx5QmFzZUNvbHVtbiwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcj4KLXsKLQotCXByb3RlY3RlZCBOYW1lZENvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLAotCQkJCVRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKGNvbHVtbiwgdGV4dFJhbmdlUmVzb2x2ZXIsIHByb3ZpZGVyKTsKLQl9Ci0KLQlwdWJsaWMgTmFtZWRDb2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsCi0JCQkJUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwKLQkJCQlUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyLAotCQkJCVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyLCBwcm92aWRlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJhc2VDb2x1bW5UYWJsZVZhbGlkYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L09uZVRvT25lUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9PbmVUb09uZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjlkZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L09uZVRvT25lUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPbmVUb09uZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yCi0JZXh0ZW5kcyBQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcgotewotCXB1YmxpYyBPbmVUb09uZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gY29sdW1uLAotCQkJCVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIgb3duZXIsCi0JCQkJQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L092ZXJyaWRlVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvT3ZlcnJpZGVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2MDU0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvT3ZlcnJpZGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE92ZXJyaWRlVmFsaWRhdG9yCi0JaW1wbGVtZW50cyBKcHRWYWxpZGF0b3IKLXsKLQkvKiogdGhpcyBpcyA8Y29kZT5udWxsPC9jb2RlPiBmb3Igb3ZlcnJpZGVzIGRlZmluZWQgb24gZW50aXRpZXMgKi8KLQlwcm90ZWN0ZWQgZmluYWwgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZTsKLQotCXByb3RlY3RlZCBmaW5hbCBPdmVycmlkZUNvbnRhaW5lciBjb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcjsKLQotCXByb3RlY3RlZCBmaW5hbCBPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIgb3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyOwotCi0JcHJvdGVjdGVkIE92ZXJyaWRlVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLAotCQkJCU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyIG92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcikgewotCQl0aGlzKG51bGwsIG92ZXJyaWRlLCBjb250YWluZXIsIHRleHRSYW5nZVJlc29sdmVyLCBvdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIpOwotCX0KLQotCi0JcHJvdGVjdGVkIE92ZXJyaWRlVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsCi0JCQkJT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLAotCQkJCU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyIG92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcikgewotCQl0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50QXR0cmlidXRlOwotCQl0aGlzLm92ZXJyaWRlID0gb3ZlcnJpZGU7Ci0JCXRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOwotCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyID0gdGV4dFJhbmdlUmVzb2x2ZXI7Ci0JCXRoaXMub3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyID0gb3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcnJpZGVEZXNjcmlwdGlvbk1lc3NhZ2UoKSAgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIuZ2V0T3ZlcnJpZGVEZXNjcmlwdGlvbk1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWlmICh0aGlzLnZhbGlkYXRlVHlwZShtZXNzYWdlcykpIHsKLQkJCS8vIHZhbGlkYXRlIHRoZSBuYW1lIG9ubHkgaWYgdGhlIHR5cGUgaXMgdmFsaWQKLQkJCXJldHVybiB0aGlzLnZhbGlkYXRlTmFtZShtZXNzYWdlcyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlVHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5jb250YWluZXIuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVW5yZXNvbHZlZE92ZXJyaWRlVHlwZU1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZE92ZXJyaWRlVHlwZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VW5yZXNvbHZlZE92ZXJyaWRlVHlwZU1lc3NhZ2UoKSwKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpfSwKLQkJCQl0aGlzLm92ZXJyaWRlLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOyAKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVucmVzb2x2ZWRPdmVycmlkZVR5cGVNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZS5pc1ZpcnR1YWwoKSA/Ci0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfVFlQRSA6Ci0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkFUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX1RZUEU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVOYW1lKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICggISBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5jb250YWluZXIuZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpLCB0aGlzLm92ZXJyaWRlLmdldE5hbWUoKSkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJaWYgKHRoaXMub3ZlcnJpZGUuaXNWaXJ0dWFsKCkpIHsKLQkJCS8vIHRoaXMgY2FuIGhhcHBlbiB3aGVuIGFuIGVycm9uZW91cyBKYXZhIG92ZXJyaWRlIHRyaWdnZXJzIGEKLQkJCS8vIGNvcnJlc3BvbmRpbmcgb3JtLnhtbCB2aXJ0dWFsIG92ZXJyaWRlCi0JCQlyZXR1cm4gdGhpcy5idWlsZFZpcnR1YWxVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKTsKLQkJfQotCQlpZiAodGhpcy5vdmVycmlkZUlzUGFydE9mVmlydHVhbEF0dHJpYnV0ZSgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSh0aGlzLmdldFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQl0aGlzLmdldFZpcnR1YWxPdmVycmlkZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmdldE92ZXJyaWRlRGVzY3JpcHRpb25NZXNzYWdlKCksCi0JCQkJCXRoaXMuY29udGFpbmVyLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMub3ZlcnJpZGUsCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaXJ0dWFsT3ZlcnJpZGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKTsKLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQltZXNzYWdlLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmdldE92ZXJyaWRlRGVzY3JpcHRpb25NZXNzYWdlKCksCi0JCQkJCXRoaXMuY29udGFpbmVyLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMub3ZlcnJpZGUsCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKTsKLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCXRoaXMuZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMucGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCksCi0JCQkJCXRoaXMub3ZlcnJpZGUuZ2V0TmFtZSgpLAotCQkJCQl0aGlzLmdldE92ZXJyaWRlRGVzY3JpcHRpb25NZXNzYWdlKCksCi0JCQkJCXRoaXMuY29udGFpbmVyLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKS5nZXROYW1lKCkKLQkJCQl9LAotCQkJCXRoaXMub3ZlcnJpZGUsCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVycmlkZUlzUGFydE9mVmlydHVhbEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUgIT0gbnVsbCkgJiYKLQkJCQl0aGlzLnBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCk7Ci0JfQotCi0JcHVibGljIGludGVyZmFjZSBPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIgewotCQlTdHJpbmcgZ2V0T3ZlcnJpZGVEZXNjcmlwdGlvbk1lc3NhZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvUGVyc2lzdGVudEZpZWxkVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvUGVyc2lzdGVudEZpZWxkVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMDY0NDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1BlcnNpc3RlbnRGaWVsZFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRmllbGRBY2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRGaWVsZFZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW50QXR0cmlidXRlVmFsaWRhdG9yCi17Ci0KLQlwcm90ZWN0ZWQgRmllbGRBY2Nlc3NvciBmaWVsZEFjY2Vzc29yOwotCi0JcHVibGljIFBlcnNpc3RlbnRGaWVsZFZhbGlkYXRvcigKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEZpZWxkQWNjZXNzb3IgZmllbGRBY2Nlc3NvciwgUGVyc2lzdGVudEF0dHJpYnV0ZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKQotCXsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl0aGlzLmZpZWxkQWNjZXNzb3IgPSBmaWVsZEFjY2Vzc29yOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwcGVkQXR0cmlidXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICh0aGlzLmZpZWxkQWNjZXNzb3IuaXNGaW5hbCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZEF0dHJpYnV0ZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZmllbGRBY2Nlc3Nvci5pc1B1YmxpYygpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZEF0dHJpYnV0ZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1BlcnNpc3RlbnRQcm9wZXJ0eVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1BlcnNpc3RlbnRQcm9wZXJ0eVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDQ0NDM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9QZXJzaXN0ZW50UHJvcGVydHlWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLlByb3BlcnR5QWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50UHJvcGVydHlWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVudEF0dHJpYnV0ZVZhbGlkYXRvcgotewotCi0JcHJvdGVjdGVkIFByb3BlcnR5QWNjZXNzb3IgcHJvcGVydHlBY2Nlc3NvcjsKLQotCXB1YmxpYyBQZXJzaXN0ZW50UHJvcGVydHlWYWxpZGF0b3IoCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBQcm9wZXJ0eUFjY2Vzc29yIHByb3BlcnR5QWNjZXNzb3IsIFBlcnNpc3RlbnRBdHRyaWJ1dGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikKLQl7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJdGhpcy5wcm9wZXJ0eUFjY2Vzc29yID0gcHJvcGVydHlBY2Nlc3NvcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQkvL1RPRE8gdmFsaWRhdGlvbiBmb3IgbnVsbCBnZXR0ZXIgb3IgbnVsbCBzZXR0ZXIgLSB3b3VsZCBhcHBseSB0byBFY2xpcHNlTGluayB0b28KLQkvL1RPRE8gdmFsaWRhdGlvbiBmb3IgYW5ub3RhdGVkIHNldHRlcj8gLSB3b3VsZCBhcHBseSB0byBFY2xpcHNlTGluayB0b28KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHBlZEF0dHJpYnV0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAodGhpcy5wcm9wZXJ0eUFjY2Vzc29yLmdldFJlc291cmNlR2V0dGVyKCkgIT0gbnVsbCAmJiB0aGlzLnByb3BlcnR5QWNjZXNzb3IuZ2V0UmVzb3VyY2VHZXR0ZXIoKS5pc0ZpbmFsKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkQXR0cmlidXRlTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfR0VUVEVSKSk7Ci0JCX0KLQkJaWYgKHRoaXMucHJvcGVydHlBY2Nlc3Nvci5nZXRSZXNvdXJjZVNldHRlcigpICE9IG51bGwgJiYgdGhpcy5wcm9wZXJ0eUFjY2Vzc29yLmdldFJlc291cmNlU2V0dGVyKCkuaXNGaW5hbCgpKSB7Ci0JCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZEF0dHJpYnV0ZU1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX1NFVFRFUikpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1ByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzMWIyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yCi0JZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblZhbGlkYXRvcjxSZWFkT25seUJhc2VKb2luQ29sdW1uLCBCYXNlSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyPgotewotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uIGNvbHVtbiwKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyLAotCQkJCUJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIFRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uIGNvbHVtbiwKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyLAotCQkJCUJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIFRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5OdWxsLmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uLmlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKHRoaXMuZ2V0VmlydHVhbFBLSm9pbkNvbHVtblVucmVzb2x2ZWROYW1lTWVzc2FnZSgpKSA6Ci0JCQkJc3VwZXIuYnVpbGRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxQS0pvaW5Db2x1bW5VbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uLmlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSh0aGlzLmdldFZpcnR1YWxQS0pvaW5Db2x1bW5VbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkpIDoKLQkJCQlzdXBlci5idWlsZFVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxQS0pvaW5Db2x1bW5VbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uaXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSh0aGlzLmdldFZpcnR1YWxQS0pvaW5Db2x1bW5VbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpKSA6Ci0JCQkJc3VwZXIuYnVpbGRVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbFBLSm9pbkNvbHVtblVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW4uaXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSh0aGlzLmdldFZpcnR1YWxQS0pvaW5Db2x1bW5VbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSkgOgotCQkJCXN1cGVyLmJ1aWxkVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsUEtKb2luQ29sdW1uVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvUmVsYXRpb25zaGlwU3RyYXRlZ3lUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9SZWxhdGlvbnNoaXBTdHJhdGVneVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODc3ZmRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9SZWxhdGlvbnNoaXBTdHJhdGVneVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotcHVibGljIGNsYXNzIFJlbGF0aW9uc2hpcFN0cmF0ZWd5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyCi0JaW1wbGVtZW50cyBBYnN0cmFjdE5hbWVkQ29sdW1uVmFsaWRhdG9yLlRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcgotewotCXByaXZhdGUgZmluYWwgUmVsYXRpb25zaGlwU3RyYXRlZ3kgcmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0JCi0JcHVibGljIFJlbGF0aW9uc2hpcFN0cmF0ZWd5VGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKFJlbGF0aW9uc2hpcFN0cmF0ZWd5IHJlbGF0aW9uc2hpcFN0cmF0ZWd5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVsYXRpb25zaGlwU3RyYXRlZ3kgPSByZWxhdGlvbnNoaXBTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRhYmxlRGVzY3JpcHRpb25NZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXBTdHJhdGVneS5nZXRDb2x1bW5UYWJsZU5vdFZhbGlkRGVzY3JpcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvU2Vjb25kYXJ5VGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1NlY29uZGFyeVRhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjZjYyZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvU2Vjb25kYXJ5VGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IKLQlleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yCi17Ci0JcHJpdmF0ZSBmaW5hbCBSZWFkT25seVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCi0JcHVibGljIFNlY29uZGFyeVRhYmxlUHJpbWFyeUtleUpvaW5Db2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uIGNvbHVtbiwKLQkJCQlSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyIG93bmVyLAotCQkJCUJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCQl0aGlzLnNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2Vjb25kYXJ5VGFibGVJc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlLmlzVmlydHVhbCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZUlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgOgotCQkJCXN1cGVyLmJ1aWxkVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMuZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldE5hbWUoKSwKLQkJCQkJdGhpcy5jb2x1bW4uZ2V0RGJUYWJsZSgpLmdldE5hbWUoKQotCQkJCX0sCi0JCQkJdGhpcy5jb2x1bW4sCi0JCQkJdGhpcy50ZXh0UmFuZ2VSZXNvbHZlci5nZXROYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gdGhpcy5zZWNvbmRhcnlUYWJsZUlzVmlydHVhbCgpID8KLQkJCQl0aGlzLmJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIDoKLQkJCQlzdXBlci5idWlsZFVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVVbnJlc29sdmVkUmVmZXJlbmNlZENvbHVtbk5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLAotCQkJCW5ldyBTdHJpbmdbXSB7Ci0JCQkJCXRoaXMuZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCksCi0JCQkJCXRoaXMuY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkuZ2V0TmFtZSgpCi0JCQkJfSwKLQkJCQl0aGlzLmNvbHVtbiwKLQkJCQl0aGlzLnRleHRSYW5nZVJlc29sdmVyLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkKLQkJCSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlSXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVVbnNwZWNpZmllZE5hbWVNdWx0aXBsZUpvaW5Db2x1bW5zTWVzc2FnZSgpIDoKLQkJCQlzdXBlci5idWlsZFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKCl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlSXNWaXJ0dWFsKCkgPwotCQkJCXRoaXMuYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSA6Ci0JCQkJc3VwZXIuYnVpbGRVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywKLQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0U2Vjb25kYXJ5VGFibGVOYW1lKCl9LAotCQkJCXRoaXMuY29sdW1uLAotCQkJCXRoaXMudGV4dFJhbmdlUmVzb2x2ZXIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKQotCQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9TZWNvbmRhcnlUYWJsZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1NlY29uZGFyeVRhYmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2NiZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1NlY29uZGFyeVRhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0VGFibGVWYWxpZGF0b3IKLXsKLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVWYWxpZGF0b3IoUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcih0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkgewotCQl0aHJvdyB0aGlzLmJ1aWxkQXR0cmlidXRlVGFibGVOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkU2NoZW1hTWVzc2FnZSgpIHsKLQkJdGhyb3cgdGhpcy5idWlsZEF0dHJpYnV0ZVRhYmxlTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXRocm93IHRoaXMuYnVpbGRBdHRyaWJ1dGVUYWJsZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBidWlsZEF0dHJpYnV0ZVRhYmxlTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJBbiBhdHRyaWJ1dGUgY2Fubm90IHNwZWNpZnkgYSBzZWNvbmRhcnkgdGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9UYWJsZVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1RhYmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMDk5ZTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L1RhYmxlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgVGFibGVWYWxpZGF0b3IKLQlleHRlbmRzIEFic3RyYWN0VGFibGVWYWxpZGF0b3IKLXsKLQlwdWJsaWMgVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlUYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcih0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkQ2F0YWxvZ01lc3NhZ2UoKSB7Ci0JCXRocm93IHRoaXMuYnVpbGRBdHRyaWJ1dGVUYWJsZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKSB7Ci0JCXRocm93IHRoaXMuYnVpbGRBdHRyaWJ1dGVUYWJsZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXRocm93IHRoaXMuYnVpbGRBdHRyaWJ1dGVUYWJsZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBidWlsZEF0dHJpYnV0ZVRhYmxlTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotCQlyZXR1cm4gbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJBbiBhdHRyaWJ1dGUgY2Fubm90IHNwZWNpZnkgYSB0YWJsZSIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzZjYxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFDb252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhQ29udmVydGVyCi17Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbnZlcnRlci5Pd25lciBvd25lcjsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEphdmFDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBKYXZhQ29udmVydGVyLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLm93bmVyLmJ1aWxkVmFsaWRhdG9yKHRoaXMsIHRoaXMuYnVpbGRDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlcihhc3RSb290KSkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciBidWlsZENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyKGZpbmFsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIoKSB7Ci0JCQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbnZlcnRlclRleHRSYW5nZSgpIHsKLQkJCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0QW5ub3RhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQXR0cmlidXRlIGdldFJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBOT1AKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9BYnN0cmFjdEphdmFOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGY0YzRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIG5hbWVkIGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW48QSBleHRlbmRzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLCBPIGV4dGVuZHMgSmF2YVJlYWRPbmx5TmFtZWREaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW48QSwgTz4KLQlpbXBsZW1lbnRzIEphdmFOYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4KLXsKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZExlbmd0aDsKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE8gb3duZXIpIHsKLQkJdGhpcyhwYXJlbnQsIG93bmVyLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE8gb3duZXIsIEEgY29sdW1uQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCBjb2x1bW5Bbm5vdGF0aW9uKTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRMZW5ndGgoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aF8odGhpcy5idWlsZFNwZWNpZmllZExlbmd0aCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSh0aGlzLmJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQl0aGlzLnNldERlZmF1bHRMZW5ndGgodGhpcy5idWlsZERlZmF1bHRMZW5ndGgoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBhYnN0cmFjdCBBIGdldENvbHVtbkFubm90YXRpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBkaXNjcmltaW5hdG9yIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlIDogdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSwgZGlzY3JpbWluYXRvclR5cGUpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS50b0phdmFSZXNvdXJjZU1vZGVsKGRpc2NyaW1pbmF0b3JUeXBlKSk7Ci0JCQl0aGlzLnJlbW92ZUNvbHVtbkFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlXyhkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8oRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCi0JcHVibGljIERpc2NyaW1pbmF0b3JUeXBlIGdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSkgewotCQlEaXNjcmltaW5hdG9yVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGUgPSBkaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGQsIGRpc2NyaW1pbmF0b3JUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgYnVpbGREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsZW5ndGggKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZExlbmd0aC5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRMZW5ndGgsIGxlbmd0aCkpIHsKLQkJCXRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLnNldExlbmd0aChsZW5ndGgpOwotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGhfKEludGVnZXIgbGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkU3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRMZW5ndGgoaW50IGxlbmd0aCkgewotCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCQl0aGlzLmRlZmF1bHRMZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0TGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YU92ZXJyaWRlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzE2MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm90TnVsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1Ykl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5GaWx0ZXJpbmdJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZV87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbE92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQ29udGV4dENvbnRhaW5lclRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgb3ZlcnJpZGUgY29udGFpbmVyCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IEFsdGhvdWdoIG5vdCB0eXBpY2FsLCBhIEphdmEgb3ZlcnJpZGUgY29udGFpbmVyIGNhbgotICogY29ycmVzcG9uZCB0byBvbmx5IGEgc3Vic2V0IG9mIHRoZSBhbm5vdGF0aW9ucyBpbiB0aGUgSmF2YSBzb3VyY2UgY29kZS4KLSAqIEluIHRoYXQgY2FzZSwgdGhlIGluZGV4IG9mIGEgc3BlY2lmaWVkIG92ZXJyaWRlIG11c3QgYmUgdHJhbnNsYXRlZCB0byBpdHMKLSAqIGNvcnJlc3BvbmRpbmcgYW5ub3RhdGlvbidzIGluZGV4IGJlZm9yZSB3ZSBtYW5pcHVsYXRlIHRoZSBhbm5vdGF0aW9ucy4KLSAqIDxwPgotICogQXMgb2YgSlBBIDIuMCwgdGhlIG9ubHkgcGxhY2Ugd2UgbmVlZCB0aGVzZSB0cmFuc2xhdGlvbnMgaXMgZm9yIHRoZSBhdHRyaWJ1dGUKLSAqIG92ZXJyaWRlcyBmb3IgYW4gZW1iZWRkZWQgY29sbGVjdGlvbi4gSWYgYW4gZW1iZWRkZWQgY29sbGVjdGlvbiBpcyBhCi0gKiB7QGxpbmsgamF2YS51dGlsLk1hcCBNYXB9LCB0aGUgYXR0cmlidXRlIG92ZXJyaWRlcyBjYW4gb3ZlcnJpZGUgdGhlIG1hcHBpbmdzCi0gKiBmb3IgZWl0aGVyIHRoZSBtYXAncyBrZXlzIG9yIHRoZSBtYXAncyB2YWx1ZXMuIFRoZSBuYW1lcyBvZiB0aGUgb3ZlcnJpZGVzIGZvcgotICogdGhlIG1hcCdzIGtleXMgYXJlIHByZWZpeGVkIHdpdGggPGNvZGU+ImtleS4iPC9jb2RlPiB3aGlsZSB0aGUgb3ZlcnJpZGVzCi0gKiBmb3IgdGhlIG1hcCdzIHZhbHVlcyBhcmUgcHJlZml4ZWQgd2l0aCA8Y29kZT4idmFsdWUuIjwvY29kZT4uCi0gKiAoSnVzdCBhIGJpdCBvZiBoYWNrLCBjb3VydGVzeSBvZiB0aGUgSlBBIHNwZWMgY29tbWl0dGVlLikKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU92ZXJyaWRlQ29udGFpbmVyPAotCQkJTyBleHRlbmRzIEphdmFPdmVycmlkZUNvbnRhaW5lci5Pd25lciwKLQkJCVIgZXh0ZW5kcyBKYXZhUmVhZE9ubHlPdmVycmlkZSwKLQkJCVMgZXh0ZW5kcyBKYXZhT3ZlcnJpZGUsCi0JCQlWIGV4dGVuZHMgSmF2YVZpcnR1YWxPdmVycmlkZSwKLQkJCUEgZXh0ZW5kcyBPdmVycmlkZUFubm90YXRpb24gJiBOZXN0YWJsZUFubm90YXRpb24KLQkJPgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFPdmVycmlkZUNvbnRhaW5lcjJfMAotewotCS8qKgotCSAqIHRoaXMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjb250YWluZXIgaXMgInJlYWQtb25seSIKLQkgKiAoaS5lLiBhIDxlbT5udWxsPC9lbT4gY29udGFpbmVyKQotCSAqIEBzZWUgI2dldE93bmVyMl8wKCkKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTyBvd25lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBWZWN0b3I8Uz4gc3BlY2lmaWVkT3ZlcnJpZGVzID0gbmV3IFZlY3RvcjxTPigpOwotCXByb3RlY3RlZCBmaW5hbCBTcGVjaWZpZWRPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIgc3BlY2lmaWVkT3ZlcnJpZGVDb250YWluZXJBZGFwdGVyID0gbmV3IFNwZWNpZmllZE92ZXJyaWRlQ29udGFpbmVyQWRhcHRlcigpOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxWPiB2aXJ0dWFsT3ZlcnJpZGVzID0gbmV3IFZlY3RvcjxWPigpOwotCXByb3RlY3RlZCBmaW5hbCBWaXJ0dWFsT3ZlcnJpZGVDb250YWluZXJBZGFwdGVyIHZpcnR1YWxPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIgPSBuZXcgVmlydHVhbE92ZXJyaWRlQ29udGFpbmVyQWRhcHRlcigpOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgTyBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY2hyb25pemVOb2Rlc1dpdGhSZXNvdXJjZU1vZGVsKHRoaXMuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkpOwotCQkvLyB0aGUgdmlydHVhbCBvdmVycmlkZXMgZG8gbm90IG5lZWQgYSBzeW5jCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVTcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJdGhpcy51cGRhdGVWaXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFI+IGdldE92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0SXRlcmFibGU8Uj4odGhpcy5nZXRSZWFkT25seVNwZWNpZmllZE92ZXJyaWRlcygpLCB0aGlzLmdldFJlYWRPbmx5VmlydHVhbE92ZXJyaWRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE92ZXJyaWRlc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE92ZXJyaWRlcy5zaXplKCkgKyB0aGlzLnZpcnR1YWxPdmVycmlkZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBSIGdldE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0T3ZlcnJpZGVOYW1lZCh0aGlzLmdldE92ZXJyaWRlcygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRPdmVycmlkZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRPdmVycmlkZU5hbWVzXygpLCBOb3ROdWxsRmlsdGVyLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0T3ZlcnJpZGVOYW1lc18oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxSLCBTdHJpbmc+KHRoaXMuZ2V0T3ZlcnJpZGVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oUiBvdmVycmlkZSkgewotCQkJCXJldHVybiBvdmVycmlkZS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlIGNvbnZlcnNpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIDxlbT5TaWxlbnRseTwvZW0+IGFkZCB0aGUgbmV3IHZpcnR1YWwgb3ZlcnJpZGUgYmVmb3JlIHJlbW92aW5nIHRoZQotCSAqIHNwZWNpZmllZCBvdmVycmlkZSwgb3IgdGhlIDxlbT51cGRhdGU8L2VtPiB3aWxsIGRpc2NvdmVyIHRoZSBtaXNzaW5nCi0JICogdmlydHVhbCBvdmVycmlkZSBhbmQgYWRkIGl0IHByZWVtcHRpdmVseS4KLQkgKi8KLQlwdWJsaWMgViBjb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwoT3ZlcnJpZGVfIG92ZXJyaWRlKSB7Ci0JCWlmIChvdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcnJpZGUgaXMgYWxyZWFkeSB2aXJ0dWFsOiAiICsgb3ZlcnJpZGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJUyBzcGVjaWZpZWRPdmVycmlkZSA9IChTKSBvdmVycmlkZTsKLQkJaW50IHZpcnR1YWxJbmRleCA9IHRoaXMudmlydHVhbE92ZXJyaWRlcy5zaXplKCk7Ci0JCVN0cmluZyBvdmVycmlkZU5hbWUgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXROYW1lKCk7Ci0JCVYgdmlydHVhbE92ZXJyaWRlID0gbnVsbDsKLQkJLy8gbWFrZSBzdXJlIHRoZSBzcGVjaWZpZWQgb3ZlcnJpZGUgYWN0dWFsbHkgb3ZlcnJpZGVzIHNvbWV0aGluZyBiZWZvcmUgYnVpbGRpbmcgdGhlIHZpcnR1YWwgb3ZlcnJpZGUKLQkJaWYgKHRoaXMub3ZlcnJpZGVXaWxsQmVWaXJ0dWFsKG92ZXJyaWRlTmFtZSwgc3BlY2lmaWVkT3ZlcnJpZGUpKSB7Ci0JCQl2aXJ0dWFsT3ZlcnJpZGUgPSB0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlKG92ZXJyaWRlTmFtZSk7Ci0JCQl0aGlzLnZpcnR1YWxPdmVycmlkZXMuYWRkKHZpcnR1YWxJbmRleCwgdmlydHVhbE92ZXJyaWRlKTsKLQkJfQotCi0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoc3BlY2lmaWVkT3ZlcnJpZGUpOyAgLy8gdHJpZ2dlciB1cGRhdGUKLQotCQlpZiAodmlydHVhbE92ZXJyaWRlICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWSVJUVUFMX09WRVJSSURFU19MSVNULCB2aXJ0dWFsSW5kZXgsIHZpcnR1YWxPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxPdmVycmlkZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG92ZXJyaWRlIG5hbWUgd2lsbCBiZSBhCi0JICogPGVtPnZpcnR1YWw8L2VtPiBvdmVycmlkZSB3aGVuIHRoZSBzcGVjaWZpZWQgc3BlY2lmaWVkIG92ZXJyaWRlIGlzCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjb250YWluZXIuIFRoZSBvdmVycmlkZSBuYW1lIG11c3QgYmUgYW1vbmcgdGhlCi0JICogdmFsaWQgb3ZlcnJpZGUgbmFtZXMgYW5kIGl0IG11c3Qgbm90IGNvcnJlc3BvbmQgdG8gYW55IG9mIHRoZQotCSAqIHJlbWFpbmluZyBzcGVjaWZpZWQgb3ZlcnJpZGVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJyaWRlV2lsbEJlVmlydHVhbChTdHJpbmcgb3ZlcnJpZGVOYW1lLCBTIHNwZWNpZmllZE92ZXJyaWRlVG9CZVJlbW92ZWQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSwgb3ZlcnJpZGVOYW1lKSAmJgotCQkJCSh0aGlzLmdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQob3ZlcnJpZGVOYW1lLCBzcGVjaWZpZWRPdmVycmlkZVRvQmVSZW1vdmVkKSA9PSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8ZW0+U2lsZW50bHk8L2VtPiByZW1vdmUgdGhlIHZpcnR1YWwgb3ZlcnJpZGUgYW5kIGFkZCB0aGUgbmV3IHNwZWNpZmllZAotCSAqIG92ZXJyaWRlIGJlZm9yZSBuYW1pbmcgdGhlIHNwZWNpZmllZCBvdmVycmlkZSwgb3IgdGhlIDxlbT51cGRhdGU8L2VtPgotCSAqIHdpbGwgZGlzY292ZXIgdGhlIGRhbmdsaW5nIHZpcnR1YWwgb3ZlcnJpZGUgYW5kIHJlbW92ZSBpdCBwcmVlbXB0aXZlbHkuCi0JICovCi0JcHVibGljIFMgY29udmVydE92ZXJyaWRlVG9TcGVjaWZpZWQoVmlydHVhbE92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCWlmICggISBvdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcnJpZGUgaXMgYWxyZWFkeSBzcGVjaWZpZWQ6ICIgKyBvdmVycmlkZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlWIHZpcnR1YWxPdmVycmlkZSA9IChWKSBvdmVycmlkZTsKLQkJaW50IHZpcnR1YWxJbmRleCA9IHRoaXMudmlydHVhbE92ZXJyaWRlcy5pbmRleE9mKHZpcnR1YWxPdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbE92ZXJyaWRlcy5yZW1vdmUodmlydHVhbEluZGV4KTsKLQotCQlpbnQgc3BlY2lmaWVkSW5kZXggPSB0aGlzLnNwZWNpZmllZE92ZXJyaWRlcy5zaXplKCk7Ci0JCVMgc3BlY2lmaWVkT3ZlcnJpZGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkT3ZlcnJpZGUodGhpcy5idWlsZE92ZXJyaWRlQW5ub3RhdGlvbihzcGVjaWZpZWRJbmRleCkpOwotCQl0aGlzLnNwZWNpZmllZE92ZXJyaWRlcy5hZGQoc3BlY2lmaWVkSW5kZXgsIHNwZWNpZmllZE92ZXJyaWRlKTsKLQotCQl0aGlzLmluaXRpYWxpemVTcGVjaWZpZWRPdmVycmlkZShzcGVjaWZpZWRPdmVycmlkZSwgdmlydHVhbE92ZXJyaWRlKTsgIC8vIHRyaWdnZXIgdXBkYXRlCi0KLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoVklSVFVBTF9PVkVSUklERVNfTElTVCwgdmlydHVhbEluZGV4LCB2aXJ0dWFsT3ZlcnJpZGUpOwotCQl0aGlzLmZpcmVJdGVtQWRkZWQoU1BFQ0lGSUVEX09WRVJSSURFU19MSVNULCBzcGVjaWZpZWRJbmRleCwgc3BlY2lmaWVkT3ZlcnJpZGUpOwkJCi0JCXJldHVybiBzcGVjaWZpZWRPdmVycmlkZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkT3ZlcnJpZGUoUyBzcGVjaWZpZWRPdmVycmlkZSwgViB2aXJ0dWFsT3ZlcnJpZGUpOwotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxTPiBnZXRTcGVjaWZpZWRPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFM+KHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFI+IGdldFJlYWRPbmx5U3BlY2lmaWVkT3ZlcnJpZGVzKCkgewotCQkvLyBTIHNob3VsZCBhbHdheXMgYmUgYSBzdWJ0eXBlIG9mIFIsIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQgaW4gdGhlCi0JCS8vIGNsYXNzIGRlY2xhcmF0aW9uLi4uCi0JCXJldHVybiAoTGlzdEl0ZXJhYmxlPFI+KSB0aGlzLmdldFNwZWNpZmllZE92ZXJyaWRlcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgUyBnZXRTcGVjaWZpZWRPdmVycmlkZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIFMgZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKG5hbWUsIG51bGwpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBTIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIFMgZXhjbHVkZSkgewotCQlyZXR1cm4gKFMpIHRoaXMuc2VsZWN0T3ZlcnJpZGVOYW1lZCh0aGlzLmdldFJlYWRPbmx5U3BlY2lmaWVkT3ZlcnJpZGVzKCksIG5hbWUsIGV4Y2x1ZGUpOwotCX0KLQotCXByb3RlY3RlZCBTIGFkZFNwZWNpZmllZE92ZXJyaWRlKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRPdmVycmlkZSh0aGlzLnNwZWNpZmllZE92ZXJyaWRlcy5zaXplKCkpOwotCX0KLQotCXByb3RlY3RlZCBTIGFkZFNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCkgewotCQlBIGFubm90YXRpb24gPSB0aGlzLmJ1aWxkT3ZlcnJpZGVBbm5vdGF0aW9uKGluZGV4KTsKLQkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkT3ZlcnJpZGVfKGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgQSBidWlsZE92ZXJyaWRlQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJaW50IGFubm90YXRpb25JbmRleCA9IHRoaXMuY2FsY3VsYXRlTmV3QW5ub3RhdGlvbkluZGV4KGluZGV4KTsKLQkJcmV0dXJuIChBKSB0aGlzLmdldFJlc291cmNlTWVtYmVyKCkuYWRkQW5ub3RhdGlvbihhbm5vdGF0aW9uSW5kZXgsIHRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZU5ld0Fubm90YXRpb25JbmRleChpbnQgaW5kZXgpIHsKLQkJLy8gaWYgd2UgYXJlIGFkZGluZyB0byB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbGlzdCwKLQkJLy8gcHV0IHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFsbCB0aGUgZXhpc3RpbmcgYW5ub3RhdGlvbnMKLQkJaWYgKGluZGV4ID09IHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLnNpemUoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zaXplKHRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9ucygpKTsKLQkJfQotCi0JCS8vIGlmIHdlIGFyZSBhZGRpbmcgdG8gdGhlIGZyb250IG9mIHRoZSBzcGVjaWZpZWQgbGlzdCwKLQkJLy8gcHV0IHRoZSBhbm5vdGF0aW9uIGJlZm9yZSBvZiBhbGwgdGhlIGV4aXN0aW5nIGFubm90YXRpb25zCi0JCWlmIChpbmRleCA9PSAwKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8vIGlmIHdlIGFyZSBhZGRpbmcgdG8gdGhlIG1pZGRsZSBvZiB0aGUgc3BlY2lmaWVkIGxpc3QsCi0JCS8vIHB1dCB0aGUgYW5ub3RhdGlvbiBpbW1lZGlhdGVseSBhZnRlciBhbGwgdGhlIHByZXZpb3VzIG92ZXJyaWRlJ3MKLQkJLy8gZXhpc3RpbmcgYW5ub3RhdGlvbgotCQlyZXR1cm4gdGhpcy50cmFuc2xhdGVUb0Fubm90YXRpb25JbmRleChpbmRleCAtIDEpICsgMTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBvdmVycmlkZSBleGlzdHMgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotCSAqLwotCXByb3RlY3RlZCBpbnQgdHJhbnNsYXRlVG9Bbm5vdGF0aW9uSW5kZXgoaW50IGluZGV4KSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZih0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbnMoKSwgdGhpcy5zcGVjaWZpZWRPdmVycmlkZXMuZ2V0KGluZGV4KS5nZXRPdmVycmlkZUFubm90YXRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRPdmVycmlkZUFubm90YXRpb25OYW1lKCk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRPdmVycmlkZShTIG92ZXJyaWRlKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGUodGhpcy5zcGVjaWZpZWRPdmVycmlkZXMuaW5kZXhPZihvdmVycmlkZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZU92ZXJyaWRlQW5ub3RhdGlvbihpbmRleCk7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGVfKGluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVPdmVycmlkZUFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCWludCBhbm5vdGF0aW9uSW5kZXggPSB0aGlzLnRyYW5zbGF0ZVRvQW5ub3RhdGlvbkluZGV4KGluZGV4KTsKLQkJdGhpcy5nZXRSZXNvdXJjZU1lbWJlcigpLnJlbW92ZUFubm90YXRpb24oYW5ub3RhdGlvbkluZGV4LCB0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGVfKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5zcGVjaWZpZWRPdmVycmlkZXMsIFNQRUNJRklFRF9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZE92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZU92ZXJyaWRlQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5zcGVjaWZpZWRPdmVycmlkZXMsIFNQRUNJRklFRF9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZU92ZXJyaWRlQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQlpbnQgdGFyZ2V0QW5ub3RhdGlvbkluZGV4ID0gdGhpcy50cmFuc2xhdGVUb0Fubm90YXRpb25JbmRleCh0YXJnZXRJbmRleCk7Ci0JCWludCBzb3VyY2VBbm5vdGF0aW9uSW5kZXggPSB0aGlzLnRyYW5zbGF0ZVRvQW5ub3RhdGlvbkluZGV4KHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRSZXNvdXJjZU1lbWJlcigpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEFubm90YXRpb25JbmRleCwgc291cmNlQW5ub3RhdGlvbkluZGV4LCB0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFMgYnVpbGRTcGVjaWZpZWRPdmVycmlkZShBIG92ZXJyaWRlQW5ub3RhdGlvbik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTcGVjaWZpZWRPdmVycmlkZXMoKSB7Ci0JCUNvbnRleHRDb250YWluZXJUb29scy51cGRhdGUodGhpcy5zcGVjaWZpZWRPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBPiBnZXRSZWxldmFudE92ZXJyaWRlQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8QT4odGhpcy5nZXRPdmVycmlkZUFubm90YXRpb25zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEEgYW5ub3RhdGlvbikgewotCQkJCVN0cmluZyBvdmVycmlkZU5hbWUgPSBhbm5vdGF0aW9uLmdldE5hbWUoKTsKLQkJCQlyZXR1cm4gKG92ZXJyaWRlTmFtZSAhPSBudWxsKSAmJiB0aGlzLmdldE93bmVyKCkuaXNSZWxldmFudChvdmVycmlkZU5hbWUpOwotCQkJfQotCQkJcHJvdGVjdGVkIEphdmFPdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lciBnZXRPd25lcigpIHsKLQkJCQlyZXR1cm4gQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIudGhpcy5nZXRPd25lcjJfMCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBPiBnZXRPdmVycmlkZUFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIEE+KCh0aGlzLm92ZXJyaWRlQW5ub3RhdGlvbnMoKSkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IG92ZXJyaWRlQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiAodGhpcy5vd25lciA9PSBudWxsKSA/IEVtcHR5SXRlcmFibGUuPE5lc3RhYmxlQW5ub3RhdGlvbj5pbnN0YW5jZSgpIDogdGhpcy5vdmVycmlkZUFubm90YXRpb25zXygpOwotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHtAbGluayAjb3duZXJ9IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IG92ZXJyaWRlQW5ub3RhdGlvbnNfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZXNvdXJjZU1lbWJlcigpLmdldEFubm90YXRpb25zKHRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlU3BlY2lmaWVkT3ZlcnJpZGVfKGludCBpbmRleCwgUyBvdmVycmlkZSkgewotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KGluZGV4LCBvdmVycmlkZSwgdGhpcy5zcGVjaWZpZWRPdmVycmlkZXMsIFNQRUNJRklFRF9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIFMgYWRkU3BlY2lmaWVkT3ZlcnJpZGVfKGludCBpbmRleCwgQSBvdmVycmlkZUFubm90YXRpb24pIHsKLQkJUyBvdmVycmlkZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRPdmVycmlkZShvdmVycmlkZUFubm90YXRpb24pOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG92ZXJyaWRlLCB0aGlzLnNwZWNpZmllZE92ZXJyaWRlcywgU1BFQ0lGSUVEX09WRVJSSURFU19MSVNUKTsKLQkJcmV0dXJuIG92ZXJyaWRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpZmllZE92ZXJyaWRlXyhTIG92ZXJyaWRlKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGVfKHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLmluZGV4T2Yob3ZlcnJpZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgb3ZlcnJpZGUgY29udGFpbmVyIGFkYXB0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkT3ZlcnJpZGVDb250YWluZXJBZGFwdGVyCi0JCWltcGxlbWVudHMgQ29udGV4dENvbnRhaW5lclRvb2xzLkFkYXB0ZXI8UywgQT4KLQl7Ci0JCXB1YmxpYyBJdGVyYWJsZTxTPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIudGhpcy5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmFibGU8QT4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFPdmVycmlkZUNvbnRhaW5lci50aGlzLmdldFJlbGV2YW50T3ZlcnJpZGVBbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgQSBnZXRSZXNvdXJjZUVsZW1lbnQoUyBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIChBKSBjb250ZXh0RWxlbWVudC5nZXRPdmVycmlkZUFubm90YXRpb24oKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb3ZlQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBTIGVsZW1lbnQpIHsKLQkJCUFic3RyYWN0SmF2YU92ZXJyaWRlQ29udGFpbmVyLnRoaXMubW92ZVNwZWNpZmllZE92ZXJyaWRlXyhpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBBIHJlc291cmNlRWxlbWVudCkgewotCQkJQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIudGhpcy5hZGRTcGVjaWZpZWRPdmVycmlkZV8oaW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoUyBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEphdmFPdmVycmlkZUNvbnRhaW5lci50aGlzLnJlbW92ZVNwZWNpZmllZE92ZXJyaWRlXyhlbGVtZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2aXJ0dWFsIG92ZXJyaWRlcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFY+IGdldFZpcnR1YWxPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFY+KHRoaXMudmlydHVhbE92ZXJyaWRlcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbE92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSPiBnZXRSZWFkT25seVZpcnR1YWxPdmVycmlkZXMoKSB7Ci0JCS8vIFYgc2hvdWxkIGFsd2F5cyBiZSBhIHN1YnR5cGUgb2YgUiwgYnV0IHdlIGNhbid0IGVuZm9yY2UgdGhhdCBpbiB0aGUKLQkJLy8gY2xhc3MgZGVjbGFyYXRpb24uLi4KLQkJcmV0dXJuIChMaXN0SXRlcmFibGU8Uj4pIHRoaXMuZ2V0VmlydHVhbE92ZXJyaWRlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVZpcnR1YWxPdmVycmlkZXMoKSB7Ci0JCUNvbnRleHRDb250YWluZXJUb29scy51cGRhdGUodGhpcy52aXJ0dWFsT3ZlcnJpZGVDb250YWluZXJBZGFwdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG92ZXJyaWRhYmxlIG5hbWVzIHRoYXQgYXJlIG5vdCBhbHJlYWR5IGluIHRoZSBsaXN0IG9mCi0JICogc3BlY2lmaWVkIG92ZXJyaWRlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRWaXJ0dWFsT3ZlcnJpZGVOYW1lcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnZpcnR1YWxPdmVycmlkZU5hbWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYXRvcjxTdHJpbmc+IHZpcnR1YWxPdmVycmlkZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPFN0cmluZz4odGhpcy5nZXRBbGxPdmVycmlkYWJsZU5hbWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBuYW1lKSB7Ci0JCQkJcmV0dXJuIEFic3RyYWN0SmF2YU92ZXJyaWRlQ29udGFpbmVyLnRoaXMub3ZlcnJpZGVJc1ZpcnR1YWwobmFtZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcnJpZGVJc1ZpcnR1YWwoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChuYW1lKSA9PSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVWaXJ0dWFsT3ZlcnJpZGUoaW50IGluZGV4LCBWIG92ZXJyaWRlKSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QoaW5kZXgsIG92ZXJyaWRlLCB0aGlzLnZpcnR1YWxPdmVycmlkZXMsIFZJUlRVQUxfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCBWIGFkZFZpcnR1YWxPdmVycmlkZShpbnQgaW5kZXgsIFN0cmluZyBuYW1lKSB7Ci0JCVYgb3ZlcnJpZGUgPSB0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlKG5hbWUpOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIG92ZXJyaWRlLCB0aGlzLnZpcnR1YWxPdmVycmlkZXMsIFZJUlRVQUxfT1ZFUlJJREVTX0xJU1QpOwotCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFYgYnVpbGRWaXJ0dWFsT3ZlcnJpZGUoU3RyaW5nIG5hbWUpOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVmlydHVhbE92ZXJyaWRlKFYgb3ZlcnJpZGUpIHsKLQkJdGhpcy5yZW1vdmVJdGVtRnJvbUxpc3Qob3ZlcnJpZGUsIHRoaXMudmlydHVhbE92ZXJyaWRlcywgVklSVFVBTF9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JLyoqCi0JICogdmlydHVhbCBvdmVycmlkZSBjb250YWluZXIgYWRhcHRlcgotCSAqIE5COiB0aGUgY29udGV4dCBvdmVycmlkZSBpcyBtYXRjaGVkIHdpdGggYSByZXNvdXJjZSBvdmVycmlkZSBieSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFZpcnR1YWxPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBDb250ZXh0Q29udGFpbmVyVG9vbHMuQWRhcHRlcjxWLCBTdHJpbmc+Ci0JewotCQlwdWJsaWMgSXRlcmFibGU8Vj4gZ2V0Q29udGV4dEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YU92ZXJyaWRlQ29udGFpbmVyLnRoaXMuZ2V0VmlydHVhbE92ZXJyaWRlcygpOwotCQl9Ci0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIudGhpcy5nZXRWaXJ0dWFsT3ZlcnJpZGVOYW1lcygpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VFbGVtZW50KFYgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgViBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEphdmFPdmVycmlkZUNvbnRhaW5lci50aGlzLm1vdmVWaXJ0dWFsT3ZlcnJpZGUoaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZENvbnRleHRFbGVtZW50KGludCBpbmRleCwgU3RyaW5nIHJlc291cmNlRWxlbWVudCkgewotCQkJQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXIudGhpcy5hZGRWaXJ0dWFsT3ZlcnJpZGUoaW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoViBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdEphdmFPdmVycmlkZUNvbnRhaW5lci50aGlzLnJlbW92ZVZpcnR1YWxPdmVycmlkZShlbGVtZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKYXZhT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIgZ2V0T3duZXIyXzAoKSB7Ci0JCXJldHVybiAoSmF2YU92ZXJyaWRlQ29udGFpbmVyMl8wLk93bmVyKSB0aGlzLm93bmVyOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlTWVtYmVyIGdldFJlc291cmNlTWVtYmVyKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRSZXNvdXJjZU1lbWJlcigpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpIHsKLQkJcmV0dXJuICh0aGlzLm93bmVyICE9IG51bGwpID8gdGhpcy5vd25lci5nZXRBbGxPdmVycmlkYWJsZU5hbWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5vd25lci50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5vd25lci5idWlsZE92ZXJyaWRlVmFsaWRhdG9yKG92ZXJyaWRlLCB0aGlzLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBSZWFkT25seUJhc2VDb2x1bW4uT3duZXIgY29sdW1uT3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuYnVpbGRDb2x1bW5WYWxpZGF0b3Iob3ZlcnJpZGUsIGNvbHVtbiwgY29sdW1uT3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBvc3NpYmxlUHJlZml4KCkgewotCQlyZXR1cm4gdGhpcy5nZXRPd25lcjJfMCgpLmdldFBvc3NpYmxlUHJlZml4KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXcml0ZVByZWZpeCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIyXzAoKS5nZXRXcml0ZVByZWZpeCgpOwotCX0KLQotCXByb3RlY3RlZCBSIHNlbGVjdE92ZXJyaWRlTmFtZWQoSXRlcmFibGU8Uj4gb3ZlcnJpZGVzLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RPdmVycmlkZU5hbWVkKG92ZXJyaWRlcywgbmFtZSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFIgc2VsZWN0T3ZlcnJpZGVOYW1lZChJdGVyYWJsZTxSPiBvdmVycmlkZXMsIFN0cmluZyBuYW1lLCBTIGV4Y2x1ZGUpIHsKLQkJZm9yIChSIG92ZXJyaWRlIDogb3ZlcnJpZGVzKSB7Ci0JCQlpZiAob3ZlcnJpZGUgPT0gZXhjbHVkZSkgewotCQkJCWNvbnRpbnVlOyAgLy8gc2tpcAotCQkJfQotCQkJaWYgKHRoaXMudmFsdWVzQXJlRXF1YWwob3ZlcnJpZGUuZ2V0TmFtZSgpLCBuYW1lKSkgewotCQkJCXJldHVybiBvdmVycmlkZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29kZSBjb21wbGV0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKFIgb3ZlcnJpZGUgOiB0aGlzLmdldE92ZXJyaWRlcygpKSB7Ci0JCQlyZXN1bHQgPSBvdmVycmlkZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWZvciAoUiBvdmVycmlkZTogdGhpcy5nZXRPdmVycmlkZXMoKSkgewotCQkJb3ZlcnJpZGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRWYWxpZGF0aW9uQW5ub3RhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLm93bmVyLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uQW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFZhbGlkYXRpb25Bbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbiBnZXRWYWxpZGF0aW9uQW5ub3RhdGlvbigpIHsKLQkJSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyID0gdGhpcy5nZXRSZXNvdXJjZU1lbWJlcigpOwotCQlyZXR1cm4gcmVzb3VyY2VNZW1iZXIuZ2V0QW5ub3RhdGlvbih0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phckZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXJGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTEzNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phckZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBDb250ZXh0IEpBUiBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmFyRmlsZQotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXJGaWxlLCBQZXJzaXN0ZW50VHlwZS5Pd25lcgotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdDsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0Q29sbGVjdGlvbkNvbnRhaW5lcjxKYXZhUGVyc2lzdGVudFR5cGUsIEphdmFSZXNvdXJjZVR5cGU+IGphdmFQZXJzaXN0ZW50VHlwZUNvbnRhaW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgR2VuZXJpY0phckZpbGUoSmFyRmlsZVJlZiBwYXJlbnQsIEphdmFSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QgamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290ID0gamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwotCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGVDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jSmF2YVBlcnNpc3RlbnRUeXBlcygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGVzKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290IGdldEphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJcmV0dXJuIHRoaXMuamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG5vdGhpbmcgeWV0Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYUNvbnRleHROb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBwZXJzaXN0ZW50IHR5cGVzICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCWZvciAoSmF2YVBlcnNpc3RlbnRUeXBlIHB0IDogdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGVzKCkpIHsKLQkJCWlmIChwdC5nZXROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgewotCQkJCXJldHVybiBwdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVBlcnNpc3RlbnRUeXBlPiBnZXRKYXZhUGVyc2lzdGVudFR5cGVzKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGVDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKYXZhUGVyc2lzdGVudFR5cGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jSmF2YVBlcnNpc3RlbnRUeXBlcygpIHsKLQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGVDb250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEphdmFQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VUeXBlIGpydCkgewotCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChnZXRKYXZhUGVyc2lzdGVudFR5cGVzU2l6ZSgpLCBqcnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUphdmFQZXJzaXN0ZW50VHlwZShKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlICkgewotCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZUNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChqYXZhUGVyc2lzdGVudFR5cGUpOwotCX0KLQotCS8vb25seSBhY2NlcHQgdHlwZXMsIGVudW1zIGFyZW4ndCB2YWxpZCBmb3IgSlBBCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZVR5cGU+IGdldEphdmFSZXNvdXJjZVR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUsIEphdmFSZXNvdXJjZVR5cGU+KAotCQkJbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4odGhpcy5nZXRKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGVzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIG8pIHsKLQkJCQkJcmV0dXJuIG8uZ2V0S2luZCgpID09IEtpbmQuVFlQRTsKLQkJCQl9Ci0JCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgcmVzb3VyY2UgSkFSIGhvbGRzIG9ubHkgYW5ub3RhdGVkIHR5cGVzLCBzbyB3ZSBjYW4gdXNlIHRoZW0gYWxsIGZvcgotCSAqIGJ1aWxkaW5nIHRoZSBjb250ZXh0IHR5cGVzCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZT4gZ2V0SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlcygpIHsKLQkJcmV0dXJuIHRoaXMuamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290LmdldFR5cGVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBidWlsZEphdmFQZXJzaXN0ZW50VHlwZShKYXZhUmVzb3VyY2VUeXBlIGpydCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUodGhpcywganJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dENvbGxlY3Rpb25Db250YWluZXI8SmF2YVBlcnNpc3RlbnRUeXBlLCBKYXZhUmVzb3VyY2VUeXBlPiBidWlsZEphdmFQZXJzaXN0ZW50VHlwZUNvbnRhaW5lcigpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBKYXZhUGVyc2lzdGVudFR5cGVDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBKYXZhIHBlcnNpc3RlbnQgdHlwZSBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSmF2YVBlcnNpc3RlbnRUeXBlQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dENvbGxlY3Rpb25Db250YWluZXI8SmF2YVBlcnNpc3RlbnRUeXBlLCBKYXZhUmVzb3VyY2VUeXBlPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEpBVkFfUEVSU0lTVEVOVF9UWVBFU19DT0xMRUNUSU9OOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkQ29udGV4dEVsZW1lbnQoSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljSmFyRmlsZS50aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhUmVzb3VyY2VUeXBlPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXJGaWxlLnRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZXMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldEphdmFSZXNvdXJjZVR5cGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8SmF2YVBlcnNpc3RlbnRUeXBlPiBnZXRQZXJzaXN0ZW50VHlwZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUGVyc2lzdGVudFR5cGUuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFBlcnNpc3RlbnRUeXBlQWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXREZWZhdWx0QWNjZXNzKCk7Ci0JfQotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0T3ZlcnJpZGVQZXJzaXN0ZW50VHlwZUFjY2VzcygpIHsKLQkJLy8gbm8gYWNjZXNzIHR5cGUgYXQgdGhpcyBsZXZlbCBvdmVycmlkZXMgYW55IGxvY2FsIGFjY2VzcyB0eXBlIHNwZWNpZmljYXRpb24KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphckZpbGVSZWYgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphckZpbGVSZWYpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXJGaWxlUmVmIGdldEphckZpbGVSZWYoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmphclJlc291cmNlUGFja2FnZUZyYWdtZW50Um9vdC5nZXRGaWxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyBUT0RPIHZhbGlkYXRlICdqYXZhUGVyc2lzdGVudFR5cGVzJwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW4ob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlciBmb2xkZXIpIHsKLQkJSVJlc291cmNlIG1lbWJlciA9IGZvbGRlci5maW5kTWVtYmVyKHRoaXMuamFyUmVzb3VyY2VQYWNrYWdlRnJhZ21lbnRSb290LmdldEZpbGUoKS5nZXROYW1lKCkpOwotCQlJRmlsZSBmaWxlID0gdGhpcy5qYXJSZXNvdXJjZVBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0RmlsZSgpOwotCQlyZXR1cm4gbWVtYmVyICE9IG51bGwgJiYgZmlsZSAhPSBudWxsICYmIG1lbWJlci5lcXVhbHMoZmlsZSk7CQkKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphckZpbGVSZWYoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmODBkZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBTcGVjaWZpZWQgSmF2YSBhc3NvY2lhdGlvbiBvdmVycmlkZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFPdmVycmlkZTxKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMAotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRpb24pOwotCQl0aGlzLnJlbGF0aW9uc2hpcCA9IHRoaXMuYnVpbGRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucmVsYXRpb25zaGlwLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQvdmlydHVhbCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnZlcnRUb1ZpcnR1YWwoKSB7Ci0JCXJldHVybiAoSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKSBzdXBlci5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMucmVsYXRpb25zaGlwOwotCX0KLQotCXByb3RlY3RlZCBKYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAgYnVpbGRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFPdmVycmlkZVJlbGF0aW9uc2hpcCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAgZ2V0Q29udGFpbmVyMl8wKCkgewotCQlyZXR1cm4gKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wKSBzdXBlci5nZXRDb250YWluZXIyXzAoKTsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKHRoaXMubmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG9sZE92ZXJyaWRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZE92ZXJyaWRlKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb20ob2xkT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tVmlydHVhbCh2aXJ0dWFsT3ZlcnJpZGUpOwotCQl0aGlzLnJlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbVZpcnR1YWwodmlydHVhbE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmVzdWx0ID0gdGhpcy5yZWxhdGlvbnNoaXAuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnJlbGF0aW9uc2hpcC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyMl8wKCkuYnVpbGRKb2luVGFibGVWYWxpZGF0b3IodGhpcywgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcywgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKHRoaXMsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVmYzU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhT3ZlcnJpZGVDb250YWluZXI8Ci0JCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciwKLQkJCUphdmFSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUsCi0JCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSwKLQkJCUphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSwKLQkJCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uCi0JCT4KLQlpbXBsZW1lbnRzIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKGF0dHJpYnV0ZU5hbWUsIHRoaXMub3duZXIuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoU3RyaW5nIGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKGFzc29jaWF0aW9uT3ZlcnJpZGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRPdmVycmlkZVJlbGF0aW9uc2hpcChTdHJpbmcgb3ZlcnJpZGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRlTmFtZWQob3ZlcnJpZGVOYW1lKS5nZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIgZ2V0T3duZXIyXzAoKSB7Ci0JCXJldHVybiAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIpIHN1cGVyLmdldE93bmVyMl8wKCk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgbywgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyMl8wKCkuYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKG92ZXJyaWRlLCBjb2x1bW4sIG8sIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgbywgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyMl8wKCkuYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihvdmVycmlkZSwgY29sdW1uLCBvLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZVZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIyXzAoKS5idWlsZEpvaW5UYWJsZVZhbGlkYXRvcihvdmVycmlkZSwgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE92ZXJyaWRlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkU3BlY2lmaWVkT3ZlcnJpZGUoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gb3ZlcnJpZGVBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIG92ZXJyaWRlQW5ub3RhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZE92ZXJyaWRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZE92ZXJyaWRlLCBKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlKSB7Ci0JCXNwZWNpZmllZE92ZXJyaWRlLmluaXRpYWxpemVGcm9tVmlydHVhbCh2aXJ0dWFsT3ZlcnJpZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKHRoaXMsIG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3ZmJhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db21wbGV0ZUNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBTcGVjaWZpZWQgSmF2YSBhdHRyaWJ1dGUgb3ZlcnJpZGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YU92ZXJyaWRlPEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLCBKYXZhQ29sdW1uLk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gY29sdW1uOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZShKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgcGFyZW50LCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRpb24pOwotCQl0aGlzLmNvbHVtbiA9IHRoaXMuYnVpbGRDb2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQvdmlydHVhbCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBjb252ZXJ0VG9WaXJ0dWFsKCkgewotCQlyZXR1cm4gKEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIHN1cGVyLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhQ29sdW1uIGdldENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29sdW1uIGJ1aWxkQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQ29sdW1uKHRoaXMsIHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgb2xkT3ZlcnJpZGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkT3ZlcnJpZGUpOwotCQl0aGlzLmNvbHVtbi5pbml0aWFsaXplRnJvbShvbGRPdmVycmlkZS5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgb2xkT3ZlcnJpZGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKG9sZE92ZXJyaWRlKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKG9sZE92ZXJyaWRlLmdldENvbHVtbigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIG93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKHRoaXMsIChSZWFkT25seUJhc2VDb2x1bW4pIGNvbCwgdGhpcywgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbigpLmdldE5vbk51bGxDb2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbigpLnJlbW92ZUNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXJpdmVkICoqKioqKioqKioKLQotCXByb3RlY3RlZCAgYm9vbGVhbiBhdHRyaWJ1dGVJc0Rlcml2ZWRJZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5hdHRyaWJ1dGVJc0Rlcml2ZWRJZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0KLQkJaWYgKHRoaXMuYXR0cmlidXRlSXNEZXJpdmVkSWQoKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQVRUUklCVVRFX09WRVJSSURFX0RFUklWRURfQU5EX1NQRUNJRklFRCwKLQkJCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJKQotCQkJCSk7Ci0KLQkJCS8vIHZhbGlkYXRlIHRoZSBjb2x1bW4gaWYgaXQgaXMgc3BlY2lmaWVkCi0JCQlpZiAodGhpcy5jb2x1bW5Bbm5vdGF0aW9uSXNTcGVjaWZpZWQoKSkgewotCQkJCXRoaXMuY29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sdW1uQW5ub3RhdGlvbklzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZUFubm90YXRpb24oKS5nZXRDb2x1bW4oKSAhPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyZDcwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFPdmVycmlkZUNvbnRhaW5lcjwKLQkJCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciwKLQkJCUphdmFSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlLAotCQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlLAotCQkJSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSwKLQkJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbgotCQk+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIyXzAKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0KLQlwdWJsaWMgUmVhZE9ubHlDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIChhdHRyaWJ1dGVOYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMub3duZXIucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5Q29sdW1uIGdldE92ZXJyaWRlQ29sdW1uKFN0cmluZyBvdmVycmlkZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGVOYW1lZChvdmVycmlkZU5hbWUpLmdldENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZSBidWlsZFNwZWNpZmllZE92ZXJyaWRlKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBvdmVycmlkZUFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlKHRoaXMsIG92ZXJyaWRlQW5ub3RhdGlvbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZE92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSwgSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUpIHsKLQkJc3BlY2lmaWVkT3ZlcnJpZGUuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxPdmVycmlkZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSh0aGlzLCBuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4OGFlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFCYXNpY01hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZwotewotCXB1YmxpYyBHZW5lcmljSmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNhc2NhZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FzY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDRhZWE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FzY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ2FzY2FkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFDYXNjYWRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUNhc2NhZGUyXzAKLXsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBhbGw7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwZXJzaXN0OwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWVyZ2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWZyZXNoOwotCi0JLyogSlBBIDIuMCAqLwotCXByb3RlY3RlZCBib29sZWFuIGRldGFjaDsKLQotCi0JLyoqCi0JICogVGhpcyBpcyBidWlsdCBkaXJlY3RseSBieSB0aGUgbWFwcGluZyBpbXBsZW1lbnRhdGlvbjsgYXMgb3Bwb3NlZCB0byB2aWEKLQkgKiBhIHBsYXRmb3JtLXNwZWNpZmljIGZhY3RvcnkuCi0JICogQHNlZSBBYnN0cmFjdEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nI2J1aWxkQ2FzY2FkZSgpCi0JICovCi0JcHVibGljIEdlbmVyaWNKYXZhQ2FzY2FkZShKYXZhUmVsYXRpb25zaGlwTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5hbGwgPSB0aGlzLmJ1aWxkQWxsKCk7Ci0JCXRoaXMucGVyc2lzdCA9IHRoaXMuYnVpbGRQZXJzaXN0KCk7Ci0JCXRoaXMubWVyZ2UgPSB0aGlzLmJ1aWxkTWVyZ2UoKTsKLQkJdGhpcy5yZW1vdmUgPSB0aGlzLmJ1aWxkUmVtb3ZlKCk7Ci0JCXRoaXMucmVmcmVzaCA9IHRoaXMuYnVpbGRSZWZyZXNoKCk7Ci0JCXRoaXMuZGV0YWNoID0gdGhpcy5idWlsZERldGFjaCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldEFsbF8odGhpcy5idWlsZEFsbCgpKTsKLQkJdGhpcy5zZXRQZXJzaXN0Xyh0aGlzLmJ1aWxkUGVyc2lzdCgpKTsKLQkJdGhpcy5zZXRNZXJnZV8odGhpcy5idWlsZE1lcmdlKCkpOwotCQl0aGlzLnNldFJlbW92ZV8odGhpcy5idWlsZFJlbW92ZSgpKTsKLQkJdGhpcy5zZXRSZWZyZXNoXyh0aGlzLmJ1aWxkUmVmcmVzaCgpKTsKLQkJdGhpcy5zZXREZXRhY2hfKHRoaXMuYnVpbGREZXRhY2goKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFsbCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0FsbCgpIHsKLQkJcmV0dXJuIHRoaXMuYWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFsbChib29sZWFuIGFsbCkgewotCQlpZiAoYWxsICE9IHRoaXMuYWxsKSB7Ci0JCQl0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCkuc2V0Q2FzY2FkZUFsbChhbGwpOwotCQkJdGhpcy5zZXRBbGxfKGFsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRBbGxfKGJvb2xlYW4gYWxsKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5hbGw7Ci0JCXRoaXMuYWxsID0gYWxsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQUxMX1BST1BFUlRZLCBvbGQsIGFsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRBbGwoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSAmJiBhbm5vdGF0aW9uLmlzQ2FzY2FkZUFsbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQZXJzaXN0KGJvb2xlYW4gcGVyc2lzdCkgewotCQlpZiAocGVyc2lzdCAhPSB0aGlzLnBlcnNpc3QpIHsKLQkJCXRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb25Gb3JVcGRhdGUoKS5zZXRDYXNjYWRlUGVyc2lzdChwZXJzaXN0KTsKLQkJCXRoaXMuc2V0UGVyc2lzdF8ocGVyc2lzdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQZXJzaXN0Xyhib29sZWFuIHBlcnNpc3QpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnBlcnNpc3Q7Ci0JCXRoaXMucGVyc2lzdCA9IHBlcnNpc3Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNUX1BST1BFUlRZLCBvbGQsIHBlcnNpc3QpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUGVyc2lzdCgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpICYmIGFubm90YXRpb24uaXNDYXNjYWRlUGVyc2lzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXJnZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc01lcmdlKCkgewotCQlyZXR1cm4gdGhpcy5tZXJnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXJnZShib29sZWFuIG1lcmdlKSB7Ci0JCWlmIChtZXJnZSAhPSB0aGlzLm1lcmdlKSB7Ci0JCQl0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCkuc2V0Q2FzY2FkZU1lcmdlKG1lcmdlKTsKLQkJCXRoaXMuc2V0TWVyZ2VfKG1lcmdlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1lcmdlXyhib29sZWFuIG1lcmdlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5tZXJnZTsKLQkJdGhpcy5tZXJnZSA9IG1lcmdlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUVSR0VfUFJPUEVSVFksIG9sZCwgbWVyZ2UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkTWVyZ2UoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSAmJiBhbm5vdGF0aW9uLmlzQ2FzY2FkZU1lcmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbW92ZShib29sZWFuIHJlbW92ZSkgewotCQlpZiAocmVtb3ZlICE9IHRoaXMucmVtb3ZlKSB7Ci0JCQl0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCkuc2V0Q2FzY2FkZVJlbW92ZShyZW1vdmUpOwotCQkJdGhpcy5zZXRSZW1vdmVfKHJlbW92ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZW1vdmVfKGJvb2xlYW4gcmVtb3ZlKSB7Ci0JCWJvb2xlYW4gb2xkUmVtb3ZlID0gdGhpcy5yZW1vdmU7Ci0JCXRoaXMucmVtb3ZlID0gcmVtb3ZlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVNT1ZFX1BST1BFUlRZLCBvbGRSZW1vdmUsIHJlbW92ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRSZW1vdmUoKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsKSAmJiBhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlbW92ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZyZXNoICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMucmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZyZXNoKGJvb2xlYW4gcmVmcmVzaCkgewotCQlpZiAocmVmcmVzaCAhPSB0aGlzLnJlZnJlc2gpIHsKLQkJCXRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb25Gb3JVcGRhdGUoKS5zZXRDYXNjYWRlUmVmcmVzaChyZWZyZXNoKTsKLQkJCXRoaXMuc2V0UmVmcmVzaF8ocmVmcmVzaCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZWZyZXNoXyhib29sZWFuIHJlZnJlc2gpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnJlZnJlc2g7Ci0JCXRoaXMucmVmcmVzaCA9IHJlZnJlc2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZSRVNIX1BST1BFUlRZLCBvbGQsIHJlZnJlc2gpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUmVmcmVzaCgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpICYmIGFubm90YXRpb24uaXNDYXNjYWRlUmVmcmVzaCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXRhY2ggKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEZXRhY2goKSB7Ci0JCXJldHVybiB0aGlzLmRldGFjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXRhY2goYm9vbGVhbiBkZXRhY2gpIHsKLQkJaWYgKGRldGFjaCAhPSB0aGlzLmRldGFjaCkgewotCQkJdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbkZvclVwZGF0ZTJfMCgpLnNldENhc2NhZGVEZXRhY2goZGV0YWNoKTsKLQkJCXRoaXMuc2V0RGV0YWNoXyhkZXRhY2gpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGV0YWNoXyhib29sZWFuIGRldGFjaCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGV0YWNoOwotCQl0aGlzLmRldGFjaCA9IGRldGFjaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFVEFDSF9QUk9QRVJUWSwgb2xkLCBkZXRhY2gpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGV0YWNoKCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSAmJiB0aGlzLmJ1aWxkRGV0YWNoXygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGV0YWNoXygpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24yXzAoKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpICYmIGFubm90YXRpb24uaXNDYXNjYWRlRGV0YWNoKCk7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb25Gb3JVcGRhdGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRBbm5vdGF0aW9uRm9yVXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uMl8wKCkgewotCQlyZXR1cm4gKFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uKSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlMl8wKCkgewotCQlyZXR1cm4gKFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uKSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldEFubm90YXRpb25DYXNjYWRlVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0TWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uQ2FzY2FkZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRDYXNjYWRlVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWYxMWNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgY29sdW1uCi0gKiA8cD4KLSAqIE5vdGU6IFRoZSA8Y29kZT5Db2x1bW48L2NvZGU+IGFubm90YXRpb24gaXMgb25lIG9mIG9ubHkgMiBhbm5vdGF0aW9ucyB0aGF0Ci0gKiBjYW4gYmUgbmVzdGVkIG91dHNpZGUgb2YgYW4gYXJyYXkgKGkuZS4gaW4gYW4gPGNvZGU+QXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+Ci0gKiBhbm5vdGF0aW9uKTsgdGhlIG90aGVyIGlzIHtAbGluayBHZW5lcmljSmF2YUpvaW5UYWJsZSBKb2luVGFibGV9LgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFDb2x1bW4KLQlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2VDb2x1bW48Q29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uLCBKYXZhQ29sdW1uLk93bmVyPgotCWltcGxlbWVudHMgSmF2YUNvbHVtbgotewotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZExlbmd0aDsKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRMZW5ndGg7Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRQcmVjaXNpb247Ci0JcHJvdGVjdGVkIGludCBkZWZhdWx0UHJlY2lzaW9uOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2NhbGU7Ci0JcHJvdGVjdGVkIGludCBkZWZhdWx0U2NhbGU7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YUNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkU2NhbGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMuYnVpbGRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyh0aGlzLmJ1aWxkU3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjYWxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0TGVuZ3RoKHRoaXMuYnVpbGREZWZhdWx0TGVuZ3RoKCkpOwotCQl0aGlzLnNldERlZmF1bHRQcmVjaXNpb24odGhpcy5idWlsZERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjYWxlKHRoaXMuYnVpbGREZWZhdWx0U2NhbGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb21wbGV0ZUNvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0Q29sdW1uQW5ub3RhdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXRoaXMub3duZXIucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsZW5ndGggKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZExlbmd0aC5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRMZW5ndGgsIGxlbmd0aCkpIHsKLQkJCXRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLnNldExlbmd0aChsZW5ndGgpOwotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGhfKEludGVnZXIgbGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JCXRoaXMuc3BlY2lmaWVkTGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkU3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRMZW5ndGgoaW50IGxlbmd0aCkgewotCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCQl0aGlzLmRlZmF1bHRMZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gREVGQVVMVF9MRU5HVEg7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByZWNpc2lvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFByZWNpc2lvbiAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRQcmVjaXNpb247Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIgcHJlY2lzaW9uKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFByZWNpc2lvbiwgcHJlY2lzaW9uKSkgewotCQkJdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuc2V0UHJlY2lzaW9uKHByZWNpc2lvbik7Ci0JCQl0aGlzLnJlbW92ZUNvbHVtbkFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFByZWNpc2lvbl8ocHJlY2lzaW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbl8oSW50ZWdlciBwcmVjaXNpb24pIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZFByZWNpc2lvbjsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSBwcmVjaXNpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGQsIHByZWNpc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgYnVpbGRTcGVjaWZpZWRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRQcmVjaXNpb24oKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRQcmVjaXNpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByZWNpc2lvbihpbnQgcHJlY2lzaW9uKSB7Ci0JCWludCBvbGQgPSB0aGlzLmRlZmF1bHRQcmVjaXNpb247Ci0JCXRoaXMuZGVmYXVsdFByZWNpc2lvbiA9IHByZWNpc2lvbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGQsIHByZWNpc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBidWlsZERlZmF1bHRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiBERUZBVUxUX1BSRUNJU0lPTjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2NhbGUgKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjYWxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTY2FsZS5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0U2NhbGU7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkU2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjYWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkU2NhbGUsIHNjYWxlKSkgewotCQkJdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuc2V0U2NhbGUoc2NhbGUpOwotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRTY2FsZV8oc2NhbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGVfKEludGVnZXIgc2NhbGUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZFNjYWxlOwotCQl0aGlzLnNwZWNpZmllZFNjYWxlID0gc2NhbGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfU0NBTEVfUFJPUEVSVFksIG9sZCwgc2NhbGUpOwotCX0KLQotCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkU3BlY2lmaWVkU2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRTY2FsZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFNjYWxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0U2NhbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjYWxlKGludCBzY2FsZSkgewotCQlpbnQgb2xkID0gdGhpcy5kZWZhdWx0U2NhbGU7Ci0JCXRoaXMuZGVmYXVsdFNjYWxlID0gc2NhbGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NDQUxFX1BST1BFUlRZLCBvbGQsIHNjYWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGJ1aWxkRGVmYXVsdFNjYWxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0FMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUNvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGgob2xkQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQcmVjaXNpb24ob2xkQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2FsZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5Q29sdW1uIHZpcnR1YWxDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxDb2x1bW4pOwotCQkvLyBpZ25vcmUgb3RoZXIgc2V0dGluZ3M/Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyM2JhNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YURpc2NyaW1pbmF0b3JDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgZGlzY3JpbWluYXRvciBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRGlzY3JpbWluYXRvckNvbHVtbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uPERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLCBKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lcj4KLQlpbXBsZW1lbnRzIEphdmFEaXNjcmltaW5hdG9yQ29sdW1uCi17Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFEaXNjcmltaW5hdG9yQ29sdW1uKEphdmFFbnRpdHkgcGFyZW50LCBKYXZhRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIGFubm90YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRW50aXR5IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eSgpLmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvdXJjZVNwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmlzU3BlY2lmaWVkKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzViY2M4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVtYmVkZGFibGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVtYmVkZGFibGUKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFFbWJlZGRhYmxlKEphdmFQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEVtYmVkZGFibGVBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQkvL2dlbmVyaWMgb25seSBhbGxvd3MgYmFzaWMgYW5kIHRyYW5zaWVudCB3aXRoaW4gYW4gRW1iZWRkYWJsZQotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyhBTExPV0VEX0FUVFJJQlVURV9NQVBQSU5HX0tFWVMsIGF0dHJpYnV0ZU1hcHBpbmdLZXkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQUxMT1dFRF9BVFRSSUJVVEVfTUFQUElOR19LRVlTID0KLQkJbmV3IFN0cmluZ1tdIHsKLQkJCU1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwKLQkJCU1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkKLQkJfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZmZjVlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotCi0vKioKLSAqIEphdmEgZW1iZWRkZWQgSUQgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhRW1iZWRkZWRJZE1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzJkMmRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVtYmVkZGVkTWFwcGluZzsKLQotLyoqCi0gKiBKYXZhIGVtYmVkZGVkIG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbWJlZGRlZE1hcHBpbmcKLXsKLQotCXB1YmxpYyBHZW5lcmljSmF2YUVtYmVkZGVkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyMzM2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5OdWxsSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbnRpdHkKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVudGl0eQotewotCS8vIEVjbGlwc2VMaW5rIGhvbGRzIGl0cyBjYWNoZWFibGUgaW4gaXRzIGNhY2hpbmcKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUNhY2hlYWJsZTJfMCBjYWNoZWFibGU7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbnRpdHlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCQl0aGlzLmNhY2hlYWJsZSA9IHRoaXMuYnVpbGRDYWNoZWFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5jYWNoZWFibGUuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY2FjaGVhYmxlLnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoZWFibGUgKioqKioqKioqKgotCi0JcHVibGljIEphdmFDYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDYWNoZWFibGUyXzAgYnVpbGRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldEpwYUZhY3RvcnkyXzAoKS5idWlsZEphdmFDYWNoZWFibGUodGhpcykgOgotCQkJCW5ldyBOdWxsSmF2YUNhY2hlYWJsZTJfMCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCkgewotCQlDYWNoZWFibGUyXzAgcGFyZW50Q2FjaGVhYmxlID0gdGhpcy5nZXRQYXJlbnRDYWNoZWFibGUoKTsKLQkJcmV0dXJuIChwYXJlbnRDYWNoZWFibGUgIT0gbnVsbCkgPwotCQkJCXBhcmVudENhY2hlYWJsZS5pc0NhY2hlYWJsZSgpIDoKLQkJCQkoKFBlcnNpc3RlbmNlVW5pdDJfMCkgdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKSkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBDYWNoZWFibGUyXzAgZ2V0UGFyZW50Q2FjaGVhYmxlKCkgewotCQlDYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50RW50aXR5ID0gKENhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5nZXRQYXJlbnRFbnRpdHkoKTsKLQkJcmV0dXJuIChwYXJlbnRFbnRpdHkgPT0gbnVsbCkgPyBudWxsIDogcGFyZW50RW50aXR5LmdldENhY2hlYWJsZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW51bWVyYXRlZENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtZXJhdGVkQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTA4NDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnVtZXJhdGVkQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bWVyYXRlZEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnZlcnRlcgotCWltcGxlbWVudHMgSmF2YUVudW1lcmF0ZWRDb252ZXJ0ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZEFubm90YXRpb247Ci0KLQlwcm90ZWN0ZWQgRW51bVR5cGUgc3BlY2lmaWVkRW51bVR5cGU7Ci0JcHJvdGVjdGVkIEVudW1UeXBlIGRlZmF1bHRFbnVtVHlwZTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhRW51bWVyYXRlZENvbnZlcnRlcihKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGVudW1lcmF0ZWRBbm5vdGF0aW9uLCBKYXZhQ29udmVydGVyLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLmVudW1lcmF0ZWRBbm5vdGF0aW9uID0gZW51bWVyYXRlZEFubm90YXRpb247Ci0JCXRoaXMuc3BlY2lmaWVkRW51bVR5cGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRW51bVR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRFbnVtVHlwZV8odGhpcy5idWlsZFNwZWNpZmllZEVudW1UeXBlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdEVudW1UeXBlKHRoaXMuYnVpbGREZWZhdWx0RW51bVR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVudW0gdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bVR5cGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRFbnVtVHlwZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkRW51bVR5cGUgOiB0aGlzLmRlZmF1bHRFbnVtVHlwZTsKLQl9Ci0KLQlwdWJsaWMgRW51bVR5cGUgZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEVudW1UeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlIGVudW1UeXBlKSB7Ci0JCXRoaXMuZW51bWVyYXRlZEFubm90YXRpb24uc2V0VmFsdWUoRW51bVR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChlbnVtVHlwZSkpOwotCQl0aGlzLnNldFNwZWNpZmllZEVudW1UeXBlXyhlbnVtVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRW51bVR5cGVfKEVudW1UeXBlIGVudW1UeXBlKSB7Ci0JCUVudW1UeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkRW51bVR5cGU7Ci0JCXRoaXMuc3BlY2lmaWVkRW51bVR5cGUgPSBlbnVtVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9FTlVNX1RZUEVfUFJPUEVSVFksIG9sZCwgZW51bVR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBFbnVtVHlwZSBidWlsZFNwZWNpZmllZEVudW1UeXBlKCkgewotCQlyZXR1cm4gRW51bVR5cGUuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHRoaXMuZW51bWVyYXRlZEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIEVudW1UeXBlIGdldERlZmF1bHRFbnVtVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEVudW1UeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRFbnVtVHlwZShFbnVtVHlwZSBlbnVtVHlwZSkgewotCQlFbnVtVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRFbnVtVHlwZTsKLQkJdGhpcy5kZWZhdWx0RW51bVR5cGUgPSBlbnVtVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRU5VTV9UWVBFX1BST1BFUlRZLCBvbGQsIGVudW1UeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW51bVR5cGUgYnVpbGREZWZhdWx0RW51bVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0VOVU1fVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3M7Ci0JfQotCi0JcHVibGljIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGdldENvbnZlcnRlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVudW1lcmF0ZWRBbm5vdGF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhR2VuZXJhdGVkVmFsdWUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhR2VuZXJhdGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU5MWQ3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgZ2VuZXJhdGVkIHZhbHVlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUdlbmVyYXRlZFZhbHVlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUdlbmVyYXRlZFZhbHVlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgc3BlY2lmaWVkU3RyYXRlZ3k7Ci0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIGRlZmF1bHRTdHJhdGVneTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkR2VuZXJhdG9yOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdEdlbmVyYXRvcjsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhR2VuZXJhdGVkVmFsdWUoSmF2YUlkTWFwcGluZyBwYXJlbnQsIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gPSBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci0JCXRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkU3RyYXRlZ3koKTsKLQkJdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3IgPSBnZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uZ2V0R2VuZXJhdG9yKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKHRoaXMuYnVpbGRTcGVjaWZpZWRTdHJhdGVneSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRHZW5lcmF0b3JfKHRoaXMuZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmdldEdlbmVyYXRvcigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRTdHJhdGVneSh0aGlzLmJ1aWxkRGVmYXVsdFN0cmF0ZWd5KCkpOwotCQl0aGlzLnNldERlZmF1bHRHZW5lcmF0b3IodGhpcy5idWlsZERlZmF1bHRHZW5lcmF0b3IoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXRTdHJhdGVneSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTdHJhdGVneSA6IHRoaXMuZGVmYXVsdFN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXRTcGVjaWZpZWRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3kpIHsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChzdHJhdGVneSkpOwotCQl0aGlzLnNldFNwZWNpZmllZFN0cmF0ZWd5XyhzdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KSB7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3k7Ci0JCXRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIGJ1aWxkU3BlY2lmaWVkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBHZW5lcmF0aW9uVHlwZS5mcm9tSmF2YVJlc291cmNlTW9kZWwodGhpcy5nZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uZ2V0U3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldERlZmF1bHRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFN0cmF0ZWd5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgewotCQlHZW5lcmF0aW9uVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRTdHJhdGVneTsKLQkJdGhpcy5kZWZhdWx0U3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOwotCX0KLQotCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBidWlsZERlZmF1bHRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfU1RSQVRFR1k7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdlbmVyYXRvciAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEdlbmVyYXRvciAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yIDogdGhpcy5kZWZhdWx0R2VuZXJhdG9yOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkR2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKLQkJdGhpcy5nZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uc2V0R2VuZXJhdG9yKGdlbmVyYXRvcik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkR2VuZXJhdG9yXyhnZW5lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEdlbmVyYXRvcl8oU3RyaW5nIGdlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3I7Ci0JCXRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkLCBnZW5lcmF0b3IpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdEdlbmVyYXRvcjsKLQkJdGhpcy5kZWZhdWx0R2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZCwgZ2VuZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFJZE1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFJZE1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhSWRNYXBwaW5nIGdldElkTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZXRHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMuZ2VuZXJhdG9yVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlR2VuZXJhdG9yTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZW5lcmF0b3JUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5nZW5lcmF0b3JUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNhbmRpZGF0ZUdlbmVyYXRvck5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuZ2V0Q2FuZGlkYXRlR2VuZXJhdG9yTmFtZXMoZmlsdGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlR2VuZXJhdG9yTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldENhbmRpZGF0ZUdlbmVyYXRvck5hbWVzKCksIGZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlR2VuZXJhdG9yTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFVuaXF1ZUdlbmVyYXRvck5hbWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQotCQlTdHJpbmcgZ2VuZXJhdG9yID0gdGhpcy5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEdlbmVyYXRvciBuZXh0IDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzKCkpIHsKLQkJCWlmIChnZW5lcmF0b3IuZXF1YWxzKG5leHQuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCW1lc3NhZ2VzLmFkZCgKLQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSwKLQkJCQluZXcgU3RyaW5nW10ge2dlbmVyYXRvcn0sCi0JCQkJdGhpcy5nZXRJZE1hcHBpbmcoKSwKLQkJCQl0aGlzLmdldEdlbmVyYXRvclRleHRSYW5nZShhc3RSb290KQotCQkJKQotCQkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0SWRNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuZ2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmdldEdlbmVyYXRvclRleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFHZW5lcmF0b3JDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMGZhMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFHZW5lcmF0b3JDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTm90TnVsbEZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhR2VuZXJhdG9yQ29udGFpbmVyCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUdlbmVyYXRvckNvbnRhaW5lcgotewotCXByb3RlY3RlZCBmaW5hbCBPd25lciBvd25lcjsKLQotCXByb3RlY3RlZCBKYXZhU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0KLQlwcm90ZWN0ZWQgSmF2YVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFHZW5lcmF0b3JDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSB0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3IoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJdGhpcy5zeW5jVGFibGVHZW5lcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlpZiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLnVwZGF0ZSgpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlR2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCXRoaXMudGFibGVHZW5lcmF0b3IudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VxdWVuY2UgZ2VuZXJhdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCXB1YmxpYyBKYXZhU2VxdWVuY2VHZW5lcmF0b3IgYWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlIGdlbmVyYXRvciBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKCk7Ci0JCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBnZW5lcmF0b3IgPSB0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoYW5ub3RhdGlvbik7Ci0JCXRoaXMuc2V0U2VxdWVuY2VHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgdGhpcy5vd25lci5nZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5hZGRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZSBnZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMub3duZXIuZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkucmVtb3ZlQW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcihhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGdldFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHRoaXMub3duZXIuZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5pc1ZpcnR1YWwoKSA/IG51bGwgOiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFTZXF1ZW5jZUdlbmVyYXRvcih0aGlzLCBzZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKSAmJiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvci5nZXRHZW5lcmF0b3JBbm5vdGF0aW9uKCkgPT0gYW5ub3RhdGlvbikpIHsKLQkJCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRTZXF1ZW5jZUdlbmVyYXRvcih0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoYW5ub3RhdGlvbikpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoSmF2YVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCUphdmFTZXF1ZW5jZUdlbmVyYXRvciBvbGQgPSB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZCwgc2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YWJsZSBnZW5lcmF0b3IgKioqKioqKioqKgotCi0JcHVibGljIEphdmFUYWJsZUdlbmVyYXRvciBnZXRUYWJsZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JfQotCi0JcHVibGljIEphdmFUYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKHRoaXMudGFibGVHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGUgZ2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzOiAiICsgdGhpcy50YWJsZUdlbmVyYXRvcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckFubm90YXRpb24oKTsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIGdlbmVyYXRvciA9IHRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvcihhbm5vdGF0aW9uKTsKLQkJdGhpcy5zZXRUYWJsZUdlbmVyYXRvcihnZW5lcmF0b3IpOwotCQlyZXR1cm4gZ2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gYnVpbGRUYWJsZUdlbmVyYXRvckFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSB0aGlzLm93bmVyLmdldFJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLmFkZEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB7Ci0JCWlmICh0aGlzLnRhYmxlR2VuZXJhdG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInRhYmxlIGdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5vd25lci5nZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5yZW1vdmVBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLnNldFRhYmxlR2VuZXJhdG9yKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcigpIHsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZFRhYmxlR2VuZXJhdG9yKGFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZ2V0VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgdGhpcy5vd25lci5nZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcihUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmlzVmlydHVhbCgpID8gbnVsbCA6IHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YVRhYmxlR2VuZXJhdG9yKHRoaXMsIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1RhYmxlR2VuZXJhdG9yKCkgewotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKCk7Ci0JCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCWlmICh0aGlzLnRhYmxlR2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldFRhYmxlR2VuZXJhdG9yKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCh0aGlzLnRhYmxlR2VuZXJhdG9yICE9IG51bGwpICYmICh0aGlzLnRhYmxlR2VuZXJhdG9yLmdldEdlbmVyYXRvckFubm90YXRpb24oKSA9PSBhbm5vdGF0aW9uKSkgewotCQkJCXRoaXMudGFibGVHZW5lcmF0b3Iuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldFRhYmxlR2VuZXJhdG9yKHRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvcihhbm5vdGF0aW9uKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihKYXZhVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IpIHsKLQkJSmF2YVRhYmxlR2VuZXJhdG9yIG9sZCA9IHRoaXMudGFibGVHZW5lcmF0b3I7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkLCB0YWJsZUdlbmVyYXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvZGUgY29tcGxldGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdGhpcy50YWJsZUdlbmVyYXRvci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgZ2VuZXJhdG9ycyBhcmUgdmFsaWRhdGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQjdmFsaWRhdGVHZW5lcmF0b3JzKExpc3QsIElSZXBvcnRlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkvLyBnZW5lcmF0b3JzIGFyZSB2YWxpZGF0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0UmVzb3VyY2VUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0UmVzb3VyY2VUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkuZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFKcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPEdlbmVyYXRvcj4gZ2V0R2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxHZW5lcmF0b3I+KHRoaXMuZ2V0R2VuZXJhdG9yc18oKSwgTm90TnVsbEZpbHRlci48R2VuZXJhdG9yPmluc3RhbmNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnNfKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8R2VuZXJhdG9yPih0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLCB0aGlzLnRhYmxlR2VuZXJhdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29udGFpbmVyIGlzIDxlbT52aXJ0dWFsPC9lbT4gYW5kLCBhcyBhIHJlc3VsdCwgZG9lcwotCSAqIG5vdCBoYXZlIGVpdGhlciBhIHNlcXVlbmNlIG9yIHRhYmxlIGdlbmVyYXRvci4gQXMgb2YgSlBBIDIuMCwgdGhpcyBpcwotCSAqIG9ubHkgdHJ1ZSB3aGVuIHRoZSBjb250YWluZXIncyBwYXJlbnQgaXMgYSB2aXJ0dWFsIElEIG1hcHBpbmcuCi0JICovCi0JLy8gVE9ETyBianYgbmVlZCB0byBhZGQgQVBJIHRvIEphdmFHZW5lcmF0b3JDb250YWluZXIuT3duZXIKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCUphdmFKcGFDb250ZXh0Tm9kZSBwID0gdGhpcy5nZXRQYXJlbnQoKTsKLQkJaWYgKHAgaW5zdGFuY2VvZiBKYXZhSWRNYXBwaW5nKSB7Ci0JCQlKYXZhSWRNYXBwaW5nIGlkTWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKSBwOwotCQkJcmV0dXJuIGlkTWFwcGluZy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjFhY2E3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFJZE1hcHBpbmc7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFJZE1hcHBpbmcKLXsJCi0JcHVibGljIEdlbmVyaWNKYXZhSWRNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NzlkMmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29tcGxldGVKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIEphdmEgam9pbiBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhSm9pbkNvbHVtbgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhQmFzZUNvbHVtbjxDb21wbGV0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyPgotCWltcGxlbWVudHMgSmF2YUpvaW5Db2x1bW4KLXsKLQkvKiogQHNlZSBBYnN0cmFjdEphdmFOYW1lZENvbHVtbiNBYnN0cmFjdEphdmFOYW1lZENvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbikgKi8KLQlwcm90ZWN0ZWQgLyogZmluYWwgKi8gQ29tcGxldGVKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uOyAgLy8gbmV2ZXIgbnVsbAotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhSm9pbkNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBDb21wbGV0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBvd25lciwgY29sdW1uQW5ub3RhdGlvbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8odGhpcy5idWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb21wbGV0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbkFubm90YXRpb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q29sdW1uQW5ub3RhdGlvbihDb21wbGV0ZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24pIHsKLQkJdGhpcy5jb2x1bW5Bbm5vdGF0aW9uID0gY29sdW1uQW5ub3RhdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQkvLyB3ZSBkb24ndCByZW1vdmUgYSBqb2luIGNvbHVtbiBhbm5vdGF0aW9uIHdoZW4gaXQgaXMgZW1wdHkKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lIDogdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUsIG5hbWUpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShuYW1lKTsKLQkJCXRoaXMucmVtb3ZlQ29sdW1uQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5vd25lcik7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uSXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVmZXJlbmNlZERiQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUpvaW5Db2x1bW4gb2xkQ29sdW1uKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZENvbHVtbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUob2xkQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seUpvaW5Db2x1bW4gdmlydHVhbENvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVZpcnR1YWwodmlydHVhbENvbHVtbik7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUodmlydHVhbENvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmpvaW5Db2x1bW5Jc0RlZmF1bHQodGhpcyk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRDb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkucmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldENhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcygpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLm93bmVyLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgIT0gbnVsbCkgPyB0YWJsZS5nZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPiBpbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIGJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG5ldyBKYXZhSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKHRoaXMsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZGVjMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFKb2luVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgam9pbiB0YWJsZQotICogPHA+Ci0gKiBOb3RlOiBUaGUgPGNvZGU+Sm9pblRhYmxlPC9jb2RlPiBhbm5vdGF0aW9uIGlzIG9uZSBvZiBvbmx5IDIgYW5ub3RhdGlvbnMgdGhhdAotICogY2FuIGJlIG5lc3RlZCBvdXRzaWRlIG9mIGFuIGFycmF5IChpLmUuIGluIGFuIDxjb2RlPkFzc29jaWF0aW9uT3ZlcnJpZGU8L2NvZGU+Ci0gKiBhbm5vdGF0aW9uKTsgdGhlIG90aGVyIGlzIHtAbGluayBHZW5lcmljSmF2YUNvbHVtbiBDb2x1bW59LgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFKb2luVGFibGUKLQlleHRlbmRzIEdlbmVyaWNKYXZhUmVmZXJlbmNlVGFibGU8Sm9pblRhYmxlQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFKb2luVGFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUpvaW5Db2x1bW4sIEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBzcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBpbnZlcnNlSm9pbkNvbHVtbk93bmVyOwotCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhSm9pblRhYmxlKEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIGFubm90YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5UYWJsZUFubm90YXRpb24gZ2V0VGFibGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmdldEpvaW5UYWJsZUFubm90YXRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVUYWJsZUFubm90YXRpb24oKSB7Ci0JCS8vIHdlIGRvbid0IHJlbW92ZSBhIGpvaW4gdGFibGUgYW5ub3RhdGlvbiB3aGVuIGl0IGlzIGVtcHR5Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIDogdGhpcy5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbnZlcnREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5Ub1NwZWNpZmllZCgpIHsKLQkJTWFwcGluZ1Rvb2xzLmNvbnZlcnRKb2luVGFibGVEZWZhdWx0VG9TcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLmFkZEludmVyc2VKb2luQ29sdW1uKGluZGV4KTsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhSm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKGluZGV4KTsKLQkJdGhpcy5yZW1vdmVUYWJsZUFubm90YXRpb25JZlVuc2V0KCk7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLm1vdmVJbnZlcnNlSm9pbkNvbHVtbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQkvLyBmb3Igbm93LCB3ZSBoYXZlIHRvIHJlbW92ZSBhbm5vdGF0aW9ucyBvbmUgYXQgYSB0aW1lLi4uCi0JCWZvciAoaW50IGkgPSB0aGlzLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQl0aGlzLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKGkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JLyoqCi0JICogaW52ZXJzZSBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhSm9pbkNvbHVtbiwgSm9pbkNvbHVtbkFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KEpvaW5Db2x1bW5Bbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZ2V0SW52ZXJzZUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBjb250ZXh0RWxlbWVudC5nZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZEludmVyc2VKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhSm9pbkNvbHVtbiwgSm9pbkNvbHVtbkFubm90YXRpb24+IGJ1aWxkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBpbnZlcnNlIGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlKYXZhSm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9JTlZFUlNFX0pPSU5fQ09MVU1OLCBvbGQsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxKYXZhSm9pbkNvbHVtbj5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCWlmICh0aGlzLmJ1aWxkc0RlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihuZXcgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uLnVwZGF0ZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5zZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlRGVmYXVsdE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUpvaW5UYWJsZSBvbGRUYWJsZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRUYWJsZSk7Ci0JCWZvciAoUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiBvbGRUYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpLmluaXRpYWxpemVGcm9tKGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5Sm9pblRhYmxlIHZpcnR1YWxUYWJsZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVZpcnR1YWwodmlydHVhbFRhYmxlKTsKLQkJZm9yIChSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IHZpcnR1YWxUYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigpLmluaXRpYWxpemVGcm9tVmlydHVhbChqb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBidWlsZEludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSm9pbkNvbHVtbih0aGlzLmludmVyc2VKb2luQ29sdW1uT3duZXIsIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEphdmFKb2luQ29sdW1uIGNvbHVtbiA6IHRoaXMuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKLQkJCXJlc3VsdCA9IGNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSm9pbkNvbHVtbnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGVKb2luQ29sdW1ucyhtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlTm9kZXModGhpcy5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSwgbWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkudmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBqdXN0IGEgbGl0dGxlIGNvbW1vbiBiZWhhdmlvcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHROYW1lKChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcyk7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgdGFibGUgbmFtZSBpdCBuZWVkcyB0byBiZSB0aGUgc2FtZQotCQkgKiB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lLiBUaGUgdGFibGUgaXMgYWx3YXlzIHRoZSBqb2luIHRhYmxlLgotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5nZXREZWZhdWx0VGFibGVOYW1lKCksIHRhYmxlTmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIGpvaW4gY29sdW1uIGNhbiBvbmx5IGJlIG9uIHRoZSBqb2luIHRhYmxlIGl0c2VsZgotCQkgKi8KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCksIHRhYmxlTmFtZSkgPwotCQkJCQlHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldERiVGFibGUoKSA6Ci0JCQkJCW51bGw7Ci0JCX0KLQotCQkvKioKLQkJICogYnkgZGVmYXVsdCwgdGhlIGpvaW4gY29sdW1uIGlzLCBvYnZpb3VzbHksIGluIHRoZSBqb2luIHRhYmxlOwotCQkgKiBub3Qgc3VyZSB3aGV0aGVyIGl0IGNhbiBiZSBhbnl3aGVyZSBlbHNlLi4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmdldFJlbGF0aW9uc2hpcCgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBqb2luIGNvbHVtbnM7Ci0JICogdGhlc2UgcG9pbnQgYXQgdGhlIHNvdXJjZS9vd25pbmcgZW50aXR5Ci0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEpvaW5Db2x1bW5Pd25lcgotCQlleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldFRhcmdldEF0dHJpYnV0ZU5hbWUoR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldEpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS5idWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiZm9yd2FyZC1wb2ludGVyIiBqb2luIGNvbHVtbnM7Ci0JICogdGhlc2UgcG9pbnQgYXQgdGhlIHRhcmdldC9pbnZlcnNlIGVudGl0eQotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gR2VuZXJpY0phdmFKb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJCUVudGl0eSByZWxhdGlvbnNoaXBUYXJnZXQgPSB0aGlzLmdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCQkJcmV0dXJuIChyZWxhdGlvbnNoaXBUYXJnZXQgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwVGFyZ2V0LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBqb2luQ29sdW1uSXNEZWZhdWx0KFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhSm9pblRhYmxlLnRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUpvaW5UYWJsZS50aGlzLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcigoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMsIChKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTG9iQ29udmVydGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUxvYkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWMxZmY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTG9iQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkxvYkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFMb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTG9iQ29udmVydGVyCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFDb252ZXJ0ZXIKLQlpbXBsZW1lbnRzIEphdmFMb2JDb252ZXJ0ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTG9iQW5ub3RhdGlvbiBsb2JBbm5vdGF0aW9uOwotCi0JcHVibGljIEdlbmVyaWNKYXZhTG9iQ29udmVydGVyKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgTG9iQW5ub3RhdGlvbiBsb2JBbm5vdGF0aW9uLCBKYXZhQ29udmVydGVyLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLmxvYkFubm90YXRpb24gPSBsb2JBbm5vdGF0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gTG9iQ29udmVydGVyLmNsYXNzOwotCX0KLQotCXB1YmxpYyBMb2JBbm5vdGF0aW9uIGdldENvbnZlcnRlckFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmxvYkFubm90YXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzU4MzRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU1hbnlUb01hbnlNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFueVRvTWFueU1hcHBpbmcKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2RjMjg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZzsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFueVRvT25lTWFwcGluZwotewotCXB1YmxpYyBHZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkNzM0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgbWFwcGVkIHN1cGVyY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFwcGVkU3VwZXJjbGFzcwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzcwotewotCXB1YmxpYyBHZW5lcmljSmF2YU1hcHBlZFN1cGVyY2xhc3MoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBtYXBwaW5nQW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODhjZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuSm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkpvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkpvaW5UYWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneQotCWltcGxlbWVudHMgSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotewotCXB1YmxpYyBHZW5lcmljSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneShKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGdldEpvaW5UYWJsZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAJKEpvaW5UYWJsZUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5UYWJsZUFubm90YXRpb24gYWRkSm9pblRhYmxlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChKb2luVGFibGVBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlSm9pblRhYmxlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkuaXNKb2luVGFibGVPdmVycmlkYWJsZSgpOwotCX0KLQotCXB1YmxpYyBSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHNlbGVjdE92ZXJyaWRlU3RyYXRlZ3koUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBvdmVycmlkZVJlbGF0aW9uc2hpcCkgewotCQlyZXR1cm4gb3ZlcnJpZGVSZWxhdGlvbnNoaXAuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcihSZWFkT25seVRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgSm9pblRhYmxlVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoSm9pblRhYmxlKSB0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBKb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiBuZXcgSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgSm9pblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMDBkNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG5hbWVkIG5hdGl2ZSBxdWVyeQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFRdWVyeTxOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5Ci17Ci0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRDbGFzczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3M7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmc7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU5hbWVkTmF0aXZlUXVlcnkoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgcXVlcnlBbm5vdGF0aW9uKTsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IHF1ZXJ5QW5ub3RhdGlvbi5nZXRSZXN1bHRDbGFzcygpOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBxdWVyeUFubm90YXRpb24uZ2V0UmVzdWx0U2V0TWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFJlc3VsdENsYXNzXyh0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5nZXRSZXN1bHRDbGFzcygpKTsKLQkJdGhpcy5zZXRSZXN1bHRTZXRNYXBwaW5nXyh0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcyh0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlc3VsdCBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24uc2V0UmVzdWx0Q2xhc3MocmVzdWx0Q2xhc3MpOwotCQl0aGlzLnNldFJlc3VsdENsYXNzXyhyZXN1bHRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVzdWx0Q2xhc3NfKFN0cmluZyByZXN1bHRDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5yZXN1bHRDbGFzczsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IHJlc3VsdENsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGQsIHJlc3VsdENsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzczsKLQkJdGhpcy5mdWxseVF1YWxpZmllZFJlc3VsdENsYXNzID0gcmVzdWx0Q2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGVUxMWV9RVUFMSUZJRURfUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGQsIHJlc3VsdENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlBbm5vdGF0aW9uLmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0UmVzdWx0Q2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJy4nOwotCX0KLQotCXB1YmxpYyBJVHlwZSBnZXRSZXN1bHRDbGFzc0pkdFR5cGUoKSB7Ci0JCXJldHVybiBKRFRUb29scy5maW5kVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc3VsdCBzZXQgbWFwcGluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnJlc3VsdFNldE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgcmVzdWx0U2V0TWFwcGluZykgewotCQl0aGlzLnF1ZXJ5QW5ub3RhdGlvbi5zZXRSZXN1bHRTZXRNYXBwaW5nKHJlc3VsdFNldE1hcHBpbmcpOwotCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmdfKHJlc3VsdFNldE1hcHBpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJlc3VsdFNldE1hcHBpbmdfKFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnJlc3VsdFNldE1hcHBpbmc7Ci0JCXRoaXMucmVzdWx0U2V0TWFwcGluZyA9IHJlc3VsdFNldE1hcHBpbmc7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRVNVTFRfU0VUX01BUFBJTkdfUFJPUEVSVFksIG9sZCwgcmVzdWx0U2V0TWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRdWVyeV8oSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHlldAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXJldHVybiBzdXBlci5pc0lkZW50aWNhbChxdWVyeSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRSZXN1bHRDbGFzcygpLCAoKEdlbmVyaWNKYXZhTmFtZWROYXRpdmVRdWVyeSlxdWVyeSkuZ2V0UmVzdWx0Q2xhc3MoKSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRSZXN1bHRTZXRNYXBwaW5nKCksICgoR2VuZXJpY0phdmFOYW1lZE5hdGl2ZVF1ZXJ5KXF1ZXJ5KS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8TmFtZWROYXRpdmVRdWVyeT4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIE5hbWVkTmF0aXZlUXVlcnkuY2xhc3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0M2NkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgbmFtZWQgcXVlcnkKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTmFtZWRRdWVyeQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUXVlcnk8TmFtZWRRdWVyeUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhTmFtZWRRdWVyeQotewotCXB1YmxpYyBHZW5lcmljSmF2YU5hbWVkUXVlcnkoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgTmFtZWRRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgcXVlcnlBbm5vdGF0aW9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVF1ZXJ5XyhKcGFKcHFsUXVlcnlIZWxwZXIgcXVlcnlIZWxwZXIsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXF1ZXJ5SGVscGVyLnZhbGlkYXRlKHRoaXMsIHRoaXMucXVlcnksIHRoaXMuZ2V0UXVlcnlBbm5vdGF0aW9uKCkuZ2V0UXVlcnlUZXh0UmFuZ2UoYXN0Um9vdCksIDEsIG1lc3NhZ2VzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPE5hbWVkUXVlcnk+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBOYW1lZFF1ZXJ5LmNsYXNzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YmM1ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotCi0vKioKLSAqIG51bGwgbWFwcGluZyB1c2VkIHdoZW4gYW4gYXR0cmlidXRlJ3MgZGVmYXVsdCBtYXBwaW5nIGNhbm5vdCBiZSBkZXRlcm1pbmVkCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEFubm90YXRpb24+Ci17Ci0JcHVibGljIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODQ1NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb01hbnlNYXBwaW5nCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjYzOTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU9uZVRvT25lTWFwcGluZzsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFPbmVUb09uZU1hcHBpbmcKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPcmRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT3JkZXJhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZDc1NjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPcmRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIG9yZGVyaW5nCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNldHRpbmcgYW55IGZsYWcgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IChvciBzZXR0aW5nIHRoZQotICogc3BlY2lmaWVkICJvcmRlciBieSIgdG8gPGNvZGU+bnVsbDwvY29kZT4pIGNhbiBiZSBhIGJpdCB1bnByZWRpY3RhYmxlLiBUaGUKLSAqIGludGVudCBpcyB0byBzZXQgYSBmbGFnIHRvIDxjb2RlPnRydWU8L2NvZGU+IChvciBzZXQgdGhlIHNwZWNpZmllZCAib3JkZXIgYnkiCi0gKiB0byBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+KEpQQSAyLjAgb25seSkgTkI6PC9zdHJvbmc+IElmIGJvdGggdGhlICJvcmRlciBieSIgYW5kIHRoZSAib3JkZXIKLSAqIGNvbHVtbiIgYW5ub3RhdGlvbnMgYXJlIHByZXNlbnQgKHdoaWNoIGlzIHByb2hpYml0ZWQgYnkgdGhlIEpQQSBzcGVjKSwKLSAqIGJvdGggYXJlIGlnbm9yZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU9yZGVyYWJsZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFPcmRlcmFibGUyXzAKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE9yZGVyQnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbm9PcmRlcmluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIHBrT3JkZXJpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjdXN0b21PcmRlcmluZyA9IGZhbHNlOwotCi0JLy8gSlBBIDIuMAotCXByb3RlY3RlZCBmaW5hbCBPd25lciBvd25lcjsgIC8vIHRoaXMgaXMgbnVsbCBmb3IgSlBBIDEuMCBtYXBwaW5ncwotCXByb3RlY3RlZCBib29sZWFuIG9yZGVyQ29sdW1uT3JkZXJpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uOwotCi0KLQkvKioKLQkgKiBKUEEgMS4wCi0JICovCi0JcHVibGljIEdlbmVyaWNKYXZhT3JkZXJhYmxlKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogSlBBIDIuMAotCSAqLwotCXB1YmxpYyBHZW5lcmljSmF2YU9yZGVyYWJsZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuc3BlY2lmaWVkT3JkZXJCeSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRPcmRlckJ5KCk7Ci0JCXRoaXMubm9PcmRlcmluZyA9IHRoaXMuYnVpbGROb09yZGVyaW5nKCk7Ci0JCXRoaXMucGtPcmRlcmluZyA9IHRoaXMuYnVpbGRQa09yZGVyaW5nKCk7Ci0JCXRoaXMuY3VzdG9tT3JkZXJpbmcgPSB0aGlzLmJ1aWxkQ3VzdG9tT3JkZXJpbmcoKTsKLQotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMub3JkZXJDb2x1bW5PcmRlcmluZyA9IHRoaXMuYnVpbGRPcmRlckNvbHVtbk9yZGVyaW5nKCk7Ci0JCXRoaXMub3JkZXJDb2x1bW4gPSB0aGlzLmJ1aWxkT3JkZXJDb2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZE9yZGVyQnlfKHRoaXMuYnVpbGRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQl0aGlzLnNldE5vT3JkZXJpbmdfKHRoaXMuYnVpbGROb09yZGVyaW5nKCkpOwotCQl0aGlzLnNldFBrT3JkZXJpbmdfKHRoaXMuYnVpbGRQa09yZGVyaW5nKCkpOwotCQl0aGlzLnNldEN1c3RvbU9yZGVyaW5nXyh0aGlzLmJ1aWxkQ3VzdG9tT3JkZXJpbmcoKSk7Ci0KLQkJdGhpcy5zZXRPcmRlckNvbHVtbk9yZGVyaW5nXyh0aGlzLmJ1aWxkT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJdGhpcy5vcmRlckNvbHVtbi5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5vcmRlckNvbHVtbi51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIG9yZGVyIGJ5ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkT3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3JkZXJCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcmRlckJ5KFN0cmluZyBvcmRlckJ5KSB7Ci0JCWlmIChvcmRlckJ5ICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlT3JkZXJDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCQl0aGlzLmdldE9yZGVyQnlBbm5vdGF0aW9uRm9yVXBkYXRlKCkuc2V0VmFsdWUob3JkZXJCeSk7Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8ob3JkZXJCeSk7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXRoaXMuc2V0UGtPcmRlcmluZ18oZmFsc2UpOwotCQkJdGhpcy5zZXRDdXN0b21PcmRlcmluZ18odHJ1ZSk7Ci0JCQl0aGlzLnNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0Tm9PcmRlcmluZyh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZE9yZGVyQnlfKFN0cmluZyBvcmRlckJ5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZE9yZGVyQnk7Ci0JCXRoaXMuc3BlY2lmaWVkT3JkZXJCeSA9IG9yZGVyQnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfT1JERVJfQllfUFJPUEVSVFksIG9sZCwgb3JkZXJCeSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZE9yZGVyQnkoKSB7Ci0JCWlmICh0aGlzLm9yZGVyQ29sdW1uQW5ub3RhdGlvbklzUHJlc2VudCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0T3JkZXJCeUFubm90YXRpb24oKTsKLQkJcmV0dXJuIChvcmRlckJ5QW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBvcmRlckJ5QW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBubyBvcmRlcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc05vT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm5vT3JkZXJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9PcmRlcmluZyhib29sZWFuIG5vT3JkZXJpbmcpIHsKLQkJaWYgKG5vT3JkZXJpbmcpIHsKLQkJCXRoaXMucmVtb3ZlT3JkZXJDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCQlpZiAodGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCQl0aGlzLnJlbW92ZU9yZGVyQnlBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8obnVsbCk7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmdfKHRydWUpOwotCQkJdGhpcy5zZXRQa09yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0UGtPcmRlcmluZyh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5vT3JkZXJpbmdfKGJvb2xlYW4gbm9PcmRlcmluZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMubm9PcmRlcmluZzsKLQkJdGhpcy5ub09yZGVyaW5nID0gbm9PcmRlcmluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5PX09SREVSSU5HX1BST1BFUlRZLCBvbGQsIG5vT3JkZXJpbmcpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkTm9PcmRlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyB0aGlzLmJ1aWxkTm9PcmRlcmluZzJfMCgpIDogdGhpcy5idWlsZE5vT3JkZXJpbmcxXzAoKTsKLQl9Ci0KLQkvKioKLQkgKiBib3RoIGFubm90YXRpb25zIGFyZSBtaXNzaW5nIDxlbT5vcjwvZW0+IGJvdGggYXJlIHByZXNlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE5vT3JkZXJpbmcyXzAoKSB7Ci0JCWJvb2xlYW4gb3JkZXJCeU1pc3NpbmcgPSAodGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpID09IG51bGwpOwotCQlib29sZWFuIG9yZGVyQnlQcmVzZW50ID0gISBvcmRlckJ5TWlzc2luZzsKLQkJYm9vbGVhbiBvcmRlckNvbHVtbk1pc3NpbmcgPSAodGhpcy5nZXRPcmRlckNvbHVtbkFubm90YXRpb24oKSA9PSBudWxsKTsKLQkJYm9vbGVhbiBvcmRlckNvbHVtblByZXNlbnQgPSAhIG9yZGVyQ29sdW1uTWlzc2luZzsKLQkJcmV0dXJuIChvcmRlckJ5TWlzc2luZyAmJiBvcmRlckNvbHVtbk1pc3NpbmcpIHx8IChvcmRlckJ5UHJlc2VudCAmJiBvcmRlckNvbHVtblByZXNlbnQpOwotCX0KLQotCS8qKgotCSAqIHRoZSBvcmRlci1ieSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE5vT3JkZXJpbmcxXzAoKSB7Ci0JCXJldHVybiB0aGlzLmdldE9yZGVyQnlBbm5vdGF0aW9uKCkgPT0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGsgb3JkZXJpbmcgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQa09yZGVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5wa09yZGVyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBrT3JkZXJpbmcoYm9vbGVhbiBwa09yZGVyaW5nKSB7Ci0JCWlmIChwa09yZGVyaW5nKSB7Ci0JCQl0aGlzLnJlbW92ZU9yZGVyQ29sdW1uQW5ub3RhdGlvbigpOwotCQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeUFubm90YXRpb24gPSB0aGlzLmdldE9yZGVyQnlBbm5vdGF0aW9uKCk7Ci0JCQlpZiAob3JkZXJCeUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkT3JkZXJCeUFubm90YXRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJb3JkZXJCeUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8obnVsbCk7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXRoaXMuc2V0UGtPcmRlcmluZ18odHJ1ZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0Tm9PcmRlcmluZyh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFBrT3JkZXJpbmdfKGJvb2xlYW4gcGtPcmRlcmluZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMucGtPcmRlcmluZzsKLQkJdGhpcy5wa09yZGVyaW5nID0gcGtPcmRlcmluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX09SREVSSU5HX1BST1BFUlRZLCBvbGQsIHBrT3JkZXJpbmcpOwotCX0KLQotCS8qKgotCSAqIHRoZSBvcmRlci1ieSBhbm5vdGF0aW9uIGlzIHByZXNlbnQgYnV0IG5vIHZhbHVlIHNwZWNpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUGtPcmRlcmluZygpIHsKLQkJaWYgKHRoaXMub3JkZXJDb2x1bW5Bbm5vdGF0aW9uSXNQcmVzZW50KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0T3JkZXJCeUFubm90YXRpb24oKTsKLQkJcmV0dXJuIChvcmRlckJ5QW5ub3RhdGlvbiAhPSBudWxsKSAmJiAob3JkZXJCeUFubm90YXRpb24uZ2V0VmFsdWUoKSA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIG9yZGVyaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQ3VzdG9tT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbU9yZGVyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbU9yZGVyaW5nKGJvb2xlYW4gY3VzdG9tT3JkZXJpbmcpIHsKLQkJaWYgKGN1c3RvbU9yZGVyaW5nKSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE9yZGVyQnkoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmcodHJ1ZSk7ICAvLyBobW1tLi4uCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21PcmRlcmluZ18oYm9vbGVhbiBjdXN0b21PcmRlcmluZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuY3VzdG9tT3JkZXJpbmc7Ci0JCXRoaXMuY3VzdG9tT3JkZXJpbmcgPSBjdXN0b21PcmRlcmluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBjdXN0b21PcmRlcmluZyk7Ci0JfQotCi0JLyoqCi0JICogdGhlIG9yZGVyLWJ5IGFubm90YXRpb24gaXMgcHJlc2VudCBhbmQgaXQgaGFzIGEgc3BlY2lmaWVkIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRDdXN0b21PcmRlcmluZygpIHsKLQkJaWYgKHRoaXMub3JkZXJDb2x1bW5Bbm5vdGF0aW9uSXNQcmVzZW50KCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0T3JkZXJCeUFubm90YXRpb24oKTsKLQkJcmV0dXJuIChvcmRlckJ5QW5ub3RhdGlvbiAhPSBudWxsKSAmJiAob3JkZXJCeUFubm90YXRpb24uZ2V0VmFsdWUoKSAhPSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JkZXIgY29sdW1uIG9yZGVyaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzT3JkZXJDb2x1bW5PcmRlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJDb2x1bW5PcmRlcmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlckNvbHVtbk9yZGVyaW5nKGJvb2xlYW4gb3JkZXJDb2x1bW5PcmRlcmluZykgewotCQlpZiAob3JkZXJDb2x1bW5PcmRlcmluZykgewotCQkJdGhpcy5yZW1vdmVPcmRlckJ5QW5ub3RhdGlvbigpOwotCQkJaWYgKHRoaXMuZ2V0T3JkZXJDb2x1bW5Bbm5vdGF0aW9uKCkgPT0gbnVsbCkgewotCQkJCXRoaXMuYWRkT3JkZXJDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCQl9Ci0KLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8obnVsbCk7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXRoaXMuc2V0UGtPcmRlcmluZ18oZmFsc2UpOwotCQkJdGhpcy5zZXRDdXN0b21PcmRlcmluZ18oZmFsc2UpOwotCQkJdGhpcy5zZXRPcmRlckNvbHVtbk9yZGVyaW5nXyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0Tm9PcmRlcmluZyh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKGJvb2xlYW4gb3JkZXJDb2x1bW5PcmRlcmluZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMub3JkZXJDb2x1bW5PcmRlcmluZzsKLQkJdGhpcy5vcmRlckNvbHVtbk9yZGVyaW5nID0gb3JkZXJDb2x1bW5PcmRlcmluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9SREVSX0NPTFVNTl9PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBvcmRlckNvbHVtbk9yZGVyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBKUEEgMi4wIG9ubHk7Ci0JICogdGhlIG9yZGVyIGNvbHVtbiBhbm5vdGF0aW9uIGlzIHByZXNlbnQgPGVtPmFuZDwvZW0+Ci0JICogdGhlIG9yZGVyLWJ5IGFubm90YXRpb24gaXMgbWlzc2luZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkT3JkZXJDb2x1bW5PcmRlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJDb2x1bW5Bbm5vdGF0aW9uSXNQcmVzZW50KCkgJiYKLQkJCQkodGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcmRlciBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFPcmRlckNvbHVtbjJfMCBnZXRPcmRlckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJDb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFPcmRlckNvbHVtbjJfMCBidWlsZE9yZGVyQ29sdW1uKCkgewotCQlKYXZhUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lciBjb2x1bW5Pd25lciA9IG5ldyBPcmRlckNvbHVtbk93bmVyKCk7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmdldEpwYUZhY3RvcnkyXzAoKS5idWlsZEphdmFPcmRlckNvbHVtbih0aGlzLCBjb2x1bW5Pd25lcikgOgotCQkJCW5ldyBHZW5lcmljSmF2YU9yZGVyQ29sdW1uMl8wKHRoaXMsIGNvbHVtbk93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JkZXIgYnkgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgT3JkZXJCeUFubm90YXRpb24gZ2V0T3JkZXJCeUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoT3JkZXJCeUFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9yZGVyQnlBbm5vdGF0aW9uIGdldE9yZGVyQnlBbm5vdGF0aW9uRm9yVXBkYXRlKCkgewotCQlPcmRlckJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5hZGRPcmRlckJ5QW5ub3RhdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBPcmRlckJ5QW5ub3RhdGlvbiBhZGRPcmRlckJ5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChPcmRlckJ5QW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVPcmRlckJ5QW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JkZXIgY29sdW1uIGFubm90YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBnZXRPcmRlckNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihPcmRlckNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBOQjogT25seSByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIEpQQSAyLjAgbWFwcGluZ3MuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3JkZXJDb2x1bW5Bbm5vdGF0aW9uSXNQcmVzZW50KCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSAmJiAodGhpcy5nZXRPcmRlckNvbHVtbkFubm90YXRpb24oKSAhPSBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGFkZE9yZGVyQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZU9yZGVyQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJaWYgKHRoaXMub3JkZXJDb2x1bW5Bbm5vdGF0aW9uSXNQcmVzZW50KCkpIHsKLQkJCXRoaXMucmVtb3ZlT3JkZXJDb2x1bW5Bbm5vdGF0aW9uXygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlT3JkZXJDb2x1bW5Bbm5vdGF0aW9uXygpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCS8vIEpQQSAyLjAgb25seQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JLy8gSlBBIDIuMCBvbmx5Ci0JcHJvdGVjdGVkIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5vcmRlckNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldE9yZGVyQnlBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0QXR0cmlidXRlTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRPcmRlckJ5QW5ub3RhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0T3JkZXJCeUFubm90YXRpb24oKTsKLQkJcmV0dXJuIChvcmRlckJ5QW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBvcmRlckJ5QW5ub3RhdGlvbi5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJaWYgKHRoaXMub3JkZXJDb2x1bW5Bbm5vdGF0aW9uSXNQcmVzZW50KCkgJiYgKHRoaXMuZ2V0T3JkZXJCeUFubm90YXRpb24oKSAhPSBudWxsKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuT1JERVJfQ09MVU1OX0FORF9PUkRFUl9CWV9CT1RIX1NQRUNJRklFRCwKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCl9LAotCQkJCQl0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKSwKLQkJCQkJdGhpcy5nZXRPcmRlckJ5QW5ub3RhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCSkKLQkJCSk7Ci0JCX0KLQkJaWYgKHRoaXMub3JkZXJDb2x1bW5PcmRlcmluZykgewotCQkJLy9UT0RPIHZhbGlkYXRpb24gbWVzc2FnZSBpZiB0eXBlIGlzIG5vdCBMaXN0Ci0JCQl0aGlzLm9yZGVyQ29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JkZXIgY29sdW1uIG93bmVyIChKUEEgMi4wKSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgT3JkZXJDb2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIEphdmFSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPcmRlcmFibGUudGhpcy5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhT3JkZXJhYmxlLnRoaXMucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCkgKyAiX09SREVSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFPcmRlcmFibGUudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBPcmRlckNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKE9yZGVyQ29sdW1uMl8wKSBjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhT3JkZXJhYmxlLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA4NWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFPdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAKLXsKLQlwcm90ZWN0ZWQgSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtblN0cmF0ZWd5OwotCi0JLy8gSlBBIDIuMAotCXByb3RlY3RlZCBmaW5hbCBKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pblRhYmxlU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneSA9IHRoaXMuYnVpbGRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneSA9IHRoaXMuYnVpbGRKb2luVGFibGVTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0U3RyYXRlZ3kodGhpcy5idWlsZFN0cmF0ZWd5KCkpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS51cGRhdGUoKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3k7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RyYXRlZ3koSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5KSB7Ci0JCUphdmFSZWxhdGlvbnNoaXBTdHJhdGVneSBvbGQgPSB0aGlzLnN0cmF0ZWd5OwotCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJdGhpcy5idWlsZFN0cmF0ZWd5Ml8wKCkgOgotCQkJCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIFRoZSBvdmVycmlkZGVuIG1hcHBpbmcgZGV0ZXJtaW5lcyB0aGUgb3ZlcnJpZGUncyBzdHJhdGVneS4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkU3RyYXRlZ3kyXzAoKSB7Ci0JCU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBtYXBwaW5nU3RyYXRlZ3kgPSB0aGlzLmdldE1hcHBpbmdTdHJhdGVneSgpOwotCQlyZXR1cm4gKG1hcHBpbmdTdHJhdGVneSAhPSBudWxsKSA/Ci0JCQkJKEphdmFSZWxhdGlvbnNoaXBTdHJhdGVneSkgbWFwcGluZ1N0cmF0ZWd5LnNlbGVjdE92ZXJyaWRlU3RyYXRlZ3kodGhpcykgOgotCQkJCXRoaXMuYnVpbGRNaXNzaW5nTWFwcGluZ1N0cmF0ZWd5KCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzdHJhdGVneSBmcm9tIHRoZSBvdmVycmlkZGVuIG1hcHBpbmcuCi0JICovCi0JcHJvdGVjdGVkIE1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBnZXRNYXBwaW5nU3RyYXRlZ3koKSB7Ci0JCVJlbGF0aW9uc2hpcE1hcHBpbmcgbWFwcGluZyA9IHRoaXMuZ2V0TWFwcGluZygpOwotCQlyZXR1cm4gKG1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogKE1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gdGhlIG92ZXJyaWRlJ3MgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUKLQkgKiBuYW1lIG9mIGFuIGFwcHJvcHJpYXRlIHJlbGF0aW9uc2hpcCBtYXBwaW5nLgotCSAqLwotCXByb3RlY3RlZCBKYXZhUmVsYXRpb25zaGlwU3RyYXRlZ3kgYnVpbGRNaXNzaW5nTWFwcGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/Ci0JCQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kgOgotCQkJCXRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQkvLyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgZG8gbm90IGhhdmUgZGVmYXVsdHMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gdGFibGUgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc0pvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvSm9pblRhYmxlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5UYWJsZSgpIHsKLQkJLy8gYXNzb2NpYXRpb24gb3ZlcnJpZGVzIGRvIG5vdCBoYXZlIGRlZmF1bHRzCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQluZXcgR2VuZXJpY0phdmFPdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wKHRoaXMpIDoKLQkJCQluZXcgTnVsbEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCW9sZFJlbGF0aW9uc2hpcC5pbml0aWFsaXplT24odGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKHRoaXMpOwotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tTWFwcGVkQnlSZWxhdGlvbnNoaXAoTWFwcGVkQnlSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCS8vIE5PUAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LmluaXRpYWxpemVGcm9tKG9sZFJlbGF0aW9uc2hpcC5nZXRKb2luVGFibGVTdHJhdGVneSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwIG9sZFJlbGF0aW9uc2hpcCkgewotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGRSZWxhdGlvbnNoaXAuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwIHZpcnR1YWxSZWxhdGlvbnNoaXApIHsKLQkJdmlydHVhbFJlbGF0aW9uc2hpcC5pbml0aWFsaXplT25TcGVjaWZpZWQodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uU3BlY2lmaWVkKE92ZXJyaWRlUmVsYXRpb25zaGlwIHNwZWNpZmllZFJlbGF0aW9uc2hpcCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgdmlydHVhbFJlbGF0aW9uc2hpcCkgewotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LmluaXRpYWxpemVGcm9tVmlydHVhbCh2aXJ0dWFsUmVsYXRpb25zaGlwLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwIHZpcnR1YWxSZWxhdGlvbnNoaXApIHsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxSZWxhdGlvbnNoaXAuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzAgZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMCgpIHsKLQkJcmV0dXJuIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMCkgdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgT3duZXIgb3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXJldHVybiB0aGlzLnN0cmF0ZWd5LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5zdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMCgpLmJ1aWxkSm9pblRhYmxlVmFsaWRhdG9yKHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMCgpLmJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWM3ODFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotLyoqCi0gKiBHZW5lcmljIEphdmEgcGVyc2lzdGVudCBhdHRyaWJ1dGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZQotewotCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZShQZXJzaXN0ZW50VHlwZSBwYXJlbnQsIEphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZUZpZWxkKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlKFBlcnNpc3RlbnRUeXBlIHBhcmVudCwgSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlR2V0dGVyLCBKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VTZXR0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZUdldHRlciwgcmVzb3VyY2VTZXR0ZXIpOwotCX0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoUGVyc2lzdGVudFR5cGUgcGFyZW50LCBBY2Nlc3NvciBhY2Nlc3NvcikgewotCQlzdXBlcihwYXJlbnQsIGFjY2Vzc29yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwdFZhbGlkYXRvciBidWlsZEF0dHJpYnV0ZVZhbGlkYXRvcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0QWNjZXNzb3IoKS5idWlsZEF0dHJpYnV0ZVZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkVGV4dFJhbmdlUmVzb2x2ZXIoYXN0Um9vdCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkODU5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlOwotCi0vKioKLSAqIEpQQSAxLjAgSmF2YSBwZXJzaXN0ZW50IHR5cGUuCi0gKiBUaGUgc3BlY2lmaWVkIGFjY2VzcyBpcyBhbHdheXMgbnVsbC4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUKLQlleHRlbmRzIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUuT3duZXIgcGFyZW50LCBKYXZhUmVzb3VyY2VUeXBlIGpydCkgewotCQlzdXBlcihwYXJlbnQsIGpydCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFjY2VzcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gLSBKUEEgMS4wIGRvZXMgbm90IHN1cHBvcnQgYSBzcGVjaWZpZWQgYWNjZXNzLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGJ1aWxkU3BlY2lmaWVkQWNjZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBKUEEgMS4wIGRvZXMgbm90IHN1cHBvcnQgYSBzcGVjaWZpZWQgYWNjZXNzLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkpQQSAxLjAgZG9lcyBub3Qgc3VwcG9ydCBhIHNwZWNpZmllZCBhY2Nlc3MgdHlwZSBpbiBqYXZhLiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjE0NTM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBKYXZhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFOYW1lZENvbHVtbjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24sIEphdmFSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyPgotCWltcGxlbWVudHMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uCi17Ci0JLyoqIEBzZWUgQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW4jQWJzdHJhY3RKYXZhTmFtZWRDb2x1bW4ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbikgKi8KLQlwcm90ZWN0ZWQgLyogZmluYWwgKi8gUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb247ICAvLyBuZXZlciBudWxsCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lciwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBvd25lciwgY29sdW1uQW5ub3RhdGlvbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8odGhpcy5idWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gZ2V0Q29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uQW5ub3RhdGlvbjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb2x1bW5Bbm5vdGF0aW9uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uKSB7Ci0JCXRoaXMuY29sdW1uQW5ub3RhdGlvbiA9IGNvbHVtbkFubm90YXRpb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJLy8gd2UgZG9uJ3QgcmVtb3ZlIGEgcGsgam9pbiBjb2x1bW4gYW5ub3RhdGlvbiB3aGVuIGl0IGlzIGVtcHR5Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA6IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCBuYW1lKSkgewotCQkJdGhpcy5jb2x1bW5Bbm5vdGF0aW9uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG5hbWUpOwotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8obmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5Bbm5vdGF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JLy8gVE9ETyBub3QgY29ycmVjdCB3aGVuIHdlIHN0YXJ0IHN1cHBvcnRpbmcKLQkvLyBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgaW4gMS0xIG1hcHBpbmdzCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGREZWZhdWx0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uSXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVmZXJlbmNlZERiQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmpvaW5Db2x1bW5Jc0RlZmF1bHQodGhpcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRDb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNhbmRpZGF0ZVJlZmVyZW5jZWRDb2x1bW5OYW1lcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5Bbm5vdGF0aW9uLnJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5nZXRDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoZmlsdGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlUmVmZXJlbmNlZENvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy5vd25lci5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlICE9IG51bGwpID8gdGFibGUuZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBuZXcgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMuY29sdW1uQW5ub3RhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzdXBlci50b1N0cmluZyhzYik7Ci0JCXNiLmFwcGVuZCgiPT4iKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVF1ZXJ5Q29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVF1ZXJ5Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNzdkZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBKYXZhIHF1ZXJ5IGNvbnRhaW5lcgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFRdWVyeUNvbnRhaW5lcgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFRdWVyeUNvbnRhaW5lcgotewotCXByb3RlY3RlZCBmaW5hbCBPd25lciBvd25lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhTmFtZWRRdWVyeSwgTmFtZWRRdWVyeUFubm90YXRpb24+IG5hbWVkUXVlcnlDb250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5LCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4gbmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lcjsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhUXVlcnlDb250YWluZXIoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLm5hbWVkUXVlcnlDb250YWluZXIgPSB0aGlzLmJ1aWxkTmFtZWRRdWVyeUNvbnRhaW5lcigpOwotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcnlDb250YWluZXIgPSB0aGlzLmJ1aWxkTmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNOYW1lZFF1ZXJpZXMoKTsKLQkJdGhpcy5zeW5jTmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldE5hbWVkUXVlcmllcygpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldE5hbWVkTmF0aXZlUXVlcmllcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcXVlcmllcyAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8UXVlcnk+IGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UXVlcnk+KHRoaXMuZ2V0TmFtZWRRdWVyaWVzKCksIHRoaXMuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lZCBxdWVyaWVzICoqKioqKioqKioKLQotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhTmFtZWRRdWVyeT4gZ2V0TmFtZWRRdWVyaWVzKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZFF1ZXJ5Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZWRRdWVyeUNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIEphdmFOYW1lZFF1ZXJ5IGFkZE5hbWVkUXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLmFkZE5hbWVkUXVlcnkodGhpcy5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCkgewotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGROYW1lZFF1ZXJ5QW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLm5hbWVkUXVlcnlDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBhZGROYW1lZFF1ZXJ5QW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgdGhpcy5vd25lci5nZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5hZGRBbm5vdGF0aW9uKGluZGV4LCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkUXVlcnkoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCXRoaXMucmVtb3ZlTmFtZWRRdWVyeSh0aGlzLm5hbWVkUXVlcnlDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhTmFtZWRRdWVyeSkgbmFtZWRRdWVyeSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkUXVlcnkoaW50IGluZGV4KSB7Ci0JCXRoaXMub3duZXIuZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkucmVtb3ZlQW5ub3RhdGlvbihpbmRleCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5uYW1lZFF1ZXJ5Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlTmFtZWRRdWVyeShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLm93bmVyLmdldFJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLm1vdmVBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGhpcy5uYW1lZFF1ZXJ5Q29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhTmFtZWRRdWVyeSBidWlsZE5hbWVkUXVlcnkoTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeUFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YU5hbWVkUXVlcnkodGhpcywgbmFtZWRRdWVyeUFubm90YXRpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNOYW1lZFF1ZXJpZXMoKSB7Ci0JCXRoaXMubmFtZWRRdWVyeUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gZ2V0TmFtZWRRdWVyeUFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4odGhpcy5nZXROZXN0YWJsZU5hbWVkUXVlcnlBbm5vdGF0aW9uc18oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOZXN0YWJsZUFubm90YXRpb24+IGdldE5lc3RhYmxlTmFtZWRRdWVyeUFubm90YXRpb25zXygpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8SmF2YU5hbWVkUXVlcnksIE5hbWVkUXVlcnlBbm5vdGF0aW9uPiBidWlsZE5hbWVkUXVlcnlDb250YWluZXIoKSB7Ci0JCU5hbWVkUXVlcnlDb250YWluZXIgY29udGFpbmVyID0gbmV3IE5hbWVkUXVlcnlDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBuYW1lZCBxdWVyeSBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTmFtZWRRdWVyeUNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFOYW1lZFF1ZXJ5LCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBOQU1FRF9RVUVSSUVTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhTmFtZWRRdWVyeSBidWlsZENvbnRleHRFbGVtZW50KE5hbWVkUXVlcnlBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUXVlcnlDb250YWluZXIudGhpcy5idWlsZE5hbWVkUXVlcnkocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOYW1lZFF1ZXJ5QW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVF1ZXJ5Q29udGFpbmVyLnRoaXMuZ2V0TmFtZWRRdWVyeUFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YU5hbWVkUXVlcnkgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRRdWVyeUFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lZCBuYXRpdmUgcXVlcmllcyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVkTmF0aXZlUXVlcnlDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YU5hbWVkTmF0aXZlUXVlcnkgYWRkTmFtZWROYXRpdmVRdWVyeSgpIHsKLQkJcmV0dXJuIHRoaXMuYWRkTmFtZWROYXRpdmVRdWVyeSh0aGlzLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IGFkZE5hbWVkTmF0aXZlUXVlcnkoaW50IGluZGV4KSB7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmFkZE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKGluZGV4KTsKLQkJcmV0dXJuIHRoaXMubmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGFkZE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQlyZXR1cm4gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSB0aGlzLm93bmVyLmdldFJlc291cmNlQW5ub3RhdGVkRWxlbWVudCgpLmFkZEFubm90YXRpb24oaW5kZXgsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJdGhpcy5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMubmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKEphdmFOYW1lZE5hdGl2ZVF1ZXJ5KSBuYW1lZE5hdGl2ZVF1ZXJ5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKLQkJdGhpcy5vd25lci5nZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcnlDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMub3duZXIuZ2V0UmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50KCkubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLm5hbWVkTmF0aXZlUXVlcnlDb250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFOYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkTmFtZWROYXRpdmVRdWVyeShOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhTmFtZWROYXRpdmVRdWVyeSh0aGlzLCBuYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY05hbWVkTmF0aXZlUXVlcmllcygpIHsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uPiBnZXROYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25zXygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE5lc3RhYmxlQW5ub3RhdGlvbj4gZ2V0TmVzdGFibGVOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbnNfKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5nZXRBbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhTmFtZWROYXRpdmVRdWVyeSwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24+IGJ1aWxkTmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lcigpIHsKLQkJTmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgTmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIG5hbWVkIHF1ZXJ5IGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBOYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8SmF2YU5hbWVkTmF0aXZlUXVlcnksIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIE5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhTmFtZWROYXRpdmVRdWVyeSBidWlsZENvbnRleHRFbGVtZW50KE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUXVlcnlDb250YWluZXIudGhpcy5idWlsZE5hbWVkTmF0aXZlUXVlcnkocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVF1ZXJ5Q29udGFpbmVyLnRoaXMuZ2V0TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YU5hbWVkTmF0aXZlUXVlcnkgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRRdWVyeUFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBxdWVyaWVzIGFyZSB2YWxpZGF0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdCN2YWxpZGF0ZVF1ZXJpZXMoTGlzdCwgSVJlcG9ydGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCS8vIHF1ZXJpZXMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5vd25lci5nZXRSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQoKS5nZXRUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSnBhQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFKcGFDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUhpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUXVlcnlIaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZTc5YjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFRdWVyeUhpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFRdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgcXVlcnkgaGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFRdWVyeUhpbnQKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhUXVlcnlIaW50Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50QW5ub3RhdGlvbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFRdWVyeUhpbnQoSmF2YVF1ZXJ5IHBhcmVudCwgUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucXVlcnlIaW50QW5ub3RhdGlvbiA9IHF1ZXJ5SGludEFubm90YXRpb247Ci0JCXRoaXMubmFtZSA9IHF1ZXJ5SGludEFubm90YXRpb24uZ2V0TmFtZSgpOwotCQl0aGlzLnZhbHVlID0gcXVlcnlIaW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMucXVlcnlIaW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLnF1ZXJ5SGludEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5xdWVyeUhpbnRBbm5vdGF0aW9uLnNldE5hbWUobmFtZSk7Ci0JCXRoaXMuc2V0TmFtZV8obmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnF1ZXJ5SGludEFubm90YXRpb24uc2V0VmFsdWUodmFsdWUpOwotCQl0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5xdWVyeUhpbnRBbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFF1ZXJ5KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50aWNhbChRdWVyeUhpbnQgaGludCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0TmFtZSgpLCBoaW50LmdldE5hbWUoKSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRWYWx1ZSgpLCBoaW50LmdldFZhbHVlKCkpIDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFRdWVyeSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVF1ZXJ5KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgUXVlcnlIaW50QW5ub3RhdGlvbiBnZXRRdWVyeUhpbnRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5xdWVyeUhpbnRBbm5vdGF0aW9uOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFSZWZlcmVuY2VUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFSZWZlcmVuY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBlYWQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUmVmZXJlbmNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlJlZmVyZW5jZVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgam9pbiB0YWJsZSBvciBjb2xsZWN0aW9uIHRhYmxlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljSmF2YVJlZmVyZW5jZVRhYmxlPEEgZXh0ZW5kcyBSZWZlcmVuY2VUYWJsZUFubm90YXRpb24+Ci0JZXh0ZW5kcyBBYnN0cmFjdEphdmFUYWJsZTxBPgotCWltcGxlbWVudHMgSmF2YVJlZmVyZW5jZVRhYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFKb2luQ29sdW1uLCBKb2luQ29sdW1uQW5ub3RhdGlvbj4gc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW47Ci0KLQotCXByb3RlY3RlZCBHZW5lcmljSmF2YVJlZmVyZW5jZVRhYmxlKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLmpvaW5Db2x1bW5Pd25lciA9IHRoaXMuYnVpbGRKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpIDogdGhpcy5nZXREZWZhdWx0Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmdldERlZmF1bHRKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb252ZXJ0RGVmYXVsdEpvaW5Db2x1bW5Ub1NwZWNpZmllZCgpIHsKLQkJTWFwcGluZ1Rvb2xzLmNvbnZlcnRSZWZlcmVuY2VUYWJsZURlZmF1bHRUb1NwZWNpZmllZEpvaW5Db2x1bW4odGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkuYWRkSm9pbkNvbHVtbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhSm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkucmVtb3ZlSm9pbkNvbHVtbihpbmRleCk7Ci0JCXRoaXMucmVtb3ZlVGFibGVBbm5vdGF0aW9uSWZVbnNldCgpOwotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0VGFibGVBbm5vdGF0aW9uKCkubW92ZUpvaW5Db2x1bW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRKb2luQ29sdW1uQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlQW5ub3RhdGlvbigpLmdldEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0KLQkvKioKLQkgKiBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFKb2luQ29sdW1uLCBKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KEpvaW5Db2x1bW5Bbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhUmVmZXJlbmNlVGFibGUudGhpcy5idWlsZEpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVJlZmVyZW5jZVRhYmxlLnRoaXMuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKb2luQ29sdW1uQW5ub3RhdGlvbiBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YUpvaW5Db2x1bW4gY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiAoSm9pbkNvbHVtbkFubm90YXRpb24pIGNvbnRleHRFbGVtZW50LmdldENvbHVtbkFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkSm9pbkNvbHVtbk93bmVyKCk7Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUpvaW5Db2x1bW4sIEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKXsKLQkJU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBqb2luIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJSmF2YUpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0pPSU5fQ09MVU1OX1BST1BFUlRZLCBvbGQsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8SmF2YUpvaW5Db2x1bW4+IGdldERlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxKYXZhSm9pbkNvbHVtbj5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCWlmICh0aGlzLmJ1aWxkc0RlZmF1bHRKb2luQ29sdW1uKCkpIHsKLQkJCWlmICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IG51bGwpIHsKLQkJCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKHRoaXMuYnVpbGRKb2luQ29sdW1uKG5ldyBOdWxsSm9pbkNvbHVtbkFubm90YXRpb24odGhpcy5nZXRUYWJsZUFubm90YXRpb24oKSkpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5UmVmZXJlbmNlVGFibGUgb2xkVGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkVGFibGUpOwotCQlmb3IgKFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uIDogb2xkVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkuaW5pdGlhbGl6ZUZyb20oam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlSZWZlcmVuY2VUYWJsZSB2aXJ0dWFsVGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxUYWJsZSk7Ci0JCWZvciAoUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB2aXJ0dWFsVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFKb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5idWlsZEpvaW5Db2x1bW4odGhpcy5qb2luQ29sdW1uT3duZXIsIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRKb2luQ29sdW1uKEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgamNPd25lciwgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkFubm90YXRpb24pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUpvaW5Db2x1bW4odGhpcywgamNPd25lciwgam9pbkNvbHVtbkFubm90YXRpb24pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEphdmEgY29tcGxldGlvbiBwcm9wb3NhbHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoaW50IHBvcywgRmlsdGVyPFN0cmluZz4gZmlsdGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IHJlc3VsdCA9IHN1cGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gY29sdW1uIDogdGhpcy5nZXRKb2luQ29sdW1ucygpKSB7Ci0JCQlyZXN1bHQgPSBjb2x1bW4uZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlib29sZWFuIGNvbnRpbnVlVmFsaWRhdGluZyA9IHRoaXMuYnVpbGRUYWJsZVZhbGlkYXRvcihhc3RSb290KS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCi0JCS8vam9pbiBjb2x1bW4gdmFsaWRhdGlvbiB3aWxsIGhhbmRsZSB0aGUgY2hlY2sgZm9yIHdoZXRoZXIgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgZGF0YWJhc2UKLQkJLy9zb21lIHZhbGlkYXRpb24gbWVzc2FnZXMgYXJlIG5vdCBkYXRhYmFzZSBzcGVjaWZpYy4gSWYgdGhlIGRhdGFiYXNlIHZhbGlkYXRpb24gZm9yIHRoZQotCQkvL3RhYmxlIGZhaWxzIHdlIHdpbGwgc3RvcCB0aGVyZSBhbmQgbm90IHZhbGlkYXRlIHRoZSBqb2luIGNvbHVtbnMgYXQgYWxsCi0JCWlmIChjb250aW51ZVZhbGlkYXRpbmcpIHsKLQkJCXRoaXMudmFsaWRhdGVKb2luQ29sdW1ucyhtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKb2luQ29sdW1ucyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbGlkYXRlTm9kZXModGhpcy5nZXRKb2luQ29sdW1ucygpLCBtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzVkMzE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQmFzZUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuU2Vjb25kYXJ5VGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgc2Vjb25kYXJ5IHRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFUYWJsZTxTZWNvbmRhcnlUYWJsZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhU2Vjb25kYXJ5VGFibGUKLXsKLQkvKiogQHNlZSBBYnN0cmFjdEphdmFUYWJsZSNBYnN0cmFjdEphdmFUYWJsZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZSwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGUuT3duZXIsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VUYWJsZUFubm90YXRpb24pICovCi0JcHJvdGVjdGVkIC8qIGZpbmFsICovIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb247Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBwcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyOwotCi0JcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVNlY29uZGFyeVRhYmxlKEphdmFFbnRpdHkgcGFyZW50LCBPd25lciBvd25lciwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCB0YWJsZUFubm90YXRpb24pOwotCQl0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyID0gdGhpcy5idWlsZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIGFubm90YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBnZXRUYWJsZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlQW5ub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0SmF2YVRhYmxlCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFibGVBbm5vdGF0aW9uKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24pIHsKLQkJdGhpcy50YWJsZUFubm90YXRpb24gPSB0YWJsZUFubm90YXRpb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVGFibGVBbm5vdGF0aW9uKCkgewotCQkvLyBldmVuIHRob3VnaCBpdHMgbmFtZSBpcyByZXF1aXJlZCwgd2UgZG9uJ3QgcmVtb3ZlIGEgc2Vjb25kYXJ5IHRhYmxlJwotCQkvLyBhbm5vdGF0aW9uIHdoZW4gaXQgaXMgZW1wdHkgc2luY2UgaXQgaXMgcGFydCBvZiBhIGxpc3QgYW5kIGl0J3Mgbm90Ci0JCS8vIG9idmlvdXMgd2hldGhlciB0aGlzIHdvdWxkIGJlIHZlcnkgdXNlci1oZWxwZnVsLi4uCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgOiB0aGlzLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMudGFibGVBbm5vdGF0aW9uLmFkZFBrSm9pbkNvbHVtbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCBhbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnRhYmxlQW5ub3RhdGlvbi5yZW1vdmVQa0pvaW5Db2x1bW4oaW5kZXgpOwotCQl0aGlzLnJlbW92ZVRhYmxlQW5ub3RhdGlvbklmVW5zZXQoKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMudGFibGVBbm5vdGF0aW9uLm1vdmVQa0pvaW5Db2x1bW4odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVBbm5vdGF0aW9uLmdldFBrSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkQ29udGV4dEVsZW1lbnQoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb25zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldENvbHVtbkFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4sIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IHByaW1hcnkga2V5IGpvaW4gY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCUphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGQgPSB0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiAhPSBudWxsKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSkgewotCQkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IG51bGwpIHsKLQkJCQl0aGlzLnNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLmJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW4obmV3IE51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24odGhpcy50YWJsZUFubm90YXRpb24pKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFbnRpdHkgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFFbnRpdHkpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRW50aXR5IGdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5Bbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLCB0aGlzLnByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIsIHBrSm9pbkNvbHVtbkFubm90YXRpb24pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBhIHNlY29uZGFyeSB0YWJsZSBkb2Vzbid0IGhhdmUgYSBkZWZhdWx0IG5hbWUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvZGUgY29tcGxldGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZm9yIChKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gY29sdW1uIDogdGhpcy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJcmVzdWx0ID0gY29sdW1uLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJYm9vbGVhbiBjb250aW51ZVZhbGlkYXRpbmcgPSB0aGlzLmJ1aWxkVGFibGVWYWxpZGF0b3IoYXN0Um9vdCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQotCQkvL2pvaW4gY29sdW1uIHZhbGlkYXRpb24gd2lsbCBoYW5kbGUgdGhlIGNoZWNrIGZvciB3aGV0aGVyIHRvIHZhbGlkYXRlIGFnYWluc3QgdGhlIGRhdGFiYXNlCi0JCS8vc29tZSB2YWxpZGF0aW9uIG1lc3NhZ2VzIGFyZSBub3QgZGF0YWJhc2Ugc3BlY2lmaWMuIElmIHRoZSBkYXRhYmFzZSB2YWxpZGF0aW9uIGZvciB0aGUKLQkJLy90YWJsZSBmYWlscyB3ZSB3aWxsIHN0b3AgdGhlcmUgYW5kIG5vdCB2YWxpZGF0ZSB0aGUgam9pbiBjb2x1bW5zIGF0IGFsbAotCQlpZiAoY29udGludWVWYWxpZGF0aW5nKSB7Ci0JCQlmb3IgKEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiB0aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJcGtKb2luQ29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSXNBY3RpdmUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb3duZXIgYWRhcHRlciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIEphdmFSZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSmF2YUVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5nZXREYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHkoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFTZWNvbmRhcnlUYWJsZS50aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJaWYgKHRoaXMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkgIT0gMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5KCkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBTZWNvbmRhcnlUYWJsZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yKEdlbmVyaWNKYXZhU2Vjb25kYXJ5VGFibGUudGhpcywgKFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcywgKEJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlY2QyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIHNlcXVlbmNlIGdlbmVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RKYXZhU2VxdWVuY2VHZW5lcmF0b3I8U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uPgotewotCXB1YmxpYyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgZ2VuZXJhdG9yQW5ub3RhdGlvbik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBKUEEgMS4wIHNwZWMgZG9lcyBub3QgYWxsb3cgYSBzZXF1ZW5jZSB0byBzcGVjaWZ5IGEgY2F0YWxvZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCS8qKgotCSAqIFRoZSBKUEEgMS4wIHNwZWMgZG9lcyBub3QgYWxsb3cgYSBzZXF1ZW5jZSB0byBzcGVjaWZ5IGEgc2NoZW1hLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdFNjaGVtYSgpOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50aWNhbChHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXJldHVybiBzdXBlci5pc0lkZW50aWNhbChnZW5lcmF0b3IpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U2NoZW1hKCksICgoKEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IpZ2VuZXJhdG9yKS5nZXRTY2hlbWEoKSkpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0Q2F0YWxvZygpLCAoKChHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yKWdlbmVyYXRvcikuZ2V0Q2F0YWxvZygpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk5MGRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSB0YWJsZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFUYWJsZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVGFibGU8VGFibGVBbm5vdGF0aW9uPgotewotCXB1YmxpYyBHZW5lcmljSmF2YVRhYmxlKEphdmFFbnRpdHkgcGFyZW50LCBPd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGVBbm5vdGF0aW9uIGdldFRhYmxlQW5ub3RhdGlvbigpIHsKLQkJLy8gVE9ETyBnZXQgdGhlIE51bGxUYWJsZUFubm90YXRpb24gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwgb3IgYnVpbGQgaXQgaGVyZSBpbiB0aGUgY29udGV4dCBtb2RlbD8/Ci0JCXJldHVybiAoVGFibGVBbm5vdGF0aW9uKSB0aGlzLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVRhYmxlQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eSgpLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0cyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eSgpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IHRvIHJlbWVtYmVyOjxvbD4KLQkgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eSNnZXREZWZhdWx0U2NoZW1hKCl9PGJyPgotCSAqICAgICBjaGVjayBpbmhlcml0YW5jZTsgZ2V0IGRlZmF1bHQgc2NoZW1hIGZyb20gcm9vdAotCSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzI2dldFNjaGVtYSgpfTxicj4KLQkgKiAgICAgY2hlY2sgZm9yIHNwZWNpZmllZCBzY2hlbWEKLQkgKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdCNnZXREZWZhdWx0U2NoZW1hKCl9PGJyPgotCSAqICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldFNjaGVtYSgpfQotCSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3QjZ2V0RGVmYXVsdFNjaGVtYSgpfTxicj4KLQkgKiAgICAgY2hlY2sgZm9yIHVzZXIgb3ZlcnJpZGUgcHJvamVjdCBzZXR0aW5nCi0JICogPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2cjZ2V0RGVmYXVsdFNjaGVtYSgpfTxicj4KLQkgKiAgICAgb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2UjZ2V0RGVmYXVsdFNjaGVtYSgpfQotCSAqIDwvb2w+Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eSgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JLyoqCi0JICogY292YXJpYW50IG92ZXJyaWRlCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFFbnRpdHkgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFFbnRpdHkpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhRW50aXR5IGdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZWExOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIEphdmEgdGFibGUgZ2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFHZW5lcmF0b3I8VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YVRhYmxlR2VuZXJhdG9yLCBVbmlxdWVDb25zdHJhaW50Lk93bmVyCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYWJsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYWJsZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UGtDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VmFsdWVDb2x1bW5OYW1lOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVVuaXF1ZUNvbnN0cmFpbnQsIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50Q29udGFpbmVyOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgZ2VuZXJhdG9yQW5ub3RhdGlvbik7Ci0JCXRoaXMuc3BlY2lmaWVkVGFibGUgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldFRhYmxlKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRTY2hlbWEoKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRDYXRhbG9nKCk7Ci0JCXRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lID0gZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRQa0NvbHVtbk5hbWUoKTsKLQkJdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldFZhbHVlQ29sdW1uTmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldFBrQ29sdW1uVmFsdWUoKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyID0gdGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZV8odGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLmdldFRhYmxlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRDYXRhbG9nXyh0aGlzLmdlbmVyYXRvckFubm90YXRpb24uZ2V0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWVfKHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lXyh0aGlzLmdlbmVyYXRvckFubm90YXRpb24uZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWVfKHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQl0aGlzLnN5bmNVbmlxdWVDb25zdHJhaW50cygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFRhYmxlKHRoaXMuYnVpbGREZWZhdWx0VGFibGUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFNjaGVtYSh0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0Q2F0YWxvZyh0aGlzLmJ1aWxkRGVmYXVsdENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFBrQ29sdW1uTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdFBrQ29sdW1uTmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKHRoaXMuYnVpbGREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQl0aGlzLnNldERlZmF1bHRQa0NvbHVtblZhbHVlKHRoaXMuYnVpbGREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsIHZhbHVlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0SW5pdGlhbFZhbHVlKCkgewotCQlyZXR1cm4gREVGQVVMVF9JTklUSUFMX1ZBTFVFOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUYWJsZSA6IHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQl0aGlzLmdlbmVyYXRvckFubm90YXRpb24uc2V0VGFibGUodGFibGUpOwotCQl0aGlzLnNldFNwZWNpZmllZFRhYmxlXyh0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFibGVfKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFRhYmxlOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIFRPRE8gdGhlIGRlZmF1bHQgdGFibGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVudGltZSBwcm92aWRlci4uLgotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKCkgewotCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoZGJTY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjaGVtYSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NoZW1hIDogdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJdGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLnNldFNjaGVtYShzY2hlbWEpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8oc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA6IHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJdGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLnNldENhdGFsb2coY2F0YWxvZyk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18oY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBjb2x1bW4gbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lIDogdGhpcy5kZWZhdWx0UGtDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5zZXRQa0NvbHVtbk5hbWUobmFtZSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyhuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UGtDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0UGtDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gVE9ETyB0aGUgZGVmYXVsdCBwayBjb2x1bW4gbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydW50aW1lIHByb3ZpZGVyLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlIGNvbHVtbiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgOiB0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLnNldFZhbHVlQ29sdW1uTmFtZShuYW1lKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWVfKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQkJdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBUT0RPIHRoZSBkZWZhdWx0IHZhbHVlIGNvbHVtbiBuYW1lIGlzIGRldGVybWluZWQgYnkgdGhlIHJ1bnRpbWUgcHJvdmlkZXIuLi4KLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgY29sdW1uIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgOiB0aGlzLmRlZmF1bHRQa0NvbHVtblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmdlbmVyYXRvckFubm90YXRpb24uc2V0UGtDb2x1bW5WYWx1ZSh2YWx1ZSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZV8odmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRQa0NvbHVtblZhbHVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQa0NvbHVtblZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0UGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5kZWZhdWx0UGtDb2x1bW5WYWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIFRPRE8gdGhlIGRlZmF1bHQgcGsgY29sdW1uIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIHJ1bnRpbWUgcHJvdmlkZXIuLi4KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdW5pcXVlIGNvbnN0cmFpbnRzICoqKioqKioqKioKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFVbmlxdWVDb25zdHJhaW50PiBnZXRVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIEphdmFVbmlxdWVDb25zdHJhaW50IGdldFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBKYXZhVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KHRoaXMuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRHZW5lcmF0b3JBbm5vdGF0aW9uKCkuYWRkVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0R2VuZXJhdG9yQW5ub3RhdGlvbigpLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW5kZXgpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhVW5pcXVlQ29uc3RyYWludCkgdW5pcXVlQ29uc3RyYWludCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuZ2V0R2VuZXJhdG9yQW5ub3RhdGlvbigpLm1vdmVVbmlxdWVDb25zdHJhaW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jVW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkVW5pcXVlQ29uc3RyYWludChVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBjb25zdHJhaW50QW5ub3RhdGlvbikgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLCBjb25zdHJhaW50QW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gZ2V0VW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRHZW5lcmF0b3JBbm5vdGF0aW9uKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8SmF2YVVuaXF1ZUNvbnN0cmFpbnQsIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiBidWlsZFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKSB7Ci0JCVVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIgY29udGFpbmVyID0gbmV3IFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiB1bmlxdWUgY29uc3RyYWludCBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVW5pcXVlQ29uc3RyYWludENvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFVbmlxdWVDb25zdHJhaW50LCBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBVTklRVUVfQ09OU1RSQUlOVFNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEphdmFVbmlxdWVDb25zdHJhaW50IGJ1aWxkQ29udGV4dEVsZW1lbnQoVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvci50aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludChyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IudGhpcy5nZXRVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGdldFJlc291cmNlRWxlbWVudChKYXZhVW5pcXVlQ29uc3RyYWludCBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogVW5pcXVlQ29uc3RyYWludC5Pd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKSB7Ci0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZGJUYWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOwotCQlyZXR1cm4gKGRiVGFibGUgIT0gbnVsbCkgPyBkYlRhYmxlLmdldFNvcnRlZENvbHVtbklkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBjb21wbGV0aW9uIHByb3Bvc2FscyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZm9yIChKYXZhVW5pcXVlQ29uc3RyYWludCBjb25zdHJhaW50IDogdGhpcy5nZXRVbmlxdWVDb25zdHJhaW50cygpKSB7Ci0JCQlyZXN1bHQgPSBjb25zdHJhaW50LmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIGlmIHRoZSBkYXRhYmFzZSBpcyBjb25uZWN0ZWQ6Ci0JICogdGFibGUsIHNjaGVtYSwgY2F0YWxvZywgcGtDb2x1bW5OYW1lLCB2YWx1ZUNvbHVtbk5hbWUKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2FscyhpbnQgcG9zLCBGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gcmVzdWx0ID0gc3VwZXIuZ2V0Q29ubmVjdGVkSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFDYW5kaWRhdGVUYWJsZXMoZmlsdGVyKTsKLQkJfQotCQlpZiAodGhpcy5zY2hlbWFUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJldHVybiB0aGlzLmdldEphdmFDYW5kaWRhdGVTY2hlbWF0YShmaWx0ZXIpOwotCQl9Ci0JCWlmICh0aGlzLnBrQ29sdW1uTmFtZVRvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SmF2YUNhbmRpZGF0ZUNvbHVtbk5hbWVzKGZpbHRlcik7Ci0JCX0KLQkJaWYgKHRoaXMudmFsdWVDb2x1bW5OYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlQ29sdW1uTmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvZGUgYXNzaXN0OiB0YWJsZQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvckFubm90YXRpb24udGFibGVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNhbmRpZGF0ZVRhYmxlcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZVRhYmxlcyhmaWx0ZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZXMoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldENhbmRpZGF0ZVRhYmxlcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlcygpIHsKLQkJU2NoZW1hIGRiU2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKGRiU2NoZW1hICE9IG51bGwpID8gZGJTY2hlbWEuZ2V0U29ydGVkVGFibGVJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPiBpbnN0YW5jZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogY29kZSBhc3Npc3Q6IHNjaGVtYQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLnNjaGVtYVRvdWNoZXMocG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRKYXZhQ2FuZGlkYXRlU2NoZW1hdGEoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbHModGhpcy5nZXRDYW5kaWRhdGVTY2hlbWF0YShmaWx0ZXIpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVTY2hlbWF0YShGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0Q2FuZGlkYXRlU2NoZW1hdGEoKSwgZmlsdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVTY2hlbWF0YSgpIHsKLQkJU2NoZW1hQ29udGFpbmVyIHNjaGVtYUNvbnRhaW5lciA9IHRoaXMuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJcmV0dXJuIChzY2hlbWFDb250YWluZXIgIT0gbnVsbCkgPyBzY2hlbWFDb250YWluZXIuZ2V0U29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvZGUgYXNzaXN0OiBjYXRhbG9nCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYXRhbG9nVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLmNhdGFsb2dUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YUNhbmRpZGF0ZUNhdGFsb2dzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWxzKHRoaXMuZ2V0Q2FuZGlkYXRlQ2F0YWxvZ3MoZmlsdGVyKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlQ2F0YWxvZ3MoRmlsdGVyPFN0cmluZz4gZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldENhbmRpZGF0ZUNhdGFsb2dzKCksIGZpbHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlQ2F0YWxvZ3MoKSB7Ci0JCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiICE9IG51bGwpID8gZGIuZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+IGluc3RhbmNlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjb2RlIGFzc2lzdDogcGtDb2x1bW5OYW1lCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwa0NvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvckFubm90YXRpb24ucGtDb2x1bW5OYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVDb2x1bW5OYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZUNvbHVtbk5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZUNvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVDb2x1bW5OYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZUNvbHVtbk5hbWVzKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlICE9IG51bGwpID8gdGFibGUuZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvZGUgYXNzaXN0OiB2YWx1ZUNvbHVtbk5hbWUKLQotCXByb3RlY3RlZCBib29sZWFuIHZhbHVlQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi52YWx1ZUNvbHVtbk5hbWVUb3VjaGVzKHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczxUYWJsZUdlbmVyYXRvcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yLmNsYXNzOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50aWNhbChHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXJldHVybiBzdXBlci5pc0lkZW50aWNhbChnZW5lcmF0b3IpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkVGFibGUoKSwgKCgoR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFRhYmxlKCkpKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpLCAoKChHZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yKWdlbmVyYXRvcikuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSwgKCgoR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZENhdGFsb2coKSkpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCksICgoKEdlbmVyaWNKYXZhVGFibGVHZW5lcmF0b3IpZ2VuZXJhdG9yKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSkpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpLCAoKChHZW5lcmljSmF2YVRhYmxlR2VuZXJhdG9yKWdlbmVyYXRvcikuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpKSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSwgKCgoR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKSkgJiYKLQkJCQl1bmlxdWVDb25zdHJhaW5zQXJlSWRlbnRpY2FsKCgoR2VuZXJpY0phdmFUYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB1bmlxdWVDb25zdHJhaW5zQXJlSWRlbnRpY2FsKExpc3RJdGVyYWJsZTxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWlucykgewotCQlib29sZWFuIGlzSWRlbnRpY2FsID0gdHJ1ZTsKLQkJaWYgKHRoaXMuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgIT0gQ29sbGVjdGlvblRvb2xzLnNpemUodW5pcXVlQ29uc3RyYWlucykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGk9MDsgaTx0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKCEoQ29sbGVjdGlvblRvb2xzLmdldCh0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCksIGkpKS5pc0lkZW50aWNhbChDb2xsZWN0aW9uVG9vbHMuZ2V0KHVuaXF1ZUNvbnN0cmFpbnMsIGkpKSkgewotCQkJCQkJaXNJZGVudGljYWwgPSBmYWxzZTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0lkZW50aWNhbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUZW1wb3JhbENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUZW1wb3JhbENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA1YTc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YUNvbnZlcnRlcgotCWltcGxlbWVudHMgSmF2YVRlbXBvcmFsQ29udmVydGVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbEFubm90YXRpb247Ci0KLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhVGVtcG9yYWxDb252ZXJ0ZXIoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWxBbm5vdGF0aW9uLCBKYXZhQ29udmVydGVyLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLnRlbXBvcmFsQW5ub3RhdGlvbiA9IHRlbXBvcmFsQW5ub3RhdGlvbjsKLQkJdGhpcy50ZW1wb3JhbFR5cGUgPSB0aGlzLmJ1aWxkVGVtcG9yYWxUeXBlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0VGVtcG9yYWxUeXBlXyh0aGlzLmJ1aWxkVGVtcG9yYWxUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZW1wb3JhbCB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy50ZW1wb3JhbFR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMudGVtcG9yYWxUeXBlLCB0ZW1wb3JhbFR5cGUpKSB7Ci0JCQl0aGlzLnRlbXBvcmFsQW5ub3RhdGlvbi5zZXRWYWx1ZShUZW1wb3JhbFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbCh0ZW1wb3JhbFR5cGUpKTsKLQkJCXRoaXMucmVtb3ZlVGVtcG9yYWxBbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRUZW1wb3JhbFR5cGVfKHRlbXBvcmFsVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZW1wb3JhbFR5cGVfKFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGUpIHsKLQkJVGVtcG9yYWxUeXBlIG9sZCA9IHRoaXMudGVtcG9yYWxUeXBlOwotCQl0aGlzLnRlbXBvcmFsVHlwZSA9IHRlbXBvcmFsVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRFTVBPUkFMX1RZUEVfUFJPUEVSVFksIG9sZCwgdGVtcG9yYWxUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcG9yYWxUeXBlIGJ1aWxkVGVtcG9yYWxUeXBlKCkgewotCQlyZXR1cm4gVGVtcG9yYWxUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbCh0aGlzLnRlbXBvcmFsQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRlbXBvcmFsQ29udmVydGVyLmNsYXNzOwotCX0KLQotCXB1YmxpYyBUZW1wb3JhbEFubm90YXRpb24gZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMudGVtcG9yYWxBbm5vdGF0aW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVRlbXBvcmFsQW5ub3RhdGlvbklmVW5zZXQoKSB7Ci0JCWlmICh0aGlzLnRlbXBvcmFsQW5ub3RhdGlvbi5pc1Vuc2V0KCkpIHsKLQkJCXRoaXMudGVtcG9yYWxBbm5vdGF0aW9uLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTQ2YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFUcmFuc2llbnRNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKYXZhIHRyYW5zaWVudCBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVRyYW5zaWVudE1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUF0dHJpYnV0ZU1hcHBpbmc8VHJhbnNpZW50QW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFUcmFuc2llbnRNYXBwaW5nCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhVHJhbnNpZW50TWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKiAgCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTQxYjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFVbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVW5pcXVlQ29uc3RyYWludAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Ci0JaW1wbGVtZW50cyBKYXZhVW5pcXVlQ29uc3RyYWludAotewotCXByb3RlY3RlZCBPd25lciBvd25lcjsKLQlwcm90ZWN0ZWQgZmluYWwgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVVuaXF1ZUNvbnN0cmFpbnQoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIsIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiA9IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotCQl0aGlzLmluaXRpYWxpemVDb2x1bW5OYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNDb2x1bW5OYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gbmFtZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmFkZENvbHVtbk5hbWUodGhpcy5jb2x1bW5OYW1lcy5zaXplKCksIGNvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmFkZENvbHVtbk5hbWUoaW5kZXgsIGNvbHVtbk5hbWUpOwotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbHVtbk5hbWUsIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRoaXMucmVtb3ZlQ29sdW1uTmFtZSh0aGlzLmNvbHVtbk5hbWVzLmluZGV4T2YoY29sdW1uTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoaW50IGluZGV4KSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24ucmVtb3ZlQ29sdW1uTmFtZShpbmRleCk7Ci0JCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmNvbHVtbk5hbWVzLCBDT0xVTU5fTkFNRVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUNvbHVtbk5hbWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5tb3ZlQ29sdW1uTmFtZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLm1vdmVJdGVtSW5MaXN0KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCwgdGhpcy5jb2x1bW5OYW1lcywgQ09MVU1OX05BTUVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2x1bW5OYW1lcygpIHsKLQkJZm9yIChTdHJpbmcgY29sdW1uTmFtZSA6IHRoaXMuZ2V0UmVzb3VyY2VDb2x1bW5OYW1lcygpKSB7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChjb2x1bW5OYW1lKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFJlc291cmNlQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmdldENvbHVtbk5hbWVzKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3RlZEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRDb25uZWN0ZWRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5OYW1lc1RvdWNoZXMocG9zLCBhc3RSb290KSkgewotCQkJcmV0dXJuIHRoaXMuamF2YUNhbmRpZGF0ZUNvbHVtbk5hbWVzKGZpbHRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29sdW1uTmFtZXNUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmNvbHVtbk5hbWVzVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGphdmFDYW5kaWRhdGVDb2x1bW5OYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZUNvbHVtbk5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZUNvbHVtbk5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVDb2x1bW5OYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZUNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRDYW5kaWRhdGVVbmlxdWVDb25zdHJhaW50Q29sdW1uTmFtZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50aWNhbChKYXZhVW5pcXVlQ29uc3RyYWludCBqYXZhVW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gIGNvbHVtbk5hbWVzQXJlSWRlbnRpY2FsKGphdmFVbmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb2x1bW5OYW1lc0FyZUlkZW50aWNhbChJdGVyYWJsZTxTdHJpbmc+IGNvbHVtbk5hbWVzKSB7Ci0JCWJvb2xlYW4gaXNJZGVudGljYWwgPSB0cnVlOwotCQlpZiAodGhpcy5nZXRDb2x1bW5OYW1lc1NpemUoKSAhPSBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjb2x1bW5OYW1lcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCWZvciAoaW50IGk9MDsgaTx0aGlzLmdldENvbHVtbk5hbWVzU2l6ZSgpOyBpKyspIHsKLQkJCQkJaWYgKCFTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwoQ29sbGVjdGlvblRvb2xzLmdldCh0aGlzLmdldENvbHVtbk5hbWVzKCksIGkpLCBDb2xsZWN0aW9uVG9vbHMuZ2V0KGNvbHVtbk5hbWVzLCBpKSkpIHsKLQkJCQkJCWlzSWRlbnRpY2FsID0gZmFsc2U7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNJZGVudGljYWw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBnZXRVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IG9sZFVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJZm9yIChTdHJpbmcgY29sdW1uTmFtZSA6IG9sZFVuaXF1ZUNvbnN0cmFpbnQuZ2V0Q29sdW1uTmFtZXMoKSkgewotCQkJdGhpcy5hZGRDb2x1bW5OYW1lKGNvbHVtbk5hbWUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDY2ZTM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVZlcnNpb25NYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVmVyc2lvbk1hcHBpbmcKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjZiM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhVmlydHVhbE92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogVmlydHVhbCBKYXZhIGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFWaXJ0dWFsT3ZlcnJpZGU8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+Ci0JaW1wbGVtZW50cyBKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXA7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAgPSB0aGlzLmJ1aWxkUmVsYXRpb25zaGlwKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAudXBkYXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnZlcnRUb1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIChKYXZhQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JfQotCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZyh0aGlzLm5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMCBnZXRDb250YWluZXIyXzAoKSB7Ci0JCXJldHVybiAoSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzApIHRoaXMuZ2V0Q29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbGF0aW9uc2hpcCAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcmVsYXRpb25zaGlwIHNob3VsZCBiZSBhdmFpbGFibGUgKHNpbmNlIGl0cyBwcmVzZW5jZSBwcmVjaXBpdGF0ZWQgdGhlCi0JICogY3JlYXRpb24gb2YgdGhlIHZpcnR1YWwgb3ZlcnJpZGUpLgotCSAqLwotCXByb3RlY3RlZCBKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwIGJ1aWxkUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwKHRoaXMpOwotCX0KLQotCXB1YmxpYyBSZWFkT25seVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnJlbGF0aW9uc2hpcC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyMl8wKCkuYnVpbGRKb2luVGFibGVWYWxpZGF0b3IodGhpcywgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcywgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKHRoaXMsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjNTcwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFWaXJ0dWFsT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBWaXJ0dWFsIEphdmEgYXR0cmlidXRlIG92ZXJyaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVmlydHVhbE92ZXJyaWRlPEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4KLQlpbXBsZW1lbnRzIEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUsIEphdmFWaXJ0dWFsQ29sdW1uLk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFWaXJ0dWFsQ29sdW1uIGNvbHVtbjsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQXR0cmlidXRlT3ZlcnJpZGUgY29udmVydFRvU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gKEphdmFBdHRyaWJ1dGVPdmVycmlkZSkgc3VwZXIuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YVZpcnR1YWxDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JLyoqCi0JICogVGhlIG9yaWdpbmFsIGNvbHVtbiBzaG91bGQgYmUgYXZhaWxhYmxlIChzaW5jZSB0aGUgcHJlc2VuY2Ugb2YgaXRzCi0JICogYXR0cmlidXRlIGlzIHdoYXQgcHJlY2lwaXRhdGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgdmlydHVhbCBvdmVycmlkZSkuCi0JICovCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsQ29sdW1uIGJ1aWxkQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhVmlydHVhbENvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIG93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJU3RyaW5nIG92ZXJyaWRkZW5Db2x1bW5UYWJsZSA9IHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtblRhYmxlKCk7Ci0JCXJldHVybiAob3ZlcnJpZGRlbkNvbHVtblRhYmxlICE9IG51bGwpID8gb3ZlcnJpZGRlbkNvbHVtblRhYmxlIDogc3VwZXIuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcnJpZGRlbkNvbHVtblRhYmxlKCkgewotCQlSZWFkT25seUNvbHVtbiBvdmVycmlkZGVuQ29sdW1uID0gdGhpcy5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpOwotCQkvLyBwcmV0dHkgc3VyZSB0aGlzIGlzIHRoZSAqc3BlY2lmaWVkKiB0YWJsZS4uLgotCQlyZXR1cm4gKG92ZXJyaWRkZW5Db2x1bW4gPT0gbnVsbCkgPyBudWxsIDogb3ZlcnJpZGRlbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJU3RyaW5nIG92ZXJyaWRkZW5Db2x1bW5OYW1lID0gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uTmFtZSgpOwotCQlyZXR1cm4gKG92ZXJyaWRkZW5Db2x1bW5OYW1lICE9IG51bGwpID8gb3ZlcnJpZGRlbkNvbHVtbk5hbWUgOiB0aGlzLm5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVycmlkZGVuQ29sdW1uTmFtZSgpIHsKLQkJUmVhZE9ubHlDb2x1bW4gb3ZlcnJpZGRlbkNvbHVtbiA9IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oKTsKLQkJcmV0dXJuIChvdmVycmlkZGVuQ29sdW1uID09IG51bGwpID8gbnVsbCA6IG92ZXJyaWRkZW5Db2x1bW4uZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBSZWFkT25seUNvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4odGhpcy5uYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKHRoaXMsIChSZWFkT25seUJhc2VDb2x1bW4pIGNvbCwgdGhpcywgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmVlYzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFWaXJ0dWFsQmFzZUNvbHVtbjsKLQotLyoqCi0gKiBKYXZhIHZpcnR1YWwgY29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZpcnR1YWxDb2x1bW4KLQlleHRlbmRzIEFic3RyYWN0SmF2YVZpcnR1YWxCYXNlQ29sdW1uPEphdmFWaXJ0dWFsQ29sdW1uLk93bmVyLCBSZWFkT25seUNvbHVtbj4KLQlpbXBsZW1lbnRzIEphdmFWaXJ0dWFsQ29sdW1uCi17Ci0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOwotCXByb3RlY3RlZCBpbnQgZGVmYXVsdExlbmd0aDsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFByZWNpc2lvbjsKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRQcmVjaXNpb247Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTY2FsZTsKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRTY2FsZTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhVmlydHVhbENvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhVmlydHVhbENvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGgodGhpcy5idWlsZFNwZWNpZmllZExlbmd0aCgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TGVuZ3RoKHRoaXMuYnVpbGREZWZhdWx0TGVuZ3RoKCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKHRoaXMuYnVpbGRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFByZWNpc2lvbih0aGlzLmJ1aWxkRGVmYXVsdFByZWNpc2lvbigpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFNjYWxlKHRoaXMuYnVpbGRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NhbGUodGhpcy5idWlsZERlZmF1bHRTY2FsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWFkT25seUNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsZW5ndGggKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZExlbmd0aC5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdExlbmd0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJaW50IG9sZCA9IHRoaXMuZGVmYXVsdExlbmd0aDsKLQkJdGhpcy5kZWZhdWx0TGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9MRU5HVEhfUFJPUEVSVFksIG9sZCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGJ1aWxkRGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTEVOR1RIOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmVjaXNpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFByZWNpc2lvbi5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0UHJlY2lzaW9uOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IHByZWNpc2lvbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZCwgcHJlY2lzaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByZWNpc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UHJlY2lzaW9uKGludCBwcmVjaXNpb24pIHsKLQkJaW50IG9sZCA9IHRoaXMuZGVmYXVsdFByZWNpc2lvbjsKLQkJdGhpcy5kZWZhdWx0UHJlY2lzaW9uID0gcHJlY2lzaW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZCwgcHJlY2lzaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGJ1aWxkRGVmYXVsdFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfUFJFQ0lTSU9OOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzY2FsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNjYWxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2NhbGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjYWxlLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRTY2FsZTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRTY2FsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlciBzY2FsZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSBzY2FsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSwgb2xkLCBzY2FsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgYnVpbGRTcGVjaWZpZWRTY2FsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0U2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2FsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NhbGUoaW50IHNjYWxlKSB7Ci0JCWludCBvbGQgPSB0aGlzLmRlZmF1bHRTY2FsZTsKLQkJdGhpcy5kZWZhdWx0U2NhbGUgPSBzY2FsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NBTEVfUFJPUEVSVFksIG9sZCwgc2NhbGUpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0U2NhbGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDQUxFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbEpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbEpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY5YjY3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFWaXJ0dWFsQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBKYXZhIHZpcnR1YWwgam9pbiBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVmlydHVhbEpvaW5Db2x1bW4KLQlleHRlbmRzIEFic3RyYWN0SmF2YVZpcnR1YWxCYXNlQ29sdW1uPEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIsIFJlYWRPbmx5Sm9pbkNvbHVtbj4KLQlpbXBsZW1lbnRzIEphdmFWaXJ0dWFsSm9pbkNvbHVtbgotewotCXByb3RlY3RlZCBmaW5hbCBSZWFkT25seUpvaW5Db2x1bW4gb3ZlcnJpZGRlbkNvbHVtbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVZpcnR1YWxKb2luQ29sdW1uKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIFJlYWRPbmx5Sm9pbkNvbHVtbiBvdmVycmlkZGVuQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLm92ZXJyaWRkZW5Db2x1bW4gPSBvdmVycmlkZGVuQ29sdW1uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuYnVpbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5idWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWFkT25seUpvaW5Db2x1bW4gZ2V0T3ZlcnJpZGRlbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGRlbkNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmpvaW5Db2x1bW5Jc0RlZmF1bHQodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA6IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5vd25lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKLQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uIGdldFJlZmVyZW5jZWREYkNvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcih0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5Jc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcihDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbmV3IEphdmFKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcywgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzllMThiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotewotCXByb3RlY3RlZCBmaW5hbCBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVmlydHVhbEpvaW5Db2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBqb2luQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3koSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5qb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8SmF2YVZpcnR1YWxKb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5nZXREZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhVmlydHVhbEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpcnR1YWxKb2luQ29sdW1uIGdldFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldE92ZXJyaWRkZW5TcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgb3ZlcnJpZGRlblN0cmF0ZWd5ID0gdGhpcy5nZXRPdmVycmlkZGVuU3RyYXRlZ3koKTsKLQkJcmV0dXJuIChvdmVycmlkZGVuU3RyYXRlZ3kgPT0gbnVsbCkgPwotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxSZWFkT25seUpvaW5Db2x1bW4+aW5zdGFuY2UoKSA6Ci0JCQkJbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seUpvaW5Db2x1bW4+KG92ZXJyaWRkZW5TdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhVmlydHVhbEpvaW5Db2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChSZWFkT25seUpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5idWlsZEpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRPdmVycmlkZGVuU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJlYWRPbmx5Sm9pbkNvbHVtbiBnZXRSZXNvdXJjZUVsZW1lbnQoSmF2YVZpcnR1YWxKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFWaXJ0dWFsSm9pbkNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIoKXsKLQkJcmV0dXJuIG5ldyBTcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEpvaW5Db2x1bW4oSmF2YVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJSmF2YVZpcnR1YWxKb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4gZ2V0RGVmYXVsdEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEphdmFWaXJ0dWFsSm9pbkNvbHVtbj4odGhpcy5kZWZhdWx0Sm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxKYXZhVmlydHVhbEpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlSZWFkT25seUpvaW5Db2x1bW4gb3ZlcnJpZGRlbkRlZmF1bHRKb2luQ29sdW1uID0gdGhpcy5nZXRPdmVycmlkZGVuRGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJaWYgKG92ZXJyaWRkZW5EZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbihudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSAmJiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbi5nZXRPdmVycmlkZGVuQ29sdW1uKCkgPT0gb3ZlcnJpZGRlbkRlZmF1bHRKb2luQ29sdW1uKSkgewotCQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0RGVmYXVsdEpvaW5Db2x1bW4odGhpcy5idWlsZEpvaW5Db2x1bW4ob3ZlcnJpZGRlbkRlZmF1bHRKb2luQ29sdW1uKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZE9ubHlKb2luQ29sdW1uIGdldE92ZXJyaWRkZW5EZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgb3ZlcnJpZGRlblN0cmF0ZWd5ID0gdGhpcy5nZXRPdmVycmlkZGVuU3RyYXRlZ3koKTsKLQkJcmV0dXJuIChvdmVycmlkZGVuU3RyYXRlZ3kgPT0gbnVsbCkgPyBudWxsIDogb3ZlcnJpZGRlblN0cmF0ZWd5LmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldE92ZXJyaWRkZW5TdHJhdGVneSgpIHsKLQkJUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA9IHRoaXMuZ2V0T3ZlcnJpZGRlbkpvaW5Db2x1bW5SZWxhdGlvbnNoaXAoKTsKLQkJcmV0dXJuIChyZWxhdGlvbnNoaXAgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgZ2V0T3ZlcnJpZGRlbkpvaW5Db2x1bW5SZWxhdGlvbnNoaXAoKSB7Ci0JCVJlYWRPbmx5UmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCA9IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKTsKLQkJcmV0dXJuIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXApID8gKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgcmVsYXRpb25zaGlwIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRGb3JlaWduS2V5KCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQkJcmV0dXJuIChyZWxhdGlvbnNoaXBNYXBwaW5nICE9IG51bGwpICYmCi0JCQkJcmVsYXRpb25zaGlwTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5pc1RhcmdldEZvcmVpZ25LZXkoKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwU291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJLy8gcmVsYXRpb25zaGlwIG1hcHBpbmcgaXMgbm90IG51bGwKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYXJnZXRGb3JlaWduS2V5KCkgPwotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKSA6Ci0JCQkJLy8gcmVsYXRpb25zaGlwIG1hcHBpbmcgbWF5IHN0aWxsIGJlIG51bGwKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmdUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZ1RhcmdldEVudGl0eSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiBtYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXRFbnRpdHkoKSB7Ci0JCVR5cGVNYXBwaW5nIHRhcmdldCA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0JCXJldHVybiAodGFyZ2V0IGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHRhcmdldCA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJdGhpcy5nZXRUYXJnZXREZWZhdWx0VGFibGVOYW1lKCkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IHR5cGVNYXBwaW5nLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5pc1RhcmdldEZvcmVpZ25LZXkoKSA/Ci0JCQkJdGhpcy5yZXNvbHZlVGFyZ2V0RGJUYWJsZSh0YWJsZU5hbWUpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlIHJlc29sdmVUYXJnZXREYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IHR5cGVNYXBwaW5nLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYXJnZXRGb3JlaWduS2V5KCkgPwotCQkJCXRoaXMudGFyZ2V0VGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSkgOgotCQkJCXRoaXMuZ2V0UmVsYXRpb25zaGlwKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFyZ2V0VGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nICE9IG51bGwpICYmIHR5cGVNYXBwaW5nLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJVHlwZU1hcHBpbmcgcmVsYXRpb25zaGlwVGFyZ2V0ID0gdGhpcy5nZXRSZWxhdGlvbnNoaXBUYXJnZXQoKTsKLQkJcmV0dXJuIChyZWxhdGlvbnNoaXBUYXJnZXQgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwVGFyZ2V0LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuaXNUYXJnZXRGb3JlaWduS2V5KCkgPwotCQkJCXRoaXMuZ2V0VGFyZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIDoKLQkJCQl0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRUYXJnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgPyB0eXBlTWFwcGluZy5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsSm9pbkNvbHVtbiBidWlsZEpvaW5Db2x1bW4oUmVhZE9ubHlKb2luQ29sdW1uIG92ZXJyaWRkZW5Kb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFWaXJ0dWFsSm9pbkNvbHVtbih0aGlzLCB0aGlzLmpvaW5Db2x1bW5Pd25lciwgb3ZlcnJpZGRlbkpvaW5Db2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCWZvciAoSmF2YVZpcnR1YWxKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB0aGlzLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCWpvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbiBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHJvdGVjdGVkIEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldEF0dHJpYnV0ZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0UmVsYXRpb25zaGlwVGFyZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCQl9Ci0KLQkJcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LnRoaXMuZ2V0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kudGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5idWlsZENvbHVtblZhbGlkYXRvcigoUmVhZE9ubHlCYXNlQ29sdW1uKSBjb2x1bW4sIHRoaXMsIChUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczZDBjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAKLXsKLQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneTsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1uU3RyYXRlZ3k7Ci0KLQkvLyBKUEEgMi4wCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pblRhYmxlU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcChKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFN0cmF0ZWd5KHRoaXMuYnVpbGRTdHJhdGVneSgpKTsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kudXBkYXRlKCk7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdHJhdGVneShKYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5KSB7Ci0JCUphdmFWaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kgb2xkID0gdGhpcy5zdHJhdGVneTsKLQkJdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmJ1aWxkU3RyYXRlZ3kyXzAoKSA6Ci0JCQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogVGhlIG92ZXJyaWRkZW4gbWFwcGluZyBkZXRlcm1pbmVzIHRoZSBvdmVycmlkZSdzIHN0cmF0ZWd5LgotCSAqLwotCXByb3RlY3RlZCBKYXZhVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkU3RyYXRlZ3kyXzAoKSB7Ci0JCU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBtYXBwaW5nU3RyYXRlZ3kgPSB0aGlzLmdldE1hcHBpbmdTdHJhdGVneSgpOwotCQlyZXR1cm4gKG1hcHBpbmdTdHJhdGVneSAhPSBudWxsKSA/Ci0JCQkJKEphdmFWaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kpIG1hcHBpbmdTdHJhdGVneS5zZWxlY3RPdmVycmlkZVN0cmF0ZWd5KHRoaXMpIDoKLQkJCQl0aGlzLmJ1aWxkTWlzc2luZ01hcHBpbmdTdHJhdGVneSgpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgc3RyYXRlZ3kgZnJvbSB0aGUgb3ZlcnJpZGRlbiBtYXBwaW5nLgotCSAqLwotCXByb3RlY3RlZCBNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAgZ2V0TWFwcGluZ1N0cmF0ZWd5KCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIG1hcHBpbmcgPSB0aGlzLmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwpID8gbnVsbCA6IChNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0U3RyYXRlZ3koKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0cmF0ZWd5IHRvIHVzZSB3aGVuIHRoZSBvdmVycmlkZSdzIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlCi0JICogbmFtZSBvZiBhbiBhcHByb3ByaWF0ZSByZWxhdGlvbnNoaXAgbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZE1pc3NpbmdNYXBwaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8KLQkJCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneSA6Ci0JCQkJdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXlIYXZlRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCS8vIGFzc29jaWF0aW9uIG92ZXJyaWRlcyBkbyBub3QgaGF2ZSBkZWZhdWx0cwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdHJhdGVneUlzSm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgewotCQkvLyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgZG8gbm90IGhhdmUgZGVmYXVsdHMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkSm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFWaXJ0dWFsT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKHRoaXMpOwotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPblNwZWNpZmllZChPdmVycmlkZVJlbGF0aW9uc2hpcCBzcGVjaWZpZWRSZWxhdGlvbnNoaXApIHsKLQkJc3BlY2lmaWVkUmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAodGhpcyk7Ci0JCXNwZWNpZmllZFJlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUyXzAgZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMCgpIHsKLQkJcmV0dXJuIChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUyXzApIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIE93bmVyIG93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5idWlsZENvbHVtblZhbGlkYXRvcihjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5UmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy5zdHJhdGVneS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMCgpLmJ1aWxkSm9pblRhYmxlVmFsaWRhdG9yKHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMCgpLmJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiNWMwODAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQKLQlleHRlbmRzIEFic3RyYWN0SmF2YVJlYWRPbmx5VW5pcXVlQ29uc3RyYWludAotCWltcGxlbWVudHMgSmF2YVZpcnR1YWxVbmlxdWVDb25zdHJhaW50Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludCBvdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludDsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IG92ZXJyaWRkZW5VbmlxdWVDb25zdHJhaW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMub3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQgPSBvdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc3luY0NvbHVtbk5hbWVzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFJlYWRPbmx5VW5pcXVlQ29uc3RyYWludCBnZXRPdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UmVzb3VyY2VDb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMub3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQuZ2V0Q29sdW1uTmFtZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvSmF2YUVsZW1lbnRDb2xsZWN0aW9uVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0OTQ2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLQotcHVibGljIGNsYXNzIEphdmFFbGVtZW50Q29sbGVjdGlvblRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcgotewotCi0JcHVibGljIEphdmFFbGVtZW50Q29sbGVjdGlvblRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yKFRlbXBvcmFsQ29udmVydGVyIGNvbnZlcnRlciwgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY29udmVydGVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBzdXBlci5nZXRBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnZhbGlkVGVtcG9yYWxNYXBwaW5nVHlwZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fSU5WQUxJRF9WQUxVRV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZUludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9KYXZhVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0phdmFUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzcyYzE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL0phdmFUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEphdmFUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IKLXsKLQotCXB1YmxpYyBKYXZhVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IoVGVtcG9yYWxDb252ZXJ0ZXIgY29udmVydGVyLCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcihjb252ZXJ0ZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQUElOR19UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZUludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQUElOR19UWVBFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvTnVsbEphdmFDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL051bGxKYXZhQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZDFiYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvTnVsbEphdmFDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotCi1wdWJsaWMgY2xhc3MgTnVsbEphdmFDb252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlCi0JaW1wbGVtZW50cyBKYXZhQ29udmVydGVyCi17Ci0JcHVibGljIE51bGxKYXZhQ29udmVydGVyKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBnZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9OdWxsSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvTnVsbEphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZmQ2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvamF2YS9OdWxsSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcCNidWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpfQotICogaW4gYSBKUEEgMS4wIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wCi17Ci0JcHVibGljIE51bGxKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KEphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS48SmF2YUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS48SmF2YUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdCBqb2luIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IG9sZFN0cmF0ZWd5KSB7Ci0JCS8vIE5PUAotCX0KLQotCXB1YmxpYyBSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHNlbGVjdE92ZXJyaWRlU3RyYXRlZ3koUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBvdmVycmlkZVJlbGF0aW9uc2hpcCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJhdGVneSgpIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7Ci0JCS8vIE5PUAotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRhYmxlTm90VmFsaWREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvTnVsbEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L2phdmEvTnVsbEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDdhOTNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9qYXZhL051bGxKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi1wdWJsaWMgY2xhc3MgTnVsbEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLXsKLQlwdWJsaWMgTnVsbEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneShKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEpvaW5UYWJsZUFubm90YXRpb24gZ2V0Sm9pblRhYmxlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pblRhYmxlUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBvbGRTdHJhdGVneSkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSB2aXJ0dWFsU3RyYXRlZ3kpIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZURlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneSBzZWxlY3RPdmVycmlkZVN0cmF0ZWd5KFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgb3ZlcnJpZGVSZWxhdGlvbnNoaXApIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkU3RyYXRlZ3koKSB7Ci0JCS8vIE5PUAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmF0ZWd5KCkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1Db252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0NTdmMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1Db252ZXJ0ZXIKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUNvbnZlcnRlcgotewotCXByb3RlY3RlZCBmaW5hbCBPcm1Db252ZXJ0ZXIuT3duZXIgb3duZXI7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1Db252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9ybUNvbnZlcnRlci5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlci5Pd25lciBnZXRPd25lcigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1BdHRyaWJ1dGVNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sQXR0cmlidXRlTWFwcGluZyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy5vd25lci5idWlsZFZhbGlkYXRvcih0aGlzLCB0aGlzLmJ1aWxkQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIoKSkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciBidWlsZENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyKCkgewotCQkJcHVibGljIFRleHRSYW5nZSBnZXRDb252ZXJ0ZXJUZXh0UmFuZ2UoKSB7Ci0JCQkJcmV0dXJuIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBUZXh0UmFuZ2UgZ2V0WG1sVmFsaWRhdGlvblRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTJmMWIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1OYW1lZERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG5hbWVkIGRpc2NyaW1pbmF0b3IgY29sdW1uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbjxYIGV4dGVuZHMgWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4sIE8gZXh0ZW5kcyBPcm1SZWFkT25seU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbi5Pd25lcj4KLQlleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48WCwgTz4KLQlpbXBsZW1lbnRzIE9ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbgotewotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBzcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQlwcm90ZWN0ZWQgRGlzY3JpbWluYXRvclR5cGUgZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOwotCXByb3RlY3RlZCBpbnQgZGVmYXVsdExlbmd0aDsKLQotCi0JcHJvdGVjdGVkIEFic3RyYWN0T3JtTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgTyBvd25lcikgewotCQl0aGlzKHBhcmVudCwgb3duZXIsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU5hbWVkRGlzY3JpbWluYXRvckNvbHVtbihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE8gb3duZXIsIFggeG1sQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIHhtbENvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRMZW5ndGggPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTGVuZ3RoKCk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTGVuZ3RoXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTGVuZ3RoKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKHRoaXMuYnVpbGREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdExlbmd0aCh0aGlzLmJ1aWxkRGVmYXVsdExlbmd0aCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGlzY3JpbWluYXRvciB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA6IHRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlOwotCX0KLQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUsIGRpc2NyaW1pbmF0b3JUeXBlKSkgewotCQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8oZGlzY3JpbWluYXRvclR5cGUpOwotCQkJeG1sQ29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLnRvT3JtUmVzb3VyY2VNb2RlbChkaXNjcmltaW5hdG9yVHlwZSkpOwotCQkJdGhpcy5yZW1vdmVYbWxDb2x1bW5JZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZV8oRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGJ1aWxkU3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCVggeG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuICh4bWxDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogRGlzY3JpbWluYXRvclR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoeG1sQ29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCX0KLQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHREaXNjcmltaW5hdG9yVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5kZWZhdWx0RGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuZGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlID0gZGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBkaXNjcmltaW5hdG9yVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGVuZ3RoICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTGVuZ3RoICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRMZW5ndGguaW50VmFsdWUoKSA6IHRoaXMuZGVmYXVsdExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlciBsZW5ndGgpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkTGVuZ3RoLCBsZW5ndGgpKSB7Ci0JCQlYIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aF8obGVuZ3RoKTsKLQkJCXhtbENvbHVtbi5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ29sdW1uSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoXyhJbnRlZ2VyIGxlbmd0aCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZExlbmd0aCgpIHsKLQkJWCB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbigpOwotCQlyZXR1cm4gKHhtbENvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB4bWxDb2x1bW4uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRMZW5ndGgoaW50IGRlZmF1bHRMZW5ndGgpIHsKLQkJaW50IG9sZCA9IHRoaXMuZGVmYXVsdExlbmd0aDsKLQkJdGhpcy5kZWZhdWx0TGVuZ3RoID0gZGVmYXVsdExlbmd0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTEVOR1RIX1BST1BFUlRZLCBvbGQsIGRlZmF1bHRMZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXREZWZhdWx0TGVuZ3RoKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvdXJjZVNwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVjMDgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIFNwZWNpZmllZCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvdmVycmlkZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1PdmVycmlkZTxDIGV4dGVuZHMgT3JtT3ZlcnJpZGVDb250YWluZXIsIFggZXh0ZW5kcyBYbWxPdmVycmlkZT4KLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybU92ZXJyaWRlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFggeG1sT3ZlcnJpZGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU92ZXJyaWRlKEMgcGFyZW50LCBYIHhtbE92ZXJyaWRlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sT3ZlcnJpZGUgPSB4bWxPdmVycmlkZTsKLQkJdGhpcy5uYW1lID0geG1sT3ZlcnJpZGUuZ2V0TmFtZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMueG1sT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLnNldE5hbWVfKG5hbWUpOwotCQl0aGlzLnhtbE92ZXJyaWRlLnNldE5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZC92aXJ0dWFsICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBPcm1WaXJ0dWFsT3ZlcnJpZGUgY29udmVydFRvVmlydHVhbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuY29udmVydE92ZXJyaWRlVG9WaXJ0dWFsKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBDIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChDKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQyBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBYIGdldFhtbE92ZXJyaWRlKCkgewotCQlyZXR1cm4gdGhpcy54bWxPdmVycmlkZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seU92ZXJyaWRlIG9sZE92ZXJyaWRlKSB7Ci0JCXRoaXMuc2V0TmFtZShvbGRPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seU92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSkgewotCQl0aGlzLnNldE5hbWUodmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgT3duZXIgb3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuYnVpbGRDb2x1bW5WYWxpZGF0b3IodGhpcywgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmJ1aWxkVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5idWlsZE92ZXJyaWRlVmFsaWRhdG9yKHRoaXMsIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyI2dldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCSAqLwotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMueG1sT3ZlcnJpZGUuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQkvLyBza2lwIHRoZSBjb250YWluZXIgc2luY2UgaXQgcmVhbGx5IGRvZXNuJ3QgaGF2ZSBhIHRleHQgcmFuZ2UKLQkJLy8gKGFsc28sIHRoaXMgcHJldmVudHMgYSBzdGFjayBvdmVyZmxvdykKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldENvbnRhaW5lcigpLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxPdmVycmlkZS5nZXROYW1lVGV4dFJhbmdlKCkpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9BYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtT3ZlcnJpZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxN2I0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtT3ZlcnJpZGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlXzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbE92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuQ29udGV4dENvbnRhaW5lclRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvdmVycmlkZSBjb250YWluZXIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtT3ZlcnJpZGVDb250YWluZXI8Ci0JCQlPIGV4dGVuZHMgT3JtT3ZlcnJpZGVDb250YWluZXIuT3duZXIsCi0JCQlSIGV4dGVuZHMgT3JtUmVhZE9ubHlPdmVycmlkZSwKLQkJCVMgZXh0ZW5kcyBPcm1PdmVycmlkZSwKLQkJCVYgZXh0ZW5kcyBPcm1WaXJ0dWFsT3ZlcnJpZGUsCi0JCQlYIGV4dGVuZHMgWG1sT3ZlcnJpZGUKLQkJPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtT3ZlcnJpZGVDb250YWluZXIKLXsKLQkvLyB0aGlzIGNhbiBiZSBudWxsIGlmIHRoZSBjb250YWluZXIgaXMgInJlYWQtb25seSIgKGkuZS4gYSAibnVsbCIgY29udGFpbmVyKQotCXByb3RlY3RlZCBmaW5hbCBPIG93bmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIFZlY3RvcjxTPiBzcGVjaWZpZWRPdmVycmlkZXMgPSBuZXcgVmVjdG9yPFM+KCk7Ci0JcHJvdGVjdGVkIGZpbmFsIFNwZWNpZmllZE92ZXJyaWRlQ29udGFpbmVyQWRhcHRlciBzcGVjaWZpZWRPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIgPSBuZXcgU3BlY2lmaWVkT3ZlcnJpZGVDb250YWluZXJBZGFwdGVyKCk7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgVmVjdG9yPFY+IHZpcnR1YWxPdmVycmlkZXMgPSBuZXcgVmVjdG9yPFY+KCk7Ci0JcHJvdGVjdGVkIGZpbmFsIFZpcnR1YWxPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIgdmlydHVhbE92ZXJyaWRlQ29udGFpbmVyQWRhcHRlciA9IG5ldyBWaXJ0dWFsT3ZlcnJpZGVDb250YWluZXJBZGFwdGVyKCk7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyKFhtbENvbnRleHROb2RlIHBhcmVudCwgTyBvd25lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZE92ZXJyaWRlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNTcGVjaWZpZWRPdmVycmlkZXMoKTsKLQkJLy8gdGhlIHZpcnR1YWwgb3ZlcnJpZGVzIGRvIG5vdCBuZWVkIGEgc3luYwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKSk7Ci0JCXRoaXMudXBkYXRlVmlydHVhbE92ZXJyaWRlcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvdmVycmlkZXMgKioqKioqKioqKgotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3RJdGVyYWJsZTxSPiBnZXRPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdEl0ZXJhYmxlPFI+KHRoaXMuZ2V0UmVhZE9ubHlTcGVjaWZpZWRPdmVycmlkZXMoKSwgdGhpcy5nZXRSZWFkT25seVZpcnR1YWxPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRPdmVycmlkZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPdmVycmlkZXMuc2l6ZSgpICsgdGhpcy52aXJ0dWFsT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgUiBnZXRPdmVycmlkZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdE92ZXJyaWRlTmFtZWQodGhpcy5nZXRPdmVycmlkZXMoKSwgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlIGNvbnZlcnNpb25zICoqKioqKioqKioKLQotCS8qKgotCSAqIDxlbT5TaWxlbnRseTwvZW0+IGFkZCB0aGUgbmV3IHZpcnR1YWwgb3ZlcnJpZGUgYmVmb3JlIHJlbW92aW5nIHRoZQotCSAqIHNwZWNpZmllZCBvdmVycmlkZSwgb3IgdGhlIDxlbT51cGRhdGU8L2VtPiB3aWxsIGRpc2NvdmVyIHRoZSBtaXNzaW5nCi0JICogdmlydHVhbCBvdmVycmlkZSBhbmQgYWRkIGl0IHByZWVtcHRpdmVseS4KLQkgKi8KLQlwdWJsaWMgViBjb252ZXJ0T3ZlcnJpZGVUb1ZpcnR1YWwoT3ZlcnJpZGVfIG92ZXJyaWRlKSB7Ci0JCWlmIChvdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcnJpZGUgaXMgYWxyZWFkeSB2aXJ0dWFsOiAiICsgb3ZlcnJpZGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJUyBzcGVjaWZpZWRPdmVycmlkZSA9IChTKSBvdmVycmlkZTsKLQkJaW50IHZpcnR1YWxJbmRleCA9IHRoaXMudmlydHVhbE92ZXJyaWRlcy5zaXplKCk7Ci0JCVN0cmluZyBvdmVycmlkZU5hbWUgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXROYW1lKCk7Ci0JCVYgdmlydHVhbE92ZXJyaWRlID0gbnVsbDsKLQkJLy8gbWFrZSBzdXJlIHRoZSBzcGVjaWZpZWQgb3ZlcnJpZGUgYWN0dWFsbHkgb3ZlcnJpZGVzIHNvbWV0aGluZyBiZWZvcmUgYnVpbGRpbmcgdGhlIHZpcnR1YWwgb3ZlcnJpZGUKLQkJaWYgKHRoaXMub3ZlcnJpZGVXaWxsQmVWaXJ0dWFsKG92ZXJyaWRlTmFtZSwgc3BlY2lmaWVkT3ZlcnJpZGUpKSB7Ci0JCQl2aXJ0dWFsT3ZlcnJpZGUgPSB0aGlzLmJ1aWxkVmlydHVhbE92ZXJyaWRlKG92ZXJyaWRlTmFtZSk7Ci0JCQl0aGlzLnZpcnR1YWxPdmVycmlkZXMuYWRkKHZpcnR1YWxJbmRleCwgdmlydHVhbE92ZXJyaWRlKTsKLQkJfQotCi0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoc3BlY2lmaWVkT3ZlcnJpZGUpOyAgLy8gdHJpZ2dlciB1cGRhdGUKLQotCQlpZiAodmlydHVhbE92ZXJyaWRlICE9IG51bGwpIHsKLQkJCXRoaXMuZmlyZUl0ZW1BZGRlZChWSVJUVUFMX09WRVJSSURFU19MSVNULCB2aXJ0dWFsSW5kZXgsIHZpcnR1YWxPdmVycmlkZSk7Ci0JCX0KLQkJcmV0dXJuIHZpcnR1YWxPdmVycmlkZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG92ZXJyaWRlIG5hbWUgd2lsbCBiZSBhCi0JICogPGVtPnZpcnR1YWw8L2VtPiBvdmVycmlkZSB3aGVuIHRoZSBzcGVjaWZpZWQgc3BlY2lmaWVkIG92ZXJyaWRlIGlzCi0JICogcmVtb3ZlZCBmcm9tIHRoZSBjb250YWluZXIuIFRoZSBvdmVycmlkZSBuYW1lIG11c3QgYmUgYW1vbmcgdGhlCi0JICogdmFsaWQgb3ZlcnJpZGUgbmFtZXMgYW5kIGl0IG11c3Qgbm90IGNvcnJlc3BvbmQgdG8gYW55IG9mIHRoZQotCSAqIHJlbWFpbmluZyBzcGVjaWZpZWQgb3ZlcnJpZGVzLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG92ZXJyaWRlV2lsbEJlVmlydHVhbChTdHJpbmcgb3ZlcnJpZGVOYW1lLCBTIHNwZWNpZmllZE92ZXJyaWRlVG9CZVJlbW92ZWQpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmdldFBvc3NpYmxlVmlydHVhbE92ZXJyaWRlTmFtZXMoKSwgb3ZlcnJpZGVOYW1lKSAmJgotCQkJCSh0aGlzLmdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQob3ZlcnJpZGVOYW1lLCBzcGVjaWZpZWRPdmVycmlkZVRvQmVSZW1vdmVkKSA9PSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiA8ZW0+U2lsZW50bHk8L2VtPiByZW1vdmUgdGhlIHZpcnR1YWwgb3ZlcnJpZGUgYW5kIGFkZCB0aGUgbmV3IHNwZWNpZmllZAotCSAqIG92ZXJyaWRlIGJlZm9yZSBuYW1pbmcgdGhlIHNwZWNpZmllZCBvdmVycmlkZSwgb3IgdGhlIDxlbT51cGRhdGU8L2VtPgotCSAqIHdpbGwgZGlzY292ZXIgdGhlIGRhbmdsaW5nIHZpcnR1YWwgb3ZlcnJpZGUgYW5kIHJlbW92ZSBpdCBwcmVlbXB0aXZlbHkuCi0JICovCi0JcHVibGljIFMgY29udmVydE92ZXJyaWRlVG9TcGVjaWZpZWQoVmlydHVhbE92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCWlmICggISBvdmVycmlkZS5pc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3ZlcnJpZGUgaXMgYWxyZWFkeSBzcGVjaWZpZWQ6ICIgKyBvdmVycmlkZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlWIHZpcnR1YWxPdmVycmlkZSA9IChWKSBvdmVycmlkZTsKLQkJaW50IHZpcnR1YWxJbmRleCA9IHRoaXMudmlydHVhbE92ZXJyaWRlcy5pbmRleE9mKHZpcnR1YWxPdmVycmlkZSk7Ci0JCXRoaXMudmlydHVhbE92ZXJyaWRlcy5yZW1vdmUodmlydHVhbEluZGV4KTsKLQotCQlpbnQgc3BlY2lmaWVkSW5kZXggPSB0aGlzLnNwZWNpZmllZE92ZXJyaWRlcy5zaXplKCk7Ci0JCVggeG1sT3ZlcnJpZGUgPSB0aGlzLmJ1aWxkWG1sT3ZlcnJpZGUoKTsKLQkJUyBzcGVjaWZpZWRPdmVycmlkZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRPdmVycmlkZSh4bWxPdmVycmlkZSk7Ci0JCXRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLmFkZChzcGVjaWZpZWRJbmRleCwgc3BlY2lmaWVkT3ZlcnJpZGUpOwotCQl0aGlzLm93bmVyLmdldFhtbE92ZXJyaWRlcygpLmFkZChzcGVjaWZpZWRJbmRleCwgeG1sT3ZlcnJpZGUpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZVNwZWNpZmllZE92ZXJyaWRlKHNwZWNpZmllZE92ZXJyaWRlLCB2aXJ0dWFsT3ZlcnJpZGUpOyAgLy8gdHJpZ2dlciB1cGRhdGUKLQotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChWSVJUVUFMX09WRVJSSURFU19MSVNULCB2aXJ0dWFsSW5kZXgsIHZpcnR1YWxPdmVycmlkZSk7Ci0JCXRoaXMuZmlyZUl0ZW1BZGRlZChTUEVDSUZJRURfT1ZFUlJJREVTX0xJU1QsIHNwZWNpZmllZEluZGV4LCBzcGVjaWZpZWRPdmVycmlkZSk7Ci0JCXJldHVybiBzcGVjaWZpZWRPdmVycmlkZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplU3BlY2lmaWVkT3ZlcnJpZGUoUyBzcGVjaWZpZWRPdmVycmlkZSwgViB2aXJ0dWFsT3ZlcnJpZGUpOwotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBvdmVycmlkZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxTPiBnZXRTcGVjaWZpZWRPdmVycmlkZXMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFM+KHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFI+IGdldFJlYWRPbmx5U3BlY2lmaWVkT3ZlcnJpZGVzKCkgewotCQkvLyBTIHNob3VsZCBhbHdheXMgYmUgYSBzdWJ0eXBlIG9mIFIsIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQgaW4gdGhlCi0JCS8vIGNsYXNzIGRlY2xhcmF0aW9uLi4uCi0JCXJldHVybiAoTGlzdEl0ZXJhYmxlPFI+KSB0aGlzLmdldFNwZWNpZmllZE92ZXJyaWRlcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgUyBnZXRTcGVjaWZpZWRPdmVycmlkZShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIFMgZ2V0U3BlY2lmaWVkT3ZlcnJpZGVOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKG5hbWUsIG51bGwpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBTIGdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoU3RyaW5nIG5hbWUsIFMgZXhjbHVkZSkgewotCQlyZXR1cm4gKFMpIHRoaXMuc2VsZWN0T3ZlcnJpZGVOYW1lZCh0aGlzLmdldFJlYWRPbmx5U3BlY2lmaWVkT3ZlcnJpZGVzKCksIG5hbWUsIGV4Y2x1ZGUpOwotCX0KLQotCXByb3RlY3RlZCBTIGFkZFNwZWNpZmllZE92ZXJyaWRlKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRPdmVycmlkZSh0aGlzLnNwZWNpZmllZE92ZXJyaWRlcy5zaXplKCkpOwotCX0KLQotCXByb3RlY3RlZCBTIGFkZFNwZWNpZmllZE92ZXJyaWRlKGludCBpbmRleCkgewotCQlYIHhtbE92ZXJyaWRlID0gdGhpcy5idWlsZFhtbE92ZXJyaWRlKCk7Ci0JCVMgb3ZlcnJpZGUgPSB0aGlzLmFkZFNwZWNpZmllZE92ZXJyaWRlXyhpbmRleCwgeG1sT3ZlcnJpZGUpOwotCQl0aGlzLm93bmVyLmdldFhtbE92ZXJyaWRlcygpLmFkZChpbmRleCwgeG1sT3ZlcnJpZGUpOwotCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFggYnVpbGRYbWxPdmVycmlkZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoUyBvdmVycmlkZSkgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZE92ZXJyaWRlKHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLmluZGV4T2Yob3ZlcnJpZGUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVTcGVjaWZpZWRPdmVycmlkZShpbnQgaW5kZXgpIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRPdmVycmlkZV8oaW5kZXgpOwotCQl0aGlzLm93bmVyLmdldFhtbE92ZXJyaWRlcygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGVfKGludCBpbmRleCkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChpbmRleCwgdGhpcy5zcGVjaWZpZWRPdmVycmlkZXMsIFNQRUNJRklFRF9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZE92ZXJyaWRlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZUl0ZW1Jbkxpc3QodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCB0aGlzLnNwZWNpZmllZE92ZXJyaWRlcywgU1BFQ0lGSUVEX09WRVJSSURFU19MSVNUKTsKLQkJdGhpcy5vd25lci5nZXRYbWxPdmVycmlkZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZE92ZXJyaWRlcygpIHsKLQkJZm9yIChYIHhtbE92ZXJyaWRlIDogdGhpcy5nZXRYbWxPdmVycmlkZXMoKSkgewotCQkJdGhpcy5zcGVjaWZpZWRPdmVycmlkZXMuYWRkKHRoaXMuYnVpbGRTcGVjaWZpZWRPdmVycmlkZSh4bWxPdmVycmlkZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFMgYnVpbGRTcGVjaWZpZWRPdmVycmlkZShYIHhtbE92ZXJyaWRlKTsKLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTcGVjaWZpZWRPdmVycmlkZXMoKSB7Ci0JCUNvbnRleHRDb250YWluZXJUb29scy5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVDb250YWluZXJBZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8WD4gZ2V0WG1sT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gKHRoaXMub3duZXIgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhYmxlLjxYPmluc3RhbmNlKCkgOiB0aGlzLmdldFhtbE92ZXJyaWRlc18oKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiB7QGxpbmsgI293bmVyfSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8WD4gZ2V0WG1sT3ZlcnJpZGVzXygpOwotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVNwZWNpZmllZE92ZXJyaWRlXyhpbnQgaW5kZXgsIFMgb3ZlcnJpZGUpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgb3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLCBTUEVDSUZJRURfT1ZFUlJJREVTX0xJU1QpOwotCX0KLQotCXByb3RlY3RlZCBTIGFkZFNwZWNpZmllZE92ZXJyaWRlXyhpbnQgaW5kZXgsIFggeG1sT3ZlcnJpZGUpIHsKLQkJUyBvdmVycmlkZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRPdmVycmlkZSh4bWxPdmVycmlkZSk7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgb3ZlcnJpZGUsIHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLCBTUEVDSUZJRURfT1ZFUlJJREVTX0xJU1QpOwotCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGVfKFMgb3ZlcnJpZGUpIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRPdmVycmlkZV8odGhpcy5zcGVjaWZpZWRPdmVycmlkZXMuaW5kZXhPZihvdmVycmlkZSkpOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBvdmVycmlkZSBjb250YWluZXIgYWRhcHRlcgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBTcGVjaWZpZWRPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBDb250ZXh0Q29udGFpbmVyVG9vbHMuQWRhcHRlcjxTLCBYPgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPFM+IGdldENvbnRleHRFbGVtZW50cygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyLnRoaXMuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCk7Ci0JCX0KLQkJcHVibGljIEl0ZXJhYmxlPFg+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1PdmVycmlkZUNvbnRhaW5lci50aGlzLmdldFhtbE92ZXJyaWRlcygpOwotCQl9Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlwdWJsaWMgWCBnZXRSZXNvdXJjZUVsZW1lbnQoUyBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIChYKSBjb250ZXh0RWxlbWVudC5nZXRYbWxPdmVycmlkZSgpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIG1vdmVDb250ZXh0RWxlbWVudChpbnQgaW5kZXgsIFMgZWxlbWVudCkgewotCQkJQWJzdHJhY3RPcm1PdmVycmlkZUNvbnRhaW5lci50aGlzLm1vdmVTcGVjaWZpZWRPdmVycmlkZV8oaW5kZXgsIGVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGFkZENvbnRleHRFbGVtZW50KGludCBpbmRleCwgWCByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCUFic3RyYWN0T3JtT3ZlcnJpZGVDb250YWluZXIudGhpcy5hZGRTcGVjaWZpZWRPdmVycmlkZV8oaW5kZXgsIHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29udGV4dEVsZW1lbnQoUyBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyLnRoaXMucmVtb3ZlU3BlY2lmaWVkT3ZlcnJpZGVfKGVsZW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZpcnR1YWwgb3ZlcnJpZGVzICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8Vj4gZ2V0VmlydHVhbE92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8Vj4odGhpcy52aXJ0dWFsT3ZlcnJpZGVzKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFI+IGdldFJlYWRPbmx5VmlydHVhbE92ZXJyaWRlcygpIHsKLQkJLy8gViBzaG91bGQgYWx3YXlzIGJlIGEgc3VidHlwZSBvZiBSLCBidXQgd2UgY2FuJ3QgZW5mb3JjZSB0aGF0IGluIHRoZQotCQkvLyBjbGFzcyBkZWNsYXJhdGlvbi4uLgotCQlyZXR1cm4gKExpc3RJdGVyYWJsZTxSPikgdGhpcy5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmlydHVhbE92ZXJyaWRlcy5zaXplKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmlydHVhbE92ZXJyaWRlcygpIHsKLQkJQ29udGV4dENvbnRhaW5lclRvb2xzLnVwZGF0ZSh0aGlzLnZpcnR1YWxPdmVycmlkZUNvbnRhaW5lckFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgb3ZlcnJpZGFibGUgbmFtZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgaW4gdGhlIGxpc3Qgb2YKLQkgKiBzcGVjaWZpZWQgb3ZlcnJpZGVzLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZpcnR1YWxPdmVycmlkZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRQb3NzaWJsZVZpcnR1YWxPdmVycmlkZU5hbWVzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBuYW1lKSB7Ci0JCQkJcmV0dXJuIEFic3RyYWN0T3JtT3ZlcnJpZGVDb250YWluZXIudGhpcy5vdmVycmlkZUlzVmlydHVhbChuYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBvdmVycmlkZUlzVmlydHVhbChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKG5hbWUpID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbW92ZVZpcnR1YWxPdmVycmlkZShpbnQgaW5kZXgsIFYgb3ZlcnJpZGUpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdChpbmRleCwgb3ZlcnJpZGUsIHRoaXMudmlydHVhbE92ZXJyaWRlcywgVklSVFVBTF9PVkVSUklERVNfTElTVCk7Ci0JfQotCi0JcHJvdGVjdGVkIFYgYWRkVmlydHVhbE92ZXJyaWRlKGludCBpbmRleCwgU3RyaW5nIG5hbWUpIHsKLQkJViBvdmVycmlkZSA9IHRoaXMuYnVpbGRWaXJ0dWFsT3ZlcnJpZGUobmFtZSk7Ci0JCXRoaXMuYWRkSXRlbVRvTGlzdChpbmRleCwgb3ZlcnJpZGUsIHRoaXMudmlydHVhbE92ZXJyaWRlcywgVklSVFVBTF9PVkVSUklERVNfTElTVCk7Ci0JCXJldHVybiBvdmVycmlkZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgViBidWlsZFZpcnR1YWxPdmVycmlkZShTdHJpbmcgbmFtZSk7Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVWaXJ0dWFsT3ZlcnJpZGUoViBvdmVycmlkZSkgewotCQl0aGlzLnJlbW92ZUl0ZW1Gcm9tTGlzdChvdmVycmlkZSwgdGhpcy52aXJ0dWFsT3ZlcnJpZGVzLCBWSVJUVUFMX09WRVJSSURFU19MSVNUKTsKLQl9Ci0KLQkvKioKLQkgKiB2aXJ0dWFsIG92ZXJyaWRlIGNvbnRhaW5lciBhZGFwdGVyCi0JICogTkI6IHRoZSBjb250ZXh0IG92ZXJyaWRlIGlzIG1hdGNoZWQgd2l0aCBhIHJlc291cmNlIG92ZXJyaWRlIGJ5IG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVmlydHVhbE92ZXJyaWRlQ29udGFpbmVyQWRhcHRlcgotCQlpbXBsZW1lbnRzIENvbnRleHRDb250YWluZXJUb29scy5BZGFwdGVyPFYsIFN0cmluZz4KLQl7Ci0JCXB1YmxpYyBJdGVyYWJsZTxWPiBnZXRDb250ZXh0RWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1PdmVycmlkZUNvbnRhaW5lci50aGlzLmdldFZpcnR1YWxPdmVycmlkZXMoKTsKLQkJfQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtT3ZlcnJpZGVDb250YWluZXIudGhpcy5nZXRWaXJ0dWFsT3ZlcnJpZGVOYW1lcygpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VFbGVtZW50KFYgY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgbW92ZUNvbnRleHRFbGVtZW50KGludCBpbmRleCwgViBlbGVtZW50KSB7Ci0JCQlBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyLnRoaXMubW92ZVZpcnR1YWxPdmVycmlkZShpbmRleCwgZWxlbWVudCk7Ci0JCX0KLQkJcHVibGljIHZvaWQgYWRkQ29udGV4dEVsZW1lbnQoaW50IGluZGV4LCBTdHJpbmcgcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyLnRoaXMuYWRkVmlydHVhbE92ZXJyaWRlKGluZGV4LCByZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHRFbGVtZW50KFYgZWxlbWVudCkgewotCQkJQWJzdHJhY3RPcm1PdmVycmlkZUNvbnRhaW5lci50aGlzLnJlbW92ZVZpcnR1YWxPdmVycmlkZShlbGVtZW50KTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbGwgdGhlIHBvc3NpYmxlIHZpcnR1YWwgb3ZlcnJpZGUgbmFtZXMuIElmIHdlIGhhdmUgYQotCSAqIGNvcnJlc3BvbmRpbmcgSmF2YSBlbnRpdHksIHRha2UgdGhlIG92ZXJyaWRlIG5hbWVzIGZyb20gaXQuIFRoaXMgYWxsb3dzCi0JICogdXMgdG8gaW5jbHVkZSBhbnkgSmF2YSBzcGVjaWZpZWQgb3ZlcnJpZGVzIHRoYXQgYXJlIGludmFsaWQgKGFuZAotCSAqIGdlbmVyYXRlIHRoZSBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlcykuIElmIHdlIGRvbid0IGhhdmUgYQotCSAqIGNvcnJlc3BvbmRpbmcgSmF2YSBlbnRpdHksIHRha2UgdGhlIG92ZXJyaWRlIG5hbWVzIGRpcmVjdGx5IGZyb20gdGhlCi0JICogdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRQb3NzaWJsZVZpcnR1YWxPdmVycmlkZU5hbWVzKCkgewotCQlpZiAodGhpcy5vd25lciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCUl0ZXJhYmxlPFN0cmluZz4gamF2YU5hbWVzID0gdGhpcy5vd25lci5nZXRKYXZhT3ZlcnJpZGVOYW1lcygpOwotCQlyZXR1cm4gKGphdmFOYW1lcyAhPSBudWxsKSA/IGphdmFOYW1lcyA6IHRoaXMub3duZXIuZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiAodGhpcy5vd25lciAhPSBudWxsKSA/IHRoaXMub3duZXIuZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5vd25lci5idWlsZE92ZXJyaWRlVmFsaWRhdG9yKG92ZXJyaWRlLCB0aGlzLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBSZWFkT25seUJhc2VDb2x1bW4uT3duZXIgY29sdW1uT3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuYnVpbGRDb2x1bW5WYWxpZGF0b3Iob3ZlcnJpZGUsIGNvbHVtbiwgY29sdW1uT3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUiBzZWxlY3RPdmVycmlkZU5hbWVkKEl0ZXJhYmxlPFI+IG92ZXJyaWRlcywgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0T3ZlcnJpZGVOYW1lZChvdmVycmlkZXMsIG5hbWUsIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBSIHNlbGVjdE92ZXJyaWRlTmFtZWQoSXRlcmFibGU8Uj4gb3ZlcnJpZGVzLCBTdHJpbmcgbmFtZSwgUyBleGNsdWRlKSB7Ci0JCWZvciAoUiBvdmVycmlkZSA6IG92ZXJyaWRlcykgewotCQkJaWYgKG92ZXJyaWRlID09IGV4Y2x1ZGUpIHsKLQkJCQljb250aW51ZTsgIC8vIHNraXAKLQkJCX0KLQkJCWlmICh0aGlzLnZhbHVlc0FyZUVxdWFsKG92ZXJyaWRlLmdldE5hbWUoKSwgbmFtZSkpIHsKLQkJCQlyZXR1cm4gb3ZlcnJpZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlmb3IgKFIgb3ZlcnJpZGUgOiB0aGlzLmdldE92ZXJyaWRlcygpKSB7Ci0JCQlvdmVycmlkZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkT3ZlcnJpZGVzLnNpemUoKSA+IDApID8KLQkJCQl0aGlzLnNwZWNpZmllZE92ZXJyaWRlcy5nZXQoMCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIDoKLQkJCQl0aGlzLm93bmVyLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U4ZTc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlCi0gKiA8YnI+Ci0gKiA8Y29kZT5wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPC9jb2RlPiBlbGVtZW50Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMAotewotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIHNwZWNpZmllZEFjY2VzczsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVBlcnNpc3Q7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWxpbWl0ZWRJZGVudGlmaWVyczsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQWNjZXNzKCk7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IHRoaXMuYnVpbGRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gdGhpcy5idWlsZFNwZWNpZmllZFNjaGVtYSgpOwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0ID0gdGhpcy5idWlsZENhc2NhZGVQZXJzaXN0KCk7Ci0JCXRoaXMuZGVsaW1pdGVkSWRlbnRpZmllcnMgPSB0aGlzLmJ1aWxkRGVsaW1pdGVkSWRlbnRpZmllcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRBY2Nlc3NfKHRoaXMuYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGhpcy5idWlsZFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyh0aGlzLmJ1aWxkU3BlY2lmaWVkU2NoZW1hKCkpOwotCQl0aGlzLnNldENhc2NhZGVQZXJzaXN0Xyh0aGlzLmJ1aWxkQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCXRoaXMuc2V0RGVsaW1pdGVkSWRlbnRpZmllcnNfKHRoaXMuYnVpbGREZWxpbWl0ZWRJZGVudGlmaWVycygpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhY2Nlc3MgKioqKioqKioqKgotCi0JcHVibGljIEFjY2Vzc1R5cGUgZ2V0QWNjZXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRBY2Nlc3MoKTsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQWNjZXNzVHlwZSBnZXRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkQWNjZXNzLCBhY2Nlc3MpKSB7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxEZWZhdWx0cyA9IHRoaXMuZ2V0WG1sRGVmYXVsdHNGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkQWNjZXNzXyhhY2Nlc3MpOwotCQkJeG1sRGVmYXVsdHMuc2V0QWNjZXNzKEFjY2Vzc1R5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKGFjY2VzcykpOwotCQkJdGhpcy5yZW1vdmVYbWxEZWZhdWx0c0lmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEFjY2Vzc18oQWNjZXNzVHlwZSBhY2Nlc3MpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEFjY2VzczsKLQkJdGhpcy5zcGVjaWZpZWRBY2Nlc3MgPSBhY2Nlc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZLCBvbGQsIGFjY2Vzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEFjY2Vzc1R5cGUgYnVpbGRTcGVjaWZpZWRBY2Nlc3MoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbERlZmF1bHRzID0gdGhpcy5nZXRYbWxEZWZhdWx0cygpOwotCQlyZXR1cm4gKHhtbERlZmF1bHRzID09IG51bGwpID8gbnVsbCA6IEFjY2Vzc1R5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoeG1sRGVmYXVsdHMuZ2V0QWNjZXNzKCksIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKSwgdGhpcy5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSBjb250YWluZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGNhdGFsb2cgKGkuZS4gd2UgZG9uJ3QgZXZlbiBoYXZlIGEgPGVtPmRlZmF1bHQ8L2VtPiBjYXRhbG9nKSwKLQkgKiB0aGVuIHRoZSBkYXRhYmFzZSBwcm9iYWJseSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzOyBhbmQgd2UgbmVlZCB0bwotCSAqIGdldCB0aGUgc2NoZW1hIGRpcmVjdGx5IGZyb20gdGhlIGRhdGFiYXNlLgotCSAqLwotCXB1YmxpYyBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXIoKSB7Ci0JCVN0cmluZyBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nKCk7Ci0JCXJldHVybiAoY2F0YWxvZyAhPSBudWxsKSA/IHRoaXMucmVzb2x2ZURiQ2F0YWxvZyhjYXRhbG9nKSA6IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRDYXRhbG9nLCBjYXRhbG9nKSkgewotCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgeG1sRGVmYXVsdHMgPSB0aGlzLmdldFhtbERlZmF1bHRzRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKGNhdGFsb2cpOwotCQkJeG1sRGVmYXVsdHMuc2V0Q2F0YWxvZyhjYXRhbG9nKTsKLQkJCXRoaXMucmVtb3ZlWG1sRGVmYXVsdHNJZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nXyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRDYXRhbG9nOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBjYXRhbG9nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbERlZmF1bHRzID0gdGhpcy5nZXRYbWxEZWZhdWx0cygpOwotCQlyZXR1cm4gKHhtbERlZmF1bHRzID09IG51bGwpID8gbnVsbCA6IHhtbERlZmF1bHRzLmdldENhdGFsb2coKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY2F0YWxvZyAoaS5lLiB3ZSBkb24ndCBldmVuIGhhdmUgYSA8ZW0+ZGVmYXVsdDwvZW0+Ci0JICogY2F0YWxvZyksIHRoZW4gdGhlIGRhdGFiYXNlIHByb2JhYmx5IGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JcHVibGljIENhdGFsb2cgZ2V0RGJDYXRhbG9nKCkgewotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q2F0YWxvZygpOwotCQlyZXR1cm4gKGNhdGFsb2cgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5yZXNvbHZlRGJDYXRhbG9nKGNhdGFsb2cpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2hlbWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjaGVtYSA6IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFNjaGVtYSwgc2NoZW1hKSkgewotCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgeG1sRGVmYXVsdHMgPSB0aGlzLmdldFhtbERlZmF1bHRzRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8oc2NoZW1hKTsKLQkJCXhtbERlZmF1bHRzLnNldFNjaGVtYShzY2hlbWEpOwotCQkJdGhpcy5yZW1vdmVYbWxEZWZhdWx0c0lmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbERlZmF1bHRzID0gdGhpcy5nZXRYbWxEZWZhdWx0cygpOwotCQlyZXR1cm4gKHhtbERlZmF1bHRzID09IG51bGwpID8gbnVsbCA6IHhtbERlZmF1bHRzLmdldFNjaGVtYSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldERiU2NoZW1hKCkgewotCQlTY2hlbWFDb250YWluZXIgZGJTY2hlbWFDb250YWluZXIgPSB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCXJldHVybiAoZGJTY2hlbWFDb250YWluZXIgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWFDb250YWluZXIuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FzY2FkZSBwZXJzaXN0ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVBlcnNpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGVQZXJzaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gY2FzY2FkZVBlcnNpc3QpIHsKLQkJaWYgKHRoaXMuY2FzY2FkZVBlcnNpc3QgIT0gY2FzY2FkZVBlcnNpc3QpIHsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbERlZmF1bHRzID0gdGhpcy5nZXRYbWxEZWZhdWx0c0ZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRDYXNjYWRlUGVyc2lzdF8oY2FzY2FkZVBlcnNpc3QpOwotCQkJeG1sRGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoY2FzY2FkZVBlcnNpc3QpOwotCQkJdGhpcy5yZW1vdmVYbWxEZWZhdWx0c0lmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldENhc2NhZGVQZXJzaXN0Xyhib29sZWFuIGNhc2NhZGVQZXJzaXN0KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5jYXNjYWRlUGVyc2lzdDsKLQkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IGNhc2NhZGVQZXJzaXN0OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZLCBvbGQsIGNhc2NhZGVQZXJzaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZENhc2NhZGVQZXJzaXN0KCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxEZWZhdWx0cyA9IHRoaXMuZ2V0WG1sRGVmYXVsdHMoKTsKLQkJcmV0dXJuICh4bWxEZWZhdWx0cyA9PSBudWxsKSA/IGZhbHNlIDogeG1sRGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWxpbWl0ZWQgaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpIHsKLQkJcmV0dXJuIHRoaXMuZGVsaW1pdGVkSWRlbnRpZmllcnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVsaW1pdGVkSWRlbnRpZmllcnMoYm9vbGVhbiBkZWxpbWl0ZWRJZGVudGlmaWVycykgewotCQlpZiAodGhpcy5kZWxpbWl0ZWRJZGVudGlmaWVycyAhPSBkZWxpbWl0ZWRJZGVudGlmaWVycykgewotCQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgeG1sRGVmYXVsdHMgPSB0aGlzLmdldFhtbERlZmF1bHRzRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldERlbGltaXRlZElkZW50aWZpZXJzXyhkZWxpbWl0ZWRJZGVudGlmaWVycyk7Ci0JCQl4bWxEZWZhdWx0cy5zZXREZWxpbWl0ZWRJZGVudGlmaWVycyhkZWxpbWl0ZWRJZGVudGlmaWVycyk7Ci0JCQl0aGlzLnJlbW92ZVhtbERlZmF1bHRzSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVsaW1pdGVkSWRlbnRpZmllcnNfKGJvb2xlYW4gZGkpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlbGltaXRlZElkZW50aWZpZXJzOwotCQl0aGlzLmRlbGltaXRlZElkZW50aWZpZXJzID0gZGk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUxJTUlURURfSURFTlRJRklFUlNfUFJPUEVSVFksIG9sZCwgZGkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVsaW1pdGVkSWRlbnRpZmllcnMoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbERlZmF1bHRzID0gdGhpcy5nZXRYbWxEZWZhdWx0cygpOwotCQlyZXR1cm4gKHhtbERlZmF1bHRzID09IG51bGwpID8gZmFsc2UgOiB4bWxEZWZhdWx0cy5pc0RlbGltaXRlZElkZW50aWZpZXJzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBkZWZhdWx0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFhNTCBkZWZhdWx0cyBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0WG1sRGVmYXVsdHMoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHhtbE1ldGFkYXRhID0gdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlyZXR1cm4gKHhtbE1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IHhtbE1ldGFkYXRhLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIFhNTCBkZWZhdWx0cyAoYW5kIFhNTCBtZXRhZGF0YSBpZiBuZWNlc3NhcnkpIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRYbWxEZWZhdWx0c0ZvclVwZGF0ZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgeG1sTWV0YWRhdGEgPSB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRm9yVXBkYXRlKCk7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbERlZmF1bHRzID0geG1sTWV0YWRhdGEuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcmV0dXJuICh4bWxEZWZhdWx0cyAhPSBudWxsKSA/IHhtbERlZmF1bHRzIDogdGhpcy5idWlsZFhtbERlZmF1bHRzKHhtbE1ldGFkYXRhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFGb3JVcGRhdGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFGb3JVcGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgYnVpbGRYbWxEZWZhdWx0cyhYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxNZXRhZGF0YSkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxEZWZhdWx0cyA9IHRoaXMuYnVpbGRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQl4bWxNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyh4bWxEZWZhdWx0cyk7Ci0JCXJldHVybiB4bWxEZWZhdWx0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgYnVpbGRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCi0JLyoqCi0JICogY2xlYXIgdGhlIFhNTCBkZWZhdWx0cyAoYW5kIHRoZSBYTUwgbWV0YWRhdGEpIGlmIGFwcHJvcHJpYXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sRGVmYXVsdHNJZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxEZWZhdWx0cygpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG51bGwpOwotCQkJdGhpcy5yZW1vdmVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhSWZVbnNldCgpIHsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnJlbW92ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhSWZVbnNldCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0WG1sVGV4dFJhbmdlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyB4bWxEZWZhdWx0cyA9IHRoaXMuZ2V0WG1sRGVmYXVsdHMoKTsKLQkJcmV0dXJuICh4bWxEZWZhdWx0cyA9PSBudWxsKSA/IG51bGwgOiB4bWxEZWZhdWx0cy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9BYnN0cmFjdE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkNmY5OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZQotICogPGJyPgotICogPGNvZGU+cGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YTwvY29kZT4gZWxlbWVudAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEyXzAKLXsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb247Ci0KLQkvLyBuZXZlciBudWxsCi0JcHJvdGVjdGVkIGZpbmFsIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFbnRpdHlNYXBwaW5ncyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA9IHRoaXMuYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gdGhpcy5idWlsZERlc2NyaXB0aW9uKCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZV8odGhpcy5idWlsZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQl0aGlzLnNldERlc2NyaXB0aW9uXyh0aGlzLmJ1aWxkRGVzY3JpcHRpb24oKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHMudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBtZXRhZGF0YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIFhNTCBtZXRhZGF0YSBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCB0aGUgWE1MIG1ldGFkYXRhIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUZvclVwZGF0ZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgeG1sTWV0YWRhdGEgPSB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCXJldHVybiAoeG1sTWV0YWRhdGEgIT0gbnVsbCkgPyB4bWxNZXRhZGF0YSA6IHRoaXMuYnVpbGRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBidWlsZFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxNZXRhZGF0YSA9IHRoaXMuYnVpbGRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8oKTsKLQkJdGhpcy5nZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHhtbE1ldGFkYXRhKTsKLQkJcmV0dXJuIHhtbE1ldGFkYXRhOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBidWlsZFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXygpOwotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFJZlVuc2V0KCkgewotCQlpZiAodGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5nZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKG51bGwpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpIHsKLQkJaWYgKHRoaXMueG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgIT0geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpIHsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZV8oeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpOwotCQkJeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpOwotCQkJdGhpcy5yZW1vdmVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlXyhib29sZWFuIHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQkJdGhpcy54bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA9IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfUFJPUEVSVFksIG9sZCwgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHhtbE1ldGFkYXRhID0gdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlyZXR1cm4gKHhtbE1ldGFkYXRhICE9IG51bGwpID8geG1sTWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpIDogZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlc2NyaXB0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5kZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKSB7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0RGVzY3JpcHRpb25fKGRlc2NyaXB0aW9uKTsKLQkJCXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCXRoaXMucmVtb3ZlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFJZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZXNjcmlwdGlvbl8oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlc2NyaXB0aW9uOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVNDUklQVElPTl9QUk9QRVJUWSwgb2xkLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlc2NyaXB0aW9uKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSB4bWxNZXRhZGF0YSA9IHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJcmV0dXJuICh4bWxNZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiB4bWxNZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0IGRlZmF1bHRzICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eU1hcHBpbmdzIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZXNvdXJjZUV4aXN0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFRleHRSYW5nZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgeG1sTWV0YWRhdGEgPSB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCXJldHVybiAoeG1sTWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogeG1sTWV0YWRhdGEuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1WaXJ0dWFsT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE0NmY1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0Fic3RyYWN0T3JtVmlydHVhbE92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiBWaXJ0dWFsIDxjb2RlPm9ybS54bWw8L2NvZGU+IG92ZXJyaWRlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybVZpcnR1YWxPdmVycmlkZTxDIGV4dGVuZHMgT3JtT3ZlcnJpZGVDb250YWluZXI+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1WaXJ0dWFsT3ZlcnJpZGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG5hbWU7ICAvLyBuZXZlciBudWxsCi0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybVZpcnR1YWxPdmVycmlkZShDIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgT3JtT3ZlcnJpZGUgY29udmVydFRvU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5jb252ZXJ0T3ZlcnJpZGVUb1NwZWNpZmllZCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoQykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEMgZ2V0Q29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmdldFR5cGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBPd25lciBvd25lciwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5idWlsZENvbHVtblZhbGlkYXRvcih0aGlzLCBjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmJ1aWxkVmFsaWRhdG9yKCkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5idWlsZE92ZXJyaWRlVmFsaWRhdG9yKHRoaXMsIHRoaXMuYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybU92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY0VudGl0eU1hcHBpbmdzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNFbnRpdHlNYXBwaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmFlOWVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY0VudGl0eU1hcHBpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUKLSAqIDxicj4KLSAqIDxjb2RlPmVudGl0eS1tYXBwaW5nczwvY29kZT4gZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0VudGl0eU1hcHBpbmdzCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzCi17Ci0JcHVibGljIEdlbmVyaWNFbnRpdHlNYXBwaW5ncyhPcm1YbWwgcGFyZW50LCBYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZjY2MmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogU3BlY2lmaWVkIDxjb2RlPm9ybS54bWw8L2NvZGU+IGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1PdmVycmlkZTxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPgotCWltcGxlbWVudHMgT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMAotewotCXByb3RlY3RlZCBmaW5hbCBPcm1PdmVycmlkZVJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXA7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxPdmVycmlkZSkgewotCQlzdXBlcihwYXJlbnQsIHhtbE92ZXJyaWRlKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAgPSB0aGlzLmJ1aWxkUmVsYXRpb25zaGlwKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMucmVsYXRpb25zaGlwLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnJlbGF0aW9uc2hpcC51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkL3ZpcnR1YWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGNvbnZlcnRUb1ZpcnR1YWwoKSB7Ci0JCXJldHVybiAoT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUpIHN1cGVyLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVsYXRpb25zaGlwICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1PdmVycmlkZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLnJlbGF0aW9uc2hpcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAgYnVpbGRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAgZ2V0Q29udGFpbmVyMl8wKCkgewotCQlyZXR1cm4gKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzApIHRoaXMuZ2V0Q29udGFpbmVyKCk7Ci0JfQotCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0UmVsYXRpb25zaGlwTWFwcGluZyh0aGlzLm5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvbGRPdmVycmlkZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRPdmVycmlkZSk7Ci0JCXRoaXMucmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tKG9sZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbVZpcnR1YWwodmlydHVhbE92ZXJyaWRlKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnJlbGF0aW9uc2hpcC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyMl8wKCkuYnVpbGRKb2luVGFibGVWYWxpZGF0b3IodGhpcywgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcywgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKHRoaXMsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZDAxMTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhc3NvY2lhdGlvbiBvdmVycmlkZSBjb250YWluZXIKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyPAotCQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciwKLQkJCU9ybVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSwKLQkJCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUsCi0JCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSwKLQkJCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUKLQkJPgotCWltcGxlbWVudHMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMAotewotCXB1YmxpYyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZyhhdHRyaWJ1dGVOYW1lLCB0aGlzLm93bmVyLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIFJlYWRPbmx5UmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFN0cmluZyBhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5vd25lci5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChhc3NvY2lhdGlvbk92ZXJyaWRlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIgZ2V0T3duZXIyXzAoKSB7Ci0JCXJldHVybiAoT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcikgdGhpcy5vd25lcjsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBjb2x1bW5Pd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyMl8wKCkuYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKG92ZXJyaWRlLCBjb2x1bW4sIGNvbHVtbk93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGNvbHVtbk93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIyXzAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKG92ZXJyaWRlLCBjb2x1bW4sIGNvbHVtbk93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZVZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3duZXIyXzAoKS5idWlsZEpvaW5UYWJsZVZhbGlkYXRvcihvdmVycmlkZSwgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0WG1sT3ZlcnJpZGVzXygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUl0ZXJhYmxlPFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KHRoaXMub3duZXIuZ2V0WG1sT3ZlcnJpZGVzKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIGJ1aWxkWG1sT3ZlcnJpZGUoKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRTcGVjaWZpZWRPdmVycmlkZShYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbE92ZXJyaWRlKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCB4bWxPdmVycmlkZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZE92ZXJyaWRlKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkT3ZlcnJpZGUsIE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSkgewotCQlzcGVjaWZpZWRPdmVycmlkZS5pbml0aWFsaXplRnJvbVZpcnR1YWwodmlydHVhbE92ZXJyaWRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSh0aGlzLCBuYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ3NWRhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIFNwZWNpZmllZCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhdHRyaWJ1dGUgb3ZlcnJpZGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1PdmVycmlkZTxPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciwgWG1sQXR0cmlidXRlT3ZlcnJpZGU+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVPdmVycmlkZSwgT3JtQ29sdW1uLk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUNvbHVtbiBjb2x1bW47Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGUoT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgcGFyZW50LCBYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxPdmVycmlkZSkgewotCQlzdXBlcihwYXJlbnQsIHhtbE92ZXJyaWRlKTsKLQkJdGhpcy5jb2x1bW4gPSB0aGlzLmJ1aWxkQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNvbHVtbi51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkL3ZpcnR1YWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBjb252ZXJ0VG9WaXJ0dWFsKCkgewotCQlyZXR1cm4gKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgc3VwZXIuY29udmVydFRvVmlydHVhbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbHVtbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29sdW1uIGJ1aWxkQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIG9sZE92ZXJyaWRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZE92ZXJyaWRlKTsKLQkJdGhpcy5jb2x1bW4uaW5pdGlhbGl6ZUZyb20ob2xkT3ZlcnJpZGUuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIG9sZE92ZXJyaWRlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tVmlydHVhbChvbGRPdmVycmlkZSk7Ci0JCXRoaXMuY29sdW1uLmluaXRpYWxpemVGcm9tVmlydHVhbChvbGRPdmVycmlkZS5nZXRDb2x1bW4oKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBvd25lciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbCwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIoKS5idWlsZENvbHVtblZhbGlkYXRvcih0aGlzLCAoUmVhZE9ubHlCYXNlQ29sdW1uKSBjb2wsIHRoaXMsIChUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIFhtbENvbHVtbiBnZXRYbWxDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE92ZXJyaWRlKCkuZ2V0Q29sdW1uKCk7Ci0JfQotCi0JcHVibGljIFhtbENvbHVtbiBidWlsZFhtbENvbHVtbigpIHsKLQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpOwotCQl0aGlzLmdldFhtbE92ZXJyaWRlKCkuc2V0Q29sdW1uKHhtbENvbHVtbik7Ci0JCXJldHVybiB4bWxDb2x1bW47Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQ29sdW1uKCkgewotCQl0aGlzLmdldFhtbE92ZXJyaWRlKCkuc2V0Q29sdW1uKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBwZWQgYnkgcmVsYXRpb25zaGlwICoqKioqKioqKioKLQotCXByb3RlY3RlZCBib29sZWFuIGF0dHJpYnV0ZUlzRGVyaXZlZElkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmF0dHJpYnV0ZUlzRGVyaXZlZElkKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCi0JCWlmICh0aGlzLmF0dHJpYnV0ZUlzRGVyaXZlZElkKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkFUVFJJQlVURV9PVkVSUklERV9ERVJJVkVEX0FORF9TUEVDSUZJRUQsCi0JCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkJKQotCQkJCSk7Ci0KLQkJCS8vIHZhbGlkYXRlIHRoZSBjb2x1bW4gaWYgaXQgaXMgc3BlY2lmaWVkCi0JCQlpZiAodGhpcy54bWxDb2x1bW5Jc1NwZWNpZmllZCgpKSB7Ci0JCQkJdGhpcy5jb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuY29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB4bWxDb2x1bW5Jc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI1NjQ4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lcgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU92ZXJyaWRlQ29udGFpbmVyPAotCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIsCi0JCQlPcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlLAotCQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUsCi0JCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUsCi0JCQlYbWxBdHRyaWJ1dGVPdmVycmlkZQotCQk+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcgotewotCXB1YmxpYyBHZW5lcmljT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCXB1YmxpYyBSZWFkT25seUNvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5vd25lci5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldFhtbE92ZXJyaWRlc18oKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVJdGVyYWJsZTxYbWxBdHRyaWJ1dGVPdmVycmlkZT4odGhpcy5vd25lci5nZXRYbWxPdmVycmlkZXMoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEF0dHJpYnV0ZU92ZXJyaWRlIGJ1aWxkWG1sT3ZlcnJpZGUoKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVPdmVycmlkZSBidWlsZFNwZWNpZmllZE92ZXJyaWRlKFhtbEF0dHJpYnV0ZU92ZXJyaWRlIHhtbE92ZXJyaWRlKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgeG1sT3ZlcnJpZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tKE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG9sZENvbnRhaW5lcikgewotCQlmb3IgKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIG9sZE92ZXJyaWRlIDogb2xkQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpKSB7Ci0JCQl0aGlzLmFkZFNwZWNpZmllZE92ZXJyaWRlKCkuaW5pdGlhbGl6ZUZyb20ob2xkT3ZlcnJpZGUpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNwZWNpZmllZE92ZXJyaWRlKE9ybUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZE92ZXJyaWRlLCBPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlKSB7Ci0JCXNwZWNpZmllZE92ZXJyaWRlLmluaXRpYWxpemVGcm9tVmlydHVhbCh2aXJ0dWFsT3ZlcnJpZGUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgYnVpbGRWaXJ0dWFsT3ZlcnJpZGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUodGhpcywgbmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQmFzaWNNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1CYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNzYzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1CYXNpY01hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBiYXNpYyBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQmFzaWNNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUJhc2ljTWFwcGluZzxYbWxCYXNpYz4KLXsKLQlwdWJsaWMgR2VuZXJpY09ybUJhc2ljTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sQmFzaWMgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhc2NhZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhc2NhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjYmEzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1DYXNjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhc2NhZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FzY2FkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1DYXNjYWRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1DYXNjYWRlMl8wCi17Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYWxsOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGVyc2lzdDsKLQotCXByb3RlY3RlZCBib29sZWFuIG1lcmdlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVmcmVzaDsKLQotCS8qIEpQQSAyLjAgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZXRhY2g7Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgYnVpbHQgZGlyZWN0bHkgYnkgdGhlIG1hcHBpbmcgaW1wbGVtZW50YXRpb247IGFzIG9wcG9zZWQgdG8gdmlhCi0JICogYSBwbGF0Zm9ybS1zcGVjaWZpYyBmYWN0b3J5LgotCSAqIEBzZWUgQWJzdHJhY3RPcm1SZWxhdGlvbnNoaXBNYXBwaW5nI2J1aWxkQ2FzY2FkZSgpCi0JICovCi0JcHVibGljIEdlbmVyaWNPcm1DYXNjYWRlKE9ybVJlbGF0aW9uc2hpcE1hcHBpbmcgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuYWxsID0gdGhpcy5idWlsZEFsbCgpOwotCQl0aGlzLnBlcnNpc3QgPSB0aGlzLmJ1aWxkUGVyc2lzdCgpOwotCQl0aGlzLm1lcmdlID0gdGhpcy5idWlsZE1lcmdlKCk7Ci0JCXRoaXMucmVtb3ZlID0gdGhpcy5idWlsZFJlbW92ZSgpOwotCQl0aGlzLnJlZnJlc2ggPSB0aGlzLmJ1aWxkUmVmcmVzaCgpOwotCQl0aGlzLmRldGFjaCA9IHRoaXMuYnVpbGREZXRhY2goKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRBbGxfKHRoaXMuYnVpbGRBbGwoKSk7Ci0JCXRoaXMuc2V0UGVyc2lzdF8odGhpcy5idWlsZFBlcnNpc3QoKSk7Ci0JCXRoaXMuc2V0TWVyZ2VfKHRoaXMuYnVpbGRNZXJnZSgpKTsKLQkJdGhpcy5zZXRSZW1vdmVfKHRoaXMuYnVpbGRSZW1vdmUoKSk7Ci0JCXRoaXMuc2V0UmVmcmVzaF8odGhpcy5idWlsZFJlZnJlc2goKSk7Ci0JCXRoaXMuc2V0RGV0YWNoXyh0aGlzLmJ1aWxkRGV0YWNoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbGwgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNBbGwoKSB7Ci0JCXJldHVybiB0aGlzLmFsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbGwoYm9vbGVhbiBhbGwpIHsKLQkJaWYgKHRoaXMuYWxsICE9IGFsbCkgewotCQkJQ2FzY2FkZVR5cGUgeG1sQ2FzY2FkZSA9IHRoaXMuZ2V0WG1sQ2FzY2FkZUZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRBbGxfKGFsbCk7Ci0JCQl4bWxDYXNjYWRlLnNldENhc2NhZGVBbGwoYWxsKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FzY2FkZUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFsbF8oYm9vbGVhbiBhbGwpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmFsbDsKLQkJdGhpcy5hbGwgPSBhbGw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBTExfUFJPUEVSVFksIG9sZCwgYWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEFsbCgpIHsKLQkJQ2FzY2FkZVR5cGUgeG1sQ2FzY2FkZSA9IHRoaXMuZ2V0WG1sQ2FzY2FkZSgpOwotCQlyZXR1cm4gKHhtbENhc2NhZGUgIT0gbnVsbCkgJiYgeG1sQ2FzY2FkZS5pc0Nhc2NhZGVBbGwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3QoKSB7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdChib29sZWFuIHBlcnNpc3QpIHsKLQkJaWYgKHRoaXMucGVyc2lzdCAhPSBwZXJzaXN0KSB7Ci0JCQlDYXNjYWRlVHlwZSB4bWxDYXNjYWRlID0gdGhpcy5nZXRYbWxDYXNjYWRlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFBlcnNpc3RfKHBlcnNpc3QpOwotCQkJeG1sQ2FzY2FkZS5zZXRDYXNjYWRlUGVyc2lzdChwZXJzaXN0KTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FzY2FkZUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldFBlcnNpc3RfKGJvb2xlYW4gcGVyc2lzdCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMucGVyc2lzdDsKLQkJdGhpcy5wZXJzaXN0ID0gcGVyc2lzdDsKLQkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQRVJTSVNUX1BST1BFUlRZLCBvbGQsIHBlcnNpc3QpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUGVyc2lzdCgpIHsKLQkJQ2FzY2FkZVR5cGUgeG1sQ2FzY2FkZSA9IHRoaXMuZ2V0WG1sQ2FzY2FkZSgpOwotCQlyZXR1cm4gKHhtbENhc2NhZGUgIT0gbnVsbCkgJiYgeG1sQ2FzY2FkZS5pc0Nhc2NhZGVQZXJzaXN0KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1lcmdlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzTWVyZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1lcmdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1lcmdlKGJvb2xlYW4gbWVyZ2UpIHsKLQkJaWYgKHRoaXMubWVyZ2UgIT0gbWVyZ2UpIHsKLQkJCUNhc2NhZGVUeXBlIHhtbENhc2NhZGUgPSB0aGlzLmdldFhtbENhc2NhZGVGb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0TWVyZ2VfKG1lcmdlKTsKLQkJCXhtbENhc2NhZGUuc2V0Q2FzY2FkZU1lcmdlKG1lcmdlKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FzY2FkZUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldE1lcmdlXyhib29sZWFuIG1lcmdlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5tZXJnZTsKLQkJdGhpcy5tZXJnZSA9IG1lcmdlOwotCQlyZXR1cm4gdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1FUkdFX1BST1BFUlRZLCBvbGQsIG1lcmdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE1lcmdlKCkgewotCQlDYXNjYWRlVHlwZSB4bWxDYXNjYWRlID0gdGhpcy5nZXRYbWxDYXNjYWRlKCk7Ci0JCXJldHVybiAoeG1sQ2FzY2FkZSAhPSBudWxsKSAmJiB4bWxDYXNjYWRlLmlzQ2FzY2FkZU1lcmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlbW92ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbW92ZSgpIHsKLQkJcmV0dXJuIHRoaXMucmVtb3ZlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlbW92ZShib29sZWFuIHJlbW92ZSkgewotCQlpZiAodGhpcy5yZW1vdmUgIT0gcmVtb3ZlKSB7Ci0JCQlDYXNjYWRlVHlwZSB4bWxDYXNjYWRlID0gdGhpcy5nZXRYbWxDYXNjYWRlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFJlbW92ZV8ocmVtb3ZlKTsKLQkJCXhtbENhc2NhZGUuc2V0Q2FzY2FkZVJlbW92ZShyZW1vdmUpOwotCQkJdGhpcy5yZW1vdmVYbWxDYXNjYWRlSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0UmVtb3ZlXyhib29sZWFuIHJlbW92ZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMucmVtb3ZlOwotCQl0aGlzLnJlbW92ZSA9IHJlbW92ZTsKLQkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRU1PVkVfUFJPUEVSVFksIG9sZCwgcmVtb3ZlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFJlbW92ZSgpIHsKLQkJQ2FzY2FkZVR5cGUgeG1sQ2FzY2FkZSA9IHRoaXMuZ2V0WG1sQ2FzY2FkZSgpOwotCQlyZXR1cm4gKHhtbENhc2NhZGUgIT0gbnVsbCkgJiYgeG1sQ2FzY2FkZS5pc0Nhc2NhZGVSZW1vdmUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmcmVzaCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2goKSB7Ci0JCXJldHVybiB0aGlzLnJlZnJlc2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaChib29sZWFuIHJlZnJlc2gpIHsKLQkJaWYgKHRoaXMucmVmcmVzaCAhPSByZWZyZXNoKSB7Ci0JCQlDYXNjYWRlVHlwZSB4bWxDYXNjYWRlID0gdGhpcy5nZXRYbWxDYXNjYWRlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFJlZnJlc2hfKHJlZnJlc2gpOwotCQkJeG1sQ2FzY2FkZS5zZXRDYXNjYWRlUmVmcmVzaChyZWZyZXNoKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ2FzY2FkZUlmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldFJlZnJlc2hfKGJvb2xlYW4gcmVmcmVzaCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMucmVmcmVzaDsKLQkJdGhpcy5yZWZyZXNoID0gcmVmcmVzaDsKLQkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChSRUZSRVNIX1BST1BFUlRZLCBvbGQsIHJlZnJlc2gpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUmVmcmVzaCgpIHsKLQkJQ2FzY2FkZVR5cGUgeG1sQ2FzY2FkZSA9IHRoaXMuZ2V0WG1sQ2FzY2FkZSgpOwotCQlyZXR1cm4gKHhtbENhc2NhZGUgIT0gbnVsbCkgJiYgeG1sQ2FzY2FkZS5pc0Nhc2NhZGVSZWZyZXNoKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFjaCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0RldGFjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZGV0YWNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERldGFjaChib29sZWFuIGRldGFjaCkgewotCQlpZiAodGhpcy5kZXRhY2ggIT0gZGV0YWNoKSB7Ci0JCQlDYXNjYWRlVHlwZSB4bWxDYXNjYWRlID0gdGhpcy5nZXRYbWxDYXNjYWRlRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldERldGFjaF8oZGV0YWNoKTsKLQkJCXhtbENhc2NhZGUuc2V0Q2FzY2FkZURldGFjaChkZXRhY2gpOwotCQkJdGhpcy5yZW1vdmVYbWxDYXNjYWRlSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2V0RGV0YWNoXyhib29sZWFuIGRldGFjaCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGV0YWNoOwotCQl0aGlzLmRldGFjaCA9IGRldGFjaDsKLQkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERVRBQ0hfUFJPUEVSVFksIG9sZCwgZGV0YWNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERldGFjaCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgJiYgdGhpcy5idWlsZERldGFjaF8oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERldGFjaF8oKSB7Ci0JCUNhc2NhZGVUeXBlIHhtbENhc2NhZGUgPSB0aGlzLmdldFhtbENhc2NhZGUoKTsKLQkJcmV0dXJuICh4bWxDYXNjYWRlICE9IG51bGwpICYmIHhtbENhc2NhZGUuaXNDYXNjYWRlRGV0YWNoKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBjYXNjYWRlICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBYTUwgY2FzY2FkZSBkb2VzIG5vdCBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIENhc2NhZGVUeXBlIGdldFhtbENhc2NhZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRDYXNjYWRlKCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGQgdGhlIFhNTCBjYXNjYWRlIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXByb3RlY3RlZCBDYXNjYWRlVHlwZSBnZXRYbWxDYXNjYWRlRm9yVXBkYXRlKCkgewotCQlDYXNjYWRlVHlwZSB4bWxDYXNjYWRlID0gdGhpcy5nZXRYbWxDYXNjYWRlKCk7Ci0JCXJldHVybiAoeG1sQ2FzY2FkZSAhPSBudWxsKSA/IHhtbENhc2NhZGUgOiB0aGlzLmJ1aWxkWG1sQ2FzY2FkZSgpOwotCX0KLQotCXByb3RlY3RlZCBDYXNjYWRlVHlwZSBidWlsZFhtbENhc2NhZGUoKSB7Ci0JCUNhc2NhZGVUeXBlIHhtbENhc2NhZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVDYXNjYWRlVHlwZSgpOwotCQl0aGlzLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5zZXRDYXNjYWRlKHhtbENhc2NhZGUpOwotCQlyZXR1cm4geG1sQ2FzY2FkZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDYXNjYWRlSWZVbnNldCgpIHsKLQkJaWYgKHRoaXMuZ2V0WG1sQ2FzY2FkZSgpLmlzVW5zZXQoKSkgewotCQkJdGhpcy5yZW1vdmVYbWxDYXNjYWRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDYXNjYWRlKCkgewotCQl0aGlzLmdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5zZXRDYXNjYWRlKG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1SZWxhdGlvbnNoaXBNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1SZWxhdGlvbnNoaXBNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oQ2FzY2FkZSBvbGRDYXNjYWRlKSB7Ci0JCXRoaXMuc2V0QWxsKG9sZENhc2NhZGUuaXNBbGwoKSk7Ci0JCXRoaXMuc2V0UGVyc2lzdChvbGRDYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJdGhpcy5zZXRNZXJnZShvbGRDYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCXRoaXMuc2V0UmVtb3ZlKG9sZENhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCXRoaXMuc2V0UmVmcmVzaChvbGRDYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJaWYgKHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkpIHsKLQkJCXRoaXMuc2V0RGV0YWNoKCgoQ2FzY2FkZTJfMCkgb2xkQ2FzY2FkZSkuaXNEZXRhY2goKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldFhtbFRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFRleHRSYW5nZSgpIHsKLQkJQ2FzY2FkZVR5cGUgeG1sQ2FzY2FkZSA9IHRoaXMuZ2V0WG1sQ2FzY2FkZSgpOwotCQlyZXR1cm4gKHhtbENhc2NhZGUgPT0gbnVsbCkgPyBudWxsIDogeG1sQ2FzY2FkZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNTQ0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24gYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQ29sdW1uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUJhc2VDb2x1bW48WG1sQ29sdW1uLCBPcm1Db2x1bW4uT3duZXI+Ci0JaW1wbGVtZW50cyBPcm1Db2x1bW4KLXsKLQkvLyBUT0RPIGRlZmF1bHRzIGZyb20gamF2YSBmb3IgYWxsIG9mIHRoZXNlIHNldHRpbmdzCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkUHJlY2lzaW9uOwotCi0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkU2NhbGU7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IHRoaXMuYnVpbGRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkU2NhbGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGhfKHRoaXMuYnVpbGRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uXyh0aGlzLmJ1aWxkU3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjYWxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBjb2x1bW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbHVtbiBnZXRYbWxDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldFhtbENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxDb2x1bW4gYnVpbGRYbWxDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmJ1aWxkWG1sQ29sdW1uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ29sdW1uKCkgewotCQl0aGlzLm93bmVyLnJlbW92ZVhtbENvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsZW5ndGggKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZExlbmd0aC5pbnRWYWx1ZSgpIDogdGhpcy5nZXREZWZhdWx0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkTGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZExlbmd0aCwgbGVuZ3RoKSkgewotCQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZExlbmd0aF8obGVuZ3RoKTsKLQkJCXhtbENvbHVtbi5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ29sdW1uSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoXyhJbnRlZ2VyIGxlbmd0aCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZExlbmd0aCgpIHsKLQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uKCk7Ci0JCXJldHVybiAoeG1sQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHhtbENvbHVtbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRMZW5ndGgoKSB7Ci0JCXJldHVybiBERUZBVUxUX0xFTkdUSDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJlY2lzaW9uICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24uaW50VmFsdWUoKSA6IHRoaXMuZ2V0RGVmYXVsdFByZWNpc2lvbigpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRQcmVjaXNpb24sIHByZWNpc2lvbikpIHsKLQkJCVhtbENvbHVtbiB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRQcmVjaXNpb25fKHByZWNpc2lvbik7Ci0JCQl4bWxDb2x1bW4uc2V0UHJlY2lzaW9uKHByZWNpc2lvbik7Ci0JCQl0aGlzLnJlbW92ZVhtbENvbHVtbklmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbl8oSW50ZWdlciBwcmVjaXNpb24pIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNwZWNpZmllZFByZWNpc2lvbjsKLQkJdGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gPSBwcmVjaXNpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGQsIHByZWNpc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgYnVpbGRTcGVjaWZpZWRQcmVjaXNpb24oKSB7Ci0JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbigpOwotCQlyZXR1cm4gKHhtbENvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB4bWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gREVGQVVMVF9QUkVDSVNJT047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjYWxlICoqKioqKioqKioKLQotCXB1YmxpYyBpbnQgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2FsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NhbGUuaW50VmFsdWUoKSA6IHRoaXMuZ2V0RGVmYXVsdFNjYWxlKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkU2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjYWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkU2NhbGUsIHNjYWxlKSkgewotCQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uRm9yVXBkYXRlKCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFNjYWxlXyhzY2FsZSk7Ci0JCQl4bWxDb2x1bW4uc2V0U2NhbGUoc2NhbGUpOwotCQkJdGhpcy5yZW1vdmVYbWxDb2x1bW5JZlVuc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2FsZV8oSW50ZWdlciBzY2FsZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSBzY2FsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSwgb2xkLCBzY2FsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgYnVpbGRTcGVjaWZpZWRTY2FsZSgpIHsKLQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uKCk7Ci0JCXJldHVybiAoeG1sQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHhtbENvbHVtbi5nZXRTY2FsZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFNjYWxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9TQ0FMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUNvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGgob2xkQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRQcmVjaXNpb24ob2xkQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2FsZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5Q29sdW1uIHZpcnR1YWxDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxDb2x1bW4pOwotCQkvLyBpZ25vcmUgb3RoZXIgc2V0dGluZ3M/Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRGlzY3JpbWluYXRvckNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJmN2ZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBkaXNjcmltaW5hdG9yIGNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4KLQlleHRlbmRzIEFic3RyYWN0T3JtTmFtZWREaXNjcmltaW5hdG9yQ29sdW1uPFhtbERpc2NyaW1pbmF0b3JDb2x1bW4sIE9ybURpc2NyaW1pbmF0b3JDb2x1bW4uT3duZXI+Ci0JaW1wbGVtZW50cyBPcm1EaXNjcmltaW5hdG9yQ29sdW1uCi17Ci0KLQlwdWJsaWMgR2VuZXJpY09ybURpc2NyaW1pbmF0b3JDb2x1bW4oWG1sQ29udGV4dE5vZGUgcGFyZW50LCBPcm1EaXNjcmltaW5hdG9yQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYTUwgY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGdldFhtbENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0WG1sQ29sdW1uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRYbWxDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmJ1aWxkWG1sQ29sdW1uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ29sdW1uKCkgewotCQl0aGlzLm93bmVyLnJlbW92ZVhtbENvbHVtbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZjgyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBlbWJlZGRhYmxlIHR5cGUgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVtYmVkZGFibGUKLQlleHRlbmRzIEFic3RyYWN0T3JtRW1iZWRkYWJsZTxYbWxFbWJlZGRhYmxlPgotewotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkYWJsZShPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbEVtYmVkZGFibGUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyhHZW5lcmljSmF2YUVtYmVkZGFibGUuQUxMT1dFRF9BVFRSSUJVVEVfTUFQUElOR19LRVlTLCBhdHRyaWJ1dGVNYXBwaW5nS2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5MzczNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZElkTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZW1iZWRkZWQgSUQgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmc8WG1sRW1iZWRkZWRJZD4KLQlpbXBsZW1lbnRzIEVtYmVkZGVkSWRNYXBwaW5nMl8wLCBPcm1FbWJlZGRlZElkTWFwcGluZwotewotCS8qIEpQQSAyLjAgLSB0aGUgZW1iZWRkZWQgaWQgbWF5IGJlIGRlcml2ZWQgZnJvbSBhIHJlbGF0aW9uc2hpcCAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlcml2ZWQ7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkZWRJZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVtYmVkZGVkSWQgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRNYXBwZWRCeVJlbGF0aW9uc2hpcCh0aGlzLmJ1aWxkRGVyaXZlZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVyaXZlZCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rlcml2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmRlcml2ZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFwcGVkQnlSZWxhdGlvbnNoaXAoYm9vbGVhbiBkZXJpdmVkKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZXJpdmVkOwotCQl0aGlzLmRlcml2ZWQgPSBkZXJpdmVkOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVSSVZFRF9QUk9QRVJUWSwgb2xkLCBkZXJpdmVkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlcml2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpICYmIHRoaXMuYnVpbGREZXJpdmVkXygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVyaXZlZF8oKSB7Ci0JCXJldHVybiB0aGlzLmdldFR5cGVNYXBwaW5nKCkuYXR0cmlidXRlSXNEZXJpdmVkSWQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gMTA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtRW1iZWRkZWRJZE1hcHBpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKEF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcykgewotCQl4bWxBdHRyaWJ1dGVzLmdldEVtYmVkZGVkSWRzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCXhtbEF0dHJpYnV0ZXMuZ2V0RW1iZWRkZWRJZHMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRFbWJlZGRhYmxlT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmRlcml2ZWQgPwotCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkgOgotCQkJc3VwZXIuZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCi0JCS8vIFtKUEEgMi4wXSBpZiB0aGUgZW1iZWRkZWQgaWQgaXMgbWFwcGVkIGJ5IGEgcmVsYXRpb25zaGlwLCB0aGVuIGFueSBzcGVjaWZpZWQKLQkJLy8gYXR0cmlidXRlIG92ZXJyaWRlcyBhcmUgaW4gZXJyb3IKLQkJLy8gKGluIEpQQSAxLjAsIHRoaXMgd2lsbCBvYnZpb3VzbHkgbmV2ZXIgYmUgcmVhY2hlZCkKLQkJaWYgKHRoaXMuZGVyaXZlZAotCQkJCSYmICh0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSA+IDApKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTUJFRERFRF9JRF9NQVBQSU5HX01BUFBFRF9CWV9SRUxBVElPTlNISVBfQU5EX0FUVFJJQlVURV9PVkVSUklERVNfU1BFQ0lGSUVELAotCQkJCQlFTVBUWV9TVFJJTkdfQVJSQVksCi0JCQkJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIsCi0JCQkJCXRoaXMuYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyIG93bmVyICoqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdE9ybUJhc2VFbWJlZGRlZE1hcHBpbmc8WG1sRW1iZWRkZWRJZD4uQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVtYmVkZGVkSWRNYXBwaW5nLnRoaXMuaXNEZXJpdmVkKCkgPwotCQkJCQlFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSA6Ci0JCQkJCXN1cGVyLmdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBwcmUtY29uZGl0aW9uOiB0eXBlIG1hcHBpbmcgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+Ci0JCSAqLwotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc18oVHlwZU1hcHBpbmcgb3ZlcnJpZGRlblR5cGVNYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4oc3VwZXIuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lc18ob3ZlcnJpZGRlblR5cGVNYXBwaW5nKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJCQlyZXR1cm4gISBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5hdHRyaWJ1dGVJc0Rlcml2ZWRJZChhdHRyaWJ1dGVOYW1lKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMzNjA3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdWJJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbnRpdHlUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Kb2luVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZW1iZWRkZWQgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nPFhtbEVtYmVkZGVkPgotCWltcGxlbWVudHMgT3JtRW1iZWRkZWRNYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVtYmVkZGVkIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gdGhpcy5idWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIudXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuaXNPcm1YbWwyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5Ml8wKCkuYnVpbGRPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIHRoaXMuYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSkgOgotCQkJCW5ldyBHZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcih0aGlzLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZW1iZWRkZWQgbWFwcGluZ3MgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBpcyBvbmx5IHRvIGJ1aWxkIHRoZSBjaG9pY2VzIGZvciBhICJtYXBwZWQgYnkiIHNldHRpbmcgaW4gYQotCSAqIHJlbGF0aW9uc2hpcCBtYXBwaW5nLiBKUEEgMi4wIGRvZXMgbm90IHN1cHBvcnQgcmVsYXRpb25zaGlwIG1hcHBpbmdzCi0JICogaW4gYW4gZW1iZWRkZWQgSUQgY2xhc3M7IHNvIHdlIG9ubHkgcHV0IHRoaXMgbG9naWMgaGVyZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQluZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihzdXBlci5nZXRBbGxNYXBwaW5nTmFtZXMoKSwgdGhpcy5nZXRBbGxFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkpIDoKLQkJCQlzdXBlci5nZXRBbGxNYXBwaW5nTmFtZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWFsaWZpZWRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVsYXRpb25zaGlwTWFwcGluZz4gYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB7Ci0JCXJldHVybiAodGhpcy50YXJnZXRFbWJlZGRhYmxlICE9IG51bGwpID8KLQkJCQluZXcgU3ViSXRlcmFibGVXcmFwcGVyPEF0dHJpYnV0ZU1hcHBpbmcsIFJlbGF0aW9uc2hpcE1hcHBpbmc+KHRoaXMuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNfKCkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZWxhdGlvbnNoaXBNYXBwaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zXygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPih0aGlzLnRhcmdldEVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmcuaXNPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZWRNYXBwaW5nID0gc3VwZXIucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChyZXNvbHZlZE1hcHBpbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc29sdmVkTWFwcGluZzsKLQkJfQotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/IHRoaXMucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmdfKGF0dHJpYnV0ZU5hbWUpIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXR0cmlidXRlTWFwcGluZyByZXNvbHZlQXR0cmlidXRlTWFwcGluZ18oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJYXR0cmlidXRlTmFtZSA9IHRoaXMudW5xdWFsaWZ5KGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvLyByZWN1cnNlIGludG8gdGhlIGVtYmVkZGFibGUgbWFwcGluZ3MKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgOiB0aGlzLmdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpKSB7Ci0JCQlBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVkTWFwcGluZyA9IG1hcHBpbmcucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAocmVzb2x2ZWRNYXBwaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0WG1sU2VxdWVuY2UoKSB7Ci0JCXJldHVybiA4MDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0JCW5ld01hcHBpbmcuaW5pdGlhbGl6ZUZyb21Pcm1FbWJlZGRlZE1hcHBpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKEF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcykgewotCQl4bWxBdHRyaWJ1dGVzLmdldEVtYmVkZGVkcygpLmFkZCh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKEF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcykgewotCQl4bWxBdHRyaWJ1dGVzLmdldEVtYmVkZGVkcygpLnJlbW92ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPyB0aGlzLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwXyhhdHRyaWJ1dGVOYW1lKSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcF8oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJYXR0cmlidXRlTmFtZSA9IHRoaXMudW5xdWFsaWZ5KGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCS8vIHJlY3Vyc2UgaW50byB0aGUgdGFyZ2V0IGVtYmVkZGFibGUgaWYgbmVjZXNzYXJ5Ci0JCXJldHVybiAob3ZlcnJpZGUgIT0gbnVsbCkgPyBvdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSA6IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXBJblRhcmdldEVtYmVkZGFibGUoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcEluVGFyZ2V0RW1iZWRkYWJsZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKHRoaXMudGFyZ2V0RW1iZWRkYWJsZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnRhcmdldEVtYmVkZGFibGUucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVPdmVycmlkZXMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZU92ZXJyaWRlcyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciBvd25lciAqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RPcm1CYXNlRW1iZWRkZWRNYXBwaW5nPFhtbEVtYmVkZGVkPi5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyCi0JewotCQkvLyBub3RoaW5nIHlldAotCX0KLQotCi0JLy8gKioqKioqKioqKiBhc3NvY2lhdGlvbiBvdmVycmlkZSBjb250YWluZXIgb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlpbXBsZW1lbnRzIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGluZ05hbWUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZy50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcudGhpcy5nZXRUYXJnZXRFbWJlZGRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzKCkgewotCQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgPyB0eXBlTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0SmF2YU92ZXJyaWRlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRYbWxPdmVycmlkZXMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZy50aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCQl9Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCh0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS50YWJsZU5hbWVJc0ludmFsaWQodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUeXBlTWFwcGluZygpLmdldFByaW1hcnlUYWJsZU5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZE92ZXJyaWRlVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIE92ZXJyaWRlQ29udGFpbmVyIGNvbnRhaW5lciwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlKSBvdmVycmlkZSwgKEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIpIGNvbnRhaW5lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbWJlZGRhYmxlT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBSZWFkT25seUJhc2VDb2x1bW4uT3duZXIgb3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUpIG92ZXJyaWRlLCAoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIChSZWFkT25seUpvaW5Db2x1bW4uT3duZXIpIG93bmVyLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVudGl0eVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIG92ZXJyaWRlLCBjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEpvaW5UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgb3ZlcnJpZGUsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgSm9pblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZVZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgb3ZlcnJpZGUsIChSZWFkT25seUpvaW5UYWJsZSkgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZy50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzOWNjYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk51bGxPcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVudGl0eQotCWV4dGVuZHMgQWJzdHJhY3RPcm1FbnRpdHk8WG1sRW50aXR5PgotewotCS8vIEVjbGlwc2VMaW5rIGhvbGRzIGl0cyBjYWNoZWFibGUgaW4gaXRzIGNhY2hpbmcKLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1FbnRpdHkoT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50LCBYbWxFbnRpdHkgeG1sRW50aXR5KSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sRW50aXR5KTsKLQkJdGhpcy5jYWNoZWFibGUgPSB0aGlzLmJ1aWxkQ2FjaGVhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY2FjaGVhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmNhY2hlYWJsZS51cGRhdGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FjaGVhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1DYWNoZWFibGUyXzAgZ2V0Q2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoZWFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNhY2hlYWJsZTJfMCBidWlsZENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNPcm1YbWwyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5Ml8wKCkuYnVpbGRPcm1DYWNoZWFibGUodGhpcykgOgotCQkJCW5ldyBOdWxsT3JtQ2FjaGVhYmxlMl8wKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCUNhY2hlYWJsZUhvbGRlcjJfMCBqYXZhRW50aXR5ID0gKENhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5nZXRKYXZhVHlwZU1hcHBpbmdGb3JEZWZhdWx0cygpOwotCQlpZiAoamF2YUVudGl0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gamF2YUVudGl0eS5nZXRDYWNoZWFibGUoKS5pc0NhY2hlYWJsZSgpOwotCQl9Ci0KLQkJQ2FjaGVhYmxlMl8wIHBhcmVudENhY2hlYWJsZSA9IHRoaXMuZ2V0UGFyZW50Q2FjaGVhYmxlKCk7Ci0JCXJldHVybiAocGFyZW50Q2FjaGVhYmxlICE9IG51bGwpID8KLQkJCQlwYXJlbnRDYWNoZWFibGUuaXNDYWNoZWFibGUoKSA6Ci0JCQkJKChQZXJzaXN0ZW5jZVVuaXQyXzApIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2FjaGVhYmxlMl8wIGdldFBhcmVudENhY2hlYWJsZSgpIHsKLQkJQ2FjaGVhYmxlSG9sZGVyMl8wIHBhcmVudEVudGl0eSA9IChDYWNoZWFibGVIb2xkZXIyXzApIHRoaXMuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCXJldHVybiAocGFyZW50RW50aXR5ID09IG51bGwpID8gbnVsbCA6IHBhcmVudEVudGl0eS5nZXRDYWNoZWFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sQ2FjaGVhYmxlXzJfMCBnZXRYbWxDYWNoZWFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW51bWVyYXRlZENvbnZlcnRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtRW51bWVyYXRlZENvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTEwZmFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudW1lcmF0ZWRDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW51bWVyYXRlZENvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RPcm1Db252ZXJ0ZXIKLQlpbXBsZW1lbnRzIE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIKLXsKLQlwcm90ZWN0ZWQgRW51bVR5cGUgc3BlY2lmaWVkRW51bVR5cGU7Ci0JcHJvdGVjdGVkIEVudW1UeXBlIGRlZmF1bHRFbnVtVHlwZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1FbnVtZXJhdGVkQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCAgT3JtRW51bWVyYXRlZENvbnZlcnRlci5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy5zcGVjaWZpZWRFbnVtVHlwZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRFbnVtVHlwZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1FbnVtZXJhdGVkQ29udmVydGVyLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKE9ybUVudW1lcmF0ZWRDb252ZXJ0ZXIuT3duZXIpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRW51bVR5cGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRFbnVtVHlwZSh0aGlzLmJ1aWxkRGVmYXVsdEVudW1UeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBlbnVtIHR5cGUgKioqKioqKioqKgotCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1UeXBlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRW51bVR5cGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEVudW1UeXBlIDogdGhpcy5nZXREZWZhdWx0RW51bVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRW51bVR5cGUgZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEVudW1UeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlIGVudW1UeXBlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRW51bVR5cGVfKGVudW1UeXBlKTsKLQkJdGhpcy5zZXRYbWxFbnVtZXJhdGVkKGVudW1UeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRFbnVtVHlwZV8oRW51bVR5cGUgZW51bVR5cGUpIHsKLQkJRW51bVR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRFbnVtVHlwZTsKLQkJdGhpcy5zcGVjaWZpZWRFbnVtVHlwZSA9IGVudW1UeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0VOVU1fVFlQRV9QUk9QRVJUWSwgb2xkLCBlbnVtVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sRW51bWVyYXRlZChFbnVtVHlwZSBlbnVtVHlwZSkgewotCQl0aGlzLmdldE93bmVyKCkuc2V0WG1sRW51bVR5cGUoRW51bVR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKGVudW1UeXBlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudW1UeXBlIGJ1aWxkU3BlY2lmaWVkRW51bVR5cGUoKSB7Ci0JCXJldHVybiBFbnVtVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmdldE93bmVyKCkuZ2V0WG1sRW51bVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIEVudW1UeXBlIGdldERlZmF1bHRFbnVtVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdEVudW1UeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRFbnVtVHlwZShFbnVtVHlwZSBlbnVtVHlwZSkgewotCQlFbnVtVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRFbnVtVHlwZTsKLQkJdGhpcy5kZWZhdWx0RW51bVR5cGUgPSBlbnVtVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRU5VTV9UWVBFX1BST1BFUlRZLCBvbGQsIGVudW1UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBpcyBubyBkZWZhdWx0IGVudW0gdHlwZSBpbiBYTUwuCi0JICogSWYgeW91IHNwZWNpZnkgdGhlIGVudW1lcmF0ZWQgZWxlbWVudCwgeW91IG11c3QKLQkgKiBzcGVjaWZ5IGVpdGhlciB7QGxpbmsgRW51bVR5cGUjT1JESU5BTH0gb3IKLQkgKiB7QGxpbmsgRW51bVR5cGUjU1RSSU5HfS4KLQkgKi8KLQlwcm90ZWN0ZWQgRW51bVR5cGUgYnVpbGREZWZhdWx0RW51bVR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gRW51bWVyYXRlZENvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLnNwZWNpZmllZEVudW1UeXBlID0gREVGQVVMVF9FTlVNX1RZUEU7Ci0JCXRoaXMuc2V0WG1sRW51bWVyYXRlZCh0aGlzLnNwZWNpZmllZEVudW1UeXBlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0RW51bVRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1HZW5lcmF0ZWRWYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTdmMDAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGdlbmVyYXRlZCB2YWx1ZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1HZW5lcmF0ZWRWYWx1ZQotewotCXByb3RlY3RlZCBmaW5hbCBYbWxHZW5lcmF0ZWRWYWx1ZSB4bWxHZW5lcmF0ZWRWYWx1ZTsKLQotCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBzcGVjaWZpZWRTdHJhdGVneTsKLQlwcm90ZWN0ZWQgR2VuZXJhdGlvblR5cGUgZGVmYXVsdFN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRHZW5lcmF0b3I7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0R2VuZXJhdG9yOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybUdlbmVyYXRlZFZhbHVlKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sR2VuZXJhdGVkVmFsdWUgeG1sR2VuZXJhdGVkVmFsdWUpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxHZW5lcmF0ZWRWYWx1ZSA9IHhtbEdlbmVyYXRlZFZhbHVlOwotCQl0aGlzLnNwZWNpZmllZFN0cmF0ZWd5ID0gdGhpcy5idWlsZFNwZWNpZmllZFN0cmF0ZWd5KCk7Ci0JCXRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yID0geG1sR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKHRoaXMuYnVpbGRTcGVjaWZpZWRTdHJhdGVneSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRHZW5lcmF0b3JfKHRoaXMueG1sR2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFN0cmF0ZWd5KHRoaXMuYnVpbGREZWZhdWx0U3RyYXRlZ3koKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdEdlbmVyYXRvcih0aGlzLmJ1aWxkRGVmYXVsdEdlbmVyYXRvcigpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFN0cmF0ZWd5IDogdGhpcy5kZWZhdWx0U3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRpb25UeXBlIGdldFNwZWNpZmllZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgewotCQl0aGlzLnNldFNwZWNpZmllZFN0cmF0ZWd5XyhzdHJhdGVneSk7Ci0JCXRoaXMueG1sR2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUudG9Pcm1SZXNvdXJjZU1vZGVsKHN0cmF0ZWd5KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU3RyYXRlZ3lfKEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5KSB7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuc3BlY2lmaWVkU3RyYXRlZ3k7Ci0JCXRoaXMuc3BlY2lmaWVkU3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIGJ1aWxkU3BlY2lmaWVkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBHZW5lcmF0aW9uVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTdHJhdGVneTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3kpIHsKLQkJR2VuZXJhdGlvblR5cGUgb2xkID0gdGhpcy5kZWZhdWx0U3RyYXRlZ3k7Ci0JCXRoaXMuZGVmYXVsdFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1NUUkFURUdZX1BST1BFUlRZLCBvbGQsIHN0cmF0ZWd5KTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJvdGVjdGVkIEdlbmVyYXRpb25UeXBlIGJ1aWxkRGVmYXVsdFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gREVGQVVMVF9TVFJBVEVHWTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZ2VuZXJhdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRHZW5lcmF0b3IgOiB0aGlzLmRlZmF1bHRHZW5lcmF0b3I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEdlbmVyYXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3IoU3RyaW5nIGdlbmVyYXRvcikgewotCQl0aGlzLnNldFNwZWNpZmllZEdlbmVyYXRvcl8oZ2VuZXJhdG9yKTsKLQkJdGhpcy54bWxHZW5lcmF0ZWRWYWx1ZS5zZXRHZW5lcmF0b3IoZ2VuZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRHZW5lcmF0b3JfKFN0cmluZyBnZW5lcmF0b3IpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkR2VuZXJhdG9yOwotCQl0aGlzLnNwZWNpZmllZEdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZCwgZ2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRHZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEdlbmVyYXRvcihTdHJpbmcgZ2VuZXJhdG9yKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRHZW5lcmF0b3I7Ci0JCXRoaXMuZGVmYXVsdEdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfR0VORVJBVE9SX1BST1BFUlRZLCBvbGQsIGdlbmVyYXRvcik7Ci0JfQotCi0JLy8gVE9ETwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKFhtbENvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sR2VuZXJhdGVkVmFsdWUgZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEdlbmVyYXRlZFZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQotCQlTdHJpbmcgZ2VuZXJhdG9yID0gdGhpcy5nZXRHZW5lcmF0b3IoKTsKLQkJaWYgKGdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKEdlbmVyYXRvciBuZXh0IDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzKCkpIHsKLQkJCWlmIChnZW5lcmF0b3IuZXF1YWxzKG5leHQuZ2V0TmFtZSgpKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCW1lc3NhZ2VzLmFkZCgKLQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRSwKLQkJCQluZXcgU3RyaW5nW10ge2dlbmVyYXRvcn0sCi0JCQkJdGhpcy5nZXRQYXJlbnQoKSwKLQkJCQl0aGlzLmdldEdlbmVyYXRvclRleHRSYW5nZSgpCi0JCQkpCi0JCSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy54bWxHZW5lcmF0ZWRWYWx1ZS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRHZW5lcmF0b3JUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxHZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3JUZXh0UmFuZ2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtR2VuZXJhdG9yQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzMTkxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdE51bGxGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0b3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtR2VuZXJhdG9yQ29udGFpbmVyCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1HZW5lcmF0b3JDb250YWluZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgWG1sR2VuZXJhdG9yQ29udGFpbmVyIHhtbEdlbmVyYXRvckNvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBPcm1TZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjsKLQotCXByb3RlY3RlZCBPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1HZW5lcmF0b3JDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxHZW5lcmF0b3JDb250YWluZXIgeG1sR2VuZXJhdG9yQ29udGFpbmVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yQ29udGFpbmVyID0geG1sR2VuZXJhdG9yQ29udGFpbmVyOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3IgPSB0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3IoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJdGhpcy5zeW5jVGFibGVHZW5lcmF0b3IoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQlpZiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLnVwZGF0ZSgpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlR2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCXRoaXMudGFibGVHZW5lcmF0b3IudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VxdWVuY2UgZ2VuZXJhdG9yICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JfQotCi0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJzZXF1ZW5jZSBnZW5lcmF0b3IgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLnNlcXVlbmNlR2VuZXJhdG9yKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbEdlbmVyYXRvciA9IHRoaXMuYnVpbGRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlPcm1TZXF1ZW5jZUdlbmVyYXRvciBnZW5lcmF0b3IgPSB0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoeG1sR2VuZXJhdG9yKTsKLQkJdGhpcy5zZXRTZXF1ZW5jZUdlbmVyYXRvcl8oZ2VuZXJhdG9yKTsKLQkJdGhpcy54bWxHZW5lcmF0b3JDb250YWluZXIuc2V0U2VxdWVuY2VHZW5lcmF0b3IoeG1sR2VuZXJhdG9yKTsKLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNlcXVlbmNlIGdlbmVyYXRvciBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5zZXRTZXF1ZW5jZUdlbmVyYXRvcl8obnVsbCk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yQ29udGFpbmVyLnNldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZFNlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciB4bWxHZW5lcmF0b3IgPSB0aGlzLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJldHVybiAoeG1sR2VuZXJhdG9yID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRTZXF1ZW5jZUdlbmVyYXRvcih4bWxHZW5lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCBYbWxTZXF1ZW5jZUdlbmVyYXRvciBnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMueG1sR2VuZXJhdG9yQ29udGFpbmVyLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgeG1sU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1TZXF1ZW5jZUdlbmVyYXRvcih0aGlzLCB4bWxTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1NlcXVlbmNlR2VuZXJhdG9yKCkgewotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciB4bWxHZW5lcmF0b3IgPSB0aGlzLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWlmICh4bWxHZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0U2VxdWVuY2VHZW5lcmF0b3JfKG51bGwpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpICYmICh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLmdldFhtbEdlbmVyYXRvcigpID09IHhtbEdlbmVyYXRvcikpIHsKLQkJCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRTZXF1ZW5jZUdlbmVyYXRvcl8odGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yKHhtbEdlbmVyYXRvcikpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3JfKE9ybVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCU9ybVNlcXVlbmNlR2VuZXJhdG9yIG9sZCA9IHRoaXMuc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSwgb2xkLCBzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIGdlbmVyYXRvciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCX0KLQotCXB1YmxpYyBPcm1UYWJsZUdlbmVyYXRvciBhZGRUYWJsZUdlbmVyYXRvcigpIHsKLQkJaWYgKHRoaXMudGFibGVHZW5lcmF0b3IgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigidGFibGUgZ2VuZXJhdG9yIGFscmVhZHkgZXhpc3RzOiAiICsgdGhpcy50YWJsZUdlbmVyYXRvcik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlYbWxUYWJsZUdlbmVyYXRvciB4bWxHZW5lcmF0b3IgPSB0aGlzLmJ1aWxkWG1sVGFibGVHZW5lcmF0b3IoKTsKLQkJT3JtVGFibGVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gdGhpcy5idWlsZFRhYmxlR2VuZXJhdG9yKHhtbEdlbmVyYXRvcik7Ci0JCXRoaXMuc2V0VGFibGVHZW5lcmF0b3JfKGdlbmVyYXRvcik7Ci0JCXRoaXMueG1sR2VuZXJhdG9yQ29udGFpbmVyLnNldFRhYmxlR2VuZXJhdG9yKHhtbEdlbmVyYXRvcik7Ci0JCXJldHVybiBnZW5lcmF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFRhYmxlR2VuZXJhdG9yIGJ1aWxkWG1sVGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgewotCQlpZiAodGhpcy50YWJsZUdlbmVyYXRvciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0YWJsZSBnZW5lcmF0b3IgZG9lcyBub3QgZXhpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuc2V0VGFibGVHZW5lcmF0b3JfKG51bGwpOwotCQl0aGlzLnhtbEdlbmVyYXRvckNvbnRhaW5lci5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVGFibGVHZW5lcmF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvcigpIHsKLQkJWG1sVGFibGVHZW5lcmF0b3IgeG1sR2VuZXJhdG9yID0gdGhpcy5nZXRYbWxUYWJsZUdlbmVyYXRvcigpOwotCQlyZXR1cm4gKHhtbEdlbmVyYXRvciA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3IoeG1sR2VuZXJhdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sVGFibGVHZW5lcmF0b3IgZ2V0WG1sVGFibGVHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEdlbmVyYXRvckNvbnRhaW5lci5nZXRUYWJsZUdlbmVyYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBPcm1UYWJsZUdlbmVyYXRvciBidWlsZFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIHhtbFRhYmxlR2VuZXJhdG9yKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVGFibGVHZW5lcmF0b3IodGhpcywgeG1sVGFibGVHZW5lcmF0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNUYWJsZUdlbmVyYXRvcigpIHsKLQkJWG1sVGFibGVHZW5lcmF0b3IgeG1sR2VuZXJhdG9yID0gdGhpcy5nZXRYbWxUYWJsZUdlbmVyYXRvcigpOwotCQlpZiAoeG1sR2VuZXJhdG9yID09IG51bGwpIHsKLQkJCWlmICh0aGlzLnRhYmxlR2VuZXJhdG9yICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldFRhYmxlR2VuZXJhdG9yXyhudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy50YWJsZUdlbmVyYXRvciAhPSBudWxsKSAmJiAodGhpcy50YWJsZUdlbmVyYXRvci5nZXRYbWxHZW5lcmF0b3IoKSA9PSB4bWxHZW5lcmF0b3IpKSB7Ci0JCQkJdGhpcy50YWJsZUdlbmVyYXRvci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0VGFibGVHZW5lcmF0b3JfKHRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvcih4bWxHZW5lcmF0b3IpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFRhYmxlR2VuZXJhdG9yXyhPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcikgewotCQlPcm1UYWJsZUdlbmVyYXRvciBvbGQgPSB0aGlzLnRhYmxlR2VuZXJhdG9yOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3I7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChUQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFksIG9sZCwgdGFibGVHZW5lcmF0b3IpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBnZW5lcmF0b3JzIGFyZSB2YWxpZGF0ZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdCN2YWxpZGF0ZUdlbmVyYXRvcnMoTGlzdCwgSVJlcG9ydGVyKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gZ2VuZXJhdG9ycyBhcmUgdmFsaWRhdGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy54bWxHZW5lcmF0b3JDb250YWluZXIuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldEdlbmVyYXRvcnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8R2VuZXJhdG9yPih0aGlzLmdldEdlbmVyYXRvcnNfKCksIE5vdE51bGxGaWx0ZXIuPEdlbmVyYXRvcj5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8R2VuZXJhdG9yPiBnZXRHZW5lcmF0b3JzXygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPEdlbmVyYXRvcj4odGhpcy5zZXF1ZW5jZUdlbmVyYXRvciwgdGhpcy50YWJsZUdlbmVyYXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtSWRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4Yjg3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBJRCBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtSWRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUlkTWFwcGluZzxYbWxJZD4KLXsKLQlwdWJsaWMgR2VuZXJpY09ybUlkTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sSWQgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5Db2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhZWM3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIGNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUpvaW5Db2x1bW4KLQlleHRlbmRzIEFic3RyYWN0T3JtQmFzZUNvbHVtbjxYbWxKb2luQ29sdW1uLCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXI+Ci0JaW1wbGVtZW50cyBPcm1Kb2luQ29sdW1uCi17Ci0JLyoqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTmFtZWRDb2x1bW4jQWJzdHJhY3RPcm1OYW1lZENvbHVtbihYbWxDb250ZXh0Tm9kZSwgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbikgKi8KLQlwcm90ZWN0ZWQgLyogZmluYWwgKi8gWG1sSm9pbkNvbHVtbiB4bWxDb2x1bW47ICAvLyBudWxsIGZvciBkZWZhdWx0IGpvaW4gY29sdW1ucwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1Kb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXRoaXMocGFyZW50LCBvd25lciwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEdlbmVyaWNPcm1Kb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBYbWxKb2luQ29sdW1uIHhtbENvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyLCB4bWxDb2x1bW4pOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gdGhpcy5idWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKHRoaXMuYnVpbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYTUwgY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxKb2luQ29sdW1uIGdldFhtbENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29sdW1uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFhtbENvbHVtbihYbWxKb2luQ29sdW1uIHhtbENvbHVtbikgewotCQl0aGlzLnhtbENvbHVtbiA9IHhtbENvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBqb2luIGNvbHVtbnMgYXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uOwotCSAqIHRoZSAnam9pbi1jb2x1bW4nIGVsZW1lbnQgd2lsbCBiZSByZW1vdmVkL2FkZGVkCi0JICogd2hlbiB0aGUgWE1MIGpvaW4gY29sdW1uIGlzIHJlbW92ZWQgZnJvbS9hZGRlZCB0bwotCSAqIHRoZSBvd25lcidzIGNvbGxlY3Rpb24KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sSm9pbkNvbHVtbiBidWlsZFhtbENvbHVtbigpIHsKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiWE1MIGpvaW4gY29sdW1uIGlzIG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgI2J1aWxkWG1sQ29sdW1uKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxDb2x1bW4oKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lIDogdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8obmFtZSk7Ci0JCXRoaXMuZ2V0WG1sQ29sdW1uKCkuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW4oKTsKLQkJcmV0dXJuIChqb2luQ29sdW1uID09IG51bGwpID8gbnVsbCA6IGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pbkNvbHVtbkRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLm93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW4gZ2V0UmVmZXJlbmNlZERiQ29sdW1uKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbklzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlZmVyZW5jZWREYkNvbHVtbigpICE9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luQ29sdW1uIG9sZENvbHVtbikgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRDb2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG9sZENvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luQ29sdW1uIHZpcnR1YWxDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxDb2x1bW4pOwotCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHZpcnR1YWxDb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5qb2luQ29sdW1uSXNEZWZhdWx0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UodGhpcy54bWxDb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGViMWNiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Kb2luVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBqb2luIHRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtSm9pblRhYmxlCi0JZXh0ZW5kcyBHZW5lcmljT3JtUmVmZXJlbmNlVGFibGU8WG1sSm9pblRhYmxlPgotCWltcGxlbWVudHMgT3JtSm9pblRhYmxlCi17Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUpvaW5Db2x1bW4sIFhtbEpvaW5Db2x1bW4+IHNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIgaW52ZXJzZUpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1Kb2luVGFibGUoT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgcGFyZW50LCBPd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbk93bmVyID0gdGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1SZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCQlpZiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWE1MIHRhYmxlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxKb2luVGFibGUgZ2V0WG1sVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0WG1sSm9pblRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbEpvaW5UYWJsZSBidWlsZFhtbFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmJ1aWxkWG1sSm9pblRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sVGFibGUoKSB7Ci0JCXRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS5yZW1vdmVYbWxKb2luVGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW52ZXJzZSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb252ZXJ0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uVG9TcGVjaWZpZWQoKSB7Ci0JCU1hcHBpbmdUb29scy5jb252ZXJ0Sm9pblRhYmxlRGVmYXVsdFRvU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4odGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgIT0gMDsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbih0aGlzLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCVhtbEpvaW5UYWJsZSB4bWxUYWJsZSA9IHRoaXMuZ2V0WG1sVGFibGVGb3JVcGRhdGUoKTsKLQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gdGhpcy5idWlsZFhtbEpvaW5Db2x1bW4oKTsKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sSm9pbkNvbHVtbik7Ci0JCXhtbFRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZChpbmRleCwgeG1sSm9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1Kb2luQ29sdW1uKSBqb2luQ29sdW1uKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLmdldFhtbFRhYmxlKCkuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy5yZW1vdmVYbWxUYWJsZUlmVW5zZXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRYbWxUYWJsZSgpLmdldEludmVyc2VKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhclNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lci5jbGVhckNvbnRleHRMaXN0KCk7Ci0JCXRoaXMuZ2V0WG1sVGFibGUoKS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSm9pbkNvbHVtbj4gZ2V0WG1sSW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlYbWxKb2luVGFibGUgeG1sVGFibGUgPSB0aGlzLmdldFhtbFRhYmxlKCk7Ci0JCXJldHVybiAoeG1sVGFibGUgPT0gbnVsbCkgPwotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxYbWxKb2luQ29sdW1uPmluc3RhbmNlKCkgOgotCQkJCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJCQluZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbEpvaW5Db2x1bW4+KHhtbFRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtSm9pbkNvbHVtbiwgWG1sSm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbkNvbnRhaW5lcigpIHsKLQkJU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5Db250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIGludmVyc2Ugam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uQ29udGFpbmVyCi0JCWV4dGVuZHMgQ29udGV4dExpc3RDb250YWluZXI8T3JtSm9pbkNvbHVtbiwgWG1sSm9pbkNvbHVtbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRleHRFbGVtZW50c1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBTUEVDSUZJRURfSU5WRVJTRV9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybUpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChYbWxKb2luQ29sdW1uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5idWlsZEludmVyc2VKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSm9pbkNvbHVtbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0WG1sSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxKb2luQ29sdW1uIGdldFJlc291cmNlRWxlbWVudChPcm1Kb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sQ29sdW1uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBJbnZlcnNlSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgaW52ZXJzZSBqb2luIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBnZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCU9ybUpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID0gam9pbkNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5WRVJTRV9KT0lOX0NPTFVNTiwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPE9ybUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKSkgewotCQkJaWYgKHRoaXMuZGVmYXVsdEludmVyc2VKb2luQ29sdW1uID09IG51bGwpIHsKLQkJCQl0aGlzLnNldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbih0aGlzLmJ1aWxkSW52ZXJzZUpvaW5Db2x1bW4obnVsbCkpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmRlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRzRGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gISB0aGlzLmhhc1NwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmdldEpvaW5UYWJsZURlZmF1bHROYW1lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlKb2luVGFibGUgb2xkVGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkVGFibGUpOwotCQlmb3IgKFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uIDogb2xkVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKS5pbml0aWFsaXplRnJvbShqb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbChSZWFkT25seUpvaW5UYWJsZSB2aXJ0dWFsVGFibGUpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxUYWJsZSk7Ci0JCWZvciAoUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4gOiB2aXJ0dWFsVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKS5pbml0aWFsaXplRnJvbVZpcnR1YWwoam9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZEludmVyc2VKb2luQ29sdW1uKFhtbEpvaW5Db2x1bW4geG1sSm9pbkNvbHVtbikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUpvaW5Db2x1bW4odGhpcywgdGhpcy5pbnZlcnNlSm9pbkNvbHVtbk93bmVyLCB4bWxKb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlSm9pbkNvbHVtbnMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZUpvaW5Db2x1bW5zKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMudmFsaWRhdGVOb2Rlcyh0aGlzLmdldEludmVyc2VKb2luQ29sdW1ucygpLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gb3duZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIGp1c3QgYSBsaXR0bGUgY29tbW9uIGJlaGF2aW9yCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyCi0JewotCQlwcm90ZWN0ZWQgQWJzdHJhY3RKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIElmIHRoZXJlIGlzIGEgc3BlY2lmaWVkIHRhYmxlIG5hbWUgaXQgbmVlZHMgdG8gYmUgdGhlIHNhbWUKLQkJICogdGhlIGRlZmF1bHQgdGFibGUgbmFtZS4gVGhlIHRhYmxlIGlzIGFsd2F5cyB0aGUgam9pbiB0YWJsZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpLCB0YWJsZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gb25seSBiZSBvbiB0aGUgam9pbiB0YWJsZSBpdHNlbGYKLQkJICovCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXROYW1lKCksIHRhYmxlTmFtZSkgPwotCQkJCQlHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0RGJUYWJsZSgpIDoKLQkJCQkJbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMsIG9idmlvdXNseSwgaW4gdGhlIGpvaW4gdGFibGU7Ci0JCSAqIG5vdCBzdXJlIHdoZXRoZXIgaXQgY2FuIGJlIGFueXdoZXJlIGVsc2UuLi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT3JtUmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCkuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0UmVsYXRpb25zaGlwU3RyYXRlZ3koKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcFN0cmF0ZWd5KCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBqb2luIGNvbHVtbnM7Ci0JICogdGhlc2UgcG9pbnQgYXQgdGhlIHNvdXJjZS9vd25pbmcgZW50aXR5Ci0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEpvaW5Db2x1bW5Pd25lcgotCQlleHRlbmRzIEFic3RyYWN0Sm9pbkNvbHVtbk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0RW50aXR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldFRhcmdldEF0dHJpYnV0ZU5hbWUoR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBkYlRhYmxlID0gc3VwZXIucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUgOiB0aGlzLmdldFR5cGVNYXBwaW5nKCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUpvaW5UYWJsZS50aGlzLmRlZmF1bHRKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcigoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMsIChKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogb3duZXIgZm9yICJmb3J3YXJkLXBvaW50ZXIiIGpvaW4gY29sdW1uczsKLQkgKiB0aGVzZSBwb2ludCBhdCB0aGUgdGFyZ2V0L2ludmVyc2UgZW50aXR5Ci0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEludmVyc2VKb2luQ29sdW1uT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdEpvaW5Db2x1bW5Pd25lcgotCXsKLQkJcHJvdGVjdGVkIEludmVyc2VKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBHZW5lcmljT3JtSm9pblRhYmxlLnRoaXMuZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpOwotCQkJcmV0dXJuIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCVJlbGF0aW9uc2hpcE1hcHBpbmcgcmVsYXRpb25zaGlwTWFwcGluZyA9IEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKHJlbGF0aW9uc2hpcE1hcHBpbmcgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwTWFwcGluZy5nZXROYW1lKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBkYlRhYmxlID0gc3VwZXIucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQkJCWlmIChkYlRhYmxlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZGJUYWJsZTsKLQkJCX0KLQkJCUVudGl0eSByZWxhdGlvbnNoaXBUYXJnZXQgPSB0aGlzLmdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCQkJcmV0dXJuIChyZWxhdGlvbnNoaXBUYXJnZXQgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwVGFyZ2V0LnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJCUVudGl0eSByZWxhdGlvbnNoaXBUYXJnZXQgPSB0aGlzLmdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCQkJcmV0dXJuIChyZWxhdGlvbnNoaXBUYXJnZXQgPT0gbnVsbCkgPyBudWxsIDogcmVsYXRpb25zaGlwVGFyZ2V0LmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBqb2luQ29sdW1uSXNEZWZhdWx0KFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5kZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4gPT0gam9pbkNvbHVtbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Kb2luVGFibGUudGhpcy5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBTdHJhdGVneSgpLmJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Mb2JDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUxvYkNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTFlYzE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybUxvYkNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Mb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTG9iQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUxvYkNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RPcm1Db252ZXJ0ZXIKLQlpbXBsZW1lbnRzIE9ybUxvYkNvbnZlcnRlcgotewotCXB1YmxpYyBHZW5lcmljT3JtTG9iQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcm1Db252ZXJ0ZXIuT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENvbnZlcnRpYmxlTWFwcGluZyBnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoWG1sQ29udmVydGlibGVNYXBwaW5nKSB0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIExvYkNvbnZlcnRlci5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpLnNldExvYih0cnVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpLmdldExvYlRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9NYW55TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTAwMmIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0T3JtTWFueVRvTWFueU1hcHBpbmc8WG1sTWFueVRvTWFueT4KLXsKLQlwdWJsaWMgR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9NYW55IHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MGM0ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFueVRvT25lTWFwcGluZyAKLQlleHRlbmRzIEFic3RyYWN0T3JtTWFueVRvT25lTWFwcGluZzxYbWxNYW55VG9PbmU+Ci17Ci0JcHVibGljIEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCBYbWxNYW55VG9PbmUgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUwMTQ1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHBlZCBzdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFwcGVkU3VwZXJjbGFzcwotCWV4dGVuZHMgQWJzdHJhY3RPcm1NYXBwZWRTdXBlcmNsYXNzPFhtbE1hcHBlZFN1cGVyY2xhc3M+Ci17Ci0JcHVibGljIEdlbmVyaWNPcm1NYXBwZWRTdXBlcmNsYXNzKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCByZXNvdXJjZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlhYTU4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG5hbWVkIG5hdGl2ZSBxdWVyeQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkKLQlleHRlbmRzIEFic3RyYWN0T3JtUXVlcnk8WG1sTmFtZWROYXRpdmVRdWVyeT4KLQlpbXBsZW1lbnRzIE9ybU5hbWVkTmF0aXZlUXVlcnkKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdENsYXNzOwotCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybU5hbWVkTmF0aXZlUXVlcnkoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHhtbE5hbWVkTmF0aXZlUXVlcnkpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxOYW1lZE5hdGl2ZVF1ZXJ5KTsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IHhtbE5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKTsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0geG1sTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0UmVzdWx0Q2xhc3NfKHRoaXMueG1sUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCXRoaXMuc2V0UmVzdWx0U2V0TWFwcGluZ18odGhpcy54bWxRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXN1bHQgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRSZXN1bHRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMucmVzdWx0Q2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q2xhc3MoU3RyaW5nIHJlc3VsdENsYXNzKSB7Ci0JCXRoaXMuc2V0UmVzdWx0Q2xhc3NfKHJlc3VsdENsYXNzKTsKLQkJdGhpcy54bWxRdWVyeS5zZXRSZXN1bHRDbGFzcyhyZXN1bHRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UmVzdWx0Q2xhc3NfKFN0cmluZyByZXN1bHRDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5yZXN1bHRDbGFzczsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IHJlc3VsdENsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVTVUxUX0NMQVNTX1BST1BFUlRZLCBvbGQsIHJlc3VsdENsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRSZXN1bHRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiAnJCc7Ci0JfQotCi0JcHVibGljIElUeXBlIGdldFJlc3VsdENsYXNzSmR0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ0ZpbGVSb290KCkucmVzb2x2ZUpkdFR5cGUodGhpcy5nZXRSZXN1bHRDbGFzcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzdWx0IHNldCBtYXBwaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKSB7Ci0JCXRoaXMuc2V0UmVzdWx0U2V0TWFwcGluZ18ocmVzdWx0U2V0TWFwcGluZyk7Ci0JCXRoaXMueG1sUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhyZXN1bHRTZXRNYXBwaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nXyhTdHJpbmcgcmVzdWx0U2V0TWFwcGluZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSByZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZLCBvbGQsIHJlc3VsdFNldE1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUXVlcnlfKEpwYUpwcWxRdWVyeUhlbHBlciBxdWVyeUhlbHBlciwgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHlldAotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXJldHVybiBzdXBlci5pc0lkZW50aWNhbChxdWVyeSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRSZXN1bHRDbGFzcygpLCAoKEdlbmVyaWNPcm1OYW1lZE5hdGl2ZVF1ZXJ5KXF1ZXJ5KS5nZXRSZXN1bHRDbGFzcygpKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldFJlc3VsdFNldE1hcHBpbmcoKSwgKChHZW5lcmljT3JtTmFtZWROYXRpdmVRdWVyeSlxdWVyeSkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPE5hbWVkTmF0aXZlUXVlcnk+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OTdlMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtTmFtZWRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5KcGFKcHFsUXVlcnlIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkV4cHJlc3Npb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG5hbWVkIHF1ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTmFtZWRRdWVyeQotCWV4dGVuZHMgQWJzdHJhY3RPcm1RdWVyeTxYbWxOYW1lZFF1ZXJ5PgotCWltcGxlbWVudHMgT3JtTmFtZWRRdWVyeQotewotCXB1YmxpYyBHZW5lcmljT3JtTmFtZWRRdWVyeShYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbE5hbWVkUXVlcnkgcmVzb3VyY2VOYW1lZFF1ZXJ5KSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VOYW1lZFF1ZXJ5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVF1ZXJ5XyhKcGFKcHFsUXVlcnlIZWxwZXIgcXVlcnlIZWxwZXIsIExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQkvLyBDb252ZXJ0IHRoZSBsaXRlcmFsIGVzY2FwZSBjaGFyYWN0ZXJzIGludG8gYWN0dWFsIGVzY2FwZSBjaGFyYWN0ZXJzCi0JCVN0cmluZyBqcHFsUXVlcnkgPSBFeHByZXNzaW9uVG9vbHMudW5lc2NhcGUodGhpcy5xdWVyeSwgbmV3IGludFsxXSk7Ci0KLQkJcXVlcnlIZWxwZXIudmFsaWRhdGUodGhpcywganBxbFF1ZXJ5LCB0aGlzLmdldFF1ZXJ5VGV4dFJhbmdlKCksIDAsIG1lc3NhZ2VzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPE5hbWVkUXVlcnk+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBOYW1lZFF1ZXJ5LmNsYXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzRmODRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbnVsbCBhdHRyaWJ1dGUgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU51bGxBdHRyaWJ1dGVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0JcHVibGljIEdlbmVyaWNPcm1OdWxsQXR0cmlidXRlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE1ldGFtb2RlbEZpZWxkIGdldE1ldGFtb2RlbEZpZWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGFkN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybU9uZVRvTWFueU1hcHBpbmc8WG1sT25lVG9NYW55PgotewotCXB1YmxpYyBHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sT25lVG9NYW55IHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODljZWY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IDE6MSBtYXBwaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nIAotCWV4dGVuZHMgQWJzdHJhY3RPcm1PbmVUb09uZU1hcHBpbmc8WG1sT25lVG9PbmU+Ci17Ci0JcHVibGljIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbE9uZVRvT25lIHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PcmRlcmFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU9yZGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjExYmI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU9yZGVyYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG9yZGVyaW5nCi0gKiA8cD4KLSAqIDxzdHJvbmc+TkI6PC9zdHJvbmc+IFNldHRpbmcgYW55IGZsYWcgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+IChvciBzZXR0aW5nIHRoZQotICogc3BlY2lmaWVkICJvcmRlciBieSIgdG8gPGNvZGU+bnVsbDwvY29kZT4pIGNhbiBiZSBhIGJpdCB1bnByZWRpY3RhYmxlLiBUaGUKLSAqIGludGVudCBpcyB0byBzZXQgYSBmbGFnIHRvIDxjb2RlPnRydWU8L2NvZGU+IChvciBzZXQgdGhlIHNwZWNpZmllZCAib3JkZXIgYnkiCi0gKiB0byBhIG5vbi08Y29kZT5udWxsPC9jb2RlPiB2YWx1ZSkuCi0gKiA8cD4KLSAqIDxzdHJvbmc+KEpQQSAyLjAgb25seSkgTkI6PC9zdHJvbmc+IElmIGJvdGggdGhlICJvcmRlci1ieSIgYW5kIHRoZQotICogIm9yZGVyLWNvbHVtbiIgZWxlbWVudHMgYXJlIHByZXNlbnQgKHdoaWNoIGlzIHByb2hpYml0ZWQgYnkgdGhlIEpQQSBzcGVjKSwKLSAqIGJvdGggYXJlIGlnbm9yZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtT3JkZXJhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1PcmRlcmFibGUyXzAKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE9yZGVyQnk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gbm9PcmRlcmluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIHBrT3JkZXJpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjdXN0b21PcmRlcmluZyA9IGZhbHNlOwotCi0JLy8gSlBBIDIuMAotCXByb3RlY3RlZCBmaW5hbCBPd25lciBvd25lcjsgIC8vIHRoaXMgaXMgbnVsbCBmb3IgSlBBIDEuMCBtYXBwaW5ncwotCXByb3RlY3RlZCBib29sZWFuIG9yZGVyQ29sdW1uT3JkZXJpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW47ICAvLyB0aGlzIGlzIG51bGwgZm9yIEpQQSAxLjAgbWFwcGluZ3MKLQotCi0JLyoqCi0JICogSlBBIDEuMAotCSAqLwotCXB1YmxpYyBHZW5lcmljT3JtT3JkZXJhYmxlKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBKUEEgMi4wCi0JICovCi0JcHVibGljIEdlbmVyaWNPcm1PcmRlcmFibGUoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0KLQkJdGhpcy5zcGVjaWZpZWRPcmRlckJ5ID0gdGhpcy5idWlsZFNwZWNpZmllZE9yZGVyQnkoKTsKLQkJdGhpcy5ub09yZGVyaW5nID0gdGhpcy5idWlsZE5vT3JkZXJpbmcoKTsKLQkJdGhpcy5wa09yZGVyaW5nID0gdGhpcy5idWlsZFBrT3JkZXJpbmcoKTsKLQkJdGhpcy5jdXN0b21PcmRlcmluZyA9IHRoaXMuYnVpbGRDdXN0b21PcmRlcmluZygpOwotCi0JCXRoaXMub3duZXIgPSBvd25lcjsKLQkJdGhpcy5vcmRlckNvbHVtbk9yZGVyaW5nID0gdGhpcy5idWlsZE9yZGVyQ29sdW1uT3JkZXJpbmcoKTsKLQkJdGhpcy5vcmRlckNvbHVtbiA9IHRoaXMuYnVpbGRPcmRlckNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8odGhpcy5idWlsZFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCXRoaXMuc2V0Tm9PcmRlcmluZ18odGhpcy5idWlsZE5vT3JkZXJpbmcoKSk7Ci0JCXRoaXMuc2V0UGtPcmRlcmluZ18odGhpcy5idWlsZFBrT3JkZXJpbmcoKSk7Ci0JCXRoaXMuc2V0Q3VzdG9tT3JkZXJpbmdfKHRoaXMuYnVpbGRDdXN0b21PcmRlcmluZygpKTsKLQotCQl0aGlzLnNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKHRoaXMuYnVpbGRPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlpZiAodGhpcy5vcmRlckNvbHVtbiAhPSBudWxsKSB7Ci0JCQl0aGlzLm9yZGVyQ29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCWlmICh0aGlzLm9yZGVyQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMub3JkZXJDb2x1bW4udXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIG9yZGVyIGJ5ICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkT3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3JkZXJCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcmRlckJ5KFN0cmluZyBvcmRlckJ5KSB7Ci0JCWlmIChvcmRlckJ5ICE9IG51bGwpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8ob3JkZXJCeSk7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmdfKGZhbHNlKTsKLQkJCXRoaXMuc2V0UGtPcmRlcmluZ18ob3JkZXJCeS5sZW5ndGgoKSA9PSAwKTsKLQkJCXRoaXMuc2V0Q3VzdG9tT3JkZXJpbmdfKG9yZGVyQnkubGVuZ3RoKCkgIT0gMCk7Ci0JCQl0aGlzLnNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKGZhbHNlKTsKLQotCQkJdGhpcy5yZW1vdmVYbWxPcmRlckNvbHVtbigpOwotCQkJdGhpcy5nZXRYbWxPcmRlcmFibGUoKS5zZXRPcmRlckJ5KG9yZGVyQnkpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXROb09yZGVyaW5nKHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkT3JkZXJCeV8oU3RyaW5nIG9yZGVyQnkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkT3JkZXJCeTsKLQkJdGhpcy5zcGVjaWZpZWRPcmRlckJ5ID0gb3JkZXJCeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9PUkRFUl9CWV9QUk9QRVJUWSwgb2xkLCBvcmRlckJ5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkT3JkZXJCeSgpIHsKLQkJaWYgKHRoaXMueG1sT3JkZXJDb2x1bW5Jc1ByZXNlbnQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZ2V0WG1sT3JkZXJCeSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBubyBvcmRlcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc05vT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLm5vT3JkZXJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9PcmRlcmluZyhib29sZWFuIG5vT3JkZXJpbmcpIHsKLQkJaWYgKG5vT3JkZXJpbmcpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeV8obnVsbCk7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmdfKHRydWUpOwotCQkJdGhpcy5zZXRQa09yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKGZhbHNlKTsKLQotCQkJdGhpcy5yZW1vdmVYbWxPcmRlckNvbHVtbigpOwotCQkJdGhpcy5nZXRYbWxPcmRlcmFibGUoKS5zZXRPcmRlckJ5KG51bGwpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRQa09yZGVyaW5nKHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm9PcmRlcmluZ18oYm9vbGVhbiBub09yZGVyaW5nKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5ub09yZGVyaW5nOwotCQl0aGlzLm5vT3JkZXJpbmcgPSBub09yZGVyaW5nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fT1JERVJJTkdfUFJPUEVSVFksIG9sZCwgbm9PcmRlcmluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGROb09yZGVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/IHRoaXMuYnVpbGROb09yZGVyaW5nMl8wKCkgOiB0aGlzLmJ1aWxkTm9PcmRlcmluZzFfMCgpOwotCX0KLQotCS8qKgotCSAqIGJvdGggZWxlbWVudHMgYXJlIG1pc3NpbmcgPGVtPm9yPC9lbT4gYm90aCBhcmUgcHJlc2VudAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkTm9PcmRlcmluZzJfMCgpIHsKLQkJYm9vbGVhbiBvcmRlckJ5TWlzc2luZyA9ICh0aGlzLmdldFhtbE9yZGVyQnkoKSA9PSBudWxsKTsKLQkJYm9vbGVhbiBvcmRlckJ5UHJlc2VudCA9ICEgb3JkZXJCeU1pc3Npbmc7Ci0JCWJvb2xlYW4gb3JkZXJDb2x1bW5NaXNzaW5nID0gKHRoaXMuZ2V0WG1sT3JkZXJDb2x1bW4oKSA9PSBudWxsKTsKLQkJYm9vbGVhbiBvcmRlckNvbHVtblByZXNlbnQgPSAhIG9yZGVyQ29sdW1uTWlzc2luZzsKLQkJcmV0dXJuIChvcmRlckJ5TWlzc2luZyAmJiBvcmRlckNvbHVtbk1pc3NpbmcpIHx8IChvcmRlckJ5UHJlc2VudCAmJiBvcmRlckNvbHVtblByZXNlbnQpOwotCX0KLQotCS8qKgotCSAqIHRoZSBvcmRlci1ieSBlbGVtZW50IGlzIG1pc3NpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE5vT3JkZXJpbmcxXzAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE9yZGVyQnkoKSA9PSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwayBvcmRlcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1BrT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnBrT3JkZXJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGtPcmRlcmluZyhib29sZWFuIHBrT3JkZXJpbmcpIHsKLQkJaWYgKHBrT3JkZXJpbmcpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkT3JkZXJCeSgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0Tm9PcmRlcmluZyh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFBrT3JkZXJpbmdfKGJvb2xlYW4gcGtPcmRlcmluZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMucGtPcmRlcmluZzsKLQkJdGhpcy5wa09yZGVyaW5nID0gcGtPcmRlcmluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX09SREVSSU5HX1BST1BFUlRZLCBvbGQsIHBrT3JkZXJpbmcpOwotCX0KLQotCS8qKgotCSAqIHRoZSBvcmRlci1ieSBlbGVtZW50IGlzIHByZXNlbnQgYnV0IG5vIHZhbHVlIHNwZWNpZmllZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUGtPcmRlcmluZygpIHsKLQkJaWYgKHRoaXMueG1sT3JkZXJDb2x1bW5Jc1ByZXNlbnQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB4bWxPcmRlckJ5ID0gdGhpcy5nZXRYbWxPcmRlckJ5KCk7Ci0JCXJldHVybiAoeG1sT3JkZXJCeSAhPSBudWxsKSAmJiAoeG1sT3JkZXJCeS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIG9yZGVyaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQ3VzdG9tT3JkZXJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbU9yZGVyaW5nOwotCX0KLQotCS8qKgotCSAqIFVuZm9ydHVuYXRlbHksIHNldHRpbmcgdGhlICJjdXN0b20gb3JkZXJpbmciIGZsYWcgZGlyZWN0bHkgaXMgYSBiaXQgaGFja3k6Ci0JICogVGhlICJzcGVjaWZpZWQgb3JkZXItYnkiIGlzIGluaXRpYWxseSBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nLCB3aGljaCBpcwotCSAqIHRoZSBzYW1lIGFzIGEgInByaW1hcnkga2V5IG9yZGVyaW5nIiBzdGF0ZS4uLi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21PcmRlcmluZyhib29sZWFuIGN1c3RvbU9yZGVyaW5nKSB7Ci0JCWlmIChjdXN0b21PcmRlcmluZykgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRPcmRlckJ5XygiIik7ICAvLyBobW1tLi4uIC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2V0Tm9PcmRlcmluZ18oZmFsc2UpOwotCQkJdGhpcy5zZXRQa09yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU9yZGVyaW5nXyh0cnVlKTsKLQkJCXRoaXMuc2V0T3JkZXJDb2x1bW5PcmRlcmluZ18oZmFsc2UpOwotCi0JCQl0aGlzLnJlbW92ZVhtbE9yZGVyQ29sdW1uKCk7Ci0JCQl0aGlzLmdldFhtbE9yZGVyYWJsZSgpLnNldE9yZGVyQnkoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldE5vT3JkZXJpbmcodHJ1ZSk7ICAvLyBobW1tLi4uCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21PcmRlcmluZ18oYm9vbGVhbiBjdXN0b21PcmRlcmluZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMuY3VzdG9tT3JkZXJpbmc7Ci0JCXRoaXMuY3VzdG9tT3JkZXJpbmcgPSBjdXN0b21PcmRlcmluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBjdXN0b21PcmRlcmluZyk7Ci0JfQotCi0JLyoqCi0JICogdGhlIG9yZGVyLWJ5IGVsZW1lbnQgaXMgcHJlc2VudCBhbmQgaXQgaGFzIGEgc3BlY2lmaWVkIHZhbHVlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRDdXN0b21PcmRlcmluZygpIHsKLQkJaWYgKHRoaXMueG1sT3JkZXJDb2x1bW5Jc1ByZXNlbnQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB4bWxPcmRlckJ5ID0gdGhpcy5nZXRYbWxPcmRlckJ5KCk7Ci0JCXJldHVybiAoeG1sT3JkZXJCeSAhPSBudWxsKSAmJiAoeG1sT3JkZXJCeS5sZW5ndGgoKSAhPSAwKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JkZXIgY29sdW1uIG9yZGVyaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzT3JkZXJDb2x1bW5PcmRlcmluZygpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJDb2x1bW5PcmRlcmluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcmRlckNvbHVtbk9yZGVyaW5nKGJvb2xlYW4gb3JkZXJDb2x1bW5PcmRlcmluZykgewotCQlpZiAob3JkZXJDb2x1bW5PcmRlcmluZykgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRPcmRlckJ5XyhudWxsKTsKLQkJCXRoaXMuc2V0Tm9PcmRlcmluZ18oZmFsc2UpOwotCQkJdGhpcy5zZXRQa09yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU9yZGVyaW5nXyhmYWxzZSk7Ci0JCQl0aGlzLnNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKHRydWUpOwotCi0JCQl0aGlzLmdldFhtbE9yZGVyYWJsZSgpLnNldE9yZGVyQnkobnVsbCk7Ci0JCQl0aGlzLmJ1aWxkWG1sT3JkZXJDb2x1bW4oKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0Tm9PcmRlcmluZyh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9yZGVyQ29sdW1uT3JkZXJpbmdfKGJvb2xlYW4gb3JkZXJDb2x1bW5PcmRlcmluZykgewotCQlib29sZWFuIG9sZCA9IHRoaXMub3JkZXJDb2x1bW5PcmRlcmluZzsKLQkJdGhpcy5vcmRlckNvbHVtbk9yZGVyaW5nID0gb3JkZXJDb2x1bW5PcmRlcmluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9SREVSX0NPTFVNTl9PUkRFUklOR19QUk9QRVJUWSwgb2xkLCBvcmRlckNvbHVtbk9yZGVyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBKUEEgMi4wIG9ubHk7Ci0JICogdGhlIDxjb2RlPm9yZGVyLWNvbHVtbjwvY29kZT4gZWxlbWVudCBpcyBwcmVzZW50IDxlbT5hbmQ8L2VtPgotCSAqIHRoZSA8Y29kZT5vcmRlci1ieTwvY29kZT4gZWxlbWVudCBpcyBtaXNzaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRPcmRlckNvbHVtbk9yZGVyaW5nKCkgewotCQlyZXR1cm4gdGhpcy54bWxPcmRlckNvbHVtbklzUHJlc2VudCgpICYmCi0JCQkJKHRoaXMuZ2V0WG1sT3JkZXJCeSgpID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcmRlciBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybU9yZGVyQ29sdW1uMl8wIGdldE9yZGVyQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5vcmRlckNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBKUEEgMi4wIG9ubHkKLQkgKi8KLQlwcm90ZWN0ZWQgT3JtT3JkZXJDb2x1bW4yXzAgYnVpbGRPcmRlckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuaXNPcm1YbWwyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5Ml8wKCkuYnVpbGRPcm1PcmRlckNvbHVtbih0aGlzLCBuZXcgT3JkZXJDb2x1bW5Pd25lcigpKSA6Ci0JCQkJbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogeG1sIG9yZGVyIGJ5ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0WG1sT3JkZXJCeSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sT3JkZXJhYmxlKCkuZ2V0T3JkZXJCeSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB4bWwgb3JkZXIgY29sdW1uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBYbWxPcmRlckNvbHVtbiBnZXRYbWxPcmRlckNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0WG1sT3JkZXJhYmxlKCkuZ2V0T3JkZXJDb2x1bW4oKTsKLQl9Ci0KLQkvKioKLQkgKiBOQjogT25seSByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIEpQQSAyLjAgbWFwcGluZ3MuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4geG1sT3JkZXJDb2x1bW5Jc1ByZXNlbnQoKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpICYmICh0aGlzLmdldFhtbE9yZGVyQ29sdW1uKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbE9yZGVyQ29sdW1uIGJ1aWxkWG1sT3JkZXJDb2x1bW4oKSB7Ci0JCVhtbE9yZGVyQ29sdW1uIHhtbENvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9yZGVyQ29sdW1uKCk7Ci0JCUdlbmVyaWNPcm1PcmRlcmFibGUudGhpcy5nZXRYbWxPcmRlcmFibGUoKS5zZXRPcmRlckNvbHVtbih4bWxDb2x1bW4pOwotCQlyZXR1cm4geG1sQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbE9yZGVyQ29sdW1uKCkgewotCQlpZiAodGhpcy54bWxPcmRlckNvbHVtbklzUHJlc2VudCgpKSB7Ci0JCQl0aGlzLmdldFhtbE9yZGVyYWJsZSgpLnNldE9yZGVyQ29sdW1uKG51bGwpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbE9yZGVyYWJsZSBnZXRYbWxPcmRlcmFibGUoKSB7Ci0JCXJldHVybiAoWG1sT3JkZXJhYmxlKSB0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JLy8gSlBBIDIuMAotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0VGFibGVOYW1lKCk7Ci0JfQotCi0JLy8gSlBBIDIuMAotCXByb3RlY3RlZCBUYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxPcmRlcmFibGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy8gb3JkZXItY29sdW1uIGFuZCBvcmRlci1ieSBib3RoIHNwZWNpZmllZCBpcyBoYW5kbGVkIHdpdGggc2NoZW1hIHZhbGlkYXRpb24KLQkJaWYgKHRoaXMub3JkZXJDb2x1bW5PcmRlcmluZykgewotCQkJLy8gVE9ETyB2YWxpZGF0aW9uIG1lc3NhZ2UgaWYgdHlwZSBpcyBub3QgTGlzdAotCQkJdGhpcy5vcmRlckNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9yZGVyIGNvbHVtbiBvd25lciAoSlBBIDIuMCkgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIE9yZGVyQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1PcmRlckNvbHVtbjJfMC5Pd25lcgotCXsKLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PcmRlcmFibGUudGhpcy5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PcmRlcmFibGUudGhpcy5yZXNvbHZlRGJUYWJsZSh0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE5hbWUoKSArICJfT1JERVIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU9yZGVyYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgT3JkZXJDb2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChPcmRlckNvbHVtbjJfMCkgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQotCQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gZ2V0WG1sQ29sdW1uKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PcmRlcmFibGUudGhpcy5nZXRYbWxPcmRlckNvbHVtbigpOwotCQl9Ci0KLQkJcHVibGljIFhtbE9yZGVyQ29sdW1uIGJ1aWxkWG1sQ29sdW1uKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1PcmRlcmFibGUudGhpcy5idWlsZFhtbE9yZGVyQ29sdW1uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVYbWxDb2x1bW4oKSB7Ci0JCQlHZW5lcmljT3JtT3JkZXJhYmxlLnRoaXMucmVtb3ZlWG1sT3JkZXJDb2x1bW4oKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybU9yZGVyYWJsZS50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PdmVycmlkZVJlbGF0aW9uc2hpcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWJlODNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybU92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZUNvbHVtbi5Pd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3ZlcnJpZGVKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk51bGxPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wCi17Ci0JcHJvdGVjdGVkIE9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1uU3RyYXRlZ3k7Ci0KLQkvLyBKUEEgMi4wCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5UYWJsZVN0cmF0ZWd5OwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybU92ZXJyaWRlUmVsYXRpb25zaGlwKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5ID0gdGhpcy5idWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRTdHJhdGVneSh0aGlzLmJ1aWxkU3RyYXRlZ3koKSk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN0cmF0ZWd5KE9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5KSB7Ci0JCU9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5IG9sZCA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGQsIHN0cmF0ZWd5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kgYnVpbGRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNKcGEyXzBDb21wYXRpYmxlKCkgPwotCQkJCXRoaXMuYnVpbGRTdHJhdGVneTJfMCgpIDoKLQkJCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgb3ZlcnJpZGRlbiBtYXBwaW5nIGRldGVybWluZXMgdGhlIG92ZXJyaWRlJ3Mgc3RyYXRlZ3kuCi0JICovCi0JcHJvdGVjdGVkIE9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkU3RyYXRlZ3kyXzAoKSB7Ci0JCU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCBtYXBwaW5nU3RyYXRlZ3kgPSB0aGlzLmdldE1hcHBpbmdTdHJhdGVneSgpOwotCQlyZXR1cm4gKG1hcHBpbmdTdHJhdGVneSAhPSBudWxsKSA/Ci0JCQkJKE9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBtYXBwaW5nU3RyYXRlZ3kuc2VsZWN0T3ZlcnJpZGVTdHJhdGVneSh0aGlzKSA6Ci0JCQkJdGhpcy5idWlsZE1pc3NpbmdNYXBwaW5nU3RyYXRlZ3koKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN0cmF0ZWd5IGZyb20gdGhlIG92ZXJyaWRkZW4gbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGdldE1hcHBpbmdTdHJhdGVneSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRNYXBwaW5nKCk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiAoTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiB0aGUgb3ZlcnJpZGUncyBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZQotCSAqIG5hbWUgb2YgYW4gYXBwcm9wcmlhdGUgcmVsYXRpb25zaGlwIG1hcHBpbmcuCi0JICovCi0JcHJvdGVjdGVkIE9ybVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkTWlzc2luZ01hcHBpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPwotCQkJCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5IDoKLQkJCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbiBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpIHsKLQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJLy8gYXNzb2NpYXRpb24gb3ZlcnJpZGVzIGRvIG5vdCBoYXZlIGRlZmF1bHRzCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkSm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PdmVycmlkZUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpIHsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneS5hZGRTdHJhdGVneSgpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pblRhYmxlKCkgewotCQkvLyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgZG8gbm90IGhhdmUgZGVmYXVsdHMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSA/Ci0JCQkJbmV3IEdlbmVyaWNPcm1PdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wKHRoaXMpIDoKLQkJCQluZXcgTnVsbE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJzaW9ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJb2xkUmVsYXRpb25zaGlwLmluaXRpYWxpemVPbih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oUmVsYXRpb25zaGlwIG5ld1JlbGF0aW9uc2hpcCkgewotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JCW5ld1JlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21NYXBwZWRCeVJlbGF0aW9uc2hpcChNYXBwZWRCeVJlbGF0aW9uc2hpcCBvbGRSZWxhdGlvbnNoaXApIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Kb2luVGFibGVSZWxhdGlvbnNoaXAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb20ob2xkUmVsYXRpb25zaGlwLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tSm9pbkNvbHVtblJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgb2xkUmVsYXRpb25zaGlwKSB7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LmluaXRpYWxpemVGcm9tKG9sZFJlbGF0aW9uc2hpcC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAgdmlydHVhbFJlbGF0aW9uc2hpcCkgewotCQl2aXJ0dWFsUmVsYXRpb25zaGlwLmluaXRpYWxpemVPblNwZWNpZmllZCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT25TcGVjaWZpZWQoT3ZlcnJpZGVSZWxhdGlvbnNoaXAgc3BlY2lmaWVkUmVsYXRpb25zaGlwKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCB2aXJ0dWFsUmVsYXRpb25zaGlwKSB7Ci0JCXRoaXMuam9pblRhYmxlU3RyYXRlZ3kuaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKHZpcnR1YWxSZWxhdGlvbnNoaXAuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcChSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgdmlydHVhbFJlbGF0aW9uc2hpcCkgewotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5pbml0aWFsaXplRnJvbVZpcnR1YWwodmlydHVhbFJlbGF0aW9uc2hpcC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAoKSB7Ci0JCXJldHVybiAoT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMCkgdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JfQotCi0JcHVibGljIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgZ2V0WG1sQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0WG1sT3ZlcnJpZGUoKTsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRUeXBlTWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkudGFibGVOYW1lSXNJbnZhbGlkKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkucmVzb2x2ZURiVGFibGUodGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBPd25lciBvd25lciwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuYnVpbGRDb2x1bW5WYWxpZGF0b3IoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBFbnRpdHkgZ2V0RW50aXR5KCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgPyAoRW50aXR5KSB0eXBlTWFwcGluZyA6IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnN0cmF0ZWd5LnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZVZhbGlkYXRvcihSZWFkT25seUpvaW5UYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlMl8wKCkuYnVpbGRKb2luVGFibGVWYWxpZGF0b3IodGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlMl8wKCkuYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMCgpLmJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjI0MTg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUKLSAqIDxicj4KLSAqIDxjb2RlPnBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHM8L2NvZGU+IGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotCWV4dGVuZHMgQWJzdHJhY3RPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotewotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBHZW5lcmljT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGJ1aWxkWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNGI1ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUKLSAqIDxicj4KLSAqIDxjb2RlPnBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGE8L2NvZGU+IGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotCWV4dGVuZHMgQWJzdHJhY3RPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotewotCi0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFbnRpdHlNYXBwaW5ncyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGJ1aWxkWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfKCkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCXRoaXMuZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpLAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCksCi0JCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MKLQkJCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2NlMjk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCBhdHRyaWJ1dGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi0JZXh0ZW5kcyBTcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVBdHRyaWJ1dGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZUF0dHJpYnV0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gdGhpcy5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJaWYgKChqYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgJiYgKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCh0aGlzLmphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksCi0JCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQsCi0JCQkJCQkJbmV3IFN0cmluZ1tdIHsKLQkJCQkJCQkJdGhpcy5nZXROYW1lKCksCi0JCQkJCQkJCXRoaXMuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkKLQkJCQkJCQl9LAotCQkJCQkJCXRoaXMubWFwcGluZywKLQkJCQkJCQl0aGlzLm1hcHBpbmcuZ2V0TmFtZVRleHRSYW5nZSgpCi0JCQkJCQkpCi0JCQkJCSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnB0VmFsaWRhdG9yIGJ1aWxkQXR0aWJ1dGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzb3IoKS5idWlsZEF0dHJpYnV0ZVZhbGlkYXRvcih0aGlzLCBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTBiZmI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLlNwZWNpZmllZE9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmc7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlOjx1bD4KLSAqIDxsaT5tYXBwaW5nCi0gKiA8bGk+YWNjZXNzCi0gKiA8bGk+YXR0cmlidXRlcwotICogPGxpPnN1cGVyIHBlcnNpc3RlbnQgdHlwZQotICogPGxpPkphdmEgcGVyc2lzdGVudCB0eXBlCi0gKiA8L3VsPgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlCi0JZXh0ZW5kcyBTcGVjaWZpZWRPcm1QZXJzaXN0ZW50VHlwZQotewotCi0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZShFbnRpdHlNYXBwaW5ncyBwYXJlbnQsIFhtbFR5cGVNYXBwaW5nIHhtbFR5cGVNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sVHlwZU1hcHBpbmcpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Njc1N2E5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHByaW1hcnkga2V5IGpvaW4gY29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4KLQlleHRlbmRzIEFic3RyYWN0T3JtTmFtZWRDb2x1bW48WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4sIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXI+Ci0JaW1wbGVtZW50cyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbgotewotCS8qKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybU5hbWVkQ29sdW1uI0Fic3RyYWN0T3JtTmFtZWRDb2x1bW4oWG1sQ29udGV4dE5vZGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seU5hbWVkQ29sdW1uLk93bmVyLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4pICovCi0JcHJvdGVjdGVkIC8qIGZpbmFsICovIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbENvbHVtbjsgIC8vIG51bGwgZm9yIGRlZmF1bHQgcGsgam9pbiBjb2x1bW5zCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybVByaW1hcnlLZXlKb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lciwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4geG1sQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIHhtbENvbHVtbik7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZV8odGhpcy5idWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBjb2x1bW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGdldFhtbENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMueG1sQ29sdW1uOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFhtbENvbHVtbihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxDb2x1bW4pIHsKLQkJdGhpcy54bWxDb2x1bW4gPSB4bWxDb2x1bW47Ci0JfQotCi0JLyoqCi0JICogcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zIGFyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbjsKLQkgKiB0aGUgJ3ByaW1hcnkta2V5LWpvaW4tY29sdW1uJyBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZC9hZGRlZAotCSAqIHdoZW4gdGhlIFhNTCBqb2luIGNvbHVtbiBpcyByZW1vdmVkIGZyb20vYWRkZWQgdG8KLQkgKiB0aGUgb3duZXIncyBjb2xsZWN0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkWG1sQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJYTUwgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gaXMgbWlzc2luZyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSAjYnVpbGRYbWxDb2x1bW4oKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbENvbHVtbigpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgOiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhuYW1lKTsKLQkJdGhpcy54bWxDb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnhtbENvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnhtbENvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCS8vIFRPRE8gbm90IGNvcnJlY3Qgd2hlbiB3ZSBzdGFydCBzdXBwb3J0aW5nCi0JLy8gcHJpbWFyeSBrZXkgam9pbiBjb2x1bW5zIGluIDEtMSBtYXBwaW5ncwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRGVmYXVsdE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW4gZ2V0UmVmZXJlbmNlZERiQ29sdW1uKCkgewotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbklzUmVzb2x2ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlZmVyZW5jZWREYkNvbHVtbigpICE9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBvbGRDb2x1bW4pIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZUZyb20ob2xkQ29sdW1uKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShvbGRDb2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5qb2luQ29sdW1uSXNEZWZhdWx0KHRoaXMpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbENvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUXVlcnlDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExODg3My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1RdWVyeUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcXVlcnkgY29udGFpbmVyCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtUXVlcnlDb250YWluZXIKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVF1ZXJ5Q29udGFpbmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFhtbFF1ZXJ5Q29udGFpbmVyIHhtbFF1ZXJ5Q29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybU5hbWVkUXVlcnksIFhtbE5hbWVkUXVlcnk+IG5hbWVkUXVlcnlDb250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybU5hbWVkTmF0aXZlUXVlcnksIFhtbE5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcnlDb250YWluZXI7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtUXVlcnlDb250YWluZXIoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxRdWVyeUNvbnRhaW5lciB4bWxRdWVyeUNvbnRhaW5lcikgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbFF1ZXJ5Q29udGFpbmVyID0geG1sUXVlcnlDb250YWluZXI7Ci0JCXRoaXMubmFtZWRRdWVyeUNvbnRhaW5lciA9IHRoaXMuYnVpbGROYW1lZFF1ZXJ5Q29udGFpbmVyKCk7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lciA9IHRoaXMuYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY05hbWVkUXVlcmllcygpOwotCQl0aGlzLnN5bmNOYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0TmFtZWRRdWVyaWVzKCkpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBxdWVyaWVzICoqKioqKioqKioKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxRdWVyeT4gZ2V0UXVlcmllcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxRdWVyeT4odGhpcy5nZXROYW1lZFF1ZXJpZXMoKSwgdGhpcy5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWVkIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1OYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVkUXVlcnlDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lZFF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZFF1ZXJ5Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KCkgewotCQlyZXR1cm4gdGhpcy5hZGROYW1lZFF1ZXJ5KHRoaXMuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtTmFtZWRRdWVyeSBhZGROYW1lZFF1ZXJ5KGludCBpbmRleCkgewotCQlYbWxOYW1lZFF1ZXJ5IHhtbFF1ZXJ5ID0gdGhpcy5idWlsZFhtbE5hbWVkUXVlcnkoKTsKLQkJT3JtTmFtZWRRdWVyeSBxdWVyeSA9IHRoaXMubmFtZWRRdWVyeUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sUXVlcnkpOwotCQl0aGlzLnhtbFF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkUXVlcmllcygpLmFkZChpbmRleCwgeG1sUXVlcnkpOwotCQlyZXR1cm4gcXVlcnk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbE5hbWVkUXVlcnkgYnVpbGRYbWxOYW1lZFF1ZXJ5KCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkUXVlcnkoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCXRoaXMucmVtb3ZlTmFtZWRRdWVyeSh0aGlzLm5hbWVkUXVlcnlDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1OYW1lZFF1ZXJ5KSBuYW1lZFF1ZXJ5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWRRdWVyeShpbnQgaW5kZXgpIHsKLQkJdGhpcy5uYW1lZFF1ZXJ5Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy54bWxRdWVyeUNvbnRhaW5lci5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZFF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubmFtZWRRdWVyeUNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxRdWVyeUNvbnRhaW5lci5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU5hbWVkUXVlcnkgYnVpbGROYW1lZFF1ZXJ5KFhtbE5hbWVkUXVlcnkgeG1sTmFtZWRRdWVyeSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybU5hbWVkUXVlcnkodGhpcywgeG1sTmFtZWRRdWVyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY05hbWVkUXVlcmllcygpIHsKLQkJdGhpcy5uYW1lZFF1ZXJ5Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbE5hbWVkUXVlcnk+IGdldFhtbE5hbWVkUXVlcmllcygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxOYW1lZFF1ZXJ5Pih0aGlzLnhtbFF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkUXVlcmllcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtTmFtZWRRdWVyeSwgWG1sTmFtZWRRdWVyeT4gYnVpbGROYW1lZFF1ZXJ5Q29udGFpbmVyKCkgewotCQlOYW1lZFF1ZXJ5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBOYW1lZFF1ZXJ5Q29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogbmFtZWQgcXVlcnkgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIE5hbWVkUXVlcnlDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1OYW1lZFF1ZXJ5LCBYbWxOYW1lZFF1ZXJ5PgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIE5BTUVEX1FVRVJJRVNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIE9ybU5hbWVkUXVlcnkgYnVpbGRDb250ZXh0RWxlbWVudChYbWxOYW1lZFF1ZXJ5IHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1RdWVyeUNvbnRhaW5lci50aGlzLmJ1aWxkTmFtZWRRdWVyeShyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbE5hbWVkUXVlcnk+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVF1ZXJ5Q29udGFpbmVyLnRoaXMuZ2V0WG1sTmFtZWRRdWVyaWVzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxOYW1lZFF1ZXJ5IGdldFJlc291cmNlRWxlbWVudChPcm1OYW1lZFF1ZXJ5IGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sUXVlcnkoKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogbmFtZWQgbmF0aXZlIHF1ZXJpZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWVkTmF0aXZlUXVlcnlDb250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KCkgewotCQlyZXR1cm4gdGhpcy5hZGROYW1lZE5hdGl2ZVF1ZXJ5KHRoaXMuZ2V0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtTmFtZWROYXRpdmVRdWVyeSBhZGROYW1lZE5hdGl2ZVF1ZXJ5KGludCBpbmRleCkgewotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IHhtbFF1ZXJ5ID0gdGhpcy5idWlsZFhtbE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBxdWVyeSA9IHRoaXMubmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sUXVlcnkpOwotCQl0aGlzLnhtbFF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChpbmRleCwgeG1sUXVlcnkpOwotCQlyZXR1cm4gcXVlcnk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbE5hbWVkTmF0aXZlUXVlcnkgYnVpbGRYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5KSB7Ci0JCXRoaXMucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSh0aGlzLm5hbWVkTmF0aXZlUXVlcnlDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1OYW1lZE5hdGl2ZVF1ZXJ5KSBuYW1lZE5hdGl2ZVF1ZXJ5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTmFtZWROYXRpdmVRdWVyeShpbnQgaW5kZXgpIHsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy54bWxRdWVyeUNvbnRhaW5lci5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubmFtZWROYXRpdmVRdWVyeUNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxRdWVyeUNvbnRhaW5lci5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU5hbWVkTmF0aXZlUXVlcnkgYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5KFhtbE5hbWVkTmF0aXZlUXVlcnkgeG1sTmFtZWROYXRpdmVRdWVyeSkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybU5hbWVkTmF0aXZlUXVlcnkodGhpcywgeG1sTmFtZWROYXRpdmVRdWVyeSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY05hbWVkTmF0aXZlUXVlcmllcygpIHsKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbE5hbWVkTmF0aXZlUXVlcnk+IGdldFhtbE5hbWVkTmF0aXZlUXVlcmllcygpIHsKLQkJLy8gY2xvbmUgdG8gcmVkdWNlIGNoYW5jZSBvZiBjb25jdXJyZW5jeSBwcm9ibGVtcwotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxOYW1lZE5hdGl2ZVF1ZXJ5Pih0aGlzLnhtbFF1ZXJ5Q29udGFpbmVyLmdldE5hbWVkTmF0aXZlUXVlcmllcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtTmFtZWROYXRpdmVRdWVyeSwgWG1sTmFtZWROYXRpdmVRdWVyeT4gYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyKCkgewotCQlOYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5Q29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogbmFtZWQgcXVlcnkgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIE5hbWVkTmF0aXZlUXVlcnlDb250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5LCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5PgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIE5BTUVEX05BVElWRV9RVUVSSUVTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1OYW1lZE5hdGl2ZVF1ZXJ5IGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sTmFtZWROYXRpdmVRdWVyeSByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtUXVlcnlDb250YWluZXIudGhpcy5idWlsZE5hbWVkTmF0aXZlUXVlcnkocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1RdWVyeUNvbnRhaW5lci50aGlzLmdldFhtbE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sTmFtZWROYXRpdmVRdWVyeSBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtTmFtZWROYXRpdmVRdWVyeSBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbFF1ZXJ5KCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgcXVlcmllcyBhcmUgdmFsaWRhdGVkIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQjdmFsaWRhdGVRdWVyaWVzKExpc3QsIElSZXBvcnRlcikKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCS8vIHF1ZXJpZXMgYXJlIHZhbGlkYXRlZCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMueG1sUXVlcnlDb250YWluZXIuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBYbWxDb250ZXh0Tm9kZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoWG1sQ29udGV4dE5vZGUpIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVF1ZXJ5SGludC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUXVlcnlIaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3OTU5NzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUXVlcnlIaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQ7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gcXVlcnkgaGludAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVF1ZXJ5SGludAotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtUXVlcnlIaW50Ci17Ci0JcHJvdGVjdGVkIGZpbmFsIFhtbFF1ZXJ5SGludCB4bWxRdWVyeUhpbnQ7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1RdWVyeUhpbnQoT3JtUXVlcnkgcGFyZW50LCBYbWxRdWVyeUhpbnQgeG1sUXVlcnlIaW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMueG1sUXVlcnlIaW50ID0geG1sUXVlcnlIaW50OwotCQl0aGlzLm5hbWUgPSB4bWxRdWVyeUhpbnQuZ2V0TmFtZSgpOwotCQl0aGlzLnZhbHVlID0geG1sUXVlcnlIaW50LmdldFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy54bWxRdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy54bWxRdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5zZXROYW1lXyhuYW1lKTsKLQkJdGhpcy54bWxRdWVyeUhpbnQuc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJdGhpcy54bWxRdWVyeUhpbnQuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLnhtbFF1ZXJ5SGludC5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRRdWVyeSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50aWNhbChRdWVyeUhpbnQgaGludCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0TmFtZSgpLCBoaW50LmdldE5hbWUoKSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRWYWx1ZSgpLCBoaW50LmdldFZhbHVlKCkpIDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVF1ZXJ5IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1RdWVyeSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVF1ZXJ5IGdldFF1ZXJ5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sUXVlcnlIaW50IGdldFhtbFF1ZXJ5SGludCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUXVlcnlIaW50OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUmVmZXJlbmNlVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVJlZmVyZW5jZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZGM0YmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtUmVmZXJlbmNlVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlZmVyZW5jZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlZmVyZW5jZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGpvaW4gdGFibGUgb3IgY29sbGVjdGlvbiB0YWJsZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpY09ybVJlZmVyZW5jZVRhYmxlPFggZXh0ZW5kcyBBYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlPgotCWV4dGVuZHMgQWJzdHJhY3RPcm1UYWJsZTxYPgotCWltcGxlbWVudHMgT3JtUmVmZXJlbmNlVGFibGUKLXsKLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8T3JtSm9pbkNvbHVtbiwgWG1sSm9pbkNvbHVtbj4gc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uOwotCi0KLQlwcm90ZWN0ZWQgR2VuZXJpY09ybVJlZmVyZW5jZVRhYmxlKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JCXRoaXMuam9pbkNvbHVtbk93bmVyID0gdGhpcy5idWlsZEpvaW5Db2x1bW5Pd25lcigpOwotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNTcGVjaWZpZWRKb2luQ29sdW1ucygpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdEpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5nZXREZWZhdWx0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29udmVydERlZmF1bHRKb2luQ29sdW1uVG9TcGVjaWZpZWQoKSB7Ci0JCU1hcHBpbmdUb29scy5jb252ZXJ0UmVmZXJlbmNlVGFibGVEZWZhdWx0VG9TcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtSm9pbkNvbHVtbj4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSAhPSAwOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGdldFNwZWNpZmllZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBPcm1Kb2luQ29sdW1uIGFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4odGhpcy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJWCB4bWxUYWJsZSA9IHRoaXMuZ2V0WG1sVGFibGVGb3JVcGRhdGUoKTsKLQkJWG1sSm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gdGhpcy5idWlsZFhtbEpvaW5Db2x1bW4oKTsKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJeG1sVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sSm9pbkNvbHVtbiBidWlsZFhtbEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5pbmRleE9mQ29udGV4dEVsZW1lbnQoKE9ybUpvaW5Db2x1bW4pIGpvaW5Db2x1bW4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnNwZWNpZmllZEpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCQl0aGlzLmdldFhtbFRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLnJlbW92ZVhtbFRhYmxlSWZVbnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy5nZXRYbWxUYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbEpvaW5Db2x1bW4+IGdldFhtbEpvaW5Db2x1bW5zKCkgewotCQlYIHhtbFRhYmxlID0gdGhpcy5nZXRYbWxUYWJsZSgpOwotCQlyZXR1cm4gKHhtbFRhYmxlID09IG51bGwpID8KLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48WG1sSm9pbkNvbHVtbj5pbnN0YW5jZSgpIDoKLQkJCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCQkJbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxYbWxKb2luQ29sdW1uPih4bWxUYWJsZS5nZXRKb2luQ29sdW1ucygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGV4dExpc3RDb250YWluZXI8T3JtSm9pbkNvbHVtbiwgWG1sSm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyKCkgewotCQlTcGVjaWZpZWRKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9ICBuZXcgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkSm9pbkNvbHVtbkNvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUpvaW5Db2x1bW4sIFhtbEpvaW5Db2x1bW4+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVJlZmVyZW5jZVRhYmxlLnRoaXMuYnVpbGRKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sSm9pbkNvbHVtbj4gZ2V0UmVzb3VyY2VFbGVtZW50cygpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtUmVmZXJlbmNlVGFibGUudGhpcy5nZXRYbWxKb2luQ29sdW1ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgWG1sSm9pbkNvbHVtbiBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtSm9pbkNvbHVtbiBjb250ZXh0RWxlbWVudCkgewotCQkJcmV0dXJuIGNvbnRleHRFbGVtZW50LmdldFhtbENvbHVtbigpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpOwotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRKb2luQ29sdW1uKE9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdEpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWSwgb2xkLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldERlZmF1bHRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRKb2luQ29sdW1uICE9IG51bGwpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPih0aGlzLmRlZmF1bHRKb2luQ29sdW1uKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPE9ybUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldERlZmF1bHRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURlZmF1bHRKb2luQ29sdW1uKCkgewotCQlpZiAodGhpcy5idWlsZHNEZWZhdWx0Sm9pbkNvbHVtbigpKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0Sm9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXREZWZhdWx0Sm9pbkNvbHVtbih0aGlzLmJ1aWxkSm9pbkNvbHVtbihudWxsKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZGVmYXVsdEpvaW5Db2x1bW4udXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldERlZmF1bHRKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRzRGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seVJlZmVyZW5jZVRhYmxlIG9sZFRhYmxlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZFRhYmxlKTsKLQkJZm9yIChSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IG9sZFRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpLmluaXRpYWxpemVGcm9tKGpvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5UmVmZXJlbmNlVGFibGUgdmlydHVhbFRhYmxlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tVmlydHVhbCh2aXJ0dWFsVGFibGUpOwotCQlmb3IgKFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uIDogdmlydHVhbFRhYmxlLmdldEpvaW5Db2x1bW5zKCkpIHsKLQkJCXRoaXMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpLmluaXRpYWxpemVGcm9tVmlydHVhbChqb2luQ29sdW1uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGJ1aWxkSm9pbkNvbHVtbihYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Kb2luQ29sdW1uKHRoaXMsIHRoaXMuam9pbkNvbHVtbk93bmVyLCB4bWxKb2luQ29sdW1uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJYm9vbGVhbiBjb250aW51ZVZhbGlkYXRpbmcgPSB0aGlzLmJ1aWxkVGFibGVWYWxpZGF0b3IoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCi0JCS8vam9pbiBjb2x1bW4gdmFsaWRhdGlvbiB3aWxsIGhhbmRsZSB0aGUgY2hlY2sgZm9yIHdoZXRoZXIgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgZGF0YWJhc2UKLQkJLy9zb21lIHZhbGlkYXRpb24gbWVzc2FnZXMgYXJlIG5vdCBkYXRhYmFzZSBzcGVjaWZpYy4gSWYgdGhlIGRhdGFiYXNlIHZhbGlkYXRpb24gZm9yIHRoZQotCQkvL3RhYmxlIGZhaWxzIHdlIHdpbGwgc3RvcCB0aGVyZSBhbmQgbm90IHZhbGlkYXRlIHRoZSBqb2luIGNvbHVtbnMgYXQgYWxsCi0JCWlmIChjb250aW51ZVZhbGlkYXRpbmcpIHsKLQkJCXRoaXMudmFsaWRhdGVKb2luQ29sdW1ucyhtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVKb2luQ29sdW1ucyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMudmFsaWRhdGVOb2Rlcyh0aGlzLmdldEpvaW5Db2x1bW5zKCksIG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjE1NDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5U2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5TZWNvbmRhcnlUYWJsZVByaW1hcnlLZXlKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNlY29uZGFyeSB0YWJsZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVRhYmxlPFhtbFNlY29uZGFyeVRhYmxlPgotCWltcGxlbWVudHMgT3JtU2Vjb25kYXJ5VGFibGUKLXsKLQkvKiogQHNlZSBBYnN0cmFjdE9ybVRhYmxlI0Fic3RyYWN0T3JtVGFibGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGUsIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlLk93bmVyLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUpICovCi0JcHJvdGVjdGVkIC8qIGZpbmFsICovIFhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uLCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIgcHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW47Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUoT3JtRW50aXR5IHBhcmVudCwgT3duZXIgb3duZXIsIFhtbFNlY29uZGFyeVRhYmxlIHhtbFNlY29uZGFyeVRhYmxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIHhtbFNlY29uZGFyeVRhYmxlKTsKLQkJdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyID0gdGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIoKTsKLQkJdGhpcy5zcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQkJaWYgKHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JCXRoaXMudXBkYXRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCB0YWJsZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sU2Vjb25kYXJ5VGFibGUgZ2V0WG1sVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFNlY29uZGFyeVRhYmxlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RPcm1UYWJsZQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFhtbFRhYmxlKFhtbFNlY29uZGFyeVRhYmxlIHhtbFRhYmxlKSB7Ci0JCXRoaXMueG1sU2Vjb25kYXJ5VGFibGUgPSB4bWxUYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBzZWNvbmRhcnkgdGFibGVzIGFyZSBwYXJ0IG9mIGEgY29sbGVjdGlvbjsKLQkgKiB0aGUgJ3NlY29uZGFyeS10YWJsZScgZWxlbWVudCB3aWxsIGJlIHJlbW92ZWQgZnJvbS9hZGRlZAotCSAqIHdoZW4gdGhlIFhNTCBzZWNvbmRhcnkgdGFibGUgaXMgcmVtb3ZlZC9hZGRlZCB0bwotCSAqIHRoZSBYTUwgZW50aXR5J3MgY29sbGVjdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxTZWNvbmRhcnlUYWJsZSBidWlsZFhtbFRhYmxlKCkgewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJYTUwgc2Vjb25kYXJ5IHRhYmxlIGlzIG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBzZWUgI2J1aWxkWG1sVGFibGUoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbFRhYmxlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3BlY2lmaWVkIHByaW1hcnkga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnRzU2l6ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGhhc1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbih0aGlzLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uID0gdGhpcy5idWlsZFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmFkZENvbnRleHRFbGVtZW50KGluZGV4LCB4bWxKb2luQ29sdW1uKTsKLQkJdGhpcy54bWxTZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQlyZXR1cm4gam9pbkNvbHVtbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuc3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy54bWxTZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLm1vdmVDb250ZXh0RWxlbWVudCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLnhtbFNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgewotCQl0aGlzLnNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCS8vIGNsb25lIHRvIHJlZHVjZSBjaGFuY2Ugb2YgY29uY3VycmVuY3kgcHJvYmxlbXMKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KHRoaXMueG1sU2Vjb25kYXJ5VGFibGUuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCQljb250YWluZXIuaW5pdGlhbGl6ZSgpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIHNwZWNpZmllZCBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRDb250ZXh0RWxlbWVudChYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUudGhpcy5idWlsZFByaW1hcnlLZXlKb2luQ29sdW1uKHJlc291cmNlRWxlbWVudCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFJlc291cmNlRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRSZXNvdXJjZUVsZW1lbnQoT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxDb2x1bW4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1SZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uOwotCQl0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGpvaW5Db2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBvbGQsIGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbikgOgotCQkJCUVtcHR5TGlzdEl0ZXJhYmxlLjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCWlmICh0aGlzLmJ1aWxkc0RlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKSB7Ci0JCQlpZiAodGhpcy5kZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKHRoaXMuYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihudWxsKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLnVwZGF0ZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJdGhpcy5zZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVudGl0eSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRW50aXR5IGdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSBvbGRTZWNvbmRhcnlUYWJsZSkgewotCQlzdXBlci5pbml0aWFsaXplRnJvbShvbGRTZWNvbmRhcnlUYWJsZSk7Ci0JCWZvciAoUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwa0pvaW5Db2x1bW4gOiBvbGRTZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJdGhpcy5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLmluaXRpYWxpemVGcm9tKHBrSm9pbkNvbHVtbik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbihYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiB4bWxKb2luQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4odGhpcywgdGhpcy5wcmltYXJ5S2V5Sm9pbkNvbHVtbk93bmVyLCB4bWxKb2luQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogYSBzZWNvbmRhcnkgdGFibGUgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBuYW1lCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJYm9vbGVhbiBjb250aW51ZVZhbGlkYXRpbmcgPSB0aGlzLmJ1aWxkVGFibGVWYWxpZGF0b3IoKS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCi0JCS8vam9pbiBjb2x1bW4gdmFsaWRhdGlvbiB3aWxsIGhhbmRsZSB0aGUgY2hlY2sgZm9yIHdoZXRoZXIgdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgZGF0YWJhc2UKLQkJLy9zb21lIHZhbGlkYXRpb24gbWVzc2FnZXMgYXJlIG5vdCBkYXRhYmFzZSBzcGVjaWZpYy4gSWYgdGhlIGRhdGFiYXNlIHZhbGlkYXRpb24gZm9yIHRoZQotCQkvL3RhYmxlIGZhaWxzIHdlIHdpbGwgc3RvcCB0aGVyZSBhbmQgbm90IHZhbGlkYXRlIHRoZSBqb2luIGNvbHVtbnMgYXQgYWxsCi0JCWlmIChjb250aW51ZVZhbGlkYXRpbmcpIHsKLQkJCXRoaXMudmFsaWRhdGVOb2Rlcyh0aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLCBtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG93bmVyIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uT3duZXIKLQkJaW1wbGVtZW50cyBPcm1SZWFkT25seUJhc2VKb2luQ29sdW1uLk93bmVyCi0JewotCQlwcm90ZWN0ZWQgT3JtRW50aXR5IGdldEVudGl0eSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUudGhpcy5nZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlpZiAodGhpcy5nZXRKb2luQ29sdW1uc1NpemUoKSAhPSAxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlFbnRpdHkgcGFyZW50RW50aXR5ID0gdGhpcy5nZXRFbnRpdHkoKS5nZXRQYXJlbnRFbnRpdHkoKTsKLQkJCXJldHVybiAocGFyZW50RW50aXR5ICE9IG51bGwpID8KLQkJCQkJcGFyZW50RW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkgOgotCQkJCQl0aGlzLmdldEVudGl0eSgpLmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS50aGlzLmdldERiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS50aGlzLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybVNlY29uZGFyeVRhYmxlLnRoaXMuZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID09IGpvaW5Db2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHkoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1TZWNvbmRhcnlUYWJsZS50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVQcmltYXJ5S2V5Sm9pbkNvbHVtblZhbGlkYXRvcihHZW5lcmljT3JtU2Vjb25kYXJ5VGFibGUudGhpcywgKFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcywgKEJhc2VKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzg4MzgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNlcXVlbmNlIGdlbmVyYXRvcgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVNlcXVlbmNlR2VuZXJhdG9yCi17Ci0JcHVibGljIEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sU2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEpQQSAxLjAgc3BlYyBkb2VzIG5vdCBhbGxvdyBhIHNlcXVlbmNlIHRvIHNwZWNpZnkgYSBjYXRhbG9nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIEpQQSAxLjAgc3BlYyBkb2VzIG5vdCBhbGxvdyBhIHNlcXVlbmNlIHRvIHNwZWNpZnkgYSBzY2hlbWEuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHN1cGVyLmlzSWRlbnRpY2FsKGdlbmVyYXRvcikgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRTY2hlbWEoKSwgKCgoR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yKWdlbmVyYXRvcikuZ2V0U2NoZW1hKCkpKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldENhdGFsb2coKSwgKCgoR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yKWdlbmVyYXRvcikuZ2V0Q2F0YWxvZygpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzMjk1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0YWJsZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVRhYmxlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVRhYmxlPFhtbFRhYmxlPgotewotCXB1YmxpYyBHZW5lcmljT3JtVGFibGUoT3JtRW50aXR5IHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCB0YWJsZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sVGFibGUgZ2V0WG1sVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEVudGl0eSgpLmdldFRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbFRhYmxlIGJ1aWxkWG1sVGFibGUoKSB7Ci0JCVhtbFRhYmxlIHhtbFRhYmxlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGUoKTsKLQkJdGhpcy5nZXRYbWxFbnRpdHkoKS5zZXRUYWJsZSh4bWxUYWJsZSk7Ci0JCXJldHVybiB4bWxUYWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVYbWxUYWJsZSgpIHsKLQkJdGhpcy5nZXRYbWxFbnRpdHkoKS5zZXRUYWJsZShudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sRW50aXR5IGdldFhtbEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5KCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGVmYXVsdHMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHkoKS5nZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldEVudGl0eSgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVudGl0eSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtRW50aXR5KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRW50aXR5IGdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRhYmxlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YWI0YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVGFibGVHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0YWJsZSBnZW5lcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RPcm1HZW5lcmF0b3I8WG1sVGFibGVHZW5lcmF0b3I+Ci0JaW1wbGVtZW50cyBPcm1UYWJsZUdlbmVyYXRvciwgVW5pcXVlQ29uc3RyYWludC5Pd25lcgotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVGFibGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0VGFibGU7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFNjaGVtYTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFBrQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFZhbHVlQ29sdW1uTmFtZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRQa0NvbHVtblZhbHVlOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVVuaXF1ZUNvbnN0cmFpbnQsIFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXI7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JcHVibGljIEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcihYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFRhYmxlR2VuZXJhdG9yIHhtbFRhYmxlR2VuZXJhdG9yKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sVGFibGVHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZFRhYmxlID0geG1sVGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSB4bWxUYWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKTsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0geG1sVGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA9IHhtbFRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uTmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSA9IHhtbFRhYmxlR2VuZXJhdG9yLmdldFZhbHVlQ29sdW1uTmFtZSgpOwotCQl0aGlzLnNwZWNpZmllZFBrQ29sdW1uVmFsdWUgPSB4bWxUYWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtblZhbHVlKCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lciA9IHRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50Q29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFibGVfKHRoaXMueG1sR2VuZXJhdG9yLmdldFRhYmxlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy54bWxHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKHRoaXMueG1sR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lXyh0aGlzLnhtbEdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lXyh0aGlzLnhtbEdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZV8odGhpcy54bWxHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJdGhpcy5zeW5jVW5pcXVlQ29uc3RyYWludHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRUYWJsZSh0aGlzLmJ1aWxkRGVmYXVsdFRhYmxlKCkpOwotCQl0aGlzLnNldERlZmF1bHRTY2hlbWEodGhpcy5idWlsZERlZmF1bHRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhdGFsb2codGhpcy5idWlsZERlZmF1bHRDYXRhbG9nKCkpOwotCQl0aGlzLnNldERlZmF1bHRQa0NvbHVtbk5hbWUodGhpcy5idWlsZERlZmF1bHRQa0NvbHVtbk5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSh0aGlzLmJ1aWxkRGVmYXVsdFBrQ29sdW1uVmFsdWUoKSk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRVbmlxdWVDb25zdHJhaW50cygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5pdGlhbCB2YWx1ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IGJ1aWxkRGVmYXVsdEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfSU5JVElBTF9WQUxVRTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRUYWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVGFibGUgOiB0aGlzLmRlZmF1bHRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRUYWJsZV8odGFibGUpOwotCQl0aGlzLnhtbEdlbmVyYXRvci5zZXRUYWJsZSh0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFibGVfKFN0cmluZyB0YWJsZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFRhYmxlOwotCQl0aGlzLmRlZmF1bHRUYWJsZSA9IHRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9UQUJMRV9QUk9QRVJUWSwgb2xkLCB0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIFRPRE8gdGhlIGRlZmF1bHQgdGFibGUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVudGltZSBwcm92aWRlci4uLgotCX0KLQotCXB1YmxpYyBUYWJsZSBnZXREYlRhYmxlKCkgewotCQlTY2hlbWEgZGJTY2hlbWEgPSB0aGlzLmdldERiU2NoZW1hKCk7Ci0JCXJldHVybiAoZGJTY2hlbWEgPT0gbnVsbCkgPyBudWxsIDogZGJTY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFNjaGVtYSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkU2NoZW1hIDogdGhpcy5kZWZhdWx0U2NoZW1hOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkU2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWFfKHNjaGVtYSk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yLnNldFNjaGVtYShzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRDYXRhbG9nICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYXRhbG9nIDogdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKGNhdGFsb2cpOwotCQl0aGlzLnhtbEdlbmVyYXRvci5zZXRDYXRhbG9nKGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJpbWFyeSBrZXkgY29sdW1uIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZSA6IHRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZV8obmFtZSk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yLnNldFBrQ29sdW1uTmFtZShuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZFBrQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtbk5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UGtDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRQa0NvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFBrQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0UGtDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsgLy8gVE9ETyB0aGUgZGVmYXVsdCBwayBjb2x1bW4gbmFtZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydW50aW1lIHByb3ZpZGVyLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlIGNvbHVtbiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUgOiB0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWVfKG5hbWUpOwotCQl0aGlzLnhtbEdlbmVyYXRvci5zZXRWYWx1ZUNvbHVtbk5hbWUobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0VmFsdWVDb2x1bW5OYW1lOwotCQl0aGlzLmRlZmF1bHRWYWx1ZUNvbHVtbk5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7IC8vIFRPRE8gdGhlIGRlZmF1bHQgdmFsdWUgY29sdW1uIG5hbWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcnVudGltZSBwcm92aWRlci4uLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBjb2x1bW4gdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSA6IHRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZV8odmFsdWUpOwotCQl0aGlzLnhtbEdlbmVyYXRvci5zZXRQa0NvbHVtblZhbHVlKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkUGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5zcGVjaWZpZWRQa0NvbHVtblZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UGtDb2x1bW5WYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UGtDb2x1bW5WYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMuZGVmYXVsdFBrQ29sdW1uVmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUEtfQ09MVU1OX1ZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOyAvLyBUT0RPIHRoZSBkZWZhdWx0IHBrIGNvbHVtbiB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBydW50aW1lIHByb3ZpZGVyLi4uCi0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuaXF1ZSBjb25zdHJhaW50cyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLmdldENvbnRleHRFbGVtZW50c1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtVW5pcXVlQ29uc3RyYWludCBhZGRVbmlxdWVDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdGhpcy5hZGRVbmlxdWVDb25zdHJhaW50KHRoaXMuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBPcm1VbmlxdWVDb25zdHJhaW50IGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgeG1sQ29uc3RyYWludCA9IHRoaXMuYnVpbGRYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCU9ybVVuaXF1ZUNvbnN0cmFpbnQgY29uc3RyYWludCA9IHRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5hZGRDb250ZXh0RWxlbWVudChpbmRleCwgeG1sQ29uc3RyYWludCk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKGluZGV4LCB4bWxDb25zdHJhaW50KTsKLQkJcmV0dXJuIGNvbnN0cmFpbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRYbWxVbmlxdWVDb25zdHJhaW50KCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50KSB7Ci0JCXRoaXMucmVtb3ZlVW5pcXVlQ29uc3RyYWludCh0aGlzLnVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChPcm1VbmlxdWVDb25zdHJhaW50KSB1bmlxdWVDb25zdHJhaW50KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLnJlbW92ZUNvbnRleHRFbGVtZW50KGluZGV4KTsKLQkJdGhpcy54bWxHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludENvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQkJdGhpcy54bWxHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVVuaXF1ZUNvbnN0cmFpbnQgYnVpbGRVbmlxdWVDb25zdHJhaW50KFhtbFVuaXF1ZUNvbnN0cmFpbnQgcmVzb3VyY2VVbmlxdWVDb25zdHJhaW50KSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVW5pcXVlQ29uc3RyYWludCh0aGlzLCB0aGlzLCByZXNvdXJjZVVuaXF1ZUNvbnN0cmFpbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50Q29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+KHRoaXMueG1sR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1VbmlxdWVDb25zdHJhaW50LCBYbWxVbmlxdWVDb25zdHJhaW50PiBidWlsZFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKSB7Ci0JCVVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIgY29udGFpbmVyID0gbmV3IFVuaXF1ZUNvbnN0cmFpbnRDb250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiB1bmlxdWUgY29uc3RyYWludCBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgVW5pcXVlQ29uc3RyYWludENvbnRhaW5lcgotCQlleHRlbmRzIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybVVuaXF1ZUNvbnN0cmFpbnQsIFhtbFVuaXF1ZUNvbnN0cmFpbnQ+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBPcm1VbmlxdWVDb25zdHJhaW50IGJ1aWxkQ29udGV4dEVsZW1lbnQoWG1sVW5pcXVlQ29uc3RyYWludCByZXNvdXJjZUVsZW1lbnQpIHsKLQkJCXJldHVybiBHZW5lcmljT3JtVGFibGVHZW5lcmF0b3IudGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnQocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxVbmlxdWVDb25zdHJhaW50PiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvci50aGlzLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBYbWxVbmlxdWVDb25zdHJhaW50IGdldFJlc291cmNlRWxlbWVudChPcm1VbmlxdWVDb25zdHJhaW50IGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gY29udGV4dEVsZW1lbnQuZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFVuaXF1ZUNvbnN0cmFpbnQuT3duZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVW5pcXVlQ29uc3RyYWludENvbHVtbk5hbWVzKCkgewotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGRiVGFibGUgPSB0aGlzLmdldERiVGFibGUoKTsKLQkJcmV0dXJuIChkYlRhYmxlICE9IG51bGwpID8gZGJUYWJsZS5nZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczxUYWJsZUdlbmVyYXRvcj4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yLmNsYXNzOwotCX0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0lkZW50aWNhbChHZW5lcmF0b3IgZ2VuZXJhdG9yKSB7Ci0JCXJldHVybiBzdXBlci5pc0lkZW50aWNhbChnZW5lcmF0b3IpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkVGFibGUoKSwgKCgoR2VuZXJpY09ybVRhYmxlR2VuZXJhdG9yKWdlbmVyYXRvcikuZ2V0U3BlY2lmaWVkVGFibGUoKSkpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkU2NoZW1hKCksICgoKEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFNjaGVtYSgpKSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRTcGVjaWZpZWRDYXRhbG9nKCksICgoKEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZENhdGFsb2coKSkpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCksICgoKEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKSkgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCksICgoKEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSkpICYmCi0JCQkJU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCksICgoKEdlbmVyaWNPcm1UYWJsZUdlbmVyYXRvcilnZW5lcmF0b3IpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKSkgJiYKLQkJCQljb252ZXJzaW9uVmFsdWVzQXJlSWRlbnRpY2FsKCgoR2VuZXJpY09ybVRhYmxlR2VuZXJhdG9yKWdlbmVyYXRvcikuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbnZlcnNpb25WYWx1ZXNBcmVJZGVudGljYWwoTGlzdEl0ZXJhYmxlPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IGNvbnZlcnNpb25WYWx1ZXMpIHsKLQkJYm9vbGVhbiBpc0lkZW50aWNhbCA9IHRydWU7Ci0JCWlmICh0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpICE9IENvbGxlY3Rpb25Ub29scy5zaXplKGNvbnZlcnNpb25WYWx1ZXMpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKGludCBpPTA7IGk8dGhpcy5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKTsgaSsrKSB7Ci0JCQkJCWlmICghKENvbGxlY3Rpb25Ub29scy5nZXQodGhpcy5nZXRVbmlxdWVDb25zdHJhaW50cygpLCBpKSkuaXNJZGVudGljYWwoQ29sbGVjdGlvblRvb2xzLmdldChjb252ZXJzaW9uVmFsdWVzLCBpKSkpIHsKLQkJCQkJCWlzSWRlbnRpY2FsID0gZmFsc2U7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNJZGVudGljYWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVGVtcG9yYWxDb252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVRlbXBvcmFsQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNzcyNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVGVtcG9yYWxDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UZW1wb3JhbENvbnZlcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1UZW1wb3JhbENvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RPcm1Db252ZXJ0ZXIKLQlpbXBsZW1lbnRzIE9ybVRlbXBvcmFsQ29udmVydGVyCi17Ci0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbFR5cGU7Ci0KLQlwdWJsaWMgR2VuZXJpY09ybVRlbXBvcmFsQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcm1UZW1wb3JhbENvbnZlcnRlci5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy50ZW1wb3JhbFR5cGUgPSB0aGlzLmJ1aWxkVGVtcG9yYWxUeXBlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVRlbXBvcmFsQ29udmVydGVyLk93bmVyIGdldE93bmVyKCkgewotCQlyZXR1cm4gKE9ybVRlbXBvcmFsQ29udmVydGVyLk93bmVyKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFRlbXBvcmFsVHlwZV8odGhpcy5idWlsZFRlbXBvcmFsVHlwZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGVtcG9yYWwgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudGVtcG9yYWxUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCXRoaXMuc2V0VGVtcG9yYWxUeXBlXyh0ZW1wb3JhbFR5cGUpOwotCQl0aGlzLnNldFhtbFRlbXBvcmFsKHRlbXBvcmFsVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGVtcG9yYWxUeXBlXyhUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGQgPSB0aGlzLnRlbXBvcmFsVHlwZTsKLQkJdGhpcy50ZW1wb3JhbFR5cGUgPSB0ZW1wb3JhbFR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChURU1QT1JBTF9UWVBFX1BST1BFUlRZLCBvbGQsIHRlbXBvcmFsVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0WG1sVGVtcG9yYWwoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSkgewotCQl0aGlzLmdldE93bmVyKCkuc2V0WG1sVGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS50b09ybVJlc291cmNlTW9kZWwodGVtcG9yYWxUeXBlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBidWlsZFRlbXBvcmFsVHlwZSgpIHsKLQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLmdldE93bmVyKCkuZ2V0WG1sVGVtcG9yYWxUeXBlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRUeXBlKCkgewotCQlyZXR1cm4gVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gc3RhcnQgd2l0aCBEQVRFKD8pCi0JCXRoaXMudGVtcG9yYWxUeXBlID0gVGVtcG9yYWxUeXBlLkRBVEU7Ci0JCXRoaXMuc2V0WG1sVGVtcG9yYWwodGhpcy50ZW1wb3JhbFR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldE93bmVyKCkuZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZDBjYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdHJhbnNpZW50IG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1UcmFuc2llbnRNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sVHJhbnNpZW50PgotCWltcGxlbWVudHMgT3JtVHJhbnNpZW50TWFwcGluZwotewotCXB1YmxpYyBHZW5lcmljT3JtVHJhbnNpZW50TWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVHJhbnNpZW50IHhtbE1hcHBpbmcpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxNYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIGludCBnZXRYbWxTZXF1ZW5jZSgpIHsKLQkJcmV0dXJuIDkwOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPbihPcm1BdHRyaWJ1dGVNYXBwaW5nIG5ld01hcHBpbmcpIHsKLQkJbmV3TWFwcGluZy5pbml0aWFsaXplRnJvbU9ybVRyYW5zaWVudE1hcHBpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkWG1sQXR0cmlidXRlTWFwcGluZ1RvKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCXJlc291cmNlQXR0cmlidXRlcy5nZXRUcmFuc2llbnRzKCkuYWRkKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlWG1sQXR0cmlidXRlTWFwcGluZ0Zyb20oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldFRyYW5zaWVudHMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1ldGFtb2RlbCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU2NDFhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1VbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVVuaXF1ZUNvbnN0cmFpbnQKLQlleHRlbmRzIEFic3RyYWN0T3JtUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Ci0JaW1wbGVtZW50cyBPcm1VbmlxdWVDb25zdHJhaW50Ci17Ci0JcHJvdGVjdGVkIE93bmVyIG93bmVyOwotCXByb3RlY3RlZCBmaW5hbCBYbWxVbmlxdWVDb25zdHJhaW50IHhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtVW5pcXVlQ29uc3RyYWludChYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIE93bmVyIG93bmVyLCBYbWxVbmlxdWVDb25zdHJhaW50IHhtbFVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLnhtbFVuaXF1ZUNvbnN0cmFpbnQgPSB4bWxVbmlxdWVDb25zdHJhaW50OwotCQl0aGlzLmluaXRpYWxpemVDb2x1bW5OYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNDb2x1bW5OYW1lcygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gbmFtZXMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmFkZENvbHVtbk5hbWUodGhpcy5jb2x1bW5OYW1lcy5zaXplKCksIGNvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmFkZEl0ZW1Ub0xpc3QoaW5kZXgsIGNvbHVtbk5hbWUsIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQkJdGhpcy54bWxVbmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkuYWRkKGluZGV4LCBjb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRoaXMucmVtb3ZlQ29sdW1uTmFtZSh0aGlzLmNvbHVtbk5hbWVzLmluZGV4T2YoY29sdW1uTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlSXRlbUZyb21MaXN0KGluZGV4LCB0aGlzLmNvbHVtbk5hbWVzLCBDT0xVTU5fTkFNRVNfTElTVCk7Ci0JCXRoaXMueG1sVW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpLnJlbW92ZShpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUNvbHVtbk5hbWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5tb3ZlSXRlbUluTGlzdCh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgsIHRoaXMuY29sdW1uTmFtZXMsIENPTFVNTl9OQU1FU19MSVNUKTsKLQkJdGhpcy54bWxVbmlxdWVDb25zdHJhaW50LmdldENvbHVtbk5hbWVzKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVDb2x1bW5OYW1lcygpIHsKLQkJZm9yIChTdHJpbmcgeG1sQ29sdW1uTmFtZSA6IHRoaXMueG1sVW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpKSB7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzLmFkZCh4bWxDb2x1bW5OYW1lKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFJlc291cmNlQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFVuaXF1ZUNvbnN0cmFpbnQuZ2V0Q29sdW1uTmFtZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLnhtbFVuaXF1ZUNvbnN0cmFpbnQuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKE9ybVVuaXF1ZUNvbnN0cmFpbnQgb3JtVW5pcXVlQ29uc3RyYWludCkgewotCQlyZXR1cm4gIGNvbHVtbk5hbWVzQXJlSWRlbnRpY2FsKG9ybVVuaXF1ZUNvbnN0cmFpbnQuZ2V0Q29sdW1uTmFtZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvbHVtbk5hbWVzQXJlSWRlbnRpY2FsKEl0ZXJhYmxlPFN0cmluZz4gY29sdW1uTmFtZXMpIHsKLQkJYm9vbGVhbiBpc0lkZW50aWNhbCA9IHRydWU7Ci0JCWlmICh0aGlzLmdldENvbHVtbk5hbWVzU2l6ZSgpICE9IENvbGxlY3Rpb25Ub29scy5zaXplKGNvbHVtbk5hbWVzKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJZm9yIChpbnQgaT0wOyBpPHRoaXMuZ2V0Q29sdW1uTmFtZXNTaXplKCk7IGkrKykgewotCQkJCQlpZiAoIVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbChDb2xsZWN0aW9uVG9vbHMuZ2V0KHRoaXMuZ2V0Q29sdW1uTmFtZXMoKSwgaSksIENvbGxlY3Rpb25Ub29scy5nZXQoY29sdW1uTmFtZXMsIGkpKSkgewotCQkJCQkJaXNJZGVudGljYWwgPSBmYWxzZTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpc0lkZW50aWNhbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbENvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChYbWxDb250ZXh0Tm9kZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFhtbFVuaXF1ZUNvbnN0cmFpbnQgZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sVW5pcXVlQ29uc3RyYWludDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgb2xkVW5pcXVlQ29uc3RyYWludCkgewotCQlmb3IgKFN0cmluZyBjb2x1bW5OYW1lIDogb2xkVW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpKSB7Ci0JCQl0aGlzLmFkZENvbHVtbk5hbWUoY29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WZXJzaW9uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmVyc2lvbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNkNjYwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WZXJzaW9uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVZlcnNpb25NYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVZlcnNpb25NYXBwaW5nPFhtbFZlcnNpb24+Ci17Ci0JcHVibGljIEdlbmVyaWNPcm1WZXJzaW9uTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sVmVyc2lvbiB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MThlOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogVmlydHVhbCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhc3NvY2lhdGlvbiBvdmVycmlkZQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVZpcnR1YWxPdmVycmlkZTxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPgotCWltcGxlbWVudHMgT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAKLXsKLQlwcm90ZWN0ZWQgZmluYWwgT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcDsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIocGFyZW50LCBuYW1lKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAgPSB0aGlzLmJ1aWxkUmVsYXRpb25zaGlwKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5yZWxhdGlvbnNoaXAudXBkYXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgY29udmVydFRvU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gKE9ybUFzc29jaWF0aW9uT3ZlcnJpZGUpIHN1cGVyLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCX0KLQotCXB1YmxpYyBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcodGhpcy5uYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMCBnZXRDb250YWluZXIyXzAoKSB7Ci0JCXJldHVybiAoT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMCkgdGhpcy5nZXRDb250YWluZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVsYXRpb25zaGlwICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5yZWxhdGlvbnNoaXA7Ci0JfQotCi0JLyoqCi0JICogVGhlIHJlbGF0aW9uc2hpcCBzaG91bGQgYmUgYXZhaWxhYmxlIChzaW5jZSBpdHMgcHJlc2VuY2UgcHJlY2lwaXRhdGVkIHRoZQotCSAqIGNyZWF0aW9uIG9mIHRoZSB2aXJ0dWFsIG92ZXJyaWRlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwIGJ1aWxkUmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnJlbGF0aW9uc2hpcC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyMl8wKCkuYnVpbGRKb2luVGFibGVWYWxpZGF0b3IodGhpcywgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcywgY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRDb250YWluZXIyXzAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKHRoaXMsIGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTVkNjRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogVmlydHVhbCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBhdHRyaWJ1dGUgb3ZlcnJpZGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUKLQlleHRlbmRzIEFic3RyYWN0T3JtVmlydHVhbE92ZXJyaWRlPE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPgotCWltcGxlbWVudHMgT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLCBPcm1WaXJ0dWFsQ29sdW1uLk93bmVyCi17Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybVZpcnR1YWxDb2x1bW4gY29sdW1uOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZShPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBwYXJlbnQsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgbmFtZSk7Ci0JCXRoaXMuY29sdW1uID0gdGhpcy5idWlsZENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuY29sdW1uLnVwZGF0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVPdmVycmlkZSBjb252ZXJ0VG9TcGVjaWZpZWQoKSB7Ci0JCXJldHVybiAoT3JtQXR0cmlidXRlT3ZlcnJpZGUpIHN1cGVyLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybVZpcnR1YWxDb2x1bW4gZ2V0Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JLyoqCi0JICogVGhlIG9yaWdpbmFsIGNvbHVtbiBzaG91bGQgYmUgYXZhaWxhYmxlIChzaW5jZSB0aGUgcHJlc2VuY2Ugb2YgaXRzCi0JICogYXR0cmlidXRlIGlzIHdoYXQgcHJlY2lwaXRhdGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgdmlydHVhbCBvdmVycmlkZSkuCi0JICovCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxDb2x1bW4gYnVpbGRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtVmlydHVhbENvbHVtbih0aGlzLCB0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uIG93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJU3RyaW5nIG92ZXJyaWRkZW5Db2x1bW5UYWJsZSA9IHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtblRhYmxlKCk7Ci0JCXJldHVybiAob3ZlcnJpZGRlbkNvbHVtblRhYmxlICE9IG51bGwpID8gb3ZlcnJpZGRlbkNvbHVtblRhYmxlIDogc3VwZXIuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0T3ZlcnJpZGRlbkNvbHVtblRhYmxlKCkgewotCQlSZWFkT25seUNvbHVtbiBvdmVycmlkZGVuQ29sdW1uID0gdGhpcy5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpOwotCQkvLyBwcmV0dHkgc3VyZSB0aGlzIGlzIHRoZSAqc3BlY2lmaWVkKiB0YWJsZS4uLgotCQlyZXR1cm4gKG92ZXJyaWRkZW5Db2x1bW4gPT0gbnVsbCkgPyBudWxsIDogb3ZlcnJpZGRlbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJU3RyaW5nIG92ZXJyaWRkZW5Db2x1bW5OYW1lID0gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uTmFtZSgpOwotCQlyZXR1cm4gKG92ZXJyaWRkZW5Db2x1bW5OYW1lICE9IG51bGwpID8gb3ZlcnJpZGRlbkNvbHVtbk5hbWUgOiB0aGlzLm5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRPdmVycmlkZGVuQ29sdW1uTmFtZSgpIHsKLQkJUmVhZE9ubHlDb2x1bW4gb3ZlcnJpZGRlbkNvbHVtbiA9IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oKTsKLQkJcmV0dXJuIChvdmVycmlkZGVuQ29sdW1uID09IG51bGwpID8gbnVsbCA6IG92ZXJyaWRkZW5Db2x1bW4uZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBSZWFkT25seUNvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGFpbmVyKCkucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4odGhpcy5uYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRhaW5lcigpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKHRoaXMsIChSZWFkT25seUJhc2VDb2x1bW4pIGNvbCwgdGhpcywgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuY29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzk3ZmI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1WaXJ0dWFsQmFzZUNvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVZpcnR1YWxDb2x1bW4KLQlleHRlbmRzIEFic3RyYWN0T3JtVmlydHVhbEJhc2VDb2x1bW48T3JtVmlydHVhbENvbHVtbi5Pd25lciwgUmVhZE9ubHlDb2x1bW4+Ci0JaW1wbGVtZW50cyBPcm1WaXJ0dWFsQ29sdW1uCi17Ci0JcHJvdGVjdGVkIEludGVnZXIgc3BlY2lmaWVkTGVuZ3RoOwotCXByb3RlY3RlZCBpbnQgZGVmYXVsdExlbmd0aDsKLQotCXByb3RlY3RlZCBJbnRlZ2VyIHNwZWNpZmllZFByZWNpc2lvbjsKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRQcmVjaXNpb247Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBzcGVjaWZpZWRTY2FsZTsKLQlwcm90ZWN0ZWQgaW50IGRlZmF1bHRTY2FsZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1WaXJ0dWFsQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtVmlydHVhbENvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRMZW5ndGgodGhpcy5idWlsZFNwZWNpZmllZExlbmd0aCgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TGVuZ3RoKHRoaXMuYnVpbGREZWZhdWx0TGVuZ3RoKCkpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKHRoaXMuYnVpbGRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFByZWNpc2lvbih0aGlzLmJ1aWxkRGVmYXVsdFByZWNpc2lvbigpKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZFNjYWxlKHRoaXMuYnVpbGRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NhbGUodGhpcy5idWlsZERlZmF1bHRTY2FsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBSZWFkT25seUNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsZW5ndGggKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRMZW5ndGggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZExlbmd0aC5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkTGVuZ3RoOwotCQl0aGlzLnNwZWNpZmllZExlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFksIG9sZCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdExlbmd0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TGVuZ3RoKGludCBsZW5ndGgpIHsKLQkJaW50IG9sZCA9IHRoaXMuZGVmYXVsdExlbmd0aDsKLQkJdGhpcy5kZWZhdWx0TGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9MRU5HVEhfUFJPUEVSVFksIG9sZCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGJ1aWxkRGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTEVOR1RIOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmVjaXNpb24gKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRQcmVjaXNpb24gIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFByZWNpc2lvbi5pbnRWYWx1ZSgpIDogdGhpcy5kZWZhdWx0UHJlY2lzaW9uOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkUHJlY2lzaW9uOwotCQl0aGlzLnNwZWNpZmllZFByZWNpc2lvbiA9IHByZWNpc2lvbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZCwgcHJlY2lzaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFNwZWNpZmllZFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFByZWNpc2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0UHJlY2lzaW9uKGludCBwcmVjaXNpb24pIHsKLQkJaW50IG9sZCA9IHRoaXMuZGVmYXVsdFByZWNpc2lvbjsKLQkJdGhpcy5kZWZhdWx0UHJlY2lzaW9uID0gcHJlY2lzaW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9QUkVDSVNJT05fUFJPUEVSVFksIG9sZCwgcHJlY2lzaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGJ1aWxkRGVmYXVsdFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIERFRkFVTFRfUFJFQ0lTSU9OOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzY2FsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFNjYWxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2NhbGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjYWxlLmludFZhbHVlKCkgOiB0aGlzLmRlZmF1bHRTY2FsZTsKLQl9Ci0KLQlwdWJsaWMgSW50ZWdlciBnZXRTcGVjaWZpZWRTY2FsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlciBzY2FsZSkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NhbGU7Ci0JCXRoaXMuc3BlY2lmaWVkU2NhbGUgPSBzY2FsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSwgb2xkLCBzY2FsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEludGVnZXIgYnVpbGRTcGVjaWZpZWRTY2FsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGRlbkNvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0U2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2FsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NhbGUoaW50IHNjYWxlKSB7Ci0JCWludCBvbGQgPSB0aGlzLmRlZmF1bHRTY2FsZTsKLQkJdGhpcy5kZWZhdWx0U2NhbGUgPSBzY2FsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NBTEVfUFJPUEVSVFksIG9sZCwgc2NhbGUpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgYnVpbGREZWZhdWx0U2NhbGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1NDQUxFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2UxYTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1WaXJ0dWFsQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gdmlydHVhbCBqb2luIGNvbHVtbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVZpcnR1YWxKb2luQ29sdW1uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVZpcnR1YWxCYXNlQ29sdW1uPE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciwgUmVhZE9ubHlKb2luQ29sdW1uPgotCWltcGxlbWVudHMgT3JtVmlydHVhbEpvaW5Db2x1bW4KLXsKLQlwcm90ZWN0ZWQgZmluYWwgUmVhZE9ubHlKb2luQ29sdW1uIG92ZXJyaWRkZW5Db2x1bW47Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybVZpcnR1YWxKb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBSZWFkT25seUpvaW5Db2x1bW4gb3ZlcnJpZGRlbkNvbHVtbikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy5vdmVycmlkZGVuQ29sdW1uID0gb3ZlcnJpZGRlbkNvbHVtbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0KLQkJdGhpcy5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmJ1aWxkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMuYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVhZE9ubHlKb2luQ29sdW1uIGdldE92ZXJyaWRkZW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRkZW5Db2x1bW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5qb2luQ29sdW1uSXNEZWZhdWx0KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgOiB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRkZW5Db2x1bW4oKS5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKHRoaXMub3duZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkYXRhYmFzZSBzdHVmZiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbiBnZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSB7Ci0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpOwotCQlyZXR1cm4gKHRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIodGhpcy5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uSXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVmZXJlbmNlZERiQ29sdW1uKCkgIT0gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgYnVpbGRUZXh0UmFuZ2VSZXNvbHZlcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgwMTIwZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlQ29sdW1uLk93bmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5HZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLkdlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAKLXsKLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtblN0cmF0ZWd5OwotCi0JLy8gSlBBIDIuMAotCXByb3RlY3RlZCBmaW5hbCBPcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pblRhYmxlU3RyYXRlZ3k7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwKE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneSA9IHRoaXMuYnVpbGRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJdGhpcy5qb2luVGFibGVTdHJhdGVneSA9IHRoaXMuYnVpbGRKb2luVGFibGVTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRTdHJhdGVneSh0aGlzLmJ1aWxkU3RyYXRlZ3koKSk7Ci0JCXRoaXMuam9pbkNvbHVtblN0cmF0ZWd5LnVwZGF0ZSgpOwotCQl0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5LnVwZGF0ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdHJhdGVneShPcm1WaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kpIHsKLQkJT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IG9sZCA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGQsIHN0cmF0ZWd5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5IGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQl0aGlzLmJ1aWxkU3RyYXRlZ3kyXzAoKSA6Ci0JCQkJdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogVGhlIG92ZXJyaWRkZW4gbWFwcGluZyBkZXRlcm1pbmVzIHRoZSBvdmVycmlkZSdzIHN0cmF0ZWd5LgotCSAqLwotCXByb3RlY3RlZCBPcm1WaXJ0dWFsUmVsYXRpb25zaGlwU3RyYXRlZ3kgYnVpbGRTdHJhdGVneTJfMCgpIHsKLQkJTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIG1hcHBpbmdTdHJhdGVneSA9IHRoaXMuZ2V0TWFwcGluZ1N0cmF0ZWd5KCk7Ci0JCXJldHVybiAobWFwcGluZ1N0cmF0ZWd5ICE9IG51bGwpID8KLQkJCQkoT3JtVmlydHVhbFJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBtYXBwaW5nU3RyYXRlZ3kuc2VsZWN0T3ZlcnJpZGVTdHJhdGVneSh0aGlzKSA6Ci0JCQkJdGhpcy5idWlsZE1pc3NpbmdNYXBwaW5nU3RyYXRlZ3koKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN0cmF0ZWd5IGZyb20gdGhlIG92ZXJyaWRkZW4gbWFwcGluZy4KLQkgKi8KLQlwcm90ZWN0ZWQgTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wIGdldE1hcHBpbmdTdHJhdGVneSgpIHsKLQkJUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nID0gdGhpcy5nZXRNYXBwaW5nKCk7Ci0JCXJldHVybiAobWFwcGluZyA9PSBudWxsKSA/IG51bGwgOiAoTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzdHJhdGVneSB0byB1c2Ugd2hlbiB0aGUgb3ZlcnJpZGUncyBuYW1lIGRvZXMgbm90IG1hdGNoIHRoZQotCSAqIG5hbWUgb2YgYW4gYXBwcm9wcmlhdGUgcmVsYXRpb25zaGlwIG1hcHBpbmcuCi0JICovCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxSZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZE1pc3NpbmdNYXBwaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5TdHJhdGVneS5oYXNTcGVjaWZpZWRKb2luQ29sdW1ucygpID8KLQkJCQl0aGlzLmpvaW5Db2x1bW5TdHJhdGVneSA6Ci0JCQkJdGhpcy5qb2luVGFibGVTdHJhdGVneTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIE9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMuam9pbkNvbHVtblN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1heUhhdmVEZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJLy8gYXNzb2NpYXRpb24gb3ZlcnJpZGVzIGRvIG5vdCBoYXZlIGRlZmF1bHRzCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZEpvaW5Db2x1bW5TdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZVN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN0cmF0ZWd5SXNKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMuam9pblRhYmxlU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWF5SGF2ZURlZmF1bHRKb2luVGFibGUoKSB7Ci0JCS8vIGFzc29jaWF0aW9uIG92ZXJyaWRlcyBkbyBub3QgaGF2ZSBkZWZhdWx0cwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZEpvaW5UYWJsZVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVyc2lvbnMgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKFJlbGF0aW9uc2hpcCBuZXdSZWxhdGlvbnNoaXApIHsKLQkJbmV3UmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tSm9pblRhYmxlUmVsYXRpb25zaGlwKHRoaXMpOwotCQluZXdSZWxhdGlvbnNoaXAuaW5pdGlhbGl6ZUZyb21Kb2luQ29sdW1uUmVsYXRpb25zaGlwKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVPblNwZWNpZmllZChPdmVycmlkZVJlbGF0aW9uc2hpcCBzcGVjaWZpZWRSZWxhdGlvbnNoaXApIHsKLQkJc3BlY2lmaWVkUmVsYXRpb25zaGlwLmluaXRpYWxpemVGcm9tVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAodGhpcyk7Ci0JCXNwZWNpZmllZFJlbGF0aW9uc2hpcC5pbml0aWFsaXplRnJvbVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wIGdldEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAoKSB7Ci0JCXJldHVybiAoT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMCkgdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdGFibGVOYW1lSXNJbnZhbGlkKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLnRhYmxlTmFtZUlzSW52YWxpZCh0YWJsZU5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5nZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCk7Ci0JfQotCi0JcHVibGljIFRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLnJlc29sdmVEYlRhYmxlKHRhYmxlTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlKCkuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgT3duZXIgb3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmJ1aWxkQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldEVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFR5cGVNYXBwaW5nKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFbnRpdHkpID8gKEVudGl0eSkgdHlwZU1hcHBpbmcgOiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmlydHVhbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFJlbGF0aW9uc2hpcE1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUoKS5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCXRoaXMuc3RyYXRlZ3kudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5Sm9pblRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAoKS5idWlsZEpvaW5UYWJsZVZhbGlkYXRvcih0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAoKS5idWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlMl8wKCkuYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3ZTFmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVZpcnR1YWxOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHZpcnR1YWwgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1WaXJ0dWFsUHJpbWFyeUtleUpvaW5Db2x1bW4KLQlleHRlbmRzIEFic3RyYWN0T3JtVmlydHVhbE5hbWVkQ29sdW1uPE9ybVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uT3duZXIsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4KLQlpbXBsZW1lbnRzIE9ybVZpcnR1YWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotewotCXByb3RlY3RlZCBmaW5hbCBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YUNvbHVtbjsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtVmlydHVhbFByaW1hcnlLZXlKb2luQ29sdW1uKFhtbENvbnRleHROb2RlIHBhcmVudCwgT3JtUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5Pd25lciBvd25lciwgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFDb2x1bW4pIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JCXRoaXMuamF2YUNvbHVtbiA9IGphdmFDb2x1bW47Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5idWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQl0aGlzLnNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRPdmVycmlkZGVuQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQ29sdW1uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuam9pbkNvbHVtbklzRGVmYXVsdCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lIDogdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPdmVycmlkZGVuQ29sdW1uKCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMuZGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZERlZmF1bHROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHN0dWZmICoqKioqKioqKioKLQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uIGdldFJlZmVyZW5jZWREYkNvbHVtbigpIHsKLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCk7Ci0JCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcih0aGlzLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5Jc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWZlcmVuY2VkRGJDb2x1bW4oKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciBidWlsZFRleHRSYW5nZVJlc29sdmVyKCkgewotCQlyZXR1cm4gbmV3IE9ybVByaW1hcnlLZXlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjJjN2Q4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxVbmlxdWVDb25zdHJhaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1SZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQKLQlleHRlbmRzIEFic3RyYWN0T3JtUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50Ci0JaW1wbGVtZW50cyBPcm1WaXJ0dWFsVW5pcXVlQ29uc3RyYWludAotewotCXByb3RlY3RlZCBmaW5hbCBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgb3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQ7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtVmlydHVhbFVuaXF1ZUNvbnN0cmFpbnQoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQgb3ZlcnJpZGRlblVuaXF1ZUNvbnN0cmFpbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5vdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludCA9IG92ZXJyaWRkZW5VbmlxdWVDb25zdHJhaW50OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zeW5jQ29sdW1uTmFtZXMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgWG1sQ29udGV4dE5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKFhtbENvbnRleHROb2RlKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgUmVhZE9ubHlVbmlxdWVDb25zdHJhaW50IGdldE92ZXJyaWRkZW5VbmlxdWVDb25zdHJhaW50KCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRSZXNvdXJjZUNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5vdmVycmlkZGVuVW5pcXVlQ29uc3RyYWludC5nZXRDb2x1bW5OYW1lcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmFjYzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSlBBIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1YbWwKLXsKLQkvKioKLQkgKiBJZiB0aGUgWE1MIHJlc291cmNlJ3MgY29udGVudCB0eXBlIGNoYW5nZXMsIHRoZSBtYXBwaW5nIGZpbGUKLQkgKiByZWYgd2lsbCB0aHJvdyBvdXQgaXRzIGN1cnJlbnQgbWFwcGluZyBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZTsgIC8vIG5ldmVyIG51bGwKLQotCS8qKgotCSAqIFRoZSByZXNvdXJjZSB0eXBlIHdpbGwgb25seSBjaGFuZ2UgaWYgdGhlIFhNTCBmaWxlJ3MgdmVyc2lvbiBjaGFuZ2VzCi0JICogKHNpbmNlLCBpZiB0aGUgY29udGVudCB0eXBlIGNoYW5nZXMsIHdlIGdldCBnYXJiYWdlLWNvbGxlY3RlZCkuCi0JICovCi0JcHJvdGVjdGVkIEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGU7Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZGVmaW5pdGlvbiBhbG9uZ3NpZGUgdGhlIHJlc291cmNlIHR5cGUuCi0JICogKFRoZSBkZWZpbml0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIHJlc291cmNlIHR5cGUuKQotCSAqLwotCXByb3RlY3RlZCBPcm1YbWxEZWZpbml0aW9uIGRlZmluaXRpb247Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBlbGVtZW50IG9mIHRoZSA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyByb290OwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybVhtbChNYXBwaW5nRmlsZVJlZiBwYXJlbnQsIEpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlKSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMuY2hlY2tYbWxSZXNvdXJjZSh4bWxSZXNvdXJjZSk7Ci0JCXRoaXMueG1sUmVzb3VyY2UgPSB4bWxSZXNvdXJjZTsKLQkJdGhpcy5yZXNvdXJjZVR5cGUgPSB4bWxSZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKTsKLQkJdGhpcy5kZWZpbml0aW9uID0gdGhpcy5idWlsZERlZmluaXRpb24oKTsKLQotCQlYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncyA9IChYbWxFbnRpdHlNYXBwaW5ncykgeG1sUmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpOwotCQlpZiAoeG1sRW50aXR5TWFwcGluZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5yb290ID0gdGhpcy5idWlsZFJvb3QoeG1sRW50aXR5TWFwcGluZ3MpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpY1BlcnNpc3RlbmNlWG1sI3N5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJWG1sRW50aXR5TWFwcGluZ3Mgb2xkWG1sRW50aXR5TWFwcGluZ3MgPSAodGhpcy5yb290ID09IG51bGwpID8gbnVsbCA6IHRoaXMucm9vdC5nZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlYbWxFbnRpdHlNYXBwaW5ncyBuZXdYbWxFbnRpdHlNYXBwaW5ncyA9IChYbWxFbnRpdHlNYXBwaW5ncykgdGhpcy54bWxSZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCUpwdFJlc291cmNlVHlwZSBuZXdSZXNvdXJjZVR5cGUgPSB0aGlzLnhtbFJlc291cmNlLmdldFJlc291cmNlVHlwZSgpOwotCi0JCS8vIElmIHRoZSBvbGQgYW5kIG5ldyBYTUwgZW50aXR5IG1hcHBpbmdzIGFyZSBkaWZmZXJlbnQgaW5zdGFuY2VzLAotCQkvLyB3ZSBzY3JhcCB0aGUgb2xkIGNvbnRleHQgZW50aXR5IG1hcHBpbmdzIGFuZCByZWJ1aWxkLgotCQkvLyAoVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMgZHJhc3RpY2FsbHksCi0JCS8vIHN1Y2ggYXMgYSBDVlMgY2hlY2tvdXQgb3IgYW4gZWRpdCByZXZlcnNpb24uKQotCQlpZiAoKG9sZFhtbEVudGl0eU1hcHBpbmdzICE9IG5ld1htbEVudGl0eU1hcHBpbmdzKSB8fAotCQkJCShuZXdYbWxFbnRpdHlNYXBwaW5ncyA9PSBudWxsKSB8fAotCQkJCXRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMucmVzb3VyY2VUeXBlLCBuZXdSZXNvdXJjZVR5cGUpCi0JCSkgewotCQkJaWYgKHRoaXMucm9vdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy51bnJlZ2lzdGVyUm9vdFN0cnVjdHVyZU5vZGUoKTsKLQkJCQl0aGlzLnJvb3QuZGlzcG9zZSgpOwotCQkJCXRoaXMuc2V0Um9vdChudWxsKTsKLQkJCX0KLQkJfQotCi0JCXRoaXMucmVzb3VyY2VUeXBlID0gbmV3UmVzb3VyY2VUeXBlOwotCQl0aGlzLmRlZmluaXRpb24gPSB0aGlzLmJ1aWxkRGVmaW5pdGlvbigpOwotCi0JCWlmIChuZXdYbWxFbnRpdHlNYXBwaW5ncyAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5yb290ID09IG51bGwpIHsKLQkJCQl0aGlzLnNldFJvb3QodGhpcy5idWlsZFJvb3QobmV3WG1sRW50aXR5TWFwcGluZ3MpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gdGhlIGNvbnRleHQgZW50aXR5IG1hcHBpbmdzIGFscmVhZHkgaG9sZHMgdGhlIFhNTCBlbnRpdHkgbWFwcGluZ3MKLQkJCQl0aGlzLnJvb3Quc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJaWYgKHRoaXMucm9vdCAhPSBudWxsKSB7Ci0JCQl0aGlzLnJvb3QudXBkYXRlKCk7Ci0JCQkvLyB0aGlzIHdpbGwgaGFwcGVuIHJlZHVuZGFudGx5IC0gbmVlZCB0byBob2xkIEpwYUZpbGU/Ci0JCQl0aGlzLnJlZ2lzdGVyUm9vdFN0cnVjdHVyZU5vZGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB0eXBlL2RlZmluaXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVHlwZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtWG1sRGVmaW5pdGlvbiBnZXRNYXBwaW5nRmlsZURlZmluaXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmluaXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIE9ybVhtbERlZmluaXRpb24gYnVpbGREZWZpbml0aW9uKCkgewotCQlyZXR1cm4gKE9ybVhtbERlZmluaXRpb24pIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXRSZXNvdXJjZURlZmluaXRpb24odGhpcy5yZXNvdXJjZVR5cGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByb290ICoqKioqKioqKioKLQotCXB1YmxpYyBFbnRpdHlNYXBwaW5ncyBnZXRSb290KCkgewotCQlyZXR1cm4gdGhpcy5yb290OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFJvb3QoRW50aXR5TWFwcGluZ3Mgcm9vdCkgewotCQlFbnRpdHlNYXBwaW5ncyBvbGQgPSB0aGlzLnJvb3Q7Ci0JCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChST09UX1BST1BFUlRZLCBvbGQsIHJvb3QpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBidWlsZFJvb3QoWG1sRW50aXR5TWFwcGluZ3MgeG1sRW50aXR5TWFwcGluZ3MpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRFbnRpdHlNYXBwaW5ncyh0aGlzLCB4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHF1ZXJpZXMvZ2VuZXJhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8UXVlcnk+IGdldE1hcHBpbmdGaWxlUXVlcmllcygpIHsKLQkJcmV0dXJuICh0aGlzLnJvb3QgIT0gbnVsbCkgPyB0aGlzLnJvb3QuZ2V0TWFwcGluZ0ZpbGVRdWVyaWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxRdWVyeT5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxHZW5lcmF0b3I+IGdldE1hcHBpbmdGaWxlR2VuZXJhdG9ycygpIHsKLQkJcmV0dXJuICh0aGlzLnJvb3QgIT0gbnVsbCkgPyB0aGlzLnJvb3QuZ2V0TWFwcGluZ0ZpbGVHZW5lcmF0b3JzKCkgOiBFbXB0eUl0ZXJhYmxlLjxHZW5lcmF0b3I+aW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1htbFJlc291cmNlKEpwYVhtbFJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAoICEgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihKcHRKcGFDb3JlUGx1Z2luLk1BUFBJTkdfRklMRV9DT05URU5UX1RZUEUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb250ZW50IHR5cGUgaXMgbm90ICdtYXBwaW5nIGZpbGUnOiAiICsgcmVzb3VyY2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE1hcHBpbmdGaWxlUmVmKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy54bWxSZXNvdXJjZS5nZXRGaWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYUZpbGUgZ2V0SnBhRmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmlsZSh0aGlzLnhtbFJlc291cmNlLmdldEZpbGUoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbihJRm9sZGVyIGZvbGRlcikgewotCQlJUmVzb3VyY2UgbWVtYmVyID0gZm9sZGVyLmZpbmRNZW1iZXIodGhpcy54bWxSZXNvdXJjZS5nZXRGaWxlKCkuZ2V0TmFtZSgpKTsKLQkJSUZpbGUgZmlsZSA9IHRoaXMueG1sUmVzb3VyY2UuZ2V0RmlsZSgpOwotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwobWVtYmVyLCBmaWxlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyBpc24ndCBhY3R1YWxseSBkaXNwbGF5ZWQsIHNvIG5lZWRzIG5vIGRldGFpbHMgcGFnZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmICgodGhpcy5yb290ICE9IG51bGwpICYmIHRoaXMucm9vdC5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KSkgewotCQkJcmV0dXJuIHRoaXMucm9vdC5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8vIG5ldmVyIGFjdHVhbGx5IHNlbGVjdGVkCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5yb290ICE9IG51bGwpIHsKLQkJCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZSgpOwotCQkJaWYgKGpwYUZpbGUgIT0gbnVsbCkgewotCQkJCXRoaXMudW5yZWdpc3RlclJvb3RTdHJ1Y3R1cmVOb2RlKCk7Ci0JCQl9Ci0JCQl0aGlzLnJvb3QuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0JLy8gVE9ETyBob2xkIHRoZSBKcGFGaWxlPwotCXByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyUm9vdFN0cnVjdHVyZU5vZGUoKSB7Ci0JCXRoaXMuZ2V0SnBhRmlsZSgpLmFkZFJvb3RTdHJ1Y3R1cmVOb2RlKHRoaXMueG1sUmVzb3VyY2UsIHRoaXMucm9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlclJvb3RTdHJ1Y3R1cmVOb2RlKCkgewotCQl0aGlzLmdldEpwYUZpbGUoKS5yZW1vdmVSb290U3RydWN0dXJlTm9kZSh0aGlzLnhtbFJlc291cmNlLCB0aGlzLnJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNYXBwaW5nRmlsZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgZ2V0WG1sUmVzb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFJlc291cmNlOwotCX0KLQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKHRoaXMucm9vdCA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnJvb3QuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIEFsbCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtYXBwaW5nIGZpbGVzIG11c3QgYmUgYWJsZSB0byBnZW5lcmF0ZSBhIHN0YXRpYyBtZXRhbW9kZWwKLQkgKiBiZWNhdXNlIDEuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBmaWxlcyBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIDIuMAotCSAqIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4KLQkgKiBmaWxlcy4KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGU8T3JtUGVyc2lzdGVudFR5cGU+IGdldFBlcnNpc3RlbnRUeXBlcygpIHsKLQkJcmV0dXJuICh0aGlzLnJvb3QgIT0gbnVsbCkgPyB0aGlzLnJvb3QuZ2V0UGVyc2lzdGVudFR5cGVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxPcm1QZXJzaXN0ZW50VHlwZT5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8RGVsZXRlRWRpdD4gY3JlYXRlRGVsZXRlVHlwZUVkaXRzKElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuICh0aGlzLnJvb3QgIT0gbnVsbCkgPwotCQkJCXRoaXMucm9vdC5jcmVhdGVEZWxldGVUeXBlRWRpdHModHlwZSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPERlbGV0ZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiAodGhpcy5yb290ICE9IG51bGwpID8KLQkJCQl0aGlzLnJvb3QuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiAodGhpcy5yb290ICE9IG51bGwpID8KLQkJCQl0aGlzLnJvb3QuY3JlYXRlTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gKHRoaXMucm9vdCAhPSBudWxsKSA/Ci0JCQkJdGhpcy5yb290LmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJaWYgKHRoaXMucm9vdCAhPSBudWxsKSB7Ci0JCQl0aGlzLnJvb3QudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJLy8gc2luY2UgdGhpcyBpcyB0aGUgZW50aXJlIGZpbGUsIHBvaW50IHRvIHRoZSB0b3Agb2YgdGhlIGZpbGUKLQkJcmV0dXJuIFRleHRSYW5nZS5FbXB0eS5pbnN0YW5jZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY4ZDdjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWxEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtWG1sRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmljT3JtWG1sRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljT3JtWG1sRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldFJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVhtbENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8qKgotCSAqIE9yZGVyIHNob3VsZCBub3QgbWF0dGVyIGhlcmU7IGJ1dCB3ZSdsbCB1c2UgdGhlIHNhbWUgb3JkZXIgYXMgZm9yIEphdmEuCi0JICogQHNlZSBHZW5lcmljSnBhUGxhdGZvcm1Qcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBBVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJT3JtVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1WZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtQmFzaWNNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1NYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlOdWxsT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKQotCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvb3JtL051bGxPcm1Db252ZXJ0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vTnVsbE9ybUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWE3ZTFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vTnVsbE9ybUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotCi1wdWJsaWMgY2xhc3MgTnVsbE9ybUNvbnZlcnRlcgotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtQ29udmVydGVyCi17Ci0JcHVibGljIE51bGxPcm1Db252ZXJ0ZXIoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtQXR0cmlidXRlTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vTnVsbE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9OdWxsT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZDA1MzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9OdWxsT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5SZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBVc2VkIGJ5Ci0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkdlbmVyaWNPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAjYnVpbGRKb2luQ29sdW1uU3RyYXRlZ3koKX0KLSAqIGluIGEgSlBBIDEuMCBwcm9qZWN0LgotICovCi1wdWJsaWMgY2xhc3MgTnVsbE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotewotCXB1YmxpYyBOdWxsT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuPE9ybUpvaW5Db2x1bW4+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLjxPcm1Kb2luQ29sdW1uPmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGFibGVOb3RWYWxpZERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBvbGRTdHJhdGVneSkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbVZpcnR1YWwoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgb2xkU3RyYXRlZ3kpIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIFJlYWRPbmx5UmVsYXRpb25zaGlwU3RyYXRlZ3kgc2VsZWN0T3ZlcnJpZGVTdHJhdGVneShSZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIG92ZXJyaWRlUmVsYXRpb25zaGlwKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0cmF0ZWd5KCkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJhdGVneSgpIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUYXJnZXRGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0UmVsYXRpb25zaGlwU291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVsYXRpb25zaGlwTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9VbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9vcm0vVW5zdXBwb3J0ZWRPcm1BdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYmE3Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L29ybS9VbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci0KLS8qKgotICogVGhpcyB3aWxsIGJlIHVzZWQgaW4gY2FzZXMgd2hlcmUgSmF2YS1zdXBwb3J0ZWQgYXR0cmlidXRlIG1hcHBpbmcgdHlwZXMKLSAqIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIDxjb2RlPm9ybS54bWw8L2NvZGU+Ci0gKiBmaWxlLiBGb3IgZXhhbXBsZSwgRWNsaXBzZUxpbmsgc3VwcG9ydHMgdmFyaWFibGUgMToxIG1hcHBpbmdzLCBidXQgdGhlCi0gKiBnZW5lcmljIDxjb2RlPm9ybS54bWw8L2NvZGU+IGZpbGUgZG9lcyBub3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZE9ybUF0dHJpYnV0ZU1hcHBpbmcgCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybUF0dHJpYnV0ZU1hcHBpbmc8WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0JcHVibGljIFVuc3VwcG9ydGVkT3JtQXR0cmlidXRlTWFwcGluZyhPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHhtbE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQkvL3RoaXMgZW5kcyB1cCByZXR1cm5pbmcgdGhlIGphdmEgYXR0cmlidXRlIG1hcHBpbmcga2V5Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU9uKE9ybUF0dHJpYnV0ZU1hcHBpbmcgbmV3TWFwcGluZykgewotCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8oQXR0cmlidXRlcyB4bWxBdHRyaWJ1dGVzKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKEF0dHJpYnV0ZXMgeG1sQXR0cmlidXRlcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKiogIAotCi0JQE92ZXJyaWRlCi0JcHVibGljIE1ldGFtb2RlbEZpZWxkIGdldE1ldGFtb2RlbEZpZWxkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY0NsYXNzUmVmLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY0NsYXNzUmVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjMxYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNDbGFzc1JlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TaW5nbGVFbGVtZW50SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4gZmlsZQotICogPGJyPgotICogPGNvZGU+Y2xhc3M8L2NvZGU+IGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNDbGFzc1JlZgotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBDbGFzc1JlZgotewotCS8qKgotCSAqIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gZm9yIGEgPGVtPnZpcnR1YWw8L2VtPiBjbGFzcyByZWYuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFhtbEphdmFDbGFzc1JlZiB4bWxKYXZhQ2xhc3NSZWY7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZTsKLQotCS8qKgotCSAqIFRoZSBKYXZhIHBlcnNpc3RlbnQgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWYncyBjbGFzcyBuYW1lOwotCSAqIHRoaXMgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBjbGFzc05hbWUgaXMgaW52YWxpZCBvcgotCSAqIHJlZmVycyB0byBhbiBlbnVtIGluc3RlYWQgb2YgYSBjbGFzcyBvciBpbnRlcmZhY2UuCi0JICovCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGU7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvbnN0cnVjdCBhIDxlbT5zcGVjaWZpZWQ8L2VtPiBjbGFzcyByZWY7IGkuZS4gYSBjbGFzcyByZWYgd2l0aAotCSAqIGFuIGV4cGxpY2l0IGVudHJ5IGluIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBHZW5lcmljQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZikgewotCQl0aGlzKHBhcmVudCwgeG1sSmF2YUNsYXNzUmVmLCB4bWxKYXZhQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdCBhbiA8ZW0+dmlydHVhbDwvZW0+IGNsYXNzIHJlZjsgaS5lLiBhIGNsYXNzIHJlZiB3aXRob3V0Ci0JICogYW4gZXhwbGljaXQgZW50cnkgaW4gdGhlIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uCi0JICovCi0JcHVibGljIEdlbmVyaWNDbGFzc1JlZihQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCXRoaXMocGFyZW50LCBudWxsLCBjbGFzc05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBHZW5lcmljQ2xhc3NSZWYoUGVyc2lzdGVuY2VVbml0IHBhcmVudCwgWG1sSmF2YUNsYXNzUmVmIHhtbEphdmFDbGFzc1JlZiwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbEphdmFDbGFzc1JlZiA9IHhtbEphdmFDbGFzc1JlZjsKLQkJdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JCS8vICdqYXZhUGVyc2lzdGVudFR5cGUnIGlzIHJlc29sdmVkIGluIHRoZSB1cGRhdGUKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJLy8gdmlydHVhbCBjbGFzcyByZWZzIGFyZSBtYXRjaGVkIGJ5IG5hbWUgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJLy8gc28gbm8gbmVlZCB0byBzeW5jIGl0IGhlcmUgKGFsc28sICd4bWxKYXZhQ2xhc3NSZWYnIGlzIG51bGwuLi4pCi0JCWlmICh0aGlzLmlzTm90VmlydHVhbCgpKSB7Ci0JCQkvLyB0aGUgbmFtZSBwcm9iYWJseSBuZXZlciBjaGFuZ2VzLi4uCi0JCQl0aGlzLnNldENsYXNzTmFtZV8odGhpcy54bWxKYXZhQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQl9Ci0JCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUphdmFQZXJzaXN0ZW50VHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGFzcyBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jbGFzc05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJaWYgKHRoaXMuaXNWaXJ0dWFsKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBuYW1lIG9mIGEgdmlydHVhbCBjbGFzcyByZWYgY2Fubm90IGJlIGNoYW5nZWQ6ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuc2V0Q2xhc3NOYW1lXyhjbGFzc05hbWUpOwotCQl0aGlzLnhtbEphdmFDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWVfKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY2xhc3NOYW1lOwotCQl0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENMQVNTX05BTUVfUFJPUEVSVFksIG9sZCwgY2xhc3NOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBOZXN0ZWQgY2xhc3NlcyB3aWxsIGJlIHF1YWxpZmllZCB3aXRoIGEgJyQnOyB0aGUgSmF2YSBuYW1lIGlzIHF1YWxpZmllZAotCSAqIHdpdGggYSAnLicuIExpa2UgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPiwgdGhpcyBjYW4gYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKYXZhQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0aGlzLmNsYXNzTmFtZSkgPyBudWxsIDogdGhpcy5jbGFzc05hbWUucmVwbGFjZSgnJCcsICcuJyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGphdmEgcGVyc2lzdGVudCB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhUGVyc2lzdGVudFR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SmF2YVBlcnNpc3RlbnRUeXBlKEphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG9sZCA9IHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlOwotCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9IGphdmFQZXJzaXN0ZW50VHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZLCBvbGQsIGphdmFQZXJzaXN0ZW50VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHRoaXMucmVzb2x2ZUphdmFSZXNvdXJjZVR5cGUoKTsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJCXRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmRpc3Bvc2UoKTsKLQkJCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50VHlwZShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmphdmFQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRKYXZhUGVyc2lzdGVudFR5cGUodGhpcy5idWlsZEphdmFQZXJzaXN0ZW50VHlwZShyZXNvdXJjZVR5cGUpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMuamF2YVBlcnNpc3RlbnRUeXBlLmdldEphdmFSZXNvdXJjZVR5cGUoKSA9PSByZXNvdXJjZVR5cGUpIHsKLQkJCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUudXBkYXRlKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOwotCQkJCQl0aGlzLnNldEphdmFQZXJzaXN0ZW50VHlwZSh0aGlzLmJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKHJlc291cmNlVHlwZSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VUeXBlIHJlc29sdmVKYXZhUmVzb3VyY2VUeXBlKCkgewotCQlTdHJpbmcgamF2YUNsYXNzTmFtZSA9IHRoaXMuZ2V0SmF2YUNsYXNzTmFtZSgpOwotCQlyZXR1cm4gKGphdmFDbGFzc05hbWUgPT0gbnVsbCkgPyBudWxsIDogKEphdmFSZXNvdXJjZVR5cGUpIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoamF2YUNsYXNzTmFtZSwgS2luZC5UWVBFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGJ1aWxkSmF2YVBlcnNpc3RlbnRUeXBlKEphdmFSZXNvdXJjZVR5cGUganJwdCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUodGhpcywganJwdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sSmF2YUNsYXNzUmVmIGdldFhtbENsYXNzUmVmKCkgewotCQlyZXR1cm4gdGhpcy54bWxKYXZhQ2xhc3NSZWY7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNGb3IoSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gdGhpcy5pc0Zvcih0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHR5cGVOYW1lLCB0aGlzLmdldEphdmFDbGFzc05hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNJblBhY2thZ2UoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMuZ2V0UGFja2FnZU5hbWUoKSwgcGFja2FnZUZyYWdtZW50LmdldEVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0JCWludCBsYXN0UGVyaW9kID0gdGhpcy5jbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJcmV0dXJuIChsYXN0UGVyaW9kID09IC0xKSA/IG51bGwgOiB0aGlzLmNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNWaXJ0dWFsKCkgewotCQlyZXR1cm4gdGhpcy54bWxKYXZhQ2xhc3NSZWYgPT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdFZpcnR1YWwoKSB7Ci0JCXJldHVybiAhIHRoaXMuaXNWaXJ0dWFsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuIHRoaXMuaXNOb3RWaXJ0dWFsKCkgJiYgdGhpcy54bWxKYXZhQ2xhc3NSZWYuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5nZXRKYXZhQ2xhc3NOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFTdHJ1Y3R1cmVOb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzLkNMQVNTX1JFRl9JRDsKLQl9Ci0KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5pc1ZpcnR1YWwoKSA/IG51bGwgOiB0aGlzLnhtbEphdmFDbGFzc1JlZi5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJdGhpcy5qYXZhUGVyc2lzdGVudFR5cGUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbnRUeXBlLk93bmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldE92ZXJyaWRlUGVyc2lzdGVudFR5cGVBY2Nlc3MoKSB7Ci0JCS8vIG5vIGFjY2VzcyB0eXBlIGF0IHRoaXMgbGV2ZWwgb3ZlcnJpZGVzIGFueSBsb2NhbCBhY2Nlc3MgdHlwZSBzcGVjaWZpY2F0aW9uCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldERlZmF1bHRQZXJzaXN0ZW50VHlwZUFjY2VzcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RGVmYXVsdEFjY2VzcygpOwotCX0KLQotCi0JLy8qKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZURlbGV0ZVR5cGVFZGl0cyhmaW5hbCBJVHlwZSB0eXBlKSB7Ci0JCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaXNGb3IodHlwZSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RGVsZXRlRWRpdD4odGhpcy5jcmVhdGVEZWxldGVFZGl0KCkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxEZWxldGVFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERlbGV0ZUVkaXQgY3JlYXRlRGVsZXRlRWRpdCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sSmF2YUNsYXNzUmVmLmNyZWF0ZURlbGV0ZUVkaXQoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaXNGb3Iob3JpZ2luYWxUeXBlKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZXBsYWNlRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVwbGFjZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxKYXZhQ2xhc3NSZWYuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbFR5cGUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIElQYWNrYWdlRnJhZ21lbnQgbmV3UGFja2FnZSkgewotCQlpZiAodGhpcy5pc1ZpcnR1YWwoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiB0aGlzLmlzRm9yKG9yaWdpbmFsVHlwZSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLmlzVmlydHVhbCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuaXNJblBhY2thZ2Uob3JpZ2luYWxQYWNrYWdlKSA/Ci0JCQkJbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbEphdmFDbGFzc1JlZi5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0KLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5jbGFzc05hbWUpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTLAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodGhpcy5qYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUywKLQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldEphdmFDbGFzc05hbWUoKX0sCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIDE5MDA2MiB2YWxpZGF0ZSBKYXZhIGNsYXNzIG9ubHkgaWYgdGhpcyBpcyB0aGUgb25seSByZWZlcmVuY2UgdG8gaXQKLQkJLy8gaS5lLiB0aGUgcGVyc2lzdGVuY2UueG1sIHJlZiBpcyB0aGUgb25seSByZWYgLSBub25lIG9mIHRoZSBtYXBwaW5nCi0JCS8vIGZpbGVzIHJlZmVyZW5jZSB0aGUgc2FtZSBjbGFzcwotCQlib29sZWFuIHZhbGlkYXRlSmF2YVBlcnNpc3RlbnRUeXBlID0gdHJ1ZTsKLQkJZm9yIChNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzQ29udGFpbmluZyh0aGlzLmdldEphdmFDbGFzc05hbWUoKSkpIHsKLQkJCXZhbGlkYXRlSmF2YVBlcnNpc3RlbnRUeXBlID0gZmFsc2U7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkxPV19TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTLAotCQkJCQluZXcgU3RyaW5nW10ge3RoaXMuZ2V0SmF2YUNsYXNzTmFtZSgpLCBtYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQl9Ci0KLQkJaWYgKHZhbGlkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQl0aGlzLnZhbGlkYXRlSmF2YVBlcnNpc3RlbnRUeXBlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUphdmFQZXJzaXN0ZW50VHlwZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmphdmFQZXJzaXN0ZW50VHlwZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2codCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFhtbFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmlzVmlydHVhbCgpID8gbnVsbCA6IHRoaXMueG1sSmF2YUNsYXNzUmVmLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpY0phckZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljSmFyRmlsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWMyNTdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljSmFyRmlsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0SmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZjsKLQotLyoqCi0gKiBDb250ZXh0IEpBUiBmaWxlIHJlZmVyZW5jZSAoZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdCkKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXJGaWxlUmVmIAotCWV4dGVuZHMgQWJzdHJhY3RKYXJGaWxlUmVmCi17Ci0JcHVibGljIEdlbmVyaWNKYXJGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbEphckZpbGVSZWYgeG1sSmFyRmlsZVJlZikgewotCQlzdXBlcihwYXJlbnQsIHhtbEphckZpbGVSZWYpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNNYXBwaW5nRmlsZVJlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNNYXBwaW5nRmlsZVJlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2EwYTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljTWFwcGluZ0ZpbGVSZWYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotLyoqCi0gKiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUKLSAqIDxicj4KLSAqIDxjb2RlPm1hcHBpbmctZmlsZTwvY29kZT4gZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01hcHBpbmdGaWxlUmVmCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdGaWxlUmVmCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmOwotCi0KLQlwdWJsaWMgR2VuZXJpY01hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7Ci0JCXRoaXMueG1sTWFwcGluZ0ZpbGVSZWYgPSB4bWxNYXBwaW5nRmlsZVJlZjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCS8vIHNldCB0aGUgZmlsZSBuYW1lICpiZWZvcmUqIGNhbGxpbmcgc3VwZXIKLQkJdGhpcy5zZXRGaWxlTmFtZV8odGhpcy54bWxNYXBwaW5nRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmaWxlIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXRoaXMuc2V0RmlsZU5hbWVfKGZpbGVOYW1lKTsKLQkJdGhpcy54bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RmlsZU5hbWVfKFN0cmluZyB4bWxGaWxlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5maWxlTmFtZTsKLQkJdGhpcy5maWxlTmFtZSA9IHhtbEZpbGVOYW1lOwotCQlpZiAodGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZJTEVfTkFNRV9QUk9QRVJUWSwgb2xkLCB4bWxGaWxlTmFtZSkpIHsKLQkJCWlmICh0aGlzLm1hcHBpbmdGaWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLm1hcHBpbmdGaWxlLmRpc3Bvc2UoKTsKLQkJCQl0aGlzLnNldE1hcHBpbmdGaWxlKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFhtbE1hcHBpbmdGaWxlUmVmIGdldFhtbE1hcHBpbmdGaWxlUmVmKCkgewotCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nRmlsZVJlZjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgdGV4dE9mZnNldCkgewotCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nRmlsZVJlZi5jb250YWluc09mZnNldCh0ZXh0T2Zmc2V0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sTWFwcGluZ0ZpbGVSZWYuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRYbWxWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nRmlsZVJlZi5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxEZWxldGVFZGl0PiBjcmVhdGVEZWxldGVNYXBwaW5nRmlsZUVkaXRzKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIHRoaXMuaXNGb3IoZmlsZSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8RGVsZXRlRWRpdD4odGhpcy5jcmVhdGVEZWxldGVFZGl0KCkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxEZWxldGVFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERlbGV0ZUVkaXQgY3JlYXRlRGVsZXRlRWRpdCgpIHsKLQkJcmV0dXJuIHRoaXMueG1sTWFwcGluZ0ZpbGVSZWYuY3JlYXRlRGVsZXRlRWRpdCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElGaWxlIG9yaWdpbmFsRmlsZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sTWFwcGluZ0ZpbGVSZWYuY3JlYXRlUmVuYW1lRWRpdChvcmlnaW5hbEZpbGUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lRm9sZGVyRWRpdHMoSUZvbGRlciBvcmlnaW5hbEZvbGRlciwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMuaXNJbihvcmlnaW5hbEZvbGRlcikgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lRm9sZGVyRWRpdChvcmlnaW5hbEZvbGRlciwgbmV3TmFtZSkpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxSZXBsYWNlRWRpdD5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVGb2xkZXJFZGl0KElGb2xkZXIgb3JpZ2luYWxGb2xkZXIsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLmNyZWF0ZVJlbmFtZUZvbGRlckVkaXQob3JpZ2luYWxGb2xkZXIsIG5ld05hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXBsYWNlRWRpdCBjcmVhdGVNb3ZlRWRpdChJRmlsZSBvcmlnaW5hbEZpbGUsIElQYXRoIHJ1bnRpbmVEZXN0aW5hdGlvbikgewotCQlyZXR1cm4gdGhpcy54bWxNYXBwaW5nRmlsZVJlZi5jcmVhdGVNb3ZlRWRpdChvcmlnaW5hbEZpbGUsIHJ1bnRpbmVEZXN0aW5hdGlvbik7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlRm9sZGVyRWRpdHMoSUZvbGRlciBvcmlnaW5hbEZvbGRlciwgSVBhdGggcnVudGltZURlc3RpbmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmlzSW4ob3JpZ2luYWxGb2xkZXIpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZU1vdmVFZGl0KG9yaWdpbmFsRm9sZGVyLCBydW50aW1lRGVzdGluYXRpb24pKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlTW92ZUVkaXQoSUZvbGRlciBvcmlnaW5hbEZvbGRlciwgSVBhdGggcnVudGltZURlc3RpbmF0aW9uKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBvcmlnaW5hbEZvbGRlci5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gb3JpZ2luYWxGb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJSVBhdGggb3JpZ2luYWxMb2NhdGlvbiA9IEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpLmdldFJ1bnRpbWVQYXRoKHByb2plY3QsIGZ1bGxQYXRoKTsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlTW92ZUVkaXQob3JpZ2luYWxMb2NhdGlvbiwgcnVudGltZURlc3RpbmF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlTW92ZUVkaXQoSVBhdGggb3JpZ2luYWxMb2NhdGlvbiwgSVBhdGggcnVudGluZURlc3RpbmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLnhtbE1hcHBpbmdGaWxlUmVmLmNyZWF0ZU1vdmVFZGl0KG9yaWdpbmFsTG9jYXRpb24sIHJ1bnRpbmVEZXN0aW5hdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODE3MDdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlCi0gKiA8YnI+Ci0gKiA8Y29kZT5wZXJzaXN0ZW5jZTwvY29kZT4gZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlCi0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlMl8wCi17Ci0JcHJvdGVjdGVkIGZpbmFsIFhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlOwotCi0JLy8gVGhlIGltcGxlbWVudGF0aW9uIGhlcmUgaXMgYSBzaW5nbGUgcGVyc2lzdGVuY2UgdW5pdCwgYWx0aG91Z2ggdGhlIEFQSQotCS8vIGlzIGZvciBhIGxpc3QuIFdlIHdhbnQgdG8gc3VwcG9ydCBtdWx0aXBsZSBwZXJzaXN0ZW5jZSB1bml0cyBzb21lZGF5Li4uLgotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0OwotCi0KLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlKFBlcnNpc3RlbmNlWG1sIHBhcmVudCwgWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy54bWxQZXJzaXN0ZW5jZSA9IHhtbFBlcnNpc3RlbmNlOwotCQl0aGlzLmluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1BlcnNpc3RlbmNlVW5pdHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZU5vZGVzKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0cygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGVyc2lzdGVuY2UgdW5pdHMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQ+IGdldFBlcnNpc3RlbmNlVW5pdHMoKSB7Ci0JCXJldHVybiAodGhpcy5wZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgPyBFbXB0eUxpc3RJdGVyYWJsZS48UGVyc2lzdGVuY2VVbml0Pmluc3RhbmNlKCkgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdHNfKCk7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxQZXJzaXN0ZW5jZVVuaXQ+IGdldFBlcnNpc3RlbmNlVW5pdHNfKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmFibGU8UGVyc2lzdGVuY2VVbml0Pih0aGlzLnBlcnNpc3RlbmNlVW5pdCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLnBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSA/IDAgOiAxOwotCX0KLQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgYWRkUGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gdGhpcy5hZGRQZXJzaXN0ZW5jZVVuaXQodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGFkZFBlcnNpc3RlbmNlVW5pdChpbnQgaW5kZXgpIHsKLQkJaWYgKChpbmRleCA+IDApIHx8ICh0aGlzLnBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzLiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0ID0gdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdCh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIGluZGV4LCB0aGlzLnBlcnNpc3RlbmNlVW5pdCk7Ci0JCXJldHVybiB0aGlzLnBlcnNpc3RlbmNlVW5pdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVVuaXQoUGVyc2lzdGVuY2VVbml0IHB1KSB7Ci0JCWlmIChwdSAhPSB0aGlzLnBlcnNpc3RlbmNlVW5pdCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBwZXJzaXN0ZW5jZSB1bml0OiAiICsgcHUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5yZW1vdmVQZXJzaXN0ZW5jZVVuaXQoMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUGVyc2lzdGVuY2VVbml0KGludCBpbmRleCkgewotCQlpZiAoKGluZGV4ID4gMCkgfHwgKHRoaXMucGVyc2lzdGVuY2VVbml0ID09IG51bGwpKSB7Ci0JCQl0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiaW5kZXg6ICIgKyBpbmRleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlQZXJzaXN0ZW5jZVVuaXQgb2xkID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQ7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0LmRpc3Bvc2UoKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBudWxsOwotCQl0aGlzLnhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5yZW1vdmUoaW5kZXgpOwotCQl0aGlzLmZpcmVJdGVtUmVtb3ZlZChQRVJTSVNURU5DRV9VTklUU19MSVNULCBpbmRleCwgb2xkKTsKLQl9Ci0KLQkvLyBvbmx5IGJ1aWxkaW5nIG9uZSBoZXJlLCB1bnRpbCB3ZSBzdXBwb3J0IG11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzLi4uCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVBlcnNpc3RlbmNlVW5pdHMoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VVbml0ID0gdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdCh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY1BlcnNpc3RlbmNlVW5pdHMoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgewotCQkJaWYgKHhtbFBlcnNpc3RlbmNlVW5pdCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5hZGRQZXJzaXN0ZW5jZVVuaXRfKHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXQoeG1sUGVyc2lzdGVuY2VVbml0KSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoeG1sUGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCQl0aGlzLnJlbW92ZVBlcnNpc3RlbmNlVW5pdF8oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0LmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpID09IHhtbFBlcnNpc3RlbmNlVW5pdCkgewotCQkJCQl0aGlzLnBlcnNpc3RlbmNlVW5pdC5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJdGhpcy5yZW1vdmVQZXJzaXN0ZW5jZVVuaXRfKCk7Ci0JCQkJCXRoaXMuYWRkUGVyc2lzdGVuY2VVbml0Xyh0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0KHhtbFBlcnNpc3RlbmNlVW5pdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXQgZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkgewotCQlMaXN0PFhtbFBlcnNpc3RlbmNlVW5pdD4geG1sUGVyc2lzdGVuY2VVbml0cyA9IHRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0cy5pc0VtcHR5KCkgPyBudWxsIDogeG1sUGVyc2lzdGVuY2VVbml0cy5nZXQoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyc2lzdGVuY2VVbml0XyhQZXJzaXN0ZW5jZVVuaXQgcHUpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXQgPSBwdTsKLQkJdGhpcy5maXJlSXRlbUFkZGVkKFBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIDAsIHB1KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVQZXJzaXN0ZW5jZVVuaXRfKCkgewotCQlQZXJzaXN0ZW5jZVVuaXQgb2xkID0gdGhpcy5wZXJzaXN0ZW5jZVVuaXQ7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0ID0gbnVsbDsKLQkJb2xkLmRpc3Bvc2UoKTsKLQkJdGhpcy5maXJlSXRlbVJlbW92ZWQoUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCwgMCwgb2xkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkUGVyc2lzdGVuY2VVbml0KFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRQZXJzaXN0ZW5jZVVuaXQodGhpcywgeG1sUGVyc2lzdGVuY2VVbml0KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZXRhbW9kZWwoKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0IHB1IDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkpIHsKLQkJCSgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwdSkuaW5pdGlhbGl6ZU1ldGFtb2RlbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0IHB1IDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkpIHsKLQkJCSgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwdSkuc3luY2hyb25pemVNZXRhbW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2VNZXRhbW9kZWwoKSB7Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0IHB1IDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkpIHsKLQkJCSgoUGVyc2lzdGVuY2VVbml0Ml8wKSBwdSkuZGlzcG9zZU1ldGFtb2RlbCgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFBlcnNpc3RlbmNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGVyc2lzdGVuY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IHRleHRPZmZzZXQpIHsKLQkJcmV0dXJuICh0aGlzLnhtbFBlcnNpc3RlbmNlID09IG51bGwpID8gZmFsc2UgOiB0aGlzLnhtbFBlcnNpc3RlbmNlLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBYbWxDb250ZXh0Tm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlWG1sKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWwgZ2V0UGVyc2lzdGVuY2VYbWwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEpwYVN0cnVjdHVyZU5vZGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOQ0VfSUQ7Ci0JfQotCi0JcHVibGljIEpwYVN0cnVjdHVyZU5vZGUgZ2V0U3RydWN0dXJlTm9kZShpbnQgdGV4dE9mZnNldCkgewotCQlmb3IgKFBlcnNpc3RlbmNlVW5pdCBwdSA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0cygpKSB7Ci0JCQlpZiAocHUuY29udGFpbnNPZmZzZXQodGV4dE9mZnNldCkpIHsKLQkJCQlyZXR1cm4gcHUuZ2V0U3RydWN0dXJlTm9kZSh0ZXh0T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0U2VsZWN0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChQZXJzaXN0ZW5jZVVuaXQgcHUgOiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdHMoKSkgewotCQkJcHUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlVmVyc2lvbihtZXNzYWdlcyk7Ci0JCXRoaXMuY2hlY2tGb3JNdWx0aXBsZVBlcnNpc3RlbmNlVW5pdHMobWVzc2FnZXMpOwotCQl0aGlzLnZhbGlkYXRlUGVyc2lzdGVuY2VVbml0KG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWZXJzaW9uKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzKSB7Ci0JCWlmICghIHRoaXMuZ2V0TGF0ZXN0RG9jdW1lbnRWZXJzaW9uKCkuZXF1YWxzKHRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0VmVyc2lvbigpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkxPV19TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5YTUxfVkVSU0lPTl9OT1RfTEFURVNULAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0VmVyc2lvblRleHRSYW5nZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhdGVzdERvY3VtZW50VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhUGxhdGZvcm0oKS5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKAotCQkJCUpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSkuZ2V0VmVyc2lvbigpOwotCX0KLQotCS8qKgotCSAqIGV4dHJhbmVvdXMgcGVyc2lzdGVuY2UgdW5pdHMgY2FuIGJlCi0JICogYWNjZXNzZWQgdGhyb3VnaCB0aGUgWG1sUGVyc2lzdGVuY2UgcmVzb3VyY2Ugb2JqZWN0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JNdWx0aXBsZVBlcnNpc3RlbmNlVW5pdHMoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMueG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSA+IDEpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfTVVMVElQTEVfUEVSU0lTVEVOQ0VfVU5JVFMsCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGVyc2lzdGVuY2VVbml0KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQsCi0JCQkJCXRoaXMsCi0JCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdC52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGEzZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogZ2VuZXJpYyA8Y29kZT5wZXJzaXN0ZW5jZS11bml0PC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdAotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXQKLXsKLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdChQZXJzaXN0ZW5jZSBwYXJlbnQsIFhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCX0KLQotCXB1YmxpYyBKcGFKcHFsUXVlcnlIZWxwZXIgY3JlYXRlSnBxbFF1ZXJ5SGVscGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFKcHFsUXVlcnlIZWxwZXIodGhpcy5nZXRKcGFQbGF0Zm9ybSgpLmdldEpwcWxHcmFtbWFyKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUHJvcGVydGllcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmUxMTEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VVbml0UHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogU3RyYWlnaHRmb3J3YXJkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnR5LgotICogTm90aWZpZXMgdGhlIHBlcnNpc3RlbmNlIHVuaXQgb2YgYW55IGNoYW5nZXMgdG8gdGhlIHByb3BlcnR5LgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdFByb3BlcnR5Ci0JZXh0ZW5kcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eQotewotCXByb3RlY3RlZCBmaW5hbCBYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKLQotCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eShQZXJzaXN0ZW5jZVVuaXQgcGFyZW50LCBYbWxQcm9wZXJ0eSB4bWxQcm9wZXJ0eSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnhtbFByb3BlcnR5ID0geG1sUHJvcGVydHk7Ci0JCXRoaXMubmFtZSA9IHhtbFByb3BlcnR5LmdldE5hbWUoKTsKLQkJdGhpcy52YWx1ZSA9IHhtbFByb3BlcnR5LmdldFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sUHJvcGVydHkgZ2V0WG1sUHJvcGVydHkoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFByb3BlcnR5OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy54bWxQcm9wZXJ0eS5nZXROYW1lKCkpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLnhtbFByb3BlcnR5LmdldFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMuc2V0TmFtZV8obmFtZSk7Ci0JCXRoaXMueG1sUHJvcGVydHkuc2V0TmFtZShuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQlpZiAodGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSkpIHsKLQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucHJvcGVydHlOYW1lQ2hhbmdlZChvbGQsIG5hbWUsIHRoaXMudmFsdWUpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLnNldFZhbHVlXyh2YWx1ZSk7Ci0JCXRoaXMueG1sUHJvcGVydHkuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJaWYgKHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSkpIHsKLQkJCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucHJvcGVydHlWYWx1ZUNoYW5nZWQodGhpcy5uYW1lLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlUGFja2FnZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFZhbHVlUGFja2FnZU5hbWVfKCk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjoge0BsaW5rICN2YWx1ZX0gaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZVBhY2thZ2VOYW1lXygpIHsKLQkJaW50IGxhc3RQZXJpb2QgPSB0aGlzLnZhbHVlLmxhc3RJbmRleE9mKCcuJyk7Ci0JCXJldHVybiAobGFzdFBlcmlvZCA9PSAtMSkgPyBudWxsIDogdGhpcy52YWx1ZS5zdWJzdHJpbmcoMCwgbGFzdFBlcmlvZCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy54bWxQcm9wZXJ0eS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sUHJvcGVydHkuY3JlYXRlUmVuYW1lVHlwZUVkaXQob3JpZ2luYWxUeXBlLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRoaXMudmFsdWUsIG9yaWdpbmFsVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoJy4nKSkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3UGFja2FnZS5nZXRFbGVtZW50TmFtZSgpKSkgOgotCQkJCUVtcHR5SXRlcmFibGUuPFJlcGxhY2VFZGl0Pmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbCh0aGlzLmdldFZhbHVlUGFja2FnZU5hbWUoKSwgb3JpZ2luYWxQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpID8KLQkJCQluZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48UmVwbGFjZUVkaXQ+aW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIHRoaXMueG1sUHJvcGVydHkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQkJc2IuYXBwZW5kKCIgPSAiKTsgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2NhOTBlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2UyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIGNvbnRleHQgbW9kZWwgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VYbWwKLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VYbWwyXzAKLXsKLQkvKioKLQkgKiBJZiB0aGUgWE1MIHJlc291cmNlJ3MgY29udGVudCB0eXBlIGNoYW5nZXMsIHRoZSByb290IGNvbnRleHQKLQkgKiBub2RlIHdpbGwgdGhyb3cgb3V0IGl0cyBjdXJyZW50IHBlcnNpc3RlbmNlIFhNTC4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2U7ICAvLyBuZXZlciBudWxsCi0KLQkvKioKLQkgKiBUaGUgcmVzb3VyY2UgdHlwZSB3aWxsIG9ubHkgY2hhbmdlIGlmIHRoZSBYTUwgZmlsZSdzIHZlcnNpb24gY2hhbmdlcwotCSAqIChzaW5jZSwgaWYgdGhlIGNvbnRlbnQgdHlwZSBjaGFuZ2VzLCB3ZSBnZXQgZ2FyYmFnZS1jb2xsZWN0ZWQpLgotCSAqLwotCXByb3RlY3RlZCBKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlOwotCi0JLyoqCi0JICogVGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZTsKLQotCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbChKcGFSb290Q29udGV4dE5vZGUgcGFyZW50LCBKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmNoZWNrWG1sUmVzb3VyY2UoeG1sUmVzb3VyY2UpOwotCQl0aGlzLnhtbFJlc291cmNlID0geG1sUmVzb3VyY2U7Ci0JCXRoaXMucmVzb3VyY2VUeXBlID0geG1sUmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0KLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSAoWG1sUGVyc2lzdGVuY2UpIHhtbFJlc291cmNlLmdldFJvb3RPYmplY3QoKTsKLQkJaWYgKHhtbFBlcnNpc3RlbmNlICE9IG51bGwpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2UgPSB0aGlzLmJ1aWxkUGVyc2lzdGVuY2UoeG1sUGVyc2lzdGVuY2UpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLkdlbmVyaWNPcm1YbWwjc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQlYbWxQZXJzaXN0ZW5jZSBvbGRYbWxQZXJzaXN0ZW5jZSA9ICh0aGlzLnBlcnNpc3RlbmNlID09IG51bGwpID8gbnVsbCA6IHRoaXMucGVyc2lzdGVuY2UuZ2V0WG1sUGVyc2lzdGVuY2UoKTsKLQkJWG1sUGVyc2lzdGVuY2UgbmV3WG1sUGVyc2lzdGVuY2UgPSAoWG1sUGVyc2lzdGVuY2UpIHRoaXMueG1sUmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpOwotCQlKcHRSZXNvdXJjZVR5cGUgbmV3UmVzb3VyY2VUeXBlID0gdGhpcy54bWxSZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKTsKLQotCQkvLyBJZiB0aGUgb2xkIGFuZCBuZXcgWE1MIHBlcnNpc3RlbmNlcyBhcmUgZGlmZmVyZW50IGluc3RhbmNlcywKLQkJLy8gd2Ugc2NyYXAgdGhlIG9sZCBjb250ZXh0IHBlcnNpc3RlbmNlIGFuZCByZWJ1aWxkLgotCQkvLyAoVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHJlc291cmNlIG1vZGVsIGNoYW5nZXMgZHJhc3RpY2FsbHksCi0JCS8vIHN1Y2ggYXMgYSBDVlMgY2hlY2tvdXQgb3IgYW4gZWRpdCByZXZlcnNpb24uKQotCQlpZiAoKG9sZFhtbFBlcnNpc3RlbmNlICE9IG5ld1htbFBlcnNpc3RlbmNlKSB8fAotCQkJCShuZXdYbWxQZXJzaXN0ZW5jZSA9PSBudWxsKSB8fCAKLQkJCQl0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnJlc291cmNlVHlwZSwgbmV3UmVzb3VyY2VUeXBlKQotCQkpIHsKLQkJCWlmICh0aGlzLnBlcnNpc3RlbmNlICE9IG51bGwpIHsKLQkJCQl0aGlzLnVucmVnaXN0ZXJSb290U3RydWN0dXJlTm9kZSgpOwotCQkJCXRoaXMucGVyc2lzdGVuY2UuZGlzcG9zZSgpOwotCQkJCXRoaXMuc2V0UGVyc2lzdGVuY2UobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQl0aGlzLnJlc291cmNlVHlwZSA9IG5ld1Jlc291cmNlVHlwZTsKLQotCQlpZiAobmV3WG1sUGVyc2lzdGVuY2UgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMucGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0UGVyc2lzdGVuY2UodGhpcy5idWlsZFBlcnNpc3RlbmNlKG5ld1htbFBlcnNpc3RlbmNlKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIHRoZSBjb250ZXh0IHBlcnNpc3RlbmNlIGFscmVhZHkgaG9sZHMgdGhlIFhNTCBwZXJzaXN0ZW5jZQotCQkJCXRoaXMucGVyc2lzdGVuY2Uuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2UgIT0gbnVsbCkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZS51cGRhdGUoKTsKLQkJCS8vIHRoaXMgd2lsbCBoYXBwZW4gcmVkdW5kYW50bHkgLSBuZWVkIHRvIGhvbGQgSnBhRmlsZT8KLQkJCXRoaXMucmVnaXN0ZXJSb290U3RydWN0dXJlTm9kZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBlcnNpc3RlbmNlICoqKioqKioqKioKLQotCXB1YmxpYyBQZXJzaXN0ZW5jZSBnZXRQZXJzaXN0ZW5jZSgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGVyc2lzdGVuY2UoUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UpIHsKLQkJUGVyc2lzdGVuY2Ugb2xkID0gdGhpcy5wZXJzaXN0ZW5jZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEVSU0lTVEVOQ0VfUFJPUEVSVFksIG9sZCwgcGVyc2lzdGVuY2UpOwotCX0KLQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBidWlsZFBlcnNpc3RlbmNlKFhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkUGVyc2lzdGVuY2UodGhpcywgeG1sUGVyc2lzdGVuY2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGNoZWNrWG1sUmVzb3VyY2UoSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmICggISByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpLmlzS2luZE9mKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRlbnQgdHlwZSBpcyBub3QgJ3BlcnNpc3RlbmNlJzogIiArIHJlc291cmNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEpwYVhtbFJlc291cmNlIGdldFhtbFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy54bWxSZXNvdXJjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy54bWxSZXNvdXJjZS5nZXRGaWxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbFJlc291cmNlLmdldFJlc291cmNlVHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBKcGFGaWxlIGdldEpwYUZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZpbGUodGhpcy54bWxSZXNvdXJjZS5nZXRGaWxlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZU1ldGFtb2RlbCgpIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2UgIT0gbnVsbCkgewotCQkJKChQZXJzaXN0ZW5jZTJfMCkgdGhpcy5wZXJzaXN0ZW5jZSkuaW5pdGlhbGl6ZU1ldGFtb2RlbCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoKSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlICE9IG51bGwpIHsKLQkJCSgoUGVyc2lzdGVuY2UyXzApIHRoaXMucGVyc2lzdGVuY2UpLnN5bmNocm9uaXplTWV0YW1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlTWV0YW1vZGVsKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZSAhPSBudWxsKSB7Ci0JCQkoKFBlcnNpc3RlbmNlMl8wKSB0aGlzLnBlcnNpc3RlbmNlKS5kaXNwb3NlTWV0YW1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkvLyBpc24ndCBhY3R1YWxseSBkaXNwbGF5ZWQsIHNvIG5lZWRzIG5vIGRldGFpbHMgcGFnZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTdHJ1Y3R1cmVOb2RlKGludCB0ZXh0T2Zmc2V0KSB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlLmNvbnRhaW5zT2Zmc2V0KHRleHRPZmZzZXQpKSB7Ci0JCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZS5nZXRTdHJ1Y3R1cmVOb2RlKHRleHRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8vIG5ldmVyIGFjdHVhbGx5IHNlbGVjdGVkCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZSAhPSBudWxsKSB7Ci0JCQlKcGFGaWxlIGpwYUZpbGUgPSB0aGlzLmdldEpwYUZpbGUoKTsKLQkJCWlmIChqcGFGaWxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnVucmVnaXN0ZXJSb290U3RydWN0dXJlTm9kZSgpOwotCQkJfQotCQkJdGhpcy5wZXJzaXN0ZW5jZS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvLyBUT0RPIGhvbGQgdGhlIEpwYUZpbGU/Ci0JcHJvdGVjdGVkIHZvaWQgcmVnaXN0ZXJSb290U3RydWN0dXJlTm9kZSgpIHsKLQkJdGhpcy5nZXRKcGFGaWxlKCkuYWRkUm9vdFN0cnVjdHVyZU5vZGUodGhpcy54bWxSZXNvdXJjZSwgdGhpcy5wZXJzaXN0ZW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdW5yZWdpc3RlclJvb3RTdHJ1Y3R1cmVOb2RlKCkgewotCQl0aGlzLmdldEpwYUZpbGUoKS5yZW1vdmVSb290U3RydWN0dXJlTm9kZSh0aGlzLnhtbFJlc291cmNlLCB0aGlzLnBlcnNpc3RlbmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0KLQkJaWYgKHRoaXMucGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVCwKLQkJCQkJdGhpcwotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLnBlcnNpc3RlbmNlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQkvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRpcmUgZmlsZSwgcG9pbnQgdG8gdGhlIHRvcCBvZiB0aGUgZmlsZQotCQlyZXR1cm4gVGV4dFJhbmdlLkVtcHR5Lmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZDlhMjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyaWNQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgRUZhY3RvcnkgZ2V0UmVzb3VyY2VOb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5IGJ1aWxkQ29udGV4dE5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9JbXBsaWVkTWFwcGluZ0ZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvY29udGV4dC9wZXJzaXN0ZW5jZS9JbXBsaWVkTWFwcGluZ0ZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNhMzY1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL2NvbnRleHQvcGVyc2lzdGVuY2UvSW1wbGllZE1hcHBpbmdGaWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci0KLS8qKgotICogVXNlZCBieSB0aGUgcGVyc2lzdGVuY2UgdW5pdCBmb3IgdGhlCi0gKiA8Y29kZT5NRVRBLUlORi9vcm0ueG1sPC9jb2RlPiBmaWxlIHdoZW4gaXQgaXMgbm90IGV4cGxpY2l0bHkgbGlzdGVkCi0gKiBpbiB0aGUgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgSW1wbGllZE1hcHBpbmdGaWxlUmVmCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdGaWxlUmVmCi17Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbi9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSW1wbGllZE1hcHBpbmdGaWxlUmVmKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQsIFN0cmluZyBmaWxlTmFtZSkgewotCQlzdXBlcihwYXJlbnQsIGZpbGVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWFwcGluZ0ZpbGVSZWYgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFhtbE1hcHBpbmdGaWxlUmVmIGdldFhtbE1hcHBpbmdGaWxlUmVmKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxpZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBzZXQgYW4gaW1wbGllZCBtYXBwaW5nIGZpbGUgcmVmJ3MgJ2ZpbGVOYW1lJzogIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSnBhU3RydWN0dXJlTm9kZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhtbENvbnRleHROb2RlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8RGVsZXRlRWRpdD4gY3JlYXRlRGVsZXRlTWFwcGluZ0ZpbGVFZGl0cyhJRmlsZSBmaWxlKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgcmVmZXJlbmNlIGNhbm5vdCBiZSBkZWxldGVkIC0gaXQgaXMgaW1wbGllZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVSZW5hbWVGb2xkZXJFZGl0cyhJRm9sZGVyIG9yaWdpbmFsRm9sZGVyLCBTdHJpbmcgbmV3TmFtZSkgewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHJlZmVyZW5jZSBjYW5ub3QgYmUgbW92ZWQgLSBpdCBpcyBpbXBsaWVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRWRpdChJRmlsZSBvcmlnaW5hbEZpbGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVJlcGxhY2VFZGl0KHRoaXMuZmlsZU5hbWUuc3Vic3RyaW5nKDAsIHRoaXMuZmlsZU5hbWUubGFzdEluZGV4T2YoJy8nKSArIDEpICsgbmV3TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZU1vdmVFZGl0KElGaWxlIG9yaWdpbmFsRmlsZSwgSVBhdGggcnVudGltZURlc3RpbmF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVJlcGxhY2VFZGl0KHJ1bnRpbWVEZXN0aW5hdGlvbi5hcHBlbmQob3JpZ2luYWxGaWxlLmdldE5hbWUoKSkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlcGxhY2VFZGl0KFN0cmluZyBuZXdNYXBwaW5nRmlsZU5hbWUpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChTdHJpbmdUb29scy5DUik7Ci0JCXNiLmFwcGVuZCgiXHRcdDxtYXBwaW5nLWZpbGU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKG5ld01hcHBpbmdGaWxlTmFtZSk7Ci0JCXNiLmFwcGVuZCgiPC9tYXBwaW5nLWZpbGU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IG9mZnNldCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZmluZEluc2VydExvY2F0aW9uRm9yTWFwcGluZ0ZpbGVSZWYoKTsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIDAsIHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTW92ZUZvbGRlckVkaXRzKElGb2xkZXIgb3JpZ2luYWxGb2xkZXIsIElQYXRoIHJ1bnRpbWVEZXN0aW5hdGlvbikgewotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHJlZmVyZW5jZSBjYW5ub3QgYmUgbW92ZWQgLSBpdCBpcyBpbXBsaWVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTNiMDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZFF1ZXJ5MV8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZFF1ZXJ5MV8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGJkOTExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRRdWVyeTFfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkUXVlcnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU5hbWVkUXVlcnkxXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlOYW1lZFF1ZXJ5QW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeU5hbWVkUXVlcnkxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNzljNGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuU2VxdWVuY2VHZW5lcmF0b3IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMV8wQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODc4NjdlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KLXsKLQkKLQlwdWJsaWMgc3RhdGljIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uIGJ1aWxkU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQotCQlyZXR1cm4gbmV3IFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uIGJ1aWxkU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJYW5ub3RhdGVkRWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24gYnVpbGROZXN0ZWRTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCwgaWRhYSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCi0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgZGFhKSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMV8wQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0KLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGlkYWEsIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGlkYWEpKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUxXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWRRdWVyeTFfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTEvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWRRdWVyeTFfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlMGI2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkUXVlcnkxXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5PC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlTmFtZWRRdWVyeTFfMEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBTb3VyY2VOYW1lZFF1ZXJ5MV8wQW5ub3RhdGlvbiBidWlsZFNvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROYW1lZFF1ZXJ5RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBidWlsZE5hbWVkUXVlcnlBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZFF1ZXJ5MV8wQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWFubm90YXRlZEVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZU5hbWVkUXVlcnkxXzBBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMV8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMS9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljYzNiNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGExL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMV8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlU2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQotCXB1YmxpYyBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDhlZmYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLkNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb247Ci0KLS8qKgotICogU3VwcG9ydCBmb3IgZXhpc3RpbmcgSlBBIDEuMCBhbm5vdGF0aW9ucywgbmV3IEpQQSAyLjAgYW5ub3RhdGlvbnMsIGFuZAotICogYXVnbWVudGVkIHN1cHBvcnQgZm9yIGFubm90YXRpb25zIGNoYW5nZWQgZnJvbSAxLjAgdG8gMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8QW5ub3RhdGlvbkRlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIEFOTk9UQVRJT05fREVGSU5JVElPTlMpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb25bXSBBTk5PVEFUSU9OX0RFRklOSVRJT05TID0gbmV3IEFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlBdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUFjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVudGl0eUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUlkQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlMb2JBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU1hcHNJZDJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU1hcEtleUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU1hcEtleUpvaW5Db2x1bW5zMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlOYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlOYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVNlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCVRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8TmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gTkVTVEFCTEVfQU5OT1RBVElPTl9ERUZJTklUSU9OUyA9IG5ldyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uW10gewotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmluc3RhbmNlKCksCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYVBsYXRmb3JtRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDdiMDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuSlBRTEdyYW1tYXIyXzA7Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgR2VuZXJpYzJfMEpwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCXRoaXMuYnVpbGRKcGFWZXJzaW9uKCksCi0JCQluZXcgR2VuZXJpY0pwYUZhY3RvcnkyXzAoKSwKLQkJCW5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIoR2VuZXJpYzJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSksCi0JCQlHZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJdGhpcy5idWlsZEpwYVBsYXRmb3JtVmFyaWF0aW9uKCksCi0JCQlKUFFMR3JhbW1hcjJfMC5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVZlcnNpb24oSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCS8vdGFibGVfcGVyX2NsYXNzIGluaGVyaXRhbmNlIHN1cHBvcnQgaXMgb3B0aW9uYWwgaW4gdGhlIDIuMCBzcGVjCi0JCQlwdWJsaWMgU3VwcG9ydGVkIGdldFRhYmxlUGVyQ29uY3JldGVDbGFzc0luaGVyaXRhbmNlSXNTdXBwb3J0ZWQoKSB7Ci0JCQkJcmV0dXJuIFN1cHBvcnRlZC5NQVlCRTsKLQkJCX0KLQkJCXB1YmxpYyBib29sZWFuIGlzSm9pblRhYmxlT3ZlcnJpZGFibGUoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgQWNjZXNzVHlwZVtdIGdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlyZXR1cm4gR0VORVJJQ19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMzg0N2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5SZXNvdXJjZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLk9ybVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbnRpdHlEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1Qcm92aWRlciBJTlNUQU5DRSA9IG5ldyBHZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljMl8wSnBhUGxhdGZvcm1Qcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgbW9kZWxzICoqKioqKioqKioKLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFSX0NPTlRFTlRfVFlQRSkpIHsKLQkJCXJldHVybiBKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjb250ZW50VHlwZS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlTW9kZWxQcm92aWRlcnNUbyhBcnJheUxpc3Q8SnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChwcm92aWRlcnMsIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyk7Ci0JfQotCi0JLy8gb3JkZXIgc2hvdWxkIG5vdCBiZSBpbXBvcnRhbnQgaGVyZQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSnBhUmVzb3VyY2VNb2RlbFByb3ZpZGVyW10gUkVTT1VSQ0VfTU9ERUxfUFJPVklERVJTID0gbmV3IEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIHsKLQkJSmF2YVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpLAotCQlKYXJSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgdHlwZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBKQVZBX1RZUEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uW10gSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMgPSBuZXcgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIHsKLQkJSmF2YUVudGl0eURlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBERUZBVUxUX0pBVkFfQVRUUklCVVRFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IHRoZSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKEVjbGlwc2VMaW5rKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpCi0JfTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5pbnN0YW5jZSgpLAotCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKSwKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCksCi0JCUphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCkKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIGRlZmluaXRpb25zICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFJlc291cmNlRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8UmVzb3VyY2VEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBSRVNPVVJDRV9ERUZJTklUSU9OUyk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZXNvdXJjZURlZmluaXRpb25bXSBSRVNPVVJDRV9ERUZJTklUSU9OUyA9IG5ldyBSZXNvdXJjZURlZmluaXRpb25bXSB7Ci0JCUdlbmVyaWNQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmljT3JtWG1sMl8wRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpY0pwYURhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpY0pwYURhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1ZGNmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNKcGFEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFEYXRhU291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotCi0vKioKLSAqIENvbnZlcnNpb25zIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSA8Y29kZT5kZWxpbWl0ZWQtaWRlbnRpZmllcnM8L2NvZGU+Ci0gKiBmbGFnIGluIDxjb2RlPm9ybS54bWw8L2NvZGU+LgotICogPHA+Ci0gKiBBc3N1bWUgd2UgYXJlIGluIGEgSlBBIDIuMC1jb21wYXRpYmxlIHByb2plY3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcgotCWltcGxlbWVudHMgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcgotewotCXByaXZhdGUgZmluYWwgSnBhRGF0YVNvdXJjZSBkYXRhU291cmNlOwotCi0JcHVibGljIEdlbmVyaWNKcGFEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyKEpwYURhdGFTb3VyY2UgZGF0YVNvdXJjZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBmbGFnIGlzIHNldCwgImlkZW50aWZpZXJzIiBhcmUgdHJlYXRlZCBhcyAibmFtZXMiLgotCSAqLwotCSBwdWJsaWMgYm9vbGVhbiB0cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldERlZmF1bHREZWxpbWl0ZWRJZGVudGlmaWVycygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldERlZmF1bHREZWxpbWl0ZWRJZGVudGlmaWVycygpIHsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHB1ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcmV0dXJuIChwdSAhPSBudWxsKSAmJiBwdS5nZXREZWZhdWx0RGVsaW1pdGVkSWRlbnRpZmllcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0Ml8wIGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJUGVyc2lzdGVuY2UgcCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiB1bml0cyA9IHRoaXMuZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKTsKLQkJcmV0dXJuIChQZXJzaXN0ZW5jZVVuaXQyXzApICh1bml0cy5oYXNOZXh0KCkgPyB1bml0cy5uZXh0KCkgOiBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHB4bWwgPSB0aGlzLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCXJldHVybiAocHhtbCA9PSBudWxsKSA/IG51bGwgOiBweG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGdldFBlcnNpc3RlbmNlWG1sKCkgewotCQkvLyBUT0RPIHRoaXMgbnVsbCBjaGVjayBjYW4gYmUgcmVtb3ZlZCBpZiB0aGUgZGF0YSBzb3VyY2UgaXMgbW92ZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQ7Ci0JCS8vIHRoZSByb290IGNvbnRleHQgbm9kZSBjYW4gYmUgbnVsbCBkdXJpbmcgY29uc3RydWN0aW9uOwotCQkvLyB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0gc2luY2UgdGhlIGRlZmF1bHQtZGVsaW1pdGVycyBmbGFnCi0JCS8vIGlzIHJlY2FsY3VsYXRlZCBkdXJpbmcgdGhlIGluaXRpYWwsIHBvc3QtcHJvamVjdCBjb25zdHJ1Y3Rpb24sICJ1cGRhdGUiCi0JCUpwYVJvb3RDb250ZXh0Tm9kZSByY24gPSB0aGlzLmRhdGFTb3VyY2UuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpOwotCQlyZXR1cm4gKHJjbiA9PSBudWxsKSA/IG51bGwgOiByY24uZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCBCb29sZWFuLnZhbHVlT2YodGhpcy50cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpY0pwYUZhY3RvcnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpY0pwYUZhY3RvcnkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNkN2U5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNKcGFGYWN0b3J5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRGF0YVNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdC5Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuQWJzdHJhY3RKcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFDYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhRW1iZWRkYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU9ycGhhblJlbW92YWwyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuSnBhRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMC5Pd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotCi0KLS8qKgotICogQ2VudHJhbCBjbGFzcyB0aGF0IGFsbG93cyBleHRlbmRlcnMgdG8gZWFzaWx5IHJlcGxhY2UgaW1wbGVtZW50YXRpb25zIG9mCi0gKiB2YXJpb3VzIERhbGkgaW50ZXJmYWNlcy4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFGYWN0b3J5Ml8wCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYUZhY3RvcnkyXzAKLXsKLQotCXB1YmxpYyBHZW5lcmljSnBhRmFjdG9yeTJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29yZSBNb2RlbCAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoQ29uZmlnIGNvbmZpZykgewotCQlpZiAoICEgKGNvbmZpZyBpbnN0YW5jZW9mIEpwYVByb2plY3QyXzAuQ29uZmlnKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29uZmlnIG11c3QgYmUgMi4wLWNvbXBhdGlibGU6ICIgKyBjb25maWcpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cGVyLmJ1aWxkSnBhUHJvamVjdChjb25maWcpOwotCX0KLQotCXB1YmxpYyBNZXRhbW9kZWxTb3VyY2VUeXBlLlN5bmNocm9uaXplciBidWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcihNZXRhbW9kZWxTb3VyY2VUeXBlIHNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljTWV0YW1vZGVsU3luY2hyb25pemVyKHNvdXJjZVR5cGUpOwotCX0KLQotCXB1YmxpYyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGJ1aWxkRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcihKcGFEYXRhU291cmNlIGRhdGFTb3VyY2UpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlcihkYXRhU291cmNlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YSBDb250ZXh0IE1vZGVsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgYnVpbGRKYXZhUGVyc2lzdGVudFR5cGUoUGVyc2lzdGVudFR5cGUuT3duZXIgb3duZXIsIEphdmFSZXNvdXJjZVR5cGUganJ0KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMChvd25lciwganJ0KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVtYmVkZGFibGUgYnVpbGRKYXZhRW1iZWRkYWJsZShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbWJlZGRhYmxlQW5ub3RhdGlvbiBlbWJlZGRhYmxlQW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhRW1iZWRkYWJsZTJfMChwYXJlbnQsIGVtYmVkZGFibGVBbm5vdGF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yIGJ1aWxkSmF2YVNlcXVlbmNlR2VuZXJhdG9yKEphdmFKcGFDb250ZXh0Tm9kZSBwYXJlbnQsIFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMChwYXJlbnQsIChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIGFubm90YXRpb24pOwotCX0KLQotCS8vVGhlIDIuMCBKUEEgc3BlYyBzdXBwb3J0cyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgb24gYW4gZW1iZWRkZWQgbWFwcGluZyB3aGlsZSB0aGUgMS4wIHNwZWMgZGlkIG5vdAotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKEphdmFFbWJlZGRlZE1hcHBpbmcyXzAgcGFyZW50LCBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcihwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YURlcml2ZWRJZGVudGl0eTJfMCBidWlsZEphdmFEZXJpdmVkSWRlbnRpdHkoSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFEZXJpdmVkSWRlbnRpdHkyXzAocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBidWlsZEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNhY2hlYWJsZTJfMCBidWlsZEphdmFDYWNoZWFibGUoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUNhY2hlYWJsZTJfMChwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkSmF2YU9ycGhhblJlbW92YWwoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFOYW1lZFF1ZXJ5IGJ1aWxkSmF2YU5hbWVkUXVlcnkoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgTmFtZWRRdWVyeUFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTmFtZWRRdWVyeTJfMChwYXJlbnQsIChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIEphdmFDb2xsZWN0aW9uVGFibGUyXzAgYnVpbGRKYXZhQ29sbGVjdGlvblRhYmxlKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgcGFyZW50LCBUYWJsZS5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wKHBhcmVudCwgb3duZXIpOwotCX0KLQotCXB1YmxpYyBKYXZhT3JkZXJDb2x1bW4yXzAgYnVpbGRKYXZhT3JkZXJDb2x1bW4oSmF2YU9yZGVyYWJsZTJfMCBwYXJlbnQsIEphdmFSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlckNvbHVtbjJfMChwYXJlbnQsIG93bmVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUNvbHVtbiBidWlsZEphdmFNYXBLZXlDb2x1bW4oSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgSmF2YUNvbHVtbi5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhQ29sdW1uKHBhcmVudCwgb3duZXIpOwotCX0KLQotCXB1YmxpYyBKYXZhT3JkZXJhYmxlMl8wIGJ1aWxkSmF2YU9yZGVyYWJsZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0phdmFPcmRlcmFibGUocGFyZW50LCBvd25lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPcmRlcmFibGUgYnVpbGRKYXZhT3JkZXJhYmxlKEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNNZXRhbW9kZWxTeW5jaHJvbml6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2QyZGYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuQm9keVNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ2xhc3NOYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuSnBhUHJvamVjdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NZXRhbW9kZWxTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxTb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuR2VuZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuRGF0ZUZvcm1hdDsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci0KLS8qKgotICogRm9yIG5vdywgdGhlICJzeW5jaHJvbml6YXRpb24iIGlzIHNpbXBsZSBicnV0ZS1mb3JjZTogd2UgZ2VuZXJhdGUgdGhlIHNvdXJjZQotICogY29kZSBhbmQgdGhlbiBjb21wYXJlIGl0IHdpdGggd2hhdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIGZpbGUuCi0gKiBJZiB0aGUgbmV3IHNvdXJjZSBpcyBkaWZmZXJlbnQsIHdlIHJlcGxhY2UgdGhlIGZpbGUgY29udGVudHM7IG90aGVyd2lzZSwgd2UKLSAqIGxlYXZlIHRoZSBmaWxlIHVuY2hhbmdlZC4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplcgotCWltcGxlbWVudHMgTWV0YW1vZGVsU291cmNlVHlwZS5TeW5jaHJvbml6ZXIKLXsKLQlwcm90ZWN0ZWQgZmluYWwgTWV0YW1vZGVsU291cmNlVHlwZSBzb3VyY2VUeXBlOwotCi0KLQlwdWJsaWMgR2VuZXJpY01ldGFtb2RlbFN5bmNocm9uaXplcihNZXRhbW9kZWxTb3VyY2VUeXBlIHNvdXJjZVR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zb3VyY2VUeXBlID0gc291cmNlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIChJRmlsZSkgdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRDb21waWxhdGlvblVuaXQodGhpcy5nZXRGaWxlTmFtZSgpKS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZShNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSkgewotCQl0cnkgewotCQkJdGhpcy5zeW5jaHJvbml6ZV8obWVtYmVyVHlwZVRyZWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplXyhNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGtnID0gdGhpcy5nZXRQYWNrYWdlRnJhZ21lbnQoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gdGhpcy5nZXRGaWxlTmFtZSgpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gcGtnLmdldENvbXBpbGF0aW9uVW5pdChmaWxlTmFtZSk7Ci0JCWlmIChjb21waWxhdGlvblVuaXQuZXhpc3RzKCkpIHsKLQkJCS8vIG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlIGlmIGl0IGhhcyBjaGFuZ2VkIChpZ25vcmluZyB0aGUgdGltZXN0YW1wKQotCQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRoaXMuYnVpbGRTb3VyY2UoY29tcGlsYXRpb25Vbml0LCBtZW1iZXJUeXBlVHJlZSk7Ci0JCQlpZiAobmV3U291cmNlICE9IG51bGwpIHsKLQkJCQlwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZpbGVOYW1lLCBuZXdTb3VyY2UsIHRydWUsIG51bGwpOyAgLy8gdHJ1ZT1mb3JjZQotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gd3JpdGUgYSBuZXcgZmlsZSwgY3JlYXRpbmcgdGhlIHBhY2thZ2UgZm9sZGVycyBpZiBuZWNlc3NhcnkKLQkJCWlmICggISBwa2cuZXhpc3RzKCkpIHsKLQkJCQl0aGlzLmdldFNvdXJjZUZvbGRlcigpLmNyZWF0ZVBhY2thZ2VGcmFnbWVudChwa2cuZ2V0RWxlbWVudE5hbWUoKSwgdHJ1ZSwgbnVsbCk7ICAvLyB0cnVlPWZvcmNlCi0JCQl9Ci0JCQlwa2cuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGZpbGVOYW1lLCB0aGlzLmJ1aWxkU291cmNlKG1lbWJlclR5cGVUcmVlKSwgZmFsc2UsIG51bGwpOyAgLy8gZmFsc2U9bm8gZm9yY2UKLQkJfQotCX0KLQotCS8qKgotCSAqIHByZS1jb25kaXRpb246IHRoZSBjb21waWxhdGlvbiB1bml0IGV4aXN0cwotCSAqIAotCSAqIHJldHVybiBudWxsIGlmIHRoZSBvbGQgc291cmNlIGlzIG5vdCB0byBiZSByZXBsYWNlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjb21waWxhdGlvblVuaXQsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgY29tcGlsYXRpb25Vbml0LmdldFJlc291cmNlKCk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBnZW5UeXBlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0R2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlKGZpbGUpOwotCQlpZiAoZ2VuVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIHRoZSBmaWxlIGV4aXN0cywgYnV0IGl0cyBzb3VyY2UgaXMgbm90IGEgZ2VuZXJhdGVkIG1ldGFtb2RlbCB0b3AtbGV2ZWwgY2xhc3MKLQkJfQotCi0JCVN0cmluZyBvbGRTb3VyY2UgPSBjb21waWxhdGlvblVuaXQuZ2V0U291cmNlKCk7Ci0JCWludCBvbGRMZW5ndGggPSBvbGRTb3VyY2UubGVuZ3RoKCk7Ci0KLQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRoaXMuYnVpbGRTb3VyY2UobWVtYmVyVHlwZVRyZWUpOwotCQlpbnQgbmV3TGVuZ3RoID0gbmV3U291cmNlLmxlbmd0aCgpOwotCQlpZiAobmV3TGVuZ3RoICE9IG9sZExlbmd0aCkgewotCQkJcmV0dXJuIG5ld1NvdXJjZTsKLQkJfQotCi0JCVN0cmluZyBkYXRlID0gKChHZW5lcmF0ZWRBbm5vdGF0aW9uKSBnZW5UeXBlLmdldEFubm90YXRpb24oR2VuZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXREYXRlKCk7ICAvLyBpZiB3ZSBnZXQgaGVyZSwgdGhpcyB3aWxsIGJlIG5vbi1lbXB0eQotCQlpbnQgZGF0ZUJlZ2luID0gb2xkU291cmNlLmluZGV4T2YoZGF0ZSk7Ci0JCWlmIChkYXRlQmVnaW4gPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gaG1tbS4uLgotCQl9Ci0JCWludCBkYXRlRW5kID0gZGF0ZUJlZ2luICsgZGF0ZS5sZW5ndGgoKTsKLQkJaWYgKGRhdGVFbmQgPiBvbGRMZW5ndGgpIHsKLQkJCXJldHVybiBudWxsOyAgLy8gaG1tbS4uLgotCQl9Ci0KLQkJaWYgKG5ld1NvdXJjZS5yZWdpb25NYXRjaGVzKDAsIG9sZFNvdXJjZSwgMCwgZGF0ZUJlZ2luKSAmJgotCQkJCQluZXdTb3VyY2UucmVnaW9uTWF0Y2hlcyhkYXRlRW5kLCBvbGRTb3VyY2UsIGRhdGVFbmQsIG9sZExlbmd0aCAtIGRhdGVFbmQpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbmV3U291cmNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlL2ZpbGUgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIElQYWNrYWdlRnJhZ21lbnQgZ2V0UGFja2FnZUZyYWdtZW50KCkgewotCQlyZXR1cm4gdGhpcy5nZXRTb3VyY2VGb2xkZXIoKS5nZXRQYWNrYWdlRnJhZ21lbnQodGhpcy5nZXRQYWNrYWdlTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0U291cmNlRm9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWV0YW1vZGVsUGFja2FnZUZyYWdtZW50Um9vdCgpOwotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0Ml8wIGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoSnBhUHJvamVjdDJfMCkgdGhpcy5zb3VyY2VUeXBlLmdldEpwYVByb2plY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBhY2thZ2VOYW1lKHRoaXMuc291cmNlVHlwZS5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRQYWNrYWdlTmFtZShTdHJpbmcgdG9wTGV2ZWxTb3VyY2VUeXBlTmFtZSkgewotCQlyZXR1cm4gdGhpcy5idWlsZFBhY2thZ2VOYW1lXyhDbGFzc05hbWUuZ2V0UGFja2FnZU5hbWUodG9wTGV2ZWxTb3VyY2VUeXBlTmFtZSkpOwotCX0KLQotCS8vIFRPRE8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkUGFja2FnZU5hbWVfKFN0cmluZyBzb3VyY2VQYWNrYWdlTmFtZSkgewotCQkvLyB0aGUgZGVmYXVsdCBpcyB0byBzdG9yZSB0aGUgbWV0YW1vZGVsIGNsYXNzIGluIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHNvdXJjZSB0eXBlCi0JCXJldHVybiBzb3VyY2VQYWNrYWdlTmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVOYW1lKCkgewotCQlyZXR1cm4gQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUodGhpcy5nZXRDbGFzc05hbWUoKSkgKyAiLmphdmEiOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENsYXNzTmFtZSh0aGlzLnNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQ2xhc3NOYW1lKE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQ2xhc3NOYW1lKHRoaXMuc291cmNlVHlwZS5nZXROYW1lKCksIG1lbWJlclR5cGVUcmVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQ2xhc3NOYW1lKFN0cmluZyBzb3VyY2VUeXBlTmFtZSwgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUpIHsKLQkJU3RyaW5nIGN1cnJlbnQgPSBzb3VyY2VUeXBlTmFtZTsKLQkJU2ltcGxlU3RhY2s8U3RyaW5nPiBzdGFjayA9IG5ldyBTaW1wbGVTdGFjazxTdHJpbmc+KCk7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCXN0YWNrLnB1c2goQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUoY3VycmVudCkpOwotCQkJU3RyaW5nIGRlY2xhcmluZ1R5cGVOYW1lID0gdGhpcy5nZXREZWNsYXJpbmdUeXBlTmFtZShjdXJyZW50LCBtZW1iZXJUeXBlVHJlZSk7Ci0JCQlpZiAoZGVjbGFyaW5nVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJY3VycmVudCA9IGRlY2xhcmluZ1R5cGVOYW1lOwotCQl9Ci0KLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHNvdXJjZVR5cGVOYW1lLmxlbmd0aCgpICsgMTApOwotCQlzYi5hcHBlbmQodGhpcy5idWlsZFBhY2thZ2VOYW1lKGN1cnJlbnQpKTsKLQkJd2hpbGUgKCAhIHN0YWNrLmlzRW1wdHkoKSkgewotCQkJc2IuYXBwZW5kKCcuJyk7Ci0JCQlzYi5hcHBlbmQodGhpcy5idWlsZFNpbXBsZUNsYXNzTmFtZShzdGFjay5wb3AoKSkpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRDbGFzc05hbWUoU3RyaW5nIHRvcExldmVsU291cmNlVHlwZU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRQYWNrYWdlTmFtZSh0b3BMZXZlbFNvdXJjZVR5cGVOYW1lKSArICcuJyArIHRoaXMuYnVpbGRTaW1wbGVDbGFzc05hbWUoQ2xhc3NOYW1lLmdldFNpbXBsZU5hbWUodG9wTGV2ZWxTb3VyY2VUeXBlTmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2ltcGxlQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFNpbXBsZUNsYXNzTmFtZShDbGFzc05hbWUuZ2V0U2ltcGxlTmFtZSh0aGlzLnNvdXJjZVR5cGUuZ2V0TmFtZSgpKSk7Ci0JfQotCi0JLy8gVE9ETwotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTaW1wbGVDbGFzc05hbWUoU3RyaW5nIHNpbXBsZVNvdXJjZVR5cGVOYW1lKSB7Ci0JCS8vIHRoZSBkZWZhdWx0IGlzIHRvIHNpbXBseSBhcHBlbmQgYW4gdW5kZXJzY29yZSB0byB0aGUgc291cmNlIHR5cGUgbmFtZQotCQlyZXR1cm4gc2ltcGxlU291cmNlVHlwZU5hbWUgKyAnXyc7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNvdXJjZSBjb2RlICoqKioqKioqKioKLQotCS8qKgotCSAqIGJ1aWxkIHRoZSAiYm9keSIgc291cmNlIGZpcnN0OyB0aGVuIGJ1aWxkIHRoZSAicGFja2FnZSIgYW5kICJpbXBvcnRzIiBzb3VyY2UKLQkgKiBhbmQgY29uY2F0ZW5hdGUgdGhlICJib2R5IiBzb3VyY2UgdG8gaXQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU291cmNlKE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB7Ci0JCS8vIGJ1aWxkIHRoZSBib2R5IHNvdXJjZSBmaXJzdCBzbyB3ZSBjYW4gZ2F0aGVyIHVwIHRoZSBpbXBvcnQgc3RhdGVtZW50cwotCQlCb2R5U291cmNlV3JpdGVyIGJvZHlTb3VyY2VXcml0ZXIgPSB0aGlzLmJ1aWxkQm9keVNvdXJjZVdyaXRlcihtZW1iZXJUeXBlVHJlZSk7Ci0KLQkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcihib2R5U291cmNlV3JpdGVyLmdldExlbmd0aCgpICsgMjAwMCk7Ci0JCVByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKHN3KTsKLQkJdGhpcy5wcmludFBhY2thZ2VBbmRJbXBvcnRzT24ocHcsIGJvZHlTb3VyY2VXcml0ZXIpOwotCQlwdy5wcmludChib2R5U291cmNlV3JpdGVyLmdldFNvdXJjZSgpKTsKLQkJcmV0dXJuIHN3LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvZHlTb3VyY2VXcml0ZXIgYnVpbGRCb2R5U291cmNlV3JpdGVyKE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB7Ci0JCUJvZHlTb3VyY2VXcml0ZXIgcHcgPSBuZXcgQm9keVNvdXJjZVdyaXRlcih0aGlzLmdldFBhY2thZ2VOYW1lKCksIHRoaXMuZ2V0Q2xhc3NOYW1lKCkpOwotCQl0aGlzLnByaW50Qm9keVNvdXJjZU9uKHB3LCBtZW1iZXJUeXBlVHJlZSk7Ci0JCXJldHVybiBwdzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludEJvZHlTb3VyY2VPbihCb2R5U291cmNlV3JpdGVyIHB3LCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSkgewotCQl0aGlzLnByaW50Q2xhc3NEZWNsYXJhdGlvbk9uKHB3LCBtZW1iZXJUeXBlVHJlZSk7Ci0JCXB3LnByaW50KCIgeyIpOwotCQlwdy5wcmludGxuKCk7Ci0KLQkJcHcuaW5kZW50KCk7Ci0JCQlib29sZWFuIGF0dHJpYnV0ZXNQcmludGVkID0gdGhpcy5wcmludEF0dHJpYnV0ZXNPbihwdyk7Ci0JCQl0aGlzLnByaW50TWVtYmVyVHlwZXNPbihwdywgbWVtYmVyVHlwZVRyZWUsIGF0dHJpYnV0ZXNQcmludGVkKTsKLQkJcHcudW5kZW50KCk7Ci0KLQkJcHcucHJpbnQoJ30nKTsKLQkJcHcucHJpbnRsbigpOyAgLy8gRU9GCi0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsYXNzIGRlY2xhcmF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHByaW50Q2xhc3NEZWNsYXJhdGlvbk9uKEJvZHlTb3VyY2VXcml0ZXIgcHcsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB7Ci0JCWJvb2xlYW4gdG9wTGV2ZWwgPSB0aGlzLnNvdXJjZVR5cGVJc1RvcExldmVsKG1lbWJlclR5cGVUcmVlKTsKLQkJaWYgKHRvcExldmVsKSB7Ci0JCQl0aGlzLnByaW50R2VuZXJhdGVkQW5ub3RhdGlvbk9uKHB3KTsKLQkJfQotCQlpZiAodGhpcy5zb3VyY2VUeXBlLmlzTWFuYWdlZCgpKSB7Ci0JCQl0aGlzLnByaW50U3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbk9uKHB3KTsKLQkJfQotCi0JCXB3LnByaW50KCJwdWJsaWMgIik7Ci0JCWlmICggISB0b3BMZXZlbCkgewotCQkJcHcucHJpbnQoInN0YXRpYyAiKTsKLQkJfQotCQlwdy5wcmludCgiY2xhc3MgIik7Ci0JCXB3LnByaW50KHRoaXMuZ2V0U2ltcGxlQ2xhc3NOYW1lKCkpOyAgLy8gdGhpcyBpcyBhbHdheXMgdGhlIHNpbXBsZSBuYW1lCi0JCVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSB0aGlzLnNvdXJjZVR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQlpZiAoc3VwZXJQZXJzaXN0ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlwdy5wcmludCgiIGV4dGVuZHMgIik7Ci0JCQlwdy5wcmludFR5cGVEZWNsYXJhdGlvbih0aGlzLmJ1aWxkQ2xhc3NOYW1lKHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpLCBtZW1iZXJUeXBlVHJlZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNvdXJjZSB0eXBlIGlzIGEgdG9wIGxldmVsIHR5cGUuCi0JICogVGhpcyBjYW4gYmUgaW5mZXJyZWQgZnJvbSB0aGUgc3BlY2lmaWVkIG1lbWJlciB0eXBlIHRyZWUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc291cmNlVHlwZUlzVG9wTGV2ZWwoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUpIHsKLQkJcmV0dXJuIHRoaXMuc291cmNlVHlwZUlzVG9wTGV2ZWwodGhpcy5zb3VyY2VUeXBlLmdldE5hbWUoKSwgbWVtYmVyVHlwZVRyZWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgc291cmNlIHR5cGUgaXMgYSB0b3AgbGV2ZWwgdHlwZS4KLQkgKiBUaGlzIGNhbiBiZSBpbmZlcnJlZCBmcm9tIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHR5cGUgdHJlZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzb3VyY2VUeXBlSXNUb3BMZXZlbChTdHJpbmcgc291cmNlVHlwZU5hbWUsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKSB7Ci0JCXJldHVybiB0aGlzLmdldERlY2xhcmluZ1R5cGVOYW1lKHNvdXJjZVR5cGVOYW1lLCBtZW1iZXJUeXBlVHJlZSkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmllZCBzb3VyY2UgdHlwZSdzIGRlY2xhcmluZyB0eXBlLCBhcwotCSAqIGltcGxpZWQgYnkgdGhlIHNwZWNpZmllZCBtZW1iZXIgdHlwZSB0cmVlLiBSZXR1cm4gbnVsbCBpZiB0aGUgc291cmNlCi0JICogdHlwZSBpcyBhIHRvcC1sZXZlbCB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVjbGFyaW5nVHlwZU5hbWUoU3RyaW5nIHNvdXJjZVR5cGVOYW1lLCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSkgewotCQlpbnQgbGFzdFBlcmlvZCA9IHNvdXJjZVR5cGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0UGVyaW9kID09IC0xKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIGRlZmF1bHQgcGFja2FnZSB0b3AtbGV2ZWwgdHlwZQotCQl9Ci0JCVN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZSA9IHNvdXJjZVR5cGVOYW1lLnN1YnN0cmluZygwLCBsYXN0UGVyaW9kKTsKLQkJcmV0dXJuIChtZW1iZXJUeXBlVHJlZS5nZXQoZGVjbGFyaW5nVHlwZU5hbWUpID09IG51bGwpID8gbnVsbCA6IGRlY2xhcmluZ1R5cGVOYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50R2VuZXJhdGVkQW5ub3RhdGlvbk9uKEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKCJqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZCIpOwotCQlwdy5wcmludCgnKCcpOwotCQlwdy5wcmludCgidmFsdWU9Iik7Ci0JCXB3LnByaW50U3RyaW5nTGl0ZXJhbChNZXRhbW9kZWxTeW5jaHJvbml6ZXIuTUVUQU1PREVMX0dFTkVSQVRFRF9BTk5PVEFUSU9OX1ZBTFVFKTsKLQkJcHcucHJpbnQoIiwgIik7Ci0JCXB3LnByaW50KCJkYXRlPSIpOwotCQlwdy5wcmludFN0cmluZ0xpdGVyYWwoZm9ybWF0KG5ldyBEYXRlKCkpKTsKLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50U3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbk9uKEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJcHcucHJpbnRBbm5vdGF0aW9uKEpQQTJfMC5TVEFUSUNfTUVUQU1PREVMKTsKLQkJcHcucHJpbnQoJygnKTsKLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24odGhpcy5zb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIuY2xhc3MiKTsKLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCS8qKgotCSAqIHtAbGluayBTaW1wbGVEYXRlRm9ybWF0fSBpcyBub3QgdGhyZWFkLXNhZmUuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGZvcm1hdChEYXRlIGRhdGUpIHsKLQkJcmV0dXJuIERBVEVfRk9STUFULmZvcm1hdChkYXRlKTsKLQl9Ci0JLyoqCi0JICogUmVjb21tZW5kZWQgZGF0ZSBmb3JtYXQgaXMgSVNPIDg2MDEuCi0JICogU2VlIGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGF0ZUZvcm1hdCBEQVRFX0ZPUk1BVCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5LU1NLWRkJ1QnSEg6bW06c3MuU1NTWiIpOwotCi0KLQkvLyAqKioqKioqKioqIGF0dHJpYnV0ZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgYW55IGF0dHJpYnV0ZXMgd2VyZSBwcmludGVkLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHByaW50QXR0cmlidXRlc09uKEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJYm9vbGVhbiBwcmludGVkID0gZmFsc2U7Ci0JCWZvciAoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dCA6IHRoaXMuc291cmNlVHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCXRoaXMucHJpbnRBdHRyaWJ1dGVPbihhdHQsIHB3KTsKLQkJCXByaW50ZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwcmludGVkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW50QXR0cmlidXRlT24oUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWlmIChhdHRyaWJ1dGVNYXBwaW5nICE9IG51bGwpIHsgIC8vIHByb2JhYmx5IHNob3VsZG4ndCBiZSBudWxsPwotCQkJdGhpcy5wcmludEF0dHJpYnV0ZU1hcHBpbmdPbihhdHRyaWJ1dGVNYXBwaW5nLCBwdyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmludEF0dHJpYnV0ZU1hcHBpbmdPbihBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcsIEJvZHlTb3VyY2VXcml0ZXIgcHcpIHsKLQkJTWV0YW1vZGVsRmllbGQgZmllbGQgPSAoKEF0dHJpYnV0ZU1hcHBpbmcyXzApIGF0dHJpYnV0ZU1hcHBpbmcpLmdldE1ldGFtb2RlbEZpZWxkKCk7Ci0JCWlmIChmaWVsZCAhPSBudWxsKSB7Ci0JCQl0aGlzLnByaW50RmllbGRPbihmaWVsZCwgcHcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJpbnRGaWVsZE9uKE1ldGFtb2RlbEZpZWxkIGZpZWxkLCBCb2R5U291cmNlV3JpdGVyIHB3KSB7Ci0JCWZvciAoU3RyaW5nIG1vZGlmaWVyIDogZmllbGQuZ2V0TW9kaWZpZXJzKCkpIHsKLQkJCXB3LnByaW50KG1vZGlmaWVyKTsKLQkJCXB3LnByaW50KCcgJyk7Ci0JCX0KLQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oZmllbGQuZ2V0VHlwZU5hbWUoKSk7Ci0JCXB3LnByaW50KCc8Jyk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBmaWVsZC5nZXRUeXBlQXJndW1lbnROYW1lcygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcHcucHJpbnRUeXBlRGVjbGFyYXRpb24oc3RyZWFtLm5leHQoKSk7Ci0JCQlpZiAoc3RyZWFtLmhhc05leHQoKSkgewotCQkJCXB3LnByaW50KCIsICIpOwotCQkJfQotCQl9Ci0JCXB3LnByaW50KCc+Jyk7Ci0JCXB3LnByaW50KCcgJyk7Ci0JCXB3LnByaW50KGZpZWxkLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCc7Jyk7Ci0JCXB3LnByaW50bG4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWVtYmVyIHR5cGVzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHByaW50TWVtYmVyVHlwZXNPbihCb2R5U291cmNlV3JpdGVyIHB3LCBNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSwgYm9vbGVhbiBhdHRyaWJ1dGVzUHJpbnRlZCkgewotCQlDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+IG1lbWJlclR5cGVzID0gbWVtYmVyVHlwZVRyZWUuZ2V0KHRoaXMuc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlpZiAobWVtYmVyVHlwZXMgIT0gbnVsbCkgewotCQkJaWYgKGF0dHJpYnV0ZXNQcmludGVkKSB7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQkJZm9yIChJdGVyYXRvcjxNZXRhbW9kZWxTb3VyY2VUeXBlPiBzdHJlYW0gPSBtZW1iZXJUeXBlcy5pdGVyYXRvcigpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlzdHJlYW0ubmV4dCgpLnByaW50Qm9keVNvdXJjZU9uKHB3LCBtZW1iZXJUeXBlVHJlZSk7Ci0JCQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQkJcHcucHJpbnRsbigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwYWNrYWdlIGFuZCBpbXBvcnRzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHByaW50UGFja2FnZUFuZEltcG9ydHNPbihQcmludFdyaXRlciBwdywgQm9keVNvdXJjZVdyaXRlciBib2R5U291cmNlV3JpdGVyKSB7Ci0JCWlmICh0aGlzLmdldFBhY2thZ2VOYW1lKCkubGVuZ3RoKCkgIT0gMCkgewotCQkJcHcucHJpbnQoInBhY2thZ2UgIik7Ci0JCQlwdy5wcmludCh0aGlzLmdldFBhY2thZ2VOYW1lKCkpOwotCQkJcHcucHJpbnQoJzsnKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCi0JCWZvciAoU3RyaW5nIGltcG9ydF8gOiBib2R5U291cmNlV3JpdGVyLmdldEltcG9ydHMoKSkgewotCQkJcHcucHJpbnQoImltcG9ydCAiKTsKLQkJCXB3LnByaW50KGltcG9ydF8pOwotCQkJcHcucHJpbnQoJzsnKTsKLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCQlwdy5wcmludGxuKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5zb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvQ29sbGVjdGlvblRhYmxlVmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvQ29sbGVjdGlvblRhYmxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZTQ1MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L0NvbGxlY3Rpb25UYWJsZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BYnN0cmFjdFRhYmxlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLQotcHVibGljIGNsYXNzIENvbGxlY3Rpb25UYWJsZVZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3RUYWJsZVZhbGlkYXRvcgotewotCXB1YmxpYyBDb2xsZWN0aW9uVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIENvbGxlY3Rpb25UYWJsZTJfMCB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCB0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZENhdGFsb2dNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWRDYXRhbG9nTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVucmVzb2x2ZWRTY2hlbWFNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFNjaGVtYU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L01hcEtleUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9NYXBLZXlKb2luQ29sdW1uVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmNkNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L01hcEtleUpvaW5Db2x1bW5WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkJhc2VKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE1hcEtleUpvaW5Db2x1bW5WYWxpZGF0b3IKLQlleHRlbmRzIEJhc2VKb2luQ29sdW1uVmFsaWRhdG9yPFJlYWRPbmx5Sm9pbkNvbHVtbiwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyPgotewotCXByb3RlY3RlZCBNYXBLZXlKb2luQ29sdW1uVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sCi0JCQkJUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lciwKLQkJCQlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKGNvbHVtbiwgam9pbkNvbHVtbk93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCX0KLQotCXB1YmxpYyBNYXBLZXlKb2luQ29sdW1uVmFsaWRhdG9yKAotCQkJCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLAotCQkJCVJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sCi0JCQkJUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGpvaW5Db2x1bW5Pd25lciwKLQkJCQlKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGNvbHVtbiwgam9pbkNvbHVtbk93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgcHJvdmlkZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZVZhbGlkYXRvcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5yZXNvbHZlZE5hbWVNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZVVucmVzb2x2ZWROYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVucmVzb2x2ZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5yZXNvbHZlZFJlZmVyZW5jZWRDb2x1bW5OYW1lTWVzc2FnZSgpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuc3BlY2lmaWVkTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWROYW1lTXVsdGlwbGVKb2luQ29sdW1uc01lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlVW5zcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZU11bHRpcGxlSm9pbkNvbHVtbnNNZXNzYWdlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9NQVBfS0VZX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgdmFsaWRhdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBUYWJsZVZhbGlkYXRvcgotCQlleHRlbmRzIEJhc2VDb2x1bW5UYWJsZVZhbGlkYXRvcgotCXsKLQkJcHJvdGVjdGVkIFRhYmxlVmFsaWRhdG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtblRhYmxlTm90VmFsaWRNZXNzYWdlKCkgewotCQkJcmV0dXJuIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBfS0VZX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVDb2x1bW5UYWJsZU5vdFZhbGlkTWVzc2FnZSgpIHsKLQkJCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvT3JkZXJDb2x1bW5WYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9PcmRlckNvbHVtblZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzE0NTU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9PcmRlckNvbHVtblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFic3RyYWN0TmFtZWRDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci0KLXB1YmxpYyBjbGFzcyBPcmRlckNvbHVtblZhbGlkYXRvcgotCWV4dGVuZHMgQWJzdHJhY3ROYW1lZENvbHVtblZhbGlkYXRvcjxPcmRlckNvbHVtbjJfMCwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcj4KLXsKLQlwdWJsaWMgT3JkZXJDb2x1bW5WYWxpZGF0b3IoCi0JCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsCi0JCQkJT3JkZXJDb2x1bW4yXzAgY29sdW1uLAotCQkJCU5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudEF0dHJpYnV0ZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuT1JERVJfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZpcnR1YWxBdHRyaWJ1dGVVbnJlc29sdmVkTmFtZU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1JERVJfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvU2ltcGxlTWV0YW1vZGVsRmllbGQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9TaW1wbGVNZXRhbW9kZWxGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzIwYmZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9TaW1wbGVNZXRhbW9kZWxGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLQotLyoqCi0gKiBTdHJhaWdodGZvcndhcmQgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVNZXRhbW9kZWxGaWVsZAotCWltcGxlbWVudHMgTWV0YW1vZGVsRmllbGQKLXsKLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBtb2RpZmllcnM7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyB0eXBlTmFtZTsKLQlwcm90ZWN0ZWQgZmluYWwgSXRlcmFibGU8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lczsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQlwdWJsaWMgU2ltcGxlTWV0YW1vZGVsRmllbGQoCi0JCQlJdGVyYWJsZTxTdHJpbmc+IG1vZGlmaWVycywKLQkJCVN0cmluZyB0eXBlTmFtZSwKLQkJCUl0ZXJhYmxlPFN0cmluZz4gdHlwZUFyZ3VtZW50TmFtZXMsCi0JCQlTdHJpbmcgbmFtZQotCSkgewotCQlzdXBlcigpOwotCQlpZiAobW9kaWZpZXJzID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQlpZiAodHlwZUFyZ3VtZW50TmFtZXMgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5tb2RpZmllcnMgPSBtb2RpZmllcnM7Ci0JCXRoaXMudHlwZU5hbWUgPSB0eXBlTmFtZTsKLQkJdGhpcy50eXBlQXJndW1lbnROYW1lcyA9IHR5cGVBcmd1bWVudE5hbWVzOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldE1vZGlmaWVycygpIHsKLQkJcmV0dXJuIHRoaXMubW9kaWZpZXJzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGVOYW1lOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVBcmd1bWVudE5hbWVzKCkgewotCQlyZXR1cm4gdGhpcy50eXBlQXJndW1lbnROYW1lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5oYXNoQ29kZSh0aGlzLm1vZGlmaWVycykgXgotCQkJCQl0aGlzLnR5cGVOYW1lLmhhc2hDb2RlKCkgXgotCQkJCQlDb2xsZWN0aW9uVG9vbHMuaGFzaENvZGUodGhpcy50eXBlQXJndW1lbnROYW1lcykgXgotCQkJCQl0aGlzLm5hbWUuaGFzaENvZGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKCAhIChvIGluc3RhbmNlb2YgTWV0YW1vZGVsRmllbGQpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJTWV0YW1vZGVsRmllbGQgb3RoZXIgPSAoTWV0YW1vZGVsRmllbGQpIG87Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbCh0aGlzLmdldE1vZGlmaWVycygpLCBvdGhlci5nZXRNb2RpZmllcnMoKSkgJiYKLQkJCQkJdGhpcy5nZXRUeXBlTmFtZSgpLmVxdWFscyhvdGhlci5nZXRUeXBlTmFtZSgpKSAmJgotCQkJCQlDb2xsZWN0aW9uVG9vbHMuZWxlbWVudHNBcmVFcXVhbCh0aGlzLmdldFR5cGVBcmd1bWVudE5hbWVzKCksIG90aGVyLmdldFR5cGVBcmd1bWVudE5hbWVzKCkpICYmCi0JCQkJCXRoaXMuZ2V0TmFtZSgpLmVxdWFscyhvdGhlci5nZXROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKFN0cmluZyBtb2RpZmllciA6IHRoaXMubW9kaWZpZXJzKSB7Ci0JCQlzYi5hcHBlbmQobW9kaWZpZXIpOwotCQkJc2IuYXBwZW5kKCcgJyk7Ci0JCX0KLQkJc2IuYXBwZW5kKHRoaXMudHlwZU5hbWUpOwotCQlzYi5hcHBlbmQoJzwnKTsKLQkJZm9yIChTdHJpbmcgdHlwZUFyZ3VtZW50TmFtZSA6IHRoaXMudHlwZUFyZ3VtZW50TmFtZXMpIHsKLQkJCXNiLmFwcGVuZCh0eXBlQXJndW1lbnROYW1lKTsKLQkJCXNiLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDIpOwotCQlzYi5hcHBlbmQoJz4nKTsKLQkJc2IuYXBwZW5kKCcgJyk7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0Fic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZDZiZGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVBc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTG9iQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Db2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5FbWJlZGRhYmxlT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk1hcEtleUNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk5hbWVkQ29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5OdWxsSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lk1hcEtleUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5OdWxsTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuSnBhRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1ldGFtb2RlbEZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFwS2V5RW51bWVyYXRlZENvbnZlcnRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcEtleVRlbXBvcmFsQ29udmVydGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSlBBIDIuMCBGcmFua2Vuc3RlaW4gbWFwcGluZwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZFRhcmdldENsYXNzOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFRhcmdldENsYXNzOwotCXByb3RlY3RlZCBTdHJpbmcgZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzczsKLQotCXByb3RlY3RlZCBGZXRjaFR5cGUgc3BlY2lmaWVkRmV0Y2g7Ci0JcHJvdGVjdGVkIEZldGNoVHlwZSBkZWZhdWx0RmV0Y2g7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YU9yZGVyYWJsZTJfMCBvcmRlcmFibGU7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGU7Ci0KLQlwcm90ZWN0ZWQgVHlwZSB2YWx1ZVR5cGU7Ci0JcHJvdGVjdGVkIGZpbmFsIEphdmFDb2x1bW4gdmFsdWVDb2x1bW47Ci0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgY29udmVydGVyOyAgLy8gdmFsdWUgY29udmVydGVyIC0gbmV2ZXIgbnVsbAotCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQlwcm90ZWN0ZWQgZmluYWwgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIFR5cGUga2V5VHlwZTsKLQotCS8vTWFwS2V5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHNwZWMsIHNvIHRoaXMgaXMgb25seSBmb3IgRWNsaXBzZUxpbmsKLQkvL0luIHRoZSBnZW5lcmljIGNhc2Ugd2UgY2FuIGhhbmRsZSB0aGlzIHdpdGggdmFsaWRhdGlvbiBhbmQgbm90IHNob3dpbmcgdGhlIFVJIHdpZGdldHMKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE1hcEtleTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBub01hcEtleSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIHBrTWFwS2V5ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gY3VzdG9tTWFwS2V5ID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZE1hcEtleUNsYXNzOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdE1hcEtleUNsYXNzOwotCXByb3RlY3RlZCBTdHJpbmcgZnVsbHlRdWFsaWZpZWRNYXBLZXlDbGFzczsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhQ29sdW1uIG1hcEtleUNvbHVtbjsKLQlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlciBtYXBLZXlDb252ZXJ0ZXI7ICAvLyBtYXAga2V5IGNvbnZlcnRlciAtIG5ldmVyIG51bGwKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgQ29udGV4dExpc3RDb250YWluZXI8SmF2YUpvaW5Db2x1bW4sIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uPiBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyOwotCXByb3RlY3RlZCBmaW5hbCBKYXZhUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG1hcEtleUpvaW5Db2x1bW5Pd25lcjsKLQotCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBkZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbjsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YUNvbnZlcnRlci5BZGFwdGVyW10gQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkgPSBuZXcgSmF2YUNvbnZlcnRlci5BZGFwdGVyW10gewotCQlKYXZhRW51bWVyYXRlZENvbnZlcnRlci5BZGFwdGVyLmluc3RhbmNlKCksCi0JCUphdmFUZW1wb3JhbENvbnZlcnRlci5FbGVtZW50Q29sbGVjdGlvbkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJSmF2YUxvYkNvbnZlcnRlci5BZGFwdGVyLmluc3RhbmNlKCkKLQl9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8SmF2YUNvbnZlcnRlci5BZGFwdGVyPiBDT05WRVJURVJfQURBUFRFUlMgPSBuZXcgQXJyYXlJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+KENPTlZFUlRFUl9BREFQVEVSX0FSUkFZKTsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQ29udmVydGVyLkFkYXB0ZXJbXSBNQVBfS0VZX0NPTlZFUlRFUl9BREFQVEVSX0FSUkFZID0gbmV3IEphdmFDb252ZXJ0ZXIuQWRhcHRlcltdIHsKLQkJSmF2YU1hcEtleUVudW1lcmF0ZWRDb252ZXJ0ZXIyXzAuQWRhcHRlci5pbnN0YW5jZSgpLAotCQlKYXZhTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXIyXzAuQWRhcHRlci5pbnN0YW5jZSgpCi0JfTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUlMgPSBuZXcgQXJyYXlJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+KE1BUF9LRVlfQ09OVkVSVEVSX0FEQVBURVJfQVJSQVkpOwotCi0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZFRhcmdldENsYXNzID0gdGhpcy5idWlsZFNwZWNpZmllZFRhcmdldENsYXNzKCk7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRmV0Y2goKTsKLQkJdGhpcy5vcmRlcmFibGUgPSB0aGlzLmJ1aWxkT3JkZXJhYmxlKCk7Ci0JCXRoaXMuY29sbGVjdGlvblRhYmxlID0gdGhpcy5idWlsZENvbGxlY3Rpb25UYWJsZSgpOwotCi0JCXRoaXMudmFsdWVDb2x1bW4gPSB0aGlzLmJ1aWxkVmFsdWVDb2x1bW4oKTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKCk7Ci0JCXRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gdGhpcy5idWlsZFZhbHVlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5ID0gdGhpcy5idWlsZFNwZWNpZmllZE1hcEtleSgpOwotCQl0aGlzLm5vTWFwS2V5ID0gdGhpcy5idWlsZE5vTWFwS2V5KCk7Ci0JCXRoaXMucGtNYXBLZXkgPSB0aGlzLmJ1aWxkUGtNYXBLZXkoKTsKLQkJdGhpcy5jdXN0b21NYXBLZXkgPSB0aGlzLmJ1aWxkQ3VzdG9tTWFwS2V5KCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTWFwS2V5Q2xhc3MoKTsKLQotCQl0aGlzLm1hcEtleUNvbHVtbiA9IHRoaXMuYnVpbGRNYXBLZXlDb2x1bW4oKTsKLQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkTWFwS2V5Q29udmVydGVyKCk7Ci0JCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdGhpcy5tYXBLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3NfKHRoaXMuYnVpbGRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8odGhpcy5idWlsZFNwZWNpZmllZEZldGNoKCkpOwotCQl0aGlzLm9yZGVyYWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29sbGVjdGlvblRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnZhbHVlQ29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jQ29udmVydGVyKCk7Ci0JCXRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleV8odGhpcy5idWlsZFNwZWNpZmllZE1hcEtleSgpKTsKLQkJdGhpcy5zZXROb01hcEtleV8odGhpcy5idWlsZE5vTWFwS2V5KCkpOwotCQl0aGlzLnNldFBrTWFwS2V5Xyh0aGlzLmJ1aWxkUGtNYXBLZXkoKSk7Ci0JCXRoaXMuc2V0Q3VzdG9tTWFwS2V5Xyh0aGlzLmJ1aWxkQ3VzdG9tTWFwS2V5KCkpOwotCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleUNsYXNzXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0KLQkJdGhpcy5tYXBLZXlDb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNNYXBLZXlDb252ZXJ0ZXIoKTsKLQkJdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQotCQl0aGlzLnNldERlZmF1bHRUYXJnZXRDbGFzcyh0aGlzLmJ1aWxkRGVmYXVsdFRhcmdldENsYXNzKCkpOwotCQl0aGlzLnNldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3ModGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCXRoaXMuc2V0RGVmYXVsdEZldGNoKHRoaXMuYnVpbGREZWZhdWx0RmV0Y2goKSk7Ci0KLQkJdGhpcy5vcmRlcmFibGUudXBkYXRlKCk7Ci0JCXRoaXMuY29sbGVjdGlvblRhYmxlLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0VmFsdWVUeXBlKHRoaXMuYnVpbGRWYWx1ZVR5cGUoKSk7Ci0JCXRoaXMudmFsdWVDb2x1bW4udXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyLnVwZGF0ZSgpOwotCQl0aGlzLnZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0S2V5VHlwZSh0aGlzLmJ1aWxkS2V5VHlwZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TWFwS2V5Q2xhc3ModGhpcy5idWlsZERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJdGhpcy5zZXRGdWxseVF1YWxpZmllZE1hcEtleUNsYXNzKHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZE1hcEtleUNsYXNzKCkpOwotCi0JCXRoaXMubWFwS2V5Q29sdW1uLnVwZGF0ZSgpOwotCQl0aGlzLm1hcEtleUNvbnZlcnRlci51cGRhdGUoKTsKLQkJdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVOb2Rlcyh0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkpOwotCQl0aGlzLnVwZGF0ZURlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhcmdldCBjbGFzcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldENsYXNzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVGFyZ2V0Q2xhc3MgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFRhcmdldENsYXNzIDogdGhpcy5kZWZhdWx0VGFyZ2V0Q2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkVGFyZ2V0Q2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoU3RyaW5nIHRhcmdldENsYXNzKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0YXJnZXRDbGFzcywgdGhpcy5zcGVjaWZpZWRUYXJnZXRDbGFzcykpIHsKLQkJCXRoaXMuZ2V0QW5ub3RhdGlvbkZvclVwZGF0ZSgpLnNldFRhcmdldENsYXNzKHRhcmdldENsYXNzKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3NfKHRhcmdldENsYXNzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFRhcmdldENsYXNzXyhTdHJpbmcgdGFyZ2V0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkVGFyZ2V0Q2xhc3M7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9UQVJHRVRfQ0xBU1NfUFJPUEVSVFksIG9sZCwgdGFyZ2V0Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRhcmdldENsYXNzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUYXJnZXRDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFyZ2V0Q2xhc3MoU3RyaW5nIHRhcmdldENsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRUYXJnZXRDbGFzczsKLQkJdGhpcy5kZWZhdWx0VGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFSR0VUX0NMQVNTX1BST1BFUlRZLCBvbGQsIHRhcmdldENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhcmdldENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TXVsdGlSZWZlcmVuY2VUYXJnZXRUeXBlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzKFN0cmluZyB0YXJnZXRDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldENsYXNzOwotCQl0aGlzLmZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZVTExZX1FVQUxJRklFRF9UQVJHRVRfQ0xBU1NfUFJPUEVSVFksIG9sZCwgdGFyZ2V0Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkVGFyZ2V0Q2xhc3MgPT0gbnVsbCkgPwotCQkJCXRoaXMuZGVmYXVsdFRhcmdldENsYXNzIDoKLQkJCQl0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXRUYXJnZXRDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKSB7Ci0JCXJldHVybiAnLic7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc29sdmVkIHRhcmdldCB0eXBlL2VtYmVkZGFibGUvZW50aXR5ICoqKioqKioqKioKLQotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZSBnZXRSZXNvbHZlZFRhcmdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbWJlZGRhYmxlKHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzcyk7Ci0JfQotCi0JcHVibGljIElUeXBlIGdldFRhcmdldENsYXNzSmR0VHlwZSgpIHsKLQkJcmV0dXJuIEpEVFRvb2xzLmZpbmRUeXBlKHRoaXMuZ2V0SmF2YVByb2plY3QoKSwgdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldENsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmV0Y2ggKioqKioqKioqKgotCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEZldGNoICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRGZXRjaCA6IHRoaXMuZGVmYXVsdEZldGNoOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0U3BlY2lmaWVkRmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZEZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQoZmV0Y2gsIHRoaXMuc3BlY2lmaWVkRmV0Y2gpKSB7Ci0JCQl0aGlzLmdldEFubm90YXRpb25Gb3JVcGRhdGUoKS5zZXRGZXRjaChGZXRjaFR5cGUudG9KYXZhUmVzb3VyY2VNb2RlbChmZXRjaCkpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8oZmV0Y2gpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5zcGVjaWZpZWRGZXRjaDsKLQkJdGhpcy5zcGVjaWZpZWRGZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkU3BlY2lmaWVkRmV0Y2goKSB7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogRmV0Y2hUeXBlLmZyb21KYXZhUmVzb3VyY2VNb2RlbChhbm5vdGF0aW9uLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JCXRoaXMuZGVmYXVsdEZldGNoID0gZmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0ZFVENIX1BST1BFUlRZLCBvbGQsIGZldGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGJ1aWxkRGVmYXVsdEZldGNoKCkgewotCQlyZXR1cm4gREVGQVVMVF9GRVRDSF9UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcmRlcmFibGUgKioqKioqKioqKgotCi0JcHVibGljIEphdmFPcmRlcmFibGUyXzAgZ2V0T3JkZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5vcmRlcmFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFPcmRlcmFibGUyXzAgYnVpbGRPcmRlcmFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFPcmRlcmFibGUodGhpcywgdGhpcy5idWlsZE9yZGVyYWJsZU93bmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBPcmRlcmFibGUyXzAuT3duZXIgYnVpbGRPcmRlcmFibGVPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBPcmRlcmFibGVPd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBPcmRlcmFibGVPd25lcgotCQlpbXBsZW1lbnRzIE9yZGVyYWJsZTJfMC5Pd25lcgotCXsKLQkJcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0RGJUYWJsZSgpOwotCQl9Ci0JCXByb3RlY3RlZCBKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGdldENvbGxlY3Rpb25UYWJsZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2xsZWN0aW9uIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGdldENvbGxlY3Rpb25UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sbGVjdGlvblRhYmxlOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGJ1aWxkQ29sbGVjdGlvblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGYWN0b3J5KCkuYnVpbGRKYXZhQ29sbGVjdGlvblRhYmxlKHRoaXMsIHRoaXMuYnVpbGRDb2xsZWN0aW9uVGFibGVPd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGFibGUuT3duZXIgYnVpbGRDb2xsZWN0aW9uVGFibGVPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uVGFibGVPd25lcigpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBDb2xsZWN0aW9uVGFibGVPd25lcgotCQlpbXBsZW1lbnRzIFJlYWRPbmx5VGFibGUuT3duZXIKLQl7Ci0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcihSZWFkT25seVRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25UYWJsZVZhbGlkYXRvcihBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChDb2xsZWN0aW9uVGFibGUyXzApIHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgVHlwZSBnZXRWYWx1ZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZVR5cGUoVHlwZSB2YWx1ZVR5cGUpIHsKLQkJVHlwZSBvbGQgPSB0aGlzLnZhbHVlVHlwZTsKLQkJdGhpcy52YWx1ZVR5cGUgPSB2YWx1ZVR5cGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9UWVBFX1BST1BFUlRZLCBvbGQsIHZhbHVlVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGUgYnVpbGRWYWx1ZVR5cGUoKSB7Ci0JCWlmICh0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBUeXBlLkVNQkVEREFCTEVfVFlQRTsKLQkJfQotCQlpZiAodGhpcy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpICE9IG51bGwpIHsKLQkJCXJldHVybiBUeXBlLkVOVElUWV9UWVBFOwotCQl9Ci0JCWlmICh0aGlzLmdldFRhcmdldENsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIFR5cGUuTk9fVFlQRTsKLQkJfQotCQlyZXR1cm4gVHlwZS5CQVNJQ19UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb2x1bW4gZ2V0VmFsdWVDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29sdW1uIGJ1aWxkVmFsdWVDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFDb2x1bW4odGhpcywgdGhpcy5idWlsZFZhbHVlQ29sdW1uT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4uT3duZXIgYnVpbGRWYWx1ZUNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IFZhbHVlQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sdW1uQW5ub3RhdGlvbiBnZXRWYWx1ZUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQ29sdW1uQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVWYWx1ZUNvbHVtbkFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlci5nZXRUeXBlKCkgIT0gY29udmVydGVyVHlwZSkgewotCQkJdGhpcy5jb252ZXJ0ZXIuZGlzcG9zZSgpOwotCQkJSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIgPSB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQl0aGlzLnJldGFpbkNvbnZlcnRlckFubm90YXRpb24oY29udmVydGVyQWRhcHRlcik7Ci0JCQl0aGlzLnNldENvbnZlcnRlcl8odGhpcy5idWlsZENvbnZlcnRlcihjb252ZXJ0ZXJBZGFwdGVyKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihKYXZhQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlcikgewotCQkgcmV0dXJuIChjb252ZXJ0ZXJBZGFwdGVyICE9IG51bGwpID8KLQkJCQljb252ZXJ0ZXJBZGFwdGVyLmJ1aWxkTmV3Q29udmVydGVyKHRoaXMsIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKSA6Ci0JCQkJdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXJfKEphdmFDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCUNvbnZlcnRlciBvbGQgPSB0aGlzLmNvbnZlcnRlcjsKLQkJdGhpcy5jb252ZXJ0ZXIgPSBjb252ZXJ0ZXI7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT05WRVJURVJfUFJPUEVSVFksIG9sZCwgY29udmVydGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciBhbGwgdGhlIGNvbnZlcnRlciBhbm5vdGF0aW9ucyA8ZW0+ZXhjZXB0PC9lbT4gZm9yIHRoZSBhbm5vdGF0aW9uCi0JICogY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIuIElmIHRoZSBzcGVjaWZpZWQgYWRhcHRlciBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LCByZW1vdmUgPGVtPmFsbDwvZW0+IHRoZSBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmV0YWluQ29udmVydGVyQW5ub3RhdGlvbihKYXZhQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlcikgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyICE9IGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJCQlhZGFwdGVyLnJlbW92ZUNvbnZlcnRlckFubm90YXRpb24ocmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGRDb252ZXJ0ZXIoKSB7Ci0JCUpwYUZhY3RvcnkganBhRmFjdG9yeSA9IHRoaXMuZ2V0SnBhRmFjdG9yeSgpOwotCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlKYXZhQ29udmVydGVyIGphdmFDb252ZXJ0ZXIgPSBhZGFwdGVyLmJ1aWxkQ29udmVydGVyKHRoaXMsIGpwYUZhY3RvcnkpOwotCQkJaWYgKGphdmFDb252ZXJ0ZXIgIT0gbnVsbCkgewotCQkJCXJldHVybiBqYXZhQ29udmVydGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNDb252ZXJ0ZXIoKSB7Ci0JCUFzc29jaWF0aW9uPEphdmFDb252ZXJ0ZXIuQWRhcHRlciwgQW5ub3RhdGlvbj4gYXNzb2MgPSB0aGlzLmdldENvbnZlcnRlckFubm90YXRpb24oKTsKLQkJaWYgKGFzc29jID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmNvbnZlcnRlci5nZXRUeXBlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyID0gYXNzb2MuZ2V0S2V5KCk7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBhc3NvYy5nZXRWYWx1ZSgpOwotCQkJaWYgKCh0aGlzLmNvbnZlcnRlci5nZXRUeXBlKCkgPT0gYWRhcHRlci5nZXRDb252ZXJ0ZXJUeXBlKCkpICYmCi0JCQkJCSh0aGlzLmNvbnZlcnRlci5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgPT0gYW5ub3RhdGlvbikpIHsKLQkJCQl0aGlzLmNvbnZlcnRlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0Q29udmVydGVyXyhhZGFwdGVyLmJ1aWxkQ29udmVydGVyKGFubm90YXRpb24sIHRoaXMsIHRoaXMuZ2V0SnBhRmFjdG9yeSgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGNvbnZlcnRlciBhbm5vdGF0aW9uIHdlIGZpbmQgYWxvbmcgd2l0aCBpdHMgY29ycmVzcG9uZGluZwotCSAqIGFkYXB0ZXIuIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY29udmVydGVyIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCBBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+IGdldENvbnZlcnRlckFubm90YXRpb24oKSB7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYWRhcHRlci5nZXRDb252ZXJ0ZXJBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCWlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbXBsZUFzc29jaWF0aW9uPEphdmFDb252ZXJ0ZXIuQWRhcHRlciwgQW5ub3RhdGlvbj4oYWRhcHRlciwgYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb252ZXJ0ZXIgYnVpbGROdWxsQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IE51bGxKYXZhQ29udmVydGVyKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZXJ0ZXIgYWRhcHRlcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb252ZXJ0ZXIgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBjb252ZXJ0ZXIgdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YUNvbnZlcnRlci5BZGFwdGVyIGdldENvbnZlcnRlckFkYXB0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlci5nZXRDb252ZXJ0ZXJUeXBlKCkgPT0gY29udmVydGVyVHlwZSkgewotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxKYXZhQ29udmVydGVyLkFkYXB0ZXI+IGdldENvbnZlcnRlckFkYXB0ZXJzKCkgewotCQlyZXR1cm4gQ09OVkVSVEVSX0FEQVBURVJTOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeSgpLmJ1aWxkSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIHRoaXMuYnVpbGRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lciBidWlsZFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIHRoaXMuYnVpbGRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIgYnVpbGRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBrZXkgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgVHlwZSBnZXRLZXlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5rZXlUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEtleVR5cGUoVHlwZSBrZXlUeXBlKSB7Ci0JCVR5cGUgb2xkID0gdGhpcy5rZXlUeXBlOwotCQl0aGlzLmtleVR5cGUgPSBrZXlUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoS0VZX1RZUEVfUFJPUEVSVFksIG9sZCwga2V5VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGUgYnVpbGRLZXlUeXBlKCkgewotCQlpZiAodGhpcy5nZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTUJFRERBQkxFX1RZUEU7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTlRJVFlfVFlQRTsKLQkJfQotCQlpZiAodGhpcy5nZXRNYXBLZXlDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiBUeXBlLk5PX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIFR5cGUuQkFTSUNfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcEtleSgpIHsKLQkJaWYgKHRoaXMubm9NYXBLZXkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLnBrTWFwS2V5KSB7Ci0JCQkvLyB0aGUgdGFyZ2V0IGlzIGVpdGhlciBlbWJlZGRhYmxlIG9yIGJhc2ljLCBzbyBhIGtleSB3aWxsIGhhdmUgdG8gYmUgc3BlY2lmaWVkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5jdXN0b21NYXBLZXkpIHsKLQkJCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIG1hcCBrZXkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgbWFwIGtleSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE1hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcEtleShTdHJpbmcgbWFwS2V5KSB7Ci0JCWlmIChtYXBLZXkgIT0gbnVsbCkgewotCQkJdGhpcy5nZXRNYXBLZXlBbm5vdGF0aW9uRm9yVXBkYXRlKCkuc2V0TmFtZShtYXBLZXkpOwotCi0JCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleV8obWFwS2V5KTsKLQkJCXRoaXMuc2V0Tm9NYXBLZXlfKGZhbHNlKTsKLQkJCXRoaXMuc2V0UGtNYXBLZXlfKGZhbHNlKTsKLQkJCXRoaXMuc2V0Q3VzdG9tTWFwS2V5Xyh0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0UGtNYXBLZXkodHJ1ZSk7ICAvLyBobW1tLi4uCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlfKFN0cmluZyBtYXBLZXkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTWFwS2V5OwotCQl0aGlzLnNwZWNpZmllZE1hcEtleSA9IG1hcEtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NQVBfS0VZX1BST1BFUlRZLCBvbGQsIG1hcEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZE1hcEtleSgpIHsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBLZXlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAobWFwS2V5QW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbm8gbWFwIGtleSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc05vTWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy5ub01hcEtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb01hcEtleShib29sZWFuIG5vTWFwS2V5KSB7Ci0JCWlmIChub01hcEtleSkgewotCQkJaWYgKHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpICE9IG51bGwpIHsKLQkJCQl0aGlzLnJlbW92ZU1hcEtleUFubm90YXRpb24oKTsKLQkJCX0KLQotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlfKG51bGwpOwotCQkJdGhpcy5zZXROb01hcEtleV8odHJ1ZSk7Ci0JCQl0aGlzLnNldFBrTWFwS2V5XyhmYWxzZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU1hcEtleV8oZmFsc2UpOwotCQl9IGVsc2UgewotCQkJdGhpcy5zZXRQa01hcEtleSh0cnVlKTsgIC8vIGhtbW0uLi4KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5vTWFwS2V5Xyhib29sZWFuIG5vTWFwS2V5KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5ub01hcEtleTsKLQkJdGhpcy5ub01hcEtleSA9IG5vTWFwS2V5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTk9fTUFQX0tFWV9QUk9QRVJUWSwgb2xkLCBub01hcEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGROb01hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpID09IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBrIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNQa01hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMucGtNYXBLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGtNYXBLZXkoYm9vbGVhbiBwa01hcEtleSkgewotCQlpZiAocGtNYXBLZXkpIHsKLQkJCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOwotCQkJaWYgKG1hcEtleUFubm90YXRpb24gPT0gbnVsbCkgewotCQkJCW1hcEtleUFubm90YXRpb24gPSB0aGlzLmFkZE1hcEtleUFubm90YXRpb24oKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWFwS2V5QW5ub3RhdGlvbi5zZXROYW1lKG51bGwpOwotCQkJfQotCi0JCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleV8obnVsbCk7Ci0JCQl0aGlzLnNldE5vTWFwS2V5XyhmYWxzZSk7Ci0JCQl0aGlzLnNldFBrTWFwS2V5Xyh0cnVlKTsKLQkJCXRoaXMuc2V0Q3VzdG9tTWFwS2V5XyhmYWxzZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldE5vTWFwS2V5KHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0UGtNYXBLZXlfKGJvb2xlYW4gcGtNYXBLZXkpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLnBrTWFwS2V5OwotCQl0aGlzLnBrTWFwS2V5ID0gcGtNYXBLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19NQVBfS0VZX1BST1BFUlRZLCBvbGQsIHBrTWFwS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFBrTWFwS2V5KCkgewotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUFubm90YXRpb24oKTsKLQkJcmV0dXJuIChtYXBLZXlBbm5vdGF0aW9uICE9IG51bGwpICYmIChtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNDdXN0b21NYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbU1hcEtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21NYXBLZXkoYm9vbGVhbiBjdXN0b21NYXBLZXkpIHsKLQkJaWYgKGN1c3RvbU1hcEtleSkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXkoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldE5vTWFwS2V5KHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9tTWFwS2V5Xyhib29sZWFuIGN1c3RvbU1hcEtleSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuY3VzdG9tTWFwS2V5OwotCQl0aGlzLmN1c3RvbU1hcEtleSA9IGN1c3RvbU1hcEtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9NQVBfS0VZX1BST1BFUlRZLCBvbGQsIGN1c3RvbU1hcEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRDdXN0b21NYXBLZXkoKSB7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKG1hcEtleUFubm90YXRpb24gIT0gbnVsbCkgJiYgKG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpICE9IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGFubm90YXRpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE1hcEtleUFubm90YXRpb24gZ2V0TWFwS2V5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChNYXBLZXlBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcEtleUFubm90YXRpb24gZ2V0TWFwS2V5QW5ub3RhdGlvbkZvclVwZGF0ZSgpIHsKLQkJTWFwS2V5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRNYXBLZXlBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiAhPSBudWxsICkgPyBhbm5vdGF0aW9uIDogdGhpcy5hZGRNYXBLZXlBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcEtleUFubm90YXRpb24gYWRkTWFwS2V5QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChNYXBLZXlBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWFwS2V5QW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hcEtleU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwS2V5QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKG1hcEtleUFubm90YXRpb24gIT0gbnVsbCkgJiYgbWFwS2V5QW5ub3RhdGlvbi5uYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgOiB0aGlzLmRlZmF1bHRNYXBLZXlDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhTdHJpbmcgbWFwS2V5Q2xhc3MpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KG1hcEtleUNsYXNzLCB0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzKSkgewotCQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUNsYXNzQW5ub3RhdGlvbigpOwotCQkJaWYgKG1hcEtleUNsYXNzID09IG51bGwpIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucmVtb3ZlTWFwS2V5Q2xhc3NBbm5vdGF0aW9uKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJCWFubm90YXRpb24gPSB0aGlzLmFkZE1hcEtleUNsYXNzQW5ub3RhdGlvbigpOwotCQkJCX0KLQkJCQlhbm5vdGF0aW9uLnNldFZhbHVlKG1hcEtleUNsYXNzKTsKLQkJCX0KLQotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzc18obWFwS2V5Q2xhc3MpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3NfKFN0cmluZyBtYXBLZXlDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzczsKLQkJdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzcyA9IG1hcEtleUNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFksIG9sZCwgbWFwS2V5Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRNYXBLZXlDbGFzcygpIHsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcEtleUNsYXNzQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gPT0gbnVsbCkgPyBudWxsIDogYW5ub3RhdGlvbi5nZXRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0TWFwS2V5Q2xhc3M7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE1hcEtleUNsYXNzKFN0cmluZyBtYXBLZXlDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0TWFwS2V5Q2xhc3M7Ci0JCXRoaXMuZGVmYXVsdE1hcEtleUNsYXNzID0gbWFwS2V5Q2xhc3M7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFksIG9sZCwgbWFwS2V5Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNdWx0aVJlZmVyZW5jZU1hcEtleVR5cGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZE1hcEtleUNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3MoU3RyaW5nIG1hcEtleUNsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3M7Ci0JCXRoaXMuZnVsbHlRdWFsaWZpZWRNYXBLZXlDbGFzcyA9IG1hcEtleUNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRlVMTFlfUVVBTElGSUVEX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFksIG9sZCwgbWFwS2V5Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgPT0gbnVsbCkgPwotCQkJCXRoaXMuZGVmYXVsdE1hcEtleUNsYXNzIDoKLQkJCQl0aGlzLmdldE1hcEtleUNsYXNzQW5ub3RhdGlvbigpLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0TWFwS2V5Q2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJy4nOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvbHZlZCBtYXAga2V5IGVtYmVkZGFibGUvZW50aXR5ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFbWJlZGRhYmxlIGdldFJlc29sdmVkTWFwS2V5RW1iZWRkYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW1iZWRkYWJsZSh0aGlzLmZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHkgZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSh0aGlzLmZ1bGx5UXVhbGlmaWVkTWFwS2V5Q2xhc3MpOwotCX0KLQotCXB1YmxpYyBJVHlwZSBnZXRNYXBLZXlDbGFzc0pkdFR5cGUoKSB7Ci0JCXJldHVybiBKRFRUb29scy5maW5kVHlwZSh0aGlzLmdldEphdmFQcm9qZWN0KCksIHRoaXMuZnVsbHlRdWFsaWZpZWRNYXBLZXlDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgY2xhc3MgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIGdldE1hcEtleUNsYXNzQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBNYXBLZXlDbGFzczJfMEFubm90YXRpb24gYWRkTWFwS2V5Q2xhc3NBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWFwS2V5Q2xhc3NBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlDb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDb2x1bW4gYnVpbGRNYXBLZXlDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFNYXBLZXlDb2x1bW4odGhpcywgdGhpcy5idWlsZE1hcEtleUNvbHVtbk93bmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29sdW1uLk93bmVyIGJ1aWxkTWFwS2V5Q29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwS2V5Q29sdW1uT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBnZXRNYXBLZXlDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWFwS2V5Q29sdW1uQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb252ZXJ0ZXIgKioqKioqKioqKgotCi0JcHVibGljIEphdmFDb252ZXJ0ZXIgZ2V0TWFwS2V5Q29udmVydGVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlDb252ZXJ0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5Q29udmVydGVyKENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJaWYgKHRoaXMubWFwS2V5Q29udmVydGVyLmdldFR5cGUoKSAhPSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQl0aGlzLm1hcEtleUNvbnZlcnRlci5kaXNwb3NlKCk7Ci0JCQlKYXZhQ29udmVydGVyLkFkYXB0ZXIgY29udmVydGVyQWRhcHRlciA9IHRoaXMuZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJCXRoaXMucmV0YWluTWFwS2V5Q29udmVydGVyQW5ub3RhdGlvbihjb252ZXJ0ZXJBZGFwdGVyKTsKLQkJCXRoaXMuc2V0TWFwS2V5Q29udmVydGVyXyh0aGlzLmJ1aWxkS2V5Q29udmVydGVyKGNvbnZlcnRlckFkYXB0ZXIpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkS2V5Q29udmVydGVyKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCSByZXR1cm4gKGNvbnZlcnRlckFkYXB0ZXIgIT0gbnVsbCkgPwotCQkJCWNvbnZlcnRlckFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRKcGFGYWN0b3J5KCkpIDoKLQkJCQl0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1hcEtleUNvbnZlcnRlcl8oSmF2YUNvbnZlcnRlciBrZXlDb252ZXJ0ZXIpIHsKLQkJQ29udmVydGVyIG9sZCA9IHRoaXMubWFwS2V5Q29udmVydGVyOwotCQl0aGlzLm1hcEtleUNvbnZlcnRlciA9IGtleUNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUF9LRVlfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGtleUNvbnZlcnRlcik7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXIgYWxsIHRoZSBjb252ZXJ0ZXIgYW5ub3RhdGlvbnMgPGVtPmV4Y2VwdDwvZW0+IGZvciB0aGUgYW5ub3RhdGlvbgotCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhZGFwdGVyLiBJZiB0aGUgc3BlY2lmaWVkIGFkYXB0ZXIgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiwgcmVtb3ZlIDxlbT5hbGw8L2VtPiB0aGUgY29udmVydGVyIGFubm90YXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJldGFpbk1hcEtleUNvbnZlcnRlckFubm90YXRpb24oSmF2YUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlmb3IgKEphdmFDb252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRNYXBLZXlDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlciAhPSBjb252ZXJ0ZXJBZGFwdGVyKSB7Ci0JCQkJYWRhcHRlci5yZW1vdmVDb252ZXJ0ZXJBbm5vdGF0aW9uKHJlc291cmNlQXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyIGJ1aWxkTWFwS2V5Q29udmVydGVyKCkgewotCQlKcGFGYWN0b3J5IGpwYUZhY3RvcnkgPSB0aGlzLmdldEpwYUZhY3RvcnkoKTsKLQkJZm9yIChKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJSmF2YUNvbnZlcnRlciBqYXZhQ29udmVydGVyID0gYWRhcHRlci5idWlsZENvbnZlcnRlcih0aGlzLCBqcGFGYWN0b3J5KTsKLQkJCWlmIChqYXZhQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gamF2YUNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jTWFwS2V5Q29udmVydGVyKCkgewotCQlBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+IGFzc29jID0gdGhpcy5nZXRNYXBLZXlDb252ZXJ0ZXJBbm5vdGF0aW9uKCk7Ci0JCWlmIChhc3NvYyA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0VHlwZSgpICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldE1hcEtleUNvbnZlcnRlcl8odGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA9IGFzc29jLmdldEtleSgpOwotCQkJQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gYXNzb2MuZ2V0VmFsdWUoKTsKLQkJCWlmICgodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0VHlwZSgpID09IGFkYXB0ZXIuZ2V0Q29udmVydGVyVHlwZSgpKSAmJgotCQkJCQkodGhpcy5tYXBLZXlDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbigpID09IGFubm90YXRpb24pKSB7Ci0JCQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnNldE1hcEtleUNvbnZlcnRlcl8oYWRhcHRlci5idWlsZENvbnZlcnRlcihhbm5vdGF0aW9uLCB0aGlzLCB0aGlzLmdldEpwYUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBjb252ZXJ0ZXIgYW5ub3RhdGlvbiB3ZSBmaW5kIGFsb25nIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcKLQkgKiBhZGFwdGVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNvbnZlcnRlciBhbm5vdGF0aW9ucy4KLQkgKi8KLQlwcm90ZWN0ZWQgQXNzb2NpYXRpb248SmF2YUNvbnZlcnRlci5BZGFwdGVyLCBBbm5vdGF0aW9uPiBnZXRNYXBLZXlDb252ZXJ0ZXJBbm5vdGF0aW9uKCkgewotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGFkYXB0ZXIuZ2V0Q29udmVydGVyQW5ub3RhdGlvbihyZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQlpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW1wbGVBc3NvY2lhdGlvbjxKYXZhQ29udmVydGVyLkFkYXB0ZXIsIEFubm90YXRpb24+KGFkYXB0ZXIsIGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGNvbnZlcnRlciBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnZlcnRlciBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnZlcnRlciB0eXBlLgotCSAqLwotCXByb3RlY3RlZCBKYXZhQ29udmVydGVyLkFkYXB0ZXIgZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWZvciAoSmF2YUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEphdmFDb252ZXJ0ZXIuQWRhcHRlcj4gZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBNQVBfS0VZX0NPTlZFUlRFUl9BREFQVEVSUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcih0aGlzLCB0aGlzLmJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPiBnZXRNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSA/IHRoaXMuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSA6IHRoaXMuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIDogdGhpcy5nZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNwZWNpZmllZCBtYXAga2V5IGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIEphdmFKb2luQ29sdW1uIGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuZ2V0Q29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKHRoaXMuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyBKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5hZGRNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihpbmRleCk7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbih0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuaW5kZXhPZkNvbnRleHRFbGVtZW50KChKYXZhSm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRoaXMucmVtb3ZlTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW5kZXgpOwotCQl0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIucmVtb3ZlQ29udGV4dEVsZW1lbnQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMubW92ZU1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5tb3ZlQ29udGV4dEVsZW1lbnQodGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRleHRMaXN0Q29udGFpbmVyPEphdmFKb2luQ29sdW1uLCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbj4gYnVpbGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCkgewotCQlTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JCWNvbnRhaW5lci5pbml0aWFsaXplKCk7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogc3BlY2lmaWVkIG1hcCBrZXkgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxKYXZhSm9pbkNvbHVtbiwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZXh0RWxlbWVudHNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gU1BFQ0lGSUVEX01BUF9LRVlfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKYXZhSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIHJlc291cmNlRWxlbWVudCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbihyZXNvdXJjZUVsZW1lbnQpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldE1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gZ2V0UmVzb3VyY2VFbGVtZW50KEphdmFKb2luQ29sdW1uIGNvbnRleHRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBjb250ZXh0RWxlbWVudC5nZXRDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUpvaW5Db2x1bW4gYnVpbGRNYXBLZXlKb2luQ29sdW1uKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFKb2luQ29sdW1uKHRoaXMsIHRoaXMubWFwS2V5Sm9pbkNvbHVtbk93bmVyLCBqb2luQ29sdW1uQW5ub3RhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRNYXBLZXlKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgTWFwS2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRlZmF1bHQgbWFwIGtleSBqb2luIGNvbHVtbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YUpvaW5Db2x1bW4gZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKEphdmFKb2luQ29sdW1uIG1hcEtleUpvaW5Db2x1bW4pIHsKLQkJSmF2YUpvaW5Db2x1bW4gb2xkID0gdGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbjsKLQkJdGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9IG1hcEtleUpvaW5Db2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX01BUF9LRVlfSk9JTl9DT0xVTU5fUFJPUEVSVFksIG9sZCwgbWFwS2V5Sm9pbkNvbHVtbik7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXZhSm9pbkNvbHVtbj4gZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPEphdmFKb2luQ29sdW1uPih0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uKSA6Ci0JCQkJRW1wdHlMaXN0SXRlcmFibGUuPEphdmFKb2luQ29sdW1uPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4gPT0gbnVsbCkgPyAwIDogMTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpIHsKLQkJaWYgKHRoaXMuYnVpbGRzRGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSkgewotCQkJaWYgKHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJCXRoaXMuc2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4odGhpcy5idWlsZE1hcEtleUpvaW5Db2x1bW4odGhpcy5idWlsZE51bGxNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpKSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4udXBkYXRlKCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKG51bGwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRzRGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAhIHRoaXMuaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSAmJgotCQkJCWdldEtleVR5cGUoKSA9PSBUeXBlLkVOVElUWV9UWVBFOwotCX0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBqb2luIGNvbHVtbiBhbm5vdGF0aW9ucyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uPiBnZXRNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3ViTGlzdEl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uPih0aGlzLmdldE5lc3RhYmxlTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb25zKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TmVzdGFibGVBbm5vdGF0aW9uPiBnZXROZXN0YWJsZU1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9ucyhNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBhZGRNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oaW5kZXgsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKGluZGV4LCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1vdmVNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkubW92ZUFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4LCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCXByb3RlY3RlZCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBidWlsZE51bGxNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBOdWxsTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24odGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZW1iZWRkZWQgbWFwcGluZ3MgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFsbFRhcmdldEVtYmVkZGFibGVBdHRyaWJ1dGVOYW1lcygpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbFRhcmdldEVtYmVkZGFibGVBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0QWxsVGFyZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU5hbWVzTGlzdHMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBsaXN0czsgZWFjaCBuZXN0ZWQgbGlzdCBob2xkcyB0aGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUKLQkgKiBlbWJlZGRlZCBtYXBwaW5nJ3MgdGFyZ2V0IGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nJ3MgYXR0cmlidXRlIG1hcHBpbmdzCi0JICogKGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbiBtYXBwaW5ncywgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtZXIpLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxTdHJpbmc+PiBnZXRBbGxUYXJnZXRFbWJlZGRhYmxlQXR0cmlidXRlTmFtZXNMaXN0cygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+KHRoaXMuZ2V0QWxsVGFyZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdzKCksIEF0dHJpYnV0ZU1hcHBpbmdUb29scy5BTExfTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbFRhcmdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpIHsKLQkJRW1iZWRkYWJsZSB0YXJnZXRFbWJlZGRhYmxlID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKTsKLQkJcmV0dXJuICh0YXJnZXRFbWJlZGRhYmxlICE9IG51bGwpID8gdGFyZ2V0RW1iZWRkYWJsZS5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpIDogRW1wdHlJdGVyYWJsZS48QXR0cmlidXRlTWFwcGluZz4gaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihzdXBlci5nZXRBbGxNYXBwaW5nTmFtZXMoKSwgdGhpcy5nZXRBbGxFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFF1YWxpZmllZEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lcyhBdHRyaWJ1dGVNYXBwaW5nVG9vbHMuQUxMX01BUFBJTkdfTkFNRVNfVFJBTlNGT1JNRVIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWFsaWZpZWRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9PVkVSUklEQUJMRV9BVFRSSUJVVEVfTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UXVhbGlmaWVkRW1iZWRkYWJsZU92ZXJyaWRhYmxlTWFwcGluZ05hbWVzKEF0dHJpYnV0ZU1hcHBpbmdUb29scy5BTExfT1ZFUlJJREFCTEVfQVNTT0NJQVRJT05fTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0UXVhbGlmaWVkRW1iZWRkYWJsZU92ZXJyaWRhYmxlTWFwcGluZ05hbWVzKFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4odGhpcy5nZXRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXModHJhbnNmb3JtZXIpLCB0aGlzLmJ1aWxkUXVhbGlmaWVyVHJhbnNmb3JtZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlTWFwcGluZ05hbWVzKFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lc0xpc3RzKHRyYW5zZm9ybWVyKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiBsaXN0czsgZWFjaCBuZXN0ZWQgbGlzdCBob2xkcyB0aGUgbmFtZXMgZm9yIG9uZSBvZiB0aGUKLQkgKiBlbWJlZGRlZCBtYXBwaW5nJ3MgdGFyZ2V0IGVtYmVkZGFibGUgdHlwZSBtYXBwaW5nJ3MgYXR0cmlidXRlIG1hcHBpbmdzCi0JICogKGF0dHJpYnV0ZSBvciBhc3NvY2lhdGlvbiBtYXBwaW5ncywgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpZWQgdHJhbnNmb3JtZXIpLgotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxTdHJpbmc+PiBnZXRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXNMaXN0cyhUcmFuc2Zvcm1lcjxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+PiB0cmFuc2Zvcm1lcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4odGhpcy5nZXRFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSwgdHJhbnNmb3JtZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBBdHRyaWJ1dGVNYXBwaW5nIHJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZWRNYXBwaW5nID0gc3VwZXIucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChyZXNvbHZlZE1hcHBpbmcgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc29sdmVkTWFwcGluZzsKLQkJfQotCQlhdHRyaWJ1dGVOYW1lID0gdGhpcy51bnF1YWxpZnkoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCS8vIHJlY3Vyc2UgaW50byB0aGUgZW1iZWRkYWJsZSBtYXBwaW5ncwotCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA6IHRoaXMuZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKLQkJCXJlc29sdmVkTWFwcGluZyA9IG1hcHBpbmcucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoYXR0cmlidXRlTmFtZSk7Ci0JCQlpZiAocmVzb2x2ZWRNYXBwaW5nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSB7Ci0JCUVtYmVkZGFibGUgdGFyZ2V0RW1iZWRkYWJsZSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCk7Ci0JCXJldHVybiAoKHRhcmdldEVtYmVkZGFibGUgIT0gbnVsbCkgJiYgKHRhcmdldEVtYmVkZGFibGUgIT0gdGhpcy5nZXRUeXBlTWFwcGluZygpKSkgPwotCQkJCXRhcmdldEVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTWFwcGluZ3MoKSA6Ci0JCQkJRW1wdHlJdGVyYWJsZS48QXR0cmlidXRlTWFwcGluZz5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJYXR0cmlidXRlTmFtZSA9IHRoaXMudW5xdWFsaWZ5KGF0dHJpYnV0ZU5hbWUpOwotCQlpZiAoYXR0cmlidXRlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQkvLyByZWN1cnNlIGludG8gdGhlIHRhcmdldCBlbWJlZGRhYmxlIGlmIG5lY2Vzc2FyeQotCQlyZXR1cm4gKG92ZXJyaWRlICE9IG51bGwpID8gb3ZlcnJpZGUuZ2V0Q29sdW1uKCkgOiB0aGlzLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uSW5UYXJnZXRFbWJlZGRhYmxlKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW5JblRhcmdldEVtYmVkZGFibGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJRW1iZWRkYWJsZSB0YXJnZXRFbWJlZGRhYmxlID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKTsKLQkJcmV0dXJuICh0YXJnZXRFbWJlZGRhYmxlID09IG51bGwpID8gbnVsbCA6IHRhcmdldEVtYmVkZGFibGUucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlhdHRyaWJ1dGVOYW1lID0gdGhpcy51bnF1YWxpZnkoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUgPSB0aGlzLnZhbHVlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQkvLyByZWN1cnNlIGludG8gdGhlIHRhcmdldCBlbWJlZGRhYmxlIGlmIG5lY2Vzc2FyeQotCQlyZXR1cm4gKG92ZXJyaWRlICE9IG51bGwpID8gb3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkgOiAgdGhpcy5yZXNvbHZlUmVsYXRpb25zaGlwSW5UYXJnZXRFbWJlZGRhYmxlKGF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBSZWxhdGlvbnNoaXAgcmVzb2x2ZVJlbGF0aW9uc2hpcEluVGFyZ2V0RW1iZWRkYWJsZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlFbWJlZGRhYmxlIHRhcmdldEVtYmVkZGFibGUgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpOwotCQlyZXR1cm4gKHRhcmdldEVtYmVkZGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW1iZWRkYWJsZS5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFGYWN0b3J5Ml8wIGdldEpwYUZhY3RvcnkoKSB7Ci0JCXJldHVybiAoSnBhRmFjdG9yeTJfMCkgc3VwZXIuZ2V0SnBhRmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5IGdldEVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFR5cGVNYXBwaW5nKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFbnRpdHkpID8gKEVudGl0eSkgdHlwZU1hcHBpbmcgOiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLmNvbGxlY3Rpb25UYWJsZS5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLnZhbHVlQ29sdW1uLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMuY29udmVydGVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMub3JkZXJhYmxlLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJlc3VsdCA9IHRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLnZhbHVlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5tYXBLZXlOYW1lVG91Y2hlcyhwb3MsIGFzdFJvb3QpKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKYXZhQ2FuZGlkYXRlTWFwS2V5TmFtZXMoZmlsdGVyKTsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLm1hcEtleUNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLm1hcEtleUNvbnZlcnRlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlyZXN1bHQgPSB0aGlzLm1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHBvcywgZmlsdGVyLCBhc3RSb290KTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWZvciAoSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA6IHRoaXMuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKSkgewotCQkJcmVzdWx0ID0gam9pbkNvbHVtbi5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDYW5kaWRhdGVNYXBLZXlOYW1lcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyh0aGlzLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKGZpbHRlcikpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU1hcEtleU5hbWVzKEZpbHRlcjxTdHJpbmc+IGZpbHRlcikgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLCBmaWx0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtZXRhbW9kZWwgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWV0YW1vZGVsQ29udGFpbmVyRmllbGRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5mdWxseVF1YWxpZmllZFRhcmdldENsYXNzICE9IG51bGwpID8gdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldENsYXNzIDogTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IHR5cGVBcmd1bWVudE5hbWVzKSB7Ci0JCXRoaXMuYWRkTWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlQXJndW1lbnROYW1lVG8odHlwZUFyZ3VtZW50TmFtZXMpOwotCQlzdXBlci5hZGRNZXRhbW9kZWxGaWVsZFR5cGVBcmd1bWVudE5hbWVzVG8odHlwZUFyZ3VtZW50TmFtZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKEFycmF5TGlzdDxTdHJpbmc+IHR5cGVBcmd1bWVudE5hbWVzKSB7Ci0JCVN0cmluZyBrZXlUeXBlTmFtZSA9IHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKLQkJaWYgKGtleVR5cGVOYW1lICE9IG51bGwpIHsKLQkJCXR5cGVBcmd1bWVudE5hbWVzLmFkZChrZXlUeXBlTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuZ2V0TWV0YW1vZGVsRmllbGRNYXBLZXlUeXBlTmFtZSh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlVGFyZ2V0Q2xhc3MobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlTWFwS2V5Q2xhc3MobWVzc2FnZXMsIGFzdFJvb3QpOwotCQl0aGlzLm9yZGVyYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLmNvbGxlY3Rpb25UYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlVmFsdWUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJdGhpcy52YWxpZGF0ZU1hcEtleShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVGFyZ2V0Q2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVN0cmluZyB0YXJnZXRDbGFzcyA9IHRoaXMuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzcygpOwotCQlpZiAodGFyZ2V0Q2xhc3MgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRCwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCl9LAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkJKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVzc2FnZXMuYWRkKAotCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRCwKLQkJCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJCXRoaXMsCi0JCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJKQotCQkJCSk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoSkRUVG9vbHMuZmluZFR5cGUoamF2YVByb2plY3QsIHRhcmdldENsYXNzKSAhPSBudWxsKSB7Ci0JCQlpZiAoICEgSkRUVG9vbHMudHlwZUlzQmFzaWMoamF2YVByb2plY3QsIHRhcmdldENsYXNzKSAmJiAodGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKSA9PSBudWxsKSkgewotCQkJCWlmICh0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXROYW1lKCksIHRhcmdldENsYXNzfSwKLQkJCQkJCQl0aGlzLAotCQkJCQkJCXRoaXMuZ2V0VGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoYXN0Um9vdCkKLQkJCQkJCSkKLQkJCQkJKTsKLQkJCQl9IGVsc2UgewotCQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFLAotCQkJCQkJCW5ldyBTdHJpbmdbXSB7dGFyZ2V0Q2xhc3N9LAotCQkJCQkJCXRoaXMsCi0JCQkJCQkJdGhpcy5nZXRUYXJnZXRDbGFzc1RleHRSYW5nZShhc3RSb290KQotCQkJCQkJKQotCQkJCQkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0VGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLmdldEFubm90YXRpb25UYXJnZXRDbGFzc1RleHRSYW5nZShhc3RSb290KSwgYXN0Um9vdCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRBbm5vdGF0aW9uVGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRhcmdldENsYXNzVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwS2V5Q2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKcGFDb250YWluZXJEZWZpbml0aW9uKCkuaXNNYXAoKSkgewotCQkJdGhpcy52YWxpZGF0ZU1hcEtleUNsYXNzXyhtZXNzYWdlcywgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcEtleUNsYXNzXyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZ2V0TWFwS2V5Q2xhc3MoKSA9PSBudWxsKSB7Ci0JCQlpZiAodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NMQVNTX05PVF9ERUZJTkVELAotCQkJCQkJbmV3IFN0cmluZ1tdIHt0aGlzLmdldE5hbWUoKX0sCi0JCQkJCQl0aGlzLAotCQkJCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkJCSkKLQkJCQkpOwotCQkJfSBlbHNlIHsKLQkJCQltZXNzYWdlcy5hZGQoCi0JCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBfS0VZX0NMQVNTX05PVF9ERUZJTkVELAotCQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQkJdGhpcywKLQkJCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KQotCQkJCQkpCi0JCQkJKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVmFsdWUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5jb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJLy9UT0RPIHNob3VsZCB3ZSBoYW5kbGUgdmFsaWRhdGlvbiB3aGVuIHRoZSB0eXBlIGlzIGVtYmVkZGFibGUsCi0JCS8vYnV0IGEgdmFsdWUgY29sdW1uIGlzIHNwZWNpZmllZCwgb3IgdGhpbmdzIGxpa2UgdGhhdCBpZiB0aGF0IGlzIGludmFsaWQ/Ci0JCXN3aXRjaCAodGhpcy52YWx1ZVR5cGUpIHsKLQkJCWNhc2UgQkFTSUNfVFlQRSA6Ci0JCQkJdGhpcy52YWx1ZUNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTUJFRERBQkxFX1RZUEUgOgotCQkJCXRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwS2V5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmdldE1hcEtleSgpID09IG51bGwpIHsKLQkJCXRoaXMudmFsaWRhdGVNYXBLZXlfKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0gZWxzZSB7Ci0JCQkvL1RPRE8gdmFsaWRhdGUgdGhhdCB0aGUgbWFwIGtleSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgYXR0cmlidXRlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcEtleV8oTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3dpdGNoICh0aGlzLmtleVR5cGUpIHsKLQkJCWNhc2UgQkFTSUNfVFlQRSA6Ci0JCQkJdGhpcy5tYXBLZXlDb2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCQl0aGlzLm1hcEtleUNvbnZlcnRlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTlRJVFlfVFlQRSA6Ci0JCQkJZm9yIChKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogdGhpcy5nZXRNYXBLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJCWpvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVNQkVEREFCTEVfVFlQRSA6Ci0JCQkJdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQkJCS8vdmFsaWRhdGUgbWFwIGtleSBhc3NvY2lhdGlvbiBvdmVycmlkZXMgLSBmb3IgZWNsaXBzZWxpbmsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIHRoZSB2YXJpb3VzIChjb2x1bW4gYW5kIG92ZXJyaWRlKSBvd25lcnMgaGF2ZSBsb3RzIG9mIGNvbW1vbgotCSAqIGludGVyYWN0aW9ucyB3aXRoIHRoZSBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3duZXIKLQl7Ci0JCXB1YmxpYyBKYXZhUmVzb3VyY2VNZW1iZXIgZ2V0UmVzb3VyY2VNZW1iZXIoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCB0YWJsZSA9IHRoaXMuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwodGFibGUuZ2V0TmFtZSgpLCB0YWJsZU5hbWUpID8gdGFibGUuZ2V0RGJUYWJsZSgpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIElmIHRoZXJlIGlzIGEgc3BlY2lmaWVkIHRhYmxlIG5hbWUgaXQgbmVlZHMgdG8gYmUgdGhlIHNhbWUKLQkJICogdGhlIGRlZmF1bHQgdGFibGUgbmFtZS4gIHRoZSB0YWJsZSBpcyBhbHdheXMgdGhlIGNvbGxlY3Rpb24gdGFibGUKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpLCB0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGluZ05hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEphdmFDb2xsZWN0aW9uVGFibGUyXzAgZ2V0Q29sbGVjdGlvblRhYmxlKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlIGNvbHVtbiBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVmFsdWVDb2x1bW5Pd25lcgotCQlleHRlbmRzIEFic3RyYWN0T3duZXIKLQkJaW1wbGVtZW50cyBKYXZhQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0VmFsdWVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQkJQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMucmVtb3ZlVmFsdWVDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBOYW1lZENvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sdW1uLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBDb2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIE1hcEtleUNvbHVtbk93bmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RPd25lcgotCQlpbXBsZW1lbnRzIEphdmFDb2x1bW4uT3duZXIKLQl7Ci0JCXB1YmxpYyBNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0TWFwS2V5Q29sdW1uQW5ub3RhdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uQW5ub3RhdGlvbigpIHsKLQkJCUFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLnJlbW92ZU1hcEtleUNvbHVtbkFubm90YXRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiB0aGlzLmdldE1hcHBpbmdOYW1lKCkgKyAiX0tFWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgTWFwS2V5Q29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlCYXNlQ29sdW1uKSBjb2x1bW4sIChUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IENvbGxlY3Rpb25UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSBvdmVycmlkZSBjb250YWluZXIgb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIFZhbHVlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlleHRlbmRzIEFic3RyYWN0T3duZXIKLQl7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1NJQkxFX1BSRUZJWCA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UG9zc2libGVQcmVmaXgoKSB7Ci0JCQlyZXR1cm4gUE9TU0lCTEVfUFJFRklYOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRXcml0ZVByZWZpeCgpIHsKLQkJCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKcGFDb250YWluZXJEZWZpbml0aW9uKCkuaXNNYXAoKSA/IHRoaXMuZ2V0UG9zc2libGVQcmVmaXgoKSA6IG51bGw7Ci0JCX0KLQotCQkvL3JldHVybiBmYWxzZSBpZiB0aGUgb3ZlcnJpZGUgaXMgcHJlZml4ZWQgd2l0aCAia2V5LiIsIHRoZXNlIHdpbGwgYmUgcGFydCBvZiB0aGUgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuCi0JCS8vYSBwcmVmaXggb2YgInZhbHVlLiIgb3Igbm8gcHJlZml4IGF0IGFsbCBpcyByZWxldmFudC4gSWYgdGhlIHR5cGUgaXMgbm90IGEgTWFwIHRoZW4gcmV0dXJuIHRydWUgc2luY2UgYWxsIGF0dHJpYnV0ZSBvdmVycmlkZXMKLQkJLy9uZWVkIHRvIGFwcGx5IHRvIHRoZSB2YWx1ZS4KLQkJcHVibGljIGJvb2xlYW4gaXNSZWxldmFudChTdHJpbmcgb3ZlcnJpZGVOYW1lKSB7Ci0JCQlpZiAoQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0S2V5VHlwZSgpICE9IFR5cGUuRU1CRUREQUJMRV9UWVBFKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQlyZXR1cm4gISBvdmVycmlkZU5hbWUuc3RhcnRzV2l0aChNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyLlJFTEVWQU5UX1BSRUZJWF8pOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlIGF0dHJpYnV0ZSBvdmVycmlkZSBjb250YWluZXIgb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlleHRlbmRzIFZhbHVlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcgotCXsKLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVOYW1lcygpIHsKLQkJCVR5cGVNYXBwaW5nIG92ZXJyaWRkZW5UeXBlTWFwcGluZyA9IHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOwotCQkJcmV0dXJuIChvdmVycmlkZGVuVHlwZU1hcHBpbmcgIT0gbnVsbCkgPyBvdmVycmlkZGVuVHlwZU1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uKHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRPdmVycmlkZVZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBPdmVycmlkZUNvbnRhaW5lciBjb250YWluZXIsIE92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgQXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSwgKEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKSBjb250YWluZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgRW1iZWRkYWJsZU92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIGNvbHVtbk93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIGNvbHVtbiwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBDb2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlleHRlbmRzIFZhbHVlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlpbXBsZW1lbnRzIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wLk93bmVyCi0JewotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzKCkgewotCQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAodHlwZU1hcHBpbmcgIT0gbnVsbCkgPyB0eXBlTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCh0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVWYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUpIG92ZXJyaWRlLCAoQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lciBjb2x1bW5Pd25lciwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlSm9pbkNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSkgb3ZlcnJpZGUsIChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgKFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lcikgY29sdW1uT3duZXIsIChKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgQ29sbGVjdGlvblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIEpwdFZhbGlkYXRvci5OdWxsLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIEpwdFZhbGlkYXRvci5OdWxsLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlUYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIEpwdFZhbGlkYXRvci5OdWxsLmluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgam9pbiBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIE1hcEtleUpvaW5Db2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBNYXBLZXlKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXROYW1lKCkgKyAiX0tFWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyBFbnRpdHkgZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCkgewotCQkJcmV0dXJuIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFJlc29sdmVkTWFwS2V5RW50aXR5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgdGFibGUgbmFtZSBpdCBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcwotCQkgKiB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lLiAgVGhlIHRhYmxlIGlzIGFsd2F5cyB0aGUgY29sbGVjdGlvbiB0YWJsZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpLCB0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZ2V0UmVmZXJlbmNlZENvbHVtbkRiVGFibGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlKb2luQ29sdW1uVmFsaWRhdG9yKAotCQkJCXRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLAotCQkJCShSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwKLQkJCQl0aGlzLCAKLQkJCQkoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwKLQkJCQluZXcgQ29sbGVjdGlvblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlleHRlbmRzIEFic3RyYWN0T3duZXIKLQkJaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1NJQkxFX1BSRUZJWCA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0JCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEVWQU5UX1BSRUZJWF8gPSAia2V5LiI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgVHlwZU1hcHBpbmcgZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCQlUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAob3ZlcnJpZGRlblR5cGVNYXBwaW5nICE9IG51bGwpID8gb3ZlcnJpZGRlblR5cGVNYXBwaW5nLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQb3NzaWJsZVByZWZpeCgpIHsKLQkJCXJldHVybiBQT1NTSUJMRV9QUkVGSVg7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFdyaXRlUHJlZml4KCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0UG9zc2libGVQcmVmaXgoKTsKLQkJfQotCi0JCS8vIHRoZSBvbmx5IHJlbGV2YW50IG92ZXJyaWRlcyBhcmUgdGhvc2UgdGhhdCBzdGFydCB3aXRoICJrZXkuIjsKLQkJLy8gbm8gcHJlZml4IHdpbGwgYmUgYSB2YWx1ZSBhdHRyaWJ1dGUgb3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaXNSZWxldmFudChTdHJpbmcgb3ZlcnJpZGVOYW1lKSB7Ci0JCQlpZiAoQWJzdHJhY3RKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0VmFsdWVUeXBlKCkgIT0gVHlwZS5FTUJFRERBQkxFX1RZUEUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiBvdmVycmlkZU5hbWUuc3RhcnRzV2l0aChSRUxFVkFOVF9QUkVGSVhfKTsKLQkJfQotCi0JCXB1YmxpYyBDb2x1bW4gcmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4oU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW4odGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCksIGF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZE92ZXJyaWRlVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIE92ZXJyaWRlQ29udGFpbmVyIGNvbnRhaW5lciwgT3ZlcnJpZGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlLCAoQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIpIGNvbnRhaW5lciwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBFbWJlZGRhYmxlT3ZlcnJpZGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUJhc2VDb2x1bW4gY29sdW1uLCBSZWFkT25seUJhc2VDb2x1bW4uT3duZXIgY29sdW1uT3duZXIsIFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSwgY29sdW1uLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IENvbGxlY3Rpb25UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FjaGVhYmxlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNhY2hlYWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjg1OTViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FjaGVhYmxlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBjYWNoZWFibGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQ2FjaGVhYmxlMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUNhY2hlYWJsZTJfMAotewotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZENhY2hlYWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0Q2FjaGVhYmxlOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFDYWNoZWFibGUyXzAoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRDYWNoZWFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdENhY2hlYWJsZSh0aGlzLmJ1aWxkRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FjaGVhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzQ2FjaGVhYmxlKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRDYWNoZWFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmRlZmF1bHRDYWNoZWFibGU7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRDYWNoZWFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4gY2FjaGVhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChjYWNoZWFibGUsIHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlKSkgewotCQkJaWYgKGNhY2hlYWJsZSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5yZW1vdmVDYWNoZWFibGVBbm5vdGF0aW9uKCk7Ci0JCQl9IGVsc2UgewotCQkJCUNhY2hlYWJsZTJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q2FjaGVhYmxlQW5ub3RhdGlvbkZvclVwZGF0ZSgpOwotCQkJCUJvb2xlYW4gdmFsdWUgPSBhbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGNhY2hlYWJsZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICEgdmFsdWUuYm9vbGVhblZhbHVlKCkpIHsgIC8vIEBDYWNoZWFibGUoZmFsc2UpCi0JCQkJCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOyAgLy8gc2V0IHRvIEBDYWNoZWFibGUKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCQkJfQotCQkJfQotCi0JCQl0aGlzLnNldFNwZWNpZmllZENhY2hlYWJsZV8oY2FjaGVhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhY2hlYWJsZV8oQm9vbGVhbiBjYWNoZWFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZENhY2hlYWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRDYWNoZWFibGUgPSBjYWNoZWFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZLCBvbGQsIGNhY2hlYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkQ2FjaGVhYmxlKCkgewotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldENhY2hlYWJsZUFubm90YXRpb24oKTsKLQkJaWYgKGFubm90YXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQm9vbGVhbiB2YWx1ZSA9IGFubm90YXRpb24uZ2V0VmFsdWUoKTsKLQkJLy8gQENhY2hlYWJsZSBpcyBlcXVpdmFsZW50IHRvIEBDYWNoZWFibGUodHJ1ZSkKLQkJcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogQm9vbGVhbi5UUlVFOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhY2hlYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2FjaGVhYmxlKGJvb2xlYW4gY2FjaGVhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0Q2FjaGVhYmxlOwotCQl0aGlzLmRlZmF1bHRDYWNoZWFibGUgPSBjYWNoZWFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSwgb2xkLCBjYWNoZWFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYWNoZWFibGUgYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGFubm90YXRpb24gZG9lcyBub3QgZXhpc3RzLgotCSAqLwotCXByb3RlY3RlZCBDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGdldENhY2hlYWJsZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbih0aGlzLmdldENhY2hlYWJsZUFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIHRoZSBhbm5vdGF0aW9uIGlmIGl0IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXByb3RlY3RlZCBDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGdldENhY2hlYWJsZUFubm90YXRpb25Gb3JVcGRhdGUoKSB7Ci0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0Q2FjaGVhYmxlQW5ub3RhdGlvbigpOwotCQlyZXR1cm4gKGFubm90YXRpb24gIT0gbnVsbCkgPyBhbm5vdGF0aW9uIDogdGhpcy5idWlsZENhY2hlYWJsZUFubm90YXRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBidWlsZENhY2hlYWJsZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgdGhpcy5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldENhY2hlYWJsZUFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNhY2hlYWJsZUFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24odGhpcy5nZXRDYWNoZWFibGVBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENhY2hlYWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFDYWNoZWFibGVIb2xkZXIyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFDYWNoZWFibGVIb2xkZXIyXzApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhQ2FjaGVhYmxlSG9sZGVyMl8wIGdldENhY2hlYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZVR5cGUgZ2V0SmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gdGhpcy5nZXRDYWNoZWFibGVBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiAoYW5ub3RhdGlvbiA9PSBudWxsKSA/IG51bGwgOiBhbm5vdGF0aW9uLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmMGE1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQ29sbGVjdGlvblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuSm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFSZWZlcmVuY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBjb2xsZWN0aW9uIHRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMAotCWV4dGVuZHMgR2VuZXJpY0phdmFSZWZlcmVuY2VUYWJsZTxDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSmF2YUNvbGxlY3Rpb25UYWJsZTJfMAotewotCXB1YmxpYyBHZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgYnVpbGRKb2luQ29sdW1uT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbk93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlIGFubm90YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gZ2V0VGFibGVBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHRoaXMuZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXROb25OdWxsQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlVGFibGVBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpLmdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBnZXRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGREZWZhdWx0TmFtZSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZENvbGxlY3Rpb25UYWJsZURlZmF1bHROYW1lKHRoaXMuZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkudmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGpvaW4gY29sdW1uIG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIG93bmVyIGZvciAiYmFjay1wb2ludGVyIiBqb2luIGNvbHVtbnM7Ci0JICogdGhlc2UgcG9pbnQgYXQgdGhlIHNvdXJjZS9vd25pbmcgZW50aXR5Ci0JICovCi0JcHJvdGVjdGVkIGNsYXNzIEpvaW5Db2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIEphdmFSZWFkT25seUpvaW5Db2x1bW4uT3duZXIKLQl7Ci0JCXByb3RlY3RlZCBKb2luQ29sdW1uT3duZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wLnRoaXMuZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkuZ2V0VHlwZU1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChHZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldE5hbWUoKSwgdGFibGVOYW1lKSA/Ci0JCQkJCUdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wLnRoaXMuZ2V0RGJUYWJsZSgpIDoKLQkJCQkJbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbHVtbk5hbWUoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4pIHsKLQkJCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRKb2luQ29sdW1uRGVmYXVsdE5hbWUoKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzKTsKLQkJfQotCi0JCS8qKgotCQkgKiBieSBkZWZhdWx0LCB0aGUgam9pbiBjb2x1bW4gaXMsIG9idmlvdXNseSwgaW4gdGhlIGNvbGxlY3Rpb24gdGFibGU7Ci0JCSAqIG5vdCBzdXJlIHdoZXRoZXIgaXQgY2FuIGJlIGFueXdoZXJlIGVsc2UuLi4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlTmFtZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wLnRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldERlZmF1bHRKb2luQ29sdW1uKCkgPT0gam9pbkNvbHVtbjsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCB0YWJsZSBuYW1lIGl0IG5lZWRzIHRvIGJlIHRoZSBzYW1lCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUuIFRoZSB0YWJsZSBpcyBhbHdheXMgdGhlIGNvbGxlY3Rpb24gdGFibGUuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuICEgU3RyaW5nVG9vbHMuc3RyaW5nc0FyZUVxdWFsKHRoaXMuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpLCB0YWJsZU5hbWUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBqb2luIGNvbHVtbiBjYW4gb25seSBiZSBvbiB0aGUgY29sbGVjdGlvbiB0YWJsZSBpdHNlbGYKLQkJICovCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIEVudGl0eSBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzAudGhpcy5nZXRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKS5nZXRFbnRpdHkoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBudWxsOyAvL0kgKnRoaW5rKiB0aGlzIGlzIGNvcnJlY3QKLQkJCS8vcmV0dXJuIEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wLnRoaXMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIFBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpIHsKLQkJCXJldHVybiBHZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wLnRoaXMuZ2V0Sm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uLCBOYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUpvaW5Db2x1bW4pIGNvbHVtbiwgdGhpcywgKEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBDb2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURlcml2ZWRJZGVudGl0eTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFEZXJpdmVkSWRlbnRpdHkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA1MDM2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YURlcml2ZWRJZGVudGl0eTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5EZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRGVyaXZlZElkZW50aXR5Ml8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YURlcml2ZWRJZGVudGl0eTJfMAotewotCS8qKiB0aGlzIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiAqLwotCXByb3RlY3RlZCBEZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBzdHJhdGVneTsKLQotCXByb3RlY3RlZCBmaW5hbCBKYXZhSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBpZFN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIEphdmFNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBtYXBzSWRTdHJhdGVneTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhRGVyaXZlZElkZW50aXR5Ml8wKEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmlkU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkSWRTdHJhdGVneSgpOwotCQl0aGlzLm1hcHNJZFN0cmF0ZWd5ID0gdGhpcy5idWlsZE1hcHNJZFN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuaWRTdHJhdGVneS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMubWFwc0lkU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuaWRTdHJhdGVneS51cGRhdGUoKTsKLQkJdGhpcy5tYXBzSWRTdHJhdGVneS51cGRhdGUoKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgZ2V0UHJlZG9taW5hbnREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3k7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3RyYXRlZ3koRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgc3RyYXRlZ3kpIHsKLQkJRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgb2xkID0gdGhpcy5zdHJhdGVneTsKLQkJdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJFRE9NSU5BTlRfREVSSVZFRF9JREVOVElUWV9TVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RyYXRlZ3koKSB7Ci0JCXRoaXMuc2V0U3RyYXRlZ3kodGhpcy5idWlsZFN0cmF0ZWd5KCkpOwotCX0KLQotCXByb3RlY3RlZCBEZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBidWlsZFN0cmF0ZWd5KCkgewotCQlpZiAodGhpcy5tYXBzSWRTdHJhdGVneS5pc1NwZWNpZmllZCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5tYXBzSWRTdHJhdGVneTsKLQkJfQotCQlpZiAodGhpcy5pZFN0cmF0ZWd5LmlzU3BlY2lmaWVkKCkpIHsKLQkJCXJldHVybiB0aGlzLmlkU3RyYXRlZ3k7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG51bGwgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMuc3RyYXRlZ3kgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXRoaXMubWFwc0lkU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy5pZFN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSUQgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmlkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJdGhpcy5pZFN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMubWFwc0lkU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmlkU3RyYXRlZ3k7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGJ1aWxkSWRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSmF2YUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHMgSUQgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBnZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwc0lkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXRoaXMubWFwc0lkU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKLQkJdGhpcy5pZFN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMubWFwc0lkU3RyYXRlZ3k7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBidWlsZE1hcHNJZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5zdHJhdGVneSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoKEphdmFKcGFDb250ZXh0Tm9kZSkgdGhpcy5zdHJhdGVneSkuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMocG9zLCBmaWx0ZXIsIGFzdFJvb3QpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQlpZiAodGhpcy5zdHJhdGVneSAhPSBudWxsKSB7Ci0JCQkoKEphdmFKcGFDb250ZXh0Tm9kZSkgdGhpcy5zdHJhdGVneSkudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhZWQxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotewotCXB1YmxpYyBHZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MzUxNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRhYmxlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci0KLS8qKgotICogSlBBIDIuMAotICogSmF2YSBlbWJlZGRhYmxlIHR5cGUgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRhYmxlMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFFbWJlZGRhYmxlCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhRW1iZWRkYWJsZTJfMChKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbWJlZGRhYmxlQW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIG1hcHBpbmdBbm5vdGF0aW9uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyhBTExPV0VEX0FUVFJJQlVURV9NQVBQSU5HX0tFWVMsIGF0dHJpYnV0ZU1hcHBpbmdLZXkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQUxMT1dFRF9BVFRSSUJVVEVfTUFQUElOR19LRVlTID0KLQkJbmV3IFN0cmluZ1tdIHsKLQkJCU1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwKLQkJCU1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwKLQkJCU1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwKLQkJCU1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLAotCQkJTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwKLQkJCU1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksCi0JCQlNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksCi0JCQlNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZCi0JCX07Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGQ0Y2Q4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAKLXsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMChKYXZhRGVyaXZlZElkZW50aXR5Ml8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IHRoaXMudmFsdWUpIHsKLQkJCWlmICh2YWx1ZSkgewotCQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJCX0KLQkJCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhib29sZWFuIHZhbHVlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFubm90YXRpb24oKSAhPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBhbm5vdGF0aW9uICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJZEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChJZEFubm90YXRpb24pIHRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbigpIHsKLQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRGVyaXZlZElkZW50aXR5Ml8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YURlcml2ZWRJZGVudGl0eTJfMCBnZXREZXJpdmVkSWRlbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJhdGVneSgpIHsKLQkJdGhpcy5zZXRWYWx1ZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTdHJhdGVneSgpIHsKLQkJdGhpcy5zZXRWYWx1ZShmYWxzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJLy8gbm8gdmFsaWRhdGlvbiBydWxlcwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSWRBbm5vdGF0aW9uIGFubm90YXRpb24gPSB0aGlzLmdldEFubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0VGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcyODNmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMAotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdElkQXR0cmlidXRlTmFtZTsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAoSmF2YURlcml2ZWRJZGVudGl0eTJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lXyh0aGlzLmJ1aWxkU3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdElkQXR0cmlidXRlTmFtZSh0aGlzLmJ1aWxkRGVmYXVsdElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSUQgYXR0cmlidXRlIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRJZEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZElkQXR0cmlidXRlTmFtZSA6IHRoaXMuZGVmYXVsdElkQXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShTdHJpbmcgaWRBdHRyaWJ1dGVOYW1lKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudChpZEF0dHJpYnV0ZU5hbWUsIHRoaXMuc3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKSkgewotCQkJdGhpcy5nZXRBbm5vdGF0aW9uKCkuc2V0VmFsdWUoaWRBdHRyaWJ1dGVOYW1lKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lXyhpZEF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lXyhTdHJpbmcgaWRBdHRyaWJ1dGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZElkQXR0cmlidXRlTmFtZTsKLQkJdGhpcy5zcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUgPSBpZEF0dHJpYnV0ZU5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfSURfQVRUUklCVVRFX05BTUVfUFJPUEVSVFksIG9sZCwgaWRBdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkU3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uKCkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRJZEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRJZEF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdElkQXR0cmlidXRlTmFtZShTdHJpbmcgaWRBdHRyaWJ1dGVOYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRJZEF0dHJpYnV0ZU5hbWU7Ci0JCXRoaXMuZGVmYXVsdElkQXR0cmlidXRlTmFtZSA9IGlkQXR0cmlidXRlTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSURfQVRUUklCVVRFX05BTUVfUFJPUEVSVFksIG9sZCwgaWRBdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdElkQXR0cmlidXRlTmFtZSgpIHsKLQkJSXRlcmF0b3I8QXR0cmlidXRlTWFwcGluZz4gc3RyZWFtID0gdGhpcy5nZXRJZEF0dHJpYnV0ZU1hcHBpbmdzKCkuaXRlcmF0b3IoKTsKLQkJaWYgKHN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkvLyByZXR1cm4gbnVsbCBpZiB3ZSBoYXZlIG1vcmUgdGhhbiBvbmUgaWQgbWFwcGluZwotCQkJcmV0dXJuIHN0cmVhbS5oYXNOZXh0KCkgPyBudWxsIDogbWFwcGluZy5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7ICAvLyBlbXB0eQotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRJZEF0dHJpYnV0ZU5hbWVJc1Bvc3NpYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBEbyA8ZW0+bm90PC9lbT4gcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXByb3RlY3RlZCBNYXBzSWQyXzBBbm5vdGF0aW9uIGdldEFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoTWFwc0lkMl8wQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldE5vbk51bGxBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBwcmVzZW50LgotCSAqLwotCXByb3RlY3RlZCBNYXBzSWQyXzBBbm5vdGF0aW9uIGdldEFubm90YXRpb25Pck51bGwoKSB7Ci0JCXJldHVybiAoTWFwc0lkMl8wQW5ub3RhdGlvbikgdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKCkgewotCQl0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbih0aGlzLmdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5yZW1vdmVBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcHNJZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhRGVyaXZlZElkZW50aXR5Ml8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YURlcml2ZWRJZGVudGl0eTJfMCBnZXREZXJpdmVkSWRlbnRpdHkoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBnZXRSZXNvdXJjZUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0T3duaW5nVHlwZU1hcHBpbmcoKS5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYW5kaWRhdGVJZEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnQodGhpcy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5nQ2hvaWNlTmFtZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsQXR0cmlidXRlTWFwcGluZ0Nob2ljZU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgU3RyaW5nPih0aGlzLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmcuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX07Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKHRoaXMuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkQXR0cmlidXRlTWFwcGluZ0Nob2ljZXMoSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gYXR0cmlidXRlTWFwcGluZ3MpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPih0aGlzLmdldEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VJdGVyYWJsZXMoYXR0cmlidXRlTWFwcGluZ3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlICNnZXRFbWJlZGRlZElkTWFwcGluZ0Nob2ljZUl0ZXJhYmxlKEVtYmVkZGVkSWRNYXBwaW5nKQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPj4gZ2V0QXR0cmlidXRlTWFwcGluZ0Nob2ljZUl0ZXJhYmxlcyhJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBhdmFpbGFibGVNYXBwaW5ncykgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4+KGF2YWlsYWJsZU1hcHBpbmdzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiB0cmFuc2Zvcm0oQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKG1hcHBpbmcuZ2V0S2V5KCksIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpIHsKLQkJCQkJcmV0dXJuIEdlbmVyaWNKYXZhTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAudGhpcy5nZXRFbWJlZGRlZElkTWFwcGluZ0Nob2ljZUl0ZXJhYmxlKChFbWJlZGRlZElkTWFwcGluZykgbWFwcGluZyk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+KG1hcHBpbmcpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBtYXBwaW5nIGludG8gYSBjb2xsZWN0aW9uIG9mIGl0cyAibWFwcGluZ3MiLgotCSAqIFR5cGljYWxseSwgdGhpcyBjb2xsZWN0aW9uIHdpbGwgaW5jbHVkZSBqdXN0IHRoZSBtYXBwaW5nIGl0c2VsZjsKLQkgKiBidXQsIGlmIHRoZSBtYXBwaW5nIGlzIGFuIGVtYmVkZGVkIElELCB0aGlzIGNvbGxlY3Rpb24gd2lsbCBpbmNsdWRlCi0JICogdGhlIG1hcHBpbmcgaXRzZWxmIHBsdXMgYWxsIHRoZSBtYXBwaW5ncyBvZiBpdHMgdGFyZ2V0IGVtYmVkZGFibGUuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEVtYmVkZGVkSWRNYXBwaW5nQ2hvaWNlSXRlcmFibGUoRW1iZWRkZWRJZE1hcHBpbmcgbWFwcGluZykgewotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBtYXBwaW5nLmdldFRhcmdldEVtYmVkZGFibGUoKTsKLQkJaWYgKGVtYmVkZGFibGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4obWFwcGluZyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPigKLQkJCQltYXBwaW5nLAotCQkJCUNvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGVtYmVkZGFibGUuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSkKLQkJCSk7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZU1hcHBpbmcgZ2V0RGVyaXZlZElkQXR0cmlidXRlTWFwcGluZygpIHsKLQkJU3RyaW5nIGlkQXR0cmlidXRlTmFtZSA9IHRoaXMuZ2V0SWRBdHRyaWJ1dGVOYW1lKCk7Ci0JCWlmIChpZEF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgewotCQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgOiB0aGlzLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKCkpIHsKLQkJCQlpZiAoaWRBdHRyaWJ1dGVOYW1lLmVxdWFscyhtYXBwaW5nLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmc7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBbm5vdGF0aW9uT3JOdWxsKCkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdHJhdGVneSgpIHsKLQkJaWYgKHRoaXMuZ2V0QW5ub3RhdGlvbk9yTnVsbCgpID09IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7Ci0JCWlmICh0aGlzLmdldEFubm90YXRpb25Pck51bGwoKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZUFubm90YXRpb24oKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBKYXZhIGNvbXBsZXRpb24gcHJvcG9zYWxzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKGludCBwb3MsIEZpbHRlcjxTdHJpbmc+IGZpbHRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiByZXN1bHQgPSBzdXBlci5nZXRKYXZhQ29tcGxldGlvblByb3Bvc2Fscyhwb3MsIGZpbHRlciwgYXN0Um9vdCk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlpZiAodGhpcy5nZXRBbm5vdGF0aW9uKCkudmFsdWVUb3VjaGVzKHBvcywgYXN0Um9vdCkpIHsKLQkJCXJlc3VsdCA9IHRoaXMuZ2V0U29ydGVkSmF2YVZhbHVlQ2hvaWNlcyhmaWx0ZXIpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkSmF2YVZhbHVlQ2hvaWNlcyhGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFscyhuZXcgRmlsdGVyaW5nSXRlcmFibGU8U3RyaW5nPih0aGlzLmdldFNvcnRlZENhbmRpZGF0ZUlkQXR0cmlidXRlTmFtZXMoKSwgZmlsdGVyKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElEIG1hcHBpbmdzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRJZEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+KHRoaXMuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNKYXZhTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAudGhpcy5tYXBwaW5nSXNJZE1hcHBpbmcobWFwcGluZyk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFwcGluZ0lzSWRNYXBwaW5nKEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0SWRNYXBwaW5nS2V5cygpLCBtYXBwaW5nLmdldEtleSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRJZE1hcHBpbmdLZXlzKCkgewotCQlyZXR1cm4gSURfTUFQUElOR19LRVlTOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gSURfTUFQUElOR19LRVlTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLAotCQlNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkKLQl9OwotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBJRF9NQVBQSU5HX0tFWVMgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KElEX01BUFBJTkdfS0VZU19BUlJBWSk7Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIsIGFzdFJvb3QpOwotCQl0aGlzLnZhbGlkYXRlTWFwc0lkKG1lc3NhZ2VzLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcHNJZChMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJaWYgKHRoaXMuZ2V0RGVyaXZlZElkZW50aXR5KCkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpIHsKLQkJCXRoaXMudmFsaWRhdGVNYXBzSWRfKG1lc3NhZ2VzLCBhc3RSb290KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwc0lkXyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gdGVzdCB3aGV0aGVyIGlkIGF0dHJpYnV0ZSBuYW1lIGNhbiBiZSByZXNvbHZlZAotCQlBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcgPSB0aGlzLmdldERlcml2ZWRJZEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCkgewotCQkJLy8gaWYgaWQgYXR0cmlidXRlIG5hbWUgaXMgbm90IHNwZWNpZmllZCwgdXNlIHRoYXQgbWVzc2FnZQotCQkJaWYgKHRoaXMuc3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCQltZXNzYWdlcy5hZGQodGhpcy5idWlsZE1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFNfSURfVkFMVUVfTk9UX1NQRUNJRklFRCwgRU1QVFlfU1RSSU5HX0FSUkFZLCBhc3RSb290KSk7Ci0JCQl9IGVsc2UgewotCQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQsIG5ldyBTdHJpbmdbXSB7dGhpcy5nZXRJZEF0dHJpYnV0ZU5hbWUoKX0sIGFzdFJvb3QpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHRlc3Qgd2hldGhlciBhdHRyaWJ1dGUgbWFwcGluZyBpcyBhbGxvd2FibGUKLQkJCWlmICggISBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRWYWxpZEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKCksIGF0dHJpYnV0ZU1hcHBpbmcpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRNZXNzYWdlKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBTX0lEX1ZBTFVFX0lOVkFMSUQsIG5ldyBTdHJpbmdbXSB7dGhpcy5nZXRJZEF0dHJpYnV0ZU5hbWUoKX0sIGFzdFJvb3QpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRWYWxpZEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKHRoaXMuZ2V0SWRBdHRyaWJ1dGVNYXBwaW5ncygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1lc3NhZ2UgYnVpbGRNZXNzYWdlKFN0cmluZyBtc2dJRCwgU3RyaW5nW10gcGFybXMsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVEZXNjcmlwdGlvbiA9IGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSA/Ci0JCQkJSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfREVTQyA6Ci0JCQkJSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuQVRUUklCVVRFX0RFU0M7Ci0JCWF0dHJpYnV0ZURlc2NyaXB0aW9uID0gTkxTLmJpbmQoYXR0cmlidXRlRGVzY3JpcHRpb24sIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlwYXJtcyA9IEFycmF5VG9vbHMuYWRkKHBhcm1zLCAwLCBhdHRyaWJ1dGVEZXNjcmlwdGlvbik7Ci0JCXJldHVybiBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCW1zZ0lELAotCQkJCXBhcm1zLAotCQkJCXRoaXMsCi0JCQkJdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpCi0JCQkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRBbm5vdGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QW5ub3RhdGlvbigpLmdldFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU5hbWVkUXVlcnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWRRdWVyeTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzYxZDQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTmFtZWRRdWVyeTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKgotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTG9ja01vZGVUeXBlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTmFtZWRRdWVyeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIEphdmEgbmFtZWQgcXVlcnkKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTmFtZWRRdWVyeTJfMAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhUXVlcnk8TmFtZWRRdWVyeTJfMEFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKYXZhTmFtZWRRdWVyeTJfMAotewotCXByb3RlY3RlZCBMb2NrTW9kZVR5cGUyXzAgc3BlY2lmaWVkTG9ja01vZGU7Ci0JcHJvdGVjdGVkIExvY2tNb2RlVHlwZTJfMCBkZWZhdWx0TG9ja01vZGU7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU5hbWVkUXVlcnkyXzAoSmF2YUpwYUNvbnRleHROb2RlIHBhcmVudCwgTmFtZWRRdWVyeTJfMEFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgcXVlcnlBbm5vdGF0aW9uKTsKLQkJdGhpcy5zcGVjaWZpZWRMb2NrTW9kZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRMb2NrTW9kZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZExvY2tNb2RlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTG9ja01vZGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0TG9ja01vZGUodGhpcy5idWlsZERlZmF1bHRMb2NrTW9kZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9jayBtb2RlICoqKioqKioqKioKLQotCXB1YmxpYyBMb2NrTW9kZVR5cGUyXzAgZ2V0TG9ja01vZGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRMb2NrTW9kZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTG9ja01vZGUgOiB0aGlzLmRlZmF1bHRMb2NrTW9kZTsKLQl9Ci0KLQlwdWJsaWMgTG9ja01vZGVUeXBlMl8wIGdldFNwZWNpZmllZExvY2tNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMb2NrTW9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAgbG9ja01vZGUpIHsKLQkJdGhpcy5xdWVyeUFubm90YXRpb24uc2V0TG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLnRvSmF2YVJlc291cmNlTW9kZWwobG9ja01vZGUpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMb2NrTW9kZV8obG9ja01vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZExvY2tNb2RlXyhMb2NrTW9kZVR5cGUyXzAgbG9ja01vZGUpIHsKLQkJTG9ja01vZGVUeXBlMl8wIG9sZCA9IHRoaXMuc3BlY2lmaWVkTG9ja01vZGU7Ci0JCXRoaXMuc3BlY2lmaWVkTG9ja01vZGUgPSBsb2NrTW9kZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9MT0NLX01PREVfUFJPUEVSVFksIG9sZCwgbG9ja01vZGUpOwotCX0KLQotCXByb3RlY3RlZCBMb2NrTW9kZVR5cGUyXzAgYnVpbGRTcGVjaWZpZWRMb2NrTW9kZSgpIHsKLQkJcmV0dXJuIExvY2tNb2RlVHlwZTJfMC5mcm9tSmF2YVJlc291cmNlTW9kZWwodGhpcy5xdWVyeUFubm90YXRpb24uZ2V0TG9ja01vZGUoKSk7Ci0JfQotCi0JcHVibGljIExvY2tNb2RlVHlwZTJfMCBnZXREZWZhdWx0TG9ja01vZGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRMb2NrTW9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TG9ja01vZGUoTG9ja01vZGVUeXBlMl8wIGxvY2tNb2RlKSB7Ci0JCUxvY2tNb2RlVHlwZTJfMCBvbGQgPSB0aGlzLmRlZmF1bHRMb2NrTW9kZTsKLQkJdGhpcy5kZWZhdWx0TG9ja01vZGUgPSBsb2NrTW9kZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfTE9DS19NT0RFX1BST1BFUlRZLCBvbGQsIGxvY2tNb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTG9ja01vZGVUeXBlMl8wIGJ1aWxkRGVmYXVsdExvY2tNb2RlKCkgewotCQlyZXR1cm4gTG9ja01vZGVUeXBlMl8wLk5PTkU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRdWVyeV8oSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlxdWVyeUhlbHBlci52YWxpZGF0ZSh0aGlzLCB0aGlzLnF1ZXJ5LCB0aGlzLmdldFF1ZXJ5QW5ub3RhdGlvbigpLmdldFF1ZXJ5VGV4dFJhbmdlKGFzdFJvb3QpLCAxLCBtZXNzYWdlcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudGljYWwoUXVlcnkgcXVlcnkpIHsKLQkJcmV0dXJuIHN1cGVyLmlzSWRlbnRpY2FsKHF1ZXJ5KSAmJgotCQkJCXRoaXMuZ2V0U3BlY2lmaWVkTG9ja01vZGUoKSA9PSAoKEdlbmVyaWNKYXZhTmFtZWRRdWVyeTJfMClxdWVyeSkuZ2V0U3BlY2lmaWVkTG9ja01vZGUoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JcHVibGljIENsYXNzPE5hbWVkUXVlcnk+IGdldFR5cGUoKSB7Ci0JCXJldHVybiBOYW1lZFF1ZXJ5LmNsYXNzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9yZGVyQ29sdW1uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9yZGVyQ29sdW1uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmM2NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPcmRlckNvbHVtbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgb3JkZXIgY29sdW1uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YU9yZGVyQ29sdW1uMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFOYW1lZENvbHVtbjxPcmRlckNvbHVtbjJfMEFubm90YXRpb24sIEphdmFSZWFkT25seU5hbWVkQ29sdW1uLk93bmVyPgotCWltcGxlbWVudHMgSmF2YU9yZGVyQ29sdW1uMl8wCi17Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkTnVsbGFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE51bGxhYmxlOwotCi0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0SW5zZXJ0YWJsZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZFVwZGF0YWJsZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0VXBkYXRhYmxlOwotCi0JLy8gSlBBIDEuMAotCXByb3RlY3RlZCBPcmRlckNvbHVtbjJfMEFubm90YXRpb24gbnVsbENvbHVtbkFubm90YXRpb247Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YU9yZGVyQ29sdW1uMl8wKEphdmFPcmRlcmFibGUyXzAgcGFyZW50LCBKYXZhUmVhZE9ubHlOYW1lZENvbHVtbi5Pd25lciBvd25lcikgewotCQlzdXBlcihwYXJlbnQsIG93bmVyKTsKLQkJdGhpcy5zcGVjaWZpZWROdWxsYWJsZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWROdWxsYWJsZSgpOwotCQl0aGlzLnNwZWNpZmllZEluc2VydGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkSW5zZXJ0YWJsZSgpOwotCQl0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRVcGRhdGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWROdWxsYWJsZV8odGhpcy5idWlsZFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZEluc2VydGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFVwZGF0YWJsZV8odGhpcy5idWlsZFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHROdWxsYWJsZSh0aGlzLmJ1aWxkRGVmYXVsdE51bGxhYmxlKCkpOwotCQl0aGlzLnNldERlZmF1bHRJbnNlcnRhYmxlKHRoaXMuYnVpbGREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0VXBkYXRhYmxlKHRoaXMuYnVpbGREZWZhdWx0VXBkYXRhYmxlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJZiB3ZSBhcmUgaW4gYSBKUEEgMS4wIHByb2plY3QsIHJldHVybiBhIG51bGwgYW5ub3RhdGlvbi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKSB7Ci0JCS8vIGhtbW1tLi4uCi0JCXJldHVybiB0aGlzLmlzSnBhMl8wQ29tcGF0aWJsZSgpID8KLQkJCQkoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSB0aGlzLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgOgotCQkJCXRoaXMuZ2V0TnVsbENvbHVtbkFubm90YXRpb24oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGdldE51bGxDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQlpZiAodGhpcy5udWxsQ29sdW1uQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQl0aGlzLm51bGxDb2x1bW5Bbm5vdGF0aW9uID0gdGhpcy5idWlsZE51bGxDb2x1bW5Bbm5vdGF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubnVsbENvbHVtbkFubm90YXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBidWlsZE51bGxDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQkvLyBobW1tbS4uLgotCQlyZXR1cm4gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5pbnN0YW5jZSgpLmJ1aWxkTnVsbEFubm90YXRpb24odGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQlpZiAodGhpcy5pc0pwYTJfMENvbXBhdGlibGUoKSkgewotCQkJdGhpcy5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLnJlbW92ZUFubm90YXRpb24oT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbnVsbGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE51bGxhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWROdWxsYWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0TnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTnVsbGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWROdWxsYWJsZSwgbnVsbGFibGUpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXROdWxsYWJsZShudWxsYWJsZSk7Ci0JCQl0aGlzLnJlbW92ZUNvbHVtbkFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE51bGxhYmxlXyhudWxsYWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWROdWxsYWJsZV8oQm9vbGVhbiBudWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkTnVsbGFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSBudWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwgb2xkLCBudWxsYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldE51bGxhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHROdWxsYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0TnVsbGFibGUoYm9vbGVhbiBudWxsYWJsZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdE51bGxhYmxlOwotCQl0aGlzLmRlZmF1bHROdWxsYWJsZSA9IG51bGxhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9OVUxMQUJMRV9QUk9QRVJUWSwgb2xkLCBudWxsYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGREZWZhdWx0TnVsbGFibGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX05VTExBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZEluc2VydGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEluc2VydGFibGUuYm9vbGVhblZhbHVlKCkgOiB0aGlzLmlzRGVmYXVsdEluc2VydGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbiBpbnNlcnRhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZEluc2VydGFibGUsIGluc2VydGFibGUpKSB7Ci0JCQl0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5zZXRJbnNlcnRhYmxlKGluc2VydGFibGUpOwotCQkJdGhpcy5yZW1vdmVDb2x1bW5Bbm5vdGF0aW9uSWZVbnNldCgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlXyhpbnNlcnRhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGVfKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZLCBvbGQsIGluc2VydGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQW5ub3RhdGlvbigpLmdldEluc2VydGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0SW5zZXJ0YWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0SW5zZXJ0YWJsZShib29sZWFuIGluc2VydGFibGUpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLmRlZmF1bHRJbnNlcnRhYmxlOwotCQl0aGlzLmRlZmF1bHRJbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkLCBpbnNlcnRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9JTlNFUlRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0VXBkYXRhYmxlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRVcGRhdGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCWlmICh0aGlzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSwgdXBkYXRhYmxlKSkgewotCQkJdGhpcy5nZXRDb2x1bW5Bbm5vdGF0aW9uKCkuc2V0VXBkYXRhYmxlKHVwZGF0YWJsZSk7Ci0JCQl0aGlzLnJlbW92ZUNvbHVtbkFubm90YXRpb25JZlVuc2V0KCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZFVwZGF0YWJsZV8odXBkYXRhYmxlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFVwZGF0YWJsZV8oQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB1cGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZLCBvbGQsIHVwZGF0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbkFubm90YXRpb24oKS5nZXRVcGRhdGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRVcGRhdGFibGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFVwZGF0YWJsZShib29sZWFuIHVwZGF0YWJsZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdFVwZGF0YWJsZTsKLQkJdGhpcy5kZWZhdWx0VXBkYXRhYmxlID0gdXBkYXRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9VUERBVEFCTEVfUFJPUEVSVFksIG9sZCwgdXBkYXRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1VQREFUQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU9yZGVyYWJsZTJfMCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YU9yZGVyYWJsZTJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFPcmRlcmFibGUyXzAgZ2V0T3JkZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQXR0cmlidXRlIGdldFJlc291cmNlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPcmRlcmFibGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE9yZGVyYWJsZSgpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU9ycGhhblJlbW92YWwyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGRkYWJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBvcnBoYW4gcmVtb3ZhbAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPcnBoYW5SZW1vdmFsMl8wCi0JCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQkJaW1wbGVtZW50cyBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wCi17Ci0JcHJvdGVjdGVkIEJvb2xlYW4gc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWZhdWx0T3JwaGFuUmVtb3ZhbDsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhT3JwaGFuUmVtb3ZhbDJfMChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsID0gdGhpcy5idWlsZFNwZWNpZmllZE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsXyh0aGlzLmJ1aWxkU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRPcnBoYW5SZW1vdmFsKHRoaXMuYnVpbGREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3JwaGFuIHJlbW92YWwgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbC5ib29sZWFuVmFsdWUoKSA6IHRoaXMuZGVmYXVsdE9ycGhhblJlbW92YWw7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQob3JwaGFuUmVtb3ZhbCwgdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsKSkgewotCQkJdGhpcy5nZXRNYXBwaW5nQW5ub3RhdGlvbkZvclVwZGF0ZSgpLnNldE9ycGhhblJlbW92YWwob3JwaGFuUmVtb3ZhbCk7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWxfKG9ycGhhblJlbW92YWwpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbF8oQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsOwotCQl0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWwgPSBvcnBoYW5SZW1vdmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZLCBvbGQsIG9ycGhhblJlbW92YWwpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHsKLQkJT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRPcnBoYW5SZW1vdmFsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRPcnBoYW5SZW1vdmFsKGJvb2xlYW4gb3JwaGFuUmVtb3ZhbCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuZGVmYXVsdE9ycGhhblJlbW92YWw7Ci0JCXRoaXMuZGVmYXVsdE9ycGhhblJlbW92YWwgPSBvcnBoYW5SZW1vdmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9PUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSwgb2xkLCBvcnBoYW5SZW1vdmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gREVGQVVMVF9PUlBIQU5fUkVNT1ZBTDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZykgdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKSB7Ci0JCXJldHVybiAoT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24pIHRoaXMuZ2V0TWFwcGluZygpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE93bmluZ1JlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uIGdldE1hcHBpbmdBbm5vdGF0aW9uRm9yVXBkYXRlKCkgewotCQlyZXR1cm4gKE93bmluZ1JlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uKSB0aGlzLmdldE1hcHBpbmcoKS5nZXRBbm5vdGF0aW9uRm9yVXBkYXRlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSB0aGlzLmdldEFubm90YXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEFubm90YXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IHRoaXMuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIChhbm5vdGF0aW9uID09IG51bGwpID8gbnVsbCA6IGFubm90YXRpb24uZ2V0T3JwaGFuUmVtb3ZhbFRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE3YWI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneQotewotCXB1YmxpYyBHZW5lcmljSmF2YU92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAoSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIGFubm90YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpvaW5UYWJsZUFubm90YXRpb24gZ2V0Sm9pblRhYmxlQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkuZ2V0Tm9uTnVsbEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luVGFibGVBbm5vdGF0aW9uIGFkZEpvaW5UYWJsZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmdldE92ZXJyaWRlQW5ub3RhdGlvbigpLmFkZEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUpvaW5UYWJsZUFubm90YXRpb24oKSB7Ci0JCXRoaXMuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCkucmVtb3ZlSm9pblRhYmxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGdldE92ZXJyaWRlQW5ub3RhdGlvbigpIHsKLQkJLy8gb25seSBKUEEgMi4wIGFzc29jaWF0aW9uIG92ZXJyaWRlcyBjYW4gaGF2ZSBhIGpvaW4gdGFibGUgKGpvaW4gc3RyYXRlZ3kpCi0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0T3ZlcnJpZGVBbm5vdGF0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIGdldFJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlUYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5idWlsZEpvaW5UYWJsZVZhbGlkYXRvcigoUmVhZE9ubHlKb2luVGFibGUpIHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWY1ZTE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuQm9keVNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgSmF2YSBwZXJzaXN0ZW50IHR5cGUuCi0gKiBTdXBwb3J0IGZvciBzcGVjaWZpZWQgYWNjZXNzIGFuZCBtZXRhbW9kZWwgZ2VuZXJhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzAKLQlleHRlbmRzIEFic3RyYWN0SmF2YVBlcnNpc3RlbnRUeXBlCi0JaW1wbGVtZW50cyBKYXZhUGVyc2lzdGVudFR5cGUyXzAKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY2xhcmluZ1R5cGVOYW1lOwotCi0JcHJvdGVjdGVkIGZpbmFsIE1ldGFtb2RlbFNvdXJjZVR5cGUuU3luY2hyb25pemVyIG1ldGFtb2RlbFN5bmNocm9uaXplcjsKLQotCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzAoUGVyc2lzdGVudFR5cGUuT3duZXIgcGFyZW50LCBKYXZhUmVzb3VyY2VUeXBlIGpydCkgewotCQlzdXBlcihwYXJlbnQsIGpydCk7Ci0JCXRoaXMuZGVjbGFyaW5nVHlwZU5hbWUgPSB0aGlzLmJ1aWxkRGVjbGFyaW5nVHlwZU5hbWUoKTsKLQkJdGhpcy5tZXRhbW9kZWxTeW5jaHJvbml6ZXIgPSB0aGlzLmJ1aWxkTWV0YW1vZGVsU3luY2hyb25pemVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0RGVjbGFyaW5nVHlwZU5hbWUodGhpcy5idWlsZERlY2xhcmluZ1R5cGVOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWNsYXJpbmcgdHlwZSBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVjbGFyaW5nVHlwZU5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmRlY2xhcmluZ1R5cGVOYW1lOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlY2xhcmluZ1R5cGVOYW1lKFN0cmluZyBkZWNsYXJpbmdUeXBlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWNsYXJpbmdUeXBlTmFtZTsKLQkJdGhpcy5kZWNsYXJpbmdUeXBlTmFtZSA9IGRlY2xhcmluZ1R5cGVOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVDTEFSSU5HX1RZUEVfTkFNRV9QUk9QRVJUWSwgb2xkLCBkZWNsYXJpbmdUeXBlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlY2xhcmluZ1R5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZVR5cGUuZ2V0RGVjbGFyaW5nVHlwZU5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCXB1YmxpYyBJRmlsZSBnZXRNZXRhbW9kZWxGaWxlKCkgewotCQlyZXR1cm4gdGhpcy5tZXRhbW9kZWxTeW5jaHJvbml6ZXIuZ2V0RmlsZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVNZXRhbW9kZWwoKSB7Ci0JCS8vIGRvIG5vdGhpbmcgLSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2FsbGVkLi4uCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYW5hZ2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZU1ldGFtb2RlbChNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSkgewotCQl0aGlzLm1ldGFtb2RlbFN5bmNocm9uaXplci5zeW5jaHJvbml6ZShtZW1iZXJUeXBlVHJlZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRCb2R5U291cmNlT24oQm9keVNvdXJjZVdyaXRlciBwdywgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUpIHsKLQkJdGhpcy5tZXRhbW9kZWxTeW5jaHJvbml6ZXIucHJpbnRCb2R5U291cmNlT24ocHcsIG1lbWJlclR5cGVUcmVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlTWV0YW1vZGVsKCkgewotCQkvLyBkbyBub3RoaW5nIC0gcHJvYmFibHkgc2hvdWxkbid0IGJlIGNhbGxlZC4uLgotCX0KLQotCXByb3RlY3RlZCBNZXRhbW9kZWxTb3VyY2VUeXBlLlN5bmNocm9uaXplciBidWlsZE1ldGFtb2RlbFN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SnBhRmFjdG9yeTJfMCgpLmJ1aWxkTWV0YW1vZGVsU3luY2hyb25pemVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk3OTFhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb247Ci0KLS8qKgotICogSlBBIDIuMAotICogSmF2YSBzZXF1ZW5jZSBnZW5lcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAKLQlleHRlbmRzIEFic3RyYWN0SmF2YVNlcXVlbmNlR2VuZXJhdG9yPFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEphdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMAotewotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkQ2F0YWxvZzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRTY2hlbWE7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U2NoZW1hOwotCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMChKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGdlbmVyYXRvckFubm90YXRpb24pOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldENhdGFsb2coKTsKLQkJdGhpcy5zcGVjaWZpZWRTY2hlbWEgPSBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNjaGVtYSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKHRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRDYXRhbG9nKCkpOwotCQl0aGlzLnNldFNwZWNpZmllZFNjaGVtYV8odGhpcy5nZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENhdGFsb2cgOiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCXRoaXMuZ2VuZXJhdG9yQW5ub3RhdGlvbi5zZXRDYXRhbG9nKGNhdGFsb2cpOwotCQl0aGlzLnNldFNwZWNpZmllZENhdGFsb2dfKGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZENhdGFsb2dfKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNwZWNpZmllZENhdGFsb2c7Ci0JCXRoaXMuc3BlY2lmaWVkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5kZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkU2NoZW1hICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRTY2hlbWEgOiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQl0aGlzLmdlbmVyYXRvckFubm90YXRpb24uc2V0U2NoZW1hKHNjaGVtYSk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyhzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRTY2hlbWE7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSwgb2xkLCBzY2hlbWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudGljYWwoR2VuZXJhdG9yIGdlbmVyYXRvcikgewotCQlyZXR1cm4gc3VwZXIuaXNJZGVudGljYWwoZ2VuZXJhdG9yKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldFNwZWNpZmllZFNjaGVtYSgpLCAoKChHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wKWdlbmVyYXRvcikuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSwgKCgoR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMClnZW5lcmF0b3IpLmdldFNwZWNpZmllZENhdGFsb2coKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmlydHVhbE92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkZDQxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSwgUmVhZE9ubHlUYWJsZS5Pd25lcgotewotCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5UYWJsZSBqb2luVGFibGU7Ci0KLQotCXB1YmxpYyBHZW5lcmljSmF2YVZpcnR1YWxPdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wKEphdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUpvaW5UYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBKYXZhVmlydHVhbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5UYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRKb2luVGFibGUoSmF2YVZpcnR1YWxKb2luVGFibGUgam9pblRhYmxlKSB7Ci0JCUphdmFWaXJ0dWFsSm9pblRhYmxlIG9sZCA9IHRoaXMuam9pblRhYmxlOwotCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpPSU5fVEFCTEVfUFJPUEVSVFksIG9sZCwgam9pblRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luVGFibGUoKSB7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlIG92ZXJyaWRkZW5Kb2luVGFibGUgPSB0aGlzLmdldE92ZXJyaWRkZW5Kb2luVGFibGUoKTsKLQkJaWYgKG92ZXJyaWRkZW5Kb2luVGFibGUgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEpvaW5UYWJsZShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgJiYgKHRoaXMuam9pblRhYmxlLmdldE92ZXJyaWRkZW5UYWJsZSgpID09IG92ZXJyaWRkZW5Kb2luVGFibGUpKSB7Ci0JCQkJdGhpcy5qb2luVGFibGUudXBkYXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0Sm9pblRhYmxlKHRoaXMuYnVpbGRKb2luVGFibGUob3ZlcnJpZGRlbkpvaW5UYWJsZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5Sm9pblRhYmxlIGdldE92ZXJyaWRkZW5Kb2luVGFibGUoKSB7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgb3ZlcnJpZGRlblN0cmF0ZWd5ID0gdGhpcy5nZXRPdmVycmlkZGVuU3RyYXRlZ3koKTsKLQkJcmV0dXJuIChvdmVycmlkZGVuU3RyYXRlZ3kgPT0gbnVsbCkgPyBudWxsIDogb3ZlcnJpZGRlblN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVmlydHVhbEpvaW5UYWJsZSBidWlsZEpvaW5UYWJsZShSZWFkT25seUpvaW5UYWJsZSBvdmVycmlkZGVuSm9pblRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYUZhY3RvcnkoKS5idWlsZEphdmFWaXJ0dWFsSm9pblRhYmxlKHRoaXMsIHRoaXMsIG92ZXJyaWRkZW5Kb2luVGFibGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldE92ZXJyaWRkZW5TdHJhdGVneSgpIHsKLQkJUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gdGhpcy5nZXRPdmVycmlkZGVuSm9pblRhYmxlUmVsYXRpb25zaGlwKCk7Ci0JCXJldHVybiAocmVsYXRpb25zaGlwID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcC5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBnZXRPdmVycmlkZGVuSm9pblRhYmxlUmVsYXRpb25zaGlwKCkgewotCQlSZWFkT25seVJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgPSB0aGlzLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKCk7Ci0JCXJldHVybiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXApID8gKFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwKSByZWxhdGlvbnNoaXAgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZURlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pblRhYmxlRGVmYXVsdE5hbWUodGhpcy5nZXRSZWxhdGlvbnNoaXAoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyLCBhc3RSb290KTsKLQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuam9pblRhYmxlLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlciwgYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFR5cGVNYXBwaW5nKCkudmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZFRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5VGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoKFJlYWRPbmx5Sm9pblRhYmxlKSB0YWJsZSwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhmY2VjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmFzaWNNYXBwaW5nRGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YUJhc2ljTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAgPSBuZXcgU3RyaW5nW10gewotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlNzVhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLkpwYUZhY3RvcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Mb2JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ0RlZmluaXRpb24yXzAKLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24odGhpcy5nZXRBbm5vdGF0aW9uTmFtZSgpKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZID0gbmV3IFN0cmluZ1tdIHsKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJSlBBLkFUVFJJQlVURV9PVkVSUklERVMsCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TLAotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCVRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVkpOwotCi0JcHVibGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBKcGFGYWN0b3J5IGZhY3RvcnkpIHsKLQkJcmV0dXJuICgoSnBhRmFjdG9yeTJfMCkgZmFjdG9yeSkuYnVpbGRKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGYxOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW1iZWRkYWJsZURlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkYWJsZURlZmluaXRpb24yXzAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCA9IG5ldyBTdHJpbmdbXSB7Ci0JCUFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FCi0JfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzApOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE0Y2E2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAgPSBuZXcgU3RyaW5nW10gewotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNiMjc1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotcHVibGljIGNsYXNzIEphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb24yXzAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAgPSBuZXcgU3RyaW5nW10gewotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLAotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAgPSBuZXcgQXJyYXlJdGVyYWJsZTxTdHJpbmc+KFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzApOwotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVMgPSBuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPigKLQkJREVMRUdBVEUuZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpLAotCQlTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wCi0JKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbnRpdHlEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW50aXR5RGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjZjMDNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbnRpdHlEZWZpbml0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW50aXR5RGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YUVudGl0eURlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YUVudGl0eURlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFFbnRpdHlEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAgPSBuZXcgU3RyaW5nW10gewotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YUlkTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjNDM5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKUEEgMi4wIElkIG1hcHBpbmcKLSAqLwotcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFubm90YXRpb24gaXMgInNwZWNpZmllZCIgb25seSBpZiBpdCBpcyBub3QgImRlcml2ZWQiIChpLmUuCi0JICogYWNjb21wYW5pZWQgYnkgYSBNLTEgb3IgMS0xIGFubm90YXRpb24pLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJYm9vbGVhbiBpZFNwZWNpZmllZCA9IHN1cGVyLmlzU3BlY2lmaWVkKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlyZXR1cm4gaWRTcGVjaWZpZWQgJiYgISB0aGlzLmlzRGVyaXZlZElkKHBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlJ3MgPGNvZGU+SWQ8L2NvZGU+IGFubm90YXRpb24gaXMKLQkgKiBhIHN1cHBvcnRpbmcgYW5ub3RhdGlvbiBmb3IgTS0xIG9yIDEtMSBtYXBwaW5nLCBhcyBvcHBvc2VkIHRvIGEgcHJpbWFyeQotCSAqIG1hcHBpbmcgYW5ub3RhdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGlzIG1pZ2h0IHByb2R1Y2UgY29uZnVzaW5nIGJlaGF2aW9yIGlmIHRoZSBhbm5vdGF0aW9ucyBsb29rIHNvbWV0aGluZwotCSAqIGxpa2U6PHByZT4KLQkgKiAgICAgQElkIEBCYXNpYyBATWFueVRvT25lIHByaXZhdGUgaW50IGZvbzsKLQkgKiA8L3ByZT4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEZXJpdmVkSWQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQlyZXR1cm4gdGhpcy5hdHRyaWJ1dGVIYXNNYW55VG9PbmVNYXBwaW5nKHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHx8Ci0JCQl0aGlzLmF0dHJpYnV0ZUhhc09uZVRvT25lTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXR0cmlidXRlSGFzTWFueVRvT25lTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCXJldHVybiBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuaW5zdGFuY2UoKS5pc1NwZWNpZmllZChwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gYXR0cmlidXRlSGFzT25lVG9PbmVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmluc3RhbmNlKCkuaXNTcGVjaWZpZWQocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAgPSBuZXcgU3RyaW5nW10gewotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMCA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCVNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAKLQkpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNDljZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PcmRlckNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCA9IG5ldyBTdHJpbmdbXSB7Ci0JCUFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEuQVRUUklCVVRFX09WRVJSSURFUywKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlMsCi0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMCA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCVNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg1NDFhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci0KLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCA9IG5ldyBTdHJpbmdbXSB7Ci0JCUFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlNYXBzSWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBLZXlUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJhMjg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBLZXlUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25NYXBwaW5nMl8wOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hcEtleVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcgotewotCi0JcHVibGljIEphdmFNYXBLZXlUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcihUZW1wb3JhbENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKGNvbnZlcnRlciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQ29sbGVjdGlvbk1hcHBpbmcyXzAgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIChKYXZhQ29sbGVjdGlvbk1hcHBpbmcyXzApIHN1cGVyLmdldEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0RnVsbHlRdWFsaWZpZWRNYXBLZXlDbGFzcygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGUoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBfS0VZX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlSW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGUoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBfS0VZX1RZUEU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTBjNzYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIEphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFNYXBwZWRTdXBlcmNsYXNzRGVmaW5pdGlvbjJfMCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YU1hcHBlZFN1cGVyY2xhc3NEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU19BUlJBWV8yXzAgPSBuZXcgU3RyaW5nW10gewotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2U3MjlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wCi0JZXh0ZW5kcyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25XcmFwcGVyCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIERFTEVHQVRFID0gSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0KLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFPbmVUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjJfMCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGdldERlbGVnYXRlKCkgewotCQlyZXR1cm4gREVMRUdBVEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wID0gbmV3IFN0cmluZ1tdIHsKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTLAotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCUpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUywKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiOTZlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24yXzAKLQlleHRlbmRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbldyYXBwZXIKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gREVMRUdBVEUgPSBKYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uMl8wKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gZ2V0RGVsZWdhdGUoKSB7Ci0JCXJldHVybiBERUxFR0FURTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCA9IG5ldyBTdHJpbmdbXSB7Ci0JCUFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLAotCQlNYXBzSWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSXRlcmFibGU8U3RyaW5nPiBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfMl8wID0gbmV3IEFycmF5SXRlcmFibGU8U3RyaW5nPihTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gQ09NQklORURfU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTID0gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4oCi0JCURFTEVHQVRFLmdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSwKLQkJU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMAotCSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhODdlYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVZlcnNpb25NYXBwaW5nRGVmaW5pdGlvbjJfMAotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uV3JhcHBlcgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBERUxFR0FURSA9IEphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKTsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uMl8wKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb24yXzAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBnZXREZWxlZ2F0ZSgpIHsKLQkJcmV0dXJuIERFTEVHQVRFOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFN1cHBvcnRpbmdBbm5vdGF0aW9uTmFtZXMoKSB7Ci0JCXJldHVybiBDT01CSU5FRF9TVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVVBQT1JUSU5HX0FOTk9UQVRJT05fTkFNRVNfQVJSQVlfMl8wID0gbmV3IFN0cmluZ1tdIHsKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUKLQl9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTXzJfMCA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oU1VQUE9SVElOR19BTk5PVEFUSU9OX05BTUVTX0FSUkFZXzJfMCk7Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IENPTUJJTkVEX1NVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FUyA9IG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KAotCQlERUxFR0FURS5nZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCksCi0JCVNVUFBPUlRJTkdfQU5OT1RBVElPTl9OQU1FU18yXzAKLQkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvTnVsbEphdmFDYWNoZWFibGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL051bGxKYXZhQ2FjaGVhYmxlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZGFkMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvTnVsbEphdmFDYWNoZWFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLQotLyoqCi0gKiBudWxsIEphdmEgY2FjaGVhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsSmF2YUNhY2hlYWJsZTJfMAotCWV4dGVuZHMgQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIEphdmFDYWNoZWFibGUyXzAKLXsKLQlwdWJsaWMgTnVsbEphdmFDYWNoZWFibGUyXzAoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIGNhY2hlYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbiBjYWNoZWFibGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFDYWNoZWFibGVIb2xkZXIyXzAgZ2V0Q2FjaGVhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YURlcml2ZWRJZGVudGl0eTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvTnVsbEphdmFEZXJpdmVkSWRlbnRpdHkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAyNTlhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YURlcml2ZWRJZGVudGl0eTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkRlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLQotcHVibGljIGNsYXNzIE51bGxKYXZhRGVyaXZlZElkZW50aXR5Ml8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YURlcml2ZWRJZGVudGl0eTJfMAotewotCXB1YmxpYyBOdWxsSmF2YURlcml2ZWRJZGVudGl0eTJfMChKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXN1cGVyKG1hcHBpbmcpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwcmVkb21pbmFudCBkZXJpdmVkIGlkZW50aXR5IHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBEZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBnZXRQcmVkb21pbmFudERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbnVsbCBkZXJpdmVkIGlkZW50aXR5IHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJLy8gTk9QCi0JfQotCi0KLQkvLyAqKioqKioqKioqIElEIGRlcml2ZWQgaWRlbnRpdHkgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIEphdmFJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJLy8gTk9QCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHMgSUQgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgSmF2YU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJLy8gTk9QCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZykgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGdldE1hcHBpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL051bGxKYXZhTWFwS2V5Q29sdW1uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YU1hcEtleUNvbHVtbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2ZkOTU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL051bGxKYXZhTWFwS2V5Q29sdW1uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE51bGxKYXZhTWFwS2V5Q29sdW1uMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YUNvbHVtbgotewotCXB1YmxpYyBOdWxsSmF2YU1hcEtleUNvbHVtbjJfMChKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gYW5ub3RhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW5Bbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gKENvbHVtbkFubm90YXRpb24pIHRoaXMuZ2V0UGFyZW50KCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0Tm9uTnVsbEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWROYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gZGVmaW5pdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVuaXF1ZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaXF1ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFVuaXF1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4gdW5pcXVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVuaXF1ZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBudWxsYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc051bGxhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TnVsbGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zZXJ0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0luc2VydGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsZW5ndGggKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldFNwZWNpZmllZExlbmd0aCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdExlbmd0aCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByZWNpc2lvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlciBwcmVjaXNpb24pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2NhbGUgKioqKioqKioqKgotCi0JcHVibGljIGludCBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0U3BlY2lmaWVkU2NhbGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXREZWZhdWx0U2NhbGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKYXZhTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShSZWFkT25seUNvbHVtbiBvbGRDb2x1bW4pIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21WaXJ0dWFsKFJlYWRPbmx5Q29sdW1uIHZpcnR1YWxDb2x1bW4pIHsKLQkJLy8gTk9QCi0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGF0YWJhc2Ugc3R1ZmYgKioqKioqKioqKgotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uIGdldERiQ29sdW1uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9OdWxsSmF2YU9ycGhhblJlbW92YWwyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL051bGxKYXZhT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDBmMjA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL051bGxKYXZhT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotCi0vKioKLSAqIE51bGwgSmF2YSBvcnBoYW4gcmVtb3ZhbAotICovCi1wdWJsaWMgY2xhc3MgTnVsbEphdmFPcnBoYW5SZW1vdmFsMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFKcGFDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgSmF2YU9ycGhhblJlbW92YWJsZTJfMAotewotCXB1YmxpYyBOdWxsSmF2YU9ycGhhblJlbW92YWwyXzAoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9ycGhhbiByZW1vdmFsICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzT3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9BYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGMxNTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudExpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Mb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5NYXBwaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5PdmVycmlkZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuVGFibGVUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lk1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTWFwS2V5Q29sdW1uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuTmFtZWRDb2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uTnVsbE9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lk1hcEtleUpvaW5Db2x1bW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NZXRhbW9kZWxGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwS2V5RW51bWVyYXRlZENvbnZlcnRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBLZXlUZW1wb3JhbENvbnZlcnRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEpQQSAyLjAgRnJhbmtlbnN0ZWluIG1hcHBpbmcKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPFggZXh0ZW5kcyBYbWxFbGVtZW50Q29sbGVjdGlvbj4KLQlleHRlbmRzIEFic3RyYWN0T3JtQXR0cmlidXRlTWFwcGluZzxYPgotCWltcGxlbWVudHMgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRUYXJnZXRDbGFzczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUYXJnZXRDbGFzczsKLQotCXByb3RlY3RlZCBGZXRjaFR5cGUgc3BlY2lmaWVkRmV0Y2g7Ci0JcHJvdGVjdGVkIEZldGNoVHlwZSBkZWZhdWx0RmV0Y2g7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtT3JkZXJhYmxlMl8wIG9yZGVyYWJsZTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1Db2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlOwotCi0JcHJvdGVjdGVkIFR5cGUgdmFsdWVUeXBlOwotCXByb3RlY3RlZCBmaW5hbCBPcm1Db2x1bW4gdmFsdWVDb2x1bW47Ci0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBjb252ZXJ0ZXI7ICAvLyB2YWx1ZSBjb252ZXJ0ZXIgLSBuZXZlciBudWxsCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIFR5cGUga2V5VHlwZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTWFwS2V5OwotCXByb3RlY3RlZCBib29sZWFuIG5vTWFwS2V5ID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcGtNYXBLZXkgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjdXN0b21NYXBLZXkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkTWFwS2V5Q2xhc3M7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0TWFwS2V5Q2xhc3M7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgT3JtQ29sdW1uIG1hcEtleUNvbHVtbjsKLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIG1hcEtleUNvbnZlcnRlcjsgIC8vIG1hcCBrZXkgY29udmVydGVyIC0gbmV2ZXIgbnVsbAotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIGZpbmFsIENvbnRleHRMaXN0Q29udGFpbmVyPE9ybUpvaW5Db2x1bW4sIFhtbEpvaW5Db2x1bW4+IHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXI7Ci0JcHJvdGVjdGVkIGZpbmFsIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBtYXBLZXlKb2luQ29sdW1uT3duZXI7Ci0KLQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBkZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbjsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPcm1Db252ZXJ0ZXIuQWRhcHRlcltdIENPTlZFUlRFUl9BREFQVEVSX0FSUkFZID0gbmV3IE9ybUNvbnZlcnRlci5BZGFwdGVyW10gewotCQlPcm1FbnVtZXJhdGVkQ29udmVydGVyLkFkYXB0ZXIuaW5zdGFuY2UoKSwKLQkJT3JtVGVtcG9yYWxDb252ZXJ0ZXIuRWxlbWVudENvbGxlY3Rpb25BZGFwdGVyLmluc3RhbmNlKCksCi0JCU9ybUxvYkNvbnZlcnRlci5BZGFwdGVyLmluc3RhbmNlKCkKLQl9OwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSXRlcmFibGU8T3JtQ29udmVydGVyLkFkYXB0ZXI+IENPTlZFUlRFUl9BREFQVEVSUyA9IG5ldyBBcnJheUl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPihDT05WRVJURVJfQURBUFRFUl9BUlJBWSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIE9ybUNvbnZlcnRlci5BZGFwdGVyW10gTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUl9BUlJBWSA9IG5ldyBPcm1Db252ZXJ0ZXIuQWRhcHRlcltdIHsKLQkJT3JtTWFwS2V5RW51bWVyYXRlZENvbnZlcnRlcjJfMC5BZGFwdGVyLmluc3RhbmNlKCksCi0JCU9ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyMl8wLkFkYXB0ZXIuaW5zdGFuY2UoKQotCX07Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4gTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUlMgPSBuZXcgQXJyYXlJdGVyYWJsZTxPcm1Db252ZXJ0ZXIuQWRhcHRlcj4oTUFQX0tFWV9DT05WRVJURVJfQURBUFRFUl9BUlJBWSk7Ci0KLQotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMChPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCwgWCB4bWxNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sTWFwcGluZyk7Ci0JCXRoaXMuc3BlY2lmaWVkVGFyZ2V0Q2xhc3MgPSB4bWxNYXBwaW5nLmdldFRhcmdldENsYXNzKCk7Ci0JCXRoaXMuc3BlY2lmaWVkRmV0Y2ggPSB0aGlzLmJ1aWxkU3BlY2lmaWVkRmV0Y2goKTsKLQkJdGhpcy5vcmRlcmFibGUgPSB0aGlzLmJ1aWxkT3JkZXJhYmxlKCk7Ci0JCXRoaXMuY29sbGVjdGlvblRhYmxlID0gdGhpcy5idWlsZENvbGxlY3Rpb25UYWJsZSgpOwotCi0JCXRoaXMudmFsdWVDb2x1bW4gPSB0aGlzLmJ1aWxkVmFsdWVDb2x1bW4oKTsKLQkJdGhpcy5jb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkQ29udmVydGVyKCk7Ci0JCXRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IHRoaXMuYnVpbGRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gdGhpcy5idWlsZFZhbHVlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5ID0gdGhpcy5idWlsZFNwZWNpZmllZE1hcEtleSgpOwotCQl0aGlzLm5vTWFwS2V5ID0gdGhpcy5idWlsZE5vTWFwS2V5KCk7Ci0JCXRoaXMucGtNYXBLZXkgPSB0aGlzLmJ1aWxkUGtNYXBLZXkoKTsKLQkJdGhpcy5jdXN0b21NYXBLZXkgPSB0aGlzLmJ1aWxkQ3VzdG9tTWFwS2V5KCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTWFwS2V5Q2xhc3MoKTsKLQotCQl0aGlzLm1hcEtleUNvbHVtbiA9IHRoaXMuYnVpbGRNYXBLZXlDb2x1bW4oKTsKLQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIgPSB0aGlzLmJ1aWxkTWFwS2V5Q29udmVydGVyKCk7Ci0JCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSB0aGlzLmJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdGhpcy5tYXBLZXlKb2luQ29sdW1uT3duZXIgPSB0aGlzLmJ1aWxkTWFwS2V5Sm9pbkNvbHVtbk93bmVyKCk7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lciA9IHRoaXMuYnVpbGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3NfKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRGZXRjaF8odGhpcy5idWlsZFNwZWNpZmllZEZldGNoKCkpOwotCQl0aGlzLm9yZGVyYWJsZS5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuY29sbGVjdGlvblRhYmxlLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnZhbHVlQ29sdW1uLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zeW5jQ29udmVydGVyKCk7Ci0JCXRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQotCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleV8odGhpcy5idWlsZFNwZWNpZmllZE1hcEtleSgpKTsKLQkJdGhpcy5zZXROb01hcEtleV8odGhpcy5idWlsZE5vTWFwS2V5KCkpOwotCQl0aGlzLnNldFBrTWFwS2V5Xyh0aGlzLmJ1aWxkUGtNYXBLZXkoKSk7Ci0JCXRoaXMuc2V0Q3VzdG9tTWFwS2V5Xyh0aGlzLmJ1aWxkQ3VzdG9tTWFwS2V5KCkpOwotCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleUNsYXNzXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0KLQkJdGhpcy5tYXBLZXlDb2x1bW4uc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnN5bmNNYXBLZXlDb252ZXJ0ZXIoKTsKLQkJdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc3luY1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0VGFyZ2V0Q2xhc3ModGhpcy5idWlsZERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQkJdGhpcy5zZXREZWZhdWx0RmV0Y2godGhpcy5idWlsZERlZmF1bHRGZXRjaCgpKTsKLQkJdGhpcy5vcmRlcmFibGUudXBkYXRlKCk7Ci0JCXRoaXMuY29sbGVjdGlvblRhYmxlLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0VmFsdWVUeXBlKHRoaXMuYnVpbGRWYWx1ZVR5cGUoKSk7Ci0JCXRoaXMudmFsdWVDb2x1bW4udXBkYXRlKCk7Ci0JCXRoaXMuY29udmVydGVyLnVwZGF0ZSgpOwotCQl0aGlzLnZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnVwZGF0ZSgpOwotCi0JCXRoaXMuc2V0S2V5VHlwZSh0aGlzLmJ1aWxkS2V5VHlwZSgpKTsKLQkJdGhpcy5zZXREZWZhdWx0TWFwS2V5Q2xhc3ModGhpcy5idWlsZERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQl0aGlzLm1hcEtleUNvbHVtbi51cGRhdGUoKTsKLQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIudXBkYXRlKCk7Ci0JCXRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlTm9kZXModGhpcy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpKTsKLQkJdGhpcy51cGRhdGVEZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0YXJnZXQgY2xhc3MgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRDbGFzcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFRhcmdldENsYXNzICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRUYXJnZXRDbGFzcyA6IHRoaXMuZGVmYXVsdFRhcmdldENsYXNzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFRhcmdldENsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFRhcmdldENsYXNzKFN0cmluZyB0YXJnZXRDbGFzcykgewotCQl0aGlzLnNldFNwZWNpZmllZFRhcmdldENsYXNzXyh0YXJnZXRDbGFzcyk7Ci0JCXRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5zZXRUYXJnZXRDbGFzcyh0YXJnZXRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3NfKFN0cmluZyB0YXJnZXRDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRUYXJnZXRDbGFzczsKLQkJdGhpcy5zcGVjaWZpZWRUYXJnZXRDbGFzcyA9IHRhcmdldENsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX1RBUkdFVF9DTEFTU19QUk9QRVJUWSwgb2xkLCB0YXJnZXRDbGFzcyk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRUYXJnZXRDbGFzczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0VGFyZ2V0Q2xhc3MoU3RyaW5nIHRhcmdldENsYXNzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRUYXJnZXRDbGFzczsKLQkJdGhpcy5kZWZhdWx0VGFyZ2V0Q2xhc3MgPSB0YXJnZXRDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfVEFSR0VUX0NMQVNTX1BST1BFUlRZLCBvbGQsIHRhcmdldENsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdFRhcmdldENsYXNzKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gKGphdmFBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogamF2YUF0dHJpYnV0ZS5nZXRNdWx0aVJlZmVyZW5jZVRhcmdldFR5cGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0VGFyZ2V0Q2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJyQnOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvbHZlZCB0YXJnZXQgdHlwZS9lbWJlZGRhYmxlL2VudGl0eSAqKioqKioqKioqCi0KLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0UmVzb2x2ZWRUYXJnZXRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvbHZlUGVyc2lzdGVudFR5cGUodGhpcy5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW1iZWRkYWJsZSBnZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldFR5cGVNYXBwaW5nKCk7Ci0JCXJldHVybiAodHlwZU1hcHBpbmcgaW5zdGFuY2VvZiBFbWJlZGRhYmxlKSA/IChFbWJlZGRhYmxlKSB0eXBlTWFwcGluZyA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0VHlwZU1hcHBpbmcoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVudGl0eSkgPyAoRW50aXR5KSB0eXBlTWFwcGluZyA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFJlc29sdmVkVGFyZ2V0VHlwZU1hcHBpbmcoKSB7Ci0JCVBlcnNpc3RlbnRUeXBlIHJlc29sdmVkVGFyZ2V0VHlwZSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRUeXBlKCk7Ci0JCXJldHVybiAocmVzb2x2ZWRUYXJnZXRUeXBlID09IG51bGwpID8gbnVsbCA6IHJlc29sdmVkVGFyZ2V0VHlwZS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIElUeXBlIGdldFRhcmdldENsYXNzSmR0VHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmR0VHlwZSh0aGlzLmdldFRhcmdldENsYXNzKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmZXRjaCAqKioqKioqKioqCi0KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gKHRoaXMuc3BlY2lmaWVkRmV0Y2ggIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZEZldGNoIDogdGhpcy5kZWZhdWx0RmV0Y2g7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXRTcGVjaWZpZWRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkRmV0Y2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkRmV0Y2hfKGZldGNoKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldEZldGNoKEZldGNoVHlwZS50b09ybVJlc291cmNlTW9kZWwoZmV0Y2gpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRGZXRjaF8oRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGQgPSB0aGlzLnNwZWNpZmllZEZldGNoOwotCQl0aGlzLnNwZWNpZmllZEZldGNoID0gZmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwotCX0KLQotCXByb3RlY3RlZCBGZXRjaFR5cGUgYnVpbGRTcGVjaWZpZWRGZXRjaCgpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tT3JtUmVzb3VyY2VNb2RlbCh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIEZldGNoVHlwZSBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRGZXRjaDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGQgPSB0aGlzLmRlZmF1bHRGZXRjaDsKLQkJdGhpcy5kZWZhdWx0RmV0Y2ggPSBmZXRjaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwotCX0KLQotCXByb3RlY3RlZCBGZXRjaFR5cGUgYnVpbGREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBERUZBVUxUX0ZFVENIX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9yZGVyYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtT3JkZXJhYmxlIGdldE9yZGVyYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JkZXJhYmxlOwotCX0KLQotCXByb3RlY3RlZCBPcm1PcmRlcmFibGUyXzAgYnVpbGRPcmRlcmFibGUoKSB7Ci0JCS8vIHdlIHdvdWxkbid0IGJlIGhlcmUgaWYgd2Ugd2VyZW4ndCBvcm0ueG1sIDIuMCBjb21wYXRpYmxlCi0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeTJfMCgpLmJ1aWxkT3JtT3JkZXJhYmxlKHRoaXMsIHRoaXMuYnVpbGRPcmRlcmFibGVPd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JkZXJhYmxlMl8wLk93bmVyIGJ1aWxkT3JkZXJhYmxlT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgT3JkZXJhYmxlT3duZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgT3JkZXJhYmxlT3duZXIKLQkJaW1wbGVtZW50cyBPcmRlcmFibGUyXzAuT3duZXIKLQl7Ci0JCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIHJlc29sdmVEYlRhYmxlKFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJCXJldHVybiB0aGlzLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldERiVGFibGUoKTsKLQkJfQotCQlwcm90ZWN0ZWQgT3JtQ29sbGVjdGlvblRhYmxlMl8wIGdldENvbGxlY3Rpb25UYWJsZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gdGFibGUgKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbGxlY3Rpb25UYWJsZTJfMCBnZXRDb2xsZWN0aW9uVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmNvbGxlY3Rpb25UYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29sbGVjdGlvblRhYmxlMl8wIGJ1aWxkQ29sbGVjdGlvblRhYmxlKCkgewotCQkvLyB3ZSB3b3VsZG4ndCBiZSBoZXJlIGlmIHdlIHdlcmVuJ3Qgb3JtLnhtbCAyLjAgY29tcGF0aWJsZQotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkyXzAoKS5idWlsZE9ybUNvbGxlY3Rpb25UYWJsZSh0aGlzLCB0aGlzLmJ1aWxkQ29sbGVjdGlvblRhYmxlT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRhYmxlLk93bmVyIGJ1aWxkQ29sbGVjdGlvblRhYmxlT3duZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sbGVjdGlvblRhYmxlT3duZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWG1sQ29sbGVjdGlvblRhYmxlIGdldFJlc291cmNlQ29sbGVjdGlvblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBDb2xsZWN0aW9uVGFibGVPd25lcgotCQlpbXBsZW1lbnRzIFJlYWRPbmx5VGFibGUuT3duZXIKLQl7Ci0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcihSZWFkT25seVRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25UYWJsZVZhbGlkYXRvcihBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKENvbGxlY3Rpb25UYWJsZTJfMCkgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSB0eXBlICoqKioqKioqKioKLQotCXB1YmxpYyBUeXBlIGdldFZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlVHlwZShUeXBlIHZhbHVlVHlwZSkgewotCQlUeXBlIG9sZCA9IHRoaXMudmFsdWVUeXBlOwotCQl0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1RZUEVfUFJPUEVSVFksIG9sZCwgdmFsdWVUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZSBidWlsZFZhbHVlVHlwZSgpIHsKLQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIFR5cGUuRU1CRUREQUJMRV9UWVBFOwotCQl9Ci0JCWlmICh0aGlzLmdldFRhcmdldENsYXNzKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIFR5cGUuTk9fVFlQRTsKLQkJfQotCQlyZXR1cm4gVHlwZS5CQVNJQ19UWVBFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybUNvbHVtbiBnZXRWYWx1ZUNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVDb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbHVtbiBidWlsZFZhbHVlQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUNvbHVtbih0aGlzLCB0aGlzLmJ1aWxkVmFsdWVDb2x1bW5Pd25lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29sdW1uLk93bmVyIGJ1aWxkVmFsdWVDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBWYWx1ZUNvbHVtbk93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtQ29udmVydGVyIGdldENvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWlmICh0aGlzLmNvbnZlcnRlci5nZXRUeXBlKCkgIT0gY29udmVydGVyVHlwZSkgewotCQkJLy8gbm90ZTogd2UgbWF5IGFsc28gY2xlYXIgdGhlIFhNTCB2YWx1ZSB3ZSB3YW50OwotCQkJLy8gYnV0IGlmIHdlIGxlYXZlIGl0LCB0aGUgcmVzdWx0aW5nIHN5bmMgd2lsbCBzY3JldyB0aGluZ3MgdXAuLi4KLQkJCXRoaXMuY2xlYXJYbWxDb252ZXJ0ZXJWYWx1ZXMoKTsKLQkJCU9ybUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIgPSB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQl0aGlzLnNldENvbnZlcnRlcl8odGhpcy5idWlsZENvbnZlcnRlcihjb252ZXJ0ZXJBZGFwdGVyKSk7Ci0JCQl0aGlzLmNvbnZlcnRlci5pbml0aWFsaXplKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKE9ybUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJIHJldHVybiAoY29udmVydGVyQWRhcHRlciAhPSBudWxsKSA/Ci0JCQkJY29udmVydGVyQWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpKSA6Ci0JCQkJdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDb252ZXJ0ZXJfKE9ybUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJQ29udmVydGVyIG9sZCA9IHRoaXMuY29udmVydGVyOwotCQl0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTlZFUlRFUl9QUk9QRVJUWSwgb2xkLCBjb252ZXJ0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFyWG1sQ29udmVydGVyVmFsdWVzKCkgewotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWFkYXB0ZXIuY2xlYXJYbWxWYWx1ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcigpIHsKLQkJT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkgPSB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpOwotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCU9ybUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBhZGFwdGVyLmJ1aWxkQ29udmVydGVyKHRoaXMsIGZhY3RvcnkpOwotCQkJaWYgKG9ybUNvbnZlcnRlciAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG9ybUNvbnZlcnRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ29udmVydGVyKCkgewotCQlPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyID0gdGhpcy5nZXRYbWxDb252ZXJ0ZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCWlmICh0aGlzLmNvbnZlcnRlci5nZXRUeXBlKCkgIT0gbnVsbCkgewotCQkJCXRoaXMuc2V0Q29udmVydGVyXyh0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICh0aGlzLmNvbnZlcnRlci5nZXRUeXBlKCkgPT0gYWRhcHRlci5nZXRDb252ZXJ0ZXJUeXBlKCkpIHsKLQkJCQl0aGlzLmNvbnZlcnRlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0Q29udmVydGVyXyhhZGFwdGVyLmJ1aWxkTmV3Q29udmVydGVyKHRoaXMsIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgZmlyc3QgYWRhcHRlciB3aG9zZSBjb252ZXJ0ZXIgdmFsdWUgaXMgc2V0IGluIHRoZSBYTUwgbWFwcGluZy4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGNvbnZlcnRlciB2YWx1ZXMgaW4gdGhlIFhNTC4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyLkFkYXB0ZXIgZ2V0WG1sQ29udmVydGVyQWRhcHRlcigpIHsKLQkJZm9yIChPcm1Db252ZXJ0ZXIuQWRhcHRlciBhZGFwdGVyIDogdGhpcy5nZXRDb252ZXJ0ZXJBZGFwdGVycygpKSB7Ci0JCQlpZiAoYWRhcHRlci5pc0FjdGl2ZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlciBidWlsZE51bGxDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTnVsbE9ybUNvbnZlcnRlcih0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlci5BZGFwdGVyIGdldENvbnZlcnRlckFkYXB0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldENvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPiBnZXRDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIENPTlZFUlRFUl9BREFQVEVSUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsdWUgYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKS5idWlsZE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKHRoaXMsIHRoaXMuYnVpbGRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGJ1aWxkVmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCkgewotCQlyZXR1cm4gbmV3IFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSBhc3NvY2lhdGlvbiBvdmVycmlkZSBjb250YWluZXIgKioqKioqKioqKgotCi0JcHVibGljIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0VmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcih0aGlzLCB0aGlzLmJ1aWxkVmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuT3duZXIgYnVpbGRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJPd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBrZXkgdHlwZSAqKioqKioqKioqCi0KLQlwdWJsaWMgVHlwZSBnZXRLZXlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5rZXlUeXBlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEtleVR5cGUoVHlwZSBrZXlUeXBlKSB7Ci0JCVR5cGUgb2xkID0gdGhpcy5rZXlUeXBlOwotCQl0aGlzLmtleVR5cGUgPSBrZXlUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoS0VZX1RZUEVfUFJPUEVSVFksIG9sZCwga2V5VHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGUgYnVpbGRLZXlUeXBlKCkgewotCQlpZiAodGhpcy5nZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTUJFRERBQkxFX1RZUEU7Ci0JCX0KLQkJaWYgKHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlFbnRpdHkoKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gVHlwZS5FTlRJVFlfVFlQRTsKLQkJfQotCQlpZiAodGhpcy5nZXRNYXBLZXlDbGFzcygpID09IG51bGwpIHsKLQkJCXJldHVybiBUeXBlLk5PX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIFR5cGUuQkFTSUNfVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcEtleSgpIHsKLQkJaWYgKHRoaXMubm9NYXBLZXkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLnBrTWFwS2V5KSB7Ci0JCQkvLyB0aGUgdGFyZ2V0IGlzIGVpdGhlciBlbWJlZGRhYmxlIG9yIGJhc2ljLCBzbyBhIGtleSB3aWxsIGhhdmUgdG8gYmUgc3BlY2lmaWVkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAodGhpcy5jdXN0b21NYXBLZXkpIHsKLQkJCXJldHVybiB0aGlzLnNwZWNpZmllZE1hcEtleTsKLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmtub3duIG1hcCBrZXkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgbWFwIGtleSAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE1hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE1hcEtleShTdHJpbmcgbWFwS2V5KSB7Ci0JCWlmIChtYXBLZXkgIT0gbnVsbCkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXlfKG1hcEtleSk7Ci0JCQl0aGlzLnNldE5vTWFwS2V5XyhmYWxzZSk7Ci0JCQl0aGlzLnNldFBrTWFwS2V5XyhmYWxzZSk7Ci0JCQl0aGlzLnNldEN1c3RvbU1hcEtleV8odHJ1ZSk7Ci0KLQkJCU1hcEtleSB4bWxNYXBLZXkgPSB0aGlzLmdldFhtbE1hcEtleSgpOwotCQkJaWYgKHhtbE1hcEtleSA9PSBudWxsKSB7Ci0JCQkJeG1sTWFwS2V5ID0gdGhpcy5idWlsZFhtbE1hcEtleSgpOwotCQkJfQotCQkJeG1sTWFwS2V5LnNldE5hbWUobWFwS2V5KTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0UGtNYXBLZXkodHJ1ZSk7ICAvLyBobW1tLi4uCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlfKFN0cmluZyBtYXBLZXkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTWFwS2V5OwotCQl0aGlzLnNwZWNpZmllZE1hcEtleSA9IG1hcEtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9NQVBfS0VZX1BST1BFUlRZLCBvbGQsIG1hcEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFNwZWNpZmllZE1hcEtleSgpIHsKLQkJTWFwS2V5IHhtbE1hcEtleSA9IHRoaXMuZ2V0WG1sTWFwS2V5KCk7Ci0JCXJldHVybiAoeG1sTWFwS2V5ID09IG51bGwpID8gbnVsbCA6IHhtbE1hcEtleS5nZXROYW1lKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG5vIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNOb01hcEtleSgpIHsKLQkJcmV0dXJuIHRoaXMubm9NYXBLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9NYXBLZXkoYm9vbGVhbiBub01hcEtleSkgewotCQlpZiAobm9NYXBLZXkpIHsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5XyhudWxsKTsKLQkJCXRoaXMuc2V0Tm9NYXBLZXlfKHRydWUpOwotCQkJdGhpcy5zZXRQa01hcEtleV8oZmFsc2UpOwotCQkJdGhpcy5zZXRDdXN0b21NYXBLZXlfKGZhbHNlKTsKLQotCQkJaWYgKHRoaXMuZ2V0WG1sTWFwS2V5KCkgIT0gbnVsbCkgewotCQkJCXRoaXMucmVtb3ZlWG1sTWFwS2V5KCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldFBrTWFwS2V5KHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm9NYXBLZXlfKGJvb2xlYW4gbm9NYXBLZXkpIHsKLQkJYm9vbGVhbiBvbGQgPSB0aGlzLm5vTWFwS2V5OwotCQl0aGlzLm5vTWFwS2V5ID0gbm9NYXBLZXk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOT19NQVBfS0VZX1BST1BFUlRZLCBvbGQsIG5vTWFwS2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE5vTWFwS2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxNYXBLZXkoKSA9PSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwayBtYXAga2V5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzUGtNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnBrTWFwS2V5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBrTWFwS2V5KGJvb2xlYW4gcGtNYXBLZXkpIHsKLQkJaWYgKHBrTWFwS2V5KSB7Ci0JCQl0aGlzLnNldFNwZWNpZmllZE1hcEtleV8obnVsbCk7Ci0JCQl0aGlzLnNldE5vTWFwS2V5XyhmYWxzZSk7Ci0JCQl0aGlzLnNldFBrTWFwS2V5Xyh0cnVlKTsKLQkJCXRoaXMuc2V0Q3VzdG9tTWFwS2V5XyhmYWxzZSk7Ci0KLQkJCU1hcEtleSB4bWxNYXBLZXkgPSB0aGlzLmdldFhtbE1hcEtleSgpOwotCQkJaWYgKHhtbE1hcEtleSA9PSBudWxsKSB7Ci0JCQkJdGhpcy5idWlsZFhtbE1hcEtleSgpOwotCQkJfSBlbHNlIHsKLQkJCQl4bWxNYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0Tm9NYXBLZXkodHJ1ZSk7ICAvLyBobW1tLi4uCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQa01hcEtleV8oYm9vbGVhbiBwa01hcEtleSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMucGtNYXBLZXk7Ci0JCXRoaXMucGtNYXBLZXkgPSBwa01hcEtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX01BUF9LRVlfUFJPUEVSVFksIG9sZCwgcGtNYXBLZXkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkUGtNYXBLZXkoKSB7Ci0JCU1hcEtleSB4bWxNYXBLZXkgPSB0aGlzLmdldFhtbE1hcEtleSgpOwotCQlyZXR1cm4gKHhtbE1hcEtleSAhPSBudWxsKSAmJiAoeG1sTWFwS2V5LmdldE5hbWUoKSA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY3VzdG9tIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNDdXN0b21NYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbU1hcEtleTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXN0b21NYXBLZXkoYm9vbGVhbiBjdXN0b21NYXBLZXkpIHsKLQkJaWYgKGN1c3RvbU1hcEtleSkgewotCQkJdGhpcy5zZXRTcGVjaWZpZWRNYXBLZXkoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLnNldE5vTWFwS2V5KHRydWUpOyAgLy8gaG1tbS4uLgotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9tTWFwS2V5Xyhib29sZWFuIGN1c3RvbU1hcEtleSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuY3VzdG9tTWFwS2V5OwotCQl0aGlzLmN1c3RvbU1hcEtleSA9IGN1c3RvbU1hcEtleTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENVU1RPTV9NQVBfS0VZX1BST1BFUlRZLCBvbGQsIGN1c3RvbU1hcEtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRDdXN0b21NYXBLZXkoKSB7Ci0JCU1hcEtleSB4bWxNYXBLZXkgPSB0aGlzLmdldFhtbE1hcEtleSgpOwotCQlyZXR1cm4gKHhtbE1hcEtleSAhPSBudWxsKSAmJiAoeG1sTWFwS2V5LmdldE5hbWUoKSAhPSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogeG1sIG1hcCBrZXkgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIE1hcEtleSBnZXRYbWxNYXBLZXkoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwS2V5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcEtleSBidWlsZFhtbE1hcEtleSgpIHsKLQkJTWFwS2V5IG1hcEtleSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpOwotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TWFwS2V5KG1hcEtleSk7Ci0JCXJldHVybiBtYXBLZXk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sTWFwS2V5KCkgewotCQl0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuc2V0TWFwS2V5KG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGNsYXNzICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwS2V5Q2xhc3MoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzcyAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgOiB0aGlzLmRlZmF1bHRNYXBLZXlDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRNYXBLZXlDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhTdHJpbmcgbWFwS2V5Q2xhc3MpIHsKLQkJaWYgKHRoaXMuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3NfKG1hcEtleUNsYXNzKSkgewotCQkJWG1sQ2xhc3NSZWZlcmVuY2UgeG1sTWFwS2V5Q2xhc3NSZWYgPSB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKTsKLQkJCWlmIChtYXBLZXlDbGFzcyA9PSBudWxsKSB7Ci0JCQkJaWYgKHhtbE1hcEtleUNsYXNzUmVmICE9IG51bGwpIHsKLQkJCQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE1hcEtleUNsYXNzKG51bGwpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHhtbE1hcEtleUNsYXNzUmVmID09IG51bGwpIHsKLQkJCQkJeG1sTWFwS2V5Q2xhc3NSZWYgPSB0aGlzLmJ1aWxkWG1sTWFwS2V5Q2xhc3NSZWZlcmVuY2UoKTsKLQkJCQl9Ci0JCQkJeG1sTWFwS2V5Q2xhc3NSZWYuc2V0Q2xhc3NOYW1lKG1hcEtleUNsYXNzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNldFNwZWNpZmllZE1hcEtleUNsYXNzXyhTdHJpbmcgbWFwS2V5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3M7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgPSBtYXBLZXlDbGFzczsKLQkJcmV0dXJuIHRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTUFQX0tFWV9DTEFTU19QUk9QRVJUWSwgb2xkLCBtYXBLZXlDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGJ1aWxkWG1sTWFwS2V5Q2xhc3NSZWZlcmVuY2UoKSB7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIG1hcEtleUNsYXNzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKTsKLQkJdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLnNldE1hcEtleUNsYXNzKG1hcEtleUNsYXNzKTsKLQkJcmV0dXJuIG1hcEtleUNsYXNzOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRTcGVjaWZpZWRNYXBLZXlDbGFzcygpIHsKLQkJWG1sQ2xhc3NSZWZlcmVuY2UgeG1sQ2xhc3NSZWYgPSB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKTsKLQkJcmV0dXJuICh4bWxDbGFzc1JlZiA9PSBudWxsKSA/IG51bGwgOiB4bWxDbGFzc1JlZi5nZXRDbGFzc05hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRNYXBLZXlDbGFzcygpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE1hcEtleUNsYXNzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNYXBLZXlDbGFzcyhTdHJpbmcgbWFwS2V5Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGVmYXVsdE1hcEtleUNsYXNzOwotCQl0aGlzLmRlZmF1bHRNYXBLZXlDbGFzcyA9IG1hcEtleUNsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9NQVBfS0VZX0NMQVNTX1BST1BFUlRZLCBvbGQsIG1hcEtleUNsYXNzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE1hcEtleUNsYXNzKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gKGphdmFBdHRyaWJ1dGUgPT0gbnVsbCkgPyBudWxsIDogamF2YUF0dHJpYnV0ZS5nZXRNdWx0aVJlZmVyZW5jZU1hcEtleVR5cGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0TWFwS2V5Q2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gJyQnOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZXNvbHZlZCBtYXAga2V5IGVtYmVkZGFibGUvZW50aXR5ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBFbWJlZGRhYmxlIGdldFJlc29sdmVkTWFwS2V5RW1iZWRkYWJsZSgpIHsKLQkJVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmcgPSB0aGlzLmdldFJlc29sdmVkTWFwS2V5VHlwZU1hcHBpbmcoKTsKLQkJcmV0dXJuICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIEVtYmVkZGFibGUpID8gKEVtYmVkZGFibGUpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgRW50aXR5IGdldFJlc29sdmVkTWFwS2V5RW50aXR5KCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlUeXBlTWFwcGluZygpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgZ2V0UmVzb2x2ZWRNYXBLZXlUeXBlTWFwcGluZygpIHsKLQkJUGVyc2lzdGVudFR5cGUgcmVzb2x2ZWRNYXBLZXlUeXBlID0gdGhpcy5nZXRSZXNvbHZlZE1hcEtleVR5cGUoKTsKLQkJcmV0dXJuIChyZXNvbHZlZE1hcEtleVR5cGUgPT0gbnVsbCkgPyBudWxsIDogcmVzb2x2ZWRNYXBLZXlUeXBlLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGUgZ2V0UmVzb2x2ZWRNYXBLZXlUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5yZXNvbHZlUGVyc2lzdGVudFR5cGUodGhpcy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgSVR5cGUgZ2V0TWFwS2V5Q2xhc3NKZHRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKZHRUeXBlKHRoaXMuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgY29sdW1uICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1Db2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5tYXBLZXlDb2x1bW47Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNvbHVtbiBidWlsZE1hcEtleUNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Db2x1bW4odGhpcywgdGhpcy5idWlsZE1hcEtleUNvbHVtbk93bmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBPcm1Db2x1bW4uT3duZXIgYnVpbGRNYXBLZXlDb2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlDb2x1bW5Pd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXAga2V5IGNvbnZlcnRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtQ29udmVydGVyIGdldE1hcEtleUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIHRoaXMubWFwS2V5Q29udmVydGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcEtleUNvbnZlcnRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCWlmICh0aGlzLm1hcEtleUNvbnZlcnRlci5nZXRUeXBlKCkgIT0gY29udmVydGVyVHlwZSkgewotCQkJLy8gbm90ZTogd2UgbWF5IGFsc28gY2xlYXIgdGhlIFhNTCB2YWx1ZSB3ZSB3YW50OwotCQkJLy8gYnV0IGlmIHdlIGxlYXZlIGl0LCB0aGUgcmVzdWx0aW5nIHN5bmMgd2lsbCBzY3JldyB0aGluZ3MgdXAuLi4KLQkJCXRoaXMuY2xlYXJYbWxNYXBLZXlDb252ZXJ0ZXJWYWx1ZXMoKTsKLQkJCU9ybUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIgPSB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXIoY29udmVydGVyVHlwZSk7Ci0JCQl0aGlzLnNldE1hcEtleUNvbnZlcnRlcl8odGhpcy5idWlsZE1hcEtleUNvbnZlcnRlcihjb252ZXJ0ZXJBZGFwdGVyKSk7Ci0JCQl0aGlzLm1hcEtleUNvbnZlcnRlci5pbml0aWFsaXplKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkTWFwS2V5Q29udmVydGVyKE9ybUNvbnZlcnRlci5BZGFwdGVyIGNvbnZlcnRlckFkYXB0ZXIpIHsKLQkJIHJldHVybiAoY29udmVydGVyQWRhcHRlciAhPSBudWxsKSA/Ci0JCQkJY29udmVydGVyQWRhcHRlci5idWlsZE5ld0NvbnZlcnRlcih0aGlzLCB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpKSA6Ci0JCQkJdGhpcy5idWlsZE51bGxDb252ZXJ0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNYXBLZXlDb252ZXJ0ZXJfKE9ybUNvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJQ29udmVydGVyIG9sZCA9IHRoaXMubWFwS2V5Q29udmVydGVyOwotCQl0aGlzLm1hcEtleUNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUF9LRVlfQ09OVkVSVEVSX1BST1BFUlRZLCBvbGQsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJYbWxNYXBLZXlDb252ZXJ0ZXJWYWx1ZXMoKSB7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJYWRhcHRlci5jbGVhclhtbFZhbHVlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQ29udmVydGVyIGJ1aWxkTWFwS2V5Q29udmVydGVyKCkgewotCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSA9IHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JCWZvciAoT3JtQ29udmVydGVyLkFkYXB0ZXIgYWRhcHRlciA6IHRoaXMuZ2V0TWFwS2V5Q29udmVydGVyQWRhcHRlcnMoKSkgewotCQkJT3JtQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IGFkYXB0ZXIuYnVpbGRDb252ZXJ0ZXIodGhpcywgZmFjdG9yeSk7Ci0JCQlpZiAob3JtQ29udmVydGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gb3JtQ29udmVydGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLmJ1aWxkTnVsbENvbnZlcnRlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNNYXBLZXlDb252ZXJ0ZXIoKSB7Ci0JCU9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgPSB0aGlzLmdldFhtbE1hcEtleUNvbnZlcnRlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMubWFwS2V5Q29udmVydGVyLmdldFR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zZXRNYXBLZXlDb252ZXJ0ZXJfKHRoaXMuYnVpbGROdWxsQ29udmVydGVyKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMubWFwS2V5Q29udmVydGVyLmdldFR5cGUoKSA9PSBhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSkgewotCQkJCXRoaXMubWFwS2V5Q29udmVydGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5zZXRNYXBLZXlDb252ZXJ0ZXJfKGFkYXB0ZXIuYnVpbGROZXdDb252ZXJ0ZXIodGhpcywgdGhpcy5nZXRDb250ZXh0Tm9kZUZhY3RvcnkoKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBhZGFwdGVyIHdob3NlIGNvbnZlcnRlciB2YWx1ZSBpcyBzZXQgaW4gdGhlIFhNTCBtYXBwaW5nLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBhcmUgbm8gY29udmVydGVyIHZhbHVlcyBpbiB0aGUgWE1MLgotCSAqLwotCXByb3RlY3RlZCBPcm1Db252ZXJ0ZXIuQWRhcHRlciBnZXRYbWxNYXBLZXlDb252ZXJ0ZXJBZGFwdGVyKCkgewotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmlzQWN0aXZlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZykpIHsKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgY29udmVydGVyIGFkYXB0ZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udmVydGVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgY29udmVydGVyIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIE9ybUNvbnZlcnRlci5BZGFwdGVyIGdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXIoQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlmb3IgKE9ybUNvbnZlcnRlci5BZGFwdGVyIGFkYXB0ZXIgOiB0aGlzLmdldE1hcEtleUNvbnZlcnRlckFkYXB0ZXJzKCkpIHsKLQkJCWlmIChhZGFwdGVyLmdldENvbnZlcnRlclR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKSB7Ci0JCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPE9ybUNvbnZlcnRlci5BZGFwdGVyPiBnZXRNYXBLZXlDb252ZXJ0ZXJBZGFwdGVycygpIHsKLQkJcmV0dXJuIE1BUF9LRVlfQ09OVkVSVEVSX0FEQVBURVJTOwotCX0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMubWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHROb2RlRmFjdG9yeSgpLmJ1aWxkT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIodGhpcywgdGhpcy5idWlsZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLk93bmVyIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lck93bmVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgam9pbiBjb2x1bW5zICoqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8T3JtSm9pbkNvbHVtbj4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmhhc1NwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgPyB0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgOiB0aGlzLmdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5oYXNTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpID8gdGhpcy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSA6IHRoaXMuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgbWFwIGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxPcm1Kb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudHNTaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpICE9IDA7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5nZXRDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JfQotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbih0aGlzLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSB0aGlzLmJ1aWxkWG1sSm9pbkNvbHVtbigpOwotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSB0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIuYWRkQ29udGV4dEVsZW1lbnQoaW5kZXgsIHhtbEpvaW5Db2x1bW4pOwotCQl0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmFkZChpbmRleCwgeG1sSm9pbkNvbHVtbik7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCBYbWxKb2luQ29sdW1uIGJ1aWxkWG1sSm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQl0aGlzLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4odGhpcy5zcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyLmluZGV4T2ZDb250ZXh0RWxlbWVudCgoT3JtSm9pbkNvbHVtbikgam9pbkNvbHVtbikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRoaXMuc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5yZW1vdmVDb250ZXh0RWxlbWVudChpbmRleCk7Ci0JCXRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIubW92ZUNvbnRleHRFbGVtZW50KHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpLmdldE1hcEtleUpvaW5Db2x1bW5zKCkubW92ZSh0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN5bmNTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpIHsKLQkJdGhpcy5zcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uQ29udGFpbmVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFhtbEpvaW5Db2x1bW4+IGdldFhtbE1hcEtleUpvaW5Db2x1bW5zKCkgewotCQkvLyBjbG9uZSB0byByZWR1Y2UgY2hhbmNlIG9mIGNvbmN1cnJlbmN5IHByb2JsZW1zCi0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFhtbEpvaW5Db2x1bW4+KHRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpLmdldE1hcEtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1Kb2luQ29sdW1uLCBYbWxKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIoKSB7Ci0JCVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIgY29udGFpbmVyID0gbmV3IFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIoKTsKLQkJY29udGFpbmVyLmluaXRpYWxpemUoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBzcGVjaWZpZWQgam9pbiBjb2x1bW4gY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJZXh0ZW5kcyBDb250ZXh0TGlzdENvbnRhaW5lcjxPcm1Kb2luQ29sdW1uLCBYbWxKb2luQ29sdW1uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGV4dEVsZW1lbnRzUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFNQRUNJRklFRF9NQVBfS0VZX0pPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3JtSm9pbkNvbHVtbiBidWlsZENvbnRleHRFbGVtZW50KFhtbEpvaW5Db2x1bW4gcmVzb3VyY2VFbGVtZW50KSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5idWlsZE1hcEtleUpvaW5Db2x1bW4ocmVzb3VyY2VFbGVtZW50KTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxYbWxKb2luQ29sdW1uPiBnZXRSZXNvdXJjZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0WG1sTWFwS2V5Sm9pbkNvbHVtbnMoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFhtbEpvaW5Db2x1bW4gZ2V0UmVzb3VyY2VFbGVtZW50KE9ybUpvaW5Db2x1bW4gY29udGV4dEVsZW1lbnQpIHsKLQkJCXJldHVybiBjb250ZXh0RWxlbWVudC5nZXRYbWxDb2x1bW4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBPcm1Kb2luQ29sdW1uIGJ1aWxkTWFwS2V5Sm9pbkNvbHVtbihYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1Kb2luQ29sdW1uKHRoaXMsIHRoaXMubWFwS2V5Sm9pbkNvbHVtbk93bmVyLCB4bWxKb2luQ29sdW1uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIGJ1aWxkTWFwS2V5Sm9pbkNvbHVtbk93bmVyKCkgewotCQlyZXR1cm4gbmV3IE1hcEtleUpvaW5Db2x1bW5Pd25lcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IG1hcCBrZXkgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JcHVibGljIE9ybUpvaW5Db2x1bW4gZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKE9ybUpvaW5Db2x1bW4gbWFwS2V5Sm9pbkNvbHVtbikgewotCQlPcm1Kb2luQ29sdW1uIG9sZCA9IHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW47Ci0JCXRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4gPSBtYXBLZXlKb2luQ29sdW1uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9NQVBfS0VZX0pPSU5fQ09MVU1OX1BST1BFUlRZLCBvbGQsIG1hcEtleUpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtSm9pbkNvbHVtbj4gZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gKHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4gIT0gbnVsbCkgPwotCQkJCW5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhYmxlPE9ybUpvaW5Db2x1bW4+KHRoaXMuZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4pIDoKLQkJCQlFbXB0eUxpc3RJdGVyYWJsZS48T3JtSm9pbkNvbHVtbj5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuICh0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uID09IG51bGwpID8gMCA6IDE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSB7Ci0JCWlmICh0aGlzLmJ1aWxkc0RlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkpIHsKLQkJCWlmICh0aGlzLmRlZmF1bHRNYXBLZXlKb2luQ29sdW1uID09IG51bGwpIHsKLQkJCQl0aGlzLnNldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKHRoaXMuYnVpbGRNYXBLZXlKb2luQ29sdW1uKG51bGwpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbi51cGRhdGUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuc2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4obnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZHNEZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuICEgdGhpcy5oYXNTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpICYmCi0JCQkJZ2V0S2V5VHlwZSgpID09IFR5cGUuRU5USVRZX1RZUEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFhtbFNlcXVlbmNlKCkgewotCQlyZXR1cm4gNzU7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHkoKSB7Ci0JCU9ybVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gdGhpcy5nZXRUeXBlTWFwcGluZygpOwotCQlyZXR1cm4gKHR5cGVNYXBwaW5nIGluc3RhbmNlb2YgRW50aXR5KSA/IChFbnRpdHkpIHR5cGVNYXBwaW5nIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplT24oT3JtQXR0cmlidXRlTWFwcGluZyBuZXdNYXBwaW5nKSB7Ci0gCQluZXdNYXBwaW5nLmluaXRpYWxpemVGcm9tT3JtQXR0cmlidXRlTWFwcGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRYbWxBdHRyaWJ1dGVNYXBwaW5nVG8oQXR0cmlidXRlcyByZXNvdXJjZUF0dHJpYnV0ZXMpIHsKLQkJcmVzb3VyY2VBdHRyaWJ1dGVzLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmFkZCh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVhtbEF0dHJpYnV0ZU1hcHBpbmdGcm9tKEF0dHJpYnV0ZXMgcmVzb3VyY2VBdHRyaWJ1dGVzKSB7Ci0JCXJlc291cmNlQXR0cmlidXRlcy5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5yZW1vdmUodGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWV0YW1vZGVsRmllbGRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE1ldGFtb2RlbFR5cGVOYW1lKCkgewotCQlpZiAodGhpcy52YWx1ZVR5cGUgPT0gVHlwZS5CQVNJQ19UWVBFKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRUYXJnZXRDbGFzcygpOwotCQl9Ci0JCVBlcnNpc3RlbnRUeXBlIHRhcmdldFR5cGUgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0VHlwZSgpOwotCQlpZiAodGFyZ2V0VHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YW1vZGVsRmllbGQuREVGQVVMVF9UWVBFX05BTUU7Ci0JCX0KLQkJU3RyaW5nIHRhcmdldFR5cGVOYW1lID0gdGFyZ2V0VHlwZS5nZXROYW1lKCk7Ci0JCXJldHVybiAodGFyZ2V0VHlwZU5hbWUgIT0gbnVsbCkgPyB0YXJnZXRUeXBlTmFtZSA6IE1ldGFtb2RlbEZpZWxkLkRFRkFVTFRfVFlQRV9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE1ldGFtb2RlbEZpZWxkVHlwZUFyZ3VtZW50TmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQl0aGlzLmFkZE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZUFyZ3VtZW50TmFtZVRvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQkJc3VwZXIuYWRkTWV0YW1vZGVsRmllbGRUeXBlQXJndW1lbnROYW1lc1RvKHR5cGVBcmd1bWVudE5hbWVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVBcmd1bWVudE5hbWVUbyhBcnJheUxpc3Q8U3RyaW5nPiB0eXBlQXJndW1lbnROYW1lcykgewotCQlTdHJpbmcga2V5VHlwZU5hbWUgPSB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNZXRhbW9kZWxDb250YWluZXJGaWVsZE1hcEtleVR5cGVOYW1lKCk7Ci0JCWlmIChrZXlUeXBlTmFtZSAhPSBudWxsKSB7Ci0JCQl0eXBlQXJndW1lbnROYW1lcy5hZGQoa2V5VHlwZU5hbWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNZXRhbW9kZWxGaWVsZE1hcEtleVR5cGVOYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmdldE1ldGFtb2RlbEZpZWxkTWFwS2V5VHlwZU5hbWUodGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGVtYmVkZGVkIG1hcHBpbmdzICoqKioqKioqKioKLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFN0cmluZz4odGhpcy5nZXRBbGxUYXJnZXRFbWJlZGRhYmxlQXR0cmlidXRlTmFtZXNMaXN0cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGxpc3RzOyBlYWNoIG5lc3RlZCBsaXN0IGhvbGRzIHRoZSBuYW1lcyBmb3Igb25lIG9mIHRoZQotCSAqIGVtYmVkZGVkIG1hcHBpbmcncyB0YXJnZXQgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcncyBhdHRyaWJ1dGUgbWFwcGluZ3MKLQkgKiAoYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uIG1hcHBpbmdzLCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm1lcikuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFN0cmluZz4+IGdldEFsbFRhcmdldEVtYmVkZGFibGVBdHRyaWJ1dGVOYW1lc0xpc3RzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4odGhpcy5nZXRBbGxUYXJnZXRFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSwgQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gZ2V0QWxsVGFyZ2V0RW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlFbWJlZGRhYmxlIHRhcmdldEVtYmVkZGFibGUgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpOwotCQlyZXR1cm4gKHRhcmdldEVtYmVkZGFibGUgIT0gbnVsbCkgPyB0YXJnZXRFbWJlZGRhYmxlLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkgOiBFbXB0eUl0ZXJhYmxlLjxBdHRyaWJ1dGVNYXBwaW5nPiBpbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KHN1cGVyLmdldEFsbE1hcHBpbmdOYW1lcygpLCB0aGlzLmdldEFsbEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsRW1iZWRkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UXVhbGlmaWVkRW1iZWRkYWJsZU92ZXJyaWRhYmxlTWFwcGluZ05hbWVzKEF0dHJpYnV0ZU1hcHBpbmdUb29scy5BTExfTUFQUElOR19OQU1FU19UUkFOU0ZPUk1FUik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLmdldFF1YWxpZmllZEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lcyhBdHRyaWJ1dGVNYXBwaW5nVG9vbHMuQUxMX09WRVJSSURBQkxFX0FUVFJJQlVURV9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTWFwcGluZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5nZXRRdWFsaWZpZWRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoQXR0cmlidXRlTWFwcGluZ1Rvb2xzLkFMTF9PVkVSUklEQUJMRV9BU1NPQ0lBVElPTl9NQVBQSU5HX05BTUVTX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRRdWFsaWZpZWRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPih0aGlzLmdldEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lcyh0cmFuc2Zvcm1lciksIHRoaXMuYnVpbGRRdWFsaWZpZXJUcmFuc2Zvcm1lcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRFbWJlZGRhYmxlT3ZlcnJpZGFibGVNYXBwaW5nTmFtZXMoVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgSXRlcmFibGU8U3RyaW5nPj4gdHJhbnNmb3JtZXIpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0RW1iZWRkYWJsZU92ZXJyaWRhYmxlTWFwcGluZ05hbWVzTGlzdHModHJhbnNmb3JtZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIGxpc3RzOyBlYWNoIG5lc3RlZCBsaXN0IGhvbGRzIHRoZSBuYW1lcyBmb3Igb25lIG9mIHRoZQotCSAqIGVtYmVkZGVkIG1hcHBpbmcncyB0YXJnZXQgZW1iZWRkYWJsZSB0eXBlIG1hcHBpbmcncyBhdHRyaWJ1dGUgbWFwcGluZ3MKLQkgKiAoYXR0cmlidXRlIG9yIGFzc29jaWF0aW9uIG1hcHBpbmdzLCBkZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCB0cmFuc2Zvcm1lcikuCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEl0ZXJhYmxlPFN0cmluZz4+IGdldEVtYmVkZGFibGVPdmVycmlkYWJsZU1hcHBpbmdOYW1lc0xpc3RzKFRyYW5zZm9ybWVyPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPFN0cmluZz4+IHRyYW5zZm9ybWVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nLCBJdGVyYWJsZTxTdHJpbmc+Pih0aGlzLmdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpLCB0cmFuc2Zvcm1lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEF0dHJpYnV0ZU1hcHBpbmcgcmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJQXR0cmlidXRlTWFwcGluZyByZXNvbHZlZE1hcHBpbmcgPSBzdXBlci5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKHJlc29sdmVkTWFwcGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcmVzb2x2ZWRNYXBwaW5nOwotCQl9Ci0JCWF0dHJpYnV0ZU5hbWUgPSB0aGlzLnVucXVhbGlmeShhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gcmVjdXJzZSBpbnRvIHRoZSBlbWJlZGRhYmxlIG1hcHBpbmdzCi0JCWZvciAoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nIDogdGhpcy5nZXRFbWJlZGRhYmxlQXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJcmVzb2x2ZWRNYXBwaW5nID0gbWFwcGluZy5yZXNvbHZlQXR0cmlidXRlTWFwcGluZyhhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChyZXNvbHZlZE1hcHBpbmcgIT0gbnVsbCkgewotCQkJCXJldHVybiByZXNvbHZlZE1hcHBpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEVtYmVkZGFibGVBdHRyaWJ1dGVNYXBwaW5ncygpIHsKLQkJRW1iZWRkYWJsZSB0YXJnZXRFbWJlZGRhYmxlID0gdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKTsKLQkJcmV0dXJuICgodGFyZ2V0RW1iZWRkYWJsZSAhPSBudWxsKSAmJiAodGFyZ2V0RW1iZWRkYWJsZSAhPSB0aGlzLmdldFR5cGVNYXBwaW5nKCkpKSA/Ci0JCQkJdGFyZ2V0RW1iZWRkYWJsZS5nZXRBdHRyaWJ1dGVNYXBwaW5ncygpIDoKLQkJCQlFbXB0eUl0ZXJhYmxlLjxBdHRyaWJ1dGVNYXBwaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlhdHRyaWJ1dGVOYW1lID0gdGhpcy51bnF1YWxpZnkoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIG92ZXJyaWRlID0gdGhpcy52YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCS8vIHJlY3Vyc2UgaW50byB0aGUgdGFyZ2V0IGVtYmVkZGFibGUgaWYgbmVjZXNzYXJ5Ci0JCXJldHVybiAob3ZlcnJpZGUgIT0gbnVsbCkgPyBvdmVycmlkZS5nZXRDb2x1bW4oKSA6IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5Db2x1bW5JblRhcmdldEVtYmVkZGFibGUoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbkluVGFyZ2V0RW1iZWRkYWJsZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlFbWJlZGRhYmxlIHRhcmdldEVtYmVkZGFibGUgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpOwotCQlyZXR1cm4gKHRhcmdldEVtYmVkZGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW1iZWRkYWJsZS5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWF0dHJpYnV0ZU5hbWUgPSB0aGlzLnVucXVhbGlmeShhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSA9IHRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCS8vIHJlY3Vyc2UgaW50byB0aGUgdGFyZ2V0IGVtYmVkZGFibGUgaWYgbmVjZXNzYXJ5Ci0JCXJldHVybiAob3ZlcnJpZGUgIT0gbnVsbCkgPyBvdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSA6IHRoaXMucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXBJblRhcmdldEVtYmVkZGFibGUoYXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcEluVGFyZ2V0RW1iZWRkYWJsZShTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlFbWJlZGRhYmxlIHRhcmdldEVtYmVkZGFibGUgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSgpOwotCQlyZXR1cm4gKHRhcmdldEVtYmVkZGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFyZ2V0RW1iZWRkYWJsZS5yZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcChhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKiogcmVmYWN0b3JpbmcgKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQkJc3VwZXIuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVNYXBLZXlDbGFzc1JlbmFtZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld05hbWUpLAotCQkJCXRoaXMuY3JlYXRlVGFyZ2V0Q2xhc3NSZW5hbWVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdOYW1lKQotCQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1hcEtleUNsYXNzUmVuYW1lVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgIT0gbnVsbCkgewotCQkJUGVyc2lzdGVudFR5cGUgbWFwS2V5VHlwZSA9IHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlUeXBlKCk7Ci0JCQlpZiAoKG1hcEtleVR5cGUgIT0gbnVsbCkgJiYgbWFwS2V5VHlwZS5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlUmVuYW1lTWFwS2V5Q2xhc3NFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU1hcEtleUNsYXNzRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiB0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuY3JlYXRlUmVuYW1lTWFwS2V5Q2xhc3NFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVUYXJnZXRDbGFzc1JlbmFtZVR5cGVFZGl0cyhJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZFRhcmdldENsYXNzICE9IG51bGwpIHsKLQkJCVBlcnNpc3RlbnRUeXBlIHRhcmdldFR5cGUgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0VHlwZSgpOwotCQkJaWYgKCh0YXJnZXRUeXBlICE9IG51bGwpICYmIHRhcmdldFR5cGUuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuY3JlYXRlUmVuYW1lVGFyZ2V0Q2xhc3NFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZU1vdmVUeXBlRWRpdHMob3JpZ2luYWxUeXBlLCBuZXdQYWNrYWdlKSwKLQkJCQl0aGlzLmNyZWF0ZU1hcEtleUNsYXNzTW92ZVR5cGVFZGl0cyhvcmlnaW5hbFR5cGUsIG5ld1BhY2thZ2UpLAotCQkJCXRoaXMuY3JlYXRlVGFyZ2V0Q2xhc3NNb3ZlVHlwZUVkaXRzKG9yaWdpbmFsVHlwZSwgbmV3UGFja2FnZSkKLQkJCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBLZXlDbGFzc01vdmVUeXBlRWRpdHMoSVR5cGUgb3JpZ2luYWxUeXBlLCBJUGFja2FnZUZyYWdtZW50IG5ld1BhY2thZ2UpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkTWFwS2V5Q2xhc3MgIT0gbnVsbCkgewotCQkJUGVyc2lzdGVudFR5cGUgbWFwS2V5VHlwZSA9IHRoaXMuZ2V0UmVzb2x2ZWRNYXBLZXlUeXBlKCk7Ci0JCQlpZiAoKG1hcEtleVR5cGUgIT0gbnVsbCkgJiYgbWFwS2V5VHlwZS5pc0ZvcihvcmlnaW5hbFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCcuJykpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlTWFwS2V5Q2xhc3NSZW5hbWVQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlVGFyZ2V0Q2xhc3NNb3ZlVHlwZUVkaXRzKElUeXBlIG9yaWdpbmFsVHlwZSwgSVBhY2thZ2VGcmFnbWVudCBuZXdQYWNrYWdlKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZFRhcmdldENsYXNzICE9IG51bGwpIHsKLQkJCVBlcnNpc3RlbnRUeXBlIHRhcmdldFR5cGUgPSB0aGlzLmdldFJlc29sdmVkVGFyZ2V0VHlwZSgpOwotCQkJaWYgKCh0YXJnZXRUeXBlICE9IG51bGwpICYmIHRhcmdldFR5cGUuaXNGb3Iob3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpKSkgewotCQkJCXJldHVybiBuZXcgU2luZ2xlRWxlbWVudEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pih0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuY3JlYXRlUmVuYW1lVGFyZ2V0Q2xhc3NQYWNrYWdlRWRpdChuZXdQYWNrYWdlLmdldEVsZW1lbnROYW1lKCkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKElQYWNrYWdlRnJhZ21lbnQgb3JpZ2luYWxQYWNrYWdlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCQlzdXBlci5jcmVhdGVSZW5hbWVQYWNrYWdlRWRpdHMob3JpZ2luYWxQYWNrYWdlLCBuZXdOYW1lKSwKLQkJCQl0aGlzLmNyZWF0ZU1hcEtleUNsYXNzUmVuYW1lUGFja2FnZUVkaXRzKG9yaWdpbmFsUGFja2FnZSwgbmV3TmFtZSksCi0JCQkJdGhpcy5jcmVhdGVUYXJnZXRDbGFzc1JlbmFtZVBhY2thZ2VFZGl0cyhvcmlnaW5hbFBhY2thZ2UsIG5ld05hbWUpCi0JCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTWFwS2V5Q2xhc3NSZW5hbWVQYWNrYWdlRWRpdHMoSVBhY2thZ2VGcmFnbWVudCBvcmlnaW5hbFBhY2thZ2UsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmICh0aGlzLnNwZWNpZmllZE1hcEtleUNsYXNzICE9IG51bGwpIHsKLQkJCVBlcnNpc3RlbnRUeXBlIG1hcEtleVR5cGUgPSB0aGlzLmdldFJlc29sdmVkTWFwS2V5VHlwZSgpOwotCQkJaWYgKChtYXBLZXlUeXBlICE9IG51bGwpICYmIG1hcEtleVR5cGUuaXNJbihvcmlnaW5hbFBhY2thZ2UpKSB7Ci0JCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8UmVwbGFjZUVkaXQ+KHRoaXMuY3JlYXRlTWFwS2V5Q2xhc3NSZW5hbWVQYWNrYWdlRWRpdChuZXdOYW1lKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVwbGFjZUVkaXQgY3JlYXRlTWFwS2V5Q2xhc3NSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gdGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmNyZWF0ZVJlbmFtZU1hcEtleUNsYXNzUGFja2FnZUVkaXQobmV3TmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVUYXJnZXRDbGFzc1JlbmFtZVBhY2thZ2VFZGl0cyhJUGFja2FnZUZyYWdtZW50IG9yaWdpbmFsUGFja2FnZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkVGFyZ2V0Q2xhc3MgIT0gbnVsbCkgewotCQkJUGVyc2lzdGVudFR5cGUgdGFyZ2V0VHlwZSA9IHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRUeXBlKCk7Ci0JCQlpZiAoKHRhcmdldFR5cGUgIT0gbnVsbCkgJiYgdGFyZ2V0VHlwZS5pc0luKG9yaWdpbmFsUGFja2FnZSkpIHsKLQkJCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRJdGVyYWJsZTxSZXBsYWNlRWRpdD4odGhpcy54bWxBdHRyaWJ1dGVNYXBwaW5nLmNyZWF0ZVJlbmFtZVRhcmdldENsYXNzUGFja2FnZUVkaXQobmV3TmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlVGFyZ2V0Q2xhc3MobWVzc2FnZXMpOwotCQl0aGlzLnZhbGlkYXRlTWFwS2V5Q2xhc3MobWVzc2FnZXMpOwotCQl0aGlzLm9yZGVyYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLmNvbGxlY3Rpb25UYWJsZS52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQl0aGlzLnZhbGlkYXRlVmFsdWUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZU1hcEtleShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVGFyZ2V0Q2xhc3MoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5nZXRUYXJnZXRDbGFzcygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRCwKLQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFRhcmdldENsYXNzVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLnRhcmdldENsYXNzRXhpc3RzKCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfRE9FU19OT1RfRVhJU1QsCi0JCQkJCUVNUFRZX1NUUklOR19BUlJBWSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRUYXJnZXRDbGFzc1RleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJCXJldHVybjsKLQkJfQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQlpZiAoICEgSkRUVG9vbHMudHlwZUlzQmFzaWMoamF2YVByb2plY3QsIHRoaXMuZ2V0VGFyZ2V0Q2xhc3MoKSkgJiYgKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgPT0gbnVsbCkpIHsKLQkJCW1lc3NhZ2VzLmFkZCgKLQkJCQlEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEUsCi0JCQkJCW5ldyBTdHJpbmdbXSB7dGhpcy5nZXRUYXJnZXRDbGFzcygpfSwKLQkJCQkJdGhpcywKLQkJCQkJdGhpcy5nZXRUYXJnZXRDbGFzc1RleHRSYW5nZSgpCi0JCQkJKQotCQkJKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHRhcmdldENsYXNzRXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5yZXNvbHZlSmR0VHlwZSh0aGlzLmdldFRhcmdldENsYXNzKCkpICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUYXJnZXRDbGFzc1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSh0aGlzLnhtbEF0dHJpYnV0ZU1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBLZXlDbGFzcyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhQXR0cmlidXRlID0gdGhpcy5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlpZiAoKGphdmFBdHRyaWJ1dGUgIT0gbnVsbCkgJiYgamF2YUF0dHJpYnV0ZS5nZXRKcGFDb250YWluZXJEZWZpbml0aW9uKCkuaXNNYXAoKSkgewotCQkJdGhpcy52YWxpZGF0ZU1hcEtleUNsYXNzXyhtZXNzYWdlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZU1hcEtleUNsYXNzXyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRNYXBLZXlDbGFzcygpKSkgewotCQkJbWVzc2FnZXMuYWRkKAotCQkJCURlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuYnVpbGRNZXNzYWdlKAotCQkJCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCwKLQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKQotCQkJCSkKLQkJCSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoICEgdGhpcy5tYXBLZXlDbGFzc0V4aXN0cygpKSB7Ci0JCQltZXNzYWdlcy5hZGQoCi0JCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJCUlNZXNzYWdlLkhJR0hfU0VWRVJJVFksCi0JCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBfS0VZX0NMQVNTX05PVF9FWElTVCwKLQkJCQkJRU1QVFlfU1RSSU5HX0FSUkFZLAotCQkJCQl0aGlzLAotCQkJCQl0aGlzLmdldE1hcEtleUNsYXNzVGV4dFJhbmdlKCkKLQkJCQkpCi0JCQkpOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFwS2V5Q2xhc3NFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRFbnRpdHlNYXBwaW5ncygpLnJlc29sdmVKZHRUeXBlKHRoaXMuZ2V0TWFwS2V5Q2xhc3MoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldE1hcEtleUNsYXNzVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKHRoaXMueG1sQXR0cmlidXRlTWFwcGluZy5nZXRNYXBLZXlDbGFzc1RleHRSYW5nZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVZhbHVlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdGhpcy5jb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJLy9UT0RPIHNob3VsZCB3ZSBoYW5kbGUgdmFsaWRhdGlvbiB3aGVuIHRoZSB0eXBlIGlzIGVtYmVkZGFibGUsCi0JCS8vYnV0IGEgdmFsdWUgY29sdW1uIGlzIHNwZWNpZmllZCwgb3IgdGhpbmdzIGxpa2UgdGhhdCBpZiB0aGF0IGlzIGludmFsaWQ/Ci0JCXN3aXRjaCAodGhpcy52YWx1ZVR5cGUpIHsKLQkJCWNhc2UgQkFTSUNfVFlQRSA6Ci0JCQkJdGhpcy52YWx1ZUNvbHVtbi52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTUJFRERBQkxFX1RZUEUgOgotCQkJCXRoaXMudmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkJCXRoaXMudmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwS2V5KExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKHRoaXMuZ2V0TWFwS2V5KCkgPT0gbnVsbCkgewotCQkJdGhpcy52YWxpZGF0ZU1hcEtleV8obWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfSBlbHNlIHsKLQkJCS8vVE9ETyB2YWxpZGF0ZSB0aGF0IHRoZSBtYXAga2V5IHJlZmVycyB0byBhbiBleGlzdGluZyBhdHRyaWJ1dGUKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwS2V5XyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN3aXRjaCAodGhpcy5rZXlUeXBlKSB7Ci0JCQljYXNlIEJBU0lDX1RZUEUgOgotCQkJCXRoaXMubWFwS2V5Q29sdW1uLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCQkJdGhpcy5tYXBLZXlDb252ZXJ0ZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5USVRZX1RZUEUgOgotCQkJCWZvciAoT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uIDogdGhpcy5nZXRNYXBLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQkJCWpvaW5Db2x1bW4udmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVNQkVEREFCTEVfVFlQRSA6Ci0JCQkJdGhpcy5tYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkJCS8vdmFsaWRhdGUgbWFwIGtleSBhc3NvY2lhdGlvbiBvdmVycmlkZXMKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG93bmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIHRoZSB2YXJpb3VzIChjb2x1bW4gYW5kIG92ZXJyaWRlKSBvd25lcnMgaGF2ZSBsb3RzIG9mIGNvbW1vbgotCSAqIGludGVyYWN0aW9ucyB3aXRoIHRoZSBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3duZXIKLQl7Ci0JCXB1YmxpYyBPcm1UeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgdGFibGUgPSB0aGlzLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHRhYmxlLmdldE5hbWUoKSwgdGFibGVOYW1lKSA/IHRhYmxlLmdldERiVGFibGUoKSA6IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRDYW5kaWRhdGVUYWJsZU5hbWVzKCkgewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBJZiB0aGVyZSBpcyBhIHNwZWNpZmllZCB0YWJsZSBuYW1lIGl0IG5lZWRzIHRvIGJlIHRoZSBzYW1lCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUuICB0aGUgdGFibGUgaXMgYWx3YXlzIHRoZSBjb2xsZWN0aW9uIHRhYmxlCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZURpZmZlcmVudCh0aGlzLmdldERlZmF1bHRUYWJsZU5hbWUoKSwgdGFibGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFPdmVycmlkZU5hbWVzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdOYW1lKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9ybUNvbGxlY3Rpb25UYWJsZTJfMCBnZXRDb2xsZWN0aW9uVGFibGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgWG1sRWxlbWVudENvbGxlY3Rpb24gZ2V0WG1sTWFwcGluZygpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIFZhbHVlQ29sdW1uT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdE93bmVyCi0JCWltcGxlbWVudHMgT3JtQ29sdW1uLk93bmVyCi0JewotCQlwdWJsaWMgWG1sQ29sdW1uIGdldFhtbENvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLmdldFhtbE1hcHBpbmcoKS5nZXRDb2x1bW4oKTsKLQkJfQotCi0JCXB1YmxpYyBYbWxDb2x1bW4gYnVpbGRYbWxDb2x1bW4oKSB7Ci0JCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCk7Ci0JCQl0aGlzLmdldFhtbE1hcHBpbmcoKS5zZXRDb2x1bW4oeG1sQ29sdW1uKTsKLQkJCXJldHVybiB4bWxDb2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVYbWxDb2x1bW4oKSB7Ci0JCQl0aGlzLmdldFhtbE1hcHBpbmcoKS5zZXRDb2x1bW4obnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRNYXBwaW5nTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBOYW1lZENvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QmFzZUNvbHVtbikgY29sdW1uLCAoVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBDb2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIE1hcEtleUNvbHVtbk93bmVyCi0JCWV4dGVuZHMgQWJzdHJhY3RPd25lcgotCQlpbXBsZW1lbnRzIE9ybUNvbHVtbi5Pd25lcgotCXsKLQkJcHVibGljIFhtbENvbHVtbiBnZXRYbWxDb2x1bW4oKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRYbWxNYXBwaW5nKCkuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCX0KLQotCQlwdWJsaWMgWG1sQ29sdW1uIGJ1aWxkWG1sQ29sdW1uKCkgewotCQkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpOwotCQkJdGhpcy5nZXRYbWxNYXBwaW5nKCkuc2V0TWFwS2V5Q29sdW1uKHhtbENvbHVtbik7Ci0JCQlyZXR1cm4geG1sQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlWG1sQ29sdW1uKCkgewotCQkJdGhpcy5nZXRYbWxNYXBwaW5nKCkuc2V0TWFwS2V5Q29sdW1uKG51bGwpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZ05hbWUoKSArICJfS0VZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZENvbHVtblZhbGlkYXRvcihSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbiwgTmFtZWRDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBNYXBLZXlDb2x1bW5WYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUJhc2VDb2x1bW4pIGNvbHVtbiwgKFRhYmxlQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIpIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgQ29sbGVjdGlvblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lciBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgVmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdE93bmVyCi0JCWltcGxlbWVudHMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcgotCXsKLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpOwotCQkJcmV0dXJuICh0eXBlTWFwcGluZyAhPSBudWxsKSA/IHR5cGVNYXBwaW5nLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0WG1sT3ZlcnJpZGVzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0WG1sTWFwcGluZygpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgUmVsYXRpb25zaGlwIHJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIGNvbHVtbk93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlKSBvdmVycmlkZSwgKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCAoUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyKSBjb2x1bW5Pd25lciwgKEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBDb2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVWYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUpIG92ZXJyaWRlLCAoQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gSnB0VmFsaWRhdG9yLk51bGwuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gSnB0VmFsaWRhdG9yLk51bGwuaW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seVRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gSnB0VmFsaWRhdG9yLk51bGwuaW5zdGFuY2UoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiB2YWx1ZSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyIG93bmVyICoqKioqKioqKioKLQotCXByb3RlY3RlZCBjbGFzcyBWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyT3duZXIKLQkJZXh0ZW5kcyBBYnN0cmFjdE93bmVyCi0JCWltcGxlbWVudHMgT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIKLQl7Ci0JCXB1YmxpYyBUeXBlTWFwcGluZyBnZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCkgewotCQkJcmV0dXJuIEFic3RyYWN0T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRBbGxPdmVycmlkYWJsZU5hbWVzKCkgewotCQkJVHlwZU1hcHBpbmcgb3ZlcnJpZGRlblR5cGVNYXBwaW5nID0gdGhpcy5nZXRPdmVycmlkYWJsZVR5cGVNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKG92ZXJyaWRkZW5UeXBlTWFwcGluZyAhPSBudWxsKSA/IG92ZXJyaWRkZW5UeXBlTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQkJfQotCi0JCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0WG1sT3ZlcnJpZGVzKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0WG1sTWFwcGluZygpLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl9Ci0KLQkJcHVibGljIENvbHVtbiByZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5yZXNvbHZlT3ZlcnJpZGRlbkNvbHVtbih0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSwgYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkT3ZlcnJpZGVWYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgT3ZlcnJpZGVDb250YWluZXIgY29udGFpbmVyLCBPdmVycmlkZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IEF0dHJpYnV0ZU92ZXJyaWRlVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIChBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcikgY29udGFpbmVyLCB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IEVtYmVkZGFibGVPdmVycmlkZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5T3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5QmFzZUNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5QmFzZUNvbHVtbi5Pd25lciBjb2x1bW5Pd25lciwgVGFibGVDb2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUpIG92ZXJyaWRlLCBjb2x1bW4sIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgQ29sbGVjdGlvblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyKCkpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIGNvbnRhaW5lciBvd25lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJPd25lcgotCQlleHRlbmRzIEFic3RyYWN0T3duZXIKLQkJaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5Pd25lcgotCXsKLQkJcHVibGljIFR5cGVNYXBwaW5nIGdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRSZXNvbHZlZE1hcEtleUVtYmVkZGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldEFsbE92ZXJyaWRhYmxlTmFtZXMoKSB7Ci0JCQlUeXBlTWFwcGluZyBvdmVycmlkZGVuVHlwZU1hcHBpbmcgPSB0aGlzLmdldE92ZXJyaWRhYmxlVHlwZU1hcHBpbmcoKTsKLQkJCXJldHVybiAob3ZlcnJpZGRlblR5cGVNYXBwaW5nICE9IG51bGwpID8gb3ZlcnJpZGRlblR5cGVNYXBwaW5nLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCQl9Ci0KLQkJcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRYbWxPdmVycmlkZXMoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRYbWxNYXBwaW5nKCkuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ29sdW1uIHJlc29sdmVPdmVycmlkZGVuQ29sdW1uKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLnJlc29sdmVPdmVycmlkZGVuQ29sdW1uKHRoaXMuZ2V0T3ZlcnJpZGFibGVUeXBlTWFwcGluZygpLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRPdmVycmlkZVZhbGlkYXRvcihSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlLCBPdmVycmlkZUNvbnRhaW5lciBjb250YWluZXIsIE92ZXJyaWRlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVWYWxpZGF0b3IodGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCksIChSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlKSBvdmVycmlkZSwgKEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKSBjb250YWluZXIsIHRleHRSYW5nZVJlc29sdmVyLCBuZXcgRW1iZWRkYWJsZU92ZXJyaWRlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlCYXNlQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlCYXNlQ29sdW1uLk93bmVyIGNvbHVtbk93bmVyLCBUYWJsZUNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uVmFsaWRhdG9yKHRoaXMuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLCAoUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSkgb3ZlcnJpZGUsIGNvbHVtbiwgdGV4dFJhbmdlUmVzb2x2ZXIsIG5ldyBDb2xsZWN0aW9uVGFibGVUYWJsZURlc2NyaXB0aW9uUHJvdmlkZXIoKSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKioqKioqIG1hcCBrZXkgam9pbiBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGNsYXNzIE1hcEtleUpvaW5Db2x1bW5Pd25lcgotCQlpbXBsZW1lbnRzIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lcgotCXsKLQkJcHJvdGVjdGVkIE1hcEtleUpvaW5Db2x1bW5Pd25lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZU5hbWUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRDb2x1bW5OYW1lKFJlYWRPbmx5TmFtZWRDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXROYW1lKCkgKyAiX0tFWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldE5hbWUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFJlc29sdmVkTWFwS2V5RW50aXR5KCk7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgdGFibGUgbmFtZSBpdCBuZWVkcyB0byBiZSB0aGUgc2FtZSBhcwotCQkgKiB0aGUgZGVmYXVsdCB0YWJsZSBuYW1lLiAgVGhlIHRhYmxlIGlzIGFsd2F5cyB0aGUgY29sbGVjdGlvbiB0YWJsZS4KLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuZ2V0RGVmYXVsdFRhYmxlTmFtZSgpLCB0YWJsZU5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXREYlRhYmxlKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSBnZXRSZWZlcmVuY2VkQ29sdW1uRGJUYWJsZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFJlc29sdmVkTWFwS2V5RW50aXR5KCkuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGpvaW5Db2x1bW5Jc0RlZmF1bHQoUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5kZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAudGhpcy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJCXJldHVybiBBYnN0cmFjdE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgTWFwS2V5Sm9pbkNvbHVtblZhbGlkYXRvcigKLQkJCQl0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwKLQkJCQkoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sCi0JCQkJdGhpcywgCi0JCQkJKEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcikgdGV4dFJhbmdlUmVzb2x2ZXIsCi0JCQkJbmV3IENvbGxlY3Rpb25UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ2FjaGVhYmxlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmJhOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ2FjaGVhYmxlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY2FjaGVhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQ2FjaGVhYmxlMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1DYWNoZWFibGUyXzAKLXsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRDYWNoZWFibGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdENhY2hlYWJsZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1DYWNoZWFibGUyXzAoT3JtQ2FjaGVhYmxlSG9sZGVyMl8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZENhY2hlYWJsZSA9IHRoaXMuZ2V0WG1sQ2FjaGVhYmxlKCkuZ2V0Q2FjaGVhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlXyh0aGlzLmdldFhtbENhY2hlYWJsZSgpLmdldENhY2hlYWJsZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRDYWNoZWFibGUodGhpcy5idWlsZERlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhY2hlYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhY2hlYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhY2hlYWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0Q2FjaGVhYmxlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuIGNhY2hlYWJsZSkgewotCQl0aGlzLnNldFNwZWNpZmllZENhY2hlYWJsZV8oY2FjaGVhYmxlKTsKLQkJdGhpcy5nZXRYbWxDYWNoZWFibGUoKS5zZXRDYWNoZWFibGUoY2FjaGVhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRDYWNoZWFibGVfKEJvb2xlYW4gY2FjaGVhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRDYWNoZWFibGU7Ci0JCXRoaXMuc3BlY2lmaWVkQ2FjaGVhYmxlID0gY2FjaGVhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSwgb2xkLCBjYWNoZWFibGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhY2hlYWJsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXREZWZhdWx0Q2FjaGVhYmxlKGJvb2xlYW4gY2FjaGVhYmxlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0Q2FjaGVhYmxlOwotCQl0aGlzLmRlZmF1bHRDYWNoZWFibGUgPSBjYWNoZWFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSwgb2xkLCBjYWNoZWFibGUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuY2FsY3VsYXRlRGVmYXVsdENhY2hlYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1DYWNoZWFibGVIb2xkZXIyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUNhY2hlYWJsZUhvbGRlcjJfMCBnZXRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBYbWxDYWNoZWFibGVfMl8wIGdldFhtbENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2FjaGVhYmxlSG9sZGVyKCkuZ2V0WG1sQ2FjaGVhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxDYWNoZWFibGUoKS5nZXRDYWNoZWFibGVUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldENhY2hlYWJsZUhvbGRlcigpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWViN2U5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5TmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lk1hcHBpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5OYW1lZENvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQ29sbGVjdGlvblRhYmxlVGFibGVEZXNjcmlwdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuSm9pbkNvbHVtblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBjb2xsZWN0aW9uIHRhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wCi0JZXh0ZW5kcyBHZW5lcmljT3JtUmVmZXJlbmNlVGFibGU8WG1sQ29sbGVjdGlvblRhYmxlPgotCWltcGxlbWVudHMgT3JtQ29sbGVjdGlvblRhYmxlMl8wCi17Ci0JcHVibGljIEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHBhcmVudCwgT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBidWlsZEpvaW5Db2x1bW5Pd25lcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uT3duZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogWE1MIHRhYmxlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBYbWxDb2xsZWN0aW9uVGFibGUgZ2V0WG1sVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKS5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sQ29sbGVjdGlvblRhYmxlIGJ1aWxkWG1sVGFibGUoKSB7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSB4bWxDb2xsZWN0aW9uVGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKTsKLQkJdGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkuc2V0Q29sbGVjdGlvblRhYmxlKHhtbENvbGxlY3Rpb25UYWJsZSk7Ci0JCXJldHVybiB4bWxDb2xsZWN0aW9uVGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sVGFibGUoKSB7Ci0JCXRoaXMuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpLnNldENvbGxlY3Rpb25UYWJsZShudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sRWxlbWVudENvbGxlY3Rpb24gZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdE5hbWUoKSB7Ci0JCXJldHVybiBNYXBwaW5nVG9vbHMuYnVpbGRDb2xsZWN0aW9uVGFibGVEZWZhdWx0TmFtZSh0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShDb2xsZWN0aW9uVGFibGUyXzAgb2xkQ29sbGVjdGlvblRhYmxlKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGcm9tKG9sZENvbGxlY3Rpb25UYWJsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiBjb2x1bW4gb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogb3duZXIgZm9yICJiYWNrLXBvaW50ZXIiIGpvaW4gY29sdW1uczsKLQkgKiB0aGVzZSBwb2ludCBhdCB0aGUgc291cmNlL293bmluZyBlbnRpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgSm9pbkNvbHVtbk93bmVyCi0JCWltcGxlbWVudHMgT3JtUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyCi0JewotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbk93bmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBUeXBlTWFwcGluZyBnZXRUeXBlTWFwcGluZygpIHsKLQkJCXJldHVybiB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpLmdldFR5cGVNYXBwaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZSByZXNvbHZlRGJUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldE5hbWUoKSwgdGFibGVOYW1lKSA/Ci0JCQkJCUdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAudGhpcy5nZXREYlRhYmxlKCkgOgotCQkJCQludWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0Q29sdW1uTmFtZShSZWFkT25seU5hbWVkQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIE1hcHBpbmdUb29scy5idWlsZEpvaW5Db2x1bW5EZWZhdWx0TmFtZSgoUmVhZE9ubHlKb2luQ29sdW1uKSBjb2x1bW4sIHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ5IGRlZmF1bHQsIHRoZSBqb2luIGNvbHVtbiBpcywgb2J2aW91c2x5LCBpbiB0aGUgY29sbGVjdGlvbiB0YWJsZTsKLQkJICogbm90IHN1cmUgd2hldGhlciBpdCBjYW4gYmUgYW55d2hlcmUgZWxzZS4uLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAudGhpcy5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlIGdldFJlZmVyZW5jZWRDb2x1bW5EYlRhYmxlKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gam9pbkNvbHVtbklzRGVmYXVsdChSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCXJldHVybiBHZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wLnRoaXMuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKSA9PSBqb2luQ29sdW1uOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHRoZSBkZWZhdWx0IHRhYmxlIG5hbWUgaXMgYWx3YXlzIHZhbGlkIGFuZCBhIHNwZWNpZmllZCB0YWJsZSBuYW1lCi0JCSAqIGlzIHByb2hpYml0ZWQgKHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBlbHNld2hlcmUpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiB0YWJsZU5hbWVJc0ludmFsaWQoU3RyaW5nIHRhYmxlTmFtZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlVGFibGVOYW1lcygpIHsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW50aXR5IGdldFJlbGF0aW9uc2hpcFRhcmdldCgpIHsKLQkJCXJldHVybiB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpLmdldEVudGl0eSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQkJLy9UT0RPCi0JCQlyZXR1cm4gbnVsbDsgLy9JICp0aGluayogdGhpcyBpcyBjb3JyZWN0Ci0vLwkJCS8vcmV0dXJuIEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wLnRoaXMuZ2V0UGFyZW50KCkuZ2V0TmFtZSgpOwotLy8JCQlFbnRpdHkgdGFyZ2V0RW50aXR5ID0gR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKS5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpOwotLy8JCQlpZiAodGFyZ2V0RW50aXR5ID09IG51bGwpIHsKLS8vCQkJCXJldHVybiBudWxsOwotLy8JCQl9Ci0vLwkJCWZvciAoUGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRhcmdldEVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmFsbEF0dHJpYnV0ZXMoKSkpIHsKLS8vCQkJCWlmIChlYWNoLmdldE1hcHBpbmcoKS5pc093bmVkQnkoZ2V0UmVsYXRpb25zaGlwTWFwcGluZygpKSkgewotLy8JCQkJCXJldHVybiBlYWNoLmdldE5hbWUoKTsKLS8vCQkJCX0KLS8vCQkJfQotLy8JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBQZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCQlyZXR1cm4gR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMC50aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAudGhpcy5nZXRKb2luQ29sdW1uc1NpemUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZ2V0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgewotCQkJcmV0dXJuIEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAudGhpcy5nZXRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRDb2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlOYW1lZENvbHVtbiBjb2x1bW4sIE5hbWVkQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCXJldHVybiBuZXcgSm9pbkNvbHVtblZhbGlkYXRvcih0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSwgKFJlYWRPbmx5Sm9pbkNvbHVtbikgY29sdW1uLCB0aGlzLCAoSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyKSB0ZXh0UmFuZ2VSZXNvbHZlciwgbmV3IENvbGxlY3Rpb25UYWJsZVRhYmxlRGVzY3JpcHRpb25Qcm92aWRlcigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybURlcml2ZWRJZGVudGl0eTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRGVyaXZlZElkZW50aXR5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjM4ZmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRGVyaXZlZElkZW50aXR5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybURlcml2ZWRJZGVudGl0eTJfMAotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtRGVyaXZlZElkZW50aXR5Ml8wCi17Ci0JcHJvdGVjdGVkIERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIHN0cmF0ZWd5OwotCi0JcHJvdGVjdGVkIGZpbmFsIE9ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgaWRTdHJhdGVneTsKLQotCXByb3RlY3RlZCBmaW5hbCBPcm1NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBtYXBzSWRTdHJhdGVneTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1EZXJpdmVkSWRlbnRpdHkyXzAoT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5pZFN0cmF0ZWd5ID0gdGhpcy5idWlsZElkU3RyYXRlZ3koKTsKLQkJdGhpcy5tYXBzSWRTdHJhdGVneSA9IHRoaXMuYnVpbGRNYXBzSWRTdHJhdGVneSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLmlkU3RyYXRlZ3kuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLm1hcHNJZFN0cmF0ZWd5LnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLmlkU3RyYXRlZ3kudXBkYXRlKCk7Ci0JCXRoaXMubWFwc0lkU3RyYXRlZ3kudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcHJlZG9taW5hbnQgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JcHVibGljIERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldFByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN0cmF0ZWd5KERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIHN0cmF0ZWd5KSB7Ci0JCURlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIG9sZCA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBSRURPTUlOQU5UX0RFUklWRURfSURFTlRJVFlfU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0cmF0ZWd5KCkgewotCQl0aGlzLnNldFN0cmF0ZWd5KHRoaXMuYnVpbGRTdHJhdGVneSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgYnVpbGRTdHJhdGVneSgpIHsKLQkJaWYgKHRoaXMubWFwc0lkU3RyYXRlZ3kuaXNTcGVjaWZpZWQoKSkgewotCQkJcmV0dXJuIHRoaXMubWFwc0lkU3RyYXRlZ3k7Ci0JCX0KLQkJaWYgKHRoaXMuaWRTdHJhdGVneS5pc1NwZWNpZmllZCgpKSB7Ci0JCQlyZXR1cm4gdGhpcy5pZFN0cmF0ZWd5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBudWxsIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIHVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQl0aGlzLm1hcHNJZFN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMuaWRTdHJhdGVneS5yZW1vdmVTdHJhdGVneSgpOwotCQl0aGlzLnVwZGF0ZVN0cmF0ZWd5KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElEIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLmlkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJdGhpcy5pZFN0cmF0ZWd5LmFkZFN0cmF0ZWd5KCk7Ci0JCXRoaXMubWFwc0lkU3RyYXRlZ3kucmVtb3ZlU3RyYXRlZ3koKTsKLQkJdGhpcy51cGRhdGVTdHJhdGVneSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneSA9PSB0aGlzLmlkU3RyYXRlZ3k7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgYnVpbGRJZFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtYXBzIElEIHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBnZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwc0lkU3RyYXRlZ3k7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXRoaXMubWFwc0lkU3RyYXRlZ3kuYWRkU3RyYXRlZ3koKTsKLQkJdGhpcy5pZFN0cmF0ZWd5LnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5ID09IHRoaXMubWFwc0lkU3RyYXRlZ3k7Ci0JfQotCi0JcHJvdGVjdGVkIE9ybU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGJ1aWxkTWFwc0lkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShPcm1EZXJpdmVkSWRlbnRpdHkyXzAgb2xkRGVyaXZlZElkZW50aXR5KSB7Ci0JCXRoaXMuaWRTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGREZXJpdmVkSWRlbnRpdHkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJdGhpcy5tYXBzSWRTdHJhdGVneS5pbml0aWFsaXplRnJvbShvbGREZXJpdmVkSWRlbnRpdHkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCXRoaXMudXBkYXRlU3RyYXRlZ3koKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCWlmICh0aGlzLnN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCSgoWG1sQ29udGV4dE5vZGUpIHRoaXMuc3RyYXRlZ3kpLnZhbGlkYXRlKG1lc3NhZ2VzLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA1YzgyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotCWV4dGVuZHMgQWJzdHJhY3RPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA8WG1sRWxlbWVudENvbGxlY3Rpb24+Ci17Ci0JcHVibGljIEdlbmVyaWNPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVsZW1lbnRDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkYWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDU1MjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFFbWJlZGRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLQotLyoqCi0gKiBKUEEgMi4wCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBlbWJlZGRhYmxlIHR5cGUgbWFwcGluZwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUVtYmVkZGFibGUyXzAKLQlleHRlbmRzIEFic3RyYWN0T3JtRW1iZWRkYWJsZTxYbWxFbWJlZGRhYmxlPgotewotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkYWJsZTJfMChPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnQsIFhtbEVtYmVkZGFibGUgcmVzb3VyY2VNYXBwaW5nKSB7Ci0JCXN1cGVyKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBhdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChTdHJpbmcgYXR0cmlidXRlTWFwcGluZ0tleSkgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyhHZW5lcmljSmF2YUVtYmVkZGFibGUyXzAuQUxMT1dFRF9BVFRSSUJVVEVfTUFQUElOR19LRVlTLCBhdHRyaWJ1dGVNYXBwaW5nS2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NTE1YTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1EZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAKLXsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWx1ZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wKE9ybURlcml2ZWRJZGVudGl0eTJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuc2V0VmFsdWVfKHZhbHVlKTsKLQkJdGhpcy5nZXRYbWxNYXBwaW5nKCkuc2V0SWQodmFsdWUgPyBCb29sZWFuLlRSVUUgOiBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oYm9vbGVhbiB2YWx1ZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQlCb29sZWFuIHhtbFZhbHVlID0gdGhpcy5nZXRYbWxNYXBwaW5nKCkuZ2V0SWQoKTsKLQkJcmV0dXJuICh4bWxWYWx1ZSAhPSBudWxsKSAmJiB4bWxWYWx1ZS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtRGVyaXZlZElkZW50aXR5Ml8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1EZXJpdmVkSWRlbnRpdHkyXzApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1EZXJpdmVkSWRlbnRpdHkyXzAgZ2V0RGVyaXZlZElkZW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIGdldFhtbE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0cmF0ZWd5KCkgewotCQl0aGlzLnNldFZhbHVlKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN0cmF0ZWd5KCkgewotCQl0aGlzLnNldFZhbHVlKGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIG9sZFN0cmF0ZWd5KSB7Ci0JCXRoaXMuc2V0VmFsdWUob2xkU3RyYXRlZ3kuZ2V0VmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQkvLyBubyB2YWxpZGF0aW9uIHJ1bGVzCi0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxNYXBwaW5nKCkuZ2V0SWRUZXh0UmFuZ2UoKTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgIT0gbnVsbCkgPyB0ZXh0UmFuZ2UgOiB0aGlzLmdldERlcml2ZWRJZGVudGl0eSgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzMmU0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ob3ROdWxsRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU2luZ2xlRWxlbWVudEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wCi17Ci0JcHJvdGVjdGVkIFN0cmluZyBzcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWU7Ci0JLy8gbm8gZGVmYXVsdAotCi0KLQlwdWJsaWMgR2VuZXJpY09ybU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wKE9ybURlcml2ZWRJZGVudGl0eTJfMCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy5zcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUgPSB0aGlzLmdldFhtbE1hcHBpbmcoKS5nZXRNYXBzSWQoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3luY2hyb25pemUvdXBkYXRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aFJlc291cmNlTW9kZWwoKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWVfKHRoaXMuZ2V0WG1sTWFwcGluZygpLmdldE1hcHNJZCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSUQgYXR0cmlidXRlIG5hbWUgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRJZEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCS8vIHRoZXJlIGlzIG5vIGRlZmF1bHQKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKFN0cmluZyBpZEF0dHJpYnV0ZU5hbWUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWVfKGlkQXR0cmlidXRlTmFtZSk7Ci0JCXRoaXMuZ2V0WG1sTWFwcGluZygpLnNldE1hcHNJZChpZEF0dHJpYnV0ZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZV8oU3RyaW5nIGlkQXR0cmlidXRlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWU7Ci0JCXRoaXMuc3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lID0gaWRBdHRyaWJ1dGVOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lEX0FUVFJJQlVURV9OQU1FX1BST1BFUlRZLCBvbGQsIGlkQXR0cmlidXRlTmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0SWRBdHRyaWJ1dGVOYW1lKCkgewotCQkvLyB0aGVyZSBpcyBubyB3YXkgdG8gaGF2ZSBhIGRlZmF1bHQgaW4geG1sCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRlZmF1bHRJZEF0dHJpYnV0ZU5hbWVJc1Bvc3NpYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybURlcml2ZWRJZGVudGl0eTJfMCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtRGVyaXZlZElkZW50aXR5Ml8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtRGVyaXZlZElkZW50aXR5Ml8wIGdldERlcml2ZWRJZGVudGl0eSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwcGluZygpOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIGdldFhtbE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0T3duaW5nVHlwZU1hcHBpbmcoKS5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYW5kaWRhdGVJZEF0dHJpYnV0ZU5hbWVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnQodGhpcy5nZXROb25OdWxsQ2FuZGlkYXRlSWRBdHRyaWJ1dGVOYW1lcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXROb25OdWxsQ2FuZGlkYXRlSWRBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxTdHJpbmc+KHRoaXMuZ2V0Q2FuZGlkYXRlSWRBdHRyaWJ1dGVOYW1lcygpLCBOb3ROdWxsRmlsdGVyLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q2FuZGlkYXRlSWRBdHRyaWJ1dGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIFN0cmluZz4odGhpcy5nZXRDYW5kaWRhdGVJZEF0dHJpYnV0ZU1hcHBpbmdzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIG1hcHBpbmcuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRDYW5kaWRhdGVJZEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENhbmRpZGF0ZUlkQXR0cmlidXRlTWFwcGluZ3ModGhpcy5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRDYW5kaWRhdGVJZEF0dHJpYnV0ZU1hcHBpbmdzKEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGF0dHJpYnV0ZU1hcHBpbmdzKSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4odGhpcy5nZXRDYW5kaWRhdGVJZEF0dHJpYnV0ZU1hcHBpbmdMaXN0cyhhdHRyaWJ1dGVNYXBwaW5ncykpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPj4gZ2V0Q2FuZGlkYXRlSWRBdHRyaWJ1dGVNYXBwaW5nTGlzdHMoSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gYXR0cmlidXRlTWFwcGluZ3MpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmcsIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+PihhdHRyaWJ1dGVNYXBwaW5ncykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4gdHJhbnNmb3JtKEF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZykgewotCQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpLCBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpID8KLQkJCQkJCXRoaXMuZ2V0RW1iZWRkZWRJZE1hcHBpbmdDaG9pY2VJdGVyYWJsZSgoRW1iZWRkZWRJZE1hcHBpbmcpIGF0dHJpYnV0ZU1hcHBpbmcpIDoKLQkJCQkJCW5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4oYXR0cmlidXRlTWFwcGluZyk7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogQ29udmVydCB0aGUgc3BlY2lmaWVkIG1hcHBpbmcgaW50byBhIGNvbGxlY3Rpb24gb2YgaXRzICJtYXBwaW5ncyIuCi0JCQkgKiBUeXBpY2FsbHksIHRoaXMgY29sbGVjdGlvbiB3aWxsIGluY2x1ZGUganVzdCB0aGUgbWFwcGluZyBpdHNlbGY7Ci0JCQkgKiBidXQsIGlmIHRoZSBtYXBwaW5nIGlzIGFuIGVtYmVkZGVkIElELCB0aGlzIGNvbGxlY3Rpb24gd2lsbCBpbmNsdWRlCi0JCQkgKiB0aGUgbWFwcGluZyBpdHNlbGYgcGx1cyBhbGwgdGhlIG1hcHBpbmdzIG9mIGl0cyB0YXJnZXQgZW1iZWRkYWJsZS4KLQkJCSAqIAotCQkJICogTkI6IFJlY3Vyc2lvbiBpcyB1bm5lY2Vzc2FyeS4KLQkJCSAqLwotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+IGdldEVtYmVkZGVkSWRNYXBwaW5nQ2hvaWNlSXRlcmFibGUoRW1iZWRkZWRJZE1hcHBpbmcgbWFwcGluZykgewotCQkJCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IG1hcHBpbmcuZ2V0VGFyZ2V0RW1iZWRkYWJsZSgpOwotCQkJCWlmIChlbWJlZGRhYmxlID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4obWFwcGluZyk7Ci0JCQkJfQotCQkJCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8QXR0cmlidXRlTWFwcGluZz4oCi0JCQkJCQltYXBwaW5nLAotCQkJCQkJQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oZW1iZWRkYWJsZS5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpKQotCQkJCQkpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHVibGljIEF0dHJpYnV0ZU1hcHBpbmcgZ2V0RGVyaXZlZElkQXR0cmlidXRlTWFwcGluZygpIHsKLQkJU3RyaW5nIGlkQXR0cmlidXRlTmFtZSA9IHRoaXMuZ2V0SWRBdHRyaWJ1dGVOYW1lKCk7Ci0JCWlmIChpZEF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkgewotCQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgOiB0aGlzLmdldENhbmRpZGF0ZUlkQXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJCWlmIChpZEF0dHJpYnV0ZU5hbWUuZXF1YWxzKG1hcHBpbmcuZ2V0TmFtZSgpKSkgewotCQkJCQlyZXR1cm4gbWFwcGluZzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldFhtbE1hcHBpbmcoKS5nZXRNYXBzSWQoKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0cmF0ZWd5KCkgewotCQl0aGlzLmdldFhtbE1hcHBpbmcoKS5zZXRNYXBzSWQoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RyYXRlZ3koKSB7Ci0JCXRoaXMuZ2V0WG1sTWFwcGluZygpLnNldE1hcHNJZChudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbShPcm1NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBvbGRTdHJhdGVneSkgewotCQl0aGlzLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShvbGRTdHJhdGVneS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElEIG1hcHBpbmdzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRJZEF0dHJpYnV0ZU1hcHBpbmdzKCkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPEF0dHJpYnV0ZU1hcHBpbmc+KHRoaXMuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIEdlbmVyaWNPcm1NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC50aGlzLm1hcHBpbmdJc0lkTWFwcGluZyhtYXBwaW5nKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXBwaW5nSXNJZE1hcHBpbmcoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRJZE1hcHBpbmdLZXlzKCksIG1hcHBpbmcuZ2V0S2V5KCkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldElkTWFwcGluZ0tleXMoKSB7Ci0JCXJldHVybiBJRF9NQVBQSU5HX0tFWVM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJRF9NQVBQSU5HX0tFWVNfQVJSQVkgPSBuZXcgU3RyaW5nW10gewotCQlNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksCi0JCU1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWQotCX07Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IElEX01BUFBJTkdfS0VZUyA9IG5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4oSURfTUFQUElOR19LRVlTX0FSUkFZKTsKLQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKExpc3Q8SU1lc3NhZ2U+IG1lc3NhZ2VzLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJdGhpcy52YWxpZGF0ZU1hcHNJZChtZXNzYWdlcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVNYXBzSWQoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQkJaWYgKHRoaXMuZ2V0RGVyaXZlZElkZW50aXR5KCkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpIHsKLQkJCXRoaXMudmFsaWRhdGVNYXBzSWRfKG1lc3NhZ2VzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlTWFwc0lkXyhMaXN0PElNZXNzYWdlPiBtZXNzYWdlcykgewotCQkvLyB0ZXN0IHdoZXRoZXIgaWQgYXR0cmlidXRlIG5hbWUgY2FuIGJlIHJlc29sdmVkCi0JCUF0dHJpYnV0ZU1hcHBpbmcgYXR0cmlidXRlTWFwcGluZyA9IHRoaXMuZ2V0RGVyaXZlZElkQXR0cmlidXRlTWFwcGluZygpOwotCQlpZiAoYXR0cmlidXRlTWFwcGluZyA9PSBudWxsKSB7Ci0JCQkvLyB0aGVyZSBpcyBubyBkZWZhdWx0aW5nLCBzbyBvbmx5IHVzZSB0aGUgJ3Jlc29sdmVkJyBlcnJvciwgZXZlbiBpZiB0aGUgbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcKLQkJCW1lc3NhZ2VzLmFkZCh0aGlzLmJ1aWxkTWVzc2FnZShKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQsIG5ldyBTdHJpbmdbXSB7dGhpcy5nZXRJZEF0dHJpYnV0ZU5hbWUoKX0pKTsKLQkJfSBlbHNlIHsKLQkJCS8vIHRlc3Qgd2hldGhlciBhdHRyaWJ1dGUgbWFwcGluZyBpcyBhbGxvd2FibGUKLQkJCWlmICggISBDb2xsZWN0aW9uVG9vbHMuY29udGFpbnModGhpcy5nZXRWYWxpZEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKCksIGF0dHJpYnV0ZU1hcHBpbmcpKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKHRoaXMuYnVpbGRNZXNzYWdlKEpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBTX0lEX1ZBTFVFX0lOVkFMSUQsIG5ldyBTdHJpbmdbXSB7dGhpcy5nZXRJZEF0dHJpYnV0ZU5hbWUoKX0pKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRWYWxpZEF0dHJpYnV0ZU1hcHBpbmdDaG9pY2VzKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZENhbmRpZGF0ZUlkQXR0cmlidXRlTWFwcGluZ3ModGhpcy5nZXRJZEF0dHJpYnV0ZU1hcHBpbmdzKCkpOwotCX0KLQotCXByb3RlY3RlZCBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoU3RyaW5nIG1zZ0lELCBTdHJpbmdbXSBwYXJtcykgewotCQlTdHJpbmcgYXR0cmlidXRlRGVzY3JpcHRpb24gPSBOTFMuYmluZChKcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlcy5BVFRSSUJVVEVfREVTQywgdGhpcy5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TmFtZSgpKTsKLQkJcGFybXMgPSBBcnJheVRvb2xzLmFkZChwYXJtcywgMCwgYXR0cmlidXRlRGVzY3JpcHRpb24pOwotCQlyZXR1cm4gRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQkJSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwKLQkJCQltc2dJRCwKLQkJCQlwYXJtcywKLQkJCQl0aGlzLAotCQkJCXRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpCi0JCQkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IHRoaXMuZ2V0WG1sTWFwcGluZygpLmdldE1hcHNJZFRleHRSYW5nZSgpOwotCQlyZXR1cm4gKHRleHRSYW5nZSAhPSBudWxsKSA/IHRleHRSYW5nZSA6IHRoaXMuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkUXVlcnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU5hbWVkUXVlcnkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMzJiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1OYW1lZFF1ZXJ5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkxvY2tNb2RlVHlwZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLkpwYUpwcWxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuRXhwcmVzc2lvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLS8qKgotICogSlBBIDIuMAotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbmFtZWQgcXVlcnkKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1OYW1lZFF1ZXJ5Ml8wCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVF1ZXJ5PFhtbE5hbWVkUXVlcnk+Ci0JaW1wbGVtZW50cyBPcm1OYW1lZFF1ZXJ5Ml8wCi17Ci0JcHJpdmF0ZSBMb2NrTW9kZVR5cGUyXzAgc3BlY2lmaWVkTG9ja01vZGU7Ci0JcHJpdmF0ZSBMb2NrTW9kZVR5cGUyXzAgZGVmYXVsdExvY2tNb2RlOwotCi0KLQlwdWJsaWMgR2VuZXJpY09ybU5hbWVkUXVlcnkyXzAoWG1sQ29udGV4dE5vZGUgcGFyZW50LCBYbWxOYW1lZFF1ZXJ5IHhtbE5hbWVkUXVlcnkpIHsKLQkJc3VwZXIocGFyZW50LCB4bWxOYW1lZFF1ZXJ5KTsKLQkJdGhpcy5zcGVjaWZpZWRMb2NrTW9kZSA9IHRoaXMuYnVpbGRTcGVjaWZpZWRMb2NrTW9kZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZExvY2tNb2RlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkTG9ja01vZGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXREZWZhdWx0TG9ja01vZGUodGhpcy5idWlsZERlZmF1bHRMb2NrTW9kZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbG9jayBtb2RlICoqKioqKioqKioKLQotCXB1YmxpYyBMb2NrTW9kZVR5cGUyXzAgZ2V0TG9ja01vZGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRMb2NrTW9kZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkTG9ja01vZGUgOiB0aGlzLmRlZmF1bHRMb2NrTW9kZTsKLQl9Ci0KLQlwdWJsaWMgTG9ja01vZGVUeXBlMl8wIGdldFNwZWNpZmllZExvY2tNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRMb2NrTW9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAgbG9ja01vZGUpIHsKLQkJdGhpcy5zZXRTcGVjaWZpZWRMb2NrTW9kZV8obG9ja01vZGUpOwotCQl0aGlzLnhtbFF1ZXJ5LnNldExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC50b09ybVJlc291cmNlTW9kZWwobG9ja01vZGUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRMb2NrTW9kZV8oTG9ja01vZGVUeXBlMl8wIGxvY2tNb2RlKSB7Ci0JCUxvY2tNb2RlVHlwZTJfMCBvbGQgPSB0aGlzLnNwZWNpZmllZExvY2tNb2RlOwotCQl0aGlzLnNwZWNpZmllZExvY2tNb2RlID0gbG9ja01vZGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTE9DS19NT0RFX1BST1BFUlRZLCBvbGQsIGxvY2tNb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTG9ja01vZGVUeXBlMl8wIGJ1aWxkU3BlY2lmaWVkTG9ja01vZGUoKSB7Ci0JCXJldHVybiBMb2NrTW9kZVR5cGUyXzAuZnJvbU9ybVJlc291cmNlTW9kZWwodGhpcy54bWxRdWVyeS5nZXRMb2NrTW9kZSgpKTsKLQl9Ci0KLQlwdWJsaWMgTG9ja01vZGVUeXBlMl8wIGdldERlZmF1bHRMb2NrTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdExvY2tNb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAgbG9ja01vZGUpIHsKLQkJTG9ja01vZGVUeXBlMl8wIG9sZCA9IHRoaXMuZGVmYXVsdExvY2tNb2RlOwotCQl0aGlzLmRlZmF1bHRMb2NrTW9kZSA9IGxvY2tNb2RlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoREVGQVVMVF9MT0NLX01PREVfUFJPUEVSVFksIG9sZCwgbG9ja01vZGUpOwotCX0KLQotCXByb3RlY3RlZCBMb2NrTW9kZVR5cGUyXzAgYnVpbGREZWZhdWx0TG9ja01vZGUoKSB7Ci0JCXJldHVybiBMb2NrTW9kZVR5cGUyXzAuTk9ORTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVRdWVyeV8oSnBhSnBxbFF1ZXJ5SGVscGVyIHF1ZXJ5SGVscGVyLCBMaXN0PElNZXNzYWdlPiBtZXNzYWdlcywgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJLy8gQ29udmVydCB0aGUgbGl0ZXJhbCBlc2NhcGUgY2hhcmFjdGVycyBpbnRvIGFjdHVhbCBlc2NhcGUgY2hhcmFjdGVycwotCQlTdHJpbmcganBxbFF1ZXJ5ID0gRXhwcmVzc2lvblRvb2xzLnVuZXNjYXBlKHRoaXMucXVlcnksIG5ldyBpbnRbMV0pOwotCi0JCXF1ZXJ5SGVscGVyLnZhbGlkYXRlKHRoaXMsIGpwcWxRdWVyeSwgdGhpcy5nZXRRdWVyeVRleHRSYW5nZSgpLCAwLCBtZXNzYWdlcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNJZGVudGljYWwoUXVlcnkgcXVlcnkpIHsKLQkJcmV0dXJuIHN1cGVyLmlzSWRlbnRpY2FsKHF1ZXJ5KSAmJgotCQkJCXRoaXMuZ2V0U3BlY2lmaWVkTG9ja01vZGUoKSA9PSAoKEdlbmVyaWNPcm1OYW1lZFF1ZXJ5Ml8wKXF1ZXJ5KS5nZXRTcGVjaWZpZWRMb2NrTW9kZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgQ2xhc3M8TmFtZWRRdWVyeT4gZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIE5hbWVkUXVlcnkuY2xhc3M7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9yZGVyQ29sdW1uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PcmRlckNvbHVtbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODkyMmEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9yZGVyQ29sdW1uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvcmRlciBjb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PcmRlckNvbHVtbjJfMAotCWV4dGVuZHMgQWJzdHJhY3RPcm1OYW1lZENvbHVtbjxYbWxPcmRlckNvbHVtbiwgT3JtT3JkZXJDb2x1bW4yXzAuT3duZXI+Ci0JaW1wbGVtZW50cyBPcm1PcmRlckNvbHVtbjJfMAotewotCS8vIFRPRE8gZGVmYXVsdHMgZnJvbSBqYXZhIGZvciBhbGwgb2YgdGhlc2Ugc2V0dGluZ3MKLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWROdWxsYWJsZTsKLQotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZEluc2VydGFibGU7Ci0KLQlwcm90ZWN0ZWQgQm9vbGVhbiBzcGVjaWZpZWRVcGRhdGFibGU7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtT3JkZXJDb2x1bW4yXzAoT3JtT3JkZXJhYmxlMl8wIHBhcmVudCwgT3JtT3JkZXJDb2x1bW4yXzAuT3duZXIgb3duZXIpIHsKLQkJc3VwZXIocGFyZW50LCBvd25lcik7Ci0JCXRoaXMuc3BlY2lmaWVkTnVsbGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkTnVsbGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlID0gdGhpcy5idWlsZFNwZWNpZmllZEluc2VydGFibGUoKTsKLQkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkTnVsbGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlXyh0aGlzLmJ1aWxkU3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGVfKHRoaXMuYnVpbGRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFhNTCBjb2x1bW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFhtbE9yZGVyQ29sdW1uIGdldFhtbENvbHVtbigpIHsKLQkJcmV0dXJuIHRoaXMub3duZXIuZ2V0WG1sQ29sdW1uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFhtbE9yZGVyQ29sdW1uIGJ1aWxkWG1sQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5vd25lci5idWlsZFhtbENvbHVtbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVhtbENvbHVtbigpIHsKLQkJdGhpcy5vd25lci5yZW1vdmVYbWxDb2x1bW4oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbnVsbGFibGUgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZE51bGxhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWROdWxsYWJsZS5ib29sZWFuVmFsdWUoKSA6IHRoaXMuaXNEZWZhdWx0TnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkTnVsbGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWROdWxsYWJsZSwgbnVsbGFibGUpKSB7Ci0JCQlYbWxPcmRlckNvbHVtbiB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWROdWxsYWJsZV8obnVsbGFibGUpOwotCQkJeG1sQ29sdW1uLnNldE51bGxhYmxlKG51bGxhYmxlKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ29sdW1uSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkTnVsbGFibGVfKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE51bGxhYmxlOwotCQl0aGlzLnNwZWNpZmllZE51bGxhYmxlID0gbnVsbGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFksIG9sZCwgbnVsbGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkU3BlY2lmaWVkTnVsbGFibGUoKSB7Ci0JCVhtbE9yZGVyQ29sdW1uIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uKCk7Ci0JCXJldHVybiAoeG1sQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHhtbENvbHVtbi5nZXROdWxsYWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE51bGxhYmxlKCkgewotCQlyZXR1cm4gREVGQVVMVF9OVUxMQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW5zZXJ0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0luc2VydGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JfQotCi0JcHVibGljIEJvb2xlYW4gZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkSW5zZXJ0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlpZiAodGhpcy52YWx1ZXNBcmVEaWZmZXJlbnQodGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlLCBpbnNlcnRhYmxlKSkgewotCQkJWG1sT3JkZXJDb2x1bW4geG1sQ29sdW1uID0gdGhpcy5nZXRYbWxDb2x1bW5Gb3JVcGRhdGUoKTsKLQkJCXRoaXMuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZV8oaW5zZXJ0YWJsZSk7Ci0JCQl4bWxDb2x1bW4uc2V0SW5zZXJ0YWJsZShpbnNlcnRhYmxlKTsKLQkJCXRoaXMucmVtb3ZlWG1sQ29sdW1uSWZVbnNldCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZV8oQm9vbGVhbiBpbnNlcnRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5zcGVjaWZpZWRJbnNlcnRhYmxlOwotCQl0aGlzLnNwZWNpZmllZEluc2VydGFibGUgPSBpbnNlcnRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1BFQ0lGSUVEX0lOU0VSVEFCTEVfUFJPUEVSVFksIG9sZCwgaW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgewotCQlYbWxPcmRlckNvbHVtbiB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbigpOwotCQlyZXR1cm4gKHhtbENvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB4bWxDb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdEluc2VydGFibGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX0lOU0VSVEFCTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHVwZGF0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0YWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZFVwZGF0YWJsZSAhPSBudWxsKSA/IHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5pc0RlZmF1bHRVcGRhdGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJaWYgKHRoaXMudmFsdWVzQXJlRGlmZmVyZW50KHRoaXMuc3BlY2lmaWVkVXBkYXRhYmxlLCB1cGRhdGFibGUpKSB7Ci0JCQlYbWxPcmRlckNvbHVtbiB4bWxDb2x1bW4gPSB0aGlzLmdldFhtbENvbHVtbkZvclVwZGF0ZSgpOwotCQkJdGhpcy5zZXRTcGVjaWZpZWRVcGRhdGFibGVfKHVwZGF0YWJsZSk7Ci0JCQl4bWxDb2x1bW4uc2V0VXBkYXRhYmxlKHVwZGF0YWJsZSk7Ci0JCQl0aGlzLnJlbW92ZVhtbENvbHVtbklmVW5zZXQoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFNwZWNpZmllZFVwZGF0YWJsZV8oQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZFVwZGF0YWJsZTsKLQkJdGhpcy5zcGVjaWZpZWRVcGRhdGFibGUgPSB1cGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZLCBvbGQsIHVwZGF0YWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRVcGRhdGFibGUoKSB7Ci0JCVhtbE9yZGVyQ29sdW1uIHhtbENvbHVtbiA9IHRoaXMuZ2V0WG1sQ29sdW1uKCk7Ci0JCXJldHVybiAoeG1sQ29sdW1uID09IG51bGwpID8gbnVsbCA6IHhtbENvbHVtbi5nZXRVcGRhdGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX1VQREFUQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT3JkZXJhYmxlMl8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1PcmRlcmFibGUyXzApIHN1cGVyLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1PcmRlcmFibGUyXzAgZ2V0T3JkZXJhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRBdHRyaWJ1dGVNYXBwaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRPcmRlcmFibGUoKS5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpLmdldERlZmF1bHRUYWJsZU5hbWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9ycGhhblJlbW92YWwyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9ycGhhblJlbW92YWwyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzOGY5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PcnBoYW5SZW1vdmFsMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvcnBoYW4gcmVtb3ZhbAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU9ycGhhblJlbW92YWwyXzAKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybU9ycGhhblJlbW92YWJsZTJfMAotewotCXByb3RlY3RlZCBCb29sZWFuIHNwZWNpZmllZE9ycGhhblJlbW92YWw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZGVmYXVsdE9ycGhhblJlbW92YWw7Ci0KLQotCXB1YmxpYyBHZW5lcmljT3JtT3JwaGFuUmVtb3ZhbDJfMChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWwgPSB0aGlzLmJ1aWxkU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzeW5jaHJvbml6ZS91cGRhdGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoUmVzb3VyY2VNb2RlbCgpOwotCQl0aGlzLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWxfKHRoaXMuYnVpbGRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0RGVmYXVsdE9ycGhhblJlbW92YWwodGhpcy5idWlsZERlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBvcnBoYW4gcmVtb3ZhbCAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc09ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsICE9IG51bGwpID8gdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsLmJvb2xlYW5WYWx1ZSgpIDogdGhpcy5kZWZhdWx0T3JwaGFuUmVtb3ZhbDsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRPcnBoYW5SZW1vdmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbF8ob3JwaGFuUmVtb3ZhbCk7Ci0JCXRoaXMuZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlKCkuc2V0T3JwaGFuUmVtb3ZhbChvcnBoYW5SZW1vdmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsXyhCb29sZWFuIG9ycGhhblJlbW92YWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnNwZWNpZmllZE9ycGhhblJlbW92YWw7Ci0JCXRoaXMuc3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCA9IG9ycGhhblJlbW92YWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgb3JwaGFuUmVtb3ZhbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gdGhpcy5nZXRYbWxPcnBoYW5SZW1vdmFibGUoKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdE9ycGhhblJlbW92YWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdE9ycGhhblJlbW92YWwoYm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5kZWZhdWx0T3JwaGFuUmVtb3ZhbDsKLQkJdGhpcy5kZWZhdWx0T3JwaGFuUmVtb3ZhbCA9IG9ycGhhblJlbW92YWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChERUZBVUxUX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZLCBvbGQsIG9ycGhhblJlbW92YWwpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkRGVmYXVsdE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiBERUZBVUxUX09SUEhBTl9SRU1PVkFMOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBzdXBlci5nZXRQYXJlbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZyBnZXRNYXBwaW5nKCkgewotCQlyZXR1cm4gKE9ybUF0dHJpYnV0ZU1hcHBpbmcpIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFhtbEF0dHJpYnV0ZU1hcHBpbmcgZ2V0WG1sTWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0TWFwcGluZygpLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCBnZXRYbWxPcnBoYW5SZW1vdmFibGUoKSB7Ci0JCXJldHVybiAoWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCkgdGhpcy5nZXRYbWxNYXBwaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5nZXRYbWxPcnBoYW5SZW1vdmFibGUoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JCXJldHVybiAodGV4dFJhbmdlICE9IG51bGwpID8gdGV4dFJhbmdlIDogdGhpcy5nZXRNYXBwaW5nKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzYzk1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5UYWJsZVRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLQlleHRlbmRzIEFic3RyYWN0T3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQlwdWJsaWMgR2VuZXJpY09ybU92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAoT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgZ2V0UmVsYXRpb25zaGlwKCkgewotCQlyZXR1cm4gKE9ybU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBzdXBlci5nZXRSZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGVzQWdhaW5zdERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRUeXBlTWFwcGluZygpLnZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRUYWJsZVZhbGlkYXRvcihSZWFkT25seVRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmJ1aWxkSm9pblRhYmxlVmFsaWRhdG9yKChSZWFkT25seUpvaW5UYWJsZSkgdGFibGUsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5idWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoY29sdW1uLCBvd25lciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5idWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmOGI0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLQotLyoqCi0gKiBKUEEgMi4wCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBzZXF1ZW5jZSBnZW5lcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMAotCWV4dGVuZHMgQWJzdHJhY3RPcm1TZXF1ZW5jZUdlbmVyYXRvcgotCWltcGxlbWVudHMgT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAKLXsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNwZWNpZmllZENhdGFsb2c7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0Q2F0YWxvZzsKLQotCXByb3RlY3RlZCBTdHJpbmcgc3BlY2lmaWVkU2NoZW1hOwotCXByb3RlY3RlZCBTdHJpbmcgZGVmYXVsdFNjaGVtYTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMChYbWxDb250ZXh0Tm9kZSBwYXJlbnQsIFhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFNlcXVlbmNlR2VuZXJhdG9yKSB7Ci0JCXN1cGVyKHBhcmVudCwgeG1sU2VxdWVuY2VHZW5lcmF0b3IpOwotCQl0aGlzLnNwZWNpZmllZENhdGFsb2cgPSB4bWxTZXF1ZW5jZUdlbmVyYXRvci5nZXRDYXRhbG9nKCk7Ci0JCXRoaXMuc3BlY2lmaWVkU2NoZW1hID0geG1sU2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2NoZW1hKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGhSZXNvdXJjZU1vZGVsKCk7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18odGhpcy54bWxHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXRTcGVjaWZpZWRTY2hlbWFfKHRoaXMueG1sR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERlZmF1bHRDYXRhbG9nKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZygpKTsKLQkJdGhpcy5zZXREZWZhdWx0U2NoZW1hKHRoaXMuYnVpbGREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpIHsKLQkJcmV0dXJuICh0aGlzLnNwZWNpZmllZENhdGFsb2cgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZENhdGFsb2cgOiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkQ2F0YWxvZ18oY2F0YWxvZyk7Ci0JCXRoaXMueG1sR2VuZXJhdG9yLnNldENhdGFsb2coY2F0YWxvZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U3BlY2lmaWVkQ2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkQ2F0YWxvZzsKLQkJdGhpcy5zcGVjaWZpZWRDYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERlZmF1bHRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRDYXRhbG9nOwotCQl0aGlzLmRlZmF1bHRDYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSwgb2xkLCBjYXRhbG9nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkRGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0Q2F0YWxvZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5zcGVjaWZpZWRTY2hlbWEgIT0gbnVsbCkgPyB0aGlzLnNwZWNpZmllZFNjaGVtYSA6IHRoaXMuZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpZmllZFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCXRoaXMuc2V0U3BlY2lmaWVkU2NoZW1hXyhzY2hlbWEpOwotCQl0aGlzLnhtbEdlbmVyYXRvci5zZXRTY2hlbWEoc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWFfKFN0cmluZyBzY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc3BlY2lmaWVkU2NoZW1hOwotCQl0aGlzLnNwZWNpZmllZFNjaGVtYSA9IHNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRlZmF1bHRTY2hlbWE7Ci0JCXRoaXMuZGVmYXVsdFNjaGVtYSA9IHNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERFRkFVTFRfU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZERlZmF1bHRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbnRleHREZWZhdWx0U2NoZW1hKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRpY2FsKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJcmV0dXJuIHN1cGVyLmlzSWRlbnRpY2FsKGdlbmVyYXRvcikgJiYKLQkJCQlTdHJpbmdUb29scy5zdHJpbmdzQXJlRXF1YWwodGhpcy5nZXRTcGVjaWZpZWRTY2hlbWEoKSwgKCgoR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wKWdlbmVyYXRvcikuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpKSAmJgotCQkJCVN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLmdldFNwZWNpZmllZENhdGFsb2coKSwgKCgoR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wKWdlbmVyYXRvcikuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVZpcnR1YWxPdmVycmlkZUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTMzMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuTWFwcGluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLkFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtVmlydHVhbE92ZXJyaWRlSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLQlleHRlbmRzIEFic3RyYWN0T3JtWG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSwgUmVhZE9ubHlUYWJsZS5Pd25lcgotewotCXByb3RlY3RlZCBPcm1WaXJ0dWFsSm9pblRhYmxlIGpvaW5UYWJsZTsKLQotCi0JcHVibGljIEdlbmVyaWNPcm1WaXJ0dWFsT3ZlcnJpZGVKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMChPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN5bmNocm9uaXplL3VwZGF0ZSAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUpvaW5UYWJsZSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1WaXJ0dWFsSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEpvaW5UYWJsZShPcm1WaXJ0dWFsSm9pblRhYmxlIGpvaW5UYWJsZSkgewotCQlPcm1WaXJ0dWFsSm9pblRhYmxlIG9sZCA9IHRoaXMuam9pblRhYmxlOwotCQl0aGlzLmpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEpPSU5fVEFCTEVfUFJPUEVSVFksIG9sZCwgam9pblRhYmxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVKb2luVGFibGUoKSB7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlIG92ZXJyaWRkZW5Kb2luVGFibGUgPSB0aGlzLmdldE92ZXJyaWRkZW5Kb2luVGFibGUoKTsKLQkJaWYgKG92ZXJyaWRkZW5Kb2luVGFibGUgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCQl0aGlzLnNldEpvaW5UYWJsZShudWxsKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgJiYgKHRoaXMuam9pblRhYmxlLmdldE92ZXJyaWRkZW5UYWJsZSgpID09IG92ZXJyaWRkZW5Kb2luVGFibGUpKSB7Ci0JCQkJdGhpcy5qb2luVGFibGUudXBkYXRlKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2V0Sm9pblRhYmxlKHRoaXMuYnVpbGRKb2luVGFibGUob3ZlcnJpZGRlbkpvaW5UYWJsZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFJlYWRPbmx5Sm9pblRhYmxlIGdldE92ZXJyaWRkZW5Kb2luVGFibGUoKSB7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgb3ZlcnJpZGRlblN0cmF0ZWd5ID0gdGhpcy5nZXRPdmVycmlkZGVuU3RyYXRlZ3koKTsKLQkJcmV0dXJuIChvdmVycmlkZGVuU3RyYXRlZ3kgPT0gbnVsbCkgPyBudWxsIDogb3ZlcnJpZGRlblN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBPcm1WaXJ0dWFsSm9pblRhYmxlIGJ1aWxkSm9pblRhYmxlKFJlYWRPbmx5Sm9pblRhYmxlIG92ZXJyaWRkZW5Kb2luVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29udGV4dE5vZGVGYWN0b3J5KCkuYnVpbGRPcm1WaXJ0dWFsSm9pblRhYmxlKHRoaXMsIHRoaXMsIG92ZXJyaWRkZW5Kb2luVGFibGUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBnZXRSZWxhdGlvbnNoaXAoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBhcmVudCgpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldE92ZXJyaWRkZW5TdHJhdGVneSgpIHsKLQkJUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gdGhpcy5nZXRPdmVycmlkZGVuSm9pblRhYmxlUmVsYXRpb25zaGlwKCk7Ci0JCXJldHVybiAocmVsYXRpb25zaGlwID09IG51bGwpID8gbnVsbCA6IHJlbGF0aW9uc2hpcC5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCBnZXRPdmVycmlkZGVuSm9pblRhYmxlUmVsYXRpb25zaGlwKCkgewotCQlSZWFkT25seVJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAgPSB0aGlzLnJlc29sdmVPdmVycmlkZGVuUmVsYXRpb25zaGlwKCk7Ci0JCXJldHVybiAocmVsYXRpb25zaGlwIGluc3RhbmNlb2YgUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXApID8gKFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwKSByZWxhdGlvbnNoaXAgOiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBSZWFkT25seVJlbGF0aW9uc2hpcCByZXNvbHZlT3ZlcnJpZGRlblJlbGF0aW9uc2hpcCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkucmVzb2x2ZU92ZXJyaWRkZW5SZWxhdGlvbnNoaXAoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5UYWJsZURlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gTWFwcGluZ1Rvb2xzLmJ1aWxkSm9pblRhYmxlRGVmYXVsdE5hbWUodGhpcy5nZXRSZWxhdGlvbnNoaXAoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci52YWxpZGF0ZShtZXNzYWdlcywgcmVwb3J0ZXIpOwotCQlpZiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5qb2luVGFibGUudmFsaWRhdGUobWVzc2FnZXMsIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlc0FnYWluc3REYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0VHlwZU1hcHBpbmcoKS52YWxpZGF0ZXNBZ2FpbnN0RGF0YWJhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlbGF0aW9uc2hpcCgpLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlUYWJsZSB0YWJsZSwgVGFibGVUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQlyZXR1cm4gdGhpcy5nZXRSZWxhdGlvbnNoaXAoKS5idWlsZEpvaW5UYWJsZVZhbGlkYXRvcigoUmVhZE9ubHlKb2luVGFibGUpIHRhYmxlLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIEpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKGNvbHVtbiwgb3duZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UmVsYXRpb25zaGlwKCkuYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihjb2x1bW4sIG93bmVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlMDZlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5BYnN0cmFjdE9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkKLQlpbXBsZW1lbnRzIE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotewkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT3JkZXJhYmxlIGJ1aWxkT3JtT3JkZXJhYmxlKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigidXNlICNidWlsZE9ybU9yZGVyYWJsZShPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JkZXJhYmxlMl8wLk93bmVyIG93bmVyKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybUVtYmVkZGFibGUgYnVpbGRPcm1FbWJlZGRhYmxlKE9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgWG1sRW1iZWRkYWJsZSByZXNvdXJjZU1hcHBpbmcpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRW1iZWRkYWJsZTJfMChwYXJlbnQsIHJlc291cmNlTWFwcGluZyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1TZXF1ZW5jZUdlbmVyYXRvciBidWlsZE9ybVNlcXVlbmNlR2VuZXJhdG9yKFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sU2VxdWVuY2VHZW5lcmF0b3IgcmVzb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMChwYXJlbnQsIHJlc291cmNlU2VxdWVuY2VHZW5lcmF0b3IpOwotCX0KLQkKLQlwdWJsaWMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoT3JtRW1iZWRkZWRNYXBwaW5nMl8wIHBhcmVudCwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKHBhcmVudCwgb3duZXIpOwotCX0KLQkKLQlwdWJsaWMgT3JtRGVyaXZlZElkZW50aXR5Ml8wIGJ1aWxkT3JtRGVyaXZlZElkZW50aXR5KE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybURlcml2ZWRJZGVudGl0eTJfMChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGJ1aWxkT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKAotCQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVsZW1lbnRDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZykgewotCQkKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKHBhcmVudCwgcmVzb3VyY2VNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIE9ybUNhY2hlYWJsZTJfMCBidWlsZE9ybUNhY2hlYWJsZShPcm1DYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybUNhY2hlYWJsZTJfMChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkT3JtT3JwaGFuUmVtb3ZhbChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PcnBoYW5SZW1vdmFsMl8wKHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIE9ybU5hbWVkUXVlcnkgYnVpbGRPcm1OYW1lZFF1ZXJ5KFhtbENvbnRleHROb2RlIHBhcmVudCwgWG1sTmFtZWRRdWVyeSByZXNvdXJjZU5hbWVkUXVlcnkpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtTmFtZWRRdWVyeTJfMChwYXJlbnQsIHJlc291cmNlTmFtZWRRdWVyeSk7Ci0JfQotCi0JcHVibGljIE9ybUNvbGxlY3Rpb25UYWJsZTJfMCBidWlsZE9ybUNvbGxlY3Rpb25UYWJsZShPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgcGFyZW50LCBUYWJsZS5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzAocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1PcmRlcmFibGUyXzAgYnVpbGRPcm1PcmRlcmFibGUoT3JtQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9yZGVyYWJsZTJfMC5Pd25lciBvd25lcikgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcm1PcmRlcmFibGUocGFyZW50LCBvd25lcik7Ci0JfQotCQotCXB1YmxpYyBPcm1PcmRlckNvbHVtbjJfMCBidWlsZE9ybU9yZGVyQ29sdW1uKE9ybU9yZGVyYWJsZTJfMCBwYXJlbnQsIE9ybU9yZGVyQ29sdW1uMl8wLk93bmVyIG93bmVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybU9yZGVyQ29sdW1uMl8wKHBhcmVudCwgb3duZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVhtbDJfMERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjMzEyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk51bGxPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbERlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1YbWxEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtWG1sRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNPcm1YbWwyXzBEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFOwotCX0KLQotCXB1YmxpYyBFRmFjdG9yeSBnZXRSZXNvdXJjZU5vZGVGYWN0b3J5KCkgewotCQlyZXR1cm4gT3JtRmFjdG9yeS5lSU5TVEFOQ0U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbENvbnRleHROb2RlRmFjdG9yeSBidWlsZENvbnRleHROb2RlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBBVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLyoqCi0JICogT3JkZXIgc2hvdWxkIG5vdCBtYXR0ZXIgaGVyZTsgYnV0IHdlJ2xsIHVzZSB0aGUgc2FtZSBvcmRlciBhcyBmb3IgSmF2YS4KLQkgKiBAc2VlIEdlbmVyaWMyXzBKcGFQbGF0Zm9ybVByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbltdIEFUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gewotCQlPcm1UcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUlkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybUJhc2ljTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtRW1iZWRkZWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlPcm1FbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJT3JtTWFueVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU1hbnlUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCU9ybU9uZVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJTnVsbE9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtQ2FjaGVhYmxlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1DYWNoZWFibGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4ZWVmOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1DYWNoZWFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ2FjaGVhYmxlSG9sZGVyMl8wOwotCi0vKioKLSAqIG51bGwgPGNvZGU+b3JtLnhtbDwvY29kZT4gY2FjaGVhYmxlCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsT3JtQ2FjaGVhYmxlMl8wCi0JZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbENvbnRleHROb2RlCi0JaW1wbGVtZW50cyBPcm1DYWNoZWFibGUyXzAKLXsKLQlwdWJsaWMgTnVsbE9ybUNhY2hlYWJsZTJfMChPcm1DYWNoZWFibGVIb2xkZXIyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNhY2hlYWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldFNwZWNpZmllZENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4gY2FjaGVhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBPcm1DYWNoZWFibGVIb2xkZXIyXzAgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtRGVyaXZlZElkZW50aXR5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1EZXJpdmVkSWRlbnRpdHkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNTBhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL051bGxPcm1EZXJpdmVkSWRlbnRpdHkyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5BYnN0cmFjdFhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMDsKLQotcHVibGljIGNsYXNzIE51bGxPcm1EZXJpdmVkSWRlbnRpdHkyXzAKLQlleHRlbmRzIEFic3RyYWN0WG1sQ29udGV4dE5vZGUKLQlpbXBsZW1lbnRzIE9ybURlcml2ZWRJZGVudGl0eTJfMAotewotCXB1YmxpYyBOdWxsT3JtRGVyaXZlZElkZW50aXR5Ml8wKE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQotCS8vICoqKioqKioqKiogcHJlZG9taW5hbnQgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgZ2V0UHJlZG9taW5hbnREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG51bGwgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiB1c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCS8vIE5PUAotCX0KLQotCi0JLy8gKioqKioqKioqKiBJRCBkZXJpdmVkIGlkZW50aXR5IHN0cmF0ZWd5ICoqKioqKioqKioKLQotCXB1YmxpYyBPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJLy8gTk9QCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG1hcHMgSUQgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneSAqKioqKioqKioqCi0KLQlwdWJsaWMgT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgewotCQkvLyBOT1AKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb20oT3JtRGVyaXZlZElkZW50aXR5Ml8wIG9sZERlcml2ZWRJZGVudGl0eSkgewotCQkvLyBOT1AKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldE1hcHBpbmcoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtT3JwaGFuUmVtb3ZhbDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9OdWxsT3JtT3JwaGFuUmVtb3ZhbDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRjZWYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vTnVsbE9ybU9ycGhhblJlbW92YWwyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLQotLyoqCi0gKiBOdWxsIDxjb2RlPm9ybS54bWw8L2NvZGU+IG9ycGhhbiByZW1vdmFsCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsT3JtT3JwaGFuUmVtb3ZhbDJfMAotCWV4dGVuZHMgQWJzdHJhY3RPcm1YbWxDb250ZXh0Tm9kZQotCWltcGxlbWVudHMgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wCi17Ci0JcHVibGljIE51bGxPcm1PcnBoYW5SZW1vdmFsMl8wKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG9ycGhhbiByZW1vdmFsICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc09ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gbmV3U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiAoT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgc3VwZXIuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQYXJlbnQoKS5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRlOTI1OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWxDb250ZXh0Tm9kZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkVtZlRvb2xzOwotCi1wdWJsaWMgY2xhc3MgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1BdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMERlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFhtbEF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRSZXNvdXJjZU1hcHBpbmcoRUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gRW1mVG9vbHMuY3JlYXRlKAotCQkJCWZhY3RvcnksIAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCksIAotCQkJCVhtbEVsZW1lbnRDb2xsZWN0aW9uLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIE9ybUF0dHJpYnV0ZU1hcHBpbmcgYnVpbGRDb250ZXh0TWFwcGluZygKLQkJCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGFyZW50LCAKLQkJCVhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZywgCi0JCQlPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChPcm1YbWwyXzBDb250ZXh0Tm9kZUZhY3RvcnkpIGZhY3RvcnkpLmJ1aWxkT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKHBhcmVudCwgKFhtbEVsZW1lbnRDb2xsZWN0aW9uKSB4bWxNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTA1NDVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5BYnN0cmFjdFRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvbk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLQotcHVibGljIGNsYXNzIE9ybUVsZW1lbnRDb2xsZWN0aW9uVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yCi17Ci0KLQlwdWJsaWMgT3JtRWxlbWVudENvbGxlY3Rpb25UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcihUZW1wb3JhbENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKGNvbnZlcnRlciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZ2V0QXR0cmlidXRlTWFwcGluZygpIHsKLQkJcmV0dXJuIChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHN1cGVyLmdldEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQkvL25vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIG9ybS54bWwgcGFja2FnZSBlbGVtZW50IGJlY2F1c2Ugd2UgYXJlCi0JCS8vb25seSBsb29raW5nIGZvciBqYXZhLnV0aWwgY2xhc3Nlcywgd2UgZG9uJ3QgbmVlZCB0byBhcHBlbmQgdGhlIHBhY2thZ2UgZWxlbWVudAotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0VGFyZ2V0Q2xhc3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlSW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9Pcm1NYXBLZXlUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9Pcm1NYXBLZXlUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjNhYjhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Db2xsZWN0aW9uTWFwcGluZzJfMDsKLQotcHVibGljIGNsYXNzIE9ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RUZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcgotewotCi0JcHVibGljIE9ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yKFRlbXBvcmFsQ29udmVydGVyIGNvbnZlcnRlciwgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY29udmVydGVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybUNvbGxlY3Rpb25NYXBwaW5nMl8wIGdldEF0dHJpYnV0ZU1hcHBpbmcoKSB7Ci0JCXJldHVybiAoT3JtQ29sbGVjdGlvbk1hcHBpbmcyXzApIHN1cGVyLmdldEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQkvL25vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIG9ybS54bWwgcGFja2FnZSBlbGVtZW50IGJlY2F1c2Ugd2UgYXJlCi0JCS8vb25seSBsb29raW5nIGZvciBqYXZhLnV0aWwgY2xhc3Nlcywgd2UgZG9uJ3QgbmVlZCB0byBhcHBlbmQgdGhlIHBhY2thZ2UgZWxlbWVudAotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVNYXBwaW5nKCkuZ2V0TWFwS2V5Q2xhc3MoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlKCkgewotCQlyZXR1cm4gSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQX0tFWV9UWVBFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmlydHVhbEF0dHJpYnV0ZUludmFsaWRUZW1wb3JhbE1hcHBpbmdUeXBlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vT3JtVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vT3JtVGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ3MTgyYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL09ybVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkFic3RyYWN0VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Db252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPcm1UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IKLXsKLQotCXB1YmxpYyBPcm1UZW1wb3JhbENvbnZlcnRlclZhbGlkYXRvcihUZW1wb3JhbENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCXN1cGVyKGNvbnZlcnRlciwgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCS8vbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgb3JtLnhtbCBwYWNrYWdlIGVsZW1lbnQgYmVjYXVzZSB3ZSBhcmUKLQkJLy9vbmx5IGxvb2tpbmcgZm9yIGphdmEudXRpbCBjbGFzc2VzLCB3ZSBkb24ndCBuZWVkIHRvIGFwcGVuZCB0aGUgcGFja2FnZSBlbGVtZW50Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRUeXBlTmFtZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGUoKSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBQSU5HX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWaXJ0dWFsQXR0cmlidXRlSW52YWxpZFRlbXBvcmFsTWFwcGluZ1R5cGUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzYxMzFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5HZW5lcmljQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuR2VuZXJpY09wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci0KLQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkKLXsKLQkJCi0JcHVibGljIEpwYUNvbm5lY3Rpb24yXzAgYnVpbGRDb25uZWN0aW9uKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljQ29ubmVjdGlvbjJfMChwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSnBhT3B0aW9uczJfMCBidWlsZE9wdGlvbnMoUGVyc2lzdGVuY2VVbml0IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNPcHRpb25zMl8wKHBhcmVudCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlYTA0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wRmFjdG9yeTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbERlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcHRSZXNvdXJjZVR5cGUgZ2V0UmVzb3VyY2VUeXBlKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfMl8wX1JFU09VUkNFX1RZUEU7Ci0JfQotCi0JcHVibGljIEVGYWN0b3J5IGdldFJlc291cmNlTm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5LmVJTlNUQU5DRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxDb250ZXh0Tm9kZUZhY3RvcnkgYnVpbGRDb250ZXh0Tm9kZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpYzJfMFBlcnNpc3RlbmNlWG1sQ29udGV4dE5vZGVGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY0Nvbm5lY3Rpb24yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0dlbmVyaWNDb25uZWN0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MTI5YjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY0Nvbm5lY3Rpb24yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5BYnN0cmFjdFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci0KLS8qKgotICogIEdlbmVyaWNDb25uZWN0aW9uMl8wCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljQ29ubmVjdGlvbjJfMCBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllcwotCWltcGxlbWVudHMgSnBhQ29ubmVjdGlvbjJfMAotewotCS8vICoqKioqKioqKiogR2VuZXJpY0Nvbm5lY3Rpb24gcHJvcGVydGllcyAqKioqKioqKioqCi0JcHJpdmF0ZSBTdHJpbmcgZHJpdmVyOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIFN0cmluZyB1c2VyOwotCXByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOwotCQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBHZW5lcmljQ29ubmVjdGlvbjJfMChQZXJzaXN0ZW5jZVVuaXQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgcHJvcGVydGllcyB3aXRoIHZhbHVlcyBmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0LgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQcm9wZXJ0aWVzKCkgewotCQl0aGlzLmRyaXZlciA9IAotCQkJdGhpcy5nZXRTdHJpbmdWYWx1ZShQRVJTSVNURU5DRV9KREJDX0RSSVZFUik7Ci0JCXRoaXMudXJsID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKFBFUlNJU1RFTkNFX0pEQkNfVVJMKTsKLQkJdGhpcy51c2VyID0gCi0JCQl0aGlzLmdldFN0cmluZ1ZhbHVlKFBFUlNJU1RFTkNFX0pEQkNfVVNFUik7Ci0JCXRoaXMucGFzc3dvcmQgPSAKLQkJCXRoaXMuZ2V0U3RyaW5nVmFsdWUoUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgcHJvcGVydHlWYWx1ZUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKSkgewotCQkJdGhpcy5kcml2ZXJDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfVVJMKSkgewotCQkJdGhpcy51cmxDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfVVNFUikpIHsKLQkJCXRoaXMudXNlckNoYW5nZWQobmV3VmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCkpIHsKLQkJCXRoaXMucGFzc3dvcmRDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5UmVtb3ZlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSKSkgewotCQkJdGhpcy5kcml2ZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfSkRCQ19VUkwpKSB7Ci0JCQl0aGlzLnVybENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9KREJDX1VTRVIpKSB7Ci0JCQl0aGlzLnVzZXJDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfSkRCQ19QQVNTV09SRCkpIHsKLQkJCXRoaXMucGFzc3dvcmRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBwcm9wZXJ0eSBuYW1lcyBrZXkvdmFsdWUgcGFpcnMsIHdoZXJlOiAKLQkgKiAJCWtleSA9IFBVIHByb3BlcnR5IGtleQotCSAqIAkJdmFsdWUgPSBwcm9wZXJ0eSBpZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVIsCi0JCQlEUklWRVJfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCVBFUlNJU1RFTkNFX0pEQkNfVVJMLAotCQkJVVJMX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9KREJDX1VTRVIsCi0JCQlVU0VSX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9KREJDX1BBU1NXT1JELAotCQkJUEFTU1dPUkRfUFJPUEVSVFkpOwotCX0KLQotCS8vICoqKioqKioqKiogRHJpdmVyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlcigpIHsKLQkJcmV0dXJuIHRoaXMuZHJpdmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERyaXZlcihTdHJpbmcgbmV3RHJpdmVyKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKLQkJdGhpcy5kcml2ZXIgPSBuZXdEcml2ZXI7Ci0JCXRoaXMucHV0UHJvcGVydHkoRFJJVkVSX1BST1BFUlRZLCBuZXdEcml2ZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRFJJVkVSX1BST1BFUlRZLCBvbGQsIG5ld0RyaXZlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyaXZlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRyaXZlcjsKLQkJdGhpcy5kcml2ZXIgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERSSVZFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCkgewotCQlyZXR1cm4gREVGQVVMVF9KREJDX0RSSVZFUjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVSTCAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB0aGlzLnVybDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcmwoU3RyaW5nIG5ld1VybCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7Ci0JCXRoaXMudXJsID0gbmV3VXJsOwotCQl0aGlzLnB1dFByb3BlcnR5KFVSTF9QUk9QRVJUWSwgbmV3VXJsKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVSTF9QUk9QRVJUWSwgb2xkLCBuZXdVcmwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cmxDaGFuZ2VkKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy51cmw7Ci0JCXRoaXMudXJsID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUkxfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFVybCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfSkRCQ19VUkw7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVc2VyICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFVzZXIoKSB7Ci0JCXJldHVybiB0aGlzLnVzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy51c2VyOwotCQl0aGlzLnVzZXIgPSBuZXdVc2VyOwotCQl0aGlzLnB1dFByb3BlcnR5KFVTRVJfUFJPUEVSVFksIG5ld1VzZXIpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdVc2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXNlckNoYW5nZWQoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnVzZXI7Ci0JCXRoaXMudXNlciA9IG5ld1ZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVVNFUl9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXNlcigpIHsKLQkJcmV0dXJuIERFRkFVTFRfSkRCQ19VU0VSOwotCX0KLQotCS8vICoqKioqKioqKiogUGFzc3dvcmQgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7Ci0JCXJldHVybiB0aGlzLnBhc3N3b3JkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBuZXdQYXNzd29yZCkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wYXNzd29yZDsKLQkJdGhpcy5wYXNzd29yZCA9IG5ld1Bhc3N3b3JkOwotCQl0aGlzLnB1dFByb3BlcnR5KFBBU1NXT1JEX1BST1BFUlRZLCBuZXdQYXNzd29yZCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQQVNTV09SRF9QUk9QRVJUWSwgb2xkLCBuZXdQYXNzd29yZCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhc3N3b3JkQ2hhbmdlZChTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGFzc3dvcmQ7Ci0JCXRoaXMucGFzc3dvcmQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBBU1NXT1JEX1BST1BFUlRZLCBvbGQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIERFRkFVTFRfSkRCQ19QQVNTV09SRDsKLQl9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL051bGxDb25uZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9OdWxsQ29ubmVjdGlvbjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTMxYzI4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL051bGxDb25uZWN0aW9uMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLQotLyoqCi0gKiAgR2VuZXJpY0Nvbm5lY3Rpb24yXzAKLSAqLwotcHVibGljIGNsYXNzIE51bGxDb25uZWN0aW9uMl8wIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBKcGFDb25uZWN0aW9uMl8wCi17Ci0JCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIE51bGxDb25uZWN0aW9uMl8wKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gUFUgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKioqKioqKiBEcml2ZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREcml2ZXIoU3RyaW5nIG5ld0RyaXZlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHREcml2ZXIoKSB7Ci0JCXJldHVybiBERUZBVUxUX0pEQkNfRFJJVkVSOwotCX0KLQotCS8vICoqKioqKioqKiogVVJMICoqKioqKioqKioKLQlwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXJsKFN0cmluZyBuZXdVcmwpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VXJsKCkgewotCQlyZXR1cm4gREVGQVVMVF9KREJDX1VSTDsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVzZXIgKioqKioqKioqKgotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXNlcihTdHJpbmcgbmV3VXNlcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRVc2VyKCkgewotCQlyZXR1cm4gREVGQVVMVF9KREJDX1VTRVI7Ci0JfQotCi0JLy8gKioqKioqKioqKiBQYXNzd29yZCAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIG5ld1Bhc3N3b3JkKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhc3N3b3JkKCkgewotCQlyZXR1cm4gREVGQVVMVF9KREJDX1BBU1NXT1JEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNPcHRpb25zMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9HZW5lcmljT3B0aW9uczJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGNmMjkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNPcHRpb25zMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIG9wdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNPcHRpb25zMl8wIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBKcGFPcHRpb25zMl8wCi17Ci0JLy8gKioqKioqKioqKiBHZW5lcmljQ29ubmVjdGlvbiBwcm9wZXJ0aWVzICoqKioqKioqKioKLQlwcml2YXRlIEludGVnZXIgbG9ja1RpbWVvdXQ7Ci0JcHJpdmF0ZSBJbnRlZ2VyIHF1ZXJ5VGltZW91dDsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0czsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzOwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXM7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEdlbmVyaWNPcHRpb25zMl8wKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCXRoaXMubG9ja1RpbWVvdXQgPSAKLQkJCXRoaXMuZ2V0SW50ZWdlclZhbHVlKFBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCk7Ci0JCXRoaXMucXVlcnlUaW1lb3V0ID0gCi0JCQl0aGlzLmdldEludGVnZXJWYWx1ZShQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKTsKLQotCQkvLyBWYWxpZGF0aW9uTW9kZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBwZXJzaXN0ZW5jZSB1bml0IGVsZW1lbnQKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCk7Ci0JCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyA9IHRoaXMuZ2V0Q29tcG9zaXRlVmFsdWUoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFKTsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQpKSB7Ci0JCQl0aGlzLmxvY2tUaW1lb3V0Q2hhbmdlZChuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKSkgewotCQkJdGhpcy5xdWVyeVRpbWVvdXRDaGFuZ2VkKG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1QpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzQ2hhbmdlZCgpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlSZW1vdmVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUKSkgewotCQkJdGhpcy5sb2NrVGltZW91dENoYW5nZWQobnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUKSkgewotCQkJdGhpcy5xdWVyeVRpbWVvdXRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVCkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNDaGFuZ2VkKCk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpKSB7Ci0JCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gUFUgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQsCi0JCQlMT0NLX1RJTUVPVVRfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLnB1dCgKLQkJCVBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQsCi0JCQlRVUVSWV9USU1FT1VUX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNULAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSk7Ci0JCXByb3BlcnR5TmFtZXMucHV0KAotCQkJUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5wdXQoCi0JCQlQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQyXzAgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMb2NrVGltZW91dCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0TG9ja1RpbWVvdXQoKSB7Ci0JCXJldHVybiB0aGlzLmxvY2tUaW1lb3V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2tUaW1lb3V0KEludGVnZXIgbmV3TG9ja1RpbWVvdXQpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmxvY2tUaW1lb3V0OwotCQl0aGlzLmxvY2tUaW1lb3V0ID0gbmV3TG9ja1RpbWVvdXQ7Ci0JCXRoaXMucHV0UHJvcGVydHkoTE9DS19USU1FT1VUX1BST1BFUlRZLCBuZXdMb2NrVGltZW91dCk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0NLX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3TG9ja1RpbWVvdXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2NrVGltZW91dENoYW5nZWQoU3RyaW5nIHN0cmluZ1ZhbHVlKSB7Ci0JCUludGVnZXIgbmV3VmFsdWUgPSBnZXRJbnRlZ2VyVmFsdWVPZihzdHJpbmdWYWx1ZSk7Ci0JCQotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubG9ja1RpbWVvdXQ7Ci0JCXRoaXMubG9ja1RpbWVvdXQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExPQ0tfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdWYWx1ZSk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExvY2tUaW1lb3V0KCkgewotCQlyZXR1cm4gREVGQVVMVF9MT0NLX1RJTUVPVVQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldFF1ZXJ5VGltZW91dCgpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlUaW1lb3V0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5VGltZW91dChJbnRlZ2VyIG5ld1F1ZXJ5VGltZW91dCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMucXVlcnlUaW1lb3V0OwotCQl0aGlzLnF1ZXJ5VGltZW91dCA9IG5ld1F1ZXJ5VGltZW91dDsKLQkJdGhpcy5wdXRQcm9wZXJ0eShRVUVSWV9USU1FT1VUX1BST1BFUlRZLCBuZXdRdWVyeVRpbWVvdXQpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgb2xkLCBuZXdRdWVyeVRpbWVvdXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBxdWVyeVRpbWVvdXRDaGFuZ2VkKFN0cmluZyBzdHJpbmdWYWx1ZSkgewotCQlJbnRlZ2VyIG5ld1ZhbHVlID0gZ2V0SW50ZWdlclZhbHVlT2Yoc3RyaW5nVmFsdWUpOwotCQkKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnF1ZXJ5VGltZW91dDsKLQkJdGhpcy5xdWVyeVRpbWVvdXQgPSBuZXdWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIG9sZCwgbmV3VmFsdWUpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRRdWVyeVRpbWVvdXQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1FVRVJZX1RJTUVPVVQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyAqKioqKioqKioqCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKCl7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFN0cmluZz4odGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNTaXplKCl7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0RXhpc3RzKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2xhc3NOYW1lKSB7Ci0JCWZvciAoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgOiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0LmVxdWFscyh2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2xhc3NOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBhZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KFN0cmluZyBuZXdQcmVQZXJzaXN0Q2xhc3NOYW1lKXsKLQotCQlpZiggISB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RFeGlzdHMobmV3UHJlUGVyc2lzdENsYXNzTmFtZSkpIHsKLQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMuYWRkKG5ld1ByZVBlcnNpc3RDbGFzc05hbWUpOwotCQkJdGhpcy5wdXRQcm9wZXJ0eUNvbXBvc2l0ZVZhbHVlKFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksIG5ld1ByZVBlcnNpc3RDbGFzc05hbWUpOwotCQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKTsKLQkJCXJldHVybiBuZXdQcmVQZXJzaXN0Q2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KFN0cmluZyBjbGFzc05hbWUpewotCi0JCWlmKHRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdF8oY2xhc3NOYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlbW92ZVByb3BlcnR5Q29tcG9zaXRlVmFsdWUoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgY2xhc3NOYW1lKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdF8oU3RyaW5nIGNsYXNzTmFtZSl7Ci0KLQkJZm9yICggU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgOiB0aGlzLmdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKCkpIHsKLQkJCWlmKHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzLnJlbW92ZSh2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KTsKLQkJCQlyZXR1cm4gdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNDaGFuZ2VkKCkgewotCQl0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUKTsKLQkJdGhpcy5maXJlTGlzdENoYW5nZWQoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMoKXsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNTaXplKCl7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUV4aXN0cyhTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2xhc3NOYW1lKSB7Ci0KLQkJZm9yIChTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlIDogdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUuZXF1YWxzKHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBhZGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoU3RyaW5nIG5ld1ByZVVwZGF0ZUNsYXNzTmFtZSl7Ci0KLQkJaWYoICEgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMobmV3UHJlVXBkYXRlQ2xhc3NOYW1lKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzLmFkZChuZXdQcmVVcGRhdGVDbGFzc05hbWUpOwotCQkJdGhpcy5wdXRQcm9wZXJ0eUNvbXBvc2l0ZVZhbHVlKFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgbmV3UHJlVXBkYXRlQ2xhc3NOYW1lKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMpOwotCQkJcmV0dXJuIG5ld1ByZVVwZGF0ZUNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKFN0cmluZyBjbGFzc05hbWUpewotCi0JCWlmKHRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlXyhjbGFzc05hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksIGNsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVfKFN0cmluZyBjbGFzc05hbWUpewotCi0JCWZvcihTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlIDogdGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCkpIHsKLQkJCWlmKHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcy5yZW1vdmUodmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKTsKLQkJCQlyZXR1cm4gdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzQ2hhbmdlZCgpIHsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEUpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKXsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCl7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUV4aXN0cyhTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ2xhc3NOYW1lKSB7Ci0KLQkJZm9yIChTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlIDogdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKSB7Ci0JCQlpZih2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUuZXF1YWxzKHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBhZGRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoU3RyaW5nIG5ld1ByZVJlbW92ZUNsYXNzTmFtZSl7Ci0KLQkJaWYoICEgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMobmV3UHJlUmVtb3ZlQ2xhc3NOYW1lKSkgewotCQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzLmFkZChuZXdQcmVSZW1vdmVDbGFzc05hbWUpOwotCQkJdGhpcy5wdXRQcm9wZXJ0eUNvbXBvc2l0ZVZhbHVlKFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwgbmV3UHJlUmVtb3ZlQ2xhc3NOYW1lKTsKLQkJCXRoaXMuZmlyZUxpc3RDaGFuZ2VkKFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNULCB0aGlzLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMpOwotCQkJcmV0dXJuIG5ld1ByZVJlbW92ZUNsYXNzTmFtZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKFN0cmluZyBjbGFzc05hbWUpewotCi0JCWlmKHRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlXyhjbGFzc05hbWUpICE9IG51bGwpIHsKLQkJCXRoaXMucmVtb3ZlUHJvcGVydHlDb21wb3NpdGVWYWx1ZShWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksIGNsYXNzTmFtZSk7Ci0JCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVfKFN0cmluZyBjbGFzc05hbWUpewotCi0JCWZvcihTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlIDogdGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKCkpIHsKLQkJCWlmKHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZS5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCXRoaXMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlcy5yZW1vdmUodmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKTsKLQkJCQlyZXR1cm4gdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzQ2hhbmdlZCgpIHsKLQkJdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzID0gdGhpcy5nZXRDb21wb3NpdGVWYWx1ZShQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkUpOwotCQl0aGlzLmZpcmVMaXN0Q2hhbmdlZChWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCwgdGhpcy52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9OdWxsT3B0aW9uczJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvTnVsbE9wdGlvbnMyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmMTNhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9OdWxsT3B0aW9uczJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLkFic3RyYWN0UGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIG9wdGlvbnMKLSAqLwotcHVibGljIGNsYXNzIE51bGxPcHRpb25zMl8wIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi0JaW1wbGVtZW50cyBKcGFPcHRpb25zMl8wCi17Ci0JCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIE51bGxPcHRpb25zMl8wKFBlcnNpc3RlbmNlVW5pdCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBJbml0aWFsaXplcyBwcm9wZXJ0aWVzIHdpdGggdmFsdWVzIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7Ci0JCS8vZG8gbm90aGluZwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHByb3BlcnR5VmFsdWVDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBuZXdWYWx1ZSkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eVJlbW92ZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvL2RvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHByb3BlcnR5IG5hbWVzIGtleS92YWx1ZSBwYWlycywgd2hlcmU6IAotCSAqIAkJa2V5ID0gUFUgcHJvcGVydHkga2V5Ci0JICogCQl2YWx1ZSA9IHByb3BlcnR5IGlkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJLy9kbyBub3RoaW5nCi0JfQotCi0JLy8gKioqKioqKioqKiBMb2NrVGltZW91dCAqKioqKioqKioqCi0JcHVibGljIEludGVnZXIgZ2V0TG9ja1RpbWVvdXQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2tUaW1lb3V0KEludGVnZXIgbmV3TG9ja1RpbWVvdXQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEludGVnZXIgZ2V0RGVmYXVsdExvY2tUaW1lb3V0KCkgewotCQlyZXR1cm4gREVGQVVMVF9MT0NLX1RJTUVPVVQ7Ci0JfQotCi0JLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgKioqKioqKioqKgotCXB1YmxpYyBJbnRlZ2VyIGdldFF1ZXJ5VGltZW91dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVlcnlUaW1lb3V0KEludGVnZXIgbmV3UXVlcnlUaW1lb3V0KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBJbnRlZ2VyIGdldERlZmF1bHRRdWVyeVRpbWVvdXQoKSB7Ci0JCXJldHVybiBERUZBVUxUX1FVRVJZX1RJTUVPVVQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzICoqKioqKioqKioKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDbGFzc05hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoU3RyaW5nIG5ld1ZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDbGFzc05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDbGFzc05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzICoqKioqKioqKioKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNsYXNzTmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgYWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKFN0cmluZyBuZXdWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVDbGFzc05hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2xhc3NOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyAqKioqKioqKioqCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlRXhpc3RzKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDbGFzc05hbWUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ2xhc3NOYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNsYXNzTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0FjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NTQ5ZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0FjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5BY2Nlc3MKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEFjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEFjY2VzczJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlQWNjZXNzMl8wQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQWNjZXNzMl8wQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUFjY2VzczJfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmODBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5idWlsZFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkFTU09DSUFUSU9OX09WRVJSSURFU19fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2Zjk2Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkNhY2hlYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VDYWNoZWFibGUyXzBBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIENhY2hlYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Db2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OThlMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5Q29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2xsZWN0aW9uVGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MDZjYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVsZW1lbnRDb2xsZWN0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ3Yjc4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5R2VuZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VHZW5lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuR2VuZXJhdGVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgR2VuZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgR2VuZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgR2VuZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgR2VuZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRlZEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VHZW5lcmF0ZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEdlbmVyYXRlZEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJhdGVkQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlHZW5lcmF0ZWRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDbGFzczJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjYxNjhjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDbGFzczJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlDbGFzcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBLZXlDbGFzczJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VNYXBLZXlDbGFzczJfMEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjg5ZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlDb2x1bW4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hcEtleUNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE1hcEtleUNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1hcEtleUNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsTWFwS2V5Q29sdW1uQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTI5ZTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleVRlbXBvcmFsCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDcxYTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlKb2luQ29sdW1uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLmJ1aWxkU291cmNlTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU47Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUpvaW5Db2x1bW5zMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRiN2I3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlKb2luQ29sdW1ucwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBLZXlKb2luQ29sdW1uczJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1hcEtleUpvaW5Db2x1bW5zMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24sIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3NTk5NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlUZW1wb3JhbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBzSWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNGM1NTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU1hcHNJZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTWFwc0lkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTWFwc0lkCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBzSWQyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFwc0lkMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE1hcHNJZDJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZU1hcHNJZDJfMEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxNYXBzSWQyXzBBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hcHNJZDJfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcHNJZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg5MDA2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeTJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRRdWVyeTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRRdWVyeTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTmFtZWRRdWVyeTJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTmFtZWRRdWVyeTJfMEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlTmFtZWRRdWVyeTJfMEFubm90YXRpb24uYnVpbGRTb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TmFtZWRRdWVyeTJfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfUVVFUlk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9RVUVSSUVTOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfUVVFUklFU19fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxBY2Nlc3MyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbEFjY2VzczJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3OWJlYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbEFjY2VzczJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFjY2Vzc1R5cGU7Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuQWNjZXNzPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEFjY2VzczJfMEFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uPEFjY2VzczJfMEFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBBY2Nlc3MyXzBBbm5vdGF0aW9uCi17Ci0KLQlwcm90ZWN0ZWQgTnVsbEFjY2VzczJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQWNjZXNzVHlwZSB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOTNlZDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZTwvY29kZT4gZm91bmQgaW4gYQotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZTwvY29kZT4gYW5ub3RhdGlvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsSm9pblRhYmxlQW5ub3RhdGlvbgotewotCXB1YmxpYyBOdWxsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZUFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIChBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbikgdGhpcy5wYXJlbnQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpvaW5UYWJsZUFubm90YXRpb24gYWRkQW5ub3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24oKS5hZGRKb2luVGFibGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDkyZjRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxCYXNlVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2xsZWN0aW9uVGFibGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEJhc2VUYWJsZUFubm90YXRpb248Q29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24KLXsKLQlwdWJsaWMgTnVsbENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JLy8gKioqKiogam9pbiBjb2x1bW5zCi0JcHVibGljIExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJLy8gdGhlIENvbGxlY3Rpb25UYWJsZSBhbm5vdGF0aW9uIGlzIG1pc3NpbmcsIGFkZCBib3RoIGl0IGFuZCBhIGpvaW4gY29sdW1uIGF0IHRoZSBzYW1lIHRpbWUKLQkJcmV0dXJuIHRoaXMuYWRkQW5ub3RhdGlvbigpLmFkZEpvaW5Db2x1bW4oaW5kZXgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtb3ZlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxNYXBLZXlDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE1hcEtleUNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhYzM3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE1hcEtleUNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEJhc2VDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlDb2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTWFwS2V5Q29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEJhc2VDb2x1bW5Bbm5vdGF0aW9uPE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uCi17Ci0JcHVibGljIE51bGxNYXBLZXlDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiBsZW5ndGgKLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldExlbmd0aChsZW5ndGgpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogc2NhbGUKLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoSW50ZWdlciBzY2FsZSkgewotCQlpZiAoc2NhbGUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0U2NhbGUoc2NhbGUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBwcmVjaXNpb24KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFByZWNpc2lvbihwcmVjaXNpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmVjaXNpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQxMTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlFbnVtZXJhdGVkPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbjxNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgRW51bVR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVudW1UeXBlIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkN2JjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxCYXNlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUpvaW5Db2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIE51bGxCYXNlQ29sdW1uQW5ub3RhdGlvbjxNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcmVmZXJlbmNlZENvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5NzFiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5VGVtcG9yYWw8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbjxNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgTnVsbE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUZW1wb3JhbFR5cGUgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL051bGxNYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE1hcHNJZDJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1NTNhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE1hcHNJZDJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk1hcHNJZDwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxNYXBzSWQyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQW5ub3RhdGlvbjxNYXBzSWQyXzBBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgTWFwc0lkMl8wQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsTWFwc0lkMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTnVsbE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQ4ODZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9OdWxsT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxOYW1lZENvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PcmRlckNvbHVtbjJfMEFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuT3JkZXJDb2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsTmFtZWRDb2x1bW5Bbm5vdGF0aW9uPE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbgotewkKLQlwdWJsaWMgTnVsbE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqIHVwZGF0YWJsZQotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCWlmICh1cGRhdGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VXBkYXRhYmxlKHVwZGF0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBpbnNlcnRhYmxlCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJaWYgKGluc2VydGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0SW5zZXJ0YWJsZShpbnNlcnRhYmxlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBudWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCWlmIChudWxsYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROdWxsYWJsZShudWxsYWJsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE51bGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PcmRlckNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDNiY2IzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PcmRlckNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5T3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckNvbHVtbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcmRlckNvbHVtbjJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VPcmRlckNvbHVtbjJfMEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgTnVsbE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBPcmRlckNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODA0MjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9TdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1N0YXRpY01ldGFtb2RlbEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Y2Q1NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL1N0YXRpY01ldGFtb2RlbEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVN0YXRpY01ldGFtb2RlbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlN0YXRpY01ldGFtb2RlbEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UubWV0YW1vZGVsLlN0YXRpY01ldGFtb2RlbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0YXRpY01ldGFtb2RlbEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VTdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0YXRpY01ldGFtb2RlbEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlTdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFN0YXRpY01ldGFtb2RlbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QWNjZXNzMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBY2Nlc3MyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOGQxM2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBY2Nlc3MyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5BY2Nlc3MKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUFjY2VzczJfMEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEFjY2VzczJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIEFjY2Vzc1R5cGUgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlBY2Nlc3MyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWNjZXNzQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oQWNjZXNzVHlwZSB2YWx1ZSkgewotCQlBY2Nlc3NUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEFjY2Vzc1R5cGUgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuQUNDRVNTKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4OWYyYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqICBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIEpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlOwotCXByaXZhdGUgZmluYWwgSm9pblRhYmxlQW5ub3RhdGlvbiBudWxsSm9pblRhYmxlOwotCi0JcHVibGljIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuam9pblRhYmxlID0gdGhpcy5idWlsZEpvaW5UYWJsZSgpOwotCQl0aGlzLm51bGxKb2luVGFibGUgPSB0aGlzLmJ1aWxkTnVsbEpvaW5UYWJsZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlSm9pblRhYmxlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGpvaW5UYWJsZQotCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGdldEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pblRhYmxlOwotCX0KLQotCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGdldE5vbk51bGxKb2luVGFibGUoKSB7Ci0JCXJldHVybiAodGhpcy5qb2luVGFibGUgIT0gbnVsbCkgPyB0aGlzLmpvaW5UYWJsZSA6IHRoaXMubnVsbEpvaW5UYWJsZTsKLQl9Ci0KLQlwdWJsaWMgSm9pblRhYmxlQW5ub3RhdGlvbiBhZGRKb2luVGFibGUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luVGFibGUoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgSm9pblRhYmxlQW5ub3RhdGlvbiBidWlsZEpvaW5UYWJsZSgpIHsKLQkJSUFubm90YXRpb24gamR0Sm9pblRhYmxlID0gdGhpcy5nZXRKZHRKb2luVGFibGUoKTsKLQkJcmV0dXJuIChqZHRKb2luVGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEpvaW5UYWJsZShqZHRKb2luVGFibGUpOwotCX0KLQotCXByaXZhdGUgSm9pblRhYmxlQW5ub3RhdGlvbiBidWlsZE51bGxKb2luVGFibGUoKSB7Ci0JCXJldHVybiBuZXcgTnVsbEpvaW5UYWJsZUFubm90YXRpb24odGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBKb2luVGFibGVBbm5vdGF0aW9uIGJ1aWxkSm9pblRhYmxlKElBbm5vdGF0aW9uIGpkdEpvaW5UYWJsZSkgewotCQlyZXR1cm4gbmV3IEJpbmFyeUpvaW5UYWJsZUFubm90YXRpb24odGhpcywgamR0Sm9pblRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIElBbm5vdGF0aW9uIGdldEpkdEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuIChJQW5ub3RhdGlvbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEUpOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pblRhYmxlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLS8vCQlJQW5ub3RhdGlvbiBqZHRKb2luVGFibGUgPSB0aGlzLmdldEpkdEpvaW5UYWJsZSgpOwotLy8JCWlmIChqZHRKb2luVGFibGUgPT0gbnVsbCkgewotLy8JCQl0aGlzLnNldEpvaW5UYWJsZShudWxsKTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotLy8JCQkJdGhpcy5zZXRKb2luVGFibGUodGhpcy5idWlsZEpvaW5UYWJsZShqZHRKb2luVGFibGUpKTsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCXRoaXMuY29sdW1uLnVwZGF0ZShqZHRKb2luVGFibGUpOwotLy8JCQl9Ci0vLwkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q2FjaGVhYmxlMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWE1ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuQ2FjaGVhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlDYWNoZWFibGUyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBDYWNoZWFibGUyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBCb29sZWFuIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5Q2FjaGVhYmxlMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENhY2hlYWJsZTJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgQm9vbGVhbiBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuQ0FDSEVBQkxFX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAyNGI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUJhc2VUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2xsZWN0aW9uVGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnM7Ci0KLQotCXB1YmxpYyBCaW5hcnlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuam9pbkNvbHVtbnMgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5QmFzZVRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuQ09MTEVDVElPTl9UQUJMRV9fU0NIRU1BOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZ0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLkNPTExFQ1RJT05fVEFCTEVfX0NBVEFMT0c7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuQ09MTEVDVElPTl9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGpvaW4gY29sdW1ucwotCXB1YmxpYyBMaXN0SXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYnVpbGRKb2luQ29sdW1ucygpIHsKLQkJT2JqZWN0W10gamR0Sm9pbkNvbHVtbnMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEyXzAuQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKLQkJVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPihqZHRKb2luQ29sdW1ucy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBqZHRKb2luQ29sdW1uIDogamR0Sm9pbkNvbHVtbnMpIHsKLQkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Sm9pbkNvbHVtbikpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2ZmEyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLQotLyoqCi0gKiBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucy5UcmFuc2Zvcm1hdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5RWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyB0YXJnZXRDbGFzczsKLQlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKLQotCi0JcHVibGljIEJpbmFyeUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnRhcmdldENsYXNzID0gdGhpcy5idWlsZFRhcmdldENsYXNzKCk7Ci0JCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VGFyZ2V0Q2xhc3NfKHRoaXMuYnVpbGRUYXJnZXRDbGFzcygpKTsKLQkJdGhpcy5zZXRGZXRjaF8odGhpcy5idWlsZEZldGNoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdGFyZ2V0IGVudGl0eQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Q2xhc3MoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldENsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhcmdldENsYXNzKFN0cmluZyB0YXJnZXRDbGFzcykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VGFyZ2V0Q2xhc3NfKFN0cmluZyB0YXJnZXRDbGFzcykgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRDbGFzczsKLQkJdGhpcy50YXJnZXRDbGFzcyA9IHRhcmdldENsYXNzOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0NMQVNTX1BST1BFUlRZLCBvbGQsIHRhcmdldENsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRhcmdldENsYXNzKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1MpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHRhcmdldCBlbnRpdHkgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldENsYXNzOwotCX0KLQotCS8vICoqKioqIGZldGNoCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZmV0Y2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRGZXRjaF8oRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGQgPSB0aGlzLmZldGNoOwotCQl0aGlzLmZldGNoID0gZmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGRVRDSF9QUk9QRVJUWSwgb2xkLCBmZXRjaCk7Ci0JfQotCi0JcHJpdmF0ZSBGZXRjaFR5cGUgYnVpbGRGZXRjaCgpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUdlbmVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5R2VuZXJhdGVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQyN2EzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5R2VuZXJhdGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlHZW5lcmF0ZWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBHZW5lcmF0ZWRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8U3RyaW5nPiB2YWx1ZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0ZTsKLQlwcml2YXRlIFN0cmluZyBjb21tZW50czsKLQotCi0JcHVibGljIEJpbmFyeUdlbmVyYXRlZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZXMgPSB0aGlzLmJ1aWxkVmFsdWVzKCk7Ci0JCXRoaXMuZGF0ZSA9IHRoaXMuYnVpbGREYXRlKCk7Ci0JCXRoaXMuY29tbWVudHMgPSB0aGlzLmJ1aWxkQ29tbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlVmFsdWVzKCk7Ci0JCXRoaXMuc2V0RGF0ZV8odGhpcy5idWlsZERhdGUoKSk7Ci0JCXRoaXMuc2V0Q29tbWVudHNfKHRoaXMuYnVpbGRDb21tZW50cygpKTsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhbHVlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEdlbmVyYXRlZEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWVzCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnZhbHVlcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRWYWx1ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlcy5nZXQoaW5kZXgpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRWYWx1ZXMoKSB7Ci0JCU9iamVjdFtdIGpkdFZhbHVlcyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKFZBTFVFX0VMRU1FTlRfTkFNRSk7Ci0JCVZlY3RvcjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBWZWN0b3I8U3RyaW5nPihqZHRWYWx1ZXMubGVuZ3RoKTsKLQkJZm9yIChPYmplY3QgdmFsdWUgOiBqZHRWYWx1ZXMpIHsKLQkJCXJlc3VsdC5hZGQoKFN0cmluZykgdmFsdWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZhbHVlKGludCBpbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVWYWx1ZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGRhdGUKLQlwdWJsaWMgU3RyaW5nIGdldERhdGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0ZShTdHJpbmcgZGF0ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RGF0ZV8oU3RyaW5nIGRhdGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZGF0ZTsKLQkJdGhpcy5kYXRlID0gZGF0ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERBVEVfUFJPUEVSVFksIG9sZCwgZGF0ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREYXRlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShEQVRFX0VMRU1FTlRfTkFNRSk7Ci0JfQotCi0JLy8gKioqKiogY29tbWVudHMKLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRzKCkgewotCQlyZXR1cm4gdGhpcy5jb21tZW50czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50cyhTdHJpbmcgY29tbWVudHMpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbW1lbnRzXyhTdHJpbmcgY29tbWVudHMpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY29tbWVudHM7Ci0JCXRoaXMuY29tbWVudHMgPSBjb21tZW50czsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTU1FTlRTX1BST1BFUlRZLCBvbGQsIGNvbW1lbnRzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENvbW1lbnRzKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShDT01NRU5UU19FTEVNRU5UX05BTUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBLZXlDbGFzczJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWViYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBLZXlDbGFzczJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUNsYXNzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlNYXBLZXlDbGFzczJfMEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiAKLXsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCi0JcHVibGljIEJpbmFyeU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQTJfMC5NQVBfS0VZX0NMQVNTX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQotCS8qKgotCSAqIGJpbmFyeSBpcyBhbHJlYWR5IGZ1bGx5LXF1YWxpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxZTJhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlDb21wbGV0ZUNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUNvbHVtbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5TWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5Q29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5TWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fVU5JUVVFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TnVsbGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fTlVMTEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fVVBEQVRBQkxFOwotCX0KLQotCQotCS8vICoqKioqKioqKiogQmluYXJ5Q29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGVuZ3RoRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX0xFTkdUSDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVjaXNpb25FbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fUFJFQ0lTSU9OOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNjYWxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX1NDQUxFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4MzhlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QmFzZUVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTWFwS2V5RW51bWVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5TWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUJhc2VFbnVtZXJhdGVkQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURURfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwODhmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Sm9pbkNvbHVtbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5TWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTl9fVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OX19VTklRVUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROdWxsYWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5fX05VTExBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OX19VUERBVEFCTEU7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogQmluYXJ5QmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZmY5MjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlCYXNlVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleVRlbXBvcmFsCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUJhc2VUZW1wb3JhbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbgotewotCQotCXB1YmxpYyBCaW5hcnlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUxfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYjcwMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcHNJZAotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5TWFwc0lkMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFwc0lkMl8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCQotCQotCXB1YmxpYyBCaW5hcnlNYXBzSWQyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBNYXBzSWQyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gbmV3VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBMl8wLk1BUFNfSURfX1ZBTFVFKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRRdWVyeTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRRdWVyeTJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFmOWQ2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkxvY2tNb2RlVHlwZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAgQmluYXJ5TmFtZWRRdWVyeTJfMEFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlOYW1lZFF1ZXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgTmFtZWRRdWVyeTJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIExvY2tNb2RlVHlwZV8yXzAgbG9ja01vZGU7Ci0KLQlwdWJsaWMgQmluYXJ5TmFtZWRRdWVyeTJfMEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5sb2NrTW9kZSA9IHRoaXMuYnVpbGRMb2NrTW9kZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0TG9ja01vZGVfKHRoaXMuYnVpbGRMb2NrTW9kZSgpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgTG9ja01vZGVUeXBlXzJfMCBnZXRMb2NrTW9kZSgpIHsKLQkJcmV0dXJuIHRoaXMubG9ja01vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9ja01vZGUoTG9ja01vZGVUeXBlXzJfMCBsb2NrTW9kZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TG9ja01vZGVfKExvY2tNb2RlVHlwZV8yXzAgbG9ja01vZGUpIHsKLQkJTG9ja01vZGVUeXBlXzJfMCBvbGQgPSB0aGlzLmxvY2tNb2RlOwotCQl0aGlzLmxvY2tNb2RlID0gbG9ja01vZGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0NLX01PREVfUFJPUEVSVFksIG9sZCwgbG9ja01vZGUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9ja01vZGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbG9ja01vZGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgTG9ja01vZGVUeXBlXzJfMCBidWlsZExvY2tNb2RlKCkgewotCQlyZXR1cm4gTG9ja01vZGVUeXBlXzJfMC5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQTJfMC5OQU1FRF9RVUVSWV9fTE9DS19NT0RFKSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2VjZmVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuT3JkZXJDb2x1bW4KLSAqLwotcHVibGljIGNsYXNzIEJpbmFyeU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5TmFtZWRDb2x1bW5Bbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBPcmRlckNvbHVtbjJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIEJvb2xlYW4gbnVsbGFibGU7Ci0JcHJpdmF0ZSBCb29sZWFuIGluc2VydGFibGU7Ci0JcHJpdmF0ZSBCb29sZWFuIHVwZGF0YWJsZTsKLQkKLQotCXB1YmxpYyBCaW5hcnlPcmRlckNvbHVtbjJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5udWxsYWJsZSA9IHRoaXMuYnVpbGROdWxsYWJsZSgpOwotCQl0aGlzLmluc2VydGFibGUgPSB0aGlzLmJ1aWxkSW5zZXJ0YWJsZSgpOwotCQl0aGlzLnVwZGF0YWJsZSA9IHRoaXMuYnVpbGRVcGRhdGFibGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE51bGxhYmxlXyh0aGlzLmJ1aWxkTnVsbGFibGUoKSk7Ci0JCXRoaXMuc2V0SW5zZXJ0YWJsZV8odGhpcy5idWlsZEluc2VydGFibGUoKSk7Ci0JCXRoaXMuc2V0VXBkYXRhYmxlXyh0aGlzLmJ1aWxkVXBkYXRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCQotCS8vKioqKioqKioqKioqKiBCaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19OQU1FOwotCX0KLQkKLQkvLyoqKioqKioqKioqKiogT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQkKLQkvLyAqKioqKiBudWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5udWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROdWxsYWJsZV8oQm9vbGVhbiBudWxsYWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMubnVsbGFibGU7Ci0JCXRoaXMubnVsbGFibGUgPSBudWxsYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5VTExBQkxFX1BST1BFUlRZLCBvbGQsIG51bGxhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKGdldE51bGxhYmxlRWxlbWVudE5hbWUoKSk7Ci0JfQotCQotCVN0cmluZyBnZXROdWxsYWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fTlVMTEFCTEU7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLy8gKioqKiogaW5zZXJ0YWJsZQotCXB1YmxpYyBCb29sZWFuIGdldEluc2VydGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmluc2VydGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEluc2VydGFibGVfKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuaW5zZXJ0YWJsZTsKLQkJdGhpcy5pbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElOU0VSVEFCTEVfUFJPUEVSVFksIG9sZCwgaW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkpOwotCX0KLQkKLQlTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fSU5TRVJUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEluc2VydGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCS8vICoqKioqIHVwZGF0YWJsZQotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHVwZGF0YWJsZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VXBkYXRhYmxlXyhCb29sZWFuIHVwZGF0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMudXBkYXRhYmxlOwotCQl0aGlzLnVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFVQREFUQUJMRV9QUk9QRVJUWSwgb2xkLCB1cGRhdGFibGUpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JU3RyaW5nIGdldFVwZGF0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fVVBEQVRBQkxFOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VXBkYXRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2NiOGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqICBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBjYXRhbG9nOwotCXByaXZhdGUgU3RyaW5nIHNjaGVtYTsKLQotCi0JcHVibGljIEJpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmNhdGFsb2cgPSB0aGlzLmJ1aWxkQ2F0YWxvZygpOwotCQl0aGlzLnNjaGVtYSA9IHRoaXMuYnVpbGRTY2hlbWEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldENhdGFsb2dfKHRoaXMuYnVpbGRDYXRhbG9nKCkpOwotCQl0aGlzLnNldFNjaGVtYV8odGhpcy5idWlsZFNjaGVtYSgpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENhdGFsb2dfKFN0cmluZyBjYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRBTE9HX1BST1BFUlRZLCBvbGQsIGNhdGFsb2cpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ2F0YWxvZygpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBMl8wLlNFUVVFTkNFX0dFTkVSQVRPUl9fQ0FUQUxPRyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWE7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNjaGVtYV8oU3RyaW5nIHNjaGVtYSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zY2hlbWE7Ci0JCXRoaXMuc2NoZW1hID0gc2NoZW1hOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NIRU1BX1BST1BFUlRZLCBvbGQsIHNjaGVtYSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRTY2hlbWEoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQTJfMC5TRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVN0YXRpY01ldGFtb2RlbEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTdmOTRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5TdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLm1ldGFtb2RlbC5TdGF0aWNNZXRhbW9kZWwKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVN0YXRpY01ldGFtb2RlbEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFN0YXRpY01ldGFtb2RlbEFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCi0JcHVibGljIEJpbmFyeVN0YXRpY01ldGFtb2RlbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBMl8wLlNUQVRJQ19NRVRBTU9ERUxfX1ZBTFVFKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQotCS8qKgotCSAqIGJpbmFyeSBpcyBhbHJlYWR5IGZ1bGx5LXF1YWxpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBY2Nlc3MyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFjY2VzczJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzNzU2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFjY2VzczJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BY2Nlc3NUeXBlOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkFjY2VzcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQWNjZXNzMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQWNjZXNzMl8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBBY2Nlc3NUeXBlIHZhbHVlOwotCi0KLQlwdWJsaWMgU291cmNlQWNjZXNzMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy52YWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWNjZXNzQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBBY2Nlc3NUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKEFjY2Vzc1R5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKEFjY2Vzc1R5cGUgYXN0VmFsdWUpIHsKLQkJQWNjZXNzVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBBY2Nlc3NUeXBlIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBMl8wLkFDQ0VTU19fVkFMVUUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFlOThjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLk51bGxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgRWxlbWVudEFubm90YXRpb25BZGFwdGVyIGpvaW5UYWJsZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZTsKLQlwcml2YXRlIGZpbmFsIEpvaW5UYWJsZUFubm90YXRpb24gbnVsbEpvaW5UYWJsZTsKLQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYnVpbGRTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBidWlsZFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCAKLQkJCWludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWFubm90YXRlZEVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGJ1aWxkTmVzdGVkU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIAotCQkJRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJCi0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgZGFhKSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCQotCQl0aGlzKHBhcmVudCwgZWxlbWVudCwgaWRhYSwgbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgaWRhYSkpOwotCX0KLQotCXByaXZhdGUgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMuam9pblRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRKb2luVGFibGVBZGFwdGVyKCk7Ci0JCXRoaXMubnVsbEpvaW5UYWJsZSA9IHRoaXMuYnVpbGROdWxsSm9pblRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQlpZiAodGhpcy5qb2luVGFibGVBZGFwdGVyLmdldEFubm90YXRpb24oYXN0Um9vdCkgIT0gbnVsbCkgewotCQkJdGhpcy5qb2luVGFibGUgPSBidWlsZEpvaW5UYWJsZUFubm90YXRpb24odGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmRhYSk7Ci0JCQl0aGlzLmpvaW5UYWJsZS5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5zeW5jSm9pblRhYmxlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8qKioqKioqKioqKiogQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JLy8gKioqKiogam9pblRhYmxlCi0JcHVibGljIEpvaW5UYWJsZUFubm90YXRpb24gZ2V0Sm9pblRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JfQotCi0JcHVibGljIEpvaW5UYWJsZUFubm90YXRpb24gZ2V0Tm9uTnVsbEpvaW5UYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmpvaW5UYWJsZSAhPSBudWxsKSA/IHRoaXMuam9pblRhYmxlIDogdGhpcy5udWxsSm9pblRhYmxlOwotCX0KLQotCXB1YmxpYyBKb2luVGFibGVBbm5vdGF0aW9uIGFkZEpvaW5UYWJsZSgpIHsKLQkJaWYgKHRoaXMuam9pblRhYmxlICE9IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIidqb2luVGFibGUnIGVsZW1lbnQgYWxyZWFkeSBleGlzdHM6ICIgKyB0aGlzLmpvaW5UYWJsZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmpvaW5UYWJsZSA9IGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhKTsKLQkJdGhpcy5qb2luVGFibGUubmV3QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5qb2luVGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSm9pblRhYmxlKCkgewotCQlpZiAodGhpcy5qb2luVGFibGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2pvaW5UYWJsZScgZWxlbWVudCBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBvbGQgPSB0aGlzLmpvaW5UYWJsZTsKLQkJdGhpcy5qb2luVGFibGUgPSBudWxsOwotCQlvbGQucmVtb3ZlQW5ub3RhdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jSm9pblRhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmpvaW5UYWJsZUFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNKb2luVGFibGVfKG51bGwpOwotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuam9pblRhYmxlID09IG51bGwpIHsKLQkJCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uKHRoaXMsIHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgdGhpcy5kYWEpOwotCQkJCXRhYmxlLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJdGhpcy5zeW5jSm9pblRhYmxlXyh0YWJsZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMuam9pblRhYmxlLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY0pvaW5UYWJsZV8oSm9pblRhYmxlQW5ub3RhdGlvbiBhc3RKb2luVGFibGUpIHsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBvbGQgPSB0aGlzLmpvaW5UYWJsZTsKLQkJdGhpcy5qb2luVGFibGUgPSBhc3RKb2luVGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChKT0lOX1RBQkxFX1BST1BFUlRZLCBvbGQsIGFzdEpvaW5UYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRKb2luVGFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5kYWEpKTsKLQl9Ci0KLQlwcml2YXRlIEpvaW5UYWJsZUFubm90YXRpb24gYnVpbGROdWxsSm9pblRhYmxlKCkgewotCQlyZXR1cm4gbmV3IE51bGxBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlQW5ub3RhdGlvbih0aGlzKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmpvaW5UYWJsZSA9PSBudWxsKTsKLQl9Ci0KLQkKLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXN0YXRpYyBKb2luVGFibGVBbm5vdGF0aW9uIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24ocGFyZW50LCBlbGVtZW50LCBidWlsZEpvaW5UYWJsZUFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcikpOwotCX0KLQotCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkSm9pblRhYmxlQW5ub3RhdGlvbkFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlciwgSlBBMl8wLkFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFLCBKUEEuSk9JTl9UQUJMRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VDYWNoZWFibGUyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBlYmM2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuQ2FjaGVhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VDYWNoZWFibGUyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBDYWNoZWFibGUyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiB2YWx1ZTsKLQotCi0JcHVibGljIFNvdXJjZUNhY2hlYWJsZTJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oZWxlbWVudCwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEJvb2xlYW4gZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShCb29sZWFuIGFzdFZhbHVlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQTJfMC5DQUNIRUFCTEVfX1ZBTFVFLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTNkNDUwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Db2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2xsZWN0aW9uVGFibGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuQ09MTEVDVElPTl9UQUJMRV9fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNDSEVNQV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuQ09MTEVDVElPTl9UQUJMRV9fU0NIRU1BKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gQ0FUQUxPR19BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuQ09MTEVDVElPTl9UQUJMRV9fQ0FUQUxPRyk7Ci0KLQotCXByaXZhdGUgZmluYWwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyIGpvaW5Db2x1bW5zQ29udGFpbmVyID0gbmV3IEpvaW5Db2x1bW5zQW5ub3RhdGlvbkNvbnRhaW5lcigpOwotCi0KLQlwdWJsaWMgU291cmNlQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lci5pbml0aWFsaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lci5zeW5jaHJvbml6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIE5BTUVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNjaGVtYURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIFNDSEVNQV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ2F0YWxvZ0RlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENBVEFMT0dfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuaXF1ZUNvbnN0cmFpbnRzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuQ09MTEVDVElPTl9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCX0KLQotCS8vICoqKioqKioqKiogQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKioqKioqKioqKioqIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7Ci0JfQotCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIubmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnNDb250YWluZXIuYWRkTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCXByaXZhdGUgSm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24uYnVpbGROZXN0ZWRTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbigKLQkJCQl0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkSm9pbkNvbHVtbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJdGhpcy5kYWEsIEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFX19KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuSk9JTl9DT0xVTU4pOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIGNvbGxlY3Rpb24gdGFibGUncyBqb2luIGNvbHVtbnMKLQkgKi8KLQljbGFzcyBKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIgCi0JCWV4dGVuZHMgQW5ub3RhdGlvbkNvbnRhaW5lcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25zUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEpPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFX19KT0lOX0NPTFVNTlM7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIFNvdXJjZUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24udGhpcy5idWlsZEpvaW5Db2x1bW4oaW5kZXgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCXRoaXMuam9pbkNvbHVtbnNDb250YWluZXIuaXNFbXB0eSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2QxZDE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotCi0vKioKLSAqIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zLlRyYW5zZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVEFSR0VUX0NMQVNTX0FEQVBURVIgPSBidWlsZFRhcmdldENsYXNzQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0Q2xhc3NBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHRhcmdldENsYXNzOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb24jZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZTsKLQkvLyB3ZSBuZWVkIGEgZmxhZyBzaW5jZSB0aGUgZi1xIG5hbWUgY2FuIGJlIG51bGwKLQlwcml2YXRlIGJvb2xlYW4gZnFUYXJnZXRDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IEZFVENIX0FEQVBURVIgPSBidWlsZEZldGNoQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZmV0Y2hBZGFwdGVyOwotCXByaXZhdGUgRmV0Y2hUeXBlIGZldGNoOwotCi0KLQlwdWJsaWMgU291cmNlRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnRhcmdldENsYXNzQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgVEFSR0VUX0NMQVNTX0FEQVBURVIpOwotCQl0aGlzLmZldGNoQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgRkVUQ0hfQURBUFRFUik7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy50YXJnZXRDbGFzcyA9IHRoaXMuYnVpbGRUYXJnZXRDbGFzcyhhc3RSb290KTsKLQkJdGhpcy5mZXRjaCA9IHRoaXMuYnVpbGRGZXRjaChhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVGFyZ2V0Q2xhc3ModGhpcy5idWlsZFRhcmdldENsYXNzKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jRmV0Y2godGhpcy5idWlsZEZldGNoKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudGFyZ2V0Q2xhc3MgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5mZXRjaCA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnRhcmdldENsYXNzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvLyAqKioqKiB0YXJnZXQgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXRDbGFzcyhTdHJpbmcgdGFyZ2V0Q2xhc3MpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudGFyZ2V0Q2xhc3MsIHRhcmdldENsYXNzKSkgewotCQkJdGhpcy50YXJnZXRDbGFzcyA9IHRhcmdldENsYXNzOwotCQkJdGhpcy5mcVRhcmdldENsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJCXRoaXMudGFyZ2V0Q2xhc3NBZGFwdGVyLnNldFZhbHVlKHRhcmdldENsYXNzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVGFyZ2V0Q2xhc3MoU3RyaW5nIGFzdFRhcmdldENsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnRhcmdldENsYXNzLCBhc3RUYXJnZXRDbGFzcykpIHsKLQkJCXRoaXMuc3luY1RhcmdldENsYXNzXyhhc3RUYXJnZXRDbGFzcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1RhcmdldENsYXNzXyhTdHJpbmcgYXN0VGFyZ2V0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFyZ2V0Q2xhc3M7Ci0JCXRoaXMudGFyZ2V0Q2xhc3MgPSBhc3RUYXJnZXRDbGFzczsKLQkJdGhpcy5mcVRhcmdldENsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBUkdFVF9DTEFTU19QUk9QRVJUWSwgb2xkLCBhc3RUYXJnZXRDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUYXJnZXRDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFRBUkdFVF9DTEFTU19BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgdGFyZ2V0IGVudGl0eSBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSgpIHsKLQkJaWYgKHRoaXMuZnFUYXJnZXRDbGFzc05hbWVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSgpOwotCQkJdGhpcy5mcVRhcmdldENsYXNzTmFtZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnRhcmdldENsYXNzID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZV8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3NOYW1lXygpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy50YXJnZXRDbGFzc0FkYXB0ZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKSk7Ci0JfQotCi0JLy8gKioqKiogZmV0Y2gKLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkgewotCQlyZXR1cm4gdGhpcy5mZXRjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGZXRjaChGZXRjaFR5cGUgZmV0Y2gpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZmV0Y2gsIGZldGNoKSkgewotCQkJdGhpcy5mZXRjaCA9IGZldGNoOwotCQkJdGhpcy5mZXRjaEFkYXB0ZXIuc2V0VmFsdWUoRmV0Y2hUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShmZXRjaCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNGZXRjaChGZXRjaFR5cGUgYXN0RmV0Y2gpIHsKLQkJRmV0Y2hUeXBlIG9sZCA9IHRoaXMuZmV0Y2g7Ci0JCXRoaXMuZmV0Y2ggPSBhc3RGZXRjaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKEZFVENIX1BST1BFUlRZLCBvbGQsIGFzdEZldGNoKTsKLQl9Ci0KLQlwcml2YXRlIEZldGNoVHlwZSBidWlsZEZldGNoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5mZXRjaEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShGRVRDSF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0gpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0Q2xhc3NBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRUYXJnZXRDbGFzc0FkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFyZ2V0Q2xhc3NBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQkvLyBUT0RPIHdoYXQgYWJvdXQgUXVhbGlmaWVkVHlwZT8KLQkJcmV0dXJuIGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUdlbmVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlR2VuZXJhdGVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjgxNzU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlR2VuZXJhdGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUdlbmVyYXRlZEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEdlbmVyYXRlZEFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgZmluYWwgVmVjdG9yPFN0cmluZz4gdmFsdWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IERBVEVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihEQVRFX0VMRU1FTlRfTkFNRSk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYXRlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBkYXRlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDT01NRU5UU19BREFQVEVSID0gYnVpbGRBZGFwdGVyKENPTU1FTlRTX0VMRU1FTlRfTkFNRSk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb21tZW50c0FkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tbWVudHM7Ci0KLQotCXB1YmxpYyBTb3VyY2VHZW5lcmF0ZWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoVkFMVUVfQURBUFRFUik7Ci0JCXRoaXMuZGF0ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihEQVRFX0FEQVBURVIpOwotCQl0aGlzLmNvbW1lbnRzQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKENPTU1FTlRTX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZVZhbHVlcyhhc3RSb290KTsKLQkJdGhpcy5kYXRlID0gdGhpcy5idWlsZERhdGUoYXN0Um9vdCk7Ci0JCXRoaXMuY29tbWVudHMgPSB0aGlzLmJ1aWxkQ29tbWVudHMoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlcyhhc3RSb290KTsKLQkJdGhpcy5zeW5jRGF0ZSh0aGlzLmJ1aWxkRGF0ZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0NvbW1lbnRzKHRoaXMuYnVpbGRDb21tZW50cyhhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCXRoaXMudmFsdWVzLmlzRW1wdHkoKSAmJgotCQkJCSh0aGlzLmRhdGUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5jb21tZW50cyA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEdlbmVyYXRlZEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWVzCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLnZhbHVlcyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRWYWx1ZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlcy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLmFkZFZhbHVlKHRoaXMudmFsdWVzLnNpemUoKSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZhbHVlKGludCBpbmRleCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWVzLmFkZChpbmRleCwgdmFsdWUpOwotCQl0aGlzLndyaXRlVmFsdWVzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVZhbHVlKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMudmFsdWVzLCB0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCQl0aGlzLndyaXRlVmFsdWVzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMudmFsdWVzLnJlbW92ZSh2YWx1ZSk7Ci0JCXRoaXMud3JpdGVWYWx1ZXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVWYWx1ZShpbnQgaW5kZXgpIHsKLQkJdGhpcy52YWx1ZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy53cml0ZVZhbHVlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVZhbHVlcygpIHsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodGhpcy52YWx1ZXMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMudmFsdWVzLnNpemUoKV0pKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmdbXSBhc3RWYWx1ZXMgPSB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhc3RWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRoaXMudmFsdWVzLmFkZChhc3RWYWx1ZXNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nW10gYXN0VmFsdWVzID0gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY2hyb25pemVMaXN0KEFycmF5cy5hc0xpc3QoYXN0VmFsdWVzKSwgdGhpcy52YWx1ZXMsIFZBTFVFU19MSVNUKTsKLQl9Ci0KLQkvLyAqKioqKiBkYXRlCi0JcHVibGljIFN0cmluZyBnZXREYXRlKCkgewotCQlyZXR1cm4gdGhpcy5kYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGUoU3RyaW5nIGRhdGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZGF0ZSwgZGF0ZSkpIHsKLQkJCXRoaXMuZGF0ZSA9IGRhdGU7Ci0JCQl0aGlzLmRhdGVBZGFwdGVyLnNldFZhbHVlKGRhdGUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN5bmNEYXRlKFN0cmluZyBhc3REYXRlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmRhdGU7Ci0JCXRoaXMuZGF0ZSA9IGFzdERhdGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChEQVRFX1BST1BFUlRZLCBvbGQsIGFzdERhdGUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGF0ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5kYXRlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBjb21tZW50cwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnRzKFN0cmluZyBjb21tZW50cykgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5jb21tZW50cywgY29tbWVudHMpKSB7Ci0JCQl0aGlzLmNvbW1lbnRzID0gY29tbWVudHM7Ci0JCQl0aGlzLmNvbW1lbnRzQWRhcHRlci5zZXRWYWx1ZShjb21tZW50cyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ29tbWVudHMoU3RyaW5nIGFzdENvbW1lbnRzKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbW1lbnRzOwotCQl0aGlzLmNvbW1lbnRzID0gYXN0Q29tbWVudHM7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT01NRU5UU19QUk9QRVJUWSwgb2xkLCBhc3RDb21tZW50cyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb21tZW50cyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jb21tZW50c0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRBcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIFZBTFVFX0VMRU1FTlRfTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlDbGFzczJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjdlYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlDbGFzczJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Q2xhc3MKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUlkQ2xhc3NBbm5vdGF0aW9uI2Z1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7Ci0JLy8gd2UgbmVlZCBhIGZsYWcgc2luY2UgdGhlIGYtcSBuYW1lIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBib29sZWFuIGZxQ2xhc3NOYW1lU3RhbGUgPSB0cnVlOwotCi0KLQlwdWJsaWMgU291cmNlTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNYXBLZXlDbGFzczJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5mcUNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCBhc3RWYWx1ZSkpIHsKLQkJCXRoaXMuc3luY1ZhbHVlXyhhc3RWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlXyhTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5mcUNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoVkFMVUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQlpZiAodGhpcy5mcUNsYXNzTmFtZVN0YWxlKSB7Ci0JCQl0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lID0gdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0JCQl0aGlzLmZxQ2xhc3NOYW1lU3RhbGUgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5mdWxseVF1YWxpZmllZENsYXNzTmFtZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gKHRoaXMudmFsdWUgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lXygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc05hbWVfKCkgewotCQlyZXR1cm4gQVNUVG9vbHMucmVzb2x2ZUZ1bGx5UXVhbGlmaWVkTmFtZSh0aGlzLnZhbHVlQWRhcHRlci5nZXRFeHByZXNzaW9uKHRoaXMuYnVpbGRBU1RSb290KCkpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBMl8wLk1BUF9LRVlfQ0xBU1NfX1ZBTFVFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTE0OTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlDb2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VDb21wbGV0ZUNvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VCYXNlQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX1RBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX1VOSVFVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX05VTExBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfQ09MVU1OX19JTlNFUlRBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9DT0xVTU5fX1VQREFUQUJMRTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTb3VyY2VDb21wbGV0ZUNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fTEVOR1RIOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWNpc2lvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfQ09MVU1OX19QUkVDSVNJT047Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NhbGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0NPTFVNTl9fU0NBTEU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmI4NWNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VCYXNlRW51bWVyYXRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlFbnVtZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQmFzZUVudW1lcmF0ZWRBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCi0KLQlwdWJsaWMgU291cmNlTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRF9fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzZhZDU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VCYXNlSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlKb2luQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gYnVpbGRTb3VyY2VNYXBLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBidWlsZFNvdXJjZU1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCAKLQkJCWludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGRNYXBLZXlKb2luQ29sdW1uRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBidWlsZE1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWFubm90YXRlZEVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBidWlsZE5lc3RlZFNvdXJjZU1hcEtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCAKLQkJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJCi0JCXJldHVybiBuZXcgU291cmNlTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24ocGFyZW50LCBlbGVtZW50LCBpZGFhKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgZGFhKSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBpZGFhLCBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBpZGFhKSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5fX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OX19UQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5fX1VOSVFVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTl9fTlVMTEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVwZGF0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5fX1VQREFUQUJMRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlQmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGJ1aWxkTWFwS2V5Sm9pbkNvbHVtbkFubm90YXRpb25BZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRNYXBLZXlKb2luQ29sdW1uRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IAotCQkJbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCUNPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJaW5kZXgsCi0JCQkJQU5OT1RBVElPTl9OQU1FKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MWY0MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VCYXNlVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleVRlbXBvcmFsCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VUZW1wb3JhbEFubm90YXRpb24KLQlpbXBsZW1lbnRzIE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUxfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwc0lkMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ODZiMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTWFwc0lkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYXBzSWQyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBNYXBzSWQyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0JCi0JCi0JcHVibGljIFNvdXJjZU1hcHNJZDJfMEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIE1hcHNJZDJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoVkFMVUVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBMl8wLk1BUFNfSURfX1ZBTFVFKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YzdjMWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeTJfMEFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeTwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgTmFtZWRRdWVyeTJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbG9ja01vZGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBsb2NrTW9kZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBMb2NrTW9kZVR5cGVfMl8wIGxvY2tNb2RlOwotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbiBidWlsZFNvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGROYW1lZFF1ZXJ5RGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBidWlsZE5hbWVkUXVlcnlBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWFubm90YXRlZEVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsCi0JCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5sb2NrTW9kZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRMb2NrTW9kZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLmxvY2tNb2RlQWRhcHRlciA9IHRoaXMuYnVpbGRMb2NrTW9kZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NrTW9kZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk5BTUVEX1FVRVJZX19MT0NLX01PREU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmxvY2tNb2RlID0gdGhpcy5idWlsZExvY2tNb2RlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0xvY2tNb2RlKHRoaXMuYnVpbGRMb2NrTW9kZShhc3RSb290KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBMb2NrTW9kZVR5cGVfMl8wIGdldExvY2tNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5sb2NrTW9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NrTW9kZShMb2NrTW9kZVR5cGVfMl8wIGxvY2tNb2RlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmxvY2tNb2RlLCBsb2NrTW9kZSkpIHsKLQkJCXRoaXMubG9ja01vZGUgPSBsb2NrTW9kZTsKLQkJCXRoaXMubG9ja01vZGVBZGFwdGVyLnNldFZhbHVlKExvY2tNb2RlVHlwZV8yXzAudG9KYXZhQW5ub3RhdGlvblZhbHVlKGxvY2tNb2RlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0xvY2tNb2RlKExvY2tNb2RlVHlwZV8yXzAgYXN0TG9ja01vZGUpIHsKLQkJTG9ja01vZGVUeXBlXzJfMCBvbGQgPSB0aGlzLmxvY2tNb2RlOwotCQl0aGlzLmxvY2tNb2RlID0gYXN0TG9ja01vZGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMT0NLX01PREVfUFJPUEVSVFksIG9sZCwgYXN0TG9ja01vZGUpOwotCX0KLQotCXByaXZhdGUgTG9ja01vZGVUeXBlXzJfMCBidWlsZExvY2tNb2RlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBMb2NrTW9kZVR5cGVfMl8wLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMubG9ja01vZGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldExvY2tNb2RlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5sb2NrTW9kZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbG9ja01vZGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMubG9ja01vZGVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTG9ja01vZGVEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuZGFhLCB0aGlzLmdldExvY2tNb2RlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZExvY2tNb2RlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmxvY2tNb2RlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmxvY2tNb2RlID09IG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPcmRlckNvbHVtbjJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzhmMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPcmRlckNvbHVtbjJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbnVsbGFibGVBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiBudWxsYWJsZTsKLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gaW5zZXJ0YWJsZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBpbnNlcnRhYmxlQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gaW5zZXJ0YWJsZTsKLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gdXBkYXRhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVwZGF0YWJsZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIHVwZGF0YWJsZTsKLQotCi0JcHVibGljIFNvdXJjZU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5udWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROdWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLm51bGxhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGROdWxsYWJsZUFkYXB0ZXIoKTsKLQkJdGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEluc2VydGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5pbnNlcnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRJbnNlcnRhYmxlQWRhcHRlcigpOwotCQl0aGlzLnVwZGF0YWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRVcGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy51cGRhdGFibGVBZGFwdGVyID0gdGhpcy5idWlsZFVwZGF0YWJsZUFkYXB0ZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLm51bGxhYmxlID0gdGhpcy5idWlsZE51bGxhYmxlKGFzdFJvb3QpOwotCQl0aGlzLmluc2VydGFibGUgPSB0aGlzLmJ1aWxkSW5zZXJ0YWJsZShhc3RSb290KTsKLQkJdGhpcy51cGRhdGFibGUgPSB0aGlzLmJ1aWxkVXBkYXRhYmxlKGFzdFJvb3QpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNOdWxsYWJsZSh0aGlzLmJ1aWxkTnVsbGFibGUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNJbnNlcnRhYmxlKHRoaXMuYnVpbGRJbnNlcnRhYmxlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jVXBkYXRhYmxlKHRoaXMuYnVpbGRVcGRhdGFibGUoYXN0Um9vdCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQTJfMC5PUkRFUl9DT0xVTU5fX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk9SREVSX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiogT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioKLQotCS8vICoqKioqIG51bGxhYmxlCi0JcHVibGljIEJvb2xlYW4gZ2V0TnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLm51bGxhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubnVsbGFibGUsIG51bGxhYmxlKSkgewotCQkJdGhpcy5udWxsYWJsZSA9IG51bGxhYmxlOwotCQkJdGhpcy5udWxsYWJsZUFkYXB0ZXIuc2V0VmFsdWUobnVsbGFibGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOdWxsYWJsZShCb29sZWFuIGFzdE51bGxhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5udWxsYWJsZTsKLQkJdGhpcy5udWxsYWJsZSA9IGFzdE51bGxhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTlVMTEFCTEVfUFJPUEVSVFksIG9sZCwgYXN0TnVsbGFibGUpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE51bGxhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm51bGxhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkTnVsbGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0TnVsbGFibGVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE51bGxhYmxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5udWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuT1JERVJfQ09MVU1OX19OVUxMQUJMRTsKLQl9Ci0KLQkvLyAqKioqKiBpbnNlcnRhYmxlCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW5zZXJ0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5pbnNlcnRhYmxlLCBpbnNlcnRhYmxlKSkgewotCQkJdGhpcy5pbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJCXRoaXMuaW5zZXJ0YWJsZUFkYXB0ZXIuc2V0VmFsdWUoaW5zZXJ0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0luc2VydGFibGUoQm9vbGVhbiBhc3RJbnNlcnRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5pbnNlcnRhYmxlOwotCQl0aGlzLmluc2VydGFibGUgPSBhc3RJbnNlcnRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSU5TRVJUQUJMRV9QUk9QRVJUWSwgb2xkLCBhc3RJbnNlcnRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRJbnNlcnRhYmxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmluc2VydGFibGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEluc2VydGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmluc2VydGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQkKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkSW5zZXJ0YWJsZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5nZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBMl8wLk9SREVSX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQl9Ci0KLQkvLyAqKioqKiB1cGRhdGFibGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudXBkYXRhYmxlLCB1cGRhdGFibGUpKSB7Ci0JCQl0aGlzLnVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJCXRoaXMudXBkYXRhYmxlQWRhcHRlci5zZXRWYWx1ZSh1cGRhdGFibGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNVcGRhdGFibGUoQm9vbGVhbiBhc3RVcGRhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnVwZGF0YWJsZTsKLQkJdGhpcy51cGRhdGFibGUgPSBhc3RVcGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUERBVEFCTEVfUFJPUEVSVFksIG9sZCwgYXN0VXBkYXRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRVcGRhdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudXBkYXRhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFVwZGF0YWJsZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5nZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFVwZGF0YWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMudXBkYXRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEyXzAuT1JERVJfQ09MVU1OX19VUERBVEFCTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLm51bGxhYmxlID09IG51bGwpICYmCi0JCQkJKHRoaXMuaW5zZXJ0YWJsZSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnVwZGF0YWJsZSA9PSBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzMjJiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiAgU291cmNlU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbgotCWltcGxlbWVudHMgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDQVRBTE9HX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBMl8wLlNFUVVFTkNFX0dFTkVSQVRPUl9fQ0FUQUxPRyk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBjYXRhbG9nOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU0NIRU1BX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBMl8wLlNFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQlwdWJsaWMgU291cmNlU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50KTsKLQkJdGhpcy5jYXRhbG9nQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKENBVEFMT0dfQURBUFRFUik7Ci0JCXRoaXMuc2NoZW1hQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFNDSEVNQV9BREFQVEVSKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuY2F0YWxvZyA9IHRoaXMuYnVpbGRDYXRhbG9nKGFzdFJvb3QpOwotCQl0aGlzLnNjaGVtYSA9IHRoaXMuYnVpbGRTY2hlbWEoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5zeW5jQ2F0YWxvZyh0aGlzLmJ1aWxkQ2F0YWxvZyhhc3RSb290KSk7Ci0JCXRoaXMuc3luY1NjaGVtYSh0aGlzLmJ1aWxkU2NoZW1hKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMuY2F0YWxvZyA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnNjaGVtYSA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuY2F0YWxvZywgY2F0YWxvZykpIHsKLQkJCXRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0JCQl0aGlzLmNhdGFsb2dBZGFwdGVyLnNldFZhbHVlKGNhdGFsb2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDYXRhbG9nKFN0cmluZyBhc3RDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZyA9IGFzdENhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRBTE9HX1BST1BFUlRZLCBvbGQsIGFzdENhdGFsb2cpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ2F0YWxvZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDQVRBTE9HX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKENBVEFMT0dfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHNjaGVtYSAqKioqKioqKioqCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5zY2hlbWEsIHNjaGVtYSkpIHsKLQkJCXRoaXMuc2NoZW1hID0gc2NoZW1hOwotCQkJdGhpcy5zY2hlbWFBZGFwdGVyLnNldFZhbHVlKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1NjaGVtYShTdHJpbmcgYXN0U2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNjaGVtYTsKLQkJdGhpcy5zY2hlbWEgPSBhc3RTY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTQ0hFTUFfUFJPUEVSVFksIG9sZCwgYXN0U2NoZW1hKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFNjaGVtYShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoU0NIRU1BX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNjaGVtYVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoU0NIRU1BX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVN0YXRpY01ldGFtb2RlbEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhMDE5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVN0YXRpY01ldGFtb2RlbEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlVHlwZVN0cmluZ0V4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlN0YXRpY01ldGFtb2RlbEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UubWV0YW1vZGVsLlN0YXRpY01ldGFtb2RlbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VJZENsYXNzQW5ub3RhdGlvbiNmdWxseVF1YWxpZmllZENsYXNzTmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOwotCS8vIHdlIG5lZWQgYSBmbGFnIHNpbmNlIHRoZSBmLXEgbmFtZSBjYW4gYmUgbnVsbAotCXByaXZhdGUgYm9vbGVhbiBmcUNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQotCi0JcHVibGljIFNvdXJjZVN0YXRpY01ldGFtb2RlbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFN0YXRpY01ldGFtb2RlbEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy5mcUNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCBhc3RWYWx1ZSkpIHsKLQkJCXRoaXMuc3luY1ZhbHVlXyhhc3RWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlXyhTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5mcUNsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCWlmICh0aGlzLmZxQ2xhc3NOYW1lU3RhbGUpIHsKLQkJCXRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKTsKLQkJCXRoaXMuZnFDbGFzc05hbWVTdGFsZSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiAodGhpcy52YWx1ZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRDbGFzc05hbWVfKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZV8oKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudmFsdWVBZGFwdGVyLmdldEV4cHJlc3Npb24odGhpcy5idWlsZEFTVFJvb3QoKSkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBMl8wLlNUQVRJQ19NRVRBTU9ERUxfX1ZBTFVFLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnByb3YvSnBhT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJwcm92L0pwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDE0YTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnByb3YvSnBhT3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJwcm92OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnByb3YuSnB0T3NnaUJ1bmRsZXNMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5saWJwcm92LkpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKcGFPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJZXh0ZW5kcyBKcHRPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJaW1wbGVtZW50cyBKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwcml2YXRlIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24ganBhUGxhdGZvcm07Ci0JCi0JCi0JcHVibGljIEpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JcHVibGljIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmpwYVBsYXRmb3JtOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRKcGFQbGF0Zm9ybShKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGpwYVBsYXRmb3JtKSB7Ci0JCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gb2xkID0gdGhpcy5qcGFQbGF0Zm9ybTsKLQkJdGhpcy5qcGFQbGF0Zm9ybSA9IGpwYVBsYXRmb3JtOwotCQlub3RpZnlMaXN0ZW5lcnMoUFJPUF9KUEFfUExBVEZPUk0sIG9sZCwganBhUGxhdGZvcm0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnByb3YvSnBhVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnByb3YvSnBhVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyODI4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJwcm92L0pwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJwcm92OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnByb3YuSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmxpYnByb3YuSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLQotcHVibGljIGNsYXNzIEpwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCWV4dGVuZHMgSnB0VXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcKLQkJaW1wbGVtZW50cyBKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQlwcml2YXRlIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24ganBhUGxhdGZvcm07Ci0JCi0JCi0JcHVibGljIEpwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybSgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm07Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEpwYVBsYXRmb3JtKEpwYVBsYXRmb3JtRGVzY3JpcHRpb24ganBhUGxhdGZvcm0pIHsKLQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBvbGQgPSB0aGlzLmpwYVBsYXRmb3JtOwotCQl0aGlzLmpwYVBsYXRmb3JtID0ganBhUGxhdGZvcm07Ci0JCW5vdGlmeUxpc3RlbmVycyhQUk9QX0pQQV9QTEFURk9STSwgb2xkLCBqcGFQbGF0Zm9ybSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9MZWdhY3lKcGFMaWJyYXJ5UHJvdmlkZXJEZXRlY3Rvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9MZWdhY3lKcGFMaWJyYXJ5UHJvdmlkZXJEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdjMWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnByb3YvTGVnYWN5SnBhTGlicmFyeVByb3ZpZGVyRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJwcm92OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSUxpYnJhcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxlZ2FjeUxpYnJhcnlQcm92aWRlckRldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci0KLXB1YmxpYyBjbGFzcyBMZWdhY3lKcGFMaWJyYXJ5UHJvdmlkZXJEZXRlY3RvcgotCWV4dGVuZHMgTGVnYWN5TGlicmFyeVByb3ZpZGVyRGV0ZWN0b3IKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfSlBBX0xJQlJBUllfUFJPVklERVJfSUQKLQkJPSAianBhLWxlZ2FjeS1saWJyYXJ5LXByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJTGlicmFyeVByb3ZpZGVyIGRldGVjdCgKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9qZWN0RmFjZXQgZmFjZXQpIHsKLQkJaWYgKGZhY2V0LmVxdWFscyhKcGFGYWNldC5GQUNFVCkpIHsKLQkJCXJldHVybiBMaWJyYXJ5UHJvdmlkZXJGcmFtZXdvcmsuZ2V0UHJvdmlkZXIoTEVHQUNZX0pQQV9MSUJSQVJZX1BST1ZJREVSX0lEKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJwcm92L0xlZ2FjeUpwYUxpYnJhcnlQcm92aWRlclVuaW5zdGFsbE9wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvbGlicHJvdi9MZWdhY3lKcGFMaWJyYXJ5UHJvdmlkZXJVbmluc3RhbGxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2YzY3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJwcm92L0xlZ2FjeUpwYUxpYnJhcnlQcm92aWRlclVuaW5zdGFsbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlQcm92aWRlck9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZzsKLQotcHVibGljIGNsYXNzIExlZ2FjeUpwYUxpYnJhcnlQcm92aWRlclVuaW5zdGFsbE9wZXJhdGlvbgotCWV4dGVuZHMgTGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uCi17Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgKLQkJCUxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZyBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgCi0JCQl0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIG5vIG9wIC0gbm90aGluZyB0byB1bmluc3RhbGwKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJ2YWwvQWJzdHJhY3RPc2dpQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnZhbC9BYnN0cmFjdE9zZ2lCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWU3YmYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnZhbC9BYnN0cmFjdE9zZ2lCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJ2YWwuTGlicmFyeVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJwcm92LkpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92Lm9zZ2kuQnVuZGxlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPc2dpQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IKLQkJaW1wbGVtZW50cyBMaWJyYXJ5VmFsaWRhdG9yIHsKLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZSgKLQkJCUpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjb25maWcsIAotCQkJTWFwPFN0cmluZywgVmVyc2lvblJhbmdlW10+IGJ1bmRsZVZlcnNpb25SYW5nZXMpIHsKLQkJCi0JCU1hcDxTdHJpbmcsIEJ1bmRsZT4gYnVuZGxlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQnVuZGxlPigpOwotCQkKLQkJZm9yIChCdW5kbGVSZWZlcmVuY2UgYnVuZGxlUmVmIDogY29uZmlnLmdldEJ1bmRsZVJlZmVyZW5jZXMoKSkgewotCQkJZm9yIChTdHJpbmcgYnVuZGxlTmFtZSA6IGJ1bmRsZVZlcnNpb25SYW5nZXMua2V5U2V0KCkpIHsKLQkJCQkvLyBpZiB3ZSd2ZSBnb3R0ZW4gaGVyZSwgdGhlIGJ1bmRsZSByZWZlcmVuY2VzIGFyZSByZXNvbHZhYmxlCi0JCQkJaWYgKGJ1bmRsZVJlZi5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoYnVuZGxlTmFtZSkpIHsKLQkJCQkJYnVuZGxlcy5wdXQoYnVuZGxlTmFtZSwgYnVuZGxlUmVmLmdldEJ1bmRsZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoU3RyaW5nIGJ1bmRsZU5hbWUgOiBidW5kbGVWZXJzaW9uUmFuZ2VzLmtleVNldCgpKSB7Ci0JCQlpZiAoYnVuZGxlcy5nZXQoYnVuZGxlTmFtZSkgPT0gbnVsbCkgewotCQkJCVN0cmluZyBtZXNzYWdlIAotCQkJCQkJPSBOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuT1NHSV9CVU5ETEVTX0xJQlJBUllfVkFMSURBVE9SX19CVU5ETEVfTk9UX0ZPVU5ELCBidW5kbGVOYW1lKTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWZvciAoU3RyaW5nIGJ1bmRsZU5hbWUgOiBidW5kbGVWZXJzaW9uUmFuZ2VzLmtleVNldCgpKSB7Ci0JCQlCdW5kbGUgYnVuZGxlID0gYnVuZGxlcy5nZXQoYnVuZGxlTmFtZSk7Ci0JCQlmb3IgKFZlcnNpb25SYW5nZSB2ZXJzaW9uUmFuZ2UgOiBidW5kbGVWZXJzaW9uUmFuZ2VzLmdldChidW5kbGVOYW1lKSkgewotCQkJCWlmICghIHZlcnNpb25SYW5nZS5pc0luY2x1ZGVkKGJ1bmRsZS5nZXRWZXJzaW9uKCkpKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlIAotCQkJCQkJCT0gTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLk9TR0lfQlVORExFU19MSUJSQVJZX1ZBTElEQVRPUl9fSU1QUk9QRVJfQlVORExFX1ZFUlNJT04sIGJ1bmRsZU5hbWUpOwotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJ2YWwvR2VuZXJpY0VjbGlwc2VMaW5rQnVuZGxlc0xpYnJhcnlWYWxpZGF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2U4MDEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL2xpYnZhbC9HZW5lcmljRWNsaXBzZUxpbmtCdW5kbGVzTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwubGlidmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwubGlicHJvdi5KcGFPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNFY2xpcHNlTGlua0J1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yIAotCQlleHRlbmRzIEFic3RyYWN0T3NnaUJ1bmRsZXNMaWJyYXJ5VmFsaWRhdG9yIHsKLQkKLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGNvbmZpZykgewotCQlKcGFPc2dpQnVuZGxlc0xpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcganBhQ29uZmlnIAotCQkJCT0gKEpwYU9zZ2lCdW5kbGVzTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlNYXA8U3RyaW5nLCBWZXJzaW9uUmFuZ2VbXT4gYnVuZGxlVmVyc2lvblJhbmdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmVyc2lvblJhbmdlW10+KCk7Ci0JCVN0cmluZyBidW5kbGVOYW1lID0gImphdmF4LnBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCQlWZXJzaW9uUmFuZ2VbXSB2ZXJzaW9uUmFuZ2VzID0gbmV3IFZlcnNpb25SYW5nZVswXTsKLQkJaWYgKGNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZXF1YWxzKEpwYUZhY2V0LlZFUlNJT05fMV8wKSkgewotCQkJdmVyc2lvblJhbmdlcyA9IG5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMy4wKSIpfTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuZXF1YWxzKEpwYUZhY2V0LlZFUlNJT05fMl8wKSkgewotCQkJdmVyc2lvblJhbmdlcyA9IG5ldyBWZXJzaW9uUmFuZ2VbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzIuMCwgMy4wKSIpfTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ1bmRsZVZlcnNpb25SYW5nZXMucHV0KGJ1bmRsZU5hbWUsIHZlcnNpb25SYW5nZXMpOwotCQlyZXR1cm4gdmFsaWRhdGUoanBhQ29uZmlnLCBidW5kbGVWZXJzaW9uUmFuZ2VzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJ2YWwvR2VuZXJpY0pwYVVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9saWJ2YWwvR2VuZXJpY0pwYVVzZXJMaWJyYXJ5VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjN2M5ZGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvbGlidmFsL0dlbmVyaWNKcGFVc2VyTGlicmFyeVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5saWJ2YWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLmxpYnZhbC5MaWJWYWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5saWJwcm92LkpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmxpYnZhbC5MaWJyYXJ5VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmxpYnByb3YuSnBhVXNlckxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhVXNlckxpYnJhcnlWYWxpZGF0b3IKLQlpbXBsZW1lbnRzIExpYnJhcnlWYWxpZGF0b3IgewotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKEpwdExpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcgY29uZmlnKSB7Ci0JCUpwYVVzZXJMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpwYUNvbmZpZyAKLQkJCQk9IChKcGFVc2VyTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQlTZXQ8U3RyaW5nPiBjbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQljbGFzc05hbWVzLmFkZCgiamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbmZpZy5nZXRQcm9qZWN0RmFjZXRWZXJzaW9uKCkuY29tcGFyZVRvKEpwYUZhY2V0LlZFUlNJT05fMl8wKSA+PSAwKSB7Ci0JCQljbGFzc05hbWVzLmFkZCgiamF2YXgucGVyc2lzdGVuY2UuRWxlbWVudENvbGxlY3Rpb24iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlJdGVyYWJsZTxJUGF0aD4gbGlicmFyeVBhdGhzID0gCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJQ2xhc3NwYXRoRW50cnksIElQYXRoPihqcGFDb25maWcucmVzb2x2ZSgpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIElQYXRoIHRyYW5zZm9ybShJQ2xhc3NwYXRoRW50cnkgbykgewotCQkJCQlyZXR1cm4gby5nZXRQYXRoKCk7Ci0JCQkJfQotCQkJfTsKLQkJCi0JCXJldHVybiBMaWJWYWxVdGlsLnZhbGlkYXRlKGxpYnJhcnlQYXRocywgY2xhc3NOYW1lcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFiMGExNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuQWJzdHJhY3RKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuUmVzb3VyY2VMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFZFUlNJT04pOwotCQlyZXR1cm4gcHJvcGVydHlOYW1lczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhWRVJTSU9OKSkgewotCQkJcmV0dXJuIGdldERlZmF1bHRWZXJzaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERlZmF1bHRWZXJzaW9uKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRBSU5FUl9QQVRIKQotCQkJCXx8IHByb3BlcnR5TmFtZS5lcXVhbHMoVkVSU0lPTikpIHsKLQkJCXN0YXR1cyA9IHZhbGlkYXRlVmVyc2lvbigpOwotCQl9Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlQ29udGFpbmVyUGF0aEFuZEZpbGVOYW1lKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnZhbGlkYXRlQ29udGFpbmVyUGF0aEFuZEZpbGVOYW1lKCk7Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoY29udGFpbmVyKTsKLQkJaWYgKCEgSnBhRmFjZXQuaXNJbnN0YWxsZWQocHJvamVjdCkpIHsKLQkJCS8vIHZlcmlmaWVzIHByb2plY3QgaGFzIGpwYSBmYWNldAotCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJSVN0YXR1cy5FUlJPUiwgSnB0SnBhQ29yZVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9QUk9KRUNUX05PVF9KUEEpOwotCQl9Ci0JCWlmICghIGhhc1N1cHBvcnRlZFBsYXRmb3JtKHByb2plY3QpKSB7Ci0JCQkvLyB2ZXJpZmllcyBwcm9qZWN0IGhhcyBwbGF0Zm9ybSB0aGF0IHN1cHBvcnRzIHRoaXMgZmlsZSB0eXBlCi0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUFJPSkVDVF9JTVBST1BFUl9QTEFURk9STSk7Ci0JCX0KLQkJUmVzb3VyY2VMb2NhdG9yIHJlc291cmNlTG9jYXRvciA9IEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpOwotCQlpZiAocmVzb3VyY2VMb2NhdG9yICE9IG51bGwgLyogc2hvdWxkIG5ldmVyIGJlIG51bGwsIGJ1dCB0aGVyZSBtaWdodCBiZSBjcmF6eSBjaXJjdW1zdGFuY2VzICovCi0JCQkJJiYgISByZXNvdXJjZUxvY2F0b3IuYWNjZXB0UmVzb3VyY2VMb2NhdGlvbihwcm9qZWN0LCBjb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQlJU3RhdHVzLldBUk5JTkcsIEpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCUpwdENvcmVNZXNzYWdlcy5WQUxJREFURV9DT05UQUlORVJfUVVFU1RJT05BQkxFKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVWZXJzaW9uKCkgewotCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCVN0cmluZyBmaWxlVmVyc2lvbiA9IGdldFN0cmluZ1Byb3BlcnR5KFZFUlNJT04pOwotCQlpZiAoISBmaWxlVmVyc2lvblN1cHBvcnRlZChmaWxlVmVyc2lvbikpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0ZJTEVfVkVSU0lPTl9OT1RfU1VQUE9SVEVEKTsKLQkJfQotCQl0cnkgewotCQkJU3RyaW5nIGpwYUZhY2V0VmVyc2lvbiA9IGdldEpwYUZhY2V0VmVyc2lvbihnZXRQcm9qZWN0KCkpOwotCQkJaWYgKCEgZmlsZVZlcnNpb25TdXBwb3J0ZWRGb3JGYWNldFZlcnNpb24oZmlsZVZlcnNpb24sIGpwYUZhY2V0VmVyc2lvbikpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cygKLQkJCQkJCUlTdGF0dXMuRVJST1IsIEpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQkJSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0ZJTEVfVkVSU0lPTl9OT1RfU1VQUE9SVEVEX0ZPUl9GQUNFVF9WRVJTSU9OKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJLy8gcHJvamVjdCBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkYXRlZCBhbHJlYWR5LCBzbyBhc3N1bWUgdGhhdCB0aGlzIHdpbGwgbmV2ZXIgZ2V0IGhpdAotCQkJLy8gZmFsbCB0aHJvdWdoIHRvIGZpbmFsIHJldHVybgotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBmaWxlVmVyc2lvblN1cHBvcnRlZChTdHJpbmcgZmlsZVZlcnNpb24pOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGZpbGVWZXJzaW9uU3VwcG9ydGVkRm9yRmFjZXRWZXJzaW9uKFN0cmluZyBmaWxlVmVyc2lvbiwgU3RyaW5nIGpwYUZhY2V0VmVyc2lvbik7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBoZWxwZXIgbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRKcGFQcm9qZWN0KGdldFByb2plY3QoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gKHByb2plY3QgPT0gbnVsbCkgPyBudWxsIDogSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYUZhY2V0VmVyc2lvbihJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlGYWNldGVkUHJvamVjdCBmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJcmV0dXJuIGZwcm9qLmdldFByb2plY3RGYWNldFZlcnNpb24oSnBhRmFjZXQuRkFDRVQpLmdldFZlcnNpb25TdHJpbmcoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzU3VwcG9ydGVkUGxhdGZvcm0oSVByb2plY3QgcHJvamVjdCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCXJldHVybiAoanBhUHJvamVjdCAhPSBudWxsKSAmJiBpc1N1cHBvcnRlZFBsYXRmb3JtSWQoanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZFBsYXRmb3JtSWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIFN0cmluZyBpZCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnBhRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0Fic3RyYWN0SnBhRmlsZUNyZWF0aW9uT3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2M5NDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9BYnN0cmFjdEpwYUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLkFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhRmlsZUNyZWF0aW9uT3BlcmF0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbgotewotCS8qKgotCSAqIFdpbGwgYmUgbnVsbCB1bnRpbCBjb250YWluZXIgaXMgY3JlYXRlZCBvciB2ZXJpZmllZCB0byBleGlzdAotCSAqLwotCXByb3RlY3RlZCBJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQkKLQkvKioKLQkgKiBXaWxsIGJlIG51bGwgdW50aWwgZmlsZSBpcyBjcmVhdGVkIG9yIHZlcmlmaWVkIHRvIGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIElGaWxlIGZpbGU7Ci0JCi0JCi0JcHJvdGVjdGVkIEFic3RyYWN0SnBhRmlsZUNyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDUpOwotCQkvLyBDcmVhdGUgZm9sZGVyIGlmIGl0IGRvZXMgbm90IGV4aXN0Ci0JCWNyZWF0ZUNvbnRhaW5lcihzbS5uZXdDaGlsZCgxKSk7Ci0JCS8vIENyZWF0ZSBmaWxlCi0JCWNyZWF0ZUZpbGUoc20ubmV3Q2hpbGQoNCkpOwotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgSUNvbnRhaW5lciBnZXRDb250YWluZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSVBhdGggY29udGFpbmVyUGF0aCA9IChJUGF0aCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoQ09OVEFJTkVSX1BBVEgpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGFpbmVyKGNvbnRhaW5lclBhdGgpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIk5vIGNvbnRhaW5lciBwYXRoIHNwZWNpZmllZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIElQcm9qZWN0IGdldFByb2plY3QoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbnRhaW5lcigpLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oIlByb2plY3QgZG9lcyBub3QgaGF2ZSBKUEEgZmFjZXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBqcGFQcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSB0aGUgY29udGFpbmVyIGFzIHNwZWNpZmllZCBpbiB0aGUgZGF0YSBtb2RlbCBpZiBpdCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250YWluZXIoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBnZXRDb250YWluZXIoKTsKLQkJaWYgKCEgY29udGFpbmVyLmV4aXN0cygpKSB7Ci0JCQlpZiAoY29udGFpbmVyLmdldFR5cGUoKSA9PSBJQ29udGFpbmVyLlBST0pFQ1QpIHsKLQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJQcm9qZWN0IGRvZXMgbm90IGV4aXN0Iik7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250YWluZXIuZ2V0VHlwZSgpID09IElDb250YWluZXIuRk9MREVSKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJKChJRm9sZGVyKSBjb250YWluZXIpLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKCJDb3VsZCBub3QgY3JlYXRlIGZvbGRlciIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiQ29udGFpbmVyIGlzIG5vdCBhIHByb2plY3Qgb3IgZm9sZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQl0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRmlsZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShGSUxFX05BTUUpOwotCQlJRmlsZSBuZXdGaWxlID0gdGhpcy5jb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotCQlBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIgcmVzb3VyY2VQcm92aWRlciA9IGdldFhtbFJlc291cmNlUHJvdmlkZXIobmV3RmlsZSk7Ci0JCXRyeSB7Ci0JCQlyZXNvdXJjZVByb3ZpZGVyLmNyZWF0ZUZpbGVBbmRSZXNvdXJjZShnZXREYXRhTW9kZWwoKSwgbW9uaXRvcik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiQ291bGQgbm90IGNyZWF0ZSBmaWxlIiwgZSk7Ci0JCX0KLQkJdGhpcy5maWxlID0gbmV3RmlsZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZSgpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmdldFByb2plY3QoKTsKLQkJfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9KcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMyMTUwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL0pwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLQotcHVibGljIGludGVyZmFjZSBKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotewotCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUge0BsaW5rIFN0cmluZ30sIGlkZW50aWZpZXMgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgdG8gY3JlYXRlCi0JICovCi0JU3RyaW5nIFZFUlNJT04gPSAiSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY3YmI3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLQlleHRlbmRzIEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQkvKioKLQkgKiBPcHRpb25hbCwgdHlwZSBBY2Nlc3NUeXBlLCBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgYWNjZXNzIHR5cGUgKG9yIG51bGwpCi0JICovCi0JU3RyaW5nIERFRkFVTFRfQUNDRVNTID0gIk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuREVGQVVMVF9BQ0NFU1MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmVxdWlyZWQsIHR5cGUgQm9vbGVhbiwgc3BlY2lmaWVzIHdoZXRoZXIgdG8gYWRkIGEgcmVmZXJlbmNlIHRvIHRoZSBmaWxlCi0JICogaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkgKi8KLQlTdHJpbmcgQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQgPSAiT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBPcHRpb25hbCAodW5sZXNzIEFERF9UT19QRVJTSVNURU5DRV9VTklUIHByb3BlcnR5IGlzIHRydWUpLCB0eXBlIFN0cmluZywgCi0JICogaWRlbnRpZmllcyB0aGUgcGVyc2lzdGVuY2UgdW5pdCB0byB3aGljaCB0byBhZGQgYSByZWZlcmVuY2UgdG8gdGhlIGZpbGUKLQkgKi8KLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVCA9ICJPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBFUlNJU1RFTkNFX1VOSVQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2Q0OTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkNvbXBvc2l0ZUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwdENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCWltcGxlbWVudHMgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotewotCS8qKgotCSAqIHJlcXVpcmVkIGRlZmF1bHQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7Ci0JCVNldDxTdHJpbmc+IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKERFRkFVTFRfQUNDRVNTKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQRVJTSVNURU5DRV9VTklUKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXJldHVybiBnZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQpOwotCQl9Ci0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERFRkFVTFRfQUNDRVNTKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCVBlcnNpc3RlbmNlVW5pdCBwVW5pdCA9IGdldERlZmF1bHRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCWlmIChwVW5pdCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHBVbml0LmdldE5hbWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0RGVmYXVsdFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEZpbGVOYW1lKCkgewotCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZlcnNpb24oKSB7Ci0JCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSnBhUGxhdGZvcm0ganBhUGxhdGZvcm07Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldEpwYVByb2plY3QoKTsKLQkJanBhUGxhdGZvcm0gPSAoanBhUHJvamVjdCA9PSBudWxsKSAKLQkJCQk/IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuYnVpbGRKcGFQbGF0Zm9ybUltcGxlbWVudGF0aW9uKGdldFByb2plY3QoKSkgCi0JCQkJOiBqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCk7Ci0JCXJldHVybiBqcGFQbGF0Zm9ybS5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpLmdldFZlcnNpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBnZXREZWZhdWx0UGVyc2lzdGVuY2VVbml0KCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENPTlRBSU5FUl9QQVRIKSkgewotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQRVJTSVNURU5DRV9VTklULCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoUEVSU0lTVEVOQ0VfVU5JVCwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEFERF9UT19QRVJTSVNURU5DRV9VTklUKSkgewotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShQRVJTSVNURU5DRV9VTklULCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQl9Ci0JCXJldHVybiBvazsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKERFRkFVTFRfQUNDRVNTKSkgewotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gYWNjZXNzVHlwZXMgPSBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzNdOwotCQkJYWNjZXNzVHlwZXNbMF0gPSBhY2Nlc3NQcm9wZXJ0eURlc2NyaXB0b3IobnVsbCk7Ci0JCQlhY2Nlc3NUeXBlc1sxXSA9IGFjY2Vzc1Byb3BlcnR5RGVzY3JpcHRvcihBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJCWFjY2Vzc1R5cGVzWzJdID0gYWNjZXNzUHJvcGVydHlEZXNjcmlwdG9yKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQkJcmV0dXJuIGFjY2Vzc1R5cGVzOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAotCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yPihuZXcgQ29tcG9zaXRlSXRlcmFibGU8U3RyaW5nPihudWxsLCBnZXRQZXJzaXN0ZW5jZVVuaXROYW1lcygpKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eURlc2NyaXB0b3IobmV4dCk7Ci0JCQkJCX0KLQkJCQl9LAotCQkJCW5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3JbMF0pOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX0FDQ0VTUykpIHsKLQkJCXJldHVybiBhY2Nlc3NQcm9wZXJ0eURlc2NyaXB0b3IoKFN0cmluZykgZ2V0UHJvcGVydHkoREVGQVVMVF9BQ0NFU1MpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQRVJTSVNURU5DRV9VTklUKSkgewotCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdFByb3BlcnR5RGVzY3JpcHRvcihnZXRTdHJpbmdQcm9wZXJ0eShQRVJTSVNURU5DRV9VTklUKSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5RGVzY3JpcHRvcihwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yIGFjY2Vzc1Byb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYWNjZXNzVHlwZSkgewotCQlpZiAoYWNjZXNzVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihudWxsLCBKcHRDb3JlTWVzc2FnZXMuTk9ORSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBEYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3IoYWNjZXNzVHlwZSk7Ci0JfQotCQotCURhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvciBwZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHBlcnNpc3RlbmNlVW5pdE5hbWUpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocGVyc2lzdGVuY2VVbml0TmFtZSkpIHsKLQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKG51bGwsIEpwdENvcmVNZXNzYWdlcy5OT05FKTsKLQkJfQotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcihwZXJzaXN0ZW5jZVVuaXROYW1lKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCkKLQkJCQl8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBFUlNJU1RFTkNFX1VOSVQpKSB7Ci0JCQlzdGF0dXMgPSB2YWxpZGF0ZVBlcnNpc3RlbmNlVW5pdCgpOwotCQl9Ci0JCWlmICghIHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQkJCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlVmVyc2lvblN1cHBvcnRlZChTdHJpbmcgZmlsZVZlcnNpb24pIHsKLQkJcmV0dXJuIChmaWxlVmVyc2lvbi5lcXVhbHMoSlBBLlNDSEVNQV9WRVJTSU9OKQotCQkJCXx8IGZpbGVWZXJzaW9uLmVxdWFscyhKUEEyXzAuU0NIRU1BX1ZFUlNJT04pKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZVZlcnNpb25TdXBwb3J0ZWRGb3JGYWNldFZlcnNpb24oU3RyaW5nIGZpbGVWZXJzaW9uLCBTdHJpbmcganBhRmFjZXRWZXJzaW9uKSB7Ci0JCWlmIChqcGFGYWNldFZlcnNpb24uZXF1YWxzKEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKSkKLQkJCQkmJiBmaWxlVmVyc2lvbi5lcXVhbHMoSlBBMl8wLlNDSEVNQV9WRVJTSU9OKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJYm9vbGVhbiBhZGRUb1BVbml0ID0gZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19QRVJTSVNURU5DRV9VTklUKTsKLQkJU3RyaW5nIHByb2plY3ROYW1lID0gZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHBVbml0TmFtZSA9IGdldFN0cmluZ1Byb3BlcnR5KFBFUlNJU1RFTkNFX1VOSVQpOwotCQlpZiAoYWRkVG9QVW5pdCkgewotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkocFVuaXROYW1lKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJTkxTLmJpbmQoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX1BFUlNJU1RFTkNFX1VOSVRfRE9FU19OT1RfU1BFQ0lGSUVELCBwVW5pdE5hbWUpKTsKLQkJCX0KLQkJCWlmIChnZXRQZXJzaXN0ZW5jZVVuaXQoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lELAotCQkJCQlOTFMuYmluZChKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfUEVSU0lTVEVOQ0VfVU5JVF9OT1RfSU5fUFJPSkVDVCwgcFVuaXROYW1lLCBwcm9qZWN0TmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGhlbHBlciBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCVN0cmluZyBwVW5pdE5hbWUgPSBnZXRTdHJpbmdQcm9wZXJ0eShQRVJTSVNURU5DRV9VTklUKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gCi0JCQkoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShwVW5pdE5hbWUpKSA/IG51bGwgOiBnZXRKcGFQcm9qZWN0KCk7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0gCi0JCQkoanBhUHJvamVjdCA9PSBudWxsKSA/IG51bGwgOiBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gCi0JCQkocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgPyBudWxsIDogcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHBlcnNpc3RlbmNlICE9IG51bGwpIHsKLQkJCWZvciAoUGVyc2lzdGVuY2VVbml0IG5leHQgOiBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkpIHsKLQkJCQlpZiAocFVuaXROYW1lLmVxdWFscyhuZXh0LmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIG5leHQ7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSXRlcmFibGU8UGVyc2lzdGVuY2VVbml0PiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCkgewotCQkvL29ubHkgZ2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0cyBmb3IgdGhlIHNlbGVjdGVkIEpwYVByb2plY3QsIAotCQkvL2lmIG5vIGpwYSBwcm9qZWN0IGlzIHNlbGVjdGVkLCB0aGVuIG5vIHBlcnNpc3RlbmNlIHVuaXRzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBjb21ibwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0gKGpwYVByb2plY3QgPT0gbnVsbCkgPyBudWxsIDoganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSA/IG51bGwgOiBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlyZXR1cm4gKHBlcnNpc3RlbmNlID09IG51bGwpID8gRW1wdHlJdGVyYWJsZS48UGVyc2lzdGVuY2VVbml0Pmluc3RhbmNlKCkgOiBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFBlcnNpc3RlbmNlVW5pdE5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGdldFBlcnNpc3RlbmNlVW5pdHMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXQgbmV4dCkgewotCQkJCXJldHVybiBuZXh0LmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9Pcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlYWY1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLm9ybS5Pcm1YbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBPcm1GaWxlQ3JlYXRpb25PcGVyYXRpb24KLQlleHRlbmRzIEFic3RyYWN0SnBhRmlsZUNyZWF0aW9uT3BlcmF0aW9uCi0JaW1wbGVtZW50cyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JcHVibGljIE9ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSUFkYXB0YWJsZSBpbmZvKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCA1KTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci5leGVjdXRlKHNtLm5ld0NoaWxkKDQpLCBpbmZvKTsKLQkJCi0JCWlmIChzdGF0dXMuaXNPSygpKSB7Ci0JCQlhZGRNYXBwaW5nRmlsZVRvUGVyc2lzdGVuY2VYbWwoKTsKLQkJCXNtLndvcmtlZCgxKTsKLQkJfQotCQkKLQkJcmV0dXJuIE9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHBVbml0TmFtZSA9IGdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KFBFUlNJU1RFTkNFX1VOSVQpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4ZWN1dGlvbkV4Y2VwdGlvbigiUHJvamVjdCBkb2VzIG5vdCBoYXZlIGEgcGVyc2lzdGVuY2UueG1sIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oInBlcnNpc3RlbmNlLnhtbCBkb2VzIG5vdCBoYXZlIGEgcGVyc2lzdGVuY2Ugbm9kZS4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZvciAoUGVyc2lzdGVuY2VVbml0IHBVbml0IDogcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpKSB7Ci0JCQlpZiAocFVuaXROYW1lLmVxdWFscyhwVW5pdC5nZXROYW1lKCkpKSB7Ci0JCQkJcmV0dXJuIHBVbml0OwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBFeGVjdXRpb25FeGNlcHRpb24oInBlcnNpc3RlbmNlLnhtbCBkb2VzIG5vdCBoYXZlIHBlcnNpc3RlbmNlIHVuaXQgbmFtZWQgXCciICsgcFVuaXROYW1lICsgIlwnIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZ0ZpbGVUb1BlcnNpc3RlbmNlWG1sKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWlmICghIGdldERhdGFNb2RlbCgpLmdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy5maWxlLmdldFByb2plY3QoKSk7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCi0JCWZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJcmVzb3VyY2UubW9kaWZ5KG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJUGF0aCBjb250YWluZXJQYXRoID0gKElQYXRoKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCk7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoRklMRV9OQU1FKTsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGFpbmVyKGNvbnRhaW5lclBhdGgpOwotCQkJCUlQYXRoIGZpbGVQYXRoID0gY29udGFpbmVyLmdldEZ1bGxQYXRoKCkuYXBwZW5kKGZpbGVOYW1lKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gY29udGFpbmVyLmdldFByb2plY3QoKTsKLQkJCQlJUGF0aCBydW50aW1lUGF0aCA9IEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpLmdldFJ1bnRpbWVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTsKLQkJCQlmb3IgKE1hcHBpbmdGaWxlUmVmIHJlZiA6IHBVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQkJCWlmIChydW50aW1lUGF0aC5lcXVhbHMocmVmLmdldEZpbGVOYW1lKCkpKSB7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcFVuaXQuYWRkU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWYocnVudGltZVBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gT3JtWG1sUmVzb3VyY2VQcm92aWRlci5nZXRYbWxSZXNvdXJjZVByb3ZpZGVyKGZpbGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9vcGVyYXRpb25zL1BlcnNpc3RlbmNlRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjc0ZTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLQlleHRlbmRzIEpwYUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNmY5NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcgotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JLyoqCi0JICogcmVxdWlyZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSURhdGFNb2RlbE9wZXJhdGlvbiBnZXREZWZhdWx0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uT3BlcmF0aW9uKGdldERhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfUEVSU0lTVEVOQ0VfWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWZXJzaW9uKCkgewotCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRKcGFQcm9qZWN0KCk7Ci0JCWpwYVBsYXRmb3JtID0gKGpwYVByb2plY3QgPT0gbnVsbCkgCi0JCQkJPyBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmJ1aWxkSnBhUGxhdGZvcm1JbXBsZW1lbnRhdGlvbihnZXRQcm9qZWN0KCkpIAotCQkJCToganBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpOwotCQlyZXR1cm4ganBhUGxhdGZvcm0uZ2V0TW9zdFJlY2VudFN1cHBvcnRlZFJlc291cmNlVHlwZShKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUpLmdldFZlcnNpb24oKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGZpbGVWZXJzaW9uU3VwcG9ydGVkKFN0cmluZyBmaWxlVmVyc2lvbikgewotCQlyZXR1cm4gKGZpbGVWZXJzaW9uLmVxdWFscyhKUEEuU0NIRU1BX1ZFUlNJT04pCi0JCQkJfHwgZmlsZVZlcnNpb24uZXF1YWxzKEpQQTJfMC5TQ0hFTUFfVkVSU0lPTikpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlVmVyc2lvblN1cHBvcnRlZEZvckZhY2V0VmVyc2lvbihTdHJpbmcgZmlsZVZlcnNpb24sIFN0cmluZyBqcGFGYWNldFZlcnNpb24pIHsKLQkJaWYgKGpwYUZhY2V0VmVyc2lvbi5lcXVhbHMoSnBhRmFjZXQuVkVSU0lPTl8xXzAuZ2V0VmVyc2lvblN0cmluZygpKQotCQkJCSYmIGZpbGVWZXJzaW9uLmVxdWFscyhKUEEyXzAuU0NIRU1BX1ZFUlNJT04pKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvb3BlcmF0aW9ucy9QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTZiMDQ1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL29wZXJhdGlvbnMvUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25PcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sUmVzb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uT3BlcmF0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEpwYUZpbGVDcmVhdGlvbk9wZXJhdGlvbgotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uT3BlcmF0aW9uKElEYXRhTW9kZWwgZGF0YU1vZGVsKSB7Ci0JCXN1cGVyKGRhdGFNb2RlbCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIgZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIuZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihmaWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI0ZjYyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuWFBvaW50VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbAotCQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gewotCQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpbklkOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWU7Ci0JcHJpdmF0ZSBJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb247Ci0JcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRfID0gZmFsc2U7Ci0JcHJpdmF0ZSBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsIGdyb3VwOwotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiB0aGlzLmlkOwotCX0KLQkKLQl2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQl0aGlzLmlkID0gaWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCXJldHVybiB0aGlzLnBsdWdpbklkOwotCX0KLQkKLQl2b2lkIHNldFBsdWdpbklkKFN0cmluZyBwbHVnaW5JZCkgewotCQl0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsOwotCX0KLQkKLQl2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeUNsYXNzTmFtZTsKLQl9Ci0JCi0Jdm9pZCBzZXRGYWN0b3J5Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5mYWN0b3J5Q2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0SnBhRmFjZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5qcGFGYWNldFZlcnNpb247Ci0JfQotCQotCXZvaWQgc2V0SnBhRmFjZXRWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpwYUZhY2V0VmVyc2lvbikgewotCQlpZiAoISBqcGFGYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkuZXF1YWxzKEpwYUZhY2V0LkZBQ0VUKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqcGFGYWNldFZlcnNpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy5qcGFGYWNldFZlcnNpb24gPSBqcGFGYWNldFZlcnNpb247Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzSnBhRmFjZXRWZXJzaW9uKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpwYUZhY2V0VmVyc2lvbikgewotCQlpZiAoISBqcGFGYWNldFZlcnNpb24uZ2V0UHJvamVjdEZhY2V0KCkuZXF1YWxzKEpwYUZhY2V0LkZBQ0VUKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihqcGFGYWNldFZlcnNpb24udG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuICh0aGlzLmpwYUZhY2V0VmVyc2lvbiAhPSBudWxsKSA/IHRoaXMuanBhRmFjZXRWZXJzaW9uLmVxdWFscyhqcGFGYWNldFZlcnNpb24pIDogdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0XzsKLQl9Ci0JCi0Jdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gZGVmYXVsdF8pIHsKLQkJdGhpcy5kZWZhdWx0XyA9IGRlZmF1bHRfOwotCX0KLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdldEdyb3VwKCkgewotCQlyZXR1cm4gdGhpcy5ncm91cDsKLQl9Ci0JCi0Jdm9pZCBzZXRHcm91cChKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsIGdyb3VwKSB7Ci0JCXRoaXMuZ3JvdXAgPSBncm91cDsKLQl9Ci0JCi0JcHVibGljIEpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm0oKSB7Ci0JCUpwYVBsYXRmb3JtRmFjdG9yeSBmYWN0b3J5ID0gKEpwYVBsYXRmb3JtRmFjdG9yeSkgWFBvaW50VG9vbHMuaW5zdGFudGlhdGUoCi0JCQkJdGhpcy5wbHVnaW5JZCwgSnBhUGxhdGZvcm1NYW5hZ2VySW1wbC5RVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCAKLQkJCQl0aGlzLmZhY3RvcnlDbGFzc05hbWUsIEpwYVBsYXRmb3JtRmFjdG9yeS5jbGFzcyk7Ci0JCXJldHVybiBmYWN0b3J5LmJ1aWxkSnBhUGxhdGZvcm0oZ2V0SWQoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmxhYmVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhOWFmZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVySXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsCi0JCWltcGxlbWVudHMgSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIHsKLQkKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZDsKLQlwcml2YXRlIFN0cmluZyBsYWJlbDsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb25JbXBsPiBwbGF0Zm9ybXM7Ci0JCi0JCi0JSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCgpIHsKLQkJdGhpcy5wbGF0Zm9ybXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb25JbXBsPigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gdGhpcy5pZDsKLQl9Ci0JCi0Jdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkKCkgewotCQlyZXR1cm4gdGhpcy5wbHVnaW5JZDsKLQl9Ci0JCi0Jdm9pZCBzZXRQbHVnaW5JZChTdHJpbmcgcGx1Z2luSWQpIHsKLQkJdGhpcy5wbHVnaW5JZCA9IHBsdWdpbklkOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gdGhpcy5sYWJlbDsKLQl9Ci0JCi0Jdm9pZCBzZXRMYWJlbChTdHJpbmcgbGFiZWwpIHsKLQkJdGhpcy5sYWJlbCA9IGxhYmVsOwotCX0KLQkKLQl2b2lkIGFkZFBsYXRmb3JtKEpwYVBsYXRmb3JtRGVzY3JpcHRpb25JbXBsIHBsYXRmb3JtKSB7Ci0JCXRoaXMucGxhdGZvcm1zLnB1dChwbGF0Zm9ybS5nZXRJZCgpLCBwbGF0Zm9ybSk7Ci0JfQotCQotCXB1YmxpYyBJdGVyYWJsZTxKcGFQbGF0Zm9ybURlc2NyaXB0aW9uPiBnZXRQbGF0Zm9ybXMoKSB7Ci0JCXJldHVybiBuZXcgU3VwZXJJdGVyYWJsZVdyYXBwZXI8SnBhUGxhdGZvcm1EZXNjcmlwdGlvbj4oQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24odGhpcy5wbGF0Zm9ybXMudmFsdWVzKCkpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMubGFiZWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1NYW5hZ2VySW1wbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1NYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDlkOGJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5YUG9pbnRUb29scy4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlhQb2ludFRvb2xzLlhQb2ludEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuS2V5ZWRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLQotLyoqCi0gKiBTaW5nbGV0b24gcmVnaXN0cnkgZm9yIHN0b3JpbmcgYWxsIHRoZSByZWdpc3RlcmVkIEpQQSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCi0gKiBlbGVtZW50cyBhbmQgaW5zdGFudGlhdGluZyBKUEEgcGxhdGZvcm1zIGZyb20gdGhlbS4KLSAqLwotcHVibGljIGNsYXNzIEpwYVBsYXRmb3JtTWFuYWdlckltcGwgCi0JCWltcGxlbWVudHMgSnBhUGxhdGZvcm1NYW5hZ2VyIHsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJqcGFQbGF0Zm9ybXMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lEID0gSnB0SnBhQ29yZVBsdWdpbi5QTFVHSU5fSURfICsgRVhURU5TSU9OX1BPSU5UX0lEOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fR1JPVVBfRUxFTUVOVCA9ICJqcGFQbGF0Zm9ybUdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fRUxFTUVOVCA9ICJqcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElEX0FUVFJJQlVURSA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0FUVFJJQlVURSA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEZBQ1RPUllfQ0xBU1NfQVRUUklCVVRFID0gImZhY3RvcnlDbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9GQUNFVF9WRVJTSU9OX0FUVFJJQlVURSA9ICJqcGFGYWNldFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FUVFJJQlVURSA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR1JPVVBfRUxFTUVOVCA9ICJncm91cCI7ICAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1NYW5hZ2VySW1wbCBJTlNUQU5DRSA9IG5ldyBKcGFQbGF0Zm9ybU1hbmFnZXJJbXBsKCk7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybU1hbmFnZXJJbXBsIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsPiBqcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25zOwotCXByaXZhdGUgS2V5ZWRTZXQ8U3RyaW5nLCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbD4ganBhUGxhdGZvcm1EZXNjcmlwdGlvbnM7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rvci9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybU1hbmFnZXJJbXBsKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnMgPSBuZXcgS2V5ZWRTZXQ8U3RyaW5nLCBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsPigpOwotCQl0aGlzLmpwYVBsYXRmb3JtRGVzY3JpcHRpb25zID0gbmV3IEtleWVkU2V0PFN0cmluZywgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbkltcGw+KCk7Ci0JCXJlYWRFeHRlbnNpb25zKCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCByZWFkRXh0ZW5zaW9ucygpIHsKLQkJZmluYWwgSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCi0JCWZpbmFsIElFeHRlbnNpb25Qb2ludCB4cG9pbnQgCi0JCQkJPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChKcHRKcGFDb3JlUGx1Z2luLlBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJCi0JCWlmICh4cG9pbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCQotCQlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4gcGxhdGZvcm1Hcm91cENvbmZpZ3MgPSBuZXcgQXJyYXlMaXN0PElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJTGlzdDxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHBsYXRmb3JtQ29uZmlncyA9IG5ldyBBcnJheUxpc3Q8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigpOwotCQkKLQkJZm9yIChJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IHhwb2ludC5nZXRFeHRlbnNpb25zKCkpIHsKLQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgOiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpIHsKLQkJCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFBMQVRGT1JNX0dST1VQX0VMRU1FTlQpKSB7Ci0JCQkJCXBsYXRmb3JtR3JvdXBDb25maWdzLmFkZChlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFBMQVRGT1JNX0VMRU1FTlQpKSB7Ci0JCQkJCXBsYXRmb3JtQ29uZmlncy5hZGQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogcGxhdGZvcm1Hcm91cENvbmZpZ3MpIHsKLQkJCXJlYWRQbGF0Zm9ybUdyb3VwRXh0ZW5zaW9uKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50IDogcGxhdGZvcm1Db25maWdzKSB7Ci0JCQlyZWFkUGxhdGZvcm1FeHRlbnNpb24oZWxlbWVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlYWRQbGF0Zm9ybUdyb3VwRXh0ZW5zaW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb25JbXBsIGRlc2MgPSBuZXcgSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCgpOwotCQkJCi0JCQkvLyBwbHVnLWluIGlkCi0JCQlkZXNjLnNldFBsdWdpbklkKGVsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCQkJCi0JCQkvLyBpZAotCQkJZGVzYy5zZXRJZChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgSURfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCWlmICh0aGlzLmpwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbnMuY29udGFpbnNLZXkoZGVzYy5nZXRJZCgpKSkgewotCQkJCWxvZ0R1cGxpY2F0ZUV4dGVuc2lvbihRVUFMSUZJRURfRVhURU5TSU9OX1BPSU5UX0lELCBJRF9BVFRSSUJVVEUsIGRlc2MuZ2V0SWQoKSk7Ci0JCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJfQotCQkJCi0JCQkvLyBsYWJlbAotCQkJZGVzYy5zZXRMYWJlbChmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgTEFCRUxfQVRUUklCVVRFKSk7Ci0JCQkKLQkJCXRoaXMuanBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5hZGRJdGVtKGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZWFkUGxhdGZvcm1FeHRlbnNpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJdHJ5IHsKLQkJCWZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb25JbXBsIGRlc2MgPSBuZXcgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwoKTsKLQkJCQotCQkJLy8gcGx1Zy1pbiBpZAotCQkJZGVzYy5zZXRQbHVnaW5JZChlbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpKTsKLQkJCQotCQkJLy8gaWQKLQkJCWRlc2Muc2V0SWQoZmluZFJlcXVpcmVkQXR0cmlidXRlKGVsZW1lbnQsIElEX0FUVFJJQlVURSkpOwotCQkJCi0JCQlpZiAodGhpcy5qcGFQbGF0Zm9ybURlc2NyaXB0aW9ucy5jb250YWluc0tleShkZXNjLmdldElkKCkpKSB7Ci0JCQkJbG9nRHVwbGljYXRlRXh0ZW5zaW9uKFFVQUxJRklFRF9FWFRFTlNJT05fUE9JTlRfSUQsIElEX0FUVFJJQlVURSwgZGVzYy5nZXRJZCgpKTsKLQkJCQl0aHJvdyBuZXcgWFBvaW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCS8vIGxhYmVsCi0JCQlkZXNjLnNldExhYmVsKGZpbmRSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50LCBMQUJFTF9BVFRSSUJVVEUpKTsKLQkJCQotCQkJLy8gZmFjdG9yeSBjbGFzcyAKLQkJCWRlc2Muc2V0RmFjdG9yeUNsYXNzTmFtZShmaW5kUmVxdWlyZWRBdHRyaWJ1dGUoZWxlbWVudCwgRkFDVE9SWV9DTEFTU19BVFRSSUJVVEUpKTsKLQkJCQotCQkJLy8gSlBBIGZhY2V0IHZlcnNpb24KLQkJCVN0cmluZyBqcGFGYWNldFZlcnNpb25TdHJpbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShKUEFfRkFDRVRfVkVSU0lPTl9BVFRSSUJVVEUpOwotCQkJaWYgKGpwYUZhY2V0VmVyc2lvblN0cmluZyAhPSBudWxsKSB7Ci0JCQkJSVByb2plY3RGYWNldFZlcnNpb24ganBhRmFjZXRWZXJzaW9uID0gSnBhRmFjZXQuRkFDRVQuZ2V0VmVyc2lvbihqcGFGYWNldFZlcnNpb25TdHJpbmcpOwotCQkJCWlmIChqcGFGYWNldFZlcnNpb24gIT0gbnVsbCkgewotCQkJCQlkZXNjLnNldEpwYUZhY2V0VmVyc2lvbihqcGFGYWNldFZlcnNpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbG9nSW52YWxpZFZhbHVlKGVsZW1lbnQsIEpQQV9GQUNFVF9WRVJTSU9OX0FUVFJJQlVURSwganBhRmFjZXRWZXJzaW9uU3RyaW5nKTsKLQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZGVmYXVsdAotCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmcgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShERUZBVUxUX0FUVFJJQlVURSk7Ci0JCQlpZiAoZGVmYXVsdFN0cmluZyAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlZmF1bHRTdHJpbmcuZXF1YWxzKCJ0cnVlIikpIHsKLQkJCQkJZGVzYy5zZXREZWZhdWx0KHRydWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChkZWZhdWx0U3RyaW5nLmVxdWFscygiZmFsc2UiKSkgewotCQkJCQlkZXNjLnNldERlZmF1bHQoZmFsc2UpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbG9nSW52YWxpZFZhbHVlKGVsZW1lbnQsIERFRkFVTFRfQVRUUklCVVRFLCBkZWZhdWx0U3RyaW5nKTsKLQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZ3JvdXAKLQkJCVN0cmluZyBncm91cElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoR1JPVVBfRUxFTUVOVCk7Ci0JCQlpZiAoZ3JvdXBJZCAhPSBudWxsKSB7Ci0JCQkJSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uSW1wbCBncm91cCA9IHRoaXMuanBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5nZXRJdGVtKGdyb3VwSWQpOwotCQkJCWlmIChncm91cCAhPSBudWxsKSB7Ci0JCQkJCWRlc2Muc2V0R3JvdXAoZ3JvdXApOwotCQkJCQlncm91cC5hZGRQbGF0Zm9ybShkZXNjKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWxvZ0ludmFsaWRWYWx1ZShlbGVtZW50LCBHUk9VUF9FTEVNRU5ULCBncm91cElkKTsKLQkJCQkJdGhyb3cgbmV3IFhQb2ludEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJdGhpcy5qcGFQbGF0Zm9ybURlc2NyaXB0aW9ucy5hZGRJdGVtKGRlc2MuZ2V0SWQoKSwgZGVzYyk7Ci0JCX0KLQkJY2F0Y2ggKFhQb2ludEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgYW5kIGNvbnRpbnVlLiBUaGUgcHJvYmxlbSBoYXMgYWxyZWFkeSBiZWVuIHJlcG9ydGVkIHRvIHRoZSB1c2VyCi0JCQkvLyBpbiB0aGUgbG9nLgotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSXRlcmFibGU8SnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uPiBnZXRKcGFQbGF0Zm9ybUdyb3VwcygpIHsKLQkJcmV0dXJuIG5ldyBTdXBlckl0ZXJhYmxlV3JhcHBlcjxKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24+KHRoaXMuanBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5nZXRJdGVtU2V0KCkpOwotCX0KLQkKLQlwdWJsaWMgSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtR3JvdXAoU3RyaW5nIGdyb3VwSWQpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9ucy5nZXRJdGVtKGdyb3VwSWQpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmFibGU8SnBhUGxhdGZvcm1EZXNjcmlwdGlvbj4gZ2V0SnBhUGxhdGZvcm1zKCkgewotCQlyZXR1cm4gbmV3IFN1cGVySXRlcmFibGVXcmFwcGVyPEpwYVBsYXRmb3JtRGVzY3JpcHRpb24+KHRoaXMuanBhUGxhdGZvcm1EZXNjcmlwdGlvbnMuZ2V0SXRlbVNldCgpKTsKLQl9Ci0JCi0JcHVibGljIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJcmV0dXJuIHRoaXMuanBhUGxhdGZvcm1EZXNjcmlwdGlvbnMuZ2V0SXRlbShwbGF0Zm9ybUlkKTsKLQl9Ci0JCi0JcHVibGljIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0RGVmYXVsdEpwYVBsYXRmb3JtKElQcm9qZWN0RmFjZXRWZXJzaW9uIGpwYUZhY2V0VmVyc2lvbikgewotCQlmb3IgKEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gcGxhdGZvcm0gOiBnZXRKcGFQbGF0Zm9ybXMoKSkgewotCQkJaWYgKHBsYXRmb3JtLmlzRGVmYXVsdCgpICYmIHBsYXRmb3JtLnN1cHBvcnRzSnBhRmFjZXRWZXJzaW9uKGpwYUZhY2V0VmVyc2lvbikpIHsKLQkJCQlyZXR1cm4gcGxhdGZvcm07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCXB1YmxpYyBKcGFQbGF0Zm9ybSBidWlsZEpwYVBsYXRmb3JtSW1wbGVtZW50YXRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlTdHJpbmcganBhUGxhdGZvcm1JZCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1JZChwcm9qZWN0KTsKLQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbkltcGwgcGxhdGZvcm1EZXNjID0gdGhpcy5qcGFQbGF0Zm9ybURlc2NyaXB0aW9ucy5nZXRJdGVtKGpwYVBsYXRmb3JtSWQpOwotCQlpZiAocGxhdGZvcm1EZXNjID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2plY3QgZG9lcyBub3QgaGF2ZSBhIHJlY29nbml6ZWQgSlBBIHBsYXRmb3JtLiIpOwotCQl9Ci0JCXJldHVybiBwbGF0Zm9ybURlc2MuYnVpbGRKcGFQbGF0Zm9ybSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3ByZWZzL0pwYVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmQwNDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcHJlZnMvSnBhUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBDbGFzcyB1c2VkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBwcmVmZXJlbmNlIHZhbHVlcy4KLSAqIFNlZSA8Y29kZT5vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXM8L2NvZGU+IGV4dGVuc2lvbiBwb2ludC4KLSAqLwotcHVibGljIGNsYXNzIEpwYVByZWZlcmVuY2VJbml0aWFsaXplcgotCWV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgCi17Ci0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSnB0SnBhQ29yZVBsdWdpbi5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvQWJzdHJhY3RKcGFEZWxldGVUeXBlUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0Fic3RyYWN0SnBhRGVsZXRlVHlwZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOTQ4YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvQWJzdHJhY3RKcGFEZWxldGVUeXBlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXBwaW5nLklSZXNvdXJjZUNoYW5nZURlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkRlbGV0ZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZXNvdXJjZUNoYW5nZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFEZWxldGVUeXBlUGFydGljaXBhbnQKLQlleHRlbmRzIERlbGV0ZVBhcnRpY2lwYW50Ci17Ci0KLQkvKioKLQkgKiBTdG9yZSBhbGwgdGhlIHR5cGVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIGRlbGV0ZWQgaW5jbHVkaW5nIG5lc3RlZFR5cGVzLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTZXQ8SVR5cGU+IGFsbFR5cGVzOwotCi0JLyoqCi0JICogU3RvcmUgdGhlIHBlcnNpc3RlbmNlLnhtbCBEZWxldGVFZGl0cyBpbiB0aGUgY2hlY2tDb25kaXRpb25zKCkgY2FsbCAKLQkgKiB0byBhdm9pZCBkdXBsaWNhdGVkIGVmZm9ydCBpbiBjcmVhdGVDaGFuZ2UoKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPElGaWxlLCBJdGVyYWJsZTxEZWxldGVFZGl0Pj4gcGVyc2lzdGVuY2VYbWxEZWxldGVFZGl0czsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSBtYXBwaW5nIGZpbGUgRGVsZXRlRWRpdHMgaW4gdGhlIGNoZWNrQ29uZGl0aW9ucygpIGNhbGwgCi0JICogdG8gYXZvaWQgZHVwbGljYXRlZCBlZmZvcnQgaW4gY3JlYXRlQ2hhbmdlKCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcDxJRmlsZSwgSXRlcmFibGU8RGVsZXRlRWRpdD4+IG1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVEZWxldGVFZGl0czsKLQotCXByb3RlY3RlZCBBYnN0cmFjdEpwYURlbGV0ZVR5cGVQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5hbGxUeXBlcyA9IG5ldyBIYXNoU2V0PElUeXBlPigpOwotCQl0aGlzLnBlcnNpc3RlbmNlWG1sRGVsZXRlRWRpdHMgPSBuZXcgSGFzaE1hcDxJRmlsZSwgSXRlcmFibGU8RGVsZXRlRWRpdD4+KCk7Ci0JCXRoaXMubWFwcGluZ0ZpbGVQZXJzaXN0ZW50VHlwZURlbGV0ZUVkaXRzID0gbmV3IEhhc2hNYXA8SUZpbGUsIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+PigpOwotCX0KLQkKLQkvKioKLQkgKiBOZXN0ZWQgdHlwZXMgYXJlIG5vdCBhZGRlZCB0byB0aGUgZGVsZXRlUGFydGljaXBhbnQgd2hlbiB0aGUgcGFyZW50IGlzIGRlbGV0ZWQuCi0JICogV2UgbXVzdCBoYW5kbGUgdGhlbSBpbiBjYXNlIHRoZXkgYXJlIG1hcHBlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUeXBlKElUeXBlIHR5cGUpIHsKLQkJdGhpcy5hbGxUeXBlcy5hZGQodHlwZSk7Ci0JCXRoaXMuYWRkTmVzdGVkVHlwZXModHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RlZFR5cGVzKElUeXBlIHR5cGUpIHsKLQkJSVR5cGVbXSBuZXN0ZWRUeXBlczsKLQkJdHJ5IHsKLQkJCW5lc3RlZFR5cGVzID0gdHlwZS5nZXRUeXBlcygpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoSVR5cGUgbmVzdGVkVHlwZSA6IG5lc3RlZFR5cGVzKSB7Ci0JCQl0aGlzLmFkZFR5cGUobmVzdGVkVHlwZSk7Ci0JCX0KLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKiogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogSW5mb3JtIHRoZSByZWZhY3RvcmluZyBwcm9jZXNzb3Igb2YgYW55IGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGNoYW5nZS4gSW4gdGhlIHByb2Nlc3Mgb2YgZGV0ZXJtaW5pbmcKLQkgKiB0aGlzIGdvIGFoZWFkIGFuZCBidWlsZCB1cCB0aGUgYXBwcm9wcmlhdGUgRGVsZXRlRWRpdHMgdG8gYmUgdXNlZCBpbiB0aGUgY3JlYXRlQ2hhbmdlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvL3NpbmNlIHRoZSBwcm9ncmVzcyBiYXIgd2lsbCBoYW5nIGlmIGEgbGFyZ2UgSlBBIHByb2plY3QgaXMgYmVpbmcgbG9hZGVkLCAKLQkJLy93ZSBjYW4gYXQgbGVhc3Qgc2V0IHRoZSBzdWJ0YXNrIGFuZCByZXBvcnQgbm8gcHJvZ3Jlc3MuIE9ubHkgaGFwcGVucyBmaXJzdCB0aW1lIGdldEpwYVByb2plY3RNYW5hZ2VyKCkgaXMgY2FsbGVkLgotCQltb25pdG9yLnN1YlRhc2soSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFRkFDT1JJTkdfUEFSVElDSVBBTlRfTE9BRElOR19KUEFfUFJPSkVDVFNfU1VCX1RBU0tfTkFNRSk7Ci0JCUpwYVByb2plY3RNYW5hZ2VyIGpwYVByb2plY3RNYW5hZ2VyID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpOwotCQlpZiAoanBhUHJvamVjdE1hbmFnZXIuZ2V0SnBhUHJvamVjdHNTaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0c1NpemUoKSoxMCArIDIpOwotCQlzbS5zdWJUYXNrKHRoaXMuZ2V0Q2hlY2tDb25kaXRpb25zU3ViVGFza05hbWUoKSk7Ci0JCVJlc291cmNlQ2hhbmdlQ2hlY2tlciBjaGVja2VyID0gKFJlc291cmNlQ2hhbmdlQ2hlY2tlcikgY29udGV4dC5nZXRDaGVja2VyKFJlc291cmNlQ2hhbmdlQ2hlY2tlci5jbGFzcyk7Ci0JCUlSZXNvdXJjZUNoYW5nZURlc2NyaXB0aW9uRmFjdG9yeSBkZWx0YUZhY3RvcnkgPSBjaGVja2VyLmdldERlbHRhRmFjdG9yeSgpOwotCQkKLQkJZm9yIChKcGFQcm9qZWN0IGpwYVByb2plY3QgOiBqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0cygpKSB7Ci0JCQl0aGlzLmNyZWF0ZURlbGV0ZUVkaXRzKHNtLm5ld0NoaWxkKDEwKSwganBhUHJvamVjdCk7Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZm9yIChJRmlsZSBmaWxlIDogdGhpcy5wZXJzaXN0ZW5jZVhtbERlbGV0ZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlkZWx0YUZhY3RvcnkuY2hhbmdlKGZpbGUpOwotCQl9Ci0JCXNtLndvcmtlZCgxKTsKLQkJZm9yIChJRmlsZSBmaWxlIDogdGhpcy5tYXBwaW5nRmlsZVBlcnNpc3RlbnRUeXBlRGVsZXRlRWRpdHMua2V5U2V0KCkpIHsKLQkJCWRlbHRhRmFjdG9yeS5jaGFuZ2UoZmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBtYWluIHJlZmFjdG9yaW5nIHRhc2sgbmFtZWQgOiAnQ2hlY2tpbmcgcHJlY29uZGl0aW9ucy4uLicKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENoZWNrQ29uZGl0aW9uc1N1YlRhc2tOYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX0RFTEVURV9UWVBFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVhtbERlbGV0ZUVkaXRzLmlzRW1wdHkoKSAmJiB0aGlzLm1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVEZWxldGVFZGl0cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgdGhpcy5wZXJzaXN0ZW5jZVhtbERlbGV0ZUVkaXRzLnNpemUoKSArIHRoaXMubWFwcGluZ0ZpbGVQZXJzaXN0ZW50VHlwZURlbGV0ZUVkaXRzLnNpemUoKSk7Ci0JCXNtLnN1YlRhc2sodGhpcy5nZXRDcmVhdGVDaGFuZ2VTdWJUYXNrTmFtZSgpKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX0RFTEVURV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FKTsKLQkJZm9yIChJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUgOiB0aGlzLnBlcnNpc3RlbmNlWG1sRGVsZXRlRWRpdHMua2V5U2V0KCkpIHsKLQkJCXRoaXMuYWRkUGVyc2lzdGVuY2VYbWxEZWxldGVUeXBlQ2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSwgY29tcG9zaXRlQ2hhbmdlKTsKLQkJCXNtLndvcmtlZCgxKTsKLQkJfQotCQlmb3IgKElGaWxlIG1hcHBpbmdGaWxlIDogdGhpcy5tYXBwaW5nRmlsZVBlcnNpc3RlbnRUeXBlRGVsZXRlRWRpdHMua2V5U2V0KCkpIHsKLQkJCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuYWRkTWFwcGluZ0ZpbGVEZWxldGVUeXBlQ2hhbmdlKG1hcHBpbmdGaWxlLCBjb21wb3NpdGVDaGFuZ2UpOwotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JCS8vbXVzdCBjaGVjayBmb3IgY2hpbGRyZW4gaW4gY2FzZSBhbGwgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gb3RoZXIgcGFydGljaXBhbnQncyBUZXh0Q2hhbmdlcywgCi0JCS8vd2FudCB0byByZXR1cm4gbnVsbCBzbyBvdXIgbm9kZSBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIHByZXZpZXcgdHJlZQotCQlyZXR1cm4gY29tcG9zaXRlQ2hhbmdlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDAgPyBudWxsIDogY29tcG9zaXRlQ2hhbmdlOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIG1haW4gcmVmYWN0b3JpbmcgdGFzayBuYW1lZCA6ICdDcmVhdGluZyB3b3Jrc3BhY2UgbW9kaWZpY2F0aW9ucy4uLicKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENyZWF0ZUNoYW5nZVN1YlRhc2tOYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX0RFTEVURV9UWVBFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGVsZXRlRWRpdHMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMSArIHBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCQlJdGVyYWJsZTxEZWxldGVFZGl0PiBwZXJzaXN0ZW5jZVhtbERlbGV0ZUVkaXRzID0gdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZVhtbERlbGV0ZUVkaXRzKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCWlmICghQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocGVyc2lzdGVuY2VYbWxEZWxldGVFZGl0cykpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VYbWxEZWxldGVFZGl0cy5wdXQoanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpLCBwZXJzaXN0ZW5jZVhtbERlbGV0ZUVkaXRzKTsKLQkJfQotCQlzbS53b3JrZWQoMSk7Ci0JCWZvciAoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgOiBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkpIHsKLQkJCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IG1hcHBpbmdGaWxlRGVsZXRlRWRpdHMgPSB0aGlzLmNyZWF0ZU1hcHBpbmdGaWxlRGVsZXRlVHlwZUVkaXRzKG1hcHBpbmdGaWxlUmVmKTsKLQkJCWlmICghQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkobWFwcGluZ0ZpbGVEZWxldGVFZGl0cykpIHsKLQkJCQl0aGlzLm1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVEZWxldGVFZGl0cy5wdXQoKElGaWxlKSBtYXBwaW5nRmlsZVJlZi5nZXRNYXBwaW5nRmlsZSgpLmdldFJlc291cmNlKCksIG1hcHBpbmdGaWxlRGVsZXRlRWRpdHMpOwotCQkJfQotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlWG1sRGVsZXRlRWRpdHMoZmluYWwgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPERlbGV0ZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SVR5cGUsIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+Pih0aGlzLmdldFR5cGVzT25DbGFzc3BhdGgocGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8RGVsZXRlRWRpdD4gdHJhbnNmb3JtKElUeXBlIHR5cGUpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdC5jcmVhdGVEZWxldGVUeXBlRWRpdHModHlwZSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJVHlwZT4gZ2V0VHlwZXNPbkNsYXNzcGF0aChmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElUeXBlPih0aGlzLmFsbFR5cGVzKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJVHlwZSB0eXBlKSB7Ci0JCQkJcmV0dXJuIGphdmFQcm9qZWN0LmlzT25DbGFzc3BhdGgodHlwZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyc2lzdGVuY2VYbWxEZWxldGVUeXBlQ2hhbmdlKElGaWxlIHBlcnNpc3RlbmNlWG1sRmlsZSwgQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSkgewotCQlJdGVyYWJsZTxEZWxldGVFZGl0PiBkZWxldGVUeXBlRWRpdHMgPSB0aGlzLnBlcnNpc3RlbmNlWG1sRGVsZXRlRWRpdHMuZ2V0KHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0KLQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0VGV4dENoYW5nZShwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQlpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0JCQl0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9ERUxFVEVfVFlQRV9SRUZBQ1RPUklOR19DSEFOR0VfUEVSU0lTVEVOQ0VfWE1MX05BTUUsIHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCQkvL1RPRE8gcHJvYmFibHkgbmVlZCB0byBmaWd1cmUgb3V0IFRleHRFZGl0R3JvdXBzIHNpbmNlIHRoZXNlIGNhbiBiZSB1c2VkIHRvIHNob3cgY2hlY2sgYm94ZXMgdW5kZXIgdGhlIGZpbGUgaW4gdGhlIHByZXZpZXcgZGlhbG9nCi0JCQkvL2Fsc28gdXNlZCB0byBhZGQgZWRpdHMgdG8gZXhpc3RpbmcgY2hhbmdlcz8/Ci0JCQlNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJdGV4dENoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotLy8JCQl0ZXh0Q2hhbmdlLmFkZFRleHRFZGl0R3JvdXAobmV3IFRleHRFZGl0R3JvdXAoImVkaXQgcGVyc2lzdGVuY2UgdW5pdCIsIG11bHRpVGV4dEVkaXQpKTs/Pz8KLQkJCWNvbXBvc2l0ZUNoYW5nZS5hZGQodGV4dENoYW5nZSk7Ci0JCX0KLQkJdGhpcy5hZGRFZGl0cyh0ZXh0Q2hhbmdlLCBkZWxldGVUeXBlRWRpdHMpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RGVsZXRlRWRpdD4gY3JlYXRlTWFwcGluZ0ZpbGVEZWxldGVUeXBlRWRpdHMoZmluYWwgTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxEZWxldGVFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElUeXBlLCBJdGVyYWJsZTxEZWxldGVFZGl0Pj4odGhpcy5nZXRUeXBlc09uQ2xhc3NwYXRoKG1hcHBpbmdGaWxlUmVmLmdldEpwYVByb2plY3QoKSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8RGVsZXRlRWRpdD4gdHJhbnNmb3JtKElUeXBlIHR5cGUpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLmNyZWF0ZURlbGV0ZVR5cGVFZGl0cyh0eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBpbmdGaWxlRGVsZXRlVHlwZUNoYW5nZShJRmlsZSBtYXBwaW5nRmlsZSwgQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSkgewotCQlJdGVyYWJsZTxEZWxldGVFZGl0PiBkZWxldGVUeXBlRWRpdHMgPSB0aGlzLm1hcHBpbmdGaWxlUGVyc2lzdGVudFR5cGVEZWxldGVFZGl0cy5nZXQobWFwcGluZ0ZpbGUpOwotCi0JCVRleHRDaGFuZ2UgdGV4dENoYW5nZSA9IGdldFRleHRDaGFuZ2UobWFwcGluZ0ZpbGUpOwotCQlpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0JCQl0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9ERUxFVEVfVFlQRV9SRUZBQ1RPUklOR19DSEFOR0VfTUFQUElOR19GSUxFX05BTUUsIG1hcHBpbmdGaWxlKTsKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQl0ZXh0Q2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0JCQljb21wb3NpdGVDaGFuZ2UuYWRkKHRleHRDaGFuZ2UpOwotCQl9Ci0JCXRoaXMuYWRkRWRpdHModGV4dENoYW5nZSwgZGVsZXRlVHlwZUVkaXRzKTsKLQl9Ci0KLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7ICAvLyB0aGUgY29udGV4dCBtb2RlbCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAxIHBlcnNpc3RlbmNlIHVuaXQKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVkaXRzKFRleHRDaGFuZ2UgdGV4dENoYW5nZSwgSXRlcmFibGU8PyBleHRlbmRzIFRleHRFZGl0PiB0ZXh0RWRpdHMpIHsKLQkJZm9yIChUZXh0RWRpdCB0ZXh0RWRpdCA6IHRleHRFZGl0cykgewotCQkJdHJ5IHsKLQkJCQl0ZXh0Q2hhbmdlLmFkZEVkaXQodGV4dEVkaXQpOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXgpIHsKLQkJCQkvL2xvZyBleGNlcHRpb24gYW5kIGRvbid0IGFkZCB0aGlzIHBlcnNpc3RlbmNlLnhtbCB0eXBlIGRlbGV0aW9uIHRvIHRoZSBjb25mbGljdGluZyBjaGFuZ2Ugb2JqZWN0Ci0JCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0Fic3RyYWN0SnBhTW92ZUphdmFFbGVtZW50UGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0Fic3RyYWN0SnBhTW92ZUphdmFFbGVtZW50UGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyNGUzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9BYnN0cmFjdEpwYU1vdmVKYXZhRWxlbWVudFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuSVNoYXJhYmxlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlc291cmNlQ2hhbmdlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhTW92ZUphdmFFbGVtZW50UGFydGljaXBhbnQKLQlleHRlbmRzIE1vdmVQYXJ0aWNpcGFudCBpbXBsZW1lbnRzIElTaGFyYWJsZVBhcnRpY2lwYW50IHsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSB7QGxpbmsgSUphdmFFbGVtZW50c31zIHRvIGJlIG1vdmVkIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIHtAbGluayBNb3ZlQXJndW1lbnRzfQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNYXA8SUphdmFFbGVtZW50LCBNb3ZlQXJndW1lbnRzPiBvcmlnaW5hbEphdmFFbGVtZW50czsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSBwZXJzaXN0ZW5jZS54bWwgUmVwbGFjZUVkaXRzIGluIHRoZSBjaGVja0NvbmRpdGlvbnMoKSBjYWxsIAotCSAqIHRvIGF2b2lkIGR1cGxpY2F0ZWQgZWZmb3J0IGluIGNyZWF0ZUNoYW5nZSgpLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNYXA8SUZpbGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4gcGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHM7Ci0KLQkvKioKLQkgKiBTdG9yZSB0aGUgbWFwcGluZyBmaWxlIFJlcGxhY2VFZGl0cyBpbiB0aGUgY2hlY2tDb25kaXRpb25zKCkgY2FsbCAKLQkgKiB0byBhdm9pZCBkdXBsaWNhdGVkIGVmZm9ydCBpbiBjcmVhdGVDaGFuZ2UoKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPElGaWxlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+IG1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0SnBhTW92ZUphdmFFbGVtZW50UGFydGljaXBhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JpZ2luYWxKYXZhRWxlbWVudHMgPSBuZXcgSGFzaE1hcDxJSmF2YUVsZW1lbnQsIE1vdmVBcmd1bWVudHM+KCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMgPSBuZXcgSGFzaE1hcDxJRmlsZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PigpOwotCQl0aGlzLm1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzID0gbmV3IEhhc2hNYXA8SUZpbGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghZ2V0QXJndW1lbnRzKCkuZ2V0VXBkYXRlUmVmZXJlbmNlcygpKSB7Ci0JCQkvL3dlIGRvIG5vdCB3YW50IHRvIGRvIGFueSByZWZhY3RvcmluZyBpZiB0aGUgdXNlciBjaG9vc2VzIG5vdCB0byB1cGRhdGUgcmVmZXJlbmNlcwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMuYWRkRWxlbWVudChlbGVtZW50LCBnZXRBcmd1bWVudHMoKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqSVNoYXJhYmxlUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiBtdWx0aXBsZSBtYXBwaW5nIGZpbGVzIGFyZSBkZWxldGVkLgotCSAqIFJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShPYmplY3QpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IGRlbGV0ZWQgSUZpbGUuCi0JICogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXRBcmd1bWVudHMoKSBvbmx5IGFwcGxpZXMgdG8gdGhlIGZpcnN0IGRlbGV0ZWQgSUZpbGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFbGVtZW50KE9iamVjdCBlbGVtZW50LCBSZWZhY3RvcmluZ0FyZ3VtZW50cyBhcmd1bWVudHMpIHsKLQkJdGhpcy5vcmlnaW5hbEphdmFFbGVtZW50cy5wdXQoKElKYXZhRWxlbWVudCkgZWxlbWVudCwgKE1vdmVBcmd1bWVudHMpIGFyZ3VtZW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1vdmVBcmd1bWVudHMgZ2V0QXJndW1lbnRzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiB0aGlzLm9yaWdpbmFsSmF2YUVsZW1lbnRzLmdldChlbGVtZW50KTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKiogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogSW5mb3JtIHRoZSByZWZhY3RvcmluZyBwcm9jZXNzb3Igb2YgYW55IGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGNoYW5nZS4gSW4gdGhlIHByb2Nlc3Mgb2YgZGV0ZXJtaW5pbmcKLQkgKiB0aGlzIGdvIGFoZWFkIGFuZCBidWlsZCB1cCB0aGUgYXBwcm9wcmlhdGUgUmVwbGFjZUVkaXRzIHRvIGJlIHVzZWQgaW4gdGhlIGNyZWF0ZUNoYW5nZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJbW9uaXRvci5zdWJUYXNrKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRUZBQ09SSU5HX1BBUlRJQ0lQQU5UX0xPQURJTkdfSlBBX1BST0pFQ1RTX1NVQl9UQVNLX05BTUUpOwotCQlKcGFQcm9qZWN0TWFuYWdlciBqcGFQcm9qZWN0TWFuYWdlciA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKTsKLQkJaWYgKGpwYVByb2plY3RNYW5hZ2VyLmdldEpwYVByb2plY3RzU2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwganBhUHJvamVjdE1hbmFnZXIuZ2V0SnBhUHJvamVjdHNTaXplKCkqMTAgKyAyKTsKLQkJc20uc3ViVGFzayh0aGlzLmdldENoZWNrQ29uZGl0aW9uc1N1YlRhc2tOYW1lKCkpOwotCQlSZXNvdXJjZUNoYW5nZUNoZWNrZXIgY2hlY2tlciA9IChSZXNvdXJjZUNoYW5nZUNoZWNrZXIpIGNvbnRleHQuZ2V0Q2hlY2tlcihSZXNvdXJjZUNoYW5nZUNoZWNrZXIuY2xhc3MpOwotCQlJUmVzb3VyY2VDaGFuZ2VEZXNjcmlwdGlvbkZhY3RvcnkgZGVsdGFGYWN0b3J5ID0gY2hlY2tlci5nZXREZWx0YUZhY3RvcnkoKTsKLQotCQlmb3IgKEpwYVByb2plY3QganBhUHJvamVjdCA6IGpwYVByb2plY3RNYW5hZ2VyLmdldEpwYVByb2plY3RzKCkpIHsKLQkJCXRoaXMuY3JlYXRlUmVwbGFjZUVkaXRzKHNtLm5ld0NoaWxkKDEwKSwganBhUHJvamVjdCk7Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZm9yIChJRmlsZSBmaWxlIDogdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cy5rZXlTZXQoKSkgewotCQkJZGVsdGFGYWN0b3J5LmNoYW5nZShmaWxlKTsKLQkJfQotCQlzbS53b3JrZWQoMSk7Ci0JCWZvciAoSUZpbGUgZmlsZSA6IHRoaXMubWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMua2V5U2V0KCkpIHsKLQkJCWRlbHRhRmFjdG9yeS5jaGFuZ2UoZmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21wb3NpdGVDaGFuZ2VOYW1lKCk7Ci0KLQkvKioKLQkgKiBUaGlzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIG1haW4gcmVmYWN0b3JpbmcgdGFzayBuYW1lZCA6ICdDaGVja2luZyBwcmVjb25kaXRpb25zLi4uJwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q2hlY2tDb25kaXRpb25zU3ViVGFza05hbWUoKTsKLQotCUBPdmVycmlkZQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMuaXNFbXB0eSgpICYmIHRoaXMubWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHRoaXMucGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMuc2l6ZSgpICsgdGhpcy5tYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5zaXplKCkpOwotCQlzbS5zdWJUYXNrKHRoaXMuZ2V0Q3JlYXRlQ2hhbmdlU3ViVGFza05hbWUoKSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKHRoaXMuZ2V0Q29tcG9zaXRlQ2hhbmdlTmFtZSgpKTsKLQkJZm9yIChJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUgOiB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQl0aGlzLmFkZFBlcnNpc3RlbmNlWG1sUmVuYW1lRWRpdHMocGVyc2lzdGVuY2VYbWxGaWxlLCBjb21wb3NpdGVDaGFuZ2UpOwotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JCWZvciAoSUZpbGUgbWFwcGluZ0ZpbGUgOiB0aGlzLm1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmFkZE1hcHBpbmdGaWxlUmVuYW1lRWRpdHMobWFwcGluZ0ZpbGUsIGNvbXBvc2l0ZUNoYW5nZSk7Ci0JCQlzbS53b3JrZWQoMSk7Ci0JCX0KLQkJLy9tdXN0IGNoZWNrIGZvciBjaGlsZHJlbiBpbiBjYXNlIGFsbCBjaGFuZ2VzIHdlcmUgbWFkZSBpbiBvdGhlciBwYXJ0aWNpcGFudCdzIFRleHRDaGFuZ2VzLCAKLQkJLy93YW50IHRvIHJldHVybiBudWxsIHNvIG91ciBub2RlIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgcHJldmlldyB0cmVlCi0JCXJldHVybiBjb21wb3NpdGVDaGFuZ2UuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCA/IG51bGwgOiBjb21wb3NpdGVDaGFuZ2U7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBtYWluIHJlZmFjdG9yaW5nIHRhc2sgbmFtZWQgOiAnQ3JlYXRpbmcgd29ya3NwYWNlIG1vZGlmaWNhdGlvbnMuLi4nCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDcmVhdGVDaGFuZ2VTdWJUYXNrTmFtZSgpOwotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVwbGFjZUVkaXRzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDEgKyBwZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNsYXNzUmVmRGVsZXRlRWRpdHMgPSB0aGlzLmNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlcGxhY2VFZGl0c0NoZWNrQ2xhc3NwYXRoKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCXNtLndvcmtlZCgxKTsKLQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShjbGFzc1JlZkRlbGV0ZUVkaXRzKSkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cy5wdXQoanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpLCBjbGFzc1JlZkRlbGV0ZUVkaXRzKTsKLQkJfQotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogcGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gbWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMgPSB0aGlzLmNyZWF0ZU1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzQ2hlY2tDbGFzc3BhdGgobWFwcGluZ0ZpbGVSZWYpOwotCQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShtYXBwaW5nRmlsZVJlcGxhY2VFZGl0cykpIHsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtYXBwaW5nRmlsZVJlZi5nZXRNYXBwaW5nRmlsZSgpLmdldFJlc291cmNlKCk7Ci0JCQkJdGhpcy5tYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5wdXQoZmlsZSwgbWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMpOwotCQkJfQotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZXBsYWNlRWRpdHNDaGVja0NsYXNzcGF0aChmaW5hbCBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8SUphdmFFbGVtZW50LCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KHRoaXMuZ2V0RWxlbWVudHNPbkNsYXNzcGF0aChwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gdHJhbnNmb3JtKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCkgewotCQkJCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMocGVyc2lzdGVuY2VVbml0LCBqYXZhRWxlbWVudCwgZ2V0QXJndW1lbnRzKGphdmFFbGVtZW50KS5nZXREZXN0aW5hdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElKYXZhRWxlbWVudD4gZ2V0RWxlbWVudHNPbkNsYXNzcGF0aChmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElKYXZhRWxlbWVudD4odGhpcy5vcmlnaW5hbEphdmFFbGVtZW50cy5rZXlTZXQoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSUphdmFFbGVtZW50IGphdmFFbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGphdmFQcm9qZWN0LmlzT25DbGFzc3BhdGgoamF2YUVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBPYmplY3QgZGVzdGluYXRpb24pOwotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyc2lzdGVuY2VYbWxSZW5hbWVFZGl0cyhJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUsIENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UpIHsKLQkJSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHJlcGxhY2VQYWNrYWdlRWRpdHMgPSB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmdldChwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCi0JCVRleHRDaGFuZ2UgdGV4dENoYW5nZSA9IGdldFRleHRDaGFuZ2UocGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJaWYgKHRleHRDaGFuZ2UgPT0gbnVsbCkgewotCQkJdGV4dENoYW5nZSA9IG5ldyBUZXh0RmlsZUNoYW5nZSh0aGlzLmdldFBlcnNpc3RlbmNlWG1sQ2hhbmdlTmFtZSgpLCBwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQkJLy9UT0RPIHByb2JhYmx5IG5lZWQgdG8gZmlndXJlIG91dCBUZXh0RWRpdEdyb3VwcyBzaW5jZSB0aGVzZSBjYW4gYmUgdXNlZCB0byBzaG93IGNoZWNrIGJveGVzIHVuZGVyIHRoZSBmaWxlIGluIHRoZSBwcmV2aWV3IGRpYWxvZwotCQkJLy9hbHNvIHVzZWQgdG8gYWRkIGVkaXRzIHRvIGV4aXN0aW5nIGNoYW5nZXM/PwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCXRleHRDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLS8vCQkJdGV4dENoYW5nZS5hZGRUZXh0RWRpdEdyb3VwKG5ldyBUZXh0RWRpdEdyb3VwKCJlZGl0IHBlcnNpc3RlbmNlIHVuaXQiLCBtdWx0aVRleHRFZGl0KSk7Pz8/Ci0JCQljb21wb3NpdGVDaGFuZ2UuYWRkKHRleHRDaGFuZ2UpOwotCQl9Ci0JCXRoaXMuYWRkRWRpdHModGV4dENoYW5nZSwgcmVwbGFjZVBhY2thZ2VFZGl0cyk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VYbWxDaGFuZ2VOYW1lKCk7Ci0KLQotCXByaXZhdGUgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzQ2hlY2tDbGFzc3BhdGgoZmluYWwgTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJSmF2YUVsZW1lbnQsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4odGhpcy5nZXRFbGVtZW50c09uQ2xhc3NwYXRoKG1hcHBpbmdGaWxlUmVmLmdldEpwYVByb2plY3QoKSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShJSmF2YUVsZW1lbnQgamF2YUVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZU1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzKG1hcHBpbmdGaWxlUmVmLCBqYXZhRWxlbWVudCwgZ2V0QXJndW1lbnRzKGphdmFFbGVtZW50KS5nZXREZXN0aW5hdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgT2JqZWN0IGRlc3RpbmF0aW9uKTsKLQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1hcHBpbmdGaWxlUmVuYW1lRWRpdHMoSUZpbGUgbWFwcGluZ0ZpbGUsIENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UpIHsKLQkJSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHJlcGxhY2VkVHlwZUVkaXRzID0gdGhpcy5tYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5nZXQobWFwcGluZ0ZpbGUpOwotCi0JCVRleHRDaGFuZ2UgdGV4dENoYW5nZSA9IGdldFRleHRDaGFuZ2UobWFwcGluZ0ZpbGUpOwotCQlpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0JCQl0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKHRoaXMuZ2V0TWFwcGluZ0ZpbGVDaGFuZ2VOYW1lKCksIG1hcHBpbmdGaWxlKTsKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQl0ZXh0Q2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0JCQljb21wb3NpdGVDaGFuZ2UuYWRkKHRleHRDaGFuZ2UpOwotCQl9Ci0JCXRoaXMuYWRkRWRpdHModGV4dENoYW5nZSwgcmVwbGFjZWRUeXBlRWRpdHMpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TWFwcGluZ0ZpbGVDaGFuZ2VOYW1lKCk7Ci0KLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7ICAvLyB0aGUgY29udGV4dCBtb2RlbCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAxIHBlcnNpc3RlbmNlIHVuaXQKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVkaXRzKFRleHRDaGFuZ2UgdGV4dENoYW5nZSwgSXRlcmFibGU8PyBleHRlbmRzIFRleHRFZGl0PiB0ZXh0RWRpdHMpIHsKLQkJZm9yIChUZXh0RWRpdCB0ZXh0RWRpdCA6IHRleHRFZGl0cykgewotCQkJdHJ5IHsKLQkJCQl0ZXh0Q2hhbmdlLmFkZEVkaXQodGV4dEVkaXQpOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZXgpIHsKLQkJCQkvL2xvZyBleGNlcHRpb24gYW5kIGRvbid0IGFkZCB0aGlzIHBlcnNpc3RlbmNlLnhtbCB0eXBlIGRlbGV0aW9uIHRvIHRoZSBjb25mbGljdGluZyBjaGFuZ2Ugb2JqZWN0Ci0JCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0Fic3RyYWN0SnBhUmVuYW1lSmF2YUVsZW1lbnRQYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvQWJzdHJhY3RKcGFSZW5hbWVKYXZhRWxlbWVudFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzE1M2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvQWJzdHJhY3RKcGFSZW5hbWVKYXZhRWxlbWVudFBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZXNvdXJjZUNoYW5nZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYVJlbmFtZUphdmFFbGVtZW50UGFydGljaXBhbnQKLQlleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByb3RlY3RlZCBJSmF2YUVsZW1lbnQgb3JpZ2luYWxKYXZhRWxlbWVudDsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSBwZXJzaXN0ZW5jZS54bWwgUmVwbGFjZUVkaXRzIGluIHRoZSBjaGVja0NvbmRpdGlvbnMoKSBjYWxsIAotCSAqIHRvIGF2b2lkIGR1cGxpY2F0ZWQgZWZmb3J0IGluIGNyZWF0ZUNoYW5nZSgpLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNYXA8SUZpbGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4gcGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHM7Ci0KLQkvKioKLQkgKiBTdG9yZSB0aGUgbWFwcGluZyBmaWxlIFJlcGxhY2VFZGl0cyBpbiB0aGUgY2hlY2tDb25kaXRpb25zKCkgY2FsbCAKLQkgKiB0byBhdm9pZCBkdXBsaWNhdGVkIGVmZm9ydCBpbiBjcmVhdGVDaGFuZ2UoKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPElGaWxlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+IG1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0SnBhUmVuYW1lSmF2YUVsZW1lbnRQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cyA9IG5ldyBIYXNoTWFwPElGaWxlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KCk7Ci0JCXRoaXMubWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMgPSBuZXcgSGFzaE1hcDxJRmlsZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCFnZXRBcmd1bWVudHMoKS5nZXRVcGRhdGVSZWZlcmVuY2VzKCkpIHsKLQkJCS8vd2UgZG8gbm90IHdhbnQgdG8gZG8gYW55IHJlZmFjdG9yaW5nIGlmIHRoZSB1c2VyIGNob29zZXMgbm90IHRvIHVwZGF0ZSByZWZlcmVuY2VzCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhpcy5vcmlnaW5hbEphdmFFbGVtZW50ID0gKElKYXZhRWxlbWVudCkgZWxlbWVudDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElKYXZhRWxlbWVudCBnZXRPcmlnaW5hbEphdmFFbGVtZW50KCkgewotCQlyZXR1cm4gdGhpcy5vcmlnaW5hbEphdmFFbGVtZW50OwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqIFJlZmFjdG9yaW5nUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIEluZm9ybSB0aGUgcmVmYWN0b3JpbmcgcHJvY2Vzc29yIG9mIGFueSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBjaGFuZ2UuIEluIHRoZSBwcm9jZXNzIG9mIGRldGVybWluaW5nCi0JICogdGhpcyBnbyBhaGVhZCBhbmQgYnVpbGQgdXAgdGhlIGFwcHJvcHJpYXRlIFJlcGxhY2VFZGl0cyB0byBiZSB1c2VkIGluIHRoZSBjcmVhdGVDaGFuZ2UoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCW1vbml0b3Iuc3ViVGFzayhKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVGQUNPUklOR19QQVJUSUNJUEFOVF9MT0FESU5HX0pQQV9QUk9KRUNUU19TVUJfVEFTS19OQU1FKTsKLQkJSnBhUHJvamVjdE1hbmFnZXIganBhUHJvamVjdE1hbmFnZXIgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCk7Ci0JCWlmIChqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0c1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIGpwYVByb2plY3RNYW5hZ2VyLmdldEpwYVByb2plY3RzU2l6ZSgpKjEwICsgMik7Ci0JCXNtLnN1YlRhc2sodGhpcy5nZXRDaGVja0NvbmRpdGlvbnNTdWJUYXNrTmFtZSgpKTsKLQkJUmVzb3VyY2VDaGFuZ2VDaGVja2VyIGNoZWNrZXIgPSAoUmVzb3VyY2VDaGFuZ2VDaGVja2VyKSBjb250ZXh0LmdldENoZWNrZXIoUmVzb3VyY2VDaGFuZ2VDaGVja2VyLmNsYXNzKTsKLQkJSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5IGRlbHRhRmFjdG9yeSA9IGNoZWNrZXIuZ2V0RGVsdGFGYWN0b3J5KCk7Ci0KLQkJZm9yIChKcGFQcm9qZWN0IGpwYVByb2plY3QgOiBqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0cygpKSB7Ci0JCQl0aGlzLmNyZWF0ZVJlcGxhY2VFZGl0cyhzbS5uZXdDaGlsZCgxMCksIGpwYVByb2plY3QpOwotCQl9Ci0JCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWZvciAoSUZpbGUgZmlsZSA6IHRoaXMucGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMua2V5U2V0KCkpIHsKLQkJCWRlbHRhRmFjdG9yeS5jaGFuZ2UoZmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQlmb3IgKElGaWxlIGZpbGUgOiB0aGlzLm1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlkZWx0YUZhY3RvcnkuY2hhbmdlKGZpbGUpOwotCQl9Ci0JCXNtLndvcmtlZCgxKTsKLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29tcG9zaXRlQ2hhbmdlTmFtZSgpOwotCi0JLyoqCi0JICogVGhpcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBtYWluIHJlZmFjdG9yaW5nIHRhc2sgbmFtZWQgOiAnQ2hlY2tpbmcgcHJlY29uZGl0aW9ucy4uLicKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENoZWNrQ29uZGl0aW9uc1N1YlRhc2tOYW1lKCk7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmlzRW1wdHkoKSAmJiB0aGlzLm1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLnNpemUoKSArIHRoaXMubWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMuc2l6ZSgpKTsKLQkJc20uc3ViVGFzayh0aGlzLmdldENyZWF0ZUNoYW5nZVN1YlRhc2tOYW1lKCkpOwotCQlDb21wb3NpdGVDaGFuZ2UgY29tcG9zaXRlQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZSh0aGlzLmdldENvbXBvc2l0ZUNoYW5nZU5hbWUoKSk7Ci0JCWZvciAoSUZpbGUgcGVyc2lzdGVuY2VYbWxGaWxlIDogdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cy5rZXlTZXQoKSkgewotCQkJdGhpcy5hZGRQZXJzaXN0ZW5jZVhtbFJlbmFtZUVkaXRzKHBlcnNpc3RlbmNlWG1sRmlsZSwgY29tcG9zaXRlQ2hhbmdlKTsKLQkJCXNtLndvcmtlZCgxKTsKLQkJfQotCQlmb3IgKElGaWxlIG1hcHBpbmdGaWxlIDogdGhpcy5tYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5rZXlTZXQoKSkgewotCQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5hZGRNYXBwaW5nRmlsZVJlbmFtZUVkaXRzKG1hcHBpbmdGaWxlLCBjb21wb3NpdGVDaGFuZ2UpOwotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JCS8vbXVzdCBjaGVjayBmb3IgY2hpbGRyZW4gaW4gY2FzZSBhbGwgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gb3RoZXIgcGFydGljaXBhbnQncyBUZXh0Q2hhbmdlcywgCi0JCS8vd2FudCB0byByZXR1cm4gbnVsbCBzbyBvdXIgbm9kZSBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIHByZXZpZXcgdHJlZQotCQlyZXR1cm4gY29tcG9zaXRlQ2hhbmdlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDAgPyBudWxsIDogY29tcG9zaXRlQ2hhbmdlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgbWFpbiByZWZhY3RvcmluZyB0YXNrIG5hbWVkIDogJ0NyZWF0aW5nIHdvcmtzcGFjZSBtb2RpZmljYXRpb25zLi4uJwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q3JlYXRlQ2hhbmdlU3ViVGFza05hbWUoKTsKLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJlcGxhY2VFZGl0cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIEpwYVByb2plY3QganBhUHJvamVjdCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCAxICsgcGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7Ci0JCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjbGFzc1JlZkRlbGV0ZUVkaXRzID0gdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0c0NoZWNrQ2xhc3NwYXRoKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCXNtLndvcmtlZCgxKTsKLQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShjbGFzc1JlZkRlbGV0ZUVkaXRzKSkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cy5wdXQoanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpLCBjbGFzc1JlZkRlbGV0ZUVkaXRzKTsKLQkJfQotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogcGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gbWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMgPSB0aGlzLmNyZWF0ZU1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzQ2hlY2tDbGFzc3BhdGgobWFwcGluZ0ZpbGVSZWYpOwotCQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShtYXBwaW5nRmlsZVJlcGxhY2VFZGl0cykpIHsKLQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBtYXBwaW5nRmlsZVJlZi5nZXRNYXBwaW5nRmlsZSgpLmdldFJlc291cmNlKCk7Ci0JCQkJdGhpcy5tYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5wdXQoZmlsZSwgbWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMpOwotCQkJfQotCQkJc20ud29ya2VkKDEpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHNDaGVja0NsYXNzcGF0aChQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7CQkKLQkJLy9jaGVjayBpc09uQ2xhc3NQYXRoIHNpbmNlIHRoZXJlIGNvdWxkIGJlIHR5cGVzIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgcHJvamVjdHMKLQkJaWYgKHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKS5pc09uQ2xhc3NwYXRoKHRoaXMub3JpZ2luYWxKYXZhRWxlbWVudCkpIHsKLQkJCXJldHVybiBjcmVhdGVQZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cyhwZXJzaXN0ZW5jZVVuaXQpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cyhQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KTsKLQotCXByb3RlY3RlZCB2b2lkIGFkZFBlcnNpc3RlbmNlWG1sUmVuYW1lRWRpdHMoSUZpbGUgcGVyc2lzdGVuY2VYbWxGaWxlLCBDb21wb3NpdGVDaGFuZ2UgY29tcG9zaXRlQ2hhbmdlKSB7Ci0JCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiByZXBsYWNlUGFja2FnZUVkaXRzID0gdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cy5nZXQocGVyc2lzdGVuY2VYbWxGaWxlKTsKLQotCQlUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBnZXRUZXh0Q2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCWlmICh0ZXh0Q2hhbmdlID09IG51bGwpIHsKLQkJCXRleHRDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UodGhpcy5nZXRQZXJzaXN0ZW5jZVhtbENoYW5nZU5hbWUoKSwgcGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJCS8vVE9ETyBwcm9iYWJseSBuZWVkIHRvIGZpZ3VyZSBvdXQgVGV4dEVkaXRHcm91cHMgc2luY2UgdGhlc2UgY2FuIGJlIHVzZWQgdG8gc2hvdyBjaGVjayBib3hlcyB1bmRlciB0aGUgZmlsZSBpbiB0aGUgcHJldmlldyBkaWFsb2cKLQkJCS8vYWxzbyB1c2VkIHRvIGFkZCBlZGl0cyB0byBleGlzdGluZyBjaGFuZ2VzPz8KLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQl0ZXh0Q2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0vLwkJCXRleHRDaGFuZ2UuYWRkVGV4dEVkaXRHcm91cChuZXcgVGV4dEVkaXRHcm91cCgiZWRpdCBwZXJzaXN0ZW5jZSB1bml0IiwgbXVsdGlUZXh0RWRpdCkpOz8/PwotCQkJY29tcG9zaXRlQ2hhbmdlLmFkZCh0ZXh0Q2hhbmdlKTsKLQkJfQotCQl0aGlzLmFkZEVkaXRzKHRleHRDaGFuZ2UsIHJlcGxhY2VQYWNrYWdlRWRpdHMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBlcnNpc3RlbmNlWG1sQ2hhbmdlTmFtZSgpOwotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBwaW5nRmlsZVJlcGxhY2VFZGl0c0NoZWNrQ2xhc3NwYXRoKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKSB7CQkKLQkJLy9jaGVjayBpc09uQ2xhc3NQYXRoIHNpbmNlIHRoZXJlIGNvdWxkIGJlIHR5cGVzIHdpdGggdGhlIHNhbWUgbmFtZSBpbiBkaWZmZXJlbnQgcHJvamVjdHMKLQkJaWYgKG1hcHBpbmdGaWxlUmVmLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpLmlzT25DbGFzc3BhdGgodGhpcy5vcmlnaW5hbEphdmFFbGVtZW50KSkgewotCQkJcmV0dXJuIHRoaXMuY3JlYXRlTWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMobWFwcGluZ0ZpbGVSZWYpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlTWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMoTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpOwotCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZ0ZpbGVSZW5hbWVFZGl0cyhJRmlsZSBtYXBwaW5nRmlsZSwgQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSkgewotCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gcmVwbGFjZWRUeXBlRWRpdHMgPSB0aGlzLm1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmdldChtYXBwaW5nRmlsZSk7Ci0KLQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0VGV4dENoYW5nZShtYXBwaW5nRmlsZSk7Ci0JCWlmICh0ZXh0Q2hhbmdlID09IG51bGwpIHsKLQkJCXRleHRDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UodGhpcy5nZXRNYXBwaW5nRmlsZUNoYW5nZU5hbWUoKSwgbWFwcGluZ0ZpbGUpOwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCXRleHRDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQkJCWNvbXBvc2l0ZUNoYW5nZS5hZGQodGV4dENoYW5nZSk7Ci0JCX0KLQkJdGhpcy5hZGRFZGl0cyh0ZXh0Q2hhbmdlLCByZXBsYWNlZFR5cGVFZGl0cyk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRNYXBwaW5nRmlsZUNoYW5nZU5hbWUoKTsKLQotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsgIC8vIHRoZSBjb250ZXh0IG1vZGVsIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgcGVyc2lzdGVuY2UgdW5pdAotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRWRpdHMoVGV4dENoYW5nZSB0ZXh0Q2hhbmdlLCBJdGVyYWJsZTw/IGV4dGVuZHMgVGV4dEVkaXQ+IHRleHRFZGl0cykgewotCQlmb3IgKFRleHRFZGl0IHRleHRFZGl0IDogdGV4dEVkaXRzKSB7Ci0JCQl0cnkgewotCQkJCXRleHRDaGFuZ2UuYWRkRWRpdCh0ZXh0RWRpdCk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vbG9nIGV4Y2VwdGlvbiBhbmQgZG9uJ3QgYWRkIHRoaXMgcGVyc2lzdGVuY2UueG1sIHR5cGUgZGVsZXRpb24gdG8gdGhlIGNvbmZsaWN0aW5nIGNoYW5nZSBvYmplY3QKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZjFhODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIGNvcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfREVMRVRFX1RZUEVfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfREVMRVRFX1BBQ0tBR0VfT1JfRk9MREVSX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX0RFTEVURV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9ERUxFVEVfVFlQRV9SRUZBQ1RPUklOR19DSEFOR0VfUEVSU0lTVEVOQ0VfWE1MX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX0RFTEVURV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9NQVBQSU5HX0ZJTEVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfREVMRVRFX1RZUEVfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfREVMRVRFX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9ERUxFVEVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX0RFTEVURV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX0RFTEVURV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9SRUZBQ09SSU5HX1BBUlRJQ0lQQU5UX0xPQURJTkdfSlBBX1BST0pFQ1RTX1NVQl9UQVNLX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfUkVOQU1FX1RZUEVfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfUkVOQU1FX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfUkVOQU1FX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX01BUFBJTkdfRklMRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9SRU5BTUVfVFlQRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9QQUNLQUdFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9QQUNLQUdFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9SRU5BTUVfUEFDS0FHRV9SRUZBQ1RPUklOR19DSEFOR0VfUEVSU0lTVEVOQ0VfWE1MX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9QQUNLQUdFX1JFRkFDVE9SSU5HX0NIQU5HRV9NQVBQSU5HX0ZJTEVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfUkVOQU1FX1BBQ0tBR0VfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9SRU5BTUVfRk9MREVSX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9GT0xERVJfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9GT0xERVJfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9SRU5BTUVfRk9MREVSX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfUkVOQU1FX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9SRU5BTUVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX1JFTkFNRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfVFlQRV9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfVFlQRV9SRUZBQ1RPUklOR19DSEFOR0VfUEVSU0lTVEVOQ0VfWE1MX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfVFlQRV9SRUZBQ1RPUklOR19DSEFOR0VfTUFQUElOR19GSUxFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfVFlQRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQV9NT1ZFX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19DSEFOR0VfUEVSU0lTVEVOQ0VfWE1MX05BTUU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfTU9WRV9GT0xERVJfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfTU9WRV9GT0xERVJfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBX01PVkVfRk9MREVSX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFfTU9WRV9GT0xERVJfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcGFfY29yZV9yZWZhY3RvcmluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQkKLQlwcml2YXRlIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYURlbGV0ZU1hcHBpbmdGaWxlUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYURlbGV0ZU1hcHBpbmdGaWxlUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFmZDcyNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFEZWxldGVNYXBwaW5nRmlsZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNvbXBvc2l0ZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5SZWZhY3RvcmluZ1N0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0Q2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRGaWxlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5EZWxldGVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkRlbGV0ZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5JU2hhcmFibGVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlc291cmNlQ2hhbmdlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotCi0vKioKLSAqIFBhcnRpY2lwYW50IGluIHRoZSBkZWxldGUgcmVmYWN0b3Jpbmcgb2Yge0BsaW5rIElGaWxlfXMgd2l0aCBjb250ZW50IHR5cGUge0BsaW5rIEpwdEpwYUNvcmVQbHVnaW4jTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRX0uCi0gKiBJZiB0aGUgZGVsZXRlZCBtYXBwaW5nIGZpbGUgaXMgbGlzdGVkIGluIGEgcGVyc2lzdGVuY2UueG1sIGZpbGUgb2YgYW55IEpwYVByb2plY3QKLSAqIHRoZW4gYSBDaGFuZ2Ugb2JqZWN0IGlzIGNyZWF0ZWQgdGhhdCB3aWxsIGRlbGV0ZSB0aGF0IHJlZmVyZW5jZSBmcm9tIHRoZSBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgSnBhRGVsZXRlTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudAotCWV4dGVuZHMgRGVsZXRlUGFydGljaXBhbnQgCi0JaW1wbGVtZW50cyBJU2hhcmFibGVQYXJ0aWNpcGFudAotewotCi0JLyoqCi0JICogU3RvcmUgdGhlIHtAbGluayBJRmlsZX1zIHRvIGJlIGRlbGV0ZWQgd2l0aCBjb250ZW50IHR5cGUge0BsaW5rIEpwdEpwYUNvcmVQbHVnaW4jTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRX0KLQkgKiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgRGVsZXRlQXJndW1lbnRzfQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBNYXA8SUZpbGUsIERlbGV0ZUFyZ3VtZW50cz4gbWFwcGluZ0ZpbGVzOwotCi0JLyoqCi0JICogU3RvcmUgdGhlIHBlcnNpc3RlbmNlLnhtbCBEZWxldGVFZGl0cyBpbiB0aGUgY2hlY2tDb25kaXRpb25zKCkgY2FsbCAKLQkgKiB0byBhdm9pZCBkdXBsaWNhdGVkIGVmZm9ydCBpbiBjcmVhdGVDaGFuZ2UoKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPElGaWxlLCBJdGVyYWJsZTxEZWxldGVFZGl0Pj4gcGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZURlbGV0ZUVkaXRzOwotCi0JcHVibGljIEpwYURlbGV0ZU1hcHBpbmdGaWxlUGFydGljaXBhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubWFwcGluZ0ZpbGVzID0gbmV3IEhhc2hNYXA8SUZpbGUsIERlbGV0ZUFyZ3VtZW50cz4oKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlRGVsZXRlRWRpdHMgPSBuZXcgSGFzaE1hcDxJRmlsZSwgSXRlcmFibGU8RGVsZXRlRWRpdD4+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9ERUxFVEVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQl0aGlzLmFkZEVsZW1lbnQoZWxlbWVudCwgZ2V0QXJndW1lbnRzKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKklTaGFyYWJsZVBhcnRpY2lwYW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCi0JLyoqCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gbXVsdGlwbGUgbWFwcGluZyBmaWxlcyBhcmUgZGVsZXRlZC4KLQkgKiBSZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoT2JqZWN0KSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCBkZWxldGVkIElGaWxlLgotCSAqIFJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0QXJndW1lbnRzKCkgb25seSBhcHBsaWVzIHRvIHRoZSBmaXJzdCBkZWxldGVkIElGaWxlCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChPYmplY3QgZWxlbWVudCwgUmVmYWN0b3JpbmdBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0JCXRoaXMubWFwcGluZ0ZpbGVzLnB1dCgoSUZpbGUpIGVsZW1lbnQsIChEZWxldGVBcmd1bWVudHMpIGFyZ3VtZW50cyk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogSW5mb3JtIHRoZSByZWZhY3RvcmluZyBwcm9jZXNzb3Igb2YgYW55IGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGNoYW5nZS4gSW4gdGhlIHByb2Nlc3Mgb2YgZGV0ZXJtaW5pbmcKLQkgKiB0aGlzIGdvIGFoZWFkIGFuZCBidWlsZCB1cCB0aGUgYXBwcm9wcmlhdGUgRGVsZXRlRWRpdHMgdG8gYmUgdXNlZCBpbiB0aGUgY3JlYXRlQ2hhbmdlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvL3NpbmNlIHRoZSBwcm9ncmVzcyBiYXIgd2lsbCBoYW5nIGlmIGEgbGFyZ2UgSlBBIHByb2plY3QgaXMgYmVpbmcgbG9hZGVkLCAKLQkJLy93ZSBjYW4gYXQgbGVhc3Qgc2V0IHRoZSBzdWJ0YXNrIGFuZCByZXBvcnQgbm8gcHJvZ3Jlc3MuIE9ubHkgaGFwcGVucyBmaXJzdCB0aW1lIGdldEpwYVByb2plY3RNYW5hZ2VyKCkgaXMgY2FsbGVkLgotCQltb25pdG9yLnN1YlRhc2soSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFRkFDT1JJTkdfUEFSVElDSVBBTlRfTE9BRElOR19KUEFfUFJPSkVDVFNfU1VCX1RBU0tfTkFNRSk7Ci0JCUpwYVByb2plY3RNYW5hZ2VyIGpwYVByb2plY3RNYW5hZ2VyID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpOwotCQlpZiAoanBhUHJvamVjdE1hbmFnZXIuZ2V0SnBhUHJvamVjdHNTaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0c1NpemUoKSoxMCArIDEpOwotCQlzbS5zdWJUYXNrKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9ERUxFVEVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUUpOwotCQlSZXNvdXJjZUNoYW5nZUNoZWNrZXIgY2hlY2tlciA9IChSZXNvdXJjZUNoYW5nZUNoZWNrZXIpIGNvbnRleHQuZ2V0Q2hlY2tlcihSZXNvdXJjZUNoYW5nZUNoZWNrZXIuY2xhc3MpOwotCQlJUmVzb3VyY2VDaGFuZ2VEZXNjcmlwdGlvbkZhY3RvcnkgZGVsdGFGYWN0b3J5ID0gY2hlY2tlci5nZXREZWx0YUZhY3RvcnkoKTsKLQotCQlmb3IgKEpwYVByb2plY3QganBhUHJvamVjdCA6IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRKcGFQcm9qZWN0cygpKSB7Ci0JCQl0aGlzLmNyZWF0ZURlbGV0ZUVkaXRzKGpwYVByb2plY3QpOwotCQkJc20ud29ya2VkKDEwKTsKLQkJfQotCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlmb3IgKElGaWxlIHBlcnNpc3RlbmNlWG1sRmlsZSA6IHRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZURlbGV0ZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlkZWx0YUZhY3RvcnkuY2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZWxldGVFZGl0cyhKcGFQcm9qZWN0IGpwYVByb2plY3QpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNsYXNzUmVmRGVsZXRlRWRpdHMgPSB0aGlzLmNyZWF0ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmRGVsZXRlRWRpdHMocGVyc2lzdGVuY2VVbml0KTsKLQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShjbGFzc1JlZkRlbGV0ZUVkaXRzKSkgewotCQkJdGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlRGVsZXRlRWRpdHMucHV0KGpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldEZpbGUoKSwgY2xhc3NSZWZEZWxldGVFZGl0cyk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sTWFwcGluZ0ZpbGVEZWxldGVFZGl0cy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgdGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlRGVsZXRlRWRpdHMuc2l6ZSgpKTsKLQkJc20uc3ViVGFzayhKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfREVMRVRFX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX0RFTEVURV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUUpOwotCQlmb3IgKElGaWxlIHBlcnNpc3RlbmNlWG1sRmlsZSA6IHRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZURlbGV0ZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmFkZFBlcnNpc3RlbmNlWG1sRGVsZXRlTWFwcGluZ0ZpbGVDaGFuZ2UocGVyc2lzdGVuY2VYbWxGaWxlLCBjb21wb3NpdGVDaGFuZ2UpOwkJCQotCQl9Ci0JCS8vbXVzdCBjaGVjayBmb3IgY2hpbGRyZW4gaW4gY2FzZSBhbGwgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gb3RoZXIgcGFydGljaXBhbnRzIFRleHRDaGFuZ2VzLCAKLQkJLy93YW50IHRvIHJldHVybiBudWxsIHNvIG91ciBub2RlIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgcHJldmlldyB0cmVlCi0JCXJldHVybiBjb21wb3NpdGVDaGFuZ2UuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCA/IG51bGwgOiBjb21wb3NpdGVDaGFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEZWxldGVFZGl0PiBjcmVhdGVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZkRlbGV0ZUVkaXRzKGZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxEZWxldGVFZGl0PigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElGaWxlLCBJdGVyYWJsZTxEZWxldGVFZGl0Pj4odGhpcy5tYXBwaW5nRmlsZXMua2V5U2V0KCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8RGVsZXRlRWRpdD4gdHJhbnNmb3JtKElGaWxlIGZpbGUpIHsKLQkJCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdC5jcmVhdGVEZWxldGVNYXBwaW5nRmlsZUVkaXRzKGZpbGUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyc2lzdGVuY2VYbWxEZWxldGVNYXBwaW5nRmlsZUNoYW5nZShJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUsIENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UpIHsKLQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0VGV4dENoYW5nZShwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQlpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0JCQl0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9ERUxFVEVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRSwgcGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQl0ZXh0Q2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0JCQljb21wb3NpdGVDaGFuZ2UuYWRkKHRleHRDaGFuZ2UpOwotCQl9Ci0JCUl0ZXJhYmxlPERlbGV0ZUVkaXQ+IG1hcHBpbmdGaWxlRGVsZXRlRWRpdHMgPSB0aGlzLnBlcnNpc3RlbmNlWG1sTWFwcGluZ0ZpbGVEZWxldGVFZGl0cy5nZXQocGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJdGhpcy5hZGRFZGl0cyh0ZXh0Q2hhbmdlLCBtYXBwaW5nRmlsZURlbGV0ZUVkaXRzKTsKLQl9Ci0KLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7IC8vIHRoZSBjb250ZXh0IG1vZGVsIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgcGVyc2lzdGVuY2UgdW5pdAotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVkaXRzKFRleHRDaGFuZ2UgdGV4dENoYW5nZSwgSXRlcmFibGU8PyBleHRlbmRzIFRleHRFZGl0PiB0ZXh0RWRpdHMpIHsKLQkJZm9yIChUZXh0RWRpdCB0ZXh0RWRpdCA6IHRleHRFZGl0cykgewotCQkJdHJ5IHsKLQkJCQl0ZXh0Q2hhbmdlLmFkZEVkaXQodGV4dEVkaXQpOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJCS8vbG9nIGV4Y2VwdGlvbiBhbmQgZG9uJ3QgYWRkIHRoaXMgcGVyc2lzdGVuY2UueG1sIHR5cGUgZGVsZXRpb24gdG8gdGhlIGNvbmZsaWN0aW5nIGNoYW5nZSBvYmplY3QKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFEZWxldGVQYWNrYWdlT3JGb2xkZXJQYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhRGVsZXRlUGFja2FnZU9yRm9sZGVyUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2N2NlYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFEZWxldGVQYWNrYWdlT3JGb2xkZXJQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LkpEVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLklTaGFyYWJsZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ0FyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuRGVsZXRlRWRpdDsKLQotcHVibGljIGNsYXNzIEpwYURlbGV0ZVBhY2thZ2VPckZvbGRlclBhcnRpY2lwYW50Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYURlbGV0ZVR5cGVQYXJ0aWNpcGFudAotCWltcGxlbWVudHMgSVNoYXJhYmxlUGFydGljaXBhbnQKLXsKLQkKLQkvKiogCi0JICogVGhlIGZvbGRlcnMgdGhhdCBhcmUgZ29pbmcgdG8gYmUgZGVsZXRlZC4KLQkgKiBPbmx5IGZvbGRlcnMgd2hpY2ggYXJlIG5vdCBhbHNvIElQYWNrYWdlRnJhZ21lbnRzIG9yIElQYWNrYWdlRnJhZ21lbnRSb290cyBhcmUgYWRkZWQgdG8gdGhpcyBjb2xsZWN0aW9uLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPElGb2xkZXI+IGZvbGRlcnM7Ci0JCi0JLyoqIAotCSAqIFRoZSBJUGFja2FnZUZyYWdtZW50cyB0aGF0IGFyZSBnb2luZyB0byBiZSBkZWxldGVkLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPElQYWNrYWdlRnJhZ21lbnQ+IHBhY2thZ2VGcmFnbWVudHM7Ci0KLQlwdWJsaWMgSnBhRGVsZXRlUGFja2FnZU9yRm9sZGVyUGFydGljaXBhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZm9sZGVycyA9IG5ldyBBcnJheUxpc3Q8SUZvbGRlcj4oKTsKLQkJdGhpcy5wYWNrYWdlRnJhZ21lbnRzID0gbmV3IEFycmF5TGlzdDxJUGFja2FnZUZyYWdtZW50PigpOwotCX0KLQotCS8vKioqKioqKioqKioqKioqKiBSZWZhY3RvcmluZ1BhcnRpY2lwYW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX0RFTEVURV9QQUNLQUdFX09SX0ZPTERFUl9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGdldFByb2Nlc3NvcigpIGluc3RhbmNlb2YgUmVuYW1lUHJvY2Vzc29yKSB7Ci0JCQkvL1JlbmFtaW5nIGEgcGFja2FnZSB0aGF0IHRoZW4gZW5kcyB1cCB3aXRoIG5vIHN1YnBhY2thZ2VzIG9yIHR5cGVzIHdpbGwgY2FsbCB0aGUgZGVsZXRlIGZvbGRlciBwYXJ0aWNpcGFudC4KLQkJCS8vV2UgZG8gbm90IHdhbnQgdG8gZGVsZXRlIHJlZmVyZW5jZXMgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbCBhbmQgbWFwcGluZyBmaWxlcyBpbiB0aGlzIGNhc2UsIHdpbGwgYmUgaGFuZGxlZAotCQkJLy93aXRoIHRoZSByZW5hbWUgcGFydGljaXBhbnQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLmFkZEVsZW1lbnQoZWxlbWVudCwgZ2V0QXJndW1lbnRzKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyoqKioqKioqKioqKioqKiogSVNoYXJhYmxlUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiBtdWx0aXBsZSBJUGFja2FnZUZyYW1lbnRzL0lGb2xkZXJzIGFyZSBkZWxldGVkLgotCSAqIFJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShPYmplY3QpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IGRlbGV0ZWQgSVBhY2thZ2VGcmFnbWVudC9JRm9sZGVyLgotCSAqIFJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0QXJndW1lbnRzKCkgb25seSBhcHBsaWVzIHRvIHRoZSBmaXJzdCBkZWxldGVkIElQYWNrYWdlRnJhZ21lbnQvSUZvbGRlcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQsIFJlZmFjdG9yaW5nQXJndW1lbnRzIGFyZ3VtZW50cykgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IEphdmFDb3JlLmNyZWF0ZSgoSUZvbGRlcikgZWxlbWVudCk7Ci0JCQlpZiAoamF2YUVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChqYXZhRWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpIHsKLQkJCQkJdGhpcy5hZGRQYWNrYWdlRnJhZ21lbnRSb290KChJUGFja2FnZUZyYWdtZW50Um9vdCkgamF2YUVsZW1lbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdGhpcy5hZGRQYWNrYWdlRnJhZ21lbnQoKElQYWNrYWdlRnJhZ21lbnQpIGphdmFFbGVtZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmFkZEZvbGRlcigoSUZvbGRlcikgZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLmFkZFBhY2thZ2VGcmFnbWVudCgoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRGb2xkZXIoSUZvbGRlciBmb2xkZXIpIHsKLQkJdGhpcy5mb2xkZXJzLmFkZChmb2xkZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2VGcmFnbWVudFJvb3QoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCkgewotCQlpZiAoSkRUVG9vbHMucGFja2FnZUZyYWdtZW50Um9vdElzU291cmNlRm9sZGVyKHJvb3QpKSB7Ci0JCQlmb3IgKElKYXZhRWxlbWVudCBjaGlsZCA6IEpEVFRvb2xzLmdldENoaWxkcmVuKHJvb3QpKSB7Ci0JCQkJdGhpcy5hZGRQYWNrYWdlRnJhZ21lbnQoKElQYWNrYWdlRnJhZ21lbnQpIGNoaWxkKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQl0aGlzLnBhY2thZ2VGcmFnbWVudHMuYWRkKHBhY2thZ2VGcmFnbWVudCk7Ci0JCUNvbGxlY3Rpb248SVR5cGU+IGFsbERlbGV0ZWRUeXBlcyA9IG5ldyBIYXNoU2V0PElUeXBlPigpOwotCQlhZGRBZmZlY3RlZFR5cGVzKGFsbERlbGV0ZWRUeXBlcywgcGFja2FnZUZyYWdtZW50KTsKLQkJZm9yIChJVHlwZSBkZWxldGVkVHlwZSA6IGFsbERlbGV0ZWRUeXBlcykgewotCQkJdGhpcy5hZGRUeXBlKGRlbGV0ZWRUeXBlKTsKLQkJfQkJCi0JfQotCi0JLy9uZXN0ZWRUeXBlcyBhcmUgaGFuZGxlZCBpbiBBYnN0cmFjdEpwYURlbGV0ZVR5cGVQYXJ0aWNpcGFudAotCXN0YXRpYyB2b2lkIGFkZEFmZmVjdGVkVHlwZXMoQ29sbGVjdGlvbjxJVHlwZT4gdHlwZXMsIElQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQpIHsKLQkJdHJ5IHsKLQkJCWlmIChmcmFnbWVudC5jb250YWluc0phdmFSZXNvdXJjZXMoKSkgewotCQkJCUlDb21waWxhdGlvblVuaXRbXSBjdW5pdHMgPSBmcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXRzKCk7Ci0JCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdW5pdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdHlwZSA9IGN1bml0c1tpXS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdHlwZXMuYWRkKHR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQWRkIG1hcHBpbmcgZmlsZSBkZWxldGUgZWRpdHMgaGVyZSwgc3VwZXIuY3JlYXRlUGVyc2lzdGVuY2VYbWxEZWxldGVFZGl0cygpIGlzCi0JICogY2FsbGVkIHRvIGFkZCB0aGUgdHlwZSBkZWxldGUgZWRpdHMuCi0JICovCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPERlbGV0ZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlWG1sRGVsZXRlRWRpdHMoZmluYWwgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPERlbGV0ZUVkaXQ+KAotCQkJCXN1cGVyLmNyZWF0ZVBlcnNpc3RlbmNlWG1sRGVsZXRlRWRpdHMocGVyc2lzdGVuY2VVbml0KSwKLQkJCQluZXcgQ29tcG9zaXRlSXRlcmFibGU8RGVsZXRlRWRpdD4oCi0JCQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElGaWxlLCBJdGVyYWJsZTxEZWxldGVFZGl0Pj4odGhpcy5nZXRNYXBwaW5nRmlsZXNPbkNsYXNzcGF0aChwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8RGVsZXRlRWRpdD4gdHJhbnNmb3JtKElGaWxlIGZpbGUpIHsKLQkJCQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0LmNyZWF0ZURlbGV0ZU1hcHBpbmdGaWxlRWRpdHMoZmlsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpCi0JCQkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBJdGVyYWJsZTxJRmlsZT4gZ2V0TWFwcGluZ0ZpbGVzT25DbGFzc3BhdGgoZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCWZpbmFsIElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGpwYVByb2plY3QuZ2V0SmF2YVByb2plY3QoKTsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJRmlsZT4obmV3IENvbXBvc2l0ZUl0ZXJhYmxlPElGaWxlPigKLQkJCQlnZXRQb3NzaWJsZU1hcHBpbmdGaWxlc0luRm9sZGVycygpLAotCQkJCWdldFBvc3NpYmxlTWFwcGluZ0ZpbGVzSW5QYWNrYWdlRnJhZ21lbnRzKCkpKSAKLQkJCXsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSUZpbGUgZmlsZSkgewotCQkJCQlyZXR1cm4gamF2YVByb2plY3QuaXNPbkNsYXNzcGF0aChmaWxlKSAKLQkJCQkJCQkmJiBQbGF0Zm9ybVRvb2xzLmdldENvbnRlbnRUeXBlKGZpbGUpLmlzS2luZE9mKEpwdEpwYUNvcmVQbHVnaW4uTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRSk7Ci0JCQkJfQotCQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElGaWxlPiBnZXRQb3NzaWJsZU1hcHBpbmdGaWxlc0luRm9sZGVycygpIHsKLQkJQ29sbGVjdGlvbjxJRmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQlGb2xkZXJSZXNvdXJjZVByb3h5VmlzaXRvciB2aXNpdG9yID0gbmV3IEZvbGRlclJlc291cmNlUHJveHlWaXNpdG9yKGZpbGVzKTsKLQkJZm9yIChJRm9sZGVyIGZvbGRlciA6IHRoaXMuZm9sZGVycykgewotCQkJdmlzaXRvci52aXNpdEZvbGRlcihmb2xkZXIpOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8SUZpbGU+IGdldFBvc3NpYmxlTWFwcGluZ0ZpbGVzSW5QYWNrYWdlRnJhZ21lbnRzKCkgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPElGaWxlPigKLQkJCW5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElQYWNrYWdlRnJhZ21lbnQsIEl0ZXJhYmxlPElGaWxlPj4odGhpcy5wYWNrYWdlRnJhZ21lbnRzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPElGaWxlPiB0cmFuc2Zvcm0oSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJCQkJcmV0dXJuIGdldE5vbkphdmFGaWxlcyhwYWNrYWdlRnJhZ21lbnQpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEl0ZXJhYmxlPElGaWxlPiBnZXROb25KYXZhRmlsZXMoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQpIHsKLQkJQ29sbGVjdGlvbjxJRmlsZT4gZmlsZXMgPSBuZXcgQXJyYXlMaXN0PElGaWxlPigpOwotCQlPYmplY3RbXSByZXNvdXJjZXMgPSBnZXROb25KYXZhUmVzb3VyY2VzKHBhY2thZ2VGcmFnbWVudCk7Ci0JCWZvciAoT2JqZWN0IHJlc291cmNlIDogcmVzb3VyY2VzKSB7Ci0JCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCWZpbGVzLmFkZCgoSUZpbGUpIHJlc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBPYmplY3RbXSBnZXROb25KYXZhUmVzb3VyY2VzKElQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50LmdldE5vbkphdmFSZXNvdXJjZXMoKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGUpOwotCQkJcmV0dXJuIEVNUFRZX09CSkVDVF9BUlJBWTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RbXSBFTVBUWV9PQkpFQ1RfQVJSQVkgPSBuZXcgT2JqZWN0WzBdOwotCi0JcHJvdGVjdGVkIGNsYXNzIEZvbGRlclJlc291cmNlUHJveHlWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlUHJveHlWaXNpdG9yIHsKLQkJcHJpdmF0ZSBDb2xsZWN0aW9uPElGaWxlPiBmaWxlczsKLQkJcHJvdGVjdGVkIEZvbGRlclJlc291cmNlUHJveHlWaXNpdG9yKENvbGxlY3Rpb248SUZpbGU+IGZpbGVzKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5maWxlcyA9IGZpbGVzOwotCQl9Ci0JCXByb3RlY3RlZCB2b2lkIHZpc2l0Rm9sZGVyKElGb2xkZXIgZm9sZGVyKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5hY2NlcHQodGhpcywgSVJlc291cmNlLk5PTkUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4gLSB3ZSBkb24ndCB0aHJvdyBhbnkgQ29yZUV4Y2VwdGlvbnMKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlUHJveHkgcmVzb3VyY2UpIHsKLQkJCXN3aXRjaCAocmVzb3VyY2UuZ2V0VHlwZSgpKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7ICAvLyB2aXNpdCBjaGlsZHJlbgotCQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCQl0aGlzLmZpbGVzLmFkZCgoSUZpbGUpIHJlc291cmNlLnJlcXVlc3RSZXNvdXJjZSgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOyAgLy8gbm8gY2hpbGRyZW4KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFEZWxldGVUeXBlUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYURlbGV0ZVR5cGVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODAxNDk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYURlbGV0ZVR5cGVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuSVNoYXJhYmxlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nQXJndW1lbnRzOwotCi1wdWJsaWMgY2xhc3MgSnBhRGVsZXRlVHlwZVBhcnRpY2lwYW50Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYURlbGV0ZVR5cGVQYXJ0aWNpcGFudAotCWltcGxlbWVudHMgSVNoYXJhYmxlUGFydGljaXBhbnQKLXsKLQotCXB1YmxpYyBKcGFEZWxldGVUeXBlUGFydGljaXBhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQl0aGlzLmFkZEVsZW1lbnQoZWxlbWVudCwgZ2V0QXJndW1lbnRzKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfREVMRVRFX1RZUEVfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKklTaGFyYWJsZVBhcnRpY2lwYW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgd2hlbiBtdWx0aXBsZSBJVHlwZXMgYXJlIGRlbGV0ZWQuCi0JICogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKE9iamVjdCkgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgZGVsZXRlZCBJVHlwZS4KLQkgKiBSZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldEFyZ3VtZW50cygpIG9ubHkgYXBwbGllcyB0byB0aGUgZmlyc3QgZGVsZXRlZCBJVHlwZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQsIFJlZmFjdG9yaW5nQXJndW1lbnRzIGFyZ3VtZW50cykgewotCQl0aGlzLmFkZFR5cGUoKElUeXBlKSBlbGVtZW50KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhTW92ZUZvbGRlclBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFNb3ZlRm9sZGVyUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFhMDM1Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFNb3ZlRm9sZGVyUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuSVNoYXJhYmxlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlc291cmNlQ2hhbmdlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiBQYXJ0aWNpcGFudCBpbiB0aGUgbW92ZSByZWZhY3RvcmluZyBvZiB7QGxpbmsgSUZvbGRlcnN9cy4KLSAqIEFueSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlcyBpbiB0aGUgcGVyc2lzdGVuY2UueG1sIHdpbGwgYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgbG9jYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFNb3ZlRm9sZGVyUGFydGljaXBhbnQKLQlleHRlbmRzIE1vdmVQYXJ0aWNpcGFudAotCWltcGxlbWVudHMgSVNoYXJhYmxlUGFydGljaXBhbnQKLXsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSB7QGxpbmsgSUZvbGRlcn1zIHRvIGJlIG1vdmVkIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIE1vdmVBcmd1bWVudHMKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPElGb2xkZXIsIE1vdmVBcmd1bWVudHM+IG9yaWdpbmFsRm9sZGVyczsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSBwZXJzaXN0ZW5jZS54bWwgUmVwbGFjZUVkaXQgaW4gdGhlIGNoZWNrQ29uZGl0aW9ucygpIGNhbGwgCi0JICogdG8gYXZvaWQgZHVwbGljYXRlZCBlZmZvcnQgaW4gY3JlYXRlQ2hhbmdlKCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcDxJRmlsZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PiBwZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0czsKLQotCXB1YmxpYyBKcGFNb3ZlRm9sZGVyUGFydGljaXBhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMub3JpZ2luYWxGb2xkZXJzID0gbmV3IEhhc2hNYXA8SUZvbGRlciwgTW92ZUFyZ3VtZW50cz4oKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cyA9IG5ldyBIYXNoTWFwPElGaWxlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX0ZPTERFUl9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCFnZXRBcmd1bWVudHMoKS5nZXRVcGRhdGVSZWZlcmVuY2VzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLmFkZEVsZW1lbnQoZWxlbWVudCwgZ2V0QXJndW1lbnRzKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqSVNoYXJhYmxlUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIG11bHRpcGxlIGZvbGRlcnMgYXJlIG1vdmVkLgotCSAqIFJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShPYmplY3QpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IG1vdmVkIElGb2xkZXIuCi0JICogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXRBcmd1bWVudHMoKSBvbmx5IGFwcGxpZXMgdG8gdGhlIGZpcnN0IG1vdmVkIElGb2xkZXIuCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChPYmplY3QgZWxlbWVudCwgUmVmYWN0b3JpbmdBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0JCXRoaXMub3JpZ2luYWxGb2xkZXJzLnB1dCgoSUZvbGRlcikgZWxlbWVudCwgKE1vdmVBcmd1bWVudHMpIGFyZ3VtZW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1vdmVBcmd1bWVudHMgZ2V0QXJndW1lbnRzKElGb2xkZXIgZWxlbWVudCkgewotCQlyZXR1cm4gdGhpcy5vcmlnaW5hbEZvbGRlcnMuZ2V0KGVsZW1lbnQpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqIFJlZmFjdG9yaW5nUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIEluZm9ybSB0aGUgcmVmYWN0b3JpbmcgcHJvY2Vzc29yIG9mIGFueSBmaWxlcyB0aGF0IGFyZSBnb2luZyB0byBjaGFuZ2UuIEluIHRoZSBwcm9jZXNzIG9mIGRldGVybWluaW5nCi0JICogdGhpcyBnbyBhaGVhZCBhbmQgYnVpbGQgdXAgdGhlIGFwcHJvcHJpYXRlIFJlcGxhY2VFZGl0cyB0byBiZSB1c2VkIGluIHRoZSBjcmVhdGVDaGFuZ2UoKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHRocm93cyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCS8vc2luY2UgdGhlIHByb2dyZXNzIGJhciB3aWxsIGhhbmcgaWYgYSBsYXJnZSBKUEEgcHJvamVjdCBpcyBiZWluZyBsb2FkZWQsIAotCQkvL3dlIGNhbiBhdCBsZWFzdCBzZXQgdGhlIHN1YnRhc2sgYW5kIHJlcG9ydCBubyBwcm9ncmVzcy4gT25seSBoYXBwZW5zIGZpcnN0IHRpbWUgZ2V0SnBhUHJvamVjdE1hbmFnZXIoKSBpcyBjYWxsZWQuCi0JCW1vbml0b3Iuc3ViVGFzayhKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVGQUNPUklOR19QQVJUSUNJUEFOVF9MT0FESU5HX0pQQV9QUk9KRUNUU19TVUJfVEFTS19OQU1FKTsKLQkJSnBhUHJvamVjdE1hbmFnZXIganBhUHJvamVjdE1hbmFnZXIgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCk7Ci0JCWlmIChqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0c1NpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIGpwYVByb2plY3RNYW5hZ2VyLmdldEpwYVByb2plY3RzU2l6ZSgpKjEwICsgMSk7Ci0JCXNtLnN1YlRhc2soSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX01PVkVfRk9MREVSX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUUpOwotCQlSZXNvdXJjZUNoYW5nZUNoZWNrZXIgY2hlY2tlciA9IChSZXNvdXJjZUNoYW5nZUNoZWNrZXIpIGNvbnRleHQuZ2V0Q2hlY2tlcihSZXNvdXJjZUNoYW5nZUNoZWNrZXIuY2xhc3MpOwotCQlJUmVzb3VyY2VDaGFuZ2VEZXNjcmlwdGlvbkZhY3RvcnkgZGVsdGFGYWN0b3J5ID0gY2hlY2tlci5nZXREZWx0YUZhY3RvcnkoKTsKLQotCQlmb3IgKEpwYVByb2plY3QganBhUHJvamVjdCA6IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRKcGFQcm9qZWN0cygpKSB7Ci0JCQl0aGlzLmNyZWF0ZVJlcGxhY2VFZGl0cyhqcGFQcm9qZWN0KTsKLQkJCXNtLndvcmtlZCgxMCk7Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZm9yIChJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUgOiB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlkZWx0YUZhY3RvcnkuY2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXBsYWNlRWRpdHMoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gcmVwbGFjZUVkaXRzID0gdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZXBsYWNlRWRpdHNDaGVja0NsYXNzcGF0aChwZXJzaXN0ZW5jZVVuaXQpOwotCQlpZiAoIUNvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlcGxhY2VFZGl0cykpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMucHV0KGpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldEZpbGUoKSwgcmVwbGFjZUVkaXRzKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24sIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMucGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMuaXNFbXB0eSgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHRoaXMucGVyc2lzdGVuY2VYbWxSZXBsYWNlRWRpdHMuc2l6ZSgpKTsKLQkJc20uc3ViVGFzayhKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfTU9WRV9GT0xERVJfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX0ZPTERFUl9SRUZBQ1RPUklOR19DSEFOR0VfTkFNRSk7Ci0JCWZvciAoSUZpbGUgcGVyc2lzdGVuY2VYbWxGaWxlIDogdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cy5rZXlTZXQoKSkgewotCQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5hZGRQZXJzaXN0ZW5jZVhtbFJlbmFtZUNoYW5nZShwZXJzaXN0ZW5jZVhtbEZpbGUsIGNvbXBvc2l0ZUNoYW5nZSk7CQkJCi0JCX0KLQkJLy9tdXN0IGNoZWNrIGZvciBjaGlsZHJlbiBpbiBjYXNlIGFsbCBjaGFuZ2VzIHdlcmUgbWFkZSBpbiBvdGhlciBwYXJ0aWNpcGFudHMgVGV4dENoYW5nZXMsIAotCQkvL3dhbnQgdG8gcmV0dXJuIG51bGwgc28gb3VyIG5vZGUgZG9lcyBub3QgYXBwZWFyIGluIHRoZSBwcmV2aWV3IHRyZWUKLQkJcmV0dXJuIGNvbXBvc2l0ZUNoYW5nZS5nZXRDaGlsZHJlbigpLmxlbmd0aCA9PSAwID8gbnVsbCA6IGNvbXBvc2l0ZUNoYW5nZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlcGxhY2VFZGl0c0NoZWNrQ2xhc3NwYXRoKGZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJRm9sZGVyLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KHRoaXMuZ2V0T3JpZ2luYWxGb2xkZXJzT25DbGFzc3BhdGgocGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKSkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IHRyYW5zZm9ybShJRm9sZGVyIGZvbGRlcikgewotCQkJCQlyZXR1cm4gY3JlYXRlUGVyc2lzdGVuY2VVbml0UmVwbGFjZUVkaXRzKHBlcnNpc3RlbmNlVW5pdCwgZm9sZGVyLCAoSUNvbnRhaW5lcikgZ2V0QXJndW1lbnRzKGZvbGRlcikuZ2V0RGVzdGluYXRpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJRm9sZGVyPiBnZXRPcmlnaW5hbEZvbGRlcnNPbkNsYXNzcGF0aChmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElGb2xkZXI+KHRoaXMub3JpZ2luYWxGb2xkZXJzLmtleVNldCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJRm9sZGVyIGZvbGRlcikgewotCQkJCXJldHVybiBqYXZhUHJvamVjdC5pc09uQ2xhc3NwYXRoKGZvbGRlcik7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZXBsYWNlRWRpdHMoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgSUZvbGRlciBmb2xkZXIsIElDb250YWluZXIgZGVzdGluYXRpb24pIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGRlc3RpbmF0aW9uLmdldFByb2plY3QoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBkZXN0aW5hdGlvbi5nZXRGdWxsUGF0aCgpLmFwcGVuZChmb2xkZXIuZ2V0TmFtZSgpKTsKLQkJSVBhdGggcnVudGltZVBhdGggPSBKcHRDb21tb25Db3JlUGx1Z2luLmdldFJlc291cmNlTG9jYXRvcihwcm9qZWN0KS5nZXRSdW50aW1lUGF0aChwcm9qZWN0LCBmdWxsUGF0aCk7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQuY3JlYXRlTW92ZUZvbGRlckVkaXRzKGZvbGRlciwgcnVudGltZVBhdGgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJzaXN0ZW5jZVhtbFJlbmFtZUNoYW5nZShJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUsIENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UpIHsKLQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0VGV4dENoYW5nZShwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQlpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0JCQl0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX0ZPTERFUl9SRUZBQ1RPUklOR19DSEFOR0VfUEVSU0lTVEVOQ0VfWE1MX05BTUUsIHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCQlNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJdGV4dENoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotCQkJY29tcG9zaXRlQ2hhbmdlLmFkZCh0ZXh0Q2hhbmdlKTsKLQkJfQotCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gbWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMgPSB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmdldChwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQl0aGlzLmFkZEVkaXRzKHRleHRDaGFuZ2UsIG1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzKTsKLQl9Ci0KLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIG51bGw7IC8vIHRoZSBjb250ZXh0IG1vZGVsIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIDEgcGVyc2lzdGVuY2UgdW5pdAotCQl9Ci0JCXJldHVybiBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEVkaXRzKFRleHRDaGFuZ2UgdGV4dENoYW5nZSwgSXRlcmFibGU8PyBleHRlbmRzIFRleHRFZGl0PiB0ZXh0RWRpdHMpIHsKLQkJZm9yIChUZXh0RWRpdCB0ZXh0RWRpdCA6IHRleHRFZGl0cykgewotCQkJdHJ5IHsKLQkJCQl0ZXh0Q2hhbmdlLmFkZEVkaXQodGV4dEVkaXQpOwotCQkJfQotCQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJCS8vbG9nIGV4Y2VwdGlvbiBhbmQgZG9uJ3QgYWRkIHRoaXMgcGVyc2lzdGVuY2UueG1sIHR5cGUgZGVsZXRpb24gdG8gdGhlIGNvbmZsaWN0aW5nIGNoYW5nZSBvYmplY3QKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFNb3ZlTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhTW92ZU1hcHBpbmdGaWxlUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI2ZTY5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFNb3ZlTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5Db21wb3NpdGVJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuSVNoYXJhYmxlUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLk1vdmVQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdBcmd1bWVudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlc291cmNlQ2hhbmdlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiBQYXJ0aWNpcGFudCBpbiB0aGUgcmVuYW1lIHJlZmFjdG9yaW5nIG9mIHtAbGluayBJRmlsZX1zIHdpdGggY29udGVudCB0eXBlIHtAbGluayBKcHRKcGFDb3JlUGx1Z2luI01BUFBJTkdfRklMRV9DT05URU5UX1RZUEV9LgotICogSWYgdGhlIHJlbmFtZWQgbWFwcGluZyBmaWxlIGlzIGxpc3RlZCBpbiBhIHBlcnNpc3RlbmNlLnhtbCBmaWxlIG9mIGFueSBKcGFQcm9qZWN0Ci0gKiB0aGVuIGEgQ2hhbmdlIG9iamVjdCBpcyBjcmVhdGVkIHRoYXQgd2lsbCByZW5hbWUgdGhhdCByZWZlcmVuY2UgZnJvbSB0aGUgZmlsZS4KLSAqIElmIHRoZSByZW5hbWVkIG1hcHBpbmcgZmlsZSBpcyBhbiBpbXBsaWVkIG1hcHBpbmcgZmlsZSwgdGhlbiBhbiBhY3R1YWwgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nIGZpbGUgd2lsbCBiZSBzcGVjaWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFNb3ZlTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudAotCWV4dGVuZHMgTW92ZVBhcnRpY2lwYW50Ci0JaW1wbGVtZW50cyBJU2hhcmFibGVQYXJ0aWNpcGFudAotewotCi0JLyoqCi0JICogU3RvcmUgdGhlIHtAbGluayBJRmlsZX1zIHRvIGJlIHJlbmFtZWQgd2l0aCBjb250ZW50IHR5cGUge0BsaW5rIEpwdEpwYUNvcmVQbHVnaW4jTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRX0KLQkgKiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB7QGxpbmsgTW92ZUFyZ3VtZW50c30KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPElGaWxlLCBNb3ZlQXJndW1lbnRzPiBvcmlnaW5hbE1hcHBpbmdGaWxlczsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSBwZXJzaXN0ZW5jZS54bWwgUmVwbGFjZUVkaXQgaW4gdGhlIGNoZWNrQ29uZGl0aW9ucygpIGNhbGwgCi0JICogdG8gYXZvaWQgZHVwbGljYXRlZCBlZmZvcnQgaW4gY3JlYXRlQ2hhbmdlKCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcDxJRmlsZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PiBwZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzOwotCi0JcHVibGljIEpwYU1vdmVNYXBwaW5nRmlsZVBhcnRpY2lwYW50KCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9yaWdpbmFsTWFwcGluZ0ZpbGVzID0gbmV3IEhhc2hNYXA8SUZpbGUsIE1vdmVBcmd1bWVudHM+KCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyA9IG5ldyBIYXNoTWFwPElGaWxlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCFnZXRBcmd1bWVudHMoKS5nZXRVcGRhdGVSZWZlcmVuY2VzKCkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQl0aGlzLmFkZEVsZW1lbnQoZWxlbWVudCwgZ2V0QXJndW1lbnRzKCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLy8qKioqKioqKioqKioqKioqSVNoYXJhYmxlUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgaXMgdXNlZCB3aGVuIG11bHRpcGxlIG1hcHBpbmcgZmlsZXMgYXJlIGRlbGV0ZWQuCi0JICogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKE9iamVjdCkgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgZGVsZXRlZCBJRmlsZS4KLQkgKiBSZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldEFyZ3VtZW50cygpIG9ubHkgYXBwbGllcyB0byB0aGUgZmlyc3QgZGVsZXRlZCBJRmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoT2JqZWN0IGVsZW1lbnQsIFJlZmFjdG9yaW5nQXJndW1lbnRzIGFyZ3VtZW50cykgewotCQl0aGlzLm9yaWdpbmFsTWFwcGluZ0ZpbGVzLnB1dCgoSUZpbGUpIGVsZW1lbnQsIChNb3ZlQXJndW1lbnRzKSBhcmd1bWVudHMpOwotCX0KLQotCXByb3RlY3RlZCBNb3ZlQXJndW1lbnRzIGdldEFyZ3VtZW50cyhJRmlsZSBlbGVtZW50KSB7Ci0JCXJldHVybiB0aGlzLm9yaWdpbmFsTWFwcGluZ0ZpbGVzLmdldChlbGVtZW50KTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKiBSZWZhY3RvcmluZ1BhcnRpY2lwYW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbmZvcm0gdGhlIHJlZmFjdG9yaW5nIHByb2Nlc3NvciBvZiBhbnkgZmlsZXMgdGhhdCBhcmUgZ29pbmcgdG8gY2hhbmdlLiBJbiB0aGUgcHJvY2VzcyBvZiBkZXRlcm1pbmluZwotCSAqIHRoaXMgZ28gYWhlYWQgYW5kIGJ1aWxkIHVwIHRoZSBhcHByb3ByaWF0ZSBSZXBsYWNlRWRpdHMgdG8gYmUgdXNlZCBpbiB0aGUgY3JlYXRlQ2hhbmdlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvL3NpbmNlIHRoZSBwcm9ncmVzcyBiYXIgd2lsbCBoYW5nIGlmIGEgbGFyZ2UgSlBBIHByb2plY3QgaXMgYmVpbmcgbG9hZGVkLCAKLQkJLy93ZSBjYW4gYXQgbGVhc3Qgc2V0IHRoZSBzdWJ0YXNrIGFuZCByZXBvcnQgbm8gcHJvZ3Jlc3MuIE9ubHkgaGFwcGVucyBmaXJzdCB0aW1lIGdldEpwYVByb2plY3RNYW5hZ2VyKCkgaXMgY2FsbGVkLgotCQltb25pdG9yLnN1YlRhc2soSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFRkFDT1JJTkdfUEFSVElDSVBBTlRfTE9BRElOR19KUEFfUFJPSkVDVFNfU1VCX1RBU0tfTkFNRSk7Ci0JCUpwYVByb2plY3RNYW5hZ2VyIGpwYVByb2plY3RNYW5hZ2VyID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpOwotCQlpZiAoanBhUHJvamVjdE1hbmFnZXIuZ2V0SnBhUHJvamVjdHNTaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0c1NpemUoKSoxMCArIDEpOwotCQlzbS5zdWJUYXNrKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FKTsKLQkJUmVzb3VyY2VDaGFuZ2VDaGVja2VyIGNoZWNrZXIgPSAoUmVzb3VyY2VDaGFuZ2VDaGVja2VyKSBjb250ZXh0LmdldENoZWNrZXIoUmVzb3VyY2VDaGFuZ2VDaGVja2VyLmNsYXNzKTsKLQkJSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5IGRlbHRhRmFjdG9yeSA9IGNoZWNrZXIuZ2V0RGVsdGFGYWN0b3J5KCk7Ci0KLQkJZm9yIChKcGFQcm9qZWN0IGpwYVByb2plY3QgOiBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCkuZ2V0SnBhUHJvamVjdHMoKSkgewotCQkJdGhpcy5jcmVhdGVSZXBsYWNlRWRpdHMoanBhUHJvamVjdCk7Ci0JCQlzbS53b3JrZWQoMTApOwotCQl9Ci0JCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWZvciAoSUZpbGUgcGVyc2lzdGVuY2VYbWxGaWxlIDogdGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlkZWx0YUZhY3RvcnkuY2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXBsYWNlRWRpdHMoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gcmVwbGFjZUVkaXRzID0gdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZXBsYWNlRWRpdHNDaGVja0NsYXNzcGF0aChwZXJzaXN0ZW5jZVVuaXQpOwotCQlpZiAoIUNvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlcGxhY2VFZGl0cykpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5wdXQoanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpLCByZXBsYWNlRWRpdHMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCB0aGlzLnBlcnNpc3RlbmNlWG1sTWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMuc2l6ZSgpKTsKLQkJc20uc3ViVGFzayhKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfTU9WRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19DSEFOR0VfTkFNRSk7Ci0JCWZvciAoSUZpbGUgcGVyc2lzdGVuY2VYbWxGaWxlIDogdGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmFkZFBlcnNpc3RlbmNlWG1sUmVuYW1lTWFwcGluZ0ZpbGVDaGFuZ2UocGVyc2lzdGVuY2VYbWxGaWxlLCBjb21wb3NpdGVDaGFuZ2UpOwkJCQotCQl9Ci0JCS8vbXVzdCBjaGVjayBmb3IgY2hpbGRyZW4gaW4gY2FzZSBhbGwgY2hhbmdlcyB3ZXJlIG1hZGUgaW4gb3RoZXIgcGFydGljaXBhbnRzIFRleHRDaGFuZ2VzLCAKLQkJLy93YW50IHRvIHJldHVybiBudWxsIHNvIG91ciBub2RlIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgcHJldmlldyB0cmVlCi0JCXJldHVybiBjb21wb3NpdGVDaGFuZ2UuZ2V0Q2hpbGRyZW4oKS5sZW5ndGggPT0gMCA/IG51bGwgOiBjb21wb3NpdGVDaGFuZ2U7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlcGxhY2VFZGl0c0NoZWNrQ2xhc3NwYXRoKGZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJRmlsZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLmdldE9yaWdpbmFsRm9sZGVyc09uQ2xhc3NwYXRoKHBlcnNpc3RlbmNlVW5pdC5nZXRKcGFQcm9qZWN0KCkpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oSUZpbGUgbWFwcGluZ0ZpbGUpIHsKLQkJCQkJcmV0dXJuIGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlcGxhY2VFZGl0cyhwZXJzaXN0ZW5jZVVuaXQsIG1hcHBpbmdGaWxlLCAoSUZvbGRlcikgZ2V0QXJndW1lbnRzKG1hcHBpbmdGaWxlKS5nZXREZXN0aW5hdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPElGaWxlPiBnZXRPcmlnaW5hbEZvbGRlcnNPbkNsYXNzcGF0aChmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0l0ZXJhYmxlPElGaWxlPih0aGlzLm9yaWdpbmFsTWFwcGluZ0ZpbGVzLmtleVNldCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFjY2VwdChJRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIGphdmFQcm9qZWN0LmlzT25DbGFzc3BhdGgoZmlsZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUGVyc2lzdGVuY2VVbml0UmVwbGFjZUVkaXRzKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIElGaWxlIG1hcHBpbmdGaWxlLCBJRm9sZGVyIGRlc3RpbmF0aW9uKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBkZXN0aW5hdGlvbi5nZXRQcm9qZWN0KCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZGVzdGluYXRpb24uZ2V0RnVsbFBhdGgoKTsKLQkJSVBhdGggcnVudGltZVBhdGggPSBKcHRDb21tb25Db3JlUGx1Z2luLmdldFJlc291cmNlTG9jYXRvcihwcm9qZWN0KS5nZXRSdW50aW1lUGF0aChwcm9qZWN0LCBmdWxsUGF0aCk7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXQuY3JlYXRlTW92ZU1hcHBpbmdGaWxlRWRpdHMobWFwcGluZ0ZpbGUsIHJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyc2lzdGVuY2VYbWxSZW5hbWVNYXBwaW5nRmlsZUNoYW5nZShJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUsIENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UpIHsKLQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0VGV4dENoYW5nZShwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQlpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0JCQl0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19DSEFOR0VfUEVSU0lTVEVOQ0VfWE1MX05BTUUsIHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCQlNdWx0aVRleHRFZGl0IG11bHRpVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJdGV4dENoYW5nZS5zZXRFZGl0KG11bHRpVGV4dEVkaXQpOwotCQkJY29tcG9zaXRlQ2hhbmdlLmFkZCh0ZXh0Q2hhbmdlKTsKLQkJfQotCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gbWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMgPSB0aGlzLnBlcnNpc3RlbmNlWG1sTWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMuZ2V0KHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCXRoaXMuYWRkRWRpdHModGV4dENoYW5nZSwgbWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMpOwotCX0KLQotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gdGhlIGNvbnRleHQgbW9kZWwgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgMSBwZXJzaXN0ZW5jZSB1bml0Ci0JCX0KLQkJcmV0dXJuIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRWRpdHMoVGV4dENoYW5nZSB0ZXh0Q2hhbmdlLCBJdGVyYWJsZTw/IGV4dGVuZHMgVGV4dEVkaXQ+IHRleHRFZGl0cykgewotCQlmb3IgKFRleHRFZGl0IHRleHRFZGl0IDogdGV4dEVkaXRzKSB7Ci0JCQl0cnkgewotCQkJCXRleHRDaGFuZ2UuYWRkRWRpdCh0ZXh0RWRpdCk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9sb2cgZXhjZXB0aW9uIGFuZCBkb24ndCBhZGQgdGhpcyBwZXJzaXN0ZW5jZS54bWwgdHlwZSBkZWxldGlvbiB0byB0aGUgY29uZmxpY3RpbmcgY2hhbmdlIG9iamVjdAotCQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYU1vdmVUeXBlUGFydGljaXBhbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYU1vdmVUeXBlUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY5YWQyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFNb3ZlVHlwZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ0FyZ3VtZW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi1wdWJsaWMgY2xhc3MgSnBhTW92ZVR5cGVQYXJ0aWNpcGFudAotCWV4dGVuZHMgQWJzdHJhY3RKcGFNb3ZlSmF2YUVsZW1lbnRQYXJ0aWNpcGFudCB7Ci0KLQlwdWJsaWMgSnBhTW92ZVR5cGVQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfTU9WRV9UWVBFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudChPYmplY3QgZWxlbWVudCwgUmVmYWN0b3JpbmdBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0JCXN1cGVyLmFkZEVsZW1lbnQoZWxlbWVudCwgYXJndW1lbnRzKTsKLQkJdGhpcy5hZGROZXN0ZWRUeXBlcygoSVR5cGUpIGVsZW1lbnQsIGFyZ3VtZW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTmVzdGVkVHlwZShJVHlwZSByZW5hbWVkVHlwZSwgUmVmYWN0b3JpbmdBcmd1bWVudHMgYXJndW1lbnRzKSB7Ci0JCXN1cGVyLmFkZEVsZW1lbnQocmVuYW1lZFR5cGUsIGFyZ3VtZW50cyk7Ci0JCXRoaXMuYWRkTmVzdGVkVHlwZXMocmVuYW1lZFR5cGUsIGFyZ3VtZW50cyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5lc3RlZFR5cGVzKElUeXBlIHJlbmFtZWRUeXBlLCBSZWZhY3RvcmluZ0FyZ3VtZW50cyBhcmd1bWVudHMpIHsKLQkJSVR5cGVbXSBuZXN0ZWRUeXBlczsKLQkJdHJ5IHsKLQkJCW5lc3RlZFR5cGVzID0gcmVuYW1lZFR5cGUuZ2V0VHlwZXMoKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKElUeXBlIG5lc3RlZFR5cGUgOiBuZXN0ZWRUeXBlcykgewotCQkJdGhpcy5hZGROZXN0ZWRUeXBlKG5lc3RlZFR5cGUsIGFyZ3VtZW50cyk7Ci0JCX0KLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKiBBYnN0cmFjdEpwYVJlbmFtZUphdmFFbGVtZW50UGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzKFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQsIElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCwgT2JqZWN0IGRlc3RpbmF0aW9uKSB7Ci0JCUlUeXBlIHR5cGUgPSAoSVR5cGUpIGphdmFFbGVtZW50OwotCQlpZiAoKChJSmF2YUVsZW1lbnQpIGRlc3RpbmF0aW9uKS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UKSB7Ci0JCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0LmNyZWF0ZU1vdmVUeXBlRWRpdHModHlwZSwgKElQYWNrYWdlRnJhZ21lbnQpIGRlc3RpbmF0aW9uKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0LmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyh0eXBlLCBnZXROZXdOYW1lRm9yTmVzdGVkVHlwZSh0eXBlLCAoSVR5cGUpIGRlc3RpbmF0aW9uKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyhNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiwgSUphdmFFbGVtZW50IGphdmFFbGVtZW50LCBPYmplY3QgZGVzdGluYXRpb24pIHsKLQkJSVR5cGUgdHlwZSA9IChJVHlwZSkgamF2YUVsZW1lbnQ7Ci0JCWlmICgoKElKYXZhRWxlbWVudCkgZGVzdGluYXRpb24pLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQpIHsKLQkJCXJldHVybiBtYXBwaW5nRmlsZVJlZi5jcmVhdGVNb3ZlVHlwZUVkaXRzKHR5cGUsIChJUGFja2FnZUZyYWdtZW50KSBkZXN0aW5hdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1hcHBpbmdGaWxlUmVmLmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyh0eXBlLCBnZXROZXdOYW1lRm9yTmVzdGVkVHlwZSh0eXBlLCAoSVR5cGUpIGRlc3RpbmF0aW9uKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROZXdOYW1lRm9yTmVzdGVkVHlwZShJVHlwZSBuZXN0ZWRUeXBlLCBJVHlwZSBkZXN0aW5hdGlvbikgewotCQlyZXR1cm4gbmVzdGVkVHlwZS5nZXRUeXBlUXVhbGlmaWVkTmFtZSgnJCcpLnJlcGxhY2VGaXJzdChuZXN0ZWRUeXBlLmdldERlY2xhcmluZ1R5cGUoKS5nZXRFbGVtZW50TmFtZSgpLCBkZXN0aW5hdGlvbi5nZXRFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBnZXROZXdQYWNrYWdlKCkgewotCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnQpIGdldEFyZ3VtZW50cygpLmdldERlc3RpbmF0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGVja0NvbmRpdGlvbnNTdWJUYXNrTmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENyZWF0ZUNoYW5nZVN1YlRhc2tOYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX01PVkVfVFlQRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tcG9zaXRlQ2hhbmdlTmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVhtbENoYW5nZU5hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfTU9WRV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdGaWxlQ2hhbmdlTmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9NT1ZFX1RZUEVfUkVGQUNUT1JJTkdfQ0hBTkdFX01BUFBJTkdfRklMRV9OQU1FOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFSZW5hbWVGb2xkZXJQYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhUmVuYW1lRm9sZGVyUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY4YjBkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFSZW5hbWVGb2xkZXJQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcHBpbmcuSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dENoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5UZXh0RmlsZUNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVuYW1lUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlc291cmNlQ2hhbmdlQ2hlY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLQotLyoqCi0gKiBQYXJ0aWNpcGFudCBpbiB0aGUgcmVuYW1lIHJlZmFjdG9yaW5nIG9mIHtAbGluayBJRm9sZGVyc31zLgotICogSWYgdGhlIHJlbmFtZWQgbWFwcGluZyBmaWxlIGlzIGxpc3RlZCBpbiBhIHBlcnNpc3RlbmNlLnhtbCBmaWxlIG9mIGFueSBKcGFQcm9qZWN0Ci0gKiB0aGVuIGEgQ2hhbmdlIG9iamVjdCBpcyBjcmVhdGVkIHRoYXQgd2lsbCByZW5hbWUgdGhhdCByZWZlcmVuY2UgZnJvbSB0aGUgZmlsZS4KLSAqIElmIHRoZSByZW5hbWVkIG1hcHBpbmcgZmlsZSBpcyBhbiBpbXBsaWVkIG1hcHBpbmcgZmlsZSwgdGhlbiBhbiBhY3R1YWwgcmVmZXJlbmNlIHRvIHRoZSBtYXBwaW5nIGZpbGUgd2lsbCBiZSBzcGVjaWZpZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFSZW5hbWVGb2xkZXJQYXJ0aWNpcGFudAotCWV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQKLXsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSB7QGxpbmsgSUZvbGRlcn1zIHRvIGJlIHJlbmFtZWQKLQkgKi8KLQotCXByb3RlY3RlZCBJRm9sZGVyIG9yaWdpbmFsRm9sZGVyOwotCi0JLyoqCi0JICogU3RvcmUgdGhlIHBlcnNpc3RlbmNlLnhtbCBSZXBsYWNlRWRpdCBpbiB0aGUgY2hlY2tDb25kaXRpb25zKCkgY2FsbCAKLQkgKiB0byBhdm9pZCBkdXBsaWNhdGVkIGVmZm9ydCBpbiBjcmVhdGVDaGFuZ2UoKS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgTWFwPElGaWxlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+IHBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzOwotCi0JcHVibGljIEpwYVJlbmFtZUZvbGRlclBhcnRpY2lwYW50KCkgewotCQlzdXBlcigpOwotCQl0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzID0gbmV3IEhhc2hNYXA8SUZpbGUsIEl0ZXJhYmxlPFJlcGxhY2VFZGl0Pj4oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9GT0xERVJfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmICghZ2V0QXJndW1lbnRzKCkuZ2V0VXBkYXRlUmVmZXJlbmNlcygpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJdGhpcy5vcmlnaW5hbEZvbGRlciA9IChJRm9sZGVyKSBlbGVtZW50OwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKiBSZWZhY3RvcmluZ1BhcnRpY2lwYW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCi0KLQkvKioKLQkgKiBJbmZvcm0gdGhlIHJlZmFjdG9yaW5nIHByb2Nlc3NvciBvZiBhbnkgZmlsZXMgdGhhdCBhcmUgZ29pbmcgdG8gY2hhbmdlLiBJbiB0aGUgcHJvY2VzcyBvZiBkZXRlcm1pbmluZwotCSAqIHRoaXMgZ28gYWhlYWQgYW5kIGJ1aWxkIHVwIHRoZSBhcHByb3ByaWF0ZSBSZXBsYWNlRWRpdHMgdG8gYmUgdXNlZCBpbiB0aGUgY3JlYXRlQ2hhbmdlKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQkvL3NpbmNlIHRoZSBwcm9ncmVzcyBiYXIgd2lsbCBoYW5nIGlmIGEgbGFyZ2UgSlBBIHByb2plY3QgaXMgYmVpbmcgbG9hZGVkLCAKLQkJLy93ZSBjYW4gYXQgbGVhc3Qgc2V0IHRoZSBzdWJ0YXNrIGFuZCByZXBvcnQgbm8gcHJvZ3Jlc3MuIE9ubHkgaGFwcGVucyBmaXJzdCB0aW1lIGdldEpwYVByb2plY3RNYW5hZ2VyKCkgaXMgY2FsbGVkLgotCQltb25pdG9yLnN1YlRhc2soSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFRkFDT1JJTkdfUEFSVElDSVBBTlRfTE9BRElOR19KUEFfUFJPSkVDVFNfU1VCX1RBU0tfTkFNRSk7Ci0JCUpwYVByb2plY3RNYW5hZ2VyIGpwYVByb2plY3RNYW5hZ2VyID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpOwotCQlpZiAoanBhUHJvamVjdE1hbmFnZXIuZ2V0SnBhUHJvamVjdHNTaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBqcGFQcm9qZWN0TWFuYWdlci5nZXRKcGFQcm9qZWN0c1NpemUoKSoxMCArIDEpOwotCQlzbS5zdWJUYXNrKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRU5BTUVfRk9MREVSX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUUpOwotCQlSZXNvdXJjZUNoYW5nZUNoZWNrZXIgY2hlY2tlciA9IChSZXNvdXJjZUNoYW5nZUNoZWNrZXIpIGNvbnRleHQuZ2V0Q2hlY2tlcihSZXNvdXJjZUNoYW5nZUNoZWNrZXIuY2xhc3MpOwotCQlJUmVzb3VyY2VDaGFuZ2VEZXNjcmlwdGlvbkZhY3RvcnkgZGVsdGFGYWN0b3J5ID0gY2hlY2tlci5nZXREZWx0YUZhY3RvcnkoKTsKLQotCQlmb3IgKEpwYVByb2plY3QganBhUHJvamVjdCA6IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRKcGFQcm9qZWN0cygpKSB7Ci0JCQl0aGlzLmNyZWF0ZVJlcGxhY2VFZGl0cyhqcGFQcm9qZWN0KTsKLQkJCXNtLndvcmtlZCgxMCk7Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJZm9yIChJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUgOiB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlkZWx0YUZhY3RvcnkuY2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXBsYWNlRWRpdHMoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gcmVwbGFjZUVkaXRzID0gdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZVVuaXRSZXBsYWNlRWRpdHMocGVyc2lzdGVuY2VVbml0KTsKLQkJaWYgKCFDb2xsZWN0aW9uVG9vbHMuaXNFbXB0eShyZXBsYWNlRWRpdHMpKSB7Ci0JCQl0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLnB1dChqcGFQcm9qZWN0LmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCksIHJlcGxhY2VFZGl0cyk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLnNpemUoKSk7Ci0JCXNtLnN1YlRhc2soSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9GT0xERVJfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRSk7Ci0JCUNvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRU5BTUVfRk9MREVSX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FKTsKLQkJZm9yIChJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUgOiB0aGlzLnBlcnNpc3RlbmNlWG1sUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlpZiAoc20uaXNDYW5jZWxlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQl0aGlzLmFkZFBlcnNpc3RlbmNlWG1sUmVuYW1lQ2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSwgY29tcG9zaXRlQ2hhbmdlKTsJCQkKLQkJfQotCQkvL211c3QgY2hlY2sgZm9yIGNoaWxkcmVuIGluIGNhc2UgYWxsIGNoYW5nZXMgd2VyZSBtYWRlIGluIG90aGVyIHBhcnRpY2lwYW50cyBUZXh0Q2hhbmdlcywgCi0JCS8vd2FudCB0byByZXR1cm4gbnVsbCBzbyBvdXIgbm9kZSBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIHByZXZpZXcgdHJlZQotCQlyZXR1cm4gY29tcG9zaXRlQ2hhbmdlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDAgPyBudWxsIDogY29tcG9zaXRlQ2hhbmdlOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZVBlcnNpc3RlbmNlVW5pdFJlcGxhY2VFZGl0cyhmaW5hbCBQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuaXNPbkNsYXNzcGF0aCh0aGlzLm9yaWdpbmFsRm9sZGVyKSB8fCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSA9PSB0aGlzLm9yaWdpbmFsRm9sZGVyLmdldFByb2plY3QoKSkgewotCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdC5jcmVhdGVSZW5hbWVGb2xkZXJFZGl0cyh0aGlzLm9yaWdpbmFsRm9sZGVyLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCQl9Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFBlcnNpc3RlbmNlWG1sUmVuYW1lQ2hhbmdlKElGaWxlIHBlcnNpc3RlbmNlWG1sRmlsZSwgQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSkgewotCQlUZXh0Q2hhbmdlIHRleHRDaGFuZ2UgPSBnZXRUZXh0Q2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCWlmICh0ZXh0Q2hhbmdlID09IG51bGwpIHsKLQkJCXRleHRDaGFuZ2UgPSBuZXcgVGV4dEZpbGVDaGFuZ2UoSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9GT0xERVJfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FLCBwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCXRleHRDaGFuZ2Uuc2V0RWRpdChtdWx0aVRleHRFZGl0KTsKLQkJCWNvbXBvc2l0ZUNoYW5nZS5hZGQodGV4dENoYW5nZSk7Ci0JCX0KLQkJSXRlcmFibGU8UmVwbGFjZUVkaXQ+IG1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzID0gdGhpcy5wZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cy5nZXQocGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJdGhpcy5hZGRFZGl0cyh0ZXh0Q2hhbmdlLCBtYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyk7Ci0JfQotCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJaWYgKHBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOyAvLyB0aGUgY29udGV4dCBtb2RlbCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAxIHBlcnNpc3RlbmNlIHVuaXQKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFZGl0cyhUZXh0Q2hhbmdlIHRleHRDaGFuZ2UsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUZXh0RWRpdD4gdGV4dEVkaXRzKSB7Ci0JCWZvciAoVGV4dEVkaXQgdGV4dEVkaXQgOiB0ZXh0RWRpdHMpIHsKLQkJCXRyeSB7Ci0JCQkJdGV4dENoYW5nZS5hZGRFZGl0KHRleHRFZGl0KTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2xvZyBleGNlcHRpb24gYW5kIGRvbid0IGFkZCB0aGlzIHBlcnNpc3RlbmNlLnhtbCB0eXBlIGRlbGV0aW9uIHRvIHRoZSBjb25mbGljdGluZyBjaGFuZ2Ugb2JqZWN0Ci0JCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhUmVuYW1lTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhUmVuYW1lTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGUxODQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3JlZmFjdG9yaW5nL0pwYVJlbmFtZU1hcHBpbmdGaWxlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMubWFwcGluZy5JUmVzb3VyY2VDaGFuZ2VEZXNjcmlwdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3RNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlRleHRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuVGV4dEZpbGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZXNvdXJjZUNoYW5nZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLS8qKgotICogUGFydGljaXBhbnQgaW4gdGhlIHJlbmFtZSByZWZhY3RvcmluZyBvZiB7QGxpbmsgSUZpbGV9cyB3aXRoIGNvbnRlbnQgdHlwZSB7QGxpbmsgSnB0SnBhQ29yZVBsdWdpbiNNQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFfS4KLSAqIElmIHRoZSByZW5hbWVkIG1hcHBpbmcgZmlsZSBpcyBsaXN0ZWQgaW4gYSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBvZiBhbnkgSnBhUHJvamVjdAotICogdGhlbiBhIENoYW5nZSBvYmplY3QgaXMgY3JlYXRlZCB0aGF0IHdpbGwgcmVuYW1lIHRoYXQgcmVmZXJlbmNlIGZyb20gdGhlIGZpbGUuCi0gKiBJZiB0aGUgcmVuYW1lZCBtYXBwaW5nIGZpbGUgaXMgYW4gaW1wbGllZCBtYXBwaW5nIGZpbGUsIHRoZW4gYW4gYWN0dWFsIHJlZmVyZW5jZSB0byB0aGUgbWFwcGluZyBmaWxlIHdpbGwgYmUgc3BlY2lmaWVkLgotICovCi1wdWJsaWMgY2xhc3MgSnBhUmVuYW1lTWFwcGluZ0ZpbGVQYXJ0aWNpcGFudAotCWV4dGVuZHMgUmVuYW1lUGFydGljaXBhbnQKLXsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSB7QGxpbmsgSUZpbGV9cyB0byBiZSByZW5hbWVkIHdpdGggY29udGVudCB0eXBlIHtAbGluayBKcHRKcGFDb3JlUGx1Z2luI01BUFBJTkdfRklMRV9DT05URU5UX1RZUEV9Ci0JICovCi0KLQlwcm90ZWN0ZWQgSUZpbGUgb3JpZ2luYWxNYXBwaW5nRmlsZTsKLQotCS8qKgotCSAqIFN0b3JlIHRoZSBwZXJzaXN0ZW5jZS54bWwgUmVwbGFjZUVkaXQgaW4gdGhlIGNoZWNrQ29uZGl0aW9ucygpIGNhbGwgCi0JICogdG8gYXZvaWQgZHVwbGljYXRlZCBlZmZvcnQgaW4gY3JlYXRlQ2hhbmdlKCkuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIE1hcDxJRmlsZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+PiBwZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzOwotCi0JcHVibGljIEpwYVJlbmFtZU1hcHBpbmdGaWxlUGFydGljaXBhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyA9IG5ldyBIYXNoTWFwPElGaWxlLCBJdGVyYWJsZTxSZXBsYWNlRWRpdD4+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRU5BTUVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX1BBUlRJQ0lQQU5UX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoIWdldEFyZ3VtZW50cygpLmdldFVwZGF0ZVJlZmVyZW5jZXMoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXRoaXMub3JpZ2luYWxNYXBwaW5nRmlsZSA9IChJRmlsZSkgZWxlbWVudDsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiogUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCi0JLyoqCi0JICogSW5mb3JtIHRoZSByZWZhY3RvcmluZyBwcm9jZXNzb3Igb2YgYW55IGZpbGVzIHRoYXQgYXJlIGdvaW5nIHRvIGNoYW5nZS4gSW4gdGhlIHByb2Nlc3Mgb2YgZGV0ZXJtaW5pbmcKLQkgKiB0aGlzIGdvIGFoZWFkIGFuZCBidWlsZCB1cCB0aGUgYXBwcm9wcmlhdGUgUmVwbGFjZUVkaXRzIHRvIGJlIHVzZWQgaW4gdGhlIGNyZWF0ZUNoYW5nZSgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgdGhyb3dzIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIHsKLQkJLy9zaW5jZSB0aGUgcHJvZ3Jlc3MgYmFyIHdpbGwgaGFuZyBpZiBhIGxhcmdlIEpQQSBwcm9qZWN0IGlzIGJlaW5nIGxvYWRlZCwgCi0JCS8vd2UgY2FuIGF0IGxlYXN0IHNldCB0aGUgc3VidGFzayBhbmQgcmVwb3J0IG5vIHByb2dyZXNzLiBPbmx5IGhhcHBlbnMgZmlyc3QgdGltZSBnZXRKcGFQcm9qZWN0TWFuYWdlcigpIGlzIGNhbGxlZC4KLQkJbW9uaXRvci5zdWJUYXNrKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRUZBQ09SSU5HX1BBUlRJQ0lQQU5UX0xPQURJTkdfSlBBX1BST0pFQ1RTX1NVQl9UQVNLX05BTUUpOwotCQlKcGFQcm9qZWN0TWFuYWdlciBqcGFQcm9qZWN0TWFuYWdlciA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKTsKLQkJaWYgKGpwYVByb2plY3RNYW5hZ2VyLmdldEpwYVByb2plY3RzU2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwganBhUHJvamVjdE1hbmFnZXIuZ2V0SnBhUHJvamVjdHNTaXplKCkqMTAgKyAxKTsKLQkJc20uc3ViVGFzayhKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVOQU1FX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FKTsKLQkJUmVzb3VyY2VDaGFuZ2VDaGVja2VyIGNoZWNrZXIgPSAoUmVzb3VyY2VDaGFuZ2VDaGVja2VyKSBjb250ZXh0LmdldENoZWNrZXIoUmVzb3VyY2VDaGFuZ2VDaGVja2VyLmNsYXNzKTsKLQkJSVJlc291cmNlQ2hhbmdlRGVzY3JpcHRpb25GYWN0b3J5IGRlbHRhRmFjdG9yeSA9IGNoZWNrZXIuZ2V0RGVsdGFGYWN0b3J5KCk7Ci0KLQkJZm9yIChKcGFQcm9qZWN0IGpwYVByb2plY3QgOiBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCkuZ2V0SnBhUHJvamVjdHMoKSkgewotCQkJdGhpcy5jcmVhdGVSZXBsYWNlRWRpdHMoanBhUHJvamVjdCk7Ci0JCQlzbS53b3JrZWQoMTApOwotCQl9Ci0JCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWZvciAoSUZpbGUgcGVyc2lzdGVuY2VYbWxGaWxlIDogdGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmtleVNldCgpKSB7Ci0JCQlkZWx0YUZhY3RvcnkuY2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSk7Ci0JCX0KLQkJc20ud29ya2VkKDEpOwotCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSZXBsYWNlRWRpdHMoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB0aHJvd3MgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlpZiAocGVyc2lzdGVuY2VVbml0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJdGVyYWJsZTxSZXBsYWNlRWRpdD4gcmVwbGFjZUVkaXRzID0gdGhpcy5jcmVhdGVNYXBwaW5nRmlsZVJlZlJlcGxhY2VFZGl0cyhwZXJzaXN0ZW5jZVVuaXQpOwotCQlpZiAoIUNvbGxlY3Rpb25Ub29scy5pc0VtcHR5KHJlcGxhY2VFZGl0cykpIHsKLQkJCXRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5wdXQoanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpLCByZXBsYWNlRWRpdHMpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gewotCQlpZiAodGhpcy5wZXJzaXN0ZW5jZVhtbE1hcHBpbmdGaWxlUmVwbGFjZUVkaXRzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCB0aGlzLnBlcnNpc3RlbmNlWG1sTWFwcGluZ0ZpbGVSZXBsYWNlRWRpdHMuc2l6ZSgpKTsKLQkJc20uc3ViVGFzayhKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVOQU1FX01BUFBJTkdfRklMRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIGNvbXBvc2l0ZUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9NQVBQSU5HX0ZJTEVfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUUpOwotCQlmb3IgKElGaWxlIHBlcnNpc3RlbmNlWG1sRmlsZSA6IHRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5rZXlTZXQoKSkgewotCQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJfQotCQkJdGhpcy5hZGRQZXJzaXN0ZW5jZVhtbFJlbmFtZU1hcHBpbmdGaWxlQ2hhbmdlKHBlcnNpc3RlbmNlWG1sRmlsZSwgY29tcG9zaXRlQ2hhbmdlKTsJCQkKLQkJfQotCQkvL211c3QgY2hlY2sgZm9yIGNoaWxkcmVuIGluIGNhc2UgYWxsIGNoYW5nZXMgd2VyZSBtYWRlIGluIG90aGVyIHBhcnRpY2lwYW50cyBUZXh0Q2hhbmdlcywgCi0JCS8vd2FudCB0byByZXR1cm4gbnVsbCBzbyBvdXIgbm9kZSBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIHByZXZpZXcgdHJlZQotCQlyZXR1cm4gY29tcG9zaXRlQ2hhbmdlLmdldENoaWxkcmVuKCkubGVuZ3RoID09IDAgPyBudWxsIDogY29tcG9zaXRlQ2hhbmdlOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8UmVwbGFjZUVkaXQ+IGNyZWF0ZU1hcHBpbmdGaWxlUmVmUmVwbGFjZUVkaXRzKGZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdC5jcmVhdGVSZW5hbWVNYXBwaW5nRmlsZUVkaXRzKHRoaXMub3JpZ2luYWxNYXBwaW5nRmlsZSwgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGVyc2lzdGVuY2VYbWxSZW5hbWVNYXBwaW5nRmlsZUNoYW5nZShJRmlsZSBwZXJzaXN0ZW5jZVhtbEZpbGUsIENvbXBvc2l0ZUNoYW5nZSBjb21wb3NpdGVDaGFuZ2UpIHsKLQkJVGV4dENoYW5nZSB0ZXh0Q2hhbmdlID0gZ2V0VGV4dENoYW5nZShwZXJzaXN0ZW5jZVhtbEZpbGUpOwotCQlpZiAodGV4dENoYW5nZSA9PSBudWxsKSB7Ci0JCQl0ZXh0Q2hhbmdlID0gbmV3IFRleHRGaWxlQ2hhbmdlKEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRU5BTUVfTUFQUElOR19GSUxFX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRSwgcGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQl0ZXh0Q2hhbmdlLnNldEVkaXQobXVsdGlUZXh0RWRpdCk7Ci0JCQljb21wb3NpdGVDaGFuZ2UuYWRkKHRleHRDaGFuZ2UpOwotCQl9Ci0JCUl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBtYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyA9IHRoaXMucGVyc2lzdGVuY2VYbWxNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cy5nZXQocGVyc2lzdGVuY2VYbWxGaWxlKTsKLQkJdGhpcy5hZGRFZGl0cyh0ZXh0Q2hhbmdlLCBtYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyk7Ci0JfQotCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJaWYgKHBlcnNpc3RlbmNlWG1sID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJaWYgKHBlcnNpc3RlbmNlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOyAvLyB0aGUgY29udGV4dCBtb2RlbCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAxIHBlcnNpc3RlbmNlIHVuaXQKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFZGl0cyhUZXh0Q2hhbmdlIHRleHRDaGFuZ2UsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUZXh0RWRpdD4gdGV4dEVkaXRzKSB7Ci0JCWZvciAoVGV4dEVkaXQgdGV4dEVkaXQgOiB0ZXh0RWRpdHMpIHsKLQkJCXRyeSB7Ci0JCQkJdGV4dENoYW5nZS5hZGRFZGl0KHRleHRFZGl0KTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2xvZyBleGNlcHRpb24gYW5kIGRvbid0IGFkZCB0aGlzIHBlcnNpc3RlbmNlLnhtbCB0eXBlIGRlbGV0aW9uIHRvIHRoZSBjb25mbGljdGluZyBjaGFuZ2Ugb2JqZWN0Ci0JCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhUmVuYW1lUGFja2FnZVBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFSZW5hbWVQYWNrYWdlUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwYzZjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFSZW5hbWVQYWNrYWdlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5NYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLQotcHVibGljIGNsYXNzIEpwYVJlbmFtZVBhY2thZ2VQYXJ0aWNpcGFudAotCWV4dGVuZHMgQWJzdHJhY3RKcGFSZW5hbWVKYXZhRWxlbWVudFBhcnRpY2lwYW50IHsKLQotCi0JcHVibGljIEpwYVJlbmFtZVBhY2thZ2VQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVOQU1FX1BBQ0tBR0VfUkVGQUNUT1JJTkdfUEFSVElDSVBBTlRfTkFNRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVBhY2thZ2VGcmFnbWVudCBnZXRPcmlnaW5hbFBhY2thZ2UoKSB7Ci0JCXJldHVybiAoSVBhY2thZ2VGcmFnbWVudCkgc3VwZXIuZ2V0T3JpZ2luYWxKYXZhRWxlbWVudCgpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqIEFic3RyYWN0SnBhUmVuYW1lSmF2YUVsZW1lbnRQYXJ0aWNpcGFudCBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cyhQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7CQotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0LmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0cyh0aGlzLmdldE9yaWdpbmFsUGFja2FnZSgpLCB0aGlzLmdldE5ld05hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyhNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXRzKHRoaXMuZ2V0T3JpZ2luYWxQYWNrYWdlKCksIHRoaXMuZ2V0TmV3TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoKSB7Ci0JCXJldHVybiBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGVja0NvbmRpdGlvbnNTdWJUYXNrTmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRU5BTUVfUEFDS0FHRV9SRUZBQ1RPUklOR19TVUJfVEFTS19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q3JlYXRlQ2hhbmdlU3ViVGFza05hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVOQU1FX1BBQ0tBR0VfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbXBvc2l0ZUNoYW5nZU5hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVOQU1FX1BBQ0tBR0VfUkVGQUNUT1JJTkdfQ0hBTkdFX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQZXJzaXN0ZW5jZVhtbENoYW5nZU5hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVOQU1FX1BBQ0tBR0VfUkVGQUNUT1JJTkdfQ0hBTkdFX1BFUlNJU1RFTkNFX1hNTF9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TWFwcGluZ0ZpbGVDaGFuZ2VOYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9QQUNLQUdFX1JFRkFDVE9SSU5HX0NIQU5HRV9NQVBQSU5HX0ZJTEVfTkFNRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVmYWN0b3JpbmcvSnBhUmVuYW1lVHlwZVBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFSZW5hbWVUeXBlUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcyYjc0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZWZhY3RvcmluZy9KcGFSZW5hbWVUeXBlUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZWZhY3RvcmluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQ29tcG9zaXRlSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vL1RPRE8gUmVuYW1lVHlwZUFyZ3VtZW50cy51cGRhdGVTaW1pbGFyRGVjbGFyYXRpb25zKCkgLSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pkdC91aS9yM18yL1JlbmFtZVR5cGUuaHRtbAotcHVibGljIGNsYXNzIEpwYVJlbmFtZVR5cGVQYXJ0aWNpcGFudAotCWV4dGVuZHMgQWJzdHJhY3RKcGFSZW5hbWVKYXZhRWxlbWVudFBhcnRpY2lwYW50IHsKLQotCXByb3RlY3RlZCBmaW5hbCBDb2xsZWN0aW9uPElUeXBlPiBuZXN0ZWRUeXBlczsKLQotCXB1YmxpYyBKcGFSZW5hbWVUeXBlUGFydGljaXBhbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmVzdGVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0PElUeXBlPigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRU5BTUVfVFlQRV9SRUZBQ1RPUklOR19QQVJUSUNJUEFOVF9OQU1FOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBnZXRPcmlnaW5hbFR5cGUoKSB7Ci0JCXJldHVybiAoSVR5cGUpIHN1cGVyLmdldE9yaWdpbmFsSmF2YUVsZW1lbnQoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWJvb2xlYW4gaW5pdGlhbGl6ZSA9IHN1cGVyLmluaXRpYWxpemUoZWxlbWVudCk7Ci0JCWlmIChpbml0aWFsaXplKSB7Ci0JCQl0aGlzLmFkZE5lc3RlZFR5cGVzKHRoaXMuZ2V0T3JpZ2luYWxUeXBlKCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5lc3RlZFR5cGUoSVR5cGUgcmVuYW1lZFR5cGUpIHsKLQkJdGhpcy5uZXN0ZWRUeXBlcy5hZGQocmVuYW1lZFR5cGUpOwotCQl0aGlzLmFkZE5lc3RlZFR5cGVzKHJlbmFtZWRUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmVzdGVkVHlwZXMoSVR5cGUgcmVuYW1lZFR5cGUpIHsKLQkJSVR5cGVbXSBuZXN0ZWRUeXBlczsKLQkJdHJ5IHsKLQkJCW5lc3RlZFR5cGVzID0gcmVuYW1lZFR5cGUuZ2V0VHlwZXMoKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKElUeXBlIG5lc3RlZFR5cGUgOiBuZXN0ZWRUeXBlcykgewotCQkJdGhpcy5hZGROZXN0ZWRUeXBlKG5lc3RlZFR5cGUpOwotCQl9Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiogQWJzdHJhY3RKcGFSZW5hbWVKYXZhRWxlbWVudFBhcnRpY2lwYW50IGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqCi0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVQZXJzaXN0ZW5jZVhtbFJlcGxhY2VFZGl0cyhQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmFibGU8UmVwbGFjZUVkaXQ+KAotCQkJdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZVhtbFJlcGxhY2VPcmlnaW5hbFR5cGVFZGl0cyhwZXJzaXN0ZW5jZVVuaXQpLAotCQkJdGhpcy5jcmVhdGVQZXJzaXN0ZW5jZVhtbFJlcGxhY2VOZXN0ZWRUeXBlRWRpdHMocGVyc2lzdGVuY2VVbml0KSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUGVyc2lzdGVuY2VYbWxSZXBsYWNlT3JpZ2luYWxUeXBlRWRpdHMoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0LmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyh0aGlzLmdldE9yaWdpbmFsVHlwZSgpLCB0aGlzLmdldE5ld05hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxSZXBsYWNlRWRpdD4gY3JlYXRlUGVyc2lzdGVuY2VYbWxSZXBsYWNlTmVzdGVkVHlwZUVkaXRzKGZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJVHlwZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLm5lc3RlZFR5cGVzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oSVR5cGUgbmVzdGVkVHlwZSkgewotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWVGb3JOZXN0ZWRUeXBlKG5lc3RlZFR5cGUpOwotCQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0LmNyZWF0ZVJlbmFtZVR5cGVFZGl0cyhuZXN0ZWRUeXBlLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBwaW5nRmlsZVJlcGxhY2VFZGl0cyhNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUl0ZXJhYmxlPFJlcGxhY2VFZGl0PigKLQkJCXRoaXMuY3JlYXRlTWFwcGluZ0ZpbGVSZXBsYWNlT3JpZ2luYWxUeXBlRWRpdHMobWFwcGluZ0ZpbGVSZWYpLAotCQkJdGhpcy5jcmVhdGVNYXBwaW5nRmlsZVJlcGxhY2VOZXN0ZWRUeXBlRWRpdHMobWFwcGluZ0ZpbGVSZWYpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBwaW5nRmlsZVJlcGxhY2VPcmlnaW5hbFR5cGVFZGl0cyhNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZikgewotCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKHRoaXMuZ2V0T3JpZ2luYWxUeXBlKCksIHRoaXMuZ2V0TmV3TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiBjcmVhdGVNYXBwaW5nRmlsZVJlcGxhY2VOZXN0ZWRUeXBlRWRpdHMoZmluYWwgTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYpIHsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYWJsZTxSZXBsYWNlRWRpdD4oCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJVHlwZSwgSXRlcmFibGU8UmVwbGFjZUVkaXQ+Pih0aGlzLm5lc3RlZFR5cGVzKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFJlcGxhY2VFZGl0PiB0cmFuc2Zvcm0oSVR5cGUgbmVzdGVkVHlwZSkgewotCQkJCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWVGb3JOZXN0ZWRUeXBlKG5lc3RlZFR5cGUpOwotCQkJCQlyZXR1cm4gbWFwcGluZ0ZpbGVSZWYuY3JlYXRlUmVuYW1lVHlwZUVkaXRzKG5lc3RlZFR5cGUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWUoKSB7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpOwotCQl0cnkgewotCQkJaWYgKHRoaXMuZ2V0T3JpZ2luYWxUeXBlKCkuaXNNZW1iZXIoKSkgewotCQkJCW5ld05hbWUgPSB0aGlzLmdldE9yaWdpbmFsVHlwZSgpLmdldFR5cGVRdWFsaWZpZWROYW1lKCkuc3Vic3RyaW5nKDAsIHRoaXMuZ2V0T3JpZ2luYWxUeXBlKCkuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKS5sYXN0SW5kZXhPZignJCcpKSArICckJyArIG5ld05hbWU7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbmV3TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5ld05hbWVGb3JOZXN0ZWRUeXBlKElUeXBlIG5lc3RlZFR5cGUpIHsKLQkJcmV0dXJuIG5lc3RlZFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoJyQnKS5yZXBsYWNlRmlyc3QodGhpcy5nZXRPcmlnaW5hbFR5cGUoKS5nZXRFbGVtZW50TmFtZSgpLCBnZXRBcmd1bWVudHMoKS5nZXROZXdOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2hlY2tDb25kaXRpb25zU3ViVGFza05hbWUoKSB7Ci0JCXJldHVybiBKcGFDb3JlUmVmYWN0b3JpbmdNZXNzYWdlcy5KUEFfUkVOQU1FX1RZUEVfUkVGQUNUT1JJTkdfU1VCX1RBU0tfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENyZWF0ZUNoYW5nZVN1YlRhc2tOYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9UWVBFX1JFRkFDVE9SSU5HX1NVQl9UQVNLX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wb3NpdGVDaGFuZ2VOYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGVyc2lzdGVuY2VYbWxDaGFuZ2VOYW1lKCkgewotCQlyZXR1cm4gSnBhQ29yZVJlZmFjdG9yaW5nTWVzc2FnZXMuSlBBX1JFTkFNRV9UWVBFX1JFRkFDVE9SSU5HX0NIQU5HRV9QRVJTSVNURU5DRV9YTUxfTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdGaWxlQ2hhbmdlTmFtZSgpIHsKLQkJcmV0dXJuIEpwYUNvcmVSZWZhY3RvcmluZ01lc3NhZ2VzLkpQQV9SRU5BTUVfVFlQRV9SRUZBQ1RPUklOR19DSEFOR0VfTUFQUElOR19GSUxFX05BTUU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2NvbnRlbnR0eXBlcy9JbmRldGVybWluYXRlQ29udGVudERlc2NyaWJlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvY29udGVudHR5cGVzL0luZGV0ZXJtaW5hdGVDb250ZW50RGVzY3JpYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNTMyMGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvY29udGVudHR5cGVzL0luZGV0ZXJtaW5hdGVDb250ZW50RGVzY3JpYmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuY29udGVudHR5cGVzOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHNpbXBseSByZXR1cm5zIElOREVURVJNSU5BVEUgZm9yIGFueSBjb250ZW50cyBpdCByZWNlaXZlcy4KLSAqIAotICogSXQgaXMgdXNlZCBjdXJyZW50bHkgZm9yIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZW50LmJhc2VKcGFDb250ZW50IGluIG9yZGVyCi0gKiB0byBtYWtlIHRoYXQgY29udGVudCB0eXBlIGFjdCBhcyBhbiAiYWJzdHJhY3QiIGNvbnRlbnQgdHlwZS4KLSAqIAotICogVGhpcyBpcyBpbiBpdHMgb3duIHBhY2thZ2Ugc28gdGhhdCBpdCBjYW4gYmUgZXhjbHVkZWQgZnJvbSBidW5kbGUgYWN0aXZhdGlvbiBpbiB0aGUgcGx1Z2luLnhtbC4KLSAqIENvbnRlbnQgZGVzY3JpYmVycyBtdXN0IGJlIHNlbGYtY29udGFpbmVkIGFuZCBub3QgdHJpZ2dlciBhdXRvLWFjdGl2YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmRldGVybWluYXRlQ29udGVudERlc2NyaWJlciBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlcgotewotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIElOREVURVJNSU5BVEU7Ci0JfQotCQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiBJTkRFVEVSTUlOQVRFOwotCX0KLQkKLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgUXVhbGlmaWVkTmFtZVswXTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlNjFhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlQXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24uYnVpbGRTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZTFfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVNfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5M2JlYzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NzVmYmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5idWlsZFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLkFUVFJJQlVURV9PVkVSUklERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLkFUVFJJQlVURV9PVkVSUklERVM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTIxMTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgQXR0cmlidXRlT3ZlcnJpZGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24sIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQVRUUklCVVRFX09WRVJSSURFUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzlmODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlCYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuQmFzaWMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJhc2ljQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgQmFzaWNBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBCYXNpY0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUJhc2ljQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5QmFzaWNBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3MWYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIENvbHVtbkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIFNvdXJjZUNvbHVtbkFubm90YXRpb24uTUFQUElOR19ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUNvbHVtbkFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg2OWIxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24ocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZTM1MzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JWYWx1ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTEyMzdkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlFbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1iZWRkYWJsZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVtYmVkZGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFbWJlZGRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RW1iZWRkYWJsZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyOGVlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRW1iZWRkZWRBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFbWJlZGRlZEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VFbWJlZGRlZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVtYmVkZGVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGZkZWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VFbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZElkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBFbWJlZGRlZElkQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgRW1iZWRkZWRJZEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkSWRBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlFbWJlZGRlZElkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnRpdHlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2RiZGIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW50aXR5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEVudGl0eUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRW50aXR5QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5RW50aXR5QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzOGVlMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5RW51bWVyYXRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVudW1lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVudW1lcmF0ZWRBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBFbnVtZXJhdGVkQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRW51bWVyYXRlZEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlRW51bWVyYXRlZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxFbnVtZXJhdGVkQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUVudW1lcmF0ZWRBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwYTNkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5HZW5lcmF0ZWRWYWx1ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ0NmIzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUlkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5JZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSWRBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBJZEFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIElkQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VJZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUlkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWIwNjZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlJZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuSWRDbGFzcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSWRDbGFzc0Fubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IElkQ2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBJZENsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VJZENsYXNzQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5SWRDbGFzc0Fubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzliZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlJbmhlcml0YW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUluaGVyaXRhbmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuSW5oZXJpdGFuY2UKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEluaGVyaXRhbmNlQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSW5oZXJpdGFuY2VBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBJbmhlcml0YW5jZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlSW5oZXJpdGFuY2VBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxJbmhlcml0YW5jZUFubm90YXRpb24ocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlJbmhlcml0YW5jZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxNzVkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSm9pbkNvbHVtbkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbi5idWlsZFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgaW5kZXgpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OUzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OU19fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlMGU3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1ucwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24sIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5TOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjM4OTRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pblRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEpvaW5UYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsSm9pblRhYmxlQW5ub3RhdGlvbihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeUpvaW5UYWJsZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFiZjZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTG9iQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Mb2IKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIExvYkFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IExvYkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIExvYkFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTG9iQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TG9iQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2ZDAxZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hbnlUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYW55VG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTWFueVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTWFueVRvTWFueUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hbnlUb01hbnlBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYzk1MzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTWFueVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VNYW55VG9PbmVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlNYW55VG9PbmVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FhMDQ4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlNYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VNYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBNYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBNYXBLZXlBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZU1hcEtleUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU1hcEtleUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjODM3OTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2FkOGEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJpZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE5hbWVkTmF0aXZlUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNGIyNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uYnVpbGRTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGFpbmVyQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFU19fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJpZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVmOTMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJpZXMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE5hbWVkUXVlcmllc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLk5BTUVEX1FVRVJJRVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk3NDQyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRRdWVyeTFfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlTmFtZWRRdWVyeTFfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVkUXVlcnlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTmFtZWRRdWVyeUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOZXN0YWJsZUFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlTmFtZWRRdWVyeTFfMEFubm90YXRpb24uYnVpbGRTb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5TmFtZWRRdWVyeTFfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5lc3RhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfUVVFUlk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250YWluZXJBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9RVUVSSUVTOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfUVVFUklFU19fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3MTgyNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQ29sdW1uQW5ub3RhdGlvbgotewotCXB1YmxpYyBOdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBnZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKSB7Ci0JCXJldHVybiAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSB0aGlzLnBhcmVudDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sdW1uQW5ub3RhdGlvbiBhZGRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oKS5hZGRDb2x1bW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZUNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiNmQzNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlDb2x1bW48L2NvZGU+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVsbEJhc2VDb2x1bW5Bbm5vdGF0aW9uPEEgZXh0ZW5kcyBCYXNlQ29sdW1uQW5ub3RhdGlvbj4KLQlleHRlbmRzIE51bGxOYW1lZENvbHVtbkFubm90YXRpb248QT4KLQlpbXBsZW1lbnRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxCYXNlQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCS8vICoqKioqIHRhYmxlCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKSB7Ci0JCWlmICh0YWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRUYWJsZSh0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKiogdW5pcXVlCi0JcHVibGljIEJvb2xlYW4gZ2V0VW5pcXVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJaWYgKHVuaXF1ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRVbmlxdWUodW5pcXVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VW5pcXVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICoqKioqIHVwZGF0YWJsZQotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCWlmICh1cGRhdGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VXBkYXRhYmxlKHVwZGF0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBpbnNlcnRhYmxlCi0JcHVibGljIEJvb2xlYW4gZ2V0SW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJaWYgKGluc2VydGFibGUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0SW5zZXJ0YWJsZShpbnNlcnRhYmxlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBudWxsYWJsZQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIG51bGxhYmxlKSB7Ci0JCWlmIChudWxsYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROdWxsYWJsZShudWxsYWJsZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE51bGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNmE3YmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVsbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjxBIGV4dGVuZHMgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24+Ci0JZXh0ZW5kcyBOdWxsTmFtZWRDb2x1bW5Bbm5vdGF0aW9uPEE+Ci0JaW1wbGVtZW50cyBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbgotewotCi0JcHVibGljIE51bGxCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKiBkaXNjcmltaW5hdG9yIHR5cGUKLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCWlmIChkaXNjcmltaW5hdG9yVHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXREaXNjcmltaW5hdG9yVHlwZShkaXNjcmltaW5hdG9yVHlwZSk7Ci0JCX0KLQl9Ci0KLQkvLyAqKioqKiBsZW5ndGgKLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldExlbmd0aChsZW5ndGgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZkNTU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEJhc2VUYWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5TGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci0KLS8qKgotICogPHVsPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLlRhYmxlPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2xsZWN0aW9uVGFibGU8L2NvZGU+Ci0gKiA8dWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOdWxsQmFzZVRhYmxlQW5ub3RhdGlvbjxBIGV4dGVuZHMgQmFzZVRhYmxlQW5ub3RhdGlvbj4KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uPEE+Ci0JaW1wbGVtZW50cyBCYXNlVGFibGVBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxCYXNlVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0TmFtZShuYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKiogc2NoZW1hCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCWlmIChzY2hlbWEgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0U2NoZW1hKHNjaGVtYSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyAqKioqKiBjYXRhbG9nCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBjYXRhbG9nKSB7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldENhdGFsb2coY2F0YWxvZyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vICoqKioqIHVuaXF1ZSBjb25zdHJhaW50cwotCXB1YmxpYyBMaXN0SXRlcmFibGU8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIHVuaXF1ZUNvbnN0cmFpbnRBdChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmFkZEFubm90YXRpb24oKS5hZGRVbmlxdWVDb25zdHJhaW50KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZjRjNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEJhc2VDb2x1bW5Bbm5vdGF0aW9uPENvbHVtbkFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHVibGljIE51bGxDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiBsZW5ndGgKLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAobGVuZ3RoICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldExlbmd0aChsZW5ndGgpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gKioqKiogc2NhbGUKLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoSW50ZWdlciBzY2FsZSkgewotCQlpZiAoc2NhbGUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0U2NhbGUoc2NhbGUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiBwcmVjaXNpb24KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWNpc2lvbihJbnRlZ2VyIHByZWNpc2lvbikgewotCQlpZiAocHJlY2lzaW9uICE9IG51bGwpIHsKLQkJCXRoaXMuYWRkQW5ub3RhdGlvbigpLnNldFByZWNpc2lvbihwcmVjaXNpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmVjaXNpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMGM3ODUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBOdWxsRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIE51bGxCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb248RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24+Ci17CQotCi0JcHVibGljIE51bGxEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjE0YjY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuRGlzY3JpbWluYXRvclZhbHVlPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uPERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsRW51bWVyYXRlZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY1MzQ4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bWVyYXRlZEFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZDwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxFbnVtZXJhdGVkQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb248RW51bWVyYXRlZEFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBFbnVtZXJhdGVkQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsRW51bWVyYXRlZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEVudW1UeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShFbnVtVHlwZSB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9CQkKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEluaGVyaXRhbmNlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMTA4ZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkluaGVyaXRhbmNlPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEluaGVyaXRhbmNlQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEFubm90YXRpb248SW5oZXJpdGFuY2VBbm5vdGF0aW9uPgotCWltcGxlbWVudHMgSW5oZXJpdGFuY2VBbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIE51bGxJbmhlcml0YW5jZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqIHN0cmF0ZWd5Ci0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBnZXRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KSB7Ci0JCWlmIChzdHJhdGVneSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXRTdHJhdGVneShzdHJhdGVneSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFN0cmF0ZWd5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTcyNjY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBOdWxsQmFzZUNvbHVtbkFubm90YXRpb248Sm9pbkNvbHVtbkFubm90YXRpb24+Ci0JaW1wbGVtZW50cyBKb2luQ29sdW1uQW5ub3RhdGlvbgotewkKLQlwdWJsaWMgTnVsbEpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY3MmMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbEpvaW5UYWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsSm9pblRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgTnVsbEJhc2VUYWJsZUFubm90YXRpb248Sm9pblRhYmxlQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIEpvaW5UYWJsZUFubm90YXRpb24KLXsJCi0JcHVibGljIE51bGxKb2luVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiBqb2luIGNvbHVtbnMKLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIEVtcHR5TGlzdEl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQkvLyB0aGUgSm9pblRhYmxlIGFubm90YXRpb24gaXMgbWlzc2luZywgYWRkIGJvdGggaXQgYW5kIGEgam9pbiBjb2x1bW4gYXQgdGhlIHNhbWUgdGltZQotCQlyZXR1cm4gdGhpcy5hZGRBbm5vdGF0aW9uKCkuYWRkSm9pbkNvbHVtbihpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGludmVyc2Ugam9pbiBjb2x1bW5zCi0JcHVibGljIExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBpbnZlcnNlSm9pbkNvbHVtbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCS8vIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbiBpcyBtaXNzaW5nLCBhZGQgYm90aCBpdCBhbmQgYSBqb2luIGNvbHVtbiBhdCB0aGUgc2FtZSB0aW1lCi0JCXJldHVybiB0aGlzLmFkZEFubm90YXRpb24oKS5hZGRJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxOYW1lZENvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBkYWUwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxOYW1lZENvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLk51bGxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8dWw+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Q29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuT3JkZXJDb2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuUHJpbWFyeUtleUpvaW5Db2x1bW48L2NvZGU+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTnVsbE5hbWVkQ29sdW1uQW5ub3RhdGlvbjxBIGV4dGVuZHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uPgotCWV4dGVuZHMgTnVsbEFubm90YXRpb248QT4KLQlpbXBsZW1lbnRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsTmFtZWRDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNTcGVjaWZpZWQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZEFubm90YXRpb24oKS5zZXROYW1lKG5hbWUpOwotCQl9CQotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gKioqKiogY29sdW1uIGRlZmluaXRpb24KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKLQkJaWYgKGNvbHVtbkRlZmluaXRpb24gIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihjb2x1bW5EZWZpbml0aW9uKTsKLQkJfQkKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbHVtbkRlZmluaXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjOWU2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbjwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIE51bGxOYW1lZENvbHVtbkFubm90YXRpb248UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPgotCWltcGxlbWVudHMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uCi17CQotCXB1YmxpYyBOdWxsUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OdWxsVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUYWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRkYzUzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUYWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5UYWJsZTwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxUYWJsZUFubm90YXRpb24KLQlleHRlbmRzIE51bGxCYXNlVGFibGVBbm5vdGF0aW9uPFRhYmxlQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIFRhYmxlQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL051bGxUZW1wb3JhbEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDEyZDA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvTnVsbFRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbDwvY29kZT4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE51bGxUZW1wb3JhbEFubm90YXRpb24KLQlleHRlbmRzIE51bGxBbm5vdGF0aW9uPFRlbXBvcmFsQW5ub3RhdGlvbj4KLQlpbXBsZW1lbnRzIFRlbXBvcmFsQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBOdWxsVGVtcG9yYWxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFRlbXBvcmFsVHlwZSB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRBbm5vdGF0aW9uKCkuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09uZVRvTWFueUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNGZlOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5T25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT25lVG9NYW55QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VPbmVUb01hbnlBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlPbmVUb01hbnlBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzJhZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlPbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9uZVRvT25lQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgT25lVG9PbmVBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPbmVUb09uZUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlT25lVG9PbmVBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlPbmVUb09uZUFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI1YjM3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5T3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU9yZGVyQnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE9yZGVyQnlBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcmRlckJ5QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JkZXJCeUFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlT3JkZXJCeUFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU9yZGVyQnlBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjczMWMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uYnVpbGRTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBpbmRleCk7Ci0JfQotCi0JcHVibGljIE5lc3RhYmxlQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24sIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEJpbmFyeVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmVzdGFibGVBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OU19fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbnNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTQ4ZDkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5TmFtZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbnMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFByaW1hcnlLZXlKb2luQ29sdW1uc0Fubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlTmFtZWRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCwgZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlOYW1lZEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uLCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMDlmZjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5U2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBOZXN0YWJsZUFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTmVzdGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBTZWNvbmRhcnlUYWJsZUFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE5lc3RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5idWlsZFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgTmVzdGFibGVBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbiwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5U2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROZXN0YWJsZUFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRhaW5lckFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRVM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5TRUNPTkRBUllfVEFCTEVTX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc0Fubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZTE0YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZXNBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlOYW1lZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZU5hbWVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgU2Vjb25kYXJ5VGFibGVzQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VOYW1lZEFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50LCBnZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeU5hbWVkQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24sIGdldEFubm90YXRpb25OYW1lKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKUEEuU0VDT05EQVJZX1RBQkxFUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ODRhMjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVNlcXVlbmNlR2VuZXJhdG9yMV8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlU2VxdWVuY2VHZW5lcmF0b3IxXzBBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvcjFfMEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTg5ZDY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZUFubm90YXRpb25EZWZpbml0aW9uCi0JaW1wbGVtZW50cyBBbm5vdGF0aW9uRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25EZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFRhYmxlQW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVGFibGVBbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVRhYmxlQW5ub3RhdGlvbihwYXJlbnQsIGFubm90YXRlZEVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBOdWxsVGFibGVBbm5vdGF0aW9uKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5VGFibGVBbm5vdGF0aW9uKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIFRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiZTJkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uRGVmaW5pdGlvbgotCWltcGxlbWVudHMgQW5ub3RhdGlvbkRlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBUYWJsZUdlbmVyYXRvckFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VUYWJsZUdlbmVyYXRvckFubm90YXRpb24ocGFyZW50LCBhbm5vdGF0ZWRFbGVtZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZE51bGxBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlyZXR1cm4gbmV3IEJpbmFyeVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGVtcG9yYWxBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2OTk2MmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlUZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWwKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlbXBvcmFsQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVGVtcG9yYWxBbm5vdGF0aW9uRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBUZW1wb3JhbEFubm90YXRpb25EZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50KSB7Ci0JCXJldHVybiBuZXcgU291cmNlVGVtcG9yYWxBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gbmV3IE51bGxUZW1wb3JhbEFubm90YXRpb24ocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlUZW1wb3JhbEFubm90YXRpb24ocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudEFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMGExM2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRBbm5vdGF0aW9uRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbkRlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5VHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlRyYW5zaWVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkRlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVHJhbnNpZW50QW5ub3RhdGlvbkRlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VUcmFuc2llbnRBbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBBbm5vdGF0aW9uIGJ1aWxkTnVsbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5VHJhbnNpZW50QW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9WZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDZlNjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9WZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb25EZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeVZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VWZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBWZXJzaW9uQW5ub3RhdGlvbkRlZmluaXRpb24KLQlpbXBsZW1lbnRzIEFubm90YXRpb25EZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkRlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgVmVyc2lvbkFubm90YXRpb25EZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFubm90YXRpb25EZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIFZlcnNpb25Bbm5vdGF0aW9uRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCkgewotCQlyZXR1cm4gbmV3IFNvdXJjZVZlcnNpb25Bbm5vdGF0aW9uKHBhcmVudCwgYW5ub3RhdGVkRWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb24gYnVpbGROdWxsQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbiBidWlsZEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJcmV0dXJuIG5ldyBCaW5hcnlWZXJzaW9uQW5ub3RhdGlvbihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNDhkNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5T3ZlcnJpZGVBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbgotewotCXByaXZhdGUgZmluYWwgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1uczsKLQotCi0JcHJvdGVjdGVkIEJpbmFyeUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuam9pbkNvbHVtbnMgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5T3ZlcnJpZGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkFTU09DSUFUSU9OX09WRVJSSURFX19OQU1FOwotCX0KLQotCQotCS8vICoqKioqKioqKiogQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogam9pbiBjb2x1bW5zCi0JcHVibGljIExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPih0aGlzLmpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbnMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBidWlsZEpvaW5Db2x1bW5zKCkgewotCQlPYmplY3RbXSBqZHRKb2luQ29sdW1ucyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TKTsKLQkJVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPihqZHRKb2luQ29sdW1ucy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBqZHRKb2luQ29sdW1uIDogamR0Sm9pbkNvbHVtbnMpIHsKLQkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Sm9pbkNvbHVtbikpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWM2YTRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5OdWxsQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlPdmVycmlkZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbgotewotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW47Ci0JcHJpdmF0ZSBmaW5hbCBDb2x1bW5Bbm5vdGF0aW9uIG51bGxDb2x1bW47Ci0KLQotCXB1YmxpYyBCaW5hcnlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5jb2x1bW4gPSB0aGlzLmJ1aWxkQ29sdW1uKCk7Ci0JCXRoaXMubnVsbENvbHVtbiA9IHRoaXMuYnVpbGROdWxsQ29sdW1uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUNvbHVtbigpOwotCX0KLQotCi0JLy8qKioqKioqKioqKiogQmluYXJ5T3ZlcnJpZGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkFUVFJJQlVURV9PVkVSUklERV9fTkFNRTsKLQl9Ci0JCi0KLQkvLyoqKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb2x1bW4KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCkgewotCQlyZXR1cm4gKHRoaXMuY29sdW1uICE9IG51bGwpID8gdGhpcy5jb2x1bW4gOiB0aGlzLm51bGxDb2x1bW47Ci0JfQotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW4oKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZENvbHVtbigpIHsKLQkJSUFubm90YXRpb24gamR0Q29sdW1uID0gdGhpcy5nZXRKZHRDb2x1bW4oKTsKLQkJcmV0dXJuIChqZHRDb2x1bW4gPT0gbnVsbCkgPyBudWxsIDogdGhpcy5idWlsZENvbHVtbihqZHRDb2x1bW4pOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQW5ub3RhdGlvbiBidWlsZE51bGxDb2x1bW4oKSB7Ci0JCXJldHVybiBuZXcgTnVsbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uQW5ub3RhdGlvbih0aGlzKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGRDb2x1bW4oSUFubm90YXRpb24gamR0Q29sdW1uKSB7Ci0JCXJldHVybiBuZXcgQmluYXJ5Q29sdW1uQW5ub3RhdGlvbih0aGlzLCBqZHRDb2x1bW4pOwotCX0KLQotCXByaXZhdGUgSUFubm90YXRpb24gZ2V0SmR0Q29sdW1uKCkgewotCQlyZXR1cm4gKElBbm5vdGF0aW9uKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbHVtbihDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbikgewotCQlDb2x1bW5Bbm5vdGF0aW9uIG9sZCA9IHRoaXMuY29sdW1uOwotCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENPTFVNTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW4pOwotCX0KLQotCS8vIFRPRE8KLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29sdW1uKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLS8vCQlJQW5ub3RhdGlvbiBqZHRDb2x1bW4gPSB0aGlzLmdldEpkdENvbHVtbigpOwotLy8JCWlmIChqZHRDb2x1bW4gPT0gbnVsbCkgewotLy8JCQl0aGlzLnNldENvbHVtbihudWxsKTsKLS8vCQl9IGVsc2UgewotLy8JCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotLy8JCQkJdGhpcy5zZXRDb2x1bW4odGhpcy5idWlsZENvbHVtbihqZHRDb2x1bW4pKTsKLS8vCQkJfSBlbHNlIHsKLS8vCQkJCXRoaXMuY29sdW1uLnVwZGF0ZShqZHRDb2x1bW4pOwotLy8JCQl9Ci0vLwkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjdlZTNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbgotICogamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5QmFzZUNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQmFzZUNvbHVtbkFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyB0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gdW5pcXVlOwotCXByaXZhdGUgQm9vbGVhbiBudWxsYWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gaW5zZXJ0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gdXBkYXRhYmxlOwotCQotCi0JcHJvdGVjdGVkIEJpbmFyeUJhc2VDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoKTsKLQkJdGhpcy51bmlxdWUgPSB0aGlzLmJ1aWxkVW5pcXVlKCk7Ci0JCXRoaXMubnVsbGFibGUgPSB0aGlzLmJ1aWxkTnVsbGFibGUoKTsKLQkJdGhpcy5pbnNlcnRhYmxlID0gdGhpcy5idWlsZEluc2VydGFibGUoKTsKLQkJdGhpcy51cGRhdGFibGUgPSB0aGlzLmJ1aWxkVXBkYXRhYmxlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRUYWJsZV8odGhpcy5idWlsZFRhYmxlKCkpOwotCQl0aGlzLnNldFVuaXF1ZV8odGhpcy5idWlsZFVuaXF1ZSgpKTsKLQkJdGhpcy5zZXROdWxsYWJsZV8odGhpcy5idWlsZE51bGxhYmxlKCkpOwotCQl0aGlzLnNldEluc2VydGFibGVfKHRoaXMuYnVpbGRJbnNlcnRhYmxlKCkpOwotCQl0aGlzLnNldFVwZGF0YWJsZV8odGhpcy5idWlsZFVwZGF0YWJsZSgpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKiBCYXNlQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqCi0KLQkvLyAqKioqKiB0YWJsZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFRhYmxlXyhTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFibGU7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUYWJsZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRUYWJsZUVsZW1lbnROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFRhYmxlRWxlbWVudE5hbWUoKTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHRhYmxlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiB1bmlxdWUKLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFVuaXF1ZV8oQm9vbGVhbiB1bmlxdWUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnVuaXF1ZTsKLQkJdGhpcy51bmlxdWUgPSB1bmlxdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVTklRVUVfUFJPUEVSVFksIG9sZCwgdW5pcXVlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRVbmlxdWUoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldFVuaXF1ZUVsZW1lbnROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLy8gKioqKiogbnVsbGFibGUKLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubnVsbGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TnVsbGFibGVfKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm51bGxhYmxlOwotCQl0aGlzLm51bGxhYmxlID0gbnVsbGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOVUxMQUJMRV9QUk9QRVJUWSwgb2xkLCBudWxsYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkTnVsbGFibGUoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE51bGxhYmxlRWxlbWVudE5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TnVsbGFibGVFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXROdWxsYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLy8gKioqKiogaW5zZXJ0YWJsZQotCXB1YmxpYyBCb29sZWFuIGdldEluc2VydGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmluc2VydGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEluc2VydGFibGVfKEJvb2xlYW4gaW5zZXJ0YWJsZSkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMuaW5zZXJ0YWJsZTsKLQkJdGhpcy5pbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKElOU0VSVEFCTEVfUFJPUEVSVFksIG9sZCwgaW5zZXJ0YWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEluc2VydGFibGVFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXRJbnNlcnRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQkvLyAqKioqKiB1cGRhdGFibGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFVwZGF0YWJsZV8oQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnVwZGF0YWJsZTsKLQkJdGhpcy51cGRhdGFibGUgPSB1cGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUERBVEFCTEVfUFJPUEVSVFksIG9sZCwgdXBkYXRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldFVwZGF0YWJsZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VXBkYXRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDhhY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KLXsKLQlwcml2YXRlIERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlOwotCXByaXZhdGUgSW50ZWdlciBsZW5ndGg7Ci0KLQotCXByb3RlY3RlZCBCaW5hcnlCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZSA9IHRoaXMuYnVpbGREaXNjcmltaW5hdG9yVHlwZSgpOwotCQl0aGlzLmxlbmd0aCA9IHRoaXMuYnVpbGRMZW5ndGgoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldERpc2NyaW1pbmF0b3JUeXBlXyh0aGlzLmJ1aWxkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCXRoaXMuc2V0TGVuZ3RoXyh0aGlzLmJ1aWxkTGVuZ3RoKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBkaXNjcmltaW5hdG9yIHR5cGUKLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIGRpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREaXNjcmltaW5hdG9yVHlwZV8oRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJRGlzY3JpbWluYXRvclR5cGUgb2xkID0gdGhpcy5kaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZLCBvbGQsIGRpc2NyaW1pbmF0b3JUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIERpc2NyaW1pbmF0b3JUeXBlIGJ1aWxkRGlzY3JpbWluYXRvclR5cGUoKSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0RGlzY3JpbWluYXRvclR5cGVFbGVtZW50TmFtZSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREaXNjcmltaW5hdG9yVHlwZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBsZW5ndGgKLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TGVuZ3RoXyhJbnRlZ2VyIGxlbmd0aCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubGVuZ3RoOwotCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExFTkdUSF9QUk9QRVJUWSwgb2xkLCBsZW5ndGgpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZExlbmd0aCgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0TGVuZ3RoRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlRW51bWVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2FiZGVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2VFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVudW1lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeUJhc2VFbnVtZXJhdGVkQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRW51bWVyYXRlZEFubm90YXRpb24KLXsKLQlwcml2YXRlIEVudW1UeXBlIHZhbHVlOwotCQotCi0JcHJvdGVjdGVkIEJpbmFyeUJhc2VFbnVtZXJhdGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRWYWx1ZV8odGhpcy5idWlsZFZhbHVlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFbnVtZXJhdGVkQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBFbnVtVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKEVudW1UeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKEVudW1UeXBlIHZhbHVlKSB7Ci0JCUVudW1UeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFbnVtVHlwZSBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gRW51bVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldFZhbHVlRWxlbWVudE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0VmFsdWVFbGVtZW50TmFtZSgpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlSm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM0ZTdiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlSm9pbkNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNlSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUpvaW5Db2x1bW4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeUJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QmFzZUNvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIEJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0KLQlwdWJsaWMgQmluYXJ5QmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lXyh0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZUVsZW1lbnROYW1lKCk7Ci0KLQotCS8vKioqKioqKioqKioqIEJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioKLQotCS8vIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lXyhTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgcmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlVGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMjMyOWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2VUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuVGFibGUKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZQotICogamF2YXgucGVyc2lzdGVuY2UuU2Vjb25kYXJ5VGFibGUKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEJhc2VUYWJsZUFubm90YXRpb24KLXsKLQlTdHJpbmcgbmFtZTsKLQlTdHJpbmcgc2NoZW1hOwotCVN0cmluZyBjYXRhbG9nOwotCWZpbmFsIFZlY3RvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHM7Ci0KLQotCXByb3RlY3RlZCBCaW5hcnlCYXNlVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7Ci0JCXRoaXMuc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYSgpOwotCQl0aGlzLmNhdGFsb2cgPSB0aGlzLmJ1aWxkQ2F0YWxvZygpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzID0gdGhpcy5idWlsZFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXRTY2hlbWFfKHRoaXMuYnVpbGRTY2hlbWEoKSk7Ci0JCXRoaXMuc2V0Q2F0YWxvZ18odGhpcy5idWlsZENhdGFsb2coKSk7Ci0JCXRoaXMudXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCYXNlVGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogc2NoZW1hCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNjaGVtYTsKLQkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFNjaGVtYSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRTY2hlbWFFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNjaGVtYUVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGNhdGFsb2cKLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY2F0YWxvZzsKLQkJdGhpcy5jYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDYXRhbG9nKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldENhdGFsb2dFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENhdGFsb2dFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHVuaXF1ZSBjb25zdHJhaW50cwotCi0JcHVibGljIExpc3RJdGVyYWJsZTxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKSB7Ci0JCXJldHVybiBuZXcgTGl2ZUNsb25lTGlzdEl0ZXJhYmxlPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPih0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQ29uc3RyYWludHMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiBidWlsZFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlPYmplY3RbXSBqZHRVbmlxdWVDb25zdHJhaW50cyA9IHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWVzKHRoaXMuZ2V0VW5pcXVlQ29uc3RyYWludEVsZW1lbnROYW1lKCkpOwotCQlWZWN0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+KGpkdFVuaXF1ZUNvbnN0cmFpbnRzLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdFVuaXF1ZUNvbnN0cmFpbnQgOiBqZHRVbmlxdWVDb25zdHJhaW50cykgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRVbmlxdWVDb25zdHJhaW50KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVuaXF1ZUNvbnN0cmFpbnRFbGVtZW50TmFtZSgpOwotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNlVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNGJmZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5QmFzZVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWwKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleVRlbXBvcmFsCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlCYXNlVGVtcG9yYWxBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBUZW1wb3JhbEFubm90YXRpb24KLXsKLQlwcml2YXRlIFRlbXBvcmFsVHlwZSB2YWx1ZTsKLQotCi0JcHJvdGVjdGVkIEJpbmFyeUJhc2VUZW1wb3JhbEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVGVtcG9yYWxBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoVGVtcG9yYWxUeXBlIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oVGVtcG9yYWxUeXBlIHZhbHVlKSB7Ci0JCVRlbXBvcmFsVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wb3JhbFR5cGUgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIFRlbXBvcmFsVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKGdldFZhbHVlRWxlbWVudE5hbWUoKSkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlCYXNpY0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2ljQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWI3YTM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUJhc2ljQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlCYXNpY0Fubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEJhc2ljQW5ub3RhdGlvbgotewotCXByaXZhdGUgQm9vbGVhbiBvcHRpb25hbDsKLQlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKLQotCi0JcHVibGljIEJpbmFyeUJhc2ljQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKCk7Ci0JCXRoaXMuZmV0Y2ggPSB0aGlzLmJ1aWxkRmV0Y2goKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0T3B0aW9uYWxfKHRoaXMuYnVpbGRPcHRpb25hbCgpKTsKLQkJdGhpcy5zZXRGZXRjaF8odGhpcy5idWlsZEZldGNoKCkpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKiogQmFzaWMgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JLy8gKioqKiogb3B0aW9uYWwKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxfKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuQkFTSUNfX09QVElPTkFMKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGZldGNoCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIHRoaXMuZmV0Y2g7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRGZXRjaF8oRmV0Y2hUeXBlIGZldGNoKSB7Ci0JCUZldGNoVHlwZSBvbGQgPSB0aGlzLmZldGNoOwotCQl0aGlzLmZldGNoID0gZmV0Y2g7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChGRVRDSF9QUk9QRVJUWSwgb2xkLCBmZXRjaCk7Ci0JfQotCi0JcHJpdmF0ZSBGZXRjaFR5cGUgYnVpbGRGZXRjaCgpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5CQVNJQ19fRkVUQ0gpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Q29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQzNDc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQ29sdW1uQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeUJhc2VDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX1RBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19VTklRVUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROdWxsYWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fTlVMTEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19JTlNFUlRBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19VUERBVEFCTEU7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogQmluYXJ5Q29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExlbmd0aEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fTEVOR1RIOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWNpc2lvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fUFJFQ0lTSU9OOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNjYWxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19TQ0FMRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlDb21wbGV0ZUNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ4NDRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db21wbGV0ZUNvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgQ29sdW1uQW5ub3RhdGlvbiB0byBiZSB1c2VkIGZvciBKUEEgYW5ub3RhdGlvbnM6Ci0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW4KLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUNvbHVtbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5Q29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlCYXNlQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIEludGVnZXIgbGVuZ3RoOwotCXByb3RlY3RlZCBJbnRlZ2VyIHByZWNpc2lvbjsKLQlwcm90ZWN0ZWQgSW50ZWdlciBzY2FsZTsKLQotCi0JcHJvdGVjdGVkIEJpbmFyeUNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmxlbmd0aCA9IHRoaXMuYnVpbGRMZW5ndGgoKTsKLQkJdGhpcy5wcmVjaXNpb24gPSB0aGlzLmJ1aWxkUHJlY2lzaW9uKCk7Ci0JCXRoaXMuc2NhbGUgPSB0aGlzLmJ1aWxkU2NhbGUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldExlbmd0aF8odGhpcy5idWlsZExlbmd0aCgpKTsKLQkJdGhpcy5zZXRQcmVjaXNpb25fKHRoaXMuYnVpbGRQcmVjaXNpb24oKSk7Ci0JCXRoaXMuc2V0U2NhbGVfKHRoaXMuYnVpbGRTY2FsZSgpKTsKLQl9Ci0KLQotCSAvLyAqKioqKioqKioqIENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbGVuZ3RoCi0JcHVibGljIEludGVnZXIgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRMZW5ndGhfKEludGVnZXIgbGVuZ3RoKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5sZW5ndGg7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTEVOR1RIX1BST1BFUlRZLCBvbGQsIGxlbmd0aCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkTGVuZ3RoKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRMZW5ndGhFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogcHJlY2lzaW9uCi0JcHVibGljIEludGVnZXIgZ2V0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5wcmVjaXNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uKEludGVnZXIgcHJlY2lzaW9uKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcmVjaXNpb25fKEludGVnZXIgcHJlY2lzaW9uKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5wcmVjaXNpb247Ci0JCXRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGQsIHByZWNpc2lvbik7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkUHJlY2lzaW9uKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRQcmVjaXNpb25FbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFByZWNpc2lvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVjaXNpb25FbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogc2NhbGUKLQlwdWJsaWMgSW50ZWdlciBnZXRTY2FsZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NhbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NhbGUoSW50ZWdlciBzY2FsZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2NhbGVfKEludGVnZXIgc2NhbGUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLnNjYWxlOwotCQl0aGlzLnNjYWxlID0gc2NhbGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTQ0FMRV9QUk9QRVJUWSwgb2xkLCBzY2FsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkU2NhbGUoKSB7Ci0JCXJldHVybiAoSW50ZWdlcikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldFNjYWxlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2FsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTY2FsZUVsZW1lbnROYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmZWEzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uCi17Ci0KLQotCXB1YmxpYyBCaW5hcnlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNjcmltaW5hdG9yVHlwZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIOwotCX0KLQotCS8vICoqKioqKioqKiogQmluYXJ5TmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYTU1N2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JWYWx1ZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgQmluYXJ5RGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRV9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbWJlZGRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkYWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3ZjQ2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbWJlZGRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVtYmVkZGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFbWJlZGRhYmxlQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUVtYmVkZGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVtYmVkZGVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZmVlMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFbWJlZGRlZEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVtYmVkZGVkQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUVtYmVkZGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbWJlZGRlZElkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW1iZWRkZWRJZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3YzY1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbWJlZGRlZElkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkSWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUVtYmVkZGVkSWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFbWJlZGRlZElkQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUVtYmVkZGVkSWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudGl0eUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudGl0eUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwNGI5NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlFbnRpdHlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuRW50aXR5Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlFbnRpdHlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFbnRpdHlBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCi0JcHVibGljIEJpbmFyeUVudGl0eUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRW50aXR5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLkVOVElUWV9fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW51bWVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUVudW1lcmF0ZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MzllMWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5RW51bWVyYXRlZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuRW51bWVyYXRlZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5RW51bWVyYXRlZEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUJhc2VFbnVtZXJhdGVkQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRW51bWVyYXRlZEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlFbnVtZXJhdGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5FTlVNRVJBVEVEX19WQUxVRTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQxYjA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRlZFZhbHVlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbgotewotCXByaXZhdGUgR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3k7Ci0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yOwotCi0KLQlwdWJsaWMgQmluYXJ5R2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU3RyYXRlZ3koKTsKLQkJdGhpcy5nZW5lcmF0b3IgPSB0aGlzLmJ1aWxkR2VuZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFN0cmF0ZWd5Xyh0aGlzLmJ1aWxkU3RyYXRlZ3koKSk7Ci0JCXRoaXMuc2V0R2VuZXJhdG9yXyh0aGlzLmJ1aWxkR2VuZXJhdG9yKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogc3RyYXRlZ3kKLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFN0cmF0ZWd5XyhHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgewotCQlHZW5lcmF0aW9uVHlwZSBvbGQgPSB0aGlzLnN0cmF0ZWd5OwotCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTVFJBVEVHWV9QUk9QRVJUWSwgb2xkLCBzdHJhdGVneSk7Ci0JfQotCQotCXByaXZhdGUgR2VuZXJhdGlvblR5cGUgYnVpbGRTdHJhdGVneSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLmZyb21KYXZhQW5ub3RhdGlvblZhbHVlKHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLkdFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kpKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0JCi0JLy8gKioqKiogZ2VuZXJhdG9yCi0JcHVibGljIFN0cmluZyBnZXRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEdlbmVyYXRvcl8oU3RyaW5nIGdlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5nZW5lcmF0b3I7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVE9SX1BST1BFUlRZLCBvbGQsIGdlbmVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUik7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0R2VuZXJhdG9yVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdlbmVyYXRvclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMzAyNWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5R2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0b3JBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvcgotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlHZW5lcmF0b3JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBHZW5lcmF0b3JBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIG5hbWU7Ci0JSW50ZWdlciBpbml0aWFsVmFsdWU7Ci0JSW50ZWdlciBhbGxvY2F0aW9uU2l6ZTsKLQotCi0JQmluYXJ5R2VuZXJhdG9yQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCQl0aGlzLmluaXRpYWxWYWx1ZSA9IHRoaXMuYnVpbGRJbml0aWFsVmFsdWUoKTsKLQkJdGhpcy5hbGxvY2F0aW9uU2l6ZSA9IHRoaXMuYnVpbGRBbGxvY2F0aW9uU2l6ZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0TmFtZV8odGhpcy5idWlsZE5hbWUoKSk7Ci0JCXRoaXMuc2V0SW5pdGlhbFZhbHVlXyh0aGlzLmJ1aWxkSW5pdGlhbFZhbHVlKCkpOwotCQl0aGlzLnNldEFsbG9jYXRpb25TaXplXyh0aGlzLmJ1aWxkQWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogR2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXROYW1lRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGluaXRpYWwgdmFsdWUKLQlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmluaXRpYWxWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsVmFsdWUoSW50ZWdlciBpbml0aWFsVmFsdWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEluaXRpYWxWYWx1ZV8oSW50ZWdlciBpbml0aWFsVmFsdWUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmluaXRpYWxWYWx1ZTsKLQkJdGhpcy5pbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTklUSUFMX1ZBTFVFX1BST1BFUlRZLCBvbGQsIGluaXRpYWxWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkSW5pdGlhbFZhbHVlKCkgewotCQlyZXR1cm4gKEludGVnZXIpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUodGhpcy5nZXRJbml0aWFsVmFsdWVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0SW5pdGlhbFZhbHVlRWxlbWVudE5hbWUoKTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5pdGlhbFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWxsb2NhdGlvblNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBhbGxvY2F0aW9uU2l6ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0QWxsb2NhdGlvblNpemVfKEludGVnZXIgYWxsb2NhdGlvblNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmFsbG9jYXRpb25TaXplOwotCQl0aGlzLmFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvblNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIGFsbG9jYXRpb25TaXplKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIChJbnRlZ2VyKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0QWxsb2NhdGlvblNpemVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0QWxsb2NhdGlvblNpemVFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXRBbGxvY2F0aW9uU2l6ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUlkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjk0YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLklkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlJZEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIElkQW5ub3RhdGlvbgotewotCi0JcHVibGljIEJpbmFyeUlkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlJZENsYXNzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SWRDbGFzc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3NGE2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlJZENsYXNzQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5JZENsYXNzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlJZENsYXNzQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgSWRDbGFzc0Fubm90YXRpb24gCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlJZENsYXNzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElkQ2xhc3NBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLklEX0NMQVNTX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZQotCS8qKgotCSAqIGJpbmFyeSBpcyBhbHJlYWR5IGZ1bGx5LXF1YWxpZmllZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5SW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlJbmhlcml0YW5jZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyMDkzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlJbmhlcml0YW5jZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5SW5oZXJpdGFuY2VBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBJbmhlcml0YW5jZUFubm90YXRpb24KLXsKLQlwcml2YXRlIEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneTsKLQotCi0JcHVibGljIEJpbmFyeUluaGVyaXRhbmNlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnN0cmF0ZWd5ID0gdGhpcy5idWlsZFN0cmF0ZWd5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFN0cmF0ZWd5Xyh0aGlzLmJ1aWxkU3RyYXRlZ3koKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBzdHJhdGVneQotCXB1YmxpYyBJbmhlcml0YW5jZVR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U3RyYXRlZ3lfKEluaGVyaXRhbmNlVHlwZSBzdHJhdGVneSkgewotCQlJbmhlcml0YW5jZVR5cGUgb2xkID0gdGhpcy5zdHJhdGVneTsKLQkJdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU1RSQVRFR1lfUFJPUEVSVFksIG9sZCwgc3RyYXRlZ3kpOwotCX0KLQotCXByaXZhdGUgSW5oZXJpdGFuY2VUeXBlIGJ1aWxkU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuSU5IRVJJVEFOQ0VfX1NUUkFURUdZKSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmFmYTI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlCYXNlSm9pbkNvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIEpvaW5Db2x1bW5Bbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5Sm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX1RBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX1VOSVFVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX05VTExBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19JTlNFUlRBQkxFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXBkYXRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX1VQREFUQUJMRTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlSm9pbkNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Sm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5Sm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2UxMDUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUpvaW5UYWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luVGFibGUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeUpvaW5UYWJsZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEpvaW5UYWJsZUFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gam9pbkNvbHVtbnM7Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1uczsKLQotCi0JcHVibGljIEJpbmFyeUpvaW5UYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5qb2luQ29sdW1ucyA9IHRoaXMuYnVpbGRKb2luQ29sdW1ucygpOwotCQl0aGlzLmludmVyc2VKb2luQ29sdW1ucyA9IHRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlSm9pbkNvbHVtbnMoKTsKLQkJdGhpcy51cGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5QmFzZVRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX1RBQkxFX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9UQUJMRV9fU0NIRU1BOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZ0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fVEFCTEVfX0NBVEFMT0c7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKb2luVGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGpvaW4gY29sdW1ucwotCXB1YmxpYyBMaXN0SXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4odGhpcy5qb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlSm9pbkNvbHVtbihpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYnVpbGRKb2luQ29sdW1ucygpIHsKLQkJT2JqZWN0W10gamR0Sm9pbkNvbHVtbnMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuSk9JTl9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKLQkJVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPihqZHRKb2luQ29sdW1ucy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBqZHRKb2luQ29sdW1uIDogamR0Sm9pbkNvbHVtbnMpIHsKLQkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Sm9pbkNvbHVtbikpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucwotCXB1YmxpYyBMaXN0SXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldEludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGludmVyc2VKb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUludmVyc2VKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gYnVpbGRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCU9iamVjdFtdIGpkdEpvaW5Db2x1bW5zID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSlBBLkpPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TKTsKLQkJVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPihqZHRKb2luQ29sdW1ucy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBqZHRKb2luQ29sdW1uIDogamR0Sm9pbkNvbHVtbnMpIHsKLQkJCXJlc3VsdC5hZGQobmV3IEJpbmFyeUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Sm9pbkNvbHVtbikpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TG9iQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TG9iQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTc2Y2NkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeUxvYkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Mb2JBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkxvYgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5TG9iQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgTG9iQW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlMb2JBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRjZTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYW55VG9NYW55Ml8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5TWFueVRvTWFueUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBNYW55VG9NYW55Ml8wQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCi0KLQlwdWJsaWMgQmluYXJ5TWFueVRvTWFueUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5tYXBwZWRCeSA9IHRoaXMuYnVpbGRNYXBwZWRCeSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRNYXBwZWRCeV8odGhpcy5idWlsZE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTUFOWV9UT19NQU5ZX19UQVJHRVRfRU5USVRZOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRGZXRjaEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLk1BTllfVE9fTUFOWV9fRkVUQ0g7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldENhc2NhZGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5NQU5ZX1RPX01BTllfX0NBU0NBREU7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKioqKiogT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqCi0KLQkvLyAqKioqKiBtYXBwZWQgYnkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gdGhpcy5tYXBwZWRCeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXBwZWRCeShTdHJpbmcgbWFwcGVkQnkpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE1hcHBlZEJ5XyhTdHJpbmcgbWFwcGVkQnkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubWFwcGVkQnk7Ci0JCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE1BUFBFRF9CWV9QUk9QRVJUWSwgb2xkLCBtYXBwZWRCeSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk1BTllfVE9fTUFOWV9fTUFQUEVEX0JZKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hbnlUb09uZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hbnlUb09uZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzNTRlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlNYW55VG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYW55VG9PbmUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU1hbnlUb09uZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBNYW55VG9PbmUyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCi0KLQlwdWJsaWMgQmluYXJ5TWFueVRvT25lQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE9wdGlvbmFsXyh0aGlzLmJ1aWxkT3B0aW9uYWwoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUYXJnZXRFbnRpdHlFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5NQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RmV0Y2hFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5NQU5ZX1RPX09ORV9fRkVUQ0g7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldENhc2NhZGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5NQU5ZX1RPX09ORV9fQ0FTQ0FERTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogTWFueVRvT25lTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogb3B0aW9uYWwKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxfKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuTUFOWV9UT19PTkVfX09QVElPTkFMKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwS2V5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmE2MzY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcEtleUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU1hcEtleUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIE1hcEtleUFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0KLQlwdWJsaWMgQmluYXJ5TWFwS2V5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNYXBLZXlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TmFtZV8oU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuTUFQX0tFWV9fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjMzMTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLQotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbgotewotCXB1YmxpYyBCaW5hcnlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2NlYTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZENvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uOwotCi0KLQlwcm90ZWN0ZWQgQmluYXJ5TmFtZWRDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKCk7Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuYnVpbGRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXROYW1lXyh0aGlzLmJ1aWxkTmFtZSgpKTsKLQkJdGhpcy5zZXRDb2x1bW5EZWZpbml0aW9uXyh0aGlzLmJ1aWxkQ29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBOYW1lZENvbHVtbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogY29sdW1uIGRlZmluaXRpb24KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENvbHVtbkRlZmluaXRpb25fKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fREVGSU5JVElPTl9QUk9QRVJUWSwgb2xkLCBjb2x1bW5EZWZpbml0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZENvbHVtbkRlZmluaXRpb24oKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENvbHVtbkRlZmluaXRpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgxNWRjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyeQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeVF1ZXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyByZXN1bHRDbGFzczsKLQlwcml2YXRlIFN0cmluZyByZXN1bHRTZXRNYXBwaW5nOwotCi0KLQlwdWJsaWMgQmluYXJ5TmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5yZXN1bHRDbGFzcyA9IHRoaXMuYnVpbGRSZXN1bHRDbGFzcygpOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSB0aGlzLmJ1aWxkUmVzdWx0U2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRSZXN1bHRDbGFzc18odGhpcy5idWlsZFJlc3VsdENsYXNzKCkpOwotCQl0aGlzLnNldFJlc3VsdFNldE1hcHBpbmdfKHRoaXMuYnVpbGRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlTmFtZWRRdWVyeUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldFF1ZXJ5RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0SGludHNFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiByZXN1bHQgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFJlc3VsdENsYXNzXyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucmVzdWx0Q2xhc3M7Ci0JCXRoaXMucmVzdWx0Q2xhc3MgPSByZXN1bHRDbGFzczsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9DTEFTU19QUk9QRVJUWSwgb2xkLCByZXN1bHRDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRSZXN1bHRDbGFzcygpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlc3VsdENsYXNzVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCByZXN1bHQgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoKSAgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKLQl9Ci0KLQkvLyAqKioqKiByZXN1bHQgc2V0IG1hcHBpbmcKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKSB7Ci0JCXJldHVybiB0aGlzLnJlc3VsdFNldE1hcHBpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgcmVzdWx0U2V0TWFwcGluZykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZ18oU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nID0gcmVzdWx0U2V0TWFwcGluZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSwgb2xkLCByZXN1bHRTZXRNYXBwaW5nKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFJlc3VsdFNldE1hcHBpbmcoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9DTEFTUyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZXN1bHRTZXRNYXBwaW5nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU5hbWVkUXVlcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGFiY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeVF1ZXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgTmFtZWRRdWVyeUFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5TmFtZWRRdWVyeUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlTmFtZWRRdWVyeUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9RVUVSWV9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0UXVlcnlFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9RVUVSWV9fUVVFUlk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldEhpbnRzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfUVVFUllfX0hJTlRTOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9NYW55QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9NYW55QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDFlOGI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvTWFueUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeU9uZVRvTWFueUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBPbmVUb01hbnkyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbWFwcGVkQnk7Ci0KLQlwcml2YXRlIEJvb2xlYW4gb3JwaGFuUmVtb3ZhbDsgLy9hZGRlZCBpbiBKUEEgMi4wCi0KLQlwdWJsaWMgQmluYXJ5T25lVG9NYW55QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm1hcHBlZEJ5ID0gdGhpcy5idWlsZE1hcHBlZEJ5KCk7Ci0JCXRoaXMub3JwaGFuUmVtb3ZhbCA9IHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE1hcHBlZEJ5Xyh0aGlzLmJ1aWxkTWFwcGVkQnkoKSk7Ci0JCXRoaXMuc2V0T3JwaGFuUmVtb3ZhbF8odGhpcy5idWlsZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEJpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRUYXJnZXRFbnRpdHlFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5PTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0RmV0Y2hFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5PTkVfVE9fTUFOWV9fRkVUQ0g7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldENhc2NhZGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5PTkVfVE9fTUFOWV9fQ0FTQ0FERTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKiBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQotCS8vICoqKioqIG1hcHBlZCBieQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWFwcGVkQnlfKFN0cmluZyBtYXBwZWRCeSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IG1hcHBlZEJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGQsIG1hcHBlZEJ5KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE1hcHBlZEJ5KCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuT05FX1RPX01BTllfX01BUFBFRF9CWSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBwZWRCeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9uZVRvTWFueTJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9ycGhhblJlbW92YWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIChCb29sZWFuKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQTJfMC5PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRPcnBoYW5SZW1vdmFsXyhCb29sZWFuIG9ycGhhblJlbW92YWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9ycGhhblJlbW92YWw7Ci0JCXRoaXMub3JwaGFuUmVtb3ZhbCA9IG9ycGhhblJlbW92YWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSwgb2xkLCBvcnBoYW5SZW1vdmFsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9uZVRvT25lQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNWVhOWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T25lVG9PbmVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9PbmUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQotICovCi1wdWJsaWMgY2xhc3MgQmluYXJ5T25lVG9PbmVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotCWltcGxlbWVudHMgT25lVG9PbmUyXzBBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZEJ5OwotCXByaXZhdGUgQm9vbGVhbiBvcnBoYW5SZW1vdmFsOyAvL2FkZGVkIGluIEpQQSAyLjAKLQotCXB1YmxpYyBCaW5hcnlPbmVUb09uZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5vcHRpb25hbCA9IHRoaXMuYnVpbGRPcHRpb25hbCgpOwotCQl0aGlzLm1hcHBlZEJ5ID0gdGhpcy5idWlsZE1hcHBlZEJ5KCk7Ci0JCXRoaXMub3JwaGFuUmVtb3ZhbCA9IHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE9wdGlvbmFsXyh0aGlzLmJ1aWxkT3B0aW9uYWwoKSk7Ci0JCXRoaXMuc2V0TWFwcGVkQnlfKHRoaXMuYnVpbGRNYXBwZWRCeSgpKTsKLQkJdGhpcy5zZXRPcnBoYW5SZW1vdmFsXyh0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5UmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldFRhcmdldEVudGl0eUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLk9ORV9UT19PTkVfX1RBUkdFVF9FTlRJVFk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldEZldGNoRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuT05FX1RPX09ORV9fRkVUQ0g7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldENhc2NhZGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5PTkVfVE9fT05FX19DQVNDQURFOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JLy8gKioqKiogbWFwcGVkIGJ5Ci0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRNYXBwZWRCeV8oU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgbWFwcGVkQnkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWFwcGVkQnkoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5PTkVfVE9fT05FX19NQVBQRURfQlkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKioqIE9uZVRvT25lQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKgotCi0JLy8gKioqKiogb3B0aW9uYWwKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T3B0aW9uYWxfKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBvcHRpb25hbCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoKSB7Ci0JCXJldHVybiAoQm9vbGVhbikgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuT05FX1RPX09ORV9fT1BUSU9OQUwpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE9uZVRvT25lMl8wQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gdGhpcy5vcnBoYW5SZW1vdmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3JwaGFuUmVtb3ZhbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRPcnBoYW5SZW1vdmFsKCkgewotCQlyZXR1cm4gKEJvb2xlYW4pIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBMl8wLk9ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbF8oQm9vbGVhbiBvcnBoYW5SZW1vdmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcnBoYW5SZW1vdmFsOwotCQl0aGlzLm9ycGhhblJlbW92YWwgPSBvcnBoYW5SZW1vdmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgb3JwaGFuUmVtb3ZhbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T3JkZXJCeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU9yZGVyQnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWEzN2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5T3JkZXJCeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnkuQmluYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuT3JkZXJCeQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5T3JkZXJCeUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIE9yZGVyQnlBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlPcmRlckJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGFubm90YXRpb24pOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMuc2V0VmFsdWVfKHRoaXMuYnVpbGRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPcmRlckJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5PUkRFUl9CWV9fVkFMVUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTY4MDBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk92ZXJyaWRlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb21tb24gYmVoYXZpb3IgZm9yCi0gKiAgICAgamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGUKLSAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCaW5hcnlPdmVycmlkZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIE92ZXJyaWRlQW5ub3RhdGlvbgotewotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlPdmVycmlkZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCQotCi0JLy8gKioqKioqKioqKiBPdmVycmlkZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT3ZlcnJpZGVBbm5vdGF0aW9uLk5BTUVfUFJPUEVSVFksIG9sZCwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxZTRjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlByaW1hcnlLZXlKb2luQ29sdW1uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeU5hbWVkQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQotCXB1YmxpYyBCaW5hcnlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZV8odGhpcy5idWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlOYW1lZENvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWVfKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCByZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVF1ZXJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UXVlcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOWNlOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5UXVlcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeQotICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWROYXRpdmVRdWVyeQotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlRdWVyeUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFF1ZXJ5QW5ub3RhdGlvbgotewotCVN0cmluZyBuYW1lOwotCVN0cmluZyBxdWVyeTsKLQlmaW5hbCBWZWN0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4gaGludHM7Ci0KLQotCUJpbmFyeVF1ZXJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCQl0aGlzLnF1ZXJ5ID0gdGhpcy5idWlsZFF1ZXJ5KCk7Ci0JCXRoaXMuaGludHMgPSB0aGlzLmJ1aWxkSGludHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCQl0aGlzLnNldFF1ZXJ5Xyh0aGlzLmJ1aWxkUXVlcnkoKSk7Ci0JCXRoaXMudXBkYXRlSGludHMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCYXNlTmFtZWRRdWVyeUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXROYW1lXyhTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkLCBuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBxdWVyeQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UXVlcnlfKFN0cmluZyBxdWVyeSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5xdWVyeTsKLQkJdGhpcy5xdWVyeSA9IHF1ZXJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfUFJPUEVSVFksIG9sZCwgcXVlcnkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUXVlcnkoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKHRoaXMuZ2V0UXVlcnlFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0UXVlcnlFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXRRdWVyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBoaW50cwotCi0JcHVibGljIExpc3RJdGVyYWJsZTxRdWVyeUhpbnRBbm5vdGF0aW9uPiBnZXRIaW50cygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8UXVlcnlIaW50QW5ub3RhdGlvbj4odGhpcy5oaW50cyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRIaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmhpbnRzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgUXVlcnlIaW50QW5ub3RhdGlvbiBoaW50QXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmhpbnRzLmdldChpbmRleCk7Ci0JfQotCi0JcHVibGljIFF1ZXJ5SGludEFubm90YXRpb24gYWRkSGludChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZUhpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSGludChpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8UXVlcnlIaW50QW5ub3RhdGlvbj4gYnVpbGRIaW50cygpIHsKLQkJT2JqZWN0W10gamR0SGludHMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyh0aGlzLmdldEhpbnRzRWxlbWVudE5hbWUoKSk7Ci0JCVZlY3RvcjxRdWVyeUhpbnRBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgVmVjdG9yPFF1ZXJ5SGludEFubm90YXRpb24+KGpkdEhpbnRzLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdEhpbnQgOiBqZHRIaW50cykgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5UXVlcnlIaW50QW5ub3RhdGlvbih0aGlzLCAoSUFubm90YXRpb24pIGpkdEhpbnQpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRIaW50c0VsZW1lbnROYW1lKCk7Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUhpbnRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVF1ZXJ5SGludEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVF1ZXJ5SGludEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZjA1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlRdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlF1ZXJ5SGludAotICovCi1jbGFzcyBCaW5hcnlRdWVyeUhpbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBRdWVyeUhpbnRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCi0JQmluYXJ5UXVlcnlIaW50QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZSgpOwotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldE5hbWVfKHRoaXMuYnVpbGROYW1lKCkpOwotCQl0aGlzLnNldFZhbHVlXyh0aGlzLmJ1aWxkVmFsdWUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUXVlcnlIaW50QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5hbWVfKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIG5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLlFVRVJZX0hJTlRfX05BTUUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5RVUVSWV9ISU5UX19WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEwNTZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ2FzY2FkZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnkKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZQotICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55Ci0gKiBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZQotICovCi1hYnN0cmFjdCBjbGFzcyBCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24KLXsKLQlTdHJpbmcgdGFyZ2V0RW50aXR5OwotCUZldGNoVHlwZSBmZXRjaDsKLQlib29sZWFuIGNhc2NhZGVBbGw7Ci0JYm9vbGVhbiBjYXNjYWRlTWVyZ2U7Ci0JYm9vbGVhbiBjYXNjYWRlUGVyc2lzdDsKLQlib29sZWFuIGNhc2NhZGVSZWZyZXNoOwotCWJvb2xlYW4gY2FzY2FkZVJlbW92ZTsKLQlib29sZWFuIGNhc2NhZGVEZXRhY2g7IC8vYWRkZWQgaW4gSlBBIDIuMAotCi0KLQlCaW5hcnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLnRhcmdldEVudGl0eSA9IHRoaXMuYnVpbGRUYXJnZXRFbnRpdHkoKTsKLQkJdGhpcy5mZXRjaCA9IHRoaXMuYnVpbGRGZXRjaCgpOwotCQl0aGlzLmluaXRpYWxpemVDYXNjYWRlVHlwZXModGhpcy5idWlsZENhc2NhZGVUeXBlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhc2NhZGVUeXBlcyhDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcykgewotCQl0aGlzLmNhc2NhZGVBbGwgPSBBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuQUxMKTsKLQkJdGhpcy5jYXNjYWRlTWVyZ2UgPSBBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuTUVSR0UpOwotCQl0aGlzLmNhc2NhZGVQZXJzaXN0ID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlBFUlNJU1QpOwotCQl0aGlzLmNhc2NhZGVSZWZyZXNoID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFRlJFU0gpOwotCQl0aGlzLmNhc2NhZGVSZW1vdmUgPSBBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUkVNT1ZFKTsKLQkJdGhpcy5jYXNjYWRlRGV0YWNoID0gQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLkRFVEFDSCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRUYXJnZXRFbnRpdHlfKHRoaXMuYnVpbGRUYXJnZXRFbnRpdHkoKSk7Ci0JCXRoaXMuc2V0RmV0Y2hfKHRoaXMuYnVpbGRGZXRjaCgpKTsKLQkJdGhpcy51cGRhdGVDYXNjYWRlVHlwZXModGhpcy5idWlsZENhc2NhZGVUeXBlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYXNjYWRlVHlwZXMoQ2FzY2FkZVR5cGVbXSBjYXNjYWRlVHlwZXMpIHsKLQkJdGhpcy5zZXRDYXNjYWRlQWxsXyhBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuQUxMKSk7Ci0JCXRoaXMuc2V0Q2FzY2FkZU1lcmdlXyhBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuTUVSR0UpKTsKLQkJdGhpcy5zZXRDYXNjYWRlUGVyc2lzdF8oQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlBFUlNJU1QpKTsKLQkJdGhpcy5zZXRDYXNjYWRlUmVmcmVzaF8oQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLlJFRlJFU0gpKTsKLQkJdGhpcy5zZXRDYXNjYWRlUmVtb3ZlXyhBcnJheVRvb2xzLmNvbnRhaW5zKGNhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuUkVNT1ZFKSk7Ci0JCXRoaXMuc2V0Q2FzY2FkZURldGFjaF8oQXJyYXlUb29scy5jb250YWlucyhjYXNjYWRlVHlwZXMsIENhc2NhZGVUeXBlLkRFVEFDSCkpOwotCX0KLQotCS8vICoqKioqKioqKiogUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdGFyZ2V0IGVudGl0eQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRFbnRpdHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB0YXJnZXRFbnRpdHkpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRhcmdldEVudGl0eV8oU3RyaW5nIHRhcmdldEVudGl0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRFbnRpdHk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5ID0gdGFyZ2V0RW50aXR5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCB0YXJnZXRFbnRpdHkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldFRhcmdldEVudGl0eUVsZW1lbnROYW1lKCkpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRUYXJnZXRFbnRpdHlFbGVtZW50TmFtZSgpOwotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHRhcmdldCBlbnRpdHkgY2xhc3MgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEVudGl0eTsKLQl9Ci0KLQkvLyAqKioqKiBmZXRjaAotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RmV0Y2hfKEZldGNoVHlwZSBmZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IGZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgZmV0Y2gpOwotCX0KLQotCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goKSB7Ci0JCXJldHVybiBGZXRjaFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5nZXRKZHRNZW1iZXJWYWx1ZSh0aGlzLmdldEZldGNoRWxlbWVudE5hbWUoKSkpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRGZXRjaEVsZW1lbnROYW1lKCk7Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGNhc2NhZGUKLQlwcml2YXRlIENhc2NhZGVUeXBlW10gYnVpbGRDYXNjYWRlVHlwZXMoKSB7Ci0JCXJldHVybiBDYXNjYWRlVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZXModGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXModGhpcy5nZXRDYXNjYWRlRWxlbWVudE5hbWUoKSkpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRDYXNjYWRlRWxlbWVudE5hbWUoKTsKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2FzY2FkZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBjYXNjYWRlIGFsbAotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZUFsbCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZUFsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlQWxsKGJvb2xlYW4gY2FzY2FkZUFsbCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZUFsbF8oYm9vbGVhbiBjYXNjYWRlQWxsKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5jYXNjYWRlQWxsOwotCQl0aGlzLmNhc2NhZGVBbGwgPSBjYXNjYWRlQWxsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9BTExfUFJPUEVSVFksIG9sZCwgY2FzY2FkZUFsbCk7Ci0JfQotCi0JLy8gKioqKiogY2FzY2FkZSBtZXJnZQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlTWVyZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gY2FzY2FkZU1lcmdlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDYXNjYWRlTWVyZ2VfKGJvb2xlYW4gY2FzY2FkZU1lcmdlKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5jYXNjYWRlTWVyZ2U7Ci0JCXRoaXMuY2FzY2FkZU1lcmdlID0gY2FzY2FkZU1lcmdlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9NRVJHRV9QUk9QRVJUWSwgb2xkLCBjYXNjYWRlTWVyZ2UpOwotCX0KLQotCS8vICoqKioqIGNhc2NhZGUgcGVyc2lzdAotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZVBlcnNpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGVQZXJzaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVQZXJzaXN0KGJvb2xlYW4gY2FzY2FkZVBlcnNpc3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENhc2NhZGVQZXJzaXN0Xyhib29sZWFuIGNhc2NhZGVQZXJzaXN0KSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5jYXNjYWRlUGVyc2lzdDsKLQkJdGhpcy5jYXNjYWRlUGVyc2lzdCA9IGNhc2NhZGVQZXJzaXN0OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZLCBvbGQsIGNhc2NhZGVQZXJzaXN0KTsKLQl9Ci0KLQkvLyAqKioqKiBjYXNjYWRlIHJlZnJlc2gKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlUmVmcmVzaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuIGNhc2NhZGVSZWZyZXNoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDYXNjYWRlUmVmcmVzaF8oYm9vbGVhbiBjYXNjYWRlUmVmcmVzaCkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZVJlZnJlc2g7Ci0JCXRoaXMuY2FzY2FkZVJlZnJlc2ggPSBjYXNjYWRlUmVmcmVzaDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUkVGUkVTSF9QUk9QRVJUWSwgb2xkLCBjYXNjYWRlUmVmcmVzaCk7Ci0JfQotCi0JLy8gKioqKiogY2FzY2FkZSByZW1vdmUKLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKSB7Ci0JCXJldHVybiB0aGlzLmNhc2NhZGVSZW1vdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuIGNhc2NhZGVSZW1vdmUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENhc2NhZGVSZW1vdmVfKGJvb2xlYW4gY2FzY2FkZVJlbW92ZSkgewotCQlib29sZWFuIG9sZCA9IHRoaXMuY2FzY2FkZVJlbW92ZTsKLQkJdGhpcy5jYXNjYWRlUmVtb3ZlID0gY2FzY2FkZVJlbW92ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUkVNT1ZFX1BST1BFUlRZLCBvbGQsIGNhc2NhZGVSZW1vdmUpOwotCX0KLQotCS8vICoqKioqIGNhc2NhZGUgZGV0YWNoIC0gSlBBIDIuMAotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZURldGFjaCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZURldGFjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlRGV0YWNoKGJvb2xlYW4gY2FzY2FkZURldGFjaCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZURldGFjaF8oYm9vbGVhbiBjYXNjYWRlRGV0YWNoKSB7Ci0JCWJvb2xlYW4gb2xkID0gdGhpcy5jYXNjYWRlRGV0YWNoOwotCQl0aGlzLmNhc2NhZGVEZXRhY2ggPSBjYXNjYWRlRGV0YWNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9ERVRBQ0hfUFJPUEVSVFksIG9sZCwgY2FzY2FkZURldGFjaCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2U3Yzc2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBCaW5hcnlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUJhc2VUYWJsZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbgotewotCXByaXZhdGUgZmluYWwgVmVjdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1uczsKLQotCXB1YmxpYyBCaW5hcnlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zID0gdGhpcy5idWlsZFBrSm9pbkNvbHVtbnMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJc3VwZXIudXBkYXRlKCk7Ci0JCXRoaXMudXBkYXRlUGtKb2luQ29sdW1ucygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBCaW5hcnlCYXNlVGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRV9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNjaGVtYUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRV9fU0NIRU1BOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2F0YWxvZ0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRV9fQ0FUQUxPRzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuaXF1ZUNvbnN0cmFpbnRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5TRUNPTkRBUllfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKiogU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKLQotCS8vICoqKioqIHBrIGpvaW4gY29sdW1ucwotCXB1YmxpYyBMaXN0SXRlcmFibGU8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRQa0pvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+KHRoaXMucGtKb2luQ29sdW1ucyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQa0pvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1ucy5zaXplKCk7Ci0JfQotCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5BdChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1ucy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gYWRkUGtKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlUGtKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBrSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBWZWN0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBidWlsZFBrSm9pbkNvbHVtbnMoKSB7Ci0JCU9iamVjdFtdIGpkdEpvaW5Db2x1bW5zID0gdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZXMoSlBBLlNFQ09OREFSWV9UQUJMRV9fUEtfSk9JTl9DT0xVTU5TKTsKLQkJVmVjdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IFZlY3RvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+KGpkdEpvaW5Db2x1bW5zLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdEpvaW5Db2x1bW4gOiBqZHRKb2luQ29sdW1ucykgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHRoaXMsIChJQW5ub3RhdGlvbikgamR0Sm9pbkNvbHVtbikpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVQa0pvaW5Db2x1bW5zKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzgyMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5TZXF1ZW5jZUdlbmVyYXRvcgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluYXJ5U2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlHZW5lcmF0b3JBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyBzZXF1ZW5jZU5hbWU7Ci0KLQotCXByb3RlY3RlZCBCaW5hcnlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQkJdGhpcy5zZXF1ZW5jZU5hbWUgPSB0aGlzLmJ1aWxkU2VxdWVuY2VOYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnNldFNlcXVlbmNlTmFtZV8odGhpcy5idWlsZFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5R2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0SW5pdGlhbFZhbHVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRBbGxvY2F0aW9uU2l6ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogc2VxdWVuY2UgbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyBzZXF1ZW5jZU5hbWUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlcXVlbmNlTmFtZV8oU3RyaW5nIHNlcXVlbmNlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXF1ZW5jZU5hbWU7Ci0JCXRoaXMuc2VxdWVuY2VOYW1lID0gc2VxdWVuY2VOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBzZXF1ZW5jZU5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2VxdWVuY2VOYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlcXVlbmNlTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzZXF1ZW5jZU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNjY3ZWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlCYXNlVGFibGVBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBUYWJsZUFubm90YXRpb24KLXsKLQlwdWJsaWMgQmluYXJ5VGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmluYXJ5QmFzZVRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5UQUJMRV9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNjaGVtYUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlRBQkxFX19TQ0hFTUE7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDYXRhbG9nRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuVEFCTEVfX0NBVEFMT0c7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0N2U5NzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXZlQ2xvbmVMaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlHZW5lcmF0b3JBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBUYWJsZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQlwcml2YXRlIFN0cmluZyB0YWJsZTsKLQlwcml2YXRlIFN0cmluZyBzY2hlbWE7Ci0JcHJpdmF0ZSBTdHJpbmcgY2F0YWxvZzsKLQlwcml2YXRlIFN0cmluZyBwa0NvbHVtbk5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lOwotCXByaXZhdGUgU3RyaW5nIHBrQ29sdW1uVmFsdWU7Ci0JcHJpdmF0ZSBmaW5hbCBWZWN0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzOwotCi0KLQlwdWJsaWMgQmluYXJ5VGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoKTsKLQkJdGhpcy5zY2hlbWEgPSB0aGlzLmJ1aWxkU2NoZW1hKCk7Ci0JCXRoaXMuY2F0YWxvZyA9IHRoaXMuYnVpbGRDYXRhbG9nKCk7Ci0JCXRoaXMucGtDb2x1bW5OYW1lID0gdGhpcy5idWlsZFBrQ29sdW1uTmFtZSgpOwotCQl0aGlzLnZhbHVlQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlID0gdGhpcy5idWlsZFBrQ29sdW1uVmFsdWUoKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50cyA9IHRoaXMuYnVpbGRVbmlxdWVDb25zdHJhaW50cygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzdXBlci51cGRhdGUoKTsKLQkJdGhpcy5zZXRUYWJsZV8odGhpcy5idWlsZFRhYmxlKCkpOwotCQl0aGlzLnNldFNjaGVtYV8odGhpcy5idWlsZFNjaGVtYSgpKTsKLQkJdGhpcy5zZXRDYXRhbG9nXyh0aGlzLmJ1aWxkQ2F0YWxvZygpKTsKLQkJdGhpcy5zZXRQa0NvbHVtbk5hbWVfKHRoaXMuYnVpbGRQa0NvbHVtbk5hbWUoKSk7Ci0JCXRoaXMuc2V0VmFsdWVDb2x1bW5OYW1lXyh0aGlzLmJ1aWxkVmFsdWVDb2x1bW5OYW1lKCkpOwotCQl0aGlzLnNldFBrQ29sdW1uVmFsdWVfKHRoaXMuYnVpbGRQa0NvbHVtblZhbHVlKCkpOwotCQl0aGlzLnVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0R2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlRBQkxFX0dFTkVSQVRPUl9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0SW5pdGlhbFZhbHVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRBbGxvY2F0aW9uU2l6ZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLlRBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUYWJsZUdlbmVyYXRvckFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdGFibGUKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy50YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRhYmxlXyhTdHJpbmcgdGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFibGU7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX1BST1BFUlRZLCBvbGQsIHRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFRhYmxlKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuVEFCTEVfR0VORVJBVE9SX19UQUJMRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogc2NoZW1hCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0U2NoZW1hXyhTdHJpbmcgc2NoZW1hKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnNjaGVtYTsKLQkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChTQ0hFTUFfUFJPUEVSVFksIG9sZCwgc2NoZW1hKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFNjaGVtYSgpIHsKLQkJcmV0dXJuIChTdHJpbmcpIHRoaXMuZ2V0SmR0TWVtYmVyVmFsdWUoSlBBLlRBQkxFX0dFTkVSQVRPUl9fU0NIRU1BKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzY2hlbWFUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIGNhdGFsb2cKLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZykgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2F0YWxvZ18oU3RyaW5nIGNhdGFsb2cpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuY2F0YWxvZzsKLQkJdGhpcy5jYXRhbG9nID0gY2F0YWxvZzsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBVEFMT0dfUFJPUEVSVFksIG9sZCwgY2F0YWxvZyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDYXRhbG9nKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JLy8gKioqKiogcGsgY29sdW1uIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMucGtDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBrQ29sdW1uTmFtZShTdHJpbmcgcGtDb2x1bW5OYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQa0NvbHVtbk5hbWVfKFN0cmluZyBwa0NvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGtDb2x1bW5OYW1lOwotCQl0aGlzLnBrQ29sdW1uTmFtZSA9IHBrQ29sdW1uTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX0NPTFVNTl9OQU1FX1BST1BFUlRZLCBvbGQsIHBrQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRQa0NvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFBrQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwa0NvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHZhbHVlIGNvbHVtbiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWVDb2x1bW5OYW1lXyhTdHJpbmcgdmFsdWVDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlQ29sdW1uTmFtZTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWUgPSB2YWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCB2YWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWVDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gKFN0cmluZykgdGhpcy5nZXRKZHRNZW1iZXJWYWx1ZShKUEEuVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZUNvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdmFsdWVDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBwayBjb2x1bW4gdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnBrQ29sdW1uVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5WYWx1ZShTdHJpbmcgcGtDb2x1bW5WYWx1ZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UGtDb2x1bW5WYWx1ZV8oU3RyaW5nIHBrQ29sdW1uVmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5wa0NvbHVtblZhbHVlID0gcGtDb2x1bW5WYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFBLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSwgb2xkLCBwa0NvbHVtblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFBrQ29sdW1uVmFsdWUoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSB0aGlzLmdldEpkdE1lbWJlclZhbHVlKEpQQS5UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRQa0NvbHVtblZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBrQ29sdW1uVmFsdWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCS8vICoqKioqIHVuaXF1ZSBjb25zdHJhaW50cwotCXB1YmxpYyBMaXN0SXRlcmFibGU8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4odGhpcy51bmlxdWVDb25zdHJhaW50cyk7Ci0JfQotCi0JcHVibGljIGludCBnZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50cy5nZXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFZlY3RvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gYnVpbGRVbmlxdWVDb25zdHJhaW50cygpIHsKLQkJT2JqZWN0W10gamR0VW5pcXVlQ29uc3RyYWludHMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCQlWZWN0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHJlc3VsdCA9IG5ldyBWZWN0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+KGpkdFVuaXF1ZUNvbnN0cmFpbnRzLmxlbmd0aCk7Ci0JCWZvciAoT2JqZWN0IGpkdFVuaXF1ZUNvbnN0cmFpbnQgOiBqZHRVbmlxdWVDb25zdHJhaW50cykgewotCQkJcmVzdWx0LmFkZChuZXcgQmluYXJ5VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24odGhpcywgKElBbm5vdGF0aW9uKSBqZHRVbmlxdWVDb25zdHJhaW50KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBUT0RPCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MGIyYWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9iaW5hcnkvQmluYXJ5VGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UZW1wb3JhbAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VGVtcG9yYWxBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCaW5hcnlCYXNlVGVtcG9yYWxBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBUZW1wb3JhbEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlUZW1wb3JhbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuVEVNUE9SQUxfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRyYW5zaWVudEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVRyYW5zaWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZiMDZjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UcmFuc2llbnQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEJpbmFyeVRyYW5zaWVudEFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFRyYW5zaWVudEFubm90YXRpb24KLXsKLQotCXB1YmxpYyBCaW5hcnlUcmFuc2llbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBJQW5ub3RhdGlvbiBqZHRBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgamR0QW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTUzNmU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5iaW5hcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuYmluYXJ5LkJpbmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpdmVDbG9uZUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuVW5pcXVlQ29uc3RyYWludAotICovCi1maW5hbCBjbGFzcyBCaW5hcnlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbgotCWV4dGVuZHMgQmluYXJ5QW5ub3RhdGlvbgotCWltcGxlbWVudHMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IGNvbHVtbk5hbWVzOwotCi0KLQlCaW5hcnlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgSUFubm90YXRpb24gamR0QW5ub3RhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIGpkdEFubm90YXRpb24pOwotCQl0aGlzLmNvbHVtbk5hbWVzID0gdGhpcy5idWlsZENvbHVtbk5hbWVzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUNvbHVtbk5hbWVzKCk7Ci0JfQotCi0JLy8gVE9ETwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb2x1bW5OYW1lcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGNvbHVtbiBuYW1lcwotCXB1YmxpYyBMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBMaXZlQ2xvbmVMaXN0SXRlcmFibGU8U3RyaW5nPih0aGlzLmNvbHVtbk5hbWVzKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbHVtbk5hbWVzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uTmFtZXMuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZUF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCXByaXZhdGUgVmVjdG9yPFN0cmluZz4gYnVpbGRDb2x1bW5OYW1lcygpIHsKLQkJT2JqZWN0W10gamR0Q29sdW1uTmFtZXMgPSB0aGlzLmdldEpkdE1lbWJlclZhbHVlcyhKUEEuVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyk7Ci0JCVZlY3RvcjxTdHJpbmc+IHJlc3VsdCA9IG5ldyBWZWN0b3I8U3RyaW5nPihqZHRDb2x1bW5OYW1lcy5sZW5ndGgpOwotCQlmb3IgKE9iamVjdCBqZHRDb2x1bW5OYW1lIDogamR0Q29sdW1uTmFtZXMpIHsKLQkJCXJlc3VsdC5hZGQoKFN0cmluZykgamR0Q29sdW1uTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb2x1bW5OYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlQ29sdW1uTmFtZShpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb2x1bW5OYW1lc1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb2x1bW5OYW1lKGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVZlcnNpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL2JpbmFyeS9CaW5hcnlWZXJzaW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjVjZWE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvYmluYXJ5L0JpbmFyeVZlcnNpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLmJpbmFyeS5CaW5hcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuVmVyc2lvbgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQmluYXJ5VmVyc2lvbkFubm90YXRpb24KLQlleHRlbmRzIEJpbmFyeUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFZlcnNpb25Bbm5vdGF0aW9uCi17Ci0KLQlwdWJsaWMgQmluYXJ5VmVyc2lvbkFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIElBbm5vdGF0aW9uIGpkdEFubm90YXRpb24pIHsKLQkJc3VwZXIocGFyZW50LCBqZHRBbm5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3Mjg1YWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlPC9jb2RlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZU92ZXJyaWRlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCi0JcHJpdmF0ZSBmaW5hbCBKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIgam9pbkNvbHVtbnNDb250YWluZXIgPSBuZXcgSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyKCk7Ci0KLQkKLQotCXByb3RlY3RlZCBTb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLmluaXRpYWxpemUodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLnN5bmNocm9uaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBTb3VyY2VPdmVycmlkZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVfX05BTUU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqKioqKioqKioqKiogam9pbiBjb2x1bW5zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldEpvaW5Db2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmJ1aWxkTmVzdGVkU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24oCi0JCQkJdGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmJ1aWxkSm9pbkNvbHVtbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEpvaW5Db2x1bW5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQl0aGlzLmRhYSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuSk9JTl9DT0xVTU4pOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIGFzc29jaWF0aW9uIG92ZXJyaWRlJ3Mgam9pbiBjb2x1bW5zCi0JICovCi0JY2xhc3MgSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQlleHRlbmRzIEFubm90YXRpb25Db250YWluZXI8Sm9pbkNvbHVtbkFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uc1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBKT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBKUEEuSk9JTl9DT0xVTU47Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gU291cmNlQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24udGhpcy5idWlsZEpvaW5Db2x1bW4oaW5kZXgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLmlzRW1wdHkoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gCi0JCQluZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQlERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlpbmRleCwKLQkJCQlBTk5PVEFUSU9OX05BTUUpOwotCQlyZXR1cm4gaWRhYTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkwYzg0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuTnVsbEF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZU92ZXJyaWRlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQotCXByaXZhdGUgRWxlbWVudEFubm90YXRpb25BZGFwdGVyIGNvbHVtbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbjsKLQlwcml2YXRlIGZpbmFsIENvbHVtbkFubm90YXRpb24gbnVsbENvbHVtbjsKLQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGJ1aWxkU291cmNlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCQotCQlyZXR1cm4gbmV3IFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYnVpbGRTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIAotCQkJaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JCXJldHVybiBuZXcgU291cmNlQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJYW5ub3RhdGVkRWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBidWlsZE5lc3RlZFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIGlkYWEpOwotCX0KLQkKLQlwcml2YXRlIFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQkKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGRhYSwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBkYWEpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTb3VyY2VBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGlkYWEsIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGlkYWEpKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5jb2x1bW5BZGFwdGVyID0gdGhpcy5idWlsZENvbHVtbkFkYXB0ZXIoKTsKLQkJdGhpcy5udWxsQ29sdW1uID0gdGhpcy5idWlsZE51bGxDb2x1bW4oKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJaWYgKHRoaXMuY29sdW1uQWRhcHRlci5nZXRBbm5vdGF0aW9uKGFzdFJvb3QpICE9IG51bGwpIHsKLQkJCXRoaXMuY29sdW1uID0gU291cmNlQ29sdW1uQW5ub3RhdGlvbi5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhKTsKLQkJCXRoaXMuY29sdW1uLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNDb2x1bW4oYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZU92ZXJyaWRlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUU7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqKiBBdHRyaWJ1dGVPdmVycmlkZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqCi0KLQkvLyAqKioqKiBjb2x1bW4KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbjsKLQl9Ci0KLQlwdWJsaWMgQ29sdW1uQW5ub3RhdGlvbiBnZXROb25OdWxsQ29sdW1uKCkgewotCQlyZXR1cm4gKHRoaXMuY29sdW1uICE9IG51bGwpID8gdGhpcy5jb2x1bW4gOiB0aGlzLm51bGxDb2x1bW47Ci0JfQotCi0JcHVibGljIENvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCkgewotCQlpZiAodGhpcy5jb2x1bW4gIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2NvbHVtbicgZWxlbWVudCBhbHJlYWR5IGV4aXN0czogIiArIHRoaXMuY29sdW1uKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuY29sdW1uID0gU291cmNlQ29sdW1uQW5ub3RhdGlvbi5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbih0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhKTsKLQkJdGhpcy5jb2x1bW4ubmV3QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gdGhpcy5jb2x1bW47Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQ29sdW1uKCkgewotCQlpZiAodGhpcy5jb2x1bW4gPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiJ2NvbHVtbicgZWxlbWVudCBkb2VzIG5vdCBleGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJQ29sdW1uQW5ub3RhdGlvbiBvbGQgPSB0aGlzLmNvbHVtbjsKLQkJdGhpcy5jb2x1bW4gPSBudWxsOwotCQlvbGQucmVtb3ZlQW5ub3RhdGlvbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29sdW1uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCWlmICh0aGlzLmNvbHVtbkFkYXB0ZXIuZ2V0QW5ub3RhdGlvbihhc3RSb290KSA9PSBudWxsKSB7Ci0JCQl0aGlzLnN5bmNDb2x1bW5fKG51bGwpOwotCQl9IGVsc2UgewotCQkJaWYgKHRoaXMuY29sdW1uID09IG51bGwpIHsKLQkJCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbCA9IFNvdXJjZUNvbHVtbkFubm90YXRpb24uY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4odGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmRhYSk7Ci0JCQkJY29sLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCQkJdGhpcy5zeW5jQ29sdW1uXyhjb2wpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmNvbHVtbi5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0NvbHVtbl8oQ29sdW1uQW5ub3RhdGlvbiBhc3RDb2x1bW4pIHsKLQkJQ29sdW1uQW5ub3RhdGlvbiBvbGQgPSB0aGlzLmNvbHVtbjsKLQkJdGhpcy5jb2x1bW4gPSBhc3RDb2x1bW47Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDT0xVTU5fUFJPUEVSVFksIG9sZCwgYXN0Q29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlciBidWlsZENvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgU291cmNlQ29sdW1uQW5ub3RhdGlvbi5idWlsZEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIodGhpcy5kYWEpKTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkFubm90YXRpb24gYnVpbGROdWxsQ29sdW1uKCkgewotCQlyZXR1cm4gbmV3IE51bGxBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbkFubm90YXRpb24odGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmNvbHVtbiA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IAotCQkJbmV3IENvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCUNPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJaW5kZXgsCi0JCQkJQU5OT1RBVElPTl9OQU1FKTsKLQkJcmV0dXJuIGlkYWE7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2M2EzMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzZUNvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogPHVsPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUNvbHVtbjwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlKb2luQ29sdW1uPC9jb2RlPgotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlQWRhcHRlcjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlOwotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVuaXF1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVuaXF1ZUFkYXB0ZXI7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gdW5pcXVlOwotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gbnVsbGFibGVBZGFwdGVyOwotCXByb3RlY3RlZCBCb29sZWFuIG51bGxhYmxlOwotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGluc2VydGFibGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBpbnNlcnRhYmxlQWRhcHRlcjsKLQlwcm90ZWN0ZWQgQm9vbGVhbiBpbnNlcnRhYmxlOwotCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVwZGF0YWJsZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IHVwZGF0YWJsZUFkYXB0ZXI7Ci0JcHJvdGVjdGVkIEJvb2xlYW4gdXBkYXRhYmxlOwotCi0KLQlwcm90ZWN0ZWQgU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGRhYSwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBkYWEpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMudGFibGVBZGFwdGVyID0gdGhpcy5idWlsZFRhYmxlQWRhcHRlcigpOwotCQl0aGlzLnVuaXF1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRVbmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy51bmlxdWVBZGFwdGVyID0gdGhpcy5idWlsZFVuaXF1ZUFkYXB0ZXIoKTsKLQkJdGhpcy5udWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROdWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLm51bGxhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGROdWxsYWJsZUFkYXB0ZXIoKTsKLQkJdGhpcy5pbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZEluc2VydGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5pbnNlcnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRJbnNlcnRhYmxlQWRhcHRlcigpOwotCQl0aGlzLnVwZGF0YWJsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRVcGRhdGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy51cGRhdGFibGVBZGFwdGVyID0gdGhpcy5idWlsZFVwZGF0YWJsZUFkYXB0ZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLnRhYmxlID0gdGhpcy5idWlsZFRhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnVuaXF1ZSA9IHRoaXMuYnVpbGRVbmlxdWUoYXN0Um9vdCk7Ci0JCXRoaXMubnVsbGFibGUgPSB0aGlzLmJ1aWxkTnVsbGFibGUoYXN0Um9vdCk7Ci0JCXRoaXMuaW5zZXJ0YWJsZSA9IHRoaXMuYnVpbGRJbnNlcnRhYmxlKGFzdFJvb3QpOwotCQl0aGlzLnVwZGF0YWJsZSA9IHRoaXMuYnVpbGRVcGRhdGFibGUoYXN0Um9vdCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY1RhYmxlKHRoaXMuYnVpbGRUYWJsZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1VuaXF1ZSh0aGlzLmJ1aWxkVW5pcXVlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jTnVsbGFibGUodGhpcy5idWlsZE51bGxhYmxlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jSW5zZXJ0YWJsZSh0aGlzLmJ1aWxkSW5zZXJ0YWJsZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1VwZGF0YWJsZSh0aGlzLmJ1aWxkVXBkYXRhYmxlKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKiBCYXNlQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqCi0KLQkvLyAqKioqKiB0YWJsZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy50YWJsZSwgdGFibGUpKSB7Ci0JCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCQl0aGlzLnRhYmxlQWRhcHRlci5zZXRWYWx1ZSh0YWJsZSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNUYWJsZShTdHJpbmcgYXN0VGFibGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudGFibGU7Ci0JCXRoaXMudGFibGUgPSBhc3RUYWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX1BST1BFUlRZLCBvbGQsIGFzdFRhYmxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRUYWJsZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy50YWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gdGFibGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMudGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy5nZXRUYWJsZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy50YWJsZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRUYWJsZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiB1bmlxdWUKLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudW5pcXVlLCB1bmlxdWUpKSB7Ci0JCQl0aGlzLnVuaXF1ZSA9IHVuaXF1ZTsKLQkJCXRoaXMudW5pcXVlQWRhcHRlci5zZXRWYWx1ZSh1bmlxdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNVbmlxdWUoQm9vbGVhbiBhc3RVbmlxdWUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnVuaXF1ZTsKLQkJdGhpcy51bmlxdWUgPSBhc3RVbmlxdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVTklRVUVfUFJPUEVSVFksIG9sZCwgYXN0VW5pcXVlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRVbmlxdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudW5pcXVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRVbmlxdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnVuaXF1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRVbmlxdWVEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0VW5pcXVlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRVbmlxdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLnVuaXF1ZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogbnVsbGFibGUKLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubnVsbGFibGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5udWxsYWJsZSwgbnVsbGFibGUpKSB7Ci0JCQl0aGlzLm51bGxhYmxlID0gbnVsbGFibGU7Ci0JCQl0aGlzLm51bGxhYmxlQWRhcHRlci5zZXRWYWx1ZShudWxsYWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY051bGxhYmxlKEJvb2xlYW4gYXN0TnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm51bGxhYmxlOwotCQl0aGlzLm51bGxhYmxlID0gYXN0TnVsbGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOVUxMQUJMRV9QUk9QRVJUWSwgb2xkLCBhc3ROdWxsYWJsZSk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkTnVsbGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubnVsbGFibGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE51bGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5udWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGROdWxsYWJsZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5nZXROdWxsYWJsZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkTnVsbGFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLm51bGxhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKTsKLQotCS8vICoqKioqIGluc2VydGFibGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5pbnNlcnRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBpbnNlcnRhYmxlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmluc2VydGFibGUsIGluc2VydGFibGUpKSB7Ci0JCQl0aGlzLmluc2VydGFibGUgPSBpbnNlcnRhYmxlOwotCQkJdGhpcy5pbnNlcnRhYmxlQWRhcHRlci5zZXRWYWx1ZShpbnNlcnRhYmxlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jSW5zZXJ0YWJsZShCb29sZWFuIGFzdEluc2VydGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLmluc2VydGFibGU7Ci0JCXRoaXMuaW5zZXJ0YWJsZSA9IGFzdEluc2VydGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChJTlNFUlRBQkxFX1BST1BFUlRZLCBvbGQsIGFzdEluc2VydGFibGUpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZEluc2VydGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuaW5zZXJ0YWJsZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuaW5zZXJ0YWJsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmdldEluc2VydGFibGVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZEluc2VydGFibGVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEJvb2xlYW5FbGVtZW50QWRhcHRlcih0aGlzLmluc2VydGFibGVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0SW5zZXJ0YWJsZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiB1cGRhdGFibGUKLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0YWJsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiB1cGRhdGFibGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudXBkYXRhYmxlLCB1cGRhdGFibGUpKSB7Ci0JCQl0aGlzLnVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJCXRoaXMudXBkYXRhYmxlQWRhcHRlci5zZXRWYWx1ZSh1cGRhdGFibGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNVcGRhdGFibGUoQm9vbGVhbiBhc3RVcGRhdGFibGUpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLnVwZGF0YWJsZTsKLQkJdGhpcy51cGRhdGFibGUgPSBhc3RVcGRhdGFibGU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChVUERBVEFCTEVfUFJPUEVSVFksIG9sZCwgYXN0VXBkYXRhYmxlKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gYnVpbGRVcGRhdGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudXBkYXRhYmxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMudXBkYXRhYmxlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFVwZGF0YWJsZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRCb29sZWFuRWxlbWVudEFkYXB0ZXIodGhpcy5nZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZFVwZGF0YWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQm9vbGVhbkVsZW1lbnRBZGFwdGVyKHRoaXMudXBkYXRhYmxlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFVwZGF0YWJsZUVsZW1lbnROYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudGFibGUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy51bmlxdWUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5udWxsYWJsZSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLmluc2VydGFibGUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy51cGRhdGFibGUgPT0gbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhMWM4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZTsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uCi17Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGlzY3JpbWluYXRvclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkaXNjcmltaW5hdG9yVHlwZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZTsKLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gbGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGxlbmd0aEFkYXB0ZXI7Ci0JcHJpdmF0ZSBJbnRlZ2VyIGxlbmd0aDsKLQotCi0KLQlwcm90ZWN0ZWQgU291cmNlQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZERpc2NyaW1pbmF0b3JUeXBlRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclR5cGVBZGFwdGVyID0gdGhpcy5idWlsZERpc2NyaW1pbmF0b3JUeXBlQWRhcHRlcigpOwotCQl0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRMZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5sZW5ndGhBZGFwdGVyID0gdGhpcy5idWlsZExlbmd0aEFkYXB0ZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU291cmNlQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgZGFhKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFNvdXJjZUJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBpZGFhLCBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBpZGFhKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmRpc2NyaW1pbmF0b3JUeXBlID0gdGhpcy5idWlsZERpc2NyaW1pbmF0b3JUeXBlKGFzdFJvb3QpOwotCQl0aGlzLmxlbmd0aCA9IHRoaXMuYnVpbGRMZW5ndGgoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5zeW5jTGVuZ3RoKHRoaXMuYnVpbGRMZW5ndGgoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNEaXNjcmltaW5hdG9yVHlwZSh0aGlzLmJ1aWxkRGlzY3JpbWluYXRvclR5cGUoYXN0Um9vdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEaXNjcmltaW5hdG9yQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIGRpc2NyaW1pbmF0b3IgdHlwZQotCXB1YmxpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXREaXNjcmltaW5hdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZGlzY3JpbWluYXRvclR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZGlzY3JpbWluYXRvclR5cGUsIGRpc2NyaW1pbmF0b3JUeXBlKSkgewotCQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOwotCQkJdGhpcy5kaXNjcmltaW5hdG9yVHlwZUFkYXB0ZXIuc2V0VmFsdWUoRGlzY3JpbWluYXRvclR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGRpc2NyaW1pbmF0b3JUeXBlKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0Rpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlIGFzdERpc2NyaW1pbmF0b3JUeXBlKSB7Ci0JCURpc2NyaW1pbmF0b3JUeXBlIG9sZCA9IHRoaXMuZGlzY3JpbWluYXRvclR5cGU7Ci0JCXRoaXMuZGlzY3JpbWluYXRvclR5cGUgPSBhc3REaXNjcmltaW5hdG9yVHlwZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKERJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBhc3REaXNjcmltaW5hdG9yVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBEaXNjcmltaW5hdG9yVHlwZSBidWlsZERpc2NyaW1pbmF0b3JUeXBlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBEaXNjcmltaW5hdG9yVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRGlzY3JpbWluYXRvclR5cGVEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuZGFhLCB0aGlzLmdldERpc2NyaW1pbmF0b3JUeXBlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZERpc2NyaW1pbmF0b3JUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmRpc2NyaW1pbmF0b3JUeXBlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JUeXBlRWxlbWVudE5hbWUoKTsKLQotCS8vICoqKioqIGxlbmd0aAotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIGxlbmd0aCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5sZW5ndGgsIGxlbmd0aCkpIHsKLQkJCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQkJdGhpcy5sZW5ndGhBZGFwdGVyLnNldFZhbHVlKGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0xlbmd0aChJbnRlZ2VyIGFzdExlbmd0aCkgewotCQlJbnRlZ2VyIG9sZCA9IHRoaXMubGVuZ3RoOwotCQl0aGlzLmxlbmd0aCA9IGFzdExlbmd0aDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKExFTkdUSF9QUk9QRVJUWSwgb2xkLCBhc3RMZW5ndGgpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZExlbmd0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGhBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRMZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkSW50ZWdlckVsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0TGVuZ3RoRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRMZW5ndGhBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLmRpc2NyaW1pbmF0b3JUeXBlID09IG51bGwpICYmCi0JCQkJKHRoaXMubGVuZ3RoID09IG51bGwpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZUVudW1lcmF0ZWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlRW51bWVyYXRlZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmNDNlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlRW51bWVyYXRlZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVudW1lcmF0ZWQKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUVudW1lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZUJhc2VFbnVtZXJhdGVkQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRW51bWVyYXRlZEFubm90YXRpb24KLXsKLQlwcml2YXRlIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBFbnVtVHlwZSB2YWx1ZTsKLQkKLQotCXByb3RlY3RlZCBTb3VyY2VCYXNlRW51bWVyYXRlZEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEpOwotCQl0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIGdldFZhbHVlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCB0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEVudW1lcmF0ZWRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIEVudW1UeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoRW51bVR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKHZhbHVlKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShFbnVtVHlwZSBhc3RWYWx1ZSkgewotCQlFbnVtVHlwZSBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCQotCXByaXZhdGUgRW51bVR5cGUgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gRW51bVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRWYWx1ZUVsZW1lbnROYW1lKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiODdmOTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNlSm9pbkNvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogPHVsPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Sm9pbkNvbHVtbjwvY29kZT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VCYXNlSm9pbkNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBCYXNlSm9pbkNvbHVtbkFubm90YXRpb24KLXsKLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiByZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0KLQotCXByb3RlY3RlZCBTb3VyY2VCYXNlSm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNvdXJjZUJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQl0aGlzKHBhcmVudCwgZWxlbWVudCwgZGFhLCBuZXcgRWxlbWVudEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGRhYSkpOwotCX0KLQotCXByb3RlY3RlZCBTb3VyY2VCYXNlSm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQl0aGlzKHBhcmVudCwgZWxlbWVudCwgaWRhYSwgbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgaWRhYSkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHRoaXMuYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNSZWZlcmVuY2VkQ29sdW1uTmFtZSh0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoYXN0Um9vdCkpOwotCX0KLQotCi0JLy8qKioqKioqKioqKiogQmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKgotCi0JLy8gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpKSB7Ci0JCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lQWRhcHRlci5zZXRWYWx1ZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyBhc3RSZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGFzdFJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3RSZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVFbGVtZW50TmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID09IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VUYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VUYWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2ZjU1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzZVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci0KLS8qKgotICogPHVsPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLlRhYmxlPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5TZWNvbmRhcnlUYWJsZTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2xsZWN0aW9uVGFibGU8L2NvZGU+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgQmFzZVRhYmxlQW5ub3RhdGlvbgotewotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlTdHJpbmcgbmFtZTsKLQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyOwotCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXI7Ci0JU3RyaW5nIHNjaGVtYTsKLQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gY2F0YWxvZ0RlY2xhcmF0aW9uQWRhcHRlcjsKLQlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcjsKLQlTdHJpbmcgY2F0YWxvZzsKLQotCQotCWZpbmFsIFVuaXF1ZUNvbnN0cmFpbnRzQW5ub3RhdGlvbkNvbnRhaW5lciB1bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lciA9IG5ldyBVbmlxdWVDb25zdHJhaW50c0Fubm90YXRpb25Db250YWluZXIoKTsKLQotCi0JcHJvdGVjdGVkIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGRhYSwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBkYWEpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcigpOwotCQl0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTY2hlbWFEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyID0gdGhpcy5idWlsZFNjaGVtYUFkYXB0ZXIoKTsKLQkJdGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZENhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5jYXRhbG9nQWRhcHRlciA9IHRoaXMuYnVpbGRDYXRhbG9nQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYShhc3RSb290KTsKLQkJdGhpcy5jYXRhbG9nID0gdGhpcy5idWlsZENhdGFsb2coYXN0Um9vdCk7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXIuaW5pdGlhbGl6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jU2NoZW1hKHRoaXMuYnVpbGRTY2hlbWEoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNDYXRhbG9nKHRoaXMuYnVpbGRDYXRhbG9nKGFzdFJvb3QpKTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5zeW5jaHJvbml6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdW5pcXVlQ29uc3RyYWludHMgZWxlbWVudCBuYW1lCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50c0VsZW1lbnROYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogQmFzZVRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkIGEgZGVjbGFyYXRpb24gZWxlbWVudCBhZGFwdGVyIGZvciB0aGUgdGFibGUncyAnbmFtZScgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKiBzY2hlbWEKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNjaGVtYSwgc2NoZW1hKSkgewotCQkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JCQl0aGlzLnNjaGVtYUFkYXB0ZXIuc2V0VmFsdWUoc2NoZW1hKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jU2NoZW1hKFN0cmluZyBhc3RTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2NoZW1hOwotCQl0aGlzLnNjaGVtYSA9IGFzdFNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNDSEVNQV9QUk9QRVJUWSwgb2xkLCBhc3RTY2hlbWEpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2NoZW1hKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyh0aGlzLnNjaGVtYURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGRlY2xhcmF0aW9uIGVsZW1lbnQgYWRhcHRlciBmb3IgdGhlIHRhYmxlJ3MgJ3NjaGVtYScgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNjaGVtYURlY2xhcmF0aW9uQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNjaGVtYUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuc2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKiBjYXRhbG9nCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuY2F0YWxvZywgY2F0YWxvZykpIHsKLQkJCXRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0JCQl0aGlzLmNhdGFsb2dBZGFwdGVyLnNldFZhbHVlKGNhdGFsb2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDYXRhbG9nKFN0cmluZyBhc3RDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZyA9IGFzdENhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRBTE9HX1BST1BFUlRZLCBvbGQsIGFzdENhdGFsb2cpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ2F0YWxvZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmNhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMuY2F0YWxvZ0RlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIGRlY2xhcmF0aW9uIGVsZW1lbnQgYWRhcHRlciBmb3IgdGhlIHRhYmxlJ3MgJ2NhdGFsb2cnIGVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZENhdGFsb2dEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRDYXRhbG9nQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5jYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQkvLyAqKioqKiB1bmlxdWUgY29uc3RyYWludHMKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBidWlsZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgU291cmNlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24oCi0JCQkJdGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBidWlsZFVuaXF1ZUNvbnN0cmFpbnRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOwotCX0KLQkKLQlwcml2YXRlIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkVW5pcXVlQ29uc3RyYWludEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCXRoaXMuZGFhLCB0aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzRWxlbWVudE5hbWUoKSwgaW5kZXgsIEpQQS5VTklRVUVfQ09OU1RSQUlOVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5tb3ZlTmVzdGVkQW5ub3RhdGlvbih0YXJnZXRJbmRleCwgc291cmNlSW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KSB7Ci0JCXRoaXMudW5pcXVlQ29uc3RyYWludHNDb250YWluZXIucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCi0JLyoqCi0JICogYWRhcHQgdGhlIEFubm90YXRpb25Db250YWluZXIgaW50ZXJmYWNlIHRvIHRoZSB0YWJsZSdzIHVuaXF1ZSBjb25zdHJhaW50cwotCSAqLwotCWNsYXNzIFVuaXF1ZUNvbnN0cmFpbnRzQW5ub3RhdGlvbkNvbnRhaW5lciAKLQkJZXh0ZW5kcyBBbm5vdGF0aW9uQ29udGFpbmVyPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbnNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbi50aGlzLmdldFVuaXF1ZUNvbnN0cmFpbnRzRWxlbWVudE5hbWUoKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXROZXN0ZWRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBidWlsZE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbi50aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMubmFtZSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnNjaGVtYSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLmNhdGFsb2cgPT0gbnVsbCkgJiYKLQkJCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyLmlzRW1wdHkoKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPih0aGlzLmFubm90YXRlZEVsZW1lbnQsIGRhZWEpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzZVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmEwY2RlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUJhc2VUZW1wb3JhbEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGU7Ci0KLS8qKgotICogQWJzdHJhY3QgaW1wbGVtZW50YXRpb24gZm9yIEpQQSBhbm5vdGF0aW9ucwotICogamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWwKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleVRlbXBvcmFsCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VCYXNlVGVtcG9yYWxBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBUZW1wb3JhbEFubm90YXRpb24KLXsKLQlwcm90ZWN0ZWQgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFRlbXBvcmFsVHlwZSB2YWx1ZTsKLQotCi0JcHJvdGVjdGVkIFNvdXJjZUJhc2VUZW1wb3JhbEFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEpOwotCQl0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyID0gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihkYWEsIGdldFZhbHVlRWxlbWVudE5hbWUoKSk7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCB0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1ZhbHVlKHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnZhbHVlID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudmFsdWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBUZW1wb3JhbEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShUZW1wb3JhbFR5cGUgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUoVGVtcG9yYWxUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZSh2YWx1ZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShUZW1wb3JhbFR5cGUgYXN0VmFsdWUpIHsKLQkJVGVtcG9yYWxUeXBlIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFRlbXBvcmFsVHlwZSBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBUZW1wb3JhbFR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZhbHVlRWxlbWVudE5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQmFzaWNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNpY0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkNWEyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VCYXNpY0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQmFzaWNBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBCYXNpY0Fubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBPUFRJT05BTF9BREFQVEVSID0gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBvcHRpb25hbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcjsKLQlwcml2YXRlIEZldGNoVHlwZSBmZXRjaDsKLQotCi0JcHVibGljIFNvdXJjZUJhc2ljQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihlbGVtZW50LCBPUFRJT05BTF9BREFQVEVSKTsKLQkJdGhpcy5mZXRjaEFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIEZFVENIX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpOwotCQl0aGlzLmZldGNoID0gdGhpcy5idWlsZEZldGNoKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNPcHRpb25hbCh0aGlzLmJ1aWxkT3B0aW9uYWwoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNGZXRjaCh0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5vcHRpb25hbCA9PSBudWxsKSAmJgotCQkJCSh0aGlzLmZldGNoID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuZmV0Y2gpOwotCX0KLQotCi0JLy8qKioqKioqKioqKioqKiogQmFzaWMgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKgotCi0JLy8gKioqKiogb3B0aW9uYWwKLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBvcHRpb25hbCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5vcHRpb25hbCwgb3B0aW9uYWwpKSB7Ci0JCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCQl0aGlzLm9wdGlvbmFsQWRhcHRlci5zZXRWYWx1ZShvcHRpb25hbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY09wdGlvbmFsKEJvb2xlYW4gYXN0T3B0aW9uYWwpIHsKLQkJQm9vbGVhbiBvbGQgPSB0aGlzLm9wdGlvbmFsOwotCQl0aGlzLm9wdGlvbmFsID0gYXN0T3B0aW9uYWw7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChPUFRJT05BTF9QUk9QRVJUWSwgb2xkLCBhc3RPcHRpb25hbCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3B0aW9uYWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uYWxBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3B0aW9uYWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShPUFRJT05BTF9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBmZXRjaAotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5mZXRjaCwgZmV0Y2gpKSB7Ci0JCQl0aGlzLmZldGNoID0gZmV0Y2g7Ci0JCQl0aGlzLmZldGNoQWRhcHRlci5zZXRWYWx1ZShGZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGZldGNoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0ZldGNoKEZldGNoVHlwZSBhc3RGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IGFzdEZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgYXN0RmV0Y2gpOwotCX0KLQotCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmZldGNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKEZFVENIX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuQkFTSUNfX09QVElPTkFMLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRmV0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5CQVNJQ19fRkVUQ0gpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2EyZTIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JLy8gdGhpcyBhZGFwdGVyIGlzIG9ubHkgdXNlZCBieSBhIENvbHVtbiBhbm5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIG1hcHBpbmcgYW5ub3RhdGlvbiAoZS5nLiBCYXNpYykKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgTUFQUElOR19ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0KLQlwdWJsaWMgU291cmNlQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUYWJsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX1VOSVFVRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE51bGxhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuQ09MVU1OX19OVUxMQUJMRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluc2VydGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX1VQREFUQUJMRTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTb3VyY2VDb21wbGV0ZUNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX0xFTkdUSDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVjaXNpb25FbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5DT0xVTU5fX1BSRUNJU0lPTjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTY2FsZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkNPTFVNTl9fU0NBTEU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXN0YXRpYyBDb2x1bW5Bbm5vdGF0aW9uIGNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcikgewotCQlyZXR1cm4gbmV3IFNvdXJjZUNvbHVtbkFubm90YXRpb24ocGFyZW50LCBlbGVtZW50LCBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIoYXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcikpOwotCX0KLQotCXN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkFkYXB0ZXIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTiwgSlBBLkNPTFVNTik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VDb21wbGV0ZUNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ5ZGViMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VDb21wbGV0ZUNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIDx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Q29sdW1uPC9jb2RlPgotICogPC91bD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZUNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQmFzZUNvbHVtbkFubm90YXRpb24KLQlpbXBsZW1lbnRzIENvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBsZW5ndGhEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBsZW5ndGhBZGFwdGVyOwotCXByb3RlY3RlZCBJbnRlZ2VyIGxlbmd0aDsKLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBwcmVjaXNpb25EZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBwcmVjaXNpb25BZGFwdGVyOwotCXByb3RlY3RlZCBJbnRlZ2VyIHByZWNpc2lvbjsKLQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBzY2FsZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IHNjYWxlQWRhcHRlcjsKLQlwcm90ZWN0ZWQgSW50ZWdlciBzY2FsZTsKLQotCi0JcHJvdGVjdGVkIFNvdXJjZUNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSk7Ci0JCXRoaXMubGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZExlbmd0aERlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLmxlbmd0aEFkYXB0ZXIgPSB0aGlzLmJ1aWxkTGVuZ3RoQWRhcHRlcigpOwotCQl0aGlzLnByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRQcmVjaXNpb25EZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5wcmVjaXNpb25BZGFwdGVyID0gdGhpcy5idWlsZFByZWNpc2lvbkFkYXB0ZXIoKTsKLQkJdGhpcy5zY2FsZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRTY2FsZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLnNjYWxlQWRhcHRlciA9IHRoaXMuYnVpbGRTY2FsZUFkYXB0ZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMubGVuZ3RoID0gdGhpcy5idWlsZExlbmd0aChhc3RSb290KTsKLQkJdGhpcy5wcmVjaXNpb24gPSB0aGlzLmJ1aWxkUHJlY2lzaW9uKGFzdFJvb3QpOwotCQl0aGlzLnNjYWxlID0gdGhpcy5idWlsZFNjYWxlKGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY0xlbmd0aCh0aGlzLmJ1aWxkTGVuZ3RoKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jUHJlY2lzaW9uKHRoaXMuYnVpbGRQcmVjaXNpb24oYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNTY2FsZSh0aGlzLmJ1aWxkU2NhbGUoYXN0Um9vdCkpOwotCX0KLQotCi0JIC8vICoqKioqKioqKiogQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBsZW5ndGgKLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBsZW5ndGgpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubGVuZ3RoLCBsZW5ndGgpKSB7Ci0JCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJCXRoaXMubGVuZ3RoQWRhcHRlci5zZXRWYWx1ZShsZW5ndGgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNMZW5ndGgoSW50ZWdlciBhc3RMZW5ndGgpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmxlbmd0aDsKLQkJdGhpcy5sZW5ndGggPSBhc3RMZW5ndGg7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChMRU5HVEhfUFJPUEVSVFksIG9sZCwgYXN0TGVuZ3RoKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRMZW5ndGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldExlbmd0aFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkTGVuZ3RoRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLmdldExlbmd0aEVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRMZW5ndGhBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLmxlbmd0aERlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRMZW5ndGhFbGVtZW50TmFtZSgpOwotCi0JLy8gKioqKiogcHJlY2lzaW9uCi0JcHVibGljIEludGVnZXIgZ2V0UHJlY2lzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5wcmVjaXNpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlY2lzaW9uKEludGVnZXIgcHJlY2lzaW9uKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnByZWNpc2lvbiwgcHJlY2lzaW9uKSkgewotCQkJdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb247Ci0JCQl0aGlzLnByZWNpc2lvbkFkYXB0ZXIuc2V0VmFsdWUocHJlY2lzaW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUHJlY2lzaW9uKEludGVnZXIgYXN0UHJlY2lzaW9uKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5wcmVjaXNpb247Ci0JCXRoaXMucHJlY2lzaW9uID0gYXN0UHJlY2lzaW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUFJFQ0lTSU9OX1BST1BFUlRZLCBvbGQsIGFzdFByZWNpc2lvbik7Ci0JfQotCi0JcHJpdmF0ZSBJbnRlZ2VyIGJ1aWxkUHJlY2lzaW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnByZWNpc2lvbkFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRQcmVjaXNpb25UZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFByZWNpc2lvbkRlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIodGhpcy5nZXRQcmVjaXNpb25FbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGJ1aWxkUHJlY2lzaW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIodGhpcy5wcmVjaXNpb25EZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlY2lzaW9uRWxlbWVudE5hbWUoKTsKLQotCS8vICoqKioqIHNjYWxlCi0JcHVibGljIEludGVnZXIgZ2V0U2NhbGUoKSB7Ci0JCXJldHVybiB0aGlzLnNjYWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc2NhbGUsIHNjYWxlKSkgewotCQkJdGhpcy5zY2FsZSA9IHNjYWxlOwotCQkJdGhpcy5zY2FsZUFkYXB0ZXIuc2V0VmFsdWUoc2NhbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNTY2FsZShJbnRlZ2VyIGFzdFNjYWxlKSB7Ci0JCUludGVnZXIgb2xkID0gdGhpcy5zY2FsZTsKLQkJdGhpcy5zY2FsZSA9IGFzdFNjYWxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0NBTEVfUFJPUEVSVFksIG9sZCwgYXN0U2NhbGUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZFNjYWxlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNjYWxlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNjYWxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5zY2FsZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNjYWxlRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZEludGVnZXJFbGVtZW50QWRhcHRlcih0aGlzLmdldFNjYWxlRWxlbWVudE5hbWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZFNjYWxlQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRJbnRlZ2VyRWxlbWVudEFkYXB0ZXIodGhpcy5zY2FsZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRTY2FsZUVsZW1lbnROYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMubGVuZ3RoID09IG51bGwpICYmCi0JCQkJKHRoaXMucHJlY2lzaW9uID09IG51bGwpICYmCi0JCQkJKHRoaXMuc2NhbGUgPT0gbnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExMDc3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCS8vICoqKioqKioqKiogU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbkVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc2NyaW1pbmF0b3JUeXBlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldExlbmd0aEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmExMzc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFZBTFVFX0FEQVBURVIgPSBidWlsZFZhbHVlQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlwdWJsaWMgU291cmNlRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy52YWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB2YWx1ZQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgdmFsdWUpKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy52YWx1ZTsKLQkJdGhpcy52YWx1ZSA9IGFzdFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0VmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUVfX1ZBTFVFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbWJlZGRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFjZDcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRhYmxlCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFbWJlZGRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRW1iZWRkYWJsZUFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVtYmVkZGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byB1cGRhdGUKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbWJlZGRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTgxZTdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFbWJlZGRlZEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIEVtYmVkZGVkQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVtYmVkZGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gdXBkYXRlCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW1iZWRkZWRJZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxM2RlMWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW1iZWRkZWRJZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkSWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBFbWJlZGRlZElkQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCi0JcHVibGljIFNvdXJjZUVtYmVkZGVkSWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byB1cGRhdGUKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnRpdHlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnRpdHlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDMwY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW50aXR5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlRW50aXR5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgRW50aXR5QW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBidWlsZE5hbWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCVRleHRSYW5nZSBuYW1lVGV4dFJhbmdlOwotCi0KLQlwdWJsaWMgU291cmNlRW50aXR5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBOQU1FX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5uYW1lVGV4dFJhbmdlID0gdGhpcy5idWlsZE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLm5hbWVUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkTmFtZVRleHRSYW5nZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMubmFtZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBFbnRpdHlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyoqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLkVOVElUWV9fTkFNRSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlRW51bWVyYXRlZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlMzg5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VFbnVtZXJhdGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbnVtZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VFbnVtZXJhdGVkQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQmFzZUVudW1lcmF0ZWRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwkKLQotCXB1YmxpYyBTb3VyY2VFbnVtZXJhdGVkQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuRU5VTUVSQVRFRF9fVkFMVUU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3N2Y1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWUKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBTVFJBVEVHWV9BREFQVEVSID0gYnVpbGRTdHJhdGVneUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHN0cmF0ZWd5QWRhcHRlcjsKLQlwcml2YXRlIEdlbmVyYXRpb25UeXBlIHN0cmF0ZWd5OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBHRU5FUkFUT1JfQURBUFRFUiA9IGJ1aWxkR2VuZXJhdG9yQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2VuZXJhdG9yQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBnZW5lcmF0b3I7Ci0JCi0JCQotCXB1YmxpYyBTb3VyY2VHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuc3RyYXRlZ3lBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBTVFJBVEVHWV9BREFQVEVSKTsKLQkJdGhpcy5nZW5lcmF0b3JBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBHRU5FUkFUT1JfQURBUFRFUik7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN0cmF0ZWd5ID0gdGhpcy5idWlsZFN0cmF0ZWd5KGFzdFJvb3QpOwotCQl0aGlzLmdlbmVyYXRvciA9IHRoaXMuYnVpbGRHZW5lcmF0b3IoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNTdHJhdGVneSh0aGlzLmJ1aWxkU3RyYXRlZ3koYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNHZW5lcmF0b3IodGhpcy5idWlsZEdlbmVyYXRvcihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnN0cmF0ZWd5ID09IG51bGwpICYmCi0JCQkJKHRoaXMuZ2VuZXJhdG9yID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuc3RyYXRlZ3kpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogc3RyYXRlZ3kKLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKSB7Ci0JCXJldHVybiB0aGlzLnN0cmF0ZWd5OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5zdHJhdGVneSwgc3RyYXRlZ3kpKSB7Ci0JCQl0aGlzLnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCQl0aGlzLnN0cmF0ZWd5QWRhcHRlci5zZXRWYWx1ZShHZW5lcmF0aW9uVHlwZS50b0phdmFBbm5vdGF0aW9uVmFsdWUoc3RyYXRlZ3kpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgc3luY1N0cmF0ZWd5KEdlbmVyYXRpb25UeXBlIGFzdFN0cmF0ZWd5KSB7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZCA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBhc3RTdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGQsIGFzdFN0cmF0ZWd5KTsKLQl9Ci0JCi0JcHJpdmF0ZSBHZW5lcmF0aW9uVHlwZSBidWlsZFN0cmF0ZWd5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBHZW5lcmF0aW9uVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLnN0cmF0ZWd5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTVFJBVEVHWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0JCi0JLy8gKioqKiogZ2VuZXJhdG9yCi0JcHVibGljIFN0cmluZyBnZXRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuZ2VuZXJhdG9yLCBnZW5lcmF0b3IpKSB7Ci0JCQl0aGlzLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLQkJCXRoaXMuZ2VuZXJhdG9yQWRhcHRlci5zZXRWYWx1ZShnZW5lcmF0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNHZW5lcmF0b3IoU3RyaW5nIGFzdEdlbmVyYXRvcikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5nZW5lcmF0b3I7Ci0JCXRoaXMuZ2VuZXJhdG9yID0gYXN0R2VuZXJhdG9yOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoR0VORVJBVE9SX1BST1BFUlRZLCBvbGQsIGFzdEdlbmVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRHZW5lcmF0b3IoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRHZW5lcmF0b3JUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShHRU5FUkFUT1JfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2VuZXJhdG9yVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhHRU5FUkFUT1JfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFN0cmF0ZWd5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEdlbmVyYXRvckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNmY2YmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0b3JBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvcgotICovCi1hYnN0cmFjdCBjbGFzcyBTb3VyY2VHZW5lcmF0b3JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBHZW5lcmF0b3JBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCVN0cmluZyBuYW1lOwotCVRleHRSYW5nZSBuYW1lVGV4dFJhbmdlOwotCi0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gaW5pdGlhbFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBpbml0aWFsVmFsdWVBZGFwdGVyOwotCUludGVnZXIgaW5pdGlhbFZhbHVlOwotCi0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYWxsb2NhdGlvblNpemVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGFsbG9jYXRpb25TaXplQWRhcHRlcjsKLQlJbnRlZ2VyIGFsbG9jYXRpb25TaXplOwotCi0KLQlTb3VyY2VHZW5lcmF0b3JBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5nZXROYW1lQWRhcHRlcigpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5pbml0aWFsVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmdldEluaXRpYWxWYWx1ZUFkYXB0ZXIoKTsKLQkJdGhpcy5pbml0aWFsVmFsdWVBZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJBZGFwdGVyKHRoaXMuaW5pdGlhbFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQkJdGhpcy5hbGxvY2F0aW9uU2l6ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuZ2V0QWxsb2NhdGlvblNpemVBZGFwdGVyKCk7Ci0JCXRoaXMuYWxsb2NhdGlvblNpemVBZGFwdGVyID0gdGhpcy5idWlsZEludGVnZXJBZGFwdGVyKHRoaXMuYWxsb2NhdGlvblNpemVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGRhZWEpIHsKLQkJcmV0dXJuIG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5uYW1lVGV4dFJhbmdlID0gdGhpcy5idWlsZE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXRoaXMuaW5pdGlhbFZhbHVlID0gdGhpcy5idWlsZEluaXRpYWxWYWx1ZShhc3RSb290KTsKLQkJdGhpcy5hbGxvY2F0aW9uU2l6ZSA9IHRoaXMuYnVpbGRBbGxvY2F0aW9uU2l6ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jTmFtZSh0aGlzLmJ1aWxkTmFtZShhc3RSb290KSk7Ci0JCXRoaXMubmFtZVRleHRSYW5nZSA9IHRoaXMuYnVpbGROYW1lVGV4dFJhbmdlKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNJbml0aWFsVmFsdWUodGhpcy5idWlsZEluaXRpYWxWYWx1ZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0FsbG9jYXRpb25TaXplKHRoaXMuYnVpbGRBbGxvY2F0aW9uU2l6ZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLm5hbWUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5pbml0aWFsVmFsdWUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5hbGxvY2F0aW9uU2l6ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBHZW5lcmF0b3JBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXROYW1lQWRhcHRlcigpOwotCi0JLy8gKioqKiogaW5pdGlhbCB2YWx1ZQotCXB1YmxpYyBJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIGluaXRpYWxWYWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5pbml0aWFsVmFsdWUsIGluaXRpYWxWYWx1ZSkpIHsKLQkJCXRoaXMuaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOwotCQkJdGhpcy5pbml0aWFsVmFsdWVBZGFwdGVyLnNldFZhbHVlKGluaXRpYWxWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0luaXRpYWxWYWx1ZShJbnRlZ2VyIGFzdElpbml0aWFsVmFsdWUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmluaXRpYWxWYWx1ZTsKLQkJdGhpcy5pbml0aWFsVmFsdWUgPSBhc3RJaW5pdGlhbFZhbHVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoSU5JVElBTF9WQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RJaW5pdGlhbFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIEludGVnZXIgYnVpbGRJbml0aWFsVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuaW5pdGlhbFZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEluaXRpYWxWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuaW5pdGlhbFZhbHVlRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBnZXRJbml0aWFsVmFsdWVBZGFwdGVyKCk7Ci0KLQkvLyAqKioqKiBhbGxvY2F0aW9uIHNpemUKLQlwdWJsaWMgSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuYWxsb2NhdGlvblNpemU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciBhbGxvY2F0aW9uU2l6ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5hbGxvY2F0aW9uU2l6ZSwgYWxsb2NhdGlvblNpemUpKSB7Ci0JCQl0aGlzLmFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvblNpemU7Ci0JCQl0aGlzLmFsbG9jYXRpb25TaXplQWRhcHRlci5zZXRWYWx1ZShhbGxvY2F0aW9uU2l6ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0FsbG9jYXRpb25TaXplKEludGVnZXIgYXN0QWxsb2NhdGlvblNpemUpIHsKLQkJSW50ZWdlciBvbGQgPSB0aGlzLmFsbG9jYXRpb25TaXplOwotCQl0aGlzLmFsbG9jYXRpb25TaXplID0gYXN0QWxsb2NhdGlvblNpemU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChBTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFksIG9sZCwgYXN0QWxsb2NhdGlvblNpemUpOwotCX0KLQotCXByaXZhdGUgSW50ZWdlciBidWlsZEFsbG9jYXRpb25TaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmFsbG9jYXRpb25TaXplQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEFsbG9jYXRpb25TaXplVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy5hbGxvY2F0aW9uU2l6ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZ2V0QWxsb2NhdGlvblNpemVBZGFwdGVyKCk7Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0Jc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBOdW1iZXJJbnRlZ2VyRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VJZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUlkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTEyMjNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUlkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLklkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VJZEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIElkQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0KLQlwdWJsaWMgU291cmNlSWRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byB1cGRhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUlkQ2xhc3NBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VJZENsYXNzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYThjMmViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUlkQ2xhc3NBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuSWRDbGFzcwotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlSWRDbGFzc0Fubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIElkQ2xhc3NBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9BREFQVEVSID0gYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCS8qKgotCSAqIFdlIGNhY2hlIHRoaXMgaGVyZSBiZWNhdXNlIHdlIHVzZSB0aGUgQVNUIGJpbmRpbmdzIHRvIGNhbGN1bGF0ZSBpdC48dWw+Ci0JICogPGxpPldlIGRvIG5vdCByZXR1cm4gYSBjYWxjdWxhdGVkIHZhbHVlIGJlY2F1c2UgaXQgd291bGQgZm9yY2UgYSBKRFQKLQkgKiBwYXJzZSB3aXRoIDxlbT5ldmVyeTwvZW0+IGNvbnRleHQgbW9kZWwgPGVtPnVwZGF0ZTwvZW0+LiAoVGhpcyBwcm9wZXJ0eQotCSAqIGlzIG9uZSB0aGF0IGlzIHJlYWQgZHVyaW5nIHRoZSBjb250ZXh0IG1vZGVsIDxlbT51cGRhdGU8L2VtPiwgYXMgb3Bwb3NlZAotCSAqIHRvIHRoZSBjb250ZXh0IG1vZGVsIDxlbT5zeW5jPC9lbT4uKQotCSAqIDxsaT5XZSBkbyBub3QgY2FsY3VsYXRlIGl0IGR1cmluZyB7QGxpbmsgI3N5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQpfQotCSAqIGJlY2F1c2U8dWw+Ci0JICogPGxpPndoZW4gdGhlIGNsYXNzIG5hbWUgKHtAbGluayAjdmFsdWV9KSBpcyBjaGFuZ2VkIHZpYSBBUEkgZnJvbSB0aGUgVUksCi0JICogd2UgYXJlIGlnbm9yaW5nIEphdmEgY2hhbmdlIGV2ZW50czsgc28gd2Ugd291bGQgbmVlZCB0byBjYWxjdWxhdGUgaXQKLQkgKiBkdXJpbmcge0BsaW5rICNzZXRWYWx1ZShTdHJpbmcpfSB3aGljaCBtaWdodCBzbG93IGRvd24gb3VyIFVJIGEgYml0ICh3aXRoCi0JICogdGhlIGFkZGl0aW9uYWwgcGFyc2UpLCBhbmQgc2V0dGluZyB0aGUgZmxhZyBpcyBlZmZlY3RpdmVseSBlcXVpdmFsZW50Ci0JICogPGxpPndoZW4gdGhlIGNsYXNzIG5hbWUgKHtAbGluayAjdmFsdWV9KSBpcyBjaGFuZ2VkIHZpYSBBUEkgZnJvbSBhIHRlc3QsCi0JICogd2UgYXJlIGhhbmRsaW5nIEphdmEgY2hhbmdlIGV2ZW50cyBzeW5jaHJvbm91c2x5OwotCSAqIHNvIHdlIHdvdWxkIGRldGVjdCBhIGNoYW5nZSBpbiB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgZHVyaW5nCi0JICoge0BsaW5rICNzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0KX0sIHRyaWdnZXJpbmcgYW4KLQkgKiB1bndhbnRlZCBjb250ZXh0IG1vZGVsIDxlbT5zeW5jPC9lbT4gKEFueSByZXNvdXJjZSBtb2RlbCBjaGFuZ2VzIHZpYQotCSAqIEFQSSBzaG91bGQgPGVtPm5vdDwvZW0+IHRyaWdnZXIgYSBjb250ZXh0IG1vZGVsIDxlbT5zeW5jPC9lbT4uKQotCSAqIDwvdWw+Ci0JICogPC91bD4KLQkgKiBBbHNvLCB0aGVyZSBpcyBubyBjaGFuZ2Ugbm90aWZpY2F0aW9uIHRpZWQgdG8gdGhpcyBwcm9wZXJ0eSBzaW5jZSBpdAotCSAqIHdvdWxkIGJlIGZpcmVkIGF0IHRoZSBzYW1lIHRpbWVzIGFzIHRoZSBjaGFuZ2UgZXZlbnRzIGZvciB7QGxpbmsgI3ZhbHVlfS4KLQkgKi8KLQkvLyBUT0RPIGFueSBvZiBhIG51bWJlciBvZiB0aGluZ3MgY2FuIGludmFsaWRhdGUgdGhpczogY2xhc3NwYXRoIGNoYW5nZSwKLQkvLyBhZGRlZCBvciByZW1vdmVkIG1hdGNoaW5nIGNsYXNzCi0JcHJpdmF0ZSBTdHJpbmcgZnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7Ci0JLy8gd2UgbmVlZCBhIGZsYWcgc2luY2UgdGhlIGYtcSBuYW1lIGNhbiBiZSBudWxsCi0JcHJpdmF0ZSBib29sZWFuIGZxQ2xhc3NOYW1lU3RhbGUgPSB0cnVlOwotCi0KLQlwdWJsaWMgU291cmNlSWRDbGFzc0Fubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMudmFsdWVBZGFwdGVyID0gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihlbGVtZW50LCBWQUxVRV9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy52YWx1ZSA9IHRoaXMuYnVpbGRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5zeW5jVmFsdWUodGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy52YWx1ZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIElkQ2xhc3NBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMuZnFDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLnZhbHVlQWRhcHRlci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlKFN0cmluZyBhc3RWYWx1ZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZSwgYXN0VmFsdWUpKSB7Ci0JCQl0aGlzLnN5bmNWYWx1ZV8oYXN0VmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZV8oU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZnFDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRWYWx1ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJaWYgKHRoaXMuZnFDbGFzc05hbWVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZENsYXNzTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotCQkJdGhpcy5mcUNsYXNzTmFtZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnZhbHVlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZENsYXNzTmFtZV8oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lXygpIHsKLQkJcmV0dXJuIEFTVFRvb2xzLnJlc29sdmVGdWxseVF1YWxpZmllZE5hbWUodGhpcy52YWx1ZUFkYXB0ZXIuZ2V0RXhwcmVzc2lvbih0aGlzLmJ1aWxkQVNUUm9vdCgpKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5JRF9DTEFTU19fVkFMVUUsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VJbmhlcml0YW5jZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk4ZmM1Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VJbmhlcml0YW5jZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVudW1EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Jbmhlcml0YW5jZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlSW5oZXJpdGFuY2VBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBJbmhlcml0YW5jZUFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNUUkFURUdZX0FEQVBURVIgPSBidWlsZFN0cmF0ZWd5QWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc3RyYXRlZ3lBZGFwdGVyOwotCXByaXZhdGUgSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5OwotCi0KLQlwdWJsaWMgU291cmNlSW5oZXJpdGFuY2VBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnN0cmF0ZWd5QWRhcHRlciA9IG5ldyBBbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4oZWxlbWVudCwgU1RSQVRFR1lfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3RyYXRlZ3kgPSB0aGlzLmJ1aWxkU3RyYXRlZ3koYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY1N0cmF0ZWd5KHRoaXMuYnVpbGRTdHJhdGVneShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnN0cmF0ZWd5ID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuc3RyYXRlZ3kpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBJbmhlcml0YW5jZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogc3RyYXRlZ3kKLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCkgewotCQlyZXR1cm4gdGhpcy5zdHJhdGVneTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuc3RyYXRlZ3ksIHN0cmF0ZWd5KSkgewotCQkJdGhpcy5zdHJhdGVneSA9IHN0cmF0ZWd5OwotCQkJdGhpcy5zdHJhdGVneUFkYXB0ZXIuc2V0VmFsdWUoSW5oZXJpdGFuY2VUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZShzdHJhdGVneSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNTdHJhdGVneShJbmhlcml0YW5jZVR5cGUgYXN0U3RyYXRlZ3kpIHsKLQkJSW5oZXJpdGFuY2VUeXBlIG9sZCA9IHRoaXMuc3RyYXRlZ3k7Ci0JCXRoaXMuc3RyYXRlZ3kgPSBhc3RTdHJhdGVneTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNUUkFURUdZX1BST1BFUlRZLCBvbGQsIGFzdFN0cmF0ZWd5KTsKLQl9Ci0KLQlwcml2YXRlIEluaGVyaXRhbmNlVHlwZSBidWlsZFN0cmF0ZWd5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUodGhpcy5zdHJhdGVneUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U3RyYXRlZ3lUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTVFJBVEVHWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFN0cmF0ZWd5QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBFbnVtRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuSU5IRVJJVEFOQ0VfX1NUUkFURUdZKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2JlNWU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBKb2luQ29sdW1uQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIENPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKUEEuSk9JTl9DT0xVTU5TKTsKLQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGRTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCAKLQkJCWludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGRKb2luQ29sdW1uRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCk7Ci0JCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBpYWEgPSBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWFubm90YXRlZEVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkTmVzdGVkU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbihwYXJlbnQsIGVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGRhYSwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBkYWEpKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGlkYWEsIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGlkYWEpKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VDb2x1bW5Bbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVU5JUVVFOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TnVsbGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fTlVMTEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbnNlcnRhYmxlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuSk9JTl9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVcGRhdGFibGVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTl9fVVBEQVRBQkxFOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VCYXNlSm9pbkNvbHVtbkFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZEpvaW5Db2x1bW5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gCi0JCQluZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQlERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlpbmRleCwKLQkJCQlBTk5PVEFUSU9OX05BTUUpOwotCQlyZXR1cm4gaWRhYTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDEyMTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuSm9pblRhYmxlPC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlSm9pblRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgSm9pblRhYmxlQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXByaXZhdGUgZmluYWwgSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyIGpvaW5Db2x1bW5zQ29udGFpbmVyID0gbmV3IEpvaW5Db2x1bW5zQW5ub3RhdGlvbkNvbnRhaW5lcigpOwotCi0JcHJpdmF0ZSBmaW5hbCBJbnZlcnNlSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyIGludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lciA9IG5ldyBJbnZlcnNlSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyKCk7Ci0KLQotCXB1YmxpYyBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLmluaXRpYWxpemUodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIuaW5pdGlhbGl6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb250YWluZXIuc3luY2hyb25pemUodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIuc3luY2hyb25pemUodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlQmFzZVRhYmxlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyh0aGlzLmRhYSwgSlBBLkpPSU5fVEFCTEVfX05BTUUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkU2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpQQS5KT0lOX1RBQkxFX19TQ0hFTUEpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ2F0YWxvZ0RlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKHRoaXMuZGFhLCBKUEEuSk9JTl9UQUJMRV9fQ0FUQUxPRyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRVbmlxdWVDb25zdHJhaW50c0VsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLkpPSU5fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEpvaW5UYWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKioqKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYWJsZTxKb2luQ29sdW1uQW5ub3RhdGlvbj4gZ2V0Sm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRKb2luQ29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLm5lc3RlZEFubm90YXRpb25BdChpbmRleCk7Ci0JfQotCi0JcHVibGljIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQlwcml2YXRlIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIFNvdXJjZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLmJ1aWxkTmVzdGVkU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24oCi0JCQkJdGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmJ1aWxkSm9pbkNvbHVtbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCQotCXByaXZhdGUgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoCi0JCQkJdGhpcy5kYWEsIEpQQS5KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuSk9JTl9DT0xVTU4pOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLmpvaW5Db2x1bW5zQ29udGFpbmVyLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQkKLQkvKioKLQkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIGNvbGxlY3Rpb24gdGFibGUncyBqb2luIGNvbHVtbnMKLQkgKi8KLQljbGFzcyBKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIgCi0JCWV4dGVuZHMgQW5ub3RhdGlvbkNvbnRhaW5lcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25zUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEpPSU5fQ09MVU1OU19MSVNUOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQkJcmV0dXJuIEpQQS5KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlM7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLkpPSU5fQ09MVU1OOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIFNvdXJjZUpvaW5UYWJsZUFubm90YXRpb24udGhpcy5idWlsZEpvaW5Db2x1bW4oaW5kZXgpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBKb2luQ29sdW1uQW5ub3RhdGlvbiBpbnZlcnNlSm9pbkNvbHVtbkF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIubmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSm9pbkNvbHVtbkFubm90YXRpb24gYWRkSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlSm9pbkNvbHVtbkFubm90YXRpb24uYnVpbGROZXN0ZWRTb3VyY2VKb2luQ29sdW1uQW5ub3RhdGlvbigKLQkJCQl0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbmRleCkpOwotCX0KLQkKLQlwcml2YXRlIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQl0aGlzLmRhYSwgSlBBLkpPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TLCBpbmRleCwgSlBBLkpPSU5fQ09MVU1OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnZlcnNlSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJdGhpcy5pbnZlcnNlSm9pbkNvbHVtbnNDb250YWluZXIucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgY29sbGVjdGlvbiB0YWJsZSdzIGpvaW4gY29sdW1ucwotCSAqLwotCWNsYXNzIEludmVyc2VKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIgCi0JCWV4dGVuZHMgQW5ub3RhdGlvbkNvbnRhaW5lcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25zUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIElOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLkpPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpQQS5KT0lOX0NPTFVNTjsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkTmVzdGVkQW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBTb3VyY2VKb2luVGFibGVBbm5vdGF0aW9uLnRoaXMuYnVpbGRJbnZlcnNlSm9pbkNvbHVtbihpbmRleCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJdGhpcy5qb2luQ29sdW1uc0NvbnRhaW5lci5pc0VtcHR5KCkgJiYKLQkJCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbnRhaW5lci5pc0VtcHR5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTG9iQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTG9iQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ4MmMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZUxvYkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuTG9iCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VMb2JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBMb2JBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0KLQlwdWJsaWMgU291cmNlTG9iQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gdXBkYXRlCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFueVRvTWFueUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZWE4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFueVRvTWFueTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZU1hbnlUb01hbnlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFueVRvTWFueTJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBUkdFVF9FTlRJVFlfQURBUFRFUiA9IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBDQVNDQURFX0FEQVBURVIgPSBidWlsZENhc2NhZGVBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE1BUFBFRF9CWV9BREFQVEVSID0gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG1hcHBlZEJ5QWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQotCi0JcHVibGljIFNvdXJjZU1hbnlUb01hbnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLm1hcHBlZEJ5QWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoTUFQUEVEX0JZX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLm1hcHBlZEJ5ID0gdGhpcy5idWlsZE1hcHBlZEJ5KGFzdFJvb3QpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5zeW5jaHJvbml6ZVdpdGgoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY01hcHBlZEJ5KHRoaXMuYnVpbGRNYXBwZWRCeShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLm1hcHBlZEJ5ID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBUQVJHRVRfRU5USVRZX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRGZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBGRVRDSF9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBnZXRDYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENBU0NBREVfQURBUFRFUjsKLQl9Ci0KLQotCS8vKioqKioqKioqKioqKioqKiBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQotCS8vICoqKioqIG1hcHBlZCBieQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5tYXBwZWRCeSwgbWFwcGVkQnkpKSB7Ci0JCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShtYXBwZWRCeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01hcHBlZEJ5KFN0cmluZyBhc3RNYXBwZWRCeSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IGFzdE1hcHBlZEJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGQsIGFzdE1hcHBlZEJ5KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE1hcHBlZEJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoTUFQUEVEX0JZX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcHBlZEJ5VG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhNQVBQRURfQllfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19NQU5ZX19UQVJHRVRfRU5USVRZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19NQU5ZX19NQVBQRURfQlkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZEZldGNoQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX01BTllfX0ZFVENIKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fTUFOWV9fQ0FTQ0FERSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYW55VG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYW55VG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNWUwZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFueVRvT25lQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlTWFueVRvT25lQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLQlpbXBsZW1lbnRzIE1hbnlUb09uZTJfMEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBUkdFVF9FTlRJVFlfQURBUFRFUiA9IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBDQVNDQURFX0FEQVBURVIgPSBidWlsZENhc2NhZGVBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBPUFRJT05BTF9BREFQVEVSID0gYnVpbGRPcHRpb25hbEFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBvcHRpb25hbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIG9wdGlvbmFsOwotCi0KLQlwdWJsaWMgU291cmNlTWFueVRvT25lQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihPUFRJT05BTF9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShhc3RSb290KTsKLQkJdGhpcy5vcHRpb25hbCA9IHRoaXMuYnVpbGRPcHRpb25hbChhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNPcHRpb25hbCh0aGlzLmJ1aWxkT3B0aW9uYWwoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5vcHRpb25hbCA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU291cmNlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gVEFSR0VUX0VOVElUWV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0RmV0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gRkVUQ0hfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZ2V0Q2FzY2FkZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDQVNDQURFX0FEQVBURVI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE1hbnlUb09uZU1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG9wdGlvbmFsCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG9wdGlvbmFsKSkgewotCQkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOwotCQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIuc2V0VmFsdWUob3B0aW9uYWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNPcHRpb25hbChCb29sZWFuIGFzdE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IGFzdE9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgYXN0T3B0aW9uYWwpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE9wdGlvbmFsKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoT1BUSU9OQUxfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fT05FX19UQVJHRVRfRU5USVRZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkRmV0Y2hBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRGZXRjaEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuTUFOWV9UT19PTkVfX0ZFVENIKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkT3B0aW9uYWxBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk1BTllfVE9fT05FX19PUFRJT05BTCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZEVudW1BcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQU5ZX1RPX09ORV9fQ0FTQ0FERSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+KGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQm9vbGVhbkV4cHJlc3Npb25Db252ZXJ0ZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBLZXlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MzJjYWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTWFwS2V5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlTWFwS2V5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFwS2V5QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGROYW1lQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCi0JcHVibGljIFNvdXJjZU1hcEtleUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIE5BTUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMubmFtZSA9IHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMubmFtZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLm5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBNYXBLZXlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE5BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoTkFNRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5NQVBfS0VZX19OQU1FKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzE2YTEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBwZWRTdXBlcmNsYXNzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gdXBkYXRlCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRiZDU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZENvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+Ci0gKiA8dWw+Ci0gKiA8bGk+amF2YXgucGVyc2lzdGVuY2UuQ29sdW1uCi0gKiA8bGk+amF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbgotICogPGxpPmphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW4KLSAqIDxsaT5qYXZheC5wZXJzaXN0ZW5jZS5QcmltYXJ5S2V5Sm9pbkNvbHVtbgotICogPGxpPmphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUNvbHVtbgotICogPGxpPmphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUpvaW5Db2x1bW4KLSAqIDxsaT5qYXZheC5wZXJzaXN0ZW5jZS5PcmRlckNvbHVtbgotICogPC91bD4KLSAqIDwvY29kZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGNvbHVtbkRlZmluaXRpb25EZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjb2x1bW5EZWZpbml0aW9uQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBjb2x1bW5EZWZpbml0aW9uOwotCi0KLQlwcm90ZWN0ZWQgU291cmNlTmFtZWRDb2x1bW5Bbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBkYWEsIG5ldyBFbGVtZW50QW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgZGFhKSk7Ci0JfQotCQotCXByb3RlY3RlZCBTb3VyY2VOYW1lZENvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoKTsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZENvbHVtbkRlZmluaXRpb25EZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRDb2x1bW5EZWZpbml0aW9uQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IHRoaXMuYnVpbGRDb2x1bW5EZWZpbml0aW9uKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jQ29sdW1uRGVmaW5pdGlvbih0aGlzLmJ1aWxkQ29sdW1uRGVmaW5pdGlvbihhc3RSb290KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIE5hbWVkQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIGFzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBjb2x1bW4gZGVmaW5pdGlvbgotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uRGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY29sdW1uRGVmaW5pdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyBjb2x1bW5EZWZpbml0aW9uKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLmNvbHVtbkRlZmluaXRpb24sIGNvbHVtbkRlZmluaXRpb24pKSB7Ci0JCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSBjb2x1bW5EZWZpbml0aW9uOwotCQkJdGhpcy5jb2x1bW5EZWZpbml0aW9uQWRhcHRlci5zZXRWYWx1ZShjb2x1bW5EZWZpbml0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ29sdW1uRGVmaW5pdGlvbihTdHJpbmcgYXN0Q29sdW1uRGVmaW5pdGlvbikgewotCQlTdHJpbmcgb2xkID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uOwotCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gPSBhc3RDb2x1bW5EZWZpbml0aW9uOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZCwgYXN0Q29sdW1uRGVmaW5pdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRDb2x1bW5EZWZpbml0aW9uKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbkRlZmluaXRpb25BZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q29sdW1uRGVmaW5pdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuY29sdW1uRGVmaW5pdGlvbkRlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkRlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLmdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy5jb2x1bW5EZWZpbml0aW9uRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLm5hbWUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5jb2x1bW5EZWZpbml0aW9uID09IG51bGwpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMDZmNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFTVFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnk8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlUXVlcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIENPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVzdWx0Q2xhc3NBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHJlc3VsdENsYXNzOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb24jZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZTsKLQkvLyB3ZSBuZWVkIGEgZmxhZyBzaW5jZSB0aGUgZi1xIG5hbWUgY2FuIGJlIG51bGwKLQlwcml2YXRlIGJvb2xlYW4gZnFSZXN1bHRDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVzdWx0U2V0TWFwcGluZ0RlY2xhcmF0aW9uQWRhcHRlcjsKLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlc3VsdFNldE1hcHBpbmdBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmc7Ci0KLQlwdWJsaWMgc3RhdGljIFNvdXJjZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGJ1aWxkU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSBidWlsZE5hbWVkTmF0aXZlUXVlcnlEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IGJ1aWxkTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFNvdXJjZU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKAotCQkJcGFyZW50LAotCQkJZWxlbWVudCwKLQkJCWlkYWEsCi0JCQlpYWEpOwotCX0KLQotCXByaXZhdGUgU291cmNlTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwKLQkJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwKLQkJCUluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLnJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZFJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyID0gdGhpcy5idWlsZFJlc3VsdENsYXNzQWRhcHRlcigpOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmdEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkUmVzdWx0U2V0TWFwcGluZ0FkYXB0ZXIoZGFhKTsKLQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlciA9IHRoaXMuYnVpbGRSZXN1bHRTZXRNYXBwaW5nQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLnJlc3VsdENsYXNzID0gdGhpcy5idWlsZFJlc3VsdENsYXNzKGFzdFJvb3QpOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSB0aGlzLmJ1aWxkUmVzdWx0U2V0TWFwcGluZyhhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNSZXN1bHRDbGFzcyh0aGlzLmJ1aWxkUmVzdWx0Q2xhc3MoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNSZXN1bHRTZXRNYXBwaW5nKHRoaXMuYnVpbGRSZXN1bHRTZXRNYXBwaW5nKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RCYXNlTmFtZWRRdWVyeUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGdldFF1ZXJ5RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0SGludHNFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTOwotCX0KLQotCUBPdmVycmlkZQotCVF1ZXJ5SGludEFubm90YXRpb24gYnVpbGRIaW50KGludCBpbmRleCkgewotCQlyZXR1cm4gU291cmNlUXVlcnlIaW50QW5ub3RhdGlvbi5idWlsZE5hbWVkTmF0aXZlUXVlcnlRdWVyeUhpbnQodGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmRhYSwgaW5kZXgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiByZXN1bHQgY2xhc3MKLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdENsYXNzKCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRDbGFzcyhTdHJpbmcgcmVzdWx0Q2xhc3MpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucmVzdWx0Q2xhc3MsIHJlc3VsdENsYXNzKSkgewotCQkJdGhpcy5yZXN1bHRDbGFzcyA9IHJlc3VsdENsYXNzOwotCQkJdGhpcy5mcVJlc3VsdENsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJCXRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyLnNldFZhbHVlKHJlc3VsdENsYXNzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUmVzdWx0Q2xhc3MoU3RyaW5nIGFzdFJlc3VsdENsYXNzKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnJlc3VsdENsYXNzLCBhc3RSZXN1bHRDbGFzcykpIHsKLQkJCXRoaXMuc3luY1Jlc3VsdENsYXNzXyhhc3RSZXN1bHRDbGFzcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1Jlc3VsdENsYXNzXyhTdHJpbmcgYXN0UmVzdWx0Q2xhc3MpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucmVzdWx0Q2xhc3M7Ci0JCXRoaXMucmVzdWx0Q2xhc3MgPSBhc3RSZXN1bHRDbGFzczsKLQkJdGhpcy5mcVJlc3VsdENsYXNzTmFtZVN0YWxlID0gdHJ1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFU1VMVF9DTEFTU19QUk9QRVJUWSwgb2xkLCBhc3RSZXN1bHRDbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRSZXN1bHRDbGFzcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRDbGFzc0FkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRSZXN1bHRDbGFzc1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucmVzdWx0Q2xhc3NEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFJlc3VsdENsYXNzRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuZGFhLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfQ0xBU1MsIFNpbXBsZVR5cGVTdHJpbmdFeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRSZXN1bHRDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy5yZXN1bHRDbGFzc0RlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKiogZnVsbHktcXVhbGlmaWVkIHJlc3VsdCBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZSgpICB7Ci0JCWlmICh0aGlzLmZxUmVzdWx0Q2xhc3NOYW1lU3RhbGUpIHsKLQkJCXRoaXMuZnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUgPSB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoKTsKLQkJCXRoaXMuZnFSZXN1bHRDbGFzc05hbWVTdGFsZSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiB0aGlzLmZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiAodGhpcy5yZXN1bHRDbGFzcyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWVfKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFJlc3VsdENsYXNzTmFtZV8oKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMucmVzdWx0Q2xhc3NBZGFwdGVyLmdldEV4cHJlc3Npb24odGhpcy5idWlsZEFTVFJvb3QoKSkpOwotCX0KLQotCS8vICoqKioqIHJlc3VsdCBzZXQgbWFwcGluZwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0U2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIHRoaXMucmVzdWx0U2V0TWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHRTZXRNYXBwaW5nKFN0cmluZyByZXN1bHRTZXRNYXBwaW5nKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnJlc3VsdFNldE1hcHBpbmcsIHJlc3VsdFNldE1hcHBpbmcpKSB7Ci0JCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSByZXN1bHRTZXRNYXBwaW5nOwotCQkJdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlci5zZXRWYWx1ZShyZXN1bHRTZXRNYXBwaW5nKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jUmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgYXN0UmVzdWx0U2V0TWFwcGluZykgewotCQlTdHJpbmcgb2xkID0gdGhpcy5yZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLnJlc3VsdFNldE1hcHBpbmcgPSBhc3RSZXN1bHRTZXRNYXBwaW5nOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVTVUxUX1NFVF9NQVBQSU5HX1BST1BFUlRZLCBvbGQsIGFzdFJlc3VsdFNldE1hcHBpbmcpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUmVzdWx0U2V0TWFwcGluZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5yZXN1bHRTZXRNYXBwaW5nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlc3VsdFNldE1hcHBpbmdUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlc3VsdFNldE1hcHBpbmdEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFJlc3VsdFNldE1hcHBpbmdBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFBZGFwdGVyKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhkYUFkYXB0ZXIsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFJlc3VsdFNldE1hcHBpbmdBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMucmVzdWx0U2V0TWFwcGluZ0RlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnJlc3VsdENsYXNzID09IG51bGwpICYmCi0JCQkJKHRoaXMucmVzdWx0U2V0TWFwcGluZyA9PSBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlciBidWlsZE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmFtZWROYXRpdmVRdWVyeURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUFOTk9UQVRJT05fTkFNRSk7Ci0JCXJldHVybiBpZGFhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGM1NTQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU5hbWVkUXVlcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnk8L2NvZGU+Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3VyY2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlUXVlcnlBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBOYW1lZFF1ZXJ5QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIENPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKUEEuTkFNRURfUVVFUklFUyk7Ci0KLQkKLQlwcm90ZWN0ZWQgU291cmNlTmFtZWRRdWVyeUFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBBYnN0cmFjdEJhc2VOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLk5BTUVEX1FVRVJZX19OQU1FOwotCX0KLQotCUBPdmVycmlkZQotCVN0cmluZyBnZXRRdWVyeUVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gSlBBLk5BTUVEX1FVRVJZX19RVUVSWTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZ2V0SGludHNFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5OQU1FRF9RVUVSWV9fSElOVFM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JUXVlcnlIaW50QW5ub3RhdGlvbiBidWlsZEhpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uLmJ1aWxkTmFtZWRRdWVyeVF1ZXJ5SGludCh0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIHRoaXMuZGFhLCBpbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGROYW1lZFF1ZXJ5QW5ub3RhdGlvbkFkYXB0ZXIoQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWRFbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihhbm5vdGF0ZWRFbGVtZW50LCBpZGFhKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmFtZWRRdWVyeURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUFOTk9UQVRJT05fTkFNRSk7Ci0JCXJldHVybiBpZGFhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvTWFueUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9uZVRvTWFueUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjYWNkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb01hbnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Cb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9NYW55Ml8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VPbmVUb01hbnlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotCWltcGxlbWVudHMgT25lVG9NYW55Ml8wQW5ub3RhdGlvbgotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBUQVJHRVRfRU5USVRZX0FEQVBURVIgPSBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gRkVUQ0hfQURBUFRFUiA9IGJ1aWxkRmV0Y2hBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gQ0FTQ0FERV9BREFQVEVSID0gYnVpbGRDYXNjYWRlQWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBNQVBQRURfQllfQURBUFRFUiA9IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBtYXBwZWRCeUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbWFwcGVkQnk7Ci0KLQkvL2FkZGVkIGluIEpQQTIuMAotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9SUEhBTl9SRU1PVkFMX0FEQVBURVIgPSBidWlsZE9ycGhhblJlbW92YWxBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gb3JwaGFuUmVtb3ZhbEFkYXB0ZXI7Ci0JcHJpdmF0ZSBCb29sZWFuIG9ycGhhblJlbW92YWw7Ci0KLQlwdWJsaWMgU291cmNlT25lVG9NYW55QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE1BUFBFRF9CWV9BREFQVEVSKTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsQWRhcHRlciA9IHRoaXMuYnVpbGRCb29sZWFuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE9SUEhBTl9SRU1PVkFMX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLm1hcHBlZEJ5ID0gdGhpcy5idWlsZE1hcHBlZEJ5KGFzdFJvb3QpOwotCQl0aGlzLm9ycGhhblJlbW92YWwgPSB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhbChhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNNYXBwZWRCeSh0aGlzLmJ1aWxkTWFwcGVkQnkoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNPcnBoYW5SZW1vdmFsKHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMubWFwcGVkQnkgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5vcnBoYW5SZW1vdmFsID09IG51bGwpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBUQVJHRVRfRU5USVRZX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRGZXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBGRVRDSF9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBnZXRDYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIENBU0NBREVfQURBUFRFUjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVkQnkoKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5tYXBwZWRCeSwgbWFwcGVkQnkpKSB7Ci0JCQl0aGlzLm1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCQl0aGlzLm1hcHBlZEJ5QWRhcHRlci5zZXRWYWx1ZShtYXBwZWRCeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY01hcHBlZEJ5KFN0cmluZyBhc3RNYXBwZWRCeSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5tYXBwZWRCeTsKLQkJdGhpcy5tYXBwZWRCeSA9IGFzdE1hcHBlZEJ5OwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoTUFQUEVEX0JZX1BST1BFUlRZLCBvbGQsIGFzdE1hcHBlZEJ5KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZE1hcHBlZEJ5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm1hcHBlZEJ5QWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKE1BUFBFRF9CWV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoTUFQUEVEX0JZX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBPbmVUb01hbnkyXzBBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBCb29sZWFuIGdldE9ycGhhblJlbW92YWwoKSB7Ci0JCXJldHVybiB0aGlzLm9ycGhhblJlbW92YWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG9ycGhhblJlbW92YWwpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMub3JwaGFuUmVtb3ZhbCwgb3JwaGFuUmVtb3ZhbCkpIHsKLQkJCXRoaXMub3JwaGFuUmVtb3ZhbCA9IG9ycGhhblJlbW92YWw7Ci0JCQl0aGlzLm9ycGhhblJlbW92YWxBZGFwdGVyLnNldFZhbHVlKG9ycGhhblJlbW92YWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNPcnBoYW5SZW1vdmFsKEJvb2xlYW4gYXN0T3JwaGFuUmVtb3ZhbCkgewotCQlCb29sZWFuIG9sZCA9IHRoaXMub3JwaGFuUmVtb3ZhbDsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsID0gYXN0T3JwaGFuUmVtb3ZhbDsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE9SUEhBTl9SRU1PVkFMX1BST1BFUlRZLCBvbGQsIGFzdE9ycGhhblJlbW92YWwpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0T3JwaGFuUmVtb3ZhbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKE9SUEhBTl9SRU1PVkFMX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE9ycGhhblJlbW92YWwoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbEFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gYnVpbGRUYXJnZXRFbnRpdHlBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19NQU5ZX19UQVJHRVRfRU5USVRZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTWFwcGVkQnlBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT05FX1RPX01BTllfX01BUFBFRF9CWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19NQU5ZX19GRVRDSCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQ2FzY2FkZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZEVudW1BcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5PTkVfVE9fTUFOWV9fQ0FTQ0FERSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gYnVpbGRPcnBoYW5SZW1vdmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkT3JwaGFuUmVtb3ZhbEFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEyXzAuT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9ycGhhblJlbW92YWxBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT25lVG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb09uZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1YTA0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPbmVUb09uZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvT25lCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VPbmVUb09uZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBPbmVUb09uZTJfMEFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFRBUkdFVF9FTlRJVFlfQURBUFRFUiA9IGJ1aWxkVGFyZ2V0RW50aXR5QWRhcHRlcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBGRVRDSF9BREFQVEVSID0gYnVpbGRGZXRjaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBDQVNDQURFX0FEQVBURVIgPSBidWlsZENhc2NhZGVBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE1BUFBFRF9CWV9BREFQVEVSID0gYnVpbGRNYXBwZWRCeUFkYXB0ZXIoKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG1hcHBlZEJ5QWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBtYXBwZWRCeTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IE9QVElPTkFMX0FEQVBURVIgPSBidWlsZE9wdGlvbmFsQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG9wdGlvbmFsQWRhcHRlcjsKLQlwcml2YXRlIEJvb2xlYW4gb3B0aW9uYWw7Ci0KLQkvL2FkZGVkIGluIEpQQSAyLjAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBPUlBIQU5fUkVNT1ZBTF9BREFQVEVSID0gYnVpbGRPcnBoYW5SZW1vdmFsQWRhcHRlcigpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IG9ycGhhblJlbW92YWxBZGFwdGVyOwotCXByaXZhdGUgQm9vbGVhbiBvcnBoYW5SZW1vdmFsOwotCi0JcHVibGljIFNvdXJjZU9uZVRvT25lQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy5tYXBwZWRCeUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE1BUFBFRF9CWV9BREFQVEVSKTsKLQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQm9vbGVhbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihPUFRJT05BTF9BREFQVEVSKTsKLQkJdGhpcy5vcnBoYW5SZW1vdmFsQWRhcHRlciA9IHRoaXMuYnVpbGRCb29sZWFuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKE9SUEhBTl9SRU1PVkFMX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlzdXBlci5pbml0aWFsaXplKGFzdFJvb3QpOwotCQl0aGlzLm1hcHBlZEJ5ID0gdGhpcy5idWlsZE1hcHBlZEJ5KGFzdFJvb3QpOwotCQl0aGlzLm9wdGlvbmFsID0gdGhpcy5idWlsZE9wdGlvbmFsKGFzdFJvb3QpOwotCQl0aGlzLm9ycGhhblJlbW92YWwgPSB0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhbChhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNNYXBwZWRCeSh0aGlzLmJ1aWxkTWFwcGVkQnkoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNPcHRpb25hbCh0aGlzLmJ1aWxkT3B0aW9uYWwoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNPcnBoYW5SZW1vdmFsKHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFsKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMubWFwcGVkQnkgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5vcHRpb25hbCA9PSBudWxsKSAmJgotCQkJCSh0aGlzLm9ycGhhblJlbW92YWwgPT0gbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0VGFyZ2V0RW50aXR5QWRhcHRlcigpIHsKLQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIEZFVENIX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGdldENhc2NhZGVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ0FTQ0FERV9BREFQVEVSOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBPbmVUb09uZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogbWFwcGVkIGJ5Ci0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG1hcHBlZEJ5KSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLm1hcHBlZEJ5LCBtYXBwZWRCeSkpIHsKLQkJCXRoaXMubWFwcGVkQnkgPSBtYXBwZWRCeTsKLQkJCXRoaXMubWFwcGVkQnlBZGFwdGVyLnNldFZhbHVlKG1hcHBlZEJ5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jTWFwcGVkQnkoU3RyaW5nIGFzdE1hcHBlZEJ5KSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm1hcHBlZEJ5OwotCQl0aGlzLm1hcHBlZEJ5ID0gYXN0TWFwcGVkQnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChNQVBQRURfQllfUFJPUEVSVFksIG9sZCwgYXN0TWFwcGVkQnkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTWFwcGVkQnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMubWFwcGVkQnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShNQVBQRURfQllfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFwcGVkQnlUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKE1BUFBFRF9CWV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIG9wdGlvbmFsCi0JcHVibGljIEJvb2xlYW4gZ2V0T3B0aW9uYWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMub3B0aW9uYWwsIG9wdGlvbmFsKSkgewotCQkJdGhpcy5vcHRpb25hbCA9IG9wdGlvbmFsOwotCQkJdGhpcy5vcHRpb25hbEFkYXB0ZXIuc2V0VmFsdWUob3B0aW9uYWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNPcHRpb25hbChCb29sZWFuIGFzdE9wdGlvbmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcHRpb25hbDsKLQkJdGhpcy5vcHRpb25hbCA9IGFzdE9wdGlvbmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1BUSU9OQUxfUFJPUEVSVFksIG9sZCwgYXN0T3B0aW9uYWwpOwotCX0KLQotCXByaXZhdGUgQm9vbGVhbiBidWlsZE9wdGlvbmFsKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbmFsQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoT1BUSU9OQUxfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBPbmVUb09uZTJfMEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpIHsKLQkJcmV0dXJuIHRoaXMub3JwaGFuUmVtb3ZhbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5vcnBoYW5SZW1vdmFsLCBvcnBoYW5SZW1vdmFsKSkgewotCQkJdGhpcy5vcnBoYW5SZW1vdmFsID0gb3JwaGFuUmVtb3ZhbDsKLQkJCXRoaXMub3JwaGFuUmVtb3ZhbEFkYXB0ZXIuc2V0VmFsdWUob3JwaGFuUmVtb3ZhbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY09ycGhhblJlbW92YWwoQm9vbGVhbiBhc3RPcnBoYW5SZW1vdmFsKSB7Ci0JCUJvb2xlYW4gb2xkID0gdGhpcy5vcnBoYW5SZW1vdmFsOwotCQl0aGlzLm9ycGhhblJlbW92YWwgPSBhc3RPcnBoYW5SZW1vdmFsOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksIG9sZCwgYXN0T3JwaGFuUmVtb3ZhbCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRPcnBoYW5SZW1vdmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoT1JQSEFOX1JFTU9WQUxfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkT3JwaGFuUmVtb3ZhbChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5vcnBoYW5SZW1vdmFsQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE1hcHBlZEJ5QWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX01BUFBFRF9CWSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEZldGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRmV0Y2hBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX0ZFVENIKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkT3B0aW9uYWxBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX09QVElPTkFMKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9wdGlvbmFsQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4oYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBCb29sZWFuRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDYXNjYWRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRW51bUFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLk9ORV9UT19PTkVfX0NBU0NBREUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEJvb2xlYW4+IGJ1aWxkT3JwaGFuUmVtb3ZhbEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBidWlsZE9ycGhhblJlbW92YWxBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBMl8wLk9ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZE9ycGhhblJlbW92YWxBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gbmV3IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIEJvb2xlYW5FeHByZXNzaW9uQ29udmVydGVyLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9yZGVyQnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VPcmRlckJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ1ZDMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU9yZGVyQnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQnkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFNvdXJjZU9yZGVyQnlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBPcmRlckJ5QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gVkFMVUVfQURBUFRFUiA9IGJ1aWxkVmFsdWVBZGFwdGVyKCk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB2YWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWU7Ci0KLQotCXB1YmxpYyBTb3VyY2VPcmRlckJ5QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KGVsZW1lbnQsIFZBTFVFX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnZhbHVlID0gdGhpcy5idWlsZFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy52YWx1ZSA9PSBudWxsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCXNiLmFwcGVuZCh0aGlzLnZhbHVlKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogT3JkZXJCeUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnZhbHVlLCB2YWx1ZSkpIHsKLQkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJCXRoaXMudmFsdWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVmFsdWUoU3RyaW5nIGFzdFZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlOwotCQl0aGlzLnZhbHVlID0gYXN0VmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFZBTFVFX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuT1JERVJfQllfX1ZBTFVFKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZU92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0OGJhZGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PdmVycmlkZUFubm90YXRpb247Ci0KLS8qKgotICogPHVsPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkF0dHJpYnV0ZU92ZXJyaWRlPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkFzc29jaWF0aW9uT3ZlcnJpZGU8L2NvZGU+Ci0gKiA8L3VsPgotICovCi1hYnN0cmFjdCBjbGFzcyBTb3VyY2VPdmVycmlkZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIE92ZXJyaWRlQW5ub3RhdGlvbgotewkJCi0JRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVBZGFwdGVyOwotCVN0cmluZyBuYW1lOwotCQkKLQotCVNvdXJjZU92ZXJyaWRlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSwgQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBkYWEsIGFubm90YXRpb25BZGFwdGVyKTsKLQkJdGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5idWlsZE5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5uYW1lQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lQWRhcHRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQl9Ci0JCi0KLQkvLyAqKioqKioqKioqIE92ZXJyaWRlQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMubmFtZSwgbmFtZSkpIHsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCQl0aGlzLm5hbWVBZGFwdGVyLnNldFZhbHVlKG5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNOYW1lKFN0cmluZyBhc3ROYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IGFzdE5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChOQU1FX1BST1BFUlRZLCBvbGQsIGFzdE5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMuZ2V0TmFtZUVsZW1lbnROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcih0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7Ci0JCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLm5hbWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWIzMDVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuUHJpbWFyeUtleUpvaW5Db2x1bW48L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbgotCWltcGxlbWVudHMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGRTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oCi0JCUphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCAKLQkJQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCi0JCXJldHVybiBuZXcgU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCAKLQkJCUFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgCi0JCQlpbnQgaW5kZXgpIHsKLQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KTsKLQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGlhYSA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBpZGFhKTsKLQkJcmV0dXJuIG5ldyBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oCi0JCQlwYXJlbnQsCi0JCQllbGVtZW50LAotCQkJaWRhYSwKLQkJCWlhYSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGJ1aWxkTmVzdGVkU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKAotCQkJSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIAotCQkJQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCAKLQkJCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJCi0JCXJldHVybiBuZXcgU291cmNlUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCwgaWRhYSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEpIHsKLQkJdGhpcyhwYXJlbnQsIGVsZW1lbnQsIGRhYSwgbmV3IEVsZW1lbnRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBkYWEpKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXRoaXMocGFyZW50LCBlbGVtZW50LCBpZGFhLCBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBpZGFhKSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBkYWEsIEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoYXN0Um9vdCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5zeW5jUmVmZXJlbmNlZENvbHVtbk5hbWUodGhpcy5idWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogSmF2YVNvdXJjZU5hbWVkQ29sdW1uQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb25FbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFByaW1hcnlLZXlKb2luQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKSkgewotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIuc2V0VmFsdWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgYXN0UmVmZXJlbmNlZENvbHVtbk5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWUgPSBhc3RSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgYXN0UmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbk5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lRGVjbGFyYXRpb25BZGFwdGVyLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VkQ29sdW1uTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXModGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlciwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQlwcml2YXRlIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRTdHJpbmdFbGVtZW50QWRhcHRlcihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID09IG51bGwpOwotCX0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uQWRhcHRlcihBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50SW5kZXhlZEFubm90YXRpb25BZGFwdGVyKGFubm90YXRlZEVsZW1lbnQsIGlkYWEpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gCi0JCQluZXcgQ29tYmluYXRpb25JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQlERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsCi0JCQkJQ09OVEFJTkVSX0RFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlpbmRleCwKLQkJCQlBTk5PVEFUSU9OX05BTUUpOwotCQlyZXR1cm4gaWRhYTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMxOTcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVF1ZXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8dWw+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5OYW1lZE5hdGl2ZVF1ZXJ5PC9jb2RlPgotICogPC91bD4KLSAqLwotYWJzdHJhY3QgY2xhc3MgU291cmNlUXVlcnlBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBRdWVyeUFubm90YXRpb24KLXsKLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gbmFtZUFkYXB0ZXI7Ci0JU3RyaW5nIG5hbWU7Ci0JVGV4dFJhbmdlIG5hbWVUZXh0UmFuZ2U7Ci0KLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHF1ZXJ5RGVjbGFyYXRpb25BZGFwdGVyOwotCUFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHF1ZXJ5QWRhcHRlcjsKLQlTdHJpbmcgcXVlcnk7Ci0JVGV4dFJhbmdlIHF1ZXJ5VGV4dFJhbmdlOwotCi0JZmluYWwgUXVlcnlIaW50c0Fubm90YXRpb25Db250YWluZXIgaGludHNDb250YWluZXIgPSBuZXcgUXVlcnlIaW50c0Fubm90YXRpb25Db250YWluZXIoKTsKLQotCi0JU291cmNlUXVlcnlBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLCBBbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlcikgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSwgYW5ub3RhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLm5hbWVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLm5hbWVBZGFwdGVyID0gdGhpcy5idWlsZE5hbWVBZGFwdGVyKCk7Ci0JCXRoaXMucXVlcnlEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmJ1aWxkUXVlcnlEZWNsYXJhdGlvbkFkYXB0ZXIoKTsKLQkJdGhpcy5xdWVyeUFkYXB0ZXIgPSB0aGlzLmJ1aWxkUXVlcnlBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLm5hbWUgPSB0aGlzLmJ1aWxkTmFtZShhc3RSb290KTsKLQkJdGhpcy5uYW1lVGV4dFJhbmdlID0gdGhpcy5idWlsZE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXRoaXMucXVlcnkgPSB0aGlzLmJ1aWxkUXVlcnkoYXN0Um9vdCk7Ci0JCXRoaXMucXVlcnlUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkUXVlcnlUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXRoaXMuaGludHNDb250YWluZXIuaW5pdGlhbGl6ZSh0aGlzLmdldEFzdEFubm90YXRpb24oYXN0Um9vdCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNOYW1lKHRoaXMuYnVpbGROYW1lKGFzdFJvb3QpKTsKLQkJdGhpcy5uYW1lVGV4dFJhbmdlID0gdGhpcy5idWlsZE5hbWVUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXRoaXMuc3luY1F1ZXJ5KHRoaXMuYnVpbGRRdWVyeShhc3RSb290KSk7Ci0JCXRoaXMucXVlcnlUZXh0UmFuZ2UgPSB0aGlzLmJ1aWxkUXVlcnlUZXh0UmFuZ2UoYXN0Um9vdCk7Ci0JCXRoaXMuaGludHNDb250YWluZXIuc3luY2hyb25pemUodGhpcy5nZXRBc3RBbm5vdGF0aW9uKGFzdFJvb3QpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQmFzZU5hbWVkUXVlcnlBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5uYW1lVGV4dFJhbmdlOwotCX0KLQotCXByaXZhdGUgVGV4dFJhbmdlIGJ1aWxkTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKHRoaXMuZGFhLCB0aGlzLmdldE5hbWVFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkU3RyaW5nRWxlbWVudEFkYXB0ZXIodGhpcy5uYW1lRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBxdWVyeQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBxdWVyeSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5xdWVyeSwgcXVlcnkpKSB7Ci0JCQl0aGlzLnF1ZXJ5ID0gcXVlcnk7Ci0JCQl0aGlzLnF1ZXJ5QWRhcHRlci5zZXRWYWx1ZShxdWVyeSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1F1ZXJ5KFN0cmluZyBhbm5vdGF0aW9uUXVlcnkpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMucXVlcnk7Ci0JCXRoaXMucXVlcnkgPSBhbm5vdGF0aW9uUXVlcnk7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChRVUVSWV9QUk9QRVJUWSwgb2xkLCBhbm5vdGF0aW9uUXVlcnkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkUXVlcnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UXVlcnlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMucXVlcnlUZXh0UmFuZ2U7Ci0JfQotCi0JcHJpdmF0ZSBUZXh0UmFuZ2UgYnVpbGRRdWVyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMucXVlcnlEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCXByaXZhdGUgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFF1ZXJ5RGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIHRoaXMuZ2V0UXVlcnlFbGVtZW50TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkUXVlcnlBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMucXVlcnlEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCWFic3RyYWN0IFN0cmluZyBnZXRRdWVyeUVsZW1lbnROYW1lKCk7Ci0KLQkvLyAqKioqKiBoaW50cwotCi0JcHVibGljIExpc3RJdGVyYWJsZTxRdWVyeUhpbnRBbm5vdGF0aW9uPiBnZXRIaW50cygpIHsKLQkJcmV0dXJuIHRoaXMuaGludHNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEhpbnRzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuaGludHNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnNTaXplKCk7Ci0JfQotCi0JcHVibGljIFF1ZXJ5SGludEFubm90YXRpb24gaGludEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy5oaW50c0NvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBRdWVyeUhpbnRBbm5vdGF0aW9uIGFkZEhpbnQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmhpbnRzQ29udGFpbmVyLmFkZE5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVIaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCXRoaXMuaGludHNDb250YWluZXIubW92ZU5lc3RlZEFubm90YXRpb24odGFyZ2V0SW5kZXgsIHNvdXJjZUluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVIaW50KGludCBpbmRleCkgewotCQl0aGlzLmhpbnRzQ29udGFpbmVyLnJlbW92ZU5lc3RlZEFubm90YXRpb24oaW5kZXgpOwotCX0KLQotCWFic3RyYWN0IFF1ZXJ5SGludEFubm90YXRpb24gYnVpbGRIaW50KGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0SGludHNFbGVtZW50TmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLm5hbWUgPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5xdWVyeSA9PSBudWxsKSAmJgotCQkJCXRoaXMuaGludHNDb250YWluZXIuaXNFbXB0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMubmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGhpbnQgY29udGFpbmVyICoqKioqKioqKioKLQkvKioKLQkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIHhtbCBzY2hlbWEncyB4bWxucwotCSAqLwotCWNsYXNzIFF1ZXJ5SGludHNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQlleHRlbmRzIEFubm90YXRpb25Db250YWluZXI8UXVlcnlIaW50QW5ub3RhdGlvbj4KLQl7Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25zUHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIEhJTlRTX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gU291cmNlUXVlcnlBbm5vdGF0aW9uLnRoaXMuZ2V0SGludHNFbGVtZW50TmFtZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIFF1ZXJ5SGludEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgUXVlcnlIaW50QW5ub3RhdGlvbiBidWlsZE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gU291cmNlUXVlcnlBbm5vdGF0aW9uLnRoaXMuYnVpbGRIaW50KGluZGV4KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVF1ZXJ5SGludEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVF1ZXJ5SGludEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwMjI4ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5Db252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0Lk5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5RdWVyeUhpbnQ8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBRdWVyeUhpbnRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IG5hbWVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBuYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlRGVjbGFyYXRpb25BZGFwdGVyOwotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdmFsdWVBZGFwdGVyOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlOwotCi0KLQlzdGF0aWMgU291cmNlUXVlcnlIaW50QW5ub3RhdGlvbiBidWlsZE5hbWVkUXVlcnlRdWVyeUhpbnQoSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWRRdWVyeUFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gYnVpbGROZXN0ZWRTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCwgYnVpbGROYW1lZFF1ZXJ5UXVlcnlIaW50QW5ub3RhdGlvbkFkYXB0ZXIobmFtZWRRdWVyeUFkYXB0ZXIsIGluZGV4KSk7Ci0JfQotCi0Jc3RhdGljIFNvdXJjZVF1ZXJ5SGludEFubm90YXRpb24gYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5UXVlcnlIaW50KEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWROYXRpdmVRdWVyeUFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gYnVpbGROZXN0ZWRTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCwgYnVpbGROYW1lZE5hdGl2ZVF1ZXJ5UXVlcnlIaW50QW5ub3RhdGlvbkFkYXB0ZXIobmFtZWROYXRpdmVRdWVyeUFkYXB0ZXIsIGluZGV4KSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU291cmNlUXVlcnlIaW50QW5ub3RhdGlvbiBidWlsZE5lc3RlZFNvdXJjZVF1ZXJ5SGludEFubm90YXRpb24oCi0JCQlKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgCi0JCQlBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQkKLQkJcmV0dXJuIG5ldyBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uKHBhcmVudCwgZWxlbWVudCwgaWRhYSk7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VRdWVyeUhpbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBpZGFhLCBuZXcgRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcihlbGVtZW50LCBpZGFhKSk7Ci0JCXRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCXRoaXMubmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkTmFtZUFkYXB0ZXIoKTsKLQkJdGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciA9IHRoaXMuYnVpbGRWYWx1ZURlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLnZhbHVlQWRhcHRlciA9IHRoaXMuYnVpbGRWYWx1ZUFkYXB0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJdGhpcy5uYW1lID0gdGhpcy5idWlsZE5hbWUoYXN0Um9vdCk7Ci0JCXRoaXMudmFsdWUgPSB0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuc3luY05hbWUodGhpcy5idWlsZE5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNWYWx1ZSh0aGlzLmJ1aWxkVmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBRdWVyeUhpbnRBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5uYW1lLCBuYW1lKSkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJCXRoaXMubmFtZUFkYXB0ZXIuc2V0VmFsdWUobmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY05hbWUoU3RyaW5nIGFzdE5hbWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMubmFtZTsKLQkJdGhpcy5uYW1lID0gYXN0TmFtZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZCwgYXN0TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGROYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLm5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKHRoaXMuZGFhLCBKUEEuUVVFUllfSElOVF9fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMubmFtZURlY2xhcmF0aW9uQWRhcHRlcik7Ci0JfQotCi0JLy8gKioqKiogdmFsdWUKLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudmFsdWUsIHZhbHVlKSkgewotCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQkJdGhpcy52YWx1ZUFkYXB0ZXIuc2V0VmFsdWUodmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNWYWx1ZShTdHJpbmcgYXN0VmFsdWUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMudmFsdWU7Ci0JCXRoaXMudmFsdWUgPSBhc3RWYWx1ZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFX1BST1BFUlRZLCBvbGQsIGFzdFZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UodGhpcy52YWx1ZURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyh0aGlzLmRhYSwgSlBBLlFVRVJZX0hJTlRfX1ZBTFVFKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkVmFsdWVBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5idWlsZFN0cmluZ0VsZW1lbnRBZGFwdGVyKHRoaXMudmFsdWVEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCXJldHVybiBzdXBlci5pc1Vuc2V0KCkgJiYKLQkJCQkodGhpcy5uYW1lID09IG51bGwpICYmCi0JCQkJKHRoaXMudmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdG9TdHJpbmcoU3RyaW5nQnVpbGRlciBzYikgewotCQlzYi5hcHBlbmQodGhpcy5uYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCXByaXZhdGUgc3RhdGljIEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGJ1aWxkTmFtZWRRdWVyeVF1ZXJ5SGludEFubm90YXRpb25BZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgbmFtZWRRdWVyeUFkYXB0ZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKG5hbWVkUXVlcnlBZGFwdGVyLCBKUEEuTkFNRURfUVVFUllfX0hJTlRTLCBpbmRleCwgQU5OT1RBVElPTl9OQU1FKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZE5hbWVkTmF0aXZlUXVlcnlRdWVyeUhpbnRBbm5vdGF0aW9uQWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIG5hbWVkTmF0aXZlUXVlcnlBZGFwdGVyLCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihuYW1lZE5hdGl2ZVF1ZXJ5QWRhcHRlciwgSlBBLk5BTUVEX05BVElWRV9RVUVSWV9fSElOVFMsIGluZGV4LCBBTk5PVEFUSU9OX05BTUUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjg2YjAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5FbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRXhwcmVzc2lvbkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNhc2NhZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9NYW55Ci0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmUKLSAqIGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueQotICogamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmUKLSAqLwotYWJzdHJhY3QgY2xhc3MgU291cmNlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uCi17Ci0JZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiB0YXJnZXRFbnRpdHlEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gdGFyZ2V0RW50aXR5QWRhcHRlcjsKLQlTdHJpbmcgdGFyZ2V0RW50aXR5OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRDbGFzc0Fubm90YXRpb24jZnVsbHlRdWFsaWZpZWRDbGFzc05hbWUKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZTsKLQkvLyB3ZSBuZWVkIGEgZmxhZyBzaW5jZSB0aGUgZi1xIG5hbWUgY2FuIGJlIG51bGwKLQlwcml2YXRlIGJvb2xlYW4gZnFUYXJnZXRFbnRpdHlDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0KLQlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoRGVjbGFyYXRpb25BZGFwdGVyOwotCWZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGZldGNoQWRhcHRlcjsKLQlGZXRjaFR5cGUgZmV0Y2g7Ci0KLQlmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gY2FzY2FkZURlY2xhcmF0aW9uQWRhcHRlcjsKLQlmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNhc2NhZGVBZGFwdGVyOwotCUNhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzID0gRU1QVFlfQ0FTQ0FERV9UWVBFX0FSUkFZOyAgLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgbnVsbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhc2NhZGVUeXBlW10gRU1QVFlfQ0FTQ0FERV9UWVBFX0FSUkFZID0gbmV3IENhc2NhZGVUeXBlWzBdOwotCi0KLQlTb3VyY2VSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGRhYSkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIGRhYSk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5RGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5nZXRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5QWRhcHRlciA9IHRoaXMuYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy50YXJnZXRFbnRpdHlEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmZldGNoRGVjbGFyYXRpb25BZGFwdGVyID0gdGhpcy5nZXRGZXRjaEFkYXB0ZXIoKTsKLQkJdGhpcy5mZXRjaEFkYXB0ZXIgPSB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuZmV0Y2hEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCQl0aGlzLmNhc2NhZGVEZWNsYXJhdGlvbkFkYXB0ZXIgPSB0aGlzLmdldENhc2NhZGVBZGFwdGVyKCk7Ci0JCXRoaXMuY2FzY2FkZUFkYXB0ZXIgPSBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4oZWxlbWVudCwgdGhpcy5jYXNjYWRlRGVjbGFyYXRpb25BZGFwdGVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBkYWVhKSB7Ci0JCXJldHVybiBuZXcgQW5ub3RhdGVkRWxlbWVudEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHJvdGVjdGVkIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxCb29sZWFuPiBidWlsZEJvb2xlYW5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8Qm9vbGVhbj4odGhpcy5hbm5vdGF0ZWRFbGVtZW50LCBkYWVhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMudGFyZ2V0RW50aXR5ID0gdGhpcy5idWlsZFRhcmdldEVudGl0eShhc3RSb290KTsKLQkJdGhpcy5mZXRjaCA9IHRoaXMuYnVpbGRGZXRjaChhc3RSb290KTsKLQkJdGhpcy5jYXNjYWRlVHlwZXMgPSB0aGlzLmJ1aWxkQ2FzY2FkZVR5cGVzKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNGZXRjaCh0aGlzLmJ1aWxkRmV0Y2goYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNUYXJnZXRFbnRpdHkodGhpcy5idWlsZFRhcmdldEVudGl0eShhc3RSb290KSk7Ci0JCXRoaXMuc3luY0Nhc2NhZGVUeXBlcyh0aGlzLmJ1aWxkQ2FzY2FkZVR5cGVzKGFzdFJvb3QpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1Vuc2V0KCkgewotCQlyZXR1cm4gc3VwZXIuaXNVbnNldCgpICYmCi0JCQkJKHRoaXMudGFyZ2V0RW50aXR5ID09IG51bGwpICYmCi0JCQkJKHRoaXMuZmV0Y2ggPT0gbnVsbCkgJiYKLQkJCQkodGhpcy5jYXNjYWRlVHlwZXMubGVuZ3RoID09IDApOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMudGFyZ2V0RW50aXR5KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogdGFyZ2V0IGVudGl0eQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGhpcy50YXJnZXRFbnRpdHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB0YXJnZXRFbnRpdHkpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudGFyZ2V0RW50aXR5LCB0YXJnZXRFbnRpdHkpKSB7Ci0JCQl0aGlzLnRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKLQkJCXRoaXMuZnFUYXJnZXRFbnRpdHlDbGFzc05hbWVTdGFsZSA9IHRydWU7Ci0JCQl0aGlzLnRhcmdldEVudGl0eUFkYXB0ZXIuc2V0VmFsdWUodGFyZ2V0RW50aXR5KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jVGFyZ2V0RW50aXR5KFN0cmluZyBhc3RUYXJnZXRFbnRpdHkpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMudGFyZ2V0RW50aXR5LCBhc3RUYXJnZXRFbnRpdHkpKSB7Ci0JCQl0aGlzLnN5bmNUYXJnZXRFbnRpdHlfKGFzdFRhcmdldEVudGl0eSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1RhcmdldEVudGl0eV8oU3RyaW5nIGFzdFRhcmdldEVudGl0eSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YXJnZXRFbnRpdHk7Ci0JCXRoaXMudGFyZ2V0RW50aXR5ID0gYXN0VGFyZ2V0RW50aXR5OwotCQl0aGlzLmZxVGFyZ2V0RW50aXR5Q2xhc3NOYW1lU3RhbGUgPSB0cnVlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFSR0VUX0VOVElUWV9QUk9QRVJUWSwgb2xkLCBhc3RUYXJnZXRFbnRpdHkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGFyZ2V0RW50aXR5KENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnRhcmdldEVudGl0eUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLnRhcmdldEVudGl0eURlY2xhcmF0aW9uQWRhcHRlciwgYXN0Um9vdCk7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRoZSBKYXZhIGFkYXB0ZXIncyAndGFyZ2V0RW50aXR5JyBlbGVtZW50IGFkYXB0ZXIgY29uZmlnCi0JICovCi0JYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRUYXJnZXRFbnRpdHlBZGFwdGVyKCk7Ci0KLQkvLyAqKioqKiBmdWxseS1xdWFsaWZpZWQgdGFyZ2V0IGVudGl0eSBjbGFzcyBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpIHsKLQkJaWYgKHRoaXMuZnFUYXJnZXRFbnRpdHlDbGFzc05hbWVTdGFsZSkgewotCQkJdGhpcy5mdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSA9IHRoaXMuYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpOwotCQkJdGhpcy5mcVRhcmdldEVudGl0eUNsYXNzTmFtZVN0YWxlID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLnRhcmdldEVudGl0eSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkRnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWVfKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZV8oKSB7Ci0JCXJldHVybiBBU1RUb29scy5yZXNvbHZlRnVsbHlRdWFsaWZpZWROYW1lKHRoaXMudGFyZ2V0RW50aXR5QWRhcHRlci5nZXRFeHByZXNzaW9uKHRoaXMuYnVpbGRBU1RSb290KCkpKTsKLQl9Ci0KLQkvLyAqKioqKiBmZXRjaAotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy5mZXRjaCwgZmV0Y2gpKSB7Ci0JCQl0aGlzLmZldGNoID0gZmV0Y2g7Ci0JCQl0aGlzLmZldGNoQWRhcHRlci5zZXRWYWx1ZShGZXRjaFR5cGUudG9KYXZhQW5ub3RhdGlvblZhbHVlKGZldGNoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY0ZldGNoKEZldGNoVHlwZSBhc3RGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkID0gdGhpcy5mZXRjaDsKLQkJdGhpcy5mZXRjaCA9IGFzdEZldGNoOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoRkVUQ0hfUFJPUEVSVFksIG9sZCwgYXN0RmV0Y2gpOwotCX0KLQotCXByaXZhdGUgRmV0Y2hUeXBlIGJ1aWxkRmV0Y2goQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIEZldGNoVHlwZS5mcm9tSmF2YUFubm90YXRpb25WYWx1ZSh0aGlzLmZldGNoQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRGZXRjaFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKHRoaXMuZmV0Y2hEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgSmF2YSBhZGFwdGVyJ3MgJ2ZldGNoJyBlbGVtZW50IGFkYXB0ZXIgY29uZmlnCi0JICovCi0JYWJzdHJhY3QgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBnZXRGZXRjaEFkYXB0ZXIoKTsKLQotCS8vICoqKioqIGNhc2NhZGUgdHlwZXMKLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdGF0ZSBvZiAnY2FzY2FkZVR5cGVzJyBpcyB0byBjaGFuZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZVR5cGUoQ2FzY2FkZVR5cGUgY2FzY2FkZVR5cGUsIGJvb2xlYW4gc2V0KSB7Ci0JCXRoaXMuc2V0Q2FzY2FkZVR5cGVzKHNldCA/Ci0JCQlBcnJheVRvb2xzLmFkZCh0aGlzLmNhc2NhZGVUeXBlcywgY2FzY2FkZVR5cGUpIDoKLQkJCUFycmF5VG9vbHMucmVtb3ZlKHRoaXMuY2FzY2FkZVR5cGVzLCBjYXNjYWRlVHlwZSkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBwcmUtY29uZGl0aW9uOiBzdGF0ZSBvZiAnY2FzY2FkZVR5cGVzJyBpcyB0byBjaGFuZ2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q2FzY2FkZVR5cGVzKENhc2NhZGVUeXBlW10gY2FzY2FkZVR5cGVzKSB7Ci0JCXRoaXMuY2FzY2FkZVR5cGVzID0gY2FzY2FkZVR5cGVzOwotCQl0aGlzLmNhc2NhZGVBZGFwdGVyLnNldFZhbHVlKENhc2NhZGVUeXBlLnRvSmF2YUFubm90YXRpb25WYWx1ZXMoY2FzY2FkZVR5cGVzKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDYXNjYWRlVHlwZXMoQ2FzY2FkZVR5cGVbXSBhc3RDYXNjYWRlVHlwZXMpIHsKLQkJQ2FzY2FkZVR5cGVbXSBvbGQgPSB0aGlzLmNhc2NhZGVUeXBlczsKLQkJdGhpcy5jYXNjYWRlVHlwZXMgPSBhc3RDYXNjYWRlVHlwZXM7Ci0JCXRoaXMuc3luY0Nhc2NhZGVBbGwob2xkKTsKLQkJdGhpcy5zeW5jQ2FzY2FkZU1lcmdlKG9sZCk7Ci0JCXRoaXMuc3luY0Nhc2NhZGVQZXJzaXN0KG9sZCk7Ci0JCXRoaXMuc3luY0Nhc2NhZGVSZWZyZXNoKG9sZCk7Ci0JCXRoaXMuc3luY0Nhc2NhZGVSZW1vdmUob2xkKTsKLQkJdGhpcy5zeW5jQ2FzY2FkZURldGFjaChvbGQpOwotCX0KLQotCXByaXZhdGUgQ2FzY2FkZVR5cGVbXSBidWlsZENhc2NhZGVUeXBlcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gQ2FzY2FkZVR5cGUuZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVzKHRoaXMuY2FzY2FkZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYXNjYWRlVHlwZUlzVHJ1ZShDYXNjYWRlVHlwZSBjYXNjYWRlVHlwZSkgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyh0aGlzLmNhc2NhZGVUeXBlcywgY2FzY2FkZVR5cGUpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2FzY2FkZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFRleHRSYW5nZSh0aGlzLmNhc2NhZGVEZWNsYXJhdGlvbkFkYXB0ZXIsIGFzdFJvb3QpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgSmF2YSBhZGFwdGVyJ3MgJ2Nhc2NhZGUnIGVsZW1lbnQgYWRhcHRlciBjb25maWcKLQkgKi8KLQlhYnN0cmFjdCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZ2V0Q2FzY2FkZUFkYXB0ZXIoKTsKLQotCS8vICoqKioqIGNhc2NhZGUgYWxsCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlQWxsKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlVHlwZUlzVHJ1ZShDYXNjYWRlVHlwZS5BTEwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVBbGwoYm9vbGVhbiBjYXNjYWRlQWxsKSB7Ci0JCWlmICh0aGlzLmlzQ2FzY2FkZUFsbCgpICE9IGNhc2NhZGVBbGwpIHsKLQkJCXRoaXMuc2V0Q2FzY2FkZVR5cGUoQ2FzY2FkZVR5cGUuQUxMLCBjYXNjYWRlQWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ2FzY2FkZUFsbChDYXNjYWRlVHlwZVtdIG9sZENhc2NhZGVUeXBlcykgewotCQlib29sZWFuIG9sZCA9IEFycmF5VG9vbHMuY29udGFpbnMob2xkQ2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5BTEwpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9BTExfUFJPUEVSVFksIG9sZCwgdGhpcy5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCi0JLy8gKioqKiogY2FzY2FkZSBwZXJzaXN0Ci0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUGVyc2lzdCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZVR5cGVJc1RydWUoQ2FzY2FkZVR5cGUuUEVSU0lTVCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBjYXNjYWRlUGVyc2lzdCkgewotCQlpZiAodGhpcy5pc0Nhc2NhZGVQZXJzaXN0KCkgIT0gY2FzY2FkZVBlcnNpc3QpIHsKLQkJCXRoaXMuc2V0Q2FzY2FkZVR5cGUoQ2FzY2FkZVR5cGUuUEVSU0lTVCwgY2FzY2FkZVBlcnNpc3QpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDYXNjYWRlUGVyc2lzdChDYXNjYWRlVHlwZVtdIG9sZENhc2NhZGVUeXBlcykgewotCQlib29sZWFuIG9sZCA9IEFycmF5VG9vbHMuY29udGFpbnMob2xkQ2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5QRVJTSVNUKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSwgb2xkLCB0aGlzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCi0JLy8gKioqKiogY2FzY2FkZSBtZXJnZQotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlVHlwZUlzVHJ1ZShDYXNjYWRlVHlwZS5NRVJHRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gY2FzY2FkZU1lcmdlKSB7Ci0JCWlmICh0aGlzLmlzQ2FzY2FkZU1lcmdlKCkgIT0gY2FzY2FkZU1lcmdlKSB7Ci0JCQl0aGlzLnNldENhc2NhZGVUeXBlKENhc2NhZGVUeXBlLk1FUkdFLCBjYXNjYWRlTWVyZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDYXNjYWRlTWVyZ2UoQ2FzY2FkZVR5cGVbXSBvbGRDYXNjYWRlVHlwZXMpIHsKLQkJYm9vbGVhbiBvbGQgPSBBcnJheVRvb2xzLmNvbnRhaW5zKG9sZENhc2NhZGVUeXBlcywgQ2FzY2FkZVR5cGUuTUVSR0UpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9NRVJHRV9QUk9QRVJUWSwgb2xkLCB0aGlzLmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQotCS8vICoqKioqIGNhc2NhZGUgcmVtb3ZlCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVtb3ZlKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlVHlwZUlzVHJ1ZShDYXNjYWRlVHlwZS5SRU1PVkUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVSZW1vdmUoYm9vbGVhbiBjYXNjYWRlUmVtb3ZlKSB7Ci0JCWlmICh0aGlzLmlzQ2FzY2FkZVJlbW92ZSgpICE9IGNhc2NhZGVSZW1vdmUpIHsKLQkJCXRoaXMuc2V0Q2FzY2FkZVR5cGUoQ2FzY2FkZVR5cGUuUkVNT1ZFLCBjYXNjYWRlUmVtb3ZlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ2FzY2FkZVJlbW92ZShDYXNjYWRlVHlwZVtdIG9sZENhc2NhZGVUeXBlcykgewotCQlib29sZWFuIG9sZCA9IEFycmF5VG9vbHMuY29udGFpbnMob2xkQ2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5SRU1PVkUpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9SRU1PVkVfUFJPUEVSVFksIG9sZCwgdGhpcy5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JLy8gKioqKiogY2FzY2FkZSByZWZyZXNoCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlUmVmcmVzaCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FzY2FkZVR5cGVJc1RydWUoQ2FzY2FkZVR5cGUuUkVGUkVTSCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiBjYXNjYWRlUmVmcmVzaCkgewotCQlpZiAodGhpcy5pc0Nhc2NhZGVSZWZyZXNoKCkgIT0gY2FzY2FkZVJlZnJlc2gpIHsKLQkJCXRoaXMuc2V0Q2FzY2FkZVR5cGUoQ2FzY2FkZVR5cGUuUkVGUkVTSCwgY2FzY2FkZVJlZnJlc2gpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDYXNjYWRlUmVmcmVzaChDYXNjYWRlVHlwZVtdIG9sZENhc2NhZGVUeXBlcykgewotCQlib29sZWFuIG9sZCA9IEFycmF5VG9vbHMuY29udGFpbnMob2xkQ2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5SRUZSRVNIKTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKENBU0NBREVfUkVGUkVTSF9QUk9QRVJUWSwgb2xkLCB0aGlzLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCi0JLy8gKioqKiogY2FzY2FkZSBkZXRhY2ggLSBKUEEgMi4wCi0JcHVibGljIGJvb2xlYW4gaXNDYXNjYWRlRGV0YWNoKCkgewotCQlyZXR1cm4gdGhpcy5jYXNjYWRlVHlwZUlzVHJ1ZShDYXNjYWRlVHlwZS5ERVRBQ0gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhc2NhZGVEZXRhY2goYm9vbGVhbiBjYXNjYWRlRGV0YWNoKSB7Ci0JCWlmICh0aGlzLmlzQ2FzY2FkZURldGFjaCgpICE9IGNhc2NhZGVEZXRhY2gpIHsKLQkJCXRoaXMuc2V0Q2FzY2FkZVR5cGUoQ2FzY2FkZVR5cGUuREVUQUNILCBjYXNjYWRlRGV0YWNoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jQ2FzY2FkZURldGFjaChDYXNjYWRlVHlwZVtdIG9sZENhc2NhZGVUeXBlcykgewotCQlib29sZWFuIG9sZCA9IEFycmF5VG9vbHMuY29udGFpbnMob2xkQ2FzY2FkZVR5cGVzLCBDYXNjYWRlVHlwZS5ERVRBQ0gpOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoQ0FTQ0FERV9ERVRBQ0hfUFJPUEVSVFksIG9sZCwgdGhpcy5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFRhcmdldEVudGl0eUFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCS8vIFRPRE8gd2hhdCBhYm91dCBRdWFsaWZpZWRUeXBlPwotCQlyZXR1cm4gYnVpbGRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoYW5ub3RhdGlvbkFkYXB0ZXIsIGVsZW1lbnROYW1lLCBTaW1wbGVUeXBlU3RyaW5nRXhwcmVzc2lvbkNvbnZlcnRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUsIEV4cHJlc3Npb25Db252ZXJ0ZXI8U3RyaW5nPiBjb252ZXJ0ZXIpIHsKLQkJcmV0dXJuIG5ldyBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCi0Jc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRGZXRjaEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBuZXcgRW51bURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSk7Ci0JfQotCi0Jc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEVudW1BcnJheUFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyLCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIG5ldyBFbnVtQXJyYXlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlZTNjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbWJpbmF0aW9uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuTmVzdGVkSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuU2Vjb25kYXJ5VGFibGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VTZWNvbmRhcnlUYWJsZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIENPTlRBSU5FUl9ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0KLQlwcml2YXRlIGZpbmFsIFBrSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyIHBrSm9pbkNvbHVtbnNDb250YWluZXIgPSBuZXcgUGtKb2luQ29sdW1uc0Fubm90YXRpb25Db250YWluZXIoKTsKLQotCXB1YmxpYyBzdGF0aWMgU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIGJ1aWxkU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQsIGludCBpbmRleCkgewotCQlJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhID0gYnVpbGRTZWNvbmRhcnlUYWJsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpOwotCQlJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgaWFhID0gYnVpbGRTZWNvbmRhcnlUYWJsZUFubm90YXRpb25BZGFwdGVyKGVsZW1lbnQsIGlkYWEpOwotCQlyZXR1cm4gbmV3IFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigKLQkJCXBhcmVudCwKLQkJCWVsZW1lbnQsCi0JCQlpZGFhLAotCQkJaWFhKTsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbigKLQkJCUphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LAotCQkJQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LAotCQkJSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgZGFhLAotCQkJSW5kZXhlZEFubm90YXRpb25BZGFwdGVyIGFubm90YXRpb25BZGFwdGVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgZGFhLCBhbm5vdGF0aW9uQWRhcHRlcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lci5pbml0aWFsaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29udGFpbmVyLnN5bmNocm9uaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGROYW1lRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpQQS5TRUNPTkRBUllfVEFCTEVfX05BTUUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkU2NoZW1hRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpQQS5TRUNPTkRBUllfVEFCTEVfX1NDSEVNQSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRDYXRhbG9nRGVjbGFyYXRpb25BZGFwdGVyKCkgewotCQlyZXR1cm4gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3ModGhpcy5kYWEsIEpQQS5TRUNPTkRBUllfVEFCTEVfX0NBVEFMT0cpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5pcXVlQ29uc3RyYWludHNFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIEpQQS5TRUNPTkRBUllfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqKiogU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioKLQotCS8vICoqKioqIHBrIGpvaW4gY29sdW1ucwotCi0JcHVibGljIExpc3RJdGVyYWJsZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldFBrSm9pbkNvbHVtbnMoKSB7Ci0JCXJldHVybiB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXIuZ2V0TmVzdGVkQW5ub3RhdGlvbnMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFBrSm9pbkNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5wa0pvaW5Db2x1bW5zQ29udGFpbmVyLmdldE5lc3RlZEFubm90YXRpb25zU2l6ZSgpOwotCX0KLQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXIubmVzdGVkQW5ub3RhdGlvbkF0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZFBrSm9pbkNvbHVtbihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIHRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gYnVpbGRQa0pvaW5Db2x1bW4oaW50IGluZGV4KSB7Ci0JCXJldHVybiBTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uYnVpbGROZXN0ZWRTb3VyY2VQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24oCi0JCQkJdGhpcywgdGhpcy5hbm5vdGF0ZWRFbGVtZW50LCB0aGlzLmJ1aWxkUGtKb2luQ29sdW1uSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW5kZXgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFBrSm9pbkNvbHVtbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IE5lc3RlZEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCXRoaXMuZGFhLCBKUEEuU0VDT05EQVJZX1RBQkxFX19QS19KT0lOX0NPTFVNTlMsIGluZGV4LCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVQa0pvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpIHsKLQkJdGhpcy5wa0pvaW5Db2x1bW5zQ29udGFpbmVyLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUGtKb2luQ29sdW1uKGludCBpbmRleCkgewotCQl0aGlzLnBrSm9pbkNvbHVtbnNDb250YWluZXIucmVtb3ZlTmVzdGVkQW5ub3RhdGlvbihpbmRleCk7Ci0JfQotCQotCS8qKgotCSAqIGFkYXB0IHRoZSBBbm5vdGF0aW9uQ29udGFpbmVyIGludGVyZmFjZSB0byB0aGUgY29sbGVjdGlvbiB0YWJsZSdzIGpvaW4gY29sdW1ucwotCSAqLwotCWNsYXNzIFBrSm9pbkNvbHVtbnNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQlleHRlbmRzIEFubm90YXRpb25Db250YWluZXI8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPgotCXsKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbnNQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gUEtfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCQlyZXR1cm4gSlBBLlNFQ09OREFSWV9UQUJMRV9fUEtfSk9JTl9DT0xVTU5TOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5lc3RlZEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTjsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBidWlsZE5lc3RlZEFubm90YXRpb24oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gU291cmNlU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnRoaXMuYnVpbGRQa0pvaW5Db2x1bW4oaW5kZXgpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCXRoaXMucGtKb2luQ29sdW1uc0NvbnRhaW5lci5pc0VtcHR5KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRTZWNvbmRhcnlUYWJsZUFubm90YXRpb25BZGFwdGVyKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgaWRhYSkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoYW5ub3RhdGVkRWxlbWVudCwgaWRhYSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYnVpbGRTZWNvbmRhcnlUYWJsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoaW50IGluZGV4KSB7Ci0JCUluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIGlkYWEgPSAKLQkJCW5ldyBDb21iaW5hdGlvbkluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKAotCQkJCURFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwKLQkJCQlDT05UQUlORVJfREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLAotCQkJCWluZGV4LAotCQkJCUFOTk9UQVRJT05fTkFNRSk7Ci0JCXJldHVybiBpZGFhOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDI3MzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci0KLS8qKgotICogamF2YXgucGVyc2lzdGVuY2UuU2VxdWVuY2VHZW5lcmF0b3IKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNvdXJjZVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlR2VuZXJhdG9yQW5ub3RhdGlvbgotCWltcGxlbWVudHMgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IE5BTUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SX19OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IElOSVRJQUxfVkFMVUVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUiA9IGJ1aWxkSW50ZWdlckFkYXB0ZXIoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU0VRVUVOQ0VfTkFNRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUUpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gc2VxdWVuY2VOYW1lQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBzZXF1ZW5jZU5hbWU7Ci0KLQotCXByb3RlY3RlZCBTb3VyY2VTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24oSmF2YVJlc291cmNlTm9kZSBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JCXRoaXMuc2VxdWVuY2VOYW1lQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFNFUVVFTkNFX05BTUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMuc2VxdWVuY2VOYW1lID0gdGhpcy5idWlsZFNlcXVlbmNlTmFtZShhc3RSb290KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZVdpdGgoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJc3VwZXIuc3luY2hyb25pemVXaXRoKGFzdFJvb3QpOwotCQl0aGlzLnN5bmNTZXF1ZW5jZU5hbWUodGhpcy5idWlsZFNlcXVlbmNlTmFtZShhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnNlcXVlbmNlTmFtZSA9PSBudWxsKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQWJzdHJhY3RHZW5lcmF0b3JBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gZ2V0TmFtZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBOQU1FX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZ2V0SW5pdGlhbFZhbHVlQWRhcHRlcigpIHsKLQkJcmV0dXJuIElOSVRJQUxfVkFMVUVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBnZXRBbGxvY2F0aW9uU2l6ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBBTExPQ0FUSU9OX1NJWkVfQURBUFRFUjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHNlcXVlbmNlIG5hbWUKLQlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VxdWVuY2VOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlTmFtZShTdHJpbmcgc2VxdWVuY2VOYW1lKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNlcXVlbmNlTmFtZSwgc2VxdWVuY2VOYW1lKSkgewotCQkJdGhpcy5zZXF1ZW5jZU5hbWUgPSBzZXF1ZW5jZU5hbWU7Ci0JCQl0aGlzLnNlcXVlbmNlTmFtZUFkYXB0ZXIuc2V0VmFsdWUoc2VxdWVuY2VOYW1lKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNTZXF1ZW5jZU5hbWUoU3RyaW5nIGFzdFNlcXVlbmNlTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5zZXF1ZW5jZU5hbWU7Ci0JCXRoaXMuc2VxdWVuY2VOYW1lID0gYXN0U2VxdWVuY2VOYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3RTZXF1ZW5jZU5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2VxdWVuY2VOYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNlcXVlbmNlTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTZXF1ZW5jZU5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTRVFVRU5DRV9OQU1FX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNlcXVlbmNlTmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoU0VRVUVOQ0VfTkFNRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gYnVpbGRBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gYnVpbGRBZGFwdGVyKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgZWxlbWVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gYnVpbGRJbnRlZ2VyQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkSW50ZWdlckFkYXB0ZXIoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBlbGVtZW50TmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTIzMDVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci0KLS8qKgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuVGFibGU8L2NvZGU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VUYWJsZUFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VUYWJsZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFRhYmxlQW5ub3RhdGlvbgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIgPSBuZXcgU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihBTk5PVEFUSU9OX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBOQU1FX0FEQVBURVIgPSBDb252ZXJzaW9uRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIuZm9yU3RyaW5ncyhERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIEpQQS5UQUJMRV9fTkFNRSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IFNDSEVNQV9BREFQVEVSID0gQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyLmZvclN0cmluZ3MoREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLCBKUEEuVEFCTEVfX1NDSEVNQSk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IENBVEFMT0dfQURBUFRFUiA9IENvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlci5mb3JTdHJpbmdzKERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiwgSlBBLlRBQkxFX19DQVRBTE9HKTsKLQotCi0JcHVibGljIFNvdXJjZVRhYmxlQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTb3VyY2VCYXNlVGFibGVBbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkTmFtZURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIE5BTUVfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBidWlsZFNjaGVtYURlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIFNDSEVNQV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQ2F0YWxvZ0RlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIENBVEFMT0dfQURBUFRFUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuaXF1ZUNvbnN0cmFpbnRzRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NDZjYTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuU2ltcGxlRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuSW5kZXhlZERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvcgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTb3VyY2VHZW5lcmF0b3JBbm5vdGF0aW9uCi0JaW1wbGVtZW50cyBUYWJsZUdlbmVyYXRvckFubm90YXRpb24KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gTkFNRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5UQUJMRV9HRU5FUkFUT1JfX05BTUUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gSU5JVElBTF9WQUxVRV9BREFQVEVSID0gYnVpbGRJbnRlZ2VyQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IEFMTE9DQVRJT05fU0laRV9BREFQVEVSID0gYnVpbGRJbnRlZ2VyQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBUQUJMRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5UQUJMRV9HRU5FUkFUT1JfX1RBQkxFKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHRhYmxlQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyB0YWJsZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gU0NIRU1BX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fU0NIRU1BKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHNjaGVtYUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgc2NoZW1hOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBDQVRBTE9HX0FEQVBURVIgPSBidWlsZEFkYXB0ZXIoSlBBLlRBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRyk7Ci0JcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBjYXRhbG9nQWRhcHRlcjsKLQlwcml2YXRlIFN0cmluZyBjYXRhbG9nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBQS19DT0xVTU5fTkFNRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHBrQ29sdW1uTmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgcGtDb2x1bW5OYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBWQUxVRV9DT0xVTU5fTkFNRV9BREFQVEVSID0gYnVpbGRBZGFwdGVyKEpQQS5UQUJMRV9HRU5FUkFUT1JfX1ZBTFVFX0NPTFVNTl9OQU1FKTsKLQlwcml2YXRlIGZpbmFsIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IHZhbHVlQ29sdW1uTmFtZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVDb2x1bW5OYW1lOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nPiBQS19DT0xVTU5fVkFMVUVfQURBUFRFUiA9IGJ1aWxkQWRhcHRlcihKUEEuVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUpOwotCXByaXZhdGUgZmluYWwgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZz4gcGtDb2x1bW5WYWx1ZUFkYXB0ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgcGtDb2x1bW5WYWx1ZTsKLQotCXByaXZhdGUgZmluYWwgVW5pcXVlQ29uc3RyYWludHNBbm5vdGF0aW9uQ29udGFpbmVyIHVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyID0gbmV3IFVuaXF1ZUNvbnN0cmFpbnRzQW5ub3RhdGlvbkNvbnRhaW5lcigpOwotCi0KLQlwdWJsaWMgU291cmNlVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKEphdmFSZXNvdXJjZU5vZGUgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCQl0aGlzLnRhYmxlQWRhcHRlciA9IHRoaXMuYnVpbGRBZGFwdGVyKFRBQkxFX0FEQVBURVIpOwotCQl0aGlzLmNhdGFsb2dBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoQ0FUQUxPR19BREFQVEVSKTsKLQkJdGhpcy5zY2hlbWFBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoU0NIRU1BX0FEQVBURVIpOwotCQl0aGlzLnBrQ29sdW1uTmFtZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihQS19DT0xVTU5fTkFNRV9BREFQVEVSKTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWVBZGFwdGVyID0gdGhpcy5idWlsZEFkYXB0ZXIoVkFMVUVfQ09MVU1OX05BTUVfQURBUFRFUik7Ci0JCXRoaXMucGtDb2x1bW5WYWx1ZUFkYXB0ZXIgPSB0aGlzLmJ1aWxkQWRhcHRlcihQS19DT0xVTU5fVkFMVUVfQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoYXN0Um9vdCk7Ci0JCXRoaXMudGFibGUgPSB0aGlzLmJ1aWxkVGFibGUoYXN0Um9vdCk7Ci0JCXRoaXMuc2NoZW1hID0gdGhpcy5idWlsZFNjaGVtYShhc3RSb290KTsKLQkJdGhpcy5jYXRhbG9nID0gdGhpcy5idWlsZENhdGFsb2coYXN0Um9vdCk7Ci0JCXRoaXMucGtDb2x1bW5OYW1lID0gdGhpcy5idWlsZFBrQ29sdW1uTmFtZShhc3RSb290KTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWUgPSB0aGlzLmJ1aWxkVmFsdWVDb2x1bW5OYW1lKGFzdFJvb3QpOwotCQl0aGlzLnBrQ29sdW1uVmFsdWUgPSB0aGlzLmJ1aWxkUGtDb2x1bW5WYWx1ZShhc3RSb290KTsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5pbml0aWFsaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXN1cGVyLnN5bmNocm9uaXplV2l0aChhc3RSb290KTsKLQkJdGhpcy5zeW5jVGFibGUodGhpcy5idWlsZFRhYmxlKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jU2NoZW1hKHRoaXMuYnVpbGRTY2hlbWEoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNDYXRhbG9nKHRoaXMuYnVpbGRDYXRhbG9nKGFzdFJvb3QpKTsKLQkJdGhpcy5zeW5jUGtDb2x1bW5OYW1lKHRoaXMuYnVpbGRQa0NvbHVtbk5hbWUoYXN0Um9vdCkpOwotCQl0aGlzLnN5bmNWYWx1ZUNvbHVtbk5hbWUodGhpcy5idWlsZFZhbHVlQ29sdW1uTmFtZShhc3RSb290KSk7Ci0JCXRoaXMuc3luY1BrQ29sdW1uVmFsdWUodGhpcy5idWlsZFBrQ29sdW1uVmFsdWUoYXN0Um9vdCkpOwotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyLnN5bmNocm9uaXplKHRoaXMuZ2V0QXN0QW5ub3RhdGlvbihhc3RSb290KSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCSh0aGlzLnRhYmxlID09IG51bGwpICYmCi0JCQkJKHRoaXMuc2NoZW1hID09IG51bGwpICYmCi0JCQkJKHRoaXMuY2F0YWxvZyA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnBrQ29sdW1uTmFtZSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnZhbHVlQ29sdW1uTmFtZSA9PSBudWxsKSAmJgotCQkJCSh0aGlzLnBrQ29sdW1uVmFsdWUgPT0gbnVsbCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIEFic3RyYWN0R2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGdldE5hbWVBZGFwdGVyKCkgewotCQlyZXR1cm4gTkFNRV9BREFQVEVSOwotCX0KLQotCUBPdmVycmlkZQotCURlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPEludGVnZXI+IGdldEluaXRpYWxWYWx1ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBJTklUSUFMX1ZBTFVFX0FEQVBURVI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8SW50ZWdlcj4gZ2V0QWxsb2NhdGlvblNpemVBZGFwdGVyKCkgewotCQlyZXR1cm4gQUxMT0NBVElPTl9TSVpFX0FEQVBURVI7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvLyAqKioqKiB0YWJsZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnRhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyB0YWJsZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy50YWJsZSwgdGFibGUpKSB7Ci0JCQl0aGlzLnRhYmxlID0gdGFibGU7Ci0JCQl0aGlzLnRhYmxlQWRhcHRlci5zZXRWYWx1ZSh0YWJsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1RhYmxlKFN0cmluZyBhc3RUYWJsZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy50YWJsZTsKLQkJdGhpcy50YWJsZSA9IGFzdFRhYmxlOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoVEFCTEVfUFJPUEVSVFksIG9sZCwgYXN0VGFibGUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVGFibGUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMudGFibGVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShUQUJMRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudFRvdWNoZXMoVEFCTEVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBzY2hlbWEKLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgc2NoZW1hKSB7Ci0JCWlmICh0aGlzLmF0dHJpYnV0ZVZhbHVlSGFzQ2hhbmdlZCh0aGlzLnNjaGVtYSwgc2NoZW1hKSkgewotCQkJdGhpcy5zY2hlbWEgPSBzY2hlbWE7Ci0JCQl0aGlzLnNjaGVtYUFkYXB0ZXIuc2V0VmFsdWUoc2NoZW1hKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jU2NoZW1hKFN0cmluZyBhc3RTY2hlbWEpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuc2NoZW1hOwotCQl0aGlzLnNjaGVtYSA9IGFzdFNjaGVtYTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFNDSEVNQV9QUk9QRVJUWSwgb2xkLCBhc3RTY2hlbWEpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkU2NoZW1hKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnNjaGVtYUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShTQ0hFTUFfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhTQ0hFTUFfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBjYXRhbG9nCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMuY2F0YWxvZywgY2F0YWxvZykpIHsKLQkJCXRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0JCQl0aGlzLmNhdGFsb2dBZGFwdGVyLnNldFZhbHVlKGNhdGFsb2cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDYXRhbG9nKFN0cmluZyBhc3RDYXRhbG9nKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLmNhdGFsb2c7Ci0JCXRoaXMuY2F0YWxvZyA9IGFzdENhdGFsb2c7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChDQVRBTE9HX1BST1BFUlRZLCBvbGQsIGFzdENhdGFsb2cpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ2F0YWxvZyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5jYXRhbG9nQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldENhdGFsb2dUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShDQVRBTE9HX0FEQVBURVIsIGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKENBVEFMT0dfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiBwayBjb2x1bW4gbmFtZQotCXB1YmxpYyBTdHJpbmcgZ2V0UGtDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5wa0NvbHVtbk5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGtDb2x1bW5OYW1lKFN0cmluZyBwa0NvbHVtbk5hbWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucGtDb2x1bW5OYW1lLCBwa0NvbHVtbk5hbWUpKSB7Ci0JCQl0aGlzLnBrQ29sdW1uTmFtZSA9IHBrQ29sdW1uTmFtZTsKLQkJCXRoaXMucGtDb2x1bW5OYW1lQWRhcHRlci5zZXRWYWx1ZShwa0NvbHVtbk5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQa0NvbHVtbk5hbWUoU3RyaW5nIGFzdFBrQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkID0gdGhpcy5wa0NvbHVtbk5hbWU7Ci0JCXRoaXMucGtDb2x1bW5OYW1lID0gYXN0UGtDb2x1bW5OYW1lOwotCQl0aGlzLmZpcmVQcm9wZXJ0eUNoYW5nZWQoUEtfQ09MVU1OX05BTUVfUFJPUEVSVFksIG9sZCwgYXN0UGtDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZFBrQ29sdW1uTmFtZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5wa0NvbHVtbk5hbWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UGtDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmdldEVsZW1lbnRUZXh0UmFuZ2UoUEtfQ09MVU1OX05BTUVfQURBUFRFUiwgYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGtDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhQS19DT0xVTU5fTkFNRV9BREFQVEVSLCBwb3MsIGFzdFJvb3QpOwotCX0KLQotCS8vICoqKioqIHZhbHVlIGNvbHVtbiBuYW1lCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSkgewotCQlpZiAodGhpcy5hdHRyaWJ1dGVWYWx1ZUhhc0NoYW5nZWQodGhpcy52YWx1ZUNvbHVtbk5hbWUsIHZhbHVlQ29sdW1uTmFtZSkpIHsKLQkJCXRoaXMudmFsdWVDb2x1bW5OYW1lID0gdmFsdWVDb2x1bW5OYW1lOwotCQkJdGhpcy52YWx1ZUNvbHVtbk5hbWVBZGFwdGVyLnNldFZhbHVlKHZhbHVlQ29sdW1uTmFtZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1ZhbHVlQ29sdW1uTmFtZShTdHJpbmcgYXN0VmFsdWVDb2x1bW5OYW1lKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnZhbHVlQ29sdW1uTmFtZTsKLQkJdGhpcy52YWx1ZUNvbHVtbk5hbWUgPSBhc3RWYWx1ZUNvbHVtbk5hbWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkLCBhc3RWYWx1ZUNvbHVtbk5hbWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkVmFsdWVDb2x1bW5OYW1lKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnZhbHVlQ29sdW1uTmFtZUFkYXB0ZXIuZ2V0VmFsdWUoYXN0Um9vdCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRWYWx1ZUNvbHVtbk5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RWxlbWVudFRleHRSYW5nZShWQUxVRV9DT0xVTU5fTkFNRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB2YWx1ZUNvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKFZBTFVFX0NPTFVNTl9OQU1FX0FEQVBURVIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JLy8gKioqKiogcGsgY29sdW1uIHZhbHVlCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5wa0NvbHVtblZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFBrQ29sdW1uVmFsdWUoU3RyaW5nIHBrQ29sdW1uVmFsdWUpIHsKLQkJaWYgKHRoaXMuYXR0cmlidXRlVmFsdWVIYXNDaGFuZ2VkKHRoaXMucGtDb2x1bW5WYWx1ZSwgcGtDb2x1bW5WYWx1ZSkpIHsKLQkJCXRoaXMucGtDb2x1bW5WYWx1ZSA9IHBrQ29sdW1uVmFsdWU7Ci0JCQl0aGlzLnBrQ29sdW1uVmFsdWVBZGFwdGVyLnNldFZhbHVlKHBrQ29sdW1uVmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNQa0NvbHVtblZhbHVlKFN0cmluZyBhc3RQa0NvbHVtblZhbHVlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMucGtDb2x1bW5WYWx1ZSA9IGFzdFBrQ29sdW1uVmFsdWU7Ci0JCXRoaXMuZmlyZVByb3BlcnR5Q2hhbmdlZChQS19DT0xVTU5fVkFMVUVfUFJPUEVSVFksIG9sZCwgYXN0UGtDb2x1bW5WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRQa0NvbHVtblZhbHVlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLnBrQ29sdW1uVmFsdWVBZGFwdGVyLmdldFZhbHVlKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0UGtDb2x1bW5WYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5nZXRFbGVtZW50VGV4dFJhbmdlKFBLX0NPTFVNTl9WQUxVRV9BREFQVEVSLCBhc3RSb290KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwa0NvbHVtblZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlyZXR1cm4gdGhpcy5lbGVtZW50VG91Y2hlcyhQS19DT0xVTU5fVkFMVUVfQURBUFRFUiwgcG9zLCBhc3RSb290KTsKLQl9Ci0KLQkvLyAqKioqKiB1bmlxdWUgY29uc3RyYWludHMKLQotCXB1YmxpYyBMaXN0SXRlcmFibGU8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9ucygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5nZXROZXN0ZWRBbm5vdGF0aW9uc1NpemUoKTsKLQl9Ci0KLQlwdWJsaWMgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gdW5pcXVlQ29uc3RyYWludEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5uZXN0ZWRBbm5vdGF0aW9uQXQoaW5kZXgpOwotCX0KLQotCXB1YmxpYyBVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiBhZGRVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCkgewotCQlyZXR1cm4gdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5hZGROZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGJ1aWxkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbigKLQkJCQl0aGlzLCB0aGlzLmFubm90YXRlZEVsZW1lbnQsIGJ1aWxkVW5pcXVlQ29uc3RyYWludEluZGV4ZWREZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKGluZGV4KSk7Ci0JfQotCi0JcHJpdmF0ZSBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBidWlsZFVuaXF1ZUNvbnN0cmFpbnRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcihpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcigKLQkJCQl0aGlzLmRhYSwgSlBBLlRBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTLCBpbmRleCwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCkgewotCQl0aGlzLnVuaXF1ZUNvbnN0cmFpbnRzQ29udGFpbmVyLm1vdmVOZXN0ZWRBbm5vdGF0aW9uKHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpIHsKLQkJdGhpcy51bmlxdWVDb25zdHJhaW50c0NvbnRhaW5lci5yZW1vdmVOZXN0ZWRBbm5vdGF0aW9uKGluZGV4KTsKLQl9Ci0JCi0KLQkvKioKLQkgKiBhZGFwdCB0aGUgQW5ub3RhdGlvbkNvbnRhaW5lciBpbnRlcmZhY2UgdG8gdGhlIHRhYmxlJ3MgdW5pcXVlIGNvbnN0cmFpbnRzCi0JICovCi0JY2xhc3MgVW5pcXVlQ29uc3RyYWludHNBbm5vdGF0aW9uQ29udGFpbmVyIAotCQlleHRlbmRzIEFubm90YXRpb25Db250YWluZXI8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+Ci0JewotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uc1Byb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBVTklRVUVfQ09OU1RSQUlOVFNfTElTVDsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBKUEEuVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmVzdGVkQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCQlyZXR1cm4gVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYnVpbGROZXN0ZWRBbm5vdGF0aW9uKGludCBpbmRleCkgewotCQkJcmV0dXJuIFNvdXJjZVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi50aGlzLmJ1aWxkVW5pcXVlQ29uc3RyYWludChpbmRleCk7Ci0JCX0KLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmc+IGJ1aWxkQWRhcHRlcihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJcmV0dXJuIGJ1aWxkQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxJbnRlZ2VyPiBidWlsZEludGVnZXJBZGFwdGVyKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gYnVpbGRJbnRlZ2VyQWRhcHRlcihERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIsIGVsZW1lbnROYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRlbXBvcmFsQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZjQxMTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5TaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VUZW1wb3JhbEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUJhc2VUZW1wb3JhbEFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VUZW1wb3JhbEFubm90YXRpb24oSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnQsIGVsZW1lbnQsIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlRWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBKUEEuVEVNUE9SQUxfX1ZBTFVFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRyYW5zaWVudEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVRyYW5zaWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0YjliMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VUcmFuc2llbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotCi0vKioKLSAqIGphdmF4LnBlcnNpc3RlbmNlLlRyYW5zaWVudAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlVHJhbnNpZW50QW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgVHJhbnNpZW50QW5ub3RhdGlvbgotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSID0gbmV3IFNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIoQU5OT1RBVElPTl9OQU1FKTsKLQkKLQotCXB1YmxpYyBTb3VyY2VUcmFuc2llbnRBbm5vdGF0aW9uKEphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQgcGFyZW50LCBBbm5vdGF0ZWRFbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIocGFyZW50LCBlbGVtZW50LCBERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBBTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQkvLyBub3RoaW5nIHRvIGluaXRpYWxpemUKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gdXBkYXRlCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9zb3VyY2UvU291cmNlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2MTM5My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkFubm90YXRpb25TdHJpbmdBcnJheUV4cHJlc3Npb25Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LkNvbnZlcnNpb25EZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuRWxlbWVudEluZGV4ZWRBbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5FeHByZXNzaW9uQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5JbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGl2ZUNsb25lTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5VbmlxdWVDb25zdHJhaW50PC9jb2RlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU291cmNlVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24KLQlleHRlbmRzIFNvdXJjZUFubm90YXRpb24KLQlpbXBsZW1lbnRzIFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uCi17Ci0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gY29sdW1uTmFtZXNEZWNsYXJhdGlvbkFkYXB0ZXI7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGNvbHVtbk5hbWVzQWRhcHRlcjsKLQlwcml2YXRlIGZpbmFsIFZlY3RvcjxTdHJpbmc+IGNvbHVtbk5hbWVzID0gbmV3IFZlY3RvcjxTdHJpbmc+KCk7Ci0KLQotCXB1YmxpYyBTb3VyY2VVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbihKYXZhUmVzb3VyY2VOb2RlIHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50LCBJbmRleGVkRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBpZGFhKSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgaWRhYSwgbmV3IEVsZW1lbnRJbmRleGVkQW5ub3RhdGlvbkFkYXB0ZXIoZWxlbWVudCwgaWRhYSkpOwotCQl0aGlzLmNvbHVtbk5hbWVzRGVjbGFyYXRpb25BZGFwdGVyID0gYnVpbGRDb2x1bW5OYW1lc0RlY2xhcmF0aW9uQWRhcHRlcigpOwotCQl0aGlzLmNvbHVtbk5hbWVzQWRhcHRlciA9IGJ1aWxkQ29sdW1uTmFtZXNBZGFwdGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIEFOTk9UQVRJT05fTkFNRTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUNvbHVtbk5hbWVzKGFzdFJvb3QpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplV2l0aChDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQl0aGlzLnN5bmNDb2x1bW5OYW1lcyhhc3RSb290KTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLy8gKioqKiogY29sdW1uIG5hbWVzCi0JcHVibGljIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldENvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbmV3IExpdmVDbG9uZUxpc3RJdGVyYWJsZTxTdHJpbmc+KHRoaXMuY29sdW1uTmFtZXMpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29sdW1uTmFtZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5jb2x1bW5OYW1lcy5zaXplKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjb2x1bW5OYW1lQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiB0aGlzLmNvbHVtbk5hbWVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmFkZENvbHVtbk5hbWUodGhpcy5jb2x1bW5OYW1lcy5zaXplKCksIGNvbHVtbk5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbHVtbk5hbWUoaW50IGluZGV4LCBTdHJpbmcgY29sdW1uTmFtZSkgewotCQl0aGlzLmNvbHVtbk5hbWVzLmFkZChpbmRleCwgY29sdW1uTmFtZSk7Ci0JCXRoaXMud3JpdGVDb2x1bW5OYW1lcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5tb3ZlKHRoaXMuY29sdW1uTmFtZXMsIHRhcmdldEluZGV4LCBzb3VyY2VJbmRleCk7Ci0JCXRoaXMud3JpdGVDb2x1bW5OYW1lcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoU3RyaW5nIGNvbHVtbk5hbWUpIHsKLQkJdGhpcy5jb2x1bW5OYW1lcy5yZW1vdmUoY29sdW1uTmFtZSk7Ci0JCXRoaXMud3JpdGVDb2x1bW5OYW1lcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUNvbHVtbk5hbWUoaW50IGluZGV4KSB7Ci0JCXRoaXMuY29sdW1uTmFtZXMucmVtb3ZlKGluZGV4KTsKLQkJdGhpcy53cml0ZUNvbHVtbk5hbWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHdyaXRlQ29sdW1uTmFtZXMoKSB7Ci0JCXRoaXMuY29sdW1uTmFtZXNBZGFwdGVyLnNldFZhbHVlKHRoaXMuY29sdW1uTmFtZXMudG9BcnJheShuZXcgU3RyaW5nW3RoaXMuY29sdW1uTmFtZXMuc2l6ZSgpXSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplQ29sdW1uTmFtZXMoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJU3RyaW5nW10gYXN0Q29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhc3RDb2x1bW5OYW1lcy5sZW5ndGg7IGkrKykgewotCQkJdGhpcy5jb2x1bW5OYW1lcy5hZGQoYXN0Q29sdW1uTmFtZXNbaV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNDb2x1bW5OYW1lcyhDb21waWxhdGlvblVuaXQgYXN0Um9vdCkgewotCQlTdHJpbmdbXSBqYXZhQ29sdW1uTmFtZXMgPSB0aGlzLmNvbHVtbk5hbWVzQWRhcHRlci5nZXRWYWx1ZShhc3RSb290KTsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QoQXJyYXlzLmFzTGlzdChqYXZhQ29sdW1uTmFtZXMpLCB0aGlzLmNvbHVtbk5hbWVzLCBDT0xVTU5fTkFNRVNfTElTVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29sdW1uTmFtZXNUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCXJldHVybiB0aGlzLmVsZW1lbnRUb3VjaGVzKHRoaXMuY29sdW1uTmFtZXNEZWNsYXJhdGlvbkFkYXB0ZXIsIHBvcywgYXN0Um9vdCk7Ci0JfQotCi0JcHJpdmF0ZSBEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDb2x1bW5OYW1lc0RlY2xhcmF0aW9uQWRhcHRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIodGhpcy5kYWEsIEpQQS5VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTKTsKLQl9Ci0KLQlwcml2YXRlIEFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gYnVpbGRDb2x1bW5OYW1lc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKHRoaXMuY29sdW1uTmFtZXNEZWNsYXJhdGlvbkFkYXB0ZXIpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFubm90YXRpb25FbGVtZW50QWRhcHRlcihEZWNsYXJhdGlvbkFubm90YXRpb25FbGVtZW50QWRhcHRlcjxTdHJpbmdbXT4gZGFlYSkgewotCQlyZXR1cm4gbmV3IEFubm90YXRlZEVsZW1lbnRBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+KHRoaXMuYW5ub3RhdGVkRWxlbWVudCwgZGFlYSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRGVjbGFyYXRpb25Bbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXI8U3RyaW5nW10+IGJ1aWxkQXJyYXlBbm5vdGF0aW9uRWxlbWVudEFkYXB0ZXIoRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlciBhbm5vdGF0aW9uQWRhcHRlciwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXJldHVybiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKGFubm90YXRpb25BZGFwdGVyLCBlbGVtZW50TmFtZSwgQW5ub3RhdGlvblN0cmluZ0FycmF5RXhwcmVzc2lvbkNvbnZlcnRlci5mb3JTdHJpbmdzKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIERlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPiBidWlsZEFycmF5QW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyKERlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXIgYW5ub3RhdGlvbkFkYXB0ZXIsIFN0cmluZyBlbGVtZW50TmFtZSwgRXhwcmVzc2lvbkNvbnZlcnRlcjxTdHJpbmdbXT4gY29udmVydGVyKSB7Ci0JCXJldHVybiBuZXcgQ29udmVyc2lvbkRlY2xhcmF0aW9uQW5ub3RhdGlvbkVsZW1lbnRBZGFwdGVyPFN0cmluZ1tdPihhbm5vdGF0aW9uQWRhcHRlciwgZWxlbWVudE5hbWUsIGNvbnZlcnRlcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNVbnNldCgpIHsKLQkJcmV0dXJuIHN1cGVyLmlzVW5zZXQoKSAmJgotCQkJCXRoaXMuY29sdW1uTmFtZXMuaXNFbXB0eSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHRvU3RyaW5nKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJc2IuYXBwZW5kKHRoaXMuY29sdW1uTmFtZXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVZlcnNpb25Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL3NvdXJjZS9Tb3VyY2VWZXJzaW9uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWE1MzhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL2phdmEvc291cmNlL1NvdXJjZVZlcnNpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuamR0LlNpbXBsZURlY2xhcmF0aW9uQW5ub3RhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5qZHQuRGVjbGFyYXRpb25Bbm5vdGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5WZXJzaW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBTb3VyY2VWZXJzaW9uQW5ub3RhdGlvbgotCWV4dGVuZHMgU291cmNlQW5ub3RhdGlvbgotCWltcGxlbWVudHMgVmVyc2lvbkFubm90YXRpb24KLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyIERFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUiA9IG5ldyBTaW1wbGVEZWNsYXJhdGlvbkFubm90YXRpb25BZGFwdGVyKEFOTk9UQVRJT05fTkFNRSk7Ci0KLQotCXB1YmxpYyBTb3VyY2VWZXJzaW9uQW5ub3RhdGlvbihKYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50IHBhcmVudCwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgZWxlbWVudCwgREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpIHsKLQkJLy8gbm90aGluZyB0byBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIHZvaWQgc3luY2hyb25pemVXaXRoKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KSB7Ci0JCS8vIG5vdGhpbmcgdG8gdXBkYXRlCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL09ybVhtbFJlc291cmNlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL29ybS9Pcm1YbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NTRiYTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2Uvb3JtL09ybVhtbFJlc291cmNlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBPcm1YbWxSZXNvdXJjZVByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXIKLQlpbXBsZW1lbnRzIE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQkvKioKLQkgKiAoQ29udmVuaWVuY2UgbWV0aG9kKSBSZXR1cm5zIGFuIE9STSByZXNvdXJjZSBtb2RlbCBwcm92aWRlciBmb3IgCi0JICogdGhlIGdpdmVuIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2VQcm92aWRlcl8oZmlsZS5nZXRQcm9qZWN0KCksIGZpbGUuZ2V0RnVsbFBhdGgoKSk7Ci0JfQotCQotCS8qKgotCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvcgotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgcnVudGltZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QsIElQYXRoIHJ1bnRpbWVQYXRoKSB7Ci0JCXJldHVybiBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyXyhwcm9qZWN0LCBydW50aW1lUGF0aCk7Ci0JfQotCQotCS8qKgotCSAqIChDb252ZW5pZW5jZSBtZXRob2QpIFJldHVybnMgYW4gT1JNIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvciAKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBpbiB0aGUgZGVmYXVsdCBydW50aW1lIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1YbWxSZXNvdXJjZVByb3ZpZGVyIGdldERlZmF1bHRYbWxSZXNvdXJjZVByb3ZpZGVyKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXIocHJvamVjdCwgSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgT3JtWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyXyhJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBmdWxsUGF0aCkgewotCQlyZXR1cm4gbmV3IE9ybVhtbFJlc291cmNlUHJvdmlkZXIocHJvamVjdCwgZnVsbFBhdGgpOwotCX0KLQkKLQkKLQlwdWJsaWMgT3JtWG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRoaXMocHJvamVjdCwgSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQl9Ci0JCi0JcHVibGljIE9ybVhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZmlsZVBhdGgpIHsKLQkJc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVJvb3QoT2JqZWN0IGNvbmZpZykgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IChJRGF0YU1vZGVsKSBjb25maWc7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJZW50aXR5TWFwcGluZ3Muc2V0VmVyc2lvbihkYXRhTW9kZWwuZ2V0U3RyaW5nUHJvcGVydHkoVkVSU0lPTikpOwotCQlnZXRSZXNvdXJjZUNvbnRlbnRzKCkuYWRkKGVudGl0eU1hcHBpbmdzKTsKLQkJCi0JCVN0cmluZyBkZWZhdWx0QWNjZXNzID0gKFN0cmluZykgZGF0YU1vZGVsLmdldFByb3BlcnR5KERFRkFVTFRfQUNDRVNTKTsgCi0JCWlmIChkZWZhdWx0QWNjZXNzICE9IG51bGwpIHsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHB1TWV0YWRhdGEgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQkJZW50aXR5TWFwcGluZ3Muc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocHVNZXRhZGF0YSk7Ci0JCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwdURlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCXB1TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocHVEZWZhdWx0cyk7Ci0JCQlwdURlZmF1bHRzLnNldEFjY2VzcyhkZWZhdWx0QWNjZXNzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YWQ3YTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5BYnN0cmFjdFhtbFJlc291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlcgotCWltcGxlbWVudHMgUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzCi17Ci0JLyoqCi0JICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhIHBlcnNpc3RlbmNlIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvciAKLQkgKiB0aGUgZ2l2ZW4gZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKGZpbGUuZ2V0UHJvamVjdCgpLCBmaWxlLmdldEZ1bGxQYXRoKCkpOwotCX0KLQkKLQkvKioKLQkgKiAoQ29udmVuaWVuY2UgbWV0aG9kKSBSZXR1cm5zIGFuIHBlcnNpc3RlbmNlIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvcgotCSAqIHRoZSBnaXZlbiBwcm9qZWN0IGluIHRoZSBzcGVjaWZpZWQgcnVudGltZSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVByb3ZpZGVyIGdldFhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggcnVudGltZVBhdGgpIHsKLQkJcmV0dXJuIGdldFhtbFJlc291cmNlUHJvdmlkZXJfKHByb2plY3QsIHJ1bnRpbWVQYXRoKTsKLQl9Ci0JCi0JLyoqCi0JICogKENvbnZlbmllbmNlIG1ldGhvZCkgUmV0dXJucyBhIHBlcnNpc3RlbmNlIHJlc291cmNlIG1vZGVsIHByb3ZpZGVyIGZvciAKLQkgKiB0aGUgZ2l2ZW4gcHJvamVjdCBpbiB0aGUgZGVmYXVsdCBydW50aW1lIGxvY2F0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0RGVmYXVsdFhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0WG1sUmVzb3VyY2VQcm92aWRlcihwcm9qZWN0LCBKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfUEVSU0lTVEVOQ0VfWE1MX1JVTlRJTUVfUEFUSCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VQcm92aWRlciBnZXRYbWxSZXNvdXJjZVByb3ZpZGVyXyhJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCBmdWxsUGF0aCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VQcm92aWRlcihwcm9qZWN0LCBmdWxsUGF0aCk7Ci0JfQotCQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCkgewotCQl0aGlzKHByb2plY3QsIEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9QRVJTSVNURU5DRV9YTUxfUlVOVElNRV9QQVRIKTsKLQl9Ci0JCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlUHJvdmlkZXIoSVByb2plY3QgcHJvamVjdCwgSVBhdGggZmlsZVBhdGgpIHsKLQkJc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MX0NPTlRFTlRfVFlQRSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUm9vdChPYmplY3QgY29uZmlnKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gKElEYXRhTW9kZWwpIGNvbmZpZzsKLQkJWG1sUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlKCk7Ci0JCXBlcnNpc3RlbmNlLnNldFZlcnNpb24oZGF0YU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KFZFUlNJT04pKTsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKGdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQlwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCWdldFJlc291cmNlQ29udGVudHMoKS5hZGQocGVyc2lzdGVuY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL3htbC9KcGFYbWxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9yZXNvdXJjZS94bWwvSnBhWG1sUmVzb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWQwMWFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL3htbC9KcGFYbWxSZXNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotCi1wdWJsaWMgY2xhc3MgSnBhWG1sUmVzb3VyY2VBZGFwdGVyRmFjdG9yeQotCWltcGxlbWVudHMgSUFkYXB0ZXJGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBBREFQVEVSX0xJU1QgPSBuZXcgQ2xhc3NbXSB7IEpwYVhtbFJlc291cmNlLmNsYXNzIH07Ci0JCi0JcHVibGljIENsYXNzPD8+W10gZ2V0QWRhcHRlckxpc3QoKSB7Ci0JCXJldHVybiBBREFQVEVSX0xJU1Q7Ci0JfQotCQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJRmlsZSkgYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoZmluYWwgSUZpbGUgZmlsZSwgQ2xhc3MgPD8+YWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEpwYVhtbFJlc291cmNlLmNsYXNzKSB7Ci0JCQlKcGFGaWxlIGpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCQlpZiAoanBhRmlsZSAhPSBudWxsKSB7Ci0JCQkJSnB0UmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsID0ganBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCQkJaWYgKHJlc291cmNlTW9kZWwgaW5zdGFuY2VvZiBKcGFYbWxSZXNvdXJjZSkgewotCQkJCQlyZXR1cm4gcmVzb3VyY2VNb2RlbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UveG1sL0pwYVhtbFJlc291cmNlUHJvcGVydHlUZXN0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3Jlc291cmNlL3htbC9KcGFYbWxSZXNvdXJjZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmYyMjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvcmVzb3VyY2UveG1sL0pwYVhtbFJlc291cmNlUHJvcGVydHlUZXN0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLQotLy8gVE9ETyBtb3ZlIHRvIG8uZS5qcHQuY29yZS5pbnRlcm5hbCguY29udGV4dCk/Ci0vLyByZW5hbWUgdG8gSnBhWG1sUHJvcGVydHlUZXN0ZXIKLXB1YmxpYyBjbGFzcyBKcGFYbWxSZXNvdXJjZVByb3BlcnR5VGVzdGVyCi0JZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcgotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElTX0xBVEVTVF9TVVBQT1JURURfVkVSU0lPTiA9ICJpc0xhdGVzdFN1cHBvcnRlZFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgcmVjZWl2ZXIsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0W10gYXJncywgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSBudWxsOwotCQlpZiAocmVjZWl2ZXIgaW5zdGFuY2VvZiBKcGFYbWxSZXNvdXJjZSkgewotCQkJeG1sUmVzb3VyY2UgPSAoSnBhWG1sUmVzb3VyY2UpIHJlY2VpdmVyOwotCQl9Ci0JCWVsc2UgaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgWG1sRmlsZSkgewotCQkJeG1sUmVzb3VyY2UgPSAoKFhtbEZpbGUpIHJlY2VpdmVyKS5nZXRYbWxSZXNvdXJjZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlpZiAoSVNfTEFURVNUX1NVUFBPUlRFRF9WRVJTSU9OLmVxdWFscyhwcm9wZXJ0eSkpIHsKLQkJCWJvb2xlYW4gZXhwZWN0ZWQgPSAoKEJvb2xlYW4pIGV4cGVjdGVkVmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHhtbFJlc291cmNlLmdldFByb2plY3QoKSk7Ci0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSB4bWxSZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpOwotCQkJYm9vbGVhbiBhY3R1YWwgPSAKLQkJCQkJeG1sUmVzb3VyY2UuZ2V0VmVyc2lvbigpICE9IG51bGwKLQkJCQkJCSYmIHhtbFJlc291cmNlLmdldFZlcnNpb24oKS5lcXVhbHMoCi0JCQkJCQkJanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoY29udGVudFR5cGUpLmdldFZlcnNpb24oKSk7Ci0JCQkKLQkJCXJldHVybiBhY3R1YWwgPT0gZXhwZWN0ZWQ7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC9zeW5jaC9TeW5jaHJvbml6ZUNsYXNzZXNKb2IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3N5bmNoL1N5bmNocm9uaXplQ2xhc3Nlc0pvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMzNjkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3N5bmNoL1N5bmNocm9uaXplQ2xhc3Nlc0pvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5zeW5jaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVJ1bGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcHRDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci0KLS8qKgotICogU3luY2hyb25pemVzIHRoZSBsaXN0cyBvZiBwZXJzaXN0ZW50IGNsYXNzZXMgaW4gYSBwZXJzaXN0ZW5jZSB1bml0IGFuZCBhIAotICogcGVyc2lzdGVuY2UgcHJvamVjdC4KLSAqLwotcHVibGljIGNsYXNzIFN5bmNocm9uaXplQ2xhc3Nlc0pvYiBleHRlbmRzIFdvcmtzcGFjZUpvYgotewotCXByaXZhdGUgSUZpbGUgcGVyc2lzdGVuY2VYbWxGaWxlOwotCQotCQotCXB1YmxpYyBTeW5jaHJvbml6ZUNsYXNzZXNKb2IoSUZpbGUgZmlsZSkgewotCQlzdXBlcihKcHRDb3JlTWVzc2FnZXMuU1lOQ0hST05JWkVfQ0xBU1NFU19KT0IpOwotCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQlzZXRSdWxlKHJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUoZmlsZS5nZXRQcm9qZWN0KCkpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbEZpbGUgPSBmaWxlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJZmluYWwgU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBKcHRDb3JlTWVzc2FnZXMuU1lOQ0hST05JWklOR19DTEFTU0VTX1RBU0ssIDIwKTsKLQkJZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMucGVyc2lzdGVuY2VYbWxGaWxlLmdldFByb2plY3QoKSk7Ci0JCWZpbmFsIEpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkvL3RoZSByZXNvdXJjZSB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGhhZCBhbiBpbnZhbGlkIGNvbnRlbnQgdHlwZQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9Ci0JCXNtLndvcmtlZCgxKTsKLQkJCi0JCXJlc291cmNlLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJWG1sUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSAoWG1sUGVyc2lzdGVuY2UpIHJlc291cmNlLmdldFJvb3RPYmplY3QoKTsJCQkJCQotCQkJCVhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0JCQkJCi0JCQkJaWYgKHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkgPiAwKSB7Ci0JCQkJCXBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwZXJzaXN0ZW5jZVVuaXQgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShqcGFQcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQkJCXBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQocGVyc2lzdGVuY2VVbml0KTsKLQkJCQl9Ci0JCQkJc20ud29ya2VkKDEpOwotCQkJCQotCQkJCXBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlzbS53b3JrZWQoMSk7Ci0JCQotCQkJCWFkZENsYXNzUmVmcyhzbS5uZXdDaGlsZCgxNyksIGpwYVByb2plY3QsIHBlcnNpc3RlbmNlVW5pdCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ2xhc3NSZWZzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBYbWxQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gbWFwcGVkQ2xhc3NOYW1lcyA9IGdldE1hcHBlZENsYXNzTmFtZXMoanBhUHJvamVjdCwgJyQnKTsKLQkJZmluYWwgU3ViTW9uaXRvciBzbSA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShtYXBwZWRDbGFzc05hbWVzKSk7Ci0JCQotCQlmb3IgKFN0cmluZyBmdWxseVF1YWxpZmllZFR5cGVOYW1lIDogbWFwcGVkQ2xhc3NOYW1lcykgewotCQkJaWYgKCAhIG1hcHBpbmdGaWxlQ29udGFpbnMoanBhUHJvamVjdCwgZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKLQkJCQlYbWxKYXZhQ2xhc3NSZWYgY2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQkJCWNsYXNzUmVmLnNldEphdmFDbGFzcyhmdWxseVF1YWxpZmllZFR5cGVOYW1lKTsKLQkJCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7Ci0JCQl9Ci0JCQlzbS53b3JrZWQoMSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRNYXBwZWRDbGFzc05hbWVzKGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCwgZmluYWwgY2hhciBlbmNsb3NpbmdUeXBlU2VwYXJhdG9yKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxTdHJpbmcsIFN0cmluZz4oanBhUHJvamVjdC5nZXRNYXBwZWRKYXZhU291cmNlQ2xhc3NOYW1lcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKFN0cmluZyBmdWxseVF1YWxpZmllZE5hbWUpIHsKLQkJCQlJVHlwZSBqZHRUeXBlID0gU3luY2hyb25pemVDbGFzc2VzSm9iLnRoaXMuZmluZFR5cGUoanBhUHJvamVjdCwgZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJCQlyZXR1cm4gamR0VHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoZW5jbG9zaW5nVHlwZVNlcGFyYXRvcik7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBJVHlwZSBmaW5kVHlwZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyB0eXBlTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGpwYVByb2plY3QuZ2V0SmF2YVByb2plY3QoKS5maW5kVHlwZSh0eXBlTmFtZSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuIG51bGw7ICAvLyBpZ25vcmUgZXhjZXB0aW9uPwotCQl9Ci0JfQotCi0JYm9vbGVhbiBtYXBwaW5nRmlsZUNvbnRhaW5zKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCWlmIChwZXJzaXN0ZW5jZVhtbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQlpZiAocGVyc2lzdGVuY2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogcGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQlpZiAobWFwcGluZ0ZpbGVSZWYuZ2V0UGVyc2lzdGVudFR5cGUoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkgIT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFjYjk2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlZmF1bHRKcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIERFRkFVTFRfUEFSTVMgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgc3RhdGljIFRleHRSYW5nZSBERUZBVUxUX1RFWFRfUkFOR0UgPSBUZXh0UmFuZ2UuRW1wdHkuaW5zdGFuY2UoKTsKLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgREVGQVVMVF9QQVJNUywgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJTWVzc2FnZSBidWlsZE1lc3NhZ2UoCi0JCQlpbnQgZGVmYXVsdFNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmdbXSBwYXJtcywgT2JqZWN0IHRhcmdldE9iamVjdCkgewotCQlyZXR1cm4gYnVpbGRNZXNzYWdlKGRlZmF1bHRTZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0LCBERUZBVUxUX1RFWFRfUkFOR0UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIE9iamVjdCB0YXJnZXRPYmplY3QsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJcmV0dXJuIGJ1aWxkTWVzc2FnZShkZWZhdWx0U2V2ZXJpdHksIG1lc3NhZ2VJZCwgREVGQVVMVF9QQVJNUywgdGFyZ2V0T2JqZWN0LCB0ZXh0UmFuZ2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElNZXNzYWdlIGJ1aWxkTWVzc2FnZSgKLQkJCWludCBkZWZhdWx0U2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZ1tdIHBhcm1zLCBPYmplY3QgdGFyZ2V0T2JqZWN0LCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCQotCQkvL2RldGVybWluZSB3aGV0aGVyIGRlZmF1bHQgc2V2ZXJpdHkgc2hvdWxkIGJlIG92ZXJyaWRkZW4KLQkJaW50IHNldmVyaXR5ID0gZGVmYXVsdFNldmVyaXR5OwotCQlpbnQgc2V2ZXJpdHlQcmVmZXJlbmNlID0gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLmdldFByb2JsZW1TZXZlcml0eVByZWZlcmVuY2UodGFyZ2V0T2JqZWN0LCBtZXNzYWdlSWQpOwotCQlpZiAoc2V2ZXJpdHlQcmVmZXJlbmNlIT1KcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuTk9fU0VWRVJJVFlfUFJFRkVSRU5DRSl7Ci0JCQlzZXZlcml0eSA9IHNldmVyaXR5UHJlZmVyZW5jZTsKLQkJfQotCQlJTWVzc2FnZSBtZXNzYWdlID0gbmV3IE1lc3NhZ2UoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkJVTkRMRV9OQU1FLCBzZXZlcml0eSwgbWVzc2FnZUlkLCBwYXJtcywgdGFyZ2V0T2JqZWN0KTsKLQkJbWVzc2FnZS5zZXRNYXJrZXJJZChKcHRKcGFDb3JlUGx1Z2luLlZBTElEQVRJT05fTUFSS0VSX0lEKTsKLQkJaWYgKHRleHRSYW5nZSA9PSBudWxsKSB7Ci0JCQkvL2xvZyBhbiBleGNlcHRpb24gYW5kIHRoZW4gY29udGludWUgd2l0aG91dCBzZXR0aW5nIGxvY2F0aW9uIGluZm9ybWF0aW9uCi0JCQkvL0F0IGxlYXN0IHRoZSB1c2VyIHdpbGwgc3RpbGwgZ2V0IHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UgYW5kIHdpbGwKLQkJCS8vYmUgYWJsZSB0byBzZWUgb3RoZXIgdmFsaWRhdGlvbiBtZXNzYWdlcyB3aXRoIHZhbGlkIHRleHRSYW5nZXMKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiTnVsbCB0ZXh0IHJhbmdlIGZvciBtZXNzYWdlIElEOiAiICsgbWVzc2FnZUlkKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKHRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQodGV4dFJhbmdlLmdldE9mZnNldCgpKTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG1lc3NhZ2U7Ci0JfQotCQotCQotCXByaXZhdGUgRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYUhlbHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY1ZmZhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLQotcHVibGljIGNsYXNzIEpwYUhlbHBlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dCB7Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKE9iamVjdCBvYmopIHsKLQkJcmV0dXJuICgoSnBhTm9kZSkgb2JqKS5nZXRSZXNvdXJjZSgpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyB1c2VkIHdoZW4gbm8gbGluZSBudW1iZXIgaXMgc2V0LiAgV2UgZ2VuZXJhbGx5IHVzZSBsaW5lIG51bWJlcnMuCi0JICogVGhlcmVmb3JlLCB3aGVuIHRoaXMgaXMgY2FsbGVkLCB3ZSB3aWxsIHVzZSB0aGUgZGVmYXVsdCBsb2NhdGlvbiwgaS5lLgotCSAqIG51bGwuCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbihPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0aW9uRGVzY3JpcHRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFkZjE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMgewotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPRVNfTk9UX01BVENIX0pPSU5fVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9FU19OT1RfTUFUQ0hfQ09MTEVDVElPTl9UQUJMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOT1RfVkFMSURfRk9SX1RISVNfRU5USVRZOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0RFU0M7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPTl9NQVBQRURfU1VQRVJDTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPTl9FTUJFRERBQkxFOwotCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianBhX3ZhbGlkYXRpb25fZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnBhVmFsaWRhdGlvbkRlc2NyaXB0aW9uTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwYVZhbGlkYXRpb25EZXNjcmlwdGlvbk1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4NGZjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi0vLyBUT0RPIGJqdiByZW5hbWUgdG8gSnB0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVZhbGlkYXRpb25NZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcGFfdmFsaWRhdGlvbiI7Ci0KLQkvL0NvbnRlbnQgaXMgb3JnYW5pemVkIGJhc2VkIG9uIHRoZSBjYXRlZ29yaWVzIGFuZCBlbnRyaWVzIGluIGVhY2ggY2F0ZWdvcmllcyBhcmUgbGlzdGVkIGFscGhhYmV0aWNhbGx5LgotCS8vSWYgYWRkaW5nIGEgbmV3IGVudHJ5LCBwbGVhc2UgYmUgc3VyZSB0byBhZGQgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkgYXQgdGhlIHJpZ2h0IHBsYWNlLgotCQotCS8vUHJvamVjdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0pQQV9QUk9KRUNUID0gIk5PX0pQQV9QUk9KRUNUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9NVUxUSVBMRV9QRVJTSVNURU5DRV9VTklUUyA9ICJQRVJTSVNURU5DRV9NVUxUSVBMRV9QRVJTSVNURU5DRV9VTklUUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfTk9fUEVSU0lTVEVOQ0VfVU5JVCA9ICJQRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UID0gIlBFUlNJU1RFTkNFX1hNTF9JTlZBTElEX0NPTlRFTlQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTF9VTlNVUFBPUlRFRF9DT05URU5UID0gIlBFUlNJU1RFTkNFX1hNTF9VTlNVUFBPUlRFRF9DT05URU5UIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04gPSAiUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX0lOVkFMSURfQ09OTkVDVElPTiA9ICJQUk9KRUNUX0lOVkFMSURfQ09OTkVDVElPTiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9JTlZBTElEX0xJQlJBUllfUFJPVklERVIgPSAiUFJPSkVDVF9JTlZBTElEX0xJQlJBUllfUFJPVklERVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MID0gIlBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05PX0NPTk5FQ1RJT04gPSAiUFJPSkVDVF9OT19DT05ORUNUSU9OIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCA9ICJQUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCA9ICJYTUxfVkVSU0lPTl9OT1RfTEFURVNUIjsKLQotCS8vUGVyc2lzdGVuY2UgVW5pdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEgPSAiTUFQUElOR19GSUxFX0VYVFJBTkVPVVNfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX0RVUExJQ0FURV9DTEFTUyA9ICJQRVJTSVNURU5UX1RZUEVfRFVQTElDQVRFX0NMQVNTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9DTEFTUyA9ICJQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9DTEFTUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfSkFSX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfSkFSX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRSA9ICJQRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9NQVBQSU5HX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUyA9ICJQRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORyA9ICJQRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfSkFSX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9KQVJfRklMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9NQVBQSU5HX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTID0gIlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfQ0xBU1MiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9KQVJfRklMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUgPSAiUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQgPSAiUEVSU0lTVEVOQ0VfVU5JVF9VTlNVUFBPUlRFRF9NQVBQSU5HX0ZJTEVfQ09OVEVOVCI7Ci0KLQkvL1R5cGUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRV9EVVBMSUNBVEVEID0gIkVOVElUWV9OQU1FX0RVUExJQ0FURUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OQU1FX01JU1NJTkcgPSAiRU5USVRZX05BTUVfTUlTU0lORyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05PX1BLID0gIkVOVElUWV9OT19QSyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05PTl9ST09UX0lEX0FUVFJJQlVURV9TUEVDSUZJRUQgPSAiRU5USVRZX05PTl9ST09UX0lEX0FUVFJJQlVURV9TUEVDSUZJRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OT05fUk9PVF9JRF9DTEFTU19TUEVDSUZJRUQgPSAiRU5USVRZX05PTl9ST09UX0lEX0NMQVNTX1NQRUNJRklFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX0FOTk9UQVRFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQgPSAiUEVSU0lTVEVOVF9UWVBFX0FOTk9UQVRFRF9CVVRfTk9UX0lOQ0xVREVEX0lOX1BFUlNJU1RFTkNFX1VOSVQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUID0gIlBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUyA9ICJQRVJTSVNURU5UX1RZUEVfVU5SRVNPTFZFRF9DTEFTUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NMQVNTID0gIlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX05PVF9BTl9FTUJFRERBQkxFID0gIlRBUkdFVF9OT1RfQU5fRU1CRUREQUJMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SID0gIlRZUEVfTUFQUElOR19DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0NMQVNTX1BSSVZBVEVfTk9fQVJHX0NPTlNUUlVDVE9SID0gIlRZUEVfTUFQUElOR19DTEFTU19QUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTID0gIlRZUEVfTUFQUElOR19GSU5BTF9DTEFTUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FORF9FTUJFRERFRF9JRF9CT1RIX1VTRUQgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FORF9FTUJFRERFRF9JRF9CT1RIX1VTRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfRE9FU19OT1RfRVhJU1QgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9ET0VTX05PVF9FWElTVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9NQVBQSU5HX0RVUExJQ0FURV9NQVRDSCA9ICJUWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX01BUFBJTkdfRFVQTElDQVRFX01BVENIIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX01BUFBJTkdfTk9fTUFUQ0ggPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9NQVBQSU5HX05PX01BVENIIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX05PX01BVENIID0gIlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTk9fTUFUQ0giOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTk9UX1BSSU1BUllfS0VZID0gIlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTk9UX1BSSU1BUllfS0VZIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfQUdSRUUgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9UWVBFX0RPRVNfTk9UX0FHUkVFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19FUVVBTFNfTUVUSE9EID0gIlRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX0VRVUFMU19NRVRIT0QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX0hBU0hDT0RFX01FVEhPRCA9ICJUWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUiA9ICJUWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19OT19BUkdfQ09OU1RSVUNUT1IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX1BVQkxJQ19OT19BUkdfQ09OU1RSVUNUT1IgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfUFVCTElDX05PX0FSR19DT05TVFJVQ1RPUiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05BTUVfRU1QVFkgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05BTUVfRU1QVFkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfRVhJU1QgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9FWElTVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9JTVBMRU1FTlRfU0VSSUFMSVpBQkxFID0gIlRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfSU1QTEVNRU5UX1NFUklBTElaQUJMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9QVUJMSUMgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9QVUJMSUMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19QUk9QRVJUWV9NRVRIT0RfTk9UX1BVQkxJQyA9ICJUWVBFX01BUFBJTkdfSURfQ0xBU1NfUFJPUEVSVFlfTUVUSE9EX05PVF9QVUJMSUMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19SRURFRklORUQgPSAiVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFREVGSU5FRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFUVVJUkVEID0gIlRZUEVfTUFQUElOR19JRF9DTEFTU19SRVFVSVJFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1dJVEhfTUFQU19JRCA9ICJUWVBFX01BUFBJTkdfSURfQ0xBU1NfV0lUSF9NQVBTX0lEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfTUFQU19JRF9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9BR1JFRSA9ICJUWVBFX01BUFBJTkdfTUFQU19JRF9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9BR1JFRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTUyA9ICJUWVBFX01BUFBJTkdfTUVNQkVSX0NMQVNTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfTVVMVElQTEVfRU1CRURERURfSUQgPSAiVFlQRV9NQVBQSU5HX01VTFRJUExFX0VNQkVEREVEX0lEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01BUFBJTkdfUEtfUkVERUZJTkVEX0lEX0FUVFJJQlVURSA9ICJUWVBFX01BUFBJTkdfUEtfUkVERUZJTkVEX0lEX0FUVFJJQlVURSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NQVBQSU5HX1BLX1JFREVGSU5FRF9JRF9DTEFTUyA9ICJUWVBFX01BUFBJTkdfUEtfUkVERUZJTkVEX0lEX0NMQVNTIjsKLQkKLQkvL0F0dHJpYnV0ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQgPSAiTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DTEFTU19OT1RfRVhJU1QgPSAiTUFQX0tFWV9DTEFTU19OT1RfRVhJU1QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfRE9FU19OT1RfRVhJU1QgPSAiRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19ET0VTX05PVF9FWElTVCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19NVVNUX0JFX0VNQkVEREFCTEVfT1JfQkFTSUNfVFlQRSA9ICJFTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX05PVF9ERUZJTkVEID0gIkVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTk9UX0RFRklORUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX0lEX01BUFBJTkdfTUFQUEVEX0JZX1JFTEFUSU9OU0hJUF9BTkRfQVRUUklCVVRFX09WRVJSSURFU19TUEVDSUZJRUQgPSAiRU1CRURERURfSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9BVFRSSUJVVEVfT1ZFUlJJREVTX1NQRUNJRklFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9DT0xVTU5fU1BFQ0lGSUVEID0gIklEX01BUFBJTkdfTUFQUEVEX0JZX1JFTEFUSU9OU0hJUF9BTkRfQ09MVU1OX1NQRUNJRklFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQU19JRF9WQUxVRV9JTlZBTElEID0gIk1BUFNfSURfVkFMVUVfSU5WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQgPSAiTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFNfSURfVkFMVUVfTk9UX1NQRUNJRklFRCA9ICJNQVBTX0lEX1ZBTFVFX05PVF9TUEVDSUZJRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlkgPSAiTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUyA9ICJNQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZID0gIk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0NPTFVNTl9BTkRfT1JERVJfQllfQk9USF9TUEVDSUZJRUQgPSAiT1JERVJfQ09MVU1OX0FORF9PUkRFUl9CWV9CT1RIX1NQRUNJRklFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX0lOVkFMSURfVkFMVUVfVFlQRSA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fSU5WQUxJRF9WQUxVRV9UWVBFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUF9LRVlfVFlQRSA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUF9LRVlfVFlQRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0dFVFRFUiA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9HRVRURVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX1NFVFRFUiA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9TRVRURVIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5IRVJJVEVEX0FUVFJJQlVURVNfTk9UX1NVUFBPUlRFRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBQSU5HX1RZUEUgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBQSU5HX1RZUEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEUgPSAiUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9WRVJTSU9OX01BUFBJTkdfVFlQRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxEID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX1BVQkxJQ19GSUVMRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FID0gIlBFUlNJU1RFTlRfQVRUUklCVVRFX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSA9ICJQRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFkgPSAiVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEID0gIlRBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9FTlRJVFlfTk9UX0VYSVNUID0gIlRBUkdFVF9FTlRJVFlfTk9UX0VYSVNUIjsKLQkKLQkvLyoqKkltcGxpZWQgQXR0cmlidXRlKioqCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCA9ICJWSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NMQVNTX05PVF9ERUZJTkVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX0RPRVNfTk9UX0VYSVNUID0gIlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfRE9FU19OT1RfRVhJU1QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEUgPSAiVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19NVVNUX0JFX0VNQkVEREFCTEVfT1JfQkFTSUNfVFlQRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRCA9ICJWSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX05PVF9ERUZJTkVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFkgPSAiVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEID0gIlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQX0tFWV9UWVBFID0gIlZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQX0tFWV9UWVBFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fSU5WQUxJRF9WQUxVRV9UWVBFID0gIlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQUElOR19UWVBFID0gIlZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQUElOR19UWVBFIjsKLQkKLQkKLQkvL1RhYmxlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cgPSAiQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9OQU1FID0gIkNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BID0gIkNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HID0gIkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSA9ICJKT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSA9ICJKT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HID0gIlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUgPSAiU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BID0gIlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HID0gIlRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVU5SRVNPTFZFRF9OQU1FID0gIlRBQkxFX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEgPSAiVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEiOwotCS8vKioqSW1wbGllZCBBdHRyaWJ1dGUqKioKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyA9ICJWSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEgPSAiVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cgPSAiVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEiOwotCi0JLy9Db2x1bW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFCTEVfTk9UX1ZBTElEPSJDT0xVTU5fVEFCTEVfTk9UX1ZBTElEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIkNPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9VTlJFU09MVkVEX1RBQkxFID0gIkNPTFVNTl9VTlJFU09MVkVEX1RBQkxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIklOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMgPSAiSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQgPSAiSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIklOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJJTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMgPSAiSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCA9ICJKT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIkpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9Ik1BUF9LRVlfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPSJNQVBfS0VZX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiT1JERVJfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMgPSAiUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIk1BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEID0gIk1BUF9LRVlfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIk1BUF9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIk1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJNQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0KLQkvLyB2aXJ0dWFsIGF0dHJpYnV0ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD0iVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyA9ICJWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEID0gIlZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyA9ICJWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPSJWSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT0iVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX09SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyA9ICJWSVJUVUFMX0FUVFJJQlVURV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMgPSAiVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyA9ICJWSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJWSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9NQVBfS0VZX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9NQVBfS0VZX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQgPSAiVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSI7Ci0KLQkvL092ZXJyaWRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRSA9ICJBU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUgPSAiQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfVFlQRSA9ICJBVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9UWVBFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfREVSSVZFRF9BTkRfU1BFQ0lGSUVEID0gIkFUVFJJQlVURV9PVkVSUklERV9ERVJJVkVEX0FORF9TUEVDSUZJRUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUyA9ICJWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMgPSAiVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQgPSAiVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMgPSAiVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyA9ICJWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCA9ICJWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BID0gIlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEID0gIlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMgPSAiVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TID0gIlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQgPSAiVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD0iVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9IlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FID0gIlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPSJWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUgPSAiVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX1RZUEUgPSAiVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9UWVBFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9IlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FID0gIlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUgPSAiVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUiOwotCi0JLy9Jbmhlcml0YW5jZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSA9ICJESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9BQlNUUkFDVF9ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQgPSAiRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFID0gIkVOVElUWV9BQlNUUkFDVF9UQUJMRV9QRVJfQ0xBU1NfREVGSU5FU19UQUJMRSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05PTl9ST09UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQgPSAiRU5USVRZX05PTl9ST09UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFID0gIkVOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQgPSAiRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCA9ICJFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk0gPSAiRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfUE9SVEFCTEVfT05fUExBVEZPUk0iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1NVUFBPUlRFRF9PTl9QTEFURk9STSA9ICJFTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0iOwotCi0JLy9HZW5lcmF0b3IKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfRFVQTElDQVRFX05BTUUgPSAiR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1JfTkFNRV9VTkRFRklORUQgPSAiR0VORVJBVE9SX05BTUVfVU5ERUZJTkVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9NQVBQSU5HX1VOUkVTT0xWRURfR0VORVJBVE9SX05BTUUgPSAiSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FIjsKLQkKLQkvL1F1ZXJ5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBRTF9RVUVSWV9WQUxJREFUSU9OID0gIkpQUUxfUVVFUllfVkFMSURBVElPTiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfRFVQTElDQVRFX05BTUUgPSAiUVVFUllfRFVQTElDQVRFX05BTUUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX05BTUVfVU5ERUZJTkVEID0gIlFVRVJZX05BTUVfVU5ERUZJTkVEIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9TVEFURU1FTlRfVU5ERUZJTkVEID0gIlFVRVJZX1NUQVRFTUVOVF9VTkRFRklORUQiOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViN2ZhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLklSZXNvdXJjZVBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLQotLy9UT0RPOiAgUHJvYmFibHkgd2FudCB0byBtZXJnZSB0aGUgYmVoYXZpb3IgaW4gdGhpcyBjbGFzcyBpbnRvIEpwdEpwYUNvcmVQbHVnaW4KLXB1YmxpYyBjbGFzcyBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMgewotCi0JLyoKLQkgKiBwcmVmaXggZm9yIGFsbCBwcmVmZXJlbmNlIHN0cmluZ3MuICBUaGlzIGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5LgotCSAqIENsaWVudHMgb2YgZ2V0KkxldmVsUHJvYmxlbVByZWZlcm5jZSgpIGFuZCBzZXQqTGV2ZWxQcm9ibGVtUHJlZmVyZW5jZSAKLQkgKiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIHByZWZpeC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9QUkVGSVggPSAicHJvYmxlbS4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJlcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gIndhcm5pbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRSA9ICJpZ25vcmUiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgaW50IE5PX1NFVkVSSVRZX1BSRUZFUkVOQ0UgPSAtMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktTUEFDRV9QUkVGRVJFTkNFU19PVkVSUklERU4gPSAid29ya3NwYWNlX3ByZWZlcmVuY2VzX292ZXJyaWRlbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgb25seSB0aGUgc2V2ZXJpdHkgbGV2ZWwgb2YgYSBnaXZlbiBwcm9ibGVtIHByZWZlcmVuY2UuICBUaGlzIGRvZXMgbm90Ci0JICogaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiB3aGV0aGVyIHRoZSBwcm9ibGVtIGlzIGlnbm9yZWQuICBTZWUgaXNQcm9ibGVtSWdub3JlZC4KLQkgKiBAcmV0dXJuIGFuIElNZXNzYWdlIHNldmVyaXR5IGxldmVsCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0UHJvYmxlbVNldmVyaXR5UHJlZmVyZW5jZShPYmplY3QgdGFyZ2V0T2JqZWN0LCBTdHJpbmcgbWVzc2FnZUlkKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KHRhcmdldE9iamVjdCk7Ci0JCVN0cmluZyBwcm9ibGVtUHJlZmVyZW5jZSA9IGdldFByZWZlcmVuY2UocHJvamVjdCwgbWVzc2FnZUlkKTsKLQkJCi0JCWlmIChwcm9ibGVtUHJlZmVyZW5jZSA9PSBudWxsKXsKLQkJCXJldHVybiBOT19TRVZFUklUWV9QUkVGRVJFTkNFOwotCQl9IGVsc2UgaWYgKHByb2JsZW1QcmVmZXJlbmNlLmVxdWFscyhFUlJPUikpewotCQkJcmV0dXJuIElNZXNzYWdlLkhJR0hfU0VWRVJJVFk7Ci0JCX0gZWxzZSBpZiAocHJvYmxlbVByZWZlcmVuY2UuZXF1YWxzKFdBUk5JTkcpKXsKLQkJCXJldHVybiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCX0gZWxzZSBpZiAocHJvYmxlbVByZWZlcmVuY2UuZXF1YWxzKElORk8pKXsKLQkJCXJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0JCX0KLQkJcmV0dXJuIE5PX1NFVkVSSVRZX1BSRUZFUkVOQ0U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVByb2plY3QgZ2V0UHJvamVjdChPYmplY3QgdGFyZ2V0T2JqZWN0KSB7Ci0JCUlBZGFwdGFibGUgdGFyZ2V0ID0gKElBZGFwdGFibGUpdGFyZ2V0T2JqZWN0OwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSAoKElSZXNvdXJjZVBhcnQpIHRhcmdldC5nZXRBZGFwdGVyKElSZXNvdXJjZVBhcnQuY2xhc3MpKS5nZXRSZXNvdXJjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgcHJvYmxlbSBzaG91bGQgYmUgaWdub3JlZCBiYXNlZCBvbiBwcm9qZWN0IG9yCi0JICogd29ya3NwYWNlIHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvYmxlbUlnbm9yZWQoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG1lc3NhZ2VJZCl7Ci0JCVN0cmluZyBwcm9ibGVtUHJlZmVyZW5jZSA9IGdldFByZWZlcmVuY2UocHJvamVjdCwgbWVzc2FnZUlkKTsKLQkJaWYgKHByb2JsZW1QcmVmZXJlbmNlICE9IG51bGwgJiYgcHJvYmxlbVByZWZlcmVuY2UuZXF1YWxzKElHTk9SRSkpewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJlbmNlKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtZXNzYWdlSWQpIHsKLQkJU3RyaW5nIHByb2JsZW1QcmVmZXJlbmNlID0gbnVsbDsKLQkJcHJvYmxlbVByZWZlcmVuY2UgPSBnZXRQcm9qZWN0TGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShwcm9qZWN0LCBtZXNzYWdlSWQpOwotCQkvL2lmIHNldmVyaXR5IGlzIHN0aWxsIG51bGwsIGNoZWNrIHRoZSB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMKLQkJaWYgKHByb2JsZW1QcmVmZXJlbmNlID09IG51bGwpIHsKLQkJCXByb2JsZW1QcmVmZXJlbmNlID0gZ2V0V29ya3NwYWNlTGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShtZXNzYWdlSWQpOwotCQl9Ci0JCXJldHVybiBwcm9ibGVtUHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBTdHJpbmcgdmFsdWUgb2YgdGhlIHByb2JsZW0gcHJlZmVyZW5jZSBmcm9tIHRoZSBwcm9qZWN0IHByZWZlcmVuY2VzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvamVjdExldmVsUHJvYmxlbVByZWZlcmVuY2UoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIG1lc3NhZ2VJZCl7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlKEpwdEpwYUNvcmVQbHVnaW4uZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpLCBtZXNzYWdlSWQpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9qZWN0TGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgcHJvYmxlbVByZWZlcmVuY2UpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZmVyZW5jZXMgPSBKcHRKcGFDb3JlUGx1Z2luLmdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJc2V0UHJlZmVyZW5jZShwcm9qZWN0UHJlZmVyZW5jZXMsIG1lc3NhZ2VJZCwgcHJvYmxlbVByZWZlcmVuY2UpOwotCQlmbHVzaChwcm9qZWN0UHJlZmVyZW5jZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFN0cmluZyB2YWx1ZSBvZiB0aGUgcHJvYmxlbSBwcmVmZXJlbmNlIGZyb20gdGhlIHdvcmtzcGFjZSBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFdvcmtzcGFjZUxldmVsUHJvYmxlbVByZWZlcmVuY2UoU3RyaW5nIG1lc3NhZ2VJZCl7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlKEpwdEpwYUNvcmVQbHVnaW4uZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKSwgbWVzc2FnZUlkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0V29ya3NwYWNlTGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShTdHJpbmcgbWVzc2FnZUlkLCBTdHJpbmcgcHJvYmxlbVByZWZlcmVuY2UpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyB3b3Jrc3BhY2VQcmVmZXJlbmNlcyA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKTsKLQkJc2V0UHJlZmVyZW5jZSh3b3Jrc3BhY2VQcmVmZXJlbmNlcywgbWVzc2FnZUlkLCBwcm9ibGVtUHJlZmVyZW5jZSk7Ci0JCWZsdXNoKHdvcmtzcGFjZVByZWZlcmVuY2VzKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZShJRWNsaXBzZVByZWZlcmVuY2VzIHByZWZlcmVuY2VzLCBTdHJpbmcgbWVzc2FnZUlkKSB7Ci0JCXJldHVybiBwcmVmZXJlbmNlcy5nZXQoYXBwZW5kUHJvYmxlbVByZWZpeChtZXNzYWdlSWQpLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByZWZlcmVuY2UoSUVjbGlwc2VQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcywgU3RyaW5nIG1lc3NhZ2VJZCwgU3RyaW5nIHByb2JsZW1QcmVmZXJlbmNlKSB7Ci0JCWlmIChwcm9ibGVtUHJlZmVyZW5jZSA9PSBudWxsKXsKLQkJCXByZWZlcmVuY2VzLnJlbW92ZShhcHBlbmRQcm9ibGVtUHJlZml4KG1lc3NhZ2VJZCkpOwotCQl9Ci0JCWVsc2UgewotCQkJcHJlZmVyZW5jZXMucHV0KGFwcGVuZFByb2JsZW1QcmVmaXgobWVzc2FnZUlkKSwgcHJvYmxlbVByZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFwcGVuZFByb2JsZW1QcmVmaXgoU3RyaW5nIG1lc3NhZ2VJZCkgewotCQlyZXR1cm4gUFJPQkxFTV9QUkVGSVggKyBtZXNzYWdlSWQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGZsdXNoKElFY2xpcHNlUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJdHJ5IHsKLQkJCXByZWZzLmZsdXNoKCk7Ci0JCX0gY2F0Y2goQmFja2luZ1N0b3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhleCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KcGFWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4NDRjZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pwYVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSVJlc291cmNlUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlNpbmdsZUVsZW1lbnRJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5BYnN0cmFjdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLlZhbGlkYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVByb2plY3RWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyByZWZlcmVuY2VkIGluIHRoZSBKUEEgZXh0ZW5zaW9uIGZvciB0aGUKLSAqIFdUUCB2YWxpZGF0b3IgZXh0ZW5zaW9uIHBvaW50LgotICovCi1wdWJsaWMgY2xhc3MgSnBhVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQotCXB1YmxpYyBKcGFWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBJVmFsaWRhdG9yIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0LCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJdmFsaWRhdGUocmVwb3J0ZXIsIHByb2plY3QoY29udGV4dCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogQWJzdHJhY3RWYWxpZGF0b3IgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBraW5kLCBWYWxpZGF0aW9uU3RhdGUgc3RhdGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCVZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJSVJlcG9ydGVyIHJlcG9ydGVyID0gcmVzdWx0LmdldFJlcG9ydGVyKG1vbml0b3IpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQl0aGlzLmNsZWFyTWFya2Vycyhwcm9qZWN0KTsKLQkJcmVzdWx0LnNldFN1c3BlbmRWYWxpZGF0aW9uKHByb2plY3QpOwotCQl0aGlzLnZhbGlkYXRlKHJlcG9ydGVyLCBwcm9qZWN0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBpbnRlcm5hbCBjb252LiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCXByaXZhdGUgdm9pZCBjbGVhck1hcmtlcnMoSVByb2plY3QgcHJvamVjdCkgewotCQl0cnkgewotCQkJY2xlYXJNYXJrZXJzXyhwcm9qZWN0KTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyTWFya2Vyc18oSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTWFya2VyW10gbWFya2VycyA9IHByb2plY3QuZmluZE1hcmtlcnMoSnB0SnBhQ29yZVBsdWdpbi5WQUxJREFUSU9OX01BUktFUl9JRCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJZm9yIChJTWFya2VyIG1hcmtlciA6IG1hcmtlcnMpIHsKLQkJCW1hcmtlci5kZWxldGUoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoSVJlcG9ydGVyIHJlcG9ydGVyLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZvciAoSU1lc3NhZ2UgbWVzc2FnZSA6IHRoaXMuZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKHJlcG9ydGVyLCBwcm9qZWN0KSkgewotCQkJLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBpZ25vcmVkIGJhc2VkIG9uIHByZWZlcmVuY2VzCi0JCQlpZiAoIUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5pc1Byb2JsZW1JZ25vcmVkKHByb2plY3QsIG1lc3NhZ2UuZ2V0SWQoKSkpewotCQkJCXJlcG9ydGVyLmFkZE1lc3NhZ2UodGhpcywgYWRqdXN0TWVzc2FnZShtZXNzYWdlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBwcm9qZWN0KElWYWxpZGF0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiAoKElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQpIGNvbnRleHQpLmdldFByb2plY3QoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJdGVyYWJsZTxJTWVzc2FnZT4gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKElSZXBvcnRlciByZXBvcnRlciwgSVByb2plY3QgcHJvamVjdCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXJldHVybiBqcGFQcm9qZWN0LmdldFZhbGlkYXRpb25NZXNzYWdlcyhyZXBvcnRlcik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50SXRlcmFibGU8SU1lc3NhZ2U+KAotCQkJRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlcy5idWlsZE1lc3NhZ2UoCi0JCQlJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk5PX0pQQV9QUk9KRUNULAotCQkJcHJvamVjdAotCQkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTWVzc2FnZSBhZGp1c3RNZXNzYWdlKElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJSUFkYXB0YWJsZSB0YXJnZXRPYmplY3QgPSAoSUFkYXB0YWJsZSkgbWVzc2FnZS5nZXRUYXJnZXRPYmplY3QoKTsKLQkJSVJlc291cmNlIHRhcmdldFJlc291cmNlID0gKChJUmVzb3VyY2VQYXJ0KSB0YXJnZXRPYmplY3QuZ2V0QWRhcHRlcihJUmVzb3VyY2VQYXJ0LmNsYXNzKSkuZ2V0UmVzb3VyY2UoKTsKLQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QodGFyZ2V0UmVzb3VyY2UpOwotCQlpZiAobWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkgPT0gSU1lc3NhZ2UuTElORU5PX1VOU0VUKSB7Ci0JCQltZXNzYWdlLnNldEF0dHJpYnV0ZShJTWFya2VyLkxPQ0FUSU9OLCAiICIpOwotCQl9Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvSnBhRmFjdG9yeTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9KcGFGYWN0b3J5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNGYzMmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9KcGFGYWN0b3J5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFSZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWV0YW1vZGVsU291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMC5Pd25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotCi0vKioKLSAqIEpQQSAyLjAgZmFjdG9yeQotICo8cD4gCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWNKcGFGYWN0b3J5Ml8wCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUZhY3RvcnkyXzAKLQlleHRlbmRzIEpwYUZhY3RvcnkKLXsKLQkKLQkvLyAqKioqKioqKioqIENvcmUgTW9kZWwgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIGFuIGlkZW50aWZpZXIgYWRhcHRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnZlcnQgZGF0YWJhc2UKLQkgKiBpZGVudGlmaWVycyB0byBuYW1lcyBhbmQgdmljZSB2ZXJzYSwgcmVzcGVjdGluZyB0aGUgPGNvZGU+ZGVsaW1pdGVkLWlkZW50aWZpZXJzPC9jb2RlPgotCSAqIGluIDxjb2RlPnBlcnNpc3RlbmNlLnhtbDwvY29kZT4uCi0JICovCi0JRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBidWlsZERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIoSnBhRGF0YVNvdXJjZSBkYXRhU291cmNlKTsKLQotCU1ldGFtb2RlbFNvdXJjZVR5cGUuU3luY2hyb25pemVyIGJ1aWxkTWV0YW1vZGVsU3luY2hyb25pemVyKE1ldGFtb2RlbFNvdXJjZVR5cGUgc291cmNlVHlwZSk7Ci0KLQkKLQkvLyAqKioqKioqKioqIEphdmEgQ29udGV4dCBNb2RlbCAqKioqKioqKioqCi0JCi0JLy9vdmVybG9hZGVkIGJlY2F1c2UgdGhlIDIuMCBKUEEgc3BlYyBzdXBwb3J0cyBhc3NvY2lhdGlvbiBvdmVycmlkZXMgb24gYW4gZW1iZWRkZWQgbWFwcGluZyB3aGlsZSB0aGUgMS4wIHNwZWMgZGlkIG5vdAotCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBwYXJlbnQsIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyIG93bmVyKTsKLQkKLQlKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGJ1aWxkSmF2YURlcml2ZWRJZGVudGl0eShKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBwYXJlbnQpOwotCQotCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCk7Ci0JCi0JSmF2YUNhY2hlYWJsZTJfMCBidWlsZEphdmFDYWNoZWFibGUoSmF2YUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpOwotCQotCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRKYXZhT3JwaGFuUmVtb3ZhbChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpOwotCQotCUphdmFPcmRlckNvbHVtbjJfMCBidWlsZEphdmFPcmRlckNvbHVtbihKYXZhT3JkZXJhYmxlMl8wIHBhcmVudCwgSmF2YVJlYWRPbmx5TmFtZWRDb2x1bW4uT3duZXIgb3duZXIpOwotCQotCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgYnVpbGRKYXZhQ29sbGVjdGlvblRhYmxlKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgcGFyZW50LCBUYWJsZS5Pd25lciBvd25lcik7Ci0KLQlKYXZhQ29sdW1uIGJ1aWxkSmF2YU1hcEtleUNvbHVtbihKYXZhSnBhQ29udGV4dE5vZGUgcGFyZW50LCBKYXZhQ29sdW1uLk93bmVyIG93bmVyKTsKLQkKLQlKYXZhT3JkZXJhYmxlMl8wIGJ1aWxkSmF2YU9yZGVyYWJsZShKYXZhQXR0cmlidXRlTWFwcGluZyBwYXJlbnQsIE9yZGVyYWJsZTJfMC5Pd25lciBvd25lcik7Ci0KLQkvKioKLQkgKiBVc2Uge0BsaW5rICNidWlsZEphdmFPcmRlcmFibGUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcsIE93bmVyKX0uCi0JICovCi0JSmF2YU9yZGVyYWJsZSBidWlsZEphdmFPcmRlcmFibGUoSmF2YUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvSnBhUHJvamVjdDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9KcGFQcm9qZWN0Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMTllNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9KcGFQcm9qZWN0Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLQotLyoqCi0gKiBKUEEgMi4wIHByb2plY3QuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQcm9qZWN0Ml8wCi0JZXh0ZW5kcyBKcGFQcm9qZWN0LCBNZXRhbW9kZWxTeW5jaHJvbml6ZXIKLXsKLQotCS8vICoqKioqKioqKiogQ2Fub25pY2FsIE1ldGFtb2RlbCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBJRCBzdHJpbmcgdXNlZCB3aGVuIG1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUgcHJvcGVydHkgaXMgY2hhbmdlZC4KLQkgKiBAc2VlICNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFN0cmluZywgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JU3RyaW5nIE1FVEFNT0RFTF9TT1VSQ0VfRk9MREVSX05BTUVfUFJPUEVSVFkgPSAibWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHRoYXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwKLQkgKiBNZXRhbW9kZWwuCi0JICovCi0JU3RyaW5nIGdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHRoYXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwKLQkgKiBNZXRhbW9kZWwuCi0JICovCi0Jdm9pZCBzZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKFN0cmluZyBtZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgcGFja2FnZSBmcmFnbWVudCByb290IHRoYXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwKLQkgKiBNZXRhbW9kZWwuCi0JICovCi0JSVBhY2thZ2VGcmFnbWVudFJvb3QgZ2V0TWV0YW1vZGVsUGFja2FnZUZyYWdtZW50Um9vdCgpOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIEphdmEgc291cmNlIGZvbGRlcnMuIChUaGVzZQotCSAqIGNhbiBiZSB1c2VkIHRvIGhvbGQgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwgTWV0YW1vZGVsLikKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldEphdmFTb3VyY2VGb2xkZXJOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBKUEEgcHJvamVjdCdzIGdlbmVyYXRlZCBtZXRhbW9kZWwgSmF2YSByZXNvdXJjZQotCSAqIHRvcC1sZXZlbCB0eXBlcy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1ldGFtb2RlbFN5Y2hyb25pemVyLlRvb2xzLmlzR2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSwgSVBhY2thZ2VGcmFnbWVudFJvb3QpCi0JICovCi0JSXRlcmFibGU8SmF2YVJlc291cmNlQWJzdHJhY3RUeXBlPiBnZXRHZW5lcmF0ZWRNZXRhbW9kZWxUb3BMZXZlbFR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvcC1sZXZlbCBnZW5lcmF0ZWQgbWV0YW1vZGVsIEphdmEgcmVzb3VyY2UgcGVyc2lzdGVudCB0eXBlCi0JICogaW4gdGhlIHNwZWNpZmllZCBmaWxlLiBSZXR1cm4gbnVsbCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBpcyB0cnVlOjx1bD4KLQkgKiA8bGk+dGhlIGZpbGUgaXMgbm90IGEgSmF2YSBzb3VyY2UgZmlsZQotCSAqIDxsaT50aGUgdG9wLWxldmVsIEphdmEgY2xhc3MgaXMgbm90IGFubm90YXRlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZQotCSAqICAgICA8Y29kZT5qYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDwvY29kZT4gYW5ub3RhdGlvbgotCSAqIDxsaT5uZWl0aGVyIHRoZSB0b3AtbGV2ZWwgSmF2YSBjbGFzcyBub3IgYW55IG9mIGl0cyBuZXN0ZWQgY2xhc3NlcwotCSAqICAgICBpcyBhbm5vdGF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUKLQkgKiAgICAgPGNvZGU+amF2YXgucGVyc2lzdGVuY2UubWV0YW1vZGVsLlN0YXRpY01ldGFtb2RlbDwvY29kZT4gYW5ub3RhdGlvbgotCSAqIDx1bD4KLQkgKi8KLQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgZ2V0R2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlKElGaWxlIGZpbGUpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiBjb25maWcgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHNldHRpbmdzIHVzZWQgdG8gY29uc3RydWN0IGEgSlBBIDIuMCBwcm9qZWN0LgotCSAqLwotCWludGVyZmFjZSBDb25maWcgZXh0ZW5kcyBKcGFQcm9qZWN0LkNvbmZpZyB7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZm9sZGVyIHRoYXQgaG9sZHMgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwKLQkJICogTWV0YW1vZGVsLiBSZXR1cm4gbnVsbCBpZiB0aGUgQ2Fub25pY2FsIE1ldGFtb2RlbCBpcyBub3QgdG8gYmUKLQkJICogZ2VuZXJhdGVkLgotCQkgKi8KLQkJU3RyaW5nIGdldE1ldGFtb2RlbFNvdXJjZUZvbGRlck5hbWUoKTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9NYXBwaW5nS2V5czJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9NYXBwaW5nS2V5czJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTBjZGQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvTWFwcGluZ0tleXMyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTI7Ci0KLS8qKgotICogCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdLZXlzMl8wIHsKLQotCVN0cmluZyBFTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZID0gImVsZW1lbnRDb2xsZWN0aW9uIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvTWV0YW1vZGVsU3luY2hyb25pemVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL01ldGFtb2RlbFN5bmNocm9uaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjI1MThmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvTWV0YW1vZGVsU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMjsKLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKUEEgMi4wIENhbm9uaWNhbCBNZXRhbW9kZWwgc3luY2hyb25pemVyLgotICogPHA+Ci0gKiBOb3RlczoKLSAqIDx1bD48bGk+Ci0gKiBXaGVuIGEgSlBBIHByb2plY3QgaXMgZmlyc3QgY3JlYXRlZCAoZS5nLiB3aGVuIHRoZSB1c2VyIGFkZHMgdGhlIEpQQQotICogRmFjZXQgdG8gYSBGYWNldGVkIHByb2plY3Qgb3Igd2hlbiBhIHdvcmtzcGFjZSBjb250YWluaW5nIGEgSlBBIHByb2plY3QgaXMKLSAqIG9wZW5lZCksIGlmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gZ2VuZXJhdGUgdGhlCi0gKiBDYW5vbmljYWwgTWV0YW1vZGVsIChpLmUuIGl0cyBtZXRhbW9kZWwgc291cmNlIGZvbGRlciBpcyBub24tbnVsbCksIGl0IHdpbGwKLSAqIGZpcnN0IGRpc2NvdmVyIHdoYXQgbWV0YW1vZGVsIGNsYXNzZXMgYXJlIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgbWV0YW1vZGVsCi0gKiBzb3VyY2UgZm9sZGVyLiBBbnkgY2xhc3MgYXBwcm9wcmlhdGVseSBhbm5vdGF0ZWQgd2l0aAotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UubWV0YW1vZGVsLlN0YXRpY01ldGFtb2RlbDwvY29kZT4KLSAqIGFuZCA8Y29kZT5qYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDwvY29kZT4KLSAqIHdpbGwgYmUgYWRkZWQgdG8gdGhlIENhbm9uaWNhbCBNZXRhbW9kZWwKLSAqIChzZWUge0BsaW5rIE1ldGFtb2RlbFRvb2xzI2lzR2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSwgSVBhY2thZ2VGcmFnbWVudFJvb3QpfSkuCi0gKiBPbmNlIHRoZSBKUEEgcHJvamVjdCdzIGNvbnRleHQgbW9kZWwgaXMgY29uc3RydWN0ZWQsIGEgbmV3IENhbm9uaWNhbAotICogTWV0YW1vZGVsIGlzIGdlbmVyYXRlZCBhbmQgbWVyZ2VkIHdpdGggdGhlIGNsYXNzZXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZQotICogbWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIuCi0gKiA8L2xpPjxsaT4KLSAqIFdoZW4gYSBKUEEgcHJvamVjdCdzIG1ldGFtb2RlbCBzb3VyY2UgZm9sZGVyIHNldHRpbmcgaXMgY2xlYXJlZCwgdGhlIENhbm9uaWNhbAotICogTWV0YW1vZGVsIGlzIGNsZWFyZWQgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgYnV0IHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGFyZQotICogbGVmdCBpbiBwbGFjZS4KLSAqIDwvbGk+PGxpPgotICogV2hlbiBhIEpQQSBwcm9qZWN0J3MgbWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIgaXMgc2V0IHRvIGEgbm9uLW51bGwgdmFsdWUsCi0gKiBsaWtlIHdoZW4gYSBKUEEgcHJvamVjdCBpcyBmaXJzdCBjcmVhdGVkLCB0aGUgcmVzdWx0aW5nIENhbm9uaWNhbCBNZXRhbW9kZWwKLSAqIHdpbGwgYmUgbWVyZ2VkIHdpdGggd2hhdGV2ZXIgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBmb2xkZXIuCi0gKiA8L2xpPjwvdWw+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhbW9kZWxTeW5jaHJvbml6ZXIgewotCi0JLyoqCi0JICogVGhlIHZhbHVlIHVzZWQgdG8gdGFnIGEgZ2VuZXJhdGVkIHR5cGU6Ci0JICogPHByZT4KLQkgKiAmIzY0O2phdmF4LmFubm90YXRpb24uR2VuZXJhdGVkKHZhbHVlPSJEYWxpIiwgZGF0ZT0iMjAwOS0xMS0yM1QxMzo1NjowNi4xNzEtMDUwMCIpCi0JICogPC9wcmU+Ci0JICovCi0JU3RyaW5nIE1FVEFNT0RFTF9HRU5FUkFURURfQU5OT1RBVElPTl9WQUxVRSA9ICJEYWxpIjsgLy8kTk9OLU5MUy0xJAotCi0Jdm9pZCBpbml0aWFsaXplTWV0YW1vZGVsKCk7Ci0KLQl2b2lkIHN5bmNocm9uaXplTWV0YW1vZGVsKCk7Ci0KLQl2b2lkIGRpc3Bvc2VNZXRhbW9kZWwoKTsKLQotCi0JLyoqCi0JICogU2luZ2xldG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRhbW9kZWwgc3luY2hyb25pemVyIGludGVyZmFjZSB0aGF0Ci0JICogZG9lcyBub3RoaW5nLiAoTm90IHN1cmUgd2UgbmVlZCB0aGlzLi4uLikKLQkgKi8KLQlmaW5hbCBjbGFzcyBOdWxsIGltcGxlbWVudHMgTWV0YW1vZGVsU3luY2hyb25pemVyLCBTZXJpYWxpemFibGUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE1ldGFtb2RlbFN5bmNocm9uaXplciBJTlNUQU5DRSA9IG5ldyBOdWxsKCk7Ci0JCXB1YmxpYyBzdGF0aWMgTWV0YW1vZGVsU3luY2hyb25pemVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOdWxsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplTWV0YW1vZGVsKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIHN5bmNocm9uaXplTWV0YW1vZGVsKCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2VNZXRhbW9kZWwoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1ldGFtb2RlbFN5bmNocm9uaXplci5OdWxsIjsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkJcHJpdmF0ZSBPYmplY3QgcmVhZFJlc29sdmUoKSB7Ci0JCQkvLyByZXBsYWNlIHRoaXMgb2JqZWN0IHdpdGggdGhlIHNpbmdsZXRvbgotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JfQotCi0JZmluYWwgY2xhc3MgTWV0YW1vZGVsVG9vbHMgewotCi0JCS8qKgotCQkgKiBUaGUgdHlwZSBtdXN0IGJlOjx1bD4KLQkJICogPGxpPmluIHRoZSBzcGVjaWZpZWQgc291cmNlIGZvbGRlcgotCQkgKiA8bGk+YSB0b3AtbGV2ZWwgdHlwZQotCQkgKiA8bGk+YW5ub3RhdGVkIHdpdGggPGNvZGU+JiM2NDtqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDwvY29kZT4gd2l0aAotCQkgKiAgICAgdGhlIGFwcHJvcHJpYXRlIDxjb2RlPnZhbHVlPC9jb2RlPiBhbmQgPGNvZGU+ZGF0ZTwvY29kZT4KLQkJICogPGxpPmVpdGhlciBpdHNlbGYgb3Igb25lIG9mIGl0cyBuZXN0ZWQgdHlwZXMgYW5ub3RhdGVkIHdpdGgKLQkJICogICAgIDxjb2RlPiYjNjQ7amF2YXgucGVyc2lzdGVuY2UubWV0YW1vZGVsLlN0YXRpY01ldGFtb2RlbDwvY29kZT4KLQkJICogPC91bD4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dlbmVyYXRlZE1ldGFtb2RlbFRvcExldmVsVHlwZShKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhdCwgSVBhY2thZ2VGcmFnbWVudFJvb3Qgc291cmNlRm9sZGVyKSB7Ci0JCQlpZiAoICEganJhdC5pc0luKHNvdXJjZUZvbGRlcikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gaXNHZW5lcmF0ZWRNZXRhbW9kZWxUb3BMZXZlbFR5cGUoanJhdCk7Ci0JCX0KLQotCQkvKioKLQkJICogVGhlIHR5cGUgbXVzdCBiZTo8dWw+Ci0JCSAqIDxsaT5hIHRvcC1sZXZlbCB0eXBlCi0JCSAqIDxsaT5hbm5vdGF0ZWQgd2l0aCA8Y29kZT4mIzY0O2phdmF4LmFubm90YXRpb24uR2VuZXJhdGVkPC9jb2RlPiB3aXRoCi0JCSAqICAgICB0aGUgYXBwcm9wcmlhdGUgPGNvZGU+dmFsdWU8L2NvZGU+IGFuZCA8Y29kZT5kYXRlPC9jb2RlPgotCQkgKiA8bGk+ZWl0aGVyIGl0c2VsZiBvciBvbmUgb2YgaXRzIG5lc3RlZCB0eXBlcyBhbm5vdGF0ZWQgd2l0aAotCQkgKiAgICAgPGNvZGU+JiM2NDtqYXZheC5wZXJzaXN0ZW5jZS5tZXRhbW9kZWwuU3RhdGljTWV0YW1vZGVsPC9jb2RlPgotCQkgKiA8L3VsPgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2VuZXJhdGVkTWV0YW1vZGVsVG9wTGV2ZWxUeXBlKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBqcmF0KSB7Ci0JCQlpZiAoICEgaXNHZW5lcmF0ZWQoanJhdCkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBrbm93IHdlIGhhdmUgYSB0b3AtbGV2ZWwgdHlwZSwgc2luY2Ugb25seSB0b3AtbGV2ZWwKLQkJCS8vIHR5cGVzIGFyZSBhbm5vdGF0ZWQgQEdlbmVyYXRlZDsgbm93IHNlZSBpZiBhbnl0aGluZyBpcyBhIG1ldGFtb2RlbAotCQkJcmV0dXJuIGlzTWV0YW1vZGVsKGpyYXQpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoZSB0eXBlIG11c3QgYmUgYW5ub3RhdGVkIHdpdGgKLQkJICogPGNvZGU+JiM2NDtqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDwvY29kZT4gd2l0aCB0aGUgYXBwcm9wcmlhdGUKLQkJICogPGNvZGU+dmFsdWU8L2NvZGU+IGFuZCA8Y29kZT5kYXRlPC9jb2RlPi4KLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0dlbmVyYXRlZChKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJhdCkgewotCQkJR2VuZXJhdGVkQW5ub3RhdGlvbiBnZW5lcmF0ZWRBbm5vdGF0aW9uID0gKEdlbmVyYXRlZEFubm90YXRpb24pIGpyYXQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQlpZiAoZ2VuZXJhdGVkQW5ub3RhdGlvbiA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJaWYgKGdlbmVyYXRlZEFubm90YXRpb24uZ2V0VmFsdWVzU2l6ZSgpICE9IDEpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoICEgZ2VuZXJhdGVkQW5ub3RhdGlvbi5nZXRWYWx1ZSgwKS5lcXVhbHMoTUVUQU1PREVMX0dFTkVSQVRFRF9BTk5PVEFUSU9OX1ZBTFVFKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGdlbmVyYXRlZEFubm90YXRpb24uZ2V0RGF0ZSgpKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNZXRhbW9kZWwoSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGpyYXQpIHsKLQkJCS8vIGlmIHdlIGdldCBoZXJlIHdlIGtub3cgd2UgaGF2ZSBhIHRvcC1sZXZlbCB0eXBlLCBzaW5jZSBvbmx5IHRvcC1sZXZlbAotCQkJLy8gdHlwZXMgYXJlIGFubm90YXRlZCBAR2VuZXJhdGVkOyBub3cgc2VlIGlmIGFueXRoaW5nIGlzIGEgbWV0YW1vZGVsCi0JCQlmb3IgKEphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSB0eXBlIDoganJhdC5nZXRBbGxUeXBlcygpKSB7Ci0JCQkJaWYgKHR5cGUuZ2V0QW5ub3RhdGlvbihTdGF0aWNNZXRhbW9kZWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA1MDQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLS8qKgotICogSlBBIDIuMAotICogQXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyLgotICogVXNlZCBieSBlbnRpdGllcywgZW1iZWRkZWQgbWFwcGluZ3MsIGFuZCBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZ3MuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAKLQlleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIKLXsKLQlKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seVRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLQotCUpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0KLQlKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgb3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtbiBjb2x1bW4sIFJlYWRPbmx5Sm9pbkNvbHVtbi5Pd25lciBvd25lciwgSm9pbkNvbHVtblRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewotCQlKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIG92ZXJyaWRlLCBSZWFkT25seVRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLQotCQlKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCi0JCUpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uVmFsaWRhdG9yKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBvdmVycmlkZSwgUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvQXR0cmlidXRlTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yzk3OTQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9BdHRyaWJ1dGVNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLQotLyoqCi0gKiBKUEEgMi4wIGF0dHJpYnV0ZSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBBdHRyaWJ1dGVNYXBwaW5nMl8wCi0JZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBDYW5vbmljYWwgTWV0YW1vZGVsIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hcHBpbmcuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBtYXBwaW5nIGlzIG5vdCB0byBiZSBwYXJ0IG9mIHRoZQotCSAqIENhbm9uaWNhbCBNZXRhbW9kZWwuCi0JICovCi0JTWV0YW1vZGVsRmllbGQgZ2V0TWV0YW1vZGVsRmllbGQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWFwcGluZydzIHR5cGUgYXMgdXNlZCBpbiB0aGUgQ2Fub25pY2FsIE1ldGFtb2RlbC4KLQkgKi8KLQlTdHJpbmcgZ2V0TWV0YW1vZGVsVHlwZU5hbWUoKTsKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotCUl0ZXJhYmxlPFN0cmluZz4gU1RBTkRBUkRfTUVUQU1PREVMX0ZJRUxEX01PRElGSUVSUyA9Ci0JCW5ldyBBcnJheUl0ZXJhYmxlPFN0cmluZz4obmV3IFN0cmluZ1tdIHsgInB1YmxpYyIsICJzdGF0aWMiLCAidm9sYXRpbGUiIH0pOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0NhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0NhY2hlYWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJiYzVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9DYWNoZWFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIGNhY2hlYWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2FjaGVhYmxlMl8wCi0JZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZQotewotCWJvb2xlYW4gaXNDYWNoZWFibGUoKTsKLQkKLQlCb29sZWFuIGdldFNwZWNpZmllZENhY2hlYWJsZSgpOwotCXZvaWQgc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4gY2FjaGVhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9DQUNIRUFCTEVfUFJPUEVSVFkgPSAic3BlY2lmaWVkQ2FjaGVhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQotCWJvb2xlYW4gaXNEZWZhdWx0Q2FjaGVhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSA9ICJkZWZhdWx0Q2FjaGVhYmxlIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0NhY2hlYWJsZUhvbGRlcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0NhY2hlYWJsZUhvbGRlcjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGQwMzUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9DYWNoZWFibGVIb2xkZXIyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotCi0vKioKLSAqIGNhY2hlYWJsZSBob2xkZXIvcGFyZW50Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoZWFibGVIb2xkZXIyXzAKLQlleHRlbmRzIEpwYUNvbnRleHROb2RlCi17Ci0JQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpOwotCi0JYm9vbGVhbiBjYWxjdWxhdGVEZWZhdWx0Q2FjaGVhYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvQ2FzY2FkZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0Nhc2NhZGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJiMGNiNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvQ2FzY2FkZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLQotLyoqCi0gKiBKUEEgMi4wIGNhc2NhZGUgKHBlcnNpc3QsIG1lcmdlLCByZW1vdmUsIHJlZnJlc2gsIGRldGFjaCkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENhc2NhZGUyXzAKLQlleHRlbmRzIENhc2NhZGUKLXsJCi0JYm9vbGVhbiBpc0RldGFjaCgpOwotCXZvaWQgc2V0RGV0YWNoKGJvb2xlYW4gdmFsdWUpOwotCQlTdHJpbmcgREVUQUNIX1BST1BFUlRZID0gImRldGFjaCI7IC8vJE5PTi1OTFMtMSQJCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvQ29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9Db2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWQ4YTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9Db2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLQotLyoqCi0gKiBKUEEgMi4wIGNvbGxlY3Rpb24gbWFwcGluZyAoZS5nLiAxOm0sIG06bSwgZWxlbWVudCBjb2xsZWN0aW9uKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvbk1hcHBpbmcyXzAKLQlleHRlbmRzIENvbGxlY3Rpb25NYXBwaW5nLCBBdHRyaWJ1dGVNYXBwaW5nMl8wLCBDb252ZXJ0aWJsZUtleU1hcHBpbmcyXzAKLXsKLQkvLyAqKioqKioqKioqIG1hcCBrZXkgY2xhc3MgKioqKioqKioqKgotCQotCVN0cmluZyBnZXRNYXBLZXlDbGFzcygpOwotCi0JU3RyaW5nIGdldFNwZWNpZmllZE1hcEtleUNsYXNzKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhTdHJpbmcgdmFsdWUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFkgPSAic3BlY2lmaWVkTWFwS2V5Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCk7Ci0JCVN0cmluZyBERUZBVUxUX01BUF9LRVlfQ0xBU1NfUFJPUEVSVFkgPSAiZGVmYXVsdE1hcEtleUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIG1hcCBrZXkKLQkgKiBjbGFzcyB7QGxpbmsgSVR5cGV9LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGUjZ2V0RnVsbHlRdWFsaWZpZWROYW1lKGNoYXIpCi0JICovCi0JY2hhciBnZXRNYXBLZXlDbGFzc0VuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIElUeXBlfSB0aGF0IGlzIHJlc29sdmVkIGZyb20gdGhlIG1hcCBrZXkgY2xhc3MgbmFtZQotCSAqIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JSVR5cGUgZ2V0TWFwS2V5Q2xhc3NKZHRUeXBlKCk7Ci0KLQotCS8vICoqKioqKioqKiogbWFwIGtleSBjb2x1bW4gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXAga2V5IGNvbHVtbiBmb3IgdGhpcyBjb2xsZWN0aW9uIG1hcHBpbmcuCi0JICovCi0JQ29sdW1uIGdldE1hcEtleUNvbHVtbigpOwotCi0JQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCS8vICoqKioqKioqKiogbWFwIGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXAga2V5IGpvaW4gY29sdW1ucyB3aGV0aGVyIHNwZWNpZmllZCBvciBkZWZhdWx0LgotCSAqLwotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uPiBnZXRNYXBLZXlKb2luQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgbWFwIGtleSBqb2luIGNvbHVtbnMsIHdoZXRoZXIgc3BlY2lmaWVkIGFuZCBkZWZhdWx0LgotCSAqLwotCWludCBnZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBzcGVjaWZpZWQgbWFwIGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ2hhbmdlIG5vdGlmaWNhdGlvbiBpZGVudGlmaWVyIGZvciAic3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMiIGxpc3QKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX01BUF9LRVlfSk9JTl9DT0xVTU5TX0xJU1QgPSAic3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBtYXAga2V5IGpvaW4gY29sdW1ucy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zLgotCSAqLwotCWludCBnZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtYXBwaW5nIGhhcyBhbnkgc3BlY2lmaWVkIG1hcCBrZXkgam9pbiBjb2x1bW5zLgotCSAqIChFcXVpdmFsZW50IHRvIHtAbGluayAjZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCl9ICE9IDAuKQotCSAqLwotCWJvb2xlYW4gaGFzU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIG1hcCBrZXkgam9pbiBjb2x1bW4gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLQkgKi8KLQlKb2luQ29sdW1uIGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEFkZCBhIHNwZWNpZmllZCBtYXAga2V5IGpvaW4gY29sdW1uIHRvIHRoZSByZWxhdGlvbnNoaXAuCi0JICovCi0JSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBBZGQgYSBzcGVjaWZpZWQgbWFwIGtleSBqb2luIGNvbHVtbiB0byB0aGUgcmVsYXRpb25zaGlwLgotCSAqLwotCUpvaW5Db2x1bW4gYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWFwIGtleSBqb2luIGNvbHVtbi4KLQkgKi8KLQl2b2lkIHJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgc3BlY2lmaWVkIG1hcCBrZXkgam9pbiBjb2x1bW4uCi0JICovCi0Jdm9pZCByZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKEpvaW5Db2x1bW4gam9pbkNvbHVtbik7Ci0KLQkvKioKLQkgKiBNb3ZlIHRoZSBzcGVjaWZpZWQgbWFwIGtleSBqb2luIGNvbHVtbiBmcm9tIHRoZSBzb3VyY2UgaW5kZXggdG8gdGhlIHRhcmdldCBpbmRleC4KLQkgKi8KLQl2b2lkIG1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCi0JLy8gKioqKioqKioqKiBkZWZhdWx0IG1hcCBrZXkgam9pbiBjb2x1bW4gKioqKioqKioqKgotCi0JLyoqCi0JICogQ2hhbmdlIG5vdGlmaWNhdGlvbiBpZGVudGlmaWVyIGZvciAiZGVmYXVsdE1hcEtleUpvaW5Db2x1bW4iIHByb3BlcnR5Ci0JICovCi0JU3RyaW5nIERFRkFVTFRfTUFQX0tFWV9KT0lOX0NPTFVNTl9QUk9QRVJUWSA9ICJkZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBtYXAga2V5IGpvaW4gY29sdW1uLiBJZiB0aGVyZSBhcmUgc3BlY2lmaWVkIG1hcCBrZXkgam9pbgotCSAqIGNvbHVtbnMsIHRoZXJlIGlzIG5vIGRlZmF1bHQgam9pbiBjb2x1bW4uIFRoZXJlIGFyZSBhbHNvCi0JICogdGltZXMgdGhhdCB0aGVyZSBtYXkgYmUgbm8gZGVmYXVsdCBtYXAga2V5IGpvaW4gY29sdW1uIGV2ZW4gaWYgdGhlcmUgYXJlIG5vCi0JICogc3BlY2lmaWVkIG1hcCBrZXkgam9pbiBjb2x1bW5zLgotCSAqLwotCUpvaW5Db2x1bW4gZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0NvbGxlY3Rpb25UYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0NvbGxlY3Rpb25UYWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc4NDEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9Db2xsZWN0aW9uVGFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlZmVyZW5jZVRhYmxlOwotCi0vKioKLSAqIFVzZWQgYnkgZWxlbWVudCBjb2xsZWN0aW9uIG1hcHBpbmdzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sbGVjdGlvblRhYmxlMl8wCi0JZXh0ZW5kcyBSZWZlcmVuY2VUYWJsZQotewotCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBnZXRQYXJlbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9Db252ZXJ0aWJsZUtleU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9Db252ZXJ0aWJsZUtleU1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM1YWVjNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvQ29udmVydGlibGVLZXlNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLQotLyoqCi0gKiBKUEEgYXR0cmlidXRlIG1hcHBpbmcgdGhhdCBoYXMgYSBtYXAga2V5IGNvbnZlcnRlciAoSlBBIDIuMCBjb2xsZWN0aW9uIG1hcHBpbmdzKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBDb252ZXJ0aWJsZUtleU1hcHBpbmcyXzAKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcyXzAKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcncyBrZXkgY29udmVydGVyLiBOZXZlciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlDb252ZXJ0ZXIgZ2V0TWFwS2V5Q29udmVydGVyKCk7Ci0JCVN0cmluZyBNQVBfS0VZX0NPTlZFUlRFUl9QUk9QRVJUWSA9ICJtYXBLZXlDb252ZXJ0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIGtleSBjb252ZXJ0ZXIgdHlwZSwgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlCi0JICogbW9kZWwgYW5kIHJlbW92aW5nIGFueSBvdGhlciBjb252ZXJ0ZXJzLiBDbGVhciBhbGwgY29udmVydGVycyBpZiB0aGUKLQkgKiBzcGVjaWZpZWQgdHlwZSBpcyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQl2b2lkIHNldE1hcEtleUNvbnZlcnRlcihDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9EZXJpdmFibGVJZE1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9EZXJpdmFibGVJZE1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZTRhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvRGVyaXZhYmxlSWRNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLS8qKgotICogSlBBIDIuMCBhdHRyaWJ1dGUgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZXJpdmFibGVJZE1hcHBpbmcyXzAKLQlleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmcyXzAKLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgSUQgKG9yIGVtYmVkZGVkIElEKSBtYXBwaW5nIGlzIGRlcml2ZWQgZnJvbSBhCi0JICogcmVsYXRpb25zaGlwOyBpLmUuIGEgcmVsYXRpb25zaGlwIG1hcHMgdGhlIElEIHVzaW5nIHRoZQotCSAqIDxjb2RlPkBNYXBzSWQ8L2NvZGU+IGFubm90YXRpb24uCi0JICogPHA+Ci0JICogPHN0cm9uZz5OQjo8L3N0cm9uZz4gVGhlcmUgY2FuIGJlIHNldmVyYWwgcmVsYXRpb25zaGlwcyB0aGF0IG1hcCB0aGUgSUQKLQkgKiAoZXJyb25lb3VzbHksIG9mIGNvdXJzZSkuCi0JICovCi0JYm9vbGVhbiBpc0Rlcml2ZWQoKTsKLQotCS8qKgotCSAqIFByb3BlcnR5IHN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVyaXZhYmxlIGZsYWcuCi0JICovCi0JZmluYWwgU3RyaW5nIERFUklWRURfUFJPUEVSVFkgPSAiZGVyaXZlZCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9EZXJpdmVkSWRlbnRpdHkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9EZXJpdmVkSWRlbnRpdHkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY2YzBjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvRGVyaXZlZElkZW50aXR5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBEZXJpdmVkIGlkZW50aXR5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcml2ZWRJZGVudGl0eTJfMAotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLS8vIFRPRE8gYmp2IHJlbmFtZSBtZXRob2RzCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhc3NvY2lhdGVkIHNpbmdsZSByZWxhdGlvbnNoaXAgbWFwcGluZy4KLQkgKi8KLQlTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wIGdldE1hcHBpbmcoKTsKLQotCS8vICoqKioqKioqKiogcHJlZG9taW5hbnQgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBwcmVkb21pbmFudCBkZXJpdmVkIGlkZW50aXR5Ci0JICogc3RyYXRlZ3kgcHJvcGVydHkuCi0JICovCi0JU3RyaW5nIFBSRURPTUlOQU5UX0RFUklWRURfSURFTlRJVFlfU1RSQVRFR1lfUFJPUEVSVFkgPSAicHJlZG9taW5hbnREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcncyBwcmVkb21pbmFudCBzdHJhdGVneS4KLQkgKi8KLQlEZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBnZXRQcmVkb21pbmFudERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0KLQotCS8vICoqKioqKioqKiogbnVsbCBzdHJhdGVneSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFwcGluZyBoYXMgbm8gc3RyYXRlZ3kuCi0JICovCi0JYm9vbGVhbiB1c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmUgdGhlIG1hcHBpbmcgc28gaXQgaGFzIG5vIHN0cmF0ZWd5LgotCSAqIFRoaXMgd2lsbCByZW1vdmUgYWxsIG90aGVyIHN0cmF0ZWdpZXMuCi0JICovCi0Jdm9pZCBzZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQotCi0JLy8gKioqKioqKioqKiBJRCBzdHJhdGVneSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcncyBJRCBzdHJhdGVneS4KLQkgKi8KLQlJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBtYXBwaW5nIHVzZXMgYW4gSUQgc3RyYXRlZ3kuCi0JICovCi0JYm9vbGVhbiB1c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCi0JLyoqCi0JICogQ29uZmlndXJlIHRoZSBtYXBwaW5nIHNvIGl0IGhhcyBhbiBJRCBzdHJhdGVneS4KLQkgKiBUaGlzIHdpbGwgcmVtb3ZlIGFsbCBvdGhlciBzdHJhdGVnaWVzLgotCSAqLwotCXZvaWQgc2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCi0KLQkvLyAqKioqKioqKioqIG1hcHMgSUQgc3RyYXRlZ3kgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nJ3MgIm1hcHMgSUQiIHN0cmF0ZWd5LgotCSAqLwotCU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgbWFwcGluZyB1c2VzIGEgIm1hcHMgSUQiIHN0cmF0ZWd5LgotCSAqLwotCWJvb2xlYW4gdXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0KLQkvKioKLQkgKiBDb25maWd1cmUgdGhlIG1hcHBpbmcgc28gaXQgaGFzIGEgIm1hcHMgSUQiIHN0cmF0ZWd5LgotCSAqIFRoaXMgd2lsbCByZW1vdmUgYWxsIG90aGVyIHN0cmF0ZWdpZXMuCi0JICovCi0Jdm9pZCBzZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9EZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZkZmVhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9EZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLQotLyoqCi0gKiBEZXJpdmVkIGlkZW50aXR5IHN0cmF0ZWd5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBEZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMAotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3RyYXRlZ3kgaXMgc3BlY2lmaWVkIG9uIHRoZSByZXNvdXJjZSBtb2RlbC4KLQkgKi8KLQlib29sZWFuIGlzU3BlY2lmaWVkKCk7Ci0JCi0JLyoqCi0JICogQWRkIHRoaXMgc3RyYXRlZ3kgdG8gdGhlIHJlbGF0aW9uc2hpcCByZWZlcmVuY2UuCi0JICovCi0Jdm9pZCBhZGRTdHJhdGVneSgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGlzIHN0cmF0ZWd5IGZyb20gdGhlIHJlbGF0aW9uc2hpcCByZWZlcmVuY2UuCi0JICovCi0Jdm9pZCByZW1vdmVTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjBmMDgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLQotLyoqCi0gKiBKUEEgMi4wIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotCWV4dGVuZHMgQ29sbGVjdGlvbk1hcHBpbmcyXzAsIENvbnZlcnRpYmxlTWFwcGluZwotewotCS8qKgotCSAqIFJldHVybiB0aGUgZW50aXR5IHRoYXQgb3ducyB0aGUgbWFwcGluZy4gVGhpcyBpcwotCSAqIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjYWxscyB7QGxpbmsgI2dldFR5cGVNYXBwaW5nKCl9IGFuZCByZXR1cm5zCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90IGFuIHtAbGluayBFbnRpdHl9LgotCSAqLwotCUVudGl0eSBnZXRFbnRpdHkoKTsKLQotCi0JLy8gKioqKioqKioqKiB0YXJnZXQgY2xhc3MgKioqKioqKioqKgotCi0JU3RyaW5nIGdldFRhcmdldENsYXNzKCk7Ci0KLQlTdHJpbmcgZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKTsKLQl2b2lkIHNldFNwZWNpZmllZFRhcmdldENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfVEFSR0VUX0NMQVNTX1BST1BFUlRZID0gInNwZWNpZmllZFRhcmdldENsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIGdldERlZmF1bHRUYXJnZXRDbGFzcygpOwotCQlTdHJpbmcgREVGQVVMVF9UQVJHRVRfQ0xBU1NfUFJPUEVSVFkgPSAiZGVmYXVsdFRhcmdldENsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBmb3IgYnJvd3Npbmcgb3IgY3JlYXRpbmcgdGhlIHRhcmdldAotCSAqIGNsYXNzIHtAbGluayBJVHlwZX0uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSNnZXRGdWxseVF1YWxpZmllZE5hbWUoY2hhcikKLQkgKi8KLQljaGFyIGdldFRhcmdldENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgSVR5cGV9IHRoYXQgaXMgcmVzb2x2ZWQgZnJvbSB0aGUgdGFyZ2V0IGNsYXNzIG5hbWUKLQkgKiBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCUlUeXBlIGdldFRhcmdldENsYXNzSmR0VHlwZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbGxlY3Rpb24gdGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBtYXBwaW5nJ3MgY29sbGVjdGlvbiB0YWJsZS4KLQkgKiBUaGlzIHdpbGwgbm90IGJlIG51bGwuCi0JICovCi0JQ29sbGVjdGlvblRhYmxlMl8wIGdldENvbGxlY3Rpb25UYWJsZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHZhbHVlIGNvbHVtbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG1hcHBpbmcncyB2YWx1ZSBjb2x1bW4uCi0JICovCi0JQ29sdW1uIGdldFZhbHVlQ29sdW1uKCk7Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGUgY29udGFpbmVycyAqKioqKioqKioqCi0KLQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBnZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGdldFZhbHVlQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0VtYmVkZGVkSWRNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvRW1iZWRkZWRJZE1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzODkzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvRW1iZWRkZWRJZE1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotCi0vKioKLSAqIEpQQSAyLjAgZW1iZWRkZWQgSUQgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRJZE1hcHBpbmcyXzAKLQlleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nLCBEZXJpdmFibGVJZE1hcHBpbmcyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0VtYmVkZGVkTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0VtYmVkZGVkTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2Q0N2E2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9FbWJlZGRlZE1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotCi0vKioKLSAqIEpQQSAyLjAgZW1iZWRkZWQgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLSBwdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkTWFwcGluZzJfMAotCWV4dGVuZHMgRW1iZWRkZWRNYXBwaW5nLCBBdHRyaWJ1dGVNYXBwaW5nMl8wCi17Ci0JQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmM2ZlNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLS8qKgotICogSUQgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMAotCWV4dGVuZHMgRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAKLXsKLQkvKioKLQkgKiBTdHJpbmcgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHZhbHVlIHByb3BlcnR5IG9mIHRoaXMgb2JqZWN0Ci0JICovCi0JU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoaXMgb2JqZWN0IHVzZXMgYSBkZXJpdmVkIGlkCi0JICovCi0JYm9vbGVhbiBnZXRWYWx1ZSgpOwotCQotCS8qKgotCSAqIFNldCB3aGV0aGVyIHRoaXMgb2JqZWN0IHVzZXMgYSBkZXJpdmVkIGlkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShib29sZWFuIHZhbHVlKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9JZE1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9JZE1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmZjhkYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvSWRNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci0KLS8qKgotICogSlBBIDIuMCBJRCBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBJZE1hcHBpbmcyXzAKLQlleHRlbmRzIElkTWFwcGluZywgRGVyaXZhYmxlSWRNYXBwaW5nMl8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9KcGFSb290Q29udGV4dE5vZGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9KcGFSb290Q29udGV4dE5vZGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NkN2RkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvSnBhUm9vdENvbnRleHROb2RlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWV0YW1vZGVsU3luY2hyb25pemVyOwotCi0vKioKLSAqIFJvb3Qgb2YgdGhlIERhbGkgSlBBIDIuMCBjb250ZXh0IG1vZGVsLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUm9vdENvbnRleHROb2RlMl8wCi0JZXh0ZW5kcyBKcGFSb290Q29udGV4dE5vZGUsIE1ldGFtb2RlbFN5bmNocm9uaXplcgotewotCS8vIG5vdGhpbmcgeWV0Li4uCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTG9ja01vZGVUeXBlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTG9ja01vZGVUeXBlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ODI2YTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L0xvY2tNb2RlVHlwZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi0vKioKLSAqIExvY2tNb2RlIFR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgZW51bSBMb2NrTW9kZVR5cGUyXzAgewotCi0JUkVBRCgKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wLlJFQUQsCi0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wLlJFQUQKLQkJKSwKLQlXUklURSgKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wLldSSVRFLAotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMC5XUklURQotCQkpLAotCU9QVElNSVNUSUMoCi0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTG9ja01vZGVUeXBlXzJfMC5PUFRJTUlTVElDLAotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMC5PUFRJTUlTVElDCi0JCSksCi0JT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQoCi0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTG9ja01vZGVUeXBlXzJfMC5PUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCwKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAuT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQKLQkJKSwKLQlQRVNTSU1JU1RJQ19SRUFEKAotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkxvY2tNb2RlVHlwZV8yXzAuUEVTU0lNSVNUSUNfUkVBRCwKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAuUEVTU0lNSVNUSUNfUkVBRAotCQkpLAotCVBFU1NJTUlTVElDX1dSSVRFKAotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkxvY2tNb2RlVHlwZV8yXzAuUEVTU0lNSVNUSUNfV1JJVEUsCi0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wLlBFU1NJTUlTVElDX1dSSVRFCi0JCSksCi0JUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UKAotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkxvY2tNb2RlVHlwZV8yXzAuUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULAotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMC5QRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQKLQkJKSwKLQlOT05FKAotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkxvY2tNb2RlVHlwZV8yXzAuTk9ORSwKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAuTk9ORQotCQkpOwotCi0KLQlwcml2YXRlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTG9ja01vZGVUeXBlXzJfMCBqYXZhTG9ja01vZGVUeXBlOwotCXByaXZhdGUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAgb3JtTG9ja01vZGVUeXBlOwotCi0JTG9ja01vZGVUeXBlMl8wKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTG9ja01vZGVUeXBlXzJfMCBqYXZhTG9ja01vZGVUeXBlLCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMCBvcm1Mb2NrTW9kZVR5cGUpIHsKLQkJaWYgKGphdmFMb2NrTW9kZVR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJaWYgKG9ybUxvY2tNb2RlVHlwZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFMb2NrTW9kZVR5cGUgPSBqYXZhTG9ja01vZGVUeXBlOwotCQl0aGlzLm9ybUxvY2tNb2RlVHlwZSA9IG9ybUxvY2tNb2RlVHlwZTsKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wIGdldEphdmFMb2NrTW9kZVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFMb2NrTW9kZVR5cGU7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wIGdldE9ybUxvY2tNb2RlVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMub3JtTG9ja01vZGVUeXBlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIExvY2tNb2RlVHlwZTJfMCBmcm9tSmF2YVJlc291cmNlTW9kZWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wIGphdmFMb2NrTW9kZVR5cGUpIHsKLQkJcmV0dXJuIChqYXZhTG9ja01vZGVUeXBlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhUmVzb3VyY2VNb2RlbF8oamF2YUxvY2tNb2RlVHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTG9ja01vZGVUeXBlMl8wIGZyb21KYXZhUmVzb3VyY2VNb2RlbF8ob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wIGphdmFMb2NrTW9kZVR5cGUpIHsKLQkJZm9yIChMb2NrTW9kZVR5cGUyXzAgbG9ja01vZGVUeXBlIDogTG9ja01vZGVUeXBlMl8wLnZhbHVlcygpKSB7Ci0JCQlpZiAobG9ja01vZGVUeXBlLmdldEphdmFMb2NrTW9kZVR5cGUoKSA9PSBqYXZhTG9ja01vZGVUeXBlKSB7Ci0JCQkJcmV0dXJuIGxvY2tNb2RlVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTG9ja01vZGVUeXBlXzJfMCB0b0phdmFSZXNvdXJjZU1vZGVsKExvY2tNb2RlVHlwZTJfMCBsb2NrTW9kZVR5cGUpIHsKLQkJcmV0dXJuIChsb2NrTW9kZVR5cGUgPT0gbnVsbCkgPyBudWxsIDogbG9ja01vZGVUeXBlLmdldEphdmFMb2NrTW9kZVR5cGUoKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgTG9ja01vZGVUeXBlMl8wIGZyb21Pcm1SZXNvdXJjZU1vZGVsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wIG9ybUxvY2tNb2RlVHlwZSkgewotCQlyZXR1cm4gKG9ybUxvY2tNb2RlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tT3JtUmVzb3VyY2VNb2RlbF8ob3JtTG9ja01vZGVUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBMb2NrTW9kZVR5cGUyXzAgZnJvbU9ybVJlc291cmNlTW9kZWxfKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wIG9ybUxvY2tNb2RlVHlwZSkgewotCQlmb3IgKExvY2tNb2RlVHlwZTJfMCBsb2NrTW9kZVR5cGUgOiBMb2NrTW9kZVR5cGUyXzAudmFsdWVzKCkpIHsKLQkJCWlmIChsb2NrTW9kZVR5cGUuZ2V0T3JtTG9ja01vZGVUeXBlKCkgPT0gb3JtTG9ja01vZGVUeXBlKSB7Ci0JCQkJcmV0dXJuIGxvY2tNb2RlVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wIHRvT3JtUmVzb3VyY2VNb2RlbChMb2NrTW9kZVR5cGUyXzAgbG9ja01vZGVUeXBlKSB7Ci0JCXJldHVybiAobG9ja01vZGVUeXBlID09IG51bGwpID8gbnVsbCA6IGxvY2tNb2RlVHlwZS5nZXRPcm1Mb2NrTW9kZVR5cGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NYW55VG9NYW55TWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hbnlUb01hbnlNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDk1YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hbnlUb01hbnlNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEpQQSAyLjAgbTptIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb01hbnlNYXBwaW5nMl8wCi0JZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZywgQ29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQlNYW55VG9NYW55UmVsYXRpb25zaGlwIGdldFJlbGF0aW9uc2hpcCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hbnlUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NYW55VG9PbmVNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NWQ4OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hbnlUb09uZU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEpQQSAyLjAgbToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb09uZU1hcHBpbmcyXzAKLQlleHRlbmRzIE1hbnlUb09uZU1hcHBpbmcsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAKLXsKLQlNYW55VG9PbmVSZWxhdGlvbnNoaXAgZ2V0UmVsYXRpb25zaGlwKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWFueVRvT25lUmVsYXRpb25zaGlwMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWFueVRvT25lUmVsYXRpb25zaGlwMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZTEwMzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hbnlUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEpQQSAyLjAgbToxIHJlbGF0aW9uc2hpcCAobWFwcGVkIGJ5LCBqb2luIGNvbHVtbiwgam9pbiB0YWJsZSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMAotCWV4dGVuZHMgTWFueVRvT25lUmVsYXRpb25zaGlwLCBKb2luVGFibGVSZWxhdGlvbnNoaXAKLXsKLQkvLyBhZGQgam9pbiB0YWJsZSBzdXBwb3J0IHRvIEpQQSAxLjAgbToxCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhYTZmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGluZ0ZpbGVQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQotLyoqCi0gKiBKUEEgMi4wIFBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMgaGVsZCBieSBhIG1hcHBpbmcgZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzAKLQlleHRlbmRzIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhbGwgdGhlIGRhdGFiYXNlIGlkZW50aWZpZXJzIGluIHRoZQotCSAqIHBlcnNpc3RlbmNlIHVuaXQgYXJlIHRvIGJlIGNvbnNpZGVyZWQgZGVsaW1pdGVkLgotCSAqLwotCWJvb2xlYW4gaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MTJjMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0KLS8qKgotICogSlBBIDIuMAotICogUGVyc2lzdGVuY2UgdW5pdCBtZXRhZGF0YSBoZWxkIGJ5IGEgbWFwcGluZyBmaWxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhMl8wCi0JZXh0ZW5kcyBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi17Ci0JLyoqCi0JICogUmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgdGhlIG1hcHBpbmcgZmlsZSdzIHBlcnNpc3RlbmNlIHVuaXQuCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZTUzNDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBpbmdSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotCi0vKioKLSAqIFN0cmF0ZWd5IGRlc2NyaWJpbmcgaG93IHR3byBlbnRpdGllcyBhcmUgam9pbmVkIHZpYSBhCi0gKiB7QGxpbmsgUmVsYXRpb25zaGlwTWFwcGluZ306PHVsPgotICogPGxpPmpvaW4gY29sdW1uCi0gKiA8bGk+am9pbiB0YWJsZQotICogPGxpPiJtYXBwZWQgYnkiCi0gKiA8bGk+cHJpbWFyeSBrZXkgam9pbiBjb2x1bW4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBSZWxhdGlvbnNoaXBNYXBwaW5nCi0gKiBAc2VlIEFzc29jaWF0aW9uT3ZlcnJpZGUKLSAqIEBzZWUgTWFwcGluZ1JlbGF0aW9uc2hpcAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotCWV4dGVuZHMgUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQkvKioKLQkgKiBTZWxlY3QgZnJvbSB0aGUgc3BlY2lmaWVkIG92ZXJyaWRlIHJlbGF0aW9uc2hpcCB3aGljaCBvZiBpdHMgc3RyYXRlZ2llcwotCSAqIGlzIHRoZSBvdmVycmlkZSBzdHJhdGVneSAoPGVtPmpvaW4gY29sdW1uPC9lbT4gb3IgPGVtPmpvaW4gdGFibGU8L2VtPikuCi0JICogQW4gYXNzb2NpYXRpb24gb3ZlcnJpZGUgY2FuIG9ubHkgb3ZlcnJpZGUgdGhlIHNhbWUgc3RyYXRlZ3kgYXMgdGhlCi0JICogc3RyYXRlZ3kgdXNlZCBieSBpdHMgb3ZlcnJpZGRlbiBtYXBwaW5nIChpLmUuIGlmIHRoZSBvdmVycmlkZGVuIG1hcHBpbmcKLQkgKiB1c2VzIHRoZSA8ZW0+am9pbiBjb2x1bW48L2VtPiBzdHJhdGVneSwgdGhlIGFzc29jaWF0aW9uIG92ZXJyaWRlIG11c3QKLQkgKiBhbHNvIHVzZSB0aGUgPGVtPmpvaW4gY29sdW1uPC9lbT4gc3RyYXRlZ3k7IGl0IGNhbm5vdCBjaGFuZ2UgdGhlIHN0cmF0ZWd5Ci0JICogdG8gPGVtPmpvaW4gdGFibGU8L2VtPikuCi0JICogCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBvdmVycmlkZSByZWxhdGlvbnNoaXAgY2Fubm90IGJlCi0JICogZGV0ZXJtaW5lZCAodHlwaWNhbGx5IGJlY2F1c2UgdGhlIGFzc29jaWF0aW9uIG92ZXJyaWRlJ3MgbmFtZSBkb2VzIG5vdAotCSAqIG1hdGNoIHRoZSBuYW1lIG9mIGFuIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZSBtYXBwaW5nIGluIHRoZSBvdmVycmlkZGVuCi0JICogbWFwcGVkIHN1cGVyY2xhc3Mgb3IgZW1iZWRkYWJsZSB0eXBlKS4KLQkgKi8KLQlSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHNlbGVjdE92ZXJyaWRlU3RyYXRlZ3koUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCBvdmVycmlkZVJlbGF0aW9uc2hpcCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2QzN2JhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotCi0vKioKLSAqIE1hcHMgSUQgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAKLQlleHRlbmRzIERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wCi17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgSUQgYXR0cmlidXRlIG5hbWUgb3IsIGluIGl0cyBhYnNlbmNlLCB0aGUgZGVmYXVsdAotCSAqIElEIGF0dHJpYnV0ZSBuYW1lLiBUaGlzIHRoZSBuYW1lIG9mIHRoZSBJRCBhdHRyaWJ1dGUgdGhlIHJlbGF0aW9uc2hpcAotCSAqIG1hcHBpbmcgYWxzbyBtYXBzIChlLmcuIGEgQ2hpbGQncyBwYXJlbnQgbWFwcGluZyBhbHNvIG1hcHMgcGFydCBvZgotCSAqIHRoZSBDaGlsZCdzIHByaW1hcnkga2V5LCB0aGUgcGFyZW50IElEKS4KLQkgKi8KLQlTdHJpbmcgZ2V0SWRBdHRyaWJ1dGVOYW1lKCk7Ci0JCi0JLyoqCi0JICogU3RyaW5nIGFzc29jaWF0ZWQgd2l0aCBjaGFuZ2VzIHRvIHRoZSBzcGVjaWZpZWQgSUQgYXR0cmlidXRlIG5hbWUgcHJvcGVydHkuCi0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9JRF9BVFRSSUJVVEVfTkFNRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgSUQgYXR0cmlidXRlIG5hbWUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIG5hbWUgaXMgc3BlY2lmaWVkLgotCSAqLwotCVN0cmluZyBnZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKTsKLQkKLQkvKioKLQkgKiBTZXQgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShTdHJpbmcgaWRBdHRyaWJ1dGVOYW1lKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBhIGRlZmF1bHQgdmFsdWUgaXMgZXZlciB1c2VkLgotCSAqIChJbiBzb21lIGNhc2VzLCB0aGVyZSBjYW4gYmUgbm8gZGVmYXVsdC4pCi0JICovCi0JYm9vbGVhbiBkZWZhdWx0SWRBdHRyaWJ1dGVOYW1lSXNQb3NzaWJsZSgpOwotCQotCS8qKgotCSAqIFN0cmluZyBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgZGVmYXVsdCBJRCBhdHRyaWJ1dGUgbmFtZSBwcm9wZXJ0eS4KLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9JRF9BVFRSSUJVVEVfTkFNRV9QUk9QRVJUWSA9ICJkZWZhdWx0SWRBdHRyaWJ1dGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBJRCBhdHRyaWJ1dGUgbmFtZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdElkQXR0cmlidXRlTmFtZSgpOwotCQotCS8qKgotCSAqIFJldHVybiBhIHNvcnRlZCBsaXN0IG9mIGNhbmRpZGF0ZSBJRCBhdHRyaWJ1dGUgbmFtZXMuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYW5kaWRhdGVJZEF0dHJpYnV0ZU5hbWVzKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGF0dHJpYnV0ZSBtYXBwaW5nIHJlZmVyZW5jZWQgYnkgdGhlIElEIGF0dHJpYnV0ZSBuYW1lLAotCSAqIHdoaWNoIG1heSBiZSBhIG1hcHBpbmcgb24gdGhlIGVudGl0eQotCSAqIG9yIGEgbWFwcGluZyB3aXRoaW4gdGhlIGVtYmVkZGFibGUgbWFwcGluZyByZWZlcmVuY2VkIGJ5IHRoZSBlbnRpdHkncwotCSAqIGVtYmVkZGVkIElEIG1hcHBpbmcuCi0JICovCi0JQXR0cmlidXRlTWFwcGluZyBnZXREZXJpdmVkSWRBdHRyaWJ1dGVNYXBwaW5nKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvTWV0YW1vZGVsRmllbGQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NZXRhbW9kZWxGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY4YjgyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NZXRhbW9kZWxGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi0vKioKLSAqIEpQQSAyLjAgQ2Fub25pY2FsIE1ldGFtb2RlbCBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGEgcGVyc2lzdGVudCBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhbW9kZWxGaWVsZCB7Ci0KLQlJdGVyYWJsZTxTdHJpbmc+IGdldE1vZGlmaWVycygpOwotCi0JU3RyaW5nIGdldFR5cGVOYW1lKCk7Ci0KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFR5cGVBcmd1bWVudE5hbWVzKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JU3RyaW5nIERFRkFVTFRfVFlQRV9OQU1FID0gamF2YS5sYW5nLk9iamVjdC5jbGFzcy5nZXROYW1lKCk7ICAvLyA/Pz8KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01ldGFtb2RlbFNvdXJjZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9NZXRhbW9kZWxTb3VyY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYjU2NWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L01ldGFtb2RlbFNvdXJjZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LkJvZHlTb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogSlBBIDIuMCBtZXRhbW9kZWwgc291cmNlIHR5cGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXRhbW9kZWxTb3VyY2VUeXBlIHsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc291cmNlIHR5cGUncyBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc291cmNlIHR5cGUgaXMgIm1hbmFnZWQiIChpLmUuIHBlcnNpc3RlbnQpLgotCSAqLwotCWJvb2xlYW4gaXNNYW5hZ2VkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSB0eXBlJ3Mgc3VwZXIgdHlwZS4KLQkgKi8KLQlQZXJzaXN0ZW50VHlwZSBnZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSB0eXBlJ3MgYXR0cmlidXRlcy4KLQkgKi8KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWxlIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgbWV0YW1vZGVsIHN5bmNocm9uaXphdGlvbi4KLQkgKi8KLQlJRmlsZSBnZXRNZXRhbW9kZWxGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNvdXJjZSB0eXBlJ3MgSlBBIHByb2plY3QuCi0JICovCi0JSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCk7Ci0KLQkvKioKLQkgKiBTeW5jaHJvbml6ZSB0aGUgc291cmNlIHR5cGUncyBtZXRhbW9kZWwsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHR5cGUKLQkgKiB0cmVlLgotCSAqLwotCXZvaWQgc3luY2hyb25pemVNZXRhbW9kZWwoTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUpOwotCi0JLyoqCi0JICogUHJpbnQgdGhlIGJvZHkgb2YgdGhlIHNvdXJjZSB0eXBlJ3MgbWV0YW1vZGVsIGNsYXNzIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiB3cml0ZXIsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHR5cGUgdHJlZS4KLQkgKi8KLQl2b2lkIHByaW50Qm9keVNvdXJjZU9uKEJvZHlTb3VyY2VXcml0ZXIgcHcsIE1hcDxTdHJpbmcsIENvbGxlY3Rpb248TWV0YW1vZGVsU291cmNlVHlwZT4+IG1lbWJlclR5cGVUcmVlKTsKLQotCi0JLyoqCi0JICoge0BsaW5rIENvbXBhcmF0b3J9IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29tcGFyZSBzb3VyY2UgdHlwZXMuCi0JICovCi0JQ29tcGFyYXRvcjxNZXRhbW9kZWxTb3VyY2VUeXBlPiBDT01QQVJBVE9SID0KLQkJCW5ldyBDb21wYXJhdG9yPE1ldGFtb2RlbFNvdXJjZVR5cGU+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShNZXRhbW9kZWxTb3VyY2VUeXBlIHR5cGUxLCBNZXRhbW9kZWxTb3VyY2VUeXBlIHR5cGUyKSB7Ci0JCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUodHlwZTEuZ2V0TmFtZSgpLCB0eXBlMi5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX07Ci0KLQotCS8qKgotCSAqIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdGhlIHNvdXJjZSB0eXBlIHRvIHN5bmNocm9uaXplIHRoZSBtZXRhbW9kZWwKLQkgKiBhcyByZXF1aXJlZCBieSBjaGFuZ2VzIHRvIHRoZSBjb250ZXh0IG1vZGVsLgotCSAqLwotCWludGVyZmFjZSBTeW5jaHJvbml6ZXIgewotCQkvKioKLQkJICogUmV0dXJuIHRoZSBmaWxlIGdlbmVyYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgbWV0YW1vZGVsIHN5bmNocm9uaXphdGlvbi4KLQkJICovCi0JCUlGaWxlIGdldEZpbGUoKTsKLQotCQkvKioKLQkJICogU3luY2hyb25pemUgdGhlIG1ldGFtb2RlbCB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBzb3VyY2UKLQkJICogdHlwZSwgdXNpbmcgdGhlIHNwZWNpZmllZCBtZW1iZXIgdHlwZSB0cmVlLgotCQkgKi8KLQkJdm9pZCBzeW5jaHJvbml6ZShNYXA8U3RyaW5nLCBDb2xsZWN0aW9uPE1ldGFtb2RlbFNvdXJjZVR5cGU+PiBtZW1iZXJUeXBlVHJlZSk7Ci0KLQkJLyoqCi0JCSAqIFByaW50IHRoZSBib2R5IG9mIHRoZSBtZXRhbW9kZWwgY2xhc3Mgb24gdGhlIHNwZWNpZmllZCB3cml0ZXIsCi0JCSAqIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWVtYmVyIHR5cGUgdHJlZS4KLQkJICovCi0JCXZvaWQgcHJpbnRCb2R5U291cmNlT24oQm9keVNvdXJjZVdyaXRlciBwdywgTWFwPFN0cmluZywgQ29sbGVjdGlvbjxNZXRhbW9kZWxTb3VyY2VUeXBlPj4gbWVtYmVyVHlwZVRyZWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L05hbWVkUXVlcnkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9OYW1lZFF1ZXJ5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkNGJlM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L05hbWVkUXVlcnkyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotCi0vKioKLSAqIEpQQSAyLjAgbmFtZWQgcXVlcnkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE5hbWVkUXVlcnkyXzAKLQlleHRlbmRzIE5hbWVkUXVlcnkKLXsKLQkvLyAqKioqKioqKioqIGxvY2sgbW9kZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBsb2NrIG1vZGUgaWYgcHJlc2VudCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgZGVmYXVsdAotCSAqIGxvY2sgbW9kZS4KLQkgKi8KLQlMb2NrTW9kZVR5cGUyXzAgZ2V0TG9ja01vZGUoKTsKLQlMb2NrTW9kZVR5cGUyXzAgZ2V0U3BlY2lmaWVkTG9ja01vZGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMCBsb2NrTW9kZSk7Ci0JCVN0cmluZyBTUEVDSUZJRURfTE9DS19NT0RFX1BST1BFUlRZID0gInNwZWNpZmllZExvY2tNb2RlIjsgLy8kTk9OLU5MUy0xJAotCUxvY2tNb2RlVHlwZTJfMCBnZXREZWZhdWx0TG9ja01vZGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfTE9DS19NT0RFX1BST1BFUlRZID0gImRlZmF1bHRMb2NrTW9kZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PbmVUb01hbnlNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT25lVG9NYW55TWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTE2ZGFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBKUEEgMi4wIDE6bSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPbmVUb01hbnlNYXBwaW5nMl8wCi0JZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nLCBDb2xsZWN0aW9uTWFwcGluZzJfMAotewotCU9uZVRvTWFueVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3ZjA5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwOwotCi0vKioKLSAqIEpQQSAyLjAgMTptIHJlbGF0aW9uc2hpcCAobWFwcGVkIGJ5LCBqb2luIHRhYmxlLCBqb2luIGNvbHVtbikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMAotCWV4dGVuZHMgT25lVG9NYW55UmVsYXRpb25zaGlwLCBKb2luQ29sdW1uUmVsYXRpb25zaGlwCi17Ci0JLy8gYWRkIGpvaW4gY29sdW1uIHN1cHBvcnQgdG8gSlBBIDEuMCAxOm0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PbmVUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PbmVUb09uZU1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhODQyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSlBBIDIuMCAxOjEgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9PbmVNYXBwaW5nMl8wCi0JZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmcsIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAKLXsKLQlPbmVUb09uZVJlbGF0aW9uc2hpcCBnZXRSZWxhdGlvbnNoaXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PbmVUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09uZVRvT25lUmVsYXRpb25zaGlwMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGNhYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09uZVRvT25lUmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBKUEEgMi4wIDE6MSByZWxhdGlvbnNoaXAgKG1hcHBlZCBieSwgam9pbiBjb2x1bW4sIHByaW1hcnkga2V5IGpvaW4gY29sdW1uLAotICogam9pbiB0YWJsZSkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9uZVRvT25lUmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uc2hpcCwgSm9pblRhYmxlUmVsYXRpb25zaGlwCi17Ci0JLy8gYWRkIGpvaW4gdGFibGUgc3VwcG9ydCB0byBKUEEgMS4wIDE6MQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09yZGVyQ29sdW1uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT3JkZXJDb2x1bW4yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlmNTFkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT3JkZXJDb2x1bW4yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkQ29sdW1uOwotCi0vKioKLSAqIG9yZGVyIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JkZXJDb2x1bW4yXzAKLQlleHRlbmRzIE5hbWVkQ29sdW1uCi17Ci0JLy8gKioqKioqKioqKiBudWxsYWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBudWxsYWJsZSBzZXR0aW5nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICogZGVmYXVsdCBudWxsYWJsZSBzZXR0aW5nLgotCSAqLwotCWJvb2xlYW4gaXNOdWxsYWJsZSgpOwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkTnVsbGFibGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4gbmV3U3BlY2lmaWVkTnVsbGFibGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZE51bGxhYmxlIjsgLy8kTk9OLU5MUy0xJAotCWJvb2xlYW4gaXNEZWZhdWx0TnVsbGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfTlVMTEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdE51bGxhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIERFRkFVTFRfTlVMTEFCTEUgPSB0cnVlOwotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzcGVjaWZpZWQgaW5zZXJ0YWJsZSBzZXR0aW5nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlCi0JICogZGVmYXVsdCBpbnNlcnRhYmxlIHNldHRpbmcuCi0JICovCi0JYm9vbGVhbiBpc0luc2VydGFibGUoKTsKLQlCb29sZWFuIGdldFNwZWNpZmllZEluc2VydGFibGUoKTsKLQl2b2lkIHNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRJbnNlcnRhYmxlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZID0gInNwZWNpZmllZEluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0JYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JCVN0cmluZyBERUZBVUxUX0lOU0VSVEFCTEVfUFJPUEVSVFkgPSAiZGVmYXVsdEluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gREVGQVVMVF9JTlNFUlRBQkxFID0gdHJ1ZTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHVwZGF0YWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCB1cGRhdGFibGUgc2V0dGluZyBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZQotCSAqIGRlZmF1bHQgdXBkYXRhYmxlIHNldHRpbmcuCi0JICovCi0JYm9vbGVhbiBpc1VwZGF0YWJsZSgpOwotCUJvb2xlYW4gZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbiBuZXdTcGVjaWZpZWRVcGRhdGFibGUpOwotCQlTdHJpbmcgU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSA9ICJzcGVjaWZpZWRVcGRhdGFibGUiOyAvLyROT04tTkxTLTEkCi0JYm9vbGVhbiBpc0RlZmF1bHRVcGRhdGFibGUoKTsKLQkJU3RyaW5nIERFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZID0gImRlZmF1bHRVcGRhdGFibGUiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gREVGQVVMVF9VUERBVEFCTEUgPSB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09yZGVyYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09yZGVyYWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Q1ZGUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PcmRlcmFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIE11bHRpLXZhbHVlZCAoMTptLCBtOm0pIHJlbGF0aW9uc2hpcCBhbmQgZWxlbWVudCBjb2xsZWN0aW9uIG1hcHBpbmdzIHN1cHBvcnQKLSAqIG9yZGVyaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JkZXJhYmxlMl8wCi0JZXh0ZW5kcyBPcmRlcmFibGUKLXsKLQlib29sZWFuIGlzT3JkZXJDb2x1bW5PcmRlcmluZygpOwotCXZvaWQgc2V0T3JkZXJDb2x1bW5PcmRlcmluZyhib29sZWFuIHZhbHVlKTsKLQkJU3RyaW5nIE9SREVSX0NPTFVNTl9PUkRFUklOR19QUk9QRVJUWSA9ICJvcmRlckNvbHVtbk9yZGVyaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JT3JkZXJDb2x1bW4yXzAgZ2V0T3JkZXJDb2x1bW4oKTsKLQotCVN0cmluZyBnZXREZWZhdWx0VGFibGVOYW1lKCk7Ci0KLQotCS8qKgotCSAqIGludGVyZmFjZSBhbGxvd2luZyBvcmRlcmluZyBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKiAoaS5lLiBtdWx0aS12YWx1ZSByZWxhdGlvbnNoaXAgYW5kIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5ncykKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQl7Ci0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIHRhYmxlLgotCQkgKi8KLQkJU3RyaW5nIGdldFRhYmxlTmFtZSgpOwotCQkKLQkJVGFibGUgcmVzb2x2ZURiVGFibGUoU3RyaW5nIHRhYmxlTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09ycGhhblJlbW92YWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09ycGhhblJlbW92YWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTllYTE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PcnBoYW5SZW1vdmFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci0KLS8qKgotICogT3ByaGFuIHJlbW92YWwKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ycGhhblJlbW92YWJsZTJfMAotCWV4dGVuZHMgSnBhQ29udGV4dE5vZGUKLXsKLQlib29sZWFuIGlzT3JwaGFuUmVtb3ZhbCgpOwotCi0JQm9vbGVhbiBnZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCk7Ci0JCVN0cmluZyBTUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFkgPSAic3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCI7IC8vJE5PTi1OTFMtMSQKLQotCWJvb2xlYW4gaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpOwotCQlTdHJpbmcgREVGQVVMVF9PUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSA9ICJkZWZhdWx0T3JwaGFuUmVtb3ZhbCI7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBERUZBVUxUX09SUEhBTl9SRU1PVkFMID0gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L09ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3MzYxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMAotCWV4dGVuZHMgSnBhTm9kZQotewotCU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDRmYmU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9PdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PdmVycmlkZVJlbGF0aW9uc2hpcDsKLQotLyoqCi0gKiBKUEEgMi4wIGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBBc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBPdmVycmlkZVJlbGF0aW9uc2hpcCwKLQkJCUpvaW5UYWJsZVJlbGF0aW9uc2hpcCwKLQkJCVJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAKLXsKLQkvLyBhZGQgam9pbiB0YWJsZSBzdXBwb3J0IHRvIEpQQSAxLjAgYXNzb2NpYXRpb24gb3ZlcnJpZGUKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvUGVyc2lzdGVudEF0dHJpYnV0ZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ3ZGQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9QZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIENvbnRleHQgcGVyc2lzdGVudCA8ZW0+YXR0cmlidXRlPC9lbT4gKGZpZWxkIG9yIHByb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAKLQlleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGUsIFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvUGVyc2lzdGVudFR5cGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9QZXJzaXN0ZW50VHlwZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE2ZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9QZXJzaXN0ZW50VHlwZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci0KLS8qKgotICogSlBBIDIuMCBjb250ZXh0IHBlcnNpc3RlbnQgdHlwZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBlcnNpc3RlbnRUeXBlMl8wCi0JZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgTWV0YW1vZGVsU291cmNlVHlwZQotewotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgcGVyc2lzdGVudCB0eXBlJ3MgImRlY2xhcmluZyB0eXBlIi4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHBlcnNpc3RlbnQgdHlwZSBpcyBhIHRvcC1sZXZlbCB0eXBlLgotCSAqIFRoZSBkZWNsYXJpbmcgdHlwZSBtYXkgb3IgbWF5IG5vdCBiZSBhIHBlcnNpc3RlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVjbGFyaW5nVHlwZU5hbWUoKTsKLQkJU3RyaW5nIERFQ0xBUklOR19UWVBFX05BTUVfUFJPUEVSVFkgPSAiZGVjbGFyaW5nVHlwZU5hbWUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjcyNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L1JlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLS8qKgotICogSlBBIDIuMAotICogUmVhZC1vbmx5IGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTJfMAotCWV4dGVuZHMgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlCi17Ci0JSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0KLQlKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtblZhbGlkYXRvcihSZWFkT25seUpvaW5Db2x1bW4gY29sdW1uLCBSZWFkT25seUpvaW5Db2x1bW4uT3duZXIgb3duZXIsIEpvaW5Db2x1bW5UZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0KLQlKcHRWYWxpZGF0b3IgYnVpbGRKb2luVGFibGVWYWxpZGF0b3IoUmVhZE9ubHlKb2luVGFibGUgdGFibGUsIFRhYmxlVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L1JlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9SZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNjcyNDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L1JlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5Kb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuSnB0VmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LlRhYmxlVGV4dFJhbmdlUmVzb2x2ZXI7Ci0KLS8qKgotICogSlBBIDIuMCBhc3NvY2lhdGlvbiBvdmVycmlkZSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAKLQlleHRlbmRzIFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAsCi0JCQlSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcAotewotCUpwdFZhbGlkYXRvciBidWlsZEpvaW5UYWJsZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCi0JSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5WYWxpZGF0b3IoUmVhZE9ubHlKb2luQ29sdW1uIGNvbHVtbiwgUmVhZE9ubHlKb2luQ29sdW1uLk93bmVyIG93bmVyLCBKb2luQ29sdW1uVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpOwotCi0JSnB0VmFsaWRhdG9yIGJ1aWxkSm9pblRhYmxlVmFsaWRhdG9yKFJlYWRPbmx5Sm9pblRhYmxlIHRhYmxlLCBUYWJsZVRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmYzdjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLS8qKgotICogSlBBIDIuMAotICogUmVhZC1vbmx5IGNvbnRleHQgcGVyc2lzdGVudCA8ZW0+YXR0cmlidXRlPC9lbT4gKGZpZWxkIG9yIHByb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlMl8wCi0JZXh0ZW5kcyBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciB0eXBlIHRvIGJlIHVzZWQgaW4gdGhlIG1ldGFtb2RlbCBmaWVsZAotCSAqIGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZSdzIG1hcHBpbmcuCi0JICovCi0JU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkVHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmVyIG1hcCBrZXkgdHlwZSB0byBiZSB1c2VkIGluIHRoZQotCSAqIG1ldGFtb2RlbCBmaWVsZCBkZWNsYXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBhdHRyaWJ1dGUncyBtYXBwaW5nLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgYXR0cmlidXRlJ3MgdHlwZSBpcyBub3QKLQkgKiB7QGxpbmsgamF2YS51dGlsLk1hcH0uCi0JICovCi0JU3RyaW5nIGdldE1ldGFtb2RlbENvbnRhaW5lckZpZWxkTWFwS2V5VHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgYXR0cmlidXRlJ3MgdHlwZSBuYW1lIGZvciB0aGUgbWV0YW1vZGVsLgotCSAqLwotCVN0cmluZyBnZXRNZXRhbW9kZWxUeXBlTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L1NlcXVlbmNlR2VuZXJhdG9yMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzOTBkZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci0KLS8qKgotICogSlBBIDIuMCBzZXF1ZW5jZSBnZW5lcmF0b3IKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yMl8wCi0JZXh0ZW5kcyBTZXF1ZW5jZUdlbmVyYXRvcgotewotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNwZWNpZmllZCBjYXRhbG9nIGlmIHByZXNlbnQsIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQKLQkgKiBjYXRhbG9nLgotCSAqLwotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0JU3RyaW5nIGdldFNwZWNpZmllZENhdGFsb2coKTsKLQl2b2lkIHNldFNwZWNpZmllZENhdGFsb2coU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZID0gInNwZWNpZmllZENhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCVN0cmluZyBERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkgPSAiZGVmYXVsdENhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc3BlY2lmaWVkIHNjaGVtYSBpZiBwcmVzZW50LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBkZWZhdWx0Ci0JICogc2NoZW1hLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQlTdHJpbmcgZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0Jdm9pZCBzZXRTcGVjaWZpZWRTY2hlbWEoU3RyaW5nIHZhbHVlKTsKLQkJU3RyaW5nIFNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkgPSAic3BlY2lmaWVkU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBnZXREZWZhdWx0U2NoZW1hKCk7Ci0JCVN0cmluZyBERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSA9ICJkZWZhdWx0U2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L1NpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYwMWM3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLQotLyoqCi0gKiBKUEEgMi4wIHNpbmdsZSByZWxhdGlvbnNoaXAgKG06MSwgMToxKSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wCi0JZXh0ZW5kcyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLCBBdHRyaWJ1dGVNYXBwaW5nMl8wCi17Ci0JRGVyaXZlZElkZW50aXR5Ml8wIGdldERlcml2ZWRJZGVudGl0eSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L1ZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L1ZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDkwYThkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci0KLS8qKgotICogSlBBIDIuMCB2aXJ0dWFsIGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAKLQlleHRlbmRzIFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCwKLQkJCVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAsCi0JCQlSZWFkT25seU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wCi17Ci0JLy8gYWRkIGpvaW4gdGFibGUgc3VwcG9ydCB0byBKUEEgMS4wIGFzc29jaWF0aW9uIG92ZXJyaWRlCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUxNjY1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIEphdmEgPGVtPnNwZWNpZmllZDwvZW0+IGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlMl8wCi0JZXh0ZW5kcyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZSwgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1YTBkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMDsKLQotLyoqCi0gKiBKUEEgMi4wCi0gKiBKYXZhIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMAotCWV4dGVuZHMgSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIsIEphdmFPdmVycmlkZUNvbnRhaW5lcjJfMCwgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMAotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotCi0KLQkvLyAqKioqKioqKioqIG93bmVyICoqKioqKioqKioKLQotCWludGVyZmFjZSBPd25lcgotCQlleHRlbmRzIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLk93bmVyLCBKYXZhT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIsIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIyXzAuT3duZXIKLQl7CQkKLQkJLy8gY29tYmluZSBpbnRlcmZhY2VzCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTEwM2Q1NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci0KLS8qKgotICogSlBBIDIuMAotICogSmF2YSBhdHRyaWJ1dGUgb3ZlcnJpZGUgY29udGFpbmVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjJfMAotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBKYXZhT3ZlcnJpZGVDb250YWluZXIyXzAKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLQotCi0JLy8gKioqKioqKioqKiBvd25lciAqKioqKioqKioqCi0KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuT3duZXIsIEphdmFPdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcgotCXsJCQotCQkvLyBjb21iaW5lIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzlhZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNhY2hlYWJsZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLQotLyoqCi0gKiBKYXZhIGNhY2hlYWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNhY2hlYWJsZTJfMAotCWV4dGVuZHMgQ2FjaGVhYmxlMl8wLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQkvLyBjb21iaW5lIHR3byBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOTVlYTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNhY2hlYWJsZUhvbGRlcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotCi0vKioKLSAqIEphdmEgY2FjaGVhYmxlIGhvbGRlci9wYXJlbnQKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFDYWNoZWFibGVIb2xkZXIyXzAKLQlleHRlbmRzIENhY2hlYWJsZUhvbGRlcjJfMCwgSmF2YUpwYUNvbnRleHROb2RlCi17Ci0JSmF2YVJlc291cmNlVHlwZSBnZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JSmF2YUNhY2hlYWJsZTJfMCBnZXRDYWNoZWFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhQ2FzY2FkZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNThkMDFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotCi0vKioKLSAqIEphdmEgY2FzY2FkZSAocGVyc2lzdCwgbWVyZ2UsIHJlbW92ZSwgcmVmcmVzaCwgZGV0YWNoKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNhc2NhZGUyXzAKLQlleHRlbmRzIEphdmFDYXNjYWRlLCBDYXNjYWRlMl8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTdiMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uTWFwcGluZzJfMDsKLQotLyoqCi0gKiBKYXZhIGNvbGxlY3Rpb24gbWFwcGluZyAoZS5nLiAxOm0sIG06bSwgZWxlbWVudCBjb2xsZWN0aW9uKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbGxlY3Rpb25NYXBwaW5nMl8wCi0JZXh0ZW5kcyBDb2xsZWN0aW9uTWFwcGluZzJfMCwgSmF2YUNvbGxlY3Rpb25NYXBwaW5nLCBKYXZhQ29udmVydGlibGVLZXlNYXBwaW5nMl8wCi17Ci0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkvKioKLQkgKiBJZiB0aGUgbWFwIGtleSBjbGFzcyBpcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCByZXR1cm4gaXQgZnVsbHkgcXVhbGlmaWVkLgotCSAqIElmIG5vdCBzcGVjaWZpZWQsIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgbWFwIGtleSBjbGFzcywgd2hpY2ggaXMgYWx3YXlzCi0JICogZnVsbHkgcXVhbGlmaWVkLgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZE1hcEtleUNsYXNzKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfTUFQX0tFWV9DTEFTU19QUk9QRVJUWSA9ICJmdWxseVF1YWxpZmllZE1hcEtleUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCUxpc3RJdGVyYWJsZTw/IGV4dGVuZHMgSmF2YUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0JSmF2YUpvaW5Db2x1bW4gZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCUphdmFKb2luQ29sdW1uIGFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKTsKLQlKYXZhSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQlKYXZhSm9pbkNvbHVtbiBnZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY5MGMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFDb2xsZWN0aW9uVGFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Db2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgY29sbGVjdGlvbiB0YWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUNvbGxlY3Rpb25UYWJsZTJfMAotCWV4dGVuZHMgQ29sbGVjdGlvblRhYmxlMl8wLCBKYXZhUmVmZXJlbmNlVGFibGUKLXsKLQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGdldFRhYmxlQW5ub3RhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNvbnZlcnRpYmxlS2V5TWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUNvbnZlcnRpYmxlS2V5TWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmQwMDQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFDb252ZXJ0aWJsZUtleU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbnZlcnRpYmxlS2V5TWFwcGluZzJfMDsKLQotLyoqCi0gKiBKYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIHRoYXQgaGFzIGEga2V5IGNvbnZlcnRlciwgY29sbGVjdGlvbiBtYXBwaW5ncwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQ29udmVydGlibGVLZXlNYXBwaW5nMl8wCi0JZXh0ZW5kcyBDb252ZXJ0aWJsZUtleU1hcHBpbmcyXzAsIEphdmFBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JSmF2YUNvbnZlcnRlciBnZXRNYXBLZXlDb252ZXJ0ZXIoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFEZXJpdmVkSWRlbnRpdHkyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFEZXJpdmVkSWRlbnRpdHkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRlYjBhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhRGVyaXZlZElkZW50aXR5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkRlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIEphdmEgZGVyaXZlZCBpZGVudGl0eQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YURlcml2ZWRJZGVudGl0eTJfMAotCWV4dGVuZHMgRGVyaXZlZElkZW50aXR5Ml8wLCBKYXZhSnBhQ29udGV4dE5vZGUKLXsKLQlKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBnZXRNYXBwaW5nKCk7Ci0KLQlKYXZhSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBnZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0KLQlKYXZhTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQotCXZvaWQgdmFsaWRhdGUoTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlciwgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGJhZTNiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMAotCWV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBKYXZhQ29sbGVjdGlvbk1hcHBpbmcyXzAsIEphdmFDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQotCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCi0JSmF2YUNvbHVtbiBnZXRWYWx1ZUNvbHVtbigpOwotCi0JSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkKLQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCS8qKgotCSAqIElmIHRoZSB0YXJnZXQgY2xhc3MgaXMgc3BlY2lmaWVkLCB0aGlzIHdpbGwgcmV0dXJuIGl0IGZ1bGx5IHF1YWxpZmllZC4gSWYgbm90Ci0JICogc3BlY2lmaWVkLCBpdCByZXR1cm5zIHRoZSBkZWZhdWx0IHRhcmdldCBjbGFzcywgd2hpY2ggaXMgYWx3YXlzIGZ1bGx5IHF1YWxpZmllZAotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzKCk7Ci0JCVN0cmluZyBGVUxMWV9RVUFMSUZJRURfVEFSR0VUX0NMQVNTX1BST1BFUlRZID0gImZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3MiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MjYwZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIEphdmEgZW1iZWRkZWQgbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YUVtYmVkZGVkTWFwcGluZzJfMAotCWV4dGVuZHMgRW1iZWRkZWRNYXBwaW5nMl8wLCBKYXZhRW1iZWRkZWRNYXBwaW5nCi17Ci0JSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Njg3OTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LklkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzA7Ci0KLS8qKgotICogSmF2YSBJRCBkZXJpdmVkIGlkZW50aXR5IHN0cmF0ZWd5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMAotCWV4dGVuZHMgSmF2YUpwYUNvbnRleHROb2RlLCBJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYjljYTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmcyXzA7Ci0KLS8qKgotICogSlBBIDIuMCBKYXZhIG06bSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAKLQlleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nMl8wLCBKYXZhTWFueVRvTWFueU1hcHBpbmcsIEphdmFDb2xsZWN0aW9uTWFwcGluZzJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBtYXBwaW5ncwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA1ZTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFueVRvT25lMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBKUEEgMi4wIEphdmEgbToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNYW55VG9PbmVNYXBwaW5nMl8wCi0JZXh0ZW5kcyBNYW55VG9PbmVNYXBwaW5nMl8wLCBKYXZhTWFueVRvT25lTWFwcGluZywgSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGNhMjY0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIEphdmEgbToxIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMAotCWV4dGVuZHMgTWFueVRvT25lUmVsYXRpb25zaGlwMl8wLAotCQlKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwLAotCQlKYXZhTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwS2V5RW51bWVyYXRlZENvbnZlcnRlcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcEtleUVudW1lcmF0ZWRDb252ZXJ0ZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1YTI0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwS2V5RW51bWVyYXRlZENvbnZlcnRlcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci0KLS8qKgotICogSmF2YSBtYXAga2V5IGVudW1lcmF0ZWQgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFNYXBLZXlFbnVtZXJhdGVkQ29udmVydGVyMl8wCi0JZXh0ZW5kcyBFbnVtZXJhdGVkQ29udmVydGVyLCBKYXZhQ29udmVydGVyCi17Ci0JLy8gKioqKioqKioqKiBhZGFwdGVyICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQWRhcHRlcgotCQlleHRlbmRzIEphdmFDb252ZXJ0ZXIuQWJzdHJhY3RBZGFwdGVyCi0JewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBBZGFwdGVyIElOU1RBTkNFID0gbmV3IEFkYXB0ZXIoKTsKLQkJcHVibGljIHN0YXRpYyBBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0KLQkJcHJpdmF0ZSBBZGFwdGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBnZXRDb252ZXJ0ZXJUeXBlKCkgewotCQkJcmV0dXJuIEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3M7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRBbm5vdGF0aW9uTmFtZSgpIHsKLQkJCXJldHVybiBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24sIEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFFbnVtZXJhdGVkQ29udmVydGVyKHBhcmVudCwgKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSBjb252ZXJ0ZXJBbm5vdGF0aW9uLCB0aGlzLmJ1aWxkT3duZXIoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXIyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBLZXlUZW1wb3JhbENvbnZlcnRlcjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODhlZTAyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBLZXlUZW1wb3JhbENvbnZlcnRlcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5KcHRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5Db252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hcEtleVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uOwotCi0vKioKLSAqIEphdmEgbWFwIGtleSB0ZW1wb3JhbCBjb252ZXJ0ZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcEtleVRlbXBvcmFsQ29udmVydGVyMl8wCi0JZXh0ZW5kcyBUZW1wb3JhbENvbnZlcnRlciwgSmF2YUNvbnZlcnRlcgotewotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFkYXB0ZXIKLQkJZXh0ZW5kcyBKYXZhQ29udmVydGVyLkFic3RyYWN0QWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBBZGFwdGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCXByaXZhdGUgQWRhcHRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJCXJldHVybiBUZW1wb3JhbENvbnZlcnRlci5jbGFzczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFubm90YXRpb25OYW1lKCkgewotCQkJcmV0dXJuIE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUU7Ci0JCX0KLQotCQlwdWJsaWMgSmF2YUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24sIEphdmFBdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5idWlsZEphdmFUZW1wb3JhbENvbnZlcnRlcigoSmF2YUNvbGxlY3Rpb25NYXBwaW5nMl8wKSBwYXJlbnQsIChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIGNvbnZlcnRlckFubm90YXRpb24sIHRoaXMuYnVpbGRPd25lcigpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgT3duZXIgYnVpbGRPd25lcigpIHsKLQkJCXJldHVybiBuZXcgT3duZXIoKSB7CQkJCQotCQkJCXB1YmxpYyBKcHRWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoQ29udmVydGVyIGNvbnZlcnRlciwgQ29udmVydGVyVGV4dFJhbmdlUmVzb2x2ZXIgdGV4dFJhbmdlUmVzb2x2ZXIpIHsKLQkJCQkJcmV0dXJuIG5ldyBKYXZhTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXJWYWxpZGF0b3IoKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIsIHRleHRSYW5nZVJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NWM4ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogSmF2YSBtYXBwaW5nIGpvaW4gY29sdW1uIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotCWV4dGVuZHMgSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCwgSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDhjN2M3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotLyoqCi0gKiBKYXZhIG1hcHBpbmcgam9pbiB0YWJsZSByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotCWV4dGVuZHMgSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCwgSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFmZTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogSmF2YSBtYXBwaW5nICJtYXBwZWQgYnkiIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLQlleHRlbmRzIEphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAsIEphdmFNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwcGluZ1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGY5NmU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBwaW5nUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogSmF2YSBtYXBwaW5nIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTWFwcGluZ1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLQlleHRlbmRzIEphdmFNYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAsIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5OTYzZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wOwotCi0vKioKLSAqIEphdmEgbWFwcGluZyByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotCWV4dGVuZHMgTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLCBKYXZhUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMjkzZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMDsKLQotLyoqCi0gKiBKYXZhIG1hcHMgSUQgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wCi0JZXh0ZW5kcyBKYXZhSnBhQ29udGV4dE5vZGUsIE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhTmFtZWRRdWVyeTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDZkMzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5OYW1lZFF1ZXJ5Ml8wOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIEphdmEgbmFtZWQgbmF0aXZlIHF1ZXJ5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhTmFtZWRRdWVyeTJfMAotCWV4dGVuZHMgTmFtZWRRdWVyeTJfMCwgSmF2YU5hbWVkUXVlcnkKLXsKLQkvLyBjb21iaW5lIDIgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTIzMTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7Ci0KLS8qKgotICogSlBBIDIuMCBKYXZhIDE6bSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT25lVG9NYW55TWFwcGluZzJfMAotCWV4dGVuZHMgT25lVG9NYW55TWFwcGluZzJfMCwgSmF2YU9uZVRvTWFueU1hcHBpbmcsIEphdmFDb2xsZWN0aW9uTWFwcGluZzJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjhjZmE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci0KLS8qKgotICogSlBBIDIuMCBKYXZhIDE6bSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAKLQlleHRlbmRzIE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCwKLQkJSmF2YU9uZVRvTWFueVJlbGF0aW9uc2hpcCwKLQkJSmF2YU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3NDYxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIEphdmEgMToxIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFPbmVUb09uZU1hcHBpbmcyXzAKLQlleHRlbmRzIE9uZVRvT25lTWFwcGluZzJfMCwgSmF2YU9uZVRvT25lTWFwcGluZywgSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NGRiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci0KLS8qKgotICogSlBBIDIuMCBKYXZhIDE6MSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFPbmVUb09uZVJlbGF0aW9uc2hpcDJfMAotCWV4dGVuZHMgT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAsCi0JCUphdmFPbmVUb09uZVJlbGF0aW9uc2hpcCwKLQkJSmF2YU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9yZGVyQ29sdW1uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JkZXJDb2x1bW4yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1N2RiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JkZXJDb2x1bW4yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBvcm0ueG1sIG9yZGVyIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU9yZGVyQ29sdW1uMl8wCi0JZXh0ZW5kcyBPcmRlckNvbHVtbjJfMCwgSmF2YU5hbWVkQ29sdW1uCi17Ci0JT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGdldENvbHVtbkFubm90YXRpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPcmRlcmFibGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPcmRlcmFibGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhMTY0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JkZXJhYmxlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci0KLS8qKgotICogSlBBIDIuMCBKYXZhIG9yZGVyaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT3JkZXJhYmxlMl8wCi0JZXh0ZW5kcyBPcmRlcmFibGUyXzAsIEphdmFPcmRlcmFibGUKLXsKLQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQotCUphdmFPcmRlckNvbHVtbjJfMCBnZXRPcmRlckNvbHVtbigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9ycGhhblJlbW92YWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9ycGhhblJlbW92YWJsZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRhOThkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPcnBoYW5SZW1vdmFibGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLQotLyoqCi0gKiBKYXZhIG9ycGhhbiByZW1vdmFsCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wCi0JZXh0ZW5kcyBKYXZhSnBhQ29udGV4dE5vZGUsIE9ycGhhblJlbW92YWJsZTJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU0OTdmNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzAKLQlleHRlbmRzIE9ycGhhblJlbW92YWxIb2xkZXIyXzAsIEphdmFKcGFDb250ZXh0Tm9kZQotewotCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YU92ZXJyaWRlQ29udGFpbmVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGVDb250YWluZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ZDkwMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGVDb250YWluZXIyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT3ZlcnJpZGVDb250YWluZXI7Ci0KLS8qKgotICogSlBBIDIuMAotICogSmF2YSBhdHRyaWJ1dGUgb3IgYXNzb2NpYXRpb24gb3ZlcnJpZGUgY29udGFpbmVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFPdmVycmlkZUNvbnRhaW5lcjJfMAotCWV4dGVuZHMgSmF2YU92ZXJyaWRlQ29udGFpbmVyCi17Ci0JLyoqCi0JICogUmV0dXJuIGEgcHJlZml4ICg8ZW0+d2l0aG91dDwvZW0+IHRoZSBmb2xsb3dpbmcgPGNvZGU+Jy4nPC9jb2RlPikKLQkgKiB0aGF0IG1heSBiZSBwcmVwZW5kZWQgdG8gdGhlIG92ZXJyaWRlIG5hbWUuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIHByZWZpeCBpcyBzdXBwb3J0ZWQuCi0JICogPHA+Ci0JICogSlBBIDIuMCBzdXBwb3J0cyB0aGUgcHJlLWRlZmluZWQgcHJlZml4ZXMKLQkgKiA8Y29kZT4idmFsdWUiPC9jb2RlPiBhbmQgPGNvZGU+ImtleSI8L2NvZGU+LgotCSAqLwotCS8vIFRPRE8gYmV0dGVyIG5hbWU/Ci0JU3RyaW5nIGdldFBvc3NpYmxlUHJlZml4KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHByZWZpeCAoPGVtPndpdGhvdXQ8L2VtPiB0aGUgZm9sbG93aW5nIDxjb2RlPicuJzwvY29kZT4pCi0JICogdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSBvdmVycmlkZSBuYW1lLgotCSAqLwotCS8vIFRPRE8gYmV0dGVyIG5hbWU/Ci0JU3RyaW5nIGdldFdyaXRlUHJlZml4KCk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgSmF2YU92ZXJyaWRlQ29udGFpbmVyLk93bmVyCi0JewotCQkvKioKLQkJICogQHNlZSBKYXZhT3ZlcnJpZGVDb250YWluZXIyXzAjZ2V0UG9zc2libGVQcmVmaXgoKQotCQkgKi8KLQkJU3RyaW5nIGdldFBvc3NpYmxlUHJlZml4KCk7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSmF2YU92ZXJyaWRlQ29udGFpbmVyMl8wI2dldFdyaXRlUHJlZml4KCkKLQkJICovCi0JCVN0cmluZyBnZXRXcml0ZVByZWZpeCgpOwotCi0JCS8qKgotCQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgSlBBIDIuMCBiZWNhdXNlIGFuIG92ZXJyaWRlIGFubm90YXRpb24gZm9yIGFuCi0JCSAqIGVsZW1lbnQgY29sbGVjdGlvbiBjYW4gaGF2ZSBhIG5hbWUgd2l0aCBhIHByZWZpeCB0aGF0IGluZGljYXRlcwotCQkgKiB3aGV0aGVyIHRoZSBvdmVycmlkZSBhcHBsaWVzIHRvIGVsZW1lbnQgY29sbGVjdGlvbidzIGVtYmVkZGVkIGtleSBvcgotCQkgKiB2YWx1ZS4gUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBvdmVycmlkZSBuYW1lLCB3aGljaCBtYXkgaGF2ZSBhCi0JCSAqIHByZWZpeCwgaXMgcmVsZXZhbnQgdG8gdGhlIG92ZXJyaWRlIGNvbnRhaW5lci4KLQkJICovCi0JCS8vIFRPRE8gYmV0dGVyIG5hbWU/Ci0JCWJvb2xlYW4gaXNSZWxldmFudChTdHJpbmcgb3ZlcnJpZGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDU3ODM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFPdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgSmF2YSBhc3NvY2lhdGlvbiBvdmVycmlkZSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCAKLQlleHRlbmRzIE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wLAotCQkJSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwLAotCQkJSmF2YUpvaW5UYWJsZVJlbGF0aW9uc2hpcAotewotCUphdmFKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxY2RjYzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGUyXzA7Ci0KLS8qKgotICogSlBBIDIuMAotICogQ29udGV4dCBKYXZhIHBlcnNpc3RlbnQgPGVtPmF0dHJpYnV0ZTwvZW0+IChmaWVsZCBvciBwcm9wZXJ0eSkuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMAotCWV4dGVuZHMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAKLXsKLQkvLyBjb21iaW5lIHR3byBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhUGVyc2lzdGVudFR5cGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzg3Y2FiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFQZXJzaXN0ZW50VHlwZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUGVyc2lzdGVudFR5cGUyXzA7Ci0KLS8qKgotICogSlBBIDIuMCBjb250ZXh0IEphdmEgcGVyc2lzdGVudCB0eXBlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVBlcnNpc3RlbnRUeXBlMl8wCi0JZXh0ZW5kcyBKYXZhUGVyc2lzdGVudFR5cGUsIFBlcnNpc3RlbnRUeXBlMl8wCi17Ci0JTGlzdEl0ZXJhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2FiYTY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yMl8wOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIEphdmEgc2VxdWVuY2UgZ2VuZXJhdG9yCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMAotCWV4dGVuZHMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yLCBTZXF1ZW5jZUdlbmVyYXRvcjJfMAotewotCS8vIG5vdGhpbmcKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGI2ZjVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgSmF2YSBzaW5nbGUgKG06MSwgMToxKSBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAotCWV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCwgSmF2YVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQlKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGdldERlcml2ZWRJZGVudGl0eSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L2phdmEvSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDk0MWQ2My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUyXzA7Ci0KLS8qKgotICogSlBBIDIuMAotICogSmF2YSA8ZW0+dmlydHVhbDwvZW0+IGFzc29jaWF0aW9uIG92ZXJyaWRlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTJfMAotCWV4dGVuZHMgSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLCBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUyXzAKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9qYXZhL0phdmFWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlNzQ0ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvamF2YS9KYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgSmF2YSB2aXJ0dWFsIGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAsCi0JCQlKYXZhVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwLAotCQkJSmF2YVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAKLXsKLQlKYXZhVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmYwNjNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IDxlbT5zcGVjaWZpZWQ8L2VtPiBhc3NvY2lhdGlvbiBvdmVycmlkZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wCi0JZXh0ZW5kcyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLCBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUyXzAKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZTUzZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGFzc29jaWF0aW9uIG92ZXJyaWRlIGNvbnRhaW5lcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wCi0JZXh0ZW5kcyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyMl8wCi17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JaW50ZXJmYWNlIE93bmVyCi0JCWV4dGVuZHMgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5Pd25lciwgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lcgotCXsJCQotCQkvLyBjb21iaW5lIGludGVyZmFjZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNhY2hlYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1DYWNoZWFibGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3MGJhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNhY2hlYWJsZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGNhY2hlYWJsZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQ2FjaGVhYmxlMl8wCi0JZXh0ZW5kcyBDYWNoZWFibGUyXzAsIFhtbENvbnRleHROb2RlCi17CQotCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNhY2hlYWJsZUhvbGRlcjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGYyMWFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQ2FjaGVhYmxlSG9sZGVyMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzA7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY2FjaGVhYmxlIGhvbGRlci9wYXJlbnQKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUNhY2hlYWJsZUhvbGRlcjJfMAotCWV4dGVuZHMgQ2FjaGVhYmxlSG9sZGVyMl8wLCBYbWxDb250ZXh0Tm9kZQotewotCVhtbENhY2hlYWJsZV8yXzAgZ2V0WG1sQ2FjaGVhYmxlKCk7Ci0JT3JtQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1DYXNjYWRlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNhc2NhZGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZhOTVmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNhc2NhZGUyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhc2NhZGUyXzA7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gY2FzY2FkZSAocGVyc2lzdCwgbWVyZ2UsIHJlbW92ZSwgcmVmcmVzaCwgZGV0YWNoKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQ2FzY2FkZTJfMAotCWV4dGVuZHMgT3JtQ2FzY2FkZSwgQ2FzY2FkZTJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZjRjMDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Db2xsZWN0aW9uTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uTWFwcGluZzJfMDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBjb2xsZWN0aW9uIG1hcHBpbmcgKGUuZy4gMTptLCBtOm0sIGVsZW1lbnQgY29sbGVjdGlvbikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUNvbGxlY3Rpb25NYXBwaW5nMl8wCi0JZXh0ZW5kcyBDb2xsZWN0aW9uTWFwcGluZzJfMCwgT3JtQ29sbGVjdGlvbk1hcHBpbmcsIE9ybUNvbnZlcnRpYmxlS2V5TWFwcGluZzJfMAotewotCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQlMaXN0SXRlcmFibGU8PyBleHRlbmRzIE9ybUpvaW5Db2x1bW4+IGdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0JT3JtSm9pbkNvbHVtbiBnZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCk7Ci0JT3JtSm9pbkNvbHVtbiBhZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQlPcm1Kb2luQ29sdW1uIGdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Db2xsZWN0aW9uVGFibGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0YTBkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUNvbGxlY3Rpb25UYWJsZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWZlcmVuY2VUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBjb2xsZWN0aW9uIHRhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1Db2xsZWN0aW9uVGFibGUyXzAKLQlleHRlbmRzIENvbGxlY3Rpb25UYWJsZTJfMCwgT3JtUmVmZXJlbmNlVGFibGUKLXsKLQl2b2lkIGluaXRpYWxpemVGcm9tKENvbGxlY3Rpb25UYWJsZTJfMCBvbGRDb2xsZWN0aW9uVGFibGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Db252ZXJ0aWJsZUtleU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtQ29udmVydGlibGVLZXlNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NThmZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1Db252ZXJ0aWJsZUtleU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db252ZXJ0aWJsZUtleU1hcHBpbmcyXzA7Ci0KLS8qKgotICogSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyB0aGF0IGhhcyBhIGtleSBjb252ZXJ0ZXIsIGNvbGxlY3Rpb24gbWFwcGluZ3MKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQ29udmVydGlibGVLZXlNYXBwaW5nMl8wCi0JZXh0ZW5kcyBDb252ZXJ0aWJsZUtleU1hcHBpbmcyXzAsIE9ybUF0dHJpYnV0ZU1hcHBpbmcKLXsKLQlPcm1Db252ZXJ0ZXIgZ2V0TWFwS2V5Q29udmVydGVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybURlcml2ZWRJZGVudGl0eTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1EZXJpdmVkSWRlbnRpdHkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFlNDQ4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybURlcml2ZWRJZGVudGl0eTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5EZXJpdmVkSWRlbnRpdHkyXzA7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gZGVyaXZlZCBpZGVudGl0eQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRGVyaXZlZElkZW50aXR5Ml8wCi0JZXh0ZW5kcyBEZXJpdmVkSWRlbnRpdHkyXzAsIFhtbENvbnRleHROb2RlCi17Ci0JT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCBnZXRNYXBwaW5nKCk7Ci0KLQlPcm1JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQotCU9ybU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0KLQl2b2lkIGluaXRpYWxpemVGcm9tKE9ybURlcml2ZWRJZGVudGl0eTJfMCBvbGREZXJpdmVkSWRlbnRpdHkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODYyZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wCi0JZXh0ZW5kcyBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIE9ybUNvbGxlY3Rpb25NYXBwaW5nMl8wLCBPcm1Db252ZXJ0aWJsZU1hcHBpbmcKLXsKLQlYbWxFbGVtZW50Q29sbGVjdGlvbiBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0KLQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0KLQlPcm1Db2x1bW4gZ2V0VmFsdWVDb2x1bW4oKTsKLQotCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgZ2V0VmFsdWVBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjNzliYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbWJlZGRlZE1hcHBpbmcyXzA7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBlbWJlZGRlZCBtYXBwaW5nCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1FbWJlZGRlZE1hcHBpbmcyXzAKLQlleHRlbmRzIEVtYmVkZGVkTWFwcGluZzJfMCwgT3JtRW1iZWRkZWRNYXBwaW5nCi17Ci0JT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU4N2RmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5JZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IElEIGRlcml2ZWQgaWRlbnRpdHkgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybUlkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgCi0JZXh0ZW5kcyBYbWxDb250ZXh0Tm9kZSwgSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMAotewotCXZvaWQgaW5pdGlhbGl6ZUZyb20oT3JtSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMCBvbGRTdHJhdGVneSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MzA1MTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gbTptIG1hcHBpbmcKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wCi0JZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZzJfMCwgT3JtTWFueVRvTWFueU1hcHBpbmcsIE9ybUNvbGxlY3Rpb25NYXBwaW5nMl8wCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIG1hcHBpbmdzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTVkYTQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IG06MSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFueVRvT25lTWFwcGluZzJfMAotCWV4dGVuZHMgTWFueVRvT25lTWFwcGluZzJfMCwgT3JtTWFueVRvT25lTWFwcGluZywgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzN2I2YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIDxjb2RlPm9ybS54bWw8L2NvZGU+IG06MSByZWxhdGlvbnNoaXAKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMAotCWV4dGVuZHMgTWFueVRvT25lUmVsYXRpb25zaGlwMl8wLAotCQlPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAsCi0JCU9ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYXBLZXlFbnVtZXJhdGVkQ29udmVydGVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcEtleUVudW1lcmF0ZWRDb252ZXJ0ZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMzYjllMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcEtleUVudW1lcmF0ZWRDb252ZXJ0ZXIyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IGVudW1lcmF0ZWQgY29udmVydGVyCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU1hcEtleUVudW1lcmF0ZWRDb252ZXJ0ZXIyXzAKLQlleHRlbmRzIEVudW1lcmF0ZWRDb252ZXJ0ZXIsIE9ybUNvbnZlcnRlcgotewotCS8vICoqKioqKioqKiogYWRhcHRlciAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEFkYXB0ZXIKLQkJaW1wbGVtZW50cyBPcm1Db252ZXJ0ZXIuQWRhcHRlcgotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgQWRhcHRlciBJTlNUQU5DRSA9IG5ldyBBZGFwdGVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgQWRhcHRlciBpbnN0YW5jZSgpIHsKLQkJCXJldHVybiBJTlNUQU5DRTsKLQkJfQotCi0JCXByaXZhdGUgQWRhcHRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gZ2V0Q29udmVydGVyVHlwZSgpIHsKLQkJCXJldHVybiBFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZENvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCVhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAgeG1sTWFwcGluZyA9IChYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wKSBwYXJlbnQuZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCQkJcmV0dXJuICh4bWxNYXBwaW5nLmdldE1hcEtleUVudW1lcmF0ZWQoKSA9PSBudWxsKSA/IG51bGwgOiBmYWN0b3J5LmJ1aWxkT3JtRW51bWVyYXRlZENvbnZlcnRlcihwYXJlbnQsIHRoaXMuYnVpbGRPd25lcih4bWxNYXBwaW5nKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT3JtRW51bWVyYXRlZENvbnZlcnRlci5Pd25lciBidWlsZE93bmVyKGZpbmFsIFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAgbWFwcGluZykgewotCQkJcmV0dXJuIG5ldyBPcm1FbnVtZXJhdGVkQ29udmVydGVyLk93bmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNldFhtbEVudW1UeXBlKEVudW1UeXBlIGVudW1UeXBlKSB7Ci0JCQkJCW1hcHBpbmcuc2V0TWFwS2V5RW51bWVyYXRlZChlbnVtVHlwZSk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBFbnVtVHlwZSBnZXRYbWxFbnVtVHlwZSgpIHsKLQkJCQkJcmV0dXJuIG1hcHBpbmcuZ2V0TWFwS2V5RW51bWVyYXRlZCgpOwotCQkJCX0KLQkJCQkKLQkJCQlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1UZXh0UmFuZ2UoKSB7Ci0JCQkJCXJldHVybiBtYXBwaW5nLmdldE1hcEtleUVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSnB0VmFsaWRhdG9yIGJ1aWxkVmFsaWRhdG9yKENvbnZlcnRlciBjb252ZXJ0ZXIsIENvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyIHRleHRSYW5nZVJlc29sdmVyKSB7Ci0JCQkJCXJldHVybiBKcHRWYWxpZGF0b3IuTnVsbC5pbnN0YW5jZSgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZShYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcpIHsKLQkJCXJldHVybiAoKFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzApIHhtbE1hcHBpbmcpLmdldE1hcEtleUVudW1lcmF0ZWQoKSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE5ld0NvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtRW51bWVyYXRlZENvbnZlcnRlcihwYXJlbnQsIHRoaXMuYnVpbGRPd25lcigoWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCkgcGFyZW50LmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xlYXJYbWxWYWx1ZShYbWxBdHRyaWJ1dGVNYXBwaW5nIHhtbE1hcHBpbmcpIHsKLQkJCSgoWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCkgeG1sTWFwcGluZykuc2V0TWFwS2V5RW51bWVyYXRlZChudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXIyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgxZGUzNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LkpwdFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LkNvbnZlcnRlclRleHRSYW5nZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtLk9ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiB0ZW1wb3JhbCBjb252ZXJ0ZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFwS2V5VGVtcG9yYWxDb252ZXJ0ZXIyXzAKLQlleHRlbmRzIE9ybVRlbXBvcmFsQ29udmVydGVyCi17Ci0KLQkvLyAqKioqKioqKioqIGFkYXB0ZXIgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBZGFwdGVyCi0JCWltcGxlbWVudHMgT3JtQ29udmVydGVyLkFkYXB0ZXIKLQl7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIEFkYXB0ZXIgSU5TVEFOQ0UgPSBuZXcgQWRhcHRlcigpOwotCQlwdWJsaWMgc3RhdGljIEFkYXB0ZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQotCQlwcml2YXRlIEFkYXB0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGdldENvbnZlcnRlclR5cGUoKSB7Ci0JCQlyZXR1cm4gVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3M7Ci0JCX0KLQotCQlwdWJsaWMgT3JtQ29udmVydGVyIGJ1aWxkQ29udmVydGVyKE9ybUF0dHJpYnV0ZU1hcHBpbmcgcGFyZW50LCBPcm1YbWxDb250ZXh0Tm9kZUZhY3RvcnkgZmFjdG9yeSkgewotCQkJWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCB4bWxNYXBwaW5nID0gKFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzApIHBhcmVudC5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCQlyZXR1cm4gKHhtbE1hcHBpbmcuZ2V0TWFwS2V5VGVtcG9yYWwoKSA9PSBudWxsKSA/IG51bGwgOiBmYWN0b3J5LmJ1aWxkT3JtVGVtcG9yYWxDb252ZXJ0ZXIocGFyZW50LCB0aGlzLmJ1aWxkT3duZXIoeG1sTWFwcGluZykpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9ybVRlbXBvcmFsQ29udmVydGVyLk93bmVyIGJ1aWxkT3duZXIoZmluYWwgWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCBtYXBwaW5nKSB7Ci0JCQlyZXR1cm4gbmV3IE9ybVRlbXBvcmFsQ29udmVydGVyLk93bmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNldFhtbFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCQkJCW1hcHBpbmcuc2V0TWFwS2V5VGVtcG9yYWwodGVtcG9yYWxUeXBlKTsKLQkJCQl9Ci0JCQkJCi0JCQkJcHVibGljIFRlbXBvcmFsVHlwZSBnZXRYbWxUZW1wb3JhbFR5cGUoKSB7Ci0JCQkJCXJldHVybiBtYXBwaW5nLmdldE1hcEtleVRlbXBvcmFsKCk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCQkJCXJldHVybiBtYXBwaW5nLmdldE1hcEtleVRlbXBvcmFsVGV4dFJhbmdlKCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIEpwdFZhbGlkYXRvciBidWlsZFZhbGlkYXRvcihDb252ZXJ0ZXIgY29udmVydGVyLCBDb252ZXJ0ZXJUZXh0UmFuZ2VSZXNvbHZlciB0ZXh0UmFuZ2VSZXNvbHZlcikgewotCQkJCQlyZXR1cm4gbmV3IE9ybU1hcEtleVRlbXBvcmFsQ29udmVydGVyVmFsaWRhdG9yKChUZW1wb3JhbENvbnZlcnRlcikgY29udmVydGVyLCB0ZXh0UmFuZ2VSZXNvbHZlcik7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKFhtbEF0dHJpYnV0ZU1hcHBpbmcgeG1sTWFwcGluZykgewotCQkJcmV0dXJuICgoWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCkgeG1sTWFwcGluZykuZ2V0TWFwS2V5VGVtcG9yYWwoKSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIE9ybUNvbnZlcnRlciBidWlsZE5ld0NvbnZlcnRlcihPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5IGZhY3RvcnkpIHsKLQkJCXJldHVybiBmYWN0b3J5LmJ1aWxkT3JtVGVtcG9yYWxDb252ZXJ0ZXIocGFyZW50LCB0aGlzLmJ1aWxkT3duZXIoKFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzApIHBhcmVudC5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNsZWFyWG1sVmFsdWUoWG1sQXR0cmlidXRlTWFwcGluZyB4bWxNYXBwaW5nKSB7Ci0JCQkoKFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzApIHhtbE1hcHBpbmcpLnNldE1hcEtleVRlbXBvcmFsKG51bGwpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1YTNlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHBpbmdKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGluZyBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFwcGluZ0pvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotCWV4dGVuZHMgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLCBPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHBpbmdKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGFlOGZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGluZyBqb2luIHRhYmxlIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLQlleHRlbmRzIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCwgT3JtSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwcGluZ01hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkM2U1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHBpbmdNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtYXBwaW5nICJtYXBwZWQgYnkiIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYXBwaW5nTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTJfMAotCWV4dGVuZHMgT3JtTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLCBPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci17Ci0JLy8gY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHBpbmdQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHBpbmdQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjYxYzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYXBwaW5nUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbWFwcGluZyBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWxhdGlvbnNoaXAgc3RyYXRlZ3kKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFwcGluZ1ByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLQlleHRlbmRzIE9ybU1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCwgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwcGluZ1JlbGF0aW9uc2hpcFN0cmF0ZWd5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjA0ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1NYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMDsKLQotLyoqCi0gKiA8Y29kZT5vcm0ueG1sPC9jb2RlPiBtYXBwaW5nIHJlbGF0aW9uc2hpcCBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1NYXBwaW5nUmVsYXRpb25zaGlwU3RyYXRlZ3kyXzAKLQlleHRlbmRzIE1hcHBpbmdSZWxhdGlvbnNoaXBTdHJhdGVneTJfMCwgT3JtUmVsYXRpb25zaGlwU3RyYXRlZ3kKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY2ODY5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wOwotCi0vKioKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IG1hcHMgSUQgZGVyaXZlZCBpZGVudGl0eSBzdHJhdGVneQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAKLQlleHRlbmRzIFhtbENvbnRleHROb2RlLCBNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMAotewotCXZvaWQgaW5pdGlhbGl6ZUZyb20oT3JtTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3kyXzAgb2xkU3RyYXRlZ3kpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1OYW1lZFF1ZXJ5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnkyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VhYTU2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnkyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk5hbWVkUXVlcnkyXzA7Ci0KLS8qKgotICogSlBBIDIuMAotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gbmFtZWQgcXVlcnkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU5hbWVkUXVlcnkyXzAKLQlleHRlbmRzIE9ybU5hbWVkUXVlcnksIE5hbWVkUXVlcnkyXzAKLXsKLQkvLyBjb21iaW5lIDIgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdjODFlZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiAxOm0gbWFwcGluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9NYW55TWFwcGluZzJfMAotCWV4dGVuZHMgT25lVG9NYW55TWFwcGluZzJfMCwgT3JtT25lVG9NYW55TWFwcGluZywgT3JtQ29sbGVjdGlvbk1hcHBpbmcyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMmFlMjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55UmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gMTptIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wCi0JZXh0ZW5kcyBPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzAsCi0JCQlPcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAsCi0JCQlPcm1NYXBwaW5nSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc4ZmE4YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiAxOjEgbWFwcGluZy4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU9uZVRvT25lTWFwcGluZzJfMAotCWV4dGVuZHMgT25lVG9PbmVNYXBwaW5nMl8wLCBPcm1PbmVUb09uZU1hcHBpbmcsIE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODBiNDcxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwaW5nSm9pblRhYmxlUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gMToxIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAKLQlleHRlbmRzIE9uZVRvT25lUmVsYXRpb25zaGlwMl8wLAotCQlPcm1PbmVUb09uZVJlbGF0aW9uc2hpcCwKLQkJT3JtTWFwcGluZ0pvaW5UYWJsZVJlbGF0aW9uc2hpcAotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9yZGVyQ29sdW1uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9yZGVyQ29sdW1uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDIxMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PcmRlckNvbHVtbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW47Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gb3JkZXIgY29sdW1uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1PcmRlckNvbHVtbjJfMAotCWV4dGVuZHMgT3JkZXJDb2x1bW4yXzAsIE9ybU5hbWVkQ29sdW1uCi17Ci0JWG1sT3JkZXJDb2x1bW4gZ2V0WG1sQ29sdW1uKCk7Ci0KLQotCS8vICoqKioqKioqKiogb3duZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogaW50ZXJmYWNlIGFsbG93aW5nIG9yZGVyIGNvbHVtbnMgdG8gYmUgdXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMKLQkgKi8KLQlpbnRlcmZhY2UgT3duZXIKLQkJZXh0ZW5kcyBPcm1SZWFkT25seU5hbWVkQ29sdW1uLk93bmVyCi0JewotCQlYbWxPcmRlckNvbHVtbiBnZXRYbWxDb2x1bW4oKTsKLQkJWG1sT3JkZXJDb2x1bW4gYnVpbGRYbWxDb2x1bW4oKTsKLQkJdm9pZCByZW1vdmVYbWxDb2x1bW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9yZGVyYWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PcmRlcmFibGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhiZDUyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9yZGVyYWJsZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PcmRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBvcmRlcmluZwotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT3JkZXJhYmxlMl8wCi0JZXh0ZW5kcyBPcmRlcmFibGUyXzAsIE9ybU9yZGVyYWJsZQotewotCU9ybU9yZGVyQ29sdW1uMl8wIGdldE9yZGVyQ29sdW1uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWJsZTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PcnBoYW5SZW1vdmFibGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2NmMyMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWJsZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7Ci0KLS8qKgotICogPGNvZGU+b3JtLnhtbDwvY29kZT4gb3JwaGFuIHJlbW92YWwKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybU9ycGhhblJlbW92YWJsZTJfMAotCWV4dGVuZHMgWG1sQ29udGV4dE5vZGUsIE9ycGhhblJlbW92YWJsZTJfMAotewkKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFmOGNhOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybU9ycGhhblJlbW92YWxIb2xkZXIyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMAotCWV4dGVuZHMgT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCwgWG1sQ29udGV4dE5vZGUKLXsKLQlPcm1PcnBoYW5SZW1vdmFibGUyXzAgZ2V0T3JwaGFuUmVtb3ZhbCgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2IyYTZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gYXNzb2NpYXRpb24gb3ZlcnJpZGUgcmVsYXRpb25zaGlwCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMCAKLQlleHRlbmRzIE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wLAotCQkJT3JtT3ZlcnJpZGVSZWxhdGlvbnNoaXAsCi0JCQlPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXAKLXsKLQlPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRKb2luVGFibGVTdHJhdGVneSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0czJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjUxZTdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzMl8wOwotCi0vKioKLSAqIEpQQSAyLjAgY29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICogWE1MIHJlc291cmNlIG1vZGVsIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wfSwKLSAqIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzPC9jb2RlPiBlbGVtZW50Ci0gKiBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzMl8wCi0JZXh0ZW5kcyBNYXBwaW5nRmlsZVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzMl8wLCBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotewotCXZvaWQgc2V0RGVsaW1pdGVkSWRlbnRpZmllcnMoYm9vbGVhbiB2YWx1ZSk7Ci0JCVN0cmluZyBERUxJTUlURURfSURFTlRJRklFUlNfUFJPUEVSVFkgPSAiZGVsaW1pdGVkSWRlbnRpZmllcnMiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYzE1OGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEyXzA7Ci0KLS8qKgotICogSlBBIDIuMAotICogQ29udGV4dCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW5jZSB1bml0IG1ldGFkYXRhLgotICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICogWE1MIHJlc291cmNlIG1vZGVsIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhfSwKLSAqIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5wZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhPC9jb2RlPiBlbGVtZW50Ci0gKiBpbiB0aGUgPGNvZGU+b3JtLnhtbDwvY29kZT4gZmlsZS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEyXzAKLQlleHRlbmRzIE1hcHBpbmdGaWxlUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEyXzAsIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhCi17Ci0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOwotCQlTdHJpbmcgREVTQ1JJUFRJT05fUFJPUEVSVFkgPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjEwY2QwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLQotLyoqCi0gKiBKUEEgMi4wCi0gKiBDb250ZXh0IDxjb2RlPm9ybS54bWw8L2NvZGU+IHBlcnNpc3RlbnQgPGVtPmF0dHJpYnV0ZTwvZW0+Ci0gKiAoZmllbGQgb3IgcHJvcGVydHkpLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMAotCWV4dGVuZHMgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgUGVyc2lzdGVudEF0dHJpYnV0ZTJfMAotewotCS8vIGNvbWJpbmUgdHdvIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtUGVyc2lzdGVudFR5cGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlNjNhMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVBlcnNpc3RlbnRUeXBlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5QZXJzaXN0ZW50VHlwZTJfMDsKLQotLyoqCi0gKiBKUEEgMi4wIGNvbnRleHQgPGNvZGU+b3JtLnhtbDwvY29kZT4gcGVyc2lzdGVudCB0eXBlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtUGVyc2lzdGVudFR5cGUyXzAKLQlleHRlbmRzIE9ybVBlcnNpc3RlbnRUeXBlLCBQZXJzaXN0ZW50VHlwZTJfMAotewotCUxpc3RJdGVyYWJsZTxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldEF0dHJpYnV0ZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmYxYzlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTJfMDsKLQotLyoqCi0gKiBKUEEgMi4wCi0gKiBSZWFkLW9ubHkgY29udGV4dCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBwZXJzaXN0ZW50IDxlbT5hdHRyaWJ1dGU8L2VtPgotICogKGZpZWxkIG9yIHByb3BlcnR5KS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTJfMAotCWV4dGVuZHMgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzAKLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDlhM2RiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yMl8wOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IHNlcXVlbmNlIGdlbmVyYXRvcgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzAKLQlleHRlbmRzIFNlcXVlbmNlR2VuZXJhdG9yMl8wLCBPcm1TZXF1ZW5jZUdlbmVyYXRvcgotewotCS8vIGNvbWJpbmUgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L29ybS9Pcm1TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1YzljMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzA7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiBzaW5nbGUgKDE6MSwgbToxKSBtYXBwaW5nLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMAotCWV4dGVuZHMgU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZzJfMCwgT3JtU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotewotCU9ybURlcml2ZWRJZGVudGl0eTJfMCBnZXREZXJpdmVkSWRlbnRpdHkoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNhZTVlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wOwotCi0vKioKLSAqIEpQQSAyLjAKLSAqIDxjb2RlPm9ybS54bWw8L2NvZGU+IDxlbT52aXJ0dWFsPC9lbT4gYXNzb2NpYXRpb24gb3ZlcnJpZGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUyXzAKLQlleHRlbmRzIE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLCBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUyXzAKLXsKLQkvLyBjb21iaW5lIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmMzNmZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzA7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5vcm0ueG1sPC9jb2RlPiB2aXJ0dWFsIGFzc29jaWF0aW9uIG92ZXJyaWRlIHJlbGF0aW9uc2hpcAotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1WaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzAKLQlleHRlbmRzIFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCwKLQkJCU9ybVZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcCwKLQkJCU9ybVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXAKLXsKLQlPcm1WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvb3JtL09ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzlkYTUyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9vcm0vT3JtWG1sMl8wQ29udGV4dE5vZGVGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbENvbnRleHROb2RlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotCi0vKioKLSAqIEpQQSAyLjAgPGNvZGU+b3JtLnhtbDwvY29kZT4gY29udGV4dCBub2RlIGZhY3RvcnkKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVhtbDJfMENvbnRleHROb2RlRmFjdG9yeQotCWV4dGVuZHMgT3JtWG1sQ29udGV4dE5vZGVGYWN0b3J5Ci17Ci0JT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBidWlsZE9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoT3JtRW1iZWRkZWRNYXBwaW5nMl8wIHBhcmVudCwgT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjJfMC5Pd25lciBvd25lcik7Ci0JCi0JT3JtRGVyaXZlZElkZW50aXR5Ml8wIGJ1aWxkT3JtRGVyaXZlZElkZW50aXR5KE9ybVNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcyXzAgcGFyZW50KTsKLQkKLQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYnVpbGRPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQsIFhtbEVsZW1lbnRDb2xsZWN0aW9uIHJlc291cmNlTWFwcGluZyk7Ci0JCi0JT3JtQ2FjaGVhYmxlMl8wIGJ1aWxkT3JtQ2FjaGVhYmxlKE9ybUNhY2hlYWJsZUhvbGRlcjJfMCBwYXJlbnQpOwotCQotCU9ybU9ycGhhblJlbW92YWJsZTJfMCBidWlsZE9ybU9ycGhhblJlbW92YWwoT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCBwYXJlbnQpOwotCQotCU9ybU9yZGVyYWJsZTJfMCBidWlsZE9ybU9yZGVyYWJsZShPcm1BdHRyaWJ1dGVNYXBwaW5nIHBhcmVudCwgT3JkZXJhYmxlMl8wLk93bmVyIG93bmVyKTsKLQkKLQlPcm1PcmRlckNvbHVtbjJfMCBidWlsZE9ybU9yZGVyQ29sdW1uKE9ybU9yZGVyYWJsZTJfMCBwYXJlbnQsIE9ybU9yZGVyQ29sdW1uMl8wLk93bmVyIG93bmVyKTsKLQkKLQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgYnVpbGRPcm1Db2xsZWN0aW9uVGFibGUoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHBhcmVudCwgVGFibGUuT3duZXIgb3duZXIpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4Y2Y0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2UyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1ldGFtb2RlbFN5bmNocm9uaXplcjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+cGVyc2lzdGVuY2U8L2NvZGU+IGVsZW1lbnQgaW4gdGhlIEpQQSAyLjAgPGNvZGU+cGVyc2lzdGVuY2UueG1sPC9jb2RlPiBmaWxlLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2UyXzAKLQlleHRlbmRzIFBlcnNpc3RlbmNlLCBNZXRhbW9kZWxTeW5jaHJvbml6ZXIKLXsKLQkvLyBub3RoaW5nIHlldC4uLgotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdDJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2Y1ZTA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXQyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NZXRhbW9kZWxTeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuVmFsaWRhdGlvbk1vZGU7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5wZXJzaXN0ZW5jZS11bml0PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VVbml0Ml8wCi0JZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXQsIE1ldGFtb2RlbFN5bmNocm9uaXplcgotewotCS8vICoqKioqKioqKiogc2hhcmVkIGNhY2hlIG1vZGUgKioqKioqKioqKgotCi0JLyoqIAotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNoYXJlZCBjYWNoZSBtb2RlLAotCSAqIHdoZXRoZXIgc3BlY2lmaWVkIG9yIGRlZmF1bHRlZC4KLQkgKi8KLQlTaGFyZWRDYWNoZU1vZGUgZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyAKLQkgKiBzcGVjaWZpZWQgc2hhcmVkIGNhY2hlIG1vZGUKLQkgKi8KLQlTdHJpbmcgU1BFQ0lGSUVEX1NIQVJFRF9DQUNIRV9NT0RFX1BST1BFUlRZID0gInNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiAKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBzcGVjaWZpZWQgc2hhcmVkIGNhY2hlIG1vZGUuCi0JICovCi0JU2hhcmVkQ2FjaGVNb2RlIGdldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZSgpOwotCi0JLyoqIAotCSAqIFNldCB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNwZWNpZmllZCBzaGFyZWQgY2FjaGUgbW9kZS4KLQkgKi8KLQl2b2lkIHNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUgc2hhcmVkQ2FjaGVNb2RlKTsKLQotCS8qKgotCSAqIFN0cmluZyBjb25zdGFudCBhc3NvY2lhdGVkIHdpdGggY2hhbmdlcyB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIAotCSAqIGRlZmF1bHQgc2hhcmVkIGNhY2hlIG1vZGUgKG5vdCB0eXBpY2FsbHkgY2hhbmdlZCkuCi0JICovCi0JU3RyaW5nIERFRkFVTFRfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFkgPSAiZGVmYXVsdFNoYXJlZENhY2hlTW9kZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKiAKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyBkZWZhdWx0IHNoYXJlZCBjYWNoZSBtb2RlLgotCSAqLwotCVNoYXJlZENhY2hlTW9kZSBnZXREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0KLQlib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKTsKLQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiBtb2RlICoqKioqKioqKioKLQotCS8qKiAKLQkgKiBSZXR1cm4gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyB2YWxpZGF0aW9uIG1vZGUsCi0JICogd2hldGhlciBzcGVjaWZpZWQgb3IgZGVmYXVsdGVkLgotCSAqLwotCVZhbGlkYXRpb25Nb2RlIGdldFZhbGlkYXRpb25Nb2RlKCk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyAKLQkgKiBzcGVjaWZpZWQgdmFsaWRhdGlvbiBtb2RlCi0JICovCi0JU3RyaW5nIFNQRUNJRklFRF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFkgPSAic3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKiogCi0JICogUmV0dXJuIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3Mgc3BlY2lmaWVkIHZhbGlkYXRpb24gbW9kZS4KLQkgKi8KLQlWYWxpZGF0aW9uTW9kZSBnZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZSgpOwotCi0JLyoqIAotCSAqIFNldCB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIHNwZWNpZmllZCB2YWxpZGF0aW9uIG1vZGUuCi0JICovCi0Jdm9pZCBzZXRTcGVjaWZpZWRWYWxpZGF0aW9uTW9kZShWYWxpZGF0aW9uTW9kZSB2YWxpZGF0aW9uTW9kZSk7Ci0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncyAKLQkgKiBkZWZhdWx0IHZhbGlkYXRpb24gbW9kZSAobm90IHR5cGljYWxseSBjaGFuZ2VkKS4KLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFkgPSAiZGVmYXVsdFZhbGlkYXRpb25Nb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIAotCSAqIFJldHVybiB0aGUgcGVyc2lzdGVuY2UgdW5pdCdzIGRlZmF1bHQgdmFsaWRhdGlvbiBtb2RlLgotCSAqLwotCVZhbGlkYXRpb25Nb2RlIGdldERlZmF1bHRWYWxpZGF0aW9uTW9kZSgpOwotCQotCVZhbGlkYXRpb25Nb2RlIERFRkFVTFRfVkFMSURBVElPTl9NT0RFID0gVmFsaWRhdGlvbk1vZGUuQVVUTzsKLQotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0KLQlQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldENvbm5lY3Rpb24oKTsKLQotCVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0T3B0aW9ucygpOwotCi0JLy8gKioqKioqKioqKiBPUk0gcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTdHJpbmcgY29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIGNoYW5nZXMgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQncwotCSAqIGRlZmF1bHQgImRlbGltaXRlZCBpZGVudGlmaWVycyIgZmxhZy4KLQkgKi8KLQlTdHJpbmcgREVGQVVMVF9ERUxJTUlURURfSURFTlRJRklFUlNfUFJPUEVSVFkgPSAiZGVmYXVsdERlbGltaXRlZElkZW50aWZpZXJzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0ICJkZWxpbWl0ZWQgaWRlbnRpZmllcnMiIGZsYWcgZnJvbSB0aGUgZmlyc3QgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cwotCSAqIGZvdW5kIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0J3MgbGlzdCBvZiBtYXBwaW5nIGZpbGVzLgotCSAqLwotCWJvb2xlYW4gZ2V0RGVmYXVsdERlbGltaXRlZElkZW50aWZpZXJzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbDJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MDdhOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NZXRhbW9kZWxTeW5jaHJvbml6ZXI7Ci0KLS8qKgotICogSlBBIDIuMCA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVhtbDJfMAotCWV4dGVuZHMgUGVyc2lzdGVuY2VYbWwsIE1ldGFtb2RlbFN5bmNocm9uaXplcgotewotCS8vIG5vdGhpbmcgeWV0Li4uCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KcGFDb25uZWN0aW9uMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KcGFDb25uZWN0aW9uMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDNmYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSnBhQ29ubmVjdGlvbjJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUNvbm5lY3Rpb24yXzAKLQlleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMKLXsJCQotCVN0cmluZyBnZXREZWZhdWx0RHJpdmVyKCk7Ci0JU3RyaW5nIGdldERyaXZlcigpOwotCXZvaWQgc2V0RHJpdmVyKFN0cmluZyBuZXdEcml2ZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9QUk9QRVJUWSA9ICJkcml2ZXIiOyAvLyROT04tTkxTLTEkCi0JCS8vIFByb3BlcnR5IGtleQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0pEQkNfRFJJVkVSID0gImphdmF4LnBlcnNpc3RlbmNlLmpkYmMuZHJpdmVyIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfSkRCQ19EUklWRVIgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkKLQlTdHJpbmcgZ2V0RGVmYXVsdFVybCgpOwotCVN0cmluZyBnZXRVcmwoKTsKLQl2b2lkIHNldFVybChTdHJpbmcgbmV3VXJsKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfUFJPUEVSVFkgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBQcm9wZXJ0eSBrZXkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9KREJDX1VSTCA9ICJqYXZheC5wZXJzaXN0ZW5jZS5qZGJjLnVybCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pEQkNfVVJMID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JU3RyaW5nIGdldERlZmF1bHRVc2VyKCk7Ci0JU3RyaW5nIGdldFVzZXIoKTsKLQl2b2lkIHNldFVzZXIoU3RyaW5nIG5ld1VzZXIpOwotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfUFJPUEVSVFkgPSAidXNlciI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gUHJvcGVydHkga2V5Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfSkRCQ19VU0VSID0gImphdmF4LnBlcnNpc3RlbmNlLmpkYmMudXNlciI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pEQkNfVVNFUiA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQotCVN0cmluZyBnZXREZWZhdWx0UGFzc3dvcmQoKTsKLQlTdHJpbmcgZ2V0UGFzc3dvcmQoKTsKLQl2b2lkIHNldFBhc3N3b3JkKFN0cmluZyBuZXdQYXNzd29yZCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfUFJPUEVSVFkgPSAicGFzc3dvcmQiOyAvLyROT04tTkxTLTEkCi0JCS8vIFByb3BlcnR5IGtleQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQgPSAiamF2YXgucGVyc2lzdGVuY2UuamRiYy5wYXNzd29yZCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pEQkNfUEFTU1dPUkQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnBhT3B0aW9uczJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvSnBhT3B0aW9uczJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU0MzNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL0pwYU9wdGlvbnMyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFPcHRpb25zMl8wCi0JZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzCi17Ci0JSW50ZWdlciBnZXREZWZhdWx0TG9ja1RpbWVvdXQoKTsKLQlJbnRlZ2VyIGdldExvY2tUaW1lb3V0KCk7Ci0Jdm9pZCBzZXRMb2NrVGltZW91dChJbnRlZ2VyIG5ld0xvY2tUaW1lb3V0KTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1RJTUVPVVRfUFJPUEVSVFkgPSAibG9ja1RpbWVvdXQiOyAvLyROT04tTkxTLTEkCi0JCS8vIFByb3BlcnR5IGtleQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX0xPQ0tfVElNRU9VVCA9ICJqYXZheC5wZXJzaXN0ZW5jZS5sb2NrLnRpbWVvdXQiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfTE9DS19USU1FT1VUID0gSW50ZWdlci52YWx1ZU9mKDUpOwotCi0JSW50ZWdlciBnZXREZWZhdWx0UXVlcnlUaW1lb3V0KCk7Ci0JSW50ZWdlciBnZXRRdWVyeVRpbWVvdXQoKTsKLQl2b2lkIHNldFF1ZXJ5VGltZW91dChJbnRlZ2VyIG5ld1F1ZXJ5VGltZW91dCk7Ci0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfVElNRU9VVF9QUk9QRVJUWSA9ICJxdWVyeVRpbWVvdXQiOyAvLyROT04tTkxTLTEkCi0JCS8vIFByb3BlcnR5IGtleQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQgPSAiamF2YXgucGVyc2lzdGVuY2UucXVlcnkudGltZW91dCI7IC8vJE5PTi1OTFMtMSQKLQkJc3RhdGljIGZpbmFsIEludGVnZXIgREVGQVVMVF9RVUVSWV9USU1FT1VUID0gSW50ZWdlci52YWx1ZU9mKDUpOwotCi0JTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMoKTsKLQlpbnQgZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNTaXplKCk7Ci0JYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0RXhpc3RzKFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2xhc3NOYW1lKTsKLQlTdHJpbmcgYWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENsYXNzTmFtZSk7Ci0Jdm9pZCByZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KFN0cmluZyB2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0Q2xhc3NOYW1lKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QgPSAidmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHMiOyAvLyROT04tTkxTLTEkCi0JCXN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSA9ICJ2YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0IjsgLy8kTk9OLU5MUy0xJAotCQkvLyBQcm9wZXJ0eSBrZXkKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUID0gImphdmF4LnBlcnNpc3RlbmNlLnZhbGlkYXRpb24uZ3JvdXAucHJlLXBlcnNpc3QiOyAvLyROT04tTkxTLTEkCi0KLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCk7Ci0JaW50IGdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNTaXplKCk7Ci0JYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNsYXNzTmFtZSk7Ci0JU3RyaW5nIGFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2xhc3NOYW1lKTsKLQl2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ2xhc3NOYW1lKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCA9ICJ2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSA9ICJ2YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUiOyAvLyROT04tTkxTLTEkCi0JCS8vIFByb3BlcnR5IGtleQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURSA9ICJqYXZheC5wZXJzaXN0ZW5jZS52YWxpZGF0aW9uLmdyb3VwLnByZS11cGRhdGUiOyAvLyROT04tTkxTLTEkCi0KLQlMaXN0SXRlcmFibGU8U3RyaW5nPiBnZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzKCk7Ci0JaW50IGdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCk7Ci0JYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMoU3RyaW5nIHZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNsYXNzTmFtZSk7Ci0JU3RyaW5nIGFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgbmV3VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ2xhc3NOYW1lKTsKLQl2b2lkIHJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShTdHJpbmcgdmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ2xhc3NOYW1lKTsKLQkJc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCA9ICJ2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzIjsgLy8kTk9OLU5MUy0xJAotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSA9ICJ2YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUiOyAvLyROT04tTkxTLTEkCi0JCS8vIFByb3BlcnR5IGtleQotCQlzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRSA9ICJqYXZheC5wZXJzaXN0ZW5jZS52YWxpZGF0aW9uLmdyb3VwLnByZS1yZW1vdmUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TaGFyZWRDYWNoZU1vZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1NoYXJlZENhY2hlTW9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzg3NGFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9vcHRpb25zL1NoYXJlZENhY2hlTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMDsKLQotLyoqCi0gKiBDb250ZXh0IG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIFhNTCByZXNvdXJjZSBtb2RlbAotICoge0BsaW5rIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMH0sCi0gKiB3aGljaCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+c2hhcmVkLWNhY2hlLW1vZGU8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCi0gKiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGVudW0gU2hhcmVkQ2FjaGVNb2RlIAotewotCUFMTCwKLQlOT05FLAotCUVOQUJMRV9TRUxFQ1RJVkUsCi0JRElTQUJMRV9TRUxFQ1RJVkUsCi0JVU5TUEVDSUZJRUQ7IAotCQotCi0JcHVibGljIHN0YXRpYyBTaGFyZWRDYWNoZU1vZGUgZnJvbVhtbFJlc291cmNlTW9kZWwoWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIHNoYXJlZENhY2hlTW9kZSkgewotCQlpZiAoc2hhcmVkQ2FjaGVNb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAoc2hhcmVkQ2FjaGVNb2RlKSB7Ci0JCQljYXNlIEFMTDoKLQkJCQlyZXR1cm4gQUxMOwotCQkJY2FzZSBOT05FOgotCQkJCXJldHVybiBOT05FOwotCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgotCQkJCXJldHVybiBFTkFCTEVfU0VMRUNUSVZFOwotCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRToKLQkJCQlyZXR1cm4gRElTQUJMRV9TRUxFQ1RJVkU7Ci0JCQljYXNlIFVOU1BFQ0lGSUVEOgotCQkJCXJldHVybiBVTlNQRUNJRklFRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biB2YWxpZGF0aW9uIG1vZGU6ICIgKyBzaGFyZWRDYWNoZU1vZGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgdG9YbWxSZXNvdXJjZU1vZGVsKFNoYXJlZENhY2hlTW9kZSBzaGFyZWRDYWNoZU1vZGUpIHsKLQkJaWYgKHNoYXJlZENhY2hlTW9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlzd2l0Y2ggKHNoYXJlZENhY2hlTW9kZSkgewotCQkJY2FzZSBBTEw6Ci0JCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5BTEw7Ci0JCQljYXNlIE5PTkU6Ci0JCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5OT05FOwotCQkJY2FzZSBFTkFCTEVfU0VMRUNUSVZFOgotCQkJCXJldHVybiBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAuRU5BQkxFX1NFTEVDVElWRTsKLQkJCWNhc2UgRElTQUJMRV9TRUxFQ1RJVkU6Ci0JCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5ESVNBQkxFX1NFTEVDVElWRTsKLQkJCWNhc2UgVU5TUEVDSUZJRUQ6Ci0JCQkJcmV0dXJuIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5VTlNQRUNJRklFRDsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5rbm93biBzaGFyZWQgY2FjaGUgbW9kZTogIiArIHNoYXJlZENhY2hlTW9kZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlNTI1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uTW9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzA7Ci0KLS8qKgotICogQ29udGV4dCBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBYTUwgcmVzb3VyY2UgbW9kZWwKLSAqIHtAbGluayBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wfSwKLSAqIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT52YWxpZGF0aW9uLW1vZGU8L2NvZGU+IGVsZW1lbnQgaW4gdGhlCi0gKiA8Y29kZT5wZXJzaXN0ZW5jZS54bWw8L2NvZGU+IGZpbGUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGVudW0gVmFsaWRhdGlvbk1vZGUgCi17Ci0JQVVUTyhYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wLkFVVE8pLAotCUNBTExCQUNLKFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuQ0FMTEJBQ0spLAotCU5PTkUoWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMC5OT05FKTsgCi0KLQlwcml2YXRlIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgeG1sRW51bVZhbHVlOwotCi0JVmFsaWRhdGlvbk1vZGUoWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCB4bWxFbnVtVmFsdWUpIHsKLQkJaWYgKHhtbEVudW1WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLnhtbEVudW1WYWx1ZSA9IHhtbEVudW1WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCBnZXRYbWxFbnVtVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLnhtbEVudW1WYWx1ZTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25Nb2RlIGZyb21YbWxSZXNvdXJjZU1vZGVsKFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgeG1sVmFsaWRhdGlvbk1vZGUpIHsKLQkJcmV0dXJuICh4bWxWYWxpZGF0aW9uTW9kZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tWG1sUmVzb3VyY2VNb2RlbF8oeG1sVmFsaWRhdGlvbk1vZGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFZhbGlkYXRpb25Nb2RlIGZyb21YbWxSZXNvdXJjZU1vZGVsXyhYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIHhtbFZhbGlkYXRpb25Nb2RlKSB7Ci0JCWZvciAoVmFsaWRhdGlvbk1vZGUgdmFsaWRhdGlvbk1vZGUgOiBWYWxpZGF0aW9uTW9kZS52YWx1ZXMoKSkgewotCQkJaWYgKHZhbGlkYXRpb25Nb2RlLmdldFhtbEVudW1WYWx1ZSgpLmVxdWFscyh4bWxWYWxpZGF0aW9uTW9kZSkpIHsKLQkJCQlyZXR1cm4gdmFsaWRhdGlvbk1vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIHRvWG1sUmVzb3VyY2VNb2RlbChWYWxpZGF0aW9uTW9kZSB2YWxpZGF0aW9uTW9kZSkgewotCQlyZXR1cm4gKHZhbGlkYXRpb25Nb2RlID09IG51bGwpID8gbnVsbCA6IHZhbGlkYXRpb25Nb2RlLmdldFhtbEVudW1WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0FjY2VzczJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMWZlMWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0FjY2VzczJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5BY2Nlc3MKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjY2VzczJfMEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQkKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBMl8wLkFDQ0VTUzsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBBY2Nlc3MgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlBY2Nlc3NUeXBlIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBBY2Nlc3MgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShBY2Nlc3NUeXBlIGFjY2Vzcyk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBBY2Nlc3MgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU2YmQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KLXsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2pvaW5UYWJsZScgZWxlbWVudCBvZiB0aGUgQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSm9pblRhYmxlQW5ub3RhdGlvbiBnZXRKb2luVGFibGUoKTsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfUFJPUEVSVFkgPSAiam9pblRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JSm9pblRhYmxlQW5ub3RhdGlvbiBnZXROb25OdWxsSm9pblRhYmxlKCk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlICdqb2luVGFibGUnIGVsZW1lbnQgdG8gdGhlIEFzc29jaWF0aW9uT3ZlcnJpZGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlKb2luVGFibGVBbm5vdGF0aW9uIGFkZEpvaW5UYWJsZSgpOwotCQotCS8qKgotCSAqIFJlbW92ZSB0aGUgJ2pvaW5UYWJsZScgZWxlbWVudCBmcm9tIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVKb2luVGFibGUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9DYWNoZWFibGUyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMmFmYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuQ2FjaGVhYmxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBDYWNoZWFibGUyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17CQotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEyXzAuQ0FDSEVBQkxFOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIENhY2hlYWJsZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgQ2FjaGVhYmxlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VmFsdWUoQm9vbGVhbiB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENhY2hlYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0NvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkN2FhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUmVmZXJlbmNlVGFibGVBbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgMi4wIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkNvbGxlY3Rpb25UYWJsZTwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gCi0JZXh0ZW5kcyBSZWZlcmVuY2VUYWJsZUFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBMl8wLkNPTExFQ1RJT05fVEFCTEU7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjg4NWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuRWxlbWVudENvbGxlY3Rpb24KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiAKLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndGFyZ2V0Q2xhc3MnIGVsZW1lbnQgb2YgdGhlIGVsZW1lbnQgY29sbGVjdGlvbgotCSAqIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O0VsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzPUVtcGxveWVlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIKLQkgKi8KLQlTdHJpbmcgZ2V0VGFyZ2V0Q2xhc3MoKTsJCi0JCVN0cmluZyBUQVJHRVRfQ0xBU1NfUFJPUEVSVFkgPSAidGFyZ2V0Q2xhc3MiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0YXJnZXRDbGFzcycgZWxlbWVudCBvZiB0aGUgZWxlbWVudCBjb2xsZWN0aW9uCi0JICogYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRUYXJnZXRDbGFzcyhTdHJpbmcgdGFyZ2V0Q2xhc3MpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndGFyZ2V0Q2xhc3MnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBlbGVtZW50IGNvbGxlY3Rpb24gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxseS1xdWFsaWZpZWQgdGFyZ2V0IGNsYXNzIG5hbWUgYXMgcmVzb2x2ZWQgYnkgdGhlIEFTVCdzCi0JICogYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtFbGVtZW50Q29sbGVjdGlvbih0YXJnZXRDbGFzcz1FbXBsb3llZS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT4ibW9kZWwuRW1wbG95ZWUiPC9jb2RlPiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yCi0JICogPGNvZGU+bW9kZWwuRW1wbG95ZWU8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzTmFtZSgpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZldGNoJyBlbGVtZW50IG9mIHRoZSBlbGVtZW50IGNvbGxlY3Rpb24gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUZldGNoVHlwZSBnZXRGZXRjaCgpOwotCQlTdHJpbmcgRkVUQ0hfUFJPUEVSVFkgPSAiZmV0Y2giOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmZXRjaCcgZWxlbWVudCBvZiB0aGUgZWxlbWVudCBjb2xsZWN0aW9uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2ZldGNoJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgZWxlbWVudCBjb2xsZWN0aW9uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldEZldGNoVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0dlbmVyYXRlZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZDlhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEphdmEgNiBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRlZEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gImphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkIjsgIC8vIHJlcXVpcmVzIEpSRSAxLjYgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxVRV9FTEVNRU5UX05BTUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERBVEVfRUxFTUVOVF9OQU1FID0gImRhdGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENPTU1FTlRTX0VMRU1FTlRfTkFNRSA9ICJjb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT52YWx1ZTxjb2RlPiBlbGVtZW50IG9mIHRoZSA8Y29kZT5HZW5lcmF0ZWQ8L2NvZGU+Ci0JICogYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCi0JICovCi0JTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsdWVzKCk7Ci0JCVN0cmluZyBWQUxVRVNfTElTVCA9ICJ2YWx1ZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+dmFsdWU8Y29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+R2VuZXJhdGVkPC9jb2RlPgotCSAqIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldFZhbHVlc1NpemUoKTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT52YWx1ZTxjb2RlPiBlbGVtZW50IG9mIHRoZSA8Y29kZT5HZW5lcmF0ZWQ8L2NvZGU+Ci0JICogYW5ub3RhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT52YWx1ZTxjb2RlPiBlbGVtZW50IG9mIHRoZSA8Y29kZT5HZW5lcmF0ZWQ8L2NvZGU+Ci0JICogYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIGFkZFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+dmFsdWU8Y29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+R2VuZXJhdGVkPC9jb2RlPgotCSAqIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBhZGRWYWx1ZShpbnQgaW5kZXgsIFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+dmFsdWU8Y29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+R2VuZXJhdGVkPC9jb2RlPgotCSAqIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBtb3ZlVmFsdWUoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPnZhbHVlPGNvZGU+IGVsZW1lbnQgb2YgdGhlIDxjb2RlPkdlbmVyYXRlZDwvY29kZT4KLQkgKiBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlVmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT52YWx1ZTxjb2RlPiBlbGVtZW50IG9mIHRoZSA8Y29kZT5HZW5lcmF0ZWQ8L2NvZGU+Ci0JICogYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZVZhbHVlKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+ZGF0ZTwvY29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+R2VuZXJhdGVkPC9jb2RlPgotCSAqIGFubm90YXRpb24uCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uLgotCSAqLwotCVN0cmluZyBnZXREYXRlKCk7Ci0JCVN0cmluZyBEQVRFX1BST1BFUlRZID0gImRhdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+ZGF0ZTwvY29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+R2VuZXJhdGVkPC9jb2RlPgotCSAqIGFubm90YXRpb24uCi0JICogU2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldERhdGUoU3RyaW5nIGRhdGUpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPmNvbW1lbnRzPC9jb2RlPiBlbGVtZW50IG9mIHRoZSA8Y29kZT5HZW5lcmF0ZWQ8L2NvZGU+Ci0JICogYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnRzKCk7Ci0JCVN0cmluZyBDT01NRU5UU19QUk9QRVJUWSA9ICJjb21tZW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5jb21tZW50czwvY29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+R2VuZXJhdGVkPC9jb2RlPgotCSAqIGFubm90YXRpb24uCi0JICogU2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldENvbW1lbnRzKFN0cmluZyBjb21tZW50cyk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9KUEEyXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9KUEEyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxNmM1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvSlBBMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqIEpQQSAyLjAgSmF2YS1yZWxhdGVkIHN0dWZmIChhbm5vdGF0aW9ucyBldGMuKQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKUEEyXzAgCi17Ci0JLy8gSlBBIHBhY2thZ2UKLQlTdHJpbmcgUEFDS0FHRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7Ci0JU3RyaW5nIFBBQ0tBR0VfID0gUEFDS0FHRSArICcuJzsKLQotCi0JLy8gKioqKioqKioqKiBBUEkgKioqKioqKioqKgotCi0JLy8gSlBBIDIuMCBhbm5vdGF0aW9ucwotCVN0cmluZyBBQ0NFU1MgPSBQQUNLQUdFXyArICJBY2Nlc3MiOwotCQlTdHJpbmcgQUNDRVNTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQkvLyBBU1NPQ0lBVElPTl9PVkVSUklERQotCQlTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEUgPSAiam9pblRhYmxlIjsKLQotCVN0cmluZyBDQUNIRUFCTEUgPSBQQUNLQUdFXyArICJDYWNoZWFibGUiOwotCQlTdHJpbmcgQ0FDSEVBQkxFX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCQotCVN0cmluZyBDQVNDQURFX1RZUEVfX0RFVEFDSCA9IEpQQS5DQVNDQURFX1RZUEVfICsgIkRFVEFDSCI7Ci0KLQlTdHJpbmcgQ09MTEVDVElPTl9UQUJMRSA9IFBBQ0tBR0VfICsgIkNvbGxlY3Rpb25UYWJsZSI7Ci0JCVN0cmluZyBDT0xMRUNUSU9OX1RBQkxFX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgQ09MTEVDVElPTl9UQUJMRV9fU0NIRU1BID0gInNjaGVtYSI7Ci0JCVN0cmluZyBDT0xMRUNUSU9OX1RBQkxFX19DQVRBTE9HID0gImNhdGFsb2ciOwotCQlTdHJpbmcgQ09MTEVDVElPTl9UQUJMRV9fSk9JTl9DT0xVTU5TID0gImpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIENPTExFQ1RJT05fVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9ICJ1bmlxdWVDb25zdHJhaW50cyI7Ci0JCi0JU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTiA9IFBBQ0tBR0VfICsgIkVsZW1lbnRDb2xsZWN0aW9uIjsKLQkJU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0ggPSAiZmV0Y2giOwotCQlTdHJpbmcgRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1MgPSAidGFyZ2V0Q2xhc3MiOwotCi0JU3RyaW5nIE1BUF9LRVlfQ0xBU1MgPSBQQUNLQUdFXyArICJNYXBLZXlDbGFzcyI7Ci0JCVN0cmluZyBNQVBfS0VZX0NMQVNTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JCi0JU3RyaW5nIE1BUF9LRVlfQ09MVU1OID0gUEFDS0FHRV8gKyAiTWFwS2V5Q29sdW1uIjsKLQkJU3RyaW5nIE1BUF9LRVlfQ09MVU1OX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgTUFQX0tFWV9DT0xVTU5fX1VOSVFVRSA9ICJ1bmlxdWUiOwotCQlTdHJpbmcgTUFQX0tFWV9DT0xVTU5fX05VTExBQkxFID0gIm51bGxhYmxlIjsKLQkJU3RyaW5nIE1BUF9LRVlfQ09MVU1OX19JTlNFUlRBQkxFID0gImluc2VydGFibGUiOwotCQlTdHJpbmcgTUFQX0tFWV9DT0xVTU5fX1VQREFUQUJMRSA9ICJ1cGRhdGFibGUiOwotCQlTdHJpbmcgTUFQX0tFWV9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gImNvbHVtbkRlZmluaXRpb24iOwotCQlTdHJpbmcgTUFQX0tFWV9DT0xVTU5fX1RBQkxFID0gInRhYmxlIjsKLQkJU3RyaW5nIE1BUF9LRVlfQ09MVU1OX19MRU5HVEggPSAibGVuZ3RoIjsKLQkJU3RyaW5nIE1BUF9LRVlfQ09MVU1OX19QUkVDSVNJT04gPSAicHJlY2lzaW9uIjsKLQkJU3RyaW5nIE1BUF9LRVlfQ09MVU1OX19TQ0FMRSA9ICJzY2FsZSI7Ci0KLQlTdHJpbmcgTUFQX0tFWV9FTlVNRVJBVEVEID0gUEFDS0FHRV8gKyAiTWFwS2V5RW51bWVyYXRlZCI7Ci0JCVN0cmluZyBNQVBfS0VZX0VOVU1FUkFURURfX1ZBTFVFID0gInZhbHVlIjsKLQkJCi0JU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU4gPSBQQUNLQUdFXyArICJNYXBLZXlKb2luQ29sdW1uIjsKLQkJU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gInJlZmVyZW5jZWRDb2x1bW5OYW1lIjsKLQkJU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5fX1VOSVFVRSA9ICJ1bmlxdWUiOwotCQlTdHJpbmcgTUFQX0tFWV9KT0lOX0NPTFVNTl9fTlVMTEFCTEUgPSAibnVsbGFibGUiOwotCQlTdHJpbmcgTUFQX0tFWV9KT0lOX0NPTFVNTl9fSU5TRVJUQUJMRSA9ICJpbnNlcnRhYmxlIjsKLQkJU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5fX1VQREFUQUJMRSA9ICJ1cGRhdGFibGUiOwotCQlTdHJpbmcgTUFQX0tFWV9KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0JCVN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OX19UQUJMRSA9ICJ0YWJsZSI7Ci0JCQotCVN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OUyA9IFBBQ0tBR0VfICsgIk1hcEtleUpvaW5Db2x1bW5zIjsKLQkJU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5TX19WQUxVRSA9ICJ2YWx1ZSI7Ci0KLQlTdHJpbmcgTUFQX0tFWV9URU1QT1JBTCA9IFBBQ0tBR0VfICsgIk1hcEtleVRlbXBvcmFsIjsKLQkJU3RyaW5nIE1BUF9LRVlfVEVNUE9SQUxfX1ZBTFVFID0gInZhbHVlIjsKLQotCVN0cmluZyBNQVBTX0lEID0gUEFDS0FHRV8gKyAiTWFwc0lkIjsKLQkJU3RyaW5nIE1BUFNfSURfX1ZBTFVFID0gInZhbHVlIjsKLQotCS8vIE5BTUVEX1FVRVJZCi0JCVN0cmluZyBOQU1FRF9RVUVSWV9fTE9DS19NT0RFID0gImxvY2tNb2RlIjsKLQotCS8vIE9ORV9UT19NQU5ZCi0JCVN0cmluZyBPTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUwgPSAib3JwaGFuUmVtb3ZhbCI7Ci0KLQkvLyBPTkVfVE9fT05FCi0JCVN0cmluZyBPTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTCA9ICJvcnBoYW5SZW1vdmFsIjsKLQotCVN0cmluZyBPUkRFUl9DT0xVTU4gPSBQQUNLQUdFXyArICJPcmRlckNvbHVtbiI7Ci0JCVN0cmluZyBPUkRFUl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBPUkRFUl9DT0xVTU5fX05VTExBQkxFID0gIm51bGxhYmxlIjsKLQkJU3RyaW5nIE9SREVSX0NPTFVNTl9fSU5TRVJUQUJMRSA9ICJpbnNlcnRhYmxlIjsKLQkJU3RyaW5nIE9SREVSX0NPTFVNTl9fVVBEQVRBQkxFID0gInVwZGF0YWJsZSI7Ci0JCVN0cmluZyBPUkRFUl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gImNvbHVtbkRlZmluaXRpb24iOwotCi0JLy8gU0VRVUVOQ0VfR0VORVJBVE9SCi0JCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQSA9ICJzY2hlbWEiOwotCi0KLQkvLyBKUEEgMi4wIGVudW1zCi0JU3RyaW5nIEFDQ0VTU19UWVBFID0gUEFDS0FHRV8gKyAiQWNjZXNzVHlwZSI7Ci0JCVN0cmluZyBBQ0NFU1NfVFlQRV8gPSBBQ0NFU1NfVFlQRSArICcuJzsKLQkJU3RyaW5nIEFDQ0VTU19UWVBFX19GSUVMRCA9IEFDQ0VTU19UWVBFXyArICJGSUVMRCI7Ci0JCVN0cmluZyBBQ0NFU1NfVFlQRV9fUFJPUEVSVFkgPSBBQ0NFU1NfVFlQRV8gKyAiUFJPUEVSVFkiOwotCi0JU3RyaW5nIExPQ0tfTU9ERV9UWVBFID0gUEFDS0FHRV8gKyAiTG9ja01vZGVUeXBlIjsKLQkJU3RyaW5nIExPQ0tfTU9ERV9UWVBFXyA9IExPQ0tfTU9ERV9UWVBFICsgJy4nOwotCQlTdHJpbmcgTE9DS19NT0RFX1RZUEVfX1JFQUQgPSBMT0NLX01PREVfVFlQRV8gKyAiUkVBRCI7Ci0JCVN0cmluZyBMT0NLX01PREVfVFlQRV9fV1JJVEUgPSBMT0NLX01PREVfVFlQRV8gKyAiV1JJVEUiOwotCQlTdHJpbmcgTE9DS19NT0RFX1RZUEVfX09QVElNSVNUSUMgPSBMT0NLX01PREVfVFlQRV8gKyAiT1BUSU1JU1RJQyI7Ci0JCVN0cmluZyBMT0NLX01PREVfVFlQRV9fT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQgPSBMT0NLX01PREVfVFlQRV8gKyAiT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiOwotCQlTdHJpbmcgTE9DS19NT0RFX1RZUEVfX1BFU1NJTUlTVElDX1JFQUQgPSBMT0NLX01PREVfVFlQRV8gKyAiUEVTU0lNSVNUSUNfUkVBRCI7Ci0JCVN0cmluZyBMT0NLX01PREVfVFlQRV9fUEVTU0lNSVNUSUNfV1JJVEUgPSBMT0NLX01PREVfVFlQRV8gKyAiUEVTU0lNSVNUSUNfV1JJVEUiOwotCQlTdHJpbmcgTE9DS19NT0RFX1RZUEVfX1BFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCA9IExPQ0tfTU9ERV9UWVBFXyArICJQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQiOwotCQlTdHJpbmcgTE9DS19NT0RFX1RZUEVfX05PTkUgPSBMT0NLX01PREVfVFlQRV8gKyAiTk9ORSI7Ci0KLQkvLyBKUEEgMi4wIG1ldGFtb2RlbAotCVN0cmluZyBNRVRBTU9ERUxfUEFDS0FHRSA9IFBBQ0tBR0VfICsgIm1ldGFtb2RlbCI7Ci0JU3RyaW5nIE1FVEFNT0RFTF9QQUNLQUdFXyA9IE1FVEFNT0RFTF9QQUNLQUdFICsgJy4nOwotCi0JU3RyaW5nIFNUQVRJQ19NRVRBTU9ERUwgPSBNRVRBTU9ERUxfUEFDS0FHRV8gKyAiU3RhdGljTWV0YW1vZGVsIjsKLQkJU3RyaW5nIFNUQVRJQ19NRVRBTU9ERUxfX1ZBTFVFID0gInZhbHVlIjsKLQotCVN0cmluZyBTSU5HVUxBUl9BVFRSSUJVVEUgPSBNRVRBTU9ERUxfUEFDS0FHRV8gKyAiU2luZ3VsYXJBdHRyaWJ1dGUiOwotCi0JU3RyaW5nIENPTExFQ1RJT05fQVRUUklCVVRFID0gTUVUQU1PREVMX1BBQ0tBR0VfICsgIkNvbGxlY3Rpb25BdHRyaWJ1dGUiOwotCVN0cmluZyBMSVNUX0FUVFJJQlVURSA9IE1FVEFNT0RFTF9QQUNLQUdFXyArICJMaXN0QXR0cmlidXRlIjsKLQlTdHJpbmcgTUFQX0FUVFJJQlVURSA9IE1FVEFNT0RFTF9QQUNLQUdFXyArICJNYXBBdHRyaWJ1dGUiOwotCVN0cmluZyBTRVRfQVRUUklCVVRFID0gTUVUQU1PREVMX1BBQ0tBR0VfICsgIlNldEF0dHJpYnV0ZSI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTG9ja01vZGVUeXBlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL0xvY2tNb2RlVHlwZV8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJhZmUwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTG9ja01vZGVUeXBlXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBlbnVtCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5Mb2NrTW9kZVR5cGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgZW51bSBMb2NrTW9kZVR5cGVfMl8wIHsKLQotCVJFQUQoSlBBMl8wLkxPQ0tfTU9ERV9UWVBFX19SRUFEKSwKLQlXUklURShKUEEyXzAuTE9DS19NT0RFX1RZUEVfX1dSSVRFKSwKLQlPUFRJTUlTVElDKEpQQTJfMC5MT0NLX01PREVfVFlQRV9fT1BUSU1JU1RJQyksCi0JT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQoSlBBMl8wLkxPQ0tfTU9ERV9UWVBFX19PUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCksCi0JUEVTU0lNSVNUSUNfUkVBRChKUEEyXzAuTE9DS19NT0RFX1RZUEVfX1BFU1NJTUlTVElDX1JFQUQpLAotCVBFU1NJTUlTVElDX1dSSVRFKEpQQTJfMC5MT0NLX01PREVfVFlQRV9fUEVTU0lNSVNUSUNfV1JJVEUpLAotCVBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVChKUEEyXzAuTE9DS19NT0RFX1RZUEVfX1BFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCksCi0JTk9ORShKUEEyXzAuTE9DS19NT0RFX1RZUEVfX05PTkUpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JTG9ja01vZGVUeXBlXzJfMChTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBMb2NrTW9kZVR5cGVfMl8wIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTG9ja01vZGVUeXBlXzJfMCBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChMb2NrTW9kZVR5cGVfMl8wIGxvY2tNb2RlVHlwZSA6IExvY2tNb2RlVHlwZV8yXzAudmFsdWVzKCkpIHsKLQkJCWlmIChsb2NrTW9kZVR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBsb2NrTW9kZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKExvY2tNb2RlVHlwZV8yXzAgbG9ja01vZGVUeXBlKSB7Ci0JCXJldHVybiAobG9ja01vZGVUeXBlID09IG51bGwpID8gbnVsbCA6IGxvY2tNb2RlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFueVRvTWFueTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55Ml8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMThmOWVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55Ml8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9NYW55PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFueVRvTWFueTJfMEFubm90YXRpb24KLQlleHRlbmRzIE1hbnlUb01hbnlBbm5vdGF0aW9uLCBSZWxhdGlvbnNoaXBNYXBwaW5nMl8wQW5ub3RhdGlvbgotewotCS8vIGNvbWJpbmUgdmFyaW91cyBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFueVRvT25lMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hbnlUb09uZTJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiZmRiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFueVRvT25lMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgMi4wIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hbnlUb09uZTJfMEFubm90YXRpb24KLQlleHRlbmRzIE1hbnlUb09uZUFubm90YXRpb24sIFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDbGFzczJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDbGFzczJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkNjUxOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgMi4wIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUNsYXNzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBLZXlDbGFzczJfMEFubm90YXRpb24gCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQTJfMC5NQVBfS0VZX0NMQVNTOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgTWFwS2V5Q2xhc3MgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nICIuY2xhc3MiLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7TWFwS2V5Q2xhc3ModmFsdWU9RW1wbG95ZWUuY2xhc3MpCi0JICogPC9wcmU+Ci0JICogd2lsbCByZXR1cm4gIkVtcGxveWVlIgotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBNYXBLZXlDbGFzcyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgSWRDbGFzcyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZSBBU1QncwotCSAqIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7SWRDbGFzcyhFbXBsb3llZS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT4ibW9kZWwuRW1wbG95ZWUiPC9jb2RlPiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yCi0JICogPGNvZGU+bW9kZWwuRW1wbG95ZWU8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNvbHVtbjJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTEyYWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNvbHVtbjJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlDb2x1bW48L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIAotCWV4dGVuZHMgQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQTJfMC5NQVBfS0VZX0NPTFVNTjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4Yjk3MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlFbnVtZXJhdGVkCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgRW51bWVyYXRlZEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRDsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxZWQxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbXBsZXRlSm9pbkNvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlKb2luQ29sdW1uPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24KLQlleHRlbmRzIENvbXBsZXRlSm9pbkNvbHVtbkFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU47Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTdmYjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgMi4wIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcEtleVRlbXBvcmFsCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24KLQlleHRlbmRzIFRlbXBvcmFsQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEyXzAuTUFQX0tFWV9URU1QT1JBTDsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBzSWQyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YmUyOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL01hcHNJZDJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgYW5ub3RhdGlvbgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwc0lkPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWFwc0lkMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEyXzAuTUFQU19JRDsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBNYXBzSWQgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIE1hcHNJZCBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBNYXBzSWQgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3ZhbHVlJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2VkMWNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRRdWVyeTJfMEFubm90YXRpb24KLQlleHRlbmRzIE5hbWVkUXVlcnlBbm5vdGF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBsb2NrIG1vZGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdsb2NrTW9kZScgZWxlbWVudCBvZiB0aGUgTmFtZWRRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTG9ja01vZGVUeXBlXzJfMCBnZXRMb2NrTW9kZSgpOwotCQlTdHJpbmcgTE9DS19NT0RFX1BST1BFUlRZID0gImxvY2tNb2RlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdsb2NrTW9kZScgZWxlbWVudCBvZiB0aGUgTmFtZWRRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldExvY2tNb2RlKExvY2tNb2RlVHlwZV8yXzAgbG9ja01vZGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdsb2NrTW9kZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE5hbWVkUXVlcnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TG9ja01vZGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbG9ja01vZGUnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gbG9ja01vZGVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb01hbnkyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9NYW55Ml8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmI2ZWE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb01hbnkyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgYW5ub3RhdGlvbgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT25lVG9NYW55Ml8wQW5ub3RhdGlvbgotCWV4dGVuZHMgT25lVG9NYW55QW5ub3RhdGlvbiwgT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24sIFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uCi17Ci0JLy8gY29tYmluZSB2YXJpb3VzIGludGVyZmFjZXMKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb09uZTJfMEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb09uZTJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzYmU5MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9PbmUyXzBBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9uZVRvT25lMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgT25lVG9PbmVBbm5vdGF0aW9uLCBPd25pbmdSZWxhdGlvbnNoaXBNYXBwaW5nMl8wQW5ub3RhdGlvbiwgUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24KLXsKLQkvLyBjb21iaW5lIHZhcmlvdXMgaW50ZXJmYWNlcwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL09yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL09yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjdhMjhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwYTIvcmVzb3VyY2UvamF2YS9PcmRlckNvbHVtbjJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZENvbHVtbkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgYW5ub3RhdGlvbgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuT3JkZXJDb2x1bW48L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckNvbHVtbjJfMEFubm90YXRpb24KLQlleHRlbmRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEyXzAuT1JERVJfQ09MVU1OOwotCQotCi0JLy8gKioqKioqKioqKiBudWxsYWJsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ251bGxhYmxlJyBlbGVtZW50IG9mIHRoZSBPcmRlckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXROdWxsYWJsZSgpOwotCQlTdHJpbmcgTlVMTEFCTEVfUFJPUEVSVFkgPSAibnVsbGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ251bGxhYmxlJyBlbGVtZW50IG9mIHRoZSBPcmRlckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdudWxsYWJsZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgT3JkZXJDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TnVsbGFibGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvLyAqKioqKioqKioqIGluc2VydGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdpbnNlcnRhYmxlJyBlbGVtZW50IG9mIHRoZSBPcmRlckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCk7Ci0JCVN0cmluZyBJTlNFUlRBQkxFX1BST1BFUlRZID0gImluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2luc2VydGFibGUnIGVsZW1lbnQgb2YgdGhlIE9yZGVyQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdpbnNlcnRhYmxlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBPcmRlckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRJbnNlcnRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiB1cGRhdGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd1cGRhdGFibGUnIGVsZW1lbnQgb2YgdGhlIE9yZGVyQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFVwZGF0YWJsZSgpOwotCQlTdHJpbmcgVVBEQVRBQkxFX1BST1BFUlRZID0gInVwZGF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndXBkYXRhYmxlJyBlbGVtZW50IG9mIHRoZSBPcmRlckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIHVwZGF0YWJsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3VwZGF0YWJsZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgT3JkZXJDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VXBkYXRhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL093bmluZ1JlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlMmNjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvT3duaW5nUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBtYXBwaW5nIGFubm90YXRpb24gdGhhdCBtYXkgaGF2ZSB0aGUKLSAqIDxjb2RlPm9ycGhhblJlbW92YWw8L2NvZGU+IGVsZW1lbnQ6PHVsPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTwvY29kZT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGludGVyZmFjZSBPd25pbmdSZWxhdGlvbnNoaXBNYXBwaW5nMl8wQW5ub3RhdGlvbgotewotCS8vICoqKioqKioqKiogb3JwaGFuIHJlbW92YWwgKioqKioqKioqKgotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSBvcnBoYW5SZW1vdmFsIGVsZW1lbnQgb2YgYSBPbmVUb01hbnkgb3IgT25lVG9PbmUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG9ycGhhblJlbW92YWwgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBqYXZhLgotCSAqLwotCUJvb2xlYW4gZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCQlTdHJpbmcgT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFkgPSAib3JwaGFuUmVtb3ZhbCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3JwaGFuUmVtb3ZhbCBlbGVtZW50IG9mIGEgT25lVG9NYW55IG9yIE9uZVRvT25lIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBvcnBoYW5SZW1vdmFsIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgb3JwaGFuUmVtb3ZhbCBlbGVtZW50LiAgSWYgdGhlIG9ycGhhblJlbW92YWwgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgT25lVG9NYW55IG9yIE9uZVRvT25lIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE9ycGhhblJlbW92YWxUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL1JlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczMDI1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvUmVsYXRpb25zaGlwTWFwcGluZzJfMEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotCi0vKioKLSAqIENvbW1vbiBwcm90b2NvbCBhbW9uZyB0aGUgZm9sbG93aW5nIEpQQSAyLjAgcmVsYXRpb25zaGlwIG1hcHBpbmdzOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU8L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnk8L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU8L2NvZGU+Ci0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcE1hcHBpbmcyXzBBbm5vdGF0aW9uCi0JZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotewotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgotCSAqLwotCWJvb2xlYW4gaXNDYXNjYWRlRGV0YWNoKCk7CQotCQlTdHJpbmcgQ0FTQ0FERV9ERVRBQ0hfUFJPUEVSVFkgPSAiY2FzY2FkZURldGFjaCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgotCSAqLwotCXZvaWQgc2V0Q2FzY2FkZURldGFjaChib29sZWFuIGRldGFjaCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjM2IzYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuU2VxdWVuY2VHZW5lcmF0b3IKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbgotCWV4dGVuZHMgU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0Q2F0YWxvZygpOwotCQlTdHJpbmcgQ0FUQUxPR19QUk9QRVJUWSA9ICJjYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXRhbG9nJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjYXRhbG9nJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdjYXRhbG9nJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzY2hlbWEnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hKCk7Ci0JCVN0cmluZyBTQ0hFTUFfUFJPUEVSVFkgPSAic2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzY2hlbWEnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzY2hlbWEnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnc2NoZW1hJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHNjaGVtYVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBhMi9yZXNvdXJjZS9qYXZhL1N0YXRpY01ldGFtb2RlbEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY3ZmY1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcGEyL3Jlc291cmNlL2phdmEvU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDIuMCBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5tZXRhbW9kZWwuU3RhdGljTWV0YW1vZGVsPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU3RhdGljTWV0YW1vZGVsQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEyXzAuU1RBVElDX01FVEFNT0RFTDsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+U3RhdGljTWV0YW1vZGVsPC9jb2RlPiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqIFJldHVybiB0aGUgcG9ydGlvbiBvZiB0aGUgdmFsdWUgcHJlY2VkaW5nIDxjb2RlPiIuY2xhc3MiPC9jb2RlPi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O1N0YXRpY01ldGFtb2RlbCh2YWx1ZT1FbXBsb3llZS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT4iRW1wbG95ZWUiPC9jb2RlPi4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT52YWx1ZTwvY29kZT4gZWxlbWVudCBvZiB0aGUgPGNvZGU+U3RhdGljTWV0YW1vZGVsPC9jb2RlPiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byA8Y29kZT5udWxsPC9jb2RlPiB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RhdGljIG1ldGFtb2RlbCdzIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5Ci0JICogdGhlIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7U3RhdGljTWV0YW1vZGVsKEVtcGxveWVlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuIDxjb2RlPiJtb2RlbC5FbXBsb3llZSI8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IKLQkgKiA8Y29kZT5tb2RlbC5FbXBsb3llZTwvY29kZT4uCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL0pwYUpwcWxRdWVyeUhlbHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9KcGFKcHFsUXVlcnlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhMGJjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL0pwYUpwcWxRdWVyeUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5TaW1wbGVUZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uRGVmYXVsdEpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFNYW5hZ2VkVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaS5KcGFRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5BYnN0cmFjdEpQUUxRdWVyeUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5FeHByZXNzaW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuSlBRTFF1ZXJ5UHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuSlBRTEdyYW1tYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ0J1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgaGVscGVyIGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBvdmVyIGEgSlBRTCBxdWVyeToKLSAqIDx1bD4KLSAqIDxsaT5DYWxjdWxhdGVzIHRoZSByZXN1bHQgdHlwZSBvZiBhIHF1ZXJ5OiB7QGxpbmsgI2dldFJlc3VsdFR5cGUoKX07PC9saT4KLSAqIDxsaT5DYWxjdWxhdGVzIHRoZSB0eXBlIG9mIGFuIGlucHV0IHBhcmFtZXRlcjoge0BsaW5rICNnZXRQYXJhbWV0ZXJUeXBlKFN0cmluZyl9LjwvbGk+Ci0gKiA8bGk+Q2FsY3VsYXRlcyB0aGUgcG9zc2libGUgY2hvaWNlcyB0byBjb21wbGV0ZSB0aGUgcXVlcnkgZnJvbSBhIGdpdmVuCi0gKiAgICAgcG9zaXRpb24gKHVzZWQgZm9yIGNvbnRlbnQgYXNzaXN0KToge0BsaW5rICNidWlsZENvbnRlbnRBc3Npc3RJdGVtcyhpbnQpfS48L2xpPgotICogPGxpPlZhbGlkYXRlcyB0aGUgcXVlcnkgYnkgaW50cm9zcGVjdGluZyBpdHMgZ3JhbW1hciBhbmQgc2VtYW50aWM6Ci0gKiAgICAgPHVsPgotICogICAgIDxsaT57QGxpbmsgI3ZhbGlkYXRlKCl9LDwvbGk+Ci0gKiAgICAgPGxpPntAbGluayAjdmFsaWRhdGVHcmFtbWFyKCl9LDwvbGk+Ci0gKiAgICAgPGxpPntAbGluayAjdmFsaWRhdGVTZW1hbnRpYygpfS48L2xpPgotICogICAgIDwvdWw+PC9saT4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEpwYUpwcWxRdWVyeUhlbHBlciBleHRlbmRzIEFic3RyYWN0SlBRTFF1ZXJ5SGVscGVyIHsKLQotCS8qKgotCSAqIENhY2hlcyB0aGUgcHJvdmlkZXIgaW4gb3JkZXIgdG8gcHJldmVudCByZWNyZWF0aW5nIHRoZSBTUEkgcmVwcmVzZW50YXRpb24gb2YgdGhlIEpQQSBhcnRpZmFjdHMKLQkgKiBtb3JlIHRoYW4gb25jZS4KLQkgKi8KLQlwcml2YXRlIElNYW5hZ2VkVHlwZVByb3ZpZGVyIG1hbmFnZWRUeXBlUHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYVF1ZXJ5SGVscGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBqcHFsR3JhbW1hciBUaGUgZ3JhbW1hciB0aGF0IGRlZmluZXMgaG93IHRvIHBhcnNlIGEgSlBRTCBxdWVyeQotCSAqLwotCXByb3RlY3RlZCBKcGFKcHFsUXVlcnlIZWxwZXIoSlBRTEdyYW1tYXIganBxbEdyYW1tYXIpIHsKLQkJc3VwZXIoanBxbEdyYW1tYXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJTWFwcGluZ0J1aWxkZXI8QXR0cmlidXRlTWFwcGluZz4gYnVpbGRNYXBwaW5nQnVpbGRlcigpOwotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgYnkgYWRqdXN0aW5nIHRoZW0gdG8gYmUgYXQgdGhlIHNhbWUgcG9zaXRpb24gd2l0aGluCi0JICogPGVtPmpwcWxRdWVyeTwvZW0+LCB3aGljaCBtYXkgZGlmZmVyIGZyb20gPGVtPnBhcnNlZEpwcWxRdWVyeTwvZW0+IHNpbmNlIHRoZSBwYXJzZWQgdHJlZSBkb2VzCi0JICogbm90IGtlZXAgdHJhY2sgb2YgbXVsdGlwbGUgd2hpdGVzcGFjZS4gVGhlIHJhbmdlIGlzIGFsc28gaW5jcmVhc2VkIGlmIHRoZSBzdGFydCBhbmQgZW5kCi0JICogcG9zaXRpb25zIGFyZSB0aGUgc2FtZS4KLQkgKgotCSAqIEBwYXJhbSBwcm9ibGVtIFRoZSB7QGxpbmsgSlBRTFF1ZXJ5UHJvYmxlbSBwcm9ibGVtfSB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgSlBRTCBxdWVyeSwgd2hpY2ggaXMKLQkgKiBlaXRoZXIgYSBncmFtbWF0aWNhbCBvciBzZW1hbnRpYyBwcm9ibGVtCi0JICogQHBhcmFtIHBhcnNlZEpwcWxRdWVyeSBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXJzZWQgdHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlBRTAotCSAqIHF1ZXJ5Ci0JICogQHBhcmFtIGFjdHVhbFF1ZXJ5IFRoZSBhY3R1YWwgSlBRTCBxdWVyeSB0aGF0IHdhcyBwYXJzZWQgYW5kIHZhbGlkYXRlZAotCSAqIEByZXR1cm4gVGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zLCB3aGljaCBtYXkgaGF2ZSBiZWVuIGFkanVzdGVkCi0JICovCi0JcHVibGljIGludFtdIGJ1aWxkUG9zaXRpb25zKEpQUUxRdWVyeVByb2JsZW0gcHJvYmxlbSwgU3RyaW5nIHBhcnNlZEpwcWxRdWVyeSwgU3RyaW5nIGFjdHVhbFF1ZXJ5KSB7Ci0KLQkJaW50IHN0YXJ0UG9zaXRpb24gPSBwcm9ibGVtLmdldFN0YXJ0UG9zaXRpb24oKTsKLQkJaW50IGVuZFBvc2l0aW9uICAgPSBwcm9ibGVtLmdldEVuZFBvc2l0aW9uKCk7Ci0KLQkJLy8gSWYgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIGFyZSB0aGUgc2FtZSwgdGhlbiBleHBhbmQgdGhlIHRleHQgcmFuZ2UKLQkJaWYgKHN0YXJ0UG9zaXRpb24gPT0gZW5kUG9zaXRpb24pIHsKLQkJCXN0YXJ0UG9zaXRpb24gPSBNYXRoLm1heChzdGFydFBvc2l0aW9uIC0gMSwgMCk7Ci0JCX0KLQotCQkvLyBSZXBvc2l0aW9uIHRoZSBjdXJzb3Igc28gaXQncyBjb3JyZWN0bHkgcG9zaXRpb25lZCBpbiB0aGUgYWN0dWFsIHF1ZXJ5LCB3aGljaCBpcyB0aGUKLQkJLy8gc2luY2UgaXQgbWF5IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgd2hpdGVzcGFjZSBmb3IgYSBzaW5nbGUgd2hpdGVzcGFjZQotCQlpbnQgbmV3U3RhcnRQb3NpdGlvbiA9IEV4cHJlc3Npb25Ub29scy5yZXBvc2l0aW9uQ3Vyc29yKHBhcnNlZEpwcWxRdWVyeSwgc3RhcnRQb3NpdGlvbiwgYWN0dWFsUXVlcnkpOwotCi0JCWlmIChuZXdTdGFydFBvc2l0aW9uICE9IHN0YXJ0UG9zaXRpb24pIHsKLQkJCWVuZFBvc2l0aW9uICArPSAobmV3U3RhcnRQb3NpdGlvbiAtIHN0YXJ0UG9zaXRpb24pOwotCQkJc3RhcnRQb3NpdGlvbiA9IG5ld1N0YXJ0UG9zaXRpb247Ci0JCX0KLQotCQlyZXR1cm4gbmV3IGludFtdIHsgc3RhcnRQb3NpdGlvbiwgZW5kUG9zaXRpb24gfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBJTWVzc2FnZX0gZm9yIHRoZSBnaXZlbiB7QGxpbmsgSlBRTFF1ZXJ5UHJvYmxlbX0uCi0JICoKLQkgKiBAcGFyYW0gbmFtZWRRdWVyeSBUaGUgbW9kZWwgb2JqZWN0IGZvciB3aGljaCBhIG5ldyB7QGxpbmsgSU1lc3NhZ2V9IGlzIGNyZWF0aW5nIGRlc2NyaWJpbmcgdGhlCi0JICogcHJvYmxlbQotCSAqIEBwYXJhbSBwcm9ibGVtIFRoZSB7QGxpbmsgSlBRTFF1ZXJ5UHJvYmxlbSBwcm9ibGVtfSB0aGF0IHdhcyBmb3VuZCBpbiB0aGUgSlBRTCBxdWVyeSwgd2hpY2ggaXMKLQkgKiBlaXRoZXIgYSBncmFtbWF0aWNhbCBvciBzZW1hbnRpYyBwcm9ibGVtCi0JICogQHBhcmFtIHRleHRSYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIEpQUUwgcXVlcnkgaW4gdGhlIEphdmEgc291cmNlIGZpbGUKLQkgKiBAcGFyYW0gcGFyc2VkSnBxbFF1ZXJ5IFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcnNlZCB0cmVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBKUFFMCi0JICogcXVlcnksIHdoaWNoIG1heSBkaWZmZXIgZnJvbSB0aGUgYWN0dWFsIEpQUUwgcXVlcnkgc2luY2UgaXQgZG9lcyBub3Qga2VlcCBtb3JlIHRoYW4gb25lCi0JICogd2hpdGVzcGFjZQotCSAqIEBwYXJhbSBhY3R1YWxRdWVyeSBUaGUgYWN0dWFsIEpQUUwgcXVlcnkgdGhhdCB3YXMgcGFyc2VkIGFuZCB2YWxpZGF0ZWQKLQkgKiBAcGFyYW0gb2Zmc2V0IFRoaXMgb2Zmc2V0IGlzIHVzZWQgdG8gbW92ZSB0aGUgc3RhcnQgcG9zaXRpb24KLQkgKiBAcmV0dXJuIEEgbmV3IHtAbGluayBJTWVzc2FnZX0gdGhhdCBoYXMgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgdGhlIHByb2JsZW0KLQkgKiB1bmRlcmxpbmUgYW5kIHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBQcm9ibGVtcyB2aWV3Ci0JICovCi0JcHJvdGVjdGVkIElNZXNzYWdlIGJ1aWxkUHJvYmxlbShOYW1lZFF1ZXJ5IG5hbWVkUXVlcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0UmFuZ2UgdGV4dFJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBRTFF1ZXJ5UHJvYmxlbSBwcm9ibGVtLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhcnNlZEpwcWxRdWVyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWxRdWVyeSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQpIHsKLQotCQkvLyBDb252ZXJ0IHRoZSBwb3NpdGlvbnMgZnJvbSB0aGUgcGFyc2VkIEpQUUwgcXVlcnkgdG8gdGhlIGFjdHVhbCBKUFFMIHF1ZXJ5Ci0JCWludFtdIHBvc2l0aW9ucyA9IGJ1aWxkUG9zaXRpb25zKHByb2JsZW0sIHBhcnNlZEpwcWxRdWVyeSwgYWN0dWFsUXVlcnkpOwotCi0JCS8vIE5vdyBjb252ZXJ0IHRoZSBhZGp1c3RlZCBwb3NpdGlvbnMgb25jZSBhZ2FpbiB0byBiZSBpbiB0aGUgcXVlcnkgd2hlcmUgdGhlIGVzY2FwZQotCQkvLyBjaGFyYWN0ZXJzIGFyZSBpbiB0aGVpciBsaXRlcmFsIGZvcm1zCi0JCWludFtdIG5ld1N0YXJ0UG9zaXRpb24gPSB7IHBvc2l0aW9uc1swXSB9OwotCQlFeHByZXNzaW9uVG9vbHMuZXNjYXBlKGFjdHVhbFF1ZXJ5LCBuZXdTdGFydFBvc2l0aW9uKTsKLQkJaW50IGVzY2FwZU9mZnNldCA9IHBvc2l0aW9uc1swXSAtIG5ld1N0YXJ0UG9zaXRpb25bMF07Ci0KLQkJcG9zaXRpb25zWzBdIC09IGVzY2FwZU9mZnNldDsKLQkJcG9zaXRpb25zWzFdIC09IGVzY2FwZU9mZnNldDsKLQotCQkvLyBDcmVhdGUgdGhlIHRleHQgcmFuZ2Ugb2YgdGhlIHByb2JsZW0KLQkJdGV4dFJhbmdlID0gbmV3IFNpbXBsZVRleHRSYW5nZSgKLQkJCXRleHRSYW5nZS5nZXRPZmZzZXQoKSArIHBvc2l0aW9uc1swXSArIG9mZnNldCwKLQkJCXBvc2l0aW9uc1sxXSAtIHBvc2l0aW9uc1swXSwKLQkJCXRleHRSYW5nZS5nZXRMaW5lTnVtYmVyKCkKLQkJKTsKLQotCQkvLyBOb3cgY3JlYXRlIHRoZSBtZXNzYWdlCi0JCUlNZXNzYWdlIG1lc3NhZ2UgPSBEZWZhdWx0SnBhVmFsaWRhdGlvbk1lc3NhZ2VzLmJ1aWxkTWVzc2FnZSgKLQkJCXNldmVyaXR5KG5hbWVkUXVlcnkpLAotCQkJcHJvYmxlbS5nZXRNZXNzYWdlS2V5KCksCi0JCQlwcm9ibGVtLmdldE1lc3NhZ2VBcmd1bWVudHMoKSwKLQkJCW5hbWVkUXVlcnksCi0JCQl0ZXh0UmFuZ2UKLQkJKTsKLQkJbWVzc2FnZS5zZXRCdW5kbGVOYW1lKCJqcGFfanBxbF92YWxpZGF0aW9uIik7Ci0JCXJldHVybiBtZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEpwYU1hbmFnZWRUeXBlUHJvdmlkZXJ9IHdoaWNoIHdpbGwgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGFwcGxpY2F0aW9uJ3MKLQkgKiBKUEEgbWV0YWRhdGEgaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcGFyYW0ganBhUHJvamVjdCBUaGUgSlBBIHByb2plY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBFY2xpcHNlIHByb2plY3QKLQkgKiBAcGFyYW0gcGVyc2lzdGVuY2VVbml0IFRoZSBwZXJzaXN0ZW5jZSB1bml0IG1vZGVsCi0JICogQHJldHVybiBBIG5ldyB7QGxpbmsgSnBhTWFuYWdlZFR5cGVQcm92aWRlcn0KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhTWFuYWdlZFR5cGVQcm92aWRlciBidWlsZFByb3ZpZGVyKEpwYVByb2plY3QganBhUHJvamVjdCwgUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCkgewotCQlyZXR1cm4gbmV3IEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIoanBhUHJvamVjdCwgcGVyc2lzdGVuY2VVbml0LCBidWlsZE1hcHBpbmdCdWlsZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0VmFsaWRhdGlvblByZWZlcmVuY2UoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5KSB7Ci0JCXJldHVybiBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuZ2V0UHJvYmxlbVNldmVyaXR5UHJlZmVyZW5jZSgKLQkJCW5hbWVkUXVlcnksCi0JCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSlBRTF9RVUVSWV9WQUxJREFUSU9OCi0JCSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZ2l2ZW4gbmFtZWQgcXVlcnkgYW5kIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgSlBRTCBxdWVyeS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lZFF1ZXJ5IFRoZSBtb2RlbCBvYmplY3Qgd2hlcmUgdGhlIEpQUUwgcXVlcnkgaXMgc3RvcmVkCi0JICogQHBhcmFtIGFjdHVhbFF1ZXJ5IFRoZSBhY3R1YWwgSlBRTCBxdWVyeSwgd2hpY2ggY2FuIGRpZmZlciBmcm9tIHRoZSBvbmUgb3duZWQgYnkgdGhlIG1vZGVsCi0JICogb2JqZWN0LCB3aGljaCBoYXBwZW5zIHdoZW4gdGhlIG1vZGVsIGlzIG91dCBvZiBzeW5jIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgeWV0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UXVlcnkoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5LCBTdHJpbmcgYWN0dWFsUXVlcnkpIHsKLQotCQlpZiAobWFuYWdlZFR5cGVQcm92aWRlciA9PSBudWxsKSB7Ci0JCQltYW5hZ2VkVHlwZVByb3ZpZGVyID0gYnVpbGRQcm92aWRlcihuYW1lZFF1ZXJ5LmdldEpwYVByb2plY3QoKSwgbmFtZWRRdWVyeS5nZXRQZXJzaXN0ZW5jZVVuaXQoKSk7Ci0JCX0KLQotCQlJUXVlcnkgcXVlcnkgPSBuZXcgSnBhUXVlcnkobWFuYWdlZFR5cGVQcm92aWRlciwgbmFtZWRRdWVyeSwgYWN0dWFsUXVlcnkpOwotCQlzdXBlci5zZXRRdWVyeShxdWVyeSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIHNldmVyaXR5IHRoYXQgaXMgYXNzb2NpYXRlZCB0byBKUFFMIHF1ZXJ5IHZhbGlkYXRpb24sIHdoaWNoIGNhbm5vdCBiZSByZXRyaWV2ZWQKLQkgKiB1c2luZyB0aGUgSlBRTCBwcm9ibGVtIG1lc3NhZ2Uga2V5LgotCi0JICogQHBhcmFtIHRhcmdldE9iamVjdCBUaGUgb2JqZWN0IGZvciB3aGljaCBhIG5ldyB7QGxpbmsgSU1lc3NhZ2V9IGlzIGNyZWF0aW5nIGRlc2NyaWJpbmcgdGhlCi0JICogcHJvYmxlbQotCSAqIEByZXR1cm4gVGhlIGdsb2JhbCBzZXZlcml0eSBmb3IgdmFsaWRhdGluZyBKUFFMIHF1ZXJpZXMKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IHNldmVyaXR5KE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJcmV0dXJuIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5nZXRQcm9ibGVtU2V2ZXJpdHlQcmVmZXJlbmNlKAotCQkJdGFyZ2V0T2JqZWN0LAotCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpQUUxfUVVFUllfVkFMSURBVElPTgotCQkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3VsZFZhbGlkYXRlKE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZXR1cm4gZ2V0VmFsaWRhdGlvblByZWZlcmVuY2UobmFtZWRRdWVyeSkgPT0gLTE7Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGVzIHRoZSBnaXZlbiB7QGxpbmsgTmFtZWRRdWVyeX0gYnkgdmFsaWRhdGluZyB0aGUgSlBRTCBxdWVyeS4KLQkgKgotCSAqIEBwYXJhbSBuYW1lZFF1ZXJ5IFRoZSBKUFFMIHF1ZXJ5IHRvIHZhbGlkYXRlCi0JICogQHBhcmFtIGpwcWxRdWVyeSBUaGUgSlBRTCBxdWVyeSwgd2hpY2ggbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgbW9kZWwgb2JqZWN0IHNpbmNlCi0JICogdGhlIGVzY2FwZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgaW4gdGhlaXIgbGl0ZXJhbCBmb3JtcyAoc2hvdWxkIGhhdmUgJ1xyJyBhbmQgbm90ICdcXHInKQotCSAqIEBwYXJhbSB0ZXh0UmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBKUFFMIHF1ZXJ5IHN0cmluZyB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldCBUaGlzIG9mZnNldCBpcyB1c2VkIHRvIG1vdmUgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHBhcmFtIG1lc3NhZ2VzIFRoZSBsaXN0IG9mIHtAbGluayBJTWVzc2FnZSBJTWVzc2FnZXN9IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGFkZCB2YWxpZGF0aW9uCi0JICogcHJvYmxlbXMKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShOYW1lZFF1ZXJ5IG5hbWVkUXVlcnksCi0JICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGpwcWxRdWVyeSwKLQkgICAgICAgICAgICAgICAgICAgICBUZXh0UmFuZ2UgdGV4dFJhbmdlLAotCSAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgTGlzdDxJTWVzc2FnZT4gbWVzc2FnZXMpIHsKLQotCQl0cnkgewotCQkJLy8gTWFrZSB0aGlzIHF1aWNrIGNoZWNrIHNvIHdlIGRvbid0IHZhbGlkYXRlIHRoZSBxdWVyeSwgd2hpY2ggaXMgdGltZSBjb25zdW1pbmcKLQkJCWlmIChzaG91bGRWYWxpZGF0ZShuYW1lZFF1ZXJ5KSkgewotCi0JCQkJc2V0UXVlcnkobmFtZWRRdWVyeSwganBxbFF1ZXJ5KTsKLQkJCQlTdHJpbmcgcGFyc2VkSnBxbFF1ZXJ5ID0gZ2V0UGFyc2VkSlBRTFF1ZXJ5KCk7Ci0KLQkJCQlmb3IgKEpQUUxRdWVyeVByb2JsZW0gcHJvYmxlbSA6IHZhbGlkYXRlKCkpIHsKLQotCQkJCQlJTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRQcm9ibGVtKAotCQkJCQkJbmFtZWRRdWVyeSwKLQkJCQkJCXRleHRSYW5nZSwKLQkJCQkJCXByb2JsZW0sCi0JCQkJCQlwYXJzZWRKcHFsUXVlcnksCi0JCQkJCQlqcHFsUXVlcnksCi0JCQkJCQlvZmZzZXQKLQkJCQkJKTsKLQotCQkJCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gT25seSBkaXNwb3NlIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBxdWVyeQotCQkJZGlzcG9zZSgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0NsYXNzQ29uc3RydWN0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0NsYXNzQ29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwM2FiYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9DbGFzc0NvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5CaW5kaW5nS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JQ29uc3RydWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZVJlcG9zaXRvcnk7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJQ29uc3RydWN0b3J9IHRoYXQgaXMgd3JhcHBpbmcgdGhlIHtAbGluayBJTWV0aG9kfQotICogcmVwcmVzZW50YXRpb24gb2YgYSBKYXZhIGNvbnN0cnVjdG9yIChlaXRoZXIgY29taW5nIGZyb20gYSBKYXZhIGNvbXBpbGVkIGZpbGUgb3IgYSBKYXZhIHNvdXJjZQotICogZmlsZSkuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xhc3NDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIElDb25zdHJ1Y3RvciB7Ci0KLQkvKioKLQkgKiBUaGUgaW5mb3JtYXRpb24gb2YgdGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgSU1ldGhvZCBtZXRob2Q7Ci0KLQkvKioKLQkgKiBUaGUgZGVjbGFyaW5nIHR5cGUgb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIEpwYVR5cGUgdHlwZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQge0BsaW5rIElUeXBlRGVjbGFyYXRpb24gSVR5cGVEZWNsYXJhdGlvbnN9IHJlcHJlc2VudGluZyBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RvcidzCi0JICogcGFyYW1ldGVyIHR5cGVzLgotCSAqLwotCXByaXZhdGUgSVR5cGVEZWNsYXJhdGlvbltdIHR5cGVEZWNsYXJhdGlvbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNsYXNzQ29uc3RydWN0b3I8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHR5cGUgVGhlIGRlY2xhcmluZyB0eXBlIG9mIHRoaXMgY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gbWV0aG9kSW5mbyBUaGUgaW5mb3JtYXRpb24gb2YgdGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIENsYXNzQ29uc3RydWN0b3IoSnBhVHlwZSB0eXBlLCBJTWV0aG9kIG1ldGhvZCkgewotCQlzdXBlcigpOwotCQl0aGlzLnR5cGUgICA9IHR5cGU7Ci0JCXRoaXMubWV0aG9kID0gbWV0aG9kOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZURlY2xhcmF0aW9uW10gYnVpbGRQYXJhbWV0ZXJUeXBlcygpIHsKLQotCQlCaW5kaW5nS2V5IGJpbmRpbmdLZXkgPSBuZXcgQmluZGluZ0tleShtZXRob2QuZ2V0S2V5KCkpOwotCQlTdHJpbmcgc2lnbmF0dXJlID0gYmluZGluZ0tleS50b1NpZ25hdHVyZSgpOwotCi0JCWludCBjb3VudCA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJDb3VudChzaWduYXR1cmUpOwotCQlJVHlwZURlY2xhcmF0aW9uW10gdHlwZURlY2xhcmF0aW9ucyA9IG5ldyBJVHlwZURlY2xhcmF0aW9uW2NvdW50XTsKLQkJaW50IGluZGV4ID0gMDsKLQotCQlmb3IgKFN0cmluZyBwYXJhbWV0ZXJUeXBlIDogU2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKHNpZ25hdHVyZSkpIHsKLQotCQkJLy8gMS4gUmV0cmlldmUgdGhlIHBhcmFtZXRlciB0eXBlICh3aXRob3V0IHRoZSB0eXBlIHBhcmFtZXRlcnMpCi0JCQlTdHJpbmcgcGFyYW1ldGVyVHlwZU5hbWUgPSBTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUocGFyYW1ldGVyVHlwZSk7Ci0KLQkJCS8vIDMuIENvbnZlcnQgdGhlIHR5cGUgc2lnbmF0dXJlIHRvIGEgZG90LWJhc2VkIG5hbWUKLQkJCXBhcmFtZXRlclR5cGVOYW1lID0gU2lnbmF0dXJlLnRvU3RyaW5nKHBhcmFtZXRlclR5cGVOYW1lKTsKLQotCQkJLy8gNC4gQ3JlYXRlIHRoZSBJVHlwZURlY2xhcmF0aW9uCi0JCQl0eXBlRGVjbGFyYXRpb25zW2luZGV4KytdID0gbmV3IEpwYVR5cGVEZWNsYXJhdGlvbigKLQkJCQlnZXRUeXBlUmVwb3NpdG9yeSgpLmdldFR5cGUocGFyYW1ldGVyVHlwZU5hbWUpLAotCQkJCWJ1aWxkVHlwZVBhcmFtZXRlcnMocGFyYW1ldGVyVHlwZSksCi0JCQkJU2lnbmF0dXJlLmdldEFycmF5Q291bnQocGFyYW1ldGVyVHlwZSkKLQkJCSk7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGVEZWNsYXJhdGlvbltdIGJ1aWxkVHlwZVBhcmFtZXRlcnMoU3RyaW5nIHNpZ25hdHVyZSkgewotCi0JCVN0cmluZ1tdIHR5cGVQYXJhbWV0ZXJzID0gU2lnbmF0dXJlLmdldFR5cGVBcmd1bWVudHMoc2lnbmF0dXJlKTsKLQkJSVR5cGVEZWNsYXJhdGlvbltdIGdlbmVyaWNzID0gbmV3IElUeXBlRGVjbGFyYXRpb25bdHlwZVBhcmFtZXRlcnMubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQlTdHJpbmcgdHlwZVBhcmFtZXRlciA9IHR5cGVQYXJhbWV0ZXJzW2luZGV4XTsKLQotCQkJLy8gMS4gUmV0cmlldmUgdGhlIHBhcmFtZXRlciB0eXBlICh3aXRob3V0IHRoZSB3aWxkIGNhcmRzKQotCQkJc3dpdGNoIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQodHlwZVBhcmFtZXRlcikpIHsKLQkJCQljYXNlIFNpZ25hdHVyZS5XSUxEQ0FSRF9UWVBFX1NJR05BVFVSRTogewotCQkJCQl0eXBlUGFyYW1ldGVyID0gdHlwZVBhcmFtZXRlci5zdWJzdHJpbmcoMSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAodHlwZVBhcmFtZXRlci5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZ2VuZXJpY3NbaW5kZXhdID0gZ2V0VHlwZVJlcG9zaXRvcnkoKS5nZXRUeXBlSGVscGVyKCkub2JqZWN0VHlwZURlY2xhcmF0aW9uKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgdHlwZVBhcmFtZXRlck5hbWUgPSBTaWduYXR1cmUuZ2V0VHlwZUVyYXN1cmUodHlwZVBhcmFtZXRlcik7Ci0KLQkJCQkvLyAzLiBDb252ZXJ0IHRoZSB0eXBlIHNpZ25hdHVyZSB0byBhIGRvdC1iYXNlZCBuYW1lCi0JCQkJdHlwZVBhcmFtZXRlck5hbWUgPSBTaWduYXR1cmUudG9TdHJpbmcodHlwZVBhcmFtZXRlck5hbWUpOwotCi0JCQkJLy8gMy4gUmV0cmlldmUgdGhlIElUeXBlIGZvciB0aGUgdHlwZSBwYXJhbWV0ZXIKLQkJCQlJVHlwZSBnZW5lcmljVHlwZSA9IGdldFR5cGVSZXBvc2l0b3J5KCkuZ2V0VHlwZSh0eXBlUGFyYW1ldGVyTmFtZSk7Ci0KLQkJCQlpZiAoZ2VuZXJpY1R5cGUuaXNSZXNvbHZhYmxlKCkpIHsKLQkJCQkJZ2VuZXJpY3NbaW5kZXhdID0gZ2VuZXJpY1R5cGUuZ2V0VHlwZURlY2xhcmF0aW9uKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlnZW5lcmljc1tpbmRleF0gPSBnZXRUeXBlUmVwb3NpdG9yeSgpLmdldFR5cGVIZWxwZXIoKS5vYmplY3RUeXBlRGVjbGFyYXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZ2VuZXJpY3M7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJVHlwZURlY2xhcmF0aW9uW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0JCWlmICh0eXBlRGVjbGFyYXRpb25zID09IG51bGwpIHsKLQkJCXR5cGVEZWNsYXJhdGlvbnMgPSBidWlsZFBhcmFtZXRlclR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlUmVwb3NpdG9yeSBnZXRUeXBlUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIHR5cGUuZ2V0VHlwZVJlcG9zaXRvcnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvR2VuZXJpY0pwYU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0dlbmVyaWNKcGFNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOWNkZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvR2VuZXJpY0pwYU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hbmFnZWRUeXBlOwotCi0vKioKLSAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBIZXJtZXMnIHtAbGluayBJTWFwcGluZ30uCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYU1hcHBpbmcgZXh0ZW5kcyBKcGFNYXBwaW5nIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJpY0pwYU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgbWFwcGluZwotCSAqIEBwYXJhbSBtYXBwaW5nIFRoZSBkZXNpZ24tdGltZSB7QGxpbmsgQXR0cmlidXRlTWFwcGluZ30gd3JhcHBlZCBieSB0aGlzIGNsYXNzCi0JICovCi0JcHVibGljIEdlbmVyaWNKcGFNYXBwaW5nKElNYW5hZ2VkVHlwZSBwYXJlbnQsIEF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZykgewotCQlzdXBlcihwYXJlbnQsIG1hcHBpbmcpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9HZW5lcmljTWFwcGluZ0J1aWxkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0dlbmVyaWNNYXBwaW5nQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODZmNzZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0dlbmVyaWNNYXBwaW5nQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFuYWdlZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ0J1aWxkZXI7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNYXBwaW5nQnVpbGRlcn0uCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjEKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY01hcHBpbmdCdWlsZGVyIGltcGxlbWVudHMgSU1hcHBpbmdCdWlsZGVyPEF0dHJpYnV0ZU1hcHBpbmc+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJpY01hcHBpbmdCdWlsZGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgR2VuZXJpY01hcHBpbmdCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSU1hcHBpbmcgYnVpbGRNYXBwaW5nKElNYW5hZ2VkVHlwZSBwYXJlbnQsIEF0dHJpYnV0ZU1hcHBpbmcgdmFsdWUpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhTWFwcGluZyhwYXJlbnQsIHZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSUpwYVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0lKcGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ZTEwMmUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSUpwYVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlOwotCi0vKioKLSAqIEFuIGludGVybmFsIGludGVyZmFjZSB1c2VkIGJ5IGFsbCAzIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgSVR5cGV9LgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHNlZSBKYXZhVHlwZQotICogQHNlZSBKcGFUeXBlCi0gKiBAc2VlIFNpbXBsZVR5cGUKLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElKcGFUeXBlIGV4dGVuZHMgSVR5cGUgewotCi0JLyoqCi0JICogTWFudWFsbHkgc2V0cyB0aGUgZGVjbGFyYXRpb24gb2YgdGhpcyB7QGxpbmsgSVR5cGV9LCB3aGljaCBnaXZlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdHlwZQotCSAqIHBhcmFtZXRlcnMsIGRpbWVuc2lvbmFsaXR5LCBldGMuCi0JICoKLQkgKiBAcGFyYW0gdHlwZURlY2xhcmF0aW9uIFRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSB0eXBlIGRlY2xhcmF0aW9uCi0JICovCi0Jdm9pZCBzZXRUeXBlRGVjbGFyYXRpb24oSnBhVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbik7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSmF2YUNvbnN0cnVjdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KYXZhQ29uc3RydWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg4OTQwYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KYXZhQ29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklDb25zdHJ1Y3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlUmVwb3NpdG9yeTsKLQotLyoqCi0gKiBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElDb25zdHJ1Y3Rvcn0gdGhhdCBpcyB3cmFwcGluZyBhIEphdmEgY29uc3RydWN0b3IuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgSmF2YUNvbnN0cnVjdG9yIGltcGxlbWVudHMgSUNvbnN0cnVjdG9yIHsKLQotCS8qKgotCSAqIFRoZSBhY3R1YWwgSmF2YSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB7QGxpbmsgSVR5cGVEZWNsYXJhdGlvbiBwYXJhbWV0ZXIgdHlwZXN9LgotCSAqLwotCXByaXZhdGUgSVR5cGVEZWNsYXJhdGlvbltdIHBhcmFtZXRlclR5cGVzOwotCi0JLyoqCi0JICogVGhlIGRlY2xhcmluZyB0eXBlIG9mIHRoaXMgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBKYXZhVHlwZSB0eXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhQ29uc3RydWN0b3I8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHR5cGUgVGhlIGRlY2xhcmluZyB0eXBlIG9mIHRoaXMgY29uc3RydWN0b3IKLQkgKiBAcGFyYW0gY29uc3RydWN0b3IgVGhlIGFjdHVhbCBKYXZhIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEphdmFDb25zdHJ1Y3RvcihKYXZhVHlwZSB0eXBlLCBDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvcikgewotCQlzdXBlcigpOwotCQl0aGlzLnR5cGUgPSB0eXBlOwotCQl0aGlzLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlRGVjbGFyYXRpb25bXSBidWlsZFBhcmFtZXRlclR5cGVzKCkgewotCi0JCUNsYXNzPD8+W10gdHlwZXMgPSBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQlUeXBlW10gZ2VuZXJpY1R5cGVzID0gY29uc3RydWN0b3IuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCk7Ci0JCUlUeXBlRGVjbGFyYXRpb25bXSB0eXBlRGVjbGFyYXRpb25zID0gbmV3IElUeXBlRGVjbGFyYXRpb25bdHlwZXMubGVuZ3RoXTsKLQotCQlmb3IgKGludCBpbmRleCA9IDAsIGNvdW50ID0gdHlwZXMubGVuZ3RoOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0JCQl0eXBlRGVjbGFyYXRpb25zW2luZGV4XSA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGVzW2luZGV4XSwgZ2VuZXJpY1R5cGVzW2luZGV4XSk7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZURlY2xhcmF0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGVEZWNsYXJhdGlvbiBidWlsZFR5cGVEZWNsYXJhdGlvbihDbGFzczw/PiBqYXZhVHlwZSwgVHlwZSBnZW5lcmljVHlwZSkgewotCQlJVHlwZVJlcG9zaXRvcnkgdHlwZVJlcG9zaXRvcnkgPSBnZXRUeXBlUmVwb3NpdG9yeSgpOwotCQlJVHlwZSB0eXBlID0gdHlwZVJlcG9zaXRvcnkuZ2V0VHlwZShqYXZhVHlwZSk7Ci0JCXJldHVybiBuZXcgSmF2YVR5cGVEZWNsYXJhdGlvbih0eXBlUmVwb3NpdG9yeSwgdHlwZSwgZ2VuZXJpY1R5cGUsIGphdmFUeXBlLmlzQXJyYXkoKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJVHlwZURlY2xhcmF0aW9uW10gZ2V0UGFyYW1ldGVyVHlwZXMoKSB7Ci0JCWlmIChwYXJhbWV0ZXJUeXBlcyA9PSBudWxsKSB7Ci0JCQlwYXJhbWV0ZXJUeXBlcyA9IGJ1aWxkUGFyYW1ldGVyVHlwZXMoKTsKLQkJfQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlUmVwb3NpdG9yeSBnZXRUeXBlUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIHR5cGUuZ2V0VHlwZVJlcG9zaXRvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGNvbnN0cnVjdG9yLnRvR2VuZXJpY1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KYXZhVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSmF2YVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1NWJjZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KYXZhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkV4cHJlc3Npb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5UeXBlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JQ29uc3RydWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnV0aWwuaXRlcmF0b3IuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC51dGlsLml0ZXJhdG9yLkl0ZXJhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJVHlwZX0gdGhhdCBpcyB3cmFwcGluZyBhIEphdmEgdHlwZS4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZSBpbXBsZW1lbnRzIElKcGFUeXBlIHsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQge0BsaW5rIElDb25zdHJ1Y3RvciBJQ29uc3RydWN0b3JzfS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248SUNvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnM7Ci0KLQkvKioKLQkgKiBUaGUgbGlzdCBvZiBuYW1lcyBmb3IgdGhlIHtAbGluayBFbnVtfSdzIGNvbnN0YW50cyBvdGhlcndpc2UgYW4gZW1wdHkgYXJyYXkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBlbnVtQ29uc3RhbnRzOwotCi0JLyoqCi0JICogVGhlIGFjdHVhbCBKYXZhIHR5cGUuCi0JICovCi0JcHJpdmF0ZSBDbGFzczw/PiB0eXBlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB7QGxpbmsgSVR5cGVEZWNsYXJhdGlvbn0gZm9yIHRoaXMge0BsaW5rIElUeXBlfS4KLQkgKi8KLQlwcml2YXRlIElUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uOwotCi0JLyoqCi0JICogVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIHR5cGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZU5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZXJuYWwgZm9ybSBvZiBhIHR5cGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwcml2YXRlIEpwYVR5cGVSZXBvc2l0b3J5IHR5cGVSZXBvc2l0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhVHlwZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gdHlwZVJlcG9zaXRvcnkgVGhlIGV4dGVybmFsIGZvcm0gb2YgYSB0eXBlIHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gdHlwZSBUaGUgYWN0dWFsIEphdmEgdHlwZSB3cmFwcGVkIGJ5IHRoaXMgY2xhc3MKLQkgKi8KLQlwdWJsaWMgSmF2YVR5cGUoSnBhVHlwZVJlcG9zaXRvcnkgdHlwZVJlcG9zaXRvcnksIENsYXNzPD8+IHR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50eXBlICAgICAgICAgICA9IHR5cGU7Ci0JCXRoaXMudHlwZU5hbWUgICAgICAgPSB0eXBlLmdldE5hbWUoKTsKLQkJdGhpcy50eXBlUmVwb3NpdG9yeSA9IHR5cGVSZXBvc2l0b3J5OwotCX0KLQotCXByb3RlY3RlZCBJQ29uc3RydWN0b3IgYnVpbGRDb25zdHJ1Y3RvcihDb25zdHJ1Y3Rvcjw/PiBjb25zdHJ1Y3RvcikgewotCQlyZXR1cm4gbmV3IEphdmFDb25zdHJ1Y3Rvcih0aGlzLCBjb25zdHJ1Y3Rvcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUNvbnN0cnVjdG9yPiBidWlsZENvbnN0cnVjdG9ycygpIHsKLQotCQlDb25zdHJ1Y3Rvcjw/PltdIGphdmFDb25zdHJ1Y3RvcnMgPSB0eXBlLmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7Ci0JCUNvbGxlY3Rpb248SUNvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMgPSBuZXcgQXJyYXlMaXN0PElDb25zdHJ1Y3Rvcj4oamF2YUNvbnN0cnVjdG9ycy5sZW5ndGgpOwotCi0JCWZvciAoQ29uc3RydWN0b3I8Pz4gamF2YUNvbnN0cnVjdG9yIDogamF2YUNvbnN0cnVjdG9ycykgewotCQkJY29uc3RydWN0b3JzLmFkZChidWlsZENvbnN0cnVjdG9yKGphdmFDb25zdHJ1Y3RvcikpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbnN0cnVjdG9yczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRFbnVtQ29uc3RhbnRzKCkgewotCi0JCWlmICghdHlwZS5pc0VudW0oKSkgewotCQkJcmV0dXJuIEV4cHJlc3Npb25Ub29scy5FTVBUWV9TVFJJTkdfQVJSQVk7Ci0JCX0KLQotCQlPYmplY3RbXSBlbnVtQ29uc3RhbnRzID0gdHlwZS5nZXRFbnVtQ29uc3RhbnRzKCk7Ci0JCVN0cmluZ1tdIG5hbWVzID0gbmV3IFN0cmluZ1tlbnVtQ29uc3RhbnRzLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaW5kZXggPSBlbnVtQ29uc3RhbnRzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCW5hbWVzW2luZGV4XSA9ICgoRW51bTw/PikgZW51bUNvbnN0YW50c1tpbmRleF0pLm5hbWUoKTsKLQkJfQotCi0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEl0ZXJhYmxlSXRlcmF0b3I8SUNvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMoKSB7Ci0JCWlmIChjb25zdHJ1Y3RvcnMgPT0gbnVsbCkgewotCQkJY29uc3RydWN0b3JzID0gYnVpbGRDb25zdHJ1Y3RvcnMoKTsKLQkJfQotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SUNvbnN0cnVjdG9yPihjb25zdHJ1Y3RvcnMpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gKHRoaXMgPT0gdHlwZSkgfHwgdHlwZU5hbWUuZXF1YWxzKHR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJcmV0dXJuIGVxdWFscygoSVR5cGUpIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtQ29uc3RhbnRzKCkgewotCQlpZiAoZW51bUNvbnN0YW50cyA9PSBudWxsKSB7Ci0JCQllbnVtQ29uc3RhbnRzID0gYnVpbGRFbnVtQ29uc3RhbnRzKCk7Ci0JCX0KLQkJcmV0dXJuIGVudW1Db25zdGFudHM7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY2Fwc3VsYXRlZCB7QGxpbmsgQ2xhc3N9LCB3aGljaCBpcyB0aGUgYWN0dWFsIHR5cGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBhY3R1YWwgSmF2YSB0eXBlLCBpZiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZDsgdGhlbiB0aGUgY2xhc3MgY291bGQgbm90IGJlIHJlc29sdmVkCi0JICovCi0JcHJvdGVjdGVkIENsYXNzPD8+IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSVR5cGVEZWNsYXJhdGlvbiBnZXRUeXBlRGVjbGFyYXRpb24oKSB7Ci0JCWlmICh0eXBlRGVjbGFyYXRpb24gPT0gbnVsbCkgewotCQkJdHlwZURlY2xhcmF0aW9uID0gbmV3IEphdmFUeXBlRGVjbGFyYXRpb24odHlwZVJlcG9zaXRvcnksIHRoaXMsIG51bGwsICh0eXBlICE9IG51bGwpID8gdHlwZS5pc0FycmF5KCkgOiBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIHJlcG9zaXRvcnkgZm9yIHRoZSBhcHBsaWNhdGlvbi4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHJlcG9zaXRvcnkgb2Yge0BsaW5rIElUeXBlIElUeXBlc30KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhVHlwZVJlcG9zaXRvcnkgZ2V0VHlwZVJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiB0eXBlUmVwb3NpdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW5ub3RhdGlvbihDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uVHlwZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0eXBlTmFtZS5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVUbyhJVHlwZSBvdGhlclR5cGUpIHsKLQotCQlpZiAoZXF1YWxzKG90aGVyVHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLy8gTWFrZSBzdXJlIGJvdGggdHlwZXMgYXJlIG5vdCBwcmltaXRpdmVzIHNpbmNlIGlzQXNzaWduYWJsZUZyb20oKSBkb2VzIG5vdCB3b3JrLgotCQkvLyBGb3IgaW5zdGFuY2UgbG9uZyBhbmQgTG9uZyBjYW4ndCBiZSBjb21wYXJlZCBidXQgdGhleSBhcmUgdmFsaWQgZm9yIEpQUUwgcXVlcnkKLQkJVHlwZUhlbHBlciB0eXBlSGVscGVyID0gdHlwZVJlcG9zaXRvcnkuZ2V0VHlwZUhlbHBlcigpOwotCQlJVHlwZSB0aGlzVHlwZSA9IHR5cGVIZWxwZXIuY29udmVydFByaW1pdGl2ZSh0aGlzKTsKLQkJb3RoZXJUeXBlID0gdHlwZUhlbHBlci5jb252ZXJ0UHJpbWl0aXZlKG90aGVyVHlwZSk7Ci0KLQkJLy8gQm90aCBhcmUgSmF2YVR5cGUsIGV2ZW4gZG9pbmcgY29udmVydFByaW1pdGl2ZSgpIG9uIHRoaXMgdHlwZSBhbHdheXMgcmV0dXJucwotCQkvLyBhIEphdmFUeXBlIHdoZW4gY29udmVydGluZyBhIHByaW1pdGl2ZSBpbnRvIGl0cyBDbGFzcyBvYmplY3QKLQkJaWYgKG90aGVyVHlwZSBpbnN0YW5jZW9mIEphdmFUeXBlKSB7Ci0JCQlDbGFzczw/PiB0aGlzQ2xhc3MgID0gKChKYXZhVHlwZSkgdGhpc1R5cGUpIC50eXBlOwotCQkJQ2xhc3M8Pz4gb3RoZXJDbGFzcyA9ICgoSmF2YVR5cGUpIG90aGVyVHlwZSkudHlwZTsKLQkJCXJldHVybiBvdGhlckNsYXNzLmlzQXNzaWduYWJsZUZyb20odGhpc0NsYXNzKTsKLQkJfQotCi0JCS8vIEZvciBKcGFUeXBlLCBjb252ZXJ0IHRoaXMgdHlwZSBpbnRvIGEgSnBhVHlwZSBhbmQgdXNlIGl0cyBpc0Fzc2lnbmFibGVUbygpCi0JCWlmIChvdGhlclR5cGUgaW5zdGFuY2VvZiBKcGFUeXBlKSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZSBqZHRUeXBlID0gdHlwZVJlcG9zaXRvcnkuZmluZFR5cGUodHlwZU5hbWUpOwotCi0JCQlpZiAoamR0VHlwZSAhPSBudWxsKSB7Ci0JCQkJSnBhVHlwZSBqcGFUeXBlID0gbmV3IEpwYVR5cGUodHlwZVJlcG9zaXRvcnksIGpkdFR5cGUpOwotCQkJCXJldHVybiBqcGFUeXBlLmlzQXNzaWduYWJsZVRvKG90aGVyVHlwZSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIFNpbXBsZVR5cGUgY2Fubm90IGJlIHZhbGlkYXRlZCBzaW5jZSBpdCdzIHdyYXBwaW5nIGFuIHVua25vd24gdHlwZQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW51bSgpIHsKLQkJcmV0dXJuICh0eXBlICE9IG51bGwpICYmIHR5cGUuaXNFbnVtKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFR5cGVEZWNsYXJhdGlvbihKcGFUeXBlRGVjbGFyYXRpb24gdHlwZURlY2xhcmF0aW9uKSB7Ci0JCXRoaXMudHlwZURlY2xhcmF0aW9uID0gdHlwZURlY2xhcmF0aW9uOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0phdmFUeXBlRGVjbGFyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0phdmFUeXBlRGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YTY1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KYXZhVHlwZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGVSZXBvc2l0b3J5OwotCi0vKioKLSAqIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVR5cGVEZWNsYXJhdGlvbn0gdGhhdCBpcyB3cmFwcGluZyB0aGUgcmVwcmVzZW50YXRpb24KLSAqIG9mIHRoZSBkZWNsYXJhdGlvbiBkZXNjcmlwdGlvbiBvZiBhIHR5cGUuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAc2VlIElNYXBwaW5nCi0gKiBAc2VlIElUeXBlCi0gKgotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVEZWNsYXJhdGlvbiBpbXBsZW1lbnRzIElUeXBlRGVjbGFyYXRpb24gewotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0eXBlIGRlY2xhcmF0aW9uIHJlcHJlc2VudHMgYW4gYXJyYXkuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGFycmF5OwotCi0JLyoqCi0JICogVGhlIGFjdHVhbCB0eXBlIHRoYXQgY29udGFpbnMgdGhlIGdlbmVyaWNzLCBpZiBhbnkgaXMgcHJlc2VudC4KLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZW5lcmljVHlwZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQge0BsaW5rIElUeXBlRGVjbGFyYXRpb24gSVR5cGVEZWNsYXJhdGlvbnN9IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJpY3Mgb2YgdGhlIHtAbGluawotCSAqIFR5cGV9LgotCSAqLwotCXByaXZhdGUgSVR5cGVEZWNsYXJhdGlvbltdIGdlbmVyaWNUeXBlczsKLQotCS8qKgotCSAqIFRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSBKYXZhIHR5cGUuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJVHlwZSB0eXBlOwotCi0JLyoqCi0JICogVGhlIHJlcG9zaXRvcnkgb2Yge0BsaW5rIElUeXBlIElUeXBlc30uCi0JICovCi0JcHJpdmF0ZSBJVHlwZVJlcG9zaXRvcnkgdHlwZVJlcG9zaXRvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFUeXBlRGVjbGFyYXRpb248L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHR5cGVSZXBvc2l0b3J5IFRoZSByZXBvc2l0b3J5IG9mIHtAbGluayBJVHlwZSBJVHlwZXN9Ci0JICogQHBhcmFtIHR5cGUgVGhlIGV4dGVybmFsIGZvcm0gb2YgdGhlIEphdmEgdHlwZQotCSAqIEBwYXJhbSBnZW5lcmljVHlwZSBUaGUgYWN0dWFsIHR5cGUgdGhhdCBjb250YWlucyB0aGUgZ2VuZXJpY3MsIGlmIGFueSBpcyBwcmVzZW50Ci0JICogQHBhcmFtIGFycmF5IERldGVybWluZXMgd2hldGhlciB0aGUgdHlwZSBkZWNsYXJhdGlvbiByZXByZXNlbnRzIGFuIGFycmF5Ci0JICovCi0JcHVibGljIEphdmFUeXBlRGVjbGFyYXRpb24oSVR5cGVSZXBvc2l0b3J5IHR5cGVSZXBvc2l0b3J5LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIElUeXBlIHR5cGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGdlbmVyaWNUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXJyYXkpIHsKLQotCQlzdXBlcigpOwotCQl0aGlzLnR5cGUgICAgICAgICAgID0gdHlwZTsKLQkJdGhpcy5hcnJheSAgICAgICAgICA9IGFycmF5OwotCQl0aGlzLmdlbmVyaWNUeXBlICAgID0gZ2VuZXJpY1R5cGU7Ci0JCXRoaXMudHlwZVJlcG9zaXRvcnkgPSB0eXBlUmVwb3NpdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkQXJyYXlUeXBlTmFtZShTdHJpbmcgYXJyYXlUeXBlTmFtZSkgewotCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlpbnQgaW5kZXggPSBhcnJheVR5cGVOYW1lLmluZGV4T2YoJ1snKTsKLQkJaW50IGRpbWVuc2lvbmFsaXR5ID0gKGFycmF5VHlwZU5hbWUubGVuZ3RoKCkgLSBpbmRleCkgLyAyOwotCQlTdHJpbmcgdHlwZU5hbWUgPSBhcnJheVR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0KLQkJd2hpbGUgKC0tZGltZW5zaW9uYWxpdHkgPj0gMCkgewotCQkJc2IuYXBwZW5kKCJbIik7Ci0JCX0KLQotCQlTdHJpbmcgZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZSh0eXBlTmFtZSk7Ci0KLQkJc2IuYXBwZW5kKGVsZW1lbnRUeXBlKTsKLQkJc2IuYXBwZW5kKHR5cGVOYW1lKTsKLQotCQlpZiAoZWxlbWVudFR5cGUuZXF1YWxzKCJMIikpIHsKLQkJCXNiLmFwcGVuZCgiOyIpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlRGVjbGFyYXRpb25bXSBidWlsZFBhcmFtZXRlclR5cGVzKCkgewotCi0JCUxpc3Q8SVR5cGVEZWNsYXJhdGlvbj4gcGFyYW1ldGVyVHlwZXMgPSBuZXcgQXJyYXlMaXN0PElUeXBlRGVjbGFyYXRpb24+KCk7Ci0KLQkJLy8gRXhhbXBsZTogQ2xhc3M8VD4KLQkJaWYgKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLQkJCVBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBnZW5lcmljVHlwZTsKLQkJCWZvciAoVHlwZSB0eXBlIDogcGFyYW1ldGVyaXplZFR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKSB7Ci0JCQkJSVR5cGVEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyID0gYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZSk7Ci0JCQkJcGFyYW1ldGVyVHlwZXMuYWRkKHR5cGVQYXJhbWV0ZXIpOwotCQkJfQotCQl9Ci0JCS8vIFRbXQotCQllbHNlIGlmIChnZW5lcmljVHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNBcnJheVR5cGUpIHsKLQkJCUdlbmVyaWNBcnJheVR5cGUgZ2VuZXJpY0FycmF5VHlwZSA9IChHZW5lcmljQXJyYXlUeXBlKSBnZW5lcmljVHlwZTsKLQkJCXBhcmFtZXRlclR5cGVzLmFkZChidWlsZFR5cGVEZWNsYXJhdGlvbihnZW5lcmljQXJyYXlUeXBlLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkpKTsKLQkJfQotCQkvLyBFeGFtcGxlOiBDbGFzcwotCQllbHNlIGlmIChnZW5lcmljVHlwZS5nZXRDbGFzcygpID09IENsYXNzLmNsYXNzKSB7Ci0JCQlJVHlwZURlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXIgPSBidWlsZFR5cGVEZWNsYXJhdGlvbigoQ2xhc3M8Pz4pIGdlbmVyaWNUeXBlKTsKLQkJCXBhcmFtZXRlclR5cGVzLmFkZCh0eXBlUGFyYW1ldGVyKTsKLQkJfQotCQkvLyBFeGFtcGxlOiA8SywgVj4KLQkJZWxzZSBpZiAoZ2VuZXJpY1R5cGUuZ2V0Q2xhc3MoKSA9PSBDbGFzc1tdLmNsYXNzKSB7Ci0JCQlmb3IgKENsYXNzPD8+IGphdmFUeXBlIDogKChDbGFzczw/PltdKSBnZW5lcmljVHlwZSkpIHsKLQkJCQlJVHlwZURlY2xhcmF0aW9uIHR5cGVQYXJhbWV0ZXIgPSBidWlsZFR5cGVEZWNsYXJhdGlvbihqYXZhVHlwZSk7Ci0JCQkJcGFyYW1ldGVyVHlwZXMuYWRkKHR5cGVQYXJhbWV0ZXIpOwotCQkJfQotCQl9Ci0JCS8vIEV4YW1wbGU6IDxLLCBWPgotCQllbHNlIGlmIChnZW5lcmljVHlwZS5nZXRDbGFzcygpID09IElUeXBlW10uY2xhc3MpIHsKLQkJCWZvciAoSVR5cGUgdHlwZSA6ICgoSVR5cGVbXSkgZ2VuZXJpY1R5cGUpKSB7Ci0JCQkJSVR5cGVEZWNsYXJhdGlvbiB0eXBlUGFyYW1ldGVyID0gbmV3IEphdmFUeXBlRGVjbGFyYXRpb24odHlwZVJlcG9zaXRvcnksIHR5cGUsIG51bGwsIGZhbHNlKTsKLQkJCQlwYXJhbWV0ZXJUeXBlcy5hZGQodHlwZVBhcmFtZXRlcik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcGFyYW1ldGVyVHlwZXMudG9BcnJheShuZXcgSVR5cGVEZWNsYXJhdGlvbltwYXJhbWV0ZXJUeXBlcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVR5cGVEZWNsYXJhdGlvbiBidWlsZFR5cGVEZWNsYXJhdGlvbihDbGFzczw/PiBqYXZhVHlwZSkgewotCQlyZXR1cm4gbmV3IEphdmFUeXBlRGVjbGFyYXRpb24oCi0JCQl0eXBlUmVwb3NpdG9yeSwKLQkJCWdldFR5cGUoamF2YVR5cGUpLAotCQkJbnVsbCwKLQkJCWphdmFUeXBlLmlzQXJyYXkoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBKYXZhVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKE9iamVjdCBnZW5lcmljVHlwZSkgewotCi0JCS8vIDxUMSwgLi4uLCBUbj4KLQkJaWYgKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKLQkJCVBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBnZW5lcmljVHlwZTsKLQkJCXJldHVybiBidWlsZFR5cGVEZWNsYXJhdGlvbihwYXJhbWV0ZXJpemVkVHlwZS5nZXRSYXdUeXBlKCkpOwotCQl9Ci0KLQkJLy8gPFQ+Ci0JCWlmIChnZW5lcmljVHlwZSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkgewotCQkJVHlwZVZhcmlhYmxlPD8+IHR5cGVWYXJpYWJsZSA9IChUeXBlVmFyaWFibGU8Pz4pIGdlbmVyaWNUeXBlOwotCQkJZm9yIChUeXBlIHR5cGUgOiB0eXBlVmFyaWFibGUuZ2V0Qm91bmRzKCkpIHsKLQkJCQlyZXR1cm4gYnVpbGRUeXBlRGVjbGFyYXRpb24odHlwZSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVpbGRUeXBlRGVjbGFyYXRpb24oT2JqZWN0LmNsYXNzKTsKLQkJfQotCi0JCS8vID8KLQkJaWYgKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgV2lsZGNhcmRUeXBlKSB7Ci0JCQlXaWxkY2FyZFR5cGUgd2lsZGNhcmRUeXBlID0gKFdpbGRjYXJkVHlwZSkgZ2VuZXJpY1R5cGU7Ci0JCQlmb3IgKFR5cGUgdHlwZSA6IHdpbGRjYXJkVHlwZS5nZXRVcHBlckJvdW5kcygpKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkVHlwZURlY2xhcmF0aW9uKHR5cGUpOwotCQkJfQotCQkJcmV0dXJuIGJ1aWxkVHlwZURlY2xhcmF0aW9uKE9iamVjdC5jbGFzcyk7Ci0JCX0KLQotCQkvLyBUW10KLQkJaWYgKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgewotCQkJR2VuZXJpY0FycmF5VHlwZSBnZW5lcmljQXJyYXlUeXBlID0gKEdlbmVyaWNBcnJheVR5cGUpIGdlbmVyaWNUeXBlOwotCQkJU3RyaW5nIGFycmF5VHlwZU5hbWUgPSBidWlsZEFycmF5VHlwZU5hbWUoZ2VuZXJpY0FycmF5VHlwZS50b1N0cmluZygpKTsKLQkJCUlUeXBlIGFycmF5VHlwZSA9IHR5cGVSZXBvc2l0b3J5LmdldFR5cGUoYXJyYXlUeXBlTmFtZSk7Ci0KLQkJCXJldHVybiBuZXcgSmF2YVR5cGVEZWNsYXJhdGlvbigKLQkJCQl0eXBlUmVwb3NpdG9yeSwKLQkJCQlhcnJheVR5cGUsCi0JCQkJZ2VuZXJpY0FycmF5VHlwZS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpLAotCQkJCXRydWUKLQkJCSk7Ci0JCX0KLQotCQlyZXR1cm4gYnVpbGRUeXBlRGVjbGFyYXRpb24oKENsYXNzPD8+KSBnZW5lcmljVHlwZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBlbGVtZW50VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJib29sZWFuIikpIHJldHVybiAiWiI7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoImJ5dGUiKSkgICAgcmV0dXJuICJCIjsKLQkJaWYgKHR5cGVOYW1lLmVxdWFscygiY2hhciIpKSAgICByZXR1cm4gIkMiOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJkb3VibGUiKSkgIHJldHVybiAiRCI7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoImZsb2F0IikpICAgcmV0dXJuICJGIjsKLQkJaWYgKHR5cGVOYW1lLmVxdWFscygiaW50IikpICAgICByZXR1cm4gIkkiOwotCQlpZiAodHlwZU5hbWUuZXF1YWxzKCJsb25nIikpICAgIHJldHVybiAiSiI7Ci0JCWlmICh0eXBlTmFtZS5lcXVhbHMoInNob3J0IikpICAgcmV0dXJuICJTIjsKLQotCQlyZXR1cm4gIkwiOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgaW50IGdldERpbWVuc2lvbmFsaXR5KCkgewotCQlpZiAoYXJyYXkpIHsKLQkJCVN0cmluZyBuYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0JCQlpbnQgaW5kZXggPSAwOwotCQkJd2hpbGUgKG5hbWUuY2hhckF0KGluZGV4KSA9PSAnWycpIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQkJcmV0dXJuIGluZGV4OwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlIGdldFR5cGUoQ2xhc3M8Pz4gdHlwZSkgewotCQlyZXR1cm4gdHlwZVJlcG9zaXRvcnkuZ2V0VHlwZSh0eXBlKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlRGVjbGFyYXRpb25bXSBnZXRUeXBlUGFyYW1ldGVycygpIHsKLQkJaWYgKGdlbmVyaWNUeXBlcyA9PSBudWxsKSB7Ci0JCQlpZiAoZ2VuZXJpY1R5cGUgPT0gbnVsbCkgewotCQkJCWdlbmVyaWNUeXBlcyA9IG5ldyBJVHlwZURlY2xhcmF0aW9uWzBdOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ2VuZXJpY1R5cGVzID0gYnVpbGRQYXJhbWV0ZXJUeXBlcygpOwotCQkJfQotCQl9Ci0JCXJldHVybiBnZW5lcmljVHlwZXM7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJyYXkoKSB7Ci0JCXJldHVybiBhcnJheTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIChnZW5lcmljVHlwZSAhPSBudWxsKSA/IGdlbmVyaWNUeXBlLnRvU3RyaW5nKCkgOiB0eXBlLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYUNvbnN0cnVjdG9yLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFDb25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGNhOWJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYUNvbnN0cnVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSUNvbnN0cnVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGVSZXBvc2l0b3J5OwotCi0vKioKLSAqIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSUNvbnN0cnVjdG9yfSB0aGF0IGlzIHdyYXBwaW5nIHRoZSBkZXNpZ24tdGltZQotICogcmVwcmVzZW50YXRpb24gb2YgYSBKYXZhIGNvbnN0cnVjdG9yLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGNsYXNzIEpwYUNvbnN0cnVjdG9yIGltcGxlbWVudHMgSUNvbnN0cnVjdG9yIHsKLQotCS8qKgotCSAqIFRoZSBkZXNpZ24tdGltZSByZXByZXNlbnRhdGlvbiBvZiBhIEphdmEgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBJTWV0aG9kQmluZGluZyBjb25zdHJ1Y3RvcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQge0BsaW5rIElUeXBlRGVjbGFyYXRpb24gSVR5cGVEZWNsYXJhdGlvbnN9IHJlcHJlc2VudGluZyBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RvcidzCi0JICogcGFyYW1ldGVyIHR5cGVzLgotCSAqLwotCXByaXZhdGUgSVR5cGVEZWNsYXJhdGlvbltdIHR5cGVEZWNsYXJhdGlvbnM7Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvd25pbmcgdGhpcyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcml2YXRlIEpwYVR5cGUgdHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29uc3RydWN0b3I8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb3duaW5nIHRoZSBjb25zdHJ1Y3RvcgotCSAqIEBwYXJhbSBjb25zdHJ1Y3RvciBUaGUgZGVzaWduLXRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSBKYXZhIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpwYUNvbnN0cnVjdG9yKEpwYVR5cGUgdHlwZSwgSU1ldGhvZEJpbmRpbmcgY29uc3RydWN0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50eXBlICAgICAgICA9IHR5cGU7Ci0JCXRoaXMuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGVEZWNsYXJhdGlvbiBidWlsZFR5cGVEZWNsYXJhdGlvbihJVHlwZUJpbmRpbmcgcGFyYW1ldGVyVHlwZSkgewotCi0JCWJvb2xlYW4gYXJyYXkgPSBwYXJhbWV0ZXJUeXBlLmlzQXJyYXkoKTsKLQkJU3RyaW5nIHR5cGVQYXJhbWV0ZXJOYW1lOwotCi0JCWlmIChhcnJheSkgewotCQkJSVR5cGVCaW5kaW5nIGNvbXBvbmVudFR5cGUgPSBwYXJhbWV0ZXJUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQotCQkJLy8gPFQ+W10gb3IgPD8gZXh0ZW5kcyA8Y2xhc3NfbmFtZT4+W10KLQkJCWlmIChjb21wb25lbnRUeXBlLmlzVHlwZVZhcmlhYmxlKCkgfHwKLQkJCSAgICBjb21wb25lbnRUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgewotCi0JCQkJdHlwZVBhcmFtZXRlck5hbWUgPSBjb21wb25lbnRUeXBlLmdldEVyYXN1cmUoKS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0eXBlUGFyYW1ldGVyTmFtZSA9IGNvbXBvbmVudFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJfQotCi0JCQkvLyBOb3cgZm9yIHRoZSB0eXBlIGFyZ3VtZW50cywgd2UgaGF2ZSB0byB1c2UgdGhlIGNvbXBvbmVudCB0eXBlCi0JCQlwYXJhbWV0ZXJUeXBlID0gY29tcG9uZW50VHlwZTsKLQkJfQotCQkvLyA8VD4gb3IgPD8gZXh0ZW5kcyA8Y2xhc3NfbmFtZT4+Ci0JCWVsc2UgaWYgKHBhcmFtZXRlclR5cGUuaXNUeXBlVmFyaWFibGUoKSB8fAotCQkgICAgICAgICBwYXJhbWV0ZXJUeXBlLmlzUGFyYW1ldGVyaXplZFR5cGUoKSkgewotCi0JCQl0eXBlUGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlclR5cGUuZ2V0RXJhc3VyZSgpLmdldFF1YWxpZmllZE5hbWUoKTsKLQkJfQotCQllbHNlIHsKLQkJCXR5cGVQYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCX0KLQotCQkvLyBSZXRyaWV2ZSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUKLQkJSVR5cGVSZXBvc2l0b3J5IHR5cGVSZXBvc2l0b3J5ID0gdHlwZS5nZXRUeXBlUmVwb3NpdG9yeSgpOwotCQlJVHlwZUJpbmRpbmdbXSB0eXBlQXJndW1lbnRzID0gcGFyYW1ldGVyVHlwZS5nZXRUeXBlQXJndW1lbnRzKCk7Ci0JCUlUeXBlRGVjbGFyYXRpb25bXSBnZW5lcmljVHlwZXMgPSBuZXcgSVR5cGVEZWNsYXJhdGlvblt0eXBlQXJndW1lbnRzLmxlbmd0aF07Ci0JCWludCBpbmRleCA9IDA7Ci0KLQkJZm9yIChJVHlwZUJpbmRpbmcgdHlwZUFyZ3VtZW50IDogdHlwZUFyZ3VtZW50cykgewotCQkJU3RyaW5nIGdlbmVyaWNUeXBlTmFtZSA9IHR5cGVBcmd1bWVudC5nZXRFcmFzdXJlKCkuZ2V0UXVhbGlmaWVkTmFtZSgpOwotCQkJSVR5cGUgZ2VuZXJpY1R5cGUgPSB0eXBlUmVwb3NpdG9yeS5nZXRUeXBlKGdlbmVyaWNUeXBlTmFtZSk7Ci0JCQlnZW5lcmljVHlwZXNbaW5kZXgrK10gPSBnZW5lcmljVHlwZS5nZXRUeXBlRGVjbGFyYXRpb24oKTsKLQkJfQotCi0JCXJldHVybiBuZXcgSnBhVHlwZURlY2xhcmF0aW9uKAotCQkJdHlwZVJlcG9zaXRvcnkuZ2V0VHlwZSh0eXBlUGFyYW1ldGVyTmFtZSksCi0JCQlnZW5lcmljVHlwZXMsCi0JCQlwYXJhbWV0ZXJUeXBlLmdldERpbWVuc2lvbnMoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZURlY2xhcmF0aW9uW10gYnVpbGRUeXBlRGVjbGFyYXRpb25zKCkgewotCi0JCUlUeXBlQmluZGluZ1tdIHBhcmFtZXRlclR5cGVzID0gY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJSVR5cGVEZWNsYXJhdGlvbltdIGRlY2xhcmF0aW9ucyA9IG5ldyBJVHlwZURlY2xhcmF0aW9uW3BhcmFtZXRlclR5cGVzLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaW5kZXggPSBkZWNsYXJhdGlvbnMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJZGVjbGFyYXRpb25zW2luZGV4XSA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKHBhcmFtZXRlclR5cGVzW2luZGV4XSk7Ci0JCX0KLQotCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSVR5cGVEZWNsYXJhdGlvbltdIGdldFBhcmFtZXRlclR5cGVzKCkgewotCQlpZiAodHlwZURlY2xhcmF0aW9ucyA9PSBudWxsKSB7Ci0JCQl0eXBlRGVjbGFyYXRpb25zID0gYnVpbGRUeXBlRGVjbGFyYXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbnM7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBjb25zdHJ1Y3Rvci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFFbWJlZGRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFFbWJlZGRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMTljNGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSnBhRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFuYWdlZFR5cGVWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ0J1aWxkZXI7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJRW1iZWRkYWJsZX0gdGhhdCBpcyB3cmFwcGluZyB0aGUgZGVzaWduLXRpbWUKLSAqIHJlcHJlc2VudGF0aW9uIG9mIGEgSlBBIGVtYmVkZGFibGUuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgSnBhRW1iZWRkYWJsZSBleHRlbmRzIEpwYU1hbmFnZWRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElFbWJlZGRhYmxlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhRW1iZWRkYWJsZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIG9mIEpQQSBtYW5hZ2VkIHR5cGVzCi0JICogQHBhcmFtIGVtYmVkZGFibGUgVGhlIGRlc2lnbi10aW1lIG1vZGVsIG9iamVjdCB3cmFwcGVkIGJ5IHRoaXMgY2xhc3MKLQkgKiBAcGFyYW0gbWFwcGluZ0J1aWxkZXIgVGhlIGJ1aWxkZXIgdGhhdCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHtAbGluayBJTWFwcGluZ30gd3JhcHBpbmcKLQkgKiBhIHBlcnNpc3RlbnQgYXR0cmlidXRlIG9yIHByb3BlcnR5Ci0JICovCi0JcHVibGljIEpwYUVtYmVkZGFibGUoSnBhTWFuYWdlZFR5cGVQcm92aWRlciBwcm92aWRlciwKLQkgICAgICAgICAgICAgICAgICAgICBFbWJlZGRhYmxlIGVtYmVkZGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgSU1hcHBpbmdCdWlsZGVyPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdCdWlsZGVyKSB7Ci0KLQkJc3VwZXIocHJvdmlkZXIsIGVtYmVkZGFibGUsIG1hcHBpbmdCdWlsZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0KElNYW5hZ2VkVHlwZVZpc2l0b3IgdmlzaXRvcikgewotCQl2aXNpdG9yLnZpc2l0KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRW1iZWRkYWJsZSBnZXRNYW5hZ2VkVHlwZSgpIHsKLQkJcmV0dXJuIChFbWJlZGRhYmxlKSBzdXBlci5nZXRNYW5hZ2VkVHlwZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VHlwZSgpLmdldE5hbWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSnBhRW50aXR5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNkMWI0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hbmFnZWRUeXBlVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hcHBpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JUXVlcnk7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJRW50aXR5fSB0aGF0IGlzIHdyYXBwaW5nIHRoZSBkZXNpZ24tdGltZSByZXByZXNlbnRhdGlvbgotICogb2YgYSBKUEEgZW50aXR5LgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGNsYXNzIEpwYUVudGl0eSBleHRlbmRzIEpwYU1hbmFnZWRUeXBlCi0gICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSUVudGl0eSB7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHVzZWQgdG8gcXVpY2tseSByZXRyaWV2ZSBhbnkgcXVlcmllcyB0aGF0IGhhdmUgYmVlbiBjYWNoZWQuCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJUXVlcnk+IHF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUVudGl0eTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIG9mIEpQQSBtYW5hZ2VkIHR5cGVzCi0JICogQHBhcmFtIGVudGl0eSBUaGUgZGVzaWduLXRpbWUgbW9kZWwgb2JqZWN0IHdyYXBwZWQgYnkgdGhpcyBjbGFzcwotCSAqIEBwYXJhbSBtYXBwaW5nQnVpbGRlciBUaGUgYnVpbGRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUge0BsaW5rIElNYXBwaW5nfSB3cmFwcGluZwotCSAqIGEgcGVyc2lzdGVudCBhdHRyaWJ1dGUgb3IgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgSnBhRW50aXR5KEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICBFbnRpdHkgZW50aXR5LAotCSAgICAgICAgICAgICAgICAgSU1hcHBpbmdCdWlsZGVyPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdCdWlsZGVyKSB7Ci0KLQkJc3VwZXIocHJvdmlkZXIsIGVudGl0eSwgbWFwcGluZ0J1aWxkZXIpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBhY2NlcHQoSU1hbmFnZWRUeXBlVmlzaXRvciB2aXNpdG9yKSB7Ci0JCXZpc2l0b3IudmlzaXQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIElRdWVyeSBidWlsZFF1ZXJ5KEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXIsIE5hbWVkUXVlcnkgbmFtZWRRdWVyeSkgewotCQlyZXR1cm4gbmV3IEpwYVF1ZXJ5KHByb3ZpZGVyLCBuYW1lZFF1ZXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVudGl0eSBnZXRNYW5hZ2VkVHlwZSgpIHsKLQkJcmV0dXJuIChFbnRpdHkpIHN1cGVyLmdldE1hbmFnZWRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldE1hbmFnZWRUeXBlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSVF1ZXJ5IGdldE5hbWVkUXVlcnkoU3RyaW5nIHF1ZXJ5TmFtZSkgewotCQlpbml0aWFsaXplUXVlcmllcygpOwotCQlyZXR1cm4gcXVlcmllcy5nZXQocXVlcnlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllcygpIHsKLQkJaWYgKHF1ZXJpZXMgPT0gbnVsbCkgewotCQkJcXVlcmllcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVF1ZXJ5PigpOwotCQkJaW5pdGlhbGl6ZVF1ZXJpZXMocXVlcmllcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllcyhNYXA8U3RyaW5nLCBJUXVlcnk+IHF1ZXJpZXMpIHsKLQkJSnBhTWFuYWdlZFR5cGVQcm92aWRlciBwcm92aWRlciA9IGdldFByb3ZpZGVyKCk7Ci0JCWZvciAoTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5IDogZ2V0TmFtZWRRdWVyaWVzKCkpIHsKLQkJCXF1ZXJpZXMucHV0KG5hbWVkUXVlcnkuZ2V0TmFtZSgpLCBidWlsZFF1ZXJ5KHByb3ZpZGVyLCBuYW1lZFF1ZXJ5KSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPD8gZXh0ZW5kcyBOYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBnZXRNYW5hZ2VkVHlwZSgpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYU1hbmFnZWRUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFNYW5hZ2VkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzY5ODY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYU1hbmFnZWRUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwudXRpbC5pdGVyYXRvci5DbG9uZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnV0aWwuaXRlcmF0b3IuSXRlcmFibGVJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiB7QGxpbmsgSU1hbmFnZWRUeXBlfSBkZWZpbmVkIGZvciB3cmFwcGluZyB0aGUgZGVzaWduLXRpbWUgbWFwcGVkIGNsYXNzCi0gKiBvYmplY3QuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnBhTWFuYWdlZFR5cGUgaW1wbGVtZW50cyBJTWFuYWdlZFR5cGUgewotCi0JLyoqCi0JICogVGhlIGRlc2lnbi10aW1lIG1vZGVsIG9iamVjdCB3cmFwcGVkIGJ5IHRoaXMgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBUeXBlTWFwcGluZyBtYW5hZ2VkVHlwZTsKLQotCS8qKgotCSAqIFRoZSBidWlsZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB7QGxpbmsgSU1hcHBpbmd9IHdyYXBwaW5nIGEgcGVyc2lzdGVudCBhdHRyaWJ1dGUKLQkgKiBvciBwcm9wZXJ0eS4KLQkgKi8KLQlwcml2YXRlIElNYXBwaW5nQnVpbGRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nQnVpbGRlcjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgY29sbGVjdGlvbiBvZiB7QGxpbmsgSU1hcHBpbmcgbWFwcGluZ3N9IHRoYXQgcHJldmVudCByZWJ1aWxkaW5nIHRoZW0gZXZlcnkgdGltZSBvbmUKLQkgKiBpcyByZXF1ZXN0ZWQuCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJTWFwcGluZz4gbWFwcGluZ3M7Ci0KLQkvKioKLQkgKiBUaGUgcHJvdmlkZXIgb2YgSlBBIG1hbmFnZWQgdHlwZXMuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBKcGFNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB0eXBlIG9mIHRoaXMgbWFuYWdlZCB0eXBlLgotCSAqLwotCXByaXZhdGUgSVR5cGUgdHlwZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SkRldmVsb3Blck1hbmFnZWRUeXBlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBtYW5hZ2VkVHlwZSBUaGUgcHJvdmlkZXIgb2YgSlBBIG1hbmFnZWQgdHlwZXMKLQkgKiBAcGFyYW0gbWFwcGVkQ2xhc3MgVGhlIGRlc2lnbi10aW1lIG1vZGVsIG9iamVjdCB3cmFwcGVkIGJ5IHRoaXMgY2xhc3MKLQkgKiBAcGFyYW0gbWFwcGluZ0J1aWxkZXIgVGhlIGJ1aWxkZXIgdGhhdCBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHtAbGluayBJTWFwcGluZ30gd3JhcHBpbmcKLQkgKiBhIHBlcnNpc3RlbnQgYXR0cmlidXRlIG9yIHByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIEpwYU1hbmFnZWRUeXBlKEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVNYXBwaW5nIG1hbmFnZWRUeXBlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBJTWFwcGluZ0J1aWxkZXI8QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0J1aWxkZXIpIHsKLQotCQlzdXBlcigpOwotCQl0aGlzLnByb3ZpZGVyICAgICAgID0gcHJvdmlkZXI7Ci0JCXRoaXMubWFuYWdlZFR5cGUgICAgPSBtYW5hZ2VkVHlwZTsKLQkJdGhpcy5tYXBwaW5nQnVpbGRlciA9IG1hcHBpbmdCdWlsZGVyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGV4dGVybmFsIGZvcm0gdGhhdCBuZWVkcyB0byB3cmFwIHRoZSBnaXZlbiB7QGxpbmsgQXR0cmlidXRlTWFwcGluZ30uIEJ5IGRlZmF1bHQsCi0JICogdGhlIGNhbGwgaXMgZGVsZWdhdGVkIHRvIHtAbGluayBJTWFwcGluZ0J1aWxkZXJ9LgotCSAqCi0JICogQHBhcmFtIG1hcHBpbmcgVGhlIG1hcHBpbmcgdG8gd3JhcCB3aXRoIGEge0BsaW5rIElNYXBwaW5nfQotCSAqIEByZXR1cm4gQSBuZXcgY29uY3JldGUgaW5zdGFuY2Ugb2Yge0BsaW5rIElNYXBwaW5nfQotCSAqLwotCXByb3RlY3RlZCBJTWFwcGluZyBidWlsZE1hcHBpbmcoQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiBtYXBwaW5nQnVpbGRlci5idWlsZE1hcHBpbmcodGhpcywgbWFwcGluZyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlcm5hbCBmb3JtIGZvciBlYWNoIHtAbGluayBBdHRyaWJ1dGVNYXBwaW5nfSBhbmQgc3RvcmVzIHRoZW0gYnkgdXNpbmcgdGhlaXIKLQkgKiBtYXBwaW5nIG5hbWUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBtYXBwaW5ncyBtYXBwZWQgYnkgdGhlaXIgbmFtZQotCSAqLwotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBJTWFwcGluZz4gYnVpbGRNYXBwaW5ncygpIHsKLQkJTWFwPFN0cmluZywgSU1hcHBpbmc+IG1hcHBpbmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJTWFwcGluZz4oKTsKLQkJZm9yIChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgIDogbWFuYWdlZFR5cGUuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJbWFwcGluZ3MucHV0KG1hcHBpbmcuZ2V0TmFtZSgpLCBidWlsZE1hcHBpbmcobWFwcGluZykpOwotCQl9Ci0JCXJldHVybiBtYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGludCBjb21wYXJlVG8oSU1hbmFnZWRUeXBlIG1hbmFnZWRUeXBlKSB7Ci0JCXJldHVybiBnZXRUeXBlKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhtYW5hZ2VkVHlwZS5nZXRUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmNhcHN1bGF0ZWQgbW9kZWwgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgbWFuYWdlZCB0eXBlIHdyYXBwZWQgYnkgdGhpcyBleHRlcm5hbCBmb3JtCi0JICovCi0JcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldE1hbmFnZWRUeXBlKCkgewotCQlyZXR1cm4gbWFuYWdlZFR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYnVpbGRlciB0aGF0IGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUge0BsaW5rIElNYXBwaW5nfSB3cmFwcGluZyBhIHBlcnNpc3RlbnQKLQkgKiBhdHRyaWJ1dGUgb3IgcHJvcGVydHkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSU1hcHBpbmdCdWlsZGVyfQotCSAqLwotCXByb3RlY3RlZCBJTWFwcGluZ0J1aWxkZXI8QXR0cmlidXRlTWFwcGluZz4gZ2V0TWFwcGluZ0J1aWxkZXIoKSB7Ci0JCXJldHVybiBtYXBwaW5nQnVpbGRlcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElNYXBwaW5nIGdldE1hcHBpbmdOYW1lZChTdHJpbmcgbmFtZSkgewotCQlpbml0aWFsaXplTWFwcGluZ3MoKTsKLQkJcmV0dXJuIG1hcHBpbmdzLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBwcm92aWRlci5nZXRUeXBlUmVwb3NpdG9yeSgpLmdldFR5cGUobWFuYWdlZFR5cGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgbWFuYWdlZCB0eXBlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwaW5ncygpIHsKLQkJaWYgKG1hcHBpbmdzID09IG51bGwpIHsKLQkJCW1hcHBpbmdzID0gYnVpbGRNYXBwaW5ncygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJdGVyYWJsZUl0ZXJhdG9yPElNYXBwaW5nPiBtYXBwaW5ncygpIHsKLQkJaW5pdGlhbGl6ZU1hcHBpbmdzKCk7Ci0JCXJldHVybiBuZXcgQ2xvbmVJdGVyYXRvcjxJTWFwcGluZz4obWFwcGluZ3MudmFsdWVzKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFNYW5hZ2VkVHlwZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFNYW5hZ2VkVHlwZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMWRjMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSnBhTWFuYWdlZFR5cGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVudFR5cGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFuYWdlZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hcHBpbmdCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC51dGlsLml0ZXJhdG9yLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwudXRpbC5pdGVyYXRvci5JdGVyYWJsZUl0ZXJhdG9yOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSU1hbmFnZWRUeXBlUHJvdmlkZXJ9IHRoYXQgaXMgd3JhcHBpbmcgdGhlIGRlc2lnbi10aW1lCi0gKiByZXByZXNlbnRhdGlvbiBvZiBhIHByb3ZpZGVyIG9mIG1hbmFnZWQgdHlwZXMuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgSnBhTWFuYWdlZFR5cGVQcm92aWRlciBpbXBsZW1lbnRzIElNYW5hZ2VkVHlwZVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFRoZSBmaWx0ZXJlZCBjb2xsZWN0aW9uIG9mIG1hbmFnZWQgdHlwZXMgdGhhdCBhcmUge0BsaW5rIElFbWJlZGRhYmxlfS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248SUVtYmVkZGFibGU+IGVtYmVkZGFibGVzOwotCi0JLyoqCi0JICogVGhlIGZpbHRlcmVkIGNvbGxlY3Rpb24gb2YgbWFuYWdlZCB0eXBlcyB0aGF0IGFyZSB0aGUgZW50aXRpZXMuCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElFbnRpdHk+IGVudGl0aWVzOwotCi0JLyoqCi0JICogVGhlIHByb2plY3QgdGhhdCBnaXZlcyBhY2Nlc3MgdG8gdGhlIGFwcGxpY2F0aW9uJ3MgbWV0YWRhdGEuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHtAbGluayBJTWFuYWdlZFR5cGUgbWFuYWdlZCB0eXBlc30uCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBJTWFuYWdlZFR5cGU+IG1hbmFnZWRUeXBlczsKLQotCS8qKgotCSAqIFRoZSBmaWx0ZXJlZCBjb2xsZWN0aW9uIG9mIG1hbmFnZWQgdHlwZXMgdGhhdCBhcmUge0BsaW5rIElNYXBwZWRTdXBlcmNsYXNzfS4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb248SU1hcHBlZFN1cGVyY2xhc3M+IG1hcHBlZFN1cGVyY2xhc3NlczsKLQotCS8qKgotCSAqIFRoZSBidWlsZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB7QGxpbmsgSU1hcHBpbmd9IHdyYXBwaW5nIGEgcGVyc2lzdGVudCBhdHRyaWJ1dGUKLQkgKiBvciBwcm9wZXJ0eS4KLQkgKi8KLQlwcml2YXRlIElNYXBwaW5nQnVpbGRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nQnVpbGRlcjsKLQotCS8qKgotCSAqIFRoZSBkZXNpZ24tdGltZSBwcm92aWRlciBvZiBtYW5hZ2VkIHR5cGVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgUGVyc2lzdGVudFR5cGVDb250YWluZXIgcGVyc2lzdGVudFR5cGVDb250YWluZXI7Ci0KLQkvKioKLQkgKiBUaGUgZXh0ZXJuYWwgZm9ybSBvZiBhIHR5cGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwcml2YXRlIEpwYVR5cGVSZXBvc2l0b3J5IHR5cGVSZXBvc2l0b3J5OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFNYW5hZ2VkVHlwZVByb3ZpZGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBqcGFQcm9qZWN0IFRoZSBwcm9qZWN0IHRoYXQgZ2l2ZXMgYWNjZXNzIHRvIHRoZSBhcHBsaWNhdGlvbidzIG1ldGFkYXRhCi0JICogQHBhcmFtIHBlcnNpc3RlbnRUeXBlQ29udGFpbmVyIFRoZSBkZXNpZ24tdGltZSBwcm92aWRlciBvZiBtYW5hZ2VkIHR5cGVzCi0JICogQHBhcmFtIG1hcHBpbmdCdWlsZGVyIFRoZSBidWlsZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB7QGxpbmsgSU1hcHBpbmd9IHdyYXBwaW5nCi0JICogYSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBvciBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBKcGFNYW5hZ2VkVHlwZVByb3ZpZGVyKEpwYVByb2plY3QganBhUHJvamVjdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW50VHlwZUNvbnRhaW5lciBwZXJzaXN0ZW50VHlwZUNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTWFwcGluZ0J1aWxkZXI8QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0J1aWxkZXIpIHsKLQotCQlzdXBlcigpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLm1hcHBpbmdCdWlsZGVyID0gbWFwcGluZ0J1aWxkZXI7Ci0JCXRoaXMucGVyc2lzdGVudFR5cGVDb250YWluZXIgPSBwZXJzaXN0ZW50VHlwZUNvbnRhaW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1hbmFnZWRUeXBlIGJ1aWxkTWFuYWdlZFR5cGUoUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUpIHsKLQotCQlUeXBlTWFwcGluZyBtYXBwZWRDbGFzcyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlpZiAobWFwcGVkQ2xhc3MgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCUpwYUVudGl0eSBlbnRpdHkgPSBuZXcgSnBhRW50aXR5KHRoaXMsIChFbnRpdHkpIG1hcHBlZENsYXNzLCBtYXBwaW5nQnVpbGRlcik7Ci0JCQllbnRpdGllcy5hZGQoZW50aXR5KTsKLQkJCXJldHVybiBlbnRpdHk7Ci0JCX0KLQotCQlpZiAobWFwcGVkQ2xhc3MgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCQlKcGFNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBuZXcgSnBhTWFwcGVkU3VwZXJjbGFzcyh0aGlzLCAoTWFwcGVkU3VwZXJjbGFzcykgbWFwcGVkQ2xhc3MsIG1hcHBpbmdCdWlsZGVyKTsKLQkJCW1hcHBlZFN1cGVyY2xhc3Nlcy5hZGQobWFwcGVkU3VwZXJjbGFzcyk7Ci0JCQlyZXR1cm4gbWFwcGVkU3VwZXJjbGFzczsKLQkJfQotCi0JCWlmIChtYXBwZWRDbGFzcyBpbnN0YW5jZW9mIEVtYmVkZGFibGUpIHsKLQkJCUpwYUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IG5ldyBKcGFFbWJlZGRhYmxlKHRoaXMsIChFbWJlZGRhYmxlKSBtYXBwZWRDbGFzcywgbWFwcGluZ0J1aWxkZXIpOwotCQkJZW1iZWRkYWJsZXMuYWRkKGVtYmVkZGFibGUpOwotCQkJcmV0dXJuIGVtYmVkZGFibGU7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEpwYU51bGxNYW5hZ2VkVHlwZSh0aGlzLCBtYXBwZWRDbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIElNYW5hZ2VkVHlwZT4gYnVpbGRNYW5hZ2VkVHlwZXMoKSB7Ci0KLQkJTWFwPFN0cmluZywgSU1hbmFnZWRUeXBlPiBtYW5hZ2VkVHlwZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElNYW5hZ2VkVHlwZT4oKTsKLQotCQlmb3IgKFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlIDogZ2V0UGVyc2lzdGVudFR5cGVDb250YWluZXIoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKSkgewotCi0JCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKTsKLQotCQkJCS8vIElmIHRoZSBwZXJzaXN0ZW50IHR5cGUgaXMgdGhlIG92ZXJyaWRkZW4gKGFubm90YXRpb24pIG9uZSBhbmQgdGhlIE9STQotCQkJCS8vIG9uZSBpcyBhbHJlYWR5IGFkZGVkLCB0aGVuIGRvbid0IG92ZXJyaWRlIHRoZSBPUk0gb25lCi0JCQkJaWYgKG1hbmFnZWRUeXBlcy5jb250YWluc0tleShuYW1lKSAmJiBwZXJzaXN0ZW50VHlwZS5nZXRPdmVycmlkZGVuUGVyc2lzdGVudFR5cGUoKSA9PSBudWxsKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCW1hbmFnZWRUeXBlcy5wdXQobmFtZSwgYnVpbGRNYW5hZ2VkVHlwZShwZXJzaXN0ZW50VHlwZSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1hbmFnZWRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEl0ZXJhYmxlSXRlcmF0b3I8SUVudGl0eT4gZW50aXRpZXMoKSB7Ci0JCWluaXRpYWxpemVNYW5hZ2VkVHlwZXMoKTsKLQkJcmV0dXJuIG5ldyBDbG9uZUl0ZXJhdG9yPElFbnRpdHk+KGVudGl0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElFbWJlZGRhYmxlIGdldEVtYmVkZGFibGUoSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gZ2V0RW1iZWRkYWJsZSh0eXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJRW1iZWRkYWJsZSBnZXRFbWJlZGRhYmxlKFN0cmluZyB0eXBlTmFtZSkgewotCQlyZXR1cm4gZ2V0TWFuYWdlZFR5cGUoZW1iZWRkYWJsZXMsIHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElFbnRpdHkgZ2V0RW50aXR5KElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIGdldEVudGl0eSh0eXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJRW50aXR5IGdldEVudGl0eShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIGdldE1hbmFnZWRUeXBlKGVudGl0aWVzLCB0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJRW50aXR5IGdldEVudGl0eU5hbWVkKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0KLQkJaW5pdGlhbGl6ZU1hbmFnZWRUeXBlcygpOwotCi0JCWZvciAoSUVudGl0eSBlbnRpdHkgOiBlbnRpdGllcykgewotCQkJaWYgKGVudGl0eS5nZXROYW1lKCkuZXF1YWxzKGVudGl0eU5hbWUpKSB7Ci0JCQkJcmV0dXJuIGVudGl0eTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCA8VCBleHRlbmRzIElNYW5hZ2VkVHlwZT4gVCBnZXRNYW5hZ2VkVHlwZShDb2xsZWN0aW9uPFQ+IG1hbmFnZWRUeXBlcywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHR5cGVOYW1lKSB7Ci0KLQkJaW5pdGlhbGl6ZU1hbmFnZWRUeXBlcygpOwotCi0JCWZvciAoVCBtYW5hZ2VkVHlwZSA6IG1hbmFnZWRUeXBlcykgewotCQkJaWYgKG1hbmFnZWRUeXBlLmdldFR5cGUoKS5nZXROYW1lKCkuZXF1YWxzKHR5cGVOYW1lKSkgewotCQkJCXJldHVybiBtYW5hZ2VkVHlwZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSU1hbmFnZWRUeXBlIGdldE1hbmFnZWRUeXBlKElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIGdldE1hbmFnZWRUeXBlKHR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElNYW5hZ2VkVHlwZSBnZXRNYW5hZ2VkVHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJcmV0dXJuIGdldE1hbmFnZWRUeXBlKG1hbmFnZWRUeXBlcy52YWx1ZXMoKSwgdHlwZU5hbWUpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSU1hcHBlZFN1cGVyY2xhc3MgZ2V0TWFwcGVkU3VwZXJjbGFzcyhJVHlwZSB0eXBlKSB7Ci0JCXJldHVybiBnZXRNYXBwZWRTdXBlcmNsYXNzKHR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElNYXBwZWRTdXBlcmNsYXNzIGdldE1hcHBlZFN1cGVyY2xhc3MoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXJldHVybiBnZXRNYW5hZ2VkVHlwZShtYXBwZWRTdXBlcmNsYXNzZXMsIHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250YWluZXIgb2YgbWFuYWdlZCB0eXBlcy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiBtYW5hZ2VkIHR5cGVzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyIGdldFBlcnNpc3RlbnRUeXBlQ29udGFpbmVyKCkgewotCQlyZXR1cm4gcGVyc2lzdGVudFR5cGVDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jYXBzdWxhdGVkIHtAbGluayBQZXJzaXN0ZW50VHlwZX0sIHdoaWNoIGlzIHRoZSBhY3R1YWwgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgZGVzaWduLXRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSBtYW5hZ2VkIHR5cGUgcHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgUGVyc2lzdGVudFR5cGVDb250YWluZXIgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwZXJzaXN0ZW50VHlwZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEpwYVR5cGVSZXBvc2l0b3J5IGdldFR5cGVSZXBvc2l0b3J5KCkgewotCQlpZiAodHlwZVJlcG9zaXRvcnkgPT0gbnVsbCkgewotCQkJdHlwZVJlcG9zaXRvcnkgPSBuZXcgSnBhVHlwZVJlcG9zaXRvcnkoanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpKTsKLQkJfQotCQlyZXR1cm4gdHlwZVJlcG9zaXRvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbmFnZWRUeXBlcygpIHsKLQkJaWYgKG1hbmFnZWRUeXBlcyA9PSBudWxsKSB7Ci0JCQl0aGlzLmVudGl0aWVzICAgICAgICAgICA9IG5ldyBMaW5rZWRMaXN0PElFbnRpdHk+KCk7Ci0JCQl0aGlzLmVtYmVkZGFibGVzICAgICAgICA9IG5ldyBMaW5rZWRMaXN0PElFbWJlZGRhYmxlPigpOwotCQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzZXMgPSBuZXcgTGlua2VkTGlzdDxJTWFwcGVkU3VwZXJjbGFzcz4oKTsKLQkJCXRoaXMubWFuYWdlZFR5cGVzICAgICAgID0gYnVpbGRNYW5hZ2VkVHlwZXMoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGVJdGVyYXRvcjxJTWFuYWdlZFR5cGU+IG1hbmFnZWRUeXBlcygpIHsKLQkJaW5pdGlhbGl6ZU1hbmFnZWRUeXBlcygpOwotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SU1hbmFnZWRUeXBlPihtYW5hZ2VkVHlwZXMudmFsdWVzKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFNYXBwZWRTdXBlcmNsYXNzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFNYXBwZWRTdXBlcmNsYXNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MTg3Y2QuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvSnBhTWFwcGVkU3VwZXJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ0J1aWxkZXI7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTWFwcGVkU3VwZXJjbGFzc30gdGhhdCBpcyB3cmFwcGluZyB0aGUgZGVzaWduLXRpbWUKLSAqIHJlcHJlc2VudGF0aW9uIG9mIGEgSlBBIG1hcHBlZCBzdXBlcmNsYXNzLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGNsYXNzIEpwYU1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBKcGFNYW5hZ2VkVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJTWFwcGVkU3VwZXJjbGFzcyB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYU1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciBvZiBKUEEgbWFuYWdlZCB0eXBlcwotCSAqIEBwYXJhbSBtYXBwZWRTdXBlcmNsYXNzIFRoZSBkZXNpZ24tdGltZSBtb2RlbCBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIGNsYXNzCi0JICogQHBhcmFtIG1hcHBpbmdCdWlsZGVyIFRoZSBidWlsZGVyIHRoYXQgaXMgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSB7QGxpbmsgSU1hcHBpbmd9IHdyYXBwaW5nCi0JICogYSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBvciBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBKcGFNYXBwZWRTdXBlcmNsYXNzKEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIElNYXBwaW5nQnVpbGRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nQnVpbGRlcikgewotCi0JCXN1cGVyKHByb3ZpZGVyLCBtYXBwZWRTdXBlcmNsYXNzLCBtYXBwaW5nQnVpbGRlcik7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIGFjY2VwdChJTWFuYWdlZFR5cGVWaXNpdG9yIHZpc2l0b3IpIHsKLQkJdmlzaXRvci52aXNpdCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1hcHBlZFN1cGVyY2xhc3MgZ2V0TWFuYWdlZFR5cGUoKSB7Ci0JCXJldHVybiAoTWFwcGVkU3VwZXJjbGFzcykgc3VwZXIuZ2V0TWFuYWdlZFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFR5cGUoKS5nZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNTMxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFuYWdlZFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGVSZXBvc2l0b3J5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ1R5cGUuKjsKLQotLyoqCi0gKiBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNYXBwaW5nfSB0aGF0IGlzIHdyYXBwaW5nIHRoZSBkZXNpZ24tdGltZSByZXByZXNlbnRhdGlvbgotICogb2YgYSBtYXBwaW5nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyIGRldmVsb3BtZW50IGFuZAotICogZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UKLSAqIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMKLSAqIEFQSSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnBhTWFwcGluZyBpbXBsZW1lbnRzIElNYXBwaW5nIHsKLQotCS8qKgotCSAqIFRoZSBkZXNpZ24tdGltZSB7QGxpbmsgQXR0cmlidXRlTWFwcGluZ30gd3JhcHBlZCBieSB0aGlzIGNsYXNzLgotCSAqLwotCXByaXZhdGUgZmluYWwgQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nOwotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIGFjdHVhbCBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgaW50IG1hcHBpbmdUeXBlOwotCi0JLyoqCi0JICogVGhlIHBhcmVudCBvZiB0aGlzIG1hcHBpbmcuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJTWFuYWdlZFR5cGUgcGFyZW50OwotCi0JLyoqCi0JICogVGhlIHtAbGluayBJVHlwZX0gb2YgdGhlIHByb3BlcnR5IHJlcHJlc2VudGVkIGJ5IHRoZSBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgSVR5cGUgdHlwZTsKLQotCS8qKgotCSAqIFRoZSB7QGxpbmsgSVR5cGVEZWNsYXJhdGlvbn0gb2YgdGhlIHByb3BlcnR5IHJlcHJlc2VudGVkIGJ5IHRoZSBtYXBwaW5nLgotCSAqLwotCXByaXZhdGUgSVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IG9mIHRoaXMgbWFwcGluZwotCSAqIEBwYXJhbSBtYXBwaW5nIFRoZSBkZXNpZ24tdGltZSB7QGxpbmsgQXR0cmlidXRlTWFwcGluZ30gd3JhcHBlZCBieSB0aGlzIGNsYXNzCi0JICovCi0JcHJvdGVjdGVkIEpwYU1hcHBpbmcoSU1hbmFnZWRUeXBlIHBhcmVudCwgQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucGFyZW50ICAgICAgPSBwYXJlbnQ7Ci0JCXRoaXMubWFwcGluZyAgICAgPSBtYXBwaW5nOwotCQl0aGlzLm1hcHBpbmdUeXBlID0gLTE7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlRGVjbGFyYXRpb25bXSBidWlsZEdlbmVyaWNUeXBlRGVjbGFyYXRpb25zKCkgewotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZSA9IGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCUxpc3Q8SVR5cGVEZWNsYXJhdGlvbj4gZGVjbGFyYXRpb25zID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoYnVpbGRHZW5lcmljVHlwZURlY2xhcmF0aW9ucyhyZXNvdXJjZSkpOwotCQlyZXR1cm4gZGVjbGFyYXRpb25zLnRvQXJyYXkobmV3IElUeXBlRGVjbGFyYXRpb25bZGVjbGFyYXRpb25zLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJdGVyYWJsZTxJVHlwZURlY2xhcmF0aW9uPiBidWlsZEdlbmVyaWNUeXBlRGVjbGFyYXRpb25zKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZSkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8U3RyaW5nLCBJVHlwZURlY2xhcmF0aW9uPihyZXNvdXJjZS5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVR5cGVEZWNsYXJhdGlvbiB0cmFuc2Zvcm0oU3RyaW5nIG5leHQpIHsKLQkJCQlyZXR1cm4gZ2V0VHlwZVJlcG9zaXRvcnkoKS5nZXRUeXBlKG5leHQpLmdldFR5cGVEZWNsYXJhdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBJVHlwZSBidWlsZFR5cGUoKSB7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwcm9wZXJ0eSA9IG1hcHBpbmcuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSBwcm9wZXJ0eS5nZXRUeXBlTmFtZSgpOwotCi0JCS8vIFRoZSBhdHRyaWJ1dGUgY291bGQgYmUgdmlydHVhbCwgaW5jb3JyZWN0bHkgc3BlY2lmaWVkIGluIHRoZSBvcm0ueG1sCi0JCWlmICh0eXBlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VHlwZVJlcG9zaXRvcnkoKS5nZXRUeXBlSGVscGVyKCkudW5rbm93blR5cGUoKTsKLQkJfQotCi0JCXJldHVybiBnZXRUeXBlUmVwb3NpdG9yeSgpLmdldFR5cGUodHlwZU5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZURlY2xhcmF0aW9uIGJ1aWxkVHlwZURlY2xhcmF0aW9uKCkgewotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcHJvcGVydHkgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gcHJvcGVydHkuZ2V0VHlwZU5hbWUoKTsKLQotCQkvLyBUaGUgYXR0cmlidXRlIGNvdWxkIGJlIHZpcnR1YWwsIGluY29ycmVjdGx5IHNwZWNpZmllZCBpbiB0aGUgb3JtLnhtbAotCQlpZiAodHlwZU5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFR5cGVSZXBvc2l0b3J5KCkuZ2V0VHlwZUhlbHBlcigpLnVua25vd25UeXBlRGVjbGFyYXRpb24oKTsKLQkJfQotCi0JCWJvb2xlYW4gYXJyYXkgPSB0eXBlTmFtZS5lbmRzV2l0aCgiW10iKTsKLQkJaW50IGRpbWVuc2lvbmFsaXR5ID0gMDsKLQotCQlpZiAoYXJyYXkpIHsKLQkJCWRpbWVuc2lvbmFsaXR5ID0gZ2V0VHlwZSgpLmdldFR5cGVEZWNsYXJhdGlvbigpLmdldERpbWVuc2lvbmFsaXR5KCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IEpwYVR5cGVEZWNsYXJhdGlvbigKLQkJCWdldFR5cGUoKSwKLQkJCWJ1aWxkR2VuZXJpY1R5cGVEZWNsYXJhdGlvbnMoKSwKLQkJCWRpbWVuc2lvbmFsaXR5Ci0JCSk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgdHlwZSBvZiB0aGUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBleHRlcm5hbCBmb3JtLgotCSAqCi0JICogQHJldHVybiBUaGUgbWFwcGluZyB0eXBlLCB3aGljaCBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkIGluIHtAbGluayBvcmcuZWNsaXBzZS4KLQkgKiBwZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hcHBpbmdUeXBlIElNYXBwaW5nVHlwZX0gd2hlbiB0aGUgcHJvdmlkZXIgaXMgZ2VuZXJpYyBKUEEKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNhbGN1bGF0ZU1hcHBpbmdUeXBlKCkgewotCi0JCVN0cmluZyB0eXBlID0gbWFwcGluZy5nZXRLZXkoKTsKLQotCQkvLyBCYXNpYwotCQlpZiAodHlwZSA9PSBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiBCQVNJQzsKLQkJfQotCi0JCS8vIEVtYmVkZGVkCi0JCWlmICh0eXBlID09IE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIEVNQkVEREVEOwotCQl9Ci0KLQkJLy8gRW1iZWRkZWQgSWQKLQkJaWYgKHR5cGUgPT0gTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gRU1CRURERURfSUQ7Ci0JCX0KLQotCQkvLyBJZAotCQlpZiAodHlwZSA9PSBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiBJRDsKLQkJfQotCi0JCS8vIE06TQotCQlpZiAodHlwZSA9PSBNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gTUFOWV9UT19NQU5ZOwotCQl9Ci0KLQkJLy8gMTpNCi0JCWlmICh0eXBlID09IE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIE9ORV9UT19NQU5ZOwotCQl9Ci0KLQkJLy8gTToxCi0JCWlmICh0eXBlID09IE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJcmV0dXJuIE1BTllfVE9fT05FOwotCQl9Ci0KLQkJLy8gMToxCi0JCWlmICh0eXBlID09IE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSB7Ci0JCQlyZXR1cm4gT05FX1RPX09ORTsKLQkJfQotCi0JCS8vIFZlcnNpb24KLQkJaWYgKHR5cGUgPT0gTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiBWRVJTSU9OOwotCQl9Ci0KLQkJLy8gRWxlbWVudCBDb2xsZWN0aW9uCi0JCWlmICh0eXBlID09IE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpIHsKLQkJCXJldHVybiBFTEVNRU5UX0NPTExFQ1RJT047Ci0JCX0KLQotCQlyZXR1cm4gVFJBTlNJRU5UOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhJTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXJldHVybiBnZXROYW1lKCkuY29tcGFyZVRvKG1hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZU1hcHBpbmcgZ2V0TWFwcGluZygpIHsKLQkJcmV0dXJuIG1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWFwcGluZ1R5cGUoKSB7Ci0JCWlmIChtYXBwaW5nVHlwZSA9PSAtMSkgewotCQkJZ2V0VHlwZURlY2xhcmF0aW9uKCk7Ci0JCQltYXBwaW5nVHlwZSA9IGNhbGN1bGF0ZU1hcHBpbmdUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIG1hcHBpbmdUeXBlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBtYXBwaW5nLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElNYW5hZ2VkVHlwZSBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJVHlwZSBnZXRUeXBlKCkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gYnVpbGRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJVHlwZURlY2xhcmF0aW9uIGdldFR5cGVEZWNsYXJhdGlvbigpIHsKLQkJaWYgKHR5cGVEZWNsYXJhdGlvbiA9PSBudWxsKSB7Ci0JCQl0eXBlRGVjbGFyYXRpb24gPSBidWlsZFR5cGVEZWNsYXJhdGlvbigpOwotCQl9Ci0JCXJldHVybiB0eXBlRGVjbGFyYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlUmVwb3NpdG9yeSBnZXRUeXBlUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIHBhcmVudC5nZXRQcm92aWRlcigpLmdldFR5cGVSZXBvc2l0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Fubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKSB7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBtYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCXJldHVybiBhdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZS5nZXROYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29sbGVjdGlvbigpIHsKLQkJc3dpdGNoIChnZXRNYXBwaW5nVHlwZSgpKSB7Ci0JCQljYXNlIEVMRU1FTlRfQ09MTEVDVElPTjoKLQkJCWNhc2UgTUFOWV9UT19NQU5ZOgotCQkJY2FzZSBPTkVfVE9fTUFOWTogcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0OiAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eSgpIHsKLQkJc3dpdGNoIChnZXRNYXBwaW5nVHlwZSgpKSB7Ci0JCQljYXNlIEJBU0lDOgotCQkJY2FzZSBJRDoKLQkJCWNhc2UgVkVSU0lPTjogcmV0dXJuIHRydWU7Ci0JCQlkZWZhdWx0OiAgICAgIHJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uc2hpcCgpIHsKLQkJc3dpdGNoIChnZXRNYXBwaW5nVHlwZSgpKSB7Ci0JCQljYXNlIEVMRU1FTlRfQ09MTEVDVElPTjoKLQkJCWNhc2UgRU1CRURERURfSUQ6Ci0JCQljYXNlIE1BTllfVE9fTUFOWToKLQkJCWNhc2UgTUFOWV9UT19PTkU6Ci0JCQljYXNlIE9ORV9UT19NQU5ZOgotCQkJY2FzZSBPTkVfVE9fT05FOiByZXR1cm4gdHJ1ZTsKLQkJCWRlZmF1bHQ6ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVHJhbnNpZW50KCkgewotCQlyZXR1cm4gZ2V0TWFwcGluZ1R5cGUoKSA9PSBUUkFOU0lFTlQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlTdHJpbmdUb29scy5hcHBlbmRTaW1wbGVUb1N0cmluZyhzYiwgdGhpcyk7Ci0JCXNiLmFwcGVuZCgiLCBuYW1lPSIpOwotCQlzYi5hcHBlbmQoZ2V0TmFtZSgpKTsKLQkJc2IuYXBwZW5kKCIsIG1hcHBpbmdUeXBlPSIpOwotCQlzYi5hcHBlbmQoZ2V0TWFwcGluZ1R5cGUoKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFOdWxsTWFuYWdlZFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYU51bGxNYW5hZ2VkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjI3MjYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYU51bGxNYW5hZ2VkVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hbmFnZWRUeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYW5hZ2VkVHlwZVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC51dGlsLml0ZXJhdG9yLkl0ZXJhYmxlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwudXRpbC5pdGVyYXRvci5OdWxsSXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJTWFuYWdlZFR5cGV9IHRoYXQgaXMgd3JhcHBpbmcgdGhlIGRlc2lnbi10aW1lCi0gKiByZXByZXNlbnRhdGlvbiBhICJudWxsIiBtYW5hZ2VkIHR5cGUuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgSnBhTnVsbE1hbmFnZWRUeXBlIGltcGxlbWVudHMgSU1hbmFnZWRUeXBlIHsKLQotCS8qKgotCSAqIFRoZSBwcm92aWRlciBvZiBKUEEgbWFuYWdlZCB0eXBlcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIEpwYU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHtAbGluayBJVHlwZX0gb2YgdGhpcyAibnVsbCIgbWFuYWdlZCB0eXBlLgotCSAqLwotCXByaXZhdGUgSVR5cGUgdHlwZTsKLQotCS8qKgotCSAqIFRoZSBkZXNpZ24tdGltZSBtb2RlbCBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIGNsYXNzLgotCSAqLwotCXByaXZhdGUgZmluYWwgVHlwZU1hcHBpbmcgdHlwZU1hcHBpbmc7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYU51bGxNYW5hZ2VkVHlwZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbWFuYWdlZFR5cGUgVGhlIHByb3ZpZGVyIG9mIEpQQSBtYW5hZ2VkIHR5cGVzCi0JICogQHBhcmFtIHR5cGVNYXBwaW5nIFRoZSBkZXNpZ24tdGltZSBtb2RlbCBvYmplY3Qgd3JhcHBlZCBieSB0aGlzIGNsYXNzCi0JICovCi0JcHVibGljIEpwYU51bGxNYW5hZ2VkVHlwZShKcGFNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyLCBUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQlzdXBlcigpOwotCQl0aGlzLnByb3ZpZGVyICAgID0gcHJvdmlkZXI7Ci0JCXRoaXMudHlwZU1hcHBpbmcgPSB0eXBlTWFwcGluZzsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0KElNYW5hZ2VkVHlwZVZpc2l0b3IgdmlzaXRvcikgewotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhJTWFuYWdlZFR5cGUgbWFuYWdlZFR5cGUpIHsKLQkJcmV0dXJuIGdldFR5cGUoKS5nZXROYW1lKCkuY29tcGFyZVRvKG1hbmFnZWRUeXBlLmdldFR5cGUoKS5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSU1hcHBpbmcgZ2V0TWFwcGluZ05hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSU1hbmFnZWRUeXBlUHJvdmlkZXIgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBwcm92aWRlci5nZXRUeXBlUmVwb3NpdG9yeSgpLmdldFR5cGUodHlwZU1hcHBpbmcuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSXRlcmFibGVJdGVyYXRvcjxJTWFwcGluZz4gbWFwcGluZ3MoKSB7Ci0JCXJldHVybiBOdWxsSXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFR5cGUoKS5nZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDFmNzExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSU1hbmFnZWRUeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklRdWVyeTsKLQotLyoqCi0gKiBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElRdWVyeX0gdGhhdCBpcyB3cmFwcGluZyB0aGUgZGVzaWduLXRpbWUgcmVwcmVzZW50YXRpb24KLSAqIG9mIGEgSlBRTCBxdWVyeS4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYVF1ZXJ5IGltcGxlbWVudHMgSVF1ZXJ5IHsKLQotCS8qKgotCSAqIFRoZSBhY3R1YWwgSlBRTCBxdWVyeSwgd2hpY2ggY2FuIGRpZmZlciBmcm9tIHRoZSBvbmUgb3duZWQgYnkgdGhlIG1vZGVsIG9iamVjdCwgd2hpY2ggaGFwcGVucwotCSAqIHdoZW4gdGhlIG1vZGVsIGlzIG91dCBvZiBzeW5jIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgeWV0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGFjdHVhbFF1ZXJ5OwotCi0JLyoqCi0JICogIFRoZSBwcm92aWRlciBvZiBtYW5hZ2VkIHR5cGVzLgotCSAqLwotCXByaXZhdGUgSU1hbmFnZWRUeXBlUHJvdmlkZXIgcHJvdmlkZXI7Ci0KLQkvKioKLQkgKiBUaGUgbW9kZWwgb2JqZWN0IGhvbGRpbmcgb250byB0aGUgSlBRTCBxdWVyeS4KLQkgKi8KLQlwcml2YXRlIE5hbWVkUXVlcnkgcXVlcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYVF1ZXJ5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgb2YgbWFuYWdlZCB0eXBlcwotCSAqIEBwYXJhbSBxdWVyeSBUaGUgbW9kZWwgb2JqZWN0IG9mIHRoZSBKUFFMIHF1ZXJ5Ci0JICovCi0JcHVibGljIEpwYVF1ZXJ5KElNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyLCBOYW1lZFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXRoaXMocHJvdmlkZXIsIHF1ZXJ5LCBxdWVyeS5nZXRRdWVyeSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYVF1ZXJ5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgb2YgbWFuYWdlZCB0eXBlcwotCSAqIEBwYXJhbSBxdWVyeSBUaGUgbW9kZWwgb2JqZWN0IG9mIHRoZSBKUFFMIHF1ZXJ5Ci0JICogQHBhcmFtIGFjdHVhbFF1ZXJ5IFRoZSBhY3R1YWwgSlBRTCBxdWVyeSwgd2hpY2ggY2FuIGRpZmZlciBmcm9tIHRoZSBvbmUgb3duZWQgYnkgdGhlIG1vZGVsCi0JICogb2JqZWN0LCB3aGljaCBoYXBwZW5zIHdoZW4gdGhlIG1vZGVsIGlzIG91dCBvZiBzeW5jIGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgeWV0Ci0JICovCi0JcHVibGljIEpwYVF1ZXJ5KElNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyLCBOYW1lZFF1ZXJ5IHF1ZXJ5LCBTdHJpbmcgYWN0dWFsUXVlcnkpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdGlhbGl6ZShwcm92aWRlciwgcXVlcnksIGFjdHVhbFF1ZXJ5KTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeHByZXNzaW9uKCkgewotCQlyZXR1cm4gYWN0dWFsUXVlcnk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJTWFuYWdlZFR5cGVQcm92aWRlciBnZXRQcm92aWRlcigpIHsKLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuY2Fwc3VsYXRlZCB7QGxpbmsgTmFtZWRRdWVyeX0sIHdoaWNoIGlzIHRoZSBhY3R1YWwgb2JqZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgZGVzaWduLXRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSBKUFFMIHF1ZXJ5Ci0JICovCi0JcHJvdGVjdGVkIE5hbWVkUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiBxdWVyeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKElNYW5hZ2VkVHlwZVByb3ZpZGVyIHByb3ZpZGVyLCBOYW1lZFF1ZXJ5IHF1ZXJ5LCBTdHJpbmcgYWN0dWFsUXVlcnkpIHsKLQotCQl0aGlzLnF1ZXJ5ICAgICAgID0gcXVlcnk7Ci0JCXRoaXMucHJvdmlkZXIgICAgPSBwcm92aWRlcjsKLQkJdGhpcy5hY3R1YWxRdWVyeSA9IGFjdHVhbFF1ZXJ5OwotCi0JCWlmICh0aGlzLmFjdHVhbFF1ZXJ5ID09IG51bGwpIHsKLQkJCXRoaXMuYWN0dWFsUXVlcnkgPSBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkc7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJc2IuYXBwZW5kKCIsIHF1ZXJ5PSIpOwotCQlzYi5hcHBlbmQoZ2V0RXhwcmVzc2lvbigpKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkzYmI4MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkZsYWdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlSGllcmFyY2h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQWJzdHJhY3RUeXBlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFub255bW91c0NsYXNzRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNsYXNzSW5zdGFuY2VDcmVhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5FbnVtQ29uc3RhbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uSU1ldGhvZEJpbmRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklUeXBlQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uTm9kZUZpbmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkV4cHJlc3Npb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSUNvbnN0cnVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnV0aWwuaXRlcmF0b3IuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC51dGlsLml0ZXJhdG9yLkl0ZXJhYmxlSXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEucXVlcnkuc3BpLklUeXBlIElUeXBlfSB0aGF0IGlzCi0gKiB3cmFwcGluZyB0aGUgZGVzaWduLXRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSBKYXZhIHR5cGUuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgSnBhVHlwZSBpbXBsZW1lbnRzIElKcGFUeXBlIHsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgY29sbGVjdGlvbiBvZiB7QGxpbmsgSUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yc30uCi0JICovCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPElDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgbmFtZXMgZm9yIHRoZSB7QGxpbmsgRW51bX0ncyBjb25zdGFudHMgb3RoZXJ3aXNlIGFuIGVtcHR5IGFycmF5LgotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZW51bUNvbnN0YW50czsKLQotCS8qKgotCSAqIFRoZSBkZXNpZ24tdGltZSByZXByZXNlbnRhdGlvbiBvZiBhIEphdmEgdHlwZS4KLQkgKi8KLQlwcml2YXRlIElUeXBlIHR5cGU7Ci0KLQkvKioKLQkgKiBUaGUge0BsaW5rIElUeXBlQmluZGluZ30gZm9yIHRoZSB0eXBlLCB3aGljaCBpcyB0aGUgaW5mb3JtYXRpb24gdGhhdCB3YXMgcmVzb2x2ZWQgYW5kIHdoaWNoCi0JICogY2FuIGJlIHVzZWQgdG8gcXVlcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCB0eXBlLgotCSAqLwotCXByaXZhdGUgSVR5cGVCaW5kaW5nIHR5cGVCaW5kaW5nOwotCi0JLyoqCi0JICogVGhpcyBmbGFnIG1ha2VzIHN1cmUgdG8gbm90IHRyeSBtb3JlIHRoYW4gb25jZSByZXNvbHZpbmcgdGhlIHtAbGluayBJVHlwZUJpbmRpbmd9IGlmIGl0IGZhaWxzCi0JICogdGhlIGZpcnN0IHRpbWUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHR5cGVCaW5kaW5nUmVzb2x2ZWQ7Ci0KLQkvKioKLQkgKiBDYWNoZXMgdGhlIHR5cGUgaGllcmFyY2h5IG9mIHRoZSB7QGxpbmsgSVR5cGV9IGluIG9yZGVyIHRvIHByZXZlbnQgcmVidWlsZGluZyBpdCBlYWNoIHRpbWUuCi0JICovCi0JcHJpdmF0ZSBJVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbjsKLQotCS8qKgotCSAqIENhY2hlcyB0aGUgdHlwZSBoaWVyYXJjaHkgb2YgdGhlIHtAbGluayBJVHlwZX0gaW4gb3JkZXIgdG8gcHJldmVudCByZWJ1aWxkaW5nIGl0IGVhY2ggdGltZQotCSAqIHtAbGluayAjaXNBc3NpZ25hYmxlVG8ob3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLnF1ZXJ5LnNwaS5JVHlwZSl9IGlzIGNhbGxlZC4KLQkgKi8KLQlwcml2YXRlIElUeXBlSGllcmFyY2h5IHR5cGVIaWVyYXJjaHk7Ci0KLQkvKioKLQkgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlTmFtZTsKLQotCS8qKgotCSAqIFRoZSBleHRlcm5hbCBmb3JtIG9mIGEgdHlwZSByZXBvc2l0b3J5LgotCSAqLwotCXByaXZhdGUgZmluYWwgSnBhVHlwZVJlcG9zaXRvcnkgdHlwZVJlcG9zaXRvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYVR5cGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHR5cGVSZXBvc2l0b3J5IFRoZSBleHRlcm5hbCBmb3JtIG9mIGEgdHlwZSByZXBvc2l0b3J5Ci0JICogQHBhcmFtIHR5cGUgVGhlIGRlc2lnbi10aW1lIHJlcHJlc2VudGF0aW9uIG9mIGEgSmF2YSB0eXBlCi0JICovCi0JcHVibGljIEpwYVR5cGUoSnBhVHlwZVJlcG9zaXRvcnkgdHlwZVJlcG9zaXRvcnksIElUeXBlIHR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy50eXBlICAgICAgICAgICA9IHR5cGU7Ci0JCXRoaXMudHlwZU5hbWUgICAgICAgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQl0aGlzLnR5cGVSZXBvc2l0b3J5ID0gdHlwZVJlcG9zaXRvcnk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBpbGF0aW9uVW5pdCBidWlsZENvbXBpbGF0aW9uVW5pdCgpIHsKLQotCQlBU1RQYXJzZXIgcGFyc2VyID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCXBhcnNlci5zZXRTb3VyY2UodHlwZS5nZXRUeXBlUm9vdCgpKTsKLQkJcGFyc2VyLnNldElnbm9yZU1ldGhvZEJvZGllcyh0cnVlKTsKLQkJcGFyc2VyLnNldFJlc29sdmVCaW5kaW5ncyh0cnVlKTsKLQkJcGFyc2VyLnNldEJpbmRpbmdzUmVjb3ZlcnkodHJ1ZSk7Ci0KLQkJcmV0dXJuIChDb21waWxhdGlvblVuaXQpIHBhcnNlci5jcmVhdGVBU1QobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb248SUNvbnN0cnVjdG9yPiBidWlsZENvbnN0cnVjdG9ycygpIHsKLQotCQlJVHlwZUJpbmRpbmcgdHlwZUJpbmRpbmcgPSBnZXRUeXBlQmluZGluZygpOwotCi0JCS8vIE5vIEphdmEgc291cmNlIGlzIGF0dGFjaGVkIHRvIHRoZSBKYXZhIGNsYXNzIGZpbGUsIHBhcnNlIHRoZSBjbGFzcyB3aXRoIGEgcmVhZGVyCi0JCWlmICgodHlwZUJpbmRpbmcgPT0gbnVsbCkgJiYgdHlwZS5pc0JpbmFyeSgpKSB7Ci0JCQlDb2xsZWN0aW9uPElDb25zdHJ1Y3Rvcj4gY29uc3RydWN0b3JzID0gbmV3IEFycmF5TGlzdDxJQ29uc3RydWN0b3I+KCk7Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gUm9vdCB0eXBlcwotCQkJCWZvciAoSUphdmFFbGVtZW50IHJvb3RUeXBlIDogdHlwZS5nZXRUeXBlUm9vdCgpLmdldENoaWxkcmVuKCkpIHsKLQkJCQkJLy8gUm9vdCB0eXBlCi0JCQkJCWlmIChyb290VHlwZS5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5UWVBFKSB7Ci0JCQkJCQlmb3IgKElKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA6ICgoSVR5cGUpIHJvb3RUeXBlKS5nZXRDaGlsZHJlbigpKSB7Ci0JCQkJCQkJLy8gTWV0aG9kCi0JCQkJCQkJaWYgKGphdmFFbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50Lk1FVEhPRCkgewotCQkJCQkJCQlJTWV0aG9kIG1ldGhvZCA9IChJTWV0aG9kKSBqYXZhRWxlbWVudDsKLQkJCQkJCQkJLy8gQ29uc3RydWN0b3IKLQkJCQkJCQkJaWYgKG1ldGhvZC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQkJCQkJCWNvbnN0cnVjdG9ycy5hZGQobmV3IENsYXNzQ29uc3RydWN0b3IodGhpcywgbWV0aG9kKSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQotCQkJcmV0dXJuIGNvbnN0cnVjdG9yczsKLQkJfQotCQkvLyBVc2UgdGhlIElUeXBlQmluZGluZyB0byByZXRyaWV2ZSB0aGUgY29uc3RydWN0b3JzCi0JCWVsc2UgaWYgKHR5cGVCaW5kaW5nICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb248SUNvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMgPSBuZXcgQXJyYXlMaXN0PElDb25zdHJ1Y3Rvcj4oKTsKLQotCQkJZm9yIChJTWV0aG9kQmluZGluZyBtZXRob2QgOiB0eXBlQmluZGluZy5nZXREZWNsYXJlZE1ldGhvZHMoKSkgewotCQkJCWlmIChtZXRob2QuaXNDb25zdHJ1Y3RvcigpKSB7Ci0JCQkJCWNvbnN0cnVjdG9ycy5hZGQobmV3IEpwYUNvbnN0cnVjdG9yKHRoaXMsIG1ldGhvZCkpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGNvbnN0cnVjdG9yczsKLQkJfQotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gYnVpbGRFbnVtQ29uc3RhbnRzKCkgewotCi0JCXRyeSB7Ci0JCQkvLyBSZXRyaWV2ZSB0aGUgZW51bSBjb25zdGFudHMgZnJvbSBJVHlwZQotCQkJaWYgKHR5cGUuaXNFbnVtKCkpIHsKLQkJCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotCQkJCWZvciAoSUZpZWxkIGZpZWxkIDogdHlwZS5nZXRGaWVsZHMoKSkgewotCQkJCQlpZiAoZmllbGQuaXNFbnVtQ29uc3RhbnQoKSkgewotCQkJCQkJbmFtZXMuYWRkKGZpZWxkLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1tuYW1lcy5zaXplKCldKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEp1c3QgaWdub3JlIGFuZCByZXR1cm4gYW4gZW1wdHkgYXJyYXkKLQkJfQotCi0JCXJldHVybiBFeHByZXNzaW9uVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZOwotCX0KLQotCXByb3RlY3RlZCBJVHlwZUJpbmRpbmcgYnVpbGRUeXBlQmluZGluZygpIHsKLQotCQkvLyBUaGlzIGNvZGUgd2FzIGNvcGllZCBmcm9tIEFTVE5vZGVzLmdldFR5cGVCaW5kaW5nKENvbXBpbGF0aW9uVW5pdCwgSVR5cGUpCi0JCXRyeSB7Ci0JCQlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gYnVpbGRDb21waWxhdGlvblVuaXQoKTsKLQotCQkJaWYgKHR5cGUuaXNBbm9ueW1vdXMoKSkgewotCQkJCUlKYXZhRWxlbWVudCBwYXJlbnQgPSB0eXBlLmdldFBhcmVudCgpOwotCi0JCQkJaWYgKChwYXJlbnQgaW5zdGFuY2VvZiBJRmllbGQpICYmIEZsYWdzLmlzRW51bSgoKElNZW1iZXIpIHBhcmVudCkuZ2V0RmxhZ3MoKSkpIHsKLQkJCQkJQVNUTm9kZSBub2RlID0gTm9kZUZpbmRlci5wZXJmb3JtKGNvbXBpbGF0aW9uVW5pdCwgdHlwZS5nZXROYW1lUmFuZ2UoKSk7Ci0JCQkJCUVudW1Db25zdGFudERlY2xhcmF0aW9uIGNvbnN0YW50ID0gKEVudW1Db25zdGFudERlY2xhcmF0aW9uKSBub2RlOwotCi0JCQkJCWlmIChjb25zdGFudCAhPSBudWxsKSB7Ci0JCQkJCQlBbm9ueW1vdXNDbGFzc0RlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gY29uc3RhbnQuZ2V0QW5vbnltb3VzQ2xhc3NEZWNsYXJhdGlvbigpOwotCi0JCQkJCQlpZiAoZGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiBkZWNsYXJhdGlvbi5yZXNvbHZlQmluZGluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlBU1ROb2RlIG5vZGUgPSBOb2RlRmluZGVyLnBlcmZvcm0oY29tcGlsYXRpb25Vbml0LCB0eXBlLmdldE5hbWVSYW5nZSgpKTsKLQkJCQkJQ2xhc3NJbnN0YW5jZUNyZWF0aW9uIGNyZWF0aW9uID0gKENsYXNzSW5zdGFuY2VDcmVhdGlvbikgZ2V0UGFyZW50KG5vZGUsIENsYXNzSW5zdGFuY2VDcmVhdGlvbi5jbGFzcyk7Ci0KLQkJCQkJaWYgKGNyZWF0aW9uICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBjcmVhdGlvbi5yZXNvbHZlVHlwZUJpbmRpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUFTVE5vZGUgbm9kZSA9IE5vZGVGaW5kZXIucGVyZm9ybShjb21waWxhdGlvblVuaXQsIHR5cGUuZ2V0TmFtZVJhbmdlKCkpOwotCQkJCUFic3RyYWN0VHlwZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uKSBnZXRQYXJlbnQobm9kZSwgQWJzdHJhY3RUeXBlRGVjbGFyYXRpb24uY2xhc3MpOwotCi0JCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRlY2xhcmF0aW9uLnJlc29sdmVCaW5kaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2ltcGx5IGlnbm9yZQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlRGVjbGFyYXRpb24gYnVpbGRUeXBlRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgSnBhVHlwZURlY2xhcmF0aW9uKHRoaXMsIG5ldyBJVHlwZURlY2xhcmF0aW9uWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEl0ZXJhYmxlSXRlcmF0b3I8SUNvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMoKSB7Ci0JCWlmIChjb25zdHJ1Y3RvcnMgPT0gbnVsbCkgewotCQkJY29uc3RydWN0b3JzID0gYnVpbGRDb25zdHJ1Y3RvcnMoKTsKLQkJfQotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8SUNvbnN0cnVjdG9yPihjb25zdHJ1Y3RvcnMpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgewotCQlyZXR1cm4gZXF1YWxzKChvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGUpIG9iamVjdCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gKHRoaXMgPT0gdHlwZSkgfHwgdHlwZU5hbWUuZXF1YWxzKHR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW1Db25zdGFudHMoKSB7Ci0JCWlmIChlbnVtQ29uc3RhbnRzID09IG51bGwpIHsKLQkJCWVudW1Db25zdGFudHMgPSBidWlsZEVudW1Db25zdGFudHMoKTsKLQkJfQotCQlyZXR1cm4gZW51bUNvbnN0YW50czsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdHlwZU5hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIEFTVE5vZGUgZ2V0UGFyZW50KEFTVE5vZGUgbm9kZSwgQ2xhc3M8PyBleHRlbmRzIEFTVE5vZGU+IHBhcmVudENsYXNzKSB7Ci0KLQkJZG8gewotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJd2hpbGUgKChub2RlICE9IG51bGwpICYmICFwYXJlbnRDbGFzcy5pc0luc3RhbmNlKG5vZGUpKTsKLQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmNhcHN1bGF0ZWQge0BsaW5rIFR5cGV9LCB3aGljaCBpcyB0aGUgYWN0dWFsIHR5cGUuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBkZXNpZ24tdGltZSByZXByZXNlbnRhdGlvbiBvZiBhIEphdmEgdHlwZQotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVR5cGVCaW5kaW5nIGdldFR5cGVCaW5kaW5nKCkgewotCQlpZiAoKHR5cGVCaW5kaW5nID09IG51bGwpICYmICF0eXBlQmluZGluZ1Jlc29sdmVkKSB7Ci0JCQl0eXBlQmluZGluZyA9IGJ1aWxkVHlwZUJpbmRpbmcoKTsKLQkJCXR5cGVCaW5kaW5nUmVzb2x2ZWQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiB0eXBlQmluZGluZzsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKCkgewotCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpIHsKLQkJCXR5cGVEZWNsYXJhdGlvbiA9IGJ1aWxkVHlwZURlY2xhcmF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVEZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZXBvc2l0b3J5IHRoYXQgZ2l2ZXMgYWNjZXNzIHRvIHRoZSBhcHBsaWNhdGlvbidzIGNsYXNzZXMuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBleHRlcm5hbCBmb3JtIG9mIHRoZSB0eXBlIHJlcG9zaXRvcnkKLQkgKi8KLQlwcm90ZWN0ZWQgSnBhVHlwZVJlcG9zaXRvcnkgZ2V0VHlwZVJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiB0eXBlUmVwb3NpdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQW5ub3RhdGlvbihDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZS5nZXROYW1lKCkpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiB0eXBlTmFtZS5oYXNoQ29kZSgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Fzc2lnbmFibGVUbyhvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5zcGkuSVR5cGUgb3RoZXJUeXBlKSB7Ci0KLQkJaWYgKGVxdWFscyhvdGhlclR5cGUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCVN0cmluZyBvdGhlclR5cGVOYW1lID0gb3RoZXJUeXBlLmdldE5hbWUoKTsKLQotCQkvLyBUeXBlIGhpZXJhcmNoeSBmb3IgSmF2YSBjb21waWxlZCBjbGFzc2VzCi0JCUlUeXBlQmluZGluZyB0eXBlQmluZGluZyA9IGdldFR5cGVCaW5kaW5nKCk7Ci0KLQkJLy8gVHlwZSBoaWVyYXJjaHkgZm9yIENsYXNzIGZpbGVzCi0JCWlmICgodHlwZUJpbmRpbmcgPT0gbnVsbCkgJiYgdHlwZS5pc0JpbmFyeSgpKSB7Ci0KLQkJCS8vIEZpcnN0IGNyZWF0ZSB0aGUgdHlwZSBoaWVyYXJjaHkKLQkJCWlmICh0eXBlSGllcmFyY2h5ID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQl0eXBlSGllcmFyY2h5ID0gdHlwZS5uZXdTdXBlcnR5cGVIaWVyYXJjaHkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBOb3cgY2hlY2sgaWYgdGhlIG90aGVyIHR5cGUgbmFtZSBpcyBpbiB0aGUgdHlwZSBoaWVyYXJjaHkKLQkJCWZvciAoSVR5cGUgc3VwZXJUeXBlIDogdHlwZUhpZXJhcmNoeS5nZXRBbGxUeXBlcygpKSB7Ci0JCQkJaWYgKHN1cGVyVHlwZS5nZXRGdWxseVF1YWxpZmllZE5hbWUoKS5lcXVhbHMob3RoZXJUeXBlTmFtZSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFR5cGUgaGllcmFyY2h5IGZvciBKYXZhIHNvdXJjZSBmaWxlcwotCQllbHNlIGlmICh0eXBlQmluZGluZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gQVNUVG9vbHMudHlwZUlzU3ViVHlwZU9mKHR5cGVCaW5kaW5nLCBvdGhlclR5cGVOYW1lKTsKLQkJfQotCi0JCS8vIEFueXRoaW5nIGVsc2UgaXMgYWx3YXlzIGZhbHNlCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbnVtKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHR5cGUuaXNFbnVtKCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW1wbHkgaWdub3JlIGFuZCByZXR1cm4gbm8KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlRGVjbGFyYXRpb24oSnBhVHlwZURlY2xhcmF0aW9uIHR5cGVEZWNsYXJhdGlvbikgewotCQl0aGlzLnR5cGVEZWNsYXJhdGlvbiA9IHR5cGVEZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdHlwZU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFUeXBlRGVjbGFyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVR5cGVEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGEwNTNjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVR5cGVEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuc3BpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVR5cGVEZWNsYXJhdGlvbn0gdGhhdCBpcyB3cmFwcGluZyB0aGUgZGVzaWduLXRpbWUKLSAqIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZWNsYXJhdGlvbiBkZXNjcmlwdGlvbiBvZiBhIHR5cGUuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kCi0gKiBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZQotICogdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcwotICogQVBJIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1wdWJsaWMgY2xhc3MgSnBhVHlwZURlY2xhcmF0aW9uIGltcGxlbWVudHMgSVR5cGVEZWNsYXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBUaGUgZGltZW5zaW9uYWxpdHkgb2YgdGhlIGFycmF5IG9yIDAgaWYgdGhlIHR5cGUgaXMgbm90IGFuIGFycmF5LgotCSAqLwotCXByaXZhdGUgaW50IGRpbWVuc2lvbmFsaXR5OwotCi0JLyoqCi0JICogVGhlIGdlbmVyaWNzIG9mIHRoZSBnaXZlbiB0eXBlIG9yIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHR5cGUgaXMgbm90IHBhcmFtZXRlcml6ZWQuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBJVHlwZURlY2xhcmF0aW9uW10gZ2VuZXJpY1R5cGVzOwotCi0JLyoqCi0JICogVGhlIGV4dGVybmFsIGZvcm0gb2YgdGhlIEphdmEgdHlwZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIElUeXBlIHR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYVR5cGVEZWNsYXJhdGlvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gdHlwZSBUaGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgSmF2YSB0eXBlCi0JICogQHBhcmFtIGdlbmVyaWNUeXBlcyBUaGUgZ2VuZXJpY3Mgb2YgdGhlIGdpdmVuIHR5cGUgb3IgYW4gZW1wdHkgbGlzdCBpZiB0aGUgdHlwZSBpcyBub3QKLQkgKiBwYXJhbWV0ZXJpemVkCi0JICovCi0JcHVibGljIEpwYVR5cGVEZWNsYXJhdGlvbihJVHlwZSB0eXBlLCBJVHlwZURlY2xhcmF0aW9uW10gZ2VuZXJpY1R5cGVzKSB7Ci0JCXRoaXModHlwZSwgZ2VuZXJpY1R5cGVzLCAwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYVR5cGVEZWNsYXJhdGlvbjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gdHlwZSBUaGUgZXh0ZXJuYWwgZm9ybSBvZiB0aGUgSmF2YSB0eXBlCi0JICogQHBhcmFtIGdlbmVyaWNUeXBlcyBUaGUgZ2VuZXJpY3Mgb2YgdGhlIGdpdmVuIHR5cGUgb3IgYW4gZW1wdHkgbGlzdCBpZiB0aGUgdHlwZSBpcyBub3QKLQkgKiBwYXJhbWV0ZXJpemVkCi0JICogQHBhcmFtIGRpbWVuc2lvbmFsaXR5IFRoZSBkaW1lbnNpb25hbGl0eSBvZiB0aGUgYXJyYXkgb3IgMCBpZiBpdCdzIG5vdCBhbiBhcnJheQotCSAqLwotCXB1YmxpYyBKcGFUeXBlRGVjbGFyYXRpb24oSVR5cGUgdHlwZSwgSVR5cGVEZWNsYXJhdGlvbltdIGdlbmVyaWNUeXBlcywgaW50IGRpbWVuc2lvbmFsaXR5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudHlwZSAgICAgICAgICAgPSB0eXBlOwotCQl0aGlzLmdlbmVyaWNUeXBlcyAgID0gZ2VuZXJpY1R5cGVzOwotCQl0aGlzLmRpbWVuc2lvbmFsaXR5ID0gZGltZW5zaW9uYWxpdHk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGltZW5zaW9uYWxpdHkoKSB7Ci0JCXJldHVybiBkaW1lbnNpb25hbGl0eTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSVR5cGVEZWNsYXJhdGlvbltdIGdldFR5cGVQYXJhbWV0ZXJzKCkgewotCQlyZXR1cm4gZ2VuZXJpY1R5cGVzOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FycmF5KCkgewotCQlyZXR1cm4gZGltZW5zaW9uYWxpdHkgPiAwOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdHlwZS5nZXROYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVR5cGVSZXBvc2l0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9qcHFsL3NwaS9KcGFUeXBlUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2RmYTgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL0pwYVR5cGVSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBxbC5zcGk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5UeXBlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZVJlcG9zaXRvcnk7Ci0KLS8qKgotICogVGhlIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJVHlwZVJlcG9zaXRvcnl9IHRoYXQgaXMgd3JhcHBpbmcgdGhlIGRlc2lnbi10aW1lCi0gKiByZXByZXNlbnRhdGlvbiBvZiBhIHR5cGUgcmVwb3NpdG9yeS4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYVR5cGVSZXBvc2l0b3J5IGltcGxlbWVudHMgSVR5cGVSZXBvc2l0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBKYXZhIHByb2plY3QgdGhhdCBnaXZlcyBhY2Nlc3MgdGhlIGRlc2lnbi10aW1lIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBKYXZhIHR5cGVzLgotCSAqLwotCXByaXZhdGUgZmluYWwgSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0OwotCi0JLyoqCi0JICogS2VlcHMgYSBtYXAgb2YgdGhlIHByaW1pdGl2ZXMgZm9yIGZhc3QgYWNjZXNzLgotCSAqLwotCXByaXZhdGUgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IHByaW1pdGl2ZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIGhlbHBlciB0aGF0IGlzIHVzaW5nIHRoaXMgcmVwb3NpdG9yeSBmb3IgcmV0cmlldmluZyB7QGxpbmsgSUpwYVR5cGUgdHlwZXN9LgotCSAqLwotCXByaXZhdGUgVHlwZUhlbHBlciB0eXBlSGVscGVyOwotCi0JLyoqCi0JICogVGhlIHR5cGVzIHRoYXQgaGF2ZSBiZWVuIGNhY2hlZCBmb3IgZmFzdGVyIGFjY2Vzcy4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIElKcGFUeXBlPiB0eXBlczsKLQotCS8qKgotCSAqIFRoZSB7QGxpbmsgSUpwYVR5cGV9IHRoYXQgcmVwcmVzZW50cyBhIHVucmVzb2x2YWJsZSBvciBzaW1wbHkgYW4gdW5rbm93biB0eXBlLCB3aGljaCBpcyBjcmVhdGVkCi0JICogd2hlbiB7QGxpbmsgI2dldFR5cGUoU3RyaW5nKX0gaXMgaW52b2tlZCB3aXRoIHtAbGluayBJSnBhVHlwZSNVTlJFU09MVkFCTEVfVFlQRX0uCi0JICovCi0JcHJpdmF0ZSBJSnBhVHlwZSB1bnJlc29sdmFibGVUeXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFUeXBlUmVwb3NpdG9yeTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gamF2YVByb2plY3QgVGhlIEphdmEgcHJvamVjdCB0aGF0IGdpdmVzIGFjY2VzcyB0aGUgZGVzaWduLXRpbWUgb2JqZWN0cyByZXByZXNlbnRpbmcKLQkgKiB0aGUgSmF2YSB0eXBlcwotCSAqLwotCXB1YmxpYyBKcGFUeXBlUmVwb3NpdG9yeShJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qYXZhUHJvamVjdCA9IGphdmFQcm9qZWN0OwotCQl0aGlzLnR5cGVzICAgICAgID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJSnBhVHlwZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkSW5uZXJUeXBlTmFtZShTdHJpbmcgdHlwZU5hbWUsIGludCBpbmRleCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKHR5cGVOYW1lLnN1YnN0cmluZygwLCBpbmRleCkpOwotCQlzYi5hcHBlbmQoIiQiKTsKLQkJc2IuYXBwZW5kKHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIHR5cGVOYW1lLmxlbmd0aCgpKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gYnVpbGRQcmltaXRpdmVzKCkgewotCQlNYXA8U3RyaW5nLCBDbGFzczw/Pj4gcHJpbWl0aXZlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQ2xhc3M8Pz4+KCk7Ci0JCXByaW1pdGl2ZXMucHV0KEJ5dGUgICAgIC5UWVBFLmdldE5hbWUoKSwgQnl0ZSAgICAgLlRZUEUpOwotCQlwcmltaXRpdmVzLnB1dChTaG9ydCAgICAuVFlQRS5nZXROYW1lKCksIFNob3J0ICAgIC5UWVBFKTsKLQkJcHJpbWl0aXZlcy5wdXQoQ2hhcmFjdGVyLlRZUEUuZ2V0TmFtZSgpLCBDaGFyYWN0ZXIuVFlQRSk7Ci0JCXByaW1pdGl2ZXMucHV0KEludGVnZXIgIC5UWVBFLmdldE5hbWUoKSwgSW50ZWdlciAgLlRZUEUpOwotCQlwcmltaXRpdmVzLnB1dChMb25nICAgICAuVFlQRS5nZXROYW1lKCksIExvbmcgICAgIC5UWVBFKTsKLQkJcHJpbWl0aXZlcy5wdXQoRmxvYXQgICAgLlRZUEUuZ2V0TmFtZSgpLCBGbG9hdCAgICAuVFlQRSk7Ci0JCXByaW1pdGl2ZXMucHV0KERvdWJsZSAgIC5UWVBFLmdldE5hbWUoKSwgRG91YmxlICAgLlRZUEUpOwotCQlwcmltaXRpdmVzLnB1dChCb29sZWFuICAuVFlQRS5nZXROYW1lKCksIEJvb2xlYW4gIC5UWVBFKTsKLQkJcmV0dXJuIHByaW1pdGl2ZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElKcGFUeXBlIGJ1aWxkVHlwZShDbGFzczw/PiBqYXZhVHlwZSkgewotCQlKYXZhVHlwZSBqcGFUeXBlID0gbmV3IEphdmFUeXBlKHRoaXMsIGphdmFUeXBlKTsKLQkJdHlwZXMucHV0KGpwYVR5cGUuZ2V0TmFtZSgpLCBqcGFUeXBlKTsKLQkJcmV0dXJuIGpwYVR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIElKcGFUeXBlIGJ1aWxkVHlwZShJVHlwZSB0eXBlKSB7Ci0JCUpwYVR5cGUganBhVHlwZSA9IG5ldyBKcGFUeXBlKHRoaXMsIHR5cGUpOwotCQl0eXBlcy5wdXQoanBhVHlwZS5nZXROYW1lKCksIGpwYVR5cGUpOwotCQlyZXR1cm4ganBhVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUpwYVR5cGUgYnVpbGRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQlJSnBhVHlwZSBqcGFUeXBlID0gbmV3IFNpbXBsZVR5cGUodGhpcywgdHlwZU5hbWUpOwotCQl0eXBlcy5wdXQodHlwZU5hbWUsIGpwYVR5cGUpOwotCQlyZXR1cm4ganBhVHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRUb0phdmFBcnJheVR5cGUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0KLQkJaW50IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZigiW10iKTsKLQkJaW50IGRpbWVuc2lvbmFsaXR5ID0gKHR5cGVOYW1lLmxlbmd0aCgpIC0gaW5kZXgpIC8gMjsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLQkJd2hpbGUgKGRpbWVuc2lvbmFsaXR5LS0gPiAwKSB7Ci0JCQlzYi5hcHBlbmQoIlsiKTsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gdHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJQ2xhc3M8Pz4gcHJpbWl0aXZlID0gcHJpbWl0aXZlcy5nZXQodHlwZSk7Ci0KLQkJaWYgKHByaW1pdGl2ZSAhPSBudWxsKSB7Ci0JCQlpZiAocHJpbWl0aXZlID09IEJ5dGUuVFlQRSkgewotCQkJCXNiLmFwcGVuZCgiQiIpOwotCQkJfQotCQkJZWxzZSBpZiAocHJpbWl0aXZlID09IENoYXJhY3Rlci5UWVBFKSB7Ci0JCQkJc2IuYXBwZW5kKCJDIik7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcmltaXRpdmUgPT0gU2hvcnQuVFlQRSkgewotCQkJCXNiLmFwcGVuZCgiUyIpOwotCQkJfQotCQkJZWxzZSBpZiAocHJpbWl0aXZlID09IEludGVnZXIuVFlQRSkgewotCQkJCXNiLmFwcGVuZCgiSSIpOwotCQkJfQotCQkJZWxzZSBpZiAocHJpbWl0aXZlID09IExvbmcuVFlQRSkgewotCQkJCXNiLmFwcGVuZCgiTCIpOwotCQkJfQotCQkJZWxzZSBpZiAocHJpbWl0aXZlID09IEZsb2F0LlRZUEUpIHsKLQkJCQlzYi5hcHBlbmQoIkYiKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByaW1pdGl2ZSA9PSBEb3VibGUuVFlQRSkgewotCQkJCXNiLmFwcGVuZCgiRCIpOwotCQkJfQotCQkJZWxzZSBpZiAocHJpbWl0aXZlID09IEJvb2xlYW4uVFlQRSkgewotCQkJCXNiLmFwcGVuZCgiWiIpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKHR5cGUpOwotCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCX0KLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2xhc3M8Pz4gZmluZFByaW1pdGl2ZShTdHJpbmcgdHlwZU5hbWUpIHsKLQkJaWYgKHByaW1pdGl2ZXMgPT0gbnVsbCkgewotCQkJcHJpbWl0aXZlcyA9IGJ1aWxkUHJpbWl0aXZlcygpOwotCQl9Ci0JCXJldHVybiBwcmltaXRpdmVzLmdldCh0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBkZXNpZ24tdGltZSBKYXZhIHR5cGUgZm9yIHRoZSBnaXZlbiB0eXBlIG5hbWUsIHdoaWNoIGhhcyB0byBiZSB0aGUgZnVsbHkKLQkgKiBxdWFsaWZpZWQgdHlwZSBuYW1lLgotCSAqCi0JICogQHBhcmFtIHR5cGVOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0JICogQHJldHVybiBUaGUgZGVzaWduLXRpbWUgSmF2YSB0eXBlIGlmIGl0IGNvdWxkIGJlIHJldHJpZXZlZDsgPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIElUeXBlIGZpbmRUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBJSnBhVHlwZSBnZXRFbnVtVHlwZShTdHJpbmcgZW51bVR5cGVOYW1lKSB7Ci0KLQkJLy8gR2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBkb3Qgc28gdGhlIGVudW0gY29uc3RhbnQgY2FuIGJlIHJlbW92ZWQKLQkJaW50IGxhc3REb3RJbmRleCA9IGVudW1UeXBlTmFtZS5sYXN0SW5kZXhPZigiLiIpOwotCi0JCWlmIChsYXN0RG90SW5kZXggPT0gLTEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gUmV0cmlldmUgdGhlIGZ1bGx5IHF1YWxpZmllZCBlbnVtIHR5cGUgbmFtZQotCQlTdHJpbmcgdHlwZU5hbWUgPSBlbnVtVHlwZU5hbWUuc3Vic3RyaW5nKDAsIGxhc3REb3RJbmRleCk7Ci0KLQkJLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBlbnVtIHR5cGUKLQkJSVR5cGUgdHlwZSA9IGZpbmRUeXBlKHR5cGVOYW1lKTsKLQkJSUpwYVR5cGUganBhVHlwZTsKLQotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQlqcGFUeXBlID0gYnVpbGRUeXBlKHR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJanBhVHlwZSA9IGxvYWRJbm5lclR5cGUodHlwZU5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIChqcGFUeXBlICE9IG51bGwpICYmIGpwYVR5cGUuaXNFbnVtKCkgPyBqcGFUeXBlIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHByb2plY3QsIHdoaWNoIGdpdmVzIGFjY2VzcyB0byB0aGUgY2xhc3MgcGF0aC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIEphdmEgcHJvamVjdCwgd2hpY2ggZ2l2ZXMgYWNjZXNzIHRvIHRoZSBjbGFzcyBwYXRoCi0JICovCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSUpwYVR5cGUgZ2V0VHlwZShDbGFzczw/PiBqYXZhQ2xhc3MpIHsKLQkJSUpwYVR5cGUgdHlwZSA9IHR5cGVzLmdldChqYXZhQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdHlwZSA9IGJ1aWxkVHlwZShqYXZhQ2xhc3MpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUge0BsaW5rIElUeXBlfSBmb3IgdGhlIGdpdmVuIHtAbGluayBJUmVzb3VyY2V9LgotCSAqCi0JICogQHBhcmFtIHJlc291cmNlIFRoZSB3b3Jrc3BhY2UgbG9jYXRpb24gb2YgdGhlIHtAbGluayBJVHlwZX0gdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIFRoZSBkZXNpZ24tdGltZSByZXByZXNlbnRhdGlvbiBvZiBhIEphdmEgdHlwZQotCSAqLwotCXByb3RlY3RlZCBJVHlwZSBnZXRUeXBlKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQl0cnkgewotCQkJcmV0dXJuIChJVHlwZSkgamF2YVByb2plY3QuZmluZEVsZW1lbnQoKElQYXRoKSByZXNvdXJjZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSUpwYVR5cGUgZ2V0VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQotCQlpZiAoSUpwYVR5cGUuVU5SRVNPTFZBQkxFX1RZUEUgPT0gdHlwZU5hbWUpIHsKLQkJCXJldHVybiB1bnJlc29sdmFibGVUeXBlKCk7Ci0JCX0KLQotCQlpZiAodHlwZU5hbWUuZW5kc1dpdGgoIltdIikpIHsKLQkJCXJldHVybiBsb2FkQXJyYXlUeXBlKHR5cGVOYW1lKTsKLQkJfQotCi0JCWlmICh0eXBlTmFtZS5jaGFyQXQoMCkgPT0gJ1snKSB7Ci0JCQlyZXR1cm4gbG9hZEphdmFBcnJheVR5cGUodHlwZU5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIGxvYWRUeXBlSW1wKHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFR5cGVIZWxwZXIgZ2V0VHlwZUhlbHBlcigpIHsKLQkJaWYgKHR5cGVIZWxwZXIgPT0gbnVsbCkgewotCQkJdHlwZUhlbHBlciA9IG5ldyBUeXBlSGVscGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiB0eXBlSGVscGVyOwotCX0KLQotCXByb3RlY3RlZCBJSnBhVHlwZSBsb2FkQXJyYXlUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCi0JCUlKcGFUeXBlIHR5cGUgPSB0eXBlcy5nZXQodHlwZU5hbWUpOwotCi0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJLy8gVHJ5IHRvIHNlZSBpZiB0aGUgdHlwZSBpcyBhIEpESyBjbGFzcywgb3RoZXJ3aXNlLCBqdXN0IHVzZSB0aGUgdHlwZSBuYW1lCi0JCQkJLy8gc2luY2UgSUpwYVR5cGUgZG9lc24ndCBzdXBwb3J0IGFycmF5IHR5cGVzCi0JCQkJU3RyaW5nIGphdmFUeXBlTmFtZSA9IGNvbnZlcnRUb0phdmFBcnJheVR5cGUodHlwZU5hbWUpOwotCQkJCXR5cGUgPSBidWlsZFR5cGUoQ2xhc3MuZm9yTmFtZShqYXZhVHlwZU5hbWUpKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCi0JCQkJaW50IGluZGV4ID0gdHlwZU5hbWUuaW5kZXhPZigiW10iKTsKLQkJCQlpbnQgZGltZW5zaW9uYWxpdHkgPSAodHlwZU5hbWUubGVuZ3RoKCkgLSBpbmRleCkgLyAyOwotCi0JCQkJdHlwZSA9IGdldFR5cGUodHlwZU5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSk7Ci0KLQkJCQl0eXBlLnNldFR5cGVEZWNsYXJhdGlvbigKLQkJCQkJbmV3IEpwYVR5cGVEZWNsYXJhdGlvbih0eXBlLCBuZXcgSVR5cGVEZWNsYXJhdGlvblswXSwgZGltZW5zaW9uYWxpdHkpCi0JCQkJKTsKLQkJCX0KLQotCQkJdHlwZXMucHV0KHR5cGVOYW1lLCB0eXBlKTsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJSnBhVHlwZSBsb2FkSW5uZXJUeXBlKFN0cmluZyB0eXBlTmFtZSkgewotCi0JCXdoaWxlICh0cnVlKSB7Ci0KLQkJCWludCBpbmRleCA9IHR5cGVOYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0KLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQl0eXBlTmFtZSA9IGJ1aWxkSW5uZXJUeXBlTmFtZSh0eXBlTmFtZSwgaW5kZXgpOwotCQkJSUpwYVR5cGUgY2FjaGVkVHlwZSA9IHR5cGVzLmdldCh0eXBlTmFtZSk7Ci0KLQkJCWlmIChjYWNoZWRUeXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY2FjaGVkVHlwZTsKLQkJCX0KLQotCQkJLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBKYXZhIHR5cGUKLQkJCUlUeXBlIHR5cGUgPSBmaW5kVHlwZSh0eXBlTmFtZSk7Ci0KLQkJCS8vIEEgSmF2YSB0eXBlIGV4aXN0cywgcmV0dXJuIGl0Ci0JCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkVHlwZSh0eXBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJSnBhVHlwZSBsb2FkSmF2YUFycmF5VHlwZShTdHJpbmcgdHlwZU5hbWUpIHsKLQotCQlJSnBhVHlwZSB0eXBlID0gdHlwZXMuZ2V0KHR5cGVOYW1lKTsKLQotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIFRyeSB0byBzZWUgaWYgdGhlIHR5cGUgaXMgYSBKREsgY2xhc3MsIG90aGVyd2lzZSwganVzdCB1c2UgdGhlIHR5cGUgbmFtZQotCQkJCS8vIHNpbmNlIElKcGFUeXBlIGRvZXNuJ3Qgc3VwcG9ydCBhcnJheSB0eXBlcwotCQkJCXR5cGUgPSBidWlsZFR5cGUoQ2xhc3MuZm9yTmFtZSh0eXBlTmFtZSkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLQkJCQlpbnQgaW5kZXggPSB0eXBlTmFtZS5sYXN0SW5kZXhPZigiWyIpOwotCQkJCWludCBkaW1lbnNpb25hbGl0eSA9IGluZGV4IC8gMjsKLQotCQkJCXR5cGUgPSBnZXRUeXBlKHR5cGVOYW1lLnN1YnN0cmluZyhpbmRleCwgdHlwZU5hbWUuZW5kc1dpdGgoIjsiKSA/IHR5cGVOYW1lLmxlbmd0aCgpIC0gMSA6IHR5cGVOYW1lLmxlbmd0aCgpKSk7Ci0KLQkJCQl0eXBlLnNldFR5cGVEZWNsYXJhdGlvbigKLQkJCQkJbmV3IEpwYVR5cGVEZWNsYXJhdGlvbih0eXBlLCBuZXcgSVR5cGVEZWNsYXJhdGlvblswXSwgZGltZW5zaW9uYWxpdHkpCi0JCQkJKTsKLQkJCX0KLQotCQkJdHlwZXMucHV0KHR5cGVOYW1lLCB0eXBlKTsKLQkJfQotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJSnBhVHlwZSBsb2FkVHlwZUltcChTdHJpbmcgdHlwZU5hbWUpIHsKLQotCQlJSnBhVHlwZSB0eXBlID0gdHlwZXMuZ2V0KHR5cGVOYW1lKTsKLQotCQkvLyBUaGUgdHlwZSB3YXMgYWxyZWFkeSBjYWNoZWQsIHNpbXBseSByZXR1cm4gaXQKLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQotCQkvLyBGaXJzdCBjaGVjayBmb3IgcHJpbWl0aXZlLCB0aGV5IGRvbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nIElKcGFUeXBlCi0JCUNsYXNzPD8+IHByaW1pdGl2ZSA9IGZpbmRQcmltaXRpdmUodHlwZU5hbWUpOwotCi0JCWlmIChwcmltaXRpdmUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGJ1aWxkVHlwZShwcmltaXRpdmUpOwotCQl9Ci0KLQkJLy8gQXR0ZW1wdCB0byBsb2FkIHRoZSBKYXZhIHR5cGUKLQkJSVR5cGUgaVR5cGUgPSBmaW5kVHlwZSh0eXBlTmFtZSk7Ci0KLQkJLy8gQSBKYXZhIHR5cGUgZXhpc3RzLCByZXR1cm4gaXQKLQkJaWYgKGlUeXBlICE9IG51bGwpIHsKLQkJCXJldHVybiBidWlsZFR5cGUoaVR5cGUpOwotCQl9Ci0KLQkJLy8gTm93IHRyeSB3aXRoIGEgcG9zc2libGUgaW5uZXIgZW51bSB0eXBlCi0JCXR5cGUgPSBsb2FkSW5uZXJUeXBlKHR5cGVOYW1lKTsKLQotCQkvLyBObyBKYXZhIHR5cGUgZXhpc3RzLCBjcmVhdGUgYSAibnVsbCIgSUpwYVR5cGUKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdHlwZSA9IGJ1aWxkVHlwZSh0eXBlTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUpwYVR5cGUgdW5yZXNvbHZhYmxlVHlwZSgpIHsKLQkJaWYgKHVucmVzb2x2YWJsZVR5cGUgPT0gbnVsbCkgewotCQkJdW5yZXNvbHZhYmxlVHlwZSA9IG5ldyBTaW1wbGVUeXBlKHRoaXMsIElKcGFUeXBlLlVOUkVTT0xWQUJMRV9UWVBFKTsKLQkJfQotCQlyZXR1cm4gdW5yZXNvbHZhYmxlVHlwZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvU2ltcGxlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvanBxbC9zcGkvU2ltcGxlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjZmYzRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL2pwcWwvc3BpL1NpbXBsZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcHFsLnNwaTsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JQ29uc3RydWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JVHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnV0aWwuaXRlcmF0b3IuSXRlcmFibGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC51dGlsLml0ZXJhdG9yLk51bGxJdGVyYXRvcjsKLQotLyoqCi0gKiBUaGUgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElUeXBlfSB0aGF0IGlzIHdyYXBwaW5nIHRoZSB0eXBlIG5hbWUgb25seS4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudCBhbmQKLSAqIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlCi0gKiB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20gcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzCi0gKiBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVUeXBlIGltcGxlbWVudHMgSUpwYVR5cGUgewotCi0JLyoqCi0JICogQ2FjaGVzIHRoZSB0eXBlIGhpZXJhcmNoeSBvZiB0aGUge0BsaW5rIElUeXBlfSBpbiBvcmRlciB0byBwcmV2ZW50IHJlYnVpbGRpbmcgaXQgZWFjaCB0aW1lLgotCSAqLwotCXByaXZhdGUgSVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb247Ci0KLQkvKioKLQkgKiBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEphdmEgdHlwZS4KLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyB0eXBlTmFtZTsKLQotCS8qKgotCSAqIFRoZSBleHRlcm5hbCBmb3JtIG9mIGEgdHlwZSByZXBvc2l0b3J5LgotCSAqLwotCXByaXZhdGUgZmluYWwgSnBhVHlwZVJlcG9zaXRvcnkgdHlwZVJlcG9zaXRvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNpbXBsZVR5cGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHR5cGVSZXBvc2l0b3J5IFRoZSBleHRlcm5hbCBmb3JtIG9mIGEgdHlwZSByZXBvc2l0b3J5Ci0JICogQHBhcmFtIHR5cGVOYW1lIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgSmF2YSB0eXBlCi0JICovCi0JcHVibGljIFNpbXBsZVR5cGUoSnBhVHlwZVJlcG9zaXRvcnkgdHlwZVJlcG9zaXRvcnksIFN0cmluZyB0eXBlTmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnR5cGVSZXBvc2l0b3J5ID0gdHlwZVJlcG9zaXRvcnk7Ci0JCXRoaXMudHlwZU5hbWUgICAgICAgPSB0eXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEl0ZXJhYmxlSXRlcmF0b3I8SUNvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvcnMoKSB7Ci0JCXJldHVybiBOdWxsSXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKElUeXBlIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGVOYW1lLmVxdWFscyh0eXBlLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtQ29uc3RhbnRzKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HX0FSUkFZOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIElUeXBlRGVjbGFyYXRpb24gZ2V0VHlwZURlY2xhcmF0aW9uKCkgewotCQlpZiAodHlwZURlY2xhcmF0aW9uID09IG51bGwpIHsKLQkJCXR5cGVEZWNsYXJhdGlvbiA9IG5ldyBKcGFUeXBlRGVjbGFyYXRpb24odGhpcywgbmV3IElUeXBlRGVjbGFyYXRpb25bMF0pOwotCQl9Ci0JCXJldHVybiB0eXBlRGVjbGFyYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVR5cGVSZXBvc2l0b3J5IGdldFR5cGVSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gdHlwZVJlcG9zaXRvcnk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0Fubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBc3NpZ25hYmxlVG8oSVR5cGUgdHlwZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW51bSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZURlY2xhcmF0aW9uKEpwYVR5cGVEZWNsYXJhdGlvbiB0eXBlRGVjbGFyYXRpb24pIHsKLQkJdGhpcy50eXBlRGVjbGFyYXRpb24gPSB0eXBlRGVjbGFyYXRpb247Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0eXBlTmFtZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvbGlicHJvdi9KcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9saWJwcm92L0pwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjMmIzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9saWJwcm92L0pwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmxpYnByb3Y7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUubGlicHJvdi5KcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyAKLQkJZXh0ZW5kcyBKcHRMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIHsKLQkKLQkvKiogZW5hYmxlbWVudCBleHByZXNzaW9uIGZvciBqcGEgcGxhdGZvcm0gaWQgKFN0cmluZykgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfUExBVEZPUk1fRU5BQkxFTUVOVF9FWFAgPSAianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqIGVuYWJsZW1lbnQgZXhwcmVzc2lvbiBmb3IganBhIHBsYXRmb3JtIGRlc2NyaXB0aW9uIChKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9QTEFURk9STV9ERVNDUklQVElPTl9FTkFCTEVNRU5UX0VYUCA9ICJqcGFQbGF0Zm9ybURlc2NyaXB0aW9uIjsgIC8vJE5PTi1OTFMtMSQgCi0JCi0JLyoqIHByb3BlcnR5IG9mIGFsbCBqcGEgbGlicmFyeSBwcm92aWRlciBpbnN0YWxsIG9wZXJhdGlvbiBjb25maWdzICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9KUEFfUExBVEZPUk0gPSAiSlBBX1BMQVRGT1JNIjsgLy8kTk9OLU5MUy0xJAotCQotCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm0oKTsKLQkKLQl2b2lkIHNldEpwYVBsYXRmb3JtKEpwYVBsYXRmb3JtRGVzY3JpcHRpb24ganBhUGxhdGZvcm0pOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcGxhdGZvcm0vR2VuZXJpY1BsYXRmb3JtLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9wbGF0Zm9ybS9HZW5lcmljUGxhdGZvcm0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU3MzhkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9wbGF0Zm9ybS9HZW5lcmljUGxhdGZvcm0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci0KLS8qKgotICogQ29uc3RhbnRzIHBlcnRhaW5pbmcgdG8gdGhlIEdlbmVyaWMgSlBBIHBsYXRmb3JtcyBhbmQgdGhlaXIgZ3JvdXAuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQbGF0Zm9ybSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gR1JPVVAgCi0JCQk9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm1Hcm91cCgiZ2VuZXJpYyIpOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIFZFUlNJT05fMV8wIAotCQkJPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKCJnZW5lcmljIik7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gVkVSU0lPTl8yXzAgCi0JCQk9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUGxhdGZvcm1NYW5hZ2VyKCkuZ2V0SnBhUGxhdGZvcm0oImdlbmVyaWMyXzAiKTsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIE5vdCBmb3IgaW5zdGFudGlhdGlvbgotCSAqLwotCXByaXZhdGUgR2VuZXJpY1BsYXRmb3JtKCkge30KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3BsYXRmb3JtL0pwYVBsYXRmb3JtRGVzY3JpcHRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3BsYXRmb3JtL0pwYVBsYXRmb3JtRGVzY3JpcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5NWY1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9wbGF0Zm9ybS9KcGFQbGF0Zm9ybURlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotCi0vKioKLSAqIENvbnRhaW5zIG1ldGFkYXRhIHRoYXQgZGVzY3JpYmVzIGEgSlBBIHBsYXRmb3JtLiAgTm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIHsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEZhY3RvcnlDbGFzc05hbWUoKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0pwYUZhY2V0VmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb24pOwotCQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpOwotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gZ2V0R3JvdXAoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3BsYXRmb3JtL0pwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcGxhdGZvcm0vSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTI5NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcGxhdGZvcm0vSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybTsKLQotLyoqCi0gKiBDb250YWlucyBtZXRhZGF0YSB0aGF0IGRlc2NyaWJlcyBhIEpQQSBwbGF0Zm9ybSBncm91cC4gIE5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIHsKLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQbHVnaW5JZCgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKTsKLQkKLQlwdWJsaWMgSXRlcmFibGU8SnBhUGxhdGZvcm1EZXNjcmlwdGlvbj4gZ2V0UGxhdGZvcm1zKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9wbGF0Zm9ybS9KcGFQbGF0Zm9ybU1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3BsYXRmb3JtL0pwYVBsYXRmb3JtTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUxMGU2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3BsYXRmb3JtL0pwYVBsYXRmb3JtTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogRW50cnkgcG9pbnQgdG8gdGhlICJqcGFQbGF0Zm9ybXMiIGV4dGVuc2lvbiBwb2ludAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUGxhdGZvcm1NYW5hZ2VyIHsKLQkKLQlJdGVyYWJsZTxKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24+IGdldEpwYVBsYXRmb3JtR3JvdXBzKCk7Ci0JCi0JSnBhUGxhdGZvcm1Hcm91cERlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtR3JvdXAoU3RyaW5nIGdyb3VwSWQpOwotCQotCUl0ZXJhYmxlPEpwYVBsYXRmb3JtRGVzY3JpcHRpb24+IGdldEpwYVBsYXRmb3JtcygpOwotCQotCUpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm0oU3RyaW5nIHBsYXRmb3JtSWQpOwotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IEpQQSBwbGF0Zm9ybSByZWdpc3RlcmVkIGFzIGEgZGVmYXVsdCBwbGF0Zm9ybSBhbmQgd2hpY2ggc3VwcG9ydHMgdGhlIGdpdmVuIAotCSAqIEpQQSBmYWNldCB2ZXJzaW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gc3VjaCByZWdpc3RlcmVkIHBsYXRmb3Jtcy4KLQkgKi8KLQlKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldERlZmF1bHRKcGFQbGF0Zm9ybShJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb24pOwotCQotCUpwYVBsYXRmb3JtIGJ1aWxkSnBhUGxhdGZvcm1JbXBsZW1lbnRhdGlvbihJUHJvamVjdCBwcm9qZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL0Fic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZGQzOTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuVVJJQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guRU1GV29ya2JlbmNoQ29udGV4dEJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5GbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLklFTUZDb250ZXh0Q29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5pbXBsLldUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5SZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZndvcmtiZW5jaC52YWxpZGF0ZWVkaXQuUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWZ3b3JrYmVuY2gudmFsaWRhdGVlZGl0LlJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXI7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxSZXNvdXJjZVByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFYbWxSZXNvdXJjZVByb3ZpZGVyLCBJRU1GQ29udGV4dENvbnRyaWJ1dG9yLCBSZXNvdXJjZVN0YXRlSW5wdXRQcm92aWRlciwgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvcgotewotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0OwotCQotCXByb3RlY3RlZCBVUkkgZmlsZVVyaTsKLQkKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2U7Ci0JCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBjb250ZW50VHlwZTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VBZGFwdGVyIHJlc291cmNlQWRhcHRlciA9IG5ldyBSZXNvdXJjZUFkYXB0ZXIoKTsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgTGlzdGVuZXJMaXN0PEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lcj4gbGlzdGVuZXJMaXN0ID0gbmV3IExpc3RlbmVyTGlzdDxKcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXI+KEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lci5jbGFzcyk7Ci0JCi0JcHJvdGVjdGVkIFJlc291cmNlU3RhdGVWYWxpZGF0b3Igc3RhdGVWYWxpZGF0b3I7Ci0JCi0JCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IEFic3RyYWN0UmVzb3VyY2VNb2RlbFByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gcHJvamVjdCBhbmQgCi0JICogcmVzb3VyY2VQYXRoLiAgVGhlIHJlc291cmNlUGF0aCBtYXkgYmUgZWl0aGVyIAotCSAqIAlhKSBhbiBhYnNvbHV0ZSB3b3Jrc3BhY2UtcmVsYXRpdmUgcGxhdGZvcm0gcmVzb3VyY2UgcGF0aCAoZS5nLiAiL015UHJvamVjdC9zcmMvTUVUQS1JTkYvZm9vYmFyLnhtbCIpIAotCSAqIAlvciBiKSBhIHJlbGF0aXZlIHJ1bnRpbWUgcGF0aCAoZS5nLiAiTUVUQS1JTkYvZm9vYmFyLnhtbCIuKSAgCi0JICogSW4gZWl0aGVyIGNhc2UsIHtAbGluayAjYnVpbGRGaWxlVXJpKElQYXRoKX0gd2lsbCBhdHRlbXB0IHRvIGJ1aWxkIGFuIGFic29sdXRlbHkgcGF0aGVkIAotCSAqIFVSSSBmb3IgdGhlIGdpdmVuIHBhdGguCi0JICovCi0JcHVibGljIEFic3RyYWN0WG1sUmVzb3VyY2VQcm92aWRlcihJUHJvamVjdCBwcm9qZWN0LCBJUGF0aCByZXNvdXJjZVBhdGgsIElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl0aGlzLmZpbGVVcmkgPSBidWlsZEZpbGVVcmkocmVzb3VyY2VQYXRoKTsKLQkJdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotCX0KLQkKLQlwcm90ZWN0ZWQgVVJJIGJ1aWxkRmlsZVVyaShJUGF0aCByZXNvdXJjZVBhdGgpIHsKLQkJVVJJIHJlc291cmNlVXJpID0gbnVsbDsKLQkJCi0JCWlmIChyZXNvdXJjZVBhdGguaXNBYnNvbHV0ZSgpKSB7Ci0JCQlyZXNvdXJjZVVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJUGF0aCBhYnNvbHV0ZVBhdGggPSAKLQkJCQlKcHRDb21tb25Db3JlUGx1Z2luLmdldFJlc291cmNlTG9jYXRvcih0aGlzLnByb2plY3QpLmdldFJlc291cmNlUGF0aCh0aGlzLnByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0JCQlyZXNvdXJjZVVyaSA9IFVSSS5jcmVhdGVQbGF0Zm9ybVJlc291cmNlVVJJKGFic29sdXRlUGF0aC50b1N0cmluZygpLCBmYWxzZSk7Ci0JCX0KLQkJCi0JCVVSSUNvbnZlcnRlciB1cmlDb252ZXJ0ZXIgPSBnZXRSZXNvdXJjZVNldCgpLmdldFVSSUNvbnZlcnRlcigpOwotCQlyZXR1cm4gdXJpQ29udmVydGVyLm5vcm1hbGl6ZShyZXNvdXJjZVVyaSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVzb3VyY2UsIGlmIGl0IGV4aXN0cy4gIElmIG5vIGZpbGUgZXhpc3RzIGZvciB0aGlzIHJlc291cmNlLCAKLQkgKiB0aGlzIHdpbGwgcmV0dXJuIGEgc3R1YiByZXNvdXJjZS4gIFlvdSBtdXN0IGNhbGwgI2NyZWF0ZVJlc291cmNlKCkgdG8gCi0JICogY3JlYXRlIHRoZSBmaWxlIG9uIHRoZSBmaWxlIHN5c3RlbS4KLQkgKi8KLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgZ2V0WG1sUmVzb3VyY2UoKSB7Ci0JCWlmICh0aGlzLnJlc291cmNlID09IG51bGwpIHsKLQkJCUpwYVhtbFJlc291cmNlIG5ld1Jlc291cmNlID0gKEpwYVhtbFJlc291cmNlKSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRPckNyZWF0ZVJlc291cmNlKHRoaXMuZmlsZVVyaSwgZ2V0UmVzb3VyY2VTZXQoKSk7Ci0JCQkvL0VNRiBjYWNoZXMgcmVzb3VyY2VzIGJhc2VkIG9uIFVSSS4gIElmIHRoZSByZXNvdXJjZSBoYXMgY2hhbmdlZCBjb250ZW50IHR5cGVzIChzYXkgdGhlIHNjaGVtYSB3YXMgY2hhbmdlZAotCQkJLy9mcm9tIG9ybSB0byBlY2xpcHNlbGluay1vcm0pLCB0aGVuIHRoZSByZXNvdXJjZSB3aWxsIGJlIG9mIHRoZSB3cm9uZyB0eXBlIGFuZCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvbmUuCi0JCQlpZiAobmV3UmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKS5lcXVhbHModGhpcy5jb250ZW50VHlwZSkpIHsKLQkJCQl0aGlzLnJlc291cmNlID0gbmV3UmVzb3VyY2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNyZWF0ZVJlc291cmNlQW5kTG9hZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0aGlzLnJlc291cmNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2VBbmRMb2FkKCkgewotCQl0aGlzLnJlc291cmNlID0gY3JlYXRlUmVzb3VyY2UoKTsKLQkJdGhpcy5sb2FkUmVzb3VyY2UoKTsKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2U7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZSgpIHsKLQkJUmVzb3VyY2UuRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSAKLQkJCVdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFLmdldEZhY3RvcnkodGhpcy5maWxlVXJpLCB0aGlzLmNvbnRlbnRUeXBlLmdldERlZmF1bHREZXNjcmlwdGlvbigpKTsKLQkJcmV0dXJuIChKcGFYbWxSZXNvdXJjZSkgZ2V0UmVzb3VyY2VTZXQoKS5jcmVhdGVSZXNvdXJjZSh0aGlzLmZpbGVVcmksIHJlc291cmNlRmFjdG9yeSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgbG9hZFJlc291cmNlKCkgewotCQl0cnkgewotCQkJdGhpcy5yZXNvdXJjZS5sb2FkKCgoUHJvamVjdFJlc291cmNlU2V0KSBnZXRSZXNvdXJjZVNldCgpKS5nZXRMb2FkT3B0aW9ucygpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZSk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlUmVzb3VyY2VBbmRVbmRlcmx5aW5nRmlsZShPYmplY3QgY29uZmlnKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSgpOwotCQlpZiAodGhpcy5yZXNvdXJjZS5maWxlRXhpc3RzKCkpIHsgLy9hbHdheXMgcG9zc2libGUgdGhhdCB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyB3aGVuIHRoZSBqcGEgZmFjZXQgaXMgYWRkZWQKLQkJCWxvYWRSZXNvdXJjZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcG9wdWxhdGVSb290KGNvbmZpZyk7Ci0JCQl0cnkgewotCQkJCXRoaXMucmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7IC8vdGhpcyB3cml0ZXMgb3V0IHRoZSBmaWxlCi0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFDb3JlUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIHdpbGwgYWN0dWFsbHkgY3JlYXRlIHRoZSB1bmRlcmx5aW5nIGZpbGUgYW5kIHRoZSBKcGFYbWxSZXNvdXJjZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0LgotCSAqIEl0IGFsc28gcG9wdWxhdGVzIHRoZSByb290IG9mIHRoZSBmaWxlLgotCSAqIEBwYXJhbSBjb25maWcgLSBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgdG8gc3BlY2lmeSBvcHRpb25zIGZvciBjcmVhdGlvbiBvZiB0aGUgcmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSnBhWG1sUmVzb3VyY2UgY3JlYXRlRmlsZUFuZFJlc291cmNlKGZpbmFsIE9iamVjdCBjb25maWcsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQljcmVhdGVSZXNvdXJjZUFuZFVuZGVybHlpbmdGaWxlKGNvbmZpZyk7Ci0JCQl9Ci0JCX07Ci0JCXdvcmtzcGFjZS5ydW4ocnVubmFibGUsIHRoaXMucHJvamVjdCwgSVdvcmtzcGFjZS5BVk9JRF9VUERBVEUsIG1vbml0b3IpOwotCQlyZXR1cm4gdGhpcy5yZXNvdXJjZTsJCi0JfQotCQotCS8qKgotCSAqIFVzZWQgdG8gb3B0aW9uYWxseSBmaWxsIGluIHRoZSByb290IGluZm9ybWF0aW9uIG9mIGEgcmVzb3VyY2UgaWYgaXQgZG9lcyBub3QgCi0JICogZXhpc3QgYXMgYSBmaWxlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVSb290KE9iamVjdCBjb25maWcpIHsKLQkJLy9UT0RPIHBvdGVudGlhbGx5IGNhbGwgcmVzb3VyY2UucG9wdWxhdGVSb290KCkgaW5zdGVhZCBvZiB0aGUgcmVzb3VyY2VQcm92aWRlciBkb2luZyB0aGlzCi0JfQotCQotCi0JLyoqCi0JICogbWluaW1pemUgdGhlIHNjb3BlIG9mIHRoZSBzdXBwcmVzc2VkIHdhcm5pbmdzCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEVPYmplY3Q+IGdldFJlc291cmNlQ29udGVudHMoKSB7Ci0JCXJldHVybiB0aGlzLnJlc291cmNlLmdldENvbnRlbnRzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSnBhWG1sUmVzb3VyY2VQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWVuZ2FnZVJlc291cmNlKCk7Ci0JCX0KLQkJdGhpcy5saXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSnBhWG1sUmVzb3VyY2VQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCWlmICh0aGlzLmxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWRpc2VuZ2FnZVJlc291cmNlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuZ2FnZVJlc291cmNlKCkgewotCQlpZiAodGhpcy5yZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlc291cmNlLmVBZGFwdGVycygpLmFkZCh0aGlzLnJlc291cmNlQWRhcHRlcik7Ci0JCX0KLSAJfQotCQotCXByaXZhdGUgdm9pZCBkaXNlbmdhZ2VSZXNvdXJjZSgpIHsKLQkJaWYgKHRoaXMucmVzb3VyY2UgIT0gbnVsbCkgewotCQkJdGhpcy5yZXNvdXJjZS5lQWRhcHRlcnMoKS5yZW1vdmUodGhpcy5yZXNvdXJjZUFkYXB0ZXIpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBGbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldCBnZXRSZXNvdXJjZVNldCgpIHsKLQkJcmV0dXJuIChGbGV4aWJsZVByb2plY3RSZXNvdXJjZVNldCkgZ2V0RW1mQ29udGV4dCgpLmdldFJlc291cmNlU2V0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBFTUZXb3JrYmVuY2hDb250ZXh0QmFzZSBnZXRFbWZDb250ZXh0KCkgewotCQlyZXR1cm4gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY3JlYXRlRU1GQ29udGV4dCh0aGlzLnByb2plY3QsIHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMucHJvamVjdDsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVzb3VyY2VJc0xvYWRlZENoYW5nZWQoUmVzb3VyY2UgYVJlc291cmNlLCBib29sZWFuIG9sZFZhbHVlLCBib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWlmICggISB0aGlzLmxpc3RlbmVyTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWludCBldmVudFR5cGU9IG5ld1ZhbHVlID8gSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50LlJFU09VUkNFX0xPQURFRCA6IEpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudC5SRVNPVVJDRV9VTkxPQURFRDsKLQkJCUpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudCBldnQgPSBuZXcgSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50KHRoaXMsIGV2ZW50VHlwZSk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZ0KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlMaXN0ZW5lcnMoSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50IGV2ZW50KSB7Ci0JCU5vdGlmeVJ1bm5lciBub3RpZmllciA9IG5ldyBOb3RpZnlSdW5uZXIoZXZlbnQpOyAKLQkJZm9yIChKcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJbm90aWZpZXIuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQkJU2FmZVJ1bm5lci5ydW4obm90aWZpZXIpOwotCQl9Ci0JfQotCQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlRWRpdChPYmplY3QgY29udGV4dCkgewotCQlJV29ya3NwYWNlIHdvcmsgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHRoaXMucmVzb3VyY2UpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlJRmlsZVtdIGZpbGVzID0geyBmaWxlIH07Ci0JCQlpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0JCQkJY29udGV4dCA9IElXb3Jrc3BhY2UuVkFMSURBVEVfUFJPTVBUOwotCQkJfQotCQkJcmV0dXJuIHdvcmsudmFsaWRhdGVFZGl0KGZpbGVzLCBjb250ZXh0KTsKLQkJfSAKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUVNRkNvbnRleHRDb250cmlidXRvciBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByaXZhdGUgYm9vbGVhbiBjb250cmlidXRlZFRvRW1mQ29udGV4dCA9IGZhbHNlOwotCQotCXB1YmxpYyB2b2lkIHByaW1hcnlDb250cmlidXRlVG9Db250ZXh0KEVNRldvcmtiZW5jaENvbnRleHRCYXNlIGNvbnRleHQpIHsKLQkJaWYgKCEgdGhpcy5jb250cmlidXRlZFRvRW1mQ29udGV4dCkgewotCQkJY29udGV4dC5nZXRSZXNvdXJjZVNldCgpLnNldFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5KFdUUFJlc291cmNlRmFjdG9yeVJlZ2lzdHJ5LklOU1RBTkNFKTsKLQkJCXRoaXMuY29udHJpYnV0ZWRUb0VtZkNvbnRleHQgPSB0cnVlOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlY29uZGFyeUNvbnRyaWJ1dGVUb0NvbnRleHQoRU1GV29ya2JlbmNoQ29udGV4dEJhc2UgYU5hdHVyZSkgewotCQkvLyBubyBvcAotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgZ2V0U3RhdGVWYWxpZGF0b3IoKSB7Ci0JCWlmICh0aGlzLnN0YXRlVmFsaWRhdG9yID09IG51bGwpIHsKLQkJCXRoaXMuc3RhdGVWYWxpZGF0b3IgPSBjcmVhdGVTdGF0ZVZhbGlkYXRvcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLnN0YXRlVmFsaWRhdG9yOwotCX0KLQkKLQlwcml2YXRlIFJlc291cmNlU3RhdGVWYWxpZGF0b3IgY3JlYXRlU3RhdGVWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgUmVzb3VyY2VTdGF0ZVZhbGlkYXRvckltcGwodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNoZWNrQWN0aXZhdGlvbihSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrQWN0aXZhdGlvbihwcmVzZW50ZXIpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgbG9zdEFjdGl2YXRpb24oUmVzb3VyY2VTdGF0ZVZhbGlkYXRvclByZXNlbnRlciBwcmVzZW50ZXIpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZ2V0U3RhdGVWYWxpZGF0b3IoKS5sb3N0QWN0aXZhdGlvbihwcmVzZW50ZXIpOwkKLQl9Ci0JCi0JcHVibGljIElTdGF0dXMgdmFsaWRhdGVTdGF0ZShSZXNvdXJjZVN0YXRlVmFsaWRhdG9yUHJlc2VudGVyIHByZXNlbnRlcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocHJlc2VudGVyID09IG51bGwpIHsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLnZhbGlkYXRlU3RhdGUocHJlc2VudGVyKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2hlY2tTYXZlKFJlc291cmNlU3RhdGVWYWxpZGF0b3JQcmVzZW50ZXIgcHJlc2VudGVyKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRTdGF0ZVZhbGlkYXRvcigpLmNoZWNrU2F2ZShwcmVzZW50ZXIpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjaGVja1JlYWRPbmx5KCkgewotCQlyZXR1cm4gZ2V0U3RhdGVWYWxpZGF0b3IoKS5jaGVja1JlYWRPbmx5KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogUmVzb3VyY2VTdGF0ZUlucHV0UHJvdmlkZXIgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewkKLQkJcmV0dXJuIHRoaXMucmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBnZXROb25SZXNvdXJjZUZpbGVzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0IGdldE5vblJlc291cmNlSW5jb25zaXN0ZW50RmlsZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3QgZ2V0UmVzb3VyY2VzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChnZXRYbWxSZXNvdXJjZSgpKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgY2FjaGVOb25SZXNvdXJjZVZhbGlkYXRlU3RhdGUoTGlzdCByb05vblJlc291cmNlRmlsZXMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG1lbWJlciBjbGFzc2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIGNsYXNzIFJlc291cmNlQWRhcHRlciBleHRlbmRzIEFkYXB0ZXJJbXBsIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQkJaWYgKCBub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCAmJiBub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKG51bGwpID09IFJlc291cmNlLlJFU09VUkNFX19JU19MT0FERUQpIHsKLQkJCQlyZXNvdXJjZUlzTG9hZGVkQ2hhbmdlZCgoUmVzb3VyY2UpIG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpLCBub3RpZmljYXRpb24uZ2V0T2xkQm9vbGVhblZhbHVlKCksIG5vdGlmaWNhdGlvbi5nZXROZXdCb29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBOb3RpZnlSdW5uZXIgaW1wbGVtZW50cyBJU2FmZVJ1bm5hYmxlIAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFYbWxSZXNvdXJjZVByb3ZpZGVyRXZlbnQgZXZlbnQ7Ci0JCQotCQlwcml2YXRlIEpwYVhtbFJlc291cmNlUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJCi0JCQotCQlwdWJsaWMgTm90aWZ5UnVubmVyKEpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudCBldmVudCkgewotCQkJQXNzZXJ0LmlzTm90TnVsbChldmVudCk7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihKcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWxpc3RlbmVyLm1vZGVsQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7IAotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXhjZXB0aW9uKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL0pwYVhtbFJlc291cmNlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL0pwYVhtbFJlc291cmNlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2MmMwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFYbWxSZXNvdXJjZVByb3ZpZGVyCi17Ci0JSnBhWG1sUmVzb3VyY2UgZ2V0WG1sUmVzb3VyY2UoKTsKLQkKLQlJU3RhdHVzIHZhbGlkYXRlRWRpdChPYmplY3QgY29udGV4dCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyRXZlbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL0pwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTFlMTUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL0pwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIEpwYVhtbFJlc291cmNlUHJvdmlkZXJFdmVudAotewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFU09VUkNFX0xPQURFRCA9IDB4MTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBSRVNPVVJDRV9VTkxPQURFRCA9IDB4MjsKLQkKLQkKLQlwcml2YXRlIEpwYVhtbFJlc291cmNlUHJvdmlkZXIgbW9kZWxQcm92aWRlcjsKLQkKLQlwcml2YXRlIGludCB0eXBlOwotCQotCQotCXB1YmxpYyBKcGFYbWxSZXNvdXJjZVByb3ZpZGVyRXZlbnQoSnBhWG1sUmVzb3VyY2VQcm92aWRlciBtb2RlbFByb3ZpZGVyLCBpbnQgZXZlbnRUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubW9kZWxQcm92aWRlciA9IG1vZGVsUHJvdmlkZXI7Ci0JCXRoaXMudHlwZSA9IGV2ZW50VHlwZTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYVhtbFJlc291cmNlUHJvdmlkZXIgZ2V0TW9kZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG1vZGVsUHJvdmlkZXI7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvSnBhWG1sUmVzb3VyY2VQcm92aWRlckxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ5NzdmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9KcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFYbWxSZXNvdXJjZVByb3ZpZGVyTGlzdGVuZXIKLQlleHRlbmRzIEV2ZW50TGlzdGVuZXIKLXsKLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSnBhWG1sUmVzb3VyY2VQcm92aWRlckV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQWNjZXNzVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9BY2Nlc3NUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjhlNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9BY2Nlc3NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSAyLjAgZW51bQotICogamF2YXgucGVyc2lzdGVuY2UuQWNjZXNzVHlwZQotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLS8vIFRPRE8gbW92ZSB0byBqcGEyIHBhY2thZ2U/IGN1cnJlbnRseSBpbnRlcnR3aW5lZCB3aXRoIDEuMCBjb2RlLi4uCi1wdWJsaWMgZW51bSBBY2Nlc3NUeXBlIHsKLQotCUZJRUxEKEpQQTJfMC5BQ0NFU1NfVFlQRV9fRklFTEQpLAotCVBST1BFUlRZKEpQQTJfMC5BQ0NFU1NfVFlQRV9fUFJPUEVSVFkpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JQWNjZXNzVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBBY2Nlc3NUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQWNjZXNzVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChBY2Nlc3NUeXBlIGFjY2Vzc1R5cGUgOiBBY2Nlc3NUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoYWNjZXNzVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGFjY2Vzc1R5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgewotCQlyZXR1cm4gKGFjY2Vzc1R5cGUgPT0gbnVsbCkgPyBudWxsIDogYWNjZXNzVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzgwMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuQXNzb2NpYXRpb25PdmVycmlkZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24KLQlleHRlbmRzIE92ZXJyaWRlQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREU7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEFzc29jaWF0aW9uT3ZlcnJpZGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmF0b3IgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlMaXN0SXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldEpvaW5Db2x1bW5zKCk7Ci0JCVN0cmluZyBKT0lOX0NPTFVNTlNfTElTVCA9ICJqb2luQ29sdW1ucyI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBBc3NvY2lhdGlvbk92ZXJyaWRlIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldEpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqLwotCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5BdChpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEFzc29jaWF0aW9uT3ZlcnJpZGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlKb2luQ29sdW1uQW5ub3RhdGlvbiBhZGRKb2luQ29sdW1uKGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgQXNzb2NpYXRpb25PdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTJiZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5BdHRyaWJ1dGVPdmVycmlkZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBPdmVycmlkZUFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkFUVFJJQlVURV9PVkVSUklERTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW4nIGVsZW1lbnQgb2YgdGhlIEF0dHJpYnV0ZU92ZXJyaWRlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlDb2x1bW5Bbm5vdGF0aW9uIGdldENvbHVtbigpOwotCQlTdHJpbmcgQ09MVU1OX1BST1BFUlRZID0gImNvbHVtbiI7IC8vJE5PTi1OTFMtMSQKLQotCUNvbHVtbkFubm90YXRpb24gZ2V0Tm9uTnVsbENvbHVtbigpOwotCi0JLyoqCi0JICogQWRkIHRoZSAnY29sdW1uJyBlbGVtZW50IHRvIHRoZSBBdHRyaWJ1dGVPdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqLwotCUNvbHVtbkFubm90YXRpb24gYWRkQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlICdjb2x1bW4nIGVsZW1lbnQgZnJvbSB0aGUgQXR0cmlidXRlT3ZlcnJpZGUgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbHVtbigpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOWQzZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb25zOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Q29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Sm9pbkNvbHVtbjwvY29kZT4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZUNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIE5hbWVkQ29sdW1uQW5ub3RhdGlvbgotewotCS8vICoqKioqKioqKiogdW5pcXVlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFVuaXF1ZSgpOwotCQlTdHJpbmcgVU5JUVVFX1BST1BFUlRZID0gInVuaXF1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VW5pcXVlKEJvb2xlYW4gdW5pcXVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndW5pcXVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFVuaXF1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vICoqKioqKioqKiogbnVsbGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdudWxsYWJsZScgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXROdWxsYWJsZSgpOwotCQlTdHJpbmcgTlVMTEFCTEVfUFJPUEVSVFkgPSAibnVsbGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ251bGxhYmxlJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiBudWxsYWJsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ251bGxhYmxlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE51bGxhYmxlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBpbnNlcnRhYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW5zZXJ0YWJsZScgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCk7Ci0JCVN0cmluZyBJTlNFUlRBQkxFX1BST1BFUlRZID0gImluc2VydGFibGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2luc2VydGFibGUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gaW5zZXJ0YWJsZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2luc2VydGFibGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0SW5zZXJ0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vICoqKioqKioqKiogdXBkYXRhYmxlICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndXBkYXRhYmxlJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlCb29sZWFuIGdldFVwZGF0YWJsZSgpOwotCQlTdHJpbmcgVVBEQVRBQkxFX1BST1BFUlRZID0gInVwZGF0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndXBkYXRhYmxlJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndXBkYXRhYmxlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFVwZGF0YWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vICoqKioqKioqKiogdGFibGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0YWJsZScgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFRhYmxlKCk7Ci0JCVN0cmluZyBUQUJMRV9QUk9QRVJUWSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndGFibGUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd0YWJsZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICd0YWJsZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlSm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhNGRkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2VKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb25zOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk1hcEtleUpvaW5Db2x1bW48L2NvZGU+Ci0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDMuMQotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJhc2VKb2luQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KLXsKLQkvLyAqKioqKioqKioqIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgKioqKioqKioqKgotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGVsZW1lbnQgb2YgdGhlIEpvaW5Db2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlTdHJpbmcgUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJyZWZlcmVuY2VkQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGVsZW1lbnQgb2YgdGhlIEpvaW5Db2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdyZWZlcmVuY2VkQ29sdW1uTmFtZScgZWxlbWVudC4gSWYgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBKb2luQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3JlZmVyZW5jZWRDb2x1bW5OYW1lJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHJlZmVyZW5jZWRDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQmFzZVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlVGFibGVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZTZmM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9CYXNlVGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb25zOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5UYWJsZTxjb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZTxjb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlPGNvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuQ29sbGVjdGlvblRhYmxlPGNvZGU+Ci0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmFzZVRhYmxlQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBhbm5vdGF0aW9uIGV4aXN0cyBpbiBKYXZhLgotCSAqLwotCWJvb2xlYW4gaXNTcGVjaWZpZWQoKTsKLQotCi0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2NoZW1hJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQkJU3RyaW5nIFNDSEVNQV9QUk9QRVJUWSA9ICJzY2hlbWEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U2NoZW1hKFN0cmluZyBzY2hlbWEpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzY2hlbWEnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpUYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTY2hlbWFUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnc2NoZW1hJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIHNjaGVtYVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvLyAqKioqKioqKioqIGNhdGFsb2cgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXRhbG9nJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0JCVN0cmluZyBDQVRBTE9HX1BST1BFUlRZID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQgb2YgdGhlICpUYWJsZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldENhdGFsb2coU3RyaW5nIGNhdGFsb2cpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdjYXRhbG9nJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdjYXRhbG9nJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIGNhdGFsb2dUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiB1bmlxdWUgY29uc3RyYWludHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTGlzdEl0ZXJhYmxlPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlRTX0xJU1QgPSAidW5pcXVlQ29uc3RyYWludHMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlpbnQgZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3VuaXF1ZUNvbnN0cmFpbnRzJyBlbGVtZW50IG9mIHRoZSAqVGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlICpUYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCVVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uIGFkZFVuaXF1ZUNvbnN0cmFpbnQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlICpUYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZVVuaXF1ZUNvbnN0cmFpbnQoaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgKlRhYmxlIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQmFzaWNBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Jhc2ljQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTNjYWJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQmFzaWNBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLkJhc2ljCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBCYXNpY0Fubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkJBU0lDOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdmZXRjaCcgZWxlbWVudCBvZiB0aGUgQmFzaWMgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUZldGNoVHlwZSBnZXRGZXRjaCgpOwotCQlTdHJpbmcgRkVUQ0hfUFJPUEVSVFkgPSAiZmV0Y2giOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZldGNoJyBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEZldGNoKEZldGNoVHlwZSBmZXRjaCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2ZldGNoJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQmFzaWMgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JQm9vbGVhbiBnZXRPcHRpb25hbCgpOwotCQlTdHJpbmcgT1BUSU9OQUxfUFJPUEVSVFkgPSAib3B0aW9uYWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ29wdGlvbmFsJyBlbGVtZW50IG9mIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gb3B0aW9uYWwpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdvcHRpb25hbCcgZWxlbWVudC4gIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBCYXNpYyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRPcHRpb25hbFRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQ2FzY2FkZVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQ2FzY2FkZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NlZDE0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Nhc2NhZGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIDEuMC8yLjAgZW51bQotICogamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgZW51bSBDYXNjYWRlVHlwZSB7Ci0KLQlBTEwoSlBBLkNBU0NBREVfVFlQRV9fQUxMKSwKLQlQRVJTSVNUKEpQQS5DQVNDQURFX1RZUEVfX1BFUlNJU1QpLAotCU1FUkdFKEpQQS5DQVNDQURFX1RZUEVfX01FUkdFKSwKLQlSRU1PVkUoSlBBLkNBU0NBREVfVFlQRV9fUkVNT1ZFKSwKLQlSRUZSRVNIKEpQQS5DQVNDQURFX1RZUEVfX1JFRlJFU0gpLAotCURFVEFDSChKUEEyXzAuQ0FTQ0FERV9UWVBFX19ERVRBQ0gpOyAvL2FkZGVkIGluIEpQQSAyLjAKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUNhc2NhZGVUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIENhc2NhZGVUeXBlW10gZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVzKE9iamVjdFtdIGphdmFBbm5vdGF0aW9uVmFsdWVzKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ0FTQ0FERV9UWVBFX0FSUkFZOwotCQl9Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlcy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIEVNUFRZX0NBU0NBREVfVFlQRV9BUlJBWTsKLQkJfQotCQkvL251bGxzIHdpbGwgZXhpc3QgaWYgdGhlcmUgaXMgYSB0eXBvIGluIG9uZSBvZiB0aGUgZW51bXMKLQkJamF2YUFubm90YXRpb25WYWx1ZXMgPSBBcnJheVRvb2xzLnJlbW92ZUFsbE9jY3VycmVuY2VzKGphdmFBbm5vdGF0aW9uVmFsdWVzLCBudWxsKTsKLQkJaW50IGxlbiA9IGphdmFBbm5vdGF0aW9uVmFsdWVzLmxlbmd0aDsKLQkJQ2FzY2FkZVR5cGVbXSBjYXNjYWRlVHlwZXMgPSBuZXcgQ2FzY2FkZVR5cGVbbGVuXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2FzY2FkZVR5cGVzW2ldID0gZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoamF2YUFubm90YXRpb25WYWx1ZXNbaV0pOwotCQl9Ci0JCXJldHVybiBjYXNjYWRlVHlwZXM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENhc2NhZGVUeXBlW10gRU1QVFlfQ0FTQ0FERV9UWVBFX0FSUkFZID0gbmV3IENhc2NhZGVUeXBlWzBdOwotCi0JcHVibGljIHN0YXRpYyBDYXNjYWRlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENhc2NhZGVUeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlmb3IgKENhc2NhZGVUeXBlIGNhc2NhZGVUeXBlIDogQ2FzY2FkZVR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChjYXNjYWRlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGNhc2NhZGVUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9KYXZhQW5ub3RhdGlvblZhbHVlcyhDYXNjYWRlVHlwZVtdIGNhc2NhZGVUeXBlcykgewotCQlpZiAoY2FzY2FkZVR5cGVzID09IG51bGwpIHsKLQkJCXJldHVybiBTdHJpbmdUb29scy5FTVBUWV9TVFJJTkdfQVJSQVk7Ci0JCX0KLQkJaW50IGxlbiA9IGNhc2NhZGVUeXBlcy5sZW5ndGg7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklOR19BUlJBWTsKLQkJfQotCi0JCVN0cmluZ1tdIGphdmFBbm5vdGF0aW9uVmFsdWVzID0gbmV3IFN0cmluZ1tsZW5dOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlqYXZhQW5ub3RhdGlvblZhbHVlc1tpXSA9IHRvSmF2YUFubm90YXRpb25WYWx1ZShjYXNjYWRlVHlwZXNbaV0pOwotCQl9Ci0JCXJldHVybiBqYXZhQW5ub3RhdGlvblZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoQ2FzY2FkZVR5cGUgY2FzY2FkZVR5cGUpIHsKLQkJcmV0dXJuIChjYXNjYWRlVHlwZSA9PSBudWxsKSA/IG51bGwgOiBjYXNjYWRlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0NvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVmYWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIENvbXBsZXRlQ29sdW1uQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuQ09MVU1OOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Db21wbGV0ZUNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQ29tcGxldGVDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4M2M0MDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Db21wbGV0ZUNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb25zOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Q29sdW1uPC9jb2RlPgotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wbGV0ZUNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIEJhc2VDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBsZW5ndGggKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdsZW5ndGgnIGVsZW1lbnQgb2YgdGhlIENvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSW50ZWdlciBnZXRMZW5ndGgoKTsKLQkJU3RyaW5nIExFTkdUSF9QUk9QRVJUWSA9ICJsZW5ndGgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2xlbmd0aCcgZWxlbWVudCBvZiB0aGUgQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbGVuZ3RoJyBlbGVtZW50LiBJZiBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIENvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRMZW5ndGhUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvLyAqKioqKioqKioqIHByZWNpc2lvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ByZWNpc2lvbicgZWxlbWVudCBvZiB0aGUgQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlJbnRlZ2VyIGdldFByZWNpc2lvbigpOwotCQlTdHJpbmcgUFJFQ0lTSU9OX1BST1BFUlRZID0gInByZWNpc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncHJlY2lzaW9uJyBlbGVtZW50IG9mIHRoZSBDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRQcmVjaXNpb24oSW50ZWdlciBwcmVjaXNpb24pOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdwcmVjaXNpb24nIGVsZW1lbnQuIElmIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgQ29sdW1uIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFByZWNpc2lvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vICoqKioqKioqKiogc2NhbGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzY2FsZScgZWxlbWVudCBvZiB0aGUgQ29sdW1uIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlJbnRlZ2VyIGdldFNjYWxlKCk7Ci0JCVN0cmluZyBTQ0FMRV9QUk9QRVJUWSA9ICJzY2FsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2NhbGUnIGVsZW1lbnQgb2YgdGhlIENvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFNjYWxlKEludGVnZXIgc2NhbGUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzY2FsZScgZWxlbWVudC4gSWYgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2NhbGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0NvbXBsZXRlSm9pbkNvbHVtbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQ29tcGxldGVKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE2NTQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvQ29tcGxldGVKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW48L2NvZGU+Ci0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXlKb2luQ29sdW1uPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcGxldGVKb2luQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgQmFzZUpvaW5Db2x1bW5Bbm5vdGF0aW9uLCBCYXNlQ29sdW1uQW5ub3RhdGlvbgotewotCS8vY29tYmluZSBpbnRlcmZhY2VzCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMjU1YzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JDb2x1bW48L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbgotCWV4dGVuZHMgTmFtZWRDb2x1bW5Bbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTjsKLQotCi0JLy8gKioqKioqKioqKiBkaXNjcmltaW5hdG9yIHR5cGUgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdkaXNjcmltaW5hdG9yVHlwZScgZWxlbWVudCBvZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9QUk9QRVJUWSA9ICJkaXNjcmltaW5hdG9yVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZGlzY3JpbWluYXRvclR5cGUnIGVsZW1lbnQgb2YgdGhlIERpc2NyaW1pbmF0b3JDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBTZXQgdGhlIHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpOwotCi0KLQkvLyAqKioqKioqKioqIGxlbmd0aCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2xlbmd0aCcgZWxlbWVudCBvZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSW50ZWdlciBnZXRMZW5ndGgoKTsKLQkJU3RyaW5nIExFTkdUSF9QUk9QRVJUWSA9ICJsZW5ndGgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2xlbmd0aCcgZWxlbWVudCBvZiB0aGUgRGlzY3JpbWluYXRvckNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFNldCB0aGUgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoSW50ZWdlciBsZW5ndGgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmODFhMzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGVudW0KLSAqIGphdmF4LnBlcnNpc3RlbmNlLkRpc2NyaW1pbmF0b3JUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgewotCi0JU1RSSU5HKEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX1NUUklORyksCi0JQ0hBUihKUEEuRElTQ1JJTUlOQVRPUl9UWVBFX19DSEFSKSwKLQlJTlRFR0VSKEpQQS5ESVNDUklNSU5BVE9SX1RZUEVfX0lOVEVHRVIpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JRGlzY3JpbWluYXRvclR5cGUoU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJaWYgKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQkJdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlID0gamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFBbm5vdGF0aW9uVmFsdWUoKSB7Ci0JCXJldHVybiB0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHN0YXRpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEaXNjcmltaW5hdG9yVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSA6IERpc2NyaW1pbmF0b3JUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoZGlzY3JpbWluYXRvclR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpLmVxdWFscyhqYXZhQW5ub3RhdGlvblZhbHVlKSkgewotCQkJCXJldHVybiBkaXNjcmltaW5hdG9yVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoRGlzY3JpbWluYXRvclR5cGUgZGlzY3JpbWluYXRvclR5cGUpIHsKLQkJcmV0dXJuIChkaXNjcmltaW5hdG9yVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkaXNjcmltaW5hdG9yVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjJiZDJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yVmFsdWUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUU7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBEaXNjcmltaW5hdG9yVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIERpc2NyaW1pbmF0b3JWYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIERpc2NyaW1pbmF0b3JWYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE5NDZjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5FTUJFRERBQkxFOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW1iZWRkZWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGE5ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRlZEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU1CRURERUQ7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MWVmYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9FbWJlZGRlZElkQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbWJlZGRlZElkCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBFbWJlZGRlZElkQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuRU1CRURERURfSUQ7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0VudGl0eUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW50aXR5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDJlOTI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW50aXR5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudGl0eUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkVOVElUWTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgRW50aXR5IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCQlTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSBFbnRpdHkgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEVudGl0eSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9FbnVtVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9FbnVtVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBkMTM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW51bVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBlbnVtCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5FbnVtVHlwZQotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBlbnVtIEVudW1UeXBlIHsKLQotCU9SRElOQUwoSlBBLkVOVU1fVFlQRV9fT1JESU5BTCksCi0JU1RSSU5HKEpQQS5FTlVNX1RZUEVfX1NUUklORyk7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0KLQlFbnVtVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBFbnVtVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVudW1UeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlmb3IgKEVudW1UeXBlIGVudW1UeXBlIDogRW51bVR5cGUudmFsdWVzKCkpIHsKLQkJCWlmIChlbnVtVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGVudW1UeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShFbnVtVHlwZSBlbnVtVHlwZSkgewotCQlyZXR1cm4gKGVudW1UeXBlID09IG51bGwpID8gbnVsbCA6IGVudW1UeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZEFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwZjRkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0VudW1lcmF0ZWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLkVudW1lcmF0ZWQKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVudW1lcmF0ZWRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5FTlVNRVJBVEVEOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgRW51bWVyYXRlZCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JRW51bVR5cGUgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIEVudW1lcmF0ZWQgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShFbnVtVHlwZSB2YWx1ZSk7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBFbnVtZXJhdGVkIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvRmV0Y2hUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTY4MzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9GZXRjaFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBlbnVtCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5GZXRjaFR5cGUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgZW51bSBGZXRjaFR5cGUgewotCi0JRUFHRVIoSlBBLkZFVENIX1RZUEVfX0VBR0VSKSwKLQlMQVpZKEpQQS5GRVRDSF9UWVBFX19MQVpZKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUZldGNoVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBGZXRjaFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGZXRjaFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoRmV0Y2hUeXBlIGZldGNoVHlwZSA6IEZldGNoVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGZldGNoVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIGZldGNoVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoRmV0Y2hUeXBlIGZldGNoVHlwZSkgewotCQlyZXR1cm4gKGZldGNoVHlwZSA9PSBudWxsKSA/IG51bGwgOiBmZXRjaFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Y2Q0OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuR2VuZXJhdGVkVmFsdWUKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuR0VORVJBVEVEX1ZBTFVFOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdzdHJhdGVneScgZWxlbWVudCBvZiB0aGUgR2VuZXJhdGVkVmFsdWUgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUdlbmVyYXRpb25UeXBlIGdldFN0cmF0ZWd5KCk7Ci0JCVN0cmluZyBTVFJBVEVHWV9QUk9QRVJUWSA9ICJzdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc3RyYXRlZ3knIGVsZW1lbnQgb2YgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUgc3RyYXRlZ3kpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdzdHJhdGVneScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFN0cmF0ZWd5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdnZW5lcmF0b3InIGVsZW1lbnQgb2YgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0R2VuZXJhdG9yKCk7Ci0JCVN0cmluZyBHRU5FUkFUT1JfUFJPUEVSVFkgPSAiZ2VuZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdnZW5lcmF0b3InIGVsZW1lbnQgb2YgdGhlIEdlbmVyYXRlZFZhbHVlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0R2VuZXJhdG9yKFN0cmluZyBnZW5lcmF0b3IpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdnZW5lcmF0b3InIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBHZW5lcmF0ZWRWYWx1ZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRHZW5lcmF0b3JUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnZ2VuZXJhdG9yJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIGdlbmVyYXRvclRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRpb25UeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MDdhMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0aW9uVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGVudW0KLSAqIGphdmF4LnBlcnNpc3RlbmNlLkdlbmVyYXRpb25UeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGVudW0gR2VuZXJhdGlvblR5cGUgewotCi0JVEFCTEUoSlBBLkdFTkVSQVRJT05fVFlQRV9fVEFCTEUpLAotCVNFUVVFTkNFKEpQQS5HRU5FUkFUSU9OX1RZUEVfX1NFUVVFTkNFKSwKLQlJREVOVElUWShKUEEuR0VORVJBVElPTl9UWVBFX19JREVOVElUWSksCi0JQVVUTyhKUEEuR0VORVJBVElPTl9UWVBFX19BVVRPKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCUdlbmVyYXRpb25UeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIEdlbmVyYXRpb25UeXBlIGZyb21KYXZhQW5ub3RhdGlvblZhbHVlKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCXJldHVybiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSA/IG51bGwgOiBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oamF2YUFubm90YXRpb25WYWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgR2VuZXJhdGlvblR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoR2VuZXJhdGlvblR5cGUgZ2VuZXJhdGlvblR5cGUgOiBHZW5lcmF0aW9uVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKGdlbmVyYXRpb25UeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gZ2VuZXJhdGlvblR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdG9KYXZhQW5ub3RhdGlvblZhbHVlKEdlbmVyYXRpb25UeXBlIGdlbmVyYXRpb25UeXBlKSB7Ci0JCXJldHVybiAoZ2VuZXJhdGlvblR5cGUgPT0gbnVsbCkgPyBudWxsIDogZ2VuZXJhdGlvblR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9HZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRvckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0YjFlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0dlbmVyYXRvckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvbW1vbiBwcm90b2NvbCBhbW9uZwotICogICAgIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yCi0gKiAgICAgamF2YXgucGVyc2lzdGVuY2UuVGFibGVHZW5lcmF0b3IKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEdlbmVyYXRvckFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaW5pdGlhbFZhbHVlJyBlbGVtZW50IG9mIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpOwotCQlTdHJpbmcgSU5JVElBTF9WQUxVRV9QUk9QRVJUWSA9ICJpbml0aWFsVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2luaXRpYWxWYWx1ZScgZWxlbWVudCBvZiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIGluaXRpYWxWYWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2luaXRpYWxWYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0SW5pdGlhbFZhbHVlVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdhbGxvY2F0aW9uU2l6ZScgZWxlbWVudCBvZiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpOwotCQlTdHJpbmcgQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZID0gImFsbG9jYXRpb25TaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdhbGxvY2F0aW9uU2l6ZScgZWxlbWVudCBvZiB0aGUgKkdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldEFsbG9jYXRpb25TaXplKEludGVnZXIgYWxsb2NhdGlvblNpemUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdhbGxvY2F0aW9uU2l6ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0QWxsb2NhdGlvblNpemVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvSWRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0lkQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzI3MzZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvSWRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLklkCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJZEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLklEOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9JZENsYXNzQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9JZENsYXNzQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDVlMTM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvSWRDbGFzc0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuSWRDbGFzcwotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSWRDbGFzc0Fubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLklEX0NMQVNTOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgSWRDbGFzcyBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICogUmV0dXJuIHRoZSBwb3J0aW9uIG9mIHRoZSB2YWx1ZSBwcmVjZWRpbmcgIi5jbGFzcyIuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtJZENsYXNzKHZhbHVlPUVtcGxveWVlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQkJU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgSWRDbGFzcyBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgSWRDbGFzcyBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZ1bGx5LXF1YWxpZmllZCBJRCBjbGFzcyBuYW1lIGFzIHJlc29sdmVkIGJ5IHRoZQotCSAqIEFTVCdzIGJpbmRpbmdzLgotCSAqIDxwcmU+Ci0JICogICAgICYjNjQ7SWRDbGFzcyhFbXBsb3llZS5jbGFzcykKLQkgKiA8L3ByZT4KLQkgKiB3aWxsIHJldHVybiA8Y29kZT4ibW9kZWwuRW1wbG95ZWUiPC9jb2RlPiBpZiB0aGVyZSBpcyBhbiBpbXBvcnQgZm9yCi0JICogPGNvZGU+bW9kZWwuRW1wbG95ZWU8L2NvZGU+LgotCSAqLwotCVN0cmluZyBnZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMGY1ZGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Jbmhlcml0YW5jZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuSW5oZXJpdGFuY2UKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluaGVyaXRhbmNlQW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuSU5IRVJJVEFOQ0U7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3N0cmF0ZWd5JyBlbGVtZW50IG9mIHRoZSBJbmhlcml0YW5jZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCk7Ci0JCVN0cmluZyBTVFJBVEVHWV9QUk9QRVJUWSA9ICJzdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc3RyYXRlZ3knIGVsZW1lbnQgb2YgdGhlIEluaGVyaXRhbmNlIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlIHN0cmF0ZWd5KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc3RyYXRlZ3knIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBJbmhlcml0YW5jZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTYwNTc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgZW51bQotICogamF2YXgucGVyc2lzdGVuY2UuSW5oZXJpdGFuY2VUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGVudW0gSW5oZXJpdGFuY2VUeXBlIHsKLQotCVNJTkdMRV9UQUJMRShKUEEuSU5IRVJJVEFOQ0VfVFlQRV9fU0lOR0xFX1RBQkxFKSwKLQlKT0lORUQoSlBBLklOSEVSSVRBTkNFX1RZUEVfX0pPSU5FRCksCi0JVEFCTEVfUEVSX0NMQVNTKEpQQS5JTkhFUklUQU5DRV9UWVBFX19UQUJMRV9QRVJfQ0xBU1MpOwotCi0KLQlwcml2YXRlIFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlOwotCi0JSW5oZXJpdGFuY2VUeXBlKFN0cmluZyBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWlmIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuamF2YUFubm90YXRpb25WYWx1ZSA9IGphdmFBbm5vdGF0aW9uVmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy5qYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIEluaGVyaXRhbmNlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZShPYmplY3QgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlyZXR1cm4gKGphdmFBbm5vdGF0aW9uVmFsdWUgPT0gbnVsbCkgPyBudWxsIDogZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKGphdmFBbm5vdGF0aW9uVmFsdWUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEluaGVyaXRhbmNlVHlwZSBmcm9tSmF2YUFubm90YXRpb25WYWx1ZV8oT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJZm9yIChJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlIDogSW5oZXJpdGFuY2VUeXBlLnZhbHVlcygpKSB7Ci0JCQlpZiAoaW5oZXJpdGFuY2VUeXBlLmdldEphdmFBbm5vdGF0aW9uVmFsdWUoKS5lcXVhbHMoamF2YUFubm90YXRpb25WYWx1ZSkpIHsKLQkJCQlyZXR1cm4gaW5oZXJpdGFuY2VUeXBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvSmF2YUFubm90YXRpb25WYWx1ZShJbmhlcml0YW5jZVR5cGUgaW5oZXJpdGFuY2VUeXBlKSB7Ci0JCXJldHVybiAoaW5oZXJpdGFuY2VUeXBlID09IG51bGwpID8gbnVsbCA6IGluaGVyaXRhbmNlVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0pQQS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9KUEEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFjMmNlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0pQQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogSlBBIEphdmEtcmVsYXRlZCBzdHVmZiAoYW5ub3RhdGlvbnMgZXRjLikKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgSlBBIHsKLQotCS8vIEpQQSBwYWNrYWdlCi0JU3RyaW5nIFBBQ0tBR0UgPSAiamF2YXgucGVyc2lzdGVuY2UiOwotCVN0cmluZyBQQUNLQUdFXyA9IFBBQ0tBR0UgKyAnLic7Ci0KLQotCS8vICoqKioqKioqKiogQVBJICoqKioqKioqKioKLQotCS8vIEpQQSBhbm5vdGF0aW9ucwotCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERSA9IFBBQ0tBR0VfICsgIkFzc29jaWF0aW9uT3ZlcnJpZGUiOwotCQlTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TID0gImpvaW5Db2x1bW5zIjsKLQlTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gUEFDS0FHRV8gKyAiQXNzb2NpYXRpb25PdmVycmlkZXMiOwotCQlTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERSA9IFBBQ0tBR0VfICsgIkF0dHJpYnV0ZU92ZXJyaWRlIjsKLQkJU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OID0gImNvbHVtbiI7Ci0JU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERVMgPSBQQUNLQUdFXyArICJBdHRyaWJ1dGVPdmVycmlkZXMiOwotCQlTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBCQVNJQyA9IFBBQ0tBR0VfICsgIkJhc2ljIjsKLQkJU3RyaW5nIEJBU0lDX19GRVRDSCA9ICJmZXRjaCI7Ci0JCVN0cmluZyBCQVNJQ19fT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotCVN0cmluZyBDT0xVTU4gPSBQQUNLQUdFXyArICJDb2x1bW4iOwotCQlTdHJpbmcgQ09MVU1OX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgQ09MVU1OX19VTklRVUUgPSAidW5pcXVlIjsKLQkJU3RyaW5nIENPTFVNTl9fTlVMTEFCTEUgPSAibnVsbGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19JTlNFUlRBQkxFID0gImluc2VydGFibGUiOwotCQlTdHJpbmcgQ09MVU1OX19VUERBVEFCTEUgPSAidXBkYXRhYmxlIjsKLQkJU3RyaW5nIENPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0JCVN0cmluZyBDT0xVTU5fX1RBQkxFID0gInRhYmxlIjsKLQkJU3RyaW5nIENPTFVNTl9fTEVOR1RIID0gImxlbmd0aCI7Ci0JCVN0cmluZyBDT0xVTU5fX1BSRUNJU0lPTiA9ICJwcmVjaXNpb24iOwotCQlTdHJpbmcgQ09MVU1OX19TQ0FMRSA9ICJzY2FsZSI7Ci0JU3RyaW5nIENPTFVNTl9SRVNVTFQgPSBQQUNLQUdFXyArICJDb2x1bW5SZXN1bHQiOwotCQlTdHJpbmcgQ09MVU1OX1JFU1VMVF9fTkFNRSA9ICJuYW1lIjsKLQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBQQUNLQUdFXyArICJEaXNjcmltaW5hdG9yQ29sdW1uIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSA9ICJkaXNjcmltaW5hdG9yVHlwZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIID0gImxlbmd0aCI7Ci0JU3RyaW5nIERJU0NSSU1JTkFUT1JfVkFMVUUgPSBQQUNLQUdFXyArICJEaXNjcmltaW5hdG9yVmFsdWUiOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9WQUxVRV9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBFTUJFRERBQkxFID0gUEFDS0FHRV8gKyAiRW1iZWRkYWJsZSI7Ci0JU3RyaW5nIEVNQkVEREVEID0gUEFDS0FHRV8gKyAiRW1iZWRkZWQiOwotCVN0cmluZyBFTUJFRERFRF9JRCA9IFBBQ0tBR0VfICsgIkVtYmVkZGVkSWQiOwotCVN0cmluZyBFTlRJVFkgPSBQQUNLQUdFXyArICJFbnRpdHkiOwotCQlTdHJpbmcgRU5USVRZX19OQU1FID0gIm5hbWUiOwotCVN0cmluZyBFTlRJVFlfTElTVEVORVJTID0gUEFDS0FHRV8gKyAiRW50aXR5TGlzdGVuZXJzIjsKLQkJU3RyaW5nIEVOVElUWV9MSVNURU5FUlNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgRU5USVRZX1JFU1VMVCA9IFBBQ0tBR0VfICsgIkVudGl0eVJlc3VsdCI7Ci0JCVN0cmluZyBFTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1MgPSAiZW50aXR5Q2xhc3MiOwotCQlTdHJpbmcgRU5USVRZX1JFU1VMVF9fRklFTERTID0gImZpZWxkcyI7Ci0JCVN0cmluZyBFTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9ICJkaXNjcmltaW5hdG9yQ29sdW1uIjsKLQlTdHJpbmcgRU5VTUVSQVRFRCA9IFBBQ0tBR0VfICsgIkVudW1lcmF0ZWQiOwotCQlTdHJpbmcgRU5VTUVSQVRFRF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTID0gUEFDS0FHRV8gKyAiRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiOwotCVN0cmluZyBFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gUEFDS0FHRV8gKyAiRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMiOwotCVN0cmluZyBGSUVMRF9SRVNVTFQgPSBQQUNLQUdFXyArICJGaWVsZFJlc3VsdCI7Ci0JCVN0cmluZyBGSUVMRF9SRVNVTFRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBGSUVMRF9SRVNVTFRfX0NPTFVNTiA9ICJjb2x1bW4iOwotCVN0cmluZyBGTFVTSF9NT0RFID0gUEFDS0FHRV8gKyAiRmx1c2hNb2RlIjsKLQkJU3RyaW5nIEZMVVNIX01PREVfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgR0VORVJBVEVEX1ZBTFVFID0gUEFDS0FHRV8gKyAiR2VuZXJhdGVkVmFsdWUiOwotCQlTdHJpbmcgR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWSA9ICJzdHJhdGVneSI7Ci0JCVN0cmluZyBHRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUiA9ICJnZW5lcmF0b3IiOwotCVN0cmluZyBJRCA9IFBBQ0tBR0VfICsgIklkIjsKLQlTdHJpbmcgSURfQ0xBU1MgPSBQQUNLQUdFXyArICJJZENsYXNzIjsKLQkJU3RyaW5nIElEX0NMQVNTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIElOSEVSSVRBTkNFID0gUEFDS0FHRV8gKyAiSW5oZXJpdGFuY2UiOwotCQlTdHJpbmcgSU5IRVJJVEFOQ0VfX1NUUkFURUdZID0gInN0cmF0ZWd5IjsKLQlTdHJpbmcgSk9JTl9DT0xVTU4gPSBQQUNLQUdFXyArICJKb2luQ29sdW1uIjsKLQkJU3RyaW5nIEpPSU5fQ09MVU1OX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAicmVmZXJlbmNlZENvbHVtbk5hbWUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX1VOSVFVRSA9ICJ1bmlxdWUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX05VTExBQkxFID0gIm51bGxhYmxlIjsKLQkJU3RyaW5nIEpPSU5fQ09MVU1OX19JTlNFUlRBQkxFID0gImluc2VydGFibGUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX1VQREFUQUJMRSA9ICJ1cGRhdGFibGUiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gImNvbHVtbkRlZmluaXRpb24iOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5fX1RBQkxFID0gInRhYmxlIjsKLQlTdHJpbmcgSk9JTl9DT0xVTU5TID0gUEFDS0FHRV8gKyAiSm9pbkNvbHVtbnMiOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5TX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIEpPSU5fVEFCTEUgPSBQQUNLQUdFXyArICJKb2luVGFibGUiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19TQ0hFTUEgPSAic2NoZW1hIjsKLQkJU3RyaW5nIEpPSU5fVEFCTEVfX0pPSU5fQ09MVU1OUyA9ICJqb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBKT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyA9ICJpbnZlcnNlSm9pbkNvbHVtbnMiOwotCQlTdHJpbmcgSk9JTl9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gInVuaXF1ZUNvbnN0cmFpbnRzIjsKLQlTdHJpbmcgTE9CID0gUEFDS0FHRV8gKyAiTG9iIjsKLQlTdHJpbmcgTUFOWV9UT19NQU5ZID0gUEFDS0FHRV8gKyAiTWFueVRvTWFueSI7Ci0JCVN0cmluZyBNQU5ZX1RPX01BTllfX1RBUkdFVF9FTlRJVFkgPSAidGFyZ2V0RW50aXR5IjsKLQkJU3RyaW5nIE1BTllfVE9fTUFOWV9fQ0FTQ0FERSA9ICJjYXNjYWRlIjsKLQkJU3RyaW5nIE1BTllfVE9fTUFOWV9fRkVUQ0ggPSAiZmV0Y2giOwotCQlTdHJpbmcgTUFOWV9UT19NQU5ZX19NQVBQRURfQlkgPSAibWFwcGVkQnkiOwotCVN0cmluZyBNQU5ZX1RPX09ORSA9IFBBQ0tBR0VfICsgIk1hbnlUb09uZSI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9ICJ0YXJnZXRFbnRpdHkiOwotCQlTdHJpbmcgTUFOWV9UT19PTkVfX0NBU0NBREUgPSAiY2FzY2FkZSI7Ci0JCVN0cmluZyBNQU5ZX1RPX09ORV9fRkVUQ0ggPSAiZmV0Y2giOwotCQlTdHJpbmcgTUFOWV9UT19PTkVfX09QVElPTkFMID0gIm9wdGlvbmFsIjsKLQlTdHJpbmcgTUFQX0tFWSA9IFBBQ0tBR0VfICsgIk1hcEtleSI7Ci0JCVN0cmluZyBNQVBfS0VZX19OQU1FID0gIm5hbWUiOwotCVN0cmluZyBNQVBQRURfU1VQRVJDTEFTUyA9IFBBQ0tBR0VfICsgIk1hcHBlZFN1cGVyY2xhc3MiOwotCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUklFUyA9IFBBQ0tBR0VfICsgIk5hbWVkTmF0aXZlUXVlcmllcyI7Ci0JCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUklFU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUlkgPSBQQUNLQUdFXyArICJOYW1lZE5hdGl2ZVF1ZXJ5IjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIE5BTUVEX05BVElWRV9RVUVSWV9fUVVFUlkgPSAicXVlcnkiOwotCQlTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZX19ISU5UUyA9ICJoaW50cyI7Ci0JCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9DTEFTUyA9ICJyZXN1bHRDbGFzcyI7Ci0JCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHRTZXRNYXBwaW5nIjsKLQlTdHJpbmcgTkFNRURfUVVFUklFUyA9IFBBQ0tBR0VfICsgIk5hbWVkUXVlcmllcyI7Ci0JCVN0cmluZyBOQU1FRF9RVUVSSUVTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIE5BTUVEX1FVRVJZID0gUEFDS0FHRV8gKyAiTmFtZWRRdWVyeSI7Ci0JCVN0cmluZyBOQU1FRF9RVUVSWV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIE5BTUVEX1FVRVJZX19RVUVSWSA9ICJxdWVyeSI7Ci0JCVN0cmluZyBOQU1FRF9RVUVSWV9fSElOVFMgPSAiaGludHMiOwotCVN0cmluZyBPTkVfVE9fTUFOWSA9IFBBQ0tBR0VfICsgIk9uZVRvTWFueSI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fVEFSR0VUX0VOVElUWSA9ICJ0YXJnZXRFbnRpdHkiOwotCQlTdHJpbmcgT05FX1RPX01BTllfX0NBU0NBREUgPSAiY2FzY2FkZSI7Ci0JCVN0cmluZyBPTkVfVE9fTUFOWV9fRkVUQ0ggPSAiZmV0Y2giOwotCQlTdHJpbmcgT05FX1RPX01BTllfX01BUFBFRF9CWSA9ICJtYXBwZWRCeSI7Ci0JU3RyaW5nIE9ORV9UT19PTkUgPSBQQUNLQUdFXyArICJPbmVUb09uZSI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19UQVJHRVRfRU5USVRZID0gInRhcmdldEVudGl0eSI7Ci0JCVN0cmluZyBPTkVfVE9fT05FX19DQVNDQURFID0gImNhc2NhZGUiOwotCQlTdHJpbmcgT05FX1RPX09ORV9fRkVUQ0ggPSAiZmV0Y2giOwotCQlTdHJpbmcgT05FX1RPX09ORV9fT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotCQlTdHJpbmcgT05FX1RPX09ORV9fTUFQUEVEX0JZID0gIm1hcHBlZEJ5IjsKLQlTdHJpbmcgT1JERVJfQlkgPSBQQUNLQUdFXyArICJPcmRlckJ5IjsKLQkJU3RyaW5nIE9SREVSX0JZX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFQgPSBQQUNLQUdFXyArICJQZXJzaXN0ZW5jZUNvbnRleHQiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfX1VOSVRfTkFNRSA9ICJ1bml0TmFtZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUX19UWVBFID0gInR5cGUiOwotCVN0cmluZyBQRVJTSVNURU5DRV9DT05URVhUUyA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlQ29udGV4dHMiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVFNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVCA9IFBBQ0tBR0VfICsgIlhtbFBlcnNpc3RlbmNlVW5pdCI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9fVU5JVF9OQU1FID0gInVuaXROYW1lIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVFMgPSBQQUNLQUdFXyArICJQZXJzaXN0ZW5jZVVuaXRzIjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRTX19WQUxVRSA9ICJ2YWx1ZSI7Ci0JU3RyaW5nIFBPU1RfTE9BRCA9IFBBQ0tBR0VfICsgIlBvc3RMb2FkIjsKLQlTdHJpbmcgUE9TVF9QRVJTSVNUID0gUEFDS0FHRV8gKyAiUG9zdFBlcnNpc3QiOwotCVN0cmluZyBQT1NUX1JFTU9WRSA9IFBBQ0tBR0VfICsgIlBvc3RSZW1vdmUiOwotCVN0cmluZyBQT1NUX1VQREFURSA9IFBBQ0tBR0VfICsgIlBvc3RVcGRhdGUiOwotCVN0cmluZyBQUkVfUEVSU0lTVCA9IFBBQ0tBR0VfICsgIlByZVBlcnNpc3QiOwotCVN0cmluZyBQUkVfUkVNT1ZFID0gUEFDS0FHRV8gKyAiUHJlUmVtb3ZlIjsKLQlTdHJpbmcgUFJFX1VQREFURSA9IFBBQ0tBR0VfICsgIlByZVVwZGF0ZSI7Ci0JU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gUEFDS0FHRV8gKyAiUHJpbWFyeUtleUpvaW5Db2x1bW4iOwotCQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJyZWZlcmVuY2VkQ29sdW1uTmFtZSI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0JU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IFBBQ0tBR0VfICsgIlByaW1hcnlLZXlKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgUVVFUllfSElOVCA9IFBBQ0tBR0VfICsgIlF1ZXJ5SGludCI7Ci0JCVN0cmluZyBRVUVSWV9ISU5UX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgUVVFUllfSElOVF9fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBTRUNPTkRBUllfVEFCTEUgPSBQQUNLQUdFXyArICJTZWNvbmRhcnlUYWJsZSI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVfX0NBVEFMT0cgPSAiY2F0YWxvZyI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgU0VDT05EQVJZX1RBQkxFX19QS19KT0lOX0NPTFVNTlMgPSAicGtKb2luQ29sdW1ucyI7Ci0JCVN0cmluZyBTRUNPTkRBUllfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9ICJ1bmlxdWVDb25zdHJhaW50cyI7Ci0JU3RyaW5nIFNFQ09OREFSWV9UQUJMRVMgPSBQQUNLQUdFXyArICJTZWNvbmRhcnlUYWJsZXMiOwotCQlTdHJpbmcgU0VDT05EQVJZX1RBQkxFU19fVkFMVUUgPSAidmFsdWUiOwotCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1IgPSBQQUNLQUdFXyArICJTZXF1ZW5jZUdlbmVyYXRvciI7Ci0JCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBTRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUUgPSAic2VxdWVuY2VOYW1lIjsKLQkJU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSA9ICJpbml0aWFsVmFsdWUiOwotCQlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSAiYWxsb2NhdGlvblNpemUiOwotCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HID0gUEFDS0FHRV8gKyAiU3FsUmVzdWx0U2V0TWFwcGluZyI7Ci0JCVN0cmluZyBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FID0gIm5hbWUiOwotCQlTdHJpbmcgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRJRVMgPSAiZW50aXRpZXMiOwotCQlTdHJpbmcgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OUyA9ICJjb2x1bW5zIjsKLQlTdHJpbmcgVEFCTEUgPSBQQUNLQUdFXyArICJUYWJsZSI7Ci0JCVN0cmluZyBUQUJMRV9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFRBQkxFX19DQVRBTE9HID0gImNhdGFsb2ciOwotCQlTdHJpbmcgVEFCTEVfX1NDSEVNQSA9ICJzY2hlbWEiOwotCQlTdHJpbmcgVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyA9ICJ1bmlxdWVDb25zdHJhaW50cyI7Ci0JU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9IFBBQ0tBR0VfICsgIlRhYmxlR2VuZXJhdG9yIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fTkFNRSA9ICJuYW1lIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fVEFCTEUgPSAidGFibGUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HID0gImNhdGFsb2ciOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19TQ0hFTUEgPSAic2NoZW1hIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUUgPSAicGtDb2x1bW5OYW1lIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUgPSAidmFsdWVDb2x1bW5OYW1lIjsKLQkJU3RyaW5nIFRBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFID0gInBrQ29sdW1uVmFsdWUiOwotCQlTdHJpbmcgVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFID0gImluaXRpYWxWYWx1ZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSA9ICJhbGxvY2F0aW9uU2l6ZSI7Ci0JCVN0cmluZyBUQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUyA9ICJ1bmlxdWVDb25zdHJhaW50cyI7Ci0JU3RyaW5nIFRFTVBPUkFMID0gUEFDS0FHRV8gKyAiVGVtcG9yYWwiOwotCQlTdHJpbmcgVEVNUE9SQUxfX1ZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgVFJBTlNJRU5UID0gUEFDS0FHRV8gKyAiVHJhbnNpZW50IjsKLQlTdHJpbmcgVU5JUVVFX0NPTlNUUkFJTlQgPSBQQUNLQUdFXyArICJVbmlxdWVDb25zdHJhaW50IjsKLQkJU3RyaW5nIFVOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVMgPSAiY29sdW1uTmFtZXMiOwotCVN0cmluZyBWRVJTSU9OID0gUEFDS0FHRV8gKyAiVmVyc2lvbiI7Ci0KLQkvLyBKUEEgZW51bXMKLQlTdHJpbmcgQ0FTQ0FERV9UWVBFID0gUEFDS0FHRV8gKyAiQ2FzY2FkZVR5cGUiOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFXyA9IENBU0NBREVfVFlQRSArICcuJzsKLQkJU3RyaW5nIENBU0NBREVfVFlQRV9fQUxMID0gQ0FTQ0FERV9UWVBFXyArICJBTEwiOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19NRVJHRSA9IENBU0NBREVfVFlQRV8gKyAiTUVSR0UiOwotCQlTdHJpbmcgQ0FTQ0FERV9UWVBFX19QRVJTSVNUID0gQ0FTQ0FERV9UWVBFXyArICJQRVJTSVNUIjsKLQkJU3RyaW5nIENBU0NBREVfVFlQRV9fUkVGUkVTSCA9IENBU0NBREVfVFlQRV8gKyAiUkVGUkVTSCI7Ci0JCVN0cmluZyBDQVNDQURFX1RZUEVfX1JFTU9WRSA9IENBU0NBREVfVFlQRV8gKyAiUkVNT1ZFIjsKLQotCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEUgPSBQQUNLQUdFXyArICJEaXNjcmltaW5hdG9yVHlwZSI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEVfID0gRElTQ1JJTUlOQVRPUl9UWVBFICsgJy4nOwotCQlTdHJpbmcgRElTQ1JJTUlOQVRPUl9UWVBFX19DSEFSID0gRElTQ1JJTUlOQVRPUl9UWVBFXyArICJDSEFSIjsKLQkJU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRV9fSU5URUdFUiA9IERJU0NSSU1JTkFUT1JfVFlQRV8gKyAiSU5URUdFUiI7Ci0JCVN0cmluZyBESVNDUklNSU5BVE9SX1RZUEVfX1NUUklORyA9IERJU0NSSU1JTkFUT1JfVFlQRV8gKyAiU1RSSU5HIjsKLQotCVN0cmluZyBFTlVNX1RZUEUgPSBQQUNLQUdFXyArICJFbnVtVHlwZSI7Ci0JCVN0cmluZyBFTlVNX1RZUEVfID0gRU5VTV9UWVBFICsgJy4nOwotCQlTdHJpbmcgRU5VTV9UWVBFX19PUkRJTkFMID0gRU5VTV9UWVBFXyArICJPUkRJTkFMIjsKLQkJU3RyaW5nIEVOVU1fVFlQRV9fU1RSSU5HID0gRU5VTV9UWVBFXyArICJTVFJJTkciOwotCi0JU3RyaW5nIEZFVENIX1RZUEUgPSBQQUNLQUdFXyArICJGZXRjaFR5cGUiOwotCQlTdHJpbmcgRkVUQ0hfVFlQRV8gPSBGRVRDSF9UWVBFICsgJy4nOwotCQlTdHJpbmcgRkVUQ0hfVFlQRV9fRUFHRVIgPSBGRVRDSF9UWVBFXyArICJFQUdFUiI7Ci0JCVN0cmluZyBGRVRDSF9UWVBFX19MQVpZID0gRkVUQ0hfVFlQRV8gKyAiTEFaWSI7Ci0KLQlTdHJpbmcgRkxVU0hfTU9ERV9UWVBFID0gUEFDS0FHRV8gKyAiRmx1c2hNb2RlVHlwZSI7Ci0JCVN0cmluZyBGTFVTSF9NT0RFX1RZUEVfID0gRkxVU0hfTU9ERV9UWVBFICsgJy4nOwotCQlTdHJpbmcgRkxVU0hfTU9ERV9UWVBFX19BVVRPID0gRkxVU0hfTU9ERV9UWVBFXyArICJBVVRPIjsKLQkJU3RyaW5nIEZMVVNIX01PREVfVFlQRV9fQ09NTUlUID0gRkxVU0hfTU9ERV9UWVBFXyArICJDT01NSVQiOwotCi0JU3RyaW5nIEdFTkVSQVRJT05fVFlQRSA9IFBBQ0tBR0VfICsgIkdlbmVyYXRpb25UeXBlIjsKLQkJU3RyaW5nIEdFTkVSQVRJT05fVFlQRV8gPSBHRU5FUkFUSU9OX1RZUEUgKyAnLic7Ci0JCVN0cmluZyBHRU5FUkFUSU9OX1RZUEVfX0FVVE8gPSBHRU5FUkFUSU9OX1RZUEVfICsgIkFVVE8iOwotCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFX19JREVOVElUWSA9IEdFTkVSQVRJT05fVFlQRV8gKyAiSURFTlRJVFkiOwotCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFX19TRVFVRU5DRSA9IEdFTkVSQVRJT05fVFlQRV8gKyAiU0VRVUVOQ0UiOwotCQlTdHJpbmcgR0VORVJBVElPTl9UWVBFX19UQUJMRSA9IEdFTkVSQVRJT05fVFlQRV8gKyAiVEFCTEUiOwotCi0JU3RyaW5nIElOSEVSSVRBTkNFX1RZUEUgPSBQQUNLQUdFXyArICJJbmhlcml0YW5jZVR5cGUiOwotCQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRV8gPSBJTkhFUklUQU5DRV9UWVBFICsgJy4nOwotCQlTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRV9fSk9JTkVEID0gSU5IRVJJVEFOQ0VfVFlQRV8gKyAiSk9JTkVEIjsKLQkJU3RyaW5nIElOSEVSSVRBTkNFX1RZUEVfX1NJTkdMRV9UQUJMRSA9IElOSEVSSVRBTkNFX1RZUEVfICsgIlNJTkdMRV9UQUJMRSI7Ci0JCVN0cmluZyBJTkhFUklUQU5DRV9UWVBFX19UQUJMRV9QRVJfQ0xBU1MgPSBJTkhFUklUQU5DRV9UWVBFXyArICJUQUJMRV9QRVJfQ0xBU1MiOwotCi0JU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlQ29udGV4dFR5cGUiOwotCQlTdHJpbmcgUEVSU0lTVEVOQ0VfQ09OVEVYVF9UWVBFXyA9IFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRSArICcuJzsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9fRVhURU5ERUQgPSBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfICsgIkVYVEVOREVEIjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX0NPTlRFWFRfVFlQRV9fVFJBTlNBQ1RJT04gPSBQRVJTSVNURU5DRV9DT05URVhUX1RZUEVfICsgIlRSQU5TQUNUSU9OIjsKLQotCVN0cmluZyBURU1QT1JBTF9UWVBFID0gUEFDS0FHRV8gKyAiVGVtcG9yYWxUeXBlIjsKLQkJU3RyaW5nIFRFTVBPUkFMX1RZUEVfID0gVEVNUE9SQUxfVFlQRSArICcuJzsKLQkJU3RyaW5nIFRFTVBPUkFMX1RZUEVfX0RBVEUgPSBURU1QT1JBTF9UWVBFXyArICJEQVRFIjsKLQkJU3RyaW5nIFRFTVBPUkFMX1RZUEVfX1RJTUUgPSBURU1QT1JBTF9UWVBFXyArICJUSU1FIjsKLQkJU3RyaW5nIFRFTVBPUkFMX1RZUEVfX1RJTUVTVEFNUCA9IFRFTVBPUkFMX1RZUEVfICsgIlRJTUVTVEFNUCI7Ci0KLQkvLyBKUEEgaW50ZXJmYWNlcwotCVN0cmluZyBFTlRJVFlfTUFOQUdFUiA9IFBBQ0tBR0VfICsgIkVudGl0eU1hbmFnZXIiOwotCVN0cmluZyBFTlRJVFlfTUFOQUdFUl9GQUNUT1JZID0gUEFDS0FHRV8gKyAiRW50aXR5TWFuYWdlckZhY3RvcnkiOwotCVN0cmluZyBFTlRJVFlfVFJBTlNBQ1RJT04gPSBQQUNLQUdFXyArICJFbnRpdHlUcmFuc2FjdGlvbiI7Ci0JU3RyaW5nIElOU1RSVU1FTlRBQkxFX0NMQVNTX0xPQURFUiA9IFBBQ0tBR0VfICsgIkluc3RydW1lbnRhYmxlQ2xhc3NMb2FkZXIiOwotCVN0cmluZyBRVUVSWSA9IFBBQ0tBR0VfICsgIlF1ZXJ5IjsKLQotCS8vIEpQQSBjbGFzc2VzCi0JU3RyaW5nIFBFUlNJU1RFTkNFID0gUEFDS0FHRV8gKyAiWG1sUGVyc2lzdGVuY2UiOwotCi0JLy8gSlBBIGV4Y2VwdGlvbnMKLQlTdHJpbmcgTk9OX1VOSVFVRV9SRVNVTFRfRVhDRVBUSU9OID0gUEFDS0FHRV8gKyAiTm9uVW5pcXVlUmVzdWx0RXhjZXB0aW9uIjsKLQlTdHJpbmcgT0JKRUNUX05PVF9GT1VORF9FWENFUFRJT04gPSBQQUNLQUdFXyArICJPYmplY3ROb3RGb3VuZEV4Y2VwdGlvbiI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX0VYQ0VQVElPTiA9IFBBQ0tBR0VfICsgIlBlcnNpc3RlbmNlRXhjZXB0aW9uIjsKLQotCi0JLy8gKioqKioqKioqKiBTUEkgKioqKioqKioqKgotCi0JLy8gSlBBIFNQSSBwYWNrYWdlCi0JU3RyaW5nIFNQSV9QQUNLQUdFID0gUEFDS0FHRV8gKyAic3BpIjsKLQlTdHJpbmcgU1BJX1BBQ0tBR0VfID0gU1BJX1BBQ0tBR0UgKyAnLic7Ci0KLQkvLyBKUEEgU1BJIGludGVyZmFjZXMKLQlTdHJpbmcgRU5USVRZX01BTkFHRVJfRkFDVE9SWV9QUk9WSURFUiA9IFNQSV9QQUNLQUdFXyArICJFbnRpdHlNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyIjsKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfSU5GTyA9IFNQSV9QQUNLQUdFXyArICJQZXJzaXN0ZW5jZUluZm8iOwotCVN0cmluZyBQRVJTSVNURU5DRV9QUk9WSURFUiA9IFNQSV9QQUNLQUdFXyArICJQZXJzaXN0ZW5jZVByb3ZpZGVyIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDlkOTRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvSm9pbkNvbHVtbkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSm9pbkNvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIENvbXBsZXRlSm9pbkNvbHVtbkFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLkpPSU5fQ09MVU1OOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU2NTgzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5UYWJsZTwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpvaW5UYWJsZUFubm90YXRpb24KLQlleHRlbmRzIFJlZmVyZW5jZVRhYmxlQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuSk9JTl9UQUJMRTsKLQotCi0JLy8gKioqKioqKioqKiBpbnZlcnNlIGpvaW4gY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ludmVyc2VKb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QgPSAiaW52ZXJzZUpvaW5Db2x1bW5zIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdpbnZlcnNlSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCWludCBnZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ludmVyc2VKb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCi0JICovCi0JSm9pbkNvbHVtbkFubm90YXRpb24gaW52ZXJzZUpvaW5Db2x1bW5BdChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdpbnZlcnNlSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEludmVyc2VKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ludmVyc2VKb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdpbnZlcnNlSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9Mb2JBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0xvYkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNiNGZhOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL0xvYkFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuTG9iCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBMb2JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5MT0I7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNDk1MjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb01hbnk8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBNYW55VG9NYW55QW5ub3RhdGlvbiAKLQlleHRlbmRzIE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTUFOWV9UT19NQU5ZOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9NYW55VG9PbmVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg5MGI0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL01hbnlUb09uZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBNYW55VG9PbmVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTUFOWV9UT19PTkU7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL01hcEtleUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWFkMGRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTWFwS2V5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5NYXBLZXkKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcEtleUFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk1BUF9LRVk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlIE1hcEtleSBhbm5vdGF0aW9uLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlIE1hcEtleSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgTWFwS2V5IGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAnbmFtZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkYWExMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLk1hcHBlZFN1cGVyY2xhc3MKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5NQVBQRURfU1VQRVJDTEFTUzsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkQ29sdW1uQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzMwNzJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRDb2x1bW5Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb25zOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Q29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW48L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFwS2V5Sm9pbkNvbHVtbjwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5EaXNjcmltaW5hdG9yQ29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk9yZGVyQ29sdW1uPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLlByaW1hcnlLZXlKb2luQ29sdW1uPC9jb2RlPgotICogPC91bD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZENvbHVtbkFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgYW5ub3RhdGlvbiBleGlzdHMgaW4gSmF2YS4KLQkgKi8KLQlib29sZWFuIGlzU3BlY2lmaWVkKCk7Ci0KLQotCS8vICoqKioqKioqKiogbmFtZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ25hbWUnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gbmFtZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbiBkZWZpbml0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29sdW1uRGVmaW5pdGlvbicgZWxlbWVudCBvZiB0aGUgKkNvbHVtbiBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKTsKLQkJU3RyaW5nIENPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZID0gImNvbHVtbkRlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5EZWZpbml0aW9uJyBlbGVtZW50IG9mIHRoZSAqQ29sdW1uIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcgY29sdW1uRGVmaW5pdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NvbHVtbkRlZmluaXRpb24nIGVsZW1lbnQuIElmIHRoZQotCSAqIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpDb2x1bW4gYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q29sdW1uRGVmaW5pdGlvblRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyOWEzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnk8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbgotCWV4dGVuZHMgUXVlcnlBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5OQU1FRF9OQVRJVkVfUVVFUlk7Ci0KLQotCS8vICoqKioqKioqKiogcmVzdWx0IGNsYXNzICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVzdWx0Q2xhc3MnIGVsZW1lbnQgb2YgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRSZXN1bHRDbGFzcygpOwotCQlTdHJpbmcgUkVTVUxUX0NMQVNTX1BST1BFUlRZID0gInJlc3VsdENsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZXN1bHRDbGFzcycgZWxlbWVudCBvZiB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFJlc3VsdENsYXNzKFN0cmluZyByZXN1bHRDbGFzcyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3Jlc3VsdENsYXNzJyBlbGVtZW50LiBJZiBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE5hbWVkTmF0aXZlUXVlcnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UmVzdWx0Q2xhc3NUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lZCBuYXRpdmUgcXVlcnkncyBmdWxseS1xdWFsaWZpZWQgcmVzdWx0IGNsYXNzIG5hbWUgYXMKLQkgKiByZXNvbHZlZCBieSB0aGUgQVNUJ3MgYmluZGluZ3MuCi0JICogPHByZT4KLQkgKiAgICAgJiM2NDtOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzPUVtcGxveWVlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuIDxjb2RlPiJtb2RlbC5FbXBsb3llZSI8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IKLQkgKiA8Y29kZT5tb2RlbC5FbXBsb3llZTwvY29kZT4uCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCk7Ci0KLQotCS8vICoqKioqKioqKiogcmVzdWx0IHNldCBtYXBwaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncmVzdWx0U2V0TWFwcGluZycgZWxlbWVudCBvZiB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJU3RyaW5nIFJFU1VMVF9TRVRfTUFQUElOR19QUk9QRVJUWSA9ICJyZXN1bHRTZXRNYXBwaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdyZXN1bHRTZXRNYXBwaW5nJyBlbGVtZW50IG9mIHRoZSBOYW1lZE5hdGl2ZVF1ZXJ5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgcmVzdWx0U2V0TWFwcGluZyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3Jlc3VsdFNldE1hcHBpbmcnIGVsZW1lbnQuIElmIGVsZW1lbnQKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgTmFtZWROYXRpdmVRdWVyeSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRSZXN1bHRTZXRNYXBwaW5nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMwOThlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5PC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTmFtZWRRdWVyeUFubm90YXRpb24KLQlleHRlbmRzIFF1ZXJ5QW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuTkFNRURfUVVFUlk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL09uZVRvTWFueUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9NYW55QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjU3YjBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9NYW55QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueTwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9uZVRvTWFueUFubm90YXRpb24gCi0JZXh0ZW5kcyBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk9ORV9UT19NQU5ZOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9PbmVUb09uZUFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvT25lVG9PbmVBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NWZmYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9PbmVUb09uZUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiA8Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTwvY29kZT4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9uZVRvT25lQW5ub3RhdGlvbiAKLQlleHRlbmRzIFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLCBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLk9ORV9UT19PTkU7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL09yZGVyQnlBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNzVhNjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9PcmRlckJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5PcmRlckJ5Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcmRlckJ5QW5ub3RhdGlvbgotCWV4dGVuZHMgQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuT1JERVJfQlk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBPcmRlckJ5IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBPcmRlckJ5IGFubm90YXRpb24uCi0JICogU2V0dGluZyB0aGUgZWxlbWVudCB0byBudWxsIHdpbGwgbm90IHJlbW92ZSB0aGUgT3JkZXJCeSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKTsKLQkJCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIE9yZGVyQnkgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL092ZXJyaWRlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9PdmVycmlkZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhODAzOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL092ZXJyaWRlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgZm9yCi0gKiAgICAgamF2YXgucGVyc2lzdGVuY2UuQXR0cmlidXRlT3ZlcnJpZGUKLSAqICAgICBqYXZheC5wZXJzaXN0ZW5jZS5Bc3NvY2lhdGlvbk92ZXJyaWRlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPdmVycmlkZUFubm90YXRpb24KLQlleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSBvdmVycmlkZSBhbm5vdGF0aW9ucy4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0JCVN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICduYW1lJyBlbGVtZW50IG9mIHRoZSBvdmVycmlkZSBhbm5vdGF0aW9ucy4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnbmFtZScgZWxlbWVudC4gSWYgZWxlbWVudAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBvdmVycmlkZSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ25hbWUnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JYm9vbGVhbiBuYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL093bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdhNDQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhIHJlbGF0aW9uc2hpcCBtYXBwaW5nIGFubm90YXRpb24gdGhhdCBtYXkgaGF2ZSB0aGUKLSAqIDxjb2RlPm1hcHBlZEJ5PC9jb2RlPiBlbGVtZW50Ojx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9NYW55PC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTwvY29kZT4KLSAqIDwvdWw+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLQlleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi17Ci0vLyBUT0RPIGJqdiByZW5hbWUgdG8gTWFwcGVkQnlSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbWFwcGVkQnknIGVsZW1lbnQgb2YgdGhlIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQkJU3RyaW5nIE1BUFBFRF9CWV9QUk9QRVJUWSA9ICJtYXBwZWRCeSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ21hcHBlZEJ5JyBlbGVtZW50IG9mIHRoZSBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyBtYXBwZWRCeSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICdtYXBwZWRCeScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdtYXBwZWRCeScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBtYXBwZWRCeVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE1MWRmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLlByaW1hcnlLZXlKb2luQ29sdW1uPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1F1ZXJ5QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZjg0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1F1ZXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQ29tbW9uIHByb3RvY29sIGFtb25nOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5PC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk5hbWVkTmF0aXZlUXVlcnk8L2NvZGU+Ci0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFF1ZXJ5QW5ub3RhdGlvbgotCWV4dGVuZHMgTmVzdGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBuYW1lICoqKioqKioqKioKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwkKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnbmFtZScgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICduYW1lJyBlbGVtZW50LiBJZiBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpRdWVyeSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLy8gKioqKioqKioqKiBxdWVyeSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3F1ZXJ5JyBlbGVtZW50IG9mIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRRdWVyeSgpOwkKLQkJU3RyaW5nIFFVRVJZX1BST1BFUlRZID0gInF1ZXJ5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdxdWVyeScgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0UXVlcnkoU3RyaW5nIHF1ZXJ5KTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3F1ZXJ5JyBlbGVtZW50LiBJZiBlbGVtZW50Ci0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICpRdWVyeSBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRRdWVyeVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8vICoqKioqKioqKiogaGludHMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdoaW50cycgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTGlzdEl0ZXJhYmxlPFF1ZXJ5SGludEFubm90YXRpb24+IGdldEhpbnRzKCk7Ci0JCVN0cmluZyBISU5UU19MSVNUID0gImhpbnRzIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaGludHMnIGVsZW1lbnQgb2YgdGhlICpRdWVyeSBhbm5vdGF0aW9uLgotCSAqLwotCWludCBnZXRIaW50c1NpemUoKTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnaGludHMnIGVsZW1lbnQgb2YgdGhlICpRdWVyeSBhbm5vdGF0aW9uLgotCSAqLwotCVF1ZXJ5SGludEFubm90YXRpb24gaGludEF0KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdoaW50cycgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICovCi0JUXVlcnlIaW50QW5ub3RhdGlvbiBhZGRIaW50KGludCBpbmRleCk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdoaW50cycgZWxlbWVudCBvZiB0aGUgKlF1ZXJ5IGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBtb3ZlSGludChpbnQgdGFyZ2V0SW5kZXgsIGludCBzb3VyY2VJbmRleCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2hpbnRzJyBlbGVtZW50IG9mIHRoZSAqUXVlcnkgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIHJlbW92ZUhpbnQoaW50IGluZGV4KTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvUXVlcnlIaW50QW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYzZmNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuUXVlcnlIaW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBRdWVyeUhpbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBOZXN0YWJsZUFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlFVRVJZX0hJTlQ7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQkJU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ25hbWUnIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqIFNldHRpbmcgdG8gbnVsbCB3aWxsIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpOwotCQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ25hbWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBRdWVyeUhpbnQgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndmFsdWUnIGVsZW1lbnQgb2YgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIHRoZSBhbm5vdGF0aW9uCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci0JCVN0cmluZyBWQUxVRV9QUk9QRVJUWSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlJyBlbGVtZW50IG9mIHRoZSBRdWVyeUhpbnQgYW5ub3RhdGlvbi4KLQkgKiBTZXR0aW5nIHRvIG51bGwgd2lsbCByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlICd2YWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFF1ZXJ5SGludCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvUmVmZXJlbmNlVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1JlZmVyZW5jZVRhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGE0NzIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvUmVmZXJlbmNlVGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uczo8dWw+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuSm9pblRhYmxlPC9jb2RlPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLkNvbGxlY3Rpb25UYWJsZTwvY29kZT4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVmZXJlbmNlVGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCYXNlVGFibGVBbm5vdGF0aW9uCi17Ci0JLy8gKioqKioqKioqKiBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JTGlzdEl0ZXJhYmxlPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBnZXRKb2luQ29sdW1ucygpOwotCQlTdHJpbmcgSk9JTl9DT0xVTU5TX0xJU1QgPSAiam9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlpbnQgZ2V0Sm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBKb2luVGFibGUgYW5ub3RhdGlvbi4KLQkgKi8KLQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQXQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZEpvaW5Db2x1bW4oaW50IGluZGV4KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnam9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIEpvaW5UYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgbW92ZUpvaW5Db2x1bW4oaW50IHRhcmdldEluZGV4LCBpbnQgc291cmNlSW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdqb2luQ29sdW1ucycgZWxlbWVudCBvZiB0aGUgSm9pblRhYmxlIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmMzAzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1JlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogQ29tbW9uIHByb3RvY29sIGFtb25nIHRoZSBmb2xsb3dpbmcgcmVsYXRpb25zaGlwIG1hcHBpbmdzOjx1bD4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU8L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuTWFueVRvTWFueTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnk8L2NvZGU+Ci0gKiA8bGk+PGNvZGU+amF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU8L2NvZGU+Ci0gKiA8L3VsPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0YXJnZXRFbnRpdHknIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBtYXBwaW5nCi0JICogYW5ub3RhdGlvbnMuCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKiBSZXR1cm4gdGhlIHBvcnRpb24gb2YgdGhlIHZhbHVlIHByZWNlZGluZyAiLmNsYXNzIi4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O01hbnlUb01hbnkodGFyZ2V0RW50aXR5PUVtcGxveWVlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuICJFbXBsb3llZSIKLQkgKi8KLQlTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCk7CQotCQlTdHJpbmcgVEFSR0VUX0VOVElUWV9QUk9QRVJUWSA9ICJ0YXJnZXRFbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd0YXJnZXRFbnRpdHknIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBtYXBwaW5nCi0JICogYW5ub3RhdGlvbnMuCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyB0YXJnZXRFbnRpdHkpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndGFyZ2V0RW50aXR5JyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcmVsYXRpb25zaGlwIG1hcHBpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGFyZ2V0RW50aXR5VGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIHRhcmdldCBlbnRpdHkgY2xhc3MgbmFtZSBhcyByZXNvbHZlZCBieSB0aGUKLQkgKiBBU1QncyBiaW5kaW5ncy4KLQkgKiA8cHJlPgotCSAqICAgICAmIzY0O01hbnlUb01hbnkodGFyZ2V0RW50aXR5PUVtcGxveWVlLmNsYXNzKQotCSAqIDwvcHJlPgotCSAqIHdpbGwgcmV0dXJuIDxjb2RlPiJtb2RlbC5FbXBsb3llZSI8L2NvZGU+IGlmIHRoZXJlIGlzIGFuIGltcG9ydCBmb3IKLQkgKiA8Y29kZT5tb2RlbC5FbXBsb3llZTwvY29kZT4uCi0JICovCi0JU3RyaW5nIGdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnZmV0Y2gnIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBtYXBwaW5nIGFubm90YXRpb25zLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JRmV0Y2hUeXBlIGdldEZldGNoKCk7Ci0JCVN0cmluZyBGRVRDSF9QUk9QRVJUWSA9ICJmZXRjaCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2ZldGNoJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIGZldGNoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2ZldGNoJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgcmVsYXRpb25zaGlwIG1hcHBpbmcgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0RmV0Y2hUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Nhc2NhZGUnIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBhbm5vdGF0aW9ucy4KLQkgKi8KLQlib29sZWFuIGlzQ2FzY2FkZUFsbCgpOwkKLQkJU3RyaW5nIENBU0NBREVfQUxMX1BST1BFUlRZID0gImNhc2NhZGVBbGwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2Nhc2NhZGUnIGVsZW1lbnQgb2YgdGhlIHJlbGF0aW9uc2hpcCBhbm5vdGF0aW9ucy4KLQkgKi8KLQl2b2lkIHNldENhc2NhZGVBbGwoYm9vbGVhbiBhbGwpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgotCSAqLwotCWJvb2xlYW4gaXNDYXNjYWRlTWVyZ2UoKTsJCi0JCVN0cmluZyBDQVNDQURFX01FUkdFX1BST1BFUlRZID0gImNhc2NhZGVNZXJnZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2FzY2FkZScgZWxlbWVudCBvZiB0aGUgcmVsYXRpb25zaGlwIGFubm90YXRpb25zLgotCSAqLwotCXZvaWQgc2V0Q2FzY2FkZU1lcmdlKGJvb2xlYW4gbWVyZ2UpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCi0JICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCk7CQotCQlTdHJpbmcgQ0FTQ0FERV9QRVJTSVNUX1BST1BFUlRZID0gImNhc2NhZGVQZXJzaXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuIHBlcnNpc3QpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCi0JICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCk7CQotCQlTdHJpbmcgQ0FTQ0FERV9SRUZSRVNIX1BST1BFUlRZID0gImNhc2NhZGVSZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuIHJlZnJlc2gpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCi0JICovCi0JYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKTsJCi0JCVN0cmluZyBDQVNDQURFX1JFTU9WRV9QUk9QRVJUWSA9ICJjYXNjYWRlUmVtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjYXNjYWRlJyBlbGVtZW50IG9mIHRoZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbnMuCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlUmVtb3ZlKGJvb2xlYW4gcmVtb3ZlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnY2FzY2FkZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHJlbGF0aW9uc2hpcCBtYXBwaW5nIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldENhc2NhZGVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2NmZmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIDxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLlNlY29uZGFyeVRhYmxlPC9jb2RlPgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uCi0JZXh0ZW5kcyBCYXNlVGFibGVBbm5vdGF0aW9uLCBOZXN0YWJsZUFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlNFQ09OREFSWV9UQUJMRTsKLQotCi0JLy8gKioqKioqKioqKiBwcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBTZWNvbmRhcnlUYWJsZSBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCUxpc3RJdGVyYWJsZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IGdldFBrSm9pbkNvbHVtbnMoKTsKLQkJU3RyaW5nIFBLX0pPSU5fQ09MVU1OU19MSVNUID0gInBrSm9pbkNvbHVtbnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3BrSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIFNlY29uZGFyeVRhYmxlIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldFBrSm9pbkNvbHVtbnNTaXplKCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3BrSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIFNlY29uZGFyeVRhYmxlIGFubm90YXRpb24uCi0JICovCi0JUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbkF0KGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3BrSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIFNlY29uZGFyeVRhYmxlIGFubm90YXRpb24uCi0JICovCi0JUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGFkZFBrSm9pbkNvbHVtbihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdwa0pvaW5Db2x1bW5zJyBlbGVtZW50IG9mIHRoZSBTZWNvbmRhcnlUYWJsZSBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlUGtKb2luQ29sdW1uKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3BrSm9pbkNvbHVtbnMnIGVsZW1lbnQgb2YgdGhlIFNlY29uZGFyeVRhYmxlIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBtb3ZlUGtKb2luQ29sdW1uKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZTUzOGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLlNlcXVlbmNlR2VuZXJhdG9yCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24KLQlleHRlbmRzIEdlbmVyYXRvckFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlNFUVVFTkNFX0dFTkVSQVRPUjsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2VxdWVuY2VOYW1lJyBlbGVtZW50IG9mIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0U2VxdWVuY2VOYW1lKCk7Ci0JCVN0cmluZyBTRVFVRU5DRV9OQU1FX1BST1BFUlRZID0gInNlcXVlbmNlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnc2VxdWVuY2VOYW1lJyBlbGVtZW50IG9mIHRoZSAqR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0U2VxdWVuY2VOYW1lKFN0cmluZyBzZXF1ZW5jZU5hbWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAnc2VxdWVuY2VOYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgU2VxdWVuY2VHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0U2VxdWVuY2VOYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3NlcXVlbmNlTmFtZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBzZXF1ZW5jZU5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9TaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA2YjA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb21tb24gcHJvdG9jb2wgYW1vbmcgdGhlIGZvbGxvd2luZyByZWxhdGlvbnNoaXAgbWFwcGluZ3M6PHVsPgotICogPGxpPjxjb2RlPmphdmF4LnBlcnNpc3RlbmNlLk1hbnlUb09uZTwvY29kZT4KLSAqIDxsaT48Y29kZT5qYXZheC5wZXJzaXN0ZW5jZS5PbmVUb09uZTwvY29kZT4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbgotCWV4dGVuZHMgUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24KLXsKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3B0aW9uYWwgZWxlbWVudCBvZiBhIHNpbmdsZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG9wdGlvbmFsIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gamF2YS4KLQkgKi8KLQlCb29sZWFuIGdldE9wdGlvbmFsKCk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgb3B0aW9uYWwgZWxlbWVudCBvZiBhIHNpbmdsZSByZWxhdGlvbnNoaXAgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIG9wdGlvbmFsIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRPcHRpb25hbChCb29sZWFuIG9wdGlvbmFsKTsKLQkJU3RyaW5nIE9QVElPTkFMX1BST1BFUlRZID0gIm9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG9wdGlvbmFsIGVsZW1lbnQuICBJZiB0aGUgb3B0aW9uYWwgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgTWFueVRvT25lIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldE9wdGlvbmFsVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1RhYmxlQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGNjOWNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogPGNvZGU+amF2YXgucGVyc2lzdGVuY2UuVGFibGU8L2NvZGU+Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUYWJsZUFubm90YXRpb24KLQlleHRlbmRzIEJhc2VUYWJsZUFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlRBQkxFOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvckFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzgyZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9UYWJsZUdlbmVyYXRvckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci0KLS8qKgotICogQ29ycmVzcG9uZHMgdG8gdGhlIEpQQSBhbm5vdGF0aW9uCi0gKiBqYXZheC5wZXJzaXN0ZW5jZS5UYWJsZUdlbmVyYXRvcgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uCi0JZXh0ZW5kcyBHZW5lcmF0b3JBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5UQUJMRV9HRU5FUkFUT1I7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3RhYmxlJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFJldHVybiBudWxsIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0IGluIEphdmEuCi0JICovCi0JU3RyaW5nIGdldFRhYmxlKCk7Ci0JCVN0cmluZyBUQUJMRV9QUk9QRVJUWSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndGFibGUnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0VGFibGUoU3RyaW5nIHRhYmxlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndGFibGUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRUYWJsZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICd0YWJsZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiB0YWJsZVRvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRTY2hlbWEoKTsKLQkJU3RyaW5nIFNDSEVNQV9QUk9QRVJUWSA9ICJzY2hlbWEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3NjaGVtYScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRTY2hlbWEoU3RyaW5nIHNjaGVtYSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3NjaGVtYScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFNjaGVtYVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICdzY2hlbWEnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gc2NoZW1hVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY2F0YWxvZycgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRDYXRhbG9nKCk7Ci0JCVN0cmluZyBDQVRBTE9HX1BST1BFUlRZID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogU2V0IHRvIG51bGwgdG8gcmVtb3ZlIHRoZSBlbGVtZW50LgotCSAqLwotCXZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgY2F0YWxvZyk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRDYXRhbG9nVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ2NhdGFsb2cnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gY2F0YWxvZ1RvdWNoZXMoaW50IHBvcywgQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3BrQ29sdW1uTmFtZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRQa0NvbHVtbk5hbWUoKTsKLQkJU3RyaW5nIFBLX0NPTFVNTl9OQU1FX1BST1BFUlRZID0gInBrQ29sdW1uTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncGtDb2x1bW5OYW1lJyBlbGVtZW50IG9mIHRoZSBUYWJsZUdlbmVyYXRvciBhbm5vdGF0aW9uLgotCSAqIFNldCB0byBudWxsIHRvIHJlbW92ZSB0aGUgZWxlbWVudC4KLQkgKi8KLQl2b2lkIHNldFBrQ29sdW1uTmFtZShTdHJpbmcgcGtDb2x1bW5OYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAncGtDb2x1bW5OYW1lJyBlbGVtZW50LiBJZiB0aGUgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0UGtDb2x1bW5OYW1lVGV4dFJhbmdlKENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ3BrQ29sdW1uTmFtZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBwa0NvbHVtbk5hbWVUb3VjaGVzKGludCBwb3MsIENvbXBpbGF0aW9uVW5pdCBhc3RSb290KTsKLQotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZUNvbHVtbk5hbWUnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JCVN0cmluZyBWQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSA9ICJ2YWx1ZUNvbHVtbk5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ3ZhbHVlQ29sdW1uTmFtZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIHZhbHVlQ29sdW1uTmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgJ3ZhbHVlQ29sdW1uTmFtZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbHVlQ29sdW1uTmFtZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIHRvdWNoZXMgdGhlICd2YWx1ZUNvbHVtbk5hbWUnIGVsZW1lbnQuCi0JICogUmV0dXJuIGZhbHNlIGlmIHRoZSBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCWJvb2xlYW4gdmFsdWVDb2x1bW5OYW1lVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncGtDb2x1bW5WYWx1ZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCk7Ci0JCVN0cmluZyBQS19DT0xVTU5fVkFMVUVfUFJPUEVSVFkgPSAicGtDb2x1bW5WYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAncGtDb2x1bW5WYWx1ZScgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRQa0NvbHVtblZhbHVlKFN0cmluZyBwa0NvbHVtblZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAncGtDb2x1bW5WYWx1ZScgZWxlbWVudC4gSWYgdGhlIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JVGV4dFJhbmdlIGdldFBrQ29sdW1uVmFsdWVUZXh0UmFuZ2UoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiB0b3VjaGVzIHRoZSAncGtDb2x1bW5WYWx1ZScgZWxlbWVudC4KLQkgKiBSZXR1cm4gZmFsc2UgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JYm9vbGVhbiBwa0NvbHVtblZhbHVlVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gSmF2YS4KLQkgKi8KLQlMaXN0SXRlcmFibGU8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCVN0cmluZyBVTklRVUVfQ09OU1RSQUlOVFNfTElTVCA9ICJ1bmlxdWVDb25zdHJhaW50cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JaW50IGdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQlVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbiB1bmlxdWVDb25zdHJhaW50QXQoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0JVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24gYWRkVW5pcXVlQ29uc3RyYWludChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd1bmlxdWVDb25zdHJhaW50cycgZWxlbWVudCBvZiB0aGUgVGFibGVHZW5lcmF0b3IgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVVbmlxdWVDb25zdHJhaW50KGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAndW5pcXVlQ29uc3RyYWludHMnIGVsZW1lbnQgb2YgdGhlIFRhYmxlR2VuZXJhdG9yIGFubm90YXRpb24uCi0JICovCi0Jdm9pZCByZW1vdmVVbmlxdWVDb25zdHJhaW50KGludCBpbmRleCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsQW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDhlNGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxBbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUZW1wb3JhbEFubm90YXRpb24KLQlleHRlbmRzIEFubm90YXRpb24KLXsKLQlTdHJpbmcgQU5OT1RBVElPTl9OQU1FID0gSlBBLlRFTVBPUkFMOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgVGVtcG9yYWwgYW5ub3RhdGlvbi4KLQkgKiBSZXR1cm4gbnVsbCBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdCBpbiBKYXZhLgotCSAqLwotCVRlbXBvcmFsVHlwZSBnZXRWYWx1ZSgpOwotCQlTdHJpbmcgVkFMVUVfUFJPUEVSVFkgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICd2YWx1ZScgZWxlbWVudCBvZiB0aGUgVGVtcG9yYWwgYW5ub3RhdGlvbi4KLQkgKiBTZXQgdG8gbnVsbCB0byByZW1vdmUgdGhlIGVsZW1lbnQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShUZW1wb3JhbFR5cGUgdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSAndmFsdWUnIGVsZW1lbnQuIElmIHRoZSBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBUZW1wb3JhbCBhbm5vdGF0aW9uLgotCSAqLwotCVRleHRSYW5nZSBnZXRWYWx1ZVRleHRSYW5nZShDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODFmYTI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVGVtcG9yYWxUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgZW51bQotICogamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIHsKLQotCURBVEUoSlBBLlRFTVBPUkFMX1RZUEVfX0RBVEUpLAotCVRJTUUoSlBBLlRFTVBPUkFMX1RZUEVfX1RJTUUpLAotCVRJTUVTVEFNUChKUEEuVEVNUE9SQUxfVFlQRV9fVElNRVNUQU1QKTsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZTsKLQotCVRlbXBvcmFsVHlwZShTdHJpbmcgamF2YUFubm90YXRpb25WYWx1ZSkgewotCQlpZiAoamF2YUFubm90YXRpb25WYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmphdmFBbm5vdGF0aW9uVmFsdWUgPSBqYXZhQW5ub3RhdGlvblZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpIHsKLQkJcmV0dXJuIHRoaXMuamF2YUFubm90YXRpb25WYWx1ZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUZW1wb3JhbFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWUoT2JqZWN0IGphdmFBbm5vdGF0aW9uVmFsdWUpIHsKLQkJcmV0dXJuIChqYXZhQW5ub3RhdGlvblZhbHVlID09IG51bGwpID8gbnVsbCA6IGZyb21KYXZhQW5ub3RhdGlvblZhbHVlXyhqYXZhQW5ub3RhdGlvblZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUZW1wb3JhbFR5cGUgZnJvbUphdmFBbm5vdGF0aW9uVmFsdWVfKE9iamVjdCBqYXZhQW5ub3RhdGlvblZhbHVlKSB7Ci0JCWZvciAoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSA6IFRlbXBvcmFsVHlwZS52YWx1ZXMoKSkgewotCQkJaWYgKHRlbXBvcmFsVHlwZS5nZXRKYXZhQW5ub3RhdGlvblZhbHVlKCkuZXF1YWxzKGphdmFBbm5vdGF0aW9uVmFsdWUpKSB7Ci0JCQkJcmV0dXJuIHRlbXBvcmFsVHlwZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b0phdmFBbm5vdGF0aW9uVmFsdWUoVGVtcG9yYWxUeXBlIHRlbXBvcmFsVHlwZSkgewotCQlyZXR1cm4gKHRlbXBvcmFsVHlwZSA9PSBudWxsKSA/IG51bGwgOiB0ZW1wb3JhbFR5cGUuZ2V0SmF2YUFubm90YXRpb25WYWx1ZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9UcmFuc2llbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudEFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmZjMzZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudEFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuVHJhbnNpZW50Ci0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBUcmFuc2llbnRBbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5UUkFOU0lFTlQ7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1VuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1VuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNzI1NDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvamF2YS9VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotCi0vKioKLSAqIENvcnJlc3BvbmRzIHRvIHRoZSBKUEEgYW5ub3RhdGlvbgotICogamF2YXgucGVyc2lzdGVuY2UuVW5pcXVlQ29uc3RyYWludAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVW5pcXVlQ29uc3RyYWludEFubm90YXRpb24KLQlleHRlbmRzIE5lc3RhYmxlQW5ub3RhdGlvbgotewotCVN0cmluZyBBTk5PVEFUSU9OX05BTUUgPSBKUEEuVU5JUVVFX0NPTlNUUkFJTlQ7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbHVtbk5hbWVzJyBlbGVtZW50IG9mIHRoZSBVbmlxdWVDb25zdHJhaW50IGFubm90YXRpb24uCi0JICogUmV0dXJuIG51bGwgaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFubm90YXRpb24uCi0JICovCi0JTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29sdW1uTmFtZXMoKTsKLQkJU3RyaW5nIENPTFVNTl9OQU1FU19MSVNUID0gImNvbHVtbk5hbWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgotCSAqLwotCWludCBnZXRDb2x1bW5OYW1lc1NpemUoKTsKLQkKLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbHVtbk5hbWVzJyBlbGVtZW50IG9mIHRoZSBVbmlxdWVDb25zdHJhaW50IGFubm90YXRpb24uCi0JICovCi0JU3RyaW5nIGNvbHVtbk5hbWVBdChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgYWRkQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSk7Ci0KLQkvKioKLQkgKiBDb3JyZXNwb25kcyB0byB0aGUgJ2NvbHVtbk5hbWVzJyBlbGVtZW50IG9mIHRoZSBVbmlxdWVDb25zdHJhaW50IGFubm90YXRpb24uCi0JICovCi0Jdm9pZCBhZGRDb2x1bW5OYW1lKGludCBpbmRleCwgU3RyaW5nIGNvbHVtbk5hbWUpOwotCQotCS8qKgotCSAqIENvcnJlc3BvbmRzIHRvIHRoZSAnY29sdW1uTmFtZXMnIGVsZW1lbnQgb2YgdGhlIFVuaXF1ZUNvbnN0cmFpbnQgYW5ub3RhdGlvbi4KLQkgKi8KLQl2b2lkIG1vdmVDb2x1bW5OYW1lKGludCB0YXJnZXRJbmRleCwgaW50IHNvdXJjZUluZGV4KTsKLQkJCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShTdHJpbmcgY29sdW1uTmFtZSk7Ci0JCi0JLyoqCi0JICogQ29ycmVzcG9uZHMgdG8gdGhlICdjb2x1bW5OYW1lcycgZWxlbWVudCBvZiB0aGUgVW5pcXVlQ29uc3RyYWludCBhbm5vdGF0aW9uLgotCSAqLwotCXZvaWQgcmVtb3ZlQ29sdW1uTmFtZShpbnQgaW5kZXgpOwotCQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gdG91Y2hlcyB0aGUgJ2NvbHVtbk5hbWVzJyBlbGVtZW50LgotCSAqIFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlib29sZWFuIGNvbHVtbk5hbWVzVG91Y2hlcyhpbnQgcG9zLCBDb21waWxhdGlvblVuaXQgYXN0Um9vdCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVmVyc2lvbkFubm90YXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL2phdmEvVmVyc2lvbkFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM1NGY1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9qYXZhL1ZlcnNpb25Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLQotLyoqCi0gKiBDb3JyZXNwb25kcyB0byB0aGUgSlBBIGFubm90YXRpb24KLSAqIGphdmF4LnBlcnNpc3RlbmNlLlZlcnNpb24KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZlcnNpb25Bbm5vdGF0aW9uCi0JZXh0ZW5kcyBBbm5vdGF0aW9uCi17Ci0JU3RyaW5nIEFOTk9UQVRJT05fTkFNRSA9IEpQQS5WRVJTSU9OOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFiZWI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzdHJhY3QgWG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdAotCWltcGxlbWVudHMgWG1sQXR0cmlidXRlTWFwcGluZwotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY2Nlc3MgPSBBQ0NFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3MoKQotCXsKLQkJcmV0dXJuIGFjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyNnZXRBY2Nlc3MgPGVtPkFjY2VzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoU3RyaW5nIG5ld0FjY2VzcykKLQl7Ci0JCVN0cmluZyBvbGRBY2Nlc3MgPSBhY2Nlc3M7Ci0JCWFjY2VzcyA9IG5ld0FjY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUywgb2xkQWNjZXNzLCBhY2Nlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOgotCQkJCXNldEFjY2VzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOgotCQkJCXNldEFjY2VzcyhBQ0NFU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOgotCQkJCXJldHVybiBBQ0NFU1NfRURFRkFVTFQgPT0gbnVsbCA/IGFjY2VzcyAhPSBudWxsIDogIUFDQ0VTU19FREVGQVVMVC5lcXVhbHMoYWNjZXNzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWNjZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQUNDRVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQmFzZUNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTQzYjQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbEJhc2VDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5Cb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzdHJhY3QgWG1sIEFic3RyYWN0IENvbHVtbjwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxCYXNlQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbEJhc2VDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgWG1sQmFzZUNvbHVtbgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnRhYmxlKCkgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTlNFUlRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc2VydGFibGUoKSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zZXJ0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW5zZXJ0YWJsZSA9IElOU0VSVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVsbGFibGUoKSA8ZW0+TnVsbGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bGxhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gTlVMTEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TnVsbGFibGUoKSA8ZW0+TnVsbGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE51bGxhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBudWxsYWJsZSA9IE5VTExBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhYmxlKCkgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlID0gVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VW5pcXVlKCkgPGVtPlVuaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gVU5JUVVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVuaXF1ZSgpIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVuaXF1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gdW5pcXVlID0gVU5JUVVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVwZGF0YWJsZSgpIDxlbT5VcGRhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVwZGF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIFVQREFUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVcGRhdGFibGUoKSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBCb29sZWFuIHVwZGF0YWJsZSA9IFVQREFUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbEJhc2VDb2x1bW4oKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJbnNlcnRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZUNvbHVtbl9JbnNlcnRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkKLQl7Ci0JCXJldHVybiBpbnNlcnRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlQ29sdW1uI2dldEluc2VydGFibGUgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRhYmxlKEJvb2xlYW4gbmV3SW5zZXJ0YWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkSW5zZXJ0YWJsZSA9IGluc2VydGFibGU7Ci0JCWluc2VydGFibGUgPSBuZXdJbnNlcnRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRSwgb2xkSW5zZXJ0YWJsZSwgaW5zZXJ0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVsbGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlQ29sdW1uX051bGxhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpCi0JewotCQlyZXR1cm4gbnVsbGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VDb2x1bW4jZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVsbGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROdWxsYWJsZShCb29sZWFuIG5ld051bGxhYmxlKQotCXsKLQkJQm9vbGVhbiBvbGROdWxsYWJsZSA9IG51bGxhYmxlOwotCQludWxsYWJsZSA9IG5ld051bGxhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fTlVMTEFCTEUsIG9sZE51bGxhYmxlLCBudWxsYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFibGUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VDb2x1bW5fVGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VDb2x1bW4jZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgbmV3VGFibGUpCi0JewotCQlTdHJpbmcgb2xkVGFibGUgPSB0YWJsZTsKLQkJdGFibGUgPSBuZXdUYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1RBQkxFLCBvbGRUYWJsZSwgdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VbmlxdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVuaXF1ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VDb2x1bW5fVW5pcXVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKQotCXsKLQkJcmV0dXJuIHVuaXF1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZUNvbHVtbiNnZXRVbmlxdWUgPGVtPlVuaXF1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVbmlxdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiBuZXdVbmlxdWUpCi0JewotCQlCb29sZWFuIG9sZFVuaXF1ZSA9IHVuaXF1ZTsKLQkJdW5pcXVlID0gbmV3VW5pcXVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVU5JUVVFLCBvbGRVbmlxdWUsIHVuaXF1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXBkYXRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZUNvbHVtbl9VcGRhdGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldFVwZGF0YWJsZSgpCi0JewotCQlyZXR1cm4gdXBkYXRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlQ29sdW1uI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVwZGF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVwZGF0YWJsZShCb29sZWFuIG5ld1VwZGF0YWJsZSkKLQl7Ci0JCUJvb2xlYW4gb2xkVXBkYXRhYmxlID0gdXBkYXRhYmxlOwotCQl1cGRhdGFibGUgPSBuZXdVcGRhdGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19VUERBVEFCTEUsIG9sZFVwZGF0YWJsZSwgdXBkYXRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXJldHVybiBnZXRJbnNlcnRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19OVUxMQUJMRToKLQkJCQlyZXR1cm4gZ2V0TnVsbGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1RBQkxFOgotCQkJCXJldHVybiBnZXRUYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVU5JUVVFOgotCQkJCXJldHVybiBnZXRVbmlxdWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1VQREFUQUJMRToKLQkJCQlyZXR1cm4gZ2V0VXBkYXRhYmxlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRToKLQkJCQlzZXRJbnNlcnRhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19OVUxMQUJMRToKLQkJCQlzZXROdWxsYWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVEFCTEU6Ci0JCQkJc2V0VGFibGUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXNldFVwZGF0YWJsZSgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRToKLQkJCQlzZXRJbnNlcnRhYmxlKElOU0VSVEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX05VTExBQkxFOgotCQkJCXNldE51bGxhYmxlKE5VTExBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19UQUJMRToKLQkJCQlzZXRUYWJsZShUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVU5JUVVFOgotCQkJCXNldFVuaXF1ZShVTklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1VQREFUQUJMRToKLQkJCQlzZXRVcGRhdGFibGUoVVBEQVRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRToKLQkJCQlyZXR1cm4gSU5TRVJUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gaW5zZXJ0YWJsZSAhPSBudWxsIDogIUlOU0VSVEFCTEVfRURFRkFVTFQuZXF1YWxzKGluc2VydGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fTlVMTEFCTEU6Ci0JCQkJcmV0dXJuIE5VTExBQkxFX0VERUZBVUxUID09IG51bGwgPyBudWxsYWJsZSAhPSBudWxsIDogIU5VTExBQkxFX0VERUZBVUxULmVxdWFscyhudWxsYWJsZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19UQUJMRToKLQkJCQlyZXR1cm4gVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IHRhYmxlICE9IG51bGwgOiAhVEFCTEVfRURFRkFVTFQuZXF1YWxzKHRhYmxlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1VOSVFVRToKLQkJCQlyZXR1cm4gVU5JUVVFX0VERUZBVUxUID09IG51bGwgPyB1bmlxdWUgIT0gbnVsbCA6ICFVTklRVUVfRURFRkFVTFQuZXF1YWxzKHVuaXF1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19VUERBVEFCTEU6Ci0JCQkJcmV0dXJuIFVQREFUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdXBkYXRhYmxlICE9IG51bGwgOiAhVVBEQVRBQkxFX0VERUZBVUxULmVxdWFscyh1cGRhdGFibGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNlQ29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0VfQ09MVU1OX19JTlNFUlRBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX05VTExBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTRV9DT0xVTU5fX05VTExBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTRV9DT0xVTU5fX1RBQkxFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1VOSVFVRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0VfQ09MVU1OX19VTklRVUU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVVBEQVRBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTRV9DT0xVTU5fX1VQREFUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2VDb2x1bW4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0VfQ09MVU1OX19JTlNFUlRBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX0lOU0VSVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNFX0NPTFVNTl9fTlVMTEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fTlVMTEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNFX0NPTFVNTl9fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNFX0NPTFVNTl9fVU5JUVVFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1VOSVFVRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0VfQ09MVU1OX19VUERBVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVVBEQVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaW5zZXJ0YWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5zZXJ0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbnVsbGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG51bGxhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHVuaXF1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodW5pcXVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1cGRhdGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVwZGF0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFibGVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlRBQkxFKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVbmlxdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5VTklRVUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2VDb2x1bW5fVW5pcXVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE51bGxhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihKUEEuTlVMTEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2VDb2x1bW5fTnVsbGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zZXJ0YWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoSlBBLklOU0VSVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2VDb2x1bW5fSW5zZXJ0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5VUERBVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2VDb2x1bW5fVXBkYXRhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzZUNvbHVtbl9UYWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gQWJzdHJhY3RYbWxBYnN0cmFjdENvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxM2Q4N2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QWJzdHJhY3QgWG1sIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RYbWxOYW1lZENvbHVtbiBpbXBsZW1lbnRzIFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uCi17Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRGlzY3JpbWluYXRvclR5cGUgRElTQ1JJTUlOQVRPUl9UWVBFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERpc2NyaW1pbmF0b3JUeXBlKCkgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzY3JpbWluYXRvclR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBkaXNjcmltaW5hdG9yVHlwZSA9IERJU0NSSU1JTkFUT1JfVFlQRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBMRU5HVEhfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TGVuZ3RoKCkgPGVtPkxlbmd0aDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBsZW5ndGggPSBMRU5HVEhfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJTVFJJTkciPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZQotCSAqIEBzZWUgI3NldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uX0Rpc2NyaW1pbmF0b3JUeXBlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iU1RSSU5HIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKQotCXsKLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JUeXBlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiNnZXREaXNjcmltaW5hdG9yVHlwZSA8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIFR5cGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZQotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgbmV3RGlzY3JpbWluYXRvclR5cGUpCi0JewotCQlEaXNjcmltaW5hdG9yVHlwZSBvbGREaXNjcmltaW5hdG9yVHlwZSA9IGRpc2NyaW1pbmF0b3JUeXBlOwotCQlkaXNjcmltaW5hdG9yVHlwZSA9IG5ld0Rpc2NyaW1pbmF0b3JUeXBlID09IG51bGwgPyBESVNDUklNSU5BVE9SX1RZUEVfRURFRkFVTFQgOiBuZXdEaXNjcmltaW5hdG9yVHlwZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFLCBvbGREaXNjcmltaW5hdG9yVHlwZSwgZGlzY3JpbWluYXRvclR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExlbmd0aChJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uX0xlbmd0aCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRMZW5ndGgoKQotCXsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKEludGVnZXIgbmV3TGVuZ3RoKQotCXsKLQkJSW50ZWdlciBvbGRMZW5ndGggPSBsZW5ndGg7Ci0JCWxlbmd0aCA9IG5ld0xlbmd0aDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU6Ci0JCQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSDoKLQkJCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU6Ci0JCQkJc2V0RGlzY3JpbWluYXRvclR5cGUoKERpc2NyaW1pbmF0b3JUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFOgotCQkJCXNldERpc2NyaW1pbmF0b3JUeXBlKERJU0NSSU1JTkFUT1JfVFlQRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg6Ci0JCQkJc2V0TGVuZ3RoKExFTkdUSF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFOgotCQkJCXJldHVybiBkaXNjcmltaW5hdG9yVHlwZSAhPSBESVNDUklNSU5BVE9SX1RZUEVfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSDoKLQkJCQlyZXR1cm4gTEVOR1RIX0VERUZBVUxUID09IG51bGwgPyBsZW5ndGggIT0gbnVsbCA6ICFMRU5HVEhfRURFRkFVTFQuZXF1YWxzKGxlbmd0aCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fRElTQ1JJTUlOQVRPUl9UWVBFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGlzY3JpbWluYXRvclR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc2NyaW1pbmF0b3JUeXBlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBsZW5ndGg6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxlbmd0aCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGlzY3JpbWluYXRvclR5cGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRJU0NSSU1JTkFUT1JfVFlQRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5fRGlzY3JpbWluYXRvclR5cGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTGVuZ3RoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5MRU5HVEgsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uX0xlbmd0aCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0gLy8gQWJzdHJhY3RYbWxEaXNjcmltaW5hdG9yQ29sdW1uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxFbWJlZGRlZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sRW1iZWRkZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2NGY4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxFbWJlZGRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5CYXNlIFhtbCBFbWJlZGRlZDwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxFbWJlZGRlZCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxFbWJlZGRlZCBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbEVtYmVkZGVkKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX0VNQkVEREVEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpIHsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXMgIT0gbnVsbCAmJiAhYXR0cmlidXRlT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9fQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihKUEEuQVRUUklCVVRFX09WRVJSSURFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5MjY3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIGltcGxlbWVudHMgWG1sTWFwcGVkQnlNYXBwaW5nLCBYbWxKb2luVGFibGVDb250YWluZXIsIFhtbE9yZGVyYWJsZSwgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWRCeSgpIDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQllfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZEJ5KCkgPGVtPk1hcHBlZCBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwcGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbWFwcGVkQnkgPSBNQVBQRURfQllfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pblRhYmxlKCkgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5UYWJsZSBqb2luVGFibGU7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJDb2x1bW4oKSA8ZW0+T3JkZXIgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9yZGVyQ29sdW1uIG9yZGVyQ29sdW1uOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlckJ5KCkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcmRlckJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRFUl9CWV9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcmRlckJ5ID0gT1JERVJfQllfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkgPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzOwotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBNQVBfS0VZX1RFTVBPUkFMX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlUZW1wb3JhbCgpIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBtYXBLZXlUZW1wb3JhbCA9IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQ7Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW51bVR5cGUgTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlFbnVtZXJhdGVkKCkgPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVudW1UeXBlIG1hcEtleUVudW1lcmF0ZWQgPSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q2xhc3MoKSA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDbGFzc1JlZmVyZW5jZSBtYXBLZXlDbGFzczsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDb2x1bW4oKSA8ZW0+TWFwIEtleSBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBtYXBLZXlDb2x1bW47Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKSA8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBtYXBLZXlKb2luQ29sdW1uczsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXkoKSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwS2V5IG1hcEtleTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZEJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRCeU1hcHBpbmdfTWFwcGVkQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpCi0JewotCQlyZXR1cm4gbWFwcGVkQnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KQotCXsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCW1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlksIG9sZE1hcHBlZEJ5LCBtYXBwZWRCeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luVGFibGVDb250YWluZXJfSm9pblRhYmxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKb2luVGFibGUgZ2V0Sm9pblRhYmxlKCkKLQl7Ci0JCXJldHVybiBqb2luVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Sm9pblRhYmxlKFhtbEpvaW5UYWJsZSBuZXdKb2luVGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxKb2luVGFibGUgb2xkSm9pblRhYmxlID0gam9pblRhYmxlOwotCQlqb2luVGFibGUgPSBuZXdKb2luVGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlKQotCXsKLQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBqb2luVGFibGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClqb2luVGFibGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Sm9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0pvaW5UYWJsZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEpvaW5UYWJsZShuZXdKb2luVGFibGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEUsIG5ld0pvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPcmRlcmFibGVfMl8wX09yZGVyQ29sdW1uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPcmRlckNvbHVtbiBnZXRPcmRlckNvbHVtbigpCi0JewotCQlyZXR1cm4gb3JkZXJDb2x1bW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0T3JkZXJDb2x1bW4oWG1sT3JkZXJDb2x1bW4gbmV3T3JkZXJDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxPcmRlckNvbHVtbiBvbGRPcmRlckNvbHVtbiA9IG9yZGVyQ29sdW1uOwotCQlvcmRlckNvbHVtbiA9IG5ld09yZGVyQ29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQ09MVU1OLCBvbGRPcmRlckNvbHVtbiwgbmV3T3JkZXJDb2x1bW4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3JkZXJDb2x1bW4gPGVtPk9yZGVyIENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRPcmRlckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uIG5ld09yZGVyQ29sdW1uKQotCXsKLQkJaWYgKG5ld09yZGVyQ29sdW1uICE9IG9yZGVyQ29sdW1uKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChvcmRlckNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClvcmRlckNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09yZGVyQ29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09yZGVyQ29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRPcmRlckNvbHVtbihuZXdPcmRlckNvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQ09MVU1OLCBuZXdPcmRlckNvbHVtbiwgbmV3T3JkZXJDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9yZGVyQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9yZGVyYWJsZV9PcmRlckJ5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpIHsKLQkJcmV0dXJuIG9yZGVyQnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcmRlckJ5IDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9yZGVyQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5KFN0cmluZyBuZXdPcmRlckJ5KSB7Ci0JCVN0cmluZyBvbGRPcmRlckJ5ID0gb3JkZXJCeTsKLQkJb3JkZXJCeSA9IG5ld09yZGVyQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWSwgb2xkT3JkZXJCeSwgb3JkZXJCeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQotCXsKLQkJaWYgKG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5Q2xhc3MoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMF9NYXBLZXlDbGFzcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ2xhc3NSZWZlcmVuY2UgZ2V0TWFwS2V5Q2xhc3MoKQotCXsKLQkJcmV0dXJuIG1hcEtleUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1hcEtleUNsYXNzKFhtbENsYXNzUmVmZXJlbmNlIG5ld01hcEtleUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xhc3NSZWZlcmVuY2Ugb2xkTWFwS2V5Q2xhc3MgPSBtYXBLZXlDbGFzczsKLQkJbWFwS2V5Q2xhc3MgPSBuZXdNYXBLZXlDbGFzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQ0xBU1MsIG9sZE1hcEtleUNsYXNzLCBuZXdNYXBLZXlDbGFzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSBuZXdNYXBLZXlDbGFzcykKLQl7Ci0JCWlmIChuZXdNYXBLZXlDbGFzcyAhPSBtYXBLZXlDbGFzcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFwS2V5Q2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFwS2V5Q2xhc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DTEFTUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWFwS2V5Q2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWFwS2V5Q2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DTEFTUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRNYXBLZXlDbGFzcyhuZXdNYXBLZXlDbGFzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DTEFTUywgbmV3TWFwS2V5Q2xhc3MsIG5ld01hcEtleUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldE1hcEtleVRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleVRlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRNYXBLZXlUZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gbWFwS2V5VGVtcG9yYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldE1hcEtleVRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld01hcEtleVRlbXBvcmFsKQotCXsKLQkJVGVtcG9yYWxUeXBlIG9sZE1hcEtleVRlbXBvcmFsID0gbWFwS2V5VGVtcG9yYWw7Ci0JCW1hcEtleVRlbXBvcmFsID0gbmV3TWFwS2V5VGVtcG9yYWwgPT0gbnVsbCA/IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdNYXBLZXlUZW1wb3JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfVEVNUE9SQUwsIG9sZE1hcEtleVRlbXBvcmFsLCBtYXBLZXlUZW1wb3JhbCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjc2V0TWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleUVudW1lcmF0ZWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW51bVR5cGUgZ2V0TWFwS2V5RW51bWVyYXRlZCgpCi0JewotCQlyZXR1cm4gbWFwS2V5RW51bWVyYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcEtleUVudW1lcmF0ZWQgPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlICNnZXRNYXBLZXlFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZSBuZXdNYXBLZXlFbnVtZXJhdGVkKQotCXsKLQkJRW51bVR5cGUgb2xkTWFwS2V5RW51bWVyYXRlZCA9IG1hcEtleUVudW1lcmF0ZWQ7Ci0JCW1hcEtleUVudW1lcmF0ZWQgPSBuZXdNYXBLZXlFbnVtZXJhdGVkID09IG51bGwgPyBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQgOiBuZXdNYXBLZXlFbnVtZXJhdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9FTlVNRVJBVEVELCBvbGRNYXBLZXlFbnVtZXJhdGVkLCBtYXBLZXlFbnVtZXJhdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Q29sdW1uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCkKLQl7Ci0JCXJldHVybiBtYXBLZXlDb2x1bW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbiBuZXdNYXBLZXlDb2x1bW4sIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDb2x1bW4gb2xkTWFwS2V5Q29sdW1uID0gbWFwS2V5Q29sdW1uOwotCQltYXBLZXlDb2x1bW4gPSBuZXdNYXBLZXlDb2x1bW47Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0NPTFVNTiwgb2xkTWFwS2V5Q29sdW1uLCBuZXdNYXBLZXlDb2x1bW4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0TWFwS2V5Q29sdW1uIDxlbT5NYXAgS2V5IENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE1hcEtleUNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcEtleUNvbHVtbihYbWxDb2x1bW4gbmV3TWFwS2V5Q29sdW1uKQotCXsKLQkJaWYgKG5ld01hcEtleUNvbHVtbiAhPSBtYXBLZXlDb2x1bW4pCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG1hcEtleUNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltYXBLZXlDb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hcEtleUNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXlDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0TWFwS2V5Q29sdW1uKG5ld01hcEtleUNvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU4sIG5ld01hcEtleUNvbHVtbiwgbmV3TWFwS2V5Q29sdW1uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wX01hcEtleUpvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRNYXBLZXlKb2luQ29sdW1ucygpCi0JewotCQlpZiAobWFwS2V5Sm9pbkNvbHVtbnMgPT0gbnVsbCkKLQkJewotCQkJbWFwS2V5Sm9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSm9pbkNvbHVtbj4oWG1sSm9pbkNvbHVtbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gbWFwS2V5Sm9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXBLZXkoTWFwS2V5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTWFwS2V5IGdldE1hcEtleSgpIHsKLQkJcmV0dXJuIG1hcEtleTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCU1hcEtleSBvbGRNYXBLZXkgPSBtYXBLZXk7Ci0JCW1hcEtleSA9IG5ld01hcEtleTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVksIG9sZE1hcEtleSwgbmV3TWFwS2V5KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5KE1hcEtleSBuZXdNYXBLZXkpIHsKLQkJaWYgKG5ld01hcEtleSAhPSBtYXBLZXkpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG1hcEtleSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCltYXBLZXkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3TWFwS2V5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hcEtleSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hcEtleShuZXdNYXBLZXksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVksIG5ld01hcEtleSwgbmV3TWFwS2V5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBiYXNpY1NldEpvaW5UYWJsZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0NPTFVNTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRPcmRlckNvbHVtbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0NMQVNTOgotCQkJCXJldHVybiBiYXNpY1NldE1hcEtleUNsYXNzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0TWFwS2V5Q29sdW1uKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZOgotCQkJCXJldHVybiBiYXNpY1NldE1hcEtleShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZEJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBnZXRKb2luVGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0T3JkZXJDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOgotCQkJCXJldHVybiBnZXRPcmRlckJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9URU1QT1JBTDoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5VGVtcG9yYWwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfRU5VTUVSQVRFRDoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5RW51bWVyYXRlZCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5Q2xhc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQ09MVU1OOgotCQkJCXJldHVybiBnZXRNYXBLZXlDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRNYXBLZXlKb2luQ29sdW1ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWToKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZOgotCQkJCXNldE1hcHBlZEJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0NPTFVNTjoKLQkJCQlzZXRPcmRlckNvbHVtbigoWG1sT3JkZXJDb2x1bW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOgotCQkJCXNldE9yZGVyQnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfVEVNUE9SQUw6Ci0JCQkJc2V0TWFwS2V5VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9FTlVNRVJBVEVEOgotCQkJCXNldE1hcEtleUVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0NMQVNTOgotCQkJCXNldE1hcEtleUNsYXNzKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU46Ci0JCQkJc2V0TWFwS2V5Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldE1hcEtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBLZXlKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk6Ci0JCQkJc2V0TWFwS2V5KChNYXBLZXkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWToKLQkJCQlzZXRNYXBwZWRCeShNQVBQRURfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQ09MVU1OOgotCQkJCXNldE9yZGVyQ29sdW1uKChYbWxPcmRlckNvbHVtbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWToKLQkJCQlzZXRPcmRlckJ5KE9SREVSX0JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX1RFTVBPUkFMOgotCQkJCXNldE1hcEtleVRlbXBvcmFsKE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfRU5VTUVSQVRFRDoKLQkJCQlzZXRNYXBLZXlFbnVtZXJhdGVkKE1BUF9LRVlfRU5VTUVSQVRFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DTEFTUzoKLQkJCQlzZXRNYXBLZXlDbGFzcygoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU46Ci0JCQkJc2V0TWFwS2V5Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk6Ci0JCQkJc2V0TWFwS2V5KChNYXBLZXkpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWToKLQkJCQlyZXR1cm4gTUFQUEVEX0JZX0VERUZBVUxUID09IG51bGwgPyBtYXBwZWRCeSAhPSBudWxsIDogIU1BUFBFRF9CWV9FREVGQVVMVC5lcXVhbHMobWFwcGVkQnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gam9pblRhYmxlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9DT0xVTU46Ci0JCQkJcmV0dXJuIG9yZGVyQ29sdW1uICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUkRFUl9CWToKLQkJCQlyZXR1cm4gT1JERVJfQllfRURFRkFVTFQgPT0gbnVsbCA/IG9yZGVyQnkgIT0gbnVsbCA6ICFPUkRFUl9CWV9FREVGQVVMVC5lcXVhbHMob3JkZXJCeSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyAhPSBudWxsICYmICFtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9URU1QT1JBTDoKLQkJCQlyZXR1cm4gbWFwS2V5VGVtcG9yYWwgIT0gTUFQX0tFWV9URU1QT1JBTF9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfRU5VTUVSQVRFRDoKLQkJCQlyZXR1cm4gbWFwS2V5RW51bWVyYXRlZCAhPSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0NMQVNTOgotCQkJCXJldHVybiBtYXBLZXlDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU46Ci0JCQkJcmV0dXJuIG1hcEtleUNvbHVtbiAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIG1hcEtleUpvaW5Db2x1bW5zICE9IG51bGwgJiYgIW1hcEtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk6Ci0JCQkJcmV0dXJuIG1hcEtleSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRCeU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5UYWJsZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0NPTlRBSU5FUl9fSk9JTl9UQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcmRlcmFibGVfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQ09MVU1OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09SREVSQUJMRV8yMF9fT1JERVJfQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyYWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT1JERVJBQkxFX19PUkRFUl9CWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfVEVNUE9SQUw6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9DT05WRVJUSUJMRV9NQVBQSU5HXzIwX19NQVBfS0VZX1RFTVBPUkFMOwotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfRU5VTUVSQVRFRDogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjBfX01BUF9LRVlfRU5VTUVSQVRFRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DTEFTUzogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fTUFQX0tFWV9DTEFTUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0NPTFVNTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fTUFQX0tFWV9DT0xVTU47Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkQnlNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFBFRF9CWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luVGFibGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfQ09OVEFJTkVSX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT3JkZXJhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX09SREVSQUJMRV8yMF9fT1JERVJfQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0NPTFVNTjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcmRlcmFibGUuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSQUJMRV9fT1JERVJfQlk6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjBfX01BUF9LRVlfVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9URU1QT1JBTDsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjBfX01BUF9LRVlfRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0VOVU1FUkFURUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX0NMQVNTOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQ0xBU1M7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQ09MVU1OOwotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hcHBlZEJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWRCeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3JkZXJCeTogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3JkZXJCeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbWFwS2V5VGVtcG9yYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcEtleVRlbXBvcmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBLZXlFbnVtZXJhdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXBLZXlFbnVtZXJhdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLk1BUFBFRF9CWSk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBLZXlFbnVtZXJhdGVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwS2V5VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUwpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwS2V5Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVNYXBLZXlDbGFzc0VkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gZ2V0TWFwS2V5Q2xhc3MoKS5jcmVhdGVSZW5hbWVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZU1hcEtleUNsYXNzUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJcmV0dXJuIGdldE1hcEtleUNsYXNzKCkuY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQobmV3TmFtZSk7CQkKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk9SREVSX0JZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcmRlcmFibGVfT3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIE1hcEtleS5idWlsZFRyYW5zbGF0b3IoSlBBLk1BUF9LRVksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9URU1QT1JBTCwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzBfTWFwS2V5VGVtcG9yYWwoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9FTlVNRVJBVEVELCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMF9NYXBLZXlFbnVtZXJhdGVkKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9DTEFTUywgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5Q29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfQ09MVU1OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMF9NYXBLZXlDb2x1bW4oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Sm9pbkNvbHVtbnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwcGVkQnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk1BUFBFRF9CWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkQnlNYXBwaW5nX01hcHBlZEJ5KCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQXR0cmlidXRlT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEpvaW5UYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcl9Kb2luVGFibGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3JkZXJDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sT3JkZXJDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5PUkRFUl9DT0xVTU4sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcmRlcmFibGVfMl8wX09yZGVyQ29sdW1uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxOYW1lZENvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDNhMTM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbE5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFic3RyYWN0IFhtbCBOYW1lZCBDb2x1bW48L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxOYW1lZENvbHVtbgotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5EZWZpbml0aW9uKCkgPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW5EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW5EZWZpbml0aW9uKCkgPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW5EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbHVtbkRlZmluaXRpb24gPSBDT0xVTU5fREVGSU5JVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29sdW1uRGVmaW5pdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRDb2x1bW5fQ29sdW1uRGVmaW5pdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKQotCXsKLQkJcmV0dXJuIGNvbHVtbkRlZmluaXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uI2dldENvbHVtbkRlZmluaXRpb24gPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q29sdW1uRGVmaW5pdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIG5ld0NvbHVtbkRlZmluaXRpb24pCi0JewotCQlTdHJpbmcgb2xkQ29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247Ci0JCWNvbHVtbkRlZmluaXRpb24gPSBuZXdDb2x1bW5EZWZpbml0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OLCBvbGRDb2x1bW5EZWZpbml0aW9uLCBjb2x1bW5EZWZpbml0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbHVtbl9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTmFtZWRDb2x1bW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT046Ci0JCQkJc2V0Q29sdW1uRGVmaW5pdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjoKLQkJCQlzZXRDb2x1bW5EZWZpbml0aW9uKENPTFVNTl9ERUZJTklUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT046Ci0JCQkJcmV0dXJuIENPTFVNTl9ERUZJTklUSU9OX0VERUZBVUxUID09IG51bGwgPyBjb2x1bW5EZWZpbml0aW9uICE9IG51bGwgOiAhQ09MVU1OX0RFRklOSVRJT05fRURFRkFVTFQuZXF1YWxzKGNvbHVtbkRlZmluaXRpb24pOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29sdW1uRGVmaW5pdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29sdW1uRGVmaW5pdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLk5BTUUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbHVtbl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNPTFVNTl9ERUZJTklUSU9OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi19IC8vIEFic3RyYWN0WG1sTmFtZWRDb2x1bW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzllOWQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFic3RyYWN0IFhtbCBSZWZlcmVuY2UgVGFibGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlIGV4dGVuZHMgQWJzdHJhY3RYbWxUYWJsZSBpbXBsZW1lbnRzIFhtbFJlZmVyZW5jZVRhYmxlCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pbkNvbHVtbnMoKSA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gam9pbkNvbHVtbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9SRUZFUkVOQ0VfVEFCTEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxSZWZlcmVuY2VUYWJsZV9Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUZFUkVOQ0VfVEFCTEVfX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUZFUkVOQ0VfVEFCTEVfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxSZWZlcmVuY2VUYWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9SRUZFUkVOQ0VfVEFCTEVfX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFJlZmVyZW5jZVRhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9SRUZFUkVOQ0VfVEFCTEVfX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9fSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5KT0lOX0NPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUmVmZXJlbmNlVGFibGVfSm9pbkNvbHVtbnMoKSk7Ci0JfQotCi19IC8vIEFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzMTdmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlbGF0aW9uc2hpcCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRUYXJnZXRFbnRpdHkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Q2FzY2FkZSA8ZW0+Q2FzY2FkZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVudGl0eSgpIDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldEVudGl0eSgpIDxlbT5UYXJnZXQgRW50aXR5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYXJnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0RW50aXR5ID0gVEFSR0VUX0VOVElUWV9FREVGQVVMVDsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGUgRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoKCkgPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBmZXRjaCA9IEZFVENIX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhc2NhZGUoKSA8ZW0+Q2FzY2FkZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FzY2FkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIENhc2NhZGVUeXBlIGNhc2NhZGU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBFbnRpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VGFyZ2V0RW50aXR5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0RW50aXR5KCkgewotCQlyZXR1cm4gdGFyZ2V0RW50aXR5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldFRhcmdldEVudGl0eSA8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0RW50aXR5KFN0cmluZyBuZXdUYXJnZXRFbnRpdHkpIHsKLQkJU3RyaW5nIG9sZFRhcmdldEVudGl0eSA9IHRhcmdldEVudGl0eTsKLQkJdGFyZ2V0RW50aXR5ID0gbmV3VGFyZ2V0RW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSwgb2xkVGFyZ2V0RW50aXR5LCB0YXJnZXRFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJMQVpZIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNzZXRGZXRjaChGZXRjaFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iTEFaWSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZldGNoVHlwZSBnZXRGZXRjaCgpIHsKLQkJcmV0dXJuIGZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkgewotCQlGZXRjaFR5cGUgb2xkRmV0Y2ggPSBmZXRjaDsKLQkJZmV0Y2ggPSBuZXdGZXRjaCA9PSBudWxsID8gRkVUQ0hfRURFRkFVTFQgOiBuZXdGZXRjaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENhc2NhZGUoQ2FzY2FkZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENhc2NhZGVUeXBlIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiBjYXNjYWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENhc2NhZGUoQ2FzY2FkZVR5cGUgbmV3Q2FzY2FkZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUNhc2NhZGVUeXBlIG9sZENhc2NhZGUgPSBjYXNjYWRlOwotCQljYXNjYWRlID0gbmV3Q2FzY2FkZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUsIG9sZENhc2NhZGUsIG5ld0Nhc2NhZGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldENhc2NhZGUgPGVtPkNhc2NhZGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENhc2NhZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlKENhc2NhZGVUeXBlIG5ld0Nhc2NhZGUpIHsKLQkJaWYgKG5ld0Nhc2NhZGUgIT0gY2FzY2FkZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY2FzY2FkZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljYXNjYWRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Nhc2NhZGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q2FzY2FkZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENhc2NhZGUobmV3Q2FzY2FkZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSwgbmV3Q2FzY2FkZSwgbmV3Q2FzY2FkZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERToKLQkJCQlyZXR1cm4gYmFzaWNTZXRDYXNjYWRlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIGdldFRhcmdldEVudGl0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g6Ci0JCQkJcmV0dXJuIGdldEZldGNoKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOgotCQkJCXJldHVybiBnZXRDYXNjYWRlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWToKLQkJCQlzZXRUYXJnZXRFbnRpdHkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goKEZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERToKLQkJCQlzZXRDYXNjYWRlKChDYXNjYWRlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWToKLQkJCQlzZXRUYXJnZXRFbnRpdHkoVEFSR0VUX0VOVElUWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goRkVUQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU6Ci0JCQkJc2V0Q2FzY2FkZSgoQ2FzY2FkZVR5cGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk6Ci0JCQkJcmV0dXJuIFRBUkdFVF9FTlRJVFlfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldEVudGl0eSAhPSBudWxsIDogIVRBUkdFVF9FTlRJVFlfRURFRkFVTFQuZXF1YWxzKHRhcmdldEVudGl0eSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOgotCQkJCXJldHVybiBjYXNjYWRlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHRhcmdldEVudGl0eTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFyZ2V0RW50aXR5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmZXRjaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdGFyZ2V0LWVudGl0eSBhdHRyaWJ1dGUuCi0JICovCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUYXJnZXRFbnRpdHlUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlRBUkdFVF9FTlRJVFkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlRBUkdFVF9FTlRJVFksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkZFVENILCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfRmV0Y2goKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FzY2FkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDYXNjYWRlVHlwZS5idWlsZFRyYW5zbGF0b3IoSlBBLkNBU0NBREUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lVGFyZ2V0RW50aXR5RWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMudGFyZ2V0RW50aXR5Lmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEpQQS5UQVJHRVRfRU5USVRZKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOwotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lVGFyZ2V0RW50aXR5UGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLnRhcmdldEVudGl0eS5sYXN0SW5kZXhPZignLicpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShKUEEuVEFSR0VUX0VOVElUWSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsgLy8gKzEgPSBvcGVuaW5nIGRvdWJsZSBxdW90ZQotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgcGFja2FnZUxlbmd0aCwgbmV3TmFtZSk7Ci0JfQotCi19IC8vIFJlbGF0aW9uc2hpcE1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkYzA0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyBleHRlbmRzIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRzIFhtbEpvaW5UYWJsZUNvbnRhaW5lciwgWG1sSm9pbkNvbHVtbkNvbnRhaW5lciwgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luVGFibGUoKSA8ZW0+Sm9pbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sSm9pblRhYmxlIGpvaW5UYWJsZTsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKb2luQ29sdW1ucygpIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBqb2luQ29sdW1uczsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWQoKSA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gSURfRURFRkFVTFQgPSBudWxsOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldElkKCkgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaWQgPSBJRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwc0lkKCkgPGVtPk1hcHMgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHNJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQU19JRF9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwc0lkKCkgPGVtPk1hcHMgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHNJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBtYXBzSWQgPSBNQVBTX0lEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcHRpb25hbCgpIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3B0aW9uYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBPUFRJT05BTF9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbCA9IE9QVElPTkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZUNvbnRhaW5lcl9Kb2luVGFibGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5UYWJsZSBnZXRKb2luVGFibGUoKQotCXsKLQkJcmV0dXJuIGpvaW5UYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIG5ld0pvaW5UYWJsZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbEpvaW5UYWJsZSBvbGRKb2luVGFibGUgPSBqb2luVGFibGU7Ci0JCWpvaW5UYWJsZSA9IG5ld0pvaW5UYWJsZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBvbGRKb2luVGFibGUsIG5ld0pvaW5UYWJsZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlIG5ld0pvaW5UYWJsZSkKLQl7Ci0JCWlmIChuZXdKb2luVGFibGUgIT0gam9pblRhYmxlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChqb2luVGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3Qpam9pblRhYmxlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdKb2luVGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Sm9pblRhYmxlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEpvaW5UYWJsZShuZXdKb2luVGFibGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFLCBuZXdKb2luVGFibGUsIG5ld0pvaW5UYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcl9Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRJZChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbERlcml2ZWRJZF8yXzBfSWQoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyNnZXRJZCA8ZW0+SWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPklkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKEJvb2xlYW4gbmV3SWQpCi0JewotCQlCb29sZWFuIG9sZElkID0gaWQ7Ci0JCWlkID0gbmV3SWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSUQsIG9sZElkLCBpZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHMgSWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcyBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwc0lkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHNJZCgpCi0JewotCQlyZXR1cm4gbWFwc0lkOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE1hcHNJZCA8ZW0+TWFwcyBJZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcyBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwc0lkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwc0lkKFN0cmluZyBuZXdNYXBzSWQpCi0JewotCQlTdHJpbmcgb2xkTWFwc0lkID0gbWFwc0lkOwotCQltYXBzSWQgPSBuZXdNYXBzSWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRCwgb2xkTWFwc0lkLCBtYXBzSWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9wdGlvbmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nX09wdGlvbmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpIHsKLQkJcmV0dXJuIG9wdGlvbmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9wdGlvbmFsIDxlbT5PcHRpb25hbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3B0aW9uYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoQm9vbGVhbiBuZXdPcHRpb25hbCkgewotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCW9wdGlvbmFsID0gbmV3T3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUwsIG9sZE9wdGlvbmFsLCBvcHRpb25hbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Sm9pblRhYmxlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRToKLQkJCQlyZXR1cm4gZ2V0Sm9pblRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBnZXRKb2luQ29sdW1ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBnZXRJZCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFNfSUQ6Ci0JCQkJcmV0dXJuIGdldE1hcHNJZCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOgotCQkJCXJldHVybiBnZXRPcHRpb25hbCgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19JRDoKLQkJCQlzZXRJZCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFNfSUQ6Ci0JCQkJc2V0TWFwc0lkKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6Ci0JCQkJc2V0Sm9pblRhYmxlKChYbWxKb2luVGFibGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEOgotCQkJCXNldElkKElEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRDoKLQkJCQlzZXRNYXBzSWQoTUFQU19JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX09QVElPTkFMOgotCQkJCXNldE9wdGlvbmFsKE9QVElPTkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGpvaW5UYWJsZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEOgotCQkJCXJldHVybiBJRF9FREVGQVVMVCA9PSBudWxsID8gaWQgIT0gbnVsbCA6ICFJRF9FREVGQVVMVC5lcXVhbHMoaWQpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUFNfSUQ6Ci0JCQkJcmV0dXJuIE1BUFNfSURfRURFRkFVTFQgPT0gbnVsbCA/IG1hcHNJZCAhPSBudWxsIDogIU1BUFNfSURfRURFRkFVTFQuZXF1YWxzKG1hcHNJZCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIE9QVElPTkFMX0VERUZBVUxUID09IG51bGwgPyBvcHRpb25hbCAhPSBudWxsIDogIU9QVElPTkFMX0VERUZBVUxULmVxdWFscyhvcHRpb25hbCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5UYWJsZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9DT05UQUlORVJfX0pPSU5fVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkNvbHVtbkNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9DT05UQUlORVJfX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxEZXJpdmVkSWRfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0RFUklWRURfSURfMjBfX0lEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcHNJZF8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRDogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9NQVBTX0lEXzIwX19NQVBTX0lEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luVGFibGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfQ09OVEFJTkVSX19KT0lOX1RBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5Db2x1bW5Db250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX0NPTlRBSU5FUl9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRGVyaXZlZElkXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0RFUklWRURfSURfMjBfX0lEOiByZXR1cm4gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19JRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBzSWRfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfTUFQU19JRF8yMF9fTUFQU19JRDogcmV0dXJuIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoaWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGlkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBzSWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcHNJZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3B0aW9uYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG9wdGlvbmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwc0lkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQTJfMC5NQVBTX0lEKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRJZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuSUQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuT1BUSU9OQUwsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUFNfSUQsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuSUQsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxEZXJpdmVkSWRfMl8wX0lkKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSm9pbkNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uQ29udGFpbmVyX0pvaW5Db2x1bW5zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSm9pblRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuSk9JTl9UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyX0pvaW5UYWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Fic3RyYWN0WG1sVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2OTc0NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxUYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnN0cmFjdCBYbWwgQmFzZSBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRVbmlxdWVDb25zdHJhaW50cyA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RYbWxUYWJsZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2cgPSBDQVRBTE9HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2hlbWEgPSBTQ0hFTUFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWVDb25zdHJhaW50cygpIDxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbFRhYmxlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX1RBQkxFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUYWJsZV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxUYWJsZV9DYXRhbG9nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpCi0JewotCQlyZXR1cm4gY2F0YWxvZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpCi0JewotCQlTdHJpbmcgb2xkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCWNhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRywgb2xkQ2F0YWxvZywgY2F0YWxvZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U2NoZW1hKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFRhYmxlX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCi0JewotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkKLQl7Ci0JCVN0cmluZyBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0JCXNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQSwgb2xkU2NoZW1hLCBzY2hlbWEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IGdldFVuaXF1ZUNvbnN0cmFpbnRzKCkKLQl7Ci0JCWlmICh1bmlxdWVDb25zdHJhaW50cyA9PSBudWxsKQotCQl7Ci0JCQl1bmlxdWVDb25zdHJhaW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PihYbWxVbmlxdWVDb25zdHJhaW50LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKLQkJfQotCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRVbmlxdWVDb25zdHJhaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gZ2V0Q2F0YWxvZygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BOgotCQkJCXJldHVybiBnZXRTY2hlbWEoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlyZXR1cm4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRzoKLQkJCQlzZXRDYXRhbG9nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVW5pcXVlQ29uc3RyYWludD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coQ0FUQUxPR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BOgotCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUzoKLQkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIENBVEFMT0dfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2cgIT0gbnVsbCA6ICFDQVRBTE9HX0VERUZBVUxULmVxdWFscyhjYXRhbG9nKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQToKLQkJCQlyZXR1cm4gU0NIRU1BX0VERUZBVUxUID09IG51bGwgPyBzY2hlbWEgIT0gbnVsbCA6ICFTQ0hFTUFfRURFRkFVTFQuZXF1YWxzKHNjaGVtYSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnRzICE9IG51bGwgJiYgIXVuaXF1ZUNvbnN0cmFpbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NoZW1hOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChzY2hlbWEpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTkFNRSk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2F0YWxvZ1RleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuQ0FUQUxPRyk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0U2NoZW1hVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5TQ0hFTUEpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFRhYmxlX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0FUQUxPRywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZV9DYXRhbG9nKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuU0NIRU1BLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFRhYmxlX1NjaGVtYSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVbmlxdWVDb25zdHJhaW50VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFVuaXF1ZUNvbnN0cmFpbnQuYnVpbGRUcmFuc2xhdG9yKEpQQS5VTklRVUVfQ09OU1RSQUlOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpKTsKLQl9Ci0KLX0gLy8gQWJzdHJhY3RYbWxCYXNlVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWJzdHJhY3RYbWxUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWZhNWExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UeXBlIE1hcHBpbmc8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sVHlwZU1hcHBpbmcKLXsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3MoKSA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3MoKSA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWNjZXNzID0gQUNDRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzTmFtZSgpIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjbGFzc05hbWUgPSBDTEFTU19OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGFkYXRhQ29tcGxldGUoKSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRhZGF0YUNvbXBsZXRlKCkgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBtZXRhZGF0YUNvbXBsZXRlID0gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZXMoKSA8ZW0+QXR0cmlidXRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZXMgYXR0cmlidXRlczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElORzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfQ2xhc3NOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gY2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgbmV3Q2xhc3NOYW1lKQotCXsKLQkJU3RyaW5nIG9sZENsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBY2Nlc3MoKQotCXsKLQkJcmV0dXJuIGFjY2VzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKFN0cmluZyBuZXdBY2Nlc3MpCi0JewotCQlTdHJpbmcgb2xkQWNjZXNzID0gYWNjZXNzOwotCQlhY2Nlc3MgPSBuZXdBY2Nlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTLCBvbGRBY2Nlc3MsIGFjY2VzcykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBCb29sZWFuIGdldE1ldGFkYXRhQ29tcGxldGUoKQotCXsKLQkJcmV0dXJuIG1ldGFkYXRhQ29tcGxldGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldE1ldGFkYXRhQ29tcGxldGUgPGVtPk1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbiBuZXdNZXRhZGF0YUNvbXBsZXRlKQotCXsKLQkJQm9vbGVhbiBvbGRNZXRhZGF0YUNvbXBsZXRlID0gbWV0YWRhdGFDb21wbGV0ZTsKLQkJbWV0YWRhdGFDb21wbGV0ZSA9IG5ld01ldGFkYXRhQ29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEUsIG9sZE1ldGFkYXRhQ29tcGxldGUsIG1ldGFkYXRhQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCi0JewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlcyBnZXRBdHRyaWJ1dGVzKCkKLQl7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBuZXdBdHRyaWJ1dGVzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJQXR0cmlidXRlcyBvbGRBdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLQkJYXR0cmlidXRlcyA9IG5ld0F0dHJpYnV0ZXM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUywgb2xkQXR0cmlidXRlcywgbmV3QXR0cmlidXRlcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgbmV3QXR0cmlidXRlcykKLQl7Ci0JCWlmIChuZXdBdHRyaWJ1dGVzICE9IGF0dHJpYnV0ZXMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpYXR0cmlidXRlcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3QXR0cmlidXRlcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdBdHRyaWJ1dGVzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF0dHJpYnV0ZXMobmV3QXR0cmlidXRlcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVMsIG5ld0F0dHJpYnV0ZXMsIG5ld0F0dHJpYnV0ZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZXMobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzoKLQkJCQlyZXR1cm4gZ2V0QWNjZXNzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEU6Ci0JCQkJcmV0dXJuIGdldE1ldGFkYXRhQ29tcGxldGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzoKLQkJCQlzZXRBY2Nlc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU6Ci0JCQkJc2V0Q2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlzZXRNZXRhZGF0YUNvbXBsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM6Ci0JCQkJc2V0QXR0cmlidXRlcygoQXR0cmlidXRlcyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzoKLQkJCQlzZXRBY2Nlc3MoQUNDRVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXNldE1ldGFkYXRhQ29tcGxldGUoTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM6Ci0JCQkJc2V0QXR0cmlidXRlcygoQXR0cmlidXRlcyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzoKLQkJCQlyZXR1cm4gQUNDRVNTX0VERUZBVUxUID09IG51bGwgPyBhY2Nlc3MgIT0gbnVsbCA6ICFBQ0NFU1NfRURFRkFVTFQuZXF1YWxzKGFjY2Vzcyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gQ0xBU1NfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gY2xhc3NOYW1lICE9IG51bGwgOiAhQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoY2xhc3NOYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4gTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQgPT0gbnVsbCA/IG1ldGFkYXRhQ29tcGxldGUgIT0gbnVsbCA6ICFNRVRBREFUQV9DT01QTEVURV9FREVGQVVMVC5lcXVhbHMobWV0YWRhdGFDb21wbGV0ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlcyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChhY2Nlc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFjY2Vzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2xhc3NOYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjbGFzc05hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGFkYXRhQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGFkYXRhQ29tcGxldGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkNMQVNTKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkFUVFJJQlVURVMpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKXsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTkFNRSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5DTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZU1hcHBpbmdfQ2xhc3NOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1ldGFkYXRhQ29tcGxldGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk1FVEFEQVRBX0NPTVBMRVRFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19NZXRhZGF0YUNvbXBsZXRlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5ERVNDUklQVElPTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEF0dHJpYnV0ZXNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkFDQ0VTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQWNjZXNzSG9sZGVyX0FjY2VzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lVHlwZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gb3JpZ2luYWxUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKCk7Ci0JCWludCBuYW1lSW5kZXggPSB0aGlzLmNsYXNzTmFtZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCQlpbnQgb2Zmc2V0ID0gZ2V0QXR0cmlidXRlTm9kZShKUEEuQ0xBU1MpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCWludCBwYWNrYWdlTGVuZ3RoID0gdGhpcy5jbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaWYgKHBhY2thZ2VMZW5ndGggPT0gLTEpIHsKLQkJCXBhY2thZ2VMZW5ndGggPSAwOwotCQkJbmV3TmFtZSA9IG5ld05hbWUgKyAnLic7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoSlBBLkNMQVNTKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdOYW1lKTsKLQl9Ci0KLX0gLy8gVHlwZU1hcHBpbmcKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BY2Nlc3NUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQWNjZXNzVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVjY2ZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BY2Nlc3NUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWNjZXNzVHlwZQotewotCVN0cmluZyBQUk9QRVJUWSA9ICJQUk9QRVJUWSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRklFTEQgPSAiRklFTEQiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9BdHRyaWJ1dGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWI3MWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0F0dHJpYnV0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRJZHMgPGVtPklkczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEVtYmVkZGVkSWRzIDxlbT5FbWJlZGRlZCBJZHM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY3MgPGVtPkJhc2ljczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZlcnNpb25zIDxlbT5WZXJzaW9uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE1hbnlUb09uZXMgPGVtPk1hbnkgVG8gT25lczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE9uZVRvTWFueXMgPGVtPk9uZSBUbyBNYW55czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE9uZVRvT25lcyA8ZW0+T25lIFRvIE9uZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRNYW55VG9NYW55cyA8ZW0+TWFueSBUbyBNYW55czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEVtYmVkZGVkcyA8ZW0+RW1iZWRkZWRzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VHJhbnNpZW50cyA8ZW0+VHJhbnNpZW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlcyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEF0dHJpYnV0ZXNfMl8wCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbGVtZW50Q29sbGVjdGlvbnMoKSA8ZW0+RWxlbWVudCBDb2xsZWN0aW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbGVtZW50Q29sbGVjdGlvbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxFbGVtZW50Q29sbGVjdGlvbj4gZWxlbWVudENvbGxlY3Rpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWRzKCkgPGVtPklkczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxJZD4gaWRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW1iZWRkZWRJZHMoKSA8ZW0+RW1iZWRkZWQgSWRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVtYmVkZGVkSWRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRW1iZWRkZWRJZD4gZW1iZWRkZWRJZHM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCYXNpY3MoKSA8ZW0+QmFzaWNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEJhc2ljcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEJhc2ljPiBiYXNpY3M7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9ucygpIDxlbT5WZXJzaW9uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWZXJzaW9ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFZlcnNpb24+IHZlcnNpb25zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFueVRvT25lcygpIDxlbT5NYW55IFRvIE9uZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFueVRvT25lcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE1hbnlUb09uZT4gbWFueVRvT25lczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9uZVRvTWFueXMoKSA8ZW0+T25lIFRvIE1hbnlzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9uZVRvTWFueXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxPbmVUb01hbnk+IG9uZVRvTWFueXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPbmVUb09uZXMoKSA8ZW0+T25lIFRvIE9uZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T25lVG9PbmVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sT25lVG9PbmU+IG9uZVRvT25lczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hbnlUb01hbnlzKCkgPGVtPk1hbnkgVG8gTWFueXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFueVRvTWFueXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxNYW55VG9NYW55PiBtYW55VG9NYW55czsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVtYmVkZGVkcygpIDxlbT5FbWJlZGRlZHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW1iZWRkZWRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRW1iZWRkZWQ+IGVtYmVkZGVkczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRyYW5zaWVudHMoKSA8ZW0+VHJhbnNpZW50czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUcmFuc2llbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sVHJhbnNpZW50PiB0cmFuc2llbnRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEF0dHJpYnV0ZXMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5BVFRSSUJVVEVTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZXNfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IENvbGxlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBDb2xsZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEVsZW1lbnRDb2xsZWN0aW9uPiBnZXRFbGVtZW50Q29sbGVjdGlvbnMoKQotCXsKLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9ucyA9PSBudWxsKQotCQl7Ci0JCQllbGVtZW50Q29sbGVjdGlvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRWxlbWVudENvbGxlY3Rpb24+KFhtbEVsZW1lbnRDb2xsZWN0aW9uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VMRU1FTlRfQ09MTEVDVElPTlMpOwotCQl9Ci0JCXJldHVybiBlbGVtZW50Q29sbGVjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19JZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbElkPiBnZXRJZHMoKQotCXsKLQkJaWYgKGlkcyA9PSBudWxsKQotCQl7Ci0JCQlpZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSWQ+KFhtbElkLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0lEUyk7Ci0JCX0KLQkJcmV0dXJuIGlkczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbWJlZGRlZCBJZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW1iZWRkZWQgSWRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW1iZWRkZWQgSWRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfRW1iZWRkZWRJZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEVtYmVkZGVkSWQ+IGdldEVtYmVkZGVkSWRzKCkKLQl7Ci0JCWlmIChlbWJlZGRlZElkcyA9PSBudWxsKQotCQl7Ci0JCQllbWJlZGRlZElkcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxFbWJlZGRlZElkPihYbWxFbWJlZGRlZElkLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUyk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGVkSWRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJhc2ljczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWN9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmFzaWNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmFzaWNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfQmFzaWNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxCYXNpYz4gZ2V0QmFzaWNzKCkKLQl7Ci0JCWlmIChiYXNpY3MgPT0gbnVsbCkKLQkJewotCQkJYmFzaWNzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEJhc2ljPihYbWxCYXNpYy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1MpOwotCQl9Ci0JCXJldHVybiBiYXNpY3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb259LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX1ZlcnNpb25zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxWZXJzaW9uPiBnZXRWZXJzaW9ucygpCi0JewotCQlpZiAodmVyc2lvbnMgPT0gbnVsbCkKLQkJewotCQkJdmVyc2lvbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sVmVyc2lvbj4oWG1sVmVyc2lvbi5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WRVJTSU9OUyk7Ci0JCX0KLQkJcmV0dXJuIHZlcnNpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hbnkgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hbnkgVG8gT25lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hbnkgVG8gT25lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX01hbnlUb09uZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbE1hbnlUb09uZT4gZ2V0TWFueVRvT25lcygpCi0JewotCQlpZiAobWFueVRvT25lcyA9PSBudWxsKQotCQl7Ci0JCQltYW55VG9PbmVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE1hbnlUb09uZT4oWG1sTWFueVRvT25lLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUyk7Ci0JCX0KLQkJcmV0dXJuIG1hbnlUb09uZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T25lIFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T25lIFRvIE1hbnlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T25lIFRvIE1hbnlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXNfT25lVG9NYW55cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT25lVG9NYW55PiBnZXRPbmVUb01hbnlzKCkKLQl7Ci0JCWlmIChvbmVUb01hbnlzID09IG51bGwpCi0JCXsKLQkJCW9uZVRvTWFueXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sT25lVG9NYW55PihYbWxPbmVUb01hbnkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX01BTllTKTsKLQkJfQotCQlyZXR1cm4gb25lVG9NYW55czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T25lIFRvIE9uZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PbmUgVG8gT25lczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX09uZVRvT25lcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sT25lVG9PbmU+IGdldE9uZVRvT25lcygpCi0JewotCQlpZiAob25lVG9PbmVzID09IG51bGwpCi0JCXsKLQkJCW9uZVRvT25lcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxPbmVUb09uZT4oWG1sT25lVG9PbmUuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX09ORVMpOwotCQl9Ci0JCXJldHVybiBvbmVUb09uZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFueSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYW55IFRvIE1hbnlzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFueSBUbyBNYW55czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBdHRyaWJ1dGVzX01hbnlUb01hbnlzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxNYW55VG9NYW55PiBnZXRNYW55VG9NYW55cygpCi0JewotCQlpZiAobWFueVRvTWFueXMgPT0gbnVsbCkKLQkJewotCQkJbWFueVRvTWFueXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTWFueVRvTWFueT4oWG1sTWFueVRvTWFueS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTKTsKLQkJfQotCQlyZXR1cm4gbWFueVRvTWFueXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW1iZWRkZWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbWJlZGRlZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbWJlZGRlZHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEVtYmVkZGVkPiBnZXRFbWJlZGRlZHMoKQotCXsKLQkJaWYgKGVtYmVkZGVkcyA9PSBudWxsKQotCQl7Ci0JCQllbWJlZGRlZHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRW1iZWRkZWQ+KFhtbEVtYmVkZGVkLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUyk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGVkczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc2llbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNpZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRyYW5zaWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxUcmFuc2llbnQ+IGdldFRyYW5zaWVudHMoKQotCXsKLQkJaWYgKHRyYW5zaWVudHMgPT0gbnVsbCkKLQkJewotCQkJdHJhbnNpZW50cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUcmFuc2llbnQ+KFhtbFRyYW5zaWVudC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0lFTlRTKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNpZW50czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJZHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVtYmVkZGVkSWRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1M6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCYXNpY3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZFUlNJT05TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VmVyc2lvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hbnlUb09uZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19NQU5ZUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE9uZVRvTWFueXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19PTkVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0T25lVG9PbmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TWFueVRvTWFueXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVtYmVkZGVkcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNJRU5UUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFRyYW5zaWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiBnZXRFbGVtZW50Q29sbGVjdGlvbnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6Ci0JCQkJcmV0dXJuIGdldElkcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKLQkJCQlyZXR1cm4gZ2V0RW1iZWRkZWRJZHMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19CQVNJQ1M6Ci0JCQkJcmV0dXJuIGdldEJhc2ljcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1ZFUlNJT05TOgotCQkJCXJldHVybiBnZXRWZXJzaW9ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzoKLQkJCQlyZXR1cm4gZ2V0TWFueVRvT25lcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19NQU5ZUzoKLQkJCQlyZXR1cm4gZ2V0T25lVG9NYW55cygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19PTkVTOgotCQkJCXJldHVybiBnZXRPbmVUb09uZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOgotCQkJCXJldHVybiBnZXRNYW55VG9NYW55cygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEUzoKLQkJCQlyZXR1cm4gZ2V0RW1iZWRkZWRzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVFJBTlNJRU5UUzoKLQkJCQlyZXR1cm4gZ2V0VHJhbnNpZW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRUxFTUVOVF9DT0xMRUNUSU9OUzoKLQkJCQlnZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sRWxlbWVudENvbGxlY3Rpb24+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fSURTOgotCQkJCWdldElkcygpLmNsZWFyKCk7Ci0JCQkJZ2V0SWRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxJZD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTUJFRERFRF9JRFM6Ci0JCQkJZ2V0RW1iZWRkZWRJZHMoKS5jbGVhcigpOwotCQkJCWdldEVtYmVkZGVkSWRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxFbWJlZGRlZElkPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDUzoKLQkJCQlnZXRCYXNpY3MoKS5jbGVhcigpOwotCQkJCWdldEJhc2ljcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQmFzaWM+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVkVSU0lPTlM6Ci0JCQkJZ2V0VmVyc2lvbnMoKS5jbGVhcigpOwotCQkJCWdldFZlcnNpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxWZXJzaW9uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzoKLQkJCQlnZXRNYW55VG9PbmVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYW55VG9PbmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxNYW55VG9PbmU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX01BTllTOgotCQkJCWdldE9uZVRvTWFueXMoKS5jbGVhcigpOwotCQkJCWdldE9uZVRvTWFueXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE9uZVRvTWFueT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19PTkVfVE9fT05FUzoKLQkJCQlnZXRPbmVUb09uZXMoKS5jbGVhcigpOwotCQkJCWdldE9uZVRvT25lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sT25lVG9PbmU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fTUFOWV9UT19NQU5ZUzoKLQkJCQlnZXRNYW55VG9NYW55cygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFueVRvTWFueXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE1hbnlUb01hbnk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURTOgotCQkJCWdldEVtYmVkZGVkcygpLmNsZWFyKCk7Ci0JCQkJZ2V0RW1iZWRkZWRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxFbWJlZGRlZD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0lFTlRTOgotCQkJCWdldFRyYW5zaWVudHMoKS5jbGVhcigpOwotCQkJCWdldFRyYW5zaWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFRyYW5zaWVudD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VMRU1FTlRfQ09MTEVDVElPTlM6Ci0JCQkJZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fSURTOgotCQkJCWdldElkcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKLQkJCQlnZXRFbWJlZGRlZElkcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDUzoKLQkJCQlnZXRCYXNpY3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19WRVJTSU9OUzoKLQkJCQlnZXRWZXJzaW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX01BTllfVE9fT05FUzoKLQkJCQlnZXRNYW55VG9PbmVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX01BTllTOgotCQkJCWdldE9uZVRvTWFueXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19PTkVfVE9fT05FUzoKLQkJCQlnZXRPbmVUb09uZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOgotCQkJCWdldE1hbnlUb01hbnlzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURTOgotCQkJCWdldEVtYmVkZGVkcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX1RSQU5TSUVOVFM6Ci0JCQkJZ2V0VHJhbnNpZW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19FTEVNRU5UX0NPTExFQ1RJT05TOgotCQkJCXJldHVybiBlbGVtZW50Q29sbGVjdGlvbnMgIT0gbnVsbCAmJiAhZWxlbWVudENvbGxlY3Rpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19JRFM6Ci0JCQkJcmV0dXJuIGlkcyAhPSBudWxsICYmICFpZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0VNQkVEREVEX0lEUzoKLQkJCQlyZXR1cm4gZW1iZWRkZWRJZHMgIT0gbnVsbCAmJiAhZW1iZWRkZWRJZHMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX0JBU0lDUzoKLQkJCQlyZXR1cm4gYmFzaWNzICE9IG51bGwgJiYgIWJhc2ljcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fVkVSU0lPTlM6Ci0JCQkJcmV0dXJuIHZlcnNpb25zICE9IG51bGwgJiYgIXZlcnNpb25zLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX09ORVM6Ci0JCQkJcmV0dXJuIG1hbnlUb09uZXMgIT0gbnVsbCAmJiAhbWFueVRvT25lcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fT05FX1RPX01BTllTOgotCQkJCXJldHVybiBvbmVUb01hbnlzICE9IG51bGwgJiYgIW9uZVRvTWFueXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVNfX09ORV9UT19PTkVTOgotCQkJCXJldHVybiBvbmVUb09uZXMgIT0gbnVsbCAmJiAhb25lVG9PbmVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTOgotCQkJCXJldHVybiBtYW55VG9NYW55cyAhPSBudWxsICYmICFtYW55VG9NYW55cy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQVRUUklCVVRFU19fRU1CRURERURTOgotCQkJCXJldHVybiBlbWJlZGRlZHMgIT0gbnVsbCAmJiAhZW1iZWRkZWRzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5BVFRSSUJVVEVTX19UUkFOU0lFTlRTOgotCQkJCXJldHVybiB0cmFuc2llbnRzICE9IG51bGwgJiYgIXRyYW5zaWVudHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPiBnZXRBdHRyaWJ1dGVNYXBwaW5ncygpIHsKLQkJLy8gY29udmVydCBsaXN0cyB0byBhcnJheXMgdG8gYXZvaWQgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiB3aGlsZSBhZGRpbmcgdG8gcmVzdWx0IGxpc3QKLQkJQXJyYXlMaXN0PFhtbEF0dHJpYnV0ZU1hcHBpbmc+IGF0dHJpYnV0ZU1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxYbWxBdHRyaWJ1dGVNYXBwaW5nPigpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldElkcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRJZHMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEJhc2ljcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0VmVyc2lvbnMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE1hbnlUb09uZXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE9uZVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldE9uZVRvT25lcygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0TWFueVRvTWFueXMoKS50b0FycmF5KEVNUFRZX1hNTF9BVFRSSUJVVEVfTUFQUElOR19BUlJBWSkpOwotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGF0dHJpYnV0ZU1hcHBpbmdzLCB0aGlzLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLnRvQXJyYXkoRU1QVFlfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoYXR0cmlidXRlTWFwcGluZ3MsIHRoaXMuZ2V0RW1iZWRkZWRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChhdHRyaWJ1dGVNYXBwaW5ncywgdGhpcy5nZXRUcmFuc2llbnRzKCkudG9BcnJheShFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkpKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZU1hcHBpbmdzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbEF0dHJpYnV0ZU1hcHBpbmdbXSBFTVBUWV9YTUxfQVRUUklCVVRFX01BUFBJTkdfQVJSQVkgPSBuZXcgWG1sQXR0cmlidXRlTWFwcGluZ1swXTsKLQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKLQkJCUpQQS5BVFRSSUJVVEVTLCAKLQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlYbWxJZC5idWlsZFRyYW5zbGF0b3IoSlBBLklELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0lkcygpKSwKLQkJCVhtbEVtYmVkZGVkSWQuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTUJFRERFRF9JRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19FbWJlZGRlZElkcygpKSwKLQkJCVhtbEJhc2ljLmJ1aWxkVHJhbnNsYXRvcihKUEEuQkFTSUMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfQmFzaWNzKCkpLAotCQkJWG1sVmVyc2lvbi5idWlsZFRyYW5zbGF0b3IoSlBBLlZFUlNJT04sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfVmVyc2lvbnMoKSksCi0JCQlYbWxNYW55VG9PbmUuYnVpbGRUcmFuc2xhdG9yKEpQQS5NQU5ZX1RPX09ORSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19NYW55VG9PbmVzKCkpLAotCQkJWG1sT25lVG9NYW55LmJ1aWxkVHJhbnNsYXRvcihKUEEuT05FX1RPX01BTlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfT25lVG9NYW55cygpKSwKLQkJCVhtbE9uZVRvT25lLmJ1aWxkVHJhbnNsYXRvcihKUEEuT05FX1RPX09ORSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKSksCi0JCQlYbWxNYW55VG9NYW55LmJ1aWxkVHJhbnNsYXRvcihKUEEuTUFOWV9UT19NQU5ZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX01hbnlUb01hbnlzKCkpLAotCQkJWG1sRWxlbWVudENvbGxlY3Rpb24uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKSksCi0JCQlYbWxFbWJlZGRlZC5idWlsZFRyYW5zbGF0b3IoSlBBLkVNQkVEREVELCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpKSwKLQkJCVhtbFRyYW5zaWVudC5idWlsZFRyYW5zbGF0b3IoSlBBLlRSQU5TSUVOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCkpLAotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9DYXNjYWRlVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Nhc2NhZGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYzRmMzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0Nhc2NhZGVUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYXNjYWRlVHlwZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2FzY2FkZSBUeXBlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZUFsbCA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlUGVyc2lzdCA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZU1lcmdlIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlbW92ZSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlUmVmcmVzaCA8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ2FzY2FkZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxDYXNjYWRlVHlwZV8yXzAKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlRGV0YWNoKCkgPGVtPkNhc2NhZGUgRGV0YWNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVEZXRhY2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX0RFVEFDSF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlRGV0YWNoKCkgPGVtPkNhc2NhZGUgRGV0YWNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVEZXRhY2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhc2NhZGVEZXRhY2ggPSBDQVNDQURFX0RFVEFDSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVBbGwoKSA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZUFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfQUxMX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVBbGwoKSA8ZW0+Q2FzY2FkZSBBbGw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZUFsbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZUFsbCA9IENBU0NBREVfQUxMX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVBlcnNpc3QoKSA8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9QRVJTSVNUX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVQZXJzaXN0KCkgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlUGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVBlcnNpc3QgPSBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlTWVyZ2UoKSA8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlTWVyZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDQVNDQURFX01FUkdFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVNZXJnZSgpIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVNZXJnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZU1lcmdlID0gQ0FTQ0FERV9NRVJHRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZW1vdmUoKSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfUkVNT1ZFX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZW1vdmUoKSA8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlbW92ZSA9IENBU0NBREVfUkVNT1ZFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ2FzY2FkZVJlZnJlc2goKSA8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gQ0FTQ0FERV9SRUZSRVNIX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVSZWZyZXNoKCkgPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlUmVmcmVzaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FzY2FkZVJlZnJlc2ggPSBDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ2FzY2FkZVR5cGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5DQVNDQURFX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBEZXRhY2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhc2NhZGUgRGV0YWNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgRGV0YWNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlRGV0YWNoKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ2FzY2FkZVR5cGVfMl8wX0Nhc2NhZGVEZXRhY2goKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZURldGFjaCgpCi0JewotCQlyZXR1cm4gY2FzY2FkZURldGFjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZURldGFjaCA8ZW0+Q2FzY2FkZSBEZXRhY2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhc2NhZGUgRGV0YWNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVEZXRhY2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlRGV0YWNoKGJvb2xlYW4gbmV3Q2FzY2FkZURldGFjaCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZURldGFjaCA9IGNhc2NhZGVEZXRhY2g7Ci0JCWNhc2NhZGVEZXRhY2ggPSBuZXdDYXNjYWRlRGV0YWNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9ERVRBQ0gsIG9sZENhc2NhZGVEZXRhY2gsIGNhc2NhZGVEZXRhY2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBBbGw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBBbGw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVBbGwoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlQWxsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVBbGwoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVBbGw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVBbGwgPGVtPkNhc2NhZGUgQWxsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIEFsbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlQWxsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZUFsbChib29sZWFuIG5ld0Nhc2NhZGVBbGwpCi0JewotCQlib29sZWFuIG9sZENhc2NhZGVBbGwgPSBjYXNjYWRlQWxsOwotCQljYXNjYWRlQWxsID0gbmV3Q2FzY2FkZUFsbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMLCBvbGRDYXNjYWRlQWxsLCBjYXNjYWRlQWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlX0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlUGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBuZXdDYXNjYWRlUGVyc2lzdCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKLQkJY2FzY2FkZVBlcnNpc3QgPSBuZXdDYXNjYWRlUGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVCwgb2xkQ2FzY2FkZVBlcnNpc3QsIGNhc2NhZGVQZXJzaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIE1lcmdlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlTWVyZ2UoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlTWVyZ2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FzY2FkZU1lcmdlKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlTWVyZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVNZXJnZSA8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlTWVyZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXNjYWRlTWVyZ2UoYm9vbGVhbiBuZXdDYXNjYWRlTWVyZ2UpCi0JewotCQlib29sZWFuIG9sZENhc2NhZGVNZXJnZSA9IGNhc2NhZGVNZXJnZTsKLQkJY2FzY2FkZU1lcmdlID0gbmV3Q2FzY2FkZU1lcmdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9NRVJHRSwgb2xkQ2FzY2FkZU1lcmdlLCBjYXNjYWRlTWVyZ2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXNjYWRlIFJlbW92ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhc2NhZGVSZW1vdmUoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVtb3ZlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZW1vdmUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVSZW1vdmU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVSZW1vdmUgPGVtPkNhc2NhZGUgUmVtb3ZlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlbW92ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlbW92ZShib29sZWFuIG5ld0Nhc2NhZGVSZW1vdmUpCi0JewotCQlib29sZWFuIG9sZENhc2NhZGVSZW1vdmUgPSBjYXNjYWRlUmVtb3ZlOwotCQljYXNjYWRlUmVtb3ZlID0gbmV3Q2FzY2FkZVJlbW92ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFLCBvbGRDYXNjYWRlUmVtb3ZlLCBjYXNjYWRlUmVtb3ZlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlUmVmcmVzaChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENhc2NhZGVUeXBlX0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVSZWZyZXNoKCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlUmVmcmVzaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlZnJlc2ggPGVtPkNhc2NhZGUgUmVmcmVzaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBSZWZyZXNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVSZWZyZXNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVJlZnJlc2goYm9vbGVhbiBuZXdDYXNjYWRlUmVmcmVzaCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVJlZnJlc2ggPSBjYXNjYWRlUmVmcmVzaDsKLQkJY2FzY2FkZVJlZnJlc2ggPSBuZXdDYXNjYWRlUmVmcmVzaDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSCwgb2xkQ2FzY2FkZVJlZnJlc2gsIGNhc2NhZGVSZWZyZXNoKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX0RFVEFDSDoKLQkJCQlyZXR1cm4gaXNDYXNjYWRlRGV0YWNoKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX0FMTDoKLQkJCQlyZXR1cm4gaXNDYXNjYWRlQWxsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGlzQ2FzY2FkZVBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfTUVSR0U6Ci0JCQkJcmV0dXJuIGlzQ2FzY2FkZU1lcmdlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFTU9WRToKLQkJCQlyZXR1cm4gaXNDYXNjYWRlUmVtb3ZlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFRlJFU0g6Ci0JCQkJcmV0dXJuIGlzQ2FzY2FkZVJlZnJlc2goKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX0RFVEFDSDoKLQkJCQlzZXRDYXNjYWRlRGV0YWNoKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX0FMTDoKLQkJCQlzZXRDYXNjYWRlQWxsKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX1BFUlNJU1Q6Ci0JCQkJc2V0Q2FzY2FkZVBlcnNpc3QoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfTUVSR0U6Ci0JCQkJc2V0Q2FzY2FkZU1lcmdlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFTU9WRToKLQkJCQlzZXRDYXNjYWRlUmVtb3ZlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFRlJFU0g6Ci0JCQkJc2V0Q2FzY2FkZVJlZnJlc2goKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfREVUQUNIOgotCQkJCXNldENhc2NhZGVEZXRhY2goQ0FTQ0FERV9ERVRBQ0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMOgotCQkJCXNldENhc2NhZGVBbGwoQ0FTQ0FERV9BTExfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlzZXRDYXNjYWRlUGVyc2lzdChDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfTUVSR0U6Ci0JCQkJc2V0Q2FzY2FkZU1lcmdlKENBU0NBREVfTUVSR0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFOgotCQkJCXNldENhc2NhZGVSZW1vdmUoQ0FTQ0FERV9SRU1PVkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSDoKLQkJCQlzZXRDYXNjYWRlUmVmcmVzaChDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX0RFVEFDSDoKLQkJCQlyZXR1cm4gY2FzY2FkZURldGFjaCAhPSBDQVNDQURFX0RFVEFDSF9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfQUxMOgotCQkJCXJldHVybiBjYXNjYWRlQWxsICE9IENBU0NBREVfQUxMX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9QRVJTSVNUOgotCQkJCXJldHVybiBjYXNjYWRlUGVyc2lzdCAhPSBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ0FTQ0FERV9UWVBFX19DQVNDQURFX01FUkdFOgotCQkJCXJldHVybiBjYXNjYWRlTWVyZ2UgIT0gQ0FTQ0FERV9NRVJHRV9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEVfX0NBU0NBREVfUkVNT1ZFOgotCQkJCXJldHVybiBjYXNjYWRlUmVtb3ZlICE9IENBU0NBREVfUkVNT1ZFX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRUZSRVNIOgotCQkJCXJldHVybiBjYXNjYWRlUmVmcmVzaCAhPSBDQVNDQURFX1JFRlJFU0hfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNhc2NhZGVEZXRhY2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVEZXRhY2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVBbGw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVBbGwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVQZXJzaXN0OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlUGVyc2lzdCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZU1lcmdlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlTWVyZ2UpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVSZW1vdmU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVSZW1vdmUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhc2NhZGVSZWZyZXNoOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXNjYWRlUmVmcmVzaCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENhc2NhZGVBbGxUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVQZXJzaXN0VHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlTWVyZ2VUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVSZW1vdmVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlRGV0YWNoVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVBbGxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkNBU0NBREVfQUxMLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuQ0FTQ0FERV9QRVJTSVNULCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2FzY2FkZU1lcmdlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5DQVNDQURFX01FUkdFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVSZW1vdmVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkNBU0NBREVfUkVNT1ZFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhc2NhZGVSZWZyZXNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5DQVNDQURFX1JFRlJFU0gsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlRGV0YWNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5DQVNDQURFX0RFVEFDSCwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhc2NhZGVUeXBlXzJfMF9DYXNjYWRlRGV0YWNoKCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQ29sdW1uTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0NvbHVtbk1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1NmRkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vQ29sdW1uTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2x1bW4gTWFwcGluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29sdW1uTWFwcGluZyBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ29sdW1uIGdldENvbHVtbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSk7Ci0KLX0gLy8gQ29sdW1uTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0NvbHVtblJlc3VsdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0NvbHVtblJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTYyYjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Db2x1bW5SZXN1bHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNvbHVtbiBSZXN1bHQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5SZXN1bHQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uUmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIENvbHVtblJlc3VsdCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkNPTFVNTl9SRVNVTFQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5SZXN1bHRfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5DT0xVTU5fUkVTVUxUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX1JFU1VMVF9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5DT0xVTU5fUkVTVUxUX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkNPTFVNTl9SRVNVTFRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkNPTFVNTl9SRVNVTFRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb2x1bW5SZXN1bHRfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLX0gLy8gQ29sdW1uUmVzdWx0CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRGlzY3JpbWluYXRvclR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9EaXNjcmltaW5hdG9yVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTI4ODBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9EaXNjcmltaW5hdG9yVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXREaXNjcmltaW5hdG9yVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gRGlzY3JpbWluYXRvclR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUUklOR19WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNUUklORygwLCAiU1RSSU5HIiwgIlNUUklORyIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0hBUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNDSEFSX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ0hBUigxLCAiQ0hBUiIsICJDSEFSIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JTlRFR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lOVEVHRVJfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlJTlRFR0VSKDIsICJJTlRFR0VSIiwgIklOVEVHRVIiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUUklORwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR19WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSEFSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSEFSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NIQVIKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFSX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSU5URUdFUgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVEVHRVJfVkFMVUUgPSAyOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGlzY3JpbWluYXRvclR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgRGlzY3JpbWluYXRvclR5cGVbXQotCQl7Ci0JCQlTVFJJTkcsCi0JCQlDSEFSLAotCQkJSU5URUdFUiwKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxEaXNjcmltaW5hdG9yVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEaXNjcmltaW5hdG9yVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJRGlzY3JpbWluYXRvclR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCURpc2NyaW1pbmF0b3JUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlzY3JpbWluYXRvclR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgU1RSSU5HX1ZBTFVFOiByZXR1cm4gU1RSSU5HOwotCQkJY2FzZSBDSEFSX1ZBTFVFOiByZXR1cm4gQ0hBUjsKLQkJCWNhc2UgSU5URUdFUl9WQUxVRTogcmV0dXJuIElOVEVHRVI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERpc2NyaW1pbmF0b3JUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9EaXNjcmltaW5hdG9yVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0VudGl0eUxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4NmEyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lciNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLCBYbWxFbnRpdHlMaXN0ZW5lcl8yXzAKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVQZXJzaXN0KCkgPGVtPlByZSBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlUGVyc2lzdCBwcmVQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdFBlcnNpc3QoKSA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RQZXJzaXN0IHBvc3RQZXJzaXN0OwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlUmVtb3ZlKCkgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVJlbW92ZSBwcmVSZW1vdmU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0UmVtb3ZlKCkgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFJlbW92ZSBwb3N0UmVtb3ZlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlVXBkYXRlKCkgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVVwZGF0ZSBwcmVVcGRhdGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb3N0VXBkYXRlKCkgPGVtPlBvc3QgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFVwZGF0ZSBwb3N0VXBkYXRlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdExvYWQoKSA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RMb2FkIHBvc3RMb2FkOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5TGlzdGVuZXIoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5FTlRJVFlfTElTVEVORVI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzc05hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eUxpc3RlbmVyX0NsYXNzTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKQotCXsKLQkJcmV0dXJuIGNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBuZXdDbGFzc05hbWUpCi0JewotCQlTdHJpbmcgb2xkQ2xhc3NOYW1lID0gY2xhc3NOYW1lOwotCQljbGFzc05hbWUgPSBuZXdDbGFzc05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19DTEFTU19OQU1FLCBvbGRDbGFzc05hbWUsIGNsYXNzTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVBlcnNpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZVBlcnNpc3QgZ2V0UHJlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gcHJlUGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVQZXJzaXN0KFByZVBlcnNpc3QgbmV3UHJlUGVyc2lzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVByZVBlcnNpc3Qgb2xkUHJlUGVyc2lzdCA9IHByZVBlcnNpc3Q7Ci0JCXByZVBlcnNpc3QgPSBuZXdQcmVQZXJzaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1QsIG9sZFByZVBlcnNpc3QsIG5ld1ByZVBlcnNpc3QpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0IG5ld1ByZVBlcnNpc3QpCi0JewotCQlpZiAobmV3UHJlUGVyc2lzdCAhPSBwcmVQZXJzaXN0KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVBlcnNpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlUGVyc2lzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVCwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVQZXJzaXN0KG5ld1ByZVBlcnNpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9QRVJTSVNULCBuZXdQcmVQZXJzaXN0LCBuZXdQcmVQZXJzaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0UGVyc2lzdChQb3N0UGVyc2lzdCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0UGVyc2lzdCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFBlcnNpc3QgZ2V0UG9zdFBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIHBvc3RQZXJzaXN0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0IG5ld1Bvc3RQZXJzaXN0LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdFBlcnNpc3Qgb2xkUG9zdFBlcnNpc3QgPSBwb3N0UGVyc2lzdDsKLQkJcG9zdFBlcnNpc3QgPSBuZXdQb3N0UGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCwgb2xkUG9zdFBlcnNpc3QsIG5ld1Bvc3RQZXJzaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdFBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0UGVyc2lzdChQb3N0UGVyc2lzdCBuZXdQb3N0UGVyc2lzdCkKLQl7Ci0JCWlmIChuZXdQb3N0UGVyc2lzdCAhPSBwb3N0UGVyc2lzdCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdFBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdFBlcnNpc3QpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9QRVJTSVNULCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0UGVyc2lzdCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQb3N0UGVyc2lzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdFBlcnNpc3QobmV3UG9zdFBlcnNpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVCwgbmV3UG9zdFBlcnNpc3QsIG5ld1Bvc3RQZXJzaXN0KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVJlbW92ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlUmVtb3ZlIGdldFByZVJlbW92ZSgpCi0JewotCQlyZXR1cm4gcHJlUmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVJlbW92ZShQcmVSZW1vdmUgbmV3UHJlUmVtb3ZlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlUmVtb3ZlIG9sZFByZVJlbW92ZSA9IHByZVJlbW92ZTsKLQkJcHJlUmVtb3ZlID0gbmV3UHJlUmVtb3ZlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSwgb2xkUHJlUmVtb3ZlLCBuZXdQcmVSZW1vdmUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlIG5ld1ByZVJlbW92ZSkKLQl7Ci0JCWlmIChuZXdQcmVSZW1vdmUgIT0gcHJlUmVtb3ZlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlUmVtb3ZlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVJlbW92ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmVSZW1vdmUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVSZW1vdmUobmV3UHJlUmVtb3ZlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUkVNT1ZFLCBuZXdQcmVSZW1vdmUsIG5ld1ByZVJlbW92ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RSZW1vdmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RSZW1vdmUgZ2V0UG9zdFJlbW92ZSgpCi0JewotCQlyZXR1cm4gcG9zdFJlbW92ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0UmVtb3ZlKFBvc3RSZW1vdmUgbmV3UG9zdFJlbW92ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RSZW1vdmUgb2xkUG9zdFJlbW92ZSA9IHBvc3RSZW1vdmU7Ci0JCXBvc3RSZW1vdmUgPSBuZXdQb3N0UmVtb3ZlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkUsIG9sZFBvc3RSZW1vdmUsIG5ld1Bvc3RSZW1vdmUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFJlbW92ZSA8ZW0+UG9zdCBSZW1vdmU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0UmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlIG5ld1Bvc3RSZW1vdmUpCi0JewotCQlpZiAobmV3UG9zdFJlbW92ZSAhPSBwb3N0UmVtb3ZlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0UmVtb3ZlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RSZW1vdmUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFJlbW92ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0UmVtb3ZlKG5ld1Bvc3RSZW1vdmUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUkVNT1ZFLCBuZXdQb3N0UmVtb3ZlLCBuZXdQb3N0UmVtb3ZlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVVcGRhdGUoUHJlVXBkYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVVwZGF0ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlVXBkYXRlIGdldFByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcHJlVXBkYXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFByZVVwZGF0ZShQcmVVcGRhdGUgbmV3UHJlVXBkYXRlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUHJlVXBkYXRlIG9sZFByZVVwZGF0ZSA9IHByZVVwZGF0ZTsKLQkJcHJlVXBkYXRlID0gbmV3UHJlVXBkYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1VQREFURSwgb2xkUHJlVXBkYXRlLCBuZXdQcmVVcGRhdGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UHJlVXBkYXRlIDxlbT5QcmUgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVVcGRhdGUoUHJlVXBkYXRlIG5ld1ByZVVwZGF0ZSkKLQl7Ci0JCWlmIChuZXdQcmVVcGRhdGUgIT0gcHJlVXBkYXRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlVXBkYXRlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVVwZGF0ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQcmVVcGRhdGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVVcGRhdGUobmV3UHJlVXBkYXRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFLCBuZXdQcmVVcGRhdGUsIG5ld1ByZVVwZGF0ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdFVwZGF0ZShQb3N0VXBkYXRlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RVcGRhdGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RVcGRhdGUgZ2V0UG9zdFVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcG9zdFVwZGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0VXBkYXRlKFBvc3RVcGRhdGUgbmV3UG9zdFVwZGF0ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RVcGRhdGUgb2xkUG9zdFVwZGF0ZSA9IHBvc3RVcGRhdGU7Ci0JCXBvc3RVcGRhdGUgPSBuZXdQb3N0VXBkYXRlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEUsIG9sZFBvc3RVcGRhdGUsIG5ld1Bvc3RVcGRhdGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFVwZGF0ZShQb3N0VXBkYXRlIG5ld1Bvc3RVcGRhdGUpCi0JewotCQlpZiAobmV3UG9zdFVwZGF0ZSAhPSBwb3N0VXBkYXRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0VXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RVcGRhdGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RVcGRhdGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFVwZGF0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQb3N0VXBkYXRlKG5ld1Bvc3RVcGRhdGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFLCBuZXdQb3N0VXBkYXRlLCBuZXdQb3N0VXBkYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBMb2FkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0TG9hZChQb3N0TG9hZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0TG9hZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdExvYWQgZ2V0UG9zdExvYWQoKQotCXsKLQkJcmV0dXJuIHBvc3RMb2FkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RMb2FkKFBvc3RMb2FkIG5ld1Bvc3RMb2FkLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdExvYWQgb2xkUG9zdExvYWQgPSBwb3N0TG9hZDsKLQkJcG9zdExvYWQgPSBuZXdQb3N0TG9hZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRCwgb2xkUG9zdExvYWQsIG5ld1Bvc3RMb2FkKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyI2dldFBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0TG9hZChQb3N0TG9hZCBuZXdQb3N0TG9hZCkKLQl7Ci0JCWlmIChuZXdQb3N0TG9hZCAhPSBwb3N0TG9hZCkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocG9zdExvYWQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdExvYWQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0TG9hZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQb3N0TG9hZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdExvYWQobmV3UG9zdExvYWQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRCwgbmV3UG9zdExvYWQsIG5ld1Bvc3RMb2FkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TGlzdGVuZXJfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCi0JewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9QRVJTSVNUOgotCQkJCXJldHVybiBiYXNpY1NldFByZVBlcnNpc3QobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UG9zdFBlcnNpc3QobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUkVNT1ZFOgotCQkJCXJldHVybiBiYXNpY1NldFByZVJlbW92ZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUkVNT1ZFOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RSZW1vdmUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFOgotCQkJCXJldHVybiBiYXNpY1NldFByZVVwZGF0ZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RVcGRhdGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQ6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UG9zdExvYWQobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGdldFByZVBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gZ2V0UG9zdFBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFByZVJlbW92ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFBvc3RSZW1vdmUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFByZVVwZGF0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEU6Ci0JCQkJcmV0dXJuIGdldFBvc3RVcGRhdGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gZ2V0UG9zdExvYWQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1Q6Ci0JCQkJc2V0UHJlUGVyc2lzdCgoUHJlUGVyc2lzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9QRVJTSVNUOgotCQkJCXNldFBvc3RQZXJzaXN0KChQb3N0UGVyc2lzdCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1JFTU9WRToKLQkJCQlzZXRQcmVSZW1vdmUoKFByZVJlbW92ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkU6Ci0JCQkJc2V0UG9zdFJlbW92ZSgoUG9zdFJlbW92ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1VQREFURToKLQkJCQlzZXRQcmVVcGRhdGUoKFByZVVwZGF0ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9VUERBVEU6Ci0JCQkJc2V0UG9zdFVwZGF0ZSgoUG9zdFVwZGF0ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEOgotCQkJCXNldFBvc3RMb2FkKChQb3N0TG9hZCluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUFJFX1BFUlNJU1Q6Ci0JCQkJc2V0UHJlUGVyc2lzdCgoUHJlUGVyc2lzdCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1BFUlNJU1Q6Ci0JCQkJc2V0UG9zdFBlcnNpc3QoKFBvc3RQZXJzaXN0KW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkU6Ci0JCQkJc2V0UHJlUmVtb3ZlKChQcmVSZW1vdmUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9SRU1PVkU6Ci0JCQkJc2V0UG9zdFJlbW92ZSgoUG9zdFJlbW92ZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFOgotCQkJCXNldFByZVVwZGF0ZSgoUHJlVXBkYXRlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFOgotCQkJCXNldFBvc3RVcGRhdGUoKFBvc3RVcGRhdGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEOgotCQkJCXNldFBvc3RMb2FkKChQb3N0TG9hZCludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUl9fQ0xBU1NfTkFNRToKLQkJCQlzZXRDbGFzc05hbWUoQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BSRV9QRVJTSVNUOgotCQkJCXJldHVybiBwcmVQZXJzaXN0ICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIHBvc3RQZXJzaXN0ICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfUkVNT1ZFOgotCQkJCXJldHVybiBwcmVSZW1vdmUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfUkVNT1ZFOgotCQkJCXJldHVybiBwb3N0UmVtb3ZlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QUkVfVVBEQVRFOgotCQkJCXJldHVybiBwcmVVcGRhdGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX1BPU1RfVVBEQVRFOgotCQkJCXJldHVybiBwb3N0VXBkYXRlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19QT1NUX0xPQUQ6Ci0JCQkJcmV0dXJuIHBvc3RMb2FkICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVudGl0eUxpc3RlbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0RFU0NSSVBUSU9OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VOVElUWV9MSVNURU5FUl8yMF9fREVTQ1JJUFRJT047Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoZGVyaXZlZEZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbnRpdHlMaXN0ZW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9FTlRJVFlfTElTVEVORVJfMjBfX0RFU0NSSVBUSU9OOiByZXR1cm4gT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJfX0RFU0NSSVBUSU9OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjbGFzc05hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNsYXNzTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJUHJlUGVyc2lzdC5idWlsZFRyYW5zbGF0b3IoKSwKLQkJCVBvc3RQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUHJlUmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUG9zdFJlbW92ZS5idWlsZFRyYW5zbGF0b3IoKSwKLQkJCVByZVVwZGF0ZS5idWlsZFRyYW5zbGF0b3IoKSwKLQkJCVBvc3RVcGRhdGUuYnVpbGRUcmFuc2xhdG9yKCksCi0JCQlQb3N0TG9hZC5idWlsZFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzBfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5DTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJfQ2xhc3NOYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9FbnRpdHlMaXN0ZW5lcnMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9FbnRpdHlMaXN0ZW5lcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI3NmI5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5TGlzdGVuZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eUxpc3RlbmVycyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlMaXN0ZW5lcnMoKSA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxFbnRpdHlMaXN0ZW5lcj4gZW50aXR5TGlzdGVuZXJzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUxpc3RlbmVycygpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkVOVElUWV9MSVNURU5FUlM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJ9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXJzX0VudGl0eUxpc3RlbmVycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8RW50aXR5TGlzdGVuZXI+IGdldEVudGl0eUxpc3RlbmVycygpCi0JewotCQlpZiAoZW50aXR5TGlzdGVuZXJzID09IG51bGwpCi0JCXsKLQkJCWVudGl0eUxpc3RlbmVycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxFbnRpdHlMaXN0ZW5lcj4oRW50aXR5TGlzdGVuZXIuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUyk7Ci0JCX0KLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfTElTVEVORVJTX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW50aXR5TGlzdGVuZXJzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5TGlzdGVuZXJzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJZ2V0RW50aXR5TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdHlMaXN0ZW5lcnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIEVudGl0eUxpc3RlbmVyPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJZ2V0RW50aXR5TGlzdGVuZXJzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGVudGl0eUxpc3RlbmVycyAhPSBudWxsICYmICFlbnRpdHlMaXN0ZW5lcnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlFbnRpdHlMaXN0ZW5lci5idWlsZFRyYW5zbGF0b3IoSlBBLkVOVElUWV9MSVNURU5FUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXJzX0VudGl0eUxpc3RlbmVycygpKQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9FbnRpdHlSZXN1bHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9FbnRpdHlSZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1NDhmMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRW50aXR5UmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudGl0eSBSZXN1bHQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0I2dldERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXRFbnRpdHlDbGFzcyA8ZW0+RW50aXR5IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXRGaWVsZFJlc3VsdHMgPGVtPkZpZWxkIFJlc3VsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlSZXN1bHQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5UmVzdWx0IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRpc2NyaW1pbmF0b3JDb2x1bW4gPSBESVNDUklNSU5BVE9SX0NPTFVNTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlDbGFzcygpIDxlbT5FbnRpdHkgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGl0eUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5Q2xhc3MoKSA8ZW0+RW50aXR5IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRpdHlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBlbnRpdHlDbGFzcyA9IEVOVElUWV9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpZWxkUmVzdWx0cygpIDxlbT5GaWVsZCBSZXN1bHRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpZWxkUmVzdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PEZpZWxkUmVzdWx0PiBmaWVsZFJlc3VsdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5UmVzdWx0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuRU5USVRZX1JFU1VMVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERpc2NyaW1pbmF0b3JDb2x1bW4oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eVJlc3VsdF9EaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlyZXR1cm4gZGlzY3JpbWluYXRvckNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXREaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yQ29sdW1uKFN0cmluZyBuZXdEaXNjcmltaW5hdG9yQ29sdW1uKQotCXsKLQkJU3RyaW5nIG9sZERpc2NyaW1pbmF0b3JDb2x1bW4gPSBkaXNjcmltaW5hdG9yQ29sdW1uOwotCQlkaXNjcmltaW5hdG9yQ29sdW1uID0gbmV3RGlzY3JpbWluYXRvckNvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTiwgb2xkRGlzY3JpbWluYXRvckNvbHVtbiwgZGlzY3JpbWluYXRvckNvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RW50aXR5Q2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eVJlc3VsdF9FbnRpdHlDbGFzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbnRpdHlDbGFzcygpCi0JewotCQlyZXR1cm4gZW50aXR5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQjZ2V0RW50aXR5Q2xhc3MgPGVtPkVudGl0eSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFbnRpdHlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eUNsYXNzKFN0cmluZyBuZXdFbnRpdHlDbGFzcykKLQl7Ci0JCVN0cmluZyBvbGRFbnRpdHlDbGFzcyA9IGVudGl0eUNsYXNzOwotCQllbnRpdHlDbGFzcyA9IG5ld0VudGl0eUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUywgb2xkRW50aXR5Q2xhc3MsIGVudGl0eUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmllbGQgUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmllbGQgUmVzdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpZWxkIFJlc3VsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8RmllbGRSZXN1bHQ+IGdldEZpZWxkUmVzdWx0cygpCi0JewotCQlpZiAoZmllbGRSZXN1bHRzID09IG51bGwpCi0JCXsKLQkJCWZpZWxkUmVzdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxGaWVsZFJlc3VsdD4oRmllbGRSZXN1bHQuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUyk7Ci0JCX0KLQkJcmV0dXJuIGZpZWxkUmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RmllbGRSZXN1bHRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEVudGl0eUNsYXNzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUzoKLQkJCQlyZXR1cm4gZ2V0RmllbGRSZXN1bHRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgotCQkJCXNldERpc2NyaW1pbmF0b3JDb2x1bW4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUzoKLQkJCQlzZXRFbnRpdHlDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUzoKLQkJCQlnZXRGaWVsZFJlc3VsdHMoKS5jbGVhcigpOwotCQkJCWdldEZpZWxkUmVzdWx0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRmllbGRSZXN1bHQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJc2V0RGlzY3JpbWluYXRvckNvbHVtbihESVNDUklNSU5BVE9SX0NPTFVNTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUzoKLQkJCQlzZXRFbnRpdHlDbGFzcyhFTlRJVFlfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19GSUVMRF9SRVNVTFRTOgotCQkJCWdldEZpZWxkUmVzdWx0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTjoKLQkJCQlyZXR1cm4gRElTQ1JJTUlOQVRPUl9DT0xVTU5fRURFRkFVTFQgPT0gbnVsbCA/IGRpc2NyaW1pbmF0b3JDb2x1bW4gIT0gbnVsbCA6ICFESVNDUklNSU5BVE9SX0NPTFVNTl9FREVGQVVMVC5lcXVhbHMoZGlzY3JpbWluYXRvckNvbHVtbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRU5USVRZX0NMQVNTOgotCQkJCXJldHVybiBFTlRJVFlfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IGVudGl0eUNsYXNzICE9IG51bGwgOiAhRU5USVRZX0NMQVNTX0VERUZBVUxULmVxdWFscyhlbnRpdHlDbGFzcyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUzoKLQkJCQlyZXR1cm4gZmllbGRSZXN1bHRzICE9IG51bGwgJiYgIWZpZWxkUmVzdWx0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRpc2NyaW1pbmF0b3JDb2x1bW46ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRpc2NyaW1pbmF0b3JDb2x1bW4pOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudGl0eUNsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlbnRpdHlDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkRW50aXR5Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlGaWVsZFJlc3VsdC5idWlsZFRyYW5zbGF0b3IoSlBBLkZJRUxEX1JFU1VMVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRW50aXR5Q2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkVOVElUWV9DTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RW50aXR5UmVzdWx0X0VudGl0eUNsYXNzKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRFbnRpdHlSZXN1bHRfRGlzY3JpbWluYXRvckNvbHVtbigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0gLy8gRW50aXR5UmVzdWx0CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRW51bVR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9FbnVtVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNjYzI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9FbnVtVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5FbnVtIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnVtVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gRW51bVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1JESU5BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPUkRJTkFMX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT1JESU5BTCgwLCAiT1JESU5BTCIsICJPUkRJTkFMIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU1RSSU5HX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JU1RSSU5HKDEsICJTVFJJTkciLCAiU1RSSU5HIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUkRJTkFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PUkRJTkFMPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09SRElOQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUkRJTkFMX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U1RSSU5HPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NUUklORwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklOR19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBFbnVtVHlwZVtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBFbnVtVHlwZVtdCi0JCXsKLQkJCU9SRElOQUwsCi0JCQlTVFJJTkcsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+RW51bSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8RW51bVR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RW51bSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUVudW1UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudW0gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1UeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlFbnVtVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkVudW0gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1UeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIE9SRElOQUxfVkFMVUU6IHJldHVybiBPUkRJTkFMOwotCQkJY2FzZSBTVFJJTkdfVkFMVUU6IHJldHVybiBTVFJJTkc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVudW1UeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9FbnVtVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0V2ZW50TWV0aG9kLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRXZlbnRNZXRob2QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ4N2M3Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRXZlbnRNZXRob2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRXZlbnRNZXRob2RfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RXZlbnQgTWV0aG9kPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2QoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV2ZW50TWV0aG9kIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sRXZlbnRNZXRob2RfMl8wCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1ldGhvZE5hbWUoKSA8ZW0+TWV0aG9kIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1ldGhvZE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNZXRob2ROYW1lKCkgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNZXRob2ROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGhvZE5hbWUgPSBNRVRIT0RfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFdmVudE1ldGhvZCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkVWRU5UX01FVEhPRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZF8yXzBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0aG9kTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RXZlbnRNZXRob2RfTWV0aG9kTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgewotCQlyZXR1cm4gbWV0aG9kTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRob2QgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWV0aG9kTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG5ld01ldGhvZE5hbWUpIHsKLQkJU3RyaW5nIG9sZE1ldGhvZE5hbWUgPSBtZXRob2ROYW1lOwotCQltZXRob2ROYW1lID0gbmV3TWV0aG9kTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FLCBvbGRNZXRob2ROYW1lLCBtZXRob2ROYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOgotCQkJCXJldHVybiBnZXRNZXRob2ROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJc2V0TWV0aG9kTmFtZShNRVRIT0RfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5FVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU6Ci0JCQkJcmV0dXJuIE1FVEhPRF9OQU1FX0VERUZBVUxUID09IG51bGwgPyBtZXRob2ROYW1lICE9IG51bGwgOiAhTUVUSE9EX05BTUVfRURFRkFVTFQuZXF1YWxzKG1ldGhvZE5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1ldGhvZE5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1ldGhvZE5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTWV0aG9kTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWV0aG9kTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTUVUSE9EX05BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEV2ZW50TWV0aG9kX01ldGhvZE5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RfMl8wX0Rlc2NyaXB0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9GZXRjaFR5cGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9GZXRjaFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3NzM1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRmV0Y2hUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkZldGNoIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGZXRjaFR5cGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIEZldGNoVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MQVpZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xBWllfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlMQVpZKDAsICJMQVpZIiwgIkxBWlkiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVBR0VSPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VBR0VSX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JRUFHRVIoMSwgIkVBR0VSIiwgIkVBR0VSIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5MQVpZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5MQVpZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0xBWlkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMQVpZX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVBR0VSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FQUdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNFQUdFUgotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVBR0VSX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5GZXRjaCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgRmV0Y2hUeXBlW10KLQkJewotCQkJTEFaWSwKLQkJCUVBR0VSLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkZldGNoIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxGZXRjaFR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RmV0Y2ggVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZldGNoVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJRmV0Y2hUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZldGNoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBGZXRjaFR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUZldGNoVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkZldGNoIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBGZXRjaFR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgTEFaWV9WQUxVRTogcmV0dXJuIExBWlk7Ci0JCQljYXNlIEVBR0VSX1ZBTFVFOiByZXR1cm4gRUFHRVI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEZldGNoVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vRmV0Y2hUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vRmllbGRSZXN1bHQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9GaWVsZFJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTgwYjdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9GaWVsZFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmllbGQgUmVzdWx0PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZFJlc3VsdCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29sdW1uID0gQ09MVU1OX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEZpZWxkUmVzdWx0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuRklFTERfUkVTVUxUOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RmllbGRSZXN1bHRfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29sdW1uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdF9Db2x1bW4oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uKCkKLQl7Ci0JCXJldHVybiBjb2x1bW47Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdCNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oU3RyaW5nIG5ld0NvbHVtbikKLQl7Ci0JCVN0cmluZyBvbGRDb2x1bW4gPSBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ld0NvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5GSUVMRF9SRVNVTFRfX0NPTFVNTiwgb2xkQ29sdW1uLCBjb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5GSUVMRF9SRVNVTFRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5GSUVMRF9SRVNVTFRfX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5GSUVMRF9SRVNVTFRfX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5GSUVMRF9SRVNVTFRfX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oQ09MVU1OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkZJRUxEX1JFU1VMVF9fQ09MVU1OOgotCQkJCXJldHVybiBDT0xVTU5fRURFRkFVTFQgPT0gbnVsbCA/IGNvbHVtbiAhPSBudWxsIDogIUNPTFVNTl9FREVGQVVMVC5lcXVhbHMoY29sdW1uKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY29sdW1uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjb2x1bW4pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQljcmVhdGVDb2x1bW5UcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RmllbGRSZXN1bHRfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgY3JlYXRlQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldEZpZWxkUmVzdWx0X0NvbHVtbigpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0JCi0KLX0gLy8gRmllbGRSZXN1bHQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9HZW5lcmF0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0dlbmVyYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzQ4NGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0dlbmVyYXRpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkdlbmVyYXRpb24gVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEdlbmVyYXRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBHZW5lcmF0aW9uVHlwZSBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUQUJMRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVRBQkxFKDAsICJUQUJMRSIsICJUQUJMRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjU0VRVUVOQ0VfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlTRVFVRU5DRSgxLCAiU0VRVUVOQ0UiLCAiU0VRVUVOQ0UiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklERU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0lERU5USVRZX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSURFTlRJVFkoMiwgIklERU5USVRZIiwgIklERU5USVRZIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE9fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBVVRPKDMsICJBVVRPIiwgIkFVVE8iKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5UQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUQUJMRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTRVFVRU5DRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklERU5USVRZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JREVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNJREVOVElUWQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElERU5USVRZX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUTwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fVkFMVUUgPSAzOwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkdlbmVyYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgR2VuZXJhdGlvblR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgR2VuZXJhdGlvblR5cGVbXQotCQl7Ci0JCQlUQUJMRSwKLQkJCVNFUVVFTkNFLAotCQkJSURFTlRJVFksCi0JCQlBVVRPLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkdlbmVyYXRpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEdlbmVyYXRpb25UeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkdlbmVyYXRpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEdlbmVyYXRpb25UeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlHZW5lcmF0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5HZW5lcmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJR2VuZXJhdGlvblR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5HZW5lcmF0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBHZW5lcmF0aW9uVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBUQUJMRV9WQUxVRTogcmV0dXJuIFRBQkxFOwotCQkJY2FzZSBTRVFVRU5DRV9WQUxVRTogcmV0dXJuIFNFUVVFTkNFOwotCQkJY2FzZSBJREVOVElUWV9WQUxVRTogcmV0dXJuIElERU5USVRZOwotCQkJY2FzZSBBVVRPX1ZBTFVFOiByZXR1cm4gQVVUTzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgR2VuZXJhdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0dlbmVyYXRpb25UeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vSW5oZXJpdGFuY2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Jbmhlcml0YW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTgzZmM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Jbmhlcml0YW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkluaGVyaXRhbmNlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlI2dldFN0cmF0ZWd5IDxlbT5TdHJhdGVneTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEluaGVyaXRhbmNlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIEluaGVyaXRhbmNlIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEluaGVyaXRhbmNlVHlwZSBTVFJBVEVHWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJhdGVneSgpIDxlbT5TdHJhdGVneTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RyYXRlZ3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgc3RyYXRlZ3kgPSBTVFJBVEVHWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBJbmhlcml0YW5jZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLklOSEVSSVRBTkNFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN0cmF0ZWd5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IlNJTkdMRV9UQUJMRSI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cmF0ZWd5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cmF0ZWd5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlCi0JICogQHNlZSAjc2V0U3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEluaGVyaXRhbmNlX1N0cmF0ZWd5KCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iU0lOR0xFX1RBQkxFIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW5oZXJpdGFuY2VUeXBlIGdldFN0cmF0ZWd5KCkKLQl7Ci0JCXJldHVybiBzdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlI2dldFN0cmF0ZWd5IDxlbT5TdHJhdGVneTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3RyYXRlZ3k8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUKLQkgKiBAc2VlICNnZXRTdHJhdGVneSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZSBuZXdTdHJhdGVneSkKLQl7Ci0JCUluaGVyaXRhbmNlVHlwZSBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IG5ld1N0cmF0ZWd5ID09IG51bGwgPyBTVFJBVEVHWV9FREVGQVVMVCA6IG5ld1N0cmF0ZWd5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLklOSEVSSVRBTkNFX19TVFJBVEVHWSwgb2xkU3RyYXRlZ3ksIHN0cmF0ZWd5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuSU5IRVJJVEFOQ0VfX1NUUkFURUdZOgotCQkJCXJldHVybiBnZXRTdHJhdGVneSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5JTkhFUklUQU5DRV9fU1RSQVRFR1k6Ci0JCQkJc2V0U3RyYXRlZ3koKEluaGVyaXRhbmNlVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLklOSEVSSVRBTkNFX19TVFJBVEVHWToKLQkJCQlzZXRTdHJhdGVneShTVFJBVEVHWV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5JTkhFUklUQU5DRV9fU1RSQVRFR1k6Ci0JCQkJcmV0dXJuIHN0cmF0ZWd5ICE9IFNUUkFURUdZX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChzdHJhdGVneTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RyYXRlZ3kpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRTdHJhdGVneVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuU1RSQVRFR1kpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZFN0cmF0ZWd5VHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFN0cmF0ZWd5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5TVFJBVEVHWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SW5oZXJpdGFuY2VfU3RyYXRlZ3koKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi19IC8vIEluaGVyaXRhbmNlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vSW5oZXJpdGFuY2VUeXBlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vSW5oZXJpdGFuY2VUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyOTBkZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0luaGVyaXRhbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Jbmhlcml0YW5jZSBUeXBlPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0SW5oZXJpdGFuY2VUeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBJbmhlcml0YW5jZVR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0lOR0xFIFRBQkxFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1NJTkdMRV9UQUJMRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVNJTkdMRV9UQUJMRSgwLCAiU0lOR0xFX1RBQkxFIiwgIlNJTkdMRV9UQUJMRSIpLCAvKioKLQkgKiBUaGUgJzxlbT48Yj5KT0lORUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSk9JTkVEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JSk9JTkVEKDEsICJKT0lORUQiLCAiSk9JTkVEIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5UQUJMRSBQRVIgQ0xBU1M8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVEFCTEVfUEVSX0NMQVNTX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JVEFCTEVfUEVSX0NMQVNTKDIsICJUQUJMRV9QRVJfQ0xBU1MiLCAiVEFCTEVfUEVSX0NMQVNTIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TSU5HTEUgVEFCTEU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNJTkdMRSBUQUJMRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNTSU5HTEVfVEFCTEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTSU5HTEVfVEFCTEVfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Sk9JTkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5KT0lORUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjSk9JTkVECi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSk9JTkVEX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRBQkxFIFBFUiBDTEFTUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VEFCTEUgUEVSIENMQVNTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1RBQkxFX1BFUl9DTEFTUwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRBQkxFX1BFUl9DTEFTU19WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+SW5oZXJpdGFuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5oZXJpdGFuY2VUeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IEluaGVyaXRhbmNlVHlwZVtdCi0JCXsKLQkJCVNJTkdMRV9UQUJMRSwKLQkJCUpPSU5FRCwKLQkJCVRBQkxFX1BFUl9DTEFTUywKLQkJfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZSBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8SW5oZXJpdGFuY2VUeXBlPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkluaGVyaXRhbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJbmhlcml0YW5jZVR5cGUgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUluaGVyaXRhbmNlVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlJbmhlcml0YW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5oZXJpdGFuY2VUeXBlIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIFNJTkdMRV9UQUJMRV9WQUxVRTogcmV0dXJuIFNJTkdMRV9UQUJMRTsKLQkJCWNhc2UgSk9JTkVEX1ZBTFVFOiByZXR1cm4gSk9JTkVEOwotCQkJY2FzZSBUQUJMRV9QRVJfQ0xBU1NfVkFMVUU6IHJldHVybiBUQUJMRV9QRVJfQ0xBU1M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEluaGVyaXRhbmNlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCXRoaXMudmFsdWUgPSB2YWx1ZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFZhbHVlKCkKLQl7Ci0JICByZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JICByZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKQotCXsKLQkgIHJldHVybiBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlyZXR1cm4gbGl0ZXJhbDsKLQl9Ci0JCi19IC8vSW5oZXJpdGFuY2VUeXBlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vSlBBLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vSlBBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZjM2MjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0pQQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgSlBBCi17Ci0JU3RyaW5nIFNDSEVNQV9OQU1FU1BBQ0UgPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtIjsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL29ybV8xXzAueHNkIjsKLQlTdHJpbmcgU0NIRU1BX1ZFUlNJT04gPSAiMS4wIjsKLQkKLQlTdHJpbmcgQUNDRVNTID0gImFjY2VzcyI7Ci0JU3RyaW5nIEFMTE9DQVRJT05fU0laRSA9ICJhbGxvY2F0aW9uLXNpemUiOwotCVN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERSA9ICJhc3NvY2lhdGlvbi1vdmVycmlkZSI7Ci0JU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERSA9ICJhdHRyaWJ1dGUtb3ZlcnJpZGUiOwotCVN0cmluZyBBVFRSSUJVVEVTID0gImF0dHJpYnV0ZXMiOwotCVN0cmluZyBCQVNJQyA9ICJiYXNpYyI7Ci0JU3RyaW5nIENBU0NBREUgPSAiY2FzY2FkZSI7Ci0JU3RyaW5nIENBU0NBREVfQUxMID0gImNhc2NhZGUtYWxsIjsKLQlTdHJpbmcgQ0FTQ0FERV9ERVRBQ0ggPSAiY2FzY2FkZS1kZXRhY2giOwkKLQlTdHJpbmcgQ0FTQ0FERV9NRVJHRSA9ICJjYXNjYWRlLW1lcmdlIjsKLQlTdHJpbmcgQ0FTQ0FERV9QRVJTSVNUID0gImNhc2NhZGUtcGVyc2lzdCI7Ci0JU3RyaW5nIENBU0NBREVfUkVGUkVTSCA9ICJjYXNjYWRlLXJlZnJlc2giOwkKLQlTdHJpbmcgQ0FTQ0FERV9SRU1PVkUgPSAiY2FzY2FkZS1yZW1vdmUiOwkKLQlTdHJpbmcgQ0FUQUxPRyA9ICJjYXRhbG9nIjsKLQlTdHJpbmcgQ0xBU1MgPSAiY2xhc3MiOwotCVN0cmluZyBDT0xVTU4gPSAiY29sdW1uIjsKLQlTdHJpbmcgQ09MVU1OX0RFRklOSVRJT049ICJjb2x1bW4tZGVmaW5pdGlvbiI7Ci0JU3RyaW5nIENPTFVNTl9OQU1FID0gImNvbHVtbi1uYW1lIjsKLQlTdHJpbmcgQ09MVU1OX1JFU1VMVCA9ICJjb2x1bW4tcmVzdWx0IjsKLQlTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCVN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTiA9ICJkaXNjcmltaW5hdG9yLWNvbHVtbiI7Ci0JU3RyaW5nIERJU0NSSU1JTkFUT1JfVFlQRSA9ICJkaXNjcmltaW5hdG9yLXR5cGUiOwotCVN0cmluZyBESVNDUklNSU5BVE9SX1ZBTFVFID0gImRpc2NyaW1pbmF0b3ItdmFsdWUiOwotCVN0cmluZyBFTUJFRERBQkxFID0gImVtYmVkZGFibGUiOwotCVN0cmluZyBFTUJFRERFRCA9ICJlbWJlZGRlZCI7Ci0JU3RyaW5nIEVNQkVEREVEX0lEID0gImVtYmVkZGVkLWlkIjsKLQlTdHJpbmcgRU5USVRZID0gImVudGl0eSI7Ci0JU3RyaW5nIEVOVElUWV9DTEFTUyA9ICJlbnRpdHktY2xhc3MiOwotCVN0cmluZyBFTlRJVFlfTElTVEVORVIgPSAiZW50aXR5LWxpc3RlbmVyIjsKLQlTdHJpbmcgRU5USVRZX0xJU1RFTkVSUyA9ICJlbnRpdHktbGlzdGVuZXJzIjsKLQlTdHJpbmcgRU5USVRZX01BUFBJTkdTID0gImVudGl0eS1tYXBwaW5ncyI7Ci0JU3RyaW5nIEVOVElUWV9SRVNVTFQgPSAiZW50aXR5LXJlc3VsdCI7Ci0JU3RyaW5nIEVOVU1FUkFURUQgPSAiZW51bWVyYXRlZCI7Ci0JU3RyaW5nIEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSAiZXhjbHVkZS1kZWZhdWx0LWxpc3RlbmVycyI7Ci0JU3RyaW5nIEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSAiZXhjbHVkZS1zdXBlcmNsYXNzLWxpc3RlbmVycyI7Ci0JU3RyaW5nIEZFVENIID0gImZldGNoIjsKLQlTdHJpbmcgRklFTERfUkVTVUxUID0gImZpZWxkLXJlc3VsdCI7Ci0JU3RyaW5nIEdFTkVSQVRFRF9WQUxVRSA9ICJnZW5lcmF0ZWQtdmFsdWUiOwotCVN0cmluZyBHRU5FUkFUT1IgPSAiZ2VuZXJhdG9yIjsKLQlTdHJpbmcgSElOVCA9ICJoaW50IjsKLQlTdHJpbmcgSUQgPSAiaWQiOwotCVN0cmluZyBJRF9DTEFTUyA9ICJpZC1jbGFzcyI7Ci0JU3RyaW5nIElOSEVSSVRBTkNFID0gImluaGVyaXRhbmNlIjsKLQlTdHJpbmcgSU5JVElBTF9WQUxVRSA9ICJpbml0aWFsLXZhbHVlIjsKLQlTdHJpbmcgSU5TRVJUQUJMRSA9ICJpbnNlcnRhYmxlIjsKLQlTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTiA9ICJpbnZlcnNlLWpvaW4tY29sdW1uIjsKLQlTdHJpbmcgSk9JTl9DT0xVTU4gPSAiam9pbi1jb2x1bW4iOwotCVN0cmluZyBKT0lOX1RBQkxFID0gImpvaW4tdGFibGUiOwotCVN0cmluZyBMRU5HVEggPSAibGVuZ3RoIjsKLQlTdHJpbmcgTE9CID0gImxvYiI7Ci0JU3RyaW5nIE1BTllfVE9fTUFOWSA9ICJtYW55LXRvLW1hbnkiOwotCVN0cmluZyBNQU5ZX1RPX09ORSA9ICJtYW55LXRvLW9uZSI7Ci0JU3RyaW5nIE1BUF9LRVkgPSAibWFwLWtleSI7Ci0JU3RyaW5nIE1BUFBFRF9CWSA9ICJtYXBwZWQtYnkiOwotCVN0cmluZyBNQVBQRURfU1VQRVJDTEFTUyA9ICJtYXBwZWQtc3VwZXJjbGFzcyI7Ci0JU3RyaW5nIE1FVEFEQVRBX0NPTVBMRVRFID0gIm1ldGFkYXRhLWNvbXBsZXRlIjsKLQlTdHJpbmcgTUVUSE9EX05BTUUgPSAibWV0aG9kLW5hbWUiOwotCVN0cmluZyBOQU1FID0gIm5hbWUiOwotCVN0cmluZyBOQU1FRF9OQVRJVkVfUVVFUlkgPSAibmFtZWQtbmF0aXZlLXF1ZXJ5IjsKLQlTdHJpbmcgTkFNRURfUVVFUlkgPSAibmFtZWQtcXVlcnkiOwotCVN0cmluZyBOVUxMQUJMRSA9ICJudWxsYWJsZSI7Ci0JU3RyaW5nIE9ORV9UT19NQU5ZID0gIm9uZS10by1tYW55IjsKLQlTdHJpbmcgT05FX1RPX09ORSA9ICJvbmUtdG8tb25lIjsKLQlTdHJpbmcgT1BUSU9OQUwgPSAib3B0aW9uYWwiOwotCVN0cmluZyBPUkRFUl9CWSA9ICJvcmRlci1ieSI7Ci0JU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMgPSAicGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEgPSAicGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSI7Ci0JU3RyaW5nIFBLX0NPTFVNTl9OQU1FID0gInBrLWNvbHVtbi1uYW1lIjsKLQlTdHJpbmcgUEtfQ09MVU1OX1ZBTFVFID0gInBrLWNvbHVtbi12YWx1ZSI7Ci0JU3RyaW5nIFBPU1RfTE9BRCA9ICJwb3N0LWxvYWQiOwotCVN0cmluZyBQT1NUX1BFUlNJU1QgPSAicG9zdC1wZXJzaXN0IjsKLQlTdHJpbmcgUE9TVF9SRU1PVkUgPSAicG9zdC1yZW1vdmUiOwotCVN0cmluZyBQT1NUX1VQREFURSA9ICJwb3N0LXVwZGF0ZSI7Ci0JU3RyaW5nIFBSRV9QRVJTSVNUID0gInByZS1wZXJzaXN0IjsKLQlTdHJpbmcgUFJFX1JFTU9WRSA9ICJwcmUtcmVtb3ZlIjsKLQlTdHJpbmcgUFJFX1VQREFURSA9ICJwcmUtdXBkYXRlIjsKLQlTdHJpbmcgUFJFQ0lTSU9OPSAicHJlY2lzaW9uIjsKLQlTdHJpbmcgUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4gPSAicHJpbWFyeS1rZXktam9pbi1jb2x1bW4iOwotCVN0cmluZyBRVUVSWSA9ICJxdWVyeSI7Ci0JU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAicmVmZXJlbmNlZC1jb2x1bW4tbmFtZSI7Ci0JU3RyaW5nIFJFU1VMVF9DTEFTUyA9ICJyZXN1bHQtY2xhc3MiOwotCVN0cmluZyBSRVNVTFRfU0VUX01BUFBJTkcgPSAicmVzdWx0LXNldC1tYXBwaW5nIjsKLQlTdHJpbmcgU0NBTEU9ICJzY2FsZSI7Ci0JU3RyaW5nIFNDSEVNQSA9ICJzY2hlbWEiOwotCVN0cmluZyBTRUNPTkRBUllfVEFCTEUgPSAic2Vjb25kYXJ5LXRhYmxlIjsKLQlTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SID0gInNlcXVlbmNlLWdlbmVyYXRvciI7Ci0JU3RyaW5nIFNFUVVFTkNFX05BTUUgPSAic2VxdWVuY2UtbmFtZSI7Ci0JU3RyaW5nIFNRTF9SRVNVTFRfU0VUX01BUFBJTkcgPSAic3FsLXJlc3VsdC1zZXQtbWFwcGluZyI7Ci0JU3RyaW5nIFNUUkFURUdZID0gInN0cmF0ZWd5IjsKLQlTdHJpbmcgVEFCTEUgPSAidGFibGUiOwotCVN0cmluZyBUQUJMRV9HRU5FUkFUT1IgPSAidGFibGUtZ2VuZXJhdG9yIjsKLQlTdHJpbmcgVEFSR0VUX0VOVElUWSA9ICJ0YXJnZXQtZW50aXR5IjsKLQlTdHJpbmcgVEVNUE9SQUwgPSAidGVtcG9yYWwiOwotCVN0cmluZyBUUkFOU0lFTlQgPSAidHJhbnNpZW50IjsKLQlTdHJpbmcgVU5JUVVFID0gInVuaXF1ZSI7Ci0JU3RyaW5nIFVOSVFVRV9DT05TVFJBSU5UID0gInVuaXF1ZS1jb25zdHJhaW50IjsKLQlTdHJpbmcgVVBEQVRBQkxFID0gInVwZGF0YWJsZSI7Ci0JU3RyaW5nIFZBTFVFID0gInZhbHVlIjsKLQlTdHJpbmcgVkFMVUVfQ09MVU1OX05BTUUgPSAidmFsdWUtY29sdW1uLW5hbWUiOwotCVN0cmluZyBWRVJTSU9OID0gInZlcnNpb24iOwotCVN0cmluZyBYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSA9ICJ4bWwtbWFwcGluZy1tZXRhZGF0YS1jb21wbGV0ZSI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vTG9iLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vTG9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZjFlNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL0xvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkxvYjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldExvYigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2IgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIExvYigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLkxPQjsKLQl9Ci0KLX0gLy8gTG9iCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vTWFwS2V5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vTWFwS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZWMwNjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL01hcEtleS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFwIEtleTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBLZXkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgTWFwS2V5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuTUFQX0tFWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuTUFQX0tFWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLk1BUF9LRVlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuTUFQX0tFWV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5NQVBfS0VZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5NQVBfS0VZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRNYXBLZXlfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotfSAvLyBNYXBLZXkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Pcm1GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vT3JtRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzZhNTE5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Pcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9ybUZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3JtRmFjdG9yeSBlSU5TVEFOQ0UgPSBpbml0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1GYWN0b3J5IGluaXQoKQotCXsKLQkJdHJ5Ci0JCXsKLQkJCU9ybUZhY3RvcnkgdGhlT3JtRmFjdG9yeSA9IChPcm1GYWN0b3J5KUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVGYWN0b3J5KCJqcHQub3JtLnhtaSIpOyAKLQkJCWlmICh0aGVPcm1GYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRoZU9ybUZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCXsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgT3JtRmFjdG9yeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9ybUZhY3RvcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykKLQl7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkFUVFJJQlVURVM6IHJldHVybiAoRU9iamVjdCljcmVhdGVBdHRyaWJ1dGVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQmFzaWMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5DQVNDQURFX1RZUEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVDYXNjYWRlVHlwZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DTEFTU19SRUZFUkVOQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xMRUNUSU9OX1RBQkxFOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbENvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkNPTFVNTl9SRVNVTFQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVDb2x1bW5SZXN1bHQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU46IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sRW1iZWRkZWQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfSUQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbWJlZGRlZElkKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEVudGl0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9MSVNURU5FUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVudGl0eUxpc3RlbmVyKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRU5USVRZX0xJU1RFTkVSUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUVudGl0eUxpc3RlbmVycygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1M6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxFbnRpdHlNYXBwaW5ncygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVElUWV9SRVNVTFQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVFbnRpdHlSZXN1bHQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5GSUVMRF9SRVNVTFQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVGaWVsZFJlc3VsdCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbElkKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuSU5IRVJJVEFOQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVJbmhlcml0YW5jZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEpvaW5Db2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbEpvaW5UYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkxPQjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZUxvYigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQU5ZX1RPX01BTlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxNYW55VG9NYW55KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BTllfVE9fT05FOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTWFueVRvT25lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuTUFQX0tFWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZU1hcEtleSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTUzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE5hbWVkUXVlcnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTlk6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxPbmVUb01hbnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9uZVRvT25lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE9yZGVyQ29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5QT1NUX0xPQUQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVQb3N0TG9hZCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlBPU1RfUEVSU0lTVDogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVBvc3RQZXJzaXN0KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuUE9TVF9SRU1PVkU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQb3N0UmVtb3ZlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuUE9TVF9VUERBVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQb3N0VXBkYXRlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuUFJFX1BFUlNJU1Q6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmVQZXJzaXN0KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuUFJFX1JFTU9WRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVByZVJlbW92ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlBSRV9VUERBVEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVQcmVVcGRhdGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU46IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUXVlcnlIaW50KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRTogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElORzogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVNxbFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEU6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1I6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UUkFOU0lFTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxUcmFuc2llbnQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT046IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxWZXJzaW9uKCk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjbGFzcyAnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRElTQ1JJTUlOQVRPUl9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVEaXNjcmltaW5hdG9yVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVU1fVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlRW51bVR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5GRVRDSF9UWVBFOgotCQkJCXJldHVybiBjcmVhdGVGZXRjaFR5cGVGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5HRU5FUkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZUdlbmVyYXRpb25UeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuSU5IRVJJVEFOQ0VfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlSW5oZXJpdGFuY2VUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuVEVNUE9SQUxfVFlQRToKLQkJCQlyZXR1cm4gY3JlYXRlVGVtcG9yYWxUeXBlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuRElTQ1JJTUlOQVRPUl9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RGlzY3JpbWluYXRvclR5cGVUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLkVOVU1fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEVudW1UeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5GRVRDSF9UWVBFOgotCQkJCXJldHVybiBjb252ZXJ0RmV0Y2hUeXBlVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5HRU5FUkFUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNvbnZlcnRHZW5lcmF0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuSU5IRVJJVEFOQ0VfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydEluaGVyaXRhbmNlVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuVEVNUE9SQUxfVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFRlbXBvcmFsVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQXNzb2NpYXRpb25PdmVycmlkZSBjcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKLQl7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IG5ldyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCXJldHVybiB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxBdHRyaWJ1dGVPdmVycmlkZSBjcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCi0JewotCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSB4bWxBdHRyaWJ1dGVPdmVycmlkZSA9IG5ldyBYbWxBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlyZXR1cm4geG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZXMgY3JlYXRlQXR0cmlidXRlcygpCi0JewotCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlcygpOwotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQmFzaWMgY3JlYXRlWG1sQmFzaWMoKQotCXsKLQkJWG1sQmFzaWMgeG1sQmFzaWMgPSBuZXcgWG1sQmFzaWMoKTsKLQkJcmV0dXJuIHhtbEJhc2ljOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDYXNjYWRlVHlwZSBjcmVhdGVDYXNjYWRlVHlwZSgpCi0JewotCQlDYXNjYWRlVHlwZSBjYXNjYWRlVHlwZSA9IG5ldyBDYXNjYWRlVHlwZSgpOwotCQlyZXR1cm4gY2FzY2FkZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkKLQl7Ci0JCVhtbENsYXNzUmVmZXJlbmNlIHhtbENsYXNzUmVmZXJlbmNlID0gbmV3IFhtbENsYXNzUmVmZXJlbmNlKCk7Ci0JCXJldHVybiB4bWxDbGFzc1JlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sbGVjdGlvblRhYmxlIGNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpCi0JewotCQlYbWxDb2xsZWN0aW9uVGFibGUgeG1sQ29sbGVjdGlvblRhYmxlID0gbmV3IFhtbENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXR1cm4geG1sQ29sbGVjdGlvblRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDb2x1bW4gY3JlYXRlWG1sQ29sdW1uKCkKLQl7Ci0JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBuZXcgWG1sQ29sdW1uKCk7Ci0JCXJldHVybiB4bWxDb2x1bW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbHVtblJlc3VsdCBjcmVhdGVDb2x1bW5SZXN1bHQoKQotCXsKLQkJQ29sdW1uUmVzdWx0IGNvbHVtblJlc3VsdCA9IG5ldyBDb2x1bW5SZXN1bHQoKTsKLQkJcmV0dXJuIGNvbHVtblJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRGlzY3JpbWluYXRvckNvbHVtbiBjcmVhdGVYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQl7Ci0JCVhtbERpc2NyaW1pbmF0b3JDb2x1bW4geG1sRGlzY3JpbWluYXRvckNvbHVtbiA9IG5ldyBYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCXJldHVybiB4bWxEaXNjcmltaW5hdG9yQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbGVtZW50Q29sbGVjdGlvbiBjcmVhdGVYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JewotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiB4bWxFbGVtZW50Q29sbGVjdGlvbiA9IG5ldyBYbWxFbGVtZW50Q29sbGVjdGlvbigpOwotCQlyZXR1cm4geG1sRWxlbWVudENvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVtYmVkZGFibGUgY3JlYXRlWG1sRW1iZWRkYWJsZSgpCi0JewotCQlYbWxFbWJlZGRhYmxlIHhtbEVtYmVkZGFibGUgPSBuZXcgWG1sRW1iZWRkYWJsZSgpOwotCQlyZXR1cm4geG1sRW1iZWRkYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sRW1iZWRkZWQgY3JlYXRlWG1sRW1iZWRkZWQoKQotCXsKLQkJWG1sRW1iZWRkZWQgeG1sRW1iZWRkZWQgPSBuZXcgWG1sRW1iZWRkZWQoKTsKLQkJcmV0dXJuIHhtbEVtYmVkZGVkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxFbWJlZGRlZElkIGNyZWF0ZVhtbEVtYmVkZGVkSWQoKQotCXsKLQkJWG1sRW1iZWRkZWRJZCB4bWxFbWJlZGRlZElkID0gbmV3IFhtbEVtYmVkZGVkSWQoKTsKLQkJcmV0dXJuIHhtbEVtYmVkZGVkSWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVudGl0eSBjcmVhdGVYbWxFbnRpdHkoKQotCXsKLQkJWG1sRW50aXR5IHhtbEVudGl0eSA9IG5ldyBYbWxFbnRpdHkoKTsKLQkJcmV0dXJuIHhtbEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50aXR5TGlzdGVuZXIgY3JlYXRlRW50aXR5TGlzdGVuZXIoKQotCXsKLQkJRW50aXR5TGlzdGVuZXIgZW50aXR5TGlzdGVuZXIgPSBuZXcgRW50aXR5TGlzdGVuZXIoKTsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnRpdHlMaXN0ZW5lcnMgY3JlYXRlRW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCUVudGl0eUxpc3RlbmVycyBlbnRpdHlMaXN0ZW5lcnMgPSBuZXcgRW50aXR5TGlzdGVuZXJzKCk7Ci0JCXJldHVybiBlbnRpdHlMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEVudGl0eU1hcHBpbmdzIGNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCkKLQl7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHhtbEVudGl0eU1hcHBpbmdzID0gbmV3IFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCXJldHVybiB4bWxFbnRpdHlNYXBwaW5nczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW50aXR5UmVzdWx0IGNyZWF0ZUVudGl0eVJlc3VsdCgpCi0JewotCQlFbnRpdHlSZXN1bHQgZW50aXR5UmVzdWx0ID0gbmV3IEVudGl0eVJlc3VsdCgpOwotCQlyZXR1cm4gZW50aXR5UmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGaWVsZFJlc3VsdCBjcmVhdGVGaWVsZFJlc3VsdCgpCi0JewotCQlGaWVsZFJlc3VsdCBmaWVsZFJlc3VsdCA9IG5ldyBGaWVsZFJlc3VsdCgpOwotCQlyZXR1cm4gZmllbGRSZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEdlbmVyYXRlZFZhbHVlIGNyZWF0ZVhtbEdlbmVyYXRlZFZhbHVlKCkKLQl7Ci0JCVhtbEdlbmVyYXRlZFZhbHVlIHhtbEdlbmVyYXRlZFZhbHVlID0gbmV3IFhtbEdlbmVyYXRlZFZhbHVlKCk7Ci0JCXJldHVybiB4bWxHZW5lcmF0ZWRWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSWQgY3JlYXRlWG1sSWQoKQotCXsKLQkJWG1sSWQgeG1sSWQgPSBuZXcgWG1sSWQoKTsKLQkJcmV0dXJuIHhtbElkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbmhlcml0YW5jZSBjcmVhdGVJbmhlcml0YW5jZSgpCi0JewotCQlJbmhlcml0YW5jZSBpbmhlcml0YW5jZSA9IG5ldyBJbmhlcml0YW5jZSgpOwotCQlyZXR1cm4gaW5oZXJpdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbEpvaW5Db2x1bW4gY3JlYXRlWG1sSm9pbkNvbHVtbigpCi0JewotCQlYbWxKb2luQ29sdW1uIHhtbEpvaW5Db2x1bW4gPSBuZXcgWG1sSm9pbkNvbHVtbigpOwotCQlyZXR1cm4geG1sSm9pbkNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pblRhYmxlIGNyZWF0ZVhtbEpvaW5UYWJsZSgpCi0JewotCQlYbWxKb2luVGFibGUgeG1sSm9pblRhYmxlID0gbmV3IFhtbEpvaW5UYWJsZSgpOwotCQlyZXR1cm4geG1sSm9pblRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMb2IgY3JlYXRlTG9iKCkKLQl7Ci0JCUxvYiBsb2IgPSBuZXcgTG9iKCk7Ci0JCXJldHVybiBsb2I7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hbnlUb01hbnkgY3JlYXRlWG1sTWFueVRvTWFueSgpCi0JewotCQlYbWxNYW55VG9NYW55IHhtbE1hbnlUb01hbnkgPSBuZXcgWG1sTWFueVRvTWFueSgpOwotCQlyZXR1cm4geG1sTWFueVRvTWFueTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTWFueVRvT25lIGNyZWF0ZVhtbE1hbnlUb09uZSgpCi0JewotCQlYbWxNYW55VG9PbmUgeG1sTWFueVRvT25lID0gbmV3IFhtbE1hbnlUb09uZSgpOwotCQlyZXR1cm4geG1sTWFueVRvT25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXBLZXkgY3JlYXRlTWFwS2V5KCkKLQl7Ci0JCU1hcEtleSBtYXBLZXkgPSBuZXcgTWFwS2V5KCk7Ci0JCXJldHVybiBtYXBLZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hcHBlZFN1cGVyY2xhc3MgY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JewotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSBuZXcgWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQlyZXR1cm4geG1sTWFwcGVkU3VwZXJjbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sTmFtZWROYXRpdmVRdWVyeSBjcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkKLQl7Ci0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgeG1sTmFtZWROYXRpdmVRdWVyeSA9IG5ldyBYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCXJldHVybiB4bWxOYW1lZE5hdGl2ZVF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxOYW1lZFF1ZXJ5IGNyZWF0ZVhtbE5hbWVkUXVlcnkoKQotCXsKLQkJWG1sTmFtZWRRdWVyeSB4bWxOYW1lZFF1ZXJ5ID0gbmV3IFhtbE5hbWVkUXVlcnkoKTsKLQkJcmV0dXJuIHhtbE5hbWVkUXVlcnk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE9uZVRvTWFueSBjcmVhdGVYbWxPbmVUb01hbnkoKQotCXsKLQkJWG1sT25lVG9NYW55IHhtbE9uZVRvTWFueSA9IG5ldyBYbWxPbmVUb01hbnkoKTsKLQkJcmV0dXJuIHhtbE9uZVRvTWFueTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT25lVG9PbmUgY3JlYXRlWG1sT25lVG9PbmUoKQotCXsKLQkJWG1sT25lVG9PbmUgeG1sT25lVG9PbmUgPSBuZXcgWG1sT25lVG9PbmUoKTsKLQkJcmV0dXJuIHhtbE9uZVRvT25lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxPcmRlckNvbHVtbiBjcmVhdGVYbWxPcmRlckNvbHVtbigpCi0JewotCQlYbWxPcmRlckNvbHVtbiB4bWxPcmRlckNvbHVtbiA9IG5ldyBYbWxPcmRlckNvbHVtbigpOwotCQlyZXR1cm4geG1sT3JkZXJDb2x1bW47Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gbmV3IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCXsKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBuZXcgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0TG9hZCBjcmVhdGVQb3N0TG9hZCgpCi0JewotCQlQb3N0TG9hZCBwb3N0TG9hZCA9IG5ldyBQb3N0TG9hZCgpOwotCQlyZXR1cm4gcG9zdExvYWQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RQZXJzaXN0IGNyZWF0ZVBvc3RQZXJzaXN0KCkKLQl7Ci0JCVBvc3RQZXJzaXN0IHBvc3RQZXJzaXN0ID0gbmV3IFBvc3RQZXJzaXN0KCk7Ci0JCXJldHVybiBwb3N0UGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdFJlbW92ZSBjcmVhdGVQb3N0UmVtb3ZlKCkKLQl7Ci0JCVBvc3RSZW1vdmUgcG9zdFJlbW92ZSA9IG5ldyBQb3N0UmVtb3ZlKCk7Ci0JCXJldHVybiBwb3N0UmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0VXBkYXRlIGNyZWF0ZVBvc3RVcGRhdGUoKQotCXsKLQkJUG9zdFVwZGF0ZSBwb3N0VXBkYXRlID0gbmV3IFBvc3RVcGRhdGUoKTsKLQkJcmV0dXJuIHBvc3RVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZVBlcnNpc3QgY3JlYXRlUHJlUGVyc2lzdCgpCi0JewotCQlQcmVQZXJzaXN0IHByZVBlcnNpc3QgPSBuZXcgUHJlUGVyc2lzdCgpOwotCQlyZXR1cm4gcHJlUGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUHJlUmVtb3ZlIGNyZWF0ZVByZVJlbW92ZSgpCi0JewotCQlQcmVSZW1vdmUgcHJlUmVtb3ZlID0gbmV3IFByZVJlbW92ZSgpOwotCQlyZXR1cm4gcHJlUmVtb3ZlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVVcGRhdGUgY3JlYXRlUHJlVXBkYXRlKCkKLQl7Ci0JCVByZVVwZGF0ZSBwcmVVcGRhdGUgPSBuZXcgUHJlVXBkYXRlKCk7Ci0JCXJldHVybiBwcmVVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uIGNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKLQl7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uID0gbmV3IFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUXVlcnlIaW50IGNyZWF0ZVhtbFF1ZXJ5SGludCgpCi0JewotCQlYbWxRdWVyeUhpbnQgeG1sUXVlcnlIaW50ID0gbmV3IFhtbFF1ZXJ5SGludCgpOwotCQlyZXR1cm4geG1sUXVlcnlIaW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxTZWNvbmRhcnlUYWJsZSBjcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpCi0JewotCQlYbWxTZWNvbmRhcnlUYWJsZSB4bWxTZWNvbmRhcnlUYWJsZSA9IG5ldyBYbWxTZWNvbmRhcnlUYWJsZSgpOwotCQlyZXR1cm4geG1sU2Vjb25kYXJ5VGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGNyZWF0ZVhtbFNlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHhtbFNlcXVlbmNlR2VuZXJhdG9yID0gbmV3IFhtbFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJldHVybiB4bWxTZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3FsUmVzdWx0U2V0TWFwcGluZyBjcmVhdGVTcWxSZXN1bHRTZXRNYXBwaW5nKCkKLQl7Ci0JCVNxbFJlc3VsdFNldE1hcHBpbmcgc3FsUmVzdWx0U2V0TWFwcGluZyA9IG5ldyBTcWxSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCXJldHVybiBzcWxSZXN1bHRTZXRNYXBwaW5nOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUYWJsZSBjcmVhdGVYbWxUYWJsZSgpCi0JewotCQlYbWxUYWJsZSB4bWxUYWJsZSA9IG5ldyBYbWxUYWJsZSgpOwotCQlyZXR1cm4geG1sVGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFRhYmxlR2VuZXJhdG9yIGNyZWF0ZVhtbFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCVhtbFRhYmxlR2VuZXJhdG9yIHhtbFRhYmxlR2VuZXJhdG9yID0gbmV3IFhtbFRhYmxlR2VuZXJhdG9yKCk7Ci0JCXJldHVybiB4bWxUYWJsZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVHJhbnNpZW50IGNyZWF0ZVhtbFRyYW5zaWVudCgpCi0JewotCQlYbWxUcmFuc2llbnQgeG1sVHJhbnNpZW50ID0gbmV3IFhtbFRyYW5zaWVudCgpOwotCQlyZXR1cm4geG1sVHJhbnNpZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxVbmlxdWVDb25zdHJhaW50IGNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKQotCXsKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB4bWxVbmlxdWVDb25zdHJhaW50ID0gbmV3IFhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmV0dXJuIHhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFZlcnNpb24gY3JlYXRlWG1sVmVyc2lvbigpCi0JewotCQlYbWxWZXJzaW9uIHhtbFZlcnNpb24gPSBuZXcgWG1sVmVyc2lvbigpOwotCQlyZXR1cm4geG1sVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRGlzY3JpbWluYXRvclR5cGUgY3JlYXRlRGlzY3JpbWluYXRvclR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlEaXNjcmltaW5hdG9yVHlwZSByZXN1bHQgPSBEaXNjcmltaW5hdG9yVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0RGlzY3JpbWluYXRvclR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnVtVHlwZSBjcmVhdGVFbnVtVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUVudW1UeXBlIHJlc3VsdCA9IEVudW1UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRFbnVtVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEZldGNoVHlwZSBjcmVhdGVGZXRjaFR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlGZXRjaFR5cGUgcmVzdWx0ID0gRmV0Y2hUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRGZXRjaFR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBHZW5lcmF0aW9uVHlwZSBjcmVhdGVHZW5lcmF0aW9uVHlwZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkKLQl7Ci0JCUdlbmVyYXRpb25UeXBlIHJlc3VsdCA9IEdlbmVyYXRpb25UeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRHZW5lcmF0aW9uVHlwZVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlVHlwZSBjcmVhdGVJbmhlcml0YW5jZVR5cGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlJbmhlcml0YW5jZVR5cGUgcmVzdWx0ID0gSW5oZXJpdGFuY2VUeXBlLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJbmhlcml0YW5jZVR5cGVUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wb3JhbFR5cGUgY3JlYXRlVGVtcG9yYWxUeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJVGVtcG9yYWxUeXBlIHJlc3VsdCA9IFRlbXBvcmFsVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VGVtcG9yYWxUeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT3JtUGFja2FnZSBnZXRPcm1QYWNrYWdlKCkKLQl7Ci0JCXJldHVybiAoT3JtUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIE9ybVBhY2thZ2UgZ2V0UGFja2FnZSgpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotCi19IC8vT3JtRmFjdG9yeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL09ybVBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Pcm1QYWNrYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZGI4ZTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL09ybVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9ybVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZUltcGwKLXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gIm9ybSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19VUkkgPSAianB0Lm9ybS54bWkiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcm1QYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZS5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyIDxlbT5YbWwgQWNjZXNzIEhvbGRlcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19IT0xERVIgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BQ0NFU1NfSE9MREVSX19BQ0NFU1MgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBBY2Nlc3MgSG9sZGVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfTUFQUElORyA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1MgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElORyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUyA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCA9IFhNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiA8ZW0+WG1sIE5hbWVkIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT0xVTU4gPSA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX0NPTFVNTl9fTkFNRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE5hbWVkIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiA8ZW0+WG1sIEJhc2UgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZUNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0NPTFVNTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBYTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9DT0xVTU5fX05BTUUgPSBYTUxfTkFNRURfQ09MVU1OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc2VydGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRSA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0NPTFVNTl9fTlVMTEFCTEUgPSBYTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9DT0xVTU5fX1RBQkxFID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0NPTFVNTl9fVU5JUVVFID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0NPTFVNTl9fVVBEQVRBQkxFID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQmFzZSBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OID0gOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBYTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19OQU1FID0gWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VDb2x1bW4gPGVtPkFic3RyYWN0IFhtbCBCYXNlIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxCYXNlQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19JTlNFUlRBQkxFID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19OVUxMQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVEFCTEUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19VTklRVUUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19VUERBVEFCTEUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFhtbCBCYXNlIENvbHVtbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgQmFzZSBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEVtYmVkZGVkIDxlbT5BYnN0cmFjdCBYbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sRW1iZWRkZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEVtYmVkZGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0VNQkVEREVEID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9FTUJFRERFRF9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFhtbCBFbWJlZGRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkcgPSAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QWJzdHJhY3QgWG1sIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElORyA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQUEVEX0JZID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQ09MVU1OID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0JZID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfVEVNUE9SQUwgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfRU5VTUVSQVRFRCA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQ0xBU1MgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVkgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IFhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+WG1sIEJhc2UgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IFhNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FID0gWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEUgPSBYTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2UgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlSm9pbkNvbHVtbiA8ZW0+WG1sIEJhc2UgSm9pbiBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VKb2luQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZUpvaW5Db2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9KT0lOX0NPTFVNTiA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IFhNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNFX0pPSU5fQ09MVU1OX19OQU1FID0gWE1MX05BTUVEX0NPTFVNTl9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9IFhNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2UgSm9pbiBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTRV9KT0lOX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkcgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUUgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUgPSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRSA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPklkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19JRCA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBTX0lEID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTCA9IEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUgPGVtPkFic3RyYWN0IFhtbCBUYWJsZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVEFCTEUgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVEFCTEVfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcgPGVtPlhtbCBUeXBlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HID0gODg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFR5cGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HID0gMTQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERSA9IDE3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUiA9IDE4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERSA9IDE5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSID0gMjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyA8ZW0+QXR0cmlidXRlczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTID0gMjE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgPGVtPlhtbCBCYXNpYzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQyA9IDIyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlIDxlbT5DYXNjYWRlIFR5cGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q2FzY2FkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEUgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlIDxlbT5BYnN0cmFjdCBYbWwgUmVmZXJlbmNlIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9SRUZFUkVOQ0VfVEFCTEUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19OQU1FID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9SRUZFUkVOQ0VfVEFCTEVfX0NBVEFMT0cgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19TQ0hFTUEgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9SRUZFUkVOQ0VfVEFCTEVfX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgUmVmZXJlbmNlIFRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTID0gWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBUeXBlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQUNDRVNTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUyA9IFhNTF9UWVBFX01BUFBJTkdfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FID0gWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fTUVUQURBVEFfQ09NUExFVEUgPSBYTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT04gPSBYTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTID0gWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5BYnN0cmFjdCBYbWwgVHlwZSBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPdmVycmlkZSA8ZW0+WG1sIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPdmVycmlkZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE92ZXJyaWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09WRVJSSURFID0gNjY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09WRVJSSURFX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgT3ZlcnJpZGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FID0gWE1MX09WRVJSSURFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUyA9IFhNTF9PVkVSUklERV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEUgPSBYTUxfT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fREVTQ1JJUFRJT04gPSBYTUxfT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0ZFQVRVUkVfQ09VTlQgPSBYTUxfT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRSA9IFhNTF9PVkVSUklERV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fREVTQ1JJUFRJT04gPSBYTUxfT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4gPSBYTUxfT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfRkVBVFVSRV9DT1VOVCA9IFhNTF9PVkVSUklERV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19ERVNDUklQVElPTiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VMRU1FTlRfQ09MTEVDVElPTlMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9fRUxFTUVOVF9DT0xMRUNUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fSURTID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkZWQgSWRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX0VNQkVEREVEX0lEUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJhc2ljczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19CQVNJQ1MgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19WRVJTSU9OUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hbnkgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PbmUgVG8gTWFueXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fT05FX1RPX01BTllTID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T25lIFRvIE9uZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fT05FX1RPX09ORVMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55IFRvIE1hbnlzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfX01BTllfVE9fTUFOWVMgPSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFU18yMF9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbWJlZGRlZHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFU19fRU1CRURERURTID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfRkVBVFVSRV9DT1VOVCArIDg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNpZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEVTX19UUkFOU0lFTlRTID0gT3JtVjJfMFBhY2thZ2UuWE1MX0FUVFJJQlVURVNfMjBfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXR0cmlidXRlczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFUVFJJQlVURVNfRkVBVFVSRV9DT1VOVCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX19URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQkFTSUNfX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9CQVNJQ19fT1BUSU9OQUwgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEJhc2ljPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0JBU0lDX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBEZXRhY2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBU0NBREVfVFlQRV9fQ0FTQ0FERV9ERVRBQ0ggPSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FTQ0FERV9UWVBFXzIwX19DQVNDQURFX0RFVEFDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIEFsbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX0FMTCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQVNDQURFX1RZUEVfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQVNDQURFX1RZUEVfMjBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX01FUkdFID0gT3JtVjJfMFBhY2thZ2UuWE1MX0NBU0NBREVfVFlQRV8yMF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlIFJlbW92ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX19DQVNDQURFX1JFTU9WRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQVNDQURFX1RZUEVfMjBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9DQVNDQURFX1RZUEVfMjBfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2FzY2FkZSBUeXBlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FTQ0FERV9UWVBFX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfQ0FTQ0FERV9UWVBFXzIwX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENsYXNzUmVmZXJlbmNlIDxlbT5YbWwgQ2xhc3MgUmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENsYXNzUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NMQVNTX1JFRkVSRU5DRSA9IDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DTEFTU19SRUZFUkVOQ0VfX0NMQVNTX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDbGFzcyBSZWZlcmVuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0xBU1NfUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZSA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFID0gMjU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTExFQ1RJT05fVEFCTEVfX05BTUUgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19DQVRBTE9HID0gQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9fQ0FUQUxPRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19TQ0hFTUEgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFX19KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4gPGVtPlhtbCBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU4gPSAyNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX05BTUUgPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fSU5TRVJUQUJMRSA9IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fTlVMTEFCTEUgPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX05VTExBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19UQUJMRSA9IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19VTklRVUUgPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xVTU5fX1VQREFUQUJMRSA9IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVVBEQVRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fTEVOR1RIID0gQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9fUFJFQ0lTSU9OID0gQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjYWxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MVU1OX19TQ0FMRSA9IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sdW1uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTFVNTl9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcgPGVtPkNvbHVtbiBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9NQVBQSU5HID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUFQUElOR19fQ09MVU1OID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Db2x1bW4gTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCA8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uUmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1JFU1VMVCA9IDI4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9SRVNVTFRfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNvbHVtbiBSZXN1bHQ8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUkVTVUxUX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyA8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HID0gMjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9CID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RFTVBPUkFMID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENvbnZlcnRpYmxlIE1hcHBpbmc8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gMzA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIERlZmluaXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04gPSBBQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19OQU1FID0gQUJTVFJBQ1RfWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0RJU0NSSU1JTkFUT1JfVFlQRSA9IEFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCA9IEFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19MRU5HVEg7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT04gPSAzMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX05BTUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0IgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sbGVjdGlvbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTc7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSA8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEUgPSAzMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERBQkxFX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0NMQVNTX05BTUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRUREQUJMRV9fTUVUQURBVEFfQ09NUExFVEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0RFU0NSSVBUSU9OID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfX0FUVFJJQlVURVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREFCTEVfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQgPGVtPlhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRCA9IDMzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX05BTUUgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVMgPSBBQlNUUkFDVF9YTUxfRU1CRURERURfX0FUVFJJQlVURV9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU1CRURERURfSUQgPSAzNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19OQU1FID0gQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEX0lEX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX0VNQkVEREVEX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF9JRF9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX0VNQkVEREVEX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSA8ZW0+WG1sIEVudGl0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWSA9IDM1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0NMQVNTX05BTUUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19NRVRBREFUQV9DT01QTEVURSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FUVFJJQlVURVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVCA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUFJFX1JFTU9WRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUkVfVVBEQVRFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9VUERBVEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA5OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fUE9TVF9MT0FEID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fQ0FDSEVBQkxFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0lEX0NMQVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fTkFNRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19UQUJMRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Jbmhlcml0YW5jZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRW50aXR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIgPGVtPlhtbCBFdmVudCBNZXRob2QgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVIgPSA0MTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9QRVJTSVNUID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1BFUlNJU1QgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUkVNT1ZFID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfUkVNT1ZFID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1VQREFURSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1VQREFURSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9MT0FEID0gNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRXZlbnQgTWV0aG9kIENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgPSA3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyIDxlbT5FbnRpdHkgTGlzdGVuZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVIgPSAzNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QUkVfUEVSU0lTVCA9IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUEVSU0lTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUl9fUE9TVF9QRVJTSVNUID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfUEVSU0lTVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BSRV9SRU1PVkUgPSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1JFTU9WRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX1JFTU9WRSA9IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1JFTU9WRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJfX1BSRV9VUERBVEUgPSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1VQREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19QT1NUX1VQREFURSA9IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1VQREFURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUl9fUE9TVF9MT0FEID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfTE9BRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSX19ERVNDUklQVElPTiA9IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUl9fQ0xBU1NfTkFNRSA9IFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9MSVNURU5FUl9GRUFUVVJFX0NPVU5UID0gWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJTID0gMzc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTElTVEVORVJTX19FTlRJVFlfTElTVEVORVJTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX0xJU1RFTkVSU19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyA8ZW0+WG1sIEVudGl0eSBNYXBwaW5nczwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1MgPSAzODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQgPGVtPkVudGl0eSBSZXN1bHQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudGl0eVJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRVNVTFQgPSAzOTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZCA8ZW0+RXZlbnQgTWV0aG9kPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEV2ZW50TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EID0gNDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQgPGVtPkZpZWxkIFJlc3VsdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRGaWVsZFJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFU1VMVCA9IDQyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlIDxlbT5YbWwgR2VuZXJhdGVkIFZhbHVlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRSA9IDQzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciA8ZW0+WG1sIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUiA9IDQ0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciA8ZW0+WG1sIEdlbmVyYXRvciBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSID0gNDU7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRCA9IDQ2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlIDxlbT5Jbmhlcml0YW5jZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRJbmhlcml0YW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFID0gNDg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiA8ZW0+WG1sIEpvaW4gQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTiA9IDQ5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSA8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFID0gNTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uTG9iIDxlbT5Mb2I8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkxvYgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldExvYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPQiA9IDUzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9NYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWSA9IDU0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZSA8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYW55VG9PbmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkUgPSA1NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldE1hcEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUF9LRVkgPSA1NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRCeU1hcHBpbmcgPGVtPlhtbCBNYXBwZWQgQnkgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9CWV9NQVBQSU5HID0gNTc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyA8ZW0+WG1sIE1hcHBlZCBTdXBlcmNsYXNzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IDU4OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5IDxlbT5YbWwgUXVlcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUlkgPSA3OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgTmF0aXZlIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWROYXRpdmVRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9OQVRJVkVfUVVFUlkgPSA1OTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5IDxlbT5YbWwgTmFtZWQgUXVlcnk8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZID0gNjA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05VTExfQVRUUklCVVRFX01BUFBJTkcgPSA2MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT25lVG9NYW55KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZID0gNjI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkUgPSA2MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiA8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU4gPSA2NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IDY3OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gNjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uUG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uUG9zdExvYWQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfTE9BRCA9IDcwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlBvc3RQZXJzaXN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdFBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1BFUlNJU1QgPSA3MTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1JFTU9WRSA9IDcyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlBvc3RVcGRhdGUgPGVtPlBvc3QgVXBkYXRlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0VXBkYXRlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfVVBEQVRFID0gNzM7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdCA8ZW0+UHJlIFBlcnNpc3Q8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVBlcnNpc3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQcmVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1BFUlNJU1QgPSA3NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVSZW1vdmUgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVJlbW92ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9SRU1PVkUgPSA3NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVVcGRhdGUgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9VUERBVEUgPSA3NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiA8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OID0gNzc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIgPGVtPlhtbCBRdWVyeSBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSID0gODA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQV9MT0NBVElPTiA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04gPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0cgPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIFN1cGVyY2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW1iZWRkYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVMgPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX01BUFBJTkdTX0ZFQVRVUkVfQ09VTlQgPSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfRkVBVFVSRV9DT1VOVCArIDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19ESVNDUklNSU5BVE9SX0NPTFVNTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfUkVTVUxUX19FTlRJVFlfQ0xBU1MgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUyA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RW50aXR5IFJlc3VsdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRVNVTFRfRkVBVFVSRV9DT1VOVCA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT04gPSBPcm1WMl8wUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EXzIwX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RXZlbnQgTWV0aG9kPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZJRUxEX1JFU1VMVF9fTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSUVMRF9SRVNVTFRfX0NPTFVNTiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+RmllbGQgUmVzdWx0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklFTERfUkVTVUxUX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVEVEX1ZBTFVFX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SX19ERVNDUklQVElPTiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9HRU5FUkFUT1JfMjBfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfX05BTUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfR0VORVJBVE9SXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfR0VORVJBVE9SXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gT3JtVjJfMFBhY2thZ2UuWE1MX0dFTkVSQVRPUl8yMF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX0dFTkVSQVRPUl8yMF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1IgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEdlbmVyYXRvciBDb250YWluZXI8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19DT0xVTU4gPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0xPQiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9fVEFCTEVfR0VORVJBVE9SID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX19HRU5FUkFURURfVkFMVUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIElkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzc0NvbnRhaW5lciA8ZW0+WG1sIElkIENsYXNzIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzc0NvbnRhaW5lcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkQ2xhc3NDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSURfQ0xBU1NfQ09OVEFJTkVSID0gNDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9JRF9DTEFTU19DT05UQUlORVJfX0lEX0NMQVNTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSWQgQ2xhc3MgQ29udGFpbmVyPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0lEX0NMQVNTX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5IRVJJVEFOQ0VfX1NUUkFURUdZID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Jbmhlcml0YW5jZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOSEVSSVRBTkNFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OID0gQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX05BTUUgPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19JTlNFUlRBQkxFID0gQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19JTlNFUlRBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX05VTExBQkxFID0gQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OX19OVUxMQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19UQUJMRSA9IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX1VOSVFVRSA9IEFCU1RSQUNUX1hNTF9CQVNFX0NPTFVNTl9fVU5JUVVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX19VUERBVEFCTEUgPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fX1VQREFUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gQ29sdW1uPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQkFTRV9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkNvbnRhaW5lciA8ZW0+WG1sIEpvaW4gQ29sdW1uIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkNvbnRhaW5lcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5Db250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9DT0xVTU5fQ09OVEFJTkVSID0gNTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9DT05UQUlORVJfX0pPSU5fQ09MVU1OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEpvaW4gQ29sdW1uIENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX0NPTFVNTl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVmZXJlbmNlVGFibGUgPGVtPlhtbCBSZWZlcmVuY2UgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlZmVyZW5jZVRhYmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUmVmZXJlbmNlVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVGRVJFTkNFX1RBQkxFID0gNjk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX05BTUUgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19DQVRBTE9HID0gQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9fQ0FUQUxPRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19TQ0hFTUEgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFMgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX19KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW52ZXJzZSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gQUJTVFJBQ1RfWE1MX1JFRkVSRU5DRV9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgSm9pbiBUYWJsZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZUNvbnRhaW5lciA8ZW0+WG1sIEpvaW4gVGFibGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXIKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luVGFibGVDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9DT05UQUlORVIgPSA1MjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSk9JTl9UQUJMRV9DT05UQUlORVJfX0pPSU5fVEFCTEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKb2luIFRhYmxlIENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KT0lOX1RBQkxFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT0JfRkVBVFVSRV9DT1VOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19OQU1FID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRhcmdldCBFbnRpdHk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX0ZFVENIID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19GRVRDSDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19DQVNDQURFID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQUEVEX0JZID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fSk9JTl9UQUJMRSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX09SREVSX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQ09MVU1OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19PUkRFUl9CWSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVlfVEVNUE9SQUwgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfVEVNUE9SQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfRU5VTUVSQVRFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NMQVNTID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZX19NQVBfS0VZX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWV9DT0xVTU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfX01BUF9LRVkgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVk7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gTWFueTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fTkFNRSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IEVudGl0eTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19UQVJHRVRfRU5USVRZID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fVEFSR0VUX0VOVElUWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX1RBQkxFID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fSk9JTl9UQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX09ORV9fSUQgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX01BUFNfSUQgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBTX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19PTkVfX09QVElPTkFMID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fT05FX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BUF9LRVlfX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVBfS0VZX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9CWV9NQVBQSU5HX19NQVBQRURfQlkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBwZWQgQnkgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfQllfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQ0xBU1NfTkFNRSA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fTUVUQURBVEFfQ09NUExFVEUgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX19NRVRBREFUQV9DT01QTEVURTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19ERVNDUklQVElPTiA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fQVRUUklCVVRFUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfX0FUVFJJQlVURVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IEFCU1RSQUNUX1hNTF9UWVBFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMgPSBBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBQRURfU1VQRVJDTEFTU19GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX19ERVNDUklQVElPTiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV8yMF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX19OQU1FID0gT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfX1FVRVJZID0gT3JtVjJfMFBhY2thZ2UuWE1MX1FVRVJZXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9fSElOVFMgPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfMjBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfMjBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0RFU0NSSVBUSU9OID0gWE1MX1FVRVJZX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FID0gWE1MX1FVRVJZX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWSA9IFhNTF9RVUVSWV9fUVVFUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fSElOVFMgPSBYTUxfUVVFUllfX0hJTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gWE1MX1FVRVJZX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gWE1MX1FVRVJZX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBOYW1lZCBOYXRpdmUgUXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX0ZFQVRVUkVfQ09VTlQgPSBYTUxfUVVFUllfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWV9fREVTQ1JJUFRJT04gPSBYTUxfUVVFUllfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWV9fTkFNRSA9IFhNTF9RVUVSWV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX19RVUVSWSA9IFhNTF9RVUVSWV9fUVVFUlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX05BTUVEX1FVRVJZX19ISU5UUyA9IFhNTF9RVUVSWV9fSElOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TG9jayBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUVVFUllfX0xPQ0tfTU9ERSA9IFhNTF9RVUVSWV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTmFtZWQgUXVlcnk8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUVVFUllfRkVBVFVSRV9DT1VOVCA9IFhNTF9RVUVSWV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HX19BQ0NFU1MgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX0FDQ0VTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTkFNRSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX1RBUkdFVF9FTlRJVFkgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fRkVUQ0ggPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fQ0FTQ0FERSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQUEVEX0JZID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBQRURfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX1RBQkxFID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX1RBQkxFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19PUkRFUl9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX09SREVSX0NPTFVNTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19PUkRFUl9CWSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fT1JERVJfQlk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX1RFTVBPUkFMID0gQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZX1RFTVBPUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19NQVBfS0VZX0VOVU1FUkFURUQgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfRU5VTUVSQVRFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfX01BUF9LRVlfQ0xBU1MgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9DT0xVTU4gPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfQ09MVU1OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fTUFQX0tFWSA9IEFCU1RSQUNUX1hNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQX0tFWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX19KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUwgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fQUNDRVNTID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19OQU1FID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fVEFSR0VUX0VOVElUWSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19GRVRDSCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0ZFVENIOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19DQVNDQURFID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fQ0FTQ0FERTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fSk9JTl9UQUJMRSA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0pPSU5fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19KT0lOX0NPTFVNTlMgPSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19KT0lOX0NPTFVNTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19JRCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19NQVBTX0lEID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fTUFQU19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX09QVElPTkFMID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19fT1BUSU9OQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcGVkIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTCA9IEFCU1RSQUNUX1hNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQgPGVtPlhtbCBRdWVyeSBIaW50PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUhpbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfSElOVCA9IDgxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRSA9IDgyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUiA9IDgzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElORyA9IDg0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlIDxlbT5YbWwgVGFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEUgPSA4NTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1IgPSA4NjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQgPGVtPlhtbCBUcmFuc2llbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlQgPSA4NzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50IDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UID0gODk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbiA8ZW0+WG1sIFZlcnNpb248L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT04gPSA5MDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlcmFibGUgPGVtPlhtbCBPcmRlcmFibGU8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyYWJsZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9yZGVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUkFCTEUgPSA2NDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUkFCTEVfX09SREVSX0NPTFVNTiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUkFCTEVfMjBfX09SREVSX0NPTFVNTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSQUJMRV9fT1JERVJfQlkgPSBPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPcmRlcmFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJBQkxFX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUl9DT0xVTU5fX05BTUUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEUgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUyA9IFhNTF9BQ0NFU1NfSE9MREVSX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTiA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlbGltaXRlZCBJZGVudGlmaWVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUyA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQSA9IFhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUID0gWE1MX0FDQ0VTU19IT0xERVJfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMgPSBYTUxfQUNDRVNTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQUNDRVNTX0hPTERFUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0RFU0NSSVBUSU9OID0gT3JtVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfMjBfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUgPSBPcm1WMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV8yMF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IE9ybVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfRkVBVFVSRV9DT1VOVCA9IE9ybVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVGRVJFTkNFX1RBQkxFX19KT0lOX0NPTFVNTlMgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBSZWZlcmVuY2UgVGFibGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUkVGRVJFTkNFX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX0xPQURfX0RFU0NSSVBUSU9OID0gRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9MT0FEX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9zdCBMb2FkPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9MT0FEX0ZFQVRVUkVfQ09VTlQgPSBFVkVOVF9NRVRIT0RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUEVSU0lTVF9fREVTQ1JJUFRJT04gPSBFVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1BFUlNJU1RfX01FVEhPRF9OQU1FID0gRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1BFUlNJU1RfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9SRU1PVkVfX0RFU0NSSVBUSU9OID0gRVZFTlRfTUVUSE9EX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9SRU1PVkVfX01FVEhPRF9OQU1FID0gRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfUkVNT1ZFX0ZFQVRVUkVfQ09VTlQgPSBFVkVOVF9NRVRIT0RfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfVVBEQVRFX19ERVNDUklQVElPTiA9IEVWRU5UX01FVEhPRF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWV0aG9kIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBPU1RfVVBEQVRFX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX1VQREFURV9GRUFUVVJFX0NPVU5UID0gRVZFTlRfTUVUSE9EX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfUEVSU0lTVF9fREVTQ1JJUFRJT04gPSBFVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfUEVSU0lTVF9fTUVUSE9EX05BTUUgPSBFVkVOVF9NRVRIT0RfX01FVEhPRF9OQU1FOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlByZSBQZXJzaXN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1BFUlNJU1RfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1JFTU9WRV9fREVTQ1JJUFRJT04gPSBFVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfUkVNT1ZFX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9SRU1PVkVfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFX1VQREFURV9fREVTQ1JJUFRJT04gPSBFVkVOVF9NRVRIT0RfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1ldGhvZCBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUkVfVVBEQVRFX19NRVRIT0RfTkFNRSA9IEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRV9VUERBVEVfRkVBVFVSRV9DT1VOVCA9IEVWRU5UX01FVEhPRF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX0NPTFVNTl9ERUZJTklUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fTkFNRSA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gQUJTVFJBQ1RfWE1MX05BTUVEX0NPTFVNTl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW48L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU5fRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIgPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fQ09OVEFJTkVSID0gNzg7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9DT05UQUlORVJfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9RVUVSSUVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UX19ERVNDUklQVElPTiA9IE9ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9ISU5UXzIwX19ERVNDUklQVElPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfSElOVF9fTkFNRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9RVUVSWV9ISU5UXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfSElOVF9fVkFMVUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfSElOVF8yMF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUXVlcnkgSGludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UX0ZFQVRVUkVfQ09VTlQgPSBPcm1WMl8wUGFja2FnZS5YTUxfUVVFUllfSElOVF8yMF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19OQU1FID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX0NBVEFMT0cgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0c7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VDT05EQVJZX1RBQkxFX19TQ0hFTUEgPSBBQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IEFCU1RSQUNUX1hNTF9UQUJMRV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFQ09OREFSWV9UQUJMRV9GRUFUVVJFX0NPVU5UID0gQUJTVFJBQ1RfWE1MX1RBQkxFX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19ERVNDUklQVElPTiA9IFhNTF9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX05BTUUgPSBYTUxfR0VORVJBVE9SX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSBYTUxfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFID0gWE1MX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0cgPSBYTUxfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fREVTQ1JJUFRJT04gPSBPcm1WMl8wUGFja2FnZS5YTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMF9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRSA9IE9ybVYyXzBQYWNrYWdlLlhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBSZXN1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTID0gT3JtVjJfMFBhY2thZ2UuWE1MX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFMgPSBPcm1WMl8wUGFja2FnZS5YTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX19OQU1FID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9fQ0FUQUxPRyA9IEFCU1RSQUNUX1hNTF9UQUJMRV9fQ0FUQUxPRzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9fU0NIRU1BID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19TQ0hFTUE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gQUJTVFJBQ1RfWE1MX1RBQkxFX19VTklRVUVfQ09OU1RSQUlOVFM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRhYmxlPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OID0gWE1MX0dFTkVSQVRPUl9fREVTQ1JJUFRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRSA9IFhNTF9HRU5FUkFUT1JfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5pdGlhbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSA9IFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSBYTUxfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQSA9IFhNTF9HRU5FUkFUT1JfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZSBDb2x1bW4gTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUgPSBYTUxfR0VORVJBVE9SX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBrIENvbHVtbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWUgQ29uc3RyYWludHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1RBQkxFX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UID0gWE1MX0dFTkVSQVRPUl9GRUFUVVJFX0NPVU5UICsgNzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfX05BTUUgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFRyYW5zaWVudDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9UUkFOU0lFTlRfRkVBVFVSRV9DT1VOVCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfX05BTUUgPSBPcm1WMl8wUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfMjBfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uIE5hbWVzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTID0gT3JtVjJfMFBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9VTklRVUVfQ09OU1RSQUlOVF9GRUFUVVJFX0NPVU5UID0gT3JtVjJfMFBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0FDQ0VTUyA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19fQUNDRVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19OQU1FID0gQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1ZFUlNJT05fX0NPTFVNTiA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19MT0IgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX19URU1QT1JBTCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVkVSU0lPTl9fRU5VTUVSQVRFRCA9IEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVmVyc2lvbjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9WRVJTSU9OX0ZFQVRVUkVfQ09VTlQgPSBBQlNUUkFDVF9YTUxfQVRUUklCVVRFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldERpc2NyaW1pbmF0b3JUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQ1JJTUlOQVRPUl9UWVBFID0gOTE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUgPGVtPkVudW0gVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEVudW1UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5VTV9UWVBFID0gOTI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIDxlbT5GZXRjaCBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEZldGNoVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZFVENIX1RZUEUgPSA5MzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZSA8ZW0+R2VuZXJhdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0R2VuZXJhdGlvblR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBHRU5FUkFUSU9OX1RZUEUgPSA5NDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUgPGVtPkluaGVyaXRhbmNlIFR5cGU8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0SW5oZXJpdGFuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5IRVJJVEFOQ0VfVFlQRSA9IDk1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZSA8ZW0+VGVtcG9yYWwgVHlwZTwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRUZW1wb3JhbFR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURU1QT1JBTF9UWVBFID0gOTY7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzZUNvbHVtbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbEJhc2VDb2x1bW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbEVtYmVkZGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE5hbWVkQ29sdW1uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEJhc2VKb2luQ29sdW1uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sTmFtZWRDb2x1bW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbFRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGFic3RyYWN0WG1sVHlwZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQWNjZXNzSG9sZGVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGF0dHJpYnV0ZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQmFzaWNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgY2FzY2FkZVR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2xhc3NSZWZlcmVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENvbHVtbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBjb2x1bW5NYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGNvbHVtblJlc3VsdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbWJlZGRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkSWRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVudGl0eUxpc3RlbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGVudGl0eUxpc3RlbmVyc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBlbnRpdHlSZXN1bHRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZXZlbnRNZXRob2RFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZmllbGRSZXN1bHRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sR2VuZXJhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEdlbmVyYXRvckNvbnRhaW5lckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxJZENsYXNzQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGluaGVyaXRhbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEpvaW5Db2x1bW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSm9pbkNvbHVtbkNvbnRhaW5lckVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxKb2luVGFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSm9pblRhYmxlQ29udGFpbmVyRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGxvYkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYW55VG9NYW55RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hbnlUb09uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBtYXBLZXlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGVkQnlNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxOYW1lZFF1ZXJ5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9uZVRvTWFueUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPcmRlckNvbHVtbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPdmVycmlkZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBhYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFJlZmVyZW5jZVRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvc3RMb2FkRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvc3RQZXJzaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHBvc3RSZW1vdmVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgcG9zdFVwZGF0ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmVQZXJzaXN0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHByZVJlbW92ZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBwcmVVcGRhdGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5FQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlDb250YWluZXJFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlIaW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNlcXVlbmNlR2VuZXJhdG9yRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVGFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVHJhbnNpZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFR5cGVNYXBwaW5nRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFVuaXF1ZUNvbnN0cmFpbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sVmVyc2lvbkVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPcmRlcmFibGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkaXNjcmltaW5hdG9yVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZW51bVR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGZldGNoVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZ2VuZXJhdGlvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGluaGVyaXRhbmNlVHlwZUVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gdGVtcG9yYWxUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCi0JICogcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYwotCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCi0JICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKLQkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBPcm1QYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIE9ybUZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBPcm1QYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1QYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE9ybVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IE9ybVBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCQlYTUxUeXBlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBDb21tb25QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKSA6IENvbW1vblBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgOiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID0gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZUNvbW1vblBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlT3JtUGFja2FnZS5mcmVlemUoKTsKLQotICAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChPcm1QYWNrYWdlLmVOU19VUkksIHRoZU9ybVBhY2thZ2UpOwotCQlyZXR1cm4gdGhlT3JtUGFja2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgWG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIGFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4gPGVtPlhtbCBCYXNlIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzZSBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNlQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxCYXNlQ29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkluc2VydGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0SW5zZXJ0YWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sQmFzZUNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2VDb2x1bW5fSW5zZXJ0YWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzZUNvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVsbGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0TnVsbGFibGUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2VDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNlQ29sdW1uX051bGxhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNlQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiNnZXRUYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sQmFzZUNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2VDb2x1bW5fVGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2VDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlQ29sdW1uI2dldFVuaXF1ZSA8ZW0+VW5pcXVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VW5pcXVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlQ29sdW1uI2dldFVuaXF1ZSgpCi0JICogQHNlZSAjZ2V0WG1sQmFzZUNvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2VDb2x1bW5fVW5pcXVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNlQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiNnZXRVcGRhdGFibGUgPGVtPlVwZGF0YWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlVwZGF0YWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiNnZXRVcGRhdGFibGUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2VDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNlQ29sdW1uX1VwZGF0YWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzZUNvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VDb2x1bW4gPGVtPkFic3RyYWN0IFhtbCBCYXNlIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgQmFzZSBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZUNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0WG1sQmFzZUNvbHVtbigpCi0JewotCQlyZXR1cm4gYWJzdHJhY3RYbWxCYXNlQ29sdW1uRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgQmFzZSBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgQmFzZSBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEFic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGFic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sRW1iZWRkZWQgPGVtPkFic3RyYWN0IFhtbCBFbWJlZGRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgRW1iZWRkZWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sRW1iZWRkZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbEVtYmVkZGVkKCkKLQl7Ci0JCXJldHVybiBhYnN0cmFjdFhtbEVtYmVkZGVkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgPGVtPkFic3RyYWN0IFhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIGFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyNnZXRNYXBLZXkoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwS2V5KCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4gPGVtPlhtbCBOYW1lZCBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE5hbWVkIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZENvbHVtbigpCi0JewotCQlyZXR1cm4geG1sTmFtZWRDb2x1bW5FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbiA8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db2x1bW4gRGVmaW5pdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZENvbHVtbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbiNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxOYW1lZENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE5hbWVkQ29sdW1uX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgQmFzZSBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzZSBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlyZXR1cm4geG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0RGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0RGlzY3JpbWluYXRvclR5cGUoKQotCSAqIEBzZWUgI2dldFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5fRGlzY3JpbWluYXRvclR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MZW5ndGg8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uI2dldExlbmd0aCgpCi0JICogQHNlZSAjZ2V0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbl9MZW5ndGgoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VKb2luQ29sdW1uIDxlbT5YbWwgQmFzZSBKb2luIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQmFzZSBKb2luIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUpvaW5Db2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNlSm9pbkNvbHVtbigpCi0JewotCQlyZXR1cm4geG1sQmFzZUpvaW5Db2x1bW5FQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUpvaW5Db2x1bW4jZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlSm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sQmFzZUpvaW5Db2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNlSm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzZUpvaW5Db2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxOYW1lZENvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIE5hbWVkIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpCi0JewotCQlyZXR1cm4gYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiBhYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRUYXJnZXRFbnRpdHkgPGVtPlRhcmdldCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0VGFyZ2V0RW50aXR5KCkKLQkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdfVGFyZ2V0RW50aXR5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZldGNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0RmV0Y2goKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZyNnZXRDYXNjYWRlIDxlbT5DYXNjYWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q2FzY2FkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nI2dldENhc2NhZGUoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19DYXNjYWRlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBYbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIGFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nI2dldE9wdGlvbmFsIDxlbT5PcHRpb25hbDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk9wdGlvbmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcjZ2V0T3B0aW9uYWwoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlIDxlbT5BYnN0cmFjdCBYbWwgVGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QWJzdHJhY3QgWG1sIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RYbWxUYWJsZSgpCi0JewotCQlyZXR1cm4gYWJzdHJhY3RYbWxUYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRBYnN0cmFjdFhtbFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0QWJzdHJhY3RYbWxUYWJsZV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhdGFsb2c8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0Q2F0YWxvZygpCi0JICogQHNlZSAjZ2V0QWJzdHJhY3RYbWxUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sVGFibGVfQ2F0YWxvZygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpYWJzdHJhY3RYbWxUYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0QWJzdHJhY3RYbWxUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEFic3RyYWN0WG1sVGFibGVfU2NoZW1hKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSNnZXRVbmlxdWVDb25zdHJhaW50cyA8ZW0+VW5pcXVlIENvbnN0cmFpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVGFibGUjZ2V0VW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI2dldEFic3RyYWN0WG1sVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBYnN0cmFjdFhtbFRhYmxlX1VuaXF1ZUNvbnN0cmFpbnRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFR5cGVNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgVHlwZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBUeXBlIE1hcHBpbmc8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sVHlwZU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiBhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyIDxlbT5YbWwgQWNjZXNzIEhvbGRlcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQWNjZXNzIEhvbGRlcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQWNjZXNzSG9sZGVyKCkKLQl7Ci0JCXJldHVybiB4bWxBY2Nlc3NIb2xkZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlciNnZXRBY2Nlc3MgPGVtPkFjY2VzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFjY2VzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyI2dldEFjY2VzcygpCi0JICogQHNlZSAjZ2V0WG1sQWNjZXNzSG9sZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQWNjZXNzSG9sZGVyX0FjY2VzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQWNjZXNzSG9sZGVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXR0cmlidXRlTWFwcGluZygpCi0JewotCQlyZXR1cm4geG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZyNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpCi0JewotCQlyZXR1cm4geG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIENvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBzZWUgI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkKLQl7Ci0JCXJldHVybiB4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldENvbHVtbigpCi0JICogQHNlZSAjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyI2dldEF0dHJpYnV0ZU92ZXJyaWRlcyA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIjZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAc2VlICNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXR0cmlidXRlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIGF0dHJpYnV0ZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRJZHMgPGVtPklkczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SWRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldElkcygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfSWRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRFbWJlZGRlZElkcyA8ZW0+RW1iZWRkZWQgSWRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbWJlZGRlZCBJZHM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0RW1iZWRkZWRJZHMoKQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkSWRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRCYXNpY3MgPGVtPkJhc2ljczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+QmFzaWNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldEJhc2ljcygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfQmFzaWNzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRWZXJzaW9ucyA8ZW0+VmVyc2lvbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlZlcnNpb25zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldFZlcnNpb25zKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19WZXJzaW9ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0TWFueVRvT25lcyA8ZW0+TWFueSBUbyBPbmVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYW55IFRvIE9uZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0TWFueVRvT25lcygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfTWFueVRvT25lcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0T25lVG9NYW55cyA8ZW0+T25lIFRvIE1hbnlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5PbmUgVG8gTWFueXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0T25lVG9NYW55cygpCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF0dHJpYnV0ZXNfT25lVG9NYW55cygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0T25lVG9PbmVzIDxlbT5PbmUgVG8gT25lczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+T25lIFRvIE9uZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0T25lVG9PbmVzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19PbmVUb09uZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWF0dHJpYnV0ZXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE1hbnlUb01hbnlzIDxlbT5NYW55IFRvIE1hbnlzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYW55IFRvIE1hbnlzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzI2dldE1hbnlUb01hbnlzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19NYW55VG9NYW55cygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0RW1iZWRkZWRzIDxlbT5FbWJlZGRlZHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVtYmVkZGVkczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRFbWJlZGRlZHMoKQotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXR0cmlidXRlc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkF0dHJpYnV0ZXMjZ2V0VHJhbnNpZW50cyA8ZW0+VHJhbnNpZW50czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VHJhbnNpZW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQXR0cmlidXRlcyNnZXRUcmFuc2llbnRzKCkKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0QXR0cmlidXRlc19UcmFuc2llbnRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlhdHRyaWJ1dGVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoOSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyA8ZW0+WG1sIEJhc2ljPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBCYXNpYzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxCYXNpYygpCi0JewotCQlyZXR1cm4geG1sQmFzaWNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZldGNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRGZXRjaCgpCi0JICogQHNlZSAjZ2V0WG1sQmFzaWMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxCYXNpY19GZXRjaCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQmFzaWNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+T3B0aW9uYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldE9wdGlvbmFsKCkKLQkgKiBAc2VlICNnZXRYbWxCYXNpYygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEJhc2ljX09wdGlvbmFsKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxCYXNpY0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUgPGVtPkNhc2NhZGUgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DYXNjYWRlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0Q2FzY2FkZVR5cGUoKQotCXsKLQkJcmV0dXJuIGNhc2NhZGVUeXBlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVBbGwgPGVtPkNhc2NhZGUgQWxsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBBbGw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZUFsbCgpCi0JICogQHNlZSAjZ2V0Q2FzY2FkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYXNjYWRlVHlwZV9DYXNjYWRlQWxsKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljYXNjYWRlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVQZXJzaXN0IDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVBlcnNpc3QoKQotCSAqIEBzZWUgI2dldENhc2NhZGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNhc2NhZGVUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZU1lcmdlIDxlbT5DYXNjYWRlIE1lcmdlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBNZXJnZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ2FzY2FkZVR5cGUjaXNDYXNjYWRlTWVyZ2UoKQotCSAqIEBzZWUgI2dldENhc2NhZGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZU1lcmdlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljYXNjYWRlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVSZW1vdmUgPGVtPkNhc2NhZGUgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2FzY2FkZSBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlbW92ZSgpCi0JICogQHNlZSAjZ2V0Q2FzY2FkZVR5cGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVtb3ZlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSljYXNjYWRlVHlwZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSNpc0Nhc2NhZGVSZWZyZXNoIDxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXNjYWRlIFJlZnJlc2g8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNhc2NhZGVUeXBlI2lzQ2FzY2FkZVJlZnJlc2goKQotCSAqIEBzZWUgI2dldENhc2NhZGVUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlZnJlc2goKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNhc2NhZGVUeXBlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZSA8ZW0+WG1sIENsYXNzIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2xhc3MgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbENsYXNzUmVmZXJlbmNlKCkKLQl7Ci0JCXJldHVybiB4bWxDbGFzc1JlZmVyZW5jZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZSNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZSNnZXRDbGFzc05hbWUoKQotCSAqIEBzZWUgI2dldFhtbENsYXNzUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ2xhc3NSZWZlcmVuY2VfQ2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDbGFzc1JlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGUgPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb2xsZWN0aW9uVGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbENvbGxlY3Rpb25UYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiA8ZW0+WG1sIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb2x1bW4oKQotCXsKLQkJcmV0dXJuIHhtbENvbHVtbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TGVuZ3RoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0TGVuZ3RoKCkKLQkgKiBAc2VlICNnZXRYbWxDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb2x1bW5fTGVuZ3RoKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJlY2lzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0UHJlY2lzaW9uKCkKLQkgKiBAc2VlICNnZXRYbWxDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb2x1bW5FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldFNjYWxlIDxlbT5TY2FsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjYWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0U2NhbGUoKQotCSAqIEBzZWUgI2dldFhtbENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbHVtbl9TY2FsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQ29sdW1uRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nIDxlbT5Db2x1bW4gTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db2x1bW4gTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldENvbHVtbk1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIGNvbHVtbk1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcjZ2V0Q29sdW1uKCkKLQkgKiBAc2VlICNnZXRDb2x1bW5NYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKWNvbHVtbk1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtblJlc3VsdCA8ZW0+Q29sdW1uIFJlc3VsdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db2x1bW4gUmVzdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRDb2x1bW5SZXN1bHQoKQotCXsKLQkJcmV0dXJuIGNvbHVtblJlc3VsdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0Q29sdW1uUmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q29sdW1uUmVzdWx0X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWNvbHVtblJlc3VsdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nIDxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNpc0xvYiA8ZW0+TG9iPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9iPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjaXNMb2IoKQotCSAqIEBzZWUgI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGVtcG9yYWw8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRUZW1wb3JhbCgpCi0JICogQHNlZSAjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0aWJsZU1hcHBpbmcjZ2V0RW51bWVyYXRlZCgpCi0JICogQHNlZSAjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbiA8ZW0+WG1sIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRGlzY3JpbWluYXRvckNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCXsKLQkJcmV0dXJuIHhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLQl7Ci0JCXJldHVybiB4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUgPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbWJlZGRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkYWJsZSgpCi0JewotCQlyZXR1cm4geG1sRW1iZWRkYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkIDxlbT5YbWwgRW1iZWRkZWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEVtYmVkZGVkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVtYmVkZGVkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQgPGVtPlhtbCBFbWJlZGRlZCBJZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQgSWQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkSWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbWJlZGRlZElkKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZElkRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5IDxlbT5YbWwgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eSgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfVGFibGUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZWNvbmRhcnlUYWJsZXMgPGVtPlNlY29uZGFyeSBUYWJsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlNlY29uZGFyeSBUYWJsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTZWNvbmRhcnlUYWJsZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEluaGVyaXRhbmNlIDxlbT5Jbmhlcml0YW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkluaGVyaXRhbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5oZXJpdGFuY2UoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9Jbmhlcml0YW5jZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvclZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFNxbFJlc3VsdFNldE1hcHBpbmdzIDxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5X0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5X0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg5KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVyIDxlbT5FbnRpdHkgTGlzdGVuZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RW50aXR5IExpc3RlbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEVudGl0eUxpc3RlbmVyKCkKLQl7Ci0JCXJldHVybiBlbnRpdHlMaXN0ZW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eUxpc3RlbmVyX0NsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5TGlzdGVuZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyc0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSllbnRpdHlMaXN0ZW5lcnNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBFbnRpdHkgTWFwcGluZ3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfRGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYWNrYWdlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQYWNrYWdlKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEVudGl0eU1hcHBpbmdzX1BhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTY2hlbWEoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2NoZW1hKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0Q2F0YWxvZygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19DYXRhbG9nKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNlcXVlbmNlR2VuZXJhdG9ycyA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRUYWJsZUdlbmVyYXRvcnMgPGVtPlRhYmxlIEdlbmVyYXRvcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlRhYmxlIEdlbmVyYXRvcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFRhYmxlR2VuZXJhdG9ycygpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbnRpdHlNYXBwaW5nc19UYWJsZUdlbmVyYXRvcnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TWFwcGVkU3VwZXJjbGFzc2VzIDxlbT5NYXBwZWQgU3VwZXJjbGFzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXBwZWQgU3VwZXJjbGFzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKQotCSAqIEBzZWUgI2dldFhtbEVudGl0eU1hcHBpbmdzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVudGl0aWVzIDxlbT5FbnRpdGllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW50aXRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVudGl0aWVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVtYmVkZGFibGVzIDxlbT5FbWJlZGRhYmxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW1iZWRkYWJsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVtYmVkZGFibGVzKCkKLQkgKiBAc2VlICNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCA8ZW0+RW50aXR5IFJlc3VsdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbnRpdHkgUmVzdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFbnRpdHlSZXN1bHQoKQotCXsKLQkJcmV0dXJuIGVudGl0eVJlc3VsdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0I2dldERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAc2VlICNnZXRFbnRpdHlSZXN1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRFbnRpdHlSZXN1bHRfRGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5UmVzdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdCNnZXRFbnRpdHlDbGFzcyA8ZW0+RW50aXR5IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RW50aXR5IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQjZ2V0RW50aXR5Q2xhc3MoKQotCSAqIEBzZWUgI2dldEVudGl0eVJlc3VsdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEVudGl0eVJlc3VsdF9FbnRpdHlDbGFzcygpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZW50aXR5UmVzdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0I2dldEZpZWxkUmVzdWx0cyA8ZW0+RmllbGQgUmVzdWx0czwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RmllbGQgUmVzdWx0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5UmVzdWx0I2dldEZpZWxkUmVzdWx0cygpCi0JICogQHNlZSAjZ2V0RW50aXR5UmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RW50aXR5UmVzdWx0X0ZpZWxkUmVzdWx0cygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpZW50aXR5UmVzdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FdmVudE1ldGhvZCA8ZW0+RXZlbnQgTWV0aG9kPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkV2ZW50IE1ldGhvZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRXZlbnRNZXRob2QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRFdmVudE1ldGhvZCgpCi0JewotCQlyZXR1cm4gZXZlbnRNZXRob2RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kI2dldE1ldGhvZE5hbWUgPGVtPk1ldGhvZCBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWV0aG9kIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kI2dldE1ldGhvZE5hbWUoKQotCSAqIEBzZWUgI2dldEV2ZW50TWV0aG9kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RXZlbnRNZXRob2RfTWV0aG9kTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZXZlbnRNZXRob2RFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyIDxlbT5YbWwgRXZlbnQgTWV0aG9kIENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRXZlbnQgTWV0aG9kIENvbnRhaW5lcjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcigpCi0JewotCQlyZXR1cm4geG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVBlcnNpc3QoKQotCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdFBlcnNpc3QoKQotCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlByZSBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVJlbW92ZSgpCi0JICogQHNlZSAjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVSZW1vdmUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RSZW1vdmUoKQotCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFJlbW92ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UHJlVXBkYXRlIDxlbT5QcmUgVXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UHJlVXBkYXRlKCkKLQkgKiBAc2VlICNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVVwZGF0ZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Qb3N0IFVwZGF0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQHNlZSAjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0VXBkYXRlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UG9zdCBMb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0TG9hZCgpCi0JICogQHNlZSAjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0TG9hZCgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0IDxlbT5GaWVsZCBSZXN1bHQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RmllbGQgUmVzdWx0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GaWVsZFJlc3VsdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldEZpZWxkUmVzdWx0KCkKLQl7Ci0JCXJldHVybiBmaWVsZFJlc3VsdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldEZpZWxkUmVzdWx0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RmllbGRSZXN1bHRfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpZmllbGRSZXN1bHRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmllbGRSZXN1bHQjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0I2dldENvbHVtbigpCi0JICogQHNlZSAjZ2V0RmllbGRSZXN1bHQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRGaWVsZFJlc3VsdF9Db2x1bW4oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWZpZWxkUmVzdWx0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSA8ZW0+WG1sIEdlbmVyYXRlZCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgR2VuZXJhdGVkIFZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEdlbmVyYXRlZFZhbHVlKCkKLQl7Ci0JCXJldHVybiB4bWxHZW5lcmF0ZWRWYWx1ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUjZ2V0R2VuZXJhdG9yIDxlbT5HZW5lcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlI2dldEdlbmVyYXRvcigpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9HZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEdlbmVyYXRlZFZhbHVlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlI2dldFN0cmF0ZWd5IDxlbT5TdHJhdGVneTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0cmF0ZWd5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSNnZXRTdHJhdGVneSgpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciA8ZW0+WG1sIEdlbmVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHhtbEdlbmVyYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sR2VuZXJhdG9yX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciNnZXRBbGxvY2F0aW9uU2l6ZSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBzZWUgI2dldFhtbEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXIgPGVtPlhtbCBHZW5lcmF0b3IgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBHZW5lcmF0b3IgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3JDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbEdlbmVyYXRvckNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyI2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQHNlZSAjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkIDxlbT5YbWwgSWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIElkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbElkKCkKLQl7Ci0JCXJldHVybiB4bWxJZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBzZWUgI2dldFhtbElkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbElkRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzQ29udGFpbmVyIDxlbT5YbWwgSWQgQ2xhc3MgQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBJZCBDbGFzcyBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkQ2xhc3NDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxJZENsYXNzQ29udGFpbmVyKCkKLQl7Ci0JCXJldHVybiB4bWxJZENsYXNzQ29udGFpbmVyRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkQ2xhc3NDb250YWluZXIjZ2V0SWRDbGFzcyA8ZW0+SWQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5JZCBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzc0NvbnRhaW5lciNnZXRJZENsYXNzKCkKLQkgKiBAc2VlICNnZXRYbWxJZENsYXNzQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSWRDbGFzc0NvbnRhaW5lcl9JZENsYXNzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxJZENsYXNzQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlIDxlbT5Jbmhlcml0YW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Jbmhlcml0YW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRJbmhlcml0YW5jZSgpCi0JewotCQlyZXR1cm4gaW5oZXJpdGFuY2VFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlI2dldFN0cmF0ZWd5IDxlbT5TdHJhdGVneTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN0cmF0ZWd5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZSNnZXRTdHJhdGVneSgpCi0JICogQHNlZSAjZ2V0SW5oZXJpdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRJbmhlcml0YW5jZV9TdHJhdGVneSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpaW5oZXJpdGFuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW4gPGVtPlhtbCBKb2luIENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSm9pbiBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxKb2luQ29sdW1uRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkNvbnRhaW5lciA8ZW0+WG1sIEpvaW4gQ29sdW1uIENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgSm9pbiBDb2x1bW4gQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcigpCi0JewotCQlyZXR1cm4geG1sSm9pbkNvbHVtbkNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5Db250YWluZXIjZ2V0Sm9pbkNvbHVtbnMgPGVtPkpvaW4gQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uQ29udGFpbmVyI2dldEpvaW5Db2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxKb2luQ29sdW1uQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcl9Kb2luQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSm9pbkNvbHVtbkNvbnRhaW5lckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUgPGVtPlhtbCBKb2luIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBKb2luIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luVGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zIDxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SW52ZXJzZSBKb2luIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSNnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEpvaW5UYWJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlQ29udGFpbmVyIDxlbT5YbWwgSm9pbiBUYWJsZSBDb250YWluZXI8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEpvaW4gVGFibGUgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxKb2luVGFibGVDb250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbEpvaW5UYWJsZUNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXIjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pblRhYmxlQ29udGFpbmVyI2dldEpvaW5UYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyX0pvaW5UYWJsZSgpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sSm9pblRhYmxlQ29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkxvYiA8ZW0+TG9iPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkxvYjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uTG9iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0TG9iKCkKLQl7Ci0JCXJldHVybiBsb2JFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55IDxlbT5YbWwgTWFueSBUbyBNYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55KCkKLQl7Ci0JCXJldHVybiB4bWxNYW55VG9NYW55RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lIDxlbT5YbWwgTWFueSBUbyBPbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hbnkgVG8gT25lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9PbmUoKQotCXsKLQkJcmV0dXJuIHhtbE1hbnlUb09uZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5NYXAgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRNYXBLZXkoKQotCXsKLQkJcmV0dXJuIG1hcEtleUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0TWFwS2V5X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKW1hcEtleUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nIDxlbT5YbWwgTWFwcGVkIEJ5IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcHBlZCBCeSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRCeU1hcHBpbmcKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRCeU1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHhtbE1hcHBlZEJ5TWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXBwZWQgQnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZEJ5TWFwcGluZyNnZXRNYXBwZWRCeSgpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sTWFwcGVkQnlNYXBwaW5nX01hcHBlZEJ5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRCeU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MgPGVtPlhtbCBNYXBwZWQgU3VwZXJjbGFzczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBzZWUgI2dldFhtbE1hcHBlZFN1cGVyY2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQHNlZSAjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgTmF0aXZlIFF1ZXJ5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOYW1lZCBOYXRpdmUgUXVlcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkKLQl7Ci0JCXJldHVybiB4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5I2dldFJlc3VsdENsYXNzIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkjZ2V0UmVzdWx0Q2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkTmF0aXZlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5X1Jlc3VsdENsYXNzKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkjZ2V0UmVzdWx0U2V0TWFwcGluZyA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcoKQotCSAqIEBzZWUgI2dldFhtbE5hbWVkTmF0aXZlUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5X1Jlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE5hbWVkTmF0aXZlUXVlcnlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkgPGVtPlhtbCBOYW1lZCBRdWVyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTmFtZWQgUXVlcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxOYW1lZFF1ZXJ5KCkKLQl7Ci0JCXJldHVybiB4bWxOYW1lZFF1ZXJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOdWxsQXR0cmlidXRlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueSA8ZW0+WG1sIE9uZSBUbyBNYW55PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9NYW55KCkKLQl7Ci0JCXJldHVybiB4bWxPbmVUb01hbnlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSA8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBPbmU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9PbmUoKQotCXsKLQkJcmV0dXJuIHhtbE9uZVRvT25lRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4gPGVtPlhtbCBPcmRlciBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9yZGVyIENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPcmRlckNvbHVtbigpCi0JewotCQlyZXR1cm4geG1sT3JkZXJDb2x1bW5FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPdmVycmlkZSA8ZW0+WG1sIE92ZXJyaWRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPdmVycmlkZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3ZlcnJpZGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPdmVycmlkZSgpCi0JewotCQlyZXR1cm4geG1sT3ZlcnJpZGVFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3ZlcnJpZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE92ZXJyaWRlI2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbE92ZXJyaWRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3ZlcnJpZGVfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3ZlcnJpZGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWE8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldFNjaGVtYSgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19TY2hlbWEoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5DYXRhbG9nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRDYXRhbG9nKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0NhdGFsb2coKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjaXNDYXNjYWRlUGVyc2lzdCgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXNjYWRlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0VudGl0eUxpc3RlbmVycygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlIDxlbT5BYnN0cmFjdCBYbWwgUmVmZXJlbmNlIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkFic3RyYWN0IFhtbCBSZWZlcmVuY2UgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRBYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlKCkKLQl7Ci0JCXJldHVybiBhYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWZlcmVuY2VUYWJsZSA8ZW0+WG1sIFJlZmVyZW5jZSBUYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUmVmZXJlbmNlIFRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWZlcmVuY2VUYWJsZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFJlZmVyZW5jZVRhYmxlKCkKLQl7Ci0JCXJldHVybiB4bWxSZWZlcmVuY2VUYWJsZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlZmVyZW5jZVRhYmxlI2dldEpvaW5Db2x1bW5zIDxlbT5Kb2luIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVmZXJlbmNlVGFibGUjZ2V0Sm9pbkNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbFJlZmVyZW5jZVRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUmVmZXJlbmNlVGFibGVfSm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFJlZmVyZW5jZVRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9zdCBMb2FkPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvc3RMb2FkKCkKLQl7Ci0JCXJldHVybiBwb3N0TG9hZEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFBvc3RQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBwb3N0UGVyc2lzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvc3QgUmVtb3ZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UmVtb3ZlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UG9zdFJlbW92ZSgpCi0JewotCQlyZXR1cm4gcG9zdFJlbW92ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlBvc3RVcGRhdGUgPGVtPlBvc3QgVXBkYXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0VXBkYXRlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UG9zdFVwZGF0ZSgpCi0JewotCQlyZXR1cm4gcG9zdFVwZGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlByZSBQZXJzaXN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVQZXJzaXN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0UHJlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gcHJlUGVyc2lzdEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVSZW1vdmUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmVSZW1vdmUoKQotCXsKLQkJcmV0dXJuIHByZVJlbW92ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QcmUgVXBkYXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVVcGRhdGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRQcmVVcGRhdGUoKQotCXsKLQkJcmV0dXJuIHByZVVwZGF0ZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uIDxlbT5YbWwgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKLQl7Ci0JCXJldHVybiB4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyIDxlbT5YbWwgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4gQ29udGFpbmVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBDb250YWluZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKQotCXsKLQkJcmV0dXJuIHhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkgPGVtPlhtbCBRdWVyeTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnkoKQotCXsKLQkJcmV0dXJuIHhtbFF1ZXJ5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxRdWVyeV9OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXRRdWVyeSA8ZW0+UXVlcnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5RdWVyeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0UXVlcnkoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlfUXVlcnkoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0SGludHMgPGVtPkhpbnRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5IaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0SGludHMoKQotCSAqIEBzZWUgI2dldFhtbFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUXVlcnlfSGludHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciA8ZW0+WG1sIFF1ZXJ5IENvbnRhaW5lcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5Q29udGFpbmVyKCkKLQl7Ci0JCXJldHVybiB4bWxRdWVyeUNvbnRhaW5lckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lciNnZXROYW1lZFF1ZXJpZXMgPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWROYXRpdmVRdWVyaWVzIDxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkTmF0aXZlUXVlcmllcygpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlDb250YWluZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFF1ZXJ5Q29udGFpbmVyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQgPGVtPlhtbCBRdWVyeSBIaW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBRdWVyeSBIaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxRdWVyeUhpbnQoKQotCXsKLQkJcmV0dXJuIHhtbFF1ZXJ5SGludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlIaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlIaW50X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5SGludEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlIaW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlIaW50X1ZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeUhpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlIDxlbT5YbWwgU2Vjb25kYXJ5IFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKQotCXsKLQkJcmV0dXJuIHhtbFNlY29uZGFyeVRhYmxlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucyA8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQHNlZSAjZ2V0WG1sU2Vjb25kYXJ5VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxTZWNvbmRhcnlUYWJsZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFNlY29uZGFyeVRhYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgU2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IjZ2V0U2VxdWVuY2VOYW1lIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IjZ2V0U2VxdWVuY2VOYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFNlcXVlbmNlR2VuZXJhdG9yX1NlcXVlbmNlTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sU2VxdWVuY2VHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcgPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFNxbFJlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmcjZ2V0RW50aXR5UmVzdWx0cyA8ZW0+RW50aXR5IFJlc3VsdHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVudGl0eSBSZXN1bHRzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldEVudGl0eVJlc3VsdHMoKQotCSAqIEBzZWUgI2dldFNxbFJlc3VsdFNldE1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0VudGl0eVJlc3VsdHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldENvbHVtblJlc3VsdHMgPGVtPkNvbHVtbiBSZXN1bHRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Db2x1bW4gUmVzdWx0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyNnZXRDb2x1bW5SZXN1bHRzKCkKLQkgKiBAc2VlICNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19Db2x1bW5SZXN1bHRzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSlzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZSA8ZW0+WG1sIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxUYWJsZSgpCi0JewotCQlyZXR1cm4geG1sVGFibGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciA8ZW0+WG1sIFRhYmxlIEdlbmVyYXRvcjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVGFibGUgR2VuZXJhdG9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiB4bWxUYWJsZUdlbmVyYXRvckVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRhYmxlR2VuZXJhdG9yX1RhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0Q2F0YWxvZygpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUYWJsZUdlbmVyYXRvcl9DYXRhbG9nKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNjaGVtYTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0U2NoZW1hKCkKLQkgKiBAc2VlICNnZXRYbWxUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFRhYmxlR2VuZXJhdG9yX1NjaGVtYSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5OYW1lIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBrIENvbHVtbiBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRQa0NvbHVtbk5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5OYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRWYWx1ZUNvbHVtbk5hbWUgPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFZhbHVlQ29sdW1uTmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFBrQ29sdW1uVmFsdWUgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5WYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sVGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUYWJsZUdlbmVyYXRvcl9Qa0NvbHVtblZhbHVlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUYWJsZUdlbmVyYXRvckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFVuaXF1ZUNvbnN0cmFpbnRzIDxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBzZWUgI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQgPGVtPlhtbCBUcmFuc2llbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFRyYW5zaWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVHJhbnNpZW50KCkKLQl7Ci0JCXJldHVybiB4bWxUcmFuc2llbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyA8ZW0+WG1sIFR5cGUgTWFwcGluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVHlwZSBNYXBwaW5nPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFR5cGVNYXBwaW5nKCkKLQl7Ci0JCXJldHVybiB4bWxUeXBlTWFwcGluZ0VDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQHNlZSAjZ2V0WG1sVHlwZU1hcHBpbmcoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxUeXBlTWFwcGluZ19NZXRhZGF0YUNvbXBsZXRlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxUeXBlTWFwcGluZ0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbFR5cGVNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sVHlwZU1hcHBpbmdfRGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAc2VlICNnZXRYbWxUeXBlTWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFR5cGVNYXBwaW5nX0F0dHJpYnV0ZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50IDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFVuaXF1ZSBDb25zdHJhaW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpCi0JewotCQlyZXR1cm4geG1sVW5pcXVlQ29uc3RyYWludEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50I2dldENvbHVtbk5hbWVzIDxlbT5Db2x1bW4gTmFtZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAnPGVtPkNvbHVtbiBOYW1lczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludCNnZXRDb2x1bW5OYW1lcygpCi0JICogQHNlZSAjZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfQ29sdW1uTmFtZXMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFVuaXF1ZUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBWZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sVmVyc2lvbigpCi0JewotCQlyZXR1cm4geG1sVmVyc2lvbkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyYWJsZSA8ZW0+WG1sIE9yZGVyYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT3JkZXJhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlcmFibGUKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPcmRlcmFibGUoKQotCXsKLQkJcmV0dXJuIHhtbE9yZGVyYWJsZUVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlcmFibGUjZ2V0T3JkZXJCeSA8ZW0+T3JkZXIgQnk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcmRlciBCeTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJhYmxlI2dldE9yZGVyQnkoKQotCSAqIEBzZWUgI2dldFhtbE9yZGVyYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE9yZGVyYWJsZV9PcmRlckJ5KCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxPcmRlcmFibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZSA8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RGlzY3JpbWluYXRvclR5cGUoKQotCXsKLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlIDxlbT5FbnVtIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FbnVtIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRFbnVtVHlwZSgpCi0JewotCQlyZXR1cm4gZW51bVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlIDxlbT5GZXRjaCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RmV0Y2ggVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRGZXRjaFR5cGUoKQotCXsKLQkJcmV0dXJuIGZldGNoVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZSA8ZW0+R2VuZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+R2VuZXJhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0R2VuZXJhdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIGdlbmVyYXRpb25UeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSA8ZW0+SW5oZXJpdGFuY2UgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPkluaGVyaXRhbmNlIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0SW5oZXJpdGFuY2VUeXBlKCkKLQl7Ci0JCXJldHVybiBpbmhlcml0YW5jZVR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlIDxlbT5UZW1wb3JhbCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VGVtcG9yYWwgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXRUZW1wb3JhbFR5cGUoKQotCXsKLQkJcmV0dXJuIHRlbXBvcmFsVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcm1GYWN0b3J5IGdldE9ybUZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIChPcm1GYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9BVFRSSUJVVEVfTUFQUElORyk7Ci0KLQkJeG1sQmFzZUNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTRV9DT0xVTU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2VDb2x1bW5FQ2xhc3MsIFhNTF9CQVNFX0NPTFVNTl9fSU5TRVJUQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZUNvbHVtbkVDbGFzcywgWE1MX0JBU0VfQ09MVU1OX19OVUxMQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZUNvbHVtbkVDbGFzcywgWE1MX0JBU0VfQ09MVU1OX19UQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZUNvbHVtbkVDbGFzcywgWE1MX0JBU0VfQ09MVU1OX19VTklRVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2VDb2x1bW5FQ2xhc3MsIFhNTF9CQVNFX0NPTFVNTl9fVVBEQVRBQkxFKTsKLQotCQlhYnN0cmFjdFhtbEJhc2VDb2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OKTsKLQotCQlhYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhYnN0cmFjdFhtbEVtYmVkZGVkRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9FTUJFRERFRCk7Ci0KLQkJYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19NQVBfS0VZKTsKLQotCQl4bWxOYW1lZENvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTkFNRURfQ09MVU1OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZENvbHVtbkVDbGFzcywgWE1MX05BTUVEX0NPTFVNTl9fQ09MVU1OX0RFRklOSVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkQ29sdW1uRUNsYXNzLCBYTUxfTkFNRURfQ09MVU1OX19OQU1FKTsKLQotCQl4bWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MsIFhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLCBYTUxfQkFTRV9ESVNDUklNSU5BVE9SX0NPTFVNTl9fTEVOR1RIKTsKLQotCQl4bWxCYXNlSm9pbkNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQkFTRV9KT0lOX0NPTFVNTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzZUpvaW5Db2x1bW5FQ2xhc3MsIFhNTF9CQVNFX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQotCQlhYnN0cmFjdFhtbE5hbWVkQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9OQU1FRF9DT0xVTU4pOwotCi0JCWFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKGFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19UQVJHRVRfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MsIEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0gpOwotCQljcmVhdGVFUmVmZXJlbmNlKGFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQUJTVFJBQ1RfWE1MX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19DQVNDQURFKTsKLQotCQlhYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTCk7Ci0KLQkJYWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFKTsKLQotCQlhYnN0cmFjdFhtbFRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX1hNTF9UQUJMRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoYWJzdHJhY3RYbWxUYWJsZUVDbGFzcywgQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLCBBQlNUUkFDVF9YTUxfVEFCTEVfX0NBVEFMT0cpOwotCQljcmVhdGVFQXR0cmlidXRlKGFic3RyYWN0WG1sVGFibGVFQ2xhc3MsIEFCU1RSQUNUX1hNTF9UQUJMRV9fU0NIRU1BKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLCBBQlNUUkFDVF9YTUxfVEFCTEVfX1VOSVFVRV9DT05TVFJBSU5UUyk7Ci0KLQkJYWJzdHJhY3RYbWxUeXBlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBQlNUUkFDVF9YTUxfVFlQRV9NQVBQSU5HKTsKLQotCQl4bWxBY2Nlc3NIb2xkZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FDQ0VTU19IT0xERVIpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFjY2Vzc0hvbGRlckVDbGFzcywgWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUyk7Ci0KLQkJeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX01BUFBJTkcpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MsIFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckVDbGFzcywgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQotCQl4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX09WRVJSSURFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxBdHRyaWJ1dGVPdmVycmlkZUVDbGFzcywgWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OKTsKLQotCQl4bWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MsIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQotCQlhdHRyaWJ1dGVzRUNsYXNzID0gY3JlYXRlRUNsYXNzKEFUVFJJQlVURVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX0lEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fRU1CRURERURfSURTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19CQVNJQ1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX1ZFUlNJT05TKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShhdHRyaWJ1dGVzRUNsYXNzLCBBVFRSSUJVVEVTX19NQU5ZX1RPX09ORVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX09ORV9UT19NQU5ZUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fT05FX1RPX09ORVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX01BTllfVE9fTUFOWVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKGF0dHJpYnV0ZXNFQ2xhc3MsIEFUVFJJQlVURVNfX0VNQkVEREVEUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoYXR0cmlidXRlc0VDbGFzcywgQVRUUklCVVRFU19fVFJBTlNJRU5UUyk7Ci0KLQkJeG1sQmFzaWNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0JBU0lDKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxCYXNpY0VDbGFzcywgWE1MX0JBU0lDX19GRVRDSCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQmFzaWNFQ2xhc3MsIFhNTF9CQVNJQ19fT1BUSU9OQUwpOwotCi0JCWNhc2NhZGVUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKENBU0NBREVfVFlQRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY2FzY2FkZVR5cGVFQ2xhc3MsIENBU0NBREVfVFlQRV9fQ0FTQ0FERV9BTEwpOwotCQljcmVhdGVFQXR0cmlidXRlKGNhc2NhZGVUeXBlRUNsYXNzLCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY2FzY2FkZVR5cGVFQ2xhc3MsIENBU0NBREVfVFlQRV9fQ0FTQ0FERV9NRVJHRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoY2FzY2FkZVR5cGVFQ2xhc3MsIENBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRU1PVkUpOwotCQljcmVhdGVFQXR0cmlidXRlKGNhc2NhZGVUeXBlRUNsYXNzLCBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSCk7Ci0KLQkJeG1sQ2xhc3NSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NMQVNTX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ2xhc3NSZWZlcmVuY2VFQ2xhc3MsIFhNTF9DTEFTU19SRUZFUkVOQ0VfX0NMQVNTX05BTUUpOwotCi0JCXhtbENvbGxlY3Rpb25UYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQ09MTEVDVElPTl9UQUJMRSk7Ci0KLQkJeG1sQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT0xVTU4pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbHVtbkVDbGFzcywgWE1MX0NPTFVNTl9fTEVOR1RIKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb2x1bW5FQ2xhc3MsIFhNTF9DT0xVTU5fX1BSRUNJU0lPTik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQ29sdW1uRUNsYXNzLCBYTUxfQ09MVU1OX19TQ0FMRSk7Ci0KLQkJY29sdW1uTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDT0xVTU5fTUFQUElORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoY29sdW1uTWFwcGluZ0VDbGFzcywgQ09MVU1OX01BUFBJTkdfX0NPTFVNTik7Ci0KLQkJY29sdW1uUmVzdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENPTFVNTl9SRVNVTFQpOwotCQljcmVhdGVFQXR0cmlidXRlKGNvbHVtblJlc3VsdEVDbGFzcywgQ09MVU1OX1JFU1VMVF9fTkFNRSk7Ci0KLQkJeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MsIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0IpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENvbnZlcnRpYmxlTWFwcGluZ0VDbGFzcywgWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX1RFTVBPUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxDb252ZXJ0aWJsZU1hcHBpbmdFQ2xhc3MsIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEKTsKLQotCQl4bWxEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VMRU1FTlRfQ09MTEVDVElPTik7Ci0KLQkJeG1sRW1iZWRkYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU1CRUREQUJMRSk7Ci0KLQkJeG1sRW1iZWRkZWRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VNQkVEREVEKTsKLQotCQl4bWxFbWJlZGRlZElkRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF9JRCk7Ci0KLQkJeG1sRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fTkFNRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19UQUJMRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19JTkhFUklUQU5DRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlFQ2xhc3MsIFhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eUVDbGFzcywgWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5RUNsYXNzLCBYTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTKTsKLQotCQllbnRpdHlMaXN0ZW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFlfTElTVEVORVIpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eUxpc3RlbmVyRUNsYXNzLCBFTlRJVFlfTElTVEVORVJfX0NMQVNTX05BTUUpOwotCi0JCWVudGl0eUxpc3RlbmVyc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhFTlRJVFlfTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlMaXN0ZW5lcnNFQ2xhc3MsIEVOVElUWV9MSVNURU5FUlNfX0VOVElUWV9MSVNURU5FUlMpOwotCi0JCXhtbEVudGl0eU1hcHBpbmdzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTlRJVFlfTUFQUElOR1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MsIFhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcywgWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUyk7Ci0KLQkJZW50aXR5UmVzdWx0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEVOVElUWV9SRVNVTFQpOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eVJlc3VsdEVDbGFzcywgRU5USVRZX1JFU1VMVF9fRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQljcmVhdGVFQXR0cmlidXRlKGVudGl0eVJlc3VsdEVDbGFzcywgRU5USVRZX1JFU1VMVF9fRU5USVRZX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShlbnRpdHlSZXN1bHRFQ2xhc3MsIEVOVElUWV9SRVNVTFRfX0ZJRUxEX1JFU1VMVFMpOwotCi0JCWV2ZW50TWV0aG9kRUNsYXNzID0gY3JlYXRlRUNsYXNzKEVWRU5UX01FVEhPRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZXZlbnRNZXRob2RFQ2xhc3MsIEVWRU5UX01FVEhPRF9fTUVUSE9EX05BTUUpOwotCi0JCXhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9QRVJTSVNUKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MsIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUkVNT1ZFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfUkVNT1ZFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFdmVudE1ldGhvZENvbnRhaW5lckVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzLCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9VUERBVEUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEV2ZW50TWV0aG9kQ29udGFpbmVyRUNsYXNzLCBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9MT0FEKTsKLQotCQlmaWVsZFJlc3VsdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhGSUVMRF9SRVNVTFQpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkUmVzdWx0RUNsYXNzLCBGSUVMRF9SRVNVTFRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKGZpZWxkUmVzdWx0RUNsYXNzLCBGSUVMRF9SRVNVTFRfX0NPTFVNTik7Ci0KLQkJeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0dFTkVSQVRFRF9WQUxVRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MsIFhNTF9HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MsIFhNTF9HRU5FUkFURURfVkFMVUVfX1NUUkFURUdZKTsKLQotCQl4bWxHZW5lcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdG9yRUNsYXNzLCBYTUxfR0VORVJBVE9SX19OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxHZW5lcmF0b3JFQ2xhc3MsIFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEdlbmVyYXRvckVDbGFzcywgWE1MX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFKTsKLQotCQl4bWxHZW5lcmF0b3JDb250YWluZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0dFTkVSQVRPUl9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEdlbmVyYXRvckNvbnRhaW5lckVDbGFzcywgWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sR2VuZXJhdG9yQ29udGFpbmVyRUNsYXNzLCBYTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SKTsKLQotCQl4bWxJZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbElkRUNsYXNzLCBYTUxfSURfX0dFTkVSQVRFRF9WQUxVRSk7Ci0KLQkJeG1sSWRDbGFzc0NvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSURfQ0xBU1NfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxJZENsYXNzQ29udGFpbmVyRUNsYXNzLCBYTUxfSURfQ0xBU1NfQ09OVEFJTkVSX19JRF9DTEFTUyk7Ci0KLQkJaW5oZXJpdGFuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoSU5IRVJJVEFOQ0UpOwotCQljcmVhdGVFQXR0cmlidXRlKGluaGVyaXRhbmNlRUNsYXNzLCBJTkhFUklUQU5DRV9fU1RSQVRFR1kpOwotCi0JCXhtbEpvaW5Db2x1bW5FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0pPSU5fQ09MVU1OKTsKLQotCQl4bWxKb2luQ29sdW1uQ29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX0NPTFVNTl9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEpvaW5Db2x1bW5Db250YWluZXJFQ2xhc3MsIFhNTF9KT0lOX0NPTFVNTl9DT05UQUlORVJfX0pPSU5fQ09MVU1OUyk7Ci0KLQkJeG1sSm9pblRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX1RBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxKb2luVGFibGVFQ2xhc3MsIFhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyk7Ci0KLQkJeG1sSm9pblRhYmxlQ29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KT0lOX1RBQkxFX0NPTlRBSU5FUik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sSm9pblRhYmxlQ29udGFpbmVyRUNsYXNzLCBYTUxfSk9JTl9UQUJMRV9DT05UQUlORVJfX0pPSU5fVEFCTEUpOwotCi0JCWxvYkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhMT0IpOwotCi0JCXhtbE1hbnlUb01hbnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BTllfVE9fTUFOWSk7Ci0KLQkJeG1sTWFueVRvT25lRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX09ORSk7Ci0KLQkJbWFwS2V5RUNsYXNzID0gY3JlYXRlRUNsYXNzKE1BUF9LRVkpOwotCQljcmVhdGVFQXR0cmlidXRlKG1hcEtleUVDbGFzcywgTUFQX0tFWV9fTkFNRSk7Ci0KLQkJeG1sTWFwcGVkQnlNYXBwaW5nRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQVBQRURfQllfTUFQUElORyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwcGVkQnlNYXBwaW5nRUNsYXNzLCBYTUxfTUFQUEVEX0JZX01BUFBJTkdfX01BUFBFRF9CWSk7Ci0KLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcywgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLCBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMpOwotCi0JCXhtbE5hbWVkTmF0aXZlUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcywgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxOYW1lZE5hdGl2ZVF1ZXJ5RUNsYXNzLCBYTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkcpOwotCi0JCXhtbE5hbWVkUXVlcnlFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX05BTUVEX1FVRVJZKTsKLQotCQl4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElORyk7Ci0KLQkJeG1sT25lVG9NYW55RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PTkVfVE9fTUFOWSk7Ci0KLQkJeG1sT25lVG9PbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX09ORV9UT19PTkUpOwotCi0JCXhtbE9yZGVyYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JERVJBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcmRlcmFibGVFQ2xhc3MsIFhNTF9PUkRFUkFCTEVfX09SREVSX0JZKTsKLQotCQl4bWxPcmRlckNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JERVJfQ09MVU1OKTsKLQotCQl4bWxPdmVycmlkZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1ZFUlJJREUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE92ZXJyaWRlRUNsYXNzLCBYTUxfT1ZFUlJJREVfX05BTUUpOwotCi0JCXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTKTsKLQotCQl4bWxSZWZlcmVuY2VUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUkVGRVJFTkNFX1RBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxSZWZlcmVuY2VUYWJsZUVDbGFzcywgWE1MX1JFRkVSRU5DRV9UQUJMRV9fSk9JTl9DT0xVTU5TKTsKLQotCQlwb3N0TG9hZEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1NUX0xPQUQpOwotCi0JCXBvc3RQZXJzaXN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKFBPU1RfUEVSU0lTVCk7Ci0KLQkJcG9zdFJlbW92ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1NUX1JFTU9WRSk7Ci0KLQkJcG9zdFVwZGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQT1NUX1VQREFURSk7Ci0KLQkJcHJlUGVyc2lzdEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkVfUEVSU0lTVCk7Ci0KLQkJcHJlUmVtb3ZlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFBSRV9SRU1PVkUpOwotCi0JCXByZVVwZGF0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhQUkVfVVBEQVRFKTsKLQotCQl4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCXhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9DT05UQUlORVIpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyRUNsYXNzLCBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fQ09OVEFJTkVSX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCi0JCXhtbFF1ZXJ5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlFQ2xhc3MsIFhNTF9RVUVSWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlFQ2xhc3MsIFhNTF9RVUVSWV9fUVVFUlkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFF1ZXJ5RUNsYXNzLCBYTUxfUVVFUllfX0hJTlRTKTsKLQotCQl4bWxRdWVyeUNvbnRhaW5lckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUVVFUllfQ09OVEFJTkVSKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxRdWVyeUNvbnRhaW5lckVDbGFzcywgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfUVVFUklFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUXVlcnlDb250YWluZXJFQ2xhc3MsIFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX05BVElWRV9RVUVSSUVTKTsKLQotCQl4bWxRdWVyeUhpbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1FVRVJZX0hJTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5SGludEVDbGFzcywgWE1MX1FVRVJZX0hJTlRfX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFF1ZXJ5SGludEVDbGFzcywgWE1MX1FVRVJZX0hJTlRfX1ZBTFVFKTsKLQotCQl4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0VDT05EQVJZX1RBQkxFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcywgWE1MX1NFQ09OREFSWV9UQUJMRV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQotCQl4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzcywgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSk7Ci0KLQkJc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhTUUxfUkVTVUxUX1NFVF9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzLCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzLCBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVFlfUkVTVUxUUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2Uoc3FsUmVzdWx0U2V0TWFwcGluZ0VDbGFzcywgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFMpOwotCi0JCXhtbFRhYmxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9UQUJMRSk7Ci0KLQkJeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1RBQkxFX0dFTkVSQVRPUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MsIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MsIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MsIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUYWJsZUdlbmVyYXRvckVDbGFzcywgWE1MX1RBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFRhYmxlR2VuZXJhdG9yRUNsYXNzLCBYTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFMpOwotCi0JCXhtbFRyYW5zaWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFJBTlNJRU5UKTsKLQotCQl4bWxUeXBlTWFwcGluZ0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfVFlQRV9NQVBQSU5HKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUeXBlTWFwcGluZ0VDbGFzcywgWE1MX1RZUEVfTUFQUElOR19fQ0xBU1NfTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVHlwZU1hcHBpbmdFQ2xhc3MsIFhNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxUeXBlTWFwcGluZ0VDbGFzcywgWE1MX1RZUEVfTUFQUElOR19fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFR5cGVNYXBwaW5nRUNsYXNzLCBYTUxfVFlQRV9NQVBQSU5HX19BVFRSSUJVVEVTKTsKLQotCQl4bWxVbmlxdWVDb25zdHJhaW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9VTklRVUVfQ09OU1RSQUlOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sVW5pcXVlQ29uc3RyYWludEVDbGFzcywgWE1MX1VOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVMpOwotCi0JCXhtbFZlcnNpb25FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1ZFUlNJT04pOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQlkaXNjcmltaW5hdG9yVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRElTQ1JJTUlOQVRPUl9UWVBFKTsKLQkJZW51bVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKEVOVU1fVFlQRSk7Ci0JCWZldGNoVHlwZUVFbnVtID0gY3JlYXRlRUVudW0oRkVUQ0hfVFlQRSk7Ci0JCWdlbmVyYXRpb25UeXBlRUVudW0gPSBjcmVhdGVFRW51bShHRU5FUkFUSU9OX1RZUEUpOwotCQlpbmhlcml0YW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKElOSEVSSVRBTkNFX1RZUEUpOwotCQl0ZW1wb3JhbFR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFRFTVBPUkFMX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCU9ybVYyXzBQYWNrYWdlIHRoZU9ybVYyXzBQYWNrYWdlID0gKE9ybVYyXzBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpOwotCQlYTUxUeXBlUGFja2FnZSB0aGVYTUxUeXBlUGFja2FnZSA9IChYTUxUeXBlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShYTUxUeXBlUGFja2FnZS5lTlNfVVJJKTsKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBBZGQgc3VicGFja2FnZXMKLQkJZ2V0RVN1YnBhY2thZ2VzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQlhYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxCYXNlQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb2x1bW4oKSk7Ci0JCWFic3RyYWN0WG1sQmFzZUNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKSk7Ci0JCWFic3RyYWN0WG1sQmFzZUNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEJhc2VDb2x1bW4oKSk7Ci0JCWFic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkpOwotCQlhYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWFic3RyYWN0WG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCWFic3RyYWN0WG1sRW1iZWRkZWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpKTsKLQkJYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCWFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCkpOwotCQlhYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcigpKTsKLQkJYWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxPcmRlcmFibGUoKSk7Ci0JCWFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKSk7Ci0JCXhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb2x1bW4oKSk7Ci0JCXhtbEJhc2VKb2luQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTmFtZWRDb2x1bW4oKSk7Ci0JCWFic3RyYWN0WG1sTmFtZWRDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxOYW1lZENvbHVtbigpKTsKLQkJYWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQlhYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCWFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcigpKTsKLQkJYWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcigpKTsKLQkJYWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wKCkpOwotCQlhYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUYWJsZSgpKTsKLQkJYWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFJlZmVyZW5jZVRhYmxlKCkpOwotCQlhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sVHlwZU1hcHBpbmcoKSk7Ci0JCXhtbEF0dHJpYnV0ZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxPdmVycmlkZSgpKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5Db2x1bW5Db250YWluZXIoKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAoKSk7Ci0JCXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sT3ZlcnJpZGUoKSk7Ci0JCXhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCgpKTsKLQkJYXR0cmlidXRlc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxBdHRyaWJ1dGVzXzJfMCgpKTsKLQkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbEJhc2ljRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29sdW1uTWFwcGluZygpKTsKLQkJeG1sQmFzaWNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCWNhc2NhZGVUeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbENhc2NhZGVUeXBlXzJfMCgpKTsKLQkJeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxSZWZlcmVuY2VUYWJsZSgpKTsKLQkJeG1sQ29sbGVjdGlvblRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbENvbGxlY3Rpb25UYWJsZV8yXzAoKSk7Ci0JCXhtbENvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQmFzZUNvbHVtbigpKTsKLQkJeG1sRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKSk7Ci0JCXhtbEVtYmVkZGFibGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkpOwotCQl4bWxFbWJlZGRlZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sRW1iZWRkZWQoKSk7Ci0JCXhtbEVtYmVkZGVkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEVtYmVkZGVkXzJfMCgpKTsKLQkJeG1sRW1iZWRkZWRJZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sRW1iZWRkZWQoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sVHlwZU1hcHBpbmcoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyKCkpOwotCQl4bWxFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpKTsKLQkJeG1sRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEVudGl0eV8yXzAoKSk7Ci0JCXhtbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbElkQ2xhc3NDb250YWluZXIoKSk7Ci0JCWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKSk7Ci0JCWVudGl0eUxpc3RlbmVyRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbEVudGl0eUxpc3RlbmVyXzJfMCgpKTsKLQkJeG1sRW50aXR5TWFwcGluZ3NFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlQ29tbW9uUGFja2FnZS5nZXRBYnN0cmFjdEpwYVJvb3RFT2JqZWN0KCkpOwotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFF1ZXJ5Q29udGFpbmVyKCkpOwotCQl4bWxFbnRpdHlNYXBwaW5nc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFjY2Vzc0hvbGRlcigpKTsKLQkJZXZlbnRNZXRob2RFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sRXZlbnRNZXRob2RfMl8wKCkpOwotCQl4bWxHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sR2VuZXJhdG9yXzJfMCgpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q29sdW1uTWFwcGluZygpKTsKLQkJeG1sSWRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbElkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkpOwotCQl4bWxKb2luQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxCYXNlQ29sdW1uKCkpOwotCQl4bWxKb2luQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQmFzZUpvaW5Db2x1bW4oKSk7Ci0JCXhtbEpvaW5UYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGUoKSk7Ci0JCXhtbE1hbnlUb01hbnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJeG1sTWFueVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxNYW55VG9NYW55XzJfMCgpKTsKLQkJeG1sTWFueVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkpOwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUeXBlTWFwcGluZygpKTsKLQkJeG1sTWFwcGVkU3VwZXJjbGFzc0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbElkQ2xhc3NDb250YWluZXIoKSk7Ci0JCXhtbE5hbWVkTmF0aXZlUXVlcnlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxRdWVyeSgpKTsKLQkJeG1sTmFtZWRRdWVyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFF1ZXJ5KCkpOwotCQl4bWxOYW1lZFF1ZXJ5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbE5hbWVkUXVlcnlfMl8wKCkpOwotCQl4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sT25lVG9NYW55RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcoKSk7Ci0JCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEpvaW5Db2x1bW5Db250YWluZXIoKSk7Ci0JCXhtbE9uZVRvTWFueUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxPbmVUb01hbnlfMl8wKCkpOwotCQl4bWxPbmVUb09uZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZygpKTsKLQkJeG1sT25lVG9PbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNYXBwZWRCeU1hcHBpbmcoKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKSk7Ci0JCXhtbE9uZVRvT25lRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbE9uZVRvT25lXzJfMCgpKTsKLQkJeG1sT3JkZXJhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVYyXzBQYWNrYWdlLmdldFhtbE9yZGVyYWJsZV8yXzAoKSk7Ci0JCXhtbE9yZGVyQ29sdW1uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxOYW1lZENvbHVtbigpKTsKLQkJeG1sT3JkZXJDb2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEFjY2Vzc0hvbGRlcigpKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wKCkpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAoKSk7Ci0JCXBvc3RMb2FkRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7Ci0JCXBvc3RQZXJzaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7Ci0JCXBvc3RSZW1vdmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFdmVudE1ldGhvZCgpKTsKLQkJcG9zdFVwZGF0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV2ZW50TWV0aG9kKCkpOwotCQlwcmVQZXJzaXN0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RXZlbnRNZXRob2QoKSk7Ci0JCXByZVJlbW92ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEV2ZW50TWV0aG9kKCkpOwotCQlwcmVVcGRhdGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRFdmVudE1ldGhvZCgpKTsKLQkJeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbE5hbWVkQ29sdW1uKCkpOwotCQl4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbEJhc2VKb2luQ29sdW1uKCkpOwotCQl4bWxRdWVyeUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxRdWVyeV8yXzAoKSk7Ci0JCXhtbFF1ZXJ5SGludEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxRdWVyeUhpbnRfMl8wKCkpOwotCQl4bWxTZWNvbmRhcnlUYWJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sVGFibGUoKSk7Ci0JCXhtbFNlcXVlbmNlR2VuZXJhdG9yRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sR2VuZXJhdG9yKCkpOwotCQl4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1WMl8wUGFja2FnZS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAoKSk7Ci0JCXNxbFJlc3VsdFNldE1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAoKSk7Ci0JCXhtbFRhYmxlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QWJzdHJhY3RYbWxUYWJsZSgpKTsKLQkJeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxHZW5lcmF0b3IoKSk7Ci0JCXhtbFRyYW5zaWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpKTsKLQkJeG1sVHlwZU1hcHBpbmdFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxBY2Nlc3NIb2xkZXIoKSk7Ci0JCXhtbFVuaXF1ZUNvbnN0cmFpbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtVjJfMFBhY2thZ2UuZ2V0WG1sVW5pcXVlQ29uc3RyYWludF8yXzAoKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcoKSk7Ci0JCXhtbFZlcnNpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDb2x1bW5NYXBwaW5nKCkpOwotCQl4bWxWZXJzaW9uRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nKCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nRUNsYXNzLCBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MsICJBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2VDb2x1bW5FQ2xhc3MsIFhtbEJhc2VDb2x1bW4uY2xhc3MsICJYbWxCYXNlQ29sdW1uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzZUNvbHVtbl9JbnNlcnRhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImluc2VydGFibGUiLCBudWxsLCAwLCAxLCBYbWxCYXNlQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNlQ29sdW1uX051bGxhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgIm51bGxhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQmFzZUNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzZUNvbHVtbl9UYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQmFzZUNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzZUNvbHVtbl9VbmlxdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAidW5pcXVlIiwgbnVsbCwgMCwgMSwgWG1sQmFzZUNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzZUNvbHVtbl9VcGRhdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAidXBkYXRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sQmFzZUNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sQmFzZUNvbHVtbkVDbGFzcywgQWJzdHJhY3RYbWxCYXNlQ29sdW1uLmNsYXNzLCAiQWJzdHJhY3RYbWxCYXNlQ29sdW1uIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhhYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uRUNsYXNzLCBBYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uLmNsYXNzLCAiQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxFbWJlZGRlZEVDbGFzcywgQWJzdHJhY3RYbWxFbWJlZGRlZC5jbGFzcywgIkFic3RyYWN0WG1sRW1iZWRkZWQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nRUNsYXNzLCBBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nX01hcEtleSgpLCB0aGlzLmdldE1hcEtleSgpLCBudWxsLCAibWFwS2V5IiwgbnVsbCwgMCwgMSwgQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxOYW1lZENvbHVtbkVDbGFzcywgWG1sTmFtZWRDb2x1bW4uY2xhc3MsICJYbWxOYW1lZENvbHVtbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjb2x1bW5EZWZpbml0aW9uIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkQ29sdW1uX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRDb2x1bW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbkVDbGFzcywgWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4uY2xhc3MsICJYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uX0Rpc2NyaW1pbmF0b3JUeXBlKCksIHRoaXMuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSwgImRpc2NyaW1pbmF0b3JUeXBlIiwgIlNUUklORyIsIDAsIDEsIFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbl9MZW5ndGgoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJsZW5ndGgiLCBudWxsLCAwLCAxLCBYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEJhc2VKb2luQ29sdW1uRUNsYXNzLCBYbWxCYXNlSm9pbkNvbHVtbi5jbGFzcywgIlhtbEJhc2VKb2luQ29sdW1uIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQmFzZUpvaW5Db2x1bW5fUmVmZXJlbmNlZENvbHVtbk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZWZlcmVuY2VkQ29sdW1uTmFtZSIsIG51bGwsIDAsIDEsIFhtbEJhc2VKb2luQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RYbWxOYW1lZENvbHVtbkVDbGFzcywgQWJzdHJhY3RYbWxOYW1lZENvbHVtbi5jbGFzcywgIkFic3RyYWN0WG1sTmFtZWRDb2x1bW4iLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAiQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19UYXJnZXRFbnRpdHkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ0YXJnZXRFbnRpdHkiLCBudWxsLCAwLCAxLCBBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZ19GZXRjaCgpLCB0aGlzLmdldEZldGNoVHlwZSgpLCAiZmV0Y2giLCAiTEFaWSIsIDAsIDEsIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKSwgdGhpcy5nZXRDYXNjYWRlVHlwZSgpLCBudWxsLCAiY2FzY2FkZSIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ0VDbGFzcywgQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLCAiQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ19PcHRpb25hbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJvcHRpb25hbCIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGVFQ2xhc3MsIEFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGUuY2xhc3MsICJBYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlIiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhhYnN0cmFjdFhtbFRhYmxlRUNsYXNzLCBBYnN0cmFjdFhtbFRhYmxlLmNsYXNzLCAiQWJzdHJhY3RYbWxUYWJsZSIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRBYnN0cmFjdFhtbFRhYmxlX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQWJzdHJhY3RYbWxUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0QWJzdHJhY3RYbWxUYWJsZV9DYXRhbG9nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2F0YWxvZyIsIG51bGwsIDAsIDEsIEFic3RyYWN0WG1sVGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEFic3RyYWN0WG1sVGFibGVfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgQWJzdHJhY3RYbWxUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QWJzdHJhY3RYbWxUYWJsZV9VbmlxdWVDb25zdHJhaW50cygpLCB0aGlzLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnQoKSwgbnVsbCwgInVuaXF1ZUNvbnN0cmFpbnRzIiwgbnVsbCwgMCwgLTEsIEFic3RyYWN0WG1sVGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhhYnN0cmFjdFhtbFR5cGVNYXBwaW5nRUNsYXNzLCBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAiQWJzdHJhY3RYbWxUeXBlTWFwcGluZyIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQWNjZXNzSG9sZGVyRUNsYXNzLCBYbWxBY2Nlc3NIb2xkZXIuY2xhc3MsICJYbWxBY2Nlc3NIb2xkZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiYWNjZXNzIiwgbnVsbCwgMCwgMSwgWG1sQWNjZXNzSG9sZGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXR0cmlidXRlTWFwcGluZ0VDbGFzcywgWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcywgIlhtbEF0dHJpYnV0ZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sQXR0cmlidXRlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVFQ2xhc3MsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3MsICJYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckVDbGFzcywgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcywgIlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCksIHRoaXMuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpLCBudWxsLCAiYXNzb2NpYXRpb25PdmVycmlkZXMiLCBudWxsLCAwLCAtMSwgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZU92ZXJyaWRlRUNsYXNzLCBYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgIlhtbEF0dHJpYnV0ZU92ZXJyaWRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKSwgdGhpcy5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgImNvbHVtbiIsIG51bGwsIDEsIDEsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJFQ2xhc3MsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzLCAiWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKSwgdGhpcy5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpLCBudWxsLCAiYXR0cmlidXRlT3ZlcnJpZGVzIiwgbnVsbCwgMCwgLTEsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoYXR0cmlidXRlc0VDbGFzcywgQXR0cmlidXRlcy5jbGFzcywgIkF0dHJpYnV0ZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfSWRzKCksIHRoaXMuZ2V0WG1sSWQoKSwgbnVsbCwgImlkcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX0VtYmVkZGVkSWRzKCksIHRoaXMuZ2V0WG1sRW1iZWRkZWRJZCgpLCBudWxsLCAiZW1iZWRkZWRJZHMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19CYXNpY3MoKSwgdGhpcy5nZXRYbWxCYXNpYygpLCBudWxsLCAiYmFzaWNzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfVmVyc2lvbnMoKSwgdGhpcy5nZXRYbWxWZXJzaW9uKCksIG51bGwsICJ2ZXJzaW9ucyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX01hbnlUb09uZXMoKSwgdGhpcy5nZXRYbWxNYW55VG9PbmUoKSwgbnVsbCwgIm1hbnlUb09uZXMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19PbmVUb01hbnlzKCksIHRoaXMuZ2V0WG1sT25lVG9NYW55KCksIG51bGwsICJvbmVUb01hbnlzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfT25lVG9PbmVzKCksIHRoaXMuZ2V0WG1sT25lVG9PbmUoKSwgbnVsbCwgIm9uZVRvT25lcyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRBdHRyaWJ1dGVzX01hbnlUb01hbnlzKCksIHRoaXMuZ2V0WG1sTWFueVRvTWFueSgpLCBudWxsLCAibWFueVRvTWFueXMiLCBudWxsLCAwLCAtMSwgQXR0cmlidXRlcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKSwgdGhpcy5nZXRYbWxFbWJlZGRlZCgpLCBudWxsLCAiZW1iZWRkZWRzIiwgbnVsbCwgMCwgLTEsIEF0dHJpYnV0ZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEF0dHJpYnV0ZXNfVHJhbnNpZW50cygpLCB0aGlzLmdldFhtbFRyYW5zaWVudCgpLCBudWxsLCAidHJhbnNpZW50cyIsIG51bGwsIDAsIC0xLCBBdHRyaWJ1dGVzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQmFzaWNFQ2xhc3MsIFhtbEJhc2ljLmNsYXNzLCAiWG1sQmFzaWMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljX0ZldGNoKCksIHRoaXMuZ2V0RmV0Y2hUeXBlKCksICJmZXRjaCIsICJMQVpZIiwgMCwgMSwgWG1sQmFzaWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEJhc2ljX09wdGlvbmFsKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgIm9wdGlvbmFsIiwgbnVsbCwgMCwgMSwgWG1sQmFzaWMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjYXNjYWRlVHlwZUVDbGFzcywgQ2FzY2FkZVR5cGUuY2xhc3MsICJDYXNjYWRlVHlwZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZUFsbCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJjYXNjYWRlQWxsIiwgbnVsbCwgMCwgMSwgQ2FzY2FkZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENhc2NhZGVUeXBlX0Nhc2NhZGVQZXJzaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVQZXJzaXN0IiwgbnVsbCwgMCwgMSwgQ2FzY2FkZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENhc2NhZGVUeXBlX0Nhc2NhZGVNZXJnZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJjYXNjYWRlTWVyZ2UiLCBudWxsLCAwLCAxLCBDYXNjYWRlVHlwZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlbW92ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJjYXNjYWRlUmVtb3ZlIiwgbnVsbCwgMCwgMSwgQ2FzY2FkZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldENhc2NhZGVUeXBlX0Nhc2NhZGVSZWZyZXNoKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVSZWZyZXNoIiwgbnVsbCwgMCwgMSwgQ2FzY2FkZVR5cGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDbGFzc1JlZmVyZW5jZUVDbGFzcywgWG1sQ2xhc3NSZWZlcmVuY2UuY2xhc3MsICJYbWxDbGFzc1JlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ2xhc3NSZWZlcmVuY2VfQ2xhc3NOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2xhc3NOYW1lIiwgbnVsbCwgMSwgMSwgWG1sQ2xhc3NSZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxDb2xsZWN0aW9uVGFibGVFQ2xhc3MsIFhtbENvbGxlY3Rpb25UYWJsZS5jbGFzcywgIlhtbENvbGxlY3Rpb25UYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbENvbHVtbkVDbGFzcywgWG1sQ29sdW1uLmNsYXNzLCAiWG1sQ29sdW1uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fTGVuZ3RoKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAibGVuZ3RoIiwgbnVsbCwgMCwgMSwgWG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEludE9iamVjdCgpLCAicHJlY2lzaW9uIiwgbnVsbCwgMCwgMSwgWG1sQ29sdW1uLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb2x1bW5fU2NhbGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJzY2FsZSIsIG51bGwsIDAsIDEsIFhtbENvbHVtbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGNvbHVtbk1hcHBpbmdFQ2xhc3MsIENvbHVtbk1hcHBpbmcuY2xhc3MsICJDb2x1bW5NYXBwaW5nIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSwgdGhpcy5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgImNvbHVtbiIsIG51bGwsIDAsIDEsIENvbHVtbk1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhjb2x1bW5SZXN1bHRFQ2xhc3MsIENvbHVtblJlc3VsdC5jbGFzcywgIkNvbHVtblJlc3VsdCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q29sdW1uUmVzdWx0X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgQ29sdW1uUmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29udmVydGlibGVNYXBwaW5nRUNsYXNzLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MsICJYbWxDb252ZXJ0aWJsZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImxvYiIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCksIHRoaXMuZ2V0VGVtcG9yYWxUeXBlKCksICJ0ZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKSwgdGhpcy5nZXRFbnVtVHlwZSgpLCAiZW51bWVyYXRlZCIsIG51bGwsIDAsIDEsIFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbERpc2NyaW1pbmF0b3JDb2x1bW5FQ2xhc3MsIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4uY2xhc3MsICJYbWxEaXNjcmltaW5hdG9yQ29sdW1uIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRWxlbWVudENvbGxlY3Rpb25FQ2xhc3MsIFhtbEVsZW1lbnRDb2xsZWN0aW9uLmNsYXNzLCAiWG1sRWxlbWVudENvbGxlY3Rpb24iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRhYmxlRUNsYXNzLCBYbWxFbWJlZGRhYmxlLmNsYXNzLCAiWG1sRW1iZWRkYWJsZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbEVtYmVkZGVkRUNsYXNzLCBYbWxFbWJlZGRlZC5jbGFzcywgIlhtbEVtYmVkZGVkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRW1iZWRkZWRJZEVDbGFzcywgWG1sRW1iZWRkZWRJZC5jbGFzcywgIlhtbEVtYmVkZGVkSWQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlFQ2xhc3MsIFhtbEVudGl0eS5jbGFzcywgIlhtbEVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRW50aXR5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfVGFibGUoKSwgdGhpcy5nZXRYbWxUYWJsZSgpLCBudWxsLCAidGFibGUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKSwgdGhpcy5nZXRYbWxTZWNvbmRhcnlUYWJsZSgpLCBudWxsLCAic2Vjb25kYXJ5VGFibGVzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpLCB0aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCksIG51bGwsICJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKSwgdGhpcy5nZXRJbmhlcml0YW5jZSgpLCBudWxsLCAiaW5oZXJpdGFuY2UiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkaXNjcmltaW5hdG9yVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yQ29sdW1uKCksIHRoaXMuZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbigpLCBudWxsLCAiZGlzY3JpbWluYXRvckNvbHVtbiIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X1NxbFJlc3VsdFNldE1hcHBpbmdzKCksIHRoaXMuZ2V0U3FsUmVzdWx0U2V0TWFwcGluZygpLCBudWxsLCAic3FsUmVzdWx0U2V0TWFwcGluZ3MiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxFbnRpdHkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eV9FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5X0VudGl0eUxpc3RlbmVycygpLCB0aGlzLmdldEVudGl0eUxpc3RlbmVycygpLCBudWxsLCAiZW50aXR5TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZW50aXR5TGlzdGVuZXJFQ2xhc3MsIEVudGl0eUxpc3RlbmVyLmNsYXNzLCAiRW50aXR5TGlzdGVuZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eUxpc3RlbmVyX0NsYXNzTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNsYXNzTmFtZSIsIG51bGwsIDEsIDEsIEVudGl0eUxpc3RlbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZW50aXR5TGlzdGVuZXJzRUNsYXNzLCBFbnRpdHlMaXN0ZW5lcnMuY2xhc3MsICJFbnRpdHlMaXN0ZW5lcnMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldEVudGl0eUxpc3RlbmVyc19FbnRpdHlMaXN0ZW5lcnMoKSwgdGhpcy5nZXRFbnRpdHlMaXN0ZW5lcigpLCBudWxsLCAiZW50aXR5TGlzdGVuZXJzIiwgbnVsbCwgMCwgLTEsIEVudGl0eUxpc3RlbmVycy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVudGl0eU1hcHBpbmdzRUNsYXNzLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIlhtbEVudGl0eU1hcHBpbmdzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlNYXBwaW5nc19EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCksIHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSwgbnVsbCwgInBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eU1hcHBpbmdzX1BhY2thZ2UoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJwYWNrYWdlIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eU1hcHBpbmdzX1NjaGVtYSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInNjaGVtYSIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFbnRpdHlNYXBwaW5nc19DYXRhbG9nKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY2F0YWxvZyIsIG51bGwsIDAsIDEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19TZXF1ZW5jZUdlbmVyYXRvcnMoKSwgdGhpcy5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpLCBudWxsLCAic2VxdWVuY2VHZW5lcmF0b3JzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19UYWJsZUdlbmVyYXRvcnMoKSwgdGhpcy5nZXRYbWxUYWJsZUdlbmVyYXRvcigpLCBudWxsLCAidGFibGVHZW5lcmF0b3JzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19TcWxSZXN1bHRTZXRNYXBwaW5ncygpLCB0aGlzLmdldFNxbFJlc3VsdFNldE1hcHBpbmcoKSwgbnVsbCwgInNxbFJlc3VsdFNldE1hcHBpbmdzIiwgbnVsbCwgMCwgLTEsIFhtbEVudGl0eU1hcHBpbmdzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbnRpdHlNYXBwaW5nc19NYXBwZWRTdXBlcmNsYXNzZXMoKSwgdGhpcy5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCksIG51bGwsICJtYXBwZWRTdXBlcmNsYXNzZXMiLCBudWxsLCAwLCAtMSwgWG1sRW50aXR5TWFwcGluZ3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCksIHRoaXMuZ2V0WG1sRW50aXR5KCksIG51bGwsICJlbnRpdGllcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRW50aXR5TWFwcGluZ3NfRW1iZWRkYWJsZXMoKSwgdGhpcy5nZXRYbWxFbWJlZGRhYmxlKCksIG51bGwsICJlbWJlZGRhYmxlcyIsIG51bGwsIDAsIC0xLCBYbWxFbnRpdHlNYXBwaW5ncy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKGVudGl0eVJlc3VsdEVDbGFzcywgRW50aXR5UmVzdWx0LmNsYXNzLCAiRW50aXR5UmVzdWx0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFbnRpdHlSZXN1bHRfRGlzY3JpbWluYXRvckNvbHVtbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRpc2NyaW1pbmF0b3JDb2x1bW4iLCBudWxsLCAwLCAxLCBFbnRpdHlSZXN1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEVudGl0eVJlc3VsdF9FbnRpdHlDbGFzcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImVudGl0eUNsYXNzIiwgbnVsbCwgMSwgMSwgRW50aXR5UmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRFbnRpdHlSZXN1bHRfRmllbGRSZXN1bHRzKCksIHRoaXMuZ2V0RmllbGRSZXN1bHQoKSwgbnVsbCwgImZpZWxkUmVzdWx0cyIsIG51bGwsIDAsIC0xLCBFbnRpdHlSZXN1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhldmVudE1ldGhvZEVDbGFzcywgRXZlbnRNZXRob2QuY2xhc3MsICJFdmVudE1ldGhvZCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRFdmVudE1ldGhvZF9NZXRob2ROYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibWV0aG9kTmFtZSIsIG51bGwsIDEsIDEsIEV2ZW50TWV0aG9kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRXZlbnRNZXRob2RDb250YWluZXJFQ2xhc3MsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAiWG1sRXZlbnRNZXRob2RDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVQZXJzaXN0KCksIHRoaXMuZ2V0UHJlUGVyc2lzdCgpLCBudWxsLCAicHJlUGVyc2lzdCIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0UGVyc2lzdCgpLCB0aGlzLmdldFBvc3RQZXJzaXN0KCksIG51bGwsICJwb3N0UGVyc2lzdCIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVSZW1vdmUoKSwgdGhpcy5nZXRQcmVSZW1vdmUoKSwgbnVsbCwgInByZVJlbW92ZSIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0UmVtb3ZlKCksIHRoaXMuZ2V0UG9zdFJlbW92ZSgpLCBudWxsLCAicG9zdFJlbW92ZSIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVVcGRhdGUoKSwgdGhpcy5nZXRQcmVVcGRhdGUoKSwgbnVsbCwgInByZVVwZGF0ZSIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0VXBkYXRlKCksIHRoaXMuZ2V0UG9zdFVwZGF0ZSgpLCBudWxsLCAicG9zdFVwZGF0ZSIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0TG9hZCgpLCB0aGlzLmdldFBvc3RMb2FkKCksIG51bGwsICJwb3N0TG9hZCIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoZmllbGRSZXN1bHRFQ2xhc3MsIEZpZWxkUmVzdWx0LmNsYXNzLCAiRmllbGRSZXN1bHQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkUmVzdWx0X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgRmllbGRSZXN1bHQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldEZpZWxkUmVzdWx0X0NvbHVtbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNvbHVtbiIsIG51bGwsIDEsIDEsIEZpZWxkUmVzdWx0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sR2VuZXJhdGVkVmFsdWVFQ2xhc3MsIFhtbEdlbmVyYXRlZFZhbHVlLmNsYXNzLCAiWG1sR2VuZXJhdGVkVmFsdWUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRlZFZhbHVlX0dlbmVyYXRvcigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImdlbmVyYXRvciIsIG51bGwsIDAsIDEsIFhtbEdlbmVyYXRlZFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpLCB0aGlzLmdldEdlbmVyYXRpb25UeXBlKCksICJzdHJhdGVneSIsICJUQUJMRSIsIDAsIDEsIFhtbEdlbmVyYXRlZFZhbHVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sR2VuZXJhdG9yRUNsYXNzLCBYbWxHZW5lcmF0b3IuY2xhc3MsICJYbWxHZW5lcmF0b3IiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxHZW5lcmF0b3JfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0SW50T2JqZWN0KCksICJpbml0aWFsVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRJbnRPYmplY3QoKSwgImFsbG9jYXRpb25TaXplIiwgbnVsbCwgMCwgMSwgWG1sR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sR2VuZXJhdG9yQ29udGFpbmVyRUNsYXNzLCBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MsICJYbWxHZW5lcmF0b3JDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKSwgdGhpcy5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpLCBudWxsLCAic2VxdWVuY2VHZW5lcmF0b3IiLCBudWxsLCAwLCAxLCBYbWxHZW5lcmF0b3JDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpLCB0aGlzLmdldFhtbFRhYmxlR2VuZXJhdG9yKCksIG51bGwsICJ0YWJsZUdlbmVyYXRvciIsIG51bGwsIDAsIDEsIFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbElkRUNsYXNzLCBYbWxJZC5jbGFzcywgIlhtbElkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxJZF9HZW5lcmF0ZWRWYWx1ZSgpLCB0aGlzLmdldFhtbEdlbmVyYXRlZFZhbHVlKCksIG51bGwsICJnZW5lcmF0ZWRWYWx1ZSIsIG51bGwsIDAsIDEsIFhtbElkLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSWRDbGFzc0NvbnRhaW5lckVDbGFzcywgWG1sSWRDbGFzc0NvbnRhaW5lci5jbGFzcywgIlhtbElkQ2xhc3NDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxJZENsYXNzQ29udGFpbmVyX0lkQ2xhc3MoKSwgdGhpcy5nZXRYbWxDbGFzc1JlZmVyZW5jZSgpLCBudWxsLCAiaWRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbElkQ2xhc3NDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhpbmhlcml0YW5jZUVDbGFzcywgSW5oZXJpdGFuY2UuY2xhc3MsICJJbmhlcml0YW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SW5oZXJpdGFuY2VfU3RyYXRlZ3koKSwgdGhpcy5nZXRJbmhlcml0YW5jZVR5cGUoKSwgInN0cmF0ZWd5IiwgIlNJTkdMRV9UQUJMRSIsIDAsIDEsIEluaGVyaXRhbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSm9pbkNvbHVtbkVDbGFzcywgWG1sSm9pbkNvbHVtbi5jbGFzcywgIlhtbEpvaW5Db2x1bW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxKb2luQ29sdW1uQ29udGFpbmVyRUNsYXNzLCBYbWxKb2luQ29sdW1uQ29udGFpbmVyLmNsYXNzLCAiWG1sSm9pbkNvbHVtbkNvbnRhaW5lciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEpvaW5Db2x1bW5Db250YWluZXJfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxKb2luQ29sdW1uQ29udGFpbmVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlRUNsYXNzLCBYbWxKb2luVGFibGUuY2xhc3MsICJYbWxKb2luVGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJpbnZlcnNlSm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sSm9pblRhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSm9pblRhYmxlQ29udGFpbmVyRUNsYXNzLCBYbWxKb2luVGFibGVDb250YWluZXIuY2xhc3MsICJYbWxKb2luVGFibGVDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxKb2luVGFibGVDb250YWluZXJfSm9pblRhYmxlKCksIHRoaXMuZ2V0WG1sSm9pblRhYmxlKCksIG51bGwsICJqb2luVGFibGUiLCBudWxsLCAwLCAxLCBYbWxKb2luVGFibGVDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhsb2JFQ2xhc3MsIExvYi5jbGFzcywgIkxvYiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlFQ2xhc3MsIFhtbE1hbnlUb01hbnkuY2xhc3MsICJYbWxNYW55VG9NYW55IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFueVRvT25lRUNsYXNzLCBYbWxNYW55VG9PbmUuY2xhc3MsICJYbWxNYW55VG9PbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhtYXBLZXlFQ2xhc3MsIE1hcEtleS5jbGFzcywgIk1hcEtleSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0TWFwS2V5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgTWFwS2V5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwcGVkQnlNYXBwaW5nRUNsYXNzLCBYbWxNYXBwZWRCeU1hcHBpbmcuY2xhc3MsICJYbWxNYXBwZWRCeU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRCeU1hcHBpbmdfTWFwcGVkQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBwZWRCeSIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZEJ5TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHBlZFN1cGVyY2xhc3NFQ2xhc3MsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICJYbWxNYXBwZWRTdXBlcmNsYXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyIsIG51bGwsIDAsIDEsIFhtbE1hcHBlZFN1cGVyY2xhc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRW50aXR5TGlzdGVuZXJzKCksIHRoaXMuZ2V0RW50aXR5TGlzdGVuZXJzKCksIG51bGwsICJlbnRpdHlMaXN0ZW5lcnMiLCBudWxsLCAwLCAxLCBYbWxNYXBwZWRTdXBlcmNsYXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWROYXRpdmVRdWVyeUVDbGFzcywgWG1sTmFtZWROYXRpdmVRdWVyeS5jbGFzcywgIlhtbE5hbWVkTmF0aXZlUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJyZXN1bHRDbGFzcyIsIG51bGwsIDAsIDEsIFhtbE5hbWVkTmF0aXZlUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInJlc3VsdFNldE1hcHBpbmciLCBudWxsLCAwLCAxLCBYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWRRdWVyeUVDbGFzcywgWG1sTmFtZWRRdWVyeS5jbGFzcywgIlhtbE5hbWVkUXVlcnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxOdWxsQXR0cmlidXRlTWFwcGluZ0VDbGFzcywgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcuY2xhc3MsICJYbWxOdWxsQXR0cmlidXRlTWFwcGluZyIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sT25lVG9NYW55RUNsYXNzLCBYbWxPbmVUb01hbnkuY2xhc3MsICJYbWxPbmVUb01hbnkiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb09uZUVDbGFzcywgWG1sT25lVG9PbmUuY2xhc3MsICJYbWxPbmVUb09uZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE9yZGVyYWJsZUVDbGFzcywgWG1sT3JkZXJhYmxlLmNsYXNzLCAiWG1sT3JkZXJhYmxlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sT3JkZXJhYmxlX09yZGVyQnkoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJvcmRlckJ5IiwgbnVsbCwgMCwgMSwgWG1sT3JkZXJhYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT3JkZXJDb2x1bW5FQ2xhc3MsIFhtbE9yZGVyQ29sdW1uLmNsYXNzLCAiWG1sT3JkZXJDb2x1bW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPdmVycmlkZUVDbGFzcywgWG1sT3ZlcnJpZGUuY2xhc3MsICJYbWxPdmVycmlkZSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE92ZXJyaWRlX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sT3ZlcnJpZGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0VDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0NhdGFsb2coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRhbG9nIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW4oKSwgImNhc2NhZGVQZXJzaXN0IiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0VudGl0eUxpc3RlbmVycygpLCB0aGlzLmdldEVudGl0eUxpc3RlbmVycygpLCBudWxsLCAiZW50aXR5TGlzdGVuZXJzIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUVDbGFzcywgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAieG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSwgdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLCBudWxsLCAicGVyc2lzdGVuY2VVbml0RGVmYXVsdHMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFJlZmVyZW5jZVRhYmxlRUNsYXNzLCBYbWxSZWZlcmVuY2VUYWJsZS5jbGFzcywgIlhtbFJlZmVyZW5jZVRhYmxlIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUmVmZXJlbmNlVGFibGVfSm9pbkNvbHVtbnMoKSwgdGhpcy5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJqb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxSZWZlcmVuY2VUYWJsZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHBvc3RMb2FkRUNsYXNzLCBQb3N0TG9hZC5jbGFzcywgIlBvc3RMb2FkIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocG9zdFBlcnNpc3RFQ2xhc3MsIFBvc3RQZXJzaXN0LmNsYXNzLCAiUG9zdFBlcnNpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwb3N0UmVtb3ZlRUNsYXNzLCBQb3N0UmVtb3ZlLmNsYXNzLCAiUG9zdFJlbW92ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHBvc3RVcGRhdGVFQ2xhc3MsIFBvc3RVcGRhdGUuY2xhc3MsICJQb3N0VXBkYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MocHJlUGVyc2lzdEVDbGFzcywgUHJlUGVyc2lzdC5jbGFzcywgIlByZVBlcnNpc3QiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyhwcmVSZW1vdmVFQ2xhc3MsIFByZVJlbW92ZS5jbGFzcywgIlByZVJlbW92ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHByZVVwZGF0ZUVDbGFzcywgUHJlVXBkYXRlLmNsYXNzLCAiUHJlVXBkYXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJpbWFyeUtleUpvaW5Db2x1bW5FQ2xhc3MsIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCAiWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4iLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lckVDbGFzcywgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuY2xhc3MsICJYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpLCB0aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCksIG51bGwsICJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxRdWVyeUVDbGFzcywgWG1sUXVlcnkuY2xhc3MsICJYbWxRdWVyeSIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMSwgMSwgWG1sUXVlcnkuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5X1F1ZXJ5KCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicXVlcnkiLCBudWxsLCAxLCAxLCBYbWxRdWVyeS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUXVlcnlfSGludHMoKSwgdGhpcy5nZXRYbWxRdWVyeUhpbnQoKSwgbnVsbCwgImhpbnRzIiwgbnVsbCwgMCwgLTEsIFhtbFF1ZXJ5LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUXVlcnlDb250YWluZXJFQ2xhc3MsIFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzLCAiWG1sUXVlcnlDb250YWluZXIiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKSwgdGhpcy5nZXRYbWxOYW1lZFF1ZXJ5KCksIG51bGwsICJuYW1lZFF1ZXJpZXMiLCBudWxsLCAwLCAtMSwgWG1sUXVlcnlDb250YWluZXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpLCB0aGlzLmdldFhtbE5hbWVkTmF0aXZlUXVlcnkoKSwgbnVsbCwgIm5hbWVkTmF0aXZlUXVlcmllcyIsIG51bGwsIDAsIC0xLCBYbWxRdWVyeUNvbnRhaW5lci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFF1ZXJ5SGludEVDbGFzcywgWG1sUXVlcnlIaW50LmNsYXNzLCAiWG1sUXVlcnlIaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeUhpbnRfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxRdWVyeUhpbnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFF1ZXJ5SGludF9WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInZhbHVlIiwgbnVsbCwgMSwgMSwgWG1sUXVlcnlIaW50LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU2Vjb25kYXJ5VGFibGVFQ2xhc3MsIFhtbFNlY29uZGFyeVRhYmxlLmNsYXNzLCAiWG1sU2Vjb25kYXJ5VGFibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFNlY29uZGFyeVRhYmxlX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpLCB0aGlzLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCksIG51bGwsICJwcmltYXJ5S2V5Sm9pbkNvbHVtbnMiLCBudWxsLCAwLCAtMSwgWG1sU2Vjb25kYXJ5VGFibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxTZXF1ZW5jZUdlbmVyYXRvckVDbGFzcywgWG1sU2VxdWVuY2VHZW5lcmF0b3IuY2xhc3MsICJYbWxTZXF1ZW5jZUdlbmVyYXRvciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfU2VxdWVuY2VOYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2VxdWVuY2VOYW1lIiwgbnVsbCwgMCwgMSwgWG1sU2VxdWVuY2VHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyhzcWxSZXN1bHRTZXRNYXBwaW5nRUNsYXNzLCBTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzLCAiU3FsUmVzdWx0U2V0TWFwcGluZyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFNxbFJlc3VsdFNldE1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFNxbFJlc3VsdFNldE1hcHBpbmdfRW50aXR5UmVzdWx0cygpLCB0aGlzLmdldEVudGl0eVJlc3VsdCgpLCBudWxsLCAiZW50aXR5UmVzdWx0cyIsIG51bGwsIDAsIC0xLCBTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0NvbHVtblJlc3VsdHMoKSwgdGhpcy5nZXRDb2x1bW5SZXN1bHQoKSwgbnVsbCwgImNvbHVtblJlc3VsdHMiLCBudWxsLCAwLCAtMSwgU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFRhYmxlRUNsYXNzLCBYbWxUYWJsZS5jbGFzcywgIlhtbFRhYmxlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVGFibGVHZW5lcmF0b3JFQ2xhc3MsIFhtbFRhYmxlR2VuZXJhdG9yLmNsYXNzLCAiWG1sVGFibGVHZW5lcmF0b3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yX1RhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFibGUiLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVHZW5lcmF0b3JfQ2F0YWxvZygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImNhdGFsb2ciLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVHZW5lcmF0b3JfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBrQ29sdW1uTmFtZSIsIG51bGwsIDAsIDEsIFhtbFRhYmxlR2VuZXJhdG9yLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJ2YWx1ZUNvbHVtbk5hbWUiLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5WYWx1ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgInBrQ29sdW1uVmFsdWUiLCBudWxsLCAwLCAxLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sVGFibGVHZW5lcmF0b3JfVW5pcXVlQ29uc3RyYWludHMoKSwgdGhpcy5nZXRYbWxVbmlxdWVDb25zdHJhaW50KCksIG51bGwsICJ1bmlxdWVDb25zdHJhaW50cyIsIG51bGwsIDAsIC0xLCBYbWxUYWJsZUdlbmVyYXRvci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFRyYW5zaWVudEVDbGFzcywgWG1sVHJhbnNpZW50LmNsYXNzLCAiWG1sVHJhbnNpZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sVHlwZU1hcHBpbmdFQ2xhc3MsIFhtbFR5cGVNYXBwaW5nLmNsYXNzLCAiWG1sVHlwZU1hcHBpbmciLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxUeXBlTWFwcGluZ19DbGFzc05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjbGFzc05hbWUiLCBudWxsLCAxLCAxLCBYbWxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sVHlwZU1hcHBpbmdfTWV0YWRhdGFDb21wbGV0ZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJtZXRhZGF0YUNvbXBsZXRlIiwgbnVsbCwgMCwgMSwgWG1sVHlwZU1hcHBpbmcuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFR5cGVNYXBwaW5nX0Rlc2NyaXB0aW9uKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiZGVzY3JpcHRpb24iLCBudWxsLCAwLCAxLCBYbWxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sVHlwZU1hcHBpbmdfQXR0cmlidXRlcygpLCB0aGlzLmdldEF0dHJpYnV0ZXMoKSwgbnVsbCwgImF0dHJpYnV0ZXMiLCBudWxsLCAwLCAxLCBYbWxUeXBlTWFwcGluZy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFVuaXF1ZUNvbnN0cmFpbnRFQ2xhc3MsIFhtbFVuaXF1ZUNvbnN0cmFpbnQuY2xhc3MsICJYbWxVbmlxdWVDb25zdHJhaW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxVbmlxdWVDb25zdHJhaW50X0NvbHVtbk5hbWVzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAiY29sdW1uTmFtZXMiLCBudWxsLCAxLCAtMSwgWG1sVW5pcXVlQ29uc3RyYWludC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxWZXJzaW9uRUNsYXNzLCBYbWxWZXJzaW9uLmNsYXNzLCAiWG1sVmVyc2lvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oZGlzY3JpbWluYXRvclR5cGVFRW51bSwgRGlzY3JpbWluYXRvclR5cGUuY2xhc3MsICJEaXNjcmltaW5hdG9yVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzY3JpbWluYXRvclR5cGVFRW51bSwgRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKTsKLQkJYWRkRUVudW1MaXRlcmFsKGRpc2NyaW1pbmF0b3JUeXBlRUVudW0sIERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpOwotCQlhZGRFRW51bUxpdGVyYWwoZGlzY3JpbWluYXRvclR5cGVFRW51bSwgRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7Ci0KLQkJaW5pdEVFbnVtKGVudW1UeXBlRUVudW0sIEVudW1UeXBlLmNsYXNzLCAiRW51bVR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGVudW1UeXBlRUVudW0sIEVudW1UeXBlLk9SRElOQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZW51bVR5cGVFRW51bSwgRW51bVR5cGUuU1RSSU5HKTsKLQotCQlpbml0RUVudW0oZmV0Y2hUeXBlRUVudW0sIEZldGNoVHlwZS5jbGFzcywgIkZldGNoVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoZmV0Y2hUeXBlRUVudW0sIEZldGNoVHlwZS5MQVpZKTsKLQkJYWRkRUVudW1MaXRlcmFsKGZldGNoVHlwZUVFbnVtLCBGZXRjaFR5cGUuRUFHRVIpOwotCi0JCWluaXRFRW51bShnZW5lcmF0aW9uVHlwZUVFbnVtLCBHZW5lcmF0aW9uVHlwZS5jbGFzcywgIkdlbmVyYXRpb25UeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbChnZW5lcmF0aW9uVHlwZUVFbnVtLCBHZW5lcmF0aW9uVHlwZS5UQUJMRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChnZW5lcmF0aW9uVHlwZUVFbnVtLCBHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChnZW5lcmF0aW9uVHlwZUVFbnVtLCBHZW5lcmF0aW9uVHlwZS5JREVOVElUWSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChnZW5lcmF0aW9uVHlwZUVFbnVtLCBHZW5lcmF0aW9uVHlwZS5BVVRPKTsKLQotCQlpbml0RUVudW0oaW5oZXJpdGFuY2VUeXBlRUVudW0sIEluaGVyaXRhbmNlVHlwZS5jbGFzcywgIkluaGVyaXRhbmNlVHlwZSIpOwotCQlhZGRFRW51bUxpdGVyYWwoaW5oZXJpdGFuY2VUeXBlRUVudW0sIEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpOwotCQlhZGRFRW51bUxpdGVyYWwoaW5oZXJpdGFuY2VUeXBlRUVudW0sIEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhZGRFRW51bUxpdGVyYWwoaW5oZXJpdGFuY2VUeXBlRUVudW0sIEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCi0JCWluaXRFRW51bSh0ZW1wb3JhbFR5cGVFRW51bSwgVGVtcG9yYWxUeXBlLmNsYXNzLCAiVGVtcG9yYWxUeXBlIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh0ZW1wb3JhbFR5cGVFRW51bSwgVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhZGRFRW51bUxpdGVyYWwodGVtcG9yYWxUeXBlRUVudW0sIFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYWRkRUVudW1MaXRlcmFsKHRlbXBvcmFsVHlwZUVFbnVtLCBUZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXRlcmFscwotCXsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlQ29sdW1uIDxlbT5YbWwgQmFzZSBDb2x1bW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZUNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNFX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTRV9DT0xVTU5fX0lOU0VSVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzZUNvbHVtbl9JbnNlcnRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0VfQ09MVU1OX19OVUxMQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlQ29sdW1uX051bGxhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0VfQ09MVU1OX19UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlQ29sdW1uX1RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNFX0NPTFVNTl9fVU5JUVVFID0gZUlOU1RBTkNFLmdldFhtbEJhc2VDb2x1bW5fVW5pcXVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNFX0NPTFVNTl9fVVBEQVRBQkxFID0gZUlOU1RBTkNFLmdldFhtbEJhc2VDb2x1bW5fVXBkYXRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sQmFzZUNvbHVtbiA8ZW0+QWJzdHJhY3QgWG1sIEJhc2UgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VDb2x1bW4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxCYXNlQ29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX0JBU0VfQ09MVU1OID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sQmFzZUNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgQmFzZSBEaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbEVtYmVkZGVkIDxlbT5BYnN0cmFjdCBYbWwgRW1iZWRkZWQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sRW1iZWRkZWQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxFbWJlZGRlZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX1hNTF9FTUJFRERFRCA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbEVtYmVkZGVkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBQlNUUkFDVF9YTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfX01BUF9LRVkgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfTWFwS2V5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkQ29sdW1uIDxlbT5YbWwgTmFtZWQgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZENvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZENvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OQU1FRF9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sTmFtZWRDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBEZWZpbml0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfQ09MVU1OX19DT0xVTU5fREVGSU5JVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZENvbHVtbl9Db2x1bW5EZWZpbml0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTkFNRURfQ09MVU1OX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkQ29sdW1uX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPlhtbCBCYXNlIERpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9CQVNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OX19ESVNDUklNSU5BVE9SX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW5fRGlzY3JpbWluYXRvclR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxlbmd0aDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0VfRElTQ1JJTUlOQVRPUl9DT0xVTU5fX0xFTkdUSCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbl9MZW5ndGgoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUpvaW5Db2x1bW4gPGVtPlhtbCBCYXNlIEpvaW4gQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlSm9pbkNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlSm9pbkNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9CQVNFX0pPSU5fQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbEJhc2VKb2luQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTRV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxCYXNlSm9pbkNvbHVtbl9SZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uIDxlbT5BYnN0cmFjdCBYbWwgTmFtZWQgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbE5hbWVkQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfTkFNRURfQ09MVU1OID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sTmFtZWRDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgUmVsYXRpb25zaGlwIE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFic3RyYWN0WG1sUmVsYXRpb25zaGlwTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFJlbGF0aW9uc2hpcE1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgRW50aXR5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX1RBUkdFVF9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX1RhcmdldEVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEFCU1RSQUNUX1hNTF9SRUxBVElPTlNISVBfTUFQUElOR19fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0ZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXNjYWRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBQlNUUkFDVF9YTUxfUkVMQVRJT05TSElQX01BUFBJTkdfX0NBU0NBREUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxSZWxhdGlvbnNoaXBNYXBwaW5nX0Nhc2NhZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIDxlbT5BYnN0cmFjdCBYbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0QWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9wdGlvbmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBBQlNUUkFDVF9YTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HX19PUFRJT05BTCA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfT3B0aW9uYWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUYWJsZSA8ZW0+QWJzdHJhY3QgWG1sIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RYbWxUYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RBQkxFX19OQU1FID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVGFibGVfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQUJTVFJBQ1RfWE1MX1RBQkxFX19DQVRBTE9HID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVGFibGVfQ2F0YWxvZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBBQlNUUkFDVF9YTUxfVEFCTEVfX1NDSEVNQSA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFRhYmxlX1NjaGVtYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFCU1RSQUNUX1hNTF9UQUJMRV9fVU5JUVVFX0NPTlNUUkFJTlRTID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sVGFibGVfVW5pcXVlQ29uc3RyYWludHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZyA8ZW0+QWJzdHJhY3QgWG1sIFR5cGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWJzdHJhY3RYbWxUeXBlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQUJTVFJBQ1RfWE1MX1RZUEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRBYnN0cmFjdFhtbFR5cGVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlciA8ZW0+WG1sIEFjY2VzcyBIb2xkZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NIb2xkZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQUNDRVNTX0hPTERFUiA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NIb2xkZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FDQ0VTU19IT0xERVJfX0FDQ0VTUyA9IGVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlTWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BVFRSSUJVVEVfTUFQUElOR19fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVNYXBwaW5nX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREUgPSBlSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBlSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFX09WRVJSSURFID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV9Db2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTID0gZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyX0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BdHRyaWJ1dGVzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEF0dHJpYnV0ZXMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBVFRSSUJVVEVTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPklkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19JRFMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19JZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkIElkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19FTUJFRERFRF9JRFMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19FbWJlZGRlZElkcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmFzaWNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX0JBU0lDUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX0Jhc2ljcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmVyc2lvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fVkVSU0lPTlMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19WZXJzaW9ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFueSBUbyBPbmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIEFUVFJJQlVURVNfX01BTllfVE9fT05FUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX01hbnlUb09uZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk9uZSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19PTkVfVE9fTUFOWVMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19PbmVUb01hbnlzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PbmUgVG8gT25lczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19PTkVfVE9fT05FUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX09uZVRvT25lcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFueSBUbyBNYW55czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19NQU5ZX1RPX01BTllTID0gZUlOU1RBTkNFLmdldEF0dHJpYnV0ZXNfTWFueVRvTWFueXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVtYmVkZGVkczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBBVFRSSUJVVEVTX19FTUJFRERFRFMgPSBlSU5TVEFOQ0UuZ2V0QXR0cmlidXRlc19FbWJlZGRlZHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zaWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgQVRUUklCVVRFU19fVFJBTlNJRU5UUyA9IGVJTlNUQU5DRS5nZXRBdHRyaWJ1dGVzX1RyYW5zaWVudHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMgPGVtPlhtbCBCYXNpYzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQkFTSUMgPSBlSU5TVEFOQ0UuZ2V0WG1sQmFzaWMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQkFTSUNfX0ZFVENIID0gZUlOU1RBTkNFLmdldFhtbEJhc2ljX0ZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcHRpb25hbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0JBU0lDX19PUFRJT05BTCA9IGVJTlNUQU5DRS5nZXRYbWxCYXNpY19PcHRpb25hbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZSA8ZW0+Q2FzY2FkZSBUeXBlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5DYXNjYWRlVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDYXNjYWRlVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIENBU0NBREVfVFlQRSA9IGVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBBbGw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIENBU0NBREVfVFlQRV9fQ0FTQ0FERV9BTEwgPSBlSU5TVEFOQ0UuZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZUFsbCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBDQVNDQURFX1RZUEVfX0NBU0NBREVfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUGVyc2lzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBNZXJnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgQ0FTQ0FERV9UWVBFX19DQVNDQURFX01FUkdFID0gZUlOU1RBTkNFLmdldENhc2NhZGVUeXBlX0Nhc2NhZGVNZXJnZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZW1vdmU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIENBU0NBREVfVFlQRV9fQ0FTQ0FERV9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0Q2FzY2FkZVR5cGVfQ2FzY2FkZVJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBSZWZyZXNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBDQVNDQURFX1RZUEVfX0NBU0NBREVfUkVGUkVTSCA9IGVJTlNUQU5DRS5nZXRDYXNjYWRlVHlwZV9DYXNjYWRlUmVmcmVzaCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZSA8ZW0+WG1sIENsYXNzIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2UKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ2xhc3NSZWZlcmVuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0xBU1NfUkVGRVJFTkNFID0gZUlOU1RBTkNFLmdldFhtbENsYXNzUmVmZXJlbmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ0xBU1NfUkVGRVJFTkNFX19DTEFTU19OQU1FID0gZUlOU1RBTkNFLmdldFhtbENsYXNzUmVmZXJlbmNlX0NsYXNzTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGUgPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0NPTExFQ1RJT05fVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiA8ZW0+WG1sIENvbHVtbjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MZW5ndGg8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT0xVTU5fX0xFTkdUSCA9IGVJTlNUQU5DRS5nZXRYbWxDb2x1bW5fTGVuZ3RoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmVjaXNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DT0xVTU5fX1BSRUNJU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NPTFVNTl9fU0NBTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29sdW1uX1NjYWxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkNvbHVtbk1hcHBpbmcgPGVtPkNvbHVtbiBNYXBwaW5nPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5NYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldENvbHVtbk1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBDT0xVTU5fTUFQUElORyA9IGVJTlNUQU5DRS5nZXRDb2x1bW5NYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIENPTFVNTl9NQVBQSU5HX19DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0IDxlbT5Db2x1bW4gUmVzdWx0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Db2x1bW5SZXN1bHQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uUmVzdWx0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgQ09MVU1OX1JFU1VMVCA9IGVJTlNUQU5DRS5nZXRDb2x1bW5SZXN1bHQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIENPTFVNTl9SRVNVTFRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q29sdW1uUmVzdWx0X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nIDxlbT5YbWwgQ29udmVydGlibGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9DT05WRVJUSUJMRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9CID0gZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUwgPSBlSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRCA9IGVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfRW51bWVyYXRlZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxEaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5YbWwgRGlzY3JpbWluYXRvciBDb2x1bW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbERpc2NyaW1pbmF0b3JDb2x1bW4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9ESVNDUklNSU5BVE9SX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTEVNRU5UX0NPTExFQ1RJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZSA8ZW0+WG1sIEVtYmVkZGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTUJFRERBQkxFID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQgPGVtPlhtbCBFbWJlZGRlZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZCA8ZW0+WG1sIEVtYmVkZGVkIElkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU1CRURERURfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sRW1iZWRkZWRJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkgPGVtPlhtbCBFbnRpdHk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9UYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2Vjb25kYXJ5IFRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5oZXJpdGFuY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9Jbmhlcml0YW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIgPGVtPkVudGl0eSBMaXN0ZW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBFTlRJVFlfTElTVEVORVIgPSBlSU5TVEFOQ0UuZ2V0RW50aXR5TGlzdGVuZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEVOVElUWV9MSVNURU5FUl9fQ0xBU1NfTkFNRSA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcl9DbGFzc05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlMaXN0ZW5lcnMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX0xJU1RFTkVSU19fRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlMaXN0ZW5lcnNfRW50aXR5TGlzdGVuZXJzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzIDxlbT5YbWwgRW50aXR5IE1hcHBpbmdzPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9FTlRJVFlfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VOVElUWV9NQVBQSU5HU19fUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19QYWNrYWdlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQSA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19TY2hlbWEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0cgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NlcXVlbmNlR2VuZXJhdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VOVElUWV9NQVBQSU5HU19fTUFQUEVEX1NVUEVSQ0xBU1NFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19NYXBwZWRTdXBlcmNsYXNzZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbWJlZGRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUyA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19FbWJlZGRhYmxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHQgPGVtPkVudGl0eSBSZXN1bHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudGl0eVJlc3VsdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRFbnRpdHlSZXN1bHQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBFTlRJVFlfUkVTVUxUID0gZUlOU1RBTkNFLmdldEVudGl0eVJlc3VsdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBDb2x1bW48L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEVOVElUWV9SRVNVTFRfX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gZUlOU1RBTkNFLmdldEVudGl0eVJlc3VsdF9EaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIEVOVElUWV9SRVNVTFRfX0VOVElUWV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlSZXN1bHRfRW50aXR5Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkZpZWxkIFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgRU5USVRZX1JFU1VMVF9fRklFTERfUkVTVUxUUyA9IGVJTlNUQU5DRS5nZXRFbnRpdHlSZXN1bHRfRmllbGRSZXN1bHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kIDxlbT5FdmVudCBNZXRob2Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkV2ZW50TWV0aG9kCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEV2ZW50TWV0aG9kKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgRVZFTlRfTUVUSE9EID0gZUlOU1RBTkNFLmdldEV2ZW50TWV0aG9kKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NZXRob2QgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgRVZFTlRfTUVUSE9EX19NRVRIT0RfTkFNRSA9IGVJTlNUQU5DRS5nZXRFdmVudE1ldGhvZF9NZXRob2ROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyIDxlbT5YbWwgRXZlbnQgTWV0aG9kIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJlIFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUkVNT1ZFID0gZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1JFTU9WRSA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0UmVtb3ZlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1VQREFURSA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVVcGRhdGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvc3QgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9MT0FEID0gZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RMb2FkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0IDxlbT5GaWVsZCBSZXN1bHQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZpZWxkUmVzdWx0Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEZpZWxkUmVzdWx0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgRklFTERfUkVTVUxUID0gZUlOU1RBTkNFLmdldEZpZWxkUmVzdWx0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBGSUVMRF9SRVNVTFRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0RmllbGRSZXN1bHRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBGSUVMRF9SRVNVTFRfX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRGaWVsZFJlc3VsdF9Db2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUgPGVtPlhtbCBHZW5lcmF0ZWQgVmFsdWU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRlZFZhbHVlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0dFTkVSQVRFRF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+R2VuZXJhdG9yPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1IgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdGVkVmFsdWVfR2VuZXJhdG9yKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5TdHJhdGVneTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1kgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdGVkVmFsdWVfU3RyYXRlZ3koKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yIDxlbT5YbWwgR2VuZXJhdG9yPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFUT1JfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QWxsb2NhdGlvbiBTaXplPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfR0VORVJBVE9SX19BTExPQ0FUSU9OX1NJWkUgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciA8ZW0+WG1sIEdlbmVyYXRvciBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfR0VORVJBVE9SX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNlcXVlbmNlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1NFUVVFTkNFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JDb250YWluZXJfVGFibGVHZW5lcmF0b3IoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQgPGVtPlhtbCBJZDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSUQgPSBlSU5TVEFOQ0UuZ2V0WG1sSWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdlbmVyYXRlZCBWYWx1ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0lEX19HRU5FUkFURURfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzc0NvbnRhaW5lciA8ZW0+WG1sIElkIENsYXNzIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzc0NvbnRhaW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZENsYXNzQ29udGFpbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0lEX0NMQVNTX0NPTlRBSU5FUiA9IGVJTlNUQU5DRS5nZXRYbWxJZENsYXNzQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0lEX0NMQVNTX0NPTlRBSU5FUl9fSURfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sSWRDbGFzc0NvbnRhaW5lcl9JZENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlIDxlbT5Jbmhlcml0YW5jZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2UKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0SW5oZXJpdGFuY2UoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBJTkhFUklUQU5DRSA9IGVJTlNUQU5DRS5nZXRJbmhlcml0YW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RyYXRlZ3k8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIElOSEVSSVRBTkNFX19TVFJBVEVHWSA9IGVJTlNUQU5DRS5nZXRJbmhlcml0YW5jZV9TdHJhdGVneSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uIDxlbT5YbWwgSm9pbiBDb2x1bW48L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5Db250YWluZXIgPGVtPlhtbCBKb2luIENvbHVtbiBDb250YWluZXI8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW5Db250YWluZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KT0lOX0NPTFVNTl9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9KT0lOX0NPTFVNTl9DT05UQUlORVJfX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uQ29udGFpbmVyX0pvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZSA8ZW0+WG1sIEpvaW4gVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxKb2luVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfSk9JTl9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkludmVyc2UgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxKb2luVGFibGVfSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZUNvbnRhaW5lciA8ZW0+WG1sIEpvaW4gVGFibGUgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pPSU5fVEFCTEVfQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0pPSU5fVEFCTEVfQ09OVEFJTkVSX19KT0lOX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcl9Kb2luVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uTG9iIDxlbT5Mb2I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkxvYgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRMb2IoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBMT0IgPSBlSU5TVEFOQ0UuZ2V0TG9iKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkgPGVtPlhtbCBNYW55IFRvIE1hbnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTlkgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmUgPGVtPlhtbCBNYW55IFRvIE9uZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX09ORSA9IGVJTlNUQU5DRS5nZXRYbWxNYW55VG9PbmUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uTWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0TWFwS2V5KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgTUFQX0tFWSA9IGVJTlNUQU5DRS5nZXRNYXBLZXkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIE1BUF9LRVlfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0TWFwS2V5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nIDxlbT5YbWwgTWFwcGVkIEJ5IE1hcHBpbmc8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZEJ5TWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRCeU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQUEVEX0JZX01BUFBJTkcgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkQnlNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZEJ5TWFwcGluZ19NYXBwZWRCeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzIDxlbT5YbWwgTWFwcGVkIFN1cGVyY2xhc3M8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzcygpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQRURfU1VQRVJDTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTID0gZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBMaXN0ZW5lcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0VudGl0eUxpc3RlbmVycygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5IDxlbT5YbWwgTmFtZWQgTmF0aXZlIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkTmF0aXZlUXVlcnkoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTkFNRURfTkFUSVZFX1FVRVJZID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBDbGFzczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5IDxlbT5YbWwgTmFtZWQgUXVlcnk8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnkKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTmFtZWRRdWVyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9OQU1FRF9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxOYW1lZFF1ZXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIDxlbT5YbWwgTnVsbCBBdHRyaWJ1dGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRYbWxOdWxsQXR0cmlidXRlTWFwcGluZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnkgPGVtPlhtbCBPbmUgVG8gTWFueTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWSA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUgPGVtPlhtbCBPbmUgVG8gT25lPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPbmVUb09uZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fT05FID0gZUlOU1RBTkNFLmdldFhtbE9uZVRvT25lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uIDxlbT5YbWwgT3JkZXIgQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUkRFUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW4oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3ZlcnJpZGUgPGVtPlhtbCBPdmVycmlkZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3ZlcnJpZGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3ZlcnJpZGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT1ZFUlJJREUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3ZlcnJpZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PVkVSUklERV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxPdmVycmlkZV9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0czwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX1NjaGVtYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0cgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2F0YWxvZygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19FbnRpdHlMaXN0ZW5lcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV9QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlIDxlbT5BYnN0cmFjdCBYbWwgUmVmZXJlbmNlIFRhYmxlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBBQlNUUkFDVF9YTUxfUkVGRVJFTkNFX1RBQkxFID0gZUlOU1RBTkNFLmdldEFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVmZXJlbmNlVGFibGUgPGVtPlhtbCBSZWZlcmVuY2UgVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFJlZmVyZW5jZVRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlZmVyZW5jZVRhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1JFRkVSRU5DRV9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxSZWZlcmVuY2VUYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9SRUZFUkVOQ0VfVEFCTEVfX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxSZWZlcmVuY2VUYWJsZV9Kb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0TG9hZAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0TG9hZCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFBPU1RfTE9BRCA9IGVJTlNUQU5DRS5nZXRQb3N0TG9hZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UGVyc2lzdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0UGVyc2lzdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFBPU1RfUEVSU0lTVCA9IGVJTlNUQU5DRS5nZXRQb3N0UGVyc2lzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFJlbW92ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0UmVtb3ZlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgUE9TVF9SRU1PVkUgPSBlSU5TVEFOQ0UuZ2V0UG9zdFJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Qb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uUG9zdFVwZGF0ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0VXBkYXRlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgUE9TVF9VUERBVEUgPSBlSU5TVEFOQ0UuZ2V0UG9zdFVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uUHJlUGVyc2lzdAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQcmVQZXJzaXN0KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgUFJFX1BFUlNJU1QgPSBlSU5TVEFOQ0UuZ2V0UHJlUGVyc2lzdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVSZW1vdmUgPGVtPlByZSBSZW1vdmU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVJlbW92ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQcmVSZW1vdmUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBQUkVfUkVNT1ZFID0gZUlOU1RBTkNFLmdldFByZVJlbW92ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5QcmVVcGRhdGUgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlByZVVwZGF0ZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQcmVVcGRhdGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBQUkVfVVBEQVRFID0gZUlOU1RBTkNFLmdldFByZVVwZGF0ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiA8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciA8ZW0+WG1sIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uIENvbnRhaW5lcjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fQ09OVEFJTkVSID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0NPTlRBSU5FUl9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSA8ZW0+WG1sIFF1ZXJ5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9RVUVSWSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1FVRVJZX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlF1ZXJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfX1FVRVJZID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X1F1ZXJ5KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5IaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUVVFUllfX0hJTlRTID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X0hpbnRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyIDxlbT5YbWwgUXVlcnkgQ29udGFpbmVyPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUNvbnRhaW5lcgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9RVUVSWV9DT05UQUlORVIgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXIoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfUVVFUklFUyA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX05BVElWRV9RVUVSSUVTID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQgPGVtPlhtbCBRdWVyeSBIaW50PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1FVRVJZX0hJTlQgPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlIaW50KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfSElOVF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9RVUVSWV9ISU5UX19WQUxVRSA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfVmFsdWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUgPGVtPlhtbCBTZWNvbmRhcnkgVGFibGU8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NFQ09OREFSWV9UQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyA9IGVJTlNUQU5DRS5nZXRYbWxTZWNvbmRhcnlUYWJsZV9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2VxdWVuY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl9TZXF1ZW5jZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgU1FMX1JFU1VMVF9TRVRfTUFQUElORyA9IGVJTlNUQU5DRS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FID0gZUlOU1RBTkNFLmdldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IFJlc3VsdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFMgPSBlSU5TVEFOQ0UuZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19FbnRpdHlSZXN1bHRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW4gUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBTUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5fUkVTVUxUUyA9IGVJTlNUQU5DRS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0NvbHVtblJlc3VsdHMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUgPGVtPlhtbCBUYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IgPGVtPlhtbCBUYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1RBQkxFX0dFTkVSQVRPUiA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1RhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX0NhdGFsb2coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1RBQkxFX0dFTkVSQVRPUl9fU0NIRU1BID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1NjaGVtYSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsdWUgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1ZBTFVFX0NPTFVNTl9OQU1FID0gZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1ZhbHVlQ29sdW1uTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfUGtDb2x1bW5WYWx1ZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9UQUJMRV9HRU5FUkFUT1JfX1VOSVFVRV9DT05TVFJBSU5UUyA9IGVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl9VbmlxdWVDb25zdHJhaW50cygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQgPGVtPlhtbCBUcmFuc2llbnQ8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRyYW5zaWVudAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUcmFuc2llbnQoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFJBTlNJRU5UID0gZUlOU1RBTkNFLmdldFhtbFRyYW5zaWVudCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyA8ZW0+WG1sIFR5cGUgTWFwcGluZzwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmcoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVFlQRV9NQVBQSU5HID0gZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFlQRV9NQVBQSU5HX19DTEFTU19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX0NsYXNzTmFtZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9UWVBFX01BUFBJTkdfX01FVEFEQVRBX0NPTVBMRVRFID0gZUlOU1RBTkNFLmdldFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVFlQRV9NQVBQSU5HX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1RZUEVfTUFQUElOR19fQVRUUklCVVRFUyA9IGVJTlNUQU5DRS5nZXRYbWxUeXBlTWFwcGluZ19BdHRyaWJ1dGVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50KCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1VOSVFVRV9DT05TVFJBSU5UID0gZUlOU1RBTkNFLmdldFhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNvbHVtbiBOYW1lczwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUyA9IGVJTlNUQU5DRS5nZXRYbWxVbmlxdWVDb25zdHJhaW50X0NvbHVtbk5hbWVzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24gPGVtPlhtbCBWZXJzaW9uPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVkVSU0lPTiA9IGVJTlNUQU5DRS5nZXRYbWxWZXJzaW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyYWJsZSA8ZW0+WG1sIE9yZGVyYWJsZTwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJhYmxlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9yZGVyYWJsZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUkRFUkFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09SREVSQUJMRV9fT1JERVJfQlkgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJhYmxlX09yZGVyQnkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXREaXNjcmltaW5hdG9yVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gRElTQ1JJTUlOQVRPUl9UWVBFID0gZUlOU1RBTkNFLmdldERpc2NyaW1pbmF0b3JUeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlIDxlbT5FbnVtIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0RW51bVR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIEVOVU1fVFlQRSA9IGVJTlNUQU5DRS5nZXRFbnVtVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUgPGVtPkZldGNoIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldEZldGNoVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gRkVUQ0hfVFlQRSA9IGVJTlNUQU5DRS5nZXRGZXRjaFR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUgPGVtPkdlbmVyYXRpb24gVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5HZW5lcmF0aW9uVHlwZQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRHZW5lcmF0aW9uVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gR0VORVJBVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldEdlbmVyYXRpb25UeXBlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZSA8ZW0+SW5oZXJpdGFuY2UgVHlwZTwvZW0+fScgZW51bS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0SW5oZXJpdGFuY2VUeXBlKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBJTkhFUklUQU5DRV9UWVBFID0gZUlOU1RBTkNFLmdldEluaGVyaXRhbmNlVHlwZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUgPGVtPlRlbXBvcmFsIFR5cGU8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFRlbXBvcmFsVHlwZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gVEVNUE9SQUxfVFlQRSA9IGVJTlNUQU5DRS5nZXRUZW1wb3JhbFR5cGUoKTsKLQotCX0KLQotfSAvL09ybVBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Pcm1YbWxSZXNvdXJjZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Pcm1YbWxSZXNvdXJjZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcwM2ZiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vT3JtWG1sUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuUmVuZGVyZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5OwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgT3JtWG1sUmVzb3VyY2VGYWN0b3J5Ci0JZXh0ZW5kcyBUcmFuc2xhdG9yUmVzb3VyY2VGYWN0b3J5Ci17Ci0JcHVibGljIE9ybVhtbFJlc291cmNlRmFjdG9yeSgpIHsKLQkJdGhpcyhSZW5kZXJlckZhY3RvcnkuZ2V0RGVmYXVsdFJlbmRlcmVyRmFjdG9yeSgpKTsKLQl9Ci0JCi0JcHVibGljIE9ybVhtbFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIE9ybVhtbFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSwgYm9vbGVhbiBsaXN0ZW5pbmdGb3JVcGRhdGVzKSB7Ci0JCXN1cGVyKGFSZW5kZXJlckZhY3RvcnksIGxpc3RlbmluZ0ZvclVwZGF0ZXMpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVHJhbnNsYXRvclJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0JCXJldHVybiBuZXcgSnBhWG1sUmVzb3VyY2UodXJpLCByZW5kZXJlciwgSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgWG1sRW50aXR5TWFwcGluZ3MuZ2V0Um9vdFRyYW5zbGF0b3IoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RMb2FkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUG9zdExvYWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE1YWYxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUG9zdExvYWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvc3QgTG9hZDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RMb2FkKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvc3RMb2FkIGV4dGVuZHMgRXZlbnRNZXRob2QKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdExvYWQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5QT1NUX0xPQUQ7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCi0JCQlKUEEuUE9TVF9MT0FELAotCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdExvYWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RQZXJzaXN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUG9zdFBlcnNpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlOTQ5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUG9zdFBlcnNpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvc3QgUGVyc2lzdDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFBvc3RQZXJzaXN0KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvc3RQZXJzaXN0IGV4dGVuZHMgRXZlbnRNZXRob2QKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFBlcnNpc3QoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5QT1NUX1BFUlNJU1Q7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCi0JCQlKUEEuUE9TVF9QRVJTSVNULAotCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RSZW1vdmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9Qb3N0UmVtb3ZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NWQxNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RSZW1vdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UG9zdFJlbW92ZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQb3N0UmVtb3ZlIGV4dGVuZHMgRXZlbnRNZXRob2QKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgUG9zdFJlbW92ZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBPU1RfUkVNT1ZFOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gYnVpbGRUcmFuc2xhdG9yKAotCQkJSlBBLlBPU1RfUkVNT1ZFLAotCQkJT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFJlbW92ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUG9zdFVwZGF0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1Bvc3RVcGRhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1OTFjYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUG9zdFVwZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UG9zdCBVcGRhdGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRQb3N0VXBkYXRlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBvc3RVcGRhdGUgZXh0ZW5kcyBFdmVudE1ldGhvZAotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQb3N0VXBkYXRlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuUE9TVF9VUERBVEU7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCi0JCQlKUEEuUE9TVF9VUERBVEUsCi0JCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0VXBkYXRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9QcmVQZXJzaXN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUHJlUGVyc2lzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzBjZjZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9QcmVQZXJzaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmUgUGVyc2lzdDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVBlcnNpc3QoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUHJlUGVyc2lzdCBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZVBlcnNpc3QoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5QUkVfUEVSU0lTVDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIGJ1aWxkVHJhbnNsYXRvcigKLQkJCUpQQS5QUkVfUEVSU0lTVCwKLQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVBlcnNpc3QoKSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9QcmVSZW1vdmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9QcmVSZW1vdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmMWU1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUHJlUmVtb3ZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QcmUgUmVtb3ZlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0UHJlUmVtb3ZlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFByZVJlbW92ZSBleHRlbmRzIEV2ZW50TWV0aG9kCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFByZVJlbW92ZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlBSRV9SRU1PVkU7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBidWlsZFRyYW5zbGF0b3IoCi0JCQlKUEEuUFJFX1JFTU9WRSwKLQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVJlbW92ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUHJlVXBkYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vUHJlVXBkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYzVmZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1ByZVVwZGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UHJlIFVwZGF0ZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFByZVVwZGF0ZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVVcGRhdGUgZXh0ZW5kcyBFdmVudE1ldGhvZAotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBQcmVVcGRhdGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5QUkVfVVBEQVRFOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gYnVpbGRUcmFuc2xhdG9yKAotCQkJSlBBLlBSRV9VUERBVEUsCi0JCQlPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVVcGRhdGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1NxbFJlc3VsdFNldE1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9TcWxSZXN1bHRTZXRNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGI0NzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1NxbFJlc3VsdFNldE1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZzwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyNnZXRFbnRpdHlSZXN1bHRzIDxlbT5FbnRpdHkgUmVzdWx0czwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5TcWxSZXN1bHRTZXRNYXBwaW5nI2dldENvbHVtblJlc3VsdHMgPGVtPkNvbHVtbiBSZXN1bHRzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTcWxSZXN1bHRTZXRNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5UmVzdWx0cygpIDxlbT5FbnRpdHkgUmVzdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRpdHlSZXN1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8RW50aXR5UmVzdWx0PiBlbnRpdHlSZXN1bHRzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uUmVzdWx0cygpIDxlbT5Db2x1bW4gUmVzdWx0czwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW5SZXN1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8Q29sdW1uUmVzdWx0PiBjb2x1bW5SZXN1bHRzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNxbFJlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFNxbFJlc3VsdFNldE1hcHBpbmdfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZyNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBSZXN1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnRpdHlSZXN1bHR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IFJlc3VsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVzdWx0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0VudGl0eVJlc3VsdHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PEVudGl0eVJlc3VsdD4gZ2V0RW50aXR5UmVzdWx0cygpCi0JewotCQlpZiAoZW50aXR5UmVzdWx0cyA9PSBudWxsKQotCQl7Ci0JCQllbnRpdHlSZXN1bHRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PEVudGl0eVJlc3VsdD4oRW50aXR5UmVzdWx0LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0VOVElUWV9SRVNVTFRTKTsKLQkJfQotCQlyZXR1cm4gZW50aXR5UmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gUmVzdWx0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQ29sdW1uUmVzdWx0fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbiBSZXN1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIFJlc3VsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ19Db2x1bW5SZXN1bHRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxDb2x1bW5SZXN1bHQ+IGdldENvbHVtblJlc3VsdHMoKQotCXsKLQkJaWYgKGNvbHVtblJlc3VsdHMgPT0gbnVsbCkKLQkJewotCQkJY29sdW1uUmVzdWx0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDb2x1bW5SZXN1bHQ+KENvbHVtblJlc3VsdC5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5fUkVTVUxUUyk7Ci0JCX0KLQkJcmV0dXJuIGNvbHVtblJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRFbnRpdHlSZXN1bHRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5fUkVTVUxUUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldENvbHVtblJlc3VsdHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFM6Ci0JCQkJcmV0dXJuIGdldEVudGl0eVJlc3VsdHMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19DT0xVTU5fUkVTVUxUUzoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uUmVzdWx0cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVFlfUkVTVUxUUzoKLQkJCQlnZXRFbnRpdHlSZXN1bHRzKCkuY2xlYXIoKTsKLQkJCQlnZXRFbnRpdHlSZXN1bHRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnRpdHlSZXN1bHQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFM6Ci0JCQkJZ2V0Q29sdW1uUmVzdWx0cygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29sdW1uUmVzdWx0cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ29sdW1uUmVzdWx0PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlNRTF9SRVNVTFRfU0VUX01BUFBJTkdfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19FTlRJVFlfUkVTVUxUUzoKLQkJCQlnZXRFbnRpdHlSZXN1bHRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFM6Ci0JCQkJZ2V0Q29sdW1uUmVzdWx0cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5TUUxfUkVTVUxUX1NFVF9NQVBQSU5HX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fRU5USVRZX1JFU1VMVFM6Ci0JCQkJcmV0dXJuIGVudGl0eVJlc3VsdHMgIT0gbnVsbCAmJiAhZW50aXR5UmVzdWx0cy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuU1FMX1JFU1VMVF9TRVRfTUFQUElOR19fQ09MVU1OX1JFU1VMVFM6Ci0JCQkJcmV0dXJuIGNvbHVtblJlc3VsdHMgIT0gbnVsbCAmJiAhY29sdW1uUmVzdWx0cy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlSZXN1bHRUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtblJlc3VsdFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzBfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEVudGl0eVJlc3VsdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBFbnRpdHlSZXN1bHQuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTlRJVFlfUkVTVUxULCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0VudGl0eVJlc3VsdHMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblJlc3VsdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBDb2x1bW5SZXN1bHQuYnVpbGRUcmFuc2xhdG9yKEpQQS5DT0xVTU5fUkVTVUxULCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRTcWxSZXN1bHRTZXRNYXBwaW5nX0NvbHVtblJlc3VsdHMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1RlbXBvcmFsVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1RlbXBvcmFsVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDBkYTQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9UZW1wb3JhbFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VGVtcG9yYWwgVHlwZTwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFRlbXBvcmFsVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gVGVtcG9yYWxUeXBlIGltcGxlbWVudHMgRW51bWVyYXRvcgotewotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjREFURV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCURBVEUoMCwgIkRBVEUiLCAiREFURSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNUSU1FX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JVElNRSgxLCAiVElNRSIsICJUSU1FIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FU1RBTVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVElNRVNUQU1QX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JVElNRVNUQU1QKDIsICJUSU1FU1RBTVAiLCAiVElNRVNUQU1QIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0RBVEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEQVRFX1ZBTFVFID0gMDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVElNRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRVNUQU1QPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5USU1FU1RBTVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjVElNRVNUQU1QCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRVNUQU1QX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5UZW1wb3JhbCBUeXBlPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGVbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgVGVtcG9yYWxUeXBlW10KLQkJewotCQkJREFURSwKLQkJCVRJTUUsCi0JCQlUSU1FU1RBTVAsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VGVtcG9yYWwgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFRlbXBvcmFsVHlwZT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5UZW1wb3JhbCBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVtcG9yYWxUeXBlIGdldChTdHJpbmcgbGl0ZXJhbCkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlUZW1wb3JhbFR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VGVtcG9yYWwgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlbXBvcmFsVHlwZSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJVGVtcG9yYWxUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+VGVtcG9yYWwgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlbXBvcmFsVHlwZSBnZXQoaW50IHZhbHVlKQotCXsKLQkJc3dpdGNoICh2YWx1ZSkKLQkJewotCQkJY2FzZSBEQVRFX1ZBTFVFOiByZXR1cm4gREFURTsKLQkJCWNhc2UgVElNRV9WQUxVRTogcmV0dXJuIFRJTUU7Ci0JCQljYXNlIFRJTUVTVEFNUF9WQUxVRTogcmV0dXJuIFRJTUVTVEFNUDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOwotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgVGVtcG9yYWxUeXBlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9UZW1wb3JhbFR5cGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NIb2xkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBY2Nlc3NIb2xkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1NmE2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQWNjZXNzSG9sZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBY2Nlc3MgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzSG9sZGVyI2dldEFjY2VzcyA8ZW0+QWNjZXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzSG9sZGVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBY2Nlc3NIb2xkZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QWNjZXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRBY2Nlc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldEFjY2VzcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBY2Nlc3NIb2xkZXIjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBY2Nlc3MoU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxBY2Nlc3NIb2xkZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXNzb2NpYXRpb25PdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzFjNWEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxPdmVycmlkZSwgWG1sSm9pbkNvbHVtbkNvbnRhaW5lciwgWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5Db2x1bW5zKCkgPGVtPkpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Sm9pblRhYmxlKCkgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEpvaW5UYWJsZSBqb2luVGFibGU7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcl9Kb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKGpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBqb2luQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCi0JewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEpvaW5UYWJsZShYbWxKb2luVGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyX0pvaW5UYWJsZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpCi0JewotCQlyZXR1cm4gam9pblRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sSm9pblRhYmxlIG9sZEpvaW5UYWJsZSA9IGpvaW5UYWJsZTsKLQkJam9pblRhYmxlID0gbmV3Sm9pblRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRSwgb2xkSm9pblRhYmxlLCBuZXdKb2luVGFibGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZSNnZXRKb2luVGFibGUgPGVtPkpvaW4gVGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkpvaW4gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEpvaW5UYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgbmV3Sm9pblRhYmxlKQotCXsKLQkJaWYgKG5ld0pvaW5UYWJsZSAhPSBqb2luVGFibGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGpvaW5UYWJsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClqb2luVGFibGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Sm9pblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0pvaW5UYWJsZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEpvaW5UYWJsZShuZXdKb2luVGFibGUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEUsIG5ld0pvaW5UYWJsZSwgbmV3Sm9pblRhYmxlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPdmVycmlkZV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEpvaW5Db2x1bW5zKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Sm9pblRhYmxlKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldEpvaW5UYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFOgotCQkJCXNldEpvaW5UYWJsZSgoWG1sSm9pblRhYmxlKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBqb2luQ29sdW1ucyAhPSBudWxsICYmICFqb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19KT0lOX1RBQkxFOgotCQkJCXJldHVybiBqb2luVGFibGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luQ29sdW1uQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fQ09OVEFJTkVSX19KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pblRhYmxlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfQ09OVEFJTkVSX19KT0lOX1RBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fREVTQ1JJUFRJT046IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSm9pbkNvbHVtbkNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fQ09OVEFJTkVSX19KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5UYWJsZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9DT05UQUlORVJfX0pPSU5fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9fSk9JTl9UQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX19ERVNDUklQVElPTjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLk5BTUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE92ZXJyaWRlX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sSm9pbkNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxKb2luQ29sdW1uQ29udGFpbmVyX0pvaW5Db2x1bW5zKCkpOwotCX0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEpvaW5UYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBLkpPSU5fVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5UYWJsZUNvbnRhaW5lcl9Kb2luVGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDhiZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSBDb250YWluZXI8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcyA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQotfSAvLyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEF0dHJpYnV0ZU1hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0OTk1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU1hcHBpbmcjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEF0dHJpYnV0ZU1hcHBpbmcgZXh0ZW5kcyBYbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ19OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVNYXBwaW5nI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQkKLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotCQotCS8vVE9ETyB1bnN1cmUgYWJvdXQgdGhpcyBhcGksIG1pZ2h0IGNoYW5nZSBzb29uCi0JU3RyaW5nIGdldE1hcHBpbmdLZXkoKTsKLQotfSAvLyBYbWxBdHRyaWJ1dGVNYXBwaW5nCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JmMWIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVPdmVycmlkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxBdHRyaWJ1dGVPdmVycmlkZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbE92ZXJyaWRlLCBYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uKCkgPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29sdW1uIGNvbHVtbjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxBdHRyaWJ1dGVPdmVycmlkZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGUjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCi0JewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbHVtbiBvbGRDb2x1bW4gPSBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ld0NvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4sIG9sZENvbHVtbiwgbmV3Q29sdW1uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uKQotCXsKLQkJaWYgKG5ld0NvbHVtbiAhPSBjb2x1bW4pCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCljb2x1bW4pLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbHVtbihuZXdDb2x1bW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU4sIG5ld0NvbHVtbiwgbmV3Q29sdW1uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxPdmVycmlkZV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRDb2x1bW4obnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU46Ci0JCQkJcmV0dXJuIGdldENvbHVtbigpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfX0NPTFVNTjoKLQkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFXzIwX19ERVNDUklQVElPTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9fREVTQ1JJUFRJT047Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuTkFNRSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sT3ZlcnJpZGVfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBfRGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlX0NvbHVtbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjg2MDVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXI8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyI2dldEF0dHJpYnV0ZU92ZXJyaWRlcyA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCi19IC8vIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzZUNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2VDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzMTE4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzZUNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzZSBDb2x1bW48L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiNnZXRJbnNlcnRhYmxlIDxlbT5JbnNlcnRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0VGFibGUgPGVtPlRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiNnZXRVcGRhdGFibGUgPGVtPlVwZGF0YWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2VDb2x1bW4gZXh0ZW5kcyBYbWxOYW1lZENvbHVtbgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc2VydGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5zZXJ0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VDb2x1bW5fSW5zZXJ0YWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5zZXJ0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TnVsbGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlQ29sdW1uX051bGxhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldE51bGxhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdWxsYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TnVsbGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZUNvbHVtbl9UYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGFibGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUNvbHVtbiNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VGFibGUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVuaXF1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VW5pcXVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VW5pcXVlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZUNvbHVtbl9VbmlxdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0VW5pcXVlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VDb2x1bW4jZ2V0VW5pcXVlIDxlbT5VbmlxdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VW5pcXVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VDb2x1bW5fVXBkYXRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlCb29sZWFuIGdldFVwZGF0YWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlQ29sdW1uI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVwZGF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi0JVGV4dFJhbmdlIGdldFRhYmxlVGV4dFJhbmdlKCk7Ci0KLX0gLy8gWG1sQmFzZUNvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlNThhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQmFzZSBEaXNjcmltaW5hdG9yIENvbHVtbjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbiNnZXREaXNjcmltaW5hdG9yVHlwZSA8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEJhc2VEaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgWG1sTmFtZWRDb2x1bW4KLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EaXNjcmltaW5hdG9yIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iU1RSSU5HIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUKLQkgKiBAc2VlICNzZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbl9EaXNjcmltaW5hdG9yVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IlNUUklORyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRGlzY3JpbWluYXRvclR5cGUgZ2V0RGlzY3JpbWluYXRvclR5cGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0RGlzY3JpbWluYXRvclR5cGUgPGVtPkRpc2NyaW1pbmF0b3IgVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBUeXBlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUKLQkgKiBAc2VlICNnZXREaXNjcmltaW5hdG9yVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZW5ndGgoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbl9MZW5ndGgoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW50ZWdlciBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxlbmd0aDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TGVuZ3RoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRMZW5ndGgoSW50ZWdlciB2YWx1ZSk7Ci0KLX0gLy8gWG1sQmFzZURpc2NyaW1pbmF0b3JDb2x1bW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxCYXNlSm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2VKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZjU3Y2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2VKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBCYXNlIEpvaW4gQ29sdW1uPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzZUpvaW5Db2x1bW4jZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNlSm9pbkNvbHVtbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQmFzZUpvaW5Db2x1bW4gZXh0ZW5kcyBYbWxOYW1lZENvbHVtbgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNlSm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyB2YWx1ZSk7Ci0KLQlUZXh0UmFuZ2UgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVUZXh0UmFuZ2UoKTsKLQotfSAvLyBYbWxCYXNlSm9pbkNvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEJhc2ljLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg0ZTVhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQmFzaWMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzaWMgSW1wbDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0T3B0aW9uYWwgPGVtPk9wdGlvbmFsPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQmFzaWMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQmFzaWMgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbGVtZW50cyBDb2x1bW5NYXBwaW5nLCBYbWxDb252ZXJ0aWJsZU1hcHBpbmcKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb2x1bW4gY29sdW1uOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0JfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxvYiA9IExPQl9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBURU1QT1JBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wb3JhbCgpIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwgPSBURU1QT1JBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudW1UeXBlIEVOVU1FUkFURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW51bWVyYXRlZCgpIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bVR5cGUgZW51bWVyYXRlZCA9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBGZXRjaFR5cGUgRkVUQ0hfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmV0Y2goKSA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGZldGNoID0gRkVUQ0hfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gT1BUSU9OQUxfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3B0aW9uYWwoKSA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9wdGlvbmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcHRpb25hbCA9IE9QVElPTkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEJhc2ljKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0JBU0lDOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29sdW1uKFhtbENvbHVtbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCi0JewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OLCBvbGRDb2x1bW4sIG5ld0NvbHVtbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRDb2x1bW4gPGVtPkNvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbikKLQl7Ci0JCWlmIChuZXdDb2x1bW4gIT0gY29sdW1uKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChjb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29sdW1uKG5ld0NvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OLCBuZXdDb2x1bW4sIG5ld0NvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvYjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TG9iKGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0xvYigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNMb2IoKQotCXsKLQkJcmV0dXJuIGxvYjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpCi0JewotCQlib29sZWFuIG9sZExvYiA9IGxvYjsKLQkJbG9iID0gbmV3TG9iOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTE9CLCBvbGRMb2IsIGxvYikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gdGVtcG9yYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpCi0JewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0ZW1wb3JhbDsKLQkJdGVtcG9yYWwgPSBuZXdUZW1wb3JhbCA9PSBudWxsID8gVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdUZW1wb3JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfQkFTSUNfX1RFTVBPUkFMLCBvbGRUZW1wb3JhbCwgdGVtcG9yYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldEVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpCi0JewotCQlyZXR1cm4gZW51bWVyYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIG5ld0VudW1lcmF0ZWQpCi0JewotCQlFbnVtVHlwZSBvbGRFbnVtZXJhdGVkID0gZW51bWVyYXRlZDsKLQkJZW51bWVyYXRlZCA9IG5ld0VudW1lcmF0ZWQgPT0gbnVsbCA/IEVOVU1FUkFURURfRURFRkFVTFQgOiBuZXdFbnVtZXJhdGVkOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fRU5VTUVSQVRFRCwgb2xkRW51bWVyYXRlZCwgZW51bWVyYXRlZCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZldGNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IkxBWlkiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxCYXNpY19GZXRjaCgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkxBWlkiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBGZXRjaFR5cGUgZ2V0RmV0Y2goKQotCXsKLQkJcmV0dXJuIGZldGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWMjZ2V0RmV0Y2ggPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI2dldEZldGNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmV0Y2goRmV0Y2hUeXBlIG5ld0ZldGNoKQotCXsKLQkJRmV0Y2hUeXBlIG9sZEZldGNoID0gZmV0Y2g7Ci0JCWZldGNoID0gbmV3RmV0Y2ggPT0gbnVsbCA/IEZFVENIX0VERUZBVUxUIDogbmV3RmV0Y2g7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSCwgb2xkRmV0Y2gsIGZldGNoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3B0aW9uYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcHRpb25hbChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2ljX09wdGlvbmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcHRpb25hbCgpCi0JewotCQlyZXR1cm4gb3B0aW9uYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYyNnZXRPcHRpb25hbCA8ZW0+T3B0aW9uYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9wdGlvbmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcHRpb25hbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGlvbmFsKEJvb2xlYW4gbmV3T3B0aW9uYWwpCi0JewotCQlCb29sZWFuIG9sZE9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCW9wdGlvbmFsID0gbmV3T3B0aW9uYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTCwgb2xkT3B0aW9uYWwsIG9wdGlvbmFsKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0Q29sdW1uKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I6Ci0JCQkJcmV0dXJuIGlzTG9iKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gZ2V0VGVtcG9yYWwoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0VOVU1FUkFURUQ6Ci0JCQkJcmV0dXJuIGdldEVudW1lcmF0ZWQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENIOgotCQkJCXJldHVybiBnZXRGZXRjaCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fT1BUSU9OQUw6Ci0JCQkJcmV0dXJuIGdldE9wdGlvbmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I6Ci0JCQkJc2V0TG9iKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOgotCQkJCXNldEVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDoKLQkJCQlzZXRGZXRjaCgoRmV0Y2hUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbCgoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0xPQjoKLQkJCQlzZXRMb2IoTE9CX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbChURU1QT1JBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fRU5VTUVSQVRFRDoKLQkJCQlzZXRFbnVtZXJhdGVkKEVOVU1FUkFURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0ZFVENIOgotCQkJCXNldEZldGNoKEZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTDoKLQkJCQlzZXRPcHRpb25hbChPUFRJT05BTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTjoKLQkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I6Ci0JCQkJcmV0dXJuIGxvYiAhPSBMT0JfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOgotCQkJCXJldHVybiBlbnVtZXJhdGVkICE9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19GRVRDSDoKLQkJCQlyZXR1cm4gZmV0Y2ggIT0gRkVUQ0hfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19PUFRJT05BTDoKLQkJCQlyZXR1cm4gT1BUSU9OQUxfRURFRkFVTFQgPT0gbnVsbCA/IG9wdGlvbmFsICE9IG51bGwgOiAhT1BUSU9OQUxfRURFRkFVTFQuZXF1YWxzKG9wdGlvbmFsKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQkFTSUNfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxDb252ZXJ0aWJsZU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0JBU0lDX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fTE9COwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNJQ19fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTSUNfX0VOVU1FUkFURUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvYik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGVtcG9yYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRlbXBvcmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnVtZXJhdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlbnVtZXJhdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBmZXRjaDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmV0Y2gpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG9wdGlvbmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcHRpb25hbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuRU5VTUVSQVRFRCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLkxPQik7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLlRFTVBPUkFMKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksIAotCQkJYnVpbGRMb2JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEZldGNoVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5GRVRDSCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfRmV0Y2goKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3B0aW9uYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5PUFRJT05BTCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQmFzaWNfT3B0aW9uYWwoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ29sdW1uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkNPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZExvYlRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuTE9CLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuVEVNUE9SQUwsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19UZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRW51bWVyYXRlZFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuRU5VTUVSQVRFRCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENsYXNzUmVmZXJlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2xhc3NSZWZlcmVuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZiNDU5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ2xhc3NSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDbGFzcyBSZWZlcmVuY2U8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZSNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDbGFzc1JlZmVyZW5jZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxDbGFzc1JlZmVyZW5jZSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2xhc3NOYW1lKCkgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDbGFzc05hbWUoKSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzTmFtZSA9IENMQVNTX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfQ0xBU1NfUkVGRVJFTkNFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNsYXNzIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2xhc3NOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDbGFzc1JlZmVyZW5jZV9DbGFzc05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkKLQl7Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZSNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENsYXNzTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgbmV3Q2xhc3NOYW1lKQotCXsKLQkJU3RyaW5nIG9sZENsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLQkJY2xhc3NOYW1lID0gbmV3Q2xhc3NOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DTEFTU19SRUZFUkVOQ0VfX0NMQVNTX05BTUUsIG9sZENsYXNzTmFtZSwgY2xhc3NOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NMQVNTX1JFRkVSRU5DRV9fQ0xBU1NfTkFNRToKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DTEFTU19SRUZFUkVOQ0VfX0NMQVNTX05BTUU6Ci0JCQkJc2V0Q2xhc3NOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ0xBU1NfUkVGRVJFTkNFX19DTEFTU19OQU1FOgotCQkJCXNldENsYXNzTmFtZShDTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DTEFTU19SRUZFUkVOQ0VfX0NMQVNTX05BTUU6Ci0JCQkJcmV0dXJuIENMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGNsYXNzTmFtZSAhPSBudWxsIDogIUNMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGNsYXNzTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNsYXNzTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2xhc3NOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2xhc3NOYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5DTEFTUyk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpfTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5DTEFTUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ2xhc3NSZWZlcmVuY2VfQ2xhc3NOYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZUVkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gb3JpZ2luYWxUeXBlLmdldFR5cGVRdWFsaWZpZWROYW1lKCk7Ci0JCWludCBuYW1lSW5kZXggPSB0aGlzLmNsYXNzTmFtZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCi0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEpQQS5DTEFTUykuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCWludCBwYWNrYWdlTGVuZ3RoID0gdGhpcy5jbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoSlBBLkNMQVNTKS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgKyAxOyAvLyArMSA9IG9wZW5pbmcgZG91YmxlIHF1b3RlCi0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2xsZWN0aW9uVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxDb2xsZWN0aW9uVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMyNjMwOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sbGVjdGlvblRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ29sbGVjdGlvbiBUYWJsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbENvbGxlY3Rpb25UYWJsZSBleHRlbmRzIEFic3RyYWN0WG1sUmVmZXJlbmNlVGFibGUgaW1wbGVtZW50cyBYbWxDb2xsZWN0aW9uVGFibGVfMl8wCi17Ci0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbGxlY3Rpb25UYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT0xMRUNUSU9OX1RBQkxFOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwMmM5ZDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db2x1bW4gSW1wbDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW4jZ2V0TGVuZ3RoIDxlbT5MZW5ndGg8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldFByZWNpc2lvbiA8ZW0+UHJlY2lzaW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RYbWxCYXNlQ29sdW1uCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExlbmd0aCgpIDxlbT5MZW5ndGg8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExFTkdUSF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRMZW5ndGgoKSA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRMZW5ndGgoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGxlbmd0aCA9IExFTkdUSF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmVjaXNpb24oKSA8ZW0+UHJlY2lzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBQUkVDSVNJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlY2lzaW9uKCkgPGVtPlByZWNpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlY2lzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBwcmVjaXNpb24gPSBQUkVDSVNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgU0NBTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NhbGUoKSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjYWxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBzY2FsZSA9IFNDQUxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9DT0xVTU47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TGVuZ3RoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGVuZ3RoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMZW5ndGgoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb2x1bW5fTGVuZ3RoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldExlbmd0aCgpCi0JewotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sdW1uI2dldExlbmd0aCA8ZW0+TGVuZ3RoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MZW5ndGg8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldExlbmd0aCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChJbnRlZ2VyIG5ld0xlbmd0aCkKLQl7Ci0JCUludGVnZXIgb2xkTGVuZ3RoID0gbGVuZ3RoOwotCQlsZW5ndGggPSBuZXdMZW5ndGg7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RILCBvbGRMZW5ndGgsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZWNpc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlY2lzaW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZWNpc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHJlY2lzaW9uKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uX1ByZWNpc2lvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRQcmVjaXNpb24oKQotCXsKLQkJcmV0dXJuIHByZWNpc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRQcmVjaXNpb24gPGVtPlByZWNpc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlY2lzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQcmVjaXNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVjaXNpb24oSW50ZWdlciBuZXdQcmVjaXNpb24pCi0JewotCQlJbnRlZ2VyIG9sZFByZWNpc2lvbiA9IHByZWNpc2lvbjsKLQkJcHJlY2lzaW9uID0gbmV3UHJlY2lzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTiwgb2xkUHJlY2lzaW9uLCBwcmVjaXNpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2FsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2NhbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NhbGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjYWxlKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29sdW1uX1NjYWxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldFNjYWxlKCkKLQl7Ci0JCXJldHVybiBzY2FsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbiNnZXRTY2FsZSA8ZW0+U2NhbGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjYWxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2FsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjYWxlKEludGVnZXIgbmV3U2NhbGUpCi0JewotCQlJbnRlZ2VyIG9sZFNjYWxlID0gc2NhbGU7Ci0JCXNjYWxlID0gbmV3U2NhbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU0NBTEUsIG9sZFNjYWxlLCBzY2FsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSDoKLQkJCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fUFJFQ0lTSU9OOgotCQkJCXJldHVybiBnZXRQcmVjaXNpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRToKLQkJCQlyZXR1cm4gZ2V0U2NhbGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fTEVOR1RIOgotCQkJCXNldExlbmd0aCgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTjoKLQkJCQlzZXRQcmVjaXNpb24oKEludGVnZXIpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRToKLQkJCQlzZXRTY2FsZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX0xFTkdUSDoKLQkJCQlzZXRMZW5ndGgoTEVOR1RIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fUFJFQ0lTSU9OOgotCQkJCXNldFByZWNpc2lvbihQUkVDSVNJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19TQ0FMRToKLQkJCQlzZXRTY2FsZShTQ0FMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09MVU1OX19MRU5HVEg6Ci0JCQkJcmV0dXJuIExFTkdUSF9FREVGQVVMVCA9PSBudWxsID8gbGVuZ3RoICE9IG51bGwgOiAhTEVOR1RIX0VERUZBVUxULmVxdWFscyhsZW5ndGgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT0xVTU5fX1BSRUNJU0lPTjoKLQkJCQlyZXR1cm4gUFJFQ0lTSU9OX0VERUZBVUxUID09IG51bGwgPyBwcmVjaXNpb24gIT0gbnVsbCA6ICFQUkVDSVNJT05fRURFRkFVTFQuZXF1YWxzKHByZWNpc2lvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTFVNTl9fU0NBTEU6Ci0JCQkJcmV0dXJuIFNDQUxFX0VERUZBVUxUID09IG51bGwgPyBzY2FsZSAhPSBudWxsIDogIVNDQUxFX0VERUZBVUxULmVxdWFscyhzY2FsZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxlbmd0aDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobGVuZ3RoKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwcmVjaXNpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByZWNpc2lvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc2NhbGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjYWxlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRVbmlxdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE51bGxhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnNlcnRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRMZW5ndGhUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByZWNpc2lvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NhbGVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZExlbmd0aFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTEVOR1RILCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb2x1bW5fTGVuZ3RoKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByZWNpc2lvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUFJFQ0lTSU9OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb2x1bW5fUHJlY2lzaW9uKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNjYWxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5TQ0FMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29sdW1uX1NjYWxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBDb2x1bW5JbXBsCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGlibGVNYXBwaW5nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sQ29udmVydGlibGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNWFkYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbENvbnZlcnRpYmxlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBDb252ZXJ0aWJsZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNpc0xvYiA8ZW0+TG9iPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2dldEVudW1lcmF0ZWQgPGVtPkVudW1lcmF0ZWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbENvbnZlcnRpYmxlTWFwcGluZyBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNMb2IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGlibGVNYXBwaW5nI2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvYihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldEVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFbnVtVHlwZSBnZXRFbnVtZXJhdGVkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZyNnZXRFbnVtZXJhdGVkIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRFbnVtZXJhdGVkKEVudW1UeXBlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBlbnVtZXJhdGVkIGVsZW1lbnQuICBJZiB0aGUgZW51bWVyYXRlZCBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBiYXNpYyBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRFbnVtZXJhdGVkVGV4dFJhbmdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIHRlbXBvcmFsIGVsZW1lbnQuICBJZiB0aGUgdGVtcG9yYWwgZWxlbWVudCAKLQkgKiBkb2VzIG5vdCBleGlzdCByZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgYmFzaWMgZWxlbWVudC4KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0VGVtcG9yYWxUZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgbG9iIGVsZW1lbnQuICBJZiB0aGUgbG9iIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGJhc2ljIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldExvYlRleHRSYW5nZSgpOwotCi19IC8vIENvbnZlcnRhYmxlTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxEaXNjcmltaW5hdG9yQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZWU2NWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbERpc2NyaW1pbmF0b3JDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRGlzY3JpbWluYXRvckNvbHVtbigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxEaXNjcmltaW5hdG9yQ29sdW1uIGV4dGVuZHMgQWJzdHJhY3RYbWxCYXNlRGlzY3JpbWluYXRvckNvbHVtbgotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxEaXNjcmltaW5hdG9yQ29sdW1uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0RJU0NSSU1JTkFUT1JfQ09MVU1OOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQllbGVtZW50TmFtZSwKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGlzY3JpbWluYXRvclR5cGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtbkRlZmluaXRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZExlbmd0aFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQotfSAvLyBEaXNjcmltaW5hdG9yQ29sdW1uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWFlNTAzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb248L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVsZW1lbnRDb2xsZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0JfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGxvYiA9IExPQl9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBURU1QT1JBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wb3JhbCgpIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwgPSBURU1QT1JBTF9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEVudW1UeXBlIEVOVU1FUkFURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW51bWVyYXRlZCgpIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bVR5cGUgZW51bWVyYXRlZCA9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcmRlckNvbHVtbigpIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9yZGVyQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT3JkZXJDb2x1bW4gb3JkZXJDb2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERVJfQllfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JkZXJCeSgpIDxlbT5PcmRlciBCeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBvcmRlckJ5ID0gT1JERVJfQllfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSA8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBUZW1wb3JhbFR5cGUgTUFQX0tFWV9URU1QT1JBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlUZW1wb3JhbCgpIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSBtYXBLZXlUZW1wb3JhbCA9IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnVtVHlwZSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleUVudW1lcmF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbnVtVHlwZSBtYXBLZXlFbnVtZXJhdGVkID0gTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRhcmdldENsYXNzKCkgPGVtPlRhcmdldCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DTEFTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYXJnZXRDbGFzcygpIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhcmdldENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldENsYXNzID0gVEFSR0VUX0NMQVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRmV0Y2hUeXBlIEZFVENIX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZldGNoKCkgPGVtPkZldGNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEZldGNoVHlwZSBmZXRjaCA9IEZFVENIX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5KCkgPGVtPk1hcCBLZXk8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcEtleSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIE1hcEtleSBtYXBLZXk7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBLZXlDbGFzcygpIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIG1hcEtleUNsYXNzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Q29sdW1uKCkgPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBLZXlDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb2x1bW4gbWFwS2V5Q29sdW1uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKSA8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKb2luQ29sdW1uPiBtYXBLZXlKb2luQ29sdW1uczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2xsZWN0aW9uVGFibGUoKSA8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q29sbGVjdGlvblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ29sbGVjdGlvblRhYmxlIGNvbGxlY3Rpb25UYWJsZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxFbGVtZW50Q29sbGVjdGlvbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTEVNRU5UX0NPTExFQ1RJT047Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9iPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRMb2IoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfTG9iKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xvYigpCi0JewotCQlyZXR1cm4gbG9iOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jaXNMb2IgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9iPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0xvYigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvYihib29sZWFuIG5ld0xvYikKLQl7Ci0JCWJvb2xlYW4gb2xkTG9iID0gbG9iOwotCQlsb2IgPSBuZXdMb2I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9CLCBvbGRMb2IsIGxvYikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGVtcG9yYWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUKLQkgKiBAc2VlICNzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRUZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gdGVtcG9yYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRUZW1wb3JhbCA8ZW0+VGVtcG9yYWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZW1wb3JhbChUZW1wb3JhbFR5cGUgbmV3VGVtcG9yYWwpCi0JewotCQlUZW1wb3JhbFR5cGUgb2xkVGVtcG9yYWwgPSB0ZW1wb3JhbDsKLQkJdGVtcG9yYWwgPSBuZXdUZW1wb3JhbCA9PSBudWxsID8gVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdUZW1wb3JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19URU1QT1JBTCwgb2xkVGVtcG9yYWwsIHRlbXBvcmFsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlICNzZXRFbnVtZXJhdGVkKEVudW1UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19FbnVtZXJhdGVkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKQotCXsKLQkJcmV0dXJuIGVudW1lcmF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRFbnVtZXJhdGVkIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSBuZXdFbnVtZXJhdGVkKQotCXsKLQkJRW51bVR5cGUgb2xkRW51bWVyYXRlZCA9IGVudW1lcmF0ZWQ7Ci0JCWVudW1lcmF0ZWQgPSBuZXdFbnVtZXJhdGVkID09IG51bGwgPyBFTlVNRVJBVEVEX0VERUZBVUxUIDogbmV3RW51bWVyYXRlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19FTlVNRVJBVEVELCBvbGRFbnVtZXJhdGVkLCBlbnVtZXJhdGVkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYXJnZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYXJnZXRDbGFzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX1RhcmdldENsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0Q2xhc3MoKQotCXsKLQkJcmV0dXJuIHRhcmdldENsYXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0VGFyZ2V0Q2xhc3MgPGVtPlRhcmdldCBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFyZ2V0IENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYXJnZXRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldENsYXNzKFN0cmluZyBuZXdUYXJnZXRDbGFzcykKLQl7Ci0JCVN0cmluZyBvbGRUYXJnZXRDbGFzcyA9IHRhcmdldENsYXNzOwotCQl0YXJnZXRDbGFzcyA9IG5ld1RhcmdldENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUywgb2xkVGFyZ2V0Q2xhc3MsIHRhcmdldENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GZXRjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZQotCSAqIEBzZWUgI3NldEZldGNoKEZldGNoVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfRmV0Y2goKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRmV0Y2hUeXBlIGdldEZldGNoKCkKLQl7Ci0JCXJldHVybiBmZXRjaDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmV0Y2g8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUKLQkgKiBAc2VlICNnZXRGZXRjaCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZldGNoKEZldGNoVHlwZSBuZXdGZXRjaCkKLQl7Ci0JCUZldGNoVHlwZSBvbGRGZXRjaCA9IGZldGNoOwotCQlmZXRjaCA9IG5ld0ZldGNoID09IG51bGwgPyBGRVRDSF9FREVGQVVMVCA6IG5ld0ZldGNoOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENILCBvbGRGZXRjaCwgZmV0Y2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5PcmRlciBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE9yZGVyQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9yZGVyYWJsZV9PcmRlckJ5KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJCeSgpCi0JewotCQlyZXR1cm4gb3JkZXJCeTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9yZGVyQnkoU3RyaW5nIG5ld09yZGVyQnkpCi0JewotCQlTdHJpbmcgb2xkT3JkZXJCeSA9IG9yZGVyQnk7Ci0JCW9yZGVyQnkgPSBuZXdPcmRlckJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZLCBvbGRPcmRlckJ5LCBvcmRlckJ5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfQXR0cmlidXRlT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkKLQl7Ci0JCWlmIChhdHRyaWJ1dGVPdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPihYbWxBdHRyaWJ1dGVPdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCXsKLQkJaWYgKGFzc29jaWF0aW9uT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEFzc29jaWF0aW9uT3ZlcnJpZGU+KFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JewotCQlpZiAobWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID09IG51bGwpCi0JCXsKLQkJCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4oWG1sQXR0cmlidXRlT3ZlcnJpZGUuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJfQotCQlyZXR1cm4gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9yZGVyIENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0T3JkZXJDb2x1bW4oWG1sT3JkZXJDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JkZXJhYmxlXzJfMF9PcmRlckNvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sT3JkZXJDb2x1bW4gZ2V0T3JkZXJDb2x1bW4oKQotCXsKLQkJcmV0dXJuIG9yZGVyQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE9yZGVyQ29sdW1uKFhtbE9yZGVyQ29sdW1uIG5ld09yZGVyQ29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sT3JkZXJDb2x1bW4gb2xkT3JkZXJDb2x1bW4gPSBvcmRlckNvbHVtbjsKLQkJb3JkZXJDb2x1bW4gPSBuZXdPcmRlckNvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4sIG9sZE9yZGVyQ29sdW1uLCBuZXdPcmRlckNvbHVtbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRPcmRlckNvbHVtbiA8ZW0+T3JkZXIgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE9yZGVyQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JkZXJDb2x1bW4oWG1sT3JkZXJDb2x1bW4gbmV3T3JkZXJDb2x1bW4pCi0JewotCQlpZiAobmV3T3JkZXJDb2x1bW4gIT0gb3JkZXJDb2x1bW4pCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG9yZGVyQ29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW9yZGVyQ29sdW1uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld09yZGVyQ29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld09yZGVyQ29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0T3JkZXJDb2x1bW4obmV3T3JkZXJDb2x1bW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU4sIG5ld09yZGVyQ29sdW1uLCBuZXdPcmRlckNvbHVtbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXk8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5KE1hcEtleSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBNYXBLZXkgZ2V0TWFwS2V5KCkKLQl7Ci0JCXJldHVybiBtYXBLZXk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5KE1hcEtleSBuZXdNYXBLZXksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlNYXBLZXkgb2xkTWFwS2V5ID0gbWFwS2V5OwotCQltYXBLZXkgPSBuZXdNYXBLZXk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWSwgb2xkTWFwS2V5LCBuZXdNYXBLZXkpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNYXBLZXkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXkoTWFwS2V5IG5ld01hcEtleSkKLQl7Ci0JCWlmIChuZXdNYXBLZXkgIT0gbWFwS2V5KQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChtYXBLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFwS2V5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdNYXBLZXkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TWFwS2V5KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hcEtleShuZXdNYXBLZXksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZLCBuZXdNYXBLZXksIG5ld01hcEtleSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5Q2xhc3MoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNsYXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxDbGFzc1JlZmVyZW5jZSBnZXRNYXBLZXlDbGFzcygpCi0JewotCQlyZXR1cm4gbWFwS2V5Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0TWFwS2V5Q2xhc3MoWG1sQ2xhc3NSZWZlcmVuY2UgbmV3TWFwS2V5Q2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxDbGFzc1JlZmVyZW5jZSBvbGRNYXBLZXlDbGFzcyA9IG1hcEtleUNsYXNzOwotCQltYXBLZXlDbGFzcyA9IG5ld01hcEtleUNsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1MsIG9sZE1hcEtleUNsYXNzLCBuZXdNYXBLZXlDbGFzcyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXBLZXlDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSBuZXdNYXBLZXlDbGFzcykKLQl7Ci0JCWlmIChuZXdNYXBLZXlDbGFzcyAhPSBtYXBLZXlDbGFzcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFwS2V5Q2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbWFwS2V5Q2xhc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hcEtleUNsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld01hcEtleUNsYXNzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hcEtleUNsYXNzKG5ld01hcEtleUNsYXNzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUywgbmV3TWFwS2V5Q2xhc3MsIG5ld01hcEtleUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldE1hcEtleVRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleVRlbXBvcmFsKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZSBnZXRNYXBLZXlUZW1wb3JhbCgpCi0JewotCQlyZXR1cm4gbWFwS2V5VGVtcG9yYWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldE1hcEtleVRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld01hcEtleVRlbXBvcmFsKQotCXsKLQkJVGVtcG9yYWxUeXBlIG9sZE1hcEtleVRlbXBvcmFsID0gbWFwS2V5VGVtcG9yYWw7Ci0JCW1hcEtleVRlbXBvcmFsID0gbmV3TWFwS2V5VGVtcG9yYWwgPT0gbnVsbCA/IE1BUF9LRVlfVEVNUE9SQUxfRURFRkFVTFQgOiBuZXdNYXBLZXlUZW1wb3JhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMLCBvbGRNYXBLZXlUZW1wb3JhbCwgbWFwS2V5VGVtcG9yYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMF9NYXBLZXlFbnVtZXJhdGVkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudW1UeXBlIGdldE1hcEtleUVudW1lcmF0ZWQoKQotCXsKLQkJcmV0dXJuIG1hcEtleUVudW1lcmF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRNYXBLZXlFbnVtZXJhdGVkIDxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjZ2V0TWFwS2V5RW51bWVyYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUgbmV3TWFwS2V5RW51bWVyYXRlZCkKLQl7Ci0JCUVudW1UeXBlIG9sZE1hcEtleUVudW1lcmF0ZWQgPSBtYXBLZXlFbnVtZXJhdGVkOwotCQltYXBLZXlFbnVtZXJhdGVkID0gbmV3TWFwS2V5RW51bWVyYXRlZCA9PSBudWxsID8gTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUIDogbmV3TWFwS2V5RW51bWVyYXRlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0VOVU1FUkFURUQsIG9sZE1hcEtleUVudW1lcmF0ZWQsIG1hcEtleUVudW1lcmF0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1hcEtleUNvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldE1hcEtleUNvbHVtbigpCi0JewotCQlyZXR1cm4gbWFwS2V5Q29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE1hcEtleUNvbHVtbihYbWxDb2x1bW4gbmV3TWFwS2V5Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZE1hcEtleUNvbHVtbiA9IG1hcEtleUNvbHVtbjsKLQkJbWFwS2V5Q29sdW1uID0gbmV3TWFwS2V5Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OLCBvbGRNYXBLZXlDb2x1bW4sIG5ld01hcEtleUNvbHVtbik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbiNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbiBuZXdNYXBLZXlDb2x1bW4pCi0JewotCQlpZiAobmV3TWFwS2V5Q29sdW1uICE9IG1hcEtleUNvbHVtbikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAobWFwS2V5Q29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW1hcEtleUNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld01hcEtleUNvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdNYXBLZXlDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldE1hcEtleUNvbHVtbihuZXdNYXBLZXlDb2x1bW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTFVNTiwgbmV3TWFwS2V5Q29sdW1uLCBuZXdNYXBLZXlDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKG1hcEtleUpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCW1hcEtleUpvaW5Db2x1bW5zID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEpvaW5Db2x1bW4+KFhtbEpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBtYXBLZXlKb2luQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCi0JewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTiwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRWxlbWVudENvbGxlY3Rpb24jZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4pCi0JewotCQlpZiAobmV3Q29sdW1uICE9IGNvbHVtbikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdDb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3Q29sdW1uKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Q29sdW1uKG5ld0NvbHVtbiwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTiwgbmV3Q29sdW1uLCBuZXdDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2xsZWN0aW9uIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2xsZWN0aW9uIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbGxlY3Rpb24gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbGxlY3Rpb25UYWJsZShYbWxDb2xsZWN0aW9uVGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbGxlY3Rpb25UYWJsZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sbGVjdGlvblRhYmxlIGdldENvbGxlY3Rpb25UYWJsZSgpCi0JewotCQlyZXR1cm4gY29sbGVjdGlvblRhYmxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbGxlY3Rpb25UYWJsZShYbWxDb2xsZWN0aW9uVGFibGUgbmV3Q29sbGVjdGlvblRhYmxlLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIG9sZENvbGxlY3Rpb25UYWJsZSA9IGNvbGxlY3Rpb25UYWJsZTsKLQkJY29sbGVjdGlvblRhYmxlID0gbmV3Q29sbGVjdGlvblRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEUsIG9sZENvbGxlY3Rpb25UYWJsZSwgbmV3Q29sbGVjdGlvblRhYmxlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uI2dldENvbGxlY3Rpb25UYWJsZSA8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sbGVjdGlvblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sbGVjdGlvblRhYmxlKFhtbENvbGxlY3Rpb25UYWJsZSBuZXdDb2xsZWN0aW9uVGFibGUpCi0JewotCQlpZiAobmV3Q29sbGVjdGlvblRhYmxlICE9IGNvbGxlY3Rpb25UYWJsZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29sbGVjdGlvblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbGxlY3Rpb25UYWJsZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29sbGVjdGlvblRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbGxlY3Rpb25UYWJsZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb2xsZWN0aW9uVGFibGUobmV3Q29sbGVjdGlvblRhYmxlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRSwgbmV3Q29sbGVjdGlvblRhYmxlLCBuZXdDb2xsZWN0aW9uVGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0T3JkZXJDb2x1bW4obnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWToKLQkJCQlyZXR1cm4gYmFzaWNTZXRNYXBLZXkobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNYXBLZXlDbGFzcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NPTFVNTjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRNYXBLZXlDb2x1bW4obnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFOgotCQkJCXJldHVybiBiYXNpY1NldENvbGxlY3Rpb25UYWJsZShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTE9COgotCQkJCXJldHVybiBpc0xvYigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMOgotCQkJCXJldHVybiBnZXRUZW1wb3JhbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQ6Ci0JCQkJcmV0dXJuIGdldEVudW1lcmF0ZWQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU46Ci0JCQkJcmV0dXJuIGdldE9yZGVyQ29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk6Ci0JCQkJcmV0dXJuIGdldE9yZGVyQnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMOgotCQkJCXJldHVybiBnZXRNYXBLZXlUZW1wb3JhbCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRDoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5RW51bWVyYXRlZCgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0VGFyZ2V0Q2xhc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19GRVRDSDoKLQkJCQlyZXR1cm4gZ2V0RmV0Y2goKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZOgotCQkJCXJldHVybiBnZXRNYXBLZXkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTOgotCQkJCXJldHVybiBnZXRNYXBLZXlDbGFzcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOgotCQkJCXJldHVybiBnZXRNYXBLZXlDb2x1bW4oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xVTU46Ci0JCQkJcmV0dXJuIGdldENvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEU6Ci0JCQkJcmV0dXJuIGdldENvbGxlY3Rpb25UYWJsZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0I6Ci0JCQkJc2V0TG9iKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUw6Ci0JCQkJc2V0VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0VOVU1FUkFURUQ6Ci0JCQkJc2V0RW51bWVyYXRlZCgoRW51bVR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU46Ci0JCQkJc2V0T3JkZXJDb2x1bW4oKFhtbE9yZGVyQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk6Ci0JCQkJc2V0T3JkZXJCeSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXR0cmlidXRlT3ZlcnJpZGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sQXNzb2NpYXRpb25PdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUw6Ci0JCQkJc2V0TWFwS2V5VGVtcG9yYWwoKFRlbXBvcmFsVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRDoKLQkJCQlzZXRNYXBLZXlFbnVtZXJhdGVkKChFbnVtVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RBUkdFVF9DTEFTUzoKLQkJCQlzZXRUYXJnZXRDbGFzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0g6Ci0JCQkJc2V0RmV0Y2goKEZldGNoVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk6Ci0JCQkJc2V0TWFwS2V5KChNYXBLZXkpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTOgotCQkJCXNldE1hcEtleUNsYXNzKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOgotCQkJCXNldE1hcEtleUNvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldE1hcEtleUpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEU6Ci0JCQkJc2V0Q29sbGVjdGlvblRhYmxlKChYbWxDb2xsZWN0aW9uVGFibGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0I6Ci0JCQkJc2V0TG9iKExPQl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX1RFTVBPUkFMOgotCQkJCXNldFRlbXBvcmFsKFRFTVBPUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRU5VTUVSQVRFRDoKLQkJCQlzZXRFbnVtZXJhdGVkKEVOVU1FUkFURURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU46Ci0JCQkJc2V0T3JkZXJDb2x1bW4oKFhtbE9yZGVyQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9CWToKLQkJCQlzZXRPcmRlckJ5KE9SREVSX0JZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9URU1QT1JBTDoKLQkJCQlzZXRNYXBLZXlUZW1wb3JhbChNQVBfS0VZX1RFTVBPUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEOgotCQkJCXNldE1hcEtleUVudW1lcmF0ZWQoTUFQX0tFWV9FTlVNRVJBVEVEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOgotCQkJCXNldFRhcmdldENsYXNzKFRBUkdFVF9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOgotCQkJCXNldEZldGNoKEZFVENIX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWToKLQkJCQlzZXRNYXBLZXkoKE1hcEtleSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DTEFTUzoKLQkJCQlzZXRNYXBLZXlDbGFzcygoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ09MVU1OOgotCQkJCXNldE1hcEtleUNvbHVtbigoWG1sQ29sdW1uKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRNYXBLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MTEVDVElPTl9UQUJMRToKLQkJCQlzZXRDb2xsZWN0aW9uVGFibGUoKFhtbENvbGxlY3Rpb25UYWJsZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0xPQjoKLQkJCQlyZXR1cm4gbG9iICE9IExPQl9FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRU5VTUVSQVRFRDoKLQkJCQlyZXR1cm4gZW51bWVyYXRlZCAhPSBFTlVNRVJBVEVEX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0NPTFVNTjoKLQkJCQlyZXR1cm4gb3JkZXJDb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9CWToKLQkJCQlyZXR1cm4gT1JERVJfQllfRURFRkFVTFQgPT0gbnVsbCA/IG9yZGVyQnkgIT0gbnVsbCA6ICFPUkRFUl9CWV9FREVGQVVMVC5lcXVhbHMob3JkZXJCeSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZU92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgIT0gbnVsbCAmJiAhbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMOgotCQkJCXJldHVybiBtYXBLZXlUZW1wb3JhbCAhPSBNQVBfS0VZX1RFTVBPUkFMX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRDoKLQkJCQlyZXR1cm4gbWFwS2V5RW51bWVyYXRlZCAhPSBNQVBfS0VZX0VOVU1FUkFURURfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOgotCQkJCXJldHVybiBUQVJHRVRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHRhcmdldENsYXNzICE9IG51bGwgOiAhVEFSR0VUX0NMQVNTX0VERUZBVUxULmVxdWFscyh0YXJnZXRDbGFzcyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRkVUQ0g6Ci0JCQkJcmV0dXJuIGZldGNoICE9IEZFVENIX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk6Ci0JCQkJcmV0dXJuIG1hcEtleSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M6Ci0JCQkJcmV0dXJuIG1hcEtleUNsYXNzICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU46Ci0JCQkJcmV0dXJuIG1hcEtleUNvbHVtbiAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBtYXBLZXlKb2luQ29sdW1ucyAhPSBudWxsICYmICFtYXBLZXlKb2luQ29sdW1ucy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOgotCQkJCXJldHVybiBjb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFOgotCQkJCXJldHVybiBjb2xsZWN0aW9uVGFibGUgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0xPQjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT3JkZXJhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19PUkRFUl9DT0xVTU46IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJBQkxFXzIwX19PUkRFUl9DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT3JkZXJhYmxlLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX09SREVSX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT1JERVJBQkxFX19PUkRFUl9CWTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl9fQVRUUklCVVRFX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX1RFTVBPUkFMOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQ09OVkVSVElCTEVfTUFQUElOR18yMF9fTUFQX0tFWV9URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9FTlVNRVJBVEVEOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX01BUF9LRVlfQ09OVkVSVElCTEVfTUFQUElOR18yMF9fTUFQX0tFWV9FTlVNRVJBVEVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19UQVJHRVRfQ0xBU1M6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19UQVJHRVRfQ0xBU1M7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fRkVUQ0g7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVk6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19NQVBfS0VZX0NMQVNTOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9DTEFTUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU46IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NPTFVNTjsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlM6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fQ09MVU1OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MVU1OOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19DT0xMRUNUSU9OX1RBQkxFOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MTEVDVElPTl9UQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9COiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19MT0I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OX19FTlVNRVJBVEVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyYWJsZV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUkFCTEVfMjBfX09SREVSX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyYWJsZS5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJBQkxFX19PUkRFUl9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fT1JERVJfQlk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FUVFJJQlVURV9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjBfX01BUF9LRVlfVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfTUFQX0tFWV9DT05WRVJUSUJMRV9NQVBQSU5HXzIwX19NQVBfS0VZX0VOVU1FUkFURUQ6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfRU5VTUVSQVRFRDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RBUkdFVF9DTEFTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fVEFSR0VUX0NMQVNTOwotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fRkVUQ0g6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0ZFVENIOwotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWTsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQ0xBU1M6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX01BUF9LRVlfQ0xBU1M7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9DT0xVTU47Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VMRU1FTlRfQ09MTEVDVElPTl9fTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTFVNTjsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTExFQ1RJT05fVEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTEVNRU5UX0NPTExFQ1RJT05fX0NPTExFQ1RJT05fVEFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChsb2I6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvYik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdGVtcG9yYWw6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRlbXBvcmFsKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBlbnVtZXJhdGVkOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChlbnVtZXJhdGVkKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBvcmRlckJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChvcmRlckJ5KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBtYXBLZXlUZW1wb3JhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQobWFwS2V5VGVtcG9yYWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG1hcEtleUVudW1lcmF0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG1hcEtleUVudW1lcmF0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRhcmdldENsYXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0YXJnZXRDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZmV0Y2g6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZldGNoKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogWG1sQXR0cmlidXRlTWFwcGluZyBpbXBsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdmFsaWRhdGlvbiBzdXBwb3J0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEyXzAuRU5VTUVSQVRFRCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQTJfMC5MT0IpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFRlbXBvcmFsVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQTJfMC5URU1QT1JBTCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VGFyZ2V0Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBMl8wLlRBUkdFVF9DTEFTUyk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRNYXBLZXlFbnVtZXJhdGVkVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwS2V5VGVtcG9yYWxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUwpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TWFwS2V5Q2xhc3NUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50VGV4dFJhbmdlKEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFyZ2V0Q2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQnlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9yZGVyQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDb2x1bW4oKSksCi0JCQlYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpKSwKLQkJCVhtbENvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkNPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2x1bW4oKSksCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRMb2JUcmFuc2xhdG9yKCksCi0JCQlidWlsZEF0dHJpYnV0ZU92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpLAotCQkJWG1sQ29sbGVjdGlvblRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2xsZWN0aW9uVGFibGUoKSkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFyZ2V0Q2xhc3NUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLlRBUkdFVF9DTEFTUywgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9UYXJnZXRDbGFzcygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRGZXRjaFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuRkVUQ0gsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfRmV0Y2goKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3JkZXJCeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuT1JERVJfQlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9yZGVyYWJsZV9PcmRlckJ5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPcmRlckNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxPcmRlckNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLk9SREVSX0NPTFVNTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9yZGVyYWJsZV8yXzBfT3JkZXJDb2x1bW4oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5DT0xVTU4sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sdW1uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRMb2JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkxPQiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0xvYigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGVtcG9yYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlRFTVBPUkFMLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfVGVtcG9yYWwoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEVudW1lcmF0ZWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkVOVU1FUkFURUQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENvbnZlcnRpYmxlTWFwcGluZ19FbnVtZXJhdGVkKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gTWFwS2V5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTUFQX0tFWSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXkoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihKUEEyXzAuTUFQX0tFWV9DTEFTUywgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5VGVtcG9yYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUwsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRNYXBLZXlFbnVtZXJhdGVkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleUVudW1lcmF0ZWQoKSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQXR0cmlidXRlT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQTJfMC5NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioKLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVUYXJnZXRDbGFzc0VkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gb3JpZ2luYWxUeXBlLmdldEVsZW1lbnROYW1lKCk7Ci0JCWludCBuYW1lSW5kZXggPSB0aGlzLnRhcmdldENsYXNzLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEpQQTJfMC5UQVJHRVRfQ0xBU1MpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7Ci0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVNYXBLZXlDbGFzc0VkaXQoSVR5cGUgb3JpZ2luYWxUeXBlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlyZXR1cm4gZ2V0TWFwS2V5Q2xhc3MoKS5jcmVhdGVSZW5hbWVFZGl0KG9yaWdpbmFsVHlwZSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVRhcmdldENsYXNzUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJaW50IHBhY2thZ2VMZW5ndGggPSB0aGlzLnRhcmdldENsYXNzLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEpQQTJfMC5UQVJHRVRfQ0xBU1MpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7IC8vICsxID0gb3BlbmluZyBkb3VibGUgcXVvdGUKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIHBhY2thZ2VMZW5ndGgsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVNYXBLZXlDbGFzc1BhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCXJldHVybiBnZXRNYXBLZXlDbGFzcygpLmNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KG5ld05hbWUpOwkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhjNzM2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtYmVkZGFibGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbWJlZGRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEVtYmVkZGFibGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nCi17Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBYbWxFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgZUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERBQkxFOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg2ZWI4ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW1iZWRkZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW1iZWRkZWRfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVtYmVkZGVkPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW1iZWRkZWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWQgZXh0ZW5kcyBBYnN0cmFjdFhtbEVtYmVkZGVkIGltcGxlbWVudHMgWG1sRW1iZWRkZWRfMl8wCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSA8ZW0+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkZWQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU1CRURERUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JewotCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FTU09DSUFUSU9OX09WRVJSSURFUyk7Ci0JCX0KLQkJcmV0dXJuIGFzc29jaWF0aW9uT3ZlcnJpZGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTUJFRERFRF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VNQkVEREVEX19BU1NPQ0lBVElPTl9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZF8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU1CRURERURfX0FTU09DSUFUSU9OX09WRVJSSURFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFbWJlZGRlZF8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlLmJ1aWxkVHJhbnNsYXRvcihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJfQXNzb2NpYXRpb25PdmVycmlkZXMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFbWJlZGRlZElkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2NWVlYTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEVtYmVkZGVkSWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbWJlZGRlZCBJZDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVtYmVkZGVkSWQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sRW1iZWRkZWRJZCBleHRlbmRzIEFic3RyYWN0WG1sRW1iZWRkZWQKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW1iZWRkZWRJZCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9FTUJFRERFRF9JRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJmNThjMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U2Vjb25kYXJ5VGFibGVzIDxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldERpc2NyaW1pbmF0b3JDb2x1bW4gPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdHkgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIGltcGxlbWVudHMgWG1sUXVlcnlDb250YWluZXIsIFhtbEdlbmVyYXRvckNvbnRhaW5lciwgWG1sRXZlbnRNZXRob2RDb250YWluZXIsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBYbWxFbnRpdHlfMl8wLCBYbWxJZENsYXNzQ29udGFpbmVyCi17Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZFF1ZXJpZXMoKSA8ZW0+TmFtZWQgUXVlcmllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lZFF1ZXJpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGVHZW5lcmF0b3IoKSA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJlUGVyc2lzdCgpIDxlbT5QcmUgUGVyc2lzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJlUGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFByZVBlcnNpc3QgcHJlUGVyc2lzdDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RQZXJzaXN0KCkgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdFBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb3N0UGVyc2lzdCBwb3N0UGVyc2lzdDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZVJlbW92ZSgpIDxlbT5QcmUgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcmVSZW1vdmUgcHJlUmVtb3ZlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdFJlbW92ZSgpIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdFJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RSZW1vdmUgcG9zdFJlbW92ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByZVVwZGF0ZSgpIDxlbT5QcmUgVXBkYXRlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmVVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQcmVVcGRhdGUgcHJlVXBkYXRlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9zdFVwZGF0ZSgpIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdFVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFBvc3RVcGRhdGUgcG9zdFVwZGF0ZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBvc3RMb2FkKCkgPGVtPlBvc3QgTG9hZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UG9zdExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBQb3N0TG9hZCBwb3N0TG9hZDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpIDxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIDxlbT5Bc3NvY2lhdGlvbiBPdmVycmlkZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYWNoZWFibGUoKSA8ZW0+Q2FjaGVhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQUNIRUFCTEVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2FjaGVhYmxlKCkgPGVtPkNhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2FjaGVhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBjYWNoZWFibGUgPSBDQUNIRUFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJZENsYXNzKCkgPGVtPklkIENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRJZENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sQ2xhc3NSZWZlcmVuY2UgaWRDbGFzczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVGFibGUgdGFibGU7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZWNvbmRhcnlUYWJsZXMoKSA8ZW0+U2Vjb25kYXJ5IFRhYmxlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZWNvbmRhcnlUYWJsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5oZXJpdGFuY2UoKSA8ZW0+SW5oZXJpdGFuY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaGVyaXRhbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2UgaW5oZXJpdGFuY2U7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQ1JJTUlOQVRPUl9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjcmltaW5hdG9yVmFsdWUoKSA8ZW0+RGlzY3JpbWluYXRvciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IERJU0NSSU1JTkFUT1JfVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREaXNjcmltaW5hdG9yQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRGlzY3JpbWluYXRvckNvbHVtbiBkaXNjcmltaW5hdG9yQ29sdW1uOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBzcWxSZXN1bHRTZXRNYXBwaW5nczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkgPGVtPkV4Y2x1ZGUgRGVmYXVsdCBMaXN0ZW5lcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzID0gRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTX0VERUZBVUxUID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzID0gRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eUxpc3RlbmVycygpIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbnRpdHlMaXN0ZW5lcnMgZW50aXR5TGlzdGVuZXJzOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEVudGl0eSgpCi0JewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgWG1sRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIGVDb250YWluZXIoKTsKLQl9Ci0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0VOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFibGUoWG1sVGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1RhYmxlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxUYWJsZSBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0VGFibGUoWG1sVGFibGUgbmV3VGFibGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxUYWJsZSBvbGRUYWJsZSA9IHRhYmxlOwotCQl0YWJsZSA9IG5ld1RhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFLCBvbGRUYWJsZSwgbmV3VGFibGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGUoWG1sVGFibGUgbmV3VGFibGUpCi0JewotCQlpZiAobmV3VGFibGUgIT0gdGFibGUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHRhYmxlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXRhYmxlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3VGFibGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3VGFibGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhYmxlKG5ld1RhYmxlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEUsIG5ld1RhYmxlLCBuZXdUYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNlY29uZGFyeSBUYWJsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlY29uZGFyeVRhYmxlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlY29uZGFyeSBUYWJsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZWNvbmRhcnkgVGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFNlY29uZGFyeVRhYmxlPiBnZXRTZWNvbmRhcnlUYWJsZXMoKQotCXsKLQkJaWYgKHNlY29uZGFyeVRhYmxlcyA9PSBudWxsKQotCQl7Ci0JCQlzZWNvbmRhcnlUYWJsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sU2Vjb25kYXJ5VGFibGU+KFhtbFNlY29uZGFyeVRhYmxlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVMpOwotCQl9Ci0JCXJldHVybiBzZWNvbmRhcnlUYWJsZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X1ByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JewotCQlpZiAocHJpbWFyeUtleUpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SWRDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZENsYXNzQ29udGFpbmVyX0lkQ2xhc3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldElkQ2xhc3MoKQotCXsKLQkJcmV0dXJuIGlkQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SWRDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSBuZXdJZENsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xhc3NSZWZlcmVuY2Ugb2xkSWRDbGFzcyA9IGlkQ2xhc3M7Ci0JCWlkQ2xhc3MgPSBuZXdJZENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTLCBvbGRJZENsYXNzLCBuZXdJZENsYXNzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRJZENsYXNzIDxlbT5JZCBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldElkQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZENsYXNzKFhtbENsYXNzUmVmZXJlbmNlIG5ld0lkQ2xhc3MpCi0JewotCQlpZiAobmV3SWRDbGFzcyAhPSBpZENsYXNzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpZENsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWlkQ2xhc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJZENsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0lkQ2xhc3MpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldElkQ2xhc3MobmV3SWRDbGFzcywgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTLCBuZXdJZENsYXNzLCBuZXdJZENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5oZXJpdGFuY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaGVyaXRhbmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaGVyaXRhbmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRJbmhlcml0YW5jZShJbmhlcml0YW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfSW5oZXJpdGFuY2UoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEluaGVyaXRhbmNlIGdldEluaGVyaXRhbmNlKCkKLQl7Ci0JCXJldHVybiBpbmhlcml0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRJbmhlcml0YW5jZShJbmhlcml0YW5jZSBuZXdJbmhlcml0YW5jZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUluaGVyaXRhbmNlIG9sZEluaGVyaXRhbmNlID0gaW5oZXJpdGFuY2U7Ci0JCWluaGVyaXRhbmNlID0gbmV3SW5oZXJpdGFuY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UsIG9sZEluaGVyaXRhbmNlLCBuZXdJbmhlcml0YW5jZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0SW5oZXJpdGFuY2UgPGVtPkluaGVyaXRhbmNlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbmhlcml0YW5jZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0SW5oZXJpdGFuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbmhlcml0YW5jZShJbmhlcml0YW5jZSBuZXdJbmhlcml0YW5jZSkKLQl7Ci0JCWlmIChuZXdJbmhlcml0YW5jZSAhPSBpbmhlcml0YW5jZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoaW5oZXJpdGFuY2UgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpaW5oZXJpdGFuY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdJbmhlcml0YW5jZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdJbmhlcml0YW5jZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0UsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0SW5oZXJpdGFuY2UobmV3SW5oZXJpdGFuY2UsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRSwgbmV3SW5oZXJpdGFuY2UsIG5ld0luaGVyaXRhbmNlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EaXNjcmltaW5hdG9yIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREaXNjcmltaW5hdG9yVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNjcmltaW5hdG9yVmFsdWUoKQotCXsKLQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yVmFsdWUgPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2NyaW1pbmF0b3JWYWx1ZShTdHJpbmcgbmV3RGlzY3JpbWluYXRvclZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZERpc2NyaW1pbmF0b3JWYWx1ZSA9IGRpc2NyaW1pbmF0b3JWYWx1ZTsKLQkJZGlzY3JpbWluYXRvclZhbHVlID0gbmV3RGlzY3JpbWluYXRvclZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUUsIG9sZERpc2NyaW1pbmF0b3JWYWx1ZSwgZGlzY3JpbWluYXRvclZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGlzY3JpbWluYXRvciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRpc2NyaW1pbmF0b3IgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXREaXNjcmltaW5hdG9yQ29sdW1uKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5X0Rpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpCi0JewotCQlyZXR1cm4gZGlzY3JpbWluYXRvckNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXREaXNjcmltaW5hdG9yQ29sdW1uKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gbmV3RGlzY3JpbWluYXRvckNvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbERpc2NyaW1pbmF0b3JDb2x1bW4gb2xkRGlzY3JpbWluYXRvckNvbHVtbiA9IGRpc2NyaW1pbmF0b3JDb2x1bW47Ci0JCWRpc2NyaW1pbmF0b3JDb2x1bW4gPSBuZXdEaXNjcmltaW5hdG9yQ29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OLCBvbGREaXNjcmltaW5hdG9yQ29sdW1uLCBuZXdEaXNjcmltaW5hdG9yQ29sdW1uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXREaXNjcmltaW5hdG9yQ29sdW1uIDxlbT5EaXNjcmltaW5hdG9yIENvbHVtbjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGlzY3JpbWluYXRvciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERpc2NyaW1pbmF0b3JDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNjcmltaW5hdG9yQ29sdW1uKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4gbmV3RGlzY3JpbWluYXRvckNvbHVtbikKLQl7Ci0JCWlmIChuZXdEaXNjcmltaW5hdG9yQ29sdW1uICE9IGRpc2NyaW1pbmF0b3JDb2x1bW4pCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGRpc2NyaW1pbmF0b3JDb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZGlzY3JpbWluYXRvckNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0Rpc2NyaW1pbmF0b3JDb2x1bW4gIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RGlzY3JpbWluYXRvckNvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RGlzY3JpbWluYXRvckNvbHVtbihuZXdEaXNjcmltaW5hdG9yQ29sdW1uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU4sIG5ld0Rpc2NyaW1pbmF0b3JDb2x1bW4sIG5ld0Rpc2NyaW1pbmF0b3JDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9TZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igb2xkU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcjsKLQkJc2VxdWVuY2VHZW5lcmF0b3IgPSBuZXdTZXF1ZW5jZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1IsIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0U2VxdWVuY2VHZW5lcmF0b3IgPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIG5ld1NlcXVlbmNlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1NlcXVlbmNlR2VuZXJhdG9yICE9IHNlcXVlbmNlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChzZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdTZXF1ZW5jZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdTZXF1ZW5jZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SLCBuZXdTZXF1ZW5jZUdlbmVyYXRvciwgbmV3U2VxdWVuY2VHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVGFibGVHZW5lcmF0b3Igb2xkVGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcjsKLQkJdGFibGVHZW5lcmF0b3IgPSBuZXdUYWJsZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1IsIG9sZFRhYmxlR2VuZXJhdG9yLCBuZXdUYWJsZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0VGFibGVHZW5lcmF0b3IgPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yKQotCXsKLQkJaWYgKG5ld1RhYmxlR2VuZXJhdG9yICE9IHRhYmxlR2VuZXJhdG9yKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmICh0YWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCl0YWJsZUdlbmVyYXRvcikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUYWJsZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKG5ld1RhYmxlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SLCBuZXdUYWJsZUdlbmVyYXRvciwgbmV3VGFibGVHZW5lcmF0b3IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWRRdWVyeT4gZ2V0TmFtZWRRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZFF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWRRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkUXVlcnk+KFhtbE5hbWVkUXVlcnkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkKLQl7Ci0JCWlmIChuYW1lZE5hdGl2ZVF1ZXJpZXMgPT0gbnVsbCkKLQkJewotCQkJbmFtZWROYXRpdmVRdWVyaWVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+KFhtbE5hbWVkTmF0aXZlUXVlcnkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVMpOwotCQl9Ci0JCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlNxbFJlc3VsdFNldE1hcHBpbmd9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlfU3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFNxbFJlc3VsdFNldE1hcHBpbmc+IGdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQl7Ci0JCWlmIChzcWxSZXN1bHRTZXRNYXBwaW5ncyA9PSBudWxsKQotCQl7Ci0JCQlzcWxSZXN1bHRTZXRNYXBwaW5ncyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPihTcWxSZXN1bHRTZXRNYXBwaW5nLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTKTsKLQkJfQotCQlyZXR1cm4gc3FsUmVzdWx0U2V0TWFwcGluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JewotCQlyZXR1cm4gZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKGJvb2xlYW4gbmV3RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMpCi0JewotCQlib29sZWFuIG9sZEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzID0gZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnM7Ci0JCWV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzID0gbmV3RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUywgb2xkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMsIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JewotCQlyZXR1cm4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKGJvb2xlYW4gbmV3RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMpCi0JewotCQlib29sZWFuIG9sZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzID0gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JCWV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzID0gbmV3RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUywgb2xkRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMsIGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IExpc3RlbmVyczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbnRpdHlMaXN0ZW5lcnMoRW50aXR5TGlzdGVuZXJzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudGl0eUxpc3RlbmVycyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMoRW50aXR5TGlzdGVuZXJzIG5ld0VudGl0eUxpc3RlbmVycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUVudGl0eUxpc3RlbmVycyBvbGRFbnRpdHlMaXN0ZW5lcnMgPSBlbnRpdHlMaXN0ZW5lcnM7Ci0JCWVudGl0eUxpc3RlbmVycyA9IG5ld0VudGl0eUxpc3RlbmVyczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTLCBvbGRFbnRpdHlMaXN0ZW5lcnMsIG5ld0VudGl0eUxpc3RlbmVycyk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlMaXN0ZW5lcnMoRW50aXR5TGlzdGVuZXJzIG5ld0VudGl0eUxpc3RlbmVycykKLQl7Ci0JCWlmIChuZXdFbnRpdHlMaXN0ZW5lcnMgIT0gZW50aXR5TGlzdGVuZXJzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZW50aXR5TGlzdGVuZXJzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdFbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3RW50aXR5TGlzdGVuZXJzKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVudGl0eUxpc3RlbmVycyhuZXdFbnRpdHlMaXN0ZW5lcnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTLCBuZXdFbnRpdHlMaXN0ZW5lcnMsIG5ld0VudGl0eUxpc3RlbmVycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVBlcnNpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZVBlcnNpc3QgZ2V0UHJlUGVyc2lzdCgpCi0JewotCQlyZXR1cm4gcHJlUGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVQZXJzaXN0KFByZVBlcnNpc3QgbmV3UHJlUGVyc2lzdCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVByZVBlcnNpc3Qgb2xkUHJlUGVyc2lzdCA9IHByZVBlcnNpc3Q7Ci0JCXByZVBlcnNpc3QgPSBuZXdQcmVQZXJzaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNULCBvbGRQcmVQZXJzaXN0LCBuZXdQcmVQZXJzaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQcmVQZXJzaXN0IDxlbT5QcmUgUGVyc2lzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZVBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVQZXJzaXN0KFByZVBlcnNpc3QgbmV3UHJlUGVyc2lzdCkKLQl7Ci0JCWlmIChuZXdQcmVQZXJzaXN0ICE9IHByZVBlcnNpc3QpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHByZVBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlUGVyc2lzdCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1ByZVBlcnNpc3QgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlUGVyc2lzdCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJlUGVyc2lzdChuZXdQcmVQZXJzaXN0LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1QsIG5ld1ByZVBlcnNpc3QsIG5ld1ByZVBlcnNpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFBlcnNpc3Q8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RQZXJzaXN0KFBvc3RQZXJzaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RQZXJzaXN0KCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0UGVyc2lzdCBnZXRQb3N0UGVyc2lzdCgpCi0JewotCQlyZXR1cm4gcG9zdFBlcnNpc3Q7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QgbmV3UG9zdFBlcnNpc3QsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0UGVyc2lzdCBvbGRQb3N0UGVyc2lzdCA9IHBvc3RQZXJzaXN0OwotCQlwb3N0UGVyc2lzdCA9IG5ld1Bvc3RQZXJzaXN0OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVCwgb2xkUG9zdFBlcnNpc3QsIG5ld1Bvc3RQZXJzaXN0KTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0UGVyc2lzdCA8ZW0+UG9zdCBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFBlcnNpc3Q8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QgbmV3UG9zdFBlcnNpc3QpCi0JewotCQlpZiAobmV3UG9zdFBlcnNpc3QgIT0gcG9zdFBlcnNpc3QpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RQZXJzaXN0KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RQZXJzaXN0ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bvc3RQZXJzaXN0KS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1QsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdFBlcnNpc3QobmV3UG9zdFBlcnNpc3QsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1QsIG5ld1Bvc3RQZXJzaXN0LCBuZXdQb3N0UGVyc2lzdCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBSZW1vdmU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUmVtb3ZlKFByZVJlbW92ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVSZW1vdmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFByZVJlbW92ZSBnZXRQcmVSZW1vdmUoKQotCXsKLQkJcmV0dXJuIHByZVJlbW92ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcmVSZW1vdmUoUHJlUmVtb3ZlIG5ld1ByZVJlbW92ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVByZVJlbW92ZSBvbGRQcmVSZW1vdmUgPSBwcmVSZW1vdmU7Ci0JCXByZVJlbW92ZSA9IG5ld1ByZVJlbW92ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFLCBvbGRQcmVSZW1vdmUsIG5ld1ByZVJlbW92ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQcmVSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlIG5ld1ByZVJlbW92ZSkKLQl7Ci0JCWlmIChuZXdQcmVSZW1vdmUgIT0gcHJlUmVtb3ZlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwcmVSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcHJlUmVtb3ZlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcmVSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UHJlUmVtb3ZlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFByZVJlbW92ZShuZXdQcmVSZW1vdmUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFLCBuZXdQcmVSZW1vdmUsIG5ld1ByZVJlbW92ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RSZW1vdmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFBvc3RSZW1vdmUgZ2V0UG9zdFJlbW92ZSgpCi0JewotCQlyZXR1cm4gcG9zdFJlbW92ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQb3N0UmVtb3ZlKFBvc3RSZW1vdmUgbmV3UG9zdFJlbW92ZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVBvc3RSZW1vdmUgb2xkUG9zdFJlbW92ZSA9IHBvc3RSZW1vdmU7Ci0JCXBvc3RSZW1vdmUgPSBuZXdQb3N0UmVtb3ZlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFLCBvbGRQb3N0UmVtb3ZlLCBuZXdQb3N0UmVtb3ZlKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRQb3N0UmVtb3ZlIDxlbT5Qb3N0IFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBSZW1vdmU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RSZW1vdmUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0UmVtb3ZlKFBvc3RSZW1vdmUgbmV3UG9zdFJlbW92ZSkKLQl7Ci0JCWlmIChuZXdQb3N0UmVtb3ZlICE9IHBvc3RSZW1vdmUpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBvc3RSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpcG9zdFJlbW92ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld1Bvc3RSZW1vdmUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UG9zdFJlbW92ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkUsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UG9zdFJlbW92ZShuZXdQb3N0UmVtb3ZlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkUsIG5ld1Bvc3RSZW1vdmUsIG5ld1Bvc3RSZW1vdmUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmUgVXBkYXRlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByZVVwZGF0ZShQcmVVcGRhdGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUHJlVXBkYXRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQcmVVcGRhdGUgZ2V0UHJlVXBkYXRlKCkKLQl7Ci0JCXJldHVybiBwcmVVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UHJlVXBkYXRlKFByZVVwZGF0ZSBuZXdQcmVVcGRhdGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQcmVVcGRhdGUgb2xkUHJlVXBkYXRlID0gcHJlVXBkYXRlOwotCQlwcmVVcGRhdGUgPSBuZXdQcmVVcGRhdGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURSwgb2xkUHJlVXBkYXRlLCBuZXdQcmVVcGRhdGUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5I2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlVXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlVXBkYXRlKFByZVVwZGF0ZSBuZXdQcmVVcGRhdGUpCi0JewotCQlpZiAobmV3UHJlVXBkYXRlICE9IHByZVVwZGF0ZSkKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJlVXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXByZVVwZGF0ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UHJlVXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1ByZVVwZGF0ZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQcmVVcGRhdGUobmV3UHJlVXBkYXRlLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURSwgbmV3UHJlVXBkYXRlLCBuZXdQcmVVcGRhdGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0VXBkYXRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQb3N0VXBkYXRlIGdldFBvc3RVcGRhdGUoKQotCXsKLQkJcmV0dXJuIHBvc3RVcGRhdGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UG9zdFVwZGF0ZShQb3N0VXBkYXRlIG5ld1Bvc3RVcGRhdGUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlQb3N0VXBkYXRlIG9sZFBvc3RVcGRhdGUgPSBwb3N0VXBkYXRlOwotCQlwb3N0VXBkYXRlID0gbmV3UG9zdFVwZGF0ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURSwgb2xkUG9zdFVwZGF0ZSwgbmV3UG9zdFVwZGF0ZSk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdFVwZGF0ZSA8ZW0+UG9zdCBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgVXBkYXRlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0VXBkYXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UG9zdFVwZGF0ZShQb3N0VXBkYXRlIG5ld1Bvc3RVcGRhdGUpCi0JewotCQlpZiAobmV3UG9zdFVwZGF0ZSAhPSBwb3N0VXBkYXRlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0VXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBvc3RVcGRhdGUpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0VXBkYXRlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Bvc3RVcGRhdGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3RVcGRhdGUobmV3UG9zdFVwZGF0ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFLCBuZXdQb3N0VXBkYXRlLCBuZXdQb3N0VXBkYXRlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9zdCBMb2FkPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBMb2FkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQb3N0TG9hZChQb3N0TG9hZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0TG9hZCgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUG9zdExvYWQgZ2V0UG9zdExvYWQoKQotCXsKLQkJcmV0dXJuIHBvc3RMb2FkOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFBvc3RMb2FkKFBvc3RMb2FkIG5ld1Bvc3RMb2FkLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJUG9zdExvYWQgb2xkUG9zdExvYWQgPSBwb3N0TG9hZDsKLQkJcG9zdExvYWQgPSBuZXdQb3N0TG9hZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX0xPQUQsIG9sZFBvc3RMb2FkLCBuZXdQb3N0TG9hZCk7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHkjZ2V0UG9zdExvYWQgPGVtPlBvc3QgTG9hZDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBMb2FkPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0TG9hZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3RMb2FkKFBvc3RMb2FkIG5ld1Bvc3RMb2FkKQotCXsKLQkJaWYgKG5ld1Bvc3RMb2FkICE9IHBvc3RMb2FkKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwb3N0TG9hZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwb3N0TG9hZCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FELCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQb3N0TG9hZCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQb3N0TG9hZCkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FELCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBvc3RMb2FkKG5ld1Bvc3RMb2FkLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FELCBuZXdQb3N0TG9hZCwgbmV3UG9zdExvYWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl9BdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKQotCXsKLQkJaWYgKGF0dHJpYnV0ZU92ZXJyaWRlcyA9PSBudWxsKQotCQl7Ci0JCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXR0cmlidXRlT3ZlcnJpZGU+KFhtbEF0dHJpYnV0ZU92ZXJyaWRlLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVPdmVycmlkZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyX0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpCi0JewotCQlpZiAoYXNzb2NpYXRpb25PdmVycmlkZXMgPT0gbnVsbCkKLQkJewotCQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sQXNzb2NpYXRpb25PdmVycmlkZT4oWG1sQXNzb2NpYXRpb25PdmVycmlkZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQl9Ci0JCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYWNoZWFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYWNoZWFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhY2hlYWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENhY2hlYWJsZV8yXzBfQ2FjaGVhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRDYWNoZWFibGUoKQotCXsKLQkJcmV0dXJuIGNhY2hlYWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eSNnZXRDYWNoZWFibGUgPGVtPkNhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWFibGUoQm9vbGVhbiBuZXdDYWNoZWFibGUpCi0JewotCQlCb29sZWFuIG9sZENhY2hlYWJsZSA9IGNhY2hlYWJsZTsKLQkJY2FjaGVhYmxlID0gbmV3Q2FjaGVhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFQUJMRSwgb2xkQ2FjaGVhYmxlLCBjYWNoZWFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWRRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldE5hbWVkTmF0aXZlUXVlcmllcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXJldHVybiBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcmVQZXJzaXN0KG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0UGVyc2lzdChudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFOgotCQkJCXJldHVybiBiYXNpY1NldFByZVJlbW92ZShudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1JFTU9WRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRQb3N0UmVtb3ZlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9VUERBVEU6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0UHJlVXBkYXRlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RVcGRhdGUobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOgotCQkJCXJldHVybiBiYXNpY1NldFBvc3RMb2FkKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FTU09DSUFUSU9OX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRJZENsYXNzKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFOgotCQkJCXJldHVybiBiYXNpY1NldFRhYmxlKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZWNvbmRhcnlUYWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSU5IRVJJVEFOQ0U6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SW5oZXJpdGFuY2UobnVsbCwgbXNncyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RGlzY3JpbWluYXRvckNvbHVtbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBiYXNpY1NldEVudGl0eUxpc3RlbmVycyhudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWRRdWVyaWVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIGdldE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGdldFByZVBlcnNpc3QoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1Q6Ci0JCQkJcmV0dXJuIGdldFBvc3RQZXJzaXN0KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRToKLQkJCQlyZXR1cm4gZ2V0UHJlUmVtb3ZlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9SRU1PVkU6Ci0JCQkJcmV0dXJuIGdldFBvc3RSZW1vdmUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfVVBEQVRFOgotCQkJCXJldHVybiBnZXRQcmVVcGRhdGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURToKLQkJCQlyZXR1cm4gZ2V0UG9zdFVwZGF0ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDoKLQkJCQlyZXR1cm4gZ2V0UG9zdExvYWQoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJcmV0dXJuIGdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBnZXRDYWNoZWFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlyZXR1cm4gZ2V0SWRDbGFzcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKLQkJCQlyZXR1cm4gZ2V0VGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOgotCQkJCXJldHVybiBnZXRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgotCQkJCXJldHVybiBnZXRJbmhlcml0YW5jZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgotCQkJCXJldHVybiBnZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJcmV0dXJuIGdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGlzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRFbnRpdHlMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzoKLQkJCQlnZXROYW1lZFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWROYXRpdmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOgotCQkJCXNldFRhYmxlR2VuZXJhdG9yKChYbWxUYWJsZUdlbmVyYXRvciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOgotCQkJCXNldFByZVBlcnNpc3QoKFByZVBlcnNpc3QpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1Q6Ci0JCQkJc2V0UG9zdFBlcnNpc3QoKFBvc3RQZXJzaXN0KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1JFTU9WRToKLQkJCQlzZXRQcmVSZW1vdmUoKFByZVJlbW92ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFOgotCQkJCXNldFBvc3RSZW1vdmUoKFBvc3RSZW1vdmUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfVVBEQVRFOgotCQkJCXNldFByZVVwZGF0ZSgoUHJlVXBkYXRlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEU6Ci0JCQkJc2V0UG9zdFVwZGF0ZSgoUG9zdFVwZGF0ZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDoKLQkJCQlzZXRQb3N0TG9hZCgoUG9zdExvYWQpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOgotCQkJCWdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBdHRyaWJ1dGVPdmVycmlkZT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM6Ci0JCQkJZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5jbGVhcigpOwotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0NBQ0hFQUJMRToKLQkJCQlzZXRDYWNoZWFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlzZXRJZENsYXNzKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEU6Ci0JCQkJc2V0VGFibGUoKFhtbFRhYmxlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fU0VDT05EQVJZX1RBQkxFUzoKLQkJCQlnZXRTZWNvbmRhcnlUYWJsZXMoKS5jbGVhcigpOwotCQkJCWdldFNlY29uZGFyeVRhYmxlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU2Vjb25kYXJ5VGFibGU+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JTkhFUklUQU5DRToKLQkJCQlzZXRJbmhlcml0YW5jZSgoSW5oZXJpdGFuY2UpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19ESVNDUklNSU5BVE9SX1ZBTFVFOgotCQkJCXNldERpc2NyaW1pbmF0b3JWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJc2V0RGlzY3JpbWluYXRvckNvbHVtbigoWG1sRGlzY3JpbWluYXRvckNvbHVtbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3FsUmVzdWx0U2V0TWFwcGluZz4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgotCQkJCXNldEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19OQU1FRF9RVUVSSUVTOgotCQkJCWdldE5hbWVkUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlzZXRTZXF1ZW5jZUdlbmVyYXRvcigoWG1sU2VxdWVuY2VHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlzZXRUYWJsZUdlbmVyYXRvcigoWG1sVGFibGVHZW5lcmF0b3IpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOgotCQkJCXNldFByZVBlcnNpc3QoKFByZVBlcnNpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUEVSU0lTVDoKLQkJCQlzZXRQb3N0UGVyc2lzdCgoUG9zdFBlcnNpc3QpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9SRU1PVkU6Ci0JCQkJc2V0UHJlUmVtb3ZlKChQcmVSZW1vdmUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFOgotCQkJCXNldFBvc3RSZW1vdmUoKFBvc3RSZW1vdmUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9VUERBVEU6Ci0JCQkJc2V0UHJlVXBkYXRlKChQcmVVcGRhdGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfVVBEQVRFOgotCQkJCXNldFBvc3RVcGRhdGUoKFBvc3RVcGRhdGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfTE9BRDoKLQkJCQlzZXRQb3N0TG9hZCgoUG9zdExvYWQpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVM6Ci0JCQkJZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCWdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVBQkxFOgotCQkJCXNldENhY2hlYWJsZShDQUNIRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlzZXRJZENsYXNzKChYbWxDbGFzc1JlZmVyZW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKLQkJCQlzZXRUYWJsZSgoWG1sVGFibGUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NFQ09OREFSWV9UQUJMRVM6Ci0JCQkJZ2V0U2Vjb25kYXJ5VGFibGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgotCQkJCXNldEluaGVyaXRhbmNlKChJbmhlcml0YW5jZSludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9WQUxVRToKLQkJCQlzZXREaXNjcmltaW5hdG9yVmFsdWUoRElTQ1JJTUlOQVRPUl9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfQ09MVU1OOgotCQkJCXNldERpc2NyaW1pbmF0b3JDb2x1bW4oKFhtbERpc2NyaW1pbmF0b3JDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyhFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyhFWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcmllcyAhPSBudWxsICYmICFuYW1lZFF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCXJldHVybiBuYW1lZE5hdGl2ZVF1ZXJpZXMgIT0gbnVsbCAmJiAhbmFtZWROYXRpdmVRdWVyaWVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fVEFCTEVfR0VORVJBVE9SOgotCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvciAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOgotCQkJCXJldHVybiBwcmVQZXJzaXN0ICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9QRVJTSVNUOgotCQkJCXJldHVybiBwb3N0UGVyc2lzdCAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9SRU1PVkU6Ci0JCQkJcmV0dXJuIHByZVJlbW92ZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFOgotCQkJCXJldHVybiBwb3N0UmVtb3ZlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURToKLQkJCQlyZXR1cm4gcHJlVXBkYXRlICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEU6Ci0JCQkJcmV0dXJuIHBvc3RVcGRhdGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX0xPQUQ6Ci0JCQkJcmV0dXJuIHBvc3RMb2FkICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQVRUUklCVVRFX09WRVJSSURFUzoKLQkJCQlyZXR1cm4gYXR0cmlidXRlT3ZlcnJpZGVzICE9IG51bGwgJiYgIWF0dHJpYnV0ZU92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOgotCQkJCXJldHVybiBhc3NvY2lhdGlvbk92ZXJyaWRlcyAhPSBudWxsICYmICFhc3NvY2lhdGlvbk92ZXJyaWRlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQ0FDSEVBQkxFOgotCQkJCXJldHVybiBDQUNIRUFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGNhY2hlYWJsZSAhPSBudWxsIDogIUNBQ0hFQUJMRV9FREVGQVVMVC5lcXVhbHMoY2FjaGVhYmxlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19JRF9DTEFTUzoKLQkJCQlyZXR1cm4gaWRDbGFzcyAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19UQUJMRToKLQkJCQlyZXR1cm4gdGFibGUgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRUNPTkRBUllfVEFCTEVTOgotCQkJCXJldHVybiBzZWNvbmRhcnlUYWJsZXMgIT0gbnVsbCAmJiAhc2Vjb25kYXJ5VGFibGVzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1ucyAhPSBudWxsICYmICFwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lOSEVSSVRBTkNFOgotCQkJCXJldHVybiBpbmhlcml0YW5jZSAhPSBudWxsOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0RJU0NSSU1JTkFUT1JfVkFMVUU6Ci0JCQkJcmV0dXJuIERJU0NSSU1JTkFUT1JfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGRpc2NyaW1pbmF0b3JWYWx1ZSAhPSBudWxsIDogIURJU0NSSU1JTkFUT1JfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGRpc2NyaW1pbmF0b3JWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRElTQ1JJTUlOQVRPUl9DT0xVTU46Ci0JCQkJcmV0dXJuIGRpc2NyaW1pbmF0b3JDb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gc3FsUmVzdWx0U2V0TWFwcGluZ3MgIT0gbnVsbCAmJiAhc3FsUmVzdWx0U2V0TWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzICE9IEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlNfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgIT0gRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBlbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfUVVFUklFUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfTkFUSVZFX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUEVSU0lTVDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BSRV9QRVJTSVNUOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1Q6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1BFUlNJU1Q7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9SRU1PVkU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUkVNT1ZFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1JFTU9WRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfUkVNT1ZFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfVVBEQVRFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1VQREFURTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9VUERBVEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QT1NUX1VQREFURTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9MT0FEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0FUVFJJQlVURV9PVkVSUklERVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfQ0FDSEVBQkxFXzIwX19DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbElkQ2xhc3NDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fSURfQ0xBU1M6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9DTEFTU19DT05UQUlORVJfX0lEX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfUVVFUklFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fTkFNRURfUVVFUklFUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfTkFUSVZFX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEdlbmVyYXRvckNvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19UQUJMRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxFdmVudE1ldGhvZENvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1BFUlNJU1Q6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BSRV9QRVJTSVNUOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9QRVJTSVNUOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1BFUlNJU1Q7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FVkVOVF9NRVRIT0RfQ09OVEFJTkVSX19QUkVfUkVNT1ZFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QUkVfUkVNT1ZFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUE9TVF9SRU1PVkU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX1BPU1RfUkVNT1ZFOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRVZFTlRfTUVUSE9EX0NPTlRBSU5FUl9fUFJFX1VQREFURTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUFJFX1VQREFURTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfVVBEQVRFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19QT1NUX1VQREFURTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VWRU5UX01FVEhPRF9DT05UQUlORVJfX1BPU1RfTE9BRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9fUE9TVF9MT0FEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSX19BVFRSSUJVVEVfT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BVFRSSUJVVEVfT1ZFUlJJREVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0FTU09DSUFUSU9OX09WRVJSSURFX0NPTlRBSU5FUl9fQVNTT0NJQVRJT05fT1ZFUlJJREVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ2FjaGVhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX0NBQ0hFQUJMRV8yMF9fQ0FDSEVBQkxFOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX19DQUNIRUFCTEU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sRW50aXR5XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbElkQ2xhc3NDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX0NMQVNTX0NPTlRBSU5FUl9fSURfQ0xBU1M6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfX0lEX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY2FjaGVhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYWNoZWFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRpc2NyaW1pbmF0b3JWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGlzY3JpbWluYXRvclZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlRGVmYXVsdExpc3RlbmVyczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldERpc2NyaW1pbmF0b3JWYWx1ZVRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEVsZW1lbnRUZXh0UmFuZ2UoSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldEluaGVyaXRhbmNlU3RyYXRlZ3lUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRJbmhlcml0YW5jZSgpICE9IG51bGwgPyBnZXRJbmhlcml0YW5jZSgpLmdldFN0cmF0ZWd5VGV4dFJhbmdlKCkgOiBnZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0Q2FjaGVhYmxlVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQTJfMC5DQUNIRUFCTEUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhY2hlYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZElkQ2xhc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZEluaGVyaXRhbmNlVHJhbnNsYXRvcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWRRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU3FsUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlQcmVQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUG9zdFBlcnNpc3QuYnVpbGRUcmFuc2xhdG9yKCksCi0JCQlQcmVSZW1vdmUuYnVpbGRUcmFuc2xhdG9yKCksCi0JCQlQb3N0UmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUHJlVXBkYXRlLmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUG9zdFVwZGF0ZS5idWlsZFRyYW5zbGF0b3IoKSwKLQkJCVBvc3RMb2FkLmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVRyYW5zbGF0b3IoKSwKLQkJCUF0dHJpYnV0ZXMuYnVpbGRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGROYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYWNoZWFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBMl8wLkNBQ0hFQUJMRSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbENhY2hlYWJsZV8yXzBfQ2FjaGVhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbFRhYmxlLmJ1aWxkVHJhbnNsYXRvcihKUEEuVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9UYWJsZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2Vjb25kYXJ5VGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU2Vjb25kYXJ5VGFibGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5TRUNPTkRBUllfVEFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9TZWNvbmRhcnlUYWJsZXMoKSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihKUEEuSURfQ0xBU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbElkQ2xhc3NDb250YWluZXJfSWRDbGFzcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5oZXJpdGFuY2VUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gSW5oZXJpdGFuY2UuYnVpbGRUcmFuc2xhdG9yKEpQQS5JTkhFUklUQU5DRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5X0luaGVyaXRhbmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREaXNjcmltaW5hdG9yVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9EaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sRGlzY3JpbWluYXRvckNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sU2VxdWVuY2VHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9TZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sVGFibGVHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEpQQS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZWRRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxOYW1lZFF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTkFNRURfUVVFUlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkUXVlcmllcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZWROYXRpdmVRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxOYW1lZE5hdGl2ZVF1ZXJ5LmJ1aWxkVHJhbnNsYXRvcihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNxbFJlc3VsdFNldE1hcHBpbmdUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gU3FsUmVzdWx0U2V0TWFwcGluZy5idWlsZFRyYW5zbGF0b3IoSlBBLlNRTF9SRVNVTFRfU0VUX01BUFBJTkcsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9TcWxSZXN1bHRTZXRNYXBwaW5ncygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FeGNsdWRlRGVmYXVsdExpc3RlbmVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIEVudGl0eUxpc3RlbmVycy5idWlsZFRyYW5zbGF0b3IoSlBBLkVOVElUWV9MSVNURU5FUlMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eV9FbnRpdHlMaXN0ZW5lcnMoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJlUGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBQcmVQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBvc3RQZXJzaXN0VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFBvc3RQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByZVJlbW92ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBQcmVSZW1vdmUuYnVpbGRUcmFuc2xhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUG9zdFJlbW92ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBQb3N0UmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmVVcGRhdGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUHJlVXBkYXRlLmJ1aWxkVHJhbnNsYXRvcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQb3N0VXBkYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFBvc3RVcGRhdGUuYnVpbGRUcmFuc2xhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUG9zdExvYWRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUG9zdExvYWQuYnVpbGRUcmFuc2xhdG9yKCk7Ci0JfQotCQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxBdHRyaWJ1dGVPdmVycmlkZS5idWlsZFRyYW5zbGF0b3IoSlBBLkFUVFJJQlVURV9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfQXR0cmlidXRlT3ZlcnJpZGVzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuYnVpbGRUcmFuc2xhdG9yKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcl9Bc3NvY2lhdGlvbk92ZXJyaWRlcygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sRW50aXR5TWFwcGluZ3MuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTdjNDVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFbnRpdHlNYXBwaW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVSb290VHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IE1hcHBpbmdzPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA8ZW0+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRQYWNrYWdlIDxlbT5QYWNrYWdlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2VxdWVuY2VHZW5lcmF0b3JzIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFRhYmxlR2VuZXJhdG9ycyA8ZW0+VGFibGUgR2VuZXJhdG9yczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncyA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0TWFwcGVkU3VwZXJjbGFzc2VzIDxlbT5NYXBwZWQgU3VwZXJjbGFzc2VzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldEVudGl0aWVzIDxlbT5FbnRpdGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRFbWJlZGRhYmxlcyA8ZW0+RW1iZWRkYWJsZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5ncygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxFbnRpdHlNYXBwaW5ncyBleHRlbmRzIEFic3RyYWN0SnBhUm9vdEVPYmplY3QgaW1wbGVtZW50cyBYbWxRdWVyeUNvbnRhaW5lciwgWG1sQWNjZXNzSG9sZGVyCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWRRdWVyaWVzKCkgPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZWRRdWVyaWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkgPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWVkTmF0aXZlUXVlcmllcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllczsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3MoKSA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBY2Nlc3MoKSA8ZW0+QWNjZXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgYWNjZXNzID0gQUNDRVNTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBhY2thZ2UoKSA8ZW0+UGFja2FnZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGFja2FnZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYWNrYWdlKCkgPGVtPlBhY2thZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcGFja2FnZV8gPSBQQUNLQUdFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2hlbWEgPSBTQ0hFTUFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlR2VuZXJhdG9ycygpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3JzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9ycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvcnM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZUdlbmVyYXRvcnMoKSA8ZW0+VGFibGUgR2VuZXJhdG9yczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxUYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSA8ZW0+U3FsIFJlc3VsdCBTZXQgTWFwcGluZ3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBzcWxSZXN1bHRTZXRNYXBwaW5nczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBlZFN1cGVyY2xhc3NlcygpIDxlbT5NYXBwZWQgU3VwZXJjbGFzc2VzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZFN1cGVyY2xhc3NlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE1hcHBlZFN1cGVyY2xhc3M+IG1hcHBlZFN1cGVyY2xhc3NlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0aWVzKCkgPGVtPkVudGl0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGl0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRW50aXR5PiBlbnRpdGllczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVtYmVkZGFibGVzKCkgPGVtPkVtYmVkZGFibGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVtYmVkZGFibGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sRW1iZWRkYWJsZT4gZW1iZWRkYWJsZXM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfRU5USVRZX01BUFBJTkdTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIFF1ZXJpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZFF1ZXJ5PiBnZXROYW1lZFF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZFF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWRRdWVyeT4oWG1sTmFtZWRRdWVyeS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTKTsKLQkJfQotCQlyZXR1cm4gbmFtZWRRdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKQotCXsKLQkJaWYgKG5hbWVkTmF0aXZlUXVlcmllcyA9PSBudWxsKQotCQl7Ci0JCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTmFtZWROYXRpdmVRdWVyeT4oWG1sTmFtZWROYXRpdmVRdWVyeS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUyk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcmllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc19EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQotCXsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIGdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkKLQl7Ci0JCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBuZXdQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIG9sZFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gcGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gbmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSwgb2xkUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIG5ld1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIDxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIG5ld1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKQotCXsKLQkJaWYgKG5ld1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhICE9IHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEobmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBLCBuZXdQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSwgbmV3UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYWNrYWdlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWNrYWdlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhY2thZ2UoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1BhY2thZ2UoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBwYWNrYWdlXzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzI2dldFBhY2thZ2UgPGVtPlBhY2thZ2U8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBhY2thZ2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBuZXdQYWNrYWdlKQotCXsKLQkJU3RyaW5nIG9sZFBhY2thZ2UgPSBwYWNrYWdlXzsKLQkJcGFja2FnZV8gPSBuZXdQYWNrYWdlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0UsIG9sZFBhY2thZ2UsIHBhY2thZ2VfKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1NjaGVtYSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNjaGVtYSgpCi0JewotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3MjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2NoZW1hKFN0cmluZyBuZXdTY2hlbWEpCi0JewotCQlTdHJpbmcgb2xkU2NoZW1hID0gc2NoZW1hOwotCQlzY2hlbWEgPSBuZXdTY2hlbWE7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0NIRU1BLCBvbGRTY2hlbWEsIHNjaGVtYSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKQotCXsKLQkJcmV0dXJuIGNhdGFsb2c7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgbmV3Q2F0YWxvZykKLQl7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gY2F0YWxvZzsKLQkJY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRywgb2xkQ2F0YWxvZywgY2F0YWxvZykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWNjZXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzKCkKLQl7Ci0JCXJldHVybiBhY2Nlc3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5ncyNnZXRBY2Nlc3MgPGVtPkFjY2VzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWNjZXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBY2Nlc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY2Nlc3MoU3RyaW5nIG5ld0FjY2VzcykKLQl7Ci0JCVN0cmluZyBvbGRBY2Nlc3MgPSBhY2Nlc3M7Ci0JCWFjY2VzcyA9IG5ld0FjY2VzczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1MsIG9sZEFjY2VzcywgYWNjZXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3J9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2VxdWVuY2VHZW5lcmF0b3JzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkKLQl7Ci0JCWlmIChzZXF1ZW5jZUdlbmVyYXRvcnMgPT0gbnVsbCkKLQkJewotCQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFNlcXVlbmNlR2VuZXJhdG9yPihYbWxTZXF1ZW5jZUdlbmVyYXRvci5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTKTsKLQkJfQotCQlyZXR1cm4gc2VxdWVuY2VHZW5lcmF0b3JzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3JzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVGFibGVHZW5lcmF0b3I+IGdldFRhYmxlR2VuZXJhdG9ycygpCi0JewotCQlpZiAodGFibGVHZW5lcmF0b3JzID09IG51bGwpCi0JCXsKLQkJCXRhYmxlR2VuZXJhdG9ycyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxUYWJsZUdlbmVyYXRvcj4oWG1sVGFibGVHZW5lcmF0b3IuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUyk7Ci0JCX0KLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uU3FsUmVzdWx0U2V0TWFwcGluZ30uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TcWwgUmVzdWx0IFNldCBNYXBwaW5nczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNxbCBSZXN1bHQgU2V0IE1hcHBpbmdzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxTcWxSZXN1bHRTZXRNYXBwaW5nPiBnZXRTcWxSZXN1bHRTZXRNYXBwaW5ncygpCi0JewotCQlpZiAoc3FsUmVzdWx0U2V0TWFwcGluZ3MgPT0gbnVsbCkKLQkJewotCQkJc3FsUmVzdWx0U2V0TWFwcGluZ3MgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8U3FsUmVzdWx0U2V0TWFwcGluZz4oU3FsUmVzdWx0U2V0TWFwcGluZy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUyk7Ci0JCX0KLQkJcmV0dXJuIHNxbFJlc3VsdFNldE1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3N9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIFN1cGVyY2xhc3NlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBTdXBlcmNsYXNzZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRW50aXR5TWFwcGluZ3NfTWFwcGVkU3VwZXJjbGFzc2VzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxNYXBwZWRTdXBlcmNsYXNzPiBnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKQotCXsKLQkJaWYgKG1hcHBlZFN1cGVyY2xhc3NlcyA9PSBudWxsKQotCQl7Ci0JCQltYXBwZWRTdXBlcmNsYXNzZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sTWFwcGVkU3VwZXJjbGFzcz4oWG1sTWFwcGVkU3VwZXJjbGFzcy5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTKTsKLQkJfQotCQlyZXR1cm4gbWFwcGVkU3VwZXJjbGFzc2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHl9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFbnRpdHlNYXBwaW5nc19FbnRpdGllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sRW50aXR5PiBnZXRFbnRpdGllcygpCi0JewotCQlpZiAoZW50aXRpZXMgPT0gbnVsbCkKLQkJewotCQkJZW50aXRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRW50aXR5PihYbWxFbnRpdHkuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVMpOwotCQl9Ci0JCXJldHVybiBlbnRpdGllczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbWJlZGRhYmxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbWJlZGRhYmxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVtYmVkZGFibGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxFbWJlZGRhYmxlPiBnZXRFbWJlZGRhYmxlcygpCi0JewotCQlpZiAoZW1iZWRkYWJsZXMgPT0gbnVsbCkKLQkJewotCQkJZW1iZWRkYWJsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sRW1iZWRkYWJsZT4oWG1sRW1iZWRkYWJsZS5jbGFzcywgdGhpcywgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUyk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGFibGVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXROYW1lZFF1ZXJpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOgotCQkJCXJldHVybiBiYXNpY1NldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKG51bGwsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NFUVVFTkNFX0dFTkVSQVRPUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRUYWJsZUdlbmVyYXRvcnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW50aXRpZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VNQkVEREFCTEVTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RW1iZWRkYWJsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9RVUVSSUVTOgotCQkJCXJldHVybiBnZXROYW1lZFF1ZXJpZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlyZXR1cm4gZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOgotCQkJCXJldHVybiBnZXRBY2Nlc3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BBQ0tBR0U6Ci0JCQkJcmV0dXJuIGdldFBhY2thZ2UoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIGdldFNjaGVtYSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIGdldENhdGFsb2coKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOgotCQkJCXJldHVybiBnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOgotCQkJCXJldHVybiBnZXRUYWJsZUdlbmVyYXRvcnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTOgotCQkJCXJldHVybiBnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTlRJVElFUzoKLQkJCQlyZXR1cm4gZ2V0RW50aXRpZXMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19FTUJFRERBQkxFUzoKLQkJCQlyZXR1cm4gZ2V0RW1iZWRkYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUzoKLQkJCQlnZXROYW1lZFF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWRRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19OQU1FRF9OQVRJVkVfUVVFUklFUzoKLQkJCQlnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5jbGVhcigpOwotCQkJCWdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sTmFtZWROYXRpdmVRdWVyeT4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1M6Ci0JCQkJc2V0QWNjZXNzKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQToKLQkJCQlzZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgoWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFOgotCQkJCXNldFBhY2thZ2UoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU0VRVUVOQ0VfR0VORVJBVE9SUzoKLQkJCQlnZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5jbGVhcigpOwotCQkJCWdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sU2VxdWVuY2VHZW5lcmF0b3I+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fVEFCTEVfR0VORVJBVE9SUzoKLQkJCQlnZXRUYWJsZUdlbmVyYXRvcnMoKS5jbGVhcigpOwotCQkJCWdldFRhYmxlR2VuZXJhdG9ycygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVGFibGVHZW5lcmF0b3I+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCWdldFNxbFJlc3VsdFNldE1hcHBpbmdzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTcWxSZXN1bHRTZXRNYXBwaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM6Ci0JCQkJZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlnZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbE1hcHBlZFN1cGVyY2xhc3M+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU5USVRJRVM6Ci0JCQkJZ2V0RW50aXRpZXMoKS5jbGVhcigpOwotCQkJCWdldEVudGl0aWVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxFbnRpdHk+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVM6Ci0JCQkJZ2V0RW1iZWRkYWJsZXMoKS5jbGVhcigpOwotCQkJCWdldEVtYmVkZGFibGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxFbWJlZGRhYmxlPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWRRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOgotCQkJCXNldEFjY2VzcyhBQ0NFU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFOgotCQkJCXNldFBhY2thZ2UoUEFDS0FHRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoU0NIRU1BX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQ0FUQUxPRzoKLQkJCQlzZXRDYXRhbG9nKENBVEFMT0dfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOgotCQkJCWdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX1RBQkxFX0dFTkVSQVRPUlM6Ci0JCQkJZ2V0VGFibGVHZW5lcmF0b3JzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fU1FMX1JFU1VMVF9TRVRfTUFQUElOR1M6Ci0JCQkJZ2V0U3FsUmVzdWx0U2V0TWFwcGluZ3MoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19NQVBQRURfU1VQRVJDTEFTU0VTOgotCQkJCWdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTOgotCQkJCWdldEVudGl0aWVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVM6Ci0JCQkJZ2V0RW1iZWRkYWJsZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUzoKLQkJCQlyZXR1cm4gbmFtZWRRdWVyaWVzICE9IG51bGwgJiYgIW5hbWVkUXVlcmllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfTkFUSVZFX1FVRVJJRVM6Ci0JCQkJcmV0dXJuIG5hbWVkTmF0aXZlUXVlcmllcyAhPSBudWxsICYmICFuYW1lZE5hdGl2ZVF1ZXJpZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0FDQ0VTUzoKLQkJCQlyZXR1cm4gQUNDRVNTX0VERUZBVUxUID09IG51bGwgPyBhY2Nlc3MgIT0gbnVsbCA6ICFBQ0NFU1NfRURFRkFVTFQuZXF1YWxzKGFjY2Vzcyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQToKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19QQUNLQUdFOgotCQkJCXJldHVybiBQQUNLQUdFX0VERUZBVUxUID09IG51bGwgPyBwYWNrYWdlXyAhPSBudWxsIDogIVBBQ0tBR0VfRURFRkFVTFQuZXF1YWxzKHBhY2thZ2VfKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIFNDSEVNQV9FREVGQVVMVCA9PSBudWxsID8gc2NoZW1hICE9IG51bGwgOiAhU0NIRU1BX0VERUZBVUxULmVxdWFscyhzY2hlbWEpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIENBVEFMT0dfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2cgIT0gbnVsbCA6ICFDQVRBTE9HX0VERUZBVUxULmVxdWFscyhjYXRhbG9nKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TRVFVRU5DRV9HRU5FUkFUT1JTOgotCQkJCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvcnMgIT0gbnVsbCAmJiAhc2VxdWVuY2VHZW5lcmF0b3JzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19UQUJMRV9HRU5FUkFUT1JTOgotCQkJCXJldHVybiB0YWJsZUdlbmVyYXRvcnMgIT0gbnVsbCAmJiAhdGFibGVHZW5lcmF0b3JzLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19TUUxfUkVTVUxUX1NFVF9NQVBQSU5HUzoKLQkJCQlyZXR1cm4gc3FsUmVzdWx0U2V0TWFwcGluZ3MgIT0gbnVsbCAmJiAhc3FsUmVzdWx0U2V0TWFwcGluZ3MuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX01BUFBFRF9TVVBFUkNMQVNTRVM6Ci0JCQkJcmV0dXJuIG1hcHBlZFN1cGVyY2xhc3NlcyAhPSBudWxsICYmICFtYXBwZWRTdXBlcmNsYXNzZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX0VOVElUSUVTOgotCQkJCXJldHVybiBlbnRpdGllcyAhPSBudWxsICYmICFlbnRpdGllcy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fRU1CRUREQUJMRVM6Ci0JCQkJcmV0dXJuIGVtYmVkZGFibGVzICE9IG51bGwgJiYgIWVtYmVkZGFibGVzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCQotCQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFF1ZXJ5Q29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9RVUVSWV9DT05UQUlORVJfX05BTUVEX1FVRVJJRVM7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUVVFUllfQ09OVEFJTkVSX19OQU1FRF9OQVRJVkVfUVVFUklFUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxBY2Nlc3NIb2xkZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fQUNDRVNTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQUNDRVNTX0hPTERFUl9fQUNDRVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUXVlcnlDb250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfUVVFUklFUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0VOVElUWV9NQVBQSU5HU19fTkFNRURfUVVFUklFUzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0NPTlRBSU5FUl9fTkFNRURfTkFUSVZFX1FVRVJJRVM6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9FTlRJVFlfTUFQUElOR1NfX05BTUVEX05BVElWRV9RVUVSSUVTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbEFjY2Vzc0hvbGRlci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQUNDRVNTX0hPTERFUl9fQUNDRVNTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfRU5USVRZX01BUFBJTkdTX19BQ0NFU1M7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqKioqKioqIG92ZXJyaWRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWNjZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcGFja2FnZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocGFja2FnZV8pOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVtYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NoZW1hKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjYXRhbG9nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChjYXRhbG9nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCXB1YmxpYyBMaXN0PFhtbFR5cGVNYXBwaW5nPiBnZXRUeXBlTWFwcGluZ3MoKSB7Ci0JCS8vIGNvbnZlcnQgbGlzdHMgdG8gYXJyYXlzIHRvIGF2b2lkIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gd2hpbGUgYWRkaW5nIHRvIHJlc3VsdCBsaXN0Ci0JCUFycmF5TGlzdDxYbWxUeXBlTWFwcGluZz4gdHlwZU1hcHBpbmdzID0gbmV3IEFycmF5TGlzdDxYbWxUeXBlTWFwcGluZz4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbCh0eXBlTWFwcGluZ3MsIHRoaXMuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkudG9BcnJheShFTVBUWV9YTUxfVFlQRV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodHlwZU1hcHBpbmdzLCB0aGlzLmdldEVudGl0aWVzKCkudG9BcnJheShFTVBUWV9YTUxfVFlQRV9NQVBQSU5HX0FSUkFZKSk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwodHlwZU1hcHBpbmdzLCB0aGlzLmdldEVtYmVkZGFibGVzKCkudG9BcnJheShFTVBUWV9YTUxfVFlQRV9NQVBQSU5HX0FSUkFZKSk7Ci0JCXJldHVybiB0eXBlTWFwcGluZ3M7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbFR5cGVNYXBwaW5nW10gRU1QVFlfWE1MX1RZUEVfTUFQUElOR19BUlJBWSA9IG5ldyBYbWxUeXBlTWFwcGluZ1swXTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZlcnNpb24gLT4gc2NoZW1hIGxvY2F0aW9uIG1hcHBpbmcgKioqKioqKioqKioqKioqKioqKioKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZXNwYWNlID0gSlBBLlNDSEVNQV9OQU1FU1BBQ0U7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gdmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucyA9IGJ1aWxkVmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucygpOwotCQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRWZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKCkgewotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQltYXAucHV0KEpQQS5TQ0hFTUFfVkVSU0lPTiwgSlBBLlNDSEVNQV9MT0NBVElPTik7Ci0JCW1hcC5wdXQoSlBBMl8wLlNDSEVNQV9WRVJTSU9OLCBKUEEyXzAuU0NIRU1BX0xPQ0FUSU9OKTsKLQkJcmV0dXJuIG1hcDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbkZvclZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMuZ2V0KHZlcnNpb24pOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgZ2V0Um9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBST09UX1RSQU5TTEFUT1I7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFRyYW5zbGF0b3IgUk9PVF9UUkFOU0xBVE9SID0gYnVpbGRSb290VHJhbnNsYXRvcigpOwotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSb290VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVSb290VHJhbnNsYXRvcigKLQkJCQlKUEEuRU5USVRZX01BUFBJTkdTLAotCQkJCU9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzKCksCi0JCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZFZlcnNpb25UcmFuc2xhdG9yKHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpLAotCQkJYnVpbGROYW1lc3BhY2VUcmFuc2xhdG9yKG5hbWVzcGFjZSksCi0JCQlidWlsZFNjaGVtYU5hbWVzcGFjZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hTG9jYXRpb25UcmFuc2xhdG9yKG5hbWVzcGFjZSwgdmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucyksCi0JCQlidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpLAotCQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuYnVpbGRUcmFuc2xhdG9yKEpQQS5QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKSwKLQkJCWJ1aWxkUGFja2FnZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlYbWxTZXF1ZW5jZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfU2VxdWVuY2VHZW5lcmF0b3JzKCkpLAotCQkJWG1sVGFibGVHZW5lcmF0b3IuYnVpbGRUcmFuc2xhdG9yKEpQQS5UQUJMRV9HRU5FUkFUT1IsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1RhYmxlR2VuZXJhdG9ycygpKSwKLQkJCVhtbE5hbWVkUXVlcnkuYnVpbGRUcmFuc2xhdG9yKEpQQS5OQU1FRF9RVUVSWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWRRdWVyaWVzKCkpLAotCQkJWG1sTmFtZWROYXRpdmVRdWVyeS5idWlsZFRyYW5zbGF0b3IoSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlDb250YWluZXJfTmFtZWROYXRpdmVRdWVyaWVzKCkpLAotCQkJU3FsUmVzdWx0U2V0TWFwcGluZy5idWlsZFRyYW5zbGF0b3IoSlBBLlNRTF9SRVNVTFRfU0VUX01BUFBJTkcsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NxbFJlc3VsdFNldE1hcHBpbmdzKCkpLAotCQkJWG1sTWFwcGVkU3VwZXJjbGFzcy5idWlsZFRyYW5zbGF0b3IoSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxFbnRpdHlNYXBwaW5nc19NYXBwZWRTdXBlcmNsYXNzZXMoKSksCi0JCQlYbWxFbnRpdHkuYnVpbGRUcmFuc2xhdG9yKEpQQS5FTlRJVFksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VudGl0aWVzKCkpLAotCQkJWG1sRW1iZWRkYWJsZS5idWlsZFRyYW5zbGF0b3IoSlBBLkVNQkVEREFCTEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0VtYmVkZGFibGVzKCkpLAotCQl9OwotCX0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuREVTQ1JJUFRJT04sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX0Rlc2NyaXB0aW9uKCkpOwotCX0KLQkJCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUGFja2FnZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUEFDS0FHRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfUGFja2FnZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5TQ0hFTUEsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEVudGl0eU1hcHBpbmdzX1NjaGVtYSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0FUQUxPRywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sRW50aXR5TWFwcGluZ3NfQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5BQ0NFU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEFjY2Vzc0hvbGRlcl9BY2Nlc3MoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlZmFjdG9yaW5ncyAqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lUGFja2FnZUVkaXQoU3RyaW5nIG5ld05hbWUpIHsKLQkJaW50IG9mZnNldCA9IGdldEVsZW1lbnROb2RlKEpQQS5QQUNLQUdFKS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCwgdGhpcy5wYWNrYWdlXy5sZW5ndGgoKSwgbmV3TmFtZSk7CQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxFdmVudE1ldGhvZENvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllY2M4N2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEV2ZW50TWV0aG9kQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFdmVudCBNZXRob2QgQ29udGFpbmVyPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RQZXJzaXN0IDxlbT5Qb3N0IFBlcnNpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UHJlUmVtb3ZlIDxlbT5QcmUgUmVtb3ZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVVwZGF0ZSA8ZW0+UHJlIFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0TG9hZCA8ZW0+UG9zdCBMb2FkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXIoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBQZXJzaXN0PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVBlcnNpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJlUGVyc2lzdCBnZXRQcmVQZXJzaXN0KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVBlcnNpc3QgPGVtPlByZSBQZXJzaXN0PC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlUGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlUGVyc2lzdChQcmVQZXJzaXN0IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgUGVyc2lzdDwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgUGVyc2lzdDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RDb250YWluZXJfUG9zdFBlcnNpc3QoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9zdFBlcnNpc3QgZ2V0UG9zdFBlcnNpc3QoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRXZlbnRNZXRob2RDb250YWluZXIjZ2V0UG9zdFBlcnNpc3QgPGVtPlBvc3QgUGVyc2lzdDwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBQZXJzaXN0PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQb3N0UGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdFBlcnNpc3QoUG9zdFBlcnNpc3QgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJlIFJlbW92ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QcmUgUmVtb3ZlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1ByZVJlbW92ZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlQcmVSZW1vdmUgZ2V0UHJlUmVtb3ZlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFByZVJlbW92ZSA8ZW0+UHJlIFJlbW92ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJlUmVtb3ZlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQcmVSZW1vdmUoUHJlUmVtb3ZlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvc3QgUmVtb3ZlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RSZW1vdmUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUG9zdFJlbW92ZSBnZXRQb3N0UmVtb3ZlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RSZW1vdmUgPGVtPlBvc3QgUmVtb3ZlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IFJlbW92ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdFJlbW92ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UG9zdFJlbW92ZShQb3N0UmVtb3ZlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByZSBVcGRhdGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJlIFVwZGF0ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UHJlVXBkYXRlKFByZVVwZGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9QcmVVcGRhdGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JUHJlVXBkYXRlIGdldFByZVVwZGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQcmVVcGRhdGUgPGVtPlByZSBVcGRhdGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByZSBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFByZVVwZGF0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHJlVXBkYXRlKFByZVVwZGF0ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IFVwZGF0ZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxFdmVudE1ldGhvZENvbnRhaW5lcl9Qb3N0VXBkYXRlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvc3RVcGRhdGUgZ2V0UG9zdFVwZGF0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFdmVudE1ldGhvZENvbnRhaW5lciNnZXRQb3N0VXBkYXRlIDxlbT5Qb3N0IFVwZGF0ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9zdCBVcGRhdGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBvc3RVcGRhdGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3RVcGRhdGUoUG9zdFVwZGF0ZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qb3N0IExvYWQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qb3N0IExvYWQ8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBvc3RMb2FkKFBvc3RMb2FkKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kQ29udGFpbmVyX1Bvc3RMb2FkKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVBvc3RMb2FkIGdldFBvc3RMb2FkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEV2ZW50TWV0aG9kQ29udGFpbmVyI2dldFBvc3RMb2FkIDxlbT5Qb3N0IExvYWQ8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBvc3QgTG9hZDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UG9zdExvYWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFBvc3RMb2FkKFBvc3RMb2FkIHZhbHVlKTsKLQotfSAvLyBYbWxFdmVudE1ldGhvZENvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRlZFZhbHVlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY0Zjg5YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdGVkVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUjZ2V0R2VuZXJhdG9yIDxlbT5HZW5lcmF0b3I8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUjZ2V0U3RyYXRlZ3kgPGVtPlN0cmF0ZWd5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdGVkVmFsdWUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sR2VuZXJhdGVkVmFsdWUgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRvcigpIDxlbT5HZW5lcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRvcigpIDxlbT5HZW5lcmF0b3I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5lcmF0b3IgPSBHRU5FUkFUT1JfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBHZW5lcmF0aW9uVHlwZSBTVFJBVEVHWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTdHJhdGVneSgpIDxlbT5TdHJhdGVneTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U3RyYXRlZ3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBzdHJhdGVneSA9IFNUUkFURUdZX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbEdlbmVyYXRlZFZhbHVlKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0dFTkVSQVRFRF9WQUxVRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0b3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0b3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRvcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdGVkVmFsdWVfR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0R2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiBnZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0ZWRWYWx1ZSNnZXRHZW5lcmF0b3IgPGVtPkdlbmVyYXRvcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdG9yPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3IoU3RyaW5nIG5ld0dlbmVyYXRvcikKLQl7Ci0JCVN0cmluZyBvbGRHZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ld0dlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX19HRU5FUkFUT1IsIG9sZEdlbmVyYXRvciwgZ2VuZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3RyYXRlZ3k8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iVEFCTEUiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlN0cmF0ZWd5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0cmF0ZWd5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uR2VuZXJhdGlvblR5cGUKLQkgKiBAc2VlICNzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IlRBQkxFIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgR2VuZXJhdGlvblR5cGUgZ2V0U3RyYXRlZ3koKQotCXsKLQkJcmV0dXJuIHN0cmF0ZWd5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdGVkVmFsdWUjZ2V0U3RyYXRlZ3kgPGVtPlN0cmF0ZWd5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TdHJhdGVneTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkdlbmVyYXRpb25UeXBlCi0JICogQHNlZSAjZ2V0U3RyYXRlZ3koKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJhdGVneShHZW5lcmF0aW9uVHlwZSBuZXdTdHJhdGVneSkKLQl7Ci0JCUdlbmVyYXRpb25UeXBlIG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gbmV3U3RyYXRlZ3kgPT0gbnVsbCA/IFNUUkFURUdZX0VERUZBVUxUIDogbmV3U3RyYXRlZ3k7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1ksIG9sZFN0cmF0ZWd5LCBzdHJhdGVneSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gZ2V0R2VuZXJhdG9yKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1k6Ci0JCQkJcmV0dXJuIGdldFN0cmF0ZWd5KCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUjoKLQkJCQlzZXRHZW5lcmF0b3IoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfX1NUUkFURUdZOgotCQkJCXNldFN0cmF0ZWd5KChHZW5lcmF0aW9uVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFURURfVkFMVUVfX0dFTkVSQVRPUjoKLQkJCQlzZXRHZW5lcmF0b3IoR0VORVJBVE9SX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fU1RSQVRFR1k6Ci0JCQkJc2V0U3RyYXRlZ3koU1RSQVRFR1lfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRFRF9WQUxVRV9fR0VORVJBVE9SOgotCQkJCXJldHVybiBHRU5FUkFUT1JfRURFRkFVTFQgPT0gbnVsbCA/IGdlbmVyYXRvciAhPSBudWxsIDogIUdFTkVSQVRPUl9FREVGQVVMVC5lcXVhbHMoZ2VuZXJhdG9yKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVEVEX1ZBTFVFX19TVFJBVEVHWToKLQkJCQlyZXR1cm4gc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdlbmVyYXRvcjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZ2VuZXJhdG9yKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzdHJhdGVneTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc3RyYXRlZ3kpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEdlbmVyYXRvclRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuR0VORVJBVE9SKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRTdHJhdGVneVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkR2VuZXJhdG9yVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU3RyYXRlZ3lUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlNUUkFURUdZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0ZWRWYWx1ZV9TdHJhdGVneSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRHZW5lcmF0b3JUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkdFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdGVkVmFsdWVfR2VuZXJhdG9yKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBHZW5lcmF0ZWRWYWx1ZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2JkNWJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzA7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkdlbmVyYXRvcjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvciNnZXRBbGxvY2F0aW9uU2l6ZSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxHZW5lcmF0b3IgZXh0ZW5kcyBYbWxHZW5lcmF0b3JfMl8wCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdGlhbFZhbHVlKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlJbnRlZ2VyIGdldEluaXRpYWxWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0SW5pdGlhbFZhbHVlIDxlbT5Jbml0aWFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRJbml0aWFsVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JSW50ZWdlciBnZXRBbGxvY2F0aW9uU2l6ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxHZW5lcmF0b3IjZ2V0QWxsb2NhdGlvblNpemUgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlciB2YWx1ZSk7Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdG9yQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sR2VuZXJhdG9yQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYTU0MTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEdlbmVyYXRvckNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgR2VuZXJhdG9yIENvbnRhaW5lcjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRUYWJsZUdlbmVyYXRvciA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxHZW5lcmF0b3JDb250YWluZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sU2VxdWVuY2VHZW5lcmF0b3IgZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sR2VuZXJhdG9yQ29udGFpbmVyI2dldFNlcXVlbmNlR2VuZXJhdG9yIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNlcXVlbmNlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNlcXVlbmNlR2VuZXJhdG9yKFhtbFNlcXVlbmNlR2VuZXJhdG9yIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRhYmxlIEdlbmVyYXRvcjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0VGFibGVHZW5lcmF0b3IoWG1sVGFibGVHZW5lcmF0b3IpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFRhYmxlR2VuZXJhdG9yIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRvckNvbnRhaW5lciNnZXRUYWJsZUdlbmVyYXRvciA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFRhYmxlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciB2YWx1ZSk7Ci0KLX0gLy8gWG1sR2VuZXJhdG9yQ29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODc3Yzg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SWQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbElkIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGxlbWVudHMgQ29sdW1uTWFwcGluZywgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxHZW5lcmF0b3JDb250YWluZXIKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb2x1bW4oKSA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDb2x1bW4oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxDb2x1bW4gY29sdW1uOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYigpIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTG9iKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gTE9CX0VERUZBVUxUID0gZmFsc2U7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMb2IoKSA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0xvYigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9iID0gTE9CX0VERUZBVUxUOwotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRlbXBvcmFsVHlwZSBURU1QT1JBTF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUZW1wb3JhbCgpIDxlbT5UZW1wb3JhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgdGVtcG9yYWwgPSBURU1QT1JBTF9FREVGQVVMVDsKLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnVtVHlwZSBFTlVNRVJBVEVEX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnVtZXJhdGVkKCkgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFbnVtVHlwZSBlbnVtZXJhdGVkID0gRU5VTUVSQVRFRF9FREVGQVVMVDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZUdlbmVyYXRvcigpIDxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3I7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGVHZW5lcmF0b3IoKSA8ZW0+VGFibGUgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUYWJsZUdlbmVyYXRvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdlbmVyYXRlZFZhbHVlKCkgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0R2VuZXJhdGVkVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxJZCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0Q29sdW1uTWFwcGluZ19Db2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENvbHVtbiBnZXRDb2x1bW4oKQotCXsKLQkJcmV0dXJuIGNvbHVtbjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRDb2x1bW4oWG1sQ29sdW1uIG5ld0NvbHVtbiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbENvbHVtbiBvbGRDb2x1bW4gPSBjb2x1bW47Ci0JCWNvbHVtbiA9IG5ld0NvbHVtbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfX0NPTFVNTiwgb2xkQ29sdW1uLCBuZXdDb2x1bW4pOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4pCi0JewotCQlpZiAobmV3Q29sdW1uICE9IGNvbHVtbikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU4sIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0NvbHVtbiAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDb2x1bW4pLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldENvbHVtbihuZXdDb2x1bW4sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfX0NPTFVNTiwgbmV3Q29sdW1uLCBuZXdDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9iKCkKLQl7Ci0JCXJldHVybiBsb2I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNpc0xvYiA8ZW0+TG9iPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzTG9iKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9iKGJvb2xlYW4gbmV3TG9iKQotCXsKLQkJYm9vbGVhbiBvbGRMb2IgPSBsb2I7Ci0JCWxvYiA9IG5ld0xvYjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfX0xPQiwgb2xkTG9iLCBsb2IpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19UZW1wb3JhbCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBUZW1wb3JhbFR5cGUgZ2V0VGVtcG9yYWwoKQotCXsKLQkJcmV0dXJuIHRlbXBvcmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKQotCXsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGVtcG9yYWw7Ci0JCXRlbXBvcmFsID0gbmV3VGVtcG9yYWwgPT0gbnVsbCA/IFRFTVBPUkFMX0VERUZBVUxUIDogbmV3VGVtcG9yYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTCwgb2xkVGVtcG9yYWwsIHRlbXBvcmFsKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlICNzZXRFbnVtZXJhdGVkKEVudW1UeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19FbnVtZXJhdGVkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudW1UeXBlIGdldEVudW1lcmF0ZWQoKQotCXsKLQkJcmV0dXJuIGVudW1lcmF0ZWQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRFbnVtZXJhdGVkIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUKLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW51bWVyYXRlZChFbnVtVHlwZSBuZXdFbnVtZXJhdGVkKQotCXsKLQkJRW51bVR5cGUgb2xkRW51bWVyYXRlZCA9IGVudW1lcmF0ZWQ7Ci0JCWVudW1lcmF0ZWQgPSBuZXdFbnVtZXJhdGVkID09IG51bGwgPyBFTlVNRVJBVEVEX0VERUZBVUxUIDogbmV3RW51bWVyYXRlZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfX0VOVU1FUkFURUQsIG9sZEVudW1lcmF0ZWQsIGVudW1lcmF0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5HZW5lcmF0ZWQgVmFsdWU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HZW5lcmF0ZWQgVmFsdWU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbElkX0dlbmVyYXRlZFZhbHVlKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxHZW5lcmF0ZWRWYWx1ZSBnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JewotCQlyZXR1cm4gZ2VuZXJhdGVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0R2VuZXJhdGVkVmFsdWUoWG1sR2VuZXJhdGVkVmFsdWUgbmV3R2VuZXJhdGVkVmFsdWUsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxHZW5lcmF0ZWRWYWx1ZSBvbGRHZW5lcmF0ZWRWYWx1ZSA9IGdlbmVyYXRlZFZhbHVlOwotCQlnZW5lcmF0ZWRWYWx1ZSA9IG5ld0dlbmVyYXRlZFZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFLCBvbGRHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQjZ2V0R2VuZXJhdGVkVmFsdWUgPGVtPkdlbmVyYXRlZCBWYWx1ZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+R2VuZXJhdGVkIFZhbHVlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRHZW5lcmF0ZWRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZFZhbHVlKFhtbEdlbmVyYXRlZFZhbHVlIG5ld0dlbmVyYXRlZFZhbHVlKQotCXsKLQkJaWYgKG5ld0dlbmVyYXRlZFZhbHVlICE9IGdlbmVyYXRlZFZhbHVlKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClnZW5lcmF0ZWRWYWx1ZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUUsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0dlbmVyYXRlZFZhbHVlICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0dlbmVyYXRlZFZhbHVlKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRSwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShuZXdHZW5lcmF0ZWRWYWx1ZSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKSBtc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9JRF9fR0VORVJBVEVEX1ZBTFVFLCBuZXdHZW5lcmF0ZWRWYWx1ZSwgbmV3R2VuZXJhdGVkVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYWJsZSBHZW5lcmF0b3I8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvckNvbnRhaW5lcl9UYWJsZUdlbmVyYXRvcigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sVGFibGVHZW5lcmF0b3IgZ2V0VGFibGVHZW5lcmF0b3IoKQotCXsKLQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldFRhYmxlR2VuZXJhdG9yKFhtbFRhYmxlR2VuZXJhdG9yIG5ld1RhYmxlR2VuZXJhdG9yLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sVGFibGVHZW5lcmF0b3Igb2xkVGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcjsKLQkJdGFibGVHZW5lcmF0b3IgPSBuZXdUYWJsZUdlbmVyYXRvcjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUiwgb2xkVGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkI2dldFRhYmxlR2VuZXJhdG9yIDxlbT5UYWJsZSBHZW5lcmF0b3I8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlIEdlbmVyYXRvcjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0VGFibGVHZW5lcmF0b3IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZUdlbmVyYXRvcihYbWxUYWJsZUdlbmVyYXRvciBuZXdUYWJsZUdlbmVyYXRvcikKLQl7Ci0JCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSB0YWJsZUdlbmVyYXRvcikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAodGFibGVHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpdGFibGVHZW5lcmF0b3IpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9fVEFCTEVfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdUYWJsZUdlbmVyYXRvciAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdUYWJsZUdlbmVyYXRvcikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1IsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0VGFibGVHZW5lcmF0b3IobmV3VGFibGVHZW5lcmF0b3IsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUiwgbmV3VGFibGVHZW5lcmF0b3IsIG5ld1RhYmxlR2VuZXJhdG9yKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgR2VuZXJhdG9yPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JDb250YWluZXJfU2VxdWVuY2VHZW5lcmF0b3IoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFNlcXVlbmNlR2VuZXJhdG9yIGdldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQl7Ci0JCXJldHVybiBzZXF1ZW5jZUdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihYbWxTZXF1ZW5jZUdlbmVyYXRvciBuZXdTZXF1ZW5jZUdlbmVyYXRvciwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIG9sZFNlcXVlbmNlR2VuZXJhdG9yID0gc2VxdWVuY2VHZW5lcmF0b3I7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yID0gbmV3U2VxdWVuY2VHZW5lcmF0b3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1IsIG9sZFNlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcik7Ci0JCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZCNnZXRTZXF1ZW5jZUdlbmVyYXRvciA8ZW0+U2VxdWVuY2UgR2VuZXJhdG9yPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBHZW5lcmF0b3I8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFNlcXVlbmNlR2VuZXJhdG9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2VHZW5lcmF0b3IoWG1sU2VxdWVuY2VHZW5lcmF0b3IgbmV3U2VxdWVuY2VHZW5lcmF0b3IpCi0JewotCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gc2VxdWVuY2VHZW5lcmF0b3IpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXNlcXVlbmNlR2VuZXJhdG9yKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3U2VxdWVuY2VHZW5lcmF0b3IgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3U2VxdWVuY2VHZW5lcmF0b3IpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFNlcXVlbmNlR2VuZXJhdG9yKG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1IsIG5ld1NlcXVlbmNlR2VuZXJhdG9yLCBuZXdTZXF1ZW5jZUdlbmVyYXRvcikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1NFUVVFTkNFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjoKLQkJCQlyZXR1cm4gYmFzaWNTZXRUYWJsZUdlbmVyYXRvcihudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlyZXR1cm4gYmFzaWNTZXRHZW5lcmF0ZWRWYWx1ZShudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU46Ci0JCQkJcmV0dXJuIGdldENvbHVtbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COgotCQkJCXJldHVybiBpc0xvYigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIGdldFRlbXBvcmFsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgotCQkJCXJldHVybiBnZXRFbnVtZXJhdGVkKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIGdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fQ09MVU1OOgotCQkJCXNldENvbHVtbigoWG1sQ29sdW1uKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19MT0I6Ci0JCQkJc2V0TG9iKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbCgoVGVtcG9yYWxUeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgotCQkJCXNldEVudW1lcmF0ZWQoKEVudW1UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJc2V0U2VxdWVuY2VHZW5lcmF0b3IoKFhtbFNlcXVlbmNlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJc2V0R2VuZXJhdGVkVmFsdWUoKFhtbEdlbmVyYXRlZFZhbHVlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COgotCQkJCXNldExvYihMT0JfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RFTVBPUkFMOgotCQkJCXNldFRlbXBvcmFsKFRFTVBPUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgotCQkJCXNldEVudW1lcmF0ZWQoRU5VTUVSQVRFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOgotCQkJCXNldFNlcXVlbmNlR2VuZXJhdG9yKChYbWxTZXF1ZW5jZUdlbmVyYXRvciludWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJc2V0VGFibGVHZW5lcmF0b3IoKFhtbFRhYmxlR2VuZXJhdG9yKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX0dFTkVSQVRFRF9WQUxVRToKLQkJCQlzZXRHZW5lcmF0ZWRWYWx1ZSgoWG1sR2VuZXJhdGVkVmFsdWUpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX0NPTFVNTjoKLQkJCQlyZXR1cm4gY29sdW1uICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19MT0I6Ci0JCQkJcmV0dXJuIGxvYiAhPSBMT0JfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19FTlVNRVJBVEVEOgotCQkJCXJldHVybiBlbnVtZXJhdGVkICE9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19TRVFVRU5DRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHNlcXVlbmNlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19UQUJMRV9HRU5FUkFUT1I6Ci0JCQkJcmV0dXJuIHRhYmxlR2VuZXJhdG9yICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19HRU5FUkFURURfVkFMVUU6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlZFZhbHVlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU46IHJldHVybiBPcm1QYWNrYWdlLkNPTFVNTl9NQVBQSU5HX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9COwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RFTVBPUkFMOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fRU5VTUVSQVRFRDogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0dFTkVSQVRPUl9DT05UQUlORVJfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IENvbHVtbk1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuQ09MVU1OX01BUFBJTkdfX0NPTFVNTjogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX0lEX19DT0xVTU47Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQ29udmVydGlibGVNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19MT0I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fTE9COwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fVEVNUE9SQUw7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfX0VOVU1FUkFURUQ7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sR2VuZXJhdG9yQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9HRU5FUkFUT1JfQ09OVEFJTkVSX19TRVFVRU5DRV9HRU5FUkFUT1I6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9fU0VRVUVOQ0VfR0VORVJBVE9SOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfR0VORVJBVE9SX0NPTlRBSU5FUl9fVEFCTEVfR0VORVJBVE9SOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSURfX1RBQkxFX0dFTkVSQVRPUjsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGxvYjogIik7Ci0JCXJlc3VsdC5hcHBlbmQobG9iKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0ZW1wb3JhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGVtcG9yYWwpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGVudW1lcmF0ZWQ6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGVudW1lcmF0ZWQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldEVudW1lcmF0ZWRUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZW51bWVyYXRlZCBub3Qgc3VwcG9ydGVkIGJ5IGlkIG1hcHBpbmdzIik7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXRMb2JUZXh0UmFuZ2UoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigibG9iIG5vdCBzdXBwb3J0ZWQgYnkgaWQgbWFwcGluZ3MiKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuVEVNUE9SQUwpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZEdlbmVyYXRlZFZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVGFibGVHZW5lcmF0b3JUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxDb2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldENvbHVtbk1hcHBpbmdfQ29sdW1uKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRHZW5lcmF0ZWRWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxHZW5lcmF0ZWRWYWx1ZS5idWlsZFRyYW5zbGF0b3IoSlBBLkdFTkVSQVRFRF9WQUxVRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSWRfR2VuZXJhdGVkVmFsdWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5URU1QT1JBTCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX1RlbXBvcmFsKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUYWJsZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxUYWJsZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlRBQkxFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1RhYmxlR2VuZXJhdG9yKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTZXF1ZW5jZUdlbmVyYXRvclRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxTZXF1ZW5jZUdlbmVyYXRvci5idWlsZFRyYW5zbGF0b3IoSlBBLlNFUVVFTkNFX0dFTkVSQVRPUiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yQ29udGFpbmVyX1NlcXVlbmNlR2VuZXJhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxJZENsYXNzQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSWRDbGFzc0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDUwY2ZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxJZENsYXNzQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBJZCBDbGFzcyBDb250YWluZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxJZENsYXNzQ29udGFpbmVyI2dldElkQ2xhc3MgPGVtPklkIENsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRDbGFzc0NvbnRhaW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSWRDbGFzc0NvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZCBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldElkQ2xhc3MoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSWRDbGFzc0NvbnRhaW5lcl9JZENsYXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENsYXNzUmVmZXJlbmNlIGdldElkQ2xhc3MoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWRDbGFzc0NvbnRhaW5lciNnZXRJZENsYXNzIDxlbT5JZCBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldElkQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkQ2xhc3MoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi19IC8vIFhtbElkQ2xhc3NDb250YWluZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjdjN2Y4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Kb2luIENvbHVtbjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sSm9pbkNvbHVtbiBleHRlbmRzIEFic3RyYWN0WG1sQmFzZUNvbHVtbiBpbXBsZW1lbnRzIFhtbEJhc2VKb2luQ29sdW1uCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luQ29sdW1uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX0pPSU5fQ09MVU1OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbiNnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShTdHJpbmcgbmV3UmVmZXJlbmNlZENvbHVtbk5hbWUpCi0JewotCQlTdHJpbmcgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBuZXdSZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIG9sZFJlZmVyZW5jZWRDb2x1bW5OYW1lLCByZWZlcmVuY2VkQ29sdW1uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHJlZmVyZW5jZWRDb2x1bW5OYW1lICE9IG51bGwgOiAhUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9FREVGQVVMVC5lcXVhbHMocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxCYXNlSm9pbkNvbHVtbi5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9CQVNFX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzZUpvaW5Db2x1bW4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0JBU0VfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHJlZmVyZW5jZWRDb2x1bW5OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVW5pcXVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGROdWxsYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5zZXJ0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVXBkYXRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYWJsZVRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlJFRkVSRU5DRURfQ09MVU1OX05BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2VKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfSAvLyBKb2luQ29sdW1uCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbkNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5Db2x1bW5Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExYjk5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pbkNvbHVtbkNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSm9pbiBDb2x1bW4gQ29udGFpbmVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbkNvbnRhaW5lciNnZXRKb2luQ29sdW1ucyA8ZW0+Sm9pbiBDb2x1bW5zPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pbkNvbHVtbkNvbnRhaW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sSm9pbkNvbHVtbkNvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5Db250YWluZXJfSm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sSm9pbkNvbHVtbj4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQotfSAvLyBYbWxKb2luQ29sdW1uQ29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NGM1MjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGUjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zIDxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxKb2luVGFibGUgZXh0ZW5kcyBBYnN0cmFjdFhtbFJlZmVyZW5jZVRhYmxlCi17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkgPGVtPkludmVyc2UgSm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEludmVyc2VKb2luQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGludmVyc2VKb2luQ29sdW1uczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKb2luVGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfSk9JTl9UQUJMRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnZlcnNlIEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnZlcnNlIEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludmVyc2UgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZV9JbnZlcnNlSm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEludmVyc2VKb2luQ29sdW1ucygpCi0JewotCQlpZiAoaW52ZXJzZUpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCWludmVyc2VKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKb2luQ29sdW1uPihYbWxKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX19JTlZFUlNFX0pPSU5fQ09MVU1OUyk7Ci0JCX0KLQkJcmV0dXJuIGludmVyc2VKb2luQ29sdW1uczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGdldEludmVyc2VKb2luQ29sdW1ucygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbEpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfX0lOVkVSU0VfSk9JTl9DT0xVTU5TOgotCQkJCWdldEludmVyc2VKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9fSU5WRVJTRV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIGludmVyc2VKb2luQ29sdW1ucyAhPSBudWxsICYmICFpbnZlcnNlSm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NwZWNpZmllZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRJbnZlcnNlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJbnZlcnNlSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuSU5WRVJTRV9KT0lOX0NPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sSm9pblRhYmxlX0ludmVyc2VKb2luQ29sdW1ucygpKTsKLQl9Ci0KLX0gLy8gSm9pblRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlQ29udGFpbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sSm9pblRhYmxlQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTkzNjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbEpvaW5UYWJsZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgSm9pbiBUYWJsZSBDb250YWluZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXIjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxKb2luVGFibGVDb250YWluZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRKb2luVGFibGUoWG1sSm9pblRhYmxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5UYWJsZUNvbnRhaW5lcl9Kb2luVGFibGUoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sSm9pblRhYmxlIGdldEpvaW5UYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXIjZ2V0Sm9pblRhYmxlIDxlbT5Kb2luIFRhYmxlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Kb2luIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRKb2luVGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEpvaW5UYWJsZShYbWxKb2luVGFibGUgdmFsdWUpOwotCi19IC8vIFhtbEpvaW5UYWJsZUNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9NYW55LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDEyOTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb01hbnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TWFueSBUbyBNYW55PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxNYW55VG9NYW55IGV4dGVuZHMgQWJzdHJhY3RYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmcgaW1wbGVtZW50cyBYbWxNYW55VG9NYW55XzJfMAotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYW55VG9NYW55KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX01BTllfVE9fTUFOWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcmRlckNvbHVtblRyYW5zbGF0b3IoKSwJCQotCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlUZW1wb3JhbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5RW51bWVyYXRlZFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hbnlUb09uZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJlZDQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxNYW55VG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5NYW55IFRvIE9uZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hbnlUb09uZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxNYW55VG9PbmUgZXh0ZW5kcyBBYnN0cmFjdFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmcKLXsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYW55VG9PbmUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTUFOWV9UT19PTkU7Ci0JfQotCi0JLy8gKioqKioqKioqKioqKioqKiBYbWxBdHRyaWJ1dGVNYXBwaW5nIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcHRpb25hbFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luQ29sdW1uVHJhbnNsYXRvcigpLAotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9CQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZEJ5TWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZEJ5TWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDUyMDAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxNYXBwZWRCeU1hcHBpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3duYWJsZSBSZWxhdGlvbnNoaXAgTWFwcGluZzwvYj48L2VtPicuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRCeU1hcHBpbmcjZ2V0TWFwcGVkQnkgPGVtPk1hcHBlZCBCeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZEJ5TWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwcGVkQnlNYXBwaW5nIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHBlZCBCeTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwcGVkIEJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwcGVkQnkoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZEJ5TWFwcGluZ19NYXBwZWRCeSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwcGVkQnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkQnlNYXBwaW5nI2dldE1hcHBlZEJ5IDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TWFwcGVkQnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcHBlZEJ5KFN0cmluZyB2YWx1ZSk7Ci0KLQlUZXh0UmFuZ2UgZ2V0TWFwcGVkQnlUZXh0UmFuZ2UoKTsJCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkU3VwZXJjbGFzcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE1hcHBlZFN1cGVyY2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY2ZTg3Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sTWFwcGVkU3VwZXJjbGFzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5FbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hcHBlZCBTdXBlcmNsYXNzPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycyA8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzI2lzRXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRFbnRpdHlMaXN0ZW5lcnMgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hcHBlZFN1cGVyY2xhc3MgZXh0ZW5kcyBBYnN0cmFjdFhtbFR5cGVNYXBwaW5nIGltcGxlbWVudHMgWG1sSWRDbGFzc0NvbnRhaW5lcgotewotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SWRDbGFzcygpIDxlbT5JZCBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SWRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENsYXNzUmVmZXJlbmNlIGlkQ2xhc3M7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlRGVmYXVsdExpc3RlbmVycygpIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlRGVmYXVsdExpc3RlbmVycyA9IEVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpIDxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpIDxlbT5FeGNsdWRlIFN1cGVyY2xhc3MgTGlzdGVuZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA9IEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlNfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlMaXN0ZW5lcnMoKSA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5TGlzdGVuZXJzIGVudGl0eUxpc3RlbmVyczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxNYXBwZWRTdXBlcmNsYXNzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCi0JcHVibGljIFhtbEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKCkgewotCQlyZXR1cm4gKFhtbEVudGl0eU1hcHBpbmdzKSBlQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX01BUFBFRF9TVVBFUkNMQVNTOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPklkIENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5JZCBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0SWRDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxJZENsYXNzQ29udGFpbmVyX0lkQ2xhc3MoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbENsYXNzUmVmZXJlbmNlIGdldElkQ2xhc3MoKQotCXsKLQkJcmV0dXJuIGlkQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0SWRDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSBuZXdJZENsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ2xhc3NSZWZlcmVuY2Ugb2xkSWRDbGFzcyA9IGlkQ2xhc3M7Ci0JCWlkQ2xhc3MgPSBuZXdJZENsYXNzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MsIG9sZElkQ2xhc3MsIG5ld0lkQ2xhc3MpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNnZXRJZENsYXNzIDxlbT5JZCBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SWQgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldElkQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZENsYXNzKFhtbENsYXNzUmVmZXJlbmNlIG5ld0lkQ2xhc3MpCi0JewotCQlpZiAobmV3SWRDbGFzcyAhPSBpZENsYXNzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChpZENsYXNzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWlkQ2xhc3MpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1MsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0lkQ2xhc3MgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3SWRDbGFzcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRJZENsYXNzKG5ld0lkQ2xhc3MsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTLCBuZXdJZENsYXNzLCBuZXdJZENsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBEZWZhdWx0IExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzcyNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzIDxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FeGNsdWRlIERlZmF1bHQgTGlzdGVuZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoYm9vbGVhbiBuZXdFeGNsdWRlRGVmYXVsdExpc3RlbmVycykKLQl7Ci0JCWJvb2xlYW4gb2xkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPSBleGNsdWRlRGVmYXVsdExpc3RlbmVyczsKLQkJZXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMgPSBuZXdFeGNsdWRlRGVmYXVsdExpc3RlbmVyczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMsIG9sZEV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzLCBleGNsdWRlRGVmYXVsdExpc3RlbmVycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgU3VwZXJjbGFzcyBMaXN0ZW5lcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiBleGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycyA8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBTdXBlcmNsYXNzIExpc3RlbmVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKGJvb2xlYW4gbmV3RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMpCi0JewotCQlib29sZWFuIG9sZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzID0gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JCWV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzID0gbmV3RXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLCBvbGRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycywgZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGl0eUxpc3RlbmVycyhFbnRpdHlMaXN0ZW5lcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVudGl0eUxpc3RlbmVycyBnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCXsKLQkJcmV0dXJuIGVudGl0eUxpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMoRW50aXR5TGlzdGVuZXJzIG5ld0VudGl0eUxpc3RlbmVycywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCUVudGl0eUxpc3RlbmVycyBvbGRFbnRpdHlMaXN0ZW5lcnMgPSBlbnRpdHlMaXN0ZW5lcnM7Ci0JCWVudGl0eUxpc3RlbmVycyA9IG5ld0VudGl0eUxpc3RlbmVyczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQl7Ci0JCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMsIG9sZEVudGl0eUxpc3RlbmVycywgbmV3RW50aXR5TGlzdGVuZXJzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3MjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHlMaXN0ZW5lcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbnRpdHlMaXN0ZW5lcnMoRW50aXR5TGlzdGVuZXJzIG5ld0VudGl0eUxpc3RlbmVycykKLQl7Ci0JCWlmIChuZXdFbnRpdHlMaXN0ZW5lcnMgIT0gZW50aXR5TGlzdGVuZXJzKQotCQl7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlbnRpdHlMaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpZW50aXR5TGlzdGVuZXJzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGl0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFbnRpdHlMaXN0ZW5lcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUywgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMobmV3RW50aXR5TGlzdGVuZXJzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTLCBuZXdFbnRpdHlMaXN0ZW5lcnMsIG5ld0VudGl0eUxpc3RlbmVycykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1M6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0SWRDbGFzcyhudWxsLCBtc2dzKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5TGlzdGVuZXJzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTOgotCQkJCXJldHVybiBnZXRJZENsYXNzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgotCQkJCXJldHVybiBpc0V4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTOgotCQkJCXJldHVybiBpc0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FTlRJVFlfTElTVEVORVJTOgotCQkJCXJldHVybiBnZXRFbnRpdHlMaXN0ZW5lcnMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUzoKLQkJCQlzZXRJZENsYXNzKChYbWxDbGFzc1JlZmVyZW5jZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlU3VwZXJjbGFzc0xpc3RlbmVycygoQm9vbGVhbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1M6Ci0JCQkJc2V0SWRDbGFzcygoWG1sQ2xhc3NSZWZlcmVuY2UpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9ERUZBVUxUX0xJU1RFTkVSUzoKLQkJCQlzZXRFeGNsdWRlRGVmYXVsdExpc3RlbmVycyhFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTOgotCQkJCXNldEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKEVYQ0xVREVfU1VQRVJDTEFTU19MSVNURU5FUlNfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJc2V0RW50aXR5TGlzdGVuZXJzKChFbnRpdHlMaXN0ZW5lcnMpbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0lEX0NMQVNTOgotCQkJCXJldHVybiBpZENsYXNzICE9IG51bGw7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19FWENMVURFX0RFRkFVTFRfTElTVEVORVJTOgotCQkJCXJldHVybiBleGNsdWRlRGVmYXVsdExpc3RlbmVycyAhPSBFWENMVURFX0RFRkFVTFRfTElTVEVORVJTX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnMgIT0gRVhDTFVERV9TVVBFUkNMQVNTX0xJU1RFTkVSU19FREVGQVVMVDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTUFQUEVEX1NVUEVSQ0xBU1NfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGVudGl0eUxpc3RlbmVycyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxJZENsYXNzQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfU1VQRVJDTEFTU19fSURfQ0xBU1M6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9JRF9DTEFTU19DT05UQUlORVJfX0lEX0NMQVNTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sSWRDbGFzc0NvbnRhaW5lci5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfSURfQ0xBU1NfQ09OVEFJTkVSX19JRF9DTEFTUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9TVVBFUkNMQVNTX19JRF9DTEFTUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGV4Y2x1ZGVEZWZhdWx0TGlzdGVuZXJzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlRGVmYXVsdExpc3RlbmVycyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZXhjbHVkZVN1cGVyY2xhc3NMaXN0ZW5lcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNZXRhZGF0YUNvbXBsZXRlVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSWRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlidWlsZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCksCi0JCQlQcmVQZXJzaXN0LmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUG9zdFBlcnNpc3QuYnVpbGRUcmFuc2xhdG9yKCksCi0JCQlQcmVSZW1vdmUuYnVpbGRUcmFuc2xhdG9yKCksCi0JCQlQb3N0UmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUHJlVXBkYXRlLmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJUG9zdFVwZGF0ZS5idWlsZFRyYW5zbGF0b3IoKSwKLQkJCVBvc3RMb2FkLmJ1aWxkVHJhbnNsYXRvcigpLAotCQkJQXR0cmlidXRlcy5idWlsZFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRJZENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFhtbENsYXNzUmVmZXJlbmNlLmJ1aWxkVHJhbnNsYXRvcihKUEEuSURfQ0xBU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbElkQ2xhc3NDb250YWluZXJfSWRDbGFzcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBLkVYQ0xVREVfREVGQVVMVF9MSVNURU5FUlMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZFN1cGVyY2xhc3NfRXhjbHVkZURlZmF1bHRMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEV4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBFbXB0eVRhZ0Jvb2xlYW5UcmFuc2xhdG9yKEpQQS5FWENMVURFX1NVUEVSQ0xBU1NfTElTVEVORVJTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxNYXBwZWRTdXBlcmNsYXNzX0V4Y2x1ZGVTdXBlcmNsYXNzTGlzdGVuZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gRW50aXR5TGlzdGVuZXJzLmJ1aWxkVHJhbnNsYXRvcihKUEEuRU5USVRZX0xJU1RFTkVSUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGVkU3VwZXJjbGFzc19FbnRpdHlMaXN0ZW5lcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFByZVBlcnNpc3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUHJlUGVyc2lzdC5idWlsZFRyYW5zbGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQb3N0UGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBQb3N0UGVyc2lzdC5idWlsZFRyYW5zbGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmVSZW1vdmVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUHJlUmVtb3ZlLmJ1aWxkVHJhbnNsYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBvc3RSZW1vdmVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUG9zdFJlbW92ZS5idWlsZFRyYW5zbGF0b3IoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJlVXBkYXRlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFByZVVwZGF0ZS5idWlsZFRyYW5zbGF0b3IoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUG9zdFVwZGF0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBQb3N0VXBkYXRlLmJ1aWxkVHJhbnNsYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBvc3RMb2FkVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIFBvc3RMb2FkLmJ1aWxkVHJhbnNsYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZENvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDQwNzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTmFtZWQgQ29sdW1uPC9iPjwvZW0+Jy4KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbiA8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxOYW1lZENvbHVtbiBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gRGVmaW5pdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbHVtbkRlZmluaXRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uX0NvbHVtbkRlZmluaXRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbHVtbkRlZmluaXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0Q29sdW1uRGVmaW5pdGlvbiA8ZW0+Q29sdW1uIERlZmluaXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBEZWZpbml0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5EZWZpbml0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb2x1bW5EZWZpbml0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkQ29sdW1uX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRDb2x1bW4jZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKLQotfSAvLyBYbWxOYW1lZENvbHVtbgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkTmF0aXZlUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZE5hdGl2ZVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTU5NmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE5hbWVkTmF0aXZlUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcnk8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5I2dldFJlc3VsdENsYXNzIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRTZXRNYXBwaW5nIDxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE5hbWVkTmF0aXZlUXVlcnkgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxRdWVyeQotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnkoKSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeSgpIDxlbT5RdWVyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnkgPSBRVUVSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhpbnRzKCkgPGVtPkhpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUXVlcnlIaW50PiBoaW50czsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRDbGFzcygpIDxlbT5SZXN1bHQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfQ0xBU1NfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVzdWx0Q2xhc3MoKSA8ZW0+UmVzdWx0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyByZXN1bHRDbGFzcyA9IFJFU1VMVF9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVzdWx0U2V0TWFwcGluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTVUxUX1NFVF9NQVBQSU5HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFJlc3VsdFNldE1hcHBpbmcoKSA8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc3VsdFNldE1hcHBpbmcgPSBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTmFtZWROYXRpdmVRdWVyeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9OQU1FRF9OQVRJVkVfUVVFUlk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5X05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkTmF0aXZlUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bHQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3VsdCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3VsdENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxOYW1lZE5hdGl2ZVF1ZXJ5X1Jlc3VsdENsYXNzKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVzdWx0Q2xhc3MoKQotCXsKLQkJcmV0dXJuIHJlc3VsdENsYXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRSZXN1bHRDbGFzcyA8ZW0+UmVzdWx0IENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlc3VsdENsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0Q2xhc3MoU3RyaW5nIG5ld1Jlc3VsdENsYXNzKQotCXsKLQkJU3RyaW5nIG9sZFJlc3VsdENsYXNzID0gcmVzdWx0Q2xhc3M7Ci0JCXJlc3VsdENsYXNzID0gbmV3UmVzdWx0Q2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTLCBvbGRSZXN1bHRDbGFzcywgcmVzdWx0Q2xhc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZXN1bHQgU2V0IE1hcHBpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZXN1bHQgU2V0IE1hcHBpbmc8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFJlc3VsdFNldE1hcHBpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlc3VsdFNldE1hcHBpbmcoKQotCXsKLQkJcmV0dXJuIHJlc3VsdFNldE1hcHBpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZE5hdGl2ZVF1ZXJ5I2dldFJlc3VsdFNldE1hcHBpbmcgPGVtPlJlc3VsdCBTZXQgTWFwcGluZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVzdWx0IFNldCBNYXBwaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRSZXN1bHRTZXRNYXBwaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0U2V0TWFwcGluZyhTdHJpbmcgbmV3UmVzdWx0U2V0TWFwcGluZykKLQl7Ci0JCVN0cmluZyBvbGRSZXN1bHRTZXRNYXBwaW5nID0gcmVzdWx0U2V0TWFwcGluZzsKLQkJcmVzdWx0U2V0TWFwcGluZyA9IG5ld1Jlc3VsdFNldE1hcHBpbmc7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HLCBvbGRSZXN1bHRTZXRNYXBwaW5nLCByZXN1bHRTZXRNYXBwaW5nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRRdWVyeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfUXVlcnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKQotCXsKLQkJcmV0dXJuIHF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeSNnZXRRdWVyeSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBuZXdRdWVyeSkKLQl7Ci0JCVN0cmluZyBvbGRRdWVyeSA9IHF1ZXJ5OwotCQlxdWVyeSA9IG5ld1F1ZXJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1FVRVJZLCBvbGRRdWVyeSwgcXVlcnkpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5IaW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkhpbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfSGludHMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFF1ZXJ5SGludD4gZ2V0SGludHMoKQotCXsKLQkJaWYgKGhpbnRzID09IG51bGwpCi0JCXsKLQkJCWhpbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFF1ZXJ5SGludD4oWG1sUXVlcnlIaW50LmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTKTsKLQkJfQotCQlyZXR1cm4gaGludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fSElOVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRIaW50cygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19RVUVSWToKLQkJCQlyZXR1cm4gZ2V0UXVlcnkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ISU5UUzoKLQkJCQlyZXR1cm4gZ2V0SGludHMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldFJlc3VsdENsYXNzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXJldHVybiBnZXRSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1FVRVJZOgotCQkJCXNldFF1ZXJ5KChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ISU5UUzoKLQkJCQlnZXRIaW50cygpLmNsZWFyKCk7Ci0JCQkJZ2V0SGludHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFF1ZXJ5SGludD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfQ0xBU1M6Ci0JCQkJc2V0UmVzdWx0Q2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9TRVRfTUFQUElORzoKLQkJCQlzZXRSZXN1bHRTZXRNYXBwaW5nKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoUVVFUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19ISU5UUzoKLQkJCQlnZXRIaW50cygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1JFU1VMVF9DTEFTUzoKLQkJCQlzZXRSZXN1bHRDbGFzcyhSRVNVTFRfQ0xBU1NfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfTkFUSVZFX1FVRVJZX19SRVNVTFRfU0VUX01BUFBJTkc6Ci0JCQkJc2V0UmVzdWx0U2V0TWFwcGluZyhSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX1FVRVJZOgotCQkJCXJldHVybiBRVUVSWV9FREVGQVVMVCA9PSBudWxsID8gcXVlcnkgIT0gbnVsbCA6ICFRVUVSWV9FREVGQVVMVC5lcXVhbHMocXVlcnkpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9OQVRJVkVfUVVFUllfX0hJTlRTOgotCQkJCXJldHVybiBoaW50cyAhPSBudWxsICYmICFoaW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX0NMQVNTOgotCQkJCXJldHVybiBSRVNVTFRfQ0xBU1NfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdENsYXNzICE9IG51bGwgOiAhUkVTVUxUX0NMQVNTX0VERUZBVUxULmVxdWFscyhyZXN1bHRDbGFzcyk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX05BVElWRV9RVUVSWV9fUkVTVUxUX1NFVF9NQVBQSU5HOgotCQkJCXJldHVybiBSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQgPT0gbnVsbCA/IHJlc3VsdFNldE1hcHBpbmcgIT0gbnVsbCA6ICFSRVNVTFRfU0VUX01BUFBJTkdfRURFRkFVTFQuZXF1YWxzKHJlc3VsdFNldE1hcHBpbmcpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHF1ZXJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChxdWVyeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcmVzdWx0Q2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHJlc3VsdENsYXNzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCByZXN1bHRTZXRNYXBwaW5nOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChyZXN1bHRTZXRNYXBwaW5nKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFF1ZXJ5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5RVUVSWSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZXN1bHRDbGFzc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUmVzdWx0U2V0TWFwcGluZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRIaW50VHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlfTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFJlc3VsdENsYXNzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5SRVNVTFRfQ0xBU1MsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0Q2xhc3MoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRSZXN1bHRTZXRNYXBwaW5nVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5SRVNVTFRfU0VUX01BUFBJTkcsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkTmF0aXZlUXVlcnlfUmVzdWx0U2V0TWFwcGluZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5ERVNDUklQVElPTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5XzJfMF9EZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRRdWVyeVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUVVFUlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X1F1ZXJ5KCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEhpbnRUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUXVlcnlIaW50LmJ1aWxkVHJhbnNsYXRvcihKUEEuSElOVCwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlfSGludHMoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFF1ZXJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sTmFtZWRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQwYTdiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxOYW1lZFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuU2ltcGxlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+TmFtZWQgUXVlcnk8L2I+PC9lbT4nLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkUXVlcnkoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sTmFtZWRRdWVyeSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFF1ZXJ5LCBYbWxOYW1lZFF1ZXJ5XzJfMAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UXVlcnkoKSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFF1ZXJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRRdWVyeSgpIDxlbT5RdWVyeTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UXVlcnkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcXVlcnkgPSBRVUVSWV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEhpbnRzKCkgPGVtPkhpbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEhpbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUXVlcnlIaW50PiBoaW50czsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIExvY2tNb2RlVHlwZV8yXzAgTE9DS19NT0RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExvY2tNb2RlKCkgPGVtPkxvY2sgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TG9ja01vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBMb2NrTW9kZVR5cGVfMl8wIGxvY2tNb2RlID0gTE9DS19NT0RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE5hbWVkUXVlcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTkFNRURfUVVFUlk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkKLQl7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkKLQl7Ci0JCVN0cmluZyBvbGROYW1lID0gbmFtZTsKLQkJbmFtZSA9IG5ld05hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRRdWVyeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfUXVlcnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVlcnkoKQotCXsKLQkJcmV0dXJuIHF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeSNnZXRRdWVyeSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5KFN0cmluZyBuZXdRdWVyeSkKLQl7Ci0JCVN0cmluZyBvbGRRdWVyeSA9IHF1ZXJ5OwotCQlxdWVyeSA9IG5ld1F1ZXJ5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlksIG9sZFF1ZXJ5LCBxdWVyeSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeV9IaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUXVlcnlIaW50PiBnZXRIaW50cygpCi0JewotCQlpZiAoaGludHMgPT0gbnVsbCkKLQkJewotCQkJaGludHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUXVlcnlIaW50PihYbWxRdWVyeUhpbnQuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ISU5UUyk7Ci0JCX0KLQkJcmV0dXJuIGhpbnRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxvY2sgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvY2sgTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NrIE1vZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAKLQkgKiBAc2VlICNzZXRMb2NrTW9kZShMb2NrTW9kZVR5cGVfMl8wKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE5hbWVkUXVlcnlfMl8wX0xvY2tNb2RlKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIExvY2tNb2RlVHlwZV8yXzAgZ2V0TG9ja01vZGUoKQotCXsKLQkJcmV0dXJuIGxvY2tNb2RlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeSNnZXRMb2NrTW9kZSA8ZW0+TG9jayBNb2RlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NrIE1vZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAKLQkgKiBAc2VlICNnZXRMb2NrTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExvY2tNb2RlKExvY2tNb2RlVHlwZV8yXzAgbmV3TG9ja01vZGUpCi0JewotCQlMb2NrTW9kZVR5cGVfMl8wIG9sZExvY2tNb2RlID0gbG9ja01vZGU7Ci0JCWxvY2tNb2RlID0gbmV3TG9ja01vZGUgPT0gbnVsbCA/IExPQ0tfTU9ERV9FREVGQVVMVCA6IG5ld0xvY2tNb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTE9DS19NT0RFLCBvbGRMb2NrTW9kZSwgbG9ja01vZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0hJTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0SGludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6Ci0JCQkJcmV0dXJuIGdldFF1ZXJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ISU5UUzoKLQkJCQlyZXR1cm4gZ2V0SGludHMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0xPQ0tfTU9ERToKLQkJCQlyZXR1cm4gZ2V0TG9ja01vZGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fSElOVFM6Ci0JCQkJZ2V0SGludHMoKS5jbGVhcigpOwotCQkJCWdldEhpbnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxRdWVyeUhpbnQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREU6Ci0JCQkJc2V0TG9ja01vZGUoKExvY2tNb2RlVHlwZV8yXzApbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fUVVFUlk6Ci0JCQkJc2V0UXVlcnkoUVVFUllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0hJTlRTOgotCQkJCWdldEhpbnRzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREU6Ci0JCQkJc2V0TG9ja01vZGUoTE9DS19NT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9OQU1FRF9RVUVSWV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19RVUVSWToKLQkJCQlyZXR1cm4gUVVFUllfRURFRkFVTFQgPT0gbnVsbCA/IHF1ZXJ5ICE9IG51bGwgOiAhUVVFUllfRURFRkFVTFQuZXF1YWxzKHF1ZXJ5KTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfTkFNRURfUVVFUllfX0hJTlRTOgotCQkJCXJldHVybiBoaW50cyAhPSBudWxsICYmICFoaW50cy5pc0VtcHR5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREU6Ci0JCQkJcmV0dXJuIGxvY2tNb2RlICE9IExPQ0tfTU9ERV9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTmFtZWRRdWVyeV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREU6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfTkFNRURfUVVFUllfMjBfX0xPQ0tfTU9ERTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE5hbWVkUXVlcnlfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfTkFNRURfUVVFUllfMjBfX0xPQ0tfTU9ERTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX05BTUVEX1FVRVJZX19MT0NLX01PREU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHF1ZXJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChxdWVyeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgbG9ja01vZGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGxvY2tNb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFF1ZXJ5VGV4dFJhbmdlKCkgewotCQkvLyA8bmFtZWQtcXVlcnk+Ci0JCUlET01Ob2RlIG5vZGUgPSBnZXRFbGVtZW50Tm9kZShKUEEuUVVFUlkpOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBUaGUgcXVlcnkgZWxlbWVudCBoYXMgdGV4dAotCQkJaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJcmV0dXJuIGJ1aWxkVGV4dFJhbmdlKChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCkpOwotCQkJfQotCQkJLy8gVGhlIHF1ZXJ5IGVsZW1lbnQgZG9lcyBub3QgaGF2ZSB0ZXh0Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gYnVpbGRUZXh0UmFuZ2Uobm9kZSk7Ci0JCQlyZXR1cm4gbmV3IFNpbXBsZVRleHRSYW5nZSgKLQkJCQlub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCksCi0JCQkJMCwKLQkJCQl0ZXh0UmFuZ2UuZ2V0TGluZU51bWJlcigpCi0JCQkpOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlidWlsZFF1ZXJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRMb2NrTW9kZVRyYW5zbGF0b3IoKSwKLQkJCVhtbFF1ZXJ5SGludC5idWlsZFRyYW5zbGF0b3IoSlBBMl8wLkhJTlQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X0hpbnRzKCkpLAotCQl9OwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFF1ZXJ5X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeV8yXzBfRGVzY3JpcHRpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUXVlcnlUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlFVRVJZLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeV9RdWVyeSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRMb2NrTW9kZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuTkFNRURfUVVFUllfX0xPQ0tfTU9ERSwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE5hbWVkUXVlcnlfMl8wX0xvY2tNb2RlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxOdWxsQXR0cmlidXRlTWFwcGluZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTYwNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE51bGxBdHRyaWJ1dGVNYXBwaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBOdWxsIEF0dHJpYnV0ZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbE51bGxBdHRyaWJ1dGVNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RYbWxBdHRyaWJ1dGVNYXBwaW5nCi17Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfTlVMTF9BVFRSSUJVVEVfTUFQUElORzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9NYW55LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjM4NTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvTWFueS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5PbmUgVG8gTWFueTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvTWFueSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxPbmVUb01hbnkgZXh0ZW5kcyBBYnN0cmFjdFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZyBpbXBsZW1lbnRzIFhtbEpvaW5Db2x1bW5Db250YWluZXIsIFhtbE9uZVRvTWFueV8yXzAKLXsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEpvaW5Db2x1bW5zKCkgPGVtPkpvaW4gQ29sdW1uczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKb2luQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE9ycGhhblJlbW92YWwoKSA8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE9ycGhhblJlbW92YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBPUlBIQU5fUkVNT1ZBTF9FREVGQVVMVCA9IG51bGw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JwaGFuUmVtb3ZhbCgpIDxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JwaGFuUmVtb3ZhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gb3JwaGFuUmVtb3ZhbCA9IE9SUEhBTl9SRU1PVkFMX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9uZVRvTWFueSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9PTkVfVE9fTUFOWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEpvaW5Db2x1bW5Db250YWluZXJfSm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCkKLQl7Ci0JCWlmIChqb2luQ29sdW1ucyA9PSBudWxsKQotCQl7Ci0JCQlqb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxKb2luQ29sdW1uPihYbWxKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gam9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlXzJfMF9PcnBoYW5SZW1vdmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkKLQl7Ci0JCXJldHVybiBvcnBoYW5SZW1vdmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55I2dldE9ycGhhblJlbW92YWwgPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JwaGFuUmVtb3ZhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiBuZXdPcnBoYW5SZW1vdmFsKQotCXsKLQkJQm9vbGVhbiBvbGRPcnBoYW5SZW1vdmFsID0gb3JwaGFuUmVtb3ZhbDsKLQkJb3JwaGFuUmVtb3ZhbCA9IG5ld09ycGhhblJlbW92YWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19NQU5ZX19PUlBIQU5fUkVNT1ZBTCwgb2xkT3JwaGFuUmVtb3ZhbCwgb3JwaGFuUmVtb3ZhbCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Sm9pbkNvbHVtbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0Sm9pbkNvbHVtbnMoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMOgotCQkJCXJldHVybiBnZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOgotCQkJCWdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSm9pbkNvbHVtbj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMOgotCQkJCXNldE9ycGhhblJlbW92YWwoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUw6Ci0JCQkJc2V0T3JwaGFuUmVtb3ZhbChPUlBIQU5fUkVNT1ZBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gam9pbkNvbHVtbnMgIT0gbnVsbCAmJiAham9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUw6Ci0JCQkJcmV0dXJuIE9SUEhBTl9SRU1PVkFMX0VERUZBVUxUID09IG51bGwgPyBvcnBoYW5SZW1vdmFsICE9IG51bGwgOiAhT1JQSEFOX1JFTU9WQUxfRURFRkFVTFQuZXF1YWxzKG9ycGhhblJlbW92YWwpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxKb2luQ29sdW1uQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfSk9JTl9DT0xVTU5fQ09OVEFJTkVSX19KT0lOX0NPTFVNTlM7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX09SUEhBTl9SRU1PVkFMOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09SUEhBTl9SRU1PVkFCTEVfMjBfX09SUEhBTl9SRU1PVkFMOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvTWFueV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEpvaW5Db2x1bW5Db250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0pPSU5fQ09MVU1OX0NPTlRBSU5FUl9fSk9JTl9DT0xVTU5TOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX01BTllfX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcnBoYW5SZW1vdmFibGVfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfT1JQSEFOX1JFTU9WQUJMRV8yMF9fT1JQSEFOX1JFTU9WQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fTUFOWV9fT1JQSEFOX1JFTU9WQUw7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sT25lVG9NYW55XzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAob3JwaGFuUmVtb3ZhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3JwaGFuUmVtb3ZhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYXJnZXRFbnRpdHlUcmFuc2xhdG9yKCksCi0JCQlidWlsZEZldGNoVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcnBoYW5SZW1vdmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcmRlckJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcmRlckNvbHVtblRyYW5zbGF0b3IoKSwJCQotCQkJYnVpbGRNYXBLZXlUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcEtleUNsYXNzVHJhbnNsYXRvcigpLAkJCi0JCQlidWlsZE1hcEtleVRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlFbnVtZXJhdGVkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZVRyYW5zbGF0b3IoKSwJCQotCQkJYnVpbGRNYXBLZXlDb2x1bW5UcmFuc2xhdG9yKCksCQkKLQkJCWJ1aWxkTWFwS2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwJCQotCQkJYnVpbGRKb2luVGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEpvaW5Db2x1bW5UcmFuc2xhdG9yKCksCi0JCQlidWlsZENhc2NhZGVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkT3JwaGFuUmVtb3ZhbFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuT1JQSEFOX1JFTU9WQUwsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcnBoYW5SZW1vdmFibGVfMl8wX09ycGhhblJlbW92YWwoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxKb2luQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuSk9JTl9DT0xVTU4sIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEpvaW5Db2x1bW5Db250YWluZXJfSm9pbkNvbHVtbnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9uZVRvT25lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwYzJkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT25lVG9PbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb09uZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9ycGhhblJlbW92YWJsZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+T25lIFRvIE9uZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9uZVRvT25lKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE9uZVRvT25lIGV4dGVuZHMgQWJzdHJhY3RYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nIGltcGxlbWVudHMgWG1sTWFwcGVkQnlNYXBwaW5nLCBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciwgWG1sT25lVG9PbmVfMl8wCi17Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWFwcGVkQnkoKSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRNYXBwZWRCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0JZX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRNYXBwZWRCeSgpIDxlbT5NYXBwZWQgQnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG1hcHBlZEJ5ID0gTUFQUEVEX0JZX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IHByaW1hcnlLZXlKb2luQ29sdW1uczsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T3JwaGFuUmVtb3ZhbCgpIDxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0T3JwaGFuUmVtb3ZhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE9SUEhBTl9SRU1PVkFMX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRPcnBoYW5SZW1vdmFsKCkgPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRPcnBoYW5SZW1vdmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBvcnBoYW5SZW1vdmFsID0gT1JQSEFOX1JFTU9WQUxfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sT25lVG9PbmUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfT05FX1RPX09ORTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwZWQgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBlZCBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE1hcHBlZEJ5KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxNYXBwZWRCeU1hcHBpbmdfTWFwcGVkQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXBwZWRCeSgpCi0JewotCQlyZXR1cm4gbWFwcGVkQnk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZSNnZXRNYXBwZWRCeSA8ZW0+TWFwcGVkIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwZWQgQnk8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHBlZEJ5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFwcGVkQnkoU3RyaW5nIG5ld01hcHBlZEJ5KQotCXsKLQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gbWFwcGVkQnk7Ci0JCW1hcHBlZEJ5ID0gbmV3TWFwcGVkQnk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWSwgb2xkTWFwcGVkQnksIG1hcHBlZEJ5KSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlXzJfMF9PcnBoYW5SZW1vdmFsKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCkKLQl7Ci0JCXJldHVybiBvcnBoYW5SZW1vdmFsOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmUjZ2V0T3JwaGFuUmVtb3ZhbCA8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk9ycGhhbiBSZW1vdmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRPcnBoYW5SZW1vdmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuIG5ld09ycGhhblJlbW92YWwpCi0JewotCQlCb29sZWFuIG9sZE9ycGhhblJlbW92YWwgPSBvcnBoYW5SZW1vdmFsOwotCQlvcnBoYW5SZW1vdmFsID0gbmV3T3JwaGFuUmVtb3ZhbDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUwsIG9sZE9ycGhhblJlbW92YWwsIG9ycGhhblJlbW92YWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcl9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCXsKLQkJaWYgKHByaW1hcnlLZXlKb2luQ29sdW1ucyA9PSBudWxsKQotCQl7Ci0JCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KFhtbFByaW1hcnlLZXlKb2luQ29sdW1uLmNsYXNzLCB0aGlzLCBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlMpOwotCQl9Ci0JCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBQRURfQlk6Ci0JCQkJcmV0dXJuIGdldE1hcHBlZEJ5KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMOgotCQkJCXJldHVybiBnZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBQRURfQlk6Ci0JCQkJc2V0TWFwcGVkQnkoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTDoKLQkJCQlzZXRPcnBoYW5SZW1vdmFsKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWToKLQkJCQlzZXRNYXBwZWRCeShNQVBQRURfQllfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTDoKLQkJCQlzZXRPcnBoYW5SZW1vdmFsKE9SUEhBTl9SRU1PVkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19NQVBQRURfQlk6Ci0JCQkJcmV0dXJuIE1BUFBFRF9CWV9FREVGQVVMVCA9PSBudWxsID8gbWFwcGVkQnkgIT0gbnVsbCA6ICFNQVBQRURfQllfRURFRkFVTFQuZXF1YWxzKG1hcHBlZEJ5KTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCXJldHVybiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgIT0gbnVsbCAmJiAhcHJpbWFyeUtleUpvaW5Db2x1bW5zLmlzRW1wdHkoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fT1JQSEFOX1JFTU9WQUw6Ci0JCQkJcmV0dXJuIE9SUEhBTl9SRU1PVkFMX0VERUZBVUxUID09IG51bGwgPyBvcnBoYW5SZW1vdmFsICE9IG51bGwgOiAhT1JQSEFOX1JFTU9WQUxfRURFRkFVTFQuZXF1YWxzKG9ycGhhblJlbW92YWwpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxNYXBwZWRCeU1hcHBpbmcuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX01BUFBFRF9CWTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX01BUFBFRF9CWV9NQVBQSU5HX19NQVBQRURfQlk7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sUHJpbWFyeUtleUpvaW5Db2x1bW5Db250YWluZXIuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX0NPTlRBSU5FUl9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9ycGhhblJlbW92YWJsZV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX09SUEhBTl9SRU1PVkFMOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX09SUEhBTl9SRU1PVkFCTEVfMjBfX09SUEhBTl9SRU1PVkFMOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9uZVRvT25lXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sTWFwcGVkQnlNYXBwaW5nLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9NQVBQRURfQllfTUFQUElOR19fTUFQUEVEX0JZOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfT05FX1RPX09ORV9fTUFQUEVEX0JZOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9DT05UQUlORVJfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09ORV9UT19PTkVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcnBoYW5SZW1vdmFibGVfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfT1JQSEFOX1JFTU9WQUJMRV8yMF9fT1JQSEFOX1JFTU9WQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PTkVfVE9fT05FX19PUlBIQU5fUkVNT1ZBTDsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPbmVUb09uZV8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoYmFzZUZlYXR1cmVJRCkKLQkJCXsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChiYXNlRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKG1hcHBlZEJ5OiAiKTsKLQkJcmVzdWx0LmFwcGVuZChtYXBwZWRCeSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgb3JwaGFuUmVtb3ZhbDogIik7Ci0JCXJlc3VsdC5hcHBlbmQob3JwaGFuUmVtb3ZhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIFhtbEF0dHJpYnV0ZU1hcHBpbmcgaW1wbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIHZhbGlkYXRpb24gc3VwcG9ydCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE1hcHBlZEJ5VGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5NQVBQRURfQlkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKGVsZW1lbnROYW1lLCBzdHJ1Y3R1cmFsRmVhdHVyZSwgYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFRhcmdldEVudGl0eVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRmV0Y2hUcmFuc2xhdG9yKCksCi0JCQlidWlsZE9wdGlvbmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpLAotCQkJYnVpbGRPcnBoYW5SZW1vdmFsVHJhbnNsYXRvcigpLAotCQkJYnVpbGRNYXBzSWRUcmFuc2xhdG9yKCksCi0JCQlidWlsZElkVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pbkNvbHVtblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSm9pblRhYmxlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE1hcHBlZEJ5VHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5NQVBQRURfQlksIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE1hcHBlZEJ5TWFwcGluZ19NYXBwZWRCeSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRPcnBoYW5SZW1vdmFsVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQTJfMC5PUlBIQU5fUkVNT1ZBTCwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbE9ycGhhblJlbW92YWJsZV8yXzBfT3JwaGFuUmVtb3ZhbCgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5idWlsZFRyYW5zbGF0b3IoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcl9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9yZGVyQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3JkZXJDb2x1bW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhZDA5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3JkZXJDb2x1bW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9yZGVyIENvbHVtbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sT3JkZXJDb2x1bW4gZXh0ZW5kcyBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgWG1sT3JkZXJDb2x1bW5fMl8wCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5VTExBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bGxhYmxlKCkgPGVtPk51bGxhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gbnVsbGFibGUgPSBOVUxMQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbnNlcnRhYmxlKCkgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTlNFUlRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEluc2VydGFibGUoKSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5zZXJ0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gaW5zZXJ0YWJsZSA9IElOU0VSVEFCTEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXBkYXRhYmxlKCkgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VXBkYXRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gVVBEQVRBQkxFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFVwZGF0YWJsZSgpIDxlbT5VcGRhdGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFVwZGF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEJvb2xlYW4gdXBkYXRhYmxlID0gVVBEQVRBQkxFX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbE9yZGVyQ29sdW1uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX09SREVSX0NPTFVNTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdWxsYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVsbGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE51bGxhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX051bGxhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXROdWxsYWJsZSgpCi0JewotCQlyZXR1cm4gbnVsbGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiNnZXROdWxsYWJsZSA8ZW0+TnVsbGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbmV3TnVsbGFibGUpCi0JewotCQlCb29sZWFuIG9sZE51bGxhYmxlID0gbnVsbGFibGU7Ci0JCW51bGxhYmxlID0gbmV3TnVsbGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTlVMTEFCTEUsIG9sZE51bGxhYmxlLCBudWxsYWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluc2VydGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5zZXJ0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9JbnNlcnRhYmxlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuT2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkKLQl7Ci0JCXJldHVybiBpbnNlcnRhYmxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJDb2x1bW4jZ2V0SW5zZXJ0YWJsZSA8ZW0+SW5zZXJ0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zZXJ0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5zZXJ0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiBuZXdJbnNlcnRhYmxlKQotCXsKLQkJQm9vbGVhbiBvbGRJbnNlcnRhYmxlID0gaW5zZXJ0YWJsZTsKLQkJaW5zZXJ0YWJsZSA9IG5ld0luc2VydGFibGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRSwgb2xkSW5zZXJ0YWJsZSwgaW5zZXJ0YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlVwZGF0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VXBkYXRhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX1VwZGF0YWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0VXBkYXRhYmxlKCkKLQl7Ci0JCXJldHVybiB1cGRhdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlckNvbHVtbiNnZXRVcGRhdGFibGUgPGVtPlVwZGF0YWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXBkYXRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRVcGRhdGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGFibGUoQm9vbGVhbiBuZXdVcGRhdGFibGUpCi0JewotCQlCb29sZWFuIG9sZFVwZGF0YWJsZSA9IHVwZGF0YWJsZTsKLQkJdXBkYXRhYmxlID0gbmV3VXBkYXRhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19OVUxMQUJMRToKLQkJCQlyZXR1cm4gZ2V0TnVsbGFibGUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXJldHVybiBnZXRJbnNlcnRhYmxlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVVBEQVRBQkxFOgotCQkJCXJldHVybiBnZXRVcGRhdGFibGUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTlVMTEFCTEU6Ci0JCQkJc2V0TnVsbGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXNldEluc2VydGFibGUoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEU6Ci0JCQkJc2V0VXBkYXRhYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTlVMTEFCTEU6Ci0JCQkJc2V0TnVsbGFibGUoTlVMTEFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19JTlNFUlRBQkxFOgotCQkJCXNldEluc2VydGFibGUoSU5TRVJUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRToKLQkJCQlzZXRVcGRhdGFibGUoVVBEQVRBQkxFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFOgotCQkJCXJldHVybiBOVUxMQUJMRV9FREVGQVVMVCA9PSBudWxsID8gbnVsbGFibGUgIT0gbnVsbCA6ICFOVUxMQUJMRV9FREVGQVVMVC5lcXVhbHMobnVsbGFibGUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX0lOU0VSVEFCTEU6Ci0JCQkJcmV0dXJuIElOU0VSVEFCTEVfRURFRkFVTFQgPT0gbnVsbCA/IGluc2VydGFibGUgIT0gbnVsbCA6ICFJTlNFUlRBQkxFX0VERUZBVUxULmVxdWFscyhpbnNlcnRhYmxlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OX19VUERBVEFCTEU6Ci0JCQkJcmV0dXJuIFVQREFUQUJMRV9FREVGQVVMVCA9PSBudWxsID8gdXBkYXRhYmxlICE9IG51bGwgOiAhVVBEQVRBQkxFX0VERUZBVUxULmVxdWFscyh1cGRhdGFibGUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fTlVMTEFCTEU6IHJldHVybiBPcm1WMl8wUGFja2FnZS5YTUxfT1JERVJfQ09MVU1OXzIwX19OVUxMQUJMRTsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRTogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX0lOU0VSVEFCTEU7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX1VQREFUQUJMRTogcmV0dXJuIE9ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX1VQREFUQUJMRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbE9yZGVyQ29sdW1uXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl8yMF9fTlVMTEFCTEU6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fX05VTExBQkxFOwotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl8yMF9fSU5TRVJUQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fSU5TRVJUQUJMRTsKLQkJCQljYXNlIE9ybVYyXzBQYWNrYWdlLlhNTF9PUkRFUl9DT0xVTU5fMjBfX1VQREFUQUJMRTogcmV0dXJuIE9ybVBhY2thZ2UuWE1MX09SREVSX0NPTFVNTl9fVVBEQVRBQkxFOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobnVsbGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG51bGxhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbnNlcnRhYmxlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChpbnNlcnRhYmxlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB1cGRhdGFibGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHVwZGF0YWJsZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCWJ1aWxkTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkTnVsbGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZEluc2VydGFibGVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFVwZGF0YWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29sdW1uRGVmaW5pdGlvblRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE51bGxhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcihKUEEuTlVMTEFCTEUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfTnVsbGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5zZXJ0YWJsZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQm9vbGVhblRyYW5zbGF0b3IoSlBBLklOU0VSVEFCTEUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfSW5zZXJ0YWJsZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRVcGRhdGFibGVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEJvb2xlYW5UcmFuc2xhdG9yKEpQQS5VUERBVEFCTEUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfVXBkYXRhYmxlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9yZGVyYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE9yZGVyYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2Q1MDEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxPcmRlcmFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlcmFibGVfMl8wOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3JkZXJhYmxlPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyYWJsZSNnZXRPcmRlckJ5IDxlbT5PcmRlciBCeTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbE9yZGVyYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sT3JkZXJhYmxlIGV4dGVuZHMgWG1sT3JkZXJhYmxlXzJfMAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9yZGVyIEJ5PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3JkZXJCeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3JkZXJhYmxlX09yZGVyQnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE9yZGVyQnkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3JkZXJhYmxlI2dldE9yZGVyQnkgPGVtPk9yZGVyIEJ5PC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBCeTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0T3JkZXJCeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0T3JkZXJCeShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbE9yZGVyYWJsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbE92ZXJyaWRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3ZlcnJpZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5YzA2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sT3ZlcnJpZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBPdmVycmlkZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPdmVycmlkZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3ZlcnJpZGUoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE92ZXJyaWRlIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sT3ZlcnJpZGVfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT3ZlcnJpZGUjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKTsKLX0gLy8gWG1sT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZTM1NTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0U2NoZW1hIDxlbT5TY2hlbWE8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNpc0Nhc2NhZGVQZXJzaXN0IDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0RW50aXR5TGlzdGVuZXJzIDxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxBY2Nlc3NIb2xkZXIsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMAotewotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFjY2VzcygpIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFjY2VzcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBhY2Nlc3MgPSBBQ0NFU1NfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb24gPSBERVNDUklQVElPTl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0RlbGltaXRlZElkZW50aWZpZXJzKCkgPGVtPkRlbGltaXRlZCBJZGVudGlmaWVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFTElNSVRFRF9JREVOVElGSUVSU19FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpIDxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzRGVsaW1pdGVkSWRlbnRpZmllcnMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGRlbGltaXRlZElkZW50aWZpZXJzID0gREVMSU1JVEVEX0lERU5USUZJRVJTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2hlbWEgPSBTQ0hFTUFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYXRhbG9nID0gQ0FUQUxPR19FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Nhc2NhZGVQZXJzaXN0KCkgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNDYXNjYWRlUGVyc2lzdCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENBU0NBREVfUEVSU0lTVF9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDYXNjYWRlUGVyc2lzdCgpIDxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzQ2FzY2FkZVBlcnNpc3QoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhc2NhZGVQZXJzaXN0ID0gQ0FTQ0FERV9QRVJTSVNUX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW50aXR5TGlzdGVuZXJzKCkgPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudGl0eUxpc3RlbmVycygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVudGl0eUxpc3RlbmVycyBlbnRpdHlMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjaGVtYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfU2NoZW1hKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkKLQl7Ci0JCXJldHVybiBzY2hlbWE7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkKLQl7Ci0JCVN0cmluZyBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0JCXNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fU0NIRU1BLCBvbGRTY2hlbWEsIHNjaGVtYSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2F0YWxvZygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhdGFsb2coKQotCXsKLQkJcmV0dXJuIGNhdGFsb2c7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgbmV3Q2F0YWxvZykKLQl7Ci0JCVN0cmluZyBvbGRDYXRhbG9nID0gY2F0YWxvZzsKLQkJY2F0YWxvZyA9IG5ld0NhdGFsb2c7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BY2Nlc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BY2Nlc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFjY2VzcyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQWNjZXNzSG9sZGVyX0FjY2VzcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2VzcygpCi0JewotCQlyZXR1cm4gYWNjZXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMjZ2V0QWNjZXNzIDxlbT5BY2Nlc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFjY2VzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWNjZXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKFN0cmluZyBuZXdBY2Nlc3MpCi0JewotCQlTdHJpbmcgb2xkQWNjZXNzID0gYWNjZXNzOwotCQlhY2Nlc3MgPSBuZXdBY2Nlc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0FDQ0VTUywgb2xkQWNjZXNzLCBhY2Nlc3MpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxpbWl0ZWRJZGVudGlmaWVycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZWxpbWl0ZWRJZGVudGlmaWVycygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpCi0JewotCQlyZXR1cm4gZGVsaW1pdGVkSWRlbnRpZmllcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyNpc0RlbGltaXRlZElkZW50aWZpZXJzIDxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlbGltaXRlZCBJZGVudGlmaWVyczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlbGltaXRlZElkZW50aWZpZXJzKGJvb2xlYW4gbmV3RGVsaW1pdGVkSWRlbnRpZmllcnMpCi0JewotCQlib29sZWFuIG9sZERlbGltaXRlZElkZW50aWZpZXJzID0gZGVsaW1pdGVkSWRlbnRpZmllcnM7Ci0JCWRlbGltaXRlZElkZW50aWZpZXJzID0gbmV3RGVsaW1pdGVkSWRlbnRpZmllcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFTElNSVRFRF9JREVOVElGSUVSUywgb2xkRGVsaW1pdGVkSWRlbnRpZmllcnMsIGRlbGltaXRlZElkZW50aWZpZXJzKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2FzY2FkZSBQZXJzaXN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIFBlcnNpc3Q8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDYXNjYWRlUGVyc2lzdChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGVQZXJzaXN0KCkKLQl7Ci0JCXJldHVybiBjYXNjYWRlUGVyc2lzdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2lzQ2FzY2FkZVBlcnNpc3QgPGVtPkNhc2NhZGUgUGVyc2lzdDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FzY2FkZSBQZXJzaXN0PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0Nhc2NhZGVQZXJzaXN0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZVBlcnNpc3QoYm9vbGVhbiBuZXdDYXNjYWRlUGVyc2lzdCkKLQl7Ci0JCWJvb2xlYW4gb2xkQ2FzY2FkZVBlcnNpc3QgPSBjYXNjYWRlUGVyc2lzdDsKLQkJY2FzY2FkZVBlcnNpc3QgPSBuZXdDYXNjYWRlUGVyc2lzdDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNULCBvbGRDYXNjYWRlUGVyc2lzdCwgY2FzY2FkZVBlcnNpc3QpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgTGlzdGVuZXJzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgTGlzdGVuZXJzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBMaXN0ZW5lcnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGl0eUxpc3RlbmVycyhFbnRpdHlMaXN0ZW5lcnMpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfRW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFbnRpdHlMaXN0ZW5lcnMgZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQl7Ci0JCXJldHVybiBlbnRpdHlMaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0RW50aXR5TGlzdGVuZXJzKEVudGl0eUxpc3RlbmVycyBuZXdFbnRpdHlMaXN0ZW5lcnMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlFbnRpdHlMaXN0ZW5lcnMgb2xkRW50aXR5TGlzdGVuZXJzID0gZW50aXR5TGlzdGVuZXJzOwotCQllbnRpdHlMaXN0ZW5lcnMgPSBuZXdFbnRpdHlMaXN0ZW5lcnM7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJewotCQkJRU5vdGlmaWNhdGlvbkltcGwgbm90aWZpY2F0aW9uID0gbmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMsIG9sZEVudGl0eUxpc3RlbmVycywgbmV3RW50aXR5TGlzdGVuZXJzKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzI2dldEVudGl0eUxpc3RlbmVycyA8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IExpc3RlbmVyczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RW50aXR5TGlzdGVuZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5TGlzdGVuZXJzKEVudGl0eUxpc3RlbmVycyBuZXdFbnRpdHlMaXN0ZW5lcnMpCi0JewotCQlpZiAobmV3RW50aXR5TGlzdGVuZXJzICE9IGVudGl0eUxpc3RlbmVycykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZW50aXR5TGlzdGVuZXJzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWVudGl0eUxpc3RlbmVycykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlMsIG51bGwsIG1zZ3MpOwotCQkJaWYgKG5ld0VudGl0eUxpc3RlbmVycyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdFbnRpdHlMaXN0ZW5lcnMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19FTlRJVFlfTElTVEVORVJTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEVudGl0eUxpc3RlbmVycyhuZXdFbnRpdHlMaXN0ZW5lcnMsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUywgbmV3RW50aXR5TGlzdGVuZXJzLCBuZXdFbnRpdHlMaXN0ZW5lcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHlMaXN0ZW5lcnMobnVsbCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1M6Ci0JCQkJcmV0dXJuIGdldEFjY2VzcygpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVMSU1JVEVEX0lERU5USUZJRVJTOgotCQkJCXJldHVybiBpc0RlbGltaXRlZElkZW50aWZpZXJzKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQToKLQkJCQlyZXR1cm4gZ2V0U2NoZW1hKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIGdldENhdGFsb2coKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUOgotCQkJCXJldHVybiBpc0Nhc2NhZGVQZXJzaXN0KCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGdldEVudGl0eUxpc3RlbmVycygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQUNDRVNTOgotCQkJCXNldEFjY2VzcygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVMSU1JVEVEX0lERU5USUZJRVJTOgotCQkJCXNldERlbGltaXRlZElkZW50aWZpZXJzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19DQVNDQURFX1BFUlNJU1Q6Ci0JCQkJc2V0Q2FzY2FkZVBlcnNpc3QoKEJvb2xlYW4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1M6Ci0JCQkJc2V0QWNjZXNzKEFDQ0VTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERUxJTUlURURfSURFTlRJRklFUlM6Ci0JCQkJc2V0RGVsaW1pdGVkSWRlbnRpZmllcnMoREVMSU1JVEVEX0lERU5USUZJRVJTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoU0NIRU1BX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZyhDQVRBTE9HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBU0NBREVfUEVSU0lTVDoKLQkJCQlzZXRDYXNjYWRlUGVyc2lzdChDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fRU5USVRZX0xJU1RFTkVSUzoKLQkJCQlzZXRFbnRpdHlMaXN0ZW5lcnMoKEVudGl0eUxpc3RlbmVycyludWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19BQ0NFU1M6Ci0JCQkJcmV0dXJuIEFDQ0VTU19FREVGQVVMVCA9PSBudWxsID8gYWNjZXNzICE9IG51bGwgOiAhQUNDRVNTX0VERUZBVUxULmVxdWFscyhhY2Nlc3MpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVMSU1JVEVEX0lERU5USUZJRVJTOgotCQkJCXJldHVybiBkZWxpbWl0ZWRJZGVudGlmaWVycyAhPSBERUxJTUlURURfSURFTlRJRklFUlNfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX1NDSEVNQToKLQkJCQlyZXR1cm4gU0NIRU1BX0VERUZBVUxUID09IG51bGwgPyBzY2hlbWEgIT0gbnVsbCA6ICFTQ0hFTUFfRURFRkFVTFQuZXF1YWxzKHNjaGVtYSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIENBVEFMT0dfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2cgIT0gbnVsbCA6ICFDQVRBTE9HX0VERUZBVUxULmVxdWFscyhjYXRhbG9nKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fQ0FTQ0FERV9QRVJTSVNUOgotCQkJCXJldHVybiBjYXNjYWRlUGVyc2lzdCAhPSBDQVNDQURFX1BFUlNJU1RfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0VOVElUWV9MSVNURU5FUlM6Ci0JCQkJcmV0dXJuIGVudGl0eUxpc3RlbmVycyAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IGVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgZGVyaXZlZEZlYXR1cmVJRCwgQ2xhc3M8Pz4gYmFzZUNsYXNzKQotCXsKLQkJaWYgKGJhc2VDbGFzcyA9PSBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAuY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfX0RFU0NSSVBUSU9OOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFU0NSSVBUSU9OOwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVMSU1JVEVEX0lERU5USUZJRVJTOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFTElNSVRFRF9JREVOVElGSUVSUzsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFU0NSSVBUSU9OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVTQ1JJUFRJT047Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMF9fREVMSU1JVEVEX0lERU5USUZJRVJTOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU19fREVMSU1JVEVEX0lERU5USUZJRVJTOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoYWNjZXNzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChhY2Nlc3MpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVsaW1pdGVkSWRlbnRpZmllcnM6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlbGltaXRlZElkZW50aWZpZXJzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlbWE6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNjaGVtYSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2F0YWxvZzogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY2F0YWxvZyk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgY2FzY2FkZVBlcnNpc3Q6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhc2NhZGVQZXJzaXN0KTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZWxpbWl0ZWRJZGVudGlmaWVyc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQWNjZXNzVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRW50aXR5TGlzdGVuZXJzVHJhbnNsYXRvcigpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5ERVNDUklQVElPTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZXNjcmlwdGlvbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5TQ0hFTUEsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzX1NjaGVtYSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0FUQUxPRywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVsaW1pdGVkSWRlbnRpZmllcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3IoSlBBMl8wLkRFTElNSVRJRURfSURFTlRJRklFUlMsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBfRGVsaW1pdGVkSWRlbnRpZmllcnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFjY2Vzc1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQUNDRVNTLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxBY2Nlc3NIb2xkZXJfQWNjZXNzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDYXNjYWRlUGVyc2lzdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuQ0FTQ0FERV9QRVJTSVNULCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c19DYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFbnRpdHlMaXN0ZW5lcnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gRW50aXR5TGlzdGVuZXJzLmJ1aWxkVHJhbnNsYXRvcihKUEEuRU5USVRZX0xJU1RFTkVSUywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfRW50aXR5TGlzdGVuZXJzKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNjE3MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkVtcHR5VGFnQm9vbGVhblRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGE8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSA8ZW0+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSA8ZW0+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpIDxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPSBYTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBuZXdEZXNjcmlwdGlvbikKLQl7Ci0JCVN0cmluZyBvbGREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQlkZXNjcmlwdGlvbiA9IG5ld0Rlc2NyaXB0aW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+WG1sIE1hcHBpbmcgTWV0YWRhdGEgQ29tcGxldGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhI2lzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgPGVtPlhtbCBNYXBwaW5nIE1ldGFkYXRhIENvbXBsZXRlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5YbWwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGJvb2xlYW4gbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpCi0JewotCQlib29sZWFuIG9sZFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7Ci0JCXhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlID0gbmV3WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFLCBvbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSwgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWxQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpCi0JewotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgbmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBvbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IG5ld1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBvbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgbmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEjZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgbmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpCi0JewotCQlpZiAobmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpCi0JCXsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUUywgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTLCBudWxsLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG5ld1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMsIG5ld1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzLCBuZXdQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTOgotCQkJCXJldHVybiBiYXNpY1NldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXJldHVybiBpc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6Ci0JCQkJcmV0dXJuIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1hNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFOgotCQkJCXNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKFhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6Ci0JCQkJc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKW51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBX19YTUxfTUFQUElOR19NRVRBREFUQV9DT01QTEVURToKLQkJCQlyZXR1cm4geG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgIT0gWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEVfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEFfX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFM6Ci0JCQkJcmV0dXJuIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcmFuc2xhdG9yKCksCi0JCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5idWlsZFRyYW5zbGF0b3IoSlBBLlBFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFMsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5ERVNDUklQVElPTiwgT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMF9EZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgRW1wdHlUYWdCb29sZWFuVHJhbnNsYXRvcihKUEEuWE1MX01BUFBJTkdfTUVUQURBVEFfQ09NUExFVEUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhX1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NDc2NTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXlKb2luQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW4gSW1wbDwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gZXh0ZW5kcyBBYnN0cmFjdFhtbE5hbWVkQ29sdW1uIGltcGxlbWVudHMgWG1sQmFzZUpvaW5Db2x1bW4KLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSA8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEJhc2VKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIHJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4jZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUgPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoU3RyaW5nIG5ld1JlZmVyZW5jZWRDb2x1bW5OYW1lKQotCXsKLQkJU3RyaW5nIG9sZFJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCXJlZmVyZW5jZWRDb2x1bW5OYW1lID0gbmV3UmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBvbGRSZWZlcmVuY2VkQ29sdW1uTmFtZSwgcmVmZXJlbmNlZENvbHVtbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRToKLQkJCQlzZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBSRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyByZWZlcmVuY2VkQ29sdW1uTmFtZSAhPSBudWxsIDogIVJFRkVSRU5DRURfQ09MVU1OX05BTUVfRURFRkFVTFQuZXF1YWxzKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sQmFzZUpvaW5Db2x1bW4uY2xhc3MpCi0JCXsKLQkJCXN3aXRjaCAoZGVyaXZlZEZlYXR1cmVJRCkKLQkJCXsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQkFTRV9KT0lOX0NPTFVNTl9fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQkJCQlkZWZhdWx0OiByZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBiYXNlRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbEJhc2VKb2luQ29sdW1uLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9CQVNFX0pPSU5fQ09MVU1OX19SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChyZWZlcmVuY2VkQ29sdW1uTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJhbmdlIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLAotCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ29sdW1uRGVmaW5pdGlvblRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlJFRkVSRU5DRURfQ09MVU1OX05BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEJhc2VKb2luQ29sdW1uX1JlZmVyZW5jZWRDb2x1bW5OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotfSAvLyBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkltcGwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMjM3NTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQcmltYXJ5IEtleSBKb2luIENvbHVtbiBDb250YWluZXI8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lciBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvbnRhaW5lcl9QcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCi19IC8vIFhtbFByaW1hcnlLZXlKb2luQ29sdW1uQ29udGFpbmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjZmZGVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RdWVyeTwvYj48L2VtPicuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0UXVlcnkgPGVtPlF1ZXJ5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5I2dldEhpbnRzIDxlbT5IaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxRdWVyeSBleHRlbmRzIFhtbFF1ZXJ5XzJfMAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnkjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UXVlcnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRRdWVyeShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlfUXVlcnkoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRRdWVyeSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeSNnZXRRdWVyeSA8ZW0+UXVlcnk8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlF1ZXJ5PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRRdWVyeSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UXVlcnkoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkhpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGludHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeV9IaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxRdWVyeUhpbnQ+IGdldEhpbnRzKCk7Ci0KLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotCi0JVGV4dFJhbmdlIGdldFF1ZXJ5VGV4dFJhbmdlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlDb250YWluZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmY5Mzg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxRdWVyeUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJpZXMgSG9sZGVyPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlDb250YWluZXIjZ2V0TmFtZWRRdWVyaWVzIDxlbT5OYW1lZCBRdWVyaWVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5Q29udGFpbmVyI2dldE5hbWVkTmF0aXZlUXVlcmllcyA8ZW0+TmFtZWQgTmF0aXZlIFF1ZXJpZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUXVlcnlDb250YWluZXIgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZWQgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWRRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZWQgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUNvbnRhaW5lcl9OYW1lZFF1ZXJpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sTmFtZWRRdWVyeT4gZ2V0TmFtZWRRdWVyaWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lZCBOYXRpdmUgUXVlcmllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lZCBOYXRpdmUgUXVlcmllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWVkIE5hdGl2ZSBRdWVyaWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5Q29udGFpbmVyX05hbWVkTmF0aXZlUXVlcmllcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxOYW1lZE5hdGl2ZVF1ZXJ5PiBnZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQotfSAvLyBYbWxRdWVyaWVzSG9sZGVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlIaW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sUXVlcnlIaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OThiNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFF1ZXJ5SGludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlIaW50XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5RdWVyeSBIaW50PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUhpbnQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUXVlcnlIaW50IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUXVlcnlIaW50XzJfMAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmFsdWUgPSBWQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxRdWVyeUhpbnQoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfUVVFUllfSElOVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxRdWVyeUhpbnRfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUXVlcnlIaW50I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQotCXsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX0RFU0NSSVBUSU9OLCBvbGREZXNjcmlwdGlvbiwgZGVzY3JpcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFF1ZXJ5SGludF9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxRdWVyeUhpbnQjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5ld05hbWUpCi0JewotCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7Ci0JCW5hbWUgPSBuZXdOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWYWx1ZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50X1ZhbHVlKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLQl7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludCNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuZXdWYWx1ZSkKLQl7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHZhbHVlOwotCQl2YWx1ZSA9IG5ld1ZhbHVlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19WQUxVRSwgb2xkVmFsdWUsIHZhbHVlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX1ZBTFVFOgotCQkJCXJldHVybiBnZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19WQUxVRToKLQkJCQlzZXRWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1FVRVJZX0hJTlRfX1ZBTFVFOgotCQkJCXNldFZhbHVlKFZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfUVVFUllfSElOVF9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9RVUVSWV9ISU5UX19WQUxVRToKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRWYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUXVlcnlIaW50X05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVmFsdWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlZBTFVFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfVmFsdWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEyXzAuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxRdWVyeUhpbnRfMl8wX0Rlc2NyaXB0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxSZWZlcmVuY2VUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlZmVyZW5jZVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNzM5ZTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFJlZmVyZW5jZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBSZWZlcmVuY2UgVGFibGU8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUmVmZXJlbmNlVGFibGUjZ2V0Sm9pbkNvbHVtbnMgPGVtPkpvaW4gQ29sdW1uczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlZmVyZW5jZVRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxSZWZlcmVuY2VUYWJsZSBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Kb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Sm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFJlZmVyZW5jZVRhYmxlX0pvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldEpvaW5Db2x1bW5zKCk7Ci0KLX0gLy8gWG1sUmVmZXJlbmNlVGFibGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxTZWNvbmRhcnlUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NzEwMTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlY29uZGFyeVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgU2Vjb25kYXJ5IFRhYmxlIEltcGw8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2Vjb25kYXJ5VGFibGUjZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zIDxlbT5QcmltYXJ5IEtleSBKb2luIENvbHVtbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxTZWNvbmRhcnlUYWJsZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxTZWNvbmRhcnlUYWJsZSBleHRlbmRzIEFic3RyYWN0WG1sVGFibGUKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSA8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sU2Vjb25kYXJ5VGFibGUoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gT3JtUGFja2FnZS5MaXRlcmFscy5YTUxfU0VDT05EQVJZX1RBQkxFOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByaW1hcnkgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUHJpbWFyeUtleUpvaW5Db2x1bW59LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlY29uZGFyeVRhYmxlX1ByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpCi0JewotCQlpZiAocHJpbWFyeUtleUpvaW5Db2x1bW5zID09IG51bGwpCi0JCXsKLQkJCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJfQotCQlyZXR1cm4gcHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlyZXR1cm4gZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRUNPTkRBUllfVEFCTEVfX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OUzoKLQkJCQlnZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFQ09OREFSWV9UQUJMRV9fUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TOgotCQkJCWdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VDT05EQVJZX1RBQkxFX19QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlM6Ci0JCQkJcmV0dXJuIHByaW1hcnlLZXlKb2luQ29sdW1ucyAhPSBudWxsICYmICFwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkVW5pcXVlQ29uc3RyYWludFRyYW5zbGF0b3IoKQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4uYnVpbGRUcmFuc2xhdG9yKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU2Vjb25kYXJ5VGFibGVfUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkpOwotCX0KLQotfSAvLyBYbWxTZWNvbmRhcnlUYWJsZUltcGwKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxTZXF1ZW5jZUdlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlcXVlbmNlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzhiOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFNlcXVlbmNlR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5TZXF1ZW5jZSBHZW5lcmF0b3I8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IjZ2V0U2VxdWVuY2VOYW1lIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3IoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sU2VxdWVuY2VHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBYbWxHZW5lcmF0b3IsIFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIElOSVRJQUxfVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0SW5pdGlhbFZhbHVlKCkgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgaW5pdGlhbFZhbHVlID0gSU5JVElBTF9WQUxVRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBbGxvY2F0aW9uU2l6ZSgpIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEFsbG9jYXRpb25TaXplKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBJbnRlZ2VyIGFsbG9jYXRpb25TaXplID0gQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENhdGFsb2coKSA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2F0YWxvZyA9IENBVEFMT0dfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hKCkgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NoZW1hKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHNjaGVtYSA9IFNDSEVNQV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTZXF1ZW5jZU5hbWUoKSA8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2VxdWVuY2VOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTRVFVRU5DRV9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNlcXVlbmNlTmFtZSgpIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2VxdWVuY2VOYW1lID0gU0VRVUVOQ0VfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxTZXF1ZW5jZUdlbmVyYXRvcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQotCXsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2VxdWVuY2UgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2VxdWVuY2UgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yX1NlcXVlbmNlTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlTmFtZSgpCi0JewotCQlyZXR1cm4gc2VxdWVuY2VOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IjZ2V0U2VxdWVuY2VOYW1lIDxlbT5TZXF1ZW5jZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TZXF1ZW5jZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZXF1ZW5jZU5hbWUoU3RyaW5nIG5ld1NlcXVlbmNlTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRTZXF1ZW5jZU5hbWUgPSBzZXF1ZW5jZU5hbWU7Ci0JCXNlcXVlbmNlTmFtZSA9IG5ld1NlcXVlbmNlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FLCBvbGRTZXF1ZW5jZU5hbWUsIHNlcXVlbmNlTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkluaXRpYWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SW5pdGlhbFZhbHVlKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuSW50T2JqZWN0IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgSW50ZWdlciBnZXRJbml0aWFsVmFsdWUoKQotCXsKLQkJcmV0dXJuIGluaXRpYWxWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldEluaXRpYWxWYWx1ZSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFZhbHVlKEludGVnZXIgbmV3SW5pdGlhbFZhbHVlKQotCXsKLQkJSW50ZWdlciBvbGRJbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7Ci0JCWluaXRpYWxWYWx1ZSA9IG5ld0luaXRpYWxWYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFLCBvbGRJbml0aWFsVmFsdWUsIGluaXRpYWxWYWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbG9jYXRpb24gU2l6ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlcikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0QWxsb2NhdGlvblNpemUoKQotCXsKLQkJcmV0dXJuIGFsbG9jYXRpb25TaXplOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3IjZ2V0QWxsb2NhdGlvblNpemUgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG9jYXRpb25TaXplKEludGVnZXIgbmV3QWxsb2NhdGlvblNpemUpCi0JewotCQlJbnRlZ2VyIG9sZEFsbG9jYXRpb25TaXplID0gYWxsb2NhdGlvblNpemU7Ci0JCWFsbG9jYXRpb25TaXplID0gbmV3QWxsb2NhdGlvblNpemU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFLCBvbGRBbGxvY2F0aW9uU2l6ZSwgYWxsb2NhdGlvblNpemUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9DYXRhbG9nKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZygpCi0JewotCQlyZXR1cm4gY2F0YWxvZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldENhdGFsb2cgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nKFN0cmluZyBuZXdDYXRhbG9nKQotCXsKLQkJU3RyaW5nIG9sZENhdGFsb2cgPSBjYXRhbG9nOwotCQljYXRhbG9nID0gbmV3Q2F0YWxvZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HLCBvbGRDYXRhbG9nLCBjYXRhbG9nKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9TY2hlbWEoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWEoKQotCXsKLQkJcmV0dXJuIHNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFNlcXVlbmNlR2VuZXJhdG9yI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNjaGVtYShTdHJpbmcgbmV3U2NoZW1hKQotCXsKLQkJU3RyaW5nIG9sZFNjaGVtYSA9IHNjaGVtYTsKLQkJc2NoZW1hID0gbmV3U2NoZW1hOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NDSEVNQSwgb2xkU2NoZW1hLCBzY2hlbWEpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXJldHVybiBnZXRBbGxvY2F0aW9uU2l6ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIGdldENhdGFsb2coKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIGdldFNjaGVtYSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUU6Ci0JCQkJcmV0dXJuIGdldFNlcXVlbmNlTmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOgotCQkJCXNldEluaXRpYWxWYWx1ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRToKLQkJCQlzZXRBbGxvY2F0aW9uU2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZygoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BOgotCQkJCXNldFNjaGVtYSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0VRVUVOQ0VfTkFNRToKLQkJCQlzZXRTZXF1ZW5jZU5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOgotCQkJCXNldEluaXRpYWxWYWx1ZShJTklUSUFMX1ZBTFVFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXNldEFsbG9jYXRpb25TaXplKEFMTE9DQVRJT05fU0laRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZyhDQVRBTE9HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BOgotCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TRVFVRU5DRV9OQU1FOgotCQkJCXNldFNlcXVlbmNlTmFtZShTRVFVRU5DRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBERVNDUklQVElPTl9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb24gIT0gbnVsbCA6ICFERVNDUklQVElPTl9FREVGQVVMVC5lcXVhbHMoZGVzY3JpcHRpb24pOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOgotCQkJCXJldHVybiBJTklUSUFMX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBpbml0aWFsVmFsdWUgIT0gbnVsbCA6ICFJTklUSUFMX1ZBTFVFX0VERUZBVUxULmVxdWFscyhpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRToKLQkJCQlyZXR1cm4gQUxMT0NBVElPTl9TSVpFX0VERUZBVUxUID09IG51bGwgPyBhbGxvY2F0aW9uU2l6ZSAhPSBudWxsIDogIUFMTE9DQVRJT05fU0laRV9FREVGQVVMVC5lcXVhbHMoYWxsb2NhdGlvblNpemUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIENBVEFMT0dfRURFRkFVTFQgPT0gbnVsbCA/IGNhdGFsb2cgIT0gbnVsbCA6ICFDQVRBTE9HX0VERUZBVUxULmVxdWFscyhjYXRhbG9nKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIFNDSEVNQV9FREVGQVVMVCA9PSBudWxsID8gc2NoZW1hICE9IG51bGwgOiAhU0NIRU1BX0VERUZBVUxULmVxdWFscyhzY2hlbWEpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfX1NFUVVFTkNFX05BTUU6Ci0JCQkJcmV0dXJuIFNFUVVFTkNFX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHNlcXVlbmNlTmFtZSAhPSBudWxsIDogIVNFUVVFTkNFX05BTUVfRURFRkFVTFQuZXF1YWxzKHNlcXVlbmNlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzczw/PiBiYXNlQ2xhc3MpCi0JewotCQlpZiAoYmFzZUNsYXNzID09IFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fQ0FUQUxPRzsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl9fU0NIRU1BOiByZXR1cm4gT3JtVjJfMFBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fU0NIRU1BOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wLmNsYXNzKQotCQl7Ci0JCQlzd2l0Y2ggKGJhc2VGZWF0dXJlSUQpCi0JCQl7Ci0JCQkJY2FzZSBPcm1WMl8wUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SXzIwX19DQVRBTE9HOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19DQVRBTE9HOwotCQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fU0NIRU1BOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfU0VRVUVOQ0VfR0VORVJBVE9SX19TQ0hFTUE7Ci0JCQkJZGVmYXVsdDogcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChkZXNjcmlwdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZGVzY3JpcHRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCIsIG5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKG5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGluaXRpYWxWYWx1ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoaW5pdGlhbFZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBhbGxvY2F0aW9uU2l6ZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoYWxsb2NhdGlvblNpemUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGFsb2c6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGFsb2cpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVtYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NoZW1hKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzZXF1ZW5jZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHNlcXVlbmNlTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldE5hbWVUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGVUZXh0UmFuZ2UoSlBBLk5BTUUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCWVsZW1lbnROYW1lLCAKLQkJCXN0cnVjdHVyYWxGZWF0dXJlLCAKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsIAotCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFNlcXVlbmNlTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5pdGlhbFZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSwKLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuTkFNRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX05hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2VxdWVuY2VOYW1lVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5TRVFVRU5DRV9OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl9TZXF1ZW5jZU5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkSW5pdGlhbFZhbHVlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5JTklUSUFMX1ZBTFVFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JfSW5pdGlhbFZhbHVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEFsbG9jYXRpb25TaXplVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5BTExPQ0FUSU9OX1NJWkUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl9BbGxvY2F0aW9uU2l6ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGREZXNjcmlwdGlvblRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuREVTQ1JJUFRJT04sIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JfMl8wX0Rlc2NyaXB0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENhdGFsb2dUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNBVEFMT0csIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBfQ2F0YWxvZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNjaGVtYVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuU0NIRU1BLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX1NjaGVtYSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2YzlkYjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5UYWJsZTwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRhYmxlIGV4dGVuZHMgQWJzdHJhY3RYbWxUYWJsZQotewotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9UQUJMRTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRDYXRhbG9nVHJhbnNsYXRvcigpLAotCQkJYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCksCi0JCQlidWlsZFVuaXF1ZUNvbnN0cmFpbnRUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci0JCi19IC8vIFRhYmxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sVGFibGVHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODhlYzQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxUYWJsZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VGFibGUgR2VuZXJhdG9yPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFRhYmxlIDxlbT5UYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFBrQ29sdW1uTmFtZSA8ZW0+UGsgQ29sdW1uIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VmFsdWVDb2x1bW5OYW1lIDxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRQa0NvbHVtblZhbHVlIDxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0VW5pcXVlQ29uc3RyYWludHMgPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFRhYmxlR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sR2VuZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEludGVnZXIgSU5JVElBTF9WQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRJbml0aWFsVmFsdWUoKSA8ZW0+SW5pdGlhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SW5pdGlhbFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgSW50ZWdlciBpbml0aWFsVmFsdWUgPSBJTklUSUFMX1ZBTFVFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFsbG9jYXRpb25TaXplKCkgPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSW50ZWdlciBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxsb2NhdGlvblNpemUoKSA8ZW0+QWxsb2NhdGlvbiBTaXplPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRBbGxvY2F0aW9uU2l6ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEludGVnZXIgYWxsb2NhdGlvblNpemUgPSBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VGFibGUoKSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUYWJsZSgpIDxlbT5UYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdGFibGUgPSBUQUJMRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDYXRhbG9nKCkgPGVtPkNhdGFsb2c8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENhdGFsb2coKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q2F0YWxvZygpIDxlbT5DYXRhbG9nPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDYXRhbG9nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNhdGFsb2cgPSBDQVRBTE9HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYSgpIDxlbT5TY2hlbWE8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNjaGVtYSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBzY2hlbWEgPSBTQ0hFTUFfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGtDb2x1bW5OYW1lKCkgPGVtPlBrIENvbHVtbiBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQa0NvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0NPTFVNTl9OQU1FX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBrQ29sdW1uTmFtZSgpIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGtDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBrQ29sdW1uTmFtZSA9IFBLX0NPTFVNTl9OQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlQ29sdW1uTmFtZSgpIDxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsdWVDb2x1bW5OYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9DT0xVTU5fTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZUNvbHVtbk5hbWUoKSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyB2YWx1ZUNvbHVtbk5hbWUgPSBWQUxVRV9DT0xVTU5fTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQa0NvbHVtblZhbHVlKCkgPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UGtDb2x1bW5WYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfQ09MVU1OX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBrQ29sdW1uVmFsdWUoKSA8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQa0NvbHVtblZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHBrQ29sdW1uVmFsdWUgPSBQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVbmlxdWVDb25zdHJhaW50cygpIDxlbT5VbmlxdWUgQ29uc3RyYWludHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VW5pcXVlQ29uc3RyYWludHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50czsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxUYWJsZUdlbmVyYXRvcigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9UQUJMRV9HRU5FUkFUT1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIG5ld0Rlc2NyaXB0aW9uKQotCXsKLQkJU3RyaW5nIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRUYWJsZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfVGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZSgpCi0JewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRUYWJsZSA8ZW0+VGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRUYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlKFN0cmluZyBuZXdUYWJsZSkKLQl7Ci0JCVN0cmluZyBvbGRUYWJsZSA9IHRhYmxlOwotCQl0YWJsZSA9IG5ld1RhYmxlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFLCBvbGRUYWJsZSwgdGFibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DYXRhbG9nPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXRhbG9nPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENhdGFsb2coU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENhdGFsb2coU3RyaW5nIG5ld0NhdGFsb2cpCi0JewotCQlTdHJpbmcgb2xkQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JCWNhdGFsb2cgPSBuZXdDYXRhbG9nOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0csIG9sZENhdGFsb2csIGNhdGFsb2cpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjaGVtYShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVGFibGVHZW5lcmF0b3JfU2NoZW1hKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkKLQl7Ci0JCXJldHVybiBzY2hlbWE7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU3RyaW5nIG5ld1NjaGVtYSkKLQl7Ci0JCVN0cmluZyBvbGRTY2hlbWEgPSBzY2hlbWE7Ci0JCXNjaGVtYSA9IG5ld1NjaGVtYTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19TQ0hFTUEsIG9sZFNjaGVtYSwgc2NoZW1hKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGsgQ29sdW1uIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQa0NvbHVtbk5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBrQ29sdW1uTmFtZSgpCi0JewotCQlyZXR1cm4gcGtDb2x1bW5OYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5OYW1lIDxlbT5QayBDb2x1bW4gTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGsgQ29sdW1uIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBrQ29sdW1uTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBrQ29sdW1uTmFtZShTdHJpbmcgbmV3UGtDb2x1bW5OYW1lKQotCXsKLQkJU3RyaW5nIG9sZFBrQ29sdW1uTmFtZSA9IHBrQ29sdW1uTmFtZTsKLQkJcGtDb2x1bW5OYW1lID0gbmV3UGtDb2x1bW5OYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FLCBvbGRQa0NvbHVtbk5hbWUsIHBrQ29sdW1uTmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlIENvbHVtbiBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZSBDb2x1bW4gTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWVDb2x1bW5OYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZUNvbHVtbk5hbWUoKQotCXsKLQkJcmV0dXJuIHZhbHVlQ29sdW1uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldFZhbHVlQ29sdW1uTmFtZSA8ZW0+VmFsdWUgQ29sdW1uIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlZhbHVlIENvbHVtbiBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWYWx1ZUNvbHVtbk5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZUNvbHVtbk5hbWUoU3RyaW5nIG5ld1ZhbHVlQ29sdW1uTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRWYWx1ZUNvbHVtbk5hbWUgPSB2YWx1ZUNvbHVtbk5hbWU7Ci0JCXZhbHVlQ29sdW1uTmFtZSA9IG5ld1ZhbHVlQ29sdW1uTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRSwgb2xkVmFsdWVDb2x1bW5OYW1lLCB2YWx1ZUNvbHVtbk5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QayBDb2x1bW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBrIENvbHVtbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBrQ29sdW1uVmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQa0NvbHVtblZhbHVlKCkKLQl7Ci0JCXJldHVybiBwa0NvbHVtblZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3IjZ2V0UGtDb2x1bW5WYWx1ZSA8ZW0+UGsgQ29sdW1uIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QayBDb2x1bW4gVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFBrQ29sdW1uVmFsdWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQa0NvbHVtblZhbHVlKFN0cmluZyBuZXdQa0NvbHVtblZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZFBrQ29sdW1uVmFsdWUgPSBwa0NvbHVtblZhbHVlOwotCQlwa0NvbHVtblZhbHVlID0gbmV3UGtDb2x1bW5WYWx1ZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUUsIG9sZFBrQ29sdW1uVmFsdWUsIHBrQ29sdW1uVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Jbml0aWFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Jbml0aWFsIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluaXRpYWxWYWx1ZShJbnRlZ2VyKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbEdlbmVyYXRvcl9Jbml0aWFsVmFsdWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkludE9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEludGVnZXIgZ2V0SW5pdGlhbFZhbHVlKCkKLQl7Ci0JCXJldHVybiBpbml0aWFsVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvciNnZXRJbml0aWFsVmFsdWUgPGVtPkluaXRpYWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluaXRpYWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluaXRpYWxWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxWYWx1ZShJbnRlZ2VyIG5ld0luaXRpYWxWYWx1ZSkKLQl7Ci0JCUludGVnZXIgb2xkSW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOwotCQlpbml0aWFsVmFsdWUgPSBuZXdJbml0aWFsVmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRSwgb2xkSW5pdGlhbFZhbHVlLCBpbml0aWFsVmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbGxvY2F0aW9uIFNpemU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEFsbG9jYXRpb25TaXplKEludGVnZXIpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yX0FsbG9jYXRpb25TaXplKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5JbnRPYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBJbnRlZ2VyIGdldEFsbG9jYXRpb25TaXplKCkKLQl7Ci0JCXJldHVybiBhbGxvY2F0aW9uU2l6ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFRhYmxlR2VuZXJhdG9yI2dldEFsbG9jYXRpb25TaXplIDxlbT5BbGxvY2F0aW9uIFNpemU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbG9jYXRpb24gU2l6ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0QWxsb2NhdGlvblNpemUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyIG5ld0FsbG9jYXRpb25TaXplKQotCXsKLQkJSW50ZWdlciBvbGRBbGxvY2F0aW9uU2l6ZSA9IGFsbG9jYXRpb25TaXplOwotCQlhbGxvY2F0aW9uU2l6ZSA9IG5ld0FsbG9jYXRpb25TaXplOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRSwgb2xkQWxsb2NhdGlvblNpemUsIGFsbG9jYXRpb25TaXplKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVuaXF1ZSBDb25zdHJhaW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUYWJsZUdlbmVyYXRvcl9VbmlxdWVDb25zdHJhaW50cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sVW5pcXVlQ29uc3RyYWludD4gZ2V0VW5pcXVlQ29uc3RyYWludHMoKQotCXsKLQkJaWYgKHVuaXF1ZUNvbnN0cmFpbnRzID09IG51bGwpCi0JCXsKLQkJCXVuaXF1ZUNvbnN0cmFpbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbFVuaXF1ZUNvbnN0cmFpbnQ+KFhtbFVuaXF1ZUNvbnN0cmFpbnQuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTKTsKLQkJfQotCQlyZXR1cm4gdW5pcXVlQ29uc3RyYWludHM7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VW5pcXVlQ29uc3RyYWludHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRToKLQkJCQlyZXR1cm4gZ2V0SW5pdGlhbFZhbHVlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXJldHVybiBnZXRBbGxvY2F0aW9uU2l6ZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFOgotCQkJCXJldHVybiBnZXRUYWJsZSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0c6Ci0JCQkJcmV0dXJuIGdldENhdGFsb2coKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19TQ0hFTUE6Ci0JCQkJcmV0dXJuIGdldFNjaGVtYSgpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FOgotCQkJCXJldHVybiBnZXRQa0NvbHVtbk5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWVDb2x1bW5OYW1lKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX1ZBTFVFOgotCQkJCXJldHVybiBnZXRQa0NvbHVtblZhbHVlKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCXJldHVybiBnZXRVbmlxdWVDb25zdHJhaW50cygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19JTklUSUFMX1ZBTFVFOgotCQkJCXNldEluaXRpYWxWYWx1ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRToKLQkJCQlzZXRBbGxvY2F0aW9uU2l6ZSgoSW50ZWdlciluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1RBQkxFOgotCQkJCXNldFRhYmxlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19DQVRBTE9HOgotCQkJCXNldENhdGFsb2coKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQToKLQkJCQlzZXRTY2hlbWEoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9OQU1FOgotCQkJCXNldFBrQ29sdW1uTmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVkFMVUVfQ09MVU1OX05BTUU6Ci0JCQkJc2V0VmFsdWVDb2x1bW5OYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUU6Ci0JCQkJc2V0UGtDb2x1bW5WYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVU5JUVVFX0NPTlNUUkFJTlRTOgotCQkJCWdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuY2xlYXIoKTsKLQkJCQlnZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sVW5pcXVlQ29uc3RyYWludD4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19ERVNDUklQVElPTjoKLQkJCQlzZXREZXNjcmlwdGlvbihERVNDUklQVElPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX05BTUU6Ci0JCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fSU5JVElBTF9WQUxVRToKLQkJCQlzZXRJbml0aWFsVmFsdWUoSU5JVElBTF9WQUxVRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0FMTE9DQVRJT05fU0laRToKLQkJCQlzZXRBbGxvY2F0aW9uU2l6ZShBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19UQUJMRToKLQkJCQlzZXRUYWJsZShUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0NBVEFMT0c6Ci0JCQkJc2V0Q2F0YWxvZyhDQVRBTE9HX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fU0NIRU1BOgotCQkJCXNldFNjaGVtYShTQ0hFTUFfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fTkFNRToKLQkJCQlzZXRQa0NvbHVtbk5hbWUoUEtfQ09MVU1OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRToKLQkJCQlzZXRWYWx1ZUNvbHVtbk5hbWUoVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19QS19DT0xVTU5fVkFMVUU6Ci0JCQkJc2V0UGtDb2x1bW5WYWx1ZShQS19DT0xVTU5fVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fREVTQ1JJUFRJT046Ci0JCQkJcmV0dXJuIERFU0NSSVBUSU9OX0VERUZBVUxUID09IG51bGwgPyBkZXNjcmlwdGlvbiAhPSBudWxsIDogIURFU0NSSVBUSU9OX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvbik7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fTkFNRToKLQkJCQlyZXR1cm4gTkFNRV9FREVGQVVMVCA9PSBudWxsID8gbmFtZSAhPSBudWxsIDogIU5BTUVfRURFRkFVTFQuZXF1YWxzKG5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX0lOSVRJQUxfVkFMVUU6Ci0JCQkJcmV0dXJuIElOSVRJQUxfVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IGluaXRpYWxWYWx1ZSAhPSBudWxsIDogIUlOSVRJQUxfVkFMVUVfRURFRkFVTFQuZXF1YWxzKGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQUxMT0NBVElPTl9TSVpFOgotCQkJCXJldHVybiBBTExPQ0FUSU9OX1NJWkVfRURFRkFVTFQgPT0gbnVsbCA/IGFsbG9jYXRpb25TaXplICE9IG51bGwgOiAhQUxMT0NBVElPTl9TSVpFX0VERUZBVUxULmVxdWFscyhhbGxvY2F0aW9uU2l6ZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fVEFCTEU6Ci0JCQkJcmV0dXJuIFRBQkxFX0VERUZBVUxUID09IG51bGwgPyB0YWJsZSAhPSBudWxsIDogIVRBQkxFX0VERUZBVUxULmVxdWFscyh0YWJsZSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fQ0FUQUxPRzoKLQkJCQlyZXR1cm4gQ0FUQUxPR19FREVGQVVMVCA9PSBudWxsID8gY2F0YWxvZyAhPSBudWxsIDogIUNBVEFMT0dfRURFRkFVTFQuZXF1YWxzKGNhdGFsb2cpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1NDSEVNQToKLQkJCQlyZXR1cm4gU0NIRU1BX0VERUZBVUxUID09IG51bGwgPyBzY2hlbWEgIT0gbnVsbCA6ICFTQ0hFTUFfRURFRkFVTFQuZXF1YWxzKHNjaGVtYSk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1RBQkxFX0dFTkVSQVRPUl9fUEtfQ09MVU1OX05BTUU6Ci0JCQkJcmV0dXJuIFBLX0NPTFVNTl9OQU1FX0VERUZBVUxUID09IG51bGwgPyBwa0NvbHVtbk5hbWUgIT0gbnVsbCA6ICFQS19DT0xVTU5fTkFNRV9FREVGQVVMVC5lcXVhbHMocGtDb2x1bW5OYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19WQUxVRV9DT0xVTU5fTkFNRToKLQkJCQlyZXR1cm4gVkFMVUVfQ09MVU1OX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlQ29sdW1uTmFtZSAhPSBudWxsIDogIVZBTFVFX0NPTFVNTl9OQU1FX0VERUZBVUxULmVxdWFscyh2YWx1ZUNvbHVtbk5hbWUpOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9UQUJMRV9HRU5FUkFUT1JfX1BLX0NPTFVNTl9WQUxVRToKLQkJCQlyZXR1cm4gUEtfQ09MVU1OX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBwa0NvbHVtblZhbHVlICE9IG51bGwgOiAhUEtfQ09MVU1OX1ZBTFVFX0VERUZBVUxULmVxdWFscyhwa0NvbHVtblZhbHVlKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVEFCTEVfR0VORVJBVE9SX19VTklRVUVfQ09OU1RSQUlOVFM6Ci0JCQkJcmV0dXJuIHVuaXF1ZUNvbnN0cmFpbnRzICE9IG51bGwgJiYgIXVuaXF1ZUNvbnN0cmFpbnRzLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOwotCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBpbml0aWFsVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGluaXRpYWxWYWx1ZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgYWxsb2NhdGlvblNpemU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGFsbG9jYXRpb25TaXplKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0YWJsZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodGFibGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGNhdGFsb2c6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGNhdGFsb2cpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHNjaGVtYTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NoZW1hKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwa0NvbHVtbk5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBrQ29sdW1uTmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWVDb2x1bW5OYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2YWx1ZUNvbHVtbk5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBrQ29sdW1uVmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHBrQ29sdW1uVmFsdWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXROYW1lVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKEpQQS5OQU1FKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRUYWJsZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkU2NoZW1hVHJhbnNsYXRvcigpLAotCQkJYnVpbGRQa0NvbHVtbk5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZFZhbHVlQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkSW5pdGlhbFZhbHVlVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSwKLQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQlYbWxVbmlxdWVDb25zdHJhaW50LmJ1aWxkVHJhbnNsYXRvcihKUEEuVU5JUVVFX0NPTlNUUkFJTlQsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1VuaXF1ZUNvbnN0cmFpbnRzKCkpCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRhYmxlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKEpQQS5UQUJMRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfVGFibGUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkQ2F0YWxvZ1RyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQ0FUQUxPRywgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfQ2F0YWxvZygpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTY2hlbWFUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlNDSEVNQSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sVGFibGVHZW5lcmF0b3JfU2NoZW1hKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFBrQ29sdW1uTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUEtfQ09MVU1OX05BTUUsIE9ybVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFRhYmxlR2VuZXJhdG9yX1BrQ29sdW1uTmFtZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWx1ZUNvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlZBTFVFX0NPTFVNTl9OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl9WYWx1ZUNvbHVtbk5hbWUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUGtDb2x1bW5WYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuUEtfQ09MVU1OX1ZBTFVFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxUYWJsZUdlbmVyYXRvcl9Qa0NvbHVtblZhbHVlKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZEluaXRpYWxWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuSU5JVElBTF9WQUxVRSwgT3JtUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yX0luaXRpYWxWYWx1ZSgpLCBUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRBbGxvY2F0aW9uU2l6ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcihKUEEuQUxMT0NBVElPTl9TSVpFLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxHZW5lcmF0b3JfQWxsb2NhdGlvblNpemUoKSwgVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkRFU0NSSVBUSU9OLCBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHJhbnNpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MWQ2ZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFRyYW5zaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlRyYW5zaWVudDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFRyYW5zaWVudCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxUcmFuc2llbnQgZXh0ZW5kcyBBYnN0cmFjdFhtbEF0dHJpYnV0ZU1hcHBpbmcKLXsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVHJhbnNpZW50KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1RSQU5TSUVOVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJZWxlbWVudE5hbWUsCi0JCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCkKLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sVHlwZU1hcHBpbmcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxUeXBlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDNkNjRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlJlcGxhY2VFZGl0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgVHlwZSBNYXBwaW5nPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRDbGFzc05hbWUgPGVtPkNsYXNzIE5hbWU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0TWV0YWRhdGFDb21wbGV0ZSA8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nI2dldEF0dHJpYnV0ZXMgPGVtPkF0dHJpYnV0ZXM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZygpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVHlwZU1hcHBpbmcgZXh0ZW5kcyBYbWxBY2Nlc3NIb2xkZXIKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzcyBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNsYXNzIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENsYXNzTmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVHlwZU1hcHBpbmdfQ2xhc3NOYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVNYXBwaW5nI2dldENsYXNzTmFtZSA8ZW0+Q2xhc3MgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2xhc3NOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1ldGFkYXRhIENvbXBsZXRlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFR5cGVNYXBwaW5nX01ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0TWV0YWRhdGFDb21wbGV0ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRNZXRhZGF0YUNvbXBsZXRlIDxlbT5NZXRhZGF0YSBDb21wbGV0ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWV0YWRhdGEgQ29tcGxldGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1ldGFkYXRhQ29tcGxldGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ19EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZU1hcHBpbmcjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEF0dHJpYnV0ZXMoQXR0cmlidXRlcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxUeXBlTWFwcGluZ19BdHRyaWJ1dGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUeXBlTWFwcGluZyNnZXRBdHRyaWJ1dGVzIDxlbT5BdHRyaWJ1dGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgdmFsdWUpOwotCQotCVRleHRSYW5nZSBnZXRDbGFzc1RleHRSYW5nZSgpOwotCi0JVGV4dFJhbmdlIGdldEF0dHJpYnV0ZXNUZXh0UmFuZ2UoKTsKLQkKLQlUZXh0UmFuZ2UgZ2V0TmFtZVRleHRSYW5nZSgpOwotCi0JLy9UT0RPIG5vdCBoYXBweSB3aXRoIHRoaXMsIG9yIHRoZSBjb3JyZXNwb25kaW5nIG9uZSBpbiBYbWxBdHRyaWJ1dGVNYXBwaW5nCi0JU3RyaW5nIGdldE1hcHBpbmdLZXkoKTsKLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQlSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVUeXBlRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKTsKLQotCVJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKTsKLQotfSAvLyBYbWxUeXBlTWFwcGluZwpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS9YbWxVbmlxdWVDb25zdHJhaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzFlOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFVuaXF1ZUNvbnN0cmFpbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VW5pcXVlIENvbnN0cmFpbnQ8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludCNnZXRDb2x1bW5OYW1lcyA8ZW0+Q29sdW1uIE5hbWVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxVbmlxdWVDb25zdHJhaW50IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sVW5pcXVlQ29uc3RyYWludF8yXzAKLXsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29sdW1uTmFtZXMoKSA8ZW0+Q29sdW1uIE5hbWVzPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbk5hbWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxVbmlxdWVDb25zdHJhaW50KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIE9ybVBhY2thZ2UuTGl0ZXJhbHMuWE1MX1VOSVFVRV9DT05TVFJBSU5UOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludF8yXzBfTmFtZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW4gTmFtZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgotCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbiBOYW1lczwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50X0NvbHVtbk5hbWVzKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8U3RyaW5nPiBnZXRDb2x1bW5OYW1lcygpCi0JewotCQlpZiAoY29sdW1uTmFtZXMgPT0gbnVsbCkKLQkJewotCQkJY29sdW1uTmFtZXMgPSBuZXcgRURhdGFUeXBlRUxpc3Q8U3RyaW5nPihTdHJpbmcuY2xhc3MsIHRoaXMsIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX19DT0xVTU5fTkFNRVMpOwotCQl9Ci0JCXJldHVybiBjb2x1bW5OYW1lczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX05BTUU6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUzoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uTmFtZXMoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1VOSVFVRV9DT05TVFJBSU5UX19OQU1FOgotCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9fQ09MVU1OX05BTUVTOgotCQkJCWdldENvbHVtbk5hbWVzKCkuY2xlYXIoKTsKLQkJCQlnZXRDb2x1bW5OYW1lcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9VTklRVUVfQ09OU1RSQUlOVF9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUzoKLQkJCQlnZXRDb2x1bW5OYW1lcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVU5JUVVFX0NPTlNUUkFJTlRfX0NPTFVNTl9OQU1FUzoKLQkJCQlyZXR1cm4gY29sdW1uTmFtZXMgIT0gbnVsbCAmJiAhY29sdW1uTmFtZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBjb2x1bW5OYW1lczogIik7Ci0JCXJlc3VsdC5hcHBlbmQoY29sdW1uTmFtZXMpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtbk5hbWVUcmFuc2xhdG9yKCksCi0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLk5BTUUsIE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMF9OYW1lKCksIFRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZENvbHVtbk5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLkNPTFVNTl9OQU1FLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxVbmlxdWVDb25zdHJhaW50X0NvbHVtbk5hbWVzKCkpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL1htbFZlcnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiNDY2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vWG1sVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbFZlcnNpb24oKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sVmVyc2lvbiBleHRlbmRzIEFic3RyYWN0WG1sQXR0cmlidXRlTWFwcGluZyBpbXBsZW1lbnRzIENvbHVtbk1hcHBpbmcsIFhtbENvbnZlcnRpYmxlTWFwcGluZwotewotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbHVtbigpIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbENvbHVtbiBjb2x1bW47Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTG9iKCkgPGVtPkxvYjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0JfRURFRkFVTFQgPSBmYWxzZTsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0xvYigpIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2lzTG9iKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBsb2IgPSBMT0JfRURFRkFVTFQ7Ci0JLyoqCi0JICogY2hhbmdlZCB0aGlzIHRvIG51bGwgYW5kIHJlbW92ZWQgdGhlIGdlbmVyYXRlZCBmbGFnIHNvIGVtZiB3b24ndCBnZW5lcmF0ZSBvdmVyIGl0Ci0JICogd2UgZG9uJ3Qgd2FudCBhIGRlZmF1bHQgZm9yIGVudW1zLCBqdXN0IG51bGwgaWYgdGhlIHRhZyBkb2VzIG5vdCBleGlzdAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGVtcG9yYWxUeXBlIFRFTVBPUkFMX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFRlbXBvcmFsKCkgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRUZW1wb3JhbCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFRlbXBvcmFsVHlwZSB0ZW1wb3JhbCA9IFRFTVBPUkFMX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnVtZXJhdGVkKCkgPGVtPkVudW1lcmF0ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEVudW1lcmF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRW51bVR5cGUgRU5VTUVSQVRFRF9FREVGQVVMVCA9IEVudW1UeXBlLk9SRElOQUw7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RW51bWVyYXRlZCgpIDxlbT5FbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFbnVtZXJhdGVkKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRW51bVR5cGUgZW51bWVyYXRlZCA9IEVOVU1FUkFURURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sVmVyc2lvbigpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBPcm1QYWNrYWdlLkxpdGVyYWxzLlhNTF9WRVJTSU9OOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Q29sdW1uKFhtbENvbHVtbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sQ29sdW1uIGdldENvbHVtbigpCi0JewotCQlyZXR1cm4gY29sdW1uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbHVtbihYbWxDb2x1bW4gbmV3Q29sdW1uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJWG1sQ29sdW1uIG9sZENvbHVtbiA9IGNvbHVtbjsKLQkJY29sdW1uID0gbmV3Q29sdW1uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT0xVTU4sIG9sZENvbHVtbiwgbmV3Q29sdW1uKTsKLQkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiBuZXdDb2x1bW4pCi0JewotCQlpZiAobmV3Q29sdW1uICE9IGNvbHVtbikKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWNvbHVtbikuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQlpZiAobmV3Q29sdW1uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0NvbHVtbikuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTiwgbnVsbCwgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb2x1bW4obmV3Q29sdW1uLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTiwgbmV3Q29sdW1uLCBuZXdDb2x1bW4pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldExvYihib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlI2dldFhtbENvbnZlcnRpYmxlTWFwcGluZ19Mb2IoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW4iCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTG9iKCkKLQl7Ci0JCXJldHVybiBsb2I7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxWZXJzaW9uI2lzTG9iIDxlbT5Mb2I8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvYjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNMb2IoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMb2IoYm9vbGVhbiBuZXdMb2IpCi0JewotCQlib29sZWFuIG9sZExvYiA9IGxvYjsKLQkJbG9iID0gbmV3TG9iOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0IsIG9sZExvYiwgbG9iKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI3NldFRlbXBvcmFsKFRlbXBvcmFsVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZSNnZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfVGVtcG9yYWwoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgVGVtcG9yYWxUeXBlIGdldFRlbXBvcmFsKCkKLQl7Ci0JCXJldHVybiB0ZW1wb3JhbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0VGVtcG9yYWwgPGVtPlRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5UZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZQotCSAqIEBzZWUgI2dldFRlbXBvcmFsKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGVtcG9yYWwoVGVtcG9yYWxUeXBlIG5ld1RlbXBvcmFsKQotCXsKLQkJVGVtcG9yYWxUeXBlIG9sZFRlbXBvcmFsID0gdGVtcG9yYWw7Ci0JCXRlbXBvcmFsID0gbmV3VGVtcG9yYWwgPT0gbnVsbCA/IFRFTVBPUkFMX0VERUZBVUxUIDogbmV3VGVtcG9yYWw7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RFTVBPUkFMLCBvbGRUZW1wb3JhbCwgdGVtcG9yYWwpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnVtZXJhdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldEVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybVBhY2thZ2UjZ2V0WG1sQ29udmVydGlibGVNYXBwaW5nX0VudW1lcmF0ZWQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRW51bVR5cGUgZ2V0RW51bWVyYXRlZCgpCi0JewotCQlyZXR1cm4gZW51bWVyYXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb24jZ2V0RW51bWVyYXRlZCA8ZW0+RW51bWVyYXRlZDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlCi0JICogQHNlZSAjZ2V0RW51bWVyYXRlZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudW1lcmF0ZWQoRW51bVR5cGUgbmV3RW51bWVyYXRlZCkKLQl7Ci0JCUVudW1UeXBlIG9sZEVudW1lcmF0ZWQgPSBlbnVtZXJhdGVkOwotCQllbnVtZXJhdGVkID0gbmV3RW51bWVyYXRlZCA9PSBudWxsID8gRU5VTUVSQVRFRF9FREVGQVVMVCA6IG5ld0VudW1lcmF0ZWQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQsIG9sZEVudW1lcmF0ZWQsIGVudW1lcmF0ZWQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOgotCQkJCXJldHVybiBiYXNpY1NldENvbHVtbihudWxsLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTjoKLQkJCQlyZXR1cm4gZ2V0Q29sdW1uKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0xPQjoKLQkJCQlyZXR1cm4gaXNMb2IoKTsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVEVNUE9SQUw6Ci0JCQkJcmV0dXJuIGdldFRlbXBvcmFsKCk7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQ6Ci0JCQkJcmV0dXJuIGdldEVudW1lcmF0ZWQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0NPTFVNTjoKLQkJCQlzZXRDb2x1bW4oKFhtbENvbHVtbiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0I6Ci0JCQkJc2V0TG9iKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX1RFTVBPUkFMOgotCQkJCXNldFRlbXBvcmFsKChUZW1wb3JhbFR5cGUpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fRU5VTUVSQVRFRDoKLQkJCQlzZXRFbnVtZXJhdGVkKChFbnVtVHlwZSluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19DT0xVTU46Ci0JCQkJc2V0Q29sdW1uKChYbWxDb2x1bW4pbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19MT0I6Ci0JCQkJc2V0TG9iKExPQl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDoKLQkJCQlzZXRUZW1wb3JhbChURU1QT1JBTF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19FTlVNRVJBVEVEOgotCQkJCXNldEVudW1lcmF0ZWQoRU5VTUVSQVRFRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOgotCQkJCXJldHVybiBjb2x1bW4gIT0gbnVsbDsKLQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTE9COgotCQkJCXJldHVybiBsb2IgIT0gTE9CX0VERUZBVUxUOwotCQkJY2FzZSBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDoKLQkJCQlyZXR1cm4gdGVtcG9yYWwgIT0gVEVNUE9SQUxfRURFRkFVTFQ7Ci0JCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQ6Ci0JCQkJcmV0dXJuIGVudW1lcmF0ZWQgIT0gRU5VTUVSQVRFRF9FREVGQVVMVDsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlQmFzZVN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGRlcml2ZWRGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5DT0xVTU5fTUFQUElOR19fQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChkZXJpdmVkRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTE9COiByZXR1cm4gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9COwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX1ZFUlNJT05fX0VOVU1FUkFURUQ6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19FTlVNRVJBVEVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGRlcml2ZWRGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoaW50IGJhc2VGZWF0dXJlSUQsIENsYXNzPD8+IGJhc2VDbGFzcykKLQl7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gQ29sdW1uTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5DT0xVTU5fTUFQUElOR19fQ09MVU1OOiByZXR1cm4gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fQ09MVU1OOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlpZiAoYmFzZUNsYXNzID09IFhtbENvbnZlcnRpYmxlTWFwcGluZy5jbGFzcykKLQkJewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKQotCQkJewotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fTE9COiByZXR1cm4gT3JtUGFja2FnZS5YTUxfVkVSU0lPTl9fTE9COwotCQkJCWNhc2UgT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fVEVNUE9SQUw6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19URU1QT1JBTDsKLQkJCQljYXNlIE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0VOVU1FUkFURUQ6IHJldHVybiBPcm1QYWNrYWdlLlhNTF9WRVJTSU9OX19FTlVNRVJBVEVEOwotCQkJCWRlZmF1bHQ6IHJldHVybiAtMTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGJhc2VGZWF0dXJlSUQsIGJhc2VDbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobG9iOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChsb2IpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHRlbXBvcmFsOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh0ZW1wb3JhbCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZW51bWVyYXRlZDogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZW51bWVyYXRlZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0RW51bWVyYXRlZFRleHRSYW5nZSgpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJlbnVtZXJhdGVkIG5vdCBzdXBwb3J0ZWQgYnkgdmVyc2lvbiBtYXBwaW5ncyIpOwotCX0KLQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0TG9iVGV4dFJhbmdlKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImxvYiBub3Qgc3VwcG9ydGVkIGJ5IHZlcnNpb24gbWFwcGluZ3MiKTsKLQl9Ci0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRUZW1wb3JhbFRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZVRleHRSYW5nZShKUEEuVEVNUE9SQUwpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJYnVpbGRBY2Nlc3NUcmFuc2xhdG9yKCksCi0JCQlidWlsZENvbHVtblRyYW5zbGF0b3IoKSwgCi0JCQlidWlsZFRlbXBvcmFsVHJhbnNsYXRvcigpLAotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDb2x1bW5UcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gWG1sQ29sdW1uLmJ1aWxkVHJhbnNsYXRvcihKUEEuQ09MVU1OLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRDb2x1bW5NYXBwaW5nX0NvbHVtbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVGVtcG9yYWxUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoSlBBLlRFTVBPUkFMLCBPcm1QYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmdfVGVtcG9yYWwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvSlBBMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9KUEEyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1OGI2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9KUEEyXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkpQQTsKLQotLyoqCi0gKiBKUEEgMi4wIG9ybS54bWwtcmVsYXRlZCBzdHVmZiAoZWxlbWVudHMsIGF0dHJpYnV0ZXMgZXRjLikKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgSlBBMl8wCi0JZXh0ZW5kcyBKUEEKLXsKLQlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEpQQS5TQ0hFTUFfTkFNRVNQQUNFOwotCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2Uvb3JtXzJfMC54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTiA9ICIyLjAiOwotCQotCS8vIEpQQSAyLjAgc3BlY2lmaWMgbm9kZXMKLQkKLQlTdHJpbmcgQ0FDSEVBQkxFID0gImNhY2hlYWJsZSI7Ci0JU3RyaW5nIENPTExFQ1RJT05fVEFCTEUgPSAiY29sbGVjdGlvbi10YWJsZSI7Ci0JU3RyaW5nIERFTElNSVRJRURfSURFTlRJRklFUlMgPSAiZGVsaW1pdGVkLWlkZW50aWZpZXJzIjsKLQlTdHJpbmcgRUxFTUVOVF9DT0xMRUNUSU9OID0gImVsZW1lbnQtY29sbGVjdGlvbiI7Ci0JU3RyaW5nIE1BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFID0gIm1hcC1rZXktYXR0cmlidXRlLW92ZXJyaWRlIjsKLQlTdHJpbmcgTUFQX0tFWV9DTEFTUyA9ICJtYXAta2V5LWNsYXNzIjsKLQlTdHJpbmcgTUFQX0tFWV9DT0xVTU4gPSAibWFwLWtleS1jb2x1bW4iOwotCVN0cmluZyBNQVBfS0VZX0NPTlZFUlQgPSAibWFwLWtleS1jb252ZXJ0IjsKLQlTdHJpbmcgTUFQX0tFWV9FTlVNRVJBVEVEID0gIm1hcC1rZXktZW51bWVyYXRlZCI7Ci0JU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU4gPSAibWFwLWtleS1qb2luLWNvbHVtbiI7Ci0JU3RyaW5nIE1BUFNfSUQgPSAibWFwcy1pZCI7Ci0JU3RyaW5nIE5BTUVEX1FVRVJZX19MT0NLX01PREUgPSAibG9jay1tb2RlIjsKLQlTdHJpbmcgT1JERVJfQ09MVU1OID0gIm9yZGVyLWNvbHVtbiI7Ci0JU3RyaW5nIE9SUEhBTl9SRU1PVkFMID0gIm9ycGhhbi1yZW1vdmFsIjsKLQlTdHJpbmcgVEFSR0VUX0NMQVNTID0gInRhcmdldC1jbGFzcyI7Ci0JU3RyaW5nIE1BUF9LRVlfVEVNUE9SQUwgPSAibWFwLWtleS10ZW1wb3JhbCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9Mb2NrTW9kZVR5cGVfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODkyNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvTG9ja01vZGVUeXBlXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkxvY2sgTW9kZSBUeXBlIDIwPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0TG9ja01vZGVUeXBlXzJfMCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gTG9ja01vZGVUeXBlXzJfMCBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlOT05FKDAsICJOT05FIiwgIk5PTkUiKSwgLyoqCi0JICogVGhlICc8ZW0+PGI+UkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNSRUFEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JUkVBRCgxLCAiUkVBRCIsICJSRUFEIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5XUklURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNXUklURV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVdSSVRFKDIsICJXUklURSIsICJXUklURSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1BUSU1JU1RJQzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPUFRJTUlTVElDX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JT1BUSU1JU1RJQygzLCAiT1BUSU1JU1RJQyIsICJPUFRJTUlTVElDIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PUFRJTUlTVElDIEZPUkNFIElOQ1JFTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCU9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UKDQsICJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIsICJPUFRJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UEVTU0lNSVNUSUMgUkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQRVNTSU1JU1RJQ19SRUFEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JUEVTU0lNSVNUSUNfUkVBRCg1LCAiUEVTU0lNSVNUSUNfUkVBRCIsICJQRVNTSU1JU1RJQ19SRUFEIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QRVNTSU1JU1RJQyBXUklURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQRVNTSU1JU1RJQ19XUklURV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVBFU1NJTUlTVElDX1dSSVRFKDYsICJQRVNTSU1JU1RJQ19XUklURSIsICJQRVNTSU1JU1RJQ19XUklURSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UEVTU0lNSVNUSUMgRk9SQ0UgSU5DUkVNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1BFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVF9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCVBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCg3LCAiUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UIiwgIlBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCIpOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUFEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5SRUFEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1JFQUQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUFEX1ZBTFVFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPldSSVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5XUklURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNXUklURQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdSSVRFX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElNSVNUSUM8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9QVElNSVNUSUM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjT1BUSU1JU1RJQwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9QVElNSVNUSUNfVkFMVUUgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1BUSU1JU1RJQyBGT1JDRSBJTkNSRU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk9QVElNSVNUSUMgRk9SQ0UgSU5DUkVNRU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI09QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlRfVkFMVUUgPSA0OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UEVTU0lNSVNUSUMgUkVBRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UEVTU0lNSVNUSUMgUkVBRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQRVNTSU1JU1RJQ19SRUFECi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVTU0lNSVNUSUNfUkVBRF9WQUxVRSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QRVNTSU1JU1RJQyBXUklURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UEVTU0lNSVNUSUMgV1JJVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUEVTU0lNSVNUSUNfV1JJVEUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVNTSU1JU1RJQ19XUklURV9WQUxVRSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5QRVNTSU1JU1RJQyBGT1JDRSBJTkNSRU1FTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBFU1NJTUlTVElDIEZPUkNFIElOQ1JFTUVOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlRfVkFMVUUgPSA3OwotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPkxvY2sgTW9kZSBUeXBlIDIwPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NrTW9kZVR5cGVfMl8wW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IExvY2tNb2RlVHlwZV8yXzBbXQotCQl7Ci0JCQlOT05FLAotCQkJUkVBRCwKLQkJCVdSSVRFLAotCQkJT1BUSU1JU1RJQywKLQkJCU9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULAotCQkJUEVTU0lNSVNUSUNfUkVBRCwKLQkJCVBFU1NJTUlTVElDX1dSSVRFLAotCQkJUEVTU0lNSVNUSUNfRk9SQ0VfSU5DUkVNRU5ULAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkxvY2sgTW9kZSBUeXBlIDIwPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TG9ja01vZGVUeXBlXzJfMD4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Mb2NrIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIExvY2tNb2RlVHlwZV8yXzAgZ2V0KFN0cmluZyBsaXRlcmFsKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCUxvY2tNb2RlVHlwZV8yXzAgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TG9jayBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2NrTW9kZVR5cGVfMl8wIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkKLQl7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKQotCQl7Ci0JCQlMb2NrTW9kZVR5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TG9jayBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBMb2NrTW9kZVR5cGVfMl8wIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIE5PTkVfVkFMVUU6IHJldHVybiBOT05FOwotCQkJY2FzZSBSRUFEX1ZBTFVFOiByZXR1cm4gUkVBRDsKLQkJCWNhc2UgV1JJVEVfVkFMVUU6IHJldHVybiBXUklURTsKLQkJCWNhc2UgT1BUSU1JU1RJQ19WQUxVRTogcmV0dXJuIE9QVElNSVNUSUM7Ci0JCQljYXNlIE9QVElNSVNUSUNfRk9SQ0VfSU5DUkVNRU5UX1ZBTFVFOiByZXR1cm4gT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQ7Ci0JCQljYXNlIFBFU1NJTUlTVElDX1JFQURfVkFMVUU6IHJldHVybiBQRVNTSU1JU1RJQ19SRUFEOwotCQkJY2FzZSBQRVNTSU1JU1RJQ19XUklURV9WQUxVRTogcmV0dXJuIFBFU1NJTUlTVElDX1dSSVRFOwotCQkJY2FzZSBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlRfVkFMVUU6IHJldHVybiBQRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIExvY2tNb2RlVHlwZV8yXzAoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL0xvY2tNb2RlVHlwZV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09ybVYyXzBGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9Pcm1WMl8wRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTllODRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL09ybVYyXzBGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBUaGUgPGI+RmFjdG9yeTwvYj4gZm9yIHRoZSBtb2RlbC4KLSAqIEl0IHByb3ZpZGVzIGEgY3JlYXRlIG1ldGhvZCBmb3IgZWFjaCBub24tYWJzdHJhY3QgY2xhc3Mgb2YgdGhlIG1vZGVsLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgT3JtVjJfMEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeUltcGwKLXsKLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3JtVjJfMEZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtVjJfMEZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJT3JtVjJfMEZhY3RvcnkgdGhlT3JtVjJfMEZhY3RvcnkgPSAoT3JtVjJfMEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5vcm0udjJfMC54bWkiKTsgCi0JCQlpZiAodGhlT3JtVjJfMEZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlT3JtVjJfMEZhY3Rvcnk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pCi0JCXsKLQkJCUVjb3JlUGx1Z2luLklOU1RBTkNFLmxvZyhleGNlcHRpb24pOwotCQl9Ci0JCXJldHVybiBuZXcgT3JtVjJfMEZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcm1WMl8wRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuTE9DS19NT0RFX1RZUEVfMjA6Ci0JCQkJcmV0dXJuIGNyZWF0ZUxvY2tNb2RlVHlwZV8yXzBGcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgT3JtVjJfMFBhY2thZ2UuTE9DS19NT0RFX1RZUEVfMjA6Ci0JCQkJcmV0dXJuIGNvbnZlcnRMb2NrTW9kZVR5cGVfMl8wVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGRhdGF0eXBlICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBMb2NrTW9kZVR5cGVfMl8wIGNyZWF0ZUxvY2tNb2RlVHlwZV8yXzBGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlMb2NrTW9kZVR5cGVfMl8wIHJlc3VsdCA9IExvY2tNb2RlVHlwZV8yXzAuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydExvY2tNb2RlVHlwZV8yXzBUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPcm1WMl8wUGFja2FnZSBnZXRPcm1WMl8wUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKE9ybVYyXzBQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgT3JtVjJfMFBhY2thZ2UgZ2V0UGFja2FnZSgpCi0JewotCQlyZXR1cm4gT3JtVjJfMFBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL09ybVYyXzBGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9Pcm1WMl8wUGFja2FnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvT3JtVjJfMFBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM4MjlhZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9Pcm1WMl8wUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuWE1MVHlwZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIE9ybVYyXzBQYWNrYWdlIGV4dGVuZHMgRVBhY2thZ2VJbXBsCi17Ci0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTkFNRSA9ICJ2Ml8wIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQub3JtLnYyXzAueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPcm1WMl8wUGFja2FnZSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlTWFwcGluZ18yXzAgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HXzIwID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wIDxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV8yMCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBUYWJsZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwX19KT0lOX1RBQkxFID0gT3JtUGFja2FnZS5YTUxfSk9JTl9UQUJMRV9DT05UQUlORVJfX0pPSU5fVEFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV8yMF9fREVTQ1JJUFRJT04gPSBPcm1QYWNrYWdlLlhNTF9KT0lOX1RBQkxFX0NPTlRBSU5FUl9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjBfRkVBVFVSRV9DT1VOVCA9IE9ybVBhY2thZ2UuWE1MX0pPSU5fVEFCTEVfQ09OVEFJTkVSX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFjY2VzczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HXzIwX19BQ0NFU1MgPSBPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfSE9MREVSX19BQ0NFU1M7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURV9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9BQ0NFU1NfSE9MREVSX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wIDxlbT5YbWwgQXR0cmlidXRlIE92ZXJyaWRlIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfMjAgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQVRUUklCVVRFX09WRVJSSURFXzIwX19ERVNDUklQVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCA8ZW0+WG1sIEF0dHJpYnV0ZXMgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVTXzIwID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0FUVFJJQlVURVNfMjBfX0RFU0NSSVBUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50IENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVTXzIwX19FTEVNRU5UX0NPTExFQ1RJT05TID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQXR0cmlidXRlcyAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9BVFRSSUJVVEVTXzIwX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMCA8ZW0+WG1sIENvbGxlY3Rpb24gVGFibGUgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ29sbGVjdGlvblRhYmxlXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ09MTEVDVElPTl9UQUJMRV8yMCA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wIDxlbT5YbWwgRGVyaXZlZCBJZCAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRGVyaXZlZElkXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ERVJJVkVEX0lEXzIwID0gNzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwID0gODsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVtYmVkZGVkXzJfMCA8ZW0+WG1sIEVtYmVkZGVkIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVtYmVkZGVkXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVtYmVkZGVkXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF8yMCA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wIDxlbT5YbWwgQ2FjaGVhYmxlIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxDYWNoZWFibGVfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0NBQ0hFQUJMRV8yMCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2FjaGVhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVBQkxFXzIwX19DQUNIRUFCTEUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBDYWNoZWFibGUgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FDSEVBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FzY2FkZVR5cGVfMl8wIDxlbT5YbWwgQ2FzY2FkZSBUeXBlIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhc2NhZGVUeXBlXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENhc2NhZGVUeXBlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQVNDQURFX1RZUEVfMjAgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhc2NhZGUgRGV0YWNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfQ0FTQ0FERV9UWVBFXzIwX19DQVNDQURFX0RFVEFDSCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIENhc2NhZGUgVHlwZSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DQVNDQURFX1RZUEVfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Sm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIwX19KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9SRUZFUkVOQ0VfVEFCTEVfX0pPSU5fQ09MVU1OUzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9DT0xMRUNUSU9OX1RBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9SRUZFUkVOQ0VfVEFCTEVfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9ERVJJVkVEX0lEXzIwX19JRCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIERlcml2ZWQgSWQgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfREVSSVZFRF9JRF8yMF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0xPQiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfX0xPQjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX19URU1QT1JBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19fRU5VTUVSQVRFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX09SREVSX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQnk8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX09SREVSX0JZID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFzc29jaWF0aW9uIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19BU1NPQ0lBVElPTl9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfVEVNUE9SQUwgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9FTlVNRVJBVEVEID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX1RBUkdFVF9DTEFTUyA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmV0Y2g8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0ZFVENIID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NMQVNTID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQ09MVU1OID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTFVNTiA9IE9ybVBhY2thZ2UuWE1MX0NPTlZFUlRJQkxFX01BUFBJTkdfRkVBVFVSRV9DT1VOVCArIDEzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbGxlY3Rpb24gVGFibGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTExFQ1RJT05fVEFCTEUgPSBPcm1QYWNrYWdlLlhNTF9DT05WRVJUSUJMRV9NQVBQSU5HX0ZFQVRVUkVfQ09VTlQgKyAxNDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9GRUFUVVJFX0NPVU5UID0gT3JtUGFja2FnZS5YTUxfQ09OVkVSVElCTEVfTUFQUElOR19GRUFUVVJFX0NPVU5UICsgMTU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXNzb2NpYXRpb24gT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTUJFRERFRF8yMF9fQVNTT0NJQVRJT05fT1ZFUlJJREVTID0gT3JtUGFja2FnZS5YTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfQ09OVEFJTkVSX19BU1NPQ0lBVElPTl9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIEVtYmVkZGVkIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VNQkVEREVEXzIwX0ZFQVRVUkVfQ09VTlQgPSBPcm1QYWNrYWdlLlhNTF9BU1NPQ0lBVElPTl9PVkVSUklERV9DT05UQUlORVJfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbnRpdHlfMl8wIDxlbT5YbWwgRW50aXR5IDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMCA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV8yMF9fQ0FDSEVBQkxFID0gWE1MX0NBQ0hFQUJMRV8yMF9fQ0FDSEVBQkxFOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZXzIwX0ZFQVRVUkVfQ09VTlQgPSBYTUxfQ0FDSEVBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wIDxlbT5YbWwgRW50aXR5IExpc3RlbmVyIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eUxpc3RlbmVyXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FTlRJVFlfTElTVEVORVJfMjAgPSAxMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VOVElUWV9MSVNURU5FUl8yMF9fREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFbnRpdHkgTGlzdGVuZXIgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRU5USVRZX0xJU1RFTkVSXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRXZlbnRNZXRob2RfMl8wIDxlbT5YbWwgRXZlbnQgTWV0aG9kIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEV2ZW50TWV0aG9kXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9FVkVOVF9NRVRIT0RfMjAgPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0VWRU5UX01FVEhPRF8yMF9fREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBFdmVudCBNZXRob2QgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfRVZFTlRfTUVUSE9EXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sR2VuZXJhdG9yXzJfMCA8ZW0+WG1sIEdlbmVyYXRvciAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9HRU5FUkFUT1JfMjAgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0dFTkVSQVRPUl8yMF9fREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBHZW5lcmF0b3IgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfR0VORVJBVE9SXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJhYmxlXzJfMCA8ZW0+WG1sIE9yZGVyYWJsZSAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlcmFibGVfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJhYmxlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUkFCTEVfMjAgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUkFCTEVfMjBfX09SREVSX0NPTFVNTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9yZGVyYWJsZSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUkRFUkFCTEVfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIDxlbT5YbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjAgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fT1JERVJfQ09MVU1OID0gWE1MX09SREVSQUJMRV8yMF9fT1JERVJfQ09MVU1OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IFhNTF9PUkRFUkFCTEVfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX1RFTVBPUkFMID0gWE1MX09SREVSQUJMRV8yMF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fTUFQX0tFWV9FTlVNRVJBVEVEID0gWE1MX09SREVSQUJMRV8yMF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQ0xBU1MgPSBYTUxfT1JERVJBQkxFXzIwX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQ09MVU1OID0gWE1MX09SREVSQUJMRV8yMF9GRUFUVVJFX0NPVU5UICsgNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gWE1MX09SREVSQUJMRV8yMF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCA9IFhNTF9PUkRFUkFCTEVfMjBfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hbnlUb01hbnlfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMCA9IDE0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9yZGVyIENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fT1JERVJfQ09MVU1OID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19PUkRFUl9DT0xVTU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgVGVtcG9yYWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQU5ZX1RPX01BTllfMjBfX01BUF9LRVlfVEVNUE9SQUwgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfVEVNUE9SQUw7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBFbnVtZXJhdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0VOVU1FUkFURUQgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfRU5VTUVSQVRFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0NMQVNTID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX19NQVBfS0VZX0NPTFVNTiA9IFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fTUFQX0tFWV9DT0xVTU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BTllfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFOWV9UT19NQU5ZXzIwX0ZFQVRVUkVfQ09VTlQgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAgPGVtPlhtbCBNYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl8yMCA9IDE1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVMgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCA8ZW0+WG1sIE1hcCBLZXkgQ29udmVydGlibGUgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjAgPSAxNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQX0tFWV9DT05WRVJUSUJMRV9NQVBQSU5HXzIwX19NQVBfS0VZX1RFTVBPUkFMID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjBfX01BUF9LRVlfRU5VTUVSQVRFRCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcCBLZXkgQ29udmVydGlibGUgTWFwcGluZyAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wIDxlbT5YbWwgTWFwcyBJZCAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwc0lkXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9NQVBTX0lEXzIwID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFNfSURfMjBfX01BUFNfSUQgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBNYXBzIElkIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFNfSURfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMCA8ZW0+WG1sIE5hbWVkIFF1ZXJ5IDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTmFtZWRRdWVyeV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUVVFUllfMjAgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NrIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9OQU1FRF9RVUVSWV8yMF9fTE9DS19NT0RFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgTmFtZWQgUXVlcnkgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTkFNRURfUVVFUllfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGVfMl8wIDxlbT5YbWwgT3JwaGFuIFJlbW92YWJsZSAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGVfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUlBIQU5fUkVNT1ZBQkxFXzIwID0gMjQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9uZVRvTWFueV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjAgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PcmRlciBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fT1JERVJfQ09MVU1OID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19PUkRFUl9DT0xVTU47Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX1RFTVBPUkFMID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX1RFTVBPUkFMOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgRW51bWVyYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19NQU5ZXzIwX19NQVBfS0VZX0VOVU1FUkFURUQgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfRU5VTUVSQVRFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENsYXNzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX01BUF9LRVlfQ0xBU1MgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9DT0xVTU4gPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQ09MVU1OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX01BTllfMjBfX09SUEhBTl9SRU1PVkFMID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gTWFueSAyMDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PTkVfVE9fTUFOWV8yMF9GRUFUVVJFX0NPVU5UID0gWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAgPGVtPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfMjAgPSAzMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fSUQgPSBYTUxfREVSSVZFRF9JRF8yMF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fTUFQU19JRCA9IFhNTF9ERVJJVkVEX0lEXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgPSBYTUxfREVSSVZFRF9JRF8yMF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvT25lXzJfMCA8ZW0+WG1sIE9uZSBUbyBPbmUgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9PbmVfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjAgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjBfX0lEID0gWE1MX1NJTkdMRV9SRUxBVElPTlNISVBfTUFQUElOR18yMF9fSUQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwcyBJZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjBfX01BUFNfSUQgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBTX0lEOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT05FX1RPX09ORV8yMF9fT1JQSEFOX1JFTU9WQUwgPSBYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPbmUgVG8gT25lIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09ORV9UT19PTkVfMjBfRkVBVFVSRV9DT1VOVCA9IFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAgPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl8yMCA9IDIzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk51bGxhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwX19OVUxMQUJMRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX09SREVSX0NPTFVNTl8yMF9fSU5TRVJUQUJMRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwX19VUERBVEFCTEUgPSAyOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JERVJfQ09MVU1OXzIwX0ZFQVRVUkVfQ09VTlQgPSAzOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMCA9IDI1OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBNZXRhZGF0YSAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV8yMCA9IDI2OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wIDxlbT5YbWwgUXVlcnkgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZXzIwID0gMjc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wIDxlbT5YbWwgUXVlcnkgSGludCAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9RVUVSWV9ISU5UXzIwID0gMjg7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgMjA8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMCA9IDI5OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAgPGVtPlhtbCBTcWwgUmVzdWx0IFNldCBNYXBwaW5nIDIwPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMCA9IDMxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludCAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxVbmlxdWVDb25zdHJhaW50XzJfMAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwID0gMzI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9PUlBIQU5fUkVNT1ZBQkxFXzIwX19PUlBIQU5fUkVNT1ZBTCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE9ycGhhbiBSZW1vdmFibGUgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfT1JQSEFOX1JFTU9WQUJMRV8yMF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFU0NSSVBUSU9OID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIwX19ERUxJTUlURURfSURFTlRJRklFUlMgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwX19ERVNDUklQVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGEgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV8yMF9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZXzIwX19ERVNDUklQVElPTiA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFF1ZXJ5IDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZXzIwX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUVVFUllfSElOVF8yMF9fREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBRdWVyeSBIaW50IDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1FVRVJZX0hJTlRfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2F0YWxvZzwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fQ0FUQUxPRyA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SXzIwX19TQ0hFTUEgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU0VRVUVOQ0VfR0VORVJBVE9SXzIwX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMF9fREVTQ1JJUFRJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBTcWwgUmVzdWx0IFNldCBNYXBwaW5nIDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1NRTF9SRVNVTFRfU0VUX01BUFBJTkdfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgMjA8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfMjBfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wIDxlbT5Mb2NrIE1vZGUgVHlwZSAyMDwvZW0+fScgZW51bS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRMb2NrTW9kZVR5cGVfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9DS19NT0RFX1RZUEVfMjAgPSAzMzsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxBdHRyaWJ1dGVzXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxDb2xsZWN0aW9uVGFibGVfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbERlcml2ZWRJZF8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVtYmVkZGVkXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFbnRpdHlfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEVudGl0eUxpc3RlbmVyXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxFdmVudE1ldGhvZF8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sR2VuZXJhdG9yXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYW55VG9NYW55XzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxNYXBzSWRfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTmFtZWRRdWVyeV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxPbmVUb09uZV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUXVlcnlfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFF1ZXJ5SGludF8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbENhY2hlYWJsZV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sQ2FzY2FkZVR5cGVfMl8wRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbE9ycGhhblJlbW92YWJsZV8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sT3JkZXJhYmxlXzJfMEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGxvY2tNb2RlVHlwZV8yXzBFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIE9ybVYyXzBQYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIE9ybVYyXzBGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIAotCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgT3JtVjJfMFBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVYyXzBQYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKE9ybVYyXzBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IE9ybVYyXzBQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSkgOiBPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgOiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID0gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlT3JtVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlT3JtVjJfMFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSwgdGhlT3JtVjJfMFBhY2thZ2UpOwotCQlyZXR1cm4gdGhlT3JtVjJfMFBhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlTWFwcGluZ18yXzAgPGVtPlhtbCBBdHRyaWJ1dGUgTWFwcGluZyAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmcgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlTWFwcGluZ18yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMCgpCi0JewotCQlyZXR1cm4geG1sQXR0cmlidXRlTWFwcGluZ18yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAgPGVtPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQXNzb2NpYXRpb24gT3ZlcnJpZGUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCgpCi0JewotCQlyZXR1cm4geG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAgPGVtPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAgPGVtPlhtbCBBdHRyaWJ1dGVzIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBBdHRyaWJ1dGVzIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQXR0cmlidXRlc18yXzAoKQotCXsKLQkJcmV0dXJuIHhtbEF0dHJpYnV0ZXNfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZXNfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sQXR0cmlidXRlc18yXzBfRGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEF0dHJpYnV0ZXNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZXNfMl8wI2dldEVsZW1lbnRDb2xsZWN0aW9ucyA8ZW0+RWxlbWVudCBDb2xsZWN0aW9uczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RWxlbWVudCBDb2xsZWN0aW9uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCNnZXRFbGVtZW50Q29sbGVjdGlvbnMoKQotCSAqIEBzZWUgI2dldFhtbEF0dHJpYnV0ZXNfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sQXR0cmlidXRlc18yXzBfRWxlbWVudENvbGxlY3Rpb25zKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxBdHRyaWJ1dGVzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25UYWJsZV8yXzAgPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDb2xsZWN0aW9uIFRhYmxlIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENvbGxlY3Rpb25UYWJsZV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxDb2xsZWN0aW9uVGFibGVfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAgPGVtPlhtbCBEZXJpdmVkIElkIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBEZXJpdmVkIElkIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxEZXJpdmVkSWRfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxEZXJpdmVkSWRfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMCNnZXRJZCA8ZW0+SWQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wI2dldElkKCkKLQkgKiBAc2VlICNnZXRYbWxEZXJpdmVkSWRfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRGVyaXZlZElkXzJfMF9JZCgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRGVyaXZlZElkXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCA8ZW0+WG1sIEVsZW1lbnQgQ29sbGVjdGlvbiAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0JewotCQlyZXR1cm4geG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldFRhcmdldENsYXNzIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UYXJnZXQgQ2xhc3M8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldFRhcmdldENsYXNzKCkKLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfVGFyZ2V0Q2xhc3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldEZldGNoIDxlbT5GZXRjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZldGNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRGZXRjaCgpCi0JICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0ZldGNoKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXkgPGVtPk1hcCBLZXk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXkoKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXkoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleUNsYXNzIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Q2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDbGFzcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Q29sdW1uIDxlbT5NYXAgS2V5IENvbHVtbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlDb2x1bW4oKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDb2x1bW4oKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMgPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKQotCSAqIEBzZWUgI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0Q29sdW1uIDxlbT5Db2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldENvbHVtbigpCi0JICogQHNlZSAjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0Q29sbGVjdGlvblRhYmxlIDxlbT5Db2xsZWN0aW9uIFRhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0Q29sbGVjdGlvblRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sbGVjdGlvblRhYmxlKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbWJlZGRlZF8yXzAgPGVtPlhtbCBFbWJlZGRlZCAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW1iZWRkZWQgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW1iZWRkZWRfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sRW1iZWRkZWRfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxFbWJlZGRlZF8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMCA8ZW0+WG1sIEVudGl0eSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFbnRpdHlfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxFbnRpdHlfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMCA8ZW0+WG1sIEVudGl0eSBMaXN0ZW5lciAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgRW50aXR5IExpc3RlbmVyIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEVudGl0eUxpc3RlbmVyXzJfMCgpCi0JewotCQlyZXR1cm4geG1sRW50aXR5TGlzdGVuZXJfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sRW50aXR5TGlzdGVuZXJfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sRW50aXR5TGlzdGVuZXJfMl8wX0Rlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxFbnRpdHlMaXN0ZW5lcl8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAgPGVtPlhtbCBFdmVudCBNZXRob2QgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEV2ZW50IE1ldGhvZCAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxFdmVudE1ldGhvZF8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbEV2ZW50TWV0aG9kXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEV2ZW50TWV0aG9kXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbEV2ZW50TWV0aG9kXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEV2ZW50TWV0aG9kXzJfMF9EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sR2VuZXJhdG9yXzJfMCA8ZW0+WG1sIEdlbmVyYXRvciAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgR2VuZXJhdG9yIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxHZW5lcmF0b3JfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxHZW5lcmF0b3JfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sR2VuZXJhdG9yXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAc2VlICNnZXRYbWxHZW5lcmF0b3JfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sR2VuZXJhdG9yXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hbnlUb01hbnlfMl8wIDxlbT5YbWwgTWFueSBUbyBNYW55IDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYW55IFRvIE1hbnkgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxNYW55VG9NYW55XzJfMCgpCi0JewotCQlyZXR1cm4geG1sTWFueVRvTWFueV8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wIDxlbT5YbWwgTWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGUgQ29udGFpbmVyIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMCNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPGVtPk1hcCBLZXkgQXR0cmlidXRlIE92ZXJyaWRlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMCNnZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQotCSAqIEBzZWUgI2dldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAgPGVtPlhtbCBNYXAgS2V5IENvbnZlcnRpYmxlIE1hcHBpbmcgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE1hcCBLZXkgQ29udmVydGlibGUgTWFwcGluZyAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCgpCi0JewotCQlyZXR1cm4geG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAjZ2V0TWFwS2V5VGVtcG9yYWwgPGVtPk1hcCBLZXkgVGVtcG9yYWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAjZ2V0TWFwS2V5VGVtcG9yYWwoKQotCSAqIEBzZWUgI2dldFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleVRlbXBvcmFsKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wI2dldE1hcEtleUVudW1lcmF0ZWQgPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wI2dldE1hcEtleUVudW1lcmF0ZWQoKQotCSAqIEBzZWUgI2dldFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleUVudW1lcmF0ZWQoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wIDxlbT5YbWwgTWFwcyBJZCAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcyBJZCAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTWFwc0lkXzJfMCgpCi0JewotCQlyZXR1cm4geG1sTWFwc0lkXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzAjZ2V0TWFwc0lkIDxlbT5NYXBzIElkPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwcyBJZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wI2dldE1hcHNJZCgpCi0JICogQHNlZSAjZ2V0WG1sTWFwc0lkXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHNJZF8yXzBfTWFwc0lkKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBzSWRfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCA8ZW0+WG1sIE11bHRpIFJlbGF0aW9uc2hpcCBNYXBwaW5nIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZyAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpCi0JewotCQlyZXR1cm4geG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAjZ2V0TWFwS2V5Q2xhc3MgPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAjZ2V0TWFwS2V5Q2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wX01hcEtleUNsYXNzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wI2dldE1hcEtleUNvbHVtbiA8ZW0+TWFwIEtleSBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wI2dldE1hcEtleUNvbHVtbigpCi0JICogQHNlZSAjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Q29sdW1uKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMgPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5NYXAgS2V5IEpvaW4gQ29sdW1uczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wI2dldE1hcEtleUpvaW5Db2x1bW5zKCkKLQkgKiBAc2VlICNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wIDxlbT5YbWwgTmFtZWQgUXVlcnkgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE5hbWVkIFF1ZXJ5IDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sTmFtZWRRdWVyeV8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbE5hbWVkUXVlcnlfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTmFtZWRRdWVyeV8yXzAjZ2V0TG9ja01vZGUgPGVtPkxvY2sgTW9kZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxvY2sgTW9kZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMCNnZXRMb2NrTW9kZSgpCi0JICogQHNlZSAjZ2V0WG1sTmFtZWRRdWVyeV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxOYW1lZFF1ZXJ5XzJfMF9Mb2NrTW9kZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sTmFtZWRRdWVyeV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb01hbnlfMl8wIDxlbT5YbWwgT25lIFRvIE1hbnkgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxPbmVUb01hbnlfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxPbmVUb01hbnlfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvT25lXzJfMCA8ZW0+WG1sIE9uZSBUbyBPbmUgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIE9uZSBUbyBPbmUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9PbmVfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT25lVG9PbmVfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxPbmVUb09uZV8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wIDxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcmRlciBDb2x1bW4gMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0TnVsbGFibGUgPGVtPk51bGxhYmxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVsbGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldE51bGxhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcmRlckNvbHVtbl8yXzBfTnVsbGFibGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldEluc2VydGFibGUgPGVtPkluc2VydGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRJbnNlcnRhYmxlKCkKLQkgKiBAc2VlICNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcmRlckNvbHVtbl8yXzBfSW5zZXJ0YWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlckNvbHVtbl8yXzAjZ2V0VXBkYXRhYmxlIDxlbT5VcGRhdGFibGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5VcGRhdGFibGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldFVwZGF0YWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX1VwZGF0YWJsZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBEZWZhdWx0cyAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAoKQotCXsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZXNjcmlwdGlvbigpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAjaXNEZWxpbWl0ZWRJZGVudGlmaWVycyA8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCNpc0RlbGltaXRlZElkZW50aWZpZXJzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBfRGVsaW1pdGVkSWRlbnRpZmllcnMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGEgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGEgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wX0Rlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wIDxlbT5YbWwgUXVlcnkgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFF1ZXJ5IDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5XzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFF1ZXJ5XzJfMCgpCi0JewotCQlyZXR1cm4geG1sUXVlcnlfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5XzJfMCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUXVlcnlfMl8wX0Rlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxRdWVyeV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wIDxlbT5YbWwgUXVlcnkgSGludCAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUXVlcnkgSGludCAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUXVlcnlIaW50XzJfMCgpCi0JewotCQlyZXR1cm4geG1sUXVlcnlIaW50XzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5SGludF8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlIaW50XzJfMCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sUXVlcnlIaW50XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFF1ZXJ5SGludF8yXzBfRGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFF1ZXJ5SGludF8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAgPGVtPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCNnZXRDYXRhbG9nIDxlbT5DYXRhbG9nPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q2F0YWxvZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0Q2F0YWxvZygpCi0JICogQHNlZSAjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX0NhdGFsb2coKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wI2dldFNjaGVtYSA8ZW0+U2NoZW1hPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2NoZW1hPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCNnZXRTY2hlbWEoKQotCSAqIEBzZWUgI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9TY2hlbWEoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIDxlbT5YbWwgU2luZ2xlIFJlbGF0aW9uc2hpcCBNYXBwaW5nIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpCi0JewotCQlyZXR1cm4geG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAgPGVtPlhtbCBTcWwgUmVzdWx0IFNldCBNYXBwaW5nIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBTcWwgUmVzdWx0IFNldCBNYXBwaW5nIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAoKQotCXsKLQkJcmV0dXJuIHhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RGVzY3JpcHRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBzZWUgI2dldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzBfRGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAgPGVtPlhtbCBVbmlxdWUgQ29uc3RyYWludCAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMCgpCi0JewotCQlyZXR1cm4geG1sVW5pcXVlQ29uc3RyYWludF8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxVbmlxdWVDb25zdHJhaW50XzJfMCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxVbmlxdWVDb25zdHJhaW50XzJfMCNnZXROYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wX05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMCA8ZW0+WG1sIENhY2hlYWJsZSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgQ2FjaGVhYmxlIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxDYWNoZWFibGVfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxDYWNoZWFibGVfMl8wRUNsYXNzOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMCNnZXRDYWNoZWFibGUgPGVtPkNhY2hlYWJsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhY2hlYWJsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wI2dldENhY2hlYWJsZSgpCi0JICogQHNlZSAjZ2V0WG1sQ2FjaGVhYmxlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhY2hlYWJsZV8yXzBfQ2FjaGVhYmxlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYWNoZWFibGVfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FzY2FkZVR5cGVfMl8wIDxlbT5YbWwgQ2FzY2FkZSBUeXBlIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBDYXNjYWRlIFR5cGUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FzY2FkZVR5cGVfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sQ2FzY2FkZVR5cGVfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxDYXNjYWRlVHlwZV8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYXNjYWRlVHlwZV8yXzAjaXNDYXNjYWRlRGV0YWNoIDxlbT5DYXNjYWRlIERldGFjaDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNhc2NhZGUgRGV0YWNoPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhc2NhZGVUeXBlXzJfMCNpc0Nhc2NhZGVEZXRhY2goKQotCSAqIEBzZWUgI2dldFhtbENhc2NhZGVUeXBlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbENhc2NhZGVUeXBlXzJfMF9DYXNjYWRlRGV0YWNoKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxDYXNjYWRlVHlwZV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGVfMl8wIDxlbT5YbWwgT3JwaGFuIFJlbW92YWJsZSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgT3JwaGFuIFJlbW92YWJsZSAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGVfMl8wCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCgpCi0JewotCQlyZXR1cm4geG1sT3JwaGFuUmVtb3ZhYmxlXzJfMEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9ycGhhblJlbW92YWJsZV8yXzAjZ2V0T3JwaGFuUmVtb3ZhbCA8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcnBoYW5SZW1vdmFibGVfMl8wI2dldE9ycGhhblJlbW92YWwoKQotCSAqIEBzZWUgI2dldFhtbE9ycGhhblJlbW92YWJsZV8yXzAoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxPcnBoYW5SZW1vdmFibGVfMl8wX09ycGhhblJlbW92YWwoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbE9ycGhhblJlbW92YWJsZV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlcmFibGVfMl8wIDxlbT5YbWwgT3JkZXJhYmxlIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBPcmRlcmFibGUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJhYmxlXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE9yZGVyYWJsZV8yXzAoKQotCXsKLQkJcmV0dXJuIHhtbE9yZGVyYWJsZV8yXzBFQ2xhc3M7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlcmFibGVfMl8wI2dldE9yZGVyQ29sdW1uIDxlbT5PcmRlciBDb2x1bW48L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5PcmRlciBDb2x1bW48L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJhYmxlXzJfMCNnZXRPcmRlckNvbHVtbigpCi0JICogQHNlZSAjZ2V0WG1sT3JkZXJhYmxlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbE9yZGVyYWJsZV8yXzBfT3JkZXJDb2x1bW4oKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbE9yZGVyYWJsZV8yXzBFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAgPGVtPkxvY2sgTW9kZSBUeXBlIDIwPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+TG9jayBNb2RlIFR5cGUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0TG9ja01vZGVUeXBlXzJfMCgpCi0JewotCQlyZXR1cm4gbG9ja01vZGVUeXBlXzJfMEVFbnVtOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9ybVYyXzBGYWN0b3J5IGdldE9ybVYyXzBGYWN0b3J5KCkKLQl7Ci0JCXJldHVybiAoT3JtVjJfMEZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wRUNsYXNzLCBYTUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OKTsKLQotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX01BUFBJTkdfMjApOwotCi0JCXhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFX09WRVJSSURFXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBFQ2xhc3MsIFhNTF9BVFRSSUJVVEVfT1ZFUlJJREVfMjBfX0RFU0NSSVBUSU9OKTsKLQotCQl4bWxBdHRyaWJ1dGVzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfQVRUUklCVVRFU18yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sQXR0cmlidXRlc18yXzBFQ2xhc3MsIFhNTF9BVFRSSUJVVEVTXzIwX19ERVNDUklQVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sQXR0cmlidXRlc18yXzBFQ2xhc3MsIFhNTF9BVFRSSUJVVEVTXzIwX19FTEVNRU5UX0NPTExFQ1RJT05TKTsKLQotCQl4bWxDYWNoZWFibGVfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DQUNIRUFCTEVfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhY2hlYWJsZV8yXzBFQ2xhc3MsIFhNTF9DQUNIRUFCTEVfMjBfX0NBQ0hFQUJMRSk7Ci0KLQkJeG1sQ2FzY2FkZVR5cGVfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9DQVNDQURFX1RZUEVfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbENhc2NhZGVUeXBlXzJfMEVDbGFzcywgWE1MX0NBU0NBREVfVFlQRV8yMF9fQ0FTQ0FERV9ERVRBQ0gpOwotCi0JCXhtbENvbGxlY3Rpb25UYWJsZV8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0NPTExFQ1RJT05fVEFCTEVfMjApOwotCi0JCXhtbERlcml2ZWRJZF8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0RFUklWRURfSURfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbERlcml2ZWRJZF8yXzBFQ2xhc3MsIFhNTF9ERVJJVkVEX0lEXzIwX19JRCk7Ci0KLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fVEFSR0VUX0NMQVNTKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0ZFVENIKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MsIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVkpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9DTEFTUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0NPTFVNTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLCBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT0xVTU4pOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fQ09MTEVDVElPTl9UQUJMRSk7Ci0KLQkJeG1sRW1iZWRkZWRfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FTUJFRERFRF8yMCk7Ci0KLQkJeG1sRW50aXR5XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfRU5USVRZXzIwKTsKLQotCQl4bWxFbnRpdHlMaXN0ZW5lcl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0VOVElUWV9MSVNURU5FUl8yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sRW50aXR5TGlzdGVuZXJfMl8wRUNsYXNzLCBYTUxfRU5USVRZX0xJU1RFTkVSXzIwX19ERVNDUklQVElPTik7Ci0KLQkJeG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9FVkVOVF9NRVRIT0RfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEV2ZW50TWV0aG9kXzJfMEVDbGFzcywgWE1MX0VWRU5UX01FVEhPRF8yMF9fREVTQ1JJUFRJT04pOwotCi0JCXhtbEdlbmVyYXRvcl8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX0dFTkVSQVRPUl8yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sR2VuZXJhdG9yXzJfMEVDbGFzcywgWE1MX0dFTkVSQVRPUl8yMF9fREVTQ1JJUFRJT04pOwotCi0JCXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NQU5ZX1RPX01BTllfMjApOwotCi0JCXhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09OVEFJTkVSXzIwKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzBFQ2xhc3MsIFhNTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfMjBfX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFUyk7Ci0KLQkJeG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTUFQX0tFWV9DT05WRVJUSUJMRV9NQVBQSU5HXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wRUNsYXNzLCBYTUxfTUFQX0tFWV9DT05WRVJUSUJMRV9NQVBQSU5HXzIwX19NQVBfS0VZX1RFTVBPUkFMKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wRUNsYXNzLCBYTUxfTUFQX0tFWV9DT05WRVJUSUJMRV9NQVBQSU5HXzIwX19NQVBfS0VZX0VOVU1FUkFURUQpOwotCi0JCXhtbE1hcHNJZF8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFNfSURfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hcHNJZF8yXzBFQ2xhc3MsIFhNTF9NQVBTX0lEXzIwX19NQVBTX0lEKTsKLQotCQl4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9NVUxUSV9SRUxBVElPTlNISVBfTUFQUElOR18yMCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcywgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX0NMQVNTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzLCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQ09MVU1OKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzLCBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQotCQl4bWxOYW1lZFF1ZXJ5XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfTkFNRURfUVVFUllfMjApOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE5hbWVkUXVlcnlfMl8wRUNsYXNzLCBYTUxfTkFNRURfUVVFUllfMjBfX0xPQ0tfTU9ERSk7Ci0KLQkJeG1sT25lVG9NYW55XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX01BTllfMjApOwotCi0JCXhtbE9uZVRvT25lXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT05FX1RPX09ORV8yMCk7Ci0KLQkJeG1sT3JkZXJhYmxlXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JERVJBQkxFXzIwKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxPcmRlcmFibGVfMl8wRUNsYXNzLCBYTUxfT1JERVJBQkxFXzIwX19PUkRFUl9DT0xVTU4pOwotCi0JCXhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfT1JERVJfQ09MVU1OXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MsIFhNTF9PUkRFUl9DT0xVTU5fMjBfX05VTExBQkxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcmRlckNvbHVtbl8yXzBFQ2xhc3MsIFhNTF9PUkRFUl9DT0xVTU5fMjBfX0lOU0VSVEFCTEUpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE9yZGVyQ29sdW1uXzJfMEVDbGFzcywgWE1MX09SREVSX0NPTFVNTl8yMF9fVVBEQVRBQkxFKTsKLQotCQl4bWxPcnBoYW5SZW1vdmFibGVfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9PUlBIQU5fUkVNT1ZBQkxFXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxPcnBoYW5SZW1vdmFibGVfMl8wRUNsYXNzLCBYTUxfT1JQSEFOX1JFTU9WQUJMRV8yMF9fT1JQSEFOX1JFTU9WQUwpOwotCi0JCXhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9ERUZBVUxUU18yMF9fREVTQ1JJUFRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFTElNSVRFRF9JREVOVElGSUVSUyk7Ci0KLQkJeG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBXzIwX19ERVNDUklQVElPTik7Ci0KLQkJeG1sUXVlcnlfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV8yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUXVlcnlfMl8wRUNsYXNzLCBYTUxfUVVFUllfMjBfX0RFU0NSSVBUSU9OKTsKLQotCQl4bWxRdWVyeUhpbnRfMl8wRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9RVUVSWV9ISU5UXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxRdWVyeUhpbnRfMl8wRUNsYXNzLCBYTUxfUVVFUllfSElOVF8yMF9fREVTQ1JJUFRJT04pOwotCi0JCXhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0VRVUVOQ0VfR0VORVJBVE9SXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBFQ2xhc3MsIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX0NBVEFMT0cpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcywgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fU0NIRU1BKTsKLQotCQl4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU0lOR0xFX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwKTsKLQotCQl4bWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzBFQ2xhc3MsIFhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwX19ERVNDUklQVElPTik7Ci0KLQkJeG1sVW5pcXVlQ29uc3RyYWludF8yXzBFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxVbmlxdWVDb25zdHJhaW50XzJfMEVDbGFzcywgWE1MX1VOSVFVRV9DT05TVFJBSU5UXzIwX19OQU1FKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJbG9ja01vZGVUeXBlXzJfMEVFbnVtID0gY3JlYXRlRUVudW0oTE9DS19NT0RFX1RZUEVfMjApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSk7Ci0JCVhNTFR5cGVQYWNrYWdlIHRoZVhNTFR5cGVQYWNrYWdlID0gKFhNTFR5cGVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFhNTFR5cGVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sSm9pblRhYmxlQ29udGFpbmVyKCkpOwotCQl4bWxBdHRyaWJ1dGVNYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEFjY2Vzc0hvbGRlcigpKTsKLQkJeG1sQ29sbGVjdGlvblRhYmxlXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbFJlZmVyZW5jZVRhYmxlKCkpOwotCQl4bWxFbGVtZW50Q29sbGVjdGlvbl8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT3JtUGFja2FnZS5nZXRYbWxDb252ZXJ0aWJsZU1hcHBpbmcoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbE9yZGVyYWJsZSgpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVPcm1QYWNrYWdlLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKSk7Ci0JCXhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMCgpKTsKLQkJeG1sRWxlbWVudENvbGxlY3Rpb25fMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCgpKTsKLQkJeG1sRW1iZWRkZWRfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9ybVBhY2thZ2UuZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpKTsKLQkJeG1sRW50aXR5XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbENhY2hlYWJsZV8yXzAoKSk7Ci0JCXhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpKTsKLQkJeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE9yZGVyYWJsZV8yXzAoKSk7Ci0JCXhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAoKSk7Ci0JCXhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wKCkpOwotCQl4bWxPbmVUb01hbnlfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpKTsKLQkJeG1sT25lVG9NYW55XzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbE9ycGhhblJlbW92YWJsZV8yXzAoKSk7Ci0JCXhtbE9uZVRvT25lXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wKCkpOwotCQl4bWxPbmVUb09uZV8yXzBFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRYbWxPcnBoYW5SZW1vdmFibGVfMl8wKCkpOwotCQl4bWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFhtbERlcml2ZWRJZF8yXzAoKSk7Ci0JCXhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0WG1sTWFwc0lkXzJfMCgpKTsKLQotCQkvLyBJbml0aWFsaXplIGNsYXNzZXMgYW5kIGZlYXR1cmVzOyBhZGQgb3BlcmF0aW9ucyBhbmQgcGFyYW1ldGVycwotCQlpbml0RUNsYXNzKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wRUNsYXNzLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMC5jbGFzcywgIlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzBfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXR0cmlidXRlTWFwcGluZ18yXzBFQ2xhc3MsIFhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wLmNsYXNzLCAiWG1sQXR0cmlidXRlTWFwcGluZ18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wRUNsYXNzLCBYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAuY2xhc3MsICJYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEF0dHJpYnV0ZXNfMl8wRUNsYXNzLCBYbWxBdHRyaWJ1dGVzXzJfMC5jbGFzcywgIlhtbEF0dHJpYnV0ZXNfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sQXR0cmlidXRlc18yXzBfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbEF0dHJpYnV0ZXNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbigpLCBudWxsLCAiZWxlbWVudENvbGxlY3Rpb25zIiwgbnVsbCwgMCwgLTEsIFhtbEF0dHJpYnV0ZXNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ2FjaGVhYmxlXzJfMEVDbGFzcywgWG1sQ2FjaGVhYmxlXzJfMC5jbGFzcywgIlhtbENhY2hlYWJsZV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYWNoZWFibGVfMl8wX0NhY2hlYWJsZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJjYWNoZWFibGUiLCBudWxsLCAwLCAxLCBYbWxDYWNoZWFibGVfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ2FzY2FkZVR5cGVfMl8wRUNsYXNzLCBYbWxDYXNjYWRlVHlwZV8yXzAuY2xhc3MsICJYbWxDYXNjYWRlVHlwZV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxDYXNjYWRlVHlwZV8yXzBfQ2FzY2FkZURldGFjaCgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuKCksICJjYXNjYWRlRGV0YWNoIiwgbnVsbCwgMCwgMSwgWG1sQ2FzY2FkZVR5cGVfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sQ29sbGVjdGlvblRhYmxlXzJfMEVDbGFzcywgWG1sQ29sbGVjdGlvblRhYmxlXzJfMC5jbGFzcywgIlhtbENvbGxlY3Rpb25UYWJsZV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sRGVyaXZlZElkXzJfMEVDbGFzcywgWG1sRGVyaXZlZElkXzJfMC5jbGFzcywgIlhtbERlcml2ZWRJZF8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxEZXJpdmVkSWRfMl8wX0lkKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImlkIiwgbnVsbCwgMCwgMSwgWG1sRGVyaXZlZElkXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMEVDbGFzcywgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAiWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX1RhcmdldENsYXNzKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidGFyZ2V0Q2xhc3MiLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9GZXRjaCgpLCB0aGVPcm1QYWNrYWdlLmdldEZldGNoVHlwZSgpLCAiZmV0Y2giLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXkoKSwgdGhlT3JtUGFja2FnZS5nZXRNYXBLZXkoKSwgbnVsbCwgIm1hcEtleSIsIG51bGwsIDAsIDEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNsYXNzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ2xhc3NSZWZlcmVuY2UoKSwgbnVsbCwgIm1hcEtleUNsYXNzIiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfTWFwS2V5Q29sdW1uKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sdW1uKCksIG51bGwsICJtYXBLZXlDb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbEpvaW5Db2x1bW4oKSwgbnVsbCwgIm1hcEtleUpvaW5Db2x1bW5zIiwgbnVsbCwgMCwgLTEsIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpLCB0aGVPcm1QYWNrYWdlLmdldFhtbENvbHVtbigpLCBudWxsLCAiY29sdW1uIiwgbnVsbCwgMCwgMSwgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sbGVjdGlvblRhYmxlKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ29sbGVjdGlvblRhYmxlKCksIG51bGwsICJjb2xsZWN0aW9uVGFibGUiLCBudWxsLCAwLCAxLCBYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbWJlZGRlZF8yXzBFQ2xhc3MsIFhtbEVtYmVkZGVkXzJfMC5jbGFzcywgIlhtbEVtYmVkZGVkXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlfMl8wRUNsYXNzLCBYbWxFbnRpdHlfMl8wLmNsYXNzLCAiWG1sRW50aXR5XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxFbnRpdHlMaXN0ZW5lcl8yXzBFQ2xhc3MsIFhtbEVudGl0eUxpc3RlbmVyXzJfMC5jbGFzcywgIlhtbEVudGl0eUxpc3RlbmVyXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEVudGl0eUxpc3RlbmVyXzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sRW50aXR5TGlzdGVuZXJfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sRXZlbnRNZXRob2RfMl8wRUNsYXNzLCBYbWxFdmVudE1ldGhvZF8yXzAuY2xhc3MsICJYbWxFdmVudE1ldGhvZF8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxFdmVudE1ldGhvZF8yXzBfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbEV2ZW50TWV0aG9kXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbEdlbmVyYXRvcl8yXzBFQ2xhc3MsIFhtbEdlbmVyYXRvcl8yXzAuY2xhc3MsICJYbWxHZW5lcmF0b3JfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sR2VuZXJhdG9yXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hbnlUb01hbnlfMl8wRUNsYXNzLCBYbWxNYW55VG9NYW55XzJfMC5jbGFzcywgIlhtbE1hbnlUb01hbnlfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMEVDbGFzcywgWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzLCAiWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpLCB0aGVPcm1QYWNrYWdlLmdldFhtbEF0dHJpYnV0ZU92ZXJyaWRlKCksIG51bGwsICJtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMiLCBudWxsLCAwLCAtMSwgWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMEVDbGFzcywgWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMC5jbGFzcywgIlhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleVRlbXBvcmFsKCksIHRoZU9ybVBhY2thZ2UuZ2V0VGVtcG9yYWxUeXBlKCksICJtYXBLZXlUZW1wb3JhbCIsIG51bGwsIDAsIDEsIFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzBfTWFwS2V5RW51bWVyYXRlZCgpLCB0aGVPcm1QYWNrYWdlLmdldEVudW1UeXBlKCksICJtYXBLZXlFbnVtZXJhdGVkIiwgbnVsbCwgMCwgMSwgWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHNJZF8yXzBFQ2xhc3MsIFhtbE1hcHNJZF8yXzAuY2xhc3MsICJYbWxNYXBzSWRfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sTWFwc0lkXzJfMF9NYXBzSWQoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJtYXBzSWQiLCBudWxsLCAwLCAxLCBYbWxNYXBzSWRfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMEVDbGFzcywgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC5jbGFzcywgIlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wX01hcEtleUNsYXNzKCksIHRoZU9ybVBhY2thZ2UuZ2V0WG1sQ2xhc3NSZWZlcmVuY2UoKSwgbnVsbCwgIm1hcEtleUNsYXNzIiwgbnVsbCwgMCwgMSwgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMF9NYXBLZXlDb2x1bW4oKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxDb2x1bW4oKSwgbnVsbCwgIm1hcEtleUNvbHVtbiIsIG51bGwsIDAsIDEsIFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Sm9pbkNvbHVtbnMoKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxKb2luQ29sdW1uKCksIG51bGwsICJtYXBLZXlKb2luQ29sdW1ucyIsIG51bGwsIDAsIC0xLCBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sTmFtZWRRdWVyeV8yXzBFQ2xhc3MsIFhtbE5hbWVkUXVlcnlfMl8wLmNsYXNzLCAiWG1sTmFtZWRRdWVyeV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxOYW1lZFF1ZXJ5XzJfMF9Mb2NrTW9kZSgpLCB0aGlzLmdldExvY2tNb2RlVHlwZV8yXzAoKSwgImxvY2tNb2RlIiwgbnVsbCwgMCwgMSwgWG1sTmFtZWRRdWVyeV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb01hbnlfMl8wRUNsYXNzLCBYbWxPbmVUb01hbnlfMl8wLmNsYXNzLCAiWG1sT25lVG9NYW55XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPbmVUb09uZV8yXzBFQ2xhc3MsIFhtbE9uZVRvT25lXzJfMC5jbGFzcywgIlhtbE9uZVRvT25lXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxPcmRlcmFibGVfMl8wRUNsYXNzLCBYbWxPcmRlcmFibGVfMl8wLmNsYXNzLCAiWG1sT3JkZXJhYmxlXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbE9yZGVyYWJsZV8yXzBfT3JkZXJDb2x1bW4oKSwgdGhlT3JtUGFja2FnZS5nZXRYbWxPcmRlckNvbHVtbigpLCBudWxsLCAib3JkZXJDb2x1bW4iLCBudWxsLCAwLCAxLCBYbWxPcmRlcmFibGVfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT3JkZXJDb2x1bW5fMl8wRUNsYXNzLCBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MsICJYbWxPcmRlckNvbHVtbl8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcmRlckNvbHVtbl8yXzBfTnVsbGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAibnVsbGFibGUiLCBudWxsLCAwLCAxLCBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9yZGVyQ29sdW1uXzJfMF9JbnNlcnRhYmxlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldEJvb2xlYW5PYmplY3QoKSwgImluc2VydGFibGUiLCBudWxsLCAwLCAxLCBYbWxPcmRlckNvbHVtbl8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbE9yZGVyQ29sdW1uXzJfMF9VcGRhdGFibGUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAidXBkYXRhYmxlIiwgbnVsbCwgMCwgMSwgWG1sT3JkZXJDb2x1bW5fMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sT3JwaGFuUmVtb3ZhYmxlXzJfMEVDbGFzcywgWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMC5jbGFzcywgIlhtbE9ycGhhblJlbW92YWJsZV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxPcnBoYW5SZW1vdmFibGVfMl8wX09ycGhhblJlbW92YWwoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbk9iamVjdCgpLCAib3JwaGFuUmVtb3ZhbCIsIG51bGwsIDAsIDEsIFhtbE9ycGhhblJlbW92YWJsZV8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMC5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBfRGVsaW1pdGVkSWRlbnRpZmllcnMoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0Qm9vbGVhbigpLCAiZGVsaW1pdGVkSWRlbnRpZmllcnMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzBFQ2xhc3MsIFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMC5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUXVlcnlfMl8wRUNsYXNzLCBYbWxRdWVyeV8yXzAuY2xhc3MsICJYbWxRdWVyeV8yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxRdWVyeV8yXzBfRGVzY3JpcHRpb24oKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJkZXNjcmlwdGlvbiIsIG51bGwsIDAsIDEsIFhtbFF1ZXJ5XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFF1ZXJ5SGludF8yXzBFQ2xhc3MsIFhtbFF1ZXJ5SGludF8yXzAuY2xhc3MsICJYbWxRdWVyeUhpbnRfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUXVlcnlIaW50XzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sUXVlcnlIaW50XzJfMC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMEVDbGFzcywgWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wLmNsYXNzLCAiWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wIiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX0NhdGFsb2coKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJjYXRhbG9nIiwgbnVsbCwgMCwgMSwgWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzBfU2NoZW1hKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAic2NoZW1hIiwgbnVsbCwgMCwgMSwgWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzBFQ2xhc3MsIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLmNsYXNzLCAiWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCi0JCWluaXRFQ2xhc3MoeG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzBFQ2xhc3MsIFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wLmNsYXNzLCAiWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxVbmlxdWVDb25zdHJhaW50XzJfMEVDbGFzcywgWG1sVW5pcXVlQ29uc3RyYWludF8yXzAuY2xhc3MsICJYbWxVbmlxdWVDb25zdHJhaW50XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wX05hbWUoKSwgdGhlWE1MVHlwZVBhY2thZ2UuZ2V0U3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgWG1sVW5pcXVlQ29uc3RyYWludF8yXzAuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5jbGFzcywgIkxvY2tNb2RlVHlwZV8yXzAiKTsKLQkJYWRkRUVudW1MaXRlcmFsKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5OT05FKTsKLQkJYWRkRUVudW1MaXRlcmFsKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5SRUFEKTsKLQkJYWRkRUVudW1MaXRlcmFsKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5XUklURSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChsb2NrTW9kZVR5cGVfMl8wRUVudW0sIExvY2tNb2RlVHlwZV8yXzAuT1BUSU1JU1RJQyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChsb2NrTW9kZVR5cGVfMl8wRUVudW0sIExvY2tNb2RlVHlwZV8yXzAuT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQpOwotCQlhZGRFRW51bUxpdGVyYWwobG9ja01vZGVUeXBlXzJfMEVFbnVtLCBMb2NrTW9kZVR5cGVfMl8wLlBFU1NJTUlTVElDX1JFQUQpOwotCQlhZGRFRW51bUxpdGVyYWwobG9ja01vZGVUeXBlXzJfMEVFbnVtLCBMb2NrTW9kZVR5cGVfMl8wLlBFU1NJTUlTVElDX1dSSVRFKTsKLQkJYWRkRUVudW1MaXRlcmFsKGxvY2tNb2RlVHlwZV8yXzBFRW51bSwgTG9ja01vZGVUeXBlXzJfMC5QRVNTSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wIDxlbT5YbWwgQXR0cmlidXRlIE1hcHBpbmcgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlTWFwcGluZ18yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFX01BUFBJTkdfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCA8ZW0+WG1sIEFzc29jaWF0aW9uIE92ZXJyaWRlIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwID0gZUlOU1RBTkNFLmdldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0FTU09DSUFUSU9OX09WRVJSSURFXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCA8ZW0+WG1sIEF0dHJpYnV0ZSBPdmVycmlkZSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0FUVFJJQlVURV9PVkVSUklERV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfQVRUUklCVVRFX09WRVJSSURFXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzBfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCA8ZW0+WG1sIEF0dHJpYnV0ZXMgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQVRUUklCVVRFU18yMCA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9BVFRSSUJVVEVTXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudCBDb2xsZWN0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfQVRUUklCVVRFU18yMF9fRUxFTUVOVF9DT0xMRUNUSU9OUyA9IGVJTlNUQU5DRS5nZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uVGFibGVfMl8wIDxlbT5YbWwgQ29sbGVjdGlvbiBUYWJsZSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDb2xsZWN0aW9uVGFibGVfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENvbGxlY3Rpb25UYWJsZV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ09MTEVDVElPTl9UQUJMRV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMCA8ZW0+WG1sIERlcml2ZWQgSWQgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxEZXJpdmVkSWRfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0RFUklWRURfSURfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sRGVyaXZlZElkXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9ERVJJVkVEX0lEXzIwX19JRCA9IGVJTlNUQU5DRS5nZXRYbWxEZXJpdmVkSWRfMl8wX0lkKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIDxlbT5YbWwgRWxlbWVudCBDb2xsZWN0aW9uIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VGFyZ2V0IENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19UQVJHRVRfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX1RhcmdldENsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fRkVUQ0ggPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0ZldGNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19NQVBfS0VZID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXkoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX01BUF9LRVlfQ0xBU1MgPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IENvbHVtbjwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBKb2luIENvbHVtbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX0VMRU1FTlRfQ09MTEVDVElPTl8yMF9fTUFQX0tFWV9KT0lOX0NPTFVNTlMgPSBlSU5TVEFOQ0UuZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUpvaW5Db2x1bW5zKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9FTEVNRU5UX0NPTExFQ1RJT05fMjBfX0NPTFVNTiA9IGVJTlNUQU5DRS5nZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfQ29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Db2xsZWN0aW9uIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfRUxFTUVOVF9DT0xMRUNUSU9OXzIwX19DT0xMRUNUSU9OX1RBQkxFID0gZUlOU1RBTkNFLmdldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9Db2xsZWN0aW9uVGFibGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbWJlZGRlZF8yXzAgPGVtPlhtbCBFbWJlZGRlZCAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbWJlZGRlZF8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRW1iZWRkZWRfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VNQkVEREVEXzIwID0gZUlOU1RBTkNFLmdldFhtbEVtYmVkZGVkXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eV8yXzAgPGVtPlhtbCBFbnRpdHkgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5XzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VOVElUWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFbnRpdHlfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wIDxlbT5YbWwgRW50aXR5IExpc3RlbmVyIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfRU5USVRZX0xJU1RFTkVSXzIwID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eUxpc3RlbmVyXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9FTlRJVFlfTElTVEVORVJfMjBfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFhtbEVudGl0eUxpc3RlbmVyXzJfMF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEV2ZW50TWV0aG9kXzJfMCA8ZW0+WG1sIEV2ZW50IE1ldGhvZCAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRXZlbnRNZXRob2RfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0VWRU5UX01FVEhPRF8yMCA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZF8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfRVZFTlRfTUVUSE9EXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxFdmVudE1ldGhvZF8yXzBfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wIDxlbT5YbWwgR2VuZXJhdG9yIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEdlbmVyYXRvcl8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9HRU5FUkFUT1JfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sR2VuZXJhdG9yXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9HRU5FUkFUT1JfMjBfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFhtbEdlbmVyYXRvcl8yXzBfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMCA8ZW0+WG1sIE1hbnkgVG8gTWFueSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYW55VG9NYW55XzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQU5ZX1RPX01BTllfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFueVRvTWFueV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAgPGVtPlhtbCBNYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZSBDb250YWluZXIgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT05UQUlORVJfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTlRBSU5FUl8yMF9fTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVTID0gZUlOU1RBTkNFLmdldFhtbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMF9NYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wIDxlbT5YbWwgTWFwIEtleSBDb252ZXJ0aWJsZSBNYXBwaW5nIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBUZW1wb3JhbDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX01BUF9LRVlfQ09OVkVSVElCTEVfTUFQUElOR18yMF9fTUFQX0tFWV9URU1QT1JBTCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleVRlbXBvcmFsKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQVBfS0VZX0NPTlZFUlRJQkxFX01BUFBJTkdfMjBfX01BUF9LRVlfRU5VTUVSQVRFRCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wX01hcEtleUVudW1lcmF0ZWQoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wIDxlbT5YbWwgTWFwcyBJZCAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hcHNJZF8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTUFQU19JRF8yMCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBzSWRfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBzIElkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfTUFQU19JRF8yMF9fTUFQU19JRCA9IGVJTlNUQU5DRS5nZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAgPGVtPlhtbCBNdWx0aSBSZWxhdGlvbnNoaXAgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX01VTFRJX1JFTEFUSU9OU0hJUF9NQVBQSU5HXzIwX19NQVBfS0VZX0NMQVNTID0gZUlOU1RBTkNFLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Q2xhc3MoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfQ09MVU1OID0gZUlOU1RBTkNFLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Q29sdW1uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXAgS2V5IEpvaW4gQ29sdW1uczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfTVVMVElfUkVMQVRJT05TSElQX01BUFBJTkdfMjBfX01BUF9LRVlfSk9JTl9DT0xVTU5TID0gZUlOU1RBTkNFLmdldFhtbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzBfTWFwS2V5Sm9pbkNvbHVtbnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxOYW1lZFF1ZXJ5XzJfMCA8ZW0+WG1sIE5hbWVkIFF1ZXJ5IDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE5hbWVkUXVlcnlfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX05BTUVEX1FVRVJZXzIwID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkUXVlcnlfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Mb2NrIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9OQU1FRF9RVUVSWV8yMF9fTE9DS19NT0RFID0gZUlOU1RBTkNFLmdldFhtbE5hbWVkUXVlcnlfMl8wX0xvY2tNb2RlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9NYW55XzJfMCA8ZW0+WG1sIE9uZSBUbyBNYW55IDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9NYW55XzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PTkVfVE9fTUFOWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxPbmVUb01hbnlfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT25lVG9PbmVfMl8wIDxlbT5YbWwgT25lIFRvIE9uZSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPbmVUb09uZV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT25lVG9PbmVfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09ORV9UT19PTkVfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sT25lVG9PbmVfMl8wKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wIDxlbT5YbWwgT3JkZXIgQ29sdW1uIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfT1JERVJfQ09MVU1OXzIwID0gZUlOU1RBTkNFLmdldFhtbE9yZGVyQ29sdW1uXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUkRFUl9DT0xVTU5fMjBfX05VTExBQkxFID0gZUlOU1RBTkNFLmdldFhtbE9yZGVyQ29sdW1uXzJfMF9OdWxsYWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zZXJ0YWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX09SREVSX0NPTFVNTl8yMF9fSU5TRVJUQUJMRSA9IGVJTlNUQU5DRS5nZXRYbWxPcmRlckNvbHVtbl8yXzBfSW5zZXJ0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfT1JERVJfQ09MVU1OXzIwX19VUERBVEFCTEUgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJDb2x1bW5fMl8wX1VwZGF0YWJsZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgRGVmYXVsdHMgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIwID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX0RFRkFVTFRTXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlbGltaXRlZCBJZGVudGlmaWVyczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfREVGQVVMVFNfMjBfX0RFTElNSVRFRF9JREVOVElGSUVSUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBfRGVsaW1pdGVkSWRlbnRpZmllcnMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IE1ldGFkYXRhIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQV8yMF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wX0Rlc2NyaXB0aW9uKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wIDxlbT5YbWwgUXVlcnkgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5XzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9RVUVSWV8yMCA9IGVJTlNUQU5DRS5nZXRYbWxRdWVyeV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfMjBfX0RFU0NSSVBUSU9OID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5XzJfMF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5SGludF8yXzAgPGVtPlhtbCBRdWVyeSBIaW50IDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFF1ZXJ5SGludF8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50XzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9RVUVSWV9ISU5UXzIwID0gZUlOU1RBTkNFLmdldFhtbFF1ZXJ5SGludF8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUVVFUllfSElOVF8yMF9fREVTQ1JJUFRJT04gPSBlSU5TVEFOQ0UuZ2V0WG1sUXVlcnlIaW50XzJfMF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCA8ZW0+WG1sIFNlcXVlbmNlIEdlbmVyYXRvciAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMCA9IGVJTlNUQU5DRS5nZXRYbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TRVFVRU5DRV9HRU5FUkFUT1JfMjBfX0NBVEFMT0cgPSBlSU5TVEFOQ0UuZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX0NhdGFsb2coKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1NFUVVFTkNFX0dFTkVSQVRPUl8yMF9fU0NIRU1BID0gZUlOU1RBTkNFLmdldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9TY2hlbWEoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCA8ZW0+WG1sIFNpbmdsZSBSZWxhdGlvbnNoaXAgTWFwcGluZyAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9TSU5HTEVfUkVMQVRJT05TSElQX01BUFBJTkdfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCA8ZW0+WG1sIFNxbCBSZXN1bHQgU2V0IE1hcHBpbmcgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfU1FMX1JFU1VMVF9TRVRfTUFQUElOR18yMCA9IGVJTlNUQU5DRS5nZXRYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9TUUxfUkVTVUxUX1NFVF9NQVBQSU5HXzIwX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMF9EZXNjcmlwdGlvbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wIDxlbT5YbWwgVW5pcXVlIENvbnN0cmFpbnQgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sVW5pcXVlQ29uc3RyYWludF8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfVU5JUVVFX0NPTlNUUkFJTlRfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sVW5pcXVlQ29uc3RyYWludF8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9VTklRVUVfQ09OU1RSQUlOVF8yMF9fTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMF9OYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMCA8ZW0+WG1sIENhY2hlYWJsZSAyMDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYWNoZWFibGVfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENhY2hlYWJsZV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0FDSEVBQkxFXzIwID0gZUlOU1RBTkNFLmdldFhtbENhY2hlYWJsZV8yXzAoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX0NBQ0hFQUJMRV8yMF9fQ0FDSEVBQkxFID0gZUlOU1RBTkNFLmdldFhtbENhY2hlYWJsZV8yXzBfQ2FjaGVhYmxlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FzY2FkZVR5cGVfMl8wIDxlbT5YbWwgQ2FzY2FkZSBUeXBlIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhc2NhZGVUeXBlXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxDYXNjYWRlVHlwZV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBYTUxfQ0FTQ0FERV9UWVBFXzIwID0gZUlOU1RBTkNFLmdldFhtbENhc2NhZGVUeXBlXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2FzY2FkZSBEZXRhY2g8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9DQVNDQURFX1RZUEVfMjBfX0NBU0NBREVfREVUQUNIID0gZUlOU1RBTkNFLmdldFhtbENhc2NhZGVUeXBlXzJfMF9DYXNjYWRlRGV0YWNoKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCA8ZW0+WG1sIE9ycGhhbiBSZW1vdmFibGUgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcnBoYW5SZW1vdmFibGVfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX09SUEhBTl9SRU1PVkFCTEVfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JwaGFuIFJlbW92YWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9PUlBIQU5fUkVNT1ZBQkxFXzIwX19PUlBIQU5fUkVNT1ZBTCA9IGVJTlNUQU5DRS5nZXRYbWxPcnBoYW5SZW1vdmFibGVfMl8wX09ycGhhblJlbW92YWwoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxPcmRlcmFibGVfMl8wIDxlbT5YbWwgT3JkZXJhYmxlIDIwPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyYWJsZV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJhYmxlXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9PUkRFUkFCTEVfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJhYmxlXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfT1JERVJBQkxFXzIwX19PUkRFUl9DT0xVTU4gPSBlSU5TVEFOQ0UuZ2V0WG1sT3JkZXJhYmxlXzJfMF9PcmRlckNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzAgPGVtPkxvY2sgTW9kZSBUeXBlIDIwPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRMb2NrTW9kZVR5cGVfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFRW51bSBMT0NLX01PREVfVFlQRV8yMCA9IGVJTlNUQU5DRS5nZXRMb2NrTW9kZVR5cGVfMl8wKCk7Ci0KLQl9Ci0KLX0gLy9Pcm1WMl8wUGFja2FnZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNzE4NTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQXNzb2NpYXRpb25PdmVycmlkZV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luVGFibGVDb250YWluZXI7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBc3NvY2lhdGlvbiBPdmVycmlkZSAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlXzJfMCBleHRlbmRzIFhtbEpvaW5UYWJsZUNvbnRhaW5lcgotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQXR0cmlidXRlTWFwcGluZ18yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwOTRmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxBdHRyaWJ1dGVNYXBwaW5nXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEFjY2Vzc0hvbGRlcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZSBNYXBwaW5nIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlTWFwcGluZ18yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEF0dHJpYnV0ZU1hcHBpbmdfMl8wIGV4dGVuZHMgWG1sQWNjZXNzSG9sZGVyCi17Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzYxOGY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBBdHRyaWJ1dGUgT3ZlcnJpZGUgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlT3ZlcnJpZGVfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEF0dHJpYnV0ZU92ZXJyaWRlXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxBdHRyaWJ1dGVPdmVycmlkZV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZXNfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxBdHRyaWJ1dGVzXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjhmNzU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEF0dHJpYnV0ZXNfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVsZW1lbnRDb2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEF0dHJpYnV0ZXMgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxBdHRyaWJ1dGVzXzJfMCNnZXRFbGVtZW50Q29sbGVjdGlvbnMgPGVtPkVsZW1lbnQgQ29sbGVjdGlvbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQXR0cmlidXRlc18yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQXR0cmlidXRlc18yXzBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQXR0cmlidXRlc18yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50IENvbGxlY3Rpb25zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50IENvbGxlY3Rpb25zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudCBDb2xsZWN0aW9uczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxBdHRyaWJ1dGVzXzJfMF9FbGVtZW50Q29sbGVjdGlvbnMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3Q8WG1sRWxlbWVudENvbGxlY3Rpb24+IGdldEVsZW1lbnRDb2xsZWN0aW9ucygpOwotCi19IC8vIFhtbEF0dHJpYnV0ZXNfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYWNoZWFibGVfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYWNoZWFibGVfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYWM1NmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ2FjaGVhYmxlXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENhY2hlYWJsZTIgMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhY2hlYWJsZV8yXzAjZ2V0Q2FjaGVhYmxlIDxlbT5DYWNoZWFibGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxDYWNoZWFibGVfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDYWNoZWFibGVfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhY2hlYWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNhY2hlYWJsZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FjaGVhYmxlKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sQ2FjaGVhYmxlXzJfMF9DYWNoZWFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0Q2FjaGVhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sQ2FjaGVhYmxlXzJfMCNnZXRDYWNoZWFibGUgPGVtPkNhY2hlYWJsZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2FjaGVhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDYWNoZWFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENhY2hlYWJsZShCb29sZWFuIHZhbHVlKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgY2FjaGVhYmxlIGFubm90YXRpb24KLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0Q2FjaGVhYmxlVGV4dFJhbmdlKCk7Ci19IC8vIFhtbENhY2hlYWJsZTJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ2FzY2FkZVR5cGVfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYXNjYWRlVHlwZV8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViYjk2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxDYXNjYWRlVHlwZV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgQ2FzY2FkZSBUeXBlIDIwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxDYXNjYWRlVHlwZV8yXzAjaXNDYXNjYWRlRGV0YWNoIDxlbT5DYXNjYWRlIERldGFjaDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENhc2NhZGVUeXBlXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sQ2FzY2FkZVR5cGVfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhc2NhZGUgRGV0YWNoPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DYXNjYWRlIERldGFjaDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIERldGFjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2FzY2FkZURldGFjaChib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbENhc2NhZGVUeXBlXzJfMF9DYXNjYWRlRGV0YWNoKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5Cb29sZWFuIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzQ2FzY2FkZURldGFjaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbENhc2NhZGVUeXBlXzJfMCNpc0Nhc2NhZGVEZXRhY2ggPGVtPkNhc2NhZGUgRGV0YWNoPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DYXNjYWRlIERldGFjaDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjaXNDYXNjYWRlRGV0YWNoKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDYXNjYWRlRGV0YWNoKGJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbENhc2NhZGVUeXBlXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ29sbGVjdGlvblRhYmxlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sQ29sbGVjdGlvblRhYmxlXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOThhMjMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbENvbGxlY3Rpb25UYWJsZV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxSZWZlcmVuY2VUYWJsZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIENvbGxlY3Rpb24gVGFibGUgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxDb2xsZWN0aW9uVGFibGVfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxDb2xsZWN0aW9uVGFibGVfMl8wIGV4dGVuZHMgWG1sUmVmZXJlbmNlVGFibGUKLXsKLQotfSAvLyBYbWxDb2xsZWN0aW9uVGFibGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxEZXJpdmVkSWRfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxEZXJpdmVkSWRfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGQ1ODUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRGVyaXZlZElkXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRGVyaXZlZCBJZCAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAjZ2V0SWQgPGVtPklkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRGVyaXZlZElkXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRGVyaXZlZElkXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldElkKEJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRGVyaXZlZElkXzJfMF9JZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzAjZ2V0SWQgPGVtPklkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5JZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldElkKEJvb2xlYW4gdmFsdWUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSBvZiB0aGUgZGVyaXZlZCBpZCBwYXJ0IG9mIHRoZSBYTUwgZG9jdW1lbnQKLQkgKi8KLQlUZXh0UmFuZ2UgZ2V0SWRUZXh0UmFuZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVsZW1lbnRDb2xsZWN0aW9uXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjYxOTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5NYXBLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbGxlY3Rpb25UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPcmRlcmFibGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBFbGVtZW50IENvbGxlY3Rpb24gMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0VGFyZ2V0Q2xhc3MgPGVtPlRhcmdldCBDbGFzczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5IDxlbT5NYXAgS2V5PC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleUNsYXNzIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleUNvbHVtbiA8ZW0+TWFwIEtleSBDb2x1bW48L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAjZ2V0TWFwS2V5Sm9pbkNvbHVtbnMgPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldENvbGxlY3Rpb25UYWJsZSA8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGV4dGVuZHMgWG1sQ29udmVydGlibGVNYXBwaW5nLCBYbWxPcmRlcmFibGUsIFhtbEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBYbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBYbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAsIFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UYXJnZXQgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UYXJnZXQgQ2xhc3M8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFRhcmdldENsYXNzKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzBfVGFyZ2V0Q2xhc3MoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFRhcmdldENsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldFRhcmdldENsYXNzIDxlbT5UYXJnZXQgQ2xhc3M8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRhcmdldCBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VGFyZ2V0Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFRhcmdldENsYXNzKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GZXRjaDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjc2V0RmV0Y2goRmV0Y2hUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9GZXRjaCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUZldGNoVHlwZSBnZXRGZXRjaCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRGZXRjaCA8ZW0+RmV0Y2g8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZldGNoPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlCi0JICogQHNlZSAjZ2V0RmV0Y2goKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEZldGNoKEZldGNoVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5PC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXk8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldE1hcEtleShNYXBLZXkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlNYXBLZXkgZ2V0TWFwS2V5KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleSA8ZW0+TWFwIEtleTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBLZXkoTWFwS2V5IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ2xhc3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ2xhc3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5Q2xhc3MoWG1sQ2xhc3NSZWZlcmVuY2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUNsYXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENsYXNzUmVmZXJlbmNlIGdldE1hcEtleUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldE1hcEtleUNsYXNzIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRNYXBLZXlDbGFzcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwS2V5Q2xhc3MoWG1sQ2xhc3NSZWZlcmVuY2UgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDb2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMF9NYXBLZXlDb2x1bW4oKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JWG1sQ29sdW1uIGdldE1hcEtleUNvbHVtbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX01hcEtleUpvaW5Db2x1bW5zKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0PFhtbEpvaW5Db2x1bW4+IGdldE1hcEtleUpvaW5Db2x1bW5zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2x1bW48L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbHVtbihYbWxDb2x1bW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDb2x1bW4gZ2V0Q29sdW1uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldENvbHVtbiA8ZW0+Q29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbHVtbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29sdW1uKFhtbENvbHVtbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2xsZWN0aW9uIFRhYmxlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db2xsZWN0aW9uIFRhYmxlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbGxlY3Rpb24gVGFibGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldENvbGxlY3Rpb25UYWJsZShYbWxDb2xsZWN0aW9uVGFibGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sRWxlbWVudENvbGxlY3Rpb25fMl8wX0NvbGxlY3Rpb25UYWJsZSgpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDb2xsZWN0aW9uVGFibGUgZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wI2dldENvbGxlY3Rpb25UYWJsZSA8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29sbGVjdGlvbiBUYWJsZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29sbGVjdGlvblRhYmxlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb2xsZWN0aW9uVGFibGUoWG1sQ29sbGVjdGlvblRhYmxlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSB0YXJnZXQtY2xhc3MgYXR0cmlidXRlLgotCSAqLwotCVRleHRSYW5nZSBnZXRUYXJnZXRDbGFzc1RleHRSYW5nZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1hcC1rZXktY2xhc3MgYXR0cmlidXRlLgotCSAqLwotCVRleHRSYW5nZSBnZXRNYXBLZXlDbGFzc1RleHRSYW5nZSgpOwotCi19IC8vIFhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW1iZWRkZWRfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbWJlZGRlZF8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE3MjhkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFbWJlZGRlZF8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRW1iZWRkZWQgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbWJlZGRlZF8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVtYmVkZGVkXzJfMCBleHRlbmRzIFhtbEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIKLXsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVudGl0eUxpc3RlbmVyXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTFmMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5TGlzdGVuZXJfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eSBMaXN0ZW5lciAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEVudGl0eUxpc3RlbmVyXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eUxpc3RlbmVyXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxFbnRpdHlMaXN0ZW5lcl8yXzBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRW50aXR5TGlzdGVuZXJfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEVudGl0eUxpc3RlbmVyXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRW50aXR5XzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY5NjIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbEVudGl0eV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIEVudGl0eSAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEVudGl0eV8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEVudGl0eV8yXzAgZXh0ZW5kcyBYbWxDYWNoZWFibGVfMl8wCi17Ci0KLX0gLy8gWG1sRW50aXR5XzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sRXZlbnRNZXRob2RfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFdmVudE1ldGhvZF8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2NTllMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxFdmVudE1ldGhvZF8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgRXZlbnQgTWV0aG9kIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRXZlbnRNZXRob2RfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sRXZlbnRNZXRob2RfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEV2ZW50TWV0aG9kXzJfMF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFdmVudE1ldGhvZF8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sRXZlbnRNZXRob2RfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxHZW5lcmF0b3JfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxHZW5lcmF0b3JfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZWE0MzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sR2VuZXJhdG9yXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBHZW5lcmF0b3IgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbEdlbmVyYXRvcl8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbEdlbmVyYXRvcl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sR2VuZXJhdG9yXzJfMF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxHZW5lcmF0b3JfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbEdlbmVyYXRvcl8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hbnlUb01hbnlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYW55VG9NYW55XzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmFiNWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hbnlUb01hbnlfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFueSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFueVRvTWFueV8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE1hbnlUb01hbnlfMl8wIGV4dGVuZHMgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMAotewotCi19IC8vIFhtbE1hbnlUb01hbnlfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGEyMDZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGUgQ29udGFpbmVyMiAwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wI2dldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA8ZW0+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBBdHRyaWJ1dGUgT3ZlcnJpZGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZX0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEF0dHJpYnV0ZSBPdmVycmlkZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wX01hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0KLX0gLy8gWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIyXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcEtleUNsYXNzXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwS2V5Q2xhc3NfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjdiOTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwS2V5Q2xhc3NfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE1hcCBLZXkgQ2xhc3MgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDbGFzc18yXzAjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q2xhc3NfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYXBLZXlDbGFzc18yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2xhc3MgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q2xhc3MgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDbGFzc05hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hcEtleUNsYXNzXzJfMF9DbGFzc05hbWUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDbGFzc05hbWUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDbGFzc18yXzAjZ2V0Q2xhc3NOYW1lIDxlbT5DbGFzcyBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DbGFzcyBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDbGFzc05hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbE1hcEtleUNsYXNzXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGZlNTFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTWFwIEtleSBDb252ZXJ0aWJsZSBNYXBwaW5nIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCNnZXRNYXBLZXlUZW1wb3JhbCA8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAjZ2V0TWFwS2V5RW51bWVyYXRlZCA8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IFRlbXBvcmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGV9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBUZW1wb3JhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjc2V0TWFwS2V5VGVtcG9yYWwoVGVtcG9yYWxUeXBlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzBfTWFwS2V5VGVtcG9yYWwoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlUZW1wb3JhbFR5cGUgZ2V0TWFwS2V5VGVtcG9yYWwoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wI2dldE1hcEtleVRlbXBvcmFsIDxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IFRlbXBvcmFsPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlCi0JICogQHNlZSAjZ2V0TWFwS2V5VGVtcG9yYWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcEtleVRlbXBvcmFsKFRlbXBvcmFsVHlwZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXAgS2V5IEVudW1lcmF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgRW51bWVyYXRlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI3NldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTWFwS2V5Q29udmVydGlibGVNYXBwaW5nXzJfMF9NYXBLZXlFbnVtZXJhdGVkKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRW51bVR5cGUgZ2V0TWFwS2V5RW51bWVyYXRlZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAjZ2V0TWFwS2V5RW51bWVyYXRlZCA8ZW0+TWFwIEtleSBFbnVtZXJhdGVkPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IEVudW1lcmF0ZWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZQotCSAqIEBzZWUgI2dldE1hcEtleUVudW1lcmF0ZWQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcEtleUVudW1lcmF0ZWQoRW51bVR5cGUgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGVudW1lcmF0ZWQgZWxlbWVudC4gIElmIHRoZSBlbnVtZXJhdGVkIGVsZW1lbnQgCi0JICogZG9lcyBub3QgZXhpc3QgcmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIGJhc2ljIGVsZW1lbnQuCi0JICovCi0JVGV4dFJhbmdlIGdldE1hcEtleUVudW1lcmF0ZWRUZXh0UmFuZ2UoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHtAbGluayBUZXh0UmFuZ2V9IGZvciB0aGUgdGVtcG9yYWwgZWxlbWVudC4gIElmIHRoZSB0ZW1wb3JhbCBlbGVtZW50IAotCSAqIGRvZXMgbm90IGV4aXN0IHJldHVybiB0aGUge0BsaW5rIFRleHRSYW5nZX0gZm9yIHRoZSBiYXNpYyBlbGVtZW50LgotCSAqLwotCVRleHRSYW5nZSBnZXRNYXBLZXlUZW1wb3JhbFRleHRSYW5nZSgpOwotCi19IC8vIFhtbE1hcEtleUNvbnZlcnRpYmxlTWFwcGluZ18yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHNJZF8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE1hcHNJZF8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwZWE1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxNYXBzSWRfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBNYXBzIElkIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMCNnZXRNYXBzSWQgPGVtPk1hcHMgSWQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBzSWRfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNYXBzSWRfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcHMgSWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHMgSWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwcyBJZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0TWFwc0lkKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNYXBzSWRfMl8wX01hcHNJZCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0TWFwc0lkKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMCNnZXRNYXBzSWQgPGVtPk1hcHMgSWQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1hcHMgSWQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE1hcHNJZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TWFwc0lkKFN0cmluZyB2YWx1ZSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZXh0IHJhbmdlIG9mIHRoZSAibWFwcy1pZCIgcGFydCBvZiB0aGUgWE1MIGRvY3VtZW50Ci0JICovCi0JVGV4dFJhbmdlIGdldE1hcHNJZFRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzFiNDZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1uOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgTXVsdGkgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wI2dldE1hcEtleUNsYXNzIDxlbT5NYXAgS2V5IENsYXNzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCNnZXRNYXBLZXlKb2luQ29sdW1ucyA8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wIGV4dGVuZHMgWG1sT3JkZXJhYmxlXzJfMCwgWG1sTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJfMl8wLCBYbWxNYXBLZXlDb252ZXJ0aWJsZU1hcHBpbmdfMl8wCi17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwIEtleSBDbGFzczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENsYXNzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRNYXBLZXlDbGFzcyhYbWxDbGFzc1JlZmVyZW5jZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wX01hcEtleUNsYXNzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbENsYXNzUmVmZXJlbmNlIGdldE1hcEtleUNsYXNzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCNnZXRNYXBLZXlDbGFzcyA8ZW0+TWFwIEtleSBDbGFzczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBDbGFzczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE1hcEtleUNsYXNzKFhtbENsYXNzUmVmZXJlbmNlIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0TWFwS2V5Q29sdW1uKFhtbENvbHVtbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wX01hcEtleUNvbHVtbigpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxDb2x1bW4gZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCNnZXRNYXBLZXlDb2x1bW4gPGVtPk1hcCBLZXkgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXAgS2V5IENvbHVtbjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0TWFwS2V5Q29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRNYXBLZXlDb2x1bW4oWG1sQ29sdW1uIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luQ29sdW1ufS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcCBLZXkgSm9pbiBDb2x1bW5zPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwIEtleSBKb2luIENvbHVtbnM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMF9NYXBLZXlKb2luQ29sdW1ucygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdDxYbWxKb2luQ29sdW1uPiBnZXRNYXBLZXlKb2luQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB7QGxpbmsgVGV4dFJhbmdlfSBmb3IgdGhlIG1hcC1rZXktY2xhc3MgYXR0cmlidXRlLgotCSAqLwotCVRleHRSYW5nZSBnZXRNYXBLZXlDbGFzc1RleHRSYW5nZSgpOwotfSAvLyBYbWxNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxOYW1lZFF1ZXJ5XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sTmFtZWRRdWVyeV8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMwZjYzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxOYW1lZFF1ZXJ5XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBOYW1lZCBRdWVyeSAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE5hbWVkUXVlcnlfMl8wI2dldExvY2tNb2RlIDxlbT5Mb2NrIE1vZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxOYW1lZFF1ZXJ5XzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sTmFtZWRRdWVyeV8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TG9jayBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLkxvY2tNb2RlVHlwZV8yXzB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TG9jayBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkxvY2sgTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuTG9ja01vZGVUeXBlXzJfMAotCSAqIEBzZWUgI3NldExvY2tNb2RlKExvY2tNb2RlVHlwZV8yXzApCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sTmFtZWRRdWVyeV8yXzBfTG9ja01vZGUoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlMb2NrTW9kZVR5cGVfMl8wIGdldExvY2tNb2RlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTmFtZWRRdWVyeV8yXzAjZ2V0TG9ja01vZGUgPGVtPkxvY2sgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TG9jayBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wCi0JICogQHNlZSAjZ2V0TG9ja01vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldExvY2tNb2RlKExvY2tNb2RlVHlwZV8yXzAgdmFsdWUpOwotCi19IC8vIFhtbE5hbWVkUXVlcnlfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPbmVUb01hbnlfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNzkyYzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT25lVG9NYW55XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBNYW55IDIwPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPbmVUb01hbnlfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPbmVUb01hbnlfMl8wIGV4dGVuZHMgWG1sTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCwgWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMAotewotCi19IC8vIFhtbE9uZVRvTWFueV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9uZVRvT25lXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT25lVG9PbmVfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhOWE3YzUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT25lVG9PbmVfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9uZSBUbyBPbmUgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPbmVUb09uZV8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9uZVRvT25lXzJfMCBleHRlbmRzIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLCBYbWxPcnBoYW5SZW1vdmFibGVfMl8wCi17Ci0KLX0gLy8gWG1sT25lVG9PbmVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxPcmRlckNvbHVtbl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2RhZjBjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyQ29sdW1uXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3JkZXIgQ29sdW1uIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldE51bGxhYmxlIDxlbT5OdWxsYWJsZTwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXRJbnNlcnRhYmxlIDxlbT5JbnNlcnRhYmxlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sT3JkZXJDb2x1bW5fMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPcmRlckNvbHVtbl8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVsbGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROdWxsYWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9OdWxsYWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXROdWxsYWJsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyQ29sdW1uXzJfMCNnZXROdWxsYWJsZSA8ZW0+TnVsbGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bGxhYmxlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXROdWxsYWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TnVsbGFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5JbnNlcnRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnNlcnRhYmxlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEluc2VydGFibGUoQm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlckNvbHVtbl8yXzBfSW5zZXJ0YWJsZSgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldEluc2VydGFibGUgPGVtPkluc2VydGFibGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkluc2VydGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldEluc2VydGFibGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEluc2VydGFibGUoQm9vbGVhbiB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlVwZGF0YWJsZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFVwZGF0YWJsZShCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyQ29sdW1uXzJfMF9VcGRhdGFibGUoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLkJvb2xlYW5PYmplY3QiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUJvb2xlYW4gZ2V0VXBkYXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJDb2x1bW5fMl8wI2dldFVwZGF0YWJsZSA8ZW0+VXBkYXRhYmxlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5VcGRhdGFibGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFVwZGF0YWJsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdmFsdWUpOwotCi19IC8vIFhtbE9yZGVyQ29sdW1uXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJhYmxlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JkZXJhYmxlXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2NjFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9yZGVyYWJsZV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9yZGVyQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIE9yZGVyYWJsZSAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9yZGVyYWJsZV8yXzAjZ2V0T3JkZXJDb2x1bW4gPGVtPk9yZGVyIENvbHVtbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9yZGVyYWJsZV8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbE9yZGVyYWJsZV8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T3JkZXIgQ29sdW1uPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+T3JkZXIgQ29sdW1uPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcmRlcmFibGVfMl8wX09yZGVyQ29sdW1uKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbE9yZGVyQ29sdW1uIGdldE9yZGVyQ29sdW1uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JkZXJhYmxlXzJfMCNnZXRPcmRlckNvbHVtbiA8ZW0+T3JkZXIgQ29sdW1uPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PcmRlciBDb2x1bW48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldE9yZGVyQ29sdW1uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPcmRlckNvbHVtbihYbWxPcmRlckNvbHVtbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sT3JkZXJhYmxlXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE4NTQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbE9ycGhhblJlbW92YWJsZV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5YbWwgT3JwaGFuIFJlbW92YWJsZTIgMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9ycGhhblJlbW92YWJsZV8yXzAjZ2V0T3JwaGFuUmVtb3ZhbCA8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxPcnBoYW5SZW1vdmFibGVfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxPcnBoYW5SZW1vdmFibGVfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk9ycGhhbiBSZW1vdmFsPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbE9ycGhhblJlbW92YWJsZV8yXzBfT3JwaGFuUmVtb3ZhbCgpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQm9vbGVhbiBnZXRPcnBoYW5SZW1vdmFsKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sT3JwaGFuUmVtb3ZhYmxlXzJfMCNnZXRPcnBoYW5SZW1vdmFsIDxlbT5PcnBoYW4gUmVtb3ZhbDwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+T3JwaGFuIFJlbW92YWw8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE9ycGhhblJlbW92YWwoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldE9ycGhhblJlbW92YWwoQm9vbGVhbiB2YWx1ZSk7Ci0KLX0gLy8gWG1sT3JwaGFuUmVtb3ZhYmxlMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTA1YmYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IERlZmF1bHRzIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCNpc0RlbGltaXRlZElkZW50aWZpZXJzIDxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzBfRGVzY3JpcHRpb24oKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZWxpbWl0ZWQgSWRlbnRpZmllcnM8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWxpbWl0ZWRJZGVudGlmaWVycyhib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzXzJfMF9EZWxpbWl0ZWRJZGVudGlmaWVycygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JYm9vbGVhbiBpc0RlbGltaXRlZElkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNfMl8wI2lzRGVsaW1pdGVkSWRlbnRpZmllcnMgPGVtPkRlbGltaXRlZCBJZGVudGlmaWVyczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVsaW1pdGVkIElkZW50aWZpZXJzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc0RlbGltaXRlZElkZW50aWZpZXJzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWxpbWl0ZWRJZGVudGlmaWVycyhib29sZWFuIHZhbHVlKTsKLQotfSAvLyBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c18yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYzllY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgTWV0YWRhdGEgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIgaW50ZXJmYWNlPSJ0cnVlIiBhYnN0cmFjdD0idHJ1ZSIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhXzJfMCNnZXREZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHZhbHVlKTsKLQotfSAvLyBYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YV8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5SGludF8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5SGludF8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlNjhkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxRdWVyeUhpbnRfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJ5IEhpbnQgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5SGludF8yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFF1ZXJ5SGludF8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZXNjcmlwdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sUXVlcnlIaW50XzJfMF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeUhpbnRfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFF1ZXJ5SGludF8yXzAKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFF1ZXJ5XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUXVlcnlfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYWE0NjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sUXVlcnlfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFF1ZXJ5IDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sUXVlcnlfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5XzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUXVlcnlfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFF1ZXJ5XzJfMF9EZXNjcmlwdGlvbigpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxRdWVyeV8yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyB2YWx1ZSk7Ci0KLX0gLy8gWG1sUXVlcnlfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODU0OTcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFNlcXVlbmNlR2VuZXJhdG9yXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTZXF1ZW5jZSBHZW5lcmF0b3IgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNhdGFsb2c8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q2F0YWxvZyhTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU2VxdWVuY2VHZW5lcmF0b3JfMl8wX0NhdGFsb2coKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENhdGFsb2coKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxTZXF1ZW5jZUdlbmVyYXRvcl8yXzAjZ2V0Q2F0YWxvZyA8ZW0+Q2F0YWxvZzwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q2F0YWxvZzwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Q2F0YWxvZygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q2F0YWxvZyhTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWE8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWEoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMF9TY2hlbWEoKQotCSAqIEBtb2RlbCBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFNjaGVtYSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMCNnZXRTY2hlbWEgPGVtPlNjaGVtYTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2hlbWEoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFNjaGVtYShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFNlcXVlbmNlR2VuZXJhdG9yXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL29ybS92Ml8wL1htbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDg3ZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTaW5nbGUgUmVsYXRpb25zaGlwIE1hcHBpbmcgMjA8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nXzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZ18yXzAgZXh0ZW5kcyBYbWxEZXJpdmVkSWRfMl8wLCBYbWxNYXBzSWRfMl8wCi17Ci19IC8vIFhtbFNpbmdsZVJlbGF0aW9uc2hpcE1hcHBpbmdfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwNGI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxTcWxSZXN1bHRTZXRNYXBwaW5nXzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBTcWwgUmVzdWx0IFNldCBNYXBwaW5nIDIwPC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2UjZ2V0WG1sU3FsUmVzdWx0U2V0TWFwcGluZ18yXzAoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wIGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RGVzY3JpcHRpb24oU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLk9ybVYyXzBQYWNrYWdlI2dldFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wX0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wI2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFNxbFJlc3VsdFNldE1hcHBpbmdfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2Uvb3JtL3YyXzAvWG1sVW5pcXVlQ29uc3RyYWludF8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NjA2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9vcm0vdjJfMC9YbWxVbmlxdWVDb25zdHJhaW50XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBVbmlxdWUgQ29uc3RyYWludCAyMDwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sVW5pcXVlQ29uc3RyYWludF8yXzAgZXh0ZW5kcyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZSNnZXRYbWxVbmlxdWVDb25zdHJhaW50XzJfMF9OYW1lKCkKLQkgKiBAbW9kZWwgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sVW5pcXVlQ29uc3RyYWludF8yXzAjZ2V0TmFtZSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0TmFtZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIFhtbFVuaXF1ZUNvbnN0cmFpbnRfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9KUEEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL0pQQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODE3NmM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL0pQQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotLyoqCi0gKiBKUEEgcGVyc2lzdGVuY2UueG1sLXJlbGF0ZWQgc3R1ZmYgKGVsZW1lbnRzLCBhdHRyaWJ1dGVzIGV0Yy4pCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgSlBBIAotewotCVN0cmluZyBTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlIjsKLQlTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BlcnNpc3RlbmNlL3BlcnNpc3RlbmNlXzFfMC54c2QiOwotCVN0cmluZyBTQ0hFTUFfVkVSU0lPTiA9ICIxLjAiOwotCQotCVN0cmluZyBDTEFTUyA9ICJjbGFzcyI7Ci0KLQlTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwotCi0JU3RyaW5nIEVYQ0xVREVfVU5MSVNURURfQ0xBU1NFUyA9ICJleGNsdWRlLXVubGlzdGVkLWNsYXNzZXMiOwotCi0JU3RyaW5nIEpBUl9GSUxFID0gImphci1maWxlIjsKLQotCVN0cmluZyBKVEFfREFUQV9TT1VSQ0UgPSAianRhLWRhdGEtc291cmNlIjsKLQotCVN0cmluZyBNQVBQSU5HX0ZJTEUgPSAibWFwcGluZy1maWxlIjsKLQotCVN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFID0gIm5vbi1qdGEtZGF0YS1zb3VyY2UiOwotCi0JU3RyaW5nIFBFUlNJU1RFTkNFID0gInBlcnNpc3RlbmNlIjsKLQkKLQlTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVCA9ICJwZXJzaXN0ZW5jZS11bml0IjsKLQkJU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFID0gInRyYW5zYWN0aW9uLXR5cGUiOwotCi0JU3RyaW5nIFBST1BFUlRJRVMgPSAicHJvcGVydGllcyI7Ci0KLQlTdHJpbmcgUFJPUEVSVFkgPSAicHJvcGVydHkiOwotCQlTdHJpbmcgUFJPUEVSVFlfX05BTUUgPSAibmFtZSI7Ci0JCVN0cmluZyBQUk9QRVJUWV9fVkFMVUUgPSAidmFsdWUiOwotCi0JU3RyaW5nIFBST1ZJREVSID0gInByb3ZpZGVyIjsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmODEzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlRmFjdG9yeSBlSU5TVEFOQ0UgPSBpbml0KCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZUZhY3RvcnkgaW5pdCgpCi0JewotCQl0cnkKLQkJewotCQkJUGVyc2lzdGVuY2VGYWN0b3J5IHRoZVBlcnNpc3RlbmNlRmFjdG9yeSA9IChQZXJzaXN0ZW5jZUZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoImpwdC5wZXJzaXN0ZW5jZS54bWkiKTsgCi0JCQlpZiAodGhlUGVyc2lzdGVuY2VGYWN0b3J5ICE9IG51bGwpCi0JCQl7Ci0JCQkJcmV0dXJuIHRoZVBlcnNpc3RlbmNlRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZUZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZUZhY3RvcnkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykKLQl7Ci0JCXN3aXRjaCAoZUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFWQV9DTEFTU19SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVJfRklMRV9SRUY6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxKYXJGaWxlUmVmKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfTUFQUElOR19GSUxFX1JFRjogcmV0dXJuIChFT2JqZWN0KWNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0U6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVQ6IHJldHVybiAoRU9iamVjdCljcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUSUVTOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRZOiByZXR1cm4gKEVPYmplY3QpY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gY29udmVydFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sSmF2YUNsYXNzUmVmIGNyZWF0ZVhtbEphdmFDbGFzc1JlZigpCi0JewotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sSmF2YUNsYXNzUmVmID0gbmV3IFhtbEphdmFDbGFzc1JlZigpOwotCQlyZXR1cm4geG1sSmF2YUNsYXNzUmVmOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxKYXJGaWxlUmVmIGNyZWF0ZVhtbEphckZpbGVSZWYoKQotCXsKLQkJWG1sSmFyRmlsZVJlZiB4bWxKYXJGaWxlUmVmID0gbmV3IFhtbEphckZpbGVSZWYoKTsKLQkJcmV0dXJuIHhtbEphckZpbGVSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbE1hcHBpbmdGaWxlUmVmIGNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCkKLQl7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmID0gbmV3IFhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXJldHVybiB4bWxNYXBwaW5nRmlsZVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2UgY3JlYXRlWG1sUGVyc2lzdGVuY2UoKQotCXsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBuZXcgWG1sUGVyc2lzdGVuY2UoKTsKLQkJcmV0dXJuIHhtbFBlcnNpc3RlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXQgY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0KCkKLQl7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBuZXcgWG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByb3BlcnRpZXMgY3JlYXRlWG1sUHJvcGVydGllcygpCi0JewotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBuZXcgWG1sUHJvcGVydGllcygpOwotCQlyZXR1cm4geG1sUHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUHJvcGVydHkgY3JlYXRlWG1sUHJvcGVydHkoKQotCXsKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBuZXcgWG1sUHJvcGVydHkoKTsKLQkJcmV0dXJuIHhtbFByb3BlcnR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWUgJyIgKyBpbml0aWFsVmFsdWUgKyAiJyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIG9mICciICsgZURhdGFUeXBlLmdldE5hbWUoKSArICInIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpCi0JewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VQYWNrYWdlIGdldFBlcnNpc3RlbmNlUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlUGFja2FnZSlnZXRFUGFja2FnZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGRlcHJlY2F0ZWQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIFBlcnNpc3RlbmNlUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL1BlcnNpc3RlbmNlRmFjdG9yeQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VQYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVBhY2thZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExNTI3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVBhY2thZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlhNTFR5cGVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuT3JtVjJfMFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeQotICogQG1vZGVsIGtpbmQ9InBhY2thZ2UiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZUltcGwKLXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gInBlcnNpc3RlbmNlIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQucGVyc2lzdGVuY2UueG1pIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOU19QUkVGSVggPSAib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZS5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYgPGVtPlhtbCBKYXZhIENsYXNzIFJlZjwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmF2YUNsYXNzUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pBVkFfQ0xBU1NfUkVGID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKYXZhIENsYXNzIFJlZjwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9KQVZBX0NMQVNTX1JFRl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWYgPGVtPlhtbCBKYXIgRmlsZSBSZWY8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXJGaWxlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX0pBUl9GSUxFX1JFRiA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RmlsZSBOYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFSX0ZJTEVfUkVGX19GSUxFX05BTUUgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBKYXIgRmlsZSBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfSkFSX0ZJTEVfUkVGX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYgPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbE1hcHBpbmdGaWxlUmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBJTkdfRklMRV9SRUYgPSAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIE1hcHBpbmcgRmlsZSBSZWY8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfTUFQUElOR19GSUxFX1JFRl9GRUFUVVJFX0NPVU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlIDxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2UKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0UgPSAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9fVkVSU0lPTiA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9fU0NIRU1BX0xPQ0FUSU9OID0gQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19TQ0hFTUFfTE9DQVRJT047Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUyA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2U8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfRkVBVFVSRV9DT1VOVCA9IENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPn0nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUID0gNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFyZWQgQ2FjaGUgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1NIQVJFRF9DQUNIRV9NT0RFID0gUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9fU0hBUkVEX0NBQ0hFX01PREU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbiBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVkFMSURBVElPTl9NT0RFID0gUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9fVkFMSURBVElPTl9NT0RFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT04gPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3ZpZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRSA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0UgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1hcHBpbmcgRmlsZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVMgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTID0gUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9GRUFUVVJFX0NPVU5UICsgNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTID0gUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9GRUFUVVJFX0NPVU5UICsgNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyA3OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb3BlcnRpZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTID0gUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9GRUFUVVJFX0NPVU5UICsgODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRSA9IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCArIDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEUgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyAxMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdDwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX0ZFQVRVUkVfQ09VTlQgPSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUXzIwX0ZFQVRVUkVfQ09VTlQgKyAxMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXMgPGVtPlhtbCBQcm9wZXJ0aWVzPC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUSUVTID0gNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUSUVTX19QUk9QRVJUSUVTID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5YbWwgUHJvcGVydGllczwvZW0+JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUSUVTX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkgPGVtPlhtbCBQcm9wZXJ0eTwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QUk9QRVJUWSA9IDY7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19OQU1FID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX19WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+WG1sIFByb3BlcnR5PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BST1BFUlRZX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEUgPSA3OwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sSmF2YUNsYXNzUmVmRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbEphckZpbGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sTWFwcGluZ0ZpbGVSZWZFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFByb3BlcnRpZXNFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgeG1sUHJvcGVydHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB4bWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVBhY2thZ2UoKQotCXsKLQkJc3VwZXIoZU5TX1VSSSwgUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0luaXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcywgcmVnaXN0ZXJzLCBhbmQgaW5pdGlhbGl6ZXMgdGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGlzIG1vZGVsLCBhbmQgZm9yIGFueSBvdGhlcnMgdXBvbiB3aGljaCBpdCBkZXBlbmRzLgotCSAqIAotCSAqIDxwPlRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB7QGxpbmsgUGVyc2lzdGVuY2VQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVBhY2thZ2UgaW5pdCgpCi0JewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoUGVyc2lzdGVuY2VQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgUGVyc2lzdGVuY2VQYWNrYWdlKCkpOwotCi0JCWlzSW5pdGVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKLQkJRWNvcmVQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKLQkJWE1MVHlwZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSkgOiBPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCU9ybVYyXzBQYWNrYWdlIHRoZU9ybVYyXzBQYWNrYWdlID0gKE9ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgOiBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIHRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgPSAoUGVyc2lzdGVuY2VWMl8wUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmVOU19VUkkpIDogUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCi0JCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQotCQl0aGVQZXJzaXN0ZW5jZVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZU9ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gTWFyayBtZXRhLWRhdGEgdG8gaW5kaWNhdGUgaXQgY2FuJ3QgYmUgY2hhbmdlZAotCQl0aGVQZXJzaXN0ZW5jZVBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoUGVyc2lzdGVuY2VQYWNrYWdlLmVOU19VUkksIHRoZVBlcnNpc3RlbmNlUGFja2FnZSk7Ci0JCXJldHVybiB0aGVQZXJzaXN0ZW5jZVBhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmIDxlbT5YbWwgSmF2YSBDbGFzcyBSZWY8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIEphdmEgQ2xhc3MgUmVmPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEphdmFDbGFzc1JlZigpCi0JewotCQlyZXR1cm4geG1sSmF2YUNsYXNzUmVmRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZiNnZXRKYXZhQ2xhc3MgPGVtPkphdmEgQ2xhc3M8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZiNnZXRKYXZhQ2xhc3MoKQotCSAqIEBzZWUgI2dldFhtbEphdmFDbGFzc1JlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbEphdmFDbGFzc1JlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmIDxlbT5YbWwgSmFyIEZpbGUgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBKYXIgRmlsZSBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbEphckZpbGVSZWYoKQotCXsKLQkJcmV0dXJuIHhtbEphckZpbGVSZWZFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZiNnZXRGaWxlTmFtZSA8ZW0+RmlsZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmlsZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWYjZ2V0RmlsZU5hbWUoKQotCSAqIEBzZWUgI2dldFhtbEphckZpbGVSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxKYXJGaWxlUmVmX0ZpbGVOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxKYXJGaWxlUmVmRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmIDxlbT5YbWwgTWFwcGluZyBGaWxlIFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgTWFwcGluZyBGaWxlIFJlZjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbE1hcHBpbmdGaWxlUmVmKCkKLQl7Ci0JCXJldHVybiB4bWxNYXBwaW5nRmlsZVJlZkVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZiNnZXRGaWxlTmFtZSA8ZW0+RmlsZSBOYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+RmlsZSBOYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmI2dldEZpbGVOYW1lKCkKLQkgKiBAc2VlICNnZXRYbWxNYXBwaW5nRmlsZVJlZigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbE1hcHBpbmdGaWxlUmVmX0ZpbGVOYW1lKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxNYXBwaW5nRmlsZVJlZkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSA8ZW0+WG1sIFBlcnNpc3RlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlhtbCBQZXJzaXN0ZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFBlcnNpc3RlbmNlKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlI2dldFBlcnNpc3RlbmNlVW5pdHMgPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRQZXJzaXN0ZW5jZVVuaXRzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldFhtbFBlcnNpc3RlbmNlX1BlcnNpc3RlbmNlVW5pdHMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXREZXNjcmlwdGlvbigpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0Rlc2NyaXB0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvdmlkZXIgPGVtPlByb3ZpZGVyPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHJvdmlkZXI8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFByb3ZpZGVyKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvdmlkZXIoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRKdGFEYXRhU291cmNlIDxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5KdGEgRGF0YSBTb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEp0YURhdGFTb3VyY2UoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9KdGFEYXRhU291cmNlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5vbkp0YURhdGFTb3VyY2UoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRNYXBwaW5nRmlsZXMgPGVtPk1hcHBpbmcgRmlsZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPk1hcHBpbmcgRmlsZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE1hcHBpbmdGaWxlcygpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X01hcHBpbmdGaWxlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SmFyRmlsZXMgPGVtPkphciBGaWxlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+SmFyIEZpbGVzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRKYXJGaWxlcygpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0phckZpbGVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRDbGFzc2VzIDxlbT5DbGFzc2VzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5DbGFzc2VzPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRDbGFzc2VzKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpCi0JewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm9wZXJ0aWVzIDxlbT5Qcm9wZXJ0aWVzPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+UHJvcGVydGllczwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvcGVydGllcygpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0TmFtZSgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRUcmFuc2FjdGlvblR5cGUgPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRUcmFuc2FjdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcyA8ZW0+WG1sIFByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcwotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldFhtbFByb3BlcnRpZXMoKQotCXsKLQkJcmV0dXJuIHhtbFByb3BlcnRpZXNFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzI2dldFByb3BlcnRpZXMgPGVtPlByb3BlcnRpZXM8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPlByb3BlcnRpZXM8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydGllcyNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAc2VlICNnZXRYbWxQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0WG1sUHJvcGVydGllc19Qcm9wZXJ0aWVzKCkKLQl7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSl4bWxQcm9wZXJ0aWVzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5IDxlbT5YbWwgUHJvcGVydHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+WG1sIFByb3BlcnR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0WG1sUHJvcGVydHkoKQotCXsKLQkJcmV0dXJuIHhtbFByb3BlcnR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldE5hbWUoKQotCSAqIEBzZWUgI2dldFhtbFByb3BlcnR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUHJvcGVydHlfTmFtZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWx1ZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0WG1sUHJvcGVydHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUHJvcGVydHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VGYWN0b3J5IGdldFBlcnNpc3RlbmNlRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlRmFjdG9yeSlnZXRFRmFjdG9yeUluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gIFRoaXMgbWV0aG9kIGlzCi0JICogZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47Ci0JCWlzQ3JlYXRlZCA9IHRydWU7Ci0KLQkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCi0JCXhtbEphdmFDbGFzc1JlZkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfSkFWQV9DTEFTU19SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEphdmFDbGFzc1JlZkVDbGFzcywgWE1MX0pBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTKTsKLQotCQl4bWxKYXJGaWxlUmVmRUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9KQVJfRklMRV9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbEphckZpbGVSZWZFQ2xhc3MsIFhNTF9KQVJfRklMRV9SRUZfX0ZJTEVfTkFNRSk7Ci0KLQkJeG1sTWFwcGluZ0ZpbGVSZWZFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX01BUFBJTkdfRklMRV9SRUYpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzLCBYTUxfTUFQUElOR19GSUxFX1JFRl9fRklMRV9OQU1FKTsKLQotCQl4bWxQZXJzaXN0ZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBlcnNpc3RlbmNlRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTKTsKLQotCQl4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoWE1MX1BFUlNJU1RFTkNFX1VOSVQpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9WSURFUik7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSlRBX0RBVEFfU09VUkNFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTKTsKLQkJY3JlYXRlRVJlZmVyZW5jZSh4bWxQZXJzaXN0ZW5jZVVuaXRFQ2xhc3MsIFhNTF9QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVMpOwotCQljcmVhdGVFUmVmZXJlbmNlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVMpOwotCQljcmVhdGVFQXR0cmlidXRlKHhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRSk7Ci0KLQkJeG1sUHJvcGVydGllc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUFJPUEVSVElFUyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoeG1sUHJvcGVydGllc0VDbGFzcywgWE1MX1BST1BFUlRJRVNfX1BST1BFUlRJRVMpOwotCi0JCXhtbFByb3BlcnR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFhNTF9QUk9QRVJUWSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fTkFNRSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUHJvcGVydHlFQ2xhc3MsIFhNTF9QUk9QRVJUWV9fVkFMVUUpOwotCi0JCS8vIENyZWF0ZSBlbnVtcwotCQl4bWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKFhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcwotCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCi0JewotCQlpZiAoaXNJbml0aWFsaXplZCkgcmV0dXJuOwotCQlpc0luaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkvLyBJbml0aWFsaXplIHBhY2thZ2UKLQkJc2V0TmFtZShlTkFNRSk7Ci0JCXNldE5zUHJlZml4KGVOU19QUkVGSVgpOwotCQlzZXROc1VSSShlTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3RoZXIgZGVwZW5kZW50IHBhY2thZ2VzCi0JCVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgdGhlUGVyc2lzdGVuY2VWMl8wUGFja2FnZSA9IChQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSk7Ci0JCUVjb3JlUGFja2FnZSB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ29tbW9uUGFja2FnZS5lTlNfVVJJKTsKLQkJWE1MVHlwZVBhY2thZ2UgdGhlWE1MVHlwZVBhY2thZ2UgPSAoWE1MVHlwZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoWE1MVHlwZVBhY2thZ2UuZU5TX1VSSSk7Ci0KLQkJLy8gQWRkIHN1YnBhY2thZ2VzCi0JCWdldEVTdWJwYWNrYWdlcygpLmFkZCh0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKTsKLQotCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCi0KLQkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcwotCQl4bWxQZXJzaXN0ZW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVDb21tb25QYWNrYWdlLmdldEFic3RyYWN0SnBhUm9vdEVPYmplY3QoKSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzAoKSk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxKYXZhQ2xhc3NSZWZFQ2xhc3MsIFhtbEphdmFDbGFzc1JlZi5jbGFzcywgIlhtbEphdmFDbGFzc1JlZiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sSmF2YUNsYXNzUmVmX0phdmFDbGFzcygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiamF2YUNsYXNzIiwgIiIsIDAsIDEsIFhtbEphdmFDbGFzc1JlZi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgIUlTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sSmFyRmlsZVJlZkVDbGFzcywgWG1sSmFyRmlsZVJlZi5jbGFzcywgIlhtbEphckZpbGVSZWYiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbEphckZpbGVSZWZfRmlsZU5hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImZpbGVOYW1lIiwgIiIsIDAsIDEsIFhtbEphckZpbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbE1hcHBpbmdGaWxlUmVmRUNsYXNzLCBYbWxNYXBwaW5nRmlsZVJlZi5jbGFzcywgIlhtbE1hcHBpbmdGaWxlUmVmIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxNYXBwaW5nRmlsZVJlZl9GaWxlTmFtZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiZmlsZU5hbWUiLCAiIiwgMCwgMSwgWG1sTWFwcGluZ0ZpbGVSZWYuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsICFJU19PUkRFUkVEKTsKLQotCQlpbml0RUNsYXNzKHhtbFBlcnNpc3RlbmNlRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZS5jbGFzcywgIlhtbFBlcnNpc3RlbmNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQZXJzaXN0ZW5jZV9QZXJzaXN0ZW5jZVVuaXRzKCksIHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCksIG51bGwsICJwZXJzaXN0ZW5jZVVuaXRzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUGVyc2lzdGVuY2VVbml0RUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9EZXNjcmlwdGlvbigpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAicHJvdmlkZXIiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSnRhRGF0YVNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgImp0YURhdGFTb3VyY2UiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTm9uSnRhRGF0YVNvdXJjZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5vbkp0YURhdGFTb3VyY2UiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTWFwcGluZ0ZpbGVzKCksIHRoaXMuZ2V0WG1sTWFwcGluZ0ZpbGVSZWYoKSwgbnVsbCwgIm1hcHBpbmdGaWxlcyIsIG51bGwsIDAsIC0xLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpLCB0aGlzLmdldFhtbEphckZpbGVSZWYoKSwgbnVsbCwgImphckZpbGVzIiwgbnVsbCwgMCwgLTEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0NsYXNzZXMoKSwgdGhpcy5nZXRYbWxKYXZhQ2xhc3NSZWYoKSwgbnVsbCwgImNsYXNzZXMiLCBudWxsLCAwLCAtMSwgWG1sUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRCb29sZWFuT2JqZWN0KCksICJleGNsdWRlVW5saXN0ZWRDbGFzc2VzIiwgbnVsbCwgMCwgMSwgWG1sUGVyc2lzdGVuY2VVbml0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RVJlZmVyZW5jZShnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpLCB0aGlzLmdldFhtbFByb3BlcnRpZXMoKSwgbnVsbCwgInByb3BlcnRpZXMiLCBudWxsLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9OYW1lKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAibmFtZSIsIG51bGwsIDEsIDEsIFhtbFBlcnNpc3RlbmNlVW5pdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKSwgdGhpcy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKSwgInRyYW5zYWN0aW9uVHlwZSIsICJKVEEiLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCi0JCWluaXRFQ2xhc3MoeG1sUHJvcGVydGllc0VDbGFzcywgWG1sUHJvcGVydGllcy5jbGFzcywgIlhtbFByb3BlcnRpZXMiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFUmVmZXJlbmNlKGdldFhtbFByb3BlcnRpZXNfUHJvcGVydGllcygpLCB0aGlzLmdldFhtbFByb3BlcnR5KCksIG51bGwsICJwcm9wZXJ0aWVzIiwgbnVsbCwgMCwgLTEsIFhtbFByb3BlcnRpZXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJaW5pdEVDbGFzcyh4bWxQcm9wZXJ0eUVDbGFzcywgWG1sUHJvcGVydHkuY2xhc3MsICJYbWxQcm9wZXJ0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUHJvcGVydHlfTmFtZSgpLCB0aGVYTUxUeXBlUGFja2FnZS5nZXRTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAxLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFByb3BlcnR5X1ZhbHVlKCksIHRoZVhNTFR5cGVQYWNrYWdlLmdldFN0cmluZygpLCAidmFsdWUiLCBudWxsLCAxLCAxLCBYbWxQcm9wZXJ0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBlbnVtcyBhbmQgYWRkIGVudW0gbGl0ZXJhbHMKLQkJaW5pdEVFbnVtKHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUiKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZUVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKLQkgKiA8dWw+Ci0JICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0JICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLQkgKiA8L3VsPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50ZXJmYWNlIExpdGVyYWxzCi0JewotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYgPGVtPlhtbCBKYXZhIENsYXNzIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbEphdmFDbGFzc1JlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9KQVZBX0NMQVNTX1JFRiA9IGVJTlNUQU5DRS5nZXRYbWxKYXZhQ2xhc3NSZWYoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphdmEgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUyA9IGVJTlNUQU5DRS5nZXRYbWxKYXZhQ2xhc3NSZWZfSmF2YUNsYXNzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmFyRmlsZVJlZiA8ZW0+WG1sIEphciBGaWxlIFJlZjwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXJGaWxlUmVmKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX0pBUl9GSUxFX1JFRiA9IGVJTlNUQU5DRS5nZXRYbWxKYXJGaWxlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9KQVJfRklMRV9SRUZfX0ZJTEVfTkFNRSA9IGVJTlNUQU5DRS5nZXRYbWxKYXJGaWxlUmVmX0ZpbGVOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYgPGVtPlhtbCBNYXBwaW5nIEZpbGUgUmVmPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxNYXBwaW5nRmlsZVJlZigpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9NQVBQSU5HX0ZJTEVfUkVGID0gZUlOU1RBTkNFLmdldFhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxlIE5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSA8ZW0+WG1sIFBlcnNpc3RlbmNlPC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGVyc2lzdGVuY2UgVW5pdHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVSZWZlcmVuY2UgWE1MX1BFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZV9QZXJzaXN0ZW5jZVVuaXRzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0IDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QRVJTSVNURU5DRV9VTklUID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRGVzY3JpcHRpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlByb3ZpZGVyPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5KdGEgRGF0YSBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0UgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0p0YURhdGFTb3VyY2UoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXBwaW5nIEZpbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFUmVmZXJlbmNlIFhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9NYXBwaW5nRmlsZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9KYXJGaWxlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q2xhc3NlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9FeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9UcmFuc2FjdGlvblR5cGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzIDxlbT5YbWwgUHJvcGVydGllczwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0aWVzCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0aWVzKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BST1BFUlRJRVMgPSBlSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydGllcygpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvcGVydGllczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRVJlZmVyZW5jZSBYTUxfUFJPUEVSVElFU19fUFJPUEVSVElFUyA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eSA8ZW0+WG1sIFByb3BlcnR5PC9lbT59JyBjbGFzcy4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0eSgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIFhNTF9QUk9QRVJUWSA9IGVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgWE1MX1BST1BFUlRZX19OQU1FID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X05hbWUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUFJPUEVSVFlfX1ZBTFVFID0gZUlOU1RBTkNFLmdldFhtbFByb3BlcnR5X1ZhbHVlKCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBUcmFuc2FjdGlvbiBUeXBlPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9QRVJTSVNURU5DRV9VTklUX1RSQU5TQUNUSU9OX1RZUEUgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCk7Ci0KLQl9Ci0KLX0gLy9QZXJzaXN0ZW5jZVBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFJlc291cmNlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDEwZGJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlRmFjdG9yeSBleHRlbmRzIFRyYW5zbGF0b3JSZXNvdXJjZUZhY3RvcnkKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWxSZXNvdXJjZUZhY3RvcnkoKSB7Ci0JCXRoaXMoUmVuZGVyZXJGYWN0b3J5LmdldERlZmF1bHRSZW5kZXJlckZhY3RvcnkoKSk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFJlc291cmNlRmFjdG9yeShSZW5kZXJlckZhY3RvcnkgYVJlbmRlcmVyRmFjdG9yeSkgewotCQlzdXBlcihhUmVuZGVyZXJGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VGYWN0b3J5KFJlbmRlcmVyRmFjdG9yeSBhUmVuZGVyZXJGYWN0b3J5LCBib29sZWFuIGxpc3RlbmluZ0ZvclVwZGF0ZXMpIHsKLQkJc3VwZXIoYVJlbmRlcmVyRmFjdG9yeSwgbGlzdGVuaW5nRm9yVXBkYXRlcyk7Ci0JfQotCQotCQotCS8qKgotCSAqIEBzZWUgVHJhbnNsYXRvclJlc291cmNlRmFjdG9yeSNjcmVhdGVSZXNvdXJjZShVUkksIFJlbmRlcmVyKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmFuc2xhdG9yUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSwgUmVuZGVyZXIgcmVuZGVyZXIpIHsKLQkJcmV0dXJuIG5ldyBKcGFYbWxSZXNvdXJjZSh1cmksIHJlbmRlcmVyLCBKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUsIFhtbFBlcnNpc3RlbmNlLmdldFJvb3RUcmFuc2xhdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphckZpbGVSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphckZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYyYTIyZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxKYXJGaWxlUmVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS50cmFuc2xhdG9ycy5TaW1wbGVUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlhtbCBKYXIgRmlsZSBSZWY8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphckZpbGVSZWYjZ2V0RmlsZU5hbWUgPGVtPkZpbGUgTmFtZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXJGaWxlUmVmKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbEphckZpbGVSZWYgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbGVOYW1lKCkgPGVtPkZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRV9FREVGQVVMVCA9ICIiOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RmlsZU5hbWUoKSA8ZW0+RmlsZSBOYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRGaWxlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZSA9IEZJTEVfTkFNRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKYXJGaWxlUmVmKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5MaXRlcmFscy5YTUxfSkFSX0ZJTEVfUkVGOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sSmFyRmlsZVJlZl9GaWxlTmFtZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IiIgdW5pcXVlPSJmYWxzZSIgb3JkZXJlZD0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKQotCXsKLQkJcmV0dXJuIGZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmI2dldEZpbGVOYW1lIDxlbT5GaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RmlsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZShTdHJpbmcgbmV3RmlsZU5hbWUpCi0JewotCQlTdHJpbmcgb2xkRmlsZU5hbWUgPSBmaWxlTmFtZTsKLQkJZmlsZU5hbWUgPSBuZXdGaWxlTmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVJfRklMRV9SRUZfX0ZJTEVfTkFNRSwgb2xkRmlsZU5hbWUsIGZpbGVOYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFSX0ZJTEVfUkVGX19GSUxFX05BTUU6Ci0JCQkJcmV0dXJuIGdldEZpbGVOYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBUl9GSUxFX1JFRl9fRklMRV9OQU1FOgotCQkJCXNldEZpbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVJfRklMRV9SRUZfX0ZJTEVfTkFNRToKLQkJCQlzZXRGaWxlTmFtZShGSUxFX05BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFSX0ZJTEVfUkVGX19GSUxFX05BTUU6Ci0JCQkJcmV0dXJuIEZJTEVfTkFNRV9FREVGQVVMVCA9PSBudWxsID8gZmlsZU5hbWUgIT0gbnVsbCA6ICFGSUxFX05BTUVfRURFRkFVTFQuZXF1YWxzKGZpbGVOYW1lKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0JewotCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoZmlsZU5hbWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGZpbGVOYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuICghIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5maWxlTmFtZSkpID8KLQkJCWdldFRleHRUZXh0UmFuZ2UoKSA6Ci0JCQlzdXBlci5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJCWVsZW1lbnROYW1lLAotCQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlidWlsZEZpbGVOYW1lVHJhbnNsYXRvcigpLAotCQkJfTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkRmlsZU5hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoCi0JCQkJVHJhbnNsYXRvci5URVhUX0FUVFJJQlVURV9WQUxVRSwKLQkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEphckZpbGVSZWZfRmlsZU5hbWUoKQotCQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVwbGFjZUZvbGRlckVkaXQoSUZvbGRlciBvcmlnaW5hbEZvbGRlciwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSURPTU5vZGUgZG9tTm9kZSA9IGdldFRleHROb2RlKCk7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbEZvbGRlci5nZXROYW1lKCk7Ci0JCWludCBuYW1lSW5kZXggPSB0aGlzLmZpbGVOYW1lLmluZGV4T2Yob3JpZ2luYWxOYW1lKTsKLQotCQlpbnQgb2Zmc2V0ID0gZG9tTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlyZXR1cm4gbmV3IFJlcGxhY2VFZGl0KG9mZnNldCArIG5hbWVJbmRleCwgb3JpZ2luYWxOYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxKYXZhQ2xhc3NSZWYuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphdmFDbGFzc1JlZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2EwODgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbEphdmFDbGFzc1JlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SmF2YSBDbGFzcyBSZWY8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWYjZ2V0SmF2YUNsYXNzIDxlbT5KYXZhIENsYXNzPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbEphdmFDbGFzc1JlZigpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxKYXZhQ2xhc3NSZWYgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFDbGFzcygpIDxlbT5KYXZhIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfQ0xBU1NfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEphdmFDbGFzcygpIDxlbT5KYXZhIENsYXNzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKYXZhQ2xhc3MoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgamF2YUNsYXNzID0gSkFWQV9DTEFTU19FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxKYXZhQ2xhc3NSZWYoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLlhNTF9KQVZBX0NMQVNTX1JFRjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5KYXZhIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+IiI8L2NvZGU+LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5KYXZhIENsYXNzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRKYXZhQ2xhc3MoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxKYXZhQ2xhc3NSZWZfSmF2YUNsYXNzKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iIiB1bmlxdWU9ImZhbHNlIiBvcmRlcmVkPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQ2xhc3MoKQotCXsKLQkJcmV0dXJuIGphdmFDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmI2dldEphdmFDbGFzcyA8ZW0+SmF2YSBDbGFzczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SmF2YSBDbGFzczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0SmF2YUNsYXNzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SmF2YUNsYXNzKFN0cmluZyBuZXdKYXZhQ2xhc3MpCi0JewotCQlTdHJpbmcgb2xkSmF2YUNsYXNzID0gamF2YUNsYXNzOwotCQlqYXZhQ2xhc3MgPSBuZXdKYXZhQ2xhc3M7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1MsIG9sZEphdmFDbGFzcywgamF2YUNsYXNzKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfSkFWQV9DTEFTU19SRUZfX0pBVkFfQ0xBU1M6Ci0JCQkJcmV0dXJuIGdldEphdmFDbGFzcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9KQVZBX0NMQVNTX1JFRl9fSkFWQV9DTEFTUzoKLQkJCQlzZXRKYXZhQ2xhc3MoKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTOgotCQkJCXNldEphdmFDbGFzcyhKQVZBX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX0pBVkFfQ0xBU1NfUkVGX19KQVZBX0NMQVNTOgotCQkJCXJldHVybiBKQVZBX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBqYXZhQ2xhc3MgIT0gbnVsbCA6ICFKQVZBX0NMQVNTX0VERUZBVUxULmVxdWFscyhqYXZhQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChqYXZhQ2xhc3M6ICIpOwotCQlyZXN1bHQuYXBwZW5kKGphdmFDbGFzcyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcigKLQkJCQllbGVtZW50TmFtZSwKLQkJCQlzdHJ1Y3R1cmFsRmVhdHVyZSwKLQkJCQlUcmFuc2xhdG9yLkVORF9UQUdfTk9fSU5ERU5ULAotCQkJCWJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkKLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJYnVpbGRDbGFzc05hbWVUcmFuc2xhdG9yKCksCi0JCQl9OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRDbGFzc05hbWVUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoCi0JCQkJVHJhbnNsYXRvci5URVhUX0FUVFJJQlVURV9WQUxVRSwKLQkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbEphdmFDbGFzc1JlZl9KYXZhQ2xhc3MoKQotCQkJKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKioqIHJlZmFjdG9yaW5nICoqKioqKioqKioqCi0KLQlwdWJsaWMgUmVwbGFjZUVkaXQgY3JlYXRlUmVuYW1lRWRpdChJVHlwZSBvcmlnaW5hbFR5cGUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbFR5cGUuZ2V0VHlwZVF1YWxpZmllZE5hbWUoKTsKLQkJaW50IG5hbWVJbmRleCA9IHRoaXMuamF2YUNsYXNzLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0JCWludCBvZmZzZXQgPSBnZXRUZXh0Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVQYWNrYWdlRWRpdChTdHJpbmcgbmV3TmFtZSkgewotCQlpbnQgcGFja2FnZUxlbmd0aCA9IHRoaXMuamF2YUNsYXNzLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWludCBvZmZzZXQgPSBnZXRUZXh0Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxNYXBwaW5nRmlsZVJlZi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sTWFwcGluZ0ZpbGVSZWYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0NzBkNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxNYXBwaW5nRmlsZVJlZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk1hcHBpbmcgRmlsZSBSZWY8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZiNnZXRGaWxlTmFtZSA8ZW0+RmlsZSBOYW1lPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbE1hcHBpbmdGaWxlUmVmKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbE1hcHBpbmdGaWxlUmVmIGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRGaWxlTmFtZSgpIDxlbT5GaWxlIE5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldEZpbGVOYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05BTUVfRURFRkFVTFQgPSAiIjsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEZpbGVOYW1lKCkgPGVtPkZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0RmlsZU5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZmlsZU5hbWUgPSBGSUxFX05BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sTWFwcGluZ0ZpbGVSZWYoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLlhNTF9NQVBQSU5HX0ZJTEVfUkVGOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbGUgTmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiIiPC9jb2RlPi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGUgTmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxlIE5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldEZpbGVOYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKQotCSAqIEBtb2RlbCBkZWZhdWx0PSIiIHVuaXF1ZT0iZmFsc2UiIG9yZGVyZWQ9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkKLQl7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWYjZ2V0RmlsZU5hbWUgPGVtPkZpbGUgTmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RmlsZSBOYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRGaWxlTmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbGVOYW1lKFN0cmluZyBuZXdGaWxlTmFtZSkKLQl7Ci0JCVN0cmluZyBvbGRGaWxlTmFtZSA9IGZpbGVOYW1lOwotCQlmaWxlTmFtZSA9IG5ld0ZpbGVOYW1lOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRSwgb2xkRmlsZU5hbWUsIGZpbGVOYW1lKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIEVMaXN0PEFkYXB0ZXI+IGVBZGFwdGVycygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gc3VwZXIuZUFkYXB0ZXJzKCk7Ci0JfQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRToKLQkJCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfTUFQUElOR19GSUxFX1JFRl9fRklMRV9OQU1FOgotCQkJCXNldEZpbGVOYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9NQVBQSU5HX0ZJTEVfUkVGX19GSUxFX05BTUU6Ci0JCQkJc2V0RmlsZU5hbWUoRklMRV9OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX01BUFBJTkdfRklMRV9SRUZfX0ZJTEVfTkFNRToKLQkJCQlyZXR1cm4gRklMRV9OQU1FX0VERUZBVUxUID09IG51bGwgPyBmaWxlTmFtZSAhPSBudWxsIDogIUZJTEVfTkFNRV9FREVGQVVMVC5lcXVhbHMoZmlsZU5hbWUpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChmaWxlTmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoZmlsZU5hbWUpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoCi0JCQkJZWxlbWVudE5hbWUsCi0JCQkJc3RydWN0dXJhbEZlYXR1cmUsCi0JCQkJVHJhbnNsYXRvci5FTkRfVEFHX05PX0lOREVOVCwKLQkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpCi0JCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3JbXSBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yW10gewotCQkJCWJ1aWxkRmlsZU5hbWVUcmFuc2xhdG9yKCksCi0JCQl9OwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRGaWxlTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcigKLQkJCQlUcmFuc2xhdG9yLlRFWFRfQVRUUklCVVRFX1ZBTFVFLAotCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sTWFwcGluZ0ZpbGVSZWZfRmlsZU5hbWUoKQotCQkJKTsKLQl9Ci0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVFZGl0KElGaWxlIG9yaWdpbmFsRmlsZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSURPTU5vZGUgZG9tTm9kZSA9IGdldFRleHROb2RlKCk7Ci0JCVN0cmluZyBvcmlnaW5hbE5hbWUgPSBvcmlnaW5hbEZpbGUuZ2V0TmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5maWxlTmFtZS5sYXN0SW5kZXhPZihvcmlnaW5hbE5hbWUpOwotCi0JCWludCBvZmZzZXQgPSBkb21Ob2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0ICsgbmFtZUluZGV4LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVSZW5hbWVGb2xkZXJFZGl0KElGb2xkZXIgb3JpZ2luYWxGb2xkZXIsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCUlET01Ob2RlIGRvbU5vZGUgPSBnZXRUZXh0Tm9kZSgpOwotCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gb3JpZ2luYWxGb2xkZXIuZ2V0TmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gdGhpcy5maWxlTmFtZS5pbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0KLQkJaW50IG9mZnNldCA9IGRvbU5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZU1vdmVFZGl0KElGaWxlIG9yaWdpbmFsRmlsZSwgSVBhdGggZGVzdGluYXRpb24pIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsRmlsZS5nZXROYW1lKCk7Ci0JCWludCBuYW1lSW5kZXggPSB0aGlzLmZpbGVOYW1lLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0KLQkJaW50IG9mZnNldCA9IGdldFRleHROb2RlKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQsIG5hbWVJbmRleCAtIDEsIGRlc3RpbmF0aW9uLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBSZXBsYWNlRWRpdCBjcmVhdGVNb3ZlRWRpdChJUGF0aCBvcmlnaW5hbExvY2F0aW9uLCBJUGF0aCBkZXN0aW5hdGlvbikgewotCQlTdHJpbmcgb3JpZ2luYWxOYW1lID0gb3JpZ2luYWxMb2NhdGlvbi50b1N0cmluZygpOwotCi0JCWludCBvZmZzZXQgPSBnZXRUZXh0Tm9kZSgpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBvcmlnaW5hbE5hbWUubGVuZ3RoKCksIGRlc3RpbmF0aW9uLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjE1OTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVJvb3RUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sUGVyc2lzdGVuY2U8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZSNnZXRQZXJzaXN0ZW5jZVVuaXRzIDxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZSgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxQZXJzaXN0ZW5jZSBleHRlbmRzIEFic3RyYWN0SnBhUm9vdEVPYmplY3QKLXsKLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQZXJzaXN0ZW5jZVVuaXRzKCkgPGVtPlBlcnNpc3RlbmNlIFVuaXRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFBlcnNpc3RlbmNlVW5pdHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQZXJzaXN0ZW5jZVVuaXQ+IHBlcnNpc3RlbmNlVW5pdHM7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2UoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgZUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHN1cGVyLmVDb250YWluZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZUJhc2ljU2V0Q29udGFpbmVyKEludGVybmFsRU9iamVjdCBuZXdDb250YWluZXIsIGludCBuZXdDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJc3VwZXIuZUJhc2ljU2V0Q29udGFpbmVyKG5ld0NvbnRhaW5lciwgbmV3Q29udGFpbmVyRmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLlhNTF9QRVJTSVNURU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QZXJzaXN0ZW5jZSBVbml0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXR9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+WG1sUGVyc2lzdGVuY2UgVW5pdHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QZXJzaXN0ZW5jZSBVbml0czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpCi0JICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCkKLQl7Ci0JCWlmIChwZXJzaXN0ZW5jZVVuaXRzID09IG51bGwpCi0JCXsKLQkJCXBlcnNpc3RlbmNlVW5pdHMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PihYbWxQZXJzaXN0ZW5jZVVuaXQuY2xhc3MsIHRoaXMsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTKTsKLQkJfQotCQlyZXR1cm4gcGVyc2lzdGVuY2VVbml0czsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9fUEVSU0lTVEVOQ0VfVU5JVFM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQZXJzaXN0ZW5jZVVuaXRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgotCQkJCXJldHVybiBnZXRQZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX19QRVJTSVNURU5DRV9VTklUUzoKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRzKCkuY2xlYXIoKTsKLQkJCQlnZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxQZXJzaXN0ZW5jZVVuaXQ+KW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgotCQkJCWdldFBlcnNpc3RlbmNlVW5pdHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfX1BFUlNJU1RFTkNFX1VOSVRTOgotCQkJCXJldHVybiBwZXJzaXN0ZW5jZVVuaXRzICE9IG51bGwgJiYgIXBlcnNpc3RlbmNlVW5pdHMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2ZXJzaW9uIC0+IHNjaGVtYSBsb2NhdGlvbiBtYXBwaW5nICoqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5hbWVzcGFjZSA9IEpQQS5TQ0hFTUFfTkFNRVNQQUNFOwotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMgPSBidWlsZFZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMoKTsKLQkKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGJ1aWxkVmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucygpIHsKLQkJTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJbWFwLnB1dChKUEEuU0NIRU1BX1ZFUlNJT04sIEpQQS5TQ0hFTUFfTE9DQVRJT04pOwotCQltYXAucHV0KEpQQTJfMC5TQ0hFTUFfVkVSU0lPTiwgSlBBMl8wLlNDSEVNQV9MT0NBVElPTik7Ci0JCXJldHVybiBtYXA7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zLmdldCh2ZXJzaW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhbnNsYXRvciBST09UX1RSQU5TTEFUT1IgPSBidWlsZFJvb3RUcmFuc2xhdG9yKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gUk9PVF9UUkFOU0xBVE9SOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUm9vdFRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUm9vdFRyYW5zbGF0b3IoCi0JCQkJSlBBLlBFUlNJU1RFTkNFLAotCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2UoKSwKLQkJCQlidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgVHJhbnNsYXRvcltdIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJYnVpbGRWZXJzaW9uVHJhbnNsYXRvcih2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKSwKLQkJCQlidWlsZE5hbWVzcGFjZVRyYW5zbGF0b3IobmFtZXNwYWNlKSwKLQkJCQlidWlsZFNjaGVtYU5hbWVzcGFjZVRyYW5zbGF0b3IoKSwKLQkJCQlidWlsZFNjaGVtYUxvY2F0aW9uVHJhbnNsYXRvcihuYW1lc3BhY2UsIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMpLAotCQkJCVhtbFBlcnNpc3RlbmNlVW5pdC5idWlsZFRyYW5zbGF0b3IoSlBBLlBFUlNJU1RFTkNFX1VOSVQsIFBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VfUGVyc2lzdGVuY2VVbml0cygpKQotCQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQZXJzaXN0ZW5jZVVuaXQuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTliMzJkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLkJvb2xlYW5UcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Vbml0PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldERlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRQcm92aWRlciA8ZW0+UHJvdmlkZXI8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0SnRhRGF0YVNvdXJjZSA8ZW0+SnRhIERhdGEgU291cmNlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5vbkp0YURhdGFTb3VyY2UgPGVtPk5vbiBKdGEgRGF0YSBTb3VyY2U8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0TWFwcGluZ0ZpbGVzIDxlbT5NYXBwaW5nIEZpbGVzPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEphckZpbGVzIDxlbT5KYXIgRmlsZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Q2xhc3NlcyA8ZW0+Q2xhc3NlczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzIDxlbT5FeGNsdWRlIFVubGlzdGVkIENsYXNzZXM8L2VtPn08L2xpPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgWG1sUGVyc2lzdGVuY2VVbml0IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgWG1sUGVyc2lzdGVuY2VVbml0XzJfMAotewotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBTSEFSRURfQ0FDSEVfTU9ERV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTaGFyZWRDYWNoZU1vZGUoKSA8ZW0+U2hhcmVkIENhY2hlIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFNoYXJlZENhY2hlTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBzaGFyZWRDYWNoZU1vZGUgPSBTSEFSRURfQ0FDSEVfTU9ERV9FREVGQVVMVDsKLQotCS8qKgotCSAqIGNoYW5nZWQgdGhpcyB0byBudWxsIGFuZCByZW1vdmVkIHRoZSBnZW5lcmF0ZWQgZmxhZyBzbyBlbWYgd29uJ3QgZ2VuZXJhdGUgb3ZlciBpdAotCSAqIHdlIGRvbid0IHdhbnQgYSBkZWZhdWx0IGZvciBlbnVtcywganVzdCBudWxsIGlmIHRoZSB0YWcgZG9lcyBub3QgZXhpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgVkFMSURBVElPTl9NT0RFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbGlkYXRpb25Nb2RlKCkgPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmFsaWRhdGlvbk1vZGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIHZhbGlkYXRpb25Nb2RlID0gVkFMSURBVElPTl9NT0RFX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXREZXNjcmlwdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVzY3JpcHRpb24oKSA8ZW0+RGVzY3JpcHRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvdmlkZXIoKSA8ZW0+UHJvdmlkZXI8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3ZpZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm92aWRlcigpIDxlbT5Qcm92aWRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0UHJvdmlkZXIoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHJvdmlkZXIgPSBQUk9WSURFUl9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKdGFEYXRhU291cmNlKCkgPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SnRhRGF0YVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlRBX0RBVEFfU09VUkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEp0YURhdGFTb3VyY2UoKSA8ZW0+SnRhIERhdGEgU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRKdGFEYXRhU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGp0YURhdGFTb3VyY2UgPSBKVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpIDxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROb25KdGFEYXRhU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOT05fSlRBX0RBVEFfU09VUkNFX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5vbkp0YURhdGFTb3VyY2UoKSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBub25KdGFEYXRhU291cmNlID0gTk9OX0pUQV9EQVRBX1NPVVJDRV9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1hcHBpbmdGaWxlcygpIDxlbT5NYXBwaW5nIEZpbGVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE1hcHBpbmdGaWxlcygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0PFhtbE1hcHBpbmdGaWxlUmVmPiBtYXBwaW5nRmlsZXM7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRKYXJGaWxlcygpIDxlbT5KYXIgRmlsZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0SmFyRmlsZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxKYXJGaWxlUmVmPiBqYXJGaWxlczsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENsYXNzZXMoKSA8ZW0+Q2xhc3NlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3Q8WG1sSmF2YUNsYXNzUmVmPiBjbGFzc2VzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSA8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQm9vbGVhbiBleGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRQcm9wZXJ0aWVzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0TmFtZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBjaGFuZ2VkIHRoaXMgdG8gbnVsbCBhbmQgcmVtb3ZlZCB0aGUgZ2VuZXJhdGVkIGZsYWcgc28gZW1mIHdvbid0IGdlbmVyYXRlIG92ZXIgaXQKLQkgKiB3ZSBkb24ndCB3YW50IGEgZGVmYXVsdCBmb3IgZW51bXMsIGp1c3QgbnVsbCBpZiB0aGUgdGFnIGRvZXMgbm90IGV4aXN0Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgVFJBTlNBQ1RJT05fVFlQRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUcmFuc2FjdGlvblR5cGUoKSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHRyYW5zYWN0aW9uVHlwZSA9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUGVyc2lzdGVuY2VVbml0KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5MaXRlcmFscy5YTUxfUEVSU0lTVEVOQ0VfVU5JVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFyZWQgQ2FjaGUgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJVTlNQRUNJRklFRCI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKLQkgKiBAc2VlICNzZXRTaGFyZWRDYWNoZU1vZGUoWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wX1NoYXJlZENhY2hlTW9kZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IlVOU1BFQ0lGSUVEIiB1bmlxdWU9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIGdldFNoYXJlZENhY2hlTW9kZSgpCi0JewotCQlyZXR1cm4gc2hhcmVkQ2FjaGVNb2RlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0U2hhcmVkQ2FjaGVNb2RlIDxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2hhcmVkIENhY2hlIE1vZGU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wCi0JICogQHNlZSAjZ2V0U2hhcmVkQ2FjaGVNb2RlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hhcmVkQ2FjaGVNb2RlKFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBuZXdTaGFyZWRDYWNoZU1vZGUpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgb2xkU2hhcmVkQ2FjaGVNb2RlID0gc2hhcmVkQ2FjaGVNb2RlOwotCQlzaGFyZWRDYWNoZU1vZGUgPSBuZXdTaGFyZWRDYWNoZU1vZGUgPT0gbnVsbCA/IFNIQVJFRF9DQUNIRV9NT0RFX0VERUZBVUxUIDogbmV3U2hhcmVkQ2FjaGVNb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1NIQVJFRF9DQUNIRV9NT0RFLCBvbGRTaGFyZWRDYWNoZU1vZGUsIHNoYXJlZENhY2hlTW9kZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbGlkYXRpb24gTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJBVVRPIjwvY29kZT4uCi0JICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKLQkgKiBAc2VlICNzZXRWYWxpZGF0aW9uTW9kZShYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wX1ZhbGlkYXRpb25Nb2RlKCkKLQkgKiBAbW9kZWwgZGVmYXVsdD0iQVVUTyIgdW5pcXVlPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0VmFsaWRhdGlvbk1vZGUoKQotCXsKLQkJcmV0dXJuIHZhbGlkYXRpb25Nb2RlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0VmFsaWRhdGlvbk1vZGUgPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKLQkgKiBAc2VlICNnZXRWYWxpZGF0aW9uTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25Nb2RlKFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgbmV3VmFsaWRhdGlvbk1vZGUpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIG9sZFZhbGlkYXRpb25Nb2RlID0gdmFsaWRhdGlvbk1vZGU7Ci0JCXZhbGlkYXRpb25Nb2RlID0gbmV3VmFsaWRhdGlvbk1vZGUgPT0gbnVsbCA/IFZBTElEQVRJT05fTU9ERV9FREVGQVVMVCA6IG5ld1ZhbGlkYXRpb25Nb2RlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1ZBTElEQVRJT05fTU9ERSwgb2xkVmFsaWRhdGlvbk1vZGUsIHZhbGlkYXRpb25Nb2RlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROYW1lKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05hbWUoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJKVEEiPC9jb2RlPi4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRyYW5zYWN0aW9uIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjc2V0VHJhbnNhY3Rpb25UeXBlKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkpUQSIgdW5pcXVlPSJmYWxzZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRUcmFuc2FjdGlvblR5cGUoKQotCXsKLQkJcmV0dXJuIHRyYW5zYWN0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFRyYW5zYWN0aW9uVHlwZSA8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNhY3Rpb24gVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlCi0JICogQHNlZSAjZ2V0VHJhbnNhY3Rpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHJhbnNhY3Rpb25UeXBlKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBuZXdUcmFuc2FjdGlvblR5cGUpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgb2xkVHJhbnNhY3Rpb25UeXBlID0gdHJhbnNhY3Rpb25UeXBlOwotCQl0cmFuc2FjdGlvblR5cGUgPSBuZXdUcmFuc2FjdGlvblR5cGUgPT0gbnVsbCA/IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQgOiBuZXdUcmFuc2FjdGlvblR5cGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRSwgb2xkVHJhbnNhY3Rpb25UeXBlLCB0cmFuc2FjdGlvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0Rlc2NyaXB0aW9uKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotCXsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0RGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5EZXNjcmlwdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVzY3JpcHRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgbmV3RGVzY3JpcHRpb24pCi0JewotCQlTdHJpbmcgb2xkRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBuZXdEZXNjcmlwdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTiwgb2xkRGVzY3JpcHRpb24sIGRlc2NyaXB0aW9uKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UHJvdmlkZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb3ZpZGVyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3ZpZGVyPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRQcm92aWRlcihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm92aWRlcigpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyKCkKLQl7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldFByb3ZpZGVyIDxlbT5Qcm92aWRlcjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvdmlkZXI8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFByb3ZpZGVyKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIG5ld1Byb3ZpZGVyKQotCXsKLQkJU3RyaW5nIG9sZFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JCXByb3ZpZGVyID0gbmV3UHJvdmlkZXI7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVIsIG9sZFByb3ZpZGVyLCBwcm92aWRlcikpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SnRhIERhdGEgU291cmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0SnRhRGF0YVNvdXJjZShTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdF9KdGFEYXRhU291cmNlKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SnRhRGF0YVNvdXJjZSgpCi0JewotCQlyZXR1cm4ganRhRGF0YVNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEp0YURhdGFTb3VyY2UgPGVtPkp0YSBEYXRhIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SnRhIERhdGEgU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRKdGFEYXRhU291cmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0SnRhRGF0YVNvdXJjZShTdHJpbmcgbmV3SnRhRGF0YVNvdXJjZSkKLQl7Ci0JCVN0cmluZyBvbGRKdGFEYXRhU291cmNlID0ganRhRGF0YVNvdXJjZTsKLQkJanRhRGF0YVNvdXJjZSA9IG5ld0p0YURhdGFTb3VyY2U7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSlRBX0RBVEFfU09VUkNFLCBvbGRKdGFEYXRhU291cmNlLCBqdGFEYXRhU291cmNlKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob24gSnRhIERhdGEgU291cmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXROb25KdGFEYXRhU291cmNlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X05vbkp0YURhdGFTb3VyY2UoKQotCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBkYXRhVHlwZT0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtbC50eXBlLlN0cmluZyIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb25KdGFEYXRhU291cmNlKCkKLQl7Ci0JCXJldHVybiBub25KdGFEYXRhU291cmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0Tm9uSnRhRGF0YVNvdXJjZSA8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Tm9uIEp0YSBEYXRhIFNvdXJjZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vbkp0YURhdGFTb3VyY2UoU3RyaW5nIG5ld05vbkp0YURhdGFTb3VyY2UpCi0JewotCQlTdHJpbmcgb2xkTm9uSnRhRGF0YVNvdXJjZSA9IG5vbkp0YURhdGFTb3VyY2U7Ci0JCW5vbkp0YURhdGFTb3VyY2UgPSBuZXdOb25KdGFEYXRhU291cmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0UsIG9sZE5vbkp0YURhdGFTb3VyY2UsIG5vbkp0YURhdGFTb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXBwaW5nIEZpbGVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1hcHBpbmcgRmlsZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXBwaW5nIEZpbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfTWFwcGluZ0ZpbGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxNYXBwaW5nRmlsZVJlZj4gZ2V0TWFwcGluZ0ZpbGVzKCkKLQl7Ci0JCWlmIChtYXBwaW5nRmlsZXMgPT0gbnVsbCkKLQkJewotCQkJbWFwcGluZ0ZpbGVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbE1hcHBpbmdGaWxlUmVmPihYbWxNYXBwaW5nRmlsZVJlZi5jbGFzcywgdGhpcywgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTKTsKLQkJfQotCQlyZXR1cm4gbWFwcGluZ0ZpbGVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkphciBGaWxlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXJGaWxlUmVmfS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkphciBGaWxlczwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkphciBGaWxlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0phckZpbGVzKCkKLQkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdDxYbWxKYXJGaWxlUmVmPiBnZXRKYXJGaWxlcygpCi0JewotCQlpZiAoamFyRmlsZXMgPT0gbnVsbCkKLQkJewotCQkJamFyRmlsZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sSmFyRmlsZVJlZj4oWG1sSmFyRmlsZVJlZi5jbGFzcywgdGhpcywgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVMpOwotCQl9Ci0JCXJldHVybiBqYXJGaWxlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DbGFzc2VzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZn0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DbGFzc2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2xhc3NlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0NsYXNzZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbEphdmFDbGFzc1JlZj4gZ2V0Q2xhc3NlcygpCi0JewotCQlpZiAoY2xhc3NlcyA9PSBudWxsKQotCQl7Ci0JCQljbGFzc2VzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFhtbEphdmFDbGFzc1JlZj4oWG1sSmF2YUNsYXNzUmVmLmNsYXNzLCB0aGlzLCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVMpOwotCQl9Ci0JCXJldHVybiBjbGFzc2VzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCi0JICogQG1vZGVsIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuQm9vbGVhbk9iamVjdCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEJvb2xlYW4gZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpCi0JewotCQlyZXR1cm4gZXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0I2dldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPGVtPkV4Y2x1ZGUgVW5saXN0ZWQgQ2xhc3NlczwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RXhjbHVkZSBVbmxpc3RlZCBDbGFzc2VzPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuIG5ld0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpCi0JewotCQlCb29sZWFuIG9sZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgPSBleGNsdWRlVW5saXN0ZWRDbGFzc2VzOwotCQlleGNsdWRlVW5saXN0ZWRDbGFzc2VzID0gbmV3RXhjbHVkZVVubGlzdGVkQ2xhc3NlczsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19FWENMVURFX1VOTElTVEVEX0NMQVNTRVMsIG9sZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMsIGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5YbWxQcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFByb3BlcnRpZXMoWG1sUHJvcGVydGllcykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpCi0JewotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQcm9wZXJ0aWVzKFhtbFByb3BlcnRpZXMgbmV3UHJvcGVydGllcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykKLQl7Ci0JCVhtbFByb3BlcnRpZXMgb2xkUHJvcGVydGllcyA9IHByb3BlcnRpZXM7Ci0JCXByb3BlcnRpZXMgPSBuZXdQcm9wZXJ0aWVzOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCXsKLQkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMsIG9sZFByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpOwotCQkJaWYgKG1zZ3MgPT0gbnVsbCkgbXNncyA9IG5vdGlmaWNhdGlvbjsgZWxzZSBtc2dzLmFkZChub3RpZmljYXRpb24pOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvcGVydGllczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UHJvcGVydGllcygpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnRpZXMoWG1sUHJvcGVydGllcyBuZXdQcm9wZXJ0aWVzKQotCXsKLQkJaWYgKG5ld1Byb3BlcnRpZXMgIT0gcHJvcGVydGllcykKLQkJewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAocHJvcGVydGllcyAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwcm9wZXJ0aWVzKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9QRVJUSUVTLCBudWxsLCBtc2dzKTsKLQkJCWlmIChuZXdQcm9wZXJ0aWVzICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1Byb3BlcnRpZXMpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVMsIG51bGwsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0UHJvcGVydGllcyhuZXdQcm9wZXJ0aWVzLCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUywgbmV3UHJvcGVydGllcywgbmV3UHJvcGVydGllcykpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRNYXBwaW5nRmlsZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUzoKLQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEphckZpbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19DTEFTU0VTOgotCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q2xhc3NlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gYmFzaWNTZXRQcm9wZXJ0aWVzKG51bGwsIG1zZ3MpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19TSEFSRURfQ0FDSEVfTU9ERToKLQkJCQlyZXR1cm4gZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVkFMSURBVElPTl9NT0RFOgotCQkJCXJldHVybiBnZXRWYWxpZGF0aW9uTW9kZSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgotCQkJCXJldHVybiBnZXREZXNjcmlwdGlvbigpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1ZJREVSOgotCQkJCXJldHVybiBnZXRQcm92aWRlcigpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pUQV9EQVRBX1NPVVJDRToKLQkJCQlyZXR1cm4gZ2V0SnRhRGF0YVNvdXJjZSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX05PTl9KVEFfREFUQV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIGdldE5vbkp0YURhdGFTb3VyY2UoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTOgotCQkJCXJldHVybiBnZXRNYXBwaW5nRmlsZXMoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVM6Ci0JCQkJcmV0dXJuIGdldEphckZpbGVzKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUzoKLQkJCQlyZXR1cm4gZ2V0Q2xhc3NlcygpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUzoKLQkJCQlyZXR1cm4gZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIGdldFByb3BlcnRpZXMoKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OQU1FOgotCQkJCXJldHVybiBnZXROYW1lKCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1NIQVJFRF9DQUNIRV9NT0RFOgotCQkJCXNldFNoYXJlZENhY2hlTW9kZSgoWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVkFMSURBVElPTl9NT0RFOgotCQkJCXNldFZhbGlkYXRpb25Nb2RlKChYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fREVTQ1JJUFRJT046Ci0JCQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZyluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1ZJREVSOgotCQkJCXNldFByb3ZpZGVyKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6Ci0JCQkJc2V0SnRhRGF0YVNvdXJjZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTk9OX0pUQV9EQVRBX1NPVVJDRToKLQkJCQlzZXROb25KdGFEYXRhU291cmNlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19NQVBQSU5HX0ZJTEVTOgotCQkJCWdldE1hcHBpbmdGaWxlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxNYXBwaW5nRmlsZVJlZj4pbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KQVJfRklMRVM6Ci0JCQkJZ2V0SmFyRmlsZXMoKS5jbGVhcigpOwotCQkJCWdldEphckZpbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBYbWxKYXJGaWxlUmVmPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVM6Ci0JCQkJZ2V0Q2xhc3NlcygpLmNsZWFyKCk7Ci0JCQkJZ2V0Q2xhc3NlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgWG1sSmF2YUNsYXNzUmVmPiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0VYQ0xVREVfVU5MSVNURURfQ0xBU1NFUzoKLQkJCQlzZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKChCb29sZWFuKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUzoKLQkJCQlzZXRQcm9wZXJ0aWVzKChYbWxQcm9wZXJ0aWVzKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRToKLQkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFOgotCQkJCXNldFRyYW5zYWN0aW9uVHlwZSgoWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fU0hBUkVEX0NBQ0hFX01PREU6Ci0JCQkJc2V0U2hhcmVkQ2FjaGVNb2RlKFNIQVJFRF9DQUNIRV9NT0RFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVkFMSURBVElPTl9NT0RFOgotCQkJCXNldFZhbGlkYXRpb25Nb2RlKFZBTElEQVRJT05fTU9ERV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0RFU0NSSVBUSU9OOgotCQkJCXNldERlc2NyaXB0aW9uKERFU0NSSVBUSU9OX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPVklERVI6Ci0JCQkJc2V0UHJvdmlkZXIoUFJPVklERVJfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6Ci0JCQkJc2V0SnRhRGF0YVNvdXJjZShKVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OT05fSlRBX0RBVEFfU09VUkNFOgotCQkJCXNldE5vbkp0YURhdGFTb3VyY2UoTk9OX0pUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVM6Ci0JCQkJZ2V0TWFwcGluZ0ZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fSkFSX0ZJTEVTOgotCQkJCWdldEphckZpbGVzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fQ0xBU1NFUzoKLQkJCQlnZXRDbGFzc2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTOgotCQkJCXNldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fUFJPUEVSVElFUzoKLQkJCQlzZXRQcm9wZXJ0aWVzKChYbWxQcm9wZXJ0aWVzKW51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OQU1FOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1RSQU5TQUNUSU9OX1RZUEU6Ci0JCQkJc2V0VHJhbnNhY3Rpb25UeXBlKFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fU0hBUkVEX0NBQ0hFX01PREU6Ci0JCQkJcmV0dXJuIHNoYXJlZENhY2hlTW9kZSAhPSBTSEFSRURfQ0FDSEVfTU9ERV9FREVGQVVMVDsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19WQUxJREFUSU9OX01PREU6Ci0JCQkJcmV0dXJuIHZhbGlkYXRpb25Nb2RlICE9IFZBTElEQVRJT05fTU9ERV9FREVGQVVMVDsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19ERVNDUklQVElPTjoKLQkJCQlyZXR1cm4gREVTQ1JJUFRJT05fRURFRkFVTFQgPT0gbnVsbCA/IGRlc2NyaXB0aW9uICE9IG51bGwgOiAhREVTQ1JJUFRJT05fRURFRkFVTFQuZXF1YWxzKGRlc2NyaXB0aW9uKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19QUk9WSURFUjoKLQkJCQlyZXR1cm4gUFJPVklERVJfRURFRkFVTFQgPT0gbnVsbCA/IHByb3ZpZGVyICE9IG51bGwgOiAhUFJPVklERVJfRURFRkFVTFQuZXF1YWxzKHByb3ZpZGVyKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19KVEFfREFUQV9TT1VSQ0U6Ci0JCQkJcmV0dXJuIEpUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8ganRhRGF0YVNvdXJjZSAhPSBudWxsIDogIUpUQV9EQVRBX1NPVVJDRV9FREVGQVVMVC5lcXVhbHMoanRhRGF0YVNvdXJjZSk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fTk9OX0pUQV9EQVRBX1NPVVJDRToKLQkJCQlyZXR1cm4gTk9OX0pUQV9EQVRBX1NPVVJDRV9FREVGQVVMVCA9PSBudWxsID8gbm9uSnRhRGF0YVNvdXJjZSAhPSBudWxsIDogIU5PTl9KVEFfREFUQV9TT1VSQ0VfRURFRkFVTFQuZXF1YWxzKG5vbkp0YURhdGFTb3VyY2UpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX01BUFBJTkdfRklMRVM6Ci0JCQkJcmV0dXJuIG1hcHBpbmdGaWxlcyAhPSBudWxsICYmICFtYXBwaW5nRmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0pBUl9GSUxFUzoKLQkJCQlyZXR1cm4gamFyRmlsZXMgIT0gbnVsbCAmJiAhamFyRmlsZXMuaXNFbXB0eSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX0NMQVNTRVM6Ci0JCQkJcmV0dXJuIGNsYXNzZXMgIT0gbnVsbCAmJiAhY2xhc3Nlcy5pc0VtcHR5KCk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTOgotCQkJCXJldHVybiBFWENMVURFX1VOTElTVEVEX0NMQVNTRVNfRURFRkFVTFQgPT0gbnVsbCA/IGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMgIT0gbnVsbCA6ICFFWENMVURFX1VOTElTVEVEX0NMQVNTRVNfRURFRkFVTFQuZXF1YWxzKGV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuIHByb3BlcnRpZXMgIT0gbnVsbDsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX19OQU1FOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9fVFJBTlNBQ1RJT05fVFlQRToKLQkJCQlyZXR1cm4gdHJhbnNhY3Rpb25UeXBlICE9IFRSQU5TQUNUSU9OX1RZUEVfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHNoYXJlZENhY2hlTW9kZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2hhcmVkQ2FjaGVNb2RlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB2YWxpZGF0aW9uTW9kZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQodmFsaWRhdGlvbk1vZGUpOwotCQlyZXN1bHQuYXBwZW5kKCIsIGRlc2NyaXB0aW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvbik7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgcHJvdmlkZXI6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHByb3ZpZGVyKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBqdGFEYXRhU291cmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChqdGFEYXRhU291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBub25KdGFEYXRhU291cmNlOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChub25KdGFEYXRhU291cmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBleGNsdWRlVW5saXN0ZWRDbGFzc2VzOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChleGNsdWRlVW5saXN0ZWRDbGFzc2VzKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBuYW1lOiAiKTsKLQkJcmVzdWx0LmFwcGVuZChuYW1lKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCB0cmFuc2FjdGlvblR5cGU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHRyYW5zYWN0aW9uVHlwZSk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRUcmFuc2xhdG9yKFN0cmluZyBlbGVtZW50TmFtZSwgRVN0cnVjdHVyYWxGZWF0dXJlIHN0cnVjdHVyYWxGZWF0dXJlKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlVHJhbnNsYXRvcihlbGVtZW50TmFtZSwgc3RydWN0dXJhbEZlYXR1cmUsIGJ1aWxkVHJhbnNsYXRvckNoaWxkcmVuKCkpOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCVBlcnNpc3RlbmNlUGFja2FnZSBwa2cgPSBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFOwotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3JbXSB7Ci0JCQkJYnVpbGROYW1lVHJhbnNsYXRvcigpLAotCQkJCWJ1aWxkVHJhbnNhY3Rpb25UeXBlVHJhbnNsYXRvcigpLAotCQkJCWJ1aWxkRGVzY3JpcHRpb25UcmFuc2xhdG9yKCksCi0JCQkJYnVpbGRQcm92aWRlclRyYW5zbGF0b3IoKSwKLQkJCQlidWlsZEp0YURhdGFTb3VyY2VUcmFuc2xhdG9yKCksCi0JCQkJYnVpbGROb25KdGFEYXRhU291cmNlVHJhbnNsYXRvcigpLAotCQkJCVhtbE1hcHBpbmdGaWxlUmVmLmJ1aWxkVHJhbnNsYXRvcihKUEEuTUFQUElOR19GSUxFLCBwa2cuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X01hcHBpbmdGaWxlcygpKSwKLQkJCQlYbWxKYXJGaWxlUmVmLmJ1aWxkVHJhbnNsYXRvcihKUEEuSkFSX0ZJTEUsIHBrZy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSmFyRmlsZXMoKSksCi0JCQkJWG1sSmF2YUNsYXNzUmVmLmJ1aWxkVHJhbnNsYXRvcihKUEEuQ0xBU1MsIHBrZy5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfQ2xhc3NlcygpKSwKLQkJCQlidWlsZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXNUcmFuc2xhdG9yKCksCi0JCQkJYnVpbGRTaGFyZWRDYWNoZU1vZGVUcmFuc2xhdG9yKCksCi0JCQkJYnVpbGRWYWxpZGF0aW9uTW9kZVRyYW5zbGF0b3IoKSwKLQkJCQlYbWxQcm9wZXJ0aWVzLmJ1aWxkVHJhbnNsYXRvcihKUEEuUFJPUEVSVElFUywgcGtnLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9Qcm9wZXJ0aWVzKCkpfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcigKLQkJCQlKUEEuUEVSU0lTVEVOQ0VfVU5JVF9fTkFNRSwKLQkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9OYW1lKCksCi0JCQkJVHJhbnNsYXRvci5ET01fQVRUUklCVVRFKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNhY3Rpb25UeXBlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKAotCQkJCUpQQS5QRVJTSVNURU5DRV9VTklUX19UUkFOU0FDVElPTl9UWVBFLAotCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1RyYW5zYWN0aW9uVHlwZSgpLAotCQkJCVRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSB8IFRyYW5zbGF0b3IuVU5TRVRfSUZfTlVMTCk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZERlc2NyaXB0aW9uVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKAotCQkJCUpQQS5ERVNDUklQVElPTiwKLQkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9EZXNjcmlwdGlvbigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkUHJvdmlkZXJUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zbGF0b3IoCi0JCQkJSlBBLlBST1ZJREVSLAotCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X1Byb3ZpZGVyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRKdGFEYXRhU291cmNlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKAotCQkJCUpQQS5KVEFfREFUQV9TT1VSQ0UsCi0JCQkJUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfSnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTm9uSnRhRGF0YVNvdXJjZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcigKLQkJCQlKUEEuTk9OX0pUQV9EQVRBX1NPVVJDRSwKLQkJCQlQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF9Ob25KdGFEYXRhU291cmNlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBCb29sZWFuVHJhbnNsYXRvcigKLQkJCQlKUEEuRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTLAotCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0X0V4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFNoYXJlZENhY2hlTW9kZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcigKLQkJCQlKUEEyXzAuUEVSU0lTVEVOQ0VfVU5JVF9fU0hBUkVEX0NBQ0hFX01PREUsCi0JCQkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMF9TaGFyZWRDYWNoZU1vZGUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFZhbGlkYXRpb25Nb2RlVHJhbnNsYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2xhdG9yKAotCQkJCUpQQTJfMC5QRVJTSVNURU5DRV9VTklUX19WQUxJREFUSU9OX01PREUsCi0JCQkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMF9WYWxpZGF0aW9uTW9kZSgpKTsKLQl9Ci0KLQotCXB1YmxpYyBpbnQgZ2V0TG9jYXRpb25Ub0luc2VydE1hcHBpbmdGaWxlUmVmKCkgewotCQlpZiAoZ2V0TWFwcGluZ0ZpbGVzKCkuc2l6ZSgpID4gMCkgewotCQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBDb2xsZWN0aW9uVG9vbHMubGFzdCh0aGlzLmdldE1hcHBpbmdGaWxlcygpKTsKLQkJCXJldHVybiBtYXBwaW5nRmlsZVJlZi5nZXROb2RlRW5kT2Zmc2V0KCk7Ci0JCX0KLQotCQlJRE9NTm9kZSBlbGVtZW50Tm9kZSA9IG51bGw7Ci0JCWlmIChnZXROb25KdGFEYXRhU291cmNlKCkgIT0gbnVsbCkgewotCQkJZWxlbWVudE5vZGUgPSBnZXRFbGVtZW50Tm9kZShKUEEuTk9OX0pUQV9EQVRBX1NPVVJDRSk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0SnRhRGF0YVNvdXJjZSgpICE9IG51bGwpIHsKLQkJCWVsZW1lbnROb2RlID0gZ2V0RWxlbWVudE5vZGUoSlBBLkpUQV9EQVRBX1NPVVJDRSk7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQllbGVtZW50Tm9kZSA9IGdldEVsZW1lbnROb2RlKEpQQS5QUk9WSURFUik7CQkJCi0JCX0KLQkJZWxzZSBpZiAoZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKSB7Ci0JCQllbGVtZW50Tm9kZSA9IGdldEVsZW1lbnROb2RlKEpQQS5ERVNDUklQVElPTik7CQkJCi0JCX0KLQkJaWYgKGVsZW1lbnROb2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBlbGVtZW50Tm9kZS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzVlM2EuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Vbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgZW51bSBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgaW1wbGVtZW50cyBFbnVtZXJhdG9yCi17Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SlRBPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pUQV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUpUQSgwLCAiSlRBIiwgIkpUQSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVTT1VSQ0UgTE9DQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVTT1VSQ0VfTE9DQUxfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlSRVNPVVJDRV9MT0NBTCgxLCAiUkVTT1VSQ0VfTE9DQUwiLCAiUkVTT1VSQ0VfTE9DQUwiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkpUQTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SlRBPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0pUQQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpUQV9WQUxVRSA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVNPVVJDRSBMT0NBTDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UkVTT1VSQ0UgTE9DQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjUkVTT1VSQ0VfTE9DQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9MT0NBTF9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlW10gVkFMVUVTX0FSUkFZID0KLQkJbmV3IFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVtdCi0JCXsKLQkJCUpUQSwKLQkJCVJFU09VUkNFX0xPQ0FMLAotCQl9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVHJhbnNhY3Rpb24gVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFRyYW5zYWN0aW9uIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgSlRBX1ZBTFVFOiByZXR1cm4gSlRBOwotCQkJY2FzZSBSRVNPVVJDRV9MT0NBTF9WQUxVRTogcmV0dXJuIFJFU09VUkNFX0xPQ0FMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL1htbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjU0Y2RhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL1htbFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuU2ltcGxlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sUHJvcGVydGllczwvYj48L2VtPicuCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXMjZ2V0UHJvcGVydGllcyA8ZW0+UHJvcGVydGllczwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0aWVzKCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFByb3BlcnRpZXMgZXh0ZW5kcyBBYnN0cmFjdEpwYUVPYmplY3QgaW1wbGVtZW50cyBKcGFFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvcGVydGllcygpIDxlbT5Qcm9wZXJ0aWVzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFByb3BlcnRpZXMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdDxYbWxQcm9wZXJ0eT4gcHJvcGVydGllczsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBYbWxQcm9wZXJ0aWVzKCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKQotCXsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUGFja2FnZS5MaXRlcmFscy5YTUxfUFJPUEVSVElFUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9wZXJ0aWVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KLQkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5fS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlhtbFByb3BlcnRpZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Qcm9wZXJ0aWVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0aWVzX1Byb3BlcnRpZXMoKQotCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0PFhtbFByb3BlcnR5PiBnZXRQcm9wZXJ0aWVzKCkKLQl7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCXsKLQkJCXByb3BlcnRpZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8WG1sUHJvcGVydHk+KFhtbFByb3BlcnR5LmNsYXNzLCB0aGlzLCBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRJRVNfX1BST1BFUlRJRVMpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0aWVzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRJRVNfX1BST1BFUlRJRVM6Ci0JCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQcm9wZXJ0aWVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVElFU19fUFJPUEVSVElFUzoKLQkJCQlyZXR1cm4gZ2V0UHJvcGVydGllcygpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUSUVTX19QUk9QRVJUSUVTOgotCQkJCWdldFByb3BlcnRpZXMoKS5jbGVhcigpOwotCQkJCWdldFByb3BlcnRpZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFhtbFByb3BlcnR5PiluZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRJRVNfX1BST1BFUlRJRVM6Ci0JCQkJZ2V0UHJvcGVydGllcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUSUVTX19QUk9QRVJUSUVTOgotCQkJCXJldHVybiBwcm9wZXJ0aWVzICE9IG51bGwgJiYgIXByb3BlcnRpZXMuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogdHJhbnNsYXRvcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVHJhbnNsYXRvcihTdHJpbmcgZWxlbWVudE5hbWUsIEVTdHJ1Y3R1cmFsRmVhdHVyZSBzdHJ1Y3R1cmFsRmVhdHVyZSkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVRyYW5zbGF0b3IoZWxlbWVudE5hbWUsIHN0cnVjdHVyYWxGZWF0dXJlLCBidWlsZFRyYW5zbGF0b3JDaGlsZHJlbigpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlYbWxQcm9wZXJ0eS5idWlsZFRyYW5zbGF0b3IoSlBBLlBST1BFUlRZLCBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFLmdldFhtbFByb3BlcnRpZXNfUHJvcGVydGllcygpKSwKLQkJCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQcm9wZXJ0eS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvWG1sUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1NTgzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS9YbWxQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LnRyYW5zbGF0b3JzLlNpbXBsZVRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYUVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sUHJvcGVydHk8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQcm9wZXJ0eSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUHJvcGVydHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlI2dldFhtbFByb3BlcnR5KCkKLSAqIEBtb2RlbCBraW5kPSJjbGFzcyIKLSAqIEBleHRlbmRzIEpwYUVPYmplY3QKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFhtbFByb3BlcnR5IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0IGltcGxlbWVudHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXROYW1lKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBOQU1FX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZhbHVlKCkgPGVtPlZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRWYWx1ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VmFsdWUoKSA8ZW0+VmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgWG1sUHJvcGVydHkoKQotCXsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpCi0JewotCQlyZXR1cm4gUGVyc2lzdGVuY2VQYWNrYWdlLkxpdGVyYWxzLlhNTF9QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9OYW1lKCkKLQkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIgZGF0YVR5cGU9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWwudHlwZS5TdHJpbmciIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldE5hbWUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKQotCXsKLQkJU3RyaW5nIG9sZE5hbWUgPSBuYW1lOwotCQluYW1lID0gbmV3TmFtZTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRSwgb2xkTmFtZSwgbmFtZSkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmFsdWUoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlUGFja2FnZSNnZXRYbWxQcm9wZXJ0eV9WYWx1ZSgpCi0JICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIGRhdGFUeXBlPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1sLnR5cGUuU3RyaW5nIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0JewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5I2dldFZhbHVlIDxlbT5WYWx1ZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKQotCXsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFLCBvbGRWYWx1ZSwgdmFsdWUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRToKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVBhY2thZ2UuWE1MX1BST1BFUlRZX19WQUxVRToKLQkJCQlyZXR1cm4gZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJc2V0TmFtZSgoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX1ZBTFVFOgotCQkJCXNldFZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWV9fTkFNRToKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlUGFja2FnZS5YTUxfUFJPUEVSVFlfX05BTUU6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VQYWNrYWdlLlhNTF9QUk9QRVJUWV9fVkFMVUU6Ci0JCQkJcmV0dXJuIFZBTFVFX0VERUZBVUxUID09IG51bGwgPyB2YWx1ZSAhPSBudWxsIDogIVZBTFVFX0VERUZBVUxULmVxdWFscyh2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOwotCX0KLQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAobmFtZTogIik7Ci0JCXJlc3VsdC5hcHBlbmQobmFtZSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgdmFsdWU6ICIpOwotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRyYW5zbGF0b3JzICoqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgVHJhbnNsYXRvciBidWlsZFRyYW5zbGF0b3IoU3RyaW5nIGVsZW1lbnROYW1lLCBFU3RydWN0dXJhbEZlYXR1cmUgc3RydWN0dXJhbEZlYXR1cmUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVUcmFuc2xhdG9yKAotCQkJCWVsZW1lbnROYW1lLAotCQkJCXN0cnVjdHVyYWxGZWF0dXJlLAotCQkJCVRyYW5zbGF0b3IuRU5EX1RBR19OT19JTkRFTlQsCi0JCQkJYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKQotCQkJKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yW10gYnVpbGRUcmFuc2xhdG9yQ2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcltdIHsKLQkJCQlidWlsZE5hbWVUcmFuc2xhdG9yKCksCi0JCQkJYnVpbGRWYWx1ZVRyYW5zbGF0b3IoKQotCQkJfTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkTmFtZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcigKLQkJCQlKUEEuUFJPUEVSVFlfX05BTUUsCi0JCQkJUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRS5nZXRYbWxQcm9wZXJ0eV9OYW1lKCksCi0JCQkJVHJhbnNsYXRvci5ET01fQVRUUklCVVRFCi0JCQkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRWYWx1ZVRyYW5zbGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNsYXRvcigKLQkJCQlKUEEuUFJPUEVSVFlfX1ZBTFVFLAotCQkJCVBlcnNpc3RlbmNlUGFja2FnZS5lSU5TVEFOQ0UuZ2V0WG1sUHJvcGVydHlfVmFsdWUoKSwKLQkJCQlUcmFuc2xhdG9yLkRPTV9BVFRSSUJVVEUKLQkJCSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVR5cGVFZGl0KElUeXBlIG9yaWdpbmFsVHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJU3RyaW5nIG9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQlpbnQgbmFtZUluZGV4ID0gb3JpZ2luYWxUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnLicpLmxhc3RJbmRleE9mKG9yaWdpbmFsTmFtZSk7Ci0KLQkJaW50IG9mZnNldCA9IGdldEF0dHJpYnV0ZU5vZGUoSlBBLlBST1BFUlRZX19WQUxVRSkuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgMTsKLQkJcmV0dXJuIG5ldyBSZXBsYWNlRWRpdChvZmZzZXQgKyBuYW1lSW5kZXgsIG9yaWdpbmFsTmFtZS5sZW5ndGgoKSwgbmV3TmFtZSk7Ci0JfQotCi0JcHVibGljIFJlcGxhY2VFZGl0IGNyZWF0ZVJlbmFtZVBhY2thZ2VFZGl0KFN0cmluZyBuZXdOYW1lKSB7Ci0JCWludCBwYWNrYWdlTGVuZ3RoID0gdGhpcy52YWx1ZS5sYXN0SW5kZXhPZignLicpOwotCi0JCWludCBvZmZzZXQgPSBnZXRBdHRyaWJ1dGVOb2RlKEpQQS5QUk9QRVJUWV9fVkFMVUUpLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7Ci0JCXJldHVybiBuZXcgUmVwbGFjZUVkaXQob2Zmc2V0LCBwYWNrYWdlTGVuZ3RoLCBuZXdOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvSlBBMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL0pQQTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWIxMDIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvSlBBMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuSlBBOwotCi0vKioKLSAqIEpQQSBwZXJzaXN0ZW5jZTJfMC54bWwtcmVsYXRlZCBzdHVmZiAoZWxlbWVudHMsIGF0dHJpYnV0ZXMgZXRjLikKLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgSlBBMl8wCi0JZXh0ZW5kcyBKUEEKLXsKLQlTdHJpbmcgU0NIRU1BX05BTUVTUEFDRSA9IEpQQS5TQ0hFTUFfTkFNRVNQQUNFOwotCVN0cmluZyBTQ0hFTUFfTE9DQVRJT04gPSAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMl8wLnhzZCI7Ci0JU3RyaW5nIFNDSEVNQV9WRVJTSU9OID0gIjIuMCI7Ci0JCi0JLy8gSlBBIDIuMCBzcGVjaWZpYyBub2RlcwotCQotCVN0cmluZyBQRVJTSVNURU5DRV9VTklUX19TSEFSRURfQ0FDSEVfTU9ERSA9ICJzaGFyZWQtY2FjaGUtbW9kZSI7Ci0JU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfX1ZBTElEQVRJT05fTU9ERSA9ICJ2YWxpZGF0aW9uLW1vZGUiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdjJfMC9QZXJzaXN0ZW5jZVYyXzBGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1BlcnNpc3RlbmNlVjJfMEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNhZTkwNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1BlcnNpc3RlbmNlVjJfMEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnBsdWdpbi5FY29yZVBsdWdpbjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBwcm92aWRlcyBhIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VWMl8wRmFjdG9yeSBpbml0KCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5IHRoZVBlcnNpc3RlbmNlVjJfMEZhY3RvcnkgPSAoUGVyc2lzdGVuY2VWMl8wRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LnBlcnNpc3RlbmNlLnYyXzAueG1pIik7IAotCQkJaWYgKHRoZVBlcnNpc3RlbmNlVjJfMEZhY3RvcnkgIT0gbnVsbCkKLQkJCXsKLQkJCQlyZXR1cm4gdGhlUGVyc2lzdGVuY2VWMl8wRmFjdG9yeTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikKLQkJewotCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VWMl8wRmFjdG9yeSgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFT2JqZWN0IGNyZWF0ZShFQ2xhc3MgZUNsYXNzKQotCXsKLQkJc3dpdGNoIChlQ2xhc3MuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWRlZmF1bHQ6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGNsYXNzICciICsgZUNsYXNzLmdldE5hbWUoKSArICInIGlzIG5vdCBhIHZhbGlkIGNsYXNzaWZpZXIiKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgY3JlYXRlRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKQotCXsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpCi0JCXsKLQkJCWNhc2UgUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1RZUEVfMjA6Ci0JCQkJcmV0dXJuIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOwotCQkJY2FzZSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLlhNTF9QRVJTSVNURU5DRV9VTklUX1ZBTElEQVRJT05fTU9ERV9UWVBFXzIwOgotCQkJCXJldHVybiBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7Ci0JCQlkZWZhdWx0OgotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkYXRhdHlwZSAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyBpcyBub3QgYSB2YWxpZCBjbGFzc2lmaWVyIik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXN3aXRjaCAoZURhdGFUeXBlLmdldENsYXNzaWZpZXJJRCgpKQotCQl7Ci0JCQljYXNlIFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuWE1MX1BFUlNJU1RFTkNFX1VOSVRfQ0FDSElOR19UWVBFXzIwOgotCQkJCXJldHVybiBjb252ZXJ0WG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKLQkJCWNhc2UgUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5YTUxfUEVSU0lTVEVOQ0VfVU5JVF9WQUxJREFUSU9OX01PREVfVFlQRV8yMDoKLQkJCQlyZXR1cm4gY29udmVydFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzBUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOwotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBjcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgcmVzdWx0ID0gWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wLmdldChpbml0aWFsVmFsdWUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIGNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzBGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpCi0JewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIHJlc3VsdCA9IFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzBUb1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkKLQl7Ci0JCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIGdldFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIChQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKWdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZGVwcmVjYXRlZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVuY2VWMl8wUGFja2FnZSBnZXRQYWNrYWdlKCkKLQl7Ci0JCXJldHVybiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmVJTlNUQU5DRTsKLQl9Ci0KLX0gLy9QZXJzaXN0ZW5jZVYyXzBGYWN0b3J5CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1BlcnNpc3RlbmNlVjJfMFBhY2thZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM5ZjIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogVGhlIDxiPlBhY2thZ2U8L2I+IGZvciB0aGUgbW9kZWwuCi0gKiBJdCBjb250YWlucyBhY2Nlc3NvcnMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdG8gcmVwcmVzZW50Ci0gKiA8dWw+Ci0gKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBlbnVtLDwvbGk+Ci0gKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBGYWN0b3J5Ci0gKiBAbW9kZWwga2luZD0icGFja2FnZSIKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZUltcGwKLXsKLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGVOQU1FID0gInYyXzAiOwotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIFVSSS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfVVJJID0gImpwdC5wZXJzaXN0ZW5jZS52Ml8wLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wIjsKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdCgpOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCAyMDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUXzIwID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5TaGFyZWQgQ2FjaGUgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfX1NIQVJFRF9DQUNIRV9NT0RFID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUXzIwX19WQUxJREFUSU9OX01PREUgPSAxOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IDIwPC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfRkVBVFVSRV9DT1VOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZyBUeXBlIDIwPC9lbT59JyBlbnVtLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWE1MX1BFUlNJU1RFTkNFX1VOSVRfQ0FDSElOR19UWVBFXzIwID0gMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2VtPn0nIGVudW0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFhNTF9QRVJTSVNURU5DRV9VTklUX1ZBTElEQVRJT05fTU9ERV9UWVBFXzIwID0gMjsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIHhtbFBlcnNpc3RlbmNlVW5pdF8yXzBFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSB4bWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzBFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlI2VOU19VUkkKLQkgKiBAc2VlICNpbml0KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKCkKLQl7Ci0JCXN1cGVyKGVOU19VUkksIFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkuZUlOU1RBTkNFKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCi0JICogCi0JICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlI2VJTlNUQU5DRX0gd2hlbiB0aGF0IGZpZWxkIGlzIGFjY2Vzc2VkLgotCSAqIENsaWVudHMgc2hvdWxkIG5vdCBpbnZva2UgaXQgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHNpbXBseSBhY2Nlc3MgdGhhdCBmaWVsZCB0byBvYnRhaW4gdGhlIHBhY2thZ2UuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNlTlNfVVJJCi0JICogQHNlZSAjY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAc2VlICNpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlIGluaXQoKQotCXsKLQkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKTsKLQotCQkvLyBPYnRhaW4gb3IgY3JlYXRlIGFuZCByZWdpc3RlciBwYWNrYWdlCi0JCVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UgdGhlUGVyc2lzdGVuY2VWMl8wUGFja2FnZSA9IChQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UoKSk7Ci0KLQkJaXNJbml0ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgc2ltcGxlIGRlcGVuZGVuY2llcwotCQlFY29yZVBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIGludGVyZGVwZW5kZW5jaWVzCi0JCUNvbW1vblBhY2thZ2UgdGhlQ29tbW9uUGFja2FnZSA9IChDb21tb25QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgQ29tbW9uUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKENvbW1vblBhY2thZ2UuZU5TX1VSSSkgOiBDb21tb25QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCU9ybVBhY2thZ2UgdGhlT3JtUGFja2FnZSA9IChPcm1QYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1QYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtUGFja2FnZSA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSkgOiBPcm1QYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCU9ybVYyXzBQYWNrYWdlIHRoZU9ybVYyXzBQYWNrYWdlID0gKE9ybVYyXzBQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIE9ybVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtVjJfMFBhY2thZ2UuZU5TX1VSSSkgOiBPcm1WMl8wUGFja2FnZS5lSU5TVEFOQ0UpOwotCQlQZXJzaXN0ZW5jZVBhY2thZ2UgdGhlUGVyc2lzdGVuY2VQYWNrYWdlID0gKFBlcnNpc3RlbmNlUGFja2FnZSkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VQYWNrYWdlLmVOU19VUkkpIDogUGVyc2lzdGVuY2VQYWNrYWdlLmVJTlNUQU5DRSk7Ci0KLQkJLy8gQ3JlYXRlIHBhY2thZ2UgbWV0YS1kYXRhIG9iamVjdHMKLQkJdGhlUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlQ29tbW9uUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtVjJfMFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBJbml0aWFsaXplIGNyZWF0ZWQgbWV0YS1kYXRhCi0JCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVDb21tb25QYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlT3JtUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZU9ybVYyXzBQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQkvLyBNYXJrIG1ldGEtZGF0YSB0byBpbmRpY2F0ZSBpdCBjYW4ndCBiZSBjaGFuZ2VkCi0JCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZnJlZXplKCk7Ci0KLSAgCi0JCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQotCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJLCB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlKTsKLQkJcmV0dXJuIHRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2U7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCAyMDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wKCkKLQl7Ci0JCXJldHVybiB4bWxQZXJzaXN0ZW5jZVVuaXRfMl8wRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMCNnZXRTaGFyZWRDYWNoZU1vZGUgPGVtPlNoYXJlZCBDYWNoZSBNb2RlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hhcmVkIENhY2hlIE1vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wI2dldFNoYXJlZENhY2hlTW9kZSgpCi0JICogQHNlZSAjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfU2hhcmVkQ2FjaGVNb2RlKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSl4bWxQZXJzaXN0ZW5jZVVuaXRfMl8wRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wI2dldFZhbGlkYXRpb25Nb2RlIDxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wI2dldFZhbGlkYXRpb25Nb2RlKCkKLQkgKiBAc2VlICNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMF9WYWxpZGF0aW9uTW9kZSgpCi0JewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpeG1sUGVyc2lzdGVuY2VVbml0XzJfMEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIDxlbT5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpCi0JewotCQlyZXR1cm4geG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMEVFbnVtOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5IGdldFBlcnNpc3RlbmNlVjJfMEZhY3RvcnkoKQotCXsKLQkJcmV0dXJuIChQZXJzaXN0ZW5jZVYyXzBGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKLQkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0NyZWF0ZWQpIHJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJeG1sUGVyc2lzdGVuY2VVbml0XzJfMEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoeG1sUGVyc2lzdGVuY2VVbml0XzJfMEVDbGFzcywgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjBfX1NIQVJFRF9DQUNIRV9NT0RFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZSh4bWxQZXJzaXN0ZW5jZVVuaXRfMl8wRUNsYXNzLCBYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9fVkFMSURBVElPTl9NT0RFKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0gPSBjcmVhdGVFRW51bShYTUxfUEVSU0lTVEVOQ0VfVU5JVF9DQUNISU5HX1RZUEVfMjApOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0gPSBjcmVhdGVFRW51bShYTUxfUEVSU0lTVEVOQ0VfVU5JVF9WQUxJREFUSU9OX01PREVfVFlQRV8yMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbXBsZXRlIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSBhbmQgaXRzIG1ldGEtbW9kZWwuICBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCkKLQl7Ci0JCWlmIChpc0luaXRpYWxpemVkKSByZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIENyZWF0ZSB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBTZXQgYm91bmRzIGZvciB0eXBlIHBhcmFtZXRlcnMKLQotCQkvLyBBZGQgc3VwZXJ0eXBlcyB0byBjbGFzc2VzCi0KLQkJLy8gSW5pdGlhbGl6ZSBjbGFzc2VzIGFuZCBmZWF0dXJlczsgYWRkIG9wZXJhdGlvbnMgYW5kIHBhcmFtZXRlcnMKLQkJaW5pdEVDbGFzcyh4bWxQZXJzaXN0ZW5jZVVuaXRfMl8wRUNsYXNzLCBYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmNsYXNzLCAiWG1sUGVyc2lzdGVuY2VVbml0XzJfMCIsIElTX0FCU1RSQUNULCBJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7Ci0JCWluaXRFQXR0cmlidXRlKGdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfU2hhcmVkQ2FjaGVNb2RlKCksIHRoaXMuZ2V0WG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wKCksICJzaGFyZWRDYWNoZU1vZGUiLCAiVU5TUEVDSUZJRUQiLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMF9WYWxpZGF0aW9uTW9kZSgpLCB0aGlzLmdldFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAoKSwgInZhbGlkYXRpb25Nb2RlIiwgIkFVVE8iLCAwLCAxLCBYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5jbGFzcywgIlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCIpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5BTEwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5OT05FKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMEVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBFRW51bSwgWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMEVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAuVU5TUEVDSUZJRUQpOwotCi0JCWluaXRFRW51bSh4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuY2xhc3MsICJYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wIik7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuQVVUTyk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wRUVudW0sIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuQ0FMTEJBQ0spOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMEVFbnVtLCBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wLk5PTkUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogRGVmaW5lcyBsaXRlcmFscyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0aGF0IHJlcHJlc2VudAotCSAqIDx1bD4KLQkgKiAgIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0JICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KLQkgKiAgIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotCSAqIDwvdWw+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGl0ZXJhbHMKLQl7Ci0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgMjA8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wKCkKLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQ2xhc3MgWE1MX1BFUlNJU1RFTkNFX1VOSVRfMjAgPSBlSU5TVEFOQ0UuZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhcmVkIENhY2hlIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQGdlbmVyYXRlZAotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBFQXR0cmlidXRlIFhNTF9QRVJTSVNURU5DRV9VTklUXzIwX19TSEFSRURfQ0FDSEVfTU9ERSA9IGVJTlNUQU5DRS5nZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wX1NoYXJlZENhY2hlTW9kZSgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VmFsaWRhdGlvbiBNb2RlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBYTUxfUEVSU0lTVEVOQ0VfVU5JVF8yMF9fVkFMSURBVElPTl9NT0RFID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdF8yXzBfVmFsaWRhdGlvbk1vZGUoKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZyBUeXBlIDIwPC9lbT59JyBlbnVtLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUVudW0gWE1MX1BFUlNJU1RFTkNFX1VOSVRfQ0FDSElOR19UWVBFXzIwID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCA8ZW0+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2VtPn0nIGVudW0uCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5QZXJzaXN0ZW5jZVYyXzBQYWNrYWdlI2dldFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVFbnVtIFhNTF9QRVJTSVNURU5DRV9VTklUX1ZBTElEQVRJT05fTU9ERV9UWVBFXzIwID0gZUlOU1RBTkNFLmdldFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAoKTsKLQotCX0KLQotfSAvL1BlcnNpc3RlbmNlVjJfMFBhY2thZ2UKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWRmMWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBlbnVtIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BTEw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQUxMX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQUxMKDAsICJBTEwiLCAiQUxMIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlOT05FKDEsICJOT05FIiwgIk5PTkUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOQUJMRSBTRUxFQ1RJVkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRU5BQkxFX1NFTEVDVElWRV9WQUxVRQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCUVOQUJMRV9TRUxFQ1RJVkUoMiwgIkVOQUJMRV9TRUxFQ1RJVkUiLCAiRU5BQkxFX1NFTEVDVElWRSIpLAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RElTQUJMRSBTRUxFQ1RJVkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjRElTQUJMRV9TRUxFQ1RJVkVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlESVNBQkxFX1NFTEVDVElWRSgzLCAiRElTQUJMRV9TRUxFQ1RJVkUiLCAiRElTQUJMRV9TRUxFQ1RJVkUiKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVOU1BFQ0lGSUVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI1VOU1BFQ0lGSUVEX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JVU5TUEVDSUZJRUQoNCwgIlVOU1BFQ0lGSUVEIiwgIlVOU1BFQ0lGSUVEIik7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BTEw8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFMTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNBTEwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTkFCTEUgU0VMRUNUSVZFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FTkFCTEUgU0VMRUNUSVZFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0VOQUJMRV9TRUxFQ1RJVkUKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTkFCTEVfU0VMRUNUSVZFX1ZBTFVFID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRJU0FCTEUgU0VMRUNUSVZFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ESVNBQkxFIFNFTEVDVElWRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNESVNBQkxFX1NFTEVDVElWRQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVfU0VMRUNUSVZFX1ZBTFVFID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVOU1BFQ0lGSUVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VTlNQRUNJRklFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNVTlNQRUNJRklFRAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU1BFQ0lGSUVEX1ZBTFVFID0gNDsKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBDYWNoaW5nIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMFtdIFZBTFVFU19BUlJBWSA9Ci0JCW5ldyBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzBbXQotCQl7Ci0JCQlBTEwsCi0JCQlOT05FLAotCQkJRU5BQkxFX1NFTEVDVElWRSwKLQkJCURJU0FCTEVfU0VMRUNUSVZFLAotCQkJVU5TUEVDSUZJRUQsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZyBUeXBlIDIwPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8WG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IENhY2hpbmcgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpCi0JCQl7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IENhY2hpbmcgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgQ2FjaGluZyBUeXBlIDIwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wIGdldChpbnQgdmFsdWUpCi0JewotCQlzd2l0Y2ggKHZhbHVlKQotCQl7Ci0JCQljYXNlIEFMTF9WQUxVRTogcmV0dXJuIEFMTDsKLQkJCWNhc2UgTk9ORV9WQUxVRTogcmV0dXJuIE5PTkU7Ci0JCQljYXNlIEVOQUJMRV9TRUxFQ1RJVkVfVkFMVUU6IHJldHVybiBFTkFCTEVfU0VMRUNUSVZFOwotCQkJY2FzZSBESVNBQkxFX1NFTEVDVElWRV9WQUxVRTogcmV0dXJuIERJU0FCTEVfU0VMRUNUSVZFOwotCQkJY2FzZSBVTlNQRUNJRklFRF9WQUxVRTogcmV0dXJuIFVOU1BFQ0lGSUVEOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAoaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpCi0JewotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZSgpCi0JewotCSAgcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0JewotCSAgcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkKLQl7Ci0JICByZXR1cm4gbGl0ZXJhbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotCXsKLQkJcmV0dXJuIGxpdGVyYWw7Ci0JfQotCQotfSAvL1htbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UvcGVyc2lzdGVuY2UvdjJfMC9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3YjI2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGVudW0gWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCBpbXBsZW1lbnRzIEVudW1lcmF0b3IKLXsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5BVVRPPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0FVVE9fVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlBVVRPKDAsICJBVVRPIiwgIkFVVE8iKSwKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNBTExCQUNLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NBTExCQUNLX1ZBTFVFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JQ0FMTEJBQ0soMSwgIkNBTExCQUNLIiwgIkNBTExCQUNLIiksCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI05PTkVfVkFMVUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlOT05FKDIsICJOT05FIiwgIk5PTkUiKTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFVVE88L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjQVVUTwotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFVVE9fVkFMVUUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0FMTEJBQ0s8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNBTExCQUNLPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI0NBTExCQUNLCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfVkFMVUUgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNOT05FCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ORV9WQUxVRSA9IDI7Ci0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzBbXSBWQUxVRVNfQVJSQVkgPQotCQluZXcgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMFtdCi0JCXsKLQkJCUFVVE8sCi0JCQlDQUxMQkFDSywKLQkJCU5PTkUsCi0JCX07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgVmFsaWRhdGlvbiBNb2RlIFR5cGUgMjA8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlhtbCBQZXJzaXN0ZW5jZSBVbml0IFZhbGlkYXRpb24gTW9kZSBUeXBlIDIwPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCBnZXQoU3RyaW5nIGxpdGVyYWwpCi0JewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkKLQkJewotCQkJWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKQotCXsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpCi0JCXsKLQkJCVhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YbWwgUGVyc2lzdGVuY2UgVW5pdCBWYWxpZGF0aW9uIE1vZGUgVHlwZSAyMDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0KGludCB2YWx1ZSkKLQl7Ci0JCXN3aXRjaCAodmFsdWUpCi0JCXsKLQkJCWNhc2UgQVVUT19WQUxVRTogcmV0dXJuIEFVVE87Ci0JCQljYXNlIENBTExCQUNLX1ZBTFVFOiByZXR1cm4gQ0FMTEJBQ0s7Ci0JCQljYXNlIE5PTkVfVkFMVUU6IHJldHVybiBOT05FOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBYbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKQotCXsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKQotCXsKLQkgIHJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotCXsKLQkgIHJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpCi0JewotCSAgcmV0dXJuIGxpdGVyYWw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCXJldHVybiBsaXRlcmFsOwotCX0KLQkKLX0gLy9YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS9wZXJzaXN0ZW5jZS92Ml8wL1htbFBlcnNpc3RlbmNlVW5pdF8yXzAuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0XzJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWU4NTE1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3BlcnNpc3RlbmNlL3YyXzAvWG1sUGVyc2lzdGVuY2VVbml0XzJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+WG1sIFBlcnNpc3RlbmNlIFVuaXQgMjA8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuWG1sUGVyc2lzdGVuY2VVbml0XzJfMCNnZXRTaGFyZWRDYWNoZU1vZGUgPGVtPlNoYXJlZCBDYWNoZSBNb2RlPC9lbT59PC9saT4KLSAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wI2dldFZhbGlkYXRpb25Nb2RlIDxlbT5WYWxpZGF0aW9uIE1vZGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGludGVyZmFjZT0idHJ1ZSIgYWJzdHJhY3Q9InRydWUiCi0gKiBAZXh0ZW5kcyBKcGFFT2JqZWN0Ci0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWG1sUGVyc2lzdGVuY2VVbml0XzJfMCBleHRlbmRzIEpwYUVPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFyZWQgQ2FjaGUgTW9kZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPiJVTlNQRUNJRklFRCI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMH0uCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFyZWQgQ2FjaGUgTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAKLQkgKiBAc2VlICNzZXRTaGFyZWRDYWNoZU1vZGUoWG1sUGVyc2lzdGVuY2VVbml0Q2FjaGluZ1R5cGVfMl8wKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLnYyXzAuUGVyc2lzdGVuY2VWMl8wUGFja2FnZSNnZXRYbWxQZXJzaXN0ZW5jZVVuaXRfMl8wX1NoYXJlZENhY2hlTW9kZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IlVOU1BFQ0lGSUVEIiB1bmlxdWU9ImZhbHNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlYbWxQZXJzaXN0ZW5jZVVuaXRDYWNoaW5nVHlwZV8yXzAgZ2V0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRfMl8wI2dldFNoYXJlZENhY2hlTW9kZSA8ZW0+U2hhcmVkIENhY2hlIE1vZGU8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNoYXJlZCBDYWNoZSBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMAotCSAqIEBzZWUgI2dldFNoYXJlZENhY2hlTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2hhcmVkQ2FjaGVNb2RlKFhtbFBlcnNpc3RlbmNlVW5pdENhY2hpbmdUeXBlXzJfMCB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWxpZGF0aW9uIE1vZGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT4iQVVUTyI8L2NvZGU+LgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzB9LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UudjJfMC5YbWxQZXJzaXN0ZW5jZVVuaXRWYWxpZGF0aW9uTW9kZVR5cGVfMl8wCi0JICogQHNlZSAjc2V0VmFsaWRhdGlvbk1vZGUoWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2UjZ2V0WG1sUGVyc2lzdGVuY2VVbml0XzJfMF9WYWxpZGF0aW9uTW9kZSgpCi0JICogQG1vZGVsIGRlZmF1bHQ9IkFVVE8iIHVuaXF1ZT0iZmFsc2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAgZ2V0VmFsaWRhdGlvbk1vZGUoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdF8yXzAjZ2V0VmFsaWRhdGlvbk1vZGUgPGVtPlZhbGlkYXRpb24gTW9kZTwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsaWRhdGlvbiBNb2RlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlhtbFBlcnNpc3RlbmNlVW5pdFZhbGlkYXRpb25Nb2RlVHlwZV8yXzAKLQkgKiBAc2VlICNnZXRWYWxpZGF0aW9uTW9kZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0VmFsaWRhdGlvbk1vZGUoWG1sUGVyc2lzdGVuY2VVbml0VmFsaWRhdGlvbk1vZGVUeXBlXzJfMCB2YWx1ZSk7Ci0KLX0gLy8gWG1sUGVyc2lzdGVuY2VVbml0XzJfMApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UveG1sL0Fic3RyYWN0SnBhRU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UveG1sL0Fic3RyYWN0SnBhRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzdlNjk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9BYnN0cmFjdEpwYUVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuU2ltcGxlVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICogCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhRU9iamVjdAotCWV4dGVuZHMgRU9iamVjdEltcGwKLQlpbXBsZW1lbnRzIEpwYUVPYmplY3QKLXsKLQlwcm90ZWN0ZWQgSURPTU5vZGUgbm9kZTsKLQkKLQkvKioKLQkgKiBTZXRzIG9mICJpbnNpZ25pZmljYW50IiBmZWF0dXJlIGlkcywga2V5ZWQgYnkgY2xhc3MuCi0JICogVGhpcyBpcyBidWlsdCB1cCBsYXppbHksIGFzIHRoZSBvYmplY3RzIGFyZSBtb2RpZmllZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNodGFibGU8Q2xhc3M8PyBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdD4sIEhhc2hTZXQ8SW50ZWdlcj4+IGluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzID0gbmV3IEhhc2h0YWJsZTxDbGFzczw/IGV4dGVuZHMgQWJzdHJhY3RKcGFFT2JqZWN0PiwgSGFzaFNldDxJbnRlZ2VyPj4oKTsKLQkKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFFT2JqZWN0KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBKcGFFT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBib29sZWFuIGlzVW5zZXQoKSB7Ci0JCWZvciAoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUgOiB0aGlzLmVDbGFzcygpLmdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKSkgewotCQkJaWYgKHRoaXMuZUlzU2V0KGZlYXR1cmUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjaGFuZ2Ugbm90aWZpY2F0aW9uICoqKioqKioqKioKLQotCS8qKgotCSAqIG92ZXJyaWRlIHRvIGJ1aWxkIGEgY3VzdG9tIGxpc3QgZm9yIHRoZSBhZGFwdGVycwotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxBZGFwdGVyPiBlQWRhcHRlcnMoKSB7Ci0JCWlmICh0aGlzLmVBZGFwdGVycyA9PSBudWxsKSB7Ci0JCQl0aGlzLmVBZGFwdGVycyA9IG5ldyBYbWxFQWRhcHRlckxpc3Q8QWRhcHRlcj4odGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZUFkYXB0ZXJzOwotCX0KLQotCS8qKgotCSAqIG92ZXJyaWRlIHRvIHByZXZlbnQgbm90aWZpY2F0aW9uIHdoZW4gdGhlIG9iamVjdCdzIHN0YXRlIGlzIHVuY2hhbmdlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVOb3RpZnkoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlpZiAoICEgbm90aWZpY2F0aW9uLmlzVG91Y2goKSkgewotCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJdGhpcy5mZWF0dXJlQ2hhbmdlZChub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKHRoaXMuZ2V0Q2xhc3MoKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmVhdHVyZUNoYW5nZWQoaW50IGZlYXR1cmVJZCkgewotCQlpZiAodGhpcy5mZWF0dXJlSXNTaWduaWZpY2FudChmZWF0dXJlSWQpKSB7IAotCQkJdGhpcy5nZXRYbWxSZXNvdXJjZSgpLnJlc291cmNlTW9kZWxDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0WG1sUmVzb3VyY2UoKSB7Ci0JCXJldHVybiAoSnBhWG1sUmVzb3VyY2UpIHRoaXMuZVJlc291cmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmVhdHVyZUlzU2lnbmlmaWNhbnQoaW50IGZlYXR1cmVJZCkgewotCQlyZXR1cm4gISB0aGlzLmZlYXR1cmVJc0luc2lnbmlmaWNhbnQoZmVhdHVyZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmZWF0dXJlSXNJbnNpZ25pZmljYW50KGludCBmZWF0dXJlSWQpIHsKLQkJcmV0dXJuIHRoaXMuaW5zaWduaWZpY2FudEZlYXR1cmVJZHMoKS5jb250YWlucyhJbnRlZ2VyLnZhbHVlT2YoZmVhdHVyZUlkKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGEgc2V0IG9mIHRoZSBvYmplY3QncyAiaW5zaWduaWZpY2FudCIgZmVhdHVyZSBpZHMuCi0JICogVGhlc2UgYXJlIHRoZSBFTUYgZmVhdHVyZXMgdGhhdCB3aWxsIG5vdCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBhbGwKLQkgKiB0aGUgZmVhdHVyZXMgYXJlIHVuc2V0LiAgV2UgdXNlIHRoaXMgdG8gZGV0ZXJtaW5lIHdoZW4gdG8gcmVtb3ZlIAotCSAqIGFuIGVsZW1lbnQgZnJvbSB0aGUgeG1sLgotCSAqIAotCSAqIElmIHlvdSBuZWVkIGluc3RhbmNlLWJhc2VkIGNhbGN1bGF0aW9uIG9mIHlvdXIgeG1sICJpbnNpZ25pZmljYW50IiBhc3BlY3RzLAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlICNhZGRJbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkc1RvKFNldCkuCi0JICogCi0JICogQHNlZSAjaXNVbnNldCgpCi0JICovCi0JcHJvdGVjdGVkIFNldDxJbnRlZ2VyPiBpbnNpZ25pZmljYW50RmVhdHVyZUlkcygpIHsKLQkJc3luY2hyb25pemVkIChpbnNpZ25pZmljYW50RmVhdHVyZUlkU2V0cykgewotCQkJSGFzaFNldDxJbnRlZ2VyPiBpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyA9IGluc2lnbmlmaWNhbnRGZWF0dXJlSWRTZXRzLmdldCh0aGlzLmdldENsYXNzKCkpOwotCQkJaWYgKGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzID09IG51bGwpIHsKLQkJCQlpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KCk7Ci0JCQkJdGhpcy5hZGRJbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkc1RvKGluc2lnbmlmaWNhbnRYbWxGZWF0dXJlSWRzKTsKLQkJCQlpbnNpZ25pZmljYW50RmVhdHVyZUlkU2V0cy5wdXQodGhpcy5nZXRDbGFzcygpLCBpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyk7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHM7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIG9iamVjdCdzICJpbnNpZ25pZmljYW50IiBmZWF0dXJlIGlkcyB0byB0aGUgc3BlY2lmaWVkIHNldC4KLQkgKiBUaGVzZSBhcmUgdGhlIEVNRiBmZWF0dXJlcyB0aGF0LCB3aGVuIHRoZXkgY2hhbmdlLCB3aWxsIE5PVCBjYXVzZSB0aGUKLQkgKiBvYmplY3QgKG9yIGl0cyBjb250YWluaW5nIHRyZWUpIHRvIGJlIHVwZGF0ZWQsIGkuZS4gZGVmYXVsdHMgY2FsY3VsYXRlZC4KLQkgKiBJZiBjbGFzcy1iYXNlZCBjYWxjdWxhdGlvbiBvZiB5b3VyICJpbnNpZ25pZmljYW50IiBmZWF0dXJlcyBpcyBzdWZmaWNpZW50LAotCSAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJZiB5b3UgbmVlZCBpbnN0YW5jZS1iYXNlZCBjYWxjdWxhdGlvbiwKLQkgKiBvdmVycmlkZSAjaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMoKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkc1RvKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZXQ8SW50ZWdlcj4gaW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHMpIHsKLQkvLyB3aGVuIHlvdSBvdmVycmlkZSB0aGlzIG1ldGhvZCwgZG9uJ3QgZm9yZ2V0IHRvIGluY2x1ZGU6Ci0JLy8Jc3VwZXIuYWRkSW5zaWduaWZpY2FudFhtbEZlYXR1cmVJZHNUbyhpbnNpZ25pZmljYW50WG1sRmVhdHVyZUlkcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHRleHQgcmFuZ2VzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSB0ZXh0IHJhbmdlIGZvciB0aGUgInRleHQiIG5vZGUuCi0JICogSWYgdGhlIHRleHQgbm9kZSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhpcyBvYmplY3QncyBub2RlCi0JICovCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBnZXRUZXh0VGV4dFJhbmdlKCkgewotCQlJRE9NTm9kZSB0ZXh0Tm9kZSA9IHRoaXMuZ2V0VGV4dE5vZGUoKTsKLQkJcmV0dXJuICh0ZXh0Tm9kZSAhPSBudWxsKSA/IHRoaXMuYnVpbGRUZXh0UmFuZ2UodGV4dE5vZGUpIDogdGhpcy5nZXRWYWxpZGF0aW9uVGV4dFJhbmdlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRUZXh0Tm9kZSgpIHsKLQkJLy8gVE9ETyBianYgbnVsbCBjaGVjayBubyBsb25nZXIgbmVlZGVkPyAob3JtIG5vZGVzIGFyZSBubyBsb25nZXIgdmlydHVhbCkKLQkJLy8gdmlydHVhbCBvYmplY3RzIGhhdmUgbm8gbm9kZQotCQlyZXR1cm4gKHRoaXMubm9kZSA9PSBudWxsKSA/IG51bGwgOiBzZWxlY3RUZXh0Tm9kZSh0aGlzLm5vZGUuZ2V0Q2hpbGROb2RlcygpKTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgSURPTU5vZGUgc2VsZWN0VGV4dE5vZGUoTm9kZUxpc3Qgbm9kZXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlJRE9NTm9kZSBuID0gKElET01Ob2RlKSBub2Rlcy5pdGVtKGkpOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCXJldHVybiBuOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHRleHQgcmFuZ2UgZm9yIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIG5vZGUuCi0JICogSWYgdGhlIGF0dHJpYnV0ZSBub2RlIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gYSB0ZXh0IHJhbmdlIGZvciB0aGlzIG9iamVjdCdzCi0JICogbm9kZQotCSAqLwotCXByb3RlY3RlZCBUZXh0UmFuZ2UgZ2V0QXR0cmlidXRlVGV4dFJhbmdlKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCUlET01Ob2RlIGF0dHJpYnV0ZU5vZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlTmFtZSk7Ci0JCXJldHVybiAoYXR0cmlidXRlTm9kZSAhPSBudWxsKSA/IHRoaXMuYnVpbGRUZXh0UmFuZ2UoYXR0cmlidXRlTm9kZSkgOiB0aGlzLmdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElET01BdHRyIGdldEF0dHJpYnV0ZU5vZGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuICh0aGlzLm5vZGUgPT0gbnVsbCkgPyAvLyB2aXJ0dWFsIG9iamVjdHMgaGF2ZSBubyBub2RlCi0JCQludWxsIDogKElET01BdHRyKSB0aGlzLm5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IG5vZGUuCi0JICogSWYgdGhlIGVsZW1lbnQgbm9kZSBkb2VzIG5vdCBleGlzdCwgcmV0dXJuIGEgdGV4dCByYW5nZSBmb3IgdGhpcyBvYmplY3QncwotCSAqIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEVsZW1lbnRUZXh0UmFuZ2UoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCUlET01Ob2RlIGVsZW1lbnROb2RlID0gdGhpcy5nZXRFbGVtZW50Tm9kZShlbGVtZW50TmFtZSk7Ci0JCXJldHVybiAoZWxlbWVudE5vZGUgIT0gbnVsbCkgPyB0aGlzLmJ1aWxkVGV4dFJhbmdlKGVsZW1lbnROb2RlKSA6IHRoaXMuZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaWYgb25lIGV4aXN0cwotCSAqLwotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRFbGVtZW50Tm9kZShTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKHRoaXMubm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsgLy8gdmlydHVhbCBvYmplY3RzIGhhdmUgbm8gbm9kZQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHRoaXMubm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkgKyspIHsKLQkJCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkmJiBlbGVtZW50TmFtZS5lcXVhbHMoY2hpbGQuZ2V0Tm9kZU5hbWUoKSkpIHsKLQkJCQlyZXR1cm4gY2hpbGQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUZXh0UmFuZ2UgZ2V0VmFsaWRhdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RnVsbFRleHRSYW5nZSgpOwotCX0KLQkKLQlwdWJsaWMgVGV4dFJhbmdlIGdldFNlbGVjdGlvblRleHRSYW5nZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RnVsbFRleHRSYW5nZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGdldEZ1bGxUZXh0UmFuZ2UoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkVGV4dFJhbmdlKHRoaXMubm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRSYW5nZSBidWlsZFRleHRSYW5nZShJRE9NTm9kZSBkb21Ob2RlKSB7Ci0JCXJldHVybiAoZG9tTm9kZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmJ1aWxkVGV4dFJhbmdlXyhkb21Ob2RlLCBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlKElET01Ob2RlIGRvbU5vZGUsIFRleHRSYW5nZSB0ZXh0UmFuZ2UpIHsKLQkJcmV0dXJuIChkb21Ob2RlID09IG51bGwpID8gbnVsbCA6IHRoaXMuYnVpbGRUZXh0UmFuZ2VfKGRvbU5vZGUsIHRleHRSYW5nZSk7Ci0JfQotCi0JLyoqCi0JICogcHJlLWNvbmRpdGlvbjogdGhlIHNwZWNpZmllZCBET00gbm9kZSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dFJhbmdlIGJ1aWxkVGV4dFJhbmdlXyhJRE9NTm9kZSBkb21Ob2RlLCBUZXh0UmFuZ2UgdGV4dFJhbmdlKSB7Ci0JCWludCBvZmZzZXQgPSBkb21Ob2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSAoZG9tTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSA/Ci0JCQkJCQkoKChJRE9NRWxlbWVudCkgZG9tTm9kZSkuZ2V0U3RhcnRFbmRPZmZzZXQoKSAtIG9mZnNldCkgOgotCQkJCQkJZG9tTm9kZS5nZXRMZW5ndGgoKTsKLQkJaW50IGxpbmVOdW1iZXIgPSBkb21Ob2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVPZk9mZnNldChvZmZzZXQpICsgMTsKLQkJcmV0dXJuICh0ZXh0UmFuZ2UgPT0gbnVsbCkgPwotCQkJCW5ldyBTaW1wbGVUZXh0UmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIGxpbmVOdW1iZXIpIDoKLQkJCQl0ZXh0UmFuZ2UuYnVpbGRUZXh0UmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIGxpbmVOdW1iZXIpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KSB7Ci0JCXJldHVybiAodGhpcy5ub2RlID09IG51bGwpID8gZmFsc2UgOiB0aGlzLm5vZGUuY29udGFpbnModGV4dE9mZnNldCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIFJlZmFjdG9yaW5nIFRleHRFZGl0cyAqKioqKioqKioqCi0JCi0JcHVibGljIERlbGV0ZUVkaXQgY3JlYXRlRGVsZXRlRWRpdCgpIHsKLQkJaW50IGRlbGV0aW9uT2Zmc2V0ID0gZ2V0RGVsZXRpb25PZmZzZXQoKTsKLQkJaW50IGRlbGV0aW9uTGVuZ3RoID0gdGhpcy5ub2RlLmdldEVuZE9mZnNldCgpIC0gZGVsZXRpb25PZmZzZXQ7Ci0JCXJldHVybiBuZXcgRGVsZXRlRWRpdChkZWxldGlvbk9mZnNldCwgZGVsZXRpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Tm9kZUVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMubm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWxldGlvbiBvZmZzZXQgbmVlZHMgdG8gaW5jbHVkZSBhbnkgdGV4dCB0aGF0IGlzIGJlZm9yZSB0aGUgbm9kZQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RGVsZXRpb25PZmZzZXQoKSB7Ci0JCWludCBlbXB0eVRleHRMZW5ndGggPSAwOwotCQlOb2RlIHByZXZpb3VzU2libGluZyA9IHRoaXMubm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsICYmIHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQllbXB0eVRleHRMZW5ndGggPSAoKFRleHQpIHByZXZpb3VzU2libGluZykuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubm9kZS5nZXRTdGFydE9mZnNldCgpIC0gZW1wdHlUZXh0TGVuZ3RoOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjdXN0b20gYWRhcHRlciBsaXN0ICoqKioqKioqKioKLQotCXByb3RlY3RlZCBzdGF0aWMgY2xhc3MgWG1sRUFkYXB0ZXJMaXN0PEUgZXh0ZW5kcyBPYmplY3QgJiBBZGFwdGVyPgotCQlleHRlbmRzIEVBZGFwdGVyTGlzdDxFPgotCXsKLQkJcHVibGljIFhtbEVBZGFwdGVyTGlzdChBYnN0cmFjdEpwYUVPYmplY3QganBhRU9iamVjdCkgewotCQkJc3VwZXIoanBhRU9iamVjdCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlkQWRkKGludCBpbmRleCwgRSBuZXdPYmplY3QpIHsKLQkJCXN1cGVyLmRpZEFkZChpbmRleCwgbmV3T2JqZWN0KTsKLQkJCWlmIChuZXdPYmplY3QgaW5zdGFuY2VvZiBFTUYyRE9NQWRhcHRlcikgewotCQkJCU9iamVjdCBuID0gKChFTUYyRE9NQWRhcHRlcikgbmV3T2JqZWN0KS5nZXROb2RlKCk7Ci0JCQkJaWYgKG4gaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQkoKEFic3RyYWN0SnBhRU9iamVjdCkgdGhpcy5ub3RpZmllcikubm9kZSA9IChJRE9NTm9kZSkgbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlkUmVtb3ZlKGludCBpbmRleCwgRSBvbGRPYmplY3QpIHsKLQkJCWlmICgob2xkT2JqZWN0IGluc3RhbmNlb2YgRU1GMkRPTUFkYXB0ZXIpICYmCi0JCQkJCSgoKEVNRjJET01BZGFwdGVyKSBvbGRPYmplY3QpLmdldE5vZGUoKSA9PSAoKEFic3RyYWN0SnBhRU9iamVjdCkgdGhpcy5ub3RpZmllcikubm9kZSkpIHsKLQkJCQkoKEFic3RyYWN0SnBhRU9iamVjdCkgdGhpcy5ub3RpZmllcikubm9kZSA9IG51bGw7Ci0JCQl9Ci0JCQlzdXBlci5kaWRSZW1vdmUoaW5kZXgsIG9sZE9iamVjdCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvQWJzdHJhY3RKcGFSb290RU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UveG1sL0Fic3RyYWN0SnBhUm9vdEVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3MmFjOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvQWJzdHJhY3RKcGFSb290RU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbDsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkudHJhbnNsYXRvcnMuRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLkNvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5UcmFuc2xhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BYnN0cmFjdCBKcGEgUm9vdCBFT2JqZWN0PC9iPjwvZW0+Jy4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0QWJzdHJhY3RKcGFSb290RU9iamVjdCgpCi0gKiBAbW9kZWwga2luZD0iY2xhc3MiIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKcGFSb290RU9iamVjdCBleHRlbmRzIEFic3RyYWN0SnBhRU9iamVjdCBpbXBsZW1lbnRzIEpwYVJvb3RFT2JqZWN0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFZlcnNpb24oKSA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWZXJzaW9uKCkgPGVtPlZlcnNpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2dldFZlcnNpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9IFZFUlNJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U2NoZW1hTG9jYXRpb24oKSA8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlICNnZXRTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNjaGVtYUxvY2F0aW9uKCkgPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHNlZSAjZ2V0U2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgc2NoZW1hTG9jYXRpb24gPSBTQ0hFTUFfTE9DQVRJT05fRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKcGFSb290RU9iamVjdCgpCi0JewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkKLQl7Ci0JCXJldHVybiBDb21tb25QYWNrYWdlLkxpdGVyYWxzLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VmVyc2lvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRWZXJzaW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZSNnZXRKcGFSb290RU9iamVjdF9WZXJzaW9uKCkKLQkgKiBAbW9kZWwgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0JewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3QjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0VmVyc2lvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFZlcnNpb25HZW4oU3RyaW5nIG5ld1ZlcnNpb24pCi0JewotCQlTdHJpbmcgb2xkVmVyc2lvbiA9IHZlcnNpb247Ci0JCXZlcnNpb24gPSBuZXdWZXJzaW9uOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1ZFUlNJT04sIG9sZFZlcnNpb24sIHZlcnNpb24pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgbmV3VmVyc2lvbikgewotCQlzZXRWZXJzaW9uR2VuKG5ld1ZlcnNpb24pOwotCQlzZXRTY2hlbWFMb2NhdGlvbihidWlsZFNjaGVtYUxvY2F0aW9uU3RyaW5nKGdldE5hbWVzcGFjZSgpLCBnZXRTY2hlbWFMb2NhdGlvbkZvclZlcnNpb24obmV3VmVyc2lvbikpKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2NoZW1hIExvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TY2hlbWEgTG9jYXRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRTY2hlbWFMb2NhdGlvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3RfU2NoZW1hTG9jYXRpb24oKQotCSAqIEBtb2RlbCByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTY2hlbWFMb2NhdGlvbigpCi0JewotCQlyZXR1cm4gc2NoZW1hTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0I2dldFNjaGVtYUxvY2F0aW9uIDxlbT5TY2hlbWEgTG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0U2NoZW1hTG9jYXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWFMb2NhdGlvbihTdHJpbmcgbmV3U2NoZW1hTG9jYXRpb24pCi0JewotCQlTdHJpbmcgb2xkU2NoZW1hTG9jYXRpb24gPSBzY2hlbWFMb2NhdGlvbjsKLQkJc2NoZW1hTG9jYXRpb24gPSBuZXdTY2hlbWFMb2NhdGlvbjsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19TQ0hFTUFfTE9DQVRJT04sIG9sZFNjaGVtYUxvY2F0aW9uLCBzY2hlbWFMb2NhdGlvbikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1ZFUlNJT046Ci0JCQkJcmV0dXJuIGdldFZlcnNpb24oKTsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19TQ0hFTUFfTE9DQVRJT046Ci0JCQkJcmV0dXJuIGdldFNjaGVtYUxvY2F0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpCi0JewotCQlzd2l0Y2ggKGZlYXR1cmVJRCkKLQkJewotCQkJY2FzZSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1ZFUlNJT046Ci0JCQkJc2V0VmVyc2lvbigoU3RyaW5nKW5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OOgotCQkJCXNldFNjaGVtYUxvY2F0aW9uKChTdHJpbmcpbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKQotCXsKLQkJc3dpdGNoIChmZWF0dXJlSUQpCi0JCXsKLQkJCWNhc2UgQ29tbW9uUGFja2FnZS5BQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OOgotCQkJCXNldFZlcnNpb24oVkVSU0lPTl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlzZXRTY2hlbWFMb2NhdGlvbihTQ0hFTUFfTE9DQVRJT05fRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkKLQl7Ci0JCXN3aXRjaCAoZmVhdHVyZUlEKQotCQl7Ci0JCQljYXNlIENvbW1vblBhY2thZ2UuQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fVkVSU0lPTjoKLQkJCQlyZXR1cm4gVkVSU0lPTl9FREVGQVVMVCA9PSBudWxsID8gdmVyc2lvbiAhPSBudWxsIDogIVZFUlNJT05fRURFRkFVTFQuZXF1YWxzKHZlcnNpb24pOwotCQkJY2FzZSBDb21tb25QYWNrYWdlLkFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1NDSEVNQV9MT0NBVElPTjoKLQkJCQlyZXR1cm4gU0NIRU1BX0xPQ0FUSU9OX0VERUZBVUxUID09IG51bGwgPyBzY2hlbWFMb2NhdGlvbiAhPSBudWxsIDogIVNDSEVNQV9MT0NBVElPTl9FREVGQVVMVC5lcXVhbHMoc2NoZW1hTG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQl7Ci0JCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiICh2ZXJzaW9uOiAiKTsKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBzY2hlbWFMb2NhdGlvbjogIik7Ci0JCXJlc3VsdC5hcHBlbmQoc2NoZW1hTG9jYXRpb24pOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2YWxpZGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFRleHRSYW5nZSBnZXRWZXJzaW9uVGV4dFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlVGV4dFJhbmdlKFhNTC5WRVJTSU9OKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB2ZXJzaW9uIC0+IHNjaGVtYSBsb2NhdGlvbiBtYXBwaW5nICoqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXROYW1lc3BhY2UoKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFNjaGVtYUxvY2F0aW9uRm9yVmVyc2lvbihTdHJpbmcgdmVyc2lvbik7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkU2NoZW1hTG9jYXRpb25TdHJpbmcoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIHNjaGVtYUxvY2F0aW9uKSB7Ci0JCXJldHVybiBuYW1lc3BhY2UgKyAnICcgKyBzY2hlbWFMb2NhdGlvbjsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiB0cmFuc2xhdG9ycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkVmVyc2lvblRyYW5zbGF0b3IoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zKSB7Ci0JCXJldHVybiBuZXcgRW51bWVyYXRlZFZhbHVlVHJhbnNsYXRvcigKLQkJCQlYTUwuVkVSU0lPTiwgCi0JCQkJQ29tbW9uUGFja2FnZS5lSU5TVEFOQ0UuZ2V0SnBhUm9vdEVPYmplY3RfVmVyc2lvbigpLAotCQkJCVRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEVudW1lcmF0ZWRPYmplY3RWYWx1ZXMoKSB7Ci0JCQkJcmV0dXJuIHZlcnNpb25zVG9TY2hlbWFMb2NhdGlvbnMua2V5U2V0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgVHJhbnNsYXRvciBidWlsZE5hbWVzcGFjZVRyYW5zbGF0b3IoU3RyaW5nIG5hbWVzcGFjZSkgewotCQlyZXR1cm4gbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUwuTkFNRVNQQUNFLCBuYW1lc3BhY2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFRyYW5zbGF0b3IgYnVpbGRTY2hlbWFOYW1lc3BhY2VUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbnN0YW50QXR0cmlidXRlVHJhbnNsYXRvcihYTUwuTkFNRVNQQUNFX1hTSSwgWE1MLlhTSV9OQU1FU1BBQ0VfVVJMKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN0YXRpYyBUcmFuc2xhdG9yIGJ1aWxkU2NoZW1hTG9jYXRpb25UcmFuc2xhdG9yKAotCQkJZmluYWwgU3RyaW5nIG5hbWVzcGFjZSwKLQkJCWZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmVyc2lvbnNUb1NjaGVtYUxvY2F0aW9ucykgewotCQkKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGVkVmFsdWVUcmFuc2xhdG9yKAotCQkJCVhNTC5YU0lfU0NIRU1BX0xPQ0FUSU9OLCAKLQkJCQlDb21tb25QYWNrYWdlLmVJTlNUQU5DRS5nZXRKcGFSb290RU9iamVjdF9TY2hlbWFMb2NhdGlvbigpLAotCQkJCVRyYW5zbGF0b3IuRE9NX0FUVFJJQlVURSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEVudW1lcmF0ZWRPYmplY3RWYWx1ZXMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPFN0cmluZywgU3RyaW5nPih2ZXJzaW9uc1RvU2NoZW1hTG9jYXRpb25zLnZhbHVlcygpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShTdHJpbmcgbmV4dCkgewotCQkJCQkJcmV0dXJuIGJ1aWxkU2NoZW1hTG9jYXRpb25TdHJpbmcobmFtZXNwYWNlLCBuZXh0KTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07CQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9Db21tb25GYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvQ29tbW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzVkZTFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9Db21tb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5wbHVnaW4uRWNvcmVQbHVnaW47Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25GYWN0b3J5IGV4dGVuZHMgRUZhY3RvcnlJbXBsCi17Ci0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1vbkZhY3RvcnkgZUlOU1RBTkNFID0gaW5pdCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZGVmYXVsdCBmYWN0b3J5IGltcGxlbWVudGF0aW9uLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29tbW9uRmFjdG9yeSBpbml0KCkKLQl7Ci0JCXRyeQotCQl7Ci0JCQlDb21tb25GYWN0b3J5IHRoZUNvbW1vbkZhY3RvcnkgPSAoQ29tbW9uRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeSgianB0LmNvbW1vbi54bWkiKTsgCi0JCQlpZiAodGhlQ29tbW9uRmFjdG9yeSAhPSBudWxsKQotCQkJewotCQkJCXJldHVybiB0aGVDb21tb25GYWN0b3J5OwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotCQl7Ci0JCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gbmV3IENvbW1vbkZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBDb21tb25GYWN0b3J5KCkKLQl7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVPYmplY3QgY3JlYXRlKEVDbGFzcyBlQ2xhc3MpCi0JewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkKLQkJewotCQkJZGVmYXVsdDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1vblBhY2thZ2UgZ2V0Q29tbW9uUGFja2FnZSgpCi0JewotCQlyZXR1cm4gKENvbW1vblBhY2thZ2UpZ2V0RVBhY2thZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBkZXByZWNhdGVkCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBDb21tb25QYWNrYWdlIGdldFBhY2thZ2UoKQotCXsKLQkJcmV0dXJuIENvbW1vblBhY2thZ2UuZUlOU1RBTkNFOwotCX0KLQotfSAvL0NvbW1vbkZhY3RvcnkKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9Db21tb25QYWNrYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvQ29tbW9uUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMzYmFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9Db21tb25QYWNrYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1QYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Pcm1WMl8wUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS52Ml8wLlBlcnNpc3RlbmNlVjJfMFBhY2thZ2U7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgotICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAotICogPHVsPgotICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgotICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KLSAqIDwvdWw+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vbkZhY3RvcnkKLSAqIEBtb2RlbCBraW5kPSJwYWNrYWdlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgQ29tbW9uUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlSW1wbAotewotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5BTUUgPSAieG1sIjsKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgZU5TX1VSSSA9ICJqcHQuY29tbW9uLnhtaSI7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwiOwotCi0JLyoqCi0JICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENvbW1vblBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5Db21tb25QYWNrYWdlLmluaXQoKTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCA8ZW0+SnBhIFJvb3QgRU9iamVjdDwvZW0+fScgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZSNnZXRKcGFSb290RU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpQQV9ST09UX0VPQkpFQ1QgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEpQQV9ST09UX0VPQkpFQ1RfX1ZFUlNJT04gPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5KcGEgUm9vdCBFT2JqZWN0PC9lbT4nIGNsYXNzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSlBBX1JPT1RfRU9CSkVDVF9GRUFUVVJFX0NPVU5UID0gMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0IDxlbT5BYnN0cmFjdCBKcGEgUm9vdCBFT2JqZWN0PC9lbT59JyBjbGFzcy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0QWJzdHJhY3RKcGFSb290RU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1QgPSAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1RfX1ZFUlNJT04gPSBKUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUJTVFJBQ1RfSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OID0gSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkFic3RyYWN0IEpwYSBSb290IEVPYmplY3Q8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBQlNUUkFDVF9KUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgPSBKUEFfUk9PVF9FT0JKRUNUX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgYWJzdHJhY3RKcGFSb290RU9iamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBqcGFSb290RU9iamVjdEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKLQkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KLQkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCi0JICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKLQkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAotCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIENvbW1vblBhY2thZ2UoKQotCXsKLQkJc3VwZXIoZU5TX1VSSSwgQ29tbW9uRmFjdG9yeS5lSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KLQkgKiAKLQkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIENvbW1vblBhY2thZ2UjZUlOU1RBTkNFfSB3aGVuIHRoYXQgZmllbGQgaXMgYWNjZXNzZWQuCi0JICogQ2xpZW50cyBzaG91bGQgbm90IGludm9rZSBpdCBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBzaG91bGQgc2ltcGx5IGFjY2VzcyB0aGF0IGZpZWxkIHRvIG9idGFpbiB0aGUgcGFja2FnZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbW1vblBhY2thZ2UgaW5pdCgpCi0JewotCQlpZiAoaXNJbml0ZWQpIHJldHVybiAoQ29tbW9uUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShDb21tb25QYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKLQkJQ29tbW9uUGFja2FnZSB0aGVDb21tb25QYWNrYWdlID0gKENvbW1vblBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIENvbW1vblBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXQoZU5TX1VSSSkgOiBuZXcgQ29tbW9uUGFja2FnZSgpKTsKLQotCQlpc0luaXRlZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCi0JCUVjb3JlUGFja2FnZS5lSU5TVEFOQ0UuZUNsYXNzKCk7Ci0KLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgaW50ZXJkZXBlbmRlbmNpZXMKLQkJT3JtUGFja2FnZSB0aGVPcm1QYWNrYWdlID0gKE9ybVBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBPcm1QYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoT3JtUGFja2FnZS5lTlNfVVJJKSA6IE9ybVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJT3JtVjJfMFBhY2thZ2UgdGhlT3JtVjJfMFBhY2thZ2UgPSAoT3JtVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9ybVYyXzBQYWNrYWdlLmVOU19VUkkpIGluc3RhbmNlb2YgT3JtVjJfMFBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPcm1WMl8wUGFja2FnZS5lTlNfVVJJKSA6IE9ybVYyXzBQYWNrYWdlLmVJTlNUQU5DRSk7Ci0JCVBlcnNpc3RlbmNlUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVBhY2thZ2UgPSAoUGVyc2lzdGVuY2VQYWNrYWdlKShFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVBhY2thZ2UgPyBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShQZXJzaXN0ZW5jZVBhY2thZ2UuZU5TX1VSSSkgOiBQZXJzaXN0ZW5jZVBhY2thZ2UuZUlOU1RBTkNFKTsKLQkJUGVyc2lzdGVuY2VWMl8wUGFja2FnZSB0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID0gKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UpKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZU5TX1VSSSkgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoUGVyc2lzdGVuY2VWMl8wUGFja2FnZS5lTlNfVVJJKSA6IFBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuZUlOU1RBTkNFKTsKLQotCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cwotCQl0aGVDb21tb25QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVPcm1QYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVPcm1WMl8wUGFja2FnZS5jcmVhdGVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlUGVyc2lzdGVuY2VQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVQZXJzaXN0ZW5jZVYyXzBQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKLQkJdGhlQ29tbW9uUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZU9ybVBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVPcm1WMl8wUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlUGFja2FnZS5pbml0aWFsaXplUGFja2FnZUNvbnRlbnRzKCk7Ci0JCXRoZVBlcnNpc3RlbmNlVjJfMFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOwotCi0JCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKLQkJdGhlQ29tbW9uUGFja2FnZS5mcmVlemUoKTsKLQotICAKLQkJLy8gVXBkYXRlIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIHRoZSBwYWNrYWdlCi0JCUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLnB1dChDb21tb25QYWNrYWdlLmVOU19VUkksIHRoZUNvbW1vblBhY2thZ2UpOwotCQlyZXR1cm4gdGhlQ29tbW9uUGFja2FnZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQWJzdHJhY3RKcGFSb290RU9iamVjdCA8ZW0+QWJzdHJhY3QgSnBhIFJvb3QgRU9iamVjdDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BYnN0cmFjdCBKcGEgUm9vdCBFT2JqZWN0PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5BYnN0cmFjdEpwYVJvb3RFT2JqZWN0Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0QWJzdHJhY3RKcGFSb290RU9iamVjdCgpCi0JewotCQlyZXR1cm4gYWJzdHJhY3RKcGFSb290RU9iamVjdEVDbGFzczsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QgPGVtPkpwYSBSb290IEVPYmplY3Q8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+SnBhIFJvb3QgRU9iamVjdDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXRKcGFSb290RU9iamVjdCgpCi0JewotCQlyZXR1cm4ganBhUm9vdEVPYmplY3RFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVJvb3RFT2JqZWN0I2dldFZlcnNpb24gPGVtPlZlcnNpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5WZXJzaW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCNnZXRWZXJzaW9uKCkKLQkgKiBAc2VlICNnZXRKcGFSb290RU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpwYVJvb3RFT2JqZWN0X1ZlcnNpb24oKQotCXsKLQkJcmV0dXJuIChFQXR0cmlidXRlKWpwYVJvb3RFT2JqZWN0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVJvb3RFT2JqZWN0I2dldFNjaGVtYUxvY2F0aW9uIDxlbT5TY2hlbWEgTG9jYXRpb248L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TY2hlbWEgTG9jYXRpb248L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVJvb3RFT2JqZWN0I2dldFNjaGVtYUxvY2F0aW9uKCkKLQkgKiBAc2VlICNnZXRKcGFSb290RU9iamVjdCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldEpwYVJvb3RFT2JqZWN0X1NjaGVtYUxvY2F0aW9uKCkKLQl7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSlqcGFSb290RU9iamVjdEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIENvbW1vbkZhY3RvcnkgZ2V0Q29tbW9uRmFjdG9yeSgpCi0JewotCQlyZXR1cm4gKENvbW1vbkZhY3RvcnkpZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NyZWF0ZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIG1ldGEtbW9kZWwgb2JqZWN0cyBmb3IgdGhlIHBhY2thZ2UuICBUaGlzIG1ldGhvZCBpcwotCSAqIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzQ3JlYXRlZCkgcmV0dXJuOwotCQlpc0NyZWF0ZWQgPSB0cnVlOwotCi0JCS8vIENyZWF0ZSBjbGFzc2VzIGFuZCB0aGVpciBmZWF0dXJlcwotCQlhYnN0cmFjdEpwYVJvb3RFT2JqZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1QpOwotCi0JCWpwYVJvb3RFT2JqZWN0RUNsYXNzID0gY3JlYXRlRUNsYXNzKEpQQV9ST09UX0VPQkpFQ1QpOwotCQljcmVhdGVFQXR0cmlidXRlKGpwYVJvb3RFT2JqZWN0RUNsYXNzLCBKUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShqcGFSb290RU9iamVjdEVDbGFzcywgSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tcGxldGUgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBwYWNrYWdlIGFuZCBpdHMgbWV0YS1tb2RlbC4gIFRoaXMKLQkgKiBtZXRob2QgaXMgZ3VhcmRlZCB0byBoYXZlIG5vIGFmZmVjdCBvbiBhbnkgaW52b2NhdGlvbiBidXQgaXRzIGZpcnN0LgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCXsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKLQkJaXNJbml0aWFsaXplZCA9IHRydWU7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCi0JCXNldE5hbWUoZU5BTUUpOwotCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKLQkJc2V0TnNVUkkoZU5TX1VSSSk7Ci0KLQkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJYWJzdHJhY3RKcGFSb290RU9iamVjdEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEpwYVJvb3RFT2JqZWN0KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoYWJzdHJhY3RKcGFSb290RU9iamVjdEVDbGFzcywgQWJzdHJhY3RKcGFSb290RU9iamVjdC5jbGFzcywgIkFic3RyYWN0SnBhUm9vdEVPYmplY3QiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQotCQlpbml0RUNsYXNzKGpwYVJvb3RFT2JqZWN0RUNsYXNzLCBKcGFSb290RU9iamVjdC5jbGFzcywgIkpwYVJvb3RFT2JqZWN0IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0SnBhUm9vdEVPYmplY3RfVmVyc2lvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmVyc2lvbiIsIG51bGwsIDEsIDEsIEpwYVJvb3RFT2JqZWN0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOwotCQlpbml0RUF0dHJpYnV0ZShnZXRKcGFSb290RU9iamVjdF9TY2hlbWFMb2NhdGlvbigpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic2NoZW1hTG9jYXRpb24iLCBudWxsLCAxLCAxLCBKcGFSb290RU9iamVjdC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKLQotCQkvLyBDcmVhdGUgcmVzb3VyY2UKLQkJY3JlYXRlUmVzb3VyY2UoZU5TX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiBEZWZpbmVzIGxpdGVyYWxzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRoYXQgcmVwcmVzZW50Ci0JICogPHVsPgotCSAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KLQkgKiAgIDxsaT5lYWNoIGZlYXR1cmUgb2YgZWFjaCBjbGFzcyw8L2xpPgotCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgotCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+Ci0JICogPC91bD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXRlcmFscwotCXsKLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3QgPGVtPkFic3RyYWN0IEpwYSBSb290IEVPYmplY3Q8L2VtPn0nIGNsYXNzLgotCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkFic3RyYWN0SnBhUm9vdEVPYmplY3QKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0QWJzdHJhY3RKcGFSb290RU9iamVjdCgpCi0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUNsYXNzIEFCU1RSQUNUX0pQQV9ST09UX0VPQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0QWJzdHJhY3RKcGFSb290RU9iamVjdCgpOwotCi0JCS8qKgotCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCA8ZW0+SnBhIFJvb3QgRU9iamVjdDwvZW0+fScgY2xhc3MuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3QoKQotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVDbGFzcyBKUEFfUk9PVF9FT0JKRUNUID0gZUlOU1RBTkNFLmdldEpwYVJvb3RFT2JqZWN0KCk7Ci0KLQkJLyoqCi0JCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5WZXJzaW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KLQkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JCSAqIEBnZW5lcmF0ZWQKLQkJICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRUF0dHJpYnV0ZSBKUEFfUk9PVF9FT0JKRUNUX19WRVJTSU9OID0gZUlOU1RBTkNFLmdldEpwYVJvb3RFT2JqZWN0X1ZlcnNpb24oKTsKLQotCQkvKioKLQkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlNjaGVtYSBMb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCi0JCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCQkgKiBAZ2VuZXJhdGVkCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIEVBdHRyaWJ1dGUgSlBBX1JPT1RfRU9CSkVDVF9fU0NIRU1BX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldEpwYVJvb3RFT2JqZWN0X1NjaGVtYUxvY2F0aW9uKCk7Ci0KLQl9Ci0KLX0gLy9Db21tb25QYWNrYWdlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvRW1mVG9vbHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9FbWZUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ2NTZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9FbWZUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgRW1mVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEVPYmplY3Q+IFQgY3JlYXRlKEVGYWN0b3J5IGVGYWN0b3J5LCBFQ2xhc3MgZUNsYXNzLCBDbGFzczxUPiBqYXZhQ2xhc3MpIHsKLQkJZm9yIChFQ2xhc3NpZmllciBmYWN0b3J5RUNsYXNzaWZpZXIgOiBlRmFjdG9yeS5nZXRFUGFja2FnZSgpLmdldEVDbGFzc2lmaWVycygpKSB7Ci0JCQlpZiAoZmFjdG9yeUVDbGFzc2lmaWVyIGluc3RhbmNlb2YgRUNsYXNzKSB7Ci0JCQkJRUNsYXNzIGZhY3RvcnlFQ2xhc3MgPSAoRUNsYXNzKSBmYWN0b3J5RUNsYXNzaWZpZXI7Ci0JCQkJaWYgKGVDbGFzcy5pc1N1cGVyVHlwZU9mKGZhY3RvcnlFQ2xhc3MpKSB7Ci0JCQkJCXJldHVybiBqYXZhQ2xhc3MuY2FzdChlRmFjdG9yeS5jcmVhdGUoZmFjdG9yeUVDbGFzcykpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGYWN0b3J5IGRvZXMgbm90IHN1cHBvcnQgb2JqZWN0cyBvZiB0eXBlIFwnIiArIGVDbGFzcy5nZXROYW1lKCkgKyAnXCcnKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9KcGFFT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvSnBhRU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2I0ZGJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9KcGFFT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkRlbGV0ZUVkaXQ7Ci0KLS8qKgotICogQ29tbW9uIERhbGkgYmVoYXZpb3IgZm9yIEVNRiBvYmplY3RzLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhRU9iamVjdAotCWV4dGVuZHMgRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFsbCB0aGUgb2JqZWN0J3MgRU1GIGZlYXR1cmVzIGFyZSAidW5zZXQiLgotCSAqLwotCWJvb2xlYW4gaXNVbnNldCgpOwotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0J3MgdGV4dCByZXByZXNlbnRhdGlvbiBjb250YWlucyB0aGUgdGV4dCBvZmZzZXQKLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zT2Zmc2V0KGludCB0ZXh0T2Zmc2V0KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSB0byBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLiAgVGhpcyBpcyB0aGUgc291cmNlCi0JICogcmFuZ2UgdGhhdCB3aWxsIGJlIGhpZ2hsaWdodGVkIGZvciBhIHZhbGlkYXRpb24gZXJyb3IuCi0JICovCi0JVGV4dFJhbmdlIGdldFZhbGlkYXRpb25UZXh0UmFuZ2UoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGV4dCByYW5nZSB0byBiZSB1c2VkIGZvciBzZWxlY3Rpb24uICBUaGlzIGlzIHRoZSBzb3VyY2UKLQkgKiByYW5nZSB0aGF0IHdpbGwgYmUgaGlnaGxpZ2h0ZWQgd2hlbiBzZWxlY3RpbmcgaW4gdGhlIHN0cnVjdHVyZSB2aWV3LgotCSAqLwotCVRleHRSYW5nZSBnZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQotCi0JLy8gKioqKioqKioqKiByZWZhY3RvcmluZyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBDcmVhdGUgYSB0ZXh0IERlbGV0ZUVkaXQgZm9yIGRlbGV0aW5nIHRoZSBlbnRpcmUgSURPTU5vZGUgYW5kIGFueSB0ZXh0IHRoYXQgcHJlY2VkZXMgaXQuCi0JICovCi0JRGVsZXRlRWRpdCBjcmVhdGVEZWxldGVFZGl0KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvSnBhUm9vdEVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9KcGFSb290RU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FhMzI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9KcGFSb290RU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkpwYSBSb290IEVPYmplY3Q8L2I+PC9lbT4nLgotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICoKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QjZ2V0VmVyc2lvbiA8ZW0+VmVyc2lvbjwvZW0+fTwvbGk+Ci0gKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCNnZXRTY2hlbWFMb2NhdGlvbiA8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3QoKQotICogQG1vZGVsIGtpbmQ9ImNsYXNzIiBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgotICogQGV4dGVuZHMgSnBhRU9iamVjdAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVJvb3RFT2JqZWN0IGV4dGVuZHMgSnBhRU9iamVjdAotewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlZlcnNpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlZlcnNpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmVyc2lvbjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0VmVyc2lvbihTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkNvbW1vblBhY2thZ2UjZ2V0SnBhUm9vdEVPYmplY3RfVmVyc2lvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFSb290RU9iamVjdCNnZXRWZXJzaW9uIDxlbT5WZXJzaW9uPC9lbT59JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5WZXJzaW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRWZXJzaW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TY2hlbWEgTG9jYXRpb248L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TY2hlbWEgTG9jYXRpb248L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFNjaGVtYUxvY2F0aW9uKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuQ29tbW9uUGFja2FnZSNnZXRKcGFSb290RU9iamVjdF9TY2hlbWFMb2NhdGlvbigpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3QjZ2V0U2NoZW1hTG9jYXRpb24gPGVtPlNjaGVtYSBMb2NhdGlvbjwvZW0+fScgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U2NoZW1hIExvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTY2hlbWFMb2NhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U2NoZW1hTG9jYXRpb24oU3RyaW5nIHZhbHVlKTsKLQkKLQlUZXh0UmFuZ2UgZ2V0VmVyc2lvblRleHRSYW5nZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UveG1sL0pwYVhtbFJlc291cmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvSnBhWG1sUmVzb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE0ZTI5Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS9yZXNvdXJjZS94bWwvSnBhWG1sUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guV29ya2JlbmNoUmVzb3VyY2VIZWxwZXJCYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLnBsdWdpbi5KRU1VdGlsUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC54bWwuSjJFRVhtbER0REVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlSW1wbDsKLWltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFYbWxSZXNvdXJjZQotCWV4dGVuZHMgVHJhbnNsYXRvclJlc291cmNlSW1wbAotCWltcGxlbWVudHMgSnB0UmVzb3VyY2VNb2RlbAotewotCS8qKgotCSAqIGNhY2hlIHRoZSBjb250ZW50IHR5cGUgLSBpZiB0aGUgY29udGVudCB0eXBlIGNoYW5nZXMsIHRoZSBKUEEgcHJvamVjdAotCSAqIHdpbGwgdGhyb3cgb3V0IHRoZSBKUEEgZmlsZSBob2xkaW5nIHRoZSB4bWwgcmVzb3VyY2UgYW5kIGJ1aWxkIGEgbmV3IG9uZQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJQ29udGVudFR5cGUgY29udGVudFR5cGU7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIFRyYW5zbGF0b3Igcm9vdFRyYW5zbGF0b3I7Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIExpc3RlbmVyTGlzdDxKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI+IHJlc291cmNlTW9kZWxMaXN0ZW5lckxpc3QgPQotCQkJbmV3IExpc3RlbmVyTGlzdDxKcHRSZXNvdXJjZU1vZGVsTGlzdGVuZXI+KEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lci5jbGFzcyk7Ci0JCi0JCi0JcHVibGljIEpwYVhtbFJlc291cmNlKFVSSSB1cmksIFJlbmRlcmVyIHJlbmRlcmVyLCBJQ29udGVudFR5cGUgY29udGVudFR5cGUsIFRyYW5zbGF0b3Igcm9vdFRyYW5zbGF0b3IpIHsKLQkJc3VwZXIodXJpLCByZW5kZXJlcik7Ci0JCXRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZTsKLQkJdGhpcy5yb290VHJhbnNsYXRvciA9IHJvb3RUcmFuc2xhdG9yOwotCX0KLQkKLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5jb250ZW50VHlwZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlKcGFSb290RU9iamVjdCByb290ID0gdGhpcy5nZXRSb290T2JqZWN0KCk7Ci0JCXJldHVybiAocm9vdCA9PSBudWxsKSA/IG51bGwgOiByb290LmdldFZlcnNpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyByZXNvdXJjZSB0eXBlIGV2ZXJ5IHRpbWUoPykuCi0JICovCi0JcHVibGljIEpwdFJlc291cmNlVHlwZSBnZXRSZXNvdXJjZVR5cGUoKSB7Ci0JCVN0cmluZyB2ZXJzaW9uID0gdGhpcy5nZXRWZXJzaW9uKCk7Ci0JCXJldHVybiAoKHRoaXMuY29udGVudFR5cGUgPT0gbnVsbCkgfHwgKHZlcnNpb24gPT0gbnVsbCkpID8KLQkJCW51bGwgOgotCQkJbmV3IEpwdFJlc291cmNlVHlwZSh0aGlzLmNvbnRlbnRUeXBlLCB2ZXJzaW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBCYXNpY05vdGlmaWVySW1wbCBvdmVycmlkZSAqKioqKioqKioqCi0JCi0JLyoqCi0JICogT3ZlcnJpZGUgdG8gZmlyZSBub3RpZmljYXRpb24gb25seSB3aGVuOjx1bD4KLQkgKiA8bGk+dGhlIHJlc291cmNlJ3Mgc3RhdGUgaGFzIGFjdHVhbGx5IGNoYW5nZWQ7IGFuZAotCSAqIDxsaT50aGUgcmVzb3VyY2UgaXMgbG9hZGVkOyBhbmQKLQkgKiA8bGk+dGhlIHJlc291cmNlJ3MgcmVzb3VyY2Ugc2V0IGlzIHN0aWxsIHByZXNlbnQgKEVNRiB3aWxsIGZpcmUgYW4KLQkgKiAgICBub3RpZmljYXRpb24gd2hlbiB0aGUgcmVzb3VyY2Ugc2V0IGlzIHNldCB0byAnbnVsbCcsIGp1c3QgYmVmb3JlCi0JICogICAgdGhlIHJlc291cmNlIGlzICJ1bmxvYWRlZCIgLSB3ZSB3YW50IHRvIHN3YWxsb3cgdGhpcyBub3RpZmljYXRpb24pCi0JICogPC91bD4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlTm90aWZ5KE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJLy8gdW5sb2FkIGV2ZW50cyBjYW4gaGFwcGVuIGJlZm9yZSB0aGUgcmVzb3VyY2Ugc2V0IGlzIHJlbW92ZWQgLSBzaG91bGQgYWx3YXlzIHJlYWN0IHRvIHVubG9hZCBldmVudHMKLQkJaWYgKHRoaXMubG9hZGVkRmxhZ0NsZWFyZWQobm90aWZpY2F0aW9uKSkgewotCQkJc3VwZXIuZU5vdGlmeShub3RpZmljYXRpb24pOwotCQkJaWYgKHRoaXMuaXNSZXZlcnRpbmcoKSkgewotCQkJCXRoaXMucmVzb3VyY2VNb2RlbFJldmVydGVkKCk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMucmVzb3VyY2VNb2RlbFVubG9hZGVkKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoICEgbm90aWZpY2F0aW9uLmlzVG91Y2goKSAmJiB0aGlzLmlzTG9hZGVkKCkgJiYgKHRoaXMucmVzb3VyY2VTZXQgIT0gbnVsbCkpIHsKLQkJCXN1cGVyLmVOb3RpZnkobm90aWZpY2F0aW9uKTsKLQkJCXRoaXMucmVzb3VyY2VNb2RlbENoYW5nZWQoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG5vdGlmaWNhdGlvbiBpbmRpY2F0ZXMgdGhlIHJlc291cmNlIGhhcyBiZWVuCi0JICogdW5sb2FkZWQuCi0JICogd2UgY291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIHN1cHByZXNzIHNvbWUgbm90aWZpY2F0aW9uczsgb3Igd2UgY291bGQganVzdAotCSAqIGNoZWNrIHdoZXRoZXIgJ3Jlc291cmNlU2V0JyBpcyAnbnVsbCcgKHdoaWNoIGlzIHdoYXQgd2UgZG8pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9hZGVkRmxhZ0NsZWFyZWQoTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotCQlyZXR1cm4gKG5vdGlmaWNhdGlvbi5nZXROb3RpZmllcigpID09IHRoaXMpICYmCi0JCQkJKG5vdGlmaWNhdGlvbi5nZXRFdmVudFR5cGUoKSA9PSBOb3RpZmljYXRpb24uU0VUKSAmJgotCQkJCShub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFJlc291cmNlLmNsYXNzKSA9PSBSRVNPVVJDRV9fSVNfTE9BREVEKSAmJgotCQkJCSggISBub3RpZmljYXRpb24uZ2V0TmV3Qm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG5vdGlmaWNhdGlvbiBpbmRpY2F0ZXMgdGhlIHJlc291cmNlJ3MKLQkgKiByZXNvdXJjZSBzZXQgd2FzIGNsZWFyZWQuCi0JICogV2UgY291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIHN1cHByZXNzIHNvbWUgcmVzb3VyY2Ugc2V0IG5vdGlmaWNhdGlvbnM7Ci0JICogb3Igd2UgY291bGQganVzdCBjaGVjayB3aGV0aGVyIDxjb2RlPnJlc291cmNlU2V0PC9jb2RlPiBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+ICh3aGljaCBpcyB3aGF0IHdlIGRvKS8KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXN1bHRTZXRDbGVhcmVkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLQkJcmV0dXJuIChub3RpZmljYXRpb24uZ2V0Tm90aWZpZXIoKSA9PSB0aGlzKSAmJgotCQkJCShub3RpZmljYXRpb24uZ2V0RXZlbnRUeXBlKCkgPT0gTm90aWZpY2F0aW9uLlNFVCkgJiYKLQkJCQkobm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChSZXNvdXJjZS5jbGFzcykgPT0gUkVTT1VSQ0VfX1JFU09VUkNFX1NFVCkgJiYKLQkJCQkobm90aWZpY2F0aW9uLmdldE5ld1ZhbHVlKCkgPT0gbnVsbCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogVHJhbnNsYXRvclJlc291cmNlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBvbmx5IGFwcGxpY2FibGUgZm9yIERURC1iYXNlZCBmaWxlcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBUcmFuc2xhdG9yIGdldFJvb3RUcmFuc2xhdG9yKCkgewotCQlyZXR1cm4gdGhpcy5yb290VHJhbnNsYXRvcjsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBvbmx5IGFwcGxpY2FibGUgZm9yIERURC1iYXNlZCBmaWxlcwotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFB1YmxpY0lkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogb25seSBhcHBsaWNhYmxlIGZvciBEVEQtYmFzZWQgZmlsZXMKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8qKgotCSAqIHRoaXMgc2VlbXMgdG8gYmUgdGhlIGRlZmF1bHQgdmVyc2lvbiBvZiB0aGUgc3BlYyBmb3IgdGhpcyBkb2MKLQkgKiBhbmQgdGhlIGlkIDEwIG1hcHMgdG8gdGhlIHZlcnNpb24gMS4wCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBnZXREZWZhdWx0VmVyc2lvbklEKCkgewotCQlyZXR1cm4gMTA7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFSb290RU9iamVjdCBnZXRSb290T2JqZWN0KCkgewotCQlFT2JqZWN0IHJvb3QgPSBzdXBlci5nZXRSb290T2JqZWN0KCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKEpwYVJvb3RFT2JqZWN0KSByb290OwotCQl9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSByb290IG9iamVjdCBvZiBhIEpQQSBYTUwgcmVzb3VyY2UgbXVzdCBpbXBsZW1lbnQgSnBhUm9vdEVPYmplY3Q6ICIgKyByb290LCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkKLQkvLzI5NjU0NCAtIG92ZXJyaWRlIHRoaXMgdG8gYXZvaWQgaW50ZXJuZXQgYWNjZXNzIGZpbmRpbmcgdGhlIHNjaGVtYSBkdXJpbmcgdGVzdHMKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW50aXR5UmVzb2x2ZXIgZ2V0RW50aXR5UmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBKMkVFWG1sRHRERW50aXR5UmVzb2x2ZXIuSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHVibGljIGJvb2xlYW4gZmlsZUV4aXN0cygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmlsZSgpLmV4aXN0cygpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSUZpbGUgZmlsZSA9IHRoaXMuZ2V0RmlsZSh0aGlzLnVyaSk7Ci0JCXJldHVybiAoZmlsZSAhPSBudWxsKSA/IGZpbGUgOiB0aGlzLmdldENvbnZlcnRlZFVSSUZpbGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElGaWxlIGdldENvbnZlcnRlZFVSSUZpbGUoKSB7Ci0JCWlmICh0aGlzLnJlc291cmNlU2V0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVVSSSBjb252ZXJ0ZWRVUkkgPSB0aGlzLnJlc291cmNlU2V0LmdldFVSSUNvbnZlcnRlcigpLm5vcm1hbGl6ZSh0aGlzLnVyaSk7Ci0JCXJldHVybiB0aGlzLnVyaS5lcXVhbHMoY29udmVydGVkVVJJKSA/IG51bGwgOiB0aGlzLmdldEZpbGUoY29udmVydGVkVVJJKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBFY2xpcHNlIGZpbGUgZm9yIHRoZSBzcGVjaWZpZWQgVVJJLgotCSAqIFRoaXMgVVJJIGlzIGFzc3VtZWQgdG8gYmUgYWJzb2x1dGUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6Ci0JICogICAgIHBsYXRmb3JtOi9yZXNvdXJjZS8uLi4uCi0JICovCi0JcHJvdGVjdGVkIElGaWxlIGdldEZpbGUoVVJJIGZpbGVVUkkpIHsKLQkJaWYgKCAhIFdvcmtiZW5jaFJlc291cmNlSGVscGVyQmFzZS5pc1BsYXRmb3JtUmVzb3VyY2VVUkkoZmlsZVVSSSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBmaWxlTmFtZSA9IFVSSS5kZWNvZGUoZmlsZVVSSS5wYXRoKCkpLnN1YnN0cmluZyhKRU1VdGlsUGx1Z2luLlBMQVRGT1JNX1JFU09VUkNFLmxlbmd0aCgpICsgMSk7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgoZmlsZU5hbWUpKTsKLQl9Ci0JCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldEZpbGUoKS5nZXRQcm9qZWN0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG1vZGlmeShSdW5uYWJsZSBydW5uYWJsZSkgewotCQl0cnkgewotCQkJcnVubmFibGUucnVuKCk7Ci0JCQl0cnkgewotCQkJCXNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCUpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkvLyBpbXBsZW1lbnRhdGlvbiBpbiBUcmFuc2xhdG9yUmVzb3VyY2VJbXBsIGlzIGEgYml0IG9mZi4uLgotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldFVSSSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBKcHRSZXNvdXJjZU1vZGVsIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW1vdmVSZXNvdXJjZU1vZGVsTGlzdGVuZXIoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBub3RpZmljYXRpb25zICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIHJlc291cmNlTW9kZWxDaGFuZ2VkKCkgewotCQlmb3IgKEpwdFJlc291cmNlTW9kZWxMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMucmVzb3VyY2VNb2RlbExpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJbGlzdGVuZXIucmVzb3VyY2VNb2RlbENoYW5nZWQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZU1vZGVsUmV2ZXJ0ZWQoKSB7Ci0JCWZvciAoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsUmV2ZXJ0ZWQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNvdXJjZU1vZGVsVW5sb2FkZWQoKSB7Ci0JCWZvciAoSnB0UmVzb3VyY2VNb2RlbExpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5yZXNvdXJjZU1vZGVsTGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5yZXNvdXJjZU1vZGVsVW5sb2FkZWQodGhpcyk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2FzdCB0aGluZ3MgYmFjayB0byB3aGF0IHRoZXkgYXJlIGluIEVNRiAqKioqKioqKioqCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRUxpc3Q8QWRhcHRlcj4gZUFkYXB0ZXJzKCkgewotCQlyZXR1cm4gc3VwZXIuZUFkYXB0ZXJzKCk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUBPdmVycmlkZQotCXB1YmxpYyBFTGlzdDxFT2JqZWN0PiBnZXRDb250ZW50cygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRlbnRzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UveG1sL1hNTC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvcmVzb3VyY2UveG1sL1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2UxNjEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Jlc291cmNlL3htbC9YTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbDsKLQotLyoqCi0gKiBYTUwtcmVsYXRlZCBzdHVmZi4KLSAqIAotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKiAKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBpbnRlcmZhY2UgWE1MCi17Ci0JU3RyaW5nIFZFUlNJT04gPSAidmVyc2lvbiI7Ci0JCi0JU3RyaW5nIE5BTUVTUEFDRSA9ICJ4bWxucyI7Ci0KLQlTdHJpbmcgTkFNRVNQQUNFX1hTSSA9ICJ4bWxuczp4c2kiOwotCVN0cmluZyBYU0lfTkFNRVNQQUNFX1VSTCA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7Ci0KLQlTdHJpbmcgWFNJX1NDSEVNQV9MT0NBVElPTiA9ICJ4c2k6c2NoZW1hTG9jYXRpb24iOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzZGFiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmNlZjkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDg6NTUgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM4ODVmZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5lZGl0b3IuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTgzN2ViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLWphcnMuY29tcGlsZS5vcmRlciA9IC4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIzYzk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci0KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkiIGZyYWdtZW50PSJmYWxzZSIvPjwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFlOTZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZSA9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEQiBVSQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi91aS9pbnRlcm5hbC9EVFBVaVRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NzNmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3VpL2ludGVybmFsL0RUUFVpVG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LlByb2ZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZ2VuZXJpYy51aS53aXphcmQuTmV3SkRCQ0ZpbHRlcmVkQ1BXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLS8qKgotICogRFRQIFVJIHRvb2xzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVaVRvb2xzIHsKLQotCS8qKgotCSAqIExhdW5jaCB0aGUgRFRQIE5ldyBDb25uZWN0aW9uIFByb2ZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBkYXRhYmFzZSBjb25uZWN0aW9uIHByb2ZpbGUuCi0JICogCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYWRkZWQgcHJvZmlsZSwgb3IgbnVsbCBpZiB0aGUgd2l6YXJkIHdhcyBjYW5jZWxsZWQuCi0JICogVGhlIG5hbWUgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSBEYWxpIGNvbm5lY3Rpb24gcHJvZmlsZSBmcm9tCi0JICogSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZU5ld0Nvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkvLyBGaWx0ZXIgZGF0YXNvdXJjZSBjYXRlZ29yeQotCQlOZXdKREJDRmlsdGVyZWRDUFdpemFyZCAgd2l6YXJkID0gbmV3IE5ld0pEQkNGaWx0ZXJlZENQV2l6YXJkKCk7Ci0JCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHdpemFyZCk7Ci0JCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQotCQlMb2NhbFByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBMb2NhbFByb2ZpbGVMaXN0ZW5lcigpOwotCQlQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmFkZFByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIG5ld0NQTmFtZSA9IG51bGw7Ci0JCWlmICh3aXphcmREaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJLy8gYXNzdW1lIHRoZSBsYXN0IGFkZGVkIHByb2ZpbGUgaXMgdGhlIG9uZSB3ZSB3YW50Ci0JCQluZXdDUE5hbWUgPSBsaXN0ZW5lci5hZGRlZFByb2ZpbGUuZ2V0TmFtZSgpOwotCQl9Ci0JCVByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlyZXR1cm4gbmV3Q1BOYW1lOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFAgcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGlzIGxpc3RlbmVyIHNpbXBseSBob2xkcyBvbiB0byB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBjb25uZWN0aW9uCi0JICogcHJvZmlsZS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxQcm9maWxlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvZmlsZUxpc3RlbmVyIHsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGFkZGVkUHJvZmlsZTsKLQkJCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVBZGRlZChJQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hZGRlZFByb2ZpbGUgPSBwcm9maWxlOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHByb2ZpbGVDaGFuZ2VkKElDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkKLQkJcHVibGljIHZvaWQgcHJvZmlsZURlbGV0ZWQoSUNvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCi0vLwkvLyAqKioqKioqKioqIHZpZXdlciBmaWx0ZXIgKioqKioqKioqKgotLy8KLS8vCXN0YXRpYyBjbGFzcyBMb2NhbFZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0vLwotLy8JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9DQVRFR09SWV9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotLy8KLS8vCQlMb2NhbFZpZXdlckZpbHRlcigpIHsKLS8vCQkJc3VwZXIoKTsKLS8vCQl9Ci0vLwotLy8JCUBPdmVycmlkZQotLy8JCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50RWxlbWVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLS8vCQkJQ1BXaXphcmROb2RlIHdpemFyZE5vZGUgPSAoQ1BXaXphcmROb2RlKSBlbGVtZW50OwotLy8JCQlJUHJvZmlsZVdpemFyZFByb3ZpZGVyIHdpemFyZFByb3ZpZGVyID0gd2l6YXJkTm9kZS5nZXRQcm92aWRlcigpOwotLy8JCQlpZiAod2l6YXJkUHJvdmlkZXIgaW5zdGFuY2VvZiBJV2l6YXJkQ2F0ZWdvcnlQcm92aWRlcikgewotLy8JCQkJcmV0dXJuIGZhbHNlOwotLy8JCQl9Ci0vLwkJCUlDYXRlZ29yeSBjYXRlZ29yeSA9IENvbm5lY3Rpb25Qcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFByb3ZpZGVyKAotLy8JCQkJCQkJKChQcm9maWxlV2l6YXJkUHJvdmlkZXIpIHdpemFyZFByb3ZpZGVyKS5nZXRQcm9maWxlKCkpLmdldENhdGVnb3J5KCk7Ci0vLwkJCQotLy8JCQkvLyBPbmx5IGRpc3BsYXkgd2l6YXJkcyBiZWxvbmcgdG8gZGF0YWJhc2UgY2F0ZWdvcnkKLS8vCQkJd2hpbGUgKGNhdGVnb3J5ICE9IG51bGwpIHsKLS8vCQkJCWlmIChjYXRlZ29yeS5nZXRJZCgpLmVxdWFscyhEQVRBQkFTRV9DQVRFR09SWV9JRCkpIHsKLS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLS8vCQkJCX0KLS8vCQkJCWNhdGVnb3J5ID0gY2F0ZWdvcnkuZ2V0UGFyZW50KCk7Ci0vLwkJCX0KLS8vCQkJcmV0dXJuIGZhbHNlOwotLy8JCX0KLS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY2xhc3NwYXRoIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDRlODYxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiOGU5Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5kYjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmI2NjA1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDg6NDAgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3NDYzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuamR0LmNsYXNzcGF0aDtidW5kbGUtdmVyc2lvbj0iWzEuMC4xLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmVkaXRvci5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyO3gtaW50ZXJuYWw6PXRydWUKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTI1NzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTJiNGVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5kYiI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5kYiIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Mjg4ODcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERCCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0NhdGFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTc2ZDNmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ2F0YWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlIGNhdGFsb2cKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ2F0YWxvZwotCWV4dGVuZHMgU2NoZW1hQ29udGFpbmVyCi17Ci0JLy8gbm90aGluZyB5ZXQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0NvbHVtbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI0ZDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29sdW1uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkphdmFUeXBlOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbHVtbgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBDb2x1bW4KLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4ncyB0YWJsZS4KLQkgKi8KLQlUYWJsZSBnZXRUYWJsZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cmFpbnRzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgcGFydCBvZiBpdHMgdGFibGUncyBwcmltYXJ5IGtleS4KLQkgKi8KLQlib29sZWFuIGlzUGFydE9mUHJpbWFyeUtleSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBwYXJ0IG9mIG9uZSBvZiBpdHMgdGFibGUncyBmb3JlaWduIGtleXMuCi0JICovCi0JYm9vbGVhbiBpc1BhcnRPZkZvcmVpZ25LZXkoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgcGFydCBvZiBhIHVuaXF1ZSBjb25zdHJhaW50IGRlZmluZWQgZm9yIGl0cwotCSAqIHRhYmxlLgotCSAqLwotCWJvb2xlYW4gaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgY29sdW1uIGlzIG51bGxhYmxlLgotCSAqLwotCWJvb2xlYW4gaXNOdWxsYWJsZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGRhdGEgdHlwZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvbHVtbidzIGRhdGF0eXBlLgotCSAqLwotCVN0cmluZyBnZXREYXRhVHlwZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb2x1bW4ncyB0eXBlIGlzIG51bWVyaWMuCi0JICovCi0JYm9vbGVhbiBpc051bWVyaWMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uJ3MgcHJlY2lzaW9uIGlmIGl0IGlzIGEgTnVtZXJpY2FsRGF0YVR5cGU7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gLTEuCi0JICovCi0JcHVibGljIGludCBnZXRQcmVjaXNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uJ3Mgc2NhbGUgaWYgaXQgaXMgYW4gRXhhY3ROdW1lcmljRGF0YVR5cGU7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gLTEuCi0JICovCi0JcHVibGljIGludCBnZXRTY2FsZSgpOwotCi0JLyoqCi0JICogSWYgdGhlIGNvbHVtbiBpcyBhIENoYXJhY3RlclN0cmluZ0RhdGFUeXBlLCByZXR1cm4gaXRzIGxlbmd0aDsKLQkgKiBvdGhlcndpc2UsIHJldHVybiAtMS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbHVtbidzIGRhdGF0eXBlIGlzIGEgTE9CIHR5cGUKLQkgKiAoaS5lLiBCTE9CLCBDTE9CLCBvciBOQ0xPQikuCi0JICovCi0JYm9vbGVhbiBpc0xPQigpOwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgdHlwZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlLgotCSAqLwotCVN0cmluZyBnZXRKYXZhVHlwZURlY2xhcmF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlLgotCSAqLwotCUphdmFUeXBlIGdldEphdmFUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBKYXZhIHR5cGUgZGVjbGFyYXRpb24gdGhhdCBpcyByZWFzb25hYmx5Ci0JICogc2ltaWxhciB0byB0aGUgY29sdW1uJ3MgZGF0YSB0eXBlIGFuZCBzdWl0YWJsZSBmb3IgdXNlIGFzIGEKLQkgKiBwcmltYXJ5IGtleSBmaWVsZC4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiBhIEphdmEgdHlwZSB0aGF0IGlzIHJlYXNvbmFibHkKLQkgKiBzaW1pbGFyIHRvIHRoZSBjb2x1bW4ncyBkYXRhIHR5cGUgYW5kIHN1aXRhYmxlIGZvciB1c2UgYXMgYQotCSAqIHByaW1hcnkga2V5IGZpZWxkLgotCSAqLwotCUphdmFUeXBlIGdldFByaW1hcnlLZXlKYXZhVHlwZSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWNhZTRmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYjsKLQotLyoqCi0gKiBBbiBlbXB0eSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29ubmVjdGlvbkxpc3RlbmVyfS4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGNsYXNzIENvbm5lY3Rpb25BZGFwdGVyCi0JaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIKLXsKLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGRhdGFiYXNlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZpZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2NoZW1hQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBTY2hlbWEgc2NoZW1hKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I5MTI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKLQotLyoqCi0gKiBBIDxjb2RlPkNvbm5lY3Rpb25MaXN0ZW5lcjwvY29kZT4gaXMgbm90aWZpZWQgb2YgYW55IGNoYW5nZXMgdG8gYSBjb25uZWN0aW9uLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvbkxpc3RlbmVyCi0JZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0JcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCXB1YmxpYyBib29sZWFuIG9rVG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKTsKLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSk7Ci0JcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpOwotCi0JcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKTsKLQlwdWJsaWMgdm9pZCBjYXRhbG9nQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDYXRhbG9nIGNhdGFsb2cpOwotCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSk7Ci0JcHVibGljIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNlcXVlbmNlIHNlcXVlbmNlKTsKLQlwdWJsaWMgdm9pZCB0YWJsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgVGFibGUgdGFibGUpOwotCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbik7Ci0JcHVibGljIHZvaWQgZm9yZWlnbktleUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg4MTU4Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci0KLS8qKgotICogRGF0YWJhc2UgY29ubmVjdGlvbiBwcm9maWxlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9maWxlCi0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdAotewotCS8vICoqKioqKioqKiogcHJvcGVydGllcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSdzIGRhdGFiYXNlLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzIGluYWN0aXZlLgotCSAqLwotCURhdGFiYXNlIGdldERhdGFiYXNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gSUQgb2YgdGhlIHByb3ZpZGVyIG1hbmFnaW5nIHRoZSBEVFAgcHJvZmlsZS4KLQkgKi8KLQlTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUncyBzdGF0aWMgSUQuCi0JICovCi0JU3RyaW5nIGdldEluc3RhbmNlSUQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCBkYXRhYmFzZSBuYW1lLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZU5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UgcHJvZHVjdCBuYW1lLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UgdmVuZG9yLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSB2ZXJzaW9uLgotCSAqLwotCVN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZHJpdmVyIGNsYXNzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldERyaXZlckNsYXNzTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IGNvbm5lY3Rpb24gVVJMLgotCSAqLwotCVN0cmluZyBnZXRVUkwoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGVmYXVsdCB1c2VyIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldFVzZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdXNlciBwYXNzd29yZC4KLQkgKi8KLQlTdHJpbmcgZ2V0VXNlclBhc3N3b3JkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIERyaXZlciBkZWZpbml0aW9uLgotCSAqLwotCVN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgamFyIGxpc3QgZm9yIHRoZSBhc3NvY2lhdGVkIERyaXZlciBhcyBhIAotCSAqIGNvbW1hLWRlbGltaXRlZCBzdHJpbmcuCi0JICovCi0JU3RyaW5nIGdldERyaXZlckphckxpc3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgYXNzb2NpYXRlZCBEcml2ZXIgZGVmaW5pdGlvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpOwotCi0KLQkvLyAqKioqKioqKioqIGlkZW50aWZpZXJzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIGFsbCBpZGVudGlmaWVycyBhcmUgdG8gYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlCi0JICogZGVsaW1pdGVkLiBUaGlzIGlzIGRldGVybWluZWQgYnkgdGhlIGNsaWVudC1zdXBwbGllZCBkYXRhYmFzZQotCSAqIGlkZW50aWZpZXIgYWRhcHRlci4KLQkgKi8KLQlib29sZWFuIHRyZWF0SWRlbnRpZmllcnNBc0RlbGltaXRlZCgpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHByb2ZpbGUgaXMgZWl0aGVyIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2UKLQkgKiBzZXNzaW9uIG9yIHdvcmtpbmcgb2ZmLWxpbmUgKGkuZS4gaXQgaGFzIGFjY2VzcyB0byBtZXRhLWRhdGEpLgotCSAqIEBzZWUgI2lzQ29ubmVjdGVkKCkKLQkgKiBAc2VlICNpc1dvcmtpbmdPZmZsaW5lKCkKLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBuZWl0aGVyIGNvbm5lY3RlZCB0byBhIGxpdmUgZGF0YWJhc2UKLQkgKiBzZXNzaW9uIG5vciB3b3JraW5nIG9mZi1saW5lIChpLmUuIGl0IGhhcyBhY2Nlc3MgdG8gbWV0YS1kYXRhKS4KLQkgKiBAc2VlICNpc0FjdGl2ZSgpCi0JICovCi0JYm9vbGVhbiBpc0luYWN0aXZlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgcHJvZmlsZSBpcyBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlIHNlc3Npb24KLQkgKiAoaS5lLiB0aGUgbWV0YS1kYXRhIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlKSwgYXMgb3Bwb3NlZCB0byB3b3JraW5nCi0JICogb2ZmLWxpbmUuCi0JICogQHNlZSAjaXNBY3RpdmUoKQotCSAqLwotCWJvb2xlYW4gaXNDb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIG5vdCBjb25uZWN0ZWQgdG8gYSBsaXZlIGRhdGFiYXNlIHNlc3Npb24KLQkgKiAoaS5lLiB0aGUgbWV0YS1kYXRhIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlKSwgYXMgb3Bwb3NlZCB0byB3b3JraW5nCi0JICogb2ZmLWxpbmUuCi0JICogQHNlZSAjaXNDb25uZWN0ZWQoKQotCSAqLwotCWJvb2xlYW4gaXNEaXNjb25uZWN0ZWQoKTsKLQotCS8qKgotCSAqIENvbm5lY3QgdG8gdGhlIGRhdGFiYXNlLgotCSAqIEBzZWUgI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXZvaWQgY29ubmVjdCgpOwotCi0JLyoqCi0JICogRGlzY29ubmVjdCBmcm9tIHRoZSBkYXRhYmFzZS4KLQkgKiBAc2VlICNjb25uZWN0KCkKLQkgKi8KLQl2b2lkIGRpc2Nvbm5lY3QoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgSkRCQyBjb25uZWN0aW9uLgotCSAqLwotCUNvbm5lY3Rpb24gZ2V0SkRCQ0Nvbm5lY3Rpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBvZmYtbGluZSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBwcm9maWxlIGlzIHdvcmtpbmcgb2ZmLWxpbmUgKGkuZS4gdGhlIG1ldGEtZGF0YQotCSAqIGNvbWVzIGZyb20gYSBsb2NhbCBjYWNoZSksIGFzIG9wcG9zZWQgdG8gY29ubmVjdGVkIHRvIGEgbGl2ZQotCSAqIGRhdGFiYXNlIHNlc3Npb24uCi0JICogQHNlZSAjaXNBY3RpdmUoKQotCSAqLwotCWJvb2xlYW4gaXNXb3JraW5nT2ZmbGluZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGNvbm5lY3Rpb24gZmFjdG9yaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKLQkgKiBjb25uZWN0aW9uIHByb2ZpbGUncyBwcm92aWRlciBzdXBwb3J0IHdvcmtpbmcgb2ZmbGluZS4KLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCk7Ci0KLQkvKioKLQkgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGZvciB3b3JraW5nIGluIGFuIG9mZmxpbmUgbW9kZS4KLQkgKiBJZiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGRvZXMgbm90IHN1cHBvcnQgd29ya2luZyBpbiBhbiBvZmZsaW5lIG1vZGUsIG5vCi0JICogZXhjZXB0aW9uIGlzIHRocm93biBhbmQgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlJU3RhdHVzIHNhdmVXb3JrT2ZmbGluZURhdGEoKTsKLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgc3VwcG9ydHMgd29ya2luZyBvZmZsaW5lIGFuZCBkYXRhCi0JICogaGFzIGJlZW4gc2F2ZWQgZm9yIHdvcmtpbmcgb2ZmbGluZS4KLQkgKi8KLQlib29sZWFuIGNhbldvcmtPZmZsaW5lKCk7Ci0KLQkvKioKLQkgKiBCZWdpbiB3b3JraW5nIG9mZi1saW5lLgotCSAqLwotCUlTdGF0dXMgd29ya09mZmxpbmUoKTsKLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQWRkIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiBsaXN0ZW5lciB0byB0aGUgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCXZvaWQgYWRkQ29ubmVjdGlvbkxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGxpc3RlbmVyIGZyb20gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlTdHJpbmcgQ09OTkVDVElPTl9QUk9GSUxFX1RZUEUgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kYi5nZW5lcmljLmNvbm5lY3Rpb25Qcm9maWxlIjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRFJJVkVSX0RFRklOSVRJT05fUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlckRlZmluaXRpb25JRCI7ICAvLyROT04tTkxTLTEkCi0JU3RyaW5nIERSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCA9ICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuZGVmblR5cGUiOyAgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBEUklWRVJfSkFSX0xJU1RfUFJPUF9JRCA9ICJqYXJMaXN0IjsgIC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREFUQUJBU0VfU0FWRV9QV0RfUFJPUF9JRCA9IElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5QUk9QX1BSRUZJWCArICJzYXZlUFdEIjsgIC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2Y0YTk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogQW4gZW1wdHkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXJ9LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVBZGFwdGVyCi0JaW1wbGVtZW50cyBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyCi17Ci0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVBZGRlZChTdHJpbmcgbmFtZSkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Db25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMxNTIxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvZmlsZSBmYWN0b3J5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlcyB0aGUgZmFjdG9yeSBjYW4gd3JhcCB3aXRoCi0JICogbmV3IGNvbm5lY3Rpb24gcHJvZmlsZXMuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhbmQgcmV0dXJuIGEgY29ubmVjdGlvbiBwcm9maWxlIHRoYXQgd3JhcHMgdGhlIERUUCBjb25uZWN0aW9uCi0JICogcHJvZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm8gRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLgotCSAqIFVzZSB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIGlkZW50aWZpZXIgYWRhcHRlciB0byBhbGxvdyBjbGllbnRzIHRvIGNvbnRyb2wgaG93Ci0JICogZGF0YWJhc2UgaWRlbnRpZmllcnMgYXJlIGhhbmRsZWQuCi0JICovCi0JQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBhZGFwdGVyKTsKLQotCS8qKgotCSAqIEJ1aWxkIGFuZCByZXR1cm4gYSBjb25uZWN0aW9uIHByb2ZpbGUgdGhhdCB3cmFwcyB0aGUgRFRQIGNvbm5lY3Rpb24KLQkgKiBwcm9maWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBubyBEVFAgY29ubmVjdGlvbiBwcm9maWxlIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuCi0JICogPHA+Ci0JICogQ2xpZW50cyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHdoZW4gYSBKUEEgcGxhdGZvcm0gaXMgdW5hdmFpbGFibGUKLQkgKiAoZS5nLiBkdXJpbmcgcHJvamVjdCBjcmVhdGlvbikuIFRoZSByZXR1cm5lZCBjb25uZWN0aW9uIHByb2ZpbGUgd2lsbAotCSAqIHVzZSB0aGUgZGVmYXVsdCBkYXRhYmFzZSBpZGVudGlmaWVyIGFkYXB0ZXIuCi0JICovCi0JQ29ubmVjdGlvblByb2ZpbGUgYnVpbGRDb25uZWN0aW9uUHJvZmlsZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgb2YgY2hhbmdlcyB0byB0aGUgRFRQCi0JICogY29ubmVjdGlvbiBwcm9maWxlcy4KLQkgKi8KLQl2b2lkIGFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBsaXN0ZW5lci4KLQkgKi8KLQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0Nvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ViMWU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLS8qKgotICogQSA8Y29kZT5Qcm9maWxlTGlzdGVuZXI8L2NvZGU+IGlzIG5vdGlmaWVkIG9mIGFueSBjaGFuZ2VzIHRvIHRoZSBEVFAgY29ubmVjdGlvbiBwcm9maWxlcy4KLSAqIDxwPgotICogQHNlZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklQcm9maWxlTGlzdGVuZXIKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcgotCWV4dGVuZHMgRXZlbnRMaXN0ZW5lcgotewotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZUFkZGVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFRoZSBzcGVjaWZpZWQgcHJvZmlsZSBoYXMgYmVlbiByZW1vdmVkLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBUaGUgc3BlY2lmaWVkIHByb2ZpbGUgaGFzIGJlZW4gcmVuYW1lZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbmFtZWQoU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFjNDg2Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlCi0JZXh0ZW5kcyBTY2hlbWFDb250YWluZXIKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgRFRQIGRhdGFiYXNlLgotCSAqLwotCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSBnZXREVFBEYXRhYmFzZSgpOwotCi0KLQkvLyAqKioqKioqKioqIHByb3BlcnRpZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZSdzIHZlbmRvci4KLQkgKi8KLQlTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIHZlcnNpb24uCi0JICovCi0JU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9ncyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZGF0YWJhc2Ugc3VwcG9ydHMgY2F0YWxvZ3MuIElmIGl0IGRvZXMsIGFsbCBkYXRhYmFzZQotCSAqIG9iamVjdHMgYXJlIGNvbnRhaW5lZCBieSB0aGUgZGF0YWJhc2UncyBjYXRhbG9nczsgb3RoZXJ3aXNlIGFsbCBkYXRhYmFzZQotCSAqIG9iamVjdHMgYXJlIGNvbnRhaW5lZCBieSB0aGUgZGF0YWJhc2UncyBzY2hlbWF0YS4KLQkgKiA8YnI+Ci0JICogUHJhY3RpY2FsbHkgc3BlYWtpbmc6PHVsPgotCSAqICAgICA8bGk+SWYge0BsaW5rICNzdXBwb3J0c0NhdGFsb2dzKCl9IHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT48dWw+Ci0JICogICAgICAgICA8bGk+e0BsaW5rICNnZXRDYXRhbG9ncygpfSByZXR1cm5zIGNhdGFsb2dzIHRoYXQgY29udGFpbiB0aGUgZGF0YWJhc2UncyBzY2hlbWF0YQotCSAqICAgICAgICAgPGxpPntAbGluayAjZ2V0U2NoZW1hdGEoKX0gcmV0dXJucyBhbiBlbXB0eSBpdGVyYWJsZQotCSAqICAgICA8L3VsPgotCSAqICAgICA8bGk+ZWxzZTx1bD4KLQkgKiAgICAgICAgIDxsaT57QGxpbmsgI2dldENhdGFsb2dzKCl9IHJldHVybnMgYW4gZW1wdHkgaXRlcmFibGUKLQkgKiAgICAgICAgIDxsaT57QGxpbmsgI2dldFNjaGVtYXRhKCl9IHJldHVybnMgdGhlIGRhdGFiYXNlJ3Mgc2NoZW1hdGEKLQkgKiAgICAgPC91bD4KLQkgKiA8L3VsPgotCSAqIFRoaXMgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIHByZXNlbmNlIG9mIGEgImRlZmF1bHQiIGNhdGFsb2cgdGhhdCBjbGllbnRzIGNhbgotCSAqIHVzZSB0byBhbGxvdyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBhIGNhdGFsb2cgdG8gYmUgb3B0aW9uYWw7IGJ1dCBjbGllbnRzCi0JICogbXVzdCBtYW5hZ2UgdGhpcyBleHBsaWNpdGx5LgotCSAqIEBzZWUgI2dldENhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXRTY2hlbWF0YSgpCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhYmxlIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqLwotCUl0ZXJhYmxlPENhdGFsb2c+IGdldENhdGFsb2dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjYXRhbG9ncyB0aGUgZGF0YWJhc2UgY29udGFpbnMuCi0JICogUmV0dXJuIHplcm8gaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICovCi0JaW50IGdldENhdGFsb2dzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSdzIGNhdGFsb2cgbmFtZXMsIHNvcnRlZC4KLQkgKiBSZXR1cm4gYW4gZW1wdHkgaXRlcmFibGUgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICogVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgdXNlciBpcyBzZWxlY3RpbmcgYSBjYXRhbG9nIGZyb20gYSByZWFkLW9ubHkKLQkgKiBjb21iby1ib3ggKGUuZy4gaW4gYSB3aXphcmQpLgotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRhbG9nIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGUgbmFtZSBtdXN0IGJlIGFuIGV4YWN0IG1hdGNoCi0JICogb2YgdGhlIGNhdGFsb2cncyBuYW1lLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKQotCSAqIEBzZWUgI2dldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlDYXRhbG9nIGdldENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlJ3MgY2F0YWxvZyBpZGVudGlmaWVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogUmV0dXJuIGFuIGVtcHR5IGl0ZXJhYmxlIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGFuIGlkZW50aWZpZXIgdGhhdCB3aWxsIGJlCi0JICogcGxhY2VkIGluIGEgdGV4dCBmaWxlIChlLmcuIGluIGEgSmF2YSBhbm5vdGF0aW9uKS4KLQkgKiBAc2VlICNnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKQotCSAqIEBzZWUgI2dldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRhbG9nIGZvciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuIFRoZSBpZGVudGlmaWVyIHNob3VsZAotCSAqIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlIG9yIGNvbnRhaW5pbmcKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMsIHVucXVvdGVkIG90aGVyd2lzZSkuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqIEBzZWUgI2dldFNvcnRlZENhdGFsb2dJZGVudGlmaWVycygpCi0JICogQHNlZSAjZ2V0Q2F0YWxvZ05hbWVkKFN0cmluZykKLQkgKi8KLQlDYXRhbG9nIGdldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBkZWZhdWx0IGNhdGFsb2csIGFzIGRlZmluZWQgYnkgdGhlIGRhdGFiYXNlIHZlbmRvci4KLQkgKiBJbiBtb3N0IGNhc2VzIHRoZSBkZWZhdWx0IGNhdGFsb2cncyBuYW1lIHdpbGwgbWF0Y2ggdGhlIHVzZXIgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3Mgb3IKLQkgKiBpZiB0aGUgZGVmYXVsdCBjYXRhbG9nIGRvZXMgbm90IGV4aXN0IChlLmcuIHRoZSBkYXRhYmFzZSBoYXMgbm8gY2F0YWxvZwotCSAqIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgdXNlciBuYW1lKS4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKiBAc2VlICNnZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKQotCSAqLwotCUNhdGFsb2cgZ2V0RGVmYXVsdENhdGFsb2coKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2UncyBkZWZhdWx0IGNhdGFsb2cgaWRlbnRpZmllci4KLQkgKiBUaGUgZGF0YWJhc2UgbWF5IG9yIG1heSBub3QgaGF2ZSBhIGNhdGFsb2cgd2l0aCBhIG1hdGNoaW5nIG5hbWUuCi0JICogQHNlZSAjc3VwcG9ydHNDYXRhbG9ncygpCi0JICogQHNlZSAjZ2V0RGVmYXVsdENhdGFsb2coKQotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZ0lkZW50aWZpZXIoKTsKLQotCi0JLy8gKioqKioqKioqKiB1dGlsaXR5IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogU2VsZWN0IGFuZCByZXR1cm4gZnJvbSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgdGFibGVzIHRoZQotCSAqIHRhYmxlIGlkZW50aWZpZWQgYnkgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLgotCSAqIFRoZSBpZGVudGlmaWVyIHNob3VsZCBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBkZWxpbWl0ZWQgYXMKLQkgKiBhcHByb3ByaWF0ZSkuCi0JICovCi0JVGFibGUgc2VsZWN0VGFibGVGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFRhYmxlPiB0YWJsZXMsIFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCBuYW1lIHRvIGEgZGF0YWJhc2UtYXBwcm9wcmlhdGUgU1FMIGlkZW50aWZpZXIKLQkgKiAoaS5lLiBkZWxpbWl0IHRoZSBuYW1lIGFzIGFwcHJvcHJpYXRlKS4KLQkgKi8KLQkvLyBpdCBzZWVtcyB3ZSBkb24ndCBuZWVkIGRhdGFiYXNlIG9iamVjdC1zcGVjaWZpYyBjb252ZXJzaW9ucyBoZXJlOwotCS8vIGkuZS4gc2VwYXJhdGUgbWV0aG9kcyBmb3IgdGFibGVzLCBjb2x1bW5zLCBldGMuCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzVlMjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGNsaWVudHMgb2YgdGhlIERhbGkgZGIgcGFja2FnZSB0byBjb250cm9sIHdoZXRoZXIKLSAqIGRhdGFiYXNlIGlkZW50aWZpZXJzIGFyZSB0byBiZSB0cmVhdGVkIGFzIHRob3VnaCB0aGV5IGFyZSBkZWxpbWl0ZWQsIHdoaWNoLAotICogbW9zdCBzaWduaWZpY2FudGx5LCB1c3VhbGx5IG1lYW5zIHRoZSBpZGVudGlmaWVycyBhcmUgY2FzZS1zZW5zaXRpdmUuCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIERhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgaWRlbnRpZmllcnMgYXJlIHRvIGJlIHRyZWF0ZWQgYXMgdGhvdWdoIHRoZXkgd2VyZQotCSAqIGRlbGltaXRlZC4KLQkgKi8KLQlib29sZWFuIHRyZWF0SWRlbnRpZmllcnNBc0RlbGltaXRlZCgpOwotCi0KLQkvKioKLQkgKiBUaGlzIGFkYXB0ZXIgc2ltcGx5IHJldHVybnMgPGNvZGU+ZmFsc2U8L2NvZGU+LCB3aGljaCBpcyBjb21wYXRpYmxlCi0JICogd2l0aCBKUEEgMS4wLgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIElOU1RBTkNFID0gbmV3IERlZmF1bHQoKTsKLQkJcHVibGljIHN0YXRpYyBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiB0cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7ICAvLyBKUEEgMS4wCi0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgJy4nICsgdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2VPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRGF0YWJhc2VPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIwYTU0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0RhdGFiYXNlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogQmVoYXZpb3IgY29tbW9uIHRvIGFsbCBkYXRhYmFzZSBvYmplY3RzLgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEYXRhYmFzZU9iamVjdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRhdGFiYXNlIG9iamVjdCdzIG5hbWUuCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgPGVtPmlkZW50aWZpZXI8L2VtPiwgd2hpY2ggaXMgdGhlIG9iamVjdCdzIG5hbWUKLQkgKiBtb2RpZmllZCBzbyBpdCBjYW4gYmUgdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50IChlLmcuIGlmIHRoZSBuYW1lIGNvbnRhaW5zCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIGlzIG1peGVkIGNhc2UsIGl0IHdpbGwgYmUgZGVsaW1pdGVkLCB0eXBpY2FsbHkgYnkKLQkgKiBkb3VibGUtcXVvdGVzKS4KLQkgKi8KLQlTdHJpbmcgZ2V0SWRlbnRpZmllcigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBkYXRhYmFzZSBvYmplY3QncyA8ZW0+aWRlbnRpZmllcjwvZW0+LCB3aGljaCBpcyB0aGUgb2JqZWN0J3MgbmFtZQotCSAqIG1vZGlmaWVkIHNvIGl0IGNhbiBiZSB1c2VkIGluIGFuIFNRTCBzdGF0ZW1lbnQgKGUuZy4gaWYgdGhlIG5hbWUgY29udGFpbnMKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMgb3IgaXMgbWl4ZWQgY2FzZSwgaXQgd2lsbCBiZSBkZWxpbWl0ZWQsIHR5cGljYWxseSBieQotCSAqIGRvdWJsZS1xdW90ZXMpLgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgaWRlbnRpZmllciBtYXRjaGVzIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0IG5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBEYWxpIGVudGl0eSBnZW5lcmF0aW9uIGNvZGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBhIGdlbmVyYXRlZCBhbm5vdGF0aW9uIG11c3QgZXhwbGljaXRseSBpZGVudGlmeSBhIGRhdGFiYXNlIG9iamVjdAotCSAqIChlLmcuIGEgdGFibGUpIG9yIHRoZSBkZWZhdWx0IChhcyBzcGVjaWZpZWQgaGVyZSkgYWRlcXVhdGVseSBpZGVudGlmaWVzCi0JICogdGhlIGRhdGFiYXNlIG9iamVjdCAodGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBjYXNlLXNlbnNpdGl2aXR5LAotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgZXRjLikuCi0JICovCi0JU3RyaW5nIGdldElkZW50aWZpZXIoU3RyaW5nIGRlZmF1bHROYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgZGF0YWJhc2UuCi0JICovCi0JRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YWJhc2Ugb2JqZWN0J3MgY29ubmVjdGlvbiBwcm9maWxlLgotCSAqLwotCUNvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLQotCS8qKgotCSAqIFNvcnQgYnkgbmFtZS4KLQkgKi8KLQlDb21wYXJhdG9yPERhdGFiYXNlT2JqZWN0PiBERUZBVUxUX0NPTVBBUkFUT1IgPQotCQkJbmV3IENvbXBhcmF0b3I8RGF0YWJhc2VPYmplY3Q+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShEYXRhYmFzZU9iamVjdCBkYk9iamVjdDEsIERhdGFiYXNlT2JqZWN0IGRiT2JqZWN0MikgewotCQkJCQlyZXR1cm4gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGRiT2JqZWN0MS5nZXROYW1lKCksIGRiT2JqZWN0Mi5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldEVuY2xvc2luZ0NsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpICsgIi5ERUZBVUxUX0NPTVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQotCVRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+IE5BTUVfVFJBTlNGT1JNRVIgPQotCQkJbmV3IFRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKERhdGFiYXNlT2JqZWN0IGRiT2JqZWN0KSB7Ci0JCQkJCXJldHVybiBkYk9iamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiLk5BTUVfVFJBTlNGT1JNRVIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLQotCVRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+IElERU5USUZJRVJfVFJBTlNGT1JNRVIgPQotCQkJbmV3IFRyYW5zZm9ybWVyPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKERhdGFiYXNlT2JqZWN0IGRiT2JqZWN0KSB7Ci0JCQkJCXJldHVybiBkYk9iamVjdC5nZXRJZGVudGlmaWVyKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0RW5jbG9zaW5nQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyAiLklERU5USUZJRVJfVFJBTlNGT1JNRVIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvRm9yZWlnbktleS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Gb3JlaWduS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzBhYmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9Gb3JlaWduS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIERhdGFiYXNlIGZvcmVpZ24ga2V5Ci0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEZvcmVpZ25LZXkKLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Ci17Ci0JLy8gKioqKioqKioqKiB0YWJsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIDxlbT5iYXNlPC9lbT4gdGFibGUuCi0JICovCi0JVGFibGUgZ2V0QmFzZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3MgPGVtPnJlZmVyZW5jZWQ8L2VtPiB0YWJsZS4KLQkgKi8KLQlUYWJsZSBnZXRSZWZlcmVuY2VkVGFibGUoKTsKLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gcGFpcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIGNvbHVtbiBwYWlycy4KLQkgKi8KLQlJdGVyYWJsZTxDb2x1bW5QYWlyPiBnZXRDb2x1bW5QYWlycygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBmb3JlaWduIGtleSdzIGNvbHVtbiBwYWlycy4KLQkgKi8KLQlpbnQgZ2V0Q29sdW1uUGFpcnNTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZvcmVpZ24ga2V5J3Mgc2luZ2xlIGNvbHVtbiBwYWlyLiBUaHJvdyBhbgotCSAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIHRoZSBmb3JlaWduIGtleSBoYXMgbW9yZSB0aGFuIG9uZSBjb2x1bW4gcGFpci4KLQkgKi8KLQlDb2x1bW5QYWlyIGdldENvbHVtblBhaXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyA8ZW0+YmFzZTwvZW0+IGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRCYXNlQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmb3JlaWduIGtleSdzIDxlbT5iYXNlPC9lbT4gY29sdW1ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYmFzZQotCSAqIHRhYmxlJ3MgcHJpbWFyeSBrZXkuIChUaGUgbm9uLXByaW1hcnkga2V5IGJhc2UgY29sdW1ucyBhcmUgbm90IHVzZWQgdG8KLQkgKiBnZW5lcmF0ZSBiYXNpYyBhdHRyaWJ1dGVzIGR1cmluZyBlbnRpdHkgZ2VuZXJhdGlvbi4pCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXROb25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZm9yZWlnbiBrZXkncyA8ZW0+cmVmZXJlbmNlZDwvZW0+IGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIGZvcmVpZ24ga2V5IHJlZmVyZW5jZXMgdGhlIHByaW1hcnkga2V5IG9mIHRoZQotCSAqIDxlbT5yZWZlcmVuY2VkPC9lbT4gdGFibGUgYW5kIHRoYXQgcHJpbWFyeSBrZXkgaGFzIG9ubHkgYSBzaW5nbGUgY29sdW1uLgotCSAqIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiBkZXRlcm1pbmluZyBKUEEgZGVmYXVsdHMuCi0JICovCi0JYm9vbGVhbiByZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpOwotCi0KLQkvLyAqKioqKioqKioqIEpQQSBzdXBwb3J0ICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBhcHByb3ByaWF0ZSBuYW1lIGZvciBhbiBhdHRyaWJ1dGUgdGhhdCBob2xkcyB0aGUgZW50aXR5Ci0JICogbWFwcGVkIHRvIHRoZSBmb3JlaWduIGtleSdzIDxlbT5yZWZlcmVuY2VkPC9lbT4gdGFibGUuCi0JICovCi0JU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKTsKLQotCS8qKgotCSAqIElmIHRoZSBuYW1lIG9mIHRoZSA8ZW0+YmFzZTwvZW0+IGNvbHVtbiBhZGhlcmVzIHRvIHRoZSBKUEEgc3BlYyBmb3IgYQotCSAqIGRlZmF1bHQgbWFwcGluZyAoaS5lLiBpdCBlbmRzIHdpdGggYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSB0aGUgbmFtZQotCSAqIG9mIHRoZSA8ZW0+cmVmZXJlbmNlZDwvZW0+IGNvbHVtbiwgYW5kIHRoZSA8ZW0+cmVmZXJlbmNlZDwvZW0+IGNvbHVtbiBpcyB0aGUgc2luZ2xlCi0JICogcHJpbWFyeSBrZXkgY29sdW1uIG9mIHRoZSA8ZW0+cmVmZXJlbmNlZDwvZW0+IHRhYmxlKSwgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCi0JICogZGVmYXVsdCBhdHRyaWJ1dGUgbmFtZTo8cHJlPgotCSAqICAgICBGb3JlaWduS2V5KEVNUC5DVUJJQ0xFX0lEID0+IENVQklDTEUuSUQpID0+ICJDVUJJQ0xFIgotCSAqIDwvcHJlPgotCSAqIFJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBkb2VzIG5vdCBhZGhlcmUgdG8gdGhlIEpQQSBzcGVjOjxwcmU+Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5DVUJJQ0xFX0lEKSA9PiBudWxsCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEUgPT4gQ1VCSUNMRS5JRCkgPT4gbnVsbAotCSAqIDwvcHJlPgotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgdGhhdCBpcyBtYXBwZWQgdG8gdGhlCi0JICogZm9yZWlnbiBrZXksIGJ1aWxkIGFuZCByZXR1cm4gYSBzdHJpbmcgdG8gYmUgdXNlZCBhcyB0aGUgdmFsdWUgZm9yIHRoZQotCSAqIGF0dHJpYnV0ZSdzIDxjb2RlPkBqYXZheC5wZXJzaXN0ZW5jZS5Kb2luQ29sdW1uPC9jb2RlPiBhbm5vdGF0aW9uJ3MKLQkgKiA8Y29kZT5uYW1lPC9jb2RlPiBlbGVtZW50LiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGF0dHJpYnV0ZQotCSAqIG1hcHMgdG8gdGhlIGpvaW4gY29sdW1uIGJ5IGRlZmF1bHQuCi0JICogPHA+Ci0JICogUHJlY29uZGl0aW9uOiBUaGUgZm9yZWlnbiBrZXkgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29sdW1uIHBhaXIgd2hvc2UKLQkgKiByZWZlcmVuY2VkIGNvbHVtbiBpcyB0aGUgc2luZ2xlLWNvbHVtbiBwcmltYXJ5IGtleSBvZiB0aGUgZm9yZWlnbgotCSAqIGtleSdzIHJlZmVyZW5jZWQgdGFibGUuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGJ5IHRoZSBlbnRpdHkgZ2VuZXJhdGlvbiBjb2RlIHRvIGRldGVybWluZSB3aGV0aGVyCi0JICogYSBnZW5lcmF0ZWQgYW5ub3RhdGlvbiBtdXN0IGV4cGxpY2l0bHkgaWRlbnRpZnkgdGhlIGpvaW4gY29sdW1uCi0JICogb3IgdGhlIGNhbGN1bGF0ZWQgZGVmYXVsdCBhZGVxdWF0ZWx5IGlkZW50aWZpZXMgdGhlIGpvaW4gY29sdW1uCi0JICogKHRha2luZyBpbnRvIGNvbnNpZGVyYXRpb24gY2FzZS1zZW5zaXRpdml0eSwgc3BlY2lhbCBjaGFyYWN0ZXJzLCBldGMuKS4KLQkgKi8KLQlTdHJpbmcgZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKFN0cmluZyBhdHRyaWJ1dGVOYW1lKTsKLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gcGFpciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogUGFpciB1cCB0aGUgZm9yZWlnbiBrZXkncyBjb2x1bW4gcGFpcnMsIG1hdGNoaW5nIGVhY2ggPGVtPmJhc2U8L2VtPiBjb2x1bW4gd2l0aAotCSAqIHRoZSBhcHByb3ByaWF0ZSA8ZW0+cmVmZXJlbmNlZDwvZW0+IGNvbHVtbi4KLQkgKiBAc2VlICNnZXRDb2x1bW5QYWlycygpCi0JICovCi0JaW50ZXJmYWNlIENvbHVtblBhaXIgewotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBwYWlyJ3MgPGVtPmJhc2U8L2VtPiBjb2x1bW4uCi0JCSAqLwotCQlDb2x1bW4gZ2V0QmFzZUNvbHVtbigpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBwYWlyJ3MgPGVtPnJlZmVyZW5jZWQ8L2VtPiBjb2x1bW4uCi0JCSAqLwotCQlDb2x1bW4gZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCi0JCUNvbXBhcmF0b3I8Q29sdW1uUGFpcj4gQkFTRV9DT0xVTU5fQ09NUEFSQVRPUiA9Ci0JCQkJbmV3IENvbXBhcmF0b3I8Q29sdW1uUGFpcj4oKSB7Ci0JCQkJCXB1YmxpYyBpbnQgY29tcGFyZShDb2x1bW5QYWlyIGNwMSwgQ29sdW1uUGFpciBjcDIpIHsKLQkJCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoY3AxLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCksIGNwMi5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJCXJldHVybiAiRm9yZWlnbktleS5Db2x1bW5QYWlyLkJBU0VfQ09MVU1OX0NPTVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvSnB0SnBhRGJQbHVnaW4uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvSnB0SnBhRGJQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDczYWI4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL0pwdEpwYURiUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmpkdC5jbGFzc3BhdGguRHJpdmVyQ2xhc3NwYXRoQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIERhbGkgSlBBIERCIHBsdWctaW4gbGlmZWN5Y2xlIGltcGxlbWVudGF0aW9uLgotICogR2xvYmFsbHkgYXZhaWxhYmxlIGNvbm5lY3Rpb24gcHJvZmlsZSBmYWN0b3J5LgotICogPHA+Ci0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgY2xhc3MgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgY2xhc3MgSnB0SnBhRGJQbHVnaW4KLQlleHRlbmRzIFBsdWdpbgotewotCS8vIGxhenktaW5pdGlhbGl6ZWQKLQlwcml2YXRlIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBjb25uZWN0aW9uUHJvZmlsZUZhY3Rvcnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBKcHRKcGFEYlBsdWdpbiBJTlNUQU5DRTsgIC8vIHNvcnRhLWZpbmFsCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5kYiI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbiBKUFQgREIgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpwYURiUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBzdGF0aWMgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCXJldHVybiBJTlNUQU5DRS5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnlfKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxvZ2dpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG1zZywgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2codGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSnB0SnBhRGJQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy8gdGhpcyBjb252ZW50aW9uIGlzICp3YWNrKi4uLiAgfmJqdgotCQlJTlNUQU5DRSA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHVwb24gcGx1Zy1pbiBhY3RpdmF0aW9uCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCS8vIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZmFjdG9yeSBpcyBsYXp5LWluaXRpYWxpemVkLi4uCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHBsdWctaW4gaXMgc3RvcHBlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5ICE9IG51bGwpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LnN0b3AoKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5ID0gbnVsbDsKLQkJfQotCQlJTlNUQU5DRSA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeV8oKSB7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSA9IHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKTsKLQkgICAgICAgIHRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5LnN0YXJ0KCk7CQkJCi0JCX0KLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotCX0KLQotCXByaXZhdGUgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5IGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGphciBsaXN0IGNvbnRhaW5lciBmb3IgdGhlIGdpdmVuIERUUCBkcml2ZXIuCi0JICovCi0JcHVibGljIElDbGFzc3BhdGhDb250YWluZXIgYnVpbGREcml2ZXJDbGFzc3BhdGhDb250YWluZXJGb3IoU3RyaW5nIGRyaXZlck5hbWUpIHsKLQkJcmV0dXJuIG5ldyBEcml2ZXJDbGFzc3BhdGhDb250YWluZXIoZHJpdmVyTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TY2hlbWEuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvU2NoZW1hLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZTMzNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TY2hlbWEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogRGF0YWJhc2Ugc2NoZW1hCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNjaGVtYQotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3QKLXsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSdzIGNvbnRhaW5lcjsgZWl0aGVyIGEgY2F0YWxvZyBvciBhIGRhdGFiYXNlLgotCSAqLwotCVNjaGVtYUNvbnRhaW5lciBnZXRDb250YWluZXIoKTsKLQotCi0JLy8gKioqKioqKioqKiB0YWJsZXMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyB0YWJsZXMuCi0JICovCi0JSXRlcmFibGU8VGFibGU+IGdldFRhYmxlcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGFibGVzIHRoZSBzY2hlbWEgY29udGFpbnMuCi0JICovCi0JaW50IGdldFRhYmxlc1NpemUoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgdGFibGUncyBuYW1lLgotCSAqIEBzZWUgI2dldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JIFRhYmxlIGdldFRhYmxlTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEncyB0YWJsZSBpZGVudGlmaWVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogQHNlZSAjZ2V0VGFibGVGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRUYWJsZU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRUYWJsZUlkZW50aWZpZXJzKCkKLQkgKi8KLQlUYWJsZSBnZXRUYWJsZUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHNlcXVlbmNlcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSdzIHNlcXVlbmNlcy4KLQkgKi8KLQlJdGVyYWJsZTxTZXF1ZW5jZT4gZ2V0U2VxdWVuY2VzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzZXF1ZW5jZXMgdGhlIHNjaGVtYSBjb250YWlucy4KLQkgKi8KLQlpbnQgZ2V0U2VxdWVuY2VzU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXF1ZW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVGhlIG5hbWUgbXVzdCBiZSBhbiBleGFjdCBtYXRjaAotCSAqIG9mIHRoZSBzZXF1ZW5jZSdzIG5hbWUuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlTZXF1ZW5jZSBnZXRTZXF1ZW5jZU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hJ3Mgc2VxdWVuY2UgaWRlbnRpZmVycywgc29ydGVkIGJ5IG5hbWUuCi0JICogQHNlZSAjZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VxdWVuY2UgZm9yIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4gVGhlIGlkZW50aWZpZXIgc2hvdWxkCi0JICogYmUgYW4gU1FMIGlkZW50aWZpZXIgKGkuZS4gcXVvdGVkIHdoZW4gY2FzZS1zZW5zaXRpdmUgb3IgY29udGFpbmluZwotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgdW5xdW90ZWQgb3RoZXJ3aXNlKS4KLQkgKiBAc2VlICNnZXRTZXF1ZW5jZU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRTZXF1ZW5jZUlkZW50aWZpZXJzKCkKLQkgKi8KLQlTZXF1ZW5jZSBnZXRTZXF1ZW5jZUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLy8gKioqKioqKioqKiBzZXF1ZW5jZXMgKioqKioqKioqKgotCi0Jdm9pZCByZWZyZXNoKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1NjaGVtYUNvbnRhaW5lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TY2hlbWFDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzZmFkMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1NjaGVtYUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIFNjaGVtYSBjb250YWluZXIgKGkuZS4gRGF0YWJhc2Ugb3IgQ2F0YWxvZykKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2NoZW1hQ29udGFpbmVyCi0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdAotewotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3Mgc2NoZW1hdGEuCi0JICovCi0JSXRlcmFibGU8U2NoZW1hPiBnZXRTY2hlbWF0YSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2NoZW1hdGEgaW4gdGhlIGNvbnRhaW5lci4KLQkgKi8KLQlpbnQgZ2V0U2NoZW1hdGFTaXplKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIHNjaGVtYSBuYW1lcywgc29ydGVkLgotCSAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHVzZXIgaXMgc2VsZWN0aW5nIGEgc2NoZW1hIGZyb20gYSByZWFkLW9ubHkKLQkgKiBjb21iby1ib3ggKGUuZy4gaW4gYSB3aXphcmQpLgotCSAqIEBzZWUgI2dldFNjaGVtYU5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFOYW1lcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgc2NoZW1hJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRTb3J0ZWRTY2hlbWFOYW1lcygpCi0JICogQHNlZSAjZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYU5hbWVkKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3Mgc2NoZW1hIGlkZW50aWZpZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRoZSB1c2VyIGlzIHNlbGVjdGluZyBhbiBpZGVudGlmaWVyIHRoYXQgd2lsbCBiZQotCSAqIHBsYWNlZCBpbiBhIHRleHQgZmlsZSAoZS5nLiBpbiBhIEphdmEgYW5ub3RhdGlvbikuCi0JICogQHNlZSAjZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihTdHJpbmcpCi0JICogQHNlZSAjZ2V0U29ydGVkU2NoZW1hTmFtZXMoKQotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2NoZW1hIGZvciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIuIFRoZSBpZGVudGlmaWVyIHNob3VsZAotCSAqIGJlIGFuIFNRTCBpZGVudGlmaWVyIChpLmUuIHF1b3RlZCB3aGVuIGNhc2Utc2Vuc2l0aXZlIG9yIGNvbnRhaW5pbmcKLQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMsIHVucXVvdGVkIG90aGVyd2lzZSkuCi0JICogQHNlZSAjZ2V0U29ydGVkU2NoZW1hSWRlbnRpZmllcnMoKQotCSAqIEBzZWUgI2dldFNjaGVtYU5hbWVkKFN0cmluZykKLQkgKi8KLQlTY2hlbWEgZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5lcidzIGRlZmF1bHQgc2NoZW1hLCBhcyBkZWZpbmVkIGJ5IHRoZSBkYXRhYmFzZSB2ZW5kb3IuCi0JICogSW4gbW9zdCBjYXNlcyB0aGUgZGVmYXVsdCBzY2hlbWEncyBuYW1lIHdpbGwgbWF0Y2ggdGhlIHVzZXIgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIGRlZmF1bHQgc2NoZW1hIGRvZXMgbm90IGV4aXN0IChlLmcuIHRoZQotCSAqIGNvbnRhaW5lciBoYXMgbm8gc2NoZW1hIHdob3NlIG5hbWUgbWF0Y2hlcyB0aGUgdXNlciBuYW1lKS4KLQkgKiBAc2VlICNnZXREZWZhdWx0U2NoZW1hSWRlbnRpZmllcigpCi0JICovCi0JU2NoZW1hIGdldERlZmF1bHRTY2hlbWEoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29udGFpbmVyJ3MgZGVmYXVsdCBzY2hlbWEgaWRlbnRpZmllci4KLQkgKiBUaGUgY29udGFpbmVyIG1heSBvciBtYXkgbm90IGhhdmUgYSBzY2hlbWEgd2l0aCBhIG1hdGNoaW5nIG5hbWUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFNjaGVtYSgpCi0JICovCi0JU3RyaW5nIGdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1NlcXVlbmNlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL1NlcXVlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmM3MjguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9TZXF1ZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiOwotCi0vKioKLSAqIERhdGFiYXNlIHNlcXVlbmNlCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcXVlbmNlCi0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdAotewotCS8qKgotCSAqIFJldHVybiB0aGUgc2VxdWVuY2UncyBzY2hlbWEuCi0JICovCi0JU2NoZW1hIGdldFNjaGVtYSgpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9UYWJsZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTIyNThhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvVGFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7Ci0KLS8qKgotICogRGF0YWJhc2UgdGFibGUKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVGFibGUKLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Ci17Ci0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHNjaGVtYS4KLQkgKi8KLQlTY2hlbWEgZ2V0U2NoZW1hKCk7Ci0KLQotCS8vICoqKioqKioqKiogY29sdW1ucyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlJ3MgY29sdW1ucy4KLQkgKi8KLQlJdGVyYWJsZTxDb2x1bW4+IGdldENvbHVtbnMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRDb2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjb2x1bW4gd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoZSBuYW1lIG11c3QgYmUgYW4gZXhhY3QgbWF0Y2gKLQkgKiBvZiB0aGUgY29sdW1uJ3MgbmFtZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlDb2x1bW4gZ2V0Q29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIGNvbHVtbiBpZGVudGlmZXJzLCBzb3J0ZWQgYnkgbmFtZS4KLQkgKiBAc2VlICNnZXRDb2x1bW5Gb3JJZGVudGlmaWVyKFN0cmluZykKLQkgKi8KLQlJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZENvbHVtbklkZW50aWZpZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBpZGVudGlmaWVyLiBUaGUgaWRlbnRpZmllciBzaG91bGQKLQkgKiBiZSBhbiBTUUwgaWRlbnRpZmllciAoaS5lLiBxdW90ZWQgd2hlbiBjYXNlLXNlbnNpdGl2ZSBvciBjb250YWluaW5nCi0JICogc3BlY2lhbCBjaGFyYWN0ZXJzLCB1bnF1b3RlZCBvdGhlcndpc2UpLgotCSAqIEBzZWUgI2dldENvbHVtbk5hbWVkKFN0cmluZykKLQkgKiBAc2VlICNnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpCi0JICovCi0JQ29sdW1uIGdldENvbHVtbkZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpOwotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbnMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHByaW1hcnkga2V5IGNvbHVtbnMuCi0JICovCi0JSXRlcmFibGU8Q29sdW1uPiBnZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBudW1iZXIgb2YgcHJpbWFyeSBrZXkgY29sdW1ucyB0aGUgdGFibGUgY29udGFpbnMuCi0JICovCi0JaW50IGdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSdzIHNpbmdsZSBwcmltYXJ5IGtleSBjb2x1bW4uIFRocm93IGFuCi0JICoge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaWYgdGhlIHRhYmxlIGhhcyBtb3JlIHRoYW4gb25lIHByaW1hcnkga2V5IGNvbHVtbi4KLQkgKi8KLQlDb2x1bW4gZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCi0KLQkvLyAqKioqKioqKioqIGZvcmVpZ24ga2V5cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRhYmxlJ3MgZm9yZWlnbiBrZXlzLgotCSAqLwotCUl0ZXJhYmxlPEZvcmVpZ25LZXk+IGdldEZvcmVpZ25LZXlzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBmb3JlaWduIGtleXMgdGhlIHRhYmxlIGNvbnRhaW5zLgotCSAqLwotCWludCBnZXRGb3JlaWduS2V5c1NpemUoKTsKLQotCi0JLy8gKioqKioqKioqKiBqb2luIHRhYmxlIHN1cHBvcnQgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHRhYmxlIGlzIHBvc3NpYmx5IGEgPGVtPmpvaW48L2VtPiB0YWJsZQotCSAqIChpLmUuIGl0IGNvbnRhaW5zIG9ubHkgMiBmb3JlaWduIGtleXMpLiBXaGV0aGVyIHRoZSB0YWJsZSA8ZW0+YWN0dWFsbHk8L2VtPiBpcwotCSAqIGEgPGVtPmpvaW48L2VtPiB0YWJsZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBzZW1hbnRpY3Mgb2YgdGhlIGRhdGFiYXNlIGRlc2lnbi4KLQkgKi8KLQlib29sZWFuIGlzUG9zc2libGVKb2luVGFibGUoKTsKLQotCS8qKgotCSAqIEFzc3VtaW5nIHRoZSB0YWJsZSBpcyBhIDxlbT5qb2luPC9lbT4gdGFibGUsIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gdGhlCi0JICogPGVtPm93bmluZzwvZW0+IHRhYmxlLgotCSAqIEBzZWUgI2lzUG9zc2libGVKb2luVGFibGUoKQotCSAqLwotCUZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgPGVtPmpvaW48L2VtPiB0YWJsZSwgcmV0dXJuIHRoZSBmb3JlaWduIGtleSB0byB0aGUKLQkgKiA8ZW0+bm9uLW93bmluZzwvZW0+IHRhYmxlLgotCSAqIEBzZWUgI2lzUG9zc2libGVKb2luVGFibGUoKQotCSAqLwotCUZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpOwotCi0JLyoqCi0JICogQXNzdW1pbmcgdGhlIHRhYmxlIGlzIGEgPGVtPmpvaW48L2VtPiB0YWJsZSwgcmV0dXJuIHdoZXRoZXIgaXRzIG5hbWUgbWF0Y2hlcwotCSAqIHRoZSBKUEEgZGVmYXVsdCAoaS5lLiA8Y29kZT4iT1dOSU5HVEFCTEVfTk9OT1dOSU5HVEFCTEUiPC9jb2RlPikuCi0JICogQHNlZSAjaXNQb3NzaWJsZUpvaW5UYWJsZSgpCi0JICovCi0JYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENhdGFsb2dXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENhdGFsb2dXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzMwMzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDYXRhbG9nV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci0KLS8qKgotICogV3JhcCBhIERUUCBDYXRhbG9nCi0gKi8KLWZpbmFsIGNsYXNzIERUUENhdGFsb2dXcmFwcGVyCi0JZXh0ZW5kcyBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyPERUUERhdGFiYXNlV3JhcHBlcj4KLQlpbXBsZW1lbnRzIENhdGFsb2cKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNhdGFsb2cgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2c7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQQ2F0YWxvZ1dyYXBwZXIoRFRQRGF0YWJhc2VXcmFwcGVyIGRhdGFiYXNlLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZyBkdHBDYXRhbG9nKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQkJdGhpcy5kdHBDYXRhbG9nID0gZHRwQ2F0YWxvZzsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUlDYXRhbG9nT2JqZWN0IGdldENhdGFsb2dPYmplY3QoKSB7Ci0JCXJldHVybiAoSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwQ2F0YWxvZzsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmNhdGFsb2dDaGFuZ2VkKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZ2V0RFRQU2NoZW1hcygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZy5nZXRTY2hlbWFzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBTY2hlbWEuZ2V0Q2F0YWxvZygpKSA/Ci0JCQkJCQl0aGlzLmdldFNjaGVtYV8oZHRwU2NoZW1hKSA6Ci0JCQkJCQl0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRnJvbUNhdGFsb2dzKGR0cFNjaGVtYSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cFRhYmxlLmdldFNjaGVtYSgpLmdldENhdGFsb2coKSkgPwotCQkJCQkJdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpIDoKLQkJCQkJCXRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRUYWJsZUZyb21DYXRhbG9ncyhkdHBUYWJsZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBDb2x1bW4uZ2V0VGFibGUoKS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpID8KLQkJCQkJCXRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pIDoKLQkJCQkJCXRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDb2x1bW5Gcm9tQ2F0YWxvZ3MoZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGF0YWJhc2VPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDYXRhbG9nLmdldE5hbWUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ2F0YWxvZyA9PSBjYXRhbG9nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb2x1bW5XcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxM2NhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbHVtbldyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLmRiZGVmaW5pdGlvbi5QcmVkZWZpbmVkRGF0YVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5DaGFyYWN0ZXJTdHJpbmdEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuZGF0YXR5cGVzLkV4YWN0TnVtZXJpY0RhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5OdW1lcmljYWxEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5kYXRhdHlwZXMuUHJlZGVmaW5lZERhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmRhdGF0eXBlcy5QcmltaXRpdmVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5KYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TaW1wbGVKYXZhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBDb2x1bW4KLSAqLwotZmluYWwgY2xhc3MgRFRQQ29sdW1uV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyPERUUFRhYmxlV3JhcHBlcj4KLQlpbXBsZW1lbnRzIENvbHVtbgotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgY29sdW1uICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uIGR0cENvbHVtbjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBDb2x1bW5XcmFwcGVyKERUUFRhYmxlV3JhcHBlciB0YWJsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJc3VwZXIodGFibGUpOwotCQl0aGlzLmR0cENvbHVtbiA9IGR0cENvbHVtbjsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCUlDYXRhbG9nT2JqZWN0IGdldENhdGFsb2dPYmplY3QoKSB7Ci0JCXJldHVybiAoSUNhdGFsb2dPYmplY3QpIHRoaXMuZHRwQ29sdW1uOwotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuY29sdW1uQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogQ29sdW1uIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZSgpLnByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnModGhpcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQYXJ0T2ZGb3JlaWduS2V5KCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZSgpLmZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKHRoaXMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbi5pc051bGxhYmxlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSA9PSBudWxsKSA/IG51bGwgOiBkYXRhVHlwZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNOdW1lcmljKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKSBpbnN0YW5jZW9mIE51bWVyaWNhbERhdGFUeXBlOwotCX0JCi0KLQlwdWJsaWMgaW50IGdldFByZWNpc2lvbigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgTnVtZXJpY2FsRGF0YVR5cGUpID8KLQkJCQkJCSgoTnVtZXJpY2FsRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmVjaXNpb24oKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjYWxlKCl7Ci0JCURhdGFUeXBlIGRhdGFUeXBlID0gdGhpcy5kdHBDb2x1bW4uZ2V0RGF0YVR5cGUoKTsKLQkJcmV0dXJuIChkYXRhVHlwZSBpbnN0YW5jZW9mIEV4YWN0TnVtZXJpY0RhdGFUeXBlKSA/Ci0JCQkJCQkoKEV4YWN0TnVtZXJpY0RhdGFUeXBlKSBkYXRhVHlwZSkuZ2V0U2NhbGUoKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUpID8KLQkJCQkJCSgoQ2hhcmFjdGVyU3RyaW5nRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRMZW5ndGgoKSA6Ci0JCQkJCQktMTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xPQigpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQkJCQlwcmltaXRpdmVUeXBlSXNMb2IoKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKS5nZXRQcmltaXRpdmVUeXBlKCkpIDoKLQkJCQkJCWZhbHNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SmF2YVR5cGUoKS5kZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsKLQkJRGF0YVR5cGUgZGF0YVR5cGUgPSB0aGlzLmR0cENvbHVtbi5nZXREYXRhVHlwZSgpOwotCQlyZXR1cm4gKGRhdGFUeXBlIGluc3RhbmNlb2YgUHJlZGVmaW5lZERhdGFUeXBlKSA/Ci0JCQljb252ZXJ0VG9KUEFKYXZhVHlwZSh0aGlzLmdldEphdmFUeXBlKChQcmVkZWZpbmVkRGF0YVR5cGUpIGRhdGFUeXBlKSkgOgotCQkJREVGQVVMVF9KQVZBX1RZUEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5SmF2YVR5cGVEZWNsYXJhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJpbWFyeUtleUphdmFUeXBlKCkuZGVjbGFyYXRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVR5cGUgZ2V0UHJpbWFyeUtleUphdmFUeXBlKCkgewotCQlyZXR1cm4gY29udmVydFRvSlBBUHJpbWFyeUtleUphdmFUeXBlKHRoaXMuZ2V0SmF2YVR5cGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhVHlwZSBnZXRKYXZhVHlwZShQcmVkZWZpbmVkRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJLy8gdGhpcyBpcyBqdXN0IGEgYml0IGhhY2t5OiBtb3ZpbmcgZnJvbSBhIHR5cGUgZGVjbGFyYXRpb24gdG8gYSBjbGFzcyBuYW1lIHRvIGEgdHlwZSBkZWNsYXJhdGlvbi4uLgotCQlTdHJpbmcgZHRwSmF2YUNsYXNzTmFtZSA9IHRoaXMucmVzb2x2ZURlZmluaXRpb24oZGF0YVR5cGUpLmdldEphdmFDbGFzc05hbWUoKTsKLQkJcmV0dXJuIG5ldyBTaW1wbGVKYXZhVHlwZShSZWZsZWN0aW9uVG9vbHMuZ2V0Q2xhc3NOYW1lRm9yVHlwZURlY2xhcmF0aW9uKGR0cEphdmFDbGFzc05hbWUpKTsKLQl9Ci0KLQlwcml2YXRlIFByZWRlZmluZWREYXRhVHlwZURlZmluaXRpb24gcmVzb2x2ZURlZmluaXRpb24oUHJlZGVmaW5lZERhdGFUeXBlIGRhdGFUeXBlKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RFRQRGVmaW5pdGlvbigpLmdldFByZWRlZmluZWREYXRhVHlwZURlZmluaXRpb24oZGF0YVR5cGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gY29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbHVtbiA9PSBjb2x1bW47Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYXIKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc3RhdGljIG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIEpEQkMgc3BlYyBzYXlzIEpEQkMgZHJpdmVycyBzaG91bGQgYmUgYWJsZSB0byBtYXAgQkxPQnMgYW5kIENMT0JzCi0JICogZGlyZWN0bHksIGJ1dCB0aGUgSlBBIHNwZWMgZG9lcyBub3QgYWxsb3cgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBKYXZhVHlwZSBjb252ZXJ0VG9KUEFKYXZhVHlwZShKYXZhVHlwZSBqYXZhVHlwZSkgewotCQlpZiAoamF2YVR5cGUuZXF1YWxzKEJMT0JfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIEJZVEVfQVJSQVlfSkFWQV9UWVBFOwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoQ0xPQl9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gU1RSSU5HX0pBVkFfVFlQRTsKLQkJfQotCQlyZXR1cm4gamF2YVR5cGU7Ci0JfQotCi0JLyoqCi0JICogVGhlIEpQQSBzcGVjIFsyLjEuNF0gc2F5cyBvbmx5IHRoZSBmb2xsb3dpbmcgdHlwZXMgYXJlIGFsbG93ZWQgaW4KLQkgKiBwcmltYXJ5IGtleSBmaWVsZHM6PHVsPgotCSAqICAgICA8bGk+W3ZhcmlhYmxlXSBwcmltaXRpdmVzCi0JICogICAgIDxsaT5bdmFyaWFibGVdIHByaW1pdGl2ZSB3cmFwcGVycwotCSAqICAgICA8bGk+e0BsaW5rIGphdmEubGFuZy5TdHJpbmd9Ci0JICogICAgIDxsaT57QGxpbmsgamF2YS51dGlsLkRhdGV9Ci0JICogICAgIDxsaT57QGxpbmsgamF2YS5zcWwuRGF0ZX0KLQkgKiA8L3VsPgotCSAqLwotCXByaXZhdGUgc3RhdGljIEphdmFUeXBlIGNvbnZlcnRUb0pQQVByaW1hcnlLZXlKYXZhVHlwZShKYXZhVHlwZSBqYXZhVHlwZSkgewotCQlpZiAoamF2YVR5cGUuaXNWYXJpYWJsZVByaW1pdGl2ZSgpCi0JCQkJfHwgamF2YVR5cGUuaXNWYXJpYWJsZVByaW1pdGl2ZVdyYXBwZXIoKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhTVFJJTkdfSkFWQV9UWVBFKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhVVElMX0RBVEVfSkFWQV9UWVBFKQotCQkJCXx8IGphdmFUeXBlLmVxdWFscyhTUUxfREFURV9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gamF2YVR5cGU7Ci0JCX0KLQkJaWYgKGphdmFUeXBlLmVxdWFscyhCSUdfREVDSU1BTF9KQVZBX1RZUEUpKSB7Ci0JCQlyZXR1cm4gTE9OR19KQVZBX1RZUEU7ICAvLyA/PwotCQl9Ci0JCWlmIChqYXZhVHlwZS5lcXVhbHMoU1FMX1RJTUVfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFVUSUxfREFURV9KQVZBX1RZUEU7ICAvLyA/Pz8KLQkJfQotCQlpZiAoamF2YVR5cGUuZXF1YWxzKFNRTF9USU1FU1RBTVBfSkFWQV9UWVBFKSkgewotCQkJcmV0dXJuIFVUSUxfREFURV9KQVZBX1RZUEU7ICAvLyA/Pz8KLQkJfQotCQkvLyBhbGwgdGhlIG90aGVyIHR5cGljYWwgdHlwZXMgYXJlIHByZXR0eSBtdWNoIHVuLW1hcHBhYmxlIC0gcmV0dXJuIFN0cmluZyg/KQotCQlyZXR1cm4gU1RSSU5HX0pBVkFfVFlQRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIHByaW1pdGl2ZVR5cGVJc0xvYihQcmltaXRpdmVUeXBlIHByaW1pdGl2ZVR5cGUpIHsKLQkJcmV0dXJuIChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQklOQVJZX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKQotCQkJCXx8IChwcmltaXRpdmVUeXBlID09IFByaW1pdGl2ZVR5cGUuTkFUSU9OQUxfQ0hBUkFDVEVSX0xBUkdFX09CSkVDVF9MSVRFUkFMKTsKLQl9Ci0KLQotCS8vICoqKioqIHNvbWUgY29uc3RhbnRzIHVzZWQgd2hlbiBjb252ZXJ0aW5nIHRoZSBjb2x1bW4gdG8gYSBKYXZhIGF0dHJpYnV0ZQotCS8vIFRPRE8gT2JqZWN0IGlzIHRoZSBkZWZhdWx0PwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIERFRkFVTFRfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEubGFuZy5PYmplY3QuY2xhc3MpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQkxPQl9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuQmxvYi5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgQllURV9BUlJBWV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoYnl0ZVtdLmNsYXNzKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIENMT0JfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLkNsb2IuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNUUklOR19KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5sYW5nLlN0cmluZy5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBVVElMX0RBVEVfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEudXRpbC5EYXRlLmNsYXNzKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBTUUxfREFURV9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5zcWwuRGF0ZS5jbGFzcyk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVR5cGUgU1FMX1RJTUVfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLlRpbWUuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIFNRTF9USU1FU1RBTVBfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcyk7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVHlwZSBCSUdfREVDSU1BTF9KQVZBX1RZUEUgPSBuZXcgU2ltcGxlSmF2YVR5cGUoamF2YS5tYXRoLkJpZ0RlY2ltYWwuY2xhc3MpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFUeXBlIExPTkdfSkFWQV9UWVBFID0gbmV3IFNpbXBsZUphdmFUeXBlKGxvbmcuY2xhc3MpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0YjhmMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSVByb2ZpbGVMaXN0ZW5lcjE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuQXJyYXlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyOwotCi0vKioKLSAqIFdyYXAgdGhlIERUUCB7QGxpbmsgUHJvZmlsZU1hbmFnZXJ9IGluIHlldCBhbm90aGVyIHNpbmdsZXRvbi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeQotCWltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5Ci17Ci0JcHJpdmF0ZSBQcm9maWxlTWFuYWdlciBkdHBQcm9maWxlTWFuYWdlcjsKLQotCXByaXZhdGUgTG9jYWxQcm9maWxlTGlzdGVuZXIgcHJvZmlsZUxpc3RlbmVyOwotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgSU5TVEFOQ0UgPSBuZXcgRFRQQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgc3RhdGljIERUUENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEFjY2VzcyBpcyA8Y29kZT5wcml2YXRlPC9jb2RlPiB0byBlbnN1cmUgc2luZ2xldG9uCi0JICovCi0JcHJpdmF0ZSBEVFBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpZmVjeWNsZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBjYWxsZWQgYnkgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydCgpIHsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlciA9IFByb2ZpbGVNYW5hZ2VyLmdldEluc3RhbmNlKCk7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbmV3IExvY2FsUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuYWRkUHJvZmlsZUxpc3RlbmVyKHRoaXMucHJvZmlsZUxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsZWQgYnkgcGx1Zy1pbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQl0aGlzLmR0cFByb2ZpbGVNYW5hZ2VyLnJlbW92ZVByb2ZpbGVMaXN0ZW5lcih0aGlzLnByb2ZpbGVMaXN0ZW5lcik7Ci0JCXRoaXMucHJvZmlsZUxpc3RlbmVyID0gbnVsbDsKLQkJdGhpcy5kdHBQcm9maWxlTWFuYWdlciA9IG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZXMgKioqKioqKioqKgotCi0JcHVibGljIHN5bmNocm9uaXplZCBDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJZm9yIChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSA6IHRoaXMuZHRwUHJvZmlsZU1hbmFnZXIuZ2V0UHJvZmlsZXMoKSkgewotCQkJaWYgKGR0cFByb2ZpbGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoZHRwUHJvZmlsZSwgYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGFkYXB0ZXIpIHsKLQkJcmV0dXJuIG5ldyBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIoZHRwUHJvZmlsZSwgYWRhcHRlcik7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShuYW1lLCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyLkRlZmF1bHQuaW5zdGFuY2UoKSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPElDb25uZWN0aW9uUHJvZmlsZSwgU3RyaW5nPih0aGlzLmdldERUUENvbm5lY3Rpb25Qcm9maWxlcygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKElDb25uZWN0aW9uUHJvZmlsZSBkdHBQcm9maWxlKSB7Ci0JCQkJIHJldHVybiBkdHBQcm9maWxlLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBJdGVyYWJsZTxJQ29ubmVjdGlvblByb2ZpbGU+IGdldERUUENvbm5lY3Rpb25Qcm9maWxlcygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPElDb25uZWN0aW9uUHJvZmlsZT4odGhpcy5kdHBQcm9maWxlTWFuYWdlci5nZXRQcm9maWxlcygpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnByb2ZpbGVMaXN0ZW5lci5hZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5wcm9maWxlTGlzdGVuZXIucmVtb3ZlQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyICoqKioqKioqKioKLQotCS8qKgotCSAqIEZvcndhcmQgZXZlbnRzIHRvIHRoZSBmYWN0b3J5J3MgbGlzdGVuZXJzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIExvY2FsUHJvZmlsZUxpc3RlbmVyCi0JCWltcGxlbWVudHMgSVByb2ZpbGVMaXN0ZW5lcjEKLQl7Ci0JCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI+IGxpc3RlbmVyTGlzdCA9IG5ldyBMaXN0ZW5lckxpc3Q8Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcj4oQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lci5jbGFzcyk7Ci0KLQkJTG9jYWxQcm9maWxlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJdm9pZCBhZGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJdGhpcy5saXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBJUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQWRkZWQoSUNvbm5lY3Rpb25Qcm9maWxlIGR0cFByb2ZpbGUpIHsKLQkJCVN0cmluZyBuYW1lID0gZHRwUHJvZmlsZS5nZXROYW1lKCk7Ci0JCQlmb3IgKENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNvbm5lY3Rpb25Qcm9maWxlQWRkZWQobmFtZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBvbGREZXNjcmlwdGlvbiwgQm9vbGVhbiBvbGRBdXRvQ29ubmVjdCkgewotCQkJU3RyaW5nIG5ld05hbWUgPSBkdHBQcm9maWxlLmdldE5hbWUoKTsKLQkJCWlmICggISBuZXdOYW1lLmVxdWFscyhvbGROYW1lKSkgewotCQkJCWZvciAoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJCWxpc3RlbmVyLmNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChvbGROYW1lLCBuZXdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlQ2hhbmdlZChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkJLy8gdGhpcyBtZXRob2Qgc2hvdWxkbid0IGJlIGNhbGxlZCBvbiBJUHJvZmlsZUxpc3RlbmVyMQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9maWxlRGVsZXRlZChJQ29ubmVjdGlvblByb2ZpbGUgZHRwUHJvZmlsZSkgewotCQkJU3RyaW5nIG5hbWUgPSBkdHBQcm9maWxlLmdldE5hbWUoKTsKLQkJCWZvciAoQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuY29ubmVjdGlvblByb2ZpbGVSZW1vdmVkKG5hbWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NWI0NzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSUNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5Ecml2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5qZGJjLklKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLmNvbm5lY3Rpb24uQ29ubmVjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbHRvb2xzLmNvcmUuRGF0YWJhc2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWx0b29scy5jb3JlLnByb2ZpbGUuUHJvZmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci0KLS8qKgotICogIFdyYXAgYSBEVFAge0BsaW5rIElDb25uZWN0aW9uUHJvZmlsZX0KLSAqLwotZmluYWwgY2xhc3MgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyCi0JaW1wbGVtZW50cyBEVFBEYXRhYmFzZU9iamVjdCwgQ29ubmVjdGlvblByb2ZpbGUKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGNvbm5lY3Rpb24gcHJvZmlsZSAqLwotCXByaXZhdGUgZmluYWwgSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENvbm5lY3Rpb25Qcm9maWxlOwotCi0JLyoqIGFkYXB0ZXIgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCAoZGV0ZXJtaW5lcyBpZGVudGlmaWVyIGRlbGltaXRlcnMpICovCi0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZUlkZW50aWZpZXJBZGFwdGVyIGlkZW50aWZpZXJBZGFwdGVyOwotCi0JLyoqIHRoZSBEVFAgbWFuYWdlZCBjb25uZWN0aW9uIHdlIGxpc3RlbiB0byAqLwotCXByaXZhdGUgZmluYWwgSU1hbmFnZWRDb25uZWN0aW9uIGR0cE1hbmFnZWRDb25uZWN0aW9uOwotCi0JLyoqCi0JICogZm9yd2FyZCBldmVudHMgZnJvbSB0aGUgRFRQIG1hbmFnZWQgY29ubmVjdGlvbiBhYm92ZTsKLQkgKiB3ZSBsaXN0ZW4gYW5kIHByb3BhZ2F0ZSBldmVudHMgaWZmIHdlIGhhdmUgbGlzdGVuZXJzIG91cnNlbHZlcwotCSAqLwotCXByaXZhdGUgZmluYWwgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQsIGFuZCBkZWxldGVkIGF0IGRpc2Nvbm5lY3QgKi8KLQlwcml2YXRlIERUUERhdGFiYXNlV3JhcHBlciBkYXRhYmFzZTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJVkVfRFRQX0NPTk5FQ1RJT05fVFlQRSA9IGphdmEuc3FsLkNvbm5lY3Rpb24uY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9GRkxJTkVfRFRQX0NPTk5FQ1RJT05fVFlQRSA9IENvbm5lY3Rpb25JbmZvLmNsYXNzLmdldE5hbWUoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBQkFTRV9QUk9EVUNUX1BST1BfSUQgPSAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zZXJ2ZXIudmVyc2lvbiI7ICAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyKElDb25uZWN0aW9uUHJvZmlsZSBkdHBDb25uZWN0aW9uUHJvZmlsZSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlciBpZGVudGlmaWVyQWRhcHRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlID0gZHRwQ29ubmVjdGlvblByb2ZpbGU7Ci0JCXRoaXMuaWRlbnRpZmllckFkYXB0ZXIgPSBpZGVudGlmaWVyQWRhcHRlcjsKLQkJdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbiA9IHRoaXMuYnVpbGREVFBNYW5hZ2VkQ29ubmVjdGlvbigpOwotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IG5ldyBMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQkvLyBkb24ndCBsaXN0ZW4gdG8gdGhlIG1hbmFnZWQgY29ubmVjdGlvbiB5ZXQKLQl9Ci0KLQlwcml2YXRlIElNYW5hZ2VkQ29ubmVjdGlvbiBidWlsZERUUE1hbmFnZWRDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXRNYW5hZ2VkQ29ubmVjdGlvbih0aGlzLmdldERUUENvbm5lY3Rpb25UeXBlKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERUUENvbm5lY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5zdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpID8KLQkJCQlPRkZMSU5FX0RUUF9DT05ORUNUSU9OX1RZUEUgOgotCQkJCUxJVkVfRFRQX0NPTk5FQ1RJT05fVFlQRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRGF0YWJhc2VPYmplY3QgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKFN0cmluZyBqYXZhSWRlbnRpZmllcikgewotCQkvLyBjb25uZWN0aW9uIHByb2ZpbGVzIGRvIG5vdCBoYXZlICJpZGVudGlmaWVycyIKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQkvLyBjb25uZWN0aW9uIHByb2ZpbGVzIGRvIG5vdCBoYXZlICJpZGVudGlmaWVycyIKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0IGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZSA9PSBudWxsKSB7Ci0JCQl0aGlzLmRhdGFiYXNlID0gdGhpcy5idWlsZERhdGFiYXNlKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGF0YWJhc2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIENvbm5lY3Rpb25Qcm9maWxlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCS8vICoqKioqIHByb3BlcnRpZXMKLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldFByb3ZpZGVySWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlSUQoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldEluc3RhbmNlSUQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVByb2R1Y3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KERBVEFCQVNFX1BST0RVQ1RfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFTkRPUl9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREcml2ZXJDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVc2VyTmFtZSgpIHsKLQkJU3RyaW5nIHVzZXJOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVNFUk5BTUVfUFJPUF9JRCk7Ci0JCXJldHVybiB0aGlzLmV4dHJhY3RVc2VyTmFtZSh1c2VyTmFtZS50cmltKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGV4dHJhY3RVc2VyTmFtZShTdHJpbmcgdXNlck5hbWUpIHsKLQkJU3RyaW5nW10gc3RyaW5ncyA9IHVzZXJOYW1lLnNwbGl0KCJcXHMrIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYnVnIDIwODk0NiBoYW5kbGUgdXNlcm5hbWUgbGlrZSAic3lzIGFzIHN5c2RiYSIgb24gT3JhY2xlCi0JCWlmICgoc3RyaW5ncy5sZW5ndGggPT0gMykgJiYgc3RyaW5nc1sxXS5lcXVhbHNJZ25vcmVDYXNlKCJhcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkgICAgCXJldHVybiBzdHJpbmdzWzBdOwotCQl9Ci0JCXJldHVybiB1c2VyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVzZXJQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLlBBU1NXT1JEX1BST1BfSUQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShEUklWRVJfREVGSU5JVElPTl9QUk9QX0lEKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlckphckxpc3QoKSB7Ci0JCXJldHVybiBEcml2ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RHJpdmVySW5zdGFuY2VCeUlEKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpLmdldEphckxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiBEcml2ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0RHJpdmVySW5zdGFuY2VCeUlEKHRoaXMuZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkpLmdldE5hbWUoKTsKLQl9Ci0KLQkvLyAqKioqKiBjb25uZWN0aW9uCi0JcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmlzQ29ubmVjdGVkKCkgfHwgdGhpcy5pc1dvcmtpbmdPZmZsaW5lKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNJbmFjdGl2ZSgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0FjdGl2ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkKCkgewotCQlyZXR1cm4gdGhpcy5kdHBNYW5hZ2VkQ29ubmVjdGlvbi5pc0Nvbm5lY3RlZCgpCi0JCQkJJiYgISB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmlzV29ya2luZ09mZmxpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Rpc2Nvbm5lY3RlZCgpIHsKLQkJcmV0dXJuICEgdGhpcy5pc0Nvbm5lY3RlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbm5lY3QoKSB7Ci0JCWlmICh0aGlzLmlzRGlzY29ubmVjdGVkKCkpIHsKLQkJCXRoaXMuY2hlY2tTdGF0dXModGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCkpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCXRoaXMuY2hlY2tTdGF0dXModGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCkpOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uIGdldEpEQkNDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uSW5mbygpLmdldFNoYXJlZENvbm5lY3Rpb24oKTsKLQl9Ci0KLQkvLyAqKioqKiBvZmYtbGluZSBzdXBwb3J0Ci0JcHVibGljIGJvb2xlYW4gaXNXb3JraW5nT2ZmbGluZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uaXNXb3JraW5nT2ZmbGluZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCkgewotCQlyZXR1cm4gdGhpcy5kdHBDb25uZWN0aW9uUHJvZmlsZS5zdXBwb3J0c1dvcmtPZmZsaW5lTW9kZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHNhdmVXb3JrT2ZmbGluZURhdGEoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLnNhdmVXb3JrT2ZmbGluZURhdGEoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuV29ya09mZmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmNhbldvcmtPZmZsaW5lKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgd29ya09mZmxpbmUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLndvcmtPZmZsaW5lKCk7Ci0JfQotCQotCS8vICoqKioqIGxpc3RlbmVycwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRDb25uZWN0aW9uTGlzdGVuZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmICh0aGlzLmhhc05vTGlzdGVuZXJzKCkpIHsgIC8vIGZpcnN0IGxpc3RlbmVyIGFkZGVkCi0JCQl0aGlzLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuZHRwTWFuYWdlZENvbm5lY3Rpb24uYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuZGF0YWJhc2UgIT0gbnVsbCkgeyAgLy8gZG9uJ3QgdHJpZ2dlciBkYXRhYmFzZSBjcmVhdGlvbgotCQkJaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkgeyAgLy8gRFRQIGRvZXMgbm90IGNoYW5nZSB3aGVuIG9mZi1saW5lCi0JCQkJdGhpcy5kYXRhYmFzZS5zdGFydExpc3RlbmluZygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKHRoaXMuaGFzTm9MaXN0ZW5lcnMoKSkgeyAgLy8gbGFzdCBsaXN0ZW5lciByZW1vdmVkCi0JCQl0aGlzLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZSAhPSBudWxsKSB7ICAvLyBkb24ndCB0cmlnZ2VyIGRhdGFiYXNlIGNyZWF0aW9uCi0JCQlpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7ICAvLyBEVFAgZG9lcyBub3QgY2hhbmdlIHdoZW4gb2ZmLWxpbmUKLQkJCQl0aGlzLmRhdGFiYXNlLnN0b3BMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfQotCQl0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JfQotCi0JYm9vbGVhbiBoYXNOb0xpc3RlbmVycygpIHsKLQkJcmV0dXJuIHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLmhhc05vTGlzdGVuZXJzKCk7Ci0JfQotCi0JYm9vbGVhbiBoYXNBbnlMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5oYXNBbnlMaXN0ZW5lcnMoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIHZvaWQgY2hlY2tTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3RhdHVzLmlzTXVsdGlTdGF0dXMoKSkgewotCQkJZm9yIChJU3RhdHVzIGNoaWxkIDogc3RhdHVzLmdldENoaWxkcmVuKCkpIHsKLQkJCQl0aGlzLmNoZWNrU3RhdHVzKGNoaWxkKTsgIC8vIHJlY3Vyc2UsIGxvb2tpbmcgZm9yIHRoZSBmaXJzdCBlcnJvcgotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHN0YXR1cy5nZXRNZXNzYWdlKCksIHN0YXR1cy5nZXRFeGNlcHRpb24oKSk7Ci0JfQotCi0JcHJpdmF0ZSBEVFBEYXRhYmFzZVdyYXBwZXIgYnVpbGREYXRhYmFzZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNJbmFjdGl2ZSgpID8gbnVsbCA6IG5ldyBEVFBEYXRhYmFzZVdyYXBwZXIodGhpcywgdGhpcy5idWlsZERUUERhdGFiYXNlKCkpOwotCX0KLQotCXByaXZhdGUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGJ1aWxkRFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmlzV29ya2luZ09mZmxpbmUoKSA/Ci0JCQkJdGhpcy5idWlsZE9mZmxpbmVEVFBEYXRhYmFzZSgpIDoKLQkJCQl0aGlzLmJ1aWxkTGl2ZURUUERhdGFiYXNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgYnVpbGRPZmZsaW5lRFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25JbmZvKCkuZ2V0U2hhcmVkRGF0YWJhc2UoKTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25JbmZvIGdldENvbm5lY3Rpb25JbmZvKCkgewotCQlyZXR1cm4gKENvbm5lY3Rpb25JbmZvKSB0aGlzLmR0cE1hbmFnZWRDb25uZWN0aW9uLmdldENvbm5lY3Rpb24oKS5nZXRSYXdDb25uZWN0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgYnVpbGRMaXZlRFRQRGF0YWJhc2UoKSB7Ci0JCS8vIFRPRE8gc2VlIERUUCBidWcgMjAyMzA2Ci0JCS8vIHBhc3MgY29ubmVjdD10cnVlIGluIHRvIFByb2ZpbGVVdGlsLmdldERhdGFiYXNlKCkKLQkJLy8gdGhlcmUgaXMgYSBidWcgbWVudGlvbmVkIGluIGEgY29tbWVudDogCi0JCS8vICAgICAiZHVyaW5nIHRoZSBwcm9maWxlIGNvbm5lY3RlZCBldmVudCBub3RpZmljYXRpb24sIAotCQkvLyAgICAgSU1hbmFnZWRDb25uZWN0aW9uIGlzIGNvbm5lY3RlZCB3aGlsZSBJQ29ubmVjdGlvblByb2ZpbGUgaXMgbm90IgotCQkvLyBzbywgc29tZSBoYWNrZXJ5IGhlcmUgdG8gaGFuZGxlIGhhY2tlcnkgdGhlcmUKLQkJcmV0dXJuIFByb2ZpbGVVdGlsLmdldERhdGFiYXNlKG5ldyBEYXRhYmFzZUlkZW50aWZpZXIodGhpcy5nZXROYW1lKCksIHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpLCB0cnVlKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhckRhdGFiYXNlKCkgewotCQlpZiAodGhpcy5kYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5pc0Nvbm5lY3RlZCgpKSB7ICAvLyBEVFAgZG9lcyBub3QgY2hhbmdlIHdoZW4gb2ZmLWxpbmUKLQkJCQl0aGlzLmRhdGFiYXNlLnN0b3BMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJCXRoaXMuZGF0YWJhc2UgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdHJlYXRJZGVudGlmaWVyc0FzRGVsaW1pdGVkKCkgewotCQlyZXR1cm4gdGhpcy5pZGVudGlmaWVyQWRhcHRlci50cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKTsKLQl9Ci0KLQl2b2lkIGRhdGFiYXNlQ2hhbmdlZChEVFBEYXRhYmFzZVdyYXBwZXIgZGIpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuZGF0YWJhc2VDaGFuZ2VkKGRiKTsKLQl9Ci0KLQl2b2lkIGNhdGFsb2dDaGFuZ2VkKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoY2F0YWxvZyk7Ci0JfQotCi0Jdm9pZCBzY2hlbWFDaGFuZ2VkKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyLnNjaGVtYUNoYW5nZWQoc2NoZW1hKTsKLQl9Ci0KLQl2b2lkIHNlcXVlbmNlQ2hhbmdlZChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuc2VxdWVuY2VDaGFuZ2VkKHNlcXVlbmNlKTsKLQl9Ci0KLQl2b2lkIHRhYmxlQ2hhbmdlZChEVFBUYWJsZVdyYXBwZXIgdGFibGUpIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIudGFibGVDaGFuZ2VkKHRhYmxlKTsKLQl9Ci0KLQl2b2lkIGNvbHVtbkNoYW5nZWQoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4pIHsKLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIuY29sdW1uQ2hhbmdlZChjb2x1bW4pOwotCX0KLQotCXZvaWQgZm9yZWlnbktleUNoYW5nZWQoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSkgewotCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lci5mb3JlaWduS2V5Q2hhbmdlZChmb3JlaWduS2V5KTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmR0cENvbm5lY3Rpb25Qcm9maWxlLmdldEJhc2VQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQIGNvbm5lY3Rpb24gbGlzdGVuZXIgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhpcyBsaXN0ZW5lciB0cmFuc2xhdGVzIGFuZCBmb3J3YXJkcwotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LklNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyfSBhbmQKLQkgKiB7QGxpbmsgSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyfSBldmVudHMgdG8KLQkgKiB7QGxpbmsgQ29ubmVjdGlvbkxpc3RlbmVyfXMuIEFsc28sIHRoZSBjb25uZWN0aW9uIHByb2ZpbGUgZGVsZWdhdGVzIHRvCi0JICogdGhpcyBsaXN0ZW5lciB3aGVuIG5vdGlmeWluZyB7QGxpbmsgQ29ubmVjdGlvbkxpc3RlbmVyfXMgb2YgY2hhbmdlcyB0bwotCSAqIHRoZSBkYXRhYmFzZSBvYmplY3RzIChjYXRhbG9ncywgc2NoZW1hdGEsIHRhYmxlcywgZXRjLikuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElNYW5hZ2VkQ29ubmVjdGlvbk9mZmxpbmVMaXN0ZW5lcgotCXsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3Q8Q29ubmVjdGlvbkxpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PENvbm5lY3Rpb25MaXN0ZW5lcj4oQ29ubmVjdGlvbkxpc3RlbmVyLmNsYXNzKTsKLQotCQlMb2NhbENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQl2b2lkIGFkZENvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JCX0KLQotCQl2b2lkIHJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JCX0KLQotCQlib29sZWFuIGhhc05vTGlzdGVuZXJzKCkgewotCQkJcmV0dXJuIHRoaXMubGlzdGVuZXJMaXN0LmlzRW1wdHkoKTsKLQkJfQotCi0JCWJvb2xlYW4gaGFzQW55TGlzdGVuZXJzKCkgewotCQkJcmV0dXJuICEgdGhpcy5saXN0ZW5lckxpc3QuaXNFbXB0eSgpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIElNYW5hZ2VkQ29ubmVjdGlvbkxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvLyBvZmYtbGluZSBvciBpbmFjdGl2ZSA9PiBsaXZlCi0JCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGRvIG5vdCBidWlsZCB0aGUgZGF0YWJhc2UgaGVyZSAtIGl0IGlzIGJ1aWx0IG9uLWRlbWFuZAotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5vcGVuZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCBmcm9tIHRoZSBiYXNlIERUUCBjb2RlLgotCQkgKiBQZXJoYXBzIERUUCBleHRlbmRlcnMgY2FsbCBpdC4uLi4KLQkJICogU2VlIHtAbGluayBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmludGVybmFsLk1hbmFnZWRDb25uZWN0aW9uI2ZpcmVNb2RpZmllZEV2ZW50KE9iamVjdCl9LAotCQkgKiB3aGljaCBpcyBuZXZlciBjYWxsZWQuLi4KLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gZm9yd2FyZCBldmVudCB0byBsaXN0ZW5lcnMKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5tb2RpZmllZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWlmICggISBsaXN0ZW5lci5va1RvQ2xvc2UoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0RXZlbnQgZXZlbnQpIHsKLQkJCS8vIGZvcndhcmQgZXZlbnQgdG8gbGlzdGVuZXJzCi0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuYWJvdXRUb0Nsb3NlKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzKTsKLQkJCX0KLQkJfQotCi0JCS8vIGxpdmUgb3Igb2ZmLWxpbmUgPT4gaW5hY3RpdmUKLQkJcHVibGljIHZvaWQgY2xvc2VkKENvbm5lY3RFdmVudCBldmVudCkgewotCQkJLy8gY2xlYXIgdGhlIGRhdGFiYXNlCi0JCQlEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcy5jbGVhckRhdGFiYXNlKCk7Ci0JCQkvLyBmb3J3YXJkIGV2ZW50IHRvIGxpc3RlbmVycwotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmNsb3NlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogSU1hbmFnZWRDb25uZWN0aW9uT2ZmbGluZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCQkvLyBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyBib29sZWFuIG9rVG9EZXRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAib2sgdG8gY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgbGl2ZSBjb25uZWN0aW9uCi0JCQlyZXR1cm4gdGhpcy5va1RvQ2xvc2UoZXZlbnQpOwotCQl9Ci0JCQotCQkvLyBsaXZlID0+IG9mZi1saW5lCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9EZXRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhICJjbG9zZSIgZXZlbnQ7Ci0JCQkvLyB3ZSBhcmUgImNsb3NpbmciIHRoZSBsaXZlIGNvbm5lY3Rpb24KLQkJCXRoaXMuY2xvc2VkKGV2ZW50KTsKLQkJfQotCi0JCS8vIGluYWN0aXZlIG9yIGxpdmUgPT4gb2ZmLWxpbmUKLQkJcHVibGljIHZvaWQgd29ya2luZ09mZmxpbmUoQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAib3BlbiIgZXZlbnQ7Ci0JCQkvLyB3ZSBhcmUgIm9wZW5pbmciIHRoZSBvZmYtbGluZSBjb25uZWN0aW9uCi0JCQl0aGlzLm9wZW5lZChldmVudCk7Ci0JCX0KLQotCQkvLyBvZmYtbGluZSA9PiBsaXZlCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9BdHRhY2goQ29ubmVjdEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBjb252ZXJ0IHRoZSBldmVudCB0byBhbiAiY2xvc2UiIGV2ZW50OwotCQkJLy8gd2UgYXJlICJjbG9zaW5nIiB0aGUgb2ZmLWxpbmUgY29ubmVjdGlvbgotCQkJdGhpcy5jbG9zZWQoZXZlbnQpOwotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXZvaWQgZGF0YWJhc2VDaGFuZ2VkKERUUERhdGFiYXNlV3JhcHBlciBkYikgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLmRhdGFiYXNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgZGIpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBjYXRhbG9nQ2hhbmdlZChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGNhdGFsb2cpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBzY2hlbWFDaGFuZ2VkKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuc2NoZW1hQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgc2NoZW1hKTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgc2VxdWVuY2VDaGFuZ2VkKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSkgewotCQkJZm9yIChDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgOiB0aGlzLmxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKSkgewotCQkJCWxpc3RlbmVyLnNlcXVlbmNlQ2hhbmdlZChEVFBDb25uZWN0aW9uUHJvZmlsZVdyYXBwZXIudGhpcywgc2VxdWVuY2UpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCB0YWJsZUNoYW5nZWQoRFRQVGFibGVXcmFwcGVyIHRhYmxlKSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIudGFibGVDaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCB0YWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGNvbHVtbkNoYW5nZWQoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4pIHsKLQkJCWZvciAoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDogdGhpcy5saXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCkpIHsKLQkJCQlsaXN0ZW5lci5jb2x1bW5DaGFuZ2VkKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlci50aGlzLCBjb2x1bW4pOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5KSB7Ci0JCQlmb3IgKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQkJbGlzdGVuZXIuZm9yZWlnbktleUNoYW5nZWQoRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyLnRoaXMsIGZvcmVpZ25LZXkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NhYTNlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQRGF0YWJhc2VPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci0KLS8qKgotICogSW50ZXJuYWwgaW50ZXJmYWNlOiBEVFAgZGF0YWJhc2Ugb2JqZWN0LgotICovCi1pbnRlcmZhY2UgRFRQRGF0YWJhc2VPYmplY3QKLQlleHRlbmRzIERhdGFiYXNlT2JqZWN0Ci17Ci0JLyoqCi0JICogY292YXJpYW50IG92ZXJyaWRlCi0JICovCi0JRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0KLQkvKioKLQkgKiBjb3ZhcmlhbnQgb3ZlcnJpZGUKLQkgKi8KLQlwdWJsaWMgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5OGUxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlT2JqZWN0V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuUmVmcmVzaE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXIuRFRQRHJpdmVyQWRhcHRlcjsKLQotLyoqCi0gKiBEVFAgT2JqZWN0IFdyYXBwZXIgYmFzZSBjbGFzcwotICovCi1hYnN0cmFjdCBjbGFzcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXI8UCBleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0PgotCWltcGxlbWVudHMgRFRQRGF0YWJhc2VPYmplY3QKLXsKLQkvKiogd2UgbmVlZCBhIHdheSB0byBnZXQgdG8gdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSAqLwotCWZpbmFsIFAgcGFyZW50OwotCi0JLyoqIGxpc3RlbiBmb3IgdGhlICJjYXRhbG9nIG9iamVjdCIgYmVpbmcgcmVmcmVzaGVkICovCi0JcHJpdmF0ZSBmaW5hbCBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGNhdGFsb2dPYmplY3RMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIoUCBwYXJlbnQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmICh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuaXNDb25uZWN0ZWQoKSkgewotCQkJLy8gd2Ugb25seSBsaXN0ZW4gdG8gImxpdmUiIGNvbm5lY3Rpb25zIChhcyBvcHBvc2VkIHRvICJvZmYtbGluZSIgY29ubmVjdGlvbnMpOwotCQkJLy8gYW5kIHRoZSBtb2RlbCBpcyByZWJ1aWx0IHdoZW4gdGhlIGNvbm5lY3Rpb24gY29ubmVjdHMgb3IgZGlzY29ubmVjdHMKLQkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gdGhpcy5idWlsZENhdGFsb2dPYmplY3RMaXN0ZW5lcigpOwotCQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5oYXNBbnlMaXN0ZW5lcnMoKSkgewotCQkJCXRoaXMuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lcyB2cy4gaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogRXhhbXBsZXM6PHVsPgotCSAqIDxsaT5PcmFjbGUgZXRjLjx1bD48Y29kZT4KLQkgKiAgICAgPGxpPlRhYmxlKEZPTykgdnMuICJGb28iID0+IG51bGwKLQkgKiAgICAgPGxpPlRhYmxlKEJBUikgdnMuICJGb28iID0+ICJCQVIiCi0JICogICAgIDxsaT5UYWJsZShGb28pIHZzLiAiRm9vIiA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKEJhcikgdnMuICJGb28iID0+ICJcIkJhclwiIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDxsaT5Qb3N0Z3JlU1FMIGV0Yy48dWw+PGNvZGU+Ci0JICogICAgIDxsaT5UYWJsZShmb28pIHZzLiAiRm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5UYWJsZShiYXIpIHZzLiAiRm9vIiA9PiAiYmFyIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiXCJCYXJcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRm9vKSB2cy4gIkZvbyIgPT4gbnVsbAotCSAqICAgICA8bGk+VGFibGUoZm9vKSB2cy4gIkZvbyIgPT4gImZvbyIKLQkgKiAgICAgPGxpPlRhYmxlKGJhcikgdnMuICJGb28iID0+ICJiYXIiCi0JICogICAgIDxsaT5UYWJsZShCYXIpIHZzLiAiRm9vIiA9PiAiQmFyIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKFN0cmluZyBkZWZhdWx0TmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIodGhpcy5nZXROYW1lKCksIGRlZmF1bHROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiXCJGb29cIiIKLQkgKiAgICAgPGxpPlRhYmxlKGZvbykgPT4gIlwiZm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKLQkgKiAgICAgPGxpPlRhYmxlKGYibykgPT4gIlwiZlwiXCJvXCIiIChpLmUuICJmIiJvIikKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiXCJGT09cIiIKLQkgKiAgICAgPGxpPlRhYmxlKEZvbykgPT4gIlwiRm9vXCIiCi0JICogICAgIDxsaT5UYWJsZShmb28pID0+ICJmb28iCi0JICogICAgIDxsaT5UYWJsZShmb28rKykgPT4gIlwiZm9vKytcIiIKLQkgKiAgICAgPGxpPlRhYmxlKGYibykgPT4gIlwiZlwiXCJvXCIiIChpLmUuICJmIiJvIikKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiRm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKSA9PiAiZm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKyspID0+ICJcImZvbysrXCIiCi0JICogICAgIDxsaT5UYWJsZShmIm8pID0+ICJcImZcIlwib1wiIiAoaS5lLiAiZiIibyIpCi0JICogPC9jb2RlPjwvdWw+Ci0JICogPGxpPk15U1FMPHVsPjxjb2RlPgotCSAqICAgICA8bGk+VGFibGUoRk9PKSA9PiAiRk9PIgotCSAqICAgICA8bGk+VGFibGUoRm9vKSA9PiAiRm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKSA9PiAiZm9vIgotCSAqICAgICA8bGk+VGFibGUoZm9vKyspID0+ICJgZm9vKytgIgotCSAqICAgICA8bGk+VGFibGUoZiJvKSA9PiAiYGZcIm9gIiAoaS5lLiBgZiJvYCkKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIHRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIodGhpcy5nZXROYW1lKCkpOwotCX0KLQotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuY29udmVydE5hbWVUb0lkZW50aWZpZXIobmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBkYXRhYmFzZSBvYmplY3QgbGlzdGVuZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBJQ2F0YWxvZ09iamVjdExpc3RlbmVyIGJ1aWxkQ2F0YWxvZ09iamVjdExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElDYXRhbG9nT2JqZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElDYXRhbG9nT2JqZWN0IGRtRWxlbWVudCwgaW50IGV2ZW50VHlwZSkgewotCQkJCWlmIChkbUVsZW1lbnQgPT0gRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyLnRoaXMuZ2V0Q2F0YWxvZ09iamVjdCgpKSB7Ci0JCQkJCS8vICdldmVudFR5cGUnIGRvZXNuJ3Qgc2VlbSB0byBiZSB2ZXJ5IHVzZWZ1bCwgc28gZHJvcCBpdAotCQkJCQlEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIudGhpcy5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHJldHVybiB0aGUgd3JhcHBlZCBEVFAgZGF0YWJhc2Ugb2JqZWN0LgotCSAqLwotCWFic3RyYWN0IElDYXRhbG9nT2JqZWN0IGdldENhdGFsb2dPYmplY3QoKTsKLQotCS8qKgotCSAqIFR5cGljYWxseSwgYSBzdWJjbGFzcyB3aWxsIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0JICogY2FsbCA8Y29kZT5zdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpPC9jb2RlPiBhbmQKLQkgKiBub3RpZnkgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBzb21ldGhpbmcgaGFzIGNoYW5nZWQKLQkgKi8KLQl2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQl0aGlzLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlIERUUCBvYmplY3QgaGFzIGNoYW5nZWQsIGNsZWFyIHRoZSB3cmFwcGVyJ3Mgc3RhdGUgc28gaXQgd2lsbCBiZQotCSAqIHN5bmNocm9uaXplZCBvbi1kZW1hbmQuCi0JICovCi0JYWJzdHJhY3Qgdm9pZCBjbGVhcigpOwotCi0JLy8gdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzICJsaXZlIiBhbmQgaGFzIGxpc3RlbmVycwotCXZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCXRoaXMuY2hlY2tMaXN0ZW5lcigpOwotCQlSZWZyZXNoTWFuYWdlci5nZXRJbnN0YW5jZSgpLkFkZExpc3RlbmVyKHRoaXMuZ2V0Q2F0YWxvZ09iamVjdCgpLCB0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lcik7Ci0JfQotCi0JLy8gdGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBwcm9maWxlIGlzICJsaXZlIiBhbmQgaGFzIG5vIGxpc3RlbmVycwotCXZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJdGhpcy5jaGVja0xpc3RlbmVyKCk7Ci0gICAgICAgIFJlZnJlc2hNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVtb3ZlTGlzdGVuZXIodGhpcy5nZXRDYXRhbG9nT2JqZWN0KCksIHRoaXMuY2F0YWxvZ09iamVjdExpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBvbmx5IGJ1aWxkIHtAbGluayAjY2F0YWxvZ09iamVjdExpc3RlbmVyfSB3aGVuIHRoZSBjb25uZWN0aW9uCi0JICogcHJvZmlsZSBpcyAibGl2ZSIuIElmIHdlIGdldCBoZXJlIGFuZCBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPiwKLQkgKiBzb21ldGhpbmcgaXMgd3JvbmcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTGlzdGVuZXIoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dPYmplY3RMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ0aGUgY2F0YWxvZyBsaXN0ZW5lciBpcyBudWxsIik7ICAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgRFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0KLQlEVFBEcml2ZXJBZGFwdGVyIGdldERUUERyaXZlckFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RFRQRHJpdmVyQWRhcHRlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZC4KLQkgKi8KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgbmFtZSkgewotCQlmb3IgKFQgZGF0YWJhc2VPYmplY3QgOiBkYXRhYmFzZU9iamVjdHMpIHsKLQkJCWlmIChkYXRhYmFzZU9iamVjdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGRhdGFiYXNlT2JqZWN0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5idWlsZFRvU3RyaW5nRm9yKHRoaXMsIHRoaXMuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBEYXRhYmFzZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3ZDUxNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUERhdGFiYXNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuZGVmaW5pdGlvbi5EYXRhYmFzZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uaW50ZXJuYWwuY29yZS5SREJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXIuRFRQRHJpdmVyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlci5EVFBEcml2ZXJBZGFwdGVyTWFuYWdlcjsKLQotLyoqCi0gKiBXcmFwIGEgRFRQIERhdGFiYXNlLgotICogPHA+Ci0gKiBDYXRhbG9ncyB2cy4gU2NoZW1hdGE6PGJyPgotICogVHlwaWNhbGx5LCBpZiBhIERUUCBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IDxlbT5jYXRhbG9nczwvZW0+LAotICogby5lLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZSNnZXRDYXRhbG9ncygpIHdpbGwgcmV0dXJuIGEKLSAqIHNpbmdsZSBjYXRhbG9nIHdpdGhvdXQgYSBuYW1lIChhY3R1YWxseSwgaXQncyBhbiBlbXB0eSBzdHJpbmcpLiBUaGlzIGNhdGFsb2cKLSAqIHdpbGwgY29udGFpbiBhbGwgdGhlIGRhdGFiYXNlJ3Mgc2NoZW1hdGEuIFdlIHRyeSB0byBpZ25vcmUgdGhpcyBjYXRhbG9nIGFuZAotICogcmV0dXJuIHRoZSBzY2hlbWF0YSBmcm9tIHRoZSBkYXRhYmFzZSBkaXJlY3RseS4KLSAqIDxwPgotICogQ2F0YWxvZyBOb3RlIDE6PGJyPgotICogQXMgb2YgSmFuIDIwMDksIHRoZSBEVFAgTXlTUUwgZHJpdmVyIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhpcyBwYXR0ZXJuLgotICogQSBEVFAgTXlTUUwgZGF0YWJhc2UgaGFzIDxlbT5ubzwvZW0+IGNhdGFsb2dzOyBpdCBob2xkcyBhIHNpbmdsZSBzY2hlbWEKLSAqIGRpcmVjdGx5LCBhbmQgdGhhdCBzY2hlbWEgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlLiBTZWUgYnVnIDI0OTAxMy4KLSAqIDxwPgotICogQ2F0YWxvZyBOb3RlIDI6PGJyPgotICogQXMgb2YgSmFuIDIwMDksIHRoZSBQb3N0Z3JlU1FMIEpEQkMgZHJpdmVyIGNvbXBsaWNhdGVzIHRoaXMgcGF0dGVybiBhIGJpdC4KLSAqIEV2ZW4gdGhvdWdoIFBvc3RncmVTUUwgZG9lcyBub3Qgc3VwcG9ydCA8ZW0+Y2F0YWxvZ3M8L2VtPiwgaXRzIEpEQkMgZHJpdmVyCi0gKiByZXR1cm5zIGEgc2luZ2xlIGNhdGFsb2cgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZGF0YWJhc2Ugc3BlY2lmaWVkCi0gKiBpbiB0aGUgSkRCQyBjb25uZWN0aW9uIFVSTC4gVGhlIERUUCBQb3N0Z3JlU1FMIGRyaXZlciBzaW1wbHkgcmVwbGljYXRlcyB0aGlzCi0gKiBiZWhhdmlvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBjYXRhbG9nIGNhbiBiZSB1bm5hbWVkOyBpLmUuIGl0cyBuYW1lIGlzIGFuCi0gKiBlbXB0eSBzdHJpbmcuLi4uCi0gKiA8cD4KLSAqIChZZXQgQW5vdGhlcikgTm90ZTo8YnI+Ci0gKiBXZSB1c2UgPGVtPm5hbWU8L2VtPiB3aGVuIGRlYWxpbmcgd2l0aCB0aGUgdW5tb2RpZmllZCBuYW1lIG9mIGEgZGF0YWJhc2Ugb2JqZWN0Ci0gKiBhcyBzdXBwbGllZCBieSB0aGUgZGF0YWJhc2UgaXRzZWxmIChpLmUuIGl0IGlzIG5vdCBkZWxpbWl0ZWQgYW5kIGl0IGlzIGFsd2F5cwotICogY2FzZS1zZW5zaXRpdmUpLgotICogV2UgdXNlIDxlbT5pZGVudGlmaWVyPC9lbT4gd2hlbiBkZWFsaW5nIHdpdGggYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IG5hbWUgKGkuZS4gaXQgbWF5IGJlIGRlbGltaXRlZCBhbmQsIGRlcGVuZGluZyBvbiB0aGUgdmVuZG9yLCBpdCBtYXkKLSAqIGJlIGNhc2UtaW5zZW5zaXRpdmUpLgotICovCi1maW5hbCBjbGFzcyBEVFBEYXRhYmFzZVdyYXBwZXIKLQlleHRlbmRzIERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXI8RFRQQ29ubmVjdGlvblByb2ZpbGVXcmFwcGVyPgotCWltcGxlbWVudHMgRGF0YWJhc2UKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIGRhdGFiYXNlICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZHRwRGF0YWJhc2U7Ci0KLQkvKiogZGF0YWJhc2Utc3BlY2lmaWMgYmVoYXZpb3IgKi8KLQlwcml2YXRlIGZpbmFsIERUUERyaXZlckFkYXB0ZXIgZHRwRHJpdmVyQWRhcHRlcjsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkLCBzb3J0ZWQgKi8KLQlwcml2YXRlIERUUENhdGFsb2dXcmFwcGVyW10gY2F0YWxvZ3M7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQRGF0YWJhc2VXcmFwcGVyKERUUENvbm5lY3Rpb25Qcm9maWxlV3JhcHBlciBjb25uZWN0aW9uUHJvZmlsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGR0cERhdGFiYXNlKSB7Ci0JCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlKTsKLQkJdGhpcy5kdHBEYXRhYmFzZSA9IGR0cERhdGFiYXNlOwotCQl0aGlzLmR0cERyaXZlckFkYXB0ZXIgPSBEVFBEcml2ZXJBZGFwdGVyTWFuYWdlci5pbnN0YW5jZSgpLmJ1aWxkQWRhcHRlcih0aGlzLmdldFZlbmRvck5hbWUoKSwgdGhpcyk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cERhdGFiYXNlOwotCX0KLQotCS8qIFRPRE8KLQkgKiBXZSBtaWdodCB3YW50IHRvIGxpc3RlbiB0byB0aGUgInZpcnR1YWwiIGNhdGFsb2c7IGJ1dCB0aGF0J3MgcHJvYmFibHkKLQkgKiBub3QgbmVjZXNzYXJ5IHNpbmNlIHRoZXJlIGlzIG5vIGVhc3kgd2F5IGZvciB0aGUgdXNlciB0byByZWZyZXNoIGl0Ci0JICogKGkuZS4gaXQgaXMgbm90IGRpc3BsYXllZCBpbiB0aGUgRFRQIFVJKS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmRhdGFiYXNlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRFRQRGF0YWJhc2VXcmFwcGVyIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXMoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERyaXZlckFkYXB0ZXIuZ2V0RFRQU2NoZW1hcygpOwotCX0KLQotCUBPdmVycmlkZQotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYV8oZHRwU2NoZW1hKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBjYXRhbG9nLCBzbyB3ZSBrbm93IHdlIGhhdmUgY2F0YWxvZ3M7Ci0JICogaS5lLiB0aGUgc2VhcmNoIGhhcyB0byBkZXNjZW5kIHRocm91Z2ggY2F0YWxvZ3MsIHRoZW4gdG8gc2NoZW1hdGEuCi0JICovCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFGcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBTY2hlbWEuZ2V0Q2F0YWxvZygpKS5nZXRTY2hlbWFfKGR0cFNjaGVtYSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hIHdoZW4gdGhlIGRhdGFiYXNlIGlzIHRoZSBzY2hlbWEKLQkgKiBjb250YWluZXIsIHNvIHdlIGtub3cgd2UgZG9uJ3QgaGF2ZSBhbnkgY2F0YWxvZ3MuCi0JICovCi0JQE92ZXJyaWRlCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIGNhdGFsb2csIHNvIHdlIGtub3cgd2UgaGF2ZSBjYXRhbG9nczsKLQkgKiBpLmUuIHRoZSBzZWFyY2ggaGFzIHRvIGRlc2NlbmQgdGhyb3VnaCBjYXRhbG9ncywgdGhlbiB0byBzY2hlbWF0YS4KLQkgKi8KLQlEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGVGcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmdldENhdGFsb2coZHRwVGFibGUuZ2V0U2NoZW1hKCkuZ2V0Q2F0YWxvZygpKS5nZXRUYWJsZV8oZHRwVGFibGUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSB3aGVuIHRoZSBkYXRhYmFzZSBpcyB0aGUgc2NoZW1hCi0JICogY29udGFpbmVyLCBzbyB3ZSBrbm93IHdlIGRvbid0IGhhdmUgYW55IGNhdGFsb2dzLgotCSAqLwotCUBPdmVycmlkZQotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gYSBjYXRhbG9nLCBzbyB3ZSBrbm93IHdlIGhhdmUgY2F0YWxvZ3M7Ci0JICogaS5lLiB0aGUgc2VhcmNoIGhhcyB0byBkZXNjZW5kIHRocm91Z2ggY2F0YWxvZ3MsIHRoZW4gdG8gc2NoZW1hdGEuCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5Gcm9tQ2F0YWxvZ3Mob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2F0YWxvZyhkdHBDb2x1bW4uZ2V0VGFibGUoKS5nZXRTY2hlbWEoKS5nZXRDYXRhbG9nKCkpLmdldENvbHVtbl8oZHRwQ29sdW1uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZ3MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRHJpdmVyQWRhcHRlci5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q2F0YWxvZz4odGhpcy5nZXRDYXRhbG9nQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxEVFBDYXRhbG9nV3JhcHBlcj4gZ2V0Q2F0YWxvZ1dyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ2F0YWxvZ1dyYXBwZXI+KHRoaXMuZ2V0Q2F0YWxvZ0FycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyW10gZ2V0Q2F0YWxvZ0FycmF5KCkgewotCQlpZiAodGhpcy5jYXRhbG9ncyA9PSBudWxsKSB7Ci0JCQl0aGlzLmNhdGFsb2dzID0gdGhpcy5idWlsZENhdGFsb2dBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dzOwotCX0KLQotCXByaXZhdGUgRFRQQ2F0YWxvZ1dyYXBwZXJbXSBidWlsZENhdGFsb2dBcnJheSgpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZHRwQ2F0YWxvZ3MgPSB0aGlzLmdldERUUENhdGFsb2dzKCk7Ci0JCURUUENhdGFsb2dXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUENhdGFsb2dXcmFwcGVyW2R0cENhdGFsb2dzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUENhdGFsb2dXcmFwcGVyKHRoaXMsIGR0cENhdGFsb2dzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBnZXREVFBDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRHJpdmVyQWRhcHRlci5nZXREVFBDYXRhbG9ncygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2F0YWxvZ3NTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjYXRhbG9nIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjYXRhbG9nLgotCSAqLwotCURUUENhdGFsb2dXcmFwcGVyIGdldENhdGFsb2cob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZykgewotCQlmb3IgKERUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgOiB0aGlzLmdldENhdGFsb2dBcnJheSgpKSB7Ci0JCQlpZiAoY2F0YWxvZy53cmFwcyhkdHBDYXRhbG9nKSkgewotCQkJCXJldHVybiBjYXRhbG9nOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgRFRQIGNhdGFsb2c6ICIgKyBkdHBDYXRhbG9nKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nTmFtZXMoKSB7Ci0JCS8vIHRoZSBjYXRhbG9ncyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIE5BTUVfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBDYXRhbG9nV3JhcHBlciBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldENhdGFsb2dXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDYXRhbG9nSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSBjYXRhbG9ncyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0Q2F0YWxvZ1dyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBDYXRhbG9nIGdldENhdGFsb2dGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLmR0cERyaXZlckFkYXB0ZXIuc2VsZWN0Q2F0YWxvZ0ZvcklkZW50aWZpZXIodGhpcy5nZXRDYXRhbG9ncygpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIERUUENhdGFsb2dXcmFwcGVyIGdldERlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDYXRhbG9nRm9yTmFtZXModGhpcy5nZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEcml2ZXJBZGFwdGVyLmdldERlZmF1bHRDYXRhbG9nTmFtZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGZpcnN0IGNhdGFsb2cgZm91bmQuCi0JICovCi0JcHJpdmF0ZSBEVFBDYXRhbG9nV3JhcHBlciBnZXRDYXRhbG9nRm9yTmFtZXMoSXRlcmFibGU8U3RyaW5nPiBuYW1lcykgewotCQlmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKLQkJCURUUENhdGFsb2dXcmFwcGVyIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2dOYW1lZChuYW1lKTsKLQkJCWlmIChjYXRhbG9nICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBmaW5kIGEgZGVmYXVsdCBjYXRhbG9nLCByZXR1cm4gaXRzIGlkZW50aWZpZXI7Ci0JICogb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGxhc3QgbmFtZSBvbiB0aGUgbGlzdCBvZiBkZWZhdWx0IG5hbWVzLgotCSAqIChTb21lIGRhdGFiYXNlcyBoYXZlIG11bHRpcGxlIHBvc3NpYmxlIGRlZmF1bHQgbmFtZXMuKQotCSAqIFJldHVybiBudWxsIGlmIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBzdXBwb3J0IGNhdGFsb2dzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpIHsKLQkJSXRlcmFibGU8U3RyaW5nPiBuYW1lcyA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2dOYW1lcygpOwotCQlEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nID0gdGhpcy5nZXRDYXRhbG9nRm9yTmFtZXMobmFtZXMpOwotCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gY2F0YWxvZy5nZXRJZGVudGlmaWVyKCk7Ci0JCX0KLQkJSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBuYW1lcy5pdGVyYXRvcigpOwotCQlyZXR1cm4gc3RyZWFtLmhhc05leHQoKSA/IHRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIoQ29sbGVjdGlvblRvb2xzLmxhc3Qoc3RyZWFtKSkgOiBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lcyB2cy4gaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLy8gb3ZlcnJpZGUgdG8gbWFrZSBtZXRob2QgcHVibGljIHNpbmNlIGl0J3MgaW4gdGhlIERhdGFiYXNlIGludGVyZmFjZQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY29udmVydE5hbWVUb0lkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbnZlcnROYW1lVG9JZGVudGlmaWVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBtaXNjICoqKioqKioqKioKLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmR0cERhdGFiYXNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVuZG9yTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRGF0YWJhc2UuZ2V0VmVuZG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRFRQRHJpdmVyQWRhcHRlciBnZXREVFBEcml2ZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gdGhpcy5kdHBEcml2ZXJBZGFwdGVyOwotCX0KLQotCXB1YmxpYyBUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRHJpdmVyQWRhcHRlci5zZWxlY3RUYWJsZUZvcklkZW50aWZpZXIodGFibGVzLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvLyBUT0RPIGFkZCB0byBpbnRlcmZhY2U/IChzbyBpdCBjYW4gYmUgdXNlZCBieSBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIpCi0JRGF0YWJhc2VEZWZpbml0aW9uIGdldERUUERlZmluaXRpb24oKSB7Ci0JCXJldHVybiBSREJDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREYXRhYmFzZURlZmluaXRpb25SZWdpc3RyeSgpLmdldERlZmluaXRpb24odGhpcy5kdHBEYXRhYmFzZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydENhdGFsb2dzKCk7Ci0JCX0KLQkJc3VwZXIuc3RhcnRMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RhcnRDYXRhbG9ncygpIHsKLQkJZm9yIChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgewotCQkJY2F0YWxvZy5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuY2F0YWxvZ3MgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wQ2F0YWxvZ3MoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BDYXRhbG9ncygpIHsKLQkJZm9yIChEVFBDYXRhbG9nV3JhcHBlciBjYXRhbG9nIDogdGhpcy5jYXRhbG9ncykgewotCQkJY2F0YWxvZy5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmNhdGFsb2dzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJDYXRhbG9ncygpOwotCQl9Ci0JCXN1cGVyLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ2F0YWxvZ3MoKSB7Ci0JCXRoaXMuc3RvcENhdGFsb2dzKCk7Ci0JCWZvciAoRFRQQ2F0YWxvZ1dyYXBwZXIgY2F0YWxvZyA6IHRoaXMuY2F0YWxvZ3MpIHsKLQkJCWNhdGFsb2cuY2xlYXIoKTsKLQkJfQotCQl0aGlzLmNhdGFsb2dzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUEZvcmVpZ25LZXlXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMzQxYzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBGb3JlaWduS2V5V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotCi0vKioKLSAqICBXcmFwIGEgRFRQIEZvcmVpZ25LZXkKLSAqLwotZmluYWwgY2xhc3MgRFRQRm9yZWlnbktleVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcjxEVFBUYWJsZVdyYXBwZXI+Ci0JaW1wbGVtZW50cyBGb3JlaWduS2V5Ci17Ci0JLyoqIHRoZSB3cmFwcGVkIERUUCBmb3JlaWduIGtleSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleSBkdHBGb3JlaWduS2V5OwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUFRhYmxlV3JhcHBlciByZWZlcmVuY2VkVGFibGU7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgTG9jYWxDb2x1bW5QYWlyW10gY29sdW1uUGFpcnM7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAtIGJ1dCBpdCBjYW4gYmUgJ251bGwnIHNvIHdlIHVzZSBhIGZsYWcgKi8KLQlwcml2YXRlIFN0cmluZyBkZWZhdWx0QXR0cmlidXRlTmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdEF0dHJpYnV0ZU5hbWVDYWxjdWxhdGVkID0gZmFsc2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQRm9yZWlnbktleVdyYXBwZXIoRFRQVGFibGVXcmFwcGVyIGJhc2VUYWJsZSwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleSBkdHBGb3JlaWduS2V5KSB7Ci0JCXN1cGVyKGJhc2VUYWJsZSk7Ci0JCXRoaXMuZHRwRm9yZWlnbktleSA9IGR0cEZvcmVpZ25LZXk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cEZvcmVpZ25LZXk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5mb3JlaWduS2V5Q2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzLCB0aGlzLmdldE5hbWUoKSArICI6ICIgKyBBcnJheXMuYXNMaXN0KHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCkpKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8vICoqKioqKioqKiogRm9yZWlnbktleSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cEZvcmVpZ25LZXkuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBEVFBUYWJsZVdyYXBwZXIgZ2V0QmFzZVRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBEVFBUYWJsZVdyYXBwZXIgZ2V0UmVmZXJlbmNlZFRhYmxlKCkgewotCQlpZiAodGhpcy5yZWZlcmVuY2VkVGFibGUgPT0gbnVsbCkgewotCQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSB0aGlzLmdldEJhc2VUYWJsZSgpLmdldFRhYmxlKHRoaXMuZHRwRm9yZWlnbktleS5nZXRVbmlxdWVDb25zdHJhaW50KCkuZ2V0QmFzZVRhYmxlKCkpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlZmVyZW5jZWRUYWJsZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWZlcmVuY2VzU2luZ2xlQ29sdW1uUHJpbWFyeUtleSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29sdW1uUGFpcnNTaXplKCkgIT0gMSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICh0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0UmVmZXJlbmNlZENvbHVtbigpID09IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCX0KLQotCS8vICoqKioqIGNvbHVtbiBwYWlycwotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtblBhaXI+IGdldENvbHVtblBhaXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Q29sdW1uUGFpcj4odGhpcy5nZXRDb2x1bW5QYWlyQXJyYXkoKSk7Ci0JfQotCi0JcHVibGljIExvY2FsQ29sdW1uUGFpciBnZXRDb2x1bW5QYWlyKCkgewotCQlMb2NhbENvbHVtblBhaXJbXSBwYWlycyA9IHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCk7Ci0JCWlmIChwYWlycy5sZW5ndGggIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibXVsdGlwbGUgY29sdW1uIHBhaXJzOiAiICsgcGFpcnMubGVuZ3RoKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcGFpcnNbMF07Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+IGdldExvY2FsQ29sdW1uUGFpcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxMb2NhbENvbHVtblBhaXI+KHRoaXMuZ2V0Q29sdW1uUGFpckFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIExvY2FsQ29sdW1uUGFpcltdIGdldENvbHVtblBhaXJBcnJheSgpIHsKLQkJaWYgKHRoaXMuY29sdW1uUGFpcnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5QYWlycyA9IHRoaXMuYnVpbGRDb2x1bW5QYWlyQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5jb2x1bW5QYWlyczsKLQl9Ci0KLQlwcml2YXRlIExvY2FsQ29sdW1uUGFpcltdIGJ1aWxkQ29sdW1uUGFpckFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGJhc2VDb2x1bW5zID0gdGhpcy5nZXREVFBCYXNlQ29sdW1ucygpOwotCQlpbnQgc2l6ZSA9IGJhc2VDb2x1bW5zLnNpemUoKTsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiByZWZDb2x1bW5zID0gdGhpcy5nZXREVFBSZWZlcmVuY2VDb2x1bW5zKCk7Ci0JCWlmIChyZWZDb2x1bW5zLnNpemUoKSAhPSBzaXplKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHRoaXMuZ2V0QmFzZVRhYmxlKCkuZ2V0TmFtZSgpICsgJy4nICsgdGhpcy5nZXROYW1lKCkgKwotCQkJCQkJCQkiIC0gbWlzbWF0Y2hlZCBzaXplczogIiArIHNpemUgKyAiIHZzLiAiICsgcmVmQ29sdW1ucy5zaXplKCkpOyAgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpcltdIHJlc3VsdCA9IG5ldyBMb2NhbENvbHVtblBhaXJbYmFzZUNvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IGJhc2VDb2x1bW5zLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgTG9jYWxDb2x1bW5QYWlyKAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihiYXNlQ29sdW1ucy5nZXQoaSkpLAotCQkJCQkJCQl0aGlzLmdldEJhc2VUYWJsZSgpLmdldENvbHVtbihyZWZDb2x1bW5zLmdldChpKSkKLQkJCQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIENvbHVtblBhaXIuQkFTRV9DT0xVTU5fQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwRm9yZWlnbktleS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBSZWZlcmVuY2VDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5LmdldFVuaXF1ZUNvbnN0cmFpbnQoKS5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5QYWlyc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbHVtblBhaXJBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXRCYXNlQ29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPExvY2FsQ29sdW1uUGFpciwgQ29sdW1uPih0aGlzLmdldExvY2FsQ29sdW1uUGFpcnMoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybShMb2NhbENvbHVtblBhaXIgcGFpcikgewotCQkJCXJldHVybiBwYWlyLmdldEJhc2VDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlib29sZWFuIGJhc2VDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuZ2V0QmFzZUNvbHVtbnMoKSwgY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8Q29sdW1uPiBnZXROb25QcmltYXJ5S2V5QmFzZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8Q29sdW1uPih0aGlzLmdldEJhc2VDb2x1bW5zKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KENvbHVtbiBjb2x1bW4pIHsKLQkJCQlyZXR1cm4gISBjb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxMb2NhbENvbHVtblBhaXIsIENvbHVtbj4odGhpcy5nZXRMb2NhbENvbHVtblBhaXJzKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbHVtbiB0cmFuc2Zvcm0oTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIpIHsKLQkJCQlyZXR1cm4gY29sdW1uUGFpci5nZXRSZWZlcmVuY2VkQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKiogYXR0cmlidXRlIG5hbWUKLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpIHsKLQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdGhpcy5nZXREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQlyZXR1cm4gKGRlZmF1bHROYW1lICE9IG51bGwpID8gZGVmYXVsdE5hbWUgOiB0aGlzLmdldE5vbkRlZmF1bHRBdHRyaWJ1dGVOYW1lKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lQ2FsY3VsYXRlZCkgewotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSB0cnVlOwotCQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZSA9IHRoaXMuYnVpbGREZWZhdWx0QXR0cmlidXRlTmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVOYW1lOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICggISB0aGlzLnJlZmVyZW5jZXNTaW5nbGVDb2x1bW5QcmltYXJ5S2V5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxvY2FsQ29sdW1uUGFpciBjb2x1bW5QYWlyID0gdGhpcy5nZXRDb2x1bW5QYWlyKCk7Ci0JCVN0cmluZyBiYXNlQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIHJlZkNvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCWlmIChiYXNlQ29sTmFtZS5sZW5ndGgoKSA8PSAocmVmQ29sTmFtZS5sZW5ndGgoKSArIDEpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoICEgYmFzZUNvbE5hbWUuZW5kc1dpdGgocmVmQ29sTmFtZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBfaW5kZXggPSBiYXNlQ29sTmFtZS5sZW5ndGgoKSAtIHJlZkNvbE5hbWUubGVuZ3RoKCkgLSAxOwotCQlpZiAoYmFzZUNvbE5hbWUuY2hhckF0KF9pbmRleCkgIT0gJ18nKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gYmFzZUNvbE5hbWUuc3Vic3RyaW5nKDAsIF9pbmRleCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBpcyBhIHNpbXBsZSAoc2luZ2xlLWNvbHVtbikgZm9yZWlnbiBrZXksIHVzZSB0aGUgbmFtZSBvZiB0aGUKLQkgKiBzaW5nbGUgYmFzZSBjb2x1bW4gdG8gYnVpbGQgYSBuYW1lLiBJZiB0aGlzIGlzIGEgY29tcG91bmQgZm9yZWlnbiBrZXksCi0JICogcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlLgotCSAqLwotCS8vIFRPRE8gaWYgdGhlcmUgaXMgb25seSBvbmUgRksgdG8gYSBnaXZlbiB0YWJsZSwgdXNlIHRoZSB0YWJsZSdzIG5hbWUgaW5zdGVhZCBvZiB0aGUgY29sdW1uJ3MgbmFtZT8KLQlwcml2YXRlIFN0cmluZyBnZXROb25EZWZhdWx0QXR0cmlidXRlTmFtZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldENvbHVtblBhaXJzU2l6ZSgpID09IDEpID8KLQkJCQkJCXRoaXMuZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIDoKLQkJCQkJCXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSB1bmRlcnNjb3JlIGNoZWNrIGlzIGhlbHBmdWwgd2hlbiB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gaXMgPGVtPm5vdDwvZW0+IHRoZQotCSAqIHByaW1hcnkga2V5IG9mIHRoZSByZWZlcmVuY2VkIHRhYmxlIChpLmUuIGl0IGhhcyBvbmx5IGEgPGVtPnVuaXF1ZTwvZW0+IGNvbnN0cmFpbnQpLgotCSAqIDxwcmU+Ci0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfSUQgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVJRCAgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEUiCi0JICogICAgIEZvcmVpZ25LZXkoRU1QLkNVQklDTEVfUEsgPT4gQ1VCSUNMRS5JRCkgPT4gIkNVQklDTEVfUEsiCi0JICogPC9wcmU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9uRGVmYXVsdEF0dHJpYnV0ZU5hbWVGcm9tQmFzZUNvbHVtbigpIHsKLQkJTG9jYWxDb2x1bW5QYWlyIGNvbHVtblBhaXIgPSB0aGlzLmdldENvbHVtblBhaXIoKTsKLQkJU3RyaW5nIGJhc2VDb2xOYW1lID0gY29sdW1uUGFpci5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcmVmQ29sTmFtZSA9IGNvbHVtblBhaXIuZ2V0UmVmZXJlbmNlZENvbHVtbigpLmdldE5hbWUoKTsKLQkJaW50IGxlbiA9IGJhc2VDb2xOYW1lLmxlbmd0aCgpOwotCQlpbnQgcmVmTGVuID0gcmVmQ29sTmFtZS5sZW5ndGgoKTsKLQkJaWYgKChsZW4gPiByZWZMZW4pICYmIGJhc2VDb2xOYW1lLmVuZHNXaXRoKHJlZkNvbE5hbWUpKSB7Ci0JCQlsZW4gPSBsZW4gLSByZWZMZW47Ci0JCQlpZiAoKGxlbiA+IDEpICYmIGJhc2VDb2xOYW1lLmNoYXJBdChsZW4gLSAxKSA9PSAnXycpIHsKLQkJCQlsZW4gPSBsZW4gLSAxOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlQ29sTmFtZS5zdWJzdHJpbmcoMCwgbGVuKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGFtcGxlczo8dWw+Ci0JICogPGxpPk9yYWNsZSBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT09fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+UG9zdGdyZVNRTCBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29faWQgPT4gaWQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KGZvb19pZCA9PiBmb29faWQpIHZzLiAiZm9vIiA9PiAiZm9vX2lkIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb28gPT4gaWQpIHZzLiAiZm9vIiA9PiAiZm9vIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiXCJGb29fSURcIiIKLQkgKiA8L2NvZGU+PC91bD4KLQkgKiA8bGk+U1FMIFNlcnZlciBldGMuPHVsPjxjb2RlPgotCSAqICAgICA8bGk+Rm9yZWlnbktleShmb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiBudWxsCi0JICogICAgIDxsaT5Gb3JlaWduS2V5KEZPT19JRCA9PiBGT09fSUQpIHZzLiAiZm9vIiA9PiAiRk9PX0lEIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGT08gPT4gSUQpIHZzLiAiZm9vIiA9PiAiRk9PIgotCSAqICAgICA8bGk+Rm9yZWlnbktleShGb29fSUQgPT4gSUQpIHZzLiAiZm9vIiA9PiAiRm9vX0lEIgotCSAqIDwvY29kZT48L3VsPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJU3RyaW5nIGJhc2VDb2x1bW5OYW1lID0gdGhpcy5nZXRDb2x1bW5QYWlyKCkuZ2V0QmFzZUNvbHVtbigpLmdldE5hbWUoKTsKLQkJU3RyaW5nIGRlZmF1bHRCYXNlQ29sdW1uTmFtZSA9IGF0dHJpYnV0ZU5hbWUgKyAnXycgKyB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCXJldHVybiB0aGlzLmdldERUUERyaXZlckFkYXB0ZXIoKS5jb252ZXJ0TmFtZVRvSWRlbnRpZmllcihiYXNlQ29sdW1uTmFtZSwgZGVmYXVsdEJhc2VDb2x1bW5OYW1lKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlib29sZWFuIHdyYXBzKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLmNvbnN0cmFpbnRzLkZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQlyZXR1cm4gdGhpcy5kdHBGb3JlaWduS2V5ID09IGZvcmVpZ25LZXk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIHRoZSBmb3JlaWduIGtleSBkb2VzIG5vdCAiY29udGFpbiIgYW55IG90aGVyIG9iamVjdHMsCi0JCS8vIHNvIHdlIGRvbid0IG5lZWQgdG8gZm9yd2FyZCB0aGUgI2NsZWFyKCkKLQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZUNhbGN1bGF0ZWQgPSBmYWxzZTsKLQkJdGhpcy5kZWZhdWx0QXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCXRoaXMuY29sdW1uUGFpcnMgPSAgbnVsbDsKLQkJdGhpcy5yZWZlcmVuY2VkVGFibGUgPSBudWxsOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb2x1bW4gcGFpciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgTG9jYWxDb2x1bW5QYWlyIGltcGxlbWVudHMgQ29sdW1uUGFpciB7Ci0JCXByaXZhdGUgZmluYWwgRFRQQ29sdW1uV3JhcHBlciBiYXNlQ29sdW1uOwotCQlwcml2YXRlIGZpbmFsIERUUENvbHVtbldyYXBwZXIgcmVmZXJlbmNlZENvbHVtbjsKLQotCQlMb2NhbENvbHVtblBhaXIoRFRQQ29sdW1uV3JhcHBlciBiYXNlQ29sdW1uLCBEVFBDb2x1bW5XcmFwcGVyIHJlZmVyZW5jZWRDb2x1bW4pIHsKLQkJCXN1cGVyKCk7Ci0JCQlpZiAoKGJhc2VDb2x1bW4gPT0gbnVsbCkgfHwgKHJlZmVyZW5jZWRDb2x1bW4gPT0gbnVsbCkpIHsKLQkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJCX0KLQkJCXRoaXMuYmFzZUNvbHVtbiA9IGJhc2VDb2x1bW47Ci0JCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW4gPSByZWZlcmVuY2VkQ29sdW1uOwotCQl9Ci0KLQkJcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0QmFzZUNvbHVtbigpIHsKLQkJCXJldHVybiB0aGlzLmJhc2VDb2x1bW47Ci0JCX0KLQotCQlwdWJsaWMgRFRQQ29sdW1uV3JhcHBlciBnZXRSZWZlcmVuY2VkQ29sdW1uKCkgewotCQkJcmV0dXJuIHRoaXMucmVmZXJlbmNlZENvbHVtbjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5iYXNlQ29sdW1uLmdldE5hbWUoKSArICI9PiIgKyB0aGlzLnJlZmVyZW5jZWRDb2x1bW4uZ2V0TmFtZSgpKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQwZjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkFycmF5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5UcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2VPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci0KLS8qKgotICogQ29hbGVzY2UgYmVoYXZpb3IgZm9yIGEgc2NoZW1hIGNvbnRhaW5lciAoaS5lLiBkYXRhYmFzZSBvciBjYXRhbG9nKS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcjxQIGV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3Q+Ci0JZXh0ZW5kcyBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXI8UD4KLQlpbXBsZW1lbnRzIFNjaGVtYUNvbnRhaW5lcgotewotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBTY2hlbWFXcmFwcGVyW10gc2NoZW1hdGE7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcihQIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGFic3RyYWN0IG1ldGhvZHMgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzY2hlbWEgY29udGFpbmVyJ3MgRFRQIHNjaGVtYXMuCi0JICovCi0JYWJzdHJhY3QgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hPiBnZXREVFBTY2hlbWFzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNjaGVtYSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgc2NoZW1hLgotCSAqLwotCWFic3RyYWN0IERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKTsKLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IFRoZSBzY2hlbWEgY29udGFpbmVyIChkYXRhYmFzZSBvciBjYXRhbG9nKSBjb250YWlucwotCSAqIHRoZSBzcGVjaWZpZWQgc2NoZW1hLgotCSAqLwotCURUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hIGR0cFNjaGVtYSkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5nZXRTY2hlbWFBcnJheSgpKSB7Ci0JCQlpZiAoc2NoZW1hLndyYXBzKGR0cFNjaGVtYSkpIHsKLQkJCQlyZXR1cm4gc2NoZW1hOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludmFsaWQgRFRQIHNjaGVtYTogIiArIGR0cFNjaGVtYSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0YWJsZSBmb3IgdGhlIHNwZWNpZmllZCBEVFAgdGFibGUuCi0JICogVGhpcyBpcyBvbmx5IGNhbGxlZCBmcm9tIGEgc2NoZW1hICh0byBpdHMgY29udGFpbmVyKS4KLQkgKi8KLQlhYnN0cmFjdCBEVFBUYWJsZVdyYXBwZXIgZ2V0VGFibGUob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKTsKLQotCS8qKgotCSAqIFByZS1jb25kaXRpb246IFRoZSBzY2hlbWEgY29udGFpbmVyIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgdGFibGUuCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlXyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgZHRwVGFibGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hXyhkdHBUYWJsZS5nZXRTY2hlbWEoKSkuZ2V0VGFibGVfKGR0cFRhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uLgotCSAqIFRoaXMgaXMgb25seSBjYWxsZWQgZnJvbSBhIHNjaGVtYSAodG8gaXRzIGNvbnRhaW5lcikuCi0JICovCi0JYWJzdHJhY3QgRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pOwotCi0JLyoqCi0JICogUHJlLWNvbmRpdGlvbjogVGhlIHNjaGVtYSBjb250YWluZXIgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlXyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzY2hlbWF0YSAqKioqKioqKioqCi0KLQlwdWJsaWMgSXRlcmFibGU8U2NoZW1hPiBnZXRTY2hlbWF0YSgpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPFNjaGVtYT4odGhpcy5nZXRTY2hlbWFBcnJheSgpKTsKLQl9Ci0KLQlJdGVyYWJsZTxEVFBTY2hlbWFXcmFwcGVyPiBnZXRTY2hlbWFXcmFwcGVycygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPERUUFNjaGVtYVdyYXBwZXI+KHRoaXMuZ2V0U2NoZW1hQXJyYXkoKSk7Ci0JfQotCi0Jc3luY2hyb25pemVkIERUUFNjaGVtYVdyYXBwZXJbXSBnZXRTY2hlbWFBcnJheSgpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgPT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWF0YSA9IHRoaXMuYnVpbGRTY2hlbWFBcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNjaGVtYXRhOwotCX0KLQotCXByaXZhdGUgRFRQU2NoZW1hV3JhcHBlcltdIGJ1aWxkU2NoZW1hQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZHRwU2NoZW1hdGEgPSB0aGlzLmdldERUUFNjaGVtYXMoKTsKLQkJRFRQU2NoZW1hV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBTY2hlbWFXcmFwcGVyW2R0cFNjaGVtYXRhLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOyApIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBTY2hlbWFXcmFwcGVyKHRoaXMsIGR0cFNjaGVtYXRhLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHVibGljIGludCBnZXRTY2hlbWF0YVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFNjaGVtYUFycmF5KCkubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFNjaGVtYU5hbWVzKCkgewotCQkvLyB0aGUgc2NoZW1hdGEgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFNjaGVtYVdyYXBwZXJzKCksIE5BTUVfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFXcmFwcGVyIGdldFNjaGVtYU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBhbHJlYWR5IHNvcnRlZAotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uSXRlcmFibGU8RGF0YWJhc2VPYmplY3QsIFN0cmluZz4odGhpcy5nZXRTY2hlbWFXcmFwcGVycygpLCBJREVOVElGSUVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldFNjaGVtYUZvcklkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RFRQRHJpdmVyQWRhcHRlcigpLnNlbGVjdFNjaGVtYUZvcklkZW50aWZpZXIodGhpcy5nZXRTY2hlbWF0YSgpLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTY2hlbWFGb3JOYW1lcyh0aGlzLmdldERUUERyaXZlckFkYXB0ZXIoKS5nZXREZWZhdWx0U2NoZW1hTmFtZXMoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaXJzdCBzY2hlbWEgZm91bmQuCi0JICovCi0JRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWFGb3JOYW1lcyhJdGVyYWJsZTxTdHJpbmc+IG5hbWVzKSB7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgewotCQkJRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYU5hbWVkKG5hbWUpOwotCQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHNjaGVtYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB3ZSBmaW5kIGEgZGVmYXVsdCBzY2hlbWEsIHJldHVybiBpdHMgaWRlbnRpZmllcjsKLQkgKiBvdGhlcndpc2UsIHJldHVybiB0aGUgbGFzdCBuYW1lIG9uIHRoZSBsaXN0IG9mIGRlZmF1bHQgbmFtZXMuCi0JICogKFNvbWUgY29udGFpbmVycyBoYXZlIG11bHRpcGxlIHBvc3NpYmxlIGRlZmF1bHQgbmFtZXMuKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCkgewotCQlJdGVyYWJsZTxTdHJpbmc+IG5hbWVzID0gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKCk7Ci0JCURUUFNjaGVtYVdyYXBwZXIgc2NoZW1hID0gdGhpcy5nZXRTY2hlbWFGb3JOYW1lcyhuYW1lcyk7Ci0JCS8vIGFzc3VtZSAnbmFtZXMnIGlzIG5vbi1lbXB0eSAoISkKLQkJcmV0dXJuIChzY2hlbWEgIT0gbnVsbCkgPwotCQkJCXNjaGVtYS5nZXRJZGVudGlmaWVyKCkgOgotCQkJCXRoaXMuY29udmVydE5hbWVUb0lkZW50aWZpZXIoQ29sbGVjdGlvblRvb2xzLmxhc3QobmFtZXMpKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuaW5nICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0YXJ0TGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0U2NoZW1hdGEoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNjaGVtYXRhKCkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdG9wTGlzdGVuaW5nKCkgewotCQlpZiAodGhpcy5zY2hlbWF0YSAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BTY2hlbWF0YSgpOwotCQl9Ci0JCXN1cGVyLnN0b3BMaXN0ZW5pbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFNjaGVtYXRhKCkgewotCQlmb3IgKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hIDogdGhpcy5zY2hlbWF0YSkgewotCQkJc2NoZW1hLnN0b3BMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbGVhciAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuc2NoZW1hdGEgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclNjaGVtYXRhKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTY2hlbWF0YSgpIHsKLQkJdGhpcy5zdG9wU2NoZW1hdGEoKTsKLQkJZm9yIChEVFBTY2hlbWFXcmFwcGVyIHNjaGVtYSA6IHRoaXMuc2NoZW1hdGEpIHsKLQkJCXNjaGVtYS5jbGVhcigpOwotCQl9Ci0JCXRoaXMuc2NoZW1hdGEgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQU2NoZW1hV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYzcwNDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTY2hlbWFXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlNRTFRhYmxlc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBTY2hlbWEKLSAqLwotZmluYWwgY2xhc3MgRFRQU2NoZW1hV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyPERUUFNjaGVtYUNvbnRhaW5lcldyYXBwZXI8Pz4+Ci0JaW1wbGVtZW50cyBTY2hlbWEKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIHNjaGVtYSAqLwotCXByaXZhdGUgZmluYWwgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBkdHBTY2hlbWE7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQVGFibGVXcmFwcGVyW10gdGFibGVzOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQgKi8KLQlwcml2YXRlIERUUFNlcXVlbmNlV3JhcHBlcltdIHNlcXVlbmNlczsKLQotCQotCS8vICoqKioqKioqKiogY29uc3RhbnRzICoqKioqKioqKioKLQkKLQkvKiogdXNlZCBmb3IgYWRvcHRlciBwcm9kdWN0IGN1c3RvbWl6YXRpb24gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOVF9BTkRfVklFV19UQUJMRVNfT05MWSA9ICJzdXBwb3J0UGVyc2lzdGVudEFuZFZpZXdUYWJsZXNPbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCURUUFNjaGVtYVdyYXBwZXIoRFRQU2NoZW1hQ29udGFpbmVyV3JhcHBlcjw/PiBjb250YWluZXIsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hKSB7Ci0JCXN1cGVyKGNvbnRhaW5lcik7Ci0JCXRoaXMuZHRwU2NoZW1hID0gZHRwU2NoZW1hOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JSUNhdGFsb2dPYmplY3QgZ2V0Q2F0YWxvZ09iamVjdCgpIHsKLQkJcmV0dXJuIChJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTY2hlbWE7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2F0YWxvZ09iamVjdENoYW5nZWQoKSB7Ci0JCXN1cGVyLmNhdGFsb2dPYmplY3RDaGFuZ2VkKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5zY2hlbWFDaGFuZ2VkKHRoaXMpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBTY2hlbWEgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBEVFBTY2hlbWFDb250YWluZXJXcmFwcGVyPD8+IGdldENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50OwotCX0KLQotCS8vICoqKioqIHRhYmxlcwotCi0JcHVibGljIEl0ZXJhYmxlPFRhYmxlPiBnZXRUYWJsZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxUYWJsZT4odGhpcy5nZXRUYWJsZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RFRQVGFibGVXcmFwcGVyPiBnZXRUYWJsZVdyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQVGFibGVXcmFwcGVyPih0aGlzLmdldFRhYmxlQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQVGFibGVXcmFwcGVyW10gZ2V0VGFibGVBcnJheSgpIHsKLQkJaWYgKHRoaXMudGFibGVzID09IG51bGwpIHsKLQkJCXRoaXMudGFibGVzID0gdGhpcy5idWlsZFRhYmxlQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy50YWJsZXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBUYWJsZVdyYXBwZXJbXSBidWlsZFRhYmxlQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBkdHBUYWJsZXMgPSB0aGlzLmdldERUUFRhYmxlcygpOwotCQlEVFBUYWJsZVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQVGFibGVXcmFwcGVyW2R0cFRhYmxlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBUYWJsZVdyYXBwZXIodGhpcywgZHRwVGFibGVzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZ2V0RFRQVGFibGVzKCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZT4gZHRwVGFibGVzID0gdGhpcy5nZXREVFBUYWJsZXNfKCk7Ci0JCXJldHVybiB0aGlzLmhhY2soKSA/IHRoaXMuaGFjayhkdHBUYWJsZXMpIDogZHRwVGFibGVzOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBnZXREVFBUYWJsZXNfKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTY2hlbWEuZ2V0VGFibGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhY2soKSB7Ci0JCS8vIHRoZSBwcm9kdWN0IGlzIG51bGwgZHVyaW5nIGp1bml0IHRlc3RpbmcKLQkJSVByb2R1Y3QgcHJvZHVjdCA9IFBsYXRmb3JtLmdldFByb2R1Y3QoKTsKLQkJU3RyaW5nIGhhY2sgPSAocHJvZHVjdCA9PSBudWxsKSA/IG51bGwgOiBwcm9kdWN0LmdldFByb3BlcnR5KFBFUlNJU1RFTlRfQU5EX1ZJRVdfVEFCTEVTX09OTFkpOwotCQlyZXR1cm4gKGhhY2sgIT0gbnVsbCkgJiYgaGFjay5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBEVFAgZXh0ZW5kZXJzIHRoYXQgc3VwcG9ydCBzeW5vbnltcyBidXQgZG9uJ3Qgd2FudCB0byBoYXZlIHRoZW0gYXBwZWFyCi0JLy8gaW4gRGFsaSB0byBmaWx0ZXIgb3V0IHRoZXNlIHRhYmxlIHR5cGVzIGZyb20gRGFsaSAKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBoYWNrKExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPiBkdHBUYWJsZXMpIHsKLQkJTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlPigpOwotCQlmb3IgKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSA6IGR0cFRhYmxlcykgewotCQkJaWYgKHRoaXMuaGFjayhkdHBUYWJsZSkpIHsKLQkJCQlyZXN1bHQuYWRkKGR0cFRhYmxlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBoYWNrKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlyZXR1cm4gU1FMVGFibGVzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0UGVyc2lzdGVudFRhYmxlKCkuaXNTdXBlclR5cGVPZihkdHBUYWJsZS5lQ2xhc3MoKSkgfHwKLQkJCQkJU1FMVGFibGVzUGFja2FnZS5lSU5TVEFOQ0UuZ2V0Vmlld1RhYmxlKCkuaXNTdXBlclR5cGVPZihkdHBUYWJsZS5lQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWJsZXNTaXplKCkgewotCQlyZXR1cm4gdGhpcy5nZXRUYWJsZUFycmF5KCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlCi0JICovCi0JRFRQVGFibGVXcmFwcGVyIGdldFRhYmxlKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQkvLyB0cnkgdG8gc2hvcnQtY2lyY3VpdCB0aGUgc2VhcmNoCi0JCXJldHVybiB0aGlzLndyYXBzKGR0cFRhYmxlLmdldFNjaGVtYSgpKSA/Ci0JCQkJCQl0aGlzLmdldFRhYmxlXyhkdHBUYWJsZSkgOgotCQkJCQkJdGhpcy5nZXRDb250YWluZXIoKS5nZXRUYWJsZShkdHBUYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCB0YWJsZQotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZV8ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIGR0cFRhYmxlKSB7Ci0JCWZvciAoRFRQVGFibGVXcmFwcGVyIHRhYmxlIDogdGhpcy5nZXRUYWJsZUFycmF5KCkpIHsKLQkJCWlmICh0YWJsZS53cmFwcyhkdHBUYWJsZSkpIHsKLQkJCQlyZXR1cm4gdGFibGU7Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgdGFibGU6ICIgKyBkdHBUYWJsZSk7ICAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERUUFRhYmxlV3JhcHBlciBnZXRUYWJsZU5hbWVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWQodGhpcy5nZXRUYWJsZVdyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCXB1YmxpYyBJdGVyYWJsZTxTdHJpbmc+IGdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKSB7Ci0JCS8vIHRoZSB0YWJsZXMgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldFRhYmxlV3JhcHBlcnMoKSwgSURFTlRJRklFUl9UUkFOU0ZPUk1FUik7Ci0JfQotCi0JcHVibGljIFRhYmxlIGdldFRhYmxlRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuc2VsZWN0VGFibGVGb3JJZGVudGlmaWVyKHRoaXMuZ2V0VGFibGVzKCksIGlkZW50aWZpZXIpOwotCX0KLQotCS8vICoqKioqIHNlcXVlbmNlcwotCi0JcHVibGljIEl0ZXJhYmxlPFNlcXVlbmNlPiBnZXRTZXF1ZW5jZXMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxTZXF1ZW5jZT4odGhpcy5nZXRTZXF1ZW5jZUFycmF5KCkpOwotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8RFRQU2VxdWVuY2VXcmFwcGVyPiBnZXRTZXF1ZW5jZVdyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQU2VxdWVuY2VXcmFwcGVyPih0aGlzLmdldFNlcXVlbmNlQXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQU2VxdWVuY2VXcmFwcGVyW10gZ2V0U2VxdWVuY2VBcnJheSgpIHsKLQkJaWYgKHRoaXMuc2VxdWVuY2VzID09IG51bGwpIHsKLQkJCXRoaXMuc2VxdWVuY2VzID0gdGhpcy5idWlsZFNlcXVlbmNlQXJyYXkoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zZXF1ZW5jZXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBTZXF1ZW5jZVdyYXBwZXJbXSBidWlsZFNlcXVlbmNlQXJyYXkoKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNlcXVlbmNlPiBkdHBTZXF1ZW5jZXMgPSB0aGlzLmdldERUUFNlcXVlbmNlcygpOwotCQlEVFBTZXF1ZW5jZVdyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQU2VxdWVuY2VXcmFwcGVyW2R0cFNlcXVlbmNlcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gcmVzdWx0Lmxlbmd0aDsgaS0tID4gMDspIHsKLQkJCXJlc3VsdFtpXSA9IG5ldyBEVFBTZXF1ZW5jZVdyYXBwZXIodGhpcywgZHRwU2VxdWVuY2VzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2U+IGdldERUUFNlcXVlbmNlcygpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hLmdldFNlcXVlbmNlcygpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U2VxdWVuY2VzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0U2VxdWVuY2VBcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgRFRQU2VxdWVuY2VXcmFwcGVyIGdldFNlcXVlbmNlTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldFNlcXVlbmNlV3JhcHBlcnMoKSwgbmFtZSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U29ydGVkU2VxdWVuY2VJZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIHNlcXVlbmNlcyBhcmUgYWxyZWFkeSBzb3J0ZWQKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbkl0ZXJhYmxlPERhdGFiYXNlT2JqZWN0LCBTdHJpbmc+KHRoaXMuZ2V0U2VxdWVuY2VXcmFwcGVycygpLCBJREVOVElGSUVSX1RSQU5TRk9STUVSKTsKLQl9Ci0KLQlwdWJsaWMgU2VxdWVuY2UgZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLmdldERUUERyaXZlckFkYXB0ZXIoKS5zZWxlY3RTZXF1ZW5jZUZvcklkZW50aWZpZXIodGhpcy5nZXRTZXF1ZW5jZXMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0JLy8gKioqKiogcmVmcmVzaAotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCQotCQl0aGlzLmdldENhdGFsb2dPYmplY3QoKS5yZWZyZXNoKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2RzICoqKioqKioqKioKLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBzY2hlbWEpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2NoZW1hID09IHNjaGVtYTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbHVtbiBmb3IgdGhlIHNwZWNpZmllZCBEVFAgY29sdW1uLgotCSAqLwotCURUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCS8vIHRyeSB0byBzaG9ydC1jaXJjdWl0IHRoZSBzZWFyY2gKLQkJcmV0dXJuIHRoaXMud3JhcHMoZHRwQ29sdW1uLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpID8KLQkJCQkJCXRoaXMuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pIDoKLQkJCQkJCXRoaXMuZ2V0Q29udGFpbmVyKCkuZ2V0Q29sdW1uKGR0cENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lIHRoZSBzY2hlbWEgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCXJldHVybiB0aGlzLmdldFRhYmxlXyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkuZ2V0Q29sdW1uXyhkdHBDb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5pbmcgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RhcnRMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0U2VxdWVuY2VzKCk7Ci0JCX0KLQkJaWYgKHRoaXMudGFibGVzICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRUYWJsZXMoKTsKLQkJfQotCQlzdXBlci5zdGFydExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFNlcXVlbmNlcygpIHsKLQkJZm9yIChEVFBTZXF1ZW5jZVdyYXBwZXIgc2VxdWVuY2UgOiB0aGlzLnNlcXVlbmNlcykgewotCQkJc2VxdWVuY2Uuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIHN0b3BMaXN0ZW5pbmcoKSB7Ci0JCWlmICh0aGlzLnNlcXVlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0b3BTZXF1ZW5jZXMoKTsKLQkJfQotCQlpZiAodGhpcy50YWJsZXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wVGFibGVzKCk7Ci0JCX0KLQkJc3VwZXIuc3RvcExpc3RlbmluZygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9wU2VxdWVuY2VzKCkgewotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcFRhYmxlcygpIHsKLQkJZm9yIChEVFBUYWJsZVdyYXBwZXIgdGFibGUgOiB0aGlzLnRhYmxlcykgewotCQkJdGFibGUuc3RvcExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNsZWFyICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5zZXF1ZW5jZXMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhclNlcXVlbmNlcygpOwotCQl9Ci0JCWlmICh0aGlzLnRhYmxlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNsZWFyVGFibGVzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJTZXF1ZW5jZXMoKSB7Ci0JCXRoaXMuc3RvcFNlcXVlbmNlcygpOwotCQlmb3IgKERUUFNlcXVlbmNlV3JhcHBlciBzZXF1ZW5jZSA6IHRoaXMuc2VxdWVuY2VzKSB7Ci0JCQlzZXF1ZW5jZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMuc2VxdWVuY2VzID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJUYWJsZXMoKSB7Ci0JCXRoaXMuc3RvcFRhYmxlcygpOwotCQlmb3IgKERUUFRhYmxlV3JhcHBlciB0YWJsZSA6IHRoaXMudGFibGVzKSB7Ci0JCQl0YWJsZS5jbGVhcigpOwotCQl9Ci0JCXRoaXMudGFibGVzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9EVFBTZXF1ZW5jZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMTRlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFNlcXVlbmNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLQotLyoqCi0gKiAgV3JhcCBhIERUUCBTZXF1ZW5jZQotICovCi1maW5hbCBjbGFzcyBEVFBTZXF1ZW5jZVdyYXBwZXIKLQlleHRlbmRzIERUUERhdGFiYXNlT2JqZWN0V3JhcHBlcjxEVFBTY2hlbWFXcmFwcGVyPgotCWltcGxlbWVudHMgU2VxdWVuY2UKLXsKLQkvKiogdGhlIHdyYXBwZWQgRFRQIHNlcXVlbmNlICovCi0JcHJpdmF0ZSBmaW5hbCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2U7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3IgKioqKioqKioqKgotCi0JRFRQU2VxdWVuY2VXcmFwcGVyKERUUFNjaGVtYVdyYXBwZXIgc2NoZW1hLCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2UgZHRwU2VxdWVuY2UpIHsKLQkJc3VwZXIoc2NoZW1hKTsKLQkJdGhpcy5kdHBTZXF1ZW5jZSA9IGR0cFNlcXVlbmNlOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBEVFBEYXRhYmFzZU9iamVjdFdyYXBwZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JSUNhdGFsb2dPYmplY3QgZ2V0Q2F0YWxvZ09iamVjdCgpIHsKLQkJcmV0dXJuIChJQ2F0YWxvZ09iamVjdCkgdGhpcy5kdHBTZXF1ZW5jZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBjYXRhbG9nT2JqZWN0Q2hhbmdlZCgpIHsKLQkJc3VwZXIuY2F0YWxvZ09iamVjdENoYW5nZWQoKTsKLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLnNlcXVlbmNlQ2hhbmdlZCh0aGlzKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogU2VxdWVuY2UgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kdHBTZXF1ZW5jZS5nZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIERUUFNjaGVtYVdyYXBwZXIgZ2V0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JYm9vbGVhbiB3cmFwcyhvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJcmV0dXJuIHRoaXMuZHRwU2VxdWVuY2UgPT0gc2VxdWVuY2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBjbGVhcigpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYXIKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQVGFibGVXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL0RUUFRhYmxlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2E1OGM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvRFRQVGFibGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5jb25zdHJhaW50cy5QcmltYXJ5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5CYXNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqICBXcmFwIGEgRFRQIFRhYmxlCi0gKi8KLWZpbmFsIGNsYXNzIERUUFRhYmxlV3JhcHBlcgotCWV4dGVuZHMgRFRQRGF0YWJhc2VPYmplY3RXcmFwcGVyPERUUFNjaGVtYVdyYXBwZXI+Ci0JaW1wbGVtZW50cyBUYWJsZQotewotCS8qKiB0aGUgd3JhcHBlZCBEVFAgdGFibGUgKi8KLQlwcml2YXRlIGZpbmFsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZTsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBDb2x1bW5XcmFwcGVyW10gY29sdW1uczsKLQotCS8qKiBsYXp5LWluaXRpYWxpemVkICovCi0JcHJpdmF0ZSBEVFBDb2x1bW5XcmFwcGVyW10gcHJpbWFyeUtleUNvbHVtbnM7Ci0KLQkvKiogbGF6eS1pbml0aWFsaXplZCAqLwotCXByaXZhdGUgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBmb3JlaWduS2V5czsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQQ29sdW1uV3JhcHBlcltdIEVNUFRZX0NPTFVNTlMgPSBuZXcgRFRQQ29sdW1uV3JhcHBlclswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVFBGb3JlaWduS2V5V3JhcHBlcltdIEVNUFRZX0ZPUkVJR05fS0VZUyA9IG5ldyBEVFBGb3JlaWduS2V5V3JhcHBlclswXTsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvciAqKioqKioqKioqCi0KLQlEVFBUYWJsZVdyYXBwZXIoRFRQU2NoZW1hV3JhcHBlciBzY2hlbWEsIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5UYWJsZSBkdHBUYWJsZSkgewotCQlzdXBlcihzY2hlbWEpOwotCQl0aGlzLmR0cFRhYmxlID0gZHRwVGFibGU7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0Q29sdW1ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhYmxlPENvbHVtbj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIEl0ZXJhYmxlPERUUENvbHVtbldyYXBwZXI+IGdldENvbHVtbldyYXBwZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8RFRQQ29sdW1uV3JhcHBlcj4odGhpcy5nZXRDb2x1bW5BcnJheSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0Q29sdW1uQXJyYXkoKSB7Ci0JCWlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbCkgewotCQkJdGhpcy5jb2x1bW5zID0gdGhpcy5idWlsZENvbHVtbkFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuY29sdW1uczsKLQl9Ci0KLQlwcml2YXRlIERUUENvbHVtbldyYXBwZXJbXSBidWlsZENvbHVtbkFycmF5KCkgewotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IGR0cENvbHVtbnMgPSB0aGlzLmdldERUUENvbHVtbnMoKTsKLQkJRFRQQ29sdW1uV3JhcHBlcltdIHJlc3VsdCA9IG5ldyBEVFBDb2x1bW5XcmFwcGVyW2R0cENvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSBuZXcgRFRQQ29sdW1uV3JhcHBlcih0aGlzLCBkdHBDb2x1bW5zLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIEFycmF5VG9vbHMuc29ydChyZXN1bHQsIERFRkFVTFRfQ09NUEFSQVRPUik7Ci0JfQotCi0JLy8gbWluaW1pemUgc2NvcGUgb2Ygc3VwcHJlc3NlZCB3YXJuaW5ncwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuQ29sdW1uPiBnZXREVFBDb2x1bW5zKCkgewotCQlyZXR1cm4gdGhpcy5kdHBUYWJsZS5nZXRDb2x1bW5zKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q29sdW1uQXJyYXkoKS5sZW5ndGg7Ci0JfQotCi0JcHVibGljIERUUENvbHVtbldyYXBwZXIgZ2V0Q29sdW1uTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZCh0aGlzLmdldENvbHVtbldyYXBwZXJzKCksIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkIERUUCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW4ob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbiBkdHBDb2x1bW4pIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyhkdHBDb2x1bW4uZ2V0VGFibGUoKSkgPwotCQkJCQkJdGhpcy5nZXRDb2x1bW5fKGR0cENvbHVtbikgOgotCQkJCQkJdGhpcy5nZXRTY2hlbWEoKS5nZXRDb2x1bW4oZHRwQ29sdW1uKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmUtY29uZGl0aW9uOiBUaGUgdGFibGUgY29udGFpbnMgdGhlIHNwZWNpZmllZCBjb2x1bW4uCi0JICovCi0JRFRQQ29sdW1uV3JhcHBlciBnZXRDb2x1bW5fKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4gZHRwQ29sdW1uKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmdldENvbHVtbkFycmF5KCkpIHsKLQkJCWlmIChjb2x1bW4ud3JhcHMoZHRwQ29sdW1uKSkgewotCQkJCXJldHVybiBjb2x1bW47Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW52YWxpZCBEVFAgY29sdW1uOiAiICsgZHRwQ29sdW1uKTsgIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpIHsKLQkJLy8gdGhlIGNvbHVtbnMgYXJlIGFscmVhZHkgc29ydGVkCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxEYXRhYmFzZU9iamVjdCwgU3RyaW5nPih0aGlzLmdldENvbHVtbldyYXBwZXJzKCksIElERU5USUZJRVJfVFJBTlNGT1JNRVIpOwotCX0KLQotCXB1YmxpYyBDb2x1bW4gZ2V0Q29sdW1uRm9ySWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEcml2ZXJBZGFwdGVyKCkuc2VsZWN0Q29sdW1uRm9ySWRlbnRpZmllcih0aGlzLmdldENvbHVtbnMoKSwgaWRlbnRpZmllcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHByaW1hcnkga2V5IGNvbHVtbnMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPENvbHVtbj4gZ2V0UHJpbWFyeUtleUNvbHVtbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlJdGVyYWJsZTxDb2x1bW4+KHRoaXMuZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkpOwotCX0KLQotCXB1YmxpYyBEVFBDb2x1bW5XcmFwcGVyIGdldFByaW1hcnlLZXlDb2x1bW4oKSB7Ci0JCURUUENvbHVtbldyYXBwZXJbXSBwa0NvbHVtbnMgPSB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQlpZiAocGtDb2x1bW5zLmxlbmd0aCAhPSAxKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJtdWx0aXBsZSBwcmltYXJ5IGtleSBjb2x1bW5zOiAiICsgcGtDb2x1bW5zLmxlbmd0aCk7ICAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHBrQ29sdW1uc1swXTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEVFBDb2x1bW5XcmFwcGVyW10gZ2V0UHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAodGhpcy5wcmltYXJ5S2V5Q29sdW1ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLnByaW1hcnlLZXlDb2x1bW5zID0gdGhpcy5idWlsZFByaW1hcnlLZXlDb2x1bW5BcnJheSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLnByaW1hcnlLZXlDb2x1bW5zOwotCX0KLQotCXByaXZhdGUgRFRQQ29sdW1uV3JhcHBlcltdIGJ1aWxkUHJpbWFyeUtleUNvbHVtbkFycmF5KCkgewotCQlpZiAoICEgKHRoaXMuZHRwVGFibGUgaW5zdGFuY2VvZiBCYXNlVGFibGUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlQcmltYXJ5S2V5IHBrID0gKChCYXNlVGFibGUpIHRoaXMuZHRwVGFibGUpLmdldFByaW1hcnlLZXkoKTsKLQkJaWYgKHBrID09IG51bGwpIHsKLQkJCS8vIG5vIFBLIHdhcyBkZWZpbmVkCi0JCQlyZXR1cm4gRU1QVFlfQ09MVU1OUzsKLQkJfQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnRhYmxlcy5Db2x1bW4+IHBrQ29sdW1ucyA9IHRoaXMuZ2V0Q29sdW1ucyhwayk7Ci0JCURUUENvbHVtbldyYXBwZXJbXSByZXN1bHQgPSBuZXcgRFRQQ29sdW1uV3JhcHBlcltwa0NvbHVtbnMuc2l6ZSgpXTsKLQkJZm9yIChpbnQgaSA9IHJlc3VsdC5sZW5ndGg7IGktLSA+IDA7KSB7Ci0JCQlyZXN1bHRbaV0gPSB0aGlzLmdldENvbHVtbihwa0NvbHVtbnMuZ2V0KGkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLkNvbHVtbj4gZ2V0Q29sdW1ucyhQcmltYXJ5S2V5IHBrKSB7Ci0JCXJldHVybiBway5nZXRNZW1iZXJzKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLmxlbmd0aDsKLQl9Ci0KLQlib29sZWFuIHByaW1hcnlLZXlDb2x1bW5zQ29udGFpbnMoQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gQXJyYXlUb29scy5jb250YWlucyh0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5BcnJheSgpLCBjb2x1bW4pOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmb3JlaWduIGtleXMgKioqKioqKioqKgotCi0JcHVibGljIEl0ZXJhYmxlPEZvcmVpZ25LZXk+IGdldEZvcmVpZ25LZXlzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmFibGU8Rm9yZWlnbktleT4odGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgRFRQRm9yZWlnbktleVdyYXBwZXJbXSBnZXRGb3JlaWduS2V5QXJyYXkoKSB7Ci0JCWlmICh0aGlzLmZvcmVpZ25LZXlzID09IG51bGwpIHsKLQkJCXRoaXMuZm9yZWlnbktleXMgPSB0aGlzLmJ1aWxkRm9yZWlnbktleUFycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZm9yZWlnbktleXM7Ci0JfQotCi0JcHJpdmF0ZSBEVFBGb3JlaWduS2V5V3JhcHBlcltdIGJ1aWxkRm9yZWlnbktleUFycmF5KCkgewotCQlpZiAoICEgKHRoaXMuZHRwVGFibGUgaW5zdGFuY2VvZiBCYXNlVGFibGUpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfRk9SRUlHTl9LRVlTOwotCQl9Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZHRwRm9yZWlnbktleXMgPSB0aGlzLmdldERUUEZvcmVpZ25LZXlzKCk7Ci0JCURUUEZvcmVpZ25LZXlXcmFwcGVyW10gcmVzdWx0ID0gbmV3IERUUEZvcmVpZ25LZXlXcmFwcGVyW2R0cEZvcmVpZ25LZXlzLnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSByZXN1bHQubGVuZ3RoOyBpLS0gPiAwOykgewotCQkJcmVzdWx0W2ldID0gbmV3IERUUEZvcmVpZ25LZXlXcmFwcGVyKHRoaXMsIGR0cEZvcmVpZ25LZXlzLmdldChpKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuY29uc3RyYWludHMuRm9yZWlnbktleT4gZ2V0RFRQRm9yZWlnbktleXMoKSB7Ci0JCXJldHVybiAoKEJhc2VUYWJsZSkgdGhpcy5kdHBUYWJsZSkuZ2V0Rm9yZWlnbktleXMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEZvcmVpZ25LZXlzU2l6ZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KCkubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIHJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY29sdW1uIGlzIGEgYmFzZSBjb2x1bW4gZm9yIGF0IGxlYXN0IG9uZQotCSAqIG9mIHRoZSB0aGUgdGFibGUncyBmb3JlaWduIGtleXMKLQkgKi8KLQlib29sZWFuIGZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKENvbHVtbiBjb2x1bW4pIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBma1dyYXBwZXIgOiB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpKSB7Ci0JCQlpZiAoZmtXcmFwcGVyLmJhc2VDb2x1bW5zQ29udGFpbnMoY29sdW1uKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogam9pbiB0YWJsZSAqKioqKioqKioqCi0KLQlwdWJsaWMgYm9vbGVhbiBpc1Bvc3NpYmxlSm9pblRhYmxlKCkgewotCQlpZiAodGhpcy5nZXRGb3JlaWduS2V5QXJyYXkoKS5sZW5ndGggIT0gMikgewotCQkJcmV0dXJuIGZhbHNlOyAgLy8gdGhlIHRhYmxlIG11c3QgaGF2ZSBleGFjdGx5IDIgZm9yZWlnbiBrZXlzCi0JCX0KLQkJZm9yIChDb2x1bW4gY29sdW1uIDogdGhpcy5nZXRDb2x1bW5zKCkpIHsKLQkJCWlmICggISB0aGlzLmZvcmVpZ25LZXlCYXNlQ29sdW1uc0NvbnRhaW5zKGNvbHVtbikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7ICAvLyBhbGwgdGhlIHRhYmxlJ3MgY29sdW1ucyBtdXN0IGJlbG9uZyB0byBvbmUgKG9yIGJvdGgpIG9mIHRoZSAyIGZvcmVpZ24ga2V5cwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSB0YWJsZSBuYW1lIGlzIDxjb2RlPkZPT19CQVI8L2NvZGU+Ci0JICogYW5kIGl0IGpvaW5zIHRhYmxlcyA8Y29kZT5GT088L2NvZGU+IGFuZCA8Y29kZT5CQVI8L2NvZGU+LAotCSAqIHJldHVybiB0aGUgZm9yZWlnbiBrZXkgdG8gPGNvZGU+Rk9PPC9jb2RlPjsKLQkgKiBpZiB0aGUgdGFibGUgbmFtZSBpcyA8Y29kZT5CQVJfRk9PPC9jb2RlPgotCSAqIGFuZCBpdCBqb2lucyB0YWJsZXMgPGNvZGU+Rk9PPC9jb2RlPiBhbmQgPGNvZGU+QkFSPC9jb2RlPiwKLQkgKiByZXR1cm4gdGhlIGZvcmVpZ24ga2V5IHRvIDxjb2RlPkJBUjwvY29kZT47Ci0JICogb3RoZXJ3aXNlIHNpbXBseSByZXR1cm4gdGhlIGZpcnN0IGZvcmVpZ24ga2V5IGluIHRoZSBhcnJheS4KLQkgKi8KLQlwdWJsaWMgRm9yZWlnbktleSBnZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCkgewotCQlGb3JlaWduS2V5IGZrMCA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMF07Ci0JCVN0cmluZyBuYW1lMCA9IGZrMC5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCk7Ci0KLQkJRm9yZWlnbktleSBmazEgPSB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpWzFdOwotCQlTdHJpbmcgbmFtZTEgPSBmazEuZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0TmFtZSgpOwotCi0JCXJldHVybiB0aGlzLmdldE5hbWUoKS5lcXVhbHMobmFtZTEgKyAnXycgKyBuYW1lMCkgPyBmazEgOiBmazA7Ci0JfQotCi0JcHVibGljIEZvcmVpZ25LZXkgZ2V0Sm9pblRhYmxlTm9uT3duaW5nRm9yZWlnbktleSgpIHsKLQkJRm9yZWlnbktleSBmazAgPSB0aGlzLmdldEZvcmVpZ25LZXlBcnJheSgpWzBdOwotCQlGb3JlaWduS2V5IGZrMSA9IHRoaXMuZ2V0Rm9yZWlnbktleUFycmF5KClbMV07Ci0JCUZvcmVpZ25LZXkgb2ZrID0gdGhpcy5nZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCk7Ci0JCXJldHVybiAob2ZrID09IGZrMCkgPyBmazEgOiBmazA7Ci0JfQotCi0JLyoqCi0JICogSG1tbS4uLi4KLQkgKiBXZSBtaWdodCB3YW50IHRvIGdvIHRvIHRoZSBwbGF0Zm9ybSB0byBhbGxvdyBhIHZlbmRvci1zcGVjaWZpYwotCSAqIGNvbXBhcmlzb24gaGVyZTsKLQkgKiBidXQsIHNpbmNlIGFsbCB0aGUgbmFtZXMgYXJlIGNvbWluZyBkaXJlY3RseSBmcm9tIHRoZSBkYXRhYmFzZQotCSAqIChpLmUuIHRoZXJlIGFyZSBubyBjb252ZXJzaW9ucyB0byBKYXZhIGlkZW50aWZpZXJzIGV0Yy4pLCBpdCBzZWVtcwotCSAqIGxpa2Ugd2UgY2FuIGp1c3QgY29tcGFyZSB0aGVtIGRpcmVjdGx5IGFuZCBpZ25vcmUgY2FzZS1zZW5zaXRpdml0eQotCSAqIGlzc3Vlcy4uLi4gIH5ianYKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBqb2luVGFibGVOYW1lSXNEZWZhdWx0KCkgewotCQlyZXR1cm4gdGhpcy5nZXROYW1lKCkuZXF1YWxzKHRoaXMuYnVpbGREZWZhdWx0Sm9pblRhYmxlTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZERlZmF1bHRKb2luVGFibGVOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5nZXRKb2luVGFibGVPd25pbmdUYWJsZSgpLmdldE5hbWUoKQotCQkJCQkrICdfJwotCQkJCQkrIHRoaXMuZ2V0Sm9pblRhYmxlTm9uT3duaW5nVGFibGUoKS5nZXROYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBUYWJsZSBnZXRKb2luVGFibGVPd25pbmdUYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Sm9pblRhYmxlT3duaW5nRm9yZWlnbktleSgpLmdldFJlZmVyZW5jZWRUYWJsZSgpOwotCX0KLQotCXByaXZhdGUgVGFibGUgZ2V0Sm9pblRhYmxlTm9uT3duaW5nVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldEpvaW5UYWJsZU5vbk93bmluZ0ZvcmVpZ25LZXkoKS5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWlzYyAqKioqKioqKioqCi0KLQlwdWJsaWMgRFRQU2NoZW1hV3JhcHBlciBnZXRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLnBhcmVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmR0cFRhYmxlLmdldE5hbWUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlJQ2F0YWxvZ09iamVjdCBnZXRDYXRhbG9nT2JqZWN0KCkgewotCQlyZXR1cm4gKElDYXRhbG9nT2JqZWN0KSB0aGlzLmR0cFRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXN5bmNocm9uaXplZCB2b2lkIGNhdGFsb2dPYmplY3RDaGFuZ2VkKCkgewotCQlzdXBlci5jYXRhbG9nT2JqZWN0Q2hhbmdlZCgpOwotCQl0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkudGFibGVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCWJvb2xlYW4gd3JhcHMob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwudGFibGVzLlRhYmxlIHRhYmxlKSB7Ci0JCXJldHVybiB0aGlzLmR0cFRhYmxlID09IHRhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgRFRQIHRhYmxlLgotCSAqLwotCURUUFRhYmxlV3JhcHBlciBnZXRUYWJsZShvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC50YWJsZXMuVGFibGUgdGFibGUpIHsKLQkJLy8gdHJ5IHRvIHNob3J0LWNpcmN1aXQgdGhlIHNlYXJjaAotCQlyZXR1cm4gdGhpcy53cmFwcyh0YWJsZSkgPyB0aGlzIDogdGhpcy5nZXRTY2hlbWEoKS5nZXRUYWJsZSh0YWJsZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmluZyAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlzeW5jaHJvbml6ZWQgdm9pZCBzdGFydExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdGFydEZvcmVpZ25LZXlzKCk7Ci0JCX0KLQkJaWYgKHRoaXMuY29sdW1ucyAhPSBudWxsKSB7Ci0JCQl0aGlzLnN0YXJ0Q29sdW1ucygpOwotCQl9Ci0JCXN1cGVyLnN0YXJ0TGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0Rm9yZWlnbktleXMoKSB7Ci0JCWZvciAoRFRQRm9yZWlnbktleVdyYXBwZXIgZm9yZWlnbktleSA6IHRoaXMuZm9yZWlnbktleXMpIHsKLQkJCWZvcmVpZ25LZXkuc3RhcnRMaXN0ZW5pbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdGFydExpc3RlbmluZygpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgc3RvcExpc3RlbmluZygpIHsKLQkJaWYgKHRoaXMuZm9yZWlnbktleXMgIT0gbnVsbCkgewotCQkJdGhpcy5zdG9wRm9yZWlnbktleXMoKTsKLQkJfQotCQlpZiAodGhpcy5jb2x1bW5zICE9IG51bGwpIHsKLQkJCXRoaXMuc3RvcENvbHVtbnMoKTsKLQkJfQotCQlzdXBlci5zdG9wTGlzdGVuaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BGb3JlaWduS2V5cygpIHsKLQkJZm9yIChEVFBGb3JlaWduS2V5V3JhcHBlciBmb3JlaWduS2V5IDogdGhpcy5mb3JlaWduS2V5cykgewotCQkJZm9yZWlnbktleS5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3RvcENvbHVtbnMoKSB7Ci0JCWZvciAoRFRQQ29sdW1uV3JhcHBlciBjb2x1bW4gOiB0aGlzLmNvbHVtbnMpIHsKLQkJCWNvbHVtbi5zdG9wTGlzdGVuaW5nKCk7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY2xlYXIgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0Jc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCWlmICh0aGlzLmZvcmVpZ25LZXlzICE9IG51bGwpIHsKLQkJCXRoaXMuY2xlYXJGb3JlaWduS2V5cygpOwotCQl9Ci0KLQkJLy8gdGhlIHRhYmxlIGRvZXMgbm90ICJjb250YWluIiB0aGUgcGsgY29sdW1ucywgc28gbm8gbmVlZCB0byBmb3J3YXJkICNjbGVhcigpCi0JCXRoaXMucHJpbWFyeUtleUNvbHVtbnMgPSBudWxsOwotCi0JCWlmICh0aGlzLmNvbHVtbnMgIT0gbnVsbCkgewotCQkJdGhpcy5jbGVhckNvbHVtbnMoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjbGVhckZvcmVpZ25LZXlzKCkgewotCQl0aGlzLnN0b3BGb3JlaWduS2V5cygpOwotCQlmb3IgKERUUEZvcmVpZ25LZXlXcmFwcGVyIGZvcmVpZ25LZXkgOiB0aGlzLmZvcmVpZ25LZXlzKSB7Ci0JCQlmb3JlaWduS2V5LmNsZWFyKCk7Ci0JCX0KLSAgICAJdGhpcy5mb3JlaWduS2V5cyA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyQ29sdW1ucygpIHsKLQkJdGhpcy5zdG9wQ29sdW1ucygpOwotCQlmb3IgKERUUENvbHVtbldyYXBwZXIgY29sdW1uIDogdGhpcy5jb2x1bW5zKSB7Ci0JCQljb2x1bW4uY2xlYXIoKTsKLQkJfQotICAgIAl0aGlzLmNvbHVtbnMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0Fic3RyYWN0RFRQRHJpdmVyQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2U4NDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXRNZXRhRGF0YTsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUuZGVmaW5pdGlvbi5EYXRhYmFzZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uaW50ZXJuYWwuY29yZS5SREJDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuUmVzdWx0U2V0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIENvbnNvbGlkYXRlIHRoZSBiZWhhdmlvciBjb21tb24gdG8gdGhlIHR5cGljYWwgRFRQIGRyaXZlcnMuCi0gKiAKLSAqIEBzZWUgVW5rbm93bgotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLQlpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXIKLXsKLQkvKioKLQkgKiBUaGUgRGFsaSBkYXRhYmFzZSB0aGF0IHdyYXBzIHRoZSBjb3JyZXNwb25kaW5nIERUUCBkYXRhYmFzZS4KLQkgKi8KLQlmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZTsKLQotCS8qKgotCSAqIERUUCBkcml2ZXJzIHJldHVybiBjYXRhbG9ncyBhbmQgc2NoZW1hdGEgaW4gYSB2YXJpZXR5IG9mIHdheXMuLi4uCi0JICovCi0JZmluYWwgQ2F0YWxvZ1N0cmF0ZWd5IGNhdGFsb2dTdHJhdGVneTsKLQotCS8qKgotCSAqIFRoZSBTUUwgc3BlYyBzYXlzIGEgPGVtPnJlZ3VsYXI8L2VtPiAobm9uLWRlbGltaXRlZCkgaWRlbnRpZmllciBzaG91bGQgYmUKLQkgKiBmb2xkZWQgdG8gdXBwZXJjYXNlOyBidXQgc29tZSBkYXRhYmFzZXMgZG8gb3RoZXJ3aXNlIChlLmcuIFN5YmFzZSkuCi0JICovCi0JZmluYWwgRm9sZGluZ1N0cmF0ZWd5IGZvbGRpbmdTdHJhdGVneTsKLQotCi0JQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQkJdGhpcy5jYXRhbG9nU3RyYXRlZ3kgPSB0aGlzLmJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCk7Ci0JCXRoaXMuZm9sZGluZ1N0cmF0ZWd5ID0gdGhpcy5idWlsZEZvbGRpbmdTdHJhdGVneSgpOwotCX0KLQotCWFic3RyYWN0IENhdGFsb2dTdHJhdGVneSBidWlsZENhdGFsb2dTdHJhdGVneSgpOwotCi0JYWJzdHJhY3QgRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCk7Ci0KLQotCS8vICoqKioqKioqKiogY2F0YWxvZ3MgKioqKioqKioqKgotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIHRoaXMuY2F0YWxvZ1N0cmF0ZWd5LnN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZz4gZ2V0RFRQQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0aGlzLmNhdGFsb2dTdHJhdGVneS5nZXRDYXRhbG9ncygpOwotCX0KLQotCS8qKgotCSAqIFR5cGljYWxseSwgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgY2F0YWxvZyBpcyB0aGUgdXNlciBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRDYXRhbG9nTmFtZXMoKSB7Ci0JCXJldHVybiB0aGlzLnN1cHBvcnRzQ2F0YWxvZ3MoKSA/IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2dOYW1lc18oKSA6IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0JfQotCi0JZmluYWwgSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzXygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8obmFtZXMpOwotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0Jdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKHRoaXMuZ2V0VXNlck5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNjaGVtYXMgKioqKioqKioqKgotCi0JcHVibGljIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYT4gZ2V0RFRQU2NoZW1hcygpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmNhdGFsb2dTdHJhdGVneS5nZXRTY2hlbWFzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oImRyaXZlciBhZGFwdGVyOiAiICsgdGhpcywgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUeXBpY2FsbHksIHRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IHNjaGVtYSBpcyB0aGUgdXNlciBuYW1lLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJdGVyYWJsZTxTdHJpbmc+IGdldERlZmF1bHRTY2hlbWFOYW1lcygpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJdGhpcy5hZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhuYW1lcyk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmdldFVzZXJOYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBuYW1lIC0+IGlkZW50aWZpZXIgKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSkgewotCQlpZiAodGhpcy50cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSkgewotCQkJcmV0dXJuIG5hbWU7ICAvLyBubyBkZWxpbWl0ZXJzIG5lY2Vzc2FyeQotCQl9Ci0JCWlmICh0aGlzLm5hbWVSZXF1aXJlc0RlbGltaXRlcnMobmFtZSkpIHsKLQkJCXJldHVybiB0aGlzLmRlbGltaXROYW1lKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8vIFRPRE8gYnJlYWsgaW50byBjb252ZXJ0aW5nIHRhYmxlIGFuZCBjb2x1bW4gbmFtZXMgc28gTXlTUUwgd29ya3MgYmV0dGVyCi0JcHVibGljIFN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHROYW1lKSB7Ci0JCWlmICgoICEgdGhpcy50cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSkgJiYgIHRoaXMubmFtZVJlcXVpcmVzRGVsaW1pdGVycyhuYW1lKSkgewotCQkJLy8gbm8gbWF0Y2ggcG9zc2libGUKLQkJCXJldHVybiB0aGlzLmRlbGltaXROYW1lKG5hbWUpOwotCQl9Ci0JCWlmICh0aGlzLnJlZ3VsYXJOYW1lc01hdGNoKG5hbWUsIGRlZmF1bHROYW1lKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkYXRhYmFzZSBvYmplY3QgbmFtZSBtdXN0IGJlIGRlbGltaXRlZAotCSAqIHdoZW4gdXNlZCBpbiBhbiBTUUwgc3RhdGVtZW50LgotCSAqIElmIHRoZSBuYW1lIGhhcyBhbnkgPGVtPnNwZWNpYWw8L2VtPiBjaGFyYWN0ZXJzIChhcyBvcHBvc2VkIHRvIGxldHRlcnMsCi0JICogZGlnaXRzLCBhbmQgb3RoZXIgYWxsb3dlZCBjaGFyYWN0ZXJzIFtlLmcuIHVuZGVyc2NvcmVzXSksIGl0IHJlcXVpcmVzCi0JICogZGVsaW1pdGVycy4KLQkgKiBJZiB0aGUgbmFtZSBpcyBtaXhlZCBjYXNlIGFuZCB0aGUgZGF0YWJhc2UgZm9sZHMgdW5kZWxpbWl0ZWQgbmFtZXMKLQkgKiAodG8gZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UpLCBpdCByZXF1aXJlcyBkZWxpbWl0ZXJzLgotCSAqLwotCWJvb2xlYW4gbmFtZVJlcXVpcmVzRGVsaW1pdGVycyhTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKG5hbWUubGVuZ3RoKCkgPT0gMCkgIC8vICBhbiBlbXB0eSBzdHJpbmcgbXVzdCBiZSBkZWxpbWl0ZWQoPykKLQkJCQkJfHwgdGhpcy5uYW1lSXNSZXNlcnZlZFdvcmQobmFtZSkKLQkJCQkJfHwgdGhpcy5uYW1lQ29udGFpbnNBbnlTcGVjaWFsQ2hhcmFjdGVycyhuYW1lKQotCQkJCQl8fCB0aGlzLm5hbWVJc05vdEZvbGRlZChuYW1lKTsKLQl9Ci0KLQlib29sZWFuIG5hbWVJc1Jlc2VydmVkV29yZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEZWZpbml0aW9uKCkuaXNTUUxLZXl3b3JkKG5hbWUpOwotCX0KLQotCS8vIFRPRE8gbWFrZSBEYXRhYmFzZS5nZXREVFBEZWZpbml0aW9uKCkgcHVibGljPwotCURhdGFiYXNlRGVmaW5pdGlvbiBnZXREVFBEZWZpbml0aW9uKCkgewotCQlyZXR1cm4gUkRCQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGF0YWJhc2VEZWZpbml0aW9uUmVnaXN0cnkoKS5nZXREZWZpbml0aW9uKHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBuYW1lIGNvbnRhaW5zIGFueSA8ZW0+c3BlY2lhbDwvZW0+Ci0JICogY2hhcmFjdGVycyB0aGF0IHJlcXVpcmUgdGhlIG5hbWUgdG8gYmUgZGVsaW1pdGVkLgotCSAqIDxicj4KLQkgKiBQcmUtY29uZGl0aW9uOiB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGVtcHR5Ci0JICovCi0JYm9vbGVhbiBuYW1lQ29udGFpbnNBbnlTcGVjaWFsQ2hhcmFjdGVycyhTdHJpbmcgbmFtZSkgewotCQljaGFyW10gc3RyaW5nID0gbmFtZS50b0NoYXJBcnJheSgpOwotCQlpZiAodGhpcy5jaGFyYWN0ZXJJc05vblJlZ3VsYXJOYW1lU3RhcnQoc3RyaW5nWzBdKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IHN0cmluZy5sZW5ndGg7IGktLSA+IDE7ICkgeyAgLy8gbm90ZTogc3RvcCBhdCAxCi0JCQlpZiAodGhpcy5jaGFyYWN0ZXJJc05vblJlZ3VsYXJOYW1lUGFydChzdHJpbmdbaV0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIG5vbi08ZW0+cmVndWxhcjwvZW0+IGZvciB0aGUgZmlyc3QKLQkgKiBjaGFyYWN0ZXIgb2YgYSBuYW1lLgotCSAqIFR5cGljYWxseSwgZGF0YWJhc2VzIGFyZSBtb3JlIHJlc3RyaWN0aXZlIGFib3V0IHdoYXQgY2hhcmFjdGVycyBjYW4KLQkgKiBiZSB1c2VkIHRvIDxlbT5zdGFydDwvZW0+IGFuIGlkZW50aWZpZXIgKGFzIG9wcG9zZWQgdG8gdGhlIGNoYXJhY3RlcnMKLQkgKiBhbGxvd2VkIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBpZGVudGlmaWVyKS4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuICEgdGhpcy5jaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgPGVtPnJlZ3VsYXI8L2VtPiBmb3IgdGhlIGZpcnN0Ci0JICogY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBUaGUgZmlyc3QgY2hhcmFjdGVyIG9mIGFuIGlkZW50aWZpZXIgY2FuIGJlOjx1bD4KLQkgKiA8bGk+YSBsZXR0ZXIKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgZGF0YWJhc2Utc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gc3RhcnQgY2hhcmFjdGVycwotCSAqIDwvdWw+Ci0JICovCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc1JlZ3VsYXJOYW1lU3RhcnQoY2hhciBjKSB7Ci0JCS8vIGFsbCBkYXRhYmFzZXMgYWxsb3cgYSBsZXR0ZXIKLQkJcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlcihjKQotCQkJCXx8IHRoaXMuY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnQoYyk7Ci0JfQotCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVTdGFydChjaGFyIGMpIHsKLQkJcmV0dXJuIHRoaXMuYXJyYXlDb250YWlucyh0aGlzLmdldEV4dGVuZGVkUmVndWxhck5hbWVTdGFydENoYXJhY3RlcnMoKSwgYyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSA8ZW0+cmVndWxhcjwvZW0+IGNoYXJhY3RlcnMsIGJleW9uZCBsZXR0ZXJzLCBmb3IgdGhlCi0JICogZmlyc3QgY2hhcmFjdGVyIG9mIGEgbmFtZS4KLQkgKiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vICJleHRlbmRlZCIgY2hhcmFjdGVycy4KLQkgKi8KLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgaXMgbm9uLTxlbT5yZWd1bGFyPC9lbT4gZm9yIHRoZQotCSAqIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjaGFyYWN0ZXJzIG9mIGEgbmFtZS4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzTm9uUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gISB0aGlzLmNoYXJhY3RlcklzUmVndWxhck5hbWVQYXJ0KGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGlzIDxlbT5yZWd1bGFyPC9lbT4gZm9yIHRoZSBzZWNvbmQgYW5kCi0JICogc3Vic2VxdWVudCBjaGFyYWN0ZXJzIG9mIGEgbmFtZS4KLQkgKiBUaGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMgb2YgYSA8ZW0+cmVndWxhcjwvZW0+IG5hbWUgY2FuIGJlOjx1bD4KLQkgKiA8bGk+YSBsZXR0ZXIKLQkgKiA8bGk+YSBkaWdpdAotCSAqIDxsaT5hbiB1bmRlcnNjb3JlCi0JICogPGxpPmFueSBvZiB0aGUgZXh0ZW5kZWQsIGRhdGFiYXNlLXNwZWNpZmljLCA8ZW0+cmVndWxhcjwvZW0+IHN0YXJ0IGNoYXJhY3RlcnMKLQkgKiA8bGk+YW55IG9mIHRoZSBleHRlbmRlZCwgZGF0YWJhc2Utc3BlY2lmaWMsIDxlbT5yZWd1bGFyPC9lbT4gcGFydCBjaGFyYWN0ZXJzCi0JICogPC91bD4KLQkgKi8KLQlib29sZWFuIGNoYXJhY3RlcklzUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQkvLyBhbGwgZGF0YWJhc2VzIGFsbG93IGEgbGV0dGVyIG9yIGRpZ2l0Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpIHx8Ci0JCQkJKGMgPT0gJ18nKSB8fAotCQkJCXRoaXMuY2hhcmFjdGVySXNFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnQoYykgfHwKLQkJCQl0aGlzLmNoYXJhY3RlcklzRXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnQoYyk7Ci0JfQotCi0JYm9vbGVhbiBjaGFyYWN0ZXJJc0V4dGVuZGVkUmVndWxhck5hbWVQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gdGhpcy5hcnJheUNvbnRhaW5zKHRoaXMuZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCksIGMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgPGVtPnJlZ3VsYXI8L2VtPiBjaGFyYWN0ZXJzLCBiZXlvbmQgbGV0dGVycyBhbmQgZGlnaXRzIGFuZCB0aGUKLQkgKiA8ZW0+cmVndWxhcjwvZW0+IGZpcnN0IGNoYXJhY3RlcnMsIGZvciB0aGUgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGNoYXJhY3RlcnMKLQkgKiBvZiBhbiBpZGVudGlmaWVyLiBSZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIGFkZGl0aW9uYWwgY2hhcmFjdGVycy4KLQkgKi8KLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvbGRlZCB0byB0aGUgZGF0YWJhc2UncwotCSAqIGNhc2UsIHJlcXVpcmluZyBpdCB0byBiZSBkZWxpbWl0ZWQuCi0JICovCi0JYm9vbGVhbiBuYW1lSXNOb3RGb2xkZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuICEgdGhpcy5mb2xkaW5nU3RyYXRlZ3kubmFtZUlzRm9sZGVkKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgPGVtPnJlZ3VsYXI8L2VtPiBuYW1lcyBtYXRjaC4KLQkgKiBUeXBpY2FsbHksIDxlbT5yZWd1bGFyPC9lbT4gaWRlbnRpZmllcnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi0JICovCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gbmFtZTEuZXF1YWxzSWdub3JlQ2FzZShuYW1lMik7Ci0JfQotCi0JLyoqCi0JICogV3JhcCB0aGUgc3BlY2lmaWVkIG5hbWUgaW4gZGVsaW1pdGVycyAodHlwaWNhbGx5IGRvdWJsZS1xdW90ZXMpLAotCSAqIGNvbnZlcnRpbmcgaXQgdG8gYW4gaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgZGVsaW1pdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnF1b3RlKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGlmaWVyIC0+IG5hbWUgKioqKioqKioqKgotCi0JLy8gbm90IHN1cmUgaG93IHRvIGhhbmRsZSBhbiBlbXB0eSBzdHJpbmc6Ci0JLy8gYm90aCAiIiBhbmQgIlwiXCIiIGFyZSBjb252ZXJ0ZWQgdG8gIiIgLi4uCi0JLy8gY29udmVydCAiIiB0byAnbnVsbCcgc2luY2UgZW1wdHkgc3RyaW5ncyBtdXN0IGJlIGRlbGltaXRlZD8KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCWlmIChpZGVudGlmaWVyID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICh0aGlzLnRyZWF0SWRlbnRpZmllcnNBc0RlbGltaXRlZCgpKSB7Ci0JCQlyZXR1cm4gaWRlbnRpZmllcjsgIC8vIGF1dG9tYXRpY2FsbHkgZGVsaW1pdGVkCi0JCX0KLQkJaWYgKHRoaXMuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMudW5kZWxpbWl0KGlkZW50aWZpZXIpOwotCQl9Ci0JCXJldHVybiB0aGlzLmZvbGRpbmdTdHJhdGVneS5mb2xkKGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllciBpcyA8ZW0+ZGVsaW1pdGVkPC9lbT4uCi0JICogVGhlIFNRTC05MiBzcGVjIHNheXMgaWRlbnRpZmllcnMgc2hvdWxkIGJlIGRlbGltaXRlZCBieQotCSAqIGRvdWJsZS1xdW90ZXM7IGJ1dCBzb21lIGRhdGFiYXNlcyBhbGxvdyBvdGhlcndpc2UgKGUuZy4gU3liYXNlKS4KLQkgKi8KLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNRdW90ZWQoaWRlbnRpZmllcik7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHNlbGVjdGluZyBkYXRhYmFzZSBvYmplY3RzICoqKioqKioqKioKLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGNvbnZlcnQgdGhlIGlkZW50aWZpZXIgdG8gYSBuYW1lIGFuZCBwZXJmb3JtIGEgbmFtZSBsb29rdXAuCi0JICovCi0JcHVibGljIENhdGFsb2cgc2VsZWN0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoSXRlcmFibGU8Q2F0YWxvZz4gY2F0YWxvZ3MsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihjYXRhbG9ncywgaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgY29udmVydCB0aGUgaWRlbnRpZmllciB0byBhIG5hbWUgYW5kIHBlcmZvcm0gYSBuYW1lIGxvb2t1cC4KLQkgKi8KLQlwdWJsaWMgU2NoZW1hIHNlbGVjdFNjaGVtYUZvcklkZW50aWZpZXIoSXRlcmFibGU8U2NoZW1hPiBzY2hlbWF0YSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHNjaGVtYXRhLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBjb252ZXJ0IHRoZSBpZGVudGlmaWVyIHRvIGEgbmFtZSBhbmQgcGVyZm9ybSBhIG5hbWUgbG9va3VwLgotCSAqLwotCXB1YmxpYyBUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKHRhYmxlcywgaWRlbnRpZmllcik7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgY29udmVydCB0aGUgaWRlbnRpZmllciB0byBhIG5hbWUgYW5kIHBlcmZvcm0gYSBuYW1lIGxvb2t1cC4KLQkgKi8KLQlwdWJsaWMgU2VxdWVuY2Ugc2VsZWN0U2VxdWVuY2VGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFNlcXVlbmNlPiBzZXF1ZW5jZXMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllcihzZXF1ZW5jZXMsIGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGNvbnZlcnQgdGhlIGlkZW50aWZpZXIgdG8gYSBuYW1lIGFuZCBwZXJmb3JtIGEgbmFtZSBsb29rdXAuCi0JICovCi0JcHVibGljIENvbHVtbiBzZWxlY3RDb2x1bW5Gb3JJZGVudGlmaWVyKEl0ZXJhYmxlPENvbHVtbj4gY29sdW1ucywgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0RGF0YWJhc2VPYmplY3RGb3JJZGVudGlmaWVyKGNvbHVtbnMsIGlkZW50aWZpZXIpOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIGNvbnZlcnQgdGhlIGlkZW50aWZpZXIgdG8gYSBuYW1lIGFuZCBwZXJmb3JtIGEgbmFtZSBsb29rdXAuCi0JICovCi0JPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXIoSXRlcmFibGU8VD4gZGF0YWJhc2VPYmplY3RzLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy5zZWxlY3REYXRhYmFzZU9iamVjdE5hbWVkKGRhdGFiYXNlT2JqZWN0cywgdGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZShpZGVudGlmaWVyKSk7Ci0JfQotCi0JLyoqCi0JICogV2UgY2FuIHRhbnNsYXRlIGlkZW50aWZpZXJzIG9uIG1vc3QgZGF0YWJhc2VlIGludG8gYSBuYW1lIHdlIGNhbiB0cmVhdCBhcwotCSAqIGNhc2Utc2Vuc2l0aXZlLgotCSAqLwotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZChJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRSZXNwZWN0Q2FzZShkYXRhYmFzZU9iamVjdHMsIG5hbWUpOwotCX0KLQotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZFJlc3BlY3RDYXNlKEl0ZXJhYmxlPFQ+IGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChUIGRhdGFiYXNlT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7Ci0JCQlpZiAoZGF0YWJhc2VPYmplY3QuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBkYXRhYmFzZU9iamVjdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQk8VCBleHRlbmRzIERhdGFiYXNlT2JqZWN0PiBUIHNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRJZ25vcmVDYXNlKEl0ZXJhYmxlPFQ+IGRhdGFiYXNlT2JqZWN0cywgU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChUIGRhdGFiYXNlT2JqZWN0IDogZGF0YWJhc2VPYmplY3RzKSB7Ci0JCQlpZiAoZGF0YWJhc2VPYmplY3QuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKLQkJCQlyZXR1cm4gZGF0YWJhc2VPYmplY3Q7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIHF1ZXJpZXMgKioqKioqKioqKgotCi0JTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBleGVjdXRlKFN0cmluZyBzcWwpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiB0aGlzLmV4ZWN1dGVfKHNxbCk7Ci0JCX0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhRGJQbHVnaW4ubG9nKCJTUUw6ICIgKyBzcWwsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JfQotCi0JTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBleGVjdXRlXyhTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IGpkYmNTdGF0ZW1lbnQgPSB0aGlzLmNyZWF0ZUpEQkNTdGF0ZW1lbnQoKTsKLQkJTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQlqZGJjU3RhdGVtZW50LmV4ZWN1dGUoc3FsKTsKLQkJCXJvd3MgPSB0aGlzLmJ1aWxkUm93cyhqZGJjU3RhdGVtZW50LmdldFJlc3VsdFNldCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWpkYmNTdGF0ZW1lbnQuY2xvc2UoKTsKLQkJfQotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlTdGF0ZW1lbnQgY3JlYXRlSkRCQ1N0YXRlbWVudCgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmdldEpEQkNDb25uZWN0aW9uKCkuY3JlYXRlU3RhdGVtZW50KCk7Ci0JfQotCi0JTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBidWlsZFJvd3MoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4oKTsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChyb3dzLCB0aGlzLmJ1aWxkUmVzdWx0U2V0SXRlcmF0b3IocmVzdWx0U2V0KSk7Ci0JCXJldHVybiByb3dzOwotCX0KLQotCUl0ZXJhdG9yPE1hcDxTdHJpbmcsIE9iamVjdD4+IGJ1aWxkUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3I8TWFwPFN0cmluZywgT2JqZWN0Pj4ocmVzdWx0U2V0LCBuZXcgTGlzdFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKSkpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgZWFjaCByb3cgaW4gdGhlIHJlc3VsdCBzZXQgaW50byBhIG1hcCB3aG9zZSBrZXkgaXMgdGhlIGNvbHVtbgotCSAqIG5hbWUgYW5kIHZhbHVlIGlzIHRoZSBjb2x1bW4gdmFsdWUuCi0JICovCi0Jc3RhdGljIGNsYXNzIExpc3RSZXN1bHRTZXRJdGVyYXRvckFkYXB0ZXIKLQkJaW1wbGVtZW50cyBSZXN1bHRTZXRJdGVyYXRvci5BZGFwdGVyPE1hcDxTdHJpbmcsIE9iamVjdD4+Ci0JewotCQlwcml2YXRlIGZpbmFsIGludCBjb2x1bW5Db3VudDsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjb2x1bW5OYW1lczsKLQotCQlMaXN0UmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKFJlc3VsdFNldE1ldGFEYXRhIHJzTWV0YURhdGEpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uQ291bnQgPSByc01ldGFEYXRhLmdldENvbHVtbkNvdW50KCk7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1t0aGlzLmNvbHVtbkNvdW50ICsgMV07ICAvLyBsZWF2ZSB0aGUgemVybyBzbG90IGVtcHR5Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8PSB0aGlzLmNvbHVtbkNvdW50OyBpKyspIHsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCQl0aGlzLmNvbHVtbk5hbWVzW2ldID0gcnNNZXRhRGF0YS5nZXRDb2x1bW5OYW1lKGkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQlIYXNoTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4odGhpcy5jb2x1bW5Db3VudCk7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8PSB0aGlzLmNvbHVtbkNvdW50OyBpKyspIHsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCQlyb3cucHV0KHRoaXMuY29sdW1uTmFtZXNbaV0sIHJzLmdldE9iamVjdChpKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcm93OwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIG1pc2MgKioqKioqKioqKgotCi0JU3RyaW5nIGdldFVzZXJOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb252ZXJ0SWRlbnRpZmllclRvTmFtZSh0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkuZ2V0VXNlck5hbWUoKSk7Ci0JfQotCi0JYm9vbGVhbiB0cmVhdElkZW50aWZpZXJzQXNEZWxpbWl0ZWQoKSB7Ci0JCXJldHVybiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCkudHJlYXRJZGVudGlmaWVyc0FzRGVsaW1pdGVkKCk7Ci0JfQotCi0JQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kOiBBZGQgPGNvZGU+bnVsbDwvY29kZT4gY2hlY2suCi0JICovCi0JYm9vbGVhbiBhcnJheUNvbnRhaW5zKGNoYXJbXSBhcnJheSwgY2hhciBjKSB7Ci0JCXJldHVybiAoYXJyYXkgIT0gbnVsbCkgJiYgQXJyYXlUb29scy5jb250YWlucyhhcnJheSwgYyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLmJ1aWxkVG9TdHJpbmdGb3IodGhpcywgdGhpcy5kYXRhYmFzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9DYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhMzQ1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9DYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIEFkYXB0IHRoZSB2YXJpZXR5IG9mIGNhdGFsb2cgKGFuZCBzY2hlbWEpIGNvbmZpZ3VyYXRpb25zIGdlbmVyYXRlZCBieQotICogRFRQLXN1cHBsaWVkIGRyaXZlcnMuCi0gKi8KLWludGVyZmFjZSBDYXRhbG9nU3RyYXRlZ3kgewotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIERUUCBkYXRhYmFzZSBoYXMgInJlYWwiIGNhdGFsb2dzIChpLmUuIGNhdGFsb2dzIHRoYXQKLQkgKiBjYW4gYmUgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyKS4KLQkgKi8KLQlib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRFRQIGRhdGFiYXNlJ3MgY2F0YWxvZ3MuIFRoaXMgd2lsbCBiZSBlbXB0eSBpZiB0aGUgZGF0YWJhc2UKLQkgKiBkb2VzIDxlbT5ub3Q8L2VtPiBzdXBwb3J0IGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqLwotCUxpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRFRQIGRhdGFiYXNlJ3Mgc2NoZW1hcy4gVGhpcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBkYXRhYmFzZQotCSAqIHN1cHBvcnRzIGNhdGFsb2dzLgotCSAqIEBzZWUgI3N1cHBvcnRzQ2F0YWxvZ3MoKQotCSAqLwotCUxpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9EQjIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RCMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzFmZjY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RCMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIERCMgotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JREIyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCS8vIHVudmVyaWZpZWQuLi4KLQkJcmV0dXJuIG5ldyBVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZhY3RvcnkgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBEVFBEcml2ZXJBZGFwdGVyRmFjdG9yeSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFZFTkRPUlMgPSB7Ci0JCQkJIkRCMiBVREIiLCAvLyROT04tTkxTLTEkCi0JCQkJIkRCMiBVREIgaVNlcmllcyIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiREIyIFVEQiB6U2VyaWVzIiAvLyROT04tTkxTLTEkCi0JCQl9OwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkVmVuZG9ycygpIHsKLQkJCXJldHVybiBWRU5ET1JTOwotCQl9Ci0JCXB1YmxpYyBEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJcmV0dXJuIG5ldyBEQjIoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTQzODBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2VxdWVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBEZWxlZ2F0ZSBEVFAgZHJpdmVyLXNwZWNpZmljIGJlaGF2aW9yIHRvIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzCi0gKiBpbnRlcmZhY2U6PHVsPgotICogICA8bGk+Y2F0YWxvZ3Mvc2NoZW1hcwotICogICA8bGk+bmFtZXMvaWRlbnRpZmllcnMKLSAqICAgPGxpPmRhdGFiYXNlIG9iamVjdCBzZWxlY3Rpb24KLSAqIDwvdWw+Ci0gKiA8c3Ryb25nPk5COjwvc3Ryb25nPjxicj4KLSAqIFdlIHVzZSA8ZW0+bmFtZTwvZW0+IHdoZW4gZGVhbGluZyB3aXRoIHRoZSB1bm1vZGlmaWVkIG5hbWUgb2YgYSBkYXRhYmFzZQotICogb2JqZWN0IGFzIHN1cHBsaWVkIGJ5IHRoZSBkYXRhYmFzZSBpdHNlbGYgKGkuZS4gaXQgaXMgbm90IGRlbGltaXRlZCBhbmQgaXQgaXMKLSAqIGFsd2F5cyBjYXNlLXNlbnNpdGl2ZSkuCi0gKiA8YnI+Ci0gKiBXZSB1c2UgPGVtPmlkZW50aWZpZXI8L2VtPiB3aGVuIGRlYWxpbmcgd2l0aCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhCi0gKiBkYXRhYmFzZSBvYmplY3QgbmFtZSAoaS5lLiBpdCBtYXkgYmUgZGVsaW1pdGVkIGFuZCwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhYmFzZSwKLSAqIGl0IG1heSBiZSBjYXNlLWluc2Vuc2l0aXZlKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBEVFBEcml2ZXJBZGFwdGVyIHsKLQotCS8vICoqKioqKioqKiogY2F0YWxvZ3MgKioqKioqKioqKgotCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIERUUCBkcml2ZXIgc3VwcG9ydHMgInJlYWwiIGNhdGFsb2dzIChlLmcuIFN5YmFzZSkuCi0JICogSWYgaXQgZG9lcywgdXNlIHtAbGluayAjZ2V0RFRQQ2F0YWxvZ3MoKX0gdG8gcmV0cmlldmUgdGhlbTsKLQkgKiBvdGhlcndpc2UsIHVzZSB7QGxpbmsgI2dldERUUFNjaGVtYXMoKX0gdG8gcmV0cmlldmUgdGhlIHNjaGVtYXMgZGlyZWN0bHkuCi0JICovCi0JYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERUUCBkYXRhYmFzZSdzIGNhdGFsb2dzLgotCSAqIFRoaXMgd2lsbCBiZSBlbXB0eSBpZiB0aGUgZGF0YWJhc2UgZG9lcyBub3Qgc3VwcG9ydCBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKi8KLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBnZXREVFBDYXRhbG9ncygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBEVFAgZGF0YWJhc2UncyBkZWZhdWx0IGNhdGFsb2cgbmFtZXMuCi0JICogVGhlIGZpcnN0IG5hbWUgaW4gdGhlIGxpc3QgdGhhdCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIGNhdGFsb2cKLQkgKiBpcyA8ZW0+dGhlPC9lbT4gZGVmYXVsdC4KLQkgKiBUaGlzIHdpbGwgYmUgZW1wdHkgaWYgdGhlIGRhdGFiYXNlIGRvZXMgbm90IHN1cHBvcnQgY2F0YWxvZ3MuCi0JICovCi0JSXRlcmFibGU8U3RyaW5nPiBnZXREZWZhdWx0Q2F0YWxvZ05hbWVzKCk7Ci0KLQotCS8vICoqKioqKioqKiogc2NoZW1hcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIERUUCBkYXRhYmFzZSdzIHNjaGVtYXMuCi0JICogVGhpcyB3aWxsIGJlIGVtcHR5IGlmIHRoZSBkYXRhYmFzZSBzdXBwb3J0cyBjYXRhbG9ncy4KLQkgKiBAc2VlICNzdXBwb3J0c0NhdGFsb2dzKCkKLQkgKi8KLQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE+IGdldERUUFNjaGVtYXMoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgRFRQIGRhdGFiYXNlJ3MgZGVmYXVsdCBzY2hlbWEgbmFtZXMuCi0JICogVGhlIGZpcnN0IG5hbWUgaW4gdGhlIGxpc3QgdGhhdCBpZGVudGlmaWVzIGFuIGV4aXN0aW5nIHNjaGVtYQotCSAqIGlzIDxlbT50aGU8L2VtPiBkZWZhdWx0LgotCSAqLwotCUl0ZXJhYmxlPFN0cmluZz4gZ2V0RGVmYXVsdFNjaGVtYU5hbWVzKCk7Ci0KLQotCS8vICoqKioqKioqKiogbmFtZXMvaWRlbnRpZmllcnMgKioqKioqKioqKgotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIHRvIGEgZGF0YWJhc2Utc3BlY2lmaWMKLQkgKiBpZGVudGlmaWVyIChpLmUuIGRlbGltaXQgdGhlIG5hbWUgYXMgYXBwcm9wcmlhdGUpLgotCSAqLwotCVN0cmluZyBjb252ZXJ0TmFtZVRvSWRlbnRpZmllcihTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzcGVjaWZpZWQgZGF0YWJhc2Ugb2JqZWN0IG5hbWUgdG8gYSBkYXRhYmFzZS1zcGVjaWZpYwotCSAqIGlkZW50aWZpZXIgKGkuZS4gZGVsaW1pdCB0aGUgbmFtZSBhcyBhcHByb3ByaWF0ZSkuCi0JICogUmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXN1bHRpbmcgaWRlbnRpZmllciBtYXRjaGVzIHRoZQotCSAqIHNwZWNpZmllZCBkZWZhdWx0IG5hbWUuCi0JICogPHA+Ci0JICogVGhpcyBpcyB1c2VkIGJ5IGVudGl0eSBnZW5lcmF0aW9uIGNvZGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKLQkgKiBhIGdlbmVyYXRlZCBhbm5vdGF0aW9uIG11c3QgZXhwbGljaXRseSBpZGVudGlmeSBhIGRhdGFiYXNlIG9iamVjdAotCSAqIChlLmcuIGEgdGFibGUpIG9yIHRoZSBzcGVjaWZpZWQgZGVmYXVsdCBhZGVxdWF0ZWx5IGlkZW50aWZpZXMgdGhlCi0JICogc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCAodGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBjYXNlLXNlbnNpdGl2aXR5LAotCSAqIHNwZWNpYWwgY2hhcmFjdGVycywgZXRjLikuCi0JICovCi0JU3RyaW5nIGNvbnZlcnROYW1lVG9JZGVudGlmaWVyKFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdE5hbWUpOwotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBpZGVudGlmaWVyIHRvIGEgZGF0YWJhc2Utc3BlY2lmaWMKLQkgKiBuYW1lIChpLmUuIHN0cmlwcGluZyBkZWxpbWl0ZXJzIGZyb20gYW5kIGZvbGRpbmcgdGhlIGlkZW50aWZpZXIgYXMKLQkgKiBhcHByb3ByaWF0ZSkuCi0JICovCi0JU3RyaW5nIGNvbnZlcnRJZGVudGlmaWVyVG9OYW1lKFN0cmluZyBpZGVudGlmaWVyKTsKLQotCi0JLy8gKioqKioqKioqKiBzZWxlY3RpbmcgZGF0YWJhc2Ugb2JqZWN0cyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBTZWxlY3QgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdGhlIGNhdGFsb2cgZm9yIHRoZSBzcGVjaWZpZWQKLQkgKiBpZGVudGlmaWVyLgotCSAqLwotCUNhdGFsb2cgc2VsZWN0Q2F0YWxvZ0ZvcklkZW50aWZpZXIoSXRlcmFibGU8Q2F0YWxvZz4gY2F0YWxvZ3MsIFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFNlbGVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0aGUgc2NoZW1hIGZvciB0aGUgc3BlY2lmaWVkCi0JICogaWRlbnRpZmllci4KLQkgKi8KLQlTY2hlbWEgc2VsZWN0U2NoZW1hRm9ySWRlbnRpZmllcihJdGVyYWJsZTxTY2hlbWE+IHNjaGVtYXRhLCBTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBTZWxlY3QgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdGhlIHRhYmxlIGZvciB0aGUgc3BlY2lmaWVkCi0JICogaWRlbnRpZmllci4KLQkgKi8KLQlUYWJsZSBzZWxlY3RUYWJsZUZvcklkZW50aWZpZXIoSXRlcmFibGU8VGFibGU+IHRhYmxlcywgU3RyaW5nIGlkZW50aWZpZXIpOwotCi0JLyoqCi0JICogU2VsZWN0IGZyb20gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRoZSBzZXF1ZW5jZSBmb3IgdGhlIHNwZWNpZmllZAotCSAqIGlkZW50aWZpZXIuCi0JICovCi0JU2VxdWVuY2Ugc2VsZWN0U2VxdWVuY2VGb3JJZGVudGlmaWVyKEl0ZXJhYmxlPFNlcXVlbmNlPiBzZXF1ZW5jZXMsIFN0cmluZyBpZGVudGlmaWVyKTsKLQotCS8qKgotCSAqIFNlbGVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0aGUgY29sdW1uIGZvciB0aGUgc3BlY2lmaWVkCi0JICogaWRlbnRpZmllci4KLQkgKi8KLQlDb2x1bW4gc2VsZWN0Q29sdW1uRm9ySWRlbnRpZmllcihJdGVyYWJsZTxDb2x1bW4+IGNvbHVtbnMsIFN0cmluZyBpZGVudGlmaWVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9EVFBEcml2ZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTMxOWZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLQotLyoqCi0gKiBGYWN0b3J5IGludGVyZmFjZS4KLSAqLwotaW50ZXJmYWNlIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZlbmRvcnMgc3VwcG9ydGVkIGJ5IHRoZSBmYWN0b3J5J3MgYWRhcHRlci4KLQkgKi8KLQlTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCk7Ci0KLQkvKioKLQkgKiBCdWlsZCBhIG5ldyBEVFAgZHJpdmVyIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgRGFsaSBkYXRhYmFzZS4KLQkgKi8KLQlEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihEYXRhYmFzZSBkYXRhYmFzZSk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RUUERyaXZlckFkYXB0ZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2NTEzMjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1wdWJsaWMgY2xhc3MgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIgewotCXByaXZhdGUgZmluYWwgSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBhZGFwdGVyRmFjdG9yaWVzOwotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIgSU5TVEFOQ0UgPSBuZXcgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRFRQRHJpdmVyQWRhcHRlck1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcmllcyA9IHRoaXMuYnVpbGRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgRFRQRHJpdmVyQWRhcHRlckZhY3Rvcnk+IGJ1aWxkQWRhcHRlckZhY3RvcmllcygpIHsKLQkJSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBmYWN0b3JpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PigpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3JpZXNUbyhmYWN0b3JpZXMpOwotCQlyZXR1cm4gZmFjdG9yaWVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzVG8oSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBmYWN0b3JpZXMpIHsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBEQjIuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmV3IERlcmJ5LkZhY3RvcnkoKSwgZmFjdG9yaWVzKTsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBIU1FMREIuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmV3IEluZm9ybWl4LkZhY3RvcnkoKSwgZmFjdG9yaWVzKTsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBNYXhEQi5GYWN0b3J5KCksIGZhY3Rvcmllcyk7Ci0JCXRoaXMuYWRkQWRhcHRlckZhY3RvcnlUbyhuZXcgTXlTUUwuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmV3IE9yYWNsZS5GYWN0b3J5KCksIGZhY3Rvcmllcyk7Ci0JCXRoaXMuYWRkQWRhcHRlckZhY3RvcnlUbyhuZXcgUG9zdGdyZVNRTC5GYWN0b3J5KCksIGZhY3Rvcmllcyk7Ci0JCXRoaXMuYWRkQWRhcHRlckZhY3RvcnlUbyhuZXcgU1FMU2VydmVyLkZhY3RvcnkoKSwgZmFjdG9yaWVzKTsKLQkJdGhpcy5hZGRBZGFwdGVyRmFjdG9yeVRvKG5ldyBTeWJhc2UuRmFjdG9yeSgpLCBmYWN0b3JpZXMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlI2dldFZlbmRvcigpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJGYWN0b3J5VG8oRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSGFzaE1hcDxTdHJpbmcsIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5PiBmYWN0b3JpZXMpIHsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IGZhY3RvcnkuZ2V0U3VwcG9ydGVkVmVuZG9ycygpKSB7Ci0JCQl0aGlzLmFkZEFkYXB0ZXJGYWN0b3J5VG8obmFtZSwgZmFjdG9yeSwgZmFjdG9yaWVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBZGFwdGVyRmFjdG9yeVRvKFN0cmluZyBuYW1lLCBEVFBEcml2ZXJBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBIYXNoTWFwPFN0cmluZywgRFRQRHJpdmVyQWRhcHRlckZhY3Rvcnk+IGZhY3RvcmllcykgewotCQlpZiAoZmFjdG9yaWVzLnB1dChuYW1lLCBmYWN0b3J5KSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEdXBsaWNhdGUgYWRhcHRlciBmYWN0b3J5OiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihTdHJpbmcgZHRwVmVuZG9yTmFtZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlckZhY3RvcnkoZHRwVmVuZG9yTmFtZSkuYnVpbGRBZGFwdGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlwcml2YXRlIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IGdldEFkYXB0ZXJGYWN0b3J5KFN0cmluZyBkdHBWZW5kb3JOYW1lKSB7Ci0JCURUUERyaXZlckFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSB0aGlzLmFkYXB0ZXJGYWN0b3JpZXMuZ2V0KGR0cFZlbmRvck5hbWUpOwotCQlyZXR1cm4gKGZhY3RvcnkgIT0gbnVsbCkgPyBmYWN0b3J5IDogVU5SRUNPR05JWkVEX0FEQVBURVJfRkFDVE9SWTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgVU5SRUNPR05JWkVEX0FEQVBURVJfRkFDVE9SWSA9IG5ldyBVbmtub3duLkZhY3RvcnkoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RlcmJ5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9EZXJieS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTkwNjYwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0RlcmJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1jbGFzcyBEZXJieQotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JRGVyYnkoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJc3VwZXIoZGF0YWJhc2UpOwotCX0KLQotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBidWlsZENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBGYXV4Q2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5nZXREZWZhdWx0U2NoZW1hTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB1c2VyIG5hbWUgb24gRGVyYnkgaXMgPGNvZGU+IkFQUCI8L2NvZGU+IHdoZW4gdGhlIHVzZXIKLQkgKiBjb25uZWN0cyB3aXRob3V0IGEgdXNlciBuYW1lLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRTY2hlbWFOYW1lKCkgewotCQlTdHJpbmcgdXNlck5hbWUgPSB0aGlzLmdldFVzZXJOYW1lKCk7Ci0JCXJldHVybiAoKHVzZXJOYW1lICE9IG51bGwpICYmICh1c2VyTmFtZS5sZW5ndGgoKSAhPSAwKSkgPwotCQkJCXVzZXJOYW1lIDoKLQkJCQlERUZBVUxUX1VTRVJfTkFNRTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfVVNFUl9OQU1FID0gIkFQUCI7ICAvLyROT04tTkxTLTEkCi0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVORE9SUyA9IHsKLQkJCQkiRGVyYnkiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IERlcmJ5KGRhdGFiYXNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0ZhdXhDYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA3ZDVjYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9GYXV4Q2F0YWxvZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgRFRQIGRhdGFiYXNlIGRyaXZlcnMgdGhhdCBidWlsZCBhICJ2aXJ0dWFsIiBjYXRhbG9nCi0gKiAodGhhdCBoYXMgbm8gbmFtZSkgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBKREJDIGRyaXZlciBkb2VzIG5vdCByZXR1cm4gYW55Ci0gKiBjYXRhbG9ncyAoZS5nLiBPcmFjbGUpLiBUaGlzIGNhdGFsb2cgY2Fubm90IGJlIHNwZWNpZmllZCBieSB0aGUgdXNlciBpbgotICogYW5ub3RhdGlvbnMgZXRjLgotICogCi0gKiBAc2VlIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q2F0YWxvZ3MoKQotICovCi1jbGFzcyBGYXV4Q2F0YWxvZ1N0cmF0ZWd5Ci0JaW1wbGVtZW50cyBDYXRhbG9nU3RyYXRlZ3kKLXsKLQlwcml2YXRlIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlOwotCi0JRmF1eENhdGFsb2dTdHJhdGVneShEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmRhdGFiYXNlID0gZGF0YWJhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKCkgewotCQlDYXRhbG9nIGZhdXhDYXRhbG9nID0gdGhpcy5nZXRGYXV4Q2F0YWxvZygpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJTGlzdDxTY2hlbWE+IHNjaGVtYXMgPSBmYXV4Q2F0YWxvZy5nZXRTY2hlbWFzKCk7Ci0JCXJldHVybiBzY2hlbWFzOwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZyBnZXRGYXV4Q2F0YWxvZygpIHsKLQkJTGlzdDxDYXRhbG9nPiBjYXRhbG9ncyA9IHRoaXMuZ2V0Q2F0YWxvZ3NfKCk7Ci0JCWlmIChjYXRhbG9ncyA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjYXRhbG9ncyBsaXN0IGlzIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChjYXRhbG9ncy5zaXplKCkgIT0gMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibm90IGEgc2luZ2xlIGNhdGFsb2c6ICIgKyBjYXRhbG9ncyk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUNhdGFsb2cgY2F0YWxvZyA9IGNhdGFsb2dzLmdldCgwKTsKLQkJaWYgKGNhdGFsb2cuZ2V0TmFtZSgpLmxlbmd0aCgpICE9IDApIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlsbGVnYWwgbmFtZTogIiArIGNhdGFsb2cuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBjYXRhbG9nOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxDYXRhbG9nPiBnZXRDYXRhbG9nc18oKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmdldENhdGFsb2dzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Gb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzYmI3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Gb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLS8qKgotICogQWRhcHQgZGF0YWJhc2Utc3BlY2lmaWMgaWRlbnRpZmllci1mb2xkaW5nIGV0Yy4KLSAqLwotaW50ZXJmYWNlIEZvbGRpbmdTdHJhdGVneSB7Ci0KLQkvKioKLQkgKiBGb2xkIHRoZSBzcGVjaWZpZWQgaWRlbnRpZmllci4KLQkgKi8KLQlTdHJpbmcgZm9sZChTdHJpbmcgaWRlbnRpZmllcik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3BlY2lmaWVkIGRhdGFiYXNlIG9iamVjdCBuYW1lIGlzIGFscmVhZHkgZm9sZGVkLAotCSAqIG1lYW5pbmcsIHR5cGljYWxseSwgaWYgaXQgaGFzIG5vIHNwZWNpYWwgY2hhcmFjdGVycywgaXQgcmVxdWlyZXMgbm8KLQkgKiBkZWxpbWl0ZXJzLgotCSAqLwotCWJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL0hTUUxEQi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvSFNRTERCLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NzZjMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvSFNRTERCLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1jbGFzcyBIU1FMREIKLQlleHRlbmRzIEFic3RyYWN0RFRQRHJpdmVyQWRhcHRlcgotewotCUhTUUxEQihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyB1bnZlcmlmaWVkLi4uCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdFNjaGVtYU5hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKFBVQkxJQ19TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NIRU1BX05BTUUgPSAiUFVCTElDIjsgIC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJIU1FMREIiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IEhTUUxEQihkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9JbmZvcm1peC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvSW5mb3JtaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZmODRhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9JbmZvcm1peC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIEluZm9ybWl4Ci0JZXh0ZW5kcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLXsKLQlJbmZvcm1peChEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyB1bnZlcmlmaWVkLi4uCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcgfTsKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJJbmZvcm1peCIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgSW5mb3JtaXgoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTG93ZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Mb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzYWQwYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Mb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRm9sZCA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzIHRvIGxvd2VyIGNhc2UuCi0gKi8KLWNsYXNzIExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneQotCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9sZGluZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IExvd2VyQ2FzZUZvbGRpbmdTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIEZvbGRpbmdTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLnRvTG93ZXJDYXNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0xvd2VyY2FzZShuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9NYXhEQi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTWF4REIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzZDA4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9NYXhEQi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIE1heERCCi0JZXh0ZW5kcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLXsKLQlNYXhEQihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyB1bnZlcmlmaWVkLi4uCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJcmV0dXJuIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneS5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnIycsICdAJywgJyQnIH07Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVORE9SUyA9IHsKLQkJCQkiTWF4REIiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IE1heERCKGRhdGFiYXNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL015U1FMLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9NeVNRTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDc2YWFmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL015U1FMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIE15U1FMIGlzIGEgYml0IHVudXN1YWwgaW4gdGhhdCBpdCBkb2VzIDxlbT5ub3Q8L2VtPiBmb2xkIDxlbT5yZWd1bGFyPC9lbT4KLSAqIGlkZW50aWZpZXJzIGFuZCBpdHMgaWRlbnRpZmllcnMgYXJlIDxlbT5ub3Q8L2VtPiBjYXNlLXNlbnNpdGl2ZQotICogKGV4Y2VwdCBpbiBzcGVjaWFsIGNhc2VzLCBkZXNjcmliZWQgYmVsb3cpLiBFdmVuIDxlbT5kZWxpbWl0ZWQ8L2VtPiBpZGVudGlmaWVycwotICogYXJlIGNhc2UtPGVtPmluPC9lbT5zZW5zaXRpdmUuIChEZWxpbWl0ZXJzIGFyZSBvbmx5IG5lZWRlZCBmb3IgaWRlbnRpZmllcnMKLSAqIHRoYXQgY29udGFpbiBzcGVjaWFsIGNoYXJhY3RlcnMgb3IgYXJlIHJlc2VydmVkIHdvcmRzLikKLSAqIDxwPgotICogTXlTUUwgaGFuZGxlcyB0aGUgY2FzZS1zZW5zaXRpdml0eSBvZiBkYXRhYmFzZXMgYW5kIHRhYmxlcyBhY2NvcmRpbmcgdG8gdGhlCi0gKiB2YWx1ZSBvZiB0aGUgc3lzdGVtIHZhcmlhYmxlIDxjb2RlPmxvd2VyX2Nhc2VfdGFibGVfbmFtZXM8L2NvZGU+Ojx1bD4KLSAqIDxsaT4wIChVbml4L0xpbnV4IGRlZmF1bHQpOiBkYXRhYmFzZSBhbmQgdGFibGUgbmFtZXMgYXJlIDxlbT5ub3Q8L2VtPiBmb2xkZWQKLSAqIGFuZCB0aGV5IGFyZSBjYXNlLXNlbnNpdGl2ZQotICogPGxpPjEgKFdpbmRvd3MgZGVmYXVsdCk6IGRhdGFiYXNlIGFuZCB0YWJsZSBuYW1lcyBhcmUgZm9sZGVkIHRvIGxvd2VyY2FzZQotICogYW5kIHRoZXkgYXJlIDxlbT5ub3Q8L2VtPiBjYXNlLXNlbnNpdGl2ZQotICogPGxpPjIgKE1hYyBPUyBYIGRlZmF1bHQpOiBkYXRhYmFzZSBhbmQgdGFibGUgbmFtZXMgYXJlIDxlbT5ub3Q8L2VtPiBmb2xkZWQKLSAqIGFuZCB0aGV5IGFyZSA8ZW0+bm90PC9lbT4gY2FzZS1zZW5zaXRpdmUKLSAqIDwvdWw+Ci0gKiBUaGVzZSB2YWx1ZXMgd2lsbCBub3Qgd29yayBwZXJmZWN0bHkgb24gYWxsIHBsYXRmb3JtcyBiZWNhdXNlIGRhdGFiYXNlcyBhcmUKLSAqIHN0b3JlZCBhcyBkaXJlY3RvcmllcyBhbmQgdGFibGVzIGFyZSBzdG9yZWQgYXMgZmlsZXMgaW4gdGhlIHVuZGVybHlpbmcKLSAqIE8vUzsgYW5kIHRoZSBhY3R1YWwgY2FzZS1zZW5zaXRpdml0eSBvZiB0aGUgbmFtZXMgd2lsbCB1bGltYXRlbHkgYmUKLSAqIGRldGVybWluZWQgYnkgdGhlIGJlaGF2aW9yIG9mIGZpbGVuYW1lcyBvbiB0aGUgTy9TLgotICogPHA+Ci0gKiBTZWUgPGEgaHJlZj1odHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuMC9lbi9pZGVudGlmaWVyLWNhc2Utc2Vuc2l0aXZpdHkuaHRtbD4KLSAqIElkZW50aWZpZXIgQ2FzZSBTZW5zaXRpdml0eTwvYT4uCi0gKi8KLWNsYXNzIE15U1FMCi0JZXh0ZW5kcyBBYnN0cmFjdERUUERyaXZlckFkYXB0ZXIKLXsKLQkvKiogbGF6eS1pbml0aWFsaXplZDsgdmFsdWUgY29tZXMgZnJvbSB0aGUgZGF0YWJhc2Ugc2VydmVyICovCi0JcHJpdmF0ZSBpbnQgbG93ZXJfY2FzZV90YWJsZV9uYW1lcyA9IC0xOwotCi0JLyoqIGxhenktaW5pdGlhbGl6ZWQ7IHZhbHVlIGNvbWVzIGZyb20gdGhlIGRhdGFiYXNlIHNlcnZlciAqLwotCXByaXZhdGUgQm9vbGVhbiBBTlNJX1FVT1RFUyA9IG51bGw7Ci0KLQotCU15U1FMKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgRFRQIG1vZGVsIGZvciBNeVNRTCBoYXMgYSBkYXRhYmFzZSB0aGF0IGNvbnRhaW5zIG5vIGNhdGFsb2dzOwotCSAqIGJ1dCwgaW5zdGVhZCwgZGlyZWN0bHkgaG9sZHMgYSBzaW5nbGUgc2NoZW1hIHdpdGggdGhlIHNhbWUgbmFtZSBhcwotCSAqIHRoZSBkYXRhYmFzZS4gKFRoaXMgaXMgaGFyZC1jb2RlZCBpbgotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5teXNxbC5jYXRhbG9nLk15U3FsQ2F0YWxvZ0RhdGFiYXNlI2dldFNjaGVtYXMoKX0uKQotCSAqIEFsdGhvdWdoIHlvdSBjYW4gcXVhbGlmeSBpZGVudGlmaWVycyB3aXRoIGEgZGF0YWJhc2UgbmFtZQotCSAqIGluIE15U1FMLCBvbmx5IHRoZSBkYXRhYmFzZSBzcGVjaWZpZWQgYXQgbG9naW4gc2VlbXMgdG8gYmUgYXZhaWxhYmxlCi0JICogaW4gdGhlIERUUCBtb2RlbC4uLi4KLQkgKiA8cD4KLQkgKiA8c3Ryb25nPk5COjwvc3Ryb25nPiBJbiBNeVNRTCBEREwsIDxjb2RlPlNDSEVNQTwvY29kZT4gaXMgYSBzeW5vbnltCi0JICogZm9yIDxjb2RlPkRBVEFCQVNFPC9jb2RlPjsgYnV0IHRoZSBKREJDCi0JICogbWV0aG9kIHtAbGluayBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldFNjaGVtYXMoKX0gcmV0dXJucyBhbiBlbXB0eSBsaXN0LAotCSAqIHdoaWxlIHtAbGluayBqYXZhLnNxbC5EYXRhYmFzZU1ldGFEYXRhI2dldENhdGFsb2dzKCl9IHJldHVybnMgYSBsaXN0IG9mIHRoZQotCSAqIGF2YWlsYWJsZSBkYXRhYmFzZXMuCi0JICogWW91IGNhbiBhbHNvIHVzZSB0aGUgSkRCQyBtZXRob2Qge0BsaW5rIGphdmEuc3FsLkNvbm5lY3Rpb24jc2V0Q2F0YWxvZyhTdHJpbmcpfQotCSAqIHRvIHNldCB0aGUgZGVmYXVsdCBkYXRhYmFzZS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgTm9DYXRhbG9nU3RyYXRlZ3kodGhpcy5kYXRhYmFzZS5nZXREVFBEYXRhYmFzZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBNeVNRTCBmb2xkcyBpZGVudGlmaWVycywgYnV0IHVzaW5nIHRoZQotCSAqIG5vbi1mb2xkaW5nIHN0cmF0ZWd5IHNob3VsZCB3b3JrOjx1bD4KLQkgKiA8bGk+V2Ugb25seSBmb2xkIGlkZW50aWZpZXJzIHdoZW4KLQkgKiBjb252ZXJ0aW5nIHRoZW0gdG8gbmFtZXM7IGJ1dCBNeVNRTCBpcyBjYXNlLTxlbT5pbjwvZW0+c2Vuc2l0aXZlCi0JICogd2hlbiBpdCBpcyBmb2xkaW5nIGRhdGFiYXNlIGFuZCB0YWJsZSBuYW1lcwotCSAqICg8Y29kZT5sb3dlcl9jYXNlX3RhYmxlX25hbWVzPC9jb2RlPj0xKSwgc28gbG9va3VwcyB3aWxsIHdvcmsKLQkgKiBmaW5lIHdpdGhvdXQgYW55IGZvbGRpbmcgYW55d2F5cy4KLQkgKiA8bGk+V2Ugb25seSB0ZXN0IHdoZXRoZXIgYSBuYW1lIGlzIGFscmVhZHkgZm9sZGVkIHdoZW4gZGV0ZXJtaW5pbmcKLQkgKiB3aGV0aGVyIGl0IG11c3QgYmUgZGVsaW1pdGVkOyBhbmQgTXlTUUwgaWdub3JlcyBkZWxpbWl0ZXJzCi0JICogd2hlbiBpdCBjb21lcyB0byBjYXNlLXNlbnNpdGl2aXR5LCBzbyB3ZSBjYW4gbGVhdmUgYW55IDxlbT5yZWd1bGFyPC9lbT4KLQkgKiBtaXhlZC1jYXNlIG5hbWVzIHVuZGVsaW1pdGVkLiAoTXlTUUwgb25seSByZXF1aXJlcyBkZWxpbWl0ZXJzIGZvcgotCSAqIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgcmVzZXJ2ZWQgd29yZHMuKQotCSAqIDwvdWw+Ci0JICovCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5kYXRhYmFzZS5nZXROYW1lKCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBpZGVudGlmaWVycy9uYW1lcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBNeVNRTCBpcyB0aGUgb25seSB2ZW5kb3IgdGhhdCBhbGxvd3MgYSBkaWdpdC4KLQkgKiBBbHRob3VnaCwgdGhlIG5hbWUgY2Fubm5vdCBiZSA8ZW0+YWxsPC9lbT4gZGlnaXRzCi0JICogKHVubGVzcyBkZWxpbWl0ZWQpLgotCSAqLwotCUBPdmVycmlkZQotCWJvb2xlYW4gY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzRGlnaXQoYykgfHwgc3VwZXIuY2hhcmFjdGVySXNSZWd1bGFyTmFtZVN0YXJ0KGMpOwotCX0KLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICckJyB9OwotCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGRlbGltaXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5kZWxpbWl0KG5hbWUsIEJBQ0tUSUNLKTsKLQl9Ci0KLQkvKioKLQkgKiBCeSBkZWZhdWx0LCBNeVNRTCBkZWxpbWl0cyBpZGVudGlmaWVycyB3aXRoIGJhY2t0aWNrcyAoPGNvZGU+YDwvY29kZT4pOwotCSAqIGJ1dCBpdCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHVzZSBkb3VibGUtcXVvdGVzLgotCSAqLwotCUBPdmVycmlkZQotCWJvb2xlYW4gaWRlbnRpZmllcklzRGVsaW1pdGVkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc0RlbGltaXRlZChpZGVudGlmaWVyLCBCQUNLVElDSykKLQkJCQkJfHwgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKGlkZW50aWZpZXIpICYmIHRoaXMuZG91YmxlUXVvdGVJc0lkZW50aWZpZXJEZWxpbWl0ZXIoKSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQkFDS1RJQ0sgPSAnYCc7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBhZmZlY3Qgd2hldGhlciBlbnRpdHkKLQkgKiBnZW5lcmF0aW9uIHdpbGwgZ2VuZXJhdGUgYSBzcGVjaWZpZWQgdGFibGUgb3IgY29sdW1uIGlkZW50aWZpZXIgd2hlbiB0aGUKLQkgKiBkZWZhdWx0IGlkZW50aWZpZXIgaXMgbm90IGEgbWF0Y2guIFdvcnN0IGNhc2U6IEVudGl0eSBnZW5lcmF0aW9uIHdpbGwKLQkgKiBnZW5lcmF0ZSBleHBsaWNpdCBpZGVudGlmaWVycyB1bm5lY2Vzc2FyaWx5IGZvciBjb2x1bW5zIHdoZW4gdGFibGVzIGFyZQotCSAqIGNhc2Utc2Vuc2l0aXZlLiBUaGUgZ2VuZXJhdGVkIGFubm90YXRpb24gd2lsbCBiZSB2YWxpZCBidXQgdGhlIGNvbHVtbgotCSAqIG5hbWUgd2lsbCBiZSByZWR1bmRhbnQuCi0JICovCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gdGhpcy50YWJsZU5hbWVzQXJlQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCQluYW1lMS5lcXVhbHMobmFtZTIpIDoKLQkJCQluYW1lMS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogc2VsZWN0aW5nIGRhdGFiYXNlIG9iamVjdHMgKioqKioqKioqKgotCi0JLyoqCi0JICogRFRQIHNjaGVtYXRhIGFyZSBNeVNRTCBkYXRhYmFzZXMoPykuIE9mIGNvdXJzZSwgd2Ugb25seSBoYXZlIG9uZSBwZXIKLQkgKiBjb25uZWN0aW9uLi4uLgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTY2hlbWEgc2VsZWN0U2NoZW1hRm9ySWRlbnRpZmllcihJdGVyYWJsZTxTY2hlbWE+IHNjaGVtYXRhLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy50YWJsZU5hbWVzQXJlQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCQl0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllclJlc3BlY3RDYXNlKHNjaGVtYXRhLCBpZGVudGlmaWVyKSA6Ci0JCQkJc3VwZXIuc2VsZWN0U2NoZW1hRm9ySWRlbnRpZmllcihzY2hlbWF0YSwgaWRlbnRpZmllcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIHNlbGVjdFRhYmxlRm9ySWRlbnRpZmllcihJdGVyYWJsZTxUYWJsZT4gdGFibGVzLCBTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gdGhpcy50YWJsZU5hbWVzQXJlQ2FzZVNlbnNpdGl2ZSgpID8KLQkJCQl0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0Rm9ySWRlbnRpZmllclJlc3BlY3RDYXNlKHRhYmxlcywgaWRlbnRpZmllcikgOgotCQkJCXN1cGVyLnNlbGVjdFRhYmxlRm9ySWRlbnRpZmllcih0YWJsZXMsIGlkZW50aWZpZXIpOwotCX0KLQotCXByaXZhdGUgPFQgZXh0ZW5kcyBEYXRhYmFzZU9iamVjdD4gVCBzZWxlY3REYXRhYmFzZU9iamVjdEZvcklkZW50aWZpZXJSZXNwZWN0Q2FzZShJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRSZXNwZWN0Q2FzZShkYXRhYmFzZU9iamVjdHMsIHRoaXMuY29udmVydElkZW50aWZpZXJUb05hbWUoaWRlbnRpZmllcikpOwotCX0KLQotCS8qKgotCSAqIE15U1FMIGRhdGFiYXNlIG9iamVjdCBuYW1lcyBhcmUgdXN1YWxseSBjYXNlLWluc2Vuc2l0aXZlOwotCSAqIHRoZSBleGNlcHRpb24gYmVpbmcgZGF0YWJhc2VzIChzY2hlbWF0YSkgYW5kIHRhYmxlcyB3aGVuIHRoZSBzeXN0ZW0KLQkgKiB2YXJpYWJsZSA8Y29kZT5sb3dlcl9jYXNlX3RhYmxlX25hbWVzPC9jb2RlPiBpcyAwICh0aGUgZGVmYXVsdCBvbgotCSAqIFVOSVgvTGludXgpLiAoRm9yIHNvbWUgb2RkIHJlYXNvbiwgdHJpZ2dlciBuYW1lcyBhcmUgYWxzbwotCSAqIGNhc2Utc2Vuc2l0aXZlLi4uLiBGb3J0dW5hdGVseSwgd2UgZG9uJ3QgY2FyZSB5ZXQuKQotCSAqLwotCUBPdmVycmlkZQotCTxUIGV4dGVuZHMgRGF0YWJhc2VPYmplY3Q+IFQgc2VsZWN0RGF0YWJhc2VPYmplY3ROYW1lZChJdGVyYWJsZTxUPiBkYXRhYmFzZU9iamVjdHMsIFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdERhdGFiYXNlT2JqZWN0TmFtZWRJZ25vcmVDYXNlKGRhdGFiYXNlT2JqZWN0cywgbmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxvd2VyX2Nhc2VfdGFibGVfbmFtZXMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBib29sZWFuIHRhYmxlTmFtZXNBcmVDYXNlU2Vuc2l0aXZlKCkgewotCQlyZXR1cm4gdGhpcy5nZXRMb3dlckNhc2VUYWJsZU5hbWVzKCkgPT0gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRMb3dlckNhc2VUYWJsZU5hbWVzKCkgewotCQlpZiAodGhpcy5sb3dlcl9jYXNlX3RhYmxlX25hbWVzID09IC0xKSB7Ci0JCQl0aGlzLmxvd2VyX2Nhc2VfdGFibGVfbmFtZXMgPSB0aGlzLmJ1aWxkTG93ZXJDYXNlVGFibGVOYW1lcygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmxvd2VyX2Nhc2VfdGFibGVfbmFtZXM7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGxpdmUgY29ubmVjdGlvbiAoaS5lLiB3ZSBhcmUgd29ya2luZyBvZmYtbGluZSksCi0JICogdXNlIHRoZSBjdXJyZW50IE8vUyBkZWZhdWx0IHNldHRpbmcoPykuCi0JICovCi0JcHJpdmF0ZSBpbnQgYnVpbGRMb3dlckNhc2VUYWJsZU5hbWVzKCkgewotCQlpbnQgZGJWYWx1ZSA9IHRoaXMuZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21EYXRhYmFzZSgpOwotCQlyZXR1cm4gKGRiVmFsdWUgIT0gLTEpID8gZGJWYWx1ZSA6IHRoaXMuZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21PUygpOwotCX0KLQotCS8qKgotCSAqIFNlZSA8YSBocmVmPWh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS4wL2VuL2lkZW50aWZpZXItY2FzZS1zZW5zaXRpdml0eS5odG1sPgotCSAqIElkZW50aWZpZXIgQ2FzZSBTZW5zaXRpdml0eTwvYT4uCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21EYXRhYmFzZSgpIHsKLQkJaWYgKHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKS5pc0Rpc2Nvbm5lY3RlZCgpKSB7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJLy8gdGhlIHVuZGVyc2NvcmUgaXMgYSB3aWxkIGNoYXJhY3RlciBvbiBNeVNRTCwgc28gd2UgbmVlZCB0byBlc2NhcGUgaXQKLQkJTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gdGhpcy5leGVjdXRlKCJTSE9XIFZBUklBQkxFUyBMSUtFICdsb3dlclxcX2Nhc2VcXF90YWJsZVxcX25hbWVzJyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyb3dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCU1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gcm93cy5nZXQoMCk7Ci0JCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChyb3cuZ2V0KCJWYXJpYWJsZV9uYW1lIiksICJsb3dlcl9jYXNlX3RhYmxlX25hbWVzIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKChTdHJpbmcpIHJvdy5nZXQoIlZhbHVlIikpLmludFZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogTWFrZSBhIGJlc3QgZ3Vlc3MgYXQgd2hhdCB0aGUgc2V0dGluZyBtaWdodCBiZToKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjdXJyZW50IE8vUyAodW5mb3J0dW5hdGVseSB0aGlzIGlzIHRoZQotCSAqIGNsaWVudCBPL1MsIG5vdCB0aGUgTXlTUUwgU2VydmVyIE8vUy4uLikuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TG93ZXJDYXNlVGFibGVOYW1lc0Zyb21PUygpIHsKLQkJaWYgKFRvb2xzLm9zSXNNYWMoKSkgewotCQkJcmV0dXJuIDI7Ci0JCX0KLQkJaWYgKFRvb2xzLm9zSXNXaW5kb3dzKCkpIHsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJldHVybiAwOyAgLy8gTGludXggZXRjLgotCX0KLQotCi0JLy8gKioqKioqKioqKiBBTlNJX1FVT1RFUyAqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gZG91YmxlUXVvdGVJc0lkZW50aWZpZXJEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmdldEFOU0lRdW90ZXMoKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIEJvb2xlYW4gZ2V0QU5TSVF1b3RlcygpIHsKLQkJaWYgKHRoaXMuQU5TSV9RVU9URVMgPT0gbnVsbCkgewotCQkJdGhpcy5BTlNJX1FVT1RFUyA9IHRoaXMuYnVpbGRBTlNJUXVvdGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuQU5TSV9RVU9URVM7Ci0JfQotCi0JLyoqCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBhIGxpdmUgY29ubmVjdGlvbiAoaS5lLiB3ZSBhcmUgd29ya2luZyBvZmYtbGluZSksCi0JICogcmV0dXJuIDxjb2RlPkZBTFNFPC9jb2RlPiAodGhlIGRlZmF1bHQgc2V0dGluZykuCi0JICovCi0JcHJpdmF0ZSBCb29sZWFuIGJ1aWxkQU5TSVF1b3RlcygpIHsKLQkJQm9vbGVhbiBkYlZhbHVlID0gdGhpcy5nZXRBTlNJUXVvdGVzRnJvbURhdGFiYXNlKCk7Ci0JCXJldHVybiAoZGJWYWx1ZSAhPSBudWxsKSA/IGRiVmFsdWUgOiBCb29sZWFuLkZBTFNFOwotCX0KLQotCS8qKgotCSAqIFNlZSA8YSBocmVmPWh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS4wL2VuL3NlcnZlci1zcWwtbW9kZS5odG1sI3NxbG1vZGVfYW5zaV9xdW90ZXM+Ci0JICogQU5TSV9RVU9URVM8L2E+LgotCSAqLwotCXByaXZhdGUgQm9vbGVhbiBnZXRBTlNJUXVvdGVzRnJvbURhdGFiYXNlKCkgewotCQlpZiAodGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZSgpLmlzRGlzY29ubmVjdGVkKCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUxpc3Q8TWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IHRoaXMuZXhlY3V0ZSgiU0VMRUNUIEBAU0VTU0lPTi5zcWxfbW9kZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyb3dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSByb3dzLmdldCgwKTsKLQkJU3RyaW5nIHNxbF9tb2RlID0gKFN0cmluZykgcm93LmdldCgiQEBTRVNTSU9OLnNxbF9tb2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNxbF9tb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIG1vZGVzID0gc3FsX21vZGUuc3BsaXQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKEFycmF5VG9vbHMuY29udGFpbnMobW9kZXMsICJBTlNJX1FVT1RFUyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJNeVNxbCIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgTXlTUUwoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTm9DYXRhbG9nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL05vQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OGJkNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvTm9DYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYTsKLQotLyoqCi0gKiBDYXRhbG9nIHN0cmF0ZWd5IGZvciBEVFAgZGF0YWJhc2UgZHJpdmVycyB0aGF0IGRvIG5vdCBoYXZlIGNhdGFsb2dzCi0gKiAoZS5nLiBNeVNRTDsgc2VlIGJ1ZyAyNDkwMTMpLgotICovCi1jbGFzcyBOb0NhdGFsb2dTdHJhdGVneQotCWltcGxlbWVudHMgQ2F0YWxvZ1N0cmF0ZWd5Ci17Ci0JcHJpdmF0ZSBmaW5hbCBEYXRhYmFzZSBkYXRhYmFzZTsKLQotCU5vQ2F0YWxvZ1N0cmF0ZWd5KERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3MoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXMoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlLmdldFNjaGVtYXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Ob25Gb2xkaW5nU3RyYXRlZ3kuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL05vbkZvbGRpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDUzNjc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL05vbkZvbGRpbmdTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotLyoqCi0gKiBEbyBub3QgZm9sZCA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzLgotICovCi1jbGFzcyBOb25Gb2xkaW5nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIEZvbGRpbmdTdHJhdGVneQotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEZvbGRpbmdTdHJhdGVneSBJTlNUQU5DRSA9IG5ldyBOb25Gb2xkaW5nU3RyYXRlZ3koKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXN0YXRpYyBGb2xkaW5nU3RyYXRlZ3kgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgTm9uRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIGlkZW50aWZpZXJzIGFyZSBub3QgZm9sZGVkIHRvIHVwcGVyLSBvciBsb3dlci1jYXNlLCB0aGUgbmFtZSBpcwotCSAqIGFscmVhZHkgPGVtPmZvbGRlZDwvZW0+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZm9sZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gaWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSBpZGVudGlmaWVycyBhcmUgbm90IGZvbGRlZCB0byB1cHBlci0gb3IgbG93ZXItY2FzZSwgdGhlIG5hbWUgaXMKLQkgKiBhbHJlYWR5IDxlbT5mb2xkZWQ8L2VtPi4KLQkgKiAoTm9uLWZvbGRpbmcgZGF0YWJhc2VzIGRvIG5vdCByZXF1aXJlIGRlbGltaXRlcnMgYXJvdW5kIG1peGVkLWNhc2UKLQkgKiA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzLikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuYW1lSXNGb2xkZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvT3JhY2xlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9PcmFjbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmYzE0OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9PcmFjbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi1jbGFzcyBPcmFjbGUKLQlleHRlbmRzIEFic3RyYWN0RFRQRHJpdmVyQWRhcHRlcgotewotCU9yYWNsZShEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gbmV3IEZhdXhDYXRhbG9nU3RyYXRlZ3kodGhpcy5kYXRhYmFzZS5nZXREVFBEYXRhYmFzZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgYnVpbGRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnLCAnIycgfTsKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJPcmFjbGUiIC8vJE5PTi1OTFMtMSQKLQkJCX07Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWRWZW5kb3JzKCkgewotCQkJcmV0dXJuIFZFTkRPUlM7Ci0JCX0KLQkJcHVibGljIERUUERyaXZlckFkYXB0ZXIgYnVpbGRBZGFwdGVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQlyZXR1cm4gbmV3IE9yYWNsZShkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Qb3N0Z3JlU1FMLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Qb3N0Z3JlU1FMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNTk4ZjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvUG9zdGdyZVNRTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLQotY2xhc3MgUG9zdGdyZVNRTAotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JUG9zdGdyZVNRTChEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIFBvc3RncmVTUUwgSkRCQyBkcml2ZXIgcmV0dXJucyBhIHNpbmdsZSBjYXRhbG9nIGZyb20gdGhlIGNhbGwgdG8KLQkgKiB7QGxpbmsgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpfSB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZQotCSAqIGRhdGFiYXNlIGluaXRpYWxseSBzcGVjaWZpZWQgYnkgdGhlIGNvbm5lY3Rpb24gKGluIHRoZSBKREJDIFVSTCkuCi0JICogRFRQIHVzZXMgdGhpcyBjb25maWd1cmF0aW9uIHVubW9kaWZpZWQuIFVuZm9ydHVuYXRlbHksIHRoZSBEVFAKLQkgKiBkYXRhYmFzZSdzIG5hbWUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBQb3N0Z3JlU1FMIGRhdGFiYXNlJ3MKLQkgKiBuYW1lLgotCSAqLwotCUBPdmVycmlkZQotCUNhdGFsb2dTdHJhdGVneSBidWlsZENhdGFsb2dTdHJhdGVneSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kodGhpcy5kYXRhYmFzZS5nZXREVFBEYXRhYmFzZSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlGb2xkaW5nU3RyYXRlZ3kgYnVpbGRGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBMb3dlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgUG9zdGdyZVNRTCBkYXRhYmFzZSBob2xkcyBhIHNpbmdsZSBjYXRhbG9nIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMKLQkgKiB0aGUgZGF0YWJhc2UuCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0Q2F0YWxvZ05hbWVzVG8oQXJyYXlMaXN0PFN0cmluZz4gbmFtZXMpIHsKLQkJbmFtZXMuYWRkKHRoaXMuYnVpbGREZWZhdWx0Q2F0YWxvZ05hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGREZWZhdWx0Q2F0YWxvZ05hbWUoKSB7Ci0JCXJldHVybiAoKENhdGFsb2cpIHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKS5nZXRDYXRhbG9ncygpLmdldCgwKSkuZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFBvc3RncmVTUUwgaGFzIGEgInNjaGVtYSBzZWFyY2ggcGF0aCIuIFRoZSBkZWZhdWx0IGlzOjxicj48Y29kZT4KLQkgKiAgICAgIiR1c2VyIixwdWJsaWMKLQkgKiA8L2NvZGU+PGJyPgotCSAqIElmIHRoZSA8Y29kZT4iJHVzZXIiPC9jb2RlPiBzY2hlbWEgaXMgbm90IGZvdW5kLCB1c2UgdGhlCi0JICogPGNvZGU+InB1YmxpYyI8L2NvZGU+IHNjaGVtYS4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCXN1cGVyLmFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKG5hbWVzKTsKLQkJbmFtZXMuYWRkKFBVQkxJQ19TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NIRU1BX05BTUUgPSAicHVibGljIjsgIC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcgfTsKLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJwb3N0Z3JlcyIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgUG9zdGdyZVNRTChkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9TUUxTZXJ2ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1NRTFNlcnZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFlZmIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1NRTFNlcnZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotCi0vKioKLSAqIE1pY3Jvc29mdCBTUUwgU2VydmVyCi0gKi8KLWNsYXNzIFNRTFNlcnZlcgotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JU1FMU2VydmVyKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU1FMIFNlcnZlciBpZGVudGlmaWVycyBhcmUgY2FzZS1zZW5zaXRpdmUsIGV2ZW4gd2l0aG91dAotCSAqIGRlbGltaXRlcnMuIFRoaXMgY2FuIGRlcGVuZCBvbiB0aGUgY29sbGF0aW9uIHNldHRpbmcuLi4uCi0JICovCi0JLy9UT0RPIHF1ZXJ5IGRhdGFiYXNlIGZvciBjb2xsYXRpb24gc2V0dGluZwotCUBPdmVycmlkZQotCWJvb2xlYW4gcmVndWxhck5hbWVzTWF0Y2goU3RyaW5nIG5hbWUxLCBTdHJpbmcgbmFtZTIpIHsKLQkJcmV0dXJuIG5hbWUxLmVxdWFscyhuYW1lMik7Ci0JfQotCi0JLyoqCi0JICogU1FMIFNlcnZlciB3aWxsIHVzZSB0aGUgdXNlci1yZXF1ZXN0ZWQgZGF0YWJhc2U7IGlmIHRoYXQgZGF0YWJhc2UgaXMgbm90Ci0JICogZm91bmQsIGl0IHdpbGwgZGVmYXVsdCB0byA8Y29kZT5tYXN0ZXI8L2NvZGU+LgotCSAqLwotCUBPdmVycmlkZQotCXZvaWQgYWRkRGVmYXVsdENhdGFsb2dOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZCh0aGlzLmRhdGFiYXNlLmdldE5hbWUoKSk7Ci0JCW5hbWVzLmFkZChNQVNURVJfQ0FUQUxPR19JREVOVElGSUVSKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BU1RFUl9DQVRBTE9HX0lERU5USUZJRVIgPSAibWFzdGVyIjsgIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHNjaGVtYSBvbiBTUUwgU2VydmVyIGZvciBhbnkgZGF0YWJhc2UgKGNhdGFsb2cpIGlzCi0JICogPGNvZGU+ZGJvPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRTY2hlbWFOYW1lc1RvKEFycmF5TGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCW5hbWVzLmFkZChERUZBVUxUX1NDSEVNQV9OQU1FKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NIRU1BX05BTUUgPSAiZGJvIjsgIC8vJE5PTi1OTFMtMSQKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lU3RhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlM7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBFWFRFTkRFRF9SRUdVTEFSX05BTUVfU1RBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnXycsICdAJywgJyMnIH07Ci0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVBhcnRDaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUzsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9QQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJyQnIH07Ci0KLQkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGRlbGltaXRlciBzZXR0aW5nCi0JQE92ZXJyaWRlCi0JU3RyaW5nIGRlbGltaXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAnWycgKyBuYW1lICsgJ10nOwotCX0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQsIFNRTCBTZXJ2ZXIgZGVsaW1pdHMgaWRlbnRpZmllcnMgd2l0aCBicmFja2V0cwotCSAqICg8Y29kZT5bXTwvY29kZT4pOyBidXQgaXQKLQkgKiBjYW4gYWxzbyBiZSBjb25maWd1cmVkIHRvIHVzZSBkb3VibGUtcXVvdGVzLgotCSAqLwotCS8vVE9ETyBxdWVyeSBkYXRhYmFzZSBmb3IgZGVsaW1pdGVyIHNldHRpbmcKLQlAT3ZlcnJpZGUKLQlib29sZWFuIGlkZW50aWZpZXJJc0RlbGltaXRlZChTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gU3RyaW5nVG9vbHMuc3RyaW5nSXNCcmFja2V0ZWQoaWRlbnRpZmllcikKLQkJCQkJfHwgc3VwZXIuaWRlbnRpZmllcklzRGVsaW1pdGVkKGlkZW50aWZpZXIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBmYWN0b3J5ICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBGYWN0b3J5IGltcGxlbWVudHMgRFRQRHJpdmVyQWRhcHRlckZhY3RvcnkgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBWRU5ET1JTID0gewotCQkJCSJTUUwgU2VydmVyIiAvLyROT04tTkxTLTEkCi0JCQl9OwotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkVmVuZG9ycygpIHsKLQkJCXJldHVybiBWRU5ET1JTOwotCQl9Ci0JCXB1YmxpYyBEVFBEcml2ZXJBZGFwdGVyIGJ1aWxkQWRhcHRlcihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkJcmV0dXJuIG5ldyBTUUxTZXJ2ZXIoZGF0YWJhc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0MmQwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9TaW1wbGVDYXRhbG9nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWE7Ci0KLS8qKgotICogQ2F0YWxvZyBzdHJhdGVneSBmb3IgRFRQIGRhdGFiYXNlIGRyaXZlcnMgdGhhdCBzaW1wbHkgbW9kZWwgdGhlIGNhdGFsb2dzCi0gKiByZXR1cm5lZCBieSB0aGUgdW5kZXJseWluZyBKREJDIGRyaXZlciAoZS5nLiBTeWJhc2UpLgotICogCi0gKiBAc2VlIGphdmEuc3FsLkRhdGFiYXNlTWV0YURhdGEjZ2V0Q2F0YWxvZ3MoKQotICovCi1jbGFzcyBTaW1wbGVDYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCXByaXZhdGUgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2U7Ci0KLQlTaW1wbGVDYXRhbG9nU3RyYXRlZ3koRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kYXRhYmFzZSA9IGRhdGFiYXNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCX0KLQotCXB1YmxpYyBMaXN0PFNjaGVtYT4gZ2V0U2NoZW1hcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1N5YmFzZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvU3liYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDdhMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvU3liYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci0KLWNsYXNzIFN5YmFzZQotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JU3liYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKGRhdGFiYXNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlDYXRhbG9nU3RyYXRlZ3kgYnVpbGRDYXRhbG9nU3RyYXRlZ3koKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ2F0YWxvZ1N0cmF0ZWd5KHRoaXMuZGF0YWJhc2UuZ2V0RFRQRGF0YWJhc2UoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JRm9sZGluZ1N0cmF0ZWd5IGJ1aWxkRm9sZGluZ1N0cmF0ZWd5KCkgewotCQlyZXR1cm4gTm9uRm9sZGluZ1N0cmF0ZWd5Lmluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU3liYXNlIGlkZW50aWZpZXJzIGFyZSBjYXNlLXNlbnNpdGl2ZSwgZXZlbiB3aXRob3V0Ci0JICogZGVsaW1pdGVycy4gVGhpcyBjYW4gZGVwZW5kIG9uIHRoZSBjb2xsYXRpb24gc2V0dGluZy4uLi4KLQkgKi8KLQkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGNvbGxhdGlvbiBzZXR0aW5nCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiByZWd1bGFyTmFtZXNNYXRjaChTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQlyZXR1cm4gbmFtZTEuZXF1YWxzKG5hbWUyKTsKLQl9Ci0KLQkvKioKLQkgKiBTeWJhc2Ugd2lsbCB1c2UgdGhlIHVzZXItcmVxdWVzdGVkIGRhdGFiYXNlOyBpZiB0aGF0IGRhdGFiYXNlIGlzIG5vdAotCSAqIGZvdW5kLCBpdCB3aWxsIGRlZmF1bHQgdG8gPGNvZGU+bWFzdGVyPC9jb2RlPi4KLQkgKi8KLQlAT3ZlcnJpZGUKLQl2b2lkIGFkZERlZmF1bHRDYXRhbG9nTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQodGhpcy5kYXRhYmFzZS5nZXROYW1lKCkpOwotCQluYW1lcy5hZGQoTUFTVEVSX0NBVEFMT0dfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVJfQ0FUQUxPR19OQU1FID0gIm1hc3RlciI7ICAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgdHlwaWNhbCBkZWZhdWx0IHNjaGVtYSBvbiBTeWJhc2UgZm9yIGFueSBkYXRhYmFzZSAoY2F0YWxvZykgaXMKLQkgKiA8Y29kZT5kYm88L2NvZGU+LgotCSAqIDxicj4KLQkgKiBBY3R1YWxseSwgdGhlIGRlZmF1bHQgc2NoZW1hIGlzIG1vcmUgbGlrZSBhIHNlYXJjaCBwYXRoOgotCSAqIFRoZSBzZXJ2ZXIgbG9va3MgZm9yIGEgc2NoZW1hIG9iamVjdCAoZS5nLiBhIHRhYmxlKSBmaXJzdCBpbiB0aGUgdXNlcidzCi0JICogc2NoZW1hLCB0aGVuIGl0IGxvb2tzIGZvciB0aGUgc2NoZW1hIG9iamVjdCBpbiB0aGUgZGF0YWJhc2Ugb3duZXIncwotCSAqIHNjaGVtYSAoPGNvZGU+ZGJvPC9jb2RlPikuIEFzIGEgcmVzdWx0LCBpdCdzIHJlYWxseSBub3QgcG9zc2libGUgdG8gc3BlY2lmeQotCSAqIHRoZSAiZGVmYXVsdCIgc2NoZW1hIHdpdGhvdXQga25vd2luZyB0aGUgc2NoZW1hIG9iamVjdCB3ZSBhcmUKLQkgKiBsb29raW5nIGZvci4KLQkgKiA8YnI+Ci0JICogKE5vdGU6IHRoZSBjdXJyZW50ICd1c2VyJyBpcyBub3QgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIGN1cnJlbnQKLQkgKiAnbG9naW4nIC0gc2VlIHNwX2FkZHVzZXIgYW5kIHNwX2FkZGxvZ2luOyBzbyB3ZSBwcm9iYWJseSBjYW4ndAotCSAqIHVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZSNnZXRVc2VyTmFtZSgpfS4pCi0JICovCi0JQE92ZXJyaWRlCi0Jdm9pZCBhZGREZWZhdWx0U2NoZW1hTmFtZXNUbyhBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcykgewotCQluYW1lcy5hZGQoREVGQVVMVF9TQ0hFTUFfTkFNRSk7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDSEVNQV9OQU1FID0gImRibyI7ICAvLyROT04tTkxTLTEkCi0KLQlAT3ZlcnJpZGUKLQljaGFyW10gZ2V0RXh0ZW5kZWRSZWd1bGFyTmFtZVN0YXJ0Q2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIEVYVEVOREVEX1JFR1VMQVJfTkFNRV9TVEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1NUQVJUX0NIQVJBQ1RFUlMgPSBuZXcgY2hhcltdIHsgJ18nLCAnQCcgfTsKLQotCUBPdmVycmlkZQotCWNoYXJbXSBnZXRFeHRlbmRlZFJlZ3VsYXJOYW1lUGFydENoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBFWFRFTkRFRF9SRUdVTEFSX05BTUVfUEFSVF9DSEFSQUNURVJTOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gRVhURU5ERURfUkVHVUxBUl9OQU1FX1BBUlRfQ0hBUkFDVEVSUyA9IG5ldyBjaGFyW10geyAnJCcsICelJywgJ6MnLCAnIycgfTsKLQotCS8vVE9ETyBxdWVyeSBkYXRhYmFzZSBmb3IgZGVsaW1pdGVyIHNldHRpbmcKLQlAT3ZlcnJpZGUKLQlTdHJpbmcgZGVsaW1pdE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuICdbJyArIG5hbWUgKyAnXSc7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCwgU3liYXNlIGRlbGltaXRzIGlkZW50aWZpZXJzIHdpdGggYnJhY2tldHMKLQkgKiAoPGNvZGU+W108L2NvZGU+KTsgYnV0IGl0Ci0JICogY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byB1c2UgZG91YmxlLXF1b3Rlcy4KLQkgKi8KLQkvL1RPRE8gcXVlcnkgZGF0YWJhc2UgZm9yIGRlbGltaXRlciBzZXR0aW5nCi0JQE92ZXJyaWRlCi0JYm9vbGVhbiBpZGVudGlmaWVySXNEZWxpbWl0ZWQoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ0lzQnJhY2tldGVkKGlkZW50aWZpZXIpCi0JCQkJCXx8IHN1cGVyLmlkZW50aWZpZXJJc0RlbGltaXRlZChpZGVudGlmaWVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gVkVORE9SUyA9IHsKLQkJCQkiU3liYXNlX0FTQSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiU3liYXNlX0FTRSIgLy8kTk9OLU5MUy0xJAotCQkJfTsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQlyZXR1cm4gVkVORE9SUzsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgU3liYXNlKGRhdGFiYXNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1Vua25vd24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvaW50ZXJuYWwvZHJpdmVyL1Vua25vd24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQxNzI1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Vbmtub3duLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuaW50ZXJuYWwuZHJpdmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLQotY2xhc3MgVW5rbm93bgotCWV4dGVuZHMgQWJzdHJhY3REVFBEcml2ZXJBZGFwdGVyCi17Ci0JVW5rbm93bihEYXRhYmFzZSBkYXRhYmFzZSkgewotCQlzdXBlcihkYXRhYmFzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQ2F0YWxvZ1N0cmF0ZWd5IGJ1aWxkQ2F0YWxvZ1N0cmF0ZWd5KCkgewotCQkvLyBpbmZlciBmcm9tIGV4aXN0aW5nIGNhdGFsb2dzIGFuZCBzY2hlbWFzCi0JCXJldHVybiBuZXcgVW5rbm93bkNhdGFsb2dTdHJhdGVneSh0aGlzLmRhdGFiYXNlLmdldERUUERhdGFiYXNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCUZvbGRpbmdTdHJhdGVneSBidWlsZEZvbGRpbmdTdHJhdGVneSgpIHsKLQkJLy8gU1FMIHN0YW5kYXJkCi0JCXJldHVybiBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuaW5zdGFuY2UoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZmFjdG9yeSAqKioqKioqKioqCi0KLQlzdGF0aWMgY2xhc3MgRmFjdG9yeSBpbXBsZW1lbnRzIERUUERyaXZlckFkYXB0ZXJGYWN0b3J5IHsKLQkJcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZFZlbmRvcnMoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCQlwdWJsaWMgRFRQRHJpdmVyQWRhcHRlciBidWlsZEFkYXB0ZXIoRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXJldHVybiBuZXcgVW5rbm93bihkYXRhYmFzZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9Vbmtub3duQ2F0YWxvZ1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNzcyMmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvVW5rbm93bkNhdGFsb2dTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLmludGVybmFsLmRyaXZlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hOwotCi0vKioKLSAqIENhdGFsb2cgc3RyYXRlZ3kgZm9yIHVua25vd24gRFRQIGRhdGFiYXNlIGRyaXZlcnMuCi0gKiBJbmZlciB0aGUgc3RyYXRlZ3kgZnJvbSB0aGUgcmV0dXJuZWQgY2F0YWxvZ3MgYW5kIHNjaGVtYXMuCi0gKiAKLSAqIEBzZWUgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YSNnZXRDYXRhbG9ncygpCi0gKi8KLWNsYXNzIFVua25vd25DYXRhbG9nU3RyYXRlZ3kKLQlpbXBsZW1lbnRzIENhdGFsb2dTdHJhdGVneQotewotCXByaXZhdGUgZmluYWwgRGF0YWJhc2UgZGF0YWJhc2U7Ci0KLQlVbmtub3duQ2F0YWxvZ1N0cmF0ZWd5KERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGF0YWJhc2UgPSBkYXRhYmFzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRhdGFiYXNlIHJldHVybnMgYSBsaXN0IG9mIGNhdGFsb2dzIGFuZAotCSAqIHRoYXQgbGlzdCBkb2VzIG5vdCBjb250YWluIG9ubHkgYSAiZmF1eCIgY2F0YWxvZy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gISB0aGlzLmdldENhdGFsb2dzKCkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyBMaXN0PENhdGFsb2c+IGdldENhdGFsb2dzKCkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gdGhpcy5nZXRDYXRhbG9nc18oKTsKLQkJLy8gaWYgdGhlcmUgYXJlIG5vIGNhdGFsb2dzLCB0aGUgZGF0YWJhc2UgbXVzdCBob2xkIHRoZSBzY2hlbWF0YSBkaXJlY3RseQotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJQ2F0YWxvZyBmYXV4Q2F0YWxvZyA9IHRoaXMuc2VsZWN0RmF1eENhdGFsb2coY2F0YWxvZ3MpOwotCQkvLyBpZiB3ZSBkb24ndCBoYXZlIGEgImZhdXgiIGNhdGFsb2csIHdlIG11c3QgaGF2ZSAicmVhbCIgY2F0YWxvZ3MKLQkJcmV0dXJuIChmYXV4Q2F0YWxvZyA9PSBudWxsKSA/IGNhdGFsb2dzIDogQ29sbGVjdGlvbnMuPENhdGFsb2c+ZW1wdHlMaXN0KCk7Ci0JfQotCi0JcHVibGljIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKCkgewotCQlMaXN0PENhdGFsb2c+IGNhdGFsb2dzID0gdGhpcy5nZXRDYXRhbG9nc18oKTsKLQkJLy8gaWYgdGhlcmUgYXJlIG5vIGNhdGFsb2dzLCB0aGUgZGF0YWJhc2UgbXVzdCBob2xkIHRoZSBzY2hlbWF0YSBkaXJlY3RseQotCQlpZiAoKGNhdGFsb2dzID09IG51bGwpIHx8IGNhdGFsb2dzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIHRoaXMuZ2V0U2NoZW1hc18oKTsKLQkJfQotCi0JCUNhdGFsb2cgZmF1eENhdGFsb2cgPSB0aGlzLnNlbGVjdEZhdXhDYXRhbG9nKGNhdGFsb2dzKTsKLQkJcmV0dXJuIChmYXV4Q2F0YWxvZyAhPSBudWxsKSA/IHRoaXMuZ2V0U2NoZW1hcyhmYXV4Q2F0YWxvZykgOiBDb2xsZWN0aW9ucy48U2NoZW1hPmVtcHR5TGlzdCgpOwotCX0KLQotCS8vIG1pbmltaXplIHNjb3BlIG9mIHN1cHByZXNzZWQgd2FybmluZ3MKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8U2NoZW1hPiBnZXRTY2hlbWFzKENhdGFsb2cgY2F0YWxvZykgewotCQlyZXR1cm4gY2F0YWxvZy5nZXRTY2hlbWFzKCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIHNwZWNpZmllZCBsaXN0IG9mIGNhdGFsb2dzIGNvbnRhaW5zIGEgImZhdXgiIGNhdGFsb2cgKGkuZS4gYQotCSAqIHNpbmdsZSBjYXRhbG9nIHdpdGggYW4gZW1wdHkgc3RyaW5nIGZvciBhIG5hbWUpLCByZXR1cm4gaXQ7IG90aGVyd2lzZQotCSAqIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIENhdGFsb2cgc2VsZWN0RmF1eENhdGFsb2coTGlzdDxDYXRhbG9nPiBjYXRhbG9ncykgewotCQlpZiAoY2F0YWxvZ3Muc2l6ZSgpID09IDEpIHsKLQkJCUNhdGFsb2cgY2F0YWxvZyA9IGNhdGFsb2dzLmdldCgwKTsKLQkJCWlmIChjYXRhbG9nLmdldE5hbWUoKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gY2F0YWxvZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3Q8Q2F0YWxvZz4gZ2V0Q2F0YWxvZ3NfKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRDYXRhbG9ncygpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxTY2hlbWE+IGdldFNjaGVtYXNfKCkgewotCQlyZXR1cm4gdGhpcy5kYXRhYmFzZS5nZXRTY2hlbWFzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi9pbnRlcm5hbC9kcml2ZXIvVXBwZXJDYXNlRm9sZGluZ1N0cmF0ZWd5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9VcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhZmVjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL2ludGVybmFsL2RyaXZlci9VcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5pbnRlcm5hbC5kcml2ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogRm9sZCA8ZW0+cmVndWxhcjwvZW0+IGlkZW50aWZpZXJzIHRvIHVwcGVyIGNhc2UuCi0gKi8KLWNsYXNzIFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneQotCWltcGxlbWVudHMgRm9sZGluZ1N0cmF0ZWd5Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9sZGluZ1N0cmF0ZWd5IElOU1RBTkNFID0gbmV3IFVwcGVyQ2FzZUZvbGRpbmdTdHJhdGVneSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0Jc3RhdGljIEZvbGRpbmdTdHJhdGVneSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBVcHBlckNhc2VGb2xkaW5nU3RyYXRlZ3koKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmb2xkKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXJldHVybiBpZGVudGlmaWVyLnRvVXBwZXJDYXNlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbmFtZUlzRm9sZGVkKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5zdHJpbmdJc1VwcGVyY2FzZShuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkMDdiMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhZWMyOWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNTdW4gTWF5IDI3IDE1OjEwOjA5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjc3Nzc3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMS4wLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNjA2YjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+SnVuZSAwNiwgMjAwNzwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5pbmkgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q4OGI5ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGRhYWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmRkMjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotYmx1cmI9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSlBBIFN1cHBvcnRcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IE9yYWNsZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA2LCAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwODliYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQubWFwcGluZ3MsXAotICAgICAgICAgICAgICAgYWJvdXQucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgY29tcG9uZW50LnhtbApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWIxNDZkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgIHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmciIGZyYWdtZW50PSJmYWxzZSIvPgotPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmNvbW1vbi5lY2xpcHNlbGluay5jb3JlIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIi8+Ci08cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuYnJhbmRpbmcvaWNvbnMvV1RQX2ljb25feDMyX3YyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYwOWMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwMTczNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgSlBBIFN1cHBvcnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGggYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGU4NjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRhYTY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTIwYzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowOTowNyBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWNlNDM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmU7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiCi1JbXBvcnQtUGFja2FnZTogamF2YXgucGVyc2lzdGVuY2UKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MWY1ODYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5kZGxnZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhMjU3OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmODQ4MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKcGEgRWNsaXBzZUxpbmsgU3VwcG9ydCAtIERETCBHZW5lcmF0aW9uCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL2RkbGdlbi9NYWluLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvZGRsZ2VuL01haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkMDM0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuZGRsZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvZGRsZ2VuL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmRkbGdlbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotCi0vKiogCi0gKiBUaGlzIGNsYXNzIGNyZWF0ZXMgYSBFY2xpcHNlTGluayA8Y29kZT5FbnRpdHlNYW5hZ2VyRmFjdG9yeTwvY29kZT4sIAotICogYW5kIGV4ZWN1dGVzIHRoZSBEREwgZ2VuZXJhdG9yIHdpdGggdGhlIGNvbW1hbmQgc2V0IGluIHRoZSBwcm9wZXJ0aWVzOiAKLSAqICAgICA8Y29kZT5lY2xpcHNlbGluay5kZGwtZ2VuZXJhdGlvbi5vdXRwdXQtbW9kZTwvY29kZT4gCi0gKiAgICAgPGNvZGU+ZWNsaXBzZWxpbmsuYXBwbGljYXRpb24tbG9jYXRpb248L2NvZGU+Ci0gKiAKLSAqIEN1cnJlbnQgY29tbWFuZC1saW5lIGFyZ3VtZW50czoKLSAqICAgICBbLXB1IHB1TmFtZV0gLSBwZXJzaXN0ZW5jZSB1bml0IG5hbWUKLSAqICAgICBbLXAgcHJvcGVydGllc0ZpbGVQYXRoXSAtIHByb3BlcnRpZXMgZm9yIEVjbGlwc2VMaW5rIEVudGl0eU1hbmFnZXIKLSAqICAKLSAqICBFeGFtcGxlIG9mIGEgcHJvcGVydGllcyBmaWxlOgotICogIAllY2xpcHNlbGluay5qZGJjLmJpbmQtcGFyYW1ldGVycz1mYWxzZQotICogIAllY2xpcHNlbGluay5qZGJjLmRyaXZlcj1vcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51cmw9amRiY1w6ZGVyYnlcOmNcOi9kZXJieWRiL3Rlc3RkYjtjcmVhdGVcPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuamRiYy51c2VyPXRyYW4KLSAqICAJZWNsaXBzZWxpbmsuamRiYy5wYXNzd29yZD0KLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5sZXZlbD1GSU5FU1QKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aW1lc3RhbXA9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy50aHJlYWQ9ZmFsc2UKLSAqICAJZWNsaXBzZWxpbmsubG9nZ2luZy5zZXNzaW9uPWZhbHNlCi0gKiAgCWVjbGlwc2VsaW5rLmxvZ2dpbmcuZXhjZXB0aW9ucz10cnVlCi0gKiAgCWVjbGlwc2VsaW5rLm9ybS50aHJvdy5leGNlcHRpb25zPXRydWUKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb24ub3V0cHV0LW1vZGU9ZGF0YWJhc2UKLSAqICAJZWNsaXBzZWxpbmsuZGRsLWdlbmVyYXRpb249ZHJvcC1hbmQtY3JlYXRlLXRhYmxlcwotICogIAllY2xpcHNlbGluay5hcHBsaWNhdGlvbi1sb2NhdGlvbj1jXDovX1Byb2plY3RzXy9FeGFtcGxlRERMCi0gKi8KLXB1YmxpYyBjbGFzcyBNYWluCi17Ci0JcHJvdGVjdGVkIEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZjsKLQlwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZWNsaXBzZUxpbmtQcm9wZXJ0aWVzOwotCXByaXZhdGUgU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGg7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVidWdNb2RlOwotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCW5ldyBNYWluKCkuZXhlY3V0ZShhcmdzKTsKLQl9Ci0KLQlwcml2YXRlIE1haW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShTdHJpbmdbXSBhcmdzKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZVdpdGgoYXJncyk7Ci0JCQotCQl0aGlzLmVtZiA9IFBlcnNpc3RlbmNlLmNyZWF0ZUVudGl0eU1hbmFnZXJGYWN0b3J5KHRoaXMuZ2V0UFVOYW1lKGFyZ3MpLCB0aGlzLmVjbGlwc2VMaW5rUHJvcGVydGllcyk7Ci0JCXRoaXMucGVyZm9ybSgpOwotCQl0aGlzLmNsb3NlRW50aXR5TWFuYWdlckZhY3RvcnkoKTsKLQkJCi0JCXRoaXMuZGlzcG9zZSgpOwotCQlyZXR1cm47Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm0oKSB7Ci0JCS8vIGNyZWF0ZSBhbiBFTSB0byBnZW5lcmF0ZSBzY2hlbWEuCi0JCXRoaXMuZW1mLmNyZWF0ZUVudGl0eU1hbmFnZXIoKS5jbG9zZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZUVudGl0eU1hbmFnZXJGYWN0b3J5KCkgewotCQl0aGlzLmVtZi5jbG9zZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpdGgoU3RyaW5nW10gYXJncykgewotCi0JCXRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCA9IHRoaXMuZ2V0RWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aChhcmdzKTsKLQkJdGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXMgPSB0aGlzLmdldFByb3BlcnRpZXModGhpcy5lY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLQotCQl0aGlzLmlzRGVidWdNb2RlID0gdGhpcy5nZXREZWJ1Z01vZGUoYXJncyk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkaXNwb3NlKCkgewotCi0JCWlmKCAhIHRoaXMuaXNEZWJ1Z01vZGUpIHsKLQkJCW5ldyBGaWxlKHRoaXMuZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCkuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFByb3BlcnRpZXMoU3RyaW5nIGVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgpIHsKLQkJCi0JCVNldDxFbnRyeTxPYmplY3QsIE9iamVjdD4+IHByb3BlcnRpZXNTZXQgPSBudWxsOwotCQl0cnkgewotCQkJcHJvcGVydGllc1NldCA9IHRoaXMubG9hZEVjbGlwc2VMaW5rUHJvcGVydGllcyhlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1pc3Npbmc6ICIgKyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJZm9yKEVudHJ5PE9iamVjdCwgT2JqZWN0PiBwcm9wZXJ0eSA6IHByb3BlcnRpZXNTZXQpIHsKLQkJCXByb3BlcnRpZXMucHV0KChTdHJpbmcpcHJvcGVydHkuZ2V0S2V5KCksIChTdHJpbmcpcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BlcnRpZXM7Ci0JfQotCi0gICAgcHJpdmF0ZSBTZXQ8RW50cnk8T2JqZWN0LCBPYmplY3Q+PiBsb2FkRWNsaXBzZUxpbmtQcm9wZXJ0aWVzKFN0cmluZyBlY2xpcHNlTGlua1Byb3BlcnRpZXNQYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZWNsaXBzZUxpbmtQcm9wZXJ0aWVzUGF0aCk7Ci0gICAgICAgIAotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmVudHJ5U2V0KCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBhcmd1bWVudCBxdWVyaWVzICoqKioqKioqKioKLSAgICAKLQlwcml2YXRlIFN0cmluZyBnZXRQVU5hbWUoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wdSIsIGFyZ3MpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdldEVjbGlwc2VMaW5rUHJvcGVydGllc1BhdGgoU3RyaW5nW10gYXJncykgewotCi0JCXJldHVybiB0aGlzLmdldEFyZ3VtZW50VmFsdWUoIi1wIiwgYXJncyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0RGVidWdNb2RlKFN0cmluZ1tdIGFyZ3MpIHsKLQotCQlyZXR1cm4gdGhpcy5hcmd1bWVudEV4aXN0cygiLWRlYnVnIiwgYXJncyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXJndW1lbnRWYWx1ZShTdHJpbmcgYXJndW1lbnQsIFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1tpXTsKLQkJCWlmIChhcmcudG9Mb3dlckNhc2UoKS5lcXVhbHMoYXJndW1lbnQpKSB7Ci0JCQkJaW50IGogPSBpICsgMTsKLQkJCQlpZiAoaiA8IGFyZ3MubGVuZ3RoKSB7Ci0JCQkJCXJldHVybiBhcmdzW2pdOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIGFyZ3VtZW50RXhpc3RzKFN0cmluZyBhcmd1bWVudCwgU3RyaW5nW10gYXJncykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBhcmcgPSBhcmdzW2ldOwotCQkJaWYgKGFyZy50b0xvd2VyQ2FzZSgpLmVxdWFscyhhcmd1bWVudCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjU3NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icHJvcGVydHlfZmlsZXMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5jdnNpZ25vcmUgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLy5wcm9qZWN0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmU4YzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmdlbjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MWQ2YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDk6MjYgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZjNDg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmFwYWNoZS5jb21tb25zLmxhbmc7YnVuZGxlLXZlcnNpb249IlsyLjEuMCwzLjAuMCkiLAotIG9yZy5hcGFjaGUudmVsb2NpdHk7YnVuZGxlLXZlcnNpb249IlsxLjUuMCwyLjAuMCkiLAotIG9yZy5qZG9tO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNS4wLDMuMC4wKSIKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vYWJvdXQuaHRtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlODc1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLwotamFycy5jb21waWxlLm9yZGVyID0gLgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vY29tcG9uZW50LnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNWEzNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4iPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTM3YTI1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFbnRpdHkgR2VuCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vcHJvcGVydHlfZmlsZXMvanB0X2dlbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjkwN2EyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3Byb3BlcnR5X2ZpbGVzL2pwdF9nZW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QYWNrYWdlR2VuZXJhdG9yX3Rhc2tOYW1lPUdlbmVyYXRlIEVudGl0aWVzCi1HZW5TY29wZV90YXNrTmFtZT1CdWlsZCBEYXRhYmFzZSBNb2RlbAotRW50aXR5R2VuZXJhdG9yX3Rhc2tOYW1lPUdlbmVyYXRlIEVudGl0eTogezB9Ci1FcnJvcl9HZW5lcmF0aW5nX0VudGl0aWVzID0gRXJyb3IgR2VuZXJhdGluZyBFbnRpdGllcwotCi1EZWxldGVfRm9sZGVyX0Vycm9yID0gIlRoZSBkaXJlY3RvcnkgezB9IGNvdWxkIG5vdCBiZSBkZWxldGVkLiIKLURlbGV0ZV9GaWxlX0Vycm9yID0gIlRoZSBmaWxlIHswfSBjb3VsZCBub3QgYmUgZGVsZXRlZC4iCi1GaWxlX1JlYWRfT25seV9FcnJvcj0gIlRoZSBmaWxlIHswfSBjb3VsZCBub3QgYmUgbW9kaWZpZWQgYmVjYXVzZSB3cml0ZSBhY2Nlc3MgaXMgZGVuaWVkLlxuUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBtYXJrZWQgYXMgcmVhZG9ubHkgaW4gdGhlIGZpbGUgc3lzdGVtLiIKLQotVGVtcGxhdGVzX25vdEZvdW5kID0gVW5hYmxlIHRvIGZpbmQgSlBBIGVudGl0aWVzIGdlbmVyYXRpb24gdGVtcGxhdGVzIGluIHBsdWdpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9Bc3NvY2lhdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWI0YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGFuIE9STSBhc3NvY2lhdGlvbi4KLSAqIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgYXNzb2NpYXRpb25zOgotICogPHVsPjxsaT5zaW1wbGUgYXNzb2NpYXRpb246IEFuIGFzc29jaWF0aW9uIGJldHdlZW4gdHdvIGRhdGFiYXNlIHRhYmxlcy4KLSAqIFRoZSA8ZW0+cmVmZXJyZXI8L2NvZGU+IHRhYmxlIGlzIHRoZSBvbmUgY29udGFpbmluZyB0aGUgZm9yZWlnbiBrZXkKLSAqICwgdGhlIDxlbT5yZWZlcmVuY2VkPC9jb2RlPiB0YWJsZSBpcyB0aGUgb3RoZXIgcGFydHkuPGJyPgotICogCi0gKiA8bGk+bWFueSB0byBtYW55IGFzc29jaWF0aW9uOiBBbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHR3byB0YWJsZXMgam9pbmVkIGJ5IAotICogYSA8ZW0+am9pbiB0YWJsZTwvZW0+LgotICogSW4gdGhlIGV4YW1wbGUgQVVUSE9SLCBCT09LLCBBVVRIT1JfQk9PSywgVGhlIHJlZmVycmVyIGFuZCByZWZlcmVuY2VkIGFyZSAKLSAqIEFVVEhPUiBhbmQgIEJPT0ssIGFuZCB0aGUgam9pbiB0YWJsZSBpcyBBVVRIT1JfQk9PSy4KLSAqIDwvdWw+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkUgPSAibWFueS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWSA9ICJtYW55LXRvLW1hbnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19PTkUgPSAib25lLXRvLW9uZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTlkgPSAib25lLXRvLW1hbnkiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJJX0RJID0gImJpLWRpIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1JNQUxfREkgPSAibm9ybWFsLWRpIjsgLy9yZWZlcnJlci0+cmVmZXJlbmNlZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QUE9TSVRFX0RJID0gIm9wcG9zaXRlLWRpIjsgLy9yZWZlcmVuY2VkLT5yZWZlcnJlcgotCQotCXByaXZhdGUgdHJhbnNpZW50IE9STUdlbkN1c3RvbWl6ZXIgbUN1c3RvbWl6ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbVJlZmVycmVyVGFibGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1Kb2luVGFibGVOYW1lOwotCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVycmVyQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcmVuY2VkQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG1SZWZlcnJlckpvaW5Db2xOYW1lczsgLypTdHJpbmcgb2JqZWN0cyovCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVJlZmVyZW5jZWRKb2luQ29sTmFtZXM7IC8qU3RyaW5nIG9iamVjdHMqLwotCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcnJlckNvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJlbmNlZENvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCXByaXZhdGUgdHJhbnNpZW50IExpc3Q8T1JNR2VuQ29sdW1uPiBtUmVmZXJyZXJKb2luQ29sczsgLypPUk1HZW5Db2x1bW4gb2JqZWN0cyovCi0JcHJpdmF0ZSB0cmFuc2llbnQgTGlzdDxPUk1HZW5Db2x1bW4+IG1SZWZlcmVuY2VkSm9pbkNvbHM7IC8qT1JNR2VuQ29sdW1uIG9iamVjdHMqLwotCQotCXByaXZhdGUgU3RyaW5nIG1DYXJkaW5hbGl0eTsKLQlwcml2YXRlIFN0cmluZyBtRGlyZWN0aW9uYWxpdHk7Ci0JcHJpdmF0ZSBieXRlIG1GbGFncyA9IEdFTkVSQVRFRDsKLQkKLQlwcml2YXRlIEFzc29jaWF0aW9uUm9sZSBtUmVmZXJyZXJSb2xlOwotCXByaXZhdGUgQXNzb2NpYXRpb25Sb2xlIG1SZWZlcmVuY2VkUm9sZTsKLQotCXByaXZhdGUgdHJhbnNpZW50IEZvcmVpZ25LZXkgbUZvcmVpZ25LZXk7CQotCQotCS8qY29uc3RhbnRzIGZvciBtRmxhZ3MqLwotCS8qd2hldGhlciB0aGUgYXNzb2NpYXRpb24gc2hvdWxkIGJlIGdlbmVyYXRlZCovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBHRU5FUkFURUQgPSAxIDw8IDA7Ci0JLyp3aGV0aGVyIHRoZSBhc3NvY2lhdGlvbiBpcyBjdXN0b20gKGkuZSBpcyBub3QgYXV0byBjb21wdXRlZCBmcm9tIGZvcmVpZ24ga2V5cyByZWxhdGlvbnNoaXBzKS4qLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgQ1VTVE9NID0gMSA8PCAxOwotCQotCS8qKgotCSAqIFRoZSBzaW1wbGUgYXNzb2NpYXRpb24gY29uc3RydWN0b3IuCi0JICogVGhlIDIgdGFibGVzIGFyZSBqb2luZWQgd2hlbiB0aGUgdmFsdWVzIG9mIGVhY2ggY29sdW1uIGluCi0JICogcmVmZXJyZXJDb2xOYW1lcyBtYXRjaCBpdHMgY29ycmVzcG9uZGluZyBjb2x1bW4gaW4gcmVmZXJlbmNlZENvbE5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSByZWZlcnJlclRhYmxlTmFtZSBUaGUgImZvcmVpZ24ga2V5IiB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJyZXJDb2xOYW1lcyBUaGUgY29sdW1uIG5hbWVzIGluIHRoZSByZWZlcnJlciB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlZFRhYmxlTmFtZSBUaGUgInByaW1hcnkga2V5IiB0YWJsZS4KLQkgKiBAcGFyYW0gcmVmZXJlbmNlZENvbE5hbWVzIFRoZSBjb2x1bW4gbmFtZXMgaW4gdGhlIHJlZmVyZW5jZWQgdGFibGUuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJyZXJDb2xOYW1lcwotCQkJLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcykgIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1DdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJbVJlZmVycmVyVGFibGVOYW1lID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0JCW1SZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlTmFtZTsKLQkJbVJlZmVycmVyQ29sTmFtZXMgPSByZWZlcnJlckNvbE5hbWVzOwotCQltUmVmZXJlbmNlZENvbE5hbWVzID0gcmVmZXJlbmNlZENvbE5hbWVzOwotCQkKLQkJbUNhcmRpbmFsaXR5ID0gTUFOWV9UT19PTkU7Ci0JCW1EaXJlY3Rpb25hbGl0eSA9IEJJX0RJOwotCQkKLQkJc2V0Q3VzdG9tKHRydWUpOwotCX0KLQkvKioKLQkgKiBUaGUgbWFueSB0byBtYW55IGNvbnN0cnVjdG9yLgotCSAqIFRoZSAyIHRhYmxlcyBhcmUgam9pbmVkIHdoZW4gdGhlIHZhbHVlcyBvZiBlYWNoIGNvbHVtbiBpbgotCSAqIHJlZmVycmVyQ29sTmFtZXMgbWF0Y2ggaXRzIGNvcnJlc3BvbmRpbmcgY29sdW1uIGluIHJlZmVycmVySm9pbkNvbE5hbWVzCi0JICogLCBhbmQgZWFjaCBjb2x1bW4gaW4gcmVmZXJlbmNlZENvbE5hbWVzIG1hdGNoIGl0cyBjb3JyZXNwb25kaW5nIGNvbHVtbiBpbiByZWZlcmVuY2VkSm9pbkNvbE5hbWVzLgotCSAqCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lLCBMaXN0PFN0cmluZz4gcmVmZXJyZXJDb2xOYW1lcwotCQkJLCBTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcwotCQkJLCBTdHJpbmcgam9pblRhYmxlTmFtZSwgTGlzdDxTdHJpbmc+IHJlZmVycmVySm9pbkNvbE5hbWVzLCBMaXN0PFN0cmluZz4gcmVmZXJlbmNlZEpvaW5Db2xOYW1lcykgewotCQlzdXBlcigpOwotCQkKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQltUmVmZXJyZXJUYWJsZU5hbWUgPSByZWZlcnJlclRhYmxlTmFtZTsKLQkJbVJlZmVyZW5jZWRUYWJsZU5hbWUgPSByZWZlcmVuY2VkVGFibGVOYW1lOwotCQltUmVmZXJyZXJDb2xOYW1lcyA9IHJlZmVycmVyQ29sTmFtZXM7Ci0JCW1SZWZlcmVuY2VkQ29sTmFtZXMgPSByZWZlcmVuY2VkQ29sTmFtZXM7Ci0JCW1Kb2luVGFibGVOYW1lID0gam9pblRhYmxlTmFtZTsKLQkJbVJlZmVycmVySm9pbkNvbE5hbWVzID0gcmVmZXJyZXJKb2luQ29sTmFtZXM7Ci0JCW1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzID0gcmVmZXJlbmNlZEpvaW5Db2xOYW1lczsKLQkJCi0JCW1DYXJkaW5hbGl0eSA9IE1BTllfVE9fTUFOWTsJCi0JCW1EaXJlY3Rpb25hbGl0eSA9IEJJX0RJOwotCQkKLQkJc2V0Q3VzdG9tKHRydWUpOwotCX0KLQkvKioKLQkgKiBFbXB0eSBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgdGhlIGRlc2VyaWFsaXphdGlvbiAoc2hvdWxkIG5vdCBiZSB1c2VkIG90aGVyd2lzZSkuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uKCkgewotCX0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgY2FyZGluYWxpdHkgYmFzZWRvbiB0aGUgZm9yaWduIGtleSBkZWZpbml0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wdXRlQ2FyZGluYWxpdHkoKSAgewotCQkvKmJ5IGRlZmF1bHQgdGhlIGFzc29jaWF0aW9uIGlzIG1hbnktdG8tb25lIHVubGVzcyB0aGUgZm9yZWlnbiBrZXkgCi0JCSAqIGlzIGFsc28gdGhlIHByaW1hcnkga2V5LCBpbiB3aGljaCBjYXNlIGl0IGlzIGEgb25lLXRvLW9uZS4qLwotCQltQ2FyZGluYWxpdHkgPSBNQU5ZX1RPX09ORTsKLQkJCi0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZWZlcnJlckNvbHMgPSBnZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHBrQ29scyA9IGdldFJlZmVycmVyVGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCQlpZiAocGtDb2xzLnNpemUoKSA9PSByZWZlcnJlckNvbHMuc2l6ZSgpKSB7Ci0JCQlib29sZWFuIGlzRmtQayA9IHRydWU7Ci0JCQlmb3IgKGludCBpID0gMCwgbiA9IHBrQ29scy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCQlpZiAoISgoT1JNR2VuQ29sdW1uKXBrQ29scy5nZXQoaSkpLmdldE5hbWUoKS5lcXVhbHMoKChPUk1HZW5Db2x1bW4pcmVmZXJyZXJDb2xzLmdldChpKSkuZ2V0TmFtZSgpKSkgewotCQkJCQlpc0ZrUGsgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzRmtQaykgewotCQkJCW1DYXJkaW5hbGl0eSA9IE9ORV9UT19PTkU7Ci0JCQl9Ci0JCX0KLQkJCi0JCXNldEN1c3RvbShmYWxzZSk7Ci0JfQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgYXNzY29jaWF0aW9ucyBhcmUgZGVzZXJpYWxpemVkIHRvIGF0dGFjaCAKLQkgKiB0aGUgY3VzdG9taXplciBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQkKLQkJaWYgKG1SZWZlcnJlclJvbGUgIT0gbnVsbCkgewotCQkJbVJlZmVycmVyUm9sZS5yZXN0b3JlKHRoaXMpOwotCQl9Ci0JCWlmIChtUmVmZXJlbmNlZFJvbGUgIT0gbnVsbCkgewotCQkJbVJlZmVyZW5jZWRSb2xlLnJlc3RvcmUodGhpcyk7Ci0JCX0KLQl9Ci0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVycmVyVGFibGUoKSAgewotCQlyZXR1cm4gbUN1c3RvbWl6ZXIuZ2V0VGFibGUobVJlZmVycmVyVGFibGVOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG1SZWZlcnJlclRhYmxlTmFtZTsKLQl9Ci0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpICB7Ci0JCXJldHVybiBtQ3VzdG9taXplci5nZXRUYWJsZShtUmVmZXJlbmNlZFRhYmxlTmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIG1SZWZlcmVuY2VkVGFibGVOYW1lOwotCX0KLQlwdWJsaWMgT1JNR2VuVGFibGUgZ2V0Sm9pblRhYmxlKCkgIHsKLQkJcmV0dXJuIG1DdXN0b21pemVyLmdldFRhYmxlKG1Kb2luVGFibGVOYW1lKTsKLQl9Ci0JcHVibGljIFN0cmluZyBnZXRKb2luVGFibGVOYW1lKCkgewotCQlyZXR1cm4gbUpvaW5UYWJsZU5hbWU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHJlZmVycmVyCi0JICogY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVyQ29sdW1ucygpIHsKLQkJaWYgKG1SZWZlcnJlckNvbHMgPT0gbnVsbCkgewotCQkJT1JNR2VuVGFibGUgcmVmZXJyZXJUYWJsZSA9IGdldFJlZmVycmVyVGFibGUoKTsKLQkJCW1SZWZlcnJlckNvbHMgPSByZWZlcnJlclRhYmxlLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcnJlckNvbE5hbWVzKTsKLQkJfQotCQlyZXR1cm4gbVJlZmVycmVyQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVycmVyQ29sTmFtZXM7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPk9STUdlbkNvbHVtbjwvY29kZT4gb2JqZWN0cyBmb3IgdGhlIHJlZmVyZW5jZWQKLQkgKiBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0UmVmZXJlbmNlZENvbHVtbnMoKSB7Ci0JCWlmIChtUmVmZXJlbmNlZENvbHMgPT0gbnVsbCkgewotCQkJbVJlZmVyZW5jZWRDb2xzID0gZ2V0UmVmZXJlbmNlZFRhYmxlKCkuZ2V0Q29sdW1uc0J5TmFtZXMobVJlZmVyZW5jZWRDb2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcmVuY2VkQ29sczsKLQl9Ci0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSB7Ci0JCXJldHVybiBtUmVmZXJlbmNlZENvbE5hbWVzOwotCX0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVySm9pbkNvbHVtbnMoKSB7Ci0JCWlmIChtUmVmZXJyZXJKb2luQ29scyA9PSBudWxsKSB7Ci0JCQltUmVmZXJyZXJKb2luQ29scyA9IGdldEpvaW5UYWJsZSgpLmdldENvbHVtbnNCeU5hbWVzKG1SZWZlcnJlckpvaW5Db2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcnJlckpvaW5Db2xzOwotCX0KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gbVJlZmVycmVySm9pbkNvbE5hbWVzOwotCX0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpICB7Ci0JCWlmIChtUmVmZXJlbmNlZEpvaW5Db2xzID09IG51bGwpIHsKLQkJCW1SZWZlcmVuY2VkSm9pbkNvbHMgPSBnZXRKb2luVGFibGUoKS5nZXRDb2x1bW5zQnlOYW1lcyhtUmVmZXJlbmNlZEpvaW5Db2xOYW1lcyk7Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcmVuY2VkSm9pbkNvbHM7Ci0JfQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpIHsKLQkJcmV0dXJuIG1SZWZlcmVuY2VkSm9pbkNvbE5hbWVzOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiBjYXJkaW5hbGl0eSwgb25lIG9mIHtAbGluayAjTUFOWV9UT19PTkV9fHtAbGluayAjTUFOWV9UT19NQU5ZfQotCSAqIHx7QGxpbmsgI09ORV9UT19PTkV9fHtAbGluayAjT05FX1RPX01BTll9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXJkaW5hbGl0eSgpIHsKLQkJcmV0dXJuIG1DYXJkaW5hbGl0eTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0Q2FyZGluYWxpdHkoU3RyaW5nIGNhcmRpbmFsaXR5KSB7Ci0JCWFzc2VydChjYXJkaW5hbGl0eS5lcXVhbHMoTUFOWV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhNQU5ZX1RPX01BTlkpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhPTkVfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoT05FX1RPX01BTlkpKTsKLQkJbUNhcmRpbmFsaXR5ID0gY2FyZGluYWxpdHk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIGRpcmVjdGlvbmFsaXR5LCBvbmUgb2Yge0BsaW5rICNCSV9ESX18e0BsaW5rICNOT1JNQUxfREl9Ci0JICogfHtAbGluayAjT1BQT1NJVEVfREl9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXJlY3Rpb25hbGl0eSgpIHsKLQkJcmV0dXJuIG1EaXJlY3Rpb25hbGl0eTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RGlyZWN0aW9uYWxpdHkoU3RyaW5nIGRpcikgewotCQlhc3NlcnQoZGlyLmVxdWFscyhCSV9ESSkgfHwgZGlyLmVxdWFscyhOT1JNQUxfREkpIHx8IGRpci5lcXVhbHMoT1BQT1NJVEVfREkpKTsKLQkJaWYgKCFkaXIuZXF1YWxzKG1EaXJlY3Rpb25hbGl0eSkpIHsKLQkJCW1EaXJlY3Rpb25hbGl0eSA9IGRpcjsKLQkJCQotCQkJaWYgKGRpci5lcXVhbHMoTk9STUFMX0RJKSkgewotCQkJCW1SZWZlcmVuY2VkUm9sZSA9IG51bGw7Ci0JCQl9IGVsc2UgaWYgKGRpci5lcXVhbHMoT1BQT1NJVEVfREkpKSB7Ci0JCQkJbVJlZmVycmVyUm9sZSA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGVzdHMgd2hldGhlciB0aGlzIGFzc29jaWF0aW9uIGlzIGJpZGlyZWN0aW9uYWwuCi0JICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvciA8Y29kZT5nZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhCSV9ESSk8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQmlkaXJlY3Rpb25hbCgpIHsKLQkJcmV0dXJuIG1EaXJlY3Rpb25hbGl0eS5lcXVhbHMoQklfREkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgb2YgdGhpcyBhc3NvY2lhdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0dlbmVyYXRlZCgpIHsKLQkJcmV0dXJuIChtRmxhZ3MgJiBHRU5FUkFURUQpICE9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlZChib29sZWFuIGdlbmVyYXRlZCkgewotCQlpZiAoZ2VuZXJhdGVkICE9IGlzR2VuZXJhdGVkKCkpIHsKLQkJCWlmIChnZW5lcmF0ZWQpIHsKLQkJCQltRmxhZ3MgfD0gR0VORVJBVEVEOwotCQkJfSBlbHNlIHsKLQkJCQltRmxhZ3MgJj0gfkdFTkVSQVRFRDsKLQkJCX0KLQkJCW1SZWZlcnJlclJvbGUgPSBtUmVmZXJlbmNlZFJvbGUgPSBudWxsOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGlzIGFzc29jaWF0aW9uIGlzIGN1c3RvbSAoaS5lIGlzIG5vdCBhdXRvIGNvbXB1dGVkIGZyb20gZm9yZWlnbiBrZXlzIHJlbGF0aW9uc2hpcHMpLiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbSgpIHsKLQkJcmV0dXJuIChtRmxhZ3MgJiBDVVNUT00pICE9IDA7Ci0JfQotCXB1YmxpYyB2b2lkIHNldEN1c3RvbShib29sZWFuIGN1c3RvbSkgewotCQlpZiAoY3VzdG9tKSB7Ci0JCQltRmxhZ3MgfD0gQ1VTVE9NOwotCQl9IGVsc2UgewotCQkJbUZsYWdzICY9IH5DVVNUT007Ci0JCX0KLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXNzb2NpYXRpb24gcm9sZSBmb3IgdGhlIHJlZmVycmVyIHNpZGUsIG9yIG51bGwgCi0JICogaWYgbm9uZSAoaS5lIGlmIHRoZSBkaXJlY3Rpb25hbGl0eSBkb2VzIG5vdCBpbmNsdWRlIGl0KS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlIGdldFJlZmVycmVyUm9sZSgpIHsKLQkJaWYgKG1SZWZlcnJlclJvbGUgPT0gbnVsbCAmJiBpc0dlbmVyYXRlZCgpKSB7Ci0JCQlpZiAoIWdldERpcmVjdGlvbmFsaXR5KCkuZXF1YWxzKE9QUE9TSVRFX0RJKSkgeyAvL0JJX0RJIG9yIE5PUk1BTF9ESQotCQkJCW1SZWZlcnJlclJvbGUgPSBuZXcgQXNzb2NpYXRpb25Sb2xlKHRoaXMsIHRydWUvKmlzUmVmZXJyZXJFbmQqLyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1SZWZlcnJlclJvbGU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9uIHJvbGUgZm9yIHRoZSByZWZlcmVuY2VkIHNpZGUsIG9yIG51bGwgCi0JICogaWYgbm9uZSAoaS5lIGlmIHRoZSBkaXJlY3Rpb25hbGl0eSBkb2VzIG5vdCBpbmNsdWRlIGl0KS4KLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25Sb2xlIGdldFJlZmVyZW5jZWRSb2xlKCkgewotCQlpZiAobVJlZmVyZW5jZWRSb2xlID09IG51bGwgJiYgaXNHZW5lcmF0ZWQoKSkgewotCQkJaWYgKCFnZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhBc3NvY2lhdGlvbi5OT1JNQUxfREkpKSB7IC8vQklfREkgb3IgT1BQT1NJVEVfREkKLQkJCQltUmVmZXJlbmNlZFJvbGUgPSBuZXcgQXNzb2NpYXRpb25Sb2xlKHRoaXMsIGZhbHNlLyppc1JlZmVycmVyRW5kKi8pOwotCQkJfQotCQl9Ci0JCXJldHVybiBtUmVmZXJlbmNlZFJvbGU7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgdGhpcyBhc3NvY2lhdGlvbiBpcyB2YWxpZCAodmFsaWQgdGFibGUgYW5kIGNvbHVtbiBuYW1lcykuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZCgpewotCQlpZiAoIWlzVmFsaWRUYWJsZUFuZENvbHVtbnMobVJlZmVycmVyVGFibGVOYW1lLCBtUmVmZXJyZXJDb2xOYW1lcykKLQkJCQl8fCAhaXNWYWxpZFRhYmxlQW5kQ29sdW1ucyhtUmVmZXJlbmNlZFRhYmxlTmFtZSwgbVJlZmVyZW5jZWRDb2xOYW1lcykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAobUpvaW5UYWJsZU5hbWUgIT0gbnVsbCkgewotCQkJaWYgKCFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1Kb2luVGFibGVOYW1lLCBtUmVmZXJyZXJKb2luQ29sTmFtZXMpCi0JCQkJCXx8ICFpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKG1Kb2luVGFibGVOYW1lLCBtUmVmZXJlbmNlZEpvaW5Db2xOYW1lcykpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CQkJCi0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVGFibGVBbmRDb2x1bW5zKFN0cmluZyB0YWJsZU5hbWUsIExpc3Q8U3RyaW5nPiBjb2x1bW5OYW1lcykgewotCQlPUk1HZW5UYWJsZSB0YWJsZSA9IG1DdXN0b21pemVyLmdldFRhYmxlKHRhYmxlTmFtZSk7Ci0JCWlmICh0YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjb2x1bW5OYW1lcy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCVN0cmluZyBjb2xOYW1lID0gKFN0cmluZyljb2x1bW5OYW1lcy5nZXQoaSk7Ci0JCQlpZiAodGFibGUuZ2V0Q29sdW1uQnlOYW1lKGNvbE5hbWUpID09IG51bGwpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEZvcmVpZ25LZXkoRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXRoaXMubUZvcmVpZ25LZXkgPSBmb3JlaWduS2V5OwotCQkKLQl9Ci0JcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpewotCQlyZXR1cm4gdGhpcy5tRm9yZWlnbktleTsKLQl9OwkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiggdGhpcyA9PSBvYmogKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmKCBvYmogaW5zdGFuY2VvZiBBc3NvY2lhdGlvbiApewotCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24yID0gKEFzc29jaWF0aW9uKW9iajsKLQkJCWlmICghdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSkKLQkJCQkJfHwgIXRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpKQotCQkJCQl8fCAhU3RyaW5nVXRpbC5lcXVhbE9iamVjdHModGhpcy5nZXRKb2luVGFibGVOYW1lKCksIGFzc29jaWF0aW9uMi5nZXRKb2luVGFibGVOYW1lKCkpCi0JCQkJCXx8ICF0aGlzLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKSkKLQkJCQkJfHwgIXRoaXMuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKSkKLQkJCQkJKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQkJCQkJCi0JCQkvKnRoZSAyIGFzc29jaWF0aW9uIGhhdmUgdGhlIHNhbWUgcmVmZXJyZXIsIHJlZmVyZW5jZWQgYW5kIGpvaW4gdGFibGUqLwotCQkJLy9JZiBNVE8gb3IgT1RNIGFzc29jaWF0aW9uCi0JCQlpZiAodGhpcy5nZXRKb2luVGFibGVOYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHRoaXMuZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkpCi0JCQkJCSYmIHRoaXMuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5OYW1lcygpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9CQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKXsKLQkJcmV0dXJuIG1SZWZlcnJlclRhYmxlTmFtZSArICIgIiArIG1DYXJkaW5hbGl0eSArICIgIiArIG1SZWZlcmVuY2VkVGFibGVOYW1lIDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb25Sb2xlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvQXNzb2NpYXRpb25Sb2xlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczM2QwZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Fzc29jaWF0aW9uUm9sZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBhc3NvY2lhdGlvbiByb2xlICh0aGUgcmVmZXJyZXIgb3IgcmVmZXJlbmNlZCByb2xlKS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25Sb2xlIGltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUKLXsKLQlwcml2YXRlIHRyYW5zaWVudCBBc3NvY2lhdGlvbiBtQXNzb2NpYXRpb247IC8vdHJhbnNpZW50OiBzZWUgcmVzdG9yZQotCXByaXZhdGUgYm9vbGVhbiBtSXNSZWZlcnJlclJvbGU7Ci0JcHJpdmF0ZSBTdHJpbmcgbVByb3BlcnR5TmFtZTsKLQlwcml2YXRlIFN0cmluZyBtQ2FzY2FkZTsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOwotCQkKLQlBc3NvY2lhdGlvblJvbGUoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24sIGJvb2xlYW4gaXNSZWZlcnJlclJvbGUpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Bc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uOwotCQltSXNSZWZlcnJlclJvbGUgPSBpc1JlZmVycmVyUm9sZTsKLQl9Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IgbmVlZGVkIGJ5IHRoZSBkZXNlcmlhbGl6YXRpb24gKHNob3VsZCBub3QgYmUgdXNlZCBvdGhlcndpc2UpLgotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvblJvbGUoKSB7Ci0JfQotCQotCS8qKgotCSAqIENhbGxlZCBhZnRlciB0aGUgYXNzY29jaWF0aW9ucyBhcmUgZGVzZXJpYWxpemVkIHRvIGF0dGFjaCAKLQkgKiB0aGUgY3VzdG9taXplciBvYmplY3QuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZShBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgewotCQltQXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbjsKLQl9Ci0JCi0JcHVibGljIEFzc29jaWF0aW9uIGdldEFzc29jaWF0aW9uKCkgewotCQlyZXR1cm4gbUFzc29jaWF0aW9uOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlZmVycmVyUm9sZSgpIHsKLQkJcmV0dXJuIG1Jc1JlZmVycmVyUm9sZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb3Bwb3NpdGUgcm9sZSBvciBudWxsIGlmIHRoZSBhc3NvY2lhdGlvbiAKLQkgKiBpcyBub3QgYmkgZGlyZWN0aW9uYWwuCi0JICovCi0JcHVibGljIEFzc29jaWF0aW9uUm9sZSBnZXRPcHBvc2l0ZVJvbGUoKSB7Ci0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gZ2V0QXNzb2NpYXRpb24oKTsKLQkJaWYgKCFhc3NvY2lhdGlvbi5nZXREaXJlY3Rpb25hbGl0eSgpLmVxdWFscyhBc3NvY2lhdGlvbi5CSV9ESSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChpc1JlZmVycmVyUm9sZSgpKSB7Ci0JCQlyZXR1cm4gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhc3NvY2lhdGlvbiBjYXJkaW5hbGl0eSwgb25lIG9mIHtAbGluayAjTUFOWV9UT19PTkV9fHtAbGluayAjTUFOWV9UT19NQU5ZfQotCSAqIHx7QGxpbmsgI09ORV9UT19PTkV9fHtAbGluayAjT05FX1RPX01BTll9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXJkaW5hbGl0eSgpIHsKLQkJU3RyaW5nIHR5cGUgPSBtQXNzb2NpYXRpb24uZ2V0Q2FyZGluYWxpdHkoKTsKLQkJaWYgKCFtSXNSZWZlcnJlclJvbGUpIHsKLQkJCWlmICh0eXBlLmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWSkpIHsKLQkJCQl0eXBlID0gQXNzb2NpYXRpb24uTUFOWV9UT19PTkU7Ci0JCQl9IGVsc2UgaWYgKHR5cGUuZXF1YWxzKEFzc29jaWF0aW9uLk1BTllfVE9fT05FKSkgewotCQkJCXR5cGUgPSBBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVycmVyVGFibGUoKSB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZSgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVyQ29sdW1ucygpewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWZlcnJlciBjb2x1bW4uCi0JICovCi0JcHVibGljIE9STUdlbkNvbHVtbiBnZXRSZWZlcmVuY2VkQ29sdW1uKFN0cmluZyByZWZlcnJlckNvbHVtbikgIHsKLQkJYm9vbGVhbiBoYXNKb2luVGFibGUgPSBtQXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlKCkgIT0gbnVsbDsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJlZmVycmVyQ29sdW1ucyA9IGdldFJlZmVycmVyQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IHJlZmVycmVyQ29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSByZWZlcnJlckNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKHJlZmVycmVyQ29sdW1uKSkgewotCQkJCWlmIChoYXNKb2luVGFibGUpIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVycmVySm9pbkNvbHVtbnMoKS5nZXQoaSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRDb2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnQoZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVmZXJyZXIgY29sdW1uIGNvcnJlc3BvbmRpbmcgdG8gYSByZWZlcmVuY2VkIGNvbHVtbi4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldFJlZmVycmVyQ29sdW1uKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uKSAgewotCQlib29sZWFuIGhhc0pvaW5UYWJsZSA9IG1Bc3NvY2lhdGlvbi5nZXRKb2luVGFibGUoKSAhPSBudWxsOwotCQlMaXN0PE9STUdlbkNvbHVtbj4gcmVmZXJlbmNlZENvbHVtbnMgPSBnZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQlmb3IgKGludCBpID0gMCwgbiA9IHJlZmVyZW5jZWRDb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IHJlZmVyZW5jZWRDb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uZ2V0TmFtZSgpLmVxdWFscyhyZWZlcmVuY2VkQ29sdW1uKSkgewotCQkJCWlmIChoYXNKb2luVGFibGUpIHsKLQkJCQkJcmV0dXJuIGdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpLmdldChpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXR1cm4gZ2V0UmVmZXJyZXJDb2x1bW5zKCkuZ2V0KGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlhc3NlcnQoZmFsc2UpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIE9STUdlblRhYmxlIGdldFJlZmVyZW5jZWRUYWJsZSgpICB7Ci0JCWlmIChtSXNSZWZlcnJlclJvbGUpIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVyZW5jZWRDb2x1bW5zKCkgIHsKLQkJaWYgKG1Jc1JlZmVycmVyUm9sZSkgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFJlZmVycmVySm9pbkNvbHVtbnMoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbnMoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBtQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRSZWZlcmVuY2VkSm9pbkNvbHVtbnMoKSAgewotCQlpZiAobUlzUmVmZXJyZXJSb2xlKSB7Ci0JCQlyZXR1cm4gbUFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1ucygpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG1Bc3NvY2lhdGlvbi5nZXRSZWZlcnJlckpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0b3IgZm9yIAotCSAqIHRoZSBwcm9wZXJ0eSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcm9sZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpICAgewotCQlpZiAobVByb3BlcnR5TmFtZSAhPSBudWxsKSB7IC8vaWYgdGhlIHVzZXIgZXhwbGljaXRseSBzZXQgaXQgdGhlbiBkb24ndCBiZSB0b28gc21hcnQKLQkJCXJldHVybiBtUHJvcGVydHlOYW1lOwotCQl9Ci0JCXJldHVybiBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCk7Ci0JfQotCQkKLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQlTdHJpbmcgcHJvcE5hbWUgPSAiIjsKLQkJT1JNR2VuVGFibGUgcmVmZXJyZXJUYWJsZSA9IGdldFJlZmVycmVyVGFibGUoKTsKLQkJT1JNR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlID0gZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0KLQkJYm9vbGVhbiBpc1Npbmd1bGFyID0gaXNTaW5ndWxhcigpOwotCQlwcm9wTmFtZSA9IHJlZmVyZW5jZWRUYWJsZS5nZXRWYXJOYW1lKGlzU2luZ3VsYXIpOwotCQkKLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IGNsYXNoaW5nUm9sZXMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxBc3NvY2lhdGlvblJvbGU+KCk7IC8vcm9sZXMgd2l0aCBvdXIgc2FtZSByZWZlcnJlciBhbmQgcmVmZXJlbmNlZCB0YWJsZXMgKGkuZSB3b3VsZCB5aWVsZCB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lIGluIHRoZSBzYW1lIGJlYW4pCi0JCS8qbWFrZSBzdXJlIHRoZXJlIGlzIG5vIHJvbGUgd2l0aCB0aGUgc2FtZSBuYW1lLiovCi0JCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb25Sb2xlPiBpdGVyID0gcmVmZXJyZXJUYWJsZS5nZXRBc3NvY2lhdGlvblJvbGVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyb2xlLmdldFJlZmVycmVyVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKHJlZmVycmVyVGFibGUuZ2V0TmFtZSgpKQotCQkJCQkmJiByb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKS5lcXVhbHMocmVmZXJlbmNlZFRhYmxlLmdldE5hbWUoKSkKLQkJCQkJJiYgcm9sZS5pc1Npbmd1bGFyKCkgPT0gaXNTaW5ndWxhcikgewotCQkJCWNsYXNoaW5nUm9sZXMuYWRkKHJvbGUpOwotCQkJfQotCQl9Ci0JCWlmIChjbGFzaGluZ1JvbGVzLnNpemUoKSA+IDEpIHsKLQkJCWludCBpbmRleCA9IGNsYXNoaW5nUm9sZXMuaW5kZXhPZih0aGlzKTsKLQkJCWFzc2VydChpbmRleCA+PSAwKTsKLQkJCXByb3BOYW1lICs9IGluZGV4KzE7Ci0JCX0KLQkJCi0JCS8qbWFrZSBzdXJlIHRoZXJlIGlzIG5vIGNvbHVtbiB3aXRoIHRoZSBzYW1lIG5hbWUuKi8KLQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSByZWZlcnJlclRhYmxlLmdldENvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY29sdW1uLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhwcm9wTmFtZSkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gaXNTaW5ndWxhciA/ICJCZWFuIiA6ICJTZXQiOwotCQkJCXByb3BOYW1lICs9IHByZWZpeDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb3BOYW1lOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNTaW5ndWxhcigpIHsKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gZ2V0Q2FyZGluYWxpdHkoKTsKLQkJcmV0dXJuIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fT05FKSB8fCBjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpOwotCX0KLQkKLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRvciBmb3IgCi0JICogdGhlIHByb3BlcnR5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByb2xlLgotCSAqIElmIHRoZSBhcmd1bWVudCBuYW1lIGlzIG51bGwgb3IgZW1wdHkgc3RyaW5nIHRoZW4gdGhlIAotCSAqIGRlZmF1bHQgY29tcHV0ZWQgbmFtZSBpcyB1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZShTdHJpbmcgbmFtZSkgIHsKLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCW5hbWUgPSBudWxsOwotCQl9Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5lcXVhbHMoZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQkJbVByb3BlcnR5TmFtZSA9IG5hbWU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhc2NhZGUgdmFsdWUgZm9yIHRoaXMgcm9sZS4KLQkgKiBBbiBlbXB0eSBzdHJpbmcgd2lsbCByZXR1cm4gaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhc2NhZGUoKSB7Ci0JCXJldHVybiBtQ2FzY2FkZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2FzY2FkZShTdHJpbmcgY2FzY2FkZSkgewotCQkvLyBpZiBubyBjaGVja2JveCBpcyBzZWxlY3RlZCwgc2V0IGNhc2NhZGUgdG8gYW4gZW1wdHkgc3RyaW5nCi0JCWlmIChjYXNjYWRlICE9IG51bGwgJiYgY2FzY2FkZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQljYXNjYWRlID0gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HOwotCQl9Ci0JCW1DYXNjYWRlID0gY2FzY2FkZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhIGRlc2NyaXB0aXZlIHN0cmluZyB1c2VkIGluIGEgY29tbWVudCBpbiB0aGUgZ2VuZXJhdGVkIAotCSAqIGZpbGUgKGZyb20gdGhlIFZlbG9jaXR5IHRlbXBsYXRlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgIHsKLQkJLy88IS0tICRkaXJlY3Rpb25hbGl0eSAkY2FyZGluYWxpdHkgYXNzb2NpYXRpb24gdG8gJHJlZmVyZW5jZWRDbGFzc05hbWUgLS0+Ci0JCVN0cmluZyBkaXJlY3Rpb25hbGl0eTsKLQkJaWYgKGdldEFzc29jaWF0aW9uKCkuZ2V0RGlyZWN0aW9uYWxpdHkoKS5lcXVhbHMoQXNzb2NpYXRpb24uQklfREkpKSB7Ci0JCQlkaXJlY3Rpb25hbGl0eSA9ICJiaS1kaXJlY3Rpb25hbCI7Ci0JCX0gZWxzZSB7Ci0JCQlkaXJlY3Rpb25hbGl0eSA9ICJ1bmktZGlyZWN0aW9uYWwiOwotCQl9Ci0JCXJldHVybiBkaXJlY3Rpb25hbGl0eSArICIgIiArIGdldEFzc29jaWF0aW9uKCkuZ2V0Q2FyZGluYWxpdHkoKSArICIgYXNzb2NpYXRpb24gdG8gIiArIGdldFJlZmVyZW5jZWRUYWJsZSgpLmdldENsYXNzTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9CYXNlRW50aXR5R2VuQ3VzdG9taXplci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Jhc2VFbnRpdHlHZW5DdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MTlmOTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0Jhc2VFbnRpdHlHZW5DdXN0b21pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuRFRQVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBPUk1HZW5DdXN0b21pemVyIGFjY29yZGluZyB0byBKUEEgc3BlY2lmaWNhdGlvbiBmb3IKLSAqIGVudGl0eSBnZW5lcmF0aW9uLgotICogCi0gKiBUaGlzIGlzIHVzZWQgdG8gcmV0cmlldmUvY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGZyb20gdGhlIHdpemFyZCBhbmQgaXMgYWxzbwotICogcGFzc2VkIGFzIGEgY29udGV4dCBvYmplY3QgdG8gVmVsb2NpdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNlRW50aXR5R2VuQ3VzdG9taXplciBleHRlbmRzIE9STUdlbkN1c3RvbWl6ZXIKLQlpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlCi17Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKLQotCS8qIG1hcHBpbmcga2luZHMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTSUNfTUFQUElOR19LSU5EID0gImJhc2ljIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9NQVBQSU5HX0tJTkQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fTUFQUElOR19LSU5EID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIHRoZSBzdHJpbmdzIGZvciBnZW5lcmF0b3IgbmFtZXMuIFRoZXNlIGFwcGVhciBpbiBhIGNvbWJvIGJveCBhbmQgdXNlZCBieQotCSAqIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSBwcm9jZXNzaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX0dFTkVSQVRPUiA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FX0dFTkVSQVRPUiA9ICJub25lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJREVOVElUWV9HRU5FUkFUT1IgPSAiaWRlbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUiA9ICJzZXF1ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfR0VORVJBVE9SID0gInRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEJhc2VFbnRpdHlHZW5DdXN0b21pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoRmlsZSBmaWxlLCBTY2hlbWEgc2NoZW1hKSB7Ci0JCXN1cGVyLmluaXQoZmlsZSwgc2NoZW1hKTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIC0tLS0tLSBPUk1HZW5DdXN0b21pemVyIG1ldGhvZHMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QWxsSWRHZW5lcmF0b3JzKCkgewotCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPig1KTsKLQkJLyogYWRkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdvdWxkIGFwcGVhciBpbiB0aGUgY29tYm8gKi8KLQkJcmVzdWx0LmFkZChBVVRPX0dFTkVSQVRPUik7Ci0JCXJlc3VsdC5hZGQoSURFTlRJVFlfR0VORVJBVE9SKTsKLQkJcmVzdWx0LmFkZChTRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlyZXN1bHQuYWRkKFRBQkxFX0dFTkVSQVRPUik7Ci0JCXJlc3VsdC5hZGQoTk9ORV9HRU5FUkFUT1IpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9JZEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIE5PTkVfR0VORVJBVE9SOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRlbnRpdHlJZEdlbmVyYXRvcigpIHsKLQkJcmV0dXJuIElERU5USVRZX0dFTkVSQVRPUjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0U2VxdWVuY2VJZEdlbmVyYXRvcnMoKSB7Ci0JCVNldDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuSGFzaFNldDxTdHJpbmc+KDMpOwotCQlyZXN1bHQuYWRkKFNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVR5cGVGcm9tQ29sdW1uKENvbHVtbiBjb2x1bW4pIHsKLQkJcmV0dXJuIERUUFV0aWwuZ2V0SmF2YVR5cGUoY29sdW1uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWxsUHJvcGVydHlUeXBlcygpIHsKLQkJLyoKLQkJICogSmF2YSBwcmltaXRpdmUgdHlwZXMsIHdyYXBwZXIgb2YgdGhlIHByaW1pdGl2ZSB0eXBlcyAsCi0JCSAqIGphdmEubGFuZy5TdHJpbmcsIGphdmEubWF0aC5CaWdJbnRlZ2VyLCBqYXZhLm1hdGguQmlnRGVjaW1hbCwKLQkJICogamF2YS51dGlsLkRhdGUsIGphdmEudXRpbC5DYWxlbmRhciwgamF2YS5zcWwuRGF0ZSwgamF2YS5zcWwuVGltZSwKLQkJICogamF2YS5zcWwuVGltZXN0YW1wLCBieXRlW10sIEJ5dGVbXSwgY2hhcltdLCBDaGFyYWN0ZXJbXSwgZW51bXMsIGFuZAotCQkgKiBhbnkgb3RoZXIgdHlwZSB0aGF0IGltcGxlbWVudHMgU2VyaWFsaXphYmxlLgotCQkgKi8KLQkJLy8gcmV0dXJuIGluIHRoZSBvcmRlciB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgY29tYm8KLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQkiYm9vbGVhbiIsCi0JCQkiQm9vbGVhbiIsCi0JCQkiYnl0ZSIsCi0JCQkiQnl0ZSIsCi0JCQkiYnl0ZVtdIiwKLQkJCSJjaGFyIiwKLQkJCSJjaGFyW10iLAotCQkJIkNoYXJhY3RlciIsCi0JCQkiQ2hhcmFjdGVyW10iLAotCQkJImRvdWJsZSIsCi0JCQkiRG91YmxlIiwKLQkJCSJmbG9hdCIsCi0JCQkiRmxvYXQiLAotCQkJImludCIsCi0JCQkiSW50ZWdlciIsCi0JCQkibG9uZyIsCi0JCQkiTG9uZyIsCi0JCQkiT2JqZWN0IiwKLQkJCSJzaG9ydCIsCi0JCQkiU2hvcnQiLAotCQkJIlN0cmluZyIsCi0JCQlqYXZhLm1hdGguQmlnRGVjaW1hbC5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLm1hdGguQmlnSW50ZWdlci5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnV0aWwuQ2FsZW5kYXIuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS51dGlsLkRhdGUuY2xhc3MuZ2V0TmFtZSgpLAotCQkJamF2YS5zcWwuRGF0ZS5jbGFzcy5nZXROYW1lKCksCi0JCQlqYXZhLnNxbC5UaW1lLmNsYXNzLmdldE5hbWUoKSwKLQkJCWphdmEuc3FsLlRpbWVzdGFtcC5jbGFzcy5nZXROYW1lKCkKLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0QWxsTWFwcGluZ0tpbmRzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCUJBU0lDX01BUFBJTkdfS0lORCwgSURfTUFQUElOR19LSU5ELCBWRVJTSU9OX01BUFBJTkdfS0lORAotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzaWNNYXBwaW5nS2luZCgpIHsKLQkJcmV0dXJuIEJBU0lDX01BUFBJTkdfS0lORDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldElkTWFwcGluZ0tpbmQoKSB7Ci0JCXJldHVybiBJRF9NQVBQSU5HX0tJTkQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZWRpdENhc2NhZGUoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIG1hbnlTaWRlSXNBc3NvY2lhdGlvbk93bmVyKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vIC0tLS0gVmVsb2NpdHkgdGVtcGxhdGVzIG1ldGhvZHMKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhc2NhZGVzIGFubm90YXRpb24gbWVtYmVyIHZhbHVlLCBvciBlbXB0eSBzdHJpbmcgaWYgbm9uZS4KLQkgKiBFbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBudWxsIGJlY2F1c2UgVmVsb2NpdHkgZG9lcyBub3QgbGlrZQotCSAqIG51bGwgd2hlbiB1c2VkIGluICNzZXQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5DYXNjYWRlcyhBc3NvY2lhdGlvblJvbGUgcm9sZSkgewotCQlMaXN0PFN0cmluZz4gY2FzY2FkZXMgPSBTdHJpbmdVdGlsLnN0clRvTGlzdChyb2xlLmdldENhc2NhZGUoKSwgJywnLCB0cnVlLyogdHJpbSAqLyk7Ci0JCWlmIChjYXNjYWRlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCAneycgKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjYXNjYWRlcy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCVN0cmluZyBjYXNjYWRlID0gY2FzY2FkZXMuZ2V0KGkpOwotCQkJU3RyaW5nIGVudW1TdHI7Ci0JCQlpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuQUxMX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5BTEwiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChjYXNjYWRlLmVxdWFscyhUYWdOYW1lcy5QRVJTSVNUX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5QRVJTSVNUIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuTUVSR0VfQ0FTQ0FERSkpIHsKLQkJCQllbnVtU3RyID0gIkNhc2NhZGVUeXBlLk1FUkdFIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoY2FzY2FkZS5lcXVhbHMoVGFnTmFtZXMuUkVNT1ZFX0NBU0NBREUpKSB7Ci0JCQkJZW51bVN0ciA9ICJDYXNjYWRlVHlwZS5SRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhc3NlcnQgKGNhc2NhZGUuZXF1YWxzKFRhZ05hbWVzLlJFRlJFU0hfQ0FTQ0FERSkpOwotCQkJCWVudW1TdHIgPSAiQ2FzY2FkZVR5cGUuUkVGUkVTSCI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWlmIChpICE9IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKCIsICIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKGVudW1TdHIpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZldGNoIHR5cGUgYW5ub3RhdGlvbiBtZW1iZXIgdmFsdWUsIG9yIGVtcHR5IHN0cmluZyBpZiBub25lLgotCSAqIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpbnN0ZWFkIG9mIG51bGwgYmVjYXVzZSBWZWxvY2l0eSBkb2VzIG5vdCBsaWtlCi0JICogbnVsbCB3aGVuIHVzZWQgaW4gI3NldC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdlbkZldGNoKE9STUdlblRhYmxlIHRhYmxlKSB7Ci0JCVN0cmluZyBmZXRjaCA9IHRhYmxlLmdldERlZmF1bHRGZXRjaCgpOwotCQlpZiAoZmV0Y2ggPT0gbnVsbCB8fCBPUk1HZW5UYWJsZS5ERUZBVUxUX0ZFVENILmVxdWFscyhmZXRjaCkpIHsKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGZldGNoLmVxdWFscyhPUk1HZW5UYWJsZS5MQVpZX0ZFVENIKSkgewotCQkJcmV0dXJuICJGZXRjaFR5cGUuTEFaWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiRmV0Y2hUeXBlLkVBR0VSIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0RhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwMTQyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLQotLyoqCi0gKiBQcm92aWRlIGEgcGx1Z2dhYmxlIHdheSB0byBkZXRlcm1pbmUgd2hldGhlciBhbmQgaG93IHRoZSBlbnRpdHkgZ2VuZXJhdG9yCi0gKiBwcmludHMgdGhlIG5hbWVzIG9mIHZhcmlvdXMgZGF0YWJhc2Ugb2JqZWN0cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciB7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBlbnRpdHkgYW5kIHRoZSB0YWJsZSB0byB3aGljaCBpdCBpcyBtYXBwZWQsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGVudGl0eSdzCi0JICogVGFibGUgYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgZW50aXR5Ci0JICogbWFwcyB0byB0aGUgdGFibGUgYnkgZGVmYXVsdC4KLQkgKi8KLQlTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSk7Ci0KLQkvKioKLQkgKiBHaXZlbiB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgKGZpZWxkIG9yIHByb3BlcnR5KSBhbmQgdGhlIGNvbHVtbgotCSAqIHRvIHdoaWNoIGl0IGlzIG1hcHBlZCwKLQkgKiBidWlsZCBhbmQgcmV0dXJuIGEgc3RyaW5nIHRvIGJlIHVzZWQgYXMgdGhlIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlJ3MKLQkgKiBDb2x1bW4gYW5ub3RhdGlvbidzICduYW1lJyBlbGVtZW50LiBSZXR1cm4gbnVsbCBpZiB0aGUgYXR0cmlidXRlCi0JICogbWFwcyB0byB0aGUgY29sdW1uIGJ5IGRlZmF1bHQuCi0JICovCi0JU3RyaW5nIGJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIENvbHVtbiBjb2x1bW4pOwotCi0JLyoqCi0JICogR2l2ZW4gdGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIChmaWVsZCBvciBwcm9wZXJ0eSkgYW5kIHRoZQotCSAqIG1hbnktdG8tb25lIG9yIG1hbnktdG8tbWFueSBmb3JlaWduIGtleSB0byB3aGljaCBpdCBpcyBtYXBwZWQsCi0JICogYnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSdzCi0JICogSm9pbkNvbHVtbiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuIFJldHVybiBudWxsIGlmIHRoZSBhdHRyaWJ1dGUKLQkgKiBtYXBzIHRvIHRoZSBqb2luIGNvbHVtbiBieSBkZWZhdWx0LgotCSAqIFRoZSBzcGVjaWZpZWQgZm9yZWlnbiBrZXkgY29uc2lzdHMgb2YgYSBzaW5nbGUgY29sdW1uIHBhaXIgd2hvc2UKLQkgKiByZWZlcmVuY2VkIGNvbHVtbiBpcyB0aGUgc2luZ2xlLWNvbHVtbiBwcmltYXJ5IGtleSBvZiB0aGUgZm9yZWlnbgotCSAqIGtleSdzIHJlZmVyZW5jZWQgdGFibGUuCi0JICovCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgYSBKb2luQ29sdW1uCi0JICogYW5ub3RhdGlvbidzICduYW1lJyBvciAncmVmZXJlbmNlZENvbHVtbk5hbWUnIGVsZW1lbnQuCi0JICogVGhpcyBpcyBjYWxsZWQgZm9yIG1hbnktdG8tb25lIGFuZCBtYW55LXRvLW1hbnkgbWFwcGluZ3Mgd2hlbgotCSAqIHRoZSBkZWZhdWx0IGpvaW4gY29sdW1uIG5hbWUgYW5kL29yIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgYXJlL2lzCi0JICogbm90IGFwcGxpY2FibGUuCi0JICogQHNlZSBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcsIEZvcmVpZ25LZXkpCi0JICovCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKENvbHVtbiBjb2x1bW4pOwotCi0JLyoqCi0JICogQnVpbGQgYW5kIHJldHVybiBhIHN0cmluZyB0byBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgYSBKb2luVGFibGUKLQkgKiBhbm5vdGF0aW9uJ3MgJ25hbWUnIGVsZW1lbnQuCi0JICogVGhpcyBpcyBjYWxsZWQgZm9yIG1hbnktdG8tbWFueSBtYXBwaW5ncyB3aGVuIHRoZSBkZWZhdWx0Ci0JICogam9pbiB0YWJsZSBuYW1lIGlzIG5vdCBhcHBsaWNhYmxlLgotCSAqLwotCVN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKTsKLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2ltcGxlIHJldHVybnMgdGhlIGRhdGFiYXNlIG9iamVjdCdzIG5hbWUsCi0JICogdW5hbHRlcmVkLgotCSAqLwotCWZpbmFsIGNsYXNzIERlZmF1bHQgaW1wbGVtZW50cyBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgSU5TVEFOQ0UgPSBuZXcgRGVmYXVsdCgpOwotCQlwdWJsaWMgc3RhdGljIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBEZWZhdWx0KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkVGFibGVBbm5vdGF0aW9uTmFtZShTdHJpbmcgZW50aXR5TmFtZSwgVGFibGUgdGFibGUpIHsKLQkJCXJldHVybiB0YWJsZS5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZENvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBDb2x1bW4gY29sdW1uKSB7Ci0JCQlyZXR1cm4gY29sdW1uLmdldE5hbWUoKTsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJCXJldHVybiBmb3JlaWduS2V5LmdldENvbHVtblBhaXIoKS5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIGNvbHVtbi5nZXROYW1lKCk7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gdGFibGUuZ2V0TmFtZSgpOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlci5EZWZhdWx0IjsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0pwdEdlbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvSnB0R2VuTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYwNzNiYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvSnB0R2VuTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgZW50aXR5IGdlbmVyYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRHZW5NZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQYWNrYWdlR2VuZXJhdG9yX3Rhc2tOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlblNjb3BlX3Rhc2tOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYXRvcl90YXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wbGF0ZXNfbm90Rm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JfR2VuZXJhdGluZ19FbnRpdGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWxldGVfRm9sZGVyX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZV9GaWxlX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVfUmVhZF9Pbmx5X0Vycm9yOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF9nZW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0R2VuTWVzc2FnZXMuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcHRHZW5NZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvSnB0SnBhR2VuUGx1Z2luLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvSnB0SnBhR2VuUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OTY0NWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL0pwdEpwYUdlblBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRKcGFHZW5QbHVnaW4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLmdlbiI7Ci0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbiAoIFN0cmluZyBtc2csIFRocm93YWJsZSBlICkgewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCUlMb2cgbG9nID0gUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSk7Ci0JCWxvZy5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1zZywgZSApKTsJCQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKCBDb3JlRXhjZXB0aW9uIGNlICkgewotCQlJU3RhdHVzIHN0YXR1cyA9IGNlLmdldFN0YXR1cygpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCUlMb2cgbG9nID0gUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSk7Ci0JCWxvZy5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIHN0YXR1cy5nZXRNZXNzYWdlKCksIGNlKSk7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvT1JNR2VuQ29sdW1uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvT1JNR2VuQ29sdW1uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZWQwNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL09STUdlbkNvbHVtbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5FbnRpdHlHZW5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLQotLyoqCi0gKiBSZXByZXNlbnRzIHRoZSBPUk0gZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzIGZvciBhIGRhdGFiYXNlIAotICogY29sdW1uLgotICogCi0gKiA8cD5UaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNyZWF0ZWQvY2hhbmdlZCBieSB0aGUgZ2VuZXJhdGlvbiB3aXphcmQsCi0gKiBhbmQgZ2VuZXJhdGVkIHVzaW5nIFZlbG9jaXR5IHRlbXBsYXRlcy4KLSAqIFRoZSBtb2RpZmllZCBwcm9wZXJ0aWVzIChpZiBhbnkpIGFyZSBwZXJzaXN0ZWQvcmV0cmlldmVkIHVzaW5nIAotICogPGNvZGU+T1JNR2VuQ3VzdG9taXplcjwvY29kZT4uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE9STUdlbkNvbHVtbgotewotCXByaXZhdGUgVGFibGUgbVRhYmxlOwotCXByaXZhdGUgQ29sdW1uIG1EYkNvbHVtbjsKLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgbUN1c3RvbWl6ZXI7Ci0JcHJpdmF0ZSBPUk1HZW5UYWJsZSBtR2VuVGFibGU7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEpBVkFfTEFOR19QQUNLQUdFID0gImphdmEubGFuZy4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIE9STUdlbkNvbHVtbihDb2x1bW4gZGJDb2x1bW4sIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcikgewotCQlzdXBlcigpOwotCQkKLQkJbURiQ29sdW1uID0gZGJDb2x1bW47Ci0JCW1DdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJbVRhYmxlID0gZGJDb2x1bW4uZ2V0VGFibGUoKTsKLQl9Ci0JCi0JcHVibGljIE9STUdlbkN1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIG1DdXN0b21pemVyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRHZW5UYWJsZShPUk1HZW5UYWJsZSBvcm1HZW5UYWJsZSkgewotCQltR2VuVGFibGUgPSBvcm1HZW5UYWJsZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBjdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5KHByb3BOYW1lLCBtVGFibGUuZ2V0TmFtZSgpLCBnZXREYk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgbVRhYmxlLmdldE5hbWUoKSwgZ2V0RGJOYW1lKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQlnZXRDdXN0b21pemVyKCkuc2V0UHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBtVGFibGUuZ2V0TmFtZSgpLCBnZXREYk5hbWUoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSB2YWx1ZSkgewotCQkJc2V0Q3VzdG9taXplZChwcm9wTmFtZSwgbnVsbCk7IC8vcmVtb3ZlIHRoZSBwcm9wZXJ0eQotCQl9IGVsc2UgewotCQkJZ2V0Q3VzdG9taXplcigpLnNldEJvb2xlYW5Qcm9wZXJ0eShwcm9wTmFtZSwgdmFsdWUsIG1UYWJsZS5nZXROYW1lKCksIGdldERiTmFtZSgpKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb2x1bW4gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCWJ1aWxkQ29sdW1uQW5ub3RhdGlvbk5hbWUobURiQ29sdW1uLmdldE5hbWUoKSwgbURiQ29sdW1uKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lICE9IG51bGwgPyBhbm5vdGF0aW9uTmFtZSA6IG1EYkNvbHVtbi5nZXROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0RGJOYW1lKCkgewotCQlyZXR1cm4gbURiQ29sdW1uLmdldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEpvaW5Db2x1bW5OYW1lKCl7Ci0JCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IHRoaXMubUN1c3RvbWl6ZXIuZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKS4KLQkJCWJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKG1EYkNvbHVtbik7Ci0JCXJldHVybiBhbm5vdGF0aW9uTmFtZSAhPSBudWxsID8gYW5ub3RhdGlvbk5hbWUgOiBtRGJDb2x1bW4uZ2V0TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uIGdldERiQ29sdW1uKCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW47Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBiZWFuIHByb3BlcnR5IG5hbWUgZm9yIHRoZSBnaXZlbiBjb2x1bW4uCi0JICogRG9lcyBub3QgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gY3VzdG9taXplZChQUk9QRVJUWV9OQU1FKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJLy9uYW1lID0gU3RyaW5nVXRpbC5jb2x1bW5OYW1lVG9WYXJOYW1lKGdldE5hbWUoKSk7Ci0JCQluYW1lID0gRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZShnZXREYk5hbWUoKSwgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWlmICghU3RyaW5nVXRpbC5lcXVhbE9iamVjdHMobmFtZSwgZ2V0UHJvcGVydHlOYW1lKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKFBST1BFUlRZX05BTUUsIG5hbWUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgbmFtZSBlbGVtZW50IGluIHRoZSBAQ29sdW1uIGlzIGRlZmF1bHQKLQkgKiBzbyB3ZSBjYW4gc2tpcCBnZW5lcmF0aW5nIHRoZSBhbm5vdGF0aW9uCi0JICogCi0JICogQHJldHVybiB0cnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCl7Ci0JCXJldHVybiBpc0RlZmF1bHRuYW1lKCkgJiYgaXNVcGRhdGVhYmxlKCkgJiYgaXNJbnNlcnRhYmxlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgbmFtZSBlbGVtZW50IGluIHRoZSBAQ29sdW1uIGlzIGRlZmF1bHQKLQkgKiBzbyB3ZSBjYW4gc2tpcCBnZW5lcmF0aW5nIHRoZSBhbm5vdGF0aW9uCi0JICogCi0JICogQHJldHVybiB0cnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0bmFtZSgpewotCQlTdHJpbmcgcHJvcE5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUoKTsKLS8vCQlTdHJpbmcgZGJDb2x1bW5OYW1lID0gZ2V0TmFtZSgpOwotLy8JCXJldHVybiBwcm9wTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCBkYkNvbHVtbk5hbWUgKTsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gdGhpcy5tQ3VzdG9taXplci5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLgotCQkJYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShwcm9wTmFtZSwgdGhpcy5tRGJDb2x1bW4gKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lPT1udWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgbmFtZSBlbGVtZW50IGluIHRoZSBAQ29sdW1uIGlzIGRlZmF1bHQKLQkgKiBzbyB3ZSBjYW4gc2tpcCBnZW5lcmF0aW5nIHRoZSBhbm5vdGF0aW9uCi0JICogCi0JICogQHJldHVybiB0cnVlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0Sm9pbkNvbHVtbk5hbWUoU3RyaW5nIGFzc29jaWF0aW9uUm9sZVByb3BOYW1lKXsKLQkJaWYoICF0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJdGVyYWJsZTxGb3JlaWduS2V5PiBpdCA9IG1EYkNvbHVtbi5nZXRUYWJsZSgpLmdldEZvcmVpZ25LZXlzKCk7Ci0JCUl0ZXJhdG9yPEZvcmVpZ25LZXk+IGkgPSBpdC5pdGVyYXRvcigpOwotCQl3aGlsZSggaS5oYXNOZXh0KCkgKXsKLQkJCUZvcmVpZ25LZXkgZmsgPSBpLm5leHQoKTsKLQkJCUNvbHVtbiBjID0gZmsuZ2V0QmFzZUNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCWlmKCBjLmVxdWFscyggdGhpcy5tRGJDb2x1bW4gKSApewotCQkJCXRyeXsKLQkJCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gdGhpcy5tQ3VzdG9taXplci5nZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpLgotCQkJCQkJYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoYXNzb2NpYXRpb25Sb2xlUHJvcE5hbWUsIGZrICk7Ci0JCQkJCXJldHVybiBhbm5vdGF0aW9uTmFtZT09bnVsbDsKLQkJCQl9Y2F0Y2goRXhjZXB0aW9uIGUpewotCQkJCQkvL2NhdGNoIHRoZSBjYXNlIHRoYXQgcmVmZXJlbmNlZCB0YWJsZSBoYXMgbXVsdGlwbGUgcHJpbWFyeSBrZXkgY29sdW1ucwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1uIHR5cGUuCi0JICogRG9lcyBub3QgcmV0dXJuIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVR5cGUoKSAgewotCQlTdHJpbmcgdHlwZSA9IGN1c3RvbWl6ZWQoUFJPUEVSVFlfVFlQRSk7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBnZXRDdXN0b21pemVyKCkuZ2V0UHJvcGVydHlUeXBlRnJvbUNvbHVtbiggdGhpcy5tRGJDb2x1bW4gKTsKLQkJfQotCQlpZiggdHlwZS5zdGFydHNXaXRoKEpBVkFfTEFOR19QQUNLQUdFKSApIHsKLQkJCXR5cGUgPSB0eXBlLnN1YnN0cmluZyggSkFWQV9MQU5HX1BBQ0tBR0UubGVuZ3RoKCkgKTsKLQkJfQotCQlpZiggdHlwZS5lcXVhbHMoImphdmEuc3FsLkRhdGUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXR5cGUgPSAiamF2YS51dGlsLkRhdGUiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJCQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGVQcm9wZXJ0eVR5cGUoKSAgewotCQlyZXR1cm4gbUdlblRhYmxlLmdldFNpbXBsaWZpZWRDb2xUeXBlKCBnZXRQcm9wZXJ0eVR5cGUoKSApOwotCX0JCi0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlUeXBlKFN0cmluZyB0eXBlKSAgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHR5cGUsIGdldFByb3BlcnR5VHlwZSgpKSkgewotCQkJc2V0Q3VzdG9taXplZChQUk9QRVJUWV9UWVBFLCB0eXBlKTsKLQkJfQotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbHVtbiB0eXBlIGlzIG51bWVyaWMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOdW1lcmljKCkgewotCQlib29sZWFuIHJldCA9IHRoaXMubURiQ29sdW1uLmlzTnVtZXJpYygpOwotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtYXBwaW5nIGtpbmQsIG9uZSBvZiB7QGxpbmsgI1BST1BFUlRZX01BUFBJTkdfS0lORH18e0BsaW5rICNJRF9NQVBQSU5HX0tJTkR9Ci0JICogfHtAbGluayAjVkVSU0lPTl9NQVBQSU5HX0tJTkR9fHtAbGluayAjVElNRVNUQU1QX01BUFBJTkdfS0lORH0uCi0JICogCi0JICogVGhpcyBtZXRob2QgZG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvIGJhc2ljIHByb3BlcnR5IHR5cGUpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tpbmQoKSB7Ci0JCVN0cmluZyBraW5kID0gY3VzdG9taXplZChNQVBQSU5HX0tJTkQpOwotCQlpZiAoa2luZCA9PSBudWxsKSB7Ci0JCQlraW5kID0gZ2V0Q3VzdG9taXplcigpLmdldEJhc2ljTWFwcGluZ0tpbmQoKTsKLQkJCQotCQkJaWYgKCB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSAKLQkJCQkgJiYgdGhpcy5tRGJDb2x1bW4uZ2V0VGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA9PSAxKSB7Ci0JCQkJa2luZCA9IGdldEN1c3RvbWl6ZXIoKS5nZXRJZE1hcHBpbmdLaW5kKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldE1hcHBpbmdLaW5kKFN0cmluZyBtYXBwaW5nS2luZCkgIHsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhtYXBwaW5nS2luZCwgZ2V0TWFwcGluZ0tpbmQoKSkpIHsKLQkJCXNldEN1c3RvbWl6ZWQoTUFQUElOR19LSU5ELCBtYXBwaW5nS2luZCk7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzTnVsbGFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNpemUoKSB7Ci0JCWlmICggdGhpcy5tRGJDb2x1bW4uaXNOdW1lcmljKCkpewotCQkJcmV0dXJuIG1EYkNvbHVtbi5nZXRQcmVjaXNpb24oKTsKLQkJfQotCQlyZXR1cm4gbURiQ29sdW1uLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RGVjaW1hbERpZ2l0cygpIHsKLQkJaWYgKCB0aGlzLm1EYkNvbHVtbi5pc051bWVyaWMoKSApewotCQkJcmV0dXJuIG1EYkNvbHVtbi5nZXRTY2FsZSgpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNQcmltYXJ5S2V5KCkgewotCQlyZXR1cm4gdGhpcy5tRGJDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzUGFydE9mQ29tcG9zaXRlUHJpbWFyeUtleSgpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpICYmCi0JCQkJdGhpcy5tVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkgPiAxOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcmVpZ25LZXkoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLm1EYkNvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChQUk9QRVJUWV9ERVNDKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNEYXRhVHlwZUxPQigpIHsKLQkJcmV0dXJuIHRoaXMubURiQ29sdW1uLmlzTE9CKCk7Ci0JfQkKLQotCXB1YmxpYyBib29sZWFuIGlzTmVlZE1hcFRlbXBvcmFsVHlwZSgpIHsKLQkJU3RyaW5nIHByb3BlcnR5VHlwZSA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKCk7Ci0JCXJldHVybiAoIHByb3BlcnR5VHlwZS5lcXVhbHMoImphdmEudXRpbC5EYXRlIikgfHwgcHJvcGVydHlUeXBlLmVxdWFscygiamF2YS51dGlsLkNhbGVuZGFyIikgKTsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRUZW1wb3JhbFR5cGUoKSB7Ci0JCVN0cmluZyBkZWZhdWx0VHlwZSA9IGdldEN1c3RvbWl6ZXIoKS5nZXRQcm9wZXJ0eVR5cGVGcm9tQ29sdW1uKCB0aGlzLm1EYkNvbHVtbiApOwotCQlpZiggZGVmYXVsdFR5cGUuZXF1YWxzKCJqYXZhLnNxbC5EYXRlIikpeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIkRBVEUiOyAvLyROT04tTkxTLTEkCi0JCX1lbHNlIGlmKCBkZWZhdWx0VHlwZS5lcXVhbHMoImphdmEuc3FsLlRpbWUiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAiVElNRSI7IC8vJE5PTi1OTFMtMSQKLQkJfWVsc2UgewotCQkJcmV0dXJuICJUSU1FU1RBTVAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9CQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBwcm9wZXJ0eSBnZXR0ZXIgc2NvcGUsIG9uZSBvZiB7QGxpbmsgI1BVQkxJQ19TQ09QRX18e0BsaW5rICNQUk9URUNURURfU0NPUEV9Ci0JICogfHtAbGluayAjUFJJVkFURV9TQ09QRX0uCi0JICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwdWJsaWMpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlHZXRTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChQUk9QRVJUWV9HRVRfU0NPUEUpOwotCQlpZiAoc2NvcGUgPT0gbnVsbCkgewotCQkJc2NvcGUgPSBQVUJMSUNfU0NPUEU7Ci0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUdldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHNjb3BlLCBnZXRQcm9wZXJ0eUdldFNjb3BlKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKFBST1BFUlRZX0dFVF9TQ09QRSwgc2NvcGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBwcm9wZXJ0eSBzZXR0ZXIgc2NvcGUsIG9uZSBvZiB7QGxpbmsgI1BVQkxJQ19TQ09QRX18e0BsaW5rICNQUk9URUNURURfU0NPUEV9Ci0JICogfHtAbGluayAjUFJJVkFURV9TQ09QRX0uCi0JICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwdWJsaWMpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlTZXRTY29wZSgpIHsKLQkJU3RyaW5nIHNjb3BlID0gY3VzdG9taXplZChQUk9QRVJUWV9TRVRfU0NPUEUpOwotCQlpZiAoc2NvcGUgPT0gbnVsbCkgewotCQkJc2NvcGUgPSBQVUJMSUNfU0NPUEU7Ci0JCX0KLQkJcmV0dXJuIHNjb3BlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHNjb3BlLCBnZXRQcm9wZXJ0eVNldFNjb3BlKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKFBST1BFUlRZX1NFVF9TQ09QRSwgc2NvcGUpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGdlbmVyYXRlZCBmaWVsZCBtZW1iZXIgc2NvcGUsIG9uZSBvZiB7QGxpbmsgI1BVQkxJQ19TQ09QRX18e0BsaW5rICNQUk9URUNURURfU0NPUEV9Ci0JICogfHtAbGluayAjUFJJVkFURV9TQ09QRX0uCi0JICogVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyBudWxsIChkZWZhdWx0cyB0byBwcml2YXRlKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpZWxkU2NvcGUoKSB7Ci0JCVN0cmluZyBzY29wZSA9IGN1c3RvbWl6ZWQoRklFTERfU0NPUEUpOwotCQlpZiAoc2NvcGUgPT0gbnVsbCkgewotCQkJc2NvcGUgPSBQUklWQVRFX1NDT1BFOwotCQl9Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29sdW1uIHNob3VsZCBiZSB1c2VkIGluIHRoZSAKLQkgKiA8Y29kZT5lcXVhbHM8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUluRXF1YWxzKCkgIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWRCb29sZWFuKFVTRV9JTl9FUVVBTFMpIHx8IGlzUHJpbWFyeUtleSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRVc2VJbkVxdWFscyhib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKFVTRV9JTl9FUVVBTFMsIHZhbHVlLCBmYWxzZSk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbHVtbiBzaG91bGQgYmUgdXNlZCBpbiB0aGUgCi0JICogPGNvZGU+dG9TdHJpbmc8L2NvZGU+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VzZUluVG9TdHJpbmcoKSAgewotCQlyZXR1cm4gY3VzdG9taXplZEJvb2xlYW4oVVNFX0lOX1RPX1NUUklORykgfHwgaXNQcmltYXJ5S2V5KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVzZUluVG9TdHJpbmcoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihVU0VfSU5fVE9fU1RSSU5HLCB2YWx1ZSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWFibGUoKSB7Ci0JCXJldHVybiAhImZhbHNlIi5lcXVhbHMoY3VzdG9taXplZChVUERBVEVBQkxFKSk7IC8vZGVmYXVsdHMgdG8gdHJ1ZSAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZWFibGUoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihVUERBVEVBQkxFLCB2YWx1ZSwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzSW5zZXJ0YWJsZSgpIHsKLQkJcmV0dXJuICEiZmFsc2UiLmVxdWFscyhjdXN0b21pemVkKElOU0VSVEFCTEUpKTsgLy9kZWZhdWx0cyB0byB0cnVlIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShib29sZWFuIHZhbHVlKSB7Ci0JCXNldEN1c3RvbWl6ZWRCb29sZWFuKElOU0VSVEFCTEUsIHZhbHVlLCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZWQoKSB7Ci0JCXJldHVybiAhImZhbHNlIi5lcXVhbHMoY3VzdG9taXplZChHRU5FUkFURUQpKTsgLy9kZWZhdWx0cyB0byB0cnVlIC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0R2VuZXJhdGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oR0VORVJBVEVELCB2YWx1ZSwgdHJ1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAibmFtZT0iICsgZ2V0TmFtZSgpICsgIjsgdHlwZT0iICsgZ2V0UHJvcGVydHlUeXBlKCkgOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JfQotCi0JLypnZXQvc2V0IGFuZCBmaWVsZCBzY29wZXMqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19TQ09QRSA9ICJwdWJsaWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVEVDVEVEX1NDT1BFID0gInByb3RlY3RlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklWQVRFX1NDT1BFID0gInByaXZhdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKmN1c3RvbWl6YXRpb24gcHJvcGVydGllcyovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05BTUUgPSAicHJvcGVydHlOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RZUEUgPSAicHJvcGVydHlUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfS0lORCA9ICJtYXBwaW5nS2luZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVTQyA9ICJwcm9wZXJ0eURlc2MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0dFVF9TQ09QRSA9ICJwcm9wZXJ0eUdldFNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TRVRfU0NPUEUgPSAicHJvcGVydHlTZXRTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfU0NPUEUgPSAiZmllbGRTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0lOX0VRVUFMUyA9ICJ1c2VJbkVxdWFscyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0lOX1RPX1NUUklORyA9ICJ1c2VJblRvU3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVBQkxFID0gInVwZGF0ZWFibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVEFCTEUgPSAiaW5zZXJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEID0gImdlblByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL09STUdlbkN1c3RvbWl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PUk1HZW5DdXN0b21pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzUzZDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL09STUdlbkN1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5EVFBVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5Gb3JlaWduS2V5SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogQ29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gY3VzdG9taXplIHRoZSBkYXRhYmFzZSBzY2hlbWEgdG8gT1JNIGVudGl0eSAKLSAqIGdlbmVyYXRpb24uCi0gKiAKLSAqIDxwPlRoZSBjdXN0b21pemF0aW9uIHNldHRpbmdzIGFyZSBtYWlubHkgZXhwb3NlZCBpbiB0aGUgZm9ybSBvZiAKLSAqIHByb3BlcnRpZXMuIFRoZXJlIGFyZSBubyBhc3N1bXB0aW9ucyBpbiB0aGlzIGNsYXNzIGFib3V0IHRoZSBtZWFuaW5nIG9mIHRoZSAKLSAqIHByb3BlcnR5IG5hbWVzLiBQcm9wZXJ0aWVzIGNhbiBiZSBhc3NvY2lhdGVkIHRvIHNwZWNpZmljIHRhYmxlcyBhbmQgdGFibGUgCi0gKiBjb2x1bW5zLCBvciBnbG9iYWxseSBmb3IgYW55IHRhYmxlIGFuZC9vciBjb2x1bW4uCi0gKiAKLSAqIDxwPlN1YmNsYXNzIGNhbiBpbXBsZW1lbnQgdGhlIHNldHMgb2YgYWJzdHJhY3QgbWV0aG9kcyB0byBwcm92aWRlIE9STSB2ZW5kb3IKLSAqIHNwZWNpZmljIHByb3BlcnRpZXMuCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE9STUdlbkN1c3RvbWl6ZXIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotewotCXByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE7Ci0KLQkvKioKLQkgKiBBIHZhbHVlIHBhc3NlZCBmb3IgdGhlIHRhYmxlIG5hbWUgYXJndW1lbnQgdG8gZ2V0L3NldFByb3BlcnR5IAotCSAqIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgYXBwbGllcyB0byBhbnkgdGFibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5ZX1RBQkxFID0gIl9fYW55VGFibGVfXyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRERMX0FOTk9UQVRJT04gPSAiZ2VuZXJhdGVERExBbm5vdGF0aW9ucyI7Ci0JLyp0aGUgc3RyaW5nIHVzZWQgaW4gdGhlIHByb3BlcnR5IG5hbWUgaW4gbVByb3BzIHRvIGluZGljYXRlIAotCSAqIGEgbnVsbCB0YWJsZSB2YWx1ZS4qLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1RBQkxFID0gIiI7Ci0JLyp0aGUgc3RyaW5nIHVzZWQgaW4gdGhlIHByb3BlcnR5IG5hbWUgaW4gbVByb3BzIHRvIGluZGljYXRlIAotCSAqIGEgbnVsbCBjb2x1bW4gdmFsdWUuKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9DT0xVTU4gPSAiIjsKLQkKLQkvKlRoaXMgdmVyc2lvbiBudW1iZXIgaXMgd3JpdHRlbiBpbiB0aGUgaGVhZGVyIG9mIHRoZSBjdXN0b21pemF0aW9uIHN0cmVhbQotCSAqIGFuZCByZWFkIGF0IGRlLXNlcmlhbGl6YXRpb24gdGltZSwgaWYgaXQgaXMgZGlmZmVyZW50IHRoZW4gdGhlIGZpbGUgaXMgaW52YWxpZGF0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJTEVfVkVSU0lPTiA9IDI7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9DT05GSUdfRklMRSA9ICJ1cGRhdGVDb25maWdGaWxlIjsKLQotCXByaXZhdGUgdHJhbnNpZW50IFNjaGVtYSBtU2NoZW1hOwotCXByaXZhdGUgdHJhbnNpZW50IEZpbGUgbUZpbGU7Ci0JCi0JcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVRhYmxlTmFtZXM7Ci0JLyprZXk6IHRhYmxlIG5hbWUsIHZhbHVlOiBPUk1HZW5UYWJsZSBvYmplY3QuKi8KLQlwcml2YXRlIHRyYW5zaWVudCBNYXA8U3RyaW5nICwgT1JNR2VuVGFibGU+IG1UYWJsZXM7Ci0JLyp0aGUgPGNvZGU+QXNzb2NpYXRpb248L2NvZGU+IG9iamVjdHMgc29ydGVkIGJ5IHRoZWlyICJmcm9tIiAKLQkgKiB0YWJsZSBuYW1lLiBJbmNsdWRlcyBhbGwgYXNzb2NpYXRpb24gZGVyaXZlZCBmcm9tIGZvcmVpZ24ga2V5cyAKLQkgKiBpbiB1c2VyIHNlbGVjdGVkIHRhYmxlcy4gU2luY2Ugc29tZSBvZiB0aGUgZm9yZWlnbiBrZXlzIG1heSBwb2ludCB0byB0YWJsZQotCSAqIHVzZXIgZG9lcyBub3Qgc2VsZWN0LCB0aGlzIGxpc3QgbWF5IGJlIGRpZmZlcmVudCBmcm9tICBtVmFsaWRBc3NvY2lhdGlvbnMKLQkgKi8KLQlwcml2YXRlIExpc3Q8QXNzb2NpYXRpb24+IG1Bc3NvY2lhdGlvbnM7Ci0JLyoKLQkgKiBMaXN0IG9mIHZhbGlkIGFzc29jaWF0aW9ucyB3aXRoaW4gdGhlIHVzZXIgc2VsZWN0ZWQgdGFibGVzICAKLQkgKi8KLQlwcml2YXRlIHRyYW5zaWVudCBMaXN0PEFzc29jaWF0aW9uPiBtVmFsaWRBc3NvY2lhdGlvbnM7Ci0JcHJpdmF0ZSB0cmFuc2llbnQgYm9vbGVhbiBtSW52YWxpZEZvcmVpZ25Bc3NvY2lhdGlvbnM7Ci0JCi0JLyp0aGUgcHJvcGVydHkgbmFtZSBpcyBpbiB0aGUgZm9ybSAkdGFibGVOYW1lLiRjb2x1bW5OYW1lLiRwcm9wZXJ0eU5hbWUuCi0JICogV2hlcmUgdGFibGVOYW1lIGNvdWxkIGJlIE5VTExfVEFCTEUgb3IgQU5ZX1RBQkxFCi0JICogYW5kIGNvbHVtbk5hbWUgY291bGQgYmUgTlVMTF9DT0xVTU4qLwotCXByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtUHJvcHMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIHRyYW5zaWVudCBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciA9IERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyLkRlZmF1bHQuSU5TVEFOQ0U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gbVVwZGF0ZVBlcnNpc3RlbmNlWG1sID0gdHJ1ZTsKLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8tLS0tIGFic3RyYWN0IG1ldGhvZHMKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHByaW1hcnkga2V5IGdlbmVyYXRvciBzY2hlbWVzLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IExpc3Q8U3RyaW5nPiBnZXRBbGxJZEdlbmVyYXRvcnMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBkZXZlbG9wZXItYXNzaWduZWQgaWQgZ2VuZXJhdG9yLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXROb0lkR2VuZXJhdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgaWRlbnRpdHkgaWQgZ2VuZXJhdG9yLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZGVudGl0eUlkR2VuZXJhdG9yKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHNlcXVlbmNlIGdlbmVyYXRvcnMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU2V0PFN0cmluZz4gZ2V0U2VxdWVuY2VJZEdlbmVyYXRvcnMoKTsKLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgdHlwZSBmcm9tIHRoZSBnaXZlbiBkYXRhYmFzZSBjb2x1bW4uCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFByb3BlcnR5VHlwZUZyb21Db2x1bW4oQ29sdW1uIGNvbHVtbikgOwotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBzdHJpbmdzIHJlcHJlc2VudGluZyBwcm9wZXJ0eSB0eXBlcy4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmdbXSBnZXRBbGxQcm9wZXJ0eVR5cGVzKCk7Ci0JLyoqCi0JICogUmV0dXJucyBhbGwgdGhlIHN0cmluZ3MgcmVwcmVzZW50aW5nIHByb3BlcnR5IG1hcHBpbmcga2luZHMuCi0JICogVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmdzIGFzIGZhciBhcyB0aGUgVmVsb2NpdHkgdGVtcGxhdGUgCi0JICogcHJvY2Vzc29yIHVuZGVyc3RhbmQgdGhlbS4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0QWxsTWFwcGluZ0tpbmRzKCk7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYmFzaWMgKGRlZmF1bHQpIHByb3BlcnR5IG1hcHBpbmcga2luZC4KLQkgKiBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZ3MgYXMgZmFyIGFzIHRoZSBWZWxvY2l0eSB0ZW1wbGF0ZSAKLQkgKiBwcm9jZXNzb3IgdW5kZXJzdGFuZCB0aGVtLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0QmFzaWNNYXBwaW5nS2luZCgpOwotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIChwcmltYXJ5IGtleSkgcHJvcGVydHkgbWFwcGluZyBraW5kLgotCSAqIFRoaXMgY2FuIHJldHVybiBhbnkgc3RyaW5ncyBhcyBmYXIgYXMgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIAotCSAqIHByb2Nlc3NvciB1bmRlcnN0YW5kIHRoZW0uCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZE1hcHBpbmdLaW5kKCk7Ci0JLyoqCi0JICogSW50ZXJhY3RzIHdpdGggdGhlIHVzZXIgdG8gZWRpdCB0aGUgY2FzY2FkZSBvZiB0aGUgZ2l2ZW4gCi0JICogcm9sZS4KLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYWxzbyBjYWxsIDxjb2RlPkFzc29jaWF0aW9uUm9sZS5zZXRDYXNjYWRlPC9jb2RlPi4KLQkgKiAKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIHRoZSB1c2VyIGludGVyYWN0aW9uIGlzIGNhbmNlbGxlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlZGl0Q2FzY2FkZShBc3NvY2lhdGlvblJvbGUgcm9sZSk7Ci0JCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGN1c3RvbWl6YXRpb24gc2V0dGluZ3MuCi0JICogVGhlIGZpbGUgaXMgY3JlYXRlZCBpZiBuZWNlc3Nhcnkgd2hlbiB0aGUgPGNvZGU+c2F2ZTwvY29kZT4gCi0JICogbWV0aG9kIGlzIGNhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KCBGaWxlIGZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJdGhpcy5tU2NoZW1hID0gc2NoZW1hOwotCQltRmlsZSA9IGZpbGU7Ci0JCQotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXNldFByb3BlcnR5KE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0gsIE9STUdlblRhYmxlLkRFRkFVTFRfRkVUQ0gsIE9STUdlbkN1c3RvbWl6ZXIuQU5ZX1RBQkxFLCBudWxsKTsKLQkJCXJldHVybjsKLQkJfQotCQlJbnB1dFN0cmVhbSBpc3RyZWFtID0gbnVsbDsKLQkJT2JqZWN0SW5wdXRTdHJlYW0gb2lzID0gbnVsbDsKLQkJdHJ5IAotCQl7Ci0JCQkvL3JlYWQgaXQgaW4gYSBmaWxlIGZpcnN0IHRvIHNwZWVkdXAgZGVzZXJpYWxpemF0aW9uCi0JCQlieXRlW10gYnl0ZXMgPSBGaWxlVXRpbC5yZWFkRmlsZShmaWxlKTsKLQkJCWlzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZXMpOwotCQkJb2lzID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGlzdHJlYW0pOwotCQkJCi0JCQlGaWxlSGVhZGVyIGhlYWRlciA9IChGaWxlSGVhZGVyKW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQlpZiAoaGVhZGVyLm1WZXJzaW9uID09IEZJTEVfVkVSU0lPTikgewotCQkJCU9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IChPUk1HZW5DdXN0b21pemVyKW9pcy5yZWFkT2JqZWN0KCk7Ci0JCQkJcmVzdG9yZShjdXN0b21pemVyKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFHZW5QbHVnaW4ubG9nRXhjZXB0aW9uKCIqKipPUk1HZW5DdXN0b21pemVyLmxvYWQgZmFpbGVkICIrZmlsZSwgZXgpOwkJCQkKLQkJfQotCQlmaW5hbGx5IAotCQl7Ci0JCQlpZiAob2lzICE9IG51bGwpCi0JCQl7Ci0JCQkJdHJ5IAotCQkJCXsKLQkJCQkJb2lzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGlzdHJlYW0gIT0gbnVsbCkKLQkJCXsKLQkJCQl0cnkgCi0JCQkJewotCQkJCQlpc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgRmlsZSBnZXRGaWxlKCl7Ci0JCXJldHVybiB0aGlzLm1GaWxlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHNjaGVtYSl7Ci0JCXRoaXMubVNjaGVtYSA9IHNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpewotCQlyZXR1cm4gbVNjaGVtYTsKLQl9Ci0JCi0JLyoqCi0JICogRW1wdHkgY29uc3RydWN0b3IgbmVlZGVkIGJ5IHRoZSBkZXNlcmlhbGl6YXRpb24uCi0JICovCi0JcHVibGljIE9STUdlbkN1c3RvbWl6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZXMgdGhlIGN1c3RvbWl6YXRpb24gZmlsZS4KLQkgKiBUaGUgZmlsZSBpcyBjcmVhdGVkIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLU9STUdlbkN1c3RvbWl6ZXIuc2F2ZTogIiArIG1GaWxlKTsKLQkJaWYgKCFtRmlsZS5leGlzdHMoKSAmJiAhbUZpbGUuY3JlYXRlTmV3RmlsZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7Ci0JCWphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG51bGw7Ci0JCWJvb2xlYW4gZGVsZXRlSXQgPSB0cnVlOwotCQl0cnkgewotCQkJZm9zID0gbmV3IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbShtRmlsZSk7Ci0JCQlvb3MgPSBuZXcgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0oZm9zKTsKLQkJCUZpbGVIZWFkZXIgaGVhZGVyID0gbmV3IEZpbGVIZWFkZXIoKTsKLQkJCW9vcy53cml0ZU9iamVjdChoZWFkZXIpOwotCQkJb29zLndyaXRlT2JqZWN0KHRoaXMpOwotCQkJZGVsZXRlSXQgPSBmYWxzZTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkvL2RlbGV0ZUl0IGlzIHRydWUsIHNvIHRoZSBjYWNoZSBpcyBub3Qgc2F2ZWQuCi0JCQlDb3JlRXhjZXB0aW9uIGNlID0gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFHZW5QbHVnaW4uUExVR0lOX0lELAotCQkJCQkiVW5hYmxlIHRvIHNhdmUgdGhlIE9STUdlbkN1c3RvbWl6ZXIgZmlsZTogIittRmlsZSxleCkpOwotCQkJSnB0SnBhR2VuUGx1Z2luLmxvZ0V4Y2VwdGlvbiggY2UgKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG9vcyE9bnVsbCkgb29zLmNsb3NlKCk7Ci0JCQkJaWYgKGZvcyE9bnVsbCkgZm9zLmNsb3NlKCk7Ci0JCQkJaWYgKGRlbGV0ZUl0KSB7Ci0JCQkJCW1GaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZXgyKSB7fQkKLQkJfQotCX0KLQkKLQlwdWJsaWMgRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgZ2V0RGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyOwotCX0KLQlwdWJsaWMgdm9pZCBzZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcihEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcikgewotCQlpZiAoZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJkYXRhYmFzZSBhbm5vdGF0aW9uIG5hbWUgYnVpbGRlciBpcyByZXF1aXJlZCIpOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIgPSBkYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLQl9CQotCi0JLyoqCi0JICogUmV0dXJucyB7QGxpbmsgI0dFTkVSQVRFX0RETF9BTk5PVEFUSU9OfSAgaW5kaWNhdGluZyB3aGV0aGVyCi0JICogdGhlIG9wdGlvbmFsIERETCBwYXJhbWV0ZXJzIGxpa2UgbGVuZ3RoLCBudWxsYWJsZSwgdW5xaXVlLCBldGMgc2hvdWxkIGJlIGdlbmVyYXRlZCAKLQkgKiBpbiBAQ29sdW1uIGFubm90YXRpb24uCi0JICogZGVmYXVsdHMgdG8gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURETEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhnZXRQcm9wZXJ0eShHRU5FUkFURV9ERExfQU5OT1RBVElPTiwgQU5ZX1RBQkxFLCBudWxsKSk7IC8vZGVmYXVsdHMgdG8gZmFsc2UKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0UHJvcEtleShwcm9wZXJ0eU5hbWUsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JCVN0cmluZyB2YWx1ZSA9IG1Qcm9wcy5nZXQoa2V5KTsKLQkJLyppZiB0aGUga2V5IGRvZXMgbm90IGV4aXN0IGFuZCBpdCBpcyBhIHRhYmxlIHByb3BlcnR5IHRoZW4gCi0JCSAqIGdldCB0aGUgZGVmYXVsdCB0YWJsZSBwcm9wZXJ0eS4qLwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiB0YWJsZU5hbWUgIT0gbnVsbCAmJiBjb2xOYW1lID09IG51bGwgJiYgIXRhYmxlTmFtZS5lcXVhbHMoQU5ZX1RBQkxFKSkgewotCQkJdmFsdWUgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEFOWV9UQUJMRSwgY29sTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIGEgcHJvcGVydHkgdmFsdWUuCi0JICogCi0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUsIGNvdWxkIGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHZhbHVlLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlTdHJpbmcga2V5ID0gZ2V0UHJvcEtleShwcm9wZXJ0eU5hbWUsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQltUHJvcHMucHV0KGtleSwgdmFsdWUpOwotCQl9IGVsc2UgewotCQkJbVByb3BzLnJlbW92ZShrZXkpOwotCQl9Ci0JfQotCS8qKgotCSAqIFNhbWUgYXMge0BsaW5rICNnZXRQcm9wZXJ0eShTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0gYnV0IAotCSAqIGNvbnZlcnRzIHRoZSB2YWx1ZSB0byBib29sZWFuLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdGFibGVOYW1lLCBTdHJpbmcgY29sTmFtZSkgewotCQlTdHJpbmcgdmFsdWUgPSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRhYmxlTmFtZSwgY29sTmFtZSk7Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzKHZhbHVlKTsKLQl9Ci0JLyoqCi0JICogQ2hhbmdlcyBhIHRhYmxlIGJvb2xlYW4gcHJvcGVydHkgdmFsdWUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9vbGVhblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIGJvb2xlYW4gdmFsdWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCXNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiLCB0YWJsZU5hbWUsIGNvbE5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lcyBvZiB0aGUgdGFibGVzIHRvIGdlbmVyYXRlLgotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VGFibGVOYW1lcygpIHsKLQkJcmV0dXJuIG1UYWJsZU5hbWVzICE9IG51bGwgPyBtVGFibGVOYW1lcyA6IGphdmEudXRpbC5Db2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZXRjaCB0eXBlIGFubm90YXRpb24gbWVtYmVyIHZhbHVlLCBvciBlbXB0eSBzdHJpbmcgCi0JICogaWYgbm9uZS4KLQkgKiBFbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBudWxsIGJlY2F1c2UgVmVsb2NpdHkgZG9lcyBub3QgbGlrZSBudWxsIAotCSAqIHdoZW4gdXNlZCBpbiAjc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuRmV0Y2goT1JNR2VuVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuICIiOwotCX0JCi0JLyoqCi0JICogQ2FsbGVkIHdoZW4gdGhlIHRhYmxlIHVzZXIgc2VsZWN0aW9uIGlzIGNoYW5nZWQgaW4gdGhlIAotCSAqIGdlbmVyYXRpb24gd2l6YXJkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhYmxlTmFtZXMoTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMpIHsKLQkJbVRhYmxlTmFtZXMgPSB0YWJsZU5hbWVzOwotCQltVGFibGVzID0gbnVsbDsKLQkJbVZhbGlkQXNzb2NpYXRpb25zID0gbnVsbDsgLy9yZWNvbXB1dGUKLQkJbUludmFsaWRGb3JlaWduQXNzb2NpYXRpb25zID0gdHJ1ZTsgLy9tYWtlIHN1cmUgZm9yZWlnbiBhc3NvY2lhdGlvbnMgZnJvbSBuZXdseSBhZGRlZCB0YWJsZXMgYXJlIGNvbXB1dGVkLgotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0YWJsZSBuYW1lcyB0byBiZSBnZW5lcmF0ZWQuCi0JICogVGhpcyBtaWdodCBiZSBkaWZmZXJlbnQgZnJvbSA8Y29kZT5nZXRUYWJsZU5hbWVzPC9jb2RlPiBpZiB0aGVyZSAKLQkgKiBhcmUgbWFueS10by1tYW55IGpvaW4gdGFibGVzIGFuZCBhcmUgbm90IGNvbnRyaWJ1dGluZyAKLQkgKiBpbiBhbnkgb3RoZXIgYXNzb2NpYXRpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R2VuVGFibGVOYW1lcygpICB7Ci0JCUxpc3Q8U3RyaW5nPiBuYW1lcyA9IGdldFRhYmxlTmFtZXMoKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4obmFtZXMuc2l6ZSgpKTsKLQkJCi0JCS8qZmlsdGVyIG91dCBqb2luIHRhYmxlcyovCi0JCUxpc3Q8QXNzb2NpYXRpb24+IGFzc29jaWF0aW9ucyA9IGdldEFzc29jaWF0aW9ucygpOwotCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gdGFibGVOYW1lc0l0ZXIgPSBuYW1lcy5pdGVyYXRvcigpOyB0YWJsZU5hbWVzSXRlci5oYXNOZXh0KCk7ICkgewotCQkJU3RyaW5nIHRhYmxlTmFtZSA9IHRhYmxlTmFtZXNJdGVyLm5leHQoKTsKLQkJCWJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0JCQkKLQkJCWZvciAoSXRlcmF0b3I8QXNzb2NpYXRpb24+IGFzc29jSXRlciA9IGFzc29jaWF0aW9ucy5pdGVyYXRvcigpOyBhc3NvY0l0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGFzc29jSXRlci5uZXh0KCk7Ci0JCQkJaWYgKCFhc3NvY2lhdGlvbi5pc0dlbmVyYXRlZCgpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAodGFibGVOYW1lLmVxdWFscyhhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpKQotCQkJCQkJfHwgdGFibGVOYW1lLmVxdWFscyhhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkpKSB7Ci0JCQkJCWlzVmFsaWQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHRhYmxlTmFtZS5lcXVhbHMoYXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlTmFtZSgpKSkgewotCQkJCQlpc1ZhbGlkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzVmFsaWQpIHsKLQkJCQlyZXN1bHQuYWRkKHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhbiA8Y29kZT5PUk1HZW5UYWJsZTwvY29kZT4gb2JqZWN0IGdpdmVuIGl0cyBuYW1lLCBvciAKLQkgKiBudWxsIGlmIG5vbmUuCi0JICovCi0JcHVibGljIE9STUdlblRhYmxlIGdldFRhYmxlKFN0cmluZyB0YWJsZU5hbWUpICB7Ci0JCWlmIChtVGFibGVzID09IG51bGwpIHsKLQkJCW1UYWJsZXMgPSBuZXcgamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBPUk1HZW5UYWJsZT4obVRhYmxlTmFtZXMuc2l6ZSgpKTsKLQkJfQotCQkKLQkJaWYobVRhYmxlTmFtZXMhPW51bGwgJiYgbVNjaGVtYSE9bnVsbCl7Ci0JCQlmb3IgKEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IG1UYWJsZU5hbWVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGl0ZXIubmV4dCgpOwotCQkJCVRhYmxlIGRiVGFibGUgPSBtU2NoZW1hLmdldFRhYmxlTmFtZWQoIG5hbWUgKTsKLQkJCQlpZiAoZGJUYWJsZSAhPSBudWxsKSB7Ci0JCQkJCW1UYWJsZXMucHV0KG5hbWUsIGNyZWF0ZUdlblRhYmxlKGRiVGFibGUpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1UYWJsZXMuZ2V0KHRhYmxlTmFtZSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIDxjb2RlPkFzc29jaWF0aW9uPC9jb2RlPiBvYmplY3RzIHNvcnRlZCBieSB0aGVpciAiZnJvbSIgCi0JICogdGFibGUgbmFtZS4KLQkgKi8KLQlwdWJsaWMgTGlzdDxBc3NvY2lhdGlvbj4gZ2V0QXNzb2NpYXRpb25zKCl7Ci0JCXJldHVybiBnZXRBc3NvY2lhdGlvbnModHJ1ZS8qdmFsaWRPbmx5Ki8pOwotCX0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBhc3NvY2lhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBc3NvY2lhdGlvbihBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgIHsKLQkJZ2V0QXNzb2NpYXRpb25zKGZhbHNlLyp2YWxpZE9ubHkqLykuYWRkKGFzc29jaWF0aW9uKTsKLQkJaWYgKG1WYWxpZEFzc29jaWF0aW9ucyAhPSBudWxsKSB7Ci0JCQltVmFsaWRBc3NvY2lhdGlvbnMuYWRkKGFzc29jaWF0aW9uKTsKLQkJfQotCQkKLQl9Ci0JLyoqCi0JICogRGVsZXRlcyB0aGUgZ2l2ZW4gYXNzb2NpYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQXNzb2NpYXRpb24oQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pICB7Ci0JCWJvb2xlYW4gcmVtb3ZlZCA9IGdldEFzc29jaWF0aW9ucyhmYWxzZS8qdmFsaWRPbmx5Ki8pLnJlbW92ZShhc3NvY2lhdGlvbik7Ci0JCWFzc2VydChyZW1vdmVkKTsKLQkJCi0JCWlmIChtVmFsaWRBc3NvY2lhdGlvbnMgIT0gbnVsbCkgewotCQkJcmVtb3ZlZCA9IG1WYWxpZEFzc29jaWF0aW9ucy5yZW1vdmUoYXNzb2NpYXRpb24pOwotCQkJYXNzZXJ0KHJlbW92ZWQpOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBhbiBhc3NvY2lhdGlvbiBzaW1pbGFyIHRvIHRoZSBnaXZlbiBhc3NvY2lhdGlvbiAKLQkgKiBhbHJlYWR5IGV4aXN0cy4KLQkgKiBUaGlzIGlzIGRlY2lkZWQgYmFzZWQgb25seSBvbiB0aGUgYXNzb2NpYXRpb24gdGFibGVzIGFuZCBjb2x1bW5zLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNpbWlsYXJBc3NvY2lhdGlvbkV4aXN0cyhBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgewotCQl0cnkgewotCQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXRlciA9IGdldEFzc29jaWF0aW9ucyhmYWxzZS8qdmFsaWRPbmx5Ki8pLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbjIgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIWFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGVOYW1lKCkuZXF1YWxzKGFzc29jaWF0aW9uMi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpKQotCQkJCQkJfHwgIWFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSkKLQkJCQkJCXx8ICFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCksIGFzc29jaWF0aW9uMi5nZXRKb2luVGFibGVOYW1lKCkpCi0JCQkJCQl8fCAhYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpKQotCQkJCQkJfHwgIWFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkpCi0JCQkJCQkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQkJCQkJCi0JCQkJLyp0aGUgMiBhc3NvY2lhdGlvbiBoYXZlIHRoZSBzYW1lIHJlZmVycmVyLCByZWZlcmVuY2VkIGFuZCBqb2luIHRhYmxlKi8KLQkJCQlpZiAoYXNzb2NpYXRpb24uZ2V0Sm9pblRhYmxlTmFtZSgpID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCWlmIChhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckpvaW5Db2x1bW5OYW1lcygpLmVxdWFscyhhc3NvY2lhdGlvbjIuZ2V0UmVmZXJyZXJKb2luQ29sdW1uTmFtZXMoKSkKLQkJCQkJCSYmIGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKS5lcXVhbHMoYXNzb2NpYXRpb24yLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogQ3JlYXRlcyB0aGUgPGNvZGU+T1JNR2VuVGFibGU8L2NvZGU+IGluc3RhbmNlLiAKLQkgKi8KLQlwdWJsaWMgT1JNR2VuVGFibGUgY3JlYXRlR2VuVGFibGUoVGFibGUgZGJUYWJsZSkgewotCQlyZXR1cm4gbmV3IE9STUdlblRhYmxlKGRiVGFibGUsIHRoaXMpOwotCX0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IGluc3RhbmNlLgotCSAqLwotCXByb3RlY3RlZCBPUk1HZW5Db2x1bW4gY3JlYXRlR2VuQ29sdW1uKENvbHVtbiBkYkNvbCkgewotCQlyZXR1cm4gbmV3IE9STUdlbkNvbHVtbihkYkNvbCwgdGhpcyk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgdW5kZXJseWluZyBwZXJzaXN0ZW5jZSBzcGVjcyByZXF1aXJlIHRoZSAibWFueSIgc2lkZSAKLQkgKiBvZiBhbiBhc3NvY2lhdGlvbiB0byBiZSB0aGUgb3duZXIgKGxpa2UgRUpCMykuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWFueVNpZGVJc0Fzc29jaWF0aW9uT3duZXIoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVDb25maWdGaWxlKCkgewotCQlyZXR1cm4gISJmYWxzZSIuZXF1YWxzKGdldFByb3BlcnR5KFVQREFURV9DT05GSUdfRklMRSwgbnVsbCwgbnVsbCkpOyAvL2RlZmF1bHRzIHRvIHRydWUKLQl9Ci0JcHVibGljIHZvaWQgc2V0VXBkYXRlQ29uZmlnRmlsZShib29sZWFuIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSkgeyAvL2RlZmF1bHQgaXMgdHJ1ZQotCQkJc2V0UHJvcGVydHkoVVBEQVRFX0NPTkZJR19GSUxFLCBudWxsLCBudWxsLCBudWxsKTsgLy9yZW1vdmUgaXQKLQkJfSBlbHNlIHsKLQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShVUERBVEVfQ09ORklHX0ZJTEUsIHZhbHVlLCBudWxsLCBudWxsKTsKLQkJfQotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0gVmVsb2NpdHkgdGVtcGxhdGVzIG1ldGhvZHMKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmV0dXJucyBhIGdldHRlciBtZXRob2QgbmFtZSBnaXZlbiBhIHByb3BlcnR5IG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBwcm9wZXJ0eUdldHRlcihTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAiZ2V0IitTdHJpbmdVdGlsLmluaXRVcHBlcihwcm9wZXJ0eU5hbWUpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2V0dGVyIG1ldGhvZCBuYW1lIGdpdmVuIGEgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByb3BlcnR5U2V0dGVyKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJzZXQiK1N0cmluZ1V0aWwuaW5pdFVwcGVyKHByb3BlcnR5TmFtZSk7Ci0JfQotCXB1YmxpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIHMpIHsKLQkJcmV0dXJuIFN0cmluZ1V0aWwucXVvdGUocywgJyInKTsKLQl9Ci0JcHVibGljIFN0cmluZyBxdW90ZShib29sZWFuIGIpIHsKLQkJcmV0dXJuIHF1b3RlKFN0cmluZy52YWx1ZU9mKGIpKTsKLQl9Ci0JcHVibGljIFN0cmluZyBxdW90ZShpbnQgaSkgewotCQlyZXR1cm4gcXVvdGUoU3RyaW5nLnZhbHVlT2YoaSkpOwotCX0KLQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKFN0cmluZyBzKSB7Ci0JCXJldHVybiBTdHJpbmdUb29scy5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbChzKTsKLQl9Ci0JLyoqCi0JICogQXBwZW5kcyBhbiBhbm5vdGF0aW9uIG1lbWJlciBuYW1lIGFuZCB2YWx1ZSB0byBhbiBleGlzdGluZyBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBzIFRoZSBhbm5vdGF0aW9uIG1lbWJlcnMgc3RyaW5nLgotCSAqCi0JICogQHBhcmFtIG1lbWJlclZhbHVlIFRoZSBtZW1iZXIgdmFsdWUsIGlmIG51bGwgb3IgZW1wdHkgc3RyaW5ncyB0aGVuIAotCSAqIG5vdGhpbmcgaXMgYXBwZW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gd2hldGhlciB0byBkb3VibGUgcXVvdGUgdGhlIG1lbWJlciB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGFwcGVuZEFubm90YXRpb24oU3RyaW5nIHMsIFN0cmluZyBtZW1iZXJOYW1lLCBTdHJpbmcgbWVtYmVyVmFsdWUsIGJvb2xlYW4gcXVvdGUpIHsKLQkJaWYgKG1lbWJlclZhbHVlID09IG51bGwgfHwgbWVtYmVyVmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHM7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocyk7Ci0JCWlmIChidWZmZXIubGVuZ3RoKCkgIT0gMCkgewotCQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKG1lbWJlck5hbWUpOwotCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCWlmIChxdW90ZSkgewotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQobWVtYmVyVmFsdWUpOwotCQlpZiAocXVvdGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJyInKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGlzSkRLMV81KCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLSBwcml2YXRlIG1ldGhvZHMKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIGN1c3RvbWl6YXRpb24gc2V0dGluZ3MgZnJvbSB0aGUgZ2l2ZW4gCi0JICogKHBlcnNpc3RlZCkgY3VzdG9taXplci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpICB7Ci0JCW1UYWJsZU5hbWVzID0gY3VzdG9taXplci5tVGFibGVOYW1lczsKLQkJbUFzc29jaWF0aW9ucyA9IGN1c3RvbWl6ZXIubUFzc29jaWF0aW9uczsKLQkJbVByb3BzID0gY3VzdG9taXplci5tUHJvcHM7Ci0JCW1VcGRhdGVQZXJzaXN0ZW5jZVhtbCA9IGN1c3RvbWl6ZXIubVVwZGF0ZVBlcnNpc3RlbmNlWG1sOwotCQlpZiggbVNjaGVtYSA9PSBudWxsICkKLQkJCXJldHVybjsKLQkJCi0JCS8qcmVtb3ZlIGludmFsaWQgdGFibGUgbmFtZXMqLwotCQlmb3IgKGludCBpID0gbVRhYmxlTmFtZXMuc2l6ZSgpLTE7IGkgPj0gMDsgLS1pKSB7Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gbVRhYmxlTmFtZXMuZ2V0KGkpOwotCQkJaWYgKG1TY2hlbWEuZ2V0VGFibGVOYW1lZCggdGFibGVOYW1lKSA9PSBudWxsKSB7Ci0JCQkJbVRhYmxlTmFtZXMucmVtb3ZlKGkpOwotCQkJfQotCQl9Ci0JCWlmKCBtQXNzb2NpYXRpb25zIT1udWxsICl7Ci0JCQkvKnJlc3RvcmUgdGhlIGFzc29jaWF0aW9ucyovCi0JCQlmb3IgKEl0ZXJhdG9yPEFzc29jaWF0aW9uPiBpdGVyID0gbUFzc29jaWF0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBpdGVyLm5leHQoKTsKLQkJCQlhc3NvY2lhdGlvbi5yZXN0b3JlKHRoaXMpOwotCQkJfQotCQkJLyphZGQgdGhlIGZvcmVpZ24ga2V5cyBhc3NvY2lhdGlvbnMganVzdCBpbiBjYXNlIHRoZSB0YWJsZXMgY2hhbmdlZCBzaW5jZSAKLQkJCSAqIHRoZSBsYXN0IHRpbWUgdGhlIHN0YXRlIHdhcyBwZXJzaXN0ZWQuIFBhc3MgY2hlY2tFeGlzdGluZyB0cnVlIHNvIHRoYXQgdGhlIAotCQkJICogYXNzb2NpYXRpb25zIHJlc3RvcmVkIGFib3ZlIGFyZSBub3Qgb3ZlcndyaXR0ZW4uKi8KLQkJCWFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnModHJ1ZS8qY2hlY2tFeGlzdGluZyovKTsKLQkJCS8vIHNvcnQgb24gcmVzdG9yZQotCQkJc29ydEFzc29jaWF0aW9ucyggbUFzc29jaWF0aW9ucyApOwotCQl9Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGtleSBpbiBtUHJvcHMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIAotCSAqIHByb3BlcnR5TmFtZSwgdGFibGUgYW5kIGNvbHVtbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wS2V5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyB0YWJsZU5hbWUsIFN0cmluZyBjb2xOYW1lKSB7Ci0JCWlmICh0YWJsZU5hbWUgPT0gbnVsbCkgewotCQkJdGFibGVOYW1lID0gTlVMTF9UQUJMRTsKLQkJfQotCQlpZiAoY29sTmFtZSA9PSBudWxsKSB7Ci0JCQljb2xOYW1lID0gTlVMTF9DT0xVTU47Ci0JCX0KLQkJcmV0dXJuIHRhYmxlTmFtZSArICcuJyArIGNvbE5hbWUgKyAnLicgKyBwcm9wZXJ0eU5hbWU7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFzc29jaWF0aW9ucyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhlIAotCSAqIGN1cnJlbnQgdGFibGVzLgotCSAqLwotCXByaXZhdGUgTGlzdDxBc3NvY2lhdGlvbj4gZ2V0QXNzb2NpYXRpb25zKGJvb2xlYW4gdmFsaWRPbmx5KXsKLQkJaWYgKG1Bc3NvY2lhdGlvbnMgPT0gbnVsbCkgewotCQkJbUFzc29jaWF0aW9ucyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PEFzc29jaWF0aW9uPigpOwotCQkJCi0JCQlhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKGZhbHNlLypjaGVja0V4aXN0aW5nKi8pOwotCQl9IGVsc2UgaWYgKG1JbnZhbGlkRm9yZWlnbkFzc29jaWF0aW9ucykgewotCQkJbUludmFsaWRGb3JlaWduQXNzb2NpYXRpb25zID0gZmFsc2U7Ci0JCQkKLQkJCWFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnModHJ1ZS8qY2hlY2tFeGlzdGluZyovKTsKLQkJfQotCQlMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnM7Ci0JCWlmICh2YWxpZE9ubHkpIHsKLQkJCWlmIChtVmFsaWRBc3NvY2lhdGlvbnMgPT0gbnVsbCkgewotCQkJCS8qZmlsdGVyIG91dCB0aGUgaW52YWxpZCBhc3NvY2lhdGlvbnMqLwotCQkJCW1WYWxpZEFzc29jaWF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8QXNzb2NpYXRpb24+KG1Bc3NvY2lhdGlvbnMuc2l6ZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMCwgbiA9IG1Bc3NvY2lhdGlvbnMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbUFzc29jaWF0aW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChhc3NvY2lhdGlvbi5pc1ZhbGlkKCkpIHsKLQkJCQkJCW1WYWxpZEFzc29jaWF0aW9ucy5hZGQoYXNzb2NpYXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYXNzb2NpYXRpb25zID0gbVZhbGlkQXNzb2NpYXRpb25zOwotCQl9IGVsc2UgewotCQkJYXNzb2NpYXRpb25zID0gbUFzc29jaWF0aW9uczsKLQkJfQotCQlyZXR1cm4gYXNzb2NpYXRpb25zOwotCX0KLQlwcml2YXRlIHZvaWQgYWRkRm9yZWlnbktleUFzc29jaWF0aW9ucyhib29sZWFuIGNoZWNrRXhpc3RpbmcpIHsKLQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSBnZXRUYWJsZU5hbWVzKCk7Ci0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gdGFibGVOYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKSB7Ci0JCQlPUk1HZW5UYWJsZSB0YWJsZSA9IGdldFRhYmxlKGl0ZXIubmV4dCgpKTsKLQkJCWFkZEZvcmVpZ25LZXlBc3NvY2lhdGlvbnModGFibGUsIGNoZWNrRXhpc3RpbmcpOwotCQl9Ci0JfQotCXByaXZhdGUgdm9pZCBhZGRGb3JlaWduS2V5QXNzb2NpYXRpb25zKE9STUdlblRhYmxlIHRhYmxlLCBib29sZWFuIGNoZWNrRXhpc3RpbmcpIHsKLQkJaWYodGFibGU9PW51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQkKLQkJTGlzdDxGb3JlaWduS2V5SW5mbz4gZktleXMgPSBudWxsOwotCQkKLQkJdHJ5ewotCQkJZktleXMgPSBEVFBVdGlsLmdldEZvcmVpZ25LZXlzKHRhYmxlLmdldERiVGFibGUoKSk7Ci0JCX1jYXRjaChFeGNlcHRpb24gaXNlKXsKLQkJCS8vd29ya2Fyb3VuZCBEYWxpIGJ1ZyBmb3Igbm93Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmKCBmS2V5cy5zaXplKCk9PTAgKQotCQkJcmV0dXJuOwotCQkKLQkJTGlzdDxBc3NvY2lhdGlvbj4gYWRkZWRBc3NvY2lhdGlvbnMgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxBc3NvY2lhdGlvbj4oKTsKLQkJZm9yIChJdGVyYXRvcjxGb3JlaWduS2V5SW5mbz4gaXRlciA9IGZLZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApIHsKLQkJCUZvcmVpZ25LZXlJbmZvIGZraSA9IGl0ZXIubmV4dCgpOwotCQkJT1JNR2VuVGFibGUgcmVmZXJlbmNlZFRhYmxlID0gZ2V0VGFibGUoZmtpLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSk7Ci0JCQlpZiAocmVmZXJlbmNlZFRhYmxlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbmV3IEFzc29jaWF0aW9uKHRoaXMsIHRhYmxlLmdldE5hbWUoKSwgZmtpLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKQotCQkJCQkJLCByZWZlcmVuY2VkVGFibGUuZ2V0TmFtZSgpLCBma2kuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkpOwotCQkJYXNzb2NpYXRpb24uY29tcHV0ZUNhcmRpbmFsaXR5KCk7Ci0JCQkvL0RlZmVyIHRoZSBjaGVjayBvZiBzaW1pbGFyQXNzb2NpYXRpb25FeGlzdHMgYWZ0ZXIgY29tcHV0ZU1hbnlUb01hbnkoKQotCQkJLy9vdGhlcndpc2UgdGhlIE1UTSBhc3NvY2lhdGlvbiB3aWxsIG5vdCBjb21wdXRlZCBjb3JyZWN0bHkgaW4gc29tZSBjYXNlcy4KLQkJCS8vaWYgKGNoZWNrRXhpc3RpbmcgJiYgc2ltaWxhckFzc29jaWF0aW9uRXhpc3RzKGFzc29jaWF0aW9uKSkgewotCQkJLy8JY29udGludWU7Ci0JCQkvL30KLQkJCWFkZGVkQXNzb2NpYXRpb25zLmFkZChhc3NvY2lhdGlvbik7Ci0JCX0KLQkJCi0JCUFzc29jaWF0aW9uIG0ybSA9IGNvbXB1dGVNYW55VG9NYW55KHRhYmxlLCBhZGRlZEFzc29jaWF0aW9ucyk7Ci0JCWlmIChtMm0gIT0gbnVsbCkgewotCQkJLypkbyBub3QgZ2VuZXJhdGUgdGhlIDIgbWFueS10by1vbmUqLwotCQkJYWRkZWRBc3NvY2lhdGlvbnMuY2xlYXIoKTsKLQkJCWFkZGVkQXNzb2NpYXRpb25zLmFkZCgwLCBtMm0pOwotCQl9Ci0JCS8vcmVtb3ZlIHRoZSBhc3NvY2lhdGlvbiBpZiBhbHJlYWR5IGV4aXN0aW5nCi0JCUl0ZXJhdG9yPEFzc29jaWF0aW9uPiBpdCA9ICBhZGRlZEFzc29jaWF0aW9ucy5pdGVyYXRvcigpOyAKLQkJd2hpbGUoIGl0Lmhhc05leHQoKSApewotCQkJQXNzb2NpYXRpb24gbmV3QXNzb2NpYXRpb24gPSBpdC5uZXh0KCk7Ci0JCQlmb3IoIEFzc29jaWF0aW9uIGFzc29jaWF0aW9uIDogbUFzc29jaWF0aW9ucyApewotCQkJCWlmKCBuZXdBc3NvY2lhdGlvbi5lcXVhbHMoIGFzc29jaWF0aW9uICkpewotCQkJCQlpdC5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1Bc3NvY2lhdGlvbnMuYWRkQWxsKGFkZGVkQXNzb2NpYXRpb25zKTsKLQl9Ci0JcHJpdmF0ZSBBc3NvY2lhdGlvbiBjb21wdXRlTWFueVRvTWFueShPUk1HZW5UYWJsZSB0YWJsZSwgTGlzdDxBc3NvY2lhdGlvbj4gYWRkZWRBc3NvY2lhdGlvbnMpIHsKLQkJLyoqIG1hbnktdG8tbWFueSBhc3NvY2lhdGlvbnMgaWY6Ci0JCSAqIC0gYWRkZWRBc3NvY2lhdGlvbnMgY29udGFpbnMgMiBtYW55LXRvLW9uZSBhc3NvY2lhdGlvbnMKLQkJICogLSB0YWJsZXMgdDEgYW5kIHQyIGRvZXMgTk9UIGhhdmUgdG8gYmUgZGlmZmVyZW50KCBmb3Igc2VsZi1NVE0tc2VsZiBzaXR1YXRpb24pCi0JCSAqIC0gPGNvZGU+dGFibGU8L2NvZGU+IGNvbnRhaW5zIG9ubHkgdGhlIGZvcmVpZ24ga2V5IGNvbHVtbnMuCi0JCSAqIAotCQkgKiBOb3RlOiBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zIGhhdmUgYmVlbiByZW1vdmVkOgotCQkgKiAtdGFibGUgaGFzIG9ubHkgdHdvIGNvbHVtbnMKLQkJICogLXQxIGFuZCB0MiBtdXN0IGJlIGRpZmZlcmVudAotCQkgKiAtdGhlIHByaW1hcnkga2V5IG9mIDxjb2RlPnRhYmxlPC9jb2RlPiBpcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBpdHMgZm9yZWlnbiAKLQkJICogCWtleXMgdG8gdDEgYW5kIHQyLiovCi0JCQotCQlpZiAoYWRkZWRBc3NvY2lhdGlvbnMuc2l6ZSgpICE9IDIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQkvL01UTSB0YWJsZSBzaG91bGQgaGF2ZSB0d28gTVRPIHJlbGF0aW9ucyB0byBvcmdpbmFsIHRhYmxlcwotCQlBc3NvY2lhdGlvbiBhc3NvYzEgPSBhZGRlZEFzc29jaWF0aW9ucy5nZXQoMCk7Ci0JCUFzc29jaWF0aW9uIGFzc29jMiA9IGFkZGVkQXNzb2NpYXRpb25zLmdldCgxKTsKLQkJaWYgKGFzc29jMS5nZXRDYXJkaW5hbGl0eSgpICE9IEFzc29jaWF0aW9uLk1BTllfVE9fT05FCi0JCQkJfHwgYXNzb2MyLmdldENhcmRpbmFsaXR5KCkgIT0gQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy9NVE0gdGFibGUgc2hvdWxkIG9ubHkgaW5jbHVkZSBmb3JlaWduIGtleSBjb2x1bW5zCi0JCWZvciggT1JNR2VuQ29sdW1uIGNvbCA6IHRhYmxlLmdldENvbHVtbnMoKSl7Ci0JCQlpZiggIWNvbC5pc0ZvcmVpZ25LZXkoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQotCQlPUk1HZW5UYWJsZSB0MSA9IGFzc29jMS5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJT1JNR2VuVGFibGUgdDIgPSBhc3NvYzIuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0KLQkJaWYoIHQxLmdldE5hbWUoKS5lcXVhbHModGFibGUuZ2V0TmFtZSgpKSB8fCB0Mi5nZXROYW1lKCkuZXF1YWxzKHRhYmxlLmdldE5hbWUoKSkgKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vTWFrZSBhIGd1ZXNzIHdoaWNoIHRhYmxlIGlzIHRoZSBvd25pbmcgc2lkZSBvZiB0aGUgTVRNIHJlbGF0aW9uCi0JCS8vU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNjg0NDUKLQkJLy9Mb2dpYyBib3Jyb3dlZCBmcm9tIERUUFRhYmxlV3JhcHBlci5nZXRKb2luVGFibGVPd25pbmdGb3JlaWduS2V5KCkKLQkJaWYoICF0YWJsZS5nZXROYW1lKCkuZXF1YWxzKHQxLmdldE5hbWUoKSArICJfIiArIHQyLmdldE5hbWUoKSApICkgewotCQkJLy9zd2FwIHQxIGFuZCB0MiAgCi0JCQlPUk1HZW5UYWJsZSB0MyA9IHQxOwotCQkJdDE9dDI7Ci0JCQl0Mj10MzsKLQkJCS8vc3dhcCBhc3NvYzEgYW5kIGFzc29jMgotCQkJQXNzb2NpYXRpb24gYXNzb2MzPWFzc29jMTsKLQkJCWFzc29jMT1hc3NvYzI7Ci0JCQlhc3NvYzI9YXNzb2MzOwotCQl9Ci0JCQotLy9Db21tZW50ZWQgb3V0IGJlY2F1c2UgdGhlIGFzc3VtcHRpb24gaXMgdG9vIHJlc3RyaWN0aXZlOiAKLS8vdGhpcyBjaGVjayB3aWxsIHByZXZlbnQgZ2VuZXJhdGluZyBNVE0gbWFwcGluZyB0YWJsZSBub3QgaGF2aW5nIAotLy9wcmltYXJ5IGtleSBkZWZpbmVkIAkJCi0vLwkJTGlzdCBwa05hbWVzID0gRFRQVXRpbC5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZXModGFibGUuZ2V0RGJUYWJsZSgpKTsKLS8vCQlpZiAocGtOYW1lcy5zaXplKCkgIT0gdGFibGUuZ2V0Q29sdW1uTmFtZXMoKS5zaXplKCkpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotLy8JCUxpc3QgZmtOYW1lcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0KGFzc29jMS5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkpOyAvL2Nsb25lIGJlY2F1c2Ugd2UgbW9kaWZ5IGJ5IGFkZEFsbCBiZWxvdwotLy8JCWZrTmFtZXMuYWRkQWxsKGFzc29jMi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkpOwotLy8JCWlmICghQ29sbGVjdGlvblV0aWwuZXF1YWxzSWdub3JlT3JkZXIocGtOYW1lcywgZmtOYW1lcykpIHsKLS8vCQkJcmV0dXJuIG51bGw7Ci0vLwkJfQotCQlBc3NvY2lhdGlvbiBtMm0gPSBuZXcgQXNzb2NpYXRpb24odGhpcywgdDEuZ2V0TmFtZSgpLypyZWZlcnJlclRhYmxlTmFtZSovLCBhc3NvYzEuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkvKnJlZmVycmVyQ29sTmFtZXMqLwotCQkJCSwgdDIuZ2V0TmFtZSgpLypyZWZlcmVuY2VkVGFibGVOYW1lKi8sIGFzc29jMi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXMoKS8qcmVmZXJlbmNlZENvbE5hbWVzKi8KLQkJCQksIHRhYmxlLmdldE5hbWUoKSwgYXNzb2MxLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKS8qcmVmZXJyZXJKb2luQ29sTmFtZXMqLywgYXNzb2MyLmdldFJlZmVycmVyQ29sdW1uTmFtZXMoKS8qcmVmZXJlbmNlZEpvaW5Db2xOYW1lcyovKTsKLQkJbTJtLnNldEN1c3RvbShmYWxzZSk7Ci0JCXJldHVybiBtMm07Ci0JfQotCi0JLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0gRmlsZUhlYWRlciBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JLyoqCi0JICogVGhlIGhlYWRlciBvZiB0aGUgY3VzdG9taXphdGlvbiBmaWxlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIEZpbGVIZWFkZXIgaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZQotCXsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JCS8qKgotCQkgKiBTaG91bGQgYmUgYXJndW1lbnQtbGVzcyBiZWNhdXNlIGl0IGlzIHVzZWQgaW4gCi0JCSAqIHRoZSBkZS1zZXJpYWxpemF0aW9uIHByb2Nlc3MuCi0JCSAqLwotCQlwdWJsaWMgRmlsZUhlYWRlcigpIHsKLQkJCW1WZXJzaW9uID0gRklMRV9WRVJTSU9OOwotCQl9Ci0JCWludCBtVmVyc2lvbjsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNvcnRBc3NvY2lhdGlvbnMoIExpc3Q8IEFzc29jaWF0aW9uID4gbGlzdCApIHsKLQkgICBDb2xsZWN0aW9ucy5zb3J0KCBsaXN0LCBuZXcgQ29tcGFyYXRvcjwgQXNzb2NpYXRpb24gPigpIHsKLQkgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoIEFzc29jaWF0aW9uIGxocywgQXNzb2NpYXRpb24gcmhzICkgewotCSAgICAgICAgIC8vIHNvcnQgYnkgcmVmZXJyZXIgdGFibGUgbmFtZSBmaXJzdC4uLgotCSAgICAgICAgIGludCB0ZXN0ID0gbGhzLmdldFJlZmVycmVyVGFibGVOYW1lKCkuY29tcGFyZVRvKCByaHMuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSApOwotICAgICAgICAgICAgaWYoIHRlc3QgIT0gMCApCi0gICAgICAgICAgICAgICByZXR1cm4gdGVzdDsKLSAgICAgICAgICAgIC8vIHRoZW4gYnkgcmVmZXJlbmNlZCB0YWJsZSBuYW1lLi4uCi0gICAgICAgICAgICB0ZXN0ID0gbGhzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKS5jb21wYXJlVG8oIHJocy5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgKTsKLSAgICAgICAgICAgIGlmKCB0ZXN0ICE9IDAgKQotICAgICAgICAgICAgICAgcmV0dXJuIHRlc3Q7Ci0gICAgICAgICAgICAvLyBpZiByZWZlcnJlciBhbmQgcmVmZXJlbmNlZCB0YWJsZXMgYXJlIHRoZSBzYW1lLCB0aGV5IHNob3VsZAotICAgICAgICAgICAgLy8gYXBwZWFyIG5leHQgdG8gZWFjaCBvdGhlcgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0JICAgICAgfQotCSAgIH0gKTsKLQl9Ci0JcHVibGljIGJvb2xlYW4gdXBkYXRlUGVyc2lzdGVuY2VYbWwoKSB7Ci0JCXJldHVybiBtVXBkYXRlUGVyc2lzdGVuY2VYbWw7Ci0JfQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVBlcnNpc3RlbmNlWG1sKGJvb2xlYW4gdXBkYXRlUGVyc2lzdGVuY2VYbWwpIHsKLQkJdGhpcy5tVXBkYXRlUGVyc2lzdGVuY2VYbWwgPSB1cGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvT1JNR2VuVGFibGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PUk1HZW5UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NhOTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PUk1HZW5UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuSmF2YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkRUUFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5FbnRpdHlHZW5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLlN0cmluZ1V0aWw7Ci0KLS8qKgotICogUmVwcmVzZW50cyB0aGUgT1JNIGdlbmVyYXRpb24gcHJvcGVydGllcyBmb3IgYSBkYXRhYmFzZSB0YWJsZS4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGNyZWF0ZWQvY2hhbmdlZCBieSB0aGUgZ2VuZXJhdGlvbiB3aXphcmQsIGFuZAotICogZ2VuZXJhdGVkIHVzaW5nIFZlbG9jaXR5IHRlbXBsYXRlcy4gVGhlIG1vZGlmaWVkIHByb3BlcnRpZXMgKGlmIGFueSkgYXJlCi0gKiBwZXJzaXN0ZWQvcmV0cmlldmVkIHVzaW5nIDxjb2RlPk9STUdlbkN1c3RvbWl6ZXI8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBPUk1HZW5UYWJsZQotewotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBtQ3VzdG9taXplcjsKLQlwcml2YXRlIExpc3Q8T1JNR2VuQ29sdW1uPiBtQ29sdW1uczsKLQlwcml2YXRlIFRhYmxlIG1EYlRhYmxlOwotCXByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gY29sdW1uVHlwZXNNYXAgPSAgbnVsbDsKLQkvKioKLQkgKiBAcGFyYW0gdGFibGUKLQkgKiAgICAgICAgICAgIFRoZSBkYXRhYmFzZSB0YWJsZSBvciBudWxsIGlmIHRoaXMgdGFibGUgaXMgdXNlZCB0byBnZXQvc2V0Ci0JICogICAgICAgICAgICB0aGUgZGVmYXVsdCB0YWJsZSBwcm9wZXJ0aWVzIChwcm9wZXJ0aWVzIHRoYXQgYXBwbHkgdG8gYWxsCi0JICogICAgICAgICAgICB0YWJsZXMgdW5sZXNzIG92ZXJyaWRlbikuCi0JICovCi0JcHVibGljIE9STUdlblRhYmxlKFRhYmxlIHRhYmxlLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJc3VwZXIoKTsKLQkJbURiVGFibGUgPSB0YWJsZTsKLQkJbUN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCX0KLQotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCXJldHVybiBtQ3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0YWJsZSBpcyBpcyB1c2VkIHRvIGdldC9zZXQgdGhlIGRlZmF1bHQgdGFibGUKLQkgKiBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdHNUYWJsZSgpIHsKLQkJcmV0dXJuIG1EYlRhYmxlID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBjdXN0b21pemVkKFN0cmluZyBwcm9wTmFtZSkgewotCQlyZXR1cm4gZ2V0Q3VzdG9taXplcigpLmdldFByb3BlcnR5KHByb3BOYW1lLCBnZXRUYWJsZU5hbWUoKSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY3VzdG9taXplZEJvb2xlYW4oU3RyaW5nIHByb3BOYW1lKSB7Ci0JCXJldHVybiBnZXRDdXN0b21pemVyKCkuZ2V0Qm9vbGVhblByb3BlcnR5KHByb3BOYW1lLCBnZXRUYWJsZU5hbWUoKSwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3VzdG9taXplZChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl2YWx1ZSA9IG51bGw7Ci0JCX0KLQkJZ2V0Q3VzdG9taXplcigpLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgZ2V0VGFibGVOYW1lKCksIG51bGwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6ZWRCb29sZWFuKFN0cmluZyBwcm9wTmFtZSwgYm9vbGVhbiB2YWx1ZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKLQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSB2YWx1ZSkgewotCQkJc2V0Q3VzdG9taXplZChwcm9wTmFtZSwgbnVsbCk7IC8vIHJlbW92ZSB0aGUgcHJvcGVydHkKLQkJfQotCQllbHNlIHsKLQkJCWdldEN1c3RvbWl6ZXIoKS5zZXRCb29sZWFuUHJvcGVydHkocHJvcE5hbWUsIHZhbHVlLCBnZXRUYWJsZU5hbWUoKSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuIG1EYlRhYmxlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRhYmxlIG5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWJsZU5hbWUoKSB7Ci0JCXJldHVybiBtRGJUYWJsZSAhPSBudWxsID8gbURiVGFibGUuZ2V0TmFtZSgpIDogT1JNR2VuQ3VzdG9taXplci5BTllfVEFCTEU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAJCWlmIChtRGJUYWJsZSA9PSBudWxsKQotIAkJCXJldHVybiBPUk1HZW5DdXN0b21pemVyLkFOWV9UQUJMRTsKLQkJU3RyaW5nIHRhYmxlTmFtZSA9IGdldFRhYmxlTmFtZSgpOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKHRhYmxlTmFtZSwgbURiVGFibGUpOwotCQlyZXR1cm4gYW5ub3RhdGlvbk5hbWUgIT0gbnVsbCA/IGFubm90YXRpb25OYW1lIDogdGFibGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Sm9pblRhYmxlQW5ub3RhdGlvbk5hbWUoKSB7Ci0JCWlmIChtRGJUYWJsZSA9PSBudWxsKQotCQkJcmV0dXJuIE9STUdlbkN1c3RvbWl6ZXIuQU5ZX1RBQkxFOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShtRGJUYWJsZSk7Ci0JCXJldHVybiBhbm5vdGF0aW9uTmFtZSAhPSBudWxsID8gYW5ub3RhdGlvbk5hbWUgOiBtRGJUYWJsZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGF0YWJhc2Ugc2NoZW1hIGNvbnRhaW5pbmcgdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2NoZW1hKCkgewotCQlpZiAoRFRQVXRpbC5pc0RlZmF1bHRTY2hlbWEobURiVGFibGUpIHx8IG1EYlRhYmxlLmdldFNjaGVtYSgpPT1udWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzY2hlbWFOYW1lID0gbURiVGFibGUuZ2V0U2NoZW1hKCkuZ2V0TmFtZSgpOwotCQlyZXR1cm4gc2NoZW1hTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VGb2xkZXIoU3RyaW5nIHNyY0ZvbGRlcil7Ci0JCXNldEN1c3RvbWl6ZWQoU1JDX0ZPTERFUiwgc3JjRm9sZGVyKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2VGb2xkZXIoKXsKLQkJU3RyaW5nIHNyY0ZvbGRlciA9IGN1c3RvbWl6ZWQoU1JDX0ZPTERFUik7Ci0JCXJldHVybiBzcmNGb2xkZXIgPT0gbnVsbCA/ICIiIDogc3JjRm9sZGVyOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEltcG9ydFN0YXRlbWVudHMoKXsKLQkJYnVpbGRDb2x1bW5UeXBlc01hcCgpOwotCQlDb2xsZWN0aW9uPFN0cmluZz4gcGFja2FnZXMgPSBjb2x1bW5UeXBlc01hcC5rZXlTZXQoKTsKLQkJU3RyaW5nQnVpbGRlciByZXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKCBTdHJpbmcgcyA6IHBhY2thZ2VzICkgewotCQkJcmV0LmFwcGVuZCggImltcG9ydCAiICsgcyArICI7XG4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJTGlzdDxBc3NvY2lhdGlvblJvbGU+IGFzc29jaWF0aW9uUm9sZXMgPSBnZXRBc3NvY2lhdGlvblJvbGVzKCk7Ci0JCWZvciAoIEFzc29jaWF0aW9uUm9sZSByb2xlIDogIGFzc29jaWF0aW9uUm9sZXMgKSB7Ci0JCQlpZiAoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZICkKLQkJCQkJfHwgcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZICkgKSB7Ci0JCQkJcmV0LmFwcGVuZCggImltcG9ydCAiICsgZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCkgKyAiO1xuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHJldC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBDb25zdHJ1Y3QgaW1wb3J0IHN0YXRlbWVudHMgZm9yIHR5cGVzIGZyb20gamF2YXgucGVyc2lzdGVuY2UgcGFja2FnZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKYXZheFBlcnNpc3RlbmNlSW1wb3J0U3RhdGVtZW50cygpIHsKLQkJU3RyaW5nQnVpbGRlciByZXQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTtcbiIpOyAvLyROT04tTkxTLTEkCi0JCS8vVE9ETzogb25seSBpZiBAQ29sdW1ucyBpcyBuZWVkZWQKLQkJcmV0LmFwcGVuZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47XG4iKTsvLyROT04tTkxTLTEkCi0JCS8vVE9ETzogb25seSBpZiB0aGVyZSBpcyBASWQKLQkJcmV0LmFwcGVuZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDtcbiIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoICF0aGlzLmlzRGVmYXVsdG5hbWUoKSApCi0JCQlyZXQuYXBwZW5kKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlO1xuIik7Ly8kTk9OLU5MUy0xJAotCQlpZiggdGhpcy5pc0NvbXBvc2l0ZUtleSgpICkKLQkJCXJldC5hcHBlbmQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWRJZDtcbiIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGFwcGVuZCBqYXZheC5wZXJzaXN0ZW5jZSBwYWNrYWdlIGltcG9ydHMKLQkJSGFzaFNldDxTdHJpbmc+IGpwYUltcG9ydHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IAotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gYXNzb2NpYXRpb25Sb2xlcyA9IGdldEFzc29jaWF0aW9uUm9sZXMoKTsKLQkJZm9yKCBBc3NvY2lhdGlvblJvbGUgcm9sZSA6ICBhc3NvY2lhdGlvblJvbGVzICl7Ci0JCQlpZiggcm9sZS5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uT05FX1RPX09ORSApICl7Ci0JCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmU7IiApOy8vJE5PTi1OTFMtMSQKLQkJCX1lbHNlewotCQkJCWlmKCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWSApICl7Ci0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk9uZVRvTWFueTtcbiIgKTsvLyROT04tTkxTLTEkCi0JCQkJfWVsc2UgaWYoIHJvbGUuZ2V0Q2FyZGluYWxpdHkoKS5lcXVhbHMoIEFzc29jaWF0aW9uLk1BTllfVE9fT05FICkgKXsKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lO1xuIiApOy8vJE5PTi1OTFMtMSQKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjtcbiIgKTsgLy8kTk9OLU5MUy0xJAotCQkJCX1lbHNlIGlmKCByb2xlLmdldENhcmRpbmFsaXR5KCkuZXF1YWxzKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkgKSApewotCQkJCQlqcGFJbXBvcnRzLmFkZCggImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9NYW55O1xuIiApOy8vJE5PTi1OTFMtMSQKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pblRhYmxlO1xuIiApOy8vJE5PTi1OTFMtMSQKLQkJCQkJanBhSW1wb3J0cy5hZGQoICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbnM7XG4iKTsvLyROT04tTkxTLTEkCi0JCQkJCWpwYUltcG9ydHMuYWRkKCAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW47XG4iICk7Ly8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlmb3IoIFN0cmluZyBzOiBqcGFJbXBvcnRzKXsKLQkJCXJldC5hcHBlbmQocyk7Ci0JCX0KLQkJcmV0dXJuIHJldC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBidWlsZENvbHVtblR5cGVzTWFwKCl7Ci0JCWlmICggY29sdW1uVHlwZXNNYXAgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNvbHVtblR5cGVzTWFwOwotCQl9Ci0JCWNvbHVtblR5cGVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCWZvciAoIE9STUdlbkNvbHVtbiBjb2wgOiB0aGlzLmdldENvbHVtbnMoKSApIHsKLQkJCVN0cmluZyB0eXBlID0gY29sLmdldFByb3BlcnR5VHlwZSgpOwotCQkJaWYgKCAhY29sLmlzUGFydE9mQ29tcG9zaXRlUHJpbWFyeUtleSgpCi0JCQkJCSYmICFjb2wuaXNGb3JlaWduS2V5KCkKLQkJCQkJJiYgIXR5cGUuc3RhcnRzV2l0aCgiamF2YS5sYW5nIikgJiYgdHlwZS5pbmRleE9mKCcuJyk+MCApIHsKLQkJCQlTdHJpbmcgc2ltcGxlVHlwZT0gdHlwZS5zdWJzdHJpbmcoIHR5cGUubGFzdEluZGV4T2YoJy4nKSsxICk7Ci0JCQkJY29sdW1uVHlwZXNNYXAucHV0KHR5cGUsIHNpbXBsZVR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb2x1bW5UeXBlc01hcDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRTaW1wbGlmaWVkQ29sVHlwZShTdHJpbmcgZnF0biApIHsKLQkJSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gYnVpbGRDb2x1bW5UeXBlc01hcCgpOwotCQlTdHJpbmcgdHlwZU5hbWUgPSBtYXAuZ2V0KGZxdG4pOwotCQlpZiAoICB0eXBlTmFtZSAhPSBudWxsICkgewotCQkJcmV0dXJuIHR5cGVOYW1lOwotCQl9Ci0JCXJldHVybiBmcXRuOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIHRoZSBwYWNrYWdlIGZvciB0aGUgZ2VuZXJhdGVkIGNsYXNzIChlbXB0eSBzdHJpbmcgZm9yIHRoZSBkZWZhdWx0Ci0JICogcGFja2FnZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrYWdlKFN0cmluZyBwa2cpIHsKLQkJZ2V0Q3VzdG9taXplcigpLnNldFByb3BlcnR5KFBBQ0tBR0UsIHBrZywgZ2V0TmFtZSgpLCBudWxsKTsgCi0JCS8vIG5vdCBjYWxsaW5nIHNldEN1c3RvbWl6ZWQgc28gdGhhdCBlbXB0eSBzdHJpbmdzIGRvIG5vdCBnZXQgbnVsbGVkIG91dC4KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKYXZhIHBhY2thZ2UgKGVtcHR5IHN0cmluZyBmb3IgdGhlIGRlZmF1bHQgcGFja2FnZSkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkgewotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBjdXN0b21pemVkKFBBQ0tBR0UpOwotCQlyZXR1cm4gcGFja2FnZU5hbWUgPT0gbnVsbCA/ICIiIDogcGFja2FnZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnZW5lcmF0ZWQgSmF2YSBjbGFzcyBuYW1lIChub3QgcXVhbGlmaWVkKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBjdXN0b21pemVkKENMQVNTX05BTUUpOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkvLyBuYW1lID0gU3RyaW5nVXRpbC50YWJsZU5hbWVUb1Zhck5hbWUoZ2V0TmFtZSgpKTsKLQkJCS8vIG5hbWUgPSBTdHJpbmdVdGlsLmluaXRVcHBlcihuYW1lKTsKLQkJCW5hbWUgPSBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoZ2V0VGFibGVOYW1lKCksIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpKTsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnNpbmd1bGFyaXNlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCS8qCi0JCSAqIGlmIHRoZSBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSAocG9zc2libHkgY29tcHV0ZWQpIGNsYXNzIG5hbWUKLQkJICogdGhlbiBub3RoaW5nIHRvIGRvCi0JCSAqLwotCQlpZiAoIVN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKGNsYXNzTmFtZSwgZ2V0Q2xhc3NOYW1lKCkpKSB7Ci0JCQlzZXRDdXN0b21pemVkKENMQVNTX05BTUUsIGNsYXNzTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmFtZSBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGEgdmFyaWFibGUgb3IgY2xhc3MgbmFtZS4gVGhpcyBpcwotCSAqIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSB0YWJsZSBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBzaW5ndWxhcgotCSAqICAgICAgICAgICAgV2hldGhlciB0aGUgbmFtZSBzaG91bGQgYmUgc2luZ3VsYXIgb3IgcGx1cmFsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFyTmFtZShib29sZWFuIHNpbmd1bGFyKSB7Ci0JCVN0cmluZyBuYW1lID0gU3RyaW5nVXRpbC50YWJsZU5hbWVUb1Zhck5hbWUoZ2V0VGFibGVOYW1lKCkpOwotCQlpZiAoc2luZ3VsYXIpIHsKLQkJCW5hbWUgPSBTdHJpbmdVdGlsLnNpbmd1bGFyaXNlKG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJbmFtZSA9IFN0cmluZ1V0aWwucGx1cmFsaXNlKG5hbWUpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBnZW5lcmF0ZWQgSmF2YSBjbGFzcyBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gcXVhbGlmeShnZXRDbGFzc05hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcG9zaXRlIGtleSBKYXZhIGNsYXNzIG5hbWUgKG5vdCBxdWFsaWZpZWQpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9zaXRlS2V5Q2xhc3NOYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGN1c3RvbWl6ZWQoQ09NUE9TSVRFX0tFWV9DTEFTU19OQU1FKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJbmFtZSA9IGdldENsYXNzTmFtZSgpICsgIlBLIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBjb21wb3NpdGUga2V5IEphdmEgY2xhc3MgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZENvbXBvc2l0ZUtleUNsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIHF1YWxpZnkoZ2V0Q29tcG9zaXRlS2V5Q2xhc3NOYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbXBvc2l0ZSBrZXkgcHJvcGVydHkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbXBvc2l0ZUtleVByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuICJpZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgdG8gYmUgZ2VuZXJhdGVkIGZvciB0aGlzCi0JICogdGFibGUuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRDb2x1bW5zKCkgewotCQlpZiAobUNvbHVtbnMgPT0gbnVsbCkgewotCQkJbUNvbHVtbnMgPSBuZXcgQXJyYXlMaXN0PE9STUdlbkNvbHVtbj4oKTsKLQkJCWZvciAoQ29sdW1uIGMgOiBtRGJUYWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCQlPUk1HZW5Db2x1bW4gZ2VuQ29sdW1uID0gZ2V0Q3VzdG9taXplcigpLmNyZWF0ZUdlbkNvbHVtbihjKTsKLQkJCQlnZW5Db2x1bW4uc2V0R2VuVGFibGUodGhpcyk7Ci0JCQkJbUNvbHVtbnMuYWRkKGdlbkNvbHVtbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1Db2x1bW5zOwotCX0KLQotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0Q29sdW1uTmFtZXMoKSB7Ci0JCUxpc3Q8U3RyaW5nPiByZXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJZm9yIChDb2x1bW4gYyA6IG1EYlRhYmxlLmdldENvbHVtbnMoKSkgewotCQkJcmV0LmFkZChjLmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5PUk1HZW5Db2x1bW48L2NvZGU+IG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSB0YWJsZSdzCi0JICogcHJpbWFyeSBrZXkuCi0JICovCi0JcHVibGljIExpc3Q8T1JNR2VuQ29sdW1uPiBnZXRQcmltYXJ5S2V5Q29sdW1ucygpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IHJldCA9IG5ldyBBcnJheUxpc3Q8T1JNR2VuQ29sdW1uPigpOwotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiBtRGJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1ucygpKSB7Ci0JCQlyZXQuYWRkKG5ldyBPUk1HZW5Db2x1bW4oY29sdW1uLCB0aGlzLm1DdXN0b21pemVyKSk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcmltYXJ5IGtleSBjb2x1bW4gb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBvciBtYW55IHByaW1hcnkga2V5Ci0JICogY29sdW1ucy4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldFByaW1hcnlLZXlDb2x1bW4oKSB7Ci0JCU9STUdlbkNvbHVtbiBwa0NvbCA9IG51bGw7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBwa0NvbHVtbnMgPSBnZXRQcmltYXJ5S2V5Q29sdW1ucygpOwotCQlpZiAocGtDb2x1bW5zLnNpemUoKSA9PSAxKSB7Ci0JCQkvLyBDb2x1bW4gZGJDb2wgPSAoQ29sdW1uKXBrQ29sdW1ucy5nZXQoMCk7Ci0JCQlwa0NvbCA9IHBrQ29sdW1ucy5nZXQoMCk7IC8vIChPUk1HZW5Db2x1bW4pCi0JCQkJCQkJCQkJLy8gbUN1c3RvbWl6ZXIuY3JlYXRlR2VuQ29sdW1uKGRiQ29sKTsKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBpZiBubyBwayBjb2x1bW4gdGhlbiBsb29rIGZvciB0aGUgZmlyc3QgY29sdW1uIHdpdGggaWQgbWFwcGluZwotCQkJICoga2luZC4gVGhpcyBpcyBzbyB0aGF0IHRoZSB3aXphcmQgY2FuIGJlIHVzZWQgd2l0aCB0YWJsZXMgbm90Ci0JCQkgKiBoYXZpbmcgcHJpbWFyeSBrZXlzLgotCQkJICovCi0JCQlMaXN0PE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IGdldENvbHVtbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCQlPUk1HZW5Db2x1bW4gY29sdW1uID0gY29sdW1ucy5nZXQoaSk7Ci0JCQkJaWYgKGNvbHVtbi5nZXRNYXBwaW5nS2luZCgpLmVxdWFscyhtQ3VzdG9taXplci5nZXRJZE1hcHBpbmdLaW5kKCkpKSB7Ci0JCQkJCXBrQ29sID0gY29sdW1uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBrQ29sOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBwayBjb2x1bW4uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3NpdGVLZXkoKSB7Ci0JCXJldHVybiBtRGJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+IDE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIGZvciB0aGUgdGhlIGNvbHVtbnMgdGhhdAotCSAqIGFyZSBub3QgcGFydCBvZiBhbnkgYXNzb2NpYXRpb24uCi0JICogCi0JICogQHBhcmFtIGdlbk9ubHkKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdG8gaW5jbHVkZSBvbmx5IHRoZSBjb2x1bW5zIG1hcmtlZCBmb3IgZ2VuZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5jbHVkZVBrCi0JICogICAgICAgICAgICBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIHByaW1hcnkga2xleSBjb2x1bW4ocykuCi0JICogCi0JICogQHBhcmFtIGluY2x1ZGVJbmhlcml0ZWQKLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgY29sdW1ucyBhc3NvY2lhdGVkIHdpdGggSmF2YSBwcm9wZXJ0aWVzCi0JICogICAgICAgICAgICB0aGF0IGV4aXN0IGluIHRoZSBzdXBlciBjbGFzcyAoaWYgYW55KS4KLQkgKi8KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFNpbXBsZUNvbHVtbnMoYm9vbGVhbiBnZW5Pbmx5LCBib29sZWFuIGluY2x1ZGVQaywgYm9vbGVhbiBpbmNsdWRlSW5oZXJpdGVkKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gZ2V0Q29sdW1ucygpOwotCQlMaXN0PEFzc29jaWF0aW9uUm9sZT4gcm9sZXMgPSBnZXRBc3NvY2lhdGlvblJvbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChnZW5Pbmx5ICYmICFjb2x1bW4uaXNHZW5lcmF0ZWQoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNvbHVtbi5pc1ByaW1hcnlLZXkoKSkgewotCQkJCWlmICghaW5jbHVkZVBrIHx8IGlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0LmFkZCgwLCBjb2x1bW4pOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0NvbHVtbkluQXNzY29jaWF0aW9uKGNvbHVtbiwgcm9sZXMpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXN1bHQuYWRkKGNvbHVtbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgTGlzdDxPUk1HZW5Db2x1bW4+IGdldFNpbXBsZUNvbHVtbnMoKSB7Ci0JCXJldHVybiBnZXRTaW1wbGVDb2x1bW5zKHRydWUvKiBnZW5Pbmx5ICovLCB0cnVlLyogaW5jbHVkZVBrICovLCB0cnVlLyogaW5jbHVkZUluaGVyaXRlZCAqLyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZ2l2ZW4gY29sdW1uIHNob3VsZCBiZSBnZW5lcmF0ZWQgd2l0aCBmYWxzZQotCSAqIHVwZGF0YWJsZS9pbnNlcnRhYmxlLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlIGNvbHVtbiBpcyBtYXBwZWQgbW9yZQotCSAqIHRoYW4gb25jZSwgdGhpcyB1c3VhbGx5IGhhcHBlbiB3aXRoIGNvbHVtbnMgaW4gY29tcG9zaXRlIGtleXMgYW5kCi0JICogbWFueS10by1vbmUgYXNzb2NpYXRpb25zLgotCSAqIAotCSAqIDxicj4KLQkgKiBOb3RlIHRoYXQgZm9yIEhpYmVybmF0ZSB0aGUgY29sdW1uIHBhcmFtIGlzIG51bGwgYmVjYXVzZSB0aGUKLQkgKiBpbnNlcnQvdXBkYXRlIGF0dHJpYnV0ZXMgYXJlIHNwZWNpZmllZCBmb3IgdGhlIG1hbnktdG8tb25lIHRhZyBpdHNlbGYKLQkgKiBpbnN0ZWFkIG9mIHRoZSBuZXN0ZWQgY29sdW1uIHRhZ3MgKGJvZ3VzIG9idmlvdXNseSkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb2x1bW5VcGRhdGVJbnNlcnQoQXNzb2NpYXRpb25Sb2xlIHJvbGUsIE9STUdlbkNvbHVtbiBjb2x1bW4pIHsKLQkJaWYgKGNvbHVtbiA9PSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yPE9STUdlbkNvbHVtbj4gaXRlciA9IHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW5zKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJT1JNR2VuQ29sdW1uIGMgPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoIWlzQ29sdW1uVXBkYXRlSW5zZXJ0KHJvbGUsIGMpKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoY29sdW1uLmlzUHJpbWFyeUtleSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJLyoKLQkJICogc2hvdWxkIGxvb2sgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGFzc29jaWF0aW9ucyB1c2luZyB0aGUgc2FtZSBjb2x1bW4KLQkJICogYW5kIHJldHVybiBmYWxzZSwgYnV0IHRoaXMgaXMgcHJvYmFibHkgYW4gdW51c3VhbCBjYXNlLgotCQkgKi8KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+T1JNR2VuQ29sdW1uPC9jb2RlPiBvYmplY3RzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCi0JICogY29sdW1uIG5hbWVzLgotCSAqLwotCXB1YmxpYyBMaXN0PE9STUdlbkNvbHVtbj4gZ2V0Q29sdW1uc0J5TmFtZXMoTGlzdDxTdHJpbmc+IG5hbWVzKSB7Ci0JCUxpc3Q8T1JNR2VuQ29sdW1uPiByZXN1bHQgPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCWZvciAoU3RyaW5nIG5hbWUgOiBuYW1lcykgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGdldENvbHVtbkJ5TmFtZShuYW1lKTsKLQkJCWFzc2VydCAoY29sdW1uICE9IG51bGwpOwotCQkJaWYgKGNvbHVtbiAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChjb2x1bW4pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sdW1ucyBoYXZpbmcgdGhlIGdpdmVuIG5hbWUsIG9yIG51bGwgaWYgbm9uZS4KLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ29sdW1uIGdldENvbHVtbkJ5TmFtZShTdHJpbmcgbmFtZSkgewotCQlMaXN0PE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IGdldENvbHVtbnMoKTsKLQkJZm9yIChpbnQgaSA9IDAsIG4gPSBjb2x1bW5zLnNpemUoKTsgaSA8IG47ICsraSkgewotCQkJT1JNR2VuQ29sdW1uIGNvbHVtbiA9IGNvbHVtbnMuZ2V0KGkpOwotCQkJaWYgKGNvbHVtbi5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIGNvbHVtbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5Bc3NvY2lhdGlvblJvbGU8L2NvZGU+IG9iamVjdHMgZm9yIHRoaXMgdGFibGUuIE9ubHkgdGhlCi0JICogYXNzb2NpYXRpb24gbWFya2VkIGZvciBnZW5lcmF0aW9uIGFyZSByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgTGlzdDxBc3NvY2lhdGlvblJvbGU+IGdldEFzc29jaWF0aW9uUm9sZXMoKSB7Ci0JCS8qCi0JCSAqIHRoaXMgaXMgbm90IGNhY2hlZCBpbnRlbnRpb25hbGx5IGJlY2F1c2UgaW52YWxpZGF0aW5nIHRoZSBjYWNoZSB3aXRoCi0JCSAqIHdpemFyZCBjaGFuZ2VzIGlzIGtpbmRhIHRyaWNreS4KLQkJICovCi0JCUxpc3Q8QXNzb2NpYXRpb25Sb2xlPiBhc3NvY2lhdGlvblJvbGVzID0gbmV3IEFycmF5TGlzdDxBc3NvY2lhdGlvblJvbGU+KCk7Ci0JCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnMgPSBtQ3VzdG9taXplci5nZXRBc3NvY2lhdGlvbnMoKTsKLQkJZm9yIChJdGVyYXRvcjxBc3NvY2lhdGlvbj4gaXRlciA9IGFzc29jaWF0aW9ucy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWFzc29jaWF0aW9uLmlzR2VuZXJhdGVkKCkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBjaGVjayBib3RoIHJlZmVycmVyYW5kIHJlZmVyZW5jZWQgYmVjYXVzZSBhbiBhc3NvY2lhdGlvbiBjb3VsZCBiZQotCQkJICogZnJvbS10byB0aGUgc2FtZSB0YWJsZSAoZW1wbG95ZWUvbWFuYWdlcikKLQkJCSAqLwotCQkJaWYgKGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKTsKLQkJCQlpZiAocm9sZSAhPSBudWxsKSB7Ci0JCQkJCWFzc29jaWF0aW9uUm9sZXMuYWRkKHJvbGUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJQXNzb2NpYXRpb25Sb2xlIHJvbGUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpOwotCQkJCWlmIChyb2xlICE9IG51bGwpIHsKLQkJCQkJYXNzb2NpYXRpb25Sb2xlcy5hZGQocm9sZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhc3NvY2lhdGlvblJvbGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGN1c3RvbWl6ZWQoQ0xBU1NfREVTQyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNjb3BlLCBvbmUgb2Yge0BsaW5rICNQVUJMSUNfU0NPUEV9fAotCSAqIHtAbGluayAjUFJPVEVDVEVEX1NDT1BFfSB8e0BsaW5rICNQUklWQVRFX1NDT1BFfS4gVGhpcyBtZXRob2QgbmV2ZXIKLQkgKiByZXR1cm5zIG51bGwgKGRlZmF1bHRzIHRvIHB1YmxpYykuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc1Njb3BlKCkgewotCQlTdHJpbmcgc2NvcGUgPSBjdXN0b21pemVkKENMQVNTX1NDT1BFKTsKLQkJaWYgKHNjb3BlID09IG51bGwpIHsKLQkJCXNjb3BlID0gUFVCTElDX1NDT1BFOwotCQl9Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEV4dGVuZHMoKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKEVYVEVORFMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVuZHMoU3RyaW5nIGJhc2VDbGFzcykgewotCQlzZXRDdXN0b21pemVkKEVYVEVORFMsIGJhc2VDbGFzcyk7Ci0JfQotCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRJbXBsZW1lbnRzKCkgewotCQlTdHJpbmcgc3RyID0gY3VzdG9taXplZChJTVBMRU1FTlRTKTsKLQkJTGlzdDxTdHJpbmc+IHJlc3VsdCA9IFN0cmluZ1V0aWwuc3RyVG9MaXN0KHN0ciwgJywnLCB0cnVlLyogdHJpbSAqLyk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbXBsZW1lbnRzKExpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzKSB7Ci0JCXNldEN1c3RvbWl6ZWQoSU1QTEVNRU5UUywgU3RyaW5nVXRpbC5saXN0VG9TdHIoaW50ZXJmYWNlcywgJywnKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RyaW5nIHRoYXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiB0aGUgSmF2YSBjbGFzcyBmb3IgZXh0ZW5kcwotCSAqIGFuZCBpbXBsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFeHRlbmRzSW1wbGVtZW50cygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIGV4dGVuZHNDbGFzcyA9IGdldEV4dGVuZHMoKTsKLQkJaWYgKGV4dGVuZHNDbGFzcyAhPSBudWxsICYmICFleHRlbmRzQ2xhc3MuZXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IikgJiYgIWV4dGVuZHNDbGFzcy5lcXVhbHMoIk9iamVjdCIpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCJleHRlbmRzICIgKyBzaW1wbGlmeUNsYXNzTmFtZShleHRlbmRzQ2xhc3MpICsgIiAiKTsgLy9maXggZm9yIGJ1ZyAyNzg2MjYKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSIpOyAvLyBhc3N1bWluZyB0aGF0IHRoZSBKYXZhCi0JCQkJCQkJCQkJCQkJLy8gZmlsZSB0ZW1wbGF0ZSBpbXBvcnRzIHRoZQotCQkJCQkJCQkJCQkJCS8vIGphdmEuaW8uU2VyaWFsaXphYmxlCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gZ2V0SW1wbGVtZW50cygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJYnVmZmVyLmFwcGVuZCgiLCAiICsgc2ltcGxpZnlDbGFzc05hbWUoaXRlci5uZXh0KCkpKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgc2ltcGxpZnlDbGFzc05hbWUoU3RyaW5nIGZ1bGxDbGFzc05hbWUpIHsKLQkJZmluYWwgU3RyaW5nIEpBVkFfTEFORyA9ICJqYXZhLmxhbmcuIjsKLQkJaWYgKGZ1bGxDbGFzc05hbWUuc3RhcnRzV2l0aChKQVZBX0xBTkcpKSB7Ci0JCQlyZXR1cm4gZnVsbENsYXNzTmFtZS5zdWJzdHJpbmcoSkFWQV9MQU5HLmxlbmd0aCgpKTsKLQkJfQotCQlTdHJpbmcgcGtnID0gU3RyaW5nVXRpbC5nZXRQYWNrYWdlTmFtZShmdWxsQ2xhc3NOYW1lKTsKLQkJaWYgKHBrZyAhPSBudWxsICYmIFN0cmluZ1V0aWwuZXF1YWxPYmplY3RzKHBrZywgZ2V0UGFja2FnZSgpKSkgewotCQkJcmV0dXJuIFN0cmluZ1V0aWwuZ2V0Q2xhc3NOYW1lKGZ1bGxDbGFzc05hbWUpOwotCQl9Ci0JCXJldHVybiBmdWxsQ2xhc3NOYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIGdlbmVyYXRvciBzY2hlbWUgKGFzc2lnbmVkLCBzZXF1ZW5jZSwgZXRjKS4gRG9lcyBub3QKLQkgKiByZXR1cm4gbnVsbCwgZGVmYXVsdHMgdG8gImFzc2lnbmVkIiBvciAiaWRlbnRpdHkiIGRlcGVuZGluZyBvbiB3aGV0aGVyCi0JICogdGhlIHRhYmxlIGhhcyBhbiBpZGVudGl0eSBjb2x1bW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZEdlbmVyYXRvcigpIHsKLQkJU3RyaW5nIGdlbmVyYXRvciA9IGN1c3RvbWl6ZWQoSURfR0VORVJBVE9SKTsKLQkJU3RyaW5nIG5vbmVHZW5lcmF0b3IgPSBnZXRDdXN0b21pemVyKCkuZ2V0Tm9JZEdlbmVyYXRvcigpOwotCQlpZiAoIWlzRGVmYXVsdHNUYWJsZSgpKSB7Ci0JCQkvKgotCQkJICogVGhpcyBpcyBkb25lIG1haW5seSBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIGNhc2VzIHdoZXJlIHNvbWUKLQkJCSAqIHRhYmxlcyBoYXZlIGF1dG9pbmN0ZW1lbnQgcGsgYW5kIG90aGVycyBhcmUgYXNzaWduZWQuIEluIHRoaXMKLQkJCSAqIGNhc2UgdGhpcyBtYWtlcyBpdCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgYSAibm9uZSIKLQkJCSAqIGRlZmF1bHQgdmFsdWUgdGhhdCBpcyBpbnRlcnByZXRlZCBkZXBlbmRpbmcgb24gdGhlIGNhc2UuCi0JCQkgKi8KLQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCB8fCBnZW5lcmF0b3IuZXF1YWxzKG5vbmVHZW5lcmF0b3IpKSB7Ci0JCQkJT1JNR2VuQ29sdW1uIHBrQ29sdW1uID0gZ2V0UHJpbWFyeUtleUNvbHVtbigpOwotCQkJCWlmIChwa0NvbHVtbiAhPSBudWxsICYmIERUUFV0aWwuaXNBdXRvSW5jcmVtZW50KHBrQ29sdW1uLmdldERiQ29sdW1uKCkpKSB7Ci0JCQkJCWdlbmVyYXRvciA9IGdldEN1c3RvbWl6ZXIoKS5nZXRJZGVudGl0eUlkR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJZ2VuZXJhdG9yID0gbm9uZUdlbmVyYXRvcjsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGlkIGdlbmVyYXRvciBzY2hlbWUgKGFzc2lnbmVkLCBzZXF1ZW5jZSwgZXRjKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEdlbmVyYXRvcihTdHJpbmcgc2NoZW1lKSB7Ci0JCXNldEN1c3RvbWl6ZWQoSURfR0VORVJBVE9SLCBzY2hlbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcXVlbmNlIG5hbWUgZm9yIHRoZSBnaXZlbiB0YWJsZSwgb3IgbnVsbCBpZiBub25lIChtYWtlcwotCSAqIHNlbnNlIG9ubHkgd2hlbiB0aGUgc2NoZW1lIGlzIG5hdGl2ZSwgc2VxdWVuY2UsIC4uKS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcXVlbmNlKCkgewotCQlyZXR1cm4gY3VzdG9taXplZChTRVFVRU5DRSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2VxdWVuY2UoU3RyaW5nIG5hbWUpIHsKLQkJc2V0Q3VzdG9taXplZChTRVFVRU5DRSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2VxdWVuY2UgbmFtZSBhZnRlciByZXBsYWNpbmcgdGhlICR7dGFibGV9IGFuZCAke3BrfSBieSB0aGVpcgotCSAqIHZhbHVlcywgb3IgbnVsbCBpZiBub25lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9ybWF0dGVkU2VxdWVuY2UoKSB7Ci0JCVN0cmluZyBzZXF1ZW5jZSA9IGdldFNlcXVlbmNlKCk7Ci0JCWlmIChzZXF1ZW5jZSAhPSBudWxsKSB7Ci0JCQkvKiByZXNvbHZlIHRoZSAke3RhYmxlfSBhbmQgJHtwa30gcGF0dGVybnMgKi8KLQkJCXNlcXVlbmNlID0gU3RyaW5nVXRpbC5zdHJSZXBsYWNlKHNlcXVlbmNlLCBUQUJMRV9TRVFfUEFUVEVSTiwgZ2V0TmFtZSgpKTsKLQkJCWlmIChzZXF1ZW5jZS5pbmRleE9mKFBLX1NFUV9QQVRURVJOKSA+PSAwKSB7Ci0JCQkJSXRlcmF0b3I8Q29sdW1uPiBwa0NvbHMgPSBnZXREYlRhYmxlKCkuZ2V0UHJpbWFyeUtleUNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQkJCVN0cmluZyBwa05hbWUgPSBwa0NvbHMuaGFzTmV4dCgpID8gcGtDb2xzLm5leHQoKS5nZXROYW1lKCkgOiBudWxsOwotCQkJCXNlcXVlbmNlID0gU3RyaW5nVXRpbC5zdHJSZXBsYWNlKHNlcXVlbmNlLCBQS19TRVFfUEFUVEVSTiwgcGtOYW1lKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2VxdWVuY2UgIT0gbnVsbCA/IHNlcXVlbmNlLnRvVXBwZXJDYXNlKCkgOiAiIjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ltcGxlbWVudEVxdWFscygpIHsKLQkJcmV0dXJuICEidHJ1ZSIuZXF1YWxzKGN1c3RvbWl6ZWQoSU1QTEVNRU5UX0VRVUFMUykpOyAvLyBkZWZhdWx0cyB0bwotCQkJCQkJCQkJCQkJCQkJCS8vIGZhbHNlCi0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1wbGVtZW50RXF1YWxzKGJvb2xlYW4gdmFsdWUpIHsKLQkJc2V0Q3VzdG9taXplZEJvb2xlYW4oSU1QTEVNRU5UX0VRVUFMUywgdmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbnkgY29sdW1uIHBhcnRpY2lwYXRpbmcgaW4gZXF1YWxzL2hhc2hjb2RlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NvbHVtbnNJbkVxdWFscygpIHsKLQkJTGlzdDxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSBnZXRTaW1wbGVDb2x1bW5zKCk7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gY29sdW1ucy5zaXplKCk7IGkgPCBuOyArK2kpIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBjb2x1bW5zLmdldChpKTsKLQkJCWlmIChjb2x1bW4uaXNVc2VJbkVxdWFscygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMge0BsaW5rICNHRU5FUkFURV9ERExfQU5OT1RBVElPTn0gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBvcHRpb25hbAotCSAqIERETCBwYXJhbWV0ZXJzIGxpa2UgbGVuZ3RoLCBudWxsYWJsZSwgdW5xaXVlLCBldGMgc2hvdWxkIGJlIGdlbmVyYXRlZCBpbiBAQ29sdW1uCi0JICogYW5ub3RhdGlvbi4gZGVmYXVsdHMgdG8gZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHZW5lcmF0ZURETEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gInRydWUiLmVxdWFscyhjdXN0b21pemVkKE9STUdlbkN1c3RvbWl6ZXIuR0VORVJBVEVfRERMX0FOTk9UQVRJT04pKTsgLy8gZGVmYXVsdHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmYWxzZQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRlRERMQW5ub3RhdGlvbnMoYm9vbGVhbiBnZW5lcmF0ZSkgewotCQlzZXRDdXN0b21pemVkQm9vbGVhbihPUk1HZW5DdXN0b21pemVyLkdFTkVSQVRFX0RETF9BTk5PVEFUSU9OLCBnZW5lcmF0ZSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHtAbGluayAjUFJPUEVSVFlfQUNDRVNTfXx7QGxpbmsgI0ZJRUxEX0FDQ0VTU30gaW5kaWNhdGluZwotCSAqIGhvdyB0aGUgZW50aXR5IHByb3BlcnRpZXMgYXJlIG1hcHBlZC4gRG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvCi0JICoge0BsaW5rICNGSUVMRF9BQ0NFU1N9KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjY2VzcygpIHsKLQkJU3RyaW5nIG5hbWUgPSBjdXN0b21pemVkKEFDQ0VTUyk7Ci0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBGSUVMRF9BQ0NFU1M7Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWNjZXNzKFN0cmluZyBhY2Nlc3MpIHsKLQkJYXNzZXJ0IChhY2Nlc3MgPT0gbnVsbCB8fCBhY2Nlc3MuZXF1YWxzKFBST1BFUlRZX0FDQ0VTUykgfHwgYWNjZXNzLmVxdWFscyhGSUVMRF9BQ0NFU1MpKTsKLQkJaWYgKCFTdHJpbmdVdGlsLmVxdWFsT2JqZWN0cyhhY2Nlc3MsIGdldEFjY2VzcygpKSkgewotCQkJc2V0Q3VzdG9taXplZChBQ0NFU1MsIGFjY2Vzcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG9uZSBvZiB7QGxpbmsgI0xBWllfRkVUQ0h9fHtAbGluayAjRUFHRVJfRkVUQ0h9IGluZGljYXRpbmcgaG93Ci0JICogdGhlIHRhYmxlIGFzc29jaWF0aW9ucyBhcmUgZmVjaGVkLiBSZXR1cm5zIG51bGwgaWYgdGhlIHByb3ZpZGVyIGRlZmF1bHRzCi0JICogc2hvdWxkIGJlIHVzZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0RmV0Y2goKSB7Ci0JCXJldHVybiBjdXN0b21pemVkKERFRkFVTFRfRkVUQ0gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGZXRjaChTdHJpbmcgZmV0Y2gpIHsKLQkJYXNzZXJ0IChmZXRjaCA9PSBudWxsIHx8IGZldGNoLmVxdWFscyhMQVpZX0ZFVENIKSB8fCBmZXRjaC5lcXVhbHMoRUFHRVJfRkVUQ0gpKTsKLQkJc2V0Q3VzdG9taXplZChERUZBVUxUX0ZFVENILCBmZXRjaCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbGxlY3Rpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQlTRVRfQ09MTEVDVElPTl9UWVBFLCBMSVNUX0NPTExFQ1RJT05fVFlQRQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHtAbGluayAjTElTVF9DT0xMRUNUSU9OX1RZUEV9fHtAbGluayAjU0VUX0NPTExFQ1RJT05fVFlQRX0KLQkgKiBpbmRpY2F0aW5nIHRoZSBKYXZhIHR5cGUgKGZ1bGwgY2xhc3MgbmFtZSkgdXNlZCBmb3IgcHJvcGVydGllcyBvZgotCSAqIGNvbGxlY3Rpb24gdHlwZXMuIFRoaXMgZG9lcyBub3QgcmV0dXJuIG51bGwgKGRlZmF1bHRzIHRvIGxpc3QpLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCkgewotCQlTdHJpbmcgY1R5cGUgPSBjdXN0b21pemVkKERFRkFVTFRfQ09MTEVDVElPTl9UWVBFKTsKLQkJaWYgKGNUeXBlID09IG51bGwpIHsKLQkJCWNUeXBlID0gU0VUX0NPTExFQ1RJT05fVFlQRTsKLQkJfQotCQlyZXR1cm4gY1R5cGU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlQ29sbGVjdGlvblR5cGUoKXsKLQkJIFN0cmluZyB0eXBlID0gZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCk7Ci0JCXJldHVybiB0eXBlLnN1YnN0cmluZyggdHlwZS5sYXN0SW5kZXhPZignLicpICsxICk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKFN0cmluZyBjVHlwZSkgewotCQlhc3NlcnQgKGNUeXBlLmVxdWFscyhMSVNUX0NPTExFQ1RJT05fVFlQRSkgfHwgY1R5cGUuZXF1YWxzKFNFVF9DT0xMRUNUSU9OX1RZUEUpKTsKLQkJc2V0Q3VzdG9taXplZChERUZBVUxUX0NPTExFQ1RJT05fVFlQRSwgY1R5cGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJpbWFyeSBrZXkgaXMgY29tcG91bmQgYW5kIGFueSBvZiBpdHMgY29sdW1ucyBzaG91bGQKLQkgKiBiZSBpbmNsdWRlZCBpbiB0aGUgPGNvZGU+ZXF1YWxzPC9jb2RlPiBtZXRob2QgaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDb21wb3VuZEtleVVzZUluRXF1YWxzKCkgewotCQlpZiAoaXNDb21wb3NpdGVLZXkoKSkgewotCQkJZm9yIChJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGl0ZXIgPSBnZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY29sdW1uLmlzVXNlSW5FcXVhbHMoKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUm9sZVVzZUluRXF1YWxzKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7Ci0JCWZvciAoSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBpdGVyID0gcm9sZS5nZXRSZWZlcnJlckNvbHVtbnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCU9STUdlbkNvbHVtbiBjb2x1bW4gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjb2x1bW4uaXNVc2VJbkVxdWFscygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgbmFtZSBlbGVtZW50IGluIHRoZSBAVGFibGUgaXMgZGVmYXVsdCBzbyB3ZQotCSAqIGNhbiBza2lwIGdlbmVyYXRpbmcgdGhlIGFubm90YXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRuYW1lKCkgewotCQlTdHJpbmcgZW50aXR5TmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSB0aGlzLm1DdXN0b21pemVyLmdldERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkuYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKGVudGl0eU5hbWUsIG1EYlRhYmxlKTsKLQkJcmV0dXJuIGFubm90YXRpb25OYW1lID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUXVhbGlmaWVzIGEgY2xhc3MgbmFtZSBpZiB0aGVyZSBpcyBhIHBhY2thZ2UuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcXVhbGlmeShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCVN0cmluZyBwa2cgPSBnZXRQYWNrYWdlKCk7Ci0JCWlmIChwa2cgIT0gbnVsbCAmJiBwa2cubGVuZ3RoKCkgIT0gMCkgewotCQkJY2xhc3NOYW1lID0gcGtnICsgJy4nICsgY2xhc3NOYW1lOwotCQl9Ci0JCXJldHVybiBjbGFzc05hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBjb2x1bW4gaXMgcGFydCBvZiBhbnkgYXNzb2NpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29sdW1uSW5Bc3Njb2NpYXRpb24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgTGlzdDxBc3NvY2lhdGlvblJvbGU+IHJvbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwLCBuID0gcm9sZXMuc2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0JCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IHJvbGVzLmdldChpKTsKLQkJCUxpc3Q8T1JNR2VuQ29sdW1uPiBjb2xzID0gcm9sZS5nZXRSZWZlcnJlckNvbHVtbnMoKTsKLQkJCWZvciAoT1JNR2VuQ29sdW1uIGNvbCA6IGNvbHMpIHsKLQkJCQlpZiAoY29sLmdldE5hbWUoKS5lcXVhbHMoY29sdW1uLmdldE5hbWUoKSkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludCB0aGUgY2xhdXNlIHRvIGJlIHVzZWQgaW4gdGhlIGdlbmVyYXRlZCBlcXVhbHMoKSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJpbWFyeUtleUVxdWFsc0NsYXVzZSgpIHsKLQkJU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlJdGVyYXRvcjxPUk1HZW5Db2x1bW4+IGNvbHVtbnMgPSB0aGlzLmdldFByaW1hcnlLZXlDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQl0aGlzLnByaW50UHJpbWFyeUtleUVxdWFsc0NsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBidWYpOwotCQkJaWYgKGNvbHVtbnMuaGFzTmV4dCgpKSB7Ci0JCQkJYnVmLmFwcGVuZCgiXG4iKTsKLQkJCQlidWYuYXBwZW5kKCJcdFx0XHQiKTsKLQkJCQlidWYuYXBwZW5kKCImJiAiKTsKLQkJCX0KLQkJfQotCQlidWYuYXBwZW5kKCI7Iik7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltYXJ5S2V5RXF1YWxzQ2xhdXNlT24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0RGJDb2x1bW4oKS5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVFcXVhbHNDbGF1c2VPbihmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oZmllbGROYW1lLCBidWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWl0aXZlRXF1YWxzQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgiKHRoaXMuIik7Ci0JCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJYnVmLmFwcGVuZCgiID09IGNhc3RPdGhlci4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCcpJyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlRXF1YWxzQ2xhdXNlT24oU3RyaW5nIGZpZWxkTmFtZSwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJYnVmLmFwcGVuZCgidGhpcy4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCIuZXF1YWxzKGNhc3RPdGhlci4iKTsKLQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQlidWYuYXBwZW5kKCcpJyk7Ci0JfQotCi0JLyoqCi0JICogUHJpbnQgdGhlIGNsYXVzZSB0byBiZSB1c2VkIGluIHRoZSBnZW5lcmF0ZWQgaGFzQ29kZSgpIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmltYXJ5S2V5SGFzaENvZGVDbGF1c2UoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJSXRlcmF0b3I8T1JNR2VuQ29sdW1uPiBjb2x1bW5zID0gdGhpcy5nZXRQcmltYXJ5S2V5Q29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb2x1bW5zLmhhc05leHQoKSkgewotCQkJYnVmLmFwcGVuZCgiaGFzaCA9IGhhc2ggKiBwcmltZSArICIpOwotCQkJdGhpcy5wcmludFByaW1hcnlLZXlIYXNoQ29kZUNsYXVzZU9uKGNvbHVtbnMubmV4dCgpLCBidWYpOwotCQkJYnVmLmFwcGVuZCgnOycpOwotCQkJYnVmLmFwcGVuZCgnXG4nKTsKLQkJCWJ1Zi5hcHBlbmQoIlx0XHQiKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UHJpbWFyeUtleUhhc2hDb2RlQ2xhdXNlT24oT1JNR2VuQ29sdW1uIGNvbHVtbiwgU3RyaW5nQnVpbGRlciBidWYpIHsKLQkJU3RyaW5nIGZpZWxkTmFtZSA9IGNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJSmF2YVR5cGUgamF2YVR5cGUgPSBjb2x1bW4uZ2V0RGJDb2x1bW4oKS5nZXRQcmltYXJ5S2V5SmF2YVR5cGUoKTsKLQkJaWYgKGphdmFUeXBlLmlzUHJpbWl0aXZlKCkpIHsKLQkJCXRoaXMucHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKGphdmFUeXBlLmdldEVsZW1lbnRUeXBlTmFtZSgpLCBmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihmaWVsZE5hbWUsIGJ1Zik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRQcmltaXRpdmVIYXNoQ29kZUNsYXVzZU9uKFN0cmluZyBwcmltaXRpdmVOYW1lLCBTdHJpbmcgZmllbGROYW1lLCBTdHJpbmdCdWlsZGVyIGJ1ZikgewotCQlpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImludCIpKSB7Ci0JCQkvLyB0aGlzLnZhbHVlCi0JCQlidWYuYXBwZW5kKCJ0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJzaG9ydCIpIHx8IHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJieXRlIikgfHwgcHJpbWl0aXZlTmFtZS5lcXVhbHMoImNoYXIiKSkgeyAvLyBleHBsaWNpdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBjYXN0Ci0JCQkvLyAoKGludCkgdGhpcy52YWx1ZSkKLQkJCWJ1Zi5hcHBlbmQoIigoaW50KSB0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgnKScpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZU5hbWUuZXF1YWxzKCJsb25nIikpIHsgLy8gY3JpYmJlZCBmcm9tIExvbmcjaGFzaENvZGUoKQotCQkJLy8gKChpbnQpICh0aGlzLnZhbHVlIF4gKHRoaXMudmFsdWUgPj4+IDMyKSkpCi0JCQlidWYuYXBwZW5kKCIoKGludCkgKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIgXiAodGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIiA+Pj4gMzIpKSkiKTsKLQkJfQotCQllbHNlIGlmIChwcmltaXRpdmVOYW1lLmVxdWFscygiZmxvYXQiKSkgeyAvLyBjcmliYmVkIGZyb20KLQkJCQkJCQkJCQkJCQkvLyBGbG9hdCNoYXNoQ29kZSgpCi0JCQkvLyBqYXZhLmxhbmcuRmxvYXQuZmxvYXRUb0ludEJpdHModGhpcy52YWx1ZSkKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5GbG9hdCIpOwotCQkJYnVmLmFwcGVuZCgiLmZsb2F0VG9JbnRCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCcpJyk7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImRvdWJsZSIpKSB7IC8vIGNyaWJiZWQgZnJvbQotCQkJCQkJCQkJCQkJCS8vIERvdWJsZSNoYXNoQ29kZSgpCi0JCQkvLyAoKGludCkgKGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyh0aGlzLnZhbHVlKSBeCi0JCQkvLyAoamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKHRoaXMudmFsdWUpID4+PiAzMikpKQotCQkJYnVmLmFwcGVuZCgiKChpbnQpICgiKTsKLQkJCWJ1Zi5hcHBlbmQoImphdmEubGFuZy5Eb3VibGUiKTsKLQkJCWJ1Zi5hcHBlbmQoIi5kb3VibGVUb0xvbmdCaXRzKHRoaXMuIik7Ci0JCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCQlidWYuYXBwZW5kKCIpIF4gKCIpOwotCQkJYnVmLmFwcGVuZCgiamF2YS5sYW5nLkRvdWJsZSIpOwotCQkJYnVmLmFwcGVuZCgiLmRvdWJsZVRvTG9uZ0JpdHModGhpcy4iKTsKLQkJCWJ1Zi5hcHBlbmQoZmllbGROYW1lKTsKLQkJCWJ1Zi5hcHBlbmQoIikgPj4+IDMyKSkpIik7Ci0JCX0KLQkJZWxzZSBpZiAocHJpbWl0aXZlTmFtZS5lcXVhbHMoImJvb2xlYW4iKSkgewotCQkJLy8gKHRoaXMudmFsdWUgPyAxIDogMCkKLQkJCWJ1Zi5hcHBlbmQoIih0aGlzLiIpOwotCQkJYnVmLmFwcGVuZChmaWVsZE5hbWUpOwotCQkJYnVmLmFwcGVuZCgiID8gMSA6IDApIik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHByaW1pdGl2ZU5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50UmVmZXJlbmNlSGFzaENvZGVDbGF1c2VPbihTdHJpbmcgZmllbGROYW1lLCBTdHJpbmdCdWlsZGVyIGJ1ZikgewotCQlidWYuYXBwZW5kKCJ0aGlzLiIpOwotCQlidWYuYXBwZW5kKGZpZWxkTmFtZSk7Ci0JCWJ1Zi5hcHBlbmQoIi5oYXNoQ29kZSgpIik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJuYW1lPSIgKyB0aGlzLmdldE5hbWUoKSArICI7IGNvbHVtbnM9IiArIEFycmF5cy50b1N0cmluZyh0aGlzLmdldENvbHVtbk5hbWVzKCkudG9BcnJheSgpKTsKLQl9Ci0KLQkvKiBjbGFzcyBzY29wZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfU0NPUEUgPSAicHVibGljIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRF9TQ09QRSA9ICJwcm90ZWN0ZWQiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJVkFURV9TQ09QRSA9ICJwcml2YXRlIjsKLQotCS8qIGFjY2VzcyBjb25zdGFudHMuIE5vdGUgdGhhdCB0aGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIHRoZSB1aSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FDQ0VTUyA9ICJwcm9wZXJ0eSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BQ0NFU1MgPSAiZmllbGQiOwotCi0JLyoKLQkgKiBkZWZhdWx0IGZlY2ggY29uc3RhbnRzLiBOb3RlIHRoYXQgdGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiB0aGUgZ2VuCi0JICogdmVsb2NpdHkgdGVtcGxhdGVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRkVUQ0ggPSAiZGVmYXVsdEZldGNoIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWllfRkVUQ0ggPSAibGF6eSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQUdFUl9GRVRDSCA9ICJlYWdlciI7Ci0KLQkvKgotCSAqIGRlZmF1bHQgY29sbGVjdGlvbiB0eXBlIGNvbnN0YW50cy4gTm90ZSB0aGF0IHRoZXNlIHN0cmluZ3MgYXJlIHVzZWQgaW4KLQkgKiB0aGUgZ2VuIHZlbG9jaXR5IHRlbXBsYXRlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX0NPTExFQ1RJT05fVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfQ09MTEVDVElPTl9UWVBFID0gImphdmEudXRpbC5TZXQiOwotCi0JLyoqCi0JICogVGhlIHBhdHRlcm4gcmVwbGFjZWQgYnkgdGhlIHRhYmxlIG5hbWUgaW4gdGhlIGlkIGdlbmVyYXRvciBzZXF1ZW5jZSBuYW1lCi0JICogcGFyYW0uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfU0VRX1BBVFRFUk4gPSAiJHRhYmxlIjsKLQotCS8qKgotCSAqIFRoZSBwYXR0ZXJuIHJlcGxhY2VkIGJ5IHRoZSBwcmltYXJ5IGtleSBpbiB0aGUgaWQgZ2VuZXJhdG9yIHNlcXVlbmNlIG5hbWUKLQkgKiBwYXJhbS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS19TRVFfUEFUVEVSTiA9ICIkcGsiOwotCi0JLyogY3VzdG9taXphdGlvbiBwcm9wZXJ0aWVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0UgPSAicGFja2FnZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1JDX0ZPTERFUiA9ICJzcmNGb2xkZXIiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMQVNTX05BTUUgPSAiY2xhc3NOYW1lIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU19ERVNDID0gImNsYXNzRGVzYyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfU0NPUEUgPSAiY2xhc3NTY29wZSI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5EUyA9ICJleHRlbmRzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTVBMRU1FTlRTID0gImltcGxlbWVudHMiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0dFTkVSQVRPUiA9ICJpZEdlbmVyYXRvciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0UgPSAic2VxdWVuY2UiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPU0lURV9LRVlfQ0xBU1NfTkFNRSA9ICJjb21wb3NpdGVLZXlDbGFzc05hbWUiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExFTUVOVF9FUVVBTFMgPSAiaW1wbGVtZW50RXF1YWxzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBQ0NFU1MgPSAiYWNjZXNzIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTExFQ1RJT05fVFlQRSA9ICJkZWZhdWx0Q29sbGVjdGlvblR5cGUiOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL092ZXJ3cml0ZUNvbmZpcm1lci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL092ZXJ3cml0ZUNvbmZpcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODA1NDczLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9PdmVyd3JpdGVDb25maXJtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgT3ZlcndyaXRlQ29uZmlybWVyIHsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IGdlbmVyYXRvciBzaG91bGQgb3ZlcndyaXRlIHRoZSBzcGVjaWZpZWQKLQkgKiBmaWxlLgotCSAqLwotCWJvb2xlYW4gb3ZlcndyaXRlKFN0cmluZyBjbGFzc05hbWUpOwotCi0KLQlmaW5hbCBjbGFzcyBBbHdheXMgaW1wbGVtZW50cyBPdmVyd3JpdGVDb25maXJtZXIgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIE92ZXJ3cml0ZUNvbmZpcm1lciBJTlNUQU5DRSA9IG5ldyBBbHdheXMoKTsKLQkJcHVibGljIHN0YXRpYyBPdmVyd3JpdGVDb25maXJtZXIgaW5zdGFuY2UoKSB7Ci0JCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JCX0KLQkJLy8gZW5zdXJlIHNpbmdsZSBpbnN0YW5jZQotCQlwcml2YXRlIEFsd2F5cygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gZXZlcnl0aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk92ZXJ3cml0ZUNvbmZpcm1lci5BbHdheXMiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlmaW5hbCBjbGFzcyBOZXZlciBpbXBsZW1lbnRzIE92ZXJ3cml0ZUNvbmZpcm1lciB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIElOU1RBTkNFID0gbmV3IE5ldmVyKCk7Ci0JCXB1YmxpYyBzdGF0aWMgT3ZlcndyaXRlQ29uZmlybWVyIGluc3RhbmNlKCkgewotCQkJcmV0dXJuIElOU1RBTkNFOwotCQl9Ci0JCS8vIGVuc3VyZSBzaW5nbGUgaW5zdGFuY2UKLQkJcHJpdmF0ZSBOZXZlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJLy8gbm90aGluZyB3aWxsIGJlIG92ZXJ3cml0dGVuCi0JCXB1YmxpYyBib29sZWFuIG92ZXJ3cml0ZShTdHJpbmcgYXJnMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJPdmVyd3JpdGVDb25maXJtZXIuTmV2ZXIiOyAgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9QYWNrYWdlR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYmE2MDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1BhY2thZ2VHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5WZWxvY2l0eUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5hcHAuVmVsb2NpdHlFbmdpbmU7Ci1pbXBvcnQgb3JnLmFwYWNoZS52ZWxvY2l0eS5ydW50aW1lLmxvZy5KZGtMb2dDaHV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkNvbXBpbGF0aW9uVW5pdE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuRmlsZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbC5VcmxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBUaGlzIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgcGFja2FnZSBvZiBlbnRpdGllcyBmb3IgYSBzZXQgb2YgdGFibGVzLgotICovCi1wdWJsaWMgY2xhc3MgUGFja2FnZUdlbmVyYXRvciB7IAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9OQU1FID0gIm9yZy5lY2xpcHNlLmpwdC5lbnRpdGllcy5nZW4ubG9nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgZmluYWwgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOwotCXByaXZhdGUgZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lcjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMjApOwotCQlQYWNrYWdlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5ldyBQYWNrYWdlR2VuZXJhdG9yKGpwYVByb2plY3QsIGN1c3RvbWl6ZXIsIG92ZXJ3cml0ZUNvbmZpcm1lcik7Ci0JCXNtLndvcmtlZCgxKTsKLQkJdHJ5IHsKLQkJCWdlbmVyYXRvci5kb0dlbmVyYXRlKHNtLm5ld0NoaWxkKDE5KSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYUdlblBsdWdpbi5QTFVHSU5fSUQsIEpwdEdlbk1lc3NhZ2VzLkVycm9yX0dlbmVyYXRpbmdfRW50aXRpZXMsIGUpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFBhY2thZ2VHZW5lcmF0b3IoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIE92ZXJ3cml0ZUNvbmZpcm1lciBjb25maXJtZXIpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJdGhpcy5vdmVyd3JpdGVDb25maXJtZXIgPSBjb25maXJtZXI7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0Q3VzdG9taXplcigpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQlwcml2YXRlIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIHZvaWQgZG9HZW5lcmF0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBFeGNlcHRpb24gewotCQlnZW5lcmF0ZUludGVybmFsKG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlSW50ZXJuYWwoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wbERpciA9IHByZXBhcmVUZW1wbGF0ZXNGb2xkZXIoKTsKLQotCQlMaXN0PFN0cmluZz4gZ2VuQ2xhc3NlcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0R2VuVGFibGVOYW1lcygpOwotCi0JCS8qIC5qYXZhIHBlciB0YWJsZSwgcGVyc2lzdGVuY2UueG1sLCByZWZyZXNoIHBhY2thZ2UgZm9sZGVyICovCi0JCVN1Yk1vbml0b3Igc20gPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgdGFibGVOYW1lcy5zaXplKCkgKyAyKTsKLQotCi0JCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gdGFibGVOYW1lcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCWlmIChzbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlTdHJpbmcgdGFibGVOYW1lID0gaXRlci5uZXh0KCk7Ci0JCQlPUk1HZW5UYWJsZSB0YWJsZSA9IHRoaXMuY3VzdG9taXplci5nZXRUYWJsZSh0YWJsZU5hbWUpOwotCi0JCQlTdHJpbmcgY2xhc3NOYW1lID0gdGFibGUuZ2V0UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0KLQkJCWdlbmVyYXRlQ2xhc3ModGFibGUsIHRlbXBsRGlyLmdldEFic29sdXRlUGF0aCgpLCBzbS5uZXdDaGlsZCgxLCBTdWJNb25pdG9yLlNVUFBSRVNTX05PTkUpKTsKLQotCQkJZ2VuQ2xhc3Nlcy5hZGQoY2xhc3NOYW1lKTsKLQkJCS8qCi0JCQkgKiBhZGQgdGhlIGNvbXBvc2l0ZSBrZXkgY2xhc3MgdG8gcGVyc2lzdGVuY2UueG1sIGJlY2F1c2Ugc29tZSAKLQkJCSAqIEpQQSBwcm92aWRlcihlLmcuIEtvZG8pIHJlcXVpcmVzIGl0LiBIaWJlcm5hdGUgZG9lc24ndCBzZWVtIHRvIGNhcmUpLiAKLQkJCSAqLwotCQkJaWYgKHRhYmxlLmlzQ29tcG9zaXRlS2V5KCkpIHsKLQkJCQlnZW5DbGFzc2VzLmFkZCh0YWJsZS5nZXRRdWFsaWZpZWRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNtLmlzQ2FuY2VsZWQoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQkvL3VwZGF0ZSBwZXJzaXN0ZW5jZS54bWwKLQkJaWYgKHRoaXMuY3VzdG9taXplci51cGRhdGVQZXJzaXN0ZW5jZVhtbCgpKSB7Ci0JCQl1cGRhdGVQZXJzaXN0ZW5jZVhtbChnZW5DbGFzc2VzKTsKLQkJfQotCQlzbS53b3JrZWQoMik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVQZXJzaXN0ZW5jZVhtbChmaW5hbCBMaXN0PFN0cmluZz4gZ2VuQ2xhc3NlcykgewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuanBhUHJvamVjdC5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkvL3RoZSByZXNvdXJjZSB3b3VsZCBvbmx5IGJlIG51bGwgaWYgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGhhZCBhbiBpbnZhbGlkIGNvbnRlbnQgdHlwZSwKLQkJCS8vZG8gbm90IGF0dGVtcHQgdG8gdXBkYXRlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gUGFja2FnZUdlbmVyYXRvci50aGlzLmpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJCWlmIChwZXJzaXN0ZW5jZSA9PSBudWxsKSB7Ci0JCQkJCS8vIGludmFsaWQgY29udGVudCwgZG8gbm90IGF0dGVtcHQgdG8gdXBkYXRlCi0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdDsKLQkJCQkvLyBjcmVhdGUgYSBwZXJzaXN0ZW5jZSB1bml0IGlmIG9uZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QKLQkJCQlpZiAocGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSA9PSAwKSB7Ci0JCQkJCXBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlLmFkZFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShQYWNrYWdlR2VuZXJhdG9yLnRoaXMuanBhUHJvamVjdC5nZXROYW1lKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHdlIG9ubHkgc3VwcG9ydCBvbmUgcGVyc2lzdGVuY2UgdW5pdCAtIHRha2UgdGhlIGZpcnN0IG9uZQotCQkJCQlwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJfQotCQkJCWZvciAoSXRlcmF0b3I8U3RyaW5nPiBzdHJlYW0gPSBnZW5DbGFzc2VzLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBzdHJlYW0ubmV4dCgpOwotCQkJCQlpZiAoQ29sbGVjdGlvblRvb2xzLmlzRW1wdHkocGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlUmVmc0NvbnRhaW5pbmcoY2xhc3NOYW1lKSkgJiYgIXBlcnNpc3RlbmNlVW5pdC5zcGVjaWZpZXNQZXJzaXN0ZW50VHlwZShjbGFzc05hbWUpKSB7Ci0JCQkJCQlwZXJzaXN0ZW5jZVVuaXQuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIHByZXBhcmVUZW1wbGF0ZXNGb2xkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEV4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24gewotCQkvL1ByZXBhcmUgdGhlIFZlbG9jaXR5IHRlbXBsYXRlIGZvbGRlcjoKLQkJLy9JZiB0aGUgcGx1Zy1pbiBpcyBwYWNrYWdlZCBhcyBhIEpBUiwgd2UgbmVlZCBleHRyYWN0IHRoZSB0ZW1wbGF0ZSAKLQkJLy9mb2xkZXIgaW50byB0aGUgcGx1Zy1pbiBzdGF0ZSBsb2NhdGlvbi4gVGhpcyBpcyByZXF1aXJlZCBieSBWZWxvY2l0eQotCQkvL3NpbmNlIHdlIHVzZSBpbmNsdWRlZCB0ZW1wbGF0ZXMuCi0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSnB0SnBhR2VuUGx1Z2luLlBMVUdJTl9JRCk7Ci0JCVN0cmluZyB0ZW1wbGF0ZXNQYXRoID0gInRlbXBsYXRlcy9lbnRpdGllcy8iOyAgLy8kTk9OLU5MUy0xJAotCQlQYXRoIHBhdGggPSBuZXcgUGF0aCggdGVtcGxhdGVzUGF0aCk7Ci0JCVVSTCB1cmwgPSBGaWxlTG9jYXRvci5maW5kKGJ1bmRsZSwgcGF0aCwgbnVsbCk7Ci0JCWlmICh1cmwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFHZW5QbHVnaW4uUExVR0lOX0lELCAgSnB0R2VuTWVzc2FnZXMuVGVtcGxhdGVzX25vdEZvdW5kICsgIiAiKyAgSnB0SnBhR2VuUGx1Z2luLlBMVUdJTl9JRCArICIvIiArIHRlbXBsYXRlc1BhdGgpICk7Ly8kTk9OLU5MUy0xJAotCQl9CQkKLQkJVVJMIHRlbXBsVXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkKLQkJLy9IYXZlIHRoaXMgY2hlY2sgc28gdGhhdCB0aGUgY29kZSB3b3VsZCB3b3JrIGluIGJvdGggUERFIGFuZCBKQVJlZCBwbHVnLWluIGF0IHJ1bnRpbWUKLQkJRmlsZSB0ZW1wbERpciA9IG51bGw7Ci0JCWlmIChVcmxVdGlsLmlzSmFyVXJsKHRlbXBsVXJsKSkgewotCQkJdGVtcGxEaXIgPSBGaWxlVXRpbC5leHRyYWN0RmlsZXNGcm9tQnVuZGxlKCB0ZW1wbFVybCwgYnVuZGxlLCB0ZW1wbGF0ZXNQYXRoICk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZW1wbERpciA9IFVybFV0aWwuZ2V0VXJsRmlsZSh0ZW1wbFVybCk7Ci0JCX0KLQkJCi0KLQkJaWYgKHRlbXBsRGlyID09IG51bGwgfHwgIXRlbXBsRGlyLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYUdlblBsdWdpbi5QTFVHSU5fSUQsICBKcHRHZW5NZXNzYWdlcy5UZW1wbGF0ZXNfbm90Rm91bmQgKyAiICIrICBKcHRKcGFHZW5QbHVnaW4uUExVR0lOX0lEICkgKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHRlbXBsRGlyOwotCX0KLQkKLQkvKioKLQkgKiBTYXZlcy9DcmVhdGVzIHRoZSAuamF2YSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gYSBkYXRhYmFzZSB0YWJsZSAKLQkgKiB3aXRoIHRoZSBnaXZlbiBjb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB0ZW1wbERpciBUaGUgdmVsb2NpdHkgdGVtcGxhdGUgZmlsZSBkaXJlY3RvcnkuIEl0IGlzIGFzc3VtZWQgCi0JICogdGhhdCB0aGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgMiBmaWxlcyA8ZW0+bWFpbi5qYXZhLnZtPC9lbT4gCi0JICogYW5kIDxlbT5way5qYXZhLnZtPC9lbT4gCi0JICogQHBhcmFtIHByb2dyZXNzIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQ2xhc3MoT1JNR2VuVGFibGUgdGFibGUsIFN0cmluZyB0ZW1wbGF0ZURpclBhdGgsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIHN1YlRhc2tOYW1lID0gTkxTLmJpbmQoSnB0R2VuTWVzc2FnZXMuRW50aXR5R2VuZXJhdG9yX3Rhc2tOYW1lLCB0YWJsZS5nZXROYW1lKCkpOwotCQlTdWJNb25pdG9yIHNtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHN1YlRhc2tOYW1lLCAxMCk7Ci0KLQkJdHJ5IHsKLQkJCUlGb2xkZXIgamF2YVBhY2thZ2VGb2xkZXIgPSBnZXRKYXZhUGFja2FnZUZvbGRlcih0YWJsZSwgbW9uaXRvcik7Ci0JCQlJRmlsZSBqYXZhRmlsZSA9IGphdmFQYWNrYWdlRm9sZGVyLmdldEZpbGUoIHRhYmxlLmdldENsYXNzTmFtZSgpICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQotCQkJaWYgKGphdmFGaWxlLmV4aXN0cygpKSB7Ci0JCQkJaWYgKHRoaXMub3ZlcndyaXRlQ29uZmlybWVyICE9IG51bGwgJiYgIXRoaXMub3ZlcndyaXRlQ29uZmlybWVyLm92ZXJ3cml0ZShqYXZhRmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQkvL0pka0xvZ0NodXRlIGluIHRoaXMgdmVyc2lvbiBvZiBWZWxvY2l0eSBub3QgYWxsb3cgdG8gc2V0IGxvZyBsZXZlbAotCQkJLy9Xb3JrYXJvdW5kIGJ5IHByZXNldCB0aGUgbG9nIGxldmVsIGJlZm9yZSBWZWxvY2l0eSBpcyBpbml0aWFsaXplZAotCQkJTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoIExPR0dFUl9OQU1FICk7Ci0JCQlsb2dnZXIuc2V0TGV2ZWwoIExldmVsLlNFVkVSRSApOwotCQkJCi0JCQlQcm9wZXJ0aWVzIHZlcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQl2ZXAuc2V0UHJvcGVydHkoImZpbGUucmVzb3VyY2UubG9hZGVyLnBhdGgiLCB0ZW1wbGF0ZURpclBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQl2ZXAuc2V0UHJvcGVydHkoIEpka0xvZ0NodXRlLlJVTlRJTUVfTE9HX0pES19MT0dHRVIsIExPR0dFUl9OQU1FICk7Ci0JCQlWZWxvY2l0eUVuZ2luZSB2ZSA9IG5ldyBWZWxvY2l0eUVuZ2luZSgpOwotCQkgICAgdmUuaW5pdCh2ZXApOwotCQkgICAgc20ud29ya2VkKDIpOwotCQkgICAgCi0JCSAgICBnZW5lcmF0ZUphdmFGaWxlKHRhYmxlLCBqYXZhRmlsZSwgdmUsICJtYWluLmphdmEudm0iLCB0cnVlLyppc0RvbWFpbkNsYXNzKi8sIHNtLm5ld0NoaWxkKDYpKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgCi0JCSAgICBpZiAodGFibGUuaXNDb21wb3NpdGVLZXkoKSkgewotCQkgICAgCUlGaWxlIGNvbXBvc2l0ZUtleUZpbGUgPSBqYXZhUGFja2FnZUZvbGRlci5nZXRGaWxlKCB0YWJsZS5nZXRDb21wb3NpdGVLZXlDbGFzc05hbWUoKSsiLmphdmEiKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgCWdlbmVyYXRlSmF2YUZpbGUodGFibGUsIGNvbXBvc2l0ZUtleUZpbGUsIHZlLCAicGsuamF2YS52bSIsIGZhbHNlLyppc0RvbWFpbkNsYXNzKi8sIHNtLm5ld0NoaWxkKDEpKTsgLy8kTk9OLU5MUy0xJAotCQkgICAgfQotCQkgICAgZWxzZSB7Ci0JCSAgICAJc20uc2V0V29ya1JlbWFpbmluZygxKTsKLQkJICAgIH0KLQkJCWphdmFGaWxlLnJlZnJlc2hMb2NhbCgxLCBzbS5uZXdDaGlsZCgxKSk7Ci0JCQkKLQkJfSBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkJCUNvcmVFeGNlcHRpb24gY2UgPSBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYUdlblBsdWdpbi5QTFVHSU5fSUQsIEpwdEdlbk1lc3NhZ2VzLlRlbXBsYXRlc19ub3RGb3VuZCArICIiICsgSnB0SnBhR2VuUGx1Z2luLlBMVUdJTl9JRCAsIGUpICk7Ly8kTk9OLU5MUy0xJAotCQkJSnB0SnBhR2VuUGx1Z2luLmxvZ0V4Y2VwdGlvbiggY2UgKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVKYXZhRmlsZShPUk1HZW5UYWJsZSB0YWJsZSwgSUZpbGUgamF2YUZpbGUsIFZlbG9jaXR5RW5naW5lIHZlCi0JCQksIFN0cmluZyB0ZW1wbGF0ZU5hbWUsIGJvb2xlYW4gaXNEb21haW5DbGFzcywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVmVsb2NpdHlDb250ZXh0IGNvbnRleHQgPSBuZXcgVmVsb2NpdHlDb250ZXh0KCk7Ci0gICAgICAgIGNvbnRleHQucHV0KCJ0YWJsZSIsIHRhYmxlKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBjb250ZXh0LnB1dCgiY3VzdG9taXplciIsIGdldEN1c3RvbWl6ZXIoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgCi0JCVN0cmluZ1dyaXRlciB3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCQl2ZS5tZXJnZVRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgY29udGV4dCwgdyk7Ci0JCQotCQlTdHJpbmcgZmlsZUNvbnRlbnQgPSB3LnRvU3RyaW5nKCk7Ci0JCWlmIChqYXZhRmlsZS5leGlzdHMoKSkgewotCQkJaWYgKGlzRG9tYWluQ2xhc3MpIHsKLQkJCQl1cGRhdGVFeGlzdGluZ0RvbWFpbkNsYXNzKHRhYmxlLmdldFF1YWxpZmllZENsYXNzTmFtZSgpLCBqYXZhRmlsZSwgZmlsZUNvbnRlbnQpOwotCQkJfSBlbHNlIHsKLQkJCQlieXRlW10gY29udGVudCA9IGZpbGVDb250ZW50LmdldEJ5dGVzKGphdmFGaWxlLmdldENoYXJzZXQoKSk7Ci0JCQkJamF2YUZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpLCB0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWJ5dGVbXSBjb250ZW50ID0gZmlsZUNvbnRlbnQuZ2V0Qnl0ZXMoamF2YUZpbGUuZ2V0Q2hhcnNldCgpKTsKLQkJCWNyZWF0ZUZpbGUoamF2YUZpbGUsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50KSk7Ci0JCX0JCQotCX0KLQkKLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSAoZXhpc3RpbmcpIEphdmEgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjbGFzcy4KLQkgKiAKLQkgKiBAcGFyYW0gY2xhc3NOYW1lIFRoZSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUZpbGUgVGhlIGV4aXN0aW5nIEphdmEgZmlsZSBvZiB0aGUgY2xhc3MgdG8gdXBkYXRlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlQ29udGVudCBUaGUgbmV3IGZpbGUgY29udGVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFeGlzdGluZ0RvbWFpbkNsYXNzKFN0cmluZyBjbGFzc05hbWUsIElGaWxlIGphdmFGaWxlLCBTdHJpbmcgZmlsZUNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewotCQkvKnVzZSBDb21waWxhdGlvblVuaXRNb2RpZmllciBpbnN0ZWFkIG9mIGNhbGxpbmcgV2lkZUVudi5nZXRFbnYoKS5zZXRGaWxlQ29udGVudCAKLQkJICogc28gdGhhdCBpZiB0aGUgdW5pdCBpcyB1cCB0byBkYXRlIGlmIGl0IGlzIHVzZWQgYmVmb3JlIGZpbGUgY2hhbmdlIAotCQkgKiBub3RpZmljYXRpb25zIGFyZSBkZWxpdmVyZWQgKHNlZSBFSkIzSW1wb3J0U2NoZW1hV2l6YXJkLnVwZGF0ZUV4aXN0aW5nRG9tYWluQ2xhc3MgZm9yIGV4YW1wbGUpKi8KLQkJQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIgbW9kaWZpZXIgPSBuZXcgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIodGhpcy5nZXRKYXZhUHJvamVjdCgpLCBjbGFzc05hbWUpOwotCQltb2RpZmllci5zZXRKYXZhU291cmNlKGZpbGVDb250ZW50KTsKLQkJbW9kaWZpZXIuc2F2ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBjcmVhdGVGaWxlKElGaWxlIGZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsJCQotCQlmaWxlLmNyZWF0ZShjb250ZW50cywgZmFsc2UsIG51bGwvKm1vbml0b3IqLyk7Ci0JfQotCQotCXB1YmxpYyBJRm9sZGVyIGdldEphdmFQYWNrYWdlRm9sZGVyKE9STUdlblRhYmxlIHRhYmxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA9IGdldERlZmF1bHRKYXZhU291cmNlTG9jYXRpb24odGhpcy5nZXRKYXZhUHJvamVjdCgpLCB0YWJsZS5nZXRTb3VyY2VGb2xkZXIoKSk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHRhYmxlLmdldFBhY2thZ2UoKTsKLQkJaWYgKHBhY2thZ2VOYW1lID09IG51bGwpIHBhY2thZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQgPSByb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0JCWlmKCAhcGFja2FnZUZyYWdtZW50LmV4aXN0cygpKXsKLQkJCXJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lLCB0cnVlLCBtb25pdG9yKTsKLQkJfQkJCi0JCXJldHVybiAoSUZvbGRlcikgcGFja2FnZUZyYWdtZW50LmdldFJlc291cmNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXREZWZhdWx0SmF2YVNvdXJjZUxvY2F0aW9uKElKYXZhUHJvamVjdCBqcHJvamVjdCwgU3RyaW5nIHNvdXJjZUZvbGRlcil7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IGRlZmF1bHRTcmNQYXRoID0gbnVsbDsKLQkJaWYgKGpwcm9qZWN0ICE9IG51bGwgJiYganByb2plY3QuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSByb290cyA9IGpwcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByb290cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAocm9vdHNbaV0uZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFICl7Ci0JCQkJCQlpZiAoZGVmYXVsdFNyY1BhdGggPT0gbnVsbCkgewotCQkJCQkJCWRlZmF1bHRTcmNQYXRoID0gcm9vdHNbaV07Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcGF0aCA9IHJvb3RzW2ldLmdldFBhdGgoKS50b1N0cmluZygpOyAKLQkJCQkJCWlmIChwYXRoLmVxdWFscygnLycgKyBzb3VyY2VGb2xkZXIpKSB7Ci0JCQkJCQkJcmV0dXJuIHJvb3RzW2ldIDsgCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpwdEpwYUdlblBsdWdpbi5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRTcmNQYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC9UYWdOYW1lcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1RhZ05hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWVjZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL1RhZ05hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsOwotCi0vKioKLSAqIFRPRE86IG1lcmdlIHdpdGggSlBBIGNsYXNzID8KLSAqIFRoZSBKUEEgbWFwcGluZyB0YWcgYW5kIGF0dHJpYnV0ZSBuYW1lcy4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVGFnTmFtZXMKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19UQUcgPSAiYmFzaWMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0NBREVfVEFHID0gImNhc2NhZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUcgPSAiY29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9UQUcgPSAiZW1iZWRkZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX0lEX1RBRyA9ICJlbWJlZGRlZC1pZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVEX1ZBTFVFX1RBRyA9ICJnZW5lcmF0ZWQtdmFsdWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX1RBRyA9ICJpZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfQ0xBU1NfVEFHID0gImlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX0NPTFVNTl9UQUcgPSAiam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fVEFHID0gImludmVyc2Utam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQl9UQUcgPSAibG9iIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX01BTllfVEFHID0gIm1hbnktdG8tbWFueSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkVfVEFHID0gIm1hbnktdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQllfVEFHID0gIm1hcHBlZC1ieSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTllfVEFHID0gIm9uZS10by1tYW55IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fT05FX1RBRyA9ICJvbmUtdG8tb25lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQS19KT0lOX0NPTFVNTl9UQUcgPSAicHJpbWFyeS1rZXktam9pbi1jb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX1RBRyA9ICJ0YWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9UQUcgPSAidmVyc2lvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSk9JTl9UQUJMRV9UQUcgPSAiam9pbi10YWJsZSI7Ci0KLQkvKmNhc2NhZGUgdGFncyovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0NBU0NBREUgPSAiYWxsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNUX0NBU0NBREUgPSAicGVyc2lzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfQ0FTQ0FERSA9ICJtZXJnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0NBU0NBREUgPSAicmVtb3ZlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX0NBU0NBREUgPSAicmVmcmVzaCI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9Db21waWxhdGlvblVuaXRNb2RpZmllci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNhNDZlMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9Db21waWxhdGlvblVuaXRNb2RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQVNUOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BU1RQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgZ3J1bnQgd29yayBuZWVkZWQgZm9yIG1vZGlmeWluZyBhIGNvbXBpbGF0aW9uIAotICogdW5pdCBhbmQgcGVyZm9ybXMgdGhlIG1vZGlmaWVkIGNvbXBpbGF0aW9uIHVuaXQgc2F2ZS4KLSAqIAotICogVGhlIHR5cGljYWwgdXNhZ2UgaXMgYXMgZm9sbG93czoKLSAqIDxvbD48bGk+Q3JlYXRlIGFuIGluc3RhbmNlLgotICogCi0gKiA8bGk+TW9kaWZ5IHRoZSBjb21waWxhdGlvbiB1bml0IHVzaW5nIEFTVCBvcGVyYXRpb25zIHBlcmZvcm1lZCAKLSAqIAlvbiB0aGUgbm9kZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldENvbXBpbGF0aW9uVW5pdE5vZGUoKX0uCi0gKiAgQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGNhbGwgPGNvZGU+c2V0SmF2YVNvdXJjZTwvY29kZT4gdG8gY2hhbmdlIHRoZSBlbnRpcmUgc291cmNlIGNvZGUuIAotICogCi0gKiA8bGk+Q2FsbCB0aGUge0BsaW5rICNzYXZlKCl9IG1ldGhvZC4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIKLXsKLQlwcml2YXRlIElKYXZhUHJvamVjdCBtUHJvamVjdDsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgbUNvbXBpbGF0aW9uVW5pdDsKLQlwcml2YXRlIENvbXBpbGF0aW9uVW5pdCBtQ29tcGlsYXRpb25Vbml0Tm9kZTsKLQlwcml2YXRlIERvY3VtZW50IG1Eb2N1bWVudDsKLQkKLQlwdWJsaWMgQ29tcGlsYXRpb25Vbml0TW9kaWZpZXIoSUphdmFQcm9qZWN0IHByb2plY3QsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcigpOwotCQkKLQkJbVByb2plY3QgPSBwcm9qZWN0OwotCQkKLQkJSVR5cGUgdHlwZSA9IHByb2plY3QuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiVGhlIGNsYXNzICIgKyBjbGFzc05hbWUgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwotCQl9Ci0JCW1Db21waWxhdGlvblVuaXQgPSB0eXBlLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZiAobUNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJUaGUgc291cmNlIGNvZGUgZm9yICIgKyBjbGFzc05hbWUgKyAiIGRvZXMgbm90IGV4aXN0LiIpOwotCQl9Ci0JfQotCXB1YmxpYyBDb21waWxhdGlvblVuaXRNb2RpZmllcihJSmF2YVByb2plY3QgcHJvamVjdCwgSUNvbXBpbGF0aW9uVW5pdCBjdSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCQotCQltUHJvamVjdCA9IHByb2plY3Q7Ci0JCW1Db21waWxhdGlvblVuaXQgPSBjdTsKLQl9Ci0JcHVibGljIENvbXBpbGF0aW9uVW5pdE1vZGlmaWVyKElKYXZhUHJvamVjdCBwcm9qZWN0LCBJQ29tcGlsYXRpb25Vbml0IGN1LCBDb21waWxhdGlvblVuaXQgY3VOb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIoKTsKLQkJCi0JCW1Qcm9qZWN0ID0gcHJvamVjdDsKLQkJbUNvbXBpbGF0aW9uVW5pdCA9IGN1OwotCQltQ29tcGlsYXRpb25Vbml0Tm9kZSA9IGN1Tm9kZTsKLQkJCi0JCWdldENvbXBpbGF0aW9uVW5pdE5vZGUoKTsgLy90byBjcmVhdGUgbURvY3VtZW50ICh0aGUgY2FsbGVyIGluIHRoaXMgY2FzZSBkb2VzIG5vdCBoYXZlIHRvIGNhbGwgZ2V0Q29tcGlsYXRpb25Vbml0Tm9kZSkKLQl9Ci0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KCkgewotCQlyZXR1cm4gbUNvbXBpbGF0aW9uVW5pdDsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgY29tcGlsYXRpb24gdW5pdCBub2RlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIAotCSAqIHR5aGUgbW9kaWZpY2F0aW9uIEFTVCBvcGVyYXRpb25zLgotCSAqLwotCXB1YmxpYyBDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0Tm9kZSgpIHsKLQkJaWYgKG1Db21waWxhdGlvblVuaXROb2RlID09IG51bGwpIHsKLQkJCUFTVFBhcnNlciBjID0gQVNUUGFyc2VyLm5ld1BhcnNlcihBU1QuSkxTMyk7Ci0JCQljLnNldFNvdXJjZShtQ29tcGlsYXRpb25Vbml0KTsKLQkJCWMuc2V0UmVzb2x2ZUJpbmRpbmdzKHRydWUpOwotCQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUgPSAoQ29tcGlsYXRpb25Vbml0KWMuY3JlYXRlQVNUKG51bGwpOwotCQl9Ci0JCWlmIChtRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltRG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQobUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5nZXRDb250ZW50cygpKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCQotCQkJbUNvbXBpbGF0aW9uVW5pdE5vZGUucmVjb3JkTW9kaWZpY2F0aW9ucygpOwotCQl9Ci0JCQotCQlyZXR1cm4gbUNvbXBpbGF0aW9uVW5pdE5vZGU7Ci0JfQotCS8qKgotCSAqIENoYW5nZXMgdGhlIGVudGlyZSBKYXZhIHNvdXJjZSBjb2RlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEphdmFTb3VyY2UoU3RyaW5nIG5ld1NvdXJjZSkgewotCQl0cnkgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5nZXRCdWZmZXIoKS5zZXRDb250ZW50cyhuZXdTb3VyY2UpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQkvKioKLQkgKiBTYXZlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBtb2RpZmljYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKG1Db21waWxhdGlvblVuaXROb2RlICE9IG51bGwpIHsKLQkJCWFzc2VydChtRG9jdW1lbnQgIT0gbnVsbCk7IC8vc2VlIGdldENvbXBpbGF0aW9uVW5pdE5vZGUKLQkJCQotCQkJLy9jb21wdXRhdGlvbiBvZiB0aGUgdGV4dCBlZGl0cwotCQkJVGV4dEVkaXQgZWRpdHMgPSBtQ29tcGlsYXRpb25Vbml0Tm9kZS5yZXdyaXRlKG1Eb2N1bWVudCwgbVByb2plY3QuZ2V0T3B0aW9ucyh0cnVlKSk7Ci0JCQkvL2NvbXB1dGF0aW9uIG9mIHRoZSBuZXcgc291cmNlIGNvZGUKLQkJCWVkaXRzLmFwcGx5KG1Eb2N1bWVudCk7Ci0JCQlTdHJpbmcgbmV3U291cmNlID0gbURvY3VtZW50LmdldCgpOwotCQkJLy8gdXBkYXRlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JCQltQ29tcGlsYXRpb25Vbml0LmdldEJ1ZmZlcigpLnNldENvbnRlbnRzKG5ld1NvdXJjZSk7Ci0JCX0KLQkJCi0JCWlmIChtQ29tcGlsYXRpb25Vbml0LmlzV29ya2luZ0NvcHkoKSkgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5jb21taXRXb3JraW5nQ29weSh0cnVlLypmb3JjZSovLCBudWxsLyptb25pdG9yKi8pOwotCQl9IGVsc2UgewotCQkJbUNvbXBpbGF0aW9uVW5pdC5zYXZlKG51bGwvKm1vbml0b3IqLywgdHJ1ZS8qZm9yY2UqLyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9EVFBVdGlsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9EVFBVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMjI4MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvRFRQVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXkuQ29sdW1uUGFpcjsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcyB0byBhY2Nlc3MgRFRQIGFuZCBvdGhlciBqcHQuZGIgQVBJcyAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBEVFBVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0F1dG9JbmNyZW1lbnQoQ29sdW1uIGMpewotCQkvL0AgVE9ETwotCQkvL0Jsb2NrZWQgYnkgRFRQIGJ1ZwotCQkvL2h0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNTAwMjMKLQkJLy9UaGUgRGFsaSBidWcgaXMKLQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NjU4Ci0JCS8vCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbGlzdCBvZiBmawotCSAqIEBwYXJhbSBkYlRhYmxlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxGb3JlaWduS2V5SW5mbz4gZ2V0Rm9yZWlnbktleXMoVGFibGUgZGJUYWJsZSkgewotCQlMaXN0PEZvcmVpZ25LZXlJbmZvPiByZXQgPSBuZXcgQXJyYXlMaXN0PEZvcmVpZ25LZXlJbmZvPigpOwotCQlpZihkYlRhYmxlIT1udWxsKXsKLQkJCWZvciAoRm9yZWlnbktleSBmayA6IGRiVGFibGUuZ2V0Rm9yZWlnbktleXMoKSkgewotCQkJCUl0ZXJhdG9yPENvbHVtblBhaXI+IGNvbHVtblBhaXJlcyA9IGZrLmdldENvbHVtblBhaXJzKCkuaXRlcmF0b3IoKTsKLQkJCQlGb3JlaWduS2V5SW5mbyBma0luZm8gPSBudWxsOwotCQkJCXdoaWxlKCBjb2x1bW5QYWlyZXMuaGFzTmV4dCgpICl7Ci0JCQkJCUNvbHVtblBhaXIgY29sdW1uUGFpciA9IGNvbHVtblBhaXJlcy5uZXh0KCk7Ci0JCQkJCWlmKCBma0luZm8gPT0gbnVsbCl7Ci0JCQkJCQlTdHJpbmcgdGFibGVOYW1lID0gZGJUYWJsZS5nZXROYW1lKCk7Ci0JCQkJCQlTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSA9ICIiOwotCQkJCQkJVGFibGUgcmVmZXJlbmNlZFRhYmxlID0gZmsuZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCQkJCQlyZWZlcmVuY2VkVGFibGVOYW1lID0gcmVmZXJlbmNlZFRhYmxlLmdldE5hbWUoKTsKLQkJCQkJCWZrSW5mbyA9IG5ldyBGb3JlaWduS2V5SW5mbyhmaywgdGFibGVOYW1lLCByZWZlcmVuY2VkVGFibGVOYW1lICk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGJhc2VDb2xOYW1lID0gY29sdW1uUGFpci5nZXRCYXNlQ29sdW1uKCkuZ2V0TmFtZSgpOwotCQkJCQlTdHJpbmcgcmVmZXJlbmNlZENvbE5hbWUgPSBjb2x1bW5QYWlyLmdldFJlZmVyZW5jZWRDb2x1bW4oKS5nZXROYW1lKCk7Ci0JCQkJCWZrSW5mby5hZGRDb2x1bW5NYXBwaW5nKCBiYXNlQ29sTmFtZSwgIHJlZmVyZW5jZWRDb2xOYW1lICk7Ci0JCQkJfSAKLQkJCQlpZiggZmtJbmZvICE9bnVsbCApCi0JCQkJCXJldC5hZGQoIGZrSW5mbyApOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SmF2YVR5cGUoQ29sdW1uIGRiQ29sdW1uKSB7Ci0JCXJldHVybiBkYkNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSA/Ci0JCQkJZGJDb2x1bW4uZ2V0UHJpbWFyeUtleUphdmFUeXBlRGVjbGFyYXRpb24oKSA6Ci0JCQkJZGJDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlZmF1bHRTY2hlbWEoVGFibGUgZGJUYWJsZSl7Ci0JCVN0cmluZyBzY2hlbWFOYW1lID0gZGJUYWJsZS5nZXRTY2hlbWEoKS5nZXROYW1lKCk7Ci0JCVNjaGVtYSBkZWZhdWx0U2NoZW1hID0gZGJUYWJsZS5nZXRTY2hlbWEoKS5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJcmV0dXJuIGRlZmF1bHRTY2hlbWEuZ2V0TmFtZSgpID09IHNjaGVtYU5hbWU7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL0VudGl0eUdlblRvb2xzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9FbnRpdHlHZW5Ub29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWE0OGMzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL0VudGl0eUdlblRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuTmFtZVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLQotLyoqCi0gKiBVdGlsaXR5IG1ldGhvZHMgZm9yIGVudGl0eSBnZW5lcmF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5R2VuVG9vbHMgewotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIChkYXRhYmFzZSkgaWRlbnRpZmllciB0byBhIHVuaXF1ZSAiSmF2YSBzdHlsZSIKLQkgKiBjbGFzcyBuYW1lLgotCSAqIEBzZWUgI2NvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nLCBib29sZWFuLCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZShTdHJpbmcgaWRlbnRpZmllciwgQ29sbGVjdGlvbjxTdHJpbmc+IGNsYXNzTmFtZXMpIHsKLQkJcmV0dXJuIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoaWRlbnRpZmllciwgdHJ1ZSwgY2xhc3NOYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydCB0aGUgc3BlY2lmaWVkIChkYXRhYmFzZSkgaWRlbnRpZmllciB0byBhIHVuaXF1ZSAiSmF2YSBzdHlsZSIKLQkgKiBhdHRyaWJ1dGUgKGZpZWxkL3Byb3BlcnR5KSBuYW1lLgotCSAqIEBzZWUgI2NvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUlkZW50aWZpZXIoU3RyaW5nLCBib29sZWFuLCBDb2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGlkZW50aWZpZXIsIENvbGxlY3Rpb248U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcykgewotCQlyZXR1cm4gY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihpZGVudGlmaWVyLCBmYWxzZSwgYXR0cmlidXRlTmFtZXMpOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHNwZWNpZmllZCAoZGF0YWJhc2UpIGlkZW50aWZpZXIgdG8gYSB1bmlxdWUgIkphdmEgc3R5bGUiCi0JICogaWRlbnRpZmllcjoKLQkgKiAgICAgLSBpZiB0aGUgaWRlbnRpZmllciBpcyBhbGwtY2FwcywgY29udmVydCB1bmRlcnNjb3JlcyB0byAiY2FtZWwgY2FzZSIKLQkgKiAgICAgLSBpZiB0aGUgaWRlbnRpZmllciBpcyBub3QgYWxsLWNhcHMsIGxlYXZlIGl0IHVuY2hhbmdlZCAoZXhjZXB0LCBwb3NzaWJseSwgZm9yIHRoZSBmaXJzdCBsZXR0ZXIpCi0JICogICAgIC0gY29udmVydCB0byBhIGxlZ2FsIEphdmEgaWRlbnRpZmllcgotCSAqICAgICAgICAgLSBlbGltaW5hdGUgaWxsZWdhbCBjaGFyYWN0ZXJzCi0JICogICAgICAgICAtIGlmIHRoZSByZXN1bHQgaXMgYSByZXNlcnZlZCB3b3JkLCBtb2RpZnkgaXQgc2xpZ2h0bHkKLQkgKiBJZiB0aGUgcmVzdWx0IGlzIGFscmVhZHkgb25lIG9mIHRoZSBzcGVjaWZpZWQgZXhpc3RpbmcgaWRlbnRpZmllcnMKLQkgKiAoaWdub3JpbmcgY2FzZSBzbyB3ZSBkb24ndCBoYXZlIGZpbGVuYW1lIGNvbGxpc2lvbnMgb24gV2luZG93cyksCi0JICogbW9kaWZ5IGl0IHNsaWdodGx5IGFnYWluLgotCSAqICAgICAiRk9PIiA9PiAiRm9vIiBvciAiZm9vIgotCSAqICAgICAiRk9PX0JBUiIgPT4gIkZvb0JhciIgb3IgImZvb0JhciIKLQkgKiAgICAgIlBBQ0tBR0UiID0+ICJQYWNrYWdlIiBvciAicGFja2FnZV8iCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvVW5pcXVlSmF2YVN0eWxlSWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllciwgYm9vbGVhbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIsIENvbGxlY3Rpb248U3RyaW5nPiBpZGVudGlmaWVycykgewotCQlTdHJpbmcgcmVzdWx0ID0gaWRlbnRpZmllcjsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzVXBwZXJjYXNlKHJlc3VsdCkgfHwgU3RyaW5nVG9vbHMuc3RyaW5nSXNMb3dlcmNhc2UocmVzdWx0KSkgewotCQkJLy8gbGVhdmUgbWl4ZWQgY2FzZSBpZGVudGlmaWVycyBhbG9uZT8KLQkJCXJlc3VsdCA9IFN0cmluZ1Rvb2xzLmNvbnZlcnRVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKHJlc3VsdCwgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNhcGl0YWxpemVGaXJzdExldHRlciA/IFN0cmluZ1Rvb2xzLmNhcGl0YWxpemUocmVzdWx0KSA6IFN0cmluZ1Rvb2xzLnVuY2FwaXRhbGl6ZShyZXN1bHQpOwotCQl9Ci0JCXJlc3VsdCA9IE5hbWVUb29scy5jb252ZXJ0VG9KYXZhSWRlbnRpZmllcihyZXN1bHQpOwotCQkvLyBhc3N1bWUgdGhhdCBjb252ZXJ0aW5nIHRvIGEgdW5pcXVlIG5hbWUgd2lsbCBub3QgcmVzdWx0IGluIGEgSmF2YSByZXNlcnZlZCB3b3JkCi0JCS8vIChzaW5jZSBubyBKYXZhIHJlc2VydmVkIHdvcmRzIGVuZCB3aXRoIGEgbnVtYmVyKQotCQlyZXN1bHQgPSBOYW1lVG9vbHMudW5pcXVlTmFtZUZvcklnbm9yZUNhc2UocmVzdWx0LCBpZGVudGlmaWVycyk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCS8qKgotCSAqIFN1cHByZXNzIGRlZmF1bHQgY29uc3RydWN0b3IsIGVuc3VyaW5nIG5vbi1pbnN0YW50aWFiaWxpdHkuCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlHZW5Ub29scygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvRmlsZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhYjkwNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9GaWxlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLk1hbmlmZXN0OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuSnB0R2VuTWVzc2FnZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDb2xsZWN0aW9ucyBvZiB1dGlsaXR5IG1ldGhvZHMgaGFuZGxpbmcgZmlsZXMuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEZpbGVVdGlsCi17Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZUZvbGRlcihGaWxlIGZvbGRlcikKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlGaWxlW10gZmlsZXMgPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0JCS8vZW1wdHkgdGhlIGZvbGRlciBmaXJzdCAoamF2YS5pby5maWxlLmRlbGV0ZSByZXF1aXJlcyBpdCBlbXB0eSkKLQkJaWYgKGZpbGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyArK2kpIHsKLQkJCQlGaWxlIGYgPSBmaWxlc1tpXTsKLQkJCQlpZiAoZi5pc0RpcmVjdG9yeSgpKQotCQkJCQlkZWxldGVGb2xkZXIoZik7Ci0JCQkJZWxzZQotCQkJCQlkZWxldGVQYXRoKGYpOwotCQkJfQotCQl9Ci0JCWRlbGV0ZVBhdGgoZm9sZGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlUGF0aChGaWxlIGYpCi0JCXRocm93cyBJT0V4Y2VwdGlvbgotCXsKLQkJaWYgKCFmLmRlbGV0ZSgpKSB7Ci0JCQlTdHJpbmcgbXNnSWQgPSBmLmlzRGlyZWN0b3J5KCkgPyAgSnB0R2VuTWVzc2FnZXMuRGVsZXRlX0ZvbGRlcl9FcnJvciA6ICBKcHRHZW5NZXNzYWdlcy5EZWxldGVfRmlsZV9FcnJvcjsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbiggTkxTLmJpbmQobXNnSWQsZi5nZXRQYXRoKCkpKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShGaWxlIHNyYykKLQkJdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQlqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbSBmaW4gPSBuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oc3JjKTsKLQkJdHJ5IHsKLQkJCWxvbmcgZmlsZUxlbiA9IHNyYy5sZW5ndGgoKTsKLQkJCWlmIChmaWxlTGVuID4gSW50ZWdlci5NQVhfVkFMVUUpCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJmaWxlIGxlbmd0aCB0b28gYmlnIHRvIGJlIHJlYWQgYnkgRmlsZVV0aWwucmVhZEZpbGU6ICIgKyBmaWxlTGVuKTsKLQkJCi0JCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsoaW50KWZpbGVMZW5dOwotCQkJZmluLnJlYWQoYnl0ZXMpOwotCQkJcmV0dXJuIGJ5dGVzOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZmluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaWxlKEZpbGUgZGVzdCwgYnl0ZVtdIGJ5dGVzKQotCQl0aHJvd3MgSU9FeGNlcHRpb24KLQl7Ci0JCWlmIChkZXN0LmV4aXN0cygpICYmICFkZXN0LmNhbldyaXRlKCkpCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIE5MUy5iaW5kKEpwdEdlbk1lc3NhZ2VzLkZpbGVfUmVhZF9Pbmx5X0Vycm9yLCBkZXN0LmdldFBhdGgoKSkpOyAgLy90aHJvdyB3aXRoIGEgY2xlYXIgZXJyb3IgYmVjYXVzZSBvdGhlcndpc2UgRmlsZU91dHB1dFN0cmVhbSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIQotCQlqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0gZm91dCA9IG5ldyBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW0oZGVzdC5nZXRQYXRoKCksIGZhbHNlLyphcHBlbmQqLyk7Ci0JCXRyeSB7Ci0JCQlmb3V0LndyaXRlKGJ5dGVzKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWZvdXQuZmx1c2goKTsKLQkJCWZvdXQuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHVybCBmb3IgYSBmaWxlLgotCSAqIFRoaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIGZpbGUudG9VcmwoKSBidXQgd2l0aG91dCB0aGUgbm9uLXNlbnNlIGV4Y2VwdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRGaWxlVXJsKEZpbGUgZmlsZSkgewotCQl0cnkgewotCQkJcmV0dXJuIGZpbGUudG9VUkkoKS50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7IC8vc2hvdWxkIG5vdCBoYXBwZW4gYXMgZmlsZS50b1VSTCgpIGRvZXMgbm90IHJlYWxseSB0aHJvdyBhbiBleGNlcHRpb24KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGaWxlQ29udGVudChGaWxlIGZpbGUsIGphdmEuaW8uSW5wdXRTdHJlYW0gY29udGVudHMpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXRyeSB7Ci0JCQlJRmlsZSBpRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQkJaWYgKGlGaWxlID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBwYXRoICIgKyBmaWxlICsgIiBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgdmFsaWQgZmlsZSBwYXRoLiIpOwotCQkJfQotCQkJaUZpbGUuc2V0Q29udGVudHMoY29udGVudHMsIHRydWUvKmZvcmNlKi8sIHRydWUvKmtlZXBIaXN0b3J5Ki8sIG51bGwvKm1vbml0b3IqLyk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQkKLQkKLSAgICAvKioKLSAgICAgKiBFeHRyYWN0IHRoZSBjb250ZW50cyBvZiBhIEphciBhcmNoaXZlIHRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHVuamFyKElucHV0U3RyZWFtIGluLCBGaWxlIGRlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmICghZGVzdC5leGlzdHMoKSkgewotICAgICAgICAgICAgZGVzdC5ta2RpcnMoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWRlc3QuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEZXN0aW5hdGlvbiBtdXN0IGJlIGEgZGlyZWN0b3J5LiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBKYXJJbnB1dFN0cmVhbSBqaW4gPSBuZXcgSmFySW5wdXRTdHJlYW0oaW4pOwotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07Ci0KLSAgICAgICAgWmlwRW50cnkgZW50cnkgPSBqaW4uZ2V0TmV4dEVudHJ5KCk7Ci0gICAgICAgIHdoaWxlIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoZmlsZU5hbWUuY2hhckF0KGZpbGVOYW1lLmxlbmd0aCgpIC0gMSkgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWxlTmFtZS5jaGFyQXQoMCkgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyICE9ICcvJykgewotICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gZmlsZU5hbWUucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0LCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkgewotICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgZGlyZWN0b3J5IGV4aXN0cwotICAgICAgICAgICAgICAgIGZpbGUubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgamluLmNsb3NlRW50cnkoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgZXhpc3RzCi0gICAgICAgICAgICAgICAgRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5leGlzdHMoKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJlbnQubWtkaXJzKCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gZHVtcCB0aGUgZmlsZQotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgICAgICBpbnQgbGVuID0gMDsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGppbi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCkpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGxlbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICAgICAgICAgIGppbi5jbG9zZUVudHJ5KCk7Ci0gICAgICAgICAgICAgICAgZmlsZS5zZXRMYXN0TW9kaWZpZWQoZW50cnkuZ2V0VGltZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVudHJ5ID0gamluLmdldE5leHRFbnRyeSgpOwotICAgICAgICB9Ci0gICAgICAgIC8qIEV4cGxpY2l0bHkgd3JpdGUgb3V0IHRoZSBNRVRBLUlORi9NQU5JRkVTVC5NRiBzbyB0aGF0IGFueSBoZWFkZXJzIHN1Y2gKLSAgICAgICAgIGFzIHRoZSBDbGFzcy1QYXRoIGFyZSBzZWVuIGZvciB0aGUgdW5wYWNrYWdlZCBqYXIKLSAgICAgICAgICovCi0gICAgICAgIE1hbmlmZXN0IG1mID0gamluLmdldE1hbmlmZXN0KCk7Ci0gICAgICAgIGlmIChtZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShkZXN0LCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKTsvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBGaWxlIHBhcmVudCA9IGZpbGUuZ2V0UGFyZW50RmlsZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudC5leGlzdHMoKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgICAgIHBhcmVudC5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLSAgICAgICAgICAgIG1mLndyaXRlKG91dCk7Ci0gICAgICAgICAgICBvdXQuZmx1c2goKTsKLSAgICAgICAgICAgIG91dC5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgICAgIGppbi5jbG9zZSgpOwotICAgIH0KLSAgICAKLQkvL1VzZWQgdG8gVW56aXAgdGhlIGEgc3BlY2lmaWMgZm9sZGVyIHBhY2tlZCBpbnNpZGUgYSBwbHVnLWluIGJ1bmRsZSB0byB0aGUgcGx1Zy1pbiBzdGF0ZSBsb2NhdGlvbgotCXB1YmxpYyBzdGF0aWMgRmlsZSBleHRyYWN0RmlsZXNGcm9tQnVuZGxlKCBVUkwgdXJsLCBCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcGF0aCApIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgamFyVXJsID0gVXJsVXRpbC5nZXRKYXJGaWxlVXJsKHVybCk7Ci0JCUZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKGphclVybC5nZXRGaWxlKCkgKTsKLQkJTG9jYXRpb24gY29uZmlnTG9jYXRpb24gPSBQbGF0Zm9ybS5nZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJU3RyaW5nIHBsdWdpbklkID0gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpOwotCQlGaWxlIGNvbmZpZ0ZvbGRlciA9IG5ldyBGaWxlKCBjb25maWdMb2NhdGlvbi5nZXRVUkwoKS5nZXRGaWxlKCksIHBsdWdpbklkKTsKLQkJRmlsZSB0ZW1wbERpciA9IG5ldyBGaWxlKCBjb25maWdGb2xkZXIsIHBhdGggKTsKLQkJaWYoICF0ZW1wbERpci5leGlzdHMoKSApewotCQkJRmlsZVV0aWwudW5qYXIoIG5ldyBGaWxlSW5wdXRTdHJlYW0oIGphckZpbGUgKSwgY29uZmlnRm9sZGVyICk7Ci0JCQkvL0RlbGV0ZSB1bi1yZWxhdGVkIGZpbGVzIGFuZCBmb2xkZXJzCi0JCQlGaWxlW10gZmlsZXMgPSBjb25maWdGb2xkZXIubGlzdEZpbGVzKCk7Ci0JCQlmb3IoIEZpbGUgZiA6IGZpbGVzICl7Ci0JCQkJaWYoIGYuaXNGaWxlKCkgKQotCQkJCQlmLmRlbGV0ZSgpOwotCQkJCWVsc2UgaWYoICB0ZW1wbERpci5nZXRQYXRoKCkuaW5kZXhPZiggZi5nZXRQYXRoKCkgKSAhPTAgICl7Ci0JCQkJCUZpbGVVdGlsLmRlbGV0ZUZvbGRlcihmKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRlbXBsRGlyIDsKLQl9CQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9Gb3JlaWduS2V5SW5mby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL2ludGVybmFsL3V0aWwvRm9yZWlnbktleUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBmNWViOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9Gb3JlaWduS2V5SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotCi0vKioKLSAqIFJlcHJlc2VudHMgdGhlIG1ldGFkYXRhIGZvciBhIHBhcnRpY3VsYXIgZm9yZWlnbiBrZXkgcmVsYXRpb25zaGlwIAotICogaW4gYSByZWxhdGlvbmFsIGRhdGFiYXNlIHNjaGVtYS4KLSAqIDxwLz4KLSAqIFRoZSByZWZlcnJlciBjb2x1bW4gaXMgb25lIHdoaWNoIGFjdHVhbGx5IGNvbnRhaW5zIGEgZm9yZWlnbiAKLSAqIGtleSBjb25zdHJhaW50LCBhbmQgaXMgZXF1aXZhbGVudCB0byB0aGUgImZvcmVpZ24ga2V5IiBjb2x1bW4uCi0gKiA8cC8+Ci0gKiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gaXMgb25lIHdoaWNoIGEgcmVmZXJyZXIgb3IgZm9yZWlnbiBrZXkgCi0gKiBjb2x1bW4gcmVmZXJlbmNlcywgYW5kIGlzIGVxdWl2YWxlbnQgdG8gdGhlICJwcmltYXJ5IGtleSIgY29sdW1uLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JlaWduS2V5SW5mbwotewotCXByaXZhdGUgdHJhbnNpZW50IEZvcmVpZ25LZXkgbUZvcmVpZ25LZXkgOwotICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgIHByaXZhdGUgU3RyaW5nIG1SZWZlcnJlclRhYmxlTmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBtUmVmZXJlbmNlZFRhYmxlTmFtZTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJyZXJDb2xOYW1lcyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtUmVmZXJlbmNlZENvbE5hbWVzID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8U3RyaW5nPigpOwotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSBmayBUaGUgbmFtZSBvZiB0aGUgY29uc3RyYWludCBiYWNraW5nIAotICAgICAqIHRoaXMgZm9yZWlnbiBrZXkgbWV0YWRhdGEgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIEZvcmVpZ25LZXlJbmZvKEZvcmVpZ25LZXkgZmssIFN0cmluZyByZWZlcnJlclRhYmxlTmFtZSwgU3RyaW5nIHJlZmVyZW5jZWRUYWJsZU5hbWUpIHsKLSAgICAJbUZvcmVpZ25LZXkgPSBmazsKLSAgICAJbU5hbWUgPSBmay5nZXROYW1lKCk7Ci0gICAgCW1SZWZlcnJlclRhYmxlTmFtZSA9IHJlZmVycmVyVGFibGVOYW1lOwotICAgIAltUmVmZXJlbmNlZFRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JfQotICAgIC8qKgotICAgICAqIE9idGFpbiB0aGUgY29uc3RyYWludCBuYW1lIGZvciB0aGlzIGZvcmVpZ24ga2V5IHNwZWNpZmljYXRpb24uCi0gICAgICogVGhlIG5hbWUgZm9yIGEgRm9yZWlnbiBLZXkgbWF5LCBhcyBwZXIgdGhlIEpEQkMgc3BlY2lmaWNhdGlvbiwKLSAgICAgKiBiZSA8Y29kZT5udWxsPC9jb2RlPiB3aGVyZSB0aGUgY29uc3RyYWludCBpcyBub3QgbmFtZWQuCi0gICAgICogSW4gYWRkaXRpb24sIGl0IG1heSBiZSBoYXJkbHkgcmVjb2duaXphYmxlIHRvIHRoZSB1c2VyLAotICAgICAqIHBhcnRpY3VsYXJseSBmb3IgREIvMiBjb25zdHJhaW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBjb25zdHJhaW50IGJhY2tpbmcKLSAgICAgKiAgICAgICAgIHRoaXMgZm9yZWlnbiBrZXkgbWV0YWRhdGEgaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEZvcmVpZ25LZXkgZ2V0Rm9yZWlnbktleSgpewotICAgIAlyZXR1cm4gbUZvcmVpZ25LZXk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEFkZCBhbm90aGVyIHBhaXIgb2YgZm9yZWlnbiBrZXkgbWFwcGluZ3MgZm9yIHRoaXMgZm9yZWlnbiBrZXkKLSAgICAgKiBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEBwYXJhbSByZWZlcnJlckNvbHVtbiBUaGUgcmVmZXJyZXIgY29sdW1uIG5hbWUgZm9yIHRoaXMgbWFwcGluZy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcmVmZXJlbmNlZENvbHVtbiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBmb3IgdGhpcyBtYXBwaW5nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENvbHVtbk1hcHBpbmcoU3RyaW5nIHJlZmVycmVyQ29sTmFtZSwgU3RyaW5nIHJlZmVyZW5jZWRDb2xOYW1lKSB7Ci0gICAgCW1SZWZlcnJlckNvbE5hbWVzLmFkZChyZWZlcnJlckNvbE5hbWUpOwotICAgIAltUmVmZXJlbmNlZENvbE5hbWVzLmFkZChyZWZlcmVuY2VkQ29sTmFtZSk7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVycmVyIHRhYmxlIG5hbWUgb2YgdGhpcyBmb3JlaWduIGtleQotICAgICAqIHJlbGF0aW9uc2hpcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlZmVycmVyVGFibGVOYW1lKCkgewotICAgICAgICByZXR1cm4gbVJlZmVycmVyVGFibGVOYW1lOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcnJlciBjb2x1bW4gbmFtZXMgZm9yIHRoaXMKLSAgICAgKiBmb3JlaWduIGtleS4KLSAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGxpc3QgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBzaXplIG9mIAotICAgICAqIHRoZSBsaXN0IHJldHVyZWQgZnJvbSA8Y29kZT5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZXM8L2NvZGU+Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkgewotICAgICAgICByZXR1cm4gbVJlZmVycmVyQ29sTmFtZXM7Ci0gICAgfQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgdGFibGUgbmFtZSBvZiB0aGlzIGZvcmVpZ24ga2V5Ci0gICAgICogcmVsYXRpb25zaGlwLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIHsKLSAgICAJIHJldHVybiBtUmVmZXJlbmNlZFRhYmxlTmFtZTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZXMgZm9yIHRoaXMKLSAgICAgKiBmb3JlaWduIGtleS4KLSAgICAgKiBUaGUgc2l6ZSBvZiB0aGlzIGxpc3QgaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBzaXplIG9mIAotICAgICAqIHRoZSBsaXN0IHJldHVyZWQgZnJvbSA8Y29kZT5nZXRSZWZlcnJlckNvbHVtbk5hbWVzPC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWVzKCkgewotICAgICAgICByZXR1cm4gbVJlZmVyZW5jZWRDb2xOYW1lczsKLSAgICB9Ci0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAJcmV0dXJuICJuYW1lPSIgKyBtTmFtZQotCQkrICIsIHJlZmVycmVyVGFibGU9IiArIG1SZWZlcnJlclRhYmxlTmFtZQotCQkrICIsIHJlZmVyZW5jZWRUYWJsZT0iICsgbVJlZmVyZW5jZWRUYWJsZU5hbWUKLQkJKyAiLCByZWZlcnJlckNvbHVtbnM9IiArIG1SZWZlcnJlckNvbE5hbWVzCi0JCSsgIiwgcmVmZXJlbmNlZENvbHVtbnM9IiArIG1SZWZlcmVuY2VkQ29sTmFtZXMKLQkJCTsKLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL1N0cmluZ1V0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL1N0cmluZ1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmMjI5MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9TdHJpbmdVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbAotewotCS8qKgotCSAqIFBhZHMgYSBzdHJpbmcgYnkgYWRkaW5nIGEgc2VxdWVuY2Ugb2YgYW4gYXJiaXRyYXJ5IGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nLgotCSAqIEBwYXJhbSBwYWRDaGFyIFRoZSBjaGFyYWN0ZXIgdG8gYmUgdXNlZCBmb3IgcGFkZGluZy4KLQkgKiBAcGFyYW0gbGVuIFRoZSBkZXNpcmVkIGxlbmd0aCBhZnRlciBwYWRkaW5nLgotCSAqIEByZXR1cm4gVGhlIHBhZGRlZCBzdHJpbmcuIEZvciBleGFtcGxlIGlmIDxjb2RlPnN0cjwvY29kZT4gaXMgImY0ZSIgYW5kIDxjb2RlPnBhZENoYXI8L2NvZGU+IGlzICcwJyAKLQkgKiBhbmQgPGNvZGU+bGVuPC9jb2RlPiBpcyA2IHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyAiMDAwZjRlIgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhZExlZnQoU3RyaW5nIHN0ciwgY2hhciBwYWRDaGFyLCBpbnQgbGVuKSB7Ci0JCWlmKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpbnQgc3RyTGVuID0gc3RyLmxlbmd0aCgpOwotCQlpZiAoc3RyTGVuIDwgbGVuKSB7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW4pOwotCQkJaW50IGNvdW50ID0gbGVuLXN0ckxlbjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLQkJCQlidWZmZXIuYXBwZW5kKHBhZENoYXIpOwotCQkJYnVmZmVyLmFwcGVuZChzdHIpOwotCQkJc3RyID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN0cjsKLQl9Ci0JLyoqCi0JICogSW5zZXJ0cyBhIGdpdmVuIGNoYXJhY3RlciBhdCB0aGUgYmVnaW5uaW5nIGFuZCBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgc3RyaW5nLgotCSAqIEZvciBleGFtcGxlIGlmIHRoZSBzdHJpbmcgaXMgPHR0PmV4dHJlbWU8L3R0PiBhbmQgdGhlIGNoYXIgaXMgPHR0Pic8L3R0PiB0aGVuIAotCSAqIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgPHR0PidleHRlcm1lJzwvdHQ+LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHF1b3RlKFN0cmluZyBzdHIsIGNoYXIgYykgewotCQlhc3NlcnQoc3RyICE9IG51bGwpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzdHIubGVuZ3RoKCkrMik7Ci0JCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyKTsKLQkJYnVmZmVyLmFwcGVuZChjKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3VibGVRdW90ZShTdHJpbmcgc3RyKSB7Ci0JCXJldHVybiBxdW90ZShzdHIsICciJyk7Ci0JfQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGZpcnN0IGFuZCBsYXN0IHNpbmdsZSBvciBkb3VibGUgcXVvdGVzIChpZiB0aGV5IGV4aXN0KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnF1b3RlKFN0cmluZyBxdW90ZWQpIHsKLQkJaWYgKHF1b3RlZCAhPSBudWxsICYmIHF1b3RlZC5sZW5ndGgoKSA+PSAyKXsKLQkJCWludCBsZW4gPSBxdW90ZWQubGVuZ3RoKCk7Ci0JCQljaGFyIGZpcnN0Q2hhciA9IHF1b3RlZC5jaGFyQXQoMCk7Ci0JCQljaGFyIGxhc3RDaGFyID0gcXVvdGVkLmNoYXJBdChsZW4tMSk7Ci0JCQlpZiAoZmlyc3RDaGFyID09IGxhc3RDaGFyICYmIChmaXJzdENoYXIgPT0gJ1wnJyB8fCBmaXJzdENoYXIgPT0gJyInKSkgewotCQkJCXJldHVybiBxdW90ZWQuc3Vic3RyaW5nKDEsIGxlbi0xKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcXVvdGVkOwotCX0KLQkvKioKLQkgKiBUcnVuY2F0ZXMgYSBzdHJpbmcgYW5kIGFkZHMgIi4uLiIgaW4gdGhlIHJlc3VsdCBzdHJpbmcuCi0JICogSWYgdGhlIHN0cmluZyBsZW5ndGggaXMgbGVzcyBvciBlcXVhbCB0byB0aGUgbWF4IGxlbiB0aGVuIAotCSAqIHRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJ1bmNhdGUoU3RyaW5nIHMsIGludCBtYXhMZW4pIHsKLQkJaWYgKHMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0JCWlmIChsZW4gPiBtYXhMZW4pIHsKLQkJCWludCBzZWdtZW50TGVuID0gbWF4TGVuLzI7Ci0JCQlzID0gcy5zdWJzdHJpbmcoMCwgc2VnbWVudExlbikgKyAiLi4uIiArIHMuc3Vic3RyaW5nKGxlbi1zZWdtZW50TGVuKTsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBzYW1lIGNoYXJhY3RlciByZXBlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBlYXQoY2hhciBjLCBpbnQgY291bnQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoY291bnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgdW5sZXNzIGl0IGlzIGVtdHB0eSB3aGVyZSBpdCByZXR1cm5zIG51bGwuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbnVsbElmRW1wdHkoU3RyaW5nIHMpIHsKLQkJaWYgKHMgIT0gbnVsbCAmJiBzLmxlbmd0aCgpID09IDApIHsKLQkJCXMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBzOwotCX0KLQkvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNhbWUgY2hhcmFjdGVycyBhcyB0aGUgYXJndW1lbnQgc3RyaW5nIAotCSAqIGV4Y2VwdCB0aGF0IHRoZSBjb250cm9sIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IHRoZSB0aGVpciBoZXggY29kZS4KLQkgKiBGb3IgZXhhbXBsZSBpZiB0aGUgc3RyaW5nIGlzICJhYlxuYyIgdGhlIHJldHVybmVkIHN0cmluZyBpcyAiYWJ7MHhBfWMiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZpc2libGVTdHJpbmcoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyA8PSAweDFGIHx8IChjID09IDB4MjAgJiYgKGkgPT0gMCB8fCBpID09IGxlbi0xKSkpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCIoMHgiICsgSW50ZWdlci50b0hleFN0cmluZygoaW50KWMpLnRvVXBwZXJDYXNlKCkgKyAiKSIpOwotCQkJfQotCQkJZWxzZSBidWZmZXIuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JLyoqCi0JICogUmVwbGFjZXMgYSBwb3J0aW9uIG9mIHN0cmluZy4KLQkgKiBAcGFyYW0gc3RyIFRoZSBvcmlnaW5hbCBzdHJpbmcuCi0JICogQHBhcmFtIG9mZnNldCBUaGUgb2Zmc2V0IGluIHRoZSBvcmlnaW5hbCBzdHJpbmcgd2hlcmUgdGhlIHJlcGxhY2Ugc3RhcnRzCi0JICogQHBhcmFtIGxlbiBUaGUgcmVwbGFjZSBsZW5ndGggdGhlIG9yaWdpbmFsIHN0cmluZwotCSAqIEBwYXJhbSByZXBsYWNlU3RyIFRoZSByZXBsYWNlbWVudCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJSZXBsYWNlKFN0cmluZyBzdHIsIGludCBvZmZzZXQsIGludCBsZW4sIFN0cmluZyByZXBsYWNlU3RyKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHN0ci5sZW5ndGgoKS1sZW4rcmVwbGFjZVN0ci5sZW5ndGgoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3RyLnN1YnN0cmluZygwLCBvZmZzZXQpKTsKLQkJYnVmZmVyLmFwcGVuZChyZXBsYWNlU3RyKTsKLQkJYnVmZmVyLmFwcGVuZChzdHIuc3Vic3RyaW5nKG9mZnNldCtsZW4pKTsKLQkJCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyUmVwbGFjZShTdHJpbmcgc3RyLCBTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHJlcGxhY2VTdHIpCi0JewotCQlpZihzdHIgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYocGF0dGVybiA9PSBudWxsIHx8IHBhdHRlcm4uZXF1YWxzKCIiKSkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlpbnQgaW5kZXggPSBzdHIuaW5kZXhPZihwYXR0ZXJuKTsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBzdHI7Ci0JCQotCQlpZiAocmVwbGFjZVN0ciA9PSBudWxsKQotCQkJcmVwbGFjZVN0ciA9ICIiOwotCQlyZXR1cm4gc3RyLnN1YnN0cmluZygwLCBpbmRleCkgKyByZXBsYWNlU3RyICsgc3RyLnN1YnN0cmluZyhpbmRleCArIHBhdHRlcm4ubGVuZ3RoKCkpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJSZXBsYWNlQWxsKFN0cmluZyBzdHIsIFN0cmluZyBwYXR0ZXJuLCBTdHJpbmcgcmVwbGFjZVN0cikKLQl7Ci0JCWlmKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocmVwbGFjZVN0ciA9PSBudWxsKQotCQkJcmVwbGFjZVN0ciA9ICIiOwotCQlpZihwYXR0ZXJuID09IG51bGwgfHwgcGF0dGVybi5lcXVhbHMoIiIpKSB7Ci0JCQlyZXR1cm4gc3RyOwotCQl9Ci0JCWludCBpbmRleCA9IHN0ci5pbmRleE9mKHBhdHRlcm4pOwotCQl3aGlsZSAoaW5kZXggPj0gMCkgewotCQkJc3RyID0gc3RyLnN1YnN0cmluZygwLCBpbmRleCkgKyByZXBsYWNlU3RyICsgc3RyLnN1YnN0cmluZyhpbmRleCArIHBhdHRlcm4ubGVuZ3RoKCkpOwotCQkJaW5kZXggPSBzdHIuaW5kZXhPZihwYXR0ZXJuLCBpbmRleCtyZXBsYWNlU3RyLmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJJbnNlcnQoU3RyaW5nIHN0ciwgaW50IGluZGV4LCBTdHJpbmcgaW5zZXJ0U3RyKQotCXsKLQkJcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgaW5kZXgpCi0JCQkJKyBpbnNlcnRTdHIKLQkJCQkrIHN0ci5zdWJzdHJpbmcoaW5kZXgpOwotCX0KLSAgICAvKioKLSAgICAgKiBUb2tlbml6ZSB0aGUgc3BlY2lmaWVkIHN0cmluZyBpbnRvIGEgPGNvZGU+TGlzdDwvY29kZT4gb2YKLSAgICAgKiB3b3Jkcy4KLSAgICAgKiBJZiB0aGUgc3RyaW5nIHNwZWNpZmllZCBpcyA8Y29kZT5udWxsPC9jb2RlPiBvciBlbXB0eSwgdGhpcwotICAgICAqIG1ldGhvZCB3aWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcyAgICAgIFRoZSBzdHJpbmcgdG8gdG9rZW5pemUgaW50byBhIDxjb2RlPkxpc3Q8L2NvZGU+LgotICAgICAqIEBwYXJhbSBzZXAgICAgVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIgdG8gdXNlIHRvIHNwbGl0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgc3RyaW5nLgotICAgICAqIEBwYXJhbSB0cmltICAgSWYgPGNvZGU+dHJ1ZTwvY29kZT4sIHJ1biA8Y29kZT50cmltPC9jb2RlPiBvbgotICAgICAqICAgICAgICAgICAgICAgZWFjaCBlbGVtZW50IGluIHRoZSByZXN1bHQgPGNvZGU+TGlzdDwvY29kZT4uCi0gICAgICogCi0gICAgICogQHJldHVybiBBIDxjb2RlPkxpc3Q8L2NvZGU+IGNvbnRhaW5pbmcgYWxsIHRva2VuaXplZCB3b3JkcwotICAgICAqICAgICAgICAgaW4gdGhlIHBhcmFtZXRlciBzdHJpbmcuCi0gICAgICogICAgICAgICBFYWNoIGVsZW1lbnQgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotICAgICAqLwotCXB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IHN0clRvTGlzdChTdHJpbmcgcywgY2hhciBzZXAsIGJvb2xlYW4gdHJpbSkKLQl7Ci0JLy9leDogaWYgc2VwIGlzICc7JyB0aGVuIHMgc2hvdWxkIGJlIHNvbWV0aW5nIGxpa2UgIlJlZDtCbGFjayIKLQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJCQotCQlBcnJheUxpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCi0JCWNoYXIgZGVsaW1pdGVyc1tdID0ge3NlcH07Ci0JCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIocywgbmV3IFN0cmluZyhkZWxpbWl0ZXJzKSwgdHJ1ZS8qcmV0dXJuRGVsaW1pdGVycyovKTsKLQkJU3RyaW5nIGxhc3RUb2s9bnVsbDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2sgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAodG9rLmxlbmd0aCgpPT0xICYmIHRvay5jaGFyQXQoMCk9PXNlcCl7Ly9kZWxpbWl0ZXIKLQkJCSAgICBpZiAodG9rLmVxdWFscyhsYXN0VG9rKXx8bGFzdFRvaz09bnVsbC8qZmlyc3QgZWxlbWVudCBpcyBlbXB0eSovKQotCQkJICAgICAgICByZXN1bHQuYWRkKCIiKTsKLQkJCX0KLQkJCWVsc2V7Ci0JCQkgICAgaWYgKHRyaW0pCi0JCQkgICAgICAgIHRvayA9IHRvay50cmltKCk7Ci0JCQkgICAgcmVzdWx0LmFkZCh0b2spOwotCQkJfQotCQkJbGFzdFRvaz10b2s7Ci0JCX0KLQkJaWYobGFzdFRvay5sZW5ndGgoKT09MSAmJiBsYXN0VG9rLmNoYXJBdCgwKT09c2VwKS8vbGFzdCBlbGVtZW50IGlzIGVtcHR5Ci0JCSAgICByZXN1bHQuYWRkKCIiKTsKLQkJcmVzdWx0LnRyaW1Ub1NpemUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gc3RyVG9MaXN0KFN0cmluZyBzLCBjaGFyIHNlcCkKLQl7Ci0JCXJldHVybiBzdHJUb0xpc3Qocywgc2VwLCBmYWxzZS8qdHJpbSovKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbGlzdFRvU3RyKENvbGxlY3Rpb24gYSwgY2hhciBzZXApCi0JewotCQlyZXR1cm4gbGlzdFRvU3RyKGEsIFN0cmluZy52YWx1ZU9mKHNlcCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsaXN0VG9TdHIoQ29sbGVjdGlvbjxPYmplY3Q+IGEsIFN0cmluZyBzZXApIHsKLQkJLy9yZXZlcnNlIG9mIHN0clRvTGlzdAotCQlpZiAoYSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBjb3VudCA9IGEuc2l6ZSgpOwotCQlpZiAoY291bnQgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3I8T2JqZWN0PiBpdGVyID0gYS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotCQl7Ci0JCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAob2JqID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkKLQkJCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQllbHNlCi0JCQkJYnVmZmVyLmFwcGVuZChzZXApOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFN0cmluZykKLQkJCQlidWZmZXIuYXBwZW5kKChTdHJpbmcpb2JqKTsKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKG9iaik7Ci0JCX0KLQkJcmV0dXJuIChidWZmZXIgIT0gbnVsbCkgPyBidWZmZXIudG9TdHJpbmcoKSA6IG51bGw7Ci0JfQotCS8qKgotCSAqIENvbnZlcnQgdGhlIHRleHQgb2YgYSBTdHJpbmcgaW50byBhIE1hcCBvZiBTdHJpbmdzLCB3aGVyZSBlYWNoCi0JICoga2V5IGFuZCB2YWx1ZSBpbiB0aGUgTWFwIGlzIG9mIHR5cGUgU3RyaW5nLgotCSAqIAotCSAqIEBwYXJhbSBzICAgICAgVGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBNYXAuCi0JICogQHBhcmFtIHNlcDEgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5cyBhbmQgdGhlaXIKLQkgKiAgICAgICAgICAgICAgIHZhbHVlcy4KLQkgKiBAcGFyYW0gc2VwMiAgIFRoZSBzZXBhcmF0b3IgYmV0d2VlbiBrZXktdmFsdWUgcGFpcnMuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIGNvbnZlcnRlZCB0byBhIE1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEudXRpbC5NYXA8U3RyaW5nLCBTdHJpbmc+IHN0clRvTWFwKFN0cmluZyBzLCBjaGFyIHNlcDEsIGNoYXIgc2VwMikKLQl7Ci0JCXJldHVybiBzdHJUb01hcChzLCBzZXAxLCBzZXAyLCBmYWxzZS8qbG93ZXJjYXNlS2V5cyovKTsKLQl9Ci0JLyoqCi0JICogQ29udmVydCB0aGUgdGV4dCBvZiBhIFN0cmluZyBpbnRvIGEgTWFwIG9mIFN0cmluZ3MsIHdoZXJlIGVhY2gKLQkgKiBrZXkgYW5kIHZhbHVlIGluIHRoZSBNYXAgaXMgb2YgdHlwZSBTdHJpbmcuCi0JICogVGhpcyBmb3JtIGFsc28gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoYXQgYWxsIGtleXMgd2lsbCBiZQotCSAqIGNvbnZlcnRlZCB0byBsb3dlci1jYXNlIGJlZm9yZSBhZGRpbmcgdG8gdGhlIE1hcC4KLQkgKiAKLQkgKiBAcGFyYW0gcyAgICAgIFRoZSBzdHJpbmcgdG8gYmUgY29udmVydGVkIHRvIGEgTWFwLgotCSAqIEBwYXJhbSBzZXAxICAgVGhlIHNlcGFyYXRvciBiZXR3ZWVuIGtleXMgYW5kIHRoZWlyCi0JICogICAgICAgICAgICAgICB2YWx1ZXMuCi0JICogQHBhcmFtIHNlcDIgICBUaGUgc2VwYXJhdG9yIGJldHdlZW4ga2V5LXZhbHVlIHBhaXJzLgotCSAqIEBwYXJhbSBsb3dlcmNhc2VLZXlzCi0JICogICAgICAgICAgICAgICBXaGV0aGVyIHRvIGNvbnZlcnQga2V5cyB0byBsb3dlciBjYXNlCi0JICogICAgICAgICAgICAgICBiZWZvcmUgYWRkaW5nIHRvIHRoZSBNYXAuCi0JICogCi0JICogQHJldHVybiBUaGUgc3RyaW5nIGNvbnZlcnRlZCB0byBhIE1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGphdmEudXRpbC5NYXA8U3RyaW5nLCBTdHJpbmc+IHN0clRvTWFwKFN0cmluZyBzLCBjaGFyIHNlcDEsIGNoYXIgc2VwMiwgYm9vbGVhbiBsb3dlcmNhc2VLZXlzKQotCXsKLQkJLy9leDogaWYgc2VwMSBpcyAnOicgYW5kIHNlcDIgaXMgJywnIHRoZW4gcyBzaG91bGQgYmUgc29tZXRoaW5nIGxpa2UgImNvbG9yOlJlZCxzaXplOlhMIgotCQkKLQkJaWYgKHMgPT0gbnVsbCB8fCBzLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotCQl9Ci0JCQkKLQkJamF2YS51dGlsLkxpc3Q8U3RyaW5nPiBhID0gc3RyVG9MaXN0KHMsIHNlcDIpOwotCQlpZiAoYSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLQkJfQotCQkKLQkJamF2YS51dGlsLkhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGhtID0gbmV3IGphdmEudXRpbC5IYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlpbnQgY291bnQgPSBhLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCQl7Ci0JCQlTdHJpbmcgczIgPSAoU3RyaW5nKWEuZ2V0KGkpOyAvL2V4OiBjb2xvcjpSZWQKLQkJCWludCBwb3MgPSBzMi5pbmRleE9mKHNlcDEpOwotCQkJaWYgKHBvcyA+PSAwKQotCQkJewotCQkJCVN0cmluZyBuYW1lID0gczIuc3Vic3RyaW5nKDAsIHBvcyk7Ci0JCQkJU3RyaW5nIHZhbCA9IHMyLnN1YnN0cmluZyhwb3MrMSk7Ci0JCQkJaWYgKGxvd2VyY2FzZUtleXMpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaG0ucHV0KG5hbWUsIHZhbCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGhtOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYXBUb1N0cihqYXZhLnV0aWwuTWFwIGhtLCBjaGFyIHNlcDEsIGNoYXIgc2VwMikKLQkvL3JldmVyc2Ugb2Ygc3RyVG9NYXAKLQl7Ci0JCWlmIChobSA9PSBudWxsIHx8IGhtLmlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJamF2YS51dGlsLkl0ZXJhdG9yPGphdmEudXRpbC5NYXAuRW50cnk+IGl0ZXIgPSBobS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJamF2YS51dGlsLk1hcC5FbnRyeSBlbnRyeSA9IChqYXZhLnV0aWwuTWFwLkVudHJ5KWl0ZXIubmV4dCgpOwotCQkJYnVmZmVyLmFwcGVuZChlbnRyeS5nZXRLZXkoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKHNlcDEpOwotCQkJYnVmZmVyLmFwcGVuZChlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCWJ1ZmZlci5hcHBlbmQoc2VwMik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLSAgICAvKioKLSAgICAgKiBQZXJmb3JtIGEgPGVtPmNhc2UgaW5zZW5zaXRpdmU8L2VtPiBjb21wYXJpc29uIGJldHdlZW4KLSAgICAgKiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9ucyBvZiB0d28gb2JqZWN0cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb2JqMSAgIFRoZSBmaXJzdCBvYmplY3QgdG8gY29tcGFyZS4KLSAgICAgKiBAcGFyYW0gb2JqMiAgIFRoZSBzZWNvbmQgb2JqZWN0IHRvIGNvbXBhcmUuCi0gICAgICogCi0gICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBib3RoIG9iamVjdHMgaGF2ZSB0aGUKLSAgICAgKiAgICAgICAgIHNhbWUgY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbXBhcmVBc1N0cmluZ3MoT2JqZWN0IG9iajEsIE9iamVjdCBvYmoyKQotCXsJCi0JCWlmIChvYmoxID09IG51bGwgfHwgb2JqMiA9PSBudWxsKQotCQkJcmV0dXJuIG9iajEgPT0gb2JqMjsKLQkJCi0JCVN0cmluZyBzMSwgczI7Ci0JCWlmIChvYmoxIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlzMSA9IChTdHJpbmcpb2JqMTsKLSAgICAgICAgfSBlbHNlIHsKLQkJCXMxID0gb2JqMS50b1N0cmluZygpOwotICAgICAgICB9Ci0JCWlmIChvYmoyIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQlzMiA9IChTdHJpbmcpb2JqMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQkJCXMyID0gb2JqMi50b1N0cmluZygpOwotICAgICAgICB9Ci0JCQotCQlyZXR1cm4gczEuZXF1YWxzSWdub3JlQ2FzZShzMik7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgYSBzdHJpbmcgc3RhcnRzIHdpdGggYW55IG9mIGEgbGlzdCBvZiBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzdGFydHNXaXRoQW55KFN0cmluZyBzLCBMaXN0PFN0cmluZz4gcHJlZml4ZXMpIHsKLQkJaW50IGNvdW50ID0gcHJlZml4ZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLQkJCWlmIChzLnN0YXJ0c1dpdGgoKFN0cmluZylwcmVmaXhlcy5nZXQoaSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhcmd1bWVudCBzdHJpbmcgd2l0aCB0aGUgZmlyc3QgY2hhciB1cHBlci1jYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluaXRVcHBlcihTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHN0cjsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHN0ci5jaGFyQXQoMCkpICsgc3RyLnN1YnN0cmluZygxKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJndW1lbnQgc3RyaW5nIHdpdGggdGhlIGZpcnN0IGNoYXIgbG93ZXItY2FzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpbml0TG93ZXIoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBzdHI7Ci0JCX0KLQkJcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZShzdHIuY2hhckF0KDApKSArIHN0ci5zdWJzdHJpbmcoMSk7Ci0JfQotCS8qKgotCSAqIFRlc3RzIHdoZXRoZXIgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZyBhcmUgdXBwZXIKLQkgKiBjYXNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwcGVyQ2FzZShTdHJpbmcgcykgewotCQlyZXR1cm4gcy50b1VwcGVyQ2FzZSgpLmVxdWFscyhzKTsKLQl9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3Qgbm9uLXdoaXRlIGNoYXIgaW5kZXggc3RhcnRpbmcgZnJvbSB0aGUgCi0JICogc3BlY2lmaWVkIGluZGV4LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHNraXBXaGl0ZVNwYWNlcyhTdHJpbmcgc3RyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGxlbiA9IHN0ci5sZW5ndGgoKTsKLQkJd2hpbGUgKGluZGV4IDwgbGVuKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2Uoc3RyLmNoYXJBdChpbmRleCkpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkrK2luZGV4OwotCQl9Ci0JCXJldHVybiBpbmRleDsKLQl9Ci0JLyoqCi0JICogQ29sbGFwc2VzIGNvbnNlY3V0aXZlIHdoaXRlIHNwYWNlcyBpbnRvIG9uZSBzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2xsYXBzZVdoaXRlU3BhY2VzKFN0cmluZyBzdHIpewotCSAgICBTdHJpbmcgcmVzdWx0PW51bGw7Ci0JICAgIGlmIChzdHIhPW51bGwpewotCSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlcj1uZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAgICAgICBib29sZWFuIGlzSW5XaGl0ZVNwYWNlPWZhbHNlOwotCSAgICAgICAgZm9yIChpbnQgaT0wO2k8c3RyLmxlbmd0aCgpO2krKyl7Ci0JICAgICAgICAgICAgY2hhciBjPXN0ci5jaGFyQXQoaSk7Ci0JICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpewotCSAgICAgICAgICAgICAgICBpc0luV2hpdGVTcGFjZT10cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlIHsKLQkgICAgICAgICAgICAgICAgaWYgKGlzSW5XaGl0ZVNwYWNlKQotCSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgiICIpOwotCSAgICAgICAgICAgICAgICBpc0luV2hpdGVTcGFjZT1mYWxzZTsgICAKLQkgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICByZXN1bHQ9YnVmZmVyLnRvU3RyaW5nKCk7Ci0JICAgIH0KLQkgICAgcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JLyoqCi0JICogVXRpbGl0eSBtZXRob2RzIHVzZWQgdG8gY29udmVydCBEQiBvYmplY3QgbmFtZXMgdG8gIAotCSAqIGFwcHJvcHJpYXRlIEphdmEgdHlwZSBhbmQgZmllbGQgbmFtZSAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwbHVyYWxpc2UoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG5hbWU7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDEpIHsKLQkJCXJlc3VsdCArPSAncyc7Ci0JCX0gZWxzZSBpZiAoIXNlZW1zUGx1cmFsaXNlZChuYW1lKSkgewotCQkJU3RyaW5nIGxvd2VyID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKCFsb3dlci5lbmRzV2l0aCgiZGF0YSIpKSB7IC8vb3JkZXJEYXRhIC0tPiBvcmRlckRhdGFzIGlzIGR1bWIKLQkJCQljaGFyIHNlY29uZExhc3QgPSBsb3dlci5jaGFyQXQobmFtZS5sZW5ndGgoKSAtIDIpOwotCQkJCWlmICghaXNWb3dlbChzZWNvbmRMYXN0KSAmJiBsb3dlci5lbmRzV2l0aCgieSIpKSB7Ci0JCQkJCS8vIGNpdHksIGJvZHkgZXRjIC0tPiBjaXRpZXMsIGJvZGllcwotCQkJCQlyZXN1bHQgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSkgKyAiaWVzIjsKLQkJCQl9IGVsc2UgaWYgKGxvd2VyLmVuZHNXaXRoKCJjaCIpIHx8IGxvd2VyLmVuZHNXaXRoKCJzIikpIHsKLQkJCQkJLy8gc3dpdGNoIC0tPiBzd2l0Y2hlcyAgb3IgYnVzIC0tPiBidXNlcwotCQkJCQlyZXN1bHQgPSBuYW1lICsgImVzIjsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBuYW1lICsgInMiOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNpbmd1bGFyaXNlKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuYW1lOwotCQlpZiAoc2VlbXNQbHVyYWxpc2VkKG5hbWUpKSB7Ci0JCQlTdHJpbmcgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAobG93ZXIuZW5kc1dpdGgoImllcyIpKSB7Ci0JCQkJLy8gY2l0aWVzIC0tPiBjaXR5Ci0JCQkJcmVzdWx0ID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIDMpICsgInkiOwotCQkJfSBlbHNlIGlmIChsb3dlci5lbmRzV2l0aCgiY2hlcyIpIHx8IGxvd2VyLmVuZHNXaXRoKCJzZXMiKSkgewotCQkJCS8vIHN3aXRjaGVzIC0tPiBzd2l0Y2ggb3IgYnVzZXMgLS0+IGJ1cwotCQkJCXJlc3VsdCA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSAyKTsKLQkJCX0gZWxzZSBpZiAobG93ZXIuZW5kc1dpdGgoInMiKSkgewotCQkJCS8vIGN1c3RvbWVycyAtLT4gY3VzdG9tZXIKLQkJCQlyZXN1bHQgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBpc1Zvd2VsKGNoYXIgYykgewotCQlib29sZWFuIHZvd2VsID0gZmFsc2U7Ci0JCXZvd2VsIHw9IGMgPT0gJ2EnOwotCQl2b3dlbCB8PSBjID09ICdlJzsKLQkJdm93ZWwgfD0gYyA9PSAnaSc7Ci0JCXZvd2VsIHw9IGMgPT0gJ28nOwotCQl2b3dlbCB8PSBjID09ICd1JzsKLQkJdm93ZWwgfD0gYyA9PSAneSc7Ci0JCXJldHVybiB2b3dlbDsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZWVtc1BsdXJhbGlzZWQoU3RyaW5nIG5hbWUpIHsKLQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJYm9vbGVhbiBwbHVyYWxpc2VkID0gZmFsc2U7Ci0JCXBsdXJhbGlzZWQgfD0gbmFtZS5lbmRzV2l0aCgiZXMiKTsKLQkJcGx1cmFsaXNlZCB8PSBuYW1lLmVuZHNXaXRoKCJzIik7Ci0JCXBsdXJhbGlzZWQgJj0gIShuYW1lLmVuZHNXaXRoKCJzcyIpIHx8IG5hbWUuZW5kc1dpdGgoInVzIikpOwotCQlyZXR1cm4gcGx1cmFsaXNlZDsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBuYW1lIG9mIGEgY2xhc3MgbmFtZS4KLQkgKiBGb3IgZXhhbXBsZSBpZiBnaXZlbiA8Y29kZT5vcmFjbGUudXRpbC5PYmplY3RVdGlsPC9jb2RlPiBpdCB3b3VsZCByZXR1cm4gCi0JICogPGNvZGU+b3JhY2xlLnV0aWw8L2NvZGU+LiBJZiB0aGUgY2xhc3MgaXMgbm90IGluIGEgcGFja2FnZSB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlpZihjbGFzc05hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaW50IGxhc3REb3RJbmRleCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlpZiAobGFzdERvdEluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzcyBuYW1lIGdpdmVuIGEgZnVsbCBjbGFzcyBuYW1lLgotCSAqIEZvciBleGFtcGxlIGlmIGdpdmVuIDxjb2RlPm9yYWNsZS51dGlsLk9iamVjdFV0aWw8L2NvZGU+IGl0IHdvdWxkIHJldHVybiAKLQkgKiA8Y29kZT5PYmplY3RVdGlsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzTmFtZShTdHJpbmcgZnVsbENsYXNzTmFtZSkgewotCQlpZihmdWxsQ2xhc3NOYW1lID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWludCBsYXN0RG90SW5kZXggPSBmdWxsQ2xhc3NOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChsYXN0RG90SW5kZXggPCAwKQotCQkJcmV0dXJuIGZ1bGxDbGFzc05hbWU7Ci0JCXJldHVybiBmdWxsQ2xhc3NOYW1lLnN1YnN0cmluZyhsYXN0RG90SW5kZXgrMSk7Ci0JfQotCi0JCi0JLyoqCi0JICogQ29udmVydHMgYSBkYXRhYmFzZSBjb2x1bW4gbmFtZSB0byBhIEphdmEgdmFyaWFibGUgbmFtZSAoPGVtPmZpcnN0IGxldHRlcgotCSAqIG5vdCBjYXBpdGFsaXplZDwvZW0+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb2x1bW5OYW1lVG9WYXJOYW1lKFN0cmluZyBjb2x1bW5OYW1lKSB7Ci0JCXJldHVybiBkYk5hbWVUb1Zhck5hbWUoY29sdW1uTmFtZSk7Ci0JfQotCS8qKgotCSAqIENvbnZlcnRzIGEgZGF0YWJhc2UgdGFibGUgbmFtZSB0byBhIEphdmEgdmFyaWFibGUgbmFtZSAoPGVtPmZpcnN0IGxldHRlcgotCSAqIG5vdCBjYXBpdGFsaXplZDwvZW0+KS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0YWJsZU5hbWVUb1Zhck5hbWUoU3RyaW5nIHRhYmxlTmFtZSkgewotCQlyZXR1cm4gZGJOYW1lVG9WYXJOYW1lKHRhYmxlTmFtZSk7Ci0JfQotCS8qKgotCSAqIENvbnZlcnRzIGEgZGF0YWJhc2UgbmFtZSAodGFibGUgb3IgY29sdW1uKSB0byBhIGphdmEgbmFtZSAoPGVtPmZpcnN0IGxldHRlcgotCSAqIG5vdCBjYXBpdGFsaXplZDwvZW0+KS4gZW1wbG95ZWVfbmFtZSBvciBlbXBsb3llZS1uYW1lIC0+IGVtcGxveWVlTmFtZQotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkYk5hbWVUb1Zhck5hbWUoU3RyaW5nIHMpIHsKLQkJaWYgKCIiLmVxdWFscyhzKSkgewotCQkJcmV0dXJuIHM7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlib29sZWFuIGNhcGl0YWxpemUgPSB0cnVlOwotCQlib29sZWFuIGxhc3RDYXBpdGFsID0gZmFsc2U7Ci0JCWJvb2xlYW4gbGFzdERlY2FwaXRhbGl6ZWQgPSBmYWxzZTsKLQkJU3RyaW5nIHAgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotCQkJU3RyaW5nIGMgPSBzLnN1YnN0cmluZyhpLCBpICsgMSk7Ci0JCQlpZiAoIl8iLmVxdWFscyhjKSB8fCAiICIuZXF1YWxzKGMpKSB7Ci0JCQkJY2FwaXRhbGl6ZSA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmIChjLnRvVXBwZXJDYXNlKCkuZXF1YWxzKGMpKSB7Ci0JCQkJaWYgKGxhc3REZWNhcGl0YWxpemVkICYmICFsYXN0Q2FwaXRhbCkgewotCQkJCQljYXBpdGFsaXplID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJbGFzdENhcGl0YWwgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlsYXN0Q2FwaXRhbCA9IGZhbHNlOwotCQkJfQotCi0JCQlpZiAoY2FwaXRhbGl6ZSkgewotCQkJCWlmIChwID09IG51bGwgfHwgIXAuZXF1YWxzKCJfIikpIHsKLQkJCQkJcmVzdWx0LmFwcGVuZChjLnRvVXBwZXJDYXNlKCkpOwotCQkJCQljYXBpdGFsaXplID0gZmFsc2U7Ci0JCQkJCXAgPSBjOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdC5hcHBlbmQoYy50b0xvd2VyQ2FzZSgpKTsKLQkJCQkJY2FwaXRhbGl6ZSA9IGZhbHNlOwotCQkJCQlwID0gYzsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdC5hcHBlbmQoYy50b0xvd2VyQ2FzZSgpKTsKLQkJCQlsYXN0RGVjYXBpdGFsaXplZCA9IHRydWU7Ci0JCQkJcCA9IGM7Ci0JCQl9Ci0KLQkJfQotCQkvKnRoaXMgd2FzIHVzaW5nIFN0cmluZ1V0aWwuaW5pdExvd2VyLiBDaGFuZ2VkIHRvIEludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUgc28gdGhhdCAKLQkJICogaXQgcmV0dXJucyB0aGUgY29ycmVjdCBiZWFuIHByb3BlcnR5IG5hbWUgd2hlbiBjYWxsZWQgZnJvbSBjb2x1bW5OYW1lVG9WYXJOYW1lLgotCQkgKiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSBVUkwgd291bGQgYmUgdVJMIHdoaWNoIHdvdWxkIGNhdXNlIAotCQkgKiBhbiAiVGhlIHByb3BlcnR5IHVSTCBpcyB1bmRlZmluZWQgZm9yIHRoZSB0eXBlIHh4IiBlcnJvciBiZWNhdXNlIAotCQkgKiBJbnRyb3NwZWN0b3IuZ2V0QmVhbkluZm8gKHVzZWQgYnkgSmF2YVR5cGVJbnRyb3NwZWN0b3IpIHJldHVybnMgCi0JCSAqIHRoZSBwcm9wZXJ0eSBuYW1lIGFzIFVSTC4qLwotCQlTdHJpbmcgcmVzdWx0U3RyID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShyZXN1bHQudG9TdHJpbmcoKSk7Ci0JCWlmIChyZXN1bHRTdHIuZXF1YWxzKCJjbGFzcyIpKSB7Ci0JCQkvLyAiY2xhc3MiIGlzIGlsbGVnYWwgYmVjYXVzZU9mIE9iamVjdC5nZXRDbGFzcygpIGNsYXNoCi0JCQlyZXN1bHRTdHIgPSAiY2xhenoiOwotCQl9Ci0JCXJldHVybiByZXN1bHRTdHI7Ci0JfQotCQotCS8qKgotCSAqIENvbXBhcmUgdHdvIG9iamVjdHMuIElmIGJvdGggU3RyaW5nLCBpZ25vcmUgY2FzZQotCSAqIEBwYXJhbSBvMQotCSAqIEBwYXJhbSBvMgotCSAqIEBwYXJhbSBpZ25vcmVDYXNlSWZTdHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsT2JqZWN0cyhPYmplY3QgbzEsIE9iamVjdCBvMiwgYm9vbGVhbiBpZ25vcmVDYXNlSWZTdHIpCi0JewotCQlpZiAobzEgPT0gbzIpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JICAgIGJvb2xlYW4gcmVzdWx0OwotCSAgICBpZiAobzEgPT0gbnVsbCB8fCBvMiA9PSBudWxsKSB7Ci0JICAgIAlyZXR1cm4gZmFsc2U7IC8vd2UgYWxyZWFkeSBjaGVja2VkIG8xID09IG8yIGFib3ZlCi0JICAgIH0KLQkgICAgaWYgKGlnbm9yZUNhc2VJZlN0ciAmJiBvMSBpbnN0YW5jZW9mIFN0cmluZyAmJiBvMiBpbnN0YW5jZW9mIFN0cmluZykKLQkgICAgICAgIHJlc3VsdCA9ICgoU3RyaW5nKW8xKS5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpbzIpOwotCSAgICBlbHNlCi0JICAgICAgICByZXN1bHQgPSBvMS5lcXVhbHMobzIpOwotCQotCSAgICByZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbE9iamVjdHMoT2JqZWN0IG8xLCBPYmplY3QgbzIpCi0JewotCSAgICByZXR1cm4gZXF1YWxPYmplY3RzKG8xLCBvMiwgZmFsc2UvKmlnbm9yZUNhc2VJZlN0ciovKTsKLQl9Ci0JCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL1VybFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi9pbnRlcm5hbC91dGlsL1VybFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0ZjEzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vaW50ZXJuYWwvdXRpbC9VcmxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIENvbGxlY3Rpb25zIG9mIHV0aWxpdHkgbWV0aG9kcyBoYW5kbGluZyBVUkxzLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVcmxVdGlsCi17Ci0JLyoqCi0JICogVGhlIDxjb2RlPmZpbGU8L2NvZGU+IHN0cmluZyBpbmRpY2F0aW5nIGEgdXJsIGZpbGUgcHJvdG9jb2wuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlIjsKLQkvKioKLQkgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gc3RyaW5nIGluZGljYXRpbmcgYSB1cmwgaHR0cCBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHAiOwotCS8qKgotCSAqIFRoZSA8Y29kZT5maWxlPC9jb2RlPiBzdHJpbmcgaW5kaWNhdGluZyBhIHVybCBodHRwIHByb3RvY29sLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBTX1BST1RPQ09MID0gImh0dHBzIjsKLQkvKioKLQkgKiBUaGUgPGNvZGU+ZmlsZTwvY29kZT4gc3RyaW5nIGluZGljYXRpbmcgYSB1cmwgZmlsZSBwcm90b2NvbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfUFJPVE9DT0wgPSAiamFyIjsKLQotCQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHVybCBpcyB0byBhIGZpbGUsIGkuZSBpdHMgcHJvdG9jb2wgaXMgPGNvZGU+ZmlsZTwvY29kZT4uCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRmlsZVVybChVUkwgdXJsKSB7Ci0JCXJldHVybiB1cmwgIT0gbnVsbCAmJiBGSUxFX1BST1RPQ09MLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHVybCBpcyB0byBhIGphciwgaS5lIGl0cyBwcm90b2NvbCBpcyA8Y29kZT5qYXI8L2NvZGU+LgotCSAqIEZvciBleGFtcGxlIDxjb2RlPmphcjpmaWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXIhL01FVEEtSU5GL3RsZHMvc3RydXRzLWJlYW4udGxkPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKYXJVcmwoVVJMIHVybCkgewotCQlyZXR1cm4gdXJsICE9IG51bGwgJiYgSkFSX1BST1RPQ09MLmVxdWFscyh1cmwuZ2V0UHJvdG9jb2woKSk7Ci0JfQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHVybCBwcm90b2NvbCBpcyBodHRwLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0h0dHBVcmwoVVJMIHVybCkgewotCQlTdHJpbmcgcHJvdG9jb2wgPSAgdXJsLmdldFByb3RvY29sKCk7Ci0JCXJldHVybiB1cmwgIT0gbnVsbCAmJiAoSFRUUF9QUk9UT0NPTC5lcXVhbHMocHJvdG9jb2wpIHx8IEhUVFBTX1BST1RPQ09MLmVxdWFscyhwcm90b2NvbCkpOwotCX0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5GaWxlPC9jb2RlPiBjb3JyZXNwb25kaW5nIHRvIGEgdXJsLCBvciBudWxsIGlmIHRoZSB1cmwgCi0JICogcHJvdG9jb2wgaXMgbm90IGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBqYXZhLmlvLkZpbGUgZ2V0VXJsRmlsZShVUkwgdXJsKSB7Ci0JCWlmIChpc0ZpbGVVcmwodXJsKSAmJiAhaXNKYXJVcmwoIHVybCApICl7Ci0JCQlGaWxlIHJldCA9IG5ldyBqYXZhLmlvLkZpbGUodXJsLmdldEZpbGUoKSk7Ci0JCQlyZXR1cm4gcmV0IDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAJfQotCi0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdXJsIHRvIGEgamFyIGZpbGUgZ2l2ZW4gYSB1cmwgdG8gYSBmaWxlIGluc2lkZSAKLQkgKiB0aGUgamFyLgotCSAqIEZvciBleGFtcGxlIGlmIGdpdmVuIAotCSAqIDxjb2RlPmphcjpmaWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXIhL01FVEEtSU5GL3RsZHMvc3RydXRzLWJlYW4udGxkPC9jb2RlPgotCSAqIHRoaXMgbWV0aG9kIHJldHVybnMgPGNvZGU+ZmlsZTovQzovdGVzdGFwcHMvZXhhbXBsZS9XRUItSU5GL2xpYi9zdHJ1dHMuamFyPC9jb2RlPi4KLQkgKiAKLQkgKiA8cD5SZXR1cm5zIG51bGwgaWYgdGhlIGdpdmVuIHVybCBpcyBub3QgcmVjb2duaXplZCBhcyBhIHVybCB0byBhIGZpbGUgCi0JICogaW5zaWRlIGEgamFyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEphckZpbGVVcmwoVVJMIHVybCkgewotCQlpZiAoIWlzSmFyVXJsKHVybCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBmaWxlID0gdXJsLmdldEZpbGUoKTsgLy9maWxlOi9DOi90ZXN0YXBwcy9leGFtcGxlL1dFQi1JTkYvbGliL3N0cnV0cy5qYXIhL01FVEEtSU5GL3RsZHMvc3RydXRzLWJlYW4udGxkCi0JCWludCBpbmRleCA9IGZpbGUuaW5kZXhPZignIScpOwotCQlpZiAoaW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgamFyRmlsZVVybFN0ciA9IGZpbGUuc3Vic3RyaW5nKDAsIGluZGV4KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKGphckZpbGVVcmxTdHIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzUmVtb3RlKFN0cmluZyB1cmwpewotCQlyZXR1cm4gdXJsLnN0YXJ0c1dpdGgoImh0dHA6Iil8fHVybC5zdGFydHNXaXRoKCJodHRwczoiKXx8dXJsLnN0YXJ0c1dpdGgoInd3dy4iKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFRlbXBsYXRlRm9sZGVyKFN0cmluZyBwbHVnSWQgLCBTdHJpbmcgc3RyUGF0aCApewotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKCBwbHVnSWQgKTsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoIHN0clBhdGggKTsKLQkJVVJMIHVybCA9IEZpbGVMb2NhdG9yLmZpbmQoYnVuZGxlLCBwYXRoLCBudWxsKTsKLQkJdHJ5IHsKLQkJCVVSTCB0ZW1wbFVybDsKLQkJCXRlbXBsVXJsID0gRmlsZUxvY2F0b3IucmVzb2x2ZSh1cmwpOwotCQkJRmlsZSB0ZW1wbERpciA9IFVybFV0aWwuZ2V0VXJsRmlsZSh0ZW1wbFVybCk7Ci0JCQlyZXR1cm4gdGVtcGxEaXIgOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9jb2x1bW4udm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvY29sdW1uLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGIxOWE0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9jb2x1bW4udm0KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBDb2x1bW4gYW5ub3RhdGlvbi4NCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAiY29sdW1uIiBhbmQgYSAidGFibGUiIG9iamVjdA0KLSMjZ2VuZXJhdGUgYW5ub3RhdGlvbiBvbmx5IHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgY29sdW1uIE5PVCBkZWZhdWx0DQotIyNhbmQgdGhlIGdlbmVyYXRlRExMQW5ub3RhdGlvbiBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9uIHRoZSB0YWJsZQ0KLSMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSNtYWNybyggYXBwZW5kICRtZW1iZXJzICRwYXJhbWV0ZXJzICkNCi0jaWYoICRtZW1iZXJzID09ICIiKQ0KLSNzZXQoICRtZW1iZXJzID0gJHBhcmFtZXRlcnMgKQ0KLSNlbHNlDQotI3NldCggJG1lbWJlcnMgPSAiJG1lbWJlcnMsICRwYXJhbWV0ZXJzIiApIA0KLSNlbmQJDQotI2VuZA0KLSMjIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLSNpZiAoICRjb2x1bW4uZGF0YVR5cGVMT0IpDQotICAgIEBMb2IoKQ0KLSNlbmQNCi0jaWYgKCAkY29sdW1uLm5lZWRNYXBUZW1wb3JhbFR5cGUpDQotICAgIEBUZW1wb3JhbCggVGVtcG9yYWxUeXBlLiRjb2x1bW4udGVtcG9yYWxUeXBlKQ0KLSNlbmQNCi0jc2V0ICgkbWVtYmVycyA9ICIiKQ0KLSNpZiAoICEkY29sdW1uLmRlZmF1bHQgfHwgJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucyApDQotI2lmICggISR7Y29sdW1uLmRlZmF1bHRuYW1lfSApDQotI2FwcGVuZCgkbWVtYmVycyAibmFtZT0kY3VzdG9taXplci5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgkY29sdW1uLm5hbWUpIiApDQotI2VuZA0KLSNpZiAoISRjb2x1bW4uaW5zZXJ0YWJsZSkNCi0jYXBwZW5kKCR7bWVtYmVyc30gImluc2VydGFibGU9ZmFsc2UiKQ0KLSNlbmQNCi0jaWYgKCEkY29sdW1uLnVwZGF0ZWFibGUpDQotI2FwcGVuZCgke21lbWJlcnN9ICJ1cGRhdGFibGU9ZmFsc2UiKQ0KLSNlbmQNCi0jZW5kDQotI2lmKCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkNCi0jaWYgKCRjb2x1bW4udW5pcXVlKQ0KLSNhcHBlbmQoJG1lbWJlcnMgICJ1bmlxdWU9dHJ1ZSIpDQotI2VuZA0KLSNpZiAoISRjb2x1bW4ubnVsbGFibGUpDQotI2FwcGVuZCgkbWVtYmVycyAgIm51bGxhYmxlPWZhbHNlIikNCi0jZW5kDQotI2lmICgkY29sdW1uLnNpemUgPiAwKQ0KLSNpZiAoJGNvbHVtbi5udW1lcmljKQ0KLSNhcHBlbmQoJG1lbWJlcnMgInByZWNpc2lvbj0kY29sdW1uLnNpemUiKQ0KLSNpZiAoJGNvbHVtbi5kZWNpbWFsRGlnaXRzICE9IDAgJiYgJGNvbHVtbi5kZWNpbWFsRGlnaXRzICE9IC0xKQ0KLSNhcHBlbmQoJG1lbWJlcnMgInNjYWxlPSRjb2x1bW4uZGVjaW1hbERpZ2l0cyIpDQotI2VuZA0KLSNlbHNlDQotI2lmICggISRjb2x1bW4uZGF0YVR5cGVMT0IpDQotI2FwcGVuZCgkbWVtYmVycyAibGVuZ3RoPSRjb2x1bW4uc2l6ZSIpDQotI2VuZA0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSNpZiggJG1lbWJlcnMgIT0iIiApDQotCUBDb2x1bW4oJG1lbWJlcnMpDQotI2VuZA0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9qb2luLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2pvaW4udm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGY4NzMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL2pvaW4udm0KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBKb2luVGFibGUsIEBKb2luQ29sdW1uIG9yIEBKb2luQ29sdW1ucyBhbm5vdGF0aW9uLg0KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJyb2xlIiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBnZW5lcmF0ZWQgQXNzb2NpYXRpb25Sb2xlDQotIyMNCi0jI21hY3JvIGpvaW5Db2x1bW4gdXNlcyAkY29sdW1uLCAkcmVmZXJlbmNlZENvbHVtbg0KLSNtYWNybyAoam9pbkNvbHVtbiAkY29sdW1uICRyZWZlcmVuY2VkQ29sdW1uKQ0KLSNzZXQgKCRtZW1iZXJzID0gIm5hbWU9JGN1c3RvbWl6ZXIuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoJGNvbHVtbi5qb2luQ29sdW1uTmFtZSkiKQ0KLSNpZiggISRyZWZlcmVuY2VkQ29sdW1uLnByaW1hcnlLZXkgfHwgJHJlZmVyZW5jZWRDb2x1bW4ucGFydE9mQ29tcG9zaXRlUHJpbWFyeUtleSApDQotI3NldCAoJG1lbWJlcnMgPSAiJG1lbWJlcnMsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPSRjdXN0b21pemVyLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCRyZWZlcmVuY2VkQ29sdW1uLm5hbWUpIikNCi0jZW5kDQotI2lmKCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkNCi0jaWYgKCRjb2x1bW4udW5pcXVlICYmICEkY29sdW1uLnByaW1hcnlLZXkpDQotI3NldCAoJG1lbWJlcnMgPSAiJG1lbWJlcnMsIHVuaXF1ZT10cnVlIikNCi0jZW5kDQotI2lmICghJGNvbHVtbi5udWxsYWJsZSkNCi0jc2V0ICgkbWVtYmVycyA9ICIkbWVtYmVycywgbnVsbGFibGU9ZmFsc2UiKQ0KLSNlbmQNCi0jZW5kDQotI2lmICgkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICYmICEkcm9sZS5hc3NvY2lhdGlvbi5qb2luVGFibGUgJiYgISRyb2xlLnJlZmVycmVyVGFibGUuaXNDb2x1bW5VcGRhdGVJbnNlcnQoJHJvbGUsICRjb2x1bW4pKQ0KLSNzZXQgKCRtZW1iZXJzID0gIiRtZW1iZXJzLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UiKQ0KLSNlbmQNCi1ASm9pbkNvbHVtbigkbWVtYmVycykjZW5kDQotIyMNCi0jIw0KLSMjDQotI2lmICgkcm9sZS5hc3NvY2lhdGlvbi5qb2luVGFibGUpDQotI3NldCAoJGpvaW5UYWJsZSA9ICRyb2xlLmFzc29jaWF0aW9uLmpvaW5UYWJsZSkNCi0JQEpvaW5UYWJsZSgNCi0JCW5hbWU9JGN1c3RvbWl6ZXIuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoJHtqb2luVGFibGUuam9pblRhYmxlQW5ub3RhdGlvbk5hbWV9KQ0KLQkJLCBqb2luQ29sdW1ucz17DQotI2ZvcmVhY2ggKCRjb2x1bW4gaW4gJHJvbGUucmVmZXJyZXJDb2x1bW5zKQ0KLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJlbmNlZENvbHVtbigke2NvbHVtbi5uYW1lfSkpDQotIyMkcmVmZXJlbmNlZENvbHVtbiBpcyB0aGUgY29sdW1uIGluIHRoZSBqb2luIHRhYmxlDQotCQkJI2pvaW5Db2x1bW4oJHJlZmVyZW5jZWRDb2x1bW4gJGNvbHVtbikNCi0jaWYgKCR2ZWxvY2l0eUNvdW50IDwgJHJvbGUucmVmZXJyZXJDb2x1bW5zLnNpemUoKSApDQotLA0KLSNlbmQJCQkNCi0jZW5kDQotDQotCQkJfQ0KLQkJLCBpbnZlcnNlSm9pbkNvbHVtbnM9ew0KLSNmb3JlYWNoICgkY29sdW1uIGluICRyb2xlLnJlZmVyZW5jZWRDb2x1bW5zKQ0KLSNzZXQgKCRyZWZlcmVuY2VkQ29sdW1uID0gJHJvbGUuZ2V0UmVmZXJyZXJDb2x1bW4oJHtjb2x1bW4ubmFtZX0pDQotKQ0KLSMjJHJlZmVyZW5jZWRDb2x1bW4gaXMgdGhlIGNvbHVtbiBpbiB0aGUgam9pbiB0YWJsZQ0KLQkJCSNqb2luQ29sdW1uKCRyZWZlcmVuY2VkQ29sdW1uICRjb2x1bW4pDQotI2lmICgkdmVsb2NpdHlDb3VudCA8ICRyb2xlLnJlZmVyZW5jZWRDb2x1bW5zLnNpemUoKSApDQotLA0KLSNlbmQJCQkNCi0jZW5kDQotDQotCQkJfQ0KLQkJKQ0KLSNlbHNlDQotI2lmICgkcm9sZS5yZWZlcnJlckNvbHVtbnMuc2l6ZSgpID09IDEpDQotI3NldCAoJGNvbHVtbiA9ICRyb2xlLnJlZmVycmVyQ29sdW1ucy5nZXQoMCkpDQotI3NldCAoJHJlZmVyZW5jZWRDb2x1bW4gPSAkcm9sZS5nZXRSZWZlcmVuY2VkQ29sdW1uKCR7Y29sdW1uLm5hbWV9KSkNCi0jc2V0ICgkcmVmZXJlbmNlZFRhYmxlTmFtZSA9ICRjdXN0b21pemVyLmNvbnZlcnRUb0phdmFTdHJpbmdMaXRlcmFsKCRyb2xlLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSkgKQ0KLSNzZXQoICRyZWZlcmVuY2VkVGFibGVQa05hbWUgPSAkY3VzdG9taXplci5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgkcm9sZS5nZXRSZWZlcmVuY2VkVGFibGUoKS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkubmFtZSkgKQ0KLSNzZXQoICRjb21wdXRlZEpvaW5Db2x1bW5OYW1lID0gJGN1c3RvbWl6ZXIuY29udmVydFRvSmF2YVN0cmluZ0xpdGVyYWwoIiR7cm9sZS5wcm9wZXJ0eU5hbWV9XyR7cmVmZXJlbmNlZFRhYmxlUGtOYW1lfSIpICkNCi0jc2V0KCAkaXNEZWZhdWx0Sm9pbkNvbHVtbk5hbWUgPSAgJGNvbHVtbi5pc0RlZmF1bHRKb2luQ29sdW1uTmFtZSggJHtyb2xlLnByb3BlcnR5TmFtZX0pICkNCi0jaWYoICEgJGlzRGVmYXVsdEpvaW5Db2x1bW5OYW1lICkNCi0JI2pvaW5Db2x1bW4oJGNvbHVtbiAkcmVmZXJlbmNlZENvbHVtbikNCi0NCi0jZWxzZWlmKCAkY3VzdG9taXplci5nZW5lcmF0ZURETEFubm90YXRpb25zICkNCi0JI2pvaW5Db2x1bW4oJGNvbHVtbiAkcmVmZXJlbmNlZENvbHVtbikNCi0NCi0jZW5kDQotI2Vsc2UNCi0JQEpvaW5Db2x1bW5zKHsNCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkcm9sZS5yZWZlcnJlckNvbHVtbnMpDQotI3NldCAoJHJlZmVyZW5jZWRDb2x1bW4gPSAkcm9sZS5nZXRSZWZlcmVuY2VkQ29sdW1uKCR7Y29sdW1uLm5hbWV9KSkNCi0JCSNqb2luQ29sdW1uKCRjb2x1bW4gJHJlZmVyZW5jZWRDb2x1bW4pDQotI2lmICgkdmVsb2NpdHlDb3VudCA8ICRyb2xlLnJlZmVycmVyQ29sdW1ucy5zaXplKCkgKQ0KLSwNCi0jZWxzZQ0KLQ0KLSNlbmQNCi0jZW5kCQkNCi0JCX0pDQotI2VuZA0KLSNlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21haW4uamF2YS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE0NTg1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFpbi5qYXZhLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLSNpZiAoJHRhYmxlLnBhY2thZ2UgIT0gIiIpDQotcGFja2FnZSAke3RhYmxlLnBhY2thZ2V9Ow0KLSNlbmQNCi0NCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7DQotJHt0YWJsZS5pbXBvcnRTdGF0ZW1lbnRzfQ0KLQ0KLS8qKg0KLSAqIFRoZSBwZXJzaXN0ZW50IGNsYXNzIGZvciB0aGUgJHt0YWJsZS5uYW1lfSBkYXRhYmFzZSB0YWJsZS4NCi0gKiANCi0gKi8NCi1ARW50aXR5DQotI2lmKCAhJHt0YWJsZS5kZWZhdWx0bmFtZX0gfHwgJGN1c3RvbWl6ZXIuZ2VuZXJhdGVERExBbm5vdGF0aW9ucykNCi1AVGFibGUobmFtZT0kY3VzdG9taXplci5jb252ZXJ0VG9KYXZhU3RyaW5nTGl0ZXJhbCgke3RhYmxlLm5hbWV9KSkNCi0jZW5kDQotcHVibGljIGNsYXNzICR7dGFibGUuY2xhc3NOYW1lfSAke3RhYmxlLmdlbmVyYXRlRXh0ZW5kc0ltcGxlbWVudHMoKX0gew0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsNCi0jIyMjIw0KLSMjIyMjIGZpZWxkcw0KLSMjIyMjDQotI2lmICgkdGFibGUuY29tcG9zaXRlS2V5KQ0KLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAiZmllbGQiKQ0KLQ0KLQlARW1iZWRkZWRJZA0KLSNlbmQNCi0JcHJpdmF0ZSAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0gJHt0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWV9Ow0KLSNlbmQNCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUuZ2V0U2ltcGxlQ29sdW1ucyh0cnVlLCB0cnVlLCBmYWxzZSkpDQotI2lmICgkdGFibGUuYWNjZXNzID09ICJmaWVsZCIpDQotDQotI3BhcnNlKCJtYXBwaW5nS2luZC52bSIpDQotI3BhcnNlKCJjb2x1bW4udm0iKQ0KLSNlbmQNCi0JJHtjb2x1bW4uZmllbGRTY29wZX0gJHtjb2x1bW4uc2ltcGxlUHJvcGVydHlUeXBlfSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9Ow0KLSNlbmQNCi0jZm9yZWFjaCAoJHJvbGUgaW4gJHRhYmxlLmFzc29jaWF0aW9uUm9sZXMpDQotIyMjIyMNCi0jIyMjIyBmaWVsZCBhbm5vdGF0aW9ucw0KLSMjIyMjDQotI2lmICgkdGFibGUuYWNjZXNzID09ICJmaWVsZCIpDQotDQotCS8vJHtyb2xlLmRlc2NyaXB0aW9ufQ0KLSNpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tb25lIikNCi0jcGFyc2UoIm1hbnlUb09uZS52bSIpDQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tbWFueSIpDQotI3BhcnNlKCJtYW55VG9NYW55LnZtIikNCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW1hbnkiKQ0KLSNwYXJzZSgib25lVG9NYW55LnZtIikNCi0jZWxzZWlmICgkcm9sZS5jYXJkaW5hbGl0eSA9PSAib25lLXRvLW9uZSIpDQotI3BhcnNlKCJvbmVUb09uZS52bSIpDQotI2VuZA0KLSNlbmQNCi0jIyMjIw0KLSMjIyMjIGZpZWxkIGRlY2xhcmF0aW9uDQotIyMjIyMNCi0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIgfHwgJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQ0KLSNzZXQgKCRwcm9wZXJ0eVR5cGUgPSAke3JvbGUucmVmZXJlbmNlZFRhYmxlLmNsYXNzTmFtZX0pDQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm1hbnktdG8tbWFueSIgfHwgJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1tYW55IikNCi0jc2V0ICgkcHJvcGVydHlUeXBlID0gIiR7cm9sZS5yZWZlcmVuY2VkVGFibGUuc2ltcGxlQ29sbGVjdGlvblR5cGV9PCR7cm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lfT4iKQ0KLSNlbmQNCi0JcHJpdmF0ZSAkcHJvcGVydHlUeXBlICRyb2xlLnByb3BlcnR5TmFtZTsNCi0jZW5kDQotDQotICAgIHB1YmxpYyAke3RhYmxlLmNsYXNzTmFtZX0oKSB7DQotICAgIH0NCi0NCi0jIyMjIw0KLSMjIyMjIHNpbXBsZSBwcm9wZXJ0aWVzIGdldHRlcnMgYW5kIHNldHRlcnMNCi0jIyMjIw0KLSNpZiAoJHRhYmxlLmNvbXBvc2l0ZUtleSkNCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikNCi0NCi0JQEVtYmVkZGVkSWQNCi0jZW5kDQotCXB1YmxpYyAkdGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCR0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUpKCkgew0KLQkJcmV0dXJuIHRoaXMuJHt0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWV9Ow0KLQl9DQotDQotCXB1YmxpYyB2b2lkICRjdXN0b21pemVyLnByb3BlcnR5U2V0dGVyKCR0YWJsZS5jb21wb3NpdGVLZXlQcm9wZXJ0eU5hbWUpKCR0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWUgJHRhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZSkgew0KLQkJdGhpcy4ke3RhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZX0gPSAke3RhYmxlLmNvbXBvc2l0ZUtleVByb3BlcnR5TmFtZX07DQotCX0NCi0JDQotI2VuZA0KLSNmb3JlYWNoICgkY29sdW1uIGluICR0YWJsZS5nZXRTaW1wbGVDb2x1bW5zKHRydWUsIHRydWUsIGZhbHNlKSkNCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gInByb3BlcnR5IikNCi0NCi0jcGFyc2UoIm1hcHBpbmdLaW5kLnZtIikNCi0jcGFyc2UoImNvbHVtbi52bSIpDQotI2VuZA0KLQkkY29sdW1uLnByb3BlcnR5R2V0U2NvcGUgJGNvbHVtbi5zaW1wbGVQcm9wZXJ0eVR5cGUgJGN1c3RvbWl6ZXIucHJvcGVydHlHZXR0ZXIoJGNvbHVtbi5wcm9wZXJ0eU5hbWUpKCkgew0KLQkJcmV0dXJuIHRoaXMuJHtjb2x1bW4ucHJvcGVydHlOYW1lfTsNCi0JfQ0KLQ0KLQkkY29sdW1uLnByb3BlcnR5U2V0U2NvcGUgdm9pZCAkY3VzdG9taXplci5wcm9wZXJ0eVNldHRlcigkY29sdW1uLnByb3BlcnR5TmFtZSkoJGNvbHVtbi5zaW1wbGVQcm9wZXJ0eVR5cGUgJGNvbHVtbi5wcm9wZXJ0eU5hbWUpIHsNCi0JCXRoaXMuJHtjb2x1bW4ucHJvcGVydHlOYW1lfSA9ICR7Y29sdW1uLnByb3BlcnR5TmFtZX07DQotCX0NCi0NCi0jZW5kDQotIyMjIyMNCi0jIyMjIyBhc3NvY2lhdGlvbnMgZ2V0dGVycyBhbmQgc2V0dGVycw0KLSMjIyMjDQotI2ZvcmVhY2ggKCRyb2xlIGluICR0YWJsZS5hc3NvY2lhdGlvblJvbGVzKQ0KLSNpZiAoJHRhYmxlLmFjY2VzcyA9PSAicHJvcGVydHkiKQ0KLQ0KLQkvLyR7cm9sZS5kZXNjcmlwdGlvbn0NCi0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIpDQotI3BhcnNlKCJtYW55VG9PbmUudm0iKQ0KLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiKQ0KLSNwYXJzZSgibWFueVRvTWFueS52bSIpDQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1tYW55IikNCi0jcGFyc2UoIm9uZVRvTWFueS52bSIpDQotI2Vsc2VpZiAoJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQ0KLSNwYXJzZSgib25lVG9PbmUudm0iKQ0KLSNlbmQNCi0jZW5kDQotIyMNCi0jaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW9uZSIgfHwgJHJvbGUuY2FyZGluYWxpdHkgPT0gIm9uZS10by1vbmUiKQ0KLSNzZXQgKCRwcm9wZXJ0eVR5cGUgPSAkcm9sZS5yZWZlcmVuY2VkVGFibGUuY2xhc3NOYW1lKQ0KLSNlbHNlaWYgKCRyb2xlLmNhcmRpbmFsaXR5ID09ICJtYW55LXRvLW1hbnkiIHx8ICRyb2xlLmNhcmRpbmFsaXR5ID09ICJvbmUtdG8tbWFueSIpDQotI3NldCAoJHByb3BlcnR5VHlwZSA9ICIke3JvbGUucmVmZXJlbmNlZFRhYmxlLnNpbXBsZUNvbGxlY3Rpb25UeXBlfTwke3JvbGUucmVmZXJlbmNlZFRhYmxlLmNsYXNzTmFtZX0+IikNCi0jZW5kDQotCXB1YmxpYyAkcHJvcGVydHlUeXBlICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCRyb2xlLnByb3BlcnR5TmFtZSkoKSB7DQotCQlyZXR1cm4gdGhpcy4ke3JvbGUucHJvcGVydHlOYW1lfTsNCi0JfQ0KLQ0KLQlwdWJsaWMgdm9pZCAke2N1c3RvbWl6ZXIucHJvcGVydHlTZXR0ZXIoJHJvbGUucHJvcGVydHlOYW1lKX0oJHByb3BlcnR5VHlwZSAkcm9sZS5wcm9wZXJ0eU5hbWUpIHsNCi0JCXRoaXMuJHtyb2xlLnByb3BlcnR5TmFtZX0gPSAkcm9sZS5wcm9wZXJ0eU5hbWU7DQotCX0NCi0JDQotIyMNCi0jZW5kDQotIyMNCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hbnlUb01hbnkudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvTWFueS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkNDhjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvTWFueS52bQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQE1hbnlUb01hbnkgYW5ub3RhdGlvbi4NCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQ0KLSMjDQotI2lmICgkcm9sZS5hc3NvY2lhdGlvbi5iaWRpcmVjdGlvbmFsICYmICEkcm9sZS5pc1JlZmVycmVyUm9sZSgpKSMjdGhlIG93bmluZyBzaWRlIChlaXRoZXIgc2lkZSBmb3IgbWFueS10by1tYW55KQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigiIiwgIm1hcHBlZEJ5IiwgJHJvbGUub3Bwb3NpdGVSb2xlLnByb3BlcnR5TmFtZSwgdHJ1ZSkpDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQ0KLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuTEFaWSIpDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQ0KLSNlbmQNCi0jaWYoJG1lbWJlcnMhPSIiKQ0KLQlATWFueVRvTWFueSgkbWVtYmVycykNCi0jZWxzZQkNCi0gICAgQE1hbnlUb01hbnkNCi0jZW5kICAgIA0KLSNlbHNlDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQ0KLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuTEFaWSIpDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCRtZW1iZXJzLCAiZmV0Y2giLCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSwgZmFsc2UpKQ0KLSNlbmQNCi0jaWYoJG1lbWJlcnMhPSIiKQ0KLQlATWFueVRvTWFueSgkbWVtYmVycykNCi0jZWxzZQkNCi0gICAgQE1hbnlUb01hbnkNCi0jZW5kICAgIA0KLSNwYXJzZSgiam9pbi52bSIpDQotI2VuZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYW55VG9PbmUudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvbWFueVRvT25lLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGIxNjA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYW55VG9PbmUudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jI2luY2x1ZGVkIHRlbXBsYXRlLiBHZW5lcmF0ZXMgdGhlIEBNYW55VG9PbmUgYW5ub3RhdGlvbi4NCi0jI0Fzc3VtZXMgdGhhdCB0aGUgY29udGV4dCBoYXMgYSAicm9sZSIgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZ2VuZXJhdGVkIEFzc29jaWF0aW9uUm9sZQ0KLSMjDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQ0KLSNpZiggJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSAiIiAmJiAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9ICJGZXRjaFR5cGUuRUFHRVIiKQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkNCi0jZW5kDQotI2lmKCRtZW1iZXJzIT0iIikNCi0JQE1hbnlUb09uZSgkbWVtYmVycykNCi0jZWxzZQ0KLSAgICBATWFueVRvT25lDQotI2VuZA0KLSNwYXJzZSgiam9pbi52bSIpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hcHBpbmdLaW5kLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL21hcHBpbmdLaW5kLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDNmMTg3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9tYXBwaW5nS2luZC52bQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQEJhc2ljLCBASWQsIEBWZXJzaW9uIGFubm90YXRpb25zLg0KLSMjQXNzdW1lcyB0aGF0IHRoZSBjb250ZXh0IGhhcyBhICJjb2x1bW4iIG9iamVjdA0KLSMjDQotI3NldCAoJG1hcHBpbmdLaW5kID0gJGNvbHVtbi5tYXBwaW5nS2luZCkNCi0jaWYgKCRtYXBwaW5nS2luZCA9PSAiaWQiKQ0KLQlASWQNCi0jc2V0ICgkaWRHZW5lcmF0b3IgPSAkdGFibGUuaWRHZW5lcmF0b3IpDQotI2lmICgkaWRHZW5lcmF0b3IgPT0gImF1dG8iKQ0KLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5BVVRPIikNCi0jZWxzZWlmICgkaWRHZW5lcmF0b3IgPT0gImlkZW50aXR5IikNCi0jc2V0ICgkZ2VuZXJhdGlvblR5cGUgPSAiR2VuZXJhdGlvblR5cGUuSURFTlRJVFkiKQ0KLSNlbHNlaWYgKCRpZEdlbmVyYXRvciA9PSAic2VxdWVuY2UiKQ0KLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICJHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSIpDQotI2Vsc2VpZiAoJGlkR2VuZXJhdG9yID09ICJ0YWJsZSIpDQotI3NldCAoJGdlbmVyYXRpb25UeXBlID0gIkdlbmVyYXRpb25UeXBlLlRBQkxFIikNCi0jZWxzZQ0KLSNzZXQgKCRnZW5lcmF0aW9uVHlwZSA9ICIiKQ0KLSNlbmQNCi0jaWYgKCRpZEdlbmVyYXRvciA9PSAic2VxdWVuY2UiICkNCi0jc2V0ICgkZ2VuZXJhdG9yTmFtZSA9ICIke3RhYmxlLm5hbWUudG9VcHBlckNhc2UoKX1fJHtjb2x1bW4ucHJvcGVydHlOYW1lLnRvVXBwZXJDYXNlKCl9X0dFTkVSQVRPUiIpDQotI2lmKCAkdGFibGUuZm9ybWF0dGVkU2VxdWVuY2UgIT0gIiIgKQ0KLQlAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT0iJGdlbmVyYXRvck5hbWUiLCBzZXF1ZW5jZU5hbWU9IiR0YWJsZS5mb3JtYXR0ZWRTZXF1ZW5jZSIpDQotI2Vsc2UNCi0JQFNlcXVlbmNlR2VuZXJhdG9yKG5hbWU9IiRnZW5lcmF0b3JOYW1lIiApDQotI2VuZAkNCi0JQEdlbmVyYXRlZFZhbHVlKHN0cmF0ZWd5PSRnZW5lcmF0aW9uVHlwZSwgZ2VuZXJhdG9yPSIkZ2VuZXJhdG9yTmFtZSIpDQotI2Vsc2VpZiAoJGdlbmVyYXRpb25UeXBlICE9ICIiKQ0KLQlAR2VuZXJhdGVkVmFsdWUoc3RyYXRlZ3k9JGdlbmVyYXRpb25UeXBlKQ0KLSNlbmQgICAgICANCi0jZWxzZWlmICgkbWFwcGluZ0tpbmQgPT0gInZlcnNpb24iKQ0KLQlAVmVyc2lvbg0KLSNlbHNlDQotIyNERUZBVUxUIGlzIEBCYXNpYywgbm8gbmVlZCB0byBnZW5lcmF0ZQ0KLSNlbmQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9NYW55LnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvTWFueS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ3YmIzYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvb25lVG9NYW55LnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyNpbmNsdWRlZCB0ZW1wbGF0ZS4gR2VuZXJhdGVzIHRoZSBAT25lVG9NYW55IGFubm90YXRpb24uDQotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUNCi0jIw0KLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCkNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oIiIsICJtYXBwZWRCeSIsICRyb2xlLm9wcG9zaXRlUm9sZS5wcm9wZXJ0eU5hbWUsIHRydWUpKQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImNhc2NhZGUiLCAkY3VzdG9taXplci5nZW5DYXNjYWRlcygkcm9sZSksIGZhbHNlKSkNCi0jaWYoJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSIiICYmICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpICE9IkZldGNoVHlwZS5MQVpZIikNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpDQotI2VuZA0KLQlAT25lVG9NYW55KCRtZW1iZXJzKQ0KLSNlbHNlDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAiY2FzY2FkZSIsICRjdXN0b21pemVyLmdlbkNhc2NhZGVzKCRyb2xlKSwgZmFsc2UpKQ0KLSNpZigkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkgIT0iRmV0Y2hUeXBlLkxBWlkiKQ0KLSNzZXQgKCRtZW1iZXJzID0gJGN1c3RvbWl6ZXIuYXBwZW5kQW5ub3RhdGlvbigkbWVtYmVycywgImZldGNoIiwgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSksIGZhbHNlKSkNCi0jZW5kDQotCUBPbmVUb01hbnkoJG1lbWJlcnMpDQotI3BhcnNlKCJqb2luLnZtIikNCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvT25lLnZtIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL29uZVRvT25lLnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTg0OWI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuL3RlbXBsYXRlcy9lbnRpdGllcy9vbmVUb09uZS52bQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLSMjaW5jbHVkZWQgdGVtcGxhdGUuIEdlbmVyYXRlcyB0aGUgQE9uZVRvT25lIGFubm90YXRpb24uDQotIyNBc3N1bWVzIHRoYXQgdGhlIGNvbnRleHQgaGFzIGEgInJvbGUiIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdlbmVyYXRlZCBBc3NvY2lhdGlvblJvbGUNCi0jIw0KLSNpZiAoJHJvbGUuYXNzb2NpYXRpb24uYmlkaXJlY3Rpb25hbCAmJiAhJHJvbGUuaXNSZWZlcnJlclJvbGUoKSkjI3RoZSBvd25pbmcgc2lkZSAoZWl0aGVyIHNpZGUgZm9yIG9uZS10by1vbmUpDQotI3NldCAoJG1lbWJlcnMgPSAkY3VzdG9taXplci5hcHBlbmRBbm5vdGF0aW9uKCIiLCAibWFwcGVkQnkiLCAkcm9sZS5vcHBvc2l0ZVJvbGUucHJvcGVydHlOYW1lLCB0cnVlKSkNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpDQotI2lmKCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuRUFHRVIiICkNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpDQotI2VuZA0KLQlAT25lVG9PbmUoJG1lbWJlcnMpDQotI2Vsc2UNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oIiIsICJjYXNjYWRlIiwgJGN1c3RvbWl6ZXIuZ2VuQ2FzY2FkZXMoJHJvbGUpLCBmYWxzZSkpDQotI2lmKCAkY3VzdG9taXplci5nZW5GZXRjaCgkcm9sZS5yZWZlcnJlclRhYmxlKSE9IiIgJiYgJGN1c3RvbWl6ZXIuZ2VuRmV0Y2goJHJvbGUucmVmZXJyZXJUYWJsZSkhPSJGZXRjaFR5cGUuRUFHRVIiICkNCi0jc2V0ICgkbWVtYmVycyA9ICRjdXN0b21pemVyLmFwcGVuZEFubm90YXRpb24oJG1lbWJlcnMsICJmZXRjaCIsICRjdXN0b21pemVyLmdlbkZldGNoKCRyb2xlLnJlZmVycmVyVGFibGUpLCBmYWxzZSkpDQotI2VuZA0KLSNpZigkbWVtYmVycyE9IiIpDQotCUBPbmVUb09uZSgkbWVtYmVycykNCi0jZWxzZQ0KLQlAT25lVG9PbmUNCi0jZW5kDQotI3BhcnNlKCJqb2luLnZtIikNCi0jZW5kClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4vdGVtcGxhdGVzL2VudGl0aWVzL3BrLmphdmEudm0gYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvcGsuamF2YS52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3NGY2OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi90ZW1wbGF0ZXMvZW50aXRpZXMvcGsuamF2YS52bQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLSNpZiAoJHRhYmxlLnBhY2thZ2UgIT0gIiIpDQotcGFja2FnZSAke3RhYmxlLnBhY2thZ2V9Ow0KLSNlbmQNCi0NCi1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7DQotaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7DQotDQotLyoqDQotICogVGhlIHByaW1hcnkga2V5IGNsYXNzIGZvciB0aGUgJHt0YWJsZS5uYW1lfSBkYXRhYmFzZSB0YWJsZS4NCi0gKiANCi0gKi8NCi1ARW1iZWRkYWJsZQ0KLXB1YmxpYyBjbGFzcyAke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgew0KLQkvL2RlZmF1bHQgc2VyaWFsIHZlcnNpb24gaWQsIHJlcXVpcmVkIGZvciBzZXJpYWxpemFibGUgY2xhc3Nlcy4NCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7DQotIyMjIyMNCi0jIyMjIyBmaWVsZHMNCi0jIyMjIw0KLSNmb3JlYWNoICgkY29sdW1uIGluICR0YWJsZS5wcmltYXJ5S2V5Q29sdW1ucykNCi0jaWYgKCR0YWJsZS5hY2Nlc3MgPT0gImZpZWxkIikNCi0NCi0jcGFyc2UoImNvbHVtbi52bSIpDQotI2VuZA0KLQkke2NvbHVtbi5maWVsZFNjb3BlfSAke2NvbHVtbi5wcm9wZXJ0eVR5cGV9ICR7Y29sdW1uLnByb3BlcnR5TmFtZX07DQotI2VuZA0KLQ0KLSAgICBwdWJsaWMgJHt0YWJsZS5jb21wb3NpdGVLZXlDbGFzc05hbWV9KCkgew0KLSAgICB9DQotIyMjIyMNCi0jIyMjIyBzaW1wbGUgcHJvcGVydGllcyBnZXR0ZXJzIGFuZCBzZXR0ZXJzDQotIyMjIyMNCi0jZm9yZWFjaCAoJGNvbHVtbiBpbiAkdGFibGUucHJpbWFyeUtleUNvbHVtbnMpDQotI2lmICgkdGFibGUuYWNjZXNzID09ICJwcm9wZXJ0eSIpDQotDQotI3BhcnNlKCJjb2x1bW4udm0iKQ0KLSNlbmQNCi0JJGNvbHVtbi5wcm9wZXJ0eUdldFNjb3BlICRjb2x1bW4ucHJvcGVydHlUeXBlICRjdXN0b21pemVyLnByb3BlcnR5R2V0dGVyKCRjb2x1bW4ucHJvcGVydHlOYW1lKSgpIHsNCi0JCXJldHVybiB0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX07DQotCX0NCi0JJGNvbHVtbi5wcm9wZXJ0eVNldFNjb3BlIHZvaWQgJGN1c3RvbWl6ZXIucHJvcGVydHlTZXR0ZXIoJGNvbHVtbi5wcm9wZXJ0eU5hbWUpKCRjb2x1bW4ucHJvcGVydHlUeXBlICRjb2x1bW4ucHJvcGVydHlOYW1lKSB7DQotCQl0aGlzLiR7Y29sdW1uLnByb3BlcnR5TmFtZX0gPSAke2NvbHVtbi5wcm9wZXJ0eU5hbWV9Ow0KLQl9DQotI2VuZA0KLSMjDQotIyMgZXF1YWxzL2hhc2hDb2RlDQotDQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsNCi0JCWlmICh0aGlzID09IG90aGVyKSB7DQotCQkJcmV0dXJuIHRydWU7DQotCQl9DQotCQlpZiAoIShvdGhlciBpbnN0YW5jZW9mICR7dGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lfSkpIHsNCi0JCQlyZXR1cm4gZmFsc2U7DQotCQl9DQotCQkke3RhYmxlLmNvbXBvc2l0ZUtleUNsYXNzTmFtZX0gY2FzdE90aGVyID0gKCR7dGFibGUuY29tcG9zaXRlS2V5Q2xhc3NOYW1lfSlvdGhlcjsNCi0JCXJldHVybiANCi0JCQkke3RhYmxlLnByaW1hcnlLZXlFcXVhbHNDbGF1c2V9DQotDQotICAgIH0NCi0gICAgDQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7DQotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsNCi0JCWludCBoYXNoID0gMTc7DQotCQkke3RhYmxlLnByaW1hcnlLZXlIYXNoQ29kZUNsYXVzZX0NCi0JCXJldHVybiBoYXNoOw0KLSAgICB9DQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLmNsYXNzcGF0aCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM0ZmIzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwcm9wZXJ0eV9maWxlcyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLmN2c2lnbm9yZSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLmpldHByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLy5qZXRwcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTA3YzgzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLmpldHByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGpldC1zZXR0aW5ncz4KLQk8dGVtcGxhdGUtY29udGFpbmVyPnRlbXBsYXRlczwvdGVtcGxhdGUtY29udGFpbmVyPgk8c291cmNlLWNvbnRhaW5lcj5zcmM8L3NvdXJjZS1jb250YWluZXI+Ci08L2pldC1zZXR0aW5ncz4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLm9wdGlvbnMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDk5MTNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIERlYnVnZ2luZyBvcHRpb25zIGZvciBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIHBsdWctaW4KLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgdGhlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkgcGx1Z2luLgotb3JnLmVjbGlwc2UuanB0LmpwYS51aS9kZWJ1Zz1mYWxzZQotCi0jIFR1cm4gb24gZGVidWdnaW5nIGZvciB1bml0LXRlc3RzCi1vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2RlYnVnL3VuaXQtdGVzdHM9ZmFsc2UKLQotIyBUdXJuIG9uIGRlYnVnZ2luZyBmb3IgZXZlbnRzIG9jY3VycmluZyBpbiB0aGUgVUkgcGFuZXMKLW9yZy5lY2xpcHNlLmpwdC5qcGEudWkvZGVidWcvdWkvbGF5b3V0PWZhbHNlCi1vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2RlYnVnL3VpL2RldGFpbHNWaWV3PWZhbHNlCi0KLSMgVHVybiBvbiBkZWJ1Z2dpbmcgZm9yIGV2ZW50cyBjb21pbmcgZnJvbSBDb25uZWN0aW9uUHJvZmlsZQotb3JnLmVjbGlwc2UuanB0LmpwYS51aS9kZWJ1Zy91aS9kYj1mYWxzZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNTEwMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5KRVRCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuLmpldC5JSkVUTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNzc1ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowOTo0NCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGMzYWIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS51aTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kcmF3MmQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5jb2RlZ2VuO2J1bmRsZS12ZXJzaW9uPSJbMi40LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueG1pO2J1bmRsZS12ZXJzaW9uPSJbMi41LjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5oZWxwO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuNy4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGI7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpzdC5jb21tb24uYW5ub3RhdGlvbnMuY29udHJvbGxlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4xMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQudWk7YnVuZGxlLXZlcnNpb249IlsxLjMuMTAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmoyZWUudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWw7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQ7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4zLjEwMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MudWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMi4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LndlYi51aTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWksCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRpYWxvZ3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmVkaXRvcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpmYWNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wbGF0Zm9ybS5nZW5lcmljO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcHFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5saXN0ZW5lcnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLm1lbnVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmJhc2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwudmlld3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEub3BlcmF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMucHJvajt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGEyLmRldGFpbHMuamF2YSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYTIuZGV0YWlscy5vcm0sCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5uYXZpZ2F0b3IsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUKLUltcG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249IjQuMC4xIgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9hYm91dC5odG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTQxYjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICAgICAgcHJvcGVydHlfZmlsZXMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBpbWFnZXMvCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9jb21wb25lbnQueG1sIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNlNzkzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSI+PGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPjxjb21wb25lbnQtZGVwZW5kcyB1bnJlc3RyaWN0ZWQ9InRydWUiPjwvY29tcG9uZW50LWRlcGVuZHM+PHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIgZnJhZ21lbnQ9ImZhbHNlIi8+PC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY3Y2M5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMGY2MDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzNzY4Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdfanBhcHJvamVjdF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2V0b29sMTYvanBhX2ZhY2V0LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2pwYV9mYWNldC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2V0b29sMTYvanBhX2ZhY2V0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzM2NhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfanBhX2ZpbGVfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTAwNDJlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFfZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGE4MDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYXByb2plY3Rfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9kZXRhaWxzLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9kZXRhaWxzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4MDEzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfcGVyc3BlY3RpdmUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3BlcnNwZWN0aXZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhYjkxNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfcGVyc3BlY3RpdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3N0cnVjdHVyZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgyYzkwYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXZpZXcxNi9qcGFfc3RydWN0dXJlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9iYXNpYy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvYmFzaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQ3ZDc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9iYXNpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC1jb2xsZWN0aW9uLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LWNvbGxlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcwNmQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LWNvbGxlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGFibGUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODU2Zjc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRhYmxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC1pZC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQtaWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWM4ZTIxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9lbWJlZGRlZC1pZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2VtYmVkZGVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJhZTY2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW1iZWRkZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS1tYXBwaW5ncy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LW1hcHBpbmdzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM0OWM5Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LW1hcHBpbmdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MDZmNDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2lkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwNWVjMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvaWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2pwYS1jb250ZW50LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtY29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYWI5MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2pwYS1jb250ZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtZmlsZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvanBhLWZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGU5ZjQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvanBhLWphci1maWxlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtamFyLWZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTI4MjhkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9qcGEtamFyLWZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2pwcWwuZnVuY3Rpb24uZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2pwcWwuZnVuY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTQ0MzRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9qcHFsLmZ1bmN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9qcHFsLmlkZW50aWZpZXIuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2pwcWwuaWRlbnRpZmllci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDgyZmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2pwcWwuaWRlbnRpZmllci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvanBxbC52YXJpYWJsZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvanBxbC52YXJpYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzYxMjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L2pwcWwudmFyaWFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L21hbnktdG8tbWFueS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4ODViMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1tYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW9uZS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFueS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTFlMmI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9tYW55LXRvLW9uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNjMzc2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGE5YzIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLXR5cGUtbWFwcGluZy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mjc5NDc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9udWxsLXR5cGUtbWFwcGluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvb25lLXRvLW1hbnkuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5MDAyNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvb25lLXRvLW1hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1vbmUuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L29uZS10by1vbmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzhlYzM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9vbmUtdG8tb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS11bml0LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZS11bml0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjNDVmNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L3BlcnNpc3RlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFmNjE2ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGVyc2lzdGVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L3RyYW5zaWVudC5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1ZDgzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvdHJhbnNpZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi92ZXJzaW9uLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC9vYmoxNi92ZXJzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyYTgxMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmVyc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZy5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDA5ZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL29iajE2L3dhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfZW50aXR5X3dpemJhbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19lbnRpdHlfd2l6YmFuLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFkOTM0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19lbnRpdHlfd2l6YmFuLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19qcGFfZmlsZV93aXpiYW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODQ2MjIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19qcGFfcHJqX3dpei5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld19qcGFfcHJqX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTJiYjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdfanBhX3Byal93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9hZGQtY29ubmVjdGlvbi5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2FkZC1jb25uZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0MDM0Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2FkZC1jb25uZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvYWRkLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvYWRkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJkMzQ4Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2FkZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2Jyb3dzZS1taW5pLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLW1pbmkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY0ZjI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLW1pbmkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9icm93c2UucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9icm93c2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDgxZmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvYnJvd3NlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvY29sbGFwc2UtYWxsLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvY29sbGFwc2UtYWxsLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4MmQxOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2NvbGxhcHNlLWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2RlbGV0ZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2RlbGV0ZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYmE4YjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9kZWxldGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9kZXNlbGVjdC1hbGwucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9kZXNlbGVjdC1hbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTU0NGY1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvZGVzZWxlY3QtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvZG90LmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvZG90LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhNTE0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2RvdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2VkaXQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9lZGl0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2ZDZhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL2VkaXQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9leHBhbmQtYWxsLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvZXhwYW5kLWFsbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiNzI5YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9leHBhbmQtYWxsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvbGlzdC1vZi12YWx1ZXMucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9saXN0LW9mLXZhbHVlcy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODFmZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9saXN0LW9mLXZhbHVlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL21vdmUtZG93bi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL21vdmUtZG93bi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTUyODEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9tb3ZlLWRvd24ucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9tb3ZlLXVwLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvbW92ZS11cC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGIxY2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9tb3ZlLXVwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvcmVjb25uZWN0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvcmVjb25uZWN0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwMDk0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL3JlY29ubmVjdC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL3JlZnJlc2guZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9yZWZyZXNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NhMDRkMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL3JlZnJlc2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9yZXN0b3JlLWRlZmF1bHRzLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvcmVzdG9yZS1kZWZhdWx0cy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNzRhZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy9yZXN0b3JlLWRlZmF1bHRzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvc2VsZWN0LWFsbC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL3NlbGVjdC1hbGwucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFmZjJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2J1dHRvbnMvc2VsZWN0LWFsbC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL3dhcm5pbmdzdGQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvYnV0dG9ucy93YXJuaW5nc3RkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNDcxYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9idXR0b25zL3dhcm5pbmdzdGQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9leHBvcnQtYXMtaW1nLWhvdmVyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vZXhwb3J0LWFzLWltZy1ob3Zlci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTFiMzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9leHBvcnQtYXMtaW1nLWhvdmVyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vZXhwb3J0LWFzLWltZy5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL2V4cG9ydC1hcy1pbWcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmI0ZGMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vZXhwb3J0LWFzLWltZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9sZWZ0X2JnLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX2xlZnRfYmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZmZmU0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX2xlZnRfYmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9oZWFkZXJfbWlkX2JnLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX21pZF9iZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYTgyOGQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9oZWFkZXJfbWlkX2JnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX3JpZ2h0X2JnLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vaGVhZGVyX3JpZ2h0X2JnLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3NDE0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL2hlYWRlcl9yaWdodF9iZy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL3ByaW50LWhvdmVyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vcHJpbnQtaG92ZXIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjhhMDliLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vcHJpbnQtaG92ZXIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9wcmludC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL3ByaW50LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUxNWJhMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL3ByaW50LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWJvdHRvbS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1ib3R0b20ucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODRiMzM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWJvdHRvbS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy1sb3dlci1sZWZ0LnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWxvd2VyLWxlZnQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTI1ZGYzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWxvd2VyLWxlZnQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItcmlnaHQucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctbG93ZXItcmlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThjOTUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LWxvd2VyLXJpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vc2hhZG93LXNpZGUucG5nIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctc2lkZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NWVkNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctc2lkZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy11cHBlci1yaWdodC5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9kaWFncmFtL3NoYWRvdy11cHBlci1yaWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYWJiOTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS9zaGFkb3ctdXBwZXItcmlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS90b29sYmFyX2JnLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL2RpYWdyYW0vdG9vbGJhcl9iZy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODNhNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvZGlhZ3JhbS90b29sYmFyX2JnLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvY29sdW1uLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvY29sdW1uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxNTUxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbktleS5naWYgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL2NvbHVtbktleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzg1MTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy9jb2x1bW5LZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy9maWxlLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvZmlsZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzE4MTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy9maWxlLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvZm9sZGVyLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvZm9sZGVyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1OWRhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL2ZvbGRlci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL2ZvcndhcmQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy9mb3J3YXJkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYmQ3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL2ZvcndhcmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy9tb3ZlUmlnaHQuZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy9tb3ZlUmlnaHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTE1MTFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvbW92ZVJpZ2h0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvcGFja2FnZS5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL3BhY2thZ2UucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFjYzQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvcGFja2FnZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vYmplY3RzL3RhYmxlLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvdGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTkzODhhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvdGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy90YWJsZV9vYmouZ2lmIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvb2JqZWN0cy90YWJsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmNjYWJiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL29iamVjdHMvdGFibGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL292ZXJsYXlzL2Vycm9yLmdpZiBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL292ZXJsYXlzL2Vycm9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vdmVybGF5cy9lcnJvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9vdmVybGF5cy93YXJuaW5nLnBuZyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL292ZXJsYXlzL3dhcm5pbmcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzFlODZjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvaW1hZ2VzL292ZXJsYXlzL3dhcm5pbmcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9pbWFnZXMvc2F2ZS1pbWFnZS0xNi5wbmcgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9zYXZlLWltYWdlLTE2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhNDc3NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ltYWdlcy9zYXZlLWltYWdlLTE2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODVhNjY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLXBsdWdpbk5hbWU9IERhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBVSQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLUpQQV9QTEFURk9STV9VST0iSlBBIFBsYXRmb3JtIFVJIgotCi1qcGFOYXZpZ2F0b3JDb250ZW50PUpQQSBDb250ZW50Ci0KLWpwYVdpemFyZENhdGVnb3J5TmFtZSA9IEpQQQotbmV3SnBhUHJvamVjdFdpemFyZE5hbWUgPSBKUEEgUHJvamVjdAotbmV3SnBhUHJvamVjdFdpemFyZERlc2MgPSBDcmVhdGUgYSBKUEEgcHJvamVjdAotbmV3SnBhRW50aXR5V2l6YXJkTmFtZSA9IEpQQSBFbnRpdHkKLW5ld0pwYUVudGl0eVdpemFyZERlc2MgPSBDcmVhdGUgYSBKUEEgRW50aXR5IAotbmV3SnBhTWFwcGluZ0ZpbGVXaXphcmROYW1lID0gSlBBIE9STSBNYXBwaW5nIEZpbGUKLW5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYyA9IENyZWF0ZSBhIEpQQSBPUk0gTWFwcGluZyBGaWxlCi1uZXdKcGFFbnRpdHlGcm9tVGFibGVXaXphcmROYW1lID0gSlBBIEVudGl0aWVzIGZyb20gVGFibGVzCi1uZXdKcGFFbnRpdHlGcm9tVGFibGVXaXphcmREZXNjID0gQ3JlYXRlIEpQQSBFbnRpdGllcyBmcm9tIGRhdGFiYXNlIHRhYmxlcyAKLQotdXBncmFkZVRvTGF0ZXN0VmVyc2lvbiA9IFVwZ3JhZGUgRG9jdW1lbnQgVmVyc2lvbgotanBhU3RydWN0dXJlVmlld0NvbW1hbmRDYXRlZ29yeSA9IEpQQSBTdHJ1Y3R1cmUgVmlldwotYWRkUGVyc2lzdGVudENsYXNzID0gQWRkIENsYXNzLi4uCi1yZW1vdmVQZXJzaXN0ZW50Q2xhc3MgPSBSZW1vdmUgQ2xhc3MKLWFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbCA9IEFkZCBBdHRyaWJ1dGUgdG8gWE1MCi1hZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXAgPSBBZGQgQXR0cmlidXRlIHRvIFhNTCBhbmQgTWFwLi4uCi1yZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbCA9IFJlbW92ZSBBdHRyaWJ1dGUgZnJvbSBYTUwKLW1hcEFzPU1hcCBBcwotbWFwQXNNbmVtb25pYz1NCi1tYXBBc1BhcmFtZXRlck5hbWU9bWFwcGluZyBrZXkKLW1hcEFzU3BlY2lmaWVkTWFwcGluZ1BhcmFtZXRlck5hbWU9c3BlY2lmaWVkIG1hcHBpbmcga2V5Ci1tYXBBc0RlZmF1bHRNYXBwaW5nUGFyYW1ldGVyTmFtZT1kZWZhdWx0IG1hcHBpbmcga2V5Ci1jb252ZXJ0SmF2YVByb2plY3RUb0pwYUNvbW1hbmROYW1lPUNvbnZlcnQgdG8gSlBBIFByb2plY3QuLi4KLQotanBhTWVudU5hbWUgPSBKUEEgVG9vbHMKLWdlbmVyYXRlRW50aXRpZXMgPSBHZW5lcmF0ZSBFbnRpdGllcyBmcm9tIFRhYmxlcy4uLgotZ2VuZXJhdGVEREwgPSBHZW5lcmF0ZSBUYWJsZXMgZnJvbSBFbnRpdGllcy4uLgotc3luY2hyb25pemVDbGFzc2VzID0gU3luY2hyb25pemUgQ2xhc3MgTGlzdAotbWFrZVBlcnNpc3RlbnQgPSBNYWtlIFBlcnNpc3RlbnQuLi4KLXBlcnNpc3RlbmNlRWRpdG9yPVBlcnNpc3RlbmNlIFhNTCBFZGl0b3IKLQotamF2YVBlcnNpc3RlbmNlTm9kZSA9IEphdmEgUGVyc2lzdGVuY2UKLWpwYU5vZGUgPSBKUEEKLWpwYVByb2JsZW1TZXZlcml0aWVzTm9kZSA9IEVycm9ycy9XYXJuaW5ncwotCi1qcGFQZXJzcGVjdGl2ZSA9IEpQQQotanBhUGVyc3BlY3RpdmVEZXNjcmlwdGlvbiA9IFRoaXMgcGVyc3BlY3RpdmUgaXMgZGVzaWduZWQgdG8gc3VwcG9ydCBKYXZhIFBlcnNpc3RlbmNlIChKUEEpIGRldmVsb3BtZW50LiBJdCBvZmZlcnMgYSBQcm9qZWN0IEV4cGxvcmVyLCBKUEEgRGV0YWlscywgSlBBIFN0cnVjdHVyZSBhbmQgYSBEYXRhIFNvdXJjZSBFeHBsb3Jlci4KLWpwYURldGFpbHMgPSBKUEEgRGV0YWlscwotanBhU3RydWN0dXJlID0gSlBBIFN0cnVjdHVyZQotSnBhUHJvcG9zYWxDYXRlZ29yeSA9IEpQQSBQcm9wb3NhbHMKLQotSnB0Q3JlYXRpb25BY3Rpb25TZXQubGFiZWwgPSBKcHQgQ3JlYXRpb24KLUpwdENyZWF0aW9uQWN0aW9uU2V0LmRlc2NyaXB0aW9uID0gSnB0IENyZWF0aW9uIEFjdGlvbiBTZXQKLQotTmV3RW50aXR5QWN0aW9uLmxhYmVsID0gTmV3IEVudGl0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcGx1Z2luLnhtbCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkMTBmYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08IS0tCi0gIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotCi0gIENvbnRyaWJ1dG9yczoKLSAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAtLT4KLQotPHBsdWdpbj4KLQkKLQk8ZXh0ZW5zaW9uLXBvaW50IAotCQlpZD0ianBhUGxhdGZvcm1VaXMiIAotCQluYW1lPSIlSlBBX1BMQVRGT1JNX1VJIiAKLQkJc2NoZW1hPSJzY2hlbWEvanBhUGxhdGZvcm1VaXMuZXhzZCIvPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgotCQkKLQkJPCEtLSAKLQkJCUEgdGVzdCBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciBvdXIgY3VycmVudCBjb250ZXh0IGlzIHdpdGhpbiB0aGUgCi0JCQlKUEEgU3RydWN0dXJlIFZpZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQktLT4KLQkJPGRlZmluaXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnJlZmVyZW5jZS5pbkpwYVN0cnVjdHVyZVZpZXciPgotCQkJPHdpdGgKLQkJCQl2YXJpYWJsZT0iYWN0aXZlUGFydElkIj4KLQkJCQk8ZXF1YWxzCi0JCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhU3RydWN0dXJlVmlldyIvPgotCQkJPC93aXRoPgotCQk8L2RlZmluaXRpb24+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0JCQotCQk8ZmFjdG9yeQotCQkJYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uV29ya2JlbmNoUGFydEFkYXB0ZXJGYWN0b3J5Ij4KLQkJCTxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvblBhcnRpY2lwYW50Ii8+Ci0JCTwvZmFjdG9yeT4KLQkJCi0JCTxmYWN0b3J5Ci0JCQlhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkVkaXRvclBhcnRBZGFwdGVyRmFjdG9yeSI+Ci0JCQk8YWRhcHRlciB0eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZSIvPgotCQk8L2ZhY3Rvcnk+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRXh0ZW5zaW9uOiBKYXZhIENvbXBsZXRpb24gUHJvcG9zYWwgQ29tcHV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiCi0JCWlkPSJKcGFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciI+Ci0JCQotCQk8amF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQcm9wb3NhbENhdGVnb3J5Ij4KLQkJCTxwYXJ0aXRpb24gdHlwZT0iX19kZnRsX3BhcnRpdGlvbl9jb250ZW50X3R5cGUiLz4KLQkJCTxwYXJ0aXRpb24gdHlwZT0iX19qYXZhX3N0cmluZyIvPgotCQk8L2phdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcj4KLQotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuamR0LnVpLmphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciIKLQkJaWQ9ImpwYVByb3Bvc2FsQ2F0ZWdvcnkiCi0JCW5hbWU9IiVKcGFQcm9wb3NhbENhdGVnb3J5Ij4KLQkJPHByb3Bvc2FsQ2F0ZWdvcnkKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9wZXJzcGVjdGl2ZS5naWYiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5qYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiCi0JCWlkPSJKcGFKcHFsQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiPgotCi0JCTxqYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIKLSAgICAgICAgYWN0aXZhdGU9InRydWUiCi0gICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUHJvcG9zYWxDYXRlZ29yeSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBxbC5KcGFKcHFsSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIj4KLQkJCTxwYXJ0aXRpb24gdHlwZT0iX19kZnRsX3BhcnRpdGlvbl9jb250ZW50X3R5cGUiLz4KLQkJCTxwYXJ0aXRpb24gdHlwZT0iX19qYXZhX3N0cmluZyIvPgotCQk8L2phdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcj4KLQkJCi0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkueG1sLmpwcWxDb21wbGV0aW9uUHJvcG9zYWwiCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tcGxldGlvblByb3Bvc2FsIj4KLQotCQk8cHJvcG9zYWxDYXRlZ29yeQotCSAgICAgICAgICAgaWNvbj0iJG5sJC9pY29ucy9mdWxsL2V2aWV3MTYvanBhX3BlcnNwZWN0aXZlLmdpZiIKLQkgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnhtbC5qcHFsUHJvcG9zYWxDYXRlZ29yeSIKLQkgICAgICAgICAgIG5hbWU9IiVKcGFQcm9wb3NhbENhdGVnb3J5Ij4KLQkJPC9wcm9wb3NhbENhdGVnb3J5PgotCi0JCTxwcm9wb3NhbENvbXB1dGVyCi0JICAgICAgIGFjdGl2YXRlPSJ0cnVlIgotCSAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnhtbC5qcHFsUHJvcG9zYWxDYXRlZ29yeSIKLQkgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBxbC5KcGFKcHFsU3NlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIiCi0JICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwcWwuSnBhSnBxbFNzZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIj4KLQkJCTxjb250ZW50VHlwZQotCQkJCWlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJCTwvY29udGVudFR5cGU+Ci0JCTwvcHJvcG9zYWxDb21wdXRlcj4KLQotCTwvZXh0ZW5zaW9uPgkKLQotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQbGF0Zm9ybVVpcyI+Ci0JCQotCQk8anBhUGxhdGZvcm1VaQotCQkJaWQ9ImdlbmVyaWMudWkiCi0JCQlqcGFQbGF0Zm9ybT0iZ2VuZXJpYyIKLQkJCWZhY3RvcnlDbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNKcGFQbGF0Zm9ybVVpRmFjdG9yeSIvPgotCQkKLQkJPGpwYVBsYXRmb3JtVWkKLQkJCWlkPSJnZW5lcmljMl8wLnVpIgotCQkJanBhUGxhdGZvcm09ImdlbmVyaWMyXzAiCi0JCQlmYWN0b3J5Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeSIvPgotCQotCTwvZXh0ZW5zaW9uPgotICAJCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0cyI+Ci0JCQotCQk8YWN0aW9uU2V0Ci0JCQlkZXNjcmlwdGlvbj0iJUpwdENyZWF0aW9uQWN0aW9uU2V0LmRlc2NyaXB0aW9uIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0Q3JlYXRpb25BY3Rpb25TZXQiCi0JCQlsYWJlbD0iJUpwdENyZWF0aW9uQWN0aW9uU2V0LmxhYmVsIj4KLQkJCTxhY3Rpb24KLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLk5ld0VudGl0eURyb3BEb3duQWN0aW9uIgotCQkJCWRpc2FibGVkSWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZiIKLQkJCQlpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2VudGl0eV93aXouZ2lmIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLk5ld0VudGl0eUFjdGlvbiIKLQkJCQlsYWJlbD0iJU5ld0VudGl0eUFjdGlvbi5sYWJlbCIKLQkJCQlzdHlsZT0icHVsbGRvd24iCi0JCQkJdG9vbGJhclBhdGg9Ik5vcm1hbC9KcHRXaXphcmRzIj4KLQkJCTwvYWN0aW9uPgotCQk8L2FjdGlvblNldD4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmNvbnZlcnRKYXZhUHJvamVjdFRvSnBhIgotCQkJbmFtZT0iJWNvbnZlcnRKYXZhUHJvamVjdFRvSnBhQ29tbWFuZE5hbWUiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5maWxlIgotCQkJZGVmYXVsdEhhbmRsZXI9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHMuQ29udmVydEphdmFQcm9qZWN0VG9KcGFDb21tYW5kSGFuZGxlciIvPgotCQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS54bWxGaWxlVXBncmFkZVRvTGF0ZXN0VmVyc2lvbiIKLQkJCW5hbWU9IiV1cGdyYWRlVG9MYXRlc3RWZXJzaW9uIi8+Ci0JCQotCQk8Y2F0ZWdvcnkKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyIKLQkJCW5hbWU9IiVqcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZENhdGVnb3J5Ij4KLQkJPC9jYXRlZ29yeT4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5lbnRpdHlNYXBwaW5nc0FkZFBlcnNpc3RlbnRDbGFzcyIKLQkJCW5hbWU9IiVhZGRQZXJzaXN0ZW50Q2xhc3MiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyI+Ci0JCTwvY29tbWFuZD4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5wZXJzaXN0ZW50VHlwZVJlbW92ZVBlcnNpc3RlbnRDbGFzcyIKLQkJCW5hbWU9IiVyZW1vdmVQZXJzaXN0ZW50Q2xhc3MiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyI+Ci0JCTwvY29tbWFuZD4KLQkJCi0JCTxjb21tYW5kCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5wZXJzaXN0ZW50QXR0cmlidXRlQWRkVG9YbWwiCi0JCQluYW1lPSIlYWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQk8L2NvbW1hbmQ+Ci0JCQotCQk8Y29tbWFuZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVudEF0dHJpYnV0ZUFkZFRvWG1sQW5kTWFwIgotCQkJbmFtZT0iJWFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcCIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhU3RydWN0dXJlVmlld0NvbW1hbmRzIj4KLQkJPC9jb21tYW5kPgotCQkKLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVSZW1vdmVGcm9tWG1sIgotCQkJbmFtZT0iJXJlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQk8L2NvbW1hbmQ+Ci0KLQkJPGNvbW1hbmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiCi0JCQluYW1lPSIlbWFwQXMiCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVN0cnVjdHVyZVZpZXdDb21tYW5kcyI+Ci0JCQk8Y29tbWFuZFBhcmFtZXRlcgotCQkJCWlkPSJwZXJzaXN0ZW50VHlwZU1hcHBpbmdLZXkiCi0JCQkJbmFtZT0iJW1hcEFzUGFyYW1ldGVyTmFtZSIKLQkJCQlvcHRpb25hbD0iZmFsc2UiPgotCQkJPC9jb21tYW5kUGFyYW1ldGVyPgotCQk8L2NvbW1hbmQ+Ci0JCQotCQk8Y29tbWFuZAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzIgotCQkJbmFtZT0iJW1hcEFzIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFTdHJ1Y3R1cmVWaWV3Q29tbWFuZHMiPgotCQkJPGNvbW1hbmRQYXJhbWV0ZXIKLQkJCQlpZD0ic3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZU1hcHBpbmdLZXkiCi0JCQkJbmFtZT0iJW1hcEFzU3BlY2lmaWVkTWFwcGluZ1BhcmFtZXRlck5hbWUiCi0JCQkJb3B0aW9uYWw9ImZhbHNlIj4KLQkJCTwvY29tbWFuZFBhcmFtZXRlcj4KLQkJCTxjb21tYW5kUGFyYW1ldGVyCi0JCQkJaWQ9ImRlZmF1bHRQZXJzaXN0ZW50QXR0cmlidXRlTWFwcGluZ0tleSIKLQkJCQluYW1lPSIlbWFwQXNEZWZhdWx0TWFwcGluZ1BhcmFtZXRlck5hbWUiCi0JCQkJb3B0aW9uYWw9ImZhbHNlIj4KLQkJCTwvY29tbWFuZFBhcmFtZXRlcj4KLQkJPC9jb21tYW5kPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbjogUGVyc2lzdGVuY2UgRWRpdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JCi0JPGV4dGVuc2lvbiAKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQkKLQkJPGVkaXRvcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZWRpdG9ycy5QZXJzaXN0ZW5jZUVkaXRvciIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZWRpdG9ycy5QZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL29iajE2L2pwYS1maWxlLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmVkaXRvcnMuUGVyc2lzdGVuY2VFZGl0b3IiCi0JCQluYW1lPSIlcGVyc2lzdGVuY2VFZGl0b3IiPgotICAgICAgCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRlbnQucGVyc2lzdGVuY2UiLz4KLQkJPC9lZGl0b3I+Ci0JCQotIAk8L2V4dGVuc2lvbj4KLSAJCi0gCQotIAk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnhtbEZpbGVVcGdyYWRlVG9MYXRlc3RWZXJzaW9uIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHMuVXBncmFkZVhtbEZpbGVWZXJzaW9uSGFuZGxlciI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxvcj4KLQkJCQkJCTxhZGFwdAotCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbEZpbGUiPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaXNMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uIgotCQkJCQkJCQl2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCQk8YWRhcHQKLQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlIj4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmlzTGF0ZXN0U3VwcG9ydGVkVmVyc2lvbiIKLQkJCQkJCQkJdmFsdWU9ImZhbHNlIi8+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L29yPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZW50aXR5TWFwcGluZ3NBZGRQZXJzaXN0ZW50Q2xhc3MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5jb21tYW5kcy5BZGRQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyIj4KLQkJCTxhY3RpdmVXaGVuPgotCQkJCTxyZWZlcmVuY2UKLQkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnJlZmVyZW5jZS5pbkpwYVN0cnVjdHVyZVZpZXciPgotCQkJCTwvcmVmZXJlbmNlPgotCQkJPC9hY3RpdmVXaGVuPgotCQkJPGVuYWJsZWRXaGVuPgotCQkJCTxhbmQ+Ci0JCQkJCTxjb3VudCB2YWx1ZT0iMSIvPgotCQkJCQk8aXRlcmF0ZT4KLQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3MiLz4KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvYW5kPgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9oYW5kbGVyPgotCQkKLQkJPGhhbmRsZXIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5wZXJzaXN0ZW50VHlwZVJlbW92ZVBlcnNpc3RlbnRDbGFzcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzLlJlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGUiLz4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEhhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJ0cnVlIi8+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmlzTWFwcGVkIiB2YWx1ZT0idHJ1ZSIvPgotCQkJCQk8L2FuZD4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbEFuZE1hcCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcEhhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJ0cnVlIi8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVudEF0dHJpYnV0ZVJlbW92ZUZyb21YbWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5jb21tYW5kcy5SZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIiPgotCQkJPGFjdGl2ZVdoZW4+Ci0JCQkJPHJlZmVyZW5jZQotCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucmVmZXJlbmNlLmluSnBhU3RydWN0dXJlVmlldyI+Ci0JCQkJPC9yZWZlcmVuY2U+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSIvPgotCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJmYWxzZSIvPgotCQkJCQk8L2FuZD4KLQkJCQk8L2l0ZXJhdGU+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L2hhbmRsZXI+Ci0JCQotCQk8aGFuZGxlcgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5jb21tYW5kcy5QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlciI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlCi0JCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5yZWZlcmVuY2UuaW5KcGFTdHJ1Y3R1cmVWaWV3Ii8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZSIvPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0JCTxoYW5kbGVyCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHMuUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlciI+Ci0JCQk8YWN0aXZlV2hlbj4KLQkJCQk8cmVmZXJlbmNlCi0JCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5yZWZlcmVuY2UuaW5KcGFTdHJ1Y3R1cmVWaWV3Ii8+Ci0JCQk8L2FjdGl2ZVdoZW4+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGl0ZXJhdGU+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmlzVmlydHVhbCIgdmFsdWU9ImZhbHNlIi8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvaXRlcmF0ZT4KLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvaGFuZGxlcj4KLQkJCi0gCTwvZXh0ZW5zaW9uPgotIAkKLSAJCi0gCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KLQkJCi0JCTwhLS0gY29udHJpYnV0aW9ucyBmb3IgYW55IHBvcHVwIC0tPgotCQk8bWVudUNvbnRyaWJ1dGlvbgotCQkJbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnVpLnBvcHVwLmFueSI+Ci0JCQkKLQkJCTwhLS0gIkpQQSBUb29scyIgc3VibWVudSBmb3IgCi0JCQkJLSBhbnl0aGluZyB0aGF0IGFkYXB0cyB0byBKcGFYbWxSZXNvdXJjZSAoSUZpbGUgb2JqZWN0cywgbW9zdGx5KQotCQkJCS0gYW55dGhpbmcgdGhhdCBhZGFwdHMgdG8gSVByb2plY3QgYW5kIGhhcyBhIEpQQSBmYWNldCAtLT4KLQkJCTxtZW51Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkubWVudS5KcGFUb29scyIKLQkJCQlsYWJlbD0iJWpwYU1lbnVOYW1lIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8b3I+Ci0JCQkJCQkJCTxhZGFwdAotCQkJCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZSIvPgotCQkJCQkJCQk8YWRhcHQKLQkJCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgCi0JCQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiLz4KLQkJCQkJCQkJPC9hZGFwdD4KLQkJCQkJCQkJPGFuZD4KLQkgICAgICAgIAkJCQkJCTxhZGFwdAotCSAgICAgICAgICAgICAgCQkJCQkJdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQkJCQk8dGVzdAotCQkJCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiAKLQkJCQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiLz4KLSAgICAgICAgCQkJCQkJCTwvYWRhcHQ+Ci0gICAgICAgIAkJCQkJCQk8YWRhcHQKLSAgICAgICAgCQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQiLz4KLQkJCQkJCQkJPC9hbmQ+Ci0JCQkJCQkJPC9vcj4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L21lbnU+Ci0JCQkKLQkJCTwhLS0gY29tbWFuZHMgZm9yIG9iamVjdHMgdGhhdCBkb24ndCBuZWVkICJKUEEgVG9vbHMiIHN1Ym1lbnUgLS0+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS54bWxGaWxlVXBncmFkZVRvTGF0ZXN0VmVyc2lvbiI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCQkJPGFkYXB0Ci0JCQkJCQkJCXR5cGU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlhtbEZpbGUiPgotCQkJCQkJCQk8dGVzdAotCQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pc0xhdGVzdFN1cHBvcnRlZFZlcnNpb24iCi0JCQkJCQkJCQl2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJCQk8L2FkYXB0PgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4JCi0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0JCTwhLS0gY29udHJpYnV0aW9ucyB0byB0aGUgIkpQQSBUb29scyIgc3VibWVudSAtLT4KLQkJPG1lbnVDb250cmlidXRpb24KLQkJCWxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm1lbnUuSnBhVG9vbHMiPgotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkueG1sRmlsZVVwZ3JhZGVUb0xhdGVzdFZlcnNpb24iPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJCTxhZGFwdAotCQkJCQkJCQl0eXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlIj4KLQkJCQkJCQkJPHRlc3QKLQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaXNMYXRlc3RTdXBwb3J0ZWRWZXJzaW9uIgotCQkJCQkJCQkJdmFsdWU9ImZhbHNlIi8+Ci0JCQkJCQkJPC9hZGFwdD4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0JCTwhLS0gY29udHJpYnV0aW9ucyB0byB0aGUgcHJvamVjdCBjb25maWd1cmUgbWVudSAtLT4KLQkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnVpLnByb2plY3RDb25maWd1cmU/YWZ0ZXI9YWRkaXRpb25zIj4KLQkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5jb252ZXJ0SmF2YVByb2plY3RUb0pwYSIgc3R5bGU9InB1c2giPgotCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KLQkJCQkJPGFuZD4KLQkJCQkJCTxjb3VudCB2YWx1ZT0iMSIvPgotCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiIG9wZXJhdG9yPSJhbmQiPgotCQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQkJCTxhbmQ+Ci0JCQkJCQkJCQk8dGVzdAotCQkJCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcm9qZWN0TmF0dXJlIgotCQkJCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIi8+Ci0JCQkJCQkJCQk8bm90PgotCQkJCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJvamVjdE5hdHVyZSIgCi0JCQkJCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5uYXR1cmUiLz4KLQkJCQkJCQkJCTwvbm90PgotCQkJCQkJCQk8L2FuZD4KLQkJCQkJCQk8L2FkYXB0PgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L2FuZD4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQk8L21lbnVDb250cmlidXRpb24+Ci0JCQotCQk8IS0tIGNvbnRyaWJ1dGlvbnMgdG8gb2JqZWN0cyBpbiB0aGUgSlBBIHN0cnVjdHVyZSB2aWV3IC0tPgotCQk8bWVudUNvbnRyaWJ1dGlvbgotCQkJbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ij4KLQkJCTxjb21tYW5kCi0JCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmVudGl0eU1hcHBpbmdzQWRkUGVyc2lzdGVudENsYXNzIj4KLQkJCQk8dmlzaWJsZVdoZW4+Ci0JCQkJCTx3aXRoCi0JCQkJCQl2YXJpYWJsZT0ic2VsZWN0aW9uIj4KLQkJCQkJCTxpdGVyYXRlIGlmRW1wdHk9ImZhbHNlIj4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzIi8+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVudFR5cGVSZW1vdmVQZXJzaXN0ZW50Q2xhc3MiPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGUiLz4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQk8Y29tbWFuZAotCQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5wZXJzaXN0ZW50QXR0cmlidXRlQWRkVG9YbWwiPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJCTxhbmQ+Ci0JCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaXNWaXJ0dWFsIiB2YWx1ZT0idHJ1ZSIvPgotCQkJCQkJCTwvYW5kPgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCTwvY29tbWFuZD4KLQkJCTxjb21tYW5kCi0JCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVBZGRUb1htbEFuZE1hcCI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCQkJPGFuZD4KLQkJCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUiLz4KLQkJCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJ0cnVlIi8+Ci0JCQkJCQkJPC9hbmQ+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJPC9jb21tYW5kPgotCQkJPGNvbW1hbmQKLQkJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVudEF0dHJpYnV0ZVJlbW92ZUZyb21YbWwiPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJCTxhbmQ+Ci0JCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIi8+Ci0JCQkJCQkJCTx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaXNWaXJ0dWFsIiB2YWx1ZT0iZmFsc2UiLz4KLQkJCQkJCQk8L2FuZD4KLQkJCQkJCTwvaXRlcmF0ZT4KLQkJCQkJPC93aXRoPgotCQkJCTwvdmlzaWJsZVdoZW4+Ci0JCQk8L2NvbW1hbmQ+Ci0JCQkKLQkJCTxtZW51Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVudFR5cGVNYXBBcyIKLQkJCQlsYWJlbD0iJW1hcEFzIgotCQkJCW1uZW1vbmljPSIlbWFwQXNNbmVtb25pYyI+Ci0JCQkJPHZpc2libGVXaGVuPgotCQkJCQk8d2l0aAotCQkJCQkJdmFyaWFibGU9InNlbGVjdGlvbiI+Ci0JCQkJCQk8aXRlcmF0ZSBpZkVtcHR5PSJmYWxzZSI+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlIi8+Ci0JCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJCTwvd2l0aD4KLQkJCQk8L3Zpc2libGVXaGVuPgotCQkJCTxkeW5hbWljCi0JCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiCi0JCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLm1lbnVzLlBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24iPgotCQkJCTwvZHluYW1pYz4KLQkJCTwvbWVudT4KLQkJCQotCQkJPG1lbnUKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5wZXJzaXN0ZW50QXR0cmlidXRlTWFwQXMiCi0JCQkJbGFiZWw9IiVtYXBBcyIKLQkJCQltbmVtb25pYz0iJW1hcEFzTW5lbW9uaWMiPgotCQkJCTx2aXNpYmxlV2hlbj4KLQkJCQkJPHdpdGgKLQkJCQkJCXZhcmlhYmxlPSJzZWxlY3Rpb24iPgotCQkJCQkJPGl0ZXJhdGUgaWZFbXB0eT0iZmFsc2UiPgotCQkJCQkJCTxhbmQ+Ci0JCQkJCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUiLz4KLQkJCQkJCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pc1ZpcnR1YWwiIHZhbHVlPSJmYWxzZSIvPgotCQkJCQkJCTwvYW5kPgotCQkJCQkJPC9pdGVyYXRlPgotCQkJCQk8L3dpdGg+Ci0JCQkJPC92aXNpYmxlV2hlbj4KLQkJCQk8ZHluYW1pYwotCQkJCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5wZXJzaXN0ZW50QXR0cmlidXRlTWFwQXMiCi0JCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLm1lbnVzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbiI+Ci0JCQkJPC9keW5hbWljPgotCQkJPC9tZW51PgotCi0JCTwvbWVudUNvbnRyaWJ1dGlvbj4KLQkJCi0gCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci52aWV3ZXIiPgotCQkKLQkJPHZpZXdlckNvbnRlbnRCaW5kaW5nCi0JCQl2aWV3ZXJJZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLlByb2plY3RFeHBsb3JlciI+Ci0JCQk8aW5jbHVkZXM+Ci0JCQkJPGNvbnRlbnRFeHRlbnNpb24gcGF0dGVybj0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS4qIi8+Ci0JCQk8L2luY2x1ZGVzPgotCQk8L3ZpZXdlckNvbnRlbnRCaW5kaW5nPgotCQkKLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IubmF2aWdhdG9yQ29udGVudCI+Ci0JCQotCQk8bmF2aWdhdG9yQ29udGVudAotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhTmF2aWdhdG9yQ29udGVudCIKLQkJCW5hbWU9IiVqcGFOYXZpZ2F0b3JDb250ZW50IiAKLQkJCXByaW9yaXR5PSJoaWdoZXIiCi0JCQlhcHBlYXJzQmVmb3JlPSJvcmcuZWNsaXBzZS5qc3Quc2VydmxldC51aS5FbmhhbmNlZEphdmFSZW5kZXJpbmciCi0JCQlpY29uPSJpY29ucy9mdWxsL29iajE2L2pwYS1jb250ZW50LmdpZiIKLQkJCWFjdGl2ZUJ5RGVmYXVsdD0idHJ1ZSIKLQkJCWNvbnRlbnRQcm92aWRlcj0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyIgotCQkJbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlciI+Ci0JCQkKLQkJCTx0cmlnZ2VyUG9pbnRzPgotCQkJCTxvcj4KLQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZSIvPgotCQkJCQk8YW5kPgotCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiIC8+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQk8L29yPgotCQkJPC90cmlnZ2VyUG9pbnRzPgotCQkJCi0JCQk8cG9zc2libGVDaGlsZHJlbj4KLQkJCQk8aW5zdGFuY2VvZgotCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGUiLz4KLQkJCTwvcG9zc2libGVDaGlsZHJlbj4KLQkJCQotCQkJPGFjdGlvblByb3ZpZGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwubmF2aWdhdG9yLkpwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYUFjdGlvblByb3ZpZGVyIj4KLQkJCQk8ZW5hYmxlbWVudD4KLQkJCQkJPGFuZD4KLQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlIi8+Ci0JCQkJCTwvYW5kPgotCQkJCTwvZW5hYmxlbWVudD4KLQkJCTwvYWN0aW9uUHJvdmlkZXI+Ci0JCQkKLQkJCTxjb21tb25XaXphcmQKLQkJCQltZW51R3JvdXBJZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIKLQkJCQl0eXBlPSJuZXciCi0JCQkJd2l6YXJkSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkud2l6YXJkLm5ld0VudGl0eSI+Ci0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZgotCQkJCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianB0LmpwYSIgLz4KLQkJCQkJCTwvYWRhcHQ+Ci0JCQkJCTwvYW5kPgotCQkJCTwvZW5hYmxlbWVudD4KLQkJCTwvY29tbW9uV2l6YXJkPgotCQkJCi0JCQk8Y29tbW9uV2l6YXJkCi0JCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkiCi0JCQkJdHlwZT0ibmV3IgotCQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLndpemFyZC5uZXdNYXBwaW5nRmlsZSI+Ci0JCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJCTxhbmQ+Ci0JCQkJCQk8b3I+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXIiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QiLz4KLQkJCQkJCQk8aW5zdGFuY2VvZiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotCQkJCQkJPC9vcj4KLQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqcHQuanBhIiAvPgotCQkJCQkJPC9hZGFwdD4KLQkJCQkJPC9hbmQ+Ci0JCQkJPC9lbmFibGVtZW50PgotCQkJPC9jb21tb25XaXphcmQ+Ci0JCQkKLQkJCTwhLS0KLQkJCQotCQkJPGNvbW1vblNvcnRlcgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5uYXZpZ2F0b3IuaW50ZXJuYWwuSjJFRVZpZXdlclNvcnRlciIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmoyZWUubmF2aWdhdG9yLmludGVybmFsLkoyRUVWaWV3ZXJTb3J0ZXIiIC8+Ci0JCQkKLQkJCS0tPgotCQkJCi0JCQk8Y29tbW9uV2l6YXJkCi0JCQkJbWVudUdyb3VwSWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkiCi0JCQkJdHlwZT0ibmV3IgotCQkJCXdpemFyZElkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLndpemFyZC5uZXdFbnRpdGllc0Zyb21UYWJsZXMiPgotCQkJCTxlbmFibGVtZW50PgotCQkJCQk8YW5kPgotCQkJCQkJPG9yPgotCQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgotCQkJCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Ii8+Ci0JCQkJCQkJPGluc3RhbmNlb2YKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+Ci0JCQkJCQk8L29yPgotCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSI+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQkJdmFsdWU9ImpwdC5qcGEiIC8+Ci0JCQkJCQk8L2FkYXB0PgotCQkJCQk8L2FuZD4KLQkJCQk8L2VuYWJsZW1lbnQ+Ci0JCQk8L2NvbW1vbldpemFyZD4JCQkKLQkJCQotCQk8L25hdmlnYXRvckNvbnRlbnQ+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQkKLQkJPGNhdGVnb3J5Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYSIKLQkJCW5hbWU9IiVqcGFXaXphcmRDYXRlZ29yeU5hbWUiLz4KLQkJCi0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLndpemFyZC5uZXdKcGFQcm9qZWN0IgotCQkJbmFtZT0iJW5ld0pwYVByb2plY3RXaXphcmROYW1lIgotCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19qcGFwcm9qZWN0X3dpei5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYSIKLQkJCXByb2plY3Q9InRydWUiCi0JCQlmaW5hbFBlcnNwZWN0aXZlPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGVyc3BlY3RpdmUiPgotCQkJPGRlc2NyaXB0aW9uPiVuZXdKcGFQcm9qZWN0V2l6YXJkRGVzYzwvZGVzY3JpcHRpb24+Ci0JCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLkpwYVByb2plY3RXaXphcmQiPiAKLQkJCQk8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjM1Ii8+IAotCQkJPC9jbGFzcz4gCi0JCTwvd2l6YXJkPgotCQkKLQkJPHdpemFyZAotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkud2l6YXJkLm5ld0VudGl0eSIKLQkJCW5hbWU9IiVuZXdKcGFFbnRpdHlXaXphcmROYW1lIgotCQkJaWNvbj0iaWNvbnMvZnVsbC9ldG9vbDE2L25ld19lbnRpdHlfd2l6LmdpZiIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS5qcHQuanBhIj4KLQkJCTxkZXNjcmlwdGlvbj4lbmV3SnBhRW50aXR5V2l6YXJkRGVzYzwvZGVzY3JpcHRpb24+Ci0JCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuRW50aXR5V2l6YXJkIj4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqYXZhZWVhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJtZW51SW5kZXgiIHZhbHVlPSIzOCIgLz4gCi0JCQkJPHBhcmFtZXRlciBuYW1lPSJqcHRhcnRpZmFjdCIgdmFsdWU9InRydWUiLz4gCi0JCQk8L2NsYXNzPiAKLQkJPC93aXphcmQ+Ci0JCQotCQk8d2l6YXJkCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuLkdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIgotCQkJaWNvbj0icGxhdGZvcm06L3BsdWdpbi9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdfZW50aXR5X3dpei5naWYiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS53aXphcmQubmV3RW50aXRpZXNGcm9tVGFibGVzIgotCQkJbmFtZT0iJW5ld0pwYUVudGl0eUZyb21UYWJsZVdpemFyZE5hbWUiPgotCQkJPGRlc2NyaXB0aW9uPiVuZXdKcGFFbnRpdHlGcm9tVGFibGVXaXphcmREZXNjPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIvPiAKLSAgICAgICAgPC93aXphcmQ+CQkKLQkJCi0JCTx3aXphcmQKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLndpemFyZC5uZXdNYXBwaW5nRmlsZSIKLQkJCW5hbWU9IiVuZXdKcGFNYXBwaW5nRmlsZVdpemFyZE5hbWUiCi0JCQlpY29uPSJpY29ucy9mdWxsL2V0b29sMTYvbmV3X2pwYV9maWxlX3dpei5naWYiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYSI+Ci0JCQk8ZGVzY3JpcHRpb24+JW5ld0pwYU1hcHBpbmdGaWxlV2l6YXJkRGVzYzwvZGVzY3JpcHRpb24+Ci0JCQk8Y2xhc3MgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVXaXphcmQiPiAKLQkJCQk8cGFyYW1ldGVyIG5hbWU9ImphdmFlZWFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPiAKLQkJCQk8cGFyYW1ldGVyIG5hbWU9Im1lbnVJbmRleCIgdmFsdWU9IjM5IiAvPiAKLQkJCQk8cGFyYW1ldGVyIG5hbWU9ImpwdGFydGlmYWN0IiB2YWx1ZT0idHJ1ZSIvPiAKLQkJCTwvY2xhc3M+IAotCQk8L3dpemFyZD4KLSAgICAgIAotCTwvZXh0ZW5zaW9uPgotCQotCQkKLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEV4dGVuc2lvbjogUGVyc2lzdGVuY2UgUGVyc3BlY3RpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotCQkKLQkJPHBlcnNwZWN0aXZlCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZS5KcGFQZXJzcGVjdGl2ZUZhY3RvcnkiCi0JCQlpY29uPSJpY29ucy9mdWxsL2V2aWV3MTYvanBhX3BlcnNwZWN0aXZlLmdpZiIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGVyc3BlY3RpdmUiCi0JCQluYW1lPSIlanBhUGVyc3BlY3RpdmUiPgotCQkJPGRlc2NyaXB0aW9uPiVqcGFQZXJzcGVjdGl2ZURlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPC9wZXJzcGVjdGl2ZT4KLQk8L2V4dGVuc2lvbj4KLQkKLQkKLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZUV4dGVuc2lvbnMiPgotCQkKLQkJPHBlcnNwZWN0aXZlRXh0ZW5zaW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIj4KLQkJCQotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLndpemFyZC5uZXdKcGFQcm9qZWN0Ii8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkud2l6YXJkLm5ld0VudGl0eSIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLndpemFyZC5uZXdNYXBwaW5nRmlsZSIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdQYWNrYWdlQ3JlYXRpb25XaXphcmQiLz4KLQkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3Q2xhc3NDcmVhdGlvbldpemFyZCIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdJbnRlcmZhY2VDcmVhdGlvbldpemFyZCIvPgotCQkJPG5ld1dpemFyZFNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdFbnVtQ3JlYXRpb25XaXphcmQiLz4KLQkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3QW5ub3RhdGlvbkNyZWF0aW9uV2l6YXJkIi8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld1NvdXJjZUZvbGRlckNyZWF0aW9uV2l6YXJkIi8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS53aXphcmRzLk5ld0phdmFXb3JraW5nU2V0V2l6YXJkIi8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLndpemFyZHMubmV3LmZpbGUiLz4KLQkJCTxuZXdXaXphcmRTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcuZm9sZGVyIi8+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMud2l6YXJkcy5VbnRpdGxlZFRleHRGaWxlV2l6YXJkIi8+Ci0JCQkKLQkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVBlcnNwZWN0aXZlIi8+Ci0JCQk8cGVyc3BlY3RpdmVTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuZGVidWcudWkuRGVidWdQZXJzcGVjdGl2ZSIvPgotCQkJPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSIvPgotCQkJPHBlcnNwZWN0aXZlU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhQnJvd3NpbmdQZXJzcGVjdGl2ZSIvPgotCQkJCi0JCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5sYXVuY2hBY3Rpb25TZXQiLz4KLQkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5KYXZhQWN0aW9uU2V0Ii8+Ci0JCQk8YWN0aW9uU2V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRDcmVhdGlvbkFjdGlvblNldCIvPgotCQkJPGFjdGlvblNldCBpZD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiLz4KLQkJCTxhY3Rpb25TZXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0Q3JlYXRpb25BY3Rpb25TZXQiLz4KLQkJCQotCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLlBhY2thZ2VFeHBsb3JlciIvPgotCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UuamR0LnVpLlR5cGVIaWVyYXJjaHkiLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5Tb3VyY2VWaWV3Ii8+Ci0JCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qZHQudWkuSmF2YWRvY1ZpZXciLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Qcm9qZWN0RXhwbG9yZXIiLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLkNvbnRlbnRPdXRsaW5lIi8+Ci0JCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Qcm9ibGVtVmlldyIvPgotCQkJPHZpZXdTaG9ydGN1dCBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUmVzb3VyY2VOYXZpZ2F0b3IiLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC51aS5qcGFTdHJ1Y3R1cmVWaWV3Ii8+Ci0JCQk8dmlld1Nob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhRGV0YWlsc1ZpZXciLz4KLQkJCTx2aWV3U2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuRGF0YVNvdXJjZUV4cGxvcmVyTmF2aWdhdG9yIi8+Ci0JCQkKLQkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLSAgICAJCi0JCTxwZXJzcGVjdGl2ZUV4dGVuc2lvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmpzdC5qMmVlLkoyRUVQZXJzcGVjdGl2ZSI+Ci0JCQk8bmV3V2l6YXJkU2hvcnRjdXQgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkud2l6YXJkLm5ld0pwYVByb2plY3QiLz4KLQkJCTxwZXJzcGVjdGl2ZVNob3J0Y3V0IGlkPSJvcmcuZWNsaXBzZS5qcHQudWkuanBhUGVyc3BlY3RpdmUiLz4KLQkJPC9wZXJzcGVjdGl2ZUV4dGVuc2lvbj4KLQkJCi0JPC9leHRlbnNpb24+Ci0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCQotCQk8b2JqZWN0Q29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5wcm9qZWN0LkpQQVRvb2xzIgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotCQkJYWRhcHRhYmxlPSJ0cnVlIj4KLQkJCQotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIgdmFsdWU9ImpwdC5qcGEiLz4KLQkJCTwvZW5hYmxlbWVudD4KLQkJCQotCQkJPGFjdGlvbgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmdlbmVyYXRlRW50aXRpZXMiCi0JCQkJbGFiZWw9IiVnZW5lcmF0ZUVudGl0aWVzIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmFjdGlvbnMuR2VuZXJhdGVFbnRpdGllc0FjdGlvbiIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCW1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm1lbnUuSnBhVG9vbHMvY29udGVudCIvPgotCQkJCi0JCQk8YWN0aW9uCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZ2VuZXJhdGVEREwiCi0JCQkJbGFiZWw9IiVnZW5lcmF0ZURETCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5hY3Rpb25zLkdlbmVyYXRlRERMQWN0aW9uIgotCQkJCWVuYWJsZXNGb3I9IjEiCi0JCQkJbWVudWJhclBhdGg9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkubWVudS5KcGFUb29scy9jb250ZW50Ii8+Ci0JCQkJCi0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCQkKLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuTWFrZVBlcnNpc3RlbnQiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50IgotCQkJYWRhcHRhYmxlPSJ0cnVlIj4KLQkJCQotCQkJPGFjdGlvbgotICAgICAgICAgCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5hY3Rpb25zLk1ha2VQZXJzaXN0ZW50QWN0aW9uIgotICAgICAgICAgCQllbmFibGVzRm9yPSIqIgotICAgICAgICAgCQlpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5nZW5lcmF0ZUVudGl0aWVzIgotICAgICAgICAgCQlsYWJlbD0iJW1ha2VQZXJzaXN0ZW50IgotICAgICAgICAgCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5tZW51LkpwYVRvb2xzL2NvbnRlbnQiPgotICAgICAgCQkJPGVuYWJsZW1lbnQ+Ci0gICAgICAgIAkgCQk8b3I+Ci0gICAgICAgICAgICAJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdCIvPgotICAgICAgICAgICAgCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIi8+Ci0gICAgICAgICAgICAJCQk8b2JqZWN0Q2xhc3MgbmFtZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIvPgotICAgICAgICAgICAgCQkJPG9iamVjdENsYXNzIG5hbWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290Ii8+Ci0gICAgICAgICAJCQk8L29yPgotICAgICAgCQkJPC9lbmFibGVtZW50PgotICAgCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCi0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbmNlWG1sRmlsZUFjdGlvbnMiCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQluYW1lRmlsdGVyPSJwZXJzaXN0ZW5jZS54bWwiPgotCQkJCi0JCQk8YWN0aW9uCi0JCQkJaWQ9InN5bmNoQ2xhc3Nlc0FjdGlvbiIKLQkJCQlsYWJlbD0iJXN5bmNocm9uaXplQ2xhc3NlcyIKLQkJCQltZW51YmFyUGF0aD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5tZW51LkpwYVRvb2xzL2NvbnRlbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuYWN0aW9ucy5TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24iCi0JCQkJZW5hYmxlc0Zvcj0iMSIvPgotCQkJCi0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCQkKLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucGVyc2lzdGVuY2VYbWxBY3Rpb25zIgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sIj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0ic3luY2hDbGFzc2VzQWN0aW9uIgotCQkJCWxhYmVsPSIlc3luY2hyb25pemVDbGFzc2VzIgotCQkJCW1lbnViYXJQYXRoPSJjb250ZW50IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmFjdGlvbnMuU3luY2hyb25pemVDbGFzc2VzQWN0aW9uIgotCQkJCWVuYWJsZXNGb3I9IjEiLz4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCQotCQk8cGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucHJlZmVyZW5jZXMiCi0JCQluYW1lPSIlamF2YVBlcnNpc3RlbmNlTm9kZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpwdFByZWZlcmVuY2VzUGFnZSIvPgotCQkKLQkJPHBhZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVByZWZlcmVuY2VzIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KcGFQcmVmZXJlbmNlc1BhZ2UiCi0JCQluYW1lPSIlanBhTm9kZSIvPgotCQkKLQkJPHBhZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVByb2JsZW1TZXZlcml0aWVzUHJlZmVyZW5jZXMiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZSIKLQkJCW5hbWU9IiVqcGFQcm9ibGVtU2V2ZXJpdGllc05vZGUiPgotCQk8L3BhZ2U+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCQkKLQkJPHBhZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVByb2plY3RQcm9wZXJ0aWVzIgotCQkJbmFtZT0iJWpwYU5vZGUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QgCi0JCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJdmFsdWU9ImpwdC5qcGEiLz4KLQkJCQk8L2FkYXB0PgotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9wYWdlPgotCQkKLQkJPHBhZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmpwYVByb2JsZW1TZXZlcml0aWVzUHJvcGVydGllcyIKLQkJCW5hbWU9IiVqcGFQcm9ibGVtU2V2ZXJpdGllc05vZGUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQcm9qZWN0UHJvcGVydGllcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJCQkJPHRlc3QKLQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQl2YWx1ZT0ianB0LmpwYSIvPgotCQkJCTwvYWRhcHQ+Ci0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L3BhZ2U+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLQkJCi0JCTxjYXRlZ29yeQotCQkJaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkiCi0JCQluYW1lPSIlanBhUGVyc3BlY3RpdmUiLz4KLQkJCi0JCTx2aWV3Ci0JICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXciCi0JICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIKLQkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVWaWV3IgotCSAgICAgICAgaWNvbj0iaWNvbnMvZnVsbC9ldmlldzE2L2pwYV9zdHJ1Y3R1cmUuZ2lmIgotCSAgICAgICAgbmFtZT0iJWpwYVN0cnVjdHVyZSIvPgotCQkJCi0JCTx2aWV3Ci0JCQlpZD0ib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkiCi0JICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC52aWV3cy5KcGFEZXRhaWxzVmlldyIKLQkgICAgICAgIGljb249Imljb25zL2Z1bGwvZXZpZXcxNi9qcGFfZGV0YWlscy5naWYiCi0JCQluYW1lPSIlanBhRGV0YWlscyIvPgotCQkKLQk8L2V4dGVuc2lvbj4JCi0JCi0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmltYWdlcyI+Ci0JCQotCQk8aW1hZ2UgZmFjZXQ9ImpwdC5qcGEiIHBhdGg9Imljb25zL2Z1bGwvZXRvb2wxNi9qcGFfZmFjZXQuZ2lmIi8+Ci0JCQotCTwvZXh0ZW5zaW9uPgotCQotCQotCTxleHRlbnNpb24gCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQudWkud2l6YXJkUGFnZXMiPgotCQkKLQkJPHdpemFyZC1wYWdlcyBhY3Rpb249ImpwdC5qcGEuaW5zdGFsbCI+Ci0JCQk8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLkpwYUZhY2V0SW5zdGFsbFBhZ2UiLz4KLQkJPC93aXphcmQtcGFnZXM+Ci0JCQotCQk8d2l6YXJkLXBhZ2VzIGFjdGlvbj0ianB0LmpwYS52ZXJzaW9uLWNoYW5nZSI+Ci0JCQk8cGFnZSBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLkpwYUZhY2V0VmVyc2lvbkNoYW5nZVBhZ2UiLz4KLQkJPC93aXphcmQtcGFnZXM+Ci0JCQotCTwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcmVmcy5KcGFVaVByZWZlcmVuY2VJbml0aWFsaXplciI+Ci0gICAgPC9pbml0aWFsaXplcj4KLSA8L2V4dGVuc2lvbj4KLSAJCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2MwZjAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzPUFjY2VzczoKLQotQWRkVG9FYXJDb21wb3NpdGVfZWFyTWVtYmVyU2hpcD1FQVIgbWVtYmVyc2hpcAotQWRkVG9FYXJDb21wb3NpdGVfYWRkVG9FYXJMYWJlbD0mQWRkIHByb2plY3QgdG8gYW4gRUFSCi1BZGRUb0VhckNvbXBvc2l0ZV9lYXJQcm9qZWN0TGFiZWw9RUFSIHByJm9qZWN0IG5hbWU6Ci1BZGRUb0VhckNvbXBvc2l0ZV9uZXdCdXR0b25MYWJlbD1OZXcgJlByb2plY3QgLi4uCi0KLUFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfdGl0bGU9QWRkIEF0dHJpYnV0ZQotQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19hdHRyaWJ1dGVMYWJlbD1BdHRyaWJ1dGU6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX21hcHBpbmdMYWJlbD1NYXAgYXM6Ci1BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBtYXBwaW5nIHR5cGUKLQotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlPUFkZCBDbGFzcwotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTGFiZWw9Q2xhc3M6Ci1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfdGl0bGU9UGVyc2lzdGVudCBDbGFzcyBTZWxlY3Rpb24KLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ19tZXNzYWdlPUNob29zZSBhIGNsYXNzOgotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX21hcHBpbmdMYWJlbD1NYXAgYXM6Ci1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbm9DbGFzc0Vycm9yPVlvdSBtdXN0IHNwZWNpZnkgYSBjbGFzcwotQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2R1cGxpY2F0ZUNsYXNzV2FybmluZz1GaWxlIGFscmVhZHkgY29udGFpbnMgdGhhdCBwZXJzaXN0ZW50IGNsYXNzCi1BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NOb3RGb3VuZFdhcm5pbmc9Q2Fubm90IHJlc29sdmUgY2xhc3MKLUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19ub01hcHBpbmdLZXlFcnJvcj1Zb3UgbXVzdCBzcGVjaWZ5IGEgbWFwcGluZyB0eXBlCi0KLWNvbnZlcnRUb0pwYV9jb252ZXJ0aW5nUHJvamVjdD0iQ29udmVydGluZyBwcm9qZWN0IHRvIGZhY2V0ZWQgZm9ybS4uLiIKLWNvbnZlcnRUb0pwYV9kZXRlY3RpbmdUZWNobm9sb2dpZXM9IkRldGVjdGluZyBleGlzdGluZyB0ZWNobm9sb2dpZXMuLi4iCi0KLURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV90aXRsZT1EYXRhYmFzZSBTY2hlbWEKLURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9kZXNjPVNlbGVjdCBhIGRhdGFiYXNlIHNjaGVtYQotRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYVNldHRpbmdzPVNjaGVtYSBzZXR0aW5ncwotRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25Ub1Byb2plY3Q9PGE+QWRkIGEgY29ubmVjdGlvbiB0byBKUEEgcHJvamVjdC4uLjwvYT4KLURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9jb25uZWN0TGluaz08YT5Db25uZWN0PC9hPgotRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX3NjaGVtYT1TY2hlbWE6Ci1EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfY29ubmVjdGlvbkluZm89KE5vdGU6IEpQQSBwcm9qZWN0IG11c3QgaGF2ZSBhIGNvbm5lY3Rpb24gYW5kIGl0IG11c3QgYmUgYWN0aXZlIHRvIHNlbGVjdCBhIHNjaGVtYSkKLURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9zY2hlbWFJbmZvPShOb3RlOiBNdXN0IGhhdmUgYWN0aXZlIGNvbm5lY3Rpb24gdG8gc2VsZWN0IHNjaGVtYSkKLQotRXJyb3Jfb3BlbmluZ0VkaXRvcj1FcnJvciBPcGVuaW5nIEVkaXRvcgotCi1HZW5lcmFsX2Jyb3dzZT1CciZvd3NlLi4uCi1HZW5lcmFsX3JldmVydD1SZXZlcnQKLUdlbmVyYWxfZGVzZWxlY3RBbGw9RGVzZWxlY3QgQWxsCi1HZW5lcmFsX3NlbGVjdEFsbD1TZWxlY3QgQWxsCi1HZW5lcmFsX3JlZnJlc2g9UmVmcmVzaCBUYWJsZXMKLQotR2VuZXJhdGVERExXaXphcmRfdGl0bGU9R2VuZXJhdGUgVGFibGVzIGZyb20gRW50aXRpZXMKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzPUdlbmVyYXRlIEVudGl0aWVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9jaG9vc2VFbnRpdHlUYWJsZT1DaG9vc2UgdGFibGVzIHRvIGdlbmVyYXRlIGVudGl0aWVzIGZyb20uCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9nZW5lcmF0ZUVudGl0aWVzPUdlbmVyYXRlIEVudGl0aWVzIGZyb20gVGFibGVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9zeW5jaHJvbml6ZUNsYXNzZXM9U3luY2hyb25pemUgY2xhc3NlcyBpbiBwZXJzaXN0ZW5jZS54bWwKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX3RhYmxlcz1UYWJsZXM6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV90YWJsZUNvbHVtbj1UYWJsZQotR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZW50aXR5TmFtZUNvbHVtbj1FbnRpdHkgTmFtZQotCi1FbnRpdGllc0dlbmVyYXRvcl9qb2JOYW1lPUdlbmVyYXRpbmcgRW50aXRpZXMKLQotR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRpdGxlPUdlbmVyYXRlIFRhYmxlcyBmcm9tIEVudGl0aWVzCi1HZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGV4dD1HZW5lcmF0ZSBUYWJsZXMgZnJvbSBFbnRpdGllcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBHZW5lcmljIFBsYXRmb3JtCi0KLUpwYUNvbnRlbnRfbGFiZWw9SlBBIENvbnRlbnQKLQotSnBhU3RydWN0dXJlVmlld19zdHJ1Y3R1cmVOb3RBdmFpbGFibGU9SlBBIHN0cnVjdHVyZSBpcyBub3QgYXZhaWxhYmxlLgotSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvclRleHQ9TGluayB3aXRoIEVkaXRvcgotSnBhU3RydWN0dXJlVmlld19saW5rV2l0aEVkaXRvckRlc2M9TGluayB3aXRoIEFjdGl2ZSBFZGl0b3IKLUpwYVN0cnVjdHVyZVZpZXdfbGlua1dpdGhFZGl0b3JUb29sdGlwPUxpbmsgd2l0aCBFZGl0b3IKLUpwYVN0cnVjdHVyZVZpZXdfbnVtSXRlbXNTZWxlY3RlZD17MH0gaXRlbXMgc2VsZWN0ZWQKLQotSnBhRGV0YWlsc1ZpZXdfdmlld05vdEF2YWlsYWJsZT1EZXRhaWxzIGFyZSBub3QgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0KLUpwYUZhY2V0V2l6YXJkUGFnZV90aXRsZT1KUEEgRmFjZXQKLUpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbj1Db25maWd1cmUgSlBBIHNldHRpbmdzLgotSnBhRmFjZXRXaXphcmRQYWdlX3BsYXRmb3JtTGFiZWw9JlBsYXRmb3JtCi1KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsPSZDb25uZWN0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbms9PGE+QWRkIGNvbm5lY3Rpb24uLi48L2E+Ci1KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdExpbms9PGE+Q29ubmVjdDwvYT4KLUpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0ZWRUZXh0PTxhPkNvbm5lY3RlZDwvYT4KLUpwYUZhY2V0V2l6YXJkUGFnZV9hZGREcml2ZXJMaWJyYXJ5TGFiZWw9JkFkZCBkcml2ZXIgbGlicmFyeSB0byBidWlsZCBwYXRoCi1KcGFGYWNldFdpemFyZFBhZ2VfZHJpdmVyTGlicmFyeUxhYmVsPSZEcml2ZXI6Ci1KcGFGYWNldFdpemFyZFBhZ2Vfb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0xhYmVsPSZPdmVycmlkZSBkZWZhdWx0IGNhdGFsb2cgZnJvbSBjb25uZWN0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdENhdGFsb2dMYWJlbD1DYXRhbG8mZzoKLUpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRTY2hlbWFMYWJlbD1PJnZlcnJpZGUgZGVmYXVsdCBzY2hlbWEgZnJvbSBjb25uZWN0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdFNjaGVtYUxhYmVsPSZTY2hlbWE6Ci1KcGFGYWNldFdpemFyZFBhZ2VfZmFjZXRzUGFnZUxpbms9PGE+Q2hhbmdlIEpQQSB2ZXJzaW9uLi4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX2pwYUltcGxlbWVudGF0aW9uTGFiZWw9SlBBIGltcGxlbWVudGF0aW9uCi1KcGFGYWNldFdpemFyZFBhZ2VfdXNlclNlcnZlckxpYkxhYmVsPUltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHNlcnZlciBydW50aW1lCi1KcGFGYWNldFdpemFyZFBhZ2Vfc3BlY2lmeUxpYkxhYmVsPUltcGxlbWVudGF0aW9uIGxpYnJhcnk6Ci1KcGFGYWNldFdpemFyZFBhZ2VfanBhUHJlZnNMaW5rPTxhPkNvbmZpZ3VyZSBkZWZhdWx0IEpQQSBpbXBsZW1lbnRhdGlvbiBsaWJyYXJ5Li4uPC9hPgotSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJMaWJzTGluaz08YT5Db25maWd1cmUgdXNlciBsaWJyYXJpZXMuLi48L2E+Ci1KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsPVBlcnNpc3RlbnQgY2xhc3MgbWFuYWdlbWVudAotSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbj1EaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBhJnV0b21hdGljYWxseQotSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uPUFubm90YXRlZCBjbGFzc2VzIG11c3QgYmUgJmxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwKLUpwYUZhY2V0V2l6YXJkUGFnZV9jcmVhdGVPcm1YbWxCdXR0b249Q3JlYXRlICZtYXBwaW5nIGZpbGUgKG9ybS54bWwpCi1KcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsTGFiZWw9Q2Fub25pY2FsIG1ldGFtb2RlbCAoSlBBIDIuMCkKLUpwYUZhY2V0V2l6YXJkUGFnZV9tZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rPTxhPlNvdXJjZSBmb2wmZGVyOjwvYT4KLUpwYUZhY2V0V2l6YXJkUGFnZV9ub25lPTxOb25lPgotCi1KcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWxfaW5jbHVkZUxpYnJhcmllcz0mSW5jbHVkZSBsaWJyYXJpZXMgd2l0aCB0aGlzIGFwcGxpY2F0aW9uCi0KLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV90aXRsZT1NYWtlIFBlcnNpc3RlbnQKLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tZXNzYWdlPU1ha2UgdGhlIHNlbGVjdGVkIEphdmEgY2xhc3NlcyBwZXJzaXN0ZW50IGJ5IHNlbGVjdGluZyBKYXZhIGFubm90YXRpb25zIG9yIG1hcHBpbmcgZmlsZQotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX2Fubm90YXRlSW5KYXZhUmFkaW9CdXR0b249QW5ub3RhdGUgaW4gJkphdmEKLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZVJhZGlvQnV0dG9uPUFkZCB0byAmWE1MIG1hcHBpbmcgZmlsZQotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlTGluaz08YT4mTWFwcGluZyBmaWxlOjwvYT4KLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZUJyb3dzZUJ1dHRvbj1CJnJvd3NlLi4uCi1KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfdHlwZVRhYmxlQ29sdW1uPVR5cGUKLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nVGFibGVDb2x1bW49TWFwcGluZwotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX2xpc3RJblBlcnNpc3RlbmNlWG1sQ2hlY2tCb3g9Jkxpc3QgaW4gcGVyc2lzdGVuY2UueG1sCi1KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2Vfc2VsZWN0ZWRUeXBlc1BlcnNpc3RlbnRFcnJvcj1BbGwgc2VsZWN0ZWQgdHlwZXMgYXJlIGFscmVhZHkgcGVyc2lzdGVudAotSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlRG9lc05vdEV4aXN0RXJyb3I9VGhlIFhNTCBtYXBwaW5nIGZpbGUgZG9lcyBub3QgZXhpc3QKLUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZU5vdExpc3RlZEluUGVyc2lzdGVuY2VYbWxFcnJvcj1UaGUgWE1MIG1hcHBpbmcgZmlsZSBpcyBub3QgbGlzdGVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQotSnB0UHJlZmVyZW5jZXNQYWdlX0RvTm90U2hvd0RpYWxvZ3M9RGlhbG9ncwotSnB0UHJlZmVyZW5jZXNQYWdlX0RvTm90U2hvd1RleHQ9Q2xlYXIgYWxsICdkbyBub3Qgc2hvdyBhZ2Fpbicgc2V0dGluZ3MgYW5kIHNob3cgYWxsIGhpZGRlbiBkaWFsb2dzIGFnYWluLgotSnB0UHJlZmVyZW5jZXNQYWdlX0NsZWFyQnV0dG9uVGV4dD0mQ2xlYXIKLQotSnBhUHJlZmVyZW5jZXNQYWdlX2Rlc2NyaXB0aW9uPUdlbmVyYWwgc2V0dGluZ3MgZm9yIEpQQSBkZXZlbG9wbWVudDoKLUpwYVByZWZlcmVuY2VzUGFnZV9qcHFsRWRpdG9yPUpQUUwgRWRpdGluZwotSnBhUHJlZmVyZW5jZXNQYWdlX2pwcWxFZGl0b3JfZGVzY3JpcHRpb249U3BlY2lmeSB0aGUgY2FzZSBmb3IgSlBRTCBpZGVudGlmaWVycyB1c2VkIHdpdGggY29udGVudCBhc3Npc3QuCi1KcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9sb3dlckNhc2VSYWRpb0J1dHRvbj0mTG93ZXJjYXNlCi1KcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9tYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZVJhZGlvQnV0dG9uPSZNYXRjaCBDYXNlIG9mIEZpcnN0IENoYXJhY3RlcgotSnBhUHJlZmVyZW5jZXNQYWdlX2pwcWxFZGl0b3JfdXBwZXJDYXNlUmFkaW9CdXR0b249JlVwcGVyY2FzZQotCi1KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRGVzY3JpcHRpb249U2VsZWN0IHRoZSBzZXZlcml0eSBsZXZlbCBmb3IgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBKYXZhIFBlcnNpc3RlbmNlIHZhbGlkYXRpb24gcHJvYmxlbXM6Ci1KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRXJyb3I9RXJyb3IKLUpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9JZ25vcmU9SWdub3JlCi1KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfSW5mbz1JbmZvCi1KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfV2FybmluZz1XYXJuaW5nCi0KLUpwcWxDb250ZW50UHJvcG9zYWxQcm92aWRlcl9EZXNjcmlwdGlvbj1Db250ZW50IEFzc2lzdCBBdmFpbGFibGUgKHswfSkKLUpwYUpwcWxKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJfRXJyb3I9Q2FuJ3QgcmV0cmlldmUgSlBRTCBwcm9wb3NhbHMgZHVlIHRvIGFuIGludGVybmFsIGVycm9yLgotSnBhSnBxbFNzZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyX0Vycm9yPUNhbid0IHJldHJpZXZlIEpQUUwgcHJvcG9zYWxzIGR1ZSB0byBhbiBpbnRlcm5hbCBlcnJvci4KLQotTWFwcGluZ0ZpbGVXaXphcmRfdGl0bGU9TmV3IE1hcHBpbmcgRmlsZQotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX25ld0ZpbGVfdGl0bGU9TWFwcGluZyBmaWxlCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV9kZXNjPVNwZWNpZnkgbWFwcGluZyBmaWxlIG5hbWUgYW5kIGxvY2F0aW9uCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2Vfb3B0aW9uc190aXRsZT1NYXBwaW5nIGZpbGUKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9vcHRpb25zX2Rlc2M9U3BlY2lmeSBtYXBwaW5nIGZpbGUgb3B0aW9ucwotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3Byb2plY3RMYWJlbD0mUHJvamVjdDoKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9zb3VyY2VGb2xkZXJMYWJlbD1Tb3VyY2UgZm9sJmRlcjoKLU1hcHBpbmdGaWxlV2l6YXJkUGFnZV9maWxlUGF0aExhYmVsPUZpbGUgcGF0Jmg6Ci1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWNjZXNzTGFiZWw9RGVmYXVsdCBhJmNjZXNzOgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uPSZBZGQgdG8gcGVyc2lzdGVuY2UgdW5pdAotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3BlcnNpc3RlbmNlVW5pdExhYmVsPVBlcnNpc3RlbmNlICZ1bml0OgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2luY29ycmVjdFNvdXJjZUZvbGRlckVycm9yPVNlbGVjdGlvbiBtdXN0IGJlIGEgdmFsaWQgc291cmNlIGZvbGRlcgotTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsX3NvdXJjZUZvbGRlckRpYWxvZ1RpdGxlPVNvdXJjZSBGb2xkZXIgU2VsZWN0aW9uCi1NYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWNjZXNzTGFiZWxfc291cmNlRm9sZGVyRGlhbG9nRGVzYz1DaG9vc2UgYSBzb3VyY2UgZm9sZGVyOgotCi1KcGFQcm9qZWN0V2l6YXJkX3RpdGxlPU5ldyBKUEEgUHJvamVjdAotTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU9SlBBIFByb2plY3QKLU5ld0pwYVByb2plY3RXaXphcmRfZmlyc3RQYWdlX2Rlc2NyaXB0aW9uPUNvbmZpZ3VyZSBKUEEgcHJvamVjdCBzZXR0aW5ncy4KLQotT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X2VudGl0eU1hcHBpbmdzTGFiZWw9RW50aXR5IE1hcHBpbmdzCi0KLVBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWw9UGVyc2lzdGVuY2UKLQotT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RpdGxlPU92ZXJ3cml0ZSBFeGlzdGluZyBDbGFzcwotT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQ9T3ZlcndyaXRlIHNvdXJjZSBjb2RlIGZvciB0aGUgY2xhc3MgJyd7MH0nJz8KLQotU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2dfbmV3QnV0dG9uPU5ldy4uLgotU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2dfdG9vbFRpcD1DcmVhdGUgYSBuZXcgbWFwcGluZyBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMGUxN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZGV0YWlscy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1Qcm92aWRlckRlZmF1bHQ9RGVmYXVsdCAoPFByb3ZpZGVyLVNwZWNpZmljPikKLU5vTmFtZVNldD08Tm8gbmFtZSBzZXQ+Ci0KLU1hcEFzQ29tcG9zaXRlX2NoYW5nZU1hcHBpbmdUeXBlPWhlcmUKLU1hcEFzQ29tcG9zaXRlX2RlZmF1bHQ9RGVmYXVsdAotTWFwQXNDb21wb3NpdGVfZGlhbG9nVGl0bGU9TWFwcGluZyBUeXBlIFNlbGVjdGlvbgotTWFwQXNDb21wb3NpdGVfbGFiZWxUZXh0PSZFbnRlciBtYXBwaW5nIHR5cGUgb3IgcGF0dGVybiAoKiwgPywgb3IgY2FtZWwgY2FzZSk6Ci1NYXBBc0NvbXBvc2l0ZV9tYXBwZWRBdHRyaWJ1dGVUZXh0PUF0dHJpYnV0ZSAnJ3swfScnIGlzIG1hcHBlZCBhcyB7MX0uCi1NYXBBc0NvbXBvc2l0ZV9tYXBwZWRUeXBlVGV4dD1UeXBlICcnezB9JycgaXMgbWFwcGVkIGFzIHsxfS4KLU1hcEFzQ29tcG9zaXRlX3VubWFwcGVkQXR0cmlidXRlVGV4dD1BdHRyaWJ1dGUgJyd7MH0nJyBpcyBub3QgbWFwcGVkLCBjbGljayBoZXJlIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlLgotTWFwQXNDb21wb3NpdGVfdW5tYXBwZWRUeXBlVGV4dD1UeXBlICcnezB9JycgaXMgbm90IG1hcHBlZCwgY2xpY2sgaGVyZSB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZS4KLU1hcEFzQ29tcG9zaXRlX3ZpcnR1YWxBdHRyaWJ1dGVUZXh0PUF0dHJpYnV0ZSAnJ3swfScnIGlzIG5vdCBtYXBwZWQuCi0KLUJhc2ljU2VjdGlvbl90aXRsZT1CYXNpYwotRW1iZWRkZWRTZWN0aW9uX3RpdGxlPUVtYmVkZGVkCi1FbWJlZGRlZElkU2VjdGlvbl90aXRsZT1FbWJlZGRlZCBJRAotRW1iZWRkYWJsZVNlY3Rpb25fdGl0bGU9RW1iZWRkYWJsZQotRW50aXR5U2VjdGlvbl90aXRsZT1FbnRpdHkKLUlkU2VjdGlvbl90aXRsZT1JRAotTWFueVRvTWFueVNlY3Rpb25fdGl0bGU9TWFueSB0byBNYW55Ci1NYW55VG9PbmVTZWN0aW9uX3RpdGxlPU1hbnkgdG8gT25lCi1NYXBwZWRTdXBlcmNsYXNzU2VjdGlvbl90aXRsZT1NYXBwZWQgU3VwZXJjbGFzcwotT25lVG9NYW55U2VjdGlvbl90aXRsZT1PbmUgdG8gTWFueQotT25lVG9PbmVTZWN0aW9uX3RpdGxlPU9uZSB0byBPbmUKLVZlcnNpb25TZWN0aW9uX3RpdGxlPVZlcnNpb24KLQotQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1CYXNpYwotRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1FbWJlZGRlZAotRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPUVtYmVkZGVkIElECi1JZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPUlECi1PbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1PbmUgdG8gTWFueQotT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1PbmUgdG8gT25lCi1NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9TWFueSB0byBNYW55Ci1NYW55VG9PbmVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1NYW55IHRvIE9uZQotVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VHJhbnNpZW50Ci1WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VmVyc2lvbgotQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9YmFzaWMKLUVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWVtYmVkZGVkCi1FbWJlZGRlZElkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPWVtYmVkZGVkIElECi1JZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1JRAotT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPW9uZSB0byBtYW55Ci1PbmVUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1vbmUgdG8gb25lCi1NYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPW1hbnkgdG8gbWFueQotTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPW1hbnkgdG8gb25lCi1UcmFuc2llbnRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9dHJhbnNpZW50Ci1WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsPXZlcnNpb24KLQotRGVmYXVsdEJhc2ljTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9RGVmYXVsdCAoQmFzaWMpCi1EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbD1EZWZhdWx0IChFbWJlZGRlZCkKLURlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1kZWZhdWx0IChiYXNpYykKLURlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbD1kZWZhdWx0IChlbWJlZGRlZCkKLQotRW1iZWRkYWJsZVVpUHJvdmlkZXJfbGFiZWw9RW1iZWRkYWJsZQotRW50aXR5VWlQcm92aWRlcl9sYWJlbD1FbnRpdHkKLU1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xhYmVsPU1hcHBlZCBTdXBlcmNsYXNzCi1OdWxsVHlwZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsPVVubWFwcGVkCi0KLUVtYmVkZGFibGVVaVByb3ZpZGVyX2xpbmtMYWJlbD1lbWJlZGRhYmxlCi1FbnRpdHlVaVByb3ZpZGVyX2xpbmtMYWJlbD1lbnRpdHkKLU1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xpbmtMYWJlbD1tYXBwZWQgc3VwZXJjbGFzcwotCi0KLUFkZFF1ZXJ5RGlhbG9nX3RpdGxlPUFkZCBRdWVyeQotQWRkUXVlcnlEaWFsb2dfZGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IHF1ZXJ5Ci1BZGRRdWVyeURpYWxvZ19uYW1lZFF1ZXJ5PU5hbWVkIFF1ZXJ5Ci1BZGRRdWVyeURpYWxvZ19uYW1lZE5hdGl2ZVF1ZXJ5PSBOYW1lZCBOYXRpdmUgUXVlcnkKLUFkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBxdWVyeSBzZXR0aW5nIGJvdGggdGhlICduYW1lJyBhbmQgdGhlICd0eXBlJyAKLUFkZFF1ZXJ5RGlhbG9nX25hbWVFeGlzdHM9VGhlIGdpdmVuIG5hbWUgZXhpc3RzLiBUaGlzIHF1ZXJ5IG1heSBiZSBvdmVycmlkZGVuIGJ5IG9yIG92ZXJyaWRlIHRoZSBvbmUocykgd2l0aCB0aGUgc2FtZSBuYW1lLgotUXVlcnlTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkPUEgbmFtZSBtdXN0IGJlIHNwZWNpZmllZC4KLVF1ZXJ5U3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZD1BIHF1ZXJ5IHR5cGUgbXVzdCBiZSBzcGVjaWZpZWQKLUFkZFF1ZXJ5RGlhbG9nX25hbWU9TmFtZToKLUFkZFF1ZXJ5RGlhbG9nX3F1ZXJ5VHlwZT1UeXBlOgotTmFtZWRRdWVyeUNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsPU5hbWU6Ci0KLUVudGl0eUNvbXBvc2l0ZV9pbmhlcml0YW5jZT1Jbmhlcml0YW5jZQotRW50aXR5Q29tcG9zaXRlX3F1ZXJpZXM9UXVlcmllcwotRW50aXR5Q29tcG9zaXRlX3RhYmxlRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi1FbnRpdHlDb21wb3NpdGVfdGFibGVOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdCAoKQotCi1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlX3F1ZXJpZXM9UXVlcmllcwotCi1FbnRpdHlHZW5lcmFsU2VjdGlvbl9uYW1lPU5hbWU6Ci0KLUVudGl0eU5hbWVDb21wb3NpdGVfbmFtZT1OYW1lOgotCi1CYXNpY0dlbmVyYWxTZWN0aW9uX25hbWU9TmFtZToKLUJhc2ljR2VuZXJhbFNlY3Rpb25fbmFtZURlZmF1bHQ9RGVmYXVsdCAoezB9KQotQmFzaWNHZW5lcmFsU2VjdGlvbl9mZXRjaExhYmVsPUZldGNoOgotQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsPU9wdGlvbmFsCi1CYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWxEZWZhdWx0PU9wdGlvbmFsICh7MH0pCi1CYXNpY0dlbmVyYWxTZWN0aW9uX2xvYkxhYmVsPUxvYgotQmFzaWNHZW5lcmFsU2VjdGlvbl90ZW1wb3JhbExhYmVsPVRlbXBvcmFsOgotQmFzaWNHZW5lcmFsU2VjdGlvbl9lbnVtZXJhdGVkTGFiZWw9RW51bWVyYXRlZDoKLVR5cGVTZWN0aW9uX3R5cGU9VHlwZQotVHlwZVNlY3Rpb25fZGVmYXVsdD1EZWZhdWx0Ci1UeXBlU2VjdGlvbl9sb2I9TG9iCi1UeXBlU2VjdGlvbl90ZW1wb3JhbD1UZW1wb3JhbDoKLVR5cGVTZWN0aW9uX2VudW1lcmF0ZWQ9RW51bWVyYXRlZDoKLQotVGFibGVDaG9vc2VyX2xhYmVsPU5hbWU6Ci1DYXRhbG9nQ2hvb3Nlcl9sYWJlbD1DYXRhbG9nOgotU2NoZW1hQ2hvb3Nlcl9sYWJlbD1TY2hlbWE6Ci1UYWJsZUNvbXBvc2l0ZV90YWJsZVNlY3Rpb249VGFibGUKLQotVGFyZ2V0RW50aXR5Q2hvb3Nlcl9sYWJlbD1UYXJnZXQgZW50aXR5OgotVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2U9QnJvd3NlLi4uCi1UYXJnZXRFbnRpdHlDaG9vc2VyX3NlbGVjdFR5cGVUaXRsZT1TZWxlY3QgVHlwZQotCi1JZENsYXNzQ29tcG9zaXRlX2xhYmVsPUlEIGNsYXNzOgotCi1Kb2luaW5nX3RpdGxlPUpvaW5pbmcgU3RyYXRlZ3kKLUpvaW5pbmdfbWFwcGVkQnlMYWJlbD1NYXBwZWQgYnkKLUpvaW5pbmdfbWFwcGVkQnlBdHRyaWJ1dGVMYWJlbD1BdHRyaWJ1dGU6Ci1Kb2luaW5nX2pvaW5Db2x1bW5Kb2luaW5nTGFiZWw9Sm9pbiBjb2x1bW5zCi1Kb2luaW5nX3ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ0xhYmVsPVByaW1hcnkga2V5IGpvaW4gY29sdW1ucwotSm9pbmluZ19qb2luVGFibGVKb2luaW5nTGFiZWw9Sm9pbiB0YWJsZQotCi1Kb2luVGFibGVDb21wb3NpdGVfaW52ZXJzZUpvaW5Db2x1bW49SW52ZXJzZSBqb2luIGNvbHVtbnMKLUpvaW5UYWJsZUNvbXBvc2l0ZV9qb2luQ29sdW1uPUpvaW4gY29sdW1ucwotSm9pblRhYmxlQ29tcG9zaXRlX25hbWU9TmFtZToKLUpvaW5UYWJsZUNvbXBvc2l0ZV9zY2hlbWE9U2NoZW1hOgotSm9pblRhYmxlQ29tcG9zaXRlX2NhdGFsb2c9Q2F0YWxvZzoKLUpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1ucz1PdmVycmlkZSBkZWZhdWx0Ci1Kb2luVGFibGVDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zPU92ZXJyaWRlIGRlZmF1bHQKLQotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2dlbmVyYWw9R2VuZXJhbAotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2pvaW5UYWJsZT1Kb2luIFRhYmxlCi1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfdGFyZ2V0RW50aXR5PVRhcmdldCBlbnRpdHk6Ci1NdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfY2FzY2FkZVR5cGU9Q2FzY2FkZSB0eXBlOgotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2ZldGNoVHlwZT1GZXRjaCB0eXBlOgotTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX21hcHBlZEJ5PU1hcHBlZCBieToKLQotQ29sdW1uQ29tcG9zaXRlX2NvbHVtbkRlZmluaXRpb249Q29sdW1uIGRlZmluaXRpb246Ci1Db2x1bW5Db21wb3NpdGVfY29sdW1uU2VjdGlvbj1Db2x1bW4KLUNvbHVtbkNvbXBvc2l0ZV9kZXRhaWxzPURldGFpbHMKLUNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlPUluc2VydGFibGUKLUNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQ9SW5zZXJ0YWJsZSAoezB9KQotQ29sdW1uQ29tcG9zaXRlX2xlbmd0aD1MZW5ndGg6Ci1Db2x1bW5Db21wb3NpdGVfbmFtZT1OYW1lOgotQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlPU51bGxhYmxlCi1Db2x1bW5Db21wb3NpdGVfbnVsbGFibGVXaXRoRGVmYXVsdD1OdWxsYWJsZSAoezB9KQotQ29sdW1uQ29tcG9zaXRlX3ByZWNpc2lvbj1QcmVjaXNpb246Ci1Db2x1bW5Db21wb3NpdGVfc2NhbGU9U2NhbGU6Ci1Db2x1bW5Db21wb3NpdGVfdGFibGU9VGFibGU6Ci1Db2x1bW5Db21wb3NpdGVfdW5pcXVlPVVuaXF1ZQotQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZVdpdGhEZWZhdWx0PVVuaXF1ZSAoezB9KQotQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZT1VcGRhdGFibGUKLUNvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGVXaXRoRGVmYXVsdD1VcGRhdGFibGUgKHswfSkKLQotSm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi1Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcz17MH0gLT4gezF9Ci1Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ9RGVmYXVsdCAoezB9IC0+IHsxfSkKLUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ9RGVmYXVsdCAoezB9KSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0ZpcnN0RGVmYXVsdD1EZWZhdWx0ICh7MH0pIC0+IHsxfQotSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0PXswfSAtPiBEZWZhdWx0ICh7MX0pCi1Kb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1ucz1PdmVycmlkZSBkZWZhdWx0Ci0KLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnM9T3ZlcnJpZGUgZGVmYXVsdAotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ9RWRpdC4uLgotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3ByaW1hcnlLZXlKb2luQ29sdW1uPVByaW1hcnkga2V5IGpvaW4gY29sdW1ucwotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zPXswfSAtPiB7MX0KLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQ9RGVmYXVsdCAoezB9IC0+IHsxfSkKLVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gRGVmYXVsdCAoezF9KQotUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0PURlZmF1bHQgKHswfSkgLT4gezF9Ci1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNTZWNEZWZhdWx0PXswfSAtPiBEZWZhdWx0ICh7MX0pCi0KLUpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIE5ldyBKb2luIENvbHVtbgotSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU9QWRkIEpvaW4gQ29sdW1uCi1Kb2luQ29sdW1uRGlhbG9nX2Rlc2NyaXB0aW9uPVNwZWNpZnkgYSBtYXBwZWQgY29sdW1uIGZvciBqb2luaW5nIGFuIGVudGl0eSBhc3NvY2lhdGlvbi4KLUpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlPUVkaXQgSm9pbiBDb2x1bW4KLUpvaW5Db2x1bW5EaWFsb2dfZWRpdEpvaW5Db2x1bW5UaXRsZT1FZGl0IEpvaW4gQ29sdW1uCi1Kb2luQ29sdW1uRGlhbG9nX25hbWU9Jk5hbWU6Ci1Kb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lPSZSZWZlcmVuY2VkIGNvbHVtbiBuYW1lOgotCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV9jb2x1bW5EZWZpbml0aW9uPSZDb2x1bW4gZGVmaW5pdGlvbjoKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGU9Jkluc2VydGFibGUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGVXaXRoRGVmYXVsdD0mSW5zZXJ0YWJsZSAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGU9Jk51bGxhYmxlCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZVdpdGhEZWZhdWx0PSZOdWxsYWJsZSAoezB9KQotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdGFibGU9JlRhYmxlOgotSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlPSZVbmlxdWUKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZVdpdGhEZWZhdWx0PSZVbmlxdWUgKHswfSkKLUpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZT0mVXBkYXRhYmxlCi1Kb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGVXaXRoRGVmYXVsdD0mVXBkYXRhYmxlICh7MH0pCi0KLUludmVyc2VKb2luQ29sdW1uRGlhbG9nX2VkaXRJbnZlcnNlSm9pbkNvbHVtblRpdGxlPUVkaXQgSW52ZXJzZSBKb2luIENvbHVtbgotCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfYWRkRGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgTmV3IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfYWRkVGl0bGU9QWRkIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU9RWRpdCBQcmltYXJ5IEtleSBKb2luIENvbHVtbgotUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRUaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi0KLVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU9Q3JlYXRlIE5ldyBQcmltYXJ5IEtleSBKb2luIENvbHVtbgotUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkVGl0bGU9QWRkIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0RGVzY3JpcHRpb25UaXRsZT1FZGl0IFByaW1hcnkgS2V5IEpvaW4gQ29sdW1uCi1QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ19lZGl0VGl0bGU9RWRpdCBQcmltYXJ5IEtleSBKb2luIENvbHVtbgotCi1PdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbj1BdHRyaWJ1dGUgT3ZlcnJpZGVzCi1PdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXA9QXR0cmlidXRlIG92ZXJyaWRlcwotT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdD1PdmVycmlkZSBkZWZhdWx0Ci0KLU92ZXJyaWRlc0NvbXBvc2l0ZV9hc3NvY2lhdGlvbj1Bc3NvY2lhdGlvbiBPdmVycmlkZQotT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZT1BdHRyaWJ1dGUgT3ZlcnJpZGUKLU92ZXJyaWRlc0NvbXBvc2l0ZV9ub05hbWU9PE5hbWUgbm90IHNldD4KLUFzc29jaWF0aW9uT3ZlcnJpZGVzQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBjb2x1bW5zCi0KLUluaGVyaXRhbmNlQ29tcG9zaXRlX2RldGFpbHNHcm91cEJveD1EZXRhaWxzCi1Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yQ29sdW1uR3JvdXBCb3g9RGlzY3JpbWluYXRvciBjb2x1bW4KLUluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JWYWx1ZT1EaXNjcmltaW5hdG9yIHZhbHVlOgotQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV9qb2luZWQ9Sm9pbmVkCi1BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX3NpbmdsZV90YWJsZT1TaW5nbGUgVGFibGUKLUluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5PVN0cmF0ZWd5OgotQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV90YWJsZV9wZXJfY2xhc3M9VGFibGUgcGVyIENsYXNzCi0KLURpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGlzY3JpbWluYXRvclR5cGU9VHlwZToKLURpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZT1OYW1lOgotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9jaGFyPUNoYXJhY3RlcgotRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9pbnRlZ2VyPUludGVnZXIKLURpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfc3RyaW5nPVN0cmluZwotCi1HZW5lcmF0b3JzQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3g9U2VxdWVuY2UgZ2VuZXJhdG9yCi1HZW5lcmF0b3JzQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yU2VjdGlvbj1TZXF1ZW5jZSBHZW5lcmF0b3IKLUdlbmVyYXRvcnNDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JDaGVja0JveD1UYWJsZSBnZW5lcmF0b3IKLUdlbmVyYXRvcnNDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JTZWN0aW9uPVRhYmxlIEdlbmVyYXRvcgotCi1JZE1hcHBpbmdDb21wb3NpdGVfcGtfZ2VuZXJhdGlvbj1QSyBHZW5lcmF0aW9uCi1JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveD1QcmltYXJ5IGtleSBnZW5lcmF0aW9uCi1JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25TZWN0aW9uPVByaW1hcnkgS2V5IEdlbmVyYXRpb24KLUlkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvckNoZWNrQm94PVRhYmxlIGdlbmVyYXRvcgotSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yU2VjdGlvbj1UYWJsZSBHZW5lcmF0b3IKLUlkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94PVNlcXVlbmNlIGdlbmVyYXRvcgotSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yU2VjdGlvbj1TZXF1ZW5jZSBHZW5lcmF0b3IKLQotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfZ2VuZXJhdGVkVmFsdWU9R2VuZXJhdGVkIFZhbHVlCi1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lPUdlbmVyYXRvciBuYW1lOgotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc3RyYXRlZ3k9U3RyYXRlZ3k6Ci1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9hdXRvPUF1dG8KLUdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2lkZW50aXR5PUlkZW50aXR5Ci1HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zZXF1ZW5jZT1TZXF1ZW5jZQotR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfdGFibGU9VGFibGUKLQotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdD1EZWZhdWx0Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zY2hlbWE9U2NoZW1hOgotU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2VxdWVuY2U9U2VxdWVuY2U6Ci1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvcj1TZXF1ZW5jZSBHZW5lcmF0b3IKLQotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfZGVmYXVsdD1EZWZhdWx0Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9uYW1lPU5hbWU6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtbj1QcmltYXJ5IGtleSBjb2x1bW46Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9wa0NvbHVtblZhbHVlPVByaW1hcnkga2V5IGNvbHVtbiB2YWx1ZToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6Ci1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV90YWJsZT1UYWJsZToKLVRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yPVRhYmxlIEdlbmVyYXRvcgotVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdmFsdWVDb2x1bW49VmFsdWUgY29sdW1uOgotCi1HZW5lcmF0b3JDb21wb3NpdGVfYWxsb2NhdGlvblNpemU9QWxsb2NhdGlvbiBzaXplOgotR2VuZXJhdG9yQ29tcG9zaXRlX2luaXRpYWxWYWx1ZT1Jbml0aWFsIHZhbHVlOgotCi1PcmRlcmluZ0NvbXBvc2l0ZV9vcmRlcmluZ0dyb3VwPU9yZGVyaW5nCi1PcmRlcmluZ0NvbXBvc2l0ZV9ub25lPU5vbmUKLU9yZGVyaW5nQ29tcG9zaXRlX3ByaW1hcnlLZXk9UHJpbWFyeSBrZXkKLU9yZGVyaW5nQ29tcG9zaXRlX2N1c3RvbT1DdXN0b20KLQotU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlcz1TZWNvbmRhcnkgVGFibGVzCi1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZWRpdD1FZGl0Li4uCi0KLVNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFNlY29uZGFyeVRhYmxlPUFkZCBTZWNvbmRhcnkgVGFibGUKLVNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRTZWNvbmRhcnlUYWJsZT1FZGl0IFNlY29uZGFyeSBUYWJsZQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZT1OYW1lOgotU2Vjb25kYXJ5VGFibGVEaWFsb2dfY2F0YWxvZz1DYXRhbG9nOgotU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hPVNjaGVtYToKLVNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRTY2hlbWE9RGVmYXVsdCAoezB9KQotU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2c9RGVmYXVsdCAoezB9KQotCi1BY2Nlc3NUeXBlQ29tYm9fZGVmYXVsdD1EZWZhdWx0Ci1NZXRhRGF0YUNvbXBsZXRlQ29tYm9fRGVmYXVsdD1EZWZhdWx0ICh7MH0pCi0KLU9wdGlvbmFsQ29tcG9zaXRlX2ZhbHNlPUZhbHNlCi1PcHRpb25hbENvbXBvc2l0ZV90cnVlPVRydWUKLQotRW51bVR5cGVDb21wb3NpdGVfb3JkaW5hbD1PcmRpbmFsCi1FbnVtVHlwZUNvbXBvc2l0ZV9zdHJpbmc9U3RyaW5nCi0KLUZldGNoVHlwZUNvbXBvc2l0ZV9lYWdlcj1FYWdlcgotRmV0Y2hUeXBlQ29tcG9zaXRlX2xhenk9TGF6eQotCi1UZW1wb3JhbFR5cGVDb21wb3NpdGVfZGF0ZT1EYXRlCi1UZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZT1UaW1lCi1UZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZXN0YW1wPVRpbWVzdGFtcAotCi1DYXNjYWRlQ29tcG9zaXRlX2FsbD1BbGwKLUNhc2NhZGVDb21wb3NpdGVfY2FzY2FkZVRpdGxlPUNhc2NhZGUKLUNhc2NhZGVDb21wb3NpdGVfbWVyZ2U9TWVyZ2UKLUNhc2NhZGVDb21wb3NpdGVfcGVyc2lzdD1QZXJzaXN0Ci1DYXNjYWRlQ29tcG9zaXRlX3JlZnJlc2g9UmVmcmVzaAotQ2FzY2FkZUNvbXBvc2l0ZV9yZW1vdmU9UmVtb3ZlCi0KLVF1ZXJpZXNDb21wb3NpdGVfZGlzcGxheVN0cmluZz08TmFtZSBub3Qgc2V0PiB7MH0KLQotTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5PVF1ZXJ5OgotTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveD1RdWVyeSBoaW50cwotTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3Jlc3VsdENsYXNzPVJlc3VsdCBjbGFzczoKLQotTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5PVF1ZXJ5OgotTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveD1RdWVyeSBoaW50cwotCi1RdWVyeUhpbnRzQ29tcG9zaXRlX25hbWVDb2x1bW49TmFtZQotUXVlcnlIaW50c0NvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZQotCi1Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWw9RGVmaW5lIGluIFhNTAotCi1OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VW5tYXBwZWQKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHMyXzAucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHMyXzAucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNDhlOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzMl8wLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ2FzY2FkZVBhbmUyXzBfZGV0YWNoPURldGFjaAotCi1Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfdGl0bGU9Q29sbGVjdGlvbiBUYWJsZQotQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX2pvaW5Db2x1bW49Sm9pbiBjb2x1bW5zCi1Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfbmFtZT1OYW1lOgotQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6Ci1Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfY2F0YWxvZz1DYXRhbG9nOgotQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zPU92ZXJyaWRlIGRlZmF1bHQKLQotRGVyaXZlZElkZW50aXR5X3RpdGxlPURlcml2ZWQgSWRlbnRpdHkKLURlcml2ZWRJZGVudGl0eV9udWxsRGVyaXZlZElkZW50aXR5PU5vbmUKLURlcml2ZWRJZGVudGl0eV9pZERlcml2ZWRJZGVudGl0eT1JZAotRGVyaXZlZElkZW50aXR5X21hcHNJZERlcml2ZWRJZGVudGl0eT1NYXBzIGlkOgotRGVyaXZlZElkZW50aXR5X21hcHNJZFVuc3BlY2lmaWVkVmFsdWU9PHVuZGV0ZXJtaW5lZCB2YWx1ZT4KLQotRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xhYmVsPUVsZW1lbnQgQ29sbGVjdGlvbgotRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xpbmtMYWJlbD1lbGVtZW50IGNvbGxlY3Rpb24KLUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbl90aXRsZT1FbGVtZW50IENvbGxlY3Rpb24KLUFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX0NvbXBvc2l0ZV92YWx1ZVNlY3Rpb25UaXRsZT1WYWx1ZQotRW50aXR5X2NhY2hlYWJsZUxhYmVsPUNhY2hlYWJsZQotRW50aXR5X2NhY2hlYWJsZVdpdGhEZWZhdWx0TGFiZWw9Q2FjaGVhYmxlICh7MH0pCi0KLUVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lX2xhYmVsPUVtYmVkZGVkIElEIGlzIG1hcHBlZCBieSBhIHJlbGF0aW9uc2hpcC4KLUlkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZV9sYWJlbD1JRCBpcyBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAuCi0KLU9yZGVyaW5nQ29tcG9zaXRlX29yZGVyQ29sdW1uPU9yZGVyIGNvbHVtbgotCi1PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlX29ycGhhblJlbW92YWxMYWJlbD1PcnBoYW4gcmVtb3ZhbAotT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWxEZWZhdWx0PU9ycGhhbiByZW1vdmFsICh7MH0pCi0KLUxvY2tNb2RlQ29tcG9zaXRlX2xvY2tNb2RlTGFiZWwgPSBMb2NrIG1vZGU6Ci0KLUxvY2tNb2RlQ29tcG9zaXRlX3JlYWQgPSBSZWFkCi1Mb2NrTW9kZUNvbXBvc2l0ZV93cml0ZSA9IFdyaXRlCi1Mb2NrTW9kZUNvbXBvc2l0ZV9vcHRpbWlzdGljID0gT3B0aW1pc3RpYwotTG9ja01vZGVDb21wb3NpdGVfb3B0aW1pc3RpY19mb3JjZV9pbmNyZW1lbnQgPSBPcHRpbWlzdGljIEZvcmNlIEluY3JlbWVudAotTG9ja01vZGVDb21wb3NpdGVfcGVzc2ltaXN0aWNfcmVhZCA9IFBlc3NpbWlzdGljIFJlYWQKLUxvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX3dyaXRlID0gUGVzc2ltaXN0aWMgV3JpdGUKLUxvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX2ZvcmNlX2luY3JlbWVudCA9IFBlc3NpbWlzdGljIEZvcmNlIEluY3JlbWVudAotTG9ja01vZGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLQotVGFyZ2V0Q2xhc3NDb21wb3NpdGVfbGFiZWw9VGFyZ2V0IGNsYXNzOgotCi1BcnJheU1hcHBpbmcyXzNfbGFiZWw9QXJyYXkKLUFycmF5TWFwcGluZzJfM19saW5rTGFiZWw9YXJyYXkKLQotU3RydWN0dXJlTWFwcGluZzJfM19sYWJlbD1TdHJ1Y3R1cmUKLVN0cnVjdHVyZU1hcHBpbmcyXzNfbGlua0xhYmVsPXN0cnVjdHVyZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHNfb3JtLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9kZXRhaWxzX29ybS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzUxZTZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX2RldGFpbHNfb3JtLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotRW50aXR5TWFwcGluZ3NTZWN0aW9uX3RpdGxlPUVudGl0eSBNYXBwaW5ncwotRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9jYXRhbG9nPUNhdGFsb2c6Ci1FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX3BhY2thZ2U9UGFja2FnZToKLUVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2Vfc2NoZW1hPVNjaGVtYToKLUVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nRGVmYXVsdD1EZWZhdWx0ICh7MH0KLUVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nTm9EZWZhdWx0U3BlY2lmaWVkPURlZmF1bHQKLUVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFEZWZhdWx0PURlZmF1bHQgKHswfSkKLUVudGl0eU1hcHBpbmdzUGFnZV9zY2hlbWFOb0RlZmF1bHRTcGVjaWZpZWQ9RGVmYXVsdAotTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZV9tZXRhZGF0YUNvbXBsZXRlPU1ldGFkYXRhIGNvbXBsZXRlCi1NZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlX21ldGFkYXRhQ29tcGxldGVXaXRoRGVmYXVsdD1NZXRhZGF0YSBjb21wbGV0ZSAoezB9KQotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9kaXNwbGF5U3RyaW5nPTxOYW1lIG5vdCBzZXQ+IHswfQotT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9ncm91cEJveD1HZW5lcmF0b3JzCi1Pcm1NYXBwaW5nTmFtZUNob29zZXJfbmFtZT1OYW1lOgotT3JtSmF2YUNsYXNzQ2hvb3Nlcl9qYXZhQ2xhc3M9SmF2YSBjbGFzczoKLU9ybVF1ZXJpZXNDb21wb3NpdGVfZ3JvdXBCb3g9UXVlcmllcwotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfZGVsaW1pdGVkSWRlbnRpZmllcnNDaGVja0JveD1EZWxpbWl0ZWQgaWRlbnRpZmllcnMKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2Nhc2NhZGVQZXJzaXN0Q2hlY2tCb3g9Q2FzY2FkZSBwZXJzaXN0Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXRhbG9nPUNhdGFsb2c6Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9wZXJzaXN0ZW5jZVVuaXRTZWN0aW9uPVBlcnNpc3RlbmNlIFVuaXQKLVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3NjaGVtYT1TY2hlbWE6Ci1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV94bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94PVhNTCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlCi1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVNlY3Rpb25fY2F0YWxvZ0RlZmF1bHQ9RGVmYXVsdCAoezB9KQotUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX3NjaGVtYURlZmF1bHQ9RGVmYXVsdCAoezB9KQotCi1BZGRHZW5lcmF0b3JEaWFsb2dfbmFtZT1OYW1lOgotQWRkR2VuZXJhdG9yRGlhbG9nX2dlbmVyYXRvclR5cGU9VHlwZToKLUFkZEdlbmVyYXRvckRpYWxvZ190aXRsZT1BZGQgR2VuZXJhdG9yCi1BZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb25UaXRsZT1DcmVhdGUgbmV3IGdlbmVyYXRvcgotQWRkR2VuZXJhdG9yRGlhbG9nX2Rlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBnZW5lcmF0b3Igc2V0dGluZyBib3RoIHRoZSAnbmFtZScgYW5kIHRoZSAndHlwZScKLUFkZEdlbmVyYXRvckRpYWxvZ190YWJsZUdlbmVyYXRvcj1UYWJsZSBHZW5lcmF0b3IKLUFkZEdlbmVyYXRvckRpYWxvZ19zZXF1ZW5jZUdlbmVyYXRvcj1TZXF1ZW5jZSBHZW5lcmF0b3IKLUdlbmVyYXRvclN0YXRlT2JqZWN0X25hbWVFeGlzdHM9VGhlIGdpdmVuIG5hbWUgYWxyZWFkeSBleGlzdHMuIFRoaXMgZ2VuZXJhdG9yIG1heSBvdmVycmlkZSB0aGUgZXhpc3Rpbmcgb25lKHMpIHdpdGggdGhlIHNhbWUgbmFtZS4KLUdlbmVyYXRvclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotR2VuZXJhdG9yU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZD1BIGdlbmVyYXRvciB0eXBlIG11c3QgYmUgc3BlY2lmaWVkLgotCi0KLVVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw9VW5zdXBwb3J0ZWQKLQotVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw9dW5zdXBwb3J0ZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfZ2VuLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfZ2VuLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MmNiMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZW50aXR5X2dlbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgCi0KLWNhcmRpbmFsaXR5PUNhciZkaW5hbGl0eToKLXByb3BlcnR5PVAmcm9wZXJ0eToKLWNhc2NhZGU9JkNhc2NhZGU6Ci1jb25uZWN0aW9uPSZDb25uZWN0aW9uOgotc2NoZW1hPSZTY2hlbWE6Ci1zY2hlbWFJbmZvPShOb3RlOiBZb3UgbXVzdCBoYXZlIGFuIGFjdGl2ZSBjb25uZWN0aW9uIHRvIHNlbGVjdCBzY2hlbWEuKQotYWRkQ29ubmVjdGlvbkxpbms9QWRkIGNvbm5lY3Rpb25zLi4uCi1jb25uZWN0TGluaz1Db25uZWN0Ci1jb25uZWN0aW5nVG9EYXRhYmFzZT1Db25uZWN0aW5nIHRvIGRhdGFiYXNlCi1tYW55VG9PbmU9Jk1hbnkgdG8gb25lCi1tYW55VG9NYW55PU1hbiZ5IHRvIG1hbnkKLW9uZVRvTWFueT0mT25lIHRvIG1hbnkKLW9uZVRvT25lPSZPbmUgdG8gb25lCi1tYW55VG9PbmVEZXNjPUVhY2ggJXMgaGFzIG1hbnkgJXMuCi1vbmVUb09uZURlc2M9VGhlcmUgaXMgb25lICVzIHBlciAlcy4KLW1hbnlUb01hbnlEZXNjPUVhY2ggJXMgaGFzIG1hbnkgJXMsIGFuZCBlYWNoICVzIGhhcyBtYW55ICVzLgotCi1hZGQ9JkFkZAotcmVtb3ZlPSZSZW1vdmUKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzPUdlbmVyYXRlIEN1c3RvbSBFbnRpdGllcwotCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3Q9SlBBIFByb2plY3QgU2VsZWN0aW9uCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3RfbXNnPVNlbGVjdCBhIEpQQSBwcm9qZWN0LgotCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zZWxlY3RUYWJsZT1TZWxlY3QgVGFibGVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9jaG9vc2VFbnRpdHlUYWJsZT1TZWxlY3QgdGFibGVzIHRvIGdlbmVyYXRlIGVudGl0aWVzIGZyb20uCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV91cGRhdGVQZXJzaXN0ZW5jZVhtbD1VcGRhdGUgY2xhc3MgbGlzdCBpbiBwZXJzaXN0ZW5jZS54bWwKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3RhYmxlcz0mVGFibGVzOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVDb2x1bW49VGFibGUKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX1Jlc3RvcmVfRGVmYXVsdHM9UmVzdG9yZSBEZWZhdWx0cwotCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9nZXRUYWJsZXNfam9iTmFtZT1HZXR0aW5nIFRhYmxlcwotR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfZ2V0VGFibGVzX3Rhc2tOYW1lPVNjaGVtYSBnZXQgdGFibGVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9nZXRUYWJsZXNfc3ViVGFza05hbWU9UmV0cmlldmluZyB0YWJsZXMgZnJvbSBzY2hlbWEgezB9Li4uCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zdGF0dXNVcGRhdGVfdGFza05hbWU9VXBkYXRpbmcKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfdGl0bGU9VGFibGUgQXNzb2NpYXRpb25zCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9sYWJlbD1UYWJsZSAmYXNzb2NpYXRpb25zCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZXNjPUVkaXQgYSB0YWJsZSBhc3NvY2lhdGlvbiBieSBzZWxlY3RpbmcgaXQgYW5kIG1vZGlmeWluZyB0aGUgY29udHJvbHMgaW4gdGhlIGVkaXRpbmcgcGFuZWwuCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9uZXdBc3NvYz1OZXcgQXNzb2NpYXRpb24KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2RlbEFzc29jPURlbGV0ZSBTZWxlY3RlZCBBc3NvY2lhdGlvbgotCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV90aXRsZT1DdXN0b21pemUgRGVmYXVsdCBFbnRpdHkgR2VuZXJhdGlvbgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3RhYmxlTWFwcGluZz1UYWJsZSBtYXBwaW5nCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZG9tYWluSmF2YUNsYXNzPURvbWFpbiBqYXZhIGNsYXNzCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9kZXNjPU9wdGlvbmFsbHkgY3VzdG9taXplIGFzcGVjdHMgb2YgZW50aXRpZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBieSBkZWZhdWx0IGZyb20gZGF0YWJhc2UgdGFibGVzLiBBIEphdmEgcGFja2FnZSBzaG91bGQgYmUgc3BlY2lmaWVkLgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2FjY2Vzcz1FbnRpdHkgJmFjY2VzczoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9mZXRjaD1Bc3NvY2lhdGlvbnMgJmZldGNoOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2NvbGxUeXBlPUNvbGxlY3Rpb24gcHJvcGVydGllcyAmdHlwZToKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9nZW5PcHRpb25hbEFubm90YXRpb25zID0gQWx3YXlzIGdlbmVyYXRlIG9wdGlvbmFsIEpQQSBhbm5vdGF0aW9ucyBhbmQgRERMIHBhcmFtZXRlcnMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9nZW5PcHRpb25hbEFubm90YXRpb25zX2Rlc2MgPSAgR2VuZXJhdGUgb3B0aW9uYWwgSlBBIGFubm90YXRpb25zIGFuZCBEREwgcGFyYW1ldGVycyBsaWtlICd1bmlxdWUnLCAnbnVsbGFibGUnLCAnbGVuZ3RoJywgJ3ByZWNpc2lvbicgYW5kICdzY2FsZScsIHdoaWNoIGFyZSBvcHRpb25hbCBhbmQgb25seSB1c2VkIGJ5IGF1dG9tYXRpYyB0YWJsZSBjcmVhdGlvbiB0byBzcGVjaWZ5IHRhYmxlIGNyZWF0aW9uIGRhdGEuCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfa2V5R2VuPUtleSAmZ2VuZXJhdG9yOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlPVNlcXVlbmNlICZuYW1lOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlTm90ZT1Zb3UgY2FuIHVzZSB0aGUgcGF0dGVybnMgJXMgYW5kL29yICVzIGluIHRoZSBzZXF1ZW5jZSBuYW1lLlxuXAotCQkJVGhlc2UgcGF0dGVybnMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGFibGUgbmFtZSBhbmQgdGhlIHByaW1hcnkga2V5IFxuXAotCQkJY29sdW1uIG5hbWUgd2hlbiBhIHRhYmxlIG1hcHBpbmcgaXMgZ2VuZXJhdGVkLgotCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfdGl0bGU9Q3VzdG9taXplIEluZGl2aWR1YWwgRW50aXRpZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfZGVzYz1DdXN0b21pemUgZGV0YWlsIG9mIGluZGl2aWR1YWwgZW50aXRpZXMgYnkgc2VsZWN0aW5nIHRoZSBhc3NvY2lhdGVkIHRhYmxlcyBvciBjb2x1bW5zIGFuZCBjaGFuZ2luZyB2YWx1ZXMgaW4gdGhlIGVkaXRpbmcgcGFuZWwuCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlc0FuZENvbHVtbnNQYWdlX2xhYmVsVGFibGVBbmRDb2x1bW5zPSZUYWJsZXMgYW5kIGNvbHVtbnMKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVBhbmVsX2NsYXNzTmFtZT0mQ2xhc3MgbmFtZToKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfZ2VuUHJvcD1HZW5lcmF0ZSB0aGlzIHByb3BlcnR5Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbE1hcHBpbmc9Q29sdW1uIG1hcHBpbmcKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfcHJvcE5hbWU9UHJvcGVydHkgJm5hbWU6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3Byb3BUeXBlPU1hcHBpbmcgdCZ5cGU6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX21hcEtpbmQ9TWFwcGluZyAma2luZDoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfYmVhblByb3A9RG9tYWluIEphdmEgQ2xhc3MKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfZ2V0dGVyU2NvcGU9R2V0dGVyIHNjb3BlOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9zZXR0ZXJTY29wZT1TZXR0ZXIgc2NvcGU6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbFVwZGF0ZWFibGU9Q29sdW1uIGlzICZ1cGRhdGFibGUKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sSW5zZXJ0YWJsZT1Db2x1bW4gaXMgJmluc2VydGFibGUKLQotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190aXRsZT1DcmVhdGUgTmV3IEFzc29jaWF0aW9uCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90aXRsZT1Bc3NvY2lhdGlvbiBUYWJsZXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9kZXNjPVNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIHRhYmxlcy4KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9hc3NvY0tpbmQ9QXNzb2NpYXRpb24ga2luZAotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jVGFibGVzPUFzc29jaWF0aW9uICZ0YWJsZXM6Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGFibGUxPVRhYmxlICYxOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3RhYmxlMj1UYWJsZSAmMjoKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9pbnRlcm1lZGlhdGVUYWJsZT1Kb2luIHRhYmxlOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3NpbXBsZUFzc29jPSZTaW1wbGUgYXNzb2NpYXRpb24KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9tMm1Bc3NvYz0mTWFueSB0byBtYW55IGFzc29jaWF0aW9uCi0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY2FyZGluYWxpdHlQYWdlX3RpdGxlPUFzc29jaWF0aW9uIENhcmRpbmFsaXR5Ci1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NhcmRpbmFsaXR5UGFnZV9kZXNjPVNwZWNpZnkgdGhlIGFzc29jaWF0aW9uIGNhcmRpbmFsaXR5LgotCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NvbHNQYWdlX3RpdGxlPUpvaW4gQ29sdW1ucwotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9kZXNjPVNwZWNpZnkgdGhlIGpvaW4gY29sdW1ucy4KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWw9U3BlY2lmeSB0aGUgam9pbiBjb2x1bW5zIGJldHdlZW4gdGhlICVzIGFuZCAlcyB0YWJsZXM6Ci0KLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZW50aXR5UmVmPUdlbmVyYXRlIGEgcmVmZXJlbmNlIHRvICVzIGluICVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX3NldFJlZj1HZW5lcmF0ZSBhIHJlZmVyZW5jZSB0byBhIGNvbGxlY3Rpb24gb2YgJXMgaW4gJXMKLUdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfdGFibGVKb2luPVRhYmxlICZqb2luOgotR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9qb2luZWRXaGVuPVRoZSB0YWJsZSByb3dzIGFyZSBqb2luZWQgd2hlbjpcbiVzCi1HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2dlbkFzc29jPUdlbmVyYXRlICZ0aGlzIGFzc29jaWF0aW9uCi0KLXNlbGVjdENhc2NhZGVEbGdUaXRsZT1TZWxlY3QgQ2FzY2FkZQotc2VsZWN0VGFibGVEbGdUaXRsZT1UYWJsZSBTZWxlY3Rpb24KLXNlbGVjdFRhYmxlRGxnRGVzYz0mU2VsZWN0IGEgdGFibGU6CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9lbnRpdHlfd2l6YXJkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4Mjk4YTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfZW50aXR5X3dpemFyZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1FTlRJVFlfV0laQVJEX1RJVExFPU5ldyBKUEEgRW50aXR5Ci1FTlRJVFlfV0laQVJEX1BBR0VfVElUTEU9RW50aXR5IGNsYXNzCi1FTlRJVFlfV0laQVJEX1BBR0VfREVTQ1JJUFRJT049Q3JlYXRlIGEgbmV3IEpQQSBlbnRpdHkuIE9ubHkgSlBBIGVuYWJsZWQgcHJvamVjdHMgbWF5IGJlIHNlbGVjdGVkLgotREVGQVVMVF9QQUNLQUdFX1dBUk5JTkc9VGhlIHVzYWdlIG9mIHRoZSBkZWZhdWx0IHBhY2thZ2UgaXMgbm90IHJlY29tbWVuZGVkLgotRU5USVRZX1BST1BFUlRJRVNfVElUTEU9RW50aXR5IFByb3BlcnRpZXMKLUVOVElUWV9QUk9QRVJUSUVTX0RFU0NSSVBUSU9OPVNldCBlbnRpdHkgbmFtZSwgdGFibGUgbmFtZSwgZmllbGRzLCBhbmQgYWNjZXNzIHR5cGUuCi1FTlRJVFk9RW50aXQmeQotTUFQUEVEX0FTX1NVUEVSQ0xBU1M9TWFwcGVkIHN1cGVyJmNsYXNzCi1JTkhFUklUQU5DRV9HUk9VUD1Jbmhlcml0YW5jZQotSU5IRVJJVEFOQ0VfQ0hFQ0tfQk9YPSZJbmhlcml0YW5jZToKLVhNTF9TVE9SQUdFX0dST1VQPVhNTCBlbnRpdHkgbWFwcGluZ3MKLVhNTF9TVVBQT1JUPUFkZCB0byBlbnRpdHkgbWFwcGluZ3MgaW4gJlhNTAotQ0hPT1NFX1hNTD1NJmFwcGluZyBmaWxlOgotTUFQUElOR19YTUxfVElUTEU9TWFwcGluZyBGaWxlCi1YTUxfTkFNRV9USVRMRT1YTUwgbmFtZToKLUNIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFPUNob29zZSBtYXBwaW5nIFhNTAotSU5WQUxJRF9YTUxfTkFNRT1UaGUgbWFwcGluZyBmaWxlIGRvZXMgbm90IGV4aXN0Ci1NQVBQSU5HX0ZJTEVfTk9UX0xJU1RFRF9FUlJPUj1UaGUgc2VsZWN0ZWQgbWFwcGluZyBmaWxlIGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdC4KLVRZUEVfRElBTE9HX1RJVExFPUNob29zZSBUeXBlCi1UWVBFX0RJQUxPR19ERVNDUklQVElPTj1DaG9vc2UgdGhlIHR5cGUgb2YgdGhlIGVudGl0eSBmaWVsZC4KLUVOVElUWV9OQU1FPUVudGl0eSBuYSZtZToKLVRBQkxFX05BTUVfR1JPVVA9VGFibGUgbmFtZQotVEFCTEVfTkFNRT0mVGFibGUgbmFtZToKLVVTRV9ERUZBVUxUPSZVc2UgZGVmYXVsdAotRU5USVRZX0ZJRUxEU19HUk9VUD1FbnRpdHkgZmllbGQmcwotRU5USVRZX0ZJRUxEU19ESUFMT0dfVElUTEU9RW50aXR5IEZpZWxkcwotS0VZPUtleQotTkFNRV9DT0xVTU49TmFtZQotVFlQRV9DT0xVTU49VHlwZQotTkFNRV9URVhUX0ZJRUxEPU5hJm1lOgotVFlQRV9URVhUX0ZJRUxEPSZUeXBlOgotQlJPV1NFX0JVVFRPTl9MQUJFTD1CJnJvd3NlLi4uCi1BRERfQlVUVE9OX0xBQkVMPSZBZGQuLi4KLUVESVRfQlVUVE9OX0xBQkVMPSZFZGl0Li4uCi1SRU1PVkVfQlVUVE9OX0xBQkVMPSZSZW1vdmUKLURVUExJQ0FURURfRU5USVRZX05BTUVTX01FU1NBR0U9VGhlcmUgYXJlIGR1cGxpY2F0ZSBuYW1lcyBvbiBjcmVhdGVkIGVudGl0eSBmaWVsZHMuIFBsZWFzZSByZXNvbHZlIHRoZSBkdXBsaWNhdGlvbi4KLUFDQ0VTU19UWVBFPUFjY2VzcyB0eXBlCi1GSUVMRF9CQVNFRD1GaWVsJmQKLVBST1BFUlRZX0JBU0VEPSZQcm9wZXJ0eQotTk9fSlBBX1BST0pFQ1RTPU5vIEpQQSBwcm9qZWN0cyBpbiB0aGUgd29ya3NwYWNlCi1BUFBMWV9DSEFOR0VTX1RPX1BFUlNJU1RFTkNFX1hNTD1BcHBseSBjaGFuZ2VzIHRvIHBlcnNpc3RlbmNlIFhNTAotQUREX01BUFBFRF9TVVBFUkNMQVNTX1RPX1hNTD1BZGQgbWFwcGVkIHN1cGVyY2xhc3MgdG8gWE1MCi1BRERfRU5USVRZX1RPX1hNTD1BZGQgZW50aXR5IHRvIFhNTAotRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfdHlwZU5vdEluUHJvamVjdENsYXNzcGF0aD0nJ3swfScnIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aAotRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfaW52YWxpZFBLVHlwZT0nJ3swfScnIGlzIG5vdCBhIHZhbGlkIHNpbXBsZSBwcmltYXJ5IGtleSB0eXBlCi1FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl9pbnZhbGlkQXJndW1lbnQ9SW52YWxpZCBhcmd1bWVudCAnJ3swfScnCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9qcHFsX2lkZW50aWZpZXJzLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9qcHFsX2lkZW50aWZpZXJzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ODYyNjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfanBxbF9pZGVudGlmaWVycy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgSlBBIDEuMCBpZGVudGlmaWVycwotQUJTPVRoZSA8Yj5BQlM8L2I+IGZ1bmN0aW9uIHJlbW92ZXMgdGhlIG1pbnVzIHNpZ24gZnJvbSBhIHNwZWNpZmllZCBudW1lcmljIGFyZ3VtZW50IGFuZCByZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSAoaW50ZWdlciwgZmxvYXQsIG9yIGRvdWJsZSkgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgYXJndW1lbnQgdG8gdGhlIGZ1bmN0aW9uLCB3aGljaCBpcyBhbHdheXMgYSBwb3NpdGl2ZSBudW1iZXIgb3IgemVyby4KLUFMTD08dWw+PGxpPkFuIDxiPkFMTDwvYj4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBhIHByZWRpY2F0ZSB0aGF0IGlzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbiBpcyA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYWxsIHZhbHVlcyBpbiB0aGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSBvciB0aGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSBpcyBlbXB0eS48L2xpPjxsaT5BbiA8Yj5BTEw8L2I+IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBhdCBsZWFzdCBvbmUgcm93LCBhbmQgaXMgdW5rbm93biBpZiBuZWl0aGVyIDxjb2RlPnRydWU8L2NvZGU+IG5vciA8Y29kZT5mYWxzZTwvY29kZT4uPC91bD48cD48cD5UaGUgY29tcGFyaXNvbiBvcGVyYXRvcnMgdXNlZCB3aXRoIDxiPkFMTDwvYj4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMgYXJlID0sIDwsIDw9LCA+LCA+PSwgPD4uPHA+PHA+VGhlIHJlc3VsdCBvZiB0aGUgc3VicXVlcnkgbXVzdCBiZSBsaWtlIHRoYXQgb2YgdGhlIG90aGVyIGFyZ3VtZW50IHRvIHRoZSBjb21wYXJpc29uIG9wZXJhdG9yIGluIHR5cGUuCi0jQU5ECi1BTlk9PHVsPjxsaT5BbiA8Yj5BTlk8L2I+IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgYSBwcmVkaWNhdGUgdGhhdCBpcyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb24gaXMgPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHNvbWUgdmFsdWUgaW4gdGhlIHJlc3VsdCBvZiB0aGUgc3VicXVlcnkuPC9saT48bGk+QW4gPGI+QU5ZPC9iPiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSBpcyBlbXB0eSBvciBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRpb24gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGZvciBldmVyeSB2YWx1ZSBpbiB0aGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSw8L2xpPjxsaT5hbmQgaXMgdW5rbm93biBpZiBuZWl0aGVyIDxjb2RlPnRydWU8L2NvZGU+IG5vciA8Y29kZT5mYWxzZTwvY29kZT4uPC9saT48L3VsPjxwPjxwPlRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyB1c2VkIHdpdGggPGI+QU5ZPC9iPiBjb25kaXRpb25hbCBleHByZXNzaW9ucyBhcmUgPSwgPCwgPD0sID4sID49LCA8Pi48cD48cD5UaGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSBtdXN0IGJlIGxpa2UgdGhhdCBvZiB0aGUgb3RoZXIgYXJndW1lbnQgdG8gdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaW4gdHlwZS4KLUFTQz1UaGUga2V5d29yZCA8Yj5BU0M8L2I+IHNwZWNpZmllcyB0aGF0IGFzY2VuZGluZyBvcmRlcmluZyBiZSB1c2VkIGZvciB0aGUgYXNzb2NpYXRlZCBvcmRlciBieSBpdGVtLgotQVZHPU9uZSBvZiB0aGUgYWdncmVnYXRlIGZ1bmN0aW9ucy4gVGhlIGFyZ3VtZW50cyBtdXN0IGJlIG51bWVyaWMuIDxiPkFWRzwvYj4gcmV0dXJucyA8Y29kZT5Eb3VibGU8L2NvZGU+LjxwPjxwPjxiPkJORjo8L2I+IDxjb2RlPmV4cHJlc3Npb24gOjo9IEFWRyhbRElTVElOQ1RdIHN0YXRlX2ZpZWxkX3BhdGhfZXhwcmVzc2lvbik8L2NvZGU+Ci1CRVRXRUVOPVVzZWQgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgcmVzdWx0IG9mIGFuIGV4cHJlc3Npb24gZmFsbHMgd2l0aGluIGFuIGluY2x1c2l2ZSByYW5nZSBvZiB2YWx1ZXMuIE51bWVyaWMsIHN0cmluZyBhbmQgZGF0ZSBleHByZXNzaW9uIGNhbiBiZSBldmFsdWF0ZWQgaW4gdGhpcyB3YXkuCi1CT1RIPVRyaW0gZnJvbSBib3RoIGVuZHMuCi1DT05DQVQ9VGhlIDxiPkNPTkNBVDwvYj4gZnVuY3Rpb24gcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIGEgY29uY2F0ZW5hdGlvbiBvZiBpdHMgYXJndW1lbnRzLgotQ09VTlQ9T25lIG9mIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb25zLiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBmdW5jdGlvbiBpcyBhIDxjb2RlPkxvbmc8L2NvZGU+LgotQ1VSUkVOVF9EQVRFPVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgY3VycmVudCBkYXRlIG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIuCi1DVVJSRU5UX1RJTUU9VGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBjdXJyZW50IHRpbWUgb24gdGhlIGRhdGFiYXNlIHNlcnZlci4KLUNVUlJFTlRfVElNRVNUQU1QPVRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgY3VycmVudCB0aW1lc3RhbXAgb24gdGhlIGRhdGFiYXNlCi1ERUxFVEVfRlJPTT1BIGRlbGV0ZSBzdGF0ZW1lbnQgcHJvdmlkZSBidWxrIG9wZXJhdGlvbnMgb3ZlciBzZXRzIG9mIGVudGl0aWVzLgotREVTQz1UaGUga2V5d29yZCA8Yj5ERVNDPC9iPiBzcGVjaWZpZXMgdGhhdCBkZXNjZW5kaW5nIG9yZGVyaW5nIGJlIHVzZWQuIEFzY2VuZGluZyBvcmRlcmluZyBpcyB0aGUgZGVmYXVsdC4KLURJU1RJTkNUPVRoZSA8Yj5ESVNUSU5DVDwvYj4ga2V5d29yZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhhdCBkdXBsaWNhdGUgdmFsdWVzIG11c3QgYmUgZWxpbWluYXRlZCBmcm9tIHRoZSBxdWVyeSByZXN1bHQuIElmIDxiPkRJU1RJTkNUPC9iPiBpcyBub3Qgc3BlY2lmaWVkLCBkdXBsaWNhdGUgdmFsdWVzIGFyZSBub3QgZWxpbWluYXRlZC4KLUVTQ0FQRT1UaGUgb3B0aW9uYWwgPGNvZGU+ZXNjYXBlIGNoYXJhY3RlcjwvY29kZT4gaXMgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBsaXRlcmFsIG9yIGEgY2hhcmFjdGVyLXZhbHVlZCBpbnB1dCBwYXJhbWV0ZXIgKGkuZS4sIGNoYXIgb3IgQ2hhcmFjdGVyKSBhbmQgaXMgdXNlZCB0byBlc2NhcGUgdGhlIHNwZWNpYWwgbWVhbmluZyBvZiB0aGUgdW5kZXJzY29yZSBhbmQgcGVyY2VudCBjaGFyYWN0ZXJzIGluIDxjb2RlPnBhdHRlcm4gdmFsdWU8L2NvZGU+LgotRVhJU1RTPUFuIDxiPkVYSVNUUzwvYj4gZXhwcmVzc2lvbiBpcyBhIHByZWRpY2F0ZSB0aGF0IGlzIDxjb2RlPnRydWU8L2NvZGU+IG9ubHkgaWYgdGhlIHJlc3VsdCBvZiB0aGUgc3VicXVlcnkgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgdmFsdWVzIGFuZCB0aGF0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi1GUk9NPVRoZSA8Yj5GUk9NPC9iPiBjbGF1c2Ugb2YgYSBxdWVyeSBkZWZpbmVzIHRoZSBkb21haW4gb2YgdGhlIHF1ZXJ5IGJ5IGRlY2xhcmluZyBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZXMuIEFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIGlzIGFuIGlkZW50aWZpZXIgZGVjbGFyZWQgaW4gdGhlIDxiPkZST008L2I+IGNsYXVzZSBvZiBhIHF1ZXJ5LiBUaGUgZG9tYWluIG9mIHRoZSBxdWVyeSBtYXkgYmUgY29uc3RyYWluZWQgYnkgcGF0aCBleHByZXNzaW9ucy4gSWRlbnRpZmljYXRpb24gdmFyaWFibGVzIGRlc2lnbmF0ZSBpbnN0YW5jZXMgb2YgYSBwYXJ0aWN1bGFyIGVudGl0eSBhYnN0cmFjdCBzY2hlbWEgdHlwZS4gVGhlIDxiPkZST008L2I+IGNsYXVzZSBjYW4gY29udGFpbiBtdWx0aXBsZSBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgc2VwYXJhdGVkIGJ5IGEgY29tbWEgKCwpLgotR1JPVVBfQlk9VGhlIDxiPkdST1VQIEJZPC9iPiBjb25zdHJ1Y3QgZW5hYmxlcyB0aGUgYWdncmVnYXRpb24gb2YgdmFsdWVzIGFjY29yZGluZyB0byB0aGUgcHJvcGVydGllcyBvZiBhbiBlbnRpdHkgY2xhc3MuCi1IQVZJTkc9VGhlIDxiPkhBVklORzwvYj4gY29uc3RydWN0IGVuYWJsZXMgY29uZGl0aW9ucyB0byBiZSBzcGVjaWZpZWQgdGhhdCBmdXJ0aGVyIHJlc3RyaWN0IHRoZSBxdWVyeSByZXN1bHQgYXMgcmVzdHJpY3Rpb25zIHVwb24gdGhlIGdyb3Vwcy4KLUlOPUFuIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlIGRlY2xhcmVkIGJ5IGEgY29sbGVjdGlvbiBtZW1iZXIgZGVjbGFyYXRpb24gcmFuZ2VzIG92ZXIgdmFsdWVzIG9mIGEgY29sbGVjdGlvbiBvYnRhaW5lZCBieSBuYXZpZ2F0aW9uIHVzaW5nIGEgcGF0aCBleHByZXNzaW9uLiBTdWNoIGEgcGF0aCBleHByZXNzaW9uIHJlcHJlc2VudHMgYSBuYXZpZ2F0aW9uIGludm9sdmluZyB0aGUgYXNzb2NpYXRpb24tZmllbGRzIG9mIGFuIGVudGl0eSBhYnN0cmFjdCBzY2hlbWEgdHlwZS4gQmVjYXVzZSBhIHBhdGggZXhwcmVzc2lvbiBjYW4gYmUgYmFzZWQgb24gYW5vdGhlciBwYXRoIGV4cHJlc3Npb24sIHRoZSBuYXZpZ2F0aW9uIGNhbiB1c2UgdGhlIGFzc29jaWF0aW9uLWZpZWxkcyBvZiByZWxhdGVkIGVudGl0aWVzLiBBbiBpZGVudGlmaWNhdGlvbiB2YXJpYWJsZSBvZiBhIGNvbGxlY3Rpb24gbWVtYmVyIGRlY2xhcmF0aW9uIGlzIGRlY2xhcmVkIHVzaW5nIGEgc3BlY2lhbCBvcGVyYXRvciwgdGhlIHJlc2VydmVkIGlkZW50aWZpZXIgPGI+SU48L2I+LiBUaGUgYXJndW1lbnQgdG8gdGhlIDxiPklOPC9iPiBvcGVyYXRvciBpcyBhIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGggZXhwcmVzc2lvbi4gVGhlIHBhdGggZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYSBjb2xsZWN0aW9uIHR5cGUgc3BlY2lmaWVkIGFzIGEgcmVzdWx0IG9mIG5hdmlnYXRpb24gdG8gYSBjb2xsZWN0aW9uLXZhbHVlZCBhc3NvY2lhdGlvbi1maWVsZCBvZiBhbiBlbnRpdHkgYWJzdHJhY3Qgc2NoZW1hIHR5cGUuCi1JU19FTVBUWT1BbiA8Yj5FTVBUWTwvYj4gZXhwcmVzc2lvbiB0ZXN0cyB3aGV0aGVyIG9yIG5vdCB0aGUgY29sbGVjdGlvbiBkZXNpZ25hdGVkIGJ5IHRoZSBjb2xsZWN0aW9uLXZhbHVlZCBwYXRoIGV4cHJlc3Npb24gaXMgZW1wdHkgKGkuZSwgaGFzIG5vIGVsZW1lbnRzKS4KLUlTX05VTEw9QSBudWxsIGNvbXBhcmlzb24gdGVzdHMgd2hldGhlciBvciBub3QgdGhlIHNpbmdsZS12YWx1ZWQgcGF0aCBleHByZXNzaW9uIG9yIGlucHV0IHBhcmFtZXRlciBpcyBhIDxiPk5VTEw8L2I+IHZhbHVlLgotSk9JTj1BIDxiPkpPSU48L2I+IGVuYWJsZXMgdGhlIGZldGNoaW5nIG9mIGFuIGFzc29jaWF0aW9uIGFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhlIGV4ZWN1dGlvbiBvZiBhIHF1ZXJ5LiBBIDxiPkpPSU48L2I+IGlzIHNwZWNpZmllZCBvdmVyIGFuIGVudGl0eSBhbmQgaXRzIHJlbGF0ZWQgZW50aXRpZXMuCi1KT0lOX0ZFVENIPUEgPGI+Sk9JTiBGRVRDSDwvYj4gZW5hYmxlcyB0aGUgZmV0Y2hpbmcgb2YgYW4gYXNzb2NpYXRpb24gYXMgYSBzaWRlIGVmZmVjdCBvZiB0aGUgZXhlY3V0aW9uIG9mIGEgcXVlcnkuIEEgPGI+Sk9JTiBGRVRDSDwvYj4gaXMgc3BlY2lmaWVkIG92ZXIgYW4gZW50aXR5IGFuZCBpdHMgcmVsYXRlZCBlbnRpdGllcy4KLUxFQURJTkc9VHJpbSBmcm9tIGxlYWRpbmcgZW5kLgotTEVOR1RIPVRoZSA8Yj5MRU5HVEg8L2I+IGZ1bmN0aW9uIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGNoYXJhY3RlcnMgYXMgYW4gaW50ZWdlci4KLUxJS0U9VGhlIDxiPkxJS0U8L2I+IGNvbmRpdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgYSBzZWFyY2ggZm9yIGEgcGF0dGVybi48cD48cD5UaGUgPGNvZGU+c3RyaW5nX2V4cHJlc3Npb248L2NvZGU+IG11c3QgaGF2ZSBhIHN0cmluZyB2YWx1ZS4gVGhlIDxjb2RlPnBhdHRlcm5fdmFsdWU8L2NvZGU+IGlzIGEgc3RyaW5nIGxpdGVyYWwgb3IgYSBzdHJpbmctdmFsdWVkIGlucHV0IHBhcmFtZXRlciBpbiB3aGljaCBhbiB1bmRlcnNjb3JlIChfKSBzdGFuZHMgZm9yIGFueSBzaW5nbGUgY2hhcmFjdGVyLCBhIHBlcmNlbnQgKCUpIGNoYXJhY3RlciBzdGFuZHMgZm9yIGFueSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIGVtcHR5IHNlcXVlbmNlKSwgYW5kIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHN0YW5kIGZvciB0aGVtc2VsdmVzLiBUaGUgb3B0aW9uYWwgPGNvZGU+ZXNjYXBlX2NoYXJhY3RlcjwvY29kZT4gaXMgYSBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZyBsaXRlcmFsIG9yIGEgY2hhcmFjdGVyLXZhbHVlZCBpbnB1dCBwYXJhbWV0ZXIgKGkuZS4sIGNoYXIgb3IgQ2hhcmFjdGVyKSBhbmQgaXMgdXNlZCB0byBlc2NhcGUgdGhlIHNwZWNpYWwgbWVhbmluZyBvZiB0aGUgdW5kZXJzY29yZSBhbmQgcGVyY2VudCBjaGFyYWN0ZXJzIGluIDxjb2RlPnBhdHRlcm5fdmFsdWU8L2NvZGU+LgotTE9DQVRFPVRoZSA8Yj5MT0NBVEU8L2I+IGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gc3RyaW5nIHdpdGhpbiBhIHN0cmluZywgc3RhcnRpbmcgdGhlIHNlYXJjaCBhdCBhIHNwZWNpZmllZCBwb3NpdGlvbi4gSXQgcmV0dXJucyB0aGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggdGhlIHN0cmluZyB3YXMgZm91bmQgYXMgYW4gaW50ZWdlci4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBzdHJpbmcgdG8gYmUgbG9jYXRlZDsgdGhlIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkOyB0aGUgb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQgaXMgYW4gaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIHN0cmluZyBwb3NpdGlvbiBhdCB3aGljaCB0aGUgc2VhcmNoIGlzIHN0YXJ0ZWQgKGJ5IGRlZmF1bHQsIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZCkuIFRoZSBmaXJzdCBwb3NpdGlvbiBpbiBhIHN0cmluZyBpcyBkZW5vdGVkIGJ5IDEuIElmIHRoZSBzdHJpbmcgaXMgbm90IGZvdW5kLCAwIGlzIHJldHVybmVkLiBUaGUgPGI+TEVOR1RIPC9iPiBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpbiBjaGFyYWN0ZXJzIGFzIGFuIGludGVnZXIuCi1MT1dFUj1UaGUgPGI+TE9XRVI8L2I+IGZ1bmN0aW9uIGNvbnZlcnRzIGEgc3RyaW5nIHRvIGxvd2VyIGNhc2UgYW5kIGl0IHJldHVybnMgYSBzdHJpbmcuCi1NQVg9T25lIG9mIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb25zLiBUaGUgYXJndW1lbnRzIG11c3QgY29ycmVzcG9uZCB0byBvcmRlcmFibGUgc3RhdGUtZmllbGQgdHlwZXMgKGkuZS4sIG51bWVyaWMgdHlwZXMsIHN0cmluZyB0eXBlcywgY2hhcmFjdGVyIHR5cGVzLCBvciBkYXRlIHR5cGVzKS4gVGhlIHJldHVybiB0eXBlIG9mIHRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIHN0YXRlLWZpZWxkJ3MgdHlwZS4KLU1FTUJFUj1UaGlzIGV4cHJlc3Npb24gdGVzdHMgd2hldGhlciB0aGUgZGVzaWduYXRlZCB2YWx1ZSBpcyBhIG1lbWJlciBvZiB0aGUgY29sbGVjdGlvbiBzcGVjaWZpZWQgYnkgdGhlIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGggZXhwcmVzc2lvbi4gSWYgdGhlIGNvbGxlY3Rpb24tdmFsdWVkIHBhdGggZXhwcmVzc2lvbiBkZXNpZ25hdGVzIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHRoZSB2YWx1ZSBvZiB0aGUgPGI+TUVNQkVSIE9GPC9iPiBleHByZXNzaW9uIGlzIDxiPkZBTFNFPC9iPiBhbmQgdGhlIHZhbHVlIG9mIHRoZSA8Yj5OT1QgTUVNQkVSIE9GPC9iPiBleHByZXNzaW9uIGlzIDxiPlRSVUU8L2I+LiBPdGhlcndpc2UsIGlmIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGVjdGlvbi12YWx1ZWQgcGF0aCBleHByZXNzaW9uIG9yIHNpbmdsZS12YWx1ZWQgYXNzb2NpYXRpb24tZmllbGQgcGF0aCBleHByZXNzaW9uIGluIHRoZSBjb2xsZWN0aW9uIG1lbWJlciBleHByZXNzaW9uIGlzIDxiPk5VTEw8L2I+IG9yIHVua25vd24sIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGVjdGlvbiBtZW1iZXIgZXhwcmVzc2lvbiBpcyB1bmtub3duLgotTUlOPSBPbmUgb2YgdGhlIGFnZ3JlZ2F0ZSBmdW5jdGlvbnMuIFRoZSBhcmd1bWVudHMgbXVzdCBjb3JyZXNwb25kIHRvIG9yZGVyYWJsZSBzdGF0ZS1maWVsZCB0eXBlcyAoaS5lLiwgbnVtZXJpYyB0eXBlcywgc3RyaW5nIHR5cGVzLCBjaGFyYWN0ZXIgdHlwZXMsIG9yIGRhdGUgdHlwZXMpLiBUaGUgcmV0dXJuIHR5cGUgb2YgdGhpcyBmdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgc3RhdGUtZmllbGQncyB0eXBlLgotTU9EPVRoZSBtb2R1bG8gb3BlcmF0aW9uIGZpbmRzIHRoZSByZW1haW5kZXIgb2YgZGl2aXNpb24gb2Ygb25lIG51bWJlciBieSBhbm90aGVyLiBJdCB0YWtlcyB0d28gaW50ZWdlciBhcmd1bWVudHMgYW5kIHJldHVybnMgYW4gaW50ZWdlci4KLU5FVz1JbiB0aGUgPGI+U0VMRUNUPC9iPiBjbGF1c2UgYSBjb25zdHJ1Y3RvciBtYXkgYmUgdXNlZCBpbiB0aGUgPGI+U0VMRUNUPC9iPiBsaXN0IHRvIHJldHVybiBvbmUgb3IgbW9yZSBKYXZhIGluc3RhbmNlcy4gVGhlIHNwZWNpZmllZCBjbGFzcyBpcyBub3QgcmVxdWlyZWQgdG8gYmUgYW4gZW50aXR5IG9yIHRvIGJlIG1hcHBlZCB0byB0aGUgZGF0YWJhc2UuIFRoZSBjb25zdHJ1Y3RvciBuYW1lIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkLgotT0JKRUNUPVN0YW5kLWFsb25lIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlcyBpbiB0aGUgPGI+U0VMRUNUPC9iPiBjbGF1c2UgbWF5IG9wdGlvbmFsbHkgYmUgcXVhbGlmaWVkIGJ5IHRoZSA8Yj5PQkpFQ1Q8L2I+IG9wZXJhdG9yLiBUaGUgPGI+U0VMRUNUPC9iPiBjbGF1c2UgbXVzdCBub3QgdXNlIHRoZSA8Yj5PQkpFQ1Q8L2I+IG9wZXJhdG9yIHRvIHF1YWxpZnkgcGF0aCBleHByZXNzaW9ucy4KLSNPUgotT1JERVJfQlk9VGhlIDxiPk9SREVSIEJZPC9iPiBjbGF1c2UgYWxsb3dzIHRoZSBvYmplY3RzIG9yIHZhbHVlcyB0aGF0IGFyZSByZXR1cm5lZCBieSB0aGUgcXVlcnkgdG8gYmUgb3JkZXJlZC4KLVNFTEVDVD1UaGUgPGI+U0VMRUNUPC9iPiBjbGF1c2UgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0cyBvciB2YWx1ZXMgdG8gYmUgc2VsZWN0ZWQuCi1TSVpFPVRoZSA8Yj5TSVpFPC9iPiBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXIgdmFsdWUsIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhlIGNvbGxlY3Rpb24uIElmIHRoZSBjb2xsZWN0aW9uIGlzIGVtcHR5LCB0aGUgPGI+U0laRTwvYj4gZnVuY3Rpb24gZXZhbHVhdGVzIHRvIHplcm8uCi1TT01FPTx1bD48bGk+QW4gPGI+U09NRTwvYj4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBpcyBhIHByZWRpY2F0ZSB0aGF0IGlzIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbiBpcyA8Y29kZT50cnVlPC9jb2RlPiBmb3Igc29tZSB2YWx1ZSBpbiB0aGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeS48L2xpPjxsaT5BIDxiPlNPTUU8L2I+IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gaXMgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoZSByZXN1bHQgb2YgdGhlIHN1YnF1ZXJ5IGlzIGVtcHR5IG9yIGlmIHRoZSBjb21wYXJpc29uIG9wZXJhdGlvbiBpcyA8Y29kZT5mYWxzZTwvY29kZT4gZm9yIGV2ZXJ5IHZhbHVlIGluIHRoZSByZXN1bHQgb2YgdGhlIHN1YnF1ZXJ5LDwvbGk+PGxpPmFuZCBpcyB1bmtub3duIGlmIG5laXRoZXIgPGNvZGU+dHJ1ZTwvY29kZT4gbm9yIDxjb2RlPmZhbHNlPC9jb2RlPi48L2xpPjwvdWw+PHA+PHA+VGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIHVzZWQgd2l0aCA8Yj5TT01FPC9iPiBjb25kaXRpb25hbCBleHByZXNzaW9ucyBhcmUgPSwgPCwgPD0sID4sID49LCA8Pi48cD48cD5UaGUgcmVzdWx0IG9mIHRoZSBzdWJxdWVyeSBtdXN0IGJlIGxpa2UgdGhhdCBvZiB0aGUgb3RoZXIgYXJndW1lbnQgdG8gdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaW4gdHlwZS4KLVNRUlQ9VGhlIDxiPlNRUlQ8L2I+IGZ1bmN0aW9uIHRha2VzIGEgbnVtZXJpYyBhcmd1bWVudCBhbmQgcmV0dXJucyBhIGRvdWJsZS4KLVNVQlNUUklORz1UaGUgc2Vjb25kIGFuZCB0aGlyZCBhcmd1bWVudHMgb2YgdGhlIDxiPlNVQlNUUklORzwvYj4gZnVuY3Rpb24gZGVub3RlIHRoZSBzdGFydGluZyBwb3NpdGlvbiBhbmQgbGVuZ3RoIG9mIHRoZSBzdWJzdHJpbmcgdG8gYmUgcmV0dXJuZWQuIFRoZXNlIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnMuIFRoZSBmaXJzdCBwb3NpdGlvbiBvZiBhIHN0cmluZyBpcyBkZW5vdGVkIGJ5IDEuIFRoZSA8Yj5TVUJTVFJJTkc8L2I+IGZ1bmN0aW9uIHJldHVybnMgYSBzdHJpbmcuCi1TVU09IE9uZSBvZiB0aGUgYWdncmVnYXRlIGZ1bmN0aW9ucy4gVGhlIGFyZ3VtZW50cyBtdXN0IGJlIG51bWVyaWMuIFRoZSA8Yj5TVU08L2I+IGZ1bmN0aW9uIHJldHVybnMgPGNvZGU+TG9uZzwvY29kZT4gd2hlbiBhcHBsaWVkIHRvIHN0YXRlLWZpZWxkcyBvZiBpbnRlZ3JhbCB0eXBlcyAob3RoZXIgdGhhbiA8Y29kZT5CaWdJbnRlZ2VyPC9jb2RlPik7IDxjb2RlPkRvdWJsZTwvY29kZT4gd2hlbiBhcHBsaWVkIHRvIHN0YXRlLWZpZWxkcyBvZiBmbG9hdGluZyBwb2ludCB0eXBlczsgPGNvZGU+QmlnSW50ZWdlcjwvY29kZT4gd2hlbiBhcHBsaWVkIHRvIHN0YXRlLWZpZWxkcyBvZiB0eXBlIDxjb2RlPkJpZ0ludGVnZXI8L2NvZGU+OyBhbmQgPGNvZGU+QmlnRGVjaW1hbDwvY29kZT4gd2hlbiBhcHBsaWVkIHRvIHN0YXRlLWZpZWxkcyBvZiB0eXBlIDxjb2RlPkJpZ0RlY2ltYWw8L2NvZGU+LiBJZiA8Yj5TVU08L2I+LCA8Yj5BVkc8L2I+LCA8Yj5NQVg8L2I+LCBvciA8Yj5NSU48L2I+IGlzIHVzZWQsIGFuZCB0aGVyZSBhcmUgbm8gdmFsdWVzIHRvIHdoaWNoIHRoZSBhZ2dyZWdhdGUgZnVuY3Rpb24gY2FuIGJlIGFwcGxpZWQsIHRoZSByZXN1bHQgb2YgdGhlIGFnZ3JlZ2F0ZSBmdW5jdGlvbiBpcyA8Y29kZT5OVUxMPC9jb2RlPi4gSWYgPGNvZGU+Q09VTlQ8L2NvZGU+IGlzIHVzZWQsIGFuZCB0aGVyZSBhcmUgbm8gdmFsdWVzIHRvIHdoaWNoIDxiPkNPVU5UPC9iPiBjYW4gYmUgYXBwbGllZCwgdGhlIHJlc3VsdCBvZiB0aGUgYWdncmVnYXRlIGZ1bmN0aW9uIGlzIDAuCi1UUkFJTElORz1UcmltIGZyb20gdHJhaWxpbmcgZW5kLgotVFJJTT1UaGUgPGI+VFJJTTwvYj4gZnVuY3Rpb24gdHJpbXMgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIgZnJvbSBhIHN0cmluZy4gSWYgdGhlIGNoYXJhY3RlciB0byBiZSB0cmltbWVkIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGlzIGFzc3VtZWQgdG8gYmUgc3BhY2UgKG9yIGJsYW5rKS4gVGhlIG9wdGlvbmFsIDxjb2RlPnRyaW1fY2hhcmFjdGVyPC9jb2RlPiBpcyBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIGxpdGVyYWwgb3IgYSBjaGFyYWN0ZXItdmFsdWVkIGlucHV0IHBhcmFtZXRlciAoaS5lLiwgY2hhciBvciBDaGFyYWN0ZXIpLiBJZiBhIHRyaW0gc3BlY2lmaWNhdGlvbiBpcyBub3QgcHJvdmlkZWQsIDxiPkJPVEg8L2I+IGlzIGFzc3VtZWQuIFRoZSA8Yj5UUklNPC9iPiBmdW5jdGlvbiByZXR1cm5zIHRoZSB0cmltbWVkIHN0cmluZy4KLVVQREFURT1BbiB1cGRhdGUgc3RhdGVtZW50IHByb3ZpZGUgYnVsayBvcGVyYXRpb25zIG92ZXIgc2V0cyBvZiBlbnRpdGllcy4KLVVQUEVSPVRoZSA8Yj5VUFBFUjwvYj4gZnVuY3Rpb24gY29udmVydHMgYSBzdHJpbmcgdG8gdXBwZXIgY2FzZSBhbmQgaXQgcmV0dXJucyBhIHN0cmluZy4KLVdIRVJFPVRoZSA8Yj5XSEVSRTwvYj4gY2xhdXNlIG9mIGEgcXVlcnkgY29uc2lzdHMgb2YgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIHVzZWQgdG8gc2VsZWN0IG9iamVjdHMgb3IgdmFsdWVzIHRoYXQgc2F0aXNmeSB0aGUgZXhwcmVzc2lvbi4gVGhlIDxiPldIRVJFPC9iPiBjbGF1c2UgcmVzdHJpY3RzIHRoZSByZXN1bHQgb2YgYSBzZWxlY3Qgc3RhdGVtZW50IG9yIHRoZSBzY29wZSBvZiBhbiB1cGRhdGUgb3IgZGVsZXRlIG9wZXJhdGlvbi4KLQotIyBKUEEgMi4wIGlkZW50aWZpZXJzCi1DQVNFPUEgPGI+Q0FTRTwvYj4gZXhwcmVzc2lvbiBjYW4gaW5jbHVkZSBhbnkgbnVtYmVyIG9mIGFueSBudW1iZXIgb2YgPGI+V0hFTi9USEVOPC9iPiBzdGF0ZW1lbnQgcGFpcnMgYW5kIHJldHVybnMgb25lIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIG1hcCBvciB0aGUgZGVmYXVsdCBpdGVtLCBldmFsdWF0aW5nIHRoZSBtYXAga2V5IGV4cHJlc3Npb25zIHRvIGRlY2lkZSB3aGljaC4KLUNPQUxFU0NFPUEgPGI+Q09BTEVTQ0U8L2I+IGV4cHJlc3Npb24gcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiBhbGwgaXRzIGFyZ3VtZW50cyBldmFsdWF0ZSB0byA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3Qgbm9uLTxjb2RlPm51bGw8L2NvZGU+IGFyZ3VtZW50IG90aGVyd2lzZS48cD48cD5UaGUgcmV0dXJuIHR5cGUgaXMgdGhlIHR5cGUgcmV0dXJuZWQgYnkgdGhlIGFyZ3VtZW50cyBpZiB0aGV5IGFyZSBhbGwgb2YgdGhlIHNhbWUgdHlwZSwgb3RoZXJ3aXNlIGl0IGlzIHVuZGV0ZXJtaW5lZC4KLUVOVFJZPVVzZSA8Yj5FTlRSWTwvYj4gaW4gdGhlIDxiPkZST008L2I+IGNsYXVzZSBvZiBhIDxiPk1BUDwvYj4uIAotSU5ERVg9VGhlIDxiPklOREVYPC9iPiBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVnZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcG9zaXRpb24gb2YgaXRzIGFyZ3VtZW50IGluIGFuIG9yZGVyZWQgbGlzdC4gVGhlIDxiPklOREVYPC9iPiBmdW5jdGlvbiBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlcyBkZW5vdGluZyB0eXBlcyBmb3Igd2hpY2ggYW4gb3JkZXIgY29sdW1uIGhhcyBiZWVuIHNwZWNpZmllZC4KLUtFWT1Vc2UgPGI+S0VZPC9iPiBpbiB0aGUgPGI+U0VMRUNUPC9iPiBjbGF1c2Ugb3IgdGhlIDxiPldIRVJFPC9iPiBjbGF1c2Ugb2YgYSA8Yj5NQVA8L2I+LiAKLU5VTExJRj08Yj5OVUxMSUY8L2I+IHJldHVybnMgdGhlIGZpcnN0IGV4cHJlc3Npb24gaWYgdGhlIHR3byBleHByZXNzaW9ucyBhcmUgbm90IGVxdWFsLiBJZiB0aGUgZXhwcmVzc2lvbnMgYXJlIGVxdWFsLCA8Yj5OVUxMSUY8L2I+IHJldHVybnMgYSBudWxsIHZhbHVlIG9mIHRoZSB0eXBlIG9mIHRoZSBmaXJzdCBleHByZXNzaW9uLjxwPjxwPjxiPk5VTExJRjwvYj4gaXMgZXF1aXZhbGVudCB0byBhIHNlYXJjaGVkIDxiPkNBU0U8L2I+IGV4cHJlc3Npb24gaW4gd2hpY2ggdGhlIHR3byBleHByZXNzaW9ucyBhcmUgZXF1YWwgYW5kIHRoZSByZXN1bHRpbmcgZXhwcmVzc2lvbiBpcyA8Yj5OVUxMPC9iPi48cD48cD5SZXR1cm5zIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGZpcnN0IGV4cHJlc3Npb24uCi1UWVBFPUFuIGVudGl0eSB0eXBlIGV4cHJlc3Npb24gY2FuIGJlIHVzZWQgdG8gcmVzdHJpY3QgcXVlcnkgcG9seW1vcnBoaXNtLiBUaGUgPGI+VFlQRTwvYj4gb3BlcmF0b3IgcmV0dXJucyB0aGUgZXhhY3QgdHlwZSBvZiB0aGUgYXJndW1lbnQuCi1WQUxVRT1Vc2UgPGI+VkFMVUU8L2I+IGluIHRoZSA8Yj5TRUxFQ1Q8L2I+IGNsYXVzZSBvciB0aGUgPGI+V0hFUkU8L2I+IGNsYXVzZSBvZiBhIDxiPk1BUDwvYj4uIAotCi0jIEVjbGlwc2VMaW5rIGlkZW50aWZpZXJzCi1GVU5DPVVzZSA8Yj5GVU5DPC9iPiBmb3IgZGlyZWN0LCBuYXRpdmUgZGF0YWJhc2UgZnVuY3Rpb25zLgotVFJFQVQ9PGI+VFJFQVQ8L2I+IGRvd25jYXN0cyBjaGlsZCBjbGFzc2VzIGluIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KLQotIyBSZXNlcnZlZCBKUFFMIGlkZW50aWZpZXJzCi1CSVRfTEVOR1RIPVRoZSBpZGVudGlmaWVyIDxiPkJJVF9MRU5HVEg8L2I+IGlzIG5vdCBjdXJyZW50bHkgdXNlZDogaXQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi1DSEFSX0xFTkdUSD1UaGUgaWRlbnRpZmllciA8Yj5DSEFSX0xFTkdUSDwvYj4gaXMgbm90IGN1cnJlbnRseSB1c2VkOiBpdCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLUNIQVJBQ1RFUl9MRU5HVEg9VGhlIGlkZW50aWZpZXIgPGI+Q0hBUkFDVEVSX0xFTkdUSDwvYj4gaXMgbm90IGN1cnJlbnRseSB1c2VkOiBpdCBpcyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLUNMQVNTPVRoZSBpZGVudGlmaWVyIDxiPkNMQVNTPC9iPiBpcyBub3QgY3VycmVudGx5IHVzZWQ6IGl0IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgotUE9TSVRJT049VGhlIGlkZW50aWZpZXIgPGI+UE9TSVRJT048L2I+IGlzIG5vdCBjdXJyZW50bHkgdXNlZDogaXQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi1VTktOT1dOPVRoZSBpZGVudGlmaWVyIDxiPlVOS05PV048L2I+IGlzIG5vdCBjdXJyZW50bHkgdXNlZDogaXQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZS5wcm9wZXJ0aWVzIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9wcm9wZXJ0eV9maWxlcy9qcHRfdWlfcGVyc2lzdGVuY2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljZGM3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nX2phclBhdGhIZWxwTGFiZWw9VGhlIGNvcnJlY3QgcGF0aCB0byB0aGUgSkFSIGZpbGUgc2VsZWN0ZWQgd2lsbCB2YXJ5IG9uIHlvdXIgcnVudGltZSBlbnZpcm9ubWVudC4gIFlvdSBtYXkgYWx0ZXIgaXQgaGVyZSB0byBjb3JyZWN0bHkgcmVmbGVjdCB5b3VyIHBhcnRpY3VsYXIgZW52aXJvbm1lbnQuCi1BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZ19qYXJQYXRoTGFiZWw9SkFSIGZpbGUgcGF0aDoKLQotUGVyc2lzdGVuY2VFZGl0b3JfcGFnZV9oZWxwPUhlbHAKLVBlcnNpc3RlbmNlRWRpdG9yX3NvdXJjZVRhYj1Tb3VyY2UKLQotUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9kZXNjcmlwdGlvbj1TcGVjaWZ5IHRoZSBsaXN0IG9mIGNsYXNzZXMgdG8gYmUgbWFuYWdlZCBpbiB0aGlzIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXM9RXhjbHVkZSB1bmxpc3RlZCBjbGFzc2VzCi1QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNXaXRoRGVmYXVsdD1FeGNsdWRlIHVubGlzdGVkIGNsYXNzZXMgKHswfSkKLVBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfbWFwcGVkQ2xhc3Nlc05vTmFtZT08bmFtZSBub3Qgc2V0PgotUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9vcGVuPU9wZW4KLQotUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfZGVmYXVsdD1EZWZhdWx0KEpUQSkKLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX2p0YT1KVEEKLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsPVJlc291cmNlIExvY2FsCi0KLVBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfY29ubmVjdGlvbj1Db25uZWN0aW9uCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlX2RhdGFiYXNlPURhdGFiYXNlCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlX2dlbmVyYWw9R2VuZXJhbAotCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfanRhRGF0YXNvdXJjZU5hbWU9SlRBIGRhdGEgc291cmNlIG5hbWU6Ci1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfbm9uSnRhRGF0YXNvdXJjZU5hbWU9Tm9uLUpUQSBkYXRhIHNvdXJjZSBuYW1lOgotCi1QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGU9VHJhbnNhY3Rpb24gdHlwZToKLQotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9nZW5lcmFsPUdlbmVyYWwKLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfamFyRmlsZXM9SkFSIEZpbGVzCi1QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2pwYU1hcHBpbmdEZXNjcmlwdG9ycz1YTUwgTWFwcGluZyBGaWxlcwotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qcGFNYXBwaW5nRGVzY3JpcHRvcnNfZGVzY3JpcHRpb249U3BlY2lmeSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgZm9yIHRoaXMgcGVyc2lzdGVuY2UgdW5pdC4KLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfbWFwcGVkQ2xhc3Nlcz1NYW5hZ2VkIENsYXNzZXMKLVBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfbmFtZT1OYW1lOgotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9wZXJzaXN0ZW5jZVByb3ZpZGVyPVBlcnNpc3RlbmNlIHByb3ZpZGVyOgotUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLQotUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGVfbm9GaWxlTmFtZT08RmlsZSBuYW1lIG5vdCBzZXQ+Ci1QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfamFyRmlsZURpYWxvZ190aXRsZT1KQVIgRmlsZSBTZWxlY3Rpb24KLVBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX21lc3NhZ2U9Q2hvb3NlIGEgSkFSIGZpbGUgdG8gYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi0KLVBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ19tZXNzYWdlPUNob29zZSB0aGUgWE1MIG1hcHBpbmcgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQuCi1QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfbWFwcGluZ0ZpbGVEaWFsb2dfdGl0bGU9SlBBIFhNTCBNYXBwaW5nIEZpbGUgU2VsZWN0aW9uCi1QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfb3JtTm9OYW1lPTxuYW1lIG5vdCBzZXQ+Ci0KLVBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfbmFtZUNvbHVtbj1OYW1lCi1QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3Byb3BlcnRpZXM9UHJvcGVydGllcwotUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9wcm9wZXJ0aWVzX2Rlc2NyaXB0aW9uPVRoaXMgdGFibGUgbGlzdHMgYWxsIHByb3BlcnRpZXMgdGhhdCBhcmUgZGVmaW5lZCBmb3IgdGhpcyBwZXJzaXN0ZW5jZSB1bml0LgotUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV92YWx1ZUNvbHVtbj1WYWx1ZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlMl8wLnByb3BlcnRpZXMgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV9wZXJzaXN0ZW5jZTJfMC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWE0NDA4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3BlcnNpc3RlbmNlMl8wLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3ggPSBEYXRhYmFzZQotCi1EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZV9qdGFEYXRhU291cmNlTGFiZWwgPSBKVEEgZGF0YSBzb3VyY2U6Ci1EYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZV9ub25KdGFEYXRhU291cmNlTGFiZWwgPSBOb24tSlRBIGRhdGEgc291cmNlOgotCi1HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZV9zZWN0aW9uVGl0bGUgPSBQZXJzaXN0ZW5jZSBVbml0IENvbm5lY3Rpb24KLUdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlX3NlY3Rpb25EZXNjcmlwdGlvbiA9IENvbmZpZ3VyZSB0aGUgZGF0YSBzb3VyY2Ugb3IgSkRCQyBjb25uZWN0aW9uIHByb3BlcnRpZXMuCi0KLUpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX01lc3NhZ2UgPSAmRW50ZXIgY29ubmVjdGlvbiBuYW1lIG9yIHBhdHRlcm4gKCosID8sIG9yIGNhbWVsIGNhc2UpOgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUgPSBDb25uZWN0aW9uIFNlbGVjdGlvbgotR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWJfdGl0bGUgPSBDb25uZWN0aW9uCi0KLUdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uVGl0bGUgPSBNaXNjZWxsYW5lb3VzIE9wdGlvbnMKLUdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb24gPSBDb25maWd1cmUgdGhlIG1pc2NlbGxhbmVvdXMgb3B0aW9ucy4KLUdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiX3RpdGxlID0gT3B0aW9ucwotR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfbm9OYW1lID0gPG5hbWUgbm90IHNldD4KLQotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3BvcHVsYXRlRnJvbUNvbm5lY3Rpb25IeXBlckxpbmsgPQlQb3B1bGF0ZSBmcm9tIGNvbm5lY3Rpb24uLi4KLUpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9kcml2ZXJMYWJlbCA9IERyaXZlcjoKLUpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV91cmxMYWJlbCA9IFVSTDoKLUpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV91c2VyTGFiZWwgPSBVc2VyOgotSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3Bhc3N3b3JkTGFiZWwgPSBQYXNzd29yZDoKLQotSmRiY1Byb3BlcnRpZXNDb21wb3NpdGVfSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzX0dyb3VwQm94ID0gSkRCQyBjb25uZWN0aW9uIHByb3BlcnRpZXMKLQotTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGVfbG9ja1RpbWVvdXRMYWJlbCA9IExvY2sgdGltZW91dDoKLVF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZV9xdWVyeVRpbWVvdXRMYWJlbCA9IFF1ZXJ5IHRpbWVvdXQ6Ci0KLVRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGVMYWJlbCA9IFRyYW5zYWN0aW9uIHR5cGU6Ci0KLVRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9qdGEgPSBKVEEKLVRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9yZXNvdXJjZV9sb2NhbCA9IFJlc291cmNlIExvY2FsCi0KLVNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9zaGFyZWRDYWNoZU1vZGVMYWJlbCA9IFNoYXJlZCBjYWNoZSBtb2RlOgotCi1TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfYWxsID0gQWxsCi1TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfbm9uZSA9IE5vbmUKLVNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9lbmFibGVfc2VsZWN0aXZlID0gRW5hYmxlIFNlbGVjdGl2ZQotU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2Rpc2FibGVfc2VsZWN0aXZlID0gRGlzYWJsZSBTZWxlY3RpdmUKLVNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV91bnNwZWNpZmllZCA9IFVuc3BlY2lmaWVkCi0KLVZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX3ZhbGlkYXRpb25Nb2RlTGFiZWwgPSBWYWxpZGF0aW9uIG1vZGU6Ci0KLVZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX2F1dG8gPSBBdXRvCi1WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV9jYWxsYmFjayA9IENhbGxiYWNrCi1WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV9ub25lID0gTm9uZQotCi1WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVBlcnNpc3RMYWJlbCA9IFZhbGlkYXRlIHByZS1wZXJzaXN0IGdyb3VwOgotVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVVcGRhdGVMYWJlbCA9IFZhbGlkYXRlIHByZS11cGRhdGUgZ3JvdXA6Ci1WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9ncm91cFByZVJlbW92ZUxhYmVsID0gVmFsaWRhdGUgcHJlLXJlbW92ZSBncm91cDoKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3ZhbGlkYXRpb25fcHJlZmVyZW5jZXMucHJvcGVydGllcyBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvcHJvcGVydHlfZmlsZXMvanB0X3VpX3ZhbGlkYXRpb25fcHJlZmVyZW5jZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhMDk3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3Byb3BlcnR5X2ZpbGVzL2pwdF91aV92YWxpZGF0aW9uX3ByZWZlcmVuY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSNDb250ZW50IGlzIG9yZ2FuaXplZCBiYXNlZCBvbiB0aGUgY2F0ZWdvcmllcyBhbmQgCi0jRW50cmllcyBpbiBlYWNoIGNhdGVnb3JpZXMgYXJlIGxpc3RlZCBhbHBoYWJldGljYWxseS4KLSNJZiBhZGRpbmcgYSBuZXcgZW50cnksIHBsZWFzZSBhZGQgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2F0ZWdvcnkgYXQgdGhlIHJpZ2h0IHBsYWNlLgotCi1QUk9KRUNUX0xFVkVMX0NBVEVHT1JZPVByb2plY3QKLQotTk9fSlBBX1BST0pFQ1Q9UHJvamVjdCBoYXMgSlBBIGZhY2V0LCBidXQgSlBBIHByb2plY3QgY291bGRuJ3QgYmUgY3JlYXRlZDoKLVBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTPU11bHRpcGxlIHBlcnNpc3RlbmNlIHVuaXRzIGRlZmluZWQ6Ci1QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUPU5vIHBlcnNpc3RlbmNlIHVuaXQgZGVmaW5lZDoKLVBFUlNJU1RFTkNFX1hNTF9JTlZBTElEX0NPTlRFTlQ9SW52YWxpZCBjb250ZW50IChubyByb290IG5vZGUpOgotUEVSU0lTVEVOQ0VfWE1MX1VOU1VQUE9SVEVEX0NPTlRFTlQ9UGVyc2lzdGVuY2UueG1sIGZpbGUgZG9lcyBub3QgaGF2ZSBzdXBwb3J0ZWQgY29udGVudCBmb3IgSlBBIHBsYXRmb3JtOgotUFJPSkVDVF9OT19DT05ORUNUSU9OPU5vIGNvbm5lY3Rpb24gc3BlY2lmaWVkIGZvciBwcm9qZWN0OgotUFJPSkVDVF9JTkFDVElWRV9DT05ORUNUSU9OPUNvbm5lY3Rpb24gaXMgbm90IGFjdGl2ZToKLVBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OPUNvbm5lY3Rpb24gZG9lcyBub3QgZXhpc3Q6Ci1QUk9KRUNUX0lOVkFMSURfTElCUkFSWV9QUk9WSURFUj1TZWxlY3RlZCBsaWJyYXJ5IHByb3ZpZGVyIGlzIGludmFsaWQ6Ci1QUk9KRUNUX01VTFRJUExFX1BFUlNJU1RFTkNFX1hNTD1NdWx0aXBsZSBwZXJzaXN0ZW5jZS54bWwgZmlsZXMgaW4gcHJvamVjdDoKLVBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MPU5vIHBlcnNpc3RlbmNlLnhtbCBmaWxlIGZvdW5kIGluIHByb2plY3Q6Ci1YTUxfVkVSU0lPTl9OT1RfTEFURVNUPVhNTCBkb2N1bWVudCB2ZXJzaW9uIG5vdCBtb3N0IHJlY2VudDoKLQotUEVSU0lTVEVOQ0VfVU5JVF9MRVZFTF9DQVRFR09SWT1QZXJzaXN0ZW5jZSB1bml0Ci0KLU1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEE9RXh0cmFuZW91cyBwZXJzaXN0ZW5jZSB1bml0IG1ldGFkYXRhIGZvdW5kOgotUEVSU0lTVEVOVF9UWVBFX0RVUExJQ0FURV9DTEFTUz1EdXBsaWNhdGUgT1JNIGNsYXNzOgotUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQ0xBU1M9RHVwbGljYXRlIEphdmEgY2xhc3M6Ci1QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9KQVJfRklMRT1EdXBsaWNhdGUgSkFSIGZpbGU6Ci1QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9NQVBQSU5HX0ZJTEU9RHVwbGljYXRlIG1hcHBpbmcgZmlsZToKLVBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9DTEFTUz1DbGFzcyBpcyBpbmNsdWRlZCBpbiBhIHBlcnNpc3RlbmNlIHVuaXQgYnV0IGlzIG5vdCBtYXBwZWQ6Ci1QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFPU1hcHBpbmcgZmlsZSBkb2VzIG5vdCBoYXZlIE9STSBjb250ZW50OgotUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORz1UaGUgcGF0aCB0byB0aGUgSkFSIGZpbGUgd2lsbCB2YXJ5OgotUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUz1DbGFzcyBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0pBUl9GSUxFPUpBUiBmaWxlIGNhbm5vdCBiZSByZXNvbHZlZDoKLVBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfTUFQUElOR19GSUxFPU1hcHBpbmcgZmlsZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUz1DbGFzcyBpcyBhbHJlYWR5IHNwZWNpZmllZCBpbiBtYXBwaW5nIGZpbGU6Ci1QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTPVVuc3BlY2lmaWVkIGNsYXNzOgotUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9KQVJfRklMRT1VbnNwZWNpZmllZCBKQVIgZmlsZToKLVBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfTUFQUElOR19GSUxFPVVuc3BlY2lmaWVkIG1hcHBpbmcgZmlsZToKLVBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQ9TWFwcGluZyBmaWxlIGRvZXMgbm90IGhhdmUgc3VwcG9ydGVkIGNvbnRlbnQ6Ci0KLVRZUEVfTEVWRUxfQ0FURUdPUlk9VHlwZQotRU5USVRZX05BTUVfRFVQTElDQVRFRD1FbnRpdHkgbmFtZSBtdXN0IGJlIHVuaXF1ZTogCi1FTlRJVFlfTkFNRV9NSVNTSU5HPUVudGl0eSBuYW1lIGlzIGVtcHR5OgotRU5USVRZX05PX1BLPUVudGl0eSBoYXMgbm8gcHJpbWFyeSBrZXk6Ci1FTlRJVFlfTk9OX1JPT1RfSURfQVRUUklCVVRFX1NQRUNJRklFRD1QcmltYXJ5IGtleSBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCBvbiB0aGUgcm9vdCBlbnRpdHkgb3IgYSBtYXBwZWQgc3VwZXJjbGFzczoKLUVOVElUWV9OT05fUk9PVF9JRF9DTEFTU19TUEVDSUZJRUQ9SUQgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgZGVmaW5lZCBvbiB0aGUgcm9vdCBlbnRpdHkgb3IgYSBtYXBwZWQgc3VwZXJjbGFzczoKLVBFUlNJU1RFTlRfVFlQRV9BTk5PVEFURURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUPUNsYXNzIGlzIGFubm90YXRlZCwgYnV0IGlzIG5vdCBpbiBhIHBlcnNpc3RlbmNlIHVuaXQ6Ci1QRVJTSVNURU5UX1RZUEVfTUFQUEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVD1DbGFzcyBpcyBtYXBwZWQsIGJ1dCBpcyBub3QgaW4gYSBwZXJzaXN0ZW5jZSB1bml0OgotUEVSU0lTVEVOVF9UWVBFX1VOUkVTT0xWRURfQ0xBU1M9Q2xhc3MgaW4gb3JtLnhtbCBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSBqYXZhIGNsYXNzOgotUEVSU0lTVEVOVF9UWVBFX1VOU1BFQ0lGSUVEX0NMQVNTPUNsYXNzIGlzIHVuc3BlY2lmaWVkIGluIG9ybS54bWw6Ci1UQVJHRVRfTk9UX0FOX0VNQkVEREFCTEU9VGFyZ2V0IHR5cGUgb2YgYW4gZW1iZWRkZWQgbWFwcGluZyBpcyBub3QgYW4gZW1iZWRkYWJsZToKLVRZUEVfTUFQUElOR19DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUj1NYXBwZWQgSmF2YSBjbGFzcyBoYXMgbm8gbm8tYXJnIGNvbnN0cnVjdG9yOgotVFlQRV9NQVBQSU5HX0NMQVNTX1BSSVZBVEVfTk9fQVJHX0NPTlNUUlVDVE9SPU1hcHBlZCBKYXZhIGNsYXNzIGhhcyBhIHByaXZhdGUgbm8tYXJnIGNvbnN0cnVjdG9yOgotVFlQRV9NQVBQSU5HX0ZJTkFMX0NMQVNTPU1hcHBlZCBKYXZhIGNsYXNzIGlzIGZpbmFsOgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FORF9FTUJFRERFRF9JRF9CT1RIX1VTRUQ9SUQgY2xhc3MgYW5kIGVtYmVkZGVkIElEIG1hcHBpbmcgYXJlIG5vdCBhbGxvd2VkIHRvIHVzZSB0b2dldGhlcjoKLVRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfRE9FU19OT1RfRVhJU1Q9UHJpbWFyeSBrZXkgYXR0cmlidXRlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBJRCBjbGFzcyBhdHRyaWJ1dGU6Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX01BUFBJTkdfRFVQTElDQVRFX01BVENIPVByaW1hcnkga2V5IGF0dHJpYnV0ZSBpcyBhIGR1cGxpY2F0ZSBtYXRjaCBmb3IgSUQgY2xhc3M6Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX01BUFBJTkdfTk9fTUFUQ0g9Tm8gSUQgY2xhc3MgYXR0cmlidXRlIG1hdGNoZXMgcHJpbWFyeSBrZXkgYXR0cmlidXRlOgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9OT19NQVRDSD1ObyBwcmltYXJ5IGtleSBhdHRyaWJ1dGUgbWF0Y2hlcyBJRCBjbGFzcyBhdHRyaWJ1dGU6Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX05PVF9QUklNQVJZX0tFWT1BdHRyaWJ1dGUgbWF0Y2hpbmcgSUQgY2xhc3MgYXR0cmlidXRlIGlzIG5vdCBtYXBwZWQgYXMgYSBwcmltYXJ5IGtleToKLVRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9BR1JFRT1BdHRyaWJ1dGUgbWF0Y2hpbmcgSUQgY2xhc3MgYXR0cmlidXRlIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3QgdHlwZToKLVRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX0VRVUFMU19NRVRIT0Q9SUQgY2xhc3MgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGVxdWFscygpIGRlZmluZWQ6Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0Q9SUQgY2xhc3MgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIGhhc2hDb2RlKCkgZGVmaW5lZDoKLVRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX05PX0FSR19DT05TVFJVQ1RPUj1JRCBjbGFzcyBoYXMgbm8gbm8tYXJnIGNvbnN0cnVjdG9yIGRlZmluZWQ6Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19QVUJMSUNfTk9fQVJHX0NPTlNUUlVDVE9SPUlEIGNsYXNzIG11c3QgaGF2ZSBhIHB1YmxpYyBuby1hcmcgY29uc3RydWN0b3I6Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTkFNRV9FTVBUWT1JRCBjbGFzcyBoYXMgYW4gZW1wdHkgbmFtZToKLVRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfRVhJU1Q9SUQgY2xhc3MgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoOgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9JTVBMRU1FTlRfU0VSSUFMSVpBQkxFPUlEIGNsYXNzIG11c3QgaW1wbGVtZW50IFwiamF2YS5pby5TZXJpYWxpemFibGVcIiBpbnRlcmZhY2U6Ci1UWVBFX01BUFBJTkdfSURfQ0xBU1NfTk9UX1BVQkxJQz1JRCBjbGFzcyBtdXN0IGJlIHB1YmxpYzoKLVRZUEVfTUFQUElOR19JRF9DTEFTU19QUk9QRVJUWV9NRVRIT0RfTk9UX1BVQkxJQz1UaGUgcHJvcGVydHkgbWV0aG9kIG9mIElEIGNsYXNzIG11c3QgYmUgcHVibGljOgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFREVGSU5FRD1JRCBjbGFzcyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQgb24gYW4gYW5jZXN0b3Igb2YgYSBjbGFzczoKLVRZUEVfTUFQUElOR19JRF9DTEFTU19SRVFVSVJFRD1JRCBjbGFzcyBtdXN0IGJlIHVzZWQgd2hlbiBtdWx0aXBsZSBJRCBtYXBwaW5ncyBkZWZpbmVkOgotVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1dJVEhfTUFQU19JRD0iTWFwcyBJZCIgaXMgbm90IGFsbG93ZWQgdG8gdXNlIGluIGNvbmp1bmN0aW9uIHdpdGggYW4gSUQgY2xhc3M6Ci1UWVBFX01BUFBJTkdfTUFQU19JRF9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9BR1JFRT1UeXBlIG9mICJNYXBzIElEIiBhdHRyaWJ1dGUgZG9lcyBub3QgYWdyZWUgd2l0aCBwcmltYXJ5IGtleSBjbGFzcyBvZiB0YXJnZXQgZW50aXR5OgotVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTUz1NYXBwZWQgSmF2YSBjbGFzcyBpcyBhIG1lbWJlciBjbGFzczoKLVRZUEVfTUFQUElOR19NVUxUSVBMRV9FTUJFRERFRF9JRD1Pbmx5IG9uZSBlbWJlZGRlZCBJRCBtYXBwaW5nIGlzIGFsbG93ZWQ6Ci1UWVBFX01BUFBJTkdfUEtfUkVERUZJTkVEX0lEX0FUVFJJQlVURT1ObyBJRCBtYXBwaW5nIGFsbG93ZWQgb24gYSBjbGFzcyB3aGVuIGl0cyBhbmNlc3RvciBhbHJlYWR5IGRlZmluZXMgcHJpbWFyeSBrZXk6Ci1UWVBFX01BUFBJTkdfUEtfUkVERUZJTkVEX0lEX0NMQVNTPU5vIElEIGNsYXNzIGFsbG93ZWQgb24gYSBjbGFzcyB3aGVuIGl0cyBhbmNlc3RvciBhbHJlYWR5IGRlZmluZXMgcHJpbWFyeSBrZXk6Ci0KLUFUVFJJQlVURV9MRVZFTF9DQVRFR09SWT1BdHRyaWJ1dGUKLQotRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19ET0VTX05PVF9FWElTVD1FbGVtZW50IGNvbGxlY3Rpb24gdGFyZ2V0IGNsYXNzIGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aDoKLUVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEU9RWxlbWVudCBjb2xsZWN0aW9uIHRhcmdldCBjbGFzcyBpcyBub3QgZW1iZWRkYWJsZSBvciBiYXNpYyB0eXBlOgotRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRD1FbGVtZW50IGNvbGxlY3Rpb24gdGFyZ2V0IGNsYXNzIGlzIG5vdCBzcGVjaWZpZWQ6Ci1FTUJFRERFRF9JRF9NQVBQSU5HX01BUFBFRF9CWV9SRUxBVElPTlNISVBfQU5EX0FUVFJJQlVURV9PVkVSUklERVNfU1BFQ0lGSUVEPUVtYmVkZGVkIElEcyB0aGF0IGFyZSBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAgc2hvdWxkIG5vdCBzcGVjaWZ5IGFueSBhdHRyaWJ1dGUgb3ZlcnJpZGVzOgotSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9DT0xVTU5fU1BFQ0lGSUVEPUlEcyB0aGF0IGFyZSBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAgc2hvdWxkIG5vdCBzcGVjaWZ5IGEgY29sdW1uOgotTUFQU19JRF9WQUxVRV9JTlZBTElEPSJNYXBzIElEIiBhdHRyaWJ1dGUgdmFsdWUgaW52YWxpZDoKLU1BUFNfSURfVkFMVUVfTk9UX1JFU09MVkVEPSJNYXBzIElEIiBhdHRyaWJ1dGUgdmFsdWUgbm90IHJlc29sdmVkOgotTUFQU19JRF9WQUxVRV9OT1RfU1BFQ0lGSUVEPSJNYXBzIElEIiBhdHRyaWJ1dGUgdmFsdWUgbm90IHNwZWNpZmllZDoKLU1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlk9QXR0cmlidXRlIGhhcyBpbnZhbGlkIG1hcHBpbmcgZm9yIHRoaXMgcmVsYXRpb25zaGlwOgotTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUz1SZWxhdGlvbnNoaXAgbXVzdCBoYXZlIGFuIG93bmVyOgotTUFQUElOR19NQVBQRURfQllfV0lUSF9KT0lOX1RBQkxFPUNhbm5vdCBzcGVjaWZ5IGpvaW4gdGFibGUgaWYgYXR0cmlidXRlIGlzIG1hcHBlZCBieSBhbm90aGVyIGF0dHJpYnV0ZToKLU1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlk9Q2Fubm90IHJlc29sdmUgYXR0cmlidXRlIG5hbWU6Ci1PUkRFUl9DT0xVTU5fQU5EX09SREVSX0JZX0JPVEhfU1BFQ0lGSUVEPU9yZGVyQ29sdW1uIGFuZCBPcmRlckJ5IGFubm90YXRpb25zIGFyZSBib3RoIHNwZWNpZmllZDoKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEU9RWxlbWVudCBjb2xsZWN0aW9uIHZhbHVlIHR5cGUgaXMgaW52YWxpZCBmb3IgYSBUZW1wb3JhbCBtYXBwaW5nOiAKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEPVRoZSBqYXZhIGZpZWxkIGZvciBhdHRyaWJ1dGUgaXMgZmluYWw6Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9HRVRURVI9VGhlIGphdmEgZ2V0dGVyIGZvciBhdHRyaWJ1dGUgaXMgZmluYWw6Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9JTkhFUklURURfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVEPUluIG9ybS54bWwgcmVmZXJlbmNlZCBpbmhlcml0ZWQgYXR0cmlidXRlIG1heSBub3QgYmUgc3VwcG9ydGVkOgotUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HPUF0dHJpYnV0ZSBoYXMgaW52YWxpZCBtYXBwaW5nIHR5cGU6Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUFBJTkdfVFlQRT1QZXJzaXN0ZW5jZSBmaWVsZC9wcm9wZXJ0eSB0eXBlIGlzIGludmFsaWQgZm9yIGEgVGVtcG9yYWwgbWFwcGluZzoKLVBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQX0tFWV9UWVBFPVBlcnNpc3RlbmNlIGZpZWxkL3Byb3BlcnR5IG1hcCBrZXkgdHlwZSBpcyBpbnZhbGlkIGZvciBhIFRlbXBvcmFsIG1hcHBpbmc6Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1ZFUlNJT05fTUFQUElOR19UWVBFPVBlcnNpc3RlbmNlIGZpZWxkL3Byb3BlcnR5IHR5cGUgaXMgaW52YWxpZCBmb3IgYSBWZXJzaW9uIG1hcHBpbmc6Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9QVUJMSUNfRklFTEQ9VGhlIGphdmEgZmllbGQgZm9yIGF0dHJpYnV0ZSBpcyBwdWJsaWM6Ci1QRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUU9QXR0cmlidXRlIGluIG9ybS54bWwgY2Fubm90IGJlIHJlc29sdmVkIGluIHRoZSBqYXZhIGNsYXNzOgotUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRT1BdHRyaWJ1dGUgaW4gb3JtLnhtbCBoYXMgdW5zcGVjaWZpZWQgbmFtZToKLVRBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWT1UYXJnZXQgZW50aXR5IGlzIG5vdCBhbiBFbnRpdHk6Ci1UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEPVRhcmdldCBlbnRpdHkgaXMgbm90IGRlZmluZWQ6Ci1UQVJHRVRfRU5USVRZX05PVF9FWElTVD1UYXJnZXQgZW50aXR5IGRvZXMgbm90IGV4aXN0IG9uIHRoZSBwcm9qZWN0IGNsYXNzcGF0aDoKLU1BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQ9TWFwIGtleSBjbGFzcyBub3QgZGVmaW5lZDoKLU1BUF9LRVlfQ0xBU1NfTk9UX0VYSVNUPU1hcCBrZXkgY2xhc3MgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoOgotCi1WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX0RPRVNfTk9UX0VYSVNUPUVsZW1lbnQgY29sbGVjdGlvbiB0YXJnZXQgY2xhc3MgZG9lcyBub3QgZXhpc3Qgb24gdGhlIHByb2plY3QgY2xhc3NwYXRoOgotVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19NVVNUX0JFX0VNQkVEREFCTEVfT1JfQkFTSUNfVFlQRT1FbGVtZW50IGNvbGxlY3Rpb24gdGFyZ2V0IGNsYXNzIGlzIG5vdCBlbWJlZGRhYmxlIG9yIGJhc2ljIHR5cGU6Ci1WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX05PVF9ERUZJTkVEPUVsZW1lbnQgY29sbGVjdGlvbiB0YXJnZXQgY2xhc3MgaXMgbm90IHNwZWNpZmllZDoKLVZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWT1UYXJnZXQgZW50aXR5IGlzIG5vdCBhbiBFbnRpdHk6Ci1WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEPVRhcmdldCBlbnRpdHkgaXMgbm90IGRlZmluZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NMQVNTX05PVF9ERUZJTkVEPU1hcCBrZXkgY2xhc3Mgbm90IGRlZmluZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUF9LRVlfVFlQRT1QZXJzaXN0ZW5jZSBmaWVsZC9wcm9wZXJ0eSBtYXAga2V5IHR5cGUgaXMgaW52YWxpZCBmb3IgYSBUZW1wb3JhbCBtYXBwaW5nOgotVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX0lOVkFMSURfVkFMVUVfVFlQRT1FbGVtZW50IGNvbGxlY3Rpb24gdmFsdWUgdHlwZSBpcyBpbnZhbGlkIGZvciBhIFRlbXBvcmFsIG1hcHBpbmc6IAotVklSVFVBTF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBQSU5HX1RZUEU9UGVyc2lzdGVuY2UgZmllbGQvcHJvcGVydHkgdHlwZSBpcyBpbnZhbGlkIGZvciBhIFRlbXBvcmFsIG1hcHBpbmc6Ci0KLQotREFUQUJBU0VfQ0FURUdPUlk9RGF0YWJhc2UKLVRBQkxFX0NBVEVHT1JZPVRhYmxlCi0KLUNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBjb2xsZWN0aW9uIHRhYmxlOgotQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUU9Q29sbGVjdGlvbiB0YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGU6Ci1KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1DYXRhbG9nIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igam9pbiB0YWJsZToKLUpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FPUpvaW4gdGFibGUgY2Fubm90IGJlIHJlc29sdmVkOgotSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgotU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1DYXRhbG9nIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igc2Vjb25kYXJ5IHRhYmxlOgotU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1TZWNvbmRhcnkgdGFibGUgY2Fubm90IGJlIHJlc29sdmVkOgotU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIHNlY29uZGFyeSB0YWJsZToKLVRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1DYXRhbG9nIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGU6Ci1UQUJMRV9VTlJFU09MVkVEX05BTUU9VGFibGUgY2Fubm90IGJlIHJlc29sdmVkOgotVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE9U2NoZW1hIGNhbm5vdCBiZSByZXNvbHZlZCBmb3IgdGFibGU6Ci0KLVZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HPUNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBjb2xsZWN0aW9uIHRhYmxlOgotVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUU9Q29sbGVjdGlvbiB0YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPVNjaGVtYSBjYW5ub3QgYmUgcmVzb2x2ZWQgZm9yIGNvbGxlY3Rpb24gdGFibGU6Ci1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1DYXRhbG9nIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igam9pbiB0YWJsZToKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FPUpvaW4gdGFibGUgY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQT1TY2hlbWEgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgotCi1DT0xVTU5fQ0FURUdPUlk9Q29sdW1uCi0KLUNPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIGNvbHVtbiBub3QgdmFsaWQgZ2l2ZW4gdGhlIGNvbnRleHQ6Ci1DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRT1UYWJsZSBmb3IgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLUlOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW52ZXJzZSBqb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLUlOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9SW52ZXJzZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLUlOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIGZvciBpbnZlcnNlIGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLUlOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUludmVyc2Ugam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gaW4gaW52ZXJzZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1Kb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLUpPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIGZvciBqb2luIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9Sm9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPVJlZmVyZW5jZWQgY29sdW1uIGluIGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLU1BUF9LRVlfQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBmb3IgbWFwIGtleSBjb2x1bW4gaXMgbm90IHZhbGlkOgotTUFQX0tFWV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPU1hcCBrZXkgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZCBvbiB0YWJsZToKLU9SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9T3JkZXIgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPVByaW1hcnkga2V5IGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPVByaW1hcnkga2V5IGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLU1BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9TWFwIGtleSBqb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLU1BUF9LRVlfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPVRhYmxlIGZvciBtYXAga2V5IGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLU1BUF9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9TWFwIGtleSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLU1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPU1hcCBrZXkgam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotTUFQX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9UmVmZXJlbmNlZCBjb2x1bW4gaW4gbWFwIGtleSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci0KLVZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIGNvbHVtbiBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUludmVyc2Ugam9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUludmVyc2Ugam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBmb3IgaW52ZXJzZSBqb2luIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbnZlcnNlIGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPVJlZmVyZW5jZWQgY29sdW1uIGluIGludmVyc2Ugam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9Sm9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1Kb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBmb3Igam9pbiBjb2x1bW4gaXMgbm90IHZhbGlkOgotVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRT1SZWZlcmVuY2VkIGNvbHVtbiBpbiBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9VGFibGUgZm9yIG1hcCBrZXkgY29sdW1uIGlzIG5vdCB2YWxpZDoKLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1NYXAga2V5IGF0dHJpYnV0ZSBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkIG9uIHRhYmxlOgotVklSVFVBTF9BVFRSSUJVVEVfT1JERVJfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1PcmRlciBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9U2Vjb25kYXJ5IHRhYmxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9U2Vjb25kYXJ5IHRhYmxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPVNlY29uZGFyeSB0YWJsZSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU9U2Vjb25kYXJ5IHRhYmxlIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1QcmltYXJ5IGtleSBqb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9UHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1QcmltYXJ5IGtleSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRT1QcmltYXJ5IGtleSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9NQVBfS0VZX0pPSU5fQ09MVU1OUz1NYXAga2V5IGpvaW4gY29sdW1uIG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGVzOgotVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX01BUF9LRVlfSk9JTl9DT0xVTU5TPU1hcCBrZXkgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1UYWJsZSBmb3IgbWFwIGtleSBqb2luIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1NYXAga2V5IGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPVJlZmVyZW5jZWQgY29sdW1uIGluIG1hcCBrZXkgam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotCi1PVkVSUklERVNfQ0FURUdPUlk9QXR0cmlidXRlL2Fzc29jaWF0aW9uIG92ZXJyaWRlcwotSU1QTElFRF9BVFRSSUJVVEVfTEVWRUxfQ0FURUdPUlk9SW1wbGllZCBhdHRyaWJ1dGVzCi0KLUFTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRT1Bc3NvY2lhdGlvbiBvdmVycmlkZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUKLUFUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU9QXR0cmlidXRlIG92ZXJyaWRlIG5hbWUgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZQotQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfVFlQRT1BdHRyaWJ1dGUgb3ZlcnJpZGUgdHlwZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gYXR0cmlidXRlCi1BVFRSSUJVVEVfT1ZFUlJJREVfTUFQUEVEX0JZX1JFTEFUSU9OU0hJUF9BTkRfU1BFQ0lGSUVEPUF0dHJpYnV0ZXMgKG9yIHN1YmF0dHJpYnV0ZXMgb2YgYW4gYXR0cmlidXRlKSBtYXBwZWQgYnkgYSByZWxhdGlvbnNoaXAgc2hvdWxkIG5vdCBiZSBvdmVycmlkZGVuOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU9SW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGUKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgaW52ZXJzZSBqb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgaW52ZXJzZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW1wbGllZCBhc3NvY2lhdGlvbiBvdmVycmlkZSB0YWJsZSBmb3IgaW52ZXJzZSBqb2luIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgaW52ZXJzZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgcmVmZXJlbmNlZCBjb2x1bW4gaW4gaW52ZXJzZSBqb2luIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgam9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIHRhYmxlIGZvciBqb2luIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgcmVmZXJlbmNlZCBjb2x1bW4gaW4gam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRz1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIGNhdGFsb2cgY2Fubm90IGJlIHJlc29sdmVkIGZvciBqb2luIHRhYmxlOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRT1JbXBsaWVkIGFzc29jaWF0aW9uIG92ZXJyaWRlIGpvaW4gdGFibGUgY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BPUltcGxpZWQgYXNzb2NpYXRpb24gb3ZlcnJpZGUgc2NoZW1hIGNhbm5vdCBiZSByZXNvbHZlZCBmb3Igam9pbiB0YWJsZToKLVZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ9SW1wbGllZCBhdHRyaWJ1dGUgb3ZlcnJpZGUgdGFibGUgZm9yIGNvbHVtbiBub3QgdmFsaWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUltcGxpZWQgYXR0cmlidXRlIG92ZXJyaWRlIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU9SW1wbGllZCBhdHRyaWJ1dGUgb3ZlcnJpZGUgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gYXR0cmlidXRlOgotVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUltcGxpZWQgbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdGFibGUgZm9yIGNvbHVtbiBpcyBub3QgdmFsaWQ6Ci1WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRT1JbXBsaWVkIG1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIG5hbWUgY2Fubm90IGJlIHJlc29sdmVkIHRvIGFuIGF0dHJpYnV0ZQotCi1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU9QXNzb2NpYXRpb24gb3ZlcnJpZGUgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gYXR0cmlidXRlCi1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM9QXNzb2NpYXRpb24gb3ZlcnJpZGUgaW52ZXJzZSBqb2luIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUFzc29jaWF0aW9uIG92ZXJyaWRlIGludmVyc2Ugam9pbiBjb2x1bW4gcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM9QXNzb2NpYXRpb24gb3ZlcnJpZGUgaW52ZXJzZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUFzc29jaWF0aW9uIG92ZXJyaWRlIHRhYmxlIGZvciBpbnZlcnNlIGpvaW4gY29sdW1uIGlzIG5vdCB2YWxpZDoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUFzc29jaWF0aW9uIG92ZXJyaWRlIGludmVyc2Ugam9pbiBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM9QXNzb2NpYXRpb24gb3ZlcnJpZGUgam9pbiBjb2x1bW4gbmFtZSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZXM6Ci1WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUz1Bc3NvY2lhdGlvbiBvdmVycmlkZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlczoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1Bc3NvY2lhdGlvbiBvdmVycmlkZSBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRD1Bc3NvY2lhdGlvbiBvdmVycmlkZSB0YWJsZSBmb3Igam9pbiBjb2x1bW4gaXMgbm90IHZhbGlkOgotVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUFzc29jaWF0aW9uIG92ZXJyaWRlIGpvaW4gY29sdW1uIGNhbm5vdCBiZSByZXNvbHZlZDoKLVZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPUF0dHJpYnV0ZSBvdmVycmlkZSB0YWJsZSBmb3IgY29sdW1uIG5vdCB2YWxpZDoKLVZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUF0dHJpYnV0ZSBvdmVycmlkZSBjb2x1bW4gY2Fubm90IGJlIHJlc29sdmVkOgotVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRT1BdHRyaWJ1dGUgb3ZlcnJpZGUgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYW4gYXR0cmlidXRlCi1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEPU1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIHRhYmxlIGZvciBjb2x1bW4gbm90IHZhbGlkOgotVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FPU1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIGNhbm5vdCBiZSByZXNvbHZlZCB0byBhbiBhdHRyaWJ1dGU6Ci1WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPU1hcCBrZXkgYXR0cmlidXRlIG92ZXJyaWRlIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgdG8gYW4gYXR0cmlidXRlOgotVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FPUNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQgb24gdGFibGUgdG8gbWFwIGtleSBhdHRyaWJ1dGUgb3ZlcnJpZGU6Ci0KLUlOSEVSSVRBTkNFX0NBVEVHT1JZPUluaGVyaXRhbmNlCi0KLURJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRT1EaXNjcmltaW5hdG9yIGNvbHVtbiBjYW5ub3QgYmUgcmVzb2x2ZWQ6Ci1FTlRJVFlfQUJTVFJBQ1RfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGFic3RyYWN0IGVudGl0eToKLUVOVElUWV9BQlNUUkFDVF9UQUJMRV9QRVJfQ0xBU1NfREVGSU5FU19UQUJMRT1ObyB0YWJsZSBzaG91bGQgYmUgZGVmaW5lZCBmb3IgYWJzdHJhY3QgZW50aXR5IHVzaW5nIHRhYmxlLXBlci1jb25jcmV0ZS1jbGFzcyBpbmhlcml0YW5jZToKLUVOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNob3VsZCBiZSBkZWZpbmVkIGZvciBub24tcm9vdCBlbnRpdHk6Ci1FTlRJVFlfU0lOR0xFX1RBQkxFX0RFU0NFTkRBTlRfREVGSU5FU19UQUJMRT1ObyB0YWJsZSBzaG91bGQgYmUgZGVmaW5lZCBmb3Igbm9uLXJvb3QgZW50aXR5IHVzaW5nIHNpbmdsZS10YWJsZSBpbmhlcml0YW5jZToKLUVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRD1ObyBkaXNjcmltaW5hdG9yIGNvbHVtbiBzaG91bGQgYmUgZGVmaW5lZCBmb3IgZW50aXR5IHVzaW5nIHRhYmxlLXBlci1jb25jcmV0ZS1jbGFzcyBpbmhlcml0YW5jZToKLUVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEPU5vIGRpc2NyaW1pbmF0b3IgdmFsdWUgc2hvdWxkIGJlIGRlZmluZWQgZm9yIGVudGl0eSB1c2luZyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2U6Ci1FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STT1FbnRpdHkgdXNlcyB0YWJsZS1wZXItY29uY3JldGUtY2xhc3MgaW5oZXJpdGFuY2Ugd2hpY2ggaXMgbm90IHBvcnRhYmxlOgotRU5USVRZX1RBQkxFX1BFUl9DTEFTU19OT1RfU1VQUE9SVEVEX09OX1BMQVRGT1JNPUVudGl0eSBjYW5ub3QgdXNlIHRhYmxlLXBlci1jb25jcmV0ZS1jbGFzcyBpbmhlcml0YW5jZToKLQotUVVFUklFU19HRU5FUkFUT1JTX0NBVEVHT1JZPVF1ZXJpZXMgYW5kIGdlbmVyYXRvcnMKLQotR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FPUR1cGxpY2F0ZSBnZW5lcmF0b3IgZGVmaW5lZDoKLUdFTkVSQVRPUl9OQU1FX1VOREVGSU5FRD1HZW5lcmF0b3IgaXMgdW5uYW1lZDoKLUlEX01BUFBJTkdfVU5SRVNPTFZFRF9HRU5FUkFUT1JfTkFNRT1HZW5lcmF0b3IgaXMgbm90IGRlZmluZWQgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQ6Ci1KUFFMX1FVRVJZX1ZBTElEQVRJT049SW52YWxpZCBvciBpbmNvbXBsZXRlIEpQUUwgcXVlcmllczoKLVFVRVJZX0RVUExJQ0FURV9OQU1FPUR1cGxpY2F0ZSBxdWVyeSBkZWZpbmVkOgotUVVFUllfTkFNRV9VTkRFRklORUQ9UXVlcnkgaXMgdW5uYW1lZDoKLVFVRVJZX1NUQVRFTUVOVF9VTkRFRklORUQ9UXVlcnkgaGFzIG5vIHF1ZXJ5IHN0YXRlbWVudDoKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc2NoZW1hL2pwYVBsYXRmb3JtVWlzLmV4c2QgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NjaGVtYS9qcGFQbGF0Zm9ybVVpcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWY1MTVjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc2NoZW1hL2pwYVBsYXRmb3JtVWlzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuanB0LmpwYS51aSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcGluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpIiBpZD0ianBhUGxhdGZvcm1zIiBuYW1lPSJKUEEgUGxhdGZvcm0gVUlzIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBpbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCAvPgotICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJqcGFQbGF0Zm9ybVVpIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcGluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcGluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImpwYVBsYXRmb3JtVWkiPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIEV4dGVuZCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhbmQgeW91IG11c3QgYWxzbyBleHRlbmQgdGhlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybXMgZXh0ZW5zaW9uIHBvaW50LiAgVGhlIGpwYVBsYXRmb3JtSWQgbXVzdCBtYXRjaCB0aGUgaWQgb2YgYSBjb3JlLmpwYVBsYXRmb3JtIGV4dGVuc2lvbi4gIE9uZSBqcGFQbGF0Zm9ybSB3aWxsIGJlIGNob3NlbiBwZXIgSnBhUHJvamVjdC4gIFRoZSBwb3NzaWJsZSBqcGFQbGF0Zm9ybXMgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIgYXMgYSBwcm9qZWN0IHByb3BlcnR5LgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJqcGFQbGF0Zm9ybSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUganBhUGxhdGZvcm1JZCBtdXN0IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGFQbGF0Zm9ybSBleHRlbnNpb24gaWQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZmFjdG9yeUNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwaW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSI6b3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpRmFjdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBpbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAyLjIKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwaW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlpbmZvIi8+Ci0gICAgICA8L2FwcGluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi11bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi1zdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBpbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBpbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwaW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLVRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLWFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gCi1Db250cmlidXRvcnM6Ci1PcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL0pwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvSnBhUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGUyZGI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyB0byBiZSBpbXBsZW1lbnRlZCBieSBhIEpQQSB2ZW5kb3IgdG8gcHJvdmlkZSBleHRlbnNpb25zIHRvCi0gKiBKUEEgVUkgZnVuY3Rpb25hbGl0eS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gd29yayBpbiBjb25qdW5jdGlvbiB3aXRoIGEgY29yZQotICogSlBBIHBsYXRmb3JtICh7QGxpbmsgSnBhUGxhdGZvcm19KSBpbXBsZW1lbnRhdGlvbiB3aXRoIHRoZSBzYW1lIElELgotICogPHA+Ci0gKiBBbnkgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIDxlbT5zdGF0ZWxlc3M8L2VtPiBpbiBuYXR1cmUuCi0gKiA8cD4KLSAqIFRoZSAiZ2VuZXJpYyIgZXh0ZW5zaW9uIHN1cHBsaWVzIFVJIGZvciB0aGUgY29yZSBwbGF0Zm9ybSBleHRlbnNpb24gd2l0aCB0aGUgc2FtZQotICogSUQuCi0gKgotICogU2VlIHRoZSBleHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUGxhdGZvcm0KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVVpCi17Ci0JLy8gKioqKioqKioqKiBuYXZpZ2F0b3IgcHJvdmlkZXIgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiB0aGUge0BsaW5rIEpwYU5hdmlnYXRvclByb3ZpZGVyfSBmb3IgdGhpcyBwbGF0Zm9ybSwgCi0JICogd2hpY2ggZGV0ZXJtaW5lcyBQcm9qZWN0IEV4cGxvcmVyIGNvbnRlbnQgYW5kIGxvb2sKLQkgKi8KLQlKcGFOYXZpZ2F0b3JQcm92aWRlciBnZXROYXZpZ2F0b3JQcm92aWRlcigpOwotCQotCQotCS8vICoqKioqKioqKiogc3RydWN0dXJlIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogUmV0dXJuIGEgc3RydWN0dXJlIHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIEpQQSBmaWxlLgotCSAqLwotCUpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKEpwYUZpbGUganBhRmlsZSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkSnBhRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlLAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGZpbGUgdWkgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCQotCS8qKgotCSAqIFJldHVybiBhIHJlc291cmNlIHVpIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgdHlwZS4KLQkgKi8KLQlSZXNvdXJjZVVpRGVmaW5pdGlvbiBnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbihKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCQotCUpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgCi0JCQlTdHJpbmcgbWFwcGluZ0tleSwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4KLQkJCWdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQkKLQlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PgotCQkJdHlwZU1hcHBpbmdVaURlZmluaXRpb25zKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOwotCQotCQotCS8vICoqKioqKioqKiogYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQkKLQlKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgCi0JCQlTdHJpbmcgbWFwcGluZ0tleSwgCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCURlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IAotCQkJZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIG1hcHBpbmdLZXkpOwotCQotCUl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+Ci0JCQlhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGVudGl0eSBnZW5lcmF0aW9uICoqKioqKioqKioKLQkKLQl2b2lkIGdlbmVyYXRlRW50aXRpZXMoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pOwotCQotCQotCS8vICoqKioqKioqKiogRERMIGdlbmVyYXRpb24gKioqKioqKioqKgotCQotCXZvaWQgZ2VuZXJhdGVEREwoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9KcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9KcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmVmZDc5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBidWlsZCBhIEpwYVBsYXRmb3JtVWkuCi0gKgotICogU2VlIHRoZSBleHRlbnNpb24gcG9pbnQ6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUGxhdGZvcm0KLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCUpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9KcGFQbGF0Zm9ybVVpUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFhMDY0ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgSlBBIHZlbmRvciB0byBwcm92aWRlIGV4dGVuc2lvbnMgdG8KLSAqIEpQQSBVSSBmdW5jdGlvbmFsaXR5LiAgVGhpcyBpcyBpbnRlbmRlZCB0byB3b3JrIGluIGNvbmp1bmN0aW9uIHdpdGggYSBjb3JlCi0gKiBKUEEgcGxhdGZvcm0gKHtAbGluayBKcGFQbGF0Zm9ybX0pIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIHNhbWUgSUQuCi0gKiA8cD4KLSAqIEFueSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgPGVtPnN0YXRlbGVzczwvZW0+IGluIG5hdHVyZS4KLSAqIDxwPgotICogVGhlICJnZW5lcmljIiBleHRlbnNpb24gc3VwcGxpZXMgVUkgZm9yIHRoZSBjb3JlIHBsYXRmb3JtIGV4dGVuc2lvbiB3aXRoIHRoZSBzYW1lCi0gKiBJRC4KLSAqCi0gKiBTZWUgdGhlIGV4dGVuc2lvbiBwb2ludDogb3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQbGF0Zm9ybVVpcwotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCS8qKgotCSAqIFJldHVybiB0aGUgZGV0YWlscyBwcm92aWRlcnMgdGhhdCBhcHBseSB0byB0aGlzIHBsYXRmb3JtLgotCSAqLwotCUxpc3RJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHJlc291cmNlIHVpIGRlZmluaXRpb25zIHRoYXQgYXBwbHkgdG8gdGhpcyBwbGF0Zm9ybS4KLQkgKi8KLQlMaXN0SXRlcmF0b3I8UmVzb3VyY2VVaURlZmluaXRpb24+IHJlc291cmNlVWlEZWZpbml0aW9ucygpOwotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9KcHRKcGFVaVBsdWdpbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9KcHRKcGFVaVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2EwZTZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvSnB0SnBhVWlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBEYWxpIFVJIHBsdWctaW4uCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcHRKcGFVaVBsdWdpbgotCWV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbgotewotCXByaXZhdGUgZmluYWwgTGlzdGVuZXIgZm9jdXNMaXN0ZW5lcjsKLQotCi0JLy8gKioqKioqKioqKiBjb25zdGFudHMgKioqKioqKioqKgotCi0JLyoqCi0JICogVGhlIHBsdWctaW4gaWRlbnRpZmllciBvZiBKUEEgVUkgc3VwcG9ydCAodmFsdWUge0B2YWx1ZX0pLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLnVpIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSURfID0gUExVR0lOX0lEICsgJy4nOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPQ1VTX0RBVEFfS0VZID0gUExVR0lOX0lEXyArICJmb2N1cyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IEZPQ1VTX0RBVEEgPSBuZXcgT2JqZWN0KCk7Ci0KLQotCS8vICoqKioqKioqKiogUHJlZmVyZW5jZSBrZXlzICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoZSBwcmVmZXJlbmNlIGtleSB1c2VkIHRvIHJldHJpZXZlIHRoZSBjYXNlIHVzZWQgZm9yIEpQUUwgaWRlbnRpZmllcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBRTF9JREVOVElGSUVSX0NBU0VfUFJFRl9LRVkgPSBQTFVHSU5fSUQgKyAiLmpwcWxJZGVudGlmaWVyLmNhc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQUUxfSURFTlRJRklFUl9MT1dFUkNBU0VfUFJFRl9WQUxVRSA9ICJsb3dlcmNhc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQUUxfSURFTlRJRklFUl9VUFBFUkNBU0VfUFJFRl9WQUxVRSA9ICJ1cHBlcmNhc2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQUUxfSURFTlRJRklFUl9NQVRDSF9GSVJTVF9DSEFSQUNURVJfQ0FTRV9QUkVGX0tFWSA9IFBMVUdJTl9JRCArICIuanBxbElkZW50aWZpZXIubWF0Y2hGaXJzdENoYXJhY3RlckNhc2UiOwotCi0KLQkvLyAqKioqKioqKioqIHNpbmdsZXRvbiAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBKcHRKcGFVaVBsdWdpbiBJTlNUQU5DRTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBKUFQgVUkgcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwdEpwYVVpUGx1Z2luIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxvZ2dpbmcgKioqKioqKioqKgotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKFN0cmluZyBtc2cpIHsKLSAgICAgICAgbG9nKG1zZywgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlsb2codGhyb3dhYmxlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgdGhyb3dhYmxlKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBzdGF0dXMuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotICAgICAgICBJTlNUQU5DRS5nZXRMb2coKS5sb2coc3RhdHVzKTsKLSAgICB9Ci0KLQotCS8vICoqKioqKioqKiogaW1hZ2VzICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIDxjb2RlPi5naWY8Y29kZT4KLQkgKiBmaWxlIGluIHRoZSBpY29ucyBmb2xkZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBrZXkpIHsKLQkJaWYgKCAhIGtleS5zdGFydHNXaXRoKCJpY29ucy8iKSkgewotCQkJa2V5ID0gImljb25zLyIgKyBrZXk7Ci0JCX0KLQkJaWYgKCAhIGtleS5lbmRzV2l0aCgiLmdpZiIpKSB7Ci0JCQlrZXkgPSBrZXkgKyAiLmdpZiI7Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBrZXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiBpbWFnZSBmb3IgdGhlIHNwZWNpZmllZCA8Y29kZT4uZ2lmPGNvZGU+Ci0JICogZmlsZSBpbiB0aGUgaWNvbnMgZm9sZGVyLgotCSAqLwotCS8vVE9ETyB3ZSBhcmUgdXNpbmcgdGhlIEltYWdlUmVnaXN0cnkgaGVyZSBhbmQgc3RvcmluZyBhbGwgb3VyIGljb25zIGZvciB0aGUgbGlmZSBvZiB0aGUgcGx1Z2luLAotCS8vd2hpY2ggbWVhbnMgdW50aWwgdGhlIHdvcmtzcGFjZSBpcyBjbG9zZWQuICBUaGlzIGlzIGJldHRlciB0aGFuIGJlZm9yZSB3aGVyZSB3ZSBjb25zdGFudGx5Ci0JLy9jcmVhdGVkIG5ldyBpbWFnZXMuIEJ1ZyAzMDY0MzcgaXMgYWJvdXQgY2xlYW5pbmcgdGhpcyB1cCBhbmQgdXNpbmcgTG9jYWwgUmVzb3VyY2UgTWFuYWdlcnMKLQkvL29uIG91ciB2aWV3cyBzbyB0aGF0IGNsb3NpbmcgdGhlIEpQQSBwZXJzcGVjdGl2ZSB3b3VsZCBtZWFuIG91ciBpY29ucyBhcmUgZGlzcG9zZWQuCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcga2V5KSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCQlJbWFnZSBpbWFnZSA9IGltYWdlUmVnaXN0cnkuZ2V0KGtleSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LnB1dChrZXksIGdldEltYWdlRGVzY3JpcHRvcihrZXkpKTsKLQkJCWltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0SnBhVWlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZm9jdXNMaXN0ZW5lciA9IHRoaXMuYnVpbGRGb2N1c0xpc3RlbmVyKCk7Ci0JCWlmIChJTlNUQU5DRSAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFdlIGFyZSByZWdpc3RlcmVkIHRvIHJlY2VpdmUgb25seSB7QGxpbmsgU1dUI0ZvY3VzSW59IGV2ZW50cwotCSAqLwotCXByaXZhdGUgTGlzdGVuZXIgYnVpbGRGb2N1c0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi50aGlzLmZvY3VzSW4oKENvbnRyb2wpIGV2ZW50LndpZGdldCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGZvY3VzIGhhbmRsaW5nICoqKioqKioqKioKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhICJmb2N1cyBpbiIgZXZlbnQgaXMgZ2VuZXJhdGVkLgotCSAqIElmIHRoZSBjb250cm9sIGdhaW5pbmcgZm9jdXMgaXMgcGFydCBvZiBvbmUgb2Ygb3VyIGNvbXBvc2l0ZXMgKHR5cGljYWxseQotCSAqIGEgSlBBIERldGFpbHMgVmlldyksIHdlIHN0b3AgbGlzdGVuaW5nIHRvIEphdmEgY2hhbmdlIGV2ZW50cwotCSAqIChhbmQgYXNzdW1lIGFsbCBjaGFuZ2VzIHRvIHRoZSBKYXZhIG1vZGVsIGFyZSBnZW5lcmF0ZWQgYnkgdXMpLgotCSAqIElmIHRoZSBjb250cm9sIGdhaW5pbmcgZm9jdXMgaXMgKm5vdCogcGFydCBvZiBvbmUgb2Ygb3VyIGNvbXBvc2l0ZXMsCi0JICogd2Ugc3RhcnQgbGlzdGVuaW5nIHRvIHRoZSBKYXZhIGNoYW5nZSBldmVudHMgYWdhaW4uCi0JICovCi0Jdm9pZCBmb2N1c0luKENvbnRyb2wgY29udHJvbCkgewotCQl3aGlsZSAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udHJvbC5nZXREYXRhKEZPQ1VTX0RBVEFfS0VZKSA9PSBGT0NVU19EQVRBKSB7Ci0JCQkJdGhpcy5mb2N1c0luKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY29udHJvbCA9IGNvbnRyb2wuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJdGhpcy5mb2N1c091dCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIERhbGkgVUkgY29udHJvbCB0aGF0IGFmZmVjdHMgSmF2YQotCSAqIHNvdXJjZSBjb2RlIGdhaW5zIHRoZSBVSSBmb2N1cy4gV2hlbiB0aGlzIGhhcHBlbnMgd2UgZGVhY3RpdmF0ZQotCSAqIHRoZSBEYWxpIEphdmEgY2hhbmdlIGxpc3RlbmVyIHNvIHdlIGlnbm9yZSBhbnkgY2hhbmdlcyB0byB0aGUgSmF2YQotCSAqIHNvdXJjZSBjb2RlIHRoYXQgcHJvYmFibHkgb3JpZ2luYXRlZCBmcm9tIERhbGkuIFRoaXMgbWVhbnMgd2Ugd2lsbCBtaXNzCi0JICogYW55IGNoYW5nZXMgdG8gdGhlIEphdmEgc291cmNlIGNvZGUgdGhhdCBpcyBjYXVzZWQgYnkgbm9uLVVJIGFjdGl2aXR5OwotCSAqIGJ1dCwgd2UgaG9wZSwgdGhlc2UgY2hhbmdlcyBhcmUgdW5yZWxhdGVkIHRvIEpQQSBhbm5vdGF0aW9ucyBldGMuCi0JICogQHNlZSAjZm9jdXNPdXQoKQotCSAqLwotCXByaXZhdGUgdm9pZCBmb2N1c0luKCkgewotCQlKcHRKcGFDb3JlUGx1Z2luLnNldEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW5ldmVyIGEgbm9uLURhbGkgVUkgY29udHJvbCBnYWlucyB0aGUgVUkgZm9jdXMuCi0JICogV2hlbiB0aGlzIGhhcHBlbnMgd2UgYWN0aXZhdGUgdGhlIERhbGkgSmF2YSBjaGFuZ2UgbGlzdGVuZXIgc28gdGhhdCB3ZQotCSAqIGJlZ2luIHRvIGtlZXAgdGhlIERhbGkgbW9kZWwgc3luY2hyb25pemVkIHdpdGggdGhlIEphdmEgc291cmNlIGNvZGUuCi0JICogQHNlZSAjZm9jdXNJbigpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZvY3VzT3V0KCkgewotCQlKcHRKcGFDb3JlUGx1Z2luLnNldEphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXJJc0FjdGl2ZSh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBUYWcgdGhlIHNwZWNpZmllZCBjb250cm9sIHNvIHRoYXQgd2hlbmV2ZXIgaXQgKG9yIGFueSBvZiBpdHMgY2hpbGRyZW4sCi0JICogZ3JhbmRjaGlsZHJlbiwgZXRjLikgaGFzIHRoZSBmb2N1cywgdGhlIERhbGkgbW9kZWwgaWdub3JlcyBhbnkgSmF2YQotCSAqIGNoYW5nZSBldmVudHMuIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIGlzIGZpcnN0Ci0JICogY29uc3RydWN0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgY29udHJvbEFmZmVjdHNKYXZhU291cmNlKENvbnRyb2wgY29udHJvbCkgewotCQljb250cm9sLnNldERhdGEoRk9DVVNfREFUQV9LRVksIEZPQ1VTX0RBVEEpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwbGF0Zm9ybSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIEpQQSBwbGF0Zm9ybSBVSSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgSlBBIHBsYXRmb3JtLgotCSAqLwotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoSnBhUGxhdGZvcm0ganBhUGxhdGZvcm0pIHsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkoanBhUGxhdGZvcm0uZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIEpwYU5hdmlnYXRvclByb3ZpZGVyIGdldEpwYU5hdmlnYXRvclByb3ZpZGVyKEpwYVBsYXRmb3JtIGpwYVBsYXRmb3JtKSB7Ci0JCUpwYVBsYXRmb3JtVWkgcGxhdGZvcm0gPSB0aGlzLmdldEpwYVBsYXRmb3JtVWkoanBhUGxhdGZvcm0pOwotCQlyZXR1cm4gKHBsYXRmb3JtID09IG51bGwpID8gbnVsbCA6IHBsYXRmb3JtLmdldE5hdmlnYXRvclByb3ZpZGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHBsdWctaW4gaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JLyoqCi0JICogUmVnaXN0ZXIgb3VyIFNXVCBsaXN0ZW5lciB3aXRoIHRoZSBkaXNwbGF5IHNvIHdlIHJlY2VpdmUgbm90aWZpY2F0aW9uCi0JICogb2YgZXZlcnkgImZvY3VzIGluIiBldmVudC4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYWRkRmlsdGVyKFNXVC5Gb2N1c0luLCB0aGlzLmZvY3VzTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFVucmVnaXN0ZXIgb3VyIFNXVCBsaXN0ZW5lciB3aXRoIHRoZSBkaXNwbGF5LgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnJlbW92ZUZpbHRlcihTV1QuRm9jdXNJbiwgdGhpcy5mb2N1c0xpc3RlbmVyKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL01hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE4NDkwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24gZXh0ZW5kcyBSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8qKgotCSAqIAotCSAqLwotCUpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlTdHJpbmcga2V5LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGl0ZXJhdG9yIG9mIGF0dHJpYnV0ZSBtYXBwaW5nIHVpIGRlZmluaXRpb25zIGFwcHJvcHJpYXRlIGZvciB0aGlzIGZpbGUgdHlwZQotCSAqLwotCUl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IAotCQkJYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm4gYSBkZWZhdWx0IGF0dHJpYnV0ZSBtYXBwaW5nIHVpIGRlZmluaXRpb24gZm9yIHRoZSBnaXZlbiBrZXkgb3IgbnVsbAotCSAqLwotCURlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IAotCQkJZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIGtleSk7Ci0JCi0JLyoqCi0JICogCi0JICovCi0JSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlTdHJpbmcga2V5LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IAotCQkJdHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIGEgZGVmYXVsdCB0eXBlIG1hcHBpbmcgdWkgcHJvdmlkZXIgb3IgbnVsbAotCSAqLwotCURlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IAotCQkJZ2V0RGVmYXVsdFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL1BlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWQ0YWI2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvUGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uIGV4dGVuZHMgUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQlMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL1Jlc291cmNlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmN2EyZTguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9SZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotLyoqCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGlzIGRlZmluaXRpb24gcHJvdmlkZXMgVUkgZm9yIHJlc291cmNlIG9mIHRoZSBnaXZlbiB0eXBlCi0JICovCi0JYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3RydWN0dXJlIHByb3ZpZGVyIGFzc29jaWF0aW9uIHdpdGggdGhpcyBtYXBwaW5nIGZpbGUgdHlwZS4KLQkgKi8KLQlKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL0RlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTcwNmMyYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHM7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLQlleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQkvKioKLQkgKiBSZXR1cm5zIGEgdW5pcXVlIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgaW4gdGhlCi0JICogY29yZS4gIEZvciBhIGRlZmF1bHQgbWFwcGluZyB0aGUgbWV0aG9kIGdldEtleSgpIHdpbGwgcmV0dXJuIG51bGwgc2luY2UKLQkgKiB0aGF0IGlzIGZvciB0aGUgc3BlY2lmaWVkIG1hcHBpbmcuICBUaGlzIHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IG1hcHBpbmcga2V5LCBub3QgbnVsbAotCSAqLwotCVN0cmluZyBnZXREZWZhdWx0S2V5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvSnBhQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvSnBhQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YTM0YzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL0pwYUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLS8qKgotICogQSB7QGxpbmsgSnBhQ29tcG9zaXRlfSBkZWZpbmVzIHRoZSBjb21tb24gYmVoYXZpb3Igb2YgdGhlIEpQQSByZWxhdGVkCi0gKiB3aWRnZXRzLgotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYUNvbXBvc2l0ZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3R1YWwgPGNvZGU+Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEByZXR1cm4gVGhpcyBjb21wb3NpdGUncyBhY3R1YWwgd2lkZ2V0Ci0JICovCi0JQ29udHJvbCBnZXRDb250cm9sKCk7Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBlbmFibGVtZW50IHN0YXRlIG9mIHRoZSB3aWRnZXRzIG9mIHRoaXMgcGFuZS4KLQkgKgotCSAqIEBwYXJhbSBlbmFibGVkIDxjb2RlPnRydWU8L2NvZGU+IHRvIGVuYWJsZSB0aGUgd2lkZ2V0cyBvciA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiB0byBkaXNhYmxlIHRoZW0KLQkgKi8KLQl2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKTsKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29tcG9zaXRlIGl0IHNob3VsZCBkaXNwb3NlIGFueSByZXNvdXJjZXMuCi0JICovCi0Jdm9pZCBkaXNwb3NlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL0pwYURldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvSnBhRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ZDRkOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvSnBhRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLQotLyoqCi0gKiBBIGRldGFpbHMgcGFnZSBpcyB1c2VkIHRvIHNob3cgdGhlIHByb3BlcnR5IHBhbmUgZm9yIGEgZ2l2ZW4gY29udGV4dCBub2RlLiBUaGUKLSAqIHtAbGluayBKcGFEZXRhaWxzUHJvdmlkZXJ9IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgcGFuZS4KLSAqCi0gKiBAc2VlIEpwYURldGFpbHNQcm92aWRlcgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICogCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKcGFEZXRhaWxzUGFnZTxUIGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4KLXsKLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgZGV0YWlscycgcGFnZSdzIHdpZGdldC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGNvbnRhaW5lciBvZiB0aGUgd2lkZ2V0cyBzaG93biBieSB0aGlzIGRldGFpbHMgcGFnZQotCSAqLwotCUNvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc3ViamVjdCBmb3IgdGhpcyBkZXRhaWxzIHBhZ2UuCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdCBFaXRoZXIgdGhlIG5ldyBzdWJqZWN0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBzdWJqZWN0Ci0JICogbmVlZHMgdG8gYmUgcmVtb3ZlZAotCSAqLwotCXZvaWQgc2V0U3ViamVjdChUIHN1YmplY3QpOwotCQotCS8qKgotCSAqIERpc3Bvc2UgdGhlIGRldGFpbHMgcGFnZSBhbmQgYW55IHJlc291cmNlcyBpdCBob2xkcy4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvSnBhRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzExY2YuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL0pwYURldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KLSAqIHJlc3BvbnNpYmxlIHRvIHNob3cgdGhlIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGNvbnRlbnQgbm9kZSBpZC4KLSAqCi0gKiBAc2VlIEpwYURldGFpbHNQYWdlCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMi4wCi0gKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBwcm92aWRlciByZXR1cm5zIGEgZGV0YWlscyBwYWdlIGZvciB0aGUgZ2l2ZW4gc3RydWN0dXJlIG5vZGUKLQkgKi8KLQlib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZGV0YWlscyBwYWdlIGJhc2VkIG9uIHRoZSBnaXZlbiBjb250ZW50IG5vZGUgaWQuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGNvbnRlbnROb2RlSWQgVGhlIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGRldGFpbHMKLQkgKiBwYWdlIHRvIGNyZWF0ZQotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgd2lkZ2V0cwotCSAqLwotCS8vVE9ETyBTaG91bGQgd2UgcGFzcyBpbiBKcGFVaUZhY3Rvcnkgc28gdGhlc2UgcGFnZXMgY2FuIGJlIGJ1aWx0IHVzaW5nIHRoZSBmYWN0b3J5IGFuZCBvdmVycmlkZW4/Ci0JSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9KcGFQYWdlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvSnBhUGFnZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTI4ZTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9KcGFQYWdlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotCi0vKioKLSAqIEEge0BsaW5rIEpwYVBhZ2VDb21wb3NpdGV9IGRlZmluZXMgdGhlIGNvbW1vbiBiZWhhdmlvciBvZiB0aGUgSlBBCi0gKiByZWxhdGVkIHdpZGdldHMgdGhhdCBpcyBzaG93biBhcyBhIHBhZ2Ugd2l0aGluIGFuIGVkaXRvci4KLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUGFnZUNvbXBvc2l0ZSBleHRlbmRzIEpwYUNvbXBvc2l0ZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoZWxwIElELiBUaGlzIElEIHdpbGwgYmUgdXNlZCBpZiB0aGUgaGVscCBidXR0b24gaXMgaW52b2tlZC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBoZWxwIElEIG9mIHRoaXMgcGFnZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBoZWxwCi0JICogaXMgcmVxdWlyZWQKLQkgKi8KLQlTdHJpbmcgZ2V0SGVscElEKCk7Ci0KLQkvKioKLQkgKiBUaGUgaW1hZ2Ugb2YgdGhlIHRhYiBzaG93aW5nIHRoaXMgcGFnZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhZ2UncyBpbWFnZQotCSAqLwotCUltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCk7Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBvZiB0aGUgdGFiIHNob3dpbmcgdGhpcyBwYWdlLgotCSAqCi0JICogQHJldHVybiBUaGUgcGFnZSdzIHRleHQKLQkgKi8KLQlTdHJpbmcgZ2V0UGFnZVRleHQoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQyN2YwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0vKioKLSAqIEEgVUkgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgdG8gcHJvdmlkZSB0aGUgc3VwcG9ydCBmb3IgZGlzcGxheWluZyB0aGUKLSAqIGluZm9ybWF0aW9uIGZvciBhIGNlcnRhaW4gbWFwcGluZyB0eXBlLgotICogCi0gKiBUIHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgdGhlIG1hcHBpbmcgdGhlIGRlZmluaXRpb24gcmVwcmVzZW50cwotICogTSByZXByZXNlbnRzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QgYmVpbmcgbWFwcGVkCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQkvKioKLQkgKiBSZXR1cm5zIGEgdW5pcXVlIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgb2YgdGhlIG1hcHBpbmcgaW4gdGhlCi0JICogY29yZSAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uIGFuZC9vciBPcm1BdHRyaWJ1dGVNYXBwaW5nUHJvdmlkZXIpLgotCSAqCi0JICogQHJldHVybiBUaGUga2V5IHJlcHJlc2VudGluZyB0aGUgbWFwcGluZwotCSAqLwotCVN0cmluZyBnZXRLZXkoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgdGV4dCBvZiB0aGUgbWFwcGluZyB0eXBlLgotCSAqCi0JICogQHJldHVybiBBIGRpc3BsYXkgc3RyaW5nIGZvciB0aGUgbWFwcGluZyB0eXBlCi0JICovCi0JU3RyaW5nIGdldExhYmVsKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaHVtYW4gcmVhZGFibGUgdGV4dCBvZiB0aGUgbWFwcGluZyB0eXBlIHRvIGJlIHVzZWQgaW4gdGhlIG1hcHBpbmcgY2hhbmdlIGxpbmsgbGFiZWwKLQkgKi8KLQlTdHJpbmcgZ2V0TGlua0xhYmVsKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIG1hcHBpbmcgdHlwZSBkZWZpbmVkIGJ5IHRoaXMgcHJvdmlkZXIuCi0JICoKLQkgKiBAcmV0dXJuIEFuIGltYWdlIHJlcHJlc2VudGluZyBhIG1hcHBpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW1hZ2UKLQkgKiBpcyByZXF1aXJlZAotCSAqLwotCUltYWdlIGdldEltYWdlKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhlIG1hcHBpbmcgdHlwZSByZXByZXNlbnRlZCBieSB0aGlzIGRlZmluaXRpb24gaXMgZW5hYmxlZCBmb3IgdGhlIGdpdmVuCi0JICogbWFwcGFibGUgb2JqZWN0LiAgVGhpcyBpcyBhbG1vc3QgYWx3YXlzIHRydWUuCi0JICovCi0JLy8gVE9ETyBianYgcmVtb3ZlIHRoaXM7IGVpdGhlcgotCS8vIC0gZGVsZWdhdGUgdG8gd2hhdGV2ZXIgY29udHJvbHMgdGhlIGxpc3Qgb2YgVUkgZGVmaW5pdGlvbnMgc28gaXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgRWNsaXBzZUxpbmsKLQkvLyBvcgotCS8vIC0gZGVsZWdhdGUgdG8gdGhlIG1vZGVsIGRlZmluaXRpb25zIChpZiB3ZSB0aGluayB0aGVyZSBhcmUgbW9yZSBleHRlbmRzIHRoYXQgbmVlZCB0aGlzLi4uKQotCWJvb2xlYW4gaXNFbmFibGVkRm9yKE0gbWFwcGFibGVPYmplY3QpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL2phdmEvRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmNzgxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248VCBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IAotCWV4dGVuZHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248VD4sIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgVD4KLXsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9qYXZhL0RlZmF1bHRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzNmI5ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvamF2YS9EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgVHlwZU1hcHBpbmc+Ci0JZXh0ZW5kcyBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248VD4sIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCBUPgotewotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvamF2YS9KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2E3M2E2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9qYXZhL0phdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBQcm92aXNpb25hbCBBUEk6IFRoaXMgaW50ZXJmYWNlIGlzIHBhcnQgb2YgYW4gaW50ZXJpbSBBUEkgdGhhdCBpcyBzdGlsbAotICogdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZwotICogc3RhYmlsaXR5LiBJdCBpcyBhdmFpbGFibGUgYXQgdGhpcyBlYXJseSBzdGFnZSB0byBzb2xpY2l0IGZlZWRiYWNrIGZyb20KLSAqIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkKLSAqIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBicm9rZW4gKHJlcGVhdGVkbHkpIGFzIHRoZSBBUEkgZXZvbHZlcy4KLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4KLQlleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBUPgotewotCS8qKgotCSAqIENyZWF0ZXMgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgbWFwcGluZyB0eXBlLgotCSAqIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4KLQkgKiB3aGVuIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4gYnkgdGhpcyBwcm92aWRlci4gVGhlCi0JICogY29tcG9zaXRlcyB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgotCSAqCi0JICogQHBhcmFtIGZhY3RvcnkgVGhlIFVJIGZhY3RvcnkgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSByaWdodCBjb21wb3NpdGUKLQkgKiBmb3IgYW55IG1hcHBpbmcgdHlwZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgYmVpbmcgZGlzcGxheWVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcmV0dXJuIFRoZSBjb21wb3NpdGUgZGlzcGxheWluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nCi0JICovCi0JSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvamF2YS9KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9qYXZhL0phdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTgzYTQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9qYXZhL0phdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4KLQlleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBtYXBwaW5nIHR5cGUuCi0JICogVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBieSB0aGUgPGNvZGU+UGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTwvY29kZT4gd2hlbgotCSAqIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4gYnkgdGhpcyBwcm92aWRlci4gVGhlIGNvbXBvc2l0ZXMKLQkgKiB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgotCSAqCi0JICogQHBhcmFtIGZhY3RvcnkgVGhlIFVJIGZhY3RvcnkgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSByaWdodCBjb21wb3NpdGUKLQkgKiBmb3IgYW55IG1hcHBpbmcgdHlwZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgYmVpbmcgZGlzcGxheWVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcmV0dXJuIFRoZSBjb21wb3NpdGUgZGlzcGxheWluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nCi0JICovCi0JSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL2phdmEvSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL2phdmEvSmF2YVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Y4NjY2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9qYXZhL0phdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFVzZSB7QGxpbmsgSmF2YVVpRmFjdG9yeX0gdG8gY3JlYXRlIGFueSBqYXZhIEpQQSBjb21wb3NpdGVzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBKYXZhVWlGYWN0b3J5Ci17CQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YU1hcHBlZFN1cGVyY2xhc3M8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFwcGVkIHN1cGVyY2xhc3MKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgamF2YSBlbnRpdHkKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFFbWJlZGRhYmxlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGFibGUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1NYXBwZWRTdXBlcmNsYXNzPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hcHBlZCBzdXBlcmNsYXNzCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW50aXR5PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG9ybSBlbnRpdHkKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW50aXR5Q29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1FbWJlZGRhYmxlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGFibGUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhSWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIElEIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFFbWJlZGRlZElkTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRlZCBJRCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YUJhc2ljTWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBiYXNpYyBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFCYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhVmVyc2lvbk1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdmVyc2lvbiBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGEgPGNvZGU+SmF2YU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBvbmUgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhT25lVG9NYW55TWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBvbmUgdG8gbWFueSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFPbmVUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG9uZSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgbWFueSB0byBtYW55IG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYSA8Y29kZT5KYXZhRW1iZWRkZWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGVkIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkphdmFUcmFuc2llbnRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHRyYW5zaWVudCBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9kZXRhaWxzL29ybS9Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ODYxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvb3JtL09ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwKLSAqIHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcKLSAqIHN0YWJpbGl0eS4gSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tCi0gKiBwaW9uZWVyaW5nIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJCi0gKiB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxUIGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4KLQlleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBUPgotewotCS8qKgotCSAqIENyZWF0ZXMgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgbWFwcGluZyB0eXBlLgotCSAqIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4KLQkgKiB3aGVuIHRoZSBtYXBwaW5nIGtleSBtYXRjaGVzIHRoZSBrZXkgZ2l2ZW4gYnkgdGhpcyBwcm92aWRlci4gVGhlCi0JICogY29tcG9zaXRlcyB3aWxsIGJlIHN0b3JlZCBpbiBhIE1hcCB3aXRoIHRoZSBtYXBwaW5nIGtleSBhcyB0aGUga2V5LgotCSAqCi0JICogQHBhcmFtIGZhY3RvcnkgVGhlIFVJIGZhY3RvcnkgcmVzcG9uc2libGUgdG8gY3JlYXRlIHRoZSByaWdodCBjb21wb3NpdGUKLQkgKiBmb3IgYW55IG1hcHBpbmcgdHlwZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgYmVpbmcgZGlzcGxheWVkCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMKLQkgKiBAcmV0dXJuIFRoZSBjb21wb3NpdGUgZGlzcGxheWluZyB0aGUgaW5mb3JtYXRpb24gZm9yIGEgY2VydGFpbiBtYXBwaW5nCi0JICovCi0JSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9vcm0vT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9vcm0vT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlmOTE4Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvb3JtL09ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFQgZXh0ZW5kcyBUeXBlTWFwcGluZz4KLQlleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHRoYXQgY29ycmVwb25kcyB0byB0aGlzIG1hcHBpbmcgdHlwZS4KLQkgKiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGJ5IHRoZSA8Y29kZT5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPiB3aGVuCi0JICogdGhlIG1hcHBpbmcga2V5IG1hdGNoZXMgdGhlIGtleSBnaXZlbiBieSB0aGlzIHByb3ZpZGVyLiBUaGUgY29tcG9zaXRlcwotCSAqIHdpbGwgYmUgc3RvcmVkIGluIGEgTWFwIHdpdGggdGhlIG1hcHBpbmcga2V5IGFzIHRoZSBrZXkuCi0JICoKLQkgKiBAcGFyYW0gZmFjdG9yeSBUaGUgVUkgZmFjdG9yeSByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIHJpZ2h0IGNvbXBvc2l0ZQotCSAqIGZvciBhbnkgbWFwcGluZyB0eXBlCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCBiZWluZyBkaXNwbGF5ZWQKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHZhcmlvdXMgd2lkZ2V0cwotCSAqIEByZXR1cm4gVGhlIGNvbXBvc2l0ZSBkaXNwbGF5aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBjZXJ0YWluIG1hcHBpbmcKLQkgKi8KLQlKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9vcm0vT3JtWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzFlYWY5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvZGV0YWlscy9vcm0vT3JtWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVXNlIHtAbGluayBPcm1YbWxVaUZhY3Rvcnl9IHRvIGNyZWF0ZSBhbnkgT1JNIEpQQSBjb21wb3NpdGVzCi0gKiA8cD4KLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsIHVuZGVyCi0gKiBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nIHN0YWJpbGl0eS4KLSAqIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbSBwaW9uZWVyaW5nCi0gKiBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSSB3aWxsIGFsbW9zdAotICogY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICoKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5CYXNlSnBhVWlGYWN0b3J5Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgT3JtWG1sVWlGYWN0b3J5Ci17Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtTWFwcGVkU3VwZXJjbGFzczwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBtYXBwZWQgc3VwZXJjbGFzcwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPk9ybUVudGl0eTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBvcm0gZW50aXR5Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW1iZWRkYWJsZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBlbWJlZGRhYmxlCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKgotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtSWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIElEIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW1iZWRkZWRJZE1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgZW1iZWRkZWQgSUQgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtQmFzaWNNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGJhc2ljIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtVmVyc2lvbk1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgdmVyc2lvbiBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1NYW55VG9PbmVNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hbnkgdG8gb25lIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1PbmVUb01hbnlNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG9uZSB0byBtYW55IG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+IHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5Pcm1PbmVUb09uZU1hcHBpbmc8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgb25lIHRvIG9uZSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4gdXNlZCB0byBlZGl0IGFuIDxjb2RlPk9ybU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG1hbnkgdG8gbWFueSBtYXBwaW5nCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB3aWRnZXRzCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+Ci0JICovCi0JSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0JCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtRW1iZWRkZWRNYXBwaW5nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIGVtYmVkZGVkIG1hcHBpbmcKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdGhlIHdpZGdldHMKLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkpwYUNvbXBvc2l0ZTwvY29kZT4KLQkgKi8KLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPiB1c2VkIHRvIGVkaXQgYW4gPGNvZGU+T3JtVHJhbnNpZW50TWFwcGluZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSB0cmFuc2llbnQgbWFwcGluZwotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0Fic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0Fic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NTkxMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9BYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1Byb3ZpZGVyOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSB1aSBwcm92aWRlciBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCXByaXZhdGUgSnBhRGV0YWlsc1Byb3ZpZGVyW10gZGV0YWlsc1Byb3ZpZGVyczsKLQotCXByaXZhdGUgUmVzb3VyY2VVaURlZmluaXRpb25bXSByZXNvdXJjZVVpRGVmaW5pdGlvbnM7Ci0JCi0JLyoqCi0JICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogZGV0YWlscyBwcm92aWRlcnMgKioqKioqKioqKgotCi0JcHVibGljIExpc3RJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8SnBhRGV0YWlsc1Byb3ZpZGVyPihnZXREZXRhaWxzUHJvdmlkZXJzKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEpwYURldGFpbHNQcm92aWRlcltdIGdldERldGFpbHNQcm92aWRlcnMoKSB7Ci0JCWlmICh0aGlzLmRldGFpbHNQcm92aWRlcnMgPT0gbnVsbCkgewotCQkJdGhpcy5kZXRhaWxzUHJvdmlkZXJzID0gdGhpcy5idWlsZERldGFpbHNQcm92aWRlcnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5kZXRhaWxzUHJvdmlkZXJzOwotCX0KLQotCXByb3RlY3RlZCBKcGFEZXRhaWxzUHJvdmlkZXJbXSBidWlsZERldGFpbHNQcm92aWRlcnMoKSB7Ci0JCUFycmF5TGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycyA9IG5ldyBBcnJheUxpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPigpOwotCQl0aGlzLmFkZERldGFpbHNQcm92aWRlcnNUbyhwcm92aWRlcnMpOwotCQlyZXR1cm4gcHJvdmlkZXJzLnRvQXJyYXkobmV3IEpwYURldGFpbHNQcm92aWRlcltwcm92aWRlcnMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50IHRoaXMgdG8gc3BlY2lmeSBKUEEgZGV0YWlscyBwcm92aWRlcnMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpOwotCQotCQotCQotCS8vICoqKioqKioqKiogc3RydWN0dXJlIHByb3ZpZGVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFJlc291cmNlVWlEZWZpbml0aW9uPiByZXNvdXJjZVVpRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlMaXN0SXRlcmF0b3I8UmVzb3VyY2VVaURlZmluaXRpb24+KGdldFJlc291cmNlVWlEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBSZXNvdXJjZVVpRGVmaW5pdGlvbltdIGdldFJlc291cmNlVWlEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMucmVzb3VyY2VVaURlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMucmVzb3VyY2VVaURlZmluaXRpb25zID0gdGhpcy5idWlsZFJlc291cmNlVWlEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLnJlc291cmNlVWlEZWZpbml0aW9uczsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVzb3VyY2VVaURlZmluaXRpb25bXSBidWlsZFJlc291cmNlVWlEZWZpbml0aW9ucygpIHsKLQkJQXJyYXlMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+KCk7Ci0JCXRoaXMuYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOwotCQlyZXR1cm4gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgUmVzb3VyY2VVaURlZmluaXRpb25bZGVmaW5pdGlvbnMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50IHRoaXMgdG8gc3BlY2lmeSBKUEEgbWFwcGluZyBmaWxlIHVpIGRlZmluaXRpb25zLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFkZFJlc291cmNlVWlEZWZpbml0aW9uc1RvKExpc3Q8UmVzb3VyY2VVaURlZmluaXRpb24+IGRlZmluaXRpb25zKTsKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvRWRpdG9yUGFydEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0VkaXRvclBhcnRBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTc1NjdjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvRWRpdG9yUGFydEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotCi0vKioKLSAqIEZhY3RvcnkgdG8gYnVpbGQgYWRhcHRlcnMgZm9yIGEgZWRpdG9yIHBhcnQ6Ci0gKiAgIC0gSlBBIGZpbGUgKGlmIHRoZSBlZGl0b3IgcGFydCBpcyBhIGZpbGUgZWRpdG9yIGV0Yy4pCi0gKiAKLSAqIFNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIHBsdWdpbi54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JQYXJ0QWRhcHRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIElBZGFwdGVyRmFjdG9yeQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+W10gQURBUFRFUl9MSVNUID0gbmV3IENsYXNzW10geyBKcGFGaWxlLmNsYXNzIH07Ci0KLQlwdWJsaWMgQ2xhc3M8Pz5bXSBnZXRBZGFwdGVyTGlzdCgpIHsKLQkJcmV0dXJuIEFEQVBURVJfTElTVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIENsYXNzIGFkYXB0ZXJUeXBlKSB7Ci0JCWlmIChhZGFwdGFibGVPYmplY3QgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0QWRhcHRlcigoSUVkaXRvclBhcnQpIGFkYXB0YWJsZU9iamVjdCwgYWRhcHRlclR5cGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT2JqZWN0IGdldEFkYXB0ZXIoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgQ2xhc3M8Pz4gYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0ZXJUeXBlID09IEpwYUZpbGUuY2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLmdldEpwYUZpbGUoZWRpdG9yUGFydCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBKcGFGaWxlIGdldEpwYUZpbGUoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotCQlJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQgPSBlZGl0b3JQYXJ0LmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCXJldHVybiB0aGlzLmdldEpwYUZpbGUoKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEpwYUZpbGUgZ2V0SnBhRmlsZShJRmlsZUVkaXRvcklucHV0IGZpbGVFZGl0b3JJbnB1dCkgewotCQlyZXR1cm4gdGhpcy5nZXRKcGFGaWxlKGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkpOwotCX0KLQotCXByaXZhdGUgSnBhRmlsZSBnZXRKcGFGaWxlKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDc3YTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9HZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVhtbFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuUGVyc2lzdGVuY2VYbWxVaURlZmluaXRpb247Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgSlBBIHBsYXRmb3JtIHNob3VsZCBiZSAic3RhdGljIiAoaS5lLiB1bmNoYW5naW5nIG9uY2UKLSAqIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtVWlQcm92aWRlcgotewotCi0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhaWxzUHJvdmlkZXJzVG8oTGlzdDxKcGFEZXRhaWxzUHJvdmlkZXI+IHByb3ZpZGVycykgewotCQlwcm92aWRlcnMuYWRkKEphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHJlc291cmNlIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZVVpRGVmaW5pdGlvbnNUbyhMaXN0PFJlc291cmNlVWlEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvSW1hZ2VSZXBvc2l0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0ltYWdlUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTNjZDg1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvSW1hZ2VSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBmaW5hbCBjbGFzcyBJbWFnZVJlcG9zaXRvcnkgewotCi0JLy8gKioqKiogb3ZlcmxheXMgKioqKioKLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEVycm9yT3ZlcmxheUltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgRVJST1JfT1ZFUkxBWV9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEVSUk9SX09WRVJMQVlfREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvdmVybGF5cy9lcnJvci5naWYiKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0V2FybmluZ092ZXJsYXlJbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIFdBUk5JTkdfT1ZFUkxBWV9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIFdBUk5JTkdfT1ZFUkxBWV9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm92ZXJsYXlzL3dhcm5pbmcucG5nIik7Ci0KLQkvLyAqKioqKiBidXR0b25zICoqKioqCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRBZGRCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEFERF9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBBRERfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9hZGQucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEVkaXRCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEVESVRfQlVUVE9OX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgRURJVF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2VkaXQucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldERlbGV0ZUJ1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgREVMRVRFX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIERFTEVURV9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2RlbGV0ZS5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0TW92ZVVwQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBNT1ZFX1VQX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIE1PVkVfVVBfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9tb3ZlLXVwLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRNb3ZlRG93bkJ1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgTU9WRV9ET1dOX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIE1PVkVfRE9XTl9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL21vdmUtZG93bi5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RXhwYW5kQWxsQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBFWFBBTkRfQUxMX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEVYUEFORF9BTExfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9leHBhbmQtYWxsLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRDb2xsYXBzZUFsbEJ1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgQ09MTEFQU0VfQUxMX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIENPTExBUFNFX0FMTF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL2NvbGxhcHNlLWFsbC5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0UmVzdG9yZURlZmF1bHRzQnV0dG9uSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBSRVNUT1JFX0RFRkFVTFRTX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIFJFU1RPUkVfREVGQVVMVFNfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9yZXN0b3JlLWRlZmF1bHRzLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRCcm93c2VCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEJST1dTRV9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBCUk9XU0VfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9icm93c2UucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldE1pbmlCcm93c2VCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIE1JTklfQlJPV1NFX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIE1JTklfQlJPV1NFX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvYnJvd3NlLW1pbmkucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFNlbGVjdEFsbEJ1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgU0VMRUNUX0FMTF9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBTRUxFQ1RfQUxMX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvc2VsZWN0LWFsbC5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RGVzZWxlY3RBbGxCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIERFU0VMRUNUX0FMTF9CVVRUT05fREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBERVNFTEVDVF9BTExfQlVUVE9OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigiYnV0dG9ucy9kZXNlbGVjdC1hbGwucG5nIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFJlZnJlc2hCdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIFJFRlJFU0hfQlVUVE9OX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgUkVGUkVTSF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL3JlZnJlc2guZ2lmIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEFkZENvbm5lY3Rpb25CdXR0b25JbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEFERF9DT05ORUNUSU9OX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEFERF9DT05ORUNUSU9OX0JVVFRPTl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoImJ1dHRvbnMvYWRkLWNvbm5lY3Rpb24uZ2lmIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldFJlY29ubmVjdEJ1dHRvbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgUkVDT05ORUNUX0JVVFRPTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIFJFQ09OTkVDVF9CVVRUT05fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJidXR0b25zL3JlY29ubmVjdC5wbmciKTsKLQotCS8vICoqKioqIG9iamVjdHMgKioqKioKLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEZpbGVJbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEZJTEVfREVTQ1JJUFRPUik7Ci0JfQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEltYWdlRGVzY3JpcHRvciBGSUxFX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib2JqZWN0cy9maWxlLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRGb2xkZXJJbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIEZPTERFUl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEZPTERFUl9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm9iamVjdHMvZm9sZGVyLnBuZyIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRQYWNrYWdlSW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlyZXR1cm4gZ2V0SW1hZ2UocmVzb3VyY2VNYW5hZ2VyLCBQQUNLQUdFX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgUEFDS0FHRV9ERVNDUklQVE9SID0gYnVpbGRJbWFnZURlc2NyaXB0b3IoIm9iamVjdHMvcGFja2FnZS5wbmciKTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0VGFibGVJbWFnZShSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXJldHVybiBnZXRJbWFnZShyZXNvdXJjZU1hbmFnZXIsIFRBQkxFX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgVEFCTEVfREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvYmplY3RzL3RhYmxlLmdpZiIpOwotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnZXRUYWJsZU9iakltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgVEFCTEVfT0JKX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgVEFCTEVfT0JKX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib2JqZWN0cy90YWJsZV9vYmouZ2lmIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldENvbHVtbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgQ09MVU1OX0RFU0NSSVBUT1IpOwotCX0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbWFnZURlc2NyaXB0b3IgQ09MVU1OX0RFU0NSSVBUT1IgPSBidWlsZEltYWdlRGVzY3JpcHRvcigib2JqZWN0cy9jb2x1bW4uZ2lmIik7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEtleUNvbHVtbkltYWdlKFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJcmV0dXJuIGdldEltYWdlKHJlc291cmNlTWFuYWdlciwgS0VZX0NPTFVNTl9ERVNDUklQVE9SKTsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW1hZ2VEZXNjcmlwdG9yIEtFWV9DT0xVTU5fREVTQ1JJUFRPUiA9IGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKCJvYmplY3RzL2NvbHVtbktleS5naWYiKTsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGJ1aWxkSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBmaWxlTmFtZSkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgImltYWdlcy8iICsgZmlsZU5hbWUpOwotCX0KLQotCi0JcHJpdmF0ZSBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciwgSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJcmV0dXJuIHJlc291cmNlTWFuYWdlci5jcmVhdGVJbWFnZShkZXNjcmlwdG9yKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvSnBhSGVscENvbnRleHRJZHMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvSnBhSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQwMzMyMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0pwYUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBEYWxpIEpQQSBVSS4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKcGFIZWxwQ29udGV4dElkcyB7Ci0KLQkvL0NvbnRleHRJRCBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQgKyAiLiI7Ci0KLQkvL1BlcnNpc3RlbnQgVHlwZSBjb21wb3NpdGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0FDQ0VTU19UWVBFID0gUFJFRklYICsgImVudGl0eV9hY2Nlc3NUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQVRUUklCVVRFX09WRVJSSURFUyA9IFBSRUZJWCArICJlbnRpdHlfYXR0cmlidXRlT3ZlcnJpZGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfQVRUUklCVVRFX09WRVJSSURFU19DT0xVTU4gPSBQUkVGSVggKyAiZW50aXR5X2F0dHJpYnV0ZU92ZXJyaWRlc0NvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0NBVEFMT0cgPSBQUkVGSVggKyAiZW50aXR5X2NhdGFsb2ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9JTkhFUklUQU5DRV9TVFJBVEVHWSA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VTdHJhdGVneSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfVFlQRSA9IFBSRUZJWCArICJlbnRpdHlfaW5oZXJpdGFuY2VEaXNjcmltaW5hdG9yVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JDb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9JTkhFUklUQU5DRV9ESVNDUklNSU5BVE9SX1ZBTFVFID0gUFJFRklYICsgImVudGl0eV9pbmhlcml0YW5jZURpc2NyaW1pbmF0b3JWYWx1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUUgPSBQUkVGSVggKyAiZW50aXR5X25hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fUEFDS0FHRSA9IFBSRUZJWCArICJvcm1fcGFja2FnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9TQ0hFTUEgPSBQUkVGSVggKyAib3JtX3NjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX09STV9DQVRBTE9HID0gUFJFRklYICsgIm9ybV9jYXRhbG9nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX0RFTElNSVRFRF9JREVOVElGSUVSUyA9IFBSRUZJWCArICJvcm1fZGVsaW1pdGVkX2lkZW50aWZpZXJzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfT1JNX0NBU0NBREUgPSBQUkVGSVggKyAib3JtX2Nhc2NhZGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PUk1fWE1MID0gUFJFRklYICsgIm9ybV94bWwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9TQ0hFTUEgPSBQUkVGSVggKyAiZW50aXR5X3NjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RBQkxFID0gUFJFRklYICsgImVudGl0eV90YWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0NBQ0hFQUJMRSA9IFBSRUZJWCArICJlbnRpdHlfY2FjaGVhYmxlIjsKLQotCS8vUGVyc2lzdGVudCBBdHRyaWJ1dGUgY29tcG9zaXRlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ0FTQ0FERV9UWVBFID0gUFJFRklYICsgIm1hcHBpbmdfY2FzY2FkZVR5cGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uSW5zZXJ0YWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fTEVOR1RIID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uTGVuZ3RoIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9OVUxMQUJMRSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtbk51bGxhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTFVNTl9QUkVDSVNJT04gPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5QcmVjaXNpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX1NDQUxFID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uU2NhbGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX1RBQkxFID0gUFJFRklYICsgIm1hcHBpbmdfY29sdW1uVGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MVU1OX1VOSVFVRSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbHVtblVuaXF1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFPSBQUkVGSVggKyAibWFwcGluZ19jb2x1bW5VcGRhdGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRU1CRURERURfQVRUUklCVVRFX09WRVJSSURFUyA9IFBSRUZJWCArICJtYXBwaW5nX2VtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0VNQkVEREVEX0FUVFJJQlVURV9PVkVSUklERVNfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfZW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRU5VTUVSQVRFRCA9IFBSRUZJWCArICJtYXBwaW5nX2VudW1lcmF0ZWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfRkVUQ0hfVFlQRSA9IFBSRUZJWCArICJtYXBwaW5nX2ZldGNoVHlwZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19HRU5FUkFURURfVkFMVUVfU1RSQVRFR1kgPSBQUkVGSVggKyAibWFwcGluZ19nZW5lcmF0ZWRWYWx1ZVN0cmF0ZWd5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0dFTkVSQVRFRF9WQUxVRV9HRU5FUkFUT1JfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX2dlbmVyYXRlZFZhbHVlR2VuZXJhdG9yTmFtZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfam9pbkNvbHVtbk5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTiA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5SZWZlcmVuY2VkQ29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0pPSU5fVEFCTEVfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX2pvaW5UYWJsZU5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSk9JTl9UQUJMRV9TQ0hFTUEgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVTY2hlbWEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfSk9JTl9UQUJMRV9DQVRBTE9HID0gUFJFRklYICsgIm1hcHBpbmdfam9pblRhYmxlQ2F0YWxvZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMgPSBQUkVGSVggKyAibWFwcGluZ19qb2luVGFibGVKb2luQ29sdW1ucyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19KT0lOX1RBQkxFX0lOVkVSU0VfSk9JTl9DT0xVTU5TID0gUFJFRklYICsgIm1hcHBpbmdfam9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0xPQiA9IFBSRUZJWCArICJtYXBwaW5nX2xvYiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19NQVBfQVMgPSBQUkVGSVggKyAibWFwcGluZ19tYXBBcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19NQVBQRURfQlkgPSBQUkVGSVggKyAibWFwcGluZ19tYXBwZWRCeSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19OQU1FRF9OQVRJVkVfUVVFUklFUyA9ICJuYW1lZF9uYXRpdmVfcXVlcmllcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19OQU1FRF9RVUVSSUVTID0gUFJFRklYICsgIm5hbWVkX3F1ZXJpZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1BUSU9OQUwgPSBQUkVGSVggKyAibWFwcGluZ19vcHRpb25hbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWSA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1JERVJfQllfTk9fT1JERVJJTkcgPSBQUkVGSVggKyAibWFwcGluZ19vcmRlckJ5Tm9PcmRlcmluZyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19PUkRFUl9CWV9QUklNQVJZX0tFWV9PUkRFUklORyA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQnlQcmltYXJ5S2V5T3JkZXJpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1JERVJfQllfQ1VTVE9NX09SREVSSU5HID0gUFJFRklYICsgIm1hcHBpbmdfb3JkZXJCeUN1c3RvbU9yZGVyaW5nIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX09SREVSX0NPTFVNTl9PUkRFUklORyA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQ29sdW1uT3JkZXJpbmciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfT1JERVJfQ09MVU1OX09SREVSSU5HX0NPTFVNTiA9IFBSRUZJWCArICJtYXBwaW5nX29yZGVyQ29sdW1uT3JkZXJpbmdDb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfUFJJTUFSWV9LRVlfR0VORVJBVElPTiA9IFBSRUZJWCArICJtYXBwaW5nX3ByaW1hcnlLZXlHZW5lcmF0aW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUiA9IFBSRUZJWCArICJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9OQU1FID0gUFJFRklYICsgIm1hcHBpbmdfc2VxdWVuY2VHZW5lcmF0b3JOYW1lIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRSA9IFBSRUZJWCArICJtYXBwaW5nX3NlcXVlbmNlR2VuZXJhdG9yU2VxdWVuY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX0NBVEFMT0cgPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvckNhdGFsb2ciOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX05BTUUgPSBQUkVGSVggKyAibWFwcGluZ190YWJsZUdlbmVyYXRvck5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1BSSU1BUllfS0VZX0NPTFVNTiA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yUHJpbWFyeUtleUNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OX1ZBTFVFID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JQcmltYXJ5S2V5Q29sdW1uVmFsdWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1NDSEVNQSA9IFBSRUZJWCArICJtYXBwaW5nX3RhYmxlR2VuZXJhdG9yU2NoZW1hIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9UQUJMRT0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JUYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OID0gUFJFRklYICsgIm1hcHBpbmdfdGFibGVHZW5lcmF0b3JWYWx1ZUNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19UQVJHRVRfRU5USVRZID0gUFJFRklYICsgIm1hcHBpbmdfdGFyZ2V0RW50aXR5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1RFTVBPUkFMID0gUFJFRklYICsgIm1hcHBpbmdfdGVtcG9yYWwiOwotCi0JLy9Qcm9qZWN0IHByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UgPSBQUkVGSVggKyAicHJvcGVydGllc19qYXZhUGVyc2lzdGVuY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OID0gUFJFRklYICsgInByb3BlcnRpZXNfamF2YVBlcnNpc3RlbmNlQ29ubmVjdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX1NDSEVNQSA9IFBSRUZJWCArICJwcm9wZXJ0aWVzX2phdmFQZXJzaXN0ZW5jZVNjaGVtYSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19KQVZBX1BFUlNJU1RFTkNFX01FVEFNT0RFTCA9IFBSRUZJWCArICJwcm9wZXJ0aWVzX2Nhbm9uaWNhbE1ldGFtb2RlbCI7Ci0JCi0JLy9EaWFsb2dzLCBXaXphcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0NSRUFURV9PUk0gPSBQUkVGSVggKyAiZGlhbG9nX2NyZWF0ZU9STSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0VESVRfSU5WRVJTRV9KT0lOX0NPTFVOTiA9IFBSRUZJWCArICJkaWFsb2dfZWRpdEludmVyc2VKb2luQ29sdW1uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfR0VORVJBVEVfRU5USVRJRVMgPSBQUkVGSVggKyAiZGlhbG9nX2dlbmVyYXRlRW50aXRpZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19HRU5FUkFURV9FTlRJVElFU19TT1VSQ0UgPSBQUkVGSVggKyAiZGlhbG9nX2dlbmVyYXRlRW50aXRpZXNfc291cmNlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfUEFDS0FHRSA9IFBSRUZJWCArICJkaWFsb2dfZ2VuZXJhdGVFbnRpdGllc19wYWNrYWdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfVEFCTEVTID0gUFJFRklYICsgImRpYWxvZ19nZW5lcmF0ZUVudGl0aWVzX3RhYmxlcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX0pQQV9GQUNFVCA9IFBSRUZJWCArICJkaWFsb2dfSlBBRmFjZXQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19KUEFfUExBVEZPUk0gPSBQUkVGSVggKyAiZGlhbG9nX0pQQVBsYXRmb3JtIjsKLQkKLQkvL05ldyBKUEEgUHJvamVjdCB3aXphcmQ6Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUID0gUFJFRklYICsgImRpYWxvZ19uZXdKUEFQcm9qZWN0IjsKLSAJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEggPSBQUkVGSVggKyAiZGlhbG9nX2FkZEphdmFQZXJzaXN0ZW5jZV9jbGFzc3BhdGgiOwotIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0RBVEFCQVNFID0gUFJFRklYICsgImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2VfZGF0YWJhc2UiOwotIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX1BBQ0tBR0lORyA9IFBSRUZJWCArICJkaWFsb2dfYWRkSmF2YVBlcnNpc3RlbmNlX3BhY2thZ2luZyI7Ci0gCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9DUkVBVElPTl9QQUdFID0gUFJFRklYICsgImRpYWxvZ19hZGRKYXZhUGVyc2lzdGVuY2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfUFJPSkVDVF9KUEFfRkFDRVQgPSBQUkVGSVggKyAiZGlhbG9nX25ld0pQQVByb2plY3RGYWNldCI7Ci0KLQkvL090aGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfT1VUTElORSA9IFBSRUZJWCArICJwZXJzaXN0ZW5jZU91dGxpbmUiOwotCi0JLy9QZXJzaXN0ZW5jZSBYbWwgRWRpdG9yCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04gPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfY29ubmVjdGlvbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0dFTkVSQUwgPSBQUkVGSVggKyAicGVyc2lzdGVuY2VfZ2VuZXJhbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRJRVMgID0gUFJFRklYICsgInBlcnNpc3RlbmNlX3Byb3BlcnRpZXMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1hNTF9TT1VSQ0UgID0gUFJFRklYICsgInBlcnNpc3RlbmNlX3NvdXJjZSI7Ci0KLQkvL05ldyBKUEEgRW50aXR5IHdpemFyZAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19KUEFfRU5USVRZX0VOVElUWV9DTEFTUyAgPSBQUkVGSVggKyAiZGlhbG9nX2VudGl0eUNsYXNzUGFnZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0pQQV9FTlRJVFlfRU5USVRZX1BST1BFUlRJRVMgID0gUFJFRklYICsgImRpYWxvZ19lbnRpdHlQcm9wZXJ0aWVzUGFnZSI7Ci0JCi0JLy9HZW5lcmF0ZSBFbnRpdGllcyBXaXphcmQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9FTlRJVElFU19XSVpBUkRfQVNTT0NJQVRJT05fQ0FSRElOQUxJVFkgPSBQUkVGSVggKyAiZGlhbG9nX2Fzc29jaWF0aW9uQ2FyZGluYWxpdHlQYWdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9FTlRJVElFU19XSVpBUkRfQVNTT0NJQVRJT05fVEFCTEVTID0gUFJFRklYICsgImRpYWxvZ19hc3NvY2lhdGlvblRhYmxlc1BhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9DVVNUT01JWkVfREVGQVVMVF9FTlRJVFlfR0VORVJBVElPTiA9IFBSRUZJWCArICJkaWFsb2dfY3VzdG9taXplRGVmYXVsdEVudGl0eUdlbmVyYXRpb24iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9DVVNUT01JWkVfSU5ESVZJRFVBTF9FTlRJVElFUyA9IFBSRUZJWCArICJkaWFsb2dfY3VzdG9taXplSW5kaXZpZHVhbEVudGl0aWVzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9FTlRJVElFU19XSVpBUkRfSk9JTl9DT0xVTU5TID0gUFJFRklYICsgImRpYWxvZ19qb2luQ29sdW1uc1BhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9TRUxFQ1RfQ0FTQ0FERSA9IFBSRUZJWCArICJkaWFsb2dfc2VsZWN0Q2FzY2FkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1NFTEVDVF9UQUJMRVMgPSBQUkVGSVggKyAiZGlhbG9nX3NlbGVjdFRhYmxlc1BhZ2UiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9UQUJMRV9BU1NPQ0lBVElPTlMgPSBQUkVGSVggKyAiZGlhbG9nX3RhYmxlQXNzb2NpYXRpb25zUGFnZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0NPTExFQ1RJT05fVEFCTEVfTkFNRSA9IFBSRUZJWCArICJtYXBwaW5nX2NvbGxlY3Rpb25UYWJsZU5hbWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MTEVDVElPTl9UQUJMRV9TQ0hFTUEgPSBQUkVGSVggKyAibWFwcGluZ19jb2xsZWN0aW9uVGFibGVTY2hlbWEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfQ09MTEVDVElPTl9UQUJMRV9DQVRBTE9HID0gUFJFRklYICsgIm1hcHBpbmdfY29sbGVjdGlvblRhYmxlQ2F0YWxvZyI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTID0gUFJFRklYICsgIm1hcHBpbmdfZWxlbWVudENvbGxlY3Rpb25UYXJnZXRDbGFzcyI7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0pwYUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9KcGFKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU0OWNjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0pwYUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5BU1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotCi0vKioKLSAqIEpQQSBKYXZhIGNvZGUtY29tcGxldGlvbiBwcm9wb3NhbCBjb21wdXRlcgotICovCi1wdWJsaWMgY2xhc3MgSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIGltcGxlbWVudHMgSUphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciB7Ci0KLQlwdWJsaWMgSnBhSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIExpc3QgY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gKGNvbnRleHQgaW5zdGFuY2VvZiBKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0KSA/Ci0JCQkJCXRoaXMuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIGNvbnRleHQpCi0JCQkJOgotCQkJCQlDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBmYWlsIHNpbGVudGx5IGhlcmUgYmVjYXVzZSAoaXQgc2VlbXMpIDxlbT5leHBlY3RlZDwvZW0+IGV4Y2VwdGlvbnMgb2NjdXIKLQkgKiBtb3JlIGZyZXF1ZW50bHkgdGhhbiBpbnRlcm1pdHRlbnQgPGVtPnVuZXhwZWN0ZWQ8L2VtPiBleGNlcHRpb25zIHRoYXQgbWlnaHQKLQkgKiBtZXJpdCBpbnZlc3RpZ2F0aW9uIChhbmQgYSBsb2dnZWQgc3RhY2t0cmFjZSBtaWdodCBiZSB0aGUgb25seSBoaW50IGFzCi0JICogdG8gd2hhdCBoYXBwZW5lZCkuCi0JICogPHA+Ci0JICogV2Ugd2lsbCBnZXQgYW4gPGVtPmV4cGVjdGVkPC9lbT4gZXhjZXB0aW9uICh0eXBpY2FsbHkgYSB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb24gTlBFfSkKLQkgKiBoZXJlIGlmIHRoZSB1c2VyOjxvbD4KLQkgKiA8bGk+bW9kaWZpZXMgdGhlIEphdmEgc291cmNlIGZpbGUgaW4gYSB3YXkgdGhhdCBwdXRzIGl0IGRyYXN0aWNhbGx5IG91dAotCSAqICAgICBvZiBzeW5jIHdpdGggdGhlIERhbGkgY29udGV4dCBtb2RlbCAoZS5nLiBkZWxldGluZyBhIGZpZWxkIG9yCi0JICogICAgIGFubm90YXRpb24pCi0JICogPGxpPmltbWVkaWF0ZWx5IGludm9rZXMgQ29udGVudCBBc3Npc3QgKHR5cGljYWxseSA8Y29kZT5DdHJsK1NwYWNlPC9jb2RlPikKLQkgKiA8L29sPgotCSAqIFRoZSBBU1Qgd2UgYnVpbGQgaGVyZSB3aWxsIGJlIGJhc2VkIG9uIHRoZSBqdXN0LW1vZGlmaWVkIEphdmEgc291cmNlOyBidXQsCi0JICogc2luY2UgdGhlIHVzZXIgbW92ZWQgcXVpY2tseSBhbmQgd2Ugd2lsbCBub3QgaGF2ZSB5ZXQgcmVjZWl2ZWQgYW55IEphdmEKLQkgKiBjaGFuZ2Ugbm90aWZpY2F0aW9uIChzaW5jZSB3ZSBvbmx5IGdldCBhIEphdmEgY2hhbmdlIG5vdGlmaWNhdGlvbiB3aGVuCi0JICogdGhlIHVzZXIgaGFzIHBhdXNlZCB0eXBpbmcgZm9yIGF0IGxlYXN0IDAuNSBzZWNvbmRzKSwgdGhlIGNvbnRleHQgbW9kZWwKLQkgKiB3aWxsIHN0aWxsIGJlIGJhc2VkIG9uIHRoZSB1bm1vZGlmaWVkIEphdmEgc291cmNlLiBBcyB0aGUgbmV3IEFTVCBpcwotCSAqIHBhc3NlZCBkb3duIHRocm91Z2ggdGhlIGNvbnRleHQgbW9kZWwgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFsbCB0aGUgY29kZQotCSAqIGV4cGVjdHMgdG8gZmluZCB0aGUgQVNUIGluIHN5bmMgd2l0aCB0aGUgbW9kZWwuIFdoZW4gdGhpcyBpcyBub3QgdGhlCi0JICogY2FzZSAoZS5nLiBhIGZpZWxkIGluIHRoZSByZXNvdXJjZSBtb2RlbCBpcyBubyBsb25nZXIgcHJlc2VudCBpbiB0aGUgQVNUCi0JICogYmVjYXVzZSB0aGUgdXNlciBoYXMgZGVsZXRlZCBpdCBvciBtb2RpZmllZCB0aGUgY29kZSBpbiBzdWNoIGEgd2F5IHRoYXQKLQkgKiB0aGUgcGFyc2VyIGNhbiBubyBsb25nZXIgZGV0ZWN0IHRoZSBmaWVsZCkgdGhlIG1vZGVsIHdpbGwgcHJvYmFibHkgY2hva2UKLQkgKiB3aGVuIGl0IGNhbm5vdCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIEFTVCBub2RlLgotCSAqIDxwPgotCSAqIEl0IHNlZW1zIHJlYXNvbmFibGUsIGluIHRoZXNlIHNpdHVhdGlvbnMsIHRvIHNpbXBseSByZXR1cm4gbm8gY29tcGxldGlvbgotCSAqIHByb3Bvc2Fscy4gSWYgdGhlIHVzZXIgc2ltcGx5IHdhaXRzIGEgbW9tZW50IGFuZCB0cmllcyBhZ2Fpbiwgd2Ugd2lsbCBiZQotCSAqIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGNhbGN1bGF0ZSBzb21lIHByb3Bvc2Fscy4KLQkgKiA8cD4KLQkgKiB+Ymp2Ci0JICovCi0JcHJpdmF0ZSBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHNfKGNvbnRleHQpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vIEpwdEpwYUNvcmVQbHVnaW4ubG9nKGV4KTsgIC8vIGRvbid0IGxvZyAiZXhwZWN0ZWQiIGV4Y2VwdGlvbnMgKD8pCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHNfKEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCi0JCUlGaWxlIGZpbGUgPSB0aGlzLmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZShjdSk7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQkJfQotCi0JCUpwYUZpbGUganBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCQotCQlDb2xsZWN0aW9uPEpwYVN0cnVjdHVyZU5vZGU+IHJvb3RTdHJ1Y3R1cmVOb2RlcyA9IENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKGpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkpOwotCQlpZiAocm9vdFN0cnVjdHVyZU5vZGVzLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLQkJQ29tcGxldGlvbkNvbnRleHQgY2MgPSBjb250ZXh0LmdldENvcmVDb250ZXh0KCk7Ci0KLQkJLy8gdGhlIGNvbnRleHQncyAidG9rZW4iIGlzIHJlYWxseSBhIHNvcnQgb2YgInByZWZpeCIgLSBpdCBkb2VzIE5PVAotCQkvLyBjb3JyZXNwb25kIHRvIHRoZSAic3RhcnQiIGFuZCAiZW5kIiB3ZSBnZXQgYmVsb3cuLi4gCi0JCWNoYXJbXSBwcmVmaXggPSBjYy5nZXRUb2tlbigpOwotCQlGaWx0ZXI8U3RyaW5nPiBmaWx0ZXIgPSAoKHByZWZpeCA9PSBudWxsKSA/IEZpbHRlci5OdWxsLjxTdHJpbmc+aW5zdGFuY2UoKSA6IG5ldyBJZ25vcmVDYXNlUHJlZml4RmlsdGVyKHByZWZpeCkpOwotCQkvLyB0aGUgdG9rZW4gInN0YXJ0IiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSB0b2tlbidzIGZpcnN0IGNoYXJhY3RlcgotCQlpbnQgdG9rZW5TdGFydCA9IGNjLmdldFRva2VuU3RhcnQoKTsKLQkJLy8gdGhlIHRva2VuICJlbmQiIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHRva2VuJ3MgbGFzdCBjaGFyYWN0ZXIgKHl1aykKLQkJaW50IHRva2VuRW5kID0gY2MuZ2V0VG9rZW5FbmQoKTsKLQkJaWYgKHRva2VuU3RhcnQgPT0gLTEpIHsgIC8vIG5vdCBzdXJlIHdoeSB0aGlzIGhhcHBlbnMgLSBzZWUgYnVnIDI0MjI4NgotCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0KLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInByZWZpeDogIiArICgocHJlZml4ID09IG51bGwpID8gIltudWxsXSIgOiBuZXcgU3RyaW5nKHByZWZpeCkpKTsKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oInRva2VuIHN0YXJ0OiAiICsgdG9rZW5TdGFydCk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbiBlbmQ6ICIgKyB0b2tlbkVuZCk7Ci0vLwkJU3RyaW5nIHNvdXJjZSA9IGN1LmdldFNvdXJjZSgpOwotLy8JCVN0cmluZyB0b2tlbiA9IHNvdXJjZS5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgdG9rZW5TdGFydCksIE1hdGgubWluKHNvdXJjZS5sZW5ndGgoKSwgdG9rZW5FbmQgKyAxKSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJ0b2tlbjogPT4iICsgdG9rZW4gKyAiPD0iKTsKLS8vCQlTdHJpbmcgc25pcHBldCA9IHNvdXJjZS5zdWJzdHJpbmcoTWF0aC5tYXgoMCwgdG9rZW5TdGFydCAtIDIwKSwgTWF0aC5taW4oc291cmNlLmxlbmd0aCgpLCB0b2tlbkVuZCArIDIxKSk7Ci0vLwkJU3lzdGVtLm91dC5wcmludGxuKCJzdXJyb3VuZGluZyBzbmlwcGV0OiA9PiIgKyBzbmlwcGV0ICsgIjw9Iik7Ci0KLQkJLy8gVE9ETyBtb3ZlIHRoaXMgcGFyc2VyIGNhbGwgaW50byB0aGUgbW9kZWwuLi4KLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSBBU1RUb29scy5idWlsZEFTVFJvb3QoY3UpOwotCQlMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBsZXRpb25Qcm9wb3NhbD4oKTsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUgOiByb290U3RydWN0dXJlTm9kZXMpIHsKLQkJCWZvciAoU3RyaW5nIHMgOiAoKEphdmFQZXJzaXN0ZW50VHlwZSkgc3RydWN0dXJlTm9kZSkuZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoY29udGV4dC5nZXRJbnZvY2F0aW9uT2Zmc2V0KCksIGZpbHRlciwgYXN0Um9vdCkpIHsKLQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwocywgdG9rZW5TdGFydCwgdG9rZW5FbmQgLSB0b2tlblN0YXJ0ICsgMSwgcy5sZW5ndGgoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JcHJpdmF0ZSBJRmlsZSBnZXRDb3JyZXNwb25kaW5nUmVzb3VyY2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQl0cnkgewotCQkJcmV0dXJuIChJRmlsZSkgY3UuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgTGlzdCBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKENvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXNzaW9uRW5kZWQoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJZ25vcmVDYXNlUHJlZml4RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyPFN0cmluZz4gewotCQlwcml2YXRlIGZpbmFsIGNoYXJbXSBwcmVmaXg7Ci0JCUlnbm9yZUNhc2VQcmVmaXhGaWx0ZXIoY2hhcltdIHByZWZpeCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucHJlZml4ID0gcHJlZml4OwotCQl9Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChTdHJpbmcgcykgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLnN0cmluZ1N0YXJ0c1dpdGhJZ25vcmVDYXNlKHMudG9DaGFyQXJyYXkoKSwgdGhpcy5wcmVmaXgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0pwYU1hcHBpbmdJbWFnZUhlbHBlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9KcGFNYXBwaW5nSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5YTEzZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0pwYU1hcHBpbmdJbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEpwYU1hcHBpbmdJbWFnZUhlbHBlcgotewotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBpbWFnZUZvclR5cGVNYXBwaW5nKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShpY29uS2V5Rm9yVHlwZU1hcHBpbmcobWFwcGluZ0tleSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGljb25LZXlGb3JUeXBlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwobWFwcGluZ0tleSwgTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuTlVMTF9UWVBFX01BUFBJTkc7Ci0JCX0KLQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKG1hcHBpbmdLZXksIE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuRU5USVRZOwotCQl9Ci0JCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChtYXBwaW5nS2V5LCBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5FTUJFRERBQkxFOwotCQl9Ci0JCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChtYXBwaW5nS2V5LCBNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuTUFQUEVEX1NVUEVSQ0xBU1M7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJbWFnZSBpbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKGljb25LZXlGb3JBdHRyaWJ1dGVNYXBwaW5nKG1hcHBpbmdLZXkpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpY29uS2V5Rm9yQXR0cmlidXRlTWFwcGluZyhTdHJpbmcgbWFwcGluZ0tleSkgewotCQlpZiAoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPT0gbWFwcGluZ0tleSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuTlVMTF9BVFRSSUJVVEVfTUFQUElORzsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5CQVNJQzsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5JRDsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLlZFUlNJT047Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuRU1CRURERURfSUQ7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuRU1CRURERUQ7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5PTkVfVE9fT05FOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLk9ORV9UT19NQU5ZOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLk1BTllfVE9fT05FOwotCQl9Ci0JCWVsc2UgaWYgKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkuZXF1YWxzKG1hcHBpbmdLZXkpKSB7Ci0JCQlyZXR1cm4gSnB0VWlJY29ucy5NQU5ZX1RPX01BTlk7Ci0JCX0KLQkJZWxzZSBpZiAoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWS5lcXVhbHMobWFwcGluZ0tleSkpIHsKLQkJCXJldHVybiBKcHRVaUljb25zLkVMRU1FTlRfQ09MTEVDVElPTjsKLQkJfQotCQllbHNlIGlmIChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLmVxdWFscyhtYXBwaW5nS2V5KSkgewotCQkJcmV0dXJuIEpwdFVpSWNvbnMuVFJBTlNJRU5UOwotCQl9Ci0JCS8vcmV0dXJuIHRoZSBKUEFfQ09OVEVOVCBpY29uIGluc3RlYWQgb2YgbnVsbCwgbWlnaHQgYXMgd2VsbCBoYXZlIGFuIGljb24gaWYgb25lIGlzIG5vdCBkZWZpbmVkCi0JCXJldHVybiBKcHRVaUljb25zLkpQQV9DT05URU5UOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvSnB0VWlJY29ucy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MzQwN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9KcHRVaUljb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLgotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqICBDb250cmlidXRvcnM6Ci0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuSW1hZ2VVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnB0VWlJY29ucwotewotICAgIC8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgU1dUIGltYWdlIHRoYXQgaXMgYSBncmF5ZWQgb3V0IHZlcnNpb24gb2YgdGhlIGltYWdlIAotCSAqIGNvcnJlc3BvbmRpbmcgIHRvIHRoZSBwYXNzZWQgaW4ga2V5LiBTdG9yZXMgdGhpcyBncmF5IGltYWdlIGluIHRoZSBKcHRKcGFVaVBsdWdpbiAKLQkgKiBJbWFnZVJlZ2lzdHJ5IHdpdGggLWdyYXkgYXBwZW5kZWQgdG8gdGhlIGtleS4KLQkgKiBDbGllbnRzIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBub3QgZGlzcG9zZSBvZiB0aGUgaW1hZ2UuCi0JICogCi0JICogQHJldHVybiBhIG5ldyBncmF5ZWQgb3V0IGltYWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZSBnaG9zdChTdHJpbmcga2V5KSB7Ci0JCUltYWdlIGV4aXN0aW5nSW1hZ2UgPSBKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldEltYWdlUmVnaXN0cnkoKS5nZXQoa2V5ICsgIi1ncmF5Iik7Ci0JCWlmIChleGlzdGluZ0ltYWdlICE9IG51bGwpIHsKLQkJCXJldHVybiBleGlzdGluZ0ltYWdlOwotCQl9Ci0KLQkJSW1hZ2UgZ3JheUltYWdlID0gYnVpbGRHaG9zdEltYWdlKGtleSk7Ci0JCUpwdEpwYVVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChrZXkgKyAiLWdyYXkiLCBncmF5SW1hZ2UpOwotCQlyZXR1cm4gZ3JheUltYWdlOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJbWFnZSBidWlsZEdob3N0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZSBvcmlnaW5hbEltYWdlID0gSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2Uoa2V5KTsKLQkJQ29sb3IgbGlnaHRHcmF5ID0gbmV3IENvbG9yKG9yaWdpbmFsSW1hZ2UuZ2V0RGV2aWNlKCksIDIyMywgMjIzLCAyMjMpOwotCQlJbWFnZURhdGEgaW1hZ2VEYXRhID0gSW1hZ2VVdGlsaXRpZXMuY3JlYXRlU2hhZGVkSW1hZ2Uob3JpZ2luYWxJbWFnZSwgbGlnaHRHcmF5KTsKLQotCQlJbWFnZSBzaGFkZWRJbWFnZSA9IG5ldyBJbWFnZShvcmlnaW5hbEltYWdlLmdldERldmljZSgpLCBpbWFnZURhdGEpOwotCQlJbWFnZSBncmF5SW1hZ2UgPSBuZXcgSW1hZ2Uob3JpZ2luYWxJbWFnZS5nZXREZXZpY2UoKSwgc2hhZGVkSW1hZ2UsIFNXVC5JTUFHRV9HUkFZKTsKLQotCQlsaWdodEdyYXkuZGlzcG9zZSgpOwotCQlzaGFkZWRJbWFnZS5kaXNwb3NlKCk7Ci0JCXJldHVybiBncmF5SW1hZ2U7Ci0JfQkKLQotCi0JLy8gKioqKioqKioqKioqKioqKiBHZW5lcmFsIEpQQSBpY29ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9DT05URU5UID0gImZ1bGwvb2JqMTYvanBhLWNvbnRlbnQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9GSUxFID0gImZ1bGwvb2JqMTYvanBhLWZpbGUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9GSUxFID0gImZ1bGwvb2JqMTYvanBhLWphci1maWxlIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXQVJOSU5HID0gImZ1bGwvb2JqMTYvd2FybmluZyI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBXaXphcmQgaWNvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9XSVpfQkFOTkVSID0gImZ1bGwvd2l6YmFuL25ld19qcGFfcHJqX3dpeiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vbmV3X2VudGl0eV93aXpiYW4iOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9GSUxFX1dJWl9CQU5ORVIgPSAiZnVsbC93aXpiYW4vbmV3X2pwYV9maWxlX3dpemJhbiI7Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBQZXJzaXN0ZW5jZSBpY29ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU0lTVEVOQ0UgPSAiZnVsbC9vYmoxNi9wZXJzaXN0ZW5jZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUID0gImZ1bGwvb2JqMTYvcGVyc2lzdGVuY2UtdW5pdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX0ZJTEVfUkVGID0gImZ1bGwvb2JqMTYvanBhLWZpbGUiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfUkVGID0gImZ1bGwvb2JqMTYvbnVsbC10eXBlLW1hcHBpbmciOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9GSUxFX1JFRiA9ICJmdWxsL29iajE2L2pwYS1qYXItZmlsZSI7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogT3JtIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9NQVBQSU5HUyA9ICJmdWxsL29iajE2L2VudGl0eS1tYXBwaW5ncyI7Ci0KLQotCS8vICoqKioqKioqKioqKioqKiogT3JtL0phdmEgY29tbW9uIGljb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiZnVsbC9vYmoxNi9lbnRpdHkiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREFCTEUgPSAiZnVsbC9vYmoxNi9lbWJlZGRhYmxlIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfU1VQRVJDTEFTUyA9ICJmdWxsL29iajE2L21hcHBlZC1zdXBlcmNsYXNzIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMX1RZUEVfTUFQUElORyA9ICJmdWxsL29iajE2L251bGwtdHlwZS1tYXBwaW5nIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJmdWxsL29iajE2L2lkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRF9JRCA9ICJmdWxsL29iajE2L2VtYmVkZGVkLWlkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQyA9ICJmdWxsL29iajE2L2Jhc2ljIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gImZ1bGwvb2JqMTYvdmVyc2lvbiI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOWV9UT19PTkUgPSAiZnVsbC9vYmoxNi9tYW55LXRvLW9uZSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX01BTlkgPSAiZnVsbC9vYmoxNi9vbmUtdG8tbWFueSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FX1RPX09ORSA9ICJmdWxsL29iajE2L29uZS10by1vbmUiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWSA9ICJmdWxsL29iajE2L21hbnktdG8tbWFueSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9DT0xMRUNUSU9OID0gImZ1bGwvb2JqMTYvZWxlbWVudC1jb2xsZWN0aW9uIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRCA9ICJmdWxsL29iajE2L2VtYmVkZGVkIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0lFTlQgPSAiZnVsbC9vYmoxNi90cmFuc2llbnQiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTExfQVRUUklCVVRFX01BUFBJTkcgPSAiZnVsbC9vYmoxNi9udWxsLWF0dHJpYnV0ZS1tYXBwaW5nIjsKLQotCi0JLy8gKioqKioqKioqKioqKioqKiBDb250ZW50IEFzc2lzdCBpY29ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUFFMX0ZVTkNUSU9OID0gImZ1bGwvb2JqMTYvanBxbC5mdW5jdGlvbiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUFFMX0lERU5USUZJRVIgPSAiZnVsbC9vYmoxNi9qcHFsLmlkZW50aWZpZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBRTF9WQVJJQUJMRSA9ICJmdWxsL29iajE2L2pwcWwudmFyaWFibGUiOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvSnB0VWlNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9KcHRVaU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZjNlNDUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9KcHRVaU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgVUkuCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaU1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFjY2Vzc1R5cGVDb21wb3NpdGVfYWNjZXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFRvRWFyQ29tcG9zaXRlX2Vhck1lbWJlclNoaXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVG9FYXJDb21wb3NpdGVfYWRkVG9FYXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRUb0VhckNvbXBvc2l0ZV9lYXJQcm9qZWN0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkVG9FYXJDb21wb3NpdGVfbmV3QnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudEF0dHJpYnV0ZURpYWxvZ19hdHRyaWJ1dGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX21hcHBpbmdMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc05vdEZvdW5kV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19tYXBwaW5nTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vQ2xhc3NFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbm9NYXBwaW5nS2V5RXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb0pwYV9jb252ZXJ0aW5nUHJvamVjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9KcGFfZGV0ZWN0aW5nVGVjaG5vbG9naWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Vfc2NoZW1hU2V0dGluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2FkZENvbm5lY3Rpb25Ub1Byb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3RMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3Rpb25JbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZV9zY2hlbWFJbmZvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVycm9yX29wZW5pbmdFZGl0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhbF9icm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhbF9yZXZlcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhbF9kZXNlbGVjdEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX3NlbGVjdEFsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmFsX3JlZnJlc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVERExXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9nZW5lcmF0ZUVudGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2Nob29zZUVudGl0eVRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRQYWdlX2VudGl0eU5hbWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfZ2VuZXJhdGVFbnRpdGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkUGFnZV9zeW5jaHJvbml6ZUNsYXNzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfdGFibGVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZFBhZ2VfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQbGF0Zm9ybVVpRGlhbG9nX25vdFN1cHBvcnRlZE1lc3NhZ2VUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFDb250ZW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYURldGFpbHNWaWV3X3ZpZXdOb3RBdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2FkZERyaXZlckxpYnJhcnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdExpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RlZFRleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2NyZWF0ZU9ybVhtbEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdENhdGFsb2dMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdFNjaGVtYUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9kcml2ZXJMaWJyYXJ5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2ZhY2V0c1BhZ2VMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9tZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9qcGFJbXBsZW1lbnRhdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9qcGFQcmVmc0xpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX2xpc3RDbGFzc2VzQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9tZXRhbW9kZWxMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2Vfbm9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2Vfb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRTY2hlbWFMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV9zcGVjaWZ5TGliTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUZhY2V0V2l6YXJkUGFnZV91c2VyTGlic0xpbms7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhRmFjZXRXaXphcmRQYWdlX3VzZXJTZXJ2ZXJMaWJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFKcHFsSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYUpwcWxTc2VDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcl9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsUGFuZWxfaW5jbHVkZUxpYnJhcmllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX2Fubm90YXRlSW5KYXZhUmFkaW9CdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlUmFkaW9CdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ0ZpbGVCcm93c2VCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX3R5cGVUYWJsZUNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ1RhYmxlQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9saXN0SW5QZXJzaXN0ZW5jZVhtbENoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9zZWxlY3RlZFR5cGVzUGVyc2lzdGVudEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZURvZXNOb3RFeGlzdEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZU5vdExpc3RlZEluUGVyc2lzdGVuY2VYbWxFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X2xpbmtXaXRoRWRpdG9yVG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X3N0cnVjdHVyZU5vdEF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFTdHJ1Y3R1cmVWaWV3X251bUl0ZW1zU2VsZWN0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBxbENvbnRlbnRQcm9wb3NhbFByb3ZpZGVyX0Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9uZXdGaWxlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfcHJvamVjdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9zb3VyY2VGb2xkZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfZmlsZVBhdGhMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfYWNjZXNzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9wZXJzaXN0ZW5jZVVuaXRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBwaW5nRmlsZVdpemFyZFBhZ2VfaW5jb3JyZWN0U291cmNlRm9sZGVyRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsX3NvdXJjZUZvbGRlckRpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hY2Nlc3NMYWJlbF9zb3VyY2VGb2xkZXJEaWFsb2dEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByb2plY3RXaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X2VudGl0eU1hcHBpbmdzTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXRpZXNHZW5lcmF0b3Jfam9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcHRQcmVmZXJlbmNlc1BhZ2VfRG9Ob3RTaG93RGlhbG9nczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcHRQcmVmZXJlbmNlc1BhZ2VfRG9Ob3RTaG93VGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcHRQcmVmZXJlbmNlc1BhZ2VfQ2xlYXJCdXR0b25UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VzUGFnZV9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9sb3dlckNhc2VSYWRpb0J1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9tYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZVJhZGlvQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByZWZlcmVuY2VzUGFnZV9qcHFsRWRpdG9yX3VwcGVyQ2FzZVJhZGlvQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX0lnbm9yZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfSW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfV2FybmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZ19uZXdCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2dfdG9vbFRpcDsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaU1lc3NhZ2VzLmNsYXNzOwotCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0pwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9KcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhMWE2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL0pwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8vQ29udGVudCBpcyBvcmdhbml6ZWQgYmFzZWQgb24gdGhlIGNhdGVnb3JpZXMgYW5kIGVudHJpZXMgaW4gZWFjaCBjYXRlZ29yaWVzIGFyZSBsaXN0ZWQgYWxwaGFiZXRpY2FsbHkuCi0vL0lmIGFkZGluZyBhIG5ldyBlbnRyeSwgcGxlYXNlIGFkZCBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeSBhdCB0aGUgcmlnaHQgcGxhY2UuCi0KLXB1YmxpYyBjbGFzcyBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMgewotCQotCS8vIFByb2plY3QgQ2F0ZWdvcnkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX0xFVkVMX0NBVEVHT1JZOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5PX0pQQV9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfWE1MX0lOVkFMSURfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfVU5TVVBQT1JURURfQ09OVEVOVDsgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9JTlZBTElEX0NPTk5FQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPSkVDVF9JTlZBTElEX0xJQlJBUllfUFJPVklERVI7IC8vIDMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBST0pFQ1RfTk9fQ09OTkVDVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfVkVSU0lPTl9OT1RfTEFURVNUOwotCi0JLy8gUGVyc2lzdGVuY2UgVW5pdCBDYXRlZ29yeQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTEVWRUxfQ0FURUdPUlk7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19GSUxFX0VYVFJBTkVPVVNfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX1RZUEVfRFVQTElDQVRFX0NMQVNTOyAvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0pBUl9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0lOVkFMSURfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX01BUFBJTkdfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX0pBUl9GSUxFX0RFUExPWU1FTlRfUEFUSF9XQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfTk9ORVhJU1RFTlRfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9KQVJfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOQ0VfVU5JVF9VTlNVUFBPUlRFRF9NQVBQSU5HX0ZJTEVfQ09OVEVOVDsKLQotCS8vIFR5cGUgQ2F0ZWdvcnkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX0xFVkVMX0NBVEVHT1JZOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX05BTUVfRFVQTElDQVRFRDsgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfTkFNRV9NSVNTSU5HOyAvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9OT19QSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfTk9OX1JPT1RfSURfQVRUUklCVVRFX1NQRUNJRklFRDsgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfTk9OX1JPT1RfSURfQ0xBU1NfU1BFQ0lGSUVEOyAvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9BTk5PVEFURURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9VTlJFU09MVkVEX0NMQVNTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQVJHRVRfTk9UX0FOX0VNQkVEREFCTEU7IC8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19DTEFTU19QUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX01BUFBJTkdfRklOQUxfQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FORF9FTUJFRERFRF9JRF9CT1RIX1VTRUQ7IAkvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfRE9FU19OT1RfRVhJU1Q7IC8vMy4yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9NQVBQSU5HX0RVUExJQ0FURV9NQVRDSDsJLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX01BUFBJTkdfTk9fTUFUQ0g7CS8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9OT19NQVRDSDsgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX05PVF9QUklNQVJZX0tFWTsJLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfQUdSRUU7CS8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfRVFVQUxTX01FVEhPRDsgLy8zLjIKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0Q7IC8vMy4yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SOyAvLzMuMgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX1BVQkxJQ19OT19BUkdfQ09OU1RSVUNUT1I7IC8vMy4yCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05BTUVfRU1QVFk7IC8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9JTVBMRU1FTlRfU0VSSUFMSVpBQkxFOyAvLzMuMgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfUFVCTElDOyAvLzMuMgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfRVhJU1Q7IC8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1BST1BFUlRZX01FVEhPRF9OT1RfUFVCTElDOyAvLzMuMgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19SRURFRklORUQ7CS8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFUVVJUkVEOwkvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfTUFQUElOR19JRF9DTEFTU19XSVRIX01BUFNfSUQ7CS8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX01BUFNfSURfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfQUdSRUU7CS8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX01BUFBJTkdfTVVMVElQTEVfRU1CRURERURfSUQ7CS8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX1BLX1JFREVGSU5FRF9JRF9BVFRSSUJVVEU7CS8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9NQVBQSU5HX1BLX1JFREVGSU5FRF9JRF9DTEFTUzsJLy8zLjAgTTcKLQotCS8vIEF0dHJpYnV0ZSBDYXRlZ29yeQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9MRVZFTF9DQVRFR09SWTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX0RPRVNfTk9UX0VYSVNUOy8vIDMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTUJFRERFRF9JRF9NQVBQSU5HX01BUFBFRF9CWV9SRUxBVElPTlNISVBfQU5EX0FUVFJJQlVURV9PVkVSUklERVNfU1BFQ0lGSUVEOyAvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX01BUFBJTkdfTUFQUEVEX0JZX1JFTEFUSU9OU0hJUF9BTkRfQ09MVU1OX1NQRUNJRklFRDsgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBTX0lEX1ZBTFVFX0lOVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQU19JRF9WQUxVRV9OT1RfUkVTT0xWRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQU19JRF9WQUxVRV9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfSU5WQUxJRF9NQVBQRURfQlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19NQVBQRURfQllfT05fQk9USF9TSURFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQSU5HX01BUFBFRF9CWV9XSVRIX0pPSU5fVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQUElOR19VTlJFU09MVkVEX01BUFBFRF9CWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPUkRFUl9DT0xVTU5fQU5EX09SREVSX0JZX0JPVEhfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEU7IC8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfR0VUVEVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOSEVSSVRFRF9BVFRSSUJVVEVTX05PVF9TVVBQT1JURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9NQVBQSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQUElOR19UWVBFOyAvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQX0tFWV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEU7IC8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTlRfQVRUUklCVVRFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQRVJTSVNURU5UX0FUVFJJQlVURV9VTlNQRUNJRklFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBUkdFVF9FTlRJVFlfTk9UX0VYSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQX0tFWV9DTEFTU19OT1RfRVhJU1Q7Ci0JLy8gLS0tLS0tLS0tLSBJbXBsaWVkIEF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19ET0VTX05PVF9FWElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTk9UX0RFRklORUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUF9LRVlfVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fSU5WQUxJRF9WQUxVRV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQUElOR19UWVBFOwotCi0KLQkvLyBEYXRhYmFzZSBDYXRlZ29yeQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERBVEFCQVNFX0NBVEVHT1JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElNUExJRURfQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZOwotCQotCQkvLyAqKioqKioqKioqKiBUYWJsZSBDYXRlZ29yeSAqKioqKioqKioqKgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX0NBVEVHT1JZOwkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUNPTkRBUllfVEFCTEVfVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVEFCTEVfVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX1VOUkVTT0xWRURfU0NIRU1BOwotCQkvLyAtLS0tLS0tLS0tIEltcGxpZWQgQXR0cmlidXRlcyAtLS0tLS0tLS0tLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0KLQkvLyAqKioqKioqKioqKiBDb2x1bW4gQ2F0ZWdvcnkgKioqKioqKioqKioKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xVTU5fQ0FURUdPUlk7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTFVNTl9VTlJFU09MVkVEX1RBQkxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBfS0VZX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQX0tFWV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOyAgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUFQX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCS8vIC0tLS0tLS0tLS0gSW1wbGllZCBBdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9NQVBfS0VZX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfTUFQX0tFWV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JCi0JCS8vICoqKioqKioqKioqIE92ZXJyaWRlcyBDYXRlZ29yeSAqKioqKioqKioqKgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9WRVJSSURFU19DQVRFR09SWTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9UWVBFOyAvLzMuMCBNNwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9TUEVDSUZJRUQ7IC8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JCQkvLyAtLS0tLS0tLS0tIEltcGxpZWQgQXR0cmlidXRlcyAtLS0tLS0tLS0tLS0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWSVJUVUFMX0FUVFJJQlVURV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7IC8vMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FOyAvLzMuMCBNNwotCi0JLy8gSW5oZXJpdGFuY2UgQ2F0ZWdvcnkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkhFUklUQU5DRV9DQVRFR09SWTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBESVNDUklNSU5BVE9SX0NPTFVNTl9VTlJFU09MVkVEX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfQUJTVFJBQ1RfVEFCTEVfUEVSX0NMQVNTX0RFRklORVNfVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX05PTl9ST09UX0RJU0NSSU1JTkFUT1JfQ09MVU1OX0RFRklORUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1NJTkdMRV9UQUJMRV9ERVNDRU5EQU5UX0RFRklORVNfVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1RBQkxFX1BFUl9DTEFTU19ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1BPUlRBQkxFX09OX1BMQVRGT1JNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfTk9UX1NVUFBPUlRFRF9PTl9QTEFURk9STTsKLQotCS8vIFF1ZXJpZXMgYW5kIEdlbmVyYXRvcnMgQ2F0ZWdvcnkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRVUVSSUVTX0dFTkVSQVRPUlNfQ0FURUdPUlk7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdFTkVSQVRPUl9OQU1FX1VOREVGSU5FRDsgLy8gMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQUUxfUVVFUllfVkFMSURBVElPTjsgLy8zLjAgTTcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRVUVSWV9EVVBMSUNBVEVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRVUVSWV9OQU1FX1VOREVGSU5FRDsgLy8gMy4wIE03Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUVVFUllfU1RBVEVNRU5UX1VOREVGSU5FRDsgLy8gMy4wIE03CQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfdmFsaWRhdGlvbl9wcmVmZXJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuY2xhc3M7Ci0KLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9hY3Rpb25zL0dlbmVyYXRlRERMQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVERExBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhY2EzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVERExBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci0KLS8qKgotICogIEdlbmVyYXRlRERMQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZURETEFjdGlvbiBleHRlbmRzIFByb2plY3RBY3Rpb24gewotCQotCXB1YmxpYyBHZW5lcmF0ZURETEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLmdldEpwYVBsYXRmb3JtVWkocHJvamVjdCkuZ2VuZXJhdGVEREwocHJvamVjdCwgdGhpcy5nZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZUVudGl0aWVzQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvR2VuZXJhdGVFbnRpdGllc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM2MzM4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvYWN0aW9ucy9HZW5lcmF0ZUVudGl0aWVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci0KLS8qKgotICogIEdlbmVyYXRlRW50aXRpZXNBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRW50aXRpZXNBY3Rpb24gZXh0ZW5kcyBQcm9qZWN0QWN0aW9uIHsKLQlwdWJsaWMgR2VuZXJhdGVFbnRpdGllc0FjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKEpwYVByb2plY3QgcHJvamVjdCkgewotICAgICAgICB0aGlzLmdldEpwYVBsYXRmb3JtVWkocHJvamVjdCkuZ2VuZXJhdGVFbnRpdGllcyhwcm9qZWN0LCB0aGlzLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9hY3Rpb25zL01ha2VQZXJzaXN0ZW50QWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvTWFrZVBlcnNpc3RlbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjZjBiNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvTWFrZVBlcnNpc3RlbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotCi1wdWJsaWMgY2xhc3MgTWFrZVBlcnNpc3RlbnRBY3Rpb24gaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JCi0JcHJpdmF0ZSBNYXA8SVByb2plY3QsIExpc3Q8SVR5cGU+PiBzZWxlY3RlZFR5cGVzOwotCQotCXB1YmxpYyBNYWtlUGVyc2lzdGVudEFjdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYXJ0KElBY3Rpb24gYWN0aW9uLCBJV29ya2JlbmNoUGFydCB0YXJnZXRQYXJ0KSB7Ci0JCS8vIGRvIG5vdGhpbmcJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBBY3Rpb24gaXMgY29udHJpYnV0ZWQgZm9yIElUeXBlLCBJQ29tcGlsYXRpb25Vbml0LCBJUGFja2FnZUZyYWdtZW50LCBhbmQgSVBhY2thZ2VGcmFnbWVudFJvb3QgdGhhdCBpcyBhIHNvdXJjZSBmb2xkZXIKLQkJdGhpcy5zZWxlY3RlZFR5cGVzID0gdGhpcy5idWlsZFNlbGVjdGVkVHlwZXMoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIE1hcDxJUHJvamVjdCwgTGlzdDxJVHlwZT4+IGJ1aWxkU2VsZWN0ZWRUeXBlcyhTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJTWFwPElQcm9qZWN0LCBMaXN0PElUeXBlPj4gdHlwZXMgPSBuZXcgSGFzaE1hcDxJUHJvamVjdCwgTGlzdDxJVHlwZT4+KCk7Ci0JCQotCQlmb3IgKE9iamVjdCBzZWxlY3Rpb24gOiBzdHJ1Y3R1cmVkU2VsZWN0aW9uLnRvTGlzdCgpKSB7Ci0JCQlzd2l0Y2ggKCgoSUphdmFFbGVtZW50KSBzZWxlY3Rpb24pLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFIDoKLQkJCQkJYWRkU2VsZWN0ZWRUeXBlKChJVHlwZSkgc2VsZWN0aW9uLCB0eXBlcyk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUphdmFFbGVtZW50LkNPTVBJTEFUSU9OX1VOSVQgOgotCQkJCQlhZGRTZWxlY3RlZFR5cGUoKElDb21waWxhdGlvblVuaXQpIHNlbGVjdGlvbiwgdHlwZXMpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKLQkJCQkJYWRkU2VsZWN0ZWRUeXBlKChJUGFja2FnZUZyYWdtZW50KSBzZWxlY3Rpb24sIHR5cGVzKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCQkJYWRkU2VsZWN0ZWRUeXBlKChJUGFja2FnZUZyYWdtZW50Um9vdCkgc2VsZWN0aW9uLCB0eXBlcyk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkVHlwZShJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290LCBNYXA8SVByb2plY3QsIExpc3Q8SVR5cGU+PiB0eXBlcykgewotCQlmb3IgKElKYXZhRWxlbWVudCBwa2dGcmFnbWVudCA6IGdldFBhY2thZ2VGcmFnbWVudHMocGFja2FnZUZyYWdtZW50Um9vdCkpIHsKLQkJCWFkZFNlbGVjdGVkVHlwZSgoSVBhY2thZ2VGcmFnbWVudCkgcGtnRnJhZ21lbnQsIHR5cGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZFR5cGUoSVBhY2thZ2VGcmFnbWVudCBwYWNrYWdlRnJhZ21lbnQsIE1hcDxJUHJvamVjdCwgTGlzdDxJVHlwZT4+IHR5cGVzKSB7Ci0JCWZvciAoSUNvbXBpbGF0aW9uVW5pdCBjb21wVW5pdCA6IGdldENvbXBpbGF0aW9uVW5pdHMocGFja2FnZUZyYWdtZW50KSkgewotCQkJYWRkU2VsZWN0ZWRUeXBlKGNvbXBVbml0LCB0eXBlcyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFNlbGVjdGVkVHlwZShJQ29tcGlsYXRpb25Vbml0IGNvbXBpbGF0aW9uVW5pdCwgTWFwPElQcm9qZWN0LCBMaXN0PElUeXBlPj4gdHlwZXMpIHsKLQkJSVR5cGUgcHJpbWFyeVR5cGUgPSB0aGlzLmdldFByaW1hcnlUeXBlKGNvbXBpbGF0aW9uVW5pdCk7Ci0JCWlmIChwcmltYXJ5VHlwZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmFkZFNlbGVjdGVkVHlwZShwcmltYXJ5VHlwZSwgdHlwZXMpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRTZWxlY3RlZFR5cGUoSVR5cGUgcHJpbWFyeVR5cGUsIE1hcDxJUHJvamVjdCwgTGlzdDxJVHlwZT4+IHR5cGVzTWFwKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBwcmltYXJ5VHlwZS5nZXRKYXZhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkJTGlzdDxJVHlwZT4gdHlwZXMgPSB0eXBlc01hcC5nZXQocHJvamVjdCk7Ci0JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQl0eXBlcyA9IG5ldyBBcnJheUxpc3Q8SVR5cGU+KCk7Ci0JCQl0eXBlc01hcC5wdXQocHJvamVjdCwgdHlwZXMpOwotCQl9Ci0JCWlmICghdHlwZXMuY29udGFpbnMocHJpbWFyeVR5cGUpKSB7Ci0JCQl0eXBlcy5hZGQocHJpbWFyeVR5cGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0W10gZ2V0Q29tcGlsYXRpb25Vbml0cyhJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCkgewotCQl0cnkgewotCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudC5nZXRDb21waWxhdGlvblVuaXRzKCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBJQ29tcGlsYXRpb25Vbml0WzBdOwotCX0KLQkKLQlwcml2YXRlIElKYXZhRWxlbWVudFtdIGdldFBhY2thZ2VGcmFnbWVudHMoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCkgewotCQl0cnkgewotCQkJcmV0dXJuIHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0Q2hpbGRyZW4oKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQlyZXR1cm4gbmV3IElKYXZhRWxlbWVudFswXTsKLQl9Ci0KLQlwcml2YXRlIElUeXBlIGdldFByaW1hcnlUeXBlKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXJldHVybiBjb21waWxhdGlvblVuaXQuZmluZFByaW1hcnlUeXBlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWZvciAoTGlzdDxJVHlwZT4gdHlwZXMgOiB0aGlzLnNlbGVjdGVkVHlwZXMudmFsdWVzKCkpIHsKLQkJCS8vb3BlbiB0aGUgd2l6YXJkIG9uY2UgZm9yIGVhY2ggc2VsZWN0ZWQgcHJvamVjdAotCQkJSnBhTWFrZVBlcnNpc3RlbnRXaXphcmQgd2l6YXJkID0gbmV3IEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkKHR5cGVzKTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewotCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkpwYVJlc291cmNlQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvT3BlbkpwYVJlc291cmNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZTE1NjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9hY3Rpb25zL09wZW5KcGFSZXNvdXJjZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5EZWZhdWx0SnBhU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5CYXNlU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLQotcHVibGljIGNsYXNzIE9wZW5KcGFSZXNvdXJjZUFjdGlvbgotCQlleHRlbmRzIEJhc2VTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0JCi0JcHJpdmF0ZSBKcGFDb250ZXh0Tm9kZSBzZWxlY3RlZE5vZGU7Ci0JCi0JCi0JcHVibGljIE9wZW5KcGFSZXNvdXJjZUFjdGlvbigpIHsKLQkJc3VwZXIoIk9wZW4iKTsgICAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzKSB7Ci0JCXNlbGVjdGVkTm9kZSA9IG51bGw7Ci0JCQotCQlpZiAoISBzdXBlci51cGRhdGVTZWxlY3Rpb24ocykpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJaWYgKHMuZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBKcGFSb290Q29udGV4dE5vZGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJc2VsZWN0ZWROb2RlID0gKEpwYUNvbnRleHROb2RlKSBzLmdldEZpcnN0RWxlbWVudCgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICghIGlzRW5hYmxlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IHNlbGVjdGVkTm9kZS5nZXRSZXNvdXJjZSgpOwotCQkKLQkJaWYgKHJlc291cmNlICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkgJiYgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlvcGVuRWRpdG9yKChJRmlsZSkgcmVzb3VyY2UpOwotCQkJCQotCQkJCi0JCQlpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgSnBhU3RydWN0dXJlTm9kZSkgewotCQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9Ci0JCQkJCVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3QobmV3IERlZmF1bHRKcGFTZWxlY3Rpb24oKEpwYVN0cnVjdHVyZU5vZGUpIHNlbGVjdGVkTm9kZSksIG51bGwpOwotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIG9wZW5FZGl0b3IoSUZpbGUgZmlsZSkgewotCQlJRWRpdG9yUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IElERS5nZXRDb250ZW50VHlwZShmaWxlKTsKLQkJSUVkaXRvckRlc2NyaXB0b3IgZWRpdG9yRGVzY3JpcHRvciA9IHJlZ2lzdHJ5LmdldERlZmF1bHRFZGl0b3IoZmlsZS5nZXROYW1lKCksIGNvbnRlbnRUeXBlKTsKLQkJaWYgKGVkaXRvckRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJcmV0dXJuOyAgLy8gbm8gZWRpdG9yIGFzc29jaWF0ZWQuLi4KLQkJfQotCQkKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkKLQkJdHJ5IHsKLQkJCXBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JEZXNjcmlwdG9yLmdldElkKCkpOwotCQl9IAotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKHBhZ2UuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwgSnB0VWlNZXNzYWdlcy5FcnJvcl9vcGVuaW5nRWRpdG9yLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9hY3Rpb25zL1Byb2plY3RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxYjYzOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2FjdGlvbnMvUHJvamVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLkpwYVBsYXRmb3JtVWlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLS8qKgotICogT3ZlcnJpZGUgYW55IG9mIHRoZSAjZXhlY3V0ZSgpIG1ldGhvZHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9qZWN0QWN0aW9uIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByaXZhdGUgSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotICAgIAotCi0JcHVibGljIFByb2plY3RBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLSAgICAgICAgdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlpZiAodGhpcy5jdXJyZW50U2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXJldHVybiAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHRoaXMuY3VycmVudFNlbGVjdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmICh0aGlzLmN1cnJlbnRTZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJZm9yIChJdGVyYXRvciBzdHJlYW0gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB0aGlzLmN1cnJlbnRTZWxlY3Rpb24pLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJCXRoaXMuZXhlY3V0ZShzdHJlYW0ubmV4dCgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoT2JqZWN0IHNlbGVjdGlvbikgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gdGhpcy5wcm9qZWN0RnJvbVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4ZWN1dGUocHJvamVjdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgcHJvamVjdEZyb21TZWxlY3Rpb24oT2JqZWN0IHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiAoSVByb2plY3QpIHNlbGVjdGlvbjsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUphdmFQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKChJSmF2YVByb2plY3QpIHNlbGVjdGlvbikuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVN0cmluZyBjb3JlSnBhUGxhdGZvcm1JZCA9IHByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotICAgICAgICByZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShjb3JlSnBhUGxhdGZvcm1JZCk7IAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5leGVjdXRlKGpwYVByb2plY3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9hY3Rpb25zL1N5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjE2ZDdhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvYWN0aW9ucy9TeW5jaHJvbml6ZUNsYXNzZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuc3luY2guU3luY2hyb25pemVDbGFzc2VzSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLQotcHVibGljIGNsYXNzIFN5bmNocm9uaXplQ2xhc3Nlc0FjdGlvbiAKLQlpbXBsZW1lbnRzIElPYmplY3RBY3Rpb25EZWxlZ2F0ZSAKLXsKLQlwcml2YXRlIElGaWxlIGZpbGU7Ci0JCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFydChJQWN0aW9uIGFjdGlvbiwgSVdvcmtiZW5jaFBhcnQgdGFyZ2V0UGFydCkgewotCQkvLyBuby1vcCBmb3Igbm93Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCVN5bmNocm9uaXplQ2xhc3Nlc0pvYiBqb2IgPSBuZXcgU3luY2hyb25pemVDbGFzc2VzSm9iKGZpbGUpOwotCQlqb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBBY3Rpb24gaXMgY29udHJpYnV0ZWQgZm9yIElGaWxlJ3MgbmFtZWQgInBlcnNpc3RlbmNlLnhtbCIgYW5kCi0JCS8vIGZvciBQZXJpc3RlbmNlWG1sIG9iamVjdHMuCi0JCS8vIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBlbGVtZW50IGluIGFjdHVhbCBzZWxlY3Rpb24uCi0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9ICgoU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCi0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlmaWxlID0gKElGaWxlKSBzZWxlY3RlZE9iamVjdDsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlWG1sKSB7Ci0JCQlmaWxlID0gKElGaWxlKSAoKFBlcnNpc3RlbmNlWG1sKSBzZWxlY3RlZE9iamVjdCkuZ2V0UmVzb3VyY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwSGFuZGxlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDdlZTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9jb21tYW5kcy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGlhbG9ncy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17Ci0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSAKLQkJCUhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJZmluYWwgTGlzdDxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IG5ld0F0dHJpYnV0ZXMgPSBuZXcgQXJyYXlMaXN0PE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiAKLQkJCT0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBIYW5kbGVyVXRpbC5nZXRDdXJyZW50U2VsZWN0aW9uQ2hlY2tlZChleGVjdXRpb25FdmVudCk7Ci0JCQotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2JqZWN0cyBpbiBhIHRyZWUKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogKEl0ZXJhYmxlPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4pIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZWxlY3Rpb24uaXRlcmF0b3IoKSkpIHsKLQkJCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBhdHRyaWJ1dGUuZ2V0T3duaW5nUGVyc2lzdGVudFR5cGUoKTsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKLQkJCQotCQkJQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cod2luZG93LmdldFNoZWxsKCksIGF0dHJpYnV0ZSk7Ci0JCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJCi0JCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXR0cmlidXRlID0gdHlwZS5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCWlmIChuZXdBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCW5ld0F0dHJpYnV0ZXMuYWRkKG5ld0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmIChuZXdBdHRyaWJ1dGVzLnNpemUoKSA9PSAxKSB7Ci0JCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcih3aW5kb3cpOwotCQkJCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3QobmV3IERlZmF1bHRKcGFTZWxlY3Rpb24obmV3QXR0cmlidXRlcy5nZXQoMCkpLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEhhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODgwZTIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17CQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBPYmplY3QgZXhlY3V0ZShFeGVjdXRpb25FdmVudCBleGVjdXRpb25FdmVudCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gCi0JCQlIYW5kbGVyVXRpbC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3dDaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCWZpbmFsIExpc3Q8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBuZXdBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAKLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2JqZWN0cyBpbiBhIHRyZWUKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogKEl0ZXJhYmxlPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4pIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZWxlY3Rpb24uaXRlcmF0b3IoKSkpIHsKLQkJCW5ld0F0dHJpYnV0ZXMuYWRkKGF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKSk7Ci0JCX0KLQkJCi0JCWlmIChuZXdBdHRyaWJ1dGVzLnNpemUoKSA9PSAxKSB7Ci0JCQl3aW5kb3cuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKAotCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcih3aW5kb3cpOwotCQkJCQkJc2VsZWN0aW9uTWFuYWdlci5zZWxlY3QobmV3IERlZmF1bHRKcGFTZWxlY3Rpb24obmV3QXR0cmlidXRlcy5nZXQoMCkpLCBudWxsKTsKLQkJCQkJfQotCQkJCX0pOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL0FkZFBlcnNpc3RlbnRDbGFzc0hhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudENsYXNzSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDY4ZDdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvQWRkUGVyc2lzdGVudENsYXNzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGlhbG9ncy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi17Ci0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSAKLQkJCUhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uIAotCQkJPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIEhhbmRsZXJVdGlsLmdldEN1cnJlbnRTZWxlY3Rpb25DaGVja2VkKGV4ZWN1dGlvbkV2ZW50KTsKLQkJCi0JCS8vIG9ubHkgYXBwbGllcyBmb3IgYSBzaW5nbHkgc2VsZWN0ZWQgRW50aXR5TWFwcGluZ3Mgb2JqZWN0IGluIGEgdHJlZQotCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9Ci0JCQkoRW50aXR5TWFwcGluZ3MpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCi0JCUFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZyBkaWFsb2cgPSAKLQkJCW5ldyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cod2luZG93LmdldFNoZWxsKCksIGVudGl0eU1hcHBpbmdzKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWZpbmFsIE9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBkaWFsb2cub3BlbkFuZFJldHVyblR5cGUoKTsKLQkJCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXdpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMoCi0JCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPSBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKHdpbmRvdyk7Ci0JCQkJCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdChuZXcgRGVmYXVsdEpwYVNlbGVjdGlvbih0eXBlKSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJfQotCQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9jb21tYW5kcy9Db252ZXJ0SmF2YVByb2plY3RUb0pwYUNvbW1hbmRIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL0NvbnZlcnRKYXZhUHJvamVjdFRvSnBhQ29tbWFuZEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmOWVhYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL0NvbnZlcnRKYXZhUHJvamVjdFRvSnBhQ29tbWFuZEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUudXRpbC5pbnRlcm5hbC5GaWxlVXRpbC4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuaW50ZXJuYWwuRmFjZXRlZFByb2plY3ROYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLk1vZGlmeUZhY2V0ZWRQcm9qZWN0V2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgQ29udmVydEphdmFQcm9qZWN0VG9KcGFDb21tYW5kSGFuZGxlcgotCQlleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KQotCQkJdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbihldmVudCk7Ci0JCQotCQlpZiAoY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGN1cnJlbnRTZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotCQkJcHJvamVjdCA9IChJUHJvamVjdCkgUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQcm9qZWN0LmNsYXNzKTsKLQkJfSAKLQkJCi0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdvcmtiZW5jaFdpbmRvdyA9IEhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdyhldmVudCk7Ci0JCQotCQlpZiAoYWN0aXZlV29ya2JlbmNoV2luZG93ICE9IG51bGwpIHsKLQkJCVNoZWxsIHNoZWxsID0gYWN0aXZlV29ya2JlbmNoV2luZG93LmdldFNoZWxsKCk7Ci0JCQkKLQkJCUNvbnZlcnRKYXZhUHJvamVjdFRvSnBhUnVubmFibGUucnVuSW5Qcm9ncmVzc0RpYWxvZyhzaGVsbCwgcHJvamVjdCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb252ZXJ0SmF2YVByb2plY3RUb0pwYVJ1bm5hYmxlCi0JCQlpbXBsZW1lbnRzIElSdW5uYWJsZVdpdGhQcm9ncmVzcyB7Ci0JCQotCQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IHByb2plY3Q7Ci0JCXByaXZhdGUgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZnByb2p3YzsKLQkJCi0JCXB1YmxpYyBzdGF0aWMgdm9pZCBydW5JblByb2dyZXNzRGlhbG9nKFNoZWxsIHNoZWxsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQlmaW5hbCBDb252ZXJ0SmF2YVByb2plY3RUb0pwYVJ1bm5hYmxlIHJ1bm5hYmxlIAotCQkJCQk9IG5ldyBDb252ZXJ0SmF2YVByb2plY3RUb0pwYVJ1bm5hYmxlKHByb2plY3QpOwotCQkJCi0JCQl0cnkgewotCQkJCW5ldyBQcm9ncmVzc01vbml0b3JEaWFsb2coc2hlbGwpLnJ1bih0cnVlLCB0cnVlLCBydW5uYWJsZSk7Ci0JCQkJCi0JCQkJTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQgd2l6YXJkIAotCQkJCQkJPSBuZXcgTW9kaWZ5RmFjZXRlZFByb2plY3RXaXphcmQocnVubmFibGUuZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpKTsKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQkKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBEaWFsb2cuQ0FOQ0VMKSB7Ci0JCQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCQljYXRjaChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmVtb3ZlRmFjZXROYXR1cmUocHJvamVjdCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlRmFjZXROYXR1cmUoSVByb2plY3QgcHJvamVjdCkgewotCQkJdHJ5IHsKLQkJCQlJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gcHJvamVjdC5nZXREZXNjcmlwdGlvbigpOwotCQkJCVN0cmluZ1tdIHByZXZOYXR1cmVzID0gZGVzY3JpcHRpb24uZ2V0TmF0dXJlSWRzKCk7Ci0JCQkJU3RyaW5nW10gbmV3TmF0dXJlcyA9IEFycmF5VG9vbHMucmVtb3ZlKHByZXZOYXR1cmVzLCBGYWNldGVkUHJvamVjdE5hdHVyZS5OQVRVUkVfSUQpOwotCQkJCWRlc2NyaXB0aW9uLnNldE5hdHVyZUlkcyggbmV3TmF0dXJlcyApOwotCQkJCQotCQkJCXZhbGlkYXRlRWRpdCggcHJvamVjdC5nZXRGaWxlKCBGSUxFX0RPVF9QUk9KRUNUICkgKTsKLQkJICAgICAgICAgICAgCi0JCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbiwgbnVsbCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhjZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlwdWJsaWMgQ29udmVydEphdmFQcm9qZWN0VG9KcGFSdW5uYWJsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKQotCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCW1vbml0b3IuYmVnaW5UYXNrKEpwdFVpTWVzc2FnZXMuY29udmVydFRvSnBhX2NvbnZlcnRpbmdQcm9qZWN0LCAxMDAwKTsKLQkJCQotCQkJdHJ5IHsKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIGNyZWF0ZVByb2dyZXNzTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMTAwKTsKLQkJCQlJRmFjZXRlZFByb2plY3QgZnByb2ogPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUodGhpcy5wcm9qZWN0LCB0cnVlLCBjcmVhdGVQcm9ncmVzc01vbml0b3IpOwotCQkJCQotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQl0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJCi0JCQkJbW9uaXRvci5zZXRUYXNrTmFtZShKcHRVaU1lc3NhZ2VzLmNvbnZlcnRUb0pwYV9kZXRlY3RpbmdUZWNobm9sb2dpZXMpOwotCQkJCQotCQkJCUlQcm9ncmVzc01vbml0b3IgZGV0ZWN0UHJvZ3Jlc3NNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCA4MDApOwotCQkJCXRoaXMuZnByb2p3YyA9IGZwcm9qLmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQkJdGhpcy5mcHJvandjLmRldGVjdChkZXRlY3RQcm9ncmVzc01vbml0b3IpOwotCQkJCQotCQkJCWlmICghIHRoaXMuZnByb2p3Yy5oYXNQcm9qZWN0RmFjZXQoSnBhRmFjZXQuRkFDRVQpKSB7Ci0JCQkJCXRoaXMuZnByb2p3Yy5hZGRQcm9qZWN0RmFjZXQoSnBhRmFjZXQuRkFDRVQuZ2V0RGVmYXVsdFZlcnNpb24oKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2goQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKSB7Ci0JCQlyZXR1cm4gdGhpcy5mcHJvandjOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEyYzAzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzLklFbGVtZW50VXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5VSUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc2VydmljZXMuSUV2YWx1YXRpb25TZXJ2aWNlOwotCi0vKioKLSAqIFRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSBvZiB0aGUgc2VsZWN0ZWQKLSAqIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGU8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiB0aGUgSlBUIHBsdWdpbi54bWwuIEl0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUKLSAqIG1hcHBpbmcgYWN0aW9uIGR5bmFtaWNhbGx5IGNyZWF0ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0gKgotICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlCi0gKiBAc2VlIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyCi0JaW1wbGVtZW50cyBJRWxlbWVudFVwZGF0ZXIKLXsKLQkvKioKLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIE1hcCBBcyBjb21tYW5kIHVzZWQgZm9yIDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGU8L2NvZGU+Ci0JICogZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0SnBhVWlQbHVnaW48L2NvZGU+IHBsdWdpbi54bWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBcyI7Ci0JCi0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBNYXAgQXMgY29tbWFuZCBwYXJhbWV0ZXIgdXNlZCBmb3IgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZTwvY29kZT4KLQkgKiBkZWZpbmVkIGluIHRoZSA8Y29kZT5KcHRKcGFVaVBsdWdpbjwvY29kZT4gcGx1Z2luLnhtbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEVDSUZJRURfTUFQUElOR19DT01NQU5EX1BBUkFNRVRFUl9JRCA9ICJzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlTWFwcGluZ0tleSI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEID0gImRlZmF1bHRQZXJzaXN0ZW50QXR0cmlidXRlTWFwcGluZ0tleSI7Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCS8vIFJldHJpZXZlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgRXhlY3V0aW9uRXZlbnQKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOwotCi0JCS8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgdW5pcXVlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmQKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBldmVudC5nZXRQYXJhbWV0ZXIoU1BFQ0lGSUVEX01BUFBJTkdfQ09NTUFORF9QQVJBTUVURVJfSUQpOwotCi0JCS8vIENoYW5nZSB0aGUgbWFwcGluZyBrZXkgZm9yIGFsbCB0aGUgc2VsZWN0ZWQgaXRlbXMKLQkJZm9yIChPYmplY3QgaXRlbSA6IHNlbGVjdGlvbi50b0FycmF5KCkpIHsKLQkJCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIGl0ZW07Ci0JCQlhdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShtYXBwaW5nS2V5KTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVFbGVtZW50KFVJRWxlbWVudCBlbGVtZW50LCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwIHBhcmFtZXRlcnMpIHsKLQkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIFVJRWxlbWVudAotCQkKLQkJLy8gRHVlIHRvIEJ1ZyAyMjY3NDYsIHdlIGhhdmUgdG8gdXNlIEFQSSB3b3JrYXJvdW5kIHRvIHJldHJpZXZlIGN1cnJlbnQgCi0JCS8vIHNlbGVjdGlvbgotCQlJRXZhbHVhdGlvblNlcnZpY2UgZXMgCi0JCQk9IChJRXZhbHVhdGlvblNlcnZpY2UpIGVsZW1lbnQuZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRTZXJ2aWNlKElFdmFsdWF0aW9uU2VydmljZS5jbGFzcyk7Ci0JCUlWaWV3UGFydCBwYXJ0ID0gCi0JCQkoSVZpZXdQYXJ0KSBlcy5nZXRDdXJyZW50U3RhdGUoKS5nZXRWYXJpYWJsZShJU291cmNlcy5BQ1RJVkVfUEFSVF9OQU1FKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uIAotCQkJPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQllbGVtZW50LnNldENoZWNrZWQoc2VsZWN0ZWRFbGVtZW50c01hcHBpbmdLZXlzTWF0Y2goc2VsZWN0aW9uLCBwYXJhbWV0ZXJzKSk7Ci0JfQotCQotCS8vQ2hlY2sgYWxsIHRoZSBzZWxlY3RlZCBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBhbmQgdmVyaWZ5IHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lIG1hcHBpbmcgdHlwZS4KLQkvL1RoZXkgbXVzdCBhbGwgYmUgZWl0aGVyIGRlZmF1bHQgbWFwcGluZ3Mgb3Igc3BlY2lmaWVkIG1hcHBpbmdzIGFzIHdlbGwuCi0JcHJvdGVjdGVkIGJvb2xlYW4gc2VsZWN0ZWRFbGVtZW50c01hcHBpbmdLZXlzTWF0Y2goSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIGhhbmRsZXJTcGVjaWZpZWRNYXBwaW5nS2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoU1BFQ0lGSUVEX01BUFBJTkdfQ09NTUFORF9QQVJBTUVURVJfSUQpOwotCQlTdHJpbmcgaGFuZGxlckRlZmF1bHRNYXBwaW5nS2V5ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoREVGQVVMVF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEKTsKLQkJCi0JCVN0cmluZyBjb21tb25EZWZhdWx0S2V5ID0gbnVsbDsKLQkJU3RyaW5nIGNvbW1vblNwZWNpZmllZEtleSA9IG51bGw7Ci0JCWZvciAoT2JqZWN0IG9iaiA6IHNlbGVjdGlvbi50b0FycmF5KCkpIHsKLQkJCWlmICghIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW50QXR0cmlidXRlKSkgewotCQkJCS8vb2RkbHkgZW5vdWdoLCB5b3UgaGF2ZSB0byBjaGVjayBpbnN0YW5jZW9mIGhlcmUsIHNlZW1zIGxpa2UgYSBidWcgaW4gdGhlIGZyYW1ld29yawotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9iajsKLQkJCWlmIChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSkgewotCQkJCWlmIChjb21tb25TcGVjaWZpZWRLZXkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCWlmIChjb21tb25EZWZhdWx0S2V5ID09IG51bGwpIHsKLQkJCQkJY29tbW9uRGVmYXVsdEtleSA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpOwkJCQkJCi0JCQkJfQotCQkJCWVsc2UgaWYgKCFjb21tb25EZWZhdWx0S2V5LmVxdWFscyhwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjb21tb25EZWZhdWx0S2V5ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlpZiAoY29tbW9uU3BlY2lmaWVkS2V5ID09IG51bGwpIHsKLQkJCQkJY29tbW9uU3BlY2lmaWVkS2V5ID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCFjb21tb25TcGVjaWZpZWRLZXkuZXF1YWxzKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChoYW5kbGVyU3BlY2lmaWVkTWFwcGluZ0tleSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gaGFuZGxlclNwZWNpZmllZE1hcHBpbmdLZXkuZXF1YWxzKGNvbW1vblNwZWNpZmllZEtleSk7Ci0JCX0KLQkJZWxzZSBpZiAoaGFuZGxlckRlZmF1bHRNYXBwaW5nS2V5ICE9IG51bGwpIHsKLQkJCXJldHVybiBoYW5kbGVyRGVmYXVsdE1hcHBpbmdLZXkuZXF1YWxzKGNvbW1vbkRlZmF1bHRLZXkpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1BlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjQ2MWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9jb21tYW5kcy9QZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5BYnN0cmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwubWVudXMuUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuY29tbWFuZHMuSUVsZW1lbnRVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLkhhbmRsZXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1lbnVzLlVJRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5zZXJ2aWNlcy5JRXZhbHVhdGlvblNlcnZpY2U7Ci0KLS8qKgotICogVGhpcyBoYW5kbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZSBzZWxlY3RlZAotICogPGNvZGU+UGVyc2lzdGVudFR5cGU8L2NvZGU+LgotICogPHA+Ci0gKiBUaGlzIGhhbmRsZXIgaXMgZGVmaW5lZCBpbiB0aGUgSlBUIHBsdWdpbi54bWwuIEl0IHdpbGwgYmUgaW52b2tlZCBieSB0aGUKLSAqIG1hcHBpbmcgYWN0aW9uIGR5bmFtaWNhbGx5IGNyZWF0ZWQgYnkgdGhlIDxjb2RlPlBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb248L2NvZGU+LgotICoKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGUKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlcgotCWltcGxlbWVudHMgSUVsZW1lbnRVcGRhdGVyCi17Ci0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBNYXAgQXMgY29tbWFuZCB1c2VkIGZvciB7QGxpbmsgUGVyc2lzdGVudFR5cGV9Ci0JICogZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0SnBhVWlQbHVnaW48L2NvZGU+IHBsdWdpbi54bWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9JRCA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMiOwotCQotCS8qKgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgTWFwIEFzIGNvbW1hbmQgcGFyYW1ldGVyIHVzZWQgZm9yIHtAbGluayBQZXJzaXN0ZW50VHlwZX0KLQkgKiBkZWZpbmVkIGluIHRoZSA8Y29kZT5KcHRKcGFVaVBsdWdpbjwvY29kZT4gcGx1Z2luLnhtbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1BBUkFNRVRFUl9JRCA9ICJwZXJzaXN0ZW50VHlwZU1hcHBpbmdLZXkiOwotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudFR5cGVNYXBBc0hhbmRsZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCi0JCS8vIFJldHJpZXZlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUgRXhlY3V0aW9uRXZlbnQKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotCQkJSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOwotCi0JCS8vIFJldHJpZXZlIHRoZSB2YWx1ZSBvZiB0aGUgdW5pcXVlIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNvbW1hbmQKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBldmVudC5nZXRQYXJhbWV0ZXIoQ09NTUFORF9QQVJBTUVURVJfSUQpOwotCi0JCS8vIENoYW5nZSB0aGUgbWFwcGluZyBrZXkgZm9yIGFsbCB0aGUgc2VsZWN0ZWQgaXRlbXMKLQkJZm9yIChPYmplY3QgaXRlbSA6IHNlbGVjdGlvbi50b0FycmF5KCkpIHsKLQkJCVBlcnNpc3RlbnRUeXBlIHR5cGUgPSAoUGVyc2lzdGVudFR5cGUpIGl0ZW07Ci0JCQl0eXBlLnNldE1hcHBpbmdLZXkobWFwcGluZ0tleSk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgdXBkYXRlRWxlbWVudChVSUVsZW1lbnQgZWxlbWVudCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmb3IgdGhlIFVJRWxlbWVudAotCQkKLQkJLy8gRHVlIHRvIEJ1ZyAyMjY3NDYsIHdlIGhhdmUgdG8gdXNlIEFQSSB3b3JrYXJvdW5kIHRvIHJldHJpZXZlIGN1cnJlbnQgCi0JCS8vIHNlbGVjdGlvbgotCQlJRXZhbHVhdGlvblNlcnZpY2UgZXMgCi0JCQk9IChJRXZhbHVhdGlvblNlcnZpY2UpIGVsZW1lbnQuZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRTZXJ2aWNlKElFdmFsdWF0aW9uU2VydmljZS5jbGFzcyk7Ci0JCUlWaWV3UGFydCBwYXJ0ID0gCi0JCQkoSVZpZXdQYXJ0KSBlcy5nZXRDdXJyZW50U3RhdGUoKS5nZXRWYXJpYWJsZShJU291cmNlcy5BQ1RJVkVfUEFSVF9OQU1FKTsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uIAotCQkJPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHBhcnQuZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQlTdHJpbmcgY29tbW9uTWFwcGluZ0tleSA9IGNvbW1vbk1hcHBpbmdLZXkoc2VsZWN0aW9uKTsKLQkJCi0JCVN0cmluZyBoYW5kbGVyTWFwcGluZ0tleSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KENPTU1BTkRfUEFSQU1FVEVSX0lEKTsKLQkJaWYgKGhhbmRsZXJNYXBwaW5nS2V5ICE9IG51bGwpIHsKLQkJCWVsZW1lbnQuc2V0Q2hlY2tlZChoYW5kbGVyTWFwcGluZ0tleS5lcXVhbHMoY29tbW9uTWFwcGluZ0tleSkpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByb3RlY3RlZCBTdHJpbmcgY29tbW9uTWFwcGluZ0tleShJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJU3RyaW5nIGNvbW1vbktleSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3Igc3RyZWFtID0gc2VsZWN0aW9uLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJT2JqZWN0IG9iaiA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkKLQkJCWlmICghIChvYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSAoUGVyc2lzdGVudFR5cGUpIG9iajsKLQkJCQotCQkJaWYgKGNvbW1vbktleSA9PSBudWxsKSB7Ci0JCQkJY29tbW9uS2V5ID0gcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZ0tleSgpOwotCQkJfQotCQkJZWxzZSBpZiAoISBjb21tb25LZXkuZXF1YWxzKHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdLZXkoKSkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tbW9uS2V5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvUmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWxIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRBdHRyaWJ1dGVGcm9tWG1sSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWU0ZTE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvUmVtb3ZlUGVyc2lzdGVudEF0dHJpYnV0ZUZyb21YbWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGFuZGxlcnMuSGFuZGxlclV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQZXJzaXN0ZW50QXR0cmlidXRlRnJvbVhtbEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsJCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV4ZWN1dGlvbkV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJZmluYWwgSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSAKLQkJCUhhbmRsZXJVdGlsLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvd0NoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJZmluYWwgTGlzdDxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdDxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAKLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9iamVjdHMgaW4gYSB0cmVlCi0JCWZvciAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiAoSXRlcmFibGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4pIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShzZWxlY3Rpb24uaXRlcmF0b3IoKSkpIHsKLQkJCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQkJaWYgKG5ld0F0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJdmlydHVhbEF0dHJpYnV0ZXMuYWRkKG5ld0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCWlmICh2aXJ0dWFsQXR0cmlidXRlcy5zaXplKCkgPT0gMSkgewotCQkJd2luZG93LmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYygKLQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIod2luZG93KTsKLQkJCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKHZpcnR1YWxBdHRyaWJ1dGVzLmdldCgwKSksIG51bGwpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9jb21tYW5kcy9SZW1vdmVQZXJzaXN0ZW50Q2xhc3NIYW5kbGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFhZTZmYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1JlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5jb21tYW5kczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFJlbW92ZVBlcnNpc3RlbnRDbGFzc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXhlY3V0aW9uRXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAKLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXhlY3V0aW9uRXZlbnQpOwotCQkKLQkJLy8gb25seSBhcHBsaWVzIGZvciBtdWx0aXBseSBzZWxlY3RlZCBPcm1QZXJzaXN0ZW50VHlwZSBvYmplY3RzIGluIGEgdHJlZQotCQlmb3IgKEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBzdHJlYW0gPSBzZWxlY3Rpb24uaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IHN0cmVhbS5uZXh0KCk7Ci0JCQkoKEVudGl0eU1hcHBpbmdzKSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nRmlsZVJvb3QoKSkucmVtb3ZlUGVyc2lzdGVudFR5cGUocGVyc2lzdGVudFR5cGUpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2NvbW1hbmRzL1VwZ3JhZGVYbWxGaWxlVmVyc2lvbkhhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvVXBncmFkZVhtbEZpbGVWZXJzaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTZjNTRjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvY29tbWFuZHMvVXBncmFkZVhtbEZpbGVWZXJzaW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuY29tbWFuZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5YbWxGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhUm9vdEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5IYW5kbGVyVXRpbDsKLQotcHVibGljIGNsYXNzIFVwZ3JhZGVYbWxGaWxlVmVyc2lvbkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIKLXsKLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gCi0JCQk9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgSGFuZGxlclV0aWwuZ2V0Q3VycmVudFNlbGVjdGlvbkNoZWNrZWQoZXZlbnQpOwotCi0JCWZvciAoT2JqZWN0IHNlbGVjdGVkT2JqZWN0IDogc2VsZWN0aW9uLnRvQXJyYXkoKSkgewotCQkJdXBncmFkZVhtbEZpbGVWZXJzaW9uKHNlbGVjdGVkT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGdyYWRlWG1sRmlsZVZlcnNpb24oT2JqZWN0IHNlbGVjdGVkT2JqZWN0KSB7Ci0JCUpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gCi0JCQkoSnBhWG1sUmVzb3VyY2UpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihzZWxlY3RlZE9iamVjdCwgSnBhWG1sUmVzb3VyY2UuY2xhc3MpOwotCQlpZiAoeG1sUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJWG1sRmlsZSB4bWxGaWxlID0gCi0JCQkJKFhtbEZpbGUpIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcihzZWxlY3RlZE9iamVjdCwgWG1sRmlsZS5jbGFzcyk7Ci0JCQlpZiAoeG1sRmlsZSAhPSBudWxsKSB7Ci0JCQkJeG1sUmVzb3VyY2UgPSB4bWxGaWxlLmdldFhtbFJlc291cmNlKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbFJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZpbmFsIEpwYVJvb3RFT2JqZWN0IHJvb3QgPSB4bWxSZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IHhtbFJlc291cmNlLmdldENvbnRlbnRUeXBlKCk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh4bWxSZXNvdXJjZS5nZXRQcm9qZWN0KCkpOwotCQlmaW5hbCBTdHJpbmcgbmV3VmVyc2lvbiA9IGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKS5nZXRNb3N0UmVjZW50U3VwcG9ydGVkUmVzb3VyY2VUeXBlKGNvbnRlbnRUeXBlKS5nZXRWZXJzaW9uKCk7Ci0KLQkJeG1sUmVzb3VyY2UubW9kaWZ5KAotCQkJbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJcm9vdC5zZXRWZXJzaW9uKG5ld1ZlcnNpb24pOwotCQkJCX0KLQkJCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjU4ZjcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkxvYkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW51bVR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcHRpb25hbENvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IExvYkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEJhc2ljTWFwcGluZwotICogQHNlZSBDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgRW51bVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIExvYkNvbXBvc2l0ZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBCYXNpY01hcHBpbmc+IAotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQmFzaWNNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplQmFzaWNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJhc2ljQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQmFzaWNTZWN0aW9uX3RpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplQmFzaWNTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCYXNpY1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fdHlwZQotCQkpOwotCQl0aGlzLmluaXRpYWxpemVUeXBlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIobnVsbCksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJLy8gTG9iCi0JCUJ1dHRvbiBsb2JCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9sb2IsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKExvYkNvbnZlcnRlci5jbGFzcyksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIGxvYkJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGNvbnZlcnRlckhvbGRlciA9IGJ1aWxkQ29udmVydGVySG9sZGVyKCk7Ci0JCS8vIFRlbXBvcmFsCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3RlbXBvcmFsLCAKLQkJCWJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyksIAotCQkJbnVsbCk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShuZXcgVGVtcG9yYWxUeXBlQ29tcG9zaXRlKGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQkJCi0JCQotCQkvLyBFbnVtZXJhdGVkCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2VudW1lcmF0ZWQsIAotCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IEVudW1UeXBlQ29tcG9zaXRlKGJ1aWxkRW51bWVyYXRlZENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCBjb250YWluZXIsIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sdW1uPiBidWlsZENvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBDb2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxDb252ZXJ0ZXI+IGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUZW1wb3JhbENvbnZlcnRlciB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBUZW1wb3JhbENvbnZlcnRlci5jbGFzcyA/IChUZW1wb3JhbENvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyPiBidWlsZEVudW1lcmF0ZWRDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFbnVtZXJhdGVkQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1lcmF0ZWRDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyA/IChFbnVtZXJhdGVkQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBDb252ZXJ0ZXI+IGNvbnZlcnRlclR5cGUpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzaWNNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gY29udmVydGVyVHlwZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZWY0NmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBCYXNpY01hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RCYXNpY01hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5CYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDU5NDQxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgRW1iZWRkYWJsZQotICogQHNlZSBKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGU8VCBleHRlbmRzIEVtYmVkZGFibGU+IAotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkYWJsZUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGFibGVTZWN0aW9uX3RpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplRW1iZWRkYWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGFibGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1ZWIzMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVtYmVkZGFibGU+IAotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5FbWJlZGRhYmxlVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5FbWJlZGRhYmxlVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjMGU1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZz4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplRW1iZWRkZWRJZENvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW1iZWRkZWRJZFNlY3Rpb25fdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGVkSWRTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZElkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDJmZTEyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWVkZjhlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUVtYmVkZGVkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRlZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGVkU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxMWZkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgQmFzZUVtYmVkZGVkTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlPFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjk5YzFhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRW1iZWRkZWRNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVtYmVkZGVkTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MjE5YTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW50aXR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW50aXR5TmFtZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IEF0dHJpYnV0ZSBPdmVycmlkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBTZWNvbmRhcnkgVGFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIHYgSW5oZXJpdGFuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEluaGVyaXRhbmNlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IFF1ZXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBRdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gdiBHZW5lcmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgR2VuZXJhdG9yc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEVudGl0eU5hbWVDb21wb3NpdGUKLSAqIEBzZWUgSW5oZXJpdGFuY2VDb21wb3NpdGUKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICogQHNlZSBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUKLSAqIEBzZWUgVGFibGVDb21wb3NpdGUKLSAqIEBzZWUgR2VuZXJhdGlvbkNvbXBvc2l0ZQotICoKLSAqIFRPRE8gdGFsayB0byBKYXZhRWRpdG9yIHBlb3BsZSBhYm91dCB3aGF0IHdlIGNhbiBkbyB0byBob29rIGluIFRhYmJlZFByb3BlcnRpZXMgZm9yIHRoZSBKYXZhRWRpdG9yCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PgotCWV4dGVuZHMgUGFuZTxUPgotICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpOwotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVJbmhlcml0YW5jZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplR2VuZXJhdG9yc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkVudGl0eVNlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPElkQ2xhc3NSZWZlcmVuY2U+IGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBJZENsYXNzUmVmZXJlbmNlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElkQ2xhc3NSZWZlcmVuY2UgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfcXVlcmllcyk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIsIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gcXVlcnlDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IFF1ZXJpZXNDb21wb3NpdGUodGhpcywgcXVlcnlDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBidWlsZFF1ZXJ5Q29udGFpbmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFF1ZXJ5Q29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFF1ZXJ5Q29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlc1NlY3Rpb24pOwotCQlpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbnRpdHlDb21wb3NpdGVfaW5oZXJpdGFuY2UpOwotCQlpbml0aWFsaXplSW5oZXJpdGFuY2VTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25TZWN0aW9uKTsKLQkJaW5pdGlhbGl6ZUdlbmVyYXRvcnNTZWN0aW9uKGNvbnRhaW5lciwgYnVpbGRHZW5lcmF0b3JDb250YWluZXIoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0b3JzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JDb250YWluZXJIb2xkZXIpIHsKLQkJbmV3IEdlbmVyYXRpb25Db21wb3NpdGUodGhpcywgZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEdlbmVyYXRvckNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0b3JDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0b3JDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlX3NlY29uZGFyeVRhYmxlcyk7Ci0JCWluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjNjNWY4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVN0cnVjdHVyZU5vZGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFEZXRhaWxzUHJvdmlkZXIKLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlyZXR1cm4gVG9vbHMudmFsdWVzQXJlRXF1YWwoc3RydWN0dXJlTm9kZS5nZXRJZCgpLCBPcm1TdHJ1Y3R1cmVOb2Rlcy5FTlRJVFlfTUFQUElOR1NfSUQpCi0JCQkJJiYgcHJvdmlkZXNEZXRhaWxzKHN0cnVjdHVyZU5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBwcm92aWRlc0RldGFpbHMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmJjNzMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlPEVudGl0eT4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbnRpdHk+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0RW50aXR5VWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRhZTkwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb248TSwgVCBleHRlbmRzIEVudGl0eT4gCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5FbnRpdHlVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVudGl0eVVpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JUeXBlTWFwcGluZyhnZXRLZXkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzYjE4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPFQgZXh0ZW5kcyBJZE1hcHBpbmc+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci0gICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwdWJsaWMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZUlkQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVUeXBlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVHZW5lcmF0aW9uQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJZENvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRTZWN0aW9uX3RpdGxlLAotCQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplSWRTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3R5cGUpOwotCQl0aGlzLmluaXRpYWxpemVUeXBlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVHlwZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkoKEdyaWRMYXlvdXQpIGNvbnRhaW5lci5nZXRMYXlvdXQoKSkubnVtQ29sdW1ucyA9IDI7Ci0JCQotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKLQkJCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIobnVsbCksIAotCQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBub0NvbnZlcnRlckJ1dHRvbi5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQkKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyID0gYnVpbGRDb252ZXJ0ZXJIb2xkZXIoKTsKLQkJLy8gVGVtcG9yYWwKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQkJYnVpbGRDb252ZXJ0ZXJCb29sZWFuSG9sZGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKSwgCi0JCQkJbnVsbCk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShuZXcgVGVtcG9yYWxUeXBlQ29tcG9zaXRlKGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgY29udGFpbmVyLCBnZXRXaWRnZXRGYWN0b3J5KCkpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRpb25Db2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSAgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sdW1uIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDb2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ29udmVydGVyQm9vbGVhbkhvbGRlcihmaW5hbCBDbGFzczw/IGV4dGVuZHMgQ29udmVydGVyPiBjb252ZXJ0ZXJUeXBlKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBjb252ZXJ0ZXJUeXBlKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKGNvbnZlcnRlclR5cGUpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXI+IGJ1aWxkQ29udmVydGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBDb252ZXJ0ZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29udmVydGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxDb252ZXJ0ZXI+IGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUZW1wb3JhbENvbnZlcnRlciB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBUZW1wb3JhbENvbnZlcnRlci5jbGFzcyA/IChUZW1wb3JhbENvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmE2M2EzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SWRNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBJZE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RJZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MGI0YTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFN0cmF0ZWd5OiAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFZhbHVlOiAgICAgICAgICAgICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ID4gRGlzY3JpbWluYXRvciBDb2x1bW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IE5hbWU6ICAgICAgICAgICAgICAgIHwgQ29sdW1uQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFR5cGU6ICAgICAgICAgICAgICAgIHwgRW51bUNvbWJvVmlld2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENvbHVtbiBEZWZpbml0aW9uOiAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IExlbmd0aDogICAgICAgICAgICAgIHwgSSAgICAgICB8SXwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIEVudW1Db21ib1ZpZXdlcgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxUIGV4dGVuZHMgRW50aXR5PiBleHRlbmRzIFBhbmU8VD4gewotCi0JLyoqCi0JICogQSBrZXkgdXNlZCB0byByZXByZXNlbnQgdGhlIGRlZmF1bHQgdmFsdWUsIHRoaXMgaXMgcmVxdWlyZWQgdG8gY29udmVydAotCSAqIHRoZSBzZWxlY3RlZCBpdGVtIGZyb20gYSBjb21ibyB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhpcyBrZXkgaXMgbW9zdAotCSAqIGxpa2VseSBuZXZlciB0eXBlZCB0aGUgdXNlciBhbmQgaXQgd2lsbCBoZWxwIHRvIGNvbnZlcnQgdGhlIHZhbHVlIHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4gd2hlbiBpdCdzIHRpbWUgdG8gc2V0IHRoZSBuZXcgc2VsZWN0ZWQgdmFsdWUgaW50byB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBERUZBVUxUX0tFWSA9ICI/ISMhPyM/Iz9kZWZhdWx0PyM/ISM/ISM/IjsKLQkKLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBOT05FX0tFWSA9ICI/ISMhPyM/Iz9ub25lPyM/ISM/ISM/IjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWludCBncm91cEJveE1hcmdpbiA9IGdldEdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJQ29tcG9zaXRlIHN1YlBhbmUgPSBhZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiwgMCwgZ3JvdXBCb3hNYXJnaW4KLQkJKTsKLQotCQkvLyBTdHJhdGVneSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlzdWJQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfc3RyYXRlZ3ksCi0JCQlhZGRTdHJhdGVneUNvbWJvKHN1YlBhbmUpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX1NUUkFURUdZCi0JCSk7Ci0KLQkJLy8gRGlzY3JpbmF0b3IgVmFsdWUgd2lkZ2V0cwotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZHZFbmFibGVkID0gdGhpcy5idWlsZERpc2NyaW1pbmF0b3JWYWx1ZUVuYWJsZWRIb2xkZXIoKTsKLQkJQ29tYm8gZGlzY3JpbWluYXRvclZhbHVlQ29tYm8gPSBhZGRFZGl0YWJsZUNvbWJvKAotCQkJc3ViUGFuZSwKLQkJCWJ1aWxkRGlzY3JpbWluYXRvclZhbHVlTGlzdEhvbGRlcigpLAotCQkJYnVpbGREaXNjcmltaW5hdG9yVmFsdWVIb2xkZXIoKSwKLQkJCWJ1aWxkRGlzY3JpbWluYXRvclZhbHVlQ29udmVydGVyKCksCi0JCQlkdkVuYWJsZWQKLQkJKTsKLQkJTGFiZWwgZGlzY3JpbWluYXRvclZhbHVlTGFiZWwgPSBhZGRMYWJlbCgKLQkJCXN1YlBhbmUsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlLAotCQkJZHZFbmFibGVkCi0JCSk7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlzdWJQYW5lLAotCQkJZGlzY3JpbWluYXRvclZhbHVlTGFiZWwsCi0JCQlkaXNjcmltaW5hdG9yVmFsdWVDb21ibywKLQkJCW51bGwsCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfSU5IRVJJVEFOQ0VfRElTQ1JJTUlOQVRPUl9WQUxVRQotCQkpOwotCQotCQluZXcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZTxFbnRpdHk+KHRoaXMsIGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIHdpZGdldHMKLQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUVuYWJsZWRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfSVNfQUxMT1dFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5zcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWVJc0FsbG93ZWQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JMaXN0VmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9WQUxVRV9QUk9QRVJUWSwgRW50aXR5LkRJU0NSSU1JTkFUT1JfVkFMVUVfSVNfVU5ERUZJTkVEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5zdWJqZWN0LmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJCQlpZiAodmFsdWUgPT0gbnVsbCAmJiB0aGlzLnN1YmplY3QuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSkgewotCQkJCQlyZXR1cm4gTk9ORV9LRVk7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gREVGQVVMVF9LRVkgKyB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZERpc2NyaW1pbmF0b3JWYWx1ZUNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJCS8vdGhpcyBpcyBwYXJ0IG9mIGEgbGlzdCBnaXZlbiB0byBhIGNvbWJvLCBjb21ib3MgZG9uJ3QgdGFrZSBraW5kbHkgdG8gbnVsbAotCQkJCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQ7Ci0JCQkJfQotCi0JCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQkJdmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSkgewotCQkJCQkJdmFsdWUgPSBOT05FX0tFWTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gKHZhbHVlICE9IG51bGwpID8gCi0JCQkJCQkJCURFRkFVTFRfS0VZICsgdmFsdWUKLQkJCQkJCQk6IAotCQkJCQkJCQlERUZBVUxUX0tFWTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdmFsdWUuc3Vic3RyaW5nKERFRkFVTFRfS0VZLmxlbmd0aCgpKTsKLQotCQkJCQlpZiAoZGVmYXVsdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl2YWx1ZSA9IE5MUy5iaW5kKAotCQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCQlkZWZhdWx0TmFtZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJvdmlkZXJEZWZhdWx0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh2YWx1ZS5zdGFydHNXaXRoKE5PTkVfS0VZKSkgewotCQkJCQl2YWx1ZSA9IEpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJCX0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX0RJU0NSSU1JTkFUT1JfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCS8vIENvbnZlcnQgdGhlIGRlZmF1bHQgdmFsdWUgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIG51bGwKLQkJCQlpZiAoKHZhbHVlICE9IG51bGwpICYmCi0JCQkJICAgKCh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB8fCB2YWx1ZS5zdGFydHNXaXRoKERFRkFVTFRfS0VZKSB8fCB2YWx1ZS5zdGFydHNXaXRoKE5PTkVfS0VZKSkpIHsKLQotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCi0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGlzY3JpbWluYXRvclZhbHVlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkRGVmYXVsdERpc2NyaW1pbmF0b3JMaXN0VmFsdWVIb2xkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8RW50aXR5LCBJbmhlcml0YW5jZVR5cGU+IGFkZFN0cmF0ZWd5Q29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnRpdHksIEluaGVyaXRhbmNlVHlwZT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5LkRFRkFVTFRfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eS5TUEVDSUZJRURfSU5IRVJJVEFOQ0VfU1RSQVRFR1lfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBJbmhlcml0YW5jZVR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEluaGVyaXRhbmNlVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhJbmhlcml0YW5jZVR5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgSk9JTkVEIDoKLQkJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5BYnN0cmFjdEluaGVyaXRhbmNlQ29tcG9zaXRlX2pvaW5lZDsKLQkJCQkJY2FzZSBTSU5HTEVfVEFCTEUgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfc2luZ2xlX3RhYmxlOwotCQkJCQljYXNlIFRBQkxFX1BFUl9DTEFTUyA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZV90YWJsZV9wZXJfY2xhc3M7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSW5oZXJpdGFuY2VUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEluaGVyaXRhbmNlVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwZDdhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSWRDbGFzc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIHYgUXVlcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE1hcHBlZFN1cGVyY2xhc3MKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICogQHNlZSBRdWVyaWVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUgZXh0ZW5kcwotCQlBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8SmF2YU1hcHBlZFN1cGVyY2xhc3M+IHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlX3F1ZXJpZXMpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzU2VjdGlvbihjb250YWluZXIsIGJ1aWxkUXVlcnlDb250YWluZXJIb2xkZXIoKSk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IHF1ZXJ5Q29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBRdWVyaWVzQ29tcG9zaXRlKHRoaXMsIHF1ZXJ5Q29udGFpbmVySG9sZGVyLCBjb250YWluZXIpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU1hcHBlZFN1cGVyY2xhc3MsIFF1ZXJ5Q29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFF1ZXJ5Q29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDVhNmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBBYnN0cmFjdCBzdXBlcmNsYXNzIGZvciBqb2luaW5nIHN0cmF0ZWd5IGZvcm0gcGFuZXMKLSAqIAotICogSGVyZSBpcyB0aGUgYmFzaWMgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IG8gPGxhYmVsPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAoam9pbmluZyBzdHJhdGVneSBkZXRhaWxzIGNvbXBvc2l0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNYXBwZWRCeVJlbGF0aW9uc2hpcAotICogQHNlZSBNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0gKiBAc2VlIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lCi0JCTxSIGV4dGVuZHMgUmVhZE9ubHlSZWxhdGlvbnNoaXAsIFMgZXh0ZW5kcyBSZWFkT25seVJlbGF0aW9uc2hpcFN0cmF0ZWd5PiAKLQlleHRlbmRzIFBhbmU8Uj4KLXsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZTsKLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGZvcm0gcGFuZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgUj4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCXByb3RlY3RlZCBBYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc1N0cmF0ZWd5SG9sZGVyKCk7Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQl0aGlzLnN0cmF0ZWd5RGV0YWlsc0NvbXBvc2l0ZSA9IGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKHBhZ2VCb29rKTsKLQkJCi0JCW5ldyBDb250cm9sU3dpdGNoZXIodGhpcy5idWlsZFVzZXNTdHJhdGVneUhvbGRlcigpLCBidWlsZFBhZ2VCb29rVHJhbnNmb3JtZXIoKSwgcGFnZUJvb2spOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCQotCXByb3RlY3RlZCBUcmFuc2Zvcm1lcjxCb29sZWFuLCBDb250cm9sPiBidWlsZFBhZ2VCb29rVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oQm9vbGVhbiB1c2VzU3RyYXRlZ3kpIHsKLQkJCQlyZXR1cm4gKHVzZXNTdHJhdGVneS5ib29sZWFuVmFsdWUoKSkgPyAKLQkJCQkJQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lLnRoaXMuc3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlIDoKLQkJCQkJbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKcGFEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0SnBhRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIyNjFkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RKcGFEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgYmFzZSBjbGFzcyBmb3IgdGhlIGRldGFpbHMgdmlldy4KLSAqCi0gKiBAc2VlIEpwYVN0cnVjdHVyZU5vZGUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2U8VCBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFEZXRhaWxzUGFnZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzZUpwYURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXN1cGVyKG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8VD4oKSwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybVVpKCkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShwbGF0Zm9ybUlkKTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRTdWJqZWN0KFQgc3ViamVjdCkgewotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyID0gKFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFQ+KSBnZXRTdWJqZWN0SG9sZGVyKCk7Ci0JCXN1YmplY3RIb2xkZXIuc2V0VmFsdWUoc3ViamVjdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGZmZjlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9yZGVyaW5nQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgTWFueVRvTWFueU1hcHBpbmcsIFIgZXh0ZW5kcyBNYW55VG9NYW55UmVsYXRpb25zaGlwPiAKLQlleHRlbmRzIFBhbmU8VD4KLSAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVNYW55VG9NYW55Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9NYW55Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvTWFueVNlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVNYW55VG9NYW55U2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGluaXRpYWxpemVNYW55VG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxSPiBidWlsZEpvaW5pbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgUj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFIgdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChSKSB2YWx1ZS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxYWYzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIE1hbnlUb01hbnlNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hbnlUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MmMxNzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmcsIFIgZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbnNoaXA+IAotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JcHJvdGVjdGVkIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplTWFueVRvT25lQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hbnlUb09uZVNlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcik7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxSPiBidWlsZEpvaW5pbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgUj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFIgdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChSKSB2YWx1ZS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDYzNWEwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgTWFueVRvT25lTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFueVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YjI5YzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxUIGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzcz4KLQlleHRlbmRzIFBhbmU8VD4KLSAgICBpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcHBlZFN1cGVyY2xhc3NTZWN0aW9uX3RpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJdGhpcy5pbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hcHBlZFN1cGVyY2xhc3NTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkQ2xhc3NDb21wb3NpdGUodGhpcywgYnVpbGRJZENsYXNzUmVmZXJlbmNlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJZENsYXNzUmVmZXJlbmNlPiBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIElkQ2xhc3NSZWZlcmVuY2U+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSWRDbGFzc1JlZmVyZW5jZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldElkQ2xhc3NSZWZlcmVuY2UoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDc2YTBiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgTWFwcGVkU3VwZXJjbGFzcz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ1NjJlNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotCWltcGxlbWVudHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZEZvcihNIG1hcHBhYmxlT2JqZWN0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE1MTFlNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEpvaW5UYWJsZUNvbXBvc2l0ZQotICogQHNlZSBPcmRlcmluZ0NvbXBvc2l0ZQotICogQHNlZSBUYXJnZXRFbnRpdHlDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgT25lVG9NYW55TWFwcGluZywgUiBleHRlbmRzIE9uZVRvTWFueVJlbGF0aW9uc2hpcD4gCi0JZXh0ZW5kcyBQYW5lPFQ+Ci0JaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZU9uZVRvTWFueUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9NYW55Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT25lVG9NYW55U2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplT25lVG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKTsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmdDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFI+IGJ1aWxkSm9pbmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBSPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUiB0cmFuc2Zvcm1fKFQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKFIpIHZhbHVlLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJfQotCQl9OwotCX0JCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYXNjYWRlPiBidWlsZENhc2NhZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQ2FzY2FkZT4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDYXNjYWRlIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJCXJldHVybiB2YWx1ZS5nZXRDYXNjYWRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjY4MGRiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvckF0dHJpYnV0ZU1hcHBpbmcoZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuT25lVG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWQ3MjA3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8VCBleHRlbmRzIE9uZVRvT25lTWFwcGluZywgUiBleHRlbmRzIE9uZVRvT25lUmVsYXRpb25zaGlwPiAKLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCXByb3RlY3RlZCBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplT25lVG9PbmVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PbmVUb09uZVNlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVPbmVUb09uZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxSPiBidWlsZEpvaW5pbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgUj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFIgdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIChSKSB2YWx1ZS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPENhc2NhZGU+IGJ1aWxkQ2FzY2FkZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxULCBDYXNjYWRlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhc2NhZGUgdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENhc2NhZGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzNhZDcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T3JkZXJpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZDdiZWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T3JkZXJpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gT3JkZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gUHJpbWFyeSBLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBDdXN0b20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBDb2xsZWN0aW9uTWFwcGluZwotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxDb2xsZWN0aW9uTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIENvbGxlY3Rpb25NYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE9yZGVyaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ29sbGVjdGlvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IGJ1aWxkT3JkZXJhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDb2xsZWN0aW9uTWFwcGluZywgT3JkZXJhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9yZGVyYWJsZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE9yZGVyYWJsZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vT3JkZXJpbmdIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPE9yZGVyYWJsZT4gb3JkZXJhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9yZGVyYWJsZSwgQm9vbGVhbj4ob3JkZXJhYmxlSG9sZGVyLCBPcmRlcmFibGUuTk9fT1JERVJJTkdfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNOb09yZGVyaW5nKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5vT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFByaW1hcnlLZXlPcmRlcmluZ0hvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJhYmxlLCBCb29sZWFuPihvcmRlcmFibGVIb2xkZXIsIE9yZGVyYWJsZS5QS19PUkRFUklOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc1BrT3JkZXJpbmcoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0UGtPcmRlcmluZyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPE9yZGVyYWJsZT4gb3JkZXJhYmxlSG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9yZGVyYWJsZSwgQm9vbGVhbj4ob3JkZXJhYmxlSG9sZGVyLCBPcmRlcmFibGUuQ1VTVE9NX09SREVSSU5HX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0Q3VzdG9tT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkU3BlY2lmaWVkT3JkZXJCeUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8T3JkZXJhYmxlPiBvcmRlcmFibGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJhYmxlLCBTdHJpbmc+KG9yZGVyYWJsZUhvbGRlciwgT3JkZXJhYmxlLlNQRUNJRklFRF9PUkRFUl9CWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkT3JkZXJCeSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0NmRjMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLkNvbnRyb2xTd2l0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNhY2hpbmdUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3ZlcnJpZGVfOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5T3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZTxUIGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+Ci0JZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JcHJpdmF0ZSBQYW5lPFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlUGFuZTsKLQlwcml2YXRlIFBhbmU8UmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlUGFuZTsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5T3ZlcnJpZGU+IHNlbGVjdGVkT3ZlcnJpZGVIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBvdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlcjsKLQkKLQkKLQlwcm90ZWN0ZWQgQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyID0gYnVpbGRTZWxlY3RlZE92ZXJyaWRlSG9sZGVyKCk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlPdmVycmlkZT4gYnVpbGRTZWxlY3RlZE92ZXJyaWRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seU92ZXJyaWRlPigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIE92ZXJyaWRlcyBncm91cCBwYW5lCi0JCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXApOwotCQkKLQkJLy8gT3ZlcnJpZGVzIGxpc3QgcGFuZQotCQlpbml0aWFsaXplT3ZlcnJpZGVzTGlzdChjb250YWluZXIpOwotCQkKLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKLQkJCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgY2hlY2sgYm94Ci0JCUJ1dHRvbiBvdmVycmlkZUNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbiksCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdCwKLQkJCQlnZXRPdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlcigpLAotCQkJCW51bGwpOwotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKGJ1aWxkU2VsZWN0ZWRPdmVycmlkZUJvb2xlYW5Ib2xkZXIoKSwgb3ZlcnJpZGVDaGVja0JveCk7Ci0JCQotCQkvLyBQcm9wZXJ0eSBwYW5lCi0JCVBhZ2VCb29rIHBhZ2VCb29rID0gYWRkUGFnZUJvb2soY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZU92ZXJyaWRlUGFuZXMocGFnZUJvb2spOwotCQlpbnN0YWxsT3ZlcnJpZGVDb250cm9sU3dpdGNoZXIodGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyLCBwYWdlQm9vayk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPdmVycmlkZVBhbmVzKFBhZ2VCb29rIHBhZ2VCb29rKSB7Ci0JCWluaXRpYWxpemVBdHRyaWJ1dGVPdmVycmlkZVBhbmUocGFnZUJvb2spOwotCQlpZiAoc3VwcG9ydHNBc3NvY2lhdGlvbk92ZXJyaWRlcygpKSB7Ci0JCQlpbml0aWFsaXplQXNzb2NpYXRpb25PdmVycmlkZVBhbmUocGFnZUJvb2spOwotCQl9Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkU2VsZWN0ZWRPdmVycmlkZUJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlPdmVycmlkZSwgQm9vbGVhbj4odGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShSZWFkT25seU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVPdmVycmlkZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFQ+KAotCQkJCXRoaXMsCi0JCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDgpLAotCQkJCWJ1aWxkT3ZlcnJpZGVzQWRhcHRlcigpLAotCQkJCWJ1aWxkT3ZlcnJpZGVzTGlzdE1vZGVsKCksCi0JCQkJdGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyLAotCQkJCWJ1aWxkT3ZlcnJpZGVMYWJlbFByb3ZpZGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0FUVFJJQlVURV9PVkVSUklERVMpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQnV0dG9uUGFuZShDb21wb3NpdGUgYywgU3RyaW5nIGhlbHBJZCkgewotCQkJCS8vbm8gYnV0dG9uczogbm8gd2F5IHRvIGFkZC9yZW1vdmUvZWRpdCBvdmVycmlkZXMsIHRoZXkgYXJlIGFsbCBkZWZhdWx0ZWQgaW4KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQkJCS8vbm8gYnV0dG9uczogbm8gd2F5IHRvIGFkZC9yZW1vdmUvZWRpdCBvdmVycmlkZXMsIHRoZXkgYXJlIGFsbCBkZWZhdWx0ZWQgaW4KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaykgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gIGF0dHJpYnV0ZU92ZXJyaWRlSG9sZGVyID0gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUhvbGRlcigpOwotCQl0aGlzLmF0dHJpYnV0ZU92ZXJyaWRlUGFuZSA9IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVQYW5lKHBhZ2VCb29rLCBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcik7Ci0JCWluc3RhbGxBdHRyaWJ1dGVPdmVycmlkZVBhbmVFbmFibGVyKHRoaXMuYXR0cmlidXRlT3ZlcnJpZGVQYW5lLCBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lPFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVQYW5lKFBhZ2VCb29rIHBhZ2VCb29rLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBBdHRyaWJ1dGVPdmVycmlkZUNvbXBvc2l0ZSh0aGlzLCBhdHRyaWJ1dGVPdmVycmlkZUhvbGRlciwgcGFnZUJvb2spOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5zdGFsbEF0dHJpYnV0ZU92ZXJyaWRlUGFuZUVuYWJsZXIoUGFuZTxSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlPiBwYW5lLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gb3ZlcnJpZGVIb2xkZXIpIHsKLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJCWJ1aWxkT3ZlcnJpZGVCb29sZWFuSG9sZGVyKG92ZXJyaWRlSG9sZGVyKSwKLQkJCQlwYW5lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZUJvb2xlYW5Ib2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seU92ZXJyaWRlPiBvdmVycmlkZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seU92ZXJyaWRlLCBCb29sZWFuPihvdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKFJlYWRPbmx5T3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCF2YWx1ZS5pc1ZpcnR1YWwoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaykgewotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlPiAgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlciA9IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcigpOwotCQl0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVQYW5lID0gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShwYWdlQm9vaywgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcik7Ci0JCWluc3RhbGxBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZUVuYWJsZXIodGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlUGFuZSwgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcik7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lPFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaywgUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUodGhpcywgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlciwgcGFnZUJvb2spOwkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBpbnN0YWxsQXNzb2NpYXRpb25PdmVycmlkZVBhbmVFbmFibGVyKFBhbmU8UmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlPiBwYW5lLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlPiBvdmVycmlkZUhvbGRlcikgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQkJYnVpbGRPdmVycmlkZUJvb2xlYW5Ib2xkZXIob3ZlcnJpZGVIb2xkZXIpLAotCQkJCXBhbmUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5zdGFsbE92ZXJyaWRlQ29udHJvbFN3aXRjaGVyKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5T3ZlcnJpZGU+IG92ZXJyaWRlSG9sZGVyLAotCQkJUGFnZUJvb2sgcGFnZUJvb2spIHsKLQkJCi0JCW5ldyBDb250cm9sU3dpdGNoZXIoCi0JCQkJb3ZlcnJpZGVIb2xkZXIsCi0JCQkJYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwKLQkJCQlwYWdlQm9vayk7Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seU92ZXJyaWRlLCBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+KHRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIHRyYW5zZm9ybV8oUmVhZE9ubHlPdmVycmlkZSB2YWx1ZSkgewotCQkJCXJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUpID8gKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seU92ZXJyaWRlLCBSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnNlbGVjdGVkT3ZlcnJpZGVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdHJhbnNmb3JtXyhSZWFkT25seU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUpID8gKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGREZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBjb250YWluZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4oY29udGFpbmVySG9sZGVyLCBPdmVycmlkZUNvbnRhaW5lci5WSVJUVUFMX09WRVJSSURFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4odGhpcy5zdWJqZWN0LmdldFZpcnR1YWxPdmVycmlkZXMoKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiBidWlsZERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNMaXN0SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gY29udGFpbmVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIsIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4oY29udGFpbmVySG9sZGVyLCBPdmVycmlkZUNvbnRhaW5lci5WSVJUVUFMX09WRVJSSURFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnN1YmplY3QuZ2V0VmlydHVhbE92ZXJyaWRlcygpKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGdldE92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyKCkgewotCQlpZiAodGhpcy5vdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLm92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyID0gYnVpbGRPdmVycmlkZVZpcnR1YWxPdmVycmlkZUhvbGRlcigpOwotCQl9Ci0JCXJldHVybiB0aGlzLm92ZXJyaWRlVmlydHVhbE92ZXJyaWRlSG9sZGVyOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVWaXJ0dWFsT3ZlcnJpZGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlPdmVycmlkZSwgQm9vbGVhbj4odGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl1cGRhdGVPdmVycmlkZSh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhSZWFkT25seU92ZXJyaWRlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighdmFsdWUuaXNWaXJ0dWFsKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlTdHJpbmcgYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSkgewotCQlTdHJpbmcgb3ZlcnJpZGVUeXBlOwotCQkKLQkJLy8gUmV0cmlldmUgdGhlIHR5cGUKLQkJaWYgKG92ZXJyaWRlIGluc3RhbmNlb2YgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCQlvdmVycmlkZVR5cGUgPSBKcHRVaURldGFpbHNNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfYXNzb2NpYXRpb247Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvdmVycmlkZVR5cGUgPSBKcHRVaURldGFpbHNNZXNzYWdlcy5PdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlOwotCQl9Ci0JCQotCQkvLyBGb3JtYXQgdGhlIG5hbWUKLQkJU3RyaW5nIG5hbWUgPSBvdmVycmlkZS5nZXROYW1lKCk7Ci0JCQotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShuYW1lKSkgewotCQkJbmFtZSA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLk92ZXJyaWRlc0NvbXBvc2l0ZV9ub05hbWU7Ci0JCX0KLQkJCi0JCS8vIEZvcm1hdDogPG5hbWU+IChBdHRyaWJ1dGUvQXNzb2NpYXRpb24gT3ZlcnJpZGUpCi0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQobmFtZSk7Ci0JCXNiLmFwcGVuZCgiICgiKTsKLQkJc2IuYXBwZW5kKG92ZXJyaWRlVHlwZSk7Ci0JCXNiLmFwcGVuZCgiKSAiKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJTGFiZWxQcm92aWRlciBidWlsZE92ZXJyaWRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gYnVpbGRPdmVycmlkZURpc3BsYXlTdHJpbmcoKFJlYWRPbmx5T3ZlcnJpZGUpIGVsZW1lbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgQWRhcHRlciBidWlsZE92ZXJyaWRlc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJLy9ubyB3YXkgdG8gYWRkL3JlbW92ZS9lZGl0IG92ZXJyaWRlcywgdGhleSBhcmUgYWxsIGRlZmF1bHRlZCBpbgotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQkvL25vIHdheSB0byBhZGQvcmVtb3ZlL2VkaXQgb3ZlcnJpZGVzLCB0aGV5IGFyZSBhbGwgZGVmYXVsdGVkIGluCi0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxSZWFkT25seU92ZXJyaWRlPiBidWlsZE92ZXJyaWRlc0xpc3RIb2xkZXIoKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIgPSBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCk7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5T3ZlcnJpZGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVhZE9ubHlPdmVycmlkZT4+KCk7Ci0JCQotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc0xpc3RIb2xkZXIoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIpKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcihhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcikpOwotCQkKLQkJaWYgKHN1cHBvcnRzQXNzb2NpYXRpb25PdmVycmlkZXMoKSkgewotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+IGFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIgPSBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKTsKLQkJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKGFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIpKTsKLQkJCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzTGlzdEhvbGRlcihhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKSk7Ci0JCX0KLQkJCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5T3ZlcnJpZGU+LCBSZWFkT25seU92ZXJyaWRlPihsaXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lckhvbGRlcigpOwotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCk7Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxSZWFkT25seU92ZXJyaWRlPiBidWlsZE92ZXJyaWRlc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UmVhZE9ubHlPdmVycmlkZT4oCi0JCQkJYnVpbGRPdmVycmlkZXNMaXN0SG9sZGVyKCksCi0JCQkJUmVhZE9ubHlPdmVycmlkZS5OQU1FX1BST1BFUlRZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxSZWFkT25seU92ZXJyaWRlLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxSZWFkT25seU92ZXJyaWRlLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShSZWFkT25seU92ZXJyaWRlIG92ZXJyaWRlKSB7Ci0JCQkJcmV0dXJuIEFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlLnRoaXMudHJhbnNmb3JtU2VsZWN0ZWRPdmVycmlkZShvdmVycmlkZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIEdpdmVuIHRoZSBzZWxlY3RlZCBvdmVycmlkZSwgcmV0dXJuIHRoZSBjb250cm9sIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCB0cmFuc2Zvcm1TZWxlY3RlZE92ZXJyaWRlKFJlYWRPbmx5T3ZlcnJpZGUgc2VsZWN0ZWRPdmVycmlkZSkgewotCQlpZiAoc2VsZWN0ZWRPdmVycmlkZSBpbnN0YW5jZW9mIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUpIHsKLQkJCXJldHVybiBBYnN0cmFjdE92ZXJyaWRlc0NvbXBvc2l0ZS50aGlzLmF0dHJpYnV0ZU92ZXJyaWRlUGFuZS5nZXRDb250cm9sKCk7Ci0JCX0KLQkJCi0JCWlmIChzZWxlY3RlZE92ZXJyaWRlIGluc3RhbmNlb2YgUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlKSB7Ci0JCQlyZXR1cm4gQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGUudGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlUGFuZS5nZXRDb250cm9sKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNMaXN0SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBjb250YWluZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLCBBc3NvY2lhdGlvbk92ZXJyaWRlPihjb250YWluZXJIb2xkZXIsIE92ZXJyaWRlQ29udGFpbmVyLlNQRUNJRklFRF9PVkVSUklERVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEFzc29jaWF0aW9uT3ZlcnJpZGU+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxBc3NvY2lhdGlvbk92ZXJyaWRlPih0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGU+IGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzTGlzdEhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGNvbnRhaW5lckhvbGRlcikgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLCBBdHRyaWJ1dGVPdmVycmlkZT4oY29udGFpbmVySG9sZGVyLCBPdmVycmlkZUNvbnRhaW5lci5TUEVDSUZJRURfT1ZFUlJJREVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxBdHRyaWJ1dGVPdmVycmlkZT4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPEF0dHJpYnV0ZU92ZXJyaWRlPih0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgdXBkYXRlT3ZlcnJpZGUoYm9vbGVhbiBjb252ZXJ0VG9TcGVjaWZpZWQpIHsKLQkJaWYgKGlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQotCQl0cnkgewotCQkJUmVhZE9ubHlPdmVycmlkZSBvdmVycmlkZSA9IHRoaXMuc2VsZWN0ZWRPdmVycmlkZUhvbGRlci5nZXRWYWx1ZSgpOwotCQkJCi0JCQlSZWFkT25seU92ZXJyaWRlIG5ld092ZXJyaWRlID0gY29udmVydFRvU3BlY2lmaWVkID8KLQkJCQkJKChWaXJ0dWFsT3ZlcnJpZGUpIG92ZXJyaWRlKS5jb252ZXJ0VG9TcGVjaWZpZWQoKSA6Ci0JCQkJCSgoT3ZlcnJpZGVfKSBvdmVycmlkZSkuY29udmVydFRvVmlydHVhbCgpOwotCQkJdGhpcy5zZWxlY3RlZE92ZXJyaWRlSG9sZGVyLnNldFZhbHVlKG5ld092ZXJyaWRlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiMmI2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFic3RyYWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgeCBPdmVycmlkZSBEZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPFQgZXh0ZW5kcyBFbnRpdHk+IGV4dGVuZHMgUGFuZTxUPgotewotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbkhvbGRlcjsKLQotCXB1YmxpYyBBYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCXZvaWQgYWRkSm9pbkNvbHVtbihQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRTdWJqZWN0KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQl2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgewotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZygKLQkJCWdldFNoZWxsKCksCi0JCQlnZXRTdWJqZWN0KCksCi0JCQludWxsCi0JCSk7Ci0KLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQlhZGRKb2luQ29sdW1uKGRpYWxvZy5nZXRTdWJqZWN0KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKTsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8UHJpbWFyeUtleUpvaW5Db2x1bW4+KCk7Ci0JfQotCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlpZiAoam9pbkNvbHVtbi5pc0RlZmF1bHQoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0RlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0KLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpIHsKLQkJCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQsCi0JCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCQkpOwotCQkJfQotCi0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc1NlY0RlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0KLQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zLAotCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNPcHRpb25hbEJ1dHRvbigpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIG9wdGlvbmFsQnV0dG9uVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQkJCQlFbnRpdHkgZW50aXR5ID0gZ2V0U3ViamVjdCgpOwotCi0JCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQllbnRpdHkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oc2VsZWN0ZWRJbmRpY2VzW2luZGV4XSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbCgoUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbikgZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+PigpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGREZWZhdWx0Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiwgUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4obGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSwKLQkJCVJlYWRPbmx5TmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlSZWFkT25seU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSwKLQkJCVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksCi0JCQlSZWFkT25seUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWQotCQkpOwotCX0KLQotCUxpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFbnRpdHksIFByaW1hcnlLZXlKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFByaW1hcnlLZXlKb2luQ29sdW1uPihzdWJqZWN0LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGVkaXRKb2luQ29sdW1uKFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCXZvaWQgZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nIGRpYWxvZyA9IG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZygKLQkJCWdldFNoZWxsKCksCi0JCQlnZXRTdWJqZWN0KCksCi0JCQlqb2luQ29sdW1uCi0JCSk7Ci0KLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQllZGl0Sm9pbkNvbHVtbihkaWFsb2cuZ2V0U3ViamVjdCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJam9pbkNvbHVtbkhvbGRlciA9IGJ1aWxkSm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBncm91cCBwYW5lCi0JCUdyb3VwIGdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX3ByaW1hcnlLZXlKb2luQ29sdW1uCi0JCSk7Ci0KLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCWFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShncm91cFBhbmUsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBqb2luQ29sdW1uc0xpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4oCi0JCQl0aGlzLAotCQkJZ3JvdXBQYW5lLAotCQkJYnVpbGRKb2luQ29sdW1uc0FkYXB0ZXIoKSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCksCi0JCQlqb2luQ29sdW1uSG9sZGVyLAotCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUwotCQkpOwotCi0JCWluc3RhbGxKb2luQ29sdW1uc0xpc3RQYW5lRW5hYmxlcihqb2luQ29sdW1uc0xpc3RQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEpvaW5Db2x1bW5zTGlzdFBhbmVFbmFibGVyKEFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gcGFuZSkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCXBhbmUKLQkJKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZUpvaW5Db2x1bW5zKGJvb2xlYW4gc2VsZWN0ZWQpIHsKLQotCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0KLQkJdHJ5IHsKLQkJCS8vIEFkZCBhIGpvaW4gY29sdW1uIGJ5IGNyZWF0aW5nIGEgc3BlY2lmaWVkIG9uZSB1c2luZyB0aGUgZGVmYXVsdAotCQkJLy8gb25lIGlmIGl0IGV4aXN0cwotCQkJaWYgKHNlbGVjdGVkKSB7Ci0KLQkJCQlzd2l0Y2hEZWZhdWx0VG9TcGVjaWZpZWQoKTsKLQkJCX0KLQkJCS8vIFJlbW92ZSBhbGwgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMKLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGluZGV4ID0gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHN3aXRjaERlZmF1bHRUb1NwZWNpZmllZCgpOwotCQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0JCXB1YmxpYyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQkJc3VwZXIoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBsaXN0SG9sZGVyLnNpemUoKSA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVKb2luQ29sdW1ucyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNkNzg3NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1FbnRpdHkKLSAqIEBzZWUgT3JtRW50aXR5Q29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8VCBleHRlbmRzIEVudGl0eT4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JRW50aXR5PC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEFic3RyYWN0U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFNlY29uZGFyeVRhYmxlRnJvbURpYWxvZyhTZWNvbmRhcnlUYWJsZURpYWxvZyBkaWFsb2csIE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoZGlhbG9nLmdldFNlbGVjdGVkVGFibGUoKSk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coZGlhbG9nLmdldFNlbGVjdGVkQ2F0YWxvZygpKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKGRpYWxvZy5nZXRTZWxlY3RlZFNjaGVtYSgpKTsKLQotCQlsaXN0U2VsZWN0aW9uTW9kZWwuc2V0U2VsZWN0ZWRWYWx1ZShzZWNvbmRhcnlUYWJsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgYnVpbGRTZWNvbmRhcnlUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJLy8gVE9ETyBkaXNwbGF5IGEgcXVhbGlmaWVkIG5hbWUgaW5zdGVhZAotCQkJCVJlYWRPbmx5U2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSkgZWxlbWVudDsKLQkJCQlpZiAoc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuICIiOy8vVE9ETwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBTZWNvbmRhcnlUYWJsZURpYWxvZyBidWlsZFNlY29uZGFyeVRhYmxlRGlhbG9nRm9yQWRkKCkgewotCQlyZXR1cm4gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKGdldFNoZWxsKCksIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCksIGdldFN1YmplY3QoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCksIGdldFN1YmplY3QoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBBZGRSZW1vdmVMaXN0UGFuZS5BZGFwdGVyIGJ1aWxkU2Vjb25kYXJ5VGFibGVzQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCVNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9IGJ1aWxkU2Vjb25kYXJ5VGFibGVEaWFsb2dGb3JBZGQoKTsKLQkJCQlhZGRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coZGlhbG9nLCBsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGUpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0gbmV3IFNlY29uZGFyeVRhYmxlRGlhbG9nKGdldFNoZWxsKCksIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCksIHNlY29uZGFyeVRhYmxlKTsKLQkJCQllZGl0U2Vjb25kYXJ5VGFibGVGcm9tRGlhbG9nKGRpYWxvZywgc2Vjb25kYXJ5VGFibGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gZ2V0U3ViamVjdCgpOwotCQkJCWludFtdIHNlbGVjdGVkSW5kaWNlcyA9IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKTsKLQotCQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJZW50aXR5LnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBlbmFibGVPcHRpb25PblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJaWYgKGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlc1NpemUoKSAhPSAxKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGUpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCk7Ci0JCQkJcmV0dXJuICFzZWNvbmRhcnlUYWJsZS5pc1ZpcnR1YWwoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBlbmFibGVSZW1vdmVPblNlbGVjdGlvbkNoYW5nZShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJaWYgKGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCXJldHVybiAhc2Vjb25kYXJ5VGFibGUuaXNWaXJ0dWFsKCk7CQkJCQotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVkaXRTZWNvbmRhcnlUYWJsZUZyb21EaWFsb2coU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nLCBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSkgewotCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoZGlhbG9nLmdldFNlbGVjdGVkVGFibGUoKSk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coZGlhbG9nLmdldFNlbGVjdGVkQ2F0YWxvZygpKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKGRpYWxvZy5nZXRTZWxlY3RlZFNjaGVtYSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1M2UwMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWJzdHJhY3RUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb248TSwgVCBleHRlbmRzIFRyYW5zaWVudE1hcHBpbmc+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248TSwgVD4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlRyYW5zaWVudE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0JCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1Mzc4OGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0aWJsZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgVmVyc2lvbk1hcHBpbmcKLSAqIEBzZWUgQ29sdW1uQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxUIGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IAotCWV4dGVuZHMgUGFuZTxUPgotCWltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklWZXJzaW9uTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJaW5pdGlhbGl6ZVZlcnNpb25Db2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZlcnNpb25Db2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5WZXJzaW9uU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZVZlcnNpb25TZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVZlcnNpb25TZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpOwotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVR5cGVDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90eXBlCi0JCSk7Ci0JCXRoaXMuaW5pdGlhbGl6ZVR5cGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUeXBlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCSgoR3JpZExheW91dCkgY29udGFpbmVyLmdldExheW91dCgpKS5udW1Db2x1bW5zID0gMjsKLQotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsIAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVHlwZVNlY3Rpb25fZGVmYXVsdCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIobnVsbCksIAotCQkJbnVsbCk7Ci0JCSgoR3JpZERhdGEpIG5vQ29udmVydGVyQnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJCQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90ZW1wb3JhbCwgCi0JCQlidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShidWlsZFRlbXBvcmFsQ29udmVydGVySG9sZGVyKGNvbnZlcnRlckhvbGRlciksIGNvbnRhaW5lciwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDb2x1bW4+IGJ1aWxkQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldENvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENvbnZlcnRlckJvb2xlYW5Ib2xkZXIoZmluYWwgQ2xhc3M8PyBleHRlbmRzIENvbnZlcnRlcj4gY29udmVydGVyVHlwZSkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJQ29udmVydGVyIGNvbnZlcnRlciA9IHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gY29udmVydGVyVHlwZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlcihjb252ZXJ0ZXJUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBidWlsZENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VmVyc2lvbk1hcHBpbmcsIENvbnZlcnRlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb252ZXJ0ZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb252ZXJ0ZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxDb252ZXJ0ZXI+IGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBUZW1wb3JhbENvbnZlcnRlcj4oY29udmVydGVySG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUZW1wb3JhbENvbnZlcnRlciB0cmFuc2Zvcm1fKENvbnZlcnRlciBjb252ZXJ0ZXIpIHsKLQkJCQlyZXR1cm4gY29udmVydGVyLmdldFR5cGUoKSA9PSBUZW1wb3JhbENvbnZlcnRlci5jbGFzcyA/IChUZW1wb3JhbENvbnZlcnRlcikgY29udmVydGVyIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOWY2NmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fic3RyYWN0VmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQgZXh0ZW5kcyBWZXJzaW9uTWFwcGluZz4KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxNLCBUPgotewotCXByb3RlY3RlZCBBYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlZlcnNpb25NYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5WZXJzaW9uTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BY2Nlc3NUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWNjZXNzVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODA3ZmMwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BY2Nlc3NUeXBlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1WYXJpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQWNjZXNzSG9sZGVyCi0gKiBAc2VlIE9ybUVudGl0eUNvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPcm1FbWJlZGRhYmxlQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEFjY2Vzc1R5cGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEFjY2Vzc0hvbGRlcj4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BY2Nlc3NUeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBBY2Nlc3NUeXBlQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFjY2Vzc0hvbGRlcj4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIEFjY2Vzc1R5cGVDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEFjY2Vzc0hvbGRlcj4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlFbnVtRm9ybUNvbWJvVmlld2VyPEFjY2Vzc0hvbGRlciwgQWNjZXNzVHlwZT4gY29tYm9WaWV3ZXIgPQotCQkJYWRkQWNjZXNzVHlwZUNvbWJvVmlld2VyKGNvbnRhaW5lcik7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpTWVzc2FnZXMuQWNjZXNzVHlwZUNvbXBvc2l0ZV9hY2Nlc3MsCi0JCQljb21ib1ZpZXdlci5nZXRDb250cm9sKCkKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEFjY2Vzc0hvbGRlciwgQWNjZXNzVHlwZT4gYWRkQWNjZXNzVHlwZUNvbWJvVmlld2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8QWNjZXNzSG9sZGVyLCBBY2Nlc3NUeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChBY2Nlc3NIb2xkZXIuREVGQVVMVF9BQ0NFU1NfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEFjY2Vzc0hvbGRlci5TUEVDSUZJRURfQUNDRVNTX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgQWNjZXNzVHlwZVtde307Ci0JCQkJfQotCQkJCXJldHVybiBnZXRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpLmdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKGdldFN1YmplY3QoKS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCQl9Ci0KLQkJCUpwYVBsYXRmb3JtVmFyaWF0aW9uIGdldEpwYVBsYXRmb3JtVmFyaWF0aW9uKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SnBhVmFyaWF0aW9uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc1R5cGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdEFjY2VzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZGlzcGxheVN0cmluZyhBY2Nlc3NUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZEFjY2VzcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKEFjY2Vzc1R5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQWNjZXNzKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0FkZFF1ZXJ5RGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWRkUXVlcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyMDRhZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWRkUXVlcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5WYWxpZGF0aW5nRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ2xpZW50cyBjYW4gdXNlIHRoaXMgZGlhbG9nIHRvIHByb21wdCB0aGUgdXNlciBmb3IgU2Vjb25kYXJ5VGFibGUgc2V0dGluZ3MuCi0gKiBVc2UgdGhlIGZvbGxvd2luZyBvbmNlIHRoZSBkaWFsb2cgaXMgY2xvc2VkOgotICogICAgIEBzZWUgI2dldFNlbGVjdGVkVGFibGUoKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkQ2F0YWxvZygpCi0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRTY2hlbWEoKQotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRRdWVyeURpYWxvZyBleHRlbmRzIFZhbGlkYXRpbmdEaWFsb2c8QWRkUXVlcnlTdGF0ZU9iamVjdD4gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVEX1FVRVJZID0gIm5hbWVkUXVlcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRURfTkFUSVZFX1FVRVJZID0gIm5hbWVkTmF0aXZlUXVlcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBwZXJzaXN0ZW5jZSB1bml0Ci0JICovCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgcFVuaXQ7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBlZGl0IGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gdmFsdWUKLQkgKiBAcGFyYW0gcFVuaXQgCi0JICovCi0JcHVibGljIEFkZFF1ZXJ5RGlhbG9nKFNoZWxsIHBhcmVudCwgUGVyc2lzdGVuY2VVbml0IHBVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucFVuaXQgPSBwVW5pdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWRkUXVlcnlTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEFkZFF1ZXJ5U3RhdGVPYmplY3QodGhpcy5wVW5pdCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBvcGVuICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVNoZWxsKFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQkJc2hlbGwuc2V0VGV4dCh0aGlzLmdldFRpdGxlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5BZGRRdWVyeURpYWxvZ190aXRsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5BZGRRdWVyeURpYWxvZ19kZXNjcmlwdGlvblRpdGxlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQWRkUXVlcnlEaWFsb2dfZGVzY3JpcHRpb247Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPEFkZFF1ZXJ5U3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBRdWVyeURpYWxvZ1BhbmUoY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlKCkgewotCQlzdXBlci5jcmVhdGUoKTsKLQotCQlRdWVyeURpYWxvZ1BhbmUgcGFuZSA9IChRdWVyeURpYWxvZ1BhbmUpIGdldFBhbmUoKTsKLQkJcGFuZS5zZWxlY3RBbGwoKTsKLQotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YSB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5VHlwZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRRdWVyeVR5cGUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBRdWVyeURpYWxvZ1BhbmUgZXh0ZW5kcyBEaWFsb2dQYW5lPEFkZFF1ZXJ5U3RhdGVPYmplY3Q+IHsKLQotCQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0KLQkJUXVlcnlEaWFsb2dQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKEFkZFF1ZXJ5RGlhbG9nLnRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJdGhpcy5uYW1lVGV4dCA9IGFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5BZGRRdWVyeURpYWxvZ19uYW1lLAotCQkJCWJ1aWxkTmFtZUhvbGRlcigpCi0JCQkpOwotCQkJCi0JCQlhZGRMYWJlbGVkQ29tYm8oCi0JCQkJY29udGFpbmVyLCAKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5BZGRRdWVyeURpYWxvZ19xdWVyeVR5cGUsIAotCQkJCWJ1aWxkUXVlcnlUeXBlTGlzdEhvbGRlcigpLCAKLQkJCQlidWlsZFF1ZXJ5VHlwZUhvbGRlcigpLCAKLQkJCQlidWlsZFN0cmluZ0NvbnZlcnRlcigpLAotCQkJCW51bGwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRRdWVyeVR5cGVMaXN0SG9sZGVyKCkgewotCQkJTGlzdDxTdHJpbmc+IHF1ZXJ5VHlwZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCXF1ZXJ5VHlwZXMuYWRkKE5BTUVEX1FVRVJZKTsKLQkJCXF1ZXJ5VHlwZXMuYWRkKE5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQkKLQkJCXJldHVybiBuZXcgU3RhdGljTGlzdFZhbHVlTW9kZWw8U3RyaW5nPihxdWVyeVR5cGVzKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFN0cmluZ0NvbnZlcnRlcigpIHsKLQkJCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCWlmICh2YWx1ZSA9PSBOQU1FRF9RVUVSWSkgewotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX25hbWVkUXVlcnk7Ci0JCQkJCX0KLQkJCQkJaWYgKHZhbHVlID09IE5BTUVEX05BVElWRV9RVUVSWSkgewotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkFkZFF1ZXJ5RGlhbG9nX25hbWVkTmF0aXZlUXVlcnk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxBZGRRdWVyeVN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgQWRkUXVlcnlTdGF0ZU9iamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFF1ZXJ5VHlwZUhvbGRlcigpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEFkZFF1ZXJ5U3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBBZGRRdWVyeVN0YXRlT2JqZWN0LlFVRVJZX1RZUEVfUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFF1ZXJ5VHlwZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldFF1ZXJ5VHlwZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgc2VsZWN0QWxsKCkgewotCQkJdGhpcy5uYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BZGRRdWVyeVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQWRkUXVlcnlTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmVhNjZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9BZGRRdWVyeVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5BYnN0cmFjdE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubm9kZS5Qcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBzdGF0ZSBvYmplY3QgdXNlZCBieSB0aGUgPGNvZGU+QWRkUXVlcnlEaWFsb2c8L2NvZGU+LCB3aGljaCBzdG9yZXMKLSAqIHRoZSBjdXJyZW50IG5hbWUgYW5kIHZhbGlkYXRlcyBpdCB3aGVuIGl0IGlzIG1vZGlmaWVkLgotICoKLSAqIEBzZWUgQWRkUXVlcnlEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAyLjEKLSAqLwotZmluYWwgY2xhc3MgQWRkUXVlcnlTdGF0ZU9iamVjdCBleHRlbmRzIEFic3RyYWN0Tm9kZQotewotCS8qKgotCSAqIFRoZSBpbml0aWFsIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCi0JLyoqCi0JICogVGhlIGluaXRpYWwgcXVlcnlUeXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcXVlcnlUeXBlOwotCi0JLyoqCi0JICogVGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gdXNlZCB0byB2YWxpZGF0ZSB0aGlzIHN0YXRlIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0KLQkvKioKLQkgKiBUaGUgYXNzb2NpYXRlZCBwZXJzaXN0ZW5jZSB1bml0Ci0JICovCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVVuaXQgcFVuaXQ7Ci0JCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGRhdGEgdmFsdWUgcHJvcGVydHkuCi0JICovCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX1BST1BFUlRZID0gIm5hbWVQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBOb3RpZmllcyBhIGNoYW5nZSBpbiB0aGUgcXVlcnkgdHlwZSBwcm9wZXJ0eS4KLQkgKi8KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1RZUEVfUFJPUEVSVFkgPSAicXVlcnlUeXBlUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk5ld05hbWVTdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gbmFtZSBUaGUgaW5pdGlhbCBpbnB1dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBpbml0aWFsIHZhbHVlIGNhbgotCSAqIGJlIHNwZWNpZmllZAotCSAqIEBwYXJhbSBuYW1lcyBUaGUgY29sbGVjdGlvbiBvZiBuYW1lcyB0aGF0IGNhbid0IGJlIHVzZWQgb3IgYW4gZW1wdHkKLQkgKiBjb2xsZWN0aW9uIGlmIG5vbmUgYXJlIGF2YWlsYWJsZQotCSAqLwotCUFkZFF1ZXJ5U3RhdGVPYmplY3QoUGVyc2lzdGVuY2VVbml0IHBVbml0KSB7Ci0JCXN1cGVyKG51bGwpOwotCQl0aGlzLnBVbml0ID0gcFVuaXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5hbWVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMubmFtZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEpwdFVpRGV0YWlsc01lc3NhZ2VzLlF1ZXJ5U3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9Ci0JCWVsc2UgaWYgKG5hbWVzKCkuY29udGFpbnModGhpcy5uYW1lKSl7Ci0JCQljdXJyZW50UHJvYmxlbXMuYWRkKGJ1aWxkUHJvYmxlbShKcHRVaURldGFpbHNNZXNzYWdlcy5BZGRRdWVyeURpYWxvZ19uYW1lRXhpc3RzLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRRdWVyeVR5cGVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMucXVlcnlUeXBlKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlEZXRhaWxzTWVzc2FnZXMuUXVlcnlTdGF0ZU9iamVjdF90eXBlTXVzdEJlU3BlY2lmaWVkLCBJTWVzc2FnZVByb3ZpZGVyLkVSUk9SKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCXN1cGVyLmFkZFByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkTmFtZVByb2JsZW1zVG8oY3VycmVudFByb2JsZW1zKTsKLQkJYWRkUXVlcnlUeXBlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQotCXByaXZhdGUgTGlzdDxTdHJpbmc+IG5hbWVzKCl7Ci0JCQlMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJCWZvciAoUXVlcnkgcXVlcnkgOiB0aGlzLnBVbml0LmdldFF1ZXJpZXMoKSl7Ci0JCQkJU3RyaW5nIG5hbWUgPSBxdWVyeS5nZXROYW1lKCk7Ci0JCQkJbmFtZXMuYWRkKG5hbWUpOwotCQkJfQotCQkJcmV0dXJuIG5hbWVzOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJLy9ubyBwYXJlbnQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGRpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCVN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCVN0cmluZyBnZXRRdWVyeVR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnF1ZXJ5VHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1ZXJ5VHlwZShTdHJpbmcgbmV3UXVlcnlUeXBlKSB7Ci0JCVN0cmluZyBvbGQgPSB0aGlzLnF1ZXJ5VHlwZTsKLQkJdGhpcy5xdWVyeVR5cGUgPSBuZXdRdWVyeVR5cGU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUVVFUllfVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdRdWVyeVR5cGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdGhpcy52YWxpZGF0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NGE2ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICogQHNlZSBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZQotCWV4dGVuZHMgUGFuZTxSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gYWRkVGl0bGVkR3JvdXAoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUpOwotCQkKLQkJYWRkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUoY29tcG9zaXRlKTsKLQkJCi0JCWFkZFN1YlBhbmUoY29tcG9zaXRlLCA1KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS4KLQkJCWJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmVXaXRob3V0SW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3goCi0JCQkJdGhpcywgCi0JCQkJYnVpbGRSZWxhdGlvbnNoaXBNb2RlbCgpLCAKLQkJCQljb250YWluZXIpOwkJCi0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcD4gYnVpbGRSZWxhdGlvbnNoaXBNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUsIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXAgdHJhbnNmb3JtXyhSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQkvLyB3aXRoIHZpcnR1YWwgb3ZlcnJpZGVzOiBtOm0gbWFwcGluZ3MgZG8gbm90IHN1cHBvcnQgam9pbiBjb2x1bW5zLCBzbyB3ZSBuZWVkIHRvIGNoZWNrCi0JCQkJUmVhZE9ubHlSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwID0gdmFsdWUuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQkJcmV0dXJuIChyZWxhdGlvbnNoaXAgaW5zdGFuY2VvZiBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXApID8KLQkJCQkJKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgcmVsYXRpb25zaGlwIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0F0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdhMjRjNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQ29sdW1uQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEF0dHJpYnV0ZU92ZXJyaWRlCi0gKiBAc2VlIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+Ci17Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkF0dHJpYnV0ZU92ZXJyaWRlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+QXR0cmlidXRlT3ZlcnJpZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlPiBzdWJqZWN0SG9sZGVyLAotCQkJCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZENvbHVtbkhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5Q29sdW1uPiBidWlsZENvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlLCBSZWFkT25seUNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBSZWFkT25seUNvbHVtbiB0cmFuc2Zvcm1fKFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0Q29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Y2EwYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5WYWxpZGF0aW5nRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gdGhlIGRpYWxvZyBzaG93aW5nIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBqb2luIGNvbHVtbgotICogdG8gZWRpdCBvciB0byBjcmVhdGUuCi0gKgotICogQHNlZSBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxUIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdD4KLQlleHRlbmRzIFZhbGlkYXRpbmdEaWFsb2c8VD4KLXsKLQotCS8qKgotCSAqIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdAotCSAqIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZS4KLQkgKi8KLQlwcml2YXRlIFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3Qgb3duZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2VKb2luQ29sdW1uRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBvd25lciBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEJhc2VKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IG93bmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkT25seUJhc2VKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQpOwotCi0JCXRoaXMub3duZXIgICAgICA9IG93bmVyOwotCQl0aGlzLmpvaW5Db2x1bW4gPSBqb2luQ29sdW1uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2Rlc2NyaXB0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb25UaXRsZSgpIHsKLQotCQlpZiAoam9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZTsKLQkJfQotCi0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nX2VkaXRKb2luQ29sdW1uRGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBqb2luIGNvbHVtbiB1c2VkIGJ5IHRoaXMgc3RhdGUgb2JqZWN0IGZvciBlZGl0aW5nIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIGVkaXRlZCBqb2luIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBSZWFkT25seUJhc2VKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiBqb2luQ29sdW1uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG93bmVyIHdoZXJlIHRoZSBqb2luIGNvbHVtbiBpcyBsb2NhdGVkIG9yIHdoZXJlIGEgbmV3IG9uZSBjYW4KLQkgKiBiZSBhZGRlZC4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHBhcmVudCBvZiB0aGUgam9pbiBjb2x1bW4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQotCQlpZiAoam9pbkNvbHVtbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19hZGRKb2luQ29sdW1uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGM0MmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUmVmZXJlbmNlZCBDb2x1bW4gTmFtZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVGFibGU6ICAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ29sdW1uIERlZmluaXRpb246ICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZyAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZyAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPFQgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0PiBleHRlbmRzIERpYWxvZ1BhbmU8VD4KLXsKLQkvKioKLQkgKiBBIGtleSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZSwgdGhpcyBpcyByZXF1aXJlZCB0byBjb252ZXJ0Ci0JICogdGhlIHNlbGVjdGVkIGl0ZW0gZnJvbSBhIGNvbWJvIHRvIDxjb2RlPm51bGw8L2NvZGU+LiBUaGlzIGtleSBpcyBtb3N0Ci0JICogbGlrZWx5IG5ldmVyIHR5cGVkIHRoZSB1c2VyIGFuZCBpdCB3aWxsIGhlbHAgdG8gY29udmVydCB0aGUgdmFsdWUgdG8KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0J3MgdGltZSB0byBzZXQgdGhlIG5ldyBzZWxlY3RlZCB2YWx1ZSBpbnRvIHRoZQotCSAqIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfS0VZID0gIj8hIyE/Iz8jP2RlZmF1bHQ/Iz8hIz8hIz8iOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5CYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRDb2x1bW5EZWZpbml0aW9uKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBhZGRTdWJQYW5lKHBhcmVudCwgMCwgNywgMCwgNSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHROYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtXyhCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0IHZhbHVlKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB2YWx1ZS5nZXREZWZhdWx0TmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVkgKyBuYW1lOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHROYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJYnVpbGREZWZhdWx0TmFtZUhvbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybV8oQmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCB2YWx1ZSkgewotCQkJCVN0cmluZyBuYW1lID0gdmFsdWUuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5hbWUgPSBERUZBVUxUX0tFWSArIG5hbWU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJYnVpbGREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0VGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm1fKEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QgdmFsdWUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHZhbHVlLmdldERlZmF1bHRUYWJsZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluYW1lID0gREVGQVVMVF9LRVkgKyBuYW1lOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRUYWJsZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdFRhYmxlSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkRGlzcGxheWFibGVTdHJpbmdDb252ZXJ0ZXIoZmluYWwgRGVmYXVsdFZhbHVlSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQl2YWx1ZSA9IGhhbmRsZXIuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0KLQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVkgKyB2YWx1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gREVGQVVMVF9LRVk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAodmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHROYW1lID0gdmFsdWUuc3Vic3RyaW5nKERFRkFVTFRfS0VZLmxlbmd0aCgpKTsKLQotCQkJCQlpZiAoZGVmYXVsdE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQl2YWx1ZSA9IE5MUy5iaW5kKAotCQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCQlkZWZhdWx0TmFtZQotCQkJCQkJKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZhbHVlID0gSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gdmFsdWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCi0JCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgotCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7Ci0KLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuTkFNRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhdG9yPFN0cmluZz4gbGlzdEl0ZXJhdG9yXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5uYW1lcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZXNMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdE5hbWVMaXN0SG9sZGVyKCkpOwotCQlob2xkZXJzLmFkZChidWlsZE5hbWVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZE5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJLy8gQ29udmVydCB0aGUgZGVmYXVsdCB2YWx1ZSBvciBhbiBlbXB0eSBzdHJpbmcgdG8gbnVsbAotCQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYKLQkJCQkgICAoKHZhbHVlLmxlbmd0aCgpID09IDApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoREVGQVVMVF9LRVkpKSkgewotCi0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQlzdWJqZWN0LnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8QmFzZUpvaW5Db2x1bW5TdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuUkVGRVJFTkNFX0NPTFVNTl9OQU1FU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3JfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LnJlZmVyZW5jZUNvbHVtbk5hbWVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QucmVmZXJlbmNlQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZXNMaXN0SG9sZGVyKCkgewotCQlBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPj4oMik7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkRGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lTGlzdEhvbGRlcigpKTsKLQkJaG9sZGVycy5hZGQoYnVpbGRSZWZlcmVuY2VkQ29sdW1uTmFtZUxpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8U3RyaW5nPiwgU3RyaW5nPihob2xkZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSB7Ci0JCXJldHVybiBidWlsZERpc3BsYXlhYmxlU3RyaW5nQ29udmVydGVyKG5ldyBEZWZhdWx0VmFsdWVIYW5kbGVyKCkgewotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQkvLyBDb252ZXJ0IHRoZSBkZWZhdWx0IHZhbHVlIG9yIGFuIGVtcHR5IHN0cmluZyB0byBudWxsCi0JCQkJaWYgKCh2YWx1ZSAhPSBudWxsKSAmJgotCQkJCSAgICgodmFsdWUubGVuZ3RoKCkgPT0gMCkgfHwgdmFsdWUuc3RhcnRzV2l0aChERUZBVUxUX0tFWSkpKSB7Ci0KLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQotCQkJCXN1YmplY3Quc2V0VGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRhYmxlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgIiIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcl8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QudGFibGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGFibGVzTGlzdEhvbGRlcigpIHsKLQkJQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+IGhvbGRlcnMgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPFN0cmluZz4+KDIpOwotCQlob2xkZXJzLmFkZChidWlsZERlZmF1bHRUYWJsZUxpc3RIb2xkZXIoKSk7Ci0JCWhvbGRlcnMuYWRkKGJ1aWxkVGFibGVMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFN0cmluZz4sIFN0cmluZz4oaG9sZGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPiBidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCkgewotCQlyZXR1cm4gYnVpbGREaXNwbGF5YWJsZVN0cmluZ0NvbnZlcnRlcihuZXcgRGVmYXVsdFZhbHVlSGFuZGxlcigpIHsKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlDb21ibyBuYW1lQ29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfbmFtZSwKLQkJCWJ1aWxkTmFtZXNMaXN0SG9sZGVyKCksCi0JCQlidWlsZE5hbWVIb2xkZXIoKSwKLQkJCWJ1aWxkTmFtZVN0cmluZ0NvbnZlcnRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX0NPTFVNTl9OQU1FCi0JCSk7Ci0KLQkJU1dUVXRpbC5hdHRhY2hEZWZhdWx0VmFsdWVIYW5kbGVyKG5hbWVDb21ibyk7Ci0KLQkJLy8gUmVmZXJlbmNlZCBDb2x1bW4gTmFtZSB3aWRnZXRzCi0JCUNvbWJvIHJlZmVyZW5jZWRDb2x1bW5OYW1lQ29tYm8gPSBhZGRMYWJlbGVkRWRpdGFibGVDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dfcmVmZXJlbmNlZENvbHVtbk5hbWUsCi0JCQlidWlsZFJlZmVyZW5jZWRDb2x1bW5OYW1lc0xpc3RIb2xkZXIoKSwKLQkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVIb2xkZXIoKSwKLQkJCWJ1aWxkUmVmZXJlbmNlZENvbHVtbk5hbWVTdHJpbmdDb252ZXJ0ZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgotCQkpOwotCi0JCVNXVFV0aWwuYXR0YWNoRGVmYXVsdFZhbHVlSGFuZGxlcihyZWZlcmVuY2VkQ29sdW1uTmFtZUNvbWJvKTsKLQotCQkvLyBUYWJsZSB3aWRnZXRzCi0JCWlmIChpc1RhYmxlRWRpdGFibGUoKSkgewotCi0JCQlDb21ibyB0YWJsZUNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3RhYmxlLAotCQkJCWJ1aWxkVGFibGVzTGlzdEhvbGRlcigpLAotCQkJCWJ1aWxkVGFibGVIb2xkZXIoKSwKLQkJCQlidWlsZFRhYmxlU3RyaW5nQ29udmVydGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1JFRkVSRU5DRURfQ09MVU1OCi0JCQkpOwotCi0JCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIodGFibGVDb21ibyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDb21ibyB0YWJsZUNvbWJvID0gYWRkTGFiZWxlZENvbWJvKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZSwKLQkJCQlidWlsZFRhYmxlc0xpc3RIb2xkZXIoKSwKLQkJCQlidWlsZFRhYmxlSG9sZGVyKCksCi0JCQkJYnVpbGRUYWJsZVN0cmluZ0NvbnZlcnRlcigpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9SRUZFUkVOQ0VEX0NPTFVNTgotCQkJKTsKLQotCQkJdGFibGVDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCi0JCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKLQkJYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKCkKLQkJKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGNvbWJvIHNob3VsZCBiZSBlZGl0YWJsZSBvciBub3QuIFRoZSBkZWZhdWx0Ci0JICogaXMgdG8ga2VlcCB0aGUgY29tYm8gcmVhZC1vbmx5LgotCSAqCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB0byBzdXBwb3J0IHRoZSBlZGl0aW5nIG9mIHRoZSBzZWxlY3RlZCB0YWJsZTsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUYWJsZUVkaXRhYmxlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnRlcmZhY2UgRGVmYXVsdFZhbHVlSGFuZGxlciB7Ci0JCVN0cmluZyBnZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NGU1MzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Jhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuRW1wdHlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIFRoZSBhYnN0cmFjdCBkZWZpbml0aW9uIG9mIGEgc3RhdGUgb2JqZWN0IHVzZWQgdG8gZWRpdCBvciBjcmVhdGUgYSBuZXcKLSAqIGpvaW4gY29sdW1uLgotICoKLSAqIEBzZWUgQWJzdHJhY3RKb2luQ29sdW1uCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKLQlleHRlbmRzIEFic3RyYWN0Tm9kZQotewotCS8qKgotCSAqIFRoZSBTUUwgZnJhZ21lbnQgdGhhdCBpcyB1c2VkIHdoZW4gZ2VuZXJhdGluZyB0aGUgRERMIGZvciB0aGUgY29sdW1uLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGNvbHVtbkRlZmluaXRpb247Ci0KLQkvKioKLQkgKiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIGlzIGJlaW5nIGVkaXRlZCBvciA8Y29kZT5udWxsPC9jb2RlPiB0aGUgc3RhdGUKLQkgKiBvYmplY3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIFJlYWRPbmx5QmFzZUpvaW5Db2x1bW4gam9pbkNvbHVtbjsKLQotCS8qKgotCSAqIFRoZSBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGRlZmluZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotCS8qKgotCSAqIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQuCi0JICovCi0JcHJpdmF0ZSBPYmplY3Qgb3duZXI7Ci0KLQkvKioKLQkgKiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZGVmaW5lZC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQotCS8qKgotCSAqIFRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHRhYmxlOwotCi0JLyoqCi0JICogS2VlcHMgdHJhY2sgb2YgdGhlIDxjb2RlPlZhbGlkYXRvcjwvY29kZT4gc2luY2UgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgY29sdW1uIGRlZmluaXRpb24gcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkgPSAiY29sdW1uRGVmaW5pdGlvbiI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBuYW1lIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfUFJPUEVSVFkgPSAibmFtZSI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSBsaXN0IG9mIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTX0xJU1QgPSAibmFtZXMiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgbGlzdCBvZiByZWZlcmVuY2UgY29sdW1uIG5hbWVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRV9DT0xVTU5fTkFNRVNfTElTVCA9ICJyZWZlcmVuY2VDb2x1bW5OYW1lcyI7Ci0KLQkvKioKLQkgKiBJZGVudGlmaWVzIGEgY2hhbmdlIGluIHRoZSByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIHByb3BlcnR5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFkgPSAicmVmZXJlbmNlZENvbHVtbk5hbWUiOwotCi0JLyoqCi0JICogSWRlbnRpZmllcyBhIGNoYW5nZSBpbiB0aGUgdGFibGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfUFJPUEVSVFkgPSAidGFibGUiOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5Db2x1bW5TdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0KE9iamVjdCBvd25lciwgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKG51bGwpOwotCQlpbml0aWFsaXplKG93bmVyLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjaGVja1BhcmVudChOb2RlIHBhcmVudE5vZGUpIHsKLQkJLy8gVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgSm9pbiBDb2x1bW4gc3RhdGUgb2JqZWN0Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gY29sdW1uTmFtZXMoVGFibGUgdGFibGUpIHsKLQkJaWYgKHRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMubGlzdCh0YWJsZS5nZXRTb3J0ZWRDb2x1bW5JZGVudGlmaWVycygpKS5saXN0SXRlcmF0b3IoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbHVtbnNTaXplKFRhYmxlIHRhYmxlKSB7Ci0JCWlmICh0YWJsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gdGFibGUuZ2V0Q29sdW1uc1NpemUoKTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gIiI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgU1FMIGZyYWdtZW50IHRoYXQgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIERETCBmb3IgdGhlCi0JICogY29sdW1uLgotCSAqCi0JICogQHJldHVybiBUaGUgZWRpdGVkIGNvbHVtbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCB1c2VkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5EZWZpbml0aW9uKCkgewotCQlyZXR1cm4gY29sdW1uRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG5hbWUgaWYgdGhlIGpvaW4gY29sdW1uIGlzIGJlaW5nIGVkaXRlZCBvdGhlcndpc2UKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBkZWZhdWx0IG5hbWUgZGVmaW5lZCBieSB0aGUgam9pbiBjb2x1bW4gb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHROYW1lKCkgewotCQlyZXR1cm4gKHRoaXMuam9pbkNvbHVtbiA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgaWYgdGhlIGpvaW4gY29sdW1uIGlzIGJlaW5nCi0JICogZWRpdGVkIG90aGVyd2lzZSA8Y29kZT5udWxsPC9jb2RlPiBpcyByZXR1cm5lZC4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBkZWZhdWx0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgZGVmaW5lZCBieSB0aGUgam9pbgotCSAqIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlpZiAodGhpcy5qb2luQ29sdW1uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXREZWZhdWx0VGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRlZCBqb2luIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIHN0YXRlIG9iamVjdAotCSAqIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIGVkaXRlZCBqb2luIGNvbHVtbiBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBSZWFkT25seUJhc2VKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiB0aGlzLmpvaW5Db2x1bW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCi0JICoKLQkgKiBAcmV0dXJuIEVpdGhlciBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZSBkZWZhdWx0Ci0JICogbmFtZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkYXRhYmFzZSB0YWJsZSBpZiBvbmUgY2FuIGJlIGZvdW5kLgotCSAqCi0JICogQHJldHVybiBUaGUgZGF0YWJhc2UgdGFibGUKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgVGFibGUgZ2V0TmFtZVRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvd25lciB3aGVyZSB0aGUgam9pbiBjb2x1bW4gaXMgbG9jYXRlZCBvciB3aGVyZSBhIG5ldyBvbmUgY2FuCi0JICogYmUgYWRkZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBwYXJlbnQgb2YgdGhlIGpvaW4gY29sdW1uCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRPd25lcigpIHsKLQkJcmV0dXJuIG93bmVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgb2YgdGhlIGpvaW4gY29sdW1uLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgam9pbiBjb2x1bW4ncyByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogdG8gdXNlIHRoZSBkZWZhdWx0IG5hbWUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICoKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGFic3RyYWN0IFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMKLQkgKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlKCkgewotCQlyZXR1cm4gdGFibGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLnZhbGlkYXRvcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXZhbGlkYXRvciA9IE5VTExfVkFMSURBVE9SOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoaXMgc3RhdGUgb2JqZWN0LgotCSAqCi0JICogQHBhcmFtIG93bmVyIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdCBvLCBSZWFkT25seUJhc2VKb2luQ29sdW1uIGpjKSB7Ci0KLQkJdGhpcy5vd25lciAgICAgID0gbzsKLQkJdGhpcy5qb2luQ29sdW1uID0gamM7Ci0JCXRoaXMudGFibGUgICAgICA9IHRoaXMuZ2V0SW5pdGlhbFRhYmxlKCk7Ci0KLQkJaWYgKGpjICE9IG51bGwpIHsKLQkJCXRoaXMubmFtZSAgICAgICAgICAgICAgICAgPSBqYy5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl0aGlzLmNvbHVtbkRlZmluaXRpb24gICAgID0gamMuZ2V0Q29sdW1uRGVmaW5pdGlvbigpOwotCQkJdGhpcy5yZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGpjLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRJbml0aWFsVGFibGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbHVtbiBuYW1lcyBpZiB0aGUgZGF0YWJhc2UgdGFibGUgY2FuIGJlIHJlc29sdmVkLgotCSAqCi0JICogQHJldHVybiBUaGUgbmFtZXMgb2YgdGhlIHRhYmxlJ3MgY29sdW1ucyBvciBhbiBlbXB0eSBpdGVyYXRvciBpZiB0aGUgdGFibGUKLQkgKiBjYW4ndCBiZSByZXNvbHZlZAotCSAqLwotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBuYW1lcygpIHsKLQkJcmV0dXJuIGNvbHVtbk5hbWVzKGdldE5hbWVUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbHVtbnNTaXplKCkgewotCQlyZXR1cm4gY29sdW1uc1NpemUoZ2V0TmFtZVRhYmxlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2UgY29sdW1uIG5hbWVzIGlmIHRoZSBkYXRhYmFzZSB0YWJsZSBjYW4gYmUgcmVzb2x2ZWQuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBuYW1lcyBvZiB0aGUgdGFibGUncyBjb2x1bW5zIG9yIGFuIGVtcHR5IGl0ZXJhdG9yIGlmIHRoZSB0YWJsZQotCSAqIGNhbid0IGJlIHJlc29sdmVkCi0JICovCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHJlZmVyZW5jZUNvbHVtbk5hbWVzKCkgewotCQlyZXR1cm4gY29sdW1uTmFtZXMoZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIGludCByZWZlcmVuY2VDb2x1bW5zU2l6ZSgpIHsKLQkJcmV0dXJuIGNvbHVtbnNTaXplKGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgU1FMIGZyYWdtZW50IHRoYXQgaXMgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIERETCBmb3IgdGhlIGNvbHVtbi4KLQkgKgotCSAqIEBwYXJhbSBjb2x1bW5EZWZpbml0aW9uIFRoZSBuZXcgam9pbiBjb2x1bW4ncyBjb2x1bW4gZGVmaW5pdGlvbiBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IHRvIGNsZWFyIHRoZSB2YWx1ZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbkRlZmluaXRpb24oU3RyaW5nIGNvbHVtbkRlZmluaXRpb24pIHsKLQkJU3RyaW5nIG9sZENvbHVtbkRlZmluaXRpb24gPSB0aGlzLmNvbHVtbkRlZmluaXRpb247Ci0JCXRoaXMuY29sdW1uRGVmaW5pdGlvbiA9IGNvbHVtbkRlZmluaXRpb247Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFksIG9sZENvbHVtbkRlZmluaXRpb24sIGNvbHVtbkRlZmluaXRpb24pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGpvaW4gY29sdW1uLgotCSAqCi0JICogQHBhcmFtIG5hbWUgVGhlIG5ldyBqb2luIGNvbHVtbidzIG5hbWUgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gdXNlIHRoZQotCSAqIGRlZmF1bHQgbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIG9sZE5hbWUgPSB0aGlzLm5hbWU7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoTkFNRV9QUk9QRVJUWSwgb2xkTmFtZSwgbmFtZSk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBvZiB0aGUgam9pbiBjb2x1bW4uCi0JICoKLQkgKiBAcGFyYW0gcmVmZXJlbmNlZENvbHVtbk5hbWUgVGhlIG5ldyBqb2luIGNvbHVtbidzIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiB0byB1c2UgdGhlIGRlZmF1bHQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKFN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSkgewotCQlTdHJpbmcgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUgPSB0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lOwotCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5OYW1lID0gcmVmZXJlbmNlZENvbHVtbk5hbWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwgb2xkUmVmZXJlbmNlZENvbHVtbk5hbWUsIHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWJsZShTdHJpbmcgdGFibGUpIHsKLQkJQXJyYXlMaXN0PFN0cmluZz4gb2xkTmFtZXMgPSBDb2xsZWN0aW9uVG9vbHMubGlzdCh0aGlzLm5hbWVzKCkpOwotCQlBcnJheUxpc3Q8U3RyaW5nPiBvbGRSZWZDb2xOYW1lcyA9IENvbGxlY3Rpb25Ub29scy5saXN0KHRoaXMucmVmZXJlbmNlQ29sdW1uTmFtZXMoKSk7Ci0JCVN0cmluZyBvbGRUYWJsZSA9IHRoaXMudGFibGU7Ci0JCXRoaXMudGFibGUgPSB0YWJsZTsKLQkJdGhpcy5maXJlUHJvcGVydHlDaGFuZ2VkKFRBQkxFX1BST1BFUlRZLCBvbGRUYWJsZSwgdGFibGUpOwotCQl0aGlzLnN5bmNocm9uaXplTGlzdCh0aGlzLm5hbWVzKCksIG9sZE5hbWVzLCBOQU1FU19MSVNUKTsKLQkJdGhpcy5zeW5jaHJvbml6ZUxpc3QodGhpcy5yZWZlcmVuY2VDb2x1bW5OYW1lcygpLCBvbGRSZWZDb2xOYW1lcywgUkVGRVJFTkNFX0NPTFVNTl9OQU1FU19MSVNUKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgYWxsIHRoZSB0YWJsZSBuYW1lcyBjb250YWlucyBpbiB0aGUgYXNzb2NpYXRlZAotCSAqIHNjaGVtYS4gVGhlIGRlZmF1bHQgcmV0dXJucyBhbiBlbXB0eSBpdGVyYXRvci4KLQkgKgotCSAqIEByZXR1cm4gVGhlIG5hbWVzIG9mIHRoZSB0YWJsZXMKLQkgKi8KLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlyZXR1cm4gRW1wdHlMaXN0SXRlcmF0b3IuaW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBnaXZlbiBqb2luIGNvbHVtbiB3aXRoIHRoZSB2YWx1ZXMgY29udGFpbmVkIGluIHRoaXMgc3RhdGUKLQkgKiBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gdXBkYXRlCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlSm9pbkNvbHVtbihCYXNlSm9pbkNvbHVtbiBqYykgewotCi0JCS8vIE5hbWUKLQkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChuYW1lLCBqYy5nZXRTcGVjaWZpZWROYW1lKCkpKSB7Ci0JCQlqYy5zZXRTcGVjaWZpZWROYW1lKG5hbWUpOwotCQl9Ci0KLQkJLy8gUmVmZXJlbmNlZCBDb2x1bW4gTmFtZQotCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KHJlZmVyZW5jZWRDb2x1bW5OYW1lLCBqYy5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKSkgewotCQkJamMuc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0KLQkJLy8gQ29sdW1uIERlZmluaXRpb24KLQkJaWYgKHZhbHVlc0FyZURpZmZlcmVudChjb2x1bW5EZWZpbml0aW9uLCBqYy5nZXRDb2x1bW5EZWZpbml0aW9uKCkpKSB7Ci0JCQlqYy5zZXRDb2x1bW5EZWZpbml0aW9uKGNvbHVtbkRlZmluaXRpb24pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9CYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3MGQ1YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQmFzaWNNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBFbnVtVHlwZUNvbXBvc2l0ZQotICogQHNlZSBGZXRjaFR5cGVDb21wb3NpdGUKLSAqIEBzZWUgTG9iQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU8QmFzaWNNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QmFzaWNNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBCYXNpY01hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0Nhc2NhZGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA0YzM1MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQ2FzY2FkZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gQ2FzY2FkZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCB4IEFsbCAgICAgICB4IFBlcnNpc3QgICB4IE1lcmdlICAgICB4IFJlbW92ZSAgICB4IFJlZnJlc2ggICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBDYXNjYWRlCi0gKiBAc2VlIFJlbGF0aW9uc2hpcE1hcHBpbmcKLSAqIEBzZWUgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ2FzY2FkZUNvbXBvc2l0ZTxUIGV4dGVuZHMgQ2FzY2FkZT4gZXh0ZW5kcyBQYW5lPFQ+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5DYXNjYWRlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQ2FzY2FkZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENhc2NhZGVDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBSZWxhdGlvbnNoaXBNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2x1bW5Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JQ2FzY2FkZTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBDYXNjYWRlQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gQ2FzY2FkZSBncm91cAotCQlHcm91cCBjYXNjYWRlR3JvdXAgPSBhZGRDYXNjYWRlR3JvdXAoY29udGFpbmVyKTsKLQkJCi0JCS8vIENvbnRhaW5lciBvZiB0aGUgY2hlY2sgYm94ZXMKLQkJY29udGFpbmVyID0gYWRkU3ViUGFuZShjYXNjYWRlR3JvdXAsIDUsIDgsIDAsIDAsIDApOwotCQkKLQkJYWRkQWxsQ2hlY2tCb3goY29udGFpbmVyKTsKLQkJYWRkUGVyc2lzdENoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZE1lcmdlQ2hlY2tCb3goY29udGFpbmVyKTsKLQkJYWRkUmVtb3ZlQ2hlY2tCb3goY29udGFpbmVyKTsKLQkJYWRkUmVmcmVzaENoZWNrQm94KGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEFsbENoZWNrQm94KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gQWxsIGNoZWNrIGJveAotCQlhZGRDaGVja0JveCgKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9hbGwsCi0JCQkJYnVpbGRDYXNjYWRlVHlwZUFsbEhvbGRlcigpLAotCQkJCW51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQZXJzaXN0Q2hlY2tCb3goQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBQZXJzaXN0IGNoZWNrIGJveAotCQlhZGRDaGVja0JveCgKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9wZXJzaXN0LAotCQkJCWJ1aWxkQ2FzY2FkZVR5cGVQZXJzaXN0SG9sZGVyKCksCi0JCQkJbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZE1lcmdlQ2hlY2tCb3goQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBNZXJnZSBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfbWVyZ2UsCi0JCQkJYnVpbGRDYXNjYWRlVHlwZU1lcmdlSG9sZGVyKCksCi0JCQkJbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFJlbW92ZUNoZWNrQm94KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gUmVtb3ZlIGNoZWNrIGJveAotCQlhZGRDaGVja0JveCgKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9yZW1vdmUsCi0JCQkJYnVpbGRDYXNjYWRlVHlwZVJlbW92ZUhvbGRlcigpLAotCQkJCW51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZWZyZXNoQ2hlY2tCb3goQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBSZWZyZXNoIGNoZWNrIGJveAotCQlhZGRDaGVja0JveCgKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ2FzY2FkZUNvbXBvc2l0ZV9yZWZyZXNoLAotCQkJCWJ1aWxkQ2FzY2FkZVR5cGVSZWZyZXNoSG9sZGVyKCksCi0JCQkJbnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBHcm91cCBhZGRDYXNjYWRlR3JvdXAoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gYWRkVGl0bGVkR3JvdXAoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNhc2NhZGVDb21wb3NpdGVfY2FzY2FkZVRpdGxlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FzY2FkZVR5cGVBbGxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhc2NhZGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FzY2FkZS5BTExfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuaXNBbGwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0QWxsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FzY2FkZVR5cGVNZXJnZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZSwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlLk1FUkdFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmlzTWVyZ2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0TWVyZ2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZVBlcnNpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhc2NhZGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ2FzY2FkZS5QRVJTSVNUX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmlzUGVyc2lzdCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXRQZXJzaXN0KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FzY2FkZVR5cGVSZWZyZXNoSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuUkVGUkVTSF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc1JlZnJlc2goKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0UmVmcmVzaCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENhc2NhZGVUeXBlUmVtb3ZlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYXNjYWRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIENhc2NhZGUuUkVNT1ZFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmlzUmVtb3ZlKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlzdWJqZWN0LnNldFJlbW92ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Db2x1bW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyNTdiMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvQ29sdW1uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5EYXRhYmFzZU9iamVjdENvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgQ29sdW1uQ29tcG9zaXRlCi0JZXh0ZW5kcyBQYW5lPFJlYWRPbmx5Q29sdW1uPgotewotCXB1YmxpYyBDb2x1bW5Db21wb3NpdGUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5Q29sdW1uPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCQotCXByaXZhdGUgQ29sdW1uQ29tYm88UmVhZE9ubHlDb2x1bW4+IGFkZENvbHVtbkNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCXJldHVybiBuZXcgQ29sdW1uQ29tYm88UmVhZE9ubHlDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVEFCTEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5QmFzZUNvbHVtbi5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9UQUJMRV9QUk9QRVJUWSB8fAotCQkJCSAgICBwcm9wZXJ0eU5hbWUgPT0gUmVhZE9ubHlCYXNlQ29sdW1uLlNQRUNJRklFRF9UQUJMRV9QUk9QRVJUWSkgewotCQkJCQl0aGlzLmRvUG9wdWxhdGUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCSgoQ29sdW1uKSB0aGlzLmdldFN1YmplY3QoKSkuc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGVfKCkgewotCQkJCVJlYWRPbmx5Q29sdW1uIGNvbHVtbiA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQkJCXJldHVybiAoY29sdW1uID09IG51bGwpID8gbnVsbCA6IGNvbHVtbi5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ29sdW1uQ29tcG9zaXRlLmNvbHVtbkNvbWJvIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQkKLQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlDb2x1bW4sIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBSZWFkT25seU5hbWVkQ29sdW1uLkNPTFVNTl9ERUZJTklUSU9OX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJKChDb2x1bW4pIHRoaXMuc3ViamVjdCkuc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlDb2x1bW4sIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgUmVhZE9ubHlCYXNlQ29sdW1uLlNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJKChDb2x1bW4pIHRoaXMuc3ViamVjdCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSW5zZXJ0YWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdEluc2VydGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seUNvbHVtbiwgQm9vbGVhbj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJCVJlYWRPbmx5QmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwKLQkJCQlSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROdWxsYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlDb2x1bW4sIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlSZWFkT25seUJhc2VDb2x1bW4uU1BFQ0lGSUVEX05VTExBQkxFX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWROdWxsYWJsZSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJKChDb2x1bW4pIHRoaXMuc3ViamVjdCkuc2V0U3BlY2lmaWVkTnVsbGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQkKLQlQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0TnVsbGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seUNvbHVtbiwgQm9vbGVhbj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJCVJlYWRPbmx5QmFzZUNvbHVtbi5TUEVDSUZJRURfTlVMTEFCTEVfUFJPUEVSVFksCi0JCQkJUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEVfUFJPUEVSVFkpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUGFuZTxSZWFkT25seUNvbHVtbj4gYWRkVGFibGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQotCQlyZXR1cm4gbmV3IERhdGFiYXNlT2JqZWN0Q29tYm88UmVhZE9ubHlDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seUJhc2VDb2x1bW4uU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFRhYmxlKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJKChDb2x1bW4pIHRoaXMuZ2V0U3ViamVjdCgpKS5zZXRTcGVjaWZpZWRUYWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVGFibGUoKTsKLQkJCX0KLQkJCQotCQkJLy8gVE9ETyB3ZSBuZWVkIHRvIGxpc3RlbiBmb3IgdGhpcyBsaXN0IHRvIGNoYW5nZS4uLgotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXNfKCkgewotCQkJCVJlYWRPbmx5Q29sdW1uIGNvbHVtbiA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQkJCXJldHVybiAoY29sdW1uICE9IG51bGwpID8gY29sdW1uLmdldENhbmRpZGF0ZVRhYmxlTmFtZXMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz4gaW5zdGFuY2UoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiQ29sdW1uQ29tcG9zaXRlLnRhYmxlQ29tYm8iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCQotCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVW5pcXVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seUNvbHVtbiwgQm9vbGVhbj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJCVJlYWRPbmx5QmFzZUNvbHVtbi5TUEVDSUZJRURfVU5JUVVFX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRVbmlxdWUoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCSgoQ29sdW1uKSB0aGlzLnN1YmplY3QpLnNldFNwZWNpZmllZFVuaXF1ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5pcXVlU3RyaW5nSG9sZGVyKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFVuaXF1ZUhvbGRlcigpKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFVuaXF1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlDb2x1bW4sIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlSZWFkT25seUJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VOSVFVRV9QUk9QRVJUWSwKLQkJCQlSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9VTklRVUVfUFJPUEVSVFkpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFVuaXF1ZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVcGRhdGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5Q29sdW1uLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQkJUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLAotCQkJCVJlYWRPbmx5QmFzZUNvbHVtbi5TUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCSgoQ29sdW1uKSB0aGlzLnN1YmplY3QpLnNldFNwZWNpZmllZFVwZGF0YWJsZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCkgewotCQkKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdFVwZGF0YWJsZUhvbGRlcigpKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFVwZGF0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlDb2x1bW4sIEJvb2xlYW4+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCQlSZWFkT25seUJhc2VDb2x1bW4uU1BFQ0lGSUVEX1VQREFUQUJMRV9QUk9QRVJUWSwKLQkJCQlSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9VUERBVEFCTEVfUFJPUEVSVFkpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFVwZGF0YWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIENvbHVtbiBncm91cCBwYW5lCi0JCWNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfY29sdW1uU2VjdGlvbik7Ci0JCQotCQkvLyBDb2x1bW4gd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbmFtZSwKLQkJCQlhZGRDb2x1bW5Db21ibyhjb250YWluZXIpLAotCQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfQ09MVU1OKTsKLQkJCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3RhYmxlLAotCQkJCWFkZFRhYmxlQ29tYm8oY29udGFpbmVyKSwKLQkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9UQUJMRSk7Ci0JCQotCQkvLyBEZXRhaWxzIHN1Yi1wYW5lCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RldGFpbHMsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKSk7Ci0JCQotCQluZXcgRGV0YWlsc0NvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNikpOwotCX0KLQkKLQlwcm90ZWN0ZWQgY2xhc3MgRGV0YWlsc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UmVhZE9ubHlDb2x1bW4+IHsKLQkJCQkKLQkJcHVibGljIERldGFpbHNDb21wb3NpdGUoCi0JCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVhZE9ubHlDb2x1bW4+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQkJCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJLy8gSW5zZXJ0YWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGUsCi0JCQkJCWJ1aWxkSW5zZXJ0YWJsZUhvbGRlcigpLAotCQkJCQlidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fSU5TRVJUQUJMRSk7Ci0JCQkKLQkJCS8vIFVwZGF0YWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQkJCWNvbnRhaW5lciwKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZSwKLQkJCQkJYnVpbGRVcGRhdGFibGVIb2xkZXIoKSwKLQkJCQkJYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFKTsKLQkJCQotCQkJLy8gVW5pcXVlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCQkJY29udGFpbmVyLAotCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdW5pcXVlLAotCQkJCQlidWlsZFVuaXF1ZUhvbGRlcigpLAotCQkJCQlidWlsZFVuaXF1ZVN0cmluZ0hvbGRlcigpLAotCQkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9VTklRVUUpOwotCQkJCi0JCQkvLyBOdWxsYWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQkJCWNvbnRhaW5lciwKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlLAotCQkJCQlidWlsZE51bGxhYmxlSG9sZGVyKCksCi0JCQkJCWJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTlVMTEFCTEUpOwotCQkJCi0JCQlhZGRMZW5ndGhDb21ibyhjb250YWluZXIpOwotCQkJYWRkUHJlY2lzaW9uQ29tYm8oY29udGFpbmVyKTsKLQkJCWFkZFNjYWxlQ29tYm8oY29udGFpbmVyKTsKLQkJCQotCQkJLy8gQ29sdW1uIERlZmluaXRpb24gd2lkZ2V0cwotCQkJYWRkTGFiZWxlZFRleHQoCi0JCQkJCWNvbnRhaW5lciwKLQkJCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2NvbHVtbkRlZmluaXRpb24sCi0JCQkJCWJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcigpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZExlbmd0aENvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCW5ldyBJbnRlZ2VyQ29tYm88UmVhZE9ubHlDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2xlbmd0aDsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9MRU5HVEg7Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seUNvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIFJlYWRPbmx5Q29sdW1uLlNQRUNJRklFRF9MRU5HVEhfUFJPUEVSVFkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRMZW5ndGgoKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oSW50ZWdlciB2YWx1ZSkgewotCQkJCQkJCSgoQ29sdW1uKSB0aGlzLnN1YmplY3QpLnNldFNwZWNpZmllZExlbmd0aCh2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZFByZWNpc2lvbkNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCW5ldyBJbnRlZ2VyQ29tYm88UmVhZE9ubHlDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9wcmVjaXNpb247Ci0JCQkJfQotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fUFJFQ0lTSU9OOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkRGVmYXVsdEhvbGRlcigpIHsKLQkJCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT05fUFJPUEVSVFkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seUNvbHVtbiwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBSZWFkT25seUNvbHVtbi5TUEVDSUZJRURfUFJFQ0lTSU9OX1BST1BFUlRZKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCQkoKENvbHVtbikgdGhpcy5zdWJqZWN0KS5zZXRTcGVjaWZpZWRQcmVjaXNpb24odmFsdWUpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCBhZGRTY2FsZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCW5ldyBJbnRlZ2VyQ29tYm88UmVhZE9ubHlDb2x1bW4+KHRoaXMsIGNvbnRhaW5lcikgewkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9zY2FsZTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9TQ0FMRTsKLQkJCQl9Ci0JCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEVfUFJPUEVSVFkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5Q29sdW1uLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIFJlYWRPbmx5Q29sdW1uLlNQRUNJRklFRF9TQ0FMRV9QUk9QRVJUWSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNjYWxlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCQkoKENvbHVtbikgdGhpcy5zdWJqZWN0KS5zZXRTcGVjaWZpZWRTY2FsZSh2YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJfQotCQkJfTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmQyOWIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlOYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCA+IERpc2NyaW1pbmF0b3IgQ29sdW1uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBOYW1lOiAgICAgICAgICAgICAgICB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBUeXBlOiAgICAgICAgICAgICAgICB8IEVudW1Db21ib1ZpZXdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ID4gRGV0YWlscwkJCQkJCQkJCQkJCQkJCQkgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ29sdW1uIERlZmluaXRpb246ICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgTGVuZ3RoOiAgICAgICAgICAgICAgfCBJICAgICAgIHxJfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIEVudW1Db21ib1ZpZXdlcgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGU8VCBleHRlbmRzIEVudGl0eT4gZXh0ZW5kcyBQYW5lPFQ+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBEaXNjcmltaW5hdG9yIENvbHVtbiBzdWItcGFuZQotCQlDb21wb3NpdGUgZGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciA9IGFkZFRpdGxlZEdyb3VwKAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkluaGVyaXRhbmNlQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JDb2x1bW5Hcm91cEJveAotCQkpOwotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyID0KLQkJCWJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpOwotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJZGlzY3JpbWluYXRvckNvbHVtbkNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfbmFtZSwKLQkJCWFkZERpc2NyaW1pbmF0b3JDb2x1bW5Db21ibyhjb250YWluZXIsIGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfQ09MVU1OCi0JCSk7Ci0KLQkJLy8gRGlzY3JpbWluYXRvciBUeXBlIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5EaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2Rpc2NyaW1pbmF0b3JUeXBlLAotCQkJYWRkRGlzY3JpbWluYXRvclR5cGVDb21ibyhjb250YWluZXIsIGRpc2NyaW1pbmF0b3JDb2x1bW5Ib2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX0lOSEVSSVRBTkNFX0RJU0NSSU1JTkFUT1JfVFlQRQotCQkpOwotCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWRpc2NyaW1pbmF0b3JDb2x1bW5Db250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Jbmhlcml0YW5jZUNvbXBvc2l0ZV9kZXRhaWxzR3JvdXBCb3gsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0JCQotCQluZXcgRGV0YWlsc0NvbXBvc2l0ZSh0aGlzLCBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMTYpKTsKLQkJCi0JCW5ldyBQYW5lRW5hYmxlcihidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5FbmFibGVkSG9sZGVyKCksIHRoaXMpOwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88RGlzY3JpbWluYXRvckNvbHVtbj4gYWRkRGlzY3JpbWluYXRvckNvbHVtbkNvbWJvKAotCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgewotCi0JCXJldHVybiBuZXcgQ29sdW1uQ29tYm88RGlzY3JpbWluYXRvckNvbHVtbj4oCi0JCQl0aGlzLAotCQkJZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwKLQkJCWNvbnRhaW5lcikKLQkJewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5TmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5TmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREYlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGROdWxsRGVmYXVsdFZhbHVlRW50cnkoKSB7Ci0JCQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuTm9uZVNlbGVjdGVkOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPERpc2NyaW1pbmF0b3JDb2x1bW4+IGJ1aWxkRGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBEaXNjcmltaW5hdG9yQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JDb2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPERpc2NyaW1pbmF0b3JDb2x1bW4sIERpc2NyaW1pbmF0b3JUeXBlPiBhZGREaXNjcmltaW5hdG9yVHlwZUNvbWJvKAotCQlDb21wb3NpdGUgY29udGFpbmVyLAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8RGlzY3JpbWluYXRvckNvbHVtbj4gZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxEaXNjcmltaW5hdG9yQ29sdW1uLCBEaXNjcmltaW5hdG9yVHlwZT4oCi0JCQl0aGlzLAotCQkJZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwKLQkJCWNvbnRhaW5lcikKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChEaXNjcmltaW5hdG9yQ29sdW1uLlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIERpc2NyaW1pbmF0b3JUeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEaXNjcmltaW5hdG9yVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRGlzY3JpbWluYXRvclR5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgQ0hBUiA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9jaGFyOwotCQkJCQljYXNlIElOVEVHRVIgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfaW50ZWdlcjsKLQkJCQkJY2FzZSBTVFJJTkcgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfc3RyaW5nOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBudWxsRGlzcGxheVN0cmluZygpIHsKLQkJCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQ7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERpc2NyaW1pbmF0b3JUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShEaXNjcmltaW5hdG9yVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2NyaW1pbmF0b3JDb2x1bW5FbmFibGVkSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9ESVNDUklNSU5BVE9SX0NPTFVNTl9JU19BTExPV0VEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBjbGFzcyBEZXRhaWxzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxEaXNjcmltaW5hdG9yQ29sdW1uPiB7Ci0JCXB1YmxpYyBEZXRhaWxzQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRGlzY3JpbWluYXRvckNvbHVtbj4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCQkvLyBMZW5ndGggd2lkZ2V0cwotCQkJYWRkTGVuZ3RoQ29tYm8oY29udGFpbmVyKTsKLQotCQkJLy8gQ29sdW1uIERlZmluaXRpb24gd2lkZ2V0cwotCQkJYWRkTGFiZWxlZFRleHQoCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9jb2x1bW5EZWZpbml0aW9uLAotCQkJCWJ1aWxkQ29sdW1uRGVmaW5pdGlvbkhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpCi0JCQkpOwotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgYWRkTGVuZ3RoQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJbmV3IEludGVnZXJDb21ibzxEaXNjcmltaW5hdG9yQ29sdW1uPih0aGlzLCBjb250YWluZXIpIHsKLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9sZW5ndGg7Ci0JCQkJfQotCQkJCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9MRU5HVEg7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERpc2NyaW1pbmF0b3JDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSF9QUk9QRVJUWSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCQlyZXR1cm4gSW50ZWdlci52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERpc2NyaW1pbmF0b3JDb2x1bW4sIEludGVnZXI+KGdldFN1YmplY3RIb2xkZXIoKSwgRGlzY3JpbWluYXRvckNvbHVtbi5TUEVDSUZJRURfTEVOR1RIX1BST1BFUlRZKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTGVuZ3RoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTGVuZ3RoKHZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDb2x1bW5EZWZpbml0aW9uSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxEaXNjcmltaW5hdG9yQ29sdW1uPiBkaXNjcmltaW5hdG9yQ29sdW1uSG9sZGVyKSB7Ci0KLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERpc2NyaW1pbmF0b3JDb2x1bW4sIFN0cmluZz4oZGlzY3JpbWluYXRvckNvbHVtbkhvbGRlciwgTmFtZWRDb2x1bW4uQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbHVtbkRlZmluaXRpb24oKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbHVtbkRlZmluaXRpb24odmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExMThkMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZElkTWFwcGluZz4KLXsKLQlwdWJsaWMgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCQl0aGlzLAotCQkJCWNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjZiMTZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTxFbWJlZGRlZE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9FbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwZWMxYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlPEJhc2VFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JcHVibGljIEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIEJhc2VFbWJlZGRlZE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxCYXNlRW1iZWRkZWRNYXBwaW5nLCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRW50aXR5TmFtZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0VudGl0eU5hbWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFjZTVhMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRW50aXR5TmFtZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudGl0eSBOYW1lOiB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHkKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TmFtZUNvbXBvc2l0ZQotCWV4dGVuZHMgUGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlOYW1lQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBFbnRpdHlOYW1lQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbWJvIGNvbWJvID0gYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5FbnRpdHlOYW1lQ29tcG9zaXRlX25hbWUsCi0JCQlidWlsZERlZmF1bHRFbnRpdHlOYW1lTGlzdEhvbGRlcigpLAotCQkJYnVpbGRFbnRpdHlOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfTkFNRSk7Ci0JCQotCQlTV1RVdGlsLmF0dGFjaERlZmF1bHRWYWx1ZUhhbmRsZXIoY29tYm8pOwotCX0KLQkKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RW50aXR5TmFtZUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCWJ1aWxkRGVmYXVsdEVudGl0eU5hbWVIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0RW50aXR5TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LkRFRkFVTFRfTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBkZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRFbnRpdHlOYW1lSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBFbnRpdHkuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksIEVudGl0eS5ERUZBVUxUX05BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQotCQkJCVN0cmluZyBuYW1lID0gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE5hbWUoKTsKLQotCQkJCWlmIChuYW1lID09IG51bGwpIHsKLQkJCQkJbmFtZSA9IGRlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChkZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0KLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdFZhbHVlKEVudGl0eSBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHROYW1lKCk7Ci0KLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0V2l0aE9uZVBhcmFtLAotCQkJCWRlZmF1bHRWYWx1ZQotCQkJKTsKLQkJfQotCQlyZXR1cm4gSnB0Q29tbW9uVWlNZXNzYWdlcy5EZWZhdWx0RW1wdHk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0VudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0VudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg3Y2QyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnRpdHlPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUKLXsKLQlwdWJsaWMgRW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgRW50aXR5PiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRW51bVR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTgyZDZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9FbnVtVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEVudW0gVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNpY01hcHBpbmcKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEVudW1UeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnVtZXJhdGVkQ29udmVydGVyPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW51bVR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudW1UeXBlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW51bWVyYXRlZENvbnZlcnRlcj4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxFbnVtZXJhdGVkQ29udmVydGVyLCBFbnVtVHlwZT4gYWRkRW51bVR5cGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEVudW1lcmF0ZWRDb252ZXJ0ZXIsIEVudW1UeXBlPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnVtZXJhdGVkQ29udmVydGVyLlNQRUNJRklFRF9FTlVNX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnVtVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEVudW1UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnVtVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RW51bVR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRW51bVR5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgT1JESU5BTCA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRW51bVR5cGVDb21wb3NpdGVfb3JkaW5hbDsKLQkJCQkJY2FzZSBTVFJJTkcgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkVudW1UeXBlQ29tcG9zaXRlX3N0cmluZzsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBFbnVtVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZEVudW1UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoRW51bVR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRW51bVR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvL0pwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfRU5VTUVSQVRFRAotCQlhZGRFbnVtVHlwZUNvbWJvKGNvbnRhaW5lcik7Ci0JCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRCb29sZWFuSG9sZGVyKCksIHRoaXMpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKEVudW1lcmF0ZWRDb252ZXJ0ZXIgdmFsdWUpIHsKLQkJCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRmV0Y2hUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvRmV0Y2hUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjhlNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0ZldGNoVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hhYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBGZXRjaDogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRmV0Y2hhYmxlTWFwcGluZwotICogQHNlZSBCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKiBAc2VlIE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEZldGNoVHlwZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RmV0Y2hhYmxlTWFwcGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5GZXRjaFR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEZldGNoVHlwZUNvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBGZXRjaGFibGVNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEZldGNoYWJsZU1hcHBpbmcsIEZldGNoVHlwZT4gYWRkRmV0Y2hUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxGZXRjaGFibGVNYXBwaW5nLCBGZXRjaFR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEZldGNoYWJsZU1hcHBpbmcuREVGQVVMVF9GRVRDSF9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRmV0Y2hhYmxlTWFwcGluZy5TUEVDSUZJRURfRkVUQ0hfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBGZXRjaFR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBGZXRjaFR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEZldGNoVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0RmV0Y2goKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoRmV0Y2hUeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIEVBR0VSIDoKLQkJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5GZXRjaFR5cGVDb21wb3NpdGVfZWFnZXI7Ci0JCQkJCWNhc2UgTEFaWSA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuRmV0Y2hUeXBlQ29tcG9zaXRlX2xhenk7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgRmV0Y2hUeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkRmV0Y2goKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShGZXRjaFR5cGUgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkRmV0Y2godmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX2ZldGNoTGFiZWwsCi0JCQlhZGRGZXRjaFR5cGVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19GRVRDSF9UWVBFCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRlZFZhbHVlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhjMmFmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkVudW1Gb3JtQ29tYm9WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vbkVtcHR5U3RyaW5nRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFOYW1lZENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTdHJhdGVneTogICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBHZW5lcmF0b3IgTmFtZTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSWRNYXBwaW5nCi0gKiBAc2VlIEdlbmVyYXRlZFZhbHVlCi0gKiBAc2VlIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPElkTWFwcGluZz4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+R2VuZXJhdGVkVmFsdWVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIElkTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTdHJhdGVneSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9zdHJhdGVneSwKLQkJCWFkZFN0cmF0ZWd5Q29tYm9WaWV3ZXIoY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfR0VORVJBVEVEX1ZBTFVFX1NUUkFURUdZCi0JCSk7Ci0KLQkJYWRkTGFiZWxlZEVkaXRhYmxlQ29tYm8oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9nZW5lcmF0b3JOYW1lLAotCQkJYnVpbGRTb3J0ZWRHZW5lcmF0ZXJOYW1lc01vZGVsKCksCi0JCQlidWlsZEdlbmVyYXRvck5hbWVIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfR0VORVJBVEVEX1ZBTFVFX0dFTkVSQVRPUl9OQU1FCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPEdlbmVyYXRlZFZhbHVlLCBHZW5lcmF0aW9uVHlwZT4gYWRkU3RyYXRlZ3lDb21ib1ZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPEdlbmVyYXRlZFZhbHVlLCBHZW5lcmF0aW9uVHlwZT4odGhpcywgYnVpbGRHZW5lcmF0ZWRWYWx1ZUhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfU1RSQVRFR1lfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIEdlbmVyYXRpb25UeXBlLnZhbHVlcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U3RyYXRlZ3koKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgQVVUTyA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfYXV0bzsKLQkJCQkJY2FzZSBJREVOVElUWSA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfaWRlbnRpdHk7Ci0JCQkJCWNhc2UgU0VRVUVOQ0UgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX3NlcXVlbmNlOwotCQkJCQljYXNlIFRBQkxFIDoKLQkJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV90YWJsZTsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFN0cmF0ZWd5KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoR2VuZXJhdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlnZXRHZW5lcmF0ZWRWYWx1ZUZvclVwZGF0ZSgpLnNldFNwZWNpZmllZFN0cmF0ZWd5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0ZWRWYWx1ZT4gYnVpbGRHZW5lcmF0ZWRWYWx1ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBHZW5lcmF0ZWRWYWx1ZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBJZE1hcHBpbmcuR0VORVJBVEVEX1ZBTFVFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBHZW5lcmF0ZWRWYWx1ZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdGVkVmFsdWUsIFN0cmluZz4oYnVpbGRHZW5lcmF0ZWRWYWx1ZUhvbGRlcigpLCBHZW5lcmF0ZWRWYWx1ZS5TUEVDSUZJRURfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0ICE9IG51bGwpIHsKLQkJCQkJc2V0VmFsdWVfKHZhbHVlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWdldEdlbmVyYXRlZFZhbHVlRm9yVXBkYXRlKCkuc2V0U3BlY2lmaWVkR2VuZXJhdG9yKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9bnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEdlbmVyYXRvcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTb3J0ZWRHZW5lcmF0ZXJOYW1lc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuYnVpbGRVbmlxdWVHZW5lcmF0b3JOYW1lc01vZGVsKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5pcXVlR2VuZXJhdG9yTmFtZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRHZW5lcmF0b3JOYW1lc01vZGVsKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkR2VuZXJhdG9yTmFtZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KHRoaXMuYnVpbGRHZW5lcmF0b3JOYW1lc01vZGVsXygpLCBOb25FbXB0eVN0cmluZ0ZpbHRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEdlbmVyYXRvck5hbWVzTW9kZWxfKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw8R2VuZXJhdG9yLCBTdHJpbmc+KHRoaXMuYnVpbGRHZW5lcmF0b3JzTW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybUl0ZW1fKEdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJCQlyZXR1cm4gZ2VuZXJhdG9yLmdldE5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8R2VuZXJhdG9yPiBidWlsZEdlbmVyYXRvcnNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8R2VuZXJhdG9yPih0aGlzLmJ1aWxkR2VuZXJhdG9yc01vZGVsXygpLCBKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxHZW5lcmF0b3I+IGJ1aWxkR2VuZXJhdG9yc01vZGVsXygpIHsKLQkJcmV0dXJuIG5ldyBDb2xsZWN0aW9uQXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIEdlbmVyYXRvcj4odGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdE1vZGVsKCksIFBlcnNpc3RlbmNlVW5pdC5HRU5FUkFUT1JTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEdlbmVyYXRvcj4gZ2V0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0b3JzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0b3JzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZE1hcHBpbmcsIFBlcnNpc3RlbmNlVW5pdD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiBDVSBwcml2YXRlICovIEdlbmVyYXRlZFZhbHVlIGdldEdlbmVyYXRlZFZhbHVlRm9yVXBkYXRlKCkgewotCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGdldFN1YmplY3QoKS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCi0JCWlmIChnZW5lcmF0ZWRWYWx1ZSA9PSBudWxsKSB7Ci0JCQlnZW5lcmF0ZWRWYWx1ZSA9IGdldFN1YmplY3QoKS5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiBnZW5lcmF0ZWRWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGExZWU2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkdlbmVyYXRvckNvbXBvc2l0ZS5HZW5lcmF0b3JCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCB2IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgeCBUYWJsZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB2IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgeCBTZXF1ZW5jZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgR2VuZXJhdG9yQ29udGFpbmVyCi0gKiBAc2VlIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlCi0gKiBAc2VlIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlCi0gKiBAc2VlIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRpb25Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPEdlbmVyYXRvckNvbnRhaW5lcj4KLXsKLQotCS8vVGhlc2UgYXJlIGJ1aWx0IHRvIHN0YW5kIGFsb25lIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdGhlIHBhbmVscyB0byBjb2xsYXBzZSBqdXN0Ci0JLy9iZWNhdXNlIHRoZSBnZW5lcmF0b3IgaXMgcmVtb3ZlZCBlaXRoZXIgaW4gdGhlIHNvdXJjZSBvciB1c2luZyB0aGUgY2hlY2sgYm94IGluIHRoZSBVSS4gIAotCS8vV2UgZG9uJ3Qgd2FudCB0aGVzZSB0byBiZSBidWlsdCBvbiB0aGUgbW9kZWwgZ2VuZXJhdG9yIHByb3BlcnRpZXMuCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcjsKLQotCQotCXB1YmxpYyBHZW5lcmF0aW9uQ29tcG9zaXRlKAotCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEdlbmVyYXRvckNvbnRhaW5lcj4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlciAgICA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5GQUxTRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZG9Qb3B1bGF0ZSgpIHsKLQkJc3VwZXIuZG9Qb3B1bGF0ZSgpOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIuc2V0VmFsdWUoQm9vbGVhbi52YWx1ZU9mKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpKTsKLQkJdGhpcy50YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyICAgLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZihnZXRTdWJqZWN0KCkgIT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5pbml0aWFsaXplVGFibGVHZW5lcmF0b3JQYW5lKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlcXVlbmNlR2VuZXJhdG9yUGFuZShjb250YWluZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3Igc3ViLXNlY3Rpb24KLQkJY29udGFpbmVyID0gdGhpcy5hZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCAxMCksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0b3JzQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yU2VjdGlvbiwKLQkJCXRoaXMuc2VxdWVuY2VHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlcgotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBjaGVjayBib3gKLQkJQnV0dG9uIHNlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdG9yc0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LAotCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1IKLQkJKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQotCQl0aGlzLmFkZFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKGNvbnRhaW5lciwgMCwgc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgdG9wTWFyZ2luLCBpbnQgbGVmdE1hcmdpbikgewotCQluZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKCksCi0JCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCB0b3BNYXJnaW4sIGxlZnRNYXJnaW4pLAotCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpCi0JCSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yQ29udGFpbmVyLCBTZXF1ZW5jZUdlbmVyYXRvcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JDb250YWluZXIuU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTZXF1ZW5jZUdlbmVyYXRvciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+KCkgewotCQkJcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yIGFkZEdlbmVyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3JDb250YWluZXIuU0VRVUVOQ0VfR0VORVJBVE9SX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgPT0gbnVsbCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFNlcXVlbmNlR2VuZXJhdG9yKCkgIT0gbnVsbCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotIAlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhYmxlR2VuZXJhdG9yUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHN1Yi1zZWN0aW9uCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkdlbmVyYXRvcnNDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JTZWN0aW9uLAotCQkJdGhpcy50YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyCi0JCSk7Ci0KLQkJQnV0dG9uIHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuR2VuZXJhdG9yc0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvckNoZWNrQm94LAotCQkJdGhpcy5idWlsZFRhYmxlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1IKLQkJKTsKLQotCi0JCS8vIFRhYmxlIEdlbmVyYXRvciBwYW5lCi0JCW5ldyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSwKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDAsIHRhYmxlR2VuZXJhdG9yQ2hlY2tCb3guZ2V0Qm9yZGVyV2lkdGgoKSArIDE2KSwKLQkJCXRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlR2VuZXJhdG9yPiBidWlsZFRhYmxlR2VuZXJhdG9ySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIFRhYmxlR2VuZXJhdG9yPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckNvbnRhaW5lci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEdlbmVyYXRvckJ1aWxkZXI8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JCdWlsZGVyKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1aWxkZXI8VGFibGVHZW5lcmF0b3I+KCkgewotCQkJcHVibGljIFRhYmxlR2VuZXJhdG9yIGFkZEdlbmVyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRhYmxlR2VuZXJhdG9yRXhwYW5zdGlvblN0YXRlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpOwotCQkJfQkJCi0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRhYmxlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yQ29udGFpbmVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvckNvbnRhaW5lci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoIXZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3IoKSAhPSBudWxsKSkgewotCQkJCQl0aGlzLnN1YmplY3QucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvR2VuZXJhdG9yQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmVlY2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0dlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBwYW5lIGZvciBhIGdlbmVyYXRvci4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBHZW5lcmF0b3IKLSAqIEBzZWUgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgLSBBIHN1Yi1wYW5lCi0gKiBAc2VlIFRhbGJlR2VuZXJhdG9yQ29tcG9zaXRlIC0gQSBzdWItcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhdG9yQ29tcG9zaXRlPFQgZXh0ZW5kcyBHZW5lcmF0b3I+IGV4dGVuZHMgUGFuZTxUPgotewotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckJ1aWxkZXI8VD4gZ2VuZXJhdG9yQnVpbGRlcjsKLQotCXByb3RlY3RlZCBHZW5lcmF0b3JDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgR2VuZXJhdG9yQnVpbGRlcjxUPiBnZW5lcmF0b3JCdWlsZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JCXRoaXMuZ2VuZXJhdG9yQnVpbGRlciA9IGdlbmVyYXRvckJ1aWxkZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBHZW5lcmF0b3IuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIGZvciB0aGUgdXNlcgotCSAqIHRvIHNldCB2YWx1ZXMgb24gYSBHZW5lcmF0b3IgYmVmb3JlIHRoZSBtb2RlbCBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZC4KLQkgKiBBbGxvd3MgdGhlbSBub3QgdG8gZmlyc3QgaGF2ZSB0byBjaGVjayB0aGUgY2hlY2sgYm94IHRvIGVuYWJsZSB0aGUgcGFuZWwuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFQgYnVpbGRHZW5lcmF0b3IoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvckJ1aWxkZXIuYWRkR2VuZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSA8Y29kZT5HZW5lcmF0b3I8L2NvZGU+IGFuZCBpZiBpdCBpcyA8Y29kZT5udWxsPC9jb2RlPiwgdGhlbgotCSAqIGNyZWF0ZSBpdC4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0IFRoZSBzdWJqZWN0IHVzZWQgdG8gcmV0cmlldmUgdGhlIGdlbmVyYXRvcgotCSAqIEByZXR1cm4gVGhlIDxjb2RlPkdlbmVyYXRvcjwvY29kZT4gd2hpY2ggc2hvdWxkIG5ldmVyIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJvdGVjdGVkIGZpbmFsIFQgcmV0cmlldmVHZW5lcmF0b3IoKSB7Ci0JCVQgZ2VuZXJhdG9yID0gZ2V0U3ViamVjdCgpOwotCi0JCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJZ2VuZXJhdG9yID0gdGhpcy5idWlsZEdlbmVyYXRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGdlbmVyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEdlbmVyYXRvck5hbWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvci5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHRoaXMuc3ViamVjdCAhPSBudWxsKSB7Ci0JCQkJCXNldFZhbHVlXyh2YWx1ZSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBbGxvY2F0aW9uU2l6ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IEludGVnZXJDb21ibzxHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkdlbmVyYXRvckNvbXBvc2l0ZV9hbGxvY2F0aW9uU2l6ZTsKLQkJCX0KLQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotCQkJCXJldHVybiBudWxsOy8vSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTEVOR1RIOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGREZWZhdWx0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8SW50ZWdlcj4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvci5TUEVDSUZJRURfQUxMT0NBVElPTl9TSVpFX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCX07CQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRJbml0aWFsVmFsdWVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88R2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcikgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5HZW5lcmF0b3JDb21wb3NpdGVfaW5pdGlhbFZhbHVlOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ly9KcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9MRU5HVEg7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yLCBJbnRlZ2VyPihnZXRTdWJqZWN0SG9sZGVyKCksIEdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIEludGVnZXIudmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvciwgSW50ZWdlcj4oZ2V0U3ViamVjdEhvbGRlcigpLCBHZW5lcmF0b3IuU1BFQ0lGSUVEX0lOSVRJQUxfVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShJbnRlZ2VyIHZhbHVlKSB7Ci0JCQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZSh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwkKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIEpQQSBwcm9qZWN0LgotCSAqCi0JICogQHJldHVybiBUaGUgSlBBIHByb2plY3Qgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHN1YmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIHRvIGxpc3RlbiB0byB0aGUgSUQgbWFwcGluZyB3aGVuIHRoZQotCSAqIGdlbmVyYXRvciBjaGFuZ2VzLgotCSAqCi0JICogQHJldHVybiBUaGUgcHJvcGVydHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGdlbmVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLQotCXB1YmxpYyBpbnRlcmZhY2UgR2VuZXJhdG9yQnVpbGRlcjxUPiB7Ci0JCS8qKgotCQkgKiBBZGQgYSBnZW5lcmF0b3IgdG8gdGhlIG1vZGVsIGFuZCByZXR1cm4gaXQKLQkJICovCi0JCVQgYWRkR2VuZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9JZENsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSWRDbGFzc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWM3OTQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9JZENsYXNzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNsYXNzQ2hvb3NlckNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRDbGFzc1JlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBJZCBjbGFzcyBoeXBlcmxpbmsgbGFiZWwsIGNvbWJvLCBhbmQgYnJvd3NlIGJ1dHRvbgotICoKLSAqLwotcHVibGljIGNsYXNzIElkQ2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIFBhbmU8SWRDbGFzc1JlZmVyZW5jZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPklkQ2xhc3NDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBJZENsYXNzQ29tcG9zaXRlKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZENsYXNzUmVmZXJlbmNlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIElkQ2xhc3NDb21wb3NpdGUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIElkQ2xhc3NSZWZlcmVuY2U+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotICAgICAgICAJYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGF1dG9tYXRpY2FsbHlBbGlnbldpZGdldHMpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkQ2xhc3NDaG9vc2VyQ29tYm9QYW5lKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgSWRDbGFzc0Nob29zZXJDb21ib1BhbmUKLQkJZXh0ZW5kcyBDbGFzc0Nob29zZXJDb21ib1BhbmU8SWRDbGFzc1JlZmVyZW5jZT4KLQl7Ci0JCXB1YmxpYyBJZENsYXNzQ2hvb3NlckNvbWJvUGFuZShQYW5lPElkQ2xhc3NSZWZlcmVuY2U+IHBhcmVudFBhbmUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JCX0KLQkJCi0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldElkQ2xhc3NOYW1lKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKGNsYXNzTmFtZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5JZENsYXNzQ29tcG9zaXRlX2xhYmVsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRJZENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJVHlwZSByZXNvbHZlSmR0VHlwZSgpIHsKLQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SWRDbGFzc0pkdFR5cGUoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZENsYXNzUmVmZXJlbmNlLCBTdHJpbmc+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIAotCQkJCQlJZENsYXNzUmVmZXJlbmNlLlNQRUNJRklFRF9JRF9DTEFTU19OQU1FX1BST1BFUlRZLAotCQkJCQlJZENsYXNzUmVmZXJlbmNlLkRFRkFVTFRfSURfQ0xBU1NfTkFNRV9QUk9QRVJUWSkgewotCQkJCQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpOwotCQkJCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gZGVmYXVsdFRleHQodGhpcy5zdWJqZWN0KSA6IHZhbHVlOwotCQkJCX0KLQkJCQkKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCWlmICh2YWx1ZSA9PSBudWxsIAotCQkJCQkJCXx8IHZhbHVlLmxlbmd0aCgpID09IDAgCi0JCQkJCQkJfHwgdmFsdWUuZXF1YWxzKGRlZmF1bHRUZXh0KHRoaXMuc3ViamVjdCkpKSB7Ci0JCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKHZhbHVlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRUZXh0KElkQ2xhc3NSZWZlcmVuY2UgaWRDbGFzc1JlZmVyZW5jZSkgewotCQkJU3RyaW5nIGRlZmF1bHRDbGFzc05hbWUgPSBpZENsYXNzUmVmZXJlbmNlLmdldERlZmF1bHRJZENsYXNzTmFtZSgpOwotCQkJcmV0dXJuIChkZWZhdWx0Q2xhc3NOYW1lID09IG51bGwpID8KLQkJCQkJSnB0Q29tbW9uVWlNZXNzYWdlcy5Ob25lU2VsZWN0ZWQKLQkJCQkJOiBOTFMuYmluZChKcHRDb21tb25VaU1lc3NhZ2VzLkRlZmF1bHRXaXRoT25lUGFyYW0sIGRlZmF1bHRDbGFzc05hbWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4oCi0JCQkJbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZENsYXNzUmVmZXJlbmNlLCBTdHJpbmc+KAotCQkJCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBJZENsYXNzUmVmZXJlbmNlLkRFRkFVTFRfSURfQ0xBU1NfTkFNRV9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBkZWZhdWx0VGV4dCh0aGlzLnN1YmplY3QpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxN2FkYWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0lkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBJZE1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPElkTWFwcGluZz4KLXsKLQlwdWJsaWMgSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWU0YjQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9JZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkdlbmVyYXRvckNvbXBvc2l0ZS5HZW5lcmF0b3JCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmVsIGlzIHBhcnRpYWxseSBhIGNvcHkgb2YgdGhlIEdlbmVyYXRpb25Db21wb3NpdGUgcGFuZWwuIFRoZSBkaWZmZXJlbmNlCi0gKiBpcyB0aGF0IHRoaXMgcGFuZWwgaW5jbHVkZXMgdGhlIEdlbmVyYXRlZCBWYWx1ZSBjb21wb3NpdGUuICBXaGVuIGEgdGFibGUKLSAqIG9yIHNlcXVlbmNlIGdlbmVyYXRvciBpcyBhZGRlZCwgd2Ugc2V0IHRoZSAibmFtZSIgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIAotICogZ2VuZXJhdGVkIHZhbHVlICJnZW5lcmF0b3IiIGlmIGl0IGFscmVhZHkgZXhpc3RzCi0gKiAKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgdiBQcmltYXJ5IEtleSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIHggUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB2IFRhYmxlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgeCBUYWJsZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB2IFNlcXVlbmNlIEdlbmVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgeCBTZXF1ZW5jZSBHZW5lcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgfCBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZQotICogQHNlZSBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZQotICogQHNlZSBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZQotICogQHNlZSBJZE1hcHBpbmdDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SWRNYXBwaW5nPgotewotCi0JLy9UaGVzZSBhcmUgYnVpbHQgdG8gc3RhbmQgYWxvbmUgYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0aGUgcGFuZWxzIHRvIGNvbGxhcHNlIGp1c3QKLQkvL2JlY2F1c2UgdGhlIGdlbmVyYXRvciBpcyByZW1vdmVkIGVpdGhlciBpbiB0aGUgc291cmNlIG9yIHVzaW5nIHRoZSBjaGVjayBib3ggaW4gdGhlIFVJLiAgCi0JLy9XZSBkb24ndCB3YW50IHRoZXNlIHRvIGJlIGJ1aWx0IG9uIHRoZSBtb2RlbCBnZW5lcmF0b3IgcHJvcGVydGllcy4KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXI7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB0YWJsZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkdlbmVyYXRpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIElkTWFwcGluZ0dlbmVyYXRpb25Db21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgSWRNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpOwotCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIgICAgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvckV4cGFuc2lvblN0YXRlSG9sZGVyLnNldFZhbHVlKEJvb2xlYW4udmFsdWVPZihnZXRTdWJqZWN0KCkgIT0gbnVsbCAmJiBnZXRTdWJqZWN0KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKSk7Ci0JCXRoaXMudGFibGVHZW5lcmF0b3JFeHBhbnNpb25TdGF0ZUhvbGRlciAgIC5zZXRWYWx1ZShCb29sZWFuLnZhbHVlT2YoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFByaW1hcnkgS2V5IEdlbmVyYXRpb24gc2VjdGlvbgotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfcHJpbWFyeUtleUdlbmVyYXRpb25TZWN0aW9uLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgR2VuZXJhdGlvbiBjaGVjayBib3gKLQkJQnV0dG9uIHByaW1hcnlLZXlHZW5lcmF0aW9uQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94LAotCQkJYnVpbGRQcmltYXJ5S2V5R2VuZXJhdGlvbkhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19QUklNQVJZX0tFWV9HRU5FUkFUSU9OCi0JCSk7Ci0KLQkJLy8gR2VuZXJhdGVkIFZhbHVlIHdpZGdldHMKLQkJR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGUgPSBuZXcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJY29udGFpbmVyCi0JCSk7Ci0KLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IEdyaWREYXRhLkZJTEw7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsSW5kZW50ICAgICAgICAgID0gcHJpbWFyeUtleUdlbmVyYXRpb25DaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTY7Ci0KLQkJZ2VuZXJhdGVkVmFsdWVDb21wb3NpdGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlciA9IGJ1aWxkR2VuZXJhdG9yQ29udGFpbmVyKCk7Ci0JCS8vIFRhYmxlIEdlbmVyYXRvciBwYW5lCi0JCWluaXRpYWxpemVUYWJsZUdlbmVyYXRvclBhbmUoYWRkU3ViUGFuZShjb250YWluZXIsIDEwKSwgZ2VuZXJhdG9ySG9sZGVyKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQotCQlpbml0aWFsaXplU2VxdWVuY2VHZW5lcmF0b3JQYW5lKGFkZFN1YlBhbmUoY29udGFpbmVyLCAxMCksIGdlbmVyYXRvckhvbGRlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFByaW1hcnlLZXlHZW5lcmF0aW9uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZE1hcHBpbmcsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgSWRNYXBwaW5nLkdFTkVSQVRFRF9WQUxVRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpID09IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0ZWRWYWx1ZSgpICE9IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVHZW5lcmF0ZWRWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBidWlsZEdlbmVyYXRvckNvbnRhaW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SWRNYXBwaW5nLCBHZW5lcmF0b3JDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgR2VuZXJhdG9yQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVTZXF1ZW5jZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHN1Yi1zZWN0aW9uCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvclNlY3Rpb24sCi0JCQl0aGlzLnNlcXVlbmNlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKLQkJKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgY2hlY2sgYm94Ci0JCUJ1dHRvbiBzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5JZE1hcHBpbmdDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JDaGVja0JveCwKLQkJCWJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCb29sZWFuSG9sZGVyKGdlbmVyYXRvckhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUgotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciBwYW5lCi0JCXRoaXMuYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwgCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyKGdlbmVyYXRvckhvbGRlciksCi0JCQlidWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcihnZW5lcmF0b3JIb2xkZXIpLAotCQkJMCwgCi0JCQlzZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94LmdldEJvcmRlcldpZHRoKCkgKyAxNik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhdG9yQ29udGFpbmVyPiBnZW5lcmF0b3JIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhdG9yQ29udGFpbmVyLCBCb29sZWFuPihnZW5lcmF0b3JIb2xkZXIsIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSAhPSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCi0JCQkJaWYgKHZhbHVlLmJvb2xlYW5WYWx1ZSgpICYmICh0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSA9PSBudWxsKSkgewotCi0JCQkJCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gdGhpcy5zdWJqZWN0LmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQkJCUdlbmVyYXRlZFZhbHVlIGdlbmVyYXRlZFZhbHVlID0gZ2V0U3ViamVjdCgpLmdldEdlbmVyYXRlZFZhbHVlKCk7Ci0KLQkJCQkJaWYgKChnZW5lcmF0ZWRWYWx1ZSAhPSBudWxsKSAmJgotCQkJCQkgICAgKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpICE9IG51bGwpKQotCQkJCQl7Ci0JCQkJCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXROYW1lKGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICghdmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpICE9IG51bGwpKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQlDb21wb3NpdGUgY29udGFpbmVyLCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxTZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCi0JCQlHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBnZW5lcmF0b3JCdWlsZGVyLAotCQkJaW50IHRvcE1hcmdpbiwKLQkJCWludCBsZWZ0TWFyZ2luKSB7Ci0KLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciwKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCi0JCQlnZW5lcmF0b3JCdWlsZGVyCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgU2VxdWVuY2VHZW5lcmF0b3I+KGdlbmVyYXRvckhvbGRlciwgR2VuZXJhdG9yQ29udGFpbmVyLlNFUVVFTkNFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2VxdWVuY2VHZW5lcmF0b3IgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIEdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyKGZpbmFsIFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgewotCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+KCkgewotCQkJcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yIGFkZEdlbmVyYXRvcigpIHsKLQkJCQlyZXR1cm4gZ2VuZXJhdG9ySG9sZGVyLmdldFZhbHVlKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYWJsZUdlbmVyYXRvclBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7Ci0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHN1Yi1zZWN0aW9uCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU3ViU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLklkTWFwcGluZ0NvbXBvc2l0ZV90YWJsZUdlbmVyYXRvclNlY3Rpb24sCi0JCQl0aGlzLnRhYmxlR2VuZXJhdG9yRXhwYW5zaW9uU3RhdGVIb2xkZXIKLQkJKTsKLQotCQlCdXR0b24gdGFibGVHZW5lcmF0b3JDaGVja0JveCA9IGFkZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSWRNYXBwaW5nQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yQ2hlY2tCb3gsCi0JCQlidWlsZFRhYmxlR2VuZXJhdG9yQm9vbGVhbkhvbGRlcihnZW5lcmF0b3JIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1IKLQkJKTsKLQotCQkvLyBTZXF1ZW5jZSBHZW5lcmF0b3IgcGFuZQotCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQljb250YWluZXIsIAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvckhvbGRlcihnZW5lcmF0b3JIb2xkZXIpLAotCQkJYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoZ2VuZXJhdG9ySG9sZGVyKSwKLQkJCTAsIAotCQkJdGFibGVHZW5lcmF0b3JDaGVja0JveC5nZXRCb3JkZXJXaWR0aCgpICsgMTYpOwotCX0JCi0JCi0JcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlIGJ1aWxkVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQlDb21wb3NpdGUgY29udGFpbmVyLCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JIb2xkZXIsCi0JCQlHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPiBnZW5lcmF0b3JCdWlsZGVyLAotCQkJaW50IHRvcE1hcmdpbiwKLQkJCWludCBsZWZ0TWFyZ2luKSB7Ci0KLQkJcmV0dXJuIG5ldyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0YWJsZUdlbmVyYXRvckhvbGRlciwKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCi0JCQlnZW5lcmF0b3JCdWlsZGVyCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYXRvckNvbnRhaW5lciwgVGFibGVHZW5lcmF0b3I+KGdlbmVyYXRvckhvbGRlciwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGVHZW5lcmF0b3IgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4gYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9ySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJhdG9yQnVpbGRlcjxUYWJsZUdlbmVyYXRvcj4oKSB7Ci0JCQlwdWJsaWMgVGFibGVHZW5lcmF0b3IgYWRkR2VuZXJhdG9yKCkgewotCQkJCXJldHVybiBnZW5lcmF0b3JIb2xkZXIuZ2V0VmFsdWUoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQkJfQotCQl9OwotCX0KLQotIAlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGFibGVHZW5lcmF0b3JCb29sZWFuSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxHZW5lcmF0b3JDb250YWluZXI+IGdlbmVyYXRvckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxHZW5lcmF0b3JDb250YWluZXIsIEJvb2xlYW4+KGdlbmVyYXRvckhvbGRlciwgR2VuZXJhdG9yQ29udGFpbmVyLlRBQkxFX0dFTkVSQVRPUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpICE9IG51bGwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0KLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkgJiYgKHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcigpID09IG51bGwpKSB7Ci0KLQkJCQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSB0aGlzLnN1YmplY3QuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJCQkJR2VuZXJhdGVkVmFsdWUgZ2VuZXJhdGVkVmFsdWUgPSBnZXRTdWJqZWN0KCkuZ2V0R2VuZXJhdGVkVmFsdWUoKTsKLQotCQkJCQlpZiAoKGdlbmVyYXRlZFZhbHVlICE9IG51bGwpICYmCi0JCQkJCSAgICAoZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkgIT0gbnVsbCkpCi0JCQkJCXsKLQkJCQkJCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCF2YWx1ZS5ib29sZWFuVmFsdWUoKSAmJiAodGhpcy5zdWJqZWN0LmdldFRhYmxlR2VuZXJhdG9yKCkgIT0gbnVsbCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjU5MjQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKgotICogQHNlZSBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QKLSAqIEBzZWUgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2c8SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gam9pblRhYmxlIFRoZSBvd25lciBvZiB0aGUgam9pbiBjb2x1bW4gdG8gY3JlYXRlIG9yIHdoZXJlIGl0IGlzCi0JICogbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIEVpdGhlciB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoaXMgc3RhdGUgb2JqZWN0IGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkT25seUpvaW5UYWJsZSBqb2luVGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIGpvaW5UYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkRpYWxvZ1BhbmU8SW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCWNvbnRhaW5lcgotCQkpCi0JCQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCgKLQkJCWdldE93bmVyKCksCi0JCQlnZXRKb2luQ29sdW1uKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSm9pblRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEpvaW5UYWJsZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0ludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjhkMjg4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9JbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuU2luZ2xlRWxlbWVudExpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi0vKioKLSAqIFRoZSBzdGF0ZSBvYmplY3QgdXNlZCB0byBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW4gY29sdW1uIG9uIGEgam9pbgotICogdGFibGUuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5UYWJsZQotICogQHNlZSBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3QgCi0JZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBqb2luVGFibGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0KAotCQkJSm9pblRhYmxlIGpvaW5UYWJsZSwKLQkgICAgICAgIEpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihqb2luVGFibGUsIGpvaW5Db2x1bW4pOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pblRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKEpvaW5UYWJsZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBSZWxhdGlvbnNoaXBNYXBwaW5nIGdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcE1hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlSZWxhdGlvbnNoaXBNYXBwaW5nIHJlbGF0aW9uc2hpcE1hcHBpbmcgPSBnZXRSZWxhdGlvbnNoaXBNYXBwaW5nKCk7Ci0JCWlmIChyZWxhdGlvbnNoaXBNYXBwaW5nID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUVudGl0eSB0YXJnZXRFbnRpdHkgPSByZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCk7Ci0JCWlmICh0YXJnZXRFbnRpdHkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRhcmdldEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxMDliZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiB0aGUgZGlhbG9nIHVzZWQgdG8gZWRpdCBhbiA8Y29kZT5JSm9pbkNvbHVtbjwvY29kZT4uCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotICogQHNlZSBKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSm9pbkNvbHVtbkRpYWxvZzxUIGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0PgotCWV4dGVuZHMgQmFzZUpvaW5Db2x1bW5EaWFsb2c8VD4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QWJzdHJhY3RKb2luQ29sdW1uRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBvd25lciBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdCBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5EaWFsb2coU2hlbGwgcGFyZW50LCBPYmplY3Qgb3duZXIsIFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHBhcmVudCwgb3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEaWFsb2dQYW5lPD8+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uRGlhbG9nUGFuZTxUPihnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlYWRPbmx5Sm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKFJlYWRPbmx5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkRpYWxvZ1BhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmQ2MTk5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uRGlhbG9nUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggSW5zZXJ0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBOdWxsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB4IFVuaXF1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggVXBkYXRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBKb2luQ29sdW1uU3RhdGVPYmplY3QKLSAqIEBzZWUgSm9pbkNvbHVtbkRpYWxvZyAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uRGlhbG9nUGFuZTxUIGV4dGVuZHMgSm9pbkNvbHVtblN0YXRlT2JqZWN0PiBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxUPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkRpYWxvZ1BhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKb2luQ29sdW1uRGlhbG9nUGFuZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpCi0JewotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEpvaW5Db2x1bW5TdGF0ZU9iamVjdC5JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0SW5zZXJ0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEluc2VydGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0SW5zZXJ0YWJsZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0SW5zZXJ0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlKb2luQ29sdW1uU3RhdGVPYmplY3QuSU5TRVJUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldEluc2VydGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROdWxsYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlKb2luQ29sdW1uU3RhdGVPYmplY3QuTlVMTEFCTEVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROdWxsYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE51bGxhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTnVsbGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdE51bGxhYmxlSG9sZGVyKCkpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV9udWxsYWJsZVdpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0TnVsbGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0Lk5VTExBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0TnVsbGFibGUoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVW5pcXVlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUpvaW5Db2x1bW5TdGF0ZU9iamVjdC5VTklRVUVfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVbmlxdWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRVbmlxdWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVbmlxdWVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVbmlxdWVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VuaXF1ZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRVbmlxdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0LlVOSVFVRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFVuaXF1ZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEpvaW5Db2x1bW5TdGF0ZU9iamVjdC5VUERBVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVcGRhdGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRVcGRhdGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVcGRhdGFibGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uRGlhbG9nUGFuZV91cGRhdGFibGVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRVcGRhdGFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJSm9pbkNvbHVtblN0YXRlT2JqZWN0LlVQREFUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFVwZGF0YWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KGNvbnRhaW5lcik7Ci0KLQkJLy8gSW5zZXJ0YWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX2luc2VydGFibGUsCi0JCQlidWlsZEluc2VydGFibGVIb2xkZXIoKSwKLQkJCWJ1aWxkSW5zZXJ0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fSU5TRVJUQUJMRQotCQkpOwotCi0JCS8vIFVwZGF0YWJsZSB0cmktc3RhdGUgY2hlY2sgYm94Ci0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZSwKLQkJCWJ1aWxkVXBkYXRhYmxlSG9sZGVyKCksCi0JCQlidWlsZFVwZGF0YWJsZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVVBEQVRBQkxFCi0JCSk7Ci0KLQkJLy8gVW5pcXVlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZSwKLQkJCWJ1aWxkVW5pcXVlSG9sZGVyKCksCi0JCQlidWlsZFVuaXF1ZVN0cmluZ0hvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fVU5JUVVFCi0JCSk7Ci0KLQkJLy8gTnVsbGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGUsCi0JCQlidWlsZE51bGxhYmxlSG9sZGVyKCksCi0JCQlidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9OVUxMQUJMRQotCQkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRkNmZkOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHVzZWQgdG8gZWl0aGVyIGNyZWF0ZSBvciBlZGl0IGEgam9pbmcgY29sdW1uIHRoYXQgaXMgbG9jYXRlZAotICogb24gYSByZWxhdGlvbmFsIG1hcHBpbmcuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotICogQHNlZSBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdAotICogQHNlZSBKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nIAotCWV4dGVuZHMgSm9pbkNvbHVtbkRpYWxvZzxKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdD4gCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5BYnN0cmFjdEpvaW5Db2x1bW5EaWFsb2c8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IHNoZWxsCi0JICogQHBhcmFtIHJlbGF0aW9uc2hpcE1hcHBpbmcgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIHRvCi0JICogY3JlYXRlCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcwotCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCUpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZygKLQkJU2hlbGwgcGFyZW50LAotCSAgICBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1uT3duZXIsCi0JICAgIFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCBqb2luQ29sdW1uT3duZXIsIGpvaW5Db2x1bW4pOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdCBidWlsZFN0YXRlT2JqZWN0KCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0KAotCQkJZ2V0T3duZXIoKSwKLQkJCWdldEpvaW5Db2x1bW4oKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBzdXBlci5nZXRPd25lcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY3NDVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBvbiBhCi0gKiByZWxhdGlvbnNoaXAgbWFwcGluZy4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0gKiBAc2VlIEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5U3RhdGVPYmplY3QgCi0JZXh0ZW5kcyBKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBqb2luaW5nU3RyYXRlZ3kgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGlzIGlzCi0JICogdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0KAotCQkJUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5LAotCQkgICAgUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJc3VwZXIoam9pbmluZ1N0cmF0ZWd5LCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IGdldERiU2NoZW1hKCk7Ci0JCXJldHVybiBzY2hlbWEgPT0gbnVsbCA/IHN1cGVyLnRhYmxlcygpIDogQ29sbGVjdGlvblRvb2xzLmxpc3Qoc2NoZW1hLmdldFNvcnRlZFRhYmxlSWRlbnRpZmllcnMoKSkubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7Ci0JCXJldHVybiB0eXBlTWFwcGluZyA9PSBudWxsID8gbnVsbCA6IHR5cGVNYXBwaW5nLmdldERiU2NoZW1hKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFR5cGVNYXBwaW5nIGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBUeXBlTWFwcGluZyBnZXRSZWxhdGlvbnNoaXBUYXJnZXQoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFJlbGF0aW9uc2hpcFRhcmdldCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZSgpIHsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpOwotCQl9Ci0JCVR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nID0gZ2V0UmVsYXRpb25zaGlwU291cmNlKCk7CQkKLQkJcmV0dXJuIHR5cGVNYXBwaW5nID09IG51bGwgPyBudWxsIDogdHlwZU1hcHBpbmcuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IGdldFJlbGF0aW9uc2hpcFNvdXJjZSgpOwotCQlyZXR1cm4gdHlwZU1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiB0eXBlTWFwcGluZy5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0UmVmZXJlbmNlZE5hbWVUYWJsZSgpIHsKLQkJVHlwZU1hcHBpbmcgcmVsYXRpb25zaGlwVGFyZ2V0ID0gZ2V0UmVsYXRpb25zaGlwVGFyZ2V0KCk7Ci0JCXJldHVybiByZWxhdGlvbnNoaXBUYXJnZXQgPT0gbnVsbCA/IG51bGwgOiByZWxhdGlvbnNoaXBUYXJnZXQuZ2V0UHJpbWFyeURiVGFibGUoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MWI1ZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkRpYWxvZ1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIFRoaXMgZGlhbG9nIGlzIHVzZWQgdG8gZWl0aGVyIGNyZWF0ZSBvciBlZGl0IGEgam9pbiBjb2x1bW4gdGhhdCBpcyBsb2NhdGVkCi0gKiBvbiBhIGpvaW4gdGFibGUuCi0gKgotICogQHNlZSBKb2luQ29sdW1uCi0gKiBAc2VlIEpvaW5UYWJsZQotICogQHNlZSBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZVN0YXRlT2JqZWN0Ci0gKiBAc2VlIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2cgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZVN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBqb2luVGFibGUgVGhlIHBhcmVudCBvZiB0aGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciB0byBjcmVhdGUKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBFaXRoZXIgdGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGlzIHN0YXRlIG9iamVjdCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2coU2hlbGwgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE9ubHlSZWZlcmVuY2VUYWJsZSByZWZlcmVuY2VUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIocGFyZW50LCByZWZlcmVuY2VUYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8Sm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5EaWFsb2dQYW5lPEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3Q+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZVN0YXRlT2JqZWN0IGJ1aWxkU3RhdGVPYmplY3QoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdCgKLQkJCWdldE93bmVyKCksCi0JCQlnZXRKb2luQ29sdW1uKCkKLQkJKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUmVmZXJlbmNlVGFibGUgZ2V0T3duZXIoKSB7Ci0JCXJldHVybiAoUmVmZXJlbmNlVGFibGUpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZVN0YXRlT2JqZWN0LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2JkYjYyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBvbiBhCi0gKiBqb2ludCB0YWJsZS4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW4KLSAqIEBzZWUgSm9pblRhYmxlCi0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uRGlhbG9nCi0gKiBAc2VlIEludmVyc2VKb2luQ29sdW1uRGlhbG9nUGFuZQotICogQHNlZSBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdCAKLQlleHRlbmRzIEpvaW5Db2x1bW5TdGF0ZU9iamVjdAotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbkluSm9pblRhYmxlU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIGpvaW5UYWJsZSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB0byBlZGl0Ci0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVTdGF0ZU9iamVjdCgKLQkJCVJlZmVyZW5jZVRhYmxlIHJlZmVyZW5jZVRhYmxlLAotCSAgICAgICAgSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKHJlZmVyZW5jZVRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFJlZmVyZW5jZVRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKFJlZmVyZW5jZVRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQkKLQlwcml2YXRlIFR5cGVNYXBwaW5nIGdldFR5cGVNYXBwaW5nKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0T3duaW5nVHlwZU1hcHBpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVGFibGUgZ2V0TmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXREYlRhYmxlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXRSZWZlcmVuY2VkTmFtZVRhYmxlKCkgewotCQlyZXR1cm4gZ2V0VHlwZU1hcHBpbmcoKS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluaXRpYWxUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0TmFtZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1RhYmxlRWRpdGFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWJmYTZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgbyBKb2luIGNvbHVtbnMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSm9pbkNvbHVtblJlbGF0aW9uc2hpcAotICogQHNlZSBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotICogQHNlZSBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUKLSAqIEBzZWUgTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUKLQlleHRlbmRzIEFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZQotCQk8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwLCBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneT4KLXsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3g7Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KAotCQlQYW5lPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA+IHBhcmVudFBhbmUsIAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUocGFyZW50UGFuZSwgcGFyZW50LCB0cnVlKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZSBidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aG91dEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KAotCQlQYW5lPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA+IHBhcmVudFBhbmUsIAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCgKLQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcD4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgdHJ1ZSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUgYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhvdXRJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCgKLQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcD4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQkKLQkKLQlwcml2YXRlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwPiBwYXJlbnRQYW5lLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBib29sZWFuIGluY2x1ZGVPdmVycmlkZUNoZWNrQm94KSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JCXRoaXMuaW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3ggPSBpbmNsdWRlT3ZlcnJpZGVDaGVja0JveDsKLQkJaW5pdGlhbGl6ZUxheW91dDIoZ2V0Q29udHJvbCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlib29sZWFuIGluY2x1ZGVPdmVycmlkZUNoZWNrQm94KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCQl0aGlzLmluY2x1ZGVPdmVycmlkZUNoZWNrQm94ID0gaW5jbHVkZU92ZXJyaWRlQ2hlY2tCb3g7Ci0JCWluaXRpYWxpemVMYXlvdXQyKGdldENvbnRyb2woKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vc2VlIGluaXRpYWxpemVMYXlvdXQyCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dDIoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KGNvbnRhaW5lcik7IAotCQkvL2p1c3QgY2FsbCBzdXBlciwgd2UgYXJlIGRlbGF5aW5nIHRoZSBpbml0aWFsaXplTGF5b3V0IGJlY2F1c2Ugb2YgdGhlIGluY2x1ZGVPdmVycmlkZUNoZWNrQm94IGJvb2xlYW4KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5PiBqb2luaW5nU3RyYXRlZ3lIb2xkZXIgPSB0aGlzLmJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcigpOwotCi0JCXJldHVybiB0aGlzLmluY2x1ZGVPdmVycmlkZUNoZWNrQm94ID8KLQkJCQluZXcgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNXaXRoT3ZlcnJpZGVPcHRpb25Db21wb3NpdGUodGhpcywgam9pbmluZ1N0cmF0ZWd5SG9sZGVyLCBwYXJlbnQpLmdldENvbnRyb2woKSA6Ci0JCQkJbmV3IEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMsIGpvaW5pbmdTdHJhdGVneUhvbGRlciwgcGFyZW50KS5nZXRDb250cm9sKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc1N0cmF0ZWd5SG9sZGVyKCkgewotCQlyZXR1cm4gYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k+IGJ1aWxkSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKLQkJCQk8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwLCBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneT4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc0pvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwLCBCb29sZWFuPigKLQkJCQlzdWJqZWN0SG9sZGVyLCBSZWFkT25seVJlbGF0aW9uc2hpcC5TVFJBVEVHWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5idWlsZEJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRCb29sZWFuVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgJiYgdGhpcy5zdWJqZWN0LnN0cmF0ZWd5SXNKb2luQ29sdW1uKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdGhpcy5zdWJqZWN0KS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQkJCX0KLQkJCQkvL3ZhbHVlID09IEZBTFNFIC0gc2VsZWN0aW9uIG9mIGFub3RoZXIgcmFkaW8gYnV0dG9uIGNhdXNlcyB0aGlzIHN0cmF0ZWd5IHRvIGdldCB1bnNldAotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYyN2E0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5FbXB0eUxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gZWRpdCBhIDxjb2RlPkpvaW5Db2x1bW48L2NvZGU+LgotICoKLSAqIEBzZWUgSm9pbkNvbHVtbgotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBKb2luQ29sdW1uU3RhdGVPYmplY3QKLQlleHRlbmRzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQlwcml2YXRlIEJvb2xlYW4gaW5zZXJ0YWJsZTsKLQlwcml2YXRlIEJvb2xlYW4gbnVsbGFibGU7Ci0JcHJpdmF0ZSBCb29sZWFuIHVuaXF1ZTsKLQlwcml2YXRlIEJvb2xlYW4gdXBkYXRhYmxlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUQUJMRV9QUk9QRVJUWSA9ICJpbnNlcnRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVUxMQUJMRV9QUk9QRVJUWSA9ICJudWxsYWJsZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5JUVVFX1BST1BFUlRZID0gInVuaXF1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBEQVRBQkxFX1BST1BFUlRZID0gInVwZGF0YWJsZSI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5TdGF0ZU9iamVjdDwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gb3duZXIgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMgbG9jYXRlZAotCSAqIEBwYXJhbSBqb2luQ29sdW1uIFRoZSBqb2luIGNvbHVtbiB0byBlZGl0Ci0JICovCi0JcHVibGljIEpvaW5Db2x1bW5TdGF0ZU9iamVjdChPYmplY3Qgb3duZXIsIFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXN1cGVyKG93bmVyLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRJbnNlcnRhYmxlKCkgewotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGdldEpvaW5Db2x1bW4oKTsKLQotCQlpZiAoam9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gam9pbkNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCk7Ci0JCX0KLQotCQlyZXR1cm4gUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHROdWxsYWJsZSgpIHsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJcmV0dXJuIGpvaW5Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKTsKLQkJfQotCi0JCXJldHVybiBSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRVbmlxdWUoKSB7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2luQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VOSVFVRTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRVcGRhdGFibGUoKSB7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gZ2V0Sm9pbkNvbHVtbigpOwotCi0JCWlmIChqb2luQ29sdW1uICE9IG51bGwpIHsKLQkJCXJldHVybiBqb2luQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpOwotCQl9Ci0KLQkJcmV0dXJuIFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRJbnNlcnRhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5pbnNlcnRhYmxlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoSm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCXB1YmxpYyBCb29sZWFuIGdldE51bGxhYmxlKCkgewotCQlyZXR1cm4gdGhpcy5udWxsYWJsZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRVbmlxdWUoKSB7Ci0JCXJldHVybiB0aGlzLnVuaXF1ZTsKLQl9Ci0KLQlwdWJsaWMgQm9vbGVhbiBnZXRVcGRhdGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0YWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKE9iamVjdCBvd25lciwgUmVhZE9ubHlCYXNlSm9pbkNvbHVtbiBiYXNlSm9pbkNvbHVtbikgewotCi0JCXN1cGVyLmluaXRpYWxpemUob3duZXIsIGJhc2VKb2luQ29sdW1uKTsKLQotCQlpZiAoYmFzZUpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoUmVhZE9ubHlKb2luQ29sdW1uKSBiYXNlSm9pbkNvbHVtbjsKLQotCQkJdGhpcy5pbnNlcnRhYmxlICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCk7Ci0JCQl0aGlzLm51bGxhYmxlICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JCQl0aGlzLnVuaXF1ZSAgICAgICAgICAgPSBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpOwotCQkJdGhpcy51cGRhdGFibGUgICAgICAgID0gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgewotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBnZXRKb2luQ29sdW1uKCk7Ci0KLQkJaWYgKGpvaW5Db2x1bW4gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFibGVFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zZXJ0YWJsZShCb29sZWFuIGluc2VydGFibGUpIHsKLQkJQm9vbGVhbiBvbGRJbnNlcnRhYmxlID0gdGhpcy5pbnNlcnRhYmxlOwotCQl0aGlzLmluc2VydGFibGUgPSBpbnNlcnRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKElOU0VSVEFCTEVfUFJPUEVSVFksIG9sZEluc2VydGFibGUsIGluc2VydGFibGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE51bGxhYmxlKEJvb2xlYW4gbnVsbGFibGUpIHsKLQkJQm9vbGVhbiBvbGROdWxsYWJsZSA9IHRoaXMubnVsbGFibGU7Ci0JCXRoaXMubnVsbGFibGUgPSBudWxsYWJsZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChOVUxMQUJMRV9QUk9QRVJUWSwgb2xkTnVsbGFibGUsIG51bGxhYmxlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmlxdWUoQm9vbGVhbiB1bmlxdWUpIHsKLQkJQm9vbGVhbiBvbGRVbmlxdWUgPSB0aGlzLnVuaXF1ZTsKLQkJdGhpcy51bmlxdWUgPSB1bmlxdWU7Ci0JCWZpcmVQcm9wZXJ0eUNoYW5nZWQoVU5JUVVFX1BST1BFUlRZLCBvbGRVbmlxdWUsIHVuaXF1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRhYmxlKEJvb2xlYW4gdXBkYXRhYmxlKSB7Ci0JCUJvb2xlYW4gb2xkVXBkYXRhYmxlID0gdGhpcy51cGRhdGFibGU7Ci0JCXRoaXMudXBkYXRhYmxlID0gdXBkYXRhYmxlOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFVQREFUQUJMRV9QUk9QRVJUWSwgb2xkVXBkYXRhYmxlLCB1cGRhdGFibGUpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiB0YWJsZXMoKSB7Ci0JCXJldHVybiBFbXB0eUxpc3RJdGVyYXRvci5pbnN0YW5jZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHVwZGF0ZUpvaW5Db2x1bW4oQmFzZUpvaW5Db2x1bW4gYWJzdHJhY3RKb2luQ29sdW1uKSB7Ci0KLQkJc3VwZXIudXBkYXRlSm9pbkNvbHVtbihhYnN0cmFjdEpvaW5Db2x1bW4pOwotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBhYnN0cmFjdEpvaW5Db2x1bW47Ci0KLQkJLy8gVGFibGUKLQkJaWYgKGlzVGFibGVFZGl0YWJsZSgpKSB7Ci0JCQlTdHJpbmcgdGFibGUgPSBnZXRUYWJsZSgpOwotCi0JCQlpZiAodmFsdWVzQXJlRGlmZmVyZW50KHRhYmxlLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpKSB7Ci0JCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSh0YWJsZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBJbnNlcnRhYmxlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSAhPSB0aGlzLmluc2VydGFibGUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKHRoaXMuaW5zZXJ0YWJsZSk7Ci0JCX0KLQotCQkvLyBVcGRhdGFibGUKLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkgIT0gdGhpcy51cGRhdGFibGUpewotCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUodGhpcy51cGRhdGFibGUpOwotCQl9Ci0KLQkJLy8gVW5pcXVlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpICE9IHRoaXMudW5pcXVlKXsKLQkJCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKHRoaXMudW5pcXVlKTsKLQkJfQotCi0JCS8vIE51bGxhYmxlCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gdGhpcy5udWxsYWJsZSl7Ci0JCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKHRoaXMubnVsbGFibGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NWUwZDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWJzdHJhY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUJhc2VKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgSm9pblRhYmxlQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbnNDb21wb3NpdGU8VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgUGFuZTxUPgotewotCS8qKgotCSAqIFRoZSBlZGl0b3IgdXNlZCB0byBwZXJmb3JtIHRoZSBjb21tb24gYmVoYXZpb3JzIGRlZmluZWQgaW4gdGhlIGxpc3QgcGFuZS4KLQkgKi8KLQlKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvcjsKLQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8VD4gbGlzdFBhbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5Db2x1bW5zQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gam9pbkNvbHVtbnNFZGl0b3IgVGhlIGVkaXRvciB1c2VkIHRvIHBlcmZvcm0gdGhlIGNvbW1vbiBiZWhhdmlvcnMKLQkgKiBkZWZpbmVkIGluIHRoZSBsaXN0IHBhbmUKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbnNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbkNvbHVtbnNFZGl0b3I8VD4gam9pbkNvbHVtbnNFZGl0b3IpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCQl0aGlzLmpvaW5Db2x1bW5zRWRpdG9yID0gam9pbkNvbHVtbnNFZGl0b3I7Ci0JCWluaXRpYWxpemVMYXlvdXQyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luQ29sdW1uc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRyb2xsZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIGpvaW5Db2x1bW5zRWRpdG9yIFRoZSBlZGl0b3IgdXNlZCB0byBwZXJmb3JtIHRoZSBjb21tb24gYmVoYXZpb3JzCi0JICogZGVmaW5lZCBpbiB0aGUgbGlzdCBwYW5lCi0JICovCi0JcHVibGljIEpvaW5Db2x1bW5zQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luQ29sdW1uc0VkaXRvcjxUPiBqb2luQ29sdW1uc0VkaXRvciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBhdXRvbWF0aWNhbGx5QWxpZ25XaWRnZXRzKTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRvciA9IGpvaW5Db2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Sm9pbkNvbHVtbnNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSm9pbkNvbHVtbnNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5Db2x1bW5zRWRpdG9yPFQ+IGpvaW5Db2x1bW5zRWRpdG9yKSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJdGhpcy5qb2luQ29sdW1uc0VkaXRvciA9IGpvaW5Db2x1bW5zRWRpdG9yOwotCQlpbml0aWFsaXplTGF5b3V0MigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvL3NlZSBpbnRpYWlsaXplTGF5b3V0MigpCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVMYXlvdXQyKCkgewotCQl0aGlzLmxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFQ+KAotCQkJdGhpcywKLQkJCWdldENvbnRyb2woKSwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNBZGFwdGVyKCksCi0JCQlidWlsZEpvaW5Db2x1bW5zTGlzdE1vZGVsKCksCi0JCQlidWlsZFNlbGVjdGVkSm9pbkNvbHVtbkhvbGRlcigpLAotCQkJYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0pPSU5fVEFCTEVfQ09MVU1OUywKLQkJCWZhbHNlCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxKb2luQ29sdW1uPiBidWlsZFNlbGVjdGVkSm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Sm9pbkNvbHVtbj4oKTsKLQl9Ci0KLQlTdHJpbmcgYnVpbGRKb2luQ29sdW1uTGFiZWwoUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlpZiAoam9pbkNvbHVtbi5pc0RlZmF1bHQoKSkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpID09IG51bGwpIHsKLQotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtc0JvdGhEZWZhdWx0LAotCQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkJKTsKLQkJCX0KLQotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0LAotCQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJKTsKLQkJfQotCi0JCWlmIChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luQ29sdW1uc0NvbXBvc2l0ZV9tYXBwaW5nQmV0d2VlblR3b1BhcmFtcywKLQkJCWpvaW5Db2x1bW4uZ2V0TmFtZSgpLAotCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkSm9pbkNvbHVtbnNBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5hZGRKb2luQ29sdW1uKGdldFN1YmplY3QoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5Db2x1bW5zQ29tcG9zaXRlX2VkaXQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uKSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZSgpOwotCQkJCUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuam9pbkNvbHVtbnNFZGl0b3IuZWRpdEpvaW5Db2x1bW4oZ2V0U3ViamVjdCgpLCBqb2luQ29sdW1uKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5yZW1vdmVKb2luQ29sdW1ucyhnZXRTdWJqZWN0KCksIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZEluZGljZXMoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxSZWFkT25seUpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbnNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFJlYWRPbmx5Sm9pbkNvbHVtbj4oYnVpbGRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSwKLQkJCVJlYWRPbmx5TmFtZWRDb2x1bW4uU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFksCi0JCQlSZWFkT25seU5hbWVkQ29sdW1uLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSwKLQkJCVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uU1BFQ0lGSUVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfUFJPUEVSVFksCi0JCQlSZWFkT25seUJhc2VKb2luQ29sdW1uLkRFRkFVTFRfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxSZWFkT25seUpvaW5Db2x1bW4+IGJ1aWxkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlqYXZhLnV0aWwuTGlzdDxMaXN0VmFsdWVNb2RlbDxSZWFkT25seUpvaW5Db2x1bW4+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxSZWFkT25seUpvaW5Db2x1bW4+PigpOwotCQlsaXN0LmFkZChidWlsZERlZmF1bHRKb2luQ29sdW1uTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWw8TGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlKb2luQ29sdW1uPiwgUmVhZE9ubHlKb2luQ29sdW1uPihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8VCwgUmVhZE9ubHlKb2luQ29sdW1uPihnZXRTdWJqZWN0SG9sZGVyKCksIHRoaXMuam9pbkNvbHVtbnNFZGl0b3IuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0UHJvcGVydHlOYW1lKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucyh0aGlzLnN1YmplY3QpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIEpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuam9pbkNvbHVtbnNFZGl0b3IuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UmVhZE9ubHlKb2luQ29sdW1uPihidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkpOwotCi0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBSZWFkT25seUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgdGhpcy5qb2luQ29sdW1uc0VkaXRvci5nZXREZWZhdWx0UHJvcGVydHlOYW1lKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFJlYWRPbmx5Sm9pbkNvbHVtbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gSm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5qb2luQ29sdW1uc0VkaXRvci5nZXREZWZhdWx0Sm9pbkNvbHVtbih0aGlzLnN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZEpvaW5Db2x1bW5zTGlzdExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoUmVhZE9ubHlKb2luQ29sdW1uKSBlbGVtZW50OwotCi0JCQkJcmV0dXJuIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKGpvaW5Db2x1bW4pOwotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBqb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihqb2luQ29sdW1uc1BhbmVFbmFibGVySG9sZGVyLCB0aGlzLmxpc3RQYW5lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RlZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMubGlzdFBhbmUuc2V0U2VsZWN0ZWRJdGVtKGpvaW5Db2x1bW4pOwotCX0KLQotCS8qKgotCSAqIFRoZSBlZGl0b3IgaXMgdXNlZCB0byBjb21wbGV0ZSB0aGUgYmVoYXZpb3Igb2YgdGhpcyBwYW5lLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEpvaW5Db2x1bW5zRWRpdG9yPFQ+IHsKLQotCQkvKioKLQkJICogQWRkIGEgam9pbiBjb2x1bW4gdG8gdGhlIGdpdmVuIHN1YmplY3QgYW5kIHJldHVybiBpdAotCQkgKi8KLQkJdm9pZCBhZGRKb2luQ29sdW1uKFQgc3ViamVjdCk7Ci0KLQkJLyoqCi0JCSAqIEVkaXQgdGhlIGdpdmVuIGpvaW4gY29sdW1uLCB0aGUgRWRpdCBidXR0b24gd2FzIHByZXNzZWQKLQkJICogd2hpbGUgdGhpcyBqb2luIGNvbHVtbiB3YXMgc2VsZWN0ZWQuCi0JCSAqLwotCQl2b2lkIGVkaXRKb2luQ29sdW1uKFQgc3ViamVjdCwgUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3ViamVjdCBoYXMgc3BlY2lmaWVkIGpvaW4gY29sdW1ucwotCQkgKi8KLQkJYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIHNwY2lmaWVkIGpvaW4gY29sdW1ucyBmcm9tIHRoZSBnaXZlbiBzdWJqZWN0Ci0JCSAqLwotCQlMaXN0SXRlcmFibGU8UmVhZE9ubHlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpOwotCi0JCS8qKgotCQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBzcGVjaWZpZWQgam9pbiBjb2x1bW5zIG9uIHRoZSBnaXZlbiBzdWJqZWN0Ci0JCSAqLwotCQlpbnQgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKFQgc3ViamVjdCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybiB0aGUgZGVmYXVsdCBqb2luIGNvbHVtbiBmcm9tIHRoZSBnaXZlbiBzdWJqZWN0IG9yIG51bGwuCi0JCSAqLwotCQlSZWFkT25seUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oVCBzdWJqZWN0KTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zIGxpc3QKLQkJICovCi0JCVN0cmluZyBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RQcm9wZXJ0eU5hbWUoKTsKLQotCQkvKioKLQkJICogUmV0dXJuIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBzcGVjaWZpZWQgam9pbiBjb2x1bW5zIGxpc3QKLQkJICovCi0JCVN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFJlbW92ZSB0aGUgam9pbiBjb2x1bW5zIGF0IHRoZSBzcGVjaWZpZWQgaW5kaWNlcyBmcm9tIHRoZSBzdWJqZWN0Ci0JCSAqLwotCQl2b2lkIHJlbW92ZUpvaW5Db2x1bW5zKFQgc3ViamVjdCwgaW50W10gc2VsZWN0ZWRJbmRpY2VzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDBhMGM0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luVGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUmVhZE9ubHlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbFdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlZhbHVlTGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlN0YXRlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luQ29sdW1uc0NvbXBvc2l0ZS5Kb2luQ29sdW1uc0VkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICB8Ci0gKiB8ICAgTmFtZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8ICAgfAotICogfCAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gSm9pbiBDb2x1bW5zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCB4IE92ZXJyaWRlIERlZmF1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBKb2luQ29sdW1uc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBJbnZlcnNlIEpvaW4gQ29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSm9pblRhYmxlCi0gKiBAc2VlIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUKLSAqIEBzZWUgSm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjEKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5UYWJsZUNvbXBvc2l0ZQotCWV4dGVuZHMgUmVmZXJlbmNlVGFibGVDb21wb3NpdGU8UmVhZE9ubHlKb2luVGFibGU+Ci17Ci0JcHJpdmF0ZSBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3g7Ci0KLQlwcml2YXRlIEpvaW5Db2x1bW5zQ29tcG9zaXRlPFJlYWRPbmx5Sm9pblRhYmxlPiBpbnZlcnNlSm9pbkNvbHVtbnNDb21wb3NpdGU7Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Kb2luVGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEpvaW5UYWJsZUNvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVhZE9ubHlKb2luVGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpvaW5UYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklKb2luVGFibGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSm9pblRhYmxlQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVhZE9ubHlKb2luVGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB0YWJsZUlzVmlydHVhbChSZWFkT25seUpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQkJcmV0dXJuIGpvaW5UYWJsZS5nZXRQYXJlbnQoKS5nZXRSZWxhdGlvbnNoaXAoKS5pc1ZpcnR1YWwoKTsKLQl9Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJVGFibGVDb21ibzxSZWFkT25seUpvaW5UYWJsZT4gdGFibGVDb21ibyA9IGFkZFRhYmxlQ29tYm8oY29udGFpbmVyKTsKLQkJQ29tcG9zaXRlIHRhYmxlUGFuZSA9IGFkZFBhbmUoY29udGFpbmVyLCBncm91cEJveE1hcmdpbik7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQkJdGFibGVQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX25hbWUsCi0JCQl0YWJsZUNvbWJvLmdldENvbnRyb2woKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9OQU1FCi0JCSk7Ci0JCQotCQkvLyBzY2hlbWEgd2lkZ2V0cwotCQlTY2hlbWFDb21ibzxSZWFkT25seUpvaW5UYWJsZT4gc2NoZW1hQ29tYm8gPSBhZGRTY2hlbWFDb21ibyhjb250YWluZXIpOwotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQl0YWJsZVBhbmUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luVGFibGVDb21wb3NpdGVfc2NoZW1hLAotCQkJc2NoZW1hQ29tYm8uZ2V0Q29udHJvbCgpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX1NDSEVNQQotCQkpOwotCQkKLQkJLy8gY2F0YWxvZyB3aWRnZXRzCi0JCUNhdGFsb2dDb21ibzxSZWFkT25seUpvaW5UYWJsZT4gY2F0YWxvZ0NvbWJvID0gYWRkQ2F0YWxvZ0NvbWJvKGNvbnRhaW5lcik7Ci0KLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCXRhYmxlUGFuZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9jYXRhbG9nLAotCQkJY2F0YWxvZ0NvbWJvLmdldENvbnRyb2woKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DQVRBTE9HCi0JCSk7Ci0KLQkJLy8gSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgam9pbkNvbHVtbkdyb3VwUGFuZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX2pvaW5Db2x1bW4KLQkJKTsKLQotCQkvLyBPdmVycmlkZSBEZWZhdWx0IEpvaW4gQ29sdW1ucyBjaGVjayBib3gKLQkJdGhpcy5vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uc0NoZWNrQm94ID0gYWRkQ2hlY2tCb3goCi0JCQlhZGRTdWJQYW5lKGpvaW5Db2x1bW5Hcm91cFBhbmUsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zLAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCi0JCQludWxsCi0JCSk7Ci0KLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxSZWFkT25seUpvaW5UYWJsZT4oCi0JCQl0aGlzLAotCQkJam9pbkNvbHVtbkdyb3VwUGFuZSwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNFZGl0b3IoKQotCQkpOwotCi0JCWluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKHRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUpOwotCi0JCS8vIEludmVyc2UgSm9pbiBDb2x1bW5zIGdyb3VwIHBhbmUKLQkJR3JvdXAgaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgSW52ZXJzZSBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCXRoaXMub3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCWFkZFN1YlBhbmUoaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQotCQl0aGlzLmludmVyc2VKb2luQ29sdW1uc0NvbXBvc2l0ZSA9IG5ldyBKb2luQ29sdW1uc0NvbXBvc2l0ZTxSZWFkT25seUpvaW5UYWJsZT4oCi0JCQl0aGlzLAotCQkJaW52ZXJzZUpvaW5Db2x1bW5Hcm91cFBhbmUsCi0JCQlidWlsZEludmVyc2VKb2luQ29sdW1uc0VkaXRvcigpCi0JCSk7Ci0KLQkJaW5zdGFsbEludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVyKHRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbEludmVyc2VKb2luQ29sdW1uc1BhbmVFbmFibGVyKEpvaW5Db2x1bW5zQ29tcG9zaXRlPFJlYWRPbmx5Sm9pblRhYmxlPiBwYW5lKSB7Ci0JCXBhbmUuaW5zdGFsbEpvaW5Db2x1bW5zUGFuZUVuYWJsZXIobmV3IEludmVyc2VKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSk7Ci0JfQotCi0Jdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbihSZWFkT25seUpvaW5UYWJsZSBqb2luVGFibGUpIHsKLQotCQlJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBqb2luVGFibGUsIG51bGwpOwotCi0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJYWRkSW52ZXJzZUpvaW5Db2x1bW5Gcm9tRGlhbG9nKGRpYWxvZy5nZXRTdWJqZWN0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBhZGRJbnZlcnNlSm9pbkNvbHVtbkZyb21EaWFsb2coSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0KLQkJSm9pblRhYmxlIHN1YmplY3QgPSAoSm9pblRhYmxlKSBnZXRTdWJqZWN0KCk7Ci0JCWludCBpbmRleCA9IHN1YmplY3QuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl0aGlzLnNldFNlbGVjdGVkSW52ZXJzZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkSW52ZXJzZUpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMuaW52ZXJzZUpvaW5Db2x1bW5zQ29tcG9zaXRlLnNldFNlbGVjdGVkSm9pbkNvbHVtbihqb2luQ29sdW1uKTsKLQl9Ci0KLQlwcml2YXRlIEludmVyc2VKb2luQ29sdW1uc1Byb3ZpZGVyIGJ1aWxkSW52ZXJzZUpvaW5Db2x1bW5zRWRpdG9yKCkgewotCQlyZXR1cm4gbmV3IEludmVyc2VKb2luQ29sdW1uc1Byb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdEludmVyc2VKb2luQ29sdW1uSG9sZGVyKCk7Ci0JfQotCQotCUxpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFJlYWRPbmx5Sm9pblRhYmxlLCBSZWFkT25seUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgUmVhZE9ubHlKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seUpvaW5Db2x1bW4+KHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQotCXZvaWQgZWRpdEludmVyc2VKb2luQ29sdW1uKEludmVyc2VKb2luQ29sdW1uSW5Kb2luVGFibGVTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKHN0YXRlT2JqZWN0LmdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0Jdm9pZCBlZGl0SW52ZXJzZUpvaW5Db2x1bW4oUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlJbnZlcnNlSm9pbkNvbHVtbkluSm9pblRhYmxlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSW52ZXJzZUpvaW5Db2x1bW5JbkpvaW5UYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGpvaW5Db2x1bW4pOwotCi0KLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQllZGl0SW52ZXJzZUpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHVwZGF0ZUludmVyc2VKb2luQ29sdW1ucygpIHsKLQkJaWYgKHRoaXMuaXNQb3B1bGF0aW5nKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IChKb2luVGFibGUpIHRoaXMuZ2V0U3ViamVjdCgpOwotCQlpZiAoam9pblRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRoaXMub3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5zQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCXRoaXMuc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQl0cnkgewotCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJam9pblRhYmxlLmNvbnZlcnREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5Ub1NwZWNpZmllZCgpOwotCQkJCXNldFNlbGVjdGVkSW52ZXJzZUpvaW5Db2x1bW4oam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApKTsKLQkJCX0gZWxzZSB7Ci0JCQkJam9pblRhYmxlLmNsZWFyU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0aGlzLnNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0KLQotCWNsYXNzIEludmVyc2VKb2luQ29sdW1uc1Byb3ZpZGVyIGltcGxlbWVudHMgSm9pbkNvbHVtbnNFZGl0b3I8UmVhZE9ubHlKb2luVGFibGU+IHsKLQotCQlwdWJsaWMgdm9pZCBhZGRKb2luQ29sdW1uKFJlYWRPbmx5Sm9pblRhYmxlIHN1YmplY3QpIHsKLQkJCUpvaW5UYWJsZUNvbXBvc2l0ZS50aGlzLmFkZEludmVyc2VKb2luQ29sdW1uKHN1YmplY3QpOwotCQl9Ci0KLQkJcHVibGljIFJlYWRPbmx5Sm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbihSZWFkT25seUpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBSZWFkT25seUpvaW5UYWJsZS5ERUZBVUxUX0lOVkVSU0VfSk9JTl9DT0xVTU47Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlZGl0Sm9pbkNvbHVtbihSZWFkT25seUpvaW5UYWJsZSBzdWJqZWN0LCBSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQkJSm9pblRhYmxlQ29tcG9zaXRlLnRoaXMuZWRpdEludmVyc2VKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoUmVhZE9ubHlKb2luVGFibGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuaGFzU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1ucyhSZWFkT25seUpvaW5UYWJsZSBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpIHsKLQkJCWZvciAoaW50IGluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aDsgaW5kZXgtLSA+IDA7ICkgewotCQkJCSgoSm9pblRhYmxlKSBzdWJqZWN0KS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmFibGU8UmVhZE9ubHlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucyhSZWFkT25seUpvaW5UYWJsZSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seUpvaW5Db2x1bW4+KHN1YmplY3QuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoUmVhZE9ubHlKb2luVGFibGUgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RQcm9wZXJ0eU5hbWUoKSB7Ci0JCQlyZXR1cm4gUmVhZE9ubHlKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1Q7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBPdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbkhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JICAgIGltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCQotCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMubGlzdEhvbGRlci5zaXplKCkgPiAwKTsKLQkJfQotCQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJfQotCX0KLQotCQotCXByaXZhdGUgY2xhc3MgSW52ZXJzZUpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlciAKLQkJZXh0ZW5kcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlKb2luVGFibGUsIEJvb2xlYW4+Ci0JewotCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQkJCi0JCQotCQlwdWJsaWMgSW52ZXJzZUpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJCXN1cGVyKAotCQkJCW5ldyBWYWx1ZUxpc3RBZGFwdGVyPFJlYWRPbmx5Sm9pblRhYmxlPigKLQkJCQkJbmV3IFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFJlYWRPbmx5Sm9pblRhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCkpLCAKLQkJCQkJUmVhZE9ubHlKb2luVGFibGUuU1BFQ0lGSUVEX0lOVkVSU0VfSk9JTl9DT0xVTU5TX0xJU1QpKTsKLQkJCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl9Ci0JCQotCQkKLQkJcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQl2YWx1ZVN0YXRlQ2hhbmdlZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXZvaWQgdmFsdWVTdGF0ZUNoYW5nZWQoKSB7Ci0JCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNhY2hlZFZhbHVlOwotCQkJT2JqZWN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtTmV3KHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFJlYWRPbmx5Sm9pblRhYmxlIHZhbHVlKSB7Ci0JCQlyZXR1cm4gKHZhbHVlID09IG51bGwpID8gQm9vbGVhbi5GQUxTRSA6IHN1cGVyLnRyYW5zZm9ybSh2YWx1ZSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKFJlYWRPbmx5Sm9pblRhYmxlIHZhbHVlKSB7Ci0JCQlib29sZWFuIHZpcnR1YWwgPSBKb2luVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUlzVmlydHVhbCh2YWx1ZSk7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCEgdmlydHVhbCAmJiB2YWx1ZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZU1vZGVsKCkgewotCQkJc3VwZXIuZW5nYWdlTW9kZWwoKTsKLQkJCXRoaXMudmFsdWVIb2xkZXIuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlTW9kZWwoKSB7Ci0JCQl0aGlzLnZhbHVlSG9sZGVyLnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIodGhpcy5zdGF0ZUNoYW5nZUxpc3RlbmVyKTsKLQkJCXN1cGVyLmRpc2VuZ2FnZU1vZGVsKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWM1ZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IG8gSm9pbiB0YWJsZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgSm9pblRhYmxlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBKb2luVGFibGVSZWxhdGlvbnNoaXB9Ci0gKiBAc2VlIHtAbGluayBKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUKLQlleHRlbmRzIEFic3RyYWN0Sm9pbmluZ1N0cmF0ZWd5UGFuZQotCQk8UmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAsIFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k+Ci17Ci0JcHVibGljIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcD4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JcHVibGljIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUoUGFuZTw/PiBwYXJlbnRQYW5lLAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwPiBzdWJqZWN0SG9sZGVyLAotICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBKb2luVGFibGVDb21wb3NpdGUodGhpcywgYnVpbGRKb2luVGFibGVIb2xkZXIoKSwgcGFyZW50KS5nZXRDb250cm9sKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc1N0cmF0ZWd5SG9sZGVyKCkgewotCQlyZXR1cm4gYnVpbGRVc2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5PiBidWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIKLQkJCQk8UmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXAsIFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k+KAotCQkJCQlnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlKb2luVGFibGU+IGJ1aWxkSm9pblRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBSZWFkT25seUpvaW5UYWJsZT4oCi0JCQkJdGhpcy5idWlsZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneUhvbGRlcigpLCBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5LkpPSU5fVEFCTEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFJlYWRPbmx5Sm9pblRhYmxlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Sm9pblRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCwgQm9vbGVhbj4oCi0JCQlzdWJqZWN0SG9sZGVyLCBSZWFkT25seVJlbGF0aW9uc2hpcC5TVFJBVEVHWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5idWlsZEJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJCQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gYnVpbGRCb29sZWFuVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgIT0gbnVsbCkgJiYgdGhpcy5zdWJqZWN0LnN0cmF0ZWd5SXNKb2luVGFibGUoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJKChKb2luVGFibGVSZWxhdGlvbnNoaXApIHRoaXMuc3ViamVjdCkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQkJCX0KLQkJCQkvL3ZhbHVlID09IEZBTFNFIC0gc2VsZWN0aW9uIG9mIGFub3RoZXIgcmFkaW8gYnV0dG9uIGNhdXNlcyB0aGlzIHN0cmF0ZWd5IHRvIGdldCB1bnNldAotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyMmNhOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5DYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUxpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5zQ29tcG9zaXRlLkpvaW5Db2x1bW5zRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgSm9pbkNvbHVtbnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXAKLSAqIEBzZWUgSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5Ci0gKiBAc2VlIEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lCi0gKiBAc2VlIEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneURpYWxvZwotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUgCi0JZXh0ZW5kcyBQYW5lPFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5PgotewotCQotCXByaXZhdGUgSm9pbkNvbHVtbnNDb21wb3NpdGU8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k+IGpvaW5Db2x1bW5zQ29tcG9zaXRlOwotCQotCXB1YmxpYyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewkJCi0JCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUgPSBuZXcgSm9pbkNvbHVtbnNDb21wb3NpdGU8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k+KHRoaXMsIGNvbnRhaW5lciwgYnVpbGRKb2luQ29sdW1uc1Byb3ZpZGVyKCkpOwotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlLmluc3RhbGxKb2luQ29sdW1uc1BhbmVFbmFibGVyKG5ldyBKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgSm9pbkNvbHVtbnNFZGl0b3I8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k+IGJ1aWxkSm9pbkNvbHVtbnNQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uc0VkaXRvcjxSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneT4oKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZEpvaW5Db2x1bW4oUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3ViamVjdCkgewotCQkJCUpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbihzdWJqZWN0KTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaGFzU3BlY2lmaWVkSm9pbkNvbHVtbnMoUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3ViamVjdCkgewotCQkJCXJldHVybiBzdWJqZWN0Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN1YmplY3QsIFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCQkJSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGUudGhpcy5lZGl0Sm9pbkNvbHVtbihzdWJqZWN0LCBqb2luQ29sdW1uKTsKLQkJCX0KLQotCQkJcHVibGljIFJlYWRPbmx5Sm9pbkNvbHVtbiBnZXREZWZhdWx0Sm9pbkNvbHVtbihSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdWJqZWN0KSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQkJCXJldHVybiBSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneS5ERUZBVUxUX0pPSU5fQ09MVU1OX1BST1BFUlRZOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCQlyZXR1cm4gUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1ucyhSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdWJqZWN0LCBpbnRbXSBzZWxlY3RlZEluZGljZXMpIHsKLQkJCQlmb3IgKGludCBpbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGg7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBzdWJqZWN0KS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKHNlbGVjdGVkSW5kaWNlc1tpbmRleF0pOwotCQkJCX0JCQkJCi0JCQl9Ci0KLQkJCXB1YmxpYyBMaXN0SXRlcmFibGU8UmVhZE9ubHlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucyhSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdWJqZWN0KSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UmVhZE9ubHlKb2luQ29sdW1uPihzdWJqZWN0LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZShSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdWJqZWN0KSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXZvaWQgYWRkSm9pbkNvbHVtbihSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kpIHsKLQkJSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSm9pbkNvbHVtbkluSm9pbmluZ1N0cmF0ZWd5RGlhbG9nKGdldFNoZWxsKCksIGpvaW5pbmdTdHJhdGVneSwgbnVsbCk7Ci0KLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCQlpZiAoZGlhbG9nLndhc0NvbmZpcm1lZCgpKSB7Ci0JCQlhZGRKb2luQ29sdW1uKGRpYWxvZy5nZXRTdWJqZWN0KCkpOwotCQl9Ci0JfQotCQotCXZvaWQgYWRkSm9pbkNvbHVtbihKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lTdGF0ZU9iamVjdCBzdGF0ZU9iamVjdCkgewotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3ViamVjdCA9IChKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kpIGdldFN1YmplY3QoKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3ViamVjdC5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5qb2luQ29sdW1uc0NvbXBvc2l0ZS5zZXRTZWxlY3RlZEpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JfQotCQotCXZvaWQgZWRpdEpvaW5Db2x1bW4oUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5LCBSZWFkT25seUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2coZ2V0U2hlbGwoKSwgam9pbmluZ1N0cmF0ZWd5LCBqb2luQ29sdW1uKTsKLQotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCXVwZGF0ZUpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCB1cGRhdGVKb2luQ29sdW1uKEpvaW5Db2x1bW5JbkpvaW5pbmdTdHJhdGVneVN0YXRlT2JqZWN0IHN0YXRlT2JqZWN0KSB7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oc3RhdGVPYmplY3QuZ2V0Sm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBKb2luQ29sdW1uUGFuZUVuYWJsZXJIb2xkZXIgCi0JCWV4dGVuZHMgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LCBCb29sZWFuPgotCXsKLQkJcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIHN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci0JCQotCQkKLQkJcHVibGljIEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpIHsKLQkJCXN1cGVyKAotCQkJCW5ldyBWYWx1ZUxpc3RBZGFwdGVyPFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5PigKLQkJCQkJbmV3IFJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyPFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5PihnZXRTdWJqZWN0SG9sZGVyKCkpLCAKLQkJCQkJUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kuU1BFQ0lGSUVEX0pPSU5fQ09MVU1OU19MSVNUKSk7Ci0JCQl0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIgPSBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJfQotCQkKLQkJCi0JCXByaXZhdGUgU3RhdGVDaGFuZ2VMaXN0ZW5lciBidWlsZFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXRlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VkKFN0YXRlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJdmFsdWVTdGF0ZUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQl2b2lkIHZhbHVlU3RhdGVDaGFuZ2VkKCkgewotCQkJT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jYWNoZWRWYWx1ZTsKLQkJCU9iamVjdCBuZXdWYWx1ZSA9IHRyYW5zZm9ybU5ldyh0aGlzLnZhbHVlSG9sZGVyLmdldFZhbHVlKCkpOwotCQkJZmlyZVByb3BlcnR5Q2hhbmdlZChWQUxVRSwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSB2YWx1ZSkgewotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci50cmFuc2Zvcm0odmFsdWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSB2YWx1ZSkgewotCQkJYm9vbGVhbiB2aXJ0dWFsID0gdmFsdWUuZ2V0UmVsYXRpb25zaGlwKCkuaXNWaXJ0dWFsKCk7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCEgdmlydHVhbCAmJiB2YWx1ZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA+IDApOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9Kb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc1dpdGhPdmVycmlkZU9wdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwOGFiNWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBKb2luQ29sdW1uUmVsYXRpb25zaGlwCi0gKiBAc2VlIEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneQotICogQHNlZSBKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZQotICogQHNlZSBKb2luQ29sdW1uSW5Kb2luaW5nU3RyYXRlZ3lEaWFsb2cKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlIAotCWV4dGVuZHMgUGFuZTxSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneT4KLXsKLQkKLQlwcml2YXRlIEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlIGpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZTsKLQkKLQlwdWJsaWMgSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNXaXRoT3ZlcnJpZGVPcHRpb25Db21wb3NpdGUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gT3ZlcnJpZGUgRGVmYXVsdCBKb2luIENvbHVtbnMgY2hlY2sgYm94Ci0JCWFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ1N0cmF0ZWd5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQkJCi0JCXRoaXMuam9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlID0gbmV3IEpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdGVkSm9pbkNvbHVtbihKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJdGhpcy5qb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKTsKLQl9Ci0JCi0JTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSwgUmVhZE9ubHlKb2luQ29sdW1uPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5LlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5Sm9pbkNvbHVtbj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5Sm9pbkNvbHVtbj4odGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyIAotCQlleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JCWltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gCi0JewotCQlwdWJsaWMgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJCXN1cGVyKGJ1aWxkU3BlY2lmaWVkSm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5saXN0SG9sZGVyLnNpemUoKSA+IDApOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVKb2luQ29sdW1ucyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVKb2luQ29sdW1ucyhib29sZWFuIHNlbGVjdGVkKSB7Ci0JCQlpZiAoaXNQb3B1bGF0aW5nKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCXNldFBvcHVsYXRpbmcodHJ1ZSk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN1YmplY3QgPSAoSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBnZXRTdWJqZWN0KCk7Ci0JCi0JCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0Ci0JCQkJLy8gb25lIGlmIGl0IGV4aXN0cwotCQkJCWlmIChzZWxlY3RlZCkgewotCQkJCQlSZWFkT25seUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gPSBzdWJqZWN0LmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ly9UT0RPIGNvdWxkIGJlIG51bGwsIGRpc2FibGUgb3ZlcnJpZGUgZGVmYXVsdCBjaGVjayBib3g/Ci0JCQkJCQotCQkJCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGNvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpOwotCQkJCQkJU3RyaW5nIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gZGVmYXVsdEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCQkJCQkKLQkJCQkJCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN1YmplY3QuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpOwotCQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKGNvbHVtbk5hbWUpOwotCQkJCQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0JCQkJCQkKLQkJCQkJCUpvaW5pbmdTdHJhdGVneUpvaW5Db2x1bW5zV2l0aE92ZXJyaWRlT3B0aW9uQ29tcG9zaXRlLnRoaXMuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFJlbW92ZSBhbGwgdGhlIHNwZWNpZmllZCBqb2luIGNvbHVtbnMKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaW5kZXggPSBzdWJqZWN0LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJCQkJc3ViamVjdC5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKGluZGV4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldFBvcHVsYXRpbmcoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL0pwdFVpRGV0YWlsc01lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSnB0VWlEZXRhaWxzTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkY2U0NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvSnB0VWlEZXRhaWxzTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBtYXBwaW5nIHBhbmVzLgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnB0VWlEZXRhaWxzTWVzc2FnZXMgewotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWNjZXNzVHlwZUNvbWJvX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRRdWVyeURpYWxvZ19xdWVyeVR5cGU7Ci0gCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFF1ZXJ5RGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFF1ZXJ5RGlhbG9nX2Rlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUXVlcnlEaWFsb2dfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRRdWVyeURpYWxvZ19uYW1lZFF1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFF1ZXJ5RGlhbG9nX25hbWVkTmF0aXZlUXVlcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlTdGF0ZU9iamVjdF9uYW1lTXVzdEJlU3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJ5U3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZFF1ZXJ5Q29tcG9zaXRlX25hbWVUZXh0TGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZXNDb21wb3NpdGVfYXR0cmlidXRlT3ZlcnJpZGVzR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2F0dHJpYnV0ZU92ZXJyaWRlc1NlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1NlY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkYWJsZVNlY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkZWRTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGVkSWRTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eVNlY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnlUb01hbnlTZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnlUb09uZVNlY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT25lVG9NYW55U2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPbmVUb09uZVNlY3Rpb25fdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmVyc2lvblNlY3Rpb25fdGl0bGU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9lbnVtZXJhdGVkTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9mZXRjaExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fbG9iTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fbmFtZURlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl9vcHRpb25hbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNHZW5lcmFsU2VjdGlvbl90ZW1wb3JhbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFR5cGVTZWN0aW9uX3R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fZGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUeXBlU2VjdGlvbl9sb2I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fdGVtcG9yYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHlwZVNlY3Rpb25fZW51bWVyYXRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX2FsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX2Nhc2NhZGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX21lcmdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhc2NhZGVDb21wb3NpdGVfcGVyc2lzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXNjYWRlQ29tcG9zaXRlX3JlZnJlc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZUNvbXBvc2l0ZV9yZW1vdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ0Nob29zZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2NvbHVtbkRlZmluaXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2NvbHVtblNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2RldGFpbHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX2luc2VydGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbGVuZ3RoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9udWxsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfbnVsbGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfcHJlY2lzaW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbHVtbkNvbXBvc2l0ZV9zY2FsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VuaXF1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdW5pcXVlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29sdW1uQ29tcG9zaXRlX3VwZGF0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlkZXJEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfZGlzY3JpbWluYXRvclR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NyaW1pbmF0b3JDb2x1bW5Db21wb3NpdGVfY2hhcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNjcmltaW5hdG9yQ29sdW1uQ29tcG9zaXRlX2ludGVnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlzY3JpbWluYXRvckNvbHVtbkNvbXBvc2l0ZV9zdHJpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX2luaGVyaXRhbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUNvbXBvc2l0ZV9xdWVyaWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUNvbXBvc2l0ZV90YWJsZURlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5Q29tcG9zaXRlX3RhYmxlTm9EZWZhdWx0U3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eUdlbmVyYWxTZWN0aW9uX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TmFtZUNvbXBvc2l0ZV9uYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudW1UeXBlQ29tcG9zaXRlX29yZGluYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW51bVR5cGVDb21wb3NpdGVfc3RyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZldGNoVHlwZUNvbXBvc2l0ZV9lYWdlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGZXRjaFR5cGVDb21wb3NpdGVfbGF6eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZWRWYWx1ZUNvbXBvc2l0ZV9hdXRvOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRlZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlZFZhbHVlQ29tcG9zaXRlX2dlbmVyYXRvck5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfaWRlbnRpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc2VxdWVuY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfc3RyYXRlZ3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVkVmFsdWVDb21wb3NpdGVfdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdG9yQ29tcG9zaXRlX2FsbG9jYXRpb25TaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvckNvbXBvc2l0ZV9pbml0aWFsVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdG9yc0NvbXBvc2l0ZV9zZXF1ZW5jZUdlbmVyYXRvckNoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvcnNDb21wb3NpdGVfc2VxdWVuY2VHZW5lcmF0b3JTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvcnNDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JzQ29tcG9zaXRlX3RhYmxlR2VuZXJhdG9yU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZENsYXNzQ29tcG9zaXRlX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wa19nZW5lcmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvbkNoZWNrQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5R2VuZXJhdGlvblNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yQ2hlY2tCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yU2VjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdDb21wb3NpdGVfdGFibGVHZW5lcmF0b3JTZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX2RldGFpbHNHcm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmhlcml0YW5jZUNvbXBvc2l0ZV9kaXNjcmltaW5hdG9yQ29sdW1uR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5oZXJpdGFuY2VDb21wb3NpdGVfZGlzY3JpbWluYXRvclZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfam9pbmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfc2luZ2xlX3RhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluaGVyaXRhbmNlQ29tcG9zaXRlX3N0cmF0ZWd5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0SW5oZXJpdGFuY2VDb21wb3NpdGVfdGFibGVfcGVyX2NsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmVyc2VKb2luQ29sdW1uRGlhbG9nX2VkaXRJbnZlcnNlSm9pbkNvbHVtblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5pbmdfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbmluZ19tYXBwZWRCeUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5pbmdfbWFwcGVkQnlBdHRyaWJ1dGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nX2pvaW5Db2x1bW5Kb2luaW5nTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbmluZ19wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRmlyc3REZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luaW5nU3RyYXRlZ3lKb2luQ29sdW1uc0NvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX2FkZEpvaW5Db2x1bW5EZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfYWRkSm9pbkNvbHVtblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtbkRlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ19lZGl0Sm9pbkNvbHVtblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nX3JlZmVyZW5jZWRDb2x1bW5OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX2NvbHVtbkRlZmluaXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfaW5zZXJ0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfbnVsbGFibGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV90YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luQ29sdW1uRGlhbG9nUGFuZV91bmlxdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdW5pcXVlV2l0aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pbkNvbHVtbkRpYWxvZ1BhbmVfdXBkYXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5Db2x1bW5EaWFsb2dQYW5lX3VwZGF0YWJsZVdpdGhEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9pbnZlcnNlSm9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKb2luVGFibGVDb21wb3NpdGVfc2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpvaW5UYWJsZUNvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSm9pblRhYmxlQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGVfcXVlcmllczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGVkSWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElkTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFueVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9uZVRvTWFueU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9uZVRvT25lTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmVyc2lvbk1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkZWRJZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW55VG9NYW55TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbnlUb09uZU1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPbmVUb01hbnlNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT25lVG9PbmVNYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNpZW50TWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZlcnNpb25NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9jaGFuZ2VNYXBwaW5nVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2RpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX2xhYmVsVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV9tYXBwZWRBdHRyaWJ1dGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX21hcHBlZFR5cGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3VubWFwcGVkQXR0cmlidXRlVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYXBBc0NvbXBvc2l0ZV91bm1hcHBlZFR5cGVUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcEFzQ29tcG9zaXRlX3ZpcnR1YWxBdHRyaWJ1dGVUZXh0OwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtYmVkZGFibGVVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eVVpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFwcGVkU3VwZXJjbGFzc1VpUHJvdmlkZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkYWJsZVVpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eVVpUHJvdmlkZXJfbGlua0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hcHBlZFN1cGVyY2xhc3NVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0YURhdGFDb21wbGV0ZUNvbWJvX0RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2Nhc2NhZGVUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE11bHRpUmVsYXRpb25zaGlwTWFwcGluZ0NvbXBvc2l0ZV9mZXRjaFR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2dlbmVyYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX2pvaW5UYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aVJlbGF0aW9uc2hpcE1hcHBpbmdDb21wb3NpdGVfbWFwcGVkQnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTXVsdGlSZWxhdGlvbnNoaXBNYXBwaW5nQ29tcG9zaXRlX3RhcmdldEVudGl0eTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5SGludHNHcm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcmVzdWx0Q2xhc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9OYW1lU2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE51bGxBdHRyaWJ1dGVNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcHRpb25hbENvbXBvc2l0ZV9mYWxzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcHRpb25hbENvbXBvc2l0ZV90cnVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyaW5nQ29tcG9zaXRlX2N1c3RvbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmRlcmluZ0NvbXBvc2l0ZV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyaW5nQ29tcG9zaXRlX29yZGVyaW5nR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JkZXJpbmdDb21wb3NpdGVfcHJpbWFyeUtleTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3ZlcnJpZGVzQ29tcG9zaXRlX2Fzc29jaWF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlc0NvbXBvc2l0ZV9hdHRyaWJ1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNzb2NpYXRpb25PdmVycmlkZXNDb21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPdmVycmlkZXNDb21wb3NpdGVfbm9OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfYWRkVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGREZXNjcmlwdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zQm90aERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWVyaWVzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlIaW50c0NvbXBvc2l0ZV9uYW1lQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1ZXJ5SGludHNDb21wb3NpdGVfdmFsdWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZW1hQ2hvb3Nlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19hZGRTZWNvbmRhcnlUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWNvbmRhcnlUYWJsZURpYWxvZ19jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRDYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX2RlZmF1bHRTY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfZWRpdFNlY29uZGFyeVRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlRGlhbG9nX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2Vjb25kYXJ5VGFibGVEaWFsb2dfc2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9lZGl0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZV9zZWNvbmRhcnlUYWJsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfc2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlQ2hvb3Nlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUNvbXBvc2l0ZV90YWJsZVNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfY2F0YWxvZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9kZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW5WYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZV9zY2hlbWE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdGFibGVHZW5lcmF0b3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfdmFsdWVDb2x1bW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9icm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFyZ2V0RW50aXR5Q2hvb3Nlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRFbnRpdHlDaG9vc2VyX3NlbGVjdFR5cGVUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfZGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZXN0YW1wOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9kZXRhaWxzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIENsYXNzPD8+IEJVTkRMRV9DTEFTUyA9IEpwdFVpRGV0YWlsc01lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaURldGFpbHNNZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njg1YmQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgbyBKb2luVGFibGVTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55UmVsYXRpb25zaGlwfQotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYXBwZWRCeVN0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5UYWJsZVN0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lIAotCWV4dGVuZHMgUGFuZTxNYW55VG9NYW55UmVsYXRpb25zaGlwPgotewotCXB1YmxpYyBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb01hbnlSZWxhdGlvbnNoaXA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUxhYmVsLAotCQkJTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pblRhYmxlSm9pbmluZ0xhYmVsLAotCQkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc01hcHBlZEJ5U3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBlZEJ5UmVsYXRpb25zaGlwLCBCb29sZWFuPigKLQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgUmVhZE9ubHlSZWxhdGlvbnNoaXAuU1RSQVRFR1lfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOgotCQkJCQlCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQkJCX0KLQkJCQkvL3ZhbHVlID09IEZBTFNFIC0gc2VsZWN0aW9uIG9mIGFub3RoZXIgcmFkaW8gYnV0dG9uIGNhdXNlcyB0aGlzIHN0cmF0ZWd5IHRvIGdldCB1bnNldAotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNKb2luVGFibGVTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Sm9pblRhYmxlUmVsYXRpb25zaGlwLCBCb29sZWFuPigKLQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgUmVhZE9ubHlSZWxhdGlvbnNoaXAuU1RSQVRFR1lfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOgotCQkJCQlCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCQkJfQotCQkJCS8vdmFsdWUgPT0gRkFMU0UgLSBzZWxlY3Rpb24gb2YgYW5vdGhlciByYWRpbyBidXR0b24gY2F1c2VzIHRoaXMgc3RyYXRlZ3kgdG8gZ2V0IHVuc2V0Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmZmQzYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBUYXJnZXRFbnRpdHlDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEpvaW5pbmdTdHJhdGVneUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9yZGVyaW5nQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55TWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgQ2FzY2FkZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE9yZGVyaW5nQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUgCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE1hbnlUb01hbnlNYXBwaW5nLCBNYW55VG9NYW55UmVsYXRpb25zaGlwPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvTWFueU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZjNzI4OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIEpvaW5Db2x1bW5TdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lUmVsYXRpb25zaGlwfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5TdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lIGV4dGVuZHMgUGFuZTxNYW55VG9PbmVSZWxhdGlvbnNoaXA+Ci17Ci0JcHVibGljIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbnNoaXA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMzE0OWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDYXNjYWRlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvT25lTWFwcGluZ30KLSAqIEBzZWUge0BsaW5rIFRhcmdldEVudGl0eUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBGZXRjaFR5cGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcHRpb25hbENvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPE1hbnlUb09uZU1hcHBpbmcsIE1hbnlUb09uZVJlbGF0aW9uc2hpcD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JTWFueVRvT25lTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9NYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hcEFzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNGI1ZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hcEFzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZUNvbG9yczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBUaGlzIG1hcCBhcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgc3R5bGVkIHRleHQgd2hlcmUgdGhlIG5hbWUgb2YgdGhlCi0gKiBtYXBwaW5nIGFuZCBpdHMgdHlwZSBhcmUgZGlzcGxheWVkLiBUaGUgbWFwcGluZyB0eXBlIGNhbiBiZSBjbGlja2VkIG9uIHRvCi0gKiBpbnZva2UgYSBkaWFsb2cgaW4gb3JkZXIgdG8gY2hhbmdlIHRoZSB0eXBlLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBBdHRyaWJ1dGUgJ25hbWUnIGlzIG1hcHBlZCBhcyBvbmUgdG8gb25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgwq/Cr8Kvwq/Cr8Kvwq/Cr8Kvwq8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwQXNDb21wb3NpdGU8VCBleHRlbmRzIEpwYU5vZGU+IGV4dGVuZHMgUGFuZTxUPiB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkcmFnRXZlbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZW5hYmxlZDsKLQlwcm90ZWN0ZWQgQ3Vyc29yIGhhbmRDdXJzb3I7Ci0JcHJvdGVjdGVkIE1hcHBpbmdDaGFuZ2VIYW5kbGVyPFQ+IG1hcHBpbmdDaGFuZ2VIYW5kbGVyOwotCXByb3RlY3RlZCBpbnQgbWFwcGluZ1R5cGVMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBtYXBwaW5nVHlwZVN0YXJ0OwotCXByb3RlY3RlZCBib29sZWFuIG1vdXNlRG93bjsKLQlwcm90ZWN0ZWQgaW50IG5hbWVMZW5ndGg7Ci0JcHJvdGVjdGVkIGludCBuYW1lU3RhcnQ7Ci0JcHJvdGVjdGVkIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotCS8qKgotCSAqIFRoZSBjb25zdGFudCBJRCB1c2VkIHRvIHJldHJpZXZlIHRoZSBkaWFsb2cgc2V0dGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HUyA9ICJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRpYWxvZ3MuTWFwQXNEaWFsb2ciOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBBc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE1hcEFzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKUFQgcGxhdGZvcm0gcmVzcG9uc2JsZSB0byBtYW5hZ2UgdGhlIHVzZXIgaW50ZXJmYWNlIHBhcnQgb2YKLQkgKiB0aGUgSlBUIHBsdWctaW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBVSSBwbGF0Zm9ybSBvZiB0aGUgSlBUIHBsdWctaW4KLQkgKi8KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybVVpKCkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShwbGF0Zm9ybUlkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBkZWZhdWx0IHByb3ZpZGVyIHJlc3BvbnNpYmxlIGZvciBjbGVhcmluZyB0aGUgbWFwcGluZyB0eXBlLgotCSAqIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vdCBhIGRlZmF1bHQgcHJvdmlkZXIKLQkgKiBAcmV0dXJuIEEgcHJvdmlkZXIgdGhhdCBhY3RzIGFzIGEgZGVmYXVsdCBtYXBwaW5nIHByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uIGdldERlZmF1bHREZWZpbml0aW9uKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24gZ2V0RGVmYXVsdERlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpOwotCQotCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uIGdldE1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJZm9yIChNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IHByb3ZpZGVyIDogQ29sbGVjdGlvblRvb2xzLml0ZXJhYmxlKHRoaXMubWFwcGluZ0NoYW5nZUhhbmRsZXIubWFwcGluZ1VpRGVmaW5pdGlvbnMoKSkpIHsKLQkJCWlmIChwcm92aWRlci5nZXRLZXkoKSA9PSBtYXBwaW5nS2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwkJCi0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGhhbmRsZXIgcmVzcG9uc2libGUgdG8gZ2l2ZSB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yCi0JICogY29tcGxldGluZyB0aGUgYmVoYXZpb3Igb2YgdGhpcyBwYW5lLgotCSAqCi0JICogQHJldHVybiBBIG5ldyA8Y29kZT5NYXBwaW5nQ2hhbmdlSGFuZGxlcjwvY29kZT4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgTWFwcGluZ0NoYW5nZUhhbmRsZXIgYnVpbGRNYXBwaW5nQ2hhbmdlSGFuZGxlcigpOwotCQotCXByaXZhdGUgTW91c2VMaXN0ZW5lciBidWlsZE1vdXNlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW91c2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQlpZiAoZS5idXR0b24gPT0gMSkgewotCQkJCQltb3VzZURvd24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCQltb3VzZURvd24gPSBmYWxzZTsKLQkJCQlTdHlsZWRUZXh0IHRleHQgPSAoU3R5bGVkVGV4dCkgZS53aWRnZXQ7Ci0JCQkJaW50IG9mZnNldCA9IHRleHQuZ2V0Q2FyZXRPZmZzZXQoKTsKLQotCQkJCWlmIChkcmFnRXZlbnQpIHsKLQkJCQkJZHJhZ0V2ZW50ID0gZmFsc2U7Ci0KLQkJCQkJaWYgKGlzT3Zlckxpbmsob2Zmc2V0KSkgewotCQkJCQkJdGV4dC5zZXRDdXJzb3IoaGFuZEN1cnNvcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaXNPdmVyTGluayhvZmZzZXQpKSB7Ci0JCQkJCXRleHQuc2V0Q3Vyc29yKGhhbmRDdXJzb3IpOwotCQkJCQlvcGVuTWFwcGluZ1NlbGVjdGlvbkRpYWxvZygpOwotCQkJCQl0ZXh0LnNldEN1cnNvcihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZU1vdmVMaXN0ZW5lciBidWlsZE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTW92ZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJCVN0eWxlZFRleHQgdGV4dCA9IChTdHlsZWRUZXh0KSBlLndpZGdldDsKLQotCQkJCWlmIChtb3VzZURvd24pIHsKLQkJCQkJaWYgKCFkcmFnRXZlbnQpIHsKLQkJCQkJCXRleHQuc2V0Q3Vyc29yKG51bGwpOwotCQkJCQl9Ci0KLQkJCQkJZHJhZ0V2ZW50ID0gdHJ1ZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCWludCBvZmZzZXQgPSAtMTsKLQotCQkJCXRyeSB7Ci0JCQkJCW9mZnNldCA9IHRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQotCQkJCWlmIChpc092ZXJMaW5rKG9mZnNldCkpIHsKLQkJCQkJdGV4dC5zZXRDdXJzb3IoaGFuZEN1cnNvcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0ZXh0LnNldEN1cnNvcihudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgZnVsbCBsb2NhbGl6ZWQgc3RyaW5nIGJ5IGZvcm1hdHRpbmcgdGhlIGxhYmVsIHRleHQgcmV0dXJuZWQKLQkgKiBieSB0aGUgPGNvZGU+TWFwcGluZ0NoYW5nZUhhbmRsZXI8L2NvZGU+IHdpdGggdGhlIG1hcHBpbmcgbmFtZSBhbmQgdGhlCi0JICogbWFwcGluZyB0eXBlLgotCSAqCi0JICogQHBhcmFtIG5hbWUgVGhlIGRpc3BsYXkgc3RyaW5nIG9mIHRoZSBtYXBwaW5nIGJlaW5nIGVkaXRlZAotCSAqIEBwYXJhbSBtYXBwaW5nVHlwZSBUaGUgbG9jYWxpemVkIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgbWFwcGluZyB0eXBlCi0JICogQHJldHVybiBUaGUgbG9jYWxpemVkIHN0cmluZyBkZXNjcmliaW5nIHRoZSBtYXBwaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBidWlsZFRleHQoU3RyaW5nIG5hbWUsIFN0cmluZyBtYXBwaW5nVHlwZSkgewotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQltYXBwaW5nQ2hhbmdlSGFuZGxlci5nZXRMYWJlbFRleHQoKSwKLQkJCW5hbWUsCi0JCQltYXBwaW5nVHlwZQotCQkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW55IHN0eWxlIGFwcGxpZWQgdG8gdGhlIHN0eWxlZCB0ZXh0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyU3R5bGVSYW5nZSgpIHsKLQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKG51bGwpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvUG9wdWxhdGUoKSB7Ci0JCXN1cGVyLmRvUG9wdWxhdGUoKTsKLQkJdXBkYXRlRGVzY3JpcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmVuYWJsZWQgPSBlbmFibGVkOwotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCi0JCWlmICghc3R5bGVkVGV4dC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXN0eWxlZFRleHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQotCQkJaWYgKGVuYWJsZWQpIHsKLQkJCQl1cGRhdGVMaW5rUmFuZ2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNsZWFyU3R5bGVSYW5nZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJdGhpcy5lbmFibGVkID0gdHJ1ZTsKLQkJdGhpcy5tYXBwaW5nQ2hhbmdlSGFuZGxlciA9IGJ1aWxkTWFwcGluZ0NoYW5nZUhhbmRsZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQloYW5kQ3Vyc29yID0gZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ3Vyc29yKFNXVC5DVVJTT1JfSEFORCk7Ci0KLQkJc3R5bGVkVGV4dCA9IG5ldyBTdHlsZWRUZXh0KGNvbnRhaW5lciwgU1dULldSQVAgfCBTV1QuUkVBRF9PTkxZKTsKLQkJc3R5bGVkVGV4dC5hZGRNb3VzZUxpc3RlbmVyKGJ1aWxkTW91c2VMaXN0ZW5lcigpKTsKLQkJc3R5bGVkVGV4dC5hZGRNb3VzZU1vdmVMaXN0ZW5lcihidWlsZE1vdXNlTW92ZUxpc3RlbmVyKCkpOwotCQlzdHlsZWRUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCX0KLQotCS8qKgotCSAqIFJldHJlaXZlIHRoZSA8Y29kZT5NYXBwaW5nVWlEZWZpbml0aW9uPC9jb2RlPiB0aGF0IHByb3ZpZGVzIHRoZSBVSSBmb3IgdGhlCi0JICogY3VycmVudCBtYXBwaW5nLgotCSAqCi0JICogQHJldHVybiBUaGUgPGNvZGU+TWFwcGluZ1VpUHJvdmlkZXI8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUKLQkgKiBtYXBwaW5nIGJlaW5nIGVkaXRlZAotCSAqLwotCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uIGluaXRpYWxTZWxlY3Rpb24oKSB7Ci0KLQkJZm9yIChJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbj4gaXRlciA9IHRoaXMubWFwcGluZ0NoYW5nZUhhbmRsZXIubWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJTWFwcGluZ1VpRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gaXRlci5uZXh0KCk7Ci0KLQkJCWlmIChnZXRNYXBwaW5nS2V5KCkgPT0gZGVmaW5pdGlvbi5nZXRLZXkoKSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiBsb2NhdGlvbiBpcyB3aXRoaW4gdGhlIG1hcHBpbmcgdHlwZSByYW5nZS4KLQkgKgotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbW91c2UgbG9jYXRpb24gaW4gY2hhcmFjdGVyIGNvb3JkaW5hdGUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBtb3VzZSBpcyBvdmVyIHRoZSBtYXBwaW5nIHR5cGUgdGV4dDsKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNPdmVyTGluayhpbnQgbG9jYXRpb24pIHsKLQotCQlyZXR1cm4gKGxvY2F0aW9uID49IG1hcHBpbmdUeXBlU3RhcnQgJiYKLQkJICAgICAgICBsb2NhdGlvbiA8PSBtYXBwaW5nVHlwZVN0YXJ0ICsgbWFwcGluZ1R5cGVMZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1hcHBpbmcga2V5IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtYXBwaW5nIG9iamVjdC4KLQkgKgotCSAqIEByZXR1cm4gQSBub24tPGNvZGU+bnVsbDwvY29kZT4gdW5pcXVlIGlkZW50aWZpZXIgcmVwcmVzZW50aW5nIHRoZSB0eXBlCi0JICogb2YgdGhlIG1hcHBpbmcgYmVpbmcgZWRpdGVkCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRNYXBwaW5nS2V5KCk7Ci0KLQkvKioKLQkgKiBBa3MgdGhlIDxjb2RlPk1hcHBpbmdDaGFuZ2VIYW5kbGVyPC9jb2RlPiB0byBjaGFuZ2UgdGhlIG1hcHBpbmcgdHlwZSB1c2luZwotCSAqIHRoZSBnaXZlbiA8Y29kZT5NYXBwaW5nVWlEZWZpbml0aW9uPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdXNlZCB0byBkZXRlcm1pbmUgdGhlIG1hcHBpbmcgdHlwZSB1c2VkIGZvcgotCSAqIG1vcnBoaW5nIHRoZSBtYXBwaW5nIGJlaW5nIGVkaXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJbWFwcGluZ0NoYW5nZUhhbmRsZXIubW9ycGhNYXBwaW5nKGRlZmluaXRpb24pOwotCX0KLQotCS8qKgotCSAqIE9wZW5zIHRoZSBkaWFsb2cgdGhhdCBzaG93cyB0aGUgcmVnaXN0ZXJlZCBtYXBwaW5nIHR5cGVzIGluIG9yZGVyIGZvciB0aGUKLQkgKiB1c2VyIHRvIHNlbGVjdCBhIHByb3ZpZGVyIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZQotCSAqIG1hcHBpbmcgYmVpbmcgZWRpdGVkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5NYXBwaW5nU2VsZWN0aW9uRGlhbG9nKCkgewotCi0JCU1hcHBpbmdTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IE1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4pIGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJbW9ycGhNYXBwaW5nKGRlZmluaXRpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZGVzY3JpcHRpb24gYnkgcmVjcmVhdGluZyB0aGUgbGFiZWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRGVzY3JpcHRpb24oKSB7Ci0JCWlmIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2xlYXJTdHlsZVJhbmdlKCk7Ci0JCXVwZGF0ZVRleHQoKTsKLQotCQlpZiAoZW5hYmxlZCkgewotCQkJdXBkYXRlTGlua1JhbmdlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBjb2xvcnMgb2YgdGhlIHRleHQ6ICgxKSB0aGUgbmFtZSBpcyBzaG93biBpbiBib2xkIGFuZCAoMikgdGhlCi0JICogbWFwcGluZyB0eXBlIGlzIHNob3duIGluIGJvbGQgYW5kIGluIGh5cGVybGluayBjb2xvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVMaW5rUmFuZ2UoKSB7Ci0KLQkJQ29sb3IgbGlua0NvbG9yID0gSkZhY2VDb2xvcnMuZ2V0SHlwZXJsaW5rVGV4dChnZXRTaGVsbCgpLmdldERpc3BsYXkoKSk7Ci0KLQkJLy8gTWFrZSB0aGUgbmFtZSBib2xkCi0JCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKAotCQkJbmFtZVN0YXJ0LCBuYW1lTGVuZ3RoLAotCQkJbnVsbCwgbnVsbCwKLQkJCVNXVC5CT0xECi0JCSk7Ci0JCXN0eWxlZFRleHQuc2V0U3R5bGVSYW5nZShzdHlsZVJhbmdlKTsKLQotCQkvLyBNYWtlIHRoZSBtYXBwaW5nIHR5cGUgc2hvd24gYXMgYSBoeXBlcmxpbmsKLQkJaWYgKG1hcHBpbmdUeXBlU3RhcnQgPiAtMSkgewotCQkJc3R5bGVSYW5nZSA9IG5ldyBTdHlsZVJhbmdlKAotCQkJCW1hcHBpbmdUeXBlU3RhcnQsIG1hcHBpbmdUeXBlTGVuZ3RoLAotCQkJCWxpbmtDb2xvciwgbnVsbAotCQkJKTsKLQotCQkJc3R5bGVSYW5nZS51bmRlcmxpbmUgICAgICA9IHRydWU7Ci0JCQlzdHlsZVJhbmdlLnVuZGVybGluZUNvbG9yID0gbGlua0NvbG9yOwotCQkJc3R5bGVSYW5nZS51bmRlcmxpbmVTdHlsZSA9IFNXVC5VTkRFUkxJTkVfU0lOR0xFOwotCQkJc3R5bGVkVGV4dC5zZXRTdHlsZVJhbmdlKHN0eWxlUmFuZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgc3R5bGVzIHRleHQncyBpbnB1dC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUZXh0KCkgewotCi0JCVN0cmluZyBuYW1lID0gbWFwcGluZ0NoYW5nZUhhbmRsZXIuZ2V0TmFtZSgpOwotCi0JCWlmIChuYW1lID09IG51bGwpIHsKLQkJCW5hbWUgPSBKcHRVaURldGFpbHNNZXNzYWdlcy5Ob05hbWVTZXQ7Ci0JCX0KLQotCQlTdHJpbmcgbWFwcGluZ1R5cGUgPSBtYXBwaW5nQ2hhbmdlSGFuZGxlci5nZXRNYXBwaW5nVGV4dCgpOwotCQlTdHJpbmcgdGV4dCA9IGJ1aWxkVGV4dChuYW1lLCBtYXBwaW5nVHlwZSk7Ci0KLQkJbWFwcGluZ1R5cGVTdGFydCAgPSB0ZXh0Lmxhc3RJbmRleE9mKG1hcHBpbmdUeXBlKTsKLQkJbWFwcGluZ1R5cGVMZW5ndGggPSBtYXBwaW5nVHlwZS5sZW5ndGgoKTsKLQotCQluYW1lU3RhcnQgID0gdGV4dC5pbmRleE9mKG5hbWUpOwotCQluYW1lTGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQotCQlzdHlsZWRUZXh0LnNldFRleHQodGV4dCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5zdHlsZWRUZXh0LmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlciBpcyByZXNwb25zaWJsZSB0byBnaXZlIHRoZSB0ZXh0IGluZm9ybWF0aW9uIGFuZCB0byBvcGVuIHRoZQotCSAqIG1hcHBpbmcgZGlhbG9nIGlmIHRoZSB1c2VyIGNsaWNrZWQgb24gdGhlIG1hcHBpbmcgdHlwZS4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50ZXJmYWNlIE1hcHBpbmdDaGFuZ2VIYW5kbGVyPFQ+IHsKLQotCQkvKioKLQkJICogUmV0dXJucyB0aGUgZW50aXJlIHRleHQgZGVzY3JpYmluZyB0aGUgbWFwcGluZyAoZW50aXR5IG9yIG1hcHBpbmcpIGFuZAotCQkgKiBpdHMgdHlwZS4KLQkJICoKLQkJICogQHJldHVybiBBIGxvY2FsaXplZCB0ZXh0IHdpdGggdHdvIGFyZ3VtZW50cyB3aGVyZSB0aGUgZmlyc3Qgb25lIHNob3VsZAotCQkgKiBiZSByZXBsYWNlZCBieSB0aGUgbmFtZSBhbmQgdGhlIHNlY29uZCBiZSByZXBsYWNlZCBieSB0aGUgbWFwcGluZyB0eXBlCi0JCSAqLwotCQlTdHJpbmcgZ2V0TGFiZWxUZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGRpc3BsYXlhYmxlIHRleHQgcmVwcmVzZW50aW5nIHRoZSBtYXBwaW5nIHR5cGUuCi0JCSAqCi0JCSAqIEByZXR1cm4gQSBodW1hbiByZWFkYWJsZSB0ZXh0IGRlc2NyaWJpbmcgdGhlIG1hcHBpbmcgdHlwZQotCQkgKi8KLQkJU3RyaW5nIGdldE1hcHBpbmdUZXh0KCk7Ci0KLQkJLyoqCi0JCSAqIE1vcnBoZXMgdGhlIGN1cnJlbnQgbWFwcGluZyBpbnRvIGEgbmV3IHR5cGUgYnkgdXNpbmcgdGhlIGdpdmVuIHByb3ZpZGVyLgotCQkgKgotCQkgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIGRlZmluaXRpb24gdGhhdCB3YXMgc2VsZWN0ZWQgZm9yIGNoYW5naW5nIHRoZSBtYXBwaW5nCi0JCSAqLwotCQl2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IGRlZmluaXRpb24pOwotCi0JCS8qKgotCQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1hcHBpbmcuCi0JCSAqCi0JCSAqIEByZXR1cm4gVGhlIGRpc3BsYXlhYmxlIG5hbWUgb2YgdGhlIG1hcHBpbmcKLQkJICovCi0JCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgbWFwcGluZyBVSSBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCi0JCSAqCi0JCSAqIEByZXR1cm4gVGhlIHN1cHBvcnRlZCB0eXBlcyBvZiBtYXBwaW5nCi0JCSAqLwotCQlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+PiBtYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGlhbG9nIHNob3dzIHRoZSBsaXN0IG9mIHBvc3NpYmxlIG1hcHBpbmcgdHlwZXMgYW5kIGxldHMgdGhlIHVzZXIKLQkgKiB0aGUgb3B0aW9uIHRvIGZpbHRlciB0aGVtIHVzaW5nIGEgc2VhcmNoIGZpZWxkLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBNYXBwaW5nU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZyAKLQl7Ci0JCXByaXZhdGUgTWFwcGluZ1VpRGVmaW5pdGlvbjw/LD8+IGRlZmF1bHREZWZpbml0aW9uOwotCQkKLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGluZ1NlbGVjdGlvbkRpYWxvZzwvY29kZT4uCi0JCSAqLwotCQlwcml2YXRlIE1hcHBpbmdTZWxlY3Rpb25EaWFsb2coKSB7Ci0JCQlzdXBlcihNYXBBc0NvbXBvc2l0ZS50aGlzLmdldFNoZWxsKCksIGZhbHNlKTsKLQkJCXNldE1lc3NhZ2UoSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfbGFiZWxUZXh0KTsKLQkJCXNldFRpdGxlKEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX2RpYWxvZ1RpdGxlKTsKLQkJCXNldExpc3RMYWJlbFByb3ZpZGVyKGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQkJCXNldERldGFpbHNMYWJlbFByb3ZpZGVyKGJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQkJfQotCi0JCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uPD8sPz4pIGVsZW1lbnQ7Ci0JCQkJCXJldHVybiBkZWZpbml0aW9uLmdldEltYWdlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCXJldHVybiAiIjsKLQkJCQkJfQotCQkJCQkKLQkJCQkJTWFwcGluZ1VpRGVmaW5pdGlvbjw/LD8+IGRlZmluaXRpb24gPSAoTWFwcGluZ1VpRGVmaW5pdGlvbjw/LD8+KSBlbGVtZW50OwotCQkJCQlyZXR1cm4gZGVmaW5pdGlvbi5nZXRMYWJlbCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRXh0ZW5kZWRDb250ZW50QXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlbXNGaWx0ZXIgY3JlYXRlRmlsdGVyKCkgewotCQkJcmV0dXJuIG5ldyBNYXBwaW5nVHlwZUl0ZW1zRmlsdGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRlbnRQcm92aWRlcigKLQkJCQlBYnN0cmFjdENvbnRlbnRQcm92aWRlciBwcm92aWRlciwKLQkJCQlJdGVtc0ZpbHRlciBpdGVtc0ZpbHRlciwKLQkJCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQotCQkJbW9uaXRvci5iZWdpblRhc2sobnVsbCwgLTEpOwotCi0JCQl0cnkgewotCQkJCS8vIEFkZCB0aGUgZGVmYXVsdCBwcm92aWRlcgotCQkJCWRlZmF1bHREZWZpbml0aW9uID0gZ2V0RGVmYXVsdERlZmluaXRpb24oKTsKLQotCQkJCWlmIChkZWZhdWx0RGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLmFkZChkZWZhdWx0RGVmaW5pdGlvbiwgaXRlbXNGaWx0ZXIpOwotCQkJCX0KLQotCQkJCS8vIEFkZCB0aGUgcmVnaXN0ZXJlZCBtYXBwaW5nIHByb3ZpZGVycyB0byB0aGUgZGlhbG9nCi0JCQkJZm9yIChJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+PiBpdGVyID0gbWFwcGluZ0NoYW5nZUhhbmRsZXIubWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsgaXRlci5oYXNOZXh0KCk7ICkgewotCQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uIG1hcHBpbmdEZWZpbml0aW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChtYXBwaW5nRGVmaW5pdGlvbi5pc0VuYWJsZWRGb3IoZ2V0U3ViamVjdCgpKSkgewotCQkJCQkJcHJvdmlkZXIuYWRkKG1hcHBpbmdEZWZpbml0aW9uLCBpdGVtc0ZpbHRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotCi0JCQlJRGlhbG9nU2V0dGluZ3MgZGlhbG9nU2V0dGluZ3MgPSBKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCQlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0KLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJc2V0dGluZ3MgPSBkaWFsb2dTZXR0aW5ncy5hZGROZXdTZWN0aW9uKERJQUxPR19TRVRUSU5HUyk7Ci0JCQl9Ci0KLQkJCXJldHVybiBzZXR0aW5nczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCU1hcHBpbmdVaURlZmluaXRpb24gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uKSBvYmplY3Q7Ci0JCQlyZXR1cm4gZGVmaW5pdGlvbi5nZXRMYWJlbCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb24+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoTWFwcGluZ1VpRGVmaW5pdGlvbiBpdGVtMSwgTWFwcGluZ1VpRGVmaW5pdGlvbiBpdGVtMikgewotCi0JCQkJCWlmIChpdGVtMSA9PSBkZWZhdWx0RGVmaW5pdGlvbikgewotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGl0ZW0yID09IGRlZmF1bHREZWZpbml0aW9uKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfQotCi0JCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IGl0ZW0xLmdldExhYmVsKCk7Ci0JCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGl0ZW0yLmdldExhYmVsKCk7Ci0JCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgewotCi0JCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSB0aGUgZmlsdGVyIHJlc3BvbnNpYmxlIHRvIHJlbW92ZSBhbnkgbWFwcGluZyB0eXBlIGJhc2VkIG9uIHRoZQotCQkgKiBwYXR0ZXJuIGVudGVyZWQgaW4gdGhlIHRleHQgZmllbGQuCi0JCSAqLwotCQlwcml2YXRlIGNsYXNzIE1hcHBpbmdUeXBlSXRlbXNGaWx0ZXIgZXh0ZW5kcyBJdGVtc0ZpbHRlciB7Ci0KLQkJCS8qKgotCQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwaW5nVHlwZUl0ZW1zRmlsdGVyPC9jb2RlPi4KLQkJCSAqLwotCQkJTWFwcGluZ1R5cGVJdGVtc0ZpbHRlcigpIHsKLQotCQkJCXN1cGVyKCk7Ci0KLQkJCQkvLyBNYWtlIHN1cmUgdGhhdCBpZiB0aGUgcGF0dGVybiBpcyBlbXB0eSwgd2Ugc3BlY2lmeSAqIGluIG9yZGVyCi0JCQkJLy8gdG8gc2hvdyBhbGwgdGhlIG1hcHBpbmcgdHlwZXMKLQkJCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShnZXRQYXR0ZXJuKCkpKSB7Ci0JCQkJCXBhdHRlcm5NYXRjaGVyLnNldFBhdHRlcm4oIioiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW50SXRlbShPYmplY3QgaXRlbSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIG1hdGNoSXRlbShPYmplY3QgaXRlbSkgewotCQkJCU1hcHBpbmdVaURlZmluaXRpb24gZGVmaW5pdGlvbiA9IChNYXBwaW5nVWlEZWZpbml0aW9uKSBpdGVtOwotCQkJCXJldHVybiBtYXRjaGVzKGRlZmluaXRpb24uZ2V0TGFiZWwoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDNjOWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgbyBNYXBwZWQgYnkgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8Ci0gKiB8IHwgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tIHwgfAotICogfCB8ICBBdHRyaWJ1dGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgfEJyb3dzZS4ufCB8IHwKLSAqIHwgfCAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYXBwZWRCeVJlbGF0aW9uc2hpcH0KLSAqIEBzZWUge0BsaW5rIE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3l9Ci0gKiBAc2VlIHtAbGluayBPbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUgCi0JZXh0ZW5kcyBBYnN0cmFjdEpvaW5pbmdTdHJhdGVneVBhbmU8TWFwcGVkQnlSZWxhdGlvbnNoaXAsIE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBmb3JtIHBhbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSgKLQkJCVBhbmU8PyBleHRlbmRzIE1hcHBlZEJ5UmVsYXRpb25zaGlwPiBwYXJlbnRQYW5lLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBNYXBwZWRCeVBhbmUodGhpcywgdGhpcy5idWlsZE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKCksIHBhcmVudCkuZ2V0Q29udHJvbCgpOwotCX0JCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VzU3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBidWlsZFVzZXNNYXBwZWRCeUpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8TWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneT4gYnVpbGRNYXBwZWRCeUpvaW5pbmdTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGVkQnlSZWxhdGlvbnNoaXAsIE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFwcGVkQnlSZWxhdGlvbnNoaXA+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGVkQnlSZWxhdGlvbnNoaXAsIEJvb2xlYW4+KAotCQkJCXN1YmplY3RIb2xkZXIsIFJlYWRPbmx5UmVsYXRpb25zaGlwLlNUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuICh0aGlzLnN1YmplY3QgPT0gbnVsbCkgPyBCb29sZWFuLkZBTFNFIDoKLQkJCQkJQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgPT0gQm9vbGVhbi5UUlVFKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJCQl9Ci0JCQkJLy92YWx1ZSA9PSBGQUxTRSAtIHNlbGVjdGlvbiBvZiBhbm90aGVyIHJhZGlvIGJ1dHRvbiBjYXVzZXMgdGhpcyBzdHJhdGVneSB0byBnZXQgdW5zZXQKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTWFwcGVkQnlQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNDBkNTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL01hcHBlZEJ5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LklDVVN0cmluZ0NvbGxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uQXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Tb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTWFwcGVkIEJ5OiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBwZWRCeVBhbmUgCi0JZXh0ZW5kcyBQYW5lPE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRCeVBhbmU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBmb3JtIHBhbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgUFZNIGZvciB0aGUge0BsaW5rIE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3l9Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBNYXBwZWRCeVBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8TWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZExhYmVsZWRFZGl0YWJsZUNvbWJvKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUF0dHJpYnV0ZUxhYmVsLAotCQkJYnVpbGRDYW5kaWRhdGVBdHRyaWJ1dGVzTGlzdFZhbHVlTW9kZWwoKSwKLQkJCWJ1aWxkQXR0cmlidXRlUHJvcGVydHlWYWx1ZU1vZGVsKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX01BUFBFRF9CWSk7Ci0JfQotCQotCXByb3RlY3RlZCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2FuZGlkYXRlQXR0cmlidXRlc0xpc3RWYWx1ZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3ksIFN0cmluZz4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEl0ZXJhYmxlKCkgewotCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKTsKLQkJCQl9Ci0JCQl9LAotCQkJbmV3IElDVVN0cmluZ0NvbGxhdG9yKCkKLQkJKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRBdHRyaWJ1dGVQcm9wZXJ0eVZhbHVlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3ksIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE1hcHBlZEJ5QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRNYXBwZWRCeUF0dHJpYnV0ZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwOTVmNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFJlc3VsdCBDbGFzczogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQnJvd3NlLi4uIHwgfAotICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICB8Ci0gKiB8IFF1ZXJ5OiAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gUXVlcnkgSGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBRdWVyeUhpbnRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE5hbWVkTmF0aXZlUXVlcnkKLSAqIEBzZWUgTmFtZWROYXRpdmVRdWVyaWVzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2xhc3NDaG9vc2VyUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgTmFtZWROYXRpdmVRdWVyeVByb3BlcnR5Q29tcG9zaXRlIGV4dGVuZHMgUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PgotewotCXByaXZhdGUgQ2xhc3NDaG9vc2VyUGFuZTxOYW1lZE5hdGl2ZVF1ZXJ5PiByZXN1bHRDbGFzc0Nob29zZXJQYW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE5hbWVkTmF0aXZlUXVlcnk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8TmFtZWROYXRpdmVRdWVyeT4gYWRkQ2xhc3NDaG9vc2VyKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENsYXNzQ2hvb3NlclBhbmU8TmFtZWROYXRpdmVRdWVyeT4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0SG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkTmF0aXZlUXVlcnksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBOYW1lZE5hdGl2ZVF1ZXJ5LlJFU1VMVF9DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UmVzdWx0Q2xhc3MoKTsKLQkJCQkJfQotCi0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0JCQkJCi0JCQkJCQl0aGlzLnN1YmplY3Quc2V0UmVzdWx0Q2xhc3ModmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFJlc3VsdENsYXNzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9yZXN1bHRDbGFzczsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0UmVzdWx0Q2xhc3MoY2xhc3NOYW1lKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0UmVzdWx0Q2xhc3NFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElUeXBlIHJlc29sdmVKZHRUeXBlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0UmVzdWx0Q2xhc3NKZHRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkTmF0aXZlUXVlcnksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5RVUVSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFF1ZXJ5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBlbmFibGVXaWRnZXRzKGJvb2xlYW4gZW5hYmxlZCkgewotCQlzdXBlci5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQl0aGlzLnJlc3VsdENsYXNzQ2hvb3NlclBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlDb21wb3NpdGVfbmFtZVRleHRMYWJlbCwgCi0JCQlidWlsZE5hbWVUZXh0SG9sZGVyKCkpOwotCi0JCS8vIFJlc3VsdCBjbGFzcyBjaG9vc2VyCi0JCXRoaXMucmVzdWx0Q2xhc3NDaG9vc2VyUGFuZSA9IGFkZENsYXNzQ2hvb3Nlcihjb250YWluZXIpOwotCi0JCS8vIFF1ZXJ5IHRleHQgYXJlYQotCQlhZGRMYWJlbGVkTXVsdGlMaW5lVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeSwKLQkJCWJ1aWxkUXVlcnlIb2xkZXIoKSwKLQkJCTQsCi0JCQludWxsCi0JCSk7Ci0KLQkJLy8gUXVlcnkgSGludHMgcGFuZQotCQljb250YWluZXIgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkTmF0aXZlUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgUXVlcnlIaW50c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVUZXh0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxOYW1lZE5hdGl2ZVF1ZXJ5LCBTdHJpbmc+KAotCQkJCWdldFN1YmplY3RIb2xkZXIoKSwgUXVlcnkuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOWI5YjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL05hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcHFsLkpwYUpwcWxDb250ZW50UHJvcG9zYWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSdzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBRdWVyeTogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gUXVlcnkgSGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBRdWVyeUhpbnRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE5hbWVkUXVlcnkKLSAqIEBzZWUgTmFtZWRRdWVyaWVzQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgUXVlcnlIaW50c0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlPFQgZXh0ZW5kcyBOYW1lZFF1ZXJ5PiBleHRlbmRzIFBhbmU8VD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkUXVlcnksIFN0cmluZz4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkUXVlcnksIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5RVUVSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFF1ZXJ5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuTmFtZWRRdWVyeUNvbXBvc2l0ZV9uYW1lVGV4dExhYmVsLAotCQkJYnVpbGROYW1lVGV4dEhvbGRlcigpKTsKLQotCQlKcGFKcHFsQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSnBhSnBxbENvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKAotCQkJY29udGFpbmVyLAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJYnVpbGRRdWVyeUhvbGRlcigpCi0JCSk7Ci0KLQkJLy8gUXVlcnkgdGV4dCBhcmVhCi0JCUNvbXBvc2l0ZSBxdWVyeVdpZGdldHMgPSB0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5UHJvcGVydHlDb21wb3NpdGVfcXVlcnksCi0JCQlwcm92aWRlci5nZXRTdHlsZWRUZXh0KCkKLQkJKTsKLQotCQkvLyBJbnN0YWxsIHRoZSBjb250ZW50IGFzc2lzdCBpY29uIGF0IHRoZSB0b3AgbGVmdCBvZiB0aGUgU3R5bGVkVGV4dC4KLQkJLy8gTm90ZTogRm9yIHNvbWUgcmVhc29uLCB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgYWZ0ZXIgdGhlIFN0eWxlZFRleHQKLQkJLy8gICAgICAgaXMgYWRkZWQgdG8gdGhlIGxhYmVsZWQgY29tcG9zaXRlCi0JCXByb3ZpZGVyLmluc3RhbGxDb250cm9sRGVjb3JhdGlvbigpOwotCi0JCWFkanVzdE11bHRpTGluZVRleHRMYXlvdXQoCi0JCQlxdWVyeVdpZGdldHMsCi0JCQk0LAotCQkJcHJvdmlkZXIuZ2V0U3R5bGVkVGV4dCgpLAotCQkJcHJvdmlkZXIuZ2V0U3R5bGVkVGV4dCgpLmdldExpbmVIZWlnaHQoKQotCQkpOwotCi0JCS8vIFF1ZXJ5IEhpbnRzIHBhbmUKLQkJY29udGFpbmVyID0gdGhpcy5hZGRUaXRsZWRHcm91cCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgUXVlcnlIaW50c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzViMzY0MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6ICAKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIEpvaW5pbmcgU3RyYXRlZ3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IG8gSm9pblRhYmxlU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE9uZVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBPbmVUb01hbnlSZWxhdGlvbnNoaXB9Ci0gKiBAc2VlIHtAbGluayBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFwcGVkQnlTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBKb2luVGFibGVTdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3lQYW5lIAotCWV4dGVuZHMgUGFuZTxPbmVUb01hbnlSZWxhdGlvbnNoaXA+Ci17Ci0JcHVibGljIE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneVBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb01hbnlSZWxhdGlvbnNoaXA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUxhYmVsLAotCQkJTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbCwKLQkJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkU3ViUGFuZShjb21wb3NpdGUsIDUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTQyZWJjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZwotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBKb2luVGFibGVDb21wb3NpdGUKLSAqIEBzZWUgT3JkZXJpbmdDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9uZVRvTWFueU1hcHBpbmcsIE9uZVRvTWFueVJlbGF0aW9uc2hpcD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb09uZUpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE4ZjA5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luaW5nIFN0cmF0ZWd5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBvIEpvaW5Db2x1bW5TdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgbyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgT25lVG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgT25lVG9PbmVSZWxhdGlvbnNoaXB9Ci0gKiBAc2VlIHtAbGluayBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYXBwZWRCeVN0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5TdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5UGFuZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjEKLSAqLwotcHVibGljIGNsYXNzIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSAKLQlleHRlbmRzIFBhbmU8T25lVG9PbmVSZWxhdGlvbnNoaXA+Ci17Ci0JcHVibGljIE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5UGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lUmVsYXRpb25zaGlwPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3RpdGxlLAotCQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKSk7Ci0JCQotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX21hcHBlZEJ5TGFiZWwsCi0JCQlNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19wcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdMYWJlbCwKLQkJCVByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5Db2x1bW5Kb2luaW5nTGFiZWwsCi0JCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZS4KLQkJCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL09uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjhkYTk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICogQHNlZSBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAKLQlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPE9uZVRvT25lTWFwcGluZywgT25lVG9PbmVSZWxhdGlvbnNoaXA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0JCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvT3B0aW9uYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9PcHRpb25hbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQ5MWMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9PcHRpb25hbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3B0aW9uYWxNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21wb3NpdGUgc2ltcGx5IHNob3dzIGEgdHJpLXN0YXRlIGNoZWNrIGJveCBmb3IgdGhlIE9wdGlvbmFsIG9wdGlvbi4KLSAqCi0gKiBAc2VlIEJhc2ljTWFwcGluZwotICogQHNlZSBCYXNpY01hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqIEBzZWUgTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPbmVUb09uZU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9wdGlvbmFsQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcHRpb25hbE1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcHRpb25hbENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3B0aW9uYWxDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgT3B0aW9uYWxNYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KQotCXsKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWwsCi0JCQlidWlsZE9wdGlvbmFsSG9sZGVyKCksCi0JCQlidWlsZE9wdGlvbmFsU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09QVElPTkFMCi0JCSk7Ci0JfQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPcHRpb25hbEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3B0aW9uYWxNYXBwaW5nLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPcHRpb25hbCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE9wdGlvbmFsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkT3B0aW9uYWxTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRPcHRpb25hbEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkJhc2ljR2VuZXJhbFNlY3Rpb25fb3B0aW9uYWxMYWJlbERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5CYXNpY0dlbmVyYWxTZWN0aW9uX29wdGlvbmFsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE9wdGlvbmFsSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcHRpb25hbE1hcHBpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3B0aW9uYWxNYXBwaW5nLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwKLQkJCU9wdGlvbmFsTWFwcGluZy5ERUZBVUxUX09QVElPTkFMX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRPcHRpb25hbCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL09yZGVyaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvT3JkZXJpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxZThjMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvT3JkZXJpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sbGVjdGlvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT3JkZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBPcmRlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBQcmltYXJ5IEtleSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIEN1c3RvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8ICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIENvbGxlY3Rpb25NYXBwaW5nCi0gKiBAc2VlIE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUgLSBBIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9yZGVyaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RPcmRlcmluZ0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JkZXJpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9yZGVyaW5nQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIENvbGxlY3Rpb25NYXBwaW5nPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU11bHRpUmVsYXRpb25zaGlwTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcmRlcmluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbGxlY3Rpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9yZGVyYWJsZT4gb3JkZXJhYmxlSG9sZGVyID0gYnVpbGRPcmRlcmFibGVIb2xkZXIoKTsKLQkJCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9yZGVyaW5nQ29tcG9zaXRlX29yZGVyaW5nR3JvdXAKLQkJKTsKLQotCQkvLyBObyBPcmRlcmluZyByYWRpbyBidXR0b24KLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PcmRlcmluZ0NvbXBvc2l0ZV9ub25lLAotCQkJYnVpbGROb09yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX05PX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gT3JkZXIgYnkgUHJpbWFyeSBLZXkgcmFkaW8gYnV0dG9uCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3JkZXJpbmdDb21wb3NpdGVfcHJpbWFyeUtleSwKLQkJCWJ1aWxkUHJpbWFyeUtleU9yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX09SREVSX0JZX1BSSU1BUllfS0VZX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gQ3VzdG9tIE9yZGVyaW5nIHJhZGlvIGJ1dHRvbgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9yZGVyaW5nQ29tcG9zaXRlX2N1c3RvbSwKLQkJCWJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIob3JkZXJhYmxlSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfQ1VTVE9NX09SREVSSU5HCi0JCSk7Ci0KLQkJLy8gQ3VzdG9tIE9yZGVyaW5nIHRleHQgZmllbGQKLQkJYWRkVGV4dCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNiksCi0JCQlidWlsZFNwZWNpZmllZE9yZGVyQnlIb2xkZXIob3JkZXJhYmxlSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQlksCi0JCQlidWlsZEN1c3RvbU9yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlcikKLQkJKTsKLQl9Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYyM2Y3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5GaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5GaWx0ZXJpbmdQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhlIGFic3RyYWN0IGRlZmluaXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSByZXNwb25zaWJsZSB0byBzaG93IHRoZQotICogaW5mb3JtYXRpb24gZm9yIGFuIHBlcnNpc3RlbnQgYXR0cmlidXRlLgotICoKLSAqIEBzZWUgUGVyc2lzdGVudEF0dHJpYnV0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPEEgZXh0ZW5kcyBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYURldGFpbHNQYWdlPEE+Ci17Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+IG1hcHBpbmdDb21wb3NpdGVzOwotCXByaXZhdGUgUGFnZUJvb2sgbWFwcGluZ1BhZ2VCb29rOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ0hvbGRlcjsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYUNvbXBvc2l0ZT4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFnZUJvb2sgYnVpbGRNYXBwaW5nUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLm1hcHBpbmdQYWdlQm9vayA9IG5ldyBQYWdlQm9vayhwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5tYXBwaW5nUGFnZUJvb2suc2hvd1BhZ2UodGhpcy5hZGRMYWJlbCh0aGlzLm1hcHBpbmdQYWdlQm9vaywgIiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQotCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMubWFwcGluZ0hvbGRlciA9IHRoaXMuYnVpbGRNYXBwaW5nSG9sZGVyKCk7Ci0JCW5ldyBDb250cm9sU3dpdGNoZXIodGhpcy5tYXBwaW5nSG9sZGVyLCB0aGlzLmJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHRoaXMubWFwcGluZ1BhZ2VCb29rKTsKLQotCQlyZXR1cm4gdGhpcy5tYXBwaW5nUGFnZUJvb2s7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8QXR0cmlidXRlTWFwcGluZywgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oQXR0cmlidXRlTWFwcGluZyBhdHRyaWJ1dGVNYXBwaW5nKSB7Ci0JCQkJaWYgKGF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIGdldE1hcHBpbmdDb21wb3NpdGUoYXR0cmlidXRlTWFwcGluZy5nZXRLZXkoKSkuZ2V0Q29udHJvbCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBKcGFDb21wb3NpdGUgZ2V0TWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5KSB7Ci0JCUpwYUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0aGlzLm1hcHBpbmdDb21wb3NpdGVzLmdldChrZXkpOwotCQlpZiAoY29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQljb21wb3NpdGUgPSBidWlsZE1hcHBpbmdDb21wb3NpdGUodGhpcy5tYXBwaW5nUGFnZUJvb2ssIGtleSk7Ci0KLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzLnB1dChrZXksIGNvbXBvc2l0ZSk7Ci0JCX0KLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhQ29tcG9zaXRlIGJ1aWxkTWFwcGluZ0NvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaywgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm1VaSgpLmJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCQlnZXRTdWJqZWN0KCkuZ2V0UmVzb3VyY2VUeXBlKCksCi0JCQkJa2V5LAotCQkJCXBhZ2VCb29rLAotCQkJCWJ1aWxkTWFwcGluZ0hvbGRlcihrZXkpLAotCQkJCWdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0hvbGRlcihmaW5hbCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyaW5nUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+KAotCQkJdGhpcy5tYXBwaW5nSG9sZGVyLAotCQkJYnVpbGRNYXBwaW5nRmlsdGVyKGtleSkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEZpbHRlcjxBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZE1hcHBpbmdGaWx0ZXIoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nRmlsdGVyKG1hcHBpbmdLZXkpOwotCX0KLQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEEsIEF0dHJpYnV0ZU1hcHBpbmc+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfS0VZX1BST1BFUlRZLAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZS5NQVBQSU5HX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWFwcGluZygpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWxvZyhUcmFjaW5nLlVJX0RFVEFJTFNfVklFVywgIlBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5kaXNwb3NlKCkiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZvciAoSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUgOiB0aGlzLm1hcHBpbmdDb21wb3NpdGVzLnZhbHVlcygpKSB7Ci0JCQltYXBwaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJfQotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzLmNsZWFyKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIGZsYWcsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCXN1cGVyLmxvZyhmbGFnLCBtZXNzYWdlKTsKLQotCQlpZiAoVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcuZXF1YWxzKGZsYWcpICYmCi0JCSAgICBUcmFjaW5nLmJvb2xlYW5EZWJ1Z09wdGlvbihUcmFjaW5nLlVJX0RFVEFJTFNfVklFVykpCi0JCXsKLQkJCVRyYWNpbmcubG9nKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBNYXBwaW5nRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyPEF0dHJpYnV0ZU1hcHBpbmc+IHsKLQkJcHJpdmF0ZSBTdHJpbmcgbWFwcGluZ0tleTsKLQotCQlNYXBwaW5nRmlsdGVyKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5tYXBwaW5nS2V5ID0gbWFwcGluZ0tleTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcpIHsKLQkJCXJldHVybiAobWFwcGluZyA9PSBudWxsIHx8IHRoaXMubWFwcGluZ0tleSA9PSBudWxsKSB8fCB0aGlzLm1hcHBpbmdLZXkuZXF1YWxzKG1hcHBpbmcuZ2V0S2V5KCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjZTFjNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzICJNYXAgQXMiIGNvbXBvc2l0ZSBpcyByZXNwb25zaWJsZSBmb3Igc2hvd2luZyB0aGUgbWFwcGluZyBuYW1lIGFuZAotICogbWFwcGluZyB0eXBlIGZvciBhbiBhdHRyaWJ1dGUuCi0gKgotICogQHNlZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlIAotCWV4dGVuZHMgTWFwQXNDb21wb3NpdGU8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXBwaW5nS2V5KCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE1hcHBpbmdLZXkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTWFwcGluZ0NoYW5nZUhhbmRsZXIgYnVpbGRNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nQ2hhbmdlSGFuZGxlcigpIHsKLQotCQkJcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7Ci0KLQkJCQlpZiAobWFwcGluZ0tleSAhPSBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkgewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfbWFwcGVkQXR0cmlidXRlVGV4dDsKLQkJCQl9Ci0JCQkJaWYgKGdldFN1YmplY3QoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfdmlydHVhbEF0dHJpYnV0ZVRleHQ7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX3VubWFwcGVkQXR0cmlidXRlVGV4dDsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRNYXBwaW5nVGV4dCgpIHsKLQkJCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQotCQkJCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX2NoYW5nZU1hcHBpbmdUeXBlOwotCQkJCX0KLQotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpID8KLQkJCQkJCWdldERlZmF1bHREZWZpbml0aW9uKGdldFN1YmplY3QoKS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKS5nZXRMaW5rTGFiZWwoKSA6Ci0JCQkJCQlnZXRNYXBwaW5nVWlEZWZpbml0aW9uKG1hcHBpbmdLZXkpLmdldExpbmtMYWJlbCgpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCBtb3JwaE1hcHBpbmcoTWFwcGluZ1VpRGVmaW5pdGlvbiBkZWZpbml0aW9uKSB7Ci0JCQkJKChQZXJzaXN0ZW50QXR0cmlidXRlKSBnZXRTdWJqZWN0KCkpLnNldE1hcHBpbmdLZXkoZGVmaW5pdGlvbi5nZXRLZXkoKSk7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsID8+PiBtYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJCQlyZXR1cm4gYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsID8+PiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS5hdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyhnZXRTdWJqZWN0KCkuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb24gZ2V0RGVmYXVsdERlZmluaXRpb24oKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0RGVmaW5pdGlvbihnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbiBnZXREZWZhdWx0RGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlyZXR1cm4gZ2V0SnBhUGxhdGZvcm1VaSgpLmdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKGdldFN1YmplY3QoKS5nZXRNYXBwaW5nKCkuZ2V0UmVzb3VyY2VUeXBlKCksIG1hcHBpbmdLZXkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uIGdldE1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJTWFwcGluZ1VpRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gc3VwZXIuZ2V0TWFwcGluZ1VpRGVmaW5pdGlvbihtYXBwaW5nS2V5KTsKLQkJcmV0dXJuIChkZWZpbml0aW9uICE9IG51bGwpID8gZGVmaW5pdGlvbiA6IFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfS0VZX1BST1BFUlRZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLk1BUFBJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0KLQkJaWYgKHByb3BlcnR5TmFtZSA9PSBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSB8fAotCQkgICAgcHJvcGVydHlOYW1lID09IFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfS0VZX1BST1BFUlRZICAgfHwKLQkJICAgIHByb3BlcnR5TmFtZSA9PSBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSkgewotCi0JCQl1cGRhdGVEZXNjcmlwdGlvbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NDAyZDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiB0aGUgZGV0YWlscyBwYWdlIHJlc3BvbnNpYmxlIHRvIHNob3cgdGhlCi0gKiBpbmZvcm1hdGlvbiBmb3IgYW4gcGVyc2lzdGVudCB0eXBlLgotICoKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2U8UGVyc2lzdGVudFR5cGU+Ci17Ci0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+IG1hcHBpbmdDb21wb3NpdGVzOwotCXByaXZhdGUgUGFnZUJvb2sgbWFwcGluZ1BhZ2VCb29rOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UoQ29tcG9zaXRlIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZSgpOwotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKcGFDb21wb3NpdGU+KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIE1hcCBBcyBjb21wb3NpdGUKLQkJbmV3IFBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDAsIDUsIDApCi0JCSk7Ci0KLQkJLy8gVHlwZSBwcm9wZXJ0aWVzIHBhZ2UKLQkJYnVpbGRNYXBwaW5nUGFnZUJvb2soY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGFnZUJvb2sgYnVpbGRNYXBwaW5nUGFnZUJvb2soQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMubWFwcGluZ1BhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zaG93UGFnZSh0aGlzLmFkZExhYmVsKHRoaXMubWFwcGluZ1BhZ2VCb29rLCAiIikpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5UT1A7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQotCQl0aGlzLm1hcHBpbmdQYWdlQm9vay5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJCi0JCXRoaXMubWFwcGluZ0hvbGRlciA9IHRoaXMuYnVpbGRNYXBwaW5nSG9sZGVyKCk7Ci0JCW5ldyBDb250cm9sU3dpdGNoZXIodGhpcy5tYXBwaW5nSG9sZGVyLCB0aGlzLmJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHRoaXMubWFwcGluZ1BhZ2VCb29rKTsKLQotCQlyZXR1cm4gdGhpcy5tYXBwaW5nUGFnZUJvb2s7Ci0JfQotCQotCXByaXZhdGUgVHJhbnNmb3JtZXI8VHlwZU1hcHBpbmcsIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFR5cGVNYXBwaW5nLCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShUeXBlTWFwcGluZyB0eXBlTWFwcGluZykgewotCQkJCWlmICh0eXBlTWFwcGluZyA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gZ2V0TWFwcGluZ0NvbXBvc2l0ZSh0eXBlTWFwcGluZy5nZXRLZXkoKSkuZ2V0Q29udHJvbCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFR5cGVNYXBwaW5nPiBidWlsZE1hcHBpbmdIb2xkZXIoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbmV3IEZpbHRlcmluZ1Byb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4oCi0JCQl0aGlzLm1hcHBpbmdIb2xkZXIsCi0JCQlidWlsZE1hcHBpbmdGaWx0ZXIoa2V5KQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbnRUeXBlLCBUeXBlTWFwcGluZz4gYnVpbGRNYXBwaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50VHlwZSwgVHlwZU1hcHBpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVudFR5cGUuTUFQUElOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVHlwZU1hcHBpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBGaWx0ZXI8VHlwZU1hcHBpbmc+IGJ1aWxkTWFwcGluZ0ZpbHRlcihmaW5hbCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBuZXcgRmlsdGVyPFR5cGVNYXBwaW5nPigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChUeXBlTWFwcGluZyBtYXBwaW5nKSB7Ci0JCQkJcmV0dXJuIChtYXBwaW5nID09IG51bGwgfHwga2V5ID09IG51bGwpIHx8IGtleS5lcXVhbHMobWFwcGluZy5nZXRLZXkoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JcHJpdmF0ZSBKcGFDb21wb3NpdGUgZ2V0TWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5KSB7Ci0JCUpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlID0gdGhpcy5tYXBwaW5nQ29tcG9zaXRlcy5nZXQoa2V5KTsKLQkJaWYgKG1hcHBpbmdDb21wb3NpdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG1hcHBpbmdDb21wb3NpdGU7Ci0JCX0KLQotCQltYXBwaW5nQ29tcG9zaXRlID0gYnVpbGRNYXBwaW5nQ29tcG9zaXRlKHRoaXMubWFwcGluZ1BhZ2VCb29rLCBrZXkpOwotCi0JCWlmIChtYXBwaW5nQ29tcG9zaXRlICE9IG51bGwpIHsKLQkJCXRoaXMubWFwcGluZ0NvbXBvc2l0ZXMucHV0KGtleSwgbWFwcGluZ0NvbXBvc2l0ZSk7Ci0JCX0KLQotCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYUNvbXBvc2l0ZSBidWlsZE1hcHBpbmdDb21wb3NpdGUoUGFnZUJvb2sgcGFnZUJvb2ssIFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS4KLQkJCWJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpLCAKLQkJCQlrZXksIAotCQkJCXBhZ2VCb29rLCAKLQkJCQlidWlsZE1hcHBpbmdIb2xkZXIoa2V5KSwgCi0JCQkJZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlsb2coVHJhY2luZy5VSV9ERVRBSUxTX1ZJRVcsICJQZXJzaXN0ZW50VHlwZURldGFpbHNQYWdlLmRpc3Bvc2UoKSIpOwotCi0JCWZvciAoSnBhQ29tcG9zaXRlIG1hcHBpbmdDb21wb3NpdGUgOiB0aGlzLm1hcHBpbmdDb21wb3NpdGVzLnZhbHVlcygpKSB7Ci0JCQltYXBwaW5nQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQkJfQotCQl0aGlzLm1hcHBpbmdDb21wb3NpdGVzLmNsZWFyKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhMjljNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzICJNYXAgQXMiIGNvbXBvc2l0ZSBpcyByZXNwb25zaWJsZSBmb3Igc2hvd2luZyB0aGUgbWFwcGluZyBuYW1lIGFuZAotICogbWFwcGluZyB0eXBlIGZvciBhIHR5cGUuCi0gKgotICogQHNlZSBKYXZhUGVyc2lzdGVudFR5cGVNYXBBc0NvbXBvc2l0ZQotICogQHNlZSBPcm1QZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlCi0JZXh0ZW5kcyBNYXBBc0NvbXBvc2l0ZTxQZXJzaXN0ZW50VHlwZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW50VHlwZU1hcEFzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGU+IHBhcmVudFBhbmUsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0TWFwcGluZ0tleSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBNYXBwaW5nQ2hhbmdlSGFuZGxlciBidWlsZE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdDaGFuZ2VIYW5kbGVyKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQotCQkJCWlmIChtYXBwaW5nS2V5ICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk1hcEFzQ29tcG9zaXRlX21hcHBlZFR5cGVUZXh0OwotCQkJCX0KLQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5NYXBBc0NvbXBvc2l0ZV91bm1hcHBlZFR5cGVUZXh0OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdUZXh0KCkgewotCQkJCVN0cmluZyBtYXBwaW5nS2V5ID0gZ2V0TWFwcGluZ0tleSgpOwotCi0JCQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuTWFwQXNDb21wb3NpdGVfY2hhbmdlTWFwcGluZ1R5cGU7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIGdldE1hcHBpbmdVaURlZmluaXRpb24obWFwcGluZ0tleSkuZ2V0TGlua0xhYmVsKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vcnBoTWFwcGluZyhNYXBwaW5nVWlEZWZpbml0aW9uIGRlZmluaXRpb24pIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0TWFwcGluZ0tleShkZWZpbml0aW9uLmdldEtleSgpKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U2ltcGxlTmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCA/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCQkJcmV0dXJuIHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyB0aGF0IGFyZSByZWdpc3RlcmVkIHdpdGggdGhlIEpQVCBwbHVnaW4uCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBzdXBwb3J0ZWQgdHlwZXMgb2YgbWFwcGluZwotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGUsID8+PiB0eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSB7Ci0JCXJldHVybiBnZXRKcGFQbGF0Zm9ybVVpKCkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKGdldFN1YmplY3QoKS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbiBnZXREZWZhdWx0RGVmaW5pdGlvbigpIHsKLQkJcmV0dXJuIGdldEpwYVBsYXRmb3JtVWkoKS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oZ2V0U3ViamVjdCgpLmdldFJlc291cmNlVHlwZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uIGdldERlZmF1bHREZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCXJldHVybiBnZXREZWZhdWx0RGVmaW5pdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQotCQlpZiAocHJvcGVydHlOYW1lID09IFBlcnNpc3RlbnRUeXBlLk1BUFBJTkdfUFJPUEVSVFkgfHwKLQkJICAgIHByb3BlcnR5TmFtZSA9PSBQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZKSB7Ci0KLQkJCXVwZGF0ZURlc2NyaXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MGI5ODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVGhpcyBkaWFsb2cgaXMgdXNlZCB0byBlaXRoZXIgY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiB0aGF0Ci0gKiBpcyBsb2NhdGVkIG9uIGFuIGVudGl0eS4KLSAqCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0Ci0gKiBAc2VlIEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2cgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtbkRpYWxvZzxQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBzaGVsbAotCSAqIEBwYXJhbSBlbnRpdHkgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMKLQkgKiBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nKFNoZWxsIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5IGVudGl0eSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCXN1cGVyKHBhcmVudCwgZW50aXR5LCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PiBidWlsZExheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXJldHVybiBuZXcgQmFzZUpvaW5Db2x1bW5EaWFsb2dQYW5lPFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3Q+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0KGdldE93bmVyKCksIGdldEpvaW5Db2x1bW4oKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvblRpdGxlKCkgewotCi0JCWlmIChnZXRKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5EaWFsb2dfZWRpdERlc2NyaXB0aW9uVGl0bGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uIGdldEpvaW5Db2x1bW4oKSB7Ci0JCXJldHVybiAoUHJpbWFyeUtleUpvaW5Db2x1bW4pIHN1cGVyLmdldEpvaW5Db2x1bW4oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRW50aXR5IGdldE93bmVyKCkgewotCQlyZXR1cm4gKEVudGl0eSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRpdGxlKCkgewotCi0JCWlmIChnZXRKb2luQ29sdW1uKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2FkZFRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uRGlhbG9nX2VkaXRUaXRsZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdiYzVmMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBUaGlzIGRpYWxvZyBpcyB1c2VkIHRvIGVpdGhlciBjcmVhdGUgb3IgZWRpdCBhIHByaW1hcnkga2V5IGpvaW5nIGNvbHVtbiB0aGF0Ci0gKiBpcyB3aXRoaW4gYSBzZWNvbmRhcnkgdGFibGUuCi0gKgotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbgotICogQHNlZSBTZWNvbmRhcnlUYWJsZQotICogQHNlZSBCYXNlSm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyBleHRlbmRzIEJhc2VKb2luQ29sdW1uRGlhbG9nPFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgc2hlbGwKLQkgKiBAcGFyYW0gc2Vjb25kYXJ5VGFibGUgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQKLQkgKiBpcyBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gRWl0aGVyIHRoZSBqb2luIGNvbHVtbiB0byBlZGl0IG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhpcyBzdGF0ZSBvYmplY3QgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb25lCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihwYXJlbnQsIHNlY29uZGFyeVRhYmxlLCBqb2luQ29sdW1uKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4gYnVpbGRMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlyZXR1cm4gbmV3IEJhc2VKb2luQ29sdW1uRGlhbG9nUGFuZTxQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdD4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCgKLQkJCWdldE93bmVyKCksCi0JCQlnZXRKb2luQ29sdW1uKCkKLQkJKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZERlc2NyaXB0aW9uVGl0bGU7Ci0JCX0KLQotCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXREZXNjcmlwdGlvblRpdGxlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlIGdldE93bmVyKCkgewotCQlyZXR1cm4gKFNlY29uZGFyeVRhYmxlKSBzdXBlci5nZXRPd25lcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0KLQkJaWYgKGdldEpvaW5Db2x1bW4oKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFRpdGxlOwotCQl9Ci0KLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZURpYWxvZ19lZGl0VGl0bGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZDFiMGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotLyoqCi0gKiBUaGUgc3RhdGUgb2JqZWN0IHVzZWQgdG8gY3JlYXRlIG9yIGVkaXQgYSBwcmltYXJ5IGtleSBqb2luIGNvbHVtbiBvbiBhbgotICogc2Vjb25kYXJ5IHRhYmxlLgotICoKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW4KLSAqIEBzZWUgU2Vjb25kYXJ5VGFibGUKLSAqIEBzZWUgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVTdGF0ZU9iamVjdCBleHRlbmRzIEJhc2VKb2luQ29sdW1uU3RhdGVPYmplY3QKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlByaW1hcnlLZXlKb2luQ29sdW1uSW5TZWNvbmRhcnlUYWJsZVN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzZWNvbmRhcnlUYWJsZSBUaGUgb3duZXIgb2YgdGhlIGpvaW4gY29sdW1uIHRvIGNyZWF0ZSBvciB3aGVyZSBpdAotCSAqIGlzIGxvY2F0ZWQKLQkgKiBAcGFyYW0gam9pbkNvbHVtbiBUaGUgam9pbiBjb2x1bW4gdG8gZWRpdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBpdCBpcyB0bwotCSAqIGNyZWF0ZSBhIG5ldyBvbmUKLQkgKi8KLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3QoU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQotCQlzdXBlcihzZWNvbmRhcnlUYWJsZSwgam9pbkNvbHVtbik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbiBnZXRKb2luQ29sdW1uKCkgewotCQlyZXR1cm4gKFByaW1hcnlLZXlKb2luQ29sdW1uKSBzdXBlci5nZXRKb2luQ29sdW1uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldE5hbWVUYWJsZSgpIHsKLQkJcmV0dXJuIGdldE93bmVyKCkuZ2V0RGJUYWJsZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChTZWNvbmRhcnlUYWJsZSkgc3VwZXIuZ2V0T3duZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFBhcmVudCgpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbml0aWFsVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldE5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTGlzdEl0ZXJhdG9yPFN0cmluZz4gdGFibGVzKCkgewotCQlyZXR1cm4gbmV3IFNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I8U3RyaW5nPihnZXRJbml0aWFsVGFibGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiMWMzMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgbyBQcmltYXJ5IGtleSBqb2luIGNvbHVtbnMgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8Ci0gKiB8IHwgICAgIChubyBhY3R1YWwgY29udGVudCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXB9Ci0gKiBAc2VlIHtAbGluayBQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5fQotICogQHNlZSB7QGxpbmsgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lIAotCWV4dGVuZHMgQWJzdHJhY3RKb2luaW5nU3RyYXRlZ3lQYW5lCi0JCTxQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCwgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneT4KLXsKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKAotCQkJUGFuZTw/IGV4dGVuZHMgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA+IHBhcmVudFBhbmUsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIGJ1aWxkVXNlc1ByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5PiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcgotCQkJCTxQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCwgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneT4oCi0JCQkJCWdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGJ1aWxkU3RyYXRlZ3lEZXRhaWxzQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwLCBCb29sZWFuPigKLQkJCQlzdWJqZWN0SG9sZGVyLCBSZWFkT25seVJlbGF0aW9uc2hpcC5TVFJBVEVHWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJCXJldHVybiAodGhpcy5zdWJqZWN0ID09IG51bGwpID8gQm9vbGVhbi5GQUxTRSA6Ci0JCQkJCUJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3Quc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlID09IEJvb2xlYW4uVFJVRSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0U3RyYXRlZ3lUb1ByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQkJfQotCQkJCS8vdmFsdWUgPT0gRkFMU0UgLSBzZWxlY3Rpb24gb2YgYW5vdGhlciByYWRpbyBidXR0b24gY2F1c2VzIHRoaXMgc3RyYXRlZ3kgdG8gZ2V0IHVuc2V0Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMWU4ZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlNpbmdsZUVsZW1lbnRMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogVGhlIHN0YXRlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSBvciBlZGl0IGEgcHJpbWFyeSBrZXkgam9pbiBjb2x1bW4gb24gYW4KLSAqIGVudGl0eS4KLSAqCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZwotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbkRpYWxvZ1BhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uU3RhdGVPYmplY3QgZXh0ZW5kcyBCYXNlSm9pbkNvbHVtblN0YXRlT2JqZWN0Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0PC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBlbnRpdHkgVGhlIG93bmVyIG9mIHRoZSBqb2luIGNvbHVtbiB0byBjcmVhdGUgb3Igd2hlcmUgaXQgaXMKLQkgKiBsb2NhdGVkCi0JICogQHBhcmFtIGpvaW5Db2x1bW4gVGhlIGpvaW4gY29sdW1uIHRvIGVkaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBpcwotCSAqIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9uZQotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtblN0YXRlT2JqZWN0KEVudGl0eSBlbnRpdHksCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCQlzdXBlcihlbnRpdHksIGpvaW5Db2x1bW4pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFRhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW4gZ2V0Sm9pbkNvbHVtbigpIHsKLQkJcmV0dXJuIChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgc3VwZXIuZ2V0Sm9pbkNvbHVtbigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBUYWJsZSBnZXROYW1lVGFibGUoKSB7Ci0JCXJldHVybiBnZXRPd25lcigpLmdldFByaW1hcnlEYlRhYmxlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIEVudGl0eSBnZXRPd25lcigpIHsKLQkJcmV0dXJuIChFbnRpdHkpIHN1cGVyLmdldE93bmVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIFRhYmxlIGdldFJlZmVyZW5jZWROYW1lVGFibGUoKSB7Ci0JCUVudGl0eSBwYXJlbnRFbnRpdHkgPSBnZXRPd25lcigpLmdldFBhcmVudEVudGl0eSgpOwotCQlyZXR1cm4gKHBhcmVudEVudGl0eSA9PSBudWxsKSA/IGdldE93bmVyKCkuZ2V0UHJpbWFyeURiVGFibGUoKSA6IHBhcmVudEVudGl0eS5nZXRQcmltYXJ5RGJUYWJsZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5pdGlhbFRhYmxlKCkgewotCQlyZXR1cm4gZ2V0T3duZXIoKS5nZXRQcmltYXJ5VGFibGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IHRhYmxlcygpIHsKLQkJcmV0dXJuIG5ldyBTaW5nbGVFbGVtZW50TGlzdEl0ZXJhdG9yPFN0cmluZz4oZ2V0SW5pdGlhbFRhYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1ByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRmNzQ1Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlCYXNlSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seU5hbWVkQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgU2Vjb25kYXJ5VGFibGUKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1uSG9sZGVyOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SVNlY29uZGFyeVRhYmxlPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seVNlY29uZGFyeVRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQl2b2lkIGFkZEpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHN0YXRlT2JqZWN0LmdldE93bmVyKCk7Ci0JCWludCBpbmRleCA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oaW5kZXgpOwotCQlzdGF0ZU9iamVjdC51cGRhdGVKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlRGlhbG9nKGdldFNoZWxsKCksIChTZWNvbmRhcnlUYWJsZSkgZ2V0U3ViamVjdCgpLCBudWxsKTsKLQotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkaWFsb2cud2FzQ29uZmlybWVkKCkpIHsKLQkJCWFkZEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZENvbnRyb2xCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5U2Vjb25kYXJ5VGFibGUsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBCb29sZWFuLkZBTFNFOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCF2YWx1ZS5pc1ZpcnR1YWwoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZSwgUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBSZWFkT25seVNlY29uZGFyeVRhYmxlLkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+KAotCQkJYnVpbGREZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpCi0JCSk7Ci0JfQotCi0JU3RyaW5nIGJ1aWxkSm9pbkNvbHVtbkxhYmVsKFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbikgewotCi0JCWlmIChqb2luQ29sdW1uLmlzRGVmYXVsdCgpKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlpZiAoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkgPT0gbnVsbCkgewotCQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNCb3RoRGVmYXVsdCwKLQkJCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkJCSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBOTFMuYmluZCgKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXNGaXJzdERlZmF1bHQsCi0JCQkJam9pbkNvbHVtbi5nZXROYW1lKCksCi0JCQkJam9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpCi0JCQkpOwotCQl9Ci0KLQkJaWYgKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX21hcHBpbmdCZXR3ZWVuVHdvUGFyYW1zU2VjRGVmYXVsdCwKLQkJCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCQlqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkKLQkJCSk7Ci0JCX0KLQotCQlyZXR1cm4gTkxTLmJpbmQoCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfbWFwcGluZ0JldHdlZW5Ud29QYXJhbXMsCi0JCQlqb2luQ29sdW1uLmdldE5hbWUoKSwKLQkJCWpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKQotCQkpOwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRKb2luQ29sdW1uc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uKSBlbGVtZW50OwotCQkJCXJldHVybiBidWlsZEpvaW5Db2x1bW5MYWJlbChqb2luQ29sdW1uKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVQYW5lLkFkYXB0ZXIgYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGhhc09wdGlvbmFsQnV0dG9uKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgb3B0aW9uYWxCdXR0b25UZXh0KCkgewotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGVfZWRpdDsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcHRpb25PblNlbGVjdGlvbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCXJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKGxpc3RTZWxlY3Rpb25Nb2RlbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5MaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+LCBSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPigKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5zTGlzdEhvbGRlcigpLAotCQkJUmVhZE9ubHlOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSwKLQkJCVJlYWRPbmx5TmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZLAotCQkJUmVhZE9ubHlCYXNlSm9pbkNvbHVtbi5TUEVDSUZJRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9QUk9QRVJUWSwKLQkJCVJlYWRPbmx5QmFzZUpvaW5Db2x1bW4uREVGQVVMVF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCi0JTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZSwgUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBSZWFkT25seVNlY29uZGFyeVRhYmxlLlNQRUNJRklFRF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uPihzdWJqZWN0LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGVkaXRQcmltYXJ5S2V5Sm9pbkNvbHVtbihPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbikgbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWUoKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkluU2Vjb25kYXJ5VGFibGVEaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQkoU2Vjb25kYXJ5VGFibGUpIGdldFN1YmplY3QoKSwKLQkJCQlqb2luQ29sdW1uCi0JCQkpOwotCi0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJZWRpdFByaW1hcnlLZXlKb2luQ29sdW1uKGRpYWxvZy5nZXRTdWJqZWN0KCkpOwotCQl9Ci0JfQotCi0Jdm9pZCBlZGl0UHJpbWFyeUtleUpvaW5Db2x1bW4oUHJpbWFyeUtleUpvaW5Db2x1bW5JblNlY29uZGFyeVRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJam9pbkNvbHVtbkhvbGRlciA9IGJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5Ib2xkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQotCQlHcm91cCBncm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZV9wcmltYXJ5S2V5Sm9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgY2hlY2sgYm94Ci0JCWFkZENoZWNrQm94KAotCQkJYWRkU3ViUGFuZShncm91cFBhbmUsIDgpLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlX292ZXJyaWRlRGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucywKLQkJCWJ1aWxkT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpLAotCQkJbnVsbCwKLQkJCWJ1aWxkQ29udHJvbEJvb2xlYW5Ib2xkZXIoKQotCQkpOwotCi0JCS8vIFByaW1hcnkgS2V5IEpvaW4gQ29sdW1ucyBsaXN0IHBhbmUKLQkJQWRkUmVtb3ZlTGlzdFBhbmU8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4gam9pbkNvbHVtbnNQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+KAotCQkJdGhpcywKLQkJCWdyb3VwUGFuZSwKLQkJCWJ1aWxkUHJpbWFyeUtleUpvaW5Db2x1bW5BZGFwdGVyKCksCi0JCQlidWlsZFByaW1hcnlLZXlKb2luQ29sdW1uc0xpc3RNb2RlbCgpLAotCQkJam9pbkNvbHVtbkhvbGRlciwKLQkJCWJ1aWxkSm9pbkNvbHVtbnNMaXN0TGFiZWxQcm92aWRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19KT0lOX1RBQkxFX0NPTFVNTlMKLQkJKTsKLQotCQlpbnN0YWxsUHJpbWFyeUtleUpvaW5Db2x1bW5MaXN0UGFuZUVuYWJsZXIoam9pbkNvbHVtbnNQYW5lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFByaW1hcnlLZXlKb2luQ29sdW1uTGlzdFBhbmVFbmFibGVyKEFkZFJlbW92ZUxpc3RQYW5lPFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+IHBrSm9pbkNvbHVtbkxpc3RQYW5lKSB7Ci0KLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJYnVpbGRPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCksCi0JCQlwa0pvaW5Db2x1bW5MaXN0UGFuZQotCQkpOwotCX0KLQotCXZvaWQgcmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQlpbnRbXSBzZWxlY3RlZEluZGljZXMgPSBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRJbmRpY2VzKCk7Ci0KLQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyAtLWluZGV4ID49IDA7ICkgewotCQkJKChTZWNvbmRhcnlUYWJsZSkgZ2V0U3ViamVjdCgpKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJfQotCX0KLQotCXZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoYm9vbGVhbiBzZWxlY3RlZCkgewotCi0JCWlmIChpc1BvcHVsYXRpbmcoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0UG9wdWxhdGluZyh0cnVlKTsKLQotCQl0cnkgewotCQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGUpIGdldFN1YmplY3QoKTsKLQotCQkJLy8gQWRkIGEgam9pbiBjb2x1bW4gYnkgY3JlYXRpbmcgYSBzcGVjaWZpZWQgb25lIHVzaW5nIHRoZSBkZWZhdWx0Ci0JCQkvLyBvbmUgaWYgaXQgZXhpc3RzCi0JCQlpZiAoc2VsZWN0ZWQpIHsKLQotCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0KLQkJCQlpZiAoZGVmYXVsdEpvaW5Db2x1bW4gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCi0JCQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkJCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKHJlZmVyZW5jZWRDb2x1bW5OYW1lKTsKLQotCQkJCQlqb2luQ29sdW1uSG9sZGVyLnNldFZhbHVlKHBrSm9pbkNvbHVtbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZm9yIChpbnQgaW5kZXggPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQkJCXNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlciBleHRlbmRzIExpc3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEJvb2xlYW4+Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gewotCi0JCXB1YmxpYyBPdmVycmlkZURlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQkJc3VwZXIoYnVpbGRTcGVjaWZpZWRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5idWlsZFZhbHVlXygpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSB0YWJsZSA9IGdldFN1YmplY3QoKTsKLQkJCXJldHVybiAodGFibGUgIT0gbnVsbCkgJiYgISB0YWJsZS5pc1ZpcnR1YWwoKSAmJiBsaXN0SG9sZGVyLnNpemUoKSA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQl1cGRhdGVKb2luQ29sdW1ucyh2YWx1ZS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1F1ZXJpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9RdWVyaWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjZTJlMDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1F1ZXJpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci0KLS8qKgotICogVGhpcyBwYW5lIHNob3dzIHRoZSBsaXN0IG9mIG5hbWVkIHF1ZXJpZXMgYW5kIG5hbWVkIG5hdGl2ZSBxdWVyaWVzLgotICogPHA+Ci0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZSBvciBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eQotICogQHNlZSBRdWVyeQotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5Ci0gKiBAc2VlIE5hbWVkUXVlcnkKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUKLSAqIEBzZWUgTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWVyaWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxRdWVyeUNvbnRhaW5lcj4KLXsKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5Q29udGFpbmVyPiBsaXN0UGFuZTsKLQlOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUgbmFtZWROYXRpdmVRdWVyeVBhbmU7Ci0JUGFuZTw/IGV4dGVuZHMgTmFtZWRRdWVyeT4gbmFtZWRRdWVyeVBhbmU7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeT4gcXVlcnlIb2xkZXI7Ci0KLQotCXB1YmxpYyBRdWVyaWVzQ29tcG9zaXRlKAotCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFF1ZXJ5Q29udGFpbmVyPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCXZvaWQgYWRkUXVlcnkoKSB7Ci0JCWFkZFF1ZXJ5RnJvbURpYWxvZyhidWlsZEFkZFF1ZXJ5RGlhbG9nKCkpOwotCX0KLQotCXByb3RlY3RlZCBBZGRRdWVyeURpYWxvZyBidWlsZEFkZFF1ZXJ5RGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IEFkZFF1ZXJ5RGlhbG9nKGdldFNoZWxsKCksIHRoaXMuZ2V0U3ViamVjdCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWVyeUZyb21EaWFsb2coQWRkUXVlcnlEaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBxdWVyeVR5cGUgPSBkaWFsb2cuZ2V0UXVlcnlUeXBlKCk7Ci0JCVF1ZXJ5IHF1ZXJ5OwotCQlpZiAocXVlcnlUeXBlID09IEFkZFF1ZXJ5RGlhbG9nLk5BTUVEX1FVRVJZKSB7Ci0JCQlxdWVyeSA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZE5hbWVkUXVlcnkoKTsKLQkJfQotCQllbHNlIGlmIChxdWVyeVR5cGUgPT0gQWRkUXVlcnlEaWFsb2cuTkFNRURfTkFUSVZFX1FVRVJZKSB7Ci0JCQlxdWVyeSA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQlxdWVyeS5zZXROYW1lKGRpYWxvZy5nZXROYW1lKCkpOwotCQl0aGlzLmdldFF1ZXJ5SG9sZGVyKCkuc2V0VmFsdWUocXVlcnkpOy8vc28gdGhhdCBpdCBnZXRzIHNlbGVjdGVkIGluIHRoZSBMaXN0IGZvciB0aGUgdXNlciB0byBlZGl0Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxRdWVyeT4gYnVpbGREaXNwbGF5YWJsZVF1ZXJpZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxRdWVyeT4oCi0JCQlidWlsZFF1ZXJpZXNMaXN0SG9sZGVyKCksCi0JCQlRdWVyeS5OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgQWRkUmVtb3ZlTGlzdFBhbmU8UXVlcnlDb250YWluZXI+IGFkZExpc3RQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFF1ZXJ5Q29udGFpbmVyPigKLQkJCXRoaXMsCi0JCQljb250YWluZXIsCi0JCQlidWlsZFF1ZXJpZXNBZGFwdGVyKCksCi0JCQlidWlsZERpc3BsYXlhYmxlUXVlcmllc0xpc3RIb2xkZXIoKSwKLQkJCXRoaXMuZ2V0UXVlcnlIb2xkZXIoKSwKLQkJCWJ1aWxkUXVlcmllc0xpc3RMYWJlbFByb3ZpZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX05BTUVEX1FVRVJJRVMKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE5hbWVkTmF0aXZlUXVlcnk+IGJ1aWxkTmFtZWROYXRpdmVRdWVyaWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxRdWVyeUNvbnRhaW5lciwgTmFtZWROYXRpdmVRdWVyeT4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlRdWVyeUNvbnRhaW5lci5OQU1FRF9OQVRJVkVfUVVFUklFU19MSVNUKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TmFtZWROYXRpdmVRdWVyeT4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPE5hbWVkTmF0aXZlUXVlcnk+KHRoaXMuc3ViamVjdC5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxOYW1lZE5hdGl2ZVF1ZXJ5PiBidWlsZE5hbWVkTmF0aXZlUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnksIE5hbWVkTmF0aXZlUXVlcnk+KHRoaXMuZ2V0UXVlcnlIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTmFtZWROYXRpdmVRdWVyeSB0cmFuc2Zvcm1fKFF1ZXJ5IHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE5hbWVkTmF0aXZlUXVlcnkpID8gKE5hbWVkTmF0aXZlUXVlcnkpIHZhbHVlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE5hbWVkUXVlcnk+IGJ1aWxkTmFtZWRRdWVyaWVzTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxRdWVyeUNvbnRhaW5lciwgTmFtZWRRdWVyeT4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlRdWVyeUNvbnRhaW5lci5OQU1FRF9RVUVSSUVTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxOYW1lZFF1ZXJ5PiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8TmFtZWRRdWVyeT4odGhpcy5zdWJqZWN0LmdldE5hbWVkUXVlcmllcygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPE5hbWVkUXVlcnk+IGJ1aWxkTmFtZWRRdWVyeUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeSwgTmFtZWRRdWVyeT4odGhpcy5nZXRRdWVyeUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOYW1lZFF1ZXJ5IHRyYW5zZm9ybV8oUXVlcnkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgTmFtZWRRdWVyeSkgPyAoTmFtZWRRdWVyeSkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8UXVlcnksIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPFF1ZXJ5LCBDb250cm9sPigpIHsKLQkJCXB1YmxpYyBDb250cm9sIHRyYW5zZm9ybShRdWVyeSBxdWVyeSkgewotCi0JCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKHF1ZXJ5IGluc3RhbmNlb2YgTmFtZWROYXRpdmVRdWVyeSkgewotCQkJCQlyZXR1cm4gUXVlcmllc0NvbXBvc2l0ZS50aGlzLm5hbWVkTmF0aXZlUXVlcnlQYW5lLmdldENvbnRyb2woKTsKLQkJCQl9Ci0KLQkJCQlyZXR1cm4gUXVlcmllc0NvbXBvc2l0ZS50aGlzLm5hbWVkUXVlcnlQYW5lLmdldENvbnRyb2woKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUXVlcmllc0FkYXB0ZXIoKSB7Ci0KLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFkZE5ld0l0ZW0oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWFkZFF1ZXJ5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIE5hbWVkUXVlcnkpIHsKLQkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVOYW1lZFF1ZXJ5KChOYW1lZFF1ZXJ5KSBpdGVtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWdldFN1YmplY3QoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KChOYW1lZE5hdGl2ZVF1ZXJ5KSBpdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5PiBidWlsZFF1ZXJpZXNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkTmFtZWRRdWVyaWVzTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGROYW1lZE5hdGl2ZVF1ZXJpZXNMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBRdWVyeT4sIFF1ZXJ5PihsaXN0KTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkUXVlcmllc0xpc3RMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCVF1ZXJ5IHF1ZXJ5ID0gKFF1ZXJ5KSBlbGVtZW50OwotCQkJCVN0cmluZyBuYW1lID0gcXVlcnkuZ2V0TmFtZSgpOwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQlpbnQgaW5kZXggPSAtMTsKLQotCQkJCQlpZiAocXVlcnkgaW5zdGFuY2VvZiBOYW1lZFF1ZXJ5KSB7Ci0JCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldFN1YmplY3QoKS5nZXROYW1lZFF1ZXJpZXMoKSwgcXVlcnkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihnZXRTdWJqZWN0KCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCksIHF1ZXJ5KTsKLQkJCQkJfQotCi0JCQkJCW5hbWUgPSBOTFMuYmluZChKcHRVaURldGFpbHNNZXNzYWdlcy5RdWVyaWVzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmcsIEludGVnZXIudmFsdWVPZihpbmRleCkpOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnk+IGJ1aWxkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5PigpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGVuYWJsZVdpZGdldHMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLmVuYWJsZVdpZGdldHMoZW5hYmxlZCk7Ci0JCXRoaXMubGlzdFBhbmUuZW5hYmxlV2lkZ2V0cyhlbmFibGVkKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMucXVlcnlIb2xkZXIgPSBidWlsZFF1ZXJ5SG9sZGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCXRoaXMubGlzdFBhbmUgPSB0aGlzLmFkZExpc3RQYW5lKGNvbnRhaW5lcik7Ci0KLQkJLy8gUHJvcGVydHkgcGFuZQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gTmFtZWQgUXVlcnkgcHJvcGVydHkgcGFuZQotCQl0aGlzLm5hbWVkUXVlcnlQYW5lID0gdGhpcy5idWlsZE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShwYWdlQm9vayk7Ci0KLQkJLy8gTmFtZWQgTmF0aXZlIFF1ZXJ5IHByb3BlcnR5IHBhbmUKLQkJdGhpcy5uYW1lZE5hdGl2ZVF1ZXJ5UGFuZSA9IG5ldyBOYW1lZE5hdGl2ZVF1ZXJ5UHJvcGVydHlDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJdGhpcy5idWlsZE5hbWVkTmF0aXZlUXVlcnlIb2xkZXIoKSwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0KLQkJaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCQotCXByb3RlY3RlZCBQYW5lPD8gZXh0ZW5kcyBOYW1lZFF1ZXJ5PiBidWlsZE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaykgewotCQlyZXR1cm4gbmV3IE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZTxOYW1lZFF1ZXJ5PigKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkTmFtZWRRdWVyeUhvbGRlcigpLAotCQkJcGFnZUJvb2sKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVTd2l0Y2hlcihQYWdlQm9vayBwYWdlQm9vaykgewotCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMuZ2V0UXVlcnlIb2xkZXIoKSwgdGhpcy5idWlsZFBhbmVUcmFuc2Zvcm1lcigpLCBwYWdlQm9vayk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeT4gZ2V0UXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBxdWVyeUhvbGRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1F1ZXJ5SGludHNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9RdWVyeUhpbnRzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGM0OTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1F1ZXJ5SGludHNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxNb2RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UZXh0Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnN3dC5Db2x1bW5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlVGFibGVQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVQYW5lLkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5TdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQWRkUmVtb3ZlVGFibGVQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFF1ZXJ5Ci0gKiBAc2VlIFF1ZXJ5SGludAotICogQHNlZSBBZGRSZW1vdmVUYWJsZVBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUXVlcnlIaW50c0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UXVlcnk+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUhpbnQ+IHF1ZXJ5SGludEhvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UXVlcnlIaW50c0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFF1ZXJ5SGludHNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgUXVlcnk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRQYW5lRW5hYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFF1ZXJ5IHF1ZXJ5KSB7Ci0JCQkJcmV0dXJuIChxdWVyeSAhPSBudWxsKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRRdWVyeUhpbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEFkZFJlbW92ZVRhYmxlUGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gZ2V0U3ViamVjdCgpLmFkZEhpbnQoZ2V0U3ViamVjdCgpLmdldEhpbnRzU2l6ZSgpKTsKLQkJCQlxdWVyeUhpbnRIb2xkZXIuc2V0VmFsdWUocXVlcnlIaW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVIaW50KChRdWVyeUhpbnQpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5SGludD4gYnVpbGRRdWVyeUhpbnRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5SGludD4oKTsKLQl9OwotCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkUXVlcnlIaW50TGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFF1ZXJ5SGludD4gYnVpbGRRdWVyeUhpbnRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFF1ZXJ5LCBRdWVyeUhpbnQ+KGdldFN1YmplY3RIb2xkZXIoKSwgTmFtZWRRdWVyeS5ISU5UU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UXVlcnlIaW50PiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdXBlckxpc3RJdGVyYWJsZVdyYXBwZXI8UXVlcnlIaW50Pih0aGlzLnN1YmplY3QuZ2V0SGludHMoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRIaW50c1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXF1ZXJ5SGludEhvbGRlciA9IGJ1aWxkUXVlcnlIaW50SG9sZGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJVGFibGVQYW5lIHRhYmxlUGFuZSA9IG5ldyBUYWJsZVBhbmUoY29udGFpbmVyKTsKLQkJaW5zdGFsbFBhbmVFbmFibGVyKHRhYmxlUGFuZSk7Ci0JfQotCi0JcHJpdmF0ZSBQYW5lRW5hYmxlciBpbnN0YWxsUGFuZUVuYWJsZXIoVGFibGVQYW5lIHRhYmxlUGFuZSkgewotCQlyZXR1cm4gbmV3IFBhbmVFbmFibGVyKGJ1aWxkUGFuZUVuYWJsZUhvbGRlcigpLCB0YWJsZVBhbmUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIgaW1wbGVtZW50cyBDb2x1bW5BZGFwdGVyPFF1ZXJ5SGludD4gewotCi0JCXN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0NPVU5UID0gMjsKLQkJc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTl9JTkRFWCA9IDA7Ci0JCXN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfQ09MVU1OX0lOREVYID0gMTsKLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKFF1ZXJ5SGludCBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxRdWVyeUhpbnQsIFN0cmluZz4oUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQlzdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IGJ1aWxkVmFsdWVIb2xkZXIoUXVlcnlIaW50IHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFF1ZXJ5SGludCwgU3RyaW5nPihRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFksIHN1YmplY3QpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWx1ZSgpOwotCQkJCX0KLQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJc3ViamVjdC5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXB1YmxpYyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGNlbGxNb2RlbHMoUXVlcnlIaW50IHN1YmplY3QpIHsKLQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W10gbW9kZWxzID0gbmV3IFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+W0NPTFVNTl9DT1VOVF07Ci0JCQltb2RlbHNbTkFNRV9DT0xVTU5fSU5ERVhdICA9IGJ1aWxkTmFtZUhvbGRlcihzdWJqZWN0KTsKLQkJCW1vZGVsc1tWQUxVRV9DT0xVTU5fSU5ERVhdID0gYnVpbGRWYWx1ZUhvbGRlcihzdWJqZWN0KTsKLQkJCXJldHVybiBtb2RlbHM7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbHVtbkNvdW50KCkgewotCQkJcmV0dXJuIENPTFVNTl9DT1VOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29sdW1uTmFtZShpbnQgY29sdW1uSW5kZXgpIHsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgUXVlcnlIaW50Q29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTl9JTkRFWDogewotCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMuUXVlcnlIaW50c0NvbXBvc2l0ZV9uYW1lQ29sdW1uOwotCQkJCX0KLQotCQkJCWNhc2UgUXVlcnlIaW50Q29sdW1uQWRhcHRlci5WQUxVRV9DT0xVTU5fSU5ERVg6IHsKLQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlF1ZXJ5SGludHNDb21wb3NpdGVfdmFsdWVDb2x1bW47Ci0JCQkJfQotCi0JCQkJZGVmYXVsdDogewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0KLQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSBlbGVtZW50OwotCQkJU3RyaW5nIHZhbHVlID0gIiI7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuTkFNRV9DT0xVTU5fSU5ERVg6IHsKLQkJCQkJdmFsdWUgPSBxdWVyeUhpbnQuZ2V0TmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIFF1ZXJ5SGludENvbHVtbkFkYXB0ZXIuVkFMVUVfQ09MVU1OX0lOREVYOiB7Ci0JCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldFZhbHVlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9ICIiOwotCQkJfQotCi0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRhYmxlUGFuZSBleHRlbmRzIEFkZFJlbW92ZVRhYmxlUGFuZTxRdWVyeT4gewotCi0JCXByaXZhdGUgVGFibGVQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKFF1ZXJ5SGludHNDb21wb3NpdGUudGhpcywKLQkJCSAgICAgIHBhcmVudCwKLQkJCSAgICAgIGJ1aWxkUXVlcnlIaW50QWRhcHRlcigpLAotCQkJICAgICAgYnVpbGRRdWVyeUhpbnRMaXN0SG9sZGVyKCksCi0JCQkgICAgICBxdWVyeUhpbnRIb2xkZXIsCi0JCQkgICAgICBidWlsZFF1ZXJ5SGludExhYmVsUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENlbGxFZGl0b3JbXSBidWlsZENlbGxFZGl0b3JzKFRhYmxlIHRhYmxlKSB7Ci0JCQlyZXR1cm4gbmV3IENlbGxFZGl0b3JbXSB7Ci0JCQkJbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKSwKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IodGFibGUpCi0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGJ1aWxkQ2VsbE1vZGlmaWVyKCkgewotCQkJcmV0dXJuIG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSAoUXVlcnlIaW50KSBlbGVtZW50OwotCQkJCQlTdHJpbmcgdmFsdWUgPSAiIjsKLQotCQkJCQlpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldE5hbWUoKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJCXZhbHVlID0gcXVlcnlIaW50LmdldFZhbHVlKCk7Ci0JCQkJCX0KLQotCQkJCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCQkJdmFsdWUgPSAiIjsKLQkJCQkJfQotCi0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJCVF1ZXJ5SGludCBxdWVyeUhpbnQ7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBlbGVtZW50OwotCQkJCQkJcXVlcnlIaW50ID0gKFF1ZXJ5SGludCkgdGFibGVJdGVtLmdldERhdGEoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXF1ZXJ5SGludCA9IChRdWVyeUhpbnQpIGVsZW1lbnQ7Ci0JCQkJCX0KLQotCQkJCQlpZiAocHJvcGVydHkgPT0gUXVlcnlIaW50Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCSBxdWVyeUhpbnQuc2V0TmFtZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChwcm9wZXJ0eSA9PSBRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkpIHsKLQkJCQkJCSBxdWVyeUhpbnQuc2V0VmFsdWUodmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2x1bW5BZGFwdGVyPD8+IGJ1aWxkQ29sdW1uQWRhcHRlcigpIHsKLQkJCXJldHVybiBuZXcgUXVlcnlIaW50Q29sdW1uQWRhcHRlcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmdbXSBidWlsZENvbHVtblByb3BlcnRpZXMoKSB7Ci0JCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCQlRdWVyeUhpbnQuTkFNRV9QUk9QRVJUWSwKLQkJCQlRdWVyeUhpbnQuVkFMVUVfUFJPUEVSVFkKLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRlciBhZGFwdGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0VmFsdWVNb2RlbDw/PiBsaXN0SG9sZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PiBzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCYXNlTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVscElkKSB7Ci0KLQkJCXN1cGVyLmluaXRpYWxpemVNYWluQ29tcG9zaXRlKAotCQkJCWNvbnRhaW5lciwKLQkJCQlhZGFwdGVyLAotCQkJCWxpc3RIb2xkZXIsCi0JCQkJc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJCWxhYmVsUHJvdmlkZXIsCi0JCQkJaGVscElkCi0JCQkpOwotCi0JCQlUYWJsZSB0YWJsZSA9IGdldE1haW5Db250cm9sKCk7Ci0KLQkJCVRhYmxlVmlld2VyIHRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJCXRhYmxlVmlld2VyLnNldENlbGxFZGl0b3JzKGJ1aWxkQ2VsbEVkaXRvcnModGFibGUpKTsKLQkJCXRhYmxlVmlld2VyLnNldENlbGxNb2RpZmllcihidWlsZENlbGxNb2RpZmllcigpKTsKLQkJCXRhYmxlVmlld2VyLnNldENvbHVtblByb3BlcnRpZXMoYnVpbGRDb2x1bW5Qcm9wZXJ0aWVzKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9SZWZlcmVuY2VUYWJsZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1JlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZTgxZmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1JlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlJlYWRPbmx5V3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5WYWx1ZUxpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5TdGF0ZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5TdGF0ZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlZmVyZW5jZVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5zQ29tcG9zaXRlLkpvaW5Db2x1bW5zRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5UYWJsZUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlPFQgZXh0ZW5kcyBSZWFkT25seVJlZmVyZW5jZVRhYmxlPgotCWV4dGVuZHMgUGFuZTxUPgotewotCXByb3RlY3RlZCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveDsKLQotCXByb3RlY3RlZCBKb2luQ29sdW1uc0NvbXBvc2l0ZTxUPiBqb2luQ29sdW1uc0NvbXBvc2l0ZTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVmZXJlbmNlVGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHJvdGVjdGVkIFJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UmVmZXJlbmNlVGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Db2xsZWN0aW9uVGFibGUyXzA8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgUmVmZXJlbmNlVGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcihKb2luQ29sdW1uc0NvbXBvc2l0ZTxUPiBwYW5lKSB7Ci0JCXBhbmUuaW5zdGFsbEpvaW5Db2x1bW5zUGFuZUVuYWJsZXIobmV3IEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlcigpKTsKLQl9Ci0KLQl2b2lkIGFkZEpvaW5Db2x1bW4oVCByZWZlcmVuY2VUYWJsZSkgewotCi0JCUpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlRGlhbG9nIGRpYWxvZyA9Ci0JCQluZXcgSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2coZ2V0U2hlbGwoKSwgcmVmZXJlbmNlVGFibGUsIG51bGwpOwotCi0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJYWRkSm9pbkNvbHVtbkZyb21EaWFsb2coZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGFkZEpvaW5Db2x1bW5Gcm9tRGlhbG9nKEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gKChSZWZlcmVuY2VUYWJsZSkgZ2V0U3ViamVjdCgpKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKCk7Ci0JCXN0YXRlT2JqZWN0LnVwZGF0ZUpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCXRoaXMuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZEpvaW5Db2x1bW4oSm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0JCXRoaXMuam9pbkNvbHVtbnNDb21wb3NpdGUuc2V0U2VsZWN0ZWRKb2luQ29sdW1uKGpvaW5Db2x1bW4pOwotCX0KLQotCXByb3RlY3RlZCBKb2luQ29sdW1uc1Byb3ZpZGVyIGJ1aWxkSm9pbkNvbHVtbnNFZGl0b3IoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbnNQcm92aWRlcigpOwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgT3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbkhvbGRlcigpOwotCX0KLQkJCi0JTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlKb2luQ29sdW1uPiBidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxULCBSZWFkT25seUpvaW5Db2x1bW4+KGdldFN1YmplY3RIb2xkZXIoKSwgUmVhZE9ubHlSZWZlcmVuY2VUYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxSZWFkT25seUpvaW5Db2x1bW4+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxSZWFkT25seUpvaW5Db2x1bW4+KHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAxMCwgZ3JvdXBCb3hNYXJnaW4pOwotCX0KLQotCXByb3RlY3RlZCBUYWJsZUNvbWJvPFQ+IGFkZFRhYmxlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgVGFibGVDb21ibzxUPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seVRhYmxlLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seVRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFJlYWRPbmx5VGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBSZWFkT25seVRhYmxlLlNQRUNJRklFRF9TQ0hFTUFfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFJlYWRPbmx5VGFibGUuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBSZWFkT25seVRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgewotCQkJCQlyZXBvcHVsYXRlKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCSgoUmVmZXJlbmNlVGFibGUpIHRoaXMuZ2V0U3ViamVjdCgpKS5zZXRTcGVjaWZpZWROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYSBnZXREYlNjaGVtYV8oKSB7Ci0JCQkJUmVmZXJlbmNlVGFibGUgdGFibGUgPSB0aGlzLmdldFRhYmxlKCk7Ci0JCQkJcmV0dXJuICh0YWJsZSA9PSBudWxsKSA/IG51bGwgOiB0YWJsZS5nZXREYlNjaGVtYSgpOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgUmVmZXJlbmNlVGFibGUgZ2V0VGFibGUoKSB7Ci0JCQkJUmVhZE9ubHlSZWZlcmVuY2VUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQkJCXJldHVybiAodGFibGUgaW5zdGFuY2VvZiBSZWZlcmVuY2VUYWJsZSkgPyAoUmVmZXJlbmNlVGFibGUpIHRhYmxlIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFNjaGVtYUNvbWJvPFQ+IGFkZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPFQ+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5VGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5VGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFJlYWRPbmx5VGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBSZWFkT25seVRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gUmVhZE9ubHlUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCSgoUmVmZXJlbmNlVGFibGUpIHRoaXMuZ2V0U3ViamVjdCgpKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCkgewotCQkJCVJlZmVyZW5jZVRhYmxlIHRhYmxlID0gdGhpcy5nZXRUYWJsZSgpOwotCQkJCXJldHVybiAodGFibGUgPT0gbnVsbCkgPyBudWxsIDogdGFibGUuZ2V0RGJTY2hlbWFDb250YWluZXIoKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIFJlZmVyZW5jZVRhYmxlIGdldFRhYmxlKCkgewotCQkJCVJlYWRPbmx5UmVmZXJlbmNlVGFibGUgdGFibGUgPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJCQlyZXR1cm4gKHRhYmxlIGluc3RhbmNlb2YgUmVmZXJlbmNlVGFibGUpID8gKFJlZmVyZW5jZVRhYmxlKSB0YWJsZSA6IG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBDYXRhbG9nQ29tYm88VD4gYWRkQ2F0YWxvZ0NvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENhdGFsb2dDb21ibzxUPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChSZWFkT25seVRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUmVhZE9ubHlUYWJsZS5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJKChSZWZlcmVuY2VUYWJsZSkgdGhpcy5nZXRTdWJqZWN0KCkpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIGVkaXRKb2luQ29sdW1uKFJlYWRPbmx5Sm9pbkNvbHVtbiBqb2luQ29sdW1uKSB7Ci0KLQkJSm9pbkNvbHVtbkluUmVmZXJlbmNlVGFibGVEaWFsb2cgZGlhbG9nID0KLQkJCW5ldyBKb2luQ29sdW1uSW5SZWZlcmVuY2VUYWJsZURpYWxvZyhnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCksIGpvaW5Db2x1bW4pOwotCi0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy53YXNDb25maXJtZWQoKSkgewotCQkJZWRpdEpvaW5Db2x1bW4oZGlhbG9nLmdldFN1YmplY3QoKSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGVkaXRKb2luQ29sdW1uKEpvaW5Db2x1bW5JblJlZmVyZW5jZVRhYmxlU3RhdGVPYmplY3Qgc3RhdGVPYmplY3QpIHsKLQkJc3RhdGVPYmplY3QudXBkYXRlSm9pbkNvbHVtbihzdGF0ZU9iamVjdC5nZXRKb2luQ29sdW1uKCkpOwotCX0KLQotCXZvaWQgdXBkYXRlSm9pbkNvbHVtbnMoKSB7Ci0JCWlmICh0aGlzLmlzUG9wdWxhdGluZygpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCVJlZmVyZW5jZVRhYmxlIHJlZmVyZW5jZVRhYmxlID0gKFJlZmVyZW5jZVRhYmxlKSB0aGlzLmdldFN1YmplY3QoKTsKLQkJaWYgKHJlZmVyZW5jZVRhYmxlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJYm9vbGVhbiBzZWxlY3RlZCA9IHRoaXMub3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnNDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJdGhpcy5zZXRQb3B1bGF0aW5nKHRydWUpOwotCi0JCXRyeSB7Ci0JCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQlyZWZlcmVuY2VUYWJsZS5jb252ZXJ0RGVmYXVsdEpvaW5Db2x1bW5Ub1NwZWNpZmllZCgpOwotCQkJCXNldFNlbGVjdGVkSm9pbkNvbHVtbihyZWZlcmVuY2VUYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uKDApKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZm9yIChpbnQgaW5kZXggPSByZWZlcmVuY2VUYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKTsgLS1pbmRleCA+PSAwOyApIHsKLQkJCQkJcmVmZXJlbmNlVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihpbmRleCk7Ci0JCQkJfQotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJdGhpcy5zZXRQb3B1bGF0aW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCWNsYXNzIEpvaW5Db2x1bW5zUHJvdmlkZXIgaW1wbGVtZW50cyBKb2luQ29sdW1uc0VkaXRvcjxUPiB7Ci0KLQkJcHVibGljIHZvaWQgYWRkSm9pbkNvbHVtbihUIHN1YmplY3QpIHsKLQkJCVJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLnRoaXMuYWRkSm9pbkNvbHVtbihzdWJqZWN0KTsKLQkJfQotCi0JCXB1YmxpYyBSZWFkT25seUpvaW5Db2x1bW4gZ2V0RGVmYXVsdEpvaW5Db2x1bW4oVCBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWZhdWx0UHJvcGVydHlOYW1lKCkgewotCQkJcmV0dXJuIFJlYWRPbmx5UmVmZXJlbmNlVGFibGUuREVGQVVMVF9KT0lOX0NPTFVNTl9QUk9QRVJUWTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVkaXRKb2luQ29sdW1uKFQgc3ViamVjdCwgUmVhZE9ubHlKb2luQ29sdW1uIGpvaW5Db2x1bW4pIHsKLQkJCVJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlLnRoaXMuZWRpdEpvaW5Db2x1bW4oam9pbkNvbHVtbik7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNTcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpIHsKLQkJCXJldHVybiBzdWJqZWN0Lmhhc1NwZWNpZmllZEpvaW5Db2x1bW5zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVKb2luQ29sdW1ucyhUIHN1YmplY3QsIGludFtdIHNlbGVjdGVkSW5kaWNlcykgewotCQkJZm9yIChpbnQgaW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoOyBpbmRleC0tID4gMDsgKSB7Ci0JCQkJKChSZWZlcmVuY2VUYWJsZSkgc3ViamVjdCkucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbihzZWxlY3RlZEluZGljZXNbaW5kZXhdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBMaXN0SXRlcmFibGU8UmVhZE9ubHlKb2luQ29sdW1uPiBnZXRTcGVjaWZpZWRKb2luQ29sdW1ucyhUIHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyPFJlYWRPbmx5Sm9pbkNvbHVtbj4oc3ViamVjdC5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKFQgc3ViamVjdCkgewotCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdFByb3BlcnR5TmFtZSgpIHsKLQkJCXJldHVybiBSZWFkT25seVJlZmVyZW5jZVRhYmxlLlNQRUNJRklFRF9KT0lOX0NPTFVNTlNfTElTVDsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIgZXh0ZW5kcyBMaXN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxCb29sZWFuPgotCSAgICBpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHsKLQkKLQkJcHVibGljIE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSB7Ci0JCQlzdXBlcihidWlsZFNwZWNpZmllZEpvaW5Db2x1bW5zTGlzdEhvbGRlcigpKTsKLQkJfQotCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5saXN0SG9sZGVyLnNpemUoKSA+IDApOwotCQl9Ci0JCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXVwZGF0ZUpvaW5Db2x1bW5zKCk7Ci0JCX0KLQl9Ci0KLQkKLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5QYW5lRW5hYmxlckhvbGRlciAKLQkJZXh0ZW5kcyBDYWNoaW5nVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQm9vbGVhbj4gCi0JewotCQlwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgc3RhdGVDaGFuZ2VMaXN0ZW5lcjsKLQkJCi0JCQotCQlwdWJsaWMgSm9pbkNvbHVtblBhbmVFbmFibGVySG9sZGVyKCkgewotCQkJc3VwZXIoCi0JCQkJbmV3IFZhbHVlTGlzdEFkYXB0ZXI8VD4oCi0JCQkJCW5ldyBSZWFkT25seVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsV3JhcHBlcjxUPihnZXRTdWJqZWN0SG9sZGVyKCkpLCAKLQkJCQkJUmVhZE9ubHlSZWZlcmVuY2VUYWJsZS5TUEVDSUZJRURfSk9JTl9DT0xVTU5TX0xJU1QpKTsKLQkJCXRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lciA9IGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl9Ci0JCQotCQkKLQkJcHJpdmF0ZSBTdGF0ZUNoYW5nZUxpc3RlbmVyIGJ1aWxkU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU3RhdGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCQl2YWx1ZVN0YXRlQ2hhbmdlZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXZvaWQgdmFsdWVTdGF0ZUNoYW5nZWQoKSB7Ci0JCQlPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNhY2hlZFZhbHVlOwotCQkJT2JqZWN0IG5ld1ZhbHVlID0gdHJhbnNmb3JtTmV3KHRoaXMudmFsdWVIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCQlmaXJlUHJvcGVydHlDaGFuZ2VkKFZBTFVFLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFQgdmFsdWUpIHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQl9Ci0JCQlyZXR1cm4gc3VwZXIudHJhbnNmb3JtKHZhbHVlKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQkJYm9vbGVhbiB2aXJ0dWFsID0gUmVmZXJlbmNlVGFibGVDb21wb3NpdGUudGhpcy50YWJsZUlzVmlydHVhbCh2YWx1ZSk7Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCEgdmlydHVhbCAmJiB2YWx1ZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSA+IDApOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlTW9kZWwoKSB7Ci0JCQlzdXBlci5lbmdhZ2VNb2RlbCgpOwotCQkJdGhpcy52YWx1ZUhvbGRlci5hZGRTdGF0ZUNoYW5nZUxpc3RlbmVyKHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VNb2RlbCgpIHsKLQkJCXRoaXMudmFsdWVIb2xkZXIucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcih0aGlzLnN0YXRlQ2hhbmdlTGlzdGVuZXIpOwotCQkJc3VwZXIuZGlzZW5nYWdlTW9kZWwoKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiB0YWJsZUlzVmlydHVhbChUIHJlZmVyZW5jZVRhYmxlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvU2Vjb25kYXJ5VGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmJmMDNkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9TZWNvbmRhcnlUYWJsZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRGF0YWJhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIENsaWVudHMgY2FuIHVzZSB0aGlzIGRpYWxvZyB0byBwcm9tcHQgdGhlIHVzZXIgZm9yIFNlY29uZGFyeVRhYmxlIHNldHRpbmdzLgotICogVXNlIHRoZSBmb2xsb3dpbmcgb25jZSB0aGUgZGlhbG9nIGlzIGNsb3NlZDoKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZFRhYmxlKCkKLSAqICAgICBAc2VlICNnZXRTZWxlY3RlZENhdGFsb2coKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkU2NoZW1hKCkKLSAqLwotcHVibGljIGNsYXNzIFNlY29uZGFyeVRhYmxlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JLyoqCi0JICogd2hlbiBjcmVhdGluZyBhIG5ldyBTZWNvbmRhcnlUYWJsZSwgJ3NlY29uZGFyeVRhYmxlJyB3aWxsIGJlIG51bGwKLQkgKi8KLQlwcml2YXRlIGZpbmFsIFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRDYXRhbG9nOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRTY2hlbWE7Ci0JCi0JcHJvdGVjdGVkIENvbWJvIHRhYmxlQ29tYm87Ci0JcHJvdGVjdGVkIENvbWJvIGNhdGFsb2dDb21ibzsKLQlwcm90ZWN0ZWQgQ29tYm8gc2NoZW1hQ29tYm87Ci0KLQkvLyB0aGVzZSB2YWx1ZXMgYXJlIHNldCB1cG9uIGNsb3NlCi0JcHJpdmF0ZSBTdHJpbmcgc2VsZWN0ZWRUYWJsZTsKLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZFNjaGVtYTsKLQlwcml2YXRlIFN0cmluZyBzZWxlY3RlZENhdGFsb2c7Ci0KLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQotCS8qKgotCSAqIFVzZSB0aGlzIGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIG5ldyBzZWNvbmRhcnkgdGFibGUKLQkgKi8KLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVEaWFsb2coU2hlbGwgcGFyZW50LCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyBkZWZhdWx0Q2F0YWxvZywgU3RyaW5nIGRlZmF1bHRTY2hlbWEpIHsKLQkJdGhpcyhwYXJlbnQsIGpwYVByb2plY3QsIG51bGwsIGRlZmF1bHRDYXRhbG9nLCBkZWZhdWx0U2NoZW1hKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBlZGl0IGFuIGV4aXN0aW5nIHNlY29uZGFyeSB0YWJsZQotCSAqLwotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZURpYWxvZyhTaGVsbCBwYXJlbnQsIEpwYVByb2plY3QganBhUHJvamVjdCwgU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUpIHsKLQkJdGhpcyhwYXJlbnQsIGpwYVByb2plY3QsIHNlY29uZGFyeVRhYmxlLCBzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpLCBzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCS8qKgotCSAqIGludGVybmFsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFNlY29uZGFyeVRhYmxlRGlhbG9nKFNoZWxsIHBhcmVudCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSwgU3RyaW5nIGRlZmF1bHRDYXRhbG9nLCBTdHJpbmcgZGVmYXVsdFNjaGVtYSkgewotCQlzdXBlcihwYXJlbnQpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnNlY29uZGFyeVRhYmxlID0gc2Vjb25kYXJ5VGFibGU7Ci0JCXRoaXMuZGVmYXVsdENhdGFsb2cgPSBkZWZhdWx0Q2F0YWxvZzsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hID0gZGVmYXVsdFNjaGVtYTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogb3BlbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCVBvaW50IHNpemUgPSBzdXBlci5nZXRJbml0aWFsU2l6ZSgpOwotCQlzaXplLnggPSB0aGlzLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyg1MCk7ICAvLyA/Pz8KLQkJcmV0dXJuIHNpemU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuICh0aGlzLnNlY29uZGFyeVRhYmxlID09IG51bGwpID8KLQkJCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2FkZFNlY29uZGFyeVRhYmxlCi0JCQkJCToKLQkJCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2VkaXRTZWNvbmRhcnlUYWJsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gKEdyaWRMYXlvdXQpIGNvbXBvc2l0ZS5nZXRMYXlvdXQoKTsKLQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gMjsKLQotCQkvLyB0YWJsZQotCQlMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQl0YWJsZUxhYmVsLnNldFRleHQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfbmFtZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCXRhYmxlTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy50YWJsZUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLnRhYmxlQ29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJLy8gY2F0YWxvZwotCQlMYWJlbCBjYXRhbG9nTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWNhdGFsb2dMYWJlbC5zZXRUZXh0KEpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlY29uZGFyeVRhYmxlRGlhbG9nX2NhdGFsb2cpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQljYXRhbG9nTGFiZWwuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0KLQkJdGhpcy5jYXRhbG9nQ29tYm8gPSBuZXcgQ29tYm8oY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCWdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCS8vIHNjaGVtYQotCQlMYWJlbCBzY2hlbWFMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJc2NoZW1hTGFiZWwuc2V0VGV4dChKcHRVaURldGFpbHNNZXNzYWdlcy5TZWNvbmRhcnlUYWJsZURpYWxvZ19zY2hlbWEpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlzY2hlbWFMYWJlbC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQl0aGlzLnNjaGVtYUNvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLnNjaGVtYUNvbWJvLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUNhdGFsb2dDb21ibygpOwotCQl0aGlzLmluaXRpYWxpemVTY2hlbWFDb21ibygpOwotCQl0aGlzLmluaXRpYWxpemVUYWJsZUNvbWJvKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCi0JCXRoaXMudGFibGVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZFRhYmxlTW9kaWZ5TGlzdGVuZXIoKSk7Ci0JCXRoaXMuY2F0YWxvZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRDYXRhbG9nU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMuc2NoZW1hQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZFNjaGVtYVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl0aGlzLnJlZnJlc2hCdXR0b25zKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUNhdGFsb2dDb21ibygpIHsKLQkJdGhpcy5wb3B1bGF0ZUNhdGFsb2dDb21ibygpOwotCi0JCWlmICh0aGlzLmlzQWRkRGlhbG9nKCkpIHsKLQkJCXRoaXMuY2F0YWxvZ0NvbWJvLnNlbGVjdCgwKTsgIC8vIG91dC1vZi1ib3VuZHMgaW5kZXggaXMgaWdub3JlZAotCQl9IGVsc2UgewotCQkJU3RyaW5nIHNwZWNpZmllZENhdGFsb2cgPSB0aGlzLnNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCWlmIChzcGVjaWZpZWRDYXRhbG9nID09IG51bGwpIHsKLQkJCQl0aGlzLmNhdGFsb2dDb21iby5zZWxlY3QoMCk7ICAvLyBvdXQtb2YtYm91bmRzIGluZGV4IGlzIGlnbm9yZWQKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5jYXRhbG9nQ29tYm8uc2V0VGV4dChzcGVjaWZpZWRDYXRhbG9nKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlQ2F0YWxvZ0NvbWJvKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJaWYgKChkYXRhYmFzZSAhPSBudWxsKSAmJiAhIGRhdGFiYXNlLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJdGhpcy5jYXRhbG9nQ29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBhZGQgdGhlIGRlZmF1bHQgY2F0YWxvZyBmaXJzdAotCQlpZiAodGhpcy5kZWZhdWx0Q2F0YWxvZyAhPSBudWxsKSB7Ci0JCQl0aGlzLmNhdGFsb2dDb21iby5hZGQoTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdENhdGFsb2csIHRoaXMuZGVmYXVsdENhdGFsb2cpKTsKLQkJfQotCi0JCWlmIChkYXRhYmFzZSAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyBpZGVudGlmaWVyIDogZGF0YWJhc2UuZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkpIHsKLQkJCQl0aGlzLmNhdGFsb2dDb21iby5hZGQoaWRlbnRpZmllcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2NoZW1hQ29tYm8oKSB7Ci0JCXRoaXMucG9wdWxhdGVTY2hlbWFDb21ibygpOwotCi0JCWlmICh0aGlzLmlzQWRkRGlhbG9nKCkpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KDApOyAgLy8gb3V0LW9mLWJvdW5kcyBpbmRleCBpcyBpZ25vcmVkCi0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc3BlY2lmaWVkU2NoZW1hID0gdGhpcy5zZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKTsKLQkJCWlmIChzcGVjaWZpZWRTY2hlbWEgPT0gbnVsbCkgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2VsZWN0KDApOyAgLy8gb3V0LW9mLWJvdW5kcyBpbmRleCBpcyBpZ25vcmVkCi0JCQl9IGVsc2UgewotCQkJCXRoaXMuc2NoZW1hQ29tYm8uc2V0VGV4dChzcGVjaWZpZWRTY2hlbWEpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gYXNzdW1lIHRoZSBjYXRhbG9nIGNvbWJvIGhhcyBiZWVuIHBvcHVsYXRlZCBieSBub3cKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVNjaGVtYUNvbWJvKCkgewotCQkvLyBhZGQgdGhlIGRlZmF1bHQgc2NoZW1hIGZpcnN0Ci0JCWlmICh0aGlzLmRlZmF1bHRTY2hlbWEgIT0gbnVsbCkgewotCQkJdGhpcy5zY2hlbWFDb21iby5hZGQoTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2Vjb25kYXJ5VGFibGVEaWFsb2dfZGVmYXVsdFNjaGVtYSwgdGhpcy5kZWZhdWx0U2NoZW1hKSk7Ci0JCX0KLQotCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldEN1cnJlbnREYlNjaGVtYUNvbnRhaW5lcigpOwotCQlpZiAoc2MgIT0gbnVsbCkgewotCQkJZm9yIChTdHJpbmcgaWRlbnRpZmllciA6IHNjLmdldFNvcnRlZFNjaGVtYUlkZW50aWZpZXJzKCkpIHsKLQkJCQl0aGlzLnNjaGVtYUNvbWJvLmFkZChpZGVudGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVUYWJsZUNvbWJvKCkgewotCQl0aGlzLnBvcHVsYXRlVGFibGVDb21ibygpOwotCi0JCWlmICh0aGlzLmlzRWRpdERpYWxvZygpKSB7Ci0JCQlTdHJpbmcgc3BlY2lmaWVkTmFtZSA9IHRoaXMuc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpOwotCQkJaWYgKHNwZWNpZmllZE5hbWUgIT0gbnVsbCkgewotCQkJCXRoaXMudGFibGVDb21iby5zZXRUZXh0KHNwZWNpZmllZE5hbWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gYXNzdW1lIHRoZSBzY2hlbWEgY29tYm8gaGFzIGJlZW4gcG9wdWxhdGVkIGJ5IG5vdwotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlVGFibGVDb21ibygpIHsKLQkJLy8gd2UgZG9uJ3QgbmVlZCB0byBhZGQgYSAiZGVmYXVsdCIgdG8gdGhlIHRhYmxlIGNvbWJvCi0JCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0Q3VycmVudERiU2NoZW1hKCk7Ci0JCWlmIChkYlNjaGVtYSAhPSBudWxsKSB7Ci0JCQlmb3IgKFN0cmluZyBpZGVudGlmaWVyIDogZGJTY2hlbWEuZ2V0U29ydGVkVGFibGVJZGVudGlmaWVycygpKSB7Ci0JCQkJdGhpcy50YWJsZUNvbWJvLmFkZChpZGVudGlmaWVyKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQ2F0YWxvZ1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlTZWNvbmRhcnlUYWJsZURpYWxvZy50aGlzLnNlbGVjdGVkQ2F0YWxvZ0NoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cudGhpcy5zZWxlY3RlZENhdGFsb2dDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjYXRhbG9nIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZWxlY3RlZENhdGFsb2dDaGFuZ2VkKCkgewotCQl0aGlzLnJlZnJlc2hTY2hlbWFDb21ibygpOwotCQl0aGlzLnJlZnJlc2hUYWJsZUNvbWJvKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFNjaGVtYUNvbWJvKCkgewotCQlTdHJpbmcgc2NoZW1hID0gdGhpcy5zY2hlbWFDb21iby5nZXRUZXh0KCk7Ci0JCXRoaXMuc2NoZW1hQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCXRoaXMucG9wdWxhdGVTY2hlbWFDb21ibygpOwotCQl0aGlzLnNjaGVtYUNvbWJvLnNldFRleHQoc2NoZW1hKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTY2hlbWFTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cudGhpcy5zZWxlY3RlZFNjaGVtYUNoYW5nZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cudGhpcy5zZWxlY3RlZFNjaGVtYUNoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInNjaGVtYSBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCkgewotCQl0aGlzLnJlZnJlc2hUYWJsZUNvbWJvKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFRhYmxlQ29tYm8oKSB7Ci0JCVN0cmluZyB0YWJsZSA9IHRoaXMudGFibGVDb21iby5nZXRUZXh0KCk7Ci0JCXRoaXMudGFibGVDb21iby5yZW1vdmVBbGwoKTsKLQkJdGhpcy5wb3B1bGF0ZVRhYmxlQ29tYm8oKTsKLQkJdGhpcy50YWJsZUNvbWJvLnNldFRleHQodGFibGUpOwotCX0KLQotCXByb3RlY3RlZCBNb2RpZnlMaXN0ZW5lciBidWlsZFRhYmxlTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJU2Vjb25kYXJ5VGFibGVEaWFsb2cudGhpcy50YWJsZUNoYW5nZWQoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gInRhYmxlIG1vZGlmeSBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWQoKSB7Ci0JCXRoaXMucmVmcmVzaEJ1dHRvbnMoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKioqKgotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBZGREaWFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNlY29uZGFyeVRhYmxlID09IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFZGl0RGlhbG9nKCkgewotCQlyZXR1cm4gISB0aGlzLmlzQWRkRGlhbG9nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIERhdGFiYXNlIGdldERhdGFiYXNlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldERhdGFTb3VyY2UoKS5nZXREYXRhYmFzZSgpOwotCX0KLQotCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0Q3VycmVudERiU2NoZW1hQ29udGFpbmVyKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKTsKLQkJaWYgKGRhdGFiYXNlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICggISBkYXRhYmFzZS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCXJldHVybiBkYXRhYmFzZTsKLQkJfQotCQlTdHJpbmcgY2F0YWxvZyA9IHRoaXMuZ2V0Q3VycmVudENhdGFsb2coKTsKLQkJcmV0dXJuIChjYXRhbG9nID09IG51bGwpID8gbnVsbCA6IGRhdGFiYXNlLmdldENhdGFsb2dGb3JJZGVudGlmaWVyKGNhdGFsb2cpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VycmVudENhdGFsb2coKSB7Ci0JCWlmICgodGhpcy5kZWZhdWx0Q2F0YWxvZyAhPSBudWxsKSAmJiAodGhpcy5jYXRhbG9nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSkgewotCQkJcmV0dXJuIHRoaXMuZGVmYXVsdENhdGFsb2c7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRUZXh0KHRoaXMuY2F0YWxvZ0NvbWJvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hIGdldEN1cnJlbnREYlNjaGVtYSgpIHsKLQkJU3RyaW5nIHNjaGVtYSA9IHRoaXMuZ2V0Q3VycmVudFNjaGVtYSgpOwotCQlpZiAoc2NoZW1hID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0Q3VycmVudERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCXJldHVybiAoc2MgPT0gbnVsbCkgPyBudWxsIDogc2MuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihzY2hlbWEpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VycmVudFNjaGVtYSgpIHsKLQkJaWYgKCh0aGlzLmRlZmF1bHRTY2hlbWEgIT0gbnVsbCkgJiYgKHRoaXMuc2NoZW1hQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSkgewotCQkJcmV0dXJuIHRoaXMuZGVmYXVsdFNjaGVtYTsKLQkJfQotCQlyZXR1cm4gY29udmVydFRleHQodGhpcy5zY2hlbWFDb21ibyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hCdXR0b25zKCkgewotCQl0aGlzLmdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRoaXMudmFsaWRhdGVFbnRyeVZhbHVlcygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZUVudHJ5VmFsdWVzKCkgewotCQlyZXR1cm4gISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMudGFibGVDb21iby5nZXRUZXh0KCkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjbG9zZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBzZXQgYWxsIHRoZSB2YXJpb3VzIHZhbHVlcyBxdWVyaWVkIGJ5IGNsaWVudHMgb25jZSB0aGUgZGlhbG9nIGlzIGNsb3NlZAotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNsb3NlKCkgewotCQl0aGlzLnNlbGVjdGVkVGFibGUgPSB0aGlzLnRhYmxlQ29tYm8uZ2V0VGV4dCgpOwotCQl0aGlzLnNlbGVjdGVkQ2F0YWxvZyA9IGNvbnZlcnRUZXh0KHRoaXMuY2F0YWxvZ0NvbWJvLCB0aGlzLmRlZmF1bHRDYXRhbG9nKTsKLQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IGNvbnZlcnRUZXh0KHRoaXMuc2NoZW1hQ29tYm8sIHRoaXMuZGVmYXVsdFNjaGVtYSk7Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCX0KLQotCS8qKgotCSAqIHJldHVybiBudWxsIGlmOgotCSAqICAgLSB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBzZWxlY3RlZAotCSAqICAgLSB0aGUgY29tYm8ncyB0ZXh0IGlzIGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRleHQoQ29tYm8gY29tYm8sIFN0cmluZyBkZWZhdWx0VGV4dCkgewotCQkvLyBpZiB0aGUgZGVmYXVsdCB0ZXh0IGlzIHByZXNlbnQsIHRoZW4gaXQgd2lsbCBiZSB0aGUgY29tYm8ncyBmaXJzdCBzZWxlY3Rpb24KLQkJaWYgKChkZWZhdWx0VGV4dCAhPSBudWxsKSAmJiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNvbnZlcnRUZXh0KGNvbWJvKTsKLQl9Ci0KLQkvKioKLQkgKiByZXR1cm4gbnVsbCBpZiB0aGUgY29tYm8ncyB0ZXh0IGlzIGVtcHR5Ci0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgY29udmVydFRleHQoQ29tYm8gY29tYm8pIHsKLQkJU3RyaW5nIHRleHQgPSBjb21iby5nZXRUZXh0KCk7Ci0JCXJldHVybiAodGV4dC5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiB0ZXh0OwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgc2VsZWN0ZWQgdGFibGUuIFJldHVybiBhbiBlbXB0eSBzdHJpbmcgaWYgbm90aGluZwotCSAqIGlzIHNlbGVjdGVkIChzaW5jZSB0aGVyZSBpcyBubyBkZWZhdWx0KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVGFibGUoKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkVGFibGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3RlZCBjYXRhbG9nLiBSZXR1cm4gbnVsbCBpZiBlaXRoZXIgbm90aGluZyBvcgotCSAqIHRoZSBkZWZhdWx0IGNhdGFsb2cgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGVkQ2F0YWxvZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIHNjaGVtYS4gUmV0dXJuIG51bGwgaWYgZWl0aGVyIG5vdGhpbmcgb3IKLQkgKiB0aGUgZGVmYXVsdCBzY2hlbWEgaXMgc2VsZWN0ZWQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RlZFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRTY2hlbWE7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODVhNDE4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuU2VxdWVuY2VDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2VxdWVuY2UgR2VuZXJhdG9yOiB8IFNlcXVlbmNlQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQWxsb2NhdGlvbiBTaXplOiAgICB8IEkgICAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgSW5pdGlhbCBWYWx1ZTogICAgICB8ICAgICAgICAgfEl8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBTZXF1ZW5jZUdlbmVyYXRvcgotICogQHNlZSBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgU2VxdWVuY2VDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUgZXh0ZW5kcyBHZW5lcmF0b3JDb21wb3NpdGU8U2VxdWVuY2VHZW5lcmF0b3I+Ci17Ci0JCi0JcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxTZXF1ZW5jZUdlbmVyYXRvcj4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgIAkJCQkJCQlHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBidWlsZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRvckNvbnRhaW5lci5TRVFVRU5DRV9HRU5FUkFUT1JfUFJPUEVSVFk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSwKLQkJCWJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRQotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZV9zZXF1ZW5jZSwKLQkJCWJ1aWxkU2VxdWVuY2VOYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfU0VRVUVOQ0VfR0VORVJBVE9SX1NFUVVFTkNFCi0JCSk7Ci0KLQkJYWRkQWxsb2NhdGlvblNpemVDb21ibyhjb250YWluZXIpOwotCQlhZGRJbml0aWFsVmFsdWVDb21ibyhjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBTZXF1ZW5jZUNvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IFNlcXVlbmNlQ29tYm88U2VxdWVuY2VHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9TRVFVRU5DRV9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvci5TUEVDSUZJRURfU0VRVUVOQ0VfTkFNRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNlcXVlbmNlTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKGdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWFfKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYSgpOwotCQkJfQotCi0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1RhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MzYWRhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvVGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IFRhYmxlOiAgIHwgVGFibGVDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IENhdGFsb2c6IHwgQ2F0YWxvZ0NvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IFNjaGVtYTogIHwgU2NoZW1hQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFRhYmxlCi0gKiBAc2VlIEVudGl0eUNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFRhYmxlQ29tYm8KLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKgotICogQFRPRE8gcmVwb3B1bGF0ZSB0aGlzIHBhbmVsIGJhc2VkIG9uIHRoZSBFbnRpdHkgdGFibGUgY2hhbmdpbmcKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYWJsZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRhYmxlQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEVudGl0eT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFRhYmxlIGdyb3VwIHBhbmUKLQkJR3JvdXAgdGFibGVHcm91cFBhbmUgPSBhZGRUaXRsZWRHcm91cCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlQ29tcG9zaXRlX3RhYmxlU2VjdGlvbgotCQkpOwotCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZT4gc3ViamVjdEhvbGRlciA9IGJ1aWxkVGFibGVIb2xkZXIoKTsKLQkJLy8gVGFibGUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVHcm91cFBhbmUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UYWJsZUNob29zZXJfbGFiZWwsCi0JCQlhZGRUYWJsZUNvbWJvKHN1YmplY3RIb2xkZXIsIHRhYmxlR3JvdXBQYW5lKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9UQUJMRQotCQkpOwotCi0JCS8vIENhdGFsb2cgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVHcm91cFBhbmUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5DYXRhbG9nQ2hvb3Nlcl9sYWJlbCwKLQkJCWFkZENhdGFsb2dDb21ibyhzdWJqZWN0SG9sZGVyLCB0YWJsZUdyb3VwUGFuZSksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfQ0FUQUxPRwotCQkpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQl0YWJsZUdyb3VwUGFuZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNjaGVtYUNob29zZXJfbGFiZWwsCi0JCQlhZGRTY2hlbWFDb21ibyhzdWJqZWN0SG9sZGVyLCB0YWJsZUdyb3VwUGFuZSksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5FTlRJVFlfU0NIRU1BCi0JCSk7Ci0JCQotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRUYWJsZUVuYWJsZWRIb2xkZXIoKSwgdGhpcyk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZT4gYnVpbGRUYWJsZUhvbGRlcigpIHsKLQkJCi0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVudGl0eSwgVGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlRBQkxFX0lTX1VOREVGSU5FRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC50YWJsZUlzVW5kZWZpbmVkKCkgPyBudWxsIDogdGhpcy5zdWJqZWN0LmdldFRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRhYmxlRW5hYmxlZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5LCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfVEFCTEVfSVNfQUxMT1dFRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5zcGVjaWZpZWRUYWJsZUlzQWxsb3dlZCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENhdGFsb2dDb21ibzxUYWJsZT4gYWRkQ2F0YWxvZ0NvbWJvKFByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZT4gdGFibGVIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IENhdGFsb2dDb21ibzxUYWJsZT4odGhpcywgdGFibGVIb2xkZXIsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNjaGVtYUNvbWJvPFRhYmxlPiBhZGRTY2hlbWFDb21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IHN1YmplY3RIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPFRhYmxlPih0aGlzLCBzdWJqZWN0SG9sZGVyLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVGFibGVDb21ibzxUYWJsZT4gYWRkVGFibGVDb21ibyhQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGU+IHN1YmplY3RIb2xkZXIsIENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFRhYmxlQ29tYm88VGFibGU+KHRoaXMsIHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGUuU1BFQ0lGSUVEX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCXN1cGVyLnByb3BlcnR5Q2hhbmdlZChwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGUuREVGQVVMVF9TQ0hFTUFfUFJPUEVSVFkgCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZS5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkKLQkJCQkJfHwgcHJvcGVydHlOYW1lID09IFRhYmxlLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZICkgewotCQkJCQlyZXBvcHVsYXRlKCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZE5hbWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hIGdldERiU2NoZW1hXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGJTY2hlbWEoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvVGFibGVHZW5lcmF0b3JDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2MyODUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuVGFibGVDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTmFtZTogICAgICAgICAgICAgICAgICAgICB8IEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVGFibGU6ICAgICAgICAgICAgICAgICAgICB8IFRhYmxlQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgQ2F0YWxvZzogICAgICAgICAgICAgICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgU2NoZW1hOiAgICAgICAgICAgICAgICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUHJpbWFyeSBLZXkgQ29sdW1uOiAgICAgICB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgVmFsdWUgQ29sdW1uOiAgICAgICAgICAgICB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgUHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlOiB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgQWxsb2NhdGlvbiBTaXplOiAgICAgICAgICB8IEkgICAgICAgfEl8ICBEZWZhdWx0IChYWCkgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgSW5pdGlhbCBWYWx1ZTogICAgICAgICAgICB8IEkgICAgICAgfEl8ICBEZWZhdWx0IChYWCkgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIElkTWFwcGluZwotICogQHNlZSBUYWJsZUdlbmVyYXRvcgotICogQHNlZSBJZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKiBAc2VlIFRhYmxlQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlIGV4dGVuZHMgR2VuZXJhdG9yQ29tcG9zaXRlPFRhYmxlR2VuZXJhdG9yPgotewotCi0JCi0JcHVibGljIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLSAgICAgICAgCQkJCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUYWJsZUdlbmVyYXRvcj4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgCQkJCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgIAkJCQkJCQlHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPiBidWlsZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBidWlsZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5TmFtZSgpIHsKLQkJcmV0dXJuIEdlbmVyYXRvckNvbnRhaW5lci5UQUJMRV9HRU5FUkFUT1JfUFJPUEVSVFk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCWFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfbmFtZSwKLQkJCWJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfTkFNRQotCQkpOwotCi0JCS8vIFRhYmxlIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3RhYmxlLAotCQkJYWRkVGFibGVOYW1lQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1RBQkxFCi0JCSk7Ci0KLQkJLy8gU2NoZW1hIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYSwKLQkJCWFkZFNjaGVtYUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBQkxFX0dFTkVSQVRPUl9TQ0hFTUEKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX2NhdGFsb2csCi0JCQlhZGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBDb2x1bW4gd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuVGFibGVHZW5lcmF0b3JDb21wb3NpdGVfcGtDb2x1bW4sCi0JCQlhZGRQa0NvbHVtbk5hbWVDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfUFJJTUFSWV9LRVlfQ09MVU1OCi0JCSk7Ci0KLQkJLy8gVmFsdWUgQ29sdW1uIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3ZhbHVlQ29sdW1uLAotCQkJYWRkVmFsdWVDb2x1bW5Db21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19UQUJMRV9HRU5FUkFUT1JfVkFMVUVfQ09MVU1OCi0JCSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgQ29sdW1uIFZhbHVlIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlX3BrQ29sdW1uVmFsdWUsCi0JCQlhZGRQa0NvbHVtblZhbHVlQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfVEFCTEVfR0VORVJBVE9SX1BSSU1BUllfS0VZX0NPTFVNTl9WQUxVRQotCQkpOwotCi0JCWFkZEFsbG9jYXRpb25TaXplQ29tYm8oY29udGFpbmVyKTsKLQkJYWRkSW5pdGlhbFZhbHVlQ29tYm8oY29udGFpbmVyKTsKLQl9CQotCi0JcHJpdmF0ZSBDYXRhbG9nQ29tYm88VGFibGVHZW5lcmF0b3I+IGFkZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0Q2F0YWxvZygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIHN1YmplY3QgbWF5IGJlIG51bGwsIHNvIGRlbGVnYXRlIHRvIHRoZSBjb21wb3NpdGUKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4gYWRkUGtDb2x1bW5OYW1lQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXJldHVybiBuZXcgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9QS19DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1BLX0NPTFVNTl9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHByb3BlcnR5Q2hhbmdlZChTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJaWYgKHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1RBQkxFX1BST1BFUlRZIHx8Ci0JCQkJICAgIHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfVEFCTEVfUFJPUEVSVFkpIHsKLQkJCQkJdGhpcy5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0UGtDb2x1bW5OYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZV8oKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29sdW1uQ29tYm88VGFibGVHZW5lcmF0b3I+IGFkZFBrQ29sdW1uVmFsdWVDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxUYWJsZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1BLX0NPTFVNTl9WQUxVRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIHN1YmplY3QgbWF5IGJlIG51bGwsIHNvIGRlbGVnYXRlIHRvIHRoZSBjb21wb3NpdGUKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUYWJsZSBnZXREYlRhYmxlXygpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERiVGFibGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2NoZW1hQ29tYm88VGFibGVHZW5lcmF0b3I+IGFkZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfU0NIRU1BX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZUNvbWJvQm94KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCXJldHJpZXZlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2NoZW1hKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJCQlUYWJsZUdlbmVyYXRvciB0ZyA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQkJCWlmICh0ZyAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiB0Zy5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQkJCX0KLQkJCQlyZXR1cm4gVGFibGVHZW5lcmF0b3JDb21wb3NpdGUudGhpcy5nZXRTdWJqZWN0KCkuZ2V0Q29udGV4dERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCkgewotCQkJCS8vIHdlIG92ZXJyb2RlICNnZXREYlNjaGVtYUNvbnRhaW5lcigpIGluc3RlYWQKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRhYmxlQ29tYm88VGFibGVHZW5lcmF0b3I+IGFkZFRhYmxlTmFtZUNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IFRhYmxlQ29tYm88VGFibGVHZW5lcmF0b3I+KHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfU0NIRU1BX1BST1BFUlRZIAotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZCi0JCQkJCXx8IHByb3BlcnR5TmFtZSA9PSBUYWJsZUdlbmVyYXRvci5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSApIHsKLQkJCQkJcmVwb3B1bGF0ZUNvbWJvQm94KCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQocHJvcGVydHlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIHN1YmplY3QgbWF5IGJlIG51bGwsIHNvIGRlbGVnYXRlIHRvIHRoZSBjb21wb3NpdGUKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFRhYmxlKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCQkJVGFibGVHZW5lcmF0b3IgdGcgPSB0aGlzLmdldFN1YmplY3QoKTsKLQkJCQlpZiAodGcgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gdGcuZ2V0RGJTY2hlbWEoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIFRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlLnRoaXMuZ2V0U3ViamVjdCgpLmdldENvbnRleHREZWZhdWx0RGJTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2NoZW1hIGdldERiU2NoZW1hXygpIHsKLQkJCQkvLyB3ZSBvdmVycm9kZSAjZ2V0RGJTY2hlbWEoKSBpbnN0ZWFkCi0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCQl9Ci0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPiBhZGRWYWx1ZUNvbHVtbkNvbWJvKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlyZXR1cm4gbmV3IENvbHVtbkNvbWJvPFRhYmxlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIHBhcmVudCkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfVkFMVUVfQ09MVU1OX05BTUVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFRhYmxlR2VuZXJhdG9yLlNQRUNJRklFRF9WQUxVRV9DT0xVTU5fTkFNRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuREVGQVVMVF9UQUJMRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJCWlmIChwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuREVGQVVMVF9UQUJMRV9QUk9QRVJUWSB8fAotCQkJCSAgICBwcm9wZXJ0eU5hbWUgPT0gVGFibGVHZW5lcmF0b3IuU1BFQ0lGSUVEX1RBQkxFX1BST1BFUlRZKSB7Ci0JCQkJCXRoaXMucmVwb3B1bGF0ZUNvbWJvQm94KCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIG51bGxTdWJqZWN0SXNBbGxvd2VkKCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIHN1YmplY3QgbWF5IGJlIG51bGwsIHNvIGRlbGVnYXRlIHRvIHRoZSBjb21wb3NpdGUKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQkJCXJldHVybiBUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZS50aGlzLmdldEpwYVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlyZXRyaWV2ZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlIGdldERiVGFibGVfKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGJUYWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1RhcmdldEVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1RhcmdldEVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2E2ZTkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9UYXJnZXRFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyQ29tYm9QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIHRhcmdldCBlbnRpdHkgaHlwZXJsaW5rIGxhYmVsLCBjb21ibyBhbmQgYnJvd3NlIGJ1dHRvbiAKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotCWV4dGVuZHMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPFJlbGF0aW9uc2hpcE1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UYXJnZXRFbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRhcmdldEVudGl0eUNvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRUYXJnZXRFbnRpdHkoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoY2xhc3NOYW1lKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlRhcmdldEVudGl0eUNob29zZXJfbGFiZWw7Ci0gICAgfQotICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0gICAgCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1RBUkdFVF9FTlRJVFk7Ci0gICAgfQotICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQl9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotICAgIAlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFRhcmdldEVudGl0eUVuY2xvc2luZ1R5cGVTZXBhcmF0b3IoKTsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVR5cGUgcmVzb2x2ZUpkdFR5cGUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0VGFyZ2V0RW50aXR5SmR0VHlwZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UmVsYXRpb25zaGlwTWFwcGluZywgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgUmVsYXRpb25zaGlwTWFwcGluZy5TUEVDSUZJRURfVEFSR0VUX0VOVElUWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCk7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gVGFyZ2V0RW50aXR5Q29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQkJfQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQotCQkJCWlmIChnZXREZWZhdWx0VmFsdWUodGhpcy5zdWJqZWN0KS5lcXVhbHModmFsdWUpKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZFRhcmdldEVudGl0eSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRQcm9maWxlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0UHJvZmlsZXJIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UHJvZmlsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlbGF0aW9uc2hpcE1hcHBpbmcsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIFJlbGF0aW9uc2hpcE1hcHBpbmcuREVGQVVMVF9UQVJHRVRfRU5USVRZX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIFRhcmdldEVudGl0eUNvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShSZWxhdGlvbnNoaXBNYXBwaW5nIHN1YmplY3QpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IHN1YmplY3QuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvVGVtcG9yYWxUeXBlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODQyM2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1RlbXBvcmFsVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBUZW1wb3JhbDogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQ29sdW1uTWFwcGluZwotICogQHNlZSBUZW1wb3JhbFR5cGUKLSAqIEBzZWUgQmFzaWNNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKiBAc2VlIElkTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVGVtcG9yYWxUeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxUZW1wb3JhbENvbnZlcnRlcj4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UZW1wb3JhbFR5cGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRlbXBvcmFsVHlwZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFRlbXBvcmFsQ29udmVydGVyPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJdGhpcy5hZGRDb21ibygKLQkJCWNvbnRhaW5lciwKLQkJCWJ1aWxkVGVtcG9yYWxUeXBlTGlzdEhvbGRlcigpLAotCQkJYnVpbGRUZW1wb3JhbFR5cGVIb2xkZXIoKSwKLQkJCWJ1aWxkVGVtcG9yYWxUeXBlQ29udmVydGVyKCksCi0JCQlidWlsZEJvb2xlYW5Ib2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8VGVtcG9yYWxUeXBlPiBidWlsZFRlbXBvcmFsVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VGVtcG9yYWxDb252ZXJ0ZXIsIFRlbXBvcmFsVHlwZT4oZ2V0U3ViamVjdEhvbGRlcigpLCBUZW1wb3JhbENvbnZlcnRlci5URU1QT1JBTF9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBUZW1wb3JhbFR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUZW1wb3JhbFR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oVGVtcG9yYWxUeXBlIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRlbXBvcmFsVHlwZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxUZW1wb3JhbFR5cGU+IGJ1aWxkVGVtcG9yYWxUeXBlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVMaXN0VmFsdWVNb2RlbDxUZW1wb3JhbFR5cGU+KAotCQkJYnVpbGRTb3J0ZWRUZW1wb3JhbFR5cGVMaXN0KCkKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0PFRlbXBvcmFsVHlwZT4gYnVpbGRTb3J0ZWRUZW1wb3JhbFR5cGVMaXN0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNvcnQoQ29sbGVjdGlvblRvb2xzLmxpc3QoVGVtcG9yYWxUeXBlLnZhbHVlcygpKSwgdGhpcy5idWlsZFRlbXBvcmFsVHlwZUNvbXBhcmF0b3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSBDb21wYXJhdG9yPFRlbXBvcmFsVHlwZT4gYnVpbGRUZW1wb3JhbFR5cGVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8VGVtcG9yYWxUeXBlPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShUZW1wb3JhbFR5cGUgdHlwZTEsIFRlbXBvcmFsVHlwZSB0eXBlMikgewotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMSA9IGRpc3BsYXlTdHJpbmcodHlwZTEpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9IGRpc3BsYXlTdHJpbmcodHlwZTIpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxUZW1wb3JhbFR5cGU+IGJ1aWxkVGVtcG9yYWxUeXBlQ29udmVydGVyKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ0NvbnZlcnRlcjxUZW1wb3JhbFR5cGU+KCkgewotCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoVGVtcG9yYWxUeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IG51bGwgOiBkaXNwbGF5U3RyaW5nKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlTdHJpbmcgZGlzcGxheVN0cmluZyhUZW1wb3JhbFR5cGUgdGVtcG9yYWxUeXBlKSB7Ci0JCXN3aXRjaCAodGVtcG9yYWxUeXBlKSB7Ci0JCQljYXNlIERBVEUgOgotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5UZW1wb3JhbFR5cGVDb21wb3NpdGVfZGF0ZTsKLQkJCWNhc2UgVElNRSA6Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLlRlbXBvcmFsVHlwZUNvbXBvc2l0ZV90aW1lOwotCQkJY2FzZSBUSU1FU1RBTVAgOgotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5UZW1wb3JhbFR5cGVDb21wb3NpdGVfdGltZXN0YW1wOwotCQkJZGVmYXVsdCA6Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFRlbXBvcmFsQ29udmVydGVyLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFRlbXBvcmFsQ29udmVydGVyIHZhbHVlKSB7Ci0JCQkJaWYgKGdldFN1YmplY3QoKSAhPSBudWxsICYmIGdldFN1YmplY3QoKS5nZXRQYXJlbnQoKS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCkpIHsKLQkJCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgIT0gbnVsbCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1RyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NzY4ZjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL1RyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcGFuZSBkb2VzIG5vdCBoYXZlIGFueSB3aWRnZXRzLgotICoKLSAqIEBzZWUgVHJhbnNpZW50TWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8VHJhbnNpZW50TWFwcGluZz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SVRyYW5zaWVudE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvVmVyc2lvbk1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDVjNGE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRlbXBvcmFsVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFZlcnNpb25NYXBwaW5nCi0gKiBAc2VlIENvbHVtbkNvbXBvc2l0ZQotICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTxWZXJzaW9uTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SVZlcnNpb25NYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZlcnNpb25TZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvZGIvQ2F0YWxvZ0NvbWJvLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvZGIvQ2F0YWxvZ0NvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZjE3MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0NhdGFsb2dDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tYm8tYm94IGRpc3BsYXlzIHRoZSBkYXRhYmFzZSdzIGNhdGFsb2dzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2F0YWxvZ0NvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3RDb21ibzxUPgotewotCXB1YmxpYyBDYXRhbG9nQ29tYm8oCi0JCQlQYW5lPD8gZXh0ZW5kcyBUPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JcHVibGljIENhdGFsb2dDb21ibygKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlc18oKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvZGIvQ29sdW1uQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9Db2x1bW5Db21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTI0M2FjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9Db2x1bW5Db21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgY29tYm8tYm94IGRpc3BsYXlzIGEgdGFibGUncyBjb2x1bW5zLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29sdW1uQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+Ci0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JcHVibGljIENvbHVtbkNvbWJvKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgQ29sdW1uQ29tYm8oCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXNfKCkgewotCQlUYWJsZSBkYlRhYmxlID0gdGhpcy5nZXREYlRhYmxlKCk7Ci0JCXJldHVybiAoZGJUYWJsZSAhPSBudWxsKSA/IGRiVGFibGUuZ2V0U29ydGVkQ29sdW1uSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZSgpIHsKLQkJcmV0dXJuICh0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERiVGFibGVfKCk7Ci0JfQotCQotCS8qKgotCSAqIEFzc3VtZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgVGFibGUgZ2V0RGJUYWJsZV8oKTsKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWRfKFRhYmxlIHRhYmxlKSB7Ci0JCXN1cGVyLnRhYmxlQ2hhbmdlZF8odGFibGUpOwotCQlpZiAodGhpcy5nZXREYlRhYmxlKCkgPT0gdGFibGUpIHsKLQkJCXRoaXMuZG9Qb3B1bGF0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0RhdGFiYXNlT2JqZWN0Q29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9EYXRhYmFzZU9iamVjdENvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjcwZTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL0RhdGFiYXNlT2JqZWN0Q29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5UcmFjaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5Db21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgYWJzdHJhY3QgcGFuZSBrZWVwcyBhIGNvbWJvIGluIHN5bmMgd2l0aCB0aGUgZGF0YWJhc2Ugb2JqZWN0cwotICogd2hlbiBhIGNvbm5lY3Rpb24gaXMgYWN0aXZlLgotICoKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIENvbHVtbkNvbWJvCi0gKiBAc2VlIFNjaGVtYUNvbWJvCi0gKiBAc2VlIFNlcXVlbmNlQ29tYm8KLSAqIEBzZWUgVGFibGVDb21ibwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEYXRhYmFzZU9iamVjdENvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgotCWV4dGVuZHMgQ29tYm9QYW5lPFQ+Ci17Ci0JLyoqCi0JICogVGhlIGxpc3RlbmVyIGFkZGVkIHRvIHRoZSA8Y29kZT5Db25uZWN0aW9uUHJvZmlsZTwvY29kZT4uCi0JICogSXQga2VlcHMgdGhlIGNvbWJvIGluIHN5bmMgd2l0aCB0aGUgZGF0YWJhc2UgbWV0YWRhdGEuCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyOwotCQotCQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgRGF0YWJhc2VPYmplY3RDb21ibygKLQkJCVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIERhdGFiYXNlT2JqZWN0Q29tYm8oCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGluaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIodGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcl8oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXJfKCkgewotCQlyZXR1cm4gbmV3IExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcih0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcl8oKSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcl8oKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpewotCQkKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJY29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldE9sZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJKChDb25uZWN0aW9uUHJvZmlsZSkgZXZlbnQuZ2V0T2xkVmFsdWUoKSkucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCQlpZiAoZXZlbnQuZ2V0TmV3VmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkoKENvbm5lY3Rpb25Qcm9maWxlKSBldmVudC5nZXROZXdWYWx1ZSgpKS5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwkJCQotCQl9Ci0JCXRoaXMucmVwb3B1bGF0ZUNvbWJvQm94KCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogb3ZlcnJpZGVzICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnNfKFQgc3ViamVjdCkgewotCQlzdXBlci5lbmdhZ2VMaXN0ZW5lcnNfKHN1YmplY3QpOwotCi0JCXN1YmplY3QuZ2V0SnBhUHJvamVjdCgpLmdldERhdGFTb3VyY2UoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYURhdGFTb3VyY2UuQ09OTkVDVElPTl9QUk9GSUxFX1BST1BFUlRZLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIpOwotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHN1YmplY3QuZ2V0SnBhUHJvamVjdCgpLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmIChjcCAhPSBudWxsKSB7Ci0JCQljcC5hZGRDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVyc18oVCBzdWJqZWN0KSB7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gc3ViamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCWNwLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJc3ViamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0RGF0YVNvdXJjZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhRGF0YVNvdXJjZS5DT05ORUNUSU9OX1BST0ZJTEVfUFJPUEVSVFksIHRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcik7Ci0KLQkJc3VwZXIuZGlzZW5nYWdlTGlzdGVuZXJzXyhzdWJqZWN0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsdWVzKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZUlzQWN0aXZlKCkgPyB0aGlzLmdldFZhbHVlc18oKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQkKLQkvKioKLQkgKiBDYWxsZWQgb25seSB3aGVuIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBhY3RpdmUKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXNfKCk7Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN1YmplY3QncyBKUEEgcHJvamVjdC4KLQkgKiBBbGxvdyBzdWJjbGFzc2VzIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLCBzbyB3ZSBjYW4gc3RpbGwgZ2V0IHRoZSBKUEEKLQkgKiBwcm9qZWN0IGV2ZW4gd2hlbiB0aGUgc3ViamVjdCBpcyBudWxsLgotCSAqLwotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCVQgc3ViamVjdCA9IHRoaXMuZ2V0U3ViamVjdCgpOwotCQlyZXR1cm4gKHN1YmplY3QgPT0gbnVsbCkgPyBudWxsIDogc3ViamVjdC5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc3ViamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQlyZXR1cm4gKGpwYVByb2plY3QgPT0gbnVsbCkgPyBudWxsIDoganBhUHJvamVjdC5nZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciB0aGUgc3ViamVjdCdzIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBhY3RpdmUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29ubmVjdGlvblByb2ZpbGVJc0FjdGl2ZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgIT0gbnVsbCkgJiYgY3AuaXNBY3RpdmUoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3ViamVjdCdzIGRhdGFiYXNlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBEYXRhYmFzZSBnZXREYXRhYmFzZSgpIHsKLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCXJldHVybiAoY3AgPT0gbnVsbCkgPyBudWxsIDogY3AuZ2V0RGF0YWJhc2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIGxpc3RlbmVyIGNhbGxiYWNrcyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5kYXRhYmFzZUNoYW5nZWRfKGRhdGFiYXNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBkYXRhYmFzZUNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBEYXRhYmFzZSBkYXRhYmFzZSkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5jYXRhbG9nQ2hhbmdlZF8oY2F0YWxvZyk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY2F0YWxvZ0NoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCQotCXByb3RlY3RlZCBmaW5hbCB2b2lkIHNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSkgewotCQlpZiAoICEgdGhpcy5jb21ib0JveC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRoaXMuc2NoZW1hQ2hhbmdlZF8oc2NoZW1hKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzY2hlbWFDaGFuZ2VkXyhAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgU2NoZW1hIHNjaGVtYSkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5zZXF1ZW5jZUNoYW5nZWRfKHNlcXVlbmNlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZUNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBTZXF1ZW5jZSBzZXF1ZW5jZSkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgdGFibGVDaGFuZ2VkKFRhYmxlIHRhYmxlKSB7Ci0JCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy50YWJsZUNoYW5nZWRfKHRhYmxlKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCB0YWJsZUNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBUYWJsZSB0YWJsZSkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgY29sdW1uQ2hhbmdlZChDb2x1bW4gY29sdW1uKSB7Ci0JCWlmICggISB0aGlzLmNvbWJvQm94LmlzRGlzcG9zZWQoKSkgewotCQkJdGhpcy5jb2x1bW5DaGFuZ2VkXyhjb2x1bW4pOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNvbHVtbkNoYW5nZWRfKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2x1bW4gY29sdW1uKSB7Ci0JCS8vIGRvIG5vdGhpbmcgYnkgZGVmYXVsdAotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZChGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJaWYgKCAhIHRoaXMuY29tYm9Cb3guaXNEaXNwb3NlZCgpKSB7Ci0JCQl0aGlzLmZvcmVpZ25LZXlDaGFuZ2VkXyhmb3JlaWduS2V5KTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBmb3JlaWduS2V5Q2hhbmdlZF8oQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBmbGFnLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoZmxhZy5lcXVhbHMoVHJhY2luZy5VSV9EQikgJiYgVHJhY2luZy5ib29sZWFuRGVidWdPcHRpb24oVHJhY2luZy5VSV9EQikpIHsKLQkJCXRoaXMubG9nKG1lc3NhZ2UpOwotCQl9IGVsc2UgewotCQkJc3VwZXIubG9nKGZsYWcsIG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLy8gYnJvYWRlbiBhY2Nlc3NpYmlsaXR5IGEgYml0Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVwb3B1bGF0ZUNvbWJvQm94KCkgewotCQlzdXBlci5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIGxpc3RlbmVyICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxDb25uZWN0aW9uTGlzdGVuZXIgCi0JCWltcGxlbWVudHMgQ29ubmVjdGlvbkxpc3RlbmVyIAotCXsKLQkJcHJvdGVjdGVkIExvY2FsQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMubG9nKCJvcGVuZWQ6ICIgKyBwcm9maWxlLmdldE5hbWUoKSk7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMucmVwb3B1bGF0ZUNvbWJvQm94KCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMubG9nKCJtb2RpZmllZDogIiArIHByb2ZpbGUuZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKLQkJfQotCQkKLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMubG9nKCJPSyB0byBjbG9zZTogIiArIHByb2ZpbGUuZ2V0TmFtZSgpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5sb2coImFib3V0IHRvIGNsb3NlOiAiICsgcHJvZmlsZS5nZXROYW1lKCkpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5sb2coImNsb3NlZDogIiArIHByb2ZpbGUuZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5yZXBvcHVsYXRlQ29tYm9Cb3goKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCQl0aGlzLmxvZygiZGF0YWJhc2UgY2hhbmdlZDogIiArIGRhdGFiYXNlLmdldE5hbWUoKSk7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuZGF0YWJhc2VDaGFuZ2VkKGRhdGFiYXNlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQl0aGlzLmxvZygiY2F0YWxvZyBjaGFuZ2VkOiAiICsgY2F0YWxvZy5nZXROYW1lKCkpOwotCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLmNhdGFsb2dDaGFuZ2VkKGNhdGFsb2cpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCXRoaXMubG9nKCJzY2hlbWEgY2hhbmdlZDogIiArIHNjaGVtYS5nZXROYW1lKCkpOwotCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLnNjaGVtYUNoYW5nZWQoc2NoZW1hKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCQl0aGlzLmxvZygic2VxdWVuY2UgY2hhbmdlZDogIiArIHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuc2VxdWVuY2VDaGFuZ2VkKHNlcXVlbmNlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCQl0aGlzLmxvZygidGFibGUgY2hhbmdlZDogIiArIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMudGFibGVDaGFuZ2VkKHRhYmxlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29sdW1uQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDb2x1bW4gY29sdW1uKSB7Ci0JCQl0aGlzLmxvZygiY29sdW1uIGNoYW5nZWQ6ICIgKyBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCURhdGFiYXNlT2JqZWN0Q29tYm8udGhpcy5jb2x1bW5DaGFuZ2VkKGNvbHVtbik7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkJdGhpcy5sb2coImZvcmVpZ24ga2V5IGNoYW5nZWQ6ICIgKyBmb3JlaWduS2V5LmdldE5hbWUoKSk7Ci0JCQlEYXRhYmFzZU9iamVjdENvbWJvLnRoaXMuZm9yZWlnbktleUNoYW5nZWQoZm9yZWlnbktleSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQkJRGF0YWJhc2VPYmplY3RDb21iby50aGlzLmxvZyhUcmFjaW5nLlVJX0RCLCBtZXNzYWdlKTsKLQkJfQotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2NoZW1hQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9TY2hlbWFDb21iby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM2MDVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9TY2hlbWFDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbWJvLWJveCBkaXNwbGF5cyBhIHNjaGVtYSBjb250YWluZXIncyBzY2hlbWF0YS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNjaGVtYUNvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3RDb21ibzxUPgotewotCXB1YmxpYyBTY2hlbWFDb21ibygKLQkJCVBhbmU8PyBleHRlbmRzIFQ+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgU2NoZW1hQ29tYm8oCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRWYWx1ZXNfKCkgewotCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCXJldHVybiAoc2MgIT0gbnVsbCkgPyBzYy5nZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJcmV0dXJuICh0aGlzLmdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldERiU2NoZW1hQ29udGFpbmVyXygpOwotCX0KLQotCS8qKgotCSAqIEFzc3VtZSB0aGUgc3ViamVjdCBpcyBub3QgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU2NoZW1hQ29udGFpbmVyIGdldERiU2NoZW1hQ29udGFpbmVyXygpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2VxdWVuY2VDb21iby5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL1NlcXVlbmNlQ29tYm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0ZWM1Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvZGIvU2VxdWVuY2VDb21iby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIGNvbWJvLWJveCBkaXNwbGF5cyBhIHNjaGVtYSdzIHNlcXVlbmNlcy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNlcXVlbmNlQ29tYm88VCBleHRlbmRzIEpwYU5vZGU+Ci0JZXh0ZW5kcyBEYXRhYmFzZU9iamVjdENvbWJvPFQ+Ci17Ci0JcHVibGljIFNlcXVlbmNlQ29tYm8oCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldFZhbHVlc18oKSB7Ci0JCVNjaGVtYSBkYlNjaGVtYSA9IHRoaXMuZ2V0RGJTY2hlbWEoKTsKLQkJcmV0dXJuIChkYlNjaGVtYSAhPSBudWxsKSA/IGRiU2NoZW1hLmdldFNvcnRlZFNlcXVlbmNlSWRlbnRpZmllcnMoKSA6IEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYlNjaGVtYV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bWUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFNjaGVtYSBnZXREYlNjaGVtYV8oKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL1RhYmxlQ29tYm8uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9kYi9UYWJsZUNvbWJvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNDdiNzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2RiL1RhYmxlQ29tYm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBjb21iby1ib3ggZGlzcGxheXMgYSBzY2hlbWEncyB0YWJsZXMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUYWJsZUNvbWJvPFQgZXh0ZW5kcyBKcGFOb2RlPgotCWV4dGVuZHMgRGF0YWJhc2VPYmplY3RDb21ibzxUPgotewotCXB1YmxpYyBUYWJsZUNvbWJvKAotCQkJUGFuZTw/IGV4dGVuZHMgVD4gcGFyZW50UGFuZSwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBUYWJsZUNvbWJvKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsdWVzXygpIHsKLQkJU2NoZW1hIGRiU2NoZW1hID0gdGhpcy5nZXREYlNjaGVtYSgpOwotCQlyZXR1cm4gKGRiU2NoZW1hICE9IG51bGwpID8gZGJTY2hlbWEuZ2V0U29ydGVkVGFibGVJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JfQotCQotCXByb3RlY3RlZCBTY2hlbWEgZ2V0RGJTY2hlbWEoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5nZXREYlNjaGVtYV8oKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bWUgdGhlIHN1YmplY3QgaXMgbm90IG51bGwuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFNjaGVtYSBnZXREYlNjaGVtYV8oKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Fic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYzFlMzEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLk1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlLkphdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbgotCWltcGxlbWVudHMgTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JcHJpdmF0ZSBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIHNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQkKLQlwcml2YXRlIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIHNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zOwotCQotCXByaXZhdGUgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+W10gZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zOwotCQotCXByaXZhdGUgZmluYWwgSmF2YVVpRmFjdG9yeSBmYWN0b3J5OwotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZmFjdG9yeSA9IGJ1aWxkSmF2YVVpRmFjdG9yeSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSmF2YVVpRmFjdG9yeSBidWlsZEphdmFVaUZhY3RvcnkoKTsKLQkKLQlwdWJsaWMgSmF2YVVpRmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5OwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0KLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBKYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCQotCS8vICoqKioqKioqKiogdHlwZSBtYXBwaW5nIHVpIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlTdHJpbmcga2V5LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFR5cGVNYXBwaW5nPiBtYXBwaW5nVWlEZWZpbml0aW9uID0gZ2V0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKG1hcHBpbmdIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCXJldHVybiBtYXBwaW5nVWlEZWZpbml0aW9uLmJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJZ2V0RmFjdG9yeSgpLCAKLQkJCQltYXBwaW5nSG9sZGVyLAotCQkJCXBhcmVudCwKLQkJCQl3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxUeXBlTWFwcGluZz4gZ2V0SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKFR5cGVNYXBwaW5nIHR5cGVNYXBwaW5nKSB7Ci0JCWlmICh0eXBlTWFwcGluZyA9PSBudWxsIHx8IHR5cGVNYXBwaW5nLmdldEtleSgpID09IG51bGwpIHsKLQkJCXJldHVybiAoSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFR5cGVNYXBwaW5nPikgZ2V0RGVmYXVsdFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIChKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248VHlwZU1hcHBpbmc+KSBnZXRTcGVjaWZpZWRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24odHlwZU1hcHBpbmcuZ2V0S2V5KCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gZ2V0U3BlY2lmaWVkSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWZvciAoSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4gZGVmaW5pdGlvbiA6IGdldFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwgbWFwcGluZ0tleSkpIHsKLQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCX0KLQkJfQotCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyBtYXBwaW5nS2V5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgPyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gdHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgPyBleHRlbmRzIFR5cGVNYXBwaW5nPj4oCi0JCQkJZ2V0U3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+W10gZ2V0U3BlY2lmaWVkVHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5zcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5zcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMgPSBidWlsZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLnNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciB0eXBlcyBpbiBtYXBwaW5nIGZpbGVzIG9mIHRoaXMgdHlwZS4gIAotCSAqIFRoZSBvcmRlciBpcyB1bmltcG9ydGFudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz5bXSBidWlsZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJQXJyYXlMaXN0PEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucyA9IAotCQkJCW5ldyBBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KCk7Ci0JCWFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+W10gZGVmaW5pdGlvbkFycmF5ID0gCi0JCQkJZGVmaW5pdGlvbnMudG9BcnJheShuZXcgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOwotCQlyZXR1cm4gZGVmaW5pdGlvbkFycmF5OwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKLQkJCi0JcHVibGljIERlZmF1bHRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBnZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXJldHVybiBOdWxsSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogYXR0cmlidXRlcyBtYXBwaW5nIFVJIGRlZmluaXRpb25zICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVN0cmluZyBrZXksIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdVaURlZmluaXRpb24gPSAKLQkJCQlnZXRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKG1hcHBpbmdIb2xkZXIuZ2V0VmFsdWUoKSk7Ci0JCXJldHVybiBtYXBwaW5nVWlEZWZpbml0aW9uLmJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCQlnZXRGYWN0b3J5KCksIAotCQkJCW1hcHBpbmdIb2xkZXIsCi0JCQkJcGFyZW50LAotCQkJCXdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4gZ2V0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihBdHRyaWJ1dGVNYXBwaW5nIGF0dHJpYnV0ZU1hcHBpbmcpIHsKLQkJU3RyaW5nIGtleSA9IGF0dHJpYnV0ZU1hcHBpbmcgPT0gbnVsbCA/IG51bGwgOiBhdHRyaWJ1dGVNYXBwaW5nLmdldEtleSgpOwotCQlpZiAoYXR0cmlidXRlTWFwcGluZyA9PSBudWxsIHx8IGF0dHJpYnV0ZU1hcHBpbmcuaXNEZWZhdWx0KCkpIHsKLQkJCXJldHVybiAoSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4pIGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKGtleSk7Ci0JCX0KLQkJcmV0dXJuIChKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxBdHRyaWJ1dGVNYXBwaW5nPikgZ2V0U3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihrZXkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGdldFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJZm9yIChKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZGVmaW5pdGlvbiA6IGdldFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBtYXBwaW5nS2V5KSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgYXR0cmlidXRlIG1hcHBpbmcga2V5OiAiICsgbWFwcGluZ0tleSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiAKLQkJCWF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQkKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigKLQkJCQlnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBnZXRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuc3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMgPT0gbnVsbCkgewotCQkJdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyA9IGJ1aWxkU3BlY2lmaWVkQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5zcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciBhdHRyaWJ1dGVzIGluIG1hcHBpbmcgZmlsZXMgb2YgdGhpcyB0eXBlLiAgCi0JICogVGhlIG9yZGVyIGlzIHVuaW1wb3J0YW50LgotCSAqLwotCXByb3RlY3RlZCBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBidWlsZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucyA9IAotCQkJCW5ldyBBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigpOwotCQlhZGRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIGRlZmluaXRpb25BcnJheSA9IAotCQkJCWRlZmluaXRpb25zLnRvQXJyYXkobmV3IEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOwotCQlyZXR1cm4gZGVmaW5pdGlvbkFycmF5OwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRTcGVjaWZpZWRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKAotCQkJTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKLQkKLQkKLQkvLyAqKioqKioqKioqIGRlZmF1bHQgSmF2YSBhdHRyaWJ1dGUgbWFwcGluZyBVSSBwcm92aWRlcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBrZXkpIHsKLQkJZm9yIChEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+IGRlZmluaXRpb24gOiBnZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSkgewotCQkJaWYgKFRvb2xzLnZhbHVlc0FyZUVxdWFsKGRlZmluaXRpb24uZ2V0RGVmYXVsdEtleSgpLCBrZXkpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdHRyaWJ1dGUgbWFwcGluZyBrZXk6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIGdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMuZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMuZGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zID0gdGhpcy5idWlsZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLmRlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQl9Ci0JCi0JcHJvdGVjdGVkIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/PltdIGJ1aWxkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucyA9IAotCQkJCW5ldyBBcnJheUxpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PigpOwotCQlhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhkZWZpbml0aW9ucyk7Ci0JCURlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/PltdIGRlZmluaXRpb25BcnJheSA9IAotCQkJCWRlZmluaXRpb25zLnRvQXJyYXkobmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKLQkJcmV0dXJuIGRlZmluaXRpb25BcnJheTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkRGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gZGVmaW5pdGlvbnMpOwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQmFzZUphdmFVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0Jhc2VKYXZhVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNzA1MTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvQmFzZUphdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KLSAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZUphdmFVaUZhY3RvcnkgaW1wbGVtZW50cyBKYXZhVWlGYWN0b3J5Ci17CQotCQotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIG9ybSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW50aXR5Q29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBqYXZhIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhQmFzaWNNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFWZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJlZDMzZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9EZWZhdWx0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUJhc2ljTWFwcGluZz4KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhQmFzaWNNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJbmV3IERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhQmFzaWNNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0QmFzaWNNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRCYXNpY01hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldERlZmF1bHRLZXkoKSk7Ci0JfQotCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmVkMTM3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0RlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhRW1iZWRkZWRNYXBwaW5nPgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW1iZWRkZWRNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5EZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlQcm92aWRlcl9sYWJlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldExpbmtMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkRlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaVByb3ZpZGVyX2xpbmtMYWJlbDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldERlZmF1bHRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGNiZWUxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0dlbmVyaWNKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5EZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmljSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgR2VuZXJpY0phdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFVaUZhY3RvcnkgYnVpbGRKYXZhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKYXZhVWlGYWN0b3J5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpIHsKLQkJCi0JCWRlZmluaXRpb25zLmFkZChKYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8RGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoRGVmYXVsdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZFR5cGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKExpc3Q8SmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9HZW5lcmljSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvR2VuZXJpY0phdmFVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlMzRkMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9HZW5lcmljSmF2YVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi0vKioKLSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBKYXZhIFVJIGZhY3RvcnkgcmVxdWlyZWQgdG8gc2hvdyB0aGUgaW5mb3JtYXRpb24KLSAqIHJlbGF0ZWQgdG8gYSBKUEEgbWFwcGluZyAodHlwZSBvciBhdHRyaWJ1dGUpLgotICoKLSAqIEBzZWUgSmF2YVVpRmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFVaUZhY3RvcnkgZXh0ZW5kcyBCYXNlSmF2YVVpRmFjdG9yeQotewotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZmMTk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFCYXNpY01hcHBpbmc+Ci0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhQmFzaWNNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJbmV3IEphdmFCYXNpY01hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFCYXNpY01hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YUJhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGUxZTRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYW5lIGRvZXMgbm90IGhhdmUgYW55IHdpZGdldHMuCi0gKgotICogQHNlZSBFbWJlZGRhYmxlCi0gKiBAc2VlIEVtYmVkZGFibGVVaVByb3ZpZGVyCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkYWJsZUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZUNvbXBvc2l0ZTxFbWJlZGRhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMwOGE4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24gCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIEphdmFFbWJlZGRhYmxlPgotCWltcGxlbWVudHMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRhYmxlPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IEphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGFibGU+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkYWJsZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRhYmxlPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nVURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRjMTE5Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFFbWJlZGRlZElkTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbWJlZGRlZElkTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhRW1iZWRkZWRJZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRW1iZWRkZWRJZE1hcHBpbmdVRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9CQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ExYzc4NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhRW1iZWRkZWRNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGVkTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVtYmVkZGVkTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmM3NjU5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoZSBwYW5lIHVzZWQgZm9yIGEgSmF2YSBlbnRpdHkuCi0gKgotICogQHNlZSBKYXZhRW50aXR5Ci0gKiBAc2VlIEphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlPEphdmFFbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KYXZhRW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SmF2YUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhRW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJbmhlcml0YW5jZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFFbnRpdHlVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjNjg1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhRW50aXR5VWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUVudGl0eVVpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RFbnRpdHlVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIEphdmFFbnRpdHk+Ci0JaW1wbGVtZW50cyBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUVudGl0eT4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhRW50aXR5VWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YUVudGl0eVVpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbnRpdHk+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRW50aXR5VWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZUphdmFFbnRpdHlDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWMwNDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0SWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUlkTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFJZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFJZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJvdGVjdGVkIEphdmFJZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyOTA5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgamF2YSBpbmhlcml0YW5jZS4KLSAqCi0gKiBAc2VlIEphdmFFbnRpdHkKLSAqIEBzZWUgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxKYXZhRW50aXR5PiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFJbmhlcml0YW5jZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEphdmFFbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMGNlMjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFNYW55VG9NYW55TWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9NYW55TWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9NYW55TWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTcwYjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhTWFueVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFNYW55VG9PbmVNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgSmF2YU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThmYTM1NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSWRDbGFzc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIHYgUXVlcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE1hcHBlZFN1cGVyY2xhc3MKLSAqIEBzZWUgQmFzZUphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBjbGFzcyBKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQwYzk2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCBKYXZhTWFwcGVkU3VwZXJjbGFzcz4KLQlpbXBsZW1lbnRzIEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhTWFwcGVkU3VwZXJjbGFzcz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU1hcHBlZFN1cGVyY2xhc3M+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzMDQ0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFPbmVUb01hbnlNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvTWFueU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2ZWU2MS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBKYXZhT25lVG9PbmVNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvT25lTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgSmF2YU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YU9uZVRvT25lTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSmF2YVVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDA0NmQ5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgSmF2YSBwZXJzaXN0ZW50Ci0gKiBhdHRyaWJ1dGUuCi0gKiA8cD4KLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVHlwZSBtYXBwaW5nIHBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUKLSAqIEBzZWUgSmF2YVBlcnNpc3RlbnRUeXBlTWFwQXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UKLQlleHRlbmRzIFBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTWFwIGFzIGNvbXBvc2l0ZQotCQluZXcgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAwLCA1LCAwKQotCQkpOwotCi0JCWJ1aWxkTWFwcGluZ1BhZ2VCb29rKGNvbnRhaW5lcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWI3NjkxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0Q29tbW9uQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSA8Y29kZT5KcGFEZXRhaWxzUGFnZTwvY29kZT4KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIEphdmEgc291cmNlIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcgotCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYURldGFpbHNQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIEphdmFTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JRCkKLQkJCQkmJiBzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpLmdldENvbnRlbnRUeXBlKCkuZXF1YWxzKEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfQ09OVEVOVF9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ0YzIxMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU3RydWN0dXJlTm9kZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSA8Y29kZT5KcGFEZXRhaWxzUGFnZTwvY29kZT4KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIEphdmEgc291cmNlIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYURldGFpbHNQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYURldGFpbHNQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIEphdmFTdHJ1Y3R1cmVOb2Rlcy5QRVJTSVNURU5UX1RZUEVfSUQpCi0JCQkJJiYgc3RydWN0dXJlTm9kZS5nZXRSZXNvdXJjZVR5cGUoKS5nZXRDb250ZW50VHlwZSgpLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX0NPTlRFTlRfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFEZXRhaWxzUGFnZTxQZXJzaXN0ZW50VHlwZT4gYnVpbGREZXRhaWxzUGFnZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZShwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1ZjA2Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBAc2VlIEphdmFFbnRpdHkKLSAqIEBzZWUgSmF2YUluaGVyaXRhbmNlQ29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCXB1YmxpYyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8UHJpbWFyeUtleUpvaW5Db2x1bW4+KGJ1aWxkRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFByaW1hcnlLZXlKb2luQ29sdW1uPiBidWlsZERlZmF1bHRKb2luQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBKYXZhRW50aXR5LkRFRkFVTFRfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByaW1hcnlLZXlKb2luQ29sdW1uIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzd2l0Y2hEZWZhdWx0VG9TcGVjaWZpZWQoKSB7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCi0JCWlmIChkZWZhdWx0Sm9pbkNvbHVtbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCk7Ci0JCQlTdHJpbmcgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBkZWZhdWx0Sm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQotCQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gZ2V0U3ViamVjdCgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShjb2x1bW5OYW1lKTsKLQkJCXBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShyZWZlcmVuY2VkQ29sdW1uTmFtZSk7Ci0KLQkJCXRoaXMuam9pbkNvbHVtbkhvbGRlci5zZXRWYWx1ZShwa0pvaW5Db2x1bW4pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWY4OTg5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5Ci0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKiBAc2VlIFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFTZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+U2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEphdmFFbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPEphdmFTZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEphdmFTZWNvbmRhcnlUYWJsZT4oYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCksIAotCQkJUmVhZE9ubHlUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JfQkKLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8SmF2YVNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8SmF2YUVudGl0eSwgSmF2YVNlY29uZGFyeVRhYmxlPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eS5TUEVDSUZJRURfU0VDT05EQVJZX1RBQkxFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8SmF2YVNlY29uZGFyeVRhYmxlPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFNlY29uZGFyeVRhYmxlPiBzZWNvbmRhcnlUYWJsZUhvbGRlciA9Ci0JCQlidWlsZFNlY29uZGFyeVRhYmxlSG9sZGVyKCk7Ci0KLQkJLy8gU2Vjb25kYXJ5IFRhYmxlcyBhZGQvcmVtb3ZlIGxpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKLQkJCXRoaXMsCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwKLQkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVzQWRhcHRlcigpLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TW9kZWwoKSwKLQkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZUxhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TLy9UT0RPIG5lZWQgYSBoZWxwIGNvbnRleHQgaWQgZm9yIHRoaXMKLQkJKTsKLQotCQkvLyBQcmltYXJ5IEtleSBKb2luIENvbHVtbnMgcGFuZQotCQluZXcgUHJpbWFyeUtleUpvaW5Db2x1bW5zSW5TZWNvbmRhcnlUYWJsZUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlzZWNvbmRhcnlUYWJsZUhvbGRlciwKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3ZTQzMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0VHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFUcmFuc2llbnRNYXBwaW5nPgotCWltcGxlbWVudHMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YVRyYW5zaWVudE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YVRyYW5zaWVudE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVRyYW5zaWVudE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVKYXZhVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL0phdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZjliZDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFWZXJzaW9uTWFwcGluZz4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFWZXJzaW9uTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBKYXZhVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFWZXJzaW9uTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlSmF2YVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyZTY0OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvamF2YS9OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEphdmFBdHRyaWJ1dGVNYXBwaW5nPgotCWltcGxlbWVudHMgRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFBdHRyaWJ1dGVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQluZXcgTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yQXR0cmlidXRlTWFwcGluZyhnZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5OdWxsQXR0cmlidXRlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7Ci0JCXJldHVybiBNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgTnVsbENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEphdmFBdHRyaWJ1dGVNYXBwaW5nPgotCQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotCXsKLQkJTnVsbENvbXBvc2l0ZSgKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkJICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHt9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL2phdmEvTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDcwODQ0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9qYXZhL051bGxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsIEphdmFUeXBlTWFwcGluZz4KLQlpbXBsZW1lbnRzIERlZmF1bHRKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb248SmF2YVR5cGVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE51bGxKYXZhVHlwZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgTnVsbEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRGVmYXVsdEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxKYXZhVHlwZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBOdWxsSmF2YVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JUeXBlTWFwcGluZyhudWxsKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLk51bGxUeXBlTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLZXkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlKYXZhVWlGYWN0b3J5IGZhY3RvcnksIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFUeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBOdWxsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTnVsbENvbXBvc2l0ZSAKLQkJZXh0ZW5kcyBQYW5lPEphdmFUeXBlTWFwcGluZz4KLQkJaW1wbGVtZW50cyBKcGFDb21wb3NpdGUgCi0JewotCQlOdWxsQ29tcG9zaXRlKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCSAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCQotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHt9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMjU4YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBYbWxQYWNrYWdlQ2hvb3NlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFNjaGVtYTogICAgICB8IFNjaGVtYUNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IENhdGFsb2c6ICAgICB8IENhdGFsb2dDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IEFjY2VzcyBUeXBlOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybUdlbmVyYXRvcnNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgQWJzdHJhY3RFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQ2F0YWxvZ0NvbWJvCi0gKiBAc2VlIEVudW1Gb3JtQ29tYm9WaWV3ZXIKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlCi0gKiBAc2VlIE9ybVBhY2thZ2VDaG9vc2VyCi0gKiBAc2VlIE9ybVF1ZXJpZXNDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUKLSAqIEBzZWUgU2NoZW1hQ29tYm8KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0SnBhRGV0YWlsc1BhZ2U8RW50aXR5TWFwcGluZ3M+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0eU1hcHBpbmdzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUdlbmVyYXRvcnNDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJdGhpcy5pbml0aWFsaXplUXVlcmllc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW50aXR5TWFwcGluZ3NDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5FbnRpdHlNYXBwaW5nc1NlY3Rpb25fdGl0bGUsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uVFJVRSkKLQkJKTsKLQotCQl0aGlzLmluaXRpYWxpemVFbnRpdHlNYXBwaW5nc1NlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVudGl0eU1hcHBpbmdzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIFBhY2thZ2Ugd2lkZ2V0cwotCQluZXcgT3JtUGFja2FnZUNob29zZXIodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBTY2hlbWEgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9zY2hlbWEsCi0JCQlhZGRTY2hlbWFDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9TQ0hFTUEKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2VfY2F0YWxvZywKLQkJCWFkZENhdGFsb2dDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9DQVRBTE9HCi0JCSk7Ci0KLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlidWlsZFBlcnNpc3RlbnRVbml0TWV0YWRhdGFIb2xkZXIoKSwKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA1KQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBDYXRhbG9nQ29tYm88RW50aXR5TWFwcGluZ3M+IGFkZENhdGFsb2dDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDYXRhbG9nQ29tYm88RW50aXR5TWFwcGluZ3M+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKEVudGl0eU1hcHBpbmdzLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCQlnZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENhdGFsb2coKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPiBidWlsZFBlcnNpc3RlbnRVbml0TWV0YWRhdGFIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHRyYW5zZm9ybV8oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hQ29tYm88RW50aXR5TWFwcGluZ3M+IGFkZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPEVudGl0eU1hcHBpbmdzPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChFbnRpdHlNYXBwaW5ncy5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoRW50aXR5TWFwcGluZ3MuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRvcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCWNvbnRhaW5lcgotCQkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybVF1ZXJpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2Q4NDI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkVudGl0eU5hbWVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLklkQ2xhc3NDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBPUk0gZW50aXR5LgotICoKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIEJhc2VKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW50aXR5Q29tcG9zaXRlPE9ybUVudGl0eT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPk9ybUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdE9ybUVudGl0eUNvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVRdWVyaWVzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUluaGVyaXRhbmNlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZUF0dHJpYnV0ZU92ZXJyaWRlc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQl0aGlzLmluaXRpYWxpemVHZW5lcmF0b3JzQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCXRoaXMuaW5pdGlhbGl6ZVNlY29uZGFyeVRhYmxlc0NvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIsIGZhbHNlKTsKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVTZWNvbmRhcnlUYWJsZXNTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVJbmhlcml0YW5jZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIxMTU2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0Fic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlMaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLk1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQWxsIHRoZSBzdGF0ZSBpbiB0aGUgZGVmaW5pdGlvbiBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlIGl0IGlzIGluaXRpYWxpemVkKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLQlpbXBsZW1lbnRzIE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCQotCXByaXZhdGUgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIG9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQotCXByaXZhdGUgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBvcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQkKLQlwcml2YXRlIGZpbmFsIE9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5OwotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mYWN0b3J5ID0gYnVpbGRPcm1YbWxVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpOwotCQotCXB1YmxpYyBPcm1YbWxVaUZhY3RvcnkgZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMuZmFjdG9yeTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBPUk0gdHlwZSBtYXBwaW5ncyAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKFN0cmluZyBrZXksIFByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwgQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCU9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPFR5cGVNYXBwaW5nPiBtYXBwaW5nVWlEZWZpbml0aW9uID0gCi0JCQkoT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248VHlwZU1hcHBpbmc+KSBnZXRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihrZXkpOwotCQlyZXR1cm4gbWFwcGluZ1VpRGVmaW5pdGlvbi5idWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJZ2V0RmFjdG9yeSgpLCAKLQkJCW1hcHBpbmdIb2xkZXIsCi0JCQlwYXJlbnQsCi0JCQl3aWRnZXRGYWN0b3J5Ci0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGdldE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWZvciAoT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPiBkZWZpbml0aW9uIDogZ2V0T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBtYXBwaW5nS2V5KSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgdHlwZSBtYXBwaW5nIGtleTogIiArIG1hcHBpbmdLZXkpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiAKLQkJCXR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJCi0JCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PigKLQkJCQlnZXRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIGdldE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJaWYgKHRoaXMub3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zID09IG51bGwpIHsKLQkJCXRoaXMub3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zID0gdGhpcy5idWlsZE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpOwotCQl9Ci0JCXJldHVybiB0aGlzLm9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uczsKLQl9Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIG1hcHBpbmcgZGVmaW5pdGlvbnMgdG8gdXNlIGZvciB0eXBlcyBpbiBtYXBwaW5nIGZpbGVzIG9mIHRoaXMgdHlwZS4gIAotCSAqIFRoZSBvcmRlciBpcyB1bmltcG9ydGFudC4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIGJ1aWxkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMgPSBuZXcgQXJyYXlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+KCk7Ci0JCXRoaXMuYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oZGVmaW5pdGlvbnMpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPltdIGRlZmluaXRpb25BcnJheSA9IGRlZmluaXRpb25zLnRvQXJyYXkobmV3IE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uW2RlZmluaXRpb25zLnNpemUoKV0pOwotCQlyZXR1cm4gZGVmaW5pdGlvbkFycmF5OwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBhZGRPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFR5cGVNYXBwaW5nPj4gZGVmaW5pdGlvbnMpOwotCQotCXB1YmxpYyBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgPyBleHRlbmRzIFR5cGVNYXBwaW5nPiBnZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCS8vdGhlcmUgaXMgbm8gd2F5IHRvIGNob29zZSBhbiB0eXBlIGluIHRoZSBvcm0ueG1sIHRoYXQgZG9lc24ndCBoYXZlIGEgc3BlY2lmaWVkIG1hcHBpbmcgc28gd2UgY2FuIHJldHVybiBudWxsIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCS8vICoqKioqKioqKiogT1JNIGF0dHJpYnV0ZSBtYXBwaW5ncyAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoU3RyaW5nIGtleSwgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU1hcHBpbmc+IG1hcHBpbmdIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCU9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IAotCQkJKE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248QXR0cmlidXRlTWFwcGluZz4pIGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oa2V5KTsKLQkJcmV0dXJuIG1hcHBpbmdVaURlZmluaXRpb24uYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJZ2V0RmFjdG9yeSgpLCAKLQkJCW1hcHBpbmdIb2xkZXIsCi0JCQlwYXJlbnQsCi0JCQl3aWRnZXRGYWN0b3J5Ci0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBnZXRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKFN0cmluZyBtYXBwaW5nS2V5KSB7Ci0JCWZvciAoT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZGVmaW5pdGlvbiA6IGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkpIHsKLQkJCWlmIChUb29scy52YWx1ZXNBcmVFcXVhbChkZWZpbml0aW9uLmdldEtleSgpLCBtYXBwaW5nS2V5KSkgewotCQkJCXJldHVybiBkZWZpbml0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKTsKLQl9Ci0JCi0JcHVibGljIExpc3RJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBhdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpIHsKLQkJcmV0dXJuIG5ldyBBcnJheUxpc3RJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgPyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PigKLQkJCQlnZXRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHN5bmNocm9uaXplZCBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPltdIGdldE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlpZiAodGhpcy5vcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyA9PSBudWxsKSB7Ci0JCQl0aGlzLm9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zID0gdGhpcy5idWlsZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMub3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybiBhbiBhcnJheSBvZiBtYXBwaW5nIGRlZmluaXRpb25zIHRvIHVzZSBmb3IgYXR0cmlidXRlcyBpbiBtYXBwaW5nIGZpbGVzIG9mIHRoaXMgdHlwZS4gIAotCSAqIFRoZSBvcmRlciBpcyB1bmltcG9ydGFudC4KLQkgKi8KLQlwcm90ZWN0ZWQgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz5bXSBidWlsZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQlBcnJheUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zID0gbmV3IEFycmF5TGlzdDxPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4oKTsKLQkJdGhpcy5hZGRPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uc1RvKGRlZmluaXRpb25zKTsKLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCU9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+W10gZGVmaW5pdGlvbkFycmF5ID0gZGVmaW5pdGlvbnMudG9BcnJheShuZXcgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbltkZWZpbml0aW9ucy5zaXplKCldKTsKLQkJcmV0dXJuIGRlZmluaXRpb25BcnJheTsKLQl9Ci0JCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbygKLQkJCUxpc3Q8T3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKTsKLQkKLQlwdWJsaWMgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oU3RyaW5nIGtleSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0FkZEdlbmVyYXRvckRpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9BZGRHZW5lcmF0b3JEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU2MTllNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0FkZEdlbmVyYXRvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5EaWFsb2dQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5WYWxpZGF0aW5nRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogQ2xpZW50cyBjYW4gdXNlIHRoaXMgZGlhbG9nIHRvIHByb21wdCB0aGUgdXNlciBmb3IgU2Vjb25kYXJ5VGFibGUgc2V0dGluZ3MuCi0gKiBVc2UgdGhlIGZvbGxvd2luZyBvbmNlIHRoZSBkaWFsb2cgaXMgY2xvc2VkOgotICogICAgIEBzZWUgI2dldFNlbGVjdGVkVGFibGUoKQotICogICAgIEBzZWUgI2dldFNlbGVjdGVkQ2F0YWxvZygpCi0gKiAgICAgQHNlZSAjZ2V0U2VsZWN0ZWRTY2hlbWEoKQotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRHZW5lcmF0b3JEaWFsb2cgZXh0ZW5kcyBWYWxpZGF0aW5nRGlhbG9nPEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0PiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VRVUVOQ0VfR0VORVJBVE9SID0gInNlcXVlbmNlR2VuZXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX0dFTkVSQVRPUiA9ICJ0YWJsZUdlbmVyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBhc3NvY2lhdGVkIHBlcnNpc3RlbmNlIHVuaXQKLQkgKi8KLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBwVW5pdDsKLQkKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBlZGl0IGFuIGV4aXN0aW5nIGNvbnZlcnNpb24gdmFsdWUKLQkgKi8KLQlwdWJsaWMgQWRkR2VuZXJhdG9yRGlhbG9nKFNoZWxsIHBhcmVudCwgUGVyc2lzdGVuY2VVbml0IHBVbml0KSB7Ci0JCXN1cGVyKHBhcmVudCk7Ci0JCXRoaXMucFVuaXQgPSBwVW5pdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QgYnVpbGRTdGF0ZU9iamVjdCgpIHsKLQkJcmV0dXJuIG5ldyBBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdCh0aGlzLnBVbml0KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG9wZW4gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIuY29uZmlndXJlU2hlbGwoc2hlbGwpOwotCQlzaGVsbC5zZXRUZXh0KHRoaXMuZ2V0VGl0bGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkFkZEdlbmVyYXRvckRpYWxvZ190aXRsZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uVGl0bGUoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5BZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb25UaXRsZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkFkZEdlbmVyYXRvckRpYWxvZ19kZXNjcmlwdGlvbjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIERpYWxvZ1BhbmU8QWRkR2VuZXJhdG9yU3RhdGVPYmplY3Q+IGJ1aWxkTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JEaWFsb2dQYW5lKGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZSgpIHsKLQkJc3VwZXIuY3JlYXRlKCk7Ci0KLQkJR2VuZXJhdG9yRGlhbG9nUGFuZSBwYW5lID0gKEdlbmVyYXRvckRpYWxvZ1BhbmUpIGdldFBhbmUoKTsKLQkJcGFuZS5zZWxlY3RBbGwoKTsKLQotCQlnZXRCdXR0b24oT0spLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBwdWJsaWMgQVBJICoqKioqKioqKioKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZGF0YSB2YWx1ZSBzZXQgaW4gdGhlIHRleHQgd2lkZ2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBvYmplY3QgdmFsdWUgc2V0IGluIHRoZSB0ZXh0IHdpZGdldC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEdlbmVyYXRvclR5cGUoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0R2VuZXJhdG9yVHlwZSgpOwotCX0KLQkKLQlwcml2YXRlIGNsYXNzIEdlbmVyYXRvckRpYWxvZ1BhbmUgZXh0ZW5kcyBEaWFsb2dQYW5lPEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0PiB7Ci0KLQkJcHJpdmF0ZSBUZXh0IG5hbWVUZXh0OwotCi0JCUdlbmVyYXRvckRpYWxvZ1BhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoQWRkR2VuZXJhdG9yRGlhbG9nLnRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJdGhpcy5uYW1lVGV4dCA9IGFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5BZGRHZW5lcmF0b3JEaWFsb2dfbmFtZSwKLQkJCQlidWlsZE5hbWVIb2xkZXIoKQotCQkJKTsKLQkJCQotCQkJYWRkTGFiZWxlZENvbWJvKAotCQkJCWNvbnRhaW5lciwgCi0JCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX2dlbmVyYXRvclR5cGUsIAotCQkJCWJ1aWxkR2VuZXJhdG9yVHlwZUxpc3RIb2xkZXIoKSwgCi0JCQkJYnVpbGRHZW5lcmF0b3JUeXBlSG9sZGVyKCksIAotCQkJCWJ1aWxkU3RyaW5nQ29udmVydGVyKCksCi0JCQkJbnVsbCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEdlbmVyYXRvclR5cGVMaXN0SG9sZGVyKCkgewotCQkJTGlzdDxTdHJpbmc+IGdlbmVyYXRvclR5cGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQlnZW5lcmF0b3JUeXBlcy5hZGQoVEFCTEVfR0VORVJBVE9SKTsKLQkJCWdlbmVyYXRvclR5cGVzLmFkZChTRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJCi0JCQlyZXR1cm4gbmV3IFN0YXRpY0xpc3RWYWx1ZU1vZGVsPFN0cmluZz4oZ2VuZXJhdG9yVHlwZXMpOwotCQl9Ci0JCQotCQlwcml2YXRlIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IGJ1aWxkU3RyaW5nQ29udmVydGVyKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJCQkJaWYgKHZhbHVlID09IFRBQkxFX0dFTkVSQVRPUikgewotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkFkZEdlbmVyYXRvckRpYWxvZ190YWJsZUdlbmVyYXRvcjsKLQkJCQkJfQotCQkJCQlpZiAodmFsdWUgPT0gU0VRVUVOQ0VfR0VORVJBVE9SKSB7Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuQWRkR2VuZXJhdG9yRGlhbG9nX3NlcXVlbmNlR2VuZXJhdG9yOwotCQkJCQl9Ci0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCQotCQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROYW1lSG9sZGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QWRkR2VuZXJhdG9yU3RhdGVPYmplY3QsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdC5OQU1FX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEdlbmVyYXRvclR5cGVIb2xkZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0LkdFTkVSQVRPUl9UWVBFX1BST1BFUlRZKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRHZW5lcmF0b3JUeXBlKCk7Ci0JCQkJfQotCi0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0R2VuZXJhdG9yVHlwZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgc2VsZWN0QWxsKCkgewotCQkJdGhpcy5uYW1lVGV4dC5zZWxlY3RBbGwoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQWRkR2VuZXJhdG9yU3RhdGVPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg0N2MyZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0FkZEdlbmVyYXRvclN0YXRlT2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSU1lc3NhZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuQWJzdHJhY3ROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5ub2RlLk5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm5vZGUuUHJvYmxlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHN0YXRlIG9iamVjdCB1c2VkIGJ5IHRoZSA8Y29kZT5BZGRHZW5lcmF0b3JEaWFsb2c8L2NvZGU+LCB3aGljaCBzdG9yZXMKLSAqIHRoZSBjdXJyZW50IG5hbWUgYW5kIHZhbGlkYXRlcyBpdCB3aGVuIGl0IGlzIG1vZGlmaWVkLgotICoKLSAqIEBzZWUgQWRkR2VuZXJhdG9yRGlhbG9nCi0gKgotICogQHZlcnNpb24gMi4xCi0gKiBAc2luY2UgMi4xCi0gKi8KLWZpbmFsIGNsYXNzIEFkZEdlbmVyYXRvclN0YXRlT2JqZWN0IGV4dGVuZHMgQWJzdHJhY3ROb2RlCi17Ci0JLyoqCi0JICogVGhlIGluaXRpYWwgbmFtZSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBUaGUgaW5pdGlhbCBnZW5lcmF0b3JUeXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdG9yVHlwZTsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5WYWxpZGF0b3I8L2NvZGU+IHVzZWQgdG8gdmFsaWRhdGUgdGhpcyBzdGF0ZSBvYmplY3QuCi0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3IgdmFsaWRhdG9yOwotCi0JLyoqCi0JICogVGhlIGFzc29jaWF0ZWQgcGVyc2lzdGVuY2UgdW5pdAotCSAqLwotCXByaXZhdGUgUGVyc2lzdGVuY2VVbml0IHBVbml0OwotCQotCS8qKgotCSAqIE5vdGlmaWVzIGEgY2hhbmdlIGluIHRoZSBkYXRhIHZhbHVlIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9QUk9QRVJUWSA9ICJuYW1lUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogTm90aWZpZXMgYSBjaGFuZ2UgaW4gdGhlIGdlbmVyYXRvciB0eXBlIHByb3BlcnR5LgotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1RZUEVfUFJPUEVSVFkgPSAiZ2VuZXJhdG9yVHlwZVByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OZXdOYW1lU3RhdGVPYmplY3Q8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIG5hbWUgVGhlIGluaXRpYWwgaW5wdXQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gaW5pdGlhbCB2YWx1ZSBjYW4KLQkgKiBiZSBzcGVjaWZpZWQKLQkgKiBAcGFyYW0gbmFtZXMgVGhlIGNvbGxlY3Rpb24gb2YgbmFtZXMgdGhhdCBjYW4ndCBiZSB1c2VkIG9yIGFuIGVtcHR5Ci0JICogY29sbGVjdGlvbiBpZiBub25lIGFyZSBhdmFpbGFibGUKLQkgKi8KLQlBZGRHZW5lcmF0b3JTdGF0ZU9iamVjdChQZXJzaXN0ZW5jZVVuaXQgcFVuaXQpIHsKLQkJc3VwZXIobnVsbCk7Ci0JCXRoaXMucFVuaXQgPSBwVW5pdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmFtZVByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodGhpcy5uYW1lKSkgewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuR2VuZXJhdG9yU3RhdGVPYmplY3RfbmFtZU11c3RCZVNwZWNpZmllZCwgSU1lc3NhZ2VQcm92aWRlci5FUlJPUikpOwotCQl9IAotCQllbHNlIGlmIChuYW1lcygpLmNvbnRhaW5zKHRoaXMubmFtZSkpewotCQkJY3VycmVudFByb2JsZW1zLmFkZChidWlsZFByb2JsZW0oSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuR2VuZXJhdG9yU3RhdGVPYmplY3RfbmFtZUV4aXN0cywgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKSk7Ci0JCX0gCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEdlbmVyYXRvclR5cGVQcm9ibGVtc1RvKExpc3Q8UHJvYmxlbT4gY3VycmVudFByb2JsZW1zKSB7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2VuZXJhdG9yVHlwZSkpIHsKLQkJCWN1cnJlbnRQcm9ibGVtcy5hZGQoYnVpbGRQcm9ibGVtKEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLkdlbmVyYXRvclN0YXRlT2JqZWN0X3R5cGVNdXN0QmVTcGVjaWZpZWQsIElNZXNzYWdlUHJvdmlkZXIuRVJST1IpKTsKLQkJfQotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFByb2JsZW1zVG8oTGlzdDxQcm9ibGVtPiBjdXJyZW50UHJvYmxlbXMpIHsKLQkJc3VwZXIuYWRkUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGROYW1lUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCQlhZGRHZW5lcmF0b3JUeXBlUHJvYmxlbXNUbyhjdXJyZW50UHJvYmxlbXMpOwotCX0KLQkKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBuYW1lcygpIHsKLQkJTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoR2VuZXJhdG9yIGdlbmVyYXRvciA6IHRoaXMucFVuaXQuZ2V0R2VuZXJhdG9ycygpKXsKLQkJCVN0cmluZyBuYW1lID0gZ2VuZXJhdG9yLmdldE5hbWUoKTsKLQkJCW5hbWVzLmFkZChuYW1lKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tQYXJlbnQoTm9kZSBwYXJlbnROb2RlKSB7Ci0JCS8vbm8gcGFyZW50Ci0JfQotCi0JcHVibGljIFN0cmluZyBkaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0R2VuZXJhdG9yVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhdG9yVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCVN0cmluZyBvbGROYW1lID0gdGhpcy5uYW1lOwotCQl0aGlzLm5hbWUgPSBuZXdOYW1lOwotCQlmaXJlUHJvcGVydHlDaGFuZ2VkKE5BTUVfUFJPUEVSVFksIG9sZE5hbWUsIG5ld05hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdlbmVyYXRvclR5cGUoU3RyaW5nIG5ld0dlbmVyYXRvclR5cGUpIHsKLQkJU3RyaW5nIG9sZCA9IHRoaXMuZ2VuZXJhdG9yVHlwZTsKLQkJdGhpcy5nZW5lcmF0b3JUeXBlID0gbmV3R2VuZXJhdG9yVHlwZTsKLQkJZmlyZVByb3BlcnR5Q2hhbmdlZChHRU5FUkFUT1JfVFlQRV9QUk9QRVJUWSwgb2xkLCBuZXdHZW5lcmF0b3JUeXBlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3IoVmFsaWRhdG9yIHZhbGlkYXRvcikgewotCQl0aGlzLnZhbGlkYXRvciA9IHZhbGlkYXRvcjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgVmFsaWRhdG9yIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHRoaXMudmFsaWRhdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vQmFzZU9ybVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlT3JtWG1sVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NGQ4ZDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9CYXNlT3JtWG1sVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVHJhbnNpZW50TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIE9ybSBYbWwgVUkgZmFjdG9yeSByZXF1aXJlZCB0byBzaG93IHRoZSBpbmZvcm1hdGlvbgotICogcmVsYXRlZCB0byBhIEpQQSBtYXBwaW5nICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlT3JtWG1sVWlGYWN0b3J5IGltcGxlbWVudHMgT3JtWG1sVWlGYWN0b3J5Ci17Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBvcm0gdHlwZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FbWJlZGRhYmxlQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogb3JtIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtT25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5ZWM0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgWG1sUGFja2FnZUNob29zZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9ybVF1ZXJpZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzCi0gKiBAc2VlIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDYXRhbG9nQ29tYm8KLSAqIEBzZWUgRW51bUZvcm1Db21ib1ZpZXdlcgotICogQHNlZSBFbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUKLSAqIEBzZWUgT3JtUGFja2FnZUNob29zZXIKLSAqIEBzZWUgT3JtUXVlcmllc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZQotICogQHNlZSBTY2hlbWFDb21ibwotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSBleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTQzNTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIFRoaXMgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSB7QGxpbmsgSnBhRGV0YWlsc1BhZ2V9Ci0gKiB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjb21lcyBmcm9tIHRoZSBYTUwgZmlsZSAoZWl0aGVyIGZyb20gdGhlIHBlcnNpc3RlbmNlCi0gKiBjb25maWd1cmF0aW9uIG9yIGZyb20gdGhlIE1hcHBpbmdzIERlc2NyaXB0b3IpLgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlNYXBwaW5nc0RldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPEVudGl0eU1hcHBpbmdzPiBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MTkxMjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuc3dpbmcuT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFOYW1lZENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkdlbmVyYXRvckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhYmxlR2VuZXJhdG9yQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGUuR2VuZXJhdG9yQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0vKioKLSAqIFRoaXMgcGFuZSBzaG93cyB0aGUgbGlzdCBvZiBuYW1lZCBxdWVyaWVzIGFuZCBuYW1lZCBuYXRpdmUgcXVlcmllcy4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcm1TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSBvciBPcm1UYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbnRpdHlNYXBwaW5ncwotICogQHNlZSBPcm1HZW5lcmF0b3IKLSAqIEBzZWUgT3JtU2VxdWVuY2VHZW5lcmF0b3IKLSAqIEBzZWUgT3JtVGFibGVHZW5lcmF0b3IKLSAqIEBzZWUgRW50aXR5Q29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgT3JtU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUKLSAqIEBzZWUgT3JtVGFibGVHZW5lcmF0b3JDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjIKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8RW50aXR5TWFwcGluZ3M+Ci17Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPcm1HZW5lcmF0b3I+IGdlbmVyYXRvckhvbGRlcjsKLQlHZW5lcmF0b3JDb21wb3NpdGU8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9yUGFuZTsKLQlUYWJsZUdlbmVyYXRvckNvbXBvc2l0ZSB0YWJsZUdlbmVyYXRvclBhbmU7Ci0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gbGlzdFBhbmU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlKAotCQkJCQkJUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCQotCXZvaWQgYWRkR2VuZXJhdG9yKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJYWRkR2VuZXJhdG9yRnJvbURpYWxvZyhsaXN0U2VsZWN0aW9uTW9kZWwsIGJ1aWxkQWRkR2VuZXJhdG9yRGlhbG9nKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgQWRkR2VuZXJhdG9yRGlhbG9nIGJ1aWxkQWRkR2VuZXJhdG9yRGlhbG9nKCkgewotCQlyZXR1cm4gbmV3IEFkZEdlbmVyYXRvckRpYWxvZyhnZXRTaGVsbCgpLCB0aGlzLmdldFN1YmplY3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkR2VuZXJhdG9yRnJvbURpYWxvZyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsLCBBZGRHZW5lcmF0b3JEaWFsb2cgZGlhbG9nKSB7Ci0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5PSykgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyBnZW5lcmF0b3JUeXBlID0gZGlhbG9nLmdldEdlbmVyYXRvclR5cGUoKTsKLQkJT3JtR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQkJaWYgKGdlbmVyYXRvclR5cGUgPT0gQWRkR2VuZXJhdG9yRGlhbG9nLlRBQkxFX0dFTkVSQVRPUikgewotCQkJZ2VuZXJhdG9yID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJfQotCQllbHNlIGlmIChnZW5lcmF0b3JUeXBlID09IEFkZEdlbmVyYXRvckRpYWxvZy5TRVFVRU5DRV9HRU5FUkFUT1IpIHsKLQkJCWdlbmVyYXRvciA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJZ2VuZXJhdG9yLnNldE5hbWUoZGlhbG9nLmdldE5hbWUoKSk7Ci0JCXRoaXMuZ2VuZXJhdG9ySG9sZGVyLnNldFZhbHVlKGdlbmVyYXRvcik7Ly9zbyB0aGF0IGl0IGdldHMgc2VsZWN0ZWQgaW4gdGhlIExpc3QgZm9yIHRoZSB1c2VyIHRvIGVkaXQKLQkJbGlzdFNlbGVjdGlvbk1vZGVsLnNldFNlbGVjdGVkVmFsdWUoZ2VuZXJhdG9yKTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4gYnVpbGREaXNwbGF5YWJsZUdlbmVyYXRvckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE9ybUdlbmVyYXRvcj4oCi0JCQlidWlsZEdlbmVyYXRvcnNMaXN0SG9sZGVyKCksCi0JCQlKcGFOYW1lZENvbnRleHROb2RlLk5BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCkgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRHZW5lcmF0b3IobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgewotCQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKChPcm1TZXF1ZW5jZUdlbmVyYXRvcikgaXRlbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKE9ybVRhYmxlR2VuZXJhdG9yKSBpdGVtKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4gYnVpbGRHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUdlbmVyYXRvcj4oKTsKLQl9Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkR2VuZXJhdG9yTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlPcm1HZW5lcmF0b3IgZ2VuZXJhdG9yID0gKE9ybUdlbmVyYXRvcikgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IGdlbmVyYXRvci5nZXROYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCWludCBpbmRleCA9IC0xOwotCi0JCQkJCWlmIChnZW5lcmF0b3IgaW5zdGFuY2VvZiBPcm1TZXF1ZW5jZUdlbmVyYXRvcikgewotCQkJCQkJaW5kZXggPSBDb2xsZWN0aW9uVG9vbHMuaW5kZXhPZihnZXRTdWJqZWN0KCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCksIGdlbmVyYXRvcik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpbmRleCA9IENvbGxlY3Rpb25Ub29scy5pbmRleE9mKGdldFN1YmplY3QoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKSwgZ2VuZXJhdG9yKTsKLQkJCQkJfQotCi0JCQkJCW5hbWUgPSBOTFMuYmluZChKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmcsIEludGVnZXIudmFsdWVPZihpbmRleCkpOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yPiBidWlsZEdlbmVyYXRvcnNMaXN0SG9sZGVyKCkgewotCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1HZW5lcmF0b3I+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtR2VuZXJhdG9yPj4oKTsKLQkJbGlzdC5hZGQoYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckxpc3RIb2xkZXIoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkVGFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkpOwotCQlyZXR1cm4gbmV3IENvbXBvc2l0ZUxpc3RWYWx1ZU1vZGVsPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1HZW5lcmF0b3I+LCBPcm1HZW5lcmF0b3I+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8T3JtR2VuZXJhdG9yLCBDb250cm9sPiBidWlsZFBhbmVUcmFuc2Zvcm1lcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1lcjxPcm1HZW5lcmF0b3IsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKE9ybUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQotCQkJCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlpZiAoZ2VuZXJhdG9yIGluc3RhbmNlb2YgT3JtU2VxdWVuY2VHZW5lcmF0b3IpIHsKLQkJCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZS50aGlzLnNlcXVlbmNlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZS50aGlzLnRhYmxlR2VuZXJhdG9yUGFuZS5nZXRDb250cm9sKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBTZXF1ZW5jZUdlbmVyYXRvcj4odGhpcy5nZW5lcmF0b3JIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFNlcXVlbmNlR2VuZXJhdG9yKSA/IChTZXF1ZW5jZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1TZXF1ZW5jZUdlbmVyYXRvcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFbnRpdHlNYXBwaW5ncy5TRVFVRU5DRV9HRU5FUkFUT1JTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8VGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtR2VuZXJhdG9yLCBUYWJsZUdlbmVyYXRvcj4odGhpcy5nZW5lcmF0b3JIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRhYmxlR2VuZXJhdG9yIHRyYW5zZm9ybV8oT3JtR2VuZXJhdG9yIHZhbHVlKSB7Ci0JCQkJcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIFRhYmxlR2VuZXJhdG9yKSA/IChUYWJsZUdlbmVyYXRvcikgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8T3JtVGFibGVHZW5lcmF0b3I+IGJ1aWxkVGFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1UYWJsZUdlbmVyYXRvcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlFbnRpdHlNYXBwaW5ncy5UQUJMRV9HRU5FUkFUT1JTX0xJU1QpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1UYWJsZUdlbmVyYXRvcj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGFibGVHZW5lcmF0b3JzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuZ2VuZXJhdG9ySG9sZGVyID0gYnVpbGRHZW5lcmF0b3JIb2xkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5Pcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2dyb3VwQm94Ci0JCSk7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCXRoaXMubGlzdFBhbmUgPSBhZGRMaXN0UGFuZShjb250YWluZXIpOwotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCi0JCS8vIFByb3BlcnR5IHBhbmUKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciA9Ci0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKTsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvckhvbGRlciA9Ci0JCQl0aGlzLmJ1aWxkVGFibGVHZW5lcmF0b3JIb2xkZXIoKTsKLQotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gU2VxdWVuY2UgR2VuZXJhdG9yIHByb3BlcnR5IHBhbmUKLQkJdGhpcy5zZXF1ZW5jZUdlbmVyYXRvclBhbmUgPSB0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQlwYWdlQm9vaywKLQkJCXNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJdGhpcy5idWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpCi0JCSk7Ci0KLQkJLy8gVGFibGUgR2VuZXJhdG9yIHByb3BlcnR5IHBhbmUKLQkJdGhpcy50YWJsZUdlbmVyYXRvclBhbmUgPSBuZXcgVGFibGVHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJdGFibGVHZW5lcmF0b3JIb2xkZXIsCi0JCQlwYWdlQm9vaywKLQkJCXRoaXMuYnVpbGRUYWJsZUdlbmVyYXRvckJ1aWxkZXIoKQotCQkpOwotCi0JCXRoaXMuYWRkQWxpZ25SaWdodCh0aGlzLnNlcXVlbmNlR2VuZXJhdG9yUGFuZSk7Ci0JCXRoaXMuYWRkQWxpZ25SaWdodCh0aGlzLnRhYmxlR2VuZXJhdG9yUGFuZSk7Ci0JCXRoaXMuaW5zdGFsbFBhbmVTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckNvbXBvc2l0ZTxTZXF1ZW5jZUdlbmVyYXRvcj4gYnVpbGRTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZSgKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJR2VuZXJhdG9yQnVpbGRlcjxTZXF1ZW5jZUdlbmVyYXRvcj4gZ2VuZXJhdG9yQnVpbGRlcikgewotCi0JCXJldHVybiBuZXcgU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJc2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIsCi0JCQlwYXJlbnQsCi0JCQlnZW5lcmF0b3JCdWlsZGVyCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxFbnRpdHlNYXBwaW5ncz4gYWRkTGlzdFBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5TWFwcGluZ3M+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRHZW5lcmF0b3JBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkRGlzcGxheWFibGVHZW5lcmF0b3JMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmdlbmVyYXRvckhvbGRlciwKLQkJCXRoaXMuYnVpbGRHZW5lcmF0b3JMYWJlbFByb3ZpZGVyKCkKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKCkgewotCQluZXcgUGFuZUVuYWJsZXIoCi0JCQl0aGlzLmJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSwKLQkJCXRoaXMubGlzdFBhbmUKLQkJKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVTd2l0Y2hlcihQYWdlQm9vayBwYWdlQm9vaykgewotCQluZXcgQ29udHJvbFN3aXRjaGVyKHRoaXMuZ2VuZXJhdG9ySG9sZGVyLCB0aGlzLmJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9CQotCi0JcHJpdmF0ZSBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZFNlcXVlbmNlR2VuZXJhdG9yQnVpbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPigpIHsKLQkJCXB1YmxpYyBTZXF1ZW5jZUdlbmVyYXRvciBhZGRHZW5lcmF0b3IoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgc2VxdWVuY2UgZ2VuZXJhdG9yIHdpbGwgbmV2ZXIgYmUgbnVsbCBzbyB3ZSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPiBidWlsZFRhYmxlR2VuZXJhdG9yQnVpbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdWlsZGVyPFRhYmxlR2VuZXJhdG9yPigpIHsKLQkJCXB1YmxpYyBUYWJsZUdlbmVyYXRvciBhZGRHZW5lcmF0b3IoKSB7Ci0JCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgdGFibGUgZ2VuZXJhdG9yIHdpbGwgbmV2ZXIgYmUgbnVsbCBzbyB3ZSBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgdGhpcyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL0dlbmVyaWNPcm1YbWxVaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vR2VuZXJpY09ybVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWE3NDFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vR2VuZXJpY09ybVhtbFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtWG1sVWlGYWN0b3J5IGV4dGVuZHMgQmFzZU9ybVhtbFVpRmFjdG9yeQotewotCS8vbm90aGluZwotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9KcHRVaURldGFpbHNPcm1NZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9KcHRVaURldGFpbHNPcm1NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjk4MGQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBPUk0gd2lkZ2V0cy4KLSAqCi0gKiBAdmVyc2lvbiAzLjIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzU2VjdGlvbl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc0RldGFpbHNQYWdlX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2Vfc2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eU1hcHBpbmdzUGFnZV9jYXRhbG9nRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc1BhZ2VfY2F0YWxvZ05vRGVmYXVsdFNwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc1BhZ2Vfc2NoZW1hRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlNYXBwaW5nc1BhZ2Vfc2NoZW1hTm9EZWZhdWx0U3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGVfbWV0YWRhdGFDb21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlX21ldGFkYXRhQ29tcGxldGVXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1HZW5lcmF0b3JzQ29tcG9zaXRlX2Rpc3BsYXlTdHJpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3JtR2VuZXJhdG9yc0NvbXBvc2l0ZV9ncm91cEJveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1NYXBwaW5nTmFtZUNob29zZXJfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1KYXZhQ2xhc3NDaG9vc2VyX2phdmFDbGFzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcm1RdWVyaWVzQ29tcG9zaXRlX2dyb3VwQm94OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2RlbGltaXRlZElkZW50aWZpZXJzQ2hlY2tCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2FzY2FkZVBlcnNpc3RDaGVja0JveDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3BlcnNpc3RlbmNlVW5pdFNlY3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfc2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlQ2hlY2tCb3g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFTZWN0aW9uX2NhdGFsb2dEZWZhdWx0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhU2VjdGlvbl9zY2hlbWFEZWZhdWx0OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX2dlbmVyYXRvclR5cGU7Ci0gCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEdlbmVyYXRvckRpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb25UaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRHZW5lcmF0b3JEaWFsb2dfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkR2VuZXJhdG9yRGlhbG9nX3RhYmxlR2VuZXJhdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEdlbmVyYXRvckRpYWxvZ19zZXF1ZW5jZUdlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0b3JTdGF0ZU9iamVjdF9uYW1lRXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRvclN0YXRlT2JqZWN0X25hbWVNdXN0QmVTcGVjaWZpZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdG9yU3RhdGVPYmplY3RfdHlwZU11c3RCZVNwZWNpZmllZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaVByb3ZpZGVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpUHJvdmlkZXJfbGlua0xhYmVsOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gImpwdF91aV9kZXRhaWxzX29ybSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBCVU5ETEVfQ0xBU1MgPSBKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5jbGFzczsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9NZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL01ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJkNGY2MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL01ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9ybVR5cGVNYXBwaW5nPiB7Ci0KLQlwdWJsaWMgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1UeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBUT0RPIG5vdCBzdXJlIHRoZSBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG87IHNpbmNlIG1ldGFkYXRhIGNvbXBsZXRlCi0JCS8vIGhhcyBhbiAib3ZlcnJpZGUiIChmcm9tIHRoZSBwZXJzaXN0ZW5jZSB1bml0KSwgbm90IGEgZGVmYXVsdC4uLgotCQlhZGRUcmlTdGF0ZUNoZWNrQm94V2l0aERlZmF1bHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5NZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlX21ldGFkYXRhQ29tcGxldGUsCi0JCQlidWlsZE1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSwKLQkJCWJ1aWxkTWV0YWRhdGFDb21wbGV0ZVN0cmluZ0hvbGRlcigpLAotCQkJbnVsbAotCQkpOwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTWV0YWRhdGFDb21wbGV0ZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtVHlwZU1hcHBpbmcsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJT3JtVHlwZU1hcHBpbmcuU1BFQ0lGSUVEX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRNZXRhZGF0YUNvbXBsZXRlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGRPdmVycmlkZU1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIHRyYW5zZm9ybShCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSA9IHZhbHVlLmJvb2xlYW5WYWx1ZSgpID8gSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX1RydWUgOiBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fRmFsc2U7Ci0JCQkJCXJldHVybiBOTFMuYmluZChKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5NZXRhZGF0YUNvbXBsZXRlQ29tcG9zaXRlX21ldGFkYXRhQ29tcGxldGVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGVfbWV0YWRhdGFDb21wbGV0ZTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPdmVycmlkZU1ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVR5cGVNYXBwaW5nLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9ybVR5cGVNYXBwaW5nLlNQRUNJRklFRF9NRVRBREFUQV9DT01QTEVURV9QUk9QRVJUWSwKLQkJCU9ybVR5cGVNYXBwaW5nLk9WRVJSSURFX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1CYXNpY01hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBmNDUzYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0QmFzaWNNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU8QmFzaWNNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFPcm1CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5CYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVCYXNpY1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQ29sdW1uQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sdW1uSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcHRpb25hbENvbXBvc2l0ZSh0aGlzLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWJmODJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0QmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RCYXNpY01hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1CYXNpY01hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUJhc2ljTWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJbmV3IE9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1CYXNpY01hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUJhc2ljTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtQmFzaWNNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGFibGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxN2RiZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGFibGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGFibGVDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGFibGVDb21wb3NpdGU8T3JtRW1iZWRkYWJsZT4gaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQlwdWJsaWMgT3JtRW1iZWRkYWJsZUNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5pbml0aWFsaXplRW1iZWRkYWJsZUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbWJlZGRhYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1KYXZhQ2xhc3NDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE1ldGFkYXRhQ29tcGxldGVDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybUVtYmVkZGFibGUsIEFjY2Vzc0hvbGRlcj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2MTFhYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGFibGVVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbiAKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkYWJsZVVpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgT3JtRW1iZWRkYWJsZT4KLQlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybUVtYmVkZGFibGU+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcm1FbWJlZGRhYmxlVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRhYmxlPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybUVtYmVkZGFibGVDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTMyMWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkSWRNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJCXRoaXMsCi0JCQkJY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOGEwOGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1FbWJlZGRlZElkTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRW1iZWRkZWRJZE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRlZElkTWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0JCi0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YTQ1YzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbWJlZGRlZEF0dHJpYnV0ZU92ZXJyaWRlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBFbWJlZGRlZE1hcHBpbmcKLSAqIEBzZWUgQmFzZUphdmFVaUZhY3RvcnkgLSBUaGUgZmFjdG9yeSBjcmVhdGluZyB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8RW1iZWRkZWRNYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+RW1iZWRkZWRNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVtYmVkZGVkTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0KLQkJbmV3IEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQljb250YWluZXIKLQkJKTsKLQl9CQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmYxOTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUVtYmVkZGVkTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRW1iZWRkZWRNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbWJlZGRlZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtRW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW50aXR5Q29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViYmJjZGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1FbnRpdHlDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgYW4gT1JNIGVudGl0eS4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBCYXNlSmF2YVVpRmFjdG9yeSAtIFRoZSBmYWN0b3J5IGNyZWF0aW5nIHRoaXMgcGFuZQotICogQHNlZSBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybUVudGl0eUNvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1FbnRpdHlDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5Pcm1FbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRW50aXR5Q29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW50aXR5VWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUVudGl0eVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGVjNTQ2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtRW50aXR5VWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbnRpdHlVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RW50aXR5VWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCBPcm1FbnRpdHk+Ci0JaW1wbGVtZW50cyBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbnRpdHk+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRW50aXR5VWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtRW50aXR5VWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbnRpdHk+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1FbnRpdHlVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRUeXBlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybUVudGl0eUNvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZiMWM5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmdDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPElkTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1JZE1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2ZTY3ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmdVaURlZmluaXRpb24gCi0JZXh0ZW5kcyBBYnN0cmFjdElkTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybUlkTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtSWRNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1JZE1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1JZE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtSWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtSWRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1Jbmhlcml0YW5jZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmVhZGQyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSW5oZXJpdGFuY2VDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIHBhbmUgdXNlZCBmb3IgamF2YSBpbmhlcml0YW5jZS4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RJbmhlcml0YW5jZUNvbXBvc2l0ZTxPcm1FbnRpdHk+IHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtSW5oZXJpdGFuY2VDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIE9ybUVudGl0eT4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybUphdmFDbGFzc0Nob29zZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUNsYXNzQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRlYTUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtSmF2YUNsYXNzQ2hvb3Nlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBDbGFzc0Nob29zZXJQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIFRPRE8gcG9zc2libHkgaGVscCB0aGUgdXNlciBhbmQgaWYgdGhleSBoYXZlIGNob3NlbiBhIHBhY2thZ2UgYXQgdGhlCi0gKiBlbnRpdHktbWFwcGluZ3MgbGV2ZWwgb25seSBpbnNlcnQgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIHhtbCBmaWxlIGlmIHRoZXkKLSAqIGNob29zZSBhIGNsYXNzIGZyb20gdGhlIHBhY2thZ2UuCi0gKiBOb3Qgc3VyZSBpZiB0aGlzIHNob3VsZCBiZSBkcml2ZW4gYnkgdGhlIFVJIG9yIGJ5IHVpIGFwaSBpbiB0aGUgbW9kZWwKLSAqCi0gKiBAc2VlIE9ybVR5cGVNYXBwaW5nCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBDbGFzc0Nob29zZXJQYW5lCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1KYXZhQ2xhc3NDaG9vc2VyIGV4dGVuZHMgUGFuZTxPcm1UeXBlTWFwcGluZz4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YbWxKYXZhQ2xhc3NDaG9vc2VyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udHJvbGxlciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtSmF2YUNsYXNzQ2hvb3NlcihQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1UeXBlTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgT3JtSmF2YUNsYXNzQ2hvb3NlcihQYW5lPD8+IHBhcmVudFBhbmUsCi0gICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtVHlwZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0gICAgICAgIGJvb2xlYW4gYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cykgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgYXV0b21hdGljYWxseUFsaWduV2lkZ2V0cyk7Ci0JfQotCi0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8T3JtVHlwZU1hcHBpbmc+IGFkZENsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPE9ybVR5cGVNYXBwaW5nPih0aGlzLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtVHlwZU1hcHBpbmcsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBPcm1UeXBlTWFwcGluZy5DTEFTU19QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2xhc3NfKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQkJdGhpcy5zdWJqZWN0LnNldENsYXNzKHZhbHVlKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRDbGFzc18oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuT3JtSmF2YUNsYXNzQ2hvb3Nlcl9qYXZhQ2xhc3M7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldENsYXNzKGNsYXNzTmFtZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElUeXBlIHJlc29sdmVKZHRUeXBlKCkgewotCQkJCXJldHVybiBzdXBlci5nZXRTdWJqZWN0KCkuZ2V0SmR0VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWEwNzQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3JkZXJpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGFyZ2V0RW50aXR5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBPcmRlcmluZ0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgTWFueVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9NYW55Sm9pbmluZ1N0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIEZldGNoVHlwZUNvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIENhc2NhZGVDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBPcmRlcmluZ0NvbXBvc2l0ZX0KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxNYW55VG9NYW55TWFwcGluZywgTWFueVRvTWFueVJlbGF0aW9uc2hpcD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZUNvbXBvc2l0ZSh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyZTQ0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbgotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybU1hbnlUb01hbnlNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1NYW55VG9NYW55TWFwcGluZz4KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcm1NYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hbnlUb01hbnlNYXBwaW5nPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYjBhNjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk1hbnlUb09uZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE1hbnlUb09uZU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBUYXJnZXRFbnRpdHlDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgRmV0Y2hUeXBlQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgT3B0aW9uYWxDb21wb3NpdGV9Ci0gKiBAc2VlIHtAbGluayBDYXNjYWRlQ29tcG9zaXRlfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxPcm1NYW55VG9PbmVNYXBwaW5nLCBPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb09uZU1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksICBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjczODc2Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBPcm1NYW55VG9PbmVNYXBwaW5nPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1NYW55VG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24gSU5TVEFOQ0UgPSAKLQkJCW5ldyBPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hbnlUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gZmFjdG9yeS5jcmVhdGVPcm1NYW55VG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2ZWE1ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NIb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTxPcm1NYXBwZWRTdXBlcmNsYXNzPgotICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JcHVibGljIE9ybU1hcHBlZFN1cGVyY2xhc3NDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybU1hcHBlZFN1cGVyY2xhc3M+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkU3VwZXJjbGFzc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtSmF2YUNsYXNzQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5MTk0Ni4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbiAKLQlleHRlbmRzIEFic3RyYWN0TWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjxQZXJzaXN0ZW50VHlwZSwgT3JtTWFwcGVkU3VwZXJjbGFzcz4KLQlpbXBsZW1lbnRzIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hcHBlZFN1cGVyY2xhc3M+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU1hcHBlZFN1cGVyY2xhc3M+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkVHlwZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGluZ05hbWVDaG9vc2VyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU1hcHBpbmdOYW1lQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGMxMWE2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtTWFwcGluZ05hbWVDaG9vc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtTWFwcGluZ05hbWVDaG9vc2VyCi0JZXh0ZW5kcyBQYW5lPEF0dHJpYnV0ZU1hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5YbWxKYXZhQXR0cmlidXRlQ2hvb3NlcjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtTWFwcGluZ05hbWVDaG9vc2VyKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLk9ybU1hcHBpbmdOYW1lQ2hvb3Nlcl9uYW1lLAotCQkJYnVpbGROYW1lSG9sZGVyKCkKLQkJKTsKLQl9Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QXR0cmlidXRlTWFwcGluZywgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIE9ybUF0dHJpYnV0ZU1hcHBpbmcuTkFNRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5pc1ZpcnR1YWwoKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJLy8gd2UgY2FuIHNhZmVseSBjYXN0IHRvIGFuIG9ybS54bWwgbWFwcGluZyBzaW5jZSBpdCBpcyBub3QgdmlydHVhbAotCQkJCSgoT3JtQXR0cmlidXRlTWFwcGluZykgdGhpcy5zdWJqZWN0KS5zZXROYW1lKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGEwZGY2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ2FzY2FkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luVGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9yZGVyaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENhc2NhZGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JkZXJpbmdDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9NYW55TWFwcGluZwotICogQHNlZSBDYXNjYWRlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBKb2luVGFibGVDb21wb3NpdGUKLSAqIEBzZWUgT3JkZXJpbmdDb21wb3NpdGUKLSAqIEBzZWUgVGFyZ2V0RW50aXR5Q29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIAotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlPE9uZVRvTWFueU1hcHBpbmcsIE9uZVRvTWFueVJlbGF0aW9uc2hpcD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9NYW55TWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODk5YWM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0T25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybU9uZVRvTWFueU1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybU9uZVRvTWFueU1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtT25lVG9NYW55TWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb09uZU1hcHBpbmdDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3MmFlMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldEVudGl0eUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgSm9pbmluZ1N0cmF0ZWd5Q29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBGZXRjaFR5cGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQ2FzY2FkZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgT25lVG9PbmVNYXBwaW5nCi0gKiBAc2VlIFRhcmdldEVudGl0eUNvbXBvc2l0ZQotICogQHNlZSBKb2luaW5nU3RyYXRlZ3lDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIE9wdGlvbmFsQ29tcG9zaXRlCi0gKiBAc2VlIENhc2NhZGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSAKLQlleHRlbmRzIEFic3RyYWN0T25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlPE9uZVRvT25lTWFwcGluZywgT25lVG9PbmVSZWxhdGlvbnNoaXA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PbmVUb09uZU1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5JT25lVG9PbmVNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9uZVRvT25lTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0JCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVDb21wb3NpdGUodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksICBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzN2ZhNDIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybU9uZVRvT25lTWFwcGluZz4KLQlpbXBsZW1lbnRzIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtT25lVG9PbmVNYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1PbmVUb09uZU1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1PbmVUb09uZU1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlT3JtT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QYWNrYWdlQ2hvb3Nlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QYWNrYWdlQ2hvb3Nlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE5M2MzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGFja2FnZUNob29zZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYWNrYWdlQ2hvb3NlclBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBQYWNrYWdlQ2hvb3NlclBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFBhY2thZ2VDaG9vc2VyUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtUGFja2FnZUNob29zZXIgZXh0ZW5kcyBQYW5lPEVudGl0eU1hcHBpbmdzPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+WG1sUGFja2FnZUNob29zZXI8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250cm9sbGVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcm1QYWNrYWdlQ2hvb3NlcihQYW5lPD8gZXh0ZW5kcyBFbnRpdHlNYXBwaW5ncz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkUGFja2FnZUNob29zZXJQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBhY2thZ2VDaG9vc2VyUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJbmV3IFBhY2thZ2VDaG9vc2VyUGFuZTxFbnRpdHlNYXBwaW5ncz4odGhpcywgY29udGFpbmVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbnRpdHlNYXBwaW5ncywgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIEVudGl0eU1hcHBpbmdzLlBBQ0tBR0VfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQYWNrYWdlKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCQkJc3ViamVjdC5zZXRQYWNrYWdlKHZhbHVlID09ICIiID8gbnVsbCA6IHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZV9wYWNrYWdlOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVByb2plY3QoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0UGFja2FnZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFBhY2thZ2VOYW1lKFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NGUxMGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRldGFpbHMgcGFnZSB1c2VkIGZvciB0aGUgWE1MIHBlcnNpc3RlbnQKLSAqIGF0dHJpYnV0ZS4KLSAqIDxwPgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBdHRyaWJ1dGUgbWFwcGluZyBwYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBPcm1QZXJzaXN0ZW50QXR0cmlidXRlCi0gKiBAc2VlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlCi0JZXh0ZW5kcyBQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2U8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQYWdlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJQXJyYXlMaXN0PFBhbmU8Pz4+IHBhbmVzID0gbmV3IEFycmF5TGlzdDxQYW5lPD8+PigyKTsKLQotCQkvLyBNYXAgQXMgY29tcG9zaXRlCi0JCVBhbmU8Pz4gbWFwQXNQYW5lID0gYnVpbGRNYXBBc1BhbmUoYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDAsIDUsIDApKTsKLQkJcGFuZXMuYWRkKG1hcEFzUGFuZSk7Ci0KLQkJYnVpbGRNYXBwaW5nUGFnZUJvb2soY29udGFpbmVyKTsKLQotCQlpbnN0YWxsUGFuZUVuYWJsZXIocGFuZXMpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGFuZTxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGJ1aWxkTWFwQXNQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb21wb3NpdGUodGhpcywgcGFyZW50KTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5zdGFsbFBhbmVFbmFibGVyKEFycmF5TGlzdDxQYW5lPD8+PiBwYW5lcykgewotCQluZXcgUGFuZUVuYWJsZXIoYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLCBwYW5lcyk7Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCF2YWx1ZS5pc1ZpcnR1YWwoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JCi0JLy9UT0RPIHRoaXMgcHJvYmFibHkgbmVlZHMgdG8gY2hhbmdlIGFuZCB1c2UgYSBQYW5lRW5hYmxlciBpbnN0ZWFkLgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFDb21wb3NpdGUgZ2V0TWFwcGluZ0NvbXBvc2l0ZShTdHJpbmcga2V5KSB7Ci0JCUpwYUNvbXBvc2l0ZSBtYXBwaW5nQ29tcG9zaXRlID0gc3VwZXIuZ2V0TWFwcGluZ0NvbXBvc2l0ZShrZXkpOwotCQlpZiAobWFwcGluZ0NvbXBvc2l0ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQotCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwgJiYgZ2V0U3ViamVjdCgpLmdldFBhcmVudCgpICE9IG51bGwpIHsKLQkJCWVuYWJsZWQgPSAhZ2V0U3ViamVjdCgpLmlzVmlydHVhbCgpOwotCQl9Ci0KLQkJbWFwcGluZ0NvbXBvc2l0ZS5lbmFibGVXaWRnZXRzKGVuYWJsZWQpOwotCQlyZXR1cm4gbWFwcGluZ0NvbXBvc2l0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyN2QyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKLSAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFEZXRhaWxzUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKLQkJCXJldHVybiBUb29scy52YWx1ZXNBcmVFcXVhbChzdHJ1Y3R1cmVOb2RlLmdldElkKCksIE9ybVN0cnVjdHVyZU5vZGVzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lEKQotCQkJCSYmIHN0cnVjdHVyZU5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihKcHRKcGFDb3JlUGx1Z2luLk1BUFBJTkdfRklMRV9DT05URU5UX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBPcm1QZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZDQ4NzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TdHJ1Y3R1cmVOb2RlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuUGVyc2lzdGVudFR5cGVEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIHtAbGluayBKcGFEZXRhaWxzUGFnZX0KLSAqIHdoZW4gdGhlIGluZm9ybWF0aW9uIGNvbWVzIGZyb20gdGhlIFhNTCBmaWxlIChlaXRoZXIgZnJvbSB0aGUgcGVyc2lzdGVuY2UKLSAqIGNvbmZpZ3VyYXRpb24gb3IgZnJvbSB0aGUgTWFwcGluZ3MgRGVzY3JpcHRvcikuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1QZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcgotCWltcGxlbWVudHMgSnBhRGV0YWlsc1Byb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhRGV0YWlsc1Byb3ZpZGVyIElOU1RBTkNFID0gbmV3IE9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYURldGFpbHNQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzRGV0YWlscyhKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUpIHsKLQkJcmV0dXJuIFRvb2xzLnZhbHVlc0FyZUVxdWFsKHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSwgT3JtU3RydWN0dXJlTm9kZXMuUEVSU0lTVEVOVF9UWVBFX0lEKQotCQkJCSYmIHN0cnVjdHVyZU5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkuZ2V0Q29udGVudFR5cGUoKS5pc0tpbmRPZihKcHRKcGFDb3JlUGx1Z2luLk1BUFBJTkdfRklMRV9DT05URU5UX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8UGVyc2lzdGVudFR5cGU+IGJ1aWxkRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRUeXBlRGV0YWlsc1BhZ2UocGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5ZmMyZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEBzZWUgT3JtRW50aXR5Ci0gKiBAc2VlIE9ybUluaGVyaXRhbmNlQ29tcG9zaXRlIC0gVGhlIGNvbnRhaW5lciBvZiB0aGlzIHBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVByaW1hcnlLZXlKb2luQ29sdW1uc0NvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0UHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlPE9ybUVudGl0eT4KLXsKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5zQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gYnVpbGREZWZhdWx0Sm9pbkNvbHVtbnNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgUmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlPcm1FbnRpdHkuREVGQVVMVF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTlNfTElTVCkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc3dpdGNoRGVmYXVsdFRvU3BlY2lmaWVkKCkgewotCQlmb3IgKFJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdEpvaW5Db2x1bW4gOiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpKSB7Ci0JCQlTdHJpbmcgY29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKTsKLQkJCVN0cmluZyByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0KLQkJCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldFN1YmplY3QoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQkJcGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoY29sdW1uTmFtZSk7Ci0JCQlwa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUocmVmZXJlbmNlZENvbHVtbk5hbWUpOwotCQl9Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtUXVlcmllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1RdWVyaWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZDZkYmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1RdWVyaWVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgUXVlcmllc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3MKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFF1ZXJpZXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE9ybVF1ZXJpZXNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEVudGl0eU1hcHBpbmdzPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybVF1ZXJpZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVF1ZXJpZXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgRW50aXR5TWFwcGluZ3M+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkUGFuZUVuYWJsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8RW50aXR5TWFwcGluZ3MsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oRW50aXR5TWFwcGluZ3MgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlICE9IG51bGwpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuT3JtUXVlcmllc0NvbXBvc2l0ZV9ncm91cEJveAotCQkpOwotCi0JCVF1ZXJpZXNDb21wb3NpdGUgcXVlcmllc0NvbXBvc2l0ZSA9IHRoaXMuYnVpbGRRdWVyaWVzQ29tcG9zaXRlKGNvbnRhaW5lciwgdGhpcy5idWlsZFF1ZXJ5Q29udGFpbmVySG9sZGVyKCkpOwotCi0JCXRoaXMuaW5zdGFsbFBhbmVFbmFibGVyKHF1ZXJpZXNDb21wb3NpdGUpOwotCX0KLQotCXByb3RlY3RlZCBRdWVyaWVzQ29tcG9zaXRlIGJ1aWxkUXVlcmllc0NvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLCBQcm9wZXJ0eVZhbHVlTW9kZWw8UXVlcnlDb250YWluZXI+IHF1ZXJ5Q29udGFpbmVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUXVlcmllc0NvbXBvc2l0ZSh0aGlzLCBxdWVyeUNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeUNvbnRhaW5lcj4gYnVpbGRRdWVyeUNvbnRhaW5lckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW50aXR5TWFwcGluZ3MsIFF1ZXJ5Q29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFF1ZXJ5Q29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQYW5lRW5hYmxlcihRdWVyaWVzQ29tcG9zaXRlIHF1ZXJpZXNDb21wb3NpdGUpIHsKLQkJbmV3IFBhbmVFbmFibGVyKAotCQkJYnVpbGRQYW5lRW5hYmxlckhvbGRlcigpLAotCQkJcXVlcmllc0NvbXBvc2l0ZQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTBlYzJmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuUGFuZUVuYWJsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZUxpc3RQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlNlY29uZGFyeVRhYmxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBPcm1FbnRpdHlDb21wb3NpdGUgLSBUaGUgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICogQHNlZSBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNJblNlY29uZGFyeVRhYmxlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdFNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTxPcm1FbnRpdHk+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9ybVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBPcm1FbnRpdHk+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmluZUluWG1sSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IERlZmluZUluWG1sSG9sZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxSZWFkT25seVNlY29uZGFyeVRhYmxlPiBidWlsZFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7Ci0JCUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4+KCk7Ci0JCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpKTsKLQkJbGlzdC5hZGQoYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpKTsKLQkJcmV0dXJuIG5ldyBDb21wb3NpdGVMaXN0VmFsdWVNb2RlbDxMaXN0VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4sIFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+KGxpc3QpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4gYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFJlYWRPbmx5U2Vjb25kYXJ5VGFibGU+KGJ1aWxkU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpLAotCQkJUmVhZE9ubHlUYWJsZS5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxPcm1TZWNvbmRhcnlUYWJsZT4gYnVpbGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybUVudGl0eSwgT3JtU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgRW50aXR5LlNQRUNJRklFRF9TRUNPTkRBUllfVEFCTEVTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1TZWNvbmRhcnlUYWJsZT4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlMaXN0VmFsdWVNb2RlbDxPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGU+IGJ1aWxkVmlydHVhbFNlY29uZGFyeVRhYmxlc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGU+KGdldFN1YmplY3RIb2xkZXIoKSwgT3JtRW50aXR5LlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtVmlydHVhbFNlY29uZGFyeVRhYmxlPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gZ2V0R3JvdXBCb3hNYXJnaW4oKTsKLQotCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVIb2xkZXIgPQotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZUhvbGRlcigpOwotCi0JCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGRlZmluZUluWG1sSG9sZGVyID0KLQkJCWJ1aWxkRGVmaW5lSW5YbWxIb2xkZXIoKTsKLQotCQkvLyBPdmVycmlkZSBEZWZpbmUgSW4gWE1MIGNoZWNrIGJveAotCQlhZGRDaGVja0JveCgKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCBncm91cEJveE1hcmdpbiksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Pcm1TZWNvbmRhcnlUYWJsZXNDb21wb3NpdGVfZGVmaW5lSW5YbWwsCi0JCQlkZWZpbmVJblhtbEhvbGRlciwKLQkJCW51bGwKLQkJKTsKLQotCQkvLyBTZWNvbmRhcnkgVGFibGVzIGFkZC9yZW1vdmUgbGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPEVudGl0eT4gbGlzdFBhbmUgPSBuZXcgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PigKLQkJCXRoaXMsCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKSwKLQkJCWJ1aWxkU2Vjb25kYXJ5VGFibGVzQWRhcHRlcigpLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZXNMaXN0TW9kZWwoKSwKLQkJCXNlY29uZGFyeVRhYmxlSG9sZGVyLAotCQkJYnVpbGRTZWNvbmRhcnlUYWJsZUxhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfSk9JTl9UQUJMRV9DT0xVTU5TLy9UT0RPIG5lZWQgYSBoZWxwIGNvbnRleHQgaWQgZm9yIHRoaXMKLQkJKTsKLQotCQlpbnN0YWxsTGlzdFBhbmVFbmFibGVyKGRlZmluZUluWG1sSG9sZGVyLCBsaXN0UGFuZSk7Ci0KLQkJLy8gUHJpbWFyeSBLZXkgSm9pbiBDb2x1bW5zIHBhbmUKLQkJbmV3IFByaW1hcnlLZXlKb2luQ29sdW1uc0luU2Vjb25kYXJ5VGFibGVDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJc2Vjb25kYXJ5VGFibGVIb2xkZXIsCi0JCQljb250YWluZXIKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxMaXN0UGFuZUVuYWJsZXIoV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZGVmaW5lSW5YbWxIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkUmVtb3ZlTGlzdFBhbmU8RW50aXR5PiBsaXN0UGFuZSkgewotCi0JCW5ldyBQYW5lRW5hYmxlcihkZWZpbmVJblhtbEhvbGRlciwgbGlzdFBhbmUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU2Vjb25kYXJ5VGFibGVEaWFsb2cgYnVpbGRTZWNvbmRhcnlUYWJsZURpYWxvZ0ZvckFkZCgpIHsKLQkJLy8gZGVmYXVsdFNjaGVtYSBhbmQgZGVmYXVsdENhdGFsb2cgc2hvdWxkIG5vdCBiZSB0YWtlbiBmcm9tIHRoZSBUYWJsZSBpbiB0aGlzIGNhc2UuICAKLQkJLy8gVGhlIHRhYmxlIGRlZmF1bHQgc2NoZW1hIGNvdWxkIGJlIHdoYXQgaXMgdGhlIHNwZWNpZmllZCBzY2hlbWEgb24gdGhlIGphdmEgdGFibGUuCi0JCXJldHVybiBuZXcgU2Vjb25kYXJ5VGFibGVEaWFsb2coCi0JCQlnZXRTaGVsbCgpLCBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLCAKLQkJCWdldFN1YmplY3QoKS5nZXRNYXBwaW5nRmlsZVJvb3QoKS5nZXRDYXRhbG9nKCksIAotCQkJZ2V0U3ViamVjdCgpLmdldE1hcHBpbmdGaWxlUm9vdCgpLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIERlZmluZUluWG1sSG9sZGVyIGV4dGVuZHMgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbj4KLQkJaW1wbGVtZW50cyBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB7Ci0KLQkJcHVibGljIERlZmluZUluWG1sSG9sZGVyKCkgewotCQkJc3VwZXIoYnVpbGRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzTGlzdEhvbGRlcigpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlKCkgewotCQkJaWYgKGdldFN1YmplY3QoKSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCQl9Ci0JCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGdldFN1YmplY3QoKS5zZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShCb29sZWFuIHZhbHVlKSB7Ci0JCQlnZXRTdWJqZWN0KCkuc2V0U2Vjb25kYXJ5VGFibGVzQXJlRGVmaW5lZEluWG1sKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTM4MzY3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0VHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIE9ybVRyYW5zaWVudE1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybVRyYW5zaWVudE1hcHBpbmc+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtVHJhbnNpZW50TWFwcGluZz4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5zdXJlIHNpbmdsZSBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIE9ybVRyYW5zaWVudE1hcHBpbmdVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNWJiMzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPFZlcnNpb25NYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPlZlcnNpb25NYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZlcnNpb25TZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZThkOWIzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uCi0JZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtVmVyc2lvbk1hcHBpbmc+Ci0JaW1wbGVtZW50cyBPcm1BdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPE9ybVZlcnNpb25NYXBwaW5nPgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCQluZXcgT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtVmVyc2lvbk1hcHBpbmc+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZEF0dHJpYnV0ZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlPcm1YbWxVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1WZXJzaW9uTWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBmYWN0b3J5LmNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1YbWxVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vT3JtWG1sVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNzU4Y2IuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9Pcm1YbWxVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZS5Pcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1YbWxVaURlZmluaXRpb24gZXh0ZW5kcyBBYnN0cmFjdE9ybVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgT3JtWG1sVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBPcm1YbWxVaURlZmluaXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPcm1YbWxVaUZhY3RvcnkgYnVpbGRPcm1YbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY09ybVhtbFVpRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBwcm92aWRlc1VpKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGVkSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVmVyc2lvbk1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1NYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU9uZVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oCi0JCQlMaXN0PE9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCQotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDlhNzUzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNhdGFsb2dDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuU2NoZW1hQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLkpwYTJfMFhtbEZsYWdNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gUGVyc2lzdGVuY2UgVW5pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgeCBYTUwgTWFwcGluZyBNZXRhZGF0YSBDb21wbGV0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCB4IENhc2NhZGUgUGVyc2lzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBTY2hlbWE6ICAgICAgfCBTY2hlbWFDb21ibyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBDYXRhbG9nOiAgICAgfCBDYXRhbG9nQ29tYm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBBY2Nlc3MgVHlwZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHZ8IHwKLSAqIHwgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEKLSAqIEBzZWUgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMKLSAqIEBzZWUgRW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIENhdGFsb2dDb21ibwotICogQHNlZSBTY2hlbWFDb21ibwotICogQHNlZSBFbnVtRm9ybUNvbWJvVmlld2VyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+Ci17Ci0JUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlciA9IHRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCkgewotCQlyZXR1cm4gdGhpcy5wZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlUGVyc2lzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMsIEJvb2xlYW4+KGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzSG9sZGVyKCksIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLkNBU0NBREVfUEVSU0lTVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhc2NhZGVQZXJzaXN0KHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ0NvbWJvPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPiBhZGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPih0aGlzLCBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5ERUZBVUxUX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLlNQRUNJRklFRF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZENhdGFsb2codmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8T3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEsIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHRyYW5zZm9ybV8oT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU2NoZW1hQ29tYm88T3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM+IGFkZFNjaGVtYUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNjaGVtYUNvbWJvPE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzPih0aGlzLCBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c0hvbGRlcigpLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0U2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFNjaGVtYSh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFNjaGVtYSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTY2hlbWFDb250YWluZXIgZ2V0RGJTY2hlbWFDb250YWluZXJfKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREYlNjaGVtYUNvbnRhaW5lcigpOwotCQkJfQotCi0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLlhNTF9NQVBQSU5HX01FVEFEQVRBX0NPTVBMRVRFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlbGltaXRlZElkZW50aWZpZXJzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cywgQm9vbGVhbj4oZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzAuREVMSU1JVEVEX0lERU5USUZJRVJTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5idWlsZEJvb2xlYW5WYWx1ZV8oKSk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBib29sZWFuIGJ1aWxkQm9vbGVhblZhbHVlXygpIHsKLQkJCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5ub2RlSXNKcGEyXzBDb21wYXRpYmxlKHRoaXMuc3ViamVjdCkgJiYKLQkJCQkJCSgoT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzApIHRoaXMuc3ViamVjdCkuaXNEZWxpbWl0ZWRJZGVudGlmaWVycygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJaWYgKEpwdEpwYUNvcmVQbHVnaW4ubm9kZUlzSnBhMl8wQ29tcGF0aWJsZSh0aGlzLnN1YmplY3QpKSB7Ci0JCQkJCSgoT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMyXzApIHRoaXMuc3ViamVjdCkuc2V0RGVsaW1pdGVkSWRlbnRpZmllcnModmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBTZWN0aW9uCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX3BlcnNpc3RlbmNlVW5pdFNlY3Rpb24KLQkJKTsKLQotCQkvLyBYTUwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZSBjaGVjayBib3gKLQkJYWRkQ2hlY2tCb3goCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV94bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUNoZWNrQm94LAotCQkJYnVpbGRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9YTUwKLQkJKTsKLQotCQkvLyBDYXNjYWRlIFBlcnNpc3QgY2hlY2stYm94Ci0JCWFkZENoZWNrQm94KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFDb21wb3NpdGVfY2FzY2FkZVBlcnNpc3RDaGVja0JveCwKLQkJCWJ1aWxkQ2FzY2FkZVBlcnNpc3RIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQ0FTQ0FERQotCQkpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNPcm1NZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YUNvbXBvc2l0ZV9zY2hlbWEsCi0JCQlhZGRTY2hlbWFDb21ibyhjb250YWluZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuRU5USVRZX09STV9TQ0hFTUEKLQkJKTsKLQotCQkvLyBDYXRhbG9nIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2NhdGFsb2csCi0JCQlhZGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fQ0FUQUxPRwotCQkpOwotCi0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHNIb2xkZXIoKSwgY29udGFpbmVyKTsKLQotCQkvLyBEZWxpbWl0ZWQgSWRlbnRpZmllcnMgY2hlY2stYm94Ci0JCUJ1dHRvbiBkaUNoZWNrQm94ID0gdGhpcy5hZGRDaGVja0JveCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhQ29tcG9zaXRlX2RlbGltaXRlZElkZW50aWZpZXJzQ2hlY2tCb3gsCi0JCQl0aGlzLmJ1aWxkRGVsaW1pdGVkSWRlbnRpZmllcnNIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9PUk1fREVMSU1JVEVEX0lERU5USUZJRVJTCi0JCSk7Ci0JCQotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKG5ldyBKcGEyXzBYbWxGbGFnTW9kZWw8T3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpKSwgZGlDaGVja0JveCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGV0YWlscy9vcm0vVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YTBmNzguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kZXRhaWxzL29ybS9VbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYU1hcHBpbmdJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZE9ybU1hcHBpbmdVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IFVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpRGVmaW5pdGlvbigpOwotCQotCQotCS8qKgotCSAqIFJldHVybiB0aGUgc2luZ2xldG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc09ybU1lc3NhZ2VzLlVuc3VwcG9ydGVkT3JtTWFwcGluZ1VpUHJvdmlkZXJfbGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlua0xhYmVsKCkgewotCQlyZXR1cm4gSnB0VWlEZXRhaWxzT3JtTWVzc2FnZXMuVW5zdXBwb3J0ZWRPcm1NYXBwaW5nVWlQcm92aWRlcl9saW5rTGFiZWw7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJT3JtWG1sVWlGYWN0b3J5IGZhY3RvcnksCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWwgc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBuZXcgTnVsbENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEphdmFBdHRyaWJ1dGVNYXBwaW5nPgotCQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotCXsKLQkJTnVsbENvbXBvc2l0ZSgKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUF0dHJpYnV0ZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkJICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCQotCQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQkJfQotCQkKLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHt9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9kaWFsb2dzL0FkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzVlNWM1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotcHVibGljIGNsYXNzIEFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVUb1htbEFuZE1hcERpYWxvZyBleHRlbmRzIFN0YXR1c0RpYWxvZwotewotCXByaXZhdGUgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQlwcml2YXRlIFRleHQgYXR0cmlidXRlVGV4dDsKLQlwcml2YXRlIENvbWJvVmlld2VyIG1hcHBpbmdDb21ibzsKLQotCXB1YmxpYyBBZGRQZXJzaXN0ZW50QXR0cmlidXRlVG9YbWxBbmRNYXBEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQl0aGlzLnVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHVubWFwcGVkUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX3RpdGxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAxLCBKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRBdHRyaWJ1dGVEaWFsb2dfYXR0cmlidXRlTGFiZWwpOwotCi0JCWF0dHJpYnV0ZVRleHQgPSBjcmVhdGVUZXh0KGNvbXBvc2l0ZSwgMSk7Ci0vLwkJYXR0cmlidXRlVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLS8vCQkJCW5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLS8vCQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLS8vCQkJCQkJdmFsaWRhdGUoKTsKLS8vCQkJCQl9Ci0vLwkJCQl9Ci0vLwkJCSk7Ci0JCWF0dHJpYnV0ZVRleHQuc2V0VGV4dCh1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAxLCBKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19tYXBwaW5nTGFiZWwpOwotCi0JCW1hcHBpbmdDb21ibyA9IG5ldyBDb21ib1ZpZXdlcihjcmVhdGVDb21ibyhjb21wb3NpdGUsIDEpKTsKLQkJbWFwcGluZ0NvbWJvLmdldENvbWJvKCkuc2V0Rm9jdXMoKTsKLQkJbWFwcGluZ0NvbWJvLnNldENvbnRlbnRQcm92aWRlcigKLQkJCW5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQotCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBBcnJheVRvb2xzLmFycmF5KAotCQkJCQkJQ29sbGVjdGlvblRvb2xzLnNvcnQoCi0JCQkJCQkJbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/Pj4oCi0JCQkJCQkJCQkoKEpwYVBsYXRmb3JtVWkpIGlucHV0RWxlbWVudCkuYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnModW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlVHlwZSgpKSkgewotCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/PiBvKSB7Ci0JCQkJCQkJCQlyZXR1cm4gby5pc0VuYWJsZWRGb3IoQWRkUGVyc2lzdGVudEF0dHJpYnV0ZVRvWG1sQW5kTWFwRGlhbG9nLnRoaXMudW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0sCi0JCQkJCQkJZ2V0UHJvdmlkZXJzQ29tcGFyYXRvcigpKSk7Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCX0pOwotCQltYXBwaW5nQ29tYm8uc2V0TGFiZWxQcm92aWRlcigKLQkJCW5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gKChNYXBwaW5nVWlEZWZpbml0aW9uKSBlbGVtZW50KS5nZXRMYWJlbCgpOwotCQkJCX0KLQkJCX0pOwotCQltYXBwaW5nQ29tYm8uYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpID0gSnB0SnBhVWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKHRoaXMudW5tYXBwZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpKTsKLQkJbWFwcGluZ0NvbWJvLnNldElucHV0KGpwYVBsYXRmb3JtVWkpOwotCQltYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZWxlY3QoMCk7ICAvLyBzZWxlY3QgQmFzaWMgdG8gYmVnaW4KLQotCQkvLyBUT0RPIC0gRjEgSGVscAotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJRGFsaUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCi0JCS8vZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQoZmFsc2UpOyAgLy8gZGlzYWJsZWQgdG8gc3RhcnQKLQkJYXBwbHlEaWFsb2dGb250KGRpYWxvZ0FyZWEpOwotCi0JCXZhbGlkYXRlKCk7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCQotCXByb3RlY3RlZCBDb21wYXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb24+IGdldFByb3ZpZGVyc0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXBwaW5nVWlEZWZpbml0aW9uIGl0ZW0xLCBNYXBwaW5nVWlEZWZpbml0aW9uIGl0ZW0yKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gaXRlbTEuZ2V0TGFiZWwoKTsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSBpdGVtMi5nZXRMYWJlbCgpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuLCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByaXZhdGUgVGV4dCBjcmVhdGVUZXh0KENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWdkLndpZHRoSGludCA9IDI1MDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVUZXh0LmdldFRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE1hcHBpbmdLZXkoKSB7Ci0JCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pIG1hcHBpbmdDb21iby5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIChzZWxlY3Rpb24uaXNFbXB0eSgpKSA/IG51bGwgOiAoKE1hcHBpbmdVaURlZmluaXRpb24pIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSkuZ2V0S2V5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlKCkgewotLy8JCWlmIChlbnRpdHlNYXBwaW5ncy5jb250YWluc1BlcnNpc3RlbnRUeXBlKHR5cGUpKSB7Ci0vLwkJCXVwZGF0ZVN0YXR1cygKLS8vCQkJCW5ldyBTdGF0dXMoCi0vLwkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsCi0vLwkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfZHVwbGljYXRlQ2xhc3NXYXJuaW5nKSk7Ci0vLwkJCXJldHVybjsKLS8vCQl9Ci0vLwotCQlTdHJpbmcgbWFwcGluZ0tleSA9IGdldE1hcHBpbmdLZXkoKTsKLQkJaWYgKG1hcHBpbmdLZXkgPT0gbnVsbCkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50QXR0cmlidXRlRGlhbG9nX25vTWFwcGluZ0tleUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl1cGRhdGVTdGF0dXMoU3RhdHVzLk9LX1NUQVRVUyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl1bm1hcHBlZFBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKGdldE1hcHBpbmdLZXkoKSk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZGlhbG9ncy9BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkyZDQ0Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2RpYWxvZ3MvQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5Db250cm9sQ29udGVudEFzc2lzdEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucmVmYWN0b3JpbmcuY29udGVudGFzc2lzdC5KYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlN0YXR1c0RpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbnRpdHlVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc1NlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2cgZXh0ZW5kcyBTdGF0dXNEaWFsb2cKLXsKLQlwcml2YXRlIEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzOwotCQotCXByaXZhdGUgVGV4dCBjbGFzc1RleHQ7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gY2xhc3NCcm93c2VCdXR0b247Ci0JCi0JcHJpdmF0ZSBDb21ib1ZpZXdlciBtYXBwaW5nQ29tYm87Ci0JCi0JcHJpdmF0ZSBPcm1QZXJzaXN0ZW50VHlwZSBhZGRlZFR5cGU7Ci0JCQotCQotCXB1YmxpYyBBZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5lbnRpdHlNYXBwaW5ncyA9IGVudGl0eU1hcHBpbmdzOwotCQlzZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ190aXRsZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ0FyZWEsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsIEpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX2NsYXNzTGFiZWwpOwotCQkJCi0JCXRoaXMuY2xhc3NUZXh0ID0gY3JlYXRlVGV4dChjb21wb3NpdGUpOwotCQl0aGlzLmNsYXNzVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcigKLQkJCQluZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQkJdmFsaWRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCSk7Ci0JCQotCQl0aGlzLmNsYXNzQnJvd3NlQnV0dG9uID0gY3JlYXRlQnV0dG9uKGNvbXBvc2l0ZSwgSnB0VWlNZXNzYWdlcy5HZW5lcmFsX2Jyb3dzZSk7Ci0JCXRoaXMuY2xhc3NCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCQljbGFzc1RleHQuc2V0VGV4dCh0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfbWFwcGluZ0xhYmVsKTsKLQkJCi0JCXRoaXMubWFwcGluZ0NvbWJvID0gbmV3IENvbWJvVmlld2VyKGNyZWF0ZUNvbWJvKGNvbXBvc2l0ZSwgMikpOwotCQl0aGlzLm1hcHBpbmdDb21iby5zZXRDb250ZW50UHJvdmlkZXIoCi0JCQluZXcgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCQkJCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7Ci0JCQkJCQlPcm1NYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCksIAotCQkJCQkJT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCksIAotCQkJCQkJT3JtRW1iZWRkYWJsZVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JCQkJCX07Ci0JCQkJfQotCQkJCQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkge30KLQkJCX0pOwotCQl0aGlzLm1hcHBpbmdDb21iby5zZXRMYWJlbFByb3ZpZGVyKAotCQkJbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKE1hcHBpbmdVaURlZmluaXRpb24pIGVsZW1lbnQpLmdldExhYmVsKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCXRoaXMubWFwcGluZ0NvbWJvLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmFsaWRhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMubWFwcGluZ0NvbWJvLnNldElucHV0KCJGT08iKTsKLQkJdGhpcy5tYXBwaW5nQ29tYm8uZ2V0Q29tYm8oKS5zZWxlY3QoMSk7ICAvLyBzZWxlY3QgRW50aXR5IHRvIGJlZ2luCi0JCQotCQkvLyBUT0RPIC0gRjEgSGVscAotCQkvLyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBJRGFsaUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCQkKLQkJLy9nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChmYWxzZSk7ICAvLyBkaXNhYmxlZCB0byBzdGFydAotCQlhcHBseURpYWxvZ0ZvbnQoZGlhbG9nQXJlYSk7CQkKLQkJCi0JCXZhbGlkYXRlKCk7Ci0JCQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIFRPRE8gYnVnIDE1NjE4NSAtIHdoZW4gdGhpcyBpcyBmaXhlZCB0aGVyZSBzaG91bGQgYmUgYXBpIGZvciB0aGlzCi0JCUphdmFUeXBlQ29tcGxldGlvblByb2Nlc3NvciBqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3IgPSBuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yKGZhbHNlLCBmYWxzZSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBmciA9IGdldFBhY2thZ2VGcmFnbWVudFJvb3QoKTsKLQkJaWYgKHBmciAhPSBudWxsKSB7Ci0JCQlqYXZhVHlwZUNvbXBsZXRpb25Qcm9jZXNzb3Iuc2V0UGFja2FnZUZyYWdtZW50KHBmci5nZXRQYWNrYWdlRnJhZ21lbnQoIiIpKTsKLQkJfQotCQkKLQkJVGV4dCB0ZXh0ID0gbmV3IFRleHQoY29udGFpbmVyLCBTV1QuQk9SREVSIHwgU1dULlNJTkdMRSk7Ci0KLQkJQ29udHJvbENvbnRlbnRBc3Npc3RIZWxwZXIuY3JlYXRlVGV4dENvbnRlbnRBc3Npc3RhbnQoCi0JCQl0ZXh0LAotCQkJamF2YVR5cGVDb21wbGV0aW9uUHJvY2Vzc29yCi0JCSk7Ci0JCQotCQl0ZXh0LnNldExheW91dERhdGEoZ2V0RmllbGRHcmlkRGF0YSgpKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCQotCXByb3RlY3RlZCBHcmlkRGF0YSBnZXRGaWVsZEdyaWREYXRhKCkgewotCQlpbnQgbWFyZ2luID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpCi0JCQkJLmdldE1heGltdW1EZWNvcmF0aW9uV2lkdGgoKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZGF0YS53aWR0aEhpbnQgPSBJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIICsgbWFyZ2luOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSBtYXJnaW47Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRQYWNrYWdlRnJhZ21lbnRSb290KCkgewotCQl0cnkgewotCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKVswXTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4KSB7Ci0JCQlKcHRKcGFVaVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgU3RyaW5nIHRleHQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBzcGFuKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lciwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ2QgPSBnZXRGaWVsZEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmVudGl0eU1hcHBpbmdzLmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiB0aGlzLmNsYXNzVGV4dC5nZXRUZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFwcGluZ0tleSgpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy5tYXBwaW5nQ29tYm8uZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiAoc2VsZWN0aW9uLmlzRW1wdHkoKSkgPyBudWxsIDogKChNYXBwaW5nVWlEZWZpbml0aW9uKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpLmdldEtleSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFFbGVtZW50W10gZWxlbWVudHM9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpIH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGU9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQkKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0JCXRyeSB7Ci0JCQl0eXBlU2VsZWN0aW9uRGlhbG9nID0gCi0JCQkJSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coCi0JCQkJCQlnZXRTaGVsbCgpLCBzZXJ2aWNlLCBzY29wZSwgCi0JCQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywgCi0JCQkJCQlmYWxzZSwgZ2V0Q2xhc3NOYW1lKCkpOwotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCX0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19jbGFzc0RpYWxvZ190aXRsZSk7IAotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NEaWFsb2dfbWVzc2FnZSk7IAotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZSgpIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGdldENsYXNzTmFtZSgpOwotCQkKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY2xhc3NOYW1lKSkgewotCQkJdXBkYXRlU3RhdHVzKAotCQkJCW5ldyBTdGF0dXMoCi0JCQkJCUlTdGF0dXMuRVJST1IsIEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vQ2xhc3NFcnJvcikpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCckJywgJy4nKTsKLQkJCi0JCUlUeXBlIHR5cGU7Ci0JCXRyeSB7Ci0JCQl0eXBlID0gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoY2xhc3NOYW1lKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJdHlwZSA9IG51bGw7Ci0JCX0KLQkJCi0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLldBUk5JTkcsIEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5BZGRQZXJzaXN0ZW50Q2xhc3NEaWFsb2dfY2xhc3NOb3RGb3VuZFdhcm5pbmcpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJaWYgKHRoaXMuZW50aXR5TWFwcGluZ3MuY29udGFpbnNQZXJzaXN0ZW50VHlwZShjbGFzc05hbWUpKSB7Ci0JCQl1cGRhdGVTdGF0dXMoCi0JCQkJbmV3IFN0YXR1cygKLQkJCQkJSVN0YXR1cy5XQVJOSU5HLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQlKcHRVaU1lc3NhZ2VzLkFkZFBlcnNpc3RlbnRDbGFzc0RpYWxvZ19kdXBsaWNhdGVDbGFzc1dhcm5pbmcpKTsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIG1hcHBpbmdLZXkgPSBnZXRNYXBwaW5nS2V5KCk7Ci0JCWlmIChtYXBwaW5nS2V5ID09IG51bGwpIHsKLQkJCXVwZGF0ZVN0YXR1cygKLQkJCQluZXcgU3RhdHVzKAotCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCUpwdFVpTWVzc2FnZXMuQWRkUGVyc2lzdGVudENsYXNzRGlhbG9nX25vTWFwcGluZ0tleUVycm9yKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQl0aGlzLmFkZGVkVHlwZSA9IHRoaXMuZW50aXR5TWFwcGluZ3MuYWRkUGVyc2lzdGVudFR5cGUoZ2V0TWFwcGluZ0tleSgpLCBnZXRDbGFzc05hbWUoKSk7Ci0JCXN1cGVyLm9rUHJlc3NlZCgpOwotCX0KLQkKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgb3BlbkFuZFJldHVyblR5cGUoKSB7Ci0JCXN1cGVyLm9wZW4oKTsKLQkJcmV0dXJuIGFkZGVkVHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2VkaXRvcnMvUGVyc2lzdGVuY2VDb250cmlidXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyNjYxYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2VkaXRvcnMvUGVyc2lzdGVuY2VDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5lZGl0b3JzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHJpdmF0ZSBJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3JQYXJ0OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZUNvbnRyaWJ1dG9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFjdGlvbiByZWdpc3RlZCB3aXRoIHRoZSBnaXZlbiB0ZXh0IGVkaXRvci4KLQkgKiBAcmV0dXJuIElBY3Rpb24gb3IgbnVsbCBpZiBlZGl0b3IgaXMgbnVsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUFjdGlvbiBnZXRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBTdHJpbmcgYWN0aW9uSUQpIHsKLQkJcmV0dXJuIChlZGl0b3IgPT0gbnVsbCA/IG51bGwgOiBlZGl0b3IuZ2V0QWN0aW9uKGFjdGlvbklEKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlUGFnZShJRWRpdG9yUGFydCBwYXJ0KSB7Ci0KLQkJaWYgKGFjdGl2ZUVkaXRvclBhcnQgPT0gcGFydCkKLQkJCXJldHVybjsKLQotCQlhY3RpdmVFZGl0b3JQYXJ0ID0gcGFydDsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0KLQkJCUlUZXh0RWRpdG9yIGVkaXRvciA9IChwYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpID8gKElUZXh0RWRpdG9yKSBwYXJ0IDogbnVsbDsKLQotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuREVMRVRFLmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuREVMRVRFKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5VTkRPLmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETykpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuUkVETy5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LkNVVC5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNVVCkpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUFjdGlvbkZhY3RvcnkuQ09QWS5nZXRJZCgpLAotCQkJCWdldEFjdGlvbihlZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNPUFkpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LlBBU1RFLmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUEFTVEUpKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcigKLQkJCQlBY3Rpb25GYWN0b3J5LlNFTEVDVF9BTEwuZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TRUxFQ1RfQUxMKSk7Ci0JCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5GSU5ELmdldElkKCksCi0JCQkJZ2V0QWN0aW9uKGVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRklORCkpOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKAotCQkJCUlERUFjdGlvbkZhY3RvcnkuQk9PS01BUksuZ2V0SWQoKSwKLQkJCQlnZXRBY3Rpb24oZWRpdG9yLCBJREVBY3Rpb25GYWN0b3J5LkJPT0tNQVJLLmdldElkKCkpKTsKLQkJCWFjdGlvbkJhcnMudXBkYXRlQWN0aW9uQmFycygpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvZWRpdG9ycy9QZXJzaXN0ZW5jZUVkaXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Y2MyMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9lZGl0b3JzL1BlcnNpc3RlbmNlRWRpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZWRpdG9yczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuTG9jYWxSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5QZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWFuYWdlZEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZm9ybXMuZWRpdG9yLkZvcm1QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuVGFibGVXcmFwRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLlRhYmxlV3JhcExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIGVkaXRvciBmb3IgdGhlIEpQQSBQZXJzaXN0ZW5jZSBDb25maWd1cmF0aW9uIChwZXJzaXN0ZW5jZS54bWwpLgotICogVGhlIHBhZ2VzIHNob3duIGJlZm9yZSB0aGUgWE1MIHNvdXJjZSBlZGl0b3IgYXJlIHJldHJpZXZlZCBmcm9tIHRoZQotICogPGNvZGU+SnBhVWlGYWN0b3J5PC9jb2RlPi4KLSAqCi0gKiBAc2VlIEpwYVVpRmFjdG9yeQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUVkaXRvciBleHRlbmRzIEZvcm1FZGl0b3IKLXsKLQkvKioKLQkgKiBUaGUgWE1MIHRleHQgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yOwotCi0JLyoqCi0JICogVGhlIHJvb3Qgb2YgdGhlIGhvbGRlcnMgdXNlZCB0byByZXRyaWV2ZSB0aGUgcGVyc2lzdGVuY2UgdW5pdCBhbmQgYmUKLQkgKiBub3RpZmllZCB3aGVuIGl0IGNoYW5nZXMuCi0JICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJRmlsZUVkaXRvcklucHV0PiBlZGl0b3JJbnB1dEhvbGRlcjsKLQotCS8qKgotCSAqIFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7Ci0KLQlwcml2YXRlIGZpbmFsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlRWRpdG9yPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gbmV3IExvY2FsUmVzb3VyY2VNYW5hZ2VyKEpGYWNlUmVzb3VyY2VzLmdldFJlc291cmNlcygpKTsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlckNsYXNzKSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gc3VwZXIuZ2V0QWRhcHRlcihhZGFwdGVyQ2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gZWRpdG9yLmdldEFkYXB0ZXIoYWRhcHRlckNsYXNzKTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWFkZFBlcnNpc3RlbmNlVW5pdFBhZ2VzKCk7Ci0JCWFkZFhNTEVkaXRvclBhZ2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBwYWdlcyB0aGF0IHNob3cgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHBlcnNpc3RlbmNlIGNvbmZpZ3VyYXRpb24KLQkgKiBvciBpdHMgcGVyc2lzdGVuY2UgdW5pdHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFBlcnNpc3RlbmNlVW5pdFBhZ2VzKCkgewotCi0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldEpwYVByb2plY3QoKTsKLQotCQkvLyBUaGUgcHJvamVjdCBkb2Vzbid0IGhhdmUgSlBBCi0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBwZXJzaXN0ZW5jZVhtbC5nZXRSZXNvdXJjZVR5cGUoKTsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47ICAvLyBtaWdodCBub3QgZXZlciBnZXQgaGVyZS4uLiAoaWYgd2UgaGF2ZSBhIHAueG1sLCBpdCBwcm9iYWJseSBoYXMgYSByZXNvdXJjZSB0eXBlLi4uKQotCQl9Ci0JCVN0cmluZyBwbGF0Zm9ybUlkID0ganBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpLmdldElkKCk7Ci0JCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VSSA9IEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkocGxhdGZvcm1JZCk7Ci0JCVBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24gZGVmaW5pdGlvbiA9IAotCQkJKFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24pIGpwYVBsYXRmb3JtVUkuZ2V0UmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKTsKLQotCQlMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gcGFnZXMgPSBkZWZpbml0aW9uLmJ1aWxkUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlcygKLQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksCi0JCQlnZXRDb250YWluZXIoKSwKLQkJCXRoaXMud2lkZ2V0RmFjdG9yeQotCQkpOwotCi0JCXdoaWxlIChwYWdlcy5oYXNOZXh0KCkpIHsKLQkJCUpwYVBhZ2VDb21wb3NpdGUgcGFnZSA9IHBhZ2VzLm5leHQoKTsKLQotCQkJdHJ5IHsKLQkJCQlGb3JtUGFnZSBmb3JtUGFnZSA9IG5ldyBQYWdlKHBhZ2UpOwotCQkJCWFkZFBhZ2UoZm9ybVBhZ2UpOwotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIFhNTCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFhNTEVkaXRvclBhZ2UoKSB7Ci0JCXRyeSB7Ci0JCQllZGl0b3IgPSBuZXcgU3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCWVkaXRvci5zZXRFZGl0b3JQYXJ0KHRoaXMpOwotCQkJaW50IGluZGV4ID0gYWRkUGFnZShlZGl0b3IsIGdldEVkaXRvcklucHV0KCkpOwotCQkJc2V0UGFnZVRleHQoaW5kZXgsIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZUVkaXRvcl9zb3VyY2VUYWIpOwotCQl9Ci0JCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPElGaWxlRWRpdG9ySW5wdXQ+IGJ1aWxkRWRpdG9ySW5wdXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPElGaWxlRWRpdG9ySW5wdXQ+KCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4gYnVpbGRKcGFQcm9qZWN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IENhY2hpbmdUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxJRmlsZUVkaXRvcklucHV0LCBKcGFQcm9qZWN0Pih0aGlzLmVkaXRvcklucHV0SG9sZGVyKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IHRyYW5zZm9ybV8oSUZpbGVFZGl0b3JJbnB1dCBmaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KGZpbGVFZGl0b3JJbnB1dC5nZXRGaWxlKCkuZ2V0UHJvamVjdCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZT4gYnVpbGRQZXJzaXN0ZW5jZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VYbWwsIFBlcnNpc3RlbmNlPihidWlsZFBlcnNpc3RlbmNlWG1sSG9sZGVyKCksIFBlcnNpc3RlbmNlWG1sLlBFUlNJU1RFTkNFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0PihidWlsZFBlcnNpc3RlbmNlVW5pdExpc3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGxpc3RIb2xkZXIuc2l6ZSgpID4gMCA/IChQZXJzaXN0ZW5jZVVuaXQpIGxpc3RIb2xkZXIuZ2V0KDApIDogbnVsbDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlLCBQZXJzaXN0ZW5jZVVuaXQ+KGJ1aWxkUGVyc2lzdGVuY2VIb2xkZXIoKSwgUGVyc2lzdGVuY2UuUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdD4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VYbWw+IGJ1aWxkUGVyc2lzdGVuY2VYbWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVJvb3RDb250ZXh0Tm9kZSwgUGVyc2lzdGVuY2VYbWw+KGJ1aWxkUm9vdENvbnRleHROb2RlSG9sZGVyKCksIEpwYVJvb3RDb250ZXh0Tm9kZS5QRVJTSVNURU5DRV9YTUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlWG1sKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUm9vdENvbnRleHROb2RlPiBidWlsZFJvb3RDb250ZXh0Tm9kZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0LCBKcGFSb290Q29udGV4dE5vZGU+KGJ1aWxkSnBhUHJvamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFSb290Q29udGV4dE5vZGUgdHJhbnNmb3JtXyhKcGFQcm9qZWN0IHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlLmdldFJvb3RDb250ZXh0Tm9kZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV2lkZ2V0RmFjdG9yeSBidWlsZFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgRm9ybVdpZGdldEZhY3RvcnkoCi0JCQluZXcgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkoKQotCQkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZWRpdG9ySW5wdXRIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2V0RWRpdG9yKGdldFBhZ2VDb3VudCgpIC0gMSkuZG9TYXZlKG1vbml0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZUFzKCkgewotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBJRmlsZUVkaXRvcklucHV0IGdldEVkaXRvcklucHV0KCkgewotCQlyZXR1cm4gKElGaWxlRWRpdG9ySW5wdXQpIHN1cGVyLmdldEVkaXRvcklucHV0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgZWRpdG9ySW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc0xlZ2FsKGVkaXRvcklucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCwgIkludmFsaWQgSW5wdXQ6IE11c3QgYmUgSUZpbGVFZGl0b3JJbnB1dCIpOwotCQlzdXBlci5pbml0KHNpdGUsIGVkaXRvcklucHV0KTsKLQotCQlzZXRQYXJ0TmFtZShlZGl0b3JJbnB1dC5nZXROYW1lKCkpOwotCQllZGl0b3JJbnB1dEhvbGRlci5zZXRWYWx1ZShnZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCi0JCXdpZGdldEZhY3RvcnkgICAgICA9IGJ1aWxkV2lkZ2V0RmFjdG9yeSgpOwotCQllZGl0b3JJbnB1dEhvbGRlciAgPSBidWlsZEVkaXRvcklucHV0SG9sZGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlQXNBbGxvd2VkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBKUEEgcHJvamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3Qgb3duaW5nIHRoZSBlZGl0b3IKLQkgKiBpbnRwdXQgZmlsZS4KLQkgKgotCSAqIEByZXR1cm4gVGhlIEpQQSBwcm9qZWN0Ci0JICovCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChnZXRFZGl0b3JJbnB1dCgpLmdldEZpbGUoKS5nZXRQcm9qZWN0KCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZXh0ZW5zaW9uIG92ZXIgPGNvZGU+Rm9ybVBhZ2U8L2NvZGU+IHNpbXBseSBjb21wbGV0ZSB0aGUgbGF5b3V0IGJ5Ci0JICogdXNpbmcgdGhlIDxjb2RlPkpwYVBhZ2VDb21wb3NpdGU8L2NvZGU+J3MgY29udHJvbCBhcyBpdHMgZm9ybSBjb250ZW50LgotCSAqLwotCXByaXZhdGUgY2xhc3MgUGFnZSBleHRlbmRzIEZvcm1QYWdlIHsKLQotCQkvKioKLQkJICogVGhlIHdyYXBwZWQgcGFnZSB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZSB3aWRnZXRzIHRvIHNob3cgd2l0aCB0aGlzCi0JCSAqIGZvcm0gcGFnZS4KLQkJICovCi0JCXByaXZhdGUgZmluYWwgSnBhUGFnZUNvbXBvc2l0ZSBwYWdlOwotCi0JCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QYWdlPC9jb2RlPi4KLQkJICoKLQkJICogQHBhcmFtIHBhZ2UgVGhlIHdyYXBwZWQgPGNvZGU+SnBhUGFnZUNvbXBvc2l0ZTwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgUGFnZShKcGFQYWdlQ29tcG9zaXRlIHBhZ2UpIHsKLQotCQkJc3VwZXIoUGVyc2lzdGVuY2VFZGl0b3IudGhpcywKLQkJCSAgICAgIHBhZ2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCi0JCQkgICAgICBwYWdlLmdldFBhZ2VUZXh0KCkpOwotCi0JCQl0aGlzLnBhZ2UgPSBwYWdlOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZvcm1Db250ZW50KElNYW5hZ2VkRm9ybSBtYW5hZ2VkRm9ybSkgewotCi0JCQlTY3JvbGxlZEZvcm0gZm9ybSA9IG1hbmFnZWRGb3JtLmdldEZvcm0oKTsKLQkJCW1hbmFnZWRGb3JtLmdldFRvb2xraXQoKS5kZWNvcmF0ZUZvcm1IZWFkaW5nKGZvcm0uZ2V0Rm9ybSgpKTsKLQotCQkJLy8gVXBkYXRlIHRoZSB0ZXh0IGFuZCBpbWFnZQotCQkJdXBkYXRlRm9ybShmb3JtKTsKLQotCQkJLy8gVXBkYXRlIHRoZSBsYXlvdXQKLQkJCXVwZGF0ZUJvZHkoZm9ybSk7Ci0KLQkJCS8vIFRoaXMgd2lsbCBmaW5pc2ggdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBidXR0b25zCi0JCQl1cGRhdGVIZWxwQnV0dG9uKCk7Ci0JCQlmb3JtLnVwZGF0ZVRvb2xCYXIoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJdGhpcy5wYWdlLmRpc3Bvc2UoKTsKLQkJCWlmICh0aGlzLmltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJUGVyc2lzdGVuY2VFZGl0b3IudGhpcy5yZXNvdXJjZU1hbmFnZXIuZGVzdHJveUltYWdlKHRoaXMuaW1hZ2VEZXNjcmlwdG9yKTsKLQkJCX0KLQkJCXN1cGVyLmRpc3Bvc2UoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJCXRoaXMucGFnZS5nZXRDb250cm9sKCkuc2V0Rm9jdXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBBZGRzIHRoZSBwYWdlJ3MgY29udHJvbCB0byB0aGlzIHBhZ2UuCi0JCSAqCi0JCSAqIEBwYXJhbSBmb3JtIFRoZSBmb3JtIGNvbnRhaW5pbmcgdGhlIGNvbXBvc2l0ZSB3aXRoIHdoaWNoIHRoZSBwYWdlJ3MKLQkJICogY29udHJvbCBpcyBwYXJlbnRlZAotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUJvZHkoU2Nyb2xsZWRGb3JtIGZvcm0pIHsKLQotCQkJQ29tcG9zaXRlIGJvZHkgPSBmb3JtLmdldEJvZHkoKTsKLQotCQkJYm9keS5zZXRMYXlvdXQobmV3IFRhYmxlV3JhcExheW91dCgpKTsKLQotCQkJVGFibGVXcmFwRGF0YSB3cmFwRGF0YSA9IG5ldyBUYWJsZVdyYXBEYXRhKAotCQkJCVRhYmxlV3JhcERhdGEuRklMTF9HUkFCLAotCQkJCVRhYmxlV3JhcERhdGEuRklMTF9HUkFCCi0JCQkpOwotCi0JCQl0aGlzLnBhZ2UuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEod3JhcERhdGEpOwotCQkJdGhpcy5wYWdlLmdldENvbnRyb2woKS5zZXRQYXJlbnQoYm9keSk7Ci0JCX0KLQotCQkvKioKLQkJICogVXBkYXRlcyB0aGUgdGV4dCBhbmQgaW1hZ2Ugb2YgdGhlIGZvcm0uCi0JCSAqCi0JCSAqIEBwYXJhbSBmb3JtIFRoZSBmb3JtIHRvIGhhdmUgaXRzIHRpdGxlIGJhciB1cGRhdGVkIGJ5IHNldHRpbmcgdGhlIHRleHQKLQkJICogYW5kIGltYWdlLCB0aGUgaW1hZ2UgY2FuIGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHZvaWQgdXBkYXRlRm9ybShTY3JvbGxlZEZvcm0gZm9ybSkgewotCQkJZm9ybS5zZXRUZXh0KHRoaXMucGFnZS5nZXRQYWdlVGV4dCgpKTsKLQotCQkJdGhpcy5pbWFnZURlc2NyaXB0b3IgPSB0aGlzLnBhZ2UuZ2V0UGFnZUltYWdlRGVzY3JpcHRvcigpOwotCQkJaWYgKHRoaXMuaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQlmb3JtLnNldEltYWdlKFBlcnNpc3RlbmNlRWRpdG9yLnRoaXMucmVzb3VyY2VNYW5hZ2VyLmNyZWF0ZUltYWdlKHRoaXMuaW1hZ2VEZXNjcmlwdG9yKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQWRkcyBhIGhlbHAgYnV0dG9uIHRvIHRoZSBwYWdlJ3MgdG9vbGJhciBpZiBhIGhlbHAgSUQgZXhpc3RzLgotCQkgKi8KLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUhlbHBCdXR0b24oKSB7Ci0KLQkJCVN0cmluZyBoZWxwSUQgPSB0aGlzLnBhZ2UuZ2V0SGVscElEKCk7Ci0KLQkJCWlmIChoZWxwSUQgIT0gbnVsbCkgewotCQkJCUFjdGlvbiBoZWxwQWN0aW9uID0gbmV3IEhlbHBBY3Rpb24oaGVscElEKTsKLQotCQkJCVNjcm9sbGVkRm9ybSBmb3JtID0gZ2V0TWFuYWdlZEZvcm0oKS5nZXRGb3JtKCk7Ci0JCQkJSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIgPSBmb3JtLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQkJbWFuYWdlci5hZGQoaGVscEFjdGlvbik7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIEhlbHBBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JCQlwcml2YXRlIGZpbmFsIFN0cmluZyBoZWxwSUQ7Ci0KLQkJCUhlbHBBY3Rpb24oU3RyaW5nIGhlbHBJRCkgewotCQkJCXN1cGVyKEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZUVkaXRvcl9wYWdlX2hlbHAsCi0JCQkJICAgICAgSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldERlc2NyaXB0b3IoRGlhbG9nLkRMR19JTUdfSEVMUCkpOwotCi0JCQkJdGhpcy5oZWxwSUQgPSBoZWxwSUQ7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldE1hbmFnZWRGb3JtKCkuZ2V0Rm9ybSgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscChoZWxwSUQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qZmFjZS9KYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvamZhY2UvSmFyRmlsZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjllN2MuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qZmFjZS9KYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuamZhY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEphckZpbGVJdGVtTGFiZWxQcm92aWRlcigKLQkJCUphckZpbGUgamFyRmlsZSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIoamFyRmlsZSwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXJGaWxlIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKEphckZpbGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSkFSX0ZJTEUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KGdldE1vZGVsKCkuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKGdldE1vZGVsKCkuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCkpOwotCQlzYi5hcHBlbmQoIiAtICIpOyAgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZ2V0TW9kZWwoKS5nZXRSZXNvdXJjZSgpLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHNiLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvamZhY2UvWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvamZhY2UvWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlmNjNhMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pmYWNlL1htbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpmYWNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLQotLyoqCi0gKiBUaGlzIGZpbHRlciB3aWxsIGRlbnkgc2hvd2luZyBhbnkgZmlsZSB0aGF0IGFyZSBub3QgWE1MIG1hcHBpbmcgZmlsZXMgb3IgZm9sZGVycwotICogdGhhdCBkb24ndCBjb250YWluIGFueSBYTUwgbWFwcGluZyBmaWxlcyBpbiBpdHMgc3ViLWhpZXJhcmNoeS4gQW4gWE1MIG1hcHBpbmcKLSAqIGZpbGUgaXMgb25lIHRoYXQgaGFzIGEgY29ycmVzcG9uZGluZyBKcGFGaWxlIGluIHRoZSBwcm9qZWN0IHdpdGggYSBtYXBwaW5nIGZpbGUKLSAqIGNvbnRlbnQgdHlwZS4KLSAqIEBzZWUgSnB0SnBhQ29yZVBsdWdpbi5NQVBQSU5HX0ZJTEVfQ09OVEVOVF9UWVBFCi0gKi8KLXB1YmxpYyBjbGFzcyBYbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcgotCQlleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCi0JCi0JcHVibGljIFhtbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudEVsZW1lbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQlyZXR1cm4gaXNNYXBwaW5nRmlsZSgoSUZpbGUpIGVsZW1lbnQpOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBlbGVtZW50OwotCQkJSVByb2plY3QgcHJvamVjdCA9IHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAoSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IocHJvamVjdCkuYWNjZXB0UmVzb3VyY2VMb2NhdGlvbihwcm9qZWN0LCBjb250YWluZXIpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZm9yIChJUmVzb3VyY2UgcmVzb3VyY2UgOiBjb250YWluZXIubWVtYmVycygpKSB7Ci0JCQkJCQlpZiAoc2VsZWN0KHZpZXdlciwgY29udGFpbmVyLCByZXNvdXJjZSkpIHsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJCQkvLyBmYWxsIHRocm91Z2gKLQkJCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIGZpbGUgKGFuIFhNTCBmaWxlKSBpcyBhIEpQQSBtYXBwaW5nCi0JICogZGVzY3JpcHRvciBmaWxlLiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNNYXBwaW5nRmlsZShJRmlsZSBmaWxlKSB7Ci0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuanBhUHJvamVjdC5nZXRKcGFGaWxlKGZpbGUpOwotCQlyZXR1cm4ganBhRmlsZSAhPSBudWxsID8ganBhRmlsZS5nZXRDb250ZW50VHlwZSgpLmlzS2luZE9mKEpwdEpwYUNvcmVQbHVnaW4uTUFQUElOR19GSUxFX0NPTlRFTlRfVFlQRSk6IGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvR2VuZXJpYzJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWMwNzM2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkFic3RyYWN0SnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVBlcnNpc3RlbnRUeXBlRGV0YWlsc1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtWG1sVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmEuR2VuZXJpYzJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVhtbDJfMFVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKcGFQbGF0Zm9ybVVpUHJvdmlkZXIKLXsKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVBsYXRmb3JtVWlQcm92aWRlciBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkZXRhaWxzIHByb3ZpZGVycyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkRGV0YWlsc1Byb3ZpZGVyc1RvKExpc3Q8SnBhRGV0YWlsc1Byb3ZpZGVyPiBwcm92aWRlcnMpIHsKLQkJcHJvdmlkZXJzLmFkZChKYXZhUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoRW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudFR5cGVEZXRhaWxzUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JCXByb3ZpZGVycy5hZGQoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZURldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQkJcHJvdmlkZXJzLmFkZChFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VVaURlZmluaXRpb25zVG8oTGlzdDxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKEdlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWxVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1YbWwyXzBVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKFBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL0dlbmVyaWNPcm1YbWwyXzBVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE0MDlhNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5CYXNlT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm0uT3JtRW50aXR5Ml8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1JZE1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhMi5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3RvcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVhtbDJfMFVpRmFjdG9yeSAKLQlleHRlbmRzIEJhc2VPcm1YbWxVaUZhY3RvcnkKLQlpbXBsZW1lbnRzIE9ybVhtbFVpRmFjdG9yeTJfMAotewotCS8vICoqKioqKioqKioqKioqKiogb3JtIHR5cGUgbWFwcGluZyBjb21wb3NpdGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbnRpdHlDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW50aXR5PiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVudGl0eTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCQotCS8vICoqKioqKioqKioqKioqKiogb3JtIGF0dHJpYnV0ZSBtYXBwaW5nIGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybUlkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1JZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRW1iZWRkZWRJZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1CYXNpY01hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtQmFzaWNNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUJhc2ljTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVZlcnNpb25NYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybVZlcnNpb25NYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1NYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybU9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1PbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtTWFueVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVPcm1FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IE9ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZU9ybVRyYW5zaWVudE1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtVHJhbnNpZW50TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2llbnRNYXBwaW5nQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9KcGEyXzBQcm9qZWN0RmxhZ01vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvSnBhMl8wUHJvamVjdEZsYWdNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODI2NzRlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9KcGEyXzBQcm9qZWN0RmxhZ01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci0KLS8qKgotICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IHN1cHBvcnRzIEpQQSAyLjAuCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGEyXzBQcm9qZWN0RmxhZ01vZGVsPFQgZXh0ZW5kcyBKcGFOb2RlPgotCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8VCwgQm9vbGVhbj4KLXsKLQlwdWJsaWMgSnBhMl8wUHJvamVjdEZsYWdNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8VD4ganBhUHJvamVjdE1vZGVsKSB7IAotCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oVCB2YWx1ZSkgewotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKEpwdEpwYUNvcmVQbHVnaW4ubm9kZUlzSnBhMl8wQ29tcGF0aWJsZSh2YWx1ZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9KcGEyXzBYbWxGbGFnTW9kZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9KcGEyXzBYbWxGbGFnTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlMjdhYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvSnBhMl8wWG1sRmxhZ01vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuWG1sQ29udGV4dE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBKcGEyXzBYbWxGbGFnTW9kZWw8VCBleHRlbmRzIFhtbENvbnRleHROb2RlPiBleHRlbmRzCi0JCVRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFQsIEJvb2xlYW4+IHsKLQotCXB1YmxpYyBKcGEyXzBYbWxGbGFnTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHZhbHVlTW9kZWwpIHsKLQkJc3VwZXIodmFsdWVNb2RlbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtXyhUIHZhbHVlKSB7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YoSnB0SnBhQ29yZVBsdWdpbi5ub2RlSXNYbWwyXzBDb21wYXRpYmxlKHZhbHVlKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDQxZTA2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29udmVydGlibGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTG9iQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRW51bVR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UZW1wb3JhbFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2x1bW5Db21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEZldGNoVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgVGVtcG9yYWxUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBFbnVtVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IE9wdGlvbmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgTG9iQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQmFzaWNNYXBwaW5nCi0gKiBAc2VlIE9yZGVyQ29sdW1uQ29tcG9zaXRlCi0gKiBAc2VlIEVudW1UeXBlQ29tcG9zaXRlCi0gKiBAc2VlIEZldGNoVHlwZUNvbXBvc2l0ZQotICogQHNlZSBMb2JDb21wb3NpdGUKLSAqIEBzZWUgT3B0aW9uYWxDb21wb3NpdGUKLSAqIEBzZWUgVGVtcG9yYWxUeXBlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4zCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiAKLQlleHRlbmRzIFBhbmU8VD4KLQlpbXBsZW1lbnRzIEpwYUNvbXBvc2l0ZQotewotCQkKLQlwcml2YXRlIENvbXBvc2l0ZSBiYXNpY1ZhbHVlQ29tcG9zaXRlOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIGVtYmVkZGFibGVWYWx1ZUNvbXBvc2l0ZTsKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplRWxlbWVudENvbGxlY3Rpb25Db2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZVZhbHVlQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVLZXlDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbGVtZW50Q29sbGVjdGlvbkNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbl90aXRsZSwKLQkJCW5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4oQm9vbGVhbi5UUlVFKQotCQkpOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUVsZW1lbnRDb2xsZWN0aW9uU2VjdGlvbihjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbGVtZW50Q29sbGVjdGlvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0Q2xhc3NDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQ29sbGVjdGlvblRhYmxlSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSB2YWx1ZVNlY3Rpb24gPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5BYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9Db21wb3NpdGVfdmFsdWVTZWN0aW9uVGl0bGUKLQkJKTsKLQkJaW5pdGlhbGl6ZVZhbHVlU2VjdGlvbih2YWx1ZVNlY3Rpb24pOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplS2V5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVBhZ2VCb29rIHBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbnRhaW5lciwgU1dULk5VTEwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdGhpcy5pbml0aWFsaXplQmFzaWNWYWx1ZVNlY3Rpb24ocGFnZUJvb2spOwotCQl0aGlzLmluaXRpYWxpemVFbWJlZGRhYmxlVmFsdWVTZWN0aW9uKHBhZ2VCb29rKTsKLQkJCi0JCWluc3RhbGxWYWx1ZUNvbnRyb2xTd2l0Y2hlcihwYWdlQm9vayk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJhc2ljVmFsdWVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJdGhpcy5iYXNpY1ZhbHVlQ29tcG9zaXRlID0gYWRkU3ViUGFuZShjb250YWluZXIpOwotCi0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRWYWx1ZUNvbHVtbkhvbGRlcigpLCB0aGlzLmJhc2ljVmFsdWVDb21wb3NpdGUpOwotCQkvLyB0eXBlIHNlY3Rpb24KLQkJQ29tcG9zaXRlIGNvbnZlcnRlclNlY3Rpb24gPSBhZGRDb2xsYXBzaWJsZVN1YlNlY3Rpb24oCi0JCQl0aGlzLmJhc2ljVmFsdWVDb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl90eXBlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLkZBTFNFKQotCQkpOwotCQkoKEdyaWRMYXlvdXQpIGNvbnZlcnRlclNlY3Rpb24uZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCi0JCXRoaXMuaW5pdGlhbGl6ZUJhc2ljVmFsdWVUeXBlU2VjdGlvbihjb252ZXJ0ZXJTZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQmFzaWNWYWx1ZVR5cGVTZWN0aW9uKENvbXBvc2l0ZSB0eXBlU2VjdGlvbikgewotCQkvLyBObyBjb252ZXJ0ZXIKLQkJQnV0dG9uIG5vQ29udmVydGVyQnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQl0eXBlU2VjdGlvbiwgCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5UeXBlU2VjdGlvbl9kZWZhdWx0LCAKLQkJCWJ1aWxkTm9Db252ZXJ0ZXJIb2xkZXIoKSwgCi0JCQludWxsKTsKLQkJKChHcmlkRGF0YSkgbm9Db252ZXJ0ZXJCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJLy8gTG9iCi0JCUJ1dHRvbiBsb2JCdXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCXR5cGVTZWN0aW9uLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2xvYiwgCi0JCQlidWlsZExvYkNvbnZlcnRlckhvbGRlcigpLCAKLQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBsb2JCdXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIgPSBidWlsZENvbnZlcnRlckhvbGRlcigpOwotCQkvLyBUZW1wb3JhbAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCXR5cGVTZWN0aW9uLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX3RlbXBvcmFsLCAKLQkJCWJ1aWxkVGVtcG9yYWxCb29sZWFuSG9sZGVyKCksIAotCQkJbnVsbCk7Ci0JCXJlZ2lzdGVyU3ViUGFuZShuZXcgVGVtcG9yYWxUeXBlQ29tcG9zaXRlKGJ1aWxkVGVtcG9yYWxDb252ZXJ0ZXJIb2xkZXIoY29udmVydGVySG9sZGVyKSwgdHlwZVNlY3Rpb24sIGdldFdpZGdldEZhY3RvcnkoKSkpOwotCi0KLQkJLy8gRW51bWVyYXRlZAotCQlhZGRSYWRpb0J1dHRvbigKLQkJCXR5cGVTZWN0aW9uLCAKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlR5cGVTZWN0aW9uX2VudW1lcmF0ZWQsIAotCQkJYnVpbGRFbnVtZXJhdGVkQm9vbGVhbkhvbGRlcigpLCAKLQkJCW51bGwpOwotCQlyZWdpc3RlclN1YlBhbmUobmV3IEVudW1UeXBlQ29tcG9zaXRlKGJ1aWxkRW51bWVyYXRlZENvbnZlcnRlckhvbGRlcihjb252ZXJ0ZXJIb2xkZXIpLCB0eXBlU2VjdGlvbiwgZ2V0V2lkZ2V0RmFjdG9yeSgpKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGFibGVWYWx1ZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmVtYmVkZGFibGVWYWx1ZUNvbXBvc2l0ZSA9IG5ldyBFbGVtZW50Q29sbGVjdGlvblZhbHVlT3ZlcnJpZGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcikuZ2V0Q29udHJvbCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsVmFsdWVDb250cm9sU3dpdGNoZXIoUGFnZUJvb2sgcGFnZUJvb2spIHsKLQotCQluZXcgQ29udHJvbFN3aXRjaGVyKAotCQkJYnVpbGRWYWx1ZUhvbGRlcigpLAotCQkJYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSwKLQkJCXBhZ2VCb29rCi0JCSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGU+IGJ1aWxkVmFsdWVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlPigKLQkJCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlZBTFVFX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsdWVUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBUcmFuc2Zvcm1lcjxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZSwgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUsIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlIHR5cGUpIHsKLQkJCQlyZXR1cm4gQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGUudGhpcy50cmFuc2Zvcm1WYWx1ZVR5cGUodHlwZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gdGhlIHNlbGVjdGVkIG92ZXJyaWRlLCByZXR1cm4gdGhlIGNvbnRyb2wgdGhhdCB3aWxsIGJlIGRpc3BsYXllZAotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIHRyYW5zZm9ybVZhbHVlVHlwZShFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZSB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBCQVNJQ19UWVBFIDoKLQkJCQlyZXR1cm4gdGhpcy5iYXNpY1ZhbHVlQ29tcG9zaXRlOwotCQkJY2FzZSBFTUJFRERBQkxFX1RZUEUgOgotCQkJCXJldHVybiB0aGlzLmVtYmVkZGFibGVWYWx1ZUNvbXBvc2l0ZTsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sbGVjdGlvblRhYmxlMl8wPiBidWlsZENvbGxlY3Rpb25UYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBDb2xsZWN0aW9uVGFibGUyXzA+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblRhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29sdW1uPiBidWlsZFZhbHVlQ29sdW1uSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIENvbHVtbj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBDb2x1bW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWYWx1ZUNvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGROb0NvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBudWxsKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZExvYkNvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDb252ZXJ0aWJsZU1hcHBpbmcuQ09OVkVSVEVSX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCUNvbnZlcnRlciBjb252ZXJ0ZXIgPSB0aGlzLnN1YmplY3QuZ2V0Q29udmVydGVyKCk7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IExvYkNvbnZlcnRlci5jbGFzcyk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlcihMb2JDb252ZXJ0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBidWlsZENvbnZlcnRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgQ29udmVydGVyPihnZXRTdWJqZWN0SG9sZGVyKCksIENvbnZlcnRpYmxlTWFwcGluZy5DT05WRVJURVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENvbnZlcnRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxUZW1wb3JhbENvbnZlcnRlcj4gYnVpbGRUZW1wb3JhbENvbnZlcnRlckhvbGRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyPiBjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxDb252ZXJ0ZXIsIFRlbXBvcmFsQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFRlbXBvcmFsQ29udmVydGVyIHRyYW5zZm9ybV8oQ29udmVydGVyIGNvbnZlcnRlcikgewotCQkJCXJldHVybiBjb252ZXJ0ZXIuZ2V0VHlwZSgpID09IFRlbXBvcmFsQ29udmVydGVyLmNsYXNzID8gKFRlbXBvcmFsQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxFbnVtZXJhdGVkQ29udmVydGVyPiBidWlsZEVudW1lcmF0ZWRDb252ZXJ0ZXJIb2xkZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbnZlcnRlcj4gY29udmVydGVySG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Q29udmVydGVyLCBFbnVtZXJhdGVkQ29udmVydGVyPihjb252ZXJ0ZXJIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudW1lcmF0ZWRDb252ZXJ0ZXIgdHJhbnNmb3JtXyhDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0JCQkJcmV0dXJuIGNvbnZlcnRlci5nZXRUeXBlKCkgPT0gRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyA/IChFbnVtZXJhdGVkQ29udmVydGVyKSBjb252ZXJ0ZXIgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRUZW1wb3JhbEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRW51bWVyYXRlZEJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgQ29udmVydGlibGVNYXBwaW5nLkNPTlZFUlRFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlDb252ZXJ0ZXIgY29udmVydGVyID0gdGhpcy5zdWJqZWN0LmdldENvbnZlcnRlcigpOwotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YoY29udmVydGVyLmdldFR5cGUoKSA9PSBFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQl0aGlzLnN1YmplY3Quc2V0Q29udmVydGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRQYW5lKENvbXBvc2l0ZSBjb250YWluZXIsIGludCBncm91cEJveE1hcmdpbikgewotCQlyZXR1cm4gYWRkU3ViUGFuZShjb250YWluZXIsIDAsIGdyb3VwQm94TWFyZ2luLCAwLCBncm91cEJveE1hcmdpbik7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjE5MjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbjxNLCBUIGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotCWV4dGVuZHMgQWJzdHJhY3RNYXBwaW5nVWlEZWZpbml0aW9uPE0sIFQ+Ci17Ci0JcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKGdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9sYWJlbDsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRMaW5rTGFiZWwoKSB7Ci0JCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBfbGlua0xhYmVsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwYzI3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkRlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8VCBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmcsIFIgZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA+Ci0JZXh0ZW5kcyBBYnN0cmFjdE1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGU8VCwgUj4KLXsKLQlwcm90ZWN0ZWQgQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBUPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWluaXRpYWxpemVNYW55VG9PbmVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZURlcml2ZWRJZGVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlcml2ZWRJZGVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBEZXJpdmVkSWRlbnRpdHkyXzBQYW5lKHRoaXMsIGJ1aWxkRGVyaXZlZElkZW50aXR5SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lKHRoaXMsIGJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RGVyaXZlZElkZW50aXR5Ml8wPiBidWlsZERlcml2ZWRJZGVudGl0eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRGVyaXZlZElkZW50aXR5Ml8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERlcml2ZWRJZGVudGl0eTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChNYW55VG9PbmVNYXBwaW5nMl8wKSB0aGlzLnN1YmplY3QpLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9BYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE1OGNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkRlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxUIGV4dGVuZHMgT25lVG9PbmVNYXBwaW5nLCBSIGV4dGVuZHMgT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA+Ci0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZTxULCBSPgotewotCXByb3RlY3RlZCBBYnN0cmFjdE9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlpbml0aWFsaXplT25lVG9PbmVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZURlcml2ZWRJZGVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihjb250YWluZXIpOwotCQlpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURlcml2ZWRJZGVudGl0eUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBEZXJpdmVkSWRlbnRpdHkyXzBQYW5lKHRoaXMsIGJ1aWxkRGVyaXZlZElkZW50aXR5SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8RGVyaXZlZElkZW50aXR5Ml8wPiBidWlsZERlcml2ZWRJZGVudGl0eUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8VCwgRGVyaXZlZElkZW50aXR5Ml8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIERlcml2ZWRJZGVudGl0eTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPbmVUb09uZU1hcHBpbmcyXzApIHRoaXMuc3ViamVjdCkuZ2V0RGVyaXZlZElkZW50aXR5KCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjFiZDg2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Fzc29jaWF0aW9uT3ZlcnJpZGUyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luQ29sdW1uc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgQXNzb2NpYXRpb25PdmVycmlkZQotICogQHNlZSBFbnRpdHlPdmVycmlkZXNDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBKb2luQ29sdW1uc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZQotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QXNzb2NpYXRpb25PdmVycmlkZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkFzc29jaWF0aW9uT3ZlcnJpZGU8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZTJfMENvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZFRpdGxlZEdyb3VwKAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3RpdGxlKTsKLQkJCi0JCWFkZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lKGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBidWlsZFJlbGF0aW9uc2hpcE1vZGVsKCksIGNvbnRhaW5lcik7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXA+IGJ1aWxkUmVsYXRpb25zaGlwTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlLCBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBSZWFkT25seUpvaW5UYWJsZVJlbGF0aW9uc2hpcCB0cmFuc2Zvcm1fKFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSB2YWx1ZSkgewotCQkJCS8vIGFsbCBzcGVjaWZpZWQgYW5kIHZpcnR1YWwgKG1hcHBpbmdzKSBvdmVycmlkZXMgc3VwcG9ydCBqb2luIHRhYmxlcwotCQkJCXJldHVybiAoUmVhZE9ubHlKb2luVGFibGVSZWxhdGlvbnNoaXApIHZhbHVlLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9DYWNoZWFibGUyXzBQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9DYWNoZWFibGUyXzBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYWJlNWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvQ2FjaGVhYmxlMl8wUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLkpwdENvbW1vblVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IFtYXSAgQ2FjaGVhYmxlICh0cnVlL2ZhbHNlKQotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIENhY2hlYWJsZTJfMAotICogQHNlZSBKYXZhRW50aXR5Ml8wQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqIEBzZWUgT3JtRW50aXR5Ml8wQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyB3aWRnZXQKLSAqLwotcHVibGljIGNsYXNzIENhY2hlYWJsZTJfMFBhbmUgCi0JZXh0ZW5kcyBQYW5lPENhY2hlYWJsZTJfMD4KLXsKLQlwdWJsaWMgQ2FjaGVhYmxlMl8wUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgQ2FjaGVhYmxlMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVMYWJlbCwKLQkJCWJ1aWxkQ2FjaGVhYmxlQm9vbGVhbkhvbGRlcigpLAotCQkJYnVpbGRDYWNoZWFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLkVOVElUWV9DQUNIRUFCTEUKLQkJKTsKLQl9Ci0JCi0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkQ2FjaGVhYmxlQm9vbGVhbkhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGVhYmxlMl8wLCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCUNhY2hlYWJsZTJfMC5ERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSwKLQkJCUNhY2hlYWJsZTJfMC5TUEVDSUZJRURfQ0FDSEVBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkQ2FjaGVhYmxlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRDYWNoZWFibGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVudGl0eV9jYWNoZWFibGVXaXRoRGVmYXVsdExhYmVsLCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRW50aXR5X2NhY2hlYWJsZUxhYmVsOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERlZmF1bHRDYWNoZWFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hlYWJsZTJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlDYWNoZWFibGUyXzAuU1BFQ0lGSUVEX0NBQ0hFQUJMRV9QUk9QRVJUWSwKLQkJCUNhY2hlYWJsZTJfMC5ERUZBVUxUX0NBQ0hFQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZENhY2hlYWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Nhc2NhZGVQYW5lMl8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9DYXNjYWRlUGFuZTJfMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTk5MGNhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Nhc2NhZGVQYW5lMl8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5DYXNjYWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotcHVibGljIGNsYXNzIENhc2NhZGVQYW5lMl8wPFQgZXh0ZW5kcyBDYXNjYWRlMl8wPgotCWV4dGVuZHMgQ2FzY2FkZUNvbXBvc2l0ZTxUPgotewotCXB1YmxpYyBDYXNjYWRlUGFuZTJfMCgKLQkJCVBhbmU8PyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8VD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBDYXNjYWRlUGFuZTJfMCgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIENhc2NhZGUgZ3JvdXAKLQkJR3JvdXAgY2FzY2FkZUdyb3VwID0gYWRkQ2FzY2FkZUdyb3VwKGNvbnRhaW5lcik7Ci0JCQotCQkvLyBDb250YWluZXIgb2YgdGhlIGNoZWNrIGJveGVzCi0JCWNvbnRhaW5lciA9IGFkZFN1YlBhbmUoY2FzY2FkZUdyb3VwLCA2LCA4LCAwLCAwLCAwKTsKLQkJCi0JCWFkZEFsbENoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFBlcnNpc3RDaGVja0JveChjb250YWluZXIpOwotCQlhZGRNZXJnZUNoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFJlbW92ZUNoZWNrQm94KGNvbnRhaW5lcik7Ci0JCWFkZFJlZnJlc2hDaGVja0JveChjb250YWluZXIpOwotCQlhZGREZXRhY2hDaGVja0JveChjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZXRhY2hDaGVja0JveChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZENoZWNrQm94KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5DYXNjYWRlUGFuZTJfMF9kZXRhY2gsCi0JCQkJYnVpbGRDYXNjYWRlVHlwZURldGFjaEhvbGRlcigpLAotCQkJCW51bGwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRDYXNjYWRlVHlwZURldGFjaEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FzY2FkZTJfMCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBDYXNjYWRlMl8wLkRFVEFDSF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5pc0RldGFjaCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJc3ViamVjdC5zZXREZXRhY2godmFsdWUpOwotCQkJfQotCQl9OwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0NvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmI3ZGZiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0NvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UmVmZXJlbmNlVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbnNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5DYXRhbG9nQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLlNjaGVtYUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5UYWJsZUNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLQotLyoqCi0gKiBUaGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKLSAqIHwgICBOYW1lOiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICB8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKLSAqIHwgICBTY2hlbWE6ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICB8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIHwKLSAqIHwgICBDYXRhbG9nOiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgICB8Ci0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBKb2luIENvbHVtbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IHggT3ZlcnJpZGUgRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8IEpvaW5Db2x1bW5zQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIENvbGxlY3Rpb25UYWJsZTJfMH0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5zQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGUKLQlleHRlbmRzIFJlZmVyZW5jZVRhYmxlQ29tcG9zaXRlPFJlYWRPbmx5UmVmZXJlbmNlVGFibGU+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUmVhZE9ubHlSZWZlcmVuY2VUYWJsZT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+Q29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+Q29sbGVjdGlvblRhYmxlMl8wPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIENvbGxlY3Rpb25UYWJsZTJfMD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkvLyBjb2xsZWN0aW9uIHRhYmxlIGdyb3VwIHBhbmUKLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfdGl0bGUKLQkJKTsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSBnZXRHcm91cEJveE1hcmdpbigpOwotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQlUYWJsZUNvbWJvPFJlYWRPbmx5UmVmZXJlbmNlVGFibGU+IHRhYmxlQ29tYm8gPSBhZGRUYWJsZUNvbWJvKGNvbnRhaW5lcik7Ci0JCUNvbXBvc2l0ZSB0YWJsZVBhbmUgPSBhZGRQYW5lKGNvbnRhaW5lciwgZ3JvdXBCb3hNYXJnaW4pOwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJCXRhYmxlUGFuZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkNvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZV9uYW1lLAotCQkJdGFibGVDb21iby5nZXRDb250cm9sKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTExFQ1RJT05fVEFCTEVfTkFNRQotCQkpOwotCQkKLQkJLy8gc2NoZW1hIHdpZGdldHMKLQkJU2NoZW1hQ29tYm88UmVhZE9ubHlSZWZlcmVuY2VUYWJsZT4gc2NoZW1hQ29tYm8gPSBhZGRTY2hlbWFDb21ibyhjb250YWluZXIpOwotCi0JCWFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQl0YWJsZVBhbmUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfc2NoZW1hLAotCQkJc2NoZW1hQ29tYm8uZ2V0Q29udHJvbCgpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xMRUNUSU9OX1RBQkxFX1NDSEVNQQotCQkpOwotCQkKLQkJLy8gY2F0YWxvZyB3aWRnZXRzCi0JCUNhdGFsb2dDb21ibzxSZWFkT25seVJlZmVyZW5jZVRhYmxlPiBjYXRhbG9nQ29tYm8gPSBhZGRDYXRhbG9nQ29tYm8oY29udGFpbmVyKTsKLQotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJdGFibGVQYW5lLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlX2NhdGFsb2csCi0JCQljYXRhbG9nQ29tYm8uZ2V0Q29udHJvbCgpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xMRUNUSU9OX1RBQkxFX0NBVEFMT0cKLQkJKTsKLQotCQkvLyBKb2luIENvbHVtbnMgZ3JvdXAgcGFuZQotCQlHcm91cCBqb2luQ29sdW1uR3JvdXBQYW5lID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfam9pbkNvbHVtbgotCQkpOwotCi0JCS8vIE92ZXJyaWRlIERlZmF1bHQgSm9pbiBDb2x1bW5zIGNoZWNrIGJveAotCQl0aGlzLm92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5zQ2hlY2tCb3ggPSBhZGRDaGVja0JveCgKLQkJCWFkZFN1YlBhbmUoam9pbkNvbHVtbkdyb3VwUGFuZSwgOCksCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5Db2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfb3ZlcnJpZGVEZWZhdWx0Sm9pbkNvbHVtbnMsCi0JCQlidWlsZE92ZXJyaWRlRGVmYXVsdEpvaW5Db2x1bW5Ib2xkZXIoKSwKLQkJCW51bGwKLQkJKTsKLQotCQl0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlID0gbmV3IEpvaW5Db2x1bW5zQ29tcG9zaXRlPFJlYWRPbmx5UmVmZXJlbmNlVGFibGU+KAotCQkJdGhpcywKLQkJCWpvaW5Db2x1bW5Hcm91cFBhbmUsCi0JCQlidWlsZEpvaW5Db2x1bW5zRWRpdG9yKCkKLQkJKTsKLQotCQlpbnN0YWxsSm9pbkNvbHVtbnNQYW5lRW5hYmxlcih0aGlzLmpvaW5Db2x1bW5zQ29tcG9zaXRlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gdGFibGVJc1ZpcnR1YWwoUmVhZE9ubHlSZWZlcmVuY2VUYWJsZSBjb2xsZWN0aW9uVGFibGUpIHsKLQkJcmV0dXJuIGNvbGxlY3Rpb25UYWJsZS5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCkuaXNWaXJ0dWFsKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Rlcml2ZWRJZGVudGl0eTJfMFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0Rlcml2ZWRJZGVudGl0eTJfMFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA5Njg4Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9EZXJpdmVkSWRlbnRpdHkyXzBQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkNvbWJvUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkRlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBEZXJpdmVkSWRlbnRpdHkyXzBQYW5lCi0JZXh0ZW5kcyBQYW5lPERlcml2ZWRJZGVudGl0eTJfMD4KLXsKLQlwdWJsaWMgRGVyaXZlZElkZW50aXR5Ml8wUGFuZSgKLQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwgCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIERlcml2ZWRJZGVudGl0eTJfMD4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRGVyaXZlZElkZW50aXR5X3RpdGxlKTsKLQkJKChHcmlkTGF5b3V0KSBjb21wb3NpdGUuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgPSAyOwotCQkKLQkJYWRkTnVsbERlcml2ZWRJZGVudGl0eVBhbmUoY29tcG9zaXRlKTsKLQkJYWRkSWREZXJpdmVkSWRlbnRpdHlQYW5lKGNvbXBvc2l0ZSk7Ci0JCWFkZE1hcHNJZERlcml2ZWRJZGVudGl0eVBhbmUoY29tcG9zaXRlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTnVsbERlcml2ZWRJZGVudGl0eVBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gYWRkUmFkaW9CdXR0b24oCi0JCQkJcGFyZW50LAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkRlcml2ZWRJZGVudGl0eV9udWxsRGVyaXZlZElkZW50aXR5LAotCQkJCWJ1aWxkVXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneUhvbGRlcigpLAotCQkJCW51bGwpOwotCQkoKEdyaWREYXRhKSBidXR0b24uZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3lIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPERlcml2ZWRJZGVudGl0eTJfMCwgQm9vbGVhbj4oCi0JCQkJZ2V0U3ViamVjdEhvbGRlcigpLCBEZXJpdmVkSWRlbnRpdHkyXzAuUFJFRE9NSU5BTlRfREVSSVZFRF9JREVOVElUWV9TVFJBVEVHWV9QUk9QRVJUWSkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJLy8gcmFkaW8gYnV0dG9uIC0gc2hvdWxkIG9ubHkgaGF2ZSB0cnVlIHZhbHVlcyBoZXJlCi0JCQkJaWYgKHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZElkRGVyaXZlZElkZW50aXR5UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBhZGRSYWRpb0J1dHRvbigKLQkJCQlwYXJlbnQsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuRGVyaXZlZElkZW50aXR5X2lkRGVyaXZlZElkZW50aXR5LAotCQkJCWJ1aWxkVXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3lIb2xkZXIoKSwKLQkJCQludWxsKTsKLQkJKChHcmlkRGF0YSkgYnV0dG9uLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLQkKLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RGVyaXZlZElkZW50aXR5Ml8wLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIERlcml2ZWRJZGVudGl0eTJfMC5QUkVET01JTkFOVF9ERVJJVkVEX0lERU5USVRZX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJLy8gcmFkaW8gYnV0dG9uIC0gc2hvdWxkIG9ubHkgaGF2ZSB0cnVlIHZhbHVlcyBoZXJlCi0JCQkJaWYgKHZhbHVlKSB7Ci0JCQkJCXRoaXMuc3ViamVjdC5zZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXBzSWREZXJpdmVkSWRlbnRpdHlQYW5lKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gdXNlc01hcHNJZE1vZGVsID0gYnVpbGRVc2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3lIb2xkZXIoKTsKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQlwYXJlbnQsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlczJfMC5EZXJpdmVkSWRlbnRpdHlfbWFwc0lkRGVyaXZlZElkZW50aXR5LAotCQkJdXNlc01hcHNJZE1vZGVsLAotCQkJbnVsbCk7Ci0KLQkJYnVpbGRNYXBzSWRWYWx1ZUNvbWJvUGFuZShwYXJlbnQsIHVzZXNNYXBzSWRNb2RlbCk7Ci0JfQotCQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RGVyaXZlZElkZW50aXR5Ml8wLCBCb29sZWFuPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIERlcml2ZWRJZGVudGl0eTJfMC5QUkVET01JTkFOVF9ERVJJVkVEX0lERU5USVRZX1NUUkFURUdZX1BST1BFUlRZKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKHRoaXMuc3ViamVjdCA9PSBudWxsKSA/IEJvb2xlYW4uRkFMU0UgOiB0aGlzLnN1YmplY3QudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQkvLyByYWRpbyBidXR0b24gLSBzaG91bGQgb25seSBoYXZlIHRydWUgdmFsdWVzIGhlcmUKLQkJCQlpZiAodmFsdWUpIHsKLQkJCQkJdGhpcy5zdWJqZWN0LnNldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29tYm9QYW5lIGJ1aWxkTWFwc0lkVmFsdWVDb21ib1BhbmUoQ29tcG9zaXRlIHBhcmVudCwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHVzZXNNYXBzSWRNb2RlbCkgewotCQlyZXR1cm4gbmV3IE1hcHNJZFZhbHVlQ29tYm9QYW5lKHRoaXMsIGJ1aWxkTWFwc0lkU3RyYXRlZ3lIb2xkZXIoKSwgcGFyZW50LCB1c2VzTWFwc0lkTW9kZWwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wPiBidWlsZE1hcHNJZFN0cmF0ZWd5SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxEZXJpdmVkSWRlbnRpdHkyXzAsIE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBjbGFzcyBNYXBzSWRWYWx1ZUNvbWJvUGFuZQotCQlleHRlbmRzIENvbWJvUGFuZTxNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMD4KLQl7Ci0JCXB1YmxpYyBNYXBzSWRWYWx1ZUNvbWJvUGFuZSgKLQkJCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMD4gc3ViamVjdEhvbGRlciwKLQkJCQlDb21wb3NpdGUgcGFyZW50LAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkTW9kZWwpIHsKLQkJCQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBlbmFibGVkTW9kZWwpOwotCQl9Ci0JCQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQlwcm9wZXJ0eU5hbWVzLmFkZChNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneTJfMC5ERUZBVUxUX0lEX0FUVFJJQlVURV9OQU1FX1BST1BFUlRZKTsKLQkJCXByb3BlcnR5TmFtZXMuYWRkKE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5Ml8wLlNQRUNJRklFRF9JRF9BVFRSSUJVVEVfTkFNRV9QUk9QRVJUWSk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlKCkgewotCQkJcmV0dXJuIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBudWxsIDogZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQlpZiAoZ2V0U3ViamVjdCgpICE9IG51bGwpIGdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUodmFsdWUpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGJvb2xlYW4gdXNlc0RlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiAoZ2V0U3ViamVjdCgpICE9IG51bGwpICYmIGdldFN1YmplY3QoKS5kZWZhdWx0SWRBdHRyaWJ1dGVOYW1lSXNQb3NzaWJsZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQlyZXR1cm4gKGdldFN1YmplY3QoKSA9PSBudWxsKSA/IG51bGwgOiBnZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdElkQXR0cmlidXRlTmFtZSgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gZ2V0VmFsdWVzKCkgewotCQkJcmV0dXJuIChnZXRTdWJqZWN0KCkgPT0gbnVsbCkgPyBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSA6IGdldFN1YmplY3QoKS5nZXRTb3J0ZWRDYW5kaWRhdGVJZEF0dHJpYnV0ZU5hbWVzKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkTnVsbERlZmF1bHRWYWx1ZUVudHJ5KCkgewotCQkJcmV0dXJuIGJ1aWxkTm9uTnVsbERlZmF1bHRWYWx1ZUVudHJ5KEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkRlcml2ZWRJZGVudGl0eV9tYXBzSWRVbnNwZWNpZmllZFZhbHVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YWYzMTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFRhcmdldENsYXNzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRmV0Y2hUeXBlQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBDb2xsZWN0aW9uVGFibGVDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbHVtbkNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgT3B0aW9uYWxDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBMb2JDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBCYXNpY01hcHBpbmcKLSAqIEBzZWUgT3JkZXJDb2x1bW5Db21wb3NpdGUKLSAqIEBzZWUgRW51bVR5cGVDb21wb3NpdGUKLSAqIEBzZWUgRmV0Y2hUeXBlQ29tcG9zaXRlCi0gKiBAc2VlIExvYkNvbXBvc2l0ZQotICogQHNlZSBPcHRpb25hbENvbXBvc2l0ZQotICogQHNlZSBUZW1wb3JhbFR5cGVDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjMKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPklCYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25WYWx1ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRWxlbWVudENvbGxlY3Rpb25WYWx1ZU92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTU2ZTMxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VsZW1lbnRDb2xsZWN0aW9uVmFsdWVPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRWxlbWVudENvbGxlY3Rpb25WYWx1ZU92ZXJyaWRlc0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPdmVycmlkZXNDb21wb3NpdGU8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotewotCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvblZhbHVlT3ZlcnJpZGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3VwcG9ydHNBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQYW5lPFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gYnVpbGRBc3NvY2lhdGlvbk92ZXJyaWRlUGFuZShQYWdlQm9vayBwYWdlQm9vaywgUHJvcGVydHlWYWx1ZU1vZGVsPFJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IEFzc29jaWF0aW9uT3ZlcnJpZGVDb21wb3NpdGUodGhpcywgYXNzb2NpYXRpb25PdmVycmlkZUhvbGRlciwgcGFnZUJvb2spOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAsIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWYWx1ZUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmM2U0MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkSWRNYXBwaW5nPgotewotCXB1YmxpYyBFbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRW1iZWRkZWRJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODdmZjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5Db250cm9sU3dpdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkRlcml2YWJsZUlkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lPFQgZXh0ZW5kcyBFbWJlZGRlZElkTWFwcGluZzJfMD4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQlMYWJlbCBtYXBwZWRCeVJlbGF0aW9uc2hpcExhYmVsOwotCi0JcHVibGljIEVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJdGhpcy5tYXBwZWRCeVJlbGF0aW9uc2hpcExhYmVsID0gYWRkTGFiZWwocGFnZUJvb2ssIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lX2xhYmVsKTsKLQotCQluZXcgQ29udHJvbFN3aXRjaGVyKGJ1aWxkRGVyaXZlZE1vZGVsKCksIGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCksIHBhZ2VCb29rKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZXJpdmVkTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFQsIEJvb2xlYW4+KGdldFN1YmplY3RIb2xkZXIoKSwgRGVyaXZhYmxlSWRNYXBwaW5nMl8wLkRFUklWRURfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZXJpdmVkKCkpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4gYnVpbGRQYW5lVHJhbnNmb3JtZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtZXI8Qm9vbGVhbiwgQ29udHJvbD4oKSB7Ci0JCQlwdWJsaWMgQ29udHJvbCB0cmFuc2Zvcm0oQm9vbGVhbiBjb252ZXJ0ZXIpIHsKLQkJCQlpZiAoY29udmVydGVyID09IG51bGwgfHwgY29udmVydGVyID09IEJvb2xlYW4uRkFMU0UpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBFbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZS50aGlzLm1hcHBlZEJ5UmVsYXRpb25zaGlwTGFiZWw7IAotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0VtYmVkZGVkTWFwcGluZzJfME92ZXJyaWRlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYTU1ZmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW1iZWRkZWRNYXBwaW5nMl8wT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ092ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkTWFwcGluZzJfME92ZXJyaWRlc0NvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGU8RW1iZWRkZWRNYXBwaW5nPgotewotCXB1YmxpYyBFbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0Fzc29jaWF0aW9uT3ZlcnJpZGVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+IGJ1aWxkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGVkTWFwcGluZywgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGFuZTxSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVBhbmUoUGFnZUJvb2sgcGFnZUJvb2ssIFByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQ29tcG9zaXRlKHRoaXMsIGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIsIHBhZ2VCb29rKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyPiBidWlsZEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGVkTWFwcGluZywgQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKEVtYmVkZGVkTWFwcGluZzJfMCkgdGhpcy5zdWJqZWN0KS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NGE3ZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5T3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5Ml8wT3ZlcnJpZGVzQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU92ZXJyaWRlc0NvbXBvc2l0ZQotewotCXB1YmxpYyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUoCi0JCQlQYW5lPD8gZXh0ZW5kcyBFbnRpdHk+IHBhcmVudFBhbmUsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGFuZTxSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+IGJ1aWxkQXNzb2NpYXRpb25PdmVycmlkZVBhbmUoUGFnZUJvb2sgcGFnZUJvb2ssIFByb3BlcnR5VmFsdWVNb2RlbDxSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQ29tcG9zaXRlKHRoaXMsIGFzc29jaWF0aW9uT3ZlcnJpZGVIb2xkZXIsIHBhZ2VCb29rKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9HZW5lcmF0aW9uMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9HZW5lcmF0aW9uMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0ZDA2NzkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvR2VuZXJhdGlvbjJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5HZW5lcmF0b3JDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkdlbmVyYXRpb25Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBHZW5lcmF0aW9uMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0aW9uMl8wQ29tcG9zaXRlIGV4dGVuZHMgR2VuZXJhdGlvbkNvbXBvc2l0ZQotewotCQotCXB1YmxpYyBHZW5lcmF0aW9uMl8wQ29tcG9zaXRlKAotCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEdlbmVyYXRvckNvbnRhaW5lcj4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlKENvbXBvc2l0ZSBjb250YWluZXIsIGludCB0b3BNYXJnaW4sIGludCBsZWZ0TWFyZ2luKSB7Ci0JCW5ldyBTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JIb2xkZXIoKSwKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCi0JCQl0aGlzLmJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JCdWlsZGVyKCkKLQkJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0lkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWVjY2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuQ29udHJvbFN3aXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuSWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRGVyaXZhYmxlSWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotCi0KLXB1YmxpYyBjbGFzcyBJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmU8VCBleHRlbmRzIElkTWFwcGluZzJfMD4KLQlleHRlbmRzIFBhbmU8VD4KLXsKLQotCUxhYmVsIG1hcHBlZEJ5UmVsYXRpb25zaGlwTGFiZWw7Ci0KLQlwdWJsaWMgSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFQ+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlQYWdlQm9vayBwYWdlQm9vayA9IG5ldyBQYWdlQm9vayhjb250YWluZXIsIFNXVC5OVUxMKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJdGhpcy5tYXBwZWRCeVJlbGF0aW9uc2hpcExhYmVsID0gYWRkTGFiZWwocGFnZUJvb2ssIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLklkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZV9sYWJlbCk7Ci0KLQkJbmV3IENvbnRyb2xTd2l0Y2hlcihidWlsZERlcml2ZWRNb2RlbCgpLCBidWlsZFBhbmVUcmFuc2Zvcm1lcigpLCBwYWdlQm9vayk7Ci0JfQotCi0JcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVyaXZlZE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxULCBCb29sZWFuPihnZXRTdWJqZWN0SG9sZGVyKCksIERlcml2YWJsZUlkTWFwcGluZzJfMC5ERVJJVkVEX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVyaXZlZCgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+IGJ1aWxkUGFuZVRyYW5zZm9ybWVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWVyPEJvb2xlYW4sIENvbnRyb2w+KCkgewotCQkJcHVibGljIENvbnRyb2wgdHJhbnNmb3JtKEJvb2xlYW4gY29udmVydGVyKSB7Ci0JCQkJaWYgKGNvbnZlcnRlciA9PSBudWxsIHx8IGNvbnZlcnRlciA9PSBCb29sZWFuLkZBTFNFKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lLnRoaXMubWFwcGVkQnlSZWxhdGlvbnNoaXBMYWJlbDsgCi0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODUwNzI3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0lkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZE1hcHBpbmdHZW5lcmF0aW9uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdG9yQ29tcG9zaXRlLkdlbmVyYXRvckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBJZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBJZE1hcHBpbmdHZW5lcmF0aW9uMl8wQ29tcG9zaXRlIGV4dGVuZHMgSWRNYXBwaW5nR2VuZXJhdGlvbkNvbXBvc2l0ZQotewotCi0JcHVibGljIElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgSWRNYXBwaW5nPiBwYXJlbnRQYW5lLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlIGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCUNvbXBvc2l0ZSBjb250YWluZXIsIAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQlHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvckJ1aWxkZXIsCi0JCWludCB0b3BNYXJnaW4sCi0JCWludCBsZWZ0TWFyZ2luKSB7Ci0KLQkJcmV0dXJuIG5ldyBTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQlzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciwKLQkJCXRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIHRvcE1hcmdpbiwgbGVmdE1hcmdpbiksCi0JCQlzZXF1ZW5jZUdlbmVyYXRvckJ1aWxkZXIKLQkJKTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9KcHRVaURldGFpbHNNZXNzYWdlczJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmNGU2Yi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9KcHRVaURldGFpbHNNZXNzYWdlczJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTG9jYWxpemVkIG1lc3NhZ2VzIHVzZWQgYnkgRGFsaSBtYXBwaW5nIHBhbmVzLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDIuMwotICovCi1wdWJsaWMgY2xhc3MgSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAgCi17Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2FzY2FkZVBhbmUyXzBfZGV0YWNoOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfam9pbkNvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfbmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb2xsZWN0aW9uVGFibGUyXzBDb21wb3NpdGVfc2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZV9jYXRhbG9nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZV9vdmVycmlkZURlZmF1bHRKb2luQ29sdW1uczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZXJpdmVkSWRlbnRpdHlfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVyaXZlZElkZW50aXR5X251bGxEZXJpdmVkSWRlbnRpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVyaXZlZElkZW50aXR5X2lkRGVyaXZlZElkZW50aXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlcml2ZWRJZGVudGl0eV9tYXBzSWREZXJpdmVkSWRlbnRpdHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVyaXZlZElkZW50aXR5X21hcHNJZFVuc3BlY2lmaWVkVmFsdWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMF9saW5rTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudENvbGxlY3Rpb25TZWN0aW9uX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wX0NvbXBvc2l0ZV92YWx1ZVNlY3Rpb25UaXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlfY2FjaGVhYmxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5X2NhY2hlYWJsZVdpdGhEZWZhdWx0TGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1iZWRkZWRJZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmVfbGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lX2xhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9yZGVyaW5nQ29tcG9zaXRlX29yZGVyQ29sdW1uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGVfb3JwaGFuUmVtb3ZhbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGVfb3JwaGFuUmVtb3ZhbExhYmVsRGVmYXVsdDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NrTW9kZUNvbXBvc2l0ZV9sb2NrTW9kZUxhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9ja01vZGVDb21wb3NpdGVfcmVhZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NrTW9kZUNvbXBvc2l0ZV93cml0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMb2NrTW9kZUNvbXBvc2l0ZV9vcHRpbWlzdGljOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tNb2RlQ29tcG9zaXRlX29wdGltaXN0aWNfZm9yY2VfaW5jcmVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX3JlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9ja01vZGVDb21wb3NpdGVfcGVzc2ltaXN0aWNfd3JpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTG9ja01vZGVDb21wb3NpdGVfcGVzc2ltaXN0aWNfZm9yY2VfaW5jcmVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tNb2RlQ29tcG9zaXRlX25vbmU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXJnZXRDbGFzc0NvbXBvc2l0ZV9sYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFycmF5TWFwcGluZzJfM19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcnJheU1hcHBpbmcyXzNfbGlua0xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlTWFwcGluZzJfM19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVNYXBwaW5nMl8zX2xpbmtMYWJlbDsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX2RldGFpbHMyXzAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuY2xhc3M7Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQlVORExFX0NMQVNTKTsKLQl9Ci0KLQlwcml2YXRlIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0xvY2tNb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9Mb2NrTW9kZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzExMmQwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL0xvY2tNb2RlQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkxvY2tNb2RlVHlwZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk5hbWVkUXVlcnkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBMb2NrTW9kZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgTG9ja01vZGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPE5hbWVkUXVlcnkyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Mb2NrTW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgTG9ja01vZGVDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgTmFtZWRRdWVyeTJfMD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkxvY2tNb2RlQ29tcG9zaXRlX2xvY2tNb2RlTGFiZWwsCi0JCQl0aGlzLmFkZExvY2tNb2RlVHlwZUNvbWJvKGNvbnRhaW5lciksCi0JCQludWxsCQkvLyBUT0RPCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPE5hbWVkUXVlcnkyXzAsIExvY2tNb2RlVHlwZTJfMD4gYWRkTG9ja01vZGVUeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxOYW1lZFF1ZXJ5Ml8wLCBMb2NrTW9kZVR5cGUyXzA+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE5hbWVkUXVlcnkyXzAuREVGQVVMVF9MT0NLX01PREVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKE5hbWVkUXVlcnkyXzAuU1BFQ0lGSUVEX0xPQ0tfTU9ERV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvY2tNb2RlVHlwZTJfMFtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIExvY2tNb2RlVHlwZTJfMC52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTG9ja01vZGVUeXBlMl8wIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RGVmYXVsdExvY2tNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKExvY2tNb2RlVHlwZTJfMCB2YWx1ZSkgewotCQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQkJY2FzZSBOT05FIDoKLQkJCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlczJfMC5Mb2NrTW9kZUNvbXBvc2l0ZV9ub25lOwotCQkJCQljYXNlIE9QVElNSVNUSUMgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkxvY2tNb2RlQ29tcG9zaXRlX29wdGltaXN0aWM7Ci0JCQkJCWNhc2UgT1BUSU1JU1RJQ19GT1JDRV9JTkNSRU1FTlQgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkxvY2tNb2RlQ29tcG9zaXRlX29wdGltaXN0aWNfZm9yY2VfaW5jcmVtZW50OwotCQkJCQljYXNlIFBFU1NJTUlTVElDX0ZPUkNFX0lOQ1JFTUVOVCA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuTG9ja01vZGVDb21wb3NpdGVfcGVzc2ltaXN0aWNfZm9yY2VfaW5jcmVtZW50OwotCQkJCQljYXNlIFBFU1NJTUlTVElDX1JFQUQgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkxvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX3JlYWQ7Ci0JCQkJCWNhc2UgUEVTU0lNSVNUSUNfV1JJVEUgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkxvY2tNb2RlQ29tcG9zaXRlX3Blc3NpbWlzdGljX3dyaXRlOwotCQkJCQljYXNlIFJFQUQgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkxvY2tNb2RlQ29tcG9zaXRlX3JlYWQ7Ci0JCQkJCWNhc2UgV1JJVEUgOgotCQkJCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLkxvY2tNb2RlQ29tcG9zaXRlX3dyaXRlOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExvY2tNb2RlVHlwZTJfMCBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkTG9ja01vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShMb2NrTW9kZVR5cGUyXzAgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRMb2NrTW9kZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvTWFueVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTAxZjFlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL01hbnlUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIGlzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOiAgCi0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLSBKb2luaW5nIFN0cmF0ZWd5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gSm9pbkNvbHVtblN0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBvIEpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmVfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBNYW55VG9PbmVNYXBwaW5nfQotICogQHNlZSB7QGxpbmsgTWFueVRvT25lUmVsYXRpb25zaGlwfQotICogQHNlZSB7QGxpbmsgT3JtTWFueVRvT25lTWFwcGluZ0NvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIEpvaW5Db2x1bW5TdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lIGV4dGVuZHMgUGFuZTxNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA+Ci17Ci0JcHVibGljIE1hbnlUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pblRhYmxlSm9pbmluZ0xhYmVsLAotCQkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQkJYWRkU3ViUGFuZShjb21wb3NpdGUsIDUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL05hbWVkUXVlcnlQcm9wZXJ0eTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Ml8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNTQzMjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvTmFtZWRRdWVyeVByb3BlcnR5Ml8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTmFtZWRRdWVyeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlF1ZXJ5SGludHNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcHFsLkpwYUpwcWxDb250ZW50UHJvcG9zYWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSdzIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCBRdWVyeTogICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IExvY2sgTW9kZTogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gUXVlcnkgSGludHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCBRdWVyeUhpbnRzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKgotICogQHNlZSBOYW1lZFF1ZXJ5Ml8wCi0gKiBAc2VlIE5hbWVkUXVlcmllc0NvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIFF1ZXJ5SGludHNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIE5hbWVkUXVlcnlQcm9wZXJ0eTJfMENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8TmFtZWRRdWVyeTJfMD4gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5OYW1lZFF1ZXJ5UHJvcGVydHkyXzBDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE5hbWVkUXVlcnlQcm9wZXJ0eTJfMENvbXBvc2l0ZShQYW5lPD8+IHBhcmVudFBhbmUsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlTW9kZWw8TmFtZWRRdWVyeTJfMD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTmFtZVRleHRIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkUXVlcnkyXzAsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5OQU1FX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE5hbWUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUXVlcnlIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE5hbWVkUXVlcnkyXzAsIFN0cmluZz4oZ2V0U3ViamVjdEhvbGRlcigpLCBRdWVyeS5RVUVSWV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnkoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFF1ZXJ5KHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gTmFtZSB3aWRnZXRzCi0JCXRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5OYW1lZFF1ZXJ5Q29tcG9zaXRlX25hbWVUZXh0TGFiZWwsCi0JCQl0aGlzLmJ1aWxkTmFtZVRleHRIb2xkZXIoKSk7Ci0KLQkJSnBhSnBxbENvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpwYUpwcWxDb250ZW50UHJvcG9zYWxQcm92aWRlcigKLQkJCWNvbnRhaW5lciwKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCWJ1aWxkUXVlcnlIb2xkZXIoKQotCQkpOwotCi0JCS8vIFF1ZXJ5IHRleHQgYXJlYQotCQlDb21wb3NpdGUgcXVlcnlXaWRnZXRzID0gdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuTmFtZWRRdWVyeVByb3BlcnR5Q29tcG9zaXRlX3F1ZXJ5LAotCQkJcHJvdmlkZXIuZ2V0U3R5bGVkVGV4dCgpCi0JCSk7Ci0KLQkJLy8gSW5zdGFsbCB0aGUgY29udGVudCBhc3Npc3QgaWNvbiBhdCB0aGUgdG9wIGxlZnQgb2YgdGhlIFN0eWxlZFRleHQuCi0JCS8vIE5vdGU6IEZvciBzb21lIHJlYXNvbiwgdGhpcyBuZWVkcyB0byBiZSBkb25lIGFmdGVyIHRoZSBTdHlsZWRUZXh0Ci0JCS8vICAgICAgIGlzIGFkZGVkIHRvIHRoZSBsYWJlbGVkIGNvbXBvc2l0ZQotCQlwcm92aWRlci5pbnN0YWxsQ29udHJvbERlY29yYXRpb24oKTsKLQotCQlhZGp1c3RNdWx0aUxpbmVUZXh0TGF5b3V0KAotCQkJcXVlcnlXaWRnZXRzLAotCQkJNCwKLQkJCXByb3ZpZGVyLmdldFN0eWxlZFRleHQoKSwKLQkJCXByb3ZpZGVyLmdldFN0eWxlZFRleHQoKS5nZXRMaW5lSGVpZ2h0KCkKLQkJKTsKLQotCQkvLyBMb2NrIE1vZGUgdHlwZQotCQluZXcgTG9ja01vZGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBRdWVyeSBIaW50cyBwYW5lCi0JCWNvbnRhaW5lciA9IHRoaXMuYWRkVGl0bGVkR3JvdXAoCi0JCQl0aGlzLmFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZV9xdWVyeUhpbnRzR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgUXVlcnlIaW50c0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PbmVUb01hbnlKb2luaW5nU3RyYXRlZ3kyXzBQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PbmVUb01hbnlKb2luaW5nU3RyYXRlZ3kyXzBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZTNjNmMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5NYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgaXMgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6ICAKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIEpvaW5pbmcgU3RyYXRlZ3kgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IG8gSm9pblRhYmxlU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUge0BsaW5rIE9uZVRvTWFueU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBPbmVUb01hbnlSZWxhdGlvbnNoaXB9Ci0gKiBAc2VlIHtAbGluayBPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlfQotICogQHNlZSB7QGxpbmsgTWFwcGVkQnlTdHJhdGVneVBhbmV9Ci0gKiBAc2VlIHtAbGluayBKb2luVGFibGVTdHJhdGVneVBhbmV9Ci0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4xCi0gKi8KLXB1YmxpYyBjbGFzcyBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3kyXzBQYW5lIAotCWV4dGVuZHMgUGFuZTxPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA+Ci17Ci0JcHVibGljIE9uZVRvTWFueUpvaW5pbmdTdHJhdGVneTJfMFBhbmUoCi0JCQlQYW5lPD8+IHBhcmVudFBhbmUsIAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX3RpdGxlLAotCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX21hcHBlZEJ5TGFiZWwsCi0JCQlNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBNYXBwZWRCeUpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQlidWlsZEpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lV2l0aEluY2x1ZGVPdmVycmlkZUNoZWNrQm94KHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfam9pblRhYmxlSm9pbmluZ0xhYmVsLAotCQkJSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZS5idWlsZFVzZXNKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBKb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRTdWJQYW5lKGNvbXBvc2l0ZSwgNSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PbmVUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmNzA1MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PbmVUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Kb2luVGFibGVKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5KcHRVaURldGFpbHNNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PbmVUb09uZU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlByaW1hcnlLZXlKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSBpcyB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZTogIAotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gSm9pbmluZyBTdHJhdGVneSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5UGFuZSBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IHwgbyBKb2luQ29sdW1uU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCB8IG8gSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyB8IHwKLSAqIHwgfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCBvIFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3lQYW5lIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18gfCB8Ci0gKiB8IHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAotICogfCB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IHwKLSAqIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIHtAbGluayBPbmVUb09uZU1hcHBpbmd9Ci0gKiBAc2VlIHtAbGluayBPbmVUb09uZVJlbGF0aW9uc2hpcH0KLSAqIEBzZWUge0BsaW5rIE9uZVRvT25lTWFwcGluZ0NvbXBvc2l0ZX0KLSAqIEBzZWUge0BsaW5rIE1hcHBlZEJ5U3RyYXRlZ3lQYW5lfQotICogQHNlZSB7QGxpbmsgSm9pbkNvbHVtblN0cmF0ZWd5UGFuZX0KLSAqIEBzZWUge0BsaW5rIFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3lQYW5lfQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMQotICovCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lIAotCWV4dGVuZHMgUGFuZTxPbmVUb09uZVJlbGF0aW9uc2hpcDJfMD4KLXsKLQlwdWJsaWMgT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQkJY29udGFpbmVyLAotCQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfdGl0bGUsCi0JCQkJbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19tYXBwZWRCeUxhYmVsLAotCQkJTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lLmJ1aWxkVXNlc01hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgTWFwcGVkQnlKb2luaW5nU3RyYXRlZ3lQYW5lKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCQotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbXBvc2l0ZSwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkpvaW5pbmdfcHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nTGFiZWwsCi0JCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzUHJpbWFyeUtleUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3lIb2xkZXIoZ2V0U3ViamVjdEhvbGRlcigpKSwKLQkJCW51bGwpOwotCi0JCW5ldyBQcmltYXJ5S2V5Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUodGhpcywgY29tcG9zaXRlKTsKLQkJCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29tcG9zaXRlLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuSm9pbmluZ19qb2luQ29sdW1uSm9pbmluZ0xhYmVsLAotCQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneUhvbGRlcihnZXRTdWJqZWN0SG9sZGVyKCkpLAotCQkJbnVsbCk7Ci0KLQkJSm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneVBhbmUuCi0JCQkJYnVpbGRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5UGFuZVdpdGhJbmNsdWRlT3ZlcnJpZGVDaGVja0JveCh0aGlzLCBjb21wb3NpdGUpOwotCQkKLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb21wb3NpdGUsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Kb2luaW5nX2pvaW5UYWJsZUpvaW5pbmdMYWJlbCwKLQkJCUpvaW5UYWJsZUpvaW5pbmdTdHJhdGVneVBhbmUuYnVpbGRVc2VzSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5SG9sZGVyKGdldFN1YmplY3RIb2xkZXIoKSksCi0JCQludWxsKTsKLQotCQluZXcgSm9pblRhYmxlSm9pbmluZ1N0cmF0ZWd5UGFuZSh0aGlzLCBjb21wb3NpdGUpOwotCi0JCWFkZFN1YlBhbmUoY29tcG9zaXRlLCA1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcmRlckNvbHVtbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT3JkZXJDb2x1bW5Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1MDlkNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcmRlckNvbHVtbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSnB0VWlEZXRhaWxzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmRiLkNvbHVtbkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IENvbHVtbkNvbWJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgPiBEZXRhaWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIHggSW5zZXJ0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgeCBVcGRhdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICB4IE51bGxhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICBDb2x1bW4gRGVmaW5pdGlvbjogfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgT3JkZXJDb2x1bW5Db21wb3NpdGUgZXh0ZW5kcyBQYW5lPE9yZGVyQ29sdW1uMl8wPiB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkNvbHVtbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SUNvbHVtbjwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIE9yZGVyQ29sdW1uQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgT3JkZXJDb2x1bW4yXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JfQotCi0KLQlwcml2YXRlIENvbHVtbkNvbWJvPE9yZGVyQ29sdW1uMl8wPiBhZGRDb2x1bW5Db21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDb2x1bW5Db21ibzxPcmRlckNvbHVtbjJfMD4odGhpcywgY29udGFpbmVyKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoTmFtZWRDb2x1bW4uREVGQVVMVF9OQU1FX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChOYW1lZENvbHVtbi5TUEVDSUZJRURfTkFNRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREZWZhdWx0TmFtZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWROYW1lKHZhbHVlKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVGFibGUgZ2V0RGJUYWJsZV8oKSB7Ci0JCQkJcmV0dXJuIGdldFN1YmplY3QoKS5nZXREYlRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE5hbWUoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk9yZGVyQ29sdW1uQ29tcG9zaXRlLmNvbHVtbkNvbWJvIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9yZGVyQ29sdW1uMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgTmFtZWRDb2x1bW4uQ09MVU1OX0RFRklOSVRJT05fUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENvbHVtbkRlZmluaXRpb24oKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0Q29sdW1uRGVmaW5pdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRJbnNlcnRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlckNvbHVtbjJfMCwgQm9vbGVhbj4oZ2V0U3ViamVjdEhvbGRlcigpLCBCYXNlQ29sdW1uLlNQRUNJRklFRF9JTlNFUlRBQkxFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFNwZWNpZmllZEluc2VydGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRJbnNlcnRhYmxlU3RyaW5nSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4oYnVpbGREZWZhdWx0SW5zZXJ0YWJsZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9pbnNlcnRhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0SW5zZXJ0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJDb2x1bW4yXzAsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfSU5TRVJUQUJMRV9QUk9QRVJUWSwKLQkJCUJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlckNvbHVtbjJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkTnVsbGFibGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROdWxsYWJsZVN0cmluZ0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuLCBTdHJpbmc+KGJ1aWxkRGVmYXVsdE51bGxhYmxlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlV2l0aERlZmF1bHQsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfbnVsbGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE51bGxhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlckNvbHVtbjJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlCYXNlQ29sdW1uLlNQRUNJRklFRF9OVUxMQUJMRV9QUk9QRVJUWSwKLQkJCUJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE51bGxhYmxlKCkgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnN1YmplY3QuaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVXBkYXRhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlckNvbHVtbjJfMCwgQm9vbGVhbj4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlCYXNlQ29sdW1uLkRFRkFVTFRfVVBEQVRBQkxFX1BST1BFUlRZLAotCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkVXBkYXRhYmxlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXBkYXRhYmxlU3RyaW5nSG9sZGVyKCkgewotCi0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRVcGRhdGFibGVIb2xkZXIoKSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlID0gdmFsdWUuYm9vbGVhblZhbHVlKCkgPyBKcHRDb21tb25VaU1lc3NhZ2VzLkJvb2xlYW5fVHJ1ZSA6IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9GYWxzZTsKLQkJCQkJcmV0dXJuIE5MUy5iaW5kKEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGVXaXRoRGVmYXVsdCwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV91cGRhdGFibGU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdFVwZGF0YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JkZXJDb2x1bW4yXzAsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJQmFzZUNvbHVtbi5TUEVDSUZJRURfVVBEQVRBQkxFX1BST1BFUlRZLAotCQkJQmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRV9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZFVwZGF0YWJsZSgpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gQ29sdW1uIHdpZGdldHMKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLkNvbHVtbkNvbXBvc2l0ZV9uYW1lLAotCQkJYWRkQ29sdW1uQ29tYm8oY29udGFpbmVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQ09MVU1OX09SREVSSU5HX0NPTFVNTgotCQkpOwotCi0JCS8vIERldGFpbHMgc3ViLXBhbmUKLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTdWJTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX2RldGFpbHMsCi0JCQluZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KEJvb2xlYW4uRkFMU0UpCi0JCSk7Ci0KLQkJbmV3IERldGFpbHNDb21wb3NpdGUodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgMTYpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGV0YWlsc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8T3JkZXJDb2x1bW4yXzA+IHsKLQkJCQkKLQkJcHVibGljIERldGFpbHNDb21wb3NpdGUoUGFuZTw/PiBwYXJlbnRQYW5lLAotICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcmRlckNvbHVtbjJfMD4gc3ViamVjdEhvbGRlciwKLSAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBmYWxzZSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJCS8vIEluc2VydGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfaW5zZXJ0YWJsZSwKLQkJCQlidWlsZEluc2VydGFibGVIb2xkZXIoKSwKLQkJCQlidWlsZEluc2VydGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9JTlNFUlRBQkxFCi0JCQkpOwotCi0JCQkvLyBVcGRhdGFibGUgdHJpLXN0YXRlIGNoZWNrIGJveAotCQkJYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfdXBkYXRhYmxlLAotCQkJCWJ1aWxkVXBkYXRhYmxlSG9sZGVyKCksCi0JCQkJYnVpbGRVcGRhdGFibGVTdHJpbmdIb2xkZXIoKSwKLQkJCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX0NPTFVNTl9VUERBVEFCTEUKLQkJCSk7Ci0KLQkJCS8vIE51bGxhYmxlIHRyaS1zdGF0ZSBjaGVjayBib3gKLQkJCWFkZFRyaVN0YXRlQ2hlY2tCb3hXaXRoRGVmYXVsdCgKLQkJCQljb250YWluZXIsCi0JCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuQ29sdW1uQ29tcG9zaXRlX251bGxhYmxlLAotCQkJCWJ1aWxkTnVsbGFibGVIb2xkZXIoKSwKLQkJCQlidWlsZE51bGxhYmxlU3RyaW5nSG9sZGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19DT0xVTU5fTlVMTEFCTEUKLQkJCSk7Ci0KLQkJCS8vIENvbHVtbiBEZWZpbml0aW9uIHdpZGdldHMKLQkJCWFkZExhYmVsZWRUZXh0KAotCQkJCWNvbnRhaW5lciwKLQkJCQlKcHRVaURldGFpbHNNZXNzYWdlcy5Db2x1bW5Db21wb3NpdGVfY29sdW1uRGVmaW5pdGlvbiwKLQkJCQlidWlsZENvbHVtbkRlZmluaXRpb25Ib2xkZXIoKQotCQkJKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcmRlcmluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT3JkZXJpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1YjJjNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcmRlcmluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5QYW5lRW5hYmxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbGxlY3Rpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9yZGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T3JkZXJpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8IC0gT3JkZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBvIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IG8gUHJpbWFyeSBLZXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgbyBDdXN0b20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHwKLSAqIHwgfCAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCB8Ci0gKiB8IHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBDb2xsZWN0aW9uTWFwcGluZwotICogQHNlZSBPcm1NYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZSAtIEEgY29udGFpbmVyIG9mIHRoaXMgcGFuZQotICogQHNlZSBPcm1PbmVUb01hbnlNYXBwaW5nQ29tcG9zaXRlIC0gQSBjb250YWluZXIgb2YgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlcmluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0T3JkZXJpbmdDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9yZGVyaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcmRlcmluZzJfMENvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBDb2xsZWN0aW9uTWFwcGluZz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IG9yZGVyYWJsZUhvbGRlciA9IGJ1aWxkT3JkZXJhYmxlSG9sZGVyKCk7Ci0KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3JkZXJpbmdDb21wb3NpdGVfb3JkZXJpbmdHcm91cAotCQkpOwotCi0JCS8vIE5vIE9yZGVyaW5nIHJhZGlvIGJ1dHRvbgotCQlhZGRSYWRpb0J1dHRvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLk9yZGVyaW5nQ29tcG9zaXRlX25vbmUsCi0JCQlidWlsZE5vT3JkZXJpbmdIb2xkZXIob3JkZXJhYmxlSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfTk9fT1JERVJJTkcKLQkJKTsKLQotCQkvLyBPcmRlciBieSBQcmltYXJ5IEtleSByYWRpbyBidXR0b24KLQkJYWRkUmFkaW9CdXR0b24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaURldGFpbHNNZXNzYWdlcy5PcmRlcmluZ0NvbXBvc2l0ZV9wcmltYXJ5S2V5LAotCQkJYnVpbGRQcmltYXJ5S2V5T3JkZXJpbmdIb2xkZXIob3JkZXJhYmxlSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQllfUFJJTUFSWV9LRVlfT1JERVJJTkcKLQkJKTsKLQotCQkvLyBDdXN0b20gT3JkZXJpbmcgcmFkaW8gYnV0dG9uCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMuT3JkZXJpbmdDb21wb3NpdGVfY3VzdG9tLAotCQkJYnVpbGRDdXN0b21PcmRlcmluZ0hvbGRlcihvcmRlcmFibGVIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWV9DVVNUT01fT1JERVJJTkcKLQkJKTsKLQotCQkvLyBDdXN0b20gT3JkZXJpbmcgdGV4dCBmaWVsZAotCQlhZGRUZXh0KAotCQkJYWRkU3ViUGFuZShjb250YWluZXIsIDAsIDE2KSwKLQkJCWJ1aWxkU3BlY2lmaWVkT3JkZXJCeUhvbGRlcihvcmRlcmFibGVIb2xkZXIpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19PUkRFUl9CWSwKLQkJCWJ1aWxkQ3VzdG9tT3JkZXJpbmdIb2xkZXIob3JkZXJhYmxlSG9sZGVyKQotCQkpOwotCi0JCQotCQkvLyBPcmRlciBDb2x1bW4gT3JkZXJpbmcgcmFkaW8gYnV0dG9uCi0JCWFkZFJhZGlvQnV0dG9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuT3JkZXJpbmdDb21wb3NpdGVfb3JkZXJDb2x1bW4sCi0JCQlidWlsZE9yZGVyQ29sdW1uT3JkZXJpbmdIb2xkZXIob3JkZXJhYmxlSG9sZGVyKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLk1BUFBJTkdfT1JERVJfQ09MVU1OX09SREVSSU5HCi0JCSk7Ci0KLQkJT3JkZXJDb2x1bW5Db21wb3NpdGUgb3JkZXJDb2x1bW5Db21wb3NpdGUgPSBuZXcgT3JkZXJDb2x1bW5Db21wb3NpdGUoCi0JCQl0aGlzLAotCQkJYnVpbGRPcmRlckNvbHVtbkhvbGRlcihvcmRlcmFibGVIb2xkZXIpLCAKLQkJCWFkZFN1YlBhbmUoY29udGFpbmVyLCAwLCAxNikpOwotCi0JCWluc3RhbGxPcmRlckNvbHVtbkNvbXBvc2l0ZUVuYWJsZXIob3JkZXJhYmxlSG9sZGVyLCBvcmRlckNvbHVtbkNvbXBvc2l0ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluc3RhbGxPcmRlckNvbHVtbkNvbXBvc2l0ZUVuYWJsZXIoUHJvcGVydHlWYWx1ZU1vZGVsPE9yZGVyYWJsZT4gb3JkZXJhYmxlSG9sZGVyLCBPcmRlckNvbHVtbkNvbXBvc2l0ZSBwYW5lKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKG9yZGVyYWJsZUhvbGRlciksIHBhbmUpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IG9yZGVyYWJsZUhvbGRlcikgewotCQlyZXR1cm4gYnVpbGRPcmRlckNvbHVtbk9yZGVyaW5nSG9sZGVyKG9yZGVyYWJsZUhvbGRlcik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRPcmRlckNvbHVtbk9yZGVyaW5nSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IG9yZGVyYWJsZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlcmFibGUsIEJvb2xlYW4+KG9yZGVyYWJsZUhvbGRlciwgT3JkZXJhYmxlMl8wLk9SREVSX0NPTFVNTl9PUkRFUklOR19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKCgoT3JkZXJhYmxlMl8wKSB0aGlzLnN1YmplY3QpLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiB2YWx1ZSkgewotCQkJCSgoT3JkZXJhYmxlMl8wKSB0aGlzLnN1YmplY3QpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodmFsdWUuYm9vbGVhblZhbHVlKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9yZGVyQ29sdW1uMl8wPiBidWlsZE9yZGVyQ29sdW1uSG9sZGVyKFByb3BlcnR5VmFsdWVNb2RlbDxPcmRlcmFibGU+IG9yZGVyYWJsZUhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPcmRlcmFibGUsIE9yZGVyQ29sdW1uMl8wPihvcmRlcmFibGVIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9yZGVyQ29sdW1uMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9yZGVyYWJsZTJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcmRlckNvbHVtbigpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxODQ1ZDcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFtYXSAgT3JwaGFuIHJlbW92YWwgKHRydWUvZmFsc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSB7QGxpbmsgT3JwaGFuUmVtb3ZhYmxlMl8wfQotICogQHNlZSB7QGxpbmsgSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZX0gLSBBIGNvbnRhaW5lciBvZiB0aGlzIHdpZGdldAotICogQHNlZSB7QGxpbmsgT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlfSAtIEEgY29udGFpbmVyIG9mIHRoaXMgd2lkZ2V0Ci0gKi8KLXB1YmxpYyBjbGFzcyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxPcnBoYW5SZW1vdmFibGUyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKAotCQkJCQkJCVBhbmU8PyBleHRlbmRzIFJlbGF0aW9uc2hpcE1hcHBpbmc+IHBhcmVudFBhbmUsCi0JCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPcnBoYW5SZW1vdmFibGUyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWwsCi0JCQl0aGlzLmJ1aWxkT3JwaGFuUmVtb3ZhbEhvbGRlcigpLAotCQkJdGhpcy5idWlsZE9ycGhhblJlbW92YWxTdHJpbmdIb2xkZXIoKSwKLQkJCW51bGwJCS8vIFRPRE8KLQkJKTsKLQl9Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE9ycGhhblJlbW92YWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ycGhhblJlbW92YWJsZTJfMCwgQm9vbGVhbj4oCi0JCQkJdGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIAotCQkJCU9ycGhhblJlbW92YWJsZTJfMC5ERUZBVUxUX09SUEhBTl9SRU1PVkFMX1BST1BFUlRZLAotCQkJCU9ycGhhblJlbW92YWJsZTJfMC5TUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE9ycGhhblJlbW92YWxTdHJpbmdIb2xkZXIoKSB7Ci0JCQotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIFN0cmluZz4odGhpcy5idWlsZERlZmF1bHRPcnBoYW5SZW1vdmFsSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWxEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlEZXRhaWxzTWVzc2FnZXMyXzAuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZV9vcnBoYW5SZW1vdmFsTGFiZWw7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkRGVmYXVsdE9ycGhhblJlbW92YWxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9ycGhhblJlbW92YWJsZTJfMCwgQm9vbGVhbj4oCi0JCQl0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwKLQkJCU9ycGhhblJlbW92YWJsZTJfMC5TUEVDSUZJRURfT1JQSEFOX1JFTU9WQUxfUFJPUEVSVFksCi0JCQlPcnBoYW5SZW1vdmFibGUyXzAuREVGQVVMVF9PUlBIQU5fUkVNT1ZBTF9QUk9QRVJUWSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlpZiAodGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHRoaXMuc3ViamVjdC5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL1F1ZXJpZXMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL1F1ZXJpZXMyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlYWQwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9RdWVyaWVzMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTmFtZWRRdWVyeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLQotLyoqCi0gKiAgUXVlcmllczJfMENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgUXVlcmllczJfMENvbXBvc2l0ZQotCWV4dGVuZHMgUXVlcmllc0NvbXBvc2l0ZQotewotCXB1YmxpYyBRdWVyaWVzMl8wQ29tcG9zaXRlKAotCQkJUGFuZTw/PiBwYXJlbnRQYW5lLCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUXVlcnlDb250YWluZXI+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGFuZTxOYW1lZFF1ZXJ5Ml8wPiBidWlsZE5hbWVkUXVlcnlQcm9wZXJ0eUNvbXBvc2l0ZShQYWdlQm9vayBwYWdlQm9vaykgewotCQlyZXR1cm4gbmV3IE5hbWVkUXVlcnlQcm9wZXJ0eTJfMENvbXBvc2l0ZSgKLQkJCXRoaXMsCi0JCQl0aGlzLmJ1aWxkTmFtZWRRdWVyeTJfMEhvbGRlcigpLAotCQkJcGFnZUJvb2spOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE5hbWVkUXVlcnkyXzA+IGJ1aWxkTmFtZWRRdWVyeTJfMEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxRdWVyeSwgTmFtZWRRdWVyeTJfMD4odGhpcy5nZXRRdWVyeUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBOYW1lZFF1ZXJ5Ml8wIHRyYW5zZm9ybV8oUXVlcnkgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgTmFtZWRRdWVyeTJfMCkgPyAoTmFtZWRRdWVyeTJfMCkgdmFsdWUgOiBudWxsOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJhOTJkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9TZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlsczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkpwdFVpRGV0YWlsc01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5TZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuZGIuQ2F0YWxvZ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5kYi5TY2hlbWFDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEphdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUgZXh0ZW5kcyBTZXF1ZW5jZUdlbmVyYXRvckNvbXBvc2l0ZQotewotCi0JcHVibGljIFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlKFBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlHZW5lcmF0b3JCdWlsZGVyPFNlcXVlbmNlR2VuZXJhdG9yPiBidWlsZGVyKSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgc3ViamVjdEhvbGRlciwgcGFyZW50LCBidWlsZGVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQkvLyBOYW1lIHdpZGdldHMKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX25hbWUsCi0JCQl0aGlzLmJ1aWxkR2VuZXJhdG9yTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfTkFNRQotCQkpOwotCi0JCS8vIFNlcXVlbmNlIEdlbmVyYXRvciB3aWRnZXRzCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NlcXVlbmNlLAotCQkJdGhpcy5idWlsZFNlcXVlbmNlTmFtZUNvbWJvKGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9TRVFVRU5DRQotCQkpOwotCi0JCS8vIFNjaGVtYSB3aWRnZXRzCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX3NjaGVtYSwKLQkJCXRoaXMuYWRkU2NoZW1hQ29tYm8oY29udGFpbmVyKSwKLQkJCW51bGwJLy8gSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19TRVFVRU5DRV9HRU5FUkFUT1JfU0NIRU1BCi0JCSk7Ci0KLQkJLy8gQ2F0YWxvZyB3aWRnZXRzCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpRGV0YWlsc01lc3NhZ2VzLlNlcXVlbmNlR2VuZXJhdG9yQ29tcG9zaXRlX2NhdGFsb2csCi0JCQl0aGlzLmFkZENhdGFsb2dDb21ibyhjb250YWluZXIpLAotCQkJbnVsbAkvLyBKcGFIZWxwQ29udGV4dElkcy5NQVBQSU5HX1NFUVVFTkNFX0dFTkVSQVRPUl9DQVRBTE9HCi0JCSk7Ci0KLQkJdGhpcy5hZGRBbGxvY2F0aW9uU2l6ZUNvbWJvKGNvbnRhaW5lcik7Ci0JCXRoaXMuYWRkSW5pdGlhbFZhbHVlQ29tYm8oY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIFNjaGVtYUNvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPiBhZGRTY2hlbWFDb21ibyhDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBTY2hlbWFDb21ibzxTZXF1ZW5jZUdlbmVyYXRvcj4odGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpIHsKLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMC5ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IyXzAuU1BFQ0lGSUVEX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IyXzAuREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChTZXF1ZW5jZUdlbmVyYXRvcjJfMC5TUEVDSUZJRURfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlpZiAocHJvcGVydHlOYW1lID09IFNlcXVlbmNlR2VuZXJhdG9yMl8wLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWQotCQkJCQl8fCBwcm9wZXJ0eU5hbWUgPT0gU2VxdWVuY2VHZW5lcmF0b3IyXzAuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkgKSB7Ci0JCQkJCXJlcG9wdWxhdGVDb21ib0JveCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKHByb3BlcnR5TmFtZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiAoKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRTdWJqZWN0KCkpLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBudWxsU3ViamVjdElzQWxsb3dlZCgpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBzdWJqZWN0IG1heSBiZSBudWxsLCBzbyBkZWxlZ2F0ZSB0byB0aGUgY29tcG9zaXRlCi0JCQkgKi8KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUudGhpcy5nZXRKcGFQcm9qZWN0KCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7Ci0JCQkJKChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgU2VxdWVuY2VHZW5lcmF0b3IyXzBDb21wb3NpdGUudGhpcy5yZXRyaWV2ZUdlbmVyYXRvcigpKS5zZXRTcGVjaWZpZWRTY2hlbWEodmFsdWUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuICgoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldFN1YmplY3QoKSkuZ2V0U3BlY2lmaWVkU2NoZW1hKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcigpIHsKLQkJCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCB0ZyA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCQkJaWYgKHRnICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRnLmdldERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCQkJfQotCQkJCXJldHVybiBTZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZS50aGlzLmdldFN1YmplY3QoKS5nZXRDb250ZXh0RGVmYXVsdERiU2NoZW1hQ29udGFpbmVyKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFNjaGVtYUNvbnRhaW5lciBnZXREYlNjaGVtYUNvbnRhaW5lcl8oKSB7Ci0JCQkJLy8gd2Ugb3ZlcnJvZGUgI2dldERiU2NoZW1hQ29udGFpbmVyKCkgaW5zdGVhZAotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ2F0YWxvZ0NvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPiBhZGRDYXRhbG9nQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgQ2F0YWxvZ0NvbWJvPFNlcXVlbmNlR2VuZXJhdG9yPih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFNlcXVlbmNlR2VuZXJhdG9yMl8wLkRFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoU2VxdWVuY2VHZW5lcmF0b3IyXzAuU1BFQ0lGSUVEX0NBVEFMT0dfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiAoKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRTdWJqZWN0KCkpLmdldERlZmF1bHRDYXRhbG9nKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gbnVsbFN1YmplY3RJc0FsbG93ZWQoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8qKgotCQkJICogc3ViamVjdCBtYXkgYmUgbnVsbCwgc28gZGVsZWdhdGUgdG8gdGhlIGNvbXBvc2l0ZQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCQkJcmV0dXJuIFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLnRoaXMuZ2V0SnBhUHJvamVjdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgewotCQkJCSgoU2VxdWVuY2VHZW5lcmF0b3IyXzApIFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlLnRoaXMucmV0cmlldmVHZW5lcmF0b3IoKSkuc2V0U3BlY2lmaWVkQ2F0YWxvZyh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gKChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgZ2V0U3ViamVjdCgpKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvVGFyZ2V0Q2xhc3NDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL1RhcmdldENsYXNzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjY5YmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvVGFyZ2V0Q2xhc3NDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5DbGFzc0Nob29zZXJDb21ib1BhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIHRhcmdldCBlbnRpdHkgaHlwZXJsaW5rIGxhYmVsLCBjb21ibyBhbmQgYnJvd3NlIGJ1dHRvbiAKLSAqLwotcHVibGljIGNsYXNzIFRhcmdldENsYXNzQ29tcG9zaXRlIGV4dGVuZHMgQ2xhc3NDaG9vc2VyQ29tYm9QYW5lPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KLXsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VGFyZ2V0RW50aXR5Q29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBUYXJnZXRDbGFzc0NvbXBvc2l0ZSgKLQkJCQkJCQkJUGFuZTw/IGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFRhcmdldENsYXNzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q2xhc3NOYW1lKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoY2xhc3NOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgY2hhciBnZXRFbmNsb3NpbmdUeXBlU2VwYXJhdG9yKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFRhcmdldENsYXNzRW5jbG9zaW5nVHlwZVNlcGFyYXRvcigpOwotCX0KLQkKLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldExhYmVsVGV4dCgpIHsKLSAgICAJcmV0dXJuIEpwdFVpRGV0YWlsc01lc3NhZ2VzMl8wLlRhcmdldENsYXNzQ29tcG9zaXRlX2xhYmVsOwotICAgIH0KLSAgIAotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGVscElkKCkgewotICAgIAlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuTUFQUElOR19FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTOwotICAgIH0KLSAgIAotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElUeXBlIHJlc29sdmVKZHRUeXBlKCkgewotCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFRhcmdldENsYXNzSmR0VHlwZSgpOwotCX0KLQotICAgIEBPdmVycmlkZQotCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuU1BFQ0lGSUVEX1RBUkdFVF9DTEFTU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCi0JCQkJU3RyaW5nIG5hbWUgPSB0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKTsKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBUYXJnZXRDbGFzc0NvbXBvc2l0ZS50aGlzLmdldERlZmF1bHRWYWx1ZSh0aGlzLnN1YmplY3QpOwotCQkJCX0KLQkJCQlyZXR1cm4gbmFtZTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0KLQkJCQlpZiAoZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCkuZXF1YWxzKHZhbHVlKSkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0gICAgfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRDbGFzc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiB0aGlzLmJ1aWxkRGVmYXVsdFByb2ZpbGVyTGlzdEhvbGRlcigpOwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlZmF1bHRQcm9maWxlckxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCXRoaXMuYnVpbGREZWZhdWx0UHJvZmlsZXJIb2xkZXIoKQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0UHJvZmlsZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLkRFRkFVTFRfVEFSR0VUX0NMQVNTX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIFRhcmdldENsYXNzQ29tcG9zaXRlLnRoaXMuZ2V0RGVmYXVsdFZhbHVlKHRoaXMuc3ViamVjdCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBzdWJqZWN0KSB7Ci0JCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBzdWJqZWN0LmdldERlZmF1bHRUYXJnZXRDbGFzcygpOwotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIE5MUy5iaW5kKAotCQkJCUpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdFdpdGhPbmVQYXJhbSwKLQkJCQlkZWZhdWx0VmFsdWUKLQkJCSk7Ci0JCX0KLQkJcmV0dXJuIEpwdENvbW1vblVpTWVzc2FnZXMuRGVmYXVsdEVtcHR5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0dlbmVyaWMyXzBKYXZhUmVzb3VyY2VVaURlZmluaXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDk2NDk4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuRGVmYXVsdEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkFic3RyYWN0SmF2YVJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkRlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuRGVmYXVsdEVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhQmFzaWNNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRhYmxlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhSWRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5OdWxsSmF2YUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RKYXZhUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBHZW5lcmljMl8wSmF2YVJlc291cmNlVWlEZWZpbml0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgR2VuZXJpYzJfMEphdmFSZXNvdXJjZVVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFVaUZhY3RvcnkgYnVpbGRKYXZhVWlGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWMyXzBKYXZhVWlGYWN0b3J5KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4+IGRlZmluaXRpb25zKSB7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUlkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFFbWJlZGRlZElkTWFwcGluZ1VEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFWZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYW55VG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU9uZVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChKYXZhT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFUcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjw/Pj4gZGVmaW5pdGlvbnMpIHsKLQkJZGVmaW5pdGlvbnMuYWRkKERlZmF1bHRCYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChEZWZhdWx0RW1iZWRkZWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoTnVsbEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpZWRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PEphdmFUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVudGl0eVVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKEphdmFNYXBwZWRTdXBlcmNsYXNzVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoSmF2YUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9HZW5lcmljMl8wSmF2YVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTFjMzdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvR2VuZXJpYzJfMEphdmFVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuQmFzZUphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5HZW5lcmljUGVyc2lzdGVuY2VYbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGEyLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVUkgZmFjdG9yeSByZXF1aXJlZCB0byBzaG93IHRoZSBpbmZvcm1hdGlvbgotICogcmVsYXRlZCB0byBhIEpQQSBtYXBwaW5nICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0gKgotICogQHNlZSBHZW5lcmljUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKYXZhVWlGYWN0b3J5Ci0JZXh0ZW5kcyBCYXNlSmF2YVVpRmFjdG9yeQotCWltcGxlbWVudHMgSmF2YVVpRmFjdG9yeTJfMAotewotCS8vICoqKioqKioqKioqKioqKiogamF2YSB0eXBlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGNyZWF0ZUphdmFNYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFNYXBwZWRTdXBlcmNsYXNzPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YU1hcHBlZFN1cGVyY2xhc3MyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhRW50aXR5Q29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbnRpdHk+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRW50aXR5Ml8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGFibGVDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YUVtYmVkZGFibGU+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LCBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhRW1iZWRkYWJsZTJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIGphdmEgYXR0cmlidXRlIG1hcHBpbmcgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YUlkTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbWJlZGRlZElkTWFwcGluZz4gc3ViamVjdEhvbGRlciwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRW1iZWRkZWRNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEphdmFFbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhTWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLCAKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsIAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU1hbnlUb09uZU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhTWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YU9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SmF2YU9uZVRvTWFueU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCXJldHVybiBuZXcgSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBjcmVhdGVKYXZhT25lVG9PbmVNYXBwaW5nQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJcmV0dXJuIG5ldyBKYXZhT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gbmV3IEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZjVhN2UuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5qYXZhLkphdmFVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGEyLmRldGFpbHMuamF2YS5KYXZhVWlGYWN0b3J5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMD4KLQlpbXBsZW1lbnRzIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IAotCQkJbmV3IEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuc3VyZSBzaW5nbGUgaW5zdGFuY2UuCi0JICovCi0JcHJpdmF0ZSBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCUphdmFVaUZhY3RvcnkgZmFjdG9yeSwKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuICgoSmF2YVVpRmFjdG9yeTJfMCkgZmFjdG9yeSkuY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGUyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGFibGUyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmYWUyOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFFbWJlZGRhYmxlMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGlzIHBhbmUgZG9lcyBub3QgaGF2ZSBhbnkgd2lkZ2V0cy4KLSAqCi0gKiBAc2VlIEVtYmVkZGFibGUKLSAqIEBzZWUgRW1iZWRkYWJsZVVpUHJvdmlkZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFFbWJlZGRhYmxlMl8wQ29tcG9zaXRlIGV4dGVuZHMgQWJzdHJhY3RFbWJlZGRhYmxlQ29tcG9zaXRlPEphdmFFbWJlZGRhYmxlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGFibGVDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVtYmVkZGFibGUyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhRW1iZWRkYWJsZT4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCXRoaXMuaW5pdGlhbGl6ZUVtYmVkZGFibGVDb2xsYXBzaWJsZVNlY3Rpb24oY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkYWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlcigpLCBjb250YWluZXIpOwkKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphdmFFbWJlZGRhYmxlLCBBY2Nlc3NIb2xkZXI+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTNjYzAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdEVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEVtYmVkZGVkQXR0cmlidXRlT3ZlcnJpZGVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIEVtYmVkZGVkTWFwcGluZwotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZSBleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPEphdmFFbWJlZGRlZE1hcHBpbmc+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbWJlZGRlZE1hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5FbWJlZGRlZE1hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUVudGl0eTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMTJlYmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhRW50aXR5Ml8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbnRpdHlOYW1lQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuamF2YS5KYXZhSW5oZXJpdGFuY2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLmphdmEuSmF2YVNlY29uZGFyeVRhYmxlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYWNoZWFibGUyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVudGl0eTJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhIEphdmEgZW50aXR5LgotICoKLSAqIEBzZWUgSmF2YUVudGl0eQotICogQHNlZSBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhRW50aXR5Ml8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVudGl0eUNvbXBvc2l0ZTxKYXZhRW50aXR5PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SmF2YUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkphdmFFbnRpdHk8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgSmF2YUVudGl0eTJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgSmF2YUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhY2hlYWJsZTJfMFBhbmUodGhpcywgYnVpbGRDYWNoZWFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZWFibGUyXzA+IGJ1aWxkQ2FjaGVhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhRW50aXR5LCBDYWNoZWFibGUyXzA+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRDYWNoZWFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplU2Vjb25kYXJ5VGFibGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhU2Vjb25kYXJ5VGFibGVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUluaGVyaXRhbmNlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBKYXZhSW5oZXJpdGFuY2VDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBxdWVyeUNvbnRhaW5lckhvbGRlcikgewotCQluZXcgUXVlcmllczJfMENvbXBvc2l0ZSh0aGlzLCBxdWVyeUNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUlkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWIzNjdmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YUlkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5Db2x1bW5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLklkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YUlkTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU8SWRNYXBwaW5nPgotewotCXB1YmxpYyBKYXZhSWRNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRpb25Db2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTgyMjA5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0TWFueVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9yZGVyaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFNYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxKYXZhTWFueVRvTWFueU1hcHBpbmcsIEphdmFNYW55VG9NYW55UmVsYXRpb25zaGlwPgotewotCXB1YmxpYyBKYXZhTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgYnVpbGRDYXNjYWRlSG9sZGVyKCksIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhMWU2OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuT3B0aW9uYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5BYnN0cmFjdE1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxKYXZhTWFueVRvT25lTWFwcGluZywgSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMD4KLXsKLQlwdWJsaWMgSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEphdmFNYW55VG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU1hbnlUb09uZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMFBhbmUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBQYW5lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYzVlYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZzJfMFBhbmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvT25lTWFwcGluZzJfMFBhbmUKLXt9CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjIwMmEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuSWRDbGFzc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWNjZXNzVHlwZUNvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IElkQ2xhc3NDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSB2IFF1ZXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBRdWVyaWVzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBNYXBwZWRTdXBlcmNsYXNzCi0gKiBAc2VlIEdlbmVyaWMyXzBKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKiBAc2VlIEFjY2Vzc1R5cGVDb21wb3NpdGUKLSAqIEBzZWUgSWRDbGFzc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi0KLXB1YmxpYyBjbGFzcyBKYXZhTWFwcGVkU3VwZXJjbGFzczJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RKYXZhTWFwcGVkU3VwZXJjbGFzc0NvbXBvc2l0ZQotICAgIGltcGxlbWVudHMgSnBhQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5NYXBwZWRTdXBlcmNsYXNzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhTWFwcGVkU3VwZXJjbGFzcz4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYXBwZWRTdXBlcmNsYXNzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7CQotCQluZXcgSWRDbGFzc0NvbXBvc2l0ZSh0aGlzLCBidWlsZElkQ2xhc3NSZWZlcmVuY2VIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhTWFwcGVkU3VwZXJjbGFzcywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRUeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5NDY4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0T25lVG9NYW55TWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcmRlcmluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEphdmFPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8SmF2YU9uZVRvTWFueU1hcHBpbmcsIEphdmFPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA+Ci17Ci0JcHVibGljIEphdmFPbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhT25lVG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPbmVUb01hbnlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgRmV0Y2hUeXBlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlKHRoaXMsIHRoaXMuYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIHRoaXMuYnVpbGRDYXNjYWRlSG9sZGVyKCksIHRoaXMuYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPbmVUb01hbnlKb2luaW5nU3RyYXRlZ3kyXzBQYW5lKHRoaXMsIHRoaXMuYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9yZGVyaW5nQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9yZGVyaW5nMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKYXZhT25lVG9NYW55TWFwcGluZywgT3JwaGFuUmVtb3ZhYmxlMl8wPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT3JwaGFuUmVtb3ZhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHRoaXMuc3ViamVjdCkuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL2phdmEvSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzg5NzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FzY2FkZVBhbmUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT25lVG9PbmVKb2luaW5nU3RyYXRlZ3kyXzBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9ycGhhblJlbW92YWwyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8SmF2YU9uZVRvT25lTWFwcGluZywgSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wPgotewotCXB1YmxpYyBKYXZhT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKYXZhT25lVG9PbmVNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUpvaW5pbmdTdHJhdGVneUNvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPbmVUb09uZUpvaW5pbmdTdHJhdGVneTJfMFBhbmUodGhpcywgYnVpbGRKb2luaW5nSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8T3JwaGFuUmVtb3ZhYmxlMl8wPiBidWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmF2YU9uZVRvT25lTWFwcGluZywgT3JwaGFuUmVtb3ZhYmxlMl8wPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiZWMyMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eU1hcHBpbmdzRGV0YWlsc1BhZ2UKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1BhZ2U8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUGFnZShDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYXRvcnNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVF1ZXJpZXNDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtUXVlcmllczJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzMl8wRGV0YWlsc1Byb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4YTllNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0RW50aXR5TWFwcGluZ3NEZXRhaWxzUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFEZXRhaWxzUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgRW50aXR5TWFwcGluZ3MyXzBEZXRhaWxzUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhRGV0YWlsc1Byb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvdmlkZXNEZXRhaWxzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIHJlc291cmNlVHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzJfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYURldGFpbHNQYWdlPEVudGl0eU1hcHBpbmdzPiBidWlsZERldGFpbHNQYWdlKAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIG5ldyBFbnRpdHlNYXBwaW5nczJfMERldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL0VudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTMwMTlhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuR2VuZXJhdG9yQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5HZW5lcmF0b3JDb21wb3NpdGUuR2VuZXJhdG9yQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkVudGl0eU1hcHBpbmdzR2VuZXJhdG9yc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5TZXF1ZW5jZUdlbmVyYXRvcjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzMl8wQ29tcG9zaXRlIGV4dGVuZHMgRW50aXR5TWFwcGluZ3NHZW5lcmF0b3JzQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FbnRpdHlNYXBwaW5nc0dlbmVyYXRvcnMyXzBDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEVudGl0eU1hcHBpbmdzR2VuZXJhdG9yczJfMENvbXBvc2l0ZSgKLQkJCQkJCVBhbmU8PyBleHRlbmRzIEVudGl0eU1hcHBpbmdzPiBwYXJlbnRQYW5lLAotCQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCQotCQlzdXBlcihwYXJlbnRQYW5lLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBHZW5lcmF0b3JDb21wb3NpdGU8U2VxdWVuY2VHZW5lcmF0b3I+IGJ1aWxkU2VxdWVuY2VHZW5lcmF0b3JDb21wb3NpdGUoCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFNlcXVlbmNlR2VuZXJhdG9yPiBzZXF1ZW5jZUdlbmVyYXRvckhvbGRlciwKLQkJCUdlbmVyYXRvckJ1aWxkZXI8U2VxdWVuY2VHZW5lcmF0b3I+IGdlbmVyYXRvckJ1aWxkZXIpIHsKLQotCQlyZXR1cm4gbmV3IFNlcXVlbmNlR2VuZXJhdG9yMl8wQ29tcG9zaXRlKAotCQkJdGhpcywKLQkJCXNlcXVlbmNlR2VuZXJhdG9ySG9sZGVyLAotCQkJcGFyZW50LAotCQkJZ2VuZXJhdG9yQnVpbGRlcgotCQkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtQmFzaWNNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTcwYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUJhc2ljTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RCYXNpY01hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGUgZXh0ZW5kcyBBYnN0cmFjdEJhc2ljTWFwcGluZ0NvbXBvc2l0ZTxCYXNpY01hcHBpbmc+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5FY2xpcHNlTGluazFfMU9ybUJhc2ljTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkJhc2ljTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1CYXNpY01hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBCYXNpY01hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUJhc2ljU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGFkZFN1YlBhbmUoY29udGFpbmVyLCA0KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8QmFzaWNNYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYmE3YmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ29sbGVjdGlvblRhYmxlMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLlRhcmdldENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBDb21wb3NpdGU8RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmsxXzFPcm1CYXNpY01hcHBpbmdDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgc3ViamVjdCA8Y29kZT5CYXNpY01hcHBpbmc8L2NvZGU+Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbGVtZW50Q29sbGVjdGlvblNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0Q2xhc3NDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENvbGxlY3Rpb25UYWJsZTJfMENvbXBvc2l0ZSh0aGlzLCBidWlsZENvbGxlY3Rpb25UYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCwgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjc3MjIwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLm9ybS5Pcm1YbWxVaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGEyLmRldGFpbHMub3JtLk9ybVhtbFVpRmFjdG9yeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24KLQlleHRlbmRzIEFic3RyYWN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPgotCWltcGxlbWVudHMgT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+Ci17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uIElOU1RBTkNFID0gCi0JCW5ldyBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkKLQkvKioKLQkgKiBFbnN1cmUgc2luZ2xlIGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgSnBhQ29tcG9zaXRlIGJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCU9ybVhtbFVpRmFjdG9yeSBmYWN0b3J5LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsIAotCQkJQ29tcG9zaXRlIHBhcmVudCwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiAoKE9ybVhtbFVpRmFjdG9yeTJfMCkgZmFjdG9yeSkuY3JlYXRlT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFhZTEyNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtRW1iZWRkZWRJZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RFbWJlZGRlZElkTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRW1iZWRkZWRNYXBwaW5nT3ZlcnJpZGVzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVtYmVkZGVkSWRNYXBwaW5nMl8wTWFwcGVkQnlSZWxhdGlvbnNoaXBQYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybUVtYmVkZGVkSWRNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdEVtYmVkZGVkSWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkSWRNYXBwaW5nPgotewotCXB1YmxpYyBPcm1FbWJlZGRlZElkTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgRW1iZWRkZWRJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRW1iZWRkZWRJZFNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJCi0JCW5ldyBFbWJlZGRlZElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBFbWJlZGRlZE1hcHBpbmdPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9CQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8RW1iZWRkZWRJZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVtYmVkZGVkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTEzZDllLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkVtYmVkZGVkTWFwcGluZzJfME92ZXJyaWRlc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgRW1iZWRkZWRBdHRyaWJ1dGVPdmVycmlkZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgRW1iZWRkZWRNYXBwaW5nCi0gKiBAc2VlIEJhc2VKYXZhVWlGYWN0b3J5IC0gVGhlIGZhY3RvcnkgY3JlYXRpbmcgdGhpcyBwYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0RW1iZWRkZWRNYXBwaW5nQ29tcG9zaXRlPEVtYmVkZGVkTWFwcGluZz4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkVtYmVkZGVkTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPkVtYmVkZGVkTWFwcGluZzwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FbWJlZGRlZE1hcHBpbmcyXzBDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBFbWJlZGRlZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUVtYmVkZGVkU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpLCBjb250YWluZXIpOwotCi0JCW5ldyBFbWJlZGRlZE1hcHBpbmcyXzBPdmVycmlkZXNDb21wb3NpdGUoCi0JCQl0aGlzLAotCQkJY29udGFpbmVyCi0JCSk7Ci0JfQkKLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEVtYmVkZGVkTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVudGl0eTJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUVudGl0eTJfMENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE4MTcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1FbnRpdHkyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRvckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5FbnRpdHlOYW1lQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5JZENsYXNzQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYWJsZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLkFic3RyYWN0T3JtRW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUphdmFDbGFzc0Nob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQ2FjaGVhYmxlMl8wUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5FbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5RdWVyaWVzMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgcGFuZSB1c2VkIGZvciBhbiBPUk0gZW50aXR5IDIuMC4KLSAqCi0gKiBAc2VlIE9ybUVudGl0eQotICogQHNlZSBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIE9ybUVudGl0eTJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPcm1FbnRpdHlDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk9ybUVudGl0eUNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPk9ybUVudGl0eTwvY29kZT4KLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBPcm1FbnRpdHkyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE9ybUVudGl0eT4gc3ViamVjdEhvbGRlciwKLQkJCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVFbnRpdHlTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9ybUphdmFDbGFzc0Nob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIsIGZhbHNlKTsKLQkJbmV3IFRhYmxlQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBFbnRpdHlOYW1lQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBJZENsYXNzQ29tcG9zaXRlKHRoaXMsIGJ1aWxkSWRDbGFzc1JlZmVyZW5jZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FjaGVhYmxlMl8wUGFuZSh0aGlzLCBidWlsZENhY2hlYWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgTWV0YWRhdGFDb21wbGV0ZUNvbXBvc2l0ZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGVhYmxlMl8wPiBidWlsZENhY2hlYWJsZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtRW50aXR5LCBDYWNoZWFibGUyXzA+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVhYmxlMl8wIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiAoKENhY2hlYWJsZUhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRDYWNoZWFibGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplQXR0cmlidXRlT3ZlcnJpZGVzU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBFbnRpdHkyXzBPdmVycmlkZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplR2VuZXJhdG9yc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYXRvckNvbnRhaW5lcj4gZ2VuZXJhdG9yQ29udGFpbmVySG9sZGVyKSB7Ci0JCW5ldyBHZW5lcmF0aW9uMl8wQ29tcG9zaXRlKHRoaXMsIGdlbmVyYXRvckNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUXVlcmllc1NlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBxdWVyeUNvbnRhaW5lckhvbGRlcikgewotCQluZXcgUXVlcmllczJfMENvbXBvc2l0ZSh0aGlzLCBxdWVyeUNvbnRhaW5lckhvbGRlciwgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MTdkMDkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybUlkTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RJZE1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkNvbHVtbkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5JZE1hcHBpbmcyXzBNYXBwZWRCeVJlbGF0aW9uc2hpcFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuSWRNYXBwaW5nR2VuZXJhdGlvbjJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1JZE1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0SWRNYXBwaW5nQ29tcG9zaXRlPElkTWFwcGluZz4KLXsKLQlwdWJsaWMgT3JtSWRNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBJZE1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICBDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSWRTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZzJfME1hcHBlZEJ5UmVsYXRpb25zaGlwUGFuZSh0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBDb2x1bW5Db21wb3NpdGUodGhpcywgYnVpbGRDb2x1bW5Ib2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmF0aW9uQ29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IElkTWFwcGluZ0dlbmVyYXRpb24yXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxBY2Nlc3NIb2xkZXI+IGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxJZE1hcHBpbmcsIEFjY2Vzc0hvbGRlcj4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBBY2Nlc3NIb2xkZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2ZmJiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLlRhcmdldEVudGl0eUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBpbmdOYW1lQ2hvb3NlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5DYXNjYWRlUGFuZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcmRlcmluZzJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RNYW55VG9NYW55TWFwcGluZ0NvbXBvc2l0ZTxNYW55VG9NYW55TWFwcGluZywgTWFueVRvTWFueVJlbGF0aW9uc2hpcD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1hbnlUb01hbnlNYXBwaW5nQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIHN1YmplY3QgPGNvZGU+SU1hbnlUb01hbnlNYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBNYW55VG9NYW55TWFwcGluZz4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVNYW55VG9NYW55U2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCBhZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT3JkZXJpbmdDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT3JkZXJpbmcyXzBDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1NYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1Y2E5NWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BY2Nlc3NUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5GZXRjaFR5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLk9wdGlvbmFsQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5UYXJnZXRFbnRpdHlDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1NYXBwaW5nTmFtZUNob29zZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuQWJzdHJhY3RNYW55VG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUKLQlleHRlbmRzIEFic3RyYWN0TWFueVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZTxNYW55VG9PbmVNYXBwaW5nLCBNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA+Ci17Ci0JcHVibGljIE9ybU1hbnlUb09uZU1hcHBpbmcyXzBDb21wb3NpdGUoCi0JCQlQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE1hbnlUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCSAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFueVRvT25lU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBUYXJnZXRFbnRpdHlDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ybU1hcHBpbmdOYW1lQ2hvb3Nlcih0aGlzLCBnZXRTdWJqZWN0SG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBBY2Nlc3NUeXBlQ29tcG9zaXRlKHRoaXMsIGJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9wdGlvbmFsQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBDYXNjYWRlUGFuZTJfMCh0aGlzLCBidWlsZENhc2NhZGVIb2xkZXIoKSwgIGFkZFN1YlBhbmUoY29udGFpbmVyLCA1KSk7Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFueVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU9uZVRvTWFueU1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyZjM1OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9NYW55TWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5BYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkFjY2Vzc1R5cGVDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLkZldGNoVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9uZVRvTWFueUpvaW5pbmdTdHJhdGVneTJfMFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JkZXJpbmcyXzBDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuT3JwaGFuUmVtb3ZhbDJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBPcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdE9uZVRvTWFueU1hcHBpbmdDb21wb3NpdGU8T25lVG9NYW55TWFwcGluZywgT25lVG9NYW55UmVsYXRpb25zaGlwMl8wPgotewotCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb01hbnlNYXBwaW5nPiBzdWJqZWN0SG9sZGVyLAotCQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9uZVRvTWFueVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgVGFyZ2V0RW50aXR5Q29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JCW5ldyBPcm1NYXBwaW5nTmFtZUNob29zZXIodGhpcywgZ2V0U3ViamVjdEhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQWNjZXNzVHlwZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkQWNjZXNzSG9sZGVySG9sZGVyKCksIGNvbnRhaW5lcik7Ci0JCW5ldyBGZXRjaFR5cGVDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZE9ycGhhblJlbW92YWJsZUhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgQ2FzY2FkZVBhbmUyXzAodGhpcywgdGhpcy5idWlsZENhc2NhZGVIb2xkZXIoKSwgdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgNSkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVKb2luaW5nU3RyYXRlZ3lDb2xsYXBzaWJsZVNlY3Rpb24oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQluZXcgT25lVG9NYW55Sm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSh0aGlzLCB0aGlzLmJ1aWxkSm9pbmluZ0hvbGRlcigpLCBjb250YWluZXIpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVPcmRlcmluZ0NvbGxhcHNpYmxlU2VjdGlvbihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBPcmRlcmluZzJfMENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8QWNjZXNzSG9sZGVyPiBidWlsZEFjY2Vzc0hvbGRlckhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T25lVG9NYW55TWFwcGluZywgQWNjZXNzSG9sZGVyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPE9ycGhhblJlbW92YWJsZTJfMD4gYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9uZVRvTWFueU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE9ycGhhblJlbW92YWJsZTJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB0aGlzLnN1YmplY3QpLmdldE9ycGhhblJlbW92YWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5Y2Q1NTYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzSG9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuRmV0Y2hUeXBlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5PcHRpb25hbENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuVGFyZ2V0RW50aXR5Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkFic3RyYWN0T25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLkNhc2NhZGVQYW5lMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLk9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5PcnBoYW5SZW1vdmFsMl8wQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybU9uZVRvT25lTWFwcGluZzJfMENvbXBvc2l0ZQotCWV4dGVuZHMgQWJzdHJhY3RPbmVUb09uZU1hcHBpbmcyXzBDb21wb3NpdGU8T25lVG9PbmVNYXBwaW5nLCBPbmVUb09uZVJlbGF0aW9uc2hpcDJfMD4KLXsKLQlwdWJsaWMgT3JtT25lVG9PbmVNYXBwaW5nMl8wQ29tcG9zaXRlKAotCQkJUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBPbmVUb09uZU1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JCQlDb21wb3NpdGUgcGFyZW50LAotCQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0JCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplT25lVG9PbmVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IFRhcmdldEVudGl0eUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEZldGNoVHlwZUNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCQluZXcgT3B0aW9uYWxDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IE9ycGhhblJlbW92YWwyXzBDb21wb3NpdGUodGhpcywgYnVpbGRPcnBoYW5SZW1vdmFibGVIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IENhc2NhZGVQYW5lMl8wKHRoaXMsIGJ1aWxkQ2FzY2FkZUhvbGRlcigpLCAgYWRkU3ViUGFuZShjb250YWluZXIsIDUpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSm9pbmluZ1N0cmF0ZWd5Q29sbGFwc2libGVTZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IE9uZVRvT25lSm9pbmluZ1N0cmF0ZWd5Ml8wUGFuZSh0aGlzLCBidWlsZEpvaW5pbmdIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9uZVRvT25lTWFwcGluZywgQWNjZXNzSG9sZGVyPihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEFjY2Vzc0hvbGRlciBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxPcnBoYW5SZW1vdmFibGUyXzA+IGJ1aWxkT3JwaGFuUmVtb3ZhYmxlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxPbmVUb09uZU1hcHBpbmcsIE9ycGhhblJlbW92YWJsZTJfMD4oZ2V0U3ViamVjdEhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBPcnBoYW5SZW1vdmFibGUyXzAgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuICgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdGhpcy5zdWJqZWN0KS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVF1ZXJpZXMyXzBDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9kZXRhaWxzL29ybS9Pcm1RdWVyaWVzMl8wQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MDI3MWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVF1ZXJpZXMyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuUXVlcmllc0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVF1ZXJpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLmRldGFpbHMuUXVlcmllczJfMENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIE9ybVF1ZXJpZXMyXzBDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIE9ybVF1ZXJpZXMyXzBDb21wb3NpdGUgZXh0ZW5kcyBPcm1RdWVyaWVzQ29tcG9zaXRlIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+T3JtUXVlcmllczJfMENvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgT3JtUXVlcmllczJfMENvbXBvc2l0ZShQYW5lPD8gZXh0ZW5kcyBFbnRpdHlNYXBwaW5ncz4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUXVlcmllc0NvbXBvc2l0ZSBidWlsZFF1ZXJpZXNDb21wb3NpdGUoQ29tcG9zaXRlIGNvbnRhaW5lciwgUHJvcGVydHlWYWx1ZU1vZGVsPFF1ZXJ5Q29udGFpbmVyPiBxdWVyeUNvbnRhaW5lckhvbGRlcikgewotCQlyZXR1cm4gbmV3IFF1ZXJpZXMyXzBDb21wb3NpdGUodGhpcywgcXVlcnlDb250YWluZXJIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2YWFkZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtVmVyc2lvbk1hcHBpbmcyXzBDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIuZGV0YWlscy5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWJzdHJhY3RWZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQWNjZXNzVHlwZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMuQ29sdW1uQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFwcGluZ05hbWVDaG9vc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIE9ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlCi0JZXh0ZW5kcyBBYnN0cmFjdFZlcnNpb25NYXBwaW5nQ29tcG9zaXRlPFZlcnNpb25NYXBwaW5nPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoZSBzdWJqZWN0IDxjb2RlPlZlcnNpb25NYXBwaW5nPC9jb2RlPgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIE9ybVZlcnNpb25NYXBwaW5nMl8wQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgVmVyc2lvbk1hcHBpbmc+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZlcnNpb25TZWN0aW9uKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJbmV3IENvbHVtbkNvbXBvc2l0ZSh0aGlzLCBidWlsZENvbHVtbkhvbGRlcigpLCBjb250YWluZXIpOwotCQluZXcgT3JtTWFwcGluZ05hbWVDaG9vc2VyKHRoaXMsIGdldFN1YmplY3RIb2xkZXIoKSwgY29udGFpbmVyKTsKLQkJbmV3IEFjY2Vzc1R5cGVDb21wb3NpdGUodGhpcywgYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSwgY29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEFjY2Vzc0hvbGRlcj4gYnVpbGRBY2Nlc3NIb2xkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFZlcnNpb25NYXBwaW5nLCBBY2Nlc3NIb2xkZXI+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQWNjZXNzSG9sZGVyIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvZGV0YWlscy9vcm0vT3JtWG1sMl8wVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5YmQ2NzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL2RldGFpbHMvb3JtL09ybVhtbDJfMFVpRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLlJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMub3JtLk9ybVR5cGVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uQWJzdHJhY3RPcm1YbWxSZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUJhc2ljTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGFibGVVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVtYmVkZGVkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUVudGl0eVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybUlkTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtTWFueVRvT25lTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3NVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5kZXRhaWxzLm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5vcm0uT3JtVHJhbnNpZW50TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmRldGFpbHMub3JtLk9ybVZlcnNpb25NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5HZW5lcmljT3JtWG1sMl8wVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlLk9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE9ybVhtbDJfMFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0T3JtWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZVVpRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBPcm1YbWwyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybVhtbDJfMFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9ybVhtbFVpRmFjdG9yeSBidWlsZE9ybVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljT3JtWG1sMl8wVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfMl8wX1JFU09VUkNFX1RZUEUpOwotCX0KLQkKLQlwdWJsaWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgZ2V0U3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtQXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnNUbyhMaXN0PE9ybUF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIEF0dHJpYnV0ZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtSWRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW1iZWRkZWRJZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1CYXNpY01hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1WZXJzaW9uTWFwcGluZ1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybU1hbnlUb09uZU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1PbmVUb01hbnlNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtT25lVG9PbmVNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFueVRvTWFueU1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1FbWJlZGRlZE1hcHBpbmdVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JCWRlZmluaXRpb25zLmFkZChPcm1UcmFuc2llbnRNYXBwaW5nVWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQkKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFVpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkT3JtVHlwZU1hcHBpbmdVaURlZmluaXRpb25zVG8oTGlzdDxPcm1UeXBlTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgVHlwZU1hcHBpbmc+PiBkZWZpbml0aW9ucykgewotCQlkZWZpbml0aW9ucy5hZGQoT3JtRW50aXR5VWlEZWZpbml0aW9uLmluc3RhbmNlKCkpOwotCQlkZWZpbml0aW9ucy5hZGQoT3JtTWFwcGVkU3VwZXJjbGFzc1VpRGVmaW5pdGlvbi5pbnN0YW5jZSgpKTsKLQkJZGVmaW5pdGlvbnMuYWRkKE9ybUVtYmVkZGFibGVVaURlZmluaXRpb24uaW5zdGFuY2UoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjU4MTVkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuSnBhT3B0aW9uczJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9ucy5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzLlBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVUkgZmFjdG9yeSByZXF1aXJlZCB0byBzaG93IHRoZSBpbmZvcm1hdGlvbgotICogcmVsYXRlZCB0byBhIEpQQSBtYXBwaW5nICh0eXBlIG9yIGF0dHJpYnV0ZSkuCi0gKgotICogQHNlZSBHZW5lcmljUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAxLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5Ci17Ci0JCi0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0IGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gY3JlYXRlUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlcygKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+IHBhZ2VzID0gbmV3IEFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPig0KTsKLQkJCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxKcGFDb25uZWN0aW9uMl8wPiBjb25uZWN0aW9uMl8wSG9sZGVyID0gCi0JCQl0aGlzLmJ1aWxkSnBhQ29ubmVjdGlvbjJfMEhvbGRlcihzdWJqZWN0SG9sZGVyKTsKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEpwYU9wdGlvbnMyXzA+IG9wdGlvbnMyXzBIb2xkZXIgPSAKLQkJCXRoaXMuYnVpbGRKcGFPcHRpb25zMl8wSG9sZGVyKHN1YmplY3RIb2xkZXIpOwotCQkKLQkJcGFnZXMuYWRkKG5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKG5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYihjb25uZWN0aW9uMl8wSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKG5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYihvcHRpb25zMl8wSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQkJcGFnZXMuYWRkKG5ldyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCi0JCXJldHVybiBwYWdlcy5saXN0SXRlcmF0b3IoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIHByaXZhdGUgbWV0aG9kcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhQ29ubmVjdGlvbjJfMD4gYnVpbGRKcGFDb25uZWN0aW9uMl8wSG9sZGVyKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQsIEpwYUNvbm5lY3Rpb24yXzA+KHN1YmplY3RIb2xkZXIpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEpwYUNvbm5lY3Rpb24yXzAgdHJhbnNmb3JtXyhQZXJzaXN0ZW5jZVVuaXQgdmFsdWUpIHsKLQkJCQlyZXR1cm4gKEpwYUNvbm5lY3Rpb24yXzApICgoUGVyc2lzdGVuY2VVbml0Ml8wKSB2YWx1ZSkuZ2V0Q29ubmVjdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxKcGFPcHRpb25zMl8wPiBidWlsZEpwYU9wdGlvbnMyXzBIb2xkZXIoCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdCwgSnBhT3B0aW9uczJfMD4oc3ViamVjdEhvbGRlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSnBhT3B0aW9uczJfMCB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdCB2YWx1ZSkgewotCQkJCXJldHVybiAoSnBhT3B0aW9uczJfMCkgKChQZXJzaXN0ZW5jZVVuaXQyXzApIHZhbHVlKS5nZXRPcHRpb25zKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL0pwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL0pwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzQxMzlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqICBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcwotewotCS8vIENvbm5lY3Rpb24KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9EYXRhYmFzZV9Hcm91cEJveDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX2p0YURhdGFTb3VyY2VMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhU291cmNlUHJvcGVydGllc0NvbXBvc2l0ZV9ub25KdGFEYXRhU291cmNlTGFiZWw7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlX3NlY3Rpb25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYl90aXRsZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZV9taXNjZWxsYW5lb3VzU2VjdGlvblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWJfbm9OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfQ29ubmVjdGlvbkRpYWxvZ19UaXRsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9wb3B1bGF0ZUZyb21Db25uZWN0aW9uSHlwZXJMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9kcml2ZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfdXJsTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VzZXJMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfcGFzc3dvcmRMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlX0pkYmNDb25uZWN0aW9uUHJvcGVydGllc19Hcm91cEJveDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlX2xvY2tUaW1lb3V0TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV90cmFuc2FjdGlvblR5cGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9qdGE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9zaGFyZWRDYWNoZU1vZGVMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9hbGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2VuYWJsZV9zZWxlY3RpdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2Rpc2FibGVfc2VsZWN0aXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV91bnNwZWNpZmllZDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV92YWxpZGF0aW9uTW9kZUxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX2F1dG87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfY2FsbGJhY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlVXBkYXRlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGVfZ3JvdXBQcmVSZW1vdmVMYWJlbDsKLQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfcGVyc2lzdGVuY2UyXzAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU3NDEyNi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHMuQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlscy5QZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZS5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uIGV4dGVuZHMgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVzb3VyY2VVaURlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VYbWwyXzBVaURlZmluaXRpb24oKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VVaURlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIFBlcnNpc3RlbmNlWG1sMl8wVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkgYnVpbGRQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljMl8wUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gcHJvdmlkZXNVaShKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiByZXNvdXJjZVR5cGUuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzJfMF9SRVNPVVJDRV9UWVBFKTsKLQl9Ci0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVByb3ZpZGVyIGdldFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuaW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzNzYzMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9Db25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KLXsKLQlwdWJsaWMgQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUoUGFuZTxKcGFDb25uZWN0aW9uMl8wPiBwYXJlbnRDb21wb3NpdGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfRGF0YWJhc2VfR3JvdXBCb3gKLQkJKTsKLQotCQluZXcgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQkJbmV3IEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0RhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNWMzZGYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiAgRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFDb25uZWN0aW9uMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIERhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlKFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4gcGFyZW50Q29tcG9zaXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKdGFEYXRhU291cmNlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4odGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuSlRBX0RBVEFfU09VUkNFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEp0YURhdGFTb3VyY2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUsIEJvb2xlYW4+KGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gdHJhbnNmb3JtKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy50cmFuc2Zvcm0yKHZhbHVlKSk7Ci0JCQl9Ci0JCQlwcml2YXRlIGJvb2xlYW4gdHJhbnNmb3JtMihQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5vbkp0YURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCBQZXJzaXN0ZW5jZVVuaXQuTk9OX0pUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhTdHJpbmcgdmFsdWUpIHsKLQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQl2YWx1ZSA9IG51bGw7Ci0JCQkJfQotCQkJCXRoaXMuc3ViamVjdC5zZXROb25KdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KAotCQkJCWJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCksIAotCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCi0JCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgUGVyc2lzdGVuY2VVbml0PihnZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbnQgZ3JvdXBCb3hNYXJnaW4gPSB0aGlzLmdldEdyb3VwQm94TWFyZ2luKCk7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRTdWJQYW5lKGNvbnRhaW5lciwgMCwgZ3JvdXBCb3hNYXJnaW4sIDAsIGdyb3VwQm94TWFyZ2luKTsKLQotCQkvLyBKVEEgRGF0YSBTb3VyY2UKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGp0YUVuYWJsZWQgPSB0aGlzLmJ1aWxkSlRBRGF0YVNvdXJjZUhvbGRlcigpOwotCQlMYWJlbCBqdGFMYWJlbCA9IHRoaXMuYWRkTGFiZWwoY29udGFpbmVyLCBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuRGF0YVNvdXJjZVByb3BlcnRpZXNDb21wb3NpdGVfanRhRGF0YVNvdXJjZUxhYmVsLCBqdGFFbmFibGVkKTsKLQkJVGV4dCBqdGFUZXh0ID0gdGhpcy5hZGRUZXh0KGNvbnRhaW5lciwgdGhpcy5idWlsZEp0YURhdGFTb3VyY2VIb2xkZXIoKSwgdGhpcy5nZXRIZWxwSUQoKSwganRhRW5hYmxlZCk7Ci0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIGp0YUxhYmVsLCBqdGFUZXh0LCB0aGlzLmdldEhlbHBJRCgpKTsKLQotCQkvLyBOb24tSlRBIERhdGEgU291cmNlCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBub25KVEFFbmFibGVkID0gdGhpcy5idWlsZE5vbkpUQURhdGFTb3VyY2VIb2xkZXIoKTsKLQkJTGFiZWwgbm9uSnRhTGFiZWwgPSB0aGlzLmFkZExhYmVsKGNvbnRhaW5lciwgSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkRhdGFTb3VyY2VQcm9wZXJ0aWVzQ29tcG9zaXRlX25vbkp0YURhdGFTb3VyY2VMYWJlbCwgbm9uSlRBRW5hYmxlZCk7Ci0JCVRleHQgbm9uSnRhVGV4dCA9IHRoaXMuYWRkVGV4dChjb250YWluZXIsIHRoaXMuYnVpbGROb25KdGFEYXRhU291cmNlSG9sZGVyKCksIHRoaXMuZ2V0SGVscElEKCksIG5vbkpUQUVuYWJsZWQpOwotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBub25KdGFMYWJlbCwgbm9uSnRhVGV4dCwgdGhpcy5nZXRIZWxwSUQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsJLy8gVE9ETyAtIFJldmlldyBmb3IgSlBBIDIuMAotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmVlMTRkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFDb25uZWN0aW9uMl8wPgotewotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZSgKLQkJCQkJCQkJCQkJCQkJCVBhbmU8SnBhQ29ubmVjdGlvbjJfMD4gc3ViamVjdEhvbGRlciwKLQkJCQkJCQkJCQkJCQkJCUNvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJaW50IGdyb3VwQm94TWFyZ2luID0gdGhpcy5nZXRHcm91cEJveE1hcmdpbigpICogMjsKLQotCQljb250YWluZXIgPSB0aGlzLmFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25Db21wb3NpdGVfc2VjdGlvblRpdGxlLAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uQ29tcG9zaXRlX3NlY3Rpb25EZXNjcmlwdGlvbgotCQkpOwotCi0JCUNvbXBvc2l0ZSBzdWJQYW5lID0gdGhpcy5hZGRTdWJQYW5lKAotCQkJY29udGFpbmVyLAotCQkJMCwgZ3JvdXBCb3hNYXJnaW4sIDEwLCBncm91cEJveE1hcmdpbgotCQkpOwotCi0JCW5ldyBUcmFuc2FjdGlvblR5cGVDb21wb3NpdGUodGhpcywgc3ViUGFuZSk7Ci0KLQkJbmV3IENvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MGQ5MWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBDb25uZWN0aW9uVGFiCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYiBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KLQlpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYjwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gc3ViamVjdEhvbGRlciBUaGUgaG9sZGVyIG9mIHRoaXMgcGFuZSdzIHN1YmplY3QKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHdpZGdldEZhY3RvcnkgVGhlIGZhY3RvcnkgdXNlZCB0byBjcmVhdGUgdmFyaW91cyBjb21tb24gd2lkZ2V0cwotCSAqLwotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvblRhYigKLQkJCQkJCQkJCQkJUHJvcGVydHlWYWx1ZU1vZGVsPEpwYUNvbm5lY3Rpb24yXzA+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCW5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wQ29ubmVjdGlvbkNvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8vICoqKioqKioqKiogTGF5b3V0ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAwOwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gMDsKLQkJbGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCQlDb21wb3NpdGUgY29udGFpbmVyID0gdGhpcy5hZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEpwYVBhZ2VDb21wb3NpdGUgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTjsJLy8gVE9ETyAtIFJldmlldyBmb3IgSlBBIDIuMAotCX0KLQkKLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMENvbm5lY3Rpb25UYWJfdGl0bGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1OWE4NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkZpbHRlcmVkSXRlbXNTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZQotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPEpwYUNvbm5lY3Rpb24yXzA+Ci17Ci0JLyoqCi0JICogVGhlIGNvbnN0YW50IElEIHVzZWQgdG8gcmV0cmlldmUgdGhlIGRpYWxvZyBzZXR0aW5ncy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1NFVFRJTkdTID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5kaWFsb2dzLkNvbm5lY3Rpb25EaWFsb2ciOwotCi0JcHVibGljIEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPEpwYUNvbm5lY3Rpb24yXzA+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQYXNzd29yZEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgU3RyaW5nPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhQ29ubmVjdGlvbjJfMC5QQVNTV09SRF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGFzc3dvcmQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0UGFzc3dvcmQodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRQb3B1bGF0ZUZyb21Db25uZWN0aW9uQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXByb21wdENvbm5lY3Rpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVcmxIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYUNvbm5lY3Rpb24yXzAsIFN0cmluZz4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCksIEpwYUNvbm5lY3Rpb24yXzAuVVJMX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVcmwoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0VXJsKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVc2VySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFDb25uZWN0aW9uMl8wLCBTdHJpbmc+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFDb25uZWN0aW9uMl8wLlVTRVJfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFVzZXIoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQl0aGlzLnN1YmplY3Quc2V0VXNlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gUG9wdWxhdGUgZnJvbSBDb25uZWN0aW9uIGh5cGVybGluawotCQl0aGlzLmFkZEh5cGVybGluaygKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfcG9wdWxhdGVGcm9tQ29ubmVjdGlvbkh5cGVyTGluaywKLQkJCXRoaXMuYnVpbGRQb3B1bGF0ZUZyb21Db25uZWN0aW9uQWN0aW9uKCkKLQkJKTsKLQotCQkvLyBEcml2ZXIKLQkJbmV3IEpkYmNEcml2ZXJDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQkvLyBVcmwKLQkJdGhpcy5hZGRMYWJlbGVkVGV4dCgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfdXJsTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVXJsSG9sZGVyKCkKLQkJKTsKLQotCQkvLyBVc2VyCi0JCXRoaXMuYWRkTGFiZWxlZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3VzZXJMYWJlbCwKLQkJCXRoaXMuYnVpbGRVc2VySG9sZGVyKCkKLQkJKTsKLQotCQkvLyBQYXNzd29yZAotCQl0aGlzLmFkZExhYmVsZWRQYXNzd29yZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX3Bhc3N3b3JkTGFiZWwsCi0JCQl0aGlzLmJ1aWxkUGFzc3dvcmRIb2xkZXIoKQotCQkpOwotCX0KLQotCXZvaWQgcHJvbXB0Q29ubmVjdGlvbigpIHsKLQotCQlDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nIGRpYWxvZyA9IG5ldyBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nKCk7Ci0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgIT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNwID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUpOwotCi0JCUpwYUNvbm5lY3Rpb24yXzAgY29ubmVjdGlvbiA9IGdldFN1YmplY3QoKTsKLQkJY29ubmVjdGlvbi5zZXRVcmwoKGNwID09IG51bGwpID8gIiIgOiBjcC5nZXRVUkwoKSk7Ci0JCWNvbm5lY3Rpb24uc2V0VXNlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldFVzZXJOYW1lKCkpOwotCQljb25uZWN0aW9uLnNldFBhc3N3b3JkKChjcCA9PSBudWxsKSA/ICIiIDogY3AuZ2V0VXNlclBhc3N3b3JkKCkpOwotCQljb25uZWN0aW9uLnNldERyaXZlcigoY3AgPT0gbnVsbCkgPyAiIiA6IGNwLmdldERyaXZlckNsYXNzTmFtZSgpKTsKLQl9Ci0KLQlDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQkvLyB3ZSBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYW55IGNvbm5lY3Rpb24gcHJvZmlsZSBhbmQgc2ltcGx5Ci0JCS8vIHRha2UgdGhlIHNldHRpbmdzIGZyb20gaXQgKHVzZXIsIHBhc3N3b3JkLCBldGMuKSBhbmQgZ2l2ZSB0aGVtCi0JCS8vIHRvIHRoZSBwZXJzaXN0ZW5jZSBjb25uZWN0aW9uLCBzbyB3ZSBnbwotCQkvLyB0byB0aGUgZGIgcGx1Zy1pbiBkaXJlY3RseSB0byBnZXQgdGhlIGZhY3RvcnkKLQkJcmV0dXJuIEpwdEpwYURiUGx1Z2luLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpOwotCX0KLQotCS8vIGJyb2FkZW4gYWNjZXNzIGEgYml0Ci0JU2hlbGwgZ2V0U2hlbGxfKCkgewotCQlyZXR1cm4gdGhpcy5nZXRTaGVsbCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZGlhbG9nIHNob3dzIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGNvbm5lY3Rpb24gbmFtZXMgYW5kIGxldHMgdGhlIHVzZXIKLQkgKiB0aGUgb3B0aW9uIHRvIGZpbHRlciB0aGVtIHVzaW5nIGEgc2VhcmNoIGZpZWxkLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBDb25uZWN0aW9uU2VsZWN0aW9uRGlhbG9nIGV4dGVuZHMgRmlsdGVyZWRJdGVtc1NlbGVjdGlvbkRpYWxvZyB7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+TWFwcGluZ1NlbGVjdGlvbkRpYWxvZzwvY29kZT4uCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29ubmVjdGlvblNlbGVjdGlvbkRpYWxvZygpIHsKLQkJCXN1cGVyKEpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZS50aGlzLmdldFNoZWxsXygpLCBmYWxzZSk7Ci0JCQl0aGlzLnNldE1lc3NhZ2UoSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkpkYmNDb25uZWN0aW9uUHJvcGVydGllc0NvbXBvc2l0ZV9Db25uZWN0aW9uRGlhbG9nX01lc3NhZ2UpOwotCQkJdGhpcy5zZXRUaXRsZShKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlX0Nvbm5lY3Rpb25EaWFsb2dfVGl0bGUpOwotCQkJdGhpcy5zZXRMaXN0TGFiZWxQcm92aWRlcih0aGlzLmJ1aWxkTGFiZWxQcm92aWRlcigpKTsKLQkJCXRoaXMuc2V0RGV0YWlsc0xhYmVsUHJvdmlkZXIodGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIChlbGVtZW50ID09IG51bGwpID8gIiIgOiBlbGVtZW50LnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVFeHRlbmRlZENvbnRlbnRBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVtc0ZpbHRlciBjcmVhdGVGaWx0ZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25JdGVtc0ZpbHRlcigpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGZpbGxDb250ZW50UHJvdmlkZXIoQWJzdHJhY3RDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlbXNGaWx0ZXIgaXRlbXNGaWx0ZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsIC0xKTsKLQotCQkJdHJ5IHsKLQkJCQkvLyBBZGQgdGhlIGNvbm5lY3Rpb24gbmFtZXMgdG8gdGhlIGRpYWxvZwotCQkJCWZvciAoU3RyaW5nIG5hbWUgOiB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSkgewotCQkJCQlwcm92aWRlci5hZGQobmFtZSwgaXRlbXNGaWx0ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJdGVyYWJsZTxTdHJpbmc+IGdldENvbm5lY3Rpb25Qcm9maWxlTmFtZXMoKSB7Ci0JCQlyZXR1cm4gSmRiY0Nvbm5lY3Rpb25Qcm9wZXJ0aWVzQ29tcG9zaXRlLnRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nU2V0dGluZ3MoKSB7Ci0KLQkJCUlEaWFsb2dTZXR0aW5ncyBkaWFsb2dTZXR0aW5ncyA9IEpwdEpwYVVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmdldFNlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKLQotCQkJaWYgKHNldHRpbmdzID09IG51bGwpIHsKLQkJCQlzZXR0aW5ncyA9IGRpYWxvZ1NldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTKTsKLQkJCX0KLQkJCXJldHVybiBzZXR0aW5nczsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBvYmplY3QudG9TdHJpbmcoKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxTdHJpbmc+IGdldEl0ZW1zQ29tcGFyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaXRlbTEsIFN0cmluZyBpdGVtMikgewotCQkJCQlyZXR1cm4gaXRlbTEuY29tcGFyZVRvKGl0ZW0yKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSXRlbShPYmplY3QgaXRlbSkgewotCi0JCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lELCBJU3RhdHVzLkVSUk9SLCAiIiwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCS8qKgotCQkgKiBDcmVhdGUgdGhlIGZpbHRlciByZXNwb25zaWJsZSB0byByZW1vdmUgYW55IGNvbm5lY3Rpb24gbmFtZSBiYXNlZCBvbgotCQkgKiB0aGUgcGF0dGVybiBlbnRlcmVkIGluIHRoZSB0ZXh0IGZpZWxkLgotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBDb25uZWN0aW9uSXRlbXNGaWx0ZXIgZXh0ZW5kcyBJdGVtc0ZpbHRlciB7Ci0KLQkJCS8qKgotCQkJICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Db25uZWN0aW9uSXRlbXNGaWx0ZXI8L2NvZGU+LgotCQkJICovCi0JCQlDb25uZWN0aW9uSXRlbXNGaWx0ZXIoKSB7Ci0KLQkJCQlzdXBlcigpOwotCi0JCQkJLy8gTWFrZSBzdXJlIHRoYXQgaWYgdGhlIHBhdHRlcm4gaXMgZW1wdHksIHdlIHNwZWNpZnkgKiBpbiBvcmRlcgotCQkJCS8vIHRvIHNob3cgYWxsIHRoZSBtYXBwaW5nIHR5cGVzCi0JCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoZ2V0UGF0dGVybigpKSkgewotCQkJCQlwYXR0ZXJuTWF0Y2hlci5zZXRQYXR0ZXJuKCIqIik7Ci0JCQkJfQotCQkJfQotCi0JCQkvKgotCQkJICogKG5vbi1KYXZhZG9jKQotCQkJICovCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGlzQ29uc2lzdGVudEl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIChub24tSmF2YWRvYykKLQkJCSAqLwotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBtYXRjaEl0ZW0oT2JqZWN0IGl0ZW0pIHsKLQkJCQlyZXR1cm4gbWF0Y2hlcyhpdGVtLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0RyaXZlckNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY0RyaXZlckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDE0NzEzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL0pkYmNEcml2ZXJDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuY29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQ2xhc3NDaG9vc2VyUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY0RyaXZlckNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgSmRiY0RyaXZlckNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhQ29ubmVjdGlvbjJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpkYmNEcml2ZXJDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBKZGJjRHJpdmVyQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIEpwYUNvbm5lY3Rpb24yXzA+IHBhcmVudFBhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIENsYXNzQ2hvb3NlclBhbmU8SnBhQ29ubmVjdGlvbjJfMD4gaW5pdGlhbGl6ZUNsYXNzQ2hvb3NlcihDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJcmV0dXJuIG5ldyBDbGFzc0Nob29zZXJQYW5lPEpwYUNvbm5lY3Rpb24yXzA+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dEhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFDb25uZWN0aW9uMl8wLCBTdHJpbmc+KAotCQkJCQkJCXRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFDb25uZWN0aW9uMl8wLkRSSVZFUl9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RHJpdmVyKCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCi0JCQkJCQlpZiAodmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCXZhbHVlID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCXRoaXMuc3ViamVjdC5zZXREcml2ZXIodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0RHJpdmVyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5KZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGVfZHJpdmVyTGFiZWw7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCQkJdGhpcy5nZXRTdWJqZWN0KCkuc2V0RHJpdmVyKGNsYXNzTmFtZSk7CQkJCQotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIGFsbG93VHlwZUNyZWF0aW9uKCkgewotCQkJCS8vRG9lcyBub3QgbWFrZSBzZW5zZSB0byBhbGxvdyB0aGUgdXNlciB0byBjcmVhdGUgYSBuZXcgRHJpdmVyIGNsYXNzCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQl0aGlzLmluaXRpYWxpemVDbGFzc0Nob29zZXIoY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL2Nvbm5lY3Rpb24vSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFiNTRkNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9KZGJjUHJvcGVydGllc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlBhbmVFbmFibGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLmNvbm5lY3Rpb24uSnBhQ29ubmVjdGlvbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgSmRiY1Byb3BlcnRpZXNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFDb25uZWN0aW9uMl8wPgotewotCXB1YmxpYyBKZGJjUHJvcGVydGllc0NvbXBvc2l0ZShQYW5lPEpwYUNvbm5lY3Rpb24yXzA+IHBhcmVudENvbXBvc2l0ZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFBhbmVFbmFibGVySG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm0oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTDsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oCi0JCQlidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpLCAKLQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSwgCi0JCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkUGVyc2lzdGVuY2VVbml0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFDb25uZWN0aW9uMl8wLCBQZXJzaXN0ZW5jZVVuaXQ+KGdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkVGl0bGVkR3JvdXAoCi0JCQlhZGRTdWJQYW5lKGNvbnRhaW5lciwgMTApLAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkpkYmNQcm9wZXJ0aWVzQ29tcG9zaXRlX0pkYmNDb25uZWN0aW9uUHJvcGVydGllc19Hcm91cEJveAotCQkpOwotCi0JCW5ldyBKZGJjQ29ubmVjdGlvblByb3BlcnRpZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQotCQl0aGlzLmluc3RhbGxQYW5lRW5hYmxlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUGFuZUVuYWJsZXIoKSB7Ci0JCW5ldyBQYW5lRW5hYmxlcihidWlsZFBhbmVFbmFibGVySG9sZGVyKCksIHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2UvY29ubmVjdGlvbi9UcmFuc2FjdGlvblR5cGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTliMTViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9jb25uZWN0aW9uL1RyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLmNvbm5lY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZQotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFDb25uZWN0aW9uMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VHJhbnNhY3Rpb25UeXBlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZSgKLQkJCQkJUGFuZTw/IGV4dGVuZHMgSnBhQ29ubmVjdGlvbjJfMD4gcGFyZW50Q29tcG9zaXRlLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIoIHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXJldHVybiBuZXcgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4odGhpcywgCi0JCQkJCQkJCQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXRIb2xkZXIoKSwgCi0JCQkJCQkJCQkJCWNvbnRhaW5lcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBhZGRQcm9wZXJ0eU5hbWVzKENvbGxlY3Rpb248U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7Ci0JCQkJc3VwZXIuYWRkUHJvcGVydHlOYW1lcyhwcm9wZXJ0eU5hbWVzKTsKLQkJCQlwcm9wZXJ0eU5hbWVzLmFkZChQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5ERUZBVUxUX1RSQU5TQUNUSU9OX1RZUEVfUFJPUEVSVFkpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUudmFsdWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIEpUQSA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlRyYW5zYWN0aW9uVHlwZUNvbXBvc2l0ZV9qdGE7Ci0JCQkJCWNhc2UgUkVTT1VSQ0VfTE9DQUwgOgotCQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfcmVzb3VyY2VfbG9jYWw7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUodmFsdWUpOwotCi0JCQkJaWYgKHZhbHVlID09IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCkgewotCQkJCQljbGVhckpUQVByb3BlcnRpZXMoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNsZWFyUmVzb3VyY2VMb2NhbFByb3BlcnRpZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBidWlsZFBlcnNpc3RlbmNlVW5pdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhQ29ubmVjdGlvbjJfMCwgUGVyc2lzdGVuY2VVbml0Pih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFySlRBUHJvcGVydGllcygpIHsKLQkJdGhpcy5nZXRTdWJqZWN0KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0SnRhRGF0YVNvdXJjZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYXJSZXNvdXJjZUxvY2FsUHJvcGVydGllcygpIHsKLQkJSnBhQ29ubmVjdGlvbjJfMCBjb25uZWN0aW9uID0gdGhpcy5nZXRTdWJqZWN0KCk7Ci0JCWNvbm5lY3Rpb24uZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0Tm9uSnRhRGF0YVNvdXJjZShudWxsKTsKLQkJY29ubmVjdGlvbi5zZXREcml2ZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0VXJsKG51bGwpOwotCQljb25uZWN0aW9uLnNldFVzZXIobnVsbCk7Ci0JCWNvbm5lY3Rpb24uc2V0UGFzc3dvcmQobnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dCggQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZSgKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5UcmFuc2FjdGlvblR5cGVDb21wb3NpdGVfdHJhbnNhY3Rpb25UeXBlTGFiZWwsCi0JCQl0aGlzLmJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oIGNvbnRhaW5lciksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgkvLyBUT0RPIC0gUmV2aWV3IGZvciBKUEEgMi4wCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMmI2NGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFPcHRpb25zMl8wPgotewotCXB1YmxpYyBHZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZSgKLQkJCQkJUGFuZTxKcGFPcHRpb25zMl8wPiBzdWJqZWN0SG9sZGVyLAotCQkJCQlDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJCQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIGZhbHNlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5pbml0aWFsaXplTWlzY2VsbGFuZW91c1BhbmUocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1pc2NlbGxhbmVvdXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsJCi0JCQotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCXRoaXMudXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKLQkJCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB0aGlzLmFkZFNlY3Rpb24oY29udGFpbmVyLCAKLQkJCUpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc0NvbXBvc2l0ZV9taXNjZWxsYW5lb3VzU2VjdGlvblRpdGxlLAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlX21pc2NlbGxhbmVvdXNTZWN0aW9uRGVzY3JpcHRpb24pOwotCQkKLQkJdGhpcy51cGRhdGVHcmlkRGF0YShjb21wb3NpdGUpOwotCQl0aGlzLnVwZGF0ZUdyaWREYXRhKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSk7Ci0KLQkJbmV3IExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0JCW5ldyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUodGhpcywgY29tcG9zaXRlKTsKLQkJbmV3IFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlKHRoaXMsIGNvbXBvc2l0ZSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWdyaWREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTU4MzcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfME9wdGlvbnNUYWIKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiIGV4dGVuZHMgUGFuZTxKcGFPcHRpb25zMl8wPgotCWltcGxlbWVudHMgSnBhUGFnZUNvbXBvc2l0ZQotewotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzL2luaXRpYWxpemF0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiKAotCQkJCQkJCQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhT3B0aW9uczJfMD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJbmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zQ29tcG9zaXRlKHRoaXMsIHBhcmVudCk7Ci0KLQl9Ci0KLQkvLyAqKioqKioqKioqIExheW91dCAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpblRvcCA9IDA7Ci0JCWxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkJvdHRvbSA9IDA7Ci0JCWxheW91dC5tYXJnaW5SaWdodCA9IDA7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxNTsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRoaXMuYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJR3JpZERhdGEgZ3JpZERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBKcGFQYWdlQ29tcG9zaXRlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gbnVsbDsJCQkJCQkvLyBUT0RPIC0gUmV2aWV3IGZvciBKUEEgMi4wCi0JfQotCQotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0UGFnZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlVGV4dCgpIHsKLQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5HZW5lcmljUGVyc2lzdGVuY2VVbml0Ml8wT3B0aW9uc1RhYl90aXRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvTG9ja2luZ0NvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjNTJhNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuSW50ZWdlckNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhT3B0aW9uczJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkxvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIExvY2tpbmdDb25maWd1cmF0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBKcGFPcHRpb25zMl8wPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYWRkTG9ja1RpbWVvdXRDb21ibyhwYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkTG9ja1RpbWVvdXRDb21ibyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW5ldyBJbnRlZ2VyQ29tYm88SnBhT3B0aW9uczJfMD4odGhpcywgcGFyZW50KSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRMYWJlbFRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5Mb2NraW5nQ29uZmlndXJhdGlvbkNvbXBvc2l0ZV9sb2NrVGltZW91dExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0TG9ja1RpbWVvdXQoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEludGVnZXI+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYU9wdGlvbnMyXzAsIEludGVnZXI+KHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBKcGFPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEludGVnZXIgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldExvY2tUaW1lb3V0KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRMb2NrVGltZW91dCh2YWx1ZSk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9RdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1F1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzA3ZDk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1F1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkludGVnZXJDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqICBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8SnBhT3B0aW9uczJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlF1ZXJ5Q29uZmlndXJhdGlvbkNvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50Q29udHJvbGxlcgotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBRdWVyeUNvbmZpZ3VyYXRpb25Db21wb3NpdGUoCi0JCQkJCVBhbmU8PyBleHRlbmRzIEpwYU9wdGlvbnMyXzA+IHBhcmVudENvbXBvc2l0ZSwKLQkJCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudENvbXBvc2l0ZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5hZGRRdWVyeVRpbWVvdXRDb21ibyhwYXJlbnQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkUXVlcnlUaW1lb3V0Q29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQluZXcgSW50ZWdlckNvbWJvPEpwYU9wdGlvbnMyXzA+KHRoaXMsIHBhcmVudCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgZ2V0TGFiZWxUZXh0KCkgewotCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuUXVlcnlDb25maWd1cmF0aW9uQ29tcG9zaXRlX3F1ZXJ5VGltZW91dExhYmVsOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBnZXRIZWxwSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7CQkvLyBUT0RPCi0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZERlZmF1bHRIb2xkZXIoKSB7Ci0JCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhT3B0aW9uczJfMCwgSW50ZWdlcj4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJbnRlZ2VyIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXREZWZhdWx0UXVlcnlUaW1lb3V0KCk7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxJbnRlZ2VyPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBJbnRlZ2VyPih0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSW50ZWdlciBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0UXVlcnlUaW1lb3V0KCk7Ci0JCQkJCX0KLQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEludGVnZXIgdmFsdWUpIHsKLQkJCQkJCXRoaXMuc3ViamVjdC5zZXRRdWVyeVRpbWVvdXQodmFsdWUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCX0KLQkJfTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhMjMxNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLnBlcnNpc3RlbmNlLm9wdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5FbnVtRm9ybUNvbWJvVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlCi0gKi8KLXB1YmxpYyBjbGFzcyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFBlcnNpc3RlbmNlVW5pdDJfMD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8+IHBhcmVudFBhbmUsCi0JCQkgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0Ml8wPiBzdWJqZWN0SG9sZGVyLAotCQkJICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQlzdXBlcihwYXJlbnRQYW5lLCBzdWJqZWN0SG9sZGVyLCBwYXJlbnQpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJdGhpcy5hZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJcGFyZW50LAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlNoYXJlZENhY2hlTW9kZUNvbXBvc2l0ZV9zaGFyZWRDYWNoZU1vZGVMYWJlbCwKLQkJCXRoaXMuYWRkU2hhcmVkQ2FjaGVNb2RlQ29tYm8ocGFyZW50KSwKLQkJCW51bGwJCQkvLyBUT0RPCi0JCSk7Ci0JfQotCQotCXByaXZhdGUgRW51bUZvcm1Db21ib1ZpZXdlcjxQZXJzaXN0ZW5jZVVuaXQyXzAsIFNoYXJlZENhY2hlTW9kZT4gYWRkU2hhcmVkQ2FjaGVNb2RlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgU2hhcmVkQ2FjaGVNb2RlPih0aGlzLCB0aGlzLmdldFN1YmplY3RIb2xkZXIoKSwgcGFyZW50KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdDJfMC5TUEVDSUZJRURfU0hBUkVEX0NBQ0hFX01PREVfUFJPUEVSVFkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGVbXSBnZXRDaG9pY2VzKCkgewotCQkJCXJldHVybiBTaGFyZWRDYWNoZU1vZGUudmFsdWVzKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGJvb2xlYW4gc29ydENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTaGFyZWRDYWNoZU1vZGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0U2hhcmVkQ2FjaGVNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBkaXNwbGF5U3RyaW5nKFNoYXJlZENhY2hlTW9kZSB2YWx1ZSkgewotCQkJCXN3aXRjaCAodmFsdWUpIHsKLQkJCQkJY2FzZSBBTEwgOgotCQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfYWxsOwotCQkJCQljYXNlIERJU0FCTEVfU0VMRUNUSVZFIDoKLQkJCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX2Rpc2FibGVfc2VsZWN0aXZlOwotCQkJCQljYXNlIEVOQUJMRV9TRUxFQ1RJVkUgOgotCQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfZW5hYmxlX3NlbGVjdGl2ZTsKLQkJCQkJY2FzZSBOT05FIDoKLQkJCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuU2hhcmVkQ2FjaGVNb2RlQ29tcG9zaXRlX25vbmU7Ci0JCQkJCWNhc2UgVU5TUEVDSUZJRUQgOgotCQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5TaGFyZWRDYWNoZU1vZGVDb21wb3NpdGVfdW5zcGVjaWZpZWQ7Ci0JCQkJCWRlZmF1bHQgOgotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU2hhcmVkQ2FjaGVNb2RlIGdldFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShTaGFyZWRDYWNoZU1vZGUgdmFsdWUpIHsKLQkJCQl0aGlzLmdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGVyc2lzdGVuY2Uvb3B0aW9ucy9WYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTU0NzI0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2Uub3B0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5KcHRDb21tb25VaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLkpwYU9wdGlvbnMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiAgVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxKcGFPcHRpb25zMl8wPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VmFsaWRhdGlvbkdyb3VwQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRDb250cm9sbGVyCi0JICogICAgICAgICAgICBUaGUgcGFyZW50IGNvbnRhaW5lciBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlKAotCQkJCQlQYW5lPD8gZXh0ZW5kcyBKcGFPcHRpb25zMl8wPiBwYXJlbnRDb21wb3NpdGUsCi0JCQkJCUNvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlzdXBlcihwYXJlbnRDb21wb3NpdGUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gU2hhcmVkQ2FjaGVNb2RlCi0JCW5ldyBTaGFyZWRDYWNoZU1vZGVDb21wb3NpdGUodGhpcywgdGhpcy5idWlsZFBlcnNpc3RlbmNlVW5pdDJfMEhvbGRlcigpLCBwYXJlbnQpOwotCi0JCS8vIFZhbGlkYXRpb25Nb2RlCi0JCW5ldyBWYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZSh0aGlzLCB0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0Ml8wSG9sZGVyKCksIHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdAotCQl0aGlzLmFkZEdyb3VwUHJlUGVyc2lzdExpc3RQYW5lKHBhcmVudCk7Ci0KLQkJLy8gVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlCi0JCXRoaXMuYWRkR3JvdXBQcmVVcGRhdGVMaXN0UGFuZShwYXJlbnQpOwotCi0JCS8vIFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZQotCQl0aGlzLmFkZEdyb3VwUHJlUmVtb3ZlTGlzdFBhbmUocGFyZW50KTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzICoqKioqKioqKioKLQkKLQlwcml2YXRlIHZvaWQgYWRkR3JvdXBQcmVQZXJzaXN0TGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUGVyc2lzdExhYmVsLAotCQkJdGhpcy5hZGRQcmVQZXJzaXN0TGlzdFBhbmUocGFyZW50KSwKLQkJCW51bGwJLy8gVE9ETyBIZWxwCi0JCQkpOwotCX0KLQkKLQlwcml2YXRlIEFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+IGFkZFByZVBlcnNpc3RMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVQZXJzaXN0QWRhcHRlcigpLAotCQkJdGhpcy5idWlsZFByZVBlcnNpc3RMaXN0SG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCksCi0JCQl0aGlzLmJ1aWxkTGFiZWxQcm92aWRlcigpCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICA9IChHcmlkRGF0YSkgY29udGFpbmVyLmdldExheW91dERhdGEoKTsKLQkJCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gNzU7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBsaXN0UGFuZTsKLQl9Ci0KLQlwcml2YXRlIEFkYXB0ZXIgYnVpbGRQcmVQZXJzaXN0QWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVQZXJzaXN0Q2xhc3MobGlzdFNlbGVjdGlvbk1vZGVsKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KChTdHJpbmcpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQcmVQZXJzaXN0TGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxTdHJpbmc+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVBlcnNpc3RDbGFzcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJSVR5cGUgdHlwZSA9IHRoaXMuY2hvb3NlVHlwZSgpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSB0eXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgnJCcpOwotCQkJaWYoICEgdGhpcy5nZXRTdWJqZWN0KCkudmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdEV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJCi0JCQkJU3RyaW5nIGNsYXNzUmVmID0gdGhpcy5nZXRTdWJqZWN0KCkuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZEdyb3VwUHJlVXBkYXRlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlVXBkYXRlTGFiZWwsCi0JCQl0aGlzLmFkZFByZVVwZGF0ZUxpc3RQYW5lKHBhcmVudCksCi0JCQludWxsCS8vIFRPRE8gSGVscAotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxKcGFPcHRpb25zMl8wPiBhZGRQcmVVcGRhdGVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVVcGRhdGVBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJlVXBkYXRlTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGlzdFBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUHJlVXBkYXRlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVVcGRhdGVDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJlVXBkYXRlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVVwZGF0ZUNsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZEdyb3VwUHJlUmVtb3ZlTGlzdFBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXRoaXMuYWRkTGFiZWxlZENvbXBvc2l0ZShwYXJlbnQsIAotCQkJSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29tcG9zaXRlX2dyb3VwUHJlUmVtb3ZlTGFiZWwsCi0JCQl0aGlzLmFkZFByZVJlbW92ZUxpc3RQYW5lKHBhcmVudCksCi0JCQludWxsCS8vIFRPRE8gSGVscAotCQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBBZGRSZW1vdmVMaXN0UGFuZTxKcGFPcHRpb25zMl8wPiBhZGRQcmVSZW1vdmVMaXN0UGFuZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJLy8gTGlzdCBwYW5lCi0JCUFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+IGxpc3RQYW5lID0gbmV3IEFkZFJlbW92ZUxpc3RQYW5lPEpwYU9wdGlvbnMyXzA+KAotCQkJdGhpcywKLQkJCXBhcmVudCwKLQkJCXRoaXMuYnVpbGRQcmVSZW1vdmVBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkUHJlUmVtb3ZlTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKQotCQkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVRhYmxlKFRhYmxlIHRhYmxlKSB7Ci0JCQkJc3VwZXIuaW5pdGlhbGl6ZVRhYmxlKHRhYmxlKTsKLQotCQkJCUNvbXBvc2l0ZSBjb250YWluZXIgPSB0YWJsZS5nZXRQYXJlbnQoKTsKLQkJCQlHcmlkRGF0YSBncmlkRGF0YSAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCQlyZXR1cm4gbGlzdFBhbmU7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkUHJlUmVtb3ZlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRQcmVSZW1vdmVDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgoU3RyaW5nKSBpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUHJlUmVtb3ZlTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxKcGFPcHRpb25zMl8wLCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFN0cmluZz4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByZVJlbW92ZUNsYXNzKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQotCQlJVHlwZSB0eXBlID0gdGhpcy5jaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZiggISB0aGlzLmdldFN1YmplY3QoKS52YWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVFeGlzdHMoY2xhc3NOYW1lKSkgewotCQkJCQotCQkJCVN0cmluZyBjbGFzc1JlZiA9IHRoaXMuZ2V0U3ViamVjdCgpLmFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShjbGFzc05hbWUpOwotCQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBQcml2YXRlIG1ldGhvZHMgKioqKioqKioqKgotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdDJfMD4gYnVpbGRQZXJzaXN0ZW5jZVVuaXQyXzBIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYU9wdGlvbnMyXzAsIFBlcnNpc3RlbmNlVW5pdDJfMD4odGhpcy5nZXRTdWJqZWN0SG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdDJfMCBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgdGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbGVtZW50OwotCi0JCQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJCQluYW1lID0gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLkdlbmVyaWNQZXJzaXN0ZW5jZVVuaXQyXzBPcHRpb25zVGFiX25vTmFtZTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciB0aGUgT3BlbiBUeXBlIGRpYWxvZy4KLQkgKgotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBzZWxlY3RlZCB0eXBlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSB1c2VyCi0JICogY2FuY2VsZWQgdGhlIGRpYWxvZwotCSAqLwotCXByaXZhdGUgSVR5cGUgY2hvb3NlVHlwZSgpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFtdIHsgamF2YVByb2plY3QgfTsKLQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlJUHJvZ3Jlc3NTZXJ2aWNlIHNlcnZpY2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFByb2dyZXNzU2VydmljZSgpOwotCQlTZWxlY3Rpb25EaWFsb2cgdHlwZVNlbGVjdGlvbkRpYWxvZzsKLQotCQl0cnkgewotCQkJdHlwZVNlbGVjdGlvbkRpYWxvZyA9IEphdmFVSS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCWdldFNoZWxsKCksCi0JCQkJc2VydmljZSwKLQkJCQlzY29wZSwKLQkJCQlJSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHMuQ09OU0lERVJfQ0xBU1NFUywKLQkJCQlmYWxzZSwKLQkJCQkiIgotCQkJKTsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRUaXRsZShKcHRDb21tb25VaU1lc3NhZ2VzLkNsYXNzQ2hvb3NlclBhbmVfZGlhbG9nVGl0bGUpOwotCQl0eXBlU2VsZWN0aW9uRGlhbG9nLnNldE1lc3NhZ2UoSnB0Q29tbW9uVWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ01lc3NhZ2UpOwotCi0JCWlmICh0eXBlU2VsZWN0aW9uRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCXJldHVybiAoSVR5cGUpIHR5cGVTZWxlY3Rpb25EaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wZXJzaXN0ZW5jZS9vcHRpb25zL1ZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMTVkNDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcGEyL3BlcnNpc3RlbmNlL29wdGlvbnMvVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wZXJzaXN0ZW5jZS5vcHRpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5WYWxpZGF0aW9uTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwYTIucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiAgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQyXzA+Ci17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBhcmVudENvbnRyb2xsZXIKLQkgKiAgICAgICAgICAgIFRoZSBwYXJlbnQgY29udGFpbmVyIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1vZGVDb21wb3NpdGUoCi0JCQkJCVBhbmU8Pz4gcGFyZW50UGFuZSwKLQkJCSAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXQyXzA+IHN1YmplY3RIb2xkZXIsCi0JCQkgICAgICAgIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCXN1cGVyKHBhcmVudFBhbmUsIHN1YmplY3RIb2xkZXIsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQotCQl0aGlzLmFkZExhYmVsZWRDb21wb3NpdGUoCi0JCQlwYXJlbnQsCi0JCQlKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfdmFsaWRhdGlvbk1vZGVMYWJlbCwKLQkJCXRoaXMuYWRkVmFsaWRhdGlvbk1vZGVDb21ibyhwYXJlbnQpLAotCQkJbnVsbAkJCS8vIFRPRE8KLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+IGFkZFZhbGlkYXRpb25Nb2RlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJcmV0dXJuIG5ldyBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdDJfMCwgVmFsaWRhdGlvbk1vZGU+KHRoaXMsIHRoaXMuZ2V0U3ViamVjdEhvbGRlcigpLCBwYXJlbnQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGVydHlOYW1lcyhDb2xsZWN0aW9uPFN0cmluZz4gcHJvcGVydHlOYW1lcykgewotCQkJCXN1cGVyLmFkZFByb3BlcnR5TmFtZXMocHJvcGVydHlOYW1lcyk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0Ml8wLlNQRUNJRklFRF9WQUxJREFUSU9OX01PREVfUFJPUEVSVFkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFZhbGlkYXRpb25Nb2RlLnZhbHVlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBib29sZWFuIHNvcnRDaG9pY2VzKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgVmFsaWRhdGlvbk1vZGUgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQkJCXJldHVybiB0aGlzLmdldFN1YmplY3QoKS5nZXREZWZhdWx0VmFsaWRhdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoVmFsaWRhdGlvbk1vZGUgdmFsdWUpIHsKLQkJCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQkJCWNhc2UgQVVUTyA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZTJfME1lc3NhZ2VzLlZhbGlkYXRpb25Nb2RlQ29tcG9zaXRlX2F1dG87Ci0JCQkJCWNhc2UgQ0FMTEJBQ0sgOgotCQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2UyXzBNZXNzYWdlcy5WYWxpZGF0aW9uTW9kZUNvbXBvc2l0ZV9jYWxsYmFjazsKLQkJCQkJY2FzZSBOT05FIDoKLQkJCQkJCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlMl8wTWVzc2FnZXMuVmFsaWRhdGlvbk1vZGVDb21wb3NpdGVfbm9uZTsKLQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBWYWxpZGF0aW9uTW9kZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5nZXRTdWJqZWN0KCkuZ2V0U3BlY2lmaWVkVmFsaWRhdGlvbk1vZGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShWYWxpZGF0aW9uTW9kZSB2YWx1ZSkgewotCQkJCXRoaXMuZ2V0U3ViamVjdCgpLnNldFNwZWNpZmllZFZhbGlkYXRpb25Nb2RlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwYTIvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMThiMjVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBhMi9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFQbGF0Zm9ybVVpUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNKcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5HZW5lcmljTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkgaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpRmFjdG9yeQotewotCi0JLyoqCi0JICogWmVybyBhcmcgY29uc3RydWN0b3IgZm9yIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBHZW5lcmljMl8wSnBhUGxhdGZvcm1VaUZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEpwYVBsYXRmb3JtVWkgYnVpbGRKcGFQbGF0Zm9ybVVpKCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNKcGFQbGF0Zm9ybVVpKAotCQkJbmV3IEdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcigpLAotCQkJR2VuZXJpYzJfMEpwYVBsYXRmb3JtVWlQcm92aWRlci5pbnN0YW5jZSgpCi0JCSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL0pwYUpwcWxDb250ZW50UHJvcG9zYWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL0pwYUpwcWxDb250ZW50UHJvcG9zYWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTFmNDgwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBxbC9KcGFKcHFsQ29udGVudFByb3Bvc2FsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBxbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkFic3RyYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuSUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcy5QYXJhbWV0ZXJpemVkQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLkV2YWx1YXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5FeHByZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuRXhwcmVzc2lvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5JRXZhbHVhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3MuQmluZGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5iaW5kaW5ncy5UcmlnZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuU1dUS2V5U3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5Db250cm9sRGVjb3JhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5GaWVsZERlY29yYXRpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5pbnRlcm5hbC50ZXh0Lmh0bWwuSFRNTFRleHRQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0VGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkRlZmF1bHRBbm5vdGF0aW9uSG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Ib3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwubGlzdGVuZXJzLlNXVFByb3BlcnR5Q2hhbmdlTGlzdGVuZXJXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkpQUUxRdWVyeVByb2JsZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLklIYW5kbGVyQWN0aXZhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oYW5kbGVycy5JSGFuZGxlclNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9ycy50ZXh0LkVkaXRvcnNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkua2V5cy5JQmluZGluZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc3d0LklGb2N1c1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Bbm5vdGF0aW9uUHJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkRlZmF1bHRNYXJrZXJBbm5vdGF0aW9uQWNjZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQ7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpbnN0YWxscyBjb250ZW50IGFzc2lzdCBzdXBwb3J0IG9uIGEge0BsaW5rIFN0eWxlZFRleHR9IHdpZGdldCBpbiBvcmRlciB0byBnaXZlCi0gKiBjaG9pY2VzIGF0IGFueSBnaXZlbiBwb3NpdGlvbiB3aXRoaW4gYSBKUFFMIHF1ZXJ5LgotICogPHA+Ci0gKiBUT0RPLiBBZGQgc3ludGF4IGhpZ2hsaWdodCBmb3IgdGhlIEpQUUwgaWRlbnRpZmllcnMuCi0gKgotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoeyJubHMiLCAicmVzdHJpY3Rpb24ifSkKLXB1YmxpYyBmaW5hbCBjbGFzcyBKcGFKcHFsQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgZXh0ZW5kcyBKcHFsQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI8SUNvbXBsZXRpb25Qcm9wb3NhbD4gewotCi0JLyoqCi0JICogVGhpcyBtb2RlbCBob2xkcyBvbnRvIHRoZSB7QGxpbmsgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc30gdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBmb3IgZWFjaAotCSAqIHtAbGluayBKUFFMUXVlcnlQcm9ibGVtfQotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbDsKLQotCS8qKgotCSAqIFRoZSBkZWNvcmF0aW9uIHN1cHBvcnQgcmVxdWlyZWQgdG8gcGFpbnQgdGhlIHtAbGluayBBbm5vdGF0aW9uIGFubm90YXRpb25zfSwgd2hpY2ggYXJlIHRoZQotCSAqIEpQUUwgcHJvYmxlbXMuCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCBkZWNvcmF0aW9uU3VwcG9ydDsKLQotCS8qKgotCSAqIFRoaXMgaGFuZGxlciB3aWxsIHRyaWdnZXIgYW4gZXZlbnQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbm90aWZ5IHRoZSB7QGxpbmsgU291cmNlVmlld2VyfSB0bwotCSAqIGludm9rZSB0aGUgY29udGVudCBhc3Npc3QuCi0JICovCi0JcHJpdmF0ZSBJSGFuZGxlckFjdGl2YXRpb24gaGFuZGxlckFjdGl2YXRpb247Ci0KLQkvKioKLQkgKiBUaGUgcG9zaXRpb24gd2l0aGluIHRoZSBKUFFMIHF1ZXJ5LgotCSAqLwotCXByaXZhdGUgaW50IHBvc2l0aW9uOwotCi0JLyoqCi0JICogVGhlIGhvbGRlciBvZiB0aGUgbmFtZWQgcXVlcnkuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIE5hbWVkUXVlcnk+IHF1ZXJ5SG9sZGVyOwotCi0JLyoqCi0JICogVGhlIHtAbGluayBSZXNvdXJjZUJ1bmRsZX0gdGhhdCBjb250YWlucyB0aGUgSlBRTCBwcm9ibGVtcy4KLQkgKi8KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JLyoqCi0JICogVGhpcyB2aWV3ZXIgaXMgdXNlZCB0byBpbnN0YWxsIHZhcmlvdXMgZnVuY3Rpb25hbGl0eSBvdmVyIHRoZSB7QGxpbmsgU3R5bGVkVGV4dH0uCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyOwotCi0JLyoqCi0JICogVGhlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHVzZWQgdG8gY29uZmlndXJlIHRoZSB7QGxpbmsgU291cmNlVmlld2VyfS4KLQkgKi8KLQlwcml2YXRlIEpwcWxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0KLQkvKioKLQkgKiBUaGUgd2lkZ2V0IHVzZWQgdG8gZGlzcGxheSB0aGUgSlBRTCBxdWVyeS4KLQkgKi8KLQlwcml2YXRlIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQotCS8qKgotCSAqIFRoaXMgbGlzdGVuZXIgaXMgdXNlZCB0byBkaXNwb3NlIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuSlBRTFF1ZXJ5SGVscGVyCi0JICogSlBRTFF1ZXJ5SGVscGVyfSB3aGVuIHRoZSBzdWJqZWN0IGNoYW5nZXMgYW5kIHRvIHJlc2V0IHRoZSB1bmRvIG1hbmFnZXIgaW4gb3JkZXIgdG8gcHJldmVudAotCSAqIHRoZSBxdWVyeSBmcm9tIGJlaW5nIGVudGlyZWx5IGRlbGV0ZWQgd2l0aCBhbiB1bmRvLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzdWJqZWN0Q2hhbmdlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgaG9sZGVyIG9mIHRoZSBKUFFMIHF1ZXJ5LgotCSAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB0ZXh0SG9sZGVyOwotCi0JLyoqCi0JICogTGlzdGVucyB0byB0aGUgSlBRTCBxdWVyeSBhbmQga2VlcCB0aGUge0BsaW5rIERvY3VtZW50fSBpbiBzeW5jLgotCSAqLwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB0ZXh0TGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgLSBhcHBlbmRlZCBieSBoYXNoQ29kZSgpIC0gdXNlZCB0byByZWdpc3RlciB0aGUgd2lkZ2V0IHdpdGggdGhlIGZvY3VzCi0JICogaGFuZGxlci4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVFJPTF9JRCA9ICJqcHFsLmZvY3VzLmNvbnRyb2wiOwotCi0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIHVzZWQgdG8gbWFyayBhbiB7QGxpbmsgQW5ub3RhdGlvbn0gYXMgYSBKUFFMIHByb2JsZW0uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1RZUEUgPSAib3JnLmVjbGlwc2UuamR0LnVpLmVycm9yIjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhSnBxbENvbnRlbnRQcm9wb3NhbFByb3ZpZGVyPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB7QGxpbmsgQ29tcG9zaXRlfSB3aGVyZSB0byBhZGQgdGhlIEpQUUwgcXVlcnkgZWRpdG9yCi0JICogQHBhcmFtIHF1ZXJ5SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhlIG5hbWVkIHF1ZXJ5Ci0JICogQHBhcmFtIHRleHRIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgSlBRTCBxdWVyeQotCSAqLwotCXB1YmxpYyBKcGFKcHFsQ29udGVudFByb3Bvc2FsUHJvdmlkZXIoQ29tcG9zaXRlIHBhcmVudCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVNb2RlbDw/IGV4dGVuZHMgTmFtZWRRdWVyeT4gcXVlcnlIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKHBhcmVudCwgcXVlcnlIb2xkZXIsIHRleHRIb2xkZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhY3RpdmF0ZUhhbmRsZXIoKSB7Ci0KLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJRm9jdXNTZXJ2aWNlIGZvY3VzU2VydmljZSA9IChJRm9jdXNTZXJ2aWNlKSB3b3JrYmVuY2guZ2V0U2VydmljZShJRm9jdXNTZXJ2aWNlLmNsYXNzKTsKLQkJSUhhbmRsZXJTZXJ2aWNlIGhhbmRsZXJTZXJ2aWNlID0gKElIYW5kbGVyU2VydmljZSkgd29ya2JlbmNoLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKLQotCQlpZiAoKGZvY3VzU2VydmljZSAhPSBudWxsKSAmJiAoaGFuZGxlclNlcnZpY2UgIT0gbnVsbCkpIHsKLQotCQkJZm9jdXNTZXJ2aWNlLmFkZEZvY3VzVHJhY2tlcihzdHlsZWRUZXh0LCBDT05UUk9MX0lEICsgaGFzaENvZGUoKSk7Ci0KLQkJCUV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGJ1aWxkRXhwcmVzc2lvbigpOwotCQkJSUhhbmRsZXIgaGFuZGxlciA9IGJ1aWxkSGFuZGxlcigpOwotCi0JCQloYW5kbGVyQWN0aXZhdGlvbiA9IGhhbmRsZXJTZXJ2aWNlLmFjdGl2YXRlSGFuZGxlcigKLQkJCQlJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTLAotCQkJCWhhbmRsZXIsCi0JCQkJZXhwcmVzc2lvbgotCQkJKTsKLQotCQkJaGFuZGxlckFjdGl2YXRpb24gPSBoYW5kbGVyU2VydmljZS5hY3RpdmF0ZUhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5VTkRPLmdldENvbW1hbmRJZCgpLAotCQkJCWhhbmRsZXIsCi0JCQkJZXhwcmVzc2lvbgotCQkJKTsKLQotCQkJaGFuZGxlckFjdGl2YXRpb24gPSBoYW5kbGVyU2VydmljZS5hY3RpdmF0ZUhhbmRsZXIoCi0JCQkJQWN0aW9uRmFjdG9yeS5SRURPLmdldENvbW1hbmRJZCgpLAotCQkJCWhhbmRsZXIsCi0JCQkJZXhwcmVzc2lvbgotCQkJKTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgTGlzdDxBbm5vdGF0aW9uUHJlZmVyZW5jZT4gYW5ub3RhdGlvblByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRWRpdG9yc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TWFya2VyQW5ub3RhdGlvblByZWZlcmVuY2VzKCkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwb3NlTGlzdGVuZXIgYnVpbGREaXNwb3NlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQlkaXNwb3NlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBidWlsZERvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgSURvY3VtZW50TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJfQotCQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCQl0cnkgewotCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJCQlTdHJpbmcgdGV4dCA9IGRvY3VtZW50LmdldCgwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJCXRleHRIb2xkZXIuc2V0VmFsdWUodGV4dCk7Ci0JCQkJCXZhbGlkYXRlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFNpbXBseSBpZ25vcmUsIHNob3VsZCBuZXZlciBoYXBwZW4KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBFeHByZXNzaW9uIGJ1aWxkRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIG5ldyBFeHByZXNzaW9uKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0RXhwcmVzc2lvbkluZm8oRXhwcmVzc2lvbkluZm8gaW5mbykgewotCQkJCWluZm8uYWRkVmFyaWFibGVOYW1lQWNjZXNzKElTb3VyY2VzLkFDVElWRV9GT0NVU19DT05UUk9MX05BTUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgRXZhbHVhdGlvblJlc3VsdCBldmFsdWF0ZShJRXZhbHVhdGlvbkNvbnRleHQgY29udGV4dCkgewotCQkJCU9iamVjdCB2YXJpYWJsZSA9IGNvbnRleHQuZ2V0VmFyaWFibGUoSVNvdXJjZXMuQUNUSVZFX0ZPQ1VTX0NPTlRST0xfTkFNRSk7Ci0JCQkJcmV0dXJuICh2YXJpYWJsZSA9PSBzdHlsZWRUZXh0KSA/IEV2YWx1YXRpb25SZXN1bHQuVFJVRSA6IEV2YWx1YXRpb25SZXN1bHQuRkFMU0U7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJSGFuZGxlciBidWlsZEhhbmRsZXIoKSB7Ci0JCXJldHVybiBuZXcgQWJzdHJhY3RIYW5kbGVyKCkgewotCQkJcHVibGljIE9iamVjdCBleGVjdXRlKEV4ZWN1dGlvbkV2ZW50IGV2ZW50KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKLQkJCQlTdHJpbmcgY29tbWFuZElkID0gZXZlbnQuZ2V0Q29tbWFuZCgpLmdldElkKCk7Ci0KLQkJCQkvLyBDb250ZW50IEFzc2lzdAotCQkJCWlmIChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTLmVxdWFscyhjb21tYW5kSWQpKSB7Ci0JCQkJCXNvdXJjZVZpZXdlci5kb09wZXJhdGlvbihJU291cmNlVmlld2VyLkNPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKTsKLQkJCQl9Ci0JCQkJLy8gVW5kbwotCQkJCWVsc2UgaWYgKEFjdGlvbkZhY3RvcnkuVU5ETy5nZXRDb21tYW5kSWQoKS5lcXVhbHMoY29tbWFuZElkKSkgewotCQkJCQlpZiAoc291cmNlVmlld2VyLmdldFVuZG9NYW5hZ2VyKCkudW5kb2FibGUoKSkgewotCQkJCQkJc291cmNlVmlld2VyLmdldFVuZG9NYW5hZ2VyKCkudW5kbygpOwotCQkJCQkJdmFsaWRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBSZWRvCi0JCQkJZWxzZSBpZiAoQWN0aW9uRmFjdG9yeS5SRURPLmdldENvbW1hbmRJZCgpLmVxdWFscyhjb21tYW5kSWQpKSB7Ci0JCQkJCWlmIChzb3VyY2VWaWV3ZXIuZ2V0VW5kb01hbmFnZXIoKS5yZWRvYWJsZSgpKSB7Ci0JCQkJCQlzb3VyY2VWaWV3ZXIuZ2V0VW5kb01hbmFnZXIoKS5yZWRvKCk7Ci0JCQkJCQl2YWxpZGF0ZSgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRNZXNzYWdlKEpQUUxRdWVyeVByb2JsZW0gcHJvYmxlbSkgewotCQlTdHJpbmcgbWVzc2FnZSA9IHJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKHByb2JsZW0uZ2V0TWVzc2FnZUtleSgpKTsKLQkJbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KG1lc3NhZ2UsIChPYmplY3RbXSkgcHJvYmxlbS5nZXRNZXNzYWdlQXJndW1lbnRzKCkpOwotCQlyZXR1cm4gbWVzc2FnZTsKLQl9Ci0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGJ1aWxkTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxKUFFMUXVlcnlQcm9ibGVtPiBidWlsZFByb2JsZW1Db21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SlBRTFF1ZXJ5UHJvYmxlbT4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSlBRTFF1ZXJ5UHJvYmxlbSBwcm9ibGVtMSwgSlBRTFF1ZXJ5UHJvYmxlbSBwcm9ibGVtMikgewotCQkJCWludCByZXN1bHQgPSBwcm9ibGVtMS5nZXRTdGFydFBvc2l0aW9uKCkgLSBwcm9ibGVtMi5nZXRTdGFydFBvc2l0aW9uKCk7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkJCXJlc3VsdCA9IHByb2JsZW0xLmdldEVuZFBvc2l0aW9uKCkgLSBwcm9ibGVtMi5nZXRFbmRQb3NpdGlvbigpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlJQ29tcGxldGlvblByb3Bvc2FsIGJ1aWxkUHJvcG9zYWwoU3RyaW5nIHByb3Bvc2FsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZGlzcGxheVN0cmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBpbWFnZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN1cnNvck9mZnNldCkgewotCi0JCXJldHVybiBuZXcgSnBxbENvbXBsZXRpb25Qcm9wb3NhbCgKLQkJCWNvbnRlbnRBc3Npc3RQcm9wb3NhbHMsCi0JCQlwcm9wb3NhbCwKLQkJCWRpc3BsYXlTdHJpbmcsCi0JCQlhZGRpdGlvbmFsSW5mbywKLQkJCWltYWdlLAotCQkJbmFtZWRRdWVyeSwKLQkJCWFjdHVhbFF1ZXJ5LAotCQkJanBxbFF1ZXJ5LAotCQkJb2Zmc2V0LAotCQkJcG9zaXRpb24sCi0JCQljdXJzb3JPZmZzZXQsCi0JCQlmYWxzZQotCQkpOwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFN1YmplY3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCXN1YmplY3RDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRleHRMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJU3RyaW5nIHRleHQgPSAoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpOwotCQkJCWlmICh0ZXh0ID09IG51bGwpIHsKLQkJCQkJdGV4dCA9IFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklORzsKLQkJCQl9Ci0JCQkJaWYgKCFzdHlsZWRUZXh0LmdldFRleHQoKS5lcXVhbHModGV4dCkpIHsKLQkJCQkJc291cmNlVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRleHQpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBjb250ZW50QXNzaXN0SW1hZ2UoKSB7Ci0JCUZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRmllbGREZWNvcmF0aW9uUmVnaXN0cnkuZ2V0RGVmYXVsdCgpOwotCQlyZXR1cm4gcmVnaXN0cnkuZ2V0RmllbGREZWNvcmF0aW9uKEZpZWxkRGVjb3JhdGlvblJlZ2lzdHJ5LkRFQ19DT05URU5UX1BST1BPU0FMKS5nZXRJbWFnZSgpOwotCX0KLQotCS8qKgotCSAqIE1ha2VzIHN1cmUgdGhlIHtAbGluayBDb2xvcn0gdXNlZCB0byBwYWludCB0aGUgdW5kZXJseWluZyBwcm9ibGVtIGlzIGRpc3Bvc2VkIHdoZW4gdGhlCi0JICoge0BsaW5rIFN0eWxlZFRleHR9IHdpZGdldCBpcyBkaXNwb3NlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcG9zZSgpIHsKLQotCQlzZXNzaW9uRW5kZWQoKTsKLQotCQlkZWNvcmF0aW9uU3VwcG9ydC5kaXNwb3NlKCk7Ci0JCXRleHRIb2xkZXIucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRleHRMaXN0ZW5lcik7Ci0JCXF1ZXJ5SG9sZGVyLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBzdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSUhhbmRsZXJTZXJ2aWNlIGhhbmRsZXJTZXJ2aWNlID0gKElIYW5kbGVyU2VydmljZSkgd29ya2JlbmNoLmdldFNlcnZpY2UoSUhhbmRsZXJTZXJ2aWNlLmNsYXNzKTsKLQkJaGFuZGxlclNlcnZpY2UuZGVhY3RpdmF0ZUhhbmRsZXIoaGFuZGxlckFjdGl2YXRpb24pOwotCX0KLQotCXByaXZhdGUgS2V5U3Ryb2tlIGZpbmRDb250ZW50QXNzaXN0VHJpZ2dlcigpIHsKLQotCQlJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNlcnZpY2UoSUJpbmRpbmdTZXJ2aWNlLmNsYXNzKTsKLQotCQkvLyBEaWcgdGhyb3VnaCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgYmluZGluZ3MgdG8gZmluZCB0aGUgb25lIGZvciBjb250ZW50IGFzc2lzdAotCQlmb3IgKEJpbmRpbmcgYmluZGluZyA6IGJpbmRpbmdTZXJ2aWNlLmdldEJpbmRpbmdzKCkpIHsKLQkJCWlmIChpc0NvbnRlbnRBc3Npc3RCaW5kaW5nKGJpbmRpbmcpKSB7Ci0JCQkJVHJpZ2dlcltdIHRyaWdnZXJzID0gYmluZGluZy5nZXRUcmlnZ2VyU2VxdWVuY2UoKS5nZXRUcmlnZ2VycygpOwotCQkJCWlmICgodHJpZ2dlcnMgIT0gbnVsbCkgJiYgKHRyaWdnZXJzLmxlbmd0aCA+IDApKSB7Ci0JCQkJCXJldHVybiAoS2V5U3Ryb2tlKSB0cmlnZ2Vyc1swXTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBUaGUgZGVmYXVsdCB0cmlnZ2VyIHdhcyBub3QgZm91bmQsIHVzZSB0aGUgZGVmYXVsdAotCQlyZXR1cm4gS2V5U3Ryb2tlLmdldEluc3RhbmNlKFNXVC5DVFJMLCAnICcpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdpZGdldCB1c2VkIHRvIGRpc3BsYXkgdGhlIEpQUUwgcXVlcnkuCi0JICoKLQkgKiBAcmV0dXJuIFRoZSBtYWluIHdpZGdldAotCSAqLwotCXB1YmxpYyBTdHlsZWRUZXh0IGdldFN0eWxlZFRleHQoKSB7Ci0JCXJldHVybiBzdHlsZWRUZXh0OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKENvbXBvc2l0ZSBwYXJlbnQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBOYW1lZFF1ZXJ5PiBxdWVyeUhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHRleHRIb2xkZXIpIHsKLQotCQl0aGlzLnF1ZXJ5SG9sZGVyICAgICA9IHF1ZXJ5SG9sZGVyOwotCQl0aGlzLmFubm90YXRpb25Nb2RlbCA9IG5ldyBBbm5vdGF0aW9uTW9kZWwoKTsKLQkJdGhpcy50ZXh0SG9sZGVyICAgICAgPSB0ZXh0SG9sZGVyOwotCi0JCS8vIE1ha2Ugc3VyZSB0aGUgU3R5bGVkVGV4dCBpcyBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdGV4dCBob2xkZXIKLQkJdGV4dExpc3RlbmVyID0gYnVpbGRUZXh0TGlzdGVuZXIoKTsKLQkJdGV4dEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGV4dExpc3RlbmVyKTsKLQotCQkvLyBNYWtlIHN1cmUgdGhlIHVzZXIgY2FuJ3QgZGVsZXRlIHRoZSBlbnRpcmUgcXVlcnkgd2hlbiBkb2luZyB1bmRvCi0JCXN1YmplY3RDaGFuZ2VMaXN0ZW5lciA9IGJ1aWxkU3ViamVjdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXF1ZXJ5SG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCBzdWJqZWN0Q2hhbmdlTGlzdGVuZXIpOwotCi0JCS8vIENyZWF0ZSB0aGUgU291cmNlVmlld2VyLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgZXZlcnl0aGluZzogY29udGVudCBhc3Npc3QsIHRvb2wgdGlwCi0JCS8vIGhvdmVyaW5nIG92ZXIgdGhlIGFubm90YXRpb24gKHByb2JsZW1zKSwgZXRjCi0JCXNvdXJjZVZpZXdlciA9IG5ldyBTb3VyY2VWaWV3ZXIocGFyZW50LCBudWxsLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULldSQVAgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuRkxBVCk7Ci0JCXNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgSnBxbFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJc291cmNlVmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJc291cmNlVmlld2VyLnNldERvY3VtZW50KG5ldyBEb2N1bWVudCgpLCBhbm5vdGF0aW9uTW9kZWwpOwotCQlzb3VyY2VWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKGJ1aWxkRG9jdW1lbnRMaXN0ZW5lcigpKTsKLQotCQlzdHlsZWRUZXh0ID0gc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJc3R5bGVkVGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihidWlsZE1vZGlmeUxpc3RlbmVyKCkpOwotCQlzdHlsZWRUZXh0LmFkZERpc3Bvc2VMaXN0ZW5lcihidWlsZERpc3Bvc2VMaXN0ZW5lcigpKTsKLQotCQkvLyBBZGQgdGhlIHN1cHBvcnQgZm9yIHBhaW50aW5nIHRoZSBhbm5vdGF0aW9ucyAoSlBRTCBwcm9ibGVtcykgaW4gdGhlIHNvdXJjZSB2aWV3ZXIKLQkJaW5zdGFsbERlY29yYXRpb25TdXBwb3J0KCk7Ci0KLQkJLy8gQmluZCB0aGUgY29udGVudCBhc3Npc3Qga2V5IHRyaWdnZXIgd2l0aCB0aGUgaGFuZGxlciBzZXJ2aWNlCi0JCWFjdGl2YXRlSGFuZGxlcigpOwotCi0JCS8vIEluc3RhbGwgYSBjdXN0b20gY29udGV4dCBtZW51IHRvIHRoZSB3aWRnZXQKLQkJVGV4dFRyYW5zZmVySGFuZGxlci5pbnN0YWxsQ29udGV4dE1lbnUoc3R5bGVkVGV4dCwgc291cmNlVmlld2VyLmdldFVuZG9NYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIHRoZSBjb250ZW50IGFzc2lzdCBpY29uIGF0IHRoZSB0b3AgbGVmdCBvZiB0aGUge0BsaW5rIFN0eWxlZFRleHR9LgotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGxDb250cm9sRGVjb3JhdGlvbigpIHsKLQotCQkvLyBSZXRyaWV2ZSB0aGUgY29udGVudCBhc3Npc3QgdHJpZ2dlcgotCQlLZXlTdHJva2UgY29udGVudEFzc2lzdFRyaWdnZXIgPSBmaW5kQ29udGVudEFzc2lzdFRyaWdnZXIoKTsKLQkJU3RyaW5nIGtleSA9IFNXVEtleVN1cHBvcnQuZ2V0S2V5Rm9ybWF0dGVyRm9yUGxhdGZvcm0oKS5mb3JtYXQoY29udGVudEFzc2lzdFRyaWdnZXIpOwotCi0JCS8vIEFkZCB0aGUgY29udGV4dCBhc3Npc3QgaWNvbiBhdCB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBTdHlsZWRUZXh0Ci0JCUNvbnRyb2xEZWNvcmF0aW9uIGRlY29yYXRpb24gPSBuZXcgQ29udHJvbERlY29yYXRpb24oc3R5bGVkVGV4dCwgU1dULkxFRlQgfCBTV1QuVE9QKTsKLQkJZGVjb3JhdGlvbi5zZXREZXNjcmlwdGlvblRleHQoTkxTLmJpbmQoSnB0VWlNZXNzYWdlcy5KcHFsQ29udGVudFByb3Bvc2FsUHJvdmlkZXJfRGVzY3JpcHRpb24sIGtleSkpOwotCQlkZWNvcmF0aW9uLnNldEltYWdlKGNvbnRlbnRBc3Npc3RJbWFnZSgpKTsKLQkJZGVjb3JhdGlvbi5zZXRTaG93T25seU9uRm9jdXModHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxEZWNvcmF0aW9uU3VwcG9ydCgpIHsKLQotCQlkZWNvcmF0aW9uU3VwcG9ydCA9IG5ldyBTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydCgKLQkJCXNvdXJjZVZpZXdlciwKLQkJCW51bGwsCi0JCQluZXcgRGVmYXVsdE1hcmtlckFubm90YXRpb25BY2Nlc3MoKSwKLQkJCUVkaXRvcnNQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFNoYXJlZFRleHRDb2xvcnMoKQotCQkpOwotCi0JCWZvciAoQW5ub3RhdGlvblByZWZlcmVuY2UgcHJlZmVyZW5jZSA6IGFubm90YXRpb25QcmVmZXJlbmNlcygpKSB7Ci0JCQlkZWNvcmF0aW9uU3VwcG9ydC5zZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShwcmVmZXJlbmNlKTsKLQkJfQotCi0JCWRlY29yYXRpb25TdXBwb3J0Lmluc3RhbGwoRWRpdG9yc1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbnRlbnRBc3Npc3RCaW5kaW5nKEJpbmRpbmcgYmluZGluZykgewotCi0JCVBhcmFtZXRlcml6ZWRDb21tYW5kIGNvbW1hbmQgPSBiaW5kaW5nLmdldFBhcmFtZXRlcml6ZWRDb21tYW5kKCk7Ci0KLQkJcmV0dXJuIGNvbW1hbmQgIT0gbnVsbCAmJgotCQkgICAgICAgY29tbWFuZC5nZXRDb21tYW5kKCkgIT0gbnVsbCAmJgotCQkgICAgICAgY29tbWFuZC5nZXRDb21tYW5kKCkuZ2V0SWQoKS5lcXVhbHMoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7Ci0JfQotCi0JcHJpdmF0ZSBOYW1lZFF1ZXJ5IHF1ZXJ5KCkgewotCQlyZXR1cm4gcXVlcnlIb2xkZXIuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlKCkgewotCQlpZiAocmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoCi0JCQkJImpwYV9qcHFsX3ZhbGlkYXRpb24iLAotCQkJCUxvY2FsZS5nZXREZWZhdWx0KCksCi0JCQkJSnB0SnBhQ29yZVBsdWdpbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpCi0JCQkpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIExpc3Q8SlBRTFF1ZXJ5UHJvYmxlbT4gc29ydFByb2JsZW1zKExpc3Q8SlBRTFF1ZXJ5UHJvYmxlbT4gcHJvYmxlbXMpIHsKLQkJQ29sbGVjdGlvbnMuc29ydChwcm9ibGVtcywgYnVpbGRQcm9ibGVtQ29tcGFyYXRvcigpKTsKLQkJcmV0dXJuIHByb2JsZW1zOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdWJqZWN0Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQotCQluYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnkpIGUuZ2V0TmV3VmFsdWUoKTsKLQotCQlpZiAobmFtZWRRdWVyeSAhPSBudWxsKSB7Ci0KLQkJCS8vIFByZXZlbnQgdW5kb2luZyB0aGUgYWN0dWFsIHF1ZXJ5IHRoYXQgd2FzIHNldAotCQkJc291cmNlVmlld2VyLmdldFVuZG9NYW5hZ2VyKCkucmVzZXQoKTsKLQotCQkJLy8gTWFrZSBzdXJlIHRoZSBuZXcgcXVlcnkgaXMgdmFsaWRhdGVkCi0JCQl2YWxpZGF0ZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcXVlcnlIZWxwZXIgPSBudWxsOwotCQkJYW5ub3RhdGlvbk1vZGVsLnJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhlIGdpdmVuIEpQUUwgcXVlcnkgYW5kIGFkZCBoaWdobGlnaHRzIHdoZXJlIHByb2JsZW1zIGhhdmUgYmVlbiBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0KLQkJLy8gRmlyc3QgY2xlYXIgYW55IGV4aXN0aW5nIHByb2JsZW1zCi0JCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbGxBbm5vdGF0aW9ucygpOwotCi0JCS8vIE5vdGhpbmcgdG8gdmFsaWRhdGUKLQkJaWYgKChxdWVyeSgpID09IG51bGwpIHx8Ci0JCSAgICBzdHlsZWRUZXh0LmlzRGlzcG9zZWQoKSB8fAotCQkgICAgU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShzdHlsZWRUZXh0LmdldFRleHQoKSkpIHsKLQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIFRoZSBpbmZvcm1hdGlvbiB3YXMgZGlzcG9zZWQgYnV0IHRoZSBjb250ZW50IG1pZ2h0IGJlIHVwZGF0ZWQgb3V0c2lkZSBvZiB0aGUgcGFuZSwKLQkJCS8vIGxpa2UgaW4gdGhlIGVkaXRvciBpdHNlbGYsIG1ha2Ugc3VyZSBOYW1lZFF1ZXJ5IGFuZCB0aGUgaGVscGVyIGFyZSBpbml0aWFsaXplZAotCQkJaWYgKHF1ZXJ5SGVscGVyID09IG51bGwpIHsKLQkJCQluYW1lZFF1ZXJ5ID0gcXVlcnkoKTsKLQkJCQlxdWVyeUhlbHBlciA9IG5hbWVkUXVlcnkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuY3JlYXRlSnBxbFF1ZXJ5SGVscGVyKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBqcHFsUXVlcnkgPSBzdHlsZWRUZXh0LmdldFRleHQoKTsKLQkJCXF1ZXJ5SGVscGVyLnNldFF1ZXJ5KHF1ZXJ5KCksIGpwcWxRdWVyeSk7Ci0JCQlTdHJpbmcgcGFyc2VkSnBxbFF1ZXJ5ID0gcXVlcnlIZWxwZXIuZ2V0UGFyc2VkSlBRTFF1ZXJ5KCk7Ci0KLQkJCWZvciAoSlBRTFF1ZXJ5UHJvYmxlbSBwcm9ibGVtIDogc29ydFByb2JsZW1zKHF1ZXJ5SGVscGVyLnZhbGlkYXRlKCkpKSB7Ci0KLQkJCQkvLyBDcmVhdGUgdGhlIHJhbmdlCi0JCQkJaW50W10gcG9zaXRpb25zID0gcXVlcnlIZWxwZXIuYnVpbGRQb3NpdGlvbnMocHJvYmxlbSwgcGFyc2VkSnBxbFF1ZXJ5LCBqcHFsUXVlcnkpOwotCi0JCQkJLy8gQWRkIHRoZSBwcm9ibGVtIHRvIHRoZSB0b29sIHRpcAotCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKEVSUk9SX1RZUEUsIHRydWUsIGJ1aWxkTWVzc2FnZShwcm9ibGVtKSk7Ci0JCQkJYW5ub3RhdGlvbk1vZGVsLmFkZEFubm90YXRpb24oYW5ub3RhdGlvbiwgbmV3IFBvc2l0aW9uKHBvc2l0aW9uc1swXSwgcG9zaXRpb25zWzFdIC0gcG9zaXRpb25zWzBdKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlxdWVyeUhlbHBlci5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHByb2Nlc3NvciBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIGxpc3Qgb2Yge0BsaW5rIElDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWxzfQotCSAqIGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIHdpdGhpbiB0aGUgcXVlcnkuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCi0JCQlKcGFKcHFsQ29udGVudFByb3Bvc2FsUHJvdmlkZXIudGhpcy5wb3NpdGlvbiA9IG9mZnNldDsKLQotCQkJU3RyaW5nIGpwcWxRdWVyeSA9IHZpZXdlci5nZXREb2N1bWVudCgpLmdldCgpOwotCQkJTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBwcm9wb3NhbHMgPSBidWlsZFByb3Bvc2FscyhxdWVyeSgpLCBqcHFsUXVlcnksIDAsIHBvc2l0aW9uKTsKLQkJCXJldHVybiBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qKgotCQkgKiB7QGluaGVyaXREb2N9Ci0JCSAqLwotCQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpwcWxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGV4dGVuZHMgU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiB7Ci0KLQkJLyoqCi0JCSAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjb250ZW50IGFzc2lzdCBzaW5jZSB3ZSBuZWVkIHRvIGtub3cgd2hlbiB0aGUgcG9wdXAgaXMgb3BlbmVkIG9yIG5vdC4KLQkJICovCi0JCUNvbnRlbnRBc3Npc3RhbnQgY29udGVudEFzc2lzdGFudDsKLQotCQlwcml2YXRlIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGJ1aWxkSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woCi0JCQkJCQlwYXJlbnQsCi0JCQkJCQlFZGl0b3JzVUkuZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSwKLQkJCQkJCW5ldyBIVE1MVGV4dFByZXNlbnRlcih0cnVlKQotCQkJCQkpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJQW5ub3RhdGlvbkhvdmVyIGdldEFubm90YXRpb25Ib3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJcmV0dXJuIG5ldyBEZWZhdWx0QW5ub3RhdGlvbkhvdmVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb250ZW50QXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQljb250ZW50QXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQkJCWNvbnRlbnRBc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihuZXcgQ29udGVudEFzc2lzdFByb2Nlc3NvcigpLCBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEUpOwotCQkJY29udGVudEFzc2lzdGFudC5zZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKGJ1aWxkSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpKTsKLQkJCXJldHVybiBjb250ZW50QXNzaXN0YW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIHtAaW5oZXJpdERvY30KLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVRleHRIb3ZlciBnZXRUZXh0SG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQkJcmV0dXJuIG5ldyBEZWZhdWx0VGV4dEhvdmVyKHNvdXJjZVZpZXdlcik7Ci0JCX0KLQotCQkvKioKLQkJICoge0Bpbmhlcml0RG9jfQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJVGV4dEhvdmVyIGdldFRleHRIb3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlLCBpbnQgc3RhdGVNYXNrKSB7Ci0JCQlyZXR1cm4gbmV3IERlZmF1bHRUZXh0SG92ZXIoc291cmNlVmlld2VyKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwcWwvSnBhSnBxbEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL0pwYUpwcWxKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4OGY5OC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwcWwvSnBhSnBxbEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcHFsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFTVE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkFic3RyYWN0VHlwZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5BcnJheUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLklFeHRlbmRlZE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5NZW1iZXJWYWx1ZVBhaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLk5vcm1hbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlNpbmdsZU1lbWJlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLlN0cmluZ0xpdGVyYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5Db250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5qZHQuQVNUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuVGV4dFJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuRXhwcmVzc2lvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotLyoqCi0gKiBUaGlzIGNvbXB1dGVyIGFkZHMgY29udGVudCBhc3Npc3Qgc3VwcG9ydCB3aGVuIGl0IGlzIGludm9rZWQgaW5zaWRlIHRoZSBxdWVyeSBlbGVtZW50IG9mIHtAbGluawotICogamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeSAmIzY0O05hbWVkUXVlcnl9LgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgZmluYWwgY2xhc3MgSnBhSnBxbEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlciBleHRlbmRzIEpwcWxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjxJQ29tcGxldGlvblByb3Bvc2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyIHsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhSnBxbEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjwvY29kZT4uCi0JICovCi0JcHVibGljIEpwYUpwcWxKYXZhQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCUlDb21wbGV0aW9uUHJvcG9zYWwgYnVpbGRQcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkaXRpb25hbEluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlIGltYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3Vyc29yT2Zmc2V0KSB7Ci0KLQkJcmV0dXJuIG5ldyBKcHFsQ29tcGxldGlvblByb3Bvc2FsKAotCQkJY29udGVudEFzc2lzdFByb3Bvc2FscywKLQkJCXByb3Bvc2FsLAotCQkJZGlzcGxheVN0cmluZywKLQkJCWFkZGl0aW9uYWxJbmZvLAotCQkJaW1hZ2UsCi0JCQluYW1lZFF1ZXJ5LAotCQkJYWN0dWFsUXVlcnksCi0JCQlqcHFsUXVlcnksCi0JCQlvZmZzZXQgKyAxLCAvLyArMSBpcyB0byBza2lwIHRoZSBvcGVuaW5nICIKLQkJCXBvc2l0aW9uLAotCQkJY3Vyc29yT2Zmc2V0LAotCQkJdHJ1ZQotCQkpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIEphdmFDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQpIHsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKG51bGwsIDEwMCk7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscygoSmF2YUNvbnRlbnRBc3Npc3RJbnZvY2F0aW9uQ29udGV4dCkgY29udGV4dCwgbW9uaXRvcik7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsIEpwdFVpTWVzc2FnZXMuSnBhSnBxbEphdmFDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcl9FcnJvciwgZSk7Ci0JCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgTGlzdDxJQ29tcGxldGlvblByb3Bvc2FsPiBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhKYXZhQ29udGVudEFzc2lzdEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJQ29tcGxldGlvbkNvbnRleHQgY29tcGxldGlvbkNvbnRleHQgPSBjb250ZXh0LmdldENvcmVDb250ZXh0KCk7Ci0JCWlmIChjb21wbGV0aW9uQ29udGV4dCA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQkJLy8gVGhlIHRva2VuICJzdGFydCIgaXMgdGhlIG9mZnNldCBvZiB0aGUgdG9rZW4ncyBmaXJzdCBjaGFyYWN0ZXIgd2l0aGluIHRoZSBkb2N1bWVudC4KLQkJLy8gQSB0b2tlbiBzdGFydCBvZiAtMSBjYW4gbWVhbnM6Ci0JCS8vIC0gSXQgaXMgaW5zaWRlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB1bmljb2RlIGNoYXJhY3RlciwgXFx1MHwwRTkgd2hlcmUgfCBpcyB0aGUKLQkJLy8gICBjdXJzb3IsIHRoZW4gLTEgaXMgcmV0dXJuZWQ7Ci0JCS8vIC0gVGhlIHN0cmluZyBpcyBub3QgdmFsaWQgKGl0IGhhcyBzb21lIGludmFsaWQgY2hhcmFjdGVycykKLQkJaW50IHRva2VuU3RhcnQgPSBjb21wbGV0aW9uQ29udGV4dC5nZXRUb2tlblN0YXJ0KCk7Ci0JCWlmICh0b2tlblN0YXJ0ID09IC0xKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQkJaW50W10gcG9zaXRpb24gPSB7IGNvbXBsZXRpb25Db250ZXh0LmdldE9mZnNldCgpIC0gdG9rZW5TdGFydCAtIDEgfTsKLQkJaWYgKHBvc2l0aW9uWzBdIDwgMCkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gY29udGV4dC5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gQVNUVG9vbHMuYnVpbGRBU1RSb290KGNvbXBpbGF0aW9uVW5pdCk7Ci0KLQkJSUZpbGUgZmlsZSA9IGdldENvcnJlc3BvbmRpbmdSZXNvdXJjZShjb21waWxhdGlvblVuaXQpOwotCQlpZiAoZmlsZSA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlpZiAoanBhRmlsZSA9PSBudWxsKSByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0KLQkJbW9uaXRvci53b3JrZWQoODApOwotCQljaGVja0NhbmNlbGVkKG1vbml0b3IpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBKUEEncyBtb2RlbCBvYmplY3QKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gbmFtZWRRdWVyeShhc3RSb290LCBqcGFGaWxlLCB0b2tlblN0YXJ0KTsKLQkJaWYgKG5hbWVkUXVlcnkgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCS8vIFJldHJpZXZlIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGVsZW1lbnQgInF1ZXJ5IiBzaW5jZSB0aGUgY29udGVudCBhc3Npc3QgY2FuIGJlCi0JCS8vIGludm9rZWQgYmVmb3JlIHRoZSBtb2RlbCByZWNlaXZlZCB0aGUgbmV3IGNvbnRlbnQKLQkJU3RyaW5nIGpwcWxRdWVyeSA9IGpwcWxRdWVyeShhc3RSb290LCB0b2tlblN0YXJ0LCBjb21wbGV0aW9uQ29udGV4dC5nZXRUb2tlbkVuZCgpLCBwb3NpdGlvbik7Ci0KLQkJLy8gTm93IGNyZWF0ZSB0aGUgcHJvcG9zYWxzCi0JCXJldHVybiBidWlsZFByb3Bvc2FscyhuYW1lZFF1ZXJ5LCBqcHFsUXVlcnksIHRva2VuU3RhcnQsIHBvc2l0aW9uWzBdKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIExpc3Q8SUNvbnRleHRJbmZvcm1hdGlvbj4gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihDb250ZW50QXNzaXN0SW52b2NhdGlvbkNvbnRleHQgY29udGV4dCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0JCXJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQl9Ci0KLQlwcml2YXRlIE5hbWVkUXVlcnkgZmluZE5hbWVkUXVlcnkoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0Um9vdCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRva2VuU3RhcnQpIHsKLQotCQlpZiAoc3RydWN0dXJlTm9kZSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgc3RydWN0dXJlTm9kZTsKLQkJCUphdmFUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQkJZm9yIChRdWVyeSBxdWVyeSA6IHR5cGVNYXBwaW5nLmdldFF1ZXJpZXMoKSl7Ci0JCQkJaWYgKHF1ZXJ5LmdldFR5cGUoKS5lcXVhbHMoTmFtZWRRdWVyeS5jbGFzcykpewotCQkJCQlKYXZhTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gKEphdmFOYW1lZFF1ZXJ5KXF1ZXJ5OwotCQkJCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gbmFtZWRRdWVyeS5nZXRRdWVyeUFubm90YXRpb24oKS5nZXRRdWVyeVRleHRSYW5nZShhc3RSb290KTsKLQkJCQkJaWYgKCh0ZXh0UmFuZ2UgIT0gbnVsbCkgJiYgdGV4dFJhbmdlLmluY2x1ZGVzKHRva2VuU3RhcnQpKSB7Ci0JCQkJCQlyZXR1cm4gbmFtZWRRdWVyeTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKElDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0KSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElGaWxlKSBjb21waWxhdGlvblVuaXQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coZXgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNJbnNpZGVOb2RlKEFTVE5vZGUgbm9kZSwgaW50IHRva2VuU3RhcnQsIGludCB0b2tlbkVuZCkgewotCQlpbnQgc3RhcnRQb3NpdGlvbiA9IG5vZGUuZ2V0U3RhcnRQb3NpdGlvbigpOwotCQlyZXR1cm4gc3RhcnRQb3NpdGlvbiA8PSB0b2tlblN0YXJ0ICYmCi0JCSAgICAgICBzdGFydFBvc2l0aW9uICsgbm9kZS5nZXRMZW5ndGgoKSA+PSB0b2tlbkVuZDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBqcHFsUXVlcnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIGludCB0b2tlblN0YXJ0LCBpbnQgdG9rZW5FbmQsIGludFtdIHBvc2l0aW9uKSB7Ci0KLQkJU3RyaW5nIGpwcWxRdWVyeSA9IHJldHJpZXZlUXVlcnkoYXN0Um9vdCwgdG9rZW5TdGFydCwgdG9rZW5FbmQpOwotCi0JCWlmIChqcHFsUXVlcnkgPT0gbnVsbCkgewotCQkJanBxbFF1ZXJ5ID0gU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HOwotCQl9Ci0JCWVsc2UgaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzUXVvdGVkKGpwcWxRdWVyeSkpIHsKLQkJCWpwcWxRdWVyeSA9IGpwcWxRdWVyeS5zdWJzdHJpbmcoMSwganBxbFF1ZXJ5Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQotCQlyZXR1cm4ganBxbFF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgbW9kaWZ5SnBxbFF1ZXJ5KFN0cmluZyBqcHFsUXVlcnksIGludFtdIHBvc2l0aW9uKSB7Ci0JCXJldHVybiBFeHByZXNzaW9uVG9vbHMudW5lc2NhcGUoanBxbFF1ZXJ5LCBwb3NpdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIEpwYUZpbGUganBhRmlsZSwgaW50IHRva2VuU3RhcnQpIHsKLQotCQlmb3IgKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSA6IGpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkpIHsKLQkJCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGZpbmROYW1lZFF1ZXJ5KG5vZGUsIGFzdFJvb3QsIHRva2VuU3RhcnQpOwotCQkJaWYgKG5hbWVkUXVlcnkgIT0gbnVsbCkgewotCQkJCXJldHVybiBuYW1lZFF1ZXJ5OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyB0d2lzdGVkIGNvZGUgaXMgbWVhbnQgdG8gcmV0cmlldmUgdGhlIHJlYWwgc3RyaW5nIHZhbHVlIHRoYXQgaXMgbm90IGVzY2FwZWQgYW5kIHRvIGFsc28KLQkgKiByZXRyaWV2ZSB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBub24tZXNjYXBlZCBzdHJpbmcuIFRoZSBxdWVyeSBjb3VsZCBoYXZlIGVzY2FwZSBjaGFyYWN0ZXJzLAotCSAqIHN1Y2ggYXMgXHIsIFxuIGV0YyBiZWluZyB3cml0dGVuIGFzIFxcciwgXFxuLCB0aGUgcG9zaXRpb24gaXMgYmFzZWQgb24gdGhhdCBlc2NhcGVkIHN0cmluZywKLQkgKiB0aGUgY29udmVyc2lvbiB3aWxsIGNvbnZlcnQgdGhlbSBpbnRvIFxyIGFuZCBcciBhbmQgYWRqdXN0IHRoZSBwb3NpdGlvbiBhY2NvcmRpbmdseS4KLQkgKgotCSAqIEBwYXJhbSBhc3RSb290IFRoZSBwYXJzZWQgdHJlZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgSmF2YSBzb3VyY2UgZmlsZQotCSAqIEBwYXJhbSB0b2tlblN0YXJ0IFRoZSBiZWdpbm5pbmcgb2YgdGhlIHF1ZXJ5IGV4cHJlc3Npb24gb2YgdGhlIHtAbGluayBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5Ci0JICogJiM2NDtOYW1lZFF1ZXJ5fSdzIHF1ZXJ5IG1lbWJlciB3aXRoaW4gdGhlIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIHRva2VuRW5kIFRoZSBlbmQgb2YgdGhlIHF1ZXJ5IG1lbWJlciB3aXRoaW4gdGhlIHNvdXJjZSBmaWxlCi0JICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIHdpdGhpbiB0aGUgcXVlcnkgZXhwcmVzc2lvbgotCSAqIEByZXR1cm4gVGhlIGFjdHVhbCB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgcXVlcnkgZWxlbWVudAotCSAqLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgU3RyaW5nIHJldHJpZXZlUXVlcnkoQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QsIGludCB0b2tlblN0YXJ0LCBpbnQgdG9rZW5FbmQpIHsKLQotCQkvLyBEaWcgaW50byB0aGUgVHlwZURlY2xhcmF0aW9ucwotCQlmb3IgKEFic3RyYWN0VHlwZURlY2xhcmF0aW9uIHR5cGUgOiAoTGlzdDxBYnN0cmFjdFR5cGVEZWNsYXJhdGlvbj4pIGFzdFJvb3QudHlwZXMoKSkgewotCi0JCQlpZiAoaXNJbnNpZGVOb2RlKHR5cGUsIHRva2VuU3RhcnQsIHRva2VuRW5kKSkgewotCi0JCQkJLy8gRGlnIGluc2lkZSBpdHMgbW9kaWZpZXJzIGFuZCBhbm5vdGF0aW9ucwotCQkJCWZvciAoSUV4dGVuZGVkTW9kaWZpZXIgbW9kaWZpZXIgOiAoTGlzdDxJRXh0ZW5kZWRNb2RpZmllcj4pIHR5cGUubW9kaWZpZXJzKCkpIHsKLQotCQkJCQlpZiAoIW1vZGlmaWVyLmlzQW5ub3RhdGlvbigpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBtb2RpZmllcjsKLQotCQkJCQkvLyBEaWcgaW5zaWRlIHRoZSBhbm5vdGF0aW9uCi0JCQkJCWlmIChpc0luc2lkZU5vZGUoYW5ub3RhdGlvbiwgdG9rZW5TdGFydCwgdG9rZW5FbmQpKSB7Ci0KLQkJCQkJCS8vIEBOYW1lZFF1ZXJpZXMoey4uLn0pCi0JCQkJCQlpZiAoYW5ub3RhdGlvbi5pc1NpbmdsZU1lbWJlckFubm90YXRpb24oKSkgewotCQkJCQkJCVNpbmdsZU1lbWJlckFubm90YXRpb24gc2luZ2xlTWVtYmVyQW5ub3RhdGlvbiA9IChTaW5nbGVNZW1iZXJBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotCQkJCQkJCUV4cHJlc3Npb24gdmFsdWUgPSBzaW5nbGVNZW1iZXJBbm5vdGF0aW9uLmdldFZhbHVlKCk7Ci0KLQkJCQkJCQlpZiAodmFsdWUuZ2V0Tm9kZVR5cGUoKSA9PSBBU1ROb2RlLkFSUkFZX0lOSVRJQUxJWkVSKSB7Ci0JCQkJCQkJCUFycmF5SW5pdGlhbGl6ZXIgYXJyYXkgPSAoQXJyYXlJbml0aWFsaXplcikgdmFsdWU7Ci0KLQkJCQkJCQkJZm9yIChFeHByZXNzaW9uIGV4cHJlc3Npb24gOiAoTGlzdDxFeHByZXNzaW9uPikgYXJyYXkuZXhwcmVzc2lvbnMoKSkgewotCQkJCQkJCQkJaWYgKGlzSW5zaWRlTm9kZShleHByZXNzaW9uLCB0b2tlblN0YXJ0LCB0b2tlbkVuZCkpIHsKLQkJCQkJCQkJCQlyZXR1cm4gcmV0cmlldmVRdWVyeSgoTm9ybWFsQW5ub3RhdGlvbikgZXhwcmVzc2lvbiwgdG9rZW5TdGFydCwgdG9rZW5FbmQpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlOb3JtYWxBbm5vdGF0aW9uIGNoaWxkQW5ub3RhdGlvbiA9IChOb3JtYWxBbm5vdGF0aW9uKSB2YWx1ZTsKLQotCQkJCQkJCQlpZiAoaXNJbnNpZGVOb2RlKGNoaWxkQW5ub3RhdGlvbiwgdG9rZW5TdGFydCwgdG9rZW5FbmQpKSB7Ci0JCQkJCQkJCQlyZXR1cm4gcmV0cmlldmVRdWVyeShjaGlsZEFubm90YXRpb24sIHRva2VuU3RhcnQsIHRva2VuRW5kKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIEBOYW1lZFF1ZXJ5KCkKLQkJCQkJCWVsc2UgaWYgKGFubm90YXRpb24uaXNOb3JtYWxBbm5vdGF0aW9uKCkpIHsKLQkJCQkJCQlyZXR1cm4gcmV0cmlldmVRdWVyeSgoTm9ybWFsQW5ub3RhdGlvbikgYW5ub3RhdGlvbiwgdG9rZW5TdGFydCwgdG9rZW5FbmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBTdHJpbmcgcmV0cmlldmVRdWVyeShOb3JtYWxBbm5vdGF0aW9uIGFubm90YXRpb24sIGludCB0b2tlblN0YXJ0LCBpbnQgdG9rZW5FbmQpIHsKLQotCQlmb3IgKE1lbWJlclZhbHVlUGFpciBwYWlyIDogKExpc3Q8TWVtYmVyVmFsdWVQYWlyPikgYW5ub3RhdGlvbi52YWx1ZXMoKSkgewotCQkJb3JnLmVjbGlwc2UuamR0LmNvcmUuZG9tLkV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhaXIuZ2V0VmFsdWUoKTsKLQotCQkJaWYgKGlzSW5zaWRlTm9kZShleHByZXNzaW9uLCB0b2tlblN0YXJ0LCB0b2tlbkVuZCkpIHsKLQkJCQlTdHJpbmdMaXRlcmFsIGxpdGVyYWwgPSAoU3RyaW5nTGl0ZXJhbCkgcGFpci5nZXRWYWx1ZSgpOwotCQkJCXJldHVybiBsaXRlcmFsLmdldEVzY2FwZWRWYWx1ZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBxbC9KcGFKcHFsU3NlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBxbC9KcGFKcHFsU3NlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzMDdjOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwcWwvSnBhSnBxbFNzZUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgYW5kIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4KLSAqIFRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogYW5kIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmpwcWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudXRpbGl0eS5UZXh0UmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5FeHByZXNzaW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWxJbnZvY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyOwotCi0vKioKLSAqIFRoaXMgY29tcHV0ZXIgYWRkcyBjb250ZW50IGFzc2lzdCBzdXBwb3J0IHdoZW4gaXQgaXMgaW52b2tlZCBpbnNpZGUgdGhlICZsdDtxdWVyeSZndDsgZWxlbWVudAotICogZGVmaW5lZCBpbiBhIG1hcHBpbmcgZmlsZSAoT1JNIENvbmZpZ3VyYXRpb24pLgotICoKLSAqIEB2ZXJzaW9uIDMuMgotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBKcGFKcHFsU3NlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgZXh0ZW5kcyBKcHFsQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI8SUNvbXBsZXRpb25Qcm9wb3NhbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFKcHFsU3NlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBKcGFKcHFsU3NlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCUlDb21wbGV0aW9uUHJvcG9zYWwgYnVpbGRQcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWRkaXRpb25hbEluZm8sCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlIGltYWdlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3Vyc29yT2Zmc2V0KSB7Ci0KLQkJcmV0dXJuIG5ldyBKcHFsQ29tcGxldGlvblByb3Bvc2FsKAotCQkJY29udGVudEFzc2lzdFByb3Bvc2FscywKLQkJCXByb3Bvc2FsLAotCQkJZGlzcGxheVN0cmluZywKLQkJCWFkZGl0aW9uYWxJbmZvLAotCQkJaW1hZ2UsCi0JCQluYW1lZFF1ZXJ5LAotCQkJYWN0dWFsUXVlcnksCi0JCQlqcHFsUXVlcnksCi0JCQlvZmZzZXQsCi0JCQlwb3NpdGlvbiwKLQkJCWN1cnNvck9mZnNldCwKLQkJCWZhbHNlCi0JCSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBMaXN0PElDb21wbGV0aW9uUHJvcG9zYWw+IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJbW9uaXRvci5iZWdpblRhc2sobnVsbCwgMTAwKTsKLQotCQl0cnkgewotCQkJaW50IG9mZnNldCA9IGNvbnRleHQuZ2V0SW52b2NhdGlvbk9mZnNldCgpOwotCQkJaWYgKG9mZnNldCA9PSAtMSkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCQlJVGV4dEZpbGVCdWZmZXJNYW5hZ2VyIG1hbmFnZXIgPSBGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKTsKLQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBtYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKGNvbnRleHQuZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLQotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlKGJ1ZmZlci5nZXRMb2NhdGlvbigpKTsKLQotCQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCQltb25pdG9yLndvcmtlZCg4MCk7Ci0JCQljaGVja0NhbmNlbGVkKG1vbml0b3IpOwotCi0JCQkvLyBSZXRyaWV2ZSB0aGUgSlBBJ3MgbW9kZWwgb2JqZWN0Ci0JCQlpbnRbXSBwb3NpdGlvbiA9IG5ldyBpbnRbMV07Ci0JCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBuYW1lZFF1ZXJ5KGpwYUZpbGUsIG9mZnNldCwgcG9zaXRpb24pOwotCQkJaWYgKG5hbWVkUXVlcnkgPT0gbnVsbCkgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0JCQkvLyBLZWVwIHRyYWNrIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRleHQgc2luY2UgdGhlIGVudGlyZSBzdHJpbmcgaXMgYWx3YXlzIHJlcGxhY2VkCi0JCQlpbnQgdG9rZW5TdGFydCA9IG9mZnNldCAtIHBvc2l0aW9uWzBdOwotCi0JCQkvLyBOb3cgY3JlYXRlIHRoZSBwcm9wb3NhbHMKLQkJCVN0cmluZyBqcHFsUXVlcnkgPSBqcHFsUXVlcnkobmFtZWRRdWVyeSwgY29udGV4dC5nZXREb2N1bWVudCgpKTsKLQkJCXJldHVybiBidWlsZFByb3Bvc2FscyhuYW1lZFF1ZXJ5LCBqcHFsUXVlcnksIHRva2VuU3RhcnQsIHBvc2l0aW9uWzBdKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgSnB0VWlNZXNzYWdlcy5KcGFKcHFsU3NlQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXJfRXJyb3IsIGUpOwotCQkJSnB0SnBhQ29yZVBsdWdpbi5sb2coc3RhdHVzKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0KLQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgTGlzdDxJQ29udGV4dEluZm9ybWF0aW9uPiBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKENvbXBsZXRpb25Qcm9wb3NhbEludm9jYXRpb25Db250ZXh0IGNvbnRleHQsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBPcm1OYW1lZFF1ZXJ5IGZpbmROYW1lZFF1ZXJ5KEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSwgaW50IG9mZnNldCwgaW50W10gcG9zaXRpb24pIHsKLQotCQlpZiAoc3RydWN0dXJlTm9kZSBpbnN0YW5jZW9mIEVudGl0eU1hcHBpbmdzKSB7Ci0JCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IChFbnRpdHlNYXBwaW5ncykgc3RydWN0dXJlTm9kZTsKLQotCQkJLy8gRmlyc3QgbG9vayBpbnRvIHRoZSBnbG9iYWwgcXVlcmllcwotCQkJT3JtTmFtZWRRdWVyeSBxdWVyeSA9IGZpbmROYW1lZFF1ZXJ5KGVudGl0eU1hcHBpbmdzLmdldFF1ZXJ5Q29udGFpbmVyKCksIG9mZnNldCwgcG9zaXRpb24pOwotCi0JCQkvLyBOb3cgdHJhdmVyc2UgZWFjaCBlbnRpdHkKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIHF1ZXJ5OwotCQkJfQotCi0JCQlmb3IgKFBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlIDogZW50aXR5TWFwcGluZ3MuZ2V0UGVyc2lzdGVudFR5cGVzKCkpIHsKLQkJCQlUeXBlTWFwcGluZyB0eXBlTWFwcGluZyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQkJCWlmICh0eXBlTWFwcGluZyBpbnN0YW5jZW9mIE9ybUVudGl0eSkgewotCQkJCQlxdWVyeSA9IGZpbmROYW1lZFF1ZXJ5KCgoT3JtRW50aXR5KSB0eXBlTWFwcGluZykuZ2V0UXVlcnlDb250YWluZXIoKSwgb2Zmc2V0LCBwb3NpdGlvbik7Ci0KLQkJCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBxdWVyeTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgT3JtTmFtZWRRdWVyeSBmaW5kTmFtZWRRdWVyeShPcm1RdWVyeUNvbnRhaW5lciBjb250YWluZXIsIGludCBvZmZzZXQsIGludFtdIHBvc2l0aW9uKSB7Ci0KLQkJZm9yIChPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgOiBjb250YWluZXIuZ2V0TmFtZWRRdWVyaWVzKCkpIHsKLQkJCVRleHRSYW5nZSB0ZXh0UmFuZ2UgPSBuYW1lZFF1ZXJ5LmdldFF1ZXJ5VGV4dFJhbmdlKCk7Ci0KLQkJCWlmICh0ZXh0UmFuZ2UudG91Y2hlcyhvZmZzZXQpKSB7Ci0JCQkJcG9zaXRpb25bMF0gPSBvZmZzZXQgLSB0ZXh0UmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBqcHFsUXVlcnkoT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdHJ5IHsKLQkJCVRleHRSYW5nZSByYW5nZSA9IG5hbWVkUXVlcnkuZ2V0UXVlcnlUZXh0UmFuZ2UoKTsKLQkJCXJldHVybiBkb2N1bWVudC5nZXQocmFuZ2UuZ2V0T2Zmc2V0KCksIHJhbmdlLmdldExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFN0cmluZ1Rvb2xzLkVNUFRZX1NUUklORzsKLQkJfQotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlTdHJpbmcgbW9kaWZ5SnBxbFF1ZXJ5KFN0cmluZyBqcHFsUXVlcnksIGludFtdIHBvc2l0aW9uKSB7Ci0JCXJldHVybiBFeHByZXNzaW9uVG9vbHMudW5lc2NhcGUoanBxbFF1ZXJ5LCBwb3NpdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkoSnBhRmlsZSBqcGFGaWxlLCBpbnQgb2Zmc2V0LCBpbnRbXSBwb3NpdGlvbikgewotCi0JCWZvciAoSnBhU3RydWN0dXJlTm9kZSBub2RlIDoganBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKSkgewotCQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZmluZE5hbWVkUXVlcnkobm9kZSwgb2Zmc2V0LCBwb3NpdGlvbik7Ci0JCQlpZiAobmFtZWRRdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5hbWVkUXVlcnk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL0pwcWxDb21wbGV0aW9uUHJvcG9zYWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBxbC9KcHFsQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZmQxNGIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL0pwcWxDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBxbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuQ29udGVudEFzc2lzdFByb3Bvc2FsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5SZXN1bHRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0vKioKLSAqIFRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHtAbGluayBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbAotICogSUNvbXBsZXRpb25Qcm9wb3NhbH0gdGhhdCBhZGRzIHJlbGV2YW5jZSBhbmQgdG9nZ2xpbmcgdGhlIGNvbXBsZXRpb24gaW5zZXJ0aW9uIHByb3BlcnR5IGJlaGF2aW9yLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICogQGF1dGhvciBQYXNjYWwgRmlsaW9uCi0gKi8KLWZpbmFsIGNsYXNzIEpwcWxDb21wbGV0aW9uUHJvcG9zYWwgaW1wbGVtZW50cyBJQ29tcGxldGlvblByb3Bvc2FsIHsKLQotCXByaXZhdGUgU3RyaW5nIGFjdHVhbFF1ZXJ5OwotCXByaXZhdGUgU3RyaW5nIGFkZGl0aW9uYWxJbmZvOwotCXByaXZhdGUgQ29udGVudEFzc2lzdFByb3Bvc2FscyBwcm9wb3NhbHM7Ci0JcHJpdmF0ZSBpbnQgY3Vyc29yT2Zmc2V0OwotCXByaXZhdGUgU3RyaW5nIGRpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBib29sZWFuIGVzY2FwZUNoYXJhY3RlcnM7Ci0JcHJpdmF0ZSBJbWFnZSBpbWFnZTsKLQlwcml2YXRlIFN0cmluZyBqcHFsUXVlcnk7Ci0JcHJpdmF0ZSBOYW1lZFF1ZXJ5IG5hbWVkUXVlcnk7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0OwotCXByaXZhdGUgaW50IHBvc2l0aW9uOwotCXByaXZhdGUgU3RyaW5nIHByb3Bvc2FsOwotCXByaXZhdGUgUmVzdWx0UXVlcnkgcmVzdWx0OwotCXByaXZhdGUgYm9vbGVhbiB0b2dnbGVDb21wbGV0aW9uOwotCi0JSnBxbENvbXBsZXRpb25Qcm9wb3NhbChDb250ZW50QXNzaXN0UHJvcG9zYWxzIHByb3Bvc2FscywKLQkgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wb3NhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkaXNwbGF5U3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFkZGl0aW9uYWxJbmZvLAotCSAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UgaW1hZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICBOYW1lZFF1ZXJ5IG5hbWVkUXVlcnksCi0JICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsUXVlcnksCi0JICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcganBxbFF1ZXJ5LAotCSAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwKLQkgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwKLQkgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJzb3JPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVzY2FwZUNoYXJhY3RlcnMpIHsKLQotCQlzdXBlcigpOwotCi0JCXRoaXMuaW1hZ2UgICAgICAgICAgICA9IGltYWdlOwotCQl0aGlzLm9mZnNldCAgICAgICAgICAgPSBvZmZzZXQ7Ci0JCXRoaXMucG9zaXRpb24gICAgICAgICA9IHBvc2l0aW9uOwotCQl0aGlzLnByb3Bvc2FsICAgICAgICAgPSBwcm9wb3NhbDsKLQkJdGhpcy5qcHFsUXVlcnkgICAgICAgID0ganBxbFF1ZXJ5OwotCQl0aGlzLnByb3Bvc2FscyAgICAgICAgPSBwcm9wb3NhbHM7Ci0JCXRoaXMubmFtZWRRdWVyeSAgICAgICA9IG5hbWVkUXVlcnk7Ci0JCXRoaXMuYWN0dWFsUXVlcnkgICAgICA9IGFjdHVhbFF1ZXJ5OwotCQl0aGlzLmN1cnNvck9mZnNldCAgICAgPSBjdXJzb3JPZmZzZXQ7Ci0JCXRoaXMuZGlzcGxheVN0cmluZyAgICA9IGRpc3BsYXlTdHJpbmc7Ci0JCXRoaXMuYWRkaXRpb25hbEluZm8gICA9IGFkZGl0aW9uYWxJbmZvOwotCQl0aGlzLmVzY2FwZUNoYXJhY3RlcnMgPSBlc2NhcGVDaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdHJ5IHsKLQkJCVJlc3VsdFF1ZXJ5IHJlc3VsdCA9IGJ1aWxkUmVzdWx0KCk7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKG9mZnNldCwgYWN0dWFsUXVlcnkubGVuZ3RoKCksIHJlc3VsdC5nZXRRdWVyeSgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gSWdub3JlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFJlc3VsdFF1ZXJ5IGJ1aWxkUmVzdWx0KCkgewotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCWlmIChlc2NhcGVDaGFyYWN0ZXJzKSB7Ci0JCQkJcmVzdWx0ID0gcHJvcG9zYWxzLmJ1aWxkRXNjYXBlZFF1ZXJ5KAotCQkJCQlqcHFsUXVlcnksCi0JCQkJCXByb3Bvc2FsLAotCQkJCQlwb3NpdGlvbiwKLQkJCQkJaXNDb21wbGV0aW9uSW5zZXJ0cygpIF4gdG9nZ2xlQ29tcGxldGlvbgotCQkJCSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBwcm9wb3NhbHMuYnVpbGRRdWVyeSgKLQkJCQkJanBxbFF1ZXJ5LAotCQkJCQlwcm9wb3NhbCwKLQkJCQkJcG9zaXRpb24sCi0JCQkJCWlzQ29tcGxldGlvbkluc2VydHMoKSBeIHRvZ2dsZUNvbXBsZXRpb24KLQkJCQkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJcmV0dXJuIGFkZGl0aW9uYWxJbmZvOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOyAvLyBOb3QgbmVlZGVkLCB0aGlzIGlzIGxlZ2FjeSBBUEkKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBQb2ludCBnZXRTZWxlY3Rpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVJlc3VsdFF1ZXJ5IHJlc3VsdCA9IGJ1aWxkUmVzdWx0KCk7Ci0JCXJldHVybiBuZXcgUG9pbnQob2Zmc2V0ICsgcmVzdWx0LmdldFBvc2l0aW9uKCkgKyBjdXJzb3JPZmZzZXQsIDApOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbXBsZXRpb25JbnNlcnRzKCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBuYW1lZFF1ZXJ5LmdldEpwYVByb2plY3QoKS5nZXRKYXZhUHJvamVjdCgpOwotCQlTdHJpbmcgdmFsdWUgPSBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2UoUHJlZmVyZW5jZUNvbnN0YW50cy5DT0RFQVNTSVNUX0lOU0VSVF9DT01QTEVUSU9OLCBqYXZhUHJvamVjdCk7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwcWwvSnBxbENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwcWwvSnBxbENvbXBsZXRpb25Qcm9wb3NhbENvbXB1dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzZjZmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL0pwcWxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcHFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwcWwuSnBhSnBxbFF1ZXJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLkNvbnRlbnRBc3Npc3RQcm9wb3NhbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuV29yZFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuRXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuSWRlbnRpZmllclJvbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuanBhLmpwcWwuc3BpLklNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnNwaS5JTWFwcGluZ1R5cGUuKjsKLQotLyoqCi0gKiBUaGUgYWJzdHJhY3QgZGVmaW5pdGlvbiBvZiBKUFFMIGNvbnRlbnQgYXNzaXN0IHN1cHBvcnQuCi0gKgotICogQHZlcnNpb24gMy4yCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1hYnN0cmFjdCBjbGFzcyBKcHFsQ29tcGxldGlvblByb3Bvc2FsQ29tcHV0ZXI8VD4gewotCi0JLyoqCi0JICogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHF1ZXJ5IGVsZW1lbnQuCi0JICovCi0JU3RyaW5nIGFjdHVhbFF1ZXJ5OwotCi0JLyoqCi0JICogVGhlIHByb3ZpZGVyIG9mIGNvbnRlbnQgYXNzaXN0IGl0ZW1zIGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIHdpdGhpbiB0aGUgSlBRTCBxdWVyeS4KLQkgKi8KLQlDb250ZW50QXNzaXN0UHJvcG9zYWxzIGNvbnRlbnRBc3Npc3RQcm9wb3NhbHM7Ci0KLQkvKioKLQkgKiBUaGUgbG9jYWwgcmVnaXN0cnkgY29udGFpbmluZyB0aGUgaW1hZ2VzIHVzZWQgdG8gZGlzcGxheSB0aGUgcG9zc2libGUgcHJvcG9zYWxzLiBUaGUgcmVnaXN0cnkgaXMKLQkgKiBkaXNwb3NlZCB3aGVuIHRoZSBzZXNzaW9uIGVuZGVkLgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBpbWFnZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogVGhlIHNhbWUgdmFsdWUgYXMge0BsaW5rICNhY3R1YWxRdWVyeX0gb3IgdGhlIG1vZGlmaWVkIHF1ZXJ5IHRoYXQgd2FzIHVzZWQgYnkgdGhlIEhlcm1lcyBwYXJzZXIuCi0JICovCi0JU3RyaW5nIGpwcWxRdWVyeTsKLQotCS8qKgotCSAqIFRoZSBKUEEgbW9kZWwgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIEphdmEgcHJvamVjdC4KLQkgKi8KLQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnk7Ci0KLQkvKioKLQkgKiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIHF1ZXJ5IHdpdGhpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JaW50IG9mZnNldDsKLQotCS8qKgotCSAqIFRoZSB3b3JkIGJlZm9yZSB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwYXJ0aWFsV29yZDsKLQotCS8qKgotCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yIHdpdGhpbiB7QGxpbmsgI2FjdHVhbFF1ZXJ5fS4KLQkgKi8KLQlpbnQgcG9zaXRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGhlbHBlciBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgcmV0cmlldmluZyB0aGUgcG9zc2libGUgcHJvcG9zYWxzCi0JICogcmVxdWlyZWQgYnkgY29udGVudCBhc3Npc3QgYW5kIHRvIHZhbGlkYXRlIEpQUUwgcXVlcmllcy4KLQkgKi8KLQlKcGFKcHFsUXVlcnlIZWxwZXIgcXVlcnlIZWxwZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkpwcWxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcjwvY29kZT4uCi0JICovCi0JcHVibGljIEpwcWxDb21wbGV0aW9uUHJvcG9zYWxDb21wdXRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGNvbXBsZXRpb24gcHJvcG9zYWxzIGZvciB0aGUgYWJzdHJhY3Qgc2NoZW1hIG5hbWVzIHRoYXQgYXJlIHBvc3NpYmxlIHByb3Bvc2Fscy4KLQkgKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMgVGhlIGxpc3QgdXNlZCB0byBzdG9yZSB0aGUgbmV3IGNvbXBsZXRpb24gcHJvcG9zYWxzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFic3RyYWN0U2NoZW1hTmFtZXMoTGlzdDxUPiBwcm9wb3NhbHMpIHsKLQkJZm9yIChJRW50aXR5IGFic3RyYWN0U2NoZW1hVHlwZSA6IHNvcnRCeU5hbWVzKGNvbnRlbnRBc3Npc3RQcm9wb3NhbHMuYWJzdHJhY3RTY2hlbWFUeXBlcygpKSkgewotCQkJcHJvcG9zYWxzLmFkZChidWlsZEFic3RyYWN0U2NoZW1hTmFtZVByb3Bvc2FsKGFic3RyYWN0U2NoZW1hVHlwZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBjb21wbGV0aW9uIHByb3Bvc2FscyBmb3IgdGhlIGlkZW50aWZpY2F0aW9uIHZhcmlhYmxlcyB0aGF0IGFyZSBwb3NzaWJsZSBwcm9wb3NhbHMuCi0JICoKLQkgKiBAcGFyYW0gcHJvcG9zYWxzIFRoZSBsaXN0IHVzZWQgdG8gc3RvcmUgdGhlIG5ldyBjb21wbGV0aW9uIHByb3Bvc2FscwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRJZGVudGlmaWNhdGlvblZhcmlhYmxlcyhMaXN0PFQ+IHByb3Bvc2FscykgewotCQlmb3IgKFN0cmluZyB2YXJpYWJsZSA6IHNvcnQoY29udGVudEFzc2lzdFByb3Bvc2Fscy5pZGVudGlmaWNhdGlvblZhcmlhYmxlcygpKSkgewotCQkJcHJvcG9zYWxzLmFkZChidWlsZElkZW50aWZpY2F0aW9uVmFyaWFibGVQcm9wb3NhbCh2YXJpYWJsZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyBjb21wbGV0aW9uIHByb3Bvc2FscyBmb3IgdGhlIEpQUUwgaWRlbnRpZmllcnMgdGhhdCBhcmUgcG9zc2libGUgcHJvcG9zYWxzLgotCSAqCi0JICogQHBhcmFtIHByb3Bvc2FscyBUaGUgbGlzdCB1c2VkIHRvIHN0b3JlIHRoZSBuZXcgY29tcGxldGlvbiBwcm9wb3NhbHMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSWRlbnRpZmllcnMoTGlzdDxUPiBwcm9wb3NhbHMpIHsKLQkJZm9yIChTdHJpbmcgaWRlbnRpZmllciA6IHNvcnQoY29udGVudEFzc2lzdFByb3Bvc2Fscy5pZGVudGlmaWVycygpKSkgewotCQkJcHJvcG9zYWxzLmFkZChidWlsZElkZW50aWZpZXJQcm9wb3NhbChpZGVudGlmaWVyKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBhZGRpdGlvbmFsSW5mbyhTdHJpbmcgcHJvcG9zYWwpIHsKLQkJcmV0dXJuIEpwcWxJZGVudGlmaWVyTWVzc2FnZXMubG9jYWxpemVkTWVzc2FnZShwcm9wb3NhbCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBjb21wbGV0aW9uIHByb3Bvc2FscyBmb3IgdGhlIHN0YXRlIGZpZWxkcyBhbmQgYXNzb2NpYXRpb24gZmllbGRzIHRoYXQgYXJlIHBvc3NpYmxlIHByb3Bvc2Fscy4KLQkgKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMgVGhlIGxpc3QgdXNlZCB0byBzdG9yZSB0aGUgbmV3IGNvbXBsZXRpb24gcHJvcG9zYWxzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE1hcHBpbmdzKExpc3Q8VD4gcHJvcG9zYWxzKSB7Ci0JCWZvciAoSU1hcHBpbmcgbWFwcGluZyA6IHNvcnQoY29udGVudEFzc2lzdFByb3Bvc2Fscy5tYXBwaW5ncygpKSkgewotCQkJcHJvcG9zYWxzLmFkZChidWlsZE1hcHBpbmdQcm9wb3NhbChtYXBwaW5nKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFQgYnVpbGRBYnN0cmFjdFNjaGVtYU5hbWVQcm9wb3NhbChJRW50aXR5IGFic3RyYWN0U2NoZW1hVHlwZSkgewotCQlTdHJpbmcgcHJvcG9zYWwgPSBhYnN0cmFjdFNjaGVtYVR5cGUuZ2V0TmFtZSgpOwotCQlyZXR1cm4gYnVpbGRQcm9wb3NhbChwcm9wb3NhbCwgcHJvcG9zYWwsIGVudGl0eUltYWdlKCkpOwotCX0KLQotCXByaXZhdGUgQ29tcGFyYXRvcjxJRW50aXR5PiBidWlsZEVudGl0eU5hbWVDb21wYXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IENvbXBhcmF0b3I8SUVudGl0eT4oKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoSUVudGl0eSBlbnRpdHkxLCBJRW50aXR5IGVudGl0eTIpIHsKLQkJCQlyZXR1cm4gZW50aXR5MS5nZXROYW1lKCkuY29tcGFyZVRvKGVudGl0eTIuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZElkZW50aWZpY2F0aW9uVmFyaWFibGVEaXNwbGF5U3RyaW5nKFN0cmluZyBpZGVudGlmaWNhdGlvblZhcmlhYmxlKSB7Ci0KLQkJSUVudGl0eSBhYnN0cmFjdFNjaGVtYVR5cGUgPSBjb250ZW50QXNzaXN0UHJvcG9zYWxzLmdldEFic3RyYWN0U2NoZW1hVHlwZShpZGVudGlmaWNhdGlvblZhcmlhYmxlKTsKLQotCQlpZiAoYWJzdHJhY3RTY2hlbWFUeXBlICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJc2IuYXBwZW5kKGlkZW50aWZpY2F0aW9uVmFyaWFibGUpOwotCQkJc2IuYXBwZW5kKCIgOiAiKTsKLQkJCXNiLmFwcGVuZChhYnN0cmFjdFNjaGVtYVR5cGUuZ2V0TmFtZSgpKTsKLQkJCWlkZW50aWZpY2F0aW9uVmFyaWFibGUgPSBzYi50b1N0cmluZygpOwotCQl9Ci0KLQkJcmV0dXJuIGlkZW50aWZpY2F0aW9uVmFyaWFibGU7Ci0JfQotCi0JcHJpdmF0ZSBUIGJ1aWxkSWRlbnRpZmljYXRpb25WYXJpYWJsZVByb3Bvc2FsKFN0cmluZyBwcm9wb3NhbCkgewotCQlyZXR1cm4gYnVpbGRQcm9wb3NhbCgKLQkJCXByb3Bvc2FsLAotCQkJYnVpbGRJZGVudGlmaWNhdGlvblZhcmlhYmxlRGlzcGxheVN0cmluZyhwcm9wb3NhbCksCi0JCQlpZGVudGlmaWNhdGlvblZhcmlhYmxlSW1hZ2UoKQotCQkpOwotCX0KLQotCXByaXZhdGUgVCBidWlsZElkZW50aWZpZXJQcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwpIHsKLQotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBhZGRpdGlvbmFsSW5mbyhwcm9wb3NhbCk7Ci0JCUlkZW50aWZpZXJSb2xlIHJvbGUgPSBxdWVyeUhlbHBlci5nZXRRdWVyeUNvbnRleHQoKS5nZXRFeHByZXNzaW9uUmVnaXN0cnkoKS5nZXRJZGVudGlmaWVyUm9sZShwcm9wb3NhbCk7Ci0JCWJvb2xlYW4gcmVhbEZ1bmN0aW9uID0gKHJvbGUgPT0gSWRlbnRpZmllclJvbGUuRlVOQ1RJT04pICYmIGlzUmVhbEZ1bmN0aW9uKHByb3Bvc2FsKTsKLQkJaW50IGN1cnNvck9mZnNldCA9IDA7Ci0KLQkJLy8gVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGxldHRlciBiZWZvcmUgdGhlIGN1cnNvciwgaWYgdGhlIHNldHRpbmcgIk1hdGNoIEZpcnN0IExldHRlciBDYXNlIgotCQkvLyBpcyB0cnVlLCB0aGVuIG1hdGNoIHRoZSBjYXNlIG9mIHRoZSBKUFFMIGlkZW50aWZpZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyCi0JCWlmICgocGFydGlhbFdvcmQubGVuZ3RoKCkgPiAwKSAmJiBzaG91bGRNYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZSgpKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHBhcnRpYWxXb3JkLmNoYXJBdCgwKSkpIHsKLQkJCQlwcm9wb3NhbCA9IHByb3Bvc2FsLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gQ29udmVydCB0aGUgY2FzZSBvZiB0aGUgSlBRTCBpZGVudGlmaWVyIGJhc2VkIG9uIHRoZSBzZXR0aW5nCi0JCWVsc2UgaWYgKHNob3VsZFVzZUxvd2VyY2FzZUlkZW50aWZpZXJzKCkpIHsKLQkJCXByb3Bvc2FsID0gcHJvcG9zYWwudG9Mb3dlckNhc2UoKTsKLQkJfQotCi0JCS8vIEZvciBKUFFMIGZ1bmN0aW9uLCB3ZSBhZGQgKCkgdG8gdGhlIGRpc3BsYXkgc3RyaW5nLCBleGFtcGxlOiBBVkcoKQotCQkvLyBCdXQgZm9yIFRSVUUsIEZBTFNFLCBldGMsIHdlIGRvbid0IGFkZCAoKQotCQlpZiAocmVhbEZ1bmN0aW9uKSB7Ci0JCQlwcm9wb3NhbCArPSAiKCkiOwotCQkJY3Vyc29yT2Zmc2V0LS07Ci0JCX0KLQotCQlyZXR1cm4gYnVpbGRQcm9wb3NhbCgKLQkJCXByb3Bvc2FsLAotCQkJcHJvcG9zYWwsCi0JCQlhZGRpdGlvbmFsSW5mbywKLQkJCWlkZW50aWZpZXJJbWFnZShyZWFsRnVuY3Rpb24pLAotCQkJY3Vyc29yT2Zmc2V0Ci0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBUIGJ1aWxkTWFwcGluZ1Byb3Bvc2FsKElNYXBwaW5nIG1hcHBpbmcpIHsKLQkJU3RyaW5nIHByb3Bvc2FsID0gbWFwcGluZy5nZXROYW1lKCk7Ci0JCXJldHVybiBidWlsZFByb3Bvc2FsKHByb3Bvc2FsLCBwcm9wb3NhbCwgbWFwcGluZ0ltYWdlKG1hcHBpbmcpKTsKLQl9Ci0KLQlwcml2YXRlIFQgYnVpbGRQcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsIFN0cmluZyBkaXNwbGF5U3RyaW5nLCBJbWFnZSBpbWFnZSkgewotCQlyZXR1cm4gYnVpbGRQcm9wb3NhbChwcm9wb3NhbCwgZGlzcGxheVN0cmluZywgbnVsbCwgaW1hZ2UsIDApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBwcm9wb3NhbCBmb3IgdGhlIGdpdmVuIHByb3Bvc2FsLgotCSAqCi0JICogQHBhcmFtIHByb3Bvc2FsIEEgdmFsaWQgcHJvcG9zYWwgdGhhdCBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgcXVlcnkKLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZyBUaGUgaHVtYW4gcmVhZGFibGUgc3RyaW5nIG9mIHRoZSBwcm9wb3NhbAotCSAqIEBwYXJhbSBhZGRpdGlvbmFsSW5mbyBPcHRpb25hbCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9wb3NhbC4gVGhlIGFkZGl0aW9uYWwKLQkgKiBpbmZvcm1hdGlvbiB3aWxsIGJlIHByZXNlbnRlZCB0byBhc3Npc3QgdGhlIHVzZXIgaW4gZGVjaWRpbmcgaWYgdGhlIHNlbGVjdGVkIHByb3Bvc2FsIGlzIHRoZQotCSAqIGRlc2lyZWQgY2hvaWNlCi0JICogQHBhcmFtIGltYWdlIFRoZSBpbWFnZSB0aGF0IHJlcHJlc2VudHMgdGhlIHByb3Bvc2FsCi0JICogQHBhcmFtIGN1cnNvck9mZnNldCBBbiBvZmZzZXQgdGhhdCBtb3ZlcyB0aGUgY3Vyc29yIGJhY2t3YXJkIG9yIGZvcndhcmQgYWZ0ZXIgaXQgaXMgYWRqdXN0ZWQKLQkgKiBiYXNlZCBvbiB0aGUgZ2l2ZW4gcHJvcG9zYWwKLQkgKiBAcmV0dXJuIFRoZSBjb21wbGV0aW9uIHByb3Bvc2FsCi0JICovCi0JYWJzdHJhY3QgVCBidWlsZFByb3Bvc2FsKFN0cmluZyBwcm9wb3NhbCwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRpc3BsYXlTdHJpbmcsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhZGRpdGlvbmFsSW5mbywKLQkgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UgaW1hZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdXJzb3JPZmZzZXQpOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZW50IG9mIHRoZSBKUFFMIHF1ZXJ5IGFuZCBhdAotCSAqIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCi0JICoKLQkgKiBAcGFyYW0gbmFtZWRRdWVyeSBUaGUgbW9kZWwgb2JqZWN0IHVzZWQgdG8gYWNjZXNzIHRoZSBhcHBsaWNhdGlvbiBtZXRhZGF0YSBpbmZvcm1hdGlvbgotCSAqIEBwYXJhbSBhY3R1YWxRdWVyeSBUaGUgbW9kZWwgb2JqZWN0IG1heSBzb21ldGltZXMgYmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgYWN0dWFsIGNvbnRlbnQsIHRoZQotCSAqIGFjdHVhbCBxdWVyeSBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIGNvbnRlbnQgYXNzaXN0Ci0JICogQHBhcmFtIG9mZnNldCBUaGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcgd2l0aGluIHRoZSBkb2N1bWVudAotCSAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdGhlIGN1cnNvciB3aXRoaW4gdGhlIHF1ZXJ5LCB3aGljaCBzdGFydHMgYXQgdGhlIGJlZ2lubmluZyBvZgotCSAqIHRoYXQgcXVlcnkgYW5kIG5vdCB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzCi0JICovCi0JZmluYWwgTGlzdDxUPiBidWlsZFByb3Bvc2FscyhOYW1lZFF1ZXJ5IG5hbWVkUXVlcnksIFN0cmluZyBhY3R1YWxRdWVyeSwgaW50IG9mZnNldCwgaW50IHBvc2l0aW9uKSB7Ci0KLQkJdHJ5IHsKLQkJCXRoaXMub2Zmc2V0ICAgICAgPSBvZmZzZXQ7Ci0JCQl0aGlzLmFjdHVhbFF1ZXJ5ID0gYWN0dWFsUXVlcnk7Ci0JCQl0aGlzLm5hbWVkUXVlcnkgID0gbmFtZWRRdWVyeTsKLQotCQkJLy8gSXQncyBwb3NzaWJsZSB0aGUgc3RyaW5nIGhhcyBsaXRlcmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlc2NhcGUgY2hhcmFjdGVycywgaWYgcmVxdWlyZWQsCi0JCQkvLyBjb252ZXJ0IHRoZW0gaW50byBhY3R1YWwgZXNjYXBlIGNoYXJhY3RlcnMgYW5kIGFkanVzdCB0aGUgcG9zaXRpb24gYWNjb3JkaW5nbHkKLQkJCWludFtdIHBvc2l0aW9ucyAgPSB7IHBvc2l0aW9uIH07Ci0JCQl0aGlzLmpwcWxRdWVyeSAgID0gbW9kaWZ5SnBxbFF1ZXJ5KGFjdHVhbFF1ZXJ5LCBwb3NpdGlvbnMpOwotCQkJdGhpcy5wb3NpdGlvbiAgICA9IHBvc2l0aW9uc1swXTsKLQkJCXRoaXMucGFydGlhbFdvcmQgPSBwYXJ0aWFsV29yZCgpOwotCi0JCQkvLyBDcmVhdGUgdGhlIHF1ZXJ5IGhlbHBlciwgaW5pdGlhbGl6ZSBpdCBhbmQgdGhlbiByZXRyaWV2ZSB0aGUgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzCi0JCQlpZiAodGhpcy5xdWVyeUhlbHBlciA9PSBudWxsKSB7Ci0JCQkJdGhpcy5xdWVyeUhlbHBlciA9IG5hbWVkUXVlcnkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuY3JlYXRlSnBxbFF1ZXJ5SGVscGVyKCk7Ci0JCQl9Ci0KLQkJCXRoaXMucXVlcnlIZWxwZXIuc2V0UXVlcnkobmFtZWRRdWVyeSwganBxbFF1ZXJ5KTsKLQkJCXRoaXMuY29udGVudEFzc2lzdFByb3Bvc2FscyA9IHF1ZXJ5SGVscGVyLmJ1aWxkQ29udGVudEFzc2lzdFByb3Bvc2Fscyhwb3NpdGlvbnNbMF0pOwotCi0JCQkvLyBDcmVhdGUgdGhlIHByb3Bvc2FscyBmb3IgdGhvc2UgcHJvcG9zYWxzCi0JCQlMaXN0PFQ+IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3Q8VD4oKTsKLQkJCWFkZEFic3RyYWN0U2NoZW1hTmFtZXMgICAgKHByb3Bvc2Fscyk7Ci0JCQlhZGRJZGVudGlmaWNhdGlvblZhcmlhYmxlcyhwcm9wb3NhbHMpOwotCQkJYWRkSWRlbnRpZmllcnMgICAgICAgICAgICAocHJvcG9zYWxzKTsKLQkJCWFkZE1hcHBpbmdzICAgICAgICAgICAgICAgKHByb3Bvc2Fscyk7Ci0KLQkJCXJldHVybiBwcm9wb3NhbHM7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQljbGVhckluZm9ybWF0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlmaW5hbCB2b2lkIGNoZWNrQ2FuY2VsZWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBjYWNoZWQgaW5mb3JtYXRpb24uCi0JICovCi0JZmluYWwgdm9pZCBjbGVhckluZm9ybWF0aW9uKCkgewotCQluYW1lZFF1ZXJ5ICA9IG51bGw7Ci0JCW9mZnNldCAgICAgID0gLTE7Ci0JCXBvc2l0aW9uICAgID0gLTE7Ci0JCWFjdHVhbFF1ZXJ5ID0gbnVsbDsKLQkJbmFtZWRRdWVyeSAgPSBudWxsOwotCQlwYXJ0aWFsV29yZCA9IG51bGw7Ci0JCWNvbnRlbnRBc3Npc3RQcm9wb3NhbHMgPSBudWxsOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZW50aXR5SW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLkVOVElUWSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVhc29uIHdoeSB0aGlzIGNvbXB1dGVyIHdhcyB1bmFibGUgdG8gcHJvZHVjZSBhbnkgY29tcGxldGlvbiBwcm9wb3NhbHMgb3IKLQkgKiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqCi0JICogQHJldHVybiBBbiBlcnJvciBtZXNzYWdlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGtleSkgewotCQlJbWFnZVJlZ2lzdHJ5IGltYWdlUmVnaXN0cnkgPSBnZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JCUltYWdlIGltYWdlID0gaW1hZ2VSZWdpc3RyeS5nZXQoa2V5KTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkucHV0KGtleSwgZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSkpOwotCQkJaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChrZXkpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKGtleSk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCWlmIChpbWFnZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCWltYWdlUmVnaXN0cnkgPSBuZXcgSW1hZ2VSZWdpc3RyeShEaXNwbGF5LmdldEN1cnJlbnQoKSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlUmVnaXN0cnk7Ci0JfQotCi0JcHJpdmF0ZSBJbWFnZSBpZGVudGlmaWNhdGlvblZhcmlhYmxlSW1hZ2UoKSB7Ci0JCXJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLkpQUUxfVkFSSUFCTEUpOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgaWRlbnRpZmllckltYWdlKGJvb2xlYW4gZnVuY3Rpb24pIHsKLQotCQlpZiAoZnVuY3Rpb24pIHsKLQkJCXJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLkpQUUxfRlVOQ1RJT04pOwotCQl9Ci0KLQkJcmV0dXJuIGdldEltYWdlKEpwdFVpSWNvbnMuSlBRTF9JREVOVElGSUVSKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWFsRnVuY3Rpb24oU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJcmV0dXJuIGlkZW50aWZpZXIgIT0gRXhwcmVzc2lvbi5UUlVFICAgICAgICAgJiYKLQkJICAgICAgIGlkZW50aWZpZXIgIT0gRXhwcmVzc2lvbi5GQUxTRSAgICAgICAgJiYKLQkJICAgICAgIGlkZW50aWZpZXIgIT0gRXhwcmVzc2lvbi5OVUxMICAgICAgICAgJiYKLQkJICAgICAgIGlkZW50aWZpZXIgIT0gRXhwcmVzc2lvbi5DVVJSRU5UX0RBVEUgJiYKLQkJICAgICAgIGlkZW50aWZpZXIgIT0gRXhwcmVzc2lvbi5DVVJSRU5UX1RJTUUgJiYKLQkJICAgICAgIGlkZW50aWZpZXIgIT0gRXhwcmVzc2lvbi5DVVJSRU5UX1RJTUVTVEFNUDsKLQl9Ci0KLQlwcml2YXRlIEltYWdlIG1hcHBpbmdJbWFnZShJTWFwcGluZyBtYXBwaW5nKSB7Ci0JCXN3aXRjaCAobWFwcGluZy5nZXRNYXBwaW5nVHlwZSgpKSB7Ci0JCQljYXNlIEJBU0lDOiAgICAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLkJBU0lDKTsKLS8vCQkJY2FzZSBCQVNJQ19DT0xMRUNUSU9OOiAgICByZXR1cm4gZ2V0SW1hZ2UoSnB0VWlJY29ucy5FTEVNRU5UX0NPTExFQ1RJT04pOwotLy8JCQljYXNlIEJBU0lDX01BUDogICAgICAgICAgIHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQljYXNlIEVMRU1FTlRfQ09MTEVDVElPTjogIHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQljYXNlIEVNQkVEREVEOiAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLkVNQkVEREVEKTsKLQkJCWNhc2UgRU1CRURERURfSUQ6ICAgICAgICAgcmV0dXJuIGdldEltYWdlKEpwdFVpSWNvbnMuRU1CRURERURfSUQpOwotCQkJY2FzZSBJRDogICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoSnB0VWlJY29ucy5JRCk7Ci0JCQljYXNlIE1BTllfVE9fTUFOWTogICAgICAgIHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLk1BTllfVE9fTUFOWSk7Ci0JCQljYXNlIE1BTllfVE9fT05FOiAgICAgICAgIHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLk1BTllfVE9fT05FKTsKLQkJCWNhc2UgT05FX1RPX01BTlk6ICAgICAgICAgcmV0dXJuIGdldEltYWdlKEpwdFVpSWNvbnMuT05FX1RPX01BTlkpOwotCQkJY2FzZSBPTkVfVE9fT05FOiAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoSnB0VWlJY29ucy5PTkVfVE9fT05FKTsKLS8vCQkJY2FzZSBUUkFOU0ZPUk1BVElPTjogICAgICByZXR1cm4gZ2V0SW1hZ2UoSnB0VWlJY29ucy5CQVNJQyk7ICAgICAgLy8gVE9ETwotLy8JCQljYXNlIFZBUklBQkxFX09ORV9UT19PTkU6IHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLk9ORV9UT19PTkUpOyAvLyBUT0RPCi0JCQljYXNlIFZFUlNJT046ICAgICAgICAgICAgIHJldHVybiBnZXRJbWFnZShKcHRVaUljb25zLlZFUlNJT04pOwotCQkJZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW1hZ2UoSnB0VWlJY29ucy5UUkFOU0lFTlQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW4gc29tZSBjb250ZXh0LCB0aGUgZ2l2ZW4gSlBRTCBxdWVyeSBuZWVkcyB0byBiZSBtb2RpZmllZCBiZWZvcmUgaXQgaXMgcGFyc2VkLgotCSAqCi0JICogQHBhcmFtIGpwcWxRdWVyeSBUaGUgSlBRTCBxdWVyeSB0byBrZWVwIHVuY2hhbmdlZCBvciB0byBtb2RpZnkgYmVmb3JlIHBhcnNpbmcgaXQKLQkgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3Igd2l0aGluIHRoZSBKUFFMIHF1ZXJ5LCB3aGljaCBuZWVkcyB0byBiZSB1cGRhdGVkIGlmCi0JICogdGhlIHF1ZXJ5IGlzIG1vZGlmaWVkCi0JICogQHJldHVybiBUaGUgZ2l2ZW4gSlBRTCBxdWVyeSBvciBhIG1vZGlmaWVkIHZlcnNpb24gdGhhdCB3aWxsIGJlIHBhcnNlZAotCSAqLwotCVN0cmluZyBtb2RpZnlKcHFsUXVlcnkoU3RyaW5nIGpwcWxRdWVyeSwgaW50W10gcG9zaXRpb24pIHsKLQkJcmV0dXJuIGpwcWxRdWVyeTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwYXJ0aWFsV29yZCgpIHsKLQkJV29yZFBhcnNlciB3b3JkUGFyc2VyID0gbmV3IFdvcmRQYXJzZXIoanBxbFF1ZXJ5KTsKLQkJd29yZFBhcnNlci5zZXRQb3NpdGlvbihwb3NpdGlvbik7Ci0JCXJldHVybiB3b3JkUGFyc2VyLnBhcnRpYWxXb3JkKCk7Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyB0aGUgY29tcHV0ZXIgdGhhdCBhIGNvbnRlbnQgYXNzaXN0IHNlc3Npb24gaGFzIGVuZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25FbmRlZCgpIHsKLQotCQlxdWVyeUhlbHBlciA9IG51bGw7Ci0JCWNsZWFySW5mb3JtYXRpb24oKTsKLQotCQlpZiAoaW1hZ2VSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQlpbWFnZVJlZ2lzdHJ5LmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgdGhlIGNvbXB1dGVyIHRoYXQgYSBjb250ZW50IGFzc2lzdCBzZXNzaW9uIGhhcyBzdGFydGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNlc3Npb25TdGFydGVkKCkgewotCQkvLyBOb3RoaW5nIHRvIGRvCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZE1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlKCkgewotCQlyZXR1cm4gSnB0SnBhVWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKEpwdEpwYVVpUGx1Z2luLkpQUUxfSURFTlRJRklFUl9NQVRDSF9GSVJTVF9DSEFSQUNURVJfQ0FTRV9QUkVGX0tFWSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFVzZUxvd2VyY2FzZUlkZW50aWZpZXJzKCkgewotCQlTdHJpbmcgdmFsdWUgPSBKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhKcHRKcGFVaVBsdWdpbi5KUFFMX0lERU5USUZJRVJfQ0FTRV9QUkVGX0tFWSk7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5KUFFMX0lERU5USUZJRVJfTE9XRVJDQVNFX1BSRUZfVkFMVUUuZXF1YWxzKHZhbHVlKTsKLQl9Ci0KLQlwcml2YXRlIDxJIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEk+PiBJdGVyYWJsZTxJPiBzb3J0KEl0ZXJhYmxlPEk+IGl0ZXJhdG9yKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc29ydChpdGVyYXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYWJsZTxJRW50aXR5PiBzb3J0QnlOYW1lcyhJdGVyYWJsZTxJRW50aXR5PiBhYnN0cmFjdFNjaGVtYVR5cGVzKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuc29ydChhYnN0cmFjdFNjaGVtYVR5cGVzLCBidWlsZEVudGl0eU5hbWVDb21wYXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwcWwvSnBxbElkZW50aWZpZXJNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL0pwcWxJZGVudGlmaWVyTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlNjYwMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2pwcWwvSnBxbElkZW50aWZpZXJNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIGFuZCBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uCi0gKiBUaGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIGFuZCB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qcHFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLnBhcnNlci5FeHByZXNzaW9uOwotCi0vKioKLSAqIFRoZSBsb2NhbGl6ZWQgbWVzc2FnZXMgZGVzY3JpYmluZyB0aGUgSlBRTCBpZGVudGlmaWVycy4KLSAqCi0gKiBAdmVyc2lvbiAzLjEKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLWZpbmFsIGNsYXNzIEpwcWxJZGVudGlmaWVyTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JLy8gSlBBIDEuMCBpZGVudGlmaWVycwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFCUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBTEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQU5ZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBVkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQkVUV0VFTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCT1RIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPTkNBVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDT1VOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDVVJSRU5UX0RBVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1VSUkVOVF9USU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENVUlJFTlRfVElNRVNUQU1QOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFTEVURV9GUk9NOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRElTVElOQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRVNDQVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVYSVNUUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGUk9NOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdST1VQX0JZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhBVklORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJU19FTVBUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJU19OVUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpPSU47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSk9JTl9GRVRDSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExFTkdUSDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMSUtFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExPQ0FURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMT1dFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNQVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVNQkVSOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1JTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNT0Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTkVXOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9CSkVDVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPUkRFUl9CWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTRUxFQ1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU0laRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTT01FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNRUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU1VCU1RSSU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNVTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUUkFJTElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUUklNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVQREFURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVUFBFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXSEVSRTsKLQotCS8vIEpQQSAyLjAgaWRlbnRpZmllcnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDQVNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENPQUxFU0NFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVFJZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElOREVYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOVUxMSUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWQUxVRTsKLQotCS8vIEVjbGlwc2VMaW5rIGlkZW50aWZpZXJzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRlVOQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUUkVBVDsKLQotCS8vIFJlc2VydmVkIEpQUUwgaWRlbnRpZmllcnMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCSVRfTEVOR1RIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENIQVJfTEVOR1RIOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENIQVJBQ1RFUl9MRU5HVEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0xBU1M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUE9TSVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVU5LTk9XTjsKLQotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoImpwdF91aV9qcHFsX2lkZW50aWZpZXJzIiwgSnBxbElkZW50aWZpZXJNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JSnBxbElkZW50aWZpZXJNZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiByZWdpc3RlcmVkSWRlbnRpZmVyczsKLQotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGRSZWdpc3RlcmVkSWRlbnRpZmVycygpIHsKLQotCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGlkZW50aWZpZXJzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkJaWRlbnRpZmllcnMucHV0KEV4cHJlc3Npb24uSVNfTk9UX0VNUFRZLCAgRXhwcmVzc2lvbi5JU19FTVBUWSk7Ci0JCWlkZW50aWZpZXJzLnB1dChFeHByZXNzaW9uLklTX05PVF9OVUxMLCAgIEV4cHJlc3Npb24uSVNfTlVMTCk7Ci0JCWlkZW50aWZpZXJzLnB1dChFeHByZXNzaW9uLk1FTUJFUl9PRiwgICAgIEV4cHJlc3Npb24uTUVNQkVSKTsKLQkJaWRlbnRpZmllcnMucHV0KEV4cHJlc3Npb24uTk9UX0lOLCAgICAgICAgRXhwcmVzc2lvbi5JTik7Ci0JCWlkZW50aWZpZXJzLnB1dChFeHByZXNzaW9uLk5PVF9CRVRXRUVOLCAgIEV4cHJlc3Npb24uQkVUV0VFTik7Ci0JCWlkZW50aWZpZXJzLnB1dChFeHByZXNzaW9uLk5PVF9NRU1CRVIsICAgIEV4cHJlc3Npb24uTUVNQkVSKTsKLQkJaWRlbnRpZmllcnMucHV0KEV4cHJlc3Npb24uTk9UX01FTUJFUl9PRiwgRXhwcmVzc2lvbi5NRU1CRVIpOwotCi0JCWlkZW50aWZpZXJzLnB1dChFeHByZXNzaW9uLklOTkVSX0pPSU4sICAgICAgRXhwcmVzc2lvbi5KT0lOKTsKLQkJaWRlbnRpZmllcnMucHV0KEV4cHJlc3Npb24uTEVGVF9KT0lOLCAgICAgICBFeHByZXNzaW9uLkpPSU4pOwotCQlpZGVudGlmaWVycy5wdXQoRXhwcmVzc2lvbi5MRUZUX09VVEVSX0pPSU4sIEV4cHJlc3Npb24uSk9JTik7Ci0KLQkJaWRlbnRpZmllcnMucHV0KEV4cHJlc3Npb24uSU5ORVJfSk9JTl9GRVRDSCwgICAgICBFeHByZXNzaW9uLkpPSU5fRkVUQ0gpOwotCQlpZGVudGlmaWVycy5wdXQoRXhwcmVzc2lvbi5MRUZUX0pPSU5fRkVUQ0gsICAgICAgIEV4cHJlc3Npb24uSk9JTl9GRVRDSCk7Ci0JCWlkZW50aWZpZXJzLnB1dChFeHByZXNzaW9uLkxFRlRfT1VURVJfSk9JTl9GRVRDSCwgRXhwcmVzc2lvbi5KT0lOX0ZFVENIKTsKLQotCQlyZXR1cm4gaWRlbnRpZmllcnM7Ci0JfQotCi0JLyoqCi0JICogQ29udmVydHMgdGhlIGdpdmVuIEpQUUwgaWRlbnRpZmllciB0byB0aGUgc2hvcnRlc3QgZm9ybSB0aGF0IGlzIHVzZWQgdG8gbWFwIHRoZSBsb2NhbGl6ZWQKLQkgKiBtZXNzYWdlLiBJZiB0aGUgaWRlbnRpZmllciBpcyA8Yj5OT1QgTUVNQkVSPC9iPiBmb3IgaW5zdGFuY2UsIHRoZW4gaXQgbmVlZHMgdG8gYmUgY29udmVydGVkCi0JICogdG8gPGI+TUVNQkVSPC9iPiBzaW5jZSB0aGF0J3MgdGhlIGlkZW50aWZpZXIgdXNlZCB0byBtYXAgdGhlIGxvY2FsaXplIG1lc3NhZ2UuCi0JICoKLQkgKiBAcGFyYW0gaWRlbnRpZmllciBUaGUgSlBRTCBpZGVudGlmaWVyIHRvIGNvbnZlcnQsIGlmIG5lZWRlZAotCSAqIEByZXR1cm4gRWl0aGVyIHRoZSBnaXZlbiBKUFFMIGlkZW50aWZpZXIgb3IgaXRzIGNvdW50ZXJwYXJ0IHRoYXQgaXMgdXNlZCB0byBtYXAgdGhlIGxvY2FsaXplZAotCSAqIG1lc3NhZ2UKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJaWRlbnRpZmllciA9IHJlZ2lzdGVyZWRJZGVudGlmZXIoaWRlbnRpZmllcik7Ci0JCWlkZW50aWZpZXIgPSBpZGVudGlmaWVyLnJlcGxhY2UoIiAiLCAiXyIpOwotCQlyZXR1cm4gaWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGxvY2FsaXplZCBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlLCBpZiBpdCdzIGEgSlBRTCBpZGVudGlmaWVyLgotCSAqCi0JICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIEpQUUwgaWRlbnRpZmllciBmb3Igd2hpY2ggaXRzIGxvY2FsaXplZCBkZXNjcmlwdGlvbiBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIFRoZSBsb2NhbGl6ZWQgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBnaXZlbiBKUFFMIGlkZW50aWZpZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogZ2l2ZW4gY2hvaWNlIGlzIG5vdCBhbiBpZGVudGlmaWVyCi0JICovCi0Jc3RhdGljIFN0cmluZyBsb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCXRyeSB7Ci0JCQlpZGVudGlmaWVyID0gY29udmVydElkZW50aWZpZXIoaWRlbnRpZmllcik7Ci0JCQlGaWVsZCBjb25zdGFudCA9IEpwcWxJZGVudGlmaWVyTWVzc2FnZXMuY2xhc3MuZ2V0RmllbGQoaWRlbnRpZmllcik7Ci0JCQlyZXR1cm4gKFN0cmluZykgY29uc3RhbnQuZ2V0KG51bGwpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gVGhlIGNob2ljZSBpcyBub3QgYSBKUFFMIGlkZW50aWZpZXIKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlZ2lzdGVyZWRJZGVudGlmZXIoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJU3RyaW5nIGFub3RoZXIgPSByZWdpc3RlcmVkSWRlbnRpZmVycygpLmdldChpZGVudGlmaWVyKTsKLQkJaWYgKGFub3RoZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFub3RoZXI7Ci0JCX0KLQkJcmV0dXJuIGlkZW50aWZpZXI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiByZWdpc3RlcmVkSWRlbnRpZmVycygpIHsKLQkJaWYgKHJlZ2lzdGVyZWRJZGVudGlmZXJzID09IG51bGwpIHsKLQkJCXJlZ2lzdGVyZWRJZGVudGlmZXJzID0gYnVpbGRSZWdpc3RlcmVkSWRlbnRpZmVycygpOwotCQl9Ci0JCXJldHVybiByZWdpc3RlcmVkSWRlbnRpZmVyczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL1RleHRUcmFuc2ZlckhhbmRsZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvanBxbC9UZXh0VHJhbnNmZXJIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYmI5YTEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9qcHFsL1RleHRUcmFuc2ZlckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCBhbmQgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLgotICogVGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiBhbmQgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBxbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkNsaXBib2FyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRleHRUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmludGVybmFsLldvcmtiZW5jaE1lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgaGFuZGxlciBhZGRzIGEgY29udGV4dCBtZW51IG9udG8gYSB7QGxpbmsgU3R5bGVkVGV4dH0gd2hpY2ggaGF2ZSB0aGUgZGVmYXVsdCBhY3Rpb25zIGRlYWxpbmcKLSAqIHdpdGggdGV4dCBlZGl0aW5nOiBVbmRvIHwgQ3V0LCBDb3B5LCBQYXN0ZSwgRGVsZXRlIHwgU2VsZWN0IEFsbC4KLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqIEBhdXRob3IgUGFzY2FsIEZpbGlvbgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGZpbmFsIGNsYXNzIFRleHRUcmFuc2ZlckhhbmRsZXIgewotCi0JcHJpdmF0ZSBNZW51SXRlbSBjb3B5TWVudUl0ZW07Ci0JcHJpdmF0ZSBNZW51SXRlbSBjdXRNZW51SXRlbTsKLQlwcml2YXRlIE1lbnVJdGVtIGRlbGV0ZU1lbnVJdGVtOwotCXByaXZhdGUgTWVudUl0ZW0gcGFzdGVNZW51SXRlbTsKLQlwcml2YXRlIE1lbnUgcG9wdXA7Ci0JcHJpdmF0ZSBNZW51SXRlbSBzZWxlY3RBbGxNZW51SXRlbTsKLQlwcml2YXRlIFN0eWxlZFRleHQgc3R5bGVkVGV4dDsKLQlwcml2YXRlIElVbmRvTWFuYWdlciB1bmRvTWFuYWdlcjsKLQlwcml2YXRlIE1lbnVJdGVtIHVuZG9NZW51SXRlbTsKLQotCXByaXZhdGUgVGV4dFRyYW5zZmVySGFuZGxlcihTdHlsZWRUZXh0IHN0eWxlZFRleHQsIElVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCQlzdXBlcigpOwotCQl0aGlzLnN0eWxlZFRleHQgID0gc3R5bGVkVGV4dDsKLQkJdGhpcy51bmRvTWFuYWdlciA9IHVuZG9NYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIEluc3RhbGxzIGEgY29udGV4dCBtZW51IG9udG8gdGhlIGdpdmVuIHtAbGluayBTdHlsZWRUZXh0fSB3aGljaCBoYXZlIHRoZSBkZWZhdWx0IGFjdGlvbnMKLQkgKiBkZWFsaW5nIHdpdGggdGV4dCBlZGl0aW5nOiBVbmRvIHwgQ3V0LCBDb3B5LCBQYXN0ZSwgRGVsZXRlIHwgU2VsZWN0IEFsbC4KLQkgKgotCSAqIEBwYXJhbSBzdHlsZWRUZXh0IFRoZSB3aWRnZXQgZm9yIHdoaWNoIGEgY29udGV4dCBtZW51IHdpbGwgYmUgYWRkZWQKLQkgKiBAcGFyYW0gdW5kb01hbmFnZXIgVGhlIG1hbmFnZXIgdG8gdW5kbyBrZXlzdHJva2VzCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc3RhbGxDb250ZXh0TWVudShTdHlsZWRUZXh0IHN0eWxlZFRleHQsIElVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCQlUZXh0VHJhbnNmZXJIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGV4dFRyYW5zZmVySGFuZGxlcihzdHlsZWRUZXh0LCB1bmRvTWFuYWdlcik7Ci0JCWhhbmRsZXIuaW5zdGFsbFBvcHVwKCk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25BZGFwdGVyIGJ1aWxkQ29weVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzdHlsZWRUZXh0LmNvcHkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkQ3V0U2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXN0eWxlZFRleHQuY3V0KCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZERlbGV0ZVNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlQb2ludCBzZWxlY3Rpb24gPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvbigpOwotCQkJCXN0eWxlZFRleHQucmVwbGFjZVRleHRSYW5nZShzZWxlY3Rpb24ueCwgc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueCwgU3RyaW5nVG9vbHMuRU1QVFlfU1RSSU5HKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIE1lbnVMaXN0ZW5lciBidWlsZE1lbnVMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51SGlkZGVuKE1lbnVFdmVudCBlKSB7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCBtZW51U2hvd24oTWVudUV2ZW50IGUpIHsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkUGFzdGVTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3R5bGVkVGV4dC5wYXN0ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRTZWxlY3RBbGxTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc3R5bGVkVGV4dC5zZWxlY3RBbGwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVW5kb1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1bmRvTWFuYWdlci51bmRvKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkNvcHkoKSB7Ci0JCVBvaW50IHNlbGVjdGlvbiA9IHN0eWxlZFRleHQuZ2V0U2VsZWN0aW9uKCk7Ci0JCXJldHVybiBzZWxlY3Rpb24ueCAhPSBzZWxlY3Rpb24ueTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuQ3V0KCkgewotCQlQb2ludCBzZWxlY3Rpb24gPSBzdHlsZWRUZXh0LmdldFNlbGVjdGlvbigpOwotCQlyZXR1cm4gc2VsZWN0aW9uLnggIT0gc2VsZWN0aW9uLnk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkRlbGV0ZSgpIHsKLQkJUG9pbnQgc2VsZWN0aW9uID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIHNlbGVjdGlvbi54ICE9IHNlbGVjdGlvbi55OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYW5QYXN0ZSgpIHsKLQotCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChzdHlsZWRUZXh0LmdldERpc3BsYXkoKSk7Ci0JCWJvb2xlYW4gY2FuUGFzdGUgPSBmYWxzZTsKLQotCQlmb3IgKFRyYW5zZmVyRGF0YSBkYXRhIDogY2xpcGJvYXJkLmdldEF2YWlsYWJsZVR5cGVzKCkpIHsKLQkJCWlmIChUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKS5pc1N1cHBvcnRlZFR5cGUoZGF0YSkpIHsKLQkJCQljYW5QYXN0ZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQljbGlwYm9hcmQuZGlzcG9zZSgpOwotCQlyZXR1cm4gY2FuUGFzdGU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhblNlbGVjdEFsbCgpIHsKLQkJUG9pbnQgc2VsZWN0aW9uID0gc3R5bGVkVGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJU3RyaW5nIHRleHQgPSBzdHlsZWRUZXh0LmdldFRleHQoKTsKLQkJcmV0dXJuIChzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54KSAhPSB0ZXh0Lmxlbmd0aCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnN0YWxsUG9wdXAoKSB7Ci0KLQkJcG9wdXAgPSBuZXcgTWVudShzdHlsZWRUZXh0LmdldFNoZWxsKCksIFNXVC5QT1BfVVApOwotCQlwb3B1cC5hZGRNZW51TGlzdGVuZXIoYnVpbGRNZW51TGlzdGVuZXIoKSk7Ci0JCXN0eWxlZFRleHQuc2V0TWVudShwb3B1cCk7Ci0KLQkJcG9wdWxhdGVQb3B1cCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVBvcHVwKCkgewotCi0JCS8vIFVuZG8KLQkJdW5kb01lbnVJdGVtID0gbmV3IE1lbnVJdGVtKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCXVuZG9NZW51SXRlbS5zZXRUZXh0KFdvcmtiZW5jaE1lc3NhZ2VzLldvcmtiZW5jaF91bmRvKTsKLQkJdW5kb01lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkVW5kb1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCi0JCW5ldyBNZW51SXRlbShwb3B1cCwgU1dULlNFUEFSQVRPUik7Ci0KLQkJLy8gQ3V0Ci0JCWN1dE1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCWN1dE1lbnVJdGVtLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX2N1dCk7Ci0JCWN1dE1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkQ3V0U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJLy8gQ29weQotCQljb3B5TWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0ocG9wdXAsIFNXVC5QVVNIKTsKLQkJY29weU1lbnVJdGVtLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX2NvcHkpOwotCQljb3B5TWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnVpbGRDb3B5U2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJLy8gUGFzdGUKLQkJcGFzdGVNZW51SXRlbSA9IG5ldyBNZW51SXRlbShwb3B1cCwgU1dULlBVU0gpOwotCQlwYXN0ZU1lbnVJdGVtLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX3Bhc3RlKTsKLQkJcGFzdGVNZW51SXRlbS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZFBhc3RlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJLy8gRGVsZXRlCi0JCWRlbGV0ZU1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCWRlbGV0ZU1lbnVJdGVtLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX2RlbGV0ZSk7Ci0JCWRlbGV0ZU1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkRGVsZXRlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0KLQkJbmV3IE1lbnVJdGVtKHBvcHVwLCBTV1QuU0VQQVJBVE9SKTsKLQotCQkvLyBTZWxlY3QgQWxsCi0JCXNlbGVjdEFsbE1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKHBvcHVwLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdEFsbE1lbnVJdGVtLnNldFRleHQoV29ya2JlbmNoTWVzc2FnZXMuV29ya2JlbmNoX3NlbGVjdEFsbCk7Ci0JCXNlbGVjdEFsbE1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkU2VsZWN0QWxsU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZSgpIHsKLQkJZGVsZXRlTWVudUl0ZW0gICAuc2V0RW5hYmxlZChjYW5EZWxldGUoKSk7Ci0JCWNvcHlNZW51SXRlbSAgICAgLnNldEVuYWJsZWQoY2FuQ29weSgpKTsKLQkJY3V0TWVudUl0ZW0gICAgICAuc2V0RW5hYmxlZChjYW5DdXQoKSk7Ci0JCXBhc3RlTWVudUl0ZW0gICAgLnNldEVuYWJsZWQoY2FuUGFzdGUoKSk7Ci0JCXNlbGVjdEFsbE1lbnVJdGVtLnNldEVuYWJsZWQoY2FuU2VsZWN0QWxsKCkpOwotCQl1bmRvTWVudUl0ZW0gICAgIC5zZXRFbmFibGVkKHVuZG9NYW5hZ2VyLnVuZG9hYmxlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL2xpc3RlbmVycy9TV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNjhiZjIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9saXN0ZW5lcnMvU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5saXN0ZW5lcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNlcXVlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBXcmFwIGFub3RoZXIgY29ubmVjdGlvbiBsaXN0ZW5lciBhbmQgZm9yd2FyZCBldmVudHMgdG8gaXQgb24gdGhlIFNXVAotICogVUkgdGhyZWFkLCBhc3luY2hyb25vdXNseSBpZiBuZWNlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyCi0JaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIKLXsKLQotCXByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHVibGljIFNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIoQ29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQkJfQotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMub3BlbmVkXyhwcm9maWxlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZE9wZW5lZFJ1bm5hYmxlKHByb2ZpbGUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGlmaWVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMubW9kaWZpZWRfKHByb2ZpbGUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkTW9kaWZpZWRSdW5uYWJsZShwcm9maWxlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBva1RvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJcmV0dXJuIHRoaXMub2tUb0Nsb3NlXyhwcm9maWxlKTsKLQkJfQotCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRPa1RvQ2xvc2VSdW5uYWJsZShwcm9maWxlKSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFib3V0VG9DbG9zZShDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmFib3V0VG9DbG9zZV8ocHJvZmlsZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRBYm91dFRvQ2xvc2VSdW5uYWJsZShwcm9maWxlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jbG9zZWRfKHByb2ZpbGUpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkQ2xvc2VkUnVubmFibGUocHJvZmlsZSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZGF0YWJhc2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLmRhdGFiYXNlQ2hhbmdlZF8ocHJvZmlsZSwgZGF0YWJhc2UpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkRGF0YWJhc2VDaGFuZ2VkUnVubmFibGUocHJvZmlsZSwgZGF0YWJhc2UpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENhdGFsb2cgY2F0YWxvZykgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5jYXRhbG9nQ2hhbmdlZF8ocHJvZmlsZSwgY2F0YWxvZyk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRDYXRhbG9nQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIGNhdGFsb2cpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNjaGVtYUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2NoZW1hIHNjaGVtYSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5zY2hlbWFDaGFuZ2VkXyhwcm9maWxlLCBzY2hlbWEpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkU2NoZW1hQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIHNjaGVtYSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VxdWVuY2VDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCWlmICh0aGlzLmlzRXhlY3V0aW5nT25VSVRocmVhZCgpKSB7Ci0JCQl0aGlzLnNlcXVlbmNlQ2hhbmdlZF8ocHJvZmlsZSwgc2VxdWVuY2UpOwotCQl9IGVsc2UgewotCQkJdGhpcy5leGVjdXRlT25VSVRocmVhZCh0aGlzLmJ1aWxkU2VxdWVuY2VDaGFuZ2VkUnVubmFibGUocHJvZmlsZSwgc2VxdWVuY2UpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRhYmxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBUYWJsZSB0YWJsZSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy50YWJsZUNoYW5nZWRfKHByb2ZpbGUsIHRhYmxlKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZFRhYmxlQ2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIHRhYmxlKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb2x1bW5DaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIENvbHVtbiBjb2x1bW4pIHsKLQkJaWYgKHRoaXMuaXNFeGVjdXRpbmdPblVJVGhyZWFkKCkpIHsKLQkJCXRoaXMuY29sdW1uQ2hhbmdlZF8ocHJvZmlsZSwgY29sdW1uKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuZXhlY3V0ZU9uVUlUaHJlYWQodGhpcy5idWlsZENvbHVtbkNoYW5nZWRSdW5uYWJsZShwcm9maWxlLCBjb2x1bW4pKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQlpZiAodGhpcy5pc0V4ZWN1dGluZ09uVUlUaHJlYWQoKSkgewotCQkJdGhpcy5mb3JlaWduS2V5Q2hhbmdlZF8ocHJvZmlsZSwgZm9yZWlnbktleSk7Ci0JCX0gZWxzZSB7Ci0JCQl0aGlzLmV4ZWN1dGVPblVJVGhyZWFkKHRoaXMuYnVpbGRGb3JlaWduS2V5Q2hhbmdlZFJ1bm5hYmxlKHByb2ZpbGUsIGZvcmVpZ25LZXkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRPcGVuZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLm9wZW5lZF8ocHJvZmlsZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJvcGVuZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZE1vZGlmaWVkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5tb2RpZmllZF8ocHJvZmlsZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJtb2RpZmllZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkT2tUb0Nsb3NlUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5va1RvQ2xvc2VfKHByb2ZpbGUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiT0sgdG8gY2xvc2UgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEFib3V0VG9DbG9zZVJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuYWJvdXRUb0Nsb3NlXyhwcm9maWxlKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImFib3V0IHRvIGNsb3NlIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDbG9zZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLmNsb3NlZF8ocHJvZmlsZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjbG9zZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZERhdGFiYXNlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIGZpbmFsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLmRhdGFiYXNlQ2hhbmdlZF8ocHJvZmlsZSwgZGF0YWJhc2UpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiZGF0YWJhc2UgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkQ2F0YWxvZ0NoYW5nZWRSdW5uYWJsZShmaW5hbCBDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBmaW5hbCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMuY2F0YWxvZ0NoYW5nZWRfKHByb2ZpbGUsIGNhdGFsb2cpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY2F0YWxvZyBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRTY2hlbWFDaGFuZ2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5zY2hlbWFDaGFuZ2VkXyhwcm9maWxlLCBzY2hlbWEpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2NoZW1hIGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZFNlcXVlbmNlQ2hhbmdlZFJ1bm5hYmxlKGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIGZpbmFsIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLnNlcXVlbmNlQ2hhbmdlZF8ocHJvZmlsZSwgc2VxdWVuY2UpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAic2VxdWVuY2UgY2hhbmdlZCBydW5uYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFJ1bm5hYmxlIGJ1aWxkVGFibGVDaGFuZ2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgZmluYWwgVGFibGUgdGFibGUpIHsKLQkJcmV0dXJuIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTV1RDb25uZWN0aW9uTGlzdGVuZXJXcmFwcGVyLnRoaXMudGFibGVDaGFuZ2VkXyhwcm9maWxlLCB0YWJsZSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJ0YWJsZSBjaGFuZ2VkIHJ1bm5hYmxlIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUnVubmFibGUgYnVpbGRDb2x1bW5DaGFuZ2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgZmluYWwgQ29sdW1uIGNvbHVtbikgewotCQlyZXR1cm4gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVNXVENvbm5lY3Rpb25MaXN0ZW5lcldyYXBwZXIudGhpcy5jb2x1bW5DaGFuZ2VkXyhwcm9maWxlLCBjb2x1bW4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29sdW1uIGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBSdW5uYWJsZSBidWlsZEZvcmVpZ25LZXlDaGFuZ2VkUnVubmFibGUoZmluYWwgQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgZmluYWwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCXJldHVybiBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJU1dUQ29ubmVjdGlvbkxpc3RlbmVyV3JhcHBlci50aGlzLmZvcmVpZ25LZXlDaGFuZ2VkXyhwcm9maWxlLCBmb3JlaWduS2V5KTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gImZvcmVpZ24ga2V5IGNoYW5nZWQgcnVubmFibGUiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhlY3V0aW5nT25VSVRocmVhZCgpIHsKLQkJcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICoge0BsaW5rIERpc3BsYXkjYXN5bmNFeGVjKFJ1bm5hYmxlKX0gc2VlbXMgdG8gd29yayBPSzsKLQkgKiBidXQgdXNpbmcge0BsaW5rIERpc3BsYXkjc3luY0V4ZWMoUnVubmFibGUpfSBjYW4gc29tdGltZXMgbWFrZSB0aGluZ3MKLQkgKiBtb3JlIHByZWRpY3RhYmxlIHdoZW4gZGVidWdnaW5nLCBhdCB0aGUgcmlzayBvZiBkZWFkbG9ja3MuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGVPblVJVGhyZWFkKFJ1bm5hYmxlIHIpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHIpOwotLy8JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLnN5bmNFeGVjKHIpOwotCX0KLQotCXZvaWQgb3BlbmVkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXRoaXMubGlzdGVuZXIub3BlbmVkKHByb2ZpbGUpOwotCX0KLQotCXZvaWQgbW9kaWZpZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJdGhpcy5saXN0ZW5lci5tb2RpZmllZChwcm9maWxlKTsKLQl9Ci0KLQlib29sZWFuIG9rVG9DbG9zZV8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gdGhpcy5saXN0ZW5lci5va1RvQ2xvc2UocHJvZmlsZSk7Ci0JfQotCi0Jdm9pZCBhYm91dFRvQ2xvc2VfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJdGhpcy5saXN0ZW5lci5hYm91dFRvQ2xvc2UocHJvZmlsZSk7Ci0JfQotCi0Jdm9pZCBjbG9zZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJdGhpcy5saXN0ZW5lci5jbG9zZWQocHJvZmlsZSk7Ci0JfQotCi0Jdm9pZCBkYXRhYmFzZUNoYW5nZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXRoaXMubGlzdGVuZXIuZGF0YWJhc2VDaGFuZ2VkKHByb2ZpbGUsIGRhdGFiYXNlKTsKLQl9Ci0KLQl2b2lkIGNhdGFsb2dDaGFuZ2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBDYXRhbG9nIGNhdGFsb2cpIHsKLQkJdGhpcy5saXN0ZW5lci5jYXRhbG9nQ2hhbmdlZChwcm9maWxlLCBjYXRhbG9nKTsKLQl9Ci0KLQl2b2lkIHNjaGVtYUNoYW5nZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJdGhpcy5saXN0ZW5lci5zY2hlbWFDaGFuZ2VkKHByb2ZpbGUsIHNjaGVtYSk7Ci0JfQotCi0Jdm9pZCBzZXF1ZW5jZUNoYW5nZWRfKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNlcXVlbmNlIHNlcXVlbmNlKSB7Ci0JCXRoaXMubGlzdGVuZXIuc2VxdWVuY2VDaGFuZ2VkKHByb2ZpbGUsIHNlcXVlbmNlKTsKLQl9Ci0KLQl2b2lkIHRhYmxlQ2hhbmdlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgVGFibGUgdGFibGUpIHsKLQkJdGhpcy5saXN0ZW5lci50YWJsZUNoYW5nZWQocHJvZmlsZSwgdGFibGUpOwotCX0KLQotCXZvaWQgY29sdW1uQ2hhbmdlZF8oQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbikgewotCQl0aGlzLmxpc3RlbmVyLmNvbHVtbkNoYW5nZWQocHJvZmlsZSwgY29sdW1uKTsKLQl9Ci0KLQl2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkXyhDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlLCBGb3JlaWduS2V5IGZvcmVpZ25LZXkpIHsKLQkJdGhpcy5saXN0ZW5lci5mb3JlaWduS2V5Q2hhbmdlZChwcm9maWxlLCBmb3JlaWduS2V5KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIlNXVCgiICsgdGhpcy5saXN0ZW5lci50b1N0cmluZygpICsgJyknOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL21lbnVzL01hcEFzQ29udHJpYnV0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL21lbnVzL01hcEFzQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NGU3YWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9tZW51cy9NYXBBc0NvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLm1lbnVzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkltYWdlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5BcnJheVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5Db21wb3NpdGVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkZpbHRlcmluZ0l0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuVHJhbnNmb3JtYXRpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkRlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5NYXBwaW5nVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQ29tcG91bmRDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzLklIYW5kbGVyU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5Db21tYW5kQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5Db21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tZW51cy5JV29ya2JlbmNoQ29udHJpYnV0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnNlcnZpY2VzLklTZXJ2aWNlTG9jYXRvcjsKLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotCi0vKioKLSAqIFRoaXMgbWVudSBjb250cmlidXRpb24gaXMgcmVzcG9uc2libGUgdG8gcG9wdWxhdGUgdGhlIE1hcCBBcyBtZW51IHdpdGggdGhlCi0gKiByZWdpc3RlcmVkIG1hcHBpbmcgdHlwZXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0UGxhdGZvcm1VaTwvY29kZT4uCi0gKgotICogQHNlZSBKcGFQbGF0Zm9ybQotICogQHNlZSBKcGFQbGF0Zm9ybVVpCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIE1hcEFzQ29udHJpYnV0aW9uPFQgZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPgotCWV4dGVuZHMgQ29tcG91bmRDb250cmlidXRpb25JdGVtCi0JaW1wbGVtZW50cyBJV29ya2JlbmNoQ29udHJpYnV0aW9uCi17Ci0JLyoqCi0JICogS2VlcHMgdHJhY2sgb2YgdGhlIDxjb2RlPklTZXJ2aWNlTG9jYXRvcjwvY29kZT4gd2hpY2ggaXMgdXNlZCB0byByZXRyaWV2ZQotCSAqIHZhcmlvdXMgc2VydmljZXMgcmVxdWlyZWQgZm9yIGludm9raW5nIHRoZSA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIElTZXJ2aWNlTG9jYXRvciBzZXJ2aWNlTG9jYXRvcjsKLQkKLQkKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIE1hcEFzQ29udHJpYnV0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKElTZXJ2aWNlTG9jYXRvciBzZXJ2aWNlTG9jYXRvcikgewotCQl0aGlzLnNlcnZpY2VMb2NhdG9yID0gc2VydmljZUxvY2F0b3I7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRDb250cmlidXRpb25JdGVtcygpIHsKLQkJLy8gUmV0cmlldmUgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZSBoYW5kbGVyIHNlcnZpY2UKLQkJLy8gd2hpY2ggc2hvdWxkIGJlIGFuIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIG9mIEpwYVN0cnVjdHVyZU5vZGVzCi0JCUlIYW5kbGVyU2VydmljZSBoYW5kbGVyU2VydmljZSA9IAotCQkJKElIYW5kbGVyU2VydmljZSkgdGhpcy5zZXJ2aWNlTG9jYXRvci5nZXRTZXJ2aWNlKElIYW5kbGVyU2VydmljZS5jbGFzcyk7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb24gPSAKLQkJCShJU3RydWN0dXJlZFNlbGVjdGlvbikgaGFuZGxlclNlcnZpY2UuZ2V0Q3VycmVudFN0YXRlKCkuZ2V0VmFyaWFibGUoSVNvdXJjZXMuQUNUSVZFX0NVUlJFTlRfU0VMRUNUSU9OX05BTUUpOwotCQkKLQkJLy8gQXNzdW1lIHRoYXQgYWxsIG5vZGVzIGFyZSBpbiB0aGUgc2FtZSBwcm9qZWN0ICh3aGljaCBpcyB2ZXJ5IHNhZmUpCi0JCS8vIGFuZCByZXRyaWV2ZSB0aGUgbWFwcGluZyBVSSBwcm92aWRlcnMganVzdCBmcm9tIHRoZSBmaXJzdCBpdGVtCi0JCVQgbm9kZSA9IChUKSBjdXJyZW50U2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJcmV0dXJuIAotCQkJQXJyYXlUb29scy5hcnJheSgKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+LCBJQ29udHJpYnV0aW9uSXRlbT4obWFwcGluZ1VpRGVmaW5pdGlvbnMobm9kZSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbSB0cmFuc2Zvcm0oTWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/PiBuZXh0KSB7Ci0JCQkJCQlyZXR1cm4gY3JlYXRlQ29udHJpYnV0aW9uSXRlbShuZXh0KTsKLQkJCQkJfQotCQkJCX0sCi0JCQkJbmV3IElDb250cmlidXRpb25JdGVtWzBdKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+PiBnZXREZWZpbml0aW9uc0NvbXBhcmF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQ29tcGFyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+PigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IGl0ZW0xLCBNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IGl0ZW0yKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gaXRlbTEuZ2V0TGFiZWwoKTsKLQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZzIgPSBpdGVtMi5nZXRMYWJlbCgpOwotCQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZGlzcGxheVN0cmluZzEsIGRpc3BsYXlTdHJpbmcyKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaURlZmluaXRpb259cyBmcm9tIHRoZSBnaXZlbiBub2RlLCAKLQkgKiB1c2luZyBpdHMge0BsaW5rIEpwYVBsYXRmb3JtVWl9LgotCSAqCi0JICogQHBhcmFtIG5vZGUgQSB0ZXN0IG5vZGUgdG8gZGV0ZXJtaW5lIHRoZSB7QGxpbmsgSnBhUGxhdGZvcm1VaX0gYW5kIHR5cGUgCi0JICogb2YgcHJvdmlkZXJzIHRvIHJldHVybgotCSAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCB7QGxpbmsgTWFwcGluZ1VpRGVmaW5pdGlvbn1zCi0JICovCi0JcHJvdGVjdGVkIDxVIGV4dGVuZHMgVD4gSXRlcmF0b3I8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4+IG1hcHBpbmdVaURlZmluaXRpb25zKGZpbmFsIFQgbm9kZSkgewotCQlKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSA9IG5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7Ci0JCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSA9IEpwdEpwYVVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShqcGFQbGF0Zm9ybSk7Ci0JCQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgTWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/Pj4gc29ydGVkTWFwcGluZ1VpRGVmaW5pdGlvbnMgPSAKLQkJCQlDb2xsZWN0aW9uVG9vbHMuc29ydCgKLQkJCQkJbmV3IEZpbHRlcmluZ0l0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248VCwgPz4+KAotCQkJCQkJCW1hcHBpbmdVaURlZmluaXRpb25zKGpwYVBsYXRmb3JtVWksIG5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkpKSB7Ci0JCQkJCQkgQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoTWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/PiBvKSB7Ci0JCQkJCQkJcmV0dXJuIG8uaXNFbmFibGVkRm9yKG5vZGUpOwotCQkJCQkJfQotCQkJCQl9LAotCQkJCQlnZXREZWZpbml0aW9uc0NvbXBhcmF0b3IoKSk7Ci0JCQotCQlEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/PiBkZWZhdWx0RGVmaW5pdGlvbiA9IGdldERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uKGpwYVBsYXRmb3JtVWksIG5vZGUpOwotCQlpZiAoZGVmYXVsdERlZmluaXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVJdGVyYXRvcjxNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+PihkZWZhdWx0RGVmaW5pdGlvbiwgc29ydGVkTWFwcGluZ1VpRGVmaW5pdGlvbnMpOwotCQl9Ci0JCXJldHVybiBzb3J0ZWRNYXBwaW5nVWlEZWZpbml0aW9uczsKLQl9Ci0KLQkvKioKLQkqIFJldHJpZXZlcyB0aGUgcmVnaXN0ZXJlZCB7QGxpbmsgTWFwcGluZ1VpRGVmaW5pdGlvbn1zIGZyb20gdGhlIGdpdmVuIAotCSoge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGFuZCB7QGxpbmsgSnBhU3RydWN0dXJlTm9kZX0gKHRvIGRldGVybWluZSB0eXBlIG9mIAotCSogbWFwcGluZyBwcm92aWRlcnMgdG8gcmV0cmlldmUpLgotCSoKLQkqIEBwYXJhbSBqcGFQbGF0Zm9ybVVpIFRoZSBhY3RpdmUge0BsaW5rIEpwYVBsYXRmb3JtVWl9IGZyb20gd2hlcmUgdGhlCi0JKiBwcm92aWRlciBjYW4gYmUgcmV0cmlldmVkCi0JKiBAcGFyYW0gbm9kZSBBIHRlc3Qgbm9kZSB0byBkZXRlcm1pbmUgdHlwZSBvZiBwcm92aWRlcnMgdG8gcmV0dXJuCi0JKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHJlZ2lzdGVyZWQge0BsaW5rIE1hcHBpbmdVaURlZmluaXRpb259cwotCSovCi0JcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+PiAKLQkJbWFwcGluZ1VpRGVmaW5pdGlvbnMoSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpLCBKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKTsKLQkKLQkvKioKLQkqIENyZWF0ZXMgdGhlIGRlZmF1bHQgcHJvdmlkZXIgcmVzcG9uc2libGUgZm9yIGNsZWFyaW5nIHRoZSBtYXBwaW5nIHR5cGUuCi0JKiBJZiBub3QgZGVmYXVsdCBwcm92aWRlciwgdGhlbiByZXR1cm4gbnVsbAotCSoKLQkqIEByZXR1cm4gQSBwcm92aWRlciB0aGF0IGFjdHMgYXMgYSBkZWZhdWx0IG1hcHBpbmcgcHJvdmlkZXIKLQkqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/PiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbihKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWksIFQgbm9kZSk7Ci0JCQkKLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW0gY3JlYXRlQ29udHJpYnV0aW9uSXRlbShNYXBwaW5nVWlEZWZpbml0aW9uPFQsID8+IG1hcHBpbmdVaVByb3ZpZGVyKSB7Ci0JCXJldHVybiBuZXcgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW0oY3JlYXRlUGFyYW1ldGVyKG1hcHBpbmdVaVByb3ZpZGVyKSk7Ci0JfQotCQotCXByb3RlY3RlZCBDb21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlciBjcmVhdGVQYXJhbWV0ZXIoTWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/PiBtYXBwaW5nVWlEZWZpbml0aW9uKSB7Ci0JCUNvbW1hbmRDb250cmlidXRpb25JdGVtUGFyYW1ldGVyIHBhcmFtZXRlciA9Ci0JCQluZXcgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIoCi0JCQkJCXRoaXMuc2VydmljZUxvY2F0b3IsIAotCQkJCQljcmVhdGVDb21tYW5kQ29udHJpYnV0aW9uSXRlbUlkKG1hcHBpbmdVaURlZmluaXRpb24pLAotCQkJCQlnZXRDb21tYW5kSWQoKSwKLQkJCQkJQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW0uU1RZTEVfQ0hFQ0spOwotCQlwYXJhbWV0ZXIubGFiZWwgPSBtYXBwaW5nVWlEZWZpbml0aW9uLmdldExhYmVsKCk7Ci0JCU1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotCQlwYXJhbWV0ZXJzLnB1dChnZXRDb21tYW5kUGFyYW1ldGVySWQoKSwgbWFwcGluZ1VpRGVmaW5pdGlvbi5nZXRLZXkoKSk7Ci0JCXBhcmFtZXRlci5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKLQkJcGFyYW1ldGVyLmljb24gPSBuZXcgSW1hZ2VJbWFnZURlc2NyaXB0b3IobWFwcGluZ1VpRGVmaW5pdGlvbi5nZXRJbWFnZSgpKTsKLQkJcGFyYW1ldGVyLnZpc2libGVFbmFibGVkID0gdHJ1ZTsKLQkJcmV0dXJuIHBhcmFtZXRlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgY29tbWFuZCB0aGF0IHdpbGwgYmUgaW52b2tlZCBmb3IKLQkgKiBjaGFuZ2luZyB0aGUgbWFwcGluZyB0eXBlIG9mIHRoZSBzZWxlY3RlZCBub2Rlcy4KLQkgKgotCSAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSAibWFwIGFzIiBjb21tYW5kCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21tYW5kSWQoKTsKLQkKLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBtYXBwaW5nIGtleSBjb21tYW5kIHBhcmFtZXRlciB0aGF0IAotCSAqIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5ldyBtYXBwaW5nIHR5cGUgb2YgdGhlIHNlbGVjdGVkIG5vZGVzLgotCSAqCi0JICogQHJldHVybiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlICJtYXAgYXMiIGNvbW1hbmQgcGFyYW1ldGVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRDb21tYW5kUGFyYW1ldGVySWQoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFuIGlkIGZvciBhIHtAbGluayBDb21tYW5kQ29udHJpYnV0aW9uSXRlbX0gaW4gdGhlIGZvcm0gb2YgCi0JICogIjxjb21tYW5kSWQ+LjxtYXBwaW5nS2V5PiIgIAotCSAqIChmb3IgZXhhbXBsZSAib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnVpLnBlcnNpc3RlbnRUeXBlTWFwQXMuZW50aXR5IikKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNyZWF0ZUNvbW1hbmRDb250cmlidXRpb25JdGVtSWQoTWFwcGluZ1VpRGVmaW5pdGlvbjxULCA/PiBtYXBwaW5nVWlEZWZpbml0aW9uKSB7Ci0JCXJldHVybiBnZXRDb21tYW5kSWQoKSArICIuIiArIG1hcHBpbmdVaURlZmluaXRpb24uZ2V0S2V5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9tZW51cy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzQ29udHJpYnV0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTFjNjMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9tZW51cy9QZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLm1lbnVzOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzLlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubWVudXMuQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXI7Ci0KLS8qKgotICogVGhpcyBtZW51IGNvbnRyaWJ1dGlvbiBpcyByZXNwb25zaWJsZSB0byBwb3B1bGF0ZSB0aGUgTWFwIEFzIG1lbnUgd2l0aCB0aGUKLSAqIHJlZ2lzdGVyZWQgYXR0cmlidXRlIG1hcHBpbmcgdHlwZXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0UGxhdGZvcm1VaTwvY29kZT4KLSAqIGZvciA8Y29kZT5QZXJzaXN0ZW50QXR0cmlidXRlPC9jb2RlPiBvYmplY3RzLgotICoKLSAqIEBzZWUgUGVyc2lzdGVudEF0dHJpYnV0ZU1hcEFzSGFuZGxlcgotICogQHNlZSBQZXJzaXN0ZW50QXR0cmlidXRlCi0gKgotICogQHZlcnNpb24gMi4yCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNDb250cmlidXRpb24KLQlleHRlbmRzIE1hcEFzQ29udHJpYnV0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0NvbnRyaWJ1dGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbW1hbmRJZCgpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuQ09NTUFORF9JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tYW5kUGFyYW1ldGVySWQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW50QXR0cmlidXRlTWFwQXNIYW5kbGVyLlNQRUNJRklFRF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lEOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tbWFuZENvbnRyaWJ1dGlvbkl0ZW1QYXJhbWV0ZXIgY3JlYXRlUGFyYW1ldGVyKE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/PiBtYXBwaW5nVWlQcm92aWRlcikgewotCQlDb21tYW5kQ29udHJpYnV0aW9uSXRlbVBhcmFtZXRlciBwYXJhbWV0ZXIgPSBzdXBlci5jcmVhdGVQYXJhbWV0ZXIobWFwcGluZ1VpUHJvdmlkZXIpOwotCQlTdHJpbmcgZGVmYXVsdEtleSA9IG51bGw7Ci0JCWlmIChtYXBwaW5nVWlQcm92aWRlciBpbnN0YW5jZW9mIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPD8sID8+KSB7Ci0JCQlkZWZhdWx0S2V5ID0gKChEZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVudEF0dHJpYnV0ZSwgPz4pIG1hcHBpbmdVaVByb3ZpZGVyKS5nZXREZWZhdWx0S2V5KCk7Ci0JCX0KLQkJcGFyYW1ldGVyLnBhcmFtZXRlcnMucHV0KFBlcnNpc3RlbnRBdHRyaWJ1dGVNYXBBc0hhbmRsZXIuREVGQVVMVF9NQVBQSU5HX0NPTU1BTkRfUEFSQU1FVEVSX0lELCBkZWZhdWx0S2V5KTsKLQkJcmV0dXJuIHBhcmFtZXRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgPz4+IG1hcHBpbmdVaURlZmluaXRpb25zKAotCQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpLCBKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCQotCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5hdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9ucyhyZXNvdXJjZVR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/PiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbigKLQkJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG5vZGUpIHsKLQkJCi0JCXJldHVybiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbigKLQkJCQlqcGFQbGF0Zm9ybVVpLCAKLQkJCQkoKFBlcnNpc3RlbnRBdHRyaWJ1dGUpIG5vZGUpLmdldERlZmF1bHRNYXBwaW5nS2V5KCksIAotCQkJCW5vZGUuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/PiBnZXREZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbigKLQkJCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSwgU3RyaW5nIGRlZmF1bHRNYXBwaW5nS2V5LCBKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCQotCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5nZXREZWZhdWx0QXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUsIGRlZmF1bHRNYXBwaW5nS2V5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL21lbnVzL1BlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzg3OGViLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbWVudXMvUGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwubWVudXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5EZWZhdWx0TWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLmNvbW1hbmRzLlBlcnNpc3RlbnRUeXBlTWFwQXNIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgbWVudSBjb250cmlidXRpb24gaXMgcmVzcG9uc2libGUgdG8gcG9wdWxhdGUgdGhlIE1hcCBBcyBtZW51IHdpdGggdGhlCi0gKiByZWdpc3RlcmVkIG1hcHBpbmcgdHlwZXMgZGVmaW5lZCBpbiB0aGUgPGNvZGU+SnB0UGxhdGZvcm1VaTwvY29kZT4gZm9yCi0gKiA8Y29kZT5QZXJzaXN0ZW50VHlwZTwvY29kZT4gb2JqZWN0cy4KLSAqCi0gKiBAc2VlIEpwYVBsYXRmb3JtCi0gKiBAc2VlIEpwYVBsYXRmb3JtVWkKLSAqIEBzZWUgUGVyc2lzdGVudFR5cGUKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24KLQlleHRlbmRzIE1hcEFzQ29udHJpYnV0aW9uPFBlcnNpc3RlbnRUeXBlPgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVudFR5cGVNYXBBc0NvbnRyaWJ1dGlvbjwvY29kZT4uCi0JICovCi0JcHVibGljIFBlcnNpc3RlbnRUeXBlTWFwQXNDb250cmlidXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbWFuZElkKCkgewotCQlyZXR1cm4gUGVyc2lzdGVudFR5cGVNYXBBc0hhbmRsZXIuQ09NTUFORF9JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tYW5kUGFyYW1ldGVySWQoKSB7Ci0JCXJldHVybiBQZXJzaXN0ZW50VHlwZU1hcEFzSGFuZGxlci5DT01NQU5EX1BBUkFNRVRFUl9JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEl0ZXJhdG9yPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/Pj4gbWFwcGluZ1VpRGVmaW5pdGlvbnMoCi0JCQlKcGFQbGF0Zm9ybVVpIGpwYVBsYXRmb3JtVWksIEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCi0JCXJldHVybiBqcGFQbGF0Zm9ybVVpLnR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyhyZXNvdXJjZVR5cGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8+IGdldERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uKAotCQkJSnBhUGxhdGZvcm1VaSBqcGFQbGF0Zm9ybVVpLCBQZXJzaXN0ZW50VHlwZSBub2RlKSB7Ci0JCQotCQlyZXR1cm4ganBhUGxhdGZvcm1VaS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24obm9kZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGRkZjUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuYWN0aW9ucy5PcGVuSnBhUmVzb3VyY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5Db21tb25BY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25NZW51Q29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIKLQkJZXh0ZW5kcyBDb21tb25BY3Rpb25Qcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBPcGVuSnBhUmVzb3VyY2VBY3Rpb24gb3BlbkFjdGlvbjsKLQkKLQkKLQlwdWJsaWMgSnBhTmF2aWdhdG9yQWN0aW9uUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSUNvbW1vbkFjdGlvbkV4dGVuc2lvblNpdGUgYUNvbmZpZykgewotCQlvcGVuQWN0aW9uID0gbmV3IE9wZW5KcGFSZXNvdXJjZUFjdGlvbigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KEFjdGlvbkNvbnRleHQgYUNvbnRleHQpIHsKLQkJaWYgKGFDb250ZXh0ICE9IG51bGwgJiYgYUNvbnRleHQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBhQ29udGV4dC5nZXRTZWxlY3Rpb24oKTsKLQkJCW9wZW5BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChzZWxlY3Rpb24pOwotCQl9Ci0JCQotCQlzdXBlci5zZXRDb250ZXh0KGFDb250ZXh0KTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlsbEFjdGlvbkJhcnMoSUFjdGlvbkJhcnMgdGhlQWN0aW9uQmFycykgewotCQlpZiAob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJdGhlQWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElDb21tb25BY3Rpb25Db25zdGFudHMuT1BFTiwgb3BlbkFjdGlvbik7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBhTWVudSkgewotCQlpZiAoZ2V0Q29udGV4dCgpID09IG51bGwgfHwgZ2V0Q29udGV4dCgpLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCQotCQlpZiAob3BlbkFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJYU1lbnUuaW5zZXJ0QWZ0ZXIoSUNvbW1vbk1lbnVDb25zdGFudHMuR1JPVVBfT1BFTiwgb3BlbkFjdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3NTk2Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDggIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBleHRlbmRzIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKG5ldyBKcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSwgbmV3IEpwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JDb250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmUwYWU3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5uYXZpZ2F0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5JQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuRmFjZXRlZFByb2plY3RGcmFtZXdvcms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmV2ZW50cy5JRmFjZXRlZFByb2plY3RMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSVByb2plY3RGYWNldEFjdGlvbkV2ZW50OwotCi0vKioKLSAqIFRoaXMgZXh0ZW5zaW9uIG9mIG5hdmlnYXRvciBjb250ZW50IHByb3ZpZGVyIGRlbGVnYXRlcyB0byB0aGUgcGxhdGZvcm0gVUkKLSAqIChzZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUGxhdGZvcm0gZXh0ZW5zaW9uIHBvaW50KSBmb3IgbmF2aWdhdG9yIGNvbnRlbnQuCi0gKiAKLSAqIElmIHRoZXJlIGlzIGEgcGxhdGZvcm0gVUkgZm9yIHRoZSBnaXZlbiBwcm9qZWN0LCB0aGlzIGNvbnRlbnQgcHJvdmlkZXIgd2lsbAotICogcHJvdmlkZSBhIHJvb3QgIkpQQSBDb250ZW50IiBub2RlIChjaGlsZCBvZiB0aGUgcHJvamVjdCksIG90aGVyd2lzZSB0aGVyZQotICogd2lsbCBiZSBubyBjb250ZW50LiAgRm9yIGNoaWxkcmVuIG9mIHRoZSAiSlBBIENvbnRlbnQiIG5vZGUgKG9yIGZvciBhbnkgb3RoZXIKLSAqIHN1Yi1ub2RlKSwgdGhpcyBwcm92aWRlciB3aWxsIGRlbGVnYXRlIHRvIHRoZSBjb250ZW50IHByb3ZpZGVyIHJldHVybmVkIGJ5IHRoZSAKLSAqIHBsYXRmb3JtIFVJIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyCi0JCWltcGxlbWVudHMgSUNvbW1vbkNvbnRlbnRQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBkZWxlZ2F0ZTsKLQkKLQlwcml2YXRlIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGZhY2V0TGlzdGVuZXI7Ci0JCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcjsKLQkKLQkKLQlwdWJsaWMgSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCQlmYWNldExpc3RlbmVyID0gbmV3IEZhY2V0TGlzdGVuZXIoKTsKLQkJRmFjZXRlZFByb2plY3RGcmFtZXdvcmsuYWRkTGlzdGVuZXIoCi0JCQkJZmFjZXRMaXN0ZW5lciwgCi0JCQkJSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QT1NUX0lOU1RBTEwsCi0JCQkJSUZhY2V0ZWRQcm9qZWN0RXZlbnQuVHlwZS5QT1NUX1VOSU5TVEFMTCwKLQkJCQlJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhTmF2aWdhdG9yQ29udGVudEFuZExhYmVsUHJvdmlkZXIgZGVsZWdhdGUoKSB7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJQ29udGVudFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUZhY2V0ZWRQcm9qZWN0RnJhbWV3b3JrLnJlbW92ZUxpc3RlbmVyKGZhY2V0TGlzdGVuZXIpOwotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuZGlzcG9zZSgpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuaW5wdXRDaGFuZ2VkKHZpZXdlciwgb2xkSW5wdXQsIG5ld0lucHV0KTsKLQkJfQotCQl0aGlzLnZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSB2aWV3ZXI7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuZ2V0UGFyZW50KGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSVByb2plY3QuY2xhc3MpOwotCQkJCi0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQkJCWlmIChqcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJSnBhUGxhdGZvcm1VaSBwbGF0Zm9ybVVpID0gSnB0SnBhVWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFQbGF0Zm9ybVVpKGpwYVByb2plY3QuZ2V0SnBhUGxhdGZvcm0oKSk7Ci0JCQkJCQotCQkJCQlyZXR1cm4gcGxhdGZvcm1VaSAhPSBudWxsOwotCQkJCX0JCi0JCQl9Ci0JCX0KLQkJCi0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZGVsZWdhdGUuaGFzQ2hpbGRyZW4oZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdCkgKChJQWRhcHRhYmxlKSBwYXJlbnRFbGVtZW50KS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJCQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCUpwYVBsYXRmb3JtVWkgcGxhdGZvcm1VaSA9IEpwdEpwYVVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShqcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkpOwotCQkJCQkKLQkJCQkJaWYgKHBsYXRmb3JtVWkgIT0gbnVsbCkgewotCQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7anBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKX07Ci0JCQkJCX0KLQkJCQl9CQotCQkJfQotCQl9Ci0JCQotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmdldENoaWxkcmVuKHBhcmVudEVsZW1lbnQpOwotCQl9Ci0JCQkKLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSU1lbWVudG9Bd2FyZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBzYXZlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBubyBvcAotCX0KLQkKLQlwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoSU1lbWVudG8gbWVtZW50bykgewotCQkvLyBubyBvcAotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElDb21tb25Db250ZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIHZvaWQgaW5pdChJQ29tbW9uQ29udGVudEV4dGVuc2lvblNpdGUgY29uZmlnKSB7Ci0JCWlmIChkZWxlZ2F0ZSA9PSBudWxsKSB7Ci0JCQlKcGFOYXZpZ2F0b3JMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSAoSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlcikgY29uZmlnLmdldEV4dGVuc2lvbigpLmdldExhYmVsUHJvdmlkZXIoKTsKLQkJCWlmIChsYWJlbFByb3ZpZGVyICE9IG51bGwgJiYgbGFiZWxQcm92aWRlci5kZWxlZ2F0ZSgpICE9IG51bGwpIHsKLQkJCQlkZWxlZ2F0ZSA9IGxhYmVsUHJvdmlkZXIuZGVsZWdhdGUoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWRlbGVnYXRlID0gbmV3IEpwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBtZW1iZXIgY2xhc3NlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXByaXZhdGUgY2xhc3MgRmFjZXRMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElGYWNldGVkUHJvamVjdExpc3RlbmVyCi0JewotCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChJRmFjZXRlZFByb2plY3RFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBST0pFQ1RfTU9ESUZJRUQpIHsKLQkJCQlyZWZyZXNoVmlld2VyKGV2ZW50LmdldFByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAoZXZlbnQuZ2V0VHlwZSgpID09IElGYWNldGVkUHJvamVjdEV2ZW50LlR5cGUuUE9TVF9JTlNUQUxMCi0JCQkJCXx8IGV2ZW50LmdldFR5cGUoKSA9PSBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBPU1RfVU5JTlNUQUxMKSB7Ci0JCQkJSVByb2plY3RGYWNldEFjdGlvbkV2ZW50IGlwYUV2ZW50ID0gKElQcm9qZWN0RmFjZXRBY3Rpb25FdmVudCkgZXZlbnQ7Ci0JCQkJaWYgKGlwYUV2ZW50LmdldFByb2plY3RGYWNldCgpLmVxdWFscyhKcGFGYWNldC5GQUNFVCkpIHsKLQkJCQkJcmVmcmVzaFZpZXdlcihpcGFFdmVudC5nZXRQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCByZWZyZXNoVmlld2VyKGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAKLQkJCQkJJiYgdmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsIAotCQkJCQkmJiAhdmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkvLyBVc2luZyBqb2IgaGVyZSBzbyB0aGF0IHByb2plY3QgbW9kZWwgdXBkYXRlICh3aGljaCBhbHNvIHVzZXMKLQkJCQkvLyAgYSBqb2IpIHdpbGwgY29tcGxldGUgZmlyc3QKLQkJCQlKb2IgcmVmcmVzaEpvYiA9IG5ldyBKb2IoIlJlZnJlc2ggdmlld2VyIikgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJLy8gVXNpbmcgcnVubmFibGUgaGVyZSBzbyB0aGF0IHJlZnJlc2ggd2lsbCBnbyBvbiBjb3JyZWN0IHRocmVhZAotCQkJCQkJdmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCXZpZXdlci5yZWZyZXNoKHByb2plY3QpOwotCQkJCQkJCX0KLQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXJlZnJlc2hKb2Iuc2V0UnVsZShwcm9qZWN0KTsKLQkJCQlyZWZyZXNoSm9iLnNjaGVkdWxlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2EwNmQzLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkubmF2aWdhdG9yLkpwYU5hdmlnYXRvclByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgSnBhTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQkvKioKLQkgKiBFeGFjdGx5ICpvbmUqIG9mIHRoZXNlIGZhY3RvcmllcyBpcyBjcmVhdGVkIGZvciBlYWNoIHZpZXcgdGhhdCB1dGlsaXplcyBpdC4gIAotCSAqIFRoZXJlZm9yZSwgYXMgd2UgZGVsZWdhdGUgdG8gdGhlIHBsYXRmb3JtIFVJIGZvciBlYWNoIHByb2plY3QsIHdlIHNob3VsZCAKLQkgKiBtYWludGFpbiB0aGUgc2FtZSBtdWx0aXBsaWNpdHkuICBUaGF0IGlzLCBpZiB0aGVyZSBpcyBhIGRlbGVnYXRlIGZvciBlYWNoIAotCSAqIHBsYXRmb3JtIFVJLCB3ZSBzaG91bGQgbWFpbnRhaW4gKm9uZSogZGVsZWdhdGUgZm9yIGVhY2ggdmlldy4KLQkgKiAKLQkgKiBLZXk6IHBsYXRmb3JtIGlkLCAgVmFsdWU6IGRlbGVnYXRlIGNvbnRlbnQgcHJvdmlkZXIgZmFjdG9yeQotCSAqLwotCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5PiBkZWxlZ2F0ZXM7Ci0JCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZWxlZ2F0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeT4oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyIGJ1aWxkSXRlbUxhYmVsUHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZShpdGVtKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0RGVsZWdhdGUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKCEgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQWRhcHRhYmxlKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpwYUNvbnRleHROb2RlIGNvbnRleHROb2RlID0gKEpwYUNvbnRleHROb2RlKSAoKElBZGFwdGFibGUpIGVsZW1lbnQpLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkKLQkJaWYgKGNvbnRleHROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlKcGFQbGF0Zm9ybSBwbGF0Zm9ybSA9IGNvbnRleHROb2RlLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpOwotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHBsYXRmb3JtLmdldElkKCk7Ci0JCWlmIChkZWxlZ2F0ZXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZXMuZ2V0KHBsYXRmb3JtSWQpOwotCQl9Ci0JCUpwYU5hdmlnYXRvclByb3ZpZGVyIG5hdmlnYXRvclByb3ZpZGVyID0gSnB0SnBhVWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRKcGFOYXZpZ2F0b3JQcm92aWRlcihwbGF0Zm9ybSk7Ci0JCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBkZWxlZ2F0ZSA9IG51bGw7Ci0JCWlmIChuYXZpZ2F0b3JQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZSA9IG5hdmlnYXRvclByb3ZpZGVyLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpOwotCQl9Ci0JCWRlbGVnYXRlcy5wdXQocGxhdGZvcm1JZCwgZGVsZWdhdGUpOwotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDY2ZTlmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvbmF2aWdhdG9yL0pwYU5hdmlnYXRvckxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwubmF2aWdhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU1lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLklDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IuSUNvbW1vbkxhYmVsUHJvdmlkZXI7Ci0KLS8qKgotICogVGhpcyBleHRlbnNpb24gb2YgbmF2aWdhdG9yIGxhYmVsIHByb3ZpZGVyIGRlbGVnYXRlcyB0byB0aGUgcGxhdGZvcm0gVUkKLSAqIChzZWUgdGhlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUGxhdGZvcm0gZXh0ZW5zaW9uIHBvaW50KSBmb3IgbmF2aWdhdG9yIGxhYmVscy4KLSAqIAotICogVGhpcyBsYWJlbCBwcm92aWRlciBwcm92aWRlcyBhIGxhYmVsIGZvciB0aGUgcm9vdCAiSlBBIENvbnRlbnQiIG5vZGUgcHJvdmlkZWQKLSAqIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyIChzZWUge0BsaW5rIEpwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlcn0pIGFuZCBkZWxlZ2F0ZXMKLSAqIHRvIHRoZSBsYWJlbCBwcm92aWRlciByZXR1cm5lZCBieSB0aGUgcGxhdGZvcm0gVUkgaW1wbGVtZW50YXRpb24gZm9yIGxhYmVscwotICogZm9yIGNoaWxkcmVuIG9mIHRoZSAiSlBBIENvbnRlbnQiIG5vZGUgKG9yIGZvciBhbnkgb3RoZXIgc3ViLW5vZGUpLgotICovCi1wdWJsaWMgY2xhc3MgSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlcgotCQlleHRlbmRzIExhYmVsUHJvdmlkZXIKLQkJaW1wbGVtZW50cyBJQ29tbW9uTGFiZWxQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlciBkZWxlZ2F0ZTsKLQkKLQkKLQlwdWJsaWMgSnBhTmF2aWdhdG9yTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIEpwYU5hdmlnYXRvckNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGRlbGVnYXRlKCkgewotCQlyZXR1cm4gZGVsZWdhdGU7Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUJhc2VMYWJlbFByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0JCQlkZWxlZ2F0ZS5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJc3VwZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlLnJlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmlzTGFiZWxQcm9wZXJ0eShlbGVtZW50LCBwcm9wZXJ0eSk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5pc0xhYmVsUHJvcGVydHkoZWxlbWVudCwgcHJvcGVydHkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJZGVsZWdhdGUuZGlzcG9zZSgpOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJTGFiZWxQcm92aWRlciBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmdldEltYWdlKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmdldFRleHQoZWxlbWVudCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqKioqKioqIElEZXNjcmlwdGlvblByb3ZpZGVyIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqCi0JCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbihPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZGVsZWdhdGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGRlbGVnYXRlLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpOwotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKioqKioqKiBJTWVtZW50b0F3YXJlIGltcGxlbWVudGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIHNhdmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCXB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShJTWVtZW50byBtZW1lbnRvKSB7Ci0JCS8vIG5vIG9wCi0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSUNvbW1vbkxhYmVsUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBpbml0KElDb21tb25Db250ZW50RXh0ZW5zaW9uU2l0ZSBjb25maWcpIHsKLQkJaWYgKGRlbGVnYXRlID09IG51bGwpIHsKLQkJCUpwYU5hdmlnYXRvckNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSAoSnBhTmF2aWdhdG9yQ29udGVudFByb3ZpZGVyKSBjb25maWcuZ2V0RXh0ZW5zaW9uKCkuZ2V0Q29udGVudFByb3ZpZGVyKCk7Ci0JCQlpZiAoY29udGVudFByb3ZpZGVyICE9IG51bGwgJiYgY29udGVudFByb3ZpZGVyLmRlbGVnYXRlKCkgIT0gbnVsbCkgewotCQkJCWRlbGVnYXRlID0gY29udGVudFByb3ZpZGVyLmRlbGVnYXRlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkZWxlZ2F0ZSA9IG5ldyBKcGFOYXZpZ2F0b3JDb250ZW50QW5kTGFiZWxQcm92aWRlcigpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0ZjkxMi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL25hdmlnYXRvci9KcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLm5hdmlnYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEpwYU5hdmlnYXRvclRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JLyoqCi0JICogRXhhY3RseSAqb25lKiBvZiB0aGVzZSBmYWN0b3JpZXMgaXMgY3JlYXRlZCBmb3IgZWFjaCB2aWV3IHRoYXQgdXRpbGl6ZXMgaXQuICAKLQkgKiBUaGVyZWZvcmUsIGFzIHdlIGRlbGVnYXRlIHRvIHRoZSBwbGF0Zm9ybSBVSSBmb3IgZWFjaCBwcm9qZWN0LCB3ZSBzaG91bGQgCi0JICogbWFpbnRhaW4gdGhlIHNhbWUgbXVsdGlwbGljaXR5LiAgVGhhdCBpcywgaWYgdGhlcmUgaXMgYSBkZWxlZ2F0ZSBmb3IgZWFjaCAKLQkgKiBwbGF0Zm9ybSBVSSwgd2Ugc2hvdWxkIG1haW50YWluICpvbmUqIGRlbGVnYXRlIGZvciBlYWNoIHZpZXcuCi0JICogCi0JICogS2V5OiBwbGF0Zm9ybSBpZCwgIFZhbHVlOiBkZWxlZ2F0ZSBjb250ZW50IHByb3ZpZGVyIGZhY3RvcnkKLQkgKi8KLQlwcml2YXRlIE1hcDxTdHJpbmcsIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeT4gZGVsZWdhdGVzOwotCQotCQotCXB1YmxpYyBKcGFOYXZpZ2F0b3JUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVsZWdhdGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk+KCk7Ci0JfQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZGVsZWdhdGUgPSBnZXREZWxlZ2F0ZShpdGVtKTsKLQkJaWYgKGRlbGVnYXRlICE9IG51bGwpIHsKLQkJCXJldHVybiBkZWxlZ2F0ZS5idWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwcml2YXRlIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXREZWxlZ2F0ZShPYmplY3QgZWxlbWVudCkgewotCQlpZiAoISAoZWxlbWVudCBpbnN0YW5jZW9mIElBZGFwdGFibGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJSnBhQ29udGV4dE5vZGUgY29udGV4dE5vZGUgPSAoSnBhQ29udGV4dE5vZGUpICgoSUFkYXB0YWJsZSkgZWxlbWVudCkuZ2V0QWRhcHRlcihKcGFDb250ZXh0Tm9kZS5jbGFzcyk7Ci0JCQotCQlpZiAoY29udGV4dE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCUpwYVBsYXRmb3JtIHBsYXRmb3JtID0gY29udGV4dE5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCk7Ci0JCVN0cmluZyBwbGF0Zm9ybUlkID0gcGxhdGZvcm0uZ2V0SWQoKTsKLQkJaWYgKGRlbGVnYXRlcy5jb250YWluc0tleShwbGF0Zm9ybUlkKSkgewotCQkJcmV0dXJuIGRlbGVnYXRlcy5nZXQocGxhdGZvcm1JZCk7Ci0JCX0KLQkJSnBhTmF2aWdhdG9yUHJvdmlkZXIgbmF2aWdhdG9yUHJvdmlkZXIgPSBKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldEpwYU5hdmlnYXRvclByb3ZpZGVyKHBsYXRmb3JtKTsKLQkJVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGRlbGVnYXRlID0gbnVsbDsKLQkJaWYgKG5hdmlnYXRvclByb3ZpZGVyICE9IG51bGwpIHsKLQkJCWRlbGVnYXRlID0gbmF2aWdhdG9yUHJvdmlkZXIuZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCX0KLQkJZGVsZWdhdGVzLnB1dChwbGF0Zm9ybUlkLCBkZWxlZ2F0ZSk7Ci0JCXJldHVybiBkZWxlZ2F0ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0pwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4NTI2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL0pwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBMb2NhbGl6ZWQgbWVzc2FnZXMgdXNlZCBieSBEYWxpIHBlcnNpc3RlbmNlIGVkaXRvci4KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZ19qYXJQYXRoSGVscExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nX2phclBhdGhMYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlRWRpdG9yX3BhZ2VfaGVscDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZUVkaXRvcl9zb3VyY2VUYWI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3NlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX2V4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNXaXRoRGVmYXVsdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX21hcHBlZENsYXNzZXNOb05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9vcGVuOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9jb25uZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZGF0YWJhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9nZW5lcmFsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlX2p0YURhdGFzb3VyY2VOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZV9ub25KdGFEYXRhc291cmNlTmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX2RlZmF1bHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGVfanRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX2phckZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfbWFwcGVkQ2xhc3NlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX25hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9wZXJzaXN0ZW5jZVByb3ZpZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGVfbm9GaWxlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfamFyRmlsZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfamFyRmlsZURpYWxvZ19tZXNzYWdlOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGVfb3JtTm9OYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9uYW1lQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfcHJvcGVydGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3Byb3BlcnRpZXNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV92YWx1ZUNvbHVtbjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJqcHRfdWlfcGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLmNsYXNzOwotCXN0YXRpYyB7Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIEJVTkRMRV9DTEFTUyk7Ci0JfQotCi0JcHJpdmF0ZSBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0Fic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWZmM2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9BYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5QZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIGRlZmluaXRpb24gc2hvdWxkIGJlICJzdGF0aWMiIChpLmUuIHVuY2hhbmdpbmcgb25jZSBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBlcnNpc3RlbmNlWG1sUmVzb3VyY2VVaURlZmluaXRpb24KLQlpbXBsZW1lbnRzIFJlc291cmNlVWlEZWZpbml0aW9uLCBQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uCi17Ci0JCi0JCi0JcHJpdmF0ZSBmaW5hbCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBmYWN0b3J5OwotCQotCQotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RQZXJzaXN0ZW5jZVhtbFJlc291cmNlVWlEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmZhY3RvcnkgPSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBhYnN0cmFjdCBQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBidWlsZFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiB0aGlzLmZhY3Rvcnk7Ci0JfQotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gYnVpbGRQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsIENvbXBvc2l0ZSBwYXJlbnQsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQlyZXR1cm4gdGhpcy5mYWN0b3J5LmNyZWF0ZVBlcnNpc3RlbmNlVW5pdENvbXBvc2l0ZXMoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTI3MTc0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFyY2hpdmVGaWxlVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLklTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsQ29tcG9uZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbEZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUucmVzb3VyY2VzLklWaXJ0dWFsUmVzb3VyY2U7Ci0KLXB1YmxpYyBjbGFzcyBBcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZyAKLQlleHRlbmRzIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nCi17Ci0JcHJpdmF0ZSBmaW5hbCBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGphclBhdGhNb2RlbDsKLQkKLQlwcml2YXRlIERlcGxveW1lbnRQYXRoQ2FsY3VsYXRvciBwYXRoQ2FsY3VsYXRvcjsKLQkKLQkKLQlwdWJsaWMgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50KSB7Ci0JCXRoaXMocGFyZW50LCBuZXcgU2ltcGxlRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yKCkpOwotCX0KLQkKLQlwdWJsaWMgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2coU2hlbGwgcGFyZW50LCBEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IgcGF0aENhbGN1bGF0b3IpIHsKLQkJc3VwZXIocGFyZW50LCBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLCBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCkpOwotCQl0aGlzLnBhdGhDYWxjdWxhdG9yID0gcGF0aENhbGN1bGF0b3I7Ci0JCXNldENvbXBhcmF0b3IobmV3IFJlc291cmNlQ29tcGFyYXRvcihSZXNvdXJjZUNvbXBhcmF0b3IuTkFNRSkpOwotCQlhZGRGaWx0ZXIobmV3IEFyY2hpdmVGaWxlVmlld2VyRmlsdGVyKCkpOwotCQlzZXRWYWxpZGF0b3IobmV3IEFyY2hpdmVGaWxlU2VsZWN0aW9uVmFsaWRhdG9yKCkpOwotCQl0aGlzLmphclBhdGhNb2RlbCA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCi0JCUxhYmVsIGhlbHBMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJaGVscExhYmVsLnNldFRleHQoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLkFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nX2phclBhdGhIZWxwTGFiZWwpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSA0MDA7Ci0JCWhlbHBMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JCUNvbXBvc2l0ZSBzdWJDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlzdWJDb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKSk7Ci0JCXN1YkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUxhYmVsIGphclBhdGhMYWJlbCA9IG5ldyBMYWJlbChzdWJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJamFyUGF0aExhYmVsLnNldEZvbnQoY29tcG9zaXRlLmdldEZvbnQoKSk7Ci0JCWphclBhdGhMYWJlbC5zZXRUZXh0KEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5BcmNoaXZlRmlsZVNlbGVjdGlvbkRpYWxvZ19qYXJQYXRoTGFiZWwpOwotCQkKLQkJVGV4dCBqYXJQYXRoVGV4dCA9IG5ldyBUZXh0KHN1YkNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWphclBhdGhUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlTV1RUb29scy5iaW5kKGphclBhdGhNb2RlbCwgamFyUGF0aFRleHQpOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRyZWVWaWV3ZXIgZG9DcmVhdGVUcmVlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSkgewotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBzdXBlci5kb0NyZWF0ZVRyZWVWaWV3ZXIocGFyZW50LCBzdHlsZSk7Ci0JCQotCQl0cmVlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigKLQkJCW5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXVwZGF0ZUphclBhdGhNb2RlbChldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQotCQlyZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlSmFyUGF0aE1vZGVsKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCU9iamVjdCBzZWxlY3RlZE9iaiA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZE9iaiBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQl0aGlzLmphclBhdGhNb2RlbC5zZXRWYWx1ZShjYWxjdWxhdGVEZXBsb3lQYXRoKChJRmlsZSkgc2VsZWN0ZWRPYmopKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuamFyUGF0aE1vZGVsLnNldFZhbHVlKCIiKTsKLQkJfQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGNhbGN1bGF0ZURlcGxveVBhdGgoSUZpbGUgYXJjaGl2ZUZpbGUpIHsKLQkJcmV0dXJuIHRoaXMucGF0aENhbGN1bGF0b3IuY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoYXJjaGl2ZUZpbGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlUmVzdWx0KCkgewotCQlzZXRSZXN1bHQoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCh0aGlzLmphclBhdGhNb2RlbC5nZXRWYWx1ZSgpKSk7Ci0JfQotCQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEFyY2hpdmVGaWxlU2VsZWN0aW9uVmFsaWRhdG9yIAotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgCi0JewotCQlwdWJsaWMgQXJjaGl2ZUZpbGVTZWxlY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQkKLQkJcHVibGljIElTdGF0dXMgdmFsaWRhdGUoT2JqZWN0W10gc2VsZWN0aW9uKSB7Ci0JCQlpbnQgblNlbGVjdGVkPSBzZWxlY3Rpb24ubGVuZ3RoOwotCQkJaWYgKG5TZWxlY3RlZCA9PSAwIHx8IChuU2VsZWN0ZWQgPiAxKSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgIiIpOyAgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZm9yIChpbnQgaT0gMDsgaSA8IHNlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBjdXJyPSBzZWxlY3Rpb25baV07Ci0JCQkJaWYgKGN1cnIgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJfQotCX0JCi0JCi0JCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yCi0JewotCQlTdHJpbmcgY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoSUZpbGUgZmlsZSk7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yCi0JCWltcGxlbWVudHMgRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yCi0JewotCQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZURlcGxveW1lbnRQYXRoKElGaWxlIGZpbGUpIHsKLQkJCXJldHVybiBmaWxlLmdldE5hbWUoKTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1vZHVsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCQlleHRlbmRzIFNpbXBsZURlcGxveW1lbnRQYXRoQ2FsY3VsYXRvcgotCXsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoSUZpbGUgZmlsZSkgewotCQkJLy8gZmlyc3QgbG9vayBmb3IgdmlydHVhbCBjb21wb25lbnQgdGhhdCBtYXRjaGVzIHRoaXMgZmlsZSwgcmV0dXJuaW5nCi0JCQkvLyB0aGUgcGF0aCB0byB0aGF0IHZpcnR1YWwgY29tcG9uZW50Ci0JCQlJVmlydHVhbENvbXBvbmVudCB2Q29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQoZmlsZS5nZXRQcm9qZWN0KCkpOwotCQkJaWYgKHZDb21wb25lbnQgIT0gbnVsbCkgewotCQkJCUlWaXJ0dWFsRm9sZGVyIHZGb2xkZXIgPSB2Q29tcG9uZW50LmdldFJvb3RGb2xkZXIoKTsKLQkJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSBmaW5kVmlydHVhbEZpbGUodkZvbGRlciwgZmlsZSk7Ci0JCQkJaWYgKHZGaWxlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGNhbGN1bGF0ZVBlcnNpc3RlbmNlUm9vdFJlbGF0aXZlUGF0aCh2RmlsZSk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyB0aGVuIGRlZmF1bHQgdG8gc2ltcGxlIGJlaGF2aW9yCi0JCQlyZXR1cm4gc3VwZXIuY2FsY3VsYXRlRGVwbG95bWVudFBhdGgoZmlsZSk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBJVmlydHVhbEZpbGUgZmluZFZpcnR1YWxGaWxlKElWaXJ0dWFsQ29udGFpbmVyIHZDb250YWluZXIsIElGaWxlIHJlYWxGaWxlKSB7Ci0JCQl0cnkgeyAKLQkJCQlmb3IgKElWaXJ0dWFsUmVzb3VyY2UgdlJlc291cmNlIDogdkNvbnRhaW5lci5tZW1iZXJzKCkpIHsKLQkJCQkJaWYgKHZSZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVZpcnR1YWxSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCQlJVmlydHVhbEZpbGUgdkZpbGUgPSAoSVZpcnR1YWxGaWxlKSB2UmVzb3VyY2U7Ci0JCQkJCQlpZiAocmVhbEZpbGUuZXF1YWxzKHZGaWxlLmdldFVuZGVybHlpbmdGaWxlKCkpKSB7Ci0JCQkJCQkJcmV0dXJuIHZGaWxlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVZpcnR1YWxGaWxlIHZGaWxlID0gZmluZFZpcnR1YWxGaWxlKChJVmlydHVhbENvbnRhaW5lcikgdlJlc291cmNlLCByZWFsRmlsZSk7Ci0JCQkJCQlpZiAodkZpbGUgIT0gbnVsbCkgewotCQkJCQkJCXJldHVybiB2RmlsZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGNlKTsKLQkJCX0KLQkJCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBTdHJpbmcgY2FsY3VsYXRlUGVyc2lzdGVuY2VSb290UmVsYXRpdmVQYXRoKElWaXJ0dWFsRmlsZSB2RmlsZSkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHZGaWxlLmdldFByb2plY3QoKTsKLQkJCUlQYXRoIHB1Um9vdFBhdGggPSBKcHRKcGFDb3JlUGx1Z2luLmdldEphclJ1bnRpbWVSb290UGF0aChwcm9qZWN0KTsKLQkJCQotCQkJSVBhdGggcGF0aCA9IHZGaWxlLmdldFJ1bnRpbWVQYXRoKCkubWFrZVJlbGF0aXZlVG8ocHVSb290UGF0aCk7Ci0JCQkKLQkJCXJldHVybiBwYXRoLnRvU3RyaW5nKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzI1ZGFiLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gR2VuZXJhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICBOYW1lOiAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICBQZXJzaXN0ZW5jZSBQcm92aWRlcjogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gTWFwcGVkIENsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBQZXJzaXN0ZW5jZVVuaXRNYXBwZWRDbGFzc2VzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBYTUwgTWFwcGluZyBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0TWFwcGVkQ2xhc3Nlc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlIGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlpbml0aWFsaXplR2VuZXJhbFBhbmUoY29udGFpbmVyKTsKLQkJaW5pdGlhbGl6ZU1hcHBlZENsYXNzZXNQYW5lKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKUEFNYXBwaW5nRGVzY3JpcHRvcnNQYW5lKGNvbnRhaW5lcik7Ci0JCWluaXRpYWxpemVKYXJGaWxlc1BhbmUoY29udGFpbmVyKTsKLQl9Ci0JCi0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSlBBTWFwcGluZ0Rlc2NyaXB0b3JzUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gYWRkQ29sbGFwc2libGVTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfanBhTWFwcGluZ0Rlc2NyaXB0b3JzX2Rlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKLQotCQluZXcgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplSmFyRmlsZXNQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRDb2xsYXBzaWJsZVNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9qYXJGaWxlcwotCQkpOwotCQkKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyLmdldFBhcmVudCgpKTsKLQkJCi0JCW5ldyBHZW5lcmljUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZGUwZTIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDkgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZQotCWV4dGVuZHMgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUKLXsKLQlwdWJsaWMgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OWNiYjQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IEFkZFJlbW92ZUxpc3RQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqIEBzZWUgQWRkUmVtb3ZlTGlzdFBhbmUKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUoUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCWFkZE1hcHBpbmdGaWxlc0xpc3QoY29udGFpbmVyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL0dlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTk4YWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9HZW5lcmljUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFQYWdlQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNQZXJzaXN0ZW5jZVhtbFVpRmFjdG9yeSBpbXBsZW1lbnRzIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5Ci17Ci0JLy8gKioqKioqKioqKioqKioqKiBwZXJzaXN0ZW5jZSB1bml0IGNvbXBvc2l0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCQotCXB1YmxpYyBMaXN0SXRlcmF0b3I8SnBhUGFnZUNvbXBvc2l0ZT4gY3JlYXRlUGVyc2lzdGVuY2VVbml0Q29tcG9zaXRlcygKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkJQ29tcG9zaXRlIHBhcmVudCwKLQkJV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJQXJyYXlMaXN0PEpwYVBhZ2VDb21wb3NpdGU+IHBhZ2VzID0gbmV3IEFycmF5TGlzdDxKcGFQYWdlQ29tcG9zaXRlPigzKTsKLQotCQlwYWdlcy5hZGQobmV3IEdlbmVyaWNQZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlKHN1YmplY3RIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSkpOwotCQlwYWdlcy5hZGQobmV3IFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGUoc3ViamVjdEhvbGRlciwgcGFyZW50LCB3aWRnZXRGYWN0b3J5KSk7Ci0JCXBhZ2VzLmFkZChuZXcgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZShzdWJqZWN0SG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpKTsKLQotCQlyZXR1cm4gcGFnZXMubGlzdEl0ZXJhdG9yKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1ODgxZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5JSmF2YUVsZW1lbnRTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuSnB0Q29tbW9uVWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFNYXBwaW5nSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuSVByb2dyZXNzU2VydmljZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBBZGRSZW1vdmVMaXN0UGFuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IHggRXhjbHVkZSBVbmxpc3RlZCBNYXBwZWQgQ2xhc3NlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKiBAc2VlIEFkZFJlbW92ZUxpc3RQYW5lCi0gKgotICogQHZlcnNpb24gMi4zCi0gKiBAc2luY2UgMi4wCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGUgZXh0ZW5kcyBQYW5lPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdE1hcHBlZENsYXNzZXNDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlKFBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTWFwcGVkQ2xhc3MoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCi0JCUlUeXBlIHR5cGUgPSBjaG9vc2VUeXBlKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGNsYXNzTmFtZSA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCckJyk7Ci0JCQlpZihjbGFzc1JlZkV4aXN0cyhjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBnZXRTdWJqZWN0KCkuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoY2xhc3NOYW1lKTsKLQkJCWxpc3RTZWxlY3Rpb25Nb2RlbC5zZXRTZWxlY3RlZFZhbHVlKGNsYXNzUmVmKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gY2xhc3NSZWZFeGlzdHMoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpKSB7Ci0JCQlpZiggY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBBZGFwdGVyIGJ1aWxkQWRhcHRlcigpIHsKLQkJcmV0dXJuIG5ldyBBZGRSZW1vdmVMaXN0UGFuZS5BYnN0cmFjdEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGROZXdJdGVtKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlhZGRNYXBwZWRDbGFzcyhsaXN0U2VsZWN0aW9uTW9kZWwpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlpZiAoIXN1cGVyLmVuYWJsZU9wdGlvbk9uU2VsZWN0aW9uQ2hhbmdlKGxpc3RTZWxlY3Rpb25Nb2RlbCkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXJldHVybiBmaW5kVHlwZSgoQ2xhc3NSZWYpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpICE9IG51bGw7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIGJvb2xlYW4gaGFzT3B0aW9uYWxCdXR0b24oKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBvcHRpb25hbEJ1dHRvblRleHQoKSB7Ci0JCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlX29wZW47Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgb3B0aW9uT25TZWxlY3Rpb24oT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCW9wZW5NYXBwZWRDbGFzcygoQ2xhc3NSZWYpIGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZVNwZWNpZmllZENsYXNzUmVmKChDbGFzc1JlZikgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIEJvb2xlYW4+KAotCQkJZ2V0U3ViamVjdEhvbGRlcigpLAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9FWENMVURFX1VOTElTVEVEX0NMQVNTRVNfUFJPUEVSVFkpCi0JCXsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3Nlcyh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZEV4Y2x1ZGVVbmxpc3RlZE1hcHBlZENsYXNzZXNTdHJpbmdIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbiwgU3RyaW5nPihidWlsZERlZmF1bHRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzSG9sZGVyKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oQm9vbGVhbiB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUgPSB2YWx1ZS5ib29sZWFuVmFsdWUoKSA/IEpwdENvbW1vblVpTWVzc2FnZXMuQm9vbGVhbl9UcnVlIDogSnB0Q29tbW9uVWlNZXNzYWdlcy5Cb29sZWFuX0ZhbHNlOwotCQkJCQlyZXR1cm4gTkxTLmJpbmQoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc1dpdGhEZWZhdWx0LCBkZWZhdWx0U3RyaW5nVmFsdWUpOwotCQkJCX0KLQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3NlczsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGREZWZhdWx0RXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBCb29sZWFuPigKLQkJCWdldFN1YmplY3RIb2xkZXIoKSwKLQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX1BST1BFUlRZLAotCQkJUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfRVhDTFVERV9VTkxJU1RFRF9DTEFTU0VTX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmICh0aGlzLnN1YmplY3QuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmdldERlZmF1bHRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQkJfQotCQl9OwotCX0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGJ1aWxkTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBMYWJlbFByb3ZpZGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlDbGFzc1JlZiBjbGFzc1JlZiA9IChDbGFzc1JlZikgZWxlbWVudDsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJCQlpZiAocGVyc2lzdGVudFR5cGUgIT0gbnVsbCkgewotCQkJCQlpbWFnZSA9IEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pbWFnZUZvclR5cGVNYXBwaW5nKHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQkJfQotCi0JCQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGltYWdlOwotCQkJCX0KLQotCQkJCXJldHVybiBKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLldBUk5JTkcpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCUNsYXNzUmVmIGNsYXNzUmVmID0gKENsYXNzUmVmKSBlbGVtZW50OwotCQkJCVN0cmluZyBuYW1lID0gY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q2xhc3Nlc0NvbXBvc2l0ZV9tYXBwZWRDbGFzc2VzTm9OYW1lOwotCQkJCX0KLQotCQkJCXJldHVybiBuYW1lOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkSXRlbUxpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPENsYXNzUmVmPigKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJQ2xhc3NSZWYuSkFWQV9QRVJTSVNURU5UX1RZUEVfUFJPUEVSVFksCi0JCQlDbGFzc1JlZi5DTEFTU19OQU1FX1BST1BFUlRZCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gYnVpbGRMaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9DTEFTU19SRUZTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxDbGFzc1JlZj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZENsYXNzUmVmcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Q2xhc3NSZWY+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDbGFzc1JlZj4oKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9tcHRzIHRoZSB1c2VyIHRoZSBPcGVuIFR5cGUgZGlhbG9nLgotCSAqCi0JICogQHJldHVybiBFaXRoZXIgdGhlIHNlbGVjdGVkIHR5cGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHVzZXIKLQkgKiBjYW5jZWxlZCB0aGUgZGlhbG9nCi0JICovCi0JcHJpdmF0ZSBJVHlwZSBjaG9vc2VUeXBlKCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBnZXRKYXZhUHJvamVjdCgpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGUgPSBTZWFyY2hFbmdpbmUuY3JlYXRlSmF2YVNlYXJjaFNjb3BlKGVsZW1lbnRzKTsKLQkJSVByb2dyZXNzU2VydmljZSBzZXJ2aWNlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRQcm9ncmVzc1NlcnZpY2UoKTsKLQkJU2VsZWN0aW9uRGlhbG9nIHR5cGVTZWxlY3Rpb25EaWFsb2c7Ci0KLQkJdHJ5IHsKLQkJCXR5cGVTZWxlY3Rpb25EaWFsb2cgPSBKYXZhVUkuY3JlYXRlVHlwZURpYWxvZygKLQkJCQlnZXRTaGVsbCgpLAotCQkJCXNlcnZpY2UsCi0JCQkJc2NvcGUsCi0JCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0NMQVNTRVMsCi0JCQkJZmFsc2UsCi0JCQkJIiIKLQkJCSk7Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXR5cGVTZWxlY3Rpb25EaWFsb2cuc2V0VGl0bGUoSnB0Q29tbW9uVWlNZXNzYWdlcy5DbGFzc0Nob29zZXJQYW5lX2RpYWxvZ1RpdGxlKTsKLQkJdHlwZVNlbGVjdGlvbkRpYWxvZy5zZXRNZXNzYWdlKEpwdENvbW1vblVpTWVzc2FnZXMuQ2xhc3NDaG9vc2VyUGFuZV9kaWFsb2dNZXNzYWdlKTsKLQotCQlpZiAodHlwZVNlbGVjdGlvbkRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlyZXR1cm4gKElUeXBlKSB0eXBlU2VsZWN0aW9uRGlhbG9nLmdldFJlc3VsdCgpWzBdOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZSBmaW5kVHlwZShDbGFzc1JlZiBjbGFzc1JlZikgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCk7Ci0KLQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCkuZmluZFR5cGUoY2xhc3NOYW1lLnJlcGxhY2UoJyQnLCAnLicpKTsKLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIERlc2NyaXB0aW9uCi0JCWFkZE11bHRpTGluZUxhYmVsKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZGVzY3JpcHRpb24KLQkJKTsKLQotCQkvLyBMaXN0IHBhbmUKLQkJbmV3IEFkZFJlbW92ZUxpc3RQYW5lPFBlcnNpc3RlbmNlVW5pdD4oCi0JCQl0aGlzLAotCQkJY29udGFpbmVyLAotCQkJdGhpcy5idWlsZEFkYXB0ZXIoKSwKLQkJCXRoaXMuYnVpbGRJdGVtTGlzdEhvbGRlcigpLAotCQkJdGhpcy5idWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMCi0JCSkKLQkJewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVGFibGUoVGFibGUgdGFibGUpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplVGFibGUodGFibGUpOwotCi0JCQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IHRhYmxlLmdldFBhcmVudCgpOwotCQkJCUdyaWREYXRhIGdyaWREYXRhICAgPSAoR3JpZERhdGEpIGNvbnRhaW5lci5nZXRMYXlvdXREYXRhKCk7Ci0JCQkJZ3JpZERhdGEuaGVpZ2h0SGludCA9IDc1OwotCQkJfQotCQl9OwotCi0JCXRoaXMuYWRkVHJpU3RhdGVDaGVja0JveFdpdGhEZWZhdWx0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENsYXNzZXNDb21wb3NpdGVfZXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3NlcywKLQkJCWJ1aWxkRXhjbHVkZVVubGlzdGVkTWFwcGVkQ2xhc3Nlc0hvbGRlcigpLAotCQkJYnVpbGRFeGNsdWRlVW5saXN0ZWRNYXBwZWRDbGFzc2VzU3RyaW5nSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfR0VORVJBTAotCQkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuTWFwcGVkQ2xhc3MoQ2xhc3NSZWYgY2xhc3NSZWYpIHsKLQotCQlJVHlwZSB0eXBlID0gZmluZFR5cGUoY2xhc3NSZWYpOwotCi0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSUphdmFFbGVtZW50IGphdmFFbGVtZW50ID0gdHlwZS5nZXRQYXJlbnQoKTsKLQkJCQlKYXZhVUkub3BlbkluRWRpdG9yKGphdmFFbGVtZW50LCB0cnVlLCB0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRTdWJqZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjE0Y2IwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBIZXJlIHRoZSBsYXlvdXQgb2YgdGhpcyBwYW5lOgotICogPHByZT4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEdlbmVyYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8IFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgfCBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGlzIHBhbmUncyBzdWJqZWN0Ci0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqIEBwYXJhbSB3aWRnZXRGYWN0b3J5IFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHZhcmlvdXMgY29tbW9uIHdpZGdldHMKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZShQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZSBjb250YWluZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZ2V0RmFjdG9yeSB3aWRnZXRGYWN0b3J5KSB7Ci0KLQkJc3VwZXIoc3ViamVjdEhvbGRlciwgY29udGFpbmVyLCB3aWRnZXRGYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgICAgPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wICAgICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgICAgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gICAgPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgICAgID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IDE1OwotCi0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBhZGRQYW5lKHBhcmVudCwgbGF5b3V0KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT047Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVEYXRhYmFzZVBhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZFNlY3Rpb24oCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZV9kYXRhYmFzZQotCQkpOwotCi0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGUodGhpcywgY29udGFpbmVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUdlbmVyYWxQYW5lKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQljb250YWluZXIgPSBhZGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfZ2VuZXJhbAotCQkpOwotCi0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZSh0aGlzLCBjb250YWluZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWluaXRpYWxpemVHZW5lcmFsUGFuZShjb250YWluZXIpOwotCQlpbml0aWFsaXplRGF0YWJhc2VQYW5lKGNvbnRhaW5lcik7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25Db21wb3NpdGVfY29ubmVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZjcyYTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvblByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgSlRBIERhdGFzb3VyY2UgTmFtZTogICAgIHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgTm9uLUpUQSBEYXRhc291cmNlIE5hbWU6IHwgSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uQ29tcG9zaXRlIC0gVGhlIHBhcmVudCBjb250YWluZXIKLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAyLjAKLSAqLwotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25EYXRhYmFzZUNvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnRQYW5lIFRoZSBwYXJlbnQgcGFuZSBvZiB0aGlzIG9uZQotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKi8KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkRhdGFiYXNlQ29tcG9zaXRlKFBhbmU8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRKVEFEYXRhc291cmNlTmFtZUJvb2xlYW5Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLCBCb29sZWFuPihidWlsZFRyYW5zYWN0aW9uVHlwZUhvbGRlcigpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIHRyYW5zZm9ybV8oUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSA9PSBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRKVEFEYXRhc291cmNlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LkpUQV9EQVRBX1NPVVJDRV9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldEp0YURhdGFTb3VyY2UoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJaWYgKHZhbHVlLmxlbmd0aCgpID09IDApIHsKLQkJCQkJdmFsdWUgPSBudWxsOwotCQkJCX0KLQkJCQlzdWJqZWN0LnNldEp0YURhdGFTb3VyY2UodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTm9uSlRBRGF0YXNvdXJjZU5hbWVCb29sZWFuSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSwgQm9vbGVhbj4oYnVpbGRUcmFuc2FjdGlvblR5cGVIb2xkZXIoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiB0cmFuc2Zvcm1fKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUgPT0gUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGROb25KVEFEYXRhc291cmNlTmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0Lk5PTl9KVEFfREFUQV9TT1VSQ0VfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROb25KdGFEYXRhU291cmNlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXROb25KdGFEYXRhU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+IGJ1aWxkVHJhbnNhY3Rpb25UeXBlSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZT4oCi0JCQlnZXRTdWJqZWN0SG9sZGVyKCksCi0JCQlQZXJzaXN0ZW5jZVVuaXQuREVGQVVMVF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZLAotCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9UUkFOU0FDVElPTl9UWVBFX1BST1BFUlRZKQotCQl7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0VHJhbnNhY3Rpb25UeXBlKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJLy8gSlRBIERhdGFzb3VyY2UgTmFtZSB3aWRnZXRzCi0JCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBlbmFibGVkID0gdGhpcy5idWlsZEpUQURhdGFzb3VyY2VOYW1lQm9vbGVhbkhvbGRlcigpOwotCQlMYWJlbCBsYWJlbCA9IGFkZExhYmVsKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfanRhRGF0YXNvdXJjZU5hbWUsCi0JCQllbmFibGVkCi0JCSk7Ci0JCVRleHQgdGV4dCA9IGFkZFRleHQoCi0JCQljb250YWluZXIsCi0JCQlidWlsZEpUQURhdGFzb3VyY2VOYW1lSG9sZGVyKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTiwKLQkJCWVuYWJsZWQKLQkJKTsKLQkJYWRkTGFiZWxlZENvbXBvc2l0ZShjb250YWluZXIsIGxhYmVsLCB0ZXh0LCBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTik7Ci0JCQotCQkKLQkJLy8gTm9uLUpUQSBEYXRhc291cmNlIE5hbWUgd2lkZ2V0cwotCQllbmFibGVkID0gdGhpcy5idWlsZE5vbkpUQURhdGFzb3VyY2VOYW1lQm9vbGVhbkhvbGRlcigpOwotCQlsYWJlbCA9IGFkZExhYmVsKAotCQkJY29udGFpbmVyLCAKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uRGF0YWJhc2VDb21wb3NpdGVfbm9uSnRhRGF0YXNvdXJjZU5hbWUsCi0JCQllbmFibGVkCi0JCSk7Ci0JCXRleHQgPSBhZGRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJYnVpbGROb25KVEFEYXRhc291cmNlTmFtZUhvbGRlcigpLAotCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04sCi0JCQllbmFibGVkCi0JCSk7Ci0JCWFkZExhYmVsZWRDb21wb3NpdGUoY29udGFpbmVyLCBsYWJlbCwgdGV4dCwgSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0NPTk5FQ1RJT04pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjIyYmQ4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuRW51bUZvcm1Db21ib1ZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8IFRyYW5zYWN0aW9uIFR5cGU6ICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8dnwgfAotICogfCAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPC9wcmU+Ci0gKgotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXQKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkNvbXBvc2l0ZSAtIFRoZSBwYXJlbnQgY29udGFpbmVyCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgotewotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGVyc2lzdGVuY2VVbml0Q29ubmVjdGlvbkdlbmVyYWxDb21wb3NpdGU8L2NvZGU+LgotCSAqCi0JICogQHBhcmFtIHBhcmVudFBhbmUgVGhlIHBhcmVudCBwYW5lIG9mIHRoaXMgb25lCi0JICogQHBhcmFtIHBhcmVudCBUaGUgcGFyZW50IGNvbnRhaW5lcgotCSAqLwotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXRDb25uZWN0aW9uR2VuZXJhbENvbXBvc2l0ZShQYW5lPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lcik7Ci0JfQotCi0JcHJpdmF0ZSBFbnVtRm9ybUNvbWJvVmlld2VyPFBlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlPiBidWlsZFRyYW5zYWN0aW9uVHlwZUNvbWJvKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlyZXR1cm4gbmV3IEVudW1Gb3JtQ29tYm9WaWV3ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU+KHRoaXMsIGNvbnRhaW5lcikgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGFkZFByb3BlcnR5TmFtZXMoQ29sbGVjdGlvbjxTdHJpbmc+IHByb3BlcnR5TmFtZXMpIHsKLQkJCQlzdXBlci5hZGRQcm9wZXJ0eU5hbWVzKHByb3BlcnR5TmFtZXMpOwotCQkJCXByb3BlcnR5TmFtZXMuYWRkKFBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQkJcHJvcGVydHlOYW1lcy5hZGQoUGVyc2lzdGVuY2VVbml0LkRFRkFVTFRfVFJBTlNBQ1RJT05fVFlQRV9QUk9QRVJUWSk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZVtdIGdldENob2ljZXMoKSB7Ci0JCQkJcmV0dXJuIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS52YWx1ZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldERlZmF1bHRUcmFuc2FjdGlvblR5cGUoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGRpc3BsYXlTdHJpbmcoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIHZhbHVlKSB7Ci0JCQkJc3dpdGNoICh2YWx1ZSkgewotCQkJCQljYXNlIEpUQSA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX2p0YTsKLQkJCQkJY2FzZSBSRVNPVVJDRV9MT0NBTCA6Ci0JCQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3Jlc291cmNlX2xvY2FsOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBnZXRWYWx1ZSgpIHsKLQkJCQlyZXR1cm4gZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlKFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSB2YWx1ZSkgewotCQkJCWdldFN1YmplY3QoKS5zZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUodmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCS8vIFRyYW5zYWN0aW9uIFR5cGUgd2lkZ2V0cwotCQlhZGRMYWJlbGVkQ29tcG9zaXRlKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdENvbm5lY3Rpb25HZW5lcmFsQ29tcG9zaXRlX3RyYW5zYWN0aW9uVHlwZSwKLQkJCWJ1aWxkVHJhbnNhY3Rpb25UeXBlQ29tYm8oY29udGFpbmVyKS5nZXRDb250cm9sKCksCi0JCQlKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfQ09OTkVDVElPTgotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQwMmU4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuZGV0YWlsczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLldpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYVBhZ2VDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLkpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotCi0vKioKLSAqIEhlcmUgdGhlIGxheW91dCBvZiB0aGlzIHBhbmU6Ci0gKiA8cHJlPgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gR2VuZXJhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICBOYW1lOiAgICAgICAgICAgICAgICAgfCBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICBQZXJzaXN0ZW5jZSBQcm92aWRlcjogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx2fCB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8IC0gTWFwcGVkIENsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCBQZXJzaXN0ZW5jZVVuaXRNYXBwZWRDbGFzc2VzQ29tcG9zaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgLSBYTUwgTWFwcGluZyBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogfCAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8IFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtIEpBUiBGaWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRNYXBwZWRDbGFzc2VzQ29tcG9zaXRlCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZQotICogQHNlZSBQZXJzaXN0ZW5jZVVuaXRKYXJGaWxlc0NvbXBvc2l0ZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZSBleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBKcGFQYWdlQ29tcG9zaXRlCi17Ci0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlIGNvbnRhaW5lciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQotCQlzdXBlcihzdWJqZWN0SG9sZGVyLCBjb250YWluZXIsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgYWRkQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IGFkZFN1YlBhbmUocGFyZW50KTsKLQkJdXBkYXRlR3JpZERhdGEoY29udGFpbmVyKTsKLQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFBlcnNpc3RlbmNlUHJvdmlkZXJIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5QUk9WSURFUl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFByb3ZpZGVyKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXRQcm92aWRlcih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGVyc2lzdGVuY2VVbml0TmFtZUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBTdHJpbmc+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGVyc2lzdGVuY2VVbml0RGVzY3JpcHRpb25Ib2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5ERVNDUklQVElPTl9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldERlc2NyaXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKFN0cmluZyB2YWx1ZSkgewotCQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCXZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JCQkJc3ViamVjdC5zZXREZXNjcmlwdGlvbih2YWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIZWxwSUQoKSB7Ci0JCXJldHVybiBKcGFIZWxwQ29udGV4dElkcy5QRVJTSVNURU5DRV9YTUxfR0VORVJBTDsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldFBhZ2VJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZVRleHQoKSB7Ci0JCXJldHVybiBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0R2VuZXJhbENvbXBvc2l0ZV9nZW5lcmFsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVHZW5lcmFsUGFuZShDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJY29udGFpbmVyID0gdGhpcy5hZGRTZWN0aW9uKAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZ2VuZXJhbAotCQkpOwotCi0JCS8vIE5hbWUgd2lkZ2V0cwotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfbmFtZSwKLQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVVuaXROYW1lSG9sZGVyKCksCi0JCQl0aGlzLmdldEhlbHBJRCgpCi0JCSk7Ci0KLQkJLy8gUGVyc2lzdGVuY2UgUHJvdmlkZXIgd2lkZ2V0cwotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfcGVyc2lzdGVuY2VQcm92aWRlciwKLQkJCXRoaXMuYnVpbGRQZXJzaXN0ZW5jZVByb3ZpZGVySG9sZGVyKCksCi0JCQl0aGlzLmdldEhlbHBJRCgpCi0JCSk7Ci0KLQkJLy8gRGVzY3JpcHRpb24gd2lkZ2V0cwotCQl0aGlzLmFkZExhYmVsZWRUZXh0KAotCQkJY29udGFpbmVyLAotCQkJSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGVfZGVzY3JpcHRpb24sCi0JCQl0aGlzLmJ1aWxkUGVyc2lzdGVuY2VVbml0RGVzY3JpcHRpb25Ib2xkZXIoKSwKLQkJCXRoaXMuZ2V0SGVscElEKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFwcGVkQ2xhc3Nlc1BhbmUoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCi0JCWNvbnRhaW5lciA9IGFkZENvbGxhcHNpYmxlU2VjdGlvbigKLQkJCWNvbnRhaW5lciwKLQkJCUpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRHZW5lcmFsQ29tcG9zaXRlX21hcHBlZENsYXNzZXMKLQkJKTsKLQotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIpOwotCQl1cGRhdGVHcmlkRGF0YShjb250YWluZXIuZ2V0UGFyZW50KCkpOwotCi0JCW5ldyBQZXJzaXN0ZW5jZVVuaXRDbGFzc2VzQ29tcG9zaXRlKHRoaXMsIGNvbnRhaW5lcik7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y3ZDBiMy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlTGlzdFBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLlBhbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVBhbmUuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8IHwgQWRkUmVtb3ZlTGlzdFBhbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvcHJlPgotICoKLSAqIEBzZWUgUGVyc2lzdGVuY2VVbml0Ci0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdEdlbmVyYWxDb21wb3NpdGUgLSBUaGUgcGFyZW50IGNvbnRhaW5lcgotICogQHNlZSBBZGRSZW1vdmVMaXN0UGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMAotICogQHNpbmNlIDIuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGUgCi0JZXh0ZW5kcyBQYW5lPFBlcnNpc3RlbmNlVW5pdD4KLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEphckZpbGVSZWY+IHNlbGVjdGVkSXRlbUhvbGRlcjsJCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPlBlcnNpc3RlbmNlVW5pdEpQQU1hcHBpbmdEZXNjcmlwdG9yc0NvbXBvc2l0ZTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50UGFuZSBUaGUgcGFyZW50IHBhbmUgb2YgdGhpcyBvbmUKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdEphckZpbGVzQ29tcG9zaXRlKAotCQkJUGFuZTw/IGV4dGVuZHMgUGVyc2lzdGVuY2VVbml0PiBwYXJlbnRQYW5lLAotCQkJQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXN1cGVyKHBhcmVudFBhbmUsIHBhcmVudCwgZmFsc2UpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoKTsKLQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIgPSBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpOwotCX0KLQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlhZGRKYXJGaWxlc0xpc3QoY29udGFpbmVyKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmFyRmlsZXNMaXN0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJLy8gTGlzdCBwYW5lCi0JCW5ldyBBZGRSZW1vdmVMaXN0UGFuZTxQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJdGhpcywKLQkJCWNvbnRhaW5lciwKLQkJCXRoaXMuYnVpbGRBZGFwdGVyKCksCi0JCQl0aGlzLmJ1aWxkSXRlbUxpc3RIb2xkZXIoKSwKLQkJCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyLAotCQkJdGhpcy5idWlsZExhYmVsUHJvdmlkZXIoKSwKLQkJCUpwYUhlbHBDb250ZXh0SWRzLlBFUlNJU1RFTkNFX1hNTF9HRU5FUkFMCi0JCSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJcGFyZW50ID0gc3VwZXIuYWRkQ29udGFpbmVyKHBhcmVudCk7Ci0JCQkJdXBkYXRlR3JpZERhdGEocGFyZW50KTsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTGF5b3V0KENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCQlzdXBlci5pbml0aWFsaXplTGF5b3V0KGNvbnRhaW5lcik7Ci0JCQkJdXBkYXRlR3JpZERhdGEoZ2V0Q29udGFpbmVyKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlR3JpZERhdGEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgICA9IHRydWU7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgICAgICAgPSBTV1QuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgICAgICAgICA9IFNXVC5GSUxMOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkSmFyRmlsZVJlZigpOwotCQkJfQotCQkJCi0JCQlwdWJsaWMgdm9pZCByZW1vdmVTZWxlY3RlZEl0ZW1zKE9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbCBsaXN0U2VsZWN0aW9uTW9kZWwpIHsKLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogbGlzdFNlbGVjdGlvbk1vZGVsLnNlbGVjdGVkVmFsdWVzKCkpIHsKLQkJCQkJZ2V0U3ViamVjdCgpLnJlbW92ZUphckZpbGVSZWYoKEphckZpbGVSZWYpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKYXJGaWxlUmVmPiBidWlsZEl0ZW1MaXN0SG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IEl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjxKYXJGaWxlUmVmPigKLQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJSmFyRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFkKLQkJKTsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxKYXJGaWxlUmVmPiBidWlsZExpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBKYXJGaWxlUmVmPihnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5KQVJfRklMRV9SRUZTX0xJU1QpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxKYXJGaWxlUmVmPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKYXJGaWxlUmVmcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRKYXJGaWxlUmVmc1NpemUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxKYXJGaWxlUmVmPiBidWlsZFNlbGVjdGVkSXRlbUhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SmFyRmlsZVJlZj4oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBidWlsZExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSkFSX0ZJTEVfUkVGKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlKYXJGaWxlUmVmIGphckZpbGVSZWYgPSAoSmFyRmlsZVJlZikgZWxlbWVudDsKLQkJCQlTdHJpbmcgbmFtZSA9IGphckZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKLQkJCQkKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0SmFyRmlsZXNDb21wb3NpdGVfbm9GaWxlTmFtZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgdm9pZCBhZGRKYXJGaWxlUmVmKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0KLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nID0gbmV3IEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nKAotCQkJZ2V0U2hlbGwoKSwgYnVpbGRKYXJGaWxlRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yKCkpOwotCQkKLQkJZGlhbG9nLnNldEhlbHBBdmFpbGFibGUoZmFsc2UpOwotCQlkaWFsb2cuc2V0VGl0bGUoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9qYXJGaWxlRGlhbG9nX21lc3NhZ2UpOwotCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7Ci0KLQotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsJCQotCQkJZm9yIChPYmplY3QgcmVzdWx0IDogZGlhbG9nLmdldFJlc3VsdCgpKSB7Ci0JCQkJU3RyaW5nIGZpbGVQYXRoID0gKFN0cmluZykgcmVzdWx0OwotCQkJCWlmIChqYXJGaWxlUmVmRXhpc3RzKGZpbGVQYXRoKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJSmFyRmlsZVJlZiBqYXJGaWxlUmVmID0gZ2V0U3ViamVjdCgpLmFkZEphckZpbGVSZWYoZmlsZVBhdGgpOwotCi0JCQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUoamFyRmlsZVJlZik7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIEFyY2hpdmVGaWxlU2VsZWN0aW9uRGlhbG9nLkRlcGxveW1lbnRQYXRoQ2FsY3VsYXRvciBidWlsZEphckZpbGVEZXBsb3ltZW50UGF0aENhbGN1bGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgQXJjaGl2ZUZpbGVTZWxlY3Rpb25EaWFsb2cuTW9kdWxlRGVwbG95bWVudFBhdGhDYWxjdWxhdG9yKCk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBqYXJGaWxlUmVmRXhpc3RzKFN0cmluZyBmaWxlTmFtZSkgewotCQlmb3IgKEphckZpbGVSZWYgZWFjaCA6IGdldFN1YmplY3QoKS5nZXRKYXJGaWxlUmVmcygpKSB7Ci0JCQlpZiAoZWFjaC5nZXRGaWxlTmFtZSgpLmVxdWFscyhmaWxlTmFtZSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWE0NjcwLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRNYXBwaW5nRmlsZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5BZGRSZW1vdmVMaXN0UGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuQWRkUmVtb3ZlUGFuZS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5QYW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLnN3aW5nLk9iamVjdExpc3RTZWxlY3Rpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuamZhY2UuWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5KcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5Xb3JrYmVuY2hMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLm5hdmlnYXRvci5SZXNvdXJjZUNvbXBhcmF0b3I7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZQotCQlleHRlbmRzIFBhbmU8UGVyc2lzdGVuY2VVbml0PiB7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBzZWxlY3RlZEl0ZW1Ib2xkZXI7CQotCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZSgKLQkJCVBhbmU8PyBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdD4gcGFyZW50UGFuZSwgQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJc3VwZXIocGFyZW50UGFuZSwgcGFyZW50KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXRoaXMuc2VsZWN0ZWRJdGVtSG9sZGVyID0gYnVpbGRTZWxlY3RlZEl0ZW1Ib2xkZXIoKTsKLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkTWFwcGluZ0ZpbGVzTGlzdChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0JCS8vIExpc3QgcGFuZQotCQluZXcgQWRkUmVtb3ZlTGlzdFBhbmU8UGVyc2lzdGVuY2VVbml0PigKLQkJCQl0aGlzLAotCQkJCWNvbnRhaW5lciwKLQkJCQlidWlsZEFkYXB0ZXIoKSwKLQkJCQlidWlsZEl0ZW1MaXN0SG9sZGVyKCksCi0JCQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQkJYnVpbGRMYWJlbFByb3ZpZGVyKCksCi0JCQkJSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX0dFTkVSQUwpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQkJcGFyZW50ID0gc3VwZXIuYWRkQ29udGFpbmVyKHBhcmVudCk7Ci0JCQkJdXBkYXRlR3JpZERhdGEocGFyZW50KTsKLQkJCQlyZXR1cm4gcGFyZW50OwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVMYXlvdXQoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCXN1cGVyLmluaXRpYWxpemVMYXlvdXQoY29udGFpbmVyKTsKLQkJCQl1cGRhdGVHcmlkRGF0YShnZXRDb250YWluZXIoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIFByb21wdHMgYSBkaWFsb2cgc2hvd2luZyBhIHRyZWUgc3RydWN0dXJlIG9mIHRoZSBzb3VyY2UgcGF0aHMgd2hlcmUgdGhlCi0JICogb25seSBmaWxlcyBzaG93biBhcmUgSlBBIG1hcHBpbmcgZGVzY3JpcHRvcnMgZmlsZS4gVGhlIFhNTCBmaWxlIGhhcyB0byBiZQotCSAqIGFuIFhNTCBmaWxlIHdpdGggdGhlIHJvb3QgdGFnOiB7QGNvZGUgPGVudGl0eS1tYXBwaW5ncz59LgotCSAqCi0JICogQHBhcmFtIGxpc3RTZWxlY3Rpb25Nb2RlbCBUaGUgc2VsZWN0aW9uIG1vZGVsIHVzZWQgdG8gc2VsZWN0IHRoZSBuZXcgZmlsZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSlBBTWFwcGluZ0Rlc2NyaXB0b3IoKSB7Ci0JCQotCQlFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZyBkaWFsb2cgPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coCi0JCQkJZ2V0U2hlbGwoKSwKLQkJCQluZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpLAotCQkJCW5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQotCQlkaWFsb2cuc2V0SGVscEF2YWlsYWJsZShmYWxzZSk7Ci0JCWRpYWxvZy5zZXRWYWxpZGF0b3IoYnVpbGRWYWxpZGF0b3IoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX21hcHBpbmdGaWxlRGlhbG9nX3RpdGxlKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdE1hcHBpbmdGaWxlc0NvbXBvc2l0ZV9tYXBwaW5nRmlsZURpYWxvZ19tZXNzYWdlKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIoZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKSkpOwotCQlkaWFsb2cuc2V0SW5wdXQoZ2V0U3ViamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlkaWFsb2cuc2V0Q29tcGFyYXRvcihuZXcgUmVzb3VyY2VDb21wYXJhdG9yKFJlc291cmNlQ29tcGFyYXRvci5OQU1FKSk7Ci0KLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCWZvciAoT2JqZWN0IHJlc3VsdCA6IGRpYWxvZy5nZXRSZXN1bHQoKSkgewotCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc3VsdDsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJSVBhdGggcnVudGltZVBhdGggPSBKcHRDb21tb25Db3JlUGx1Z2luLmdldFJlc291cmNlTG9jYXRvcihwcm9qZWN0KS5nZXRSdW50aW1lUGF0aChwcm9qZWN0LCBmaWxlLmdldEZ1bGxQYXRoKCkpOwotCQkJCVN0cmluZyBmaWxlTmFtZSA9IHJ1bnRpbWVQYXRoLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJCQlpZiAobWFwcGluZ0ZpbGVSZWZFeGlzdHMoZmlsZU5hbWUpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGdldFN1YmplY3QoKS5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZihmaWxlTmFtZSk7Ci0JCQkJdGhpcy5zZWxlY3RlZEl0ZW1Ib2xkZXIuc2V0VmFsdWUobWFwcGluZ0ZpbGVSZWYpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgQWRhcHRlciBidWlsZEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlTGlzdFBhbmUuQWJzdHJhY3RBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJYWRkSlBBTWFwcGluZ0Rlc2NyaXB0b3IoKTsKLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0ZWRJdGVtcyhPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0JCQkJZm9yIChPYmplY3QgaXRlbSA6IGxpc3RTZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFZhbHVlcygpKSB7Ci0JCQkJCWdldFN1YmplY3QoKS5yZW1vdmVTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigoTWFwcGluZ0ZpbGVSZWYpIGl0ZW0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBhZGRDb250YWluZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgxLCB0cnVlKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCAgPSAwOwotCQlsYXlvdXQubWFyZ2luVG9wICAgID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgICA9IDA7Ci0JCWxheW91dC5tYXJnaW5Cb3R0b20gPSAwOwotCQlsYXlvdXQubWFyZ2luUmlnaHQgID0gMDsKLQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gYWRkUGFuZShwYXJlbnQsIGxheW91dCk7Ci0JCXVwZGF0ZUdyaWREYXRhKGNvbnRhaW5lcik7Ci0KLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4gYnVpbGRJdGVtTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBJdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWY+KAotCQkJCWJ1aWxkTGlzdEhvbGRlcigpLAotCQkJCU1hcHBpbmdGaWxlUmVmLkZJTEVfTkFNRV9QUk9QRVJUWSk7Ci0JfQotCQotCXByaXZhdGUgSUxhYmVsUHJvdmlkZXIgYnVpbGRMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCXJldHVybiBKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLk1BUFBJTkdfRklMRV9SRUYpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkJCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gKE1hcHBpbmdGaWxlUmVmKSBlbGVtZW50OwotCQkJCVN0cmluZyBuYW1lID0gbWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKTsKLQkJCQkKLQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCW5hbWUgPSBKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0TWFwcGluZ0ZpbGVzQ29tcG9zaXRlX29ybU5vTmFtZTsKLQkJCQl9Ci0JCQkJCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGJ1aWxkTGlzdEhvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIE1hcHBpbmdGaWxlUmVmPigKLQkJCQlnZXRTdWJqZWN0SG9sZGVyKCksIFBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRlNfTElTVCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWY+IGJ1aWxkU2VsZWN0ZWRJdGVtSG9sZGVyKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4oKTsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIG1hcHBpbmdGaWxlUmVmRXhpc3RzKFN0cmluZyBmaWxlTmFtZSkgewotCQlmb3IgKE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmIDogZ2V0U3ViamVjdCgpLmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSB7Ci0JCQlpZiggbWFwcGluZ0ZpbGVSZWYuZ2V0RmlsZU5hbWUoKS5lcXVhbHMoZmlsZU5hbWUpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIElTZWxlY3Rpb25TdGF0dXNWYWxpZGF0b3IgYnVpbGRWYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCi0JCQkJaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMCkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCQl9Ci0KLQkJCQlmb3IgKE9iamVjdCBpdGVtIDogc2VsZWN0aW9uKSB7Ci0JCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lELCAiIik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsICIiKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUdyaWREYXRhKENvbXBvc2l0ZSBjb250YWluZXIpIHsKLQkJCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSAgID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCAgICAgICA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS52ZXJ0aWNhbEFsaWdubWVudCAgICAgICAgID0gU1dULkZJTEw7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NTRlMGUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzaXN0ZW5jZS5kZXRhaWxzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGV4dENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuc3d0LkNvbHVtbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC53aWRnZXRzLkFkZFJlbW92ZVRhYmxlUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUGFuZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5zd2luZy5PYmplY3RMaXN0U2VsZWN0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuZGV0YWlscy5qYXZhLkJhc2VKYXZhVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGVyc2lzdGVuY2UuSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci0KLS8qKgotICogSGVyZSB0aGUgbGF5b3V0IG9mIHRoaXMgcGFuZToKLSAqIDxwcmU+Ci0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogfCAtIFByb3BlcnRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwKLSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gKiB8ICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAqIHwgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8Ci0gKiB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAotICogfCAgIHwgQWRkUmVtb3ZlVGFibGVQYW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwKLSAqIHwgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8Ci0gKiB8ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3ByZT4KLSAqCi0gKiBAc2VlIFBlcnNpc3RlbmNlVW5pdAotICogQHNlZSBCYXNlSmF2YVVpRmFjdG9yeSAtIFRoZSBpbnZva2VyCi0gKiBAc2VlIEFkZFJlbW92ZVRhYmxlUGFuZQotICoKLSAqIEB2ZXJzaW9uIDIuMwotICogQHNpbmNlIDIuMAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlIGV4dGVuZHMgUGFuZTxQZXJzaXN0ZW5jZVVuaXQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIEpwYVBhZ2VDb21wb3NpdGUKLXsKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gcHJvcGVydHlIb2xkZXI7Ci0JcHJpdmF0ZSBUYWJsZVBhbmUgdGFibGVQYW5lOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlPC9jb2RlPi4KLQkgKgotCSAqIEBwYXJhbSBzdWJqZWN0SG9sZGVyIFRoZSBob2xkZXIgb2YgdGhpcyBwYW5lJ3Mgc3ViamVjdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB2YXJpb3VzIGNvbW1vbiB3aWRnZXRzCi0JICovCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGUoUHJvcGVydHlWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlciwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb3NpdGUgY29udGFpbmVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCi0JCXN1cGVyKHN1YmplY3RIb2xkZXIsIGNvbnRhaW5lciwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IGJ1aWxkUHJvcGVydGllc0xpc3RIb2xkZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+KGdldFN1YmplY3RIb2xkZXIoKSwgUGVyc2lzdGVuY2VVbml0LlBST1BFUlRJRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFByb3BlcnRpZXMoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFByb3BlcnRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBJVGFibGVMYWJlbFByb3ZpZGVyIGJ1aWxkUHJvcGVydHlMYWJlbFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlTGFiZWxQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgQWRkUmVtb3ZlVGFibGVQYW5lLkFkYXB0ZXIgYnVpbGRUYWJsZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBuZXcgQWRkUmVtb3ZlVGFibGVQYW5lLkFic3RyYWN0QWRhcHRlcigpIHsKLQotCQkJcHVibGljIHZvaWQgYWRkTmV3SXRlbShPYmplY3RMaXN0U2VsZWN0aW9uTW9kZWwgbGlzdFNlbGVjdGlvbk1vZGVsKSB7Ci0KLQkJCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSBnZXRTdWJqZWN0KCkuYWRkUHJvcGVydHkoKTsKLQkJCQlwcm9wZXJ0eUhvbGRlci5zZXRWYWx1ZShwcm9wZXJ0eSk7Ci0KLQkJCQl0YWJsZVBhbmUuZ2V0VGFibGVWaWV3ZXIoKS5lZGl0RWxlbWVudCgKLQkJCQkJcHJvcGVydHksCi0JCQkJCVByb3BlcnR5Q29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTgotCQkJCSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGVkSXRlbXMoT2JqZWN0TGlzdFNlbGVjdGlvbk1vZGVsIGxpc3RTZWxlY3Rpb25Nb2RlbCkgewotCQkJCWZvciAoT2JqZWN0IGl0ZW0gOiBsaXN0U2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRWYWx1ZXMoKSkgewotCQkJCQlnZXRTdWJqZWN0KCkucmVtb3ZlUHJvcGVydHkoKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSkgaXRlbSk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGVscElEKCkgewotCQlyZXR1cm4gSnBhSGVscENvbnRleHRJZHMuUEVSU0lTVEVOQ0VfWE1MX1BST1BFUlRJRVM7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhZ2VUZXh0KCkgewotCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfcHJvcGVydGllczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0JCXByb3BlcnR5SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUxheW91dChDb21wb3NpdGUgY29udGFpbmVyKSB7Ci0KLQkJYWRkTGFiZWwoCi0JCQljb250YWluZXIsCi0JCQlKcHRVaVBlcnNpc3RlbmNlTWVzc2FnZXMuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZV9wcm9wZXJ0aWVzX2Rlc2NyaXB0aW9uCi0JCSk7Ci0KLQkJdGFibGVQYW5lID0gbmV3IFRhYmxlUGFuZShjb250YWluZXIpOwotCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvcGVydHlDb2x1bW5BZGFwdGVyIGltcGxlbWVudHMgQ29sdW1uQWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHsKLQotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ09VTlQgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTEVDVElPTl9DT0xVTU4gPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxVRV9DT0xVTU4gPSAyOwotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZE5hbWVIb2xkZXIoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHN1YmplY3QpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSwgU3RyaW5nPihQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuTkFNRV9QUk9QRVJUWSwgc3ViamVjdCkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldE5hbWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0TmFtZSh2YWx1ZSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFZhbHVlSG9sZGVyKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBzdWJqZWN0KSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHksIFN0cmluZz4oUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LlZBTFVFX1BST1BFUlRZLCBzdWJqZWN0KSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0VmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQkJCXN1YmplY3Quc2V0VmFsdWUodmFsdWUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlwdWJsaWMgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBjZWxsTW9kZWxzKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBzdWJqZWN0KSB7Ci0JCQlXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDw/PltdIGhvbGRlcnMgPSBuZXcgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bQ09MVU1OX0NPVU5UXTsKLQkJCWhvbGRlcnNbU0VMRUNUSU9OX0NPTFVNTl0gPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPE9iamVjdD4oKTsKLQkJCWhvbGRlcnNbTkFNRV9DT0xVTU5dICAgICAgPSBidWlsZE5hbWVIb2xkZXIoc3ViamVjdCk7Ci0JCQlob2xkZXJzW1ZBTFVFX0NPTFVNTl0gICAgID0gYnVpbGRWYWx1ZUhvbGRlcihzdWJqZWN0KTsKLQkJCXJldHVybiBob2xkZXJzOwotCQl9Ci0KLQkJcHVibGljIGludCBjb2x1bW5Db3VudCgpIHsKLQkJCXJldHVybiBDT0xVTU5fQ09VTlQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIFByb3BlcnR5Q29sdW1uQWRhcHRlci5OQU1FX0NPTFVNTjogewotCQkJCQlyZXR1cm4gSnB0VWlQZXJzaXN0ZW5jZU1lc3NhZ2VzLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXNDb21wb3NpdGVfbmFtZUNvbHVtbjsKLQkJCQl9Ci0KLQkJCQljYXNlIFByb3BlcnR5Q29sdW1uQWRhcHRlci5WQUxVRV9DT0xVTU46IHsKLQkJCQkJcmV0dXJuIEpwdFVpUGVyc2lzdGVuY2VNZXNzYWdlcy5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzQ29tcG9zaXRlX3ZhbHVlQ29sdW1uOwotCQkJCX0KLQotCQkJCWRlZmF1bHQ6IHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCi0JCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSAoUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5KSBlbGVtZW50OwotCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgUHJvcGVydHlDb2x1bW5BZGFwdGVyLk5BTUVfQ09MVU1OOiB7Ci0JCQkJCXZhbHVlID0gcHJvcGVydHkuZ2V0TmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQljYXNlIFByb3BlcnR5Q29sdW1uQWRhcHRlci5WQUxVRV9DT0xVTU46IHsKLQkJCQkJdmFsdWUgPSBwcm9wZXJ0eS5nZXRWYWx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdmFsdWUgPSAiIjsKLQkJCX0KLQotCQkJcmV0dXJuIHZhbHVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZVBhbmUgZXh0ZW5kcyBBZGRSZW1vdmVUYWJsZVBhbmU8UGVyc2lzdGVuY2VVbml0PiB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX0NPTFVNTiA9ICJzZWxlY3Rpb24iOwotCi0JCXByaXZhdGUgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0KLQkJcHJpdmF0ZSBUYWJsZVBhbmUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIoUGVyc2lzdGVuY2VVbml0UHJvcGVydGllc0NvbXBvc2l0ZS50aGlzLAotCQkJICAgICAgcGFyZW50LAotCQkJCQlidWlsZFRhYmxlQWRhcHRlcigpLAotCQkJCQlidWlsZFByb3BlcnRpZXNMaXN0SG9sZGVyKCksCi0JCQkJCXByb3BlcnR5SG9sZGVyLAotCQkJCQlidWlsZFByb3BlcnR5TGFiZWxQcm92aWRlcigpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGFkZENvbnRhaW5lcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29udGFpbmVyID0gc3VwZXIuYWRkQ29udGFpbmVyKHBhcmVudCk7Ci0JCQljb250YWluZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCQlyZXR1cm4gY29udGFpbmVyOwotCQl9Ci0KLQkJcHJpdmF0ZSBDZWxsRWRpdG9yW10gYnVpbGRDZWxsRWRpdG9ycyhUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIG5ldyBDZWxsRWRpdG9yW10gewotCQkJCW51bGwsCi0JCQkJbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKSwKLQkJCQluZXcgVGV4dENlbGxFZGl0b3IodGFibGUpCi0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGJ1aWxkQ2VsbE1vZGlmaWVyKCkgewotCQkJcmV0dXJuIG5ldyBJQ2VsbE1vZGlmaWVyKCkgewotCi0JCQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuICFTRUxFQ1RJT05fQ09MVU1OLmVxdWFscyhwcm9wZXJ0eSk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eU1vZGVsID0gKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSkgZWxlbWVudDsKLQkJCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCQkJCQlpZiAocHJvcGVydHkgPT0gUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5Lk5BTUVfUFJPUEVSVFkpIHsKLQkJCQkJCXZhbHVlID0gcHJvcGVydHlNb2RlbC5nZXROYW1lKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAocHJvcGVydHkgPT0gUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5LlZBTFVFX1BST1BFUlRZKSB7Ci0JCQkJCQl2YWx1ZSA9IHByb3BlcnR5TW9kZWwuZ2V0VmFsdWUoKTsKLQkJCQkJfQotCi0JCQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9ICIiOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5TW9kZWw7Ci0KLQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUYWJsZUl0ZW0pIHsKLQkJCQkJCVRhYmxlSXRlbSB0YWJsZUl0ZW0gPSAoVGFibGVJdGVtKSBlbGVtZW50OwotCQkJCQkJcHJvcGVydHlNb2RlbCA9IChQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkpIHRhYmxlSXRlbS5nZXREYXRhKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9wZXJ0eU1vZGVsID0gKFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSkgZWxlbWVudDsKLQkJCQkJfQotCi0JCQkJCWlmIChwcm9wZXJ0eSA9PSBQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuTkFNRV9QUk9QRVJUWSkgewotCQkJCQkJcHJvcGVydHlNb2RlbC5zZXROYW1lKHZhbHVlLnRvU3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHByb3BlcnR5ID09IFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSkgewotCQkJCQkJcHJvcGVydHlNb2RlbC5zZXRWYWx1ZSh2YWx1ZS50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbHVtbkFkYXB0ZXI8Pz4gYnVpbGRDb2x1bW5BZGFwdGVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNvbHVtbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gYnVpbGRDb2x1bW5Qcm9wZXJ0aWVzKCkgewotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXSB7Ci0JCQkJU0VMRUNUSU9OX0NPTFVNTiwKLQkJCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuTkFNRV9QUk9QRVJUWSwKLQkJCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkuVkFMVUVfUFJPUEVSVFkKLQkJCX07Ci0JCX0KLQotCQlUYWJsZVZpZXdlciBnZXRUYWJsZVZpZXdlcigpIHsKLQkJCXJldHVybiB0YWJsZVZpZXdlcjsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplTWFpbkNvbXBvc2l0ZShDb21wb3NpdGUgY29udGFpbmVyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyIGFkYXB0ZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RIb2xkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPD8+IHNlbGVjdGVkSXRlbUhvbGRlciwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUJhc2VMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBoZWxwSWQpIHsKLQotCQkJc3VwZXIuaW5pdGlhbGl6ZU1haW5Db21wb3NpdGUoCi0JCQkJY29udGFpbmVyLAotCQkJCWFkYXB0ZXIsCi0JCQkJbGlzdEhvbGRlciwKLQkJCQlzZWxlY3RlZEl0ZW1Ib2xkZXIsCi0JCQkJbGFiZWxQcm92aWRlciwKLQkJCQloZWxwSWQKLQkJCSk7Ci0KLQkJCVRhYmxlIHRhYmxlID0gZ2V0TWFpbkNvbnRyb2woKTsKLQkJCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQkvLyBNYWtlIHRoZSBzZWxlY3Rpb24gY29sdW1uIG5vbi1yZXNpemFibGUgc2luY2UgaXQncyBvbmx5IHVzZWQgdG8KLQkJCS8vIGVhc2UgdGhlIHNlbGVjdGlvbiBvZiByb3dzCi0JCQlUYWJsZUNvbHVtbiBzZWxlY3Rpb25Db2x1bW4gPSB0YWJsZS5nZXRDb2x1bW4oUHJvcGVydHlDb2x1bW5BZGFwdGVyLlNFTEVDVElPTl9DT0xVTU4pOwotCQkJc2VsZWN0aW9uQ29sdW1uLnNldFJlc2l6YWJsZShmYWxzZSk7Ci0JCQlzZWxlY3Rpb25Db2x1bW4uc2V0V2lkdGgoMjApOwotCi0JCQkvLyBJbnN0YWxsIHRoZSBlZGl0b3JzCi0JCQl0YWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhidWlsZENlbGxFZGl0b3JzKHRhYmxlKSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRDZWxsTW9kaWZpZXIoYnVpbGRDZWxsTW9kaWZpZXIoKSk7Ci0JCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGJ1aWxkQ29sdW1uUHJvcGVydGllcygpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQlzdXBlci5pdGVtc0FkZGVkKGUpOwotCQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGl0ZW1zUmVtb3ZlZChMaXN0UmVtb3ZlRXZlbnQgZSkgewotCQkJc3VwZXIuaXRlbXNSZW1vdmVkKGUpOwotCQkJcmV2YWxpZGF0ZUxheW91dCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQlzdXBlci5saXN0Q2hhbmdlZChlKTsKLQkJCXJldmFsaWRhdGVMYXlvdXQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBSZXZhbGlkYXRlcyB0aGUgdGFibGUgbGF5b3V0IGFmdGVyIHRoZSBsaXN0IG9mIGl0ZW1zIGhhcyBjaGFuZ2VkLiBUaGUKLQkJICogbGF5b3V0IGhhcyB0byBiZSBkb25lIGluIGEgbmV3IFVJIHRocmVhZCBiZWNhdXNlIG91ciBsaXN0ZW5lciBtaWdodCBiZQotCQkgKiBub3RpZmllZCBiZWZvcmUgdGhlIHRhYmxlIGhhcyBiZWVuIHVwZGF0ZWQgKHRhYmxlIGNvbHVtbiBhZGRlZCBvciByZW1vdmVkKS4KLQkJICovCi0JCXByaXZhdGUgdm9pZCByZXZhbGlkYXRlTGF5b3V0KCkgewotCQkJU1dUVXRpbC5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgeyBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJVGFibGUgdGFibGUgPSBnZXRNYWluQ29udHJvbCgpOwotCQkJCWlmICghdGFibGUuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCS8vIFdlIGhhdmUgdG8gZG8gYSB0b3RhbCByZWxheW91dCBvZiB0aGUgdGFiIG90aGVyd2lzZSB0aGUKLQkJCQkJLy8gdGFibGUgbWlnaHQgYmVjb21lIGN1dCBvZmYgYXQgdGhlIGJvdHRvbQotCQkJCQlTV1RVdGlsLnJlZmxvdyh0YWJsZSk7Ci0JCQkJfQotCQkJfX0pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc2lzdGVuY2UvZGV0YWlscy9QZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMmQwNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zdHJ1Y3R1cmUuUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbiBleHRlbmRzIEFic3RyYWN0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZVVpRGVmaW5pdGlvbgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlc291cmNlVWlEZWZpbml0aW9uIElOU1RBTkNFID0gbmV3IFBlcnNpc3RlbmNlWG1sVWlEZWZpbml0aW9uKCk7Ci0JCi0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlVWlEZWZpbml0aW9uIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCQotCQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBQZXJzaXN0ZW5jZVhtbFVpRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlWG1sVWlGYWN0b3J5IGJ1aWxkUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHByb3ZpZGVzVWkoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gcmVzb3VyY2VUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRSk7Ci0JfQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzaXN0ZW5jZS9kZXRhaWxzL1BlcnNpc3RlbmNlWG1sVWlGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY1NDZjZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BlcnNpc3RlbmNlL2RldGFpbHMvUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBlcnNpc3RlbmNlLmRldGFpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhUGFnZUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgUGVyc2lzdGVuY2VYbWxVaUZhY3RvcnkKLXsKLQkvLyAqKioqKioqKioqKioqKioqIHBlcnNpc3RlbmNlIHVuaXQgY29tcG9zaXRlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbGlzdCBvZiA8Y29kZT5KcGFDb21wb3NpdGU8L2NvZGU+cyB1c2VkIHRvIGVkaXQgYQotCSAqIDxjb2RlPlBlcnNpc3RlbmNlVW5pdDwvY29kZT4uIFRoZSBwcm9wZXJ0aWVzIGNhbiBiZSByZWdyb3VwZWQgaW50bwotCSAqIHNlY3Rpb25zIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZWRpdG9yIGFzIHBhZ2VzLgotCSAqCi0JICogQHBhcmFtIHN1YmplY3RIb2xkZXIgVGhlIGhvbGRlciBvZiB0aGUgcGVydGlzdGVuY2UgdW5pdAotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBjb250YWluZXIKLQkgKiBAcGFyYW0gd2lkZ2V0RmFjdG9yeSBUaGUgZmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0cwotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+SnBhQ29tcG9zaXRlPC9jb2RlPgotCSAqLwotCUxpc3RJdGVyYXRvcjxKcGFQYWdlQ29tcG9zaXRlPiBjcmVhdGVQZXJzaXN0ZW5jZVVuaXRDb21wb3NpdGVzKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KcGFQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGVyc3BlY3RpdmUvSnBhUGVyc3BlY3RpdmVGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDIyMDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wZXJzcGVjdGl2ZS9KcGFQZXJzcGVjdGl2ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovICAgICAgICAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wZXJzcGVjdGl2ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZvbGRlckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc3BlY3RpdmVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5yZXNvdXJjZXMuUHJvamVjdEV4cGxvcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLklQcm9ncmVzc0NvbnN0YW50czsKLQotcHVibGljIGNsYXNzIEpwYVBlcnNwZWN0aXZlRmFjdG9yeSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHVibGljIHZvaWQgY3JlYXRlSW5pdGlhbExheW91dChJUGFnZUxheW91dCBsYXlvdXQpIHsKLQkJU3RyaW5nIGVkaXRvckFyZWEgPSBsYXlvdXQuZ2V0RWRpdG9yQXJlYSgpOwotCi0JCS8vUGFja2FnZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgZm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkibGVmdCIsIElQYWdlTGF5b3V0LkxFRlQsIChmbG9hdCkgMC4yNSwgZWRpdG9yQXJlYSk7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGVyLmFkZFZpZXcoUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOwotCQlmb2xkZXIuYWRkUGxhY2Vob2xkZXIoSmF2YVVJLklEX1RZUEVfSElFUkFSQ0hZKTsKLQkJZm9sZGVyLmFkZFBsYWNlaG9sZGVyKElQYWdlTGF5b3V0LklEX1JFU19OQVYpOwotCi0JCS8vRGF0YWJhc2UgRXhwbG9yZXIgYXJlYQotCQlsYXlvdXQuYWRkVmlldygib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5EYXRhU291cmNlRXhwbG9yZXJOYXZpZ2F0b3IiLCAvLyROT04tTkxTLTEkCi0JCQlJUGFnZUxheW91dC5CT1RUT00sIChmbG9hdCkgMC42MCwgUHJvamVjdEV4cGxvcmVyLlZJRVdfSUQpOwotCi0JCS8vUHJvYmxlbXMvQ29uc29sZSBhcmVhCi0JCUlGb2xkZXJMYXlvdXQgb3V0cHV0Rm9sZGVyID0gbGF5b3V0LmNyZWF0ZUZvbGRlcigKLQkJCQkiYm90dG9tIiwgSVBhZ2VMYXlvdXQuQk9UVE9NLCAoZmxvYXQpIDAuNjAsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCW91dHB1dEZvbGRlci5hZGRWaWV3KElQYWdlTGF5b3V0LklEX1BST0JMRU1fVklFVyk7Ci0JCW91dHB1dEZvbGRlci5hZGRQbGFjZWhvbGRlcihJUGFnZUxheW91dC5JRF9CT09LTUFSS1MpOwotCQlvdXRwdXRGb2xkZXIuYWRkUGxhY2Vob2xkZXIoSVByb2dyZXNzQ29uc3RhbnRzLlBST0dSRVNTX1ZJRVdfSUQpOwotCi0JCS8vSlBBIERldGFpbHMgKFNwbGl0IHdpdGggUHJvYmxlbXMvQ29uc29sZSBhcmVhKQotCQlsYXlvdXQuYWRkVmlldygib3JnLmVjbGlwc2UuanB0LnVpLmpwYURldGFpbHNWaWV3IiwgLy8kTk9OLU5MUy0xJAotCQkJCUlQYWdlTGF5b3V0LlJJR0hULCAoZmxvYXQpIC42MCwgImJvdHRvbSIpOyAvLyROT04tTkxTLTEkCi0JCQotCQkvL0pQQSBTdHJ1Y3R1cmUgYXJlYQotCQlJRm9sZGVyTGF5b3V0IG91dGxpbmVGb2xkZXIgPSBsYXlvdXQuY3JlYXRlRm9sZGVyKAotCQkJCSJyaWdodCIsIElQYWdlTGF5b3V0LlJJR0hULCAoZmxvYXQpIDAuNzUsIGVkaXRvckFyZWEpOyAvLyROT04tTkxTLTEkCi0JCW91dGxpbmVGb2xkZXIuYWRkVmlldygib3JnLmVjbGlwc2UuanB0LnVpLmpwYVN0cnVjdHVyZVZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQlvdXRsaW5lRm9sZGVyLmFkZFZpZXcoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpUmVnaXN0cnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjE3YWYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ29tcG9zaXRlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5UcmFuc2Zvcm1hdGlvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkgCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5IElOU1RBTkNFID0gbmV3IEpwYVBsYXRmb3JtVWlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX0lEID0gCi0JCSJqcGFQbGF0Zm9ybVVpcyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfUExBVEZPUk1fVUkgPQotCQkianBhUGxhdGZvcm1VaSI7IC8vJE5PTi1OTFMtMSQJCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRfSUQgPQotCQkiaWQiOyAvLyROT04tTkxTLTEkCQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVF9KUEFfUExBVEZPUk0gPQotCQkianBhUGxhdGZvcm0iOyAvLyROT04tTkxTLTEkCQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUX0ZBQ1RPUllfQ0xBU1MgPQotCQkiZmFjdG9yeUNsYXNzIjsgLy8kTk9OLU5MUy0xJAkKLQkJCi0JLy8ga2V5OiBTdHJpbmcgaWQgIHZhbHVlOiBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2xhc3MgZGVzY3JpcHRvcgotCXByaXZhdGUgTWFwPFN0cmluZywgSUNvbmZpZ3VyYXRpb25FbGVtZW50PiBqcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHM7Ci0JCi0JLy9jYWNoZSB0aGUganBhUGxhdGZvcm1VaXMgd2hlbiB0aGV5IGFyZSBidWlsdAotCS8va2V5OiBqcGEgcGxhdGZvcm0gaWQgIHZhbHVlOiBKcGFQbGFmb3JtVWkKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtVWk+IGpwYVBsYXRmb3JtVWlzOwotCQotCS8qIChub24gSmF2YSBkb2MpCi0JICogcmVzdHJpY3QgYWNjZXNzCi0JICovCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybVVpUmVnaXN0cnkoKSB7Ci0JCWJ1aWxkSnBhUGxhdGZvcm1VaUNvbmZpZ0VsZW1lbnRzKCk7Ci0JCXRoaXMuanBhUGxhdGZvcm1VaXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEpwYVBsYXRmb3JtVWk+KCk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBidWlsZEpwYVBsYXRmb3JtVWlDb25maWdFbGVtZW50cygpIHsKLQkJdGhpcy5qcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIElDb25maWd1cmF0aW9uRWxlbWVudD4oKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PiBzdHJlYW0gPSBhbGxDb25maWdFbGVtZW50cygpOyBzdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWJ1aWxkSnBhUGxhdGZvcm1VaShzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYnVpbGRKcGFQbGF0Zm9ybVVpKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCWlmICghIGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhFTF9QTEFURk9STV9VSSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJU3RyaW5nIHBsYXRmb3JtVWlJZCA9IGNvbmZpZ0VsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0lEKTsKLQkJU3RyaW5nIHBsYXRmb3JtID0gY29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRfSlBBX1BMQVRGT1JNKTsKLQkJU3RyaW5nIHBsYXRmb3JtVWlGYWN0b3J5Q2xhc3MgPSBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9GQUNUT1JZX0NMQVNTKTsKLQkJCi0JCWlmICgocGxhdGZvcm1VaUlkID09IG51bGwpIHx8IChwbGF0Zm9ybVVpRmFjdG9yeUNsYXNzID09IG51bGwpKSB7Ci0JCQlpZiAocGxhdGZvcm1VaUlkID09IG51bGwpIHsKLQkJCQlyZXBvcnRNaXNzaW5nQXR0cmlidXRlKGNvbmZpZ0VsZW1lbnQsIEFUX0lEKTsKLQkJCX0KLQkJCWlmIChwbGF0Zm9ybSA9PSBudWxsKSB7Ci0JCQkJcmVwb3J0TWlzc2luZ0F0dHJpYnV0ZShjb25maWdFbGVtZW50LCBBVF9KUEFfUExBVEZPUk0pOwotCQkJfQotCQkJaWYgKHBsYXRmb3JtVWlGYWN0b3J5Q2xhc3MgPT0gbnVsbCkgewotCQkJCXJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoY29uZmlnRWxlbWVudCwgQVRfRkFDVE9SWV9DTEFTUyk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmICh0aGlzLmpwYVBsYXRmb3JtVWlDb25maWdFbGVtZW50cy5jb250YWluc0tleShwbGF0Zm9ybVVpSWQpKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb3RoZXJDb25maWdFbGVtZW50ID0gdGhpcy5qcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMuZ2V0KHBsYXRmb3JtKTsKLQkJCXJlcG9ydER1cGxpY2F0ZVBsYXRmb3JtVWkoY29uZmlnRWxlbWVudCwgb3RoZXJDb25maWdFbGVtZW50KTsKLQkJfQotCQkKLQkJdGhpcy5qcGFQbGF0Zm9ybVVpQ29uZmlnRWxlbWVudHMucHV0KHBsYXRmb3JtVWlJZCwgY29uZmlnRWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoU3RyaW5nIHBsYXRmb3JtSWQpIHsKLQkJaWYgKHRoaXMuanBhUGxhdGZvcm1VaXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKLQkJCXJldHVybiB0aGlzLmpwYVBsYXRmb3JtVWlzLmdldChwbGF0Zm9ybUlkKTsKLQkJfQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSBudWxsOwotCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCA6IHRoaXMuanBhUGxhdGZvcm1VaUNvbmZpZ0VsZW1lbnRzLnZhbHVlcygpKSB7Ci0JCQlpZiAoY29uZmlndXJhdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUX0pQQV9QTEFURk9STSkuZXF1YWxzKHBsYXRmb3JtSWQpKSB7Ci0JCQkJcmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQkKLQkJaWYgKHJlZ2lzdGVyZWRDb25maWdFbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUpwYVBsYXRmb3JtVWlGYWN0b3J5IGpwYVBsYXRmb3JtVWlGYWN0b3J5OwotCQl0cnkgewotCQkJanBhUGxhdGZvcm1VaUZhY3RvcnkgPSAoSnBhUGxhdGZvcm1VaUZhY3RvcnkpIHJlZ2lzdGVyZWRDb25maWdFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRfRkFDVE9SWV9DTEFTUyk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCXJlcG9ydEZhaWxlZEluc3RhbnRpYXRpb24ocmVnaXN0ZXJlZENvbmZpZ0VsZW1lbnQpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihwbGF0Zm9ybUlkKTsKLQkJfQotCQlKcGFQbGF0Zm9ybVVpIHBsYXRmb3JtVWkgPSBqcGFQbGF0Zm9ybVVpRmFjdG9yeS5idWlsZEpwYVBsYXRmb3JtVWkoKTsKLQkJdGhpcy5qcGFQbGF0Zm9ybVVpcy5wdXQocGxhdGZvcm1JZCwgcGxhdGZvcm1VaSk7Ci0JCXJldHVybiBwbGF0Zm9ybVVpOwotCX0KLQkKLQlwcml2YXRlIEl0ZXJhdG9yPElDb25maWd1cmF0aW9uRWxlbWVudD4gYWxsQ29uZmlnRWxlbWVudHMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IAotCQkJcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lELCBFWFRFTlNJT05fSUQpOwotCQlJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucyA9IGV4dGVuc2lvblBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCi0JCXJldHVybiBuZXcgQ29tcG9zaXRlSXRlcmF0b3I8SUNvbmZpZ3VyYXRpb25FbGVtZW50PigKLQkJCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYXRvcjxJRXh0ZW5zaW9uLCBJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+PihDb2xsZWN0aW9uVG9vbHMuaXRlcmF0b3IoZXh0ZW5zaW9ucykpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYXRvcjxJQ29uZmlndXJhdGlvbkVsZW1lbnQ+IHRyYW5zZm9ybShJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQkJCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYXRvcihleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQl9Ci0JCi0JLy8gVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydE1pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ0VsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gCi0JCQkiQW4gZXh0ZW5zaW9uIGVsZW1lbnQgXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0TmFtZSgpCi0JCQkrICJcIiBpbiBwbHVnaW4gXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiIGlzIG1pc3NpbmcgYSByZXF1aXJlZCBhdHRyaWJ1dGUgXCIiCi0JCQkrIGF0dHJpYnV0ZU5hbWUKLQkJCSsgIlwiLiI7Ci0JCUpwdEpwYVVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci0JCi0JLy8gVE9ETyBleHRlcm5hbGl6ZSBzdHJpbmdzCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydER1cGxpY2F0ZVBsYXRmb3JtVWkoCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgb25lQ29uZmlnRWxlbWVudCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IG90aGVyQ29uZmlnRWxlbWVudCkgewotCQlTdHJpbmcgbWVzc2FnZSA9Ci0JCQkiVGhlIHBsdWdpbnMgXCIiCi0JCQkrIG9uZUNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiIGFuZCBcIiIKLQkJCSsgb3RoZXJDb25maWdFbGVtZW50LmdldENvbnRyaWJ1dG9yKCkuZ2V0TmFtZSgpCi0JCQkrICJcIiBoYXZlIHJlZ2lzdGVyZWQgYSBkdXBsaWNhdGUgYXR0cmlidXRlIFwiaWRcIiAiCi0JCQkrICJmb3IgdGhlIGV4dGVuc2lvbiBlbGVtZW50IFwianBhUGxhdGZvcm1VaVwiLiI7Ci0JCUpwdEpwYVVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci0JCQotCS8vIFRPRE8gZXh0ZXJuYWxpemUgc3RyaW5ncwotCXByaXZhdGUgdm9pZCByZXBvcnRGYWlsZWRJbnN0YW50aWF0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50KSB7Ci0JCVN0cmluZyBtZXNzYWdlID0KLQkJCSJDb3VsZCBub3QgaW5zdGFudGlhdGUgdGhlIGNsYXNzIFwiIgotCQkJKyBjb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZShBVF9GQUNUT1JZX0NMQVNTKQotCQkJKyAiXCIgZm9yIHRoZSBleHRlbnNpb24gZWxlbWVudCBcIiIKLQkJCSsgY29uZmlnRWxlbWVudC5nZXROYW1lKCkKLQkJCSsgIlwiIGluIHRoZSBwbHVnaW4gXCIiCi0JCQkrIGNvbmZpZ0VsZW1lbnQuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkKLQkJCSsgIlwiLiI7Ci0JCUpwdEpwYVVpUGx1Z2luLmxvZyhtZXNzYWdlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2Jhc2UvQmFzZUpwYVBsYXRmb3JtVWkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9CYXNlSnBhUGxhdGZvcm1VaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDExMzVlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9CYXNlSnBhUGxhdGZvcm1VaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmJhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5NYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5SZXNvdXJjZVVpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYUNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLkpwYURldGFpbHNQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuTWFwcGluZ1VpRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm5hdmlnYXRvci5KcGFOYXZpZ2F0b3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VKcGFQbGF0Zm9ybVVpCi0JaW1wbGVtZW50cyBKcGFQbGF0Zm9ybVVpCi17Ci0JcHJpdmF0ZSBmaW5hbCBKcGFOYXZpZ2F0b3JQcm92aWRlciBuYXZpZ2F0b3JQcm92aWRlcjsKLQkKLQlwcml2YXRlIGZpbmFsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBwbGF0Zm9ybVVpUHJvdmlkZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIEJhc2VKcGFQbGF0Zm9ybVVpKAotCQkJSnBhTmF2aWdhdG9yUHJvdmlkZXIgbmF2aWdhdG9yUHJvdmlkZXIsIEpwYVBsYXRmb3JtVWlQcm92aWRlciBwbGF0Zm9ybVVpUHJvdmlkZXIpIHsKLQkJCi0JCXN1cGVyKCk7Ci0JCXRoaXMubmF2aWdhdG9yUHJvdmlkZXIgPSBuYXZpZ2F0b3JQcm92aWRlcjsKLQkJdGhpcy5wbGF0Zm9ybVVpUHJvdmlkZXIgPSBwbGF0Zm9ybVVpUHJvdmlkZXI7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogbmF2aWdhdG9yIHByb3ZpZGVyICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhTmF2aWdhdG9yUHJvdmlkZXIgZ2V0TmF2aWdhdG9yUHJvdmlkZXIoKSB7Ci0JCXJldHVybiB0aGlzLm5hdmlnYXRvclByb3ZpZGVyOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHN0cnVjdHVyZSBwcm92aWRlcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcihKcGFGaWxlIGpwYUZpbGUpIHsKLQkJSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldFJlc291cmNlVHlwZSgpOwotCQlyZXR1cm4gKHJlc291cmNlVHlwZSA9PSBudWxsKSA/IG51bGwgOiB0aGlzLmdldFN0cnVjdHVyZVByb3ZpZGVyKHJlc291cmNlVHlwZSk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcihKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCVJlc291cmNlVWlEZWZpbml0aW9uIGRlZmluaXRpb247Ci0JCXRyeSB7Ci0JCQlkZWZpbml0aW9uID0gZ2V0UmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgewotCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gZGVmaW5pdGlvbi5nZXRTdHJ1Y3R1cmVQcm92aWRlcigpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIGRldGFpbHMgcHJvdmlkZXJzICoqKioqKioqKioKLQkKLQlwdWJsaWMgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkSnBhRGV0YWlsc1BhZ2UoCi0JCQlDb21wb3NpdGUgcGFyZW50LCBKcGFTdHJ1Y3R1cmVOb2RlIHN0cnVjdHVyZU5vZGUsIFdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJSnBhRGV0YWlsc1Byb3ZpZGVyIGpwYURldGFpbHNQcm92aWRlciA9IGdldERldGFpbHNQcm92aWRlcihzdHJ1Y3R1cmVOb2RlKTsKLQkJcmV0dXJuIGpwYURldGFpbHNQcm92aWRlciA9PSBudWxsID8gbnVsbCA6IGpwYURldGFpbHNQcm92aWRlci5idWlsZERldGFpbHNQYWdlKHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXByb3RlY3RlZCBKcGFEZXRhaWxzUHJvdmlkZXIgZ2V0RGV0YWlsc1Byb3ZpZGVyKEpwYVN0cnVjdHVyZU5vZGUgc3RydWN0dXJlTm9kZSkgewotCQlmb3IgKEpwYURldGFpbHNQcm92aWRlciBwcm92aWRlciA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLmRldGFpbHNQcm92aWRlcnMoKSkpIHsKLQkJCWlmIChwcm92aWRlci5wcm92aWRlc0RldGFpbHMoc3RydWN0dXJlTm9kZSkpIHsKLQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ly9yZXR1cm4gbnVsbCwgc29tZSBzdHJ1Y3R1cmUgbm9kZXMgZG8gbm90IGhhdmUgYSBkZXRhaWxzIHBhZ2UKLQl9Ci0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxKcGFEZXRhaWxzUHJvdmlkZXI+IGRldGFpbHNQcm92aWRlcnMoKSB7Ci0JCXJldHVybiB0aGlzLnBsYXRmb3JtVWlQcm92aWRlci5kZXRhaWxzUHJvdmlkZXJzKCk7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogbWFwcGluZyB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JcHVibGljIEpwYUNvbXBvc2l0ZSBidWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgCi0JCQlTdHJpbmcgbWFwcGluZ0tleSwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxUeXBlTWFwcGluZz4gbWFwcGluZ0hvbGRlciwgCi0JCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpIHsKLQkJCi0JCXJldHVybiBnZXRNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKS5idWlsZFR5cGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJCW1hcHBpbmdLZXksIG1hcHBpbmdIb2xkZXIsIHBhcmVudCwgd2lkZ2V0RmFjdG9yeSk7Ci0JfQotCQotCXB1YmxpYyBKcGFDb21wb3NpdGUgYnVpbGRBdHRyaWJ1dGVNYXBwaW5nQ29tcG9zaXRlKAotCQkJSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgCi0JCQlTdHJpbmcgbWFwcGluZ0tleSwgCi0JCQlDb21wb3NpdGUgcGFyZW50LCAKLQkJCVByb3BlcnR5VmFsdWVNb2RlbDxBdHRyaWJ1dGVNYXBwaW5nPiBtYXBwaW5nSG9sZGVyLCAKLQkJCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSkgewotCQkKLQkJcmV0dXJuIGdldE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUpLmJ1aWxkQXR0cmlidXRlTWFwcGluZ0NvbXBvc2l0ZSgKLQkJCQltYXBwaW5nS2V5LCBtYXBwaW5nSG9sZGVyLCBwYXJlbnQsIHdpZGdldEZhY3RvcnkpOwotCX0KLQkKLQlwdWJsaWMgRGVmYXVsdE1hcHBpbmdVaURlZmluaXRpb248UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLCA/IGV4dGVuZHMgQXR0cmlidXRlTWFwcGluZz4gZ2V0RGVmYXVsdEF0dHJpYnV0ZU1hcHBpbmdVaURlZmluaXRpb24oSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSwgU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJcmV0dXJuIGdldE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbihyZXNvdXJjZVR5cGUpLmdldERlZmF1bHRBdHRyaWJ1dGVNYXBwaW5nVWlEZWZpbml0aW9uKG1hcHBpbmdLZXkpOwotCX0KLQkKLQlwdWJsaWMgSXRlcmF0b3I8TWFwcGluZ1VpRGVmaW5pdGlvbjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsID8gZXh0ZW5kcyBBdHRyaWJ1dGVNYXBwaW5nPj4gYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSkgewotCQlyZXR1cm4gZ2V0TWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKHJlc291cmNlVHlwZSkuYXR0cmlidXRlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JcHVibGljIERlZmF1bHRNYXBwaW5nVWlEZWZpbml0aW9uPFBlcnNpc3RlbnRUeXBlLCA/IGV4dGVuZHMgVHlwZU1hcHBpbmc+IGdldERlZmF1bHRUeXBlTWFwcGluZ1VpRGVmaW5pdGlvbihKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKS5nZXREZWZhdWx0VHlwZU1hcHBpbmdVaURlZmluaXRpb24oKTsKLQl9Ci0JCi0JcHVibGljIEl0ZXJhdG9yPE1hcHBpbmdVaURlZmluaXRpb248UGVyc2lzdGVudFR5cGUsID8gZXh0ZW5kcyBUeXBlTWFwcGluZz4+IHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyhKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCXJldHVybiBnZXRNYXBwaW5nUmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKS50eXBlTWFwcGluZ1VpRGVmaW5pdGlvbnMoKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiByZXNvdXJjZSB1aSBkZWZpbml0aW9ucyAqKioqKioqKioqCi0JCi0JcHJvdGVjdGVkIExpc3RJdGVyYXRvcjxSZXNvdXJjZVVpRGVmaW5pdGlvbj4gcmVzb3VyY2VVaURlZmluaXRpb25zKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVVpUHJvdmlkZXIucmVzb3VyY2VVaURlZmluaXRpb25zKCk7Ci0JfQotCQotCXB1YmxpYyBSZXNvdXJjZVVpRGVmaW5pdGlvbiBnZXRSZXNvdXJjZVVpRGVmaW5pdGlvbihKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCWZvciAoUmVzb3VyY2VVaURlZmluaXRpb24gZGVmaW5pdGlvbiA6IENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZSh0aGlzLnJlc291cmNlVWlEZWZpbml0aW9ucygpKSkgewotCQkJaWYgKGRlZmluaXRpb24ucHJvdmlkZXNVaShyZXNvdXJjZVR5cGUpKSB7Ci0JCQkJcmV0dXJuIGRlZmluaXRpb247Ci0JCQl9Ci0JCX0KLQkJLy8gVE9ETyAoYnVnIDMxMzYzMikgLSByZXR1cm4gYSBudWxsIHJlc291cmNlIHVpIGRlZmluaXRpb24/Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHJlc291cmNlIFVJIGRlZmluaXRpb24gZm9yIHRoZSByZXNvdXJjZSB0eXBlOiAiICsgcmVzb3VyY2VUeXBlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwdWJsaWMgTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uIGdldE1hcHBpbmdSZXNvdXJjZVVpRGVmaW5pdGlvbihKcHRSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlKSB7Ci0JCVJlc291cmNlVWlEZWZpbml0aW9uIGRlZiA9IHRoaXMuZ2V0UmVzb3VyY2VVaURlZmluaXRpb24ocmVzb3VyY2VUeXBlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiAoTWFwcGluZ1Jlc291cmNlVWlEZWZpbml0aW9uKSBkZWY7Ci0JCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2UpIHsKLQkJCS8vIFRPRE8gKGJ1ZyAzMTM2MzIpIC0gcmV0dXJuIGEgbnVsbCByZXNvdXJjZSB1aSBkZWZpbml0aW9uPwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTm8gbWFwcGluZyByZXNvdXJjZSBVSSBkZWZpbml0aW9uIGZvciB0aGUgcmVzb3VyY2UgdHlwZTogIiArIHJlc291cmNlVHlwZSwgY2NlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogZW50aXR5IGdlbmVyYXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRW50aXRpZXMoSnBhUHJvamVjdCBwcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJRW50aXRpZXNHZW5lcmF0b3IuZ2VuZXJhdGUocHJvamVjdCwgc2VsZWN0aW9uKTsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQkKLQlwcm90ZWN0ZWQgdm9pZCBkaXNwbGF5TWVzc2FnZShTdHJpbmcgdGl0bGUsIFN0cmluZyBtZXNzYWdlKSB7Ci0JICAgIFNoZWxsIGN1cnJlbnRTaGVsbCA9IERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JICAgIE1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKGN1cnJlbnRTaGVsbCwgdGl0bGUsIG1lc3NhZ2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vYmFzZS9FbnRpdGllc0dlbmVyYXRvci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0VudGl0aWVzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NTkxNDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9iYXNlL0VudGl0aWVzR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uYmFzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiAgRW50aXRpZXNHZW5lcmF0b3IKLSAqLwotcHVibGljIGNsYXNzIEVudGl0aWVzR2VuZXJhdG9yIHsKLQlwcml2YXRlIEpwYVByb2plY3QgcHJvamVjdDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBnZW5lcmF0ZShKcGFQcm9qZWN0IHByb2plY3QsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQluZXcgRW50aXRpZXNHZW5lcmF0b3IocHJvamVjdCwgc2VsZWN0aW9uKS5nZW5lcmF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIEVudGl0aWVzR2VuZXJhdG9yKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0JCXRoaXMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBwcm9tcHQgdGhlIHVzZXIgd2l0aCBhIHdpemFyZDsKLQkgKiBzY2hlZHVsZSBhIGpvYiB0byBnZW5lcmF0ZSB0aGUgZW50aXRpZXM7Ci0JICogb3B0aW9uYWxseSBzY2hlZHVsZSBhIGpvYiB0byBzeW5jaHJvbml6ZSBwZXJzaXN0ZW5jZS54bWwgdG8KLQkgKiBydW4gYWZ0ZXJ3YXJkcwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlKCkgewotCQlHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCB3aXphcmQgPSBuZXcgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQodGhpcy5wcm9qZWN0LCB0aGlzLnNlbGVjdGlvbik7Ci0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHRoaXMuZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSAhPSBXaW5kb3cuT0spIHsKLQkJCXJldHVybjsKLQkJfQotCQkvL0VudGl0aWVzIGdlbmVyYXRpb24gaGFwcGVucyBpbiB0aGUgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQucGVyZm9ybUZpbmlzaCgpCi0JCS8vbWV0aG9kCi0JfQotCQotCXByaXZhdGUgU2hlbGwgZ2V0Q3VycmVudFNoZWxsKCkgewotCSAgICByZXR1cm4gRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0QWN0aXZlU2hlbGwoKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9DbGFzc1JlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZjljNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0NsYXNzUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlcigKLQkJCUNsYXNzUmVmIGNsYXNzUmVmLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihjbGFzc1JlZiwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBDbGFzc1JlZiBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChDbGFzc1JlZikgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCUltYWdlIGltYWdlOwotCQlpZiAoZ2V0TW9kZWwoKS5pc1ZpcnR1YWwoKSkgewotCQkJaW1hZ2UgPSBKcHRVaUljb25zLmdob3N0KEpwdFVpSWNvbnMuQ0xBU1NfUkVGKTsKLQkJfQotCQllbHNlIHsKLQkJCSBpbWFnZSA9IEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuQ0xBU1NfUkVGKTsKLQkJfQotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oaW1hZ2UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENsYXNzUmVmLCBTdHJpbmc+KENsYXNzUmVmLkNMQVNTX05BTUVfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCSBAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRDbGFzc05hbWUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJLy9UT0RPIGFsc28gbmVlZCB0byBsaXN0ZW4gdG8gdGhlIFBlcnNpc3RlbmNlVW5pdCBuYW1lIHByb3BlcnR5IHNpbmNlIHRoaXMgdmFsdWUgZGVwZW5kcyBvbiBpdAotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDbGFzc1JlZiwgU3RyaW5nPihDbGFzc1JlZi5DTEFTU19OQU1FX1BST1BFUlRZLCBnZXRNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiL1wiIik7ICAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdC5nZXRDbGFzc05hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCJcIiAtICIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCQkJCXJldHVybiBzYi50b1N0cmluZygpOwotCQkJfQotCQl9OwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9FbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODZjZWFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9FbnRpdHlNYXBwaW5nc0l0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIEVudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEVudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncywgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIoZW50aXR5TWFwcGluZ3MsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgRW50aXR5TWFwcGluZ3MgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KAotCQkJSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5FTlRJVFlfTUFQUElOR1MpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJSnB0VWlNZXNzYWdlcy5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfZW50aXR5TWFwcGluZ3NMYWJlbCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoSnB0VWlNZXNzYWdlcy5Pcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnlfZW50aXR5TWFwcGluZ3NMYWJlbCk7Ci0JCXNiLmFwcGVuZCgiIC0gIik7ICAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChnZXRNb2RlbCgpLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oc2IudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNKcGFQbGF0Zm9ybVVpLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiYWY2NS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmJhc2UuQmFzZUpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljSnBhUGxhdGZvcm1VaQotCWV4dGVuZHMgQmFzZUpwYVBsYXRmb3JtVWkKLXsKLQlwdWJsaWMgR2VuZXJpY0pwYVBsYXRmb3JtVWkoCi0JCQlKcGFOYXZpZ2F0b3JQcm92aWRlciBuYXZpZ2F0b3JQcm92aWRlciwgSnBhUGxhdGZvcm1VaVByb3ZpZGVyIHBsYXRmb3JtVWlQcm92aWRlcikgewotCQkKLQkJc3VwZXIobmF2aWdhdG9yUHJvdmlkZXIsIHBsYXRmb3JtVWlQcm92aWRlcik7Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogRERMIGdlbmVyYXRpb24gKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlRERMKEpwYVByb2plY3QgcHJvamVjdCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuZGlzcGxheU1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5HZW5lcmljUGxhdGZvcm1VaURpYWxvZ19ub3RTdXBwb3J0ZWRNZXNzYWdlVGl0bGUsIEpwdFVpTWVzc2FnZXMuR2VuZXJpY1BsYXRmb3JtVWlEaWFsb2dfbm90U3VwcG9ydGVkTWVzc2FnZVRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljSnBhUGxhdGZvcm1VaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYzMjg3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcGFQbGF0Zm9ybVVpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5IGltcGxlbWVudHMgSnBhUGxhdGZvcm1VaUZhY3RvcnkKLXsKLQotCS8qKgotCSAqIFplcm8gYXJnIGNvbnN0cnVjdG9yIGZvciBleHRlbnNpb24gcG9pbnQKLQkgKi8KLQlwdWJsaWMgR2VuZXJpY0pwYVBsYXRmb3JtVWlGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpIGJ1aWxkSnBhUGxhdGZvcm1VaSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm1VaSgKLQkJCW5ldyBHZW5lcmljTmF2aWdhdG9yUHJvdmlkZXIoKSwKLQkJCUdlbmVyaWNKcGFQbGF0Zm9ybVVpUHJvdmlkZXIuaW5zdGFuY2UoKQotCQkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY1YzEwNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRmlsdGVyaW5nSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuRmlsdGVyaW5nQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkl0ZW1Qcm9wZXJ0eUxpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYUNvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmFyRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLQotcHVibGljIGNsYXNzIEdlbmVyaWNOYXZpZ2F0b3JJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotCWltcGxlbWVudHMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5Ci17Ci0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyIGJ1aWxkSXRlbUNvbnRlbnRQcm92aWRlcihPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyID0gKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotCQkKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKcGFSb290Q29udGV4dE5vZGUpIHsKLQkJCXJldHVybiBuZXcgUm9vdENvbnRleHRJdGVtQ29udGVudFByb3ZpZGVyKChKcGFSb290Q29udGV4dE5vZGUpIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlWG1sKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlcigoUGVyc2lzdGVuY2VYbWwpIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVVuaXQpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlcigoUGVyc2lzdGVuY2VVbml0KSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgT3JtWG1sKSB7Ci0JCQlyZXR1cm4gbmV3IE9ybVhtbEl0ZW1Db250ZW50UHJvdmlkZXIoKE9ybVhtbCkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIE9ybVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4gbmV3IE9ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcigoT3JtUGVyc2lzdGVudFR5cGUpIGl0ZW0sIHRyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgSmF2YVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcigoSmF2YVBlcnNpc3RlbnRUeXBlKSBpdGVtLCB0cmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUNvbnRlbnRQcm92aWRlcigoUGVyc2lzdGVudEF0dHJpYnV0ZSkgaXRlbSwgdHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8SnBhQ29udGV4dE5vZGU+Ci0JewotCQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0SXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIocGVyc2lzdGVuY2VVbml0LCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoUGVyc2lzdGVuY2VVbml0KSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFBlcnNpc3RlbmNlWG1sIGdldFBhcmVudCgpIHsKLQkJCXJldHVybiBnZXRNb2RlbCgpLmdldFBhcmVudCgpLmdldFBhcmVudCgpOwotCQl9Ci0JCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPj4oKTsKLQkJCWxpc3QuYWRkKGJ1aWxkU3BlY2lmaWVkT3JtWG1sQ3ZtKCkpOwotCQkJbGlzdC5hZGQoYnVpbGRJbXBsaWVkTWFwcGluZ0ZpbGVDdm0oKSk7Ci0JCQlsaXN0LmFkZChidWlsZFBlcnNpc3RlbnRUeXBlQ3ZtKCkpOwotCQkJbGlzdC5hZGQoYnVpbGRKYXJGaWxlQ3ZtKCkpOwotCQkJcmV0dXJuIG5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDw/IGV4dGVuZHMgSnBhQ29udGV4dE5vZGU+LCBKcGFDb250ZXh0Tm9kZT4obGlzdCk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFDb250ZXh0Tm9kZT4gYnVpbGRTcGVjaWZpZWRPcm1YbWxDdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPigKLQkJCQkJbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGU+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw8TWFwcGluZ0ZpbGVSZWYsIE1hcHBpbmdGaWxlPigKLQkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPE1hcHBpbmdGaWxlUmVmPigKLQkJCQkJCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5TUEVDSUZJRURfTUFQUElOR19GSUxFX1JFRlNfTElTVCwKLQkJCQkJCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8TWFwcGluZ0ZpbGVSZWY+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0sIE1hcHBpbmdGaWxlUmVmLk1BUFBJTkdfRklMRV9QUk9QRVJUWSkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgdHJhbnNmb3JtSXRlbShNYXBwaW5nRmlsZVJlZiBpdGVtKSB7Ci0JCQkJCQkJCXJldHVybiBpdGVtLmdldE1hcHBpbmdGaWxlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFDb250ZXh0Tm9kZT4gZmlsdGVyKEl0ZXJhYmxlPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4gaXRlbXMpIHsKLQkJCQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SnBhQ29udGV4dE5vZGU+KGl0ZW1zKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpwYUNvbnRleHROb2RlIG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8gIT0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQl9Ci0JCQkJfTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE1hcHBpbmdGaWxlPiBidWlsZEltcGxpZWRNYXBwaW5nRmlsZUN2bSgpIHsKLQkJCXJldHVybiBuZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGU+KAotCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWYsIE1hcHBpbmdGaWxlPigKLQkJCQkJCW5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksCi0JCQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpOwotCQkJCQkJCX0KLQkJCQkJCX0sCi0JCQkJCQlNYXBwaW5nRmlsZVJlZi5NQVBQSU5HX0ZJTEVfUFJPUEVSVFkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBNYXBwaW5nRmlsZSBidWlsZFZhbHVlXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldE1hcHBpbmdGaWxlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkpOwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhQ29udGV4dE5vZGU+IGJ1aWxkUGVyc2lzdGVudFR5cGVDdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPigKLQkJCQkJbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8UGVyc2lzdGVudFR5cGU+KAotCQkJCQkJbmV3IFRyYW5zZm9ybWF0aW9uTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWYsIFBlcnNpc3RlbnRUeXBlPigKLQkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPENsYXNzUmVmPihidWlsZENsYXNzUmVmQ3ZtKCksIENsYXNzUmVmLkpBVkFfUEVSU0lTVEVOVF9UWVBFX1BST1BFUlRZKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSB0cmFuc2Zvcm1JdGVtKENsYXNzUmVmIGl0ZW0pIHsKLQkJCQkJCQkJcmV0dXJuIGl0ZW0uZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBJdGVyYWJsZTxKcGFDb250ZXh0Tm9kZT4gZmlsdGVyKEl0ZXJhYmxlPD8gZXh0ZW5kcyBKcGFDb250ZXh0Tm9kZT4gaXRlbXMpIHsKLQkJCQkJCXJldHVybiBuZXcgRmlsdGVyaW5nSXRlcmFibGU8SnBhQ29udGV4dE5vZGU+KGl0ZW1zKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KEpwYUNvbnRleHROb2RlIG8pIHsKLQkJCQkJCQkJcmV0dXJuIG8gIT0gbnVsbDsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQl9Ci0JCQkJfTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZENsYXNzUmVmQ3ZtKCkgewotCQkJQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPENsYXNzUmVmPj4gaG9sZGVycyA9IG5ldyBBcnJheUxpc3Q8Q29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+PigyKTsKLQkJCWhvbGRlcnMuYWRkKGJ1aWxkU3BlY2lmaWVkQ2xhc3NSZWZDdm0oKSk7Ci0JCQlob2xkZXJzLmFkZChidWlsZEltcGxpZWRDbGFzc1JlZkN2bSgpKTsKLQkJCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8Q2xhc3NSZWY+LCBDbGFzc1JlZj4oaG9sZGVycyk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxDbGFzc1JlZj4gYnVpbGRTcGVjaWZpZWRDbGFzc1JlZkN2bSgpIHsKLQkJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxDbGFzc1JlZj4oCi0JCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9DTEFTU19SRUZTX0xJU1QsIGdldE1vZGVsKCkpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8Q2xhc3NSZWY+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZENsYXNzUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpOwotCQkJCQl9Ci0JCQl9KTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPENsYXNzUmVmPiBidWlsZEltcGxpZWRDbGFzc1JlZkN2bSgpIHsKLQkJCXJldHVybiBuZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OLCBnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgSXRlcmFibGU8Q2xhc3NSZWY+IGdldEl0ZXJhYmxlKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZENsYXNzUmVmcygpOwotCQkJCQl9Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJfTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPiBidWlsZEphckZpbGVDdm0oKSB7Ci0JCQlyZXR1cm4gbmV3IEZpbHRlcmluZ0NvbGxlY3Rpb25WYWx1ZU1vZGVsPEpwYUNvbnRleHROb2RlPigKLQkJCQkJbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8SmFyRmlsZT4oCi0JCQkJCQluZXcgVHJhbnNmb3JtYXRpb25MaXN0VmFsdWVNb2RlbDxKYXJGaWxlUmVmLCBKYXJGaWxlPigKLQkJCQkJCQluZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPEphckZpbGVSZWY+KGJ1aWxkSmFyRmlsZVJlZkN2bSgpLCBKYXJGaWxlUmVmLkpBUl9GSUxFX1BST1BFUlRZKSkgewotCQkJCQkJCUBPdmVycmlkZQotCQkJCQkJCXByb3RlY3RlZCBKYXJGaWxlIHRyYW5zZm9ybUl0ZW0oSmFyRmlsZVJlZiBpdGVtKSB7Ci0JCQkJCQkJCXJldHVybiBpdGVtLmdldEphckZpbGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9KSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYUNvbnRleHROb2RlPiBmaWx0ZXIoSXRlcmFibGU8PyBleHRlbmRzIEpwYUNvbnRleHROb2RlPiBpdGVtcykgewotCQkJCQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxKcGFDb250ZXh0Tm9kZT4oaXRlbXMpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSnBhQ29udGV4dE5vZGUgbykgewotCQkJCQkJCQlyZXR1cm4gbyAhPSBudWxsOwotCQkJCQkJCX0KLQkJCQkJCX07Ci0JCQkJCX0KLQkJCQl9OwotCQl9Ci0JCQotCQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SmFyRmlsZVJlZj4gYnVpbGRKYXJGaWxlUmVmQ3ZtKCkgewotCQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPEphckZpbGVSZWY+KAotCQkJCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIEphckZpbGVSZWY+KAotCQkJCQlQZXJzaXN0ZW5jZVVuaXQuSkFSX0ZJTEVfUkVGU19MSVNULCBnZXRNb2RlbCgpKSB7Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8SmFyRmlsZVJlZj4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEphckZpbGVSZWZzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SmFyRmlsZVJlZnNTaXplKCk7Ci0JCQkJCQl9Ci0JCQkJfSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0dlbmVyaWNOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4ODBlYS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvckl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphckZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qZmFjZS5KYXJGaWxlSXRlbUxhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTmF2aWdhdG9ySXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci0JaW1wbGVtZW50cyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXIgYnVpbGRJdGVtTGFiZWxQcm92aWRlcihPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgSnBhUm9vdENvbnRleHROb2RlKSB7Ci0JCQlyZXR1cm4gbmV3IFJvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIoKEpwYVJvb3RDb250ZXh0Tm9kZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVhtbCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVhtbEl0ZW1MYWJlbFByb3ZpZGVyKChQZXJzaXN0ZW5jZVhtbCkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2VVbml0KSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlVW5pdEl0ZW1MYWJlbFByb3ZpZGVyKChQZXJzaXN0ZW5jZVVuaXQpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIE9ybVhtbCkgewotCQkJcmV0dXJuIG5ldyBPcm1YbWxJdGVtTGFiZWxQcm92aWRlcigoT3JtWG1sKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyKChQZXJzaXN0ZW50VHlwZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlcigoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBKYXJGaWxlKSB7Ci0JCQlyZXR1cm4gbmV3IEphckZpbGVJdGVtTGFiZWxQcm92aWRlcigoSmFyRmlsZSkgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9yUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9HZW5lcmljTmF2aWdhdG9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkMzk5Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5uYXZpZ2F0b3IuSnBhTmF2aWdhdG9yUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBHZW5lcmljTmF2aWdhdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBKcGFOYXZpZ2F0b3JQcm92aWRlcgotewotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEdlbmVyaWNOYXZpZ2F0b3JJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljTmF2aWdhdG9ySXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXJGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9KYXJGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlNjVlOS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuSmFyRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKYXJGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIEphckZpbGVSZWZJdGVtTGFiZWxQcm92aWRlcigKLQkJCUphckZpbGVSZWYgamFyRmlsZVJlZiwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIoamFyRmlsZVJlZiwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXJGaWxlUmVmIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKEphckZpbGVSZWYpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SmFyRmlsZVJlZiwgU3RyaW5nPihKYXJGaWxlUmVmLkZJTEVfTkFNRV9QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewotCQkJIEBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEZpbGVOYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuSkFSX0ZJTEVfUkVGKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEphckZpbGVSZWYsIFN0cmluZz4oSmFyRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCIvXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldEZpbGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiXCIgLSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvSmF2YVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL0phdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0NDk3Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvSmF2YVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudFR5cGUsIGNvbnRlbnRQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSmF2YVBlcnNpc3RlbnRUeXBlKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KAotCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8SmF2YVBlcnNpc3RlbnRUeXBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgZ2V0TW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0QXR0cmlidXRlcygpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0QXR0cmlidXRlc1NpemUoKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9NYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvTWFwcGluZ0ZpbGVSZWZJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njk0Nzk1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9NYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIE1hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIobWFwcGluZ0ZpbGVSZWYsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWYgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoTWFwcGluZ0ZpbGVSZWYpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJSW1hZ2UgaW1hZ2U7Ci0JCWlmIChnZXRNb2RlbCgpLmlzSW1wbGllZCgpKSB7Ci0JCQlpbWFnZSA9IEpwdFVpSWNvbnMuZ2hvc3QoSnB0VWlJY29ucy5NQVBQSU5HX0ZJTEVfUkVGKTsKLQkJfQotCQllbHNlIHsKLQkJCSBpbWFnZSA9IEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuTUFQUElOR19GSUxFX1JFRik7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KGltYWdlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwaW5nRmlsZVJlZiwgU3RyaW5nPihNYXBwaW5nRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCSBAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRGaWxlTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxNYXBwaW5nRmlsZVJlZiwgU3RyaW5nPihNYXBwaW5nRmlsZVJlZi5GSUxFX05BTUVfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCIvXCIiKTsgIC8vJE5PTi1OTFMtMSQKLQkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldEZpbGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgiXCIgLSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGM3OWIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL09ybVBlcnNpc3RlbnRUeXBlSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3VwZXJMaXN0SXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgY2xhc3MgT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4KLXsKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUsIERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgY29udGVudFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRUeXBlLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtUGVyc2lzdGVudFR5cGUgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoT3JtUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQYXJlbnQoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4+KDIpOwotCQlsaXN0LmFkZChidWlsZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGVzTW9kZWwoKSk7Ci0JCWxpc3QuYWRkKGJ1aWxkVmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGVzTW9kZWwoKSk7Ci0JCXJldHVybiBuZXcgQ29tcG9zaXRlQ29sbGVjdGlvblZhbHVlTW9kZWw8Q29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiwgT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPihsaXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYnVpbGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPigKLQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlLCBPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KE9ybVBlcnNpc3RlbnRUeXBlLlNQRUNJRklFRF9BVFRSSUJVVEVTX0xJU1QsIGdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIExpc3RJdGVyYWJsZTxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQlyZXR1cm4gbmV3IFN1cGVyTGlzdEl0ZXJhYmxlV3JhcHBlcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KHRoaXMuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpKTsKLQkJCX0KLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBidWlsZFZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPigKLQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlLCBPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+KE9ybVBlcnNpc3RlbnRUeXBlLlZJUlRVQUxfQVRUUklCVVRFU19MSVNULCBnZXRNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRWaXJ0dWFsQXR0cmlidXRlcygpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgaW50IHNpemVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTI5ZmMyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci0KLXB1YmxpYyBjbGFzcyBPcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyCi0JZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPE9ybVBlcnNpc3RlbnRUeXBlPgotewotCXB1YmxpYyBPcm1YbWxJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT3JtWG1sIG9ybVhtbCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIob3JtWG1sLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtWG1sIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKE9ybVhtbCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRNb2RlbCgpLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8T3JtUGVyc2lzdGVudFR5cGU+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPE9ybVBlcnNpc3RlbnRUeXBlPigKLQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1QZXJzaXN0ZW50VHlwZT4oCi0JCQkJYnVpbGRFbnRpdHlNYXBwaW5nc0hvbGRlcigpLAotCQkJCUVudGl0eU1hcHBpbmdzLlBFUlNJU1RFTlRfVFlQRVNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE9ybVBlcnNpc3RlbnRUeXBlPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGVzKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVudFR5cGVzU2l6ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFbnRpdHlNYXBwaW5ncz4gYnVpbGRFbnRpdHlNYXBwaW5nc0hvbGRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8T3JtWG1sLCBFbnRpdHlNYXBwaW5ncz4oCi0JCQkJT3JtWG1sLlJPT1RfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFJvb3QoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2YyY2I2Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Pcm1YbWxJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBPcm1YbWxJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgT3JtWG1sSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlPcm1YbWwgb3JtWG1sLCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihvcm1YbWwsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT3JtWG1sIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKE9ybVhtbCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfRklMRSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oZ2V0TW9kZWwoKS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoZ2V0TW9kZWwoKS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgiIC0gIik7ICAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChnZXRNb2RlbCgpLmdldFJlc291cmNlKCkuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oc2IudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNzU3NjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcgotewotCXB1YmxpYyBQZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbmNlLCBsYWJlbFByb3ZpZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+KEpwdEpwYVVpUGx1Z2luLmdldEltYWdlKEpwdFVpSWNvbnMuUEVSU0lTVEVOQ0UpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJSnB0VWlNZXNzYWdlcy5QZXJzaXN0ZW5jZUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeV9wZXJzaXN0ZW5jZUxhYmVsKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVzY3JpcHRpb25Nb2RlbCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXNiLmFwcGVuZChKcHRVaU1lc3NhZ2VzLlBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5X3BlcnNpc3RlbmNlTGFiZWwpOwotCQlzYi5hcHBlbmQoIiAtICIpOyAgLy8kTk9OLU5MUy0xJAotCQlzYi5hcHBlbmQoZ2V0TW9kZWwoKS5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KHNiLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlVW5pdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDcwNzYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlVW5pdEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0SXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0LCBEZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW5jZVVuaXQsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0IGdldE1vZGVsKCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLlBFUlNJU1RFTkNFX1VOSVQpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVGV4dE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQsIFN0cmluZz4oUGVyc2lzdGVuY2VVbml0Lk5BTUVfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCSBAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXROYW1lKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgU3RyaW5nPihQZXJzaXN0ZW5jZVVuaXQuTkFNRV9QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0TmFtZSgpKTsKLQkJCQlzYi5hcHBlbmQoIiAtICIpOyAgLy8kTk9OLU5MUy0xJAotCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVuY2VYbWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzMwNTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5BYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxQZXJzaXN0ZW5jZVVuaXQ+Ci17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW5jZVhtbCwgY29udGVudFByb3ZpZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFBlcnNpc3RlbmNlWG1sIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlWG1sKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhUm9vdENvbnRleHROb2RlIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIChKcGFSb290Q29udGV4dE5vZGUpIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdD4oCi0JCW5ldyBMaXN0QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW5jZSwgUGVyc2lzdGVuY2VVbml0PigKLQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlWG1sLCBQZXJzaXN0ZW5jZT4oCi0JCQkJCQlQZXJzaXN0ZW5jZVhtbC5QRVJTSVNURU5DRV9QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlIGJ1aWxkVmFsdWVfKCkgewotCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCQkJfQotCQkJCX0sCi0JCQkJUGVyc2lzdGVuY2UuUEVSU0lTVEVOQ0VfVU5JVFNfTElTVCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdD4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdHMoKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW5jZVhtbEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YzhiOWEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlWG1sSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlQZXJzaXN0ZW5jZVhtbCBwZXJzaXN0ZW5jZVhtbCwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVuY2VYbWwsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVuY2VYbWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVuY2VYbWwpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4oSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2UoSnB0VWlJY29ucy5KUEFfRklMRSkpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oZ2V0TW9kZWwoKS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERlc2NyaXB0aW9uTW9kZWwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlzYi5hcHBlbmQoZ2V0TW9kZWwoKS5nZXRSZXNvdXJjZSgpLmdldE5hbWUoKSk7Ci0JCXNiLmFwcGVuZCgiIC0gIik7ICAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChnZXRNb2RlbCgpLmdldFJlc291cmNlKCkuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oc2IudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRkZTFmZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4ICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLQotQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwZXJzaXN0ZW50QXR0cmlidXRlLCBjb250ZW50UHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChQZXJzaXN0ZW50QXR0cmlidXRlKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGFyZW50KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9QZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0YzA1Yy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RJdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBQZXJzaXN0ZW50QXR0cmlidXRlSXRlbUxhYmVsUHJvdmlkZXIKLQlleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHBlcnNpc3RlbnRBdHRyaWJ1dGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGdldE1vZGVsKCkgewotCQlyZXR1cm4gKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSkgc3VwZXIuZ2V0TW9kZWwoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxJbWFnZT4gYnVpbGRJbWFnZU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEltYWdlPigKLQkJCQluZXcgU3RyaW5nW10ge1JlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZS5ERUZBVUxUX01BUFBJTkdfS0VZX1BST1BFUlRZLCBSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWX0sIAotCQkJCWdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEltYWdlIGJ1aWxkVmFsdWVfKCkgewotCQkJCWlmIChnZXRNb2RlbCgpLmlzVmlydHVhbCgpKSB7Ci0JCQkJCXJldHVybiBKcHRVaUljb25zLmdob3N0KEpwYU1hcHBpbmdJbWFnZUhlbHBlci5pY29uS2V5Rm9yQXR0cmlidXRlTWFwcGluZyh0aGlzLnN1YmplY3QuZ2V0TWFwcGluZ0tleSgpKSk7Ci0JCQkJfQotCQkJCXJldHVybiBKcGFNYXBwaW5nSW1hZ2VIZWxwZXIuaW1hZ2VGb3JBdHRyaWJ1dGVNYXBwaW5nKHRoaXMuc3ViamVjdC5nZXRNYXBwaW5nS2V5KCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRUZXh0TW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSwgU3RyaW5nPihSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUuTkFNRV9QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0TmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFN0cmluZz4oUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlLk5BTUVfUFJPUEVSVFksIGdldE1vZGVsKCkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQlzYi5hcHBlbmQodGhpcy5zdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCcvJyk7Ci0JCQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdC5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7Ci0JCQkJc2IuYXBwZW5kKCcvJyk7Ci0JCQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdC5nZXROYW1lKCkpOwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuc3ViamVjdC5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCXNiLmFwcGVuZCgiIC0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJc2IuYXBwZW5kKHJlc291cmNlLmdldEZ1bGxQYXRoKCkubWFrZVJlbGF0aXZlKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1BlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmYmFiMS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3BsYXRmb3JtL2dlbmVyaWMvUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhTWFwcGluZ0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEl0ZW1MYWJlbFByb3ZpZGVyCi17Ci0JcHVibGljIFBlcnNpc3RlbnRUeXBlSXRlbUxhYmVsUHJvdmlkZXIoCi0JCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIpIHsKLQkJc3VwZXIocGVyc2lzdGVudFR5cGUsIGxhYmVsUHJvdmlkZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUGVyc2lzdGVudFR5cGUgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoUGVyc2lzdGVudFR5cGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SW1hZ2U+IGJ1aWxkSW1hZ2VNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIEltYWdlPihQZXJzaXN0ZW50VHlwZS5NQVBQSU5HX1BST1BFUlRZLCBnZXRNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJbWFnZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gSnBhTWFwcGluZ0ltYWdlSGVscGVyLmltYWdlRm9yVHlwZU1hcHBpbmcodGhpcy5zdWJqZWN0LmdldE1hcHBpbmdLZXkoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVudFR5cGUsIFN0cmluZz4oUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgZ2V0TW9kZWwoKSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2ltcGxlTmFtZSgpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxQZXJzaXN0ZW50VHlwZSwgU3RyaW5nPihQZXJzaXN0ZW50VHlwZS5OQU1FX1BST1BFUlRZLCBnZXRNb2RlbCgpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJc2IuYXBwZW5kKHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXROYW1lKCkpOwotCQkJCXNiLmFwcGVuZCgnLycpOwotCQkJCXNiLmFwcGVuZCh0aGlzLnN1YmplY3QuZ2V0TmFtZSgpKTsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLnN1YmplY3QuZ2V0UmVzb3VyY2UoKTsKLQkJCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJCQlzYi5hcHBlbmQoIiAtICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXNiLmFwcGVuZChyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLm1ha2VSZWxhdGl2ZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1Jvb3RDb250ZXh0SXRlbUNvbnRlbnRQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1Jvb3RDb250ZXh0SXRlbUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjY1MjU1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLQotcHVibGljIGNsYXNzIFJvb3RDb250ZXh0SXRlbUNvbnRlbnRQcm92aWRlcgotCWV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxQZXJzaXN0ZW5jZVhtbD4KLXsKLQlwdWJsaWMgUm9vdENvbnRleHRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJSnBhUm9vdENvbnRleHROb2RlIHJvb3RDb250ZXh0LCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihyb290Q29udGV4dCwgY29udGVudFByb3ZpZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpwYVJvb3RDb250ZXh0Tm9kZSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChKcGFSb290Q29udGV4dE5vZGUpIHN1cGVyLmdldE1vZGVsKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJUHJvamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBnZXRNb2RlbCgpLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVhtbD4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlWG1sPigKLQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPEpwYVJvb3RDb250ZXh0Tm9kZSwgUGVyc2lzdGVuY2VYbWw+KAotCQkJCQkJSnBhUm9vdENvbnRleHROb2RlLlBFUlNJU1RFTkNFX1hNTF9QUk9QRVJUWSwKLQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJIEBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWwgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1Jvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcGxhdGZvcm0vZ2VuZXJpYy9Sb290Q29udGV4dEl0ZW1MYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmE5MGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wbGF0Zm9ybS9nZW5lcmljL1Jvb3RDb250ZXh0SXRlbUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlN0YXRpY1Byb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotCi1wdWJsaWMgY2xhc3MgUm9vdENvbnRleHRJdGVtTGFiZWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SXRlbUxhYmVsUHJvdmlkZXIKLXsKLQlwdWJsaWMgUm9vdENvbnRleHRJdGVtTGFiZWxQcm92aWRlcigKLQkJCUpwYVJvb3RDb250ZXh0Tm9kZSByb290Q29udGV4dE5vZGUsIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCXN1cGVyKHJvb3RDb250ZXh0Tm9kZSwgbGFiZWxQcm92aWRlcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBKcGFSb290Q29udGV4dE5vZGUgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoSnBhUm9vdENvbnRleHROb2RlKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPiBidWlsZEltYWdlTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPEltYWdlPihKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZShKcHRVaUljb25zLkpQQV9DT05URU5UKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFRleHRNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTdGF0aWNQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihKcHRVaU1lc3NhZ2VzLkpwYUNvbnRlbnRfbGFiZWwpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZXNjcmlwdGlvbk1vZGVsKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJc2IuYXBwZW5kKEpwdFVpTWVzc2FnZXMuSnBhQ29udGVudF9sYWJlbCk7Ci0JCXNiLmFwcGVuZCgiIC0gIik7ICAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChnZXRNb2RlbCgpLmdldFJlc291cmNlKCkuZ2V0RnVsbFBhdGgoKS5tYWtlUmVsYXRpdmUoKSk7Ci0JCXJldHVybiBuZXcgU3RhdGljUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oc2IudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcmVmZXJlbmNlc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnBhUHJlZmVyZW5jZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTc3MGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcmVmZXJlbmNlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci0KLS8qKgotICogVGhpcyBpcyB0aGUgcm9vdCBvZiB0aGUgSlBBIHByZWZlcmVuY2VzIGhpZXJhcmNoeSBpbiB0aGUgSURFCi0gKiBwcmVmZXJlbmNlcyBkaWFsb2cuCi0gKiA8cD4KLSAqIFN0cnVjdHVyZToKLSAqIDxwPgotICogSlBBPGJyPgotICogIHwtIEVycm9ycy9XYXJuaW5ncwotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgSnBhUHJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBib29sZWFuIGxvd2VyY2FzZTsKLQlwcml2YXRlIEJ1dHRvbiBsb3dlckNhc2VSYWRpb0J1dHRvbjsKLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hGaXJzdENoYXJhY3RlckNhc2U7Ci0JcHJpdmF0ZSBCdXR0b24gbWF0Y2hGaXJzdENoYXJhY3RlckNhc2VDaGVja0JveDsKLQlwcml2YXRlIEJ1dHRvbiB1cHBlckNhc2VSYWRpb0J1dHRvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhUHJlZmVyZW5jZXNQYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSnBhUHJlZmVyZW5jZXNQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRKcHFsRWRpdG9yR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCS8vIEpQUUwgRWRpdGluZyBncm91cCBib3gKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcik7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJLy8gVG9wIGRlc2NyaXB0aW9uCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9kZXNjcmlwdGlvbik7Ci0KLQkJLy8gVXBwZXJjYXNlIHJhZGlvIGJ1dHRvbgotCQlsb3dlckNhc2VSYWRpb0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWxvd2VyQ2FzZVJhZGlvQnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9sb3dlckNhc2VSYWRpb0J1dHRvbik7Ci0JCWxvd2VyQ2FzZVJhZGlvQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkTG93ZXJjYXNlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCWxvd2VyQ2FzZVJhZGlvQnV0dG9uLnNldFNlbGVjdGlvbihsb3dlcmNhc2UpOwotCi0JCS8vIFVwcGVyY2FzZSByYWRpbyBidXR0b24KLQkJdXBwZXJDYXNlUmFkaW9CdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQl1cHBlckNhc2VSYWRpb0J1dHRvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZXNQYWdlX2pwcWxFZGl0b3JfdXBwZXJDYXNlUmFkaW9CdXR0b24pOwotCQl1cHBlckNhc2VSYWRpb0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZFVwcGVyY2FzZVNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQl1cHBlckNhc2VSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24oIWxvd2VyY2FzZSk7Ci0KLQkJbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0KLQkJLy8gTWF0Y2ggQ2FzZSBvZiBGaXJzdCBMZXR0ZXIgY2hlY2sgYm94Ci0JCW1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQltYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZUNoZWNrQm94LnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFQcmVmZXJlbmNlc1BhZ2VfanBxbEVkaXRvcl9tYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZVJhZGlvQnV0dG9uKTsKLQkJbWF0Y2hGaXJzdENoYXJhY3RlckNhc2VDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidWlsZE1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCW1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKG1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlKTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkTG93ZXJjYXNlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCQlsb3dlcmNhc2UgPSBidXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZE1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCQltYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZSA9IGJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkVXBwZXJjYXNlU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCQlsb3dlcmNhc2UgPSAhYnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscygxMCk7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCUxhYmVsIGRlc2NyaXB0aW9uID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlkZXNjcmlwdGlvbi5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhUHJlZmVyZW5jZXNQYWdlX2Rlc2NyaXB0aW9uKTsKLQotCQlhZGRKcHFsRWRpdG9yR3JvdXAocGFyZW50KTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEpwdEpwYVVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlsb3dlcmNhc2UgPSBzaG91bGRVc2VMb3dlcmNhc2VJZGVudGlmaWVycygpOwotCQltYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZSA9IHNob3VsZE1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdEpwcWxJZGVudGlmaWVyTG93ZXJjYXNlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0U3RyaW5nKEpwdEpwYVVpUGx1Z2luLkpQUUxfSURFTlRJRklFUl9DQVNFX1BSRUZfS0VZKTsKLQkJcmV0dXJuIEpwdEpwYVVpUGx1Z2luLkpQUUxfSURFTlRJRklFUl9MT1dFUkNBU0VfUFJFRl9WQUxVRS5lcXVhbHModmFsdWUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGpwcWxJZGVudGlmaWVyUHJlZmVyZW5jZVZhbHVlKCkgewotCQlyZXR1cm4gbG93ZXJjYXNlID8gSnB0SnBhVWlQbHVnaW4uSlBRTF9JREVOVElGSUVSX0xPV0VSQ0FTRV9QUkVGX1ZBTFVFIDogSnB0SnBhVWlQbHVnaW4uSlBRTF9JREVOVElGSUVSX1VQUEVSQ0FTRV9QUkVGX1ZBTFVFOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0KLQkJbG93ZXJjYXNlID0gaXNEZWZhdWx0SnBxbElkZW50aWZpZXJMb3dlcmNhc2UoKTsKLQkJbWF0Y2hGaXJzdENoYXJhY3RlckNhc2UgPSBzaG91bGREZWZhdWx0TWF0Y2hGaXJzdENoYXJhY3RlckNhc2UoKTsKLQotCQlsb3dlckNhc2VSYWRpb0J1dHRvbi5zZXRTZWxlY3Rpb24obG93ZXJjYXNlKTsKLQkJdXBwZXJDYXNlUmFkaW9CdXR0b24uc2V0U2VsZWN0aW9uKCFsb3dlcmNhc2UpOwotCQltYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZUNoZWNrQm94LnNldFNlbGVjdGlvbihtYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZSk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSnB0SnBhVWlQbHVnaW4uSlBRTF9JREVOVElGSUVSX0NBU0VfUFJFRl9LRVksIGpwcWxJZGVudGlmaWVyUHJlZmVyZW5jZVZhbHVlKCkpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShKcHRKcGFVaVBsdWdpbi5KUFFMX0lERU5USUZJRVJfTUFUQ0hfRklSU1RfQ0hBUkFDVEVSX0NBU0VfUFJFRl9LRVksIG1hdGNoRmlyc3RDaGFyYWN0ZXJDYXNlKTsKLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGREZWZhdWx0TWF0Y2hGaXJzdENoYXJhY3RlckNhc2UoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXREZWZhdWx0Qm9vbGVhbihKcHRKcGFVaVBsdWdpbi5KUFFMX0lERU5USUZJRVJfTUFUQ0hfRklSU1RfQ0hBUkFDVEVSX0NBU0VfUFJFRl9LRVkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRNYXRjaEZpcnN0Q2hhcmFjdGVyQ2FzZSgpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oSnB0SnBhVWlQbHVnaW4uSlBRTF9JREVOVElGSUVSX01BVENIX0ZJUlNUX0NIQVJBQ1RFUl9DQVNFX1BSRUZfS0VZKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkVXNlTG93ZXJjYXNlSWRlbnRpZmllcnMoKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhKcHRKcGFVaVBsdWdpbi5KUFFMX0lERU5USUZJRVJfQ0FTRV9QUkVGX0tFWSk7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5KUFFMX0lERU5USUZJRVJfTE9XRVJDQVNFX1BSRUZfVkFMVUUuZXF1YWxzKHZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYmIxOGEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5KYXZhUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5Qcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS5wcmVmZXJlbmNlcy5TY3JvbGxlZFBhZ2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ1NldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUHJvZ3Jlc3NNb25pdG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpwYVZhbGlkYXRpb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLmV2ZW50cy5FeHBhbnNpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkV4cGFuZGFibGVDb21wb3NpdGU7Ci0KLS8qKgotICogVGhpcyBwYWdlIHNob3dzIHRoZSBKYXZhIFBlcnNpc3RlbmNlIHZhbGlkYXRpb24gb3B0aW9ucy4gSXQgc3VwcG9ydHMKLSAqIHdvcmtzcGFjZSBhbmQgcHJvamVjdCBsZXZlbHMgc2V2ZXJpdGllcy4KLSAqCi0gKiBAdmVyc2lvbiAyLjMKLSAqIEBzaW5jZSAyLjIKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UgZXh0ZW5kcyBQcm9wZXJ0eUFuZFByZWZlcmVuY2VQYWdlIHsKLQotCS8qKgotCSAqIFNldmVyaXR5IGxldmVsIHN0YXRlIGlzIHN0b3JlZCBpbiB0aGlzIE1hcCBhbmQgaXMgZWl0aGVyIGNvbW1pdHRlZCBvciBkaXNjYXJkZWQKLQkgKiBiYXNlZCBvbiB1c2VyIGFjdGlvbi4KLQkgKiA8YnI+IGtleSBpcyB0aGUgcHJlZmVyZW5jZUtleSB3aGljaCBpcyBhbHNvIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2Uga2V5IEBzZWUgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLgotCSAqIDxicj4gdmFsdWUgaXMgYSBzZXZlcml0eSBsZXZlbCAtIEBzZWUgSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzI0VSUk9SIFdBUk5JTkcgSU5GTyBJR05PUkUKLQkgKi8KLQlNYXA8U3RyaW5nLCBTdHJpbmc+IHNldmVyaXR5TGV2ZWxzOwotCi0JLyoqCi0JICogRGVmYXVsdCBzZXZlcml0eSBsZXZlbHMgYXJlIHN0b3JlZCBoZXJlLCAgRVJST1IgaXMgdGhlIGRlZmF1bHQgZGVmYXVsdCBzbyBvbmx5IG5lZWQKLQkgKiB0byBpbmNsdWRlIFdBUk5JTkcsIElORk8sIElHTk9SRSBpbiB0aGlzIE1hcC4gVGhlc2Ugd2lsbCBiZSBkaXNwbGF5ZWQgaWYgbmVpdGhlciB0aGUgcHJvamVjdAotCSAqIG9yIHdvcmtzcGFjZSBwcmVmZXJlbmNlIGFwcGxpZXMuCi0JICogPGJyPiBrZXkgaXMgdGhlIHByZWZlcmVuY2VLZXkgd2hpY2ggaXMgYWxzbyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIGtleSBAc2VlIEpwYVZhbGlkYXRpb25NZXNzYWdlcy4KLQkgKiA8YnI+IHZhbHVlIGlzIGEgc2V2ZXJpdHkgbGV2ZWwgLSBAc2VlIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcyNFUlJPUiBXQVJOSU5HIElORk8gSUdOT1JFCi0JICovCi0JcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGRlZmF1bHRTZXZlcml0aWVzOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgPGNvZGU+Q29tYm88L2NvZGU+cyBpcyBjYWNoZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSBhIHJldmVydCBvZgotCSAqIHRoZSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgTGlzdDxDb21ibz4gY29tYm9zOwotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgPGNvZGU+RXhwYW5kYWJsZUNvbXBvc2l0ZTwvY29kZT4gaXMgY2FjaGVkIGluIG9yZGVyIHRvIHNhdmUKLQkgKiBhbmQgcmVzdG9yZSB0aGUgZXhwYW5zaW9uIHN0YXRlLgotCSAqLwotCXByaXZhdGUgTGlzdDxFeHBhbmRhYmxlQ29tcG9zaXRlPiBleHBhbmRhYmxlUGFuZXM7Ci0KLQkvKioKLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlICJFcnJvciIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTkRFWCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgcG9zaXRpb24gb2YgdGhlICJXYXJuaW5nIiBjaG9pY2UgaW4gdGhlIGNvbWJvJ3MgbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfSU5ERVggPSAxOwotCi0JLyoqCi0JICogVGhlIHBvc2l0aW9uIG9mIHRoZSAiSW5mbyIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkZPX0lOREVYID0gMjsKLQotCS8qKgotCSAqIFRoZSBwb3NpdGlvbiBvZiB0aGUgIklnbm9yZSIgY2hvaWNlIGluIHRoZSBjb21ibydzIG1vZGVsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJR05PUkVfSU5ERVggPSAzOwotCi0JLyoqCi0JICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBhZ2Ugd2hlbiBpdCBpcyBzaG93biBpbiB0aGUgSURFCi0JICogcHJlZmVyZW5jZXMgZGlhbG9nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKUFRfUFJFRkVSRU5DRVNfUFJPQkxFTV9TRVZFUklUSUVTX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUHJvYmxlbVNldmVyaXRpZXNQcmVmZXJlbmNlcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwYWdlIHdoZW4gaXQgaXMgc2hvd24gaW4gdGhlIHByb2plY3QKLQkgKiBwcmVmZXJlbmNlcyBkaWFsb2cuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQVF9QUk9QRVJUWV9QQUdFU19QUk9CTEVNX1NFVkVSSVRJRVNfSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQcm9ibGVtU2V2ZXJpdGllc1Byb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNvbnN0YW50IHVzZWQgdG8gc3RvcmUgYW5kIHJldHJpZXZlIHRoZSBwcmVmZXJlbmNlIGtleSAobWVzc2FnZSBJRCkgZnJvbQotCSAqIHRoZSBjb21iby4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRkVSRU5DRV9LRVkgPSAicHJlZmVyZW5jZUtleSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzY3JvbGxhYmxlIHBhbmUgdXNlZCB0byBzaG93IHRoZSBjb250ZW50IG9mIHRoaXMgcGFnZS4KLQkgKi8KLQlwcml2YXRlIFNjcm9sbGVkUGFnZUNvbnRlbnQgc2Nyb2xsYWJsZTsKLQotCS8qKgotCSAqIFRoZSBwb3NzaWJsZSBjaG9pY2VzIHdoaWNoIGRlc2NyaWJlcyB0aGUgc2V2ZXJpdHkgb2YgYSBzaW5nbGUgcHJvYmxlbS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIHNldmVyaXR5RGlzcGxheVN0cmluZ3M7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIHN0b3JlIHRoZSBleHBhbnNpb24gc3RhdGUgb2YgZWFjaCBleHBhbmRhYmxlIHBhbmUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUVElOR1NfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgcHJlZmVyZW5jZSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGlhbG9nIHNldHRpbmdzIHdoZXJlIHRoZSBleHBhbnNpb24KLQkgKiBzdGF0ZXMgaGF2ZSBiZWVuIHN0b3JlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRUSU5HU19TRUNUSU9OX05BTUUgPSAiSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBCb29sZWFuIGhhc1Byb2plY3RTcGVjaWZpY1ByZWZlcmVuY2VzID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQl0aGlzLnNldFByZWZlcmVuY2VTdG9yZShKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbihKcHRVaU1lc3NhZ2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9EZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJdGhpcy5jb21ib3MgPSBuZXcgQXJyYXlMaXN0PENvbWJvPigpOwotCQl0aGlzLmV4cGFuZGFibGVQYW5lcyA9IG5ldyBBcnJheUxpc3Q8RXhwYW5kYWJsZUNvbXBvc2l0ZT4oKTsKLQkJdGhpcy5zZXZlcml0eURpc3BsYXlTdHJpbmdzID0gYnVpbGRTZXZlcml0eURpc3BsYXlTdHJpbmdzKCk7Ci0JCXRoaXMuc2V2ZXJpdHlMZXZlbHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKLQkJdGhpcy5kZWZhdWx0U2V2ZXJpdGllcyA9IGJ1aWxkRGVmYXVsdFNldmVyaXRpZXMoKTsKLQl9Ci0KLQkvL3NpbmNlIG1vc3Qgb2Ygb3VyIHByb2JsZW1zIGhhdmUgYSBkZWZhdWx0IHNldmVyaXR5IG9mIEVSUk9SLCB3ZSBhcmUganVzdCBkZWZpbmluZyB0aGUgV0FSTklORywgSU5GTywgSUdOT1JFIGNhc2VzCi0JcHJvdGVjdGVkIE1hcDxTdHJpbmcsIFN0cmluZz4gYnVpbGREZWZhdWx0U2V2ZXJpdGllcygpIHsKLQkJIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0KLQkJIHJlc3VsdC5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTLCAJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSByZXN1bHQucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX05PX0NPTk5FQ1RJT04sIAkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSByZXN1bHQucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX0lOVkFMSURfQ09OTkVDVElPTiwgCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSByZXN1bHQucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04sIAkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgcmVzdWx0LnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19GSUxFX0VYVFJBTkVPVVNfUEVSU0lTVEVOQ0VfVU5JVF9NRVRBREFUQSwgCQkJCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgcmVzdWx0LnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX0RVUExJQ0FURV9DTEFTUywgCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOyAvLzMuMCBNNwotCQkgcmVzdWx0LnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORywgCQkJCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgcmVzdWx0LnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5IRVJJVEVEX0FUVFJJQlVURVNfTk9UX1NVUFBPUlRFRCwgCQkJCUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XQVJOSU5HKTsKLQkJIHJlc3VsdC5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9BTk5PVEFURURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklULCAJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgcmVzdWx0LnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCwJCQkJCQkJCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcpOwotCQkgcmVzdWx0LnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9WRVJTSU9OX01BUFBJTkdfVFlQRSwgCQkJCQkJCUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XQVJOSU5HKTsgLy8zLjAgTTcKLQkJIHJlc3VsdC5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVELCAJCQkJCQlKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORyk7Ci0JCSByZXN1bHQucHV0KEpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STSwgCQkJCQkJCUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XQVJOSU5HKTsKLQotCQkgcmVzdWx0LnB1dChKcGFWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCwgCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5JTkZPKTsKLQkJIHJlc3VsdC5wdXQoSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTLCAJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5JTkZPKTsKLQkJIHJldHVybiByZXN1bHQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlUHJlZmVyZW5jZUNvbnRlbnQoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCVBpeGVsQ29udmVydGVyIHBpeGVsQ29udmVydGVyID0gbmV3IFBpeGVsQ29udmVydGVyKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGEgY29udGFpbmVyIGJlY2F1c2UgdGhlIGNhbGxlciB3aWxsIHNldCB0aGUgR3JpZERhdGEgYW5kIHdlIG5lZWQKLQkJLy8gdG8gY2hhbmdlIHRoZSBoZWlnaHRIaW50IG9mIHRoZSBmaXJzdCBjaGlsZCBhbmQgd2UgYWxzbyBuZWVkIHRvIHNldCB0aGUKLQkJLy8gZm9udCBvdGhlcndpc2UgdGhlIGxheW91dCB3b24ndCBiZSBjYWxjdWxhdGVkIGNvcnJlY3RseQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJY29udGFpbmVyLnNldEZvbnQocGFyZW50LmdldEZvbnQoKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBDcmVhdGUgdGhlIG1haW4gY29tcG9zaXRlIG9mIHRoaXMgcGFnZQotCQl0aGlzLnNjcm9sbGFibGUgPSBuZXcgU2Nyb2xsZWRQYWdlQ29udGVudChjb250YWluZXIpOwotCi0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50ID0gcGl4ZWxDb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCk7Ci0JCXRoaXMuc2Nyb2xsYWJsZS5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQotCQkvLyBVcGRhdGUgdGhlIGxheW91dCBvZiB0aGUgU2Nyb2xsZWRQYWdlQ29udGVudCdzIGJvZHkKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoICA9IDA7Ci0KLQkJcGFyZW50ID0gdGhpcy5zY3JvbGxhYmxlLmdldEJvZHkoKTsKLQkJcGFyZW50LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIHRydWUpKTsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEFkZCBlYWNoIGV4cGFuZGFibGUgY2F0ZWdvcnkKLQkJYWRkUHJvamVjdExldmVsQ2F0ZWdvcnkocGFyZW50KTsKLQkJYWRkUGVyc2lzdGVuY2VVbml0TGV2ZWxDYXRlZ29yeShwYXJlbnQpOwotCQlhZGRUeXBlTGV2ZWxDYXRlZ29yeShwYXJlbnQpOwotCQlhZGRBdHRyaWJ1dGVMZXZlbENhdGVnb3J5KHBhcmVudCk7Ci0JCWFkZERhdGFiYXNlQ2F0ZWdvcnkocGFyZW50KTsKLQkJYWRkSW5oZXJpdGFuY2VTdHJhdGVneUNhdGVnb3J5KHBhcmVudCk7Ci0JCWFkZFF1ZXJpZXNHZW5lcmF0b3JzQ2F0ZWdvcnkocGFyZW50KTsKLQotCQkvLyBSZXN0b3JlIHRoZSBleHBhbnNpb24gc3RhdGVzCi0JCXJlc3RvcmVTZWN0aW9uRXhwYW5zaW9uU3RhdGVzKGdldERpYWxvZ1ByZWZlcmVuY2VzKCkpOwotCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZVNlY3Rpb25FeHBhbnNpb25TdGF0ZXMoSURpYWxvZ1NldHRpbmdzIHNldHRpbmdzKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gdGhpcy5leHBhbmRhYmxlUGFuZXMuc2l6ZSgpOyAtLWluZGV4ID49IDA7ICkgewotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZSBleHBhbmRhYmxlUGFuZSA9IHRoaXMuZXhwYW5kYWJsZVBhbmVzLmdldChpbmRleCk7Ci0KLQkJCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQkJLy8gT25seSBleHBhbmQgdGhlIGZpcnN0IG5vZGUgYnkgZGVmYXVsdAotCQkJCWV4cGFuZGFibGVQYW5lLnNldEV4cGFuZGVkKGluZGV4ID09IDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXhwYW5kYWJsZVBhbmUuc2V0RXhwYW5kZWQoc2V0dGluZ3MuZ2V0Qm9vbGVhbihTRVRUSU5HU19FWFBBTkRFRCArIGluZGV4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgUG9pbnQgY29tcHV0ZVNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmRvQ29tcHV0ZVNpemUoKTsKLQl9Ci0KLQkvL0luIGVhY2ggY2F0ZWdvcnkgYmVsb3csIGVudHJpZXMgYXJlIGxpc3RlZCBhbHBoYWJldGljYWxseS4KLQkvL0lmIGFkZGluZyBhIG5ldyBlbnRyeSwgcGxlYXNlIGFkZCBpdCB0byB0aGUgY29ycmVzcG9uZGluZyBjYXRlZ29yeSBhdCB0aGUgcmlnaHQgcGxhY2UuCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2plY3RMZXZlbENhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX0xFVkVMX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTk9fSlBBX1BST0pFQ1QsICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk5PX0pQQV9QUk9KRUNUKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTLCAJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX01VTFRJUExFX1BFUlNJU1RFTkNFX1VOSVRTKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX05PX1BFUlNJU1RFTkNFX1VOSVQsICAgICAgICAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9OT19QRVJTSVNURU5DRV9VTklUKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1hNTF9JTlZBTElEX0NPTlRFTlQsICAgICAgICAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9YTUxfSU5WQUxJRF9DT05URU5UKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1hNTF9VTlNVUFBPUlRFRF9DT05URU5ULCAJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1hNTF9VTlNVUFBPUlRFRF9DT05URU5UKTsgLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfTVVMVElQTEVfUEVSU0lTVEVOQ0VfWE1MLCAgICAgICAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX01VTFRJUExFX1BFUlNJU1RFTkNFX1hNTCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX0lOQUNUSVZFX0NPTk5FQ1RJT04sICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5BQ1RJVkVfQ09OTkVDVElPTik7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX0lOVkFMSURfQ09OTkVDVElPTiwgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9DT05ORUNUSU9OKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBST0pFQ1RfSU5WQUxJRF9MSUJSQVJZX1BST1ZJREVSLCAgICAgICAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QUk9KRUNUX0lOVkFMSURfTElCUkFSWV9QUk9WSURFUik7IC8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX05PX0NPTk5FQ1RJT04sICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTk9fQ09OTkVDVElPTik7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUk9KRUNUX05PX1BFUlNJU1RFTkNFX1hNTCwgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBST0pFQ1RfTk9fUEVSU0lTVEVOQ0VfWE1MKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlhNTF9WRVJTSU9OX05PVF9MQVRFU1QsICAgICAgICAgICAgICAgICAJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuWE1MX1ZFUlNJT05fTk9UX0xBVEVTVCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBlcnNpc3RlbmNlVW5pdExldmVsQ2F0ZWdvcnkoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXBhcmVudCA9IGFkZEV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTEVWRUxfQ0FURUdPUlkpOwotCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBQSU5HX0ZJTEVfRVhUUkFORU9VU19QRVJTSVNURU5DRV9VTklUX01FVEFEQVRBLCAgICAJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFBJTkdfRklMRV9FWFRSQU5FT1VTX1BFUlNJU1RFTkNFX1VOSVRfTUVUQURBVEEpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9UWVBFX0RVUExJQ0FURV9DTEFTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9EVVBMSUNBVEVfQ0xBU1MpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9EVVBMSUNBVEVfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9KQVJfRklMRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX0pBUl9GSUxFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfRFVQTElDQVRFX01BUFBJTkdfRklMRSwgICAgICAgICAgICAgICAgICAgICAgICAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0RVUExJQ0FURV9NQVBQSU5HX0ZJTEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9JTlZBTElEX0NMQVNTKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSU5WQUxJRF9NQVBQSU5HX0ZJTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX0lOVkFMSURfTUFQUElOR19GSUxFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfSkFSX0ZJTEVfREVQTE9ZTUVOVF9QQVRIX1dBUk5JTkcsICAgIAlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9KQVJfRklMRV9ERVBMT1lNRU5UX1BBVEhfV0FSTklORyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0NMQVNTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX0pBUl9GSUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9OT05FWElTVEVOVF9KQVJfRklMRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRSwgICAgICAgICAgICAgICAgICAgICAgCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PTkVYSVNURU5UX01BUFBJTkdfRklMRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1JFRFVOREFOVF9DTEFTUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfUkVEVU5EQU5UX0NMQVNTKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfQ0xBU1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1BFQ0lGSUVEX0pBUl9GSUxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfSkFSX0ZJTEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOQ0VfVU5JVF9VTlNQRUNJRklFRF9NQVBQSU5HX0ZJTEUsICAgICAgICAgICAgICAgICAgICAgIAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TUEVDSUZJRURfTUFQUElOR19GSUxFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfVU5TVVBQT1JURURfTUFQUElOR19GSUxFX0NPTlRFTlQsICAgICAgIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX1VOU1VQUE9SVEVEX01BUFBJTkdfRklMRV9DT05URU5UKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVHlwZUxldmVsQ2F0ZWdvcnkoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCXBhcmVudCA9IGFkZEV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTEVWRUxfQ0FURUdPUlkpOwotCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfTkFNRV9EVVBMSUNBVEVELAkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX05BTUVfRFVQTElDQVRFRCk7IC8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfTkFNRV9NSVNTSU5HLAkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9OQU1FX01JU1NJTkcpOyAvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX05PX1BLLAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9fUEspOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX05PTl9ST09UX0lEX0FUVFJJQlVURV9TUEVDSUZJRUQsCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9OT05fUk9PVF9JRF9BVFRSSUJVVEVfU1BFQ0lGSUVEKTsgLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9OT05fUk9PVF9JRF9DTEFTU19TUEVDSUZJRUQsCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX05PTl9ST09UX0lEX0NMQVNTX1NQRUNJRklFRCk7IC8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfQU5OT1RBVEVEX0JVVF9OT1RfSU5DTFVERURfSU5fUEVSU0lTVEVOQ0VfVU5JVCwJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9BTk5PVEFURURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklULAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9NQVBQRURfQlVUX05PVF9JTkNMVURFRF9JTl9QRVJTSVNURU5DRV9VTklUKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlJFU09MVkVEX0NMQVNTLAkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlJFU09MVkVEX0NMQVNTKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfVFlQRV9VTlNQRUNJRklFRF9DTEFTUywJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX1RZUEVfVU5TUEVDSUZJRURfQ0xBU1MpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVEFSR0VUX05PVF9BTl9FTUJFRERBQkxFLAkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9OT1RfQU5fRU1CRUREQUJMRSk7IC8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfQ0xBU1NfTUlTU0lOR19OT19BUkdfQ09OU1RSVUNUT1IsCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19DTEFTU19QUklWQVRFX05PX0FSR19DT05TVFJVQ1RPUiwJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfQ0xBU1NfUFJJVkFURV9OT19BUkdfQ09OU1RSVUNUT1IpOwkJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfRklOQUxfQ0xBU1MsCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19GSU5BTF9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQU5EX0VNQkVEREVEX0lEX0JPVEhfVVNFRCwJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BTkRfRU1CRURERURfSURfQk9USF9VU0VEKTsJLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfRE9FU19OT1RfRVhJU1QsCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX0RPRVNfTk9UX0VYSVNUKTsJLy8zLjIKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTUFQUElOR19EVVBMSUNBVEVfTUFUQ0gsCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX01BUFBJTkdfRFVQTElDQVRFX01BVENIKTsJLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTUFQUElOR19OT19NQVRDSCwJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19BVFRSSUJVVEVfTUFQUElOR19OT19NQVRDSCk7CS8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX05PX01BVENILAkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9OT19NQVRDSCk7CS8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX05PVF9QUklNQVJZX0tFWSwJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX05PVF9QUklNQVJZX0tFWSk7CS8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfQUdSRUUsCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX0FUVFJJQlVURV9UWVBFX0RPRVNfTk9UX0FHUkVFKTsJLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX0VRVUFMU19NRVRIT0QsCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfRVFVQUxTX01FVEhPRCk7CS8vMy4yCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0QsCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTUlTU0lOR19IQVNIQ09ERV9NRVRIT0QpOyAvLzMuMgotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SLAkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfTk9fQVJHX0NPTlNUUlVDVE9SKTsgLy8zLjIKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19NSVNTSU5HX1BVQkxJQ19OT19BUkdfQ09OU1RSVUNUT1IsCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX01JU1NJTkdfUFVCTElDX05PX0FSR19DT05TVFJVQ1RPUik7IC8vMy4yCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTkFNRV9FTVBUWSwJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTkFNRV9FTVBUWSk7CS8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfTk9UX0VYSVNULAkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfRVhJU1QpOwkvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9JTVBMRU1FTlRfU0VSSUFMSVpBQkxFLAkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX05PVF9JTVBMRU1FTlRfU0VSSUFMSVpBQkxFKTsJLy8zLjIKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfUFVCTElDLAkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19OT1RfUFVCTElDKTsJLy8zLjIKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19QUk9QRVJUWV9NRVRIT0RfTk9UX1BVQkxJQywJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19QUk9QRVJUWV9NRVRIT0RfTk9UX1BVQkxJQyk7CS8vMy4yCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfUkVERUZJTkVELAkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19SRURFRklORUQpOwkvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1JFUVVJUkVELAkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19JRF9DTEFTU19SRVFVSVJFRCk7CS8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfSURfQ0xBU1NfV0lUSF9NQVBTX0lELAkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX0lEX0NMQVNTX1dJVEhfTUFQU19JRCk7CS8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfTUFQU19JRF9BVFRSSUJVVEVfVFlQRV9ET0VTX05PVF9BR1JFRSwJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX01BUFNfSURfQVRUUklCVVRFX1RZUEVfRE9FU19OT1RfQUdSRUUpOwkvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTUywJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVFlQRV9NQVBQSU5HX01FTUJFUl9DTEFTUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UWVBFX01BUFBJTkdfTVVMVElQTEVfRU1CRURERURfSUQsCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfTVVMVElQTEVfRU1CRURERURfSUQpOwkvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVFlQRV9NQVBQSU5HX1BLX1JFREVGSU5FRF9JRF9BVFRSSUJVVEUsCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRZUEVfTUFQUElOR19QS19SRURFRklORURfSURfQVRUUklCVVRFKTsJLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRZUEVfTUFQUElOR19QS19SRURFRklORURfSURfQ0xBU1MsCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UWVBFX01BUFBJTkdfUEtfUkVERUZJTkVEX0lEX0NMQVNTKTsJLy8zLjAgTTcKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlTGV2ZWxDYXRlZ29yeShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZKTsKLQkJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFLCAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfRE9FU19OT1RfRVhJU1QsCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX0RPRVNfTk9UX0VYSVNUKTsgLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTk9UX0RFRklORUQsCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTk9UX0RFRklORUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU1CRURERURfSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9BVFRSSUJVVEVfT1ZFUlJJREVTX1NQRUNJRklFRCwJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVNQkVEREVEX0lEX01BUFBJTkdfTUFQUEVEX0JZX1JFTEFUSU9OU0hJUF9BTkRfQVRUUklCVVRFX09WRVJSSURFU19TUEVDSUZJRUQpOyAvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9DT0xVTU5fU1BFQ0lGSUVELAkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSURfTUFQUElOR19NQVBQRURfQllfUkVMQVRJT05TSElQX0FORF9DT0xVTU5fU1BFQ0lGSUVEKTsgCS8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBTX0lEX1ZBTFVFX0lOVkFMSUQsCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQU19JRF9WQUxVRV9JTlZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUFNfSURfVkFMVUVfTk9UX1JFU09MVkVELAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUFNfSURfVkFMVUVfTk9UX1JFU09MVkVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUFNfSURfVkFMVUVfTk9UX1NQRUNJRklFRCwJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBTX0lEX1ZBTFVFX05PVF9TUEVDSUZJRUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSwJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQUElOR19JTlZBTElEX01BUFBFRF9CWSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTLAkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX01BUFBFRF9CWV9PTl9CT1RIX1NJREVTKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUFBJTkdfVU5SRVNPTFZFRF9NQVBQRURfQlksCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBQSU5HX1VOUkVTT0xWRURfTUFQUEVEX0JZKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk9SREVSX0NPTFVNTl9BTkRfT1JERVJfQllfQk9USF9TUEVDSUZJRUQsCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5PUkRFUl9DT0xVTU5fQU5EX09SREVSX0JZX0JPVEhfU1BFQ0lGSUVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEUsCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEUpOyAvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfRklOQUxfRklFTEQsCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0ZJRUxEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0ZJTkFMX0dFVFRFUiwJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9GSU5BTF9HRVRURVIpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5IRVJJVEVEX0FUVFJJQlVURVNfTk9UX1NVUFBPUlRFRCwgCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTkhFUklURURfQVRUUklCVVRFU19OT1RfU1VQUE9SVEVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORywJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfTUFQUElORyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUFBJTkdfVFlQRSwJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBQSU5HX1RZUEUpOyAvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBfS0VZX1RZUEUsCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBfS0VZX1RZUEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfSU5WQUxJRF9WRVJTSU9OX01BUFBJTkdfVFlQRSwJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTlRfQVRUUklCVVRFX0lOVkFMSURfVkVSU0lPTl9NQVBQSU5HX1RZUEUpOyAvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfUFVCTElDX0ZJRUxELAkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9QVUJMSUNfRklFTEQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5SRVNPTFZFRF9OQU1FLAkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5QRVJTSVNURU5UX0FUVFJJQlVURV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSwJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUEVSU0lTVEVOVF9BVFRSSUJVVEVfVU5TUEVDSUZJRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFksCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfSVNfTk9UX0FOX0VOVElUWSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVELAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9OT1RfRVhJU1QsCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFSR0VUX0VOVElUWV9OT1RfRVhJU1QpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCwJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9DTEFTU19OT1RfREVGSU5FRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBfS0VZX0NMQVNTX05PVF9FWElTVCwJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9DTEFTU19OT1RfRVhJU1QpOwotCi0JCXBhcmVudCA9IGFkZFN1YkV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklNUExJRURfQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZKTsKLQkJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX0RPRVNfTk9UX0VYSVNULAkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX0RPRVNfTk9UX0VYSVNUKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTVVTVF9CRV9FTUJFRERBQkxFX09SX0JBU0lDX1RZUEUsCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fVEFSR0VUX0NMQVNTX01VU1RfQkVfRU1CRUREQUJMRV9PUl9CQVNJQ19UWVBFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9UQVJHRVRfQ0xBU1NfTk9UX0RFRklORUQsCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfRUxFTUVOVF9DT0xMRUNUSU9OX1RBUkdFVF9DTEFTU19OT1RfREVGSU5FRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX0lTX05PVF9BTl9FTlRJVFksCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfVEFSR0VUX0VOVElUWV9JU19OT1RfQU5fRU5USVRZKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX1RBUkdFVF9FTlRJVFlfTk9UX0RFRklORUQsCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9UQVJHRVRfRU5USVRZX05PVF9ERUZJTkVEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ0xBU1NfTk9UX0RFRklORUQsCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0NMQVNTX05PVF9ERUZJTkVEKTsJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZBTElEX1RFTVBPUkFMX01BUF9LRVlfVFlQRSwJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQX0tFWV9UWVBFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0VMRU1FTlRfQ09MTEVDVElPTl9JTlZBTElEX1ZBTFVFX1RZUEUsCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9FTEVNRU5UX0NPTExFQ1RJT05fSU5WQUxJRF9WQUxVRV9UWVBFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0lOVkFMSURfVEVNUE9SQUxfTUFQUElOR19UWVBFLAkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WQUxJRF9URU1QT1JBTF9NQVBQSU5HX1RZUEUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGREYXRhYmFzZUNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuREFUQUJBU0VfQ0FURUdPUlkpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKSk7Ci0KLQkJYWRkVGFibGVDYXRlZ29yeShwYXJlbnQpOwotCQlhZGRDb2x1bW5DYXRlZ29yeShwYXJlbnQpOwotCQlhZGRPdmVycmlkZXNDYXRlZ29yeShwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRUYWJsZUNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCXBhcmVudCA9IGFkZEV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRBQkxFX0NBVEVHT1JZKTsKLQkJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkNPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xMRUNUSU9OX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIAlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkpPSU5fVEFCTEVfVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlNFQ09OREFSWV9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuU0VDT05EQVJZX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlRBQkxFX1VOUkVTT0xWRURfQ0FUQUxPRyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEpOwotCi0JCXBhcmVudCA9IGFkZFN1YkV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklNUExJRURfQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MTEVDVElPTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTExFQ1RJT05fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0csICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX1NDSEVNQSwgICAgICAgICAgICAgICAgICAgICAgICAgSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uQ2F0ZWdvcnkoQ29tcG9zaXRlIHBhcmVudCkgewkKLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQ09MVU1OX0NBVEVHT1JZKTsKLQkJCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5DT0xVTU5fVU5SRVNPTFZFRF9UQUJMRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQ09MVU1OX1VOUkVTT0xWRURfVEFCTEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgICAgICAgICAgICAgICAgICAgCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgICAgICAgICAgICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsICAgICAgICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkpPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkpPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7IC8vIDMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuT1JERVJfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk9SREVSX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsICAgICAgICAgICAgICAgICAJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLAlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAJIAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsICAgICAgICAgICAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsICAgICAgICAgICAJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuTUFQX0tFWV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgICAgICAJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBfS0VZX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAgICAgICBKcGFWYWxpZGF0aW9uTWVzc2FnZXMuTUFQX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgIAkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLk1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLk1BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAgICAgICAgICAgCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0KLQkJcGFyZW50ID0gYWRkU3ViRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSU1QTElFRF9BVFRSSUJVVEVfTEVWRUxfQ0FURUdPUlkpOwotCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAgICAgIAkJCQkgICAgICAgICAgICAgICAgICAgCSAJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAgICAgIAkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgICAgICAJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywJCSAJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsgLy8gMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PUkRFUl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX1NFQ09OREFSWV9UQUJMRV9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfU0VDT05EQVJZX1RBQkxFX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9TRUNPTkRBUllfVEFCTEVfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIAkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX1BSSU1BUllfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9QUklNQVJZX0tFWV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX1JFRkVSRU5DRURfQ09MVU1OX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX01BUF9LRVlfSk9JTl9DT0xVTU5TLCAJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX01BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9NQVBfS0VZX0pPSU5fQ09MVU1OUywgCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfTUFQX0tFWV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE92ZXJyaWRlc0NhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsJCi0KLQkJcGFyZW50ID0gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuT1ZFUlJJREVTX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FLCAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkFUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUsICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9UWVBFLCAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkFUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX1RZUEUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuQVRUUklCVVRFX09WRVJSSURFX01BUFBFRF9CWV9SRUxBVElPTlNISVBfQU5EX1NQRUNJRklFRCwgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuQVRUUklCVVRFX09WRVJSSURFX0RFUklWRURfQU5EX1NQRUNJRklFRCk7IC8vMy4wIE03Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TLCAJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMsSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUywgCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCAJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1VOUkVTT0xWRURfUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9DQVRBTE9HLCAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX0NBVEFMT0cpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfTkFNRSwgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9UQUJMRV9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX1RBQkxFX1VOUkVTT0xWRURfU0NIRU1BLCAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fVEFCTEVfVU5SRVNPTFZFRF9TQ0hFTUEpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUsICAgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FKTsKLQotCi0JCXBhcmVudCA9IGFkZFN1YkV4cGFuZGFibGVTZWN0aW9uKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLklNUExJRURfQVRUUklCVVRFX0xFVkVMX0NBVEVHT1JZKTsKLQotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WQUxJRF9OQU1FLCAgICAgICAgICAgICAgICAgIAkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZBTElEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TLCAJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0lOVkVSU0VfSk9JTl9DT0xVTU5TKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9JTlZFUlNFX0pPSU5fQ09MVU1OUywgCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9JTlZFUlNFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSU5WRVJTRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsIAkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElELCAgICAgICAgICAgICAJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVEFCTEVfTk9UX1ZBTElEKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FLCAJCQkJCQkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0lOVkVSU0VfSk9JTl9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX05BTUVfTVVTVF9CRV9TUEVDSUZJRURfTVVMVElQTEVfSk9JTl9DT0xVTU5TLCAJCQkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVNTT0NJQVRJT05fT1ZFUlJJREVfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRV9NVVNUX0JFX1NQRUNJRklFRF9NVUxUSVBMRV9KT0lOX0NPTFVNTlMsIEpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FX01VU1RfQkVfU1BFQ0lGSUVEX01VTFRJUExFX0pPSU5fQ09MVU1OUyk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsIAkJCQkJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgICAgICAgICAgICAgIAkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FTU09DSUFUSU9OX09WRVJSSURFX0pPSU5fQ09MVU1OX1RBQkxFX05PVF9WQUxJRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsIAkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9BU1NPQ0lBVElPTl9PVkVSUklERV9KT0lOX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQsICAgICAgICAgICAgICAgICAgCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfQVRUUklCVVRFX09WRVJSSURFX0lOVkFMSURfTkFNRSwgICAgICAgICAgICAgICAgICAJCQkJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX0FUVFJJQlVURV9PVkVSUklERV9JTlZBTElEX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1RBQkxFX05PVF9WQUxJRCwgCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9UQUJMRV9OT1RfVkFMSUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FLCAgICAgICAgICAgICAgICAgIAkJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9BVFRSSUJVVEVfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfSU5WQUxJRF9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfQVRUUklCVVRFX01BUF9LRVlfQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9VTlJFU09MVkVEX05BTUUsICAgICAgICAgICAgICAgICAgCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5WSVJUVUFMX0FUVFJJQlVURV9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsgLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlZJUlRVQUxfTUFQX0tFWV9BVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwgICAgICAgICAgICAgICAgICAJCQkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuVklSVFVBTF9NQVBfS0VZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fVU5SRVNPTFZFRF9OQU1FKTsgLy8zLjAgTTcKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSW5oZXJpdGFuY2VTdHJhdGVneUNhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5JTkhFUklUQU5DRV9DQVRFR09SWSk7Ci0KLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkRJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSwJCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkRJU0NSSU1JTkFUT1JfQ09MVU1OX1VOUkVTT0xWRURfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfQUJTVFJBQ1RfRElTQ1JJTUlOQVRPUl9WQUxVRV9ERUZJTkVELAkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9BQlNUUkFDVF9ESVNDUklNSU5BVE9SX1ZBTFVFX0RFRklORUQpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFLAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuRU5USVRZX0FCU1RSQUNUX1RBQkxFX1BFUl9DTEFTU19ERUZJTkVTX1RBQkxFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9OT05fUk9PVF9ESVNDUklNSU5BVE9SX0NPTFVNTl9ERUZJTkVELAkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfTk9OX1JPT1RfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfU0lOR0xFX1RBQkxFX0RFU0NFTkRBTlRfREVGSU5FU19UQUJMRSwJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9TSU5HTEVfVEFCTEVfREVTQ0VOREFOVF9ERUZJTkVTX1RBQkxFKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCwJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUJMRV9QRVJfQ0xBU1NfRElTQ1JJTUlOQVRPUl9DT0xVTU5fREVGSU5FRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCwJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX0RJU0NSSU1JTkFUT1JfVkFMVUVfREVGSU5FRCk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STSwJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9QT1JUQUJMRV9PTl9QTEFURk9STSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0sCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5FTlRJVFlfVEFCTEVfUEVSX0NMQVNTX05PVF9TVVBQT1JURURfT05fUExBVEZPUk0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRRdWVyaWVzR2VuZXJhdG9yc0NhdGVnb3J5KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlwYXJlbnQgPSBhZGRFeHBhbmRhYmxlU2VjdGlvbihwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5RVUVSSUVTX0dFTkVSQVRPUlNfQ0FURUdPUlkpOwotCi0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5HRU5FUkFUT1JfRFVQTElDQVRFX05BTUUsICAgICAgICAgICAgIAkJCQlKcGFWYWxpZGF0aW9uTWVzc2FnZXMuR0VORVJBVE9SX0RVUExJQ0FURV9OQU1FKTsKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLkdFTkVSQVRPUl9OQU1FX1VOREVGSU5FRCwgCQkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5HRU5FUkFUT1JfTkFNRV9VTkRFRklORUQpOyAvLzMuMCBNNwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSURfTUFQUElOR19VTlJFU09MVkVEX0dFTkVSQVRPUl9OQU1FLCAJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5JRF9NQVBQSU5HX1VOUkVTT0xWRURfR0VORVJBVE9SX05BTUUpOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuSlBRTF9RVUVSWV9WQUxJREFUSU9OLCAgICAgICAgICAgICAgICAJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5KUFFMX1FVRVJZX1ZBTElEQVRJT04pOwotCQlhZGRMYWJlbGVkQ29tYm8ocGFyZW50LCBKcHRVaVZhbGlkYXRpb25QcmVmZXJlbmNlTWVzc2FnZXMuUVVFUllfRFVQTElDQVRFX05BTUUsICAgICAgICAgICAgICAgIAkJCQkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5RVUVSWV9EVVBMSUNBVEVfTkFNRSk7Ci0JCWFkZExhYmVsZWRDb21ibyhwYXJlbnQsIEpwdFVpVmFsaWRhdGlvblByZWZlcmVuY2VNZXNzYWdlcy5RVUVSWV9OQU1FX1VOREVGSU5FRCwgICAgICAgICAgICAgICAgCQkJCQkJSnBhVmFsaWRhdGlvbk1lc3NhZ2VzLlFVRVJZX05BTUVfVU5ERUZJTkVEKTsgLy8zLjAgTTcKLQkJYWRkTGFiZWxlZENvbWJvKHBhcmVudCwgSnB0VWlWYWxpZGF0aW9uUHJlZmVyZW5jZU1lc3NhZ2VzLlFVRVJZX1NUQVRFTUVOVF9VTkRFRklORUQsICAgICAgICAgICAgICAgIAkJCUpwYVZhbGlkYXRpb25NZXNzYWdlcy5RVUVSWV9TVEFURU1FTlRfVU5ERUZJTkVEKTsgLy8zLjAgTTcKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhZGRFeHBhbmRhYmxlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCB0ZXh0LCBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBhZGRTdWJFeHBhbmRhYmxlU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gYWRkRXhwYW5kYWJsZVNlY3Rpb24ocGFyZW50LCB0ZXh0LCBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBhZGRzIHRvIHRoZSBnaXZlbiA8Y29kZT5Db21wb3NpdGU8L2NvZGU+IGFuIGV4cGFuZGFibGUgcGFuZQotCSAqIHdoZXJlIGl0cyBjb250ZW50IGNhbiBiZSBzaG93biBvciBoaWRkZW4gZGVwZW5kaW5nIG9uIHRoZSBleHBhbnNpb24gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgY29udGFpbmVyCi0JICogQHBhcmFtIHRleHQgVGhlIHRpdGxlIG9mIHRoZSBleHBhbmRhYmxlIHNlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBjb250YWluZXIgdG8gd2hpY2ggd2lkZ2V0cyBjYW4gYmUgYWRkZWQsIHdoaWNoIGlzIGEgY2hpbGQgb2YKLQkgKiB0aGUgZXhwYW5kYWJsZSBwYW5lCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgYWRkRXhwYW5kYWJsZVNlY3Rpb24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIEdyaWREYXRhIGdyaWREYXRhKSB7Ci0JCUV4cGFuZGFibGVDb21wb3NpdGUgZXhwYW5kYWJsZVBhbmUgPSBuZXcgRXhwYW5kYWJsZUNvbXBvc2l0ZSgKLQkJCXBhcmVudCwKLQkJCVNXVC5OT05FLAotCQkJRXhwYW5kYWJsZUNvbXBvc2l0ZS5UV0lTVElFIHwgRXhwYW5kYWJsZUNvbXBvc2l0ZS5DTElFTlRfSU5ERU5UCi0JCSk7Ci0KLQkJZXhwYW5kYWJsZVBhbmUuc2V0VGV4dCh0ZXh0KTsKLQkJZXhwYW5kYWJsZVBhbmUuc2V0RXhwYW5kZWQoZmFsc2UpOwotCQlleHBhbmRhYmxlUGFuZS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldEJvbGQoSkZhY2VSZXNvdXJjZXMuRElBTE9HX0ZPTlQpKTsKLQkJZXhwYW5kYWJsZVBhbmUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWV4cGFuZGFibGVQYW5lLmFkZEV4cGFuc2lvbkxpc3RlbmVyKGJ1aWxkRXhwYW5zaW9uTGlzdGVuZXIoKSk7Ci0KLQkJdGhpcy5zY3JvbGxhYmxlLmFkYXB0Q2hpbGQoZXhwYW5kYWJsZVBhbmUpOwotCQl0aGlzLmV4cGFuZGFibGVQYW5lcy5hZGQoZXhwYW5kYWJsZVBhbmUpOwotCi0JCXBhcmVudCA9IG5ldyBDb21wb3NpdGUoZXhwYW5kYWJsZVBhbmUsIFNXVC5OT05FKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlleHBhbmRhYmxlUGFuZS5zZXRDbGllbnQocGFyZW50KTsKLQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIGFkZHMgdG8gdGhlIGdpdmVuIHBhcmVudCBhIGxhYmVsZWQgY29tYm8gd2hlcmUgdGhlIHBvc3NpYmxlCi0JICogY2hvaWNlcyBhcmUgIklnbm9yZSIsICJFcnJvciIgYW5kICJXYXJuaW5nIi4KLQkgKgotCSAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCB0byB3aGljaCB0aGUgd2lkZ2V0cyBhcmUgYWRkZWQKLQkgKiBAcGFyYW0gbGFiZWxUZXh0IFRoZSB0ZXh0IGxhYmVsbGluZyB0aGUgY29tYm8KLQkgKiBAcGFyYW0gcHJlZmVyZW5jZUtleSBUaGUga2V5IHVzZWQgdG8gcmV0cmlldmUgYW5kIHRvIHN0b3JlIHRoZSB2YWx1ZQotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmFsaWRhdGlvbiBwcm9ibGVtCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExhYmVsZWRDb21ibyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWxUZXh0LCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWxhYmVsLnNldFRleHQobGFiZWxUZXh0KTsKLQotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyh0aGlzLnNldmVyaXR5RGlzcGxheVN0cmluZ3MpOwotCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJY29tYm8uc2V0RGF0YShQUkVGRVJFTkNFX0tFWSwgcHJlZmVyZW5jZUtleSk7Ci0JCWNvbWJvLnNlbGVjdChjb252ZXJ0UHJlZmVyZW5jZUtleVRvQ29tYm9JbmRleChwcmVmZXJlbmNlS2V5KSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkQ29tYm9TZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQotCQl0aGlzLnNjcm9sbGFibGUuYWRhcHRDaGlsZChjb21ibyk7Ci0JCXRoaXMuY29tYm9zLmFkZChjb21ibyk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbWJvU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUNvbWJvIGNvbWJvID0gKENvbWJvKSBlLndpZGdldDsKLQkJCQlTdHJpbmcgcHJlZmVyZW5jZUtleSA9IChTdHJpbmcpIGNvbWJvLmdldERhdGEoUFJFRkVSRU5DRV9LRVkpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGNvbnZlcnRUb1ByZWZlcmVuY2VWYWx1ZShjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQlKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UudGhpcy5zZXZlcml0eUxldmVscy5wdXQocHJlZmVyZW5jZUtleSwgdmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgRXhwYW5zaW9uQWRhcHRlciBidWlsZEV4cGFuc2lvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IEV4cGFuc2lvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGV4cGFuc2lvblN0YXRlQ2hhbmdlZChFeHBhbnNpb25FdmVudCBlKSB7Ci0JCQkJSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLnRoaXMuZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGJ1aWxkU2V2ZXJpdHlEaXNwbGF5U3RyaW5ncygpIHsKLQkJU3RyaW5nW10gc2V2ZXJpdGllcyA9IG5ldyBTdHJpbmdbNF07Ci0JCXNldmVyaXRpZXNbRVJST1JfSU5ERVhdICAgPSBKcHRVaU1lc3NhZ2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9FcnJvcjsKLQkJc2V2ZXJpdGllc1tXQVJOSU5HX0lOREVYXSA9IEpwdFVpTWVzc2FnZXMuSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlX1dhcm5pbmc7Ci0JCXNldmVyaXRpZXNbSU5GT19JTkRFWF0gICAgPSBKcHRVaU1lc3NhZ2VzLkpwYVByb2JsZW1TZXZlcml0aWVzUGFnZV9JbmZvOwotCQlzZXZlcml0aWVzW0lHTk9SRV9JTkRFWF0gID0gSnB0VWlNZXNzYWdlcy5KcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2VfSWdub3JlOwotCQlyZXR1cm4gc2V2ZXJpdGllczsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGNvbnZlcnRQcmVmZXJlbmNlS2V5VG9Db21ib0luZGV4KFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCXJldHVybiBjb252ZXJ0UHJlZmVyZW5jZVZhbHVlVG9Db21ib0luZGV4KGdldFByZWZlcmVuY2VWYWx1ZShwcmVmZXJlbmNlS2V5KSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlVmFsdWUoU3RyaW5nIHByZWZlcmVuY2VLZXkpIHsKLQkJU3RyaW5nIHByZWZlcmVuY2UgPSBudWxsOwotCQlpZiAoaXNQcm9qZWN0UHJlZmVyZW5jZVBhZ2UoKSAmJiBoYXNQcm9qZWN0U3BlY2lmaWNPcHRpb25zKGdldFByb2plY3QoKSkpIHsgLy91c2VQcm9qZWN0U2V0dGluZ3MoKSB3b24ndCB3b3JrIHNpbmNlIHRoZSBwYWdlIGlzIGJlaW5nIGJ1aWx0Ci0JCQlwcmVmZXJlbmNlID0gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLmdldFByb2plY3RMZXZlbFByb2JsZW1QcmVmZXJlbmNlKGdldFByb2plY3QoKSwgcHJlZmVyZW5jZUtleSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvL2Rvbid0IGdldCB0aGUgd29ya3NwYWNlIHByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvamVjdCBoYXMgb3ZlcnJpZGRlbiB3b3Jrc3BhY2UgcHJlZmVyZW5jZXMKLQkJCXByZWZlcmVuY2UgPSBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuZ2V0V29ya3NwYWNlTGV2ZWxQcm9ibGVtUHJlZmVyZW5jZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQlpZiAocHJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlwcmVmZXJlbmNlID0gZ2V0RGVmYXVsdFByZWZlcmVuY2VWYWx1ZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQlyZXR1cm4gcHJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGRlZmF1bHQgc2V2ZXJpdHkgb3IgRVJST1IgaWYgbm8gZGVmYXVsdCBleGlzdHMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UHJlZmVyZW5jZVZhbHVlKFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCVN0cmluZyBwcmVmZXJlbmNlID0gdGhpcy5kZWZhdWx0U2V2ZXJpdGllcy5nZXQocHJlZmVyZW5jZUtleSk7Ci0JCXJldHVybiBwcmVmZXJlbmNlID09IG51bGwgPyBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRVJST1IgOiBwcmVmZXJlbmNlOwotCX0KLQotCXByb3RlY3RlZCBpbnQgY29udmVydFByZWZlcmVuY2VWYWx1ZVRvQ29tYm9JbmRleChTdHJpbmcgcHJlZmVyZW5jZVZhbHVlKSB7Ci0JCWlmIChKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRVJST1IuZXF1YWxzKHByZWZlcmVuY2VWYWx1ZSkpIHsKLQkJCXJldHVybiBFUlJPUl9JTkRFWDsKLQkJfQotCQlpZiAoSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldBUk5JTkcuZXF1YWxzKHByZWZlcmVuY2VWYWx1ZSkpIHsKLQkJCXJldHVybiBXQVJOSU5HX0lOREVYOwotCQl9Ci0JCWlmIChKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuSU5GTy5lcXVhbHMocHJlZmVyZW5jZVZhbHVlKSkgewotCQkJcmV0dXJuIElORk9fSU5ERVg7Ci0JCX0KLQkJaWYgKEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5JR05PUkUuZXF1YWxzKHByZWZlcmVuY2VWYWx1ZSkpIHsKLQkJCXJldHVybiBJR05PUkVfSU5ERVg7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29udmVydFRvUHJlZmVyZW5jZVZhbHVlKGludCBzZWxlY3Rpb25JbmRleCkgewotCQlzd2l0Y2ggKHNlbGVjdGlvbkluZGV4KSB7Ci0JCQljYXNlIEVSUk9SX0lOREVYOiAgIHJldHVybiBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuRVJST1I7Ci0JCQljYXNlIFdBUk5JTkdfSU5ERVg6IHJldHVybiBKcGFWYWxpZGF0aW9uUHJlZmVyZW5jZXMuV0FSTklORzsKLQkJCWNhc2UgSU5GT19JTkRFWDogICAgcmV0dXJuIEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5JTkZPOwotCQkJY2FzZSBJR05PUkVfSU5ERVg6ICByZXR1cm4gSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLklHTk9SRTsKLQkJCWRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXZhbGlkYXRlcyB0aGUgbGF5b3V0IGluIG9yZGVyIHRvIHNob3cgb3IgaGlkZSB0aGUgdmVydGljYWwgc2Nyb2xsIGJhcgotCSAqIGFmdGVyIGEgc2VjdGlvbiB3YXMgZWl0aGVyIGV4cGFuZGVkIG9yIGNvbGxhcHNlZC4gVGhpcyB1bmZvcnR1bmF0ZWx5IGRvZXMKLQkgKiBub3QgaGFwcGVuIGF1dG9tYXRpY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhwYW5zaW9uU3RhdGVDaGFuZ2VkKCkgewotCQl0aGlzLnNjcm9sbGFibGUucmVmbG93KHRydWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpIHsKLQkJcmV0dXJuIEpQVF9QUkVGRVJFTkNFU19QUk9CTEVNX1NFVkVSSVRJRVNfSUQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eVBhZ2VJRCgpIHsKLQkJcmV0dXJuIEpQVF9QUk9QRVJUWV9QQUdFU19QUk9CTEVNX1NFVkVSSVRJRVNfSUQ7Ci0JfQotCi0JcHJvdGVjdGVkIElFY2xpcHNlUHJlZmVyZW5jZXMgZ2V0UHJvamVjdFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0UHJvamVjdFByZWZlcmVuY2VzKHByb2plY3QpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGhhc1Byb2plY3RTcGVjaWZpY09wdGlvbnMoSVByb2plY3QgcHJvamVjdCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIHByb2plY3RQcmVmZXJlbmNlcyA9IGdldFByb2plY3RQcmVmZXJlbmNlcyhwcm9qZWN0KTsKLQkJcmV0dXJuIHByb2plY3RQcmVmZXJlbmNlcy5nZXRCb29sZWFuKEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XT1JLU1BBQ0VfUFJFRkVSRU5DRVNfT1ZFUlJJREVOLCBmYWxzZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJLy90aGlzIGNhbGwgd291bGQgYmUgcmVkdW5kYW50IG9uIHByb2plY3QgcHJlZmVyZW5jZSBwYWdlIC0gYnVnIGluIHRoZSBKRFQgc3VwZXJjbGFzcwotCQlpZiAoIWlzUHJvamVjdFByZWZlcmVuY2VQYWdlKCkpIHsKLQkJCXJldmVydFRvRGVmYXVsdCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlUHJvamVjdFNwZWNpZmljU2V0dGluZ3MoYm9vbGVhbiB1c2VQcm9qZWN0U3BlY2lmaWNTZXR0aW5ncykgewotCQlzdXBlci5lbmFibGVQcm9qZWN0U3BlY2lmaWNTZXR0aW5ncyh1c2VQcm9qZWN0U3BlY2lmaWNTZXR0aW5ncyk7Ci0JCWlmIChnZXREZWZhdWx0c0J1dHRvbigpID09IG51bGwpIHsKLQkJCS8vQEhhY2soIklmIHRoZSBkZWZhdWx0cyBidXR0b24gaXMgbnVsbCB0aGUgY29udHJvbCBpcyBjdXJyZW50bHkgYmVpbmcgYnVpbHQsIiArCi0JCQkvLyAgICAgICJvdGhlcndpc2UgdGhlICdlbmFibGUgcHJvamVjdCBzcGVjaWZpYyBzZXR0aW5ncycgY2hlY2tib3ggaXMgYmVpbmcgcHJlc3NlZCIpCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLmhhc1Byb2plY3RTcGVjaWZpY1ByZWZlcmVuY2VzID0gQm9vbGVhbi52YWx1ZU9mKHVzZVByb2plY3RTcGVjaWZpY1NldHRpbmdzKTsKLQotCQkvL3NldCBhbGwgc3BlY2lmaWVkIHdvcmtzcGFjZSBwcmVmZXJlbmNlcyBpbiB0aGUgcHJvamVjdCBwcmVmZXJlbmNlcwotCQlpZiAodXNlUHJvamVjdFNwZWNpZmljU2V0dGluZ3MpewotCQkJdGhpcy5vdmVycmlkZVdvcmtzcGFjZVByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJZWxzZSB7Ly9yZW1vdmUgYW55IHByb2plY3Qgc3BlY2lmaWMgc2V0dGluZ3MgaWYgc2V0IHRvIGZhbHNlCi0JCQl0aGlzLnJldmVydFRvRGVmYXVsdCgpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKSB7Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkRvbid0IGNhbGwgdGhpcywgc2VlIGVuYWJsZVByb2plY3RTcGVjaWZpY1NldHRpbmdzIGZvciB0aGUgaGFjayB0aGF0IGxvb2tzIGZvciB0aGUgZGVmYXVsdHNCdXR0b24gYmVpbmcgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmV2ZXJ0VG9EZWZhdWx0KCkgewotCQlmb3IgKENvbWJvIGNvbWJvIDogdGhpcy5jb21ib3MpIHsKLQkJCVN0cmluZyBwcmVmZXJlbmNlS2V5ID0gKFN0cmluZykgY29tYm8uZ2V0RGF0YShQUkVGRVJFTkNFX0tFWSk7Ci0JCQljb21iby5zZWxlY3QoY29udmVydFByZWZlcmVuY2VWYWx1ZVRvQ29tYm9JbmRleChnZXREZWZhdWx0UHJlZmVyZW5jZVZhbHVlKHByZWZlcmVuY2VLZXkpKSk7Ci0JCQkvL1VJIHdpbGwgc2hvdyB0aGUgZGVmYXVsdHMgZnJvbSB0aGUgd29ya3NwYWNlLCBidXQgc2V0IGFsbCBwcmVmZXJlbmNlcwotCQkJLy90byBudWxsIHNvIHRoZXkgd2lsbCBiZSBkZWxldGVkIGZyb20gcHJvamVjdCBwcmVmZXJlbmNlcwotCQkJdGhpcy5zZXZlcml0eUxldmVscy5wdXQocHJlZmVyZW5jZUtleSwgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBvdmVycmlkZVdvcmtzcGFjZVByZWZlcmVuY2VzKCkgewotCQlmb3IgKENvbWJvIGNvbWJvIDogdGhpcy5jb21ib3MpIHsKLQkJCVN0cmluZyBwcmVmZXJlbmNlS2V5ID0gKFN0cmluZykgY29tYm8uZ2V0RGF0YShQUkVGRVJFTkNFX0tFWSk7Ci0JCQlTdHJpbmcgd29ya3NwYWNlUHJlZmVyZW5jZSA9IEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5nZXRXb3Jrc3BhY2VMZXZlbFByb2JsZW1QcmVmZXJlbmNlKHByZWZlcmVuY2VLZXkpOwotCQkJU3RyaW5nIGRlZmF1bHRQcmVmZXJlbmNlID0gZ2V0RGVmYXVsdFByZWZlcmVuY2VWYWx1ZShwcmVmZXJlbmNlS2V5KTsKLQkJCWlmICh3b3Jrc3BhY2VQcmVmZXJlbmNlICE9IG51bGwgJiYgIXdvcmtzcGFjZVByZWZlcmVuY2UuZXF1YWxzKGRlZmF1bHRQcmVmZXJlbmNlKSkgewotCQkJCWNvbWJvLnNlbGVjdChjb252ZXJ0UHJlZmVyZW5jZVZhbHVlVG9Db21ib0luZGV4KHdvcmtzcGFjZVByZWZlcmVuY2UpKTsKLQkJCQkvL3NpbGx5IGNvbWJvIGRvZXNuJ3QgZmlyZSBhIHNlbGVjdGlvbiBldmVudCwgc28gd2UgY2FuJ3QgZXhwZWN0IG91ciBsaXN0ZW5lciB0byBzZXQgdGhpcwotCQkJCXRoaXMuc2V2ZXJpdHlMZXZlbHMucHV0KHByZWZlcmVuY2VLZXksIHdvcmtzcGFjZVByZWZlcmVuY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29tYm8uc2VsZWN0KGNvbnZlcnRQcmVmZXJlbmNlVmFsdWVUb0NvbWJvSW5kZXgoZGVmYXVsdFByZWZlcmVuY2UpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogT0svUmV2ZXJ0L0FwcGx5IGJlaGF2aW9yICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJc3VwZXIucGVyZm9ybU9rKCk7Ci0JCWlmICh0aGlzLmhhc1Byb2plY3RTcGVjaWZpY1ByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCUlFY2xpcHNlUHJlZmVyZW5jZXMgcHJvamVjdFByZWZlcmVuY2VzID0gZ2V0UHJvamVjdFByZWZlcmVuY2VzKGdldFByb2plY3QoKSk7Ci0JCQlpZiAodGhpcy5oYXNQcm9qZWN0U3BlY2lmaWNQcmVmZXJlbmNlcy5ib29sZWFuVmFsdWUoKSkgewotCQkJCXByb2plY3RQcmVmZXJlbmNlcy5wdXRCb29sZWFuKEpwYVZhbGlkYXRpb25QcmVmZXJlbmNlcy5XT1JLU1BBQ0VfUFJFRkVSRU5DRVNfT1ZFUlJJREVOLCB0cnVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXByb2plY3RQcmVmZXJlbmNlcy5yZW1vdmUoSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLldPUktTUEFDRV9QUkVGRVJFTkNFU19PVkVSUklERU4pOwotCQkJfQotCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLmZsdXNoKHByb2plY3RQcmVmZXJlbmNlcyk7Ci0JCX0KLQkJZm9yIChTdHJpbmcgdmFsaWRhdGlvblByZWZlcmVuY2VLZXkgOiB0aGlzLnNldmVyaXR5TGV2ZWxzLmtleVNldCgpKSB7Ci0JCQl1cGRhdGVQcmVmZXJlbmNlKHZhbGlkYXRpb25QcmVmZXJlbmNlS2V5LCB0aGlzLnNldmVyaXR5TGV2ZWxzLmdldCh2YWxpZGF0aW9uUHJlZmVyZW5jZUtleSkpOwotCQl9Ci0JCXRyeSB7Ci0JCQkvLyB0cnVlPWZvcms7IGZhbHNlPXVuY2FuY2VsbGFibGUKLQkJCXRoaXMuYnVpbGRPa1Byb2dyZXNzTW9uaXRvckRpYWxvZygpLnJ1bih0cnVlLCBmYWxzZSwgdGhpcy5idWlsZE9rUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4LmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVByZWZlcmVuY2UoU3RyaW5nIHByZWZlcmVuY2VLZXksIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoaXNQcm9qZWN0UHJlZmVyZW5jZVBhZ2UoKSkgewotCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLnNldFByb2plY3RMZXZlbFByb2JsZW1QcmVmZXJlbmNlKGdldFByb2plY3QoKSwgcHJlZmVyZW5jZUtleSwgdmFsdWUpOwotCQl9Ci0JCWVsc2UgewotCQkJSnBhVmFsaWRhdGlvblByZWZlcmVuY2VzLnNldFdvcmtzcGFjZUxldmVsUHJvYmxlbVByZWZlcmVuY2UocHJlZmVyZW5jZUtleSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUnVubmFibGVDb250ZXh0IGJ1aWxkT2tQcm9ncmVzc01vbml0b3JEaWFsb2coKSB7Ci0JCXJldHVybiBuZXcgUHJvZ3Jlc3NNb25pdG9yRGlhbG9nKHRoaXMuZ2V0U2hlbGwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgYnVpbGRPa1J1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQlyZXR1cm4gbmV3IElSdW5uYWJsZVdpdGhQcm9ncmVzcygpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJSVdvcmtzcGFjZSB3cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQkJCQl0cnkgewotCQkJCQkvLyB0aGUgYnVpbGQgd2UgZXhlY3V0ZSBpbiAjcGVyZm9ybU9rXygpIGxvY2tzIHRoZSB3b3Jrc3BhY2Ugcm9vdCwKLQkJCQkJLy8gc28gd2UgbmVlZCB0byB1c2UgdGhlIHdvcmtzcGFjZSByb290IGFzIG91ciBzY2hlZHVsaW5nIHJ1bGUgaGVyZQotCQkJCQl3cy5ydW4oCi0JCQkJCQkJSnBhUHJvYmxlbVNldmVyaXRpZXNQYWdlLnRoaXMuYnVpbGRPa1dvcmtzcGFjZVJ1bm5hYmxlKCksCi0JCQkJCQkJd3MuZ2V0Um9vdCgpLAotCQkJCQkJCUlXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLAotCQkJCQkJCW1vbml0b3IKLQkJCQkJKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZXgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQl9Ci0KLQlJV29ya3NwYWNlUnVubmFibGUgYnVpbGRPa1dvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQlyZXR1cm4gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlKcGFQcm9ibGVtU2V2ZXJpdGllc1BhZ2UudGhpcy5wZXJmb3JtT2tfKG1vbml0b3IpOwotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgcGVyZm9ybU9rXyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy9pZiBwcm9qZWN0IGlzIG51bGwgdGhpcyBpcyBhIHdvcmtzcGFjZSBwcmVmZXJlbmNlIHBhZ2UKLQkJaWYgKHRoaXMuZ2V0UHJvamVjdCgpPT1udWxsKSB7Ci0JCQlKYXZhUGx1Z2luLmdldFdvcmtzcGFjZSgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuRlVMTF9CVUlMRCwgbW9uaXRvcik7Ci0JCX0KLQkJZWxzZSB0aGlzLmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkZVTExfQlVJTEQsIG1vbml0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhnZXREaWFsb2dQcmVmZXJlbmNlcygpKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nUHJlZmVyZW5jZXMoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyByb290U2V0dGluZ3MgPSBKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IHJvb3RTZXR0aW5ncy5nZXRTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT05fTkFNRSk7Ci0JCWlmIChzZXR0aW5ncyA9PSBudWxsKSB7Ci0JCQlzZXR0aW5ncyA9IHJvb3RTZXR0aW5ncy5hZGROZXdTZWN0aW9uKFNFVFRJTkdTX1NFQ1RJT05fTkFNRSk7Ci0JCX0KLQkJcmV0dXJuIHNldHRpbmdzOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlU2VjdGlvbkV4cGFuc2lvblN0YXRlcyhJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MpIHsKLQkJZm9yIChpbnQgaW5kZXggPSB0aGlzLmV4cGFuZGFibGVQYW5lcy5zaXplKCk7IC0taW5kZXggPj0gMDsgKSB7Ci0JCQlFeHBhbmRhYmxlQ29tcG9zaXRlIGV4cGFuZGFibGVQYW5lID0gdGhpcy5leHBhbmRhYmxlUGFuZXMuZ2V0KGluZGV4KTsKLQkJCXNldHRpbmdzLnB1dChTRVRUSU5HU19FWFBBTkRFRCArIGluZGV4LCBleHBhbmRhYmxlUGFuZS5pc0V4cGFuZGVkKCkpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcHRQcmVmZXJlbmNlc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSnB0UHJlZmVyZW5jZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzY2E2NWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KcHRQcmVmZXJlbmNlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuZGlhbG9ncy5PcHRpb25hbE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIHJvb3Qgb2YgdGhlIEphdmEgUGVyc2lzdGVuY2UgcHJlZmVyZW5jZXMgaGllcmFyY2h5IGluIHRoZSBJREUKLSAqIHByZWZlcmVuY2VzIGRpYWxvZy4KLSAqIDxwPgotICogU3RydWN0dXJlOgotICogPHA+Ci0gKiBKYXZhIFBlcnNpc3RlbmNlPGJyPgotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDIuMgotICovCi1wdWJsaWMgY2xhc3MgSnB0UHJlZmVyZW5jZXNQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotICAgICAgICAKLQkJQ29tcG9zaXRlIGNvbnRhaW5lcj0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQ9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQ9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX01BUkdJTik7Ci0JCWxheW91dC5tYXJnaW5XaWR0aD0gMDsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZz0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDEwKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucz0gMjsKLQotCQlHcm91cCBkb250QXNrR3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWRvbnRBc2tHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZG9udEFza0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlkb250QXNrR3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwdFByZWZlcmVuY2VzUGFnZV9Eb05vdFNob3dEaWFsb2dzKTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChkb250QXNrR3JvdXAsIFNXVC5XUkFQKTsKLQkJbGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwdFByZWZlcmVuY2VzUGFnZV9Eb05vdFNob3dUZXh0KTsKLQkJR3JpZERhdGEgZGF0YT0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLndpZHRoSGludD0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKDUwKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGRvbnRBc2tHcm91cCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwdFByZWZlcmVuY2VzUGFnZV9DbGVhckJ1dHRvblRleHQpOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuQkVHSU5OSU5HLCBmYWxzZSwgZmFsc2UpKTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1bmhpZGVBbGxEaWFsb2dzKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXVuaGlkZUFsbERpYWxvZ3MoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKEpwdEpwYVVpUGx1Z2luLmluc3RhbmNlKCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQkKLQlwcml2YXRlIGZpbmFsIHZvaWQgdW5oaWRlQWxsRGlhbG9ncygpIHsKLQkJT3B0aW9uYWxNZXNzYWdlRGlhbG9nLmNsZWFyQWxsUmVtZW1iZXJlZFN0YXRlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJlZnMvSnBhVWlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJlZnMvSnBhVWlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjYjJiZi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3ByZWZzL0pwYVVpUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgaW5pdGlhbGl6ZXIgb2YgdGhlIEpQQSBVSSBwcmVmZXJlbmNlcywgd2hpY2ggc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZXMuCi0gKgotICogQHZlcnNpb24gMy4wCi0gKiBAc2luY2UgMy4wCi0gKiBAYXV0aG9yIFBhc2NhbCBGaWxpb24KLSAqLwotcHVibGljIGNsYXNzIEpwYVVpUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5KcGFVaVByZWZlcmVuY2VJbml0aWFsaXplcjwvY29kZT4uCi0JICovCi0JcHVibGljIEpwYVVpUHJlZmVyZW5jZUluaXRpYWxpemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIHtAaW5oZXJpdERvY30KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZXMgPSBKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KEpwdEpwYVVpUGx1Z2luLkpQUUxfSURFTlRJRklFUl9DQVNFX1BSRUZfS0VZLCBKcHRKcGFVaVBsdWdpbi5KUFFMX0lERU5USUZJRVJfTE9XRVJDQVNFX1BSRUZfVkFMVUUpOwotCQlwcmVmZXJlbmNlcy5zZXREZWZhdWx0KEpwdEpwYVVpUGx1Z2luLkpQUUxfSURFTlRJRklFUl9NQVRDSF9GSVJTVF9DSEFSQUNURVJfQ0FTRV9QUkVGX0tFWSwgdHJ1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9EYXRhTW9kZWxQcm9wZXJ0eVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9EYXRhTW9kZWxQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4NmRkYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRGF0YU1vZGVsUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFN5bmNoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5WYWxpZGF0aW9uU3RhdHVzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGF0YU1vZGVsUHJvcGVydHlQYWdlIAotCWV4dGVuZHMgUHJvcGVydHlQYWdlCi0JaW1wbGVtZW50cyBMaXN0ZW5lciwgSURhdGFNb2RlbExpc3RlbmVyCi17Ci0JcHJvdGVjdGVkIElEYXRhTW9kZWwgbW9kZWw7Ci0JCi0JcHJpdmF0ZSBWYWxpZGF0aW9uU3RhdHVzIHN0YXR1cyA9IG5ldyBWYWxpZGF0aW9uU3RhdHVzKCk7Ci0JcHJpdmF0ZSBNYXAgdmFsaWRhdGlvbk1hcDsKLQlwcml2YXRlIFN0cmluZ1tdIHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzOwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpbmcgPSBmYWxzZTsKLQkKLQlwcm90ZWN0ZWQgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hIZWxwZXI7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgaW5mb3BvcElEOwotCQotCQotCXByb3RlY3RlZCBEYXRhTW9kZWxQcm9wZXJ0eVBhZ2UoSURhdGFNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCW1vZGVsLmFkZExpc3RlbmVyKHRoaXMpOwotCQlzeW5jaEhlbHBlciA9IGluaXRpYWxpemVTeW5jaEhlbHBlcihtb2RlbCk7Ci0JfQotCQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBEYXRhTW9kZWxTeW5jaEhlbHBlciBpbml0aWFsaXplU3luY2hIZWxwZXIoSURhdGFNb2RlbCBkbSkgewotCQlyZXR1cm4gbmV3IERhdGFNb2RlbFN5bmNoSGVscGVyKGRtKTsKLQl9Ci0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSB0b3AgPSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQlzZXR1cEluZm9wb3AodG9wKTsKLQkJc2V0RGVmYXVsdHMoKTsKLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCWluaXRpYWxpemVWYWxpZGF0aW9uUHJvcGVydGllcygpOwotCQlyZXR1cm4gdG9wOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbGlkYXRpb25Qcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9IGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0JCWlmICh2YWxpZGF0aW9uUHJvcGVydHlOYW1lcyA9PSBudWxsIHx8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aCA9PSAwKQotCQkJdmFsaWRhdGlvbk1hcCA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQkJZWxzZSB7Ci0JCQl2YWxpZGF0aW9uTWFwID0gbmV3IEhhc2hNYXAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspCi0JCQkJdmFsaWRhdGlvbk1hcC5wdXQodmFsaWRhdGlvblByb3BlcnR5TmFtZXNbaV0sIG5ldyBJbnRlZ2VyKGkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzIHNob3VsZCByZXR1cm4gdGhlIG1vZGVsIHByb3BlcnR5IG5hbWVzIHRoYXQgbmVlZCB0byBiZSB2YWxpZGF0ZWQgb24gdGhpcyBwYWdlIGluIHRoZQotCSAqIG9yZGVyIHRoYXQgdGhleSBzaG91bGQgcHJlc2VudCB0aGVpciBtZXNzYWdlcy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRvcCBsZXZlbCBDb21wb3NpdGUgZm9yIHRoaXMgcGFnZS4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpOwotCi0JLyoqCi0JICogU2V0IHVwIGluZm8gcG9wIGhvb2tzIGlmIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cEluZm9wb3AoQ29udHJvbCBwYXJlbnQpIHsKLQkJaWYgKGdldEluZm9wb3BJRCgpICE9IG51bGwpCi0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgZ2V0SW5mb3BvcElEKCkpOwotCX0KLQotCS8qKgotCSAqIFNldHVwIHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhpcyBwYWdlLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0byBwcm92aWRlIGFwcHJvcHJpYXRlCi0JICogZGVmYXVsdHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGVmYXVsdHMoKSB7Ci0JCXJlc3RvcmVEZWZhdWx0U2V0dGluZ3MoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaWYgdGhleSBoYXZlIGRlZmF1bHQgc2V0dGluZ3MgdGhhdCBoYXZlIGJlZW4gc3RvcmVkCi0JICogYW5kIG5lZWQgdG8gYmUgcmVzdG9yZWQuCi0JICogCi0JICogQHNlZSBzdG9yZURlZmF1bHRTZXR0aW5ncygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgTGlzdGVuZXJzIHRvIGNvbnRyb2xzIGF0IHRoaXMgcG9pbnQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXZlbnRzLiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG92ZXJyaWRlIHRvIGFkZCBsaXN0ZW5lcnMgdG8gaXRzIGNvbnRyb2xzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQl9Ci0KLQkvKioKLQkgKiBFeGl0aW5nIHRoZSBwYWdlLiBTdWJjbGFzc2VzIG1heSBleHRlbmQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhpdCgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRTdGF0dXMoSW50ZWdlciBrZXkpIHsKLQkJcmV0dXJuIHN0YXR1cy5oYXNFcnJvcihrZXkpOwotCX0KLQotCS8qKgotCSAqIFNlbnQgd2hlbiBhbiBldmVudCB0aGF0IHRoZSByZWNlaXZlciBoYXMgcmVnaXN0ZXJlZCBmb3Igb2NjdXJzLiBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGlzCi0JICogbWV0aG9kLCBpdCBtdXN0IGNhbGwgc3VwZXIuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCBldmVudCkgewotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBwYWdlIGJhc2VkIG9uIHRoZSBsYXN0IGVycm9yIGluIHRoZSBWYWxpZGF0aW9uU3RhdHVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yID0gc3RhdHVzLmdldExhc3RFcnJNc2coKTsKLQkJaWYgKGVycm9yID09IG51bGwpIHsKLQkJCWlmIChnZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKQotCQkJCXNldEVycm9yTWVzc2FnZSgoU3RyaW5nKSBudWxsKTsKLQkJCVN0cmluZyB3YXJuaW5nID0gc3RhdHVzLmdldExhc3RXYXJuaW5nTXNnKCk7Ci0JCQlpZiAod2FybmluZyA9PSBudWxsKSB7Ci0JCQkJaWYgKGdldE1lc3NhZ2UoKSAhPSBudWxsICYmIGdldE1lc3NhZ2VUeXBlKCkgPT0gSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKQotCQkJCQlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBpbmZvID0gc3RhdHVzLmdldExhc3RJbmZvTXNnKCk7Ci0JCQkJCWlmIChpbmZvID09IG51bGwpIHsKLQkJCQkJCWlmIChnZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiBnZXRNZXNzYWdlVHlwZSgpID09IElNZXNzYWdlUHJvdmlkZXIuSU5GT1JNQVRJT04pCi0JCQkJCQkJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfSBlbHNlIGlmICghaW5mby5lcXVhbHMoZ2V0TWVzc2FnZSgpKSkgewotCQkJCQkJc2V0TWVzc2FnZShpbmZvLCBJTWVzc2FnZVByb3ZpZGVyLklORk9STUFUSU9OKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXdhcm5pbmcuZXF1YWxzKGdldE1lc3NhZ2UoKSkpCi0JCQkJc2V0TWVzc2FnZSh3YXJuaW5nLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotCQl9IGVsc2UgaWYgKCFlcnJvci5lcXVhbHMoZ2V0RXJyb3JNZXNzYWdlKCkpKQotCQkJCQkJCXNldEVycm9yTWVzc2FnZShlcnJvcik7Ci0JCQkJCQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvclN0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0RXJyb3JTdGF0dXMoa2V5LCBlcnJvck1lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFdhcm5pbmdTdGF0dXMoSW50ZWdlciBrZXksIFN0cmluZyB3YXJuaW5nTWVzc2FnZSkgewotCQlzdGF0dXMuc2V0V2FybmluZ1N0YXR1cyhrZXksIHdhcm5pbmdNZXNzYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW5mb1N0YXR1cyhJbnRlZ2VyIGtleSwgU3RyaW5nIGluZm9NZXNzYWdlKSB7Ci0JCXN0YXR1cy5zZXRJbmZvU3RhdHVzKGtleSwgaW5mb01lc3NhZ2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9LU3RhdHVzKEludGVnZXIga2V5KSB7Ci0JCXN0YXR1cy5zZXRPS1N0YXR1cyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgV2l6YXJkIGp1c3QgcHJpb3IgdG8gcnVubmluZyB0aGUgcGVyZm9ybUZpbmlzaCBvcGVyYXRpb24uCi0JICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdG8gc3RvcmUgdGhlaXIgZGVmYXVsdCBzZXR0aW5ncy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9yZURlZmF1bHRTZXR0aW5ncygpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFnZSBpcyBub3cgYmVpbmcgdmFsaWRhdGVkLiBBdCB0aGlzIHRpbWUsIGVhY2ggY29udHJvbCBpcyB2YWxpZGF0ZWQgYW5kIHRoZW4gdGhlCi0JICogY29udHJvbHMgYXJlIHVwZGF0ZWQgYmFzZWQgb24gdGhlIHJlc3VsdHMgaW4gdGhlIFZhbGlkYXRpb25TdGF0dXMgd2hpY2ggd2FzIHVwZGF0ZWQgZHVyaW5nCi0JICogPGNvZGU+dmFsaWRhdGVDb250cm9scygpPC9jb2RlPi4gRmluYWxseSwgaXQgd2lsbCBkaXNwbGF5IHRoZSBsYXN0IGVycm9yIG1lc3NhZ2UgYW5kIGl0Ci0JICogd2lsbCBzZXQgdGhlIHBhZ2UgY29tcGxldGUuIFN1YmNsYXNzZXMgd2lsbCBub3QgdHlwaWNhbGx5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLQkJaWYgKCFpc1ZhbGlkYXRpbmcpIHsKLQkJCWlzVmFsaWRhdGluZyA9IHRydWU7Ci0JCQl0cnkgewotCQkJCXZhbGlkYXRlQ29udHJvbHNCYXNlKCk7Ci0JCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoKTsKLQkJCQlzZXRWYWxpZChzdGF0dXMuZ2V0TGFzdEVyck1zZygpID09IG51bGwpOwotCQkJfSAKLQkJCWZpbmFsbHkgewotCQkJCWlzVmFsaWRhdGluZyA9IGZhbHNlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgaW5kaXZpZHVhbCBjb250cm9scy4gVXNlIHZhbGlkYXRpb24ga2V5cyB0byBrZWVwIHRyYWNrIG9mIGVycm9ycy4KLQkgKiAKLQkgKiBAc2VlIHNldE9LU3RhdHVzKEludGVnZXIpIGFuZCBzZXRFcnJvck1lc3NhZ2UoSW50ZWdlciwgU3RyaW5nKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdmFsaWRhdGVDb250cm9sc0Jhc2UoKSB7Ci0JCWlmICghdmFsaWRhdGlvbk1hcC5pc0VtcHR5KCkpIHsKLQkJCVN0cmluZyBwcm9wTmFtZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsaWRhdGlvblByb3BlcnR5TmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlwcm9wTmFtZSA9IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzW2ldOwotCQkJCUludGVnZXIgdmFsS2V5ID0gKEludGVnZXIpIHZhbGlkYXRpb25NYXAuZ2V0KHByb3BOYW1lKTsKLQkJCQlpZiAodmFsS2V5ICE9IG51bGwpCi0JCQkJCXZhbGlkYXRlUHJvcGVydHkocHJvcE5hbWUsIHZhbEtleSk7Ci0JCQkJaWYgKCFnZXRTdGF0dXModmFsS2V5KSkKLQkJCQkJcmV0dXJuIHByb3BOYW1lOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcGFyYW0gdmFsaWRhdGlvbmtleQotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIEludGVnZXIgdmFsaWRhdGlvbktleSkgewotCQlzZXRPS1N0YXR1cyh2YWxpZGF0aW9uS2V5KTsKLQkJSVN0YXR1cyBzdGF0dXMxID0gbW9kZWwudmFsaWRhdGVQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoIXN0YXR1czEuaXNPSygpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IHN0YXR1czEuaXNNdWx0aVN0YXR1cygpID8gc3RhdHVzMS5nZXRDaGlsZHJlbigpWzBdLmdldE1lc3NhZ2UoKSA6IHN0YXR1czEuZ2V0TWVzc2FnZSgpOwotCQkJc3dpdGNoIChzdGF0dXMxLmdldFNldmVyaXR5KCkpIHsKLQkJCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCQlzZXRFcnJvclN0YXR1cyh2YWxpZGF0aW9uS2V5LCBtZXNzYWdlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCQlzZXRXYXJuaW5nU3RhdHVzKHZhbGlkYXRpb25LZXksIG1lc3NhZ2UpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJCXNldEluZm9TdGF0dXModmFsaWRhdGlvbktleSwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBlbmFibGVtZW50IG9mIGNvbnRyb2xzIGFmdGVyIHZhbGlkYXRpb24uIFN1YmxjYXNzZXMgc2hvdWxkIGNoZWNrIHRoZSBzdGF0dXMgb2YKLQkgKiB2YWxpZGF0aW9uIGtleXMgdG8gZGV0ZXJtaW5lIGVuYWJsZW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udHJvbHMoKSB7Ci0JfQotCQotCQotCS8qCi0JICogSWYgYSBwcm9wZXJ0eSBjaGFuZ2VzIHRoYXQgd2Ugd2FudCB0byB2YWxpZGF0ZSwgZm9yY2UgdmFsaWRhdGlvbiBvbiB0aGlzIHBhZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbkRhdGFNb2RlbExpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlZChqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQlpZiAodmFsaWRhdGlvblByb3BlcnR5TmFtZXMgIT0gbnVsbCAmJiAoZXZlbnQuZ2V0RmxhZygpID09IERhdGFNb2RlbEV2ZW50LlZBTFVFX0NIRyB8fCAoIWlzVmFsaWQoKSAmJiBldmVudC5nZXRGbGFnKCkgPT0gRGF0YU1vZGVsRXZlbnQuVkFMSURfVkFMVUVTX0NIRykpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzW2ldLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG1vZGVsLgotCSAqLwotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGdldERhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKHN5bmNoSGVscGVyICE9IG51bGwpIHsKLQkJCXN5bmNoSGVscGVyLmRpc3Bvc2UoKTsKLQkJCXN5bmNoSGVscGVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW5mb3BvcElEKCkgewotCQlyZXR1cm4gaW5mb3BvcElEOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZm9wb3BJRChTdHJpbmcgaW5mb3BvcElEKSB7Ci0JCXRoaXMuaW5mb3BvcElEID0gaW5mb3BvcElEOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4OWUwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrVWkuY3JlYXRlSW5zdGFsbExpYnJhcnlQYW5lbDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5JQ1VTdHJpbmdDb2xsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmxpc3RlbmVycy5TV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnByb3BlcnRpZXMuSnB0UHJvamVjdFByb3BlcnRpZXNQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbGl0eS5zd3QuU1dUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLk5vdEJvb2xlYW5UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5GaWx0ZXJpbmdJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlRyYW5zZm9ybWF0aW9uSXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQ29tcG9zaXRlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5FeHRlbmRlZExpc3RWYWx1ZU1vZGVsV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlRyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5UcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Db2xsZWN0aW9uQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuTGlzdFZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYURhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnB0Q29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5KcGFQcm9qZWN0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5saWJwcm92LkpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtR3JvdXBEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGVGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi51aS5pbnRlcm5hbC5EVFBVaVRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuanBhMi5KcGEyXzBQcm9qZWN0RmxhZ01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLmxpYnByb3YuSUxpYnJhcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUubGlicHJvdi5MaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb25Db25maWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci0KLS8qKgotICogV2F5IG1vcmUgY29tcGxpY2F0ZWQgVUkgdGhhbiB5b3Ugd291bGQgdGhpbmsuLi4uCi0gKi8KLXB1YmxpYyBjbGFzcyBKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UKLQkJZXh0ZW5kcyBKcHRQcm9qZWN0UHJvcGVydGllc1BhZ2UgIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhUHJvamVjdFByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsOwotCQotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHBsYXRmb3JtSWRNb2RlbDsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGxhdGZvcm1JZExpc3RlbmVyOwotCQotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGNvbm5lY3Rpb25Nb2RlbDsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbDsKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBkaXNjb25uZWN0ZWRNb2RlbDsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lcjsKLQlwcml2YXRlIExpbmsgY29ubmVjdExpbms7Ci0JCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ01vZGVsOwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRlZmF1bHRDYXRhbG9nTW9kZWw7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGNhdGFsb2dDaG9pY2VzTW9kZWw7Ci0JCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWw7Ci0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsOwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0U2NoZW1hTW9kZWw7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IHNjaGVtYUNob2ljZXNNb2RlbDsKLQkKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWw7Ci0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBsaXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsOwotCQotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGpwYTJfMFByb2plY3RGbGFnTW9kZWw7Ci0JCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWw7Ci0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWw7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxEX1BBVEhTX1BST1BFUlRZX1BBR0VfSUQgPSAib3JnLmVjbGlwc2UuamR0LnVpLnByb3BlcnR5UGFnZXMuQnVpbGRQYXRoc1Byb3BlcnR5UGFnZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvKiBwcml2YXRlICovIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFN0cmluZz4gU1RSSU5HX0NPTVBBUkFUT1IgPSBuZXcgSUNVU3RyaW5nQ29sbGF0b3IoKTsKLQotCS8vICoqKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKioqCi0KLQlwdWJsaWMgSnBhUHJvamVjdFByb3BlcnRpZXNQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBidWlsZE1vZGVscygpIHsKLQkJdGhpcy5qcGFQcm9qZWN0TW9kZWwgPSBuZXcgSnBhUHJvamVjdE1vZGVsKHRoaXMucHJvamVjdE1vZGVsKTsKLQkJCi0JCXRoaXMucGxhdGZvcm1JZE1vZGVsID0gdGhpcy5idWlsZFBsYXRmb3JtSWRNb2RlbCgpOwotCQl0aGlzLnBsYXRmb3JtSWRMaXN0ZW5lciA9IHRoaXMuYnVpbGRQbGF0Zm9ybUlkTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMuY29ubmVjdGlvbk1vZGVsID0gdGhpcy5idWlsZENvbm5lY3Rpb25Nb2RlbCgpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGVNb2RlbCgpOwotCQl0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsID0gdGhpcy5idWlsZERpc2Nvbm5lY3RlZE1vZGVsKCk7Ci0JCXRoaXMuZGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lciA9IGJ1aWxkRGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lcigpOwotCi0JCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwgPSB0aGlzLmJ1aWxkVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwoKTsKLQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsID0gdGhpcy5idWlsZFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWwoKTsKLQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsID0gdGhpcy5idWlsZERlZmF1bHRDYXRhbG9nTW9kZWwoKTsKLQkJdGhpcy5jYXRhbG9nQ2hvaWNlc01vZGVsID0gdGhpcy5idWlsZENhdGFsb2dDaG9pY2VzTW9kZWwoKTsKLQotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwgPSB0aGlzLmJ1aWxkVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCgpOwotCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFNb2RlbCA9IHRoaXMuYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwoKTsKLQkJdGhpcy5kZWZhdWx0U2NoZW1hTW9kZWwgPSB0aGlzLmJ1aWxkRGVmYXVsdFNjaGVtYU1vZGVsKCk7Ci0JCXRoaXMuc2NoZW1hQ2hvaWNlc01vZGVsID0gdGhpcy5idWlsZFNjaGVtYUNob2ljZXNNb2RlbCgpOwotCi0JCXRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwgPSB0aGlzLmJ1aWxkRGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwoKTsKLQkJdGhpcy5saXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsID0gdGhpcy5idWlsZExpc3RBbm5vdGF0ZWRDbGFzc2VzTW9kZWwoKTsKLQotCQl0aGlzLmpwYTJfMFByb2plY3RGbGFnTW9kZWwgPSB0aGlzLmJ1aWxkSnBhMl8wUHJvamVjdEZsYWdNb2RlbCgpOwotCi0JCXRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwgPSB0aGlzLmJ1aWxkTWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwoKTsKLQkJdGhpcy5qYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsID0gdGhpcy5idWlsZEphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwoKTsKLQl9Ci0KLQkvLyAqKioqKiBwbGF0Zm9ybSBJRCBtb2RlbAotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkUGxhdGZvcm1JZE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgUGxhdGZvcm1JZE1vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRQbGF0Zm9ybUlkTGlzdGVuZXIoKXsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UudGhpcy5wbGF0Zm9ybUlkQ2hhbmdlZCgoU3RyaW5nKSBldmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIHBsYXRmb3JtSWRDaGFuZ2VkKFN0cmluZyBuZXdQbGF0Zm9ybUlkKSB7Ci0JCWlmICggISB0aGlzLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCS8vIGhhbmRsZSBudWxsLCBpbiB0aGUgY2FzZSB0aGUganBhIGZhY2V0IGlzIGNoYW5nZWQgdmlhIHRoZSBmYWNldHMgcGFnZSwKLQkJCS8vIHRoZSBsaWJyYXJ5IGluc3RhbGwgZGVsZWdhdGUgaXMgdGVtcG9yYXJpbHkgbnVsbAotCQkJYWRqdXN0TGlicmFyeVByb3ZpZGVycygpOwotCQl9Ci0JfQotCi0JLy8gKioqKiogY29ubmVjdGlvbiBtb2RlbHMKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENvbm5lY3Rpb25Nb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4obmV3IENvbm5lY3Rpb25Nb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGJ1aWxkQ29ubmVjdGlvblByb2ZpbGVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uUHJvZmlsZU1vZGVsKHRoaXMuY29ubmVjdGlvbk1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2Nvbm5lY3RlZE1vZGVsKCkgewotCQlyZXR1cm4gbmV3IERpc2Nvbm5lY3RlZE1vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7Ci0JfQotCi0JLy8gKioqKiogY2F0YWxvZyBtb2RlbHMKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+KG5ldyBVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBCdWZmZXJlZFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGVmYXVsdENhdGFsb2dNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBEZWZhdWx0TW9kZWwoCi0JCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsCi0JCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbCwKLQkJCQkJdGhpcy5idWlsZERhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbCgpCi0JCQkJKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGF0YWJhc2VEZWZhdWx0Q2F0YWxvZ01vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlRGVmYXVsdENhdGFsb2dNb2RlbCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgZGVmYXVsdCBjYXRhbG9nIGlmIGl0IGlzIG5vdCBvbiB0aGUgbGlzdCBmcm9tIHRoZSBkYXRhYmFzZQotCSAqLwotCXByaXZhdGUgTGlzdFZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZENhdGFsb2dDaG9pY2VzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkQ2F0YWxvZ0Nob2ljZXNNb2RlbCgpLCBTVFJJTkdfQ09NUEFSQVRPUik7Ci0JfQotCi0JLyoqCi0JICogQWRkIHRoZSBkZWZhdWx0IGNhdGFsb2cgaWYgaXQgaXMgbm90IG9uIHRoZSBsaXN0IGZyb20gdGhlIGRhdGFiYXNlCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVW5zb3J0ZWRDYXRhbG9nQ2hvaWNlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IFNldENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4oCi0JCQkJCW5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KAotCQkJCQkJCW5ldyBQcm9wZXJ0eUNvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KHRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbCksCi0JCQkJCQkJdGhpcy5idWlsZERhdGFiYXNlQ2F0YWxvZ0Nob2ljZXNNb2RlbCgpCi0JCQkJCSkKLQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkRGF0YWJhc2VDYXRhbG9nQ2hvaWNlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlQ2F0YWxvZ0Nob2ljZXNNb2RlbCh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCX0KLQotCS8vICoqKioqIHNjaGVtYSBtb2RlbHMKLQlwcml2YXRlIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4obmV3IFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwodGhpcy5qcGFQcm9qZWN0TW9kZWwpLCB0aGlzLnRyaWdnZXIpOwotCX0KLQotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPihuZXcgVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGREZWZhdWx0U2NoZW1hTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgRGVmYXVsdE1vZGVsKAotCQkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwsCi0JCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsLAotCQkJCQl0aGlzLmJ1aWxkRGF0YWJhc2VEZWZhdWx0U2NoZW1hTW9kZWwoKQotCQkJCSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFiYXNlRGVmYXVsdFNjaGVtYU1vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlRGVmYXVsdFNjaGVtYU1vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCwgdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGRlZmF1bHQgY2F0YWxvZyBpZiBpdCBpcyBub3Qgb24gdGhlIGxpc3QgZnJvbSB0aGUgZGF0YWJhc2UKLQkgKi8KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRTY2hlbWFDaG9pY2VzTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgU29ydGVkTGlzdFZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5idWlsZFVuc29ydGVkU2NoZW1hQ2hvaWNlc01vZGVsKCksIFNUUklOR19DT01QQVJBVE9SKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIENvbGxlY3Rpb25WYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRVbnNvcnRlZFNjaGVtYUNob2ljZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTZXRDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+KAotCQkJCW5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KAotCQkJCQkJbmV3IFByb3BlcnR5Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPFN0cmluZz4odGhpcy5kZWZhdWx0U2NoZW1hTW9kZWwpLAotCQkJCQkJdGhpcy5idWlsZERhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKCkKLQkJCQkpCi0JCQkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZERhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IERhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKHRoaXMuY29ubmVjdGlvblByb2ZpbGVNb2RlbCwgdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsKTsKLQl9Ci0KLQkvLyAqKioqKiBkaXNjb3Zlci9saXN0IGFubm90YXRlZCBjbGFzc2VzIG1vZGVscwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4obmV3IERpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwgdGhpcy50cmlnZ2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgb3Bwb3NpdGUgb2YgdGhlICJkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyIgZmxhZy4KLQkgKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkTGlzdEFubm90YXRlZENsYXNzZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2Zvcm1hdGlvbldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4sIEJvb2xlYW4+KHRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwsIE5vdEJvb2xlYW5UcmFuc2Zvcm1lci5pbnN0YW5jZSgpKTsKLQl9Ci0JCi0JLy8gKioqKiogSlBBIDIuMCBwcm9qZWN0IGZsYWcKLQlwcml2YXRlIFByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEpwYTJfMFByb2plY3RGbGFnTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgSnBhMl8wUHJvamVjdEZsYWdNb2RlbDxKcGFQcm9qZWN0Pih0aGlzLmpwYVByb2plY3RNb2RlbCk7Ci0JfQotCi0JLy8gKioqKiogbWV0YW1vZGVsIG1vZGVscwotCXByaXZhdGUgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkTWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwoKSB7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+KG5ldyBNZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbCh0aGlzLmpwYVByb2plY3RNb2RlbCksIHRoaXMudHJpZ2dlcik7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IGJ1aWxkSmF2YVNvdXJjZUZvbGRlckNob2ljZXNNb2RlbCgpIHsKLQkJLy8gYnkgZGVmYXVsdCwgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXIgcHV0cyBhIG51bGwgYXQgdGhlIHRvcCBvZiB0aGUgbGlzdAotCQlyZXR1cm4gbmV3IEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyPFN0cmluZz4oCi0JCQkJCW5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCQkJCW5ldyBKYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsKHRoaXMuanBhUHJvamVjdE1vZGVsKSwKLQkJCQkJCVNUUklOR19DT01QQVJBVE9SCi0JCQkJCSkKLQkJCQkpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU3RyaW5nIGdldENvbm5lY3Rpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uTW9kZWwuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZU1vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ0lzU2V0KCkgewotCQlyZXR1cm4gZmxhZ0lzU2V0KHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ01vZGVsLmdldFZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnSXNTZXQoKSB7Ci0JCXJldHVybiBmbGFnSXNTZXQodGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyIGdldFdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIoKSB7Ci0JCUlXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyIGNvbnRhaW5lcj0gKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpYnJhcnlGYWNldFByb3BlcnR5UGFnZSBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSVByb2plY3RGYWNldFZlcnNpb24gZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RmFjZXRlZFByb2plY3QoKS5nZXRJbnN0YWxsZWRWZXJzaW9uKEpwYUZhY2V0LkZBQ0VUKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgY3JlYXRlTGlicmFyeUluc3RhbGxEZWxlZ2F0ZShJRmFjZXRlZFByb2plY3QgcHJvamVjdCwgSVByb2plY3RGYWNldFZlcnNpb24gZnYpIHsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiBlbmFibGVtZW50VmFyaWFibGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCQotCQkvL1RPRE8gQXNrIFBhdWwgYWJvdXQgdGhlc2UgZW1wdHkgZW5hYmxlbWVudCB2YXJpYWJsZXMgLSB0cnlpbmcgdG8gcmVwcm9kdWNlIEhlbGlvcyBmdW5jdGlvbmFsaXR5Ci0JCWVuYWJsZW1lbnRWYXJpYWJsZXMucHV0KEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuSlBBX1BMQVRGT1JNX0VOQUJMRU1FTlRfRVhQLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW5hYmxlbWVudFZhcmlhYmxlcy5wdXQoSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5KUEFfUExBVEZPUk1fREVTQ1JJUFRJT05fRU5BQkxFTUVOVF9FWFAsIG5ldyBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQkJCi0JCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0pwYUZhY2V0VmVyc2lvbihJUHJvamVjdEZhY2V0VmVyc2lvbiBqcGFGYWNldFZlcnNpb24pIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luSWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBKcGFQbGF0Zm9ybUdyb3VwRGVzY3JpcHRpb24gZ2V0R3JvdXAoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RmFjdG9yeUNsYXNzTmFtZSgpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfSk7Ci0JCQotCQlMaWJyYXJ5SW5zdGFsbERlbGVnYXRlIGxpZCA9IG5ldyBMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKHByb2plY3QsIGZ2LCBlbmFibGVtZW50VmFyaWFibGVzKTsKLQkJbGlkLmFkZExpc3RlbmVyKGJ1aWxkTGlicmFyeVByb3ZpZGVyTGlzdGVuZXIoKSk7Ci0JCXJldHVybiBsaWQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRqdXN0TGlicmFyeVByb3ZpZGVycygpIHsKLQkJTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWQgPSB0aGlzLmdldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKTsKLQkJCi0JCWlmIChsaWQgIT0gbnVsbCkgewotCQkJSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBqcGFQbGF0Zm9ybSA9IAotCQkJCQlKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKHRoaXMucGxhdGZvcm1JZE1vZGVsLmdldFZhbHVlKCkpOwotCQkJU3RyaW5nIGpwYVBsYXRmb3JtSWQgPSAoanBhUGxhdGZvcm0gPT0gbnVsbCkgPyAiIiA6IGpwYVBsYXRmb3JtLmdldElkKCk7Ci0JCQkKLQkJCWxpZC5zZXRFbmFibGVtZW50Q29udGV4dFZhcmlhYmxlKAotCQkJCQlKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnLkpQQV9QTEFURk9STV9FTkFCTEVNRU5UX0VYUCwganBhUGxhdGZvcm1JZCk7Ci0JCQlsaWQuc2V0RW5hYmxlbWVudENvbnRleHRWYXJpYWJsZSgKLQkJCQkJSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZy5KUEFfUExBVEZPUk1fREVTQ1JJUFRJT05fRU5BQkxFTUVOVF9FWFAsIGpwYVBsYXRmb3JtKTsKLQkJCQotCQkJTGlzdDxKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnPiBqcGFDb25maWdzIAotCQkJCQk9IG5ldyBBcnJheUxpc3Q8SnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZz4oKTsKLQkJCS8vIGFkZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9uZSBmaXJzdAotCQkJSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZyBjdXJyZW50SnBhQ29uZmlnID0gbnVsbDsKLQkJCUxpYnJhcnlQcm92aWRlck9wZXJhdGlvbkNvbmZpZyBjb25maWcgPSBsaWQuZ2V0TGlicmFyeVByb3ZpZGVyT3BlcmF0aW9uQ29uZmlnKCk7Ci0JCQlpZiAoY29uZmlnIGluc3RhbmNlb2YgSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgewotCQkJCWN1cnJlbnRKcGFDb25maWcgPSAoSnBhTGlicmFyeVByb3ZpZGVySW5zdGFsbE9wZXJhdGlvbkNvbmZpZykgY29uZmlnOwotCQkJCWpwYUNvbmZpZ3MuYWRkKGN1cnJlbnRKcGFDb25maWcpOwotCQkJfQotCQkJZm9yIChJTGlicmFyeVByb3ZpZGVyIGxwIDogbGlkLmdldExpYnJhcnlQcm92aWRlcnMoKSkgewotCQkJCWNvbmZpZyA9IGxpZC5nZXRMaWJyYXJ5UHJvdmlkZXJPcGVyYXRpb25Db25maWcobHApOwotCQkJCWlmIChjb25maWcgaW5zdGFuY2VvZiBKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnCi0JCQkJCQkmJiAhIGNvbmZpZy5lcXVhbHMoY3VycmVudEpwYUNvbmZpZykpIHsKLQkJCQkJanBhQ29uZmlncy5hZGQoKEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcpIGNvbmZpZyk7Ci0JCQkJfQotCQkJfQotCQkJZm9yIChKcGFMaWJyYXJ5UHJvdmlkZXJJbnN0YWxsT3BlcmF0aW9uQ29uZmlnIGpwYUNvbmZpZyA6IGpwYUNvbmZpZ3MpIHsKLQkJCQlqcGFDb25maWcuc2V0SnBhUGxhdGZvcm0oanBhUGxhdGZvcm0pOwotCQkJfQotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKiogcGFnZSAqKioqKioqKioqCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlV2lkZ2V0cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuYnVpbGRQbGF0Zm9ybUdyb3VwKHBhcmVudCk7Ci0JCQotCQlDb250cm9sIGxpYnJhcnlQcm92aWRlckNvbXBvc2l0ZSA9IGNyZWF0ZUluc3RhbGxMaWJyYXJ5UGFuZWwoCi0JCQkJcGFyZW50LCAKLQkJCQl0aGlzLmdldExpYnJhcnlJbnN0YWxsRGVsZWdhdGUoKSwgCi0JCQkJSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfanBhSW1wbGVtZW50YXRpb25MYWJlbCk7Ci0JCQotIAkJbGlicmFyeVByb3ZpZGVyQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotIAkJCi0JCXRoaXMuYnVpbGRDb25uZWN0aW9uR3JvdXAocGFyZW50KTsKLQkJdGhpcy5idWlsZFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChwYXJlbnQpOwotCQl0aGlzLmJ1aWxkTWV0YW1vZGVsR3JvdXAocGFyZW50KTsKLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0UpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLmVuZ2FnZUxpc3RlbmVycygpOwotCQl0aGlzLnBsYXRmb3JtSWRNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5wbGF0Zm9ybUlkTGlzdGVuZXIpOwotCQl0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmRpc2Nvbm5lY3RlZE1vZGVsTGlzdGVuZXIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VMaXN0ZW5lcnMoKSB7Ci0JCXRoaXMucGxhdGZvcm1JZE1vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnBsYXRmb3JtSWRMaXN0ZW5lcik7Ci0JCXRoaXMuZGlzY29ubmVjdGVkTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc2VuZ2FnZUxpc3RlbmVycygpOwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHBsYXRmb3JtIGdyb3VwICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBidWlsZFBsYXRmb3JtR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCi0JCUNvbWJvIHBsYXRmb3JtRHJvcERvd24gPSBidWlsZERyb3BEb3duKGdyb3VwKTsKLQkJU1dUVG9vbHMuYmluZCgKLQkJCQlidWlsZFBsYXRmb3JtQ2hvaWNlc01vZGVsKCksCi0JCQkJdGhpcy5wbGF0Zm9ybUlkTW9kZWwsCi0JCQkJcGxhdGZvcm1Ecm9wRG93biwKLQkJCQlKUEFfUExBVEZPUk1fTEFCRUxfQ09OVkVSVEVSKTsKLQkJCi0JCWJ1aWxkRmFjZXRzUGFnZUxpbmsoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2ZhY2V0c1BhZ2VMaW5rKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb2plY3QncyBKUEEgcGxhdGZvcm0gaWYgaXQgaXMgbm90IG9uIHRoZSBsaXN0IG9mIHZhbGlkCi0JICogcGxhdGZvcm1zLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgcHJvYmFibHkgb25seSB1c2VmdWwgaWYgdGhlIHByb2plY3QgaXMgY29ycnVwdGVkCi0JICogYW5kIGhhcyBhIHBsYXRmb3JtIHRoYXQgZXhpc3RzIGluIHRoZSByZWdpc3RyeSBidXQgaXMgbm90IG9uIHRoZQotCSAqIGxpc3Qgb2YgdmFsaWQgcGxhdGZvcm1zIGZvciB0aGUgcHJvamVjdCdzIEpQQSBmYWNldCB2ZXJzaW9uLgotCSAqIEJlY2F1c2UsIGlmIHRoZSBwcm9qZWN0J3MgSlBBIHBsYXRmb3JtIGlzIGNvbXBsZXRlbHkgaW52YWxpZCwgdGhlcmUKLQkgKiB3b3VsZCBiZSBubyBKUEEgcHJvamVjdCEKLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFN0cmluZz4gYnVpbGRQbGF0Zm9ybUNob2ljZXNNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTb3J0ZWRMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPigKLQkJCQluZXcgU2V0Q29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPigKLQkJCQkJCW5ldyBDb21wb3NpdGVDb2xsZWN0aW9uVmFsdWVNb2RlbDxDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+LCBTdHJpbmc+KAotCQkJCQkJCQluZXcgUHJvcGVydHlDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8U3RyaW5nPih0aGlzLnBsYXRmb3JtSWRNb2RlbCksCi0JCQkJCQkJCXRoaXMuYnVpbGRSZWdpc3RyeVBsYXRmb3Jtc01vZGVsKCkKLQkJCQkJCSkKLQkJCQkpLAotCQkJCUpQQV9QTEFURk9STV9DT01QQVJBVE9SCi0JCQkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPiBidWlsZFJlZ2lzdHJ5UGxhdGZvcm1zTW9kZWwoKSB7Ci0JCUl0ZXJhYmxlPFN0cmluZz4gZW5hYmxlZFBsYXRmb3JtSWRzID0gCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxKcGFQbGF0Zm9ybURlc2NyaXB0aW9uLCBTdHJpbmc+KAotCQkJCQluZXcgRmlsdGVyaW5nSXRlcmFibGU8SnBhUGxhdGZvcm1EZXNjcmlwdGlvbj4oSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybXMoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBvKSB7Ci0JCQkJCQkJcmV0dXJuIG8uc3VwcG9ydHNKcGFGYWNldFZlcnNpb24oZ2V0UHJvamVjdEZhY2V0VmVyc2lvbigpKTsKLQkJCQkJCX0KLQkJCQkJfSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBTdHJpbmcgdHJhbnNmb3JtKEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gbykgewotCQkJCQlyZXR1cm4gby5nZXRJZCgpOwotCQkJCX0KLQkJCX07Ci0JCXJldHVybiBuZXcgU3RhdGljQ29sbGVjdGlvblZhbHVlTW9kZWw8U3RyaW5nPihlbmFibGVkUGxhdGZvcm1JZHMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8U3RyaW5nPiBKUEFfUExBVEZPUk1fQ09NUEFSQVRPUiA9Ci0JCQluZXcgQ29tcGFyYXRvcjxTdHJpbmc+KCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgaWQxLCBTdHJpbmcgaWQyKSB7Ci0JCQkJCVN0cmluZyBsYWJlbDEgPSBnZXRKcGFQbGF0Zm9ybUxhYmVsKGlkMSk7Ci0JCQkJCVN0cmluZyBsYWJlbDIgPSBnZXRKcGFQbGF0Zm9ybUxhYmVsKGlkMik7Ci0JCQkJCXJldHVybiBTVFJJTkdfQ09NUEFSQVRPUi5jb21wYXJlKGxhYmVsMSwgbGFiZWwyKTsKLQkJCQl9Ci0JCQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nQ29udmVydGVyPFN0cmluZz4gSlBBX1BMQVRGT1JNX0xBQkVMX0NPTlZFUlRFUiA9Ci0JCQluZXcgU3RyaW5nQ29udmVydGVyPFN0cmluZz4oKSB7Ci0JCQkJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoU3RyaW5nIGlkKSB7Ci0JCQkJCXJldHVybiBnZXRKcGFQbGF0Zm9ybUxhYmVsKGlkKTsKLQkJCQl9Ci0JCQl9OwotCi0JLyogcHJpdmF0ZSAqLyBzdGF0aWMgU3RyaW5nIGdldEpwYVBsYXRmb3JtTGFiZWwoU3RyaW5nIGlkKSB7Ci0JCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKGlkKS5nZXRMYWJlbCgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBjb25uZWN0aW9uIGdyb3VwICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBidWlsZENvbm5lY3Rpb25Hcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3Rpb25MYWJlbCk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5QUk9QRVJUSUVTX0pBVkFfUEVSU0lTVEVOQ0VfQ09OTkVDVElPTik7Ci0KLQkJQ29tYm8gY29ubmVjdGlvbkRyb3BEb3duID0gdGhpcy5idWlsZERyb3BEb3duKGdyb3VwLCAzKTsKLQkJU1dUVG9vbHMuYmluZCgKLQkJCQlDT05ORUNUSU9OX0NIT0lDRVNfTU9ERUwsCi0JCQkJdGhpcy5jb25uZWN0aW9uTW9kZWwsCi0JCQkJY29ubmVjdGlvbkRyb3BEb3duLAotCQkJCVNJTVBMRV9TVFJJTkdfQ09OVkVSVEVSCi0JCQkpOwotCi0JCUxpbmsgYWRkQ29ubmVjdGlvbkxpbmsgPSB0aGlzLmJ1aWxkTGluayhncm91cCwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbmspOwotCQlhZGRDb25uZWN0aW9uTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkQWRkQ29ubmVjdGlvbkxpbmtMaXN0ZW5lcigpKTsgIC8vIHRoZSBsaW5rIHdpbGwgYmUgR0NlZAotCi0JCXRoaXMuY29ubmVjdExpbmsgPSB0aGlzLmJ1aWxkTGluayhncm91cCwgYnVpbGRDb25uZWN0TGlua1RleHQoKSk7Ci0JCVNXVFRvb2xzLmNvbnRyb2xFbmFibGVkU3RhdGUodGhpcy5kaXNjb25uZWN0ZWRNb2RlbCwgdGhpcy5jb25uZWN0TGluayk7Ci0JCXRoaXMuY29ubmVjdExpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZENvbm5lY3RMaW5rTGlzdGVuZXIoKSk7ICAvLyB0aGUgbGluayB3aWxsIGJlIEdDZWQKLQkJCi0JCS8vIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZwotCQlCdXR0b24gb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0NoZWNrQm94ID0gdGhpcy5idWlsZENoZWNrQm94KGdyb3VwLCAzLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9vdmVycmlkZURlZmF1bHRDYXRhbG9nTGFiZWwpOwotCQlTV1RUb29scy5iaW5kKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsIG92ZXJyaWRlRGVmYXVsdENhdGFsb2dDaGVja0JveCk7Ci0KLQkJTGFiZWwgZGVmYXVsdENhdGFsb2dMYWJlbCA9IHRoaXMuYnVpbGRMYWJlbChncm91cCwgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdENhdGFsb2dMYWJlbCk7Ci0JCUNvbWJvIGRlZmF1bHRDYXRhbG9nRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOwotCQlTV1RUb29scy5iaW5kKHRoaXMuY2F0YWxvZ0Nob2ljZXNNb2RlbCwgdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLCBkZWZhdWx0Q2F0YWxvZ0Ryb3BEb3duKTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsIGRlZmF1bHRDYXRhbG9nTGFiZWwsIGRlZmF1bHRDYXRhbG9nRHJvcERvd24pOwotCi0JCS8vIG92ZXJyaWRlIGRlZmF1bHQgc2NoZW1hCi0JCUJ1dHRvbiBvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24gPSB0aGlzLmJ1aWxkQ2hlY2tCb3goZ3JvdXAsIDMsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdFNjaGVtYUxhYmVsKTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwsIG92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbik7Ci0KLQkJTGFiZWwgZGVmYXVsdFNjaGVtYUxhYmVsID0gdGhpcy5idWlsZExhYmVsKGdyb3VwLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0U2NoZW1hTGFiZWwpOwotCQlDb21ibyBkZWZhdWx0U2NoZW1hRHJvcERvd24gPSB0aGlzLmJ1aWxkRHJvcERvd24oZ3JvdXApOwotCQlTV1RUb29scy5iaW5kKHRoaXMuc2NoZW1hQ2hvaWNlc01vZGVsLCB0aGlzLmRlZmF1bHRTY2hlbWFNb2RlbCwgZGVmYXVsdFNjaGVtYURyb3BEb3duKTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKHRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCwgZGVmYXVsdFNjaGVtYUxhYmVsLCBkZWZhdWx0U2NoZW1hRHJvcERvd24pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ0NvbnZlcnRlcjxTdHJpbmc+IFNJTVBMRV9TVFJJTkdfQ09OVkVSVEVSID0KLQkJCW5ldyBTdHJpbmdDb252ZXJ0ZXI8U3RyaW5nPigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCQkJCXJldHVybiAoc3RyaW5nICE9IG51bGwpID8gc3RyaW5nIDogSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfbm9uZTsKLQkJCQl9Ci0JCQl9OwotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkRGlzY29ubmVjdGVkTW9kZWxMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTV1RQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyV3JhcHBlcihidWlsZERpc2Nvbm5lY3RlZE1vZGVsTGlzdGVuZXJfKCkpOwotCX0KLQkKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGREaXNjb25uZWN0ZWRNb2RlbExpc3RlbmVyXygpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCi0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLnVwZGF0ZUNvbm5lY3RMaW5rVGV4dChidWlsZENvbm5lY3RMaW5rVGV4dCgpKTsJCi0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQ29ubmVjdExpbmtUZXh0KCl7Ci0JCUNvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlID0gZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNvbm5lY3Rpb25Qcm9maWxlICE9IG51bGwgJiYgY29ubmVjdGlvblByb2ZpbGUuaXNDb25uZWN0ZWQoKSkgewotCQkJcmV0dXJuIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RlZFRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdExpbms7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbm5lY3RMaW5rVGV4dChTdHJpbmcgdGV4dCkgewotCQljb25uZWN0TGluay5zZXRUZXh0KHRleHQpOwotCQlTV1RVdGlsLnJlZmxvdyhjb25uZWN0TGluay5nZXRQYXJlbnQoKSk7Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEFkZENvbm5lY3Rpb25MaW5rTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJjb25uZWN0aW9uIGxpbmsgbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0Jdm9pZCBvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpIHsKLQkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdDb25uZWN0aW9uUHJvZmlsZSgpOwotCQlpZiAoY29ubmVjdGlvbk5hbWUgIT0gbnVsbCkgewotCQkJdGhpcy5jb25uZWN0aW9uTW9kZWwuc2V0VmFsdWUoY29ubmVjdGlvbk5hbWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3RMaW5rTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5Db25uZWN0aW9uUHJvZmlsZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiY29ubmVjdCBsaW5rIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXZvaWQgb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCWNwLmNvbm5lY3QoKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBwZXJzaXN0ZW50IGNsYXNzIG1hbmFnZW1lbnQgZ3JvdXAgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQlCdXR0b24gZGlzY292ZXJDbGFzc2VzUmFkaW9CdXR0b24gPSB0aGlzLmJ1aWxkUmFkaW9CdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5kaXNjb3ZlckFubm90YXRlZENsYXNzZXNNb2RlbCwgZGlzY292ZXJDbGFzc2VzUmFkaW9CdXR0b24pOwotCi0JCUJ1dHRvbiBsaXN0Q2xhc3Nlc1JhZGlvQnV0dG9uID0gdGhpcy5idWlsZFJhZGlvQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbik7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5saXN0QW5ub3RhdGVkQ2xhc3Nlc01vZGVsLCBsaXN0Q2xhc3Nlc1JhZGlvQnV0dG9uKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbWV0YW1vZGVsIGdyb3VwICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBidWlsZE1ldGFtb2RlbEdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfbWV0YW1vZGVsTGFiZWwpOwotCQlncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJTGluayBtZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rID0gdGhpcy5idWlsZExpbmsoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX21ldGFtb2RlbFNvdXJjZUZvbGRlckxpbmspOwotCQltZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1aWxkTWV0YW1vZGVsU291cmNlRm9sZGVyTGlua0xpc3RlbmVyKCkpOwotCQlDb21ibyBtZXRhbW9kZWxTb3VyY2VGb2xkZXJEcm9wRG93biA9IHRoaXMuYnVpbGREcm9wRG93bihncm91cCk7Ci0JCVNXVFRvb2xzLmJpbmQoCi0JCQkJdGhpcy5qYXZhU291cmNlRm9sZGVyQ2hvaWNlc01vZGVsLAotCQkJCXRoaXMubWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwsCi0JCQkJbWV0YW1vZGVsU291cmNlRm9sZGVyRHJvcERvd24sCi0JCQkJU0lNUExFX1NUUklOR19DT05WRVJURVIKLQkJKTsKLQkJCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9NRVRBTU9ERUwpOwotCi0JCVNXVFRvb2xzLmNvbnRyb2xWaXNpYmxlU3RhdGUodGhpcy5qcGEyXzBQcm9qZWN0RmxhZ01vZGVsLCBncm91cCwgbWV0YW1vZGVsU291cmNlRm9sZGVyTGluaywgbWV0YW1vZGVsU291cmNlRm9sZGVyRHJvcERvd24pOwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRNZXRhbW9kZWxTb3VyY2VGb2xkZXJMaW5rTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYVByb2plY3RQcm9wZXJ0aWVzUGFnZS50aGlzLm9wZW5KYXZhQnVpbGRQYXRoUGFnZSgpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAibWV0YW1vZGVsIHNvdXJjZSBmb2xkZXIgbGluayBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQl2b2lkIG9wZW5KYXZhQnVpbGRQYXRoUGFnZSgpIHsKLQkJSVdvcmtiZW5jaFByZWZlcmVuY2VDb250YWluZXIgY29udGFpbmVyID0gZ2V0V29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcigpOwotCQljb250YWluZXIub3BlblBhZ2UoQlVJTERfUEFUSFNfUFJPUEVSVFlfUEFHRV9JRCwgbnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogT0svUmV2ZXJ0L0FwcGx5IGJlaGF2aW9yICoqKioqKioqKioKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9qZWN0UmVidWlsZFJlcXVpcmVkKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybUlkTW9kZWwuaXNCdWZmZXJpbmcoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVidWlsZFByb2plY3QoKSB7Ci0JCS8vIGlmIHRoZSBKUEEgcGxhdGZvcm0gaXMgY2hhbmdlZCwgd2UgbmVlZCB0byBjb21wbGV0ZWx5IHJlYnVpbGQgdGhlIEpQQSBwcm9qZWN0Ci0JCUpwdEpwYUNvcmVQbHVnaW4ucmVidWlsZEpwYVByb2plY3QodGhpcy5nZXRQcm9qZWN0KCkpOwkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Pz5bXSBidWlsZEJ1ZmZlcmVkTW9kZWxzKCkgewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWxbXSB7Ci0JCQkJdGhpcy5wbGF0Zm9ybUlkTW9kZWwsCi0JCQkJdGhpcy5jb25uZWN0aW9uTW9kZWwsCi0JCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbCwKLQkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWwsCi0JCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsLAotCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsLAotCQkJCXRoaXMuZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwsCi0JCQkJdGhpcy5tZXRhbW9kZWxTb3VyY2VGb2xkZXJNb2RlbAotCQl9OwotCX0KLQkKLQkKLQkvLyAqKioqKioqKioqIHZhbGlkYXRpb24gKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE1vZGVsW10gYnVpbGRWYWxpZGF0aW9uTW9kZWxzKCkgewotCQlyZXR1cm4gbmV3IE1vZGVsW10gewotCQkJCXRoaXMucGxhdGZvcm1JZE1vZGVsLAotCQkJCXRoaXMuY29ubmVjdGlvbk1vZGVsLAotCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dGbGFnTW9kZWwsCi0JCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLAotCQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYUZsYWdNb2RlbCwKLQkJCQl0aGlzLmRlZmF1bHRTY2hlbWFNb2RlbCwKLQkJCQl0aGlzLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsCi0JCX07Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1WYWxpZGF0aW9uKE1hcDxJbnRlZ2VyLCBBcnJheUxpc3Q8SVN0YXR1cz4+IHN0YXR1c2VzKSB7CQotCQkvKiBwbGF0Zm9ybSAqLwotCQkvLyB1c2VyIGlzIHVuYWJsZSB0byB1bnNldCB0aGUgcGxhdGZvcm0sIHNvIG5vIHZhbGlkYXRpb24gbmVjZXNzYXJ5Ci0JCQotCQkvKiBsaWJyYXJ5IHByb3ZpZGVyICovCi0JCUlTdGF0dXMgbHBTdGF0dXMgPSB2YWxpZGF0ZUxpYnJhcnlQcm92aWRlcigpOwotCQlpZiAobHBTdGF0dXMgIT0gbnVsbCl7Ci0JCQlzdGF0dXNlcy5nZXQoSW50ZWdlci52YWx1ZU9mKGxwU3RhdHVzLmdldFNldmVyaXR5KCkpKS5hZGQobHBTdGF0dXMpOwotCQl9Ci0JCXN1cGVyLnBlcmZvcm1WYWxpZGF0aW9uKHN0YXR1c2VzKTsKLQkJCi0JCS8qIGNvbm5lY3Rpb24gKi8KLQkJQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCVN0cmluZyBjb25uZWN0aW9uTmFtZSA9IHRoaXMuZ2V0Q29ubmVjdGlvbk5hbWUoKTsKLQkJaWYgKCAhIFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkoY29ubmVjdGlvbk5hbWUpKSB7Ci0JCQlpZiAoY29ubmVjdGlvblByb2ZpbGUgPT0gbnVsbCkgewotCQkJCXN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkRXJyb3JTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9JTlZBTElELAotCQkJCQkJY29ubmVjdGlvbk5hbWUpKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICggISBjb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKSB7Ci0JCQkJc3RhdHVzZXMuZ2V0KElORk9fU1RBVFVTKS5hZGQodGhpcy5idWlsZEluZm9TdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0NPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRCkpOwotCQkJfQotCQl9Ci0KLQkJLyogZGVmYXVsdCBjYXRhbG9nICovCi0JCWlmICh0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ0lzU2V0KCkpIHsKLQkJCVN0cmluZyBkZWZhdWx0Q2F0YWxvZyA9IHRoaXMuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKLQkJCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KGRlZmF1bHRDYXRhbG9nKSkgewotCQkJCXN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkRXJyb3JTdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0RFRkFVTFRfQ0FUQUxPR19OT1RfU1BFQ0lGSUVEKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoY29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkKLQkJCQkJJiYgY29ubmVjdGlvblByb2ZpbGUuaXNDb25uZWN0ZWQoKQotCQkJCQkmJiAhIENvbGxlY3Rpb25Ub29scy5jb250YWlucyh0aGlzLmNhdGFsb2dDaG9pY2VzTW9kZWwuaXRlcmF0b3IoKSwgZGVmYXVsdENhdGFsb2cpKSB7Ci0JCQkJc3RhdHVzZXMuZ2V0KFdBUk5JTkdfU1RBVFVTKS5hZGQodGhpcy5idWlsZFdhcm5pbmdTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9ET0VTTlRfQ09OVEFJTl9DQVRBTE9HLAotCQkJCQkJZGVmYXVsdENhdGFsb2cKLQkJCQkpKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBkZWZhdWx0IHNjaGVtYSAqLwotCQlpZiAodGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ0lzU2V0KCkpIHsKLQkJCVN0cmluZyBkZWZhdWx0U2NoZW1hID0gdGhpcy5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7Ci0JCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZWZhdWx0U2NoZW1hKSkgewotCQkJCXN0YXR1c2VzLmdldChFUlJPUl9TVEFUVVMpLmFkZCh0aGlzLmJ1aWxkRXJyb3JTdGF0dXMoSnB0Q29yZU1lc3NhZ2VzLlZBTElEQVRFX0RFRkFVTFRfU0NIRU1BX05PVF9TUEVDSUZJRUQpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChjb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKQotCQkJCQkmJiBjb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpCi0JCQkJCSYmICEgQ29sbGVjdGlvblRvb2xzLmNvbnRhaW5zKHRoaXMuc2NoZW1hQ2hvaWNlc01vZGVsLml0ZXJhdG9yKCksIGRlZmF1bHRTY2hlbWEpKSB7Ci0JCQkJc3RhdHVzZXMuZ2V0KFdBUk5JTkdfU1RBVFVTKS5hZGQodGhpcy5idWlsZFdhcm5pbmdTdGF0dXMoTkxTLmJpbmQoCi0JCQkJCQlKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfQ09OTkVDVElPTl9ET0VTTlRfQ09OVEFJTl9TQ0hFTUEsCi0JCQkJCQlkZWZhdWx0U2NoZW1hCi0JCQkJKSkpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUxpYnJhcnlQcm92aWRlcigpIHsKLSAgICAgICAgTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSBsaWJJbnN0YWxsRGVsZWdhdGUgPSBnZXRMaWJyYXJ5SW5zdGFsbERlbGVnYXRlKCk7Ci0KLSAgICAgICAgaWYoIGxpYkluc3RhbGxEZWxlZ2F0ZSAhPSBudWxsICkgeyAgICAgICAgCi0JCQlNYXA8U3RyaW5nLCBPYmplY3Q+IGVuYWJsZW1lbnRWYXJpYWJsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQkJCWVuYWJsZW1lbnRWYXJpYWJsZXMucHV0KEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuSlBBX1BMQVRGT1JNX0VOQUJMRU1FTlRfRVhQLCB0aGlzLnBsYXRmb3JtSWRNb2RlbC5nZXRWYWx1ZSgpKTsKLQkJCWVuYWJsZW1lbnRWYXJpYWJsZXMucHV0KEpwYUxpYnJhcnlQcm92aWRlckluc3RhbGxPcGVyYXRpb25Db25maWcuSlBBX1BMQVRGT1JNX0RFU0NSSVBUSU9OX0VOQUJMRU1FTlRfRVhQLCB0aGlzLmpwYVByb2plY3RNb2RlbC5nZXRWYWx1ZSgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQkKLQkJCWlmICghIGxpYkluc3RhbGxEZWxlZ2F0ZS5nZXRMaWJyYXJ5UHJvdmlkZXIoKS5pc0VuYWJsZWRGb3IoCi0JCQkJCWdldEZhY2V0ZWRQcm9qZWN0KCksIGdldFByb2plY3RGYWNldFZlcnNpb24oKSwgZW5hYmxlbWVudFZhcmlhYmxlcykpIHsKLQkJCQlyZXR1cm4gYnVpbGRFcnJvclN0YXR1cyhKcHRDb3JlTWVzc2FnZXMuVkFMSURBVEVfTElCUkFSWV9QUk9WSURFUl9JTlZBTElEKTsKLQkJCX0KLSAgICAgICAgfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JCi0JLy8gKioqKioqKioqKiBVSSBtb2RlbCBhZGFwdGVycyAqKioqKioqKioqCi0KLQkvKioKLQkgKiBUcmVhdCB0aGUgSlBBIHByb2plY3QgYXMgYW4gImFzcGVjdCIgb2YgdGhlIEVjbGlwc2UgcHJvamVjdCAoSVByb2plY3QpOwotCSAqIGJ1dCB0aGUgSlBBIHByb2plY3QgaXMgc3RvcmVkIGluIHRoZSBKUEEgbW9kZWwsIG5vdCB0aGUgRWNsaXBzZSBwcm9qZWN0Ci0JICogaXRzZWxmLi4uLgotCSAqIFdlIGFsc28gbmVlZCB0byBsaXN0ZW4gZm9yIHRoZSBKUEEgcHJvamVjdCB0byBiZSByZWJ1aWx0IGlmIHRoZSB1c2VyCi0JICogY2hhbmdlcyB0aGUgRWNsaXBzZSBwcm9qZWN0J3MgSlBBIHBsYXRmb3JtICh3aGljaCBpcyBzdG9yZWQgaW4gdGhlCi0JICogRWNsaXBzZSBwcm9qZWN0J3MgcHJlZmVyZW5jZXMpLgotCSAqLwotCXN0YXRpYyBjbGFzcyBKcGFQcm9qZWN0TW9kZWwKLQkJCWV4dGVuZHMgQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjxJUHJvamVjdCwgSnBhUHJvamVjdD4gewotCQkJCQotCQkvKioKLQkJICogVGhlIEpQQSBwcm9qZWN0IG1heSBhbHNvIGNoYW5nZSB2aWEgYW5vdGhlciBwYWdlIChub3RhYmx5LCB0aGUgcHJvamVjdCBmYWNldHMgcGFnZSkuCi0JCSAqIEluIHRoYXQgY2FzZSwgdGhlIHByZWZlcmVuY2UgY2hhbmdlIG9jY3VycyBiZWZvcmUgd2UgYWN0dWFsbHkgaGF2ZSBhbm90aGVyIHByb2plY3QsCi0JCSAqIHNvIHdlIG11c3QgbGlzdGVuIHRvIHRoZSBwcm9qZWN0cyBtYW5hZ2VyCi0JCSAqLwotCQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBwcm9qZWN0TWFuYWdlckxpc3RlbmVyOwotCQkKLQkJCi0JCUpwYVByb2plY3RNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SVByb2plY3Q+IHByb2plY3RNb2RlbCkgewotCQkJc3VwZXIocHJvamVjdE1vZGVsKTsKLQkJCXRoaXMucHJvamVjdE1hbmFnZXJMaXN0ZW5lciA9IGJ1aWxkUHJvamVjdE1hbmFnZXJMaXN0ZW5lcigpOwotCQl9Ci0JCQotCQlwcml2YXRlIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBidWlsZFByb2plY3RNYW5hZ2VyTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VBZGFwdGVyKCkgewotCQkJCS8vIHdlIGFyZSBvbmx5IGxvb2tpbmcgZm9yIHRoZSBwcm9qZWN0IHJlYnVpbGQgKmFkZCogZXZlbnQgaGVyZSBzbyB3ZSBjYW4KLQkJCQkvLyBkZXRlcm1pbmUgaWYgdGhlIHBsYXRmb3JtIGhhcyBjaGFuZ2VkLgotCQkJCS8vIHRoZSBvdGhlciBldmVudHMgYXJlIHVuaW1wb3J0YW50IGluIHRoaXMgY2FzZQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCUpwYVByb2plY3RNb2RlbC50aGlzLnBsYXRmb3JtQ2hhbmdlZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJCi0JCXZvaWQgcGxhdGZvcm1DaGFuZ2VkKCkgewotCQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigKLQkJCQkJCUpwYVByb2plY3RNYW5hZ2VyLkpQQV9QUk9KRUNUU19DT0xMRUNUSU9OLCB0aGlzLnByb2plY3RNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQlKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCkucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKAotCQkJCQkJSnBhUHJvamVjdE1hbmFnZXIuSlBBX1BST0pFQ1RTX0NPTExFQ1RJT04sIHRoaXMucHJvamVjdE1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy5zdWJqZWN0KTsKLQkJfQotCX0KLQkKLQkKLQkvKioKLQkgKiBUaGUgSlBBIHByb2plY3QncyBkYXRhIHNvdXJjZSBpcyBhbiBhdXhpbGlhcnkgb2JqZWN0IHRoYXQgbmV2ZXIgY2hhbmdlczsKLQkgKiBzbyBpZiB3ZSBoYXZlIGEgSlBBIHByb2plY3QsIHdlIGhhdmUgYSBKUEEgZGF0YSBzb3VyY2UgYWxzby4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGF0YVNvdXJjZU1vZGVsCi0JCWV4dGVuZHMgVHJhbnNmb3JtYXRpb25Qcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdCwgSnBhRGF0YVNvdXJjZT4KLQl7Ci0JCURhdGFTb3VyY2VNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7Ci0JCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBKcGFEYXRhU291cmNlIHRyYW5zZm9ybV8oSnBhUHJvamVjdCB2YWx1ZSkgewotCQkJcmV0dXJuIHZhbHVlLmdldERhdGFTb3VyY2UoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhlIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZSBpcyBhbiBhc3BlY3Qgb2YgdGhlIEpQQSBwcm9qZWN0J3MKLQkgKiBkYXRhIHNvdXJjZQotCSAqLwotCXN0YXRpYyBjbGFzcyBDb25uZWN0aW9uTW9kZWwKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhRGF0YVNvdXJjZSwgU3RyaW5nPgotCXsKLQkJQ29ubmVjdGlvbk1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsKLQkJCXN1cGVyKG5ldyBEYXRhU291cmNlTW9kZWwoanBhUHJvamVjdE1vZGVsKSwgSnBhRGF0YVNvdXJjZS5DT05ORUNUSU9OX1BST0ZJTEVfTkFNRV9QUk9QRVJUWSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgc2V0VmFsdWVfKFN0cmluZyBjb25uZWN0aW9uKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKGNvbm5lY3Rpb24pOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUgbmFtZSB0byBhIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqLwotCXN0YXRpYyBjbGFzcyBDb25uZWN0aW9uUHJvZmlsZU1vZGVsCi0JCWV4dGVuZHMgQ2FjaGluZ1RyYW5zZm9ybWF0aW9uUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZywgQ29ubmVjdGlvblByb2ZpbGU+Ci0JewotCQlDb25uZWN0aW9uUHJvZmlsZU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGNvbm5lY3Rpb25Nb2RlbCkgewotCQkJc3VwZXIoY29ubmVjdGlvbk1vZGVsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29ubmVjdGlvblByb2ZpbGUgdHJhbnNmb3JtXyhTdHJpbmcgY29ubmVjdGlvbk5hbWUpIHsKLQkJCXJldHVybiBKcHRKcGFEYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNvbm5lY3Rpb25OYW1lKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVHJlYXQgdGhlIEpQQSBwbGF0Zm9ybSBJRCBhcyBhbiAiYXNwZWN0IiBvZiB0aGUgSlBBIHByb2plY3QuCi0JICogVGhlIHBsYXRmb3JtIElEIGlzIHN0b3JlZCBpbiB0aGUgcHJvamVjdCBwcmVmZXJlbmNlcy4KLQkgKiBUaGUgcGxhdGZvcm0gSUQgZG9lcyBub3QgY2hhbmdlIGZvciBhIEpQQSBwcm9qZWN0IC0gaWYgdGhlIHVzZXIgd2FudHMgYQotCSAqIGRpZmZlcmVudCBwbGF0Zm9ybSwgd2UgYnVpbGQgYW4gZW50aXJlbHkgbmV3IEpQQSBwcm9qZWN0LgotCSAqLwotCXN0YXRpYyBjbGFzcyBQbGF0Zm9ybUlkTW9kZWwKLQkJZXh0ZW5kcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPEpwYVByb2plY3QsIFN0cmluZz4KLQl7Ci0JCVBsYXRmb3JtSWRNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7Ci0JCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybUlkKHRoaXMuc3ViamVjdC5nZXRQcm9qZWN0KCkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgbmV3UGxhdGZvcm1JZCkgewotCQkJSnB0SnBhQ29yZVBsdWdpbi5zZXRKcGFQbGF0Zm9ybUlkKHRoaXMuc3ViamVjdC5nZXRQcm9qZWN0KCksIG5ld1BsYXRmb3JtSWQpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJLy8gdGhlIHBsYXRmb3JtIElEIGRvZXMgbm90IGNoYW5nZQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJLy8gdGhlIHBsYXRmb3JtIElEIGRvZXMgbm90IGNoYW5nZQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGUgY29ubmVjdGlvbnMgYXJlIGhlbGQgYnkgYSBzaW5nbGV0b24sIHNvIHRoZSBtb2RlbCBjYW4gYmUgYSBzaW5nbGV0b24KLQkgKiBhbHNvLgotCSAqLwotCS8vIGJ5IGRlZmF1bHQsIEV4dGVuZGVkTGlzdFZhbHVlTW9kZWxXcmFwcGVyIHB1dHMgYSBudWxsIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0VmFsdWVNb2RlbDxTdHJpbmc+IENPTk5FQ1RJT05fQ0hPSUNFU19NT0RFTCA9Ci0JCQluZXcgRXh0ZW5kZWRMaXN0VmFsdWVNb2RlbFdyYXBwZXI8U3RyaW5nPigKLQkJCQkJbmV3IFNvcnRlZExpc3RWYWx1ZU1vZGVsQWRhcHRlcjxTdHJpbmc+KAotCQkJCQkJCW5ldyBDb25uZWN0aW9uQ2hvaWNlc01vZGVsKCksCi0JCQkJCQkJU1RSSU5HX0NPTVBBUkFUT1IKLQkJCQkJKQotCQkJKTsKLQotCS8qKgotCSAqIFdyYXAgdGhlIGNvbm5lY3Rpb24gcHJvZmlsZSBuYW1lcyBoZWxkIGJ5IHRoZSBjb25uZWN0aW9uIHByb2ZpbGUKLQkgKiBmYWN0b3J5IHNpbmdsZXRvbi4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgQ29ubmVjdGlvbkNob2ljZXNNb2RlbAotCQlleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvblZhbHVlTW9kZWwKLQkJaW1wbGVtZW50cyBDb2xsZWN0aW9uVmFsdWVNb2RlbDxTdHJpbmc+Ci0JewotCQlwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcjsKLQotCQlDb25uZWN0aW9uQ2hvaWNlc01vZGVsKCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpIHsKLQkJCQkJQ29ubmVjdGlvbkNob2ljZXNNb2RlbC50aGlzLmNvbGxlY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJfQotCQkJCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVtb3ZlZChTdHJpbmcgbmFtZSkgewotCQkJCQlDb25uZWN0aW9uQ2hvaWNlc01vZGVsLnRoaXMuY29sbGVjdGlvbkNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgY29ubmVjdGlvblByb2ZpbGVSZW5hbWVkKFN0cmluZyBvbGROYW1lLCBTdHJpbmcgbmV3TmFtZSkgewotCQkJCQkvLyBJZ25vcmUgdGhpcyBldmVudCBmb3Igbm93LiBDb25uZWN0aW5nIGEgcHJvZmlsZSBhY3R1YWxseQotCQkJCQkvLyB0aHJvd3MgYSBjb25uZWN0aW9uIHJlbmFtZWQgZXZlbnQsIHdoaWNoIG1lc3NlcyB1cCB0aGUgCi0JCQkJCS8vIGxpc3Qgc2VsZWN0aW9uLiBUaGVyZSBzaG91bGRuJ3QgYmUgYSBjb25uZWN0aW9uIHJlbmFtZWQKLQkJCQkJLy8gd2l0aGluIHRoZSBzY29wZSBvZiB0aGlzIGRpYWxvZyBhbnlob3cuCi0JCQkJCS8vIENvbm5lY3Rpb25DaG9pY2VzTW9kZWwudGhpcy5jb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKCkgewotCQkJdGhpcy5maXJlQ29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvblZhbHVlTW9kZWwuVkFMVUVTLCBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbih0aGlzLml0ZXJhdG9yKCkpKTsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLnNpemUodGhpcy5pdGVyYXRvcigpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VNb2RlbCgpIHsKLQkJCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZU1vZGVsKCkgewotCQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5yZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKHRoaXMuY29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcik7Ci0JCX0KLQotCQlwcml2YXRlIENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSBnZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKSB7Ci0JCQlyZXR1cm4gSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEFkYXB0IHdoZXRoZXIgdGhlIEpQQSBwcm9qZWN0IGhhcyBhIHVzZXIgb3ZlcnJpZGUgc3BlY2lmaWVkCi0JICogKGVpdGhlciBjYXRhbG9nIG9yIHNjaGVtYSk7Ci0JICovCi0JYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgQm9vbGVhbj4KLQl7Ci0JCVVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsLCBwcm9wZXJ0eU5hbWUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih0aGlzLnNwZWNpZmllc1VzZXJPdmVycmlkZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlib29sZWFuIHNwZWNpZmllc1VzZXJPdmVycmlkZURlZmF1bHQoKSB7Ci0JCQlyZXR1cm4gISBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHRoaXMuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCWFic3RyYWN0IFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0KCk7Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIHZhbHVlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCX0KLQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgSlBBIHByb2plY3QgaGFzIGEgdXNlciBvdmVycmlkZSBkZWZhdWx0IGNhdGFsb2cgc3BlY2lmaWVkLgotCSAqLwotCXN0YXRpYyBjbGFzcyBVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0ZsYWdNb2RlbAotCQlleHRlbmRzIFVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwKLQl7Ci0JCVVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nRmxhZ01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsKLQkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCwgSnBhUHJvamVjdC5VU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPR19QUk9QRVJUWSk7Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck92ZXJyaWRlRGVmYXVsdCgpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2coKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgSlBBIHByb2plY3QgaGFzIGEgdXNlciBvdmVycmlkZSBkZWZhdWx0IHNjaGVtYSBzcGVjaWZpZWQuCi0JICovCi0Jc3RhdGljIGNsYXNzIFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWFGbGFnTW9kZWwKLQkJZXh0ZW5kcyBVc2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsCi0JewotCQlVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hRmxhZ01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsKLQkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCwgSnBhUHJvamVjdC5VU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BX1BST1BFUlRZKTsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRVc2VyT3ZlcnJpZGVEZWZhdWx0KCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFRoZSBKUEEgcHJvamVjdCdzIHVzZXIgb3ZlcnJpZGUgZGVmYXVsdCBjYXRhbG9nCi0JICovCi0Jc3RhdGljIGNsYXNzIFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nTW9kZWwKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgU3RyaW5nPgotCXsKLQkJVXNlck92ZXJyaWRlRGVmYXVsdENhdGFsb2dNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhUHJvamVjdD4ganBhUHJvamVjdE1vZGVsKSB7IAotCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsLCBKcGFQcm9qZWN0LlVTRVJfT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HX1BST1BFUlRZKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRVc2VyT3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgY2F0YWxvZykgewotCQkJdGhpcy5zdWJqZWN0LnNldFVzZXJPdmVycmlkZURlZmF1bHRDYXRhbG9nKGNhdGFsb2cpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGUgSlBBIHByb2plY3QncyB1c2VyIG92ZXJyaWRlIGRlZmF1bHQgY2F0YWxvZwotCSAqLwotCXN0YXRpYyBjbGFzcyBVc2VyT3ZlcnJpZGVEZWZhdWx0U2NoZW1hTW9kZWwKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgU3RyaW5nPgotCXsKLQkJVXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYU1vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsgCi0JCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwsIEpwYVByb2plY3QuVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQV9QUk9QRVJUWSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYSgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHNldFZhbHVlXyhTdHJpbmcgc2NoZW1hKSB7Ci0JCQl0aGlzLnN1YmplY3Quc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShzY2hlbWEpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBGbGFnIG9uIHRoZSBKUEEgcHJvamVjdCBpbmRpY2F0aW5nIHdoZXRoZXIgaXQgc2hvdWxkIGRpc2NvdmVyIGFubm90YXRlZAotCSAqIGNsYXNzZXMKLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzTW9kZWwKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgQm9vbGVhbj4KLQl7Ci0JCURpc2NvdmVyQW5ub3RhdGVkQ2xhc3Nlc01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxKcGFQcm9qZWN0PiBqcGFQcm9qZWN0TW9kZWwpIHsgCi0JCQlzdXBlcihqcGFQcm9qZWN0TW9kZWwsIEpwYVByb2plY3QuRElTQ09WRVJTX0FOTk9UQVRFRF9DTEFTU0VTX1BST1BFUlRZKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodGhpcy5zdWJqZWN0LmRpc2NvdmVyc0Fubm90YXRlZENsYXNzZXMoKSk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gdmFsdWUpIHsKLQkJCXRoaXMuc3ViamVjdC5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHZhbHVlLmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBmb2xkZXIgd2hlcmUgdGhlIHNvdXJjZSBmb3IgdGhlIGdlbmVyYXRlZCBDYW5vbmljYWwgTWV0YW1vZGVsCi0JICogaXMgd3JpdHRlbi4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgTWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwKLQkJZXh0ZW5kcyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8SnBhUHJvamVjdCwgU3RyaW5nPgotCXsKLQkJTWV0YW1vZGVsU291cmNlRm9sZGVyTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCkgewotCQkJc3VwZXIoanBhUHJvamVjdE1vZGVsLCBKcGFQcm9qZWN0Ml8wLk1FVEFNT0RFTF9TT1VSQ0VfRk9MREVSX05BTUVfUFJPUEVSVFkpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBTdHJpbmcgYnVpbGRWYWx1ZV8oKSB7Ci0JCQlyZXR1cm4ganBhUHJvamVjdElzSnBhMl8wKCkgPyAoKEpwYVByb2plY3QyXzApIHRoaXMuc3ViamVjdCkuZ2V0TWV0YW1vZGVsU291cmNlRm9sZGVyTmFtZSgpIDogbnVsbDsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oU3RyaW5nIHZhbHVlKSB7Ci0JCQlpZiAodGhpcy5qcGFQcm9qZWN0SXNKcGEyXzAoKSkgewotCQkJCSgoSnBhUHJvamVjdDJfMCkgdGhpcy5zdWJqZWN0KS5zZXRNZXRhbW9kZWxTb3VyY2VGb2xkZXJOYW1lKHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBqcGFQcm9qZWN0SXNKcGEyXzAoKSB7Ci0JCQlyZXR1cm4gSnB0SnBhQ29yZVBsdWdpbi5ub2RlSXNKcGEyXzBDb21wYXRpYmxlKHRoaXMuc3ViamVjdCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEphdmEgcHJvamVjdCBzb3VyY2UgZm9sZGVycy4KLQkgKiBXZSBrZWVwIHRoZSBtZXRhbW9kZWwgc291cmNlIGZvbGRlciBpbiBzeW5jaCB3aXRoIHRoZSBKYXZhIHNvdXJjZSBmb2xkZXJzCi0JICogKGkuZS4gaWYgYSBKYXZhIHNvdXJjZSBmb2xkZXIgaXMgZGVsZXRlZCBvciByZW1vdmVkIGZyb20gdGhlIGJ1aWxkIHBhdGgsCi0JICogd2UgcmVtb3ZlIHRoZSBtZXRhbW9kZWwgc291cmNlIGZvbGRlcik7IHRoZXJlZm9yZSB0aGUgbGlzdCBvZiBmb2xkZXIKLQkgKiBjaG9pY2VzIGRvZXMgbm90IG5lZWQgdG8gYmUgYXVnbWVudGVkIHdpdGggdGhlIGN1cnJlbnQgZm9sZGVyIChhcyB3ZSBkbwotCSAqIHdoZW4gdGhlIGN1cnJlbnQgZm9sZGVyIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBjaG9pY2VzKS4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgSmF2YVNvdXJjZUZvbGRlckNob2ljZXNNb2RlbAotCQlleHRlbmRzIEFzcGVjdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxKcGFQcm9qZWN0LCBTdHJpbmc+Ci0JewotCQlwcml2YXRlIGZpbmFsIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGphdmFFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotCi0JCUphdmFTb3VyY2VGb2xkZXJDaG9pY2VzTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEpwYVByb2plY3Q+IGpwYVByb2plY3RNb2RlbCkgeyAKLQkJCXN1cGVyKGpwYVByb2plY3RNb2RlbCk7Ci0JCQl0aGlzLmphdmFFbGVtZW50Q2hhbmdlZExpc3RlbmVyID0gdGhpcy5idWlsZEphdmFFbGVtZW50Q2hhbmdlZExpc3RlbmVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIGJ1aWxkSmF2YUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IElFbGVtZW50Q2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJSmF2YVNvdXJjZUZvbGRlckNob2ljZXNNb2RlbC50aGlzLnByb2Nlc3NKYXZhRGVsdGEoZXZlbnQuZ2V0RGVsdGEoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCXZvaWQgcHJvY2Vzc0phdmFEZWx0YShJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQkJc3dpdGNoIChkZWx0YS5nZXRFbGVtZW50KCkuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgotCQkJCQl0aGlzLnByb2Nlc3NKYXZhRGVsdGFDaGlsZHJlbihkZWx0YSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCA6Ci0JCQkJCXRoaXMucHJvY2Vzc0phdmFQcm9qZWN0RGVsdGEoZGVsdGEpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7IC8vIGlnbm9yZSBldmVyeXRoaW5nIGVsc2UKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBwcm9jZXNzSmF2YURlbHRhQ2hpbGRyZW4oSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQl0aGlzLnByb2Nlc3NKYXZhRGVsdGEoY2hpbGQpOyAvLyByZWN1cnNlCi0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc0phdmFQcm9qZWN0RGVsdGEoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IChJSmF2YVByb2plY3QpIGRlbHRhLmdldEVsZW1lbnQoKTsKLQkJCWlmIChqYXZhUHJvamVjdC5lcXVhbHModGhpcy5zdWJqZWN0LmdldEphdmFQcm9qZWN0KCkpICYmIHRoaXMuY2xhc3NwYXRoSGFzQ2hhbmdlZChkZWx0YSkpIHsKLQkJCQl0aGlzLmZpcmVDb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uVmFsdWVNb2RlbC5WQUxVRVMsIENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHRoaXMuaXRlcmF0b3IoKSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGNsYXNzcGF0aEhhc0NoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJCXJldHVybiB0aGlzLmRlbHRhRmxhZ0lzU2V0KGRlbHRhLCBJSmF2YUVsZW1lbnREZWx0YS5GX1JFU09MVkVEX0NMQVNTUEFUSF9DSEFOR0VEKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBkZWx0YUZsYWdJc1NldChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSwgaW50IGZsYWcpIHsKLQkJCXJldHVybiAoZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQpICYmCi0JCQkJCUJpdFRvb2xzLmZsYWdJc1NldChkZWx0YS5nZXRGbGFncygpLCBmbGFnKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8U3RyaW5nPiBnZXRJdGVyYWJsZSgpIHsKLQkJCXJldHVybiB0aGlzLmpwYVByb2plY3RJc0pwYTJfMCgpID8KLQkJCQkJKChKcGFQcm9qZWN0Ml8wKSB0aGlzLnN1YmplY3QpLmdldEphdmFTb3VyY2VGb2xkZXJOYW1lcygpIDoKLQkJCQkJRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4ganBhUHJvamVjdElzSnBhMl8wKCkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4ubm9kZUlzSnBhMl8wQ29tcGF0aWJsZSh0aGlzLnN1YmplY3QpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJSmF2YUNvcmUuYWRkRWxlbWVudENoYW5nZWRMaXN0ZW5lcih0aGlzLmphdmFFbGVtZW50Q2hhbmdlZExpc3RlbmVyKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBkaXNlbmdhZ2VTdWJqZWN0XygpIHsKLQkJCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZWRMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEFic3RyYWN0IHByb3BlcnR5IGFzcGVjdCBhZGFwdGVyIGZvciBEVFAgY29ubmVjdGlvbiBwcm9maWxlIGNvbm5lY3Rpb24vZGF0YWJhc2UKLQkgKi8KLQlhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Vj4KLQkJZXh0ZW5kcyBBc3BlY3RQcm9wZXJ0eVZhbHVlTW9kZWxBZGFwdGVyPENvbm5lY3Rpb25Qcm9maWxlLCBWPgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JCUNvbm5lY3Rpb25Qcm9maWxlUHJvcGVydHlBc3BlY3RBZGFwdGVyKFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCkgewotCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7Ci0JCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJfQotCi0JCS8vIHRoZSBjb25uZWN0aW9uIG9wZW5pbmcgaXMgcHJvYmFibHkgdGhlIG9ubHkgdGhpbmcgdGhhdCB3aWxsIGhhcHBlbi4uLgotCQlwcml2YXRlIENvbm5lY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgQ29ubmVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgb3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCQkJQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0eUFzcGVjdEFkYXB0ZXIudGhpcy5jb25uZWN0aW9uT3BlbmVkKHByb2ZpbGUpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIGNvbm5lY3Rpb25PcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJaWYgKHByb2ZpbGUuZXF1YWxzKHRoaXMuc3ViamVjdCkpIHsKLQkJCQl0aGlzLnByb3BlcnR5Q2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5zdWJqZWN0LmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQl0aGlzLnN1YmplY3QucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogTW9uaXRvciB0aGUgY29ubmVjdGlvbiBwcm9maWxlJ3MgY29ubmVjdGlvbiB0byB0aGUgZGF0YWJhc2UKLQkgKiAodXNlZCB0byBlbmFibGUgdGhlICJDb25uZWN0IiBsaW5rKQotCSAqLwotCXN0YXRpYyBjbGFzcyBEaXNjb25uZWN0ZWRNb2RlbAotCQlleHRlbmRzIENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydHlBc3BlY3RBZGFwdGVyPEJvb2xlYW4+Ci0JewotCQlEaXNjb25uZWN0ZWRNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpIHsKLQkJCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZigodGhpcy5zdWJqZWN0ICE9IG51bGwpICYmIHRoaXMuc3ViamVjdC5pc0Rpc2Nvbm5lY3RlZCgpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRGF0YWJhc2UtZGV0ZXJtaW5lZCBkZWZhdWx0IGNhdGFsb2cKLQkgKi8KLQlzdGF0aWMgY2xhc3MgRGF0YWJhc2VEZWZhdWx0Q2F0YWxvZ01vZGVsCi0JCWV4dGVuZHMgQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8U3RyaW5nPgotCXsKLQkJRGF0YWJhc2VEZWZhdWx0Q2F0YWxvZ01vZGVsKFByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCkgewotCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCURhdGFiYXNlIGRiID0gdGhpcy5zdWJqZWN0LmdldERhdGFiYXNlKCk7Ci0JCQlyZXR1cm4gKGRiID09IG51bGwpID8gbnVsbCA6IGRiLmdldERlZmF1bHRDYXRhbG9nSWRlbnRpZmllcigpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBzY2hlbWEgaXMgbm90IGRlcml2ZWQgcHVyZWx5IGZyb20gdGhlIGRhdGFiYXNlOyBpdCBpcyBhbHNvIGRlcGVuZGVudAotCSAqIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkZWZhdWx0IGNhdGFsb2cgKHdoaWNoIG1heSBiZSBvdmVycmlkZGVuCi0JICogYnkgdGhlIHVzZXIpLgotCSAqLwotCXN0YXRpYyBjbGFzcyBEYXRhYmFzZURlZmF1bHRTY2hlbWFNb2RlbAotCQlleHRlbmRzIENvbm5lY3Rpb25Qcm9maWxlUHJvcGVydHlBc3BlY3RBZGFwdGVyPFN0cmluZz4KLQl7Ci0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdENhdGFsb2dNb2RlbDsKLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhdGFsb2dMaXN0ZW5lcjsKLQotCQlEYXRhYmFzZURlZmF1bHRTY2hlbWFNb2RlbCgKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwsCi0JCQkJUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGVmYXVsdENhdGFsb2dNb2RlbAotCQkpIHsKLQkJCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsID0gZGVmYXVsdENhdGFsb2dNb2RlbDsKLQkJCXRoaXMuY2F0YWxvZ0xpc3RlbmVyID0gdGhpcy5idWlsZENhdGFsb2dMaXN0ZW5lcigpOwotCQl9Ci0KLQkJcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2F0YWxvZ0xpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCURhdGFiYXNlRGVmYXVsdFNjaGVtYU1vZGVsLnRoaXMuY2F0YWxvZ0NoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBjYXRhbG9nQ2hhbmdlZCgpIHsKLQkJCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQlzdXBlci5lbmdhZ2VTdWJqZWN0XygpOwotCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhdGFsb2dMaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2F0YWxvZ0xpc3RlbmVyKTsKLQkJCXN1cGVyLmRpc2VuZ2FnZVN1YmplY3RfKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFN0cmluZyBidWlsZFZhbHVlXygpIHsKLQkJCVNjaGVtYUNvbnRhaW5lciBzYyA9IHRoaXMuZ2V0U2NoZW1hQ29udGFpbmVyKCk7Ci0JCQlyZXR1cm4gKHNjID09IG51bGwpID8gbnVsbCA6IHNjLmdldERlZmF1bHRTY2hlbWFJZGVudGlmaWVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFNjaGVtYUNvbnRhaW5lciBnZXRTY2hlbWFDb250YWluZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKSA/IHRoaXMuZ2V0Q2F0YWxvZygpIDogdGhpcy5nZXREYXRhYmFzZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGRhdGFiYXNlU3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQkJcmV0dXJuIChkYiAhPSBudWxsKSAmJiBkYi5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCX0KLQotCQlwcml2YXRlIENhdGFsb2cgZ2V0Q2F0YWxvZygpIHsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLmdldFZhbHVlKCk7Ci0JCQkvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBrbm93IHRoZSBkYXRhYmFzZSBpcyBub3QgbnVsbAotCQkJcmV0dXJuIChuYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nRm9ySWRlbnRpZmllcihuYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERhdGFiYXNlKCk7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEFic3RyYWN0IGNvbGxlY3Rpb24gYXNwZWN0IGFkYXB0ZXIgZm9yIERUUCBjb25uZWN0aW9uIHByb2ZpbGUgY29ubmVjdGlvbi9kYXRhYmFzZQotCSAqLwotCWFic3RyYWN0IHN0YXRpYyBjbGFzcyBDb25uZWN0aW9uUHJvZmlsZUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPEU+Ci0JCWV4dGVuZHMgQXNwZWN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyPENvbm5lY3Rpb25Qcm9maWxlLCBFPgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JCUNvbm5lY3Rpb25Qcm9maWxlQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXIoUHJvcGVydHlWYWx1ZU1vZGVsPENvbm5lY3Rpb25Qcm9maWxlPiBjb25uZWN0aW9uUHJvZmlsZU1vZGVsKSB7Ci0JCQlzdXBlcihjb25uZWN0aW9uUHJvZmlsZU1vZGVsKTsKLQkJCXRoaXMuY29ubmVjdGlvbkxpc3RlbmVyID0gdGhpcy5idWlsZENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl9Ci0KLQkJLy8gdGhlIGNvbm5lY3Rpb24gb3BlbmluZyBpcyBwcm9iYWJseSB0aGUgb25seSB0aGluZyB0aGF0IHdpbGwgaGFwcGVuLi4uCi0JCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBDb25uZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJCQlDb25uZWN0aW9uUHJvZmlsZUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyLnRoaXMuY29ubmVjdGlvbk9wZW5lZChwcm9maWxlKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJdm9pZCBjb25uZWN0aW9uT3BlbmVkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCWlmIChwcm9maWxlLmVxdWFscyh0aGlzLnN1YmplY3QpKSB7Ci0JCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5zdWJqZWN0LmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgZGlzZW5nYWdlU3ViamVjdF8oKSB7Ci0JCQl0aGlzLnN1YmplY3QucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogQ2F0YWxvZ3Mgb24gdGhlIGRhdGFiYXNlLgotCSAqLwotCXN0YXRpYyBjbGFzcyBEYXRhYmFzZUNhdGFsb2dDaG9pY2VzTW9kZWwKLQkJZXh0ZW5kcyBDb25uZWN0aW9uUHJvZmlsZUNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPFN0cmluZz4KLQl7Ci0JCURhdGFiYXNlQ2F0YWxvZ0Nob2ljZXNNb2RlbChQcm9wZXJ0eVZhbHVlTW9kZWw8Q29ubmVjdGlvblByb2ZpbGU+IGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpIHsKLQkJCXN1cGVyKGNvbm5lY3Rpb25Qcm9maWxlTW9kZWwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEl0ZXJhYmxlKCkgewotCQkJRGF0YWJhc2UgZGIgPSB0aGlzLnN1YmplY3QuZ2V0RGF0YWJhc2UoKTsKLQkJCS8vIHVzZSBjYXRhbG9nICppZGVudGlmaWVycyogc2luY2UgdGhlIHN0cmluZyBlbmRzIHVwIGJlaW5nIHRoZSAiZGVmYXVsdCIgZm9yIHZhcmlvdXMgdGV4dCBlbnRyaWVzCi0JCQlyZXR1cm4gKGRiICE9IG51bGwpID8gZGIuZ2V0U29ydGVkQ2F0YWxvZ0lkZW50aWZpZXJzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2NoZW1hcyBvbiB0aGUgZGF0YWJhc2Ugb3IgY2F0YWxvZy4KLQkgKiBUaGlzIGxpc3QgaXMgbm90IGRlcml2ZWQgcHVyZWx5IGZyb20gdGhlIGRhdGFiYXNlOyBpdCBpcyBhbHNvIGRlcGVuZGVudAotCSAqIG9uIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBkZWZhdWx0IGNhdGFsb2cgKHdoaWNoIG1heSBiZSBvdmVycmlkZGVuCi0JICogYnkgdGhlIHVzZXIpLgotCSAqLwotCXN0YXRpYyBjbGFzcyBEYXRhYmFzZVNjaGVtYUNob2ljZXNNb2RlbAotCQlleHRlbmRzIENvbm5lY3Rpb25Qcm9maWxlQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8U3RyaW5nPgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0Q2F0YWxvZ01vZGVsOwotCQlwcml2YXRlIGZpbmFsIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgY2F0YWxvZ0xpc3RlbmVyOwotCi0JCURhdGFiYXNlU2NoZW1hQ2hvaWNlc01vZGVsKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxDb25uZWN0aW9uUHJvZmlsZT4gY29ubmVjdGlvblByb2ZpbGVNb2RlbCwKLQkJCQlQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiBkZWZhdWx0Q2F0YWxvZ01vZGVsCi0JCSkgewotCQkJc3VwZXIoY29ubmVjdGlvblByb2ZpbGVNb2RlbCk7Ci0JCQl0aGlzLmRlZmF1bHRDYXRhbG9nTW9kZWwgPSBkZWZhdWx0Q2F0YWxvZ01vZGVsOwotCQkJdGhpcy5jYXRhbG9nTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ2F0YWxvZ0xpc3RlbmVyKCk7Ci0JCX0KLQotCQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYXRhbG9nTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQkJRGF0YWJhc2VTY2hlbWFDaG9pY2VzTW9kZWwudGhpcy5jYXRhbG9nQ2hhbmdlZCgpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIGNhdGFsb2dDaGFuZ2VkKCkgewotCQkJdGhpcy5jb2xsZWN0aW9uQ2hhbmdlZCgpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGVuZ2FnZVN1YmplY3RfKCkgewotCQkJc3VwZXIuZW5nYWdlU3ViamVjdF8oKTsKLQkJCXRoaXMuZGVmYXVsdENhdGFsb2dNb2RlbC5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYXRhbG9nTGlzdGVuZXIpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgewotCQkJdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmNhdGFsb2dMaXN0ZW5lcik7Ci0JCQlzdXBlci5kaXNlbmdhZ2VTdWJqZWN0XygpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBJdGVyYWJsZTxTdHJpbmc+IGdldEl0ZXJhYmxlKCkgewotCQkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5nZXRTY2hlbWFDb250YWluZXIoKTsKLQkJCS8vIHVzZSBzY2hlbWEgKmlkZW50aWZpZXJzKiBzaW5jZSB0aGUgc3RyaW5nIGVuZHMgdXAgYmVpbmcgdGhlICJkZWZhdWx0IiBmb3IgdmFyaW91cyB0ZXh0IGVudHJpZXMKLQkJCXJldHVybiAoc2MgIT0gbnVsbCkgPyBzYy5nZXRTb3J0ZWRTY2hlbWFJZGVudGlmaWVycygpIDogRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCk7Ci0JCX0KLQotCQlwcml2YXRlIFNjaGVtYUNvbnRhaW5lciBnZXRTY2hlbWFDb250YWluZXIoKSB7Ci0JCQlyZXR1cm4gdGhpcy5kYXRhYmFzZVN1cHBvcnRzQ2F0YWxvZ3MoKSA/IHRoaXMuZ2V0Q2F0YWxvZygpIDogdGhpcy5nZXREYXRhYmFzZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGRhdGFiYXNlU3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJCURhdGFiYXNlIGRiID0gdGhpcy5nZXREYXRhYmFzZSgpOwotCQkJcmV0dXJuIChkYiAhPSBudWxsKSAmJiBkYi5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCX0KLQotCQlwcml2YXRlIENhdGFsb2cgZ2V0Q2F0YWxvZygpIHsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5kZWZhdWx0Q2F0YWxvZ01vZGVsLmdldFZhbHVlKCk7Ci0JCQkvLyBpZiB3ZSBnZXQgaGVyZSB3ZSBrbm93IHRoZSBkYXRhYmFzZSBpcyBub3QgbnVsbAotCQkJcmV0dXJuIChuYW1lID09IG51bGwpID8gbnVsbCA6IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nRm9ySWRlbnRpZmllcihuYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERhdGFiYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21iaW5lIHZhcmlvdXMgbW9kZWxzIHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCBjYXRhbG9nIG9yIHNjaGVtYS4KLQkgKiBJZiB0aGUgdXNlciBoYXMgY2hlY2tlZCB0aGUgIk92ZXJyaWRlIERlZmF1bHQiIGNoZWNrLWJveCwgdGhlIGRlZmF1bHQKLQkgKiBpcyB0aGUgSlBBIHByb2plY3QncyB1c2VyIG92ZXJyaWRlIGRlZmF1bHQsIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBpcwotCSAqIGRldGVybWluZWQgYnkgdGhlIGRhdGFiYXNlLgotCSAqLwotCXN0YXRpYyBjbGFzcyBEZWZhdWx0TW9kZWwKLQkJZXh0ZW5kcyBDb21wb3NpdGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPgotCQlpbXBsZW1lbnRzIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4KLQl7Ci0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWw7Ci0JCXByaXZhdGUgZmluYWwgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8U3RyaW5nPiB1c2VyT3ZlcnJpZGVEZWZhdWx0TW9kZWw7Ci0JCXByaXZhdGUgZmluYWwgUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gZGF0YWJhc2VEZWZhdWx0TW9kZWw7Ci0KLQkJRGVmYXVsdE1vZGVsKAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiB1c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsLAotCQkJCVdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gdXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsLAotCQkJCVByb3BlcnR5VmFsdWVNb2RlbDxTdHJpbmc+IGRhdGFiYXNlRGVmYXVsdE1vZGVsCi0JCSkgewotCQkJc3VwZXIodXNlck92ZXJyaWRlRGVmYXVsdEZsYWdNb2RlbCwgdXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsLCBkYXRhYmFzZURlZmF1bHRNb2RlbCk7Ci0JCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwgPSB1c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsOwotCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0TW9kZWwgPSB1c2VyT3ZlcnJpZGVEZWZhdWx0TW9kZWw7Ci0JCQl0aGlzLmRhdGFiYXNlRGVmYXVsdE1vZGVsID0gZGF0YWJhc2VEZWZhdWx0TW9kZWw7Ci0JCX0KLQotCQkvKioKLQkJICogSWYgdGhlIGNoZWNrYm94IGhhcyBiZWVuIHVuY2hlY2tlZCwgd2UgbmVlZCB0byBjbGVhciBvdXQgdGhlIEpQQQotCQkgKiBwcm9qZWN0J3MgdXNlciBvdmVycmlkZS4KLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJc3VwZXIucHJvcGVydHlDaGFuZ2VkKGV2ZW50KTsKLQkJCWlmIChldmVudC5nZXRTb3VyY2UoKSA9PSB0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRGbGFnTW9kZWwpIHsKLQkJCQlpZiAoICEgdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ0lzU2V0KCkpIHsKLQkJCQkJdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0TW9kZWwuc2V0VmFsdWUobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIElmIHRoZSBjaGVja2JveCBpcyBjaGVja2VkLCByZXR1cm4gdGhlIHVzZXIgb3ZlcnJpZGUgZnJvbSB0aGUgSlBBIHByb2plY3Q7Ci0JCSAqIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlZmF1bHQgZnJvbSB0aGUgZGF0YWJhc2UKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVmFsdWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ0lzU2V0KCkgPwotCQkJCQl0aGlzLnVzZXJPdmVycmlkZURlZmF1bHRNb2RlbC5nZXRWYWx1ZSgpIDoKLQkJCQkJdGhpcy5kYXRhYmFzZURlZmF1bHRNb2RlbC5nZXRWYWx1ZSgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBtYWtlcyBhIHNlbGVjdGlvbiBmcm9tIHRoZQotCQkgKiBkcm9wLWRvd247IHdoaWNoIGlzIG9ubHkgcG9zc2libGUgd2hlbiB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZAotCQkgKiAoYW5kIHRoZSBkcm9wLWRvd24gaXMgZW5hYmxlZCkuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJCXRoaXMudXNlck92ZXJyaWRlRGVmYXVsdE1vZGVsLnNldFZhbHVlKHZhbHVlKTsKLQkJCXRoaXMucHJvcGVydHlDaGFuZ2VkKCk7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gdXNlck92ZXJyaWRlRGVmYXVsdEZsYWdJc1NldCgpIHsKLQkJCXJldHVybiBmbGFnSXNTZXQodGhpcy51c2VyT3ZlcnJpZGVEZWZhdWx0RmxhZ01vZGVsKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQlzYi5hcHBlbmQodGhpcy5nZXRWYWx1ZSgpKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vRGVmYXVsdEpwYVNlbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vRGVmYXVsdEpwYVNlbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGI1ZTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0RlZmF1bHRKcGFTZWxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotCi0vKioKLSAqIFN0cmFpZ2h0Zm9yd2FyZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSnBhU2VsZWN0aW9uIGludGVyZmFjZS4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRKcGFTZWxlY3Rpb24KLQlpbXBsZW1lbnRzIEpwYVNlbGVjdGlvbgotewotCXByaXZhdGUgZmluYWwgSnBhU3RydWN0dXJlTm9kZSBzZWxlY3RlZE5vZGU7Ci0KLQotCXB1YmxpYyBEZWZhdWx0SnBhU2VsZWN0aW9uKEpwYVN0cnVjdHVyZU5vZGUgc2VsZWN0ZWROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzZWxlY3RlZE5vZGUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJBICdzZWxlY3RlZE5vZGUnIGlzIHJlcXVpcmVkOyBvdGhlcndpc2UgdXNlIE5VTExfU0VMRUNUSU9OLiIpOwotCQl9Ci0JCXRoaXMuc2VsZWN0ZWROb2RlID0gc2VsZWN0ZWROb2RlOwotCX0KLQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVOb2RlIGdldFNlbGVjdGVkTm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCS8vIGJ5IGRlZmluaXRpb24sIHRoaXMgc2VsZWN0aW9uIGlzIG5ldmVyIGVtcHR5Ci0JCS8vIHVzZSBJSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OIGZvciBlbXB0eSBzZWxlY3Rpb25zCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoISAob2JqIGluc3RhbmNlb2YgSnBhU2VsZWN0aW9uKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUpwYVNlbGVjdGlvbiBvdGhlciA9IChKcGFTZWxlY3Rpb24pIG9iajsKLQkJcmV0dXJuICggISBvdGhlci5pc0VtcHR5KCkpICYmIHRoaXMuc2VsZWN0ZWROb2RlLmVxdWFscyhvdGhlci5nZXRTZWxlY3RlZE5vZGUoKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlLmhhc2hDb2RlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWROb2RlLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzOGQ2NC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9EZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkNsb25lSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydExpc3RlbmVyMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotCi0vKioKLSAqIEEge0BsaW5rIEpwYVNlbGVjdGlvbk1hbmFnZXJ9IHN0b3JlcyB0aGUgY3VycmVudCB7QGxpbmsgSnBhU2VsZWN0aW9ufSBhbmQgCi0gKiBub3RpZmllcyA8Y29kZT5JU2VsZWN0aW9uTGlzdGVuZXI8L2NvZGU+cyB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcy4KLSAqLwotcHVibGljIGNsYXNzIERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyCi0JaW1wbGVtZW50cyBKcGFTZWxlY3Rpb25NYW5hZ2VyCi17Ci0JLyogVGhlIHdpbmRvdyBmb3Igd2hpY2ggdGhpcyBvYmplY3QgbWFuYWdlcyBzZWxlY3Rpb25zICovCi0JcHJpdmF0ZSBJV29ya2JlbmNoV2luZG93IHdpbmRvdzsKLQkKLQkvKiBUaGUgc2V0IG9mIHBhZ2VzIGZvciB3aGljaCB0aGlzIG9iamVjdCBpcyBtYW5hZ2luZyBzZWxlY3Rpb25zICovCi0JcHJpdmF0ZSBTZXQ8SVdvcmtiZW5jaFBhZ2U+IHBhZ2VzOwotCQotCS8qIFRoZSBhY3RpdmUgZWRpdG9yIHBhcnQgKi8KLQlwcml2YXRlIElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcjsKLQkKLQlwcml2YXRlIEpwYVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uOwotCQotCS8qIFRoZSBtYXAgb2YgPGNvZGU+SUpwYVNlbGVjdGlvblBhcnRpY2lwYW50PC9jb2RlPnMgKGtleWVkIGJ5IHBhcnQpICovCi0JcHJpdmF0ZSBNYXA8SVdvcmtiZW5jaFBhcnQsIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50PiBzZWxlY3Rpb25QYXJ0aWNpcGFudHM7Ci0JCi0JcHJpdmF0ZSBJUGFnZUxpc3RlbmVyIHBhZ2VMaXN0ZW5lcjsKLQkKLQlwcml2YXRlIElQYXJ0TGlzdGVuZXIyIHBhcnRMaXN0ZW5lcjsKLQkKLQkKLQlwdWJsaWMgRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXBhZ2VzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0PElXb3JrYmVuY2hQYWdlPigpKTsKLQkJc2VsZWN0aW9uUGFydGljaXBhbnRzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKG5ldyBIYXNoTWFwPElXb3JrYmVuY2hQYXJ0LCBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudD4oKSk7Ci0JCXBhZ2VMaXN0ZW5lciA9IG5ldyBQYWdlTGlzdGVuZXIoKTsKLQkJcGFydExpc3RlbmVyID0gbmV3IFBhcnRMaXN0ZW5lcigpOwotCQljdXJyZW50U2VsZWN0aW9uID0gRGVmYXVsdEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQl9Ci0JCi0Jdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQl3aW5kb3cgPSBhV2luZG93OwotCQlhV2luZG93LmFkZFBhZ2VMaXN0ZW5lcihwYWdlTGlzdGVuZXIpOwotCQlpbml0UGFnZShhV2luZG93LmdldEFjdGl2ZVBhZ2UoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBpbml0UGFnZShJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCWlmICgocGFnZSAhPSBudWxsKSAmJiAoISBwYWdlcy5jb250YWlucyhwYWdlKSkpIHsKLQkJCXBhZ2UuYWRkUGFydExpc3RlbmVyKHBhcnRMaXN0ZW5lcik7Ci0JCQlwYWdlcy5hZGQocGFnZSk7Ci0JCQlhY3RpdmF0ZUVkaXRvcihwYWdlLmdldEFjdGl2ZUVkaXRvcigpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGlzcG9zZVBhZ2UoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlpZiAoKHBhZ2UgIT0gbnVsbCkgJiYgKHBhZ2VzLmNvbnRhaW5zKHBhZ2UpKSkgewotCQkJcGFnZS5yZW1vdmVQYXJ0TGlzdGVuZXIocGFydExpc3RlbmVyKTsKLQkJCXBhZ2VzLnJlbW92ZShwYWdlKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWN0aXZhdGVFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCWlmIChlZGl0b3IgPT0gYWN0aXZlRWRpdG9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsKSB7Ci0JCQlpbmFjdGl2YXRlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQkJaW5pdFBhcnQoZWRpdG9yKTsKLQkJYWN0aXZlRWRpdG9yID0gZWRpdG9yOwotCQlzZWxlY3RFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluYWN0aXZhdGVFZGl0b3IoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCQotCX0KLQkKLQl2b2lkIGluaXRQYXJ0KElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJaWYgKHNlbGVjdGlvblBhcnRpY2lwYW50cy5nZXQocGFydCkgPT0gbnVsbCkgewotCQkJCUpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gCi0JCQkJCShKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCkgcGFydC5nZXRBZGFwdGVyKEpwYVNlbGVjdGlvblBhcnRpY2lwYW50LmNsYXNzKTsKLQkJCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgewotCQkJCQlzZWxlY3Rpb25QYXJ0aWNpcGFudHMucHV0KHBhcnQsIHNlbGVjdGlvblBhcnRpY2lwYW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdEVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJc2VsZWN0UGFydChlZGl0b3IpOwotCX0KLQkKLQl2b2lkIHNlbGVjdFBhcnQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzZWxlY3Rpb25QYXJ0aWNpcGFudCA9IGdldFNlbGVjdGlvblBhcnRpY2lwYW50KHBhcnQpOwotCQlpZiAoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgewotCQkJc2VsZWN0KHNlbGVjdGlvblBhcnRpY2lwYW50LmdldFNlbGVjdGlvbigpLCBzZWxlY3Rpb25QYXJ0aWNpcGFudCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBoaWRlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCUpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gZ2V0U2VsZWN0aW9uUGFydGljaXBhbnQocGFydCk7Ci0JCWlmICgoc2VsZWN0aW9uUGFydGljaXBhbnQgIT0gbnVsbCkgJiYgKHNlbGVjdGlvblBhcnRpY2lwYW50LmRpc3Bvc2VPbkhpZGUoKSkpIHsKLQkJCWNsb3NlUGFydChwYXJ0KTsKLQkJfQotCX0KLQkKLQl2b2lkIGNsb3NlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCUpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNlbGVjdGlvblBhcnRpY2lwYW50ID0gZ2V0U2VsZWN0aW9uUGFydGljaXBhbnQocGFydCk7Ci0JCWlmIChzZWxlY3Rpb25QYXJ0aWNpcGFudCAhPSBudWxsKSB7Ci0JCQlkaXNwb3NlUGFydChwYXJ0KTsKLQkJCWNoZWNrRm9yTm9FZGl0b3JzKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBkaXNwb3NlUGFydChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWlmICgocGFydCAhPSBudWxsKSAmJiAoc2VsZWN0aW9uUGFydGljaXBhbnRzLmNvbnRhaW5zS2V5KHBhcnQpKSkgewotCQkJc2VsZWN0aW9uUGFydGljaXBhbnRzLnJlbW92ZShwYXJ0KS5kaXNwb3NlKCk7Ci0JCX0KLQl9Ci0JCi0Jdm9pZCBjaGVja0Zvck5vRWRpdG9ycygpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmICgoYWN0aXZlUGFnZSA9PSBudWxsKQotCQkJCXx8IChhY3RpdmVQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKS5sZW5ndGggPT0gMCkpIHsKLQkJCXNlbGVjdChEZWZhdWx0SnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OLCBudWxsKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWdpc3RlcihJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCWluaXRQYXJ0KHBhcnQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4gc2VsZWN0aW9uUGFydGljaXBhbnRzLmdldChwYXJ0KSAhPSBudWxsOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZWxlY3QoSnBhU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiwgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgc291cmNlKSB7Ci0JCWlmIChjdXJyZW50U2VsZWN0aW9uLmVxdWFscyhuZXdTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWN1cnJlbnRTZWxlY3Rpb24gPSBuZXdTZWxlY3Rpb247Ci0JCU9iamVjdCBub25OdWxsU291cmNlID0gKHNvdXJjZSA9PSBudWxsKSA/IHRoaXMgOiBzb3VyY2U7Ci0JCWZpcmVTZWxlY3Rpb25DaGFuZ2UoCi0JCQluZXcgSnBhU2VsZWN0aW9uRXZlbnQobmV3U2VsZWN0aW9uLCBKcGFTZWxlY3Rpb25FdmVudC5TRUxFQ1RJT04sIG5vbk51bGxTb3VyY2UpCi0JCSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0KEpwYVNlbGVjdGlvbiBvbGRTZWxlY3Rpb24sIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNvdXJjZSkgewotCQlpZiAoY3VycmVudFNlbGVjdGlvbi5lcXVhbHMob2xkU2VsZWN0aW9uKSkgewotCQkJY3VycmVudFNlbGVjdGlvbiA9IERlZmF1bHRKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JCQlPYmplY3Qgbm9uTnVsbFNvdXJjZSA9IChzb3VyY2UgPT0gbnVsbCkgPyB0aGlzIDogc291cmNlOwotCQkJZmlyZVNlbGVjdGlvbkNoYW5nZSgKLQkJCQluZXcgSnBhU2VsZWN0aW9uRXZlbnQob2xkU2VsZWN0aW9uLCBKcGFTZWxlY3Rpb25FdmVudC5ERVNFTEVDVElPTiwgbm9uTnVsbFNvdXJjZSkKLQkJCSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpcmVTZWxlY3Rpb25DaGFuZ2UoSnBhU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBzcCA6IHNlbGVjdGlvblBhcnRpY2lwYW50cy52YWx1ZXMoKSkgewotCQkJc3Auc2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBnZXRTZWxlY3Rpb25QYXJ0aWNpcGFudChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJldHVybiBzZWxlY3Rpb25QYXJ0aWNpcGFudHMuZ2V0KHBhcnQpOwotCX0KLQkJCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJd2luZG93LnJlbW92ZVBhZ2VMaXN0ZW5lcihwYWdlTGlzdGVuZXIpOwotCQlzZWxlY3Rpb25QYXJ0aWNpcGFudHMuY2xlYXIoKTsKLQkJCi0JCWZvciAoSXRlcmF0b3I8SVdvcmtiZW5jaFBhZ2U+IHN0cmVhbSA9IG5ldyBDbG9uZUl0ZXJhdG9yPElXb3JrYmVuY2hQYWdlPih0aGlzLnBhZ2VzKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQl0aGlzLmRpc3Bvc2VQYWdlKHN0cmVhbS5uZXh0KCkpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvcjxJV29ya2JlbmNoUGFydD4gc3RyZWFtID0gbmV3IENsb25lSXRlcmF0b3I8SVdvcmtiZW5jaFBhcnQ+KHNlbGVjdGlvblBhcnRpY2lwYW50cy5rZXlTZXQoKSk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJdGhpcy5kaXNwb3NlUGFydChzdHJlYW0ubmV4dCgpKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIGNsYXNzIFBhZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQYWdlTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHBhZ2VBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJLy8gbm9wCi0JCX0KLQkJCi0JCVBhZ2VMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhZ2VDbG9zZWQoSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5kaXNwb3NlUGFnZShwYWdlKTsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFnZU9wZW5lZChJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmluaXRQYWdlKHBhZ2UpOwotCQl9Ci0JfQotCQotCQotCXByaXZhdGUgY2xhc3MgUGFydExpc3RlbmVyIGltcGxlbWVudHMgSVBhcnRMaXN0ZW5lcjIKLQl7Ci0JCVBhcnRMaXN0ZW5lcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5pbml0UGFydChwYXJ0KTsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLnNlbGVjdFBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJaW5pdFBhcnQocGFydCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnRDbG9zZWQoSVdvcmtiZW5jaFBhcnRSZWZlcmVuY2UgcGFydFJlZikgewotCQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IHBhcnRSZWYuZ2V0UGFydChmYWxzZSk7Ci0JCQlpZiAocGFydCAhPSBudWxsKSB7Ci0JCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5jbG9zZVBhcnQocGFydCk7Ci0JCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIudGhpcy5kaXNwb3NlUGFydChwYXJ0KTsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmNoZWNrRm9yTm9FZGl0b3JzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHBhcnREZWFjdGl2YXRlZChJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQkvLyBub3AKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcGFydEhpZGRlbihJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlci50aGlzLmhpZGVQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0SW5wdXRDaGFuZ2VkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCS8vIG5vcAotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0T3BlbmVkKElXb3JrYmVuY2hQYXJ0UmVmZXJlbmNlIHBhcnRSZWYpIHsKLQkJCUlXb3JrYmVuY2hQYXJ0IHBhcnQgPSBwYXJ0UmVmLmdldFBhcnQoZmFsc2UpOwotCQkJaWYgKHBhcnQgIT0gbnVsbCkgewotCQkJCWluaXRQYXJ0KHBhcnQpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBwYXJ0VmlzaWJsZShJV29ya2JlbmNoUGFydFJlZmVyZW5jZSBwYXJ0UmVmKSB7Ci0JCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcGFydFJlZi5nZXRQYXJ0KGZhbHNlKTsKLQkJCWlmIChwYXJ0ICE9IG51bGwpIHsKLQkJCQlpbml0UGFydChwYXJ0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYzkwMDMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC52aWV3cy5KcGFEZXRhaWxzVmlldzsKLQotCi1wdWJsaWMgY2xhc3MgSnBhRGV0YWlsc1NlbGVjdGlvblBhcnRpY2lwYW50Ci0JaW1wbGVtZW50cyBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCAKLXsKLQlwcml2YXRlIGZpbmFsIEpwYURldGFpbHNWaWV3IGRldGFpbHNWaWV3OwotCQotCQotCXB1YmxpYyBKcGFEZXRhaWxzU2VsZWN0aW9uUGFydGljaXBhbnQoSnBhRGV0YWlsc1ZpZXcgZGV0YWlsc1ZpZXcpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kZXRhaWxzVmlldyA9IGRldGFpbHNWaWV3OwotCX0KLQotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZXRhaWxzVmlldy5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKEpwYVNlbGVjdGlvbkV2ZW50IGV2dCkgewotCQl0aGlzLmRldGFpbHNWaWV3LnNlbGVjdChldnQuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc3Bvc2VPbkhpZGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBOT1AKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2N2VhZDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vSnBhU2VsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogIENvbnRyaWJ1dG9yczoKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGludGVyZmFjZSBKcGFTZWxlY3Rpb24gZXh0ZW5kcyBJU2VsZWN0aW9uCi17Ci0Jc3RhdGljIEpwYVNlbGVjdGlvbiBOVUxMX1NFTEVDVElPTiA9Ci0JCW5ldyBKcGFTZWxlY3Rpb24oKSB7Ci0JCQlwdWJsaWMgSnBhU3RydWN0dXJlTm9kZSBnZXRTZWxlY3RlZE5vZGUoKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIk5VTEwgU0VMRUNUSU9OIjsKLQkJCX0KLQkJfTsKLQotCi0JSnBhU3RydWN0dXJlTm9kZSBnZXRTZWxlY3RlZE5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbkV2ZW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWU0YWFjLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbkV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqICBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiAgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTZWxlY3Rpb25FdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IAotewotCS8qKgotCSAqIFNlcmlhbGl6YWJsZSB1aWQKLQkgKiBAc2luY2UgMC41Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0gICAgCi0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHRoYXQgdGhlIHNlbGVjdGlvbiBvYmplY3QgaXMgbm93IHNlbGVjdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgU0VMRUNUSU9OID0gMTsKLQkKLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc2VsZWN0aW9uIG9iamVjdCBoYXMgbm93IGJlZW4gZGVzZWxlY3RlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IERFU0VMRUNUSU9OID0gMjsKLQkKLQkKLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIG9iamVjdCB3aG9zZSBzZWxlY3Rpb24gc3RhdHVzIGhhcyBjaGFuZ2VkCi0JICovCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb24gc2VsZWN0aW9uOwotCQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBzZWxlY3Rpb24gZXZlbnQsIGVpdGhlciBhIFNFTEVDVElPTiBvciBhIERFU0VMRUNUSU9OCi0JICovCi0JcHJpdmF0ZSBpbnQgdHlwZTsKLQkKLQkKLQlwdWJsaWMgSnBhU2VsZWN0aW9uRXZlbnQoSnBhU2VsZWN0aW9uIHRoZVNlbGVjdGlvbiwgaW50IHRoZVR5cGUsIE9iamVjdCBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJc2VsZWN0aW9uID0gdGhlU2VsZWN0aW9uOwotCQl0eXBlID0gdGhlVHlwZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZWxlY3Rpb24gb2JqZWN0IHdob3NlIHNlbGVjdGlvbiBzdGF0dXMgaGFzIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHNlbGVjdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0eXBlIG9mIHNlbGVjdGlvbiBldmVudCwgZWl0aGVyIGEgU0VMRUNUSU9OIG9yIGEgREVTRUxFQ1RJT04KLQkgKi8KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbk1hbmFnZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhMTdiNy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSnBhU2VsZWN0aW9uTWFuYWdlciAKLXsJCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gIAotCSAqIFRoaXMgd2lsbCBuZXZlciBiZSBudWxsLCBidXQgaXQgbWF5IGJlIGVtcHR5LgotCSAqLwotCXB1YmxpYyBKcGFTZWxlY3Rpb24gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgbGlnaHRseSwgdGhpcyB3aWxsIGFmZmVjdCB0aGUgc2VsZWN0aW9uIGZvciBhbGwgaW50ZXJlc3RlZAotCSAqIG9iamVjdHMgaW4gYSB3aW5kb3cuCi0JICogQHBhcmFtIG5ld1NlbGVjdGlvbiAgVGhlIG5ldyBzZWxlY3Rpb24gZm9yIHRoZSBjdXJyZW50IHdpbmRvdy4KLQkgKiBAcGFyYW0gc291cmNlICBUaGUgc2VsZWN0aW9uIHBhcnRpY2lwYW50IChpZiBhbnkpIHRoYXQgaXMgY2F1c2luZyB0aGUgCi0JICogc2VsZWN0aW9uLiAgTWF5IGJlIG51bGwuCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24sIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IHNvdXJjZSk7Ci0JCi0JLyoqCi0JICogTm90IHRvIGJlIGNhbGxlZCBsaWdodGx5LCB0aGlzIHdpbGwgYWZmZWN0IHRoZSBzZWxlY3Rpb24gZm9yIGFsbCBpbnRlcmVzdGVkCi0JICogb2JqZWN0cyBpbiBhIHdpbmRvdy4KLQkgKiBAcGFyYW0gb2xkU2VsZWN0aW9uICBUaGUgb2xkU2VsZWN0aW9uIHdpbGwgYmUgZGVzZWxlY3RlZCwgaWZmIGl0IG1hdGNoZXMgCi0JICogdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiAgSWYgc28sIHRoZSBuZXcgc2VsZWN0aW9uIHdpbGwgYmUgYW4gZW1wdHkgSnBhU2VsZWN0aW9uLgotCSAqIEBwYXJhbSBzb3VyY2UgIFRoZSBzZWxlY3Rpb24gcGFydGljaXBhbnQgKGlmIGFueSkgdGhhdCBpcyBjYXVzaW5nIHRoZSAKLQkgKiBzZWxlY3Rpb24uICBNYXkgYmUgbnVsbC4gCi0JICovCi0JcHVibGljIHZvaWQgZGVzZWxlY3QoSnBhU2VsZWN0aW9uIG9sZFNlbGVjdGlvbiwgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgc291cmNlKTsKLQkKLQkvKioKLQkgKiBUaGlzIG1heSBiZSB1c2VkIHRvIHJlZ2lzdGVyIGEgcGFydCB3aXRoIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBpZiB0aGUgcGFydAotCSAqIGlzIGtub3duIHRvIG5lZWQgYWNjZXNzIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBiZWZvcmUgaXQgaXMgZXZlciBhY3RpdmF0ZWQKLQkgKiBvciBpbiB0aGUgY2FzZSBpdCBtYXkgYmUgYWN0aXZhdGVkIHByaW9yIHRvIHRoZSBzZWxlY3Rpb24gbWFuYWdlciBiZWluZyAKLQkgKiBjcmVhdGVkLgotCSAqIAotCSAqIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGRlcmVnaXN0ZXIgYSBwYXJ0LCBhcyB0aGF0IGhhcHBlbnMgd2hlbiB0aGUgCi0JICogcGFydCBpcyBjbG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXIoSVdvcmtiZW5jaFBhcnQgcGFydCk7Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJ0IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHRvIHJlc3BvbmQgdG8gc2VsZWN0aW9ucwotCSAqIGZyb20gdGhpcyBzZWxlY3Rpb24gbWFuYWdlcgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChJV29ya2JlbmNoUGFydCBwYXJ0KTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTQ1YzAxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVNlbGVjdGlvblBhcnRpY2lwYW50IAotewotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBzZWxlY3Rpb24gb2YgdGhlIHBhcnRpY2lwYW50Ci0JICovCi0JSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpOwotCQotCS8qKgotCSAqIFRoZSBzZWxlY3Rpb24gaGFzIGNoYW5nZWQgaW4gdGhlIGNlbnRyYWwgc2VsZWN0aW9uIG1hbmFnZXIuCi0JICogVXBkYXRlIHRoaXMgcGFydGljaXBhbnQgYWNjb3JkaW5nbHkuCi0JICovCi0Jdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKEpwYVNlbGVjdGlvbkV2ZW50IGV2dCk7Ci0JCi0JLyoqCi0JICogUmV0dXJuIHdoZXRoZXIgdGhpcyBzZWxlY3Rpb24gcGFydGljaXBhbnQgc2hvdWxkIGRpc2Nvbm5lY3QgaXRzZWxmIGZyb20KLQkgKiBpdHMgcGFydCB3aGVuIGl0cyBwYXJ0IGlzIGhpZGRlbiBmcm9tIHZpZXcuCi0JICogPGI+VHlwaWNhbGx5PC9iPiBlZGl0b3IgcGFydGljaXBhbnRzIHdpbGwgcmV0dXJuIHRydWUgYW5kIHZpZXcgcGFydGljaXBhbnRzIHdpbGwKLQkgKiByZXR1cm4gZmFsc2UuCi0JICovCi0JYm9vbGVhbiBkaXNwb3NlT25IaWRlKCk7Ci0JCi0JLyoqCi0JICogVGhpcyBwYXJ0aWNpcGFudCBpcyBubyBsb25nZXIgbmVlZGVkIChtb3N0IGxpa2VseSBiZWNhdXNlIGl0cyBwYXJ0IGhhcyAKLQkgKiBjbG9zZWQpLiAgRGlzcG9zZSBvZiBpdC4KLQkgKi8KLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9KcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGVkMjRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL0pwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwudmlld3Muc3RydWN0dXJlLkpwYVN0cnVjdHVyZVZpZXc7Ci0KLXB1YmxpYyBjbGFzcyBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudAotCWltcGxlbWVudHMgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgCi17Ci0JZmluYWwgSnBhU3RydWN0dXJlVmlldyBzdHJ1Y3R1cmVWaWV3OwotCQotCQotCXB1YmxpYyBKcGFTdHJ1Y3R1cmVTZWxlY3Rpb25QYXJ0aWNpcGFudChKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIsIEpwYVN0cnVjdHVyZVZpZXcgc3RydWN0dXJlVmlldykgewotCQlzdXBlcigpOwotCQl0aGlzLnN0cnVjdHVyZVZpZXcgPSBzdHJ1Y3R1cmVWaWV3OwotCQlzdHJ1Y3R1cmVWaWV3LmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgU3RydWN0dXJlVmlld1NlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbk1hbmFnZXIsIHN0cnVjdHVyZVZpZXcpKTsKLQl9Ci0KLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuc3RydWN0dXJlVmlldy5nZXRKcGFTZWxlY3Rpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChKcGFTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJaWYgKGV2dC5nZXRTb3VyY2UoKSAhPSB0aGlzKSB7Ci0JCQl0aGlzLnN0cnVjdHVyZVZpZXcuc2VsZWN0KGV2dC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBkaXNwb3NlT25IaWRlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIE5PUAotCX0KLQkKLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgKioqKioqKioqKgotCi0JcHJpdmF0ZSBjbGFzcyBTdHJ1Y3R1cmVWaWV3U2VsZWN0aW9uTGlzdGVuZXIgCi0JCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotCXsKLQkJcHJpdmF0ZSBmaW5hbCBKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXI7Ci0KLQkJU3RydWN0dXJlVmlld1NlbGVjdGlvbkxpc3RlbmVyKEpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciwgSnBhU3RydWN0dXJlVmlldyBzdHJ1Y3R1cmVWaWV3KSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5zZWxlY3Rpb25NYW5hZ2VyID0gc2VsZWN0aW9uTWFuYWdlcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoc3RydWN0dXJlVmlldy5nZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkuZ2V0QWN0aXZlUGFydCgpID09IHN0cnVjdHVyZVZpZXcpIHsKLQkJCQlzZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdCh0aGlzLnN0cnVjdHVyZVZpZXdTZWxlY3Rpb24oKSwgSnBhU3RydWN0dXJlU2VsZWN0aW9uUGFydGljaXBhbnQudGhpcyk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIEpwYVNlbGVjdGlvbiBzdHJ1Y3R1cmVWaWV3U2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50LnRoaXMuc3RydWN0dXJlVmlldy5nZXRKcGFTZWxlY3Rpb24oKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWJjOWI5Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeQotewotCXByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IElOU1RBTkNFOwotCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IE1VVEVYID0gbmV3IE9iamVjdCgpOwotCi0KLQkvKioKLQkgKiBFYWNoIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+IGhhcyBpdHMgb3duIDxjb2RlPkpwYVNlbGVjdGlvbk1hbmFnZXI8L2NvZGU+Ci0JICogdG8gdHJhY2sgdGhlIHNlbGVjdGlvbiBldmVudHMgaW4gdGhlIDxjb2RlPklXb3JrYmVuY2hXaW5kb3c8L2NvZGU+LiBBbGwKLQkgKiA8Y29kZT5JU2VsZWN0aW9uTGlzdGVuZXI8L2NvZGU+cyBpbiB0aGUgc2FtZSA8Y29kZT5JV29ya2JlbmNoV2luZG93PC9jb2RlPgotCSAqIHNoYXJlIHRoZSBzYW1lIDxjb2RlPkpwYVNlbGVjdGlvbk1hbmFnZXI8L2NvZGU+LgotCSAqCi0JICogQHJldHVybiBUaGUgPGNvZGU+SnBhU2VsZWN0aW9uTWFuYWdlcjwvY29kZT4gYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50Ci0JICogPGNvZGU+SVdvcmtiZW5jaFdpbmRvdzwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEpwYVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlpZiAoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBpcyB0aHJlYWQgc2FmZSBmb3Igbm93LiB5b3UgbmV2ZXIga25vdyB3aGF0cyBjb21taW5nCi0JCQlzeW5jaHJvbml6ZWQgKE1VVEVYKSB7Ci0JCQkJaWYoSU5TVEFOQ0UgPT0gbnVsbCkgewotCQkJCQlJTlNUQU5DRSA9IG5ldyBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSgpOwotCQkJCQkvLyBpZiB3ZSBkbyB0aGUgaW5pdCBpbnNpZGUgdGhlIGNvbnN0cnVjdG9yIHdlIGVuZCB1cCBpbiBhIGxvb3AKLQkJCQkJLy8gYmVjYXVzZSB0aGUgYWRkV2luZG93TGlzdGVuZXIodGhpcykgZG9lcyBhIGNhbGxiYWNrIHRvIHVzCi0JCQkJCUlOU1RBTkNFLmluaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIElOU1RBTkNFLmludGVybmFsR2V0U2VsZWN0aW9uTWFuYWdlcih3aW5kb3cpOwotCX0KLQotCi0JTWFwPElXb3JrYmVuY2hXaW5kb3csIERlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyPiBtYW5hZ2VyczsKLQotCXByaXZhdGUgV2luZG93TGlzdGVuZXIgd2luZG93TGlzdGVuZXI7Ci0KLQotCXByaXZhdGUgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkoKSB7Ci0JCW1hbmFnZXJzID0gbmV3IEhhc2hNYXA8SVdvcmtiZW5jaFdpbmRvdywgRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXI+KCk7Ci0JCXdpbmRvd0xpc3RlbmVyID0gbmV3IFdpbmRvd0xpc3RlbmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJd29ya2JlbmNoLmFkZFdpbmRvd0xpc3RlbmVyKHdpbmRvd0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKcGFTZWxlY3Rpb25NYW5hZ2VyIGZvciB0aGUgSVdvcmtiZW5jaFdpbmRvdy4KLQkgKiBDcmVhdGVzIGEgbmV3IG9uZSBpZiBub25lIGV4aXN0cyB5ZXQuCi0JICovCi0JRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIgaW50ZXJuYWxHZXRTZWxlY3Rpb25NYW5hZ2VyKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIElXb3JrYmVuY2hXaW5kb3cgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaWYgKCEgbWFuYWdlcnMuY29udGFpbnNLZXkod2luZG93KSkgewotCQkJRGVmYXVsdEpwYVNlbGVjdGlvbk1hbmFnZXIgbWFuYWdlciA9IG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uTWFuYWdlcigpOwotCQkJdGhpcy5tYW5hZ2Vycy5wdXQod2luZG93LCBtYW5hZ2VyKTsKLQkJCW1hbmFnZXIuaW5pdCh3aW5kb3cpOwotCQl9Ci0KLQkJcmV0dXJuIG1hbmFnZXJzLmdldCh3aW5kb3cpOwotCX0KLQotCi0JY2xhc3MgV2luZG93TGlzdGVuZXIgaW1wbGVtZW50cyBJV2luZG93TGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHdpbmRvd09wZW5lZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0Nsb3NlZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHsKLQkJCURlZmF1bHRKcGFTZWxlY3Rpb25NYW5hZ2VyIG1hbmFnZXIgPSBpbnRlcm5hbEdldFNlbGVjdGlvbk1hbmFnZXIoYVdpbmRvdyk7Ci0JCQltYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCW1hbmFnZXJzLnJlbW92ZShhV2luZG93KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IGFXaW5kb3cpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgYVdpbmRvdykgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9UZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjMjRjYy4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3NlbGVjdGlvbi9UZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LlRleHRSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUHJvcGVydHlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi1wdWJsaWMgY2xhc3MgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50Ci0JaW1wbGVtZW50cyBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudAotewotCXByaXZhdGUgZmluYWwgSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyOwotCi0JZmluYWwgSVRleHRFZGl0b3IgdGV4dEVkaXRvcjsKLQotCXByaXZhdGUgZmluYWwgSVByb3BlcnR5TGlzdGVuZXIgZWRpdG9ySW5wdXRMaXN0ZW5lcjsKLQotCXByaXZhdGUgZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBlZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcjsKLQotCXByaXZhdGUgSnBhU2VsZWN0aW9uIGN1cnJlbnRTZWxlY3Rpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZm9yd2FyZFNlbGVjdGlvbiA9IHRydWU7ICAvLyBUT0RPIHRoaXMganVzdCBzbWVsbHMgd3JvbmcgIH5ianYKLQotCi0JcHVibGljIFRleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudChKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIsIElUZXh0RWRpdG9yIHRleHRFZGl0b3IpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxlY3Rpb25NYW5hZ2VyID0gc2VsZWN0aW9uTWFuYWdlcjsKLQkJdGhpcy50ZXh0RWRpdG9yID0gdGV4dEVkaXRvcjsKLQkJdGhpcy5lZGl0b3JJbnB1dExpc3RlbmVyID0gbmV3IEVkaXRvcklucHV0TGlzdGVuZXIoKTsKLQkJdGhpcy50ZXh0RWRpdG9yLmFkZFByb3BlcnR5TGlzdGVuZXIodGhpcy5lZGl0b3JJbnB1dExpc3RlbmVyKTsKLQkJdGhpcy5lZGl0b3JTZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmdldFBvc3RTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcy5lZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IHRoaXMuY2FsY3VsYXRlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJSnBhU2VsZWN0aW9uUGFydGljaXBhbnQgaW1wbGVtZW50YXRpb24gKioqKioqKioqKgotCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLmN1cnJlbnRTZWxlY3Rpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChKcGFTZWxlY3Rpb25FdmVudCBldnQpIHsKLQkJSnBhU2VsZWN0aW9uIG5ld1NlbGVjdGlvbiA9IGV2dC5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoKG5ld1NlbGVjdGlvbiA9PSBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT04pCi0JCQl8fCBuZXdTZWxlY3Rpb24uZXF1YWxzKHRoaXMuY3VycmVudFNlbGVjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChnZXRBY3RpdmVUZXh0RWRpdG9yKCkgIT0gdGhpcy50ZXh0RWRpdG9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0aGlzLmZvcndhcmRTZWxlY3Rpb24gPSBmYWxzZTsKLQkJVGV4dFJhbmdlIHRleHRSYW5nZSA9IG5ld1NlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKS5nZXRTZWxlY3Rpb25UZXh0UmFuZ2UoKTsKLQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKHRleHRSYW5nZS5nZXRPZmZzZXQoKSwgdGV4dFJhbmdlLmdldExlbmd0aCgpKTsKLQkJCXRoaXMuY3VycmVudFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlvbjsKLQkJfQotCQl0aGlzLmZvcndhcmRTZWxlY3Rpb24gPSB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGRpc3Bvc2VPbkhpZGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMudGV4dEVkaXRvci5yZW1vdmVQcm9wZXJ0eUxpc3RlbmVyKHRoaXMuZWRpdG9ySW5wdXRMaXN0ZW5lcik7Ci0JCXRoaXMuZ2V0UG9zdFNlbGVjdGlvblByb3ZpZGVyKCkucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLmVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSnBhU2VsZWN0aW9uIGNhbGN1bGF0ZVNlbGVjdGlvbigpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0aGlzLnRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSkgewotCQkJcmV0dXJuIEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJfQotCi0JCUpwYUZpbGUganBhRmlsZSA9IHRoaXMuZ2V0SnBhRmlsZSgpOwotCQlpZiAoanBhRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXMuYnVpbGRTZWxlY3Rpb24oanBhRmlsZS5nZXRTdHJ1Y3R1cmVOb2RlKCgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0T2Zmc2V0KCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhU2VsZWN0aW9uIGJ1aWxkU2VsZWN0aW9uKEpwYVN0cnVjdHVyZU5vZGUgc2VsZWN0ZWROb2RlKSB7Ci0JCXJldHVybiAoc2VsZWN0ZWROb2RlID09IG51bGwpID8gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OIDogbmV3IERlZmF1bHRKcGFTZWxlY3Rpb24oc2VsZWN0ZWROb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhZ2UgZ2V0QWN0aXZlUGFnZSgpIHsKLQkJcmV0dXJuIHRoaXMudGV4dEVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgZ2V0QWN0aXZlUGFydCgpIHsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IGdldEFjdGl2ZVBhZ2UoKTsKLQkJcmV0dXJuIChhY3RpdmVQYWdlID09IG51bGwpID8gbnVsbDogYWN0aXZlUGFnZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBnZXRBY3RpdmVFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCXJldHVybiAoYWN0aXZlUGFnZSA9PSBudWxsKSA/IG51bGw6IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZ2V0VGV4dEVkaXRvcihnZXRBY3RpdmVFZGl0b3IoKSk7Ci0JfQotCQotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJcmV0dXJuIChwYXJ0ID09IG51bGwpID8gbnVsbCA6IChJVGV4dEVkaXRvcikgcGFydC5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYUZpbGUgZ2V0SnBhRmlsZSgpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gdGhpcy50ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmICggISAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCkpOwotCX0KLQotCXByb3RlY3RlZCBJUG9zdFNlbGVjdGlvblByb3ZpZGVyIGdldFBvc3RTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB0aGlzLnRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXIgY2FsbGJhY2tzICoqKioqKioqKioKLQotCXByb3RlY3RlZCB2b2lkIGVkaXRvcklucHV0Q2hhbmdlZCgpIHsKLQkJdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZWRpdG9yU2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gVGhpcyBpcyBhIGJpdCBrbHVkZ2V5LiAgV2UgY2hlY2sgdG8gc2VlIGlmIHRoZSBzZWxlY3Rpb24gZXZlbnQgCi0JCS8vIG9jY3VycmVkIHdoZW4gYSBwYXJ0aWNpcGF0aW5nIHBhcnQgaXMgYWN0aXZlIChhbmQgc28sIG9zdGVuc2libHksCi0JCS8vICpiZWNhdXNlKiBvZiB0aGUgcGFydGljaXBhdGluZyBwYXJ0KS4gIElmIHNvLCB3ZSByZXNlbGVjdCB0aGUgdmFsaWQgCi0JCS8vIHRleHQuCi0JCUlXb3JrYmVuY2hQYXJ0IGFjdGl2ZVBhcnQgPSBnZXRBY3RpdmVQYXJ0KCk7Ci0JCWlmIChnZXRUZXh0RWRpdG9yKGFjdGl2ZVBhcnQpICE9IHRoaXMudGV4dEVkaXRvciAmJiB0aGlzLnNlbGVjdGlvbk1hbmFnZXIuaXNSZWdpc3RlcmVkKGFjdGl2ZVBhcnQpKSB7Ci0JCQlpZiAodGhpcy5jdXJyZW50U2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCQotCQkJdGhpcy5mb3J3YXJkU2VsZWN0aW9uID0gZmFsc2U7Ci0JCQlUZXh0UmFuZ2UgdGV4dFJhbmdlID0gdGhpcy5jdXJyZW50U2VsZWN0aW9uLmdldFNlbGVjdGVkTm9kZSgpLmdldFNlbGVjdGlvblRleHRSYW5nZSgpOwotCQkJaWYgKHRleHRSYW5nZSAhPSBudWxsKSB7Ci0JCQkJdGhpcy50ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbCh0ZXh0UmFuZ2UuZ2V0T2Zmc2V0KCksIHRleHRSYW5nZS5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQl0aGlzLmZvcndhcmRTZWxlY3Rpb24gPSB0cnVlOwotCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCXRoaXMuc2VsZWN0aW9uQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoKSB7Ci0JCUpwYVNlbGVjdGlvbiBuZXdTZWxlY3Rpb24gPSB0aGlzLmNhbGN1bGF0ZVNlbGVjdGlvbigpOwotCQlpZiAobmV3U2VsZWN0aW9uLmVxdWFscyh0aGlzLmN1cnJlbnRTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uOwotCQkKLQkJaWYgKHRoaXMuZm9yd2FyZFNlbGVjdGlvbikgewotCQkJdGhpcy5zZWxlY3Rpb25NYW5hZ2VyLnNlbGVjdChuZXdTZWxlY3Rpb24sIHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRWRpdG9ySW5wdXRMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUxpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIEVkaXRvcklucHV0TGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChPYmplY3Qgc291cmNlLCBpbnQgcHJvcElkKSB7Ci0JCQlpZiAoKHNvdXJjZSA9PSBUZXh0RWRpdG9yU2VsZWN0aW9uUGFydGljaXBhbnQudGhpcy50ZXh0RWRpdG9yKQotCQkJCQkJJiYgKHByb3BJZCA9PSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUKSkgewotCQkJCVRleHRFZGl0b3JTZWxlY3Rpb25QYXJ0aWNpcGFudC50aGlzLmVkaXRvcklucHV0Q2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50LnRoaXMuZWRpdG9yU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1dvcmtiZW5jaFBhcnRBZGFwdGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vV29ya2JlbmNoUGFydEFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTA3MzIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vV29ya2JlbmNoUGFydEFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnZpZXdzLkpwYURldGFpbHNWaWV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwudmlld3Muc3RydWN0dXJlLkpwYVN0cnVjdHVyZVZpZXc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBGYWN0b3J5IHRvIGJ1aWxkIGFkYXB0ZXJzIGZvciBhIHdvcmtiZW5jaCBwYXJ0OgotICogICAtIEpQQSBzZWxlY3Rpb24gcGFydGljaXBhbnQgKGlmIHRoZSBlZGl0b3IgcGFydCBpcyBhIHRleHQgZWRpdG9yIGV0Yy4pCi0gKiAKLSAqIFNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpIHBsdWdpbi54bWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hQYXJ0QWRhcHRlckZhY3RvcnkgCi0JaW1wbGVtZW50cyBJQWRhcHRlckZhY3RvcnkKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIEFEQVBURVJfTElTVCA9IG5ldyBDbGFzc1tdIHsgSnBhU2VsZWN0aW9uUGFydGljaXBhbnQuY2xhc3MgfTsKLQotCXB1YmxpYyBDbGFzczw/PltdIGdldEFkYXB0ZXJMaXN0KCkgewotCQlyZXR1cm4gQURBUFRFUl9MSVNUOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlT2JqZWN0LCBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKGFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIElXb3JrYmVuY2hQYXJ0KSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRBZGFwdGVyKChJV29ya2JlbmNoUGFydCkgYWRhcHRhYmxlT2JqZWN0LCBhZGFwdGVyVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWRhcHRlcihJV29ya2JlbmNoUGFydCB3b3JrYmVuY2hQYXJ0LCBDbGFzczw/PiBhZGFwdGVyVHlwZSkgewotCQlpZiAoYWRhcHRlclR5cGUgPT0gSnBhU2VsZWN0aW9uUGFydGljaXBhbnQuY2xhc3MpIHsKLQkJCXJldHVybiB0aGlzLmJ1aWxkSnBhU2VsZWN0aW9uUGFydGljaXBhbnQod29ya2JlbmNoUGFydCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb25QYXJ0aWNpcGFudCBidWlsZEpwYVNlbGVjdGlvblBhcnRpY2lwYW50KElXb3JrYmVuY2hQYXJ0IHdvcmtiZW5jaFBhcnQpIHsKLQkJSnBhU2VsZWN0aW9uTWFuYWdlciBzZWxlY3Rpb25NYW5hZ2VyID0gU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcih3b3JrYmVuY2hQYXJ0LmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCWlmICh3b3JrYmVuY2hQYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCXJldHVybiBuZXcgVGV4dEVkaXRvclNlbGVjdGlvblBhcnRpY2lwYW50KHNlbGVjdGlvbk1hbmFnZXIsIChJVGV4dEVkaXRvcikgd29ya2JlbmNoUGFydCk7Ci0JCX0KLQkJaWYgKHdvcmtiZW5jaFBhcnQgaW5zdGFuY2VvZiBKcGFTdHJ1Y3R1cmVWaWV3KSB7Ci0JCQlyZXR1cm4gbmV3IEpwYVN0cnVjdHVyZVNlbGVjdGlvblBhcnRpY2lwYW50KHNlbGVjdGlvbk1hbmFnZXIsIChKcGFTdHJ1Y3R1cmVWaWV3KSB3b3JrYmVuY2hQYXJ0KTsKLQkJfQotCQlpZiAod29ya2JlbmNoUGFydCBpbnN0YW5jZW9mIEpwYURldGFpbHNWaWV3KSB7Ci0JCQlyZXR1cm4gbmV3IEpwYURldGFpbHNTZWxlY3Rpb25QYXJ0aWNpcGFudCgoSnBhRGV0YWlsc1ZpZXcpIHdvcmtiZW5jaFBhcnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvR2VuZXJhbEpwYU1hcHBpbmdJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0dlbmVyYWxKcGFNYXBwaW5nSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOGRhOWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvR2VuZXJhbEpwYU1hcHBpbmdJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5QZXJzaXN0ZW50VHlwZUl0ZW1MYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJhbEpwYU1hcHBpbmdJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudFR5cGVJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVudFR5cGUpIGl0ZW0sIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtTGFiZWxQcm92aWRlcigoUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCBsYWJlbFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQxOWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL0phdmFJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkphdmFQZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyID0gKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcjsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKcGFGaWxlKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyKChKcGFGaWxlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJcmV0dXJuIG5ldyBKYXZhUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChKYXZhUGVyc2lzdGVudFR5cGUpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVudEF0dHJpYnV0ZUl0ZW1Db250ZW50UHJvdmlkZXIoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkM2M1NDEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZTsKLQotCi1wdWJsaWMgY2xhc3MgSmF2YUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBleHRlbmRzIEdlbmVyYWxKcGFNYXBwaW5nSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5Ci17Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3N0cnVjdHVyZS9KYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDcxNjEuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvSmF2YVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyCi0JaW1wbGVtZW50cyBKcGFTdHJ1Y3R1cmVQcm92aWRlcgotewotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVN0cnVjdHVyZVByb3ZpZGVyIElOU1RBTkNFID0gbmV3IEphdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIEphdmFSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IEphdmFJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCX0KLQkKLQlwdWJsaWMgSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5IGdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBKYXZhSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViM2RlOTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5MaXN0Q29sbGVjdGlvblZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uVmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5Pcm1QZXJzaXN0ZW50VHlwZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgaW1wbGVtZW50cyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLXsKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXIgYnVpbGRJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciB0cmVlQ29udGVudFByb3ZpZGVyID0gKERlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIpIGNvbnRlbnRQcm92aWRlcjsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKcGFGaWxlKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyKChKcGFGaWxlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIEVudGl0eU1hcHBpbmdzKSB7Ci0JCQlyZXR1cm4gbmV3IEVudGl0eU1hcHBpbmdzSXRlbUNvbnRlbnRQcm92aWRlcigoRW50aXR5TWFwcGluZ3MpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpIHsKLQkJCXJldHVybiBuZXcgT3JtUGVyc2lzdGVudFR5cGVJdGVtQ29udGVudFByb3ZpZGVyKChPcm1QZXJzaXN0ZW50VHlwZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbnRBdHRyaWJ1dGVJdGVtQ29udGVudFByb3ZpZGVyKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlNYXBwaW5nc0l0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPE9ybVBlcnNpc3RlbnRUeXBlPgotCXsKLQkJcHVibGljIEVudGl0eU1hcHBpbmdzSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncywgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKGVudGl0eU1hcHBpbmdzLCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIEVudGl0eU1hcHBpbmdzIGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJLy8gSSdkIGxpa2UgdG8gcmV0dXJuIHRoZSByZXNvdXJjZSBtb2RlbCBoZXJlLCBidXQgdGhhdCBpbnZvbHZlcyBhIGhlZnR5IAotCQkJLy8gQVBJIGNoYW5nZSAtIHdlJ2xsIHNlZSB3aGF0IGhhcHBlbnMgd2l0aCB0aGlzIGNvZGUgZmlyc3QKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIENvbGxlY3Rpb25WYWx1ZU1vZGVsPE9ybVBlcnNpc3RlbnRUeXBlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlyZXR1cm4gbmV3IExpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI8T3JtUGVyc2lzdGVudFR5cGU+KAotCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPEVudGl0eU1hcHBpbmdzLCBPcm1QZXJzaXN0ZW50VHlwZT4oCi0JCQkJCUVudGl0eU1hcHBpbmdzLlBFUlNJU1RFTlRfVFlQRVNfTElTVCwgZ2V0TW9kZWwoKSkgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8T3JtUGVyc2lzdGVudFR5cGU+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQZXJzaXN0ZW50VHlwZXMoKTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZDIxYWMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5EZWxlZ2F0aW5nQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkVudGl0eU1hcHBpbmdzSXRlbUxhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBPcm1JdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZXh0ZW5kcyBHZW5lcmFsSnBhTWFwcGluZ0l0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotewotCUBPdmVycmlkZQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBsYWJlbFByb3ZpZGVyKSB7Ci0JCWlmIChpdGVtIGluc3RhbmNlb2YgRW50aXR5TWFwcGluZ3MpIHsKLQkJCXJldHVybiBuZXcgRW50aXR5TWFwcGluZ3NJdGVtTGFiZWxQcm92aWRlcigoRW50aXR5TWFwcGluZ3MpIGl0ZW0sIGxhYmVsUHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBzdXBlci5idWlsZEl0ZW1MYWJlbFByb3ZpZGVyKGl0ZW0sIGxhYmVsUHJvdmlkZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL09ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlci5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0OGFmYjkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvT3JtUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnN0cnVjdHVyZS5KcGFTdHJ1Y3R1cmVQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIE9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcgotCWltcGxlbWVudHMgSnBhU3RydWN0dXJlUHJvdmlkZXIKLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBJTlNUQU5DRSA9IG5ldyBPcm1SZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIE9ybVJlc291cmNlTW9kZWxTdHJ1Y3R1cmVQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JCi0JcHVibGljIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSBnZXRUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgT3JtSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkoKTsKLQl9Ci0JCi0JcHVibGljIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXJldHVybiBuZXcgT3JtSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDg5MTBhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc3RydWN0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5MaXN0SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db2xsZWN0aW9uTGlzdFZhbHVlTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Db21wb3NpdGVMaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuTGlzdEFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RDb2xsZWN0aW9uVmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5KYXJGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBUcmVlSXRlbUNvbnRlbnRQcm92aWRlciBidWlsZEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlPYmplY3QgaXRlbSwgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSB7Ci0JCURlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXIgdHJlZUNvbnRlbnRQcm92aWRlciA9IChEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKSBjb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBKcGFGaWxlKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyKChKcGFGaWxlKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgUGVyc2lzdGVuY2UpIHsKLQkJCXJldHVybiBuZXcgUGVyc2lzdGVuY2VJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZSkgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyKChQZXJzaXN0ZW5jZVVuaXQpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgTWFwcGluZ0ZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgTWFwcGluZ0ZpbGVSZWZJdGVtQ29udGVudFByb3ZpZGVyKChNYXBwaW5nRmlsZVJlZikgaXRlbSwgdHJlZUNvbnRlbnRQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBDbGFzc1JlZikgewotCQkJcmV0dXJuIG5ldyBDbGFzc1JlZkl0ZW1Db250ZW50UHJvdmlkZXIoKENsYXNzUmVmKSBpdGVtLCB0cmVlQ29udGVudFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphckZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgSmFyRmlsZVJlZkl0ZW1Db250ZW50UHJvdmlkZXIoKEphckZpbGVSZWYpIGl0ZW0sIHRyZWVDb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8UGVyc2lzdGVuY2VVbml0PgotCXsKLQkJcHVibGljIFBlcnNpc3RlbmNlSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKHBlcnNpc3RlbmNlLCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBQZXJzaXN0ZW5jZSBnZXRNb2RlbCgpIHsKLQkJCXJldHVybiAoUGVyc2lzdGVuY2UpIHN1cGVyLmdldE1vZGVsKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudCgpIHsKLQkJCS8vIEknZCBsaWtlIHRvIHJldHVybiB0aGUgcmVzb3VyY2UgbW9kZWwgaGVyZSwgYnV0IHRoYXQgaW52b2x2ZXMgYSBoZWZ0eSAKLQkJCS8vIEFQSSBjaGFuZ2UgLSB3ZSdsbCBzZWUgd2hhdCBoYXBwZW5zIHdpdGggdGhpcyBjb2RlIGZpcnN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQ+IGJ1aWxkQ2hpbGRyZW5Nb2RlbCgpIHsKLQkJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxQZXJzaXN0ZW5jZVVuaXQ+KAotCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlLCBQZXJzaXN0ZW5jZVVuaXQ+KFBlcnNpc3RlbmNlLlBFUlNJU1RFTkNFX1VOSVRTX0xJU1QsIGdldE1vZGVsKCkpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPFBlcnNpc3RlbmNlVW5pdD4gZ2V0TGlzdEl0ZXJhYmxlKCkgewotCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRQZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCXJldHVybiBzdWJqZWN0LmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzaXN0ZW5jZVVuaXRJdGVtQ29udGVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjxKcGFTdHJ1Y3R1cmVOb2RlPgotCXsKLQkJcHVibGljIFBlcnNpc3RlbmNlVW5pdEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKHBlcnNpc3RlbmNlVW5pdCwgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBQZXJzaXN0ZW5jZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQYXJlbnQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDb2xsZWN0aW9uVmFsdWVNb2RlbDxKcGFTdHJ1Y3R1cmVOb2RlPiBidWlsZENoaWxkcmVuTW9kZWwoKSB7Ci0JCQlMaXN0VmFsdWVNb2RlbDxNYXBwaW5nRmlsZVJlZj4gc3BlY2lmaWVkTWFwcGluZ0ZpbGVMdm0gPSAKLQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBNYXBwaW5nRmlsZVJlZj4oCi0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQuU1BFQ0lGSUVEX01BUFBJTkdfRklMRV9SRUZTX0xJU1QsCi0JCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPE1hcHBpbmdGaWxlUmVmPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkKLQkJCUxpc3RWYWx1ZU1vZGVsPE1hcHBpbmdGaWxlUmVmPiBpbXBsaWVkTWFwcGluZ0ZpbGVDdm0gPSAKLQkJCQluZXcgUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI8TWFwcGluZ0ZpbGVSZWY+KAotCQkJCQluZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgTWFwcGluZ0ZpbGVSZWY+KAotCQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5JTVBMSUVEX01BUFBJTkdfRklMRV9SRUZfUFJPUEVSVFksCi0JCQkJCQkJZ2V0TW9kZWwoKSkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGVSZWYgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJTGlzdFZhbHVlTW9kZWw8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzQ3ZtID0gCi0JCQkJbmV3IExpc3RBc3BlY3RBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdCwgQ2xhc3NSZWY+KAotCQkJCQkJUGVyc2lzdGVuY2VVbml0LlNQRUNJRklFRF9DTEFTU19SRUZTX0xJU1QsCi0JCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPENsYXNzUmVmPiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKTsKLQkJCQkJfQotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldFNwZWNpZmllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQlMaXN0VmFsdWVNb2RlbDxDbGFzc1JlZj4gaW1wbGllZENsYXNzQ3ZtID0gCi0JCQkJbmV3IENvbGxlY3Rpb25MaXN0VmFsdWVNb2RlbEFkYXB0ZXI8Q2xhc3NSZWY+KAotCQkJCQluZXcgQ29sbGVjdGlvbkFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBDbGFzc1JlZj4oCi0JCQkJCQkJUGVyc2lzdGVuY2VVbml0LklNUExJRURfQ0xBU1NfUkVGU19DT0xMRUNUSU9OLAotCQkJCQkJCWdldE1vZGVsKCkpIHsKLQkJCQkJCUBPdmVycmlkZQotCQkJCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPENsYXNzUmVmPiBnZXRJdGVyYWJsZSgpIHsKLQkJCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRJbXBsaWVkQ2xhc3NSZWZzKCk7Ci0JCQkJCQl9Ci0JCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCQkJcmV0dXJuIHN1YmplY3QuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQlMaXN0VmFsdWVNb2RlbDxKYXJGaWxlUmVmPiBqYXJGaWxlQ3ZtID0KLQkJCQluZXcgTGlzdEFzcGVjdEFkYXB0ZXI8UGVyc2lzdGVuY2VVbml0LCBKYXJGaWxlUmVmPigKLQkJCQkJCVBlcnNpc3RlbmNlVW5pdC5KQVJfRklMRV9SRUZTX0xJU1QsCi0JCQkJCQlnZXRNb2RlbCgpKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwcm90ZWN0ZWQgTGlzdEl0ZXJhYmxlPEphckZpbGVSZWY+IGdldExpc3RJdGVyYWJsZSgpIHsKLQkJCQkJCXJldHVybiBzdWJqZWN0LmdldEphckZpbGVSZWZzKCk7Ci0JCQkJCX0KLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBpbnQgc2l6ZV8oKSB7Ci0JCQkJCQlyZXR1cm4gc3ViamVjdC5nZXRKYXJGaWxlUmVmc1NpemUoKTsKLQkJCQkJfQotCQkJCX07Ci0JCQlMaXN0PExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8TGlzdFZhbHVlTW9kZWw8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pig0KTsKLQkJCWxpc3QuYWRkKHNwZWNpZmllZE1hcHBpbmdGaWxlTHZtKTsKLQkJCWxpc3QuYWRkKGltcGxpZWRNYXBwaW5nRmlsZUN2bSk7Ci0JCQlsaXN0LmFkZChzcGVjaWZpZWRDbGFzc0N2bSk7Ci0JCQlsaXN0LmFkZChpbXBsaWVkQ2xhc3NDdm0pOwotCQkJbGlzdC5hZGQoamFyRmlsZUN2bSk7Ci0JCQkKLQkJCXJldHVybiBuZXcgTGlzdENvbGxlY3Rpb25WYWx1ZU1vZGVsQWRhcHRlcjxKcGFTdHJ1Y3R1cmVOb2RlPigKLQkJCQluZXcgQ29tcG9zaXRlTGlzdFZhbHVlTW9kZWwKLQkJCQkJPExpc3RWYWx1ZU1vZGVsPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiwgSnBhU3RydWN0dXJlTm9kZT4KLQkJCQkJCShsaXN0KSk7Ci0JCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBNYXBwaW5nRmlsZVJlZkl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPE1hcHBpbmdGaWxlUmVmPgotCXsKLQkJcHVibGljIE1hcHBpbmdGaWxlUmVmSXRlbUNvbnRlbnRQcm92aWRlcigKLQkJCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiwgRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJCXN1cGVyKG1hcHBpbmdGaWxlUmVmLCBjb250ZW50UHJvdmlkZXIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE1hcHBpbmdGaWxlUmVmIGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChNYXBwaW5nRmlsZVJlZikgc3VwZXIuZ2V0TW9kZWwoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KCkgewotCQkJcmV0dXJuIGdldE1vZGVsKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbigpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQkKLQkKLQlwdWJsaWMgc3RhdGljIGNsYXNzIENsYXNzUmVmSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8Q2xhc3NSZWY+Ci0JewotCQlwdWJsaWMgQ2xhc3NSZWZJdGVtQ29udGVudFByb3ZpZGVyKAotCQkJCUNsYXNzUmVmIGNsYXNzUmVmLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIoY2xhc3NSZWYsIGNvbnRlbnRQcm92aWRlcik7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ2xhc3NSZWYgZ2V0TW9kZWwoKSB7Ci0JCQlyZXR1cm4gKENsYXNzUmVmKSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSmFyRmlsZVJlZkl0ZW1Db250ZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVtQ29udGVudFByb3ZpZGVyPEphckZpbGVSZWY+Ci0JewotCQlwdWJsaWMgSmFyRmlsZVJlZkl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQkJSmFyRmlsZVJlZiBqYXJGaWxlUmVmLCBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQkJc3VwZXIoamFyRmlsZVJlZiwgY29udGVudFByb3ZpZGVyKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBKYXJGaWxlUmVmIGdldE1vZGVsKCkgewotCQkJcmV0dXJuIChKYXJGaWxlUmVmKSBzdXBlci5nZXRNb2RlbCgpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gZ2V0TW9kZWwoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YjM1YWUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkRlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkphckZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5DbGFzc1JlZkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uZ2VuZXJpYy5KYXJGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLk1hcHBpbmdGaWxlUmVmSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLlBlcnNpc3RlbmNlVW5pdEl0ZW1MYWJlbFByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkKLQlpbXBsZW1lbnRzIEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeQotewotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlciBidWlsZEl0ZW1MYWJlbFByb3ZpZGVyKAotCQkJT2JqZWN0IGl0ZW0sIERlbGVnYXRpbmdDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50QW5kTGFiZWxQcm92aWRlcikgewotCQlpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlKSB7Ci0JCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXIoKFBlcnNpc3RlbmNlKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIFBlcnNpc3RlbmNlVW5pdCkgewotCQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZVVuaXRJdGVtTGFiZWxQcm92aWRlcigoUGVyc2lzdGVuY2VVbml0KSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7CQotCQl9Ci0JCWVsc2UgaWYgKGl0ZW0gaW5zdGFuY2VvZiBNYXBwaW5nRmlsZVJlZikgewotCQkJcmV0dXJuIG5ldyBNYXBwaW5nRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyKChNYXBwaW5nRmlsZVJlZikgaXRlbSwgY29udGVudEFuZExhYmVsUHJvdmlkZXIpOwkKLQkJfQotCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQ2xhc3NSZWYpIHsKLQkJCXJldHVybiBuZXcgQ2xhc3NSZWZJdGVtTGFiZWxQcm92aWRlcigoQ2xhc3NSZWYpIGl0ZW0sIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKTsJCi0JCX0KLQkJZWxzZSBpZiAoaXRlbSBpbnN0YW5jZW9mIEphckZpbGVSZWYpIHsKLQkJCXJldHVybiBuZXcgSmFyRmlsZVJlZkl0ZW1MYWJlbFByb3ZpZGVyKChKYXJGaWxlUmVmKSBpdGVtLCBjb250ZW50QW5kTGFiZWxQcm92aWRlcik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1BlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2OTUyNGMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuc3RydWN0dXJlLkpwYVN0cnVjdHVyZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIKLQlpbXBsZW1lbnRzIEpwYVN0cnVjdHVyZVByb3ZpZGVyCi17Ci0JLy8gc2luZ2xldG9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhU3RydWN0dXJlUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgUGVyc2lzdGVuY2VSZXNvdXJjZU1vZGVsU3RydWN0dXJlUHJvdmlkZXIoKTsKLQkKLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnBhU3RydWN0dXJlUHJvdmlkZXIgaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0JCi0JCi0JLyoqCi0JICogRW5mb3JjZSBzaW5nbGV0b24gdXNhZ2UKLQkgKi8KLQlwcml2YXRlIFBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFN0cnVjdHVyZVByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQkKLQlwdWJsaWMgVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBQZXJzaXN0ZW5jZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotCQotCXB1YmxpYyBJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCkgewotCQlyZXR1cm4gbmV3IFBlcnNpc3RlbmNlSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvc3RydWN0dXJlL1Jlc291cmNlTW9kZWxJdGVtQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZGNlZWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC9zdHJ1Y3R1cmUvUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwuamZhY2UuQWJzdHJhY3RUcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmpmYWNlLkRlbGVnYXRpbmdUcmVlQ29udGVudEFuZExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkNvbGxlY3Rpb25WYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZU1vZGVsSXRlbUNvbnRlbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXI8SnBhU3RydWN0dXJlTm9kZT4KLXsKLQlwdWJsaWMgUmVzb3VyY2VNb2RlbEl0ZW1Db250ZW50UHJvdmlkZXIoCi0JCQlKcGFGaWxlIGpwYUZpbGUsIAotCQkJRGVsZWdhdGluZ1RyZWVDb250ZW50QW5kTGFiZWxQcm92aWRlciBjb250ZW50UHJvdmlkZXIpIHsKLQkJc3VwZXIoanBhRmlsZSwgY29udGVudFByb3ZpZGVyKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSnBhRmlsZSBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIChKcGFGaWxlKSBzdXBlci5nZXRNb2RlbCgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29sbGVjdGlvblZhbHVlTW9kZWw8SnBhU3RydWN0dXJlTm9kZT4gYnVpbGRDaGlsZHJlbk1vZGVsKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25Bc3BlY3RBZGFwdGVyPEpwYUZpbGUsIEpwYVN0cnVjdHVyZU5vZGU+KAotCQkJYnVpbGRKcGFGaWxlVmFsdWVNb2RlbCgpLCBKcGFGaWxlLlJPT1RfU1RSVUNUVVJFX05PREVTX0NPTExFQ1RJT04pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEl0ZXJhYmxlPEpwYVN0cnVjdHVyZU5vZGU+IGdldEl0ZXJhYmxlKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhRmlsZT4gYnVpbGRKcGFGaWxlVmFsdWVNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8SnBhRmlsZT4odGhpcy5nZXRNb2RlbCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvdmlld3MvQWJzdHJhY3RKcGFWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNGEyZTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC92aWV3cy9BYnN0cmFjdEpwYVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBWZXJzYW50LiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogVmVyc2FudCBhbmQgT3RoZXJzLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnZpZXdzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5XaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwud2lkZ2V0cy5Gb3JtV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLndpZGdldHMuUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5TZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy53aWRnZXRzLkZvcm1Ub29sa2l0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmZvcm1zLndpZGdldHMuU2Nyb2xsZWRGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5WaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGlzIHRoZSBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSlBBIHZpZXcuIFRoZSBzZWxlY3Rpb24gaXMgY2hhbmdlZAotICogYnkgcmVjZWl2aW5nIGEgPGNvZGU+SUpwYVNlbGVjdGlvbjwvY29kZT4uCi0gKgotICogQHNlZSBKcGFTZWxlY3Rpb24KLSAqCi0gKiBAdmVyc2lvbiAyLjAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnBhVmlldyBleHRlbmRzIFZpZXdQYXJ0Ci17Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgcGFnZSB1c2VkIHdoZW4gbm90aGluZyBjYW4gYmUgc2hvd24uCi0JICovCi0JcHJpdmF0ZSBDb21wb3NpdGUgZGVmYXVsdENvbXBvc2l0ZTsKLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGlzIG5vIHZpZXcgY29udGVudAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRMYWJlbDsKLQotCS8qKgotCSAqIFRoZSBjb250YWluZXIgb2YgdGhlIGN1cnJlbnQgcGFnZS4KLQkgKi8KLQlwcml2YXRlIFBhZ2VCb29rIHBhZ2VCb29rOwotCi0JcHJpdmF0ZSBTY3JvbGxlZEZvcm0gc2Nyb2xsZWRGb3JtOwotCQotCQotCS8qKgotCSAqIFRoZSBmYWN0b3J5IHVzZWQgdG8gY3JlYXRlIHRoZSB2YXJpb3VzIHdpZGdldHMuCi0JICovCi0JcHJpdmF0ZSBXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3Rvcnk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFic3RyYWN0SnBhVmlldzwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZGVmYXVsdExhYmVsCi0JICovCi0JcHVibGljIEFic3RyYWN0SnBhVmlldyhTdHJpbmcgZGVmYXVsdExhYmVsKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZGVmYXVsdExhYmVsID0gZGVmYXVsdExhYmVsOwotCQl0aGlzLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZERlZmF1bHRDb21wb3NpdGUoKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSB3aWRnZXRGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZShwYWdlQm9vayk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEZpbGxMYXlvdXQoU1dULlZFUlRJQ0FMKSk7Ci0JCWdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVMYWJlbChjb21wb3NpdGUsIGRlZmF1bHRMYWJlbCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgY3JlYXRlUGFydENvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLnNjcm9sbGVkRm9ybSA9IGdldEZvcm1XaWRnZXRGYWN0b3J5KCkuY3JlYXRlU2Nyb2xsZWRGb3JtKHBhcmVudCk7Ci0JCUpwdEpwYVVpUGx1Z2luLmluc3RhbmNlKCkuY29udHJvbEFmZmVjdHNKYXZhU291cmNlKHRoaXMuc2Nyb2xsZWRGb3JtKTsKLQkJdGhpcy5zY3JvbGxlZEZvcm0uZ2V0Qm9keSgpLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQl0aGlzLnBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMuc2Nyb2xsZWRGb3JtLmdldEJvZHkoKSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQl0aGlzLnBhZ2VCb29rLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0aGlzLnNjcm9sbGVkRm9ybS5zZXRDb250ZW50KHRoaXMucGFnZUJvb2spOwotCi0JCXRoaXMuZGVmYXVsdENvbXBvc2l0ZSA9IGJ1aWxkRGVmYXVsdENvbXBvc2l0ZSgpOwotCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHRoaXMuZGVmYXVsdENvbXBvc2l0ZSk7Ci0KLQkJc3ViY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQotCQlKcGFTZWxlY3Rpb25NYW5hZ2VyIHNlbGVjdGlvbk1hbmFnZXIgPQotCQkJU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcihnZXRWaWV3U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpKTsKLQotCQlzZWxlY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpOwotCQlzZWxlY3Qoc2VsZWN0aW9uTWFuYWdlci5nZXRDdXJyZW50U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQYWdlQm9vayBnZXRQYWdlQm9vaygpIHsKLQkJcmV0dXJuIHRoaXMucGFnZUJvb2s7Ci0JfQotCi0JcHVibGljIGZpbmFsIFdpZGdldEZhY3RvcnkgZ2V0V2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuIHRoaXMud2lkZ2V0RmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIEpQQSB2aWV3LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMud2lkZ2V0RmFjdG9yeSA9IG5ldyBQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSgKLQkJCW5ldyBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSgpCi0JCSk7Ci0JfQotCi0JcHJpdmF0ZSBGb3JtVG9vbGtpdCBnZXRGb3JtV2lkZ2V0RmFjdG9yeSgpIHsKLQkJcmV0dXJuICgoRm9ybVdpZGdldEZhY3RvcnkpIHdpZGdldEZhY3RvcnkpLmdldFdpZGdldEZhY3RvcnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkLCB1cGRhdGUgdGhlIGN1cnJlbnQgcGFnZSBieSB1c2luZyB0aGUgZ2l2ZW4KLQkgKiBzZWxlY3Rpb24gc3RhdGUuCi0JICoKLQkgKiBAcGFyYW0ganBhU2VsZWN0aW9uIFRoZSBuZXcgc2VsZWN0aW9uIHVzZWQgdG8gdXBkYXRlIHRoaXMgSlBBIHZpZXcKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZWxlY3QoSnBhU2VsZWN0aW9uIGpwYVNlbGVjdGlvbik7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJcGFnZUJvb2suc2V0Rm9jdXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHNob3cgdGhlIGRlZmF1bHQgb25lLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNob3dEZWZhdWx0UGFnZSgpIHsKLQkJc2hvd1BhZ2UoZGVmYXVsdENvbXBvc2l0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0aGUgY3VycmVudCBwYWdlIGFuZCBzaG93IHRoZSBnaXZlbiBvbmUuCi0JICoKLQkgKiBAcGFyYW0gcGFnZSBUaGUgbmV3IHBhZ2UgdG8gc2hvdywgPGNvZGU+bnVsbDwvY29kZT4gY2FuJ3QgYmUgcGFzc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2hvd1BhZ2UoQ29udHJvbCBwYWdlKSB7Ci0JCXBhZ2Uuc2V0UGFyZW50KHRoaXMucGFnZUJvb2spOwotCQl0aGlzLnBhZ2VCb29rLnNob3dQYWdlKHBhZ2UpOwotCQl0aGlzLnNjcm9sbGVkRm9ybS5yZWZsb3codHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3ViY3JlYXRlUGFydENvbnRyb2woQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gbm8gb3AgLSBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZSBpZiB3aXNoZWQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvdmlld3MvSnBhRGV0YWlsc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNkNzU2ZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3ZpZXdzL0pwYURldGFpbHNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOiBPcmFjbGUuIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC52aWV3czsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhRGV0YWlsc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVGhlIEpQQSB2aWV3IHRoYXQgc2hvd3MgdGhlIGRldGFpbHMgb2YgYSBzdHJ1Y3R1cmUgbm9kZQotICoKLSAqIEB2ZXJzaW9uIDIuMgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSnBhRGV0YWlsc1ZpZXcgZXh0ZW5kcyBBYnN0cmFjdEpwYVZpZXcKLXsKLQkvKioKLQkgKiBUaGUgY3VycmVudCA8Y29kZT5KcGFEZXRhaWxzUGFnZTwvY29kZT4gdGhhdCB3YXMgcmV0cmlldmUgYmFzZWQgb24gdGhlCi0JICogY3VycmVudCBzZWxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBKcGFEZXRhaWxzUGFnZTxKcGFTdHJ1Y3R1cmVOb2RlPiBjdXJyZW50UGFnZTsKLQotCS8qKgotCSAqIFRoZSBjdXJyZW50IHNlbGVjdGlvbiB1c2VkIHRvIHNob3cgdGhlIHJpZ2h0IDxjb2RlPklKcGFEZXRhaWxzUGFnZTwvY29kZT4uCi0JICovCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbjsKLQotCS8vVE9ETyB0aGlzIGlzIGNyYXAsIGEgTWFwIG9mIE1hcHMgb2YgTWFwcy4gTmVlZHMgdG8gYmUgZG9uZSBkaWZmZXJlbnRseSwgdGhlIGZhY3RvcnkvcGxhdGZvcm0gc2hvdWxkIGhhbmRsZSBjYWNoaW5nIGluc3RlYWQKLQkvLyBrZXkxIHBsYXRmb3JtIGlkCi0JLy8ga2V5MiBKcGFSZXNvdXJjZVR5cGUKLQkvLyBrZXkzIHN0cnVjdHVyZSBub2RlIHR5cGUKLQkvLyB2YWx1ZSBDb21wb3NpdGUgcGFnZQotCXByaXZhdGUgTWFwPFN0cmluZywgTWFwPEpwdFJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4+IGRldGFpbHNQYWdlczsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SnBhRGV0YWlsc1ZpZXc8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBKcGFEZXRhaWxzVmlldygpIHsKLQkJc3VwZXIoSnB0VWlNZXNzYWdlcy5KcGFEZXRhaWxzVmlld192aWV3Tm90QXZhaWxhYmxlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplKCkgewotCQlzdXBlci5pbml0aWFsaXplKCk7Ci0KLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl0aGlzLmRldGFpbHNQYWdlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPEpwdFJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4+KCk7Ci0JfQotCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybVVpIGdldEpwYVBsYXRmb3JtVWkoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7Ci0JCVN0cmluZyBwbGF0Zm9ybUlkID0gc3RydWN0dXJlTm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlyZXR1cm4gSnBhUGxhdGZvcm1VaVJlZ2lzdHJ5Lmluc3RhbmNlKCkuZ2V0SnBhUGxhdGZvcm1VaShwbGF0Zm9ybUlkKTsKLQl9Ci0KLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMuY3VycmVudFNlbGVjdGlvbjsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gZ2V0RGV0YWlsc1BhZ2UoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7Ci0JCVN0cmluZyBwbGF0Zm9ybUlkID0gc3RydWN0dXJlTm9kZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKS5nZXRJZCgpOwotCQlpZiAodGhpcy5kZXRhaWxzUGFnZXMuY29udGFpbnNLZXkocGxhdGZvcm1JZCkpIHsKLQkJCU1hcDxKcHRSZXNvdXJjZVR5cGUsIE1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4+IHBsYXRmb3JtRGV0YWlsc1BhZ2VzID0gdGhpcy5kZXRhaWxzUGFnZXMuZ2V0KHBsYXRmb3JtSWQpOwotCQkJTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+PiBjb250ZW50VHlwZURldGFpbHNQYWdlcyA9IHBsYXRmb3JtRGV0YWlsc1BhZ2VzLmdldChzdHJ1Y3R1cmVOb2RlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJCWlmIChjb250ZW50VHlwZURldGFpbHNQYWdlcyAhPSBudWxsKSB7Ci0JCQkJSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IHBhZ2UgPSAgY29udGVudFR5cGVEZXRhaWxzUGFnZXMuZ2V0KHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSk7Ci0JCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQlwbGF0Zm9ybURldGFpbHNQYWdlcy5yZW1vdmUoc3RydWN0dXJlTm9kZS5nZXRJZCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBwYWdlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBidWlsZERldGFpbHNQYWdlKHN0cnVjdHVyZU5vZGUpOwotCX0KLQotCXByaXZhdGUgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+IGJ1aWxkRGV0YWlsc1BhZ2UoSnBhU3RydWN0dXJlTm9kZSBzdHJ1Y3R1cmVOb2RlKSB7Ci0JCUpwYVBsYXRmb3JtVWkganBhUGxhdGZvcm1VaSA9IGdldEpwYVBsYXRmb3JtVWkoc3RydWN0dXJlTm9kZSk7Ci0JCQotCQlDb21wb3NpdGUgY29udGFpbmVyID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNvbXBvc2l0ZShnZXRQYWdlQm9vaygpKTsKLQkJY29udGFpbmVyLnNldExheW91dChuZXcgRmlsbExheW91dChTV1QuSE9SSVpPTlRBTCkpOwotCi0JCUpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPiBwYWdlID0ganBhUGxhdGZvcm1VaS5idWlsZEpwYURldGFpbHNQYWdlKGNvbnRhaW5lciwgc3RydWN0dXJlTm9kZSwgZ2V0V2lkZ2V0RmFjdG9yeSgpKTsKLQkJaWYgKHBhZ2UgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHN0cnVjdHVyZU5vZGUuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJTWFwPEpwdFJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4gcGxhdGZvcm1EZXRhaWxzUGFnZXMgPSB0aGlzLmRldGFpbHNQYWdlcy5nZXQocGxhdGZvcm1JZCk7Ci0JCWlmIChwbGF0Zm9ybURldGFpbHNQYWdlcyA9PSBudWxsKSB7Ci0JCQlwbGF0Zm9ybURldGFpbHNQYWdlcyA9IG5ldyBIYXNoTWFwPEpwdFJlc291cmNlVHlwZSwgTWFwPFN0cmluZywgSnBhRGV0YWlsc1BhZ2U8PyBleHRlbmRzIEpwYVN0cnVjdHVyZU5vZGU+Pj4oKTsKLQkJCXRoaXMuZGV0YWlsc1BhZ2VzLnB1dChwbGF0Zm9ybUlkLCBwbGF0Zm9ybURldGFpbHNQYWdlcyk7Ci0JCX0KLQkJSnB0UmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHN0cnVjdHVyZU5vZGUuZ2V0UmVzb3VyY2VUeXBlKCk7Ci0JCU1hcDxTdHJpbmcsIEpwYURldGFpbHNQYWdlPD8gZXh0ZW5kcyBKcGFTdHJ1Y3R1cmVOb2RlPj4gY29udGVudFR5cGVEZXRhaWxzUGFnZXMgPSBwbGF0Zm9ybURldGFpbHNQYWdlcy5nZXQocmVzb3VyY2VUeXBlKTsKLQkJaWYgKGNvbnRlbnRUeXBlRGV0YWlsc1BhZ2VzID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlRGV0YWlsc1BhZ2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+KCk7Ci0JCQlwbGF0Zm9ybURldGFpbHNQYWdlcy5wdXQocmVzb3VyY2VUeXBlLCBjb250ZW50VHlwZURldGFpbHNQYWdlcyk7Ci0JCX0KLQkJY29udGVudFR5cGVEZXRhaWxzUGFnZXMucHV0KHN0cnVjdHVyZU5vZGUuZ2V0SWQoKSwgcGFnZSk7Ci0KLQkJcmV0dXJuIHBhZ2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBqcGFTZWxlY3Rpb24pIHsKLQkJaWYgKGpwYVNlbGVjdGlvbi5lcXVhbHModGhpcy5jdXJyZW50U2VsZWN0aW9uKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0ganBhU2VsZWN0aW9uOwotCQlpZiAoanBhU2VsZWN0aW9uID09IEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTikgewotCQkJaWYgKHRoaXMuY3VycmVudFBhZ2UgIT0gbnVsbCkgewotCQkJCXRoaXMuY3VycmVudFBhZ2Uuc2V0U3ViamVjdChudWxsKTsKLQkJCQl0aGlzLnNldEN1cnJlbnRQYWdlKG51bGwpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCUpwYVN0cnVjdHVyZU5vZGUgbmV3Tm9kZSA9IGpwYVNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKTsKLQkJSnBhRGV0YWlsc1BhZ2U8SnBhU3RydWN0dXJlTm9kZT4gbmV3UGFnZSA9IChKcGFEZXRhaWxzUGFnZTxKcGFTdHJ1Y3R1cmVOb2RlPikgZ2V0RGV0YWlsc1BhZ2UobmV3Tm9kZSk7Ci0JCWlmICh0aGlzLmN1cnJlbnRQYWdlICE9IG51bGwgJiYgdGhpcy5jdXJyZW50UGFnZSAhPSBuZXdQYWdlKXsKLQkJCXRyeSB7Ci0JCQkJdGhpcy5jdXJyZW50UGFnZS5zZXRTdWJqZWN0KG51bGwpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5ld1BhZ2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQluZXdQYWdlLnNldFN1YmplY3QobmV3Tm9kZSk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCW5ld1BhZ2UgPSBudWxsOy8vIFNob3cgZXJyb3IgcGFnZQotCQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJCX0KLQkJfQotCQlzZXRDdXJyZW50UGFnZShuZXdQYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSBjdXJyZW50IHBhZ2UgYW5kIHNob3dzIHRoZSBnaXZlbiBwYWdlLgotCSAqCi0JICogQHBhcmFtIG5ld1BhZ2UgVGhlIG5ldyBwYWdlIHRvIGRpc3BsYXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudFBhZ2UoSnBhRGV0YWlsc1BhZ2U8SnBhU3RydWN0dXJlTm9kZT4gbmV3UGFnZSkgewotCQl0aGlzLmN1cnJlbnRQYWdlID0gbmV3UGFnZTsKLQotCQkvLyBTaG93IG5ldyBwYWdlCi0JCWlmIChuZXdQYWdlID09IG51bGwpIHsKLQkJCXNob3dEZWZhdWx0UGFnZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJc2hvd1BhZ2UobmV3UGFnZS5nZXRDb250cm9sKCkpOwotCQl9Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZm9yIChNYXA8SnB0UmVzb3VyY2VUeXBlLCBNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+PiByZXNvdXJjZVR5cGVNYXAgOiB0aGlzLmRldGFpbHNQYWdlcy52YWx1ZXMoKSkgewotCQkJZm9yIChNYXA8U3RyaW5nLCBKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4+IGRldGFpbHNQYWdlTWFwIDogcmVzb3VyY2VUeXBlTWFwLnZhbHVlcygpKSB7Ci0JCQkJZm9yIChKcGFEZXRhaWxzUGFnZTw/IGV4dGVuZHMgSnBhU3RydWN0dXJlTm9kZT4gZGV0YWlsc1BhZ2UgOiBkZXRhaWxzUGFnZU1hcC52YWx1ZXMoKSkgewotCQkJCQlkZXRhaWxzUGFnZS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXRoaXMuZGV0YWlsc1BhZ2VzLmNsZWFyKCk7Ci0KLQkJdGhpcy5jdXJyZW50U2VsZWN0aW9uID0gSnBhU2VsZWN0aW9uLk5VTExfU0VMRUNUSU9OOwotCQl0aGlzLmN1cnJlbnRQYWdlID0gbnVsbDsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZmYTg0My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5MaXN0ZW5lckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuU2FmZVJ1bm5hYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC5qZmFjZS5EZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuaW50ZXJuYWwudXRpbC5TV1RVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25SZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JUGFnZVNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlOwotCi1wdWJsaWMgY2xhc3MgSnBhU3RydWN0dXJlUGFnZSAKLQlleHRlbmRzIFBhZ2UKLQlpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlcgotewotCXByaXZhdGUgZmluYWwgSnBhU3RydWN0dXJlVmlldyBqcGFTdHJ1Y3R1cmVWaWV3OwotCQotCUpwYUZpbGUganBhRmlsZTsKLQkKLQlwcml2YXRlIGZpbmFsIElGaWxlIGZpbGU7Ci0JCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBKcGFTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlcjsKLQkKLQlwcml2YXRlIENvbXBvc2l0ZSBjb250cm9sOwotCQotCXByaXZhdGUgRGVsZWdhdGluZ0NvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIGNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyOwotCQotCVRyZWVWaWV3ZXIgdmlld2VyOwotCQotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3Q7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHRyZWVTZWxlY3Rpb25MaXN0ZW5lcjsKLQkKLQlwcml2YXRlIGZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgdHJlZVBvc3RTZWxlY3Rpb25MaXN0ZW5lcjsKLQkKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBwcm9qZWN0c0xpc3RlbmVyOwotCQotCXByaXZhdGUgZmluYWwgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGpwYUZpbGVzTGlzdGVuZXI7Ci0JCi0JCi0JcHVibGljIEpwYVN0cnVjdHVyZVBhZ2UoCi0JCQlKcGFTdHJ1Y3R1cmVWaWV3IGpwYVN0cnVjdHVyZVZpZXcsIEpwYUZpbGUganBhRmlsZSwgSnBhU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIpIHsKLQkJCi0JCXRoaXMuanBhU3RydWN0dXJlVmlldyA9IGpwYVN0cnVjdHVyZVZpZXc7Ci0JCXRoaXMuanBhRmlsZSA9IGpwYUZpbGU7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYUZpbGUuZ2V0SnBhUHJvamVjdCgpOwotCQl0aGlzLmZpbGUgPSBqcGFGaWxlLmdldEZpbGUoKTsKLQkJdGhpcy5zdHJ1Y3R1cmVQcm92aWRlciA9IHN0cnVjdHVyZVByb3ZpZGVyOwotCQl0aGlzLnNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCXRoaXMudHJlZVNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFRyZWVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKTsKLQkJdGhpcy50cmVlUG9zdFNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFRyZWVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCk7Ci0JCXRoaXMucHJvamVjdHNMaXN0ZW5lciA9IGJ1aWxkUHJvamVjdHNMaXN0ZW5lcigpOwotCQl0aGlzLmpwYUZpbGVzTGlzdGVuZXIgPSBidWlsZEpwYUZpbGVzTGlzdGVuZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRQcm9qZWN0c0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpewotCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMucHJvamVjdHNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5wcm9qZWN0c0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5wcm9qZWN0c0NsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5wcm9qZWN0c0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXZvaWQgcHJvamVjdHNSZW1vdmVkKENvbGxlY3Rpb25SZW1vdmVFdmVudCBldmVudCkgewotCQlmb3IgKEpwYVByb2plY3QgaXRlbSA6IChJdGVyYWJsZTxKcGFQcm9qZWN0PikgZXZlbnQuZ2V0SXRlbXMoKSkgewotCQkJaWYgKGl0ZW0uZ2V0UHJvamVjdCgpID09IEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5maWxlLmdldFByb2plY3QoKSkgewotCQkJCXNldEpwYVByb2plY3QobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQl2b2lkIHByb2plY3RzQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCWZvciAoSnBhUHJvamVjdCBpdGVtIDogKEl0ZXJhYmxlPEpwYVByb2plY3Q+KSBldmVudC5nZXRJdGVtcygpKSB7Ci0JCQlpZiAoaXRlbS5nZXRQcm9qZWN0KCkgPT0gSnBhU3RydWN0dXJlUGFnZS50aGlzLmZpbGUuZ2V0UHJvamVjdCgpKSB7Ci0JCQkJc2V0SnBhUHJvamVjdChpdGVtKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcHJvamVjdHNDbGVhcmVkKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQlzZXRKcGFQcm9qZWN0KG51bGwpOwotCX0KLQkKLQl2b2lkIHByb2plY3RzQ2hhbmdlZChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCXNldEpwYVByb2plY3QoSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMuZmlsZS5nZXRQcm9qZWN0KCkpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIgYnVpbGRKcGFGaWxlc0xpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigpewotCQkKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuanBhRmlsZXNSZW1vdmVkKGV2ZW50KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKENvbGxlY3Rpb25BZGRFdmVudCBldmVudCkgewotCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlc0FkZGVkKGV2ZW50KTsKLQkJCX0KLQkJCi0JCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2xlYXJlZChDb2xsZWN0aW9uQ2xlYXJFdmVudCBldmVudCkgewotCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlc0NsZWFyZWQoZXZlbnQpOwotCQkJfQotCQkKLQkJCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DaGFuZ2VkKENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlc0NoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQl2b2lkIGpwYUZpbGVzUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChKcGFGaWxlIGl0ZW0gOiAoSXRlcmFibGU8SnBhRmlsZT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCWlmIChpdGVtID09IEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlKSB7Ci0JCQkJc2V0SnBhRmlsZShudWxsKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXZvaWQganBhRmlsZXNBZGRlZChDb2xsZWN0aW9uQWRkRXZlbnQgZXZlbnQpIHsKLQkJZm9yIChKcGFGaWxlIGl0ZW0gOiAoSXRlcmFibGU8SnBhRmlsZT4pIGV2ZW50LmdldEl0ZW1zKCkpIHsKLQkJCWlmIChpdGVtLmdldEZpbGUoKSAhPSBudWxsICYmIGl0ZW0uZ2V0RmlsZSgpLmVxdWFscyhKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuZmlsZSkpIHsKLQkJCQlzZXRKcGFGaWxlKGl0ZW0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBqcGFGaWxlc0NsZWFyZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DbGVhckV2ZW50IGV2ZW50KSB7Ci0JCXNldEpwYUZpbGUobnVsbCk7Ci0JfQotCi0Jdm9pZCBqcGFGaWxlc0NoYW5nZWQoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIENvbGxlY3Rpb25DaGFuZ2VFdmVudCBldmVudCkgewotCQlzZXRKcGFGaWxlKHRoaXMuanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZmlsZSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRKcGFQcm9qZWN0KEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlpZiAodGhpcy5qcGFQcm9qZWN0ID09IGpwYVByb2plY3QpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5qcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuanBhUHJvamVjdC5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgdGhpcy5qcGFGaWxlc0xpc3RlbmVyKTsKLQkJfQotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQlpZiAodGhpcy5qcGFQcm9qZWN0ICE9IG51bGwpIHsKLQkJCXRoaXMuanBhUHJvamVjdC5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgdGhpcy5qcGFGaWxlc0xpc3RlbmVyKTsKLQkJCXNldEpwYUZpbGUodGhpcy5qcGFQcm9qZWN0LmdldEpwYUZpbGUoSnBhU3RydWN0dXJlUGFnZS50aGlzLmZpbGUpKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEpwYUZpbGUobnVsbCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldEpwYUZpbGUoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCWlmICh0aGlzLmpwYUZpbGUgPT0ganBhRmlsZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuanBhRmlsZSA9IGpwYUZpbGU7Ci0JCVNXVFV0aWwuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpewkJCQkJCQotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMudmlld2VyLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMudmlld2VyLnNldElucHV0KEpwYVN0cnVjdHVyZVBhZ2UudGhpcy5qcGFGaWxlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGluaXQoSVBhZ2VTaXRlIHBhZ2VTaXRlKSB7Ci0JCXN1cGVyLmluaXQocGFnZVNpdGUpOwotCQlwYWdlU2l0ZS5zZXRTZWxlY3Rpb25Qcm92aWRlcih0aGlzKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNvbnRyb2wgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb250cm9sLnNldExheW91dChuZXcgRmlsbExheW91dCgpKTsJCQotCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb250cm9sLCBTV1QuTVVMVEkgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl2aWV3ZXIuc2V0QXV0b0V4cGFuZExldmVsKDIpOwotCQlEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyIHByb3ZpZGVyCi0JCQk9IG5ldyBEZWxlZ2F0aW5nVHJlZUNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyKAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLmdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpLAotCQkJCXN0cnVjdHVyZVByb3ZpZGVyLmdldEl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSgpKTsKLQkJdGhpcy5jb250ZW50QW5kTGFiZWxQcm92aWRlciA9IHByb3ZpZGVyOwotCQl2aWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJLy8gVE9ETyBVc2UgcHJvYmxlbSBkZWNvcmF0b3IKLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQl0aGlzLnZpZXdlci5zZXRJbnB1dCh0aGlzLmpwYUZpbGUpOwotCQllbmdhZ2VMaXN0ZW5lcnMoKTsKLQkJaW5pdENvbnRleHRNZW51KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGVuZ2FnZUxpc3RlbmVycygpIHsKLQkJdGhpcy52aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHRoaXMudHJlZVNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy52aWV3ZXIuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLnRyZWVQb3N0U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLmpwYVByb2plY3QuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIHRoaXMuanBhRmlsZXNMaXN0ZW5lcik7Ci0JCUpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdE1hbmFnZXIuSlBBX1BST0pFQ1RTX0NPTExFQ1RJT04sIHRoaXMucHJvamVjdHNMaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWRpc2VuZ2FnZUxpc3RlbmVycygpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZUxpc3RlbmVycygpIHsKLQkJSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0TWFuYWdlci5KUEFfUFJPSkVDVFNfQ09MTEVDVElPTiwgdGhpcy5wcm9qZWN0c0xpc3RlbmVyKTsKLQkJaWYgKHRoaXMuanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmpwYVByb2plY3QucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIHRoaXMuanBhRmlsZXNMaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy52aWV3ZXIucmVtb3ZlUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLnRyZWVQb3N0U2VsZWN0aW9uTGlzdGVuZXIpOwotCQl0aGlzLnZpZXdlci5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIodGhpcy50cmVlU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBpbml0Q29udGV4dE1lbnUoKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBkeW5hbWljIG1lbnUgbWdyLiAgRHluYW1pYyBpcyBjdXJyZW50bHkgcmVxdWlyZWQgdG8KLSAgICAgICAgLy8gc3VwcG9ydCBhY3Rpb24gY29udHJpYnV0aW9ucy4KLSAgICAgICAgTWVudU1hbmFnZXIgbWdyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0gICAgICAgIG1nci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0gICAgICAgIG1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0gICAgICAgICAgICAgICAgSnBhU3RydWN0dXJlUGFnZS50aGlzLmZpbGxDb250ZXh0TWVudShtZW51TWFuYWdlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBNZW51IG1lbnUgPSBtZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0gICAgICAgIHZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLSAgICAgICAgdGhpcy5qcGFTdHJ1Y3R1cmVWaWV3LmdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KG1nciwgdmlld2VyKTsKLSAgICB9CQotCQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250ZXh0IG1lbnUgaXMgYWJvdXQgdG8gb3Blbi4KLSAgICAgKiBEZWxlZ2F0ZXMgdG8gdGhlIGFjdGlvbiBncm91cCB1c2luZyB0aGUgdmlld2VyJ3Mgc2VsZWN0aW9uIGFzIHRoZSBhY3Rpb24gY29udGV4dC4KLSAgICAgKiBAc2luY2UgMi4wCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0gICAgICAgIG1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLSAgICB9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpIHsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQljb250cm9sLnNldEZvY3VzKCk7Ci0JfQotCQotCQotCQotCXZvaWQgc2VsZWN0KEpwYVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2aWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHNlbGVjdGlvbi5nZXRTZWxlY3RlZE5vZGUoKSksIHRydWUpOwotCQl9Ci0JfQotCQotCQotCS8vICoqKioqKioqKioqKioqKiogSVNlbGVjdGlvblByb3ZpZGVyIGltcGwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3QucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIElUcmVlU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChJVHJlZVNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvbigpOwotCX0KLQkKLQlwdWJsaWMgSnBhU2VsZWN0aW9uIGdldEpwYVNlbGVjdGlvbigpIHsKLQkJSVRyZWVTZWxlY3Rpb24gdmlld2VyU2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKCk7Ci0JCQotCQlpZiAodmlld2VyU2VsZWN0aW9uLmlzRW1wdHkoKSB8fCB2aWV3ZXJTZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJcmV0dXJuIEpwYVNlbGVjdGlvbi5OVUxMX1NFTEVDVElPTjsKLQkJfQotCQlyZXR1cm4gbmV3IERlZmF1bHRKcGFTZWxlY3Rpb24oKEpwYVN0cnVjdHVyZU5vZGUpIHZpZXdlclNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCXZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQkvKgotCSAqIHJlbGF5cyB0cmVlIHNlbGVjdGlvbiBldmVudCB0byBsaXN0ZW5lcnMgb2YgdGhpcyBwYWdlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gY3JlYXRlIGFuIGV2ZW50Ci0JCWZpbmFsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCA9IAotCQkJCW5ldyBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQodGhpcywgc2VsZWN0aW9uKTsKLQkJCi0JCS8vIGZpcmUgdGhlIGV2ZW50Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQlmaW5hbCBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGwgPSAoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikgbGlzdGVuZXJzW2ldOwotCQkJU2FmZVJ1bm5lci5ydW4oCi0JCQkJCW5ldyBTYWZlUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJbC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RhdHVzQmFyKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciBzdGF0dXNMaW5lTWFuYWdlciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKCEgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB8fCBzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJaWYgKHNzZWxlY3Rpb24uc2l6ZSgpID4gMSkgewotCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShOTFMuYmluZChKcHRVaU1lc3NhZ2VzLkpwYVN0cnVjdHVyZVZpZXdfbnVtSXRlbXNTZWxlY3RlZCwgc3NlbGVjdGlvbi5zaXplKCkpKTsKLQkJfQotCQllbHNlIHsKLQkJCU9iamVjdCBzZWxPYmogPSBzc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJc3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZSgKLQkJCQl0aGlzLmNvbnRlbnRBbmRMYWJlbFByb3ZpZGVyLmdldEltYWdlKHNlbE9iaiksIAotCQkJCXRoaXMuY29udGVudEFuZExhYmVsUHJvdmlkZXIuZ2V0RGVzY3JpcHRpb24oc2VsT2JqKSk7Ci0JCX0KLQl9Ci0JCi0JCi0JY2xhc3MgVHJlZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotCQlpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIKLQl7Ci0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlKcGFTdHJ1Y3R1cmVQYWdlLnRoaXMuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotCQotCQotCWNsYXNzIFRyZWVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0JCWltcGxlbWVudHMgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcgotCXsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCUpwYVN0cnVjdHVyZVBhZ2UudGhpcy51cGRhdGVTdGF0dXNCYXIoZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVZpZXcuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvdmlld3Mvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZiZGUwNS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3ZpZXdzL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnZpZXdzLnN0cnVjdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uTWFuYWdlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmUuSnBhU3RydWN0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NZXNzYWdlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2tWaWV3OwotCi1wdWJsaWMgY2xhc3MgSnBhU3RydWN0dXJlVmlldwotCWV4dGVuZHMgUGFnZUJvb2tWaWV3Ci17Ci0JcHVibGljIEpwYVN0cnVjdHVyZVZpZXcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIuY3JlYXRlUGFydENvbnRyb2wocGFyZW50KTsKLQkJCi0JCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9Ci0JCQlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5nZXRTZWxlY3Rpb25NYW5hZ2VyKHRoaXMuZ2V0Vmlld1NpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCQotCQlzZWxlY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpOwotCQl0aGlzLnNlbGVjdChzZWxlY3Rpb25NYW5hZ2VyLmdldEN1cnJlbnRTZWxlY3Rpb24oKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHBhcnRCcm91Z2h0VG9Ub3AoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkvLyBkbyBzYW1lIHRoaW5nIGFzIHBhcnRBY3RpdmF0ZWQsIHdoaWNoIHdpbGwgY2hlY2sgdG8gc2VlIGlmIHRoZSAKLQkJLy8gcGFydCBpcyBhbiBlZGl0b3IsIGluIHdoaWNoIGNhc2UsIHdlIHdhbnQgdG8gc2hvdyB0aGUgcmlnaHQgcGFnZQotCQlwYXJ0QWN0aXZhdGVkKHBhcnQpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0ltcG9ydGFudChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCXJldHVybiBwYXJ0IGluc3RhbmNlb2YgSUVkaXRvclBhcnQ7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJV29ya2JlbmNoUGFydCBnZXRCb290c3RyYXBQYXJ0KCkgewotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gdGhpcy5nZXRTaXRlKCkuZ2V0UGFnZSgpOwotICAgICAgICByZXR1cm4gKHBhZ2UgPT0gbnVsbCkgPyBudWxsIDogcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElQYWdlIGNyZWF0ZURlZmF1bHRQYWdlKFBhZ2VCb29rIGJvb2spIHsKLQkJTWVzc2FnZVBhZ2UgcGFnZSA9IG5ldyBNZXNzYWdlUGFnZSgpOwotICAgICAgICB0aGlzLmluaXRQYWdlKHBhZ2UpOwotICAgICAgICBwYWdlLmNyZWF0ZUNvbnRyb2woYm9vayk7Ci0gICAgICAgIHBhZ2Uuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkpwYVN0cnVjdHVyZVZpZXdfc3RydWN0dXJlTm90QXZhaWxhYmxlKTsKLSAgICAgICAgcmV0dXJuIHBhZ2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQYWdlUmVjIGRvQ3JlYXRlUGFnZShJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCS8vIHVzZSB0aGUgcGxhdGZvcm0gYWRhcHRlciBzZXJ2aWNlIHNvIHRoZSBzdHJ1Y3R1cmUgdmlldyBjYW4gYmUKLQkJLy8gYXNzb2NpYXRlZCB3aXRoIGFueSBJRWRpdG9yUGFydCB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIGFkYXB0ZXIKLQkJLy8gZmFjdG9yeSB0aGF0IGNhbiBnaXZlIHVzIHRoZSBKUEEgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVkaXRvciBwYXJ0Ci0JCS8vIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5FZGl0b3JQYXJ0QWRhcHRlckZhY3RvcnkKLQkJSnBhRmlsZSBqcGFGaWxlID0gKEpwYUZpbGUpIHBhcnQuZ2V0QWRhcHRlcihKcGFGaWxlLmNsYXNzKTsKLQkJaWYgKGpwYUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKcGFTdHJ1Y3R1cmVQcm92aWRlciBzdHJ1Y3R1cmVQcm92aWRlciA9IHRoaXMuZ2V0U3RydWN0dXJlUHJvdmlkZXIoanBhRmlsZSk7Ci0JCWlmIChzdHJ1Y3R1cmVQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUpwYVN0cnVjdHVyZVBhZ2UgcGFnZSA9IG5ldyBKcGFTdHJ1Y3R1cmVQYWdlKHRoaXMsIGpwYUZpbGUsIHN0cnVjdHVyZVByb3ZpZGVyKTsKLQkJdGhpcy5pbml0UGFnZShwYWdlKTsKLQkJcGFnZS5jcmVhdGVDb250cm9sKHRoaXMuZ2V0UGFnZUJvb2soKSk7Ci0JCXJldHVybiBuZXcgUGFnZVJlYyhwYXJ0LCBwYWdlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFTdHJ1Y3R1cmVQcm92aWRlciBnZXRTdHJ1Y3R1cmVQcm92aWRlcihKcGFGaWxlIGpwYUZpbGUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGxhdGZvcm1VaShqcGFGaWxlKS5nZXRTdHJ1Y3R1cmVQcm92aWRlcihqcGFGaWxlKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQbGF0Zm9ybVVpIGdldFBsYXRmb3JtVWkoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCXJldHVybiBKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkoanBhRmlsZS5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhUGxhdGZvcm0oKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGRvRGVzdHJveVBhZ2UoSVdvcmtiZW5jaFBhcnQgcGFydCwgUGFnZVJlYyBwYWdlUmVjb3JkKSB7Ci0JCUpwYVN0cnVjdHVyZVBhZ2UgcGFnZSA9IChKcGFTdHJ1Y3R1cmVQYWdlKSBwYWdlUmVjb3JkLnBhZ2U7Ci0gICAgICAgIHBhZ2UuZGlzcG9zZSgpOwotICAgICAgICBwYWdlUmVjb3JkLmRpc3Bvc2UoKTsKLQl9Ci0JCi0JcHVibGljIEpwYVNlbGVjdGlvbiBnZXRKcGFTZWxlY3Rpb24oKSB7Ci0JCWlmICh0aGlzLmdldEN1cnJlbnRQYWdlKCkgIT0gdGhpcy5nZXREZWZhdWx0UGFnZSgpKSB7Ci0JCQlyZXR1cm4gKChKcGFTdHJ1Y3R1cmVQYWdlKSB0aGlzLmdldEN1cnJlbnRQYWdlKCkpLmdldEpwYVNlbGVjdGlvbigpOwotCQl9Ci0JCXJldHVybiBKcGFTZWxlY3Rpb24uTlVMTF9TRUxFQ1RJT047Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdChKcGFTZWxlY3Rpb24gbmV3U2VsZWN0aW9uKSB7Ci0JCS8vIGNvcnJlY3QgcGFnZSBzaG91bGQgYmUgc2hvd24KLQkJaWYgKHRoaXMuZ2V0Q3VycmVudFBhZ2UoKSAhPSB0aGlzLmdldERlZmF1bHRQYWdlKCkpIHsKLQkJCSgoSnBhU3RydWN0dXJlUGFnZSkgdGhpcy5nZXRDdXJyZW50UGFnZSgpKS5zZWxlY3QobmV3U2VsZWN0aW9uKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmFiZTMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL0RhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkxpc3RlbmVyTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwucHJvcGVydGllcy5KcGFQcm9qZWN0UHJvcGVydGllc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotCi0vKioKLSAqIE1vc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGluIERhdGFiYXNlR3JvdXAuLi4uCi0gKiAKLSAqIFdlIG9wZW4gdGhlIHdpemFyZCBwYWdlIHdpdGggdGhlIEpQQSBwcm9qZWN0J3MgY29ubmVjdGlvbiBwcm9maWxlIGFuZAotICogZGVmYXVsdCBzY2hlbWEgc2VsZWN0ZWQgKGlmIHBvc3NpYmxlKSwgYnV0IHRoZW4gdGhlIHNlbGVjdGlvbnMgYXJlIGRyaXZlbgotICogYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIHJlLXNlbGVjdHMgdGhlIEpQQSBwcm9qZWN0J3MgY29ubmVjdGlvbiBwcm9maWxlLAotICogd2Ugd2lsbCBwcmUtc2VsZWN0IHRoZSBwcm9qZWN0J3MgZGVmYXVsdCBzY2hlbWEgaWYgcG9zc2libGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCWZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByaXZhdGUgZmluYWwgTGlzdGVuZXJMaXN0PExpc3RlbmVyPiBsaXN0ZW5lckxpc3QgPSBuZXcgTGlzdGVuZXJMaXN0PExpc3RlbmVyPihMaXN0ZW5lci5jbGFzcyk7Ci0KLQlwcml2YXRlIERhdGFiYXNlR3JvdXAgZGF0YWJhc2VHcm91cDsKLQotCi0JcHVibGljIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIoIkRhdGFiYXNlIFNjaGVtYSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCQl9Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0JCXRoaXMuc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfdGl0bGUpOwotCQl0aGlzLnNldE1lc3NhZ2UoSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfZGVzYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQkJdGhpcy5zZXRDb250cm9sKHRoaXMuYnVpbGRUb3BMZXZlbENvbnRyb2wocGFyZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250cm9sIGJ1aWxkVG9wTGV2ZWxDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXRoaXMuZGF0YWJhc2VHcm91cCA9IG5ldyBEYXRhYmFzZUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLlBST1BFUlRJRVNfSkFWQV9QRVJTSVNURU5DRV9DT05ORUNUSU9OKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCXB1YmxpYyBTY2hlbWEgZ2V0U2VsZWN0ZWRTY2hlbWEoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlR3JvdXAuZ2V0U2VsZWN0ZWRTY2hlbWEoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0aGlzLmRhdGFiYXNlR3JvdXAuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRoaXMubGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0Jdm9pZCBmaXJlU2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHNjaGVtYSAhPSBudWxsKTsKLQkJZm9yIChMaXN0ZW5lciBsaXN0ZW5lciA6IHRoaXMubGlzdGVuZXJMaXN0LmdldExpc3RlbmVycygpKSB7Ci0JCQlsaXN0ZW5lci5zZWxlY3RlZFNjaGVtYUNoYW5nZWQoc2NoZW1hKTsKLQkJfQotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBpbnRlcmZhY2UgKioqKioqKioqKgotCi0JLyoqCi0JICogQWxsb3dzIGNsaWVudHMgdG8gbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUKLQkgKiBhbmQgc2NoZW1hLgotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyIHsKLQkJdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGRhdGFiYXNlIGdyb3VwICoqKioqKioqKioKLQotCS8qKgotCSAqIHNjaGVtYSBjb21iby1ib3gKLQkgKiBhZGQgcHJvamVjdCBjb25uZWN0aW9uIGxpbmsKLQkgKiByZWNvbm5lY3QgbGluawotCSAqLwotCWNsYXNzIERhdGFiYXNlR3JvdXAgewotCi0JCS8vIHRoZXNlIGFyZSBrZXB0IGluIHN5bmNoIHdpdGggdGhlIHNlbGVjdGlvbgotCQlwcml2YXRlIFNjaGVtYSBzZWxlY3RlZFNjaGVtYTsKLQotCQlwcml2YXRlIGZpbmFsIENvbWJvIHNjaGVtYUNvbWJvQm94OwotCi0JCXByaXZhdGUgZmluYWwgTGluayByZWNvbm5lY3RMaW5rOwotCi0JCXByaXZhdGUgTGluayBhZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbms7Ci0JCQotCQlwcml2YXRlIGZpbmFsIENvbm5lY3Rpb25MaXN0ZW5lciBjb25uZWN0aW9uTGlzdGVuZXI7Ci0KLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdGlvbiAqKioqKioqKioqCi0KLQkJRGF0YWJhc2VHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlzdXBlcigpOwotCi0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOyAgLy8gZmFsc2UgPSBkbyBub3QgbWFrZSBjb2x1bW5zIGVxdWFsIHdpZHRoCi0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Vfc2NoZW1hU2V0dGluZ3MpOwotCQkJLy8gVE9ETyBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHRoaXMuZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLlhYWCk7Ci0KLQkJCS8vIHNjaGVtYSBjb21iby1ib3gKLQkJCXRoaXMuYnVpbGRMYWJlbChncm91cCwgMSwgSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Vfc2NoZW1hKTsKLQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29tYm9Cb3goZ3JvdXAsIHRoaXMuYnVpbGRTY2hlbWFDb21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJCi0JCQlTdHJpbmcgbWVzc2FnZSA9ICh0aGlzLnByb2plY3RIYXNBQ29ubmVjdGlvbigpKSA/Ci0JCQkJSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2Vfc2NoZW1hSW5mbyA6Ci0JCQkJSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfY29ubmVjdGlvbkluZm87Ci0JCQkKLQkJCXRoaXMuYnVpbGRMYWJlbChncm91cCwgMiwgbWVzc2FnZSk7Ci0KLQkJCS8vIGFkZCBwcm9qZWN0J3MgY29ubmVjdGlvbiBsaW5rCi0JCQlpZiggISB0aGlzLnByb2plY3RIYXNBQ29ubmVjdGlvbigpKSB7Ci0JCQkJdGhpcy5hZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmsgPSB0aGlzLmJ1aWxkTGluayhncm91cCwgCi0JCQkJCQkJSnB0VWlNZXNzYWdlcy5EYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2VfYWRkQ29ubmVjdGlvblRvUHJvamVjdCwgCi0JCQkJCQkJdGhpcy5idWlsZEFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlua0xpc3RlbmVyKCkpOwotCQkJfQotCi0JCQkvLyByZWNvbm5lY3QgbGluawotCQkJdGhpcy5yZWNvbm5lY3RMaW5rID0gdGhpcy5idWlsZExpbmsoZ3JvdXAsIEpwdFVpTWVzc2FnZXMuRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlX2Nvbm5lY3RMaW5rLCB0aGlzLmJ1aWxkUmVjb25uZWN0TGlua1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldEVuYWJsZWQodHJ1ZSk7Ci0KLQkJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkJaWYgKHRoaXMuc2VsZWN0ZWRTY2hlbWEgIT0gbnVsbCkgewotCQkJCURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmZpcmVTY2hlbWFDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRTY2hlbWEpOwotCQkJfQotCi0JCQl0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lciA9IHRoaXMuYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJCXRoaXMuYWRkSnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCi0JCQl0aGlzLnVwZGF0ZVNjaGVtYUNvbWJvQm94KCk7Ci0JCQl0aGlzLnVwZGF0ZVJlY29ubmVjdExpbmsoKTsKLQkJfQotCi0KLQkJLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQkJU2NoZW1hIGdldFNlbGVjdGVkU2NoZW1hKCkgewotCQkJcmV0dXJuIHRoaXMuc2VsZWN0ZWRTY2hlbWE7Ci0JCX0KLQotCQl2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlpZih0aGlzLnByb2plY3RIYXNBQ29ubmVjdGlvbigpKSB7Ci0JCQkJdGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQotCQkvLyAqKioqKioqKioqIGludGVybmFsIG1ldGhvZHMgKioqKioqKioqKgotCi0JCXZvaWQgYWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXRoaXMuYWRkSnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXIodGhpcy5jb25uZWN0aW9uTGlzdGVuZXIpOwotCQl9Ci0JCQotCQkKLQkJcHJpdmF0ZSB2b2lkIGFkZEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJaWYodGhpcy5wcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSkgewotCQkJCXRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0SGFzQUNvbm5lY3Rpb24oKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSAhPSBudWxsOwotCQl9Ci0JCQotCQkvKioKLQkJICogdGhpcyBjYW4gcmV0dXJuIG51bGw7Ci0JCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkJICovCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkJcmV0dXJuIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiB0aGlzIGNhbiByZXR1cm4gbnVsbDsKLQkJICogY2FsbGVkIGF0IHN0YXJ0LXVwIGFuZCB3aGVuIHRoZSBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUgY2hhbmdlcwotCQkgKi8KLQkJcHJpdmF0ZSBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJCXJldHVybiBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5qcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTY2hlbWFDb250YWluZXIgZ2V0RGVmYXVsdFNjaGVtYUNvbnRhaW5lcigpIHsKLQkJCXJldHVybiBEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UudGhpcy5qcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGNhbGxlZCBhdCBzdGFydC11cCBhbmQgd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkJICovCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVSZWNvbm5lY3RMaW5rKCkgewotCQkJdGhpcy5yZWNvbm5lY3RMaW5rLnNldEVuYWJsZWQodGhpcy5yZWNvbm5lY3RMaW5rQ2FuQmVFbmFibGVkKCkpOwotCQl9Ci0KLQkJdm9pZCB1cGRhdGVBZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmsoKSB7Ci0JCQl0aGlzLmFkZEpwYVByb2plY3RDb25uZWN0aW9uTGluay5zZXRFbmFibGVkKHRoaXMuYWRkSnBhUHJvamVjdENvbm5lY3Rpb25MaW5rQ2FuQmVFbmFibGVkKCkpOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIHJlY29ubmVjdExpbmtDYW5CZUVuYWJsZWQoKSB7Ci0JCQlpZih0aGlzLnByb2plY3RIYXNBQ29ubmVjdGlvbigpKSB7Ci0JCQkJcmV0dXJuIHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkuaXNJbmFjdGl2ZSgpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlua0NhbkJlRW5hYmxlZCgpIHsKLQkJCXJldHVybiAhIHRoaXMucHJvamVjdEhhc0FDb25uZWN0aW9uKCk7Ci0JCX0KLQotCQkvKioKLQkJICogdGhlIHNjaGVtYSBjb21iby1ib3ggaXMgdXBkYXRlZCBhdCBzdGFydC11cCBhbmQKLQkJICogd2hlbiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlIGNoYW5nZXMKLQkJICovCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVTY2hlbWFDb21ib0JveCgpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3gucmVtb3ZlQWxsKCk7Ci0JCQlmb3IgKFN0cmluZyBuYW1lIDogdGhpcy5nZXRTY2hlbWFOYW1lcygpKSB7Ci0JCQkJdGhpcy5zY2hlbWFDb21ib0JveC5hZGQobmFtZSk7Ci0JCQl9Ci0JCQkvLyB0aGUgY3VycmVudCBzY2hlbWEgKnNob3VsZCogYmUgaW4gdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBwcm9maWxlCi0JCQlpZiAodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQkJdGhpcy5zY2hlbWFDb21ib0JveC5zZWxlY3QodGhpcy5zY2hlbWFDb21ib0JveC5pbmRleE9mKHRoaXMuc2VsZWN0ZWRTY2hlbWEuZ2V0TmFtZSgpKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U2NoZW1hTmFtZXMoKSB7Ci0JCQlTY2hlbWFDb250YWluZXIgc2MgPSB0aGlzLmdldERlZmF1bHRTY2hlbWFDb250YWluZXIoKTsKLQkJCS8vIHVzZSBzY2hlbWEgKm5hbWVzKiBzaW5jZSB0aGUgY29tYm8tYm94IGlzIHJlYWQtb25seQotCQkJcmV0dXJuIChzYyAhPSBudWxsKSA/IHNjLmdldFNvcnRlZFNjaGVtYU5hbWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQkJfQotCi0JCS8vICoqKioqKioqKiogbGlzdGVuZXIgY2FsbGJhY2tzICoqKioqKioqKioKLQotCQl2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpIHsKLQkJCVNjaGVtYSBvbGQgPSB0aGlzLnNlbGVjdGVkU2NoZW1hOwotCQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYUNvbnRhaW5lcigpLmdldFNjaGVtYU5hbWVkKHRoaXMuc2NoZW1hQ29tYm9Cb3guZ2V0VGV4dCgpKTsKLQkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgewotCQkJCURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmZpcmVTY2hlbWFDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRTY2hlbWEpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCByZWNvbm5lY3QoKSB7Ci0JCQl0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpLmNvbm5lY3QoKTsKLQkJCS8vIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIHN5bmNocm9uaXplZCB3aGVuIHdlIGdldCB0aGUgcmVzdWx0aW5nIG9wZW4gZXZlbnQKLQkJfQotCi0JCS8qKgotCQkgKiBjYWxsZWQgd2hlbgotCQkgKiAgICAgLSBhIGNvbm5lY3Rpb24gaXMgc2V0IHRvIHRoZSBKcGEgcHJvamVjdAotCQkgKiAgICAgLSB0aGUgY29ubmVjdGlvbiB3YXMgb3BlbmVkCi0JCSAqICAgICAtIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgKG5ldmVyIGhhcHBlbnM/KQotCQkgKiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2NoZW1hIHN0dWZmIGFuZCB0aGUgcmVjb25uZWN0IGxpbmsKLQkJICovCi0JCXZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7Ci0JCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQkJCXRoaXMuc2VsZWN0ZWRTY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJCWlmICh0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgewotCQkJCURhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmZpcmVTY2hlbWFDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRTY2hlbWEpOwotCQkJfQotCQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOwotCQkJdGhpcy51cGRhdGVSZWNvbm5lY3RMaW5rKCk7Ci0JCX0KLQotCi0JCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQotCQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnNlbGVjdGVkU2NoZW1hQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCQlyZXR1cm4gIkRhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZSBzY2hlbWEgY29tYm8tYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXJldHVybiBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMucmVjb25uZWN0KCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIHJlY29ubmVjdCBsaW5rIHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBDb25uZWN0aW9uTGlzdGVuZXIgYnVpbGRDb25uZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIG9wZW5lZChDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQkJCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZSAgLy8gdGhpcyBwcm9iYWJseSB3b24ndCBldmVyIGdldCBjYWxsZWQuLi4KLQkJCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJCQkJdGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJCX0KLQkJCQlwcml2YXRlIHZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7Ci0JCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYygKLQkJCQkJCW5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCURhdGFiYXNlR3JvdXAudGhpcy5jb25uZWN0aW9uQ2hhbmdlZCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJKTsKLQkJCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQkJcmV0dXJuICJEYXRhYmFzZVNjaGVtYVdpemFyZFBhZ2UgY29ubmVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZEFkZEpwYVByb2plY3RDb25uZWN0aW9uTGlua0xpc3RlbmVyKCkgewotCQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnByb21wdFRvQ29uZmlnSnBhUHJvamVjdENvbm5lY3Rpb24oKTsKLQkJCQkJCi0JCQkJCURhdGFiYXNlR3JvdXAudGhpcy5hZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCQkJCURhdGFiYXNlR3JvdXAudGhpcy51cGRhdGVBZGRKcGFQcm9qZWN0Q29ubmVjdGlvbkxpbmsoKTsKLQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJfQotCQkJCUBPdmVycmlkZQotCQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJCXJldHVybiAiRGF0YWJhc2VTY2hlbWFXaXphcmRQYWdlIEFkZFByb2plY3RDb25uZWN0aW9uIGxpbmsgc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQl2b2lkIHByb21wdFRvQ29uZmlnSnBhUHJvamVjdENvbm5lY3Rpb24oKSB7Ci0JCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9Ci0JCQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByb3BlcnR5RGlhbG9nT24oCi0JCQkJCWdldFNoZWxsKCksIERhdGFiYXNlU2NoZW1hV2l6YXJkUGFnZS50aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpLAotCQkJCQlKcGFQcm9qZWN0UHJvcGVydGllc1BhZ2UuUFJPUF9JRCwKLQkJCQkJbnVsbCwKLQkJCQkJbnVsbCk7Ci0JCQlkaWFsb2cub3BlbigpOwotCQl9Ci0KLQkJLy8gKioqKioqKioqKiBVSSBjb21wb25lbnRzICoqKioqKioqKioKLQotCQkvKioKLQkJICogYnVpbGQgYW5kIHJldHVybiBhIGxhYmVsCi0JCSAqLwotCQlwcml2YXRlIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlyZXR1cm4gbGFiZWw7Ci0JCX0KLQotCQkvKioKLQkJICogYnVpbGQgYW5kIHJldHVybiBhIGNvbWJvLWJveAotCQkgKi8KLQkJcHJpdmF0ZSBDb21ibyBidWlsZENvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCWNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJcmV0dXJuIGNvbWJvOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGJ1aWxkIGFuZCByZXR1cm4gYSBsaW5rCi0JCSAqLwotCQlwcml2YXRlIExpbmsgYnVpbGRMaW5rKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTZWxlY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJTGluayBsaW5rID0gbmV3IExpbmsocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlsaW5rLnNldFRleHQodGV4dCk7Ci0JCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXJldHVybiBsaW5rOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEFjdGlvblBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEFjdGlvblBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI1NzY3MC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRBY3Rpb25QYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5saWJwcm92LkxpYnJhcnlJbnN0YWxsRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LnVpLmxpYnByb3YuTGlicmFyeVByb3ZpZGVyRnJhbWV3b3JrVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3RXb3JraW5nQ29weTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ldmVudHMuSUZhY2V0ZWRQcm9qZWN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuZXZlbnRzLklGYWNldGVkUHJvamVjdExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSnBhRmFjZXRBY3Rpb25QYWdlCi0JZXh0ZW5kcyBEYXRhTW9kZWxGYWNldEluc3RhbGxQYWdlCi0JaW1wbGVtZW50cyBKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlwcml2YXRlIElGYWNldGVkUHJvamVjdExpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJvdGVjdGVkIEpwYUZhY2V0QWN0aW9uUGFnZShTdHJpbmcgcGFnZU5hbWUpIHsKLQkJc3VwZXIocGFnZU5hbWUpOwotCQlzZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Rlc2NyaXB0aW9uKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEpwdEpwYVVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRVaUljb25zLkpQQV9XSVpfQkFOTkVSKSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQotCQlhZGRTdWJDb21wb3NpdGVzKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRVcFJ1bnRpbWVMaXN0ZW5lcigpOwotCQkKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0pQQV9GQUNFVCk7Ci0JCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQkKLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCAgYWRkU3ViQ29tcG9zaXRlcyhDb21wb3NpdGUgY29tcG9zaXRlKTsKLQkKLQlwcml2YXRlIHZvaWQgc2V0VXBSdW50aW1lTGlzdGVuZXIoKSB7Ci0JICAgIGZpbmFsIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IHdjID0gdGhpcy5nZXRGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KCk7Ci0JCS8vIG11c3QgZG8gaXQgbWFudWFsbHkgdGhlIGZpcnN0IHRpbWUKLQkJbW9kZWwuc2V0UHJvcGVydHkoUlVOVElNRSwgd2MuZ2V0UHJpbWFyeVJ1bnRpbWUoKSk7Ci0JCXRoaXMubGlzdGVuZXIgPSBuZXcgSUZhY2V0ZWRQcm9qZWN0TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVFdmVudCggZmluYWwgSUZhY2V0ZWRQcm9qZWN0RXZlbnQgZXZlbnQgKSB7Ci0JCQkJbW9kZWwuc2V0UHJvcGVydHkoUlVOVElNRSwgd2MuZ2V0UHJpbWFyeVJ1bnRpbWUoKSk7Ci0JCQl9Ci0JCX07Ci0JCQotCQl3Yy5hZGRMaXN0ZW5lcih0aGlzLmxpc3RlbmVyLCBJRmFjZXRlZFByb2plY3RFdmVudC5UeXBlLlBSSU1BUllfUlVOVElNRV9DSEFOR0VEKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkgZ2V0RmFjZXRlZFByb2plY3RXb3JraW5nQ29weSgpIHsKLQkJcmV0dXJuIChJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUJ1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQsIGludCBzdHlsZSkgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihjb250YWluZXIsIFNXVC5OT05FIHwgc3R5bGUpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCQotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgYm9vbGVhbiBmaWxsSG9yaXpvbnRhbCkgewotCQlDb21ibyBjb21ibyA9IG5ldyBDb21ibyhjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkOwotCQlpZiAoZmlsbEhvcml6b250YWwpIHsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQl9Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsKLQkJCVBMQVRGT1JNLAotCQkJQ09OTkVDVElPTiwKLQkJCVVTRVJfV0FOVFNfVE9fT1ZFUlJJREVfREVGQVVMVF9DQVRBTE9HLAotCQkJVVNFUl9PVkVSUklERV9ERUZBVUxUX0NBVEFMT0csCi0JCQlVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLAotCQkJVVNFUl9PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwKLQkJCURJU0NPVkVSX0FOTk9UQVRFRF9DTEFTU0VTLAotCQkJTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc1BhZ2VDb21wbGV0ZSgpIHsKLQkJaWYgKCEgc3VwZXIuaXNQYWdlQ29tcGxldGUoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJSVN0YXR1cyBzdGF0dXMgPSBtb2RlbC52YWxpZGF0ZSgpOyAKLQkJCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX07Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCSAgICB0aGlzLmdldEZhY2V0ZWRQcm9qZWN0V29ya2luZ0NvcHkoKS5yZW1vdmVMaXN0ZW5lcih0aGlzLmxpc3RlbmVyKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgY2xhc3MgUGxhdGZvcm1Hcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBwbGF0Zm9ybUNvbWJvOwotCQkKLQkJCi0JCXB1YmxpYyBQbGF0Zm9ybUdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9wbGF0Zm9ybUxhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuRElBTE9HX0pQQV9QTEFURk9STSk7Ci0KLQkJCXBsYXRmb3JtQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMSwgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKHBsYXRmb3JtQ29tYm8sIFBMQVRGT1JNLCBudWxsKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgY2xhc3MgQ2xhc3NwYXRoQ29uZmlnR3JvdXAKLQl7Ci0JCXB1YmxpYyBDbGFzc3BhdGhDb25maWdHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQkKLQkJCWZpbmFsIExpYnJhcnlJbnN0YWxsRGVsZWdhdGUgbGlicmFyaWVzSW5zdGFsbERlbGVnYXRlCi0JCQkJPSAoTGlicmFyeUluc3RhbGxEZWxlZ2F0ZSkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoTElCUkFSWV9QUk9WSURFUl9ERUxFR0FURSk7Ci0JCQkKLQkJCWZpbmFsIENvbXBvc2l0ZSBsaWJyYXJpZXNDb21wb3NpdGUgCi0JCQkJPSAoQ29tcG9zaXRlKSBMaWJyYXJ5UHJvdmlkZXJGcmFtZXdvcmtVaS5jcmVhdGVJbnN0YWxsTGlicmFyeVBhbmVsKAotCQkJCQljb21wb3NpdGUsIGxpYnJhcmllc0luc3RhbGxEZWxlZ2F0ZSwgCi0JCQkJCUpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2pwYUltcGxlbWVudGF0aW9uTGFiZWwgKTsKLQkJCWxpYnJhcmllc0NvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAobGlicmFyaWVzQ29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfQ09OVEVOVF9QQUdFX0NMQVNTUEFUSCk7CQkJCi0JCX0KLQl9Ci0JCi0JCi0JcHJvdGVjdGVkIGZpbmFsIGNsYXNzIFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cAotCXsKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gZGlzY292ZXJDbGFzc2VzQnV0dG9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gbGlzdENsYXNzZXNCdXR0b247Ci0JCQotCQkKLQkJcHVibGljIFBlcnNpc3RlbnRDbGFzc01hbmFnZW1lbnRHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfcGVyc2lzdGVudENsYXNzTWFuYWdlbWVudExhYmVsKTsKLQkJCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChncm91cCwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0NPTlRFTlRfUEFHRV9DTEFTU1BBVEgpOwotCQkJCi0JCQlkaXNjb3ZlckNsYXNzZXNCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDEsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Rpc2NvdmVyQ2xhc3Nlc0J1dHRvbiwgU1dULlJBRElPKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8oZGlzY292ZXJDbGFzc2VzQnV0dG9uLCBESVNDT1ZFUl9BTk5PVEFURURfQ0xBU1NFUywgbnVsbCk7Ci0JCQkKLQkJCWxpc3RDbGFzc2VzQnV0dG9uID0gY3JlYXRlQnV0dG9uKGdyb3VwLCAxLCBKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9saXN0Q2xhc3Nlc0J1dHRvbiwgU1dULlJBRElPKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoUmFkaW8obGlzdENsYXNzZXNCdXR0b24sIExJU1RfQU5OT1RBVEVEX0NMQVNTRVMsIG51bGwpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0SW5zdGFsbFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldEluc3RhbGxQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjRiODQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL0pwYUZhY2V0SW5zdGFsbFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkpwdEpwYURiUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudWkuaW50ZXJuYWwuRFRQVWlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBKcGFGYWNldEluc3RhbGxQYWdlCi0JZXh0ZW5kcyBKcGFGYWNldEFjdGlvblBhZ2UKLQlpbXBsZW1lbnRzIEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMKLXsKLQlwdWJsaWMgSnBhRmFjZXRJbnN0YWxsUGFnZSgpIHsKLQkJc3VwZXIoImpwdC5qcGEuZmFjZXQuaW5zdGFsbC5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUX0pQQV9GQUNFVCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFN1YkNvbXBvc2l0ZXMoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQluZXcgUGxhdGZvcm1Hcm91cChjb21wb3NpdGUpOwotCQluZXcgQ2xhc3NwYXRoQ29uZmlnR3JvdXAoY29tcG9zaXRlKTsKLQkJbmV3IENvbm5lY3Rpb25Hcm91cChjb21wb3NpdGUpOwotCQluZXcgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCW5ldyBPcm1YbWxHcm91cChjb21wb3NpdGUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCVN0cmluZ1tdIHZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzID0gc3VwZXIuZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKTsKLQkJcmV0dXJuIEFycmF5VG9vbHMuYWRkQWxsKAotCQkJCXZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzLAotCQkJCVVTRVJfV0FOVFNfVE9fQUREX0RCX0RSSVZFUl9KQVJTX1RPX0NMQVNTUEFUSCwKLQkJCQlEQl9EUklWRVJfTkFNRSk7Ci0JfQotCQotCQotCXByb3RlY3RlZCBmaW5hbCBjbGFzcyBDb25uZWN0aW9uR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQ29tYm8gY29ubmVjdGlvbkNvbWJvOwotCQkKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3Rpb25MaW5rOwotCQkKLQkJcHJpdmF0ZSBMaW5rIGNvbm5lY3RMaW5rOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gYWRkRHJpdmVyTGlicmFyeUJ1dHRvbjsKLQkJCi0JCXByaXZhdGUgZmluYWwgTGFiZWwgZHJpdmVyTGlicmFyeUxhYmVsOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBkcml2ZXJMaWJyYXJ5Q29tYm87Ci0JCQotCQlwcml2YXRlIGZpbmFsIEJ1dHRvbiBvdmVycmlkZURlZmF1bHRDYXRhbG9nQnV0dG9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBkZWZhdWx0Q2F0YWxvZ0xhYmVsOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBDb21ibyBkZWZhdWx0Q2F0YWxvZ0NvbWJvOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBCdXR0b24gb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uOwotCQkKLQkJcHJpdmF0ZSBmaW5hbCBMYWJlbCBkZWZhdWx0U2NoZW1hTGFiZWw7Ci0JCQotCQlwcml2YXRlIGZpbmFsIENvbWJvIGRlZmF1bHRTY2hlbWFDb21ibzsKLQkJCi0JCQotCQlwdWJsaWMgQ29ubmVjdGlvbkdyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jb25uZWN0aW9uTGFiZWwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZ3JvdXAsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfUFJPSkVDVF9DT05URU5UX1BBR0VfREFUQUJBU0UpOwotCQkJCi0JCQljb25uZWN0aW9uQ29tYm8gPSBjcmVhdGVDb21ibyhncm91cCwgMywgdHJ1ZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENvbWJvKGNvbm5lY3Rpb25Db21ibywgQ09OTkVDVElPTiwgbnVsbCk7Ci0JCQljb25uZWN0aW9uQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQl1cGRhdGVDb25uZWN0aW9uU3RhdHVzKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCQotCQkJY29ubmVjdGlvbkxpbmsgPSBuZXcgTGluayhncm91cCwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29ubmVjdGlvbkxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNvbm5lY3Rpb25MaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdGlvbkxpbmspOwotCQkJY29ubmVjdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlvcGVuTmV3Q29ubmVjdGlvbldpemFyZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJKTsKLQkJCQotCQkJY29ubmVjdExpbmsgPSBuZXcgTGluayhncm91cCwgU1dULk5PTkUpOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5FTkQsIEdyaWREYXRhLkNFTlRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJY29ubmVjdExpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCWNvbm5lY3RMaW5rLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfY29ubmVjdExpbmspOwotCQkJY29ubmVjdExpbmsuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQljb25uZWN0TGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcigKLQkJCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCW9wZW5Db25uZWN0aW9uUHJvZmlsZSgpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkKLQkJCWFkZERyaXZlckxpYnJhcnlCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDMsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2FkZERyaXZlckxpYnJhcnlMYWJlbCwgU1dULkNIRUNLKTsKLQkJCWFkZERyaXZlckxpYnJhcnlCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3goYWRkRHJpdmVyTGlicmFyeUJ1dHRvbiwgVVNFUl9XQU5UU19UT19BRERfREJfRFJJVkVSX0pBUlNfVE9fQ0xBU1NQQVRILCBudWxsKTsKLQkJCQotCQkJZHJpdmVyTGlicmFyeUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTEVGVCk7Ci0JCQlkcml2ZXJMaWJyYXJ5TGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kcml2ZXJMaWJyYXJ5TGFiZWwpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWdkLmhvcml6b250YWxTcGFuID0gMTsKLQkJCWRyaXZlckxpYnJhcnlMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJZHJpdmVyTGlicmFyeUNvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibygKLQkJCQlkcml2ZXJMaWJyYXJ5Q29tYm8sIERCX0RSSVZFUl9OQU1FLCAKLQkJCQluZXcgQ29udHJvbFtdIHtkcml2ZXJMaWJyYXJ5TGFiZWx9KTsKLQkJCQotCQkJb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihncm91cCwgMywgSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2Vfb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0xhYmVsLCBTV1QuQ0hFQ0spOwotCQkJb3ZlcnJpZGVEZWZhdWx0Q2F0YWxvZ0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChvdmVycmlkZURlZmF1bHRDYXRhbG9nQnV0dG9uLCBVU0VSX1dBTlRTX1RPX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgbnVsbCk7Ci0JCQkKLQkJCWRlZmF1bHRDYXRhbG9nTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5MRUZUKTsKLQkJCWRlZmF1bHRDYXRhbG9nTGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9kZWZhdWx0Q2F0YWxvZ0xhYmVsKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlkZWZhdWx0Q2F0YWxvZ0xhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCi0JCQlkZWZhdWx0Q2F0YWxvZ0NvbWJvID0gY3JlYXRlQ29tYm8oZ3JvdXAsIDEsIHRydWUpOwotCQkJc3luY2hIZWxwZXIuc3luY2hDb21ibygKLQkJCQlkZWZhdWx0Q2F0YWxvZ0NvbWJvLCBVU0VSX09WRVJSSURFX0RFRkFVTFRfQ0FUQUxPRywgCi0JCQkJbmV3IENvbnRyb2xbXSB7ZGVmYXVsdENhdGFsb2dMYWJlbH0pOwotCQkJCi0JCQlvdmVycmlkZURlZmF1bHRTY2hlbWFCdXR0b24gPSBjcmVhdGVCdXR0b24oZ3JvdXAsIDMsIEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX292ZXJyaWRlRGVmYXVsdFNjaGVtYUxhYmVsLCBTV1QuQ0hFQ0spOwotCQkJb3ZlcnJpZGVEZWZhdWx0U2NoZW1hQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KG92ZXJyaWRlRGVmYXVsdFNjaGVtYUJ1dHRvbiwgVVNFUl9XQU5UU19UT19PVkVSUklERV9ERUZBVUxUX1NDSEVNQSwgbnVsbCk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULkxFRlQpOwotCQkJZGVmYXVsdFNjaGVtYUxhYmVsLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFGYWNldFdpemFyZFBhZ2VfZGVmYXVsdFNjaGVtYUxhYmVsKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlkZWZhdWx0U2NoZW1hTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkKLQkJCWRlZmF1bHRTY2hlbWFDb21ibyA9IGNyZWF0ZUNvbWJvKGdyb3VwLCAxLCB0cnVlKTsKLQkJCXN5bmNoSGVscGVyLnN5bmNoQ29tYm8oCi0JCQkJZGVmYXVsdFNjaGVtYUNvbWJvLCBVU0VSX09WRVJSSURFX0RFRkFVTFRfU0NIRU1BLCAKLQkJCQluZXcgQ29udHJvbFtdIHtkZWZhdWx0U2NoZW1hTGFiZWx9KTsKLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIG9wZW5OZXdDb25uZWN0aW9uV2l6YXJkKCkgewotCQkJU3RyaW5nIGNvbm5lY3Rpb25OYW1lID0gRFRQVWlUb29scy5jcmVhdGVOZXdDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJaWYgKGNvbm5lY3Rpb25OYW1lICE9IG51bGwpIHsKLQkJCQltb2RlbC5zZXRQcm9wZXJ0eShDT05ORUNUSU9OLCBjb25uZWN0aW9uTmFtZSk7Ci0JCQkJdXBkYXRlQ29ubmVjdGlvblN0YXR1cygpOwotCQkJfQotCQl9Ci0JCQotCQlwcml2YXRlIHZvaWQgb3BlbkNvbm5lY3Rpb25Qcm9maWxlKCkgewotCQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSBnZXRDb25uZWN0aW9uUHJvZmlsZSgpOwotCQkJaWYgKGNwICE9IG51bGwpIHsKLQkJCQljcC5jb25uZWN0KCk7Ci0JCQkJbW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KENPTk5FQ1RJT05fQUNUSVZFLCBjcC5pc0FjdGl2ZSgpKTsKLQkJCQl1cGRhdGVDb25uZWN0aW9uU3RhdHVzKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0aW9uU3RhdHVzKCkgewotCQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCQl1cGRhdGVDb25uZWN0TGluayhjcCk7Ci0JCQlhZGREcml2ZXJMaWJyYXJ5QnV0dG9uLnNldEVuYWJsZWQoY3AgIT0gbnVsbCk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgZ2V0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCQkvLyB3ZSBqdXN0IHVzZSB0aGUgY29ubmVjdGlvbiBwcm9maWxlIHRvIGxvZyBpbiwgc28gZ28gdG8gdGhlIHRoZSBkYiBwbHVnLWluCi0JCQlyZXR1cm4gSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShDT05ORUNUSU9OKSk7Ci0JCX0KLQkJCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0TGluayhDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQkJY29ubmVjdExpbmsuc2V0RW5hYmxlZCgoY3AgIT0gbnVsbCkgJiYgY3AuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JCQlpZiAoY3AgIT0gbnVsbCAmJiBjcC5pc0Nvbm5lY3RlZCgpKSB7Ci0JCQkJdXBkYXRlQ29ubmVjdExpbmtUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RlZFRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdXBkYXRlQ29ubmVjdExpbmtUZXh0KEpwdFVpTWVzc2FnZXMuSnBhRmFjZXRXaXphcmRQYWdlX2Nvbm5lY3RMaW5rKTsKLQkJCX0KLQkJfQotCQkKLQkJcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbm5lY3RMaW5rVGV4dChTdHJpbmcgdGV4dCkgewotCQkJY29ubmVjdExpbmsuc2V0VGV4dCh0ZXh0KTsKLQkJCVNXVFV0aWwucmVmbG93KGNvbm5lY3RMaW5rLmdldFBhcmVudCgpKTsKLQkJfQotCX0KLQkKLQkKLQlwcm90ZWN0ZWQgZmluYWwgY2xhc3MgT3JtWG1sR3JvdXAKLQl7Ci0JCXByaXZhdGUgZmluYWwgQnV0dG9uIGNyZWF0ZU9ybVhtbEJ1dHRvbjsKLQotCi0JCXB1YmxpYyBPcm1YbWxHcm91cChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCQlDb21wb3NpdGUgZ3JvdXAgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGdyb3VwLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfQ1JFQVRFX09STSk7Ci0KLQkJCWNyZWF0ZU9ybVhtbEJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQljcmVhdGVPcm1YbWxCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYUZhY2V0V2l6YXJkUGFnZV9jcmVhdGVPcm1YbWxCdXR0b24pOwotCQkJc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChjcmVhdGVPcm1YbWxCdXR0b24sIENSRUFURV9PUk1fWE1MLCBudWxsKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvSnBhRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGM1ZThkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcGFGYWNldFZlcnNpb25DaGFuZ2VQYWdlCi0JZXh0ZW5kcyBKcGFGYWNldEFjdGlvblBhZ2UKLXsKLQlwdWJsaWMgSnBhRmFjZXRWZXJzaW9uQ2hhbmdlUGFnZSgpIHsKLQkJc3VwZXIoImpwdC5qcGEuZmFjZXQudmVyc2lvbi1jaGFuZ2UucGFnZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJLy8gVE9ETwotCQkvL3RoaXMuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBKcGFIZWxwQ29udGV4dElkcy5ORVdfSlBBX1BST0pFQ1RfSlBBX0ZBQ0VUKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3ViQ29tcG9zaXRlcyhDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCW5ldyBQbGF0Zm9ybUdyb3VwKGNvbXBvc2l0ZSk7Ci0JCW5ldyBDbGFzc3BhdGhDb25maWdHcm91cChjb21wb3NpdGUpOwotCQkvL25ldyBDb25uZWN0aW9uR3JvdXAoY29tcG9zaXRlKTsKLQkJLy9uZXcgUGVyc2lzdGVudENsYXNzTWFuYWdlbWVudEdyb3VwKGNvbXBvc2l0ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJLy8gbm90aGluZyBuZXcgaGVyZSAqanVzdCogeWV0Ci0JCXJldHVybiBzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFNYWtlUGVyc2lzdGVudFdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL0pwYU1ha2VQZXJzaXN0ZW50V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWMyNzQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL0pwYU1ha2VQZXJzaXN0ZW50V2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuTG9jYWxSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkIGV4dGVuZHMgV2l6YXJkIHsJCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMUF9DT05URVhUX0lEID0gSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lEICsgIi5HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JZmluYWwgTGlzdDxJVHlwZT4gc2VsZWN0ZWRUeXBlczsKLQotCXByaXZhdGUgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlIG1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZTsJCi0JCi0JcHJvdGVjdGVkIGZpbmFsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXI7Ci0JCi0JcHVibGljIEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkKExpc3Q8SVR5cGU+IHNlbGVjdGVkVHlwZXMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxlY3RlZFR5cGVzID0gc2VsZWN0ZWRUeXBlczsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSBuZXcgTG9jYWxSZXNvdXJjZU1hbmFnZXIoSkZhY2VSZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkpOwotCQl0aGlzLnNldFdpbmRvd1RpdGxlKEpwdFVpTWVzc2FnZXMuSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX3RpdGxlKTsKLQkJdGhpcy5zZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihKcHRKcGFVaVBsdWdpbi5nZXRJbWFnZURlc2NyaXB0b3IoSnB0VWlJY29ucy5FTlRJVFlfV0laX0JBTk5FUikpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc2V0Rm9yY2VQcmV2aW91c0FuZE5leHRCdXR0b25zKHRydWUpOwotCi0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnNlbGVjdGVkVHlwZXMuZ2V0KDApLmdldFJlc291cmNlKCkuZ2V0UHJvamVjdCgpKTsKLQkJdGhpcy5tYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UgPSBuZXcgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlKGpwYVByb2plY3QsIHRoaXMuc2VsZWN0ZWRUeXBlcywgSEVMUF9DT05URVhUX0lEKTsKLQkJdGhpcy5hZGRQYWdlKHRoaXMubWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlKTsKLQkJcmV0dXJuOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXRoaXMubWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnBlcmZvcm1GaW5pc2goKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlpZiAocGVyc2lzdGVuY2VYbWwgIT0gbnVsbCkgewotCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJaWYgKHBlcnNpc3RlbmNlICE9IG51bGwgJiYgcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSA+IDApIHsKLQkJCQlyZXR1cm4gcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NTRmYi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Vmlld2VyQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkVkaXRpbmdTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXJDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsaXR5LnN3dC5TV1RUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkZpbHRlcmluZ0l0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuVHJhbnNmb3JtYXRpb25JdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuQXNwZWN0UHJvcGVydHlWYWx1ZU1vZGVsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VYbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLk1hcHBpbmdVaURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuamZhY2UuWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5KcGFQbGF0Zm9ybVVpUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5FbnRpdHlXaXphcmRNc2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLm9ybS5NYXBwaW5nRmlsZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8vIHNpemluZyBjb25zdGFudHMKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgVEFCTEVfSEVJR0hUID0gMjUwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBUQUJMRV9XSURUSCA9IDMwMDsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBNQUtFX1BFUlNJU1RFTlRfUEFHRV9OQU1FID0gIk1ha2VQZXJzaXN0ZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVGFibGVWaWV3ZXIgY2xhc3NUYWJsZVZpZXdlcjsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBoZWxwQ29udGV4dElkOwotCi0JcHJpdmF0ZSBmaW5hbCBUeXBlW10gc2VsZWN0ZWRUeXBlczsKLQotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgSnB0UmVzb3VyY2VUeXBlIGpwdFJlc291cmNlVHlwZTsKLQkKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGFubm90YXRlSW5KYXZhTW9kZWw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNGaXJzdENoZWNrID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4gbWFwcGluZ0ZpbGVNb2RlbDsKLQkKLQlwcml2YXRlIGZpbmFsIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGxpc3RJblBlcnNpc3RlbmNlWG1sTW9kZWw7Ci0KLQlwcm90ZWN0ZWQgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlKGZpbmFsIEpwYVByb2plY3QganBhUHJvamVjdCwgZmluYWwgTGlzdDxJVHlwZT4gc2VsZWN0ZWRUeXBlcywgZmluYWwgU3RyaW5nIGhlbHBDb250ZXh0SWQpIHsKLQkJc3VwZXIoTUFLRV9QRVJTSVNURU5UX1BBR0VfTkFNRSk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IGpwYVByb2plY3Q7Ci0KLQkJdGhpcy5zZWxlY3RlZFR5cGVzID0gdGhpcy5idWlsZFR5cGVzKHNlbGVjdGVkVHlwZXMpOwotCQl0aGlzLmpwdFJlc291cmNlVHlwZSA9IEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRTsKLQkJdGhpcy5oZWxwQ29udGV4dElkID0gaGVscENvbnRleHRJZDsKLQkJdGhpcy5hbm5vdGF0ZUluSmF2YU1vZGVsID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLlRSVUUpOwotCQl0aGlzLm1hcHBpbmdGaWxlTW9kZWwgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFN0cmluZz4oKTsKLQkJdGhpcy5saXN0SW5QZXJzaXN0ZW5jZVhtbE1vZGVsID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPihCb29sZWFuLnZhbHVlT2YoIXRoaXMuanBhUHJvamVjdC5kaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKCkpKTsKLQkJdGhpcy5zZXRUaXRsZShKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV90aXRsZSk7Ci0JCXRoaXMuc2V0TWVzc2FnZShKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVHlwZVtdIGJ1aWxkVHlwZXMoZmluYWwgTGlzdDxJVHlwZT4gc2VsZWN0ZWRUeXBlcykgewotCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmxpc3QoCi0JCQluZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxJVHlwZSwgVHlwZT4obm9uUGVyc2lzdGVudFR5cGVzKHNlbGVjdGVkVHlwZXMpKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIFR5cGUgdHJhbnNmb3JtKElUeXBlIGpkdFR5cGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBUeXBlKGpkdFR5cGUpOwotCQkJCX0KLQkJCX0pLnRvQXJyYXkobmV3IFR5cGVbXSB7fSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFsbCBJVHlwZXMgdGhhdCBhcmUgbm90IGFscmVhZHkgcGVyc2lzdGVudC4KLQkgKiBBbnkgcm9vdCBzdHJ1Y3R1cmUgbm9kZXMgbWVhbnMgdGhlIHR5cGUgaXMgYWxyZWFkeSBhbm5vdGF0ZWQsIAotCSAqIGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwsIG9yIGxpc3RlZCBpbiBhIG1hcHBpbmcgZmlsZQotCSAqLwotCXByb3RlY3RlZCBJdGVyYWJsZTxJVHlwZT4gbm9uUGVyc2lzdGVudFR5cGVzKGZpbmFsIExpc3Q8SVR5cGU+IHNlbGVjdGVkVHlwZXMpIHsKLQkJcmV0dXJuIG5ldyBGaWx0ZXJpbmdJdGVyYWJsZTxJVHlwZT4oc2VsZWN0ZWRUeXBlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoSVR5cGUgamR0VHlwZSkgewotCQkJCXJldHVybiBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZSgoSUZpbGUpIGpkdFR5cGUuZ2V0UmVzb3VyY2UoKSkuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpID09IDA7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1VaSBnZXRKcGFQbGF0Zm9ybVVpKCkgewotCQlTdHJpbmcgcGxhdGZvcm1JZCA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCkuZ2V0SWQoKTsKLQkJcmV0dXJuIEpwYVBsYXRmb3JtVWlSZWdpc3RyeS5pbnN0YW5jZSgpLmdldEpwYVBsYXRmb3JtVWkocGxhdGZvcm1JZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlpbnQgbkNvbHVtbnM9IDE7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlCdXR0b24gamF2YUFubm90YXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJamF2YUFubm90YXRpb25CdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9hbm5vdGF0ZUluSmF2YVJhZGlvQnV0dG9uKTsKLQkJamF2YUFubm90YXRpb25CdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZS50aGlzLmFubm90YXRlSW5KYXZhTW9kZWwuc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJCQlKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UudGhpcy5qcHRSZXNvdXJjZVR5cGUgPSBKcHRDb21tb25Db3JlUGx1Z2luLkpBVkFfU09VUkNFX1JFU09VUkNFX1RZUEU7Ci0JCQl9Ci0JCQkKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdGhpcy53aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gbWFwcGluZ0ZpbGVCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlJBRElPKTsKLQkJbWFwcGluZ0ZpbGVCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZVJhZGlvQnV0dG9uKTsKLQkJQ29tcG9zaXRlIG1hcHBpbmdGaWxlQ29tcG9zaXRlID0gdGhpcy5jcmVhdGVNYXBwaW5nRmlsZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQltYXBwaW5nRmlsZUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW1hcHBpbmdGaWxlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UudGhpcy5hbm5vdGF0ZUluSmF2YU1vZGVsLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQkJCWlmIChKcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2UudGhpcy5pc0ZpcnN0Q2hlY2spIHsKLQkJCQkJSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnRoaXMubWFwcGluZ0ZpbGVNb2RlbC5zZXRWYWx1ZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCQkJCUpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZS50aGlzLmlzRmlyc3RDaGVjayA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl0aGlzLndpZGdldFNlbGVjdGVkKGUpOwotCQkJfQotCQl9KTsKLQotCi0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcihjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl0aGlzLmNsYXNzVGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFR5cGVDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBUeXBlQ29tcGFyYXRvcigpKTsKLQkJdGhpcy5jcmVhdGVUeXBlVGFibGVDb2x1bW4oKTsKLQkJdGhpcy5jcmVhdGVNYXBwaW5nVGFibGVDb2x1bW4oKTsKLQkJdGhpcy5jbGFzc1RhYmxlVmlld2VyLnNldElucHV0KHRoaXMuc2VsZWN0ZWRUeXBlcyk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBUQUJMRV9IRUlHSFQ7Ci0JCWRhdGEud2lkdGhIaW50ID0gVEFCTEVfV0lEVEg7Ci0JCXRoaXMuY2xhc3NUYWJsZVZpZXdlci5nZXRUYWJsZSgpLnNldExheW91dERhdGEoZGF0YSk7Ci0JCi0JCWZpbmFsIEJ1dHRvbiBwZXJzaXN0ZW5jZVhtbENoZWNrQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXBlcnNpc3RlbmNlWG1sQ2hlY2tCb3guc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9saXN0SW5QZXJzaXN0ZW5jZVhtbENoZWNrQm94KTsKLQkJU1dUVG9vbHMuYmluZCh0aGlzLmxpc3RJblBlcnNpc3RlbmNlWG1sTW9kZWwsIHBlcnNpc3RlbmNlWG1sQ2hlY2tCb3gpOwotCQlTV1RUb29scy5jb250cm9sVmlzaWJsZVN0YXRlKHRoaXMuYW5ub3RhdGVJbkphdmFNb2RlbCwgcGVyc2lzdGVuY2VYbWxDaGVja0JveCk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCQotCQl0aGlzLnZhbGlkYXRlKCk7Ci0JfQotCQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZU1hcHBpbmdGaWxlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbkxlZnQgPSAxMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCUxpbmsgbWFwcGluZ0ZpbGVMaW5rID0gbmV3IExpbmsoY29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCW1hcHBpbmdGaWxlTGluay5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlTGluayk7Ci0JCW1hcHBpbmdGaWxlTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQltYXBwaW5nRmlsZUxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIoCi0JCQluZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCW9wZW5OZXdNYXBwaW5nRmlsZVdpemFyZCgpOwotCQkJCX0KLQkJCX0KLQkJKTsKLQkJCi0JCVRleHQgbWFwcGluZ0ZpbGVUZXh0ID0gdGhpcy5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgMSk7Ci0JCVNXVFRvb2xzLmJpbmQodGhpcy5tYXBwaW5nRmlsZU1vZGVsLCBtYXBwaW5nRmlsZVRleHQpOwotCQl0aGlzLm1hcHBpbmdGaWxlTW9kZWwuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlKcGFYbWxSZXNvdXJjZSBvcm1YbWxSZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCQkJaWYgKG9ybVhtbFJlc291cmNlID09IG51bGwpIHsKLQkJCQkJanB0UmVzb3VyY2VUeXBlID0gSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MXzFfMF9SRVNPVVJDRV9UWVBFOyAvL2p1c3QgZGVmYXVsdCB0byAxLjAgb3JtIHJlc291cmNlIHR5cGUKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWpwdFJlc291cmNlVHlwZSA9IG9ybVhtbFJlc291cmNlLmdldFJlc291cmNlVHlwZSgpOwotCQkJCX0KLQkJCQl2YWxpZGF0ZSgpOwotCQkJfQotCQl9KTsKLQkJCi0JCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlicm93c2VCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZV9tYXBwaW5nRmlsZUJyb3dzZUJ1dHRvbik7Ci0JCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbWFwcGluZ0ZpbGVCcm93c2VCdXR0b25QcmVzc2VkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJLy8gRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQlTV1RUb29scy5jb250cm9sRW5hYmxlZFN0YXRlKG5ldyBMaXN0SW5Pcm1NYXBwaW5nRmlsZU1vZGVsKHRoaXMuYW5ub3RhdGVJbkphdmFNb2RlbCksIG1hcHBpbmdGaWxlTGluaywgbWFwcGluZ0ZpbGVUZXh0LCBicm93c2VCdXR0b24pOwotCQkKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIFRleHQgY3JlYXRlVGV4dChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbikgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChjb250YWluZXIsIFNXVC5CT1JERVIgfCBTV1QuU0lOR0xFKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBzcGFuOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1hcHBpbmdGaWxlQnJvd3NlQnV0dG9uUHJlc3NlZCgpIHsJCQotCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gYnVpbGRNYXBwaW5nRmlsZURpYWxvZ1ZpZXdlckZpbHRlcigpOwotCQlJVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoQ29udGVudFByb3ZpZGVyKCk7Ci0JCUlMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIgPSBuZXcgV29ya2JlbmNoTGFiZWxQcm92aWRlcigpOwotCQlTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZyBkaWFsb2cgPSBuZXcgU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgdGhpcy5qcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbGFiZWxQcm92aWRlciwgY29udGVudFByb3ZpZGVyKTsKLQkJZGlhbG9nLnNldFRpdGxlKEVudGl0eVdpemFyZE1zZy5NQVBQSU5HX1hNTF9USVRMRSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKEVudGl0eVdpemFyZE1zZy5DSE9PU0VfTUFQUElOR19YTUxfTUVTU0FHRSk7Ci0JCWRpYWxvZy5hZGRGaWx0ZXIoZmlsdGVyKTsKLQkJCQotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuanBhUHJvamVjdC5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSkpOwotCQlJRmlsZSBpbml0aWFsU2VsZWN0aW9uID0gKHJlc291cmNlICE9IG51bGwpID8gcmVzb3VyY2UuZ2V0RmlsZSgpIDogbnVsbDsKLQkJZGlhbG9nLnNldElucHV0KHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCi0JCWlmIChpbml0aWFsU2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCWRpYWxvZy5zZXRJbml0aWFsU2VsZWN0aW9uKGluaXRpYWxTZWxlY3Rpb24pOwotCQl9Ci0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJdGhpcy5tYXBwaW5nRmlsZU1vZGVsLnNldFZhbHVlKGRpYWxvZy5nZXRDaG9zZW5OYW1lKCkpOwotCQkJLy9oYXZlIHRvIHZhbGlkYXRlIGluIGNhc2UgdGhlIGZpbGUgbmFtZSBkaWQgbm90IGFjdHVhbGx5IGNoYW5nZSwgYnV0IHRoZSB4bWwgZmlsZSB3YXMgY3JlYXRlZAotCQkJdmFsaWRhdGUoKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY3JlYXRlIGZpbHRlciBmb3IgdGhlIGJyb3dzZS9hZGQgYWx0ZXJuYXRpdmUgbWFwcGluZyBYTUwgCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2Ygdmlld2VyIGZpbHRlciBmb3IgdGhlIFNlbGVjdE1hcHBpbmdYTUxEaWFsb2cKLQkgKi8KLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGJ1aWxkTWFwcGluZ0ZpbGVEaWFsb2dWaWV3ZXJGaWx0ZXIoKSB7Ci0JCXJldHVybiBuZXcgWG1sTWFwcGluZ0ZpbGVWaWV3ZXJGaWx0ZXIodGhpcy5qcGFQcm9qZWN0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3Blbk5ld01hcHBpbmdGaWxlV2l6YXJkKCkgewotCQlJUGF0aCBwYXRoID0gTWFwcGluZ0ZpbGVXaXphcmQuY3JlYXRlTmV3TWFwcGluZ0ZpbGUoCi0JCQkJCW5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpLCAKLQkJCQkJZ2V0TWFwcGluZ0ZpbGVOYW1lKCkpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1hcHBpbmdGaWxlTW9kZWwuc2V0VmFsdWUocGF0aC50b1N0cmluZygpKTsKLQkJCS8vaGF2ZSB0byB2YWxpZGF0ZSBpbiBjYXNlIHRoZSBmaWxlIG5hbWUgZGlkIG5vdCBhY3R1YWxseSBjaGFuZ2UsIGJ1dCB0aGUgeG1sIGZpbGUgd2FzIGNyZWF0ZWQKLQkJCXRoaXMudmFsaWRhdGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVR5cGVUYWJsZUNvbHVtbigpIHsKLQkJVGFibGVWaWV3ZXJDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRoaXMuY2xhc3NUYWJsZVZpZXdlciwgU1dULk5PTkUpOwotCQljb2x1bW4uZ2V0Q29sdW1uKCkuc2V0V2lkdGgoMjAwKTsKLQkJY29sdW1uLmdldENvbHVtbigpLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfdHlwZVRhYmxlQ29sdW1uKTsKLQkJY29sdW1uLnNldExhYmVsUHJvdmlkZXIodGhpcy5idWlsZFR5cGVDb2x1bW5MYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW5MYWJlbFByb3ZpZGVyIGJ1aWxkVHlwZUNvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVHlwZUNvbHVtbkxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNYXBwaW5nVGFibGVDb2x1bW4oKSB7Ci0JCVRhYmxlVmlld2VyQ29sdW1uIGNvbHVtbjsKLQkJY29sdW1uID0gbmV3IFRhYmxlVmlld2VyQ29sdW1uKHRoaXMuY2xhc3NUYWJsZVZpZXdlciwgU1dULk5PTkUpOwotCQljb2x1bW4uZ2V0Q29sdW1uKCkuc2V0V2lkdGgoMjAwKTsKLQkJY29sdW1uLmdldENvbHVtbigpLnNldFRleHQoSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ1RhYmxlQ29sdW1uKTsKLQotCQljb2x1bW4uc2V0RWRpdGluZ1N1cHBvcnQobmV3IEVkaXRpbmdTdXBwb3J0KHRoaXMuY2xhc3NUYWJsZVZpZXdlcikgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGdldE1hcHBpbmdVaURlZmluaXRpb24oKChUeXBlKSBlbGVtZW50KS5tYXBwaW5nS2V5KTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHZhbHVlKSB7Ci0JCQkJKChUeXBlKSBlbGVtZW50KS5zZXRNYXBwaW5nS2V5KCgoTWFwcGluZ1VpRGVmaW5pdGlvbjw/LCA/PikgdmFsdWUpLmdldEtleSgpKTsKLQkJCQlnZXRWaWV3ZXIoKS51cGRhdGUoZWxlbWVudCwgbnVsbCk7Ci0JCQl9Ci0JCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRDZWxsRWRpdG9yKE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJZmluYWwgQ29tYm9Cb3hWaWV3ZXJDZWxsRWRpdG9yIGNvbWJvQ2VsbEVkaXRvciA9Ci0JCQkJCW5ldyBDb21ib0JveFZpZXdlckNlbGxFZGl0b3IoKENvbXBvc2l0ZSkgSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnRoaXMuY2xhc3NUYWJsZVZpZXdlci5nZXRDb250cm9sKCkpOwotCi0JCQkJY29tYm9DZWxsRWRpdG9yLnNldExhYmVsUHJvdmlkZXIoYnVpbGRNYXBwaW5nQ29tYm9DZWxsRWRpdG9yTGFiZWxQcm92aWRlcigpKTsKLQkJCQljb21ib0NlbGxFZGl0b3Iuc2V0Q29udGVudFByb3ZpZGVyKGJ1aWxkTWFwcGluZ0NvbWJvQ2VsbEVkaXRvckNvbnRlbnRQcm92aWRlcigpKTsKLQkJCQljb21ib0NlbGxFZGl0b3Iuc2V0SW5wdXQoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIGNvbWJvQ2VsbEVkaXRvcjsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5FZGl0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY29sdW1uLnNldExhYmVsUHJvdmlkZXIoYnVpbGRNYXBwaW5nQ29sdW1uTGFiZWxQcm92aWRlcigpKTsKLQl9Ci0KLQkvL1RoZSBDb21ib0JveFZpZXdlckNlbGxFZGl0b3IgZG9lcyBub3Qgc3VwcG9ydCB0aGUgaW1hZ2UsIHNvIG5vIHJlYXNvbiB0byBpbXBsZW1lbnQgZ2V0SW1hZ2UoT2JqZWN0KQotCXByb3RlY3RlZCBDb2x1bW5MYWJlbFByb3ZpZGVyIGJ1aWxkTWFwcGluZ0NvbWJvQ2VsbEVkaXRvckxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoTWFwcGluZ1VpRGVmaW5pdGlvbjw/LCA/PikgZWxlbWVudCkuZ2V0TGFiZWwoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgYnVpbGRNYXBwaW5nQ29tYm9DZWxsRWRpdG9yQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyKCkgewotCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gQ29sbGVjdGlvblRvb2xzLmNvbGxlY3Rpb24oKChUeXBlKSBpbnB1dEVsZW1lbnQpLnR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucygpKS50b0FycmF5KCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCS8vZG8gbm90aGluZwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBDb2x1bW5MYWJlbFByb3ZpZGVyIGJ1aWxkTWFwcGluZ0NvbHVtbkxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ29sdW1uTGFiZWxQcm92aWRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGUsID8+IG1hcHBpbmdVaURlZmluaXRpb24gPSBnZXRNYXBwaW5nVWlEZWZpbml0aW9uKCgoVHlwZSkgZWxlbWVudCkubWFwcGluZ0tleSk7Ci0JCQkJcmV0dXJuIG1hcHBpbmdVaURlZmluaXRpb24uZ2V0TGFiZWwoKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4gbWFwcGluZ1VpRGVmaW5pdGlvbiA9IGdldE1hcHBpbmdVaURlZmluaXRpb24oKChUeXBlKSBlbGVtZW50KS5tYXBwaW5nS2V5KTsKLQkJCQlyZXR1cm4gbWFwcGluZ1VpRGVmaW5pdGlvbi5nZXRJbWFnZSgpOwotCQkJfQotCQl9OwotCX0KLQotCXByb3RlY3RlZCBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4gZ2V0TWFwcGluZ1VpRGVmaW5pdGlvbihTdHJpbmcgbWFwcGluZ0tleSkgewotCQlmb3IgKE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCA/PiBwcm92aWRlciA6IHR5cGVNYXBwaW5nVWlEZWZpbml0aW9ucyh0aGlzLmpwdFJlc291cmNlVHlwZSkpIHsKLQkJCWlmIChwcm92aWRlci5nZXRLZXkoKSA9PSBtYXBwaW5nS2V5KSB7Ci0JCQkJcmV0dXJuIHByb3ZpZGVyOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsJCi0JfQotCi0JcHJvdGVjdGVkIEl0ZXJhYmxlPFN0cmluZz4gdHlwZU1hcHBpbmdLZXlzKEl0ZXJhYmxlPD8gZXh0ZW5kcyBNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4+IG1hcHBpbmdVaURlZmluaXRpb25zKSB7Ci0JCXJldHVybiBuZXcgVHJhbnNmb3JtYXRpb25JdGVyYWJsZTxNYXBwaW5nVWlEZWZpbml0aW9uPD8gZXh0ZW5kcyBQZXJzaXN0ZW50VHlwZSwgPz4sIFN0cmluZz4obWFwcGluZ1VpRGVmaW5pdGlvbnMpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIFN0cmluZyB0cmFuc2Zvcm0oTWFwcGluZ1VpRGVmaW5pdGlvbjw/IGV4dGVuZHMgUGVyc2lzdGVudFR5cGUsID8+IG5leHQpIHsKLQkJCQlyZXR1cm4gbmV4dC5nZXRLZXkoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCA/Pj4gdHlwZU1hcHBpbmdVaURlZmluaXRpb25zKEpwdFJlc291cmNlVHlwZSBqcGFSZXNvdXJjZVR5cGUpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRKcGFQbGF0Zm9ybVVpKCkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKGpwYVJlc291cmNlVHlwZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlKCkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJaWYgKHRoaXMuc2VsZWN0ZWRUeXBlcy5sZW5ndGggPT0gMCkgewotCQkJZXJyb3JNZXNzYWdlID0gSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2Vfc2VsZWN0ZWRUeXBlc1BlcnNpc3RlbnRFcnJvcjsKLQkJfQotCQllbHNlIGlmICh0aGlzLmlzQWRkVG9Pcm1NYXBwaW5nRmlsZSgpKSB7Ci0JCQlKcGFYbWxSZXNvdXJjZSBvcm1YbWxSZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCQlpZiAob3JtWG1sUmVzb3VyY2UgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IEpwdFVpTWVzc2FnZXMuSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlX21hcHBpbmdGaWxlRG9lc05vdEV4aXN0RXJyb3I7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZShvcm1YbWxSZXNvdXJjZS5nZXRGaWxlKCkpLmdldFJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSA9PSAwKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gSnB0VWlNZXNzYWdlcy5KcGFNYWtlUGVyc2lzdGVudFdpemFyZFBhZ2VfbWFwcGluZ0ZpbGVOb3RMaXN0ZWRJblBlcnNpc3RlbmNlWG1sRXJyb3I7Ci0JCQl9Ci0JCX0KLQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCXNldFBhZ2VDb21wbGV0ZShlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybUhlbHAoKSB7Ci0JICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKCB0aGlzLmhlbHBDb250ZXh0SWQgKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBtb2RpZmllZFBlcnNpc3RlbmNlWG1sID0gZmFsc2U7Ci0JCWZvciAoVHlwZSB0eXBlIDogdGhpcy5zZWxlY3RlZFR5cGVzKSB7Ci0JCQltb2RpZmllZFBlcnNpc3RlbmNlWG1sIHw9IHR5cGUubWFrZVBlcnNpc3RlbnQoKTsJCQkKLQkJfQotCQlpZiAobW9kaWZpZWRQZXJzaXN0ZW5jZVhtbCkgewotCQkJdHJ5IHsKLQkJCQl0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUsIGZpbGUganVzdCB3b24ndCBnZXQgc2F2ZWQKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSkpOwotCX0KLQotCXByb3RlY3RlZCBFbnRpdHlNYXBwaW5ncyBnZXRFbnRpdHlNYXBwaW5ncygpIHsKLQkJSnBhWG1sUmVzb3VyY2UgeG1sUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwotCQlyZXR1cm4gKEVudGl0eU1hcHBpbmdzKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZSh4bWxSZXNvdXJjZS5nZXRGaWxlKCkpLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0xpc3RJblBlcnNpc3RlbmNlWG1sKCkgewotCQlyZXR1cm4gdGhpcy5saXN0SW5QZXJzaXN0ZW5jZVhtbE1vZGVsLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0ZUluSmF2YU1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5hbm5vdGF0ZUluSmF2YU1vZGVsLmdldFZhbHVlKCkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBZGRUb09ybU1hcHBpbmdGaWxlKCkgewotCQlyZXR1cm4gIWlzQW5ub3RhdGVJbkphdmFNb2RlbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm1hcHBpbmdGaWxlTW9kZWwuZ2V0VmFsdWUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGdldE1hcHBpbmdGaWxlTG9jYXRpb24oKSkuZ2V0TmFtZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgVHlwZSB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBJVHlwZSBqZHRUeXBlOwotCi0JCXByaXZhdGUgU3RyaW5nIG1hcHBpbmdLZXk7Ci0KLQkJcHJvdGVjdGVkIFR5cGUoSVR5cGUgamR0VHlwZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuamR0VHlwZSA9IGpkdFR5cGU7Ci0JCQl0aGlzLm1hcHBpbmdLZXkgPSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHNldE1hcHBpbmdLZXkoU3RyaW5nIG1hcHBpbmdLZXkpIHsKLQkJCXRoaXMubWFwcGluZ0tleSA9IG1hcHBpbmdLZXk7Ci0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIG1ha2VQZXJzaXN0ZW50KCkgewotCQkJaWYgKEpwYU1ha2VQZXJzaXN0ZW50V2l6YXJkUGFnZS50aGlzLmlzQW5ub3RhdGVJbkphdmFNb2RlbCgpKSB7Ci0JCQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHR5cGUgPSBnZXRKYXZhUmVzb3VyY2VUeXBlKCk7Ci0JCQkJdHlwZS5hZGRBbm5vdGF0aW9uKGdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24odGhpcy5tYXBwaW5nS2V5KS5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJCQlpZiAoSnBhTWFrZVBlcnNpc3RlbnRXaXphcmRQYWdlLnRoaXMuaXNMaXN0SW5QZXJzaXN0ZW5jZVhtbCgpKSB7Ci0JCQkJCWlmIChwZXJzaXN0ZW5jZVVuaXQgIT0gbnVsbCkgewotCQkJCQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKHR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSnBhWG1sUmVzb3VyY2Ugb3JtWG1sUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwotCQkJCWZpbmFsIEVudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJCQlvcm1YbWxSZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQllbnRpdHlNYXBwaW5ncy5hZGRQZXJzaXN0ZW50VHlwZShUeXBlLnRoaXMubWFwcGluZ0tleSwgVHlwZS50aGlzLmpkdFR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSXRlcmFibGU8PyBleHRlbmRzIE1hcHBpbmdVaURlZmluaXRpb248PyBleHRlbmRzIFBlcnNpc3RlbnRUeXBlLCA/Pj4gdHlwZU1hcHBpbmdVaURlZmluaXRpb25zKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5pdGVyYWJsZShnZXRKcGFQbGF0Zm9ybVVpKCkudHlwZU1hcHBpbmdVaURlZmluaXRpb25zKGpwdFJlc291cmNlVHlwZSkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gZ2V0SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbihTdHJpbmcga2V5KSB7Ci0JCQlmb3IgKEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gZGVmaW5pdGlvbiA6IGdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpLmdldEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25zKCkpIHsKLQkJCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwoZGVmaW5pdGlvbi5nZXRLZXkoKSwga2V5KSkgewotCQkJCQlyZXR1cm4gZGVmaW5pdGlvbjsKLQkJCQl9Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIHR5cGUgbWFwcGluZyBrZXk6ICIgKyBrZXkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGdldEphdmFSZXNvdXJjZVR5cGUoKSB7Ci0JCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUodGhpcy5qZHRUeXBlLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCi0KLQkJcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCQlQZXJzaXN0ZW5jZSBwID0gdGhpcy5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJaWYgKHAgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gdW5pdHMgPSBwLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpOwotCQkJcmV0dXJuIHVuaXRzLmhhc05leHQoKSA/IHVuaXRzLm5leHQoKSA6IG51bGw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2UgZ2V0UGVyc2lzdGVuY2UoKSB7Ci0JCQlQZXJzaXN0ZW5jZVhtbCBweG1sID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQkJcmV0dXJuIChweG1sID09IG51bGwpID8gbnVsbCA6IHB4bWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVhtbCBnZXRQZXJzaXN0ZW5jZVhtbCgpIHsKLQkJCUpwYVJvb3RDb250ZXh0Tm9kZSByY24gPSBnZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCk7Ci0JCQlyZXR1cm4gKHJjbiA9PSBudWxsKSA/IG51bGwgOiByY24uZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGZpbmFsIGNsYXNzIFR5cGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcgotCXsKLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpewotCQkJcmV0dXJuIChUeXBlW10pIGlucHV0RWxlbWVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXt9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KXt9Ci0JCQotCX0KLQotCXByaXZhdGUgZmluYWwgY2xhc3MgVHlwZUNvbHVtbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBDb2x1bW5MYWJlbFByb3ZpZGVyCi0JewotCQlwcml2YXRlIGZpbmFsIEphdmFFbGVtZW50TGFiZWxQcm92aWRlciBqYXZhRWxlbWVudExhYmVsUHJvdmlkZXIgPSAKLQkJCW5ldyBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIoSmF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLlNIT1dfUE9TVF9RVUFMSUZJRUQKLQkJCQkJCQkJCQl8IEphdmFFbGVtZW50TGFiZWxQcm92aWRlci5TSE9XX1NNQUxMX0lDT05TCi0JCQkJCQkJCQkJfCBKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19PVkVSTEFZX0lDT05TKTsKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuZ2V0VGV4dCgoKFR5cGUpIGVsZW1lbnQpLmpkdFR5cGUpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIHRoaXMuamF2YUVsZW1lbnRMYWJlbFByb3ZpZGVyLmdldEltYWdlKCgoVHlwZSkgZWxlbWVudCkuamR0VHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIGNsYXNzIFR5cGVDb21wYXJhdG9yIGV4dGVuZHMgVmlld2VyQ29tcGFyYXRvciB7Ci0JCXByaXZhdGUgZmluYWwgSmF2YUVsZW1lbnRDb21wYXJhdG9yIGphdmFFbGVtZW50Q29tcGFyYXRvciA9IG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKTsKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBlMSwgT2JqZWN0IGUyKSB7Ci0JCQlyZXR1cm4gdGhpcy5qYXZhRWxlbWVudENvbXBhcmF0b3IuY29tcGFyZSh2aWV3ZXIsICgoVHlwZSkgZTEpLmpkdFR5cGUsICAoKFR5cGUpIGUyKS5qZHRUeXBlKTsKLQkJfQotCX0KLQkKLQlzdGF0aWMgY2xhc3MgTGlzdEluT3JtTWFwcGluZ0ZpbGVNb2RlbAotCQlleHRlbmRzIEFzcGVjdFByb3BlcnR5VmFsdWVNb2RlbEFkYXB0ZXI8Qm9vbGVhbiwgQm9vbGVhbj4KLQl7Ci0JCUxpc3RJbk9ybU1hcHBpbmdGaWxlTW9kZWwoUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGFubm90YXRlSW5KYXZhTW9kZWwpIHsKLQkJCXN1cGVyKGFubm90YXRlSW5KYXZhTW9kZWwpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZighdGhpcy5zdWJqZWN0LmJvb2xlYW5WYWx1ZSgpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBlbmdhZ2VTdWJqZWN0XygpIHsvKm5vdGhpbmcqL30KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGRpc2VuZ2FnZVN1YmplY3RfKCkgey8qbm90aGluZyovfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL05ld0VudGl0eURyb3BEb3duQWN0aW9uLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvTmV3RW50aXR5RHJvcERvd25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM1NDg0Ny4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvTmV3RW50aXR5RHJvcERvd25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDEwIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgT3JhY2xlIC0gY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIE5ld0phdmFFRURyb3BEb3duQWN0aW9uIGFuZCBOZXdUeXBlRHJvcERvd25BY3Rpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5QaXhlbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93UHVsbGRvd25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLkFic3RyYWN0T3BlbldpemFyZEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudXRpbC5Db3JlVXRpbGl0eTsKLQotCi0vKioKLSAqIEEgdHlwZSB3aXphcmQgaXMgYWRkZWQgdG8gdGhlIHR5cGUgZHJvcCBkb3duIGlmIGl0IGhhcyBhIHBhcmFtYXRlciAnamF2YXR5cGUnOgotICogICAgIDx3aXphcmQKLSAqICAgICAgICAgbmFtZT0iTXkgSlBUIFdpemFyZCIKLSAqICAgICAgICAgaWNvbj0iaWNvbnMvd2l6LmdpZiIKLSAqICAgICAgICAgY2F0ZWdvcnk9Im15Y2F0ZWdvcnkiCi0gKiAgICAgICAgIGlkPSJ4eC5NeVdpemFyZCI+Ci0gKiAgICAgICAgIDxjbGFzcyBjbGFzcz0ib3JnLnh4Lk15V2l6YXJkIj4KLSAqICAgICAgICAgICAgIDxwYXJhbWV0ZXIgbmFtZT0ianB0YXJ0aWZhY3QiIHZhbHVlPSJ0cnVlIi8+Ci0gKiAgICAgICAgIDwvY2xhc3M+IAotICogICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gKiAgICAgICAgICAgICBNeSBKUFQgV2l6YXJkCi0gKiAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gKiAgICAgIDwvd2l6YXJkPgotICovCi1wdWJsaWMgY2xhc3MgTmV3RW50aXR5RHJvcERvd25BY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJTWVudUNyZWF0b3IsIElXb3JrYmVuY2hXaW5kb3dQdWxsZG93bkRlbGVnYXRlMiB7Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE9wZW5KcHRXaXphcmRBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdE9wZW5XaXphcmRBY3Rpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPE9iamVjdD4gIHsKLQotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSUNPTiA9ICJpY29uIjsvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOwkvLyROT04tTkxTLTEkCi0JCQotCQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCXByaXZhdGUgaW50IG1lbnVJbmRleDsKLQotCQlwdWJsaWMgT3BlbkpwdFdpemFyZEFjdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5mQ29uZmlndXJhdGlvbkVsZW1lbnQ9IGVsZW1lbnQ7Ci0JCQlzZXRUZXh0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9OQU1FKSk7Ci0JCQkKLQkJCVN0cmluZyBkZXNjcmlwdGlvbj0gZ2V0RGVzY3JpcHRpb25Gcm9tQ29uZmlnKHRoaXMuZkNvbmZpZ3VyYXRpb25FbGVtZW50KTsKLQkJCXNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQkJCXNldFRvb2xUaXBUZXh0KGRlc2NyaXB0aW9uKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihnZXRJY29uRnJvbUNvbmZpZyh0aGlzLmZDb25maWd1cmF0aW9uRWxlbWVudCkpOwotCQkJc2V0TWVudUluZGV4KGdldE1lbnVJbmRleEZyb21Db25maWcodGhpcy5mQ29uZmlndXJhdGlvbkVsZW1lbnQpKTsKLQkJfQotCQkKLQkJcHJpdmF0ZSBTdHJpbmcgZ2V0RGVzY3JpcHRpb25Gcm9tQ29uZmlnKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbihUQUdfREVTQ1JJUFRJT04pOwotCQkJaWYgKGNoaWxkcmVuLmxlbmd0aD49MSkgewotCQkJCXJldHVybiBjaGlsZHJlblswXS5nZXRWYWx1ZSgpOwotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBnZXRJY29uRnJvbUNvbmZpZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnKSB7Ci0JCQlTdHJpbmcgaWNvbk5hbWUgPSBjb25maWcuZ2V0QXR0cmlidXRlKEFUVF9JQ09OKTsKLQkJCWlmIChpY29uTmFtZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihjb25maWcuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCksIGljb25OYW1lKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlwcml2YXRlIGludCBnZXRNZW51SW5kZXhGcm9tQ29uZmlnKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNsYXNzRWxlbWVudHMgPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0NMQVNTKTsKLQkJCWlmIChjbGFzc0VsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQlmb3IgKElDb25maWd1cmF0aW9uRWxlbWVudCBjbGFzc0VsZW1lbnQgOiBjbGFzc0VsZW1lbnRzKSB7Ci0JCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHBhcmFtRWxlbWVudHMgPSBjbGFzc0VsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1BBUkFNRVRFUik7Ci0JCQkJCWZvciAoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHBhcmFtRWxlbWVudCA6IHBhcmFtRWxlbWVudHMpIHsKLQkJCQkJCWlmIChBVFRfTUVOVUlOREVYLmVxdWFscyhwYXJhbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFRBR19OQU1FKSkpIHsKLQkJCQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChwYXJhbUVsZW1lbnQuZ2V0QXR0cmlidXRlKFRBR19WQUxVRSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJU2hlbGwgc2hlbGwgPSBnZXRTaGVsbCgpOwotCQkJdHJ5IHsKLQkJCQlJTmV3V2l6YXJkIHdpemFyZCA9IGNyZWF0ZVdpemFyZCgpOwotCQkJCXdpemFyZC5pbml0KFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCksIGdldFNlbGVjdGlvbigpKTsKLQkJCQkKLQkJCQlXaXphcmREaWFsb2cgZGlhbG9nID0gbmV3IFdpemFyZERpYWxvZyhzaGVsbCwgd2l6YXJkKTsKLQkJCQlQaXhlbENvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgUGl4ZWxDb252ZXJ0ZXIoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJCQlkaWFsb2cuc2V0TWluaW11bVBhZ2VTaXplKGNvbnZlcnRlci5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNzApLCBjb252ZXJ0ZXIuY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygyMCkpOwotCQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCQlpbnQgcmVzID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkKLQkJCQlub3RpZnlSZXN1bHQocmVzID09IFdpbmRvdy5PSyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElOZXdXaXphcmQgY3JlYXRlV2l6YXJkKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIChJTmV3V2l6YXJkKSBDb3JlVXRpbGl0eS5jcmVhdGVFeHRlbnNpb24oZkNvbmZpZ3VyYXRpb25FbGVtZW50LCBBVFRfQ0xBU1MpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNZW51SW5kZXgoKSB7Ci0JCQlyZXR1cm4gdGhpcy5tZW51SW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRNZW51SW5kZXgoaW50IG1lbnVJbmRleCkgewotCQkJdGhpcy5tZW51SW5kZXggPSBtZW51SW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgewotCQkJT3BlbkpwdFdpemFyZEFjdGlvbiBhY3Rpb24gPSAoT3BlbkpwdFdpemFyZEFjdGlvbikgbzsKLQkJCXJldHVybiBnZXRNZW51SW5kZXgoKSAtIGFjdGlvbi5nZXRNZW51SW5kZXgoKTsKLQkJfQotCi0JfQotCQotCQotCQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfV0laQVJEID0gIndpemFyZCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSlBUQVJUSUZBQ1QgPSAianB0YXJ0aWZhY3QiOy8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX1BBUkFNRVRFUiA9ICJwYXJhbWV0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX05BTUUgPSAibmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfVkFMVUUgPSAidmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfTUVOVUlOREVYID0gIm1lbnVJbmRleCI7Ly8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTF9ORVcgPSAibmV3V2l6YXJkcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgTWVudSBmTWVudTsKLQkKLQlwcml2YXRlIFNoZWxsIGZXaXphcmRTaGVsbDsKLQkKLQlwdWJsaWMgTmV3RW50aXR5RHJvcERvd25BY3Rpb24oKSB7Ci0JCXRoaXMuZk1lbnU9IG51bGw7Ci0JCXNldE1lbnVDcmVhdG9yKHRoaXMpOwotCQkvL1BsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUphdmFIZWxwQ29udGV4dElkcy5PUEVOX0NMQVNTX1dJWkFSRF9BQ1RJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmICh0aGlzLmZNZW51ICE9IG51bGwpIHsKLQkJCXRoaXMuZk1lbnUuZGlzcG9zZSgpOwotCQkJdGhpcy5mTWVudT0gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBNZW51IGdldE1lbnUoTWVudSBwYXJlbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE1lbnUgZ2V0TWVudShDb250cm9sIHBhcmVudCkgewotCQlpZiAodGhpcy5mTWVudSA9PSBudWxsKSB7Ci0JCQl0aGlzLmZNZW51ID0gbmV3IE1lbnUocGFyZW50KTsKLQkJCU9wZW5KcHRXaXphcmRBY3Rpb25bXSBhY3Rpb25zID0gZ2V0QWN0aW9uRnJvbURlc2NyaXB0b3JzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlPcGVuSnB0V2l6YXJkQWN0aW9uIGN1cnIgPSBhY3Rpb25zW2ldOwotCQkJCWN1cnIuc2V0U2hlbGwodGhpcy5mV2l6YXJkU2hlbGwpOwotCQkJCUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0gaXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGN1cnIpOwotCQkJCWl0ZW0uZmlsbCh0aGlzLmZNZW51LCAtMSk7CQkJCQotCQkJfQkJCQotCQkKLQkJfQotCQlyZXR1cm4gdGhpcy5mTWVudTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlnZXREZWZhdWx0QWN0aW9uKCkucnVuKCk7Ci0JfQotCQotCXB1YmxpYyBBY3Rpb24gZ2V0RGVmYXVsdEFjdGlvbigpIHsKLQkJQWN0aW9uW10gYWN0aW9ucyA9IGdldEFjdGlvbkZyb21EZXNjcmlwdG9ycygpOwotCQlpZiAoYWN0aW9ucy5sZW5ndGggPiAwKQotCQkJcmV0dXJuIGFjdGlvbnNbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIE9wZW5KcHRXaXphcmRBY3Rpb25bXSBnZXRBY3Rpb25Gcm9tRGVzY3JpcHRvcnMoKSB7Ci0JCUFycmF5TGlzdDxPcGVuSnB0V2l6YXJkQWN0aW9uPiBjb250YWluZXJzPSBuZXcgQXJyYXlMaXN0PE9wZW5KcHRXaXphcmRBY3Rpb24+KCk7Ci0JCQotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFBsYXRmb3JtVUkuUExVR0lOX0lELCBQTF9ORVcpOwotCQlpZiAoZXh0ZW5zaW9uUG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb25Qb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudD0gZWxlbWVudHNbaV07Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfV0laQVJEKSAmJiBpc0pwdEFydGlmYWN0V2l6YXJkKGVsZW1lbnQpKSB7Ci0JCQkJCWNvbnRhaW5lcnMuYWRkKG5ldyBPcGVuSnB0V2l6YXJkQWN0aW9uKGVsZW1lbnQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJT3BlbkpwdFdpemFyZEFjdGlvbltdIGFjdGlvbnMgPSBjb250YWluZXJzLnRvQXJyYXkobmV3IE9wZW5KcHRXaXphcmRBY3Rpb25bY29udGFpbmVycy5zaXplKCldKTsKLQkJQXJyYXlzLnNvcnQoYWN0aW9ucyk7Ci0JCXJldHVybiBhY3Rpb25zOwotCX0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0pwdEFydGlmYWN0V2l6YXJkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNsYXNzRWxlbWVudHM9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX0NMQVNTKTsKLQkJaWYgKGNsYXNzRWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaT0gMDsgaSA8IGNsYXNzRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwYXJhbUVsZW1lbnRzPSBjbGFzc0VsZW1lbnRzW2ldLmdldENoaWxkcmVuKFRBR19QQVJBTUVURVIpOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcGFyYW1FbGVtZW50cy5sZW5ndGg7IGsrKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY3Vycj0gcGFyYW1FbGVtZW50c1trXTsKLQkJCQkJaWYgKEFUVF9KUFRBUlRJRkFDVC5lcXVhbHMoY3Vyci5nZXRBdHRyaWJ1dGUoVEFHX05BTUUpKSkgewotCQkJCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihjdXJyLmdldEF0dHJpYnV0ZShUQUdfVkFMVUUpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCWZXaXphcmRTaGVsbD0gd2luZG93LmdldFNoZWxsKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlydW4oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9TZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL1NlbGVjdEpwYU9ybU1hcHBpbmdGaWxlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YWYyODkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL1NlbGVjdEpwYU9ybU1hcHBpbmdGaWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5vcm0uTWFwcGluZ0ZpbGVXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2cgZXh0ZW5kcyBFbGVtZW50VHJlZVNlbGVjdGlvbkRpYWxvZwotewotCXByaXZhdGUgZmluYWwgSVByb2plY3QgcHJvamVjdDsKLQkKLQlwcml2YXRlIExhYmVsIG1lc3NhZ2VMYWJlbDsKLQlwcml2YXRlIFRyZWUgdHJlZVdpZGdldDsKLQotCXB1YmxpYyBTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZyhTaGVsbCBwYXJlbnQsIElQcm9qZWN0IHByb2plY3QsIElMYWJlbFByb3ZpZGVyIGxhYmVsUHJvdmlkZXIsIElUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlcikgewotCQlzdXBlcihwYXJlbnQsIGxhYmVsUHJvdmlkZXIsIGNvbnRlbnRQcm92aWRlcik7Ci0JCXNldEFsbG93TXVsdGlwbGUoZmFsc2UpOwotCQl0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlCdXR0b24gbmV3QnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJbmV3QnV0dG9uLnNldFRleHQoSnB0VWlNZXNzYWdlcy5TZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZ19uZXdCdXR0b24pOwotCQlHcmlkRGF0YSBicm93c2VCdXR0b25EYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EKTsKLQkJbmV3QnV0dG9uLnNldExheW91dERhdGEoYnJvd3NlQnV0dG9uRGF0YSk7CQkKLQkJbmV3QnV0dG9uLnNldFRvb2xUaXBUZXh0KEpwdFVpTWVzc2FnZXMuU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2dfdG9vbFRpcCk7Ci0JCW5ld0J1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJb3Blbk5ld01hcHBpbmdGaWxlV2l6YXJkKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVNZXNzYWdlQXJlYShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXRoaXMubWVzc2FnZUxhYmVsID0gc3VwZXIuY3JlYXRlTWVzc2FnZUFyZWEoY29tcG9zaXRlKTsKLQkJcmV0dXJuIHRoaXMubWVzc2FnZUxhYmVsOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUcmVlVmlld2VyIGNyZWF0ZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUcmVlVmlld2VyIHRyZWVWaWV3ZXIgPSBzdXBlci5jcmVhdGVUcmVlVmlld2VyKHBhcmVudCk7Ci0gICAgICAgIHRoaXMudHJlZVdpZGdldCA9IHRyZWVWaWV3ZXIuZ2V0VHJlZSgpOwotICAgICAgICByZXR1cm4gdHJlZVZpZXdlcjsKLQl9Ci0gICAKLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4gdGhlIHJ1bnRpbWUgcGF0aCBvZiB0aGUgY2hvc2VuIGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENob3Nlbk5hbWUoKSB7Ci0JCUlQYXRoIHJlc291cmNlUGF0aCA9IG51bGw7Ci0JCU9iamVjdCBlbGVtZW50ID0gZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCXJlc291cmNlUGF0aCA9ICgoSUNvbnRhaW5lcikgZWxlbWVudCkuZ2V0RnVsbFBhdGgoKTsKLQkJfSBlbHNlIHsKLQkJCXJlc291cmNlUGF0aCA9ICgoSUZpbGUpIGVsZW1lbnQpLmdldEZ1bGxQYXRoKCk7Ci0JCX0KLQkJU3RyaW5nIHJ1bnRpbWVQYXRoID0gSnB0Q29tbW9uQ29yZVBsdWdpbi5nZXRSZXNvdXJjZUxvY2F0b3IodGhpcy5wcm9qZWN0KS5nZXRSdW50aW1lUGF0aCh0aGlzLnByb2plY3QsIHJlc291cmNlUGF0aCkudG9PU1N0cmluZygpOwotCQlyZXR1cm4gcnVudGltZVBhdGgucmVwbGFjZShGaWxlLnNlcGFyYXRvckNoYXIsICcvJyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0gICAgLyoKLSAgICAgKiBAc2VlIEVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nI3VwZGF0ZU9LU3RhdHVzKENvbXBvc2l0ZSkKLSAgICAgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPS1N0YXR1cygpIHsKLQkJc3VwZXIudXBkYXRlT0tTdGF0dXMoKTsKLQkJVHJlZVNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoVHJlZVNlbGVjdGlvbilnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCUlSZXNvdXJjZSBzZWxlY3RlZFJlc291cmNlID0gKElSZXNvdXJjZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRSZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQl1cGRhdGVTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsICIiKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsICIiKSk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG9wZW5OZXdNYXBwaW5nRmlsZVdpemFyZCgpIHsKLQkJSVBhdGggcGF0aCA9IE1hcHBpbmdGaWxlV2l6YXJkLmNyZWF0ZU5ld01hcHBpbmdGaWxlKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKHRoaXMucHJvamVjdCksIG51bGwpOwotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkvL3RoZXNlIGFyZSBkaXNhYmxlZCBpZiB0aGUgdHJlZSBpcyBlbXB0eSB3aGVuIHRoZSBkaWFsb2cgaXMgY3JlYXRlZC4KLQkJCXRoaXMubWVzc2FnZUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0aGlzLnRyZWVXaWRnZXQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCUlGaWxlIGZpbGUgPSBKcHRDb21tb25Db3JlUGx1Z2luLmdldFBsYXRmb3JtRmlsZSh0aGlzLnByb2plY3QsIHBhdGgpOwotCQkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWxlKSwgdHJ1ZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9Bbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9Bbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGM4MTljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvQW5ub3RhdGVkRW50aXR5VGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIEFubm90YXRlZEVudGl0eVRlbXBsYXRlCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIG5sOwotICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBBbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZSBjcmVhdGUoU3RyaW5nIGxpbmVTZXBhcmF0b3IpCi0gIHsKLSAgICBubCA9IGxpbmVTZXBhcmF0b3I7Ci0gICAgQW5ub3RhdGVkRW50aXR5VGVtcGxhdGUgcmVzdWx0ID0gbmV3IEFubm90YXRlZEVudGl0eVRlbXBsYXRlKCk7Ci0gICAgbmwgPSBudWxsOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgZmluYWwgU3RyaW5nIE5MID0gbmwgPT0gbnVsbCA/IChTeXN0ZW0uZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKSA6IG5sOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMSA9ICJwYWNrYWdlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMyA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNCA9IE5MICsgImltcG9ydCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNSA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzYgPSBOTCArIE5MICsgIi8qKiIgKyBOTCArICIgKiBFbnRpdHkgaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIEVudGl0eTogIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzcgPSBOTCArICIgKiIgKyBOTCArICIgKi8iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9IE5MOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOSA9ICIobmFtZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICJcIikiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSBOTCArICJAVGFibGUobmFtZT1cIiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMiA9ICJcIikiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTMgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gTkwgKyAiQElkQ2xhc3MoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gIi5jbGFzcykiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTYgPSBOTCArICJwdWJsaWMgY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gIiBleHRlbmRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICIgaW1wbGVtZW50cyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTkgPSAiLCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjAgPSAiIHsiICsgTkwgKyAiIiArIE5MICsgIlx0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIxID0gIiAgICIgKyBOTCArICJcdEBJZCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9IE5MICsgIlx0cHJpdmF0ZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjMgPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI1ID0gTkwgKyAiXHRwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNiA9ICIoKSB7IiArIE5MICsgIlx0XHRzdXBlcigpOyIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiICAgIiArIE5MICsgIlx0QElkICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOCA9ICIgICAiICsgTkwgKyAiXHRwdWJsaWMgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI5ID0gIiBnZXQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzAgPSAiKCkgeyIgKyBOTCArICJcdFx0cmV0dXJuIHRoaXMuIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMxID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIiIgKyBOTCArICJcdHB1YmxpYyB2b2lkIHNldCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMiA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMzID0gIiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzQgPSAiKSB7IiArIE5MICsgIlx0XHR0aGlzLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNSA9ICIgPSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzYgPSAiOyIgKyBOTCArICJcdH0iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSBOTCArICIgICAiICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9IE5MOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQotICB7Ci0gICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCi1pZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMik7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChhbkltcG9ydCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUpOwotICAgICB9IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEVudGl0eU5hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEFydGlmYWN0VHlwZSgpKTsKLSAgICBTdHJpbmcgRU5USVRZX05BTUUgPSBtb2RlbC5nZXRFbnRpdHlOYW1lKCk7Ci1pZiAobW9kZWwuaXNFbnRpdHlOYW1lU2V0KCkpIHsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChFTlRJVFlfTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEwKTsKLSAgICB9Ci0gICAgaWYgKG1vZGVsLmlzVGFibGVOYW1lU2V0KCkpIHsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTEpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0VGFibGVOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMik7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotICAgIGlmIChtb2RlbC5pc0NvbXBvc2l0ZVBLKCkpIHsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE1KTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldENsYXNzTmFtZSgpKTsKLSAgICBTdHJpbmcgc3VwZXJDbGFzcyA9IG1vZGVsLmdldFN1cGVyY2xhc3NOYW1lKCk7Ci0JaWYgKCEgIiIuZXF1YWxzKHN1cGVyQ2xhc3MpKSB7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKHN1cGVyQ2xhc3MpOwotICAgIH0KLSAgICAKLQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCi0JaWYgKGludGVyZmFjZXMuc2l6ZSgpPjApIHsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTgpOwotICAgICB9Ci0JZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLSAJCVN0cmluZyBJTlRFUkZBQ0UgPSAoU3RyaW5nKSBpbnRlcmZhY2VzLmdldChpKTsKLQkJaWYgKGk+MCkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTkpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKElOVEVSRkFDRSk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgIExpc3Q8RW50aXR5Um93PiBmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKLQlMaXN0PFN0cmluZz4gcGtGaWVsZHMgPSBtb2RlbC5nZXRQS0ZpZWxkcygpOyAKLSAJZm9yIChFbnRpdHlSb3cgZW50aXR5IDogZmllbGRzKSB7Ci0JCVN0cmluZyBOQU1FID0gZW50aXR5LmdldE5hbWUoKTsKLQkJaWYgKHBrRmllbGRzLmNvbnRhaW5zKE5BTUUpICYmIG1vZGVsLmlzRmllbGRBY2Nlc3MoKSkgewotICAgIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0VHlwZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjMpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoZW50aXR5LmdldE5hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI0KTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldENsYXNzTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjYpOwotICAgIAotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKLQlpZiAocGtGaWVsZHMuY29udGFpbnMoTkFNRSkgJiYgIW1vZGVsLmlzRmllbGRBY2Nlc3MoKSkgewotICAgIAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzApOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMxKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRZUEUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzQpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNik7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM4KTsKLSAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Q2xhc3NXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eUNsYXNzV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmI2MjRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5Q2xhc3NXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUcmVlQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5qZmFjZS5YbWxNYXBwaW5nRmlsZVZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuU2VsZWN0SnBhT3JtTWFwcGluZ0ZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLnBsdWdpbi5KMkVFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC53aXphcmQuTmV3SmF2YUNsYXNzV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JU2VsZWN0aW9uU3RhdHVzVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuV29ya2JlbmNoQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5Q2xhc3NXaXphcmRQYWdlCi0JCWV4dGVuZHMgTmV3SmF2YUNsYXNzV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1RBQkxFID0gIlNJTkdMRV9UQUJMRSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9QRVJfQ0xBU1MgPSAiVEFCTEVfUEVSX0NMQVNTIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5FRCA9ICJKT0lORUQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBJTkhFUklUQU5DRV9TVFJBVEVHSUVTID0gCi0JCQluZXcgU3RyaW5nW10ge0VNUFRZLCBTSU5HTEVfVEFCTEUsIFRBQkxFX1BFUl9DTEFTUywgSk9JTkVEIH07Ci0JcHJpdmF0ZSBDb21ibyBpbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gZW50aXR5QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIG1hcGVkQXNTdXBlcmNsYXNzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIGluaGVyaXRhbmNlQnV0dG9uOwotCXByaXZhdGUgTGFiZWwgZGlzcGxheU5hbWVMYWJlbDsKLQlwcml2YXRlIEJ1dHRvbiB4bWxTdXBwb3J0QnV0dG9uOwkKLQlwcml2YXRlIGJvb2xlYW4gaXNGaXJzdENoZWNrID0gdHJ1ZTsKLQlwcml2YXRlIFRleHQgb3JtWG1sTmFtZTsKLQlwcml2YXRlIEJ1dHRvbiBicm93c2VCdXR0b247CQotCQotCQotCXB1YmxpYyBFbnRpdHlDbGFzc1dpemFyZFBhZ2UoCi0JCQlJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcGFnZU5hbWUsIFN0cmluZyBwYWdlRGVzYywgU3RyaW5nIHBhZ2VUaXRsZSkgewotCQkKLQkJc3VwZXIobW9kZWwsIHBhZ2VOYW1lLCBwYWdlRGVzYywgcGFnZVRpdGxlLCBudWxsKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlyZXR1cm4gQXJyYXlUb29scy5hZGRBbGwoCi0JCQkJc3VwZXIuZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSwgCi0JCQkJbmV3IFN0cmluZ1tdIHtJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfTkFNRSwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX1NVUFBPUlR9KTsKLQl9Ci0KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiAoSVByb2plY3QpIGdldERhdGFNb2RlbCgpLmdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOwotCX0KLQotCS8qIENyZWF0ZSB0b3AgbGV2ZWwgY29tcG9zaXRlIChjbGFzcyBwcm9wZXJ0aWVzKSBhbmQgYWRkIHRoZSBlbnRpdHkncyBzcGVjaWZpYyBpbmhlcml0YW5jZSBncm91cAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwud2l6YXJkLk5ld0phdmFDbGFzc1dpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gc3VwZXIuY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUocGFyZW50KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfRU5USVRZX0VOVElUWV9DTEFTUyk7Ci0JCQotCQljcmVhdGVJbmhlcml0YW5jZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy5pbmhlcml0YW5jZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gaXNDaGVja2VkID0gaW5oZXJpdGFuY2VCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKGlzQ2hlY2tlZCkgewotCQkJCQllbnRpdHlCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCQltYXBlZEFzU3VwZXJjbGFzc0J1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQkJCX0KLQkJCQlpbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm8uc2V0RW5hYmxlZChpc0NoZWNrZWQpOwotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFksIHRydWUpOwotCQkJCW1vZGVsLnNldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5NQVBQRURfQVNfU1VQRVJDTEFTUywgZmFsc2UpOwkJCQkKLQkJCQllbnRpdHlCdXR0b24uc2V0RW5hYmxlZCghaXNDaGVja2VkKTsKLQkJCQltYXBlZEFzU3VwZXJjbGFzc0J1dHRvbi5zZXRFbmFibGVkKCFpc0NoZWNrZWQpOwkJCQkKLQkJCX0KLQkJfSk7CQkKLQkJY3JlYXRlWE1Mc3RvcmFnZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJdGhpcy54bWxTdXBwb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBpc0NoZWNrZWQgPSB4bWxTdXBwb3J0QnV0dG9uLmdldFNlbGVjdGlvbigpOwotCQkJCWVuYWJsZU1hcHBpbmdYTUxDaG9vc2VHcm91cChpc0NoZWNrZWQpOwotCQkJCWlmIChpc0ZpcnN0Q2hlY2spIHsKLQkJCQkJb3JtWG1sTmFtZS5zZXRUZXh0KEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJCQkJaXNGaXJzdENoZWNrID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldFRhcmdldEpwYVByb2plY3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCXJldHVybiBwcm9qZWN0ICE9IG51bGwgPyBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCkgOiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvciBnZXRDb250YWluZXJEaWFsb2dTZWxlY3Rpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblN0YXR1c1ZhbGlkYXRvcigpIHsKLQkJCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKE9iamVjdFtdIHNlbGVjdGlvbikgewotCQkJCWlmIChzZWxlY3Rpb24gIT0gbnVsbCAmJiBzZWxlY3Rpb25bMF0gIT0gbnVsbCkgewotCQkJCQlpZiAoc2VsZWN0aW9uWzBdIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHNlbGVjdGlvblswXTsKLQkJCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKGphdmFQcm9qZWN0KSkgewotCQkJCQkJCWlmIChwcm9qZWN0LmVxdWFscyhyb290LmdldFJlc291cmNlKCkpKSB7Ci0JCQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoSjJFRVVJTWVzc2FnZXMuQ09OVEFJTkVSX1NFTEVDVElPTl9ESUFMT0dfVkFMSURBVE9SX01FU0cpOwotCQkJfQotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVmlld2VyRmlsdGVyIGdldENvbnRhaW5lckRpYWxvZ1ZpZXdlckZpbHRlcigpIHsKLQkJcmV0dXJuIG5ldyBWaWV3ZXJGaWx0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIHNlbGVjdChWaWV3ZXIgdmlld2VyLCBPYmplY3QgcGFyZW50LCBPYmplY3QgZWxlbWVudCkgewotCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IChTdHJpbmcpIG1vZGVsLmdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSk7Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBlbGVtZW50OwotCQkJCQlyZXR1cm4gcHJvamVjdC5nZXROYW1lKCkuZXF1YWxzKHByb2plY3ROYW1lKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSUZvbGRlciBmb2xkZXIgPSAoSUZvbGRlcikgZWxlbWVudDsKLQkJCQkJLy8gb25seSBzaG93IHNvdXJjZSBmb2xkZXJzCi0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBQcm9qZWN0VXRpbGl0aWVzLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKGphdmFQcm9qZWN0KSkgewotCQkJCQkJaWYgKGZvbGRlci5lcXVhbHMocm9vdC5nZXRSZXNvdXJjZSgpKSkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVJbmhlcml0YW5jZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgRW50aXR5V2l6YXJkTXNnLklOSEVSSVRBTkNFX0dST1VQKTsKLQkJdGhpcy5lbnRpdHlCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihncm91cCwgRW50aXR5V2l6YXJkTXNnLkVOVElUWSwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZKTsKLQkJdGhpcy5tYXBlZEFzU3VwZXJjbGFzc0J1dHRvbiA9IGNyZWF0ZVJhZGlvQnV0dG9uKGdyb3VwLCBFbnRpdHlXaXphcmRNc2cuTUFQUEVEX0FTX1NVUEVSQ0xBU1MsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLk1BUFBFRF9BU19TVVBFUkNMQVNTKTsKLQkJdGhpcy5pbmhlcml0YW5jZUJ1dHRvbiA9IGNyZWF0ZUNoZWNrQnV0dG9uKGdyb3VwLCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwsIDEvKmhvcml6b250YWwgc3BhbiovLCBFbnRpdHlXaXphcmRNc2cuSU5IRVJJVEFOQ0VfQ0hFQ0tfQk9YLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRSk7Ci0JCWNyZWF0ZUNvbWJvQm94KGdyb3VwLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRV9TVFJBVEVHWSk7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSB0aGUgZ3JvdXAsIHdoaWNoIG1hbmFnZSBlbnRpdHkgbWFwcGluZyByZWdpc3RyYXRpb24KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVYTUxzdG9yYWdlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCBFbnRpdHlXaXphcmRNc2cuWE1MX1NUT1JBR0VfR1JPVVApOwotCQl0aGlzLnhtbFN1cHBvcnRCdXR0b24gPSBjcmVhdGVDaGVja0J1dHRvbihncm91cCwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMLCAzLypob3Jpem9udGFsIHNwYW4qLywgRW50aXR5V2l6YXJkTXNnLlhNTF9TVVBQT1JULCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfU1VQUE9SVCk7CQkJCQotCQljcmVhdGVCcm93c2VHcm91cChncm91cCwgRW50aXR5V2l6YXJkTXNnLkNIT09TRV9YTUwsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKLQkJdGhpcy5vcm1YbWxOYW1lLnNldEVuYWJsZWQoZmFsc2UpOwkJCi0JCXRoaXMuYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwkJCi0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgdGhlIG5hbWUvdGl0bGUgb2YgdGhlIGdyb3VwCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBncm91cAotCSAqLwotCXByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7CQkKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7CQkKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgcmFkaW8gYnV0dG9uCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBpbmhlcml0YW5jZSBncm91cAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBidXR0b24KLQkgKi8KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlJBRElPKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJYnV0dG9uLnNldFRleHQodGV4dCk7Ci0JCXRoaXMuc3luY2hIZWxwZXIuc3luY2hSYWRpbyhidXR0b24sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7CQkKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlIGNoZWNrIGJ1dHRvbgotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlIC0gaW5oZXJpdGFuY2UgZ3JvdXAKLQkgKiBAcGFyYW0gdGV4dCB0aGUgbGFiZWwgb2YgdGhlIGJ1dHRvbgotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWxsIGJlIHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgYnV0dG9uCi0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgaW50IGZpbGxTdHJhdGVneSwgaW50IGhvcml6b250YWxTcGFuLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZpbmFsIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsJCQotCQlHcmlkRGF0YSBncm91cEdyaWREYXRhID0gbmV3IEdyaWREYXRhKGZpbGxTdHJhdGVneSk7Ci0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSBob3Jpem9udGFsU3BhbjsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KHRleHQpOwkJCi0JCXRoaXMuc3luY2hIZWxwZXIuc3luY2hDaGVja2JveChidXR0b24sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGNvbWJvIGJveCwgd2hpY2ggcHJlc2VudHMgdGhlIHNldCBvZiBwb3NzaWJsZSBpbmhlcml0YW5jZSBzdHJhdGVnaWVzCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBpbmhlcml0YW5jZSBncm91cAotCSAqIEBwYXJhbSBwcm9wZXJ0eSB0aGUgcmVsYXRlZCBwcm9wZXJ0eSB0byB3aGljaCB0aGlzIGJ1dHRvbiB3aWxsIGJlIHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENvbWJvIGNyZWF0ZUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQl0aGlzLmluaGVyaXRhbmNlU3RyYXRlZ3lDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwkJCi0JCWdyb3VwR3JpZERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0aGlzLmluaGVyaXRhbmNlU3RyYXRlZ3lDb21iby5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQl0aGlzLmluaGVyaXRhbmNlU3RyYXRlZ3lDb21iby5zZXRJdGVtcyhJTkhFUklUQU5DRV9TVFJBVEVHSUVTKTsJCQotCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGhpcy5pbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm8sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7Ci0JCXRoaXMuaW5oZXJpdGFuY2VTdHJhdGVneUNvbWJvLnNldEVuYWJsZWQoZmFsc2UpOwotCQlyZXR1cm4gdGhpcy5pbmhlcml0YW5jZVN0cmF0ZWd5Q29tYm87CQkKLQkJCi0JfQkKLQkKLQkvKioKLQkgKiBDcmVhdGUgWE1MIGdyb3VwCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUKLQkgKiBAcGFyYW0gbGFiZWwgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgZ3JvdXAgd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGdyb3VwCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJyb3dzZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBsYWJlbCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsJCi0KLQkJdGhpcy5kaXNwbGF5TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQl0aGlzLmRpc3BsYXlOYW1lTGFiZWwuc2V0VGV4dChsYWJlbCk7Ci0JCXRoaXMuZGlzcGxheU5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCi0JCXRoaXMub3JtWG1sTmFtZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQl0aGlzLm9ybVhtbE5hbWUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXRoaXMuYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJdGhpcy5icm93c2VCdXR0b24uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuQlJPV1NFX0JVVFRPTl9MQUJFTCk7Ci0JCUdyaWREYXRhIGJyb3dzZUJ1dHRvbkRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJYnJvd3NlQnV0dG9uRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCXRoaXMuYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoYnJvd3NlQnV0dG9uRGF0YSk7CQkKLQkJdGhpcy5icm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUNob29zZVhtbEJ1dHRvblByZXNzZWQoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQkJfSk7Ci0JCXRoaXMuc3luY2hIZWxwZXIuc3luY2hUZXh0KHRoaXMub3JtWG1sTmFtZSwgcHJvcGVydHksIC8qZGVwZW5kZW50Q29udHJvbHMqL251bGwpOwotCQkKLQkJZW5hYmxlTWFwcGluZ1hNTENob29zZUdyb3VwKGZhbHNlKTsJCQotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBpbmdGaWxlTmFtZSgpIHsKLQkJU3RyaW5nIG1hcHBpbmdGaWxlTG9jYXRpb24gPSB0aGlzLm1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKTsKLQkJcmV0dXJuIG5ldyBGaWxlKG1hcHBpbmdGaWxlTG9jYXRpb24pLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIGJyb3dzaW5nIHdoZW4gdGhlIEJyb3dzZS4uLiBidXR0b24gaGF2ZSBiZWVuIHByZXNzZWQuIEFsbG93IGNob29zaW5nIG9mIAotCSAqIFhNTCBmb3IgZW50aXR5IG1hcHBpbmcgcmVnaXN0cmF0aW9uCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDaG9vc2VYbWxCdXR0b25QcmVzc2VkKCkgewkJCi0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0KCk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCVZpZXdlckZpbHRlciBmaWx0ZXIgPSBnZXREaWFsb2dWaWV3ZXJGaWx0ZXIoanBhUHJvamVjdCk7Ci0JCUlUcmVlQ29udGVudFByb3ZpZGVyIGNvbnRlbnRQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hDb250ZW50UHJvdmlkZXIoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlciA9IG5ldyBXb3JrYmVuY2hMYWJlbFByb3ZpZGVyKCk7Ci0JCVNlbGVjdEpwYU9ybU1hcHBpbmdGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RKcGFPcm1NYXBwaW5nRmlsZURpYWxvZyhnZXRTaGVsbCgpLCBwcm9qZWN0LCBsYWJlbFByb3ZpZGVyLCBjb250ZW50UHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VGl0bGUoRW50aXR5V2l6YXJkTXNnLk1BUFBJTkdfWE1MX1RJVExFKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoRW50aXR5V2l6YXJkTXNnLkNIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotCQkJCi0JCVN0cmluZyBvcm1GaWxlTmFtZSA9IHRoaXMub3JtWG1sTmFtZS5nZXRUZXh0KCk7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0ganBhUHJvamVjdC5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKG9ybUZpbGVOYW1lKSk7Ci0JCUlGaWxlIGluaXRpYWxTZWxlY3Rpb24gPSAocmVzb3VyY2UgIT0gbnVsbCkgPyByZXNvdXJjZS5nZXRGaWxlKCkgOiBudWxsOwotCQlkaWFsb2cuc2V0SW5wdXQocHJvamVjdCk7Ci0KLQkJaWYgKGluaXRpYWxTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oaW5pdGlhbFNlbGVjdGlvbik7Ci0JCX0KLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlib29sZWFuIG5vTmFtZUNoYW5nZSA9IGZhbHNlOwotCQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ3NBcmVFcXVhbCh0aGlzLm1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlhNTF9OQU1FKSwgZGlhbG9nLmdldENob3Nlbk5hbWUoKSkpIHsKLQkJCQlub05hbWVDaGFuZ2UgPSB0cnVlOwotCQkJfQotCQkJdGhpcy5tb2RlbC5zZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfTkFNRSwgZGlhbG9nLmdldENob3Nlbk5hbWUoKSk7Ci0JCQlpZiAobm9OYW1lQ2hhbmdlKSB7Ci0JCQkJLy9pZiB0aGUgeG1sIG5hbWUgaGFzIG5vdCBjaGFuZ2VkLCB0aGUgd2l6YXJkIHBhZ2Ugd2lsbCBub3QgYmUgdmFsaWRhdGVkIChidWcgMzQ1MjkzKQotCQkJCXRoaXMudmFsaWRhdGVQYWdlKCk7Ci0JCQl9Ci0JCX0JCQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjcmVhdGUgZmlsdGVyIGZvciB0aGUgYnJvd3NlL2FkZCBhbHRlcm5hdGl2ZSBtYXBwaW5nIFhNTCAKLQkgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiB2aWV3ZXIgZmlsdGVyIGZvciB0aGUgU2VsZWN0TWFwcGluZ1hNTERpYWxvZwotCSAqLwotCXByb3RlY3RlZCBWaWV3ZXJGaWx0ZXIgZ2V0RGlhbG9nVmlld2VyRmlsdGVyKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlyZXR1cm4gbmV3IFhtbE1hcHBpbmdGaWxlVmlld2VyRmlsdGVyKGpwYVByb2plY3QpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZW5hYmxlTWFwcGluZ1hNTENob29zZUdyb3VwKGJvb2xlYW4gZW5hYmxlZCkgewotCQl0aGlzLmRpc3BsYXlOYW1lTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJdGhpcy5vcm1YbWxOYW1lLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMuYnJvd3NlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHByb2plY3QgbGlzdCBpbml0aWFsaXplci4gVGhlIG1ldGhvZCBjaGVja3MgCi0JICogaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIHZhbGlkIHRvIGluY2x1ZGUgaXQgaW4gdGhlIHByb2plY3QgbGlzdC4KLQkgKiAKLQkgKiA8cD5TdWJjbGFzc2VzIG9mIHRoaXMgd2l6YXJkIHBhZ2Ugc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIAotCSAqIGFkanVzdCBmaWx0ZXJpbmcgb2YgdGhlIHByb2plY3RzIHRvIHRoZWlyIG5lZWRzLiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QgcmVmZXJlbmNlIHRvIHRoZSBwcm9qZWN0IHRvIGJlIGNoZWNrZWQKLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9qZWN0IGlzIHZhbGlkIHRvIGJlIGluY2x1ZGVkIGluIAotCSAqIAkJICAgdGhlIHByb2plY3QgbGlzdCwgPGNvZGU+ZmFsc2U8L2NvZGU+IC0gb3RoZXJ3aXNlLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Byb2plY3RWYWxpZChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiAocHJvamVjdC5pc0FjY2Vzc2libGUoKSAmJiBKcGFGYWNldC5pc0luc3RhbGxlZChwcm9qZWN0KSk7CQotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5RmllbGRzV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlGaWVsZHNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNmM4ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlGaWVsZHNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwub3BlcmF0aW9uLklBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwucGx1Z2luLldUUENvbW1vblBsdWdpbjsKLQotcHVibGljIGNsYXNzIEVudGl0eUZpZWxkc1dpemFyZFBhZ2UgZXh0ZW5kcyBEYXRhTW9kZWxXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgVGV4dCBlbnRpdHlOYW1lVGV4dDsKLQlwcml2YXRlIFRleHQgdGFibGVOYW1lVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiB0YWJsZU5hbWVDaGVja0J1dHRvbjsJCi0JcHJpdmF0ZSBCdXR0b24gZmllbGRBY2Nlc3NCdXR0b247Ci0JcHJpdmF0ZSBCdXR0b24gcHJvcGVydHlBY2Nlc3NCdXR0b247Ci0JcHJpdmF0ZSBib29sZWFuIGlzTm9uRW50aXR5ID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNCdXR0b25zQ3JlYXRlZCA9IGZhbHNlOwotCi0JcHVibGljIEVudGl0eUZpZWxkc1dpemFyZFBhZ2UoSURhdGFNb2RlbCBtb2RlbCwgU3RyaW5nIHBhZ2VOYW1lKSB7Ci0JCXN1cGVyKG1vZGVsLCBwYWdlTmFtZSk7Ci0JCXRoaXMuc2V0VGl0bGUoRW50aXR5V2l6YXJkTXNnLkVOVElUWV9QUk9QRVJUSUVTX1RJVExFKTsKLQkJdGhpcy5zZXREZXNjcmlwdGlvbihFbnRpdHlXaXphcmRNc2cuRU5USVRZX1BST1BFUlRJRVNfREVTQ1JJUFRJT04pOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamVtLnV0aWwudWkud2l6YXJkLldUUFdpemFyZFBhZ2UjZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfRklFTERTLCAKLQkJCQkJCQlJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFN9OwotCX0KLQkKLQkvKiBDcmVhdGUgdGhlIG1haW4gY29tcG9zaXRlIGFuZCBhZGQgdG8gaXQgdGhlIGVudGl0eSBwcm9wZXJ0aWVzCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2UjY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlVG9wTGV2ZWxDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLk5FV19KUEFfRU5USVRZX0VOVElUWV9QUk9QRVJUSUVTKTsKLQkJCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDA7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IDQ1MDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNvbXBvc2l0ZS5wYWNrKCk7Ci0JCQkJCi0JCWVudGl0eU5hbWVUZXh0ID0gY3JlYXRlTmFtZUdyb3VwKGNvbXBvc2l0ZSwgRW50aXR5V2l6YXJkTXNnLkVOVElUWV9OQU1FLCBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTlRJVFlfTkFNRSk7CQkKLQkJR3JvdXAgZ3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIEVudGl0eVdpemFyZE1zZy5UQUJMRV9OQU1FX0dST1VQKTsKLQkJdGFibGVOYW1lQ2hlY2tCdXR0b249IGNyZWF0ZUNoZWNrQnV0dG9uKGdyb3VwLCBFbnRpdHlXaXphcmRNc2cuVVNFX0RFRkFVTFQsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBQkxFX05BTUVfREVGQVVMVCk7CQkKLQkJdGFibGVOYW1lVGV4dCA9IGNyZWF0ZU5hbWVHcm91cChncm91cCwgRW50aXR5V2l6YXJkTXNnLlRBQkxFX05BTUUsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBQkxFX05BTUUpOwotCQl0YWJsZU5hbWVUZXh0LnNldEVuYWJsZWQoIXRhYmxlTmFtZUNoZWNrQnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJaXNCdXR0b25zQ3JlYXRlZCA9IHRydWU7Ci0JCWluaXROYW1lR3JvdXAoKTsKLQkJY3JlYXRlRW50aXR5RmllbGRzR3JvdXAoY29tcG9zaXRlKTsKLQotCQlHcm91cCBhY2Nlc3NUeXBlR3JvdXAgPSBjcmVhdGVHcm91cChjb21wb3NpdGUsIEVudGl0eVdpemFyZE1zZy5BQ0NFU1NfVFlQRSk7Ci0JCWZpZWxkQWNjZXNzQnV0dG9uID0gY3JlYXRlUmFkaW9CdXR0b24oYWNjZXNzVHlwZUdyb3VwLCBFbnRpdHlXaXphcmRNc2cuRklFTERfQkFTRUQsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkZJRUxEX0FDQ0VTU19UWVBFKTsKLQkJcHJvcGVydHlBY2Nlc3NCdXR0b24gPSBjcmVhdGVSYWRpb0J1dHRvbihhY2Nlc3NUeXBlR3JvdXAsIEVudGl0eVdpemFyZE1zZy5QUk9QRVJUWV9CQVNFRCwgSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuUFJPUEVSVFlfQUNDRVNTX1RZUEUpOwotCQkKLQkJCi0JCUlTdGF0dXMgcHJvamVjdFN0YXR1cyA9IHZhbGlkYXRlUHJvamVjdE5hbWUoKTsKLQkJaWYgKCFwcm9qZWN0U3RhdHVzLmlzT0soKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKHByb2plY3RTdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBwcm9qZWN0IG5hbWUgY29ycmVjdG5lc3MKLQkgKi8KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVByb2plY3ROYW1lKCkgewotCQkvLyBjaGVjayBmb3IgZW1wdHkKLQkJaWYgKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElBcnRpZmFjdEVkaXRPcGVyYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1RfTkFNRSkgPT0gbnVsbCB8fCBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKEVudGl0eVdpemFyZE1zZy5OT19KUEFfUFJPSkVDVFMpOwotCQl9Ci0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbnRpdHlGaWVsZHNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwkJCi0JCUdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZ3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ3JvdXBHcmlkRGF0YSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlncm91cC5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5FTlRJVFlfRklFTERTX0dST1VQKTsKLQkJbmV3IEVudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbihncm91cCwgbW9kZWwsIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMpOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgbmFtZWQgZ3JvdXAKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBsYWJlbCB0aGUgbmFtZSBvZiB0aGUgZ3JvdXAKLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHJlbGF0ZWQgcHJvcGVydHkgdG8gd2hpY2ggdGhpcyBncm91cCB3aWxsIGJlIHN5bmNocm9uaXplZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgZ3JvdXAKLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVOYW1lR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwkKLQkJTGFiZWwgZGlzcGxheU5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRUZXh0KGxhYmVsKTsKLQkJZGlzcGxheU5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQlUZXh0IG5hbWVUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCW5hbWVUZXh0LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzeW5jaEhlbHBlci5zeW5jaFRleHQobmFtZVRleHQsIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi9udWxsKTsJCQotCQlyZXR1cm4gbmFtZVRleHQ7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZSBncm91cAotCSAqIEBwYXJhbSBwYXJlbnQgdGhlIG1haW4gY29tcG9zaXRlCi0JICogQHBhcmFtIHRleHQgdGhlIG5hbWUgb2YgdGhlIGdyb3VwCSAKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGdyb3VwCi0JICovCQotCXByaXZhdGUgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7CQkKLQkJR3JpZERhdGEgZ3JvdXBHcmlkRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlncm91cEdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMzsKLQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShncm91cEdyaWREYXRhKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDMsIGZhbHNlKSk7Ci0JCWdyb3VwLnNldFRleHQodGV4dCk7CQkKLQkJcmV0dXJuIGdyb3VwOwotCX0KLQkKLQkvKioKLQkgKiBDcmVhdGUgY2hlY2sgYnV0dG9uCi0JICogQHBhcmFtIHBhcmVudCB0aGUgbWFpbiBjb21wb3NpdGUgLSBpbmhlcml0YW5jZSBncm91cAotCSAqIEBwYXJhbSB0ZXh0IHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uCi0JICogQHBhcmFtIHByb3BlcnR5IHRoZSByZWxhdGVkIHByb3BlcnR5IHRvIHdoaWNoIHRoaXMgYnV0dG9uIHdpbGwgYmUgc3luY2hyb25pemVkCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBidXR0b24KLQkgKi8JCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlmaW5hbCBCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCUdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBpc0NoZWNrZWQgPSBidXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHRhYmxlTmFtZVRleHQgIT0gbnVsbCkgewotCQkJCQl0YWJsZU5hbWVUZXh0LnNldEVuYWJsZWQoIWlzQ2hlY2tlZCk7Ci0JCQkJfQotCQkJfQotCQl9KTsJCQotCQlzeW5jaEhlbHBlci5zeW5jaENoZWNrYm94KGJ1dHRvbiwgcHJvcGVydHksIC8qZGVwZW5kZW50Q29udHJvbHMqLyBudWxsKTsJCQotCQlyZXR1cm4gYnV0dG9uOwotCX0JCQotCQotCS8qKgotCSAqIENyZWF0ZSByYWRpbyBidXR0b24KLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZSAtIGluaGVyaXRhbmNlIGdyb3VwCi0JICogQHBhcmFtIHRleHQgdGhlIGxhYmVsIG9mIHRoZSBidXR0b24KLQkgKiBAcGFyYW0gcHJvcGVydHkgdGhlIHJlbGF0ZWQgcHJvcGVydHkgdG8gd2hpY2ggdGhpcyBidXR0b24gd2lsbCBiZSBzeW5jaHJvbml6ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGJ1dHRvbgotCSAqLwotCXByaXZhdGUgQnV0dG9uIGNyZWF0ZVJhZGlvQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUkFESU8pOwkJCi0JCUdyaWREYXRhIGdyb3VwR3JpZERhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ3JvdXBHcmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyb3VwR3JpZERhdGEpOwotCQlidXR0b24uc2V0VGV4dCh0ZXh0KTsKLQkJc3luY2hIZWxwZXIuc3luY2hSYWRpbyhidXR0b24sIHByb3BlcnR5LCAvKmRlcGVuZGVudENvbnRyb2xzKi8gbnVsbCk7CQkKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvKgotCSAqIElmIGEgcHJvcGVydHkgY2hhbmdlcyB0aGF0IHdlIHdhbnQgdG8gdmFsaWRhdGUsIGZvcmNlIHZhbGlkYXRpb24gb24gdGhpcyBwYWdlLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLm9wZXJhdGlvbi5XVFBPcGVyYXRpb25EYXRhTW9kZWxMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZWQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKERhdGFNb2RlbEV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJaWYgKElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLk1BUFBFRF9BU19TVVBFUkNMQVNTLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlpbml0TmFtZUdyb3VwKCk7Ci0JCX0JCQotCQlzdXBlci5wcm9wZXJ0eUNoYW5nZWQoZXZlbnQpOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgbWV0aG9kcyBpcyBmb3IgdGhlIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIHNldCB0aGUgZW50aXR5IGFuZCB0YWJsZSBuYW1lCi0JICogZ3JvdXAgdG8gYmUgZGlzYWJsZWQgaWYgdGhlIGNyZWF0ZWQgYXJ0aWZhY3QgaXMgbm90IGVudGl0eQotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0TmFtZUdyb3VwKCkgewkJCi0JCWlzTm9uRW50aXR5ID0gbW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLk1BUFBFRF9BU19TVVBFUkNMQVNTKTsJCQotCQlpZiAoaXNCdXR0b25zQ3JlYXRlZCkgewotCQkJZW50aXR5TmFtZVRleHQuc2V0RW5hYmxlZCghaXNOb25FbnRpdHkpOwotCQkJdGFibGVOYW1lQ2hlY2tCdXR0b24uc2V0RW5hYmxlZCghaXNOb25FbnRpdHkpOwotCQkJdGFibGVOYW1lVGV4dC5zZXRFbmFibGVkKCF0YWJsZU5hbWVDaGVja0J1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0JCQotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLX0KLQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbi5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYwM2NlZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDA5IGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5LZXlTdHJva2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYmluZGluZ3Mua2V5cy5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuQ29udGVudFByb3Bvc2FsQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5maWVsZGFzc2lzdC5JQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuVGV4dENvbnRlbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrYm94VGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNoZWNrU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLkVudGl0eVJvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuZGlhbG9ncy5UeXBlU2VhcmNoRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TZWxlY3Rpb25EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoZSBjbGFzcyBwcmVzZW50cyB0aGUgdGFibGUgd2l0aCBlbnRpdHkgZmllbGRzLiBJbiB0aGUgamF2YSBmaWxlIGFyZSBpbmNsdWRlZCBhbHNvIGNvbnRlbnQKLSAqIGFuZCBsYWJlbCBwcm92aWRlciwgYWRkIGFuZCBlZGl0IGVudGl0eSBkaWFsb2dzIGFzIHdlbGwgYXMgaGVscCBpbnRlcm5hbCBvYmplY3RzIC0gbGlzdGVuZXIgCi0gKiBhbmQgY2FsbGJhY2sgZnJvbSB0aGUgZGlhbG9nIHRvIHRoZSBtYWluIGNvbXBvc2l0ZSAodGFibGUpLiAKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnRpdHlSb3dUYWJsZVdpemFyZFNlY3Rpb24gZXh0ZW5kcyBDb21wb3NpdGUgewotCQotCS8qKgotCSAqIFRoZSBwb3NzaWJsZSBlbnRpdHkgdHlwZXMsIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiAoQ2hhcHRlciAyLjEuMSBQZXJzaXN0ZW50IEZpZWxkcyBhbmQgUHJvcGVydGllcyBwLjIwKQotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nW10gVkFMSURfVFlQRVMgPSB7ImludCIsIAotCQkJCQkJCQkJCQkJICAgImxvbmciLCAKLQkJCQkJCQkJCQkJCSAgICJzaG9ydCIsIAotCQkJCQkJCQkJCQkJICAgImNoYXIiLCAKLQkJCQkJCQkJCQkJCSAgICJib29sZWFuIiwgCi0JCQkJCQkJCQkJCQkgICAiYnl0ZSIsIAotCQkJCQkJCQkJCQkJICAgImRvdWJsZSIsIAotCQkJCQkJCQkJCQkJICAgImZsb2F0IiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLlN0cmluZyIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5JbnRlZ2VyIiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkxvbmciLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLmxhbmcuU2hvcnQiLAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5DaGFyYWN0ZXIiLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLmxhbmcuQm9vbGVhbiIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5CeXRlIiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5sYW5nLkRvdWJsZSIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubGFuZy5GbG9hdCIsIAotCQkJCQkJCQkJCQkJICAgImphdmEubWF0aC5CaWdEZWNpbWFsIiwgCi0JCQkJCQkJCQkJCQkgICAiamF2YS5tYXRoLkJpZ0ludGVnZXIiLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLnV0aWwuRGF0ZSIsIAotCQkJCQkJCQkJCQkJICAgImphdmEudXRpbC5DYWxlbmRhciIsCi0JCQkJCQkJCQkJCQkgICAiamF2YS5zcWwuRGF0ZSIsIAotCQkJCQkJCQkJCQkJICAgImphdmEuc3FsLlRpbWUiLCAKLQkJCQkJCQkJCQkJCSAgICJqYXZhLnNxbC5UaW1lc3RhbXAiLAotCQkJCQkJCQkJCQkJICAgIlN0cmluZyIsIAotCQkJCQkJCQkJCQkJICAgIkludGVnZXIiLCAKLQkJCQkJCQkJCQkJCSAgICJMb25nIiwgCi0JCQkJCQkJCQkJCQkgICAiU2hvcnQiLAotCQkJCQkJCQkJCQkJICAgIkNoYXJhY3RlciIsIAotCQkJCQkJCQkJCQkJICAgIkJvb2xlYW4iLCAKLQkJCQkJCQkJCQkJCSAgICJCeXRlIiwgCi0JCQkJCQkJCQkJCQkgICAiRG91YmxlIiwgCi0JCQkJCQkJCQkJCQkgICAiRmxvYXQiIH07CQotCQotCSAgcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIG1UYWJsZVZpZXdlciA9IG51bGw7Ci0JICBwcml2YXRlIFRhYmxlIG1UYWJsZVdpZGdldCA9IG51bGw7Ci0JICBwcml2YXRlIGZpbmFsIGludCBOQU1FX0NPTFVNTiA9IDE7Ci0JICBwcml2YXRlIGZpbmFsIGludCBUWVBFX0NPTFVNTiA9IDI7Ci0JCi0JICAKLQotCQotCXByaXZhdGUgQnV0dG9uIGFkZEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBlZGl0QnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHJlbW92ZUJ1dHRvbjsKLQlwcml2YXRlIFN0cmluZyB0aXRsZSA9IEVudGl0eVdpemFyZE1zZy5FTlRJVFlfRklFTERTX0RJQUxPR19USVRMRTsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVQcm9wb3NhbHMgPSBWQUxJRF9UWVBFUzsKLQlwcml2YXRlIFN0cmluZ1tdIGxhYmVsc0ZvclRleHQgPSBuZXcgU3RyaW5nW117RW50aXR5V2l6YXJkTXNnLlRZUEVfVEVYVF9GSUVMRCwgRW50aXR5V2l6YXJkTXNnLk5BTUVfVEVYVF9GSUVMRH07Ci0JcHJpdmF0ZSBJRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5TmFtZTsKLQlwcml2YXRlIEltYWdlIGxhYmVsUHJvdmlkZXJJbWFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBEaWFsb2dDYWxsYmFjayBjYWxsYmFjazsJCi0JcHJpdmF0ZSBzdGF0aWMgS2V5U3Ryb2tlIGtzID0gbnVsbDsKLQlzdGF0aWMgewotCQl0cnkgewotCQkJa3MgPSBLZXlTdHJva2UuZ2V0SW5zdGFuY2UoIkN0cmwrU3BhY2UiKTsJCQkKLQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZTEpIHsKLQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlMSk7Ci0JCX0gCi0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50IHRoZSBtYWluIGNvbXBvc2l0ZSAtIEVudGl0eSBmaWVsZHMgcGFnZQotCSAqIEBwYXJhbSBtb2RlbCB0aGUgZGF0YSBtb2RlbCByZXByZXNlbnRhdGlvbgotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgZGF0YSBwcm9wZXJ0eSBuYW1lCi0JICovCi0JcHVibGljIEVudGl0eVJvd1RhYmxlV2l6YXJkU2VjdGlvbihDb21wb3NpdGUgcGFyZW50LCBJRGF0YU1vZGVsIG1vZGVsLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwkKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsJCQotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gNDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJdGhpcy5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQltVGFibGVXaWRnZXQgPSBuZXcgVGFibGUodGhpcywgU1dULkNIRUNLIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkJPUkRFUik7Ci0gICAgICAgIG1UYWJsZVdpZGdldC5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotICAgICAgICBtVGFibGVXaWRnZXQuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgICAgIG1UYWJsZVZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKG1UYWJsZVdpZGdldCk7Ci0gICAgICAgIEdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLSAgICAgICAgZGF0YS52ZXJ0aWNhbFNwYW4gPSAyOwotCQltVGFibGVXaWRnZXQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbVRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgRW50aXR5Um93Q29udGVudFByb3ZpZGVyKCkpOwotCQltVGFibGVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgRW50aXR5Um93TGFiZWxQcm92aWRlcigpKTsKLQkJCi0JCWZpbmFsIENvbXBvc2l0ZSBidXR0b25Db21wb3NpdGlvbiA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5VTEwpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJYnV0dG9uQ29tcG9zaXRpb24uc2V0TGF5b3V0KGxheW91dCk7Ci0JCWJ1dHRvbkNvbXBvc2l0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwgfCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcpKTsKLQotCQlhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0aW9uLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KEVudGl0eVdpemFyZE1zZy5BRERfQlVUVE9OX0xBQkVMKTsgCi0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vRG8gbm90aGluZwotCQkJfQotCQl9KTsKLQotCQllZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGlvbiwgU1dULlBVU0gpOwotCQllZGl0QnV0dG9uLnNldFRleHQoRW50aXR5V2l6YXJkTXNnLkVESVRfQlVUVE9OX0xBQkVMKTsKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZWRpdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZUVkaXRCdXR0b25TZWxlY3RlZCgpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy9EbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQltVGFibGVWaWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJaGFuZGxlRWRpdEJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRpb24sIFNXVC5QVVNIKTsKLQkJcmVtb3ZlQnV0dG9uLnNldFRleHQoRW50aXR5V2l6YXJkTXNnLlJFTU9WRV9CVVRUT05fTEFCRUwpOwotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HIHwgR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCWhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkvL0RvIG5vdGhpbmcKLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQotCQltVGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChlZGl0QnV0dG9uICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiBlbmFibGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPT0gMTsKLQkJCQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJCX0KLQkJCQlyZW1vdmVCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJCi0JCWZpbmFsIFRhYmxlQ29sdW1uIHBrQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKG1UYWJsZVdpZGdldCwgU1dULkNIRUNLKTsKLSAgICAgICAgcGtDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuS0VZKTsKLQkJcGtDb2x1bW4ucGFjaygpOwotCQlwa0NvbHVtbi5zZXRSZXNpemFibGUoZmFsc2UpOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIG5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlV2lkZ2V0LCBTV1QuTk9ORSk7Ci0gICAgICAgIG5hbWVDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuTkFNRV9DT0xVTU4pOwotCi0gICAgICAgIFRhYmxlQ29sdW1uIHR5cGVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4obVRhYmxlV2lkZ2V0LCBTV1QuTk9ORSk7Ci0gICAgICAgIHR5cGVDb2x1bW4uc2V0VGV4dChFbnRpdHlXaXphcmRNc2cuVFlQRV9DT0xVTU4pOwotCi0gICAgICAgIHRoaXMuYWRkQ29udHJvbExpc3RlbmVyKG5ldyBDb250cm9sQWRhcHRlcigpIHsKLSAgICAgICAgCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLSAgICAgICAgCQlUYWJsZSB0YWJsZSA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpOwotICAgICAgICAgICAgICAgICAgICBUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSB0YWJsZS5nZXRDb2x1bW5zKCk7Ci0JCQkJUG9pbnQgYnV0dG9uQXJlYSA9IGJ1dHRvbkNvbXBvc2l0aW9uLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJUmVjdGFuZ2xlIGFyZWEgPSB0YWJsZS5nZXRQYXJlbnQoKS5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpLSBidXR0b25BcmVhLnggLSBjb2x1bW5zLmxlbmd0aCAqIDIgLSBwa0NvbHVtbi5nZXRXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCArIHRhYmxlLmdldEhlYWRlckhlaWdodCgpKSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpbnQgY29uc3VtZVdpZHRoID0gMDsKLQkJCQlpbnQgY29sID0gY29sdW1ucy5sZW5ndGggLSAxOwotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAob2xkU2l6ZS54ID4gYXJlYS53aWR0aCkgewotCQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJCS8vIHNtYWxsZXIgZmlyc3QgYW5kIHRoZW4gcmVzaXplIHRoZSB0YWJsZSB0bwotCQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCQljb25zdW1lV2lkdGggPSBzZXRDb2x1bW50V2lkdGgod2lkdGgsIGNvbHVtbnMsIGNvbnN1bWVXaWR0aCwgaSk7Ci0JCQkJCQl0YWJsZS5zZXRTaXplKGFyZWEud2lkdGggLSBidXR0b25BcmVhLngJLSAoY29sICogMiArIHBrQ29sdW1uLmdldFdpZHRoKCkpLCBhcmVhLmhlaWdodCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJCS8vIHRvIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQkJY29uc3VtZVdpZHRoID0gc2V0Q29sdW1udFdpZHRoKHdpZHRoLCBjb2x1bW5zLCAJY29uc3VtZVdpZHRoLCBpKTsKLQkJCQkJCXRhYmxlLnNldFNpemUoYXJlYS53aWR0aCAtIGJ1dHRvbkFyZWEueCAtIChjb2wgKiAyICsgcGtDb2x1bW4uZ2V0V2lkdGgoKSksIGFyZWEuaGVpZ2h0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBpbnQgc2V0Q29sdW1udFdpZHRoKGludCB3aWR0aCwgVGFibGVDb2x1bW5bXSBjb2x1bW5zLAotCQkJCQlpbnQgY29uc3VtZVdpZHRoLCBpbnQgaSkgewotCQkJCWlmIChpIDwgY29sdW1ucy5sZW5ndGggLSAxKSB7Ci0JCQkJCWNvbHVtbnNbaV0uc2V0V2lkdGgod2lkdGggLyAoY29sdW1ucy5sZW5ndGggLSAxKSk7Ci0JCQkJCWNvbnN1bWVXaWR0aCArPSBjb2x1bW5zW2ldLmdldFdpZHRoKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29sdW1uc1tpXS5zZXRXaWR0aCh3aWR0aCAtIGNvbnN1bWVXaWR0aCk7Ci0JCQkJfQotCQkJCXJldHVybiBjb25zdW1lV2lkdGg7Ci0JCQl9Ci0JCX0pOwotICAgICAgICAKLQkJbVRhYmxlVmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgUEtGaWVsZENoZWNrU3RhdGVMaXN0ZW5lcigpKTsKLQkJY2FsbGJhY2sgPSBuZXcgRmllbGREaWFsb2dDYWxsYmFjaygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHByb2Nlc3MgdGhlIEFkZC4uLiBidXR0b24gcHJlc3NlZCBldmVudC4gSXQgb3BlbnMgZGlhbG9nIHRvCi0JICogYWRkIG5ldyBlbnRpdHkgZmllbGQKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlQWRkQnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUFkZEZpZWxkRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRGaWVsZERpYWxvZyhnZXRTaGVsbCgpLCB0aXRsZSwgdHlwZVByb3Bvc2FscywgbGFiZWxzRm9yVGV4dCk7Ci0JCWludCByZXN1bHQgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmVzdWx0ID09IFdpbmRvdy5DQU5DRUwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlFbnRpdHlSb3cgZW50aXR5Um93ID0gZGlhbG9nLmdldEVudGl0eVJvdygpOwotCQlhZGRFbnRpdHlSb3coZW50aXR5Um93KTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkIG5ldyBlbnRpdHkgdG8gdGhlIHRhYmxlIGlucHV0Ci0JICogCi0JICogQHBhcmFtIGVudGl0eQotCSAqICAgICAgICAgICAgdGhlIGVudGl0eSB3aGljaCBoYXZlIHRvIGJlIGFkZGVkIHRvIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRFbnRpdHlSb3coRW50aXR5Um93IGVudGl0eSkgewotCQlpZiAoZW50aXR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUxpc3Q8RW50aXR5Um93PiB2YWx1ZUxpc3QgPSAoQXJyYXlMaXN0PEVudGl0eVJvdz4pIG1UYWJsZVZpZXdlci5nZXRJbnB1dCgpOwkJCi0JCWlmICh2YWx1ZUxpc3QgPT0gbnVsbCkKLQkJCXZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3Q8RW50aXR5Um93PigpOwkJCi0JCXZhbHVlTGlzdC5hZGQoZW50aXR5KTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcHJvY2VzcyB0aGUgRWRpdC4uLiBidXR0b24gcHJlc3NlZCBldmVudC4gSXQgb3BlbnMgZGlhbG9nIHRvIGVkaXQgY2hvc2VuIGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVFZGl0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCUlTZWxlY3Rpb24gcyA9IG1UYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKCEocyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSAhPSAxKQotCQkJcmV0dXJuOwotCQkKLQkJT2JqZWN0IHNlbGVjdGVkT2JqID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQlFbnRpdHlSb3cgZW50aXR5Rm9yRWRpdCA9IChFbnRpdHlSb3cpIHNlbGVjdGVkT2JqOwotCQlpbnQgaW5kZXggPSBtVGFibGVXaWRnZXQuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJYm9vbGVhbiBpc0NoZWNrZWQgPSBtVGFibGVWaWV3ZXIuZ2V0Q2hlY2tlZChlbnRpdHlGb3JFZGl0KTsKLQkJCi0JCUVkaXRGaWVsZERpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdEZpZWxkRGlhbG9nKGdldFNoZWxsKCksIHRpdGxlLCB0eXBlUHJvcG9zYWxzLCBsYWJlbHNGb3JUZXh0LCBlbnRpdHlGb3JFZGl0KTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJRW50aXR5Um93IGVudGl0eVJvdyA9IGRpYWxvZy5nZXRFbnRpdHlSb3coKTsKLQkJaWYgKGVudGl0eVJvdyAhPSBudWxsKSB7CQkJCi0JCQllZGl0RW50aXR5Um93KGluZGV4LCBlbnRpdHlSb3cpOwotCQkJbVRhYmxlVmlld2VyLnNldENoZWNrZWQoZW50aXR5Um93LCBpc0NoZWNrZWQpOwotCQkJbVRhYmxlVmlld2VyLnNldEdyYXllZChlbnRpdHlSb3csIGZhbHNlKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBFZGl0IGNob3NlbiBlbnRpdHkgZnJvbSB0aGUgdGFibGUKLQkgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBlbnRpdHkgaW4gdGhlIHRhYmxlCi0JICogQHBhcmFtIG5ld0VudGl0eSB0aGUgZWRpdGVkIGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgdm9pZCBlZGl0RW50aXR5Um93KGludCBpbmRleCwgRW50aXR5Um93IG5ld0VudGl0eSkgewotCQlpZiAobmV3RW50aXR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0PEVudGl0eVJvdz4gdmFsdWVMaXN0ID0gKEFycmF5TGlzdDxFbnRpdHlSb3c+KSBtVGFibGVWaWV3ZXIuZ2V0SW5wdXQoKTsJCQotCQlpZiAodmFsdWVMaXN0ID09IG51bGwpIHsKLQkJCXZhbHVlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQkJCQotCQlpZiAoaW5kZXggPT0gLTEpIHsKLQkJCXZhbHVlTGlzdC5hZGQobmV3RW50aXR5KTsKLQkJfSBlbHNlIHsKLQkJCXZhbHVlTGlzdC5zZXQoaW5kZXgsIG5ld0VudGl0eSk7Ci0JCX0KLQkJCi0JCXNldElucHV0KHZhbHVlTGlzdCk7CQkKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBwcm9jZXNzIHRoZSBSZW1vdmUgYnV0dG9uIHByZXNzZWQgZXZlbnQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVJlbW92ZUJ1dHRvblNlbGVjdGVkKCkgewotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG1UYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkgfHwgIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUxpc3Qgc2VsZWN0ZWRPYmplY3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvTGlzdCgpOwotCQlyZW1vdmVFbnRpdHlSb3coc2VsZWN0ZWRPYmplY3QpOwkJCi0JfQotCQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHNlbGVjdGVkIGVudGl0aWVzIGZyb20gdGhlIHRhYmxlIAotCSAqIEBwYXJhbSBlbnRpdGllcyBsaXN0IHdpdGggZW50aXRpZXMsIHdoaWNoIHNob3VsZCBiZSByZW1vdmVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVJvdyhDb2xsZWN0aW9uIGVudGl0aWVzKSB7Ci0JCUxpc3Q8RW50aXR5Um93PiB2YWx1ZUxpc3QgPSAoQXJyYXlMaXN0PEVudGl0eVJvdz4pIG1UYWJsZVZpZXdlci5nZXRJbnB1dCgpOwotCQl2YWx1ZUxpc3QucmVtb3ZlQWxsKGVudGl0aWVzKTsKLQkJc2V0SW5wdXQodmFsdWVMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGlucHV0IG9mIHRoZSB0YWJsZQotCSAqIEBwYXJhbSBpbnB1dCB0aGUgbGlzdCB3aXRoIGVudGl0aWVzIHdoaWNoIGhhdmUgdG8gYmUgcHJlc2VudGVkIGluIHRoZSB0YWJsZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJbnB1dChMaXN0IGlucHV0KSB7Ci0JCW1UYWJsZVZpZXdlci5zZXRJbnB1dChpbnB1dCk7Ci0JCS8vIENyZWF0ZSBhIG5ldyBsaXN0IHRvIHRyaWdnZXIgcHJvcGVydHkgY2hhbmdlCi0JCUFycmF5TGlzdDxFbnRpdHlSb3c+IG5ld0lucHV0ID0gbmV3IEFycmF5TGlzdDxFbnRpdHlSb3c+KCk7Ci0JCW5ld0lucHV0LmFkZEFsbChpbnB1dCk7Ci0JCW1vZGVsLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbmV3SW5wdXQpOwkJCi0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgVGFibGVWaWV3ZXIgb2YgdGhlIHRhYmxlCi0JICovCi0JcHVibGljIFRhYmxlVmlld2VyIGdldFRhYmxlVmlld2VyKCkgewotCQlyZXR1cm4gbVRhYmxlVmlld2VyOwotCX0KLQkKLQkvLyBQUk9WSURFUlMgRk9SIFRIRSBGSUVMRCBUQUJMRQotCQotCS8qKgotCSAqIFRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgdGFibGUgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRW50aXR5Um93Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTGlzdCkgewotCQkJCXJldHVybiAoKExpc3QpIGVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgYVZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCS8vRGVmYXVsdCBub3RoaW5nCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhlIGxhYmVsIHByb3ZpZGVyIGZvciB0aGUgdGFibGUgaXRlbXMKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgRW50aXR5Um93TGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKSB7Ci0JCSAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXJJbWFnZTsgICAgICAgCi0JCSAgICB9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUVudGl0eVJvdyBlbnRpdHkgPSAoRW50aXR5Um93KSBlbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IE5BTUVfQ09MVU1OKSB7Ci0JCQkJcmV0dXJuIGVudGl0eS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gVFlQRV9DT0xVTU4pIHsKLQkJCQlyZXR1cm4gZW50aXR5LmdldEZxblR5cGVOYW1lKCk7Ci0JCQl9CQkKLQkJCW1UYWJsZVZpZXdlci5zZXRDaGVja2VkKGVudGl0eSwgZW50aXR5LmlzS2V5KCkpOwotCQkJcmV0dXJuICIiOwotCQl9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotICAgICAgICAgICAgcmV0dXJuIGxhYmVsUHJvdmlkZXJJbWFnZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCVN0cmluZ1tdIGFycmF5ID0gKFN0cmluZ1tdKSBlbGVtZW50OwotCQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQlyZXR1cm4gYXJyYXlbMF07Ci0JCQl9IGVsc2UgewotCQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQkKLQkvLyBFTkQgLSBQUk9WSURFUlMgRk9SIFRIRSBGSUVMRCBUQUJMRQkKLQotCS8qKgotCSAqIExpc3RlbmVyIGZvciB0aGUgUHJpbWFyeSBLZXkgY2hlY2sgYm94IGluIHRoZSB0YWJsZSBpdGVtCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQS0ZpZWxkQ2hlY2tTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSUNoZWNrU3RhdGVMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JICAgICAgICBUYWJsZUl0ZW1bXSBjaGlsZHJlbiA9IG1UYWJsZVZpZXdlci5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JICAgICAgICAgICAgVGFibGVJdGVtIGl0ZW0gPSBjaGlsZHJlbltpXTsKLQkgICAgICAgICAgICBFbnRpdHlSb3cgZW50aXR5Um93ID0gKEVudGl0eVJvdylpdGVtLmdldERhdGEoKTsgCi0JICAgICAgICAgICAgZW50aXR5Um93LnNldEtleShpdGVtLmdldENoZWNrZWQoKSk7Ci0JCQkJaWYgKGl0ZW0uZ2V0Q2hlY2tlZCgpKQotCQkJCQlwa0ZpZWxkcy5hZGQoZW50aXR5Um93LmdldE5hbWUoKSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBtb2RlbC5zZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QS19GSUVMRFMsIHBrRmllbGRzKTsKLQkJfQotCQkKLQl9Ci0JCi0JLy8gQ0FMTEJBQ0sgTUVDSEFOSVNNCi0JLyoqCi0JICogQ2FsbGJhY2sgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIEFkZC9FZGl0LUZpZWxkRGlhbG9nIGNsYXNzZXMuIAotCSAqLwotCXB1YmxpYyBpbnRlcmZhY2UgRGlhbG9nQ2FsbGJhY2sgewotCQkKLQkJLyoqCQotCQkgKiBWYWxpZGF0ZXMgdGhlIHRleHQgZmllbGRzLiAKLQkJICogPHA+VXNlZCB0byBkZWNpZGUgd2hldGhlciB0byBlbmFibGUgdGhlIE9LIGJ1dHRvbiBvZiB0aGUgZGlhbG9nLiAKLQkJICogSWYgdGhlIG1ldGhvZCByZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IHRoZSBPSyBidXR0b24gaXMgZW5hYmxlZCwgCi0JCSAqIG90aGVyd2lzZSB0aGUgT0sgYnV0dG9uIGlzIGRpc2FibGVkLjwvcD4gCi0JCSAqIEBwYXJhbSBjb21ibyBjb250YWlucyB0aGUgcHJlZGVmaW5lZCB0eXBlcwotCQkgKiBAcGFyYW0gdGV4dHMJdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAkKLQkJICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgdmFsdWVzIGluIHRoZSB0ZXh0IGZpZWxkcyBhcmUgCi0JCSAqICAgICAgICAgdmFsaWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCSAKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlKFRleHQgdHlwZSwgVGV4dFtdIHRleHRzKTsKLQkJCi0JCS8qKgotCQkgKiBSZXRyaWV2ZXMgdGhlIGVudGl0eSBwcmVzZW50YXRpb24gb2JqZWN0IGZyb20gdGhlIGZpZWxkcyBvZiB0aGUgZGlhbG9nLiAKLQkJICogPHA+SW1wbGVtZW50ZXJzIG9mIHRoZSBjYWxsYmFjayBjYW4gdXNlIHRoZXNlIG1ldGhvZCB0byBkbyBzb21lIAotCQkgKiBwcmVwcm9jZXNzaW5nIChsaWtlIHRyaW1taW5nKSBvZiB0aGUgZGF0YSBpbiB0aGUgdGV4dCBmaWVsZHMgYmVmb3JlIAotCQkgKiB1c2luZyBpdC4gVGhlIHJldHVybmVkIHZhbHVlcyB3aWxsIGJlIHRoZSBhY3R1YWwgZGF0YSB0aGF0IHdpbGwgYmUgCi0JCSAqIHB1dCBpbiB0aGUgdGFibGUgdmlld2VyLjwvcD4gCi0JCSAqIEBwYXJhbSBjb21ibyBjb250YWlucyB0aGUgcHJlZGVmaW5lZCB0eXBlcwotCQkgKiBAcGFyYW0gdGV4dHMJdGhlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAkKLQkJICogQHJldHVybiB0aGUgZW50aXR5IHByZXNlbnRhdGlvbiBvYmplY3QgcmV0cmlldmVkIGZyb20gdGhlIGRpYWxvZwotCQkgKi8KLQkJcHVibGljIEVudGl0eVJvdyByZXRyaWV2ZVJlc3VsdFN0cmluZ3MoVGV4dCB0eXBlLCBUZXh0W10gdGV4dHMpOwotCQkKLQl9Ci0JCi0JLyoqCi0JICogSW1wbGVtZW50YXRpb24gb2YgdGhlIDxjb2RlPkZpZWxkRGlhbG9nQ2FsbGJhY2s8L2NvZGU+IGludGVyZmFjZSBmb3IgCi0JICogYm90aCAiTmFtZSIgYW5kICJUeXBlcyIgdGFibGUgY29sdW1ucy4gCi0JICovCi0JcHVibGljIGNsYXNzIEZpZWxkRGlhbG9nQ2FsbGJhY2sgaW1wbGVtZW50cyBEaWFsb2dDYWxsYmFjayB7Ci0KLQkJLyoqCi0JCSAqIFRoZSBmaXJzdCB0ZXh0IGZpZWxkIHNob3VsZCBub3QgYmUgZW1wdHkuIAotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoVGV4dCB0eXBlLCBUZXh0W10gdGV4dHMpIHsKLQkJCWlmICh0ZXh0cy5sZW5ndGggPiAwKSB7Ci0JCQkJSVN0YXR1cyB2YWxpZGF0ZUZpZWxkTmFtZVN0YXR1cyA9IEphdmFDb252ZW50aW9ucwotCQkJCQkJLnZhbGlkYXRlRmllbGROYW1lKHRleHRzWzBdLmdldFRleHQoKSwKLQkJCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzUsCi0JCQkJCQkJCUphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJCQlpZiAoIXZhbGlkYXRlRmllbGROYW1lU3RhdHVzLmlzT0soKSkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGUuZ2V0VGV4dCgpLmVxdWFscygiIikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJLyoqCi0JCSAqIEp1c3QgcmV0cmlldmVzIHRoZSB1bm1vZGlmaWVkIHZhbHVlcyBvZiB0aGUgdGV4dCBmaWVsZHMgYXMgYSAKLQkJICogZW50aXR5IGZpZWxkIHByZXNlbnRhdGlvbgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5FbnRpdHlSb3cKLQkJICovCi0JCXB1YmxpYyBFbnRpdHlSb3cgcmV0cmlldmVSZXN1bHRTdHJpbmdzKFRleHQgdHlwZSwgVGV4dFtdIHRleHRzKSB7Ci0JCQlFbnRpdHlSb3cgZW50aXR5ID0gbmV3IEVudGl0eVJvdygpOwkJCQotCQkJZW50aXR5LnNldEZxblR5cGVOYW1lKHR5cGUuZ2V0VGV4dCgpKTsKLQkJCWVudGl0eS5zZXROYW1lKHRleHRzWzBdLmdldFRleHQoKSk7Ci0JCQlyZXR1cm4gZW50aXR5OwotCQl9Ci0JfQotCQotCS8vIFRIRSBESUFMT0dTIFVTRUQgRk9SIEFERC9FRElUIE9GIEVOVElUWSBGSUVMRFMgLSBCRUdJTgotCQotCS8qKgotCSAqIFRoZSBkaWFsb2cgd2hpY2ggY29sbGVjdCB0aGUgaW5mb3JtYXRpb24gKG5hbWUgYW5kIHR5cGUpIGZvciB0aGUgbmV3IGVudGl0eSBmaWVsZAotCSAqLwotCXByaXZhdGUgY2xhc3MgQWRkRmllbGREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgU3RyaW5nIHdpbmRvd1RpdGxlOwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gdHlwZVByb3Bvc2FsczsKLQkJcHJvdGVjdGVkIFN0cmluZ1tdIGxhYmVsc0ZvclRleHQ7Ci0JCXByb3RlY3RlZCBUZXh0W10gdGV4dHM7CQkKLQkJcHJvdGVjdGVkIEVudGl0eVJvdyBlbnRpdHlSb3c7Ci0JCXByb3RlY3RlZCBUZXh0IGF0dHJpYnV0ZVR5cGU7Ci0JCXByb3RlY3RlZCBDb250ZW50UHJvcG9zYWxBZGFwdGVyIGNvbnRlbnRQcm9wb3NhbEFkYXB0ZXI7IAkJCi0JCQotCQkvKioKLQkJICogQ29uc3RydWN0cyBBZGRGaWVsZERpYWxvZwotCQkgKiBAcGFyYW0gc2hlbGwKLQkJICogQHBhcmFtIHdpbmRvd1RpdGxlIGRpYWxvZyBsYWJlbAotCQkgKiBAcGFyYW0gdHlwZVByb3Bvc2FscyB0aGUgZWxlbWVudHMgZm9yIHRoZSBjb21ibwotCQkgKiBAcGFyYW0gbGFiZWxzRm9yVGV4dCBuYW1lIHRleHQKLQkJICovCi0JCXB1YmxpYyBBZGRGaWVsZERpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHdpbmRvd1RpdGxlLCBTdHJpbmdbXSB0eXBlUHJvcG9zYWxzLCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0KSB7Ci0JCQlzdXBlcihzaGVsbCk7Ci0JCQl0aGlzLndpbmRvd1RpdGxlID0gd2luZG93VGl0bGU7Ci0JCQl0aGlzLnR5cGVQcm9wb3NhbHMgPSB0eXBlUHJvcG9zYWxzOwotCQkJdGhpcy5sYWJlbHNGb3JUZXh0ICA9IGxhYmVsc0ZvclRleHQ7Ci0JCX0KLQkJCi0JCS8qIENyZWF0ZSB0aGUgYXJlYSBvZiBkaWFsb2cKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNjcmVhdGVEaWFsb2dBcmVhKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJCWdldFNoZWxsKCkuc2V0VGV4dCh3aW5kb3dUaXRsZSk7Ci0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWxheW91dC5udW1Db2x1bW5zID0gNDsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJCWRhdGEud2lkdGhIaW50ID0gMzAwOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkJbGFiZWwuc2V0VGV4dChsYWJlbHNGb3JUZXh0WzBdKTsKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKSk7Ci0JCQkKLQkJCQotCQkJYXR0cmlidXRlVHlwZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOy8vIHwgU1dULlJFQURfT05MWSk7CQkKLQkJCS8vY29tYm8uc2V0SXRlbXMobGFiZWxzRm9yQ29tYm8pOwotCQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CQkJCi0JCQlhdHRyaWJ1dGVUeXBlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQkKLQkJCUJ1dHRvbiBicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoRW50aXR5V2l6YXJkTXNnLkJST1dTRV9CVVRUT05fTEFCRUwpOwotCQkJR3JpZERhdGEgYnJvd3NlQnV0dG9uRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQkJYnJvd3NlQnV0dG9uRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShicm93c2VCdXR0b25EYXRhKTsKLQkJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQloYW5kbGVDaG9vc2VFbnRpdHlUeXBlQnV0dG9uUHJlc3NlZCgpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCS8vIERvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9KTsKLQotCQkJaW50IG4gPSBsYWJlbHNGb3JUZXh0Lmxlbmd0aDsKLQkJCXRleHRzID0gbmV3IFRleHRbbi0xXTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSB7Ci0JCQkJTGFiZWwgbGFiZWxJID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQkJCWxhYmVsSS5zZXRUZXh0KGxhYmVsc0ZvclRleHRbaV0pOwotCQkJCWxhYmVsSS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORykpOwotCQkJCXRleHRzW2ktMV0gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7CQkKLQkJCQl0ZXh0c1tpLTFdLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQl9Ci0KLQkJCWF0dHJpYnV0ZVR5cGUuc2V0Rm9jdXMoKTsKLQkJCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJCWNyZWF0ZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCk7CQkJCi0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0JCQotCQlwcml2YXRlIElDb250ZW50UHJvcG9zYWxQcm92aWRlciBjcmVhdGVDb250ZW50UHJvcG9zYWxQcm92aWRlcigpIHsKLQkJCVNpbXBsZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyIGNvbnRQcm92aWRlciA9IG5ldyBTaW1wbGVDb250ZW50UHJvcG9zYWxQcm92aWRlcih0eXBlUHJvcG9zYWxzKTsKLQkJCWNvbnRQcm92aWRlci5zZXRGaWx0ZXJpbmcodHJ1ZSk7Ci0JCQkKLQkJCWNvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgPSBuZXcgQ29udGVudFByb3Bvc2FsQWRhcHRlcigKLQkJCQkJYXR0cmlidXRlVHlwZSwKLQkJCQkJbmV3IFRleHRDb250ZW50QWRhcHRlcigpLCAKLQkJCQkJY29udFByb3ZpZGVyLAotCQkJCQlrcywKLQkJCQkJbmV3IGNoYXJbXSB7J2InLCAnYycsICdkJywgJ2knLCAnZicsICdsJywgJ3MnLCAnaicsICdCJywgJ0MnLCAnRCcsICdGJywgJ1MnLCAnTCcsICdJJ30pOwotCQkJY29udGVudFByb3Bvc2FsQWRhcHRlci5zZXRFbmFibGVkKHRydWUpOwotCQkJY29udGVudFByb3Bvc2FsQWRhcHRlci5zZXRQcm9wb3NhbEFjY2VwdGFuY2VTdHlsZShDb250ZW50UHJvcG9zYWxBZGFwdGVyLlBST1BPU0FMX1JFUExBQ0UpOwotCQkJcmV0dXJuIGNvbnRQcm92aWRlcjsKLQkJfQotCQkKLQotCQkvKioKLQkJICogUHJvY2VzcyBicm93c2luZyB3aGVuIHRoZSBCcm93c2UuLi4gYnV0dG9uIGhhdmUgYmVlbiBwcmVzc2VkLiBBbGxvdyBhZGRpbmcgb2YgZW50aXR5IGZpZWxkCi0JCSAqIHdpdGggYXJiaXRyYXJ5IHR5cGUuCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgaGFuZGxlQ2hvb3NlRW50aXR5VHlwZUJ1dHRvblByZXNzZWQoKSB7Ci0JCQkvL2dldENvbnRyb2woKS5zZXRDdXJzb3IobmV3IEN1cnNvcihnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9XQUlUKSk7Ci0JCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrUm9vdCA9IChJUGFja2FnZUZyYWdtZW50Um9vdCkgbW9kZWwuZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFX0ZSQUdNRU5UX1JPT1QpOwotCQkJaWYgKHBhY2tSb290ID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCS8vIHRoaXMgZWxpbWluYXRlcyB0aGUgbm9uLWV4cG9ydGVkIGNsYXNzcGF0aCBlbnRyaWVzCi0JCQlmaW5hbCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlID0gVHlwZVNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGVGb3JBUHJvamVjdChwYWNrUm9vdC5nZXRKYXZhUHJvamVjdCgpLCB0cnVlLCB0cnVlKTsgCi0JCQkKLQkJCS8vIFRoaXMgaW5jbHVkZXMgYWxsIGVudHJpZXMgb24gdGhlIGNsYXNzcGF0aC4KLQkJCVNlbGVjdGlvbkRpYWxvZyBkaWFsb2c9bnVsbDsKLQkJCXRyeXsKLQkJCQlkaWFsb2cgPSBKYXZhVUkKLQkJCQkJCS5jcmVhdGVUeXBlRGlhbG9nKAotCQkJCQkJCQlnZXRTaGVsbCgpLAotCQkJCQkJCQludWxsLAotCQkJCQkJCQlzY29wZSwKLQkJCQkJCQkJSUphdmFFbGVtZW50U2VhcmNoQ29uc3RhbnRzLkNPTlNJREVSX0FMTF9UWVBFUywKLQkJCQkJCQkJZmFsc2UpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5pbnN0YW5jZSgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkKLQkJCWRpYWxvZy5zZXRUaXRsZShFbnRpdHlXaXphcmRNc2cuVFlQRV9ESUFMT0dfVElUTEUpOwotCQkJZGlhbG9nLnNldE1lc3NhZ2UoRW50aXR5V2l6YXJkTXNnLlRZUEVfRElBTE9HX0RFU0NSSVBUSU9OKTsKLQotCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJSVR5cGUgdHlwZTsKLQkJCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCkgewotCQkgICAgICAgIAl0eXBlID0gbnVsbDsKLQkJCQl9Ci0JCSAgICAgICAgZWxzZSB0eXBlID0gKElUeXBlKSByZXN1bHRbMF07Ci0JCQkJU3RyaW5nIHN1cGVyY2xhc3NGdWxsUGF0aCA9IElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORzsKLQkJCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQkJCXN1cGVyY2xhc3NGdWxsUGF0aCA9IHR5cGUuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCQkJfQotCQkJCWF0dHJpYnV0ZVR5cGUuc2V0VGV4dChzdXBlcmNsYXNzRnVsbFBhdGgpOwotCQkJCS8vZ2V0Q29udHJvbCgpLnNldEN1cnNvcihudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvL2dldENvbnRyb2woKS5zZXRDdXJzb3IobnVsbCk7Ci0JCX0KLQkJCi0JCQotCQkvKiBDcmVhdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGRpYWxvZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJCQotCQkJYXR0cmlidXRlVHlwZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJCWF0dHJpYnV0ZVR5cGUuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGV4dHNbaV0uYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCQkKLQkJCXVwZGF0ZU9LQnV0dG9uKCk7Ci0JCQkKLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQkvKiBQcm9jZXNzZXMgT0sgYnV0dG9uIHByZXNzZWQgZXZlbnQuCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjb2tQcmVzc2VkKCkKLQkJICovCi0JCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCQllbnRpdHlSb3cgPSBjYWxsYmFjay5yZXRyaWV2ZVJlc3VsdFN0cmluZ3MoYXR0cmlidXRlVHlwZSwgdGV4dHMpOwotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgZW50aXR5IHJlcHJlc2VudGF0aW9uIHdpdGggdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIHRoZSBkaWFsb2cKLQkJICovCi0JCXB1YmxpYyBFbnRpdHlSb3cgZ2V0RW50aXR5Um93KCkgewotCQkJcmV0dXJuIGVudGl0eVJvdzsKLQkJfQotCQkKLQkJLyogUHJvY2Vzc2VzIHRleHQgbW9kaWZ5aW5nIGV2ZW50Ci0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lciNtb2RpZnlUZXh0KG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCXVwZGF0ZU9LQnV0dG9uKCk7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBTZXRzIHN0YXRlIG9mIHRoZSBPSyBidXR0b24gaW4gYWNjb3JkYW5jZSB3aXRoIHZhbGlkYXRlIG1ldGhvZCBvZiB0aGUgY2FsbGJhY2sgb2JqZWN0Ci0JCSAqIEBzZWUgRGlhbG9nQ2FsbGJhY2sKLQkJICovCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVPS0J1dHRvbigpIHsKLQkJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKGNhbGxiYWNrLnZhbGlkYXRlKGF0dHJpYnV0ZVR5cGUsIHRleHRzKSk7Ci0JCX0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQkJCi0JCX0KLQkJLyogVXBkYXRlIE9LIGJ1dHRvbiB3aGVuIHRoZSBhcHByb3ByaWF0ZSBldmVudCBvY2N1cnMKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl1cGRhdGVPS0J1dHRvbigpOwkJCQotCQl9Ci0JfQotCQotCS8qKgotCSAqIENvbnN0cnVjdHMgRWRpdEZpZWxkRGlhbG9nCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBFZGl0RmllbGREaWFsb2cgZXh0ZW5kcyBBZGRGaWVsZERpYWxvZyB7Ci0JCXByb3RlY3RlZCBFbnRpdHlSb3cgZW50aXR5Um93OwotCQkvKioKLQkJICogRWRpdEZpZWxkRGlhbG9nIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgRWRpdEZpZWxkRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgd2luZG93VGl0bGUsIFN0cmluZ1tdIGxhYmVsc0ZvckNvbWJvLCBTdHJpbmdbXSBsYWJlbHNGb3JUZXh0LCBFbnRpdHlSb3cgZW50aXR5KSB7Ci0JCQlzdXBlcihzaGVsbCwgd2luZG93VGl0bGUsIGxhYmVsc0ZvckNvbWJvLCBsYWJlbHNGb3JUZXh0KTsKLQkJCXRoaXMuZW50aXR5Um93ID0gZW50aXR5OwkJCi0JCX0KLQotCQkvKiBDcmVhdGUgdGhlIGFyZWEgb2YgdGhlIGRpYWxvZwotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuRW50aXR5Um93VGFibGVXaXphcmRTZWN0aW9uLkFkZEZpZWxkRGlhbG9nI2NyZWF0ZURpYWxvZ0FyZWEob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCQkgKi8KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCi0JCQlhdHRyaWJ1dGVUeXBlLnNldFRleHQoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpOwotCQkJdGV4dHNbMF0uc2V0VGV4dChlbnRpdHlSb3cuZ2V0TmFtZSgpKTsKLQkJCQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCX0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5VGVtcGxhdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5VGVtcGxhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmNjg1My4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlUZW1wbGF0ZQotewotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBubDsKLSAgcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRW50aXR5VGVtcGxhdGUgY3JlYXRlKFN0cmluZyBsaW5lU2VwYXJhdG9yKQotICB7Ci0gICAgbmwgPSBsaW5lU2VwYXJhdG9yOwotICAgIEVudGl0eVRlbXBsYXRlIHJlc3VsdCA9IG5ldyBFbnRpdHlUZW1wbGF0ZSgpOwotICAgIG5sID0gbnVsbDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGZpbmFsIFN0cmluZyBOTCA9IG5sID09IG51bGwgPyAoU3lzdGVtLmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSkgOiBubDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEgPSAicGFja2FnZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMiA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzMgPSBOTDsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQgPSBOTCArICJpbXBvcnQgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82ID0gTkwgKyBOTCArICIvKioiICsgTkwgKyAiICogRW50aXR5IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRpdHk6ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83ID0gTkwgKyAiICoiICsgTkwgKyAiICovIiArIE5MICsgInB1YmxpYyBjbGFzcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOCA9ICIgZXh0ZW5kcyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfOSA9ICIgaW1wbGVtZW50cyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTAgPSAiLCAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTEgPSAiIHsiICsgTkwgKyAiIiArIE5MICsgIlx0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzEyID0gIiAiICsgTkwgKyAiXHRwcml2YXRlICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMyA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE0ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTUgPSBOTCArICJcdHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMO1x0IiArIE5MICsgIlx0cHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICIoKSB7IiArIE5MICsgIlx0XHRzdXBlcigpOyIgKyBOTCArICJcdH0gIiArIE5MICsgIlx0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE3ID0gIiAgICIgKyBOTCArICJcdHB1YmxpYyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTggPSAiIGdldCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOSA9ICIoKSB7IiArIE5MICsgIiBcdFx0cmV0dXJuIHRoaXMuIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIwID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIiIgKyBOTCArICJcdHB1YmxpYyB2b2lkIHNldCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMSA9ICIoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIyID0gIiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjMgPSAiKSB7IiArIE5MICsgIlx0XHR0aGlzLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNCA9ICIgPSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjUgPSAiOyIgKyBOTCArICJcdH0iICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjYgPSBOTCArICIgICAiICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yNyA9IE5MOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQotICB7Ci0gICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCi1pZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMik7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChhbkltcG9ydCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUpOwotICAgICB9IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEVudGl0eU5hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIFN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLQlpZiAoISAiIi5lcXVhbHMoc3VwZXJDbGFzcykpIHsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfOCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChzdXBlckNsYXNzKTsKLSAgICB9Ci0gICAgCi0JTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotCWlmIChpbnRlcmZhY2VzLnNpemUoKT4wKSB7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzkpOwotICAgICB9Ci0JZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotCQlpZiAoaT4wKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMCk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzExKTsKLSAgICAgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOyAKLQlmb3IgKEVudGl0eVJvdyBlbnRpdHkgOiBmaWVsZHMpIHsgICAgIAotCQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0VHlwZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTMpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoZW50aXR5LmdldE5hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE0KTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldENsYXNzTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTYpOwotICAgIAotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKLQkKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVFlQRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE4KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE5KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChNRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNyk7Ci0gICAgcmV0dXJuIHN0cmluZ0J1ZmZlci50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9FbnRpdHlXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYzMDI1Mi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlJY29uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVFZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5kYXRhbW9kZWwudWkuRGF0YU1vZGVsV2l6YXJkOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5V2l6YXJkCi0JCWV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkCi0JCWltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBpbml0aWFsUHJvamVjdE5hbWU7Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbjsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgdGhlIEVudGl0eSB3aXphcmQKLSAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIGRhdGEgbW9kZWwKLSAgICAgKi8KLSAgICBwdWJsaWMgRW50aXR5V2l6YXJkKElEYXRhTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotICAgICAgICBzZXRXaW5kb3dUaXRsZShFbnRpdHlXaXphcmRNc2cuRU5USVRZX1dJWkFSRF9USVRMRSk7Ci0gICAgICAgIHNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEpwdEpwYVVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRVaUljb25zLkVOVElUWV9XSVpfQkFOTkVSKSk7ICAgICAgICAKLQl9ICAgIAotIAotCS8qKgotCSAqIEVtcHR5IGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEVudGl0eVdpemFyZCgpewotICAgIAl0aGlzKG51bGwpOwotICAgIH0KLQkKLQkvKiBBZGRzIHRoZSB0d28gcGFnZXMgb2YgdGhlIGVudGl0eSB3aXphcmQgCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNkb0FkZFBhZ2VzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkb0FkZFBhZ2VzKCkgewotCQlFbnRpdHlDbGFzc1dpemFyZFBhZ2UgcGFnZTEgPSBuZXcgRW50aXR5Q2xhc3NXaXphcmRQYWdlKAotCQkgICAgICAgIGdldERhdGFNb2RlbCgpLAotCQkgICAgICAgICJwYWdlT25lIiwKLQkJICAgICAgICBFbnRpdHlXaXphcmRNc2cuRU5USVRZX1dJWkFSRF9QQUdFX0RFU0NSSVBUSU9OLAotCQkgICAgICAgIEVudGl0eVdpemFyZE1zZy5FTlRJVFlfV0laQVJEX1BBR0VfVElUTEUpOwotCQlwYWdlMS5zZXRQcm9qZWN0TmFtZSh0aGlzLmluaXRpYWxQcm9qZWN0TmFtZSk7Ci0JCWFkZFBhZ2UocGFnZTEpOwotCQlFbnRpdHlGaWVsZHNXaXphcmRQYWdlIHBhZ2UyID0gbmV3IEVudGl0eUZpZWxkc1dpemFyZFBhZ2UoZ2V0RGF0YU1vZGVsKCksICJwYWdlVHdvIik7Ci0JCWFkZFBhZ2UocGFnZTIpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCXJldHVybiB0aGlzLnNlbGVjdGlvbjsKLQl9Ci0KLQkvKiBSZXR1cm4gdGhlIGRlZmF1bHQgZGF0YSBtb2RlbCBwcm92aWRlciAoRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIgaW4gb3VyIGNhc2UpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNnZXREZWZhdWx0UHJvdmlkZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsUHJvdmlkZXIgZ2V0RGVmYXVsdFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEVudGl0eURhdGFNb2RlbFByb3ZpZGVyKCk7Ci0JfQotCi0JLyogQ2hlY2sgd2hldGhlciB0aGUgbWFuZGF0b3J5IGluZm9ybWF0aW9uIGlzIHNldCBhbmQgd2l6YXJkIGNvdWxkIGZpbmlzaAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxXaXphcmQjY2FuRmluaXNoKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GaW5pc2goKSB7Ci0JCSByZXR1cm4gZ2V0RGF0YU1vZGVsKCkuaXNWYWxpZCgpOwotCX0KLQkKLQkvKiAKLQkgKiBPdmVycmlkZSB0aGUgcGFyZW50IG1ldGhvZCBpbiBvcmRlciB0byBvcGVuIHRoZSBnZW5lcmF0ZWQgZW50aXR5IGNsYXNzIGluIGphdmEgZWRpdG9yCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZCNwb3N0UGVyZm9ybUZpbmlzaCgpCi0JICovCi0JQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9zdFBlcmZvcm1GaW5pc2goKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7ICAgICAgCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gZ2V0RGF0YU1vZGVsKCkuZ2V0U3RyaW5nUHJvcGVydHkoUVVBTElGSUVEX0NMQVNTX05BTUUpOwotICAgICAgICAgICAgSVByb2plY3QgcCA9IChJUHJvamVjdCkgZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoUFJPSkVDVCk7Ci0gICAgICAgICAgICBJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKMkVFRWRpdG9yVXRpbGl0eS5nZXRKYXZhUHJvamVjdChwKTsKLSAgICAgICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGphdmFQcm9qZWN0LmZpbmRUeXBlKGNsYXNzTmFtZSkuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIG9wZW5FZGl0b3IoZmlsZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBjYW50T3BlbikgewotICAgICAgICAJSnB0SnBhVWlQbHVnaW4ubG9nKGNhbnRPcGVuKTsKLSAgICAgICAgfSAKLSAgICB9Ci0JCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIG9wZW4gdGhlIGZpbGUsIHNlbnQgYXMgcGFyYW1ldGVyCi0gICAgICogaW4gaXRzIG93biBqYXZhIGVkaXRvcgotICAgICAqIEBwYXJhbSBmaWxlIHdobyBzaG91bGQgYmUgb3BlbmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotICAgIAlpZiAoZ2V0RGF0YU1vZGVsKCkuZ2V0Qm9vbGVhblByb3BlcnR5KE9QRU5fSU5fRURJVE9SKSkgewotICAgIAkJaWYgKGZpbGUgIT0gbnVsbCkgewotICAgIAkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0gICAgCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAJCQkJCXRyeSB7Ci0gICAgCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotICAgIAkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotICAgIAkJCQkJfQotICAgIAkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLSAgICAJCQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAJCQl9KTsKLSAgICAJCX0KLSAgICAJfQotICAgIH0KLSAgICAKLSAgICAvKiBJbXBsZW1lbnQgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIElXb3JrYmVuY2hXaXphcmQKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaXphcmQjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoLCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgICAJdGhpcy5pbml0aWFsUHJvamVjdE5hbWUgPSBleHRyYWN0UHJvamVjdE5hbWUoc2VsZWN0aW9uKTsKLQkJZ2V0RGF0YU1vZGVsKCk7Ci0JfQotICAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZXh0cmFjdFByb2plY3ROYW1lKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgIAlPYmplY3Qgc2VsZWN0ZWRPYmogPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChzZWxlY3RlZE9iaiBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmV0dXJuICgoSVJlc291cmNlKSBzZWxlY3RlZE9iaikuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRPYmogaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQpIHsKLQkJCXJldHVybiAoKElKYXZhRWxlbWVudCkgc2VsZWN0ZWRPYmopLmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoc2VsZWN0ZWRPYmogaW5zdGFuY2VvZiBKcGFDb250ZXh0Tm9kZSkgewotCQkJcmV0dXJuICgoSnBhQ29udGV4dE5vZGUpIHNlbGVjdGVkT2JqKS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJfQotCQkKLQkJaWYgKHNlbGVjdGVkT2JqIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBzZWxlY3RlZE9iaikuZ2V0QWRhcHRlcihJUmVzb3VyY2UuY2xhc3MpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmVzb3VyY2UuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJCUlKYXZhRWxlbWVudCBqYXZhRWxlbWVudCA9IChJSmF2YUVsZW1lbnQpICgoSUFkYXB0YWJsZSkgc2VsZWN0ZWRPYmopLmdldEFkYXB0ZXIoSUphdmFFbGVtZW50LmNsYXNzKTsKLQkJCWlmIChqYXZhRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGphdmFFbGVtZW50LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldE5hbWUoKTsKLQkJCX0KLQkJCUpwYUNvbnRleHROb2RlIG5vZGUgPSAoSnBhQ29udGV4dE5vZGUpICgoSUFkYXB0YWJsZSkgc2VsZWN0ZWRPYmopLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0VudGl0eVdpemFyZE1zZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWFjZGExLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvRW50aXR5V2l6YXJkTXNnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlXaXphcmRNc2cgZXh0ZW5kcyBOTFMgewkKLQkKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX2VudGl0eV93aXphcmQiOy8vJE5PTi1OTFMtMSQKLSAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9XSVpBUkRfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1dJWkFSRF9QQUdFX1RJVExFOyAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfV0laQVJEX1BBR0VfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVGQVVMVF9QQUNLQUdFX1dBUk5JTkc7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1BST1BFUlRJRVNfVElUTEU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZX1BST1BFUlRJRVNfREVTQ1JJUFRJT047Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRU5USVRZOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBFRF9BU19TVVBFUkNMQVNTOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSEVSSVRBTkNFX0dST1VQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIElOSEVSSVRBTkNFX0NIRUNLX0JPWDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU1RPUkFHRV9HUk9VUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfU1VQUE9SVDsgICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ0hPT1NFX1hNTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBNQVBQSU5HX1hNTF9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxfTkFNRV9USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBJTlZBTElEX1hNTF9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIE1BUFBJTkdfRklMRV9OT1RfTElTVEVEX0VSUk9SOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENIT09TRV9NQVBQSU5HX1hNTF9NRVNTQUdFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfRElBTE9HX1RJVExFOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRZUEVfRElBTE9HX0RFU0NSSVBUSU9OOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEVOVElUWV9OQU1FOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRBQkxFX05BTUU7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVEFCTEVfTkFNRV9HUk9VUDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBVU0VfREVGQVVMVDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfRklFTERTX0RJQUxPR19USVRMRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFTlRJVFlfRklFTERTX0dST1VQOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEtFWTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FX0NPTFVNTjsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBUWVBFX0NPTFVNTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOQU1FX1RFWFRfRklFTEQ7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFlQRV9URVhUX0ZJRUxEOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEJST1dTRV9CVVRUT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX0JVVFRPTl9MQUJFTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBFRElUX0JVVFRPTl9MQUJFTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0eURhdGFNb2RlbFByb3ZpZGVyX2ludmFsaWRQS1R5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfaW52YWxpZEFyZ3VtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CVVRUT05fTEFCRUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRFVQTElDQVRFRF9FTlRJVFlfTkFNRVNfTUVTU0FHRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBQ0NFU1NfVFlQRTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBGSUVMRF9CQVNFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9CQVNFRDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBOT19KUEFfUFJPSkVDVFM7ICAgICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQVBQTFlfQ0hBTkdFU19UT19QRVJTSVNURU5DRV9YTUw7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQUREX01BUFBFRF9TVVBFUkNMQVNTX1RPX1hNTDsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBBRERfRU5USVRZX1RPX1hNTDsKLSAgICBwcml2YXRlIEVudGl0eVdpemFyZE1zZygpIHsKLSAgICAgICAgLy8gcHJldmVudCBpbnN0YW50aWF0aW9uIG9mIGNsYXNzCi0gICAgfSAgICAKLSAgICAKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBFbnRpdHlXaXphcmRNc2cuY2xhc3MpOwotCX0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHJlc291cmNlIGJ1bmRsZSB1c2VkIGJ5IGFsbCBjbGFzc2VzIGluIHRoaXMgUHJvamVjdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsvLyROT04tTkxTLTEkCi0gICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBkb2VzIG5vdGhpbmcgLSB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBudWxsIGFuZCBnZXRTdHJpbmcoU3RyaW5nKSB3aWxsIHJldHVybiAKLSAgICAgICAgCS8vIHRoZSBrZXkgaXQgd2FzIGNhbGxlZCB3aXRoCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZXh0ZXJuYWxpemVkIHN0cmluZywgbWFwcGVkIHRvIHRoaXMga2V5Ci0gICAgICogQHBhcmFtIGtleSAKLSAgICAgKiBAcmV0dXJuIHRoZSB0ZXh0IG1hcHBlZCB0byB0aGUga2V5IHBhcmFtZXRlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChyZXNvdXJjZUJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXNvdXJjZUJ1bmRsZSA9IGdldFJlc291cmNlQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VCdW5kbGUuZ2V0U3RyaW5nKGtleSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgCS8vZXhjZXB0aW9uIGR1cmluZyBzdHJpbmcgb2J0YWluaW5nCi0gICAgICAgICAgICAgICAgcmV0dXJuICItIiArIGtleSArICItIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vcmV0dXJuIGtleSwgYmVjYXVzZSB0aGUgcmVsZXZhbnQgc3RyaW5nIG1pc3NpbmcgaW4gdGhlIGJ1bmRsZQotICAgICAgICByZXR1cm4gIisiICsga2V5ICsgIisiOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZm9ybWF0ZWQgc3RyaW5nLCBtYXBwZWQgdG8gdGhpcyBrZXkKLSAgICAgKiBAcGFyYW0ga2V5Ci0gICAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgICAqIEByZXR1cm4gdGhlIGZvcm1hdGVkIHRleHQsIG1hcHBlZCB0byB0aGlzIGtleSwgd2l0aCBzdWJzdGl0dXRlZCBhcmd1bWVudHMgCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U3RyaW5nKFN0cmluZyBrZXksIE9iamVjdFtdIGFyZ3VtZW50cykgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBhcmd1bWVudHMpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGdldFN0cmluZyhrZXkpOwotICAgICAgICB9Ci0gICAgfSAKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvSWRDbGFzc1RlbXBsYXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L0lkQ2xhc3NUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzVmMWIyLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvSWRDbGFzc1RlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBJZENsYXNzVGVtcGxhdGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbmw7Ci0gIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIElkQ2xhc3NUZW1wbGF0ZSBjcmVhdGUoU3RyaW5nIGxpbmVTZXBhcmF0b3IpCi0gIHsKLSAgICBubCA9IGxpbmVTZXBhcmF0b3I7Ci0gICAgSWRDbGFzc1RlbXBsYXRlIHJlc3VsdCA9IG5ldyBJZENsYXNzVGVtcGxhdGUoKTsKLSAgICBubCA9IG51bGw7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgTkwgPSBubCA9PSBudWxsID8gKFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIikpIDogbmw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xID0gInBhY2thZ2UgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIgPSAiOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zID0gTkw7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80ID0gTkwgKyAiaW1wb3J0ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81ID0gIjsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNiA9IE5MICsgTkwgKyAiLyoqIiArIE5MICsgIiAqIElEIGNsYXNzIGZvciBlbnRpdHk6ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF83ID0gTkwgKyAiICoiICsgTkwgKyAiICovICIgKyBOTCArICJwdWJsaWMgY2xhc3MgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzggPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF85ID0gIiBpbXBsZW1lbnRzICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMCA9ICIsICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xMSA9ICIgeyAgICIgKyBOTCArICIgICAiICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTIgPSAiICAgICAgICAgIiArIE5MICsgIlx0cHJpdmF0ZSAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTMgPSAiICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNCA9ICI7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE1ID0gTkwgKyAiXHRwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsiICsgTkwgKyAiIiArIE5MICsgIlx0cHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xNiA9ICIoKSB7fSIgKyBOTCArICIiICsgTkwgKyAiXHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMTcgPSBOTCArIE5MICsgIlx0cHVibGljICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8xOCA9ICIgZ2V0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzE5ID0gIigpIHsiICsgTkwgKyAiXHRcdHJldHVybiB0aGlzLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMCA9ICI7IiArIE5MICsgIlx0fSIgKyBOTCArICIiICsgTkwgKyAiXHRwdWJsaWMgdm9pZCBzZXQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjEgPSAiKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yMiA9ICIgIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzIzID0gIikgeyIgKyBOTCArICJcdFx0dGhpcy4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjQgPSAiID0gIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI1ID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIlx0IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzI2ID0gTkwgKyAiICAgIiArIE5MICsgIlx0LyoiICsgTkwgKyAiXHQgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKE9iamVjdCkiICsgTkwgKyAiXHQgKi9cdCIgKyBOTCArICJcdHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeyIgKyBOTCArICJcdFx0aWYgKG8gPT0gdGhpcykgeyIgKyBOTCArICJcdFx0XHRyZXR1cm4gdHJ1ZTsiICsgTkwgKyAiXHRcdH0iICsgTkwgKyAiXHRcdGlmICghKG8gaW5zdGFuY2VvZiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjcgPSAiKSkgeyIgKyBOTCArICJcdFx0XHRyZXR1cm4gZmFsc2U7IiArIE5MICsgIlx0XHR9IiArIE5MICsgIlx0XHQiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMjggPSAiIG90aGVyID0gKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8yOSA9ICIpIG87IiArIE5MICsgIlx0XHRyZXR1cm4gdHJ1ZSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMCA9IE5MICsgIlx0XHRcdCYmICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zMSA9ICIoKSA9PSBvdGhlci4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzIgPSAiKCkiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzMgPSBOTCArICJcdFx0XHQmJiAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM0ID0gIigpKSA9PSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhvdGhlci4iOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzUgPSAiKCkpKSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zNiA9IE5MICsgIlx0XHRcdCYmIChGbG9hdC5mbG9hdFRvSW50Qml0cygiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfMzcgPSAiKCkpID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF8zOCA9ICIoKSkpIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzM5ID0gTkwgKyAiXHRcdFx0JiYgKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MCA9ICIoKSA9PSBudWxsID8gb3RoZXIuIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQxID0gIigpID09IG51bGwgOiAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDIgPSAiKCkuZXF1YWxzKG90aGVyLiI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80MyA9ICIoKSkpIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ0ID0gIjsiICsgTkwgKyAiXHR9IiArIE5MICsgIlx0IiArIE5MICsgIlx0LypcdCAiICsgTkwgKyAiXHQgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKSIgKyBOTCArICJcdCAqL1x0IiArIE5MICsgIlx0cHVibGljIGludCBoYXNoQ29kZSgpIHsiICsgTkwgKyAiXHRcdGZpbmFsIGludCBwcmltZSA9IDMxOyIgKyBOTCArICJcdFx0aW50IHJlc3VsdCA9IDE7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ1ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF80NiA9ICIoKSA/IDEgOiAwKTsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDcgPSBOTCArICJcdFx0cmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNDggPSAiKCk7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzQ5ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81MCA9ICIoKSk7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUxID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpICgiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTIgPSAiKCkgXiAoIjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzUzID0gIigpID4+PiAzMikpKTsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNTQgPSBOTCArICJcdFx0cmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGludCkgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NSA9ICIoKSApIF4gKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NiA9ICIoKSkgPj4+IDMyKSkpOyI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81NyA9IE5MICsgIlx0XHRyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF81OCA9ICIoKSk7IjsKLSAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBURVhUXzU5ID0gTkwgKyAiXHRcdHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MCA9ICIoKSA9PSBudWxsID8gMCA6ICI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MSA9ICIoKS5oYXNoQ29kZSgpKTsiOwotICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRFWFRfNjIgPSBOTCArICJcdFx0cmV0dXJuIHJlc3VsdDsiICsgTkwgKyAiXHR9IiArIE5MICsgIiAgICIgKyBOTCArICIgICAiICsgTkwgKyAifSI7Ci0gIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgVEVYVF82MyA9IE5MOwotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGUoT2JqZWN0IGFyZ3VtZW50KQotICB7Ci0gICAgZmluYWwgU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCi1pZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMik7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zKTsKLSAgICAgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKHRydWUpOwotZm9yIChTdHJpbmcgYW5JbXBvcnQgOiBpbXBvcnRzKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGFuSW1wb3J0KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNSk7Ci0gICAgIH0gCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0Q2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF83KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF84KTsKLSAgICAgTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBtb2RlbC5nZXRJbnRlcmZhY2VzKCk7IAotCWlmIChpbnRlcmZhY2VzLnNpemUoKT4wKSB7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzkpOwotICAgICB9Ci0JZm9yIChpbnQgaT0wOyBpPGludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKLQkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotCQlpZiAoaT4wKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMCk7Ci0gICAgfQotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoSU5URVJGQUNFKTsKLSAgICB9Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzExKTsKLSAgICAgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IG1vZGVsLmdldFBLRmllbGRzKCk7IAotCWZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGVudGl0eSA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JCWlmICghcGtGaWVsZHMuY29udGFpbnMoZW50aXR5LmdldE5hbWUoKSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzEyKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKGVudGl0eS5nZXRUeXBlKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8xMyk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChlbnRpdHkuZ2V0TmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTQpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE2KTsKLSAgICAKLQlmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKLQlpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKLQkJU3RyaW5nIFRZUEUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0JCVN0cmluZyBOQU1FID0gZmllbGQuZ2V0TmFtZSgpOwotCQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0JCQljb250aW51ZTsKLQkJfSAJCQotCQlTdHJpbmcgTUVUSE9EID0gTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7ICAgICAgICAKLQkKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMTcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVFlQRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE4KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE1FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzE5KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChNRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChUWVBFKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoTkFNRSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzIzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKE5BTUUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChOQU1FKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjUpOwotICAgIH0KLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQobW9kZWwuZ2V0SWRDbGFzc05hbWUoKSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzI3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKG1vZGVsLmdldElkQ2xhc3NOYW1lKCkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8yOCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChtb2RlbC5nZXRJZENsYXNzTmFtZSgpKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMjkpOwotICAgICBpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOyAKLQlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKLQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0gICAgICAgCWNvbnRpbnVlOwotICAgIH0KLSAgICAgCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOyAKLQlTdHJpbmcgR0VUX01FVEhPRCA9ICJnZXQiICsgTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7IAotICAgIAlpZiAoVFlQRS5lcXVhbHMoImJvb2xlYW4iKSB8fCBUWVBFLmVxdWFscygiYnl0ZSIpIHx8IFRZUEUuZXF1YWxzKCJjaGFyIikgfHwgVFlQRS5lcXVhbHMoInNob3J0IikgfHwgVFlQRS5lcXVhbHMoImludCIpIHx8IFRZUEUuZXF1YWxzKCJsb25nIikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zMSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzIpOwotICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZG91YmxlIikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzMzKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zNCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzUpOwotICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZmxvYXQiKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzYpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzM3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF8zOCk7Ci0gICAgIAl9IGVsc2UgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfMzkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80MSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQzKTsKLSAgICAgCX0gCi0gICAgIH0gCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ0KTsKLSAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSBmb3IgKGludCBpPTA7IGk8ZmllbGRzLnNpemUoKTsgaSsrKSB7IAotCUVudGl0eVJvdyBmaWVsZCA9IChFbnRpdHlSb3cpIGZpZWxkcy5nZXQoaSk7Ci0JU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JaWYgKCFwa0ZpZWxkcy5jb250YWlucyhOQU1FKSkgewotICAgICAgIAljb250aW51ZTsKLSAgICB9Ci0gICAgIAlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsgCi0JU3RyaW5nIEdFVF9NRVRIT0QgPSAiZ2V0IiArIE5BTUUuc3Vic3RyaW5nKDAsMSkudG9VcHBlckNhc2UoKSArIE5BTUUuc3Vic3RyaW5nKDEpOyAKLSAgICAJaWYgKFRZUEUuZXF1YWxzKCJib29sZWFuIikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ1KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80Nik7Ci0gICAgIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJpbnQiKSkgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNDcpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzQ4KTsKLSAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImJ5dGUiKSB8fCBUWVBFLmVxdWFscygiY2hhciIpIHx8IFRZUEUuZXF1YWxzKCJzaG9ydCIpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF80OSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTApOwotICAgICAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygibG9uZyIpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81MSk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTIpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzUzKTsKLSAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImRvdWJsZSIpKSB7IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81NCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChHRVRfTUVUSE9EKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTUpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU2KTsKLSAgICAgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImZsb2F0IikpIHsgCi0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzU3KTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF81OCk7Ci0gICAgIAl9IGVsc2UgeyAKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKFRFWFRfNTkpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoR0VUX01FVEhPRCk7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYwKTsKLSAgICBzdHJpbmdCdWZmZXIuYXBwZW5kKEdFVF9NRVRIT0QpOwotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82MSk7Ci0gICAgIAl9IAotICAgICB9IAotICAgIHN0cmluZ0J1ZmZlci5hcHBlbmQoVEVYVF82Mik7Ci0gICAgc3RyaW5nQnVmZmVyLmFwcGVuZChURVhUXzYzKTsKLSAgICByZXR1cm4gc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzU1ZTk0Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmplbS51dGlsLmVtZi53b3JrYmVuY2guUHJvamVjdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LkoyRUVQcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uSUFydGlmYWN0RWRpdE9wZXJhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCB7Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZGF0YU1vZGVsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBET1QgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJBQ0tFVCA9ICJbIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS19TVUZGSVggPSAiUEsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJRklFRF9TRVJJQUxJWkFCTEUgPSAiamF2YS5pby5TZXJpYWxpemFibGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTkNFX1BBQ0tBR0UgPSAiamF2YXgucGVyc2lzdGVuY2UuKiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0FOTk9UQVRJT04gPSAiQEVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEX0FTX1NVUEVSQ0xBU1NfVFlQRSA9ICJATWFwcGVkU3VwZXJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5IRVJJVEFOQ0VfVFlQRSA9ICJASW5oZXJpdGFuY2UiOyAvLyROT04tTkxTLTEkCQotCQkKLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGVudGl0eSBtb2RlbCBhcyBleHBhbnNpb24gb2YgdGhlIGRhdGEgbW9kZWwKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICovCi0JcHVibGljIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5lY2Vzc2FyeSBpbXBvcnRzIG9uIGRlcGVuZHMgb2YgZW50aXR5IChwcmltYXJ5IGtleXMpIGZpZWxkcy4gSXQgaXMgdXNlZCBmcm9tIAotCSAqIEpFVCBlbW1pdGVyIHdoZW4gaXQgZ2VuZXJhdGVzIGVudGl0eSAoSWRDbGFzcykKLQkgKiBAcGFyYW0gaXNJZENsYXNzIGZsYWcsIHdoaWNoIGluZGljYXRlcyB0aGUgY2FzZS4gV2hlbiBpdCBpcyBmYWxzZSwgdGhlIHJlc3VsdCBpcyAKLQkgKiB0aGUgaW1wb3J0IGxpc3QgZm9yIHRoZSBlbnRpdHkgY2xhc3MsIGluIG90aGVyIGNhc2UgdGhlIHJlc3VsdHMgaXMgdGhlIHNldCBmb3IgdGhlIElkQ2xhc3MgCi0JICogZ2VuZXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIGltcG9ydHMgY29sbGVjdGlvbiB3aXRoIHRoZSBpbXBvcnRzIGZvciB0aGUgZ2VuZXJhdGVkIGphdmEgY2xhc3MKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEltcG9ydHMoYm9vbGVhbiBpc0lkQ2xhc3MpIHsKLQkJQ29sbGVjdGlvbjxTdHJpbmc+IGNvbGxlY3Rpb24gPSBuZXcgVHJlZVNldDxTdHJpbmc+KCk7Ci0JCQotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3NOYW1lKCk7Ci0JCVN0cmluZyBzdXBlcmNsYXNzTmFtZSA9IGdldFF1YWxpZmllZFN1cGVyY2xhc3NOYW1lKCk7Ci0KLQkJaWYgKHN1cGVyY2xhc3NOYW1lICE9IG51bGwgJiYgc3VwZXJjbGFzc05hbWUubGVuZ3RoKCkgPiAwICYmIAotCQkJCSFlcXVhbFNpbXBsZU5hbWVzKGNsYXNzTmFtZSwgc3VwZXJjbGFzc05hbWUpKSB7Ci0JCQljb2xsZWN0aW9uLmFkZChzdXBlcmNsYXNzTmFtZSk7Ci0JCX0KLQkJCi0JCUxpc3QgaW50ZXJmYWNlcyA9IGdldFF1YWxpZmllZEludGVyZmFjZXMoKTsKLQkJaWYgKGludGVyZmFjZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBpbnRlcmZhY2VzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGlmYWNlID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmICghZXF1YWxTaW1wbGVOYW1lcyhnZXRDbGFzc05hbWUoKSwgaWZhY2UpKSB7Ci0JCQkJCWNvbGxlY3Rpb24uYWRkKGlmYWNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGlzSWRDbGFzcykgewotCQkJY29sbGVjdGlvbi5hZGRBbGwoZ2V0SWRDbGFzc0ltcG9ydExpc3QoKSk7Ci0JCX0gZWxzZSB7CQkJCi0JCQljb2xsZWN0aW9uLmFkZChQRVJTSVNURU5DRV9QQUNLQUdFKTsKLQkJCWNvbGxlY3Rpb24uYWRkQWxsKGdldEZpZWxkSW1wb3J0TGlzdCgpKTsKLQkJCQotCQl9Ci0JCXJldHVybiBjb2xsZWN0aW9uOwotCX0JCi0KLQkvKioKLQkgKiBAcmV0dXJuIGNsYXNzIG5hbWUgb2YgdGhlIGVudGl0eQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuQ0xBU1NfTkFNRSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gcGFja2FnZSBuYW1lIHdoZW4gdGhlIGVudGl0eSB3aWxsIGJlIGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVBhY2thZ2VOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuSkFWQV9QQUNLQUdFKS50cmltKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBmdWxseSBxdWFsaWZpZWQgamF2YSBjbGFzcyBuYW1lCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgewotCQlpZiAoIWdldEphdmFQYWNrYWdlTmFtZSgpLmVxdWFscyhJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5FTVBUWV9TVFJJTkcpKSB7Ci0JCQlyZXR1cm4gZ2V0SmF2YVBhY2thZ2VOYW1lKCkgKyBET1QgKyBnZXRDbGFzc05hbWUoKTsKLQkJfSAKLQkJcmV0dXJuIGdldENsYXNzTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdXBlcmNsYXNzTmFtZSgpIHsKLQkJU3RyaW5nIHF1YWxpZmllZCA9IGdldFF1YWxpZmllZFN1cGVyY2xhc3NOYW1lKCk7Ci0JCWlmIChlcXVhbFNpbXBsZU5hbWVzKGdldENsYXNzTmFtZSgpLCBxdWFsaWZpZWQpKSB7Ci0JCQlyZXR1cm4gcXVhbGlmaWVkOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKHF1YWxpZmllZCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW50aXR5J3Mgc3VwZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1YWxpZmllZFN1cGVyY2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMuU1VQRVJDTEFTUykudHJpbSgpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgd2l0aCB0aGUgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBmcm9tIGVudGl0eSBjbGFzcyAKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEludGVyZmFjZXMoKSB7Ci0JCUxpc3QgcXVhbGlmaWVkSW50ZXJmYWNlcyA9IGdldFF1YWxpZmllZEludGVyZmFjZXMoKTsKLQkJTGlzdDxTdHJpbmc+IGludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ocXVhbGlmaWVkSW50ZXJmYWNlcy5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3IgaXRlciA9IHF1YWxpZmllZEludGVyZmFjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgcXVhbGlmaWVkID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZXF1YWxTaW1wbGVOYW1lcyhnZXRDbGFzc05hbWUoKSwgcXVhbGlmaWVkKSkgewotCQkJCWludGVyZmFjZXMuYWRkKHF1YWxpZmllZCk7Ci0JCQl9IGVsc2UgewotCQkJCWludGVyZmFjZXMuYWRkKFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKHF1YWxpZmllZCkpOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gaW50ZXJmYWNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGxpc3Qgd2l0aCB0aGUgaW50ZXJmYWNlcyAoZnVsbHkgcXVhbGlmaWVkIG5hbWVkKSBpbXBsZW1lbnRlZCBmcm9tIGVudGl0eSBjbGFzcwotCSAqLwotCXB1YmxpYyBMaXN0IGdldFF1YWxpZmllZEludGVyZmFjZXMoKSB7Ci0JCUxpc3QgaW50ZXJmYWNlcyA9IChMaXN0KSB0aGlzLmRhdGFNb2RlbC5nZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5JTlRFUkZBQ0VTKTsJCQotCQlpZiAoaW50ZXJmYWNlcyA9PSBudWxsKXsKLQkJCWludGVyZmFjZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0gCi0JCWludGVyZmFjZXMuYWRkKFFVQUxJRklFRF9TRVJJQUxJWkFCTEUpOwotCQlyZXR1cm4gaW50ZXJmYWNlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZyBwcm9wZXJ0eQotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIHN0cmluZyB2YWx1ZSBvZiB0ZWggc3BlY2lmaWVkIHByb3BlcnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZHMgaXMgdXNlZCBmb3IgdGhlIGNvbXBhcmlzb24gb2YgZnVsbHkgcXVhbGlmaWVkIHR5cGVzIAotCSAqIEBwYXJhbSBuYW1lMSBmaXJzdCB0eXBlIG5hbWUKLQkgKiBAcGFyYW0gbmFtZTIgc2Vjb25kIHR5cGUgbmFtZQotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgc2ltcGxlIG5hbWVzIG9mIHRoZSB0eXBlcyBhcmUgZXF1YWwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBlcXVhbFNpbXBsZU5hbWVzKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0JCVN0cmluZyBzaW1wbGVOYW1lMSA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKG5hbWUxKTsKLQkJU3RyaW5nIHNpbXBsZU5hbWUyID0gU2lnbmF0dXJlLmdldFNpbXBsZU5hbWUobmFtZTIpOwotCQlyZXR1cm4gc2ltcGxlTmFtZTEuZXF1YWxzKHNpbXBsZU5hbWUyKTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGUgYXJ0aWZhY3QgLSBFbnRpdHkgb3IgTWFwcGVkIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VHlwZSgpIHsKLQkJaWYoZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5NQVBQRURfQVNfU1VQRVJDTEFTUykpIHsKLQkJCXJldHVybiBNQVBQRURfQVNfU1VQRVJDTEFTU19UWVBFOwotCQl9IAotCQlyZXR1cm4gRU5USVRZX0FOTk9UQVRJT047Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIGVudGl0eSBzZXQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luaGVyaXRhbmNlU2V0KCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRSk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGluaGVyaXRhbmNlIHN0cmF0ZWd5LCBhcyBpdCBpcyBkZWZpbmVkIGluIHRoZSBzcGVjaWZpY2F0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmhlcml0YW5jZVN0cmF0ZWd5TmFtZSgpIHsJCQotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuSU5IRVJJVEFOQ0VfU1RSQVRFR1kpOwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb25zdHJ1Y3RlZCBASW5oZXJpdGFuY2UgYW5ub3RhdGlvbiB3aXRoIHRoZSByZWxldmFudCBzdHJhdGVneQotCSAqIGlmIGl0IGlzIGNob3NlbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVNUFRZX1NUUklORzsKLQkJaWYgKGlzSW5oZXJpdGFuY2VTZXQoKSkgewkKLQkJCXJlc3VsdCA9IElOSEVSSVRBTkNFX1RZUEU7Ci0JCQlpZiAoIWdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLklOSEVSSVRBTkNFX1NUUkFURUdZKS5lcXVhbHMoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU1QVFlfU1RSSU5HKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ICs9ICIoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLiIgKyBnZXRQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRV9TVFJBVEVHWSkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKLQkJCQotCQkJfQkJCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9CQotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZ2VuZXJhdGVkIGFydGlmYWN0IGlzIG5vdCBlbnRpdHkgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb25FbnRpdHlTdXBlcmNsYXNzKCkgewotCQlyZXR1cm4gIWRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgdGhlIGNyZWF0ZWQgYXJ0aWZhY3Qgd2lsbCBiZSBhbm5vdGF0ZWQKLQkgKiBAcmV0dXJuIGZhbHNlIHRoZSBlbnRpdHkgbWFwcGluZ3Mgd2lsbCBiZSByZWdpc3RlcmVkIGluIFhNTAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXJ0aWZhY3RzQW5ub3RhdGVkKCkgewotCQlyZXR1cm4gIWRhdGFNb2RlbC5nZXRCb29sZWFuUHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuWE1MX1NVUFBPUlQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc01hcHBpbmdYTUxEZWZhdWx0KCkgewotCQlpZiAoZ2V0TWFwcGluZ1hNTE5hbWUoKS5lcXVhbHMoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU1QVFlfU1RSSU5HKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGdldE1hcHBpbmdYTUxOYW1lKCkuZXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNYXBwaW5nWE1MTmFtZSgpIHsKLQkJcmV0dXJuIGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfTkFNRSkudHJpbSgpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0TWFwcGluZ1htbEZpbGUoKSB7Ci0JCUlGaWxlIG9ybUZpbGUgPSBudWxsOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHNvdXJjZUZyYWdtZW50cyA9IEoyRUVQcm9qZWN0VXRpbGl0aWVzLmdldFNvdXJjZUNvbnRhaW5lcnMocHJvamVjdCk7Ci0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGFja2FnZUZyYWdtZW50Um9vdCA6IHNvdXJjZUZyYWdtZW50cykgewotCQkJb3JtRmlsZSA9IHByb2plY3QuZ2V0RmlsZShwYWNrYWdlRnJhZ21lbnRSb290LmdldFJlc291cmNlKCkuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBnZXRNYXBwaW5nWE1MTmFtZSgpKTsKLQkJCWlmIChvcm1GaWxlLmV4aXN0cygpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gb3JtRmlsZTsKLQl9Ci0JCi0JLyoqCi0JICogQHJldHVybiB0aGUgZW50aXR5IG5hbWUgKGNvdWxkIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBjbGFzcyBuYW1lKQotCSAqIFNlZSA8Y29kZT5pc0VudGl0eU5hbWVTZXQoKTxjb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW50aXR5TmFtZSgpIHsKLQkJcmV0dXJuIGdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9OQU1FKS50cmltKCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgZW50aXR5IG5hbWUgaXMgZGlmZmVyZW50IHRoYW4gY2xhc3MgbmFtZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5TmFtZVNldCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKCFnZXRDbGFzc05hbWUoKS5lcXVhbHMoZ2V0RW50aXR5TmFtZSgpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHRhYmxlIG5hbWUgaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1RhYmxlTmFtZVNldCgpIHsKLQkJcmV0dXJuICFkYXRhTW9kZWwuZ2V0Qm9vbGVhblByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlRBQkxFX05BTUVfREVGQVVMVCk7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHRhYmxlIG5hbWUgKGlmIGl0IGlzIHNwZWNpZmllZCkKLQkgKiBTZWUgPGNvZGU+aXNUYWJsZU5hbWVTZXQoKTxjb2RlPgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFibGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHkoSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuVEFCTEVfTkFNRSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbGlzdCB3aXRoIHRoZSBlbnRpdHkgZmllbGRzCi0JICovCi0JcHVibGljIExpc3Q8RW50aXR5Um93PiBnZXRFbnRpdHlGaWVsZHMoKSB7Ci0JCUFycmF5TGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IChBcnJheUxpc3Q8RW50aXR5Um93PikgZGF0YU1vZGVsLmdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9GSUVMRFMpOwotCQlpZiAoZmllbGRzID09IG51bGwpewotCQkJcmV0dXJuIG5ldyBBcnJheUxpc3Q8RW50aXR5Um93PigpOwotCQl9IGVsc2UKLQkJCXJldHVybiBmaWVsZHM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aGUgZW50aXR5IChiYXNlZCBvbiBpdHMgZmllbGRzKQotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmllbGRJbXBvcnRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gaW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlMaXN0PEVudGl0eVJvdz4gZW50aXRpZXMgPSBnZXRFbnRpdHlGaWVsZHMoKTsKLQkJZm9yIChFbnRpdHlSb3cgZW50aXR5Um93IDogZW50aXRpZXMpIHsKLQkJCWlmICghaW1wb3J0cy5jb250YWlucyhlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSkgJiYgIWVudGl0eVJvdy5nZXRUeXBlKCkuZXF1YWxzKGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpKSkgewotCQkJCVN0cmluZyBmcW5UeXBlTmFtZSA9IGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpOwotCQkJCS8vcmVtb3ZlIHRoZSBhcnJheSBicmFja2V0cyBbXSBmb3IgdGhlIGphdmEubGFuZy5CeXRlW10gJiBqYXZhLmxhbmcuQ2hhcmFjdGVyW10KLQkJCQlpZiAoZnFuVHlwZU5hbWUuaW5kZXhPZihCUkFDS0VUKSAhPSAtMSkgewotCQkJCQlmcW5UeXBlTmFtZSA9IGZxblR5cGVOYW1lLnN1YnN0cmluZygwLCBmcW5UeXBlTmFtZS5pbmRleE9mKCJbIikpOwotCQkJCX0KLQkJCQlpbXBvcnRzLmFkZChmcW5UeXBlTmFtZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltcG9ydHM7CQkKLQl9Ci0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggdGhlIGltcG9ydHMgbmVjZXNzYXJ5IGZvciB0aGUgaWQgY2xhc3MgKGJhc2VkIG9uIGl0cyBmaWVsZHMgLSBwcmltYXJ5IGtleXMgb2YgdGhlIGVudGl0eSkKLQkgKi8KLQlwdWJsaWMgTGlzdDxTdHJpbmc+IGdldElkQ2xhc3NJbXBvcnRMaXN0KCkgewotCQlMaXN0PFN0cmluZz4gaW1wb3J0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlMaXN0PEVudGl0eVJvdz4gZW50aXRpZXMgPSBnZXRFbnRpdHlGaWVsZHMoKTsKLQkJTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gZ2V0UEtGaWVsZHMoKTsKLQkJZm9yIChFbnRpdHlSb3cgZW50aXR5Um93IDogZW50aXRpZXMpIHsKLQkJCVN0cmluZyBuYW1lID0gZW50aXR5Um93LmdldE5hbWUoKTsKLQkJCWlmIChwa0ZpZWxkcy5jb250YWlucyhuYW1lKSkgewkJCQotCQkJCWlmICghaW1wb3J0cy5jb250YWlucyhlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSkgJiYgIWVudGl0eVJvdy5nZXRUeXBlKCkuZXF1YWxzKGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpKSkgewotCQkJCQlpbXBvcnRzLmFkZChlbnRpdHlSb3cuZ2V0RnFuVHlwZU5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbXBvcnRzOwkJCi0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgYWNjZXNzIHR5cGUgaXMgZmllbGQgYmFzZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpZWxkQWNjZXNzKCkgewotCQlyZXR1cm4gZGF0YU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5GSUVMRF9BQ0NFU1NfVFlQRSk7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBwcmltYXJ5IGtleSBpcyBjb21wb3NpdGUgKG1vcmUgdGhhbiBvbmUgYW5ub3RhdGVkIGFzIHByaW1hcnkga2V5IGZpZWxkKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ29tcG9zaXRlUEsoKSB7Ci0JCXJldHVybiBnZXRQS0ZpZWxkcygpLnNpemUoKSA+IDE7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBsaXN0IHdpdGggcHJpbWFyeSBrZXkgbmFtZShzKQotCSAqLwotCXB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UEtGaWVsZHMoKSB7Ci0JCXJldHVybiAoQXJyYXlMaXN0PFN0cmluZz4pZGF0YU1vZGVsLmdldFByb3BlcnR5KElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlBLX0ZJRUxEUyk7Ci0JfQkKLQkKLQkvKioKLQkgKiBAcmV0dXJuIGNvbnN0cnVjdGVkIG5hbWUgb2YgdGhlIGlkIGNsYXNzIChlbnRpdHkgbmFtZSArIFBLIGFzIHN1ZmZpeCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkQ2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZ2V0Q2xhc3NOYW1lKCkgKyBQS19TVUZGSVg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBjb25zdHJ1Y3RlZCBuYW1lIG9mIHRoZSBtYXBwaW5nIGZpbGUgaWQgY2xhc3MgKHBhY2thZ2UgbmFtZSArIGVudGl0eSBuYW1lICsgUEsgYXMgc3VmZml4KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3JtSWRDbGFzc05hbWUoKSB7Ci0JCXJldHVybiBnZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkgKyBQS19TVUZGSVg7Ci0JfQotCQotCS8qKgotCSAqIEByZXR1cm4gSVByb2plY3QgcHJlc2VudGF0aW9uIG9mIEpQQSBwcm9qZWN0Ci0JICovCi0JcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCVN0cmluZyBwcm9qZWN0TmFtZSA9IGRhdGFNb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9CQotCi0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlEYXRhTW9kZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTEyODljLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlEYXRhTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDEwIGJ5IFNBUCBBRywgV2FsbGRvcmYuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgU0FQIEFHIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgRGltaXRlciBEaW1pdHJvdiwgZC5kaW1pdHJvdkBzYXAuY29tIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvbnZlbnRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5TaWduYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5TdHJpbmdUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuRW50aXR5V2l6YXJkTXNnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5vcGVyYXRpb24uTmV3RW50aXR5Q2xhc3NPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLkoyRUVDb21tb25NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5JTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuTWVzc2FnZUZvcm1hdDsKLQotcHVibGljIGNsYXNzIEVudGl0eURhdGFNb2RlbFByb3ZpZGVyIGV4dGVuZHMgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIgaW1wbGVtZW50cyBJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllc3sKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJRGF0YU1vZGVsT3BlcmF0aW9uIGdldERlZmF1bHRPcGVyYXRpb24oKSB7Ci0JCXJldHVybiBuZXcgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24oZ2V0RGF0YU1vZGVsKCkpOwotCX0KLQkKLQkvKioKLQkgKiBFeHRlbmRzOiA8Y29kZT5JRGF0YU1vZGVsUHJvdmlkZXIjZ2V0UHJvcGVydHlOYW1lcygpPC9jb2RlPgotCSAqIGFuZCBhZGQgb3duIGRhdGEgbW9kZWwncyBwcm9wZXJ0aWVzIHNwZWNpZmljIGZvciB0aGUgZW50aXR5IG1vZGVsCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlciNnZXRQcm9wZXJ0eU5hbWVzKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU2V0IGdldFByb3BlcnR5TmFtZXMoKSB7CQkKLQkJU2V0IHByb3BlcnR5TmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKElOSEVSSVRBTkNFKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoRU5USVRZKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoTUFQUEVEX0FTX1NVUEVSQ0xBU1MpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChJTkhFUklUQU5DRV9TVFJBVEVHWSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFhNTF9TVVBQT1JUKTsKLQkJcHJvcGVydHlOYW1lcy5hZGQoWE1MX05BTUUpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChFTlRJVFlfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFRBQkxFX05BTUVfREVGQVVMVCk7CQkKLQkJcHJvcGVydHlOYW1lcy5hZGQoVEFCTEVfTkFNRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKEVOVElUWV9GSUVMRFMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChQS19GSUVMRFMpOwotCQlwcm9wZXJ0eU5hbWVzLmFkZChGSUVMRF9BQ0NFU1NfVFlQRSk7Ci0JCXByb3BlcnR5TmFtZXMuYWRkKFBST1BFUlRZX0FDQ0VTU19UWVBFKTsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciAod2hpY2ggc2hvdWxkIHByZXNlbnQgYSB2YWxpZCBkYXRhIG1vZGVsIHByb3BlcnR5KS4gIAotCSAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiBJdCBtYXkgcmV0dXJuIG51bGwuIAotCSAqIAotCSAqIEBzZWUgTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjZ2V0RGVmYXVsdFByb3BlcnR5KFN0cmluZykKLQkgKiBAc2VlIElEYXRhTW9kZWxQcm92aWRlciNnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiBAcmV0dXJuIE9iamVjdCBkZWZhdWx0IHZhbHVlIG9mIHByb3BlcnR5Ci0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIE9iamVjdCBnZXREZWZhdWx0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkvLyBvdmVycmlkZGVuCi0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNPVVJDRV9GT0xERVIpKSB7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGdldERlZmF1bHRKYXZhU291cmNlQ29udGFpbmVyKCk7Ci0JCQlyZXR1cm4gKGNvbnRhaW5lciA9PSBudWxsKSA/IG51bGwgOiBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQl9Ci0JCQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKElOSEVSSVRBTkNFKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFTlRJVFkpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTUFQUEVEX0FTX1NVUEVSQ0xBU1MpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFhNTF9TVVBQT1JUKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhYTUxfTkFNRSkpIHsKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7CQkJCi0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhFTlRJVFlfTkFNRSkpIHsKLQkJCXJldHVybiBnZXRTdHJpbmdQcm9wZXJ0eShDTEFTU19OQU1FKTsJCQkKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFRBQkxFX05BTUVfREVGQVVMVCkpIHsKLQkJCXJldHVybiBCb29sZWFuLlRSVUU7Ci0JCX0gZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUQUJMRV9OQU1FKSkgewotCQkJcmV0dXJuIGdldFN0cmluZ1Byb3BlcnR5KENMQVNTX05BTUUpOwkJCQotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSU5IRVJJVEFOQ0VfU1RSQVRFR1kpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOyAKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNVUEVSQ0xBU1MpKSB7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9IGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRU5USVRZX0ZJRUxEUykpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PEVudGl0eVJvdz4oKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBLX0ZJRUxEUykpIHsKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEZJRUxEX0FDQ0VTU19UWVBFKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKLQkJfSBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FDQ0VTU19UWVBFKSkgewotCQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7CQkJCi0JCX0gCi0JCS8vIE90aGVyd2lzZSBjaGVjayBzdXBlciBmb3IgZGVmYXVsdCB2YWx1ZSBmb3IgcHJvcGVydHkKLQkJcmV0dXJuIHN1cGVyLmdldERlZmF1bHRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSUZvbGRlciBnZXREZWZhdWx0SmF2YVNvdXJjZUZvbGRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29udGFpbmVyIGdldERlZmF1bHRKYXZhU291cmNlQ29udGFpbmVyKCkgewotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBnZXRUYXJnZXRKcGFQcm9qZWN0KCk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IGpwYVByb2plY3QuZ2V0SmF2YVByb2plY3QoKTsKLQkJdHJ5IHsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3QgcGZyIDogamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoKSkgewotCQkJCWlmIChwZnIuZ2V0S2luZCgpID09IElQYWNrYWdlRnJhZ21lbnRSb290LktfU09VUkNFKSB7Ci0JCQkJCXJldHVybiAoSUNvbnRhaW5lcikgcGZyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJLy8gZmFsbCB0aHJvdWdoCi0JCQlKcHRKcGFVaVBsdWdpbi5sb2coam1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gcHJvcGVydHlTZXQoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IHByb3BlcnR5VmFsdWUpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCWlmIChvaykgewotCQkJaWYgKENPTVBPTkVOVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IFBST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoU09VUkNFX0ZPTERFUiwgSURhdGFNb2RlbC5ERUZBVUxUX0NIRyk7Ci0JCQl9Ci0JCQlpZiAoUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IFhNTF9TVVBQT1JULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShYTUxfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCi0JLyogQWRkcyBhZGRpdGlvbmFsIGNoZWNrIHRvIHRoZSBtb2RlbCB2YWxpZGF0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5jb21tb24ub3BlcmF0aW9ucy5OZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm92aWRlciN2YWxpZGF0ZShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyByZXN1bHQgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKQVZBX1BBQ0tBR0UpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVKYXZhUGFja2FnZShnZXRTdHJpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTVVBFUkNMQVNTKSAmJiBFTVBUWV9TVFJJTkcuZXF1YWxzKGdldFN0cmluZ1Byb3BlcnR5KHByb3BlcnR5TmFtZSkpKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhYTUxfTkFNRSkpIHsKLQkJCXJldHVybiB2YWxpZGF0ZVhtbE5hbWUoZ2V0U3RyaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCX0KLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoRU5USVRZX0ZJRUxEUykpIHsKLQkJCXJldHVybiB2YWxpZGF0ZUZpZWxkc0xpc3QoKEFycmF5TGlzdDxFbnRpdHlSb3c+KSBnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwkJCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHZhbGlkYXRlSmF2YVNvdXJjZUZvbGRlcihTdHJpbmcgY29udGFpbmVyRnVsbFBhdGgpIHsKLQkJLy8gRW5zdXJlIHRoYXQgdGhlIHNvdXJjZSBmb2xkZXIgcGF0aCBpcyBub3QgZW1wdHkKLQkJaWYgKGNvbnRhaW5lckZ1bGxQYXRoID09IG51bGwgfHwgY29udGFpbmVyRnVsbFBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTkFNRV9FTVBUWTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJfQotCQkvLyBFbnN1cmUgdGhhdCB0aGUgc291cmNlIGZvbGRlciBwYXRoIGlzIGFic29sdXRlCi0JCWVsc2UgaWYgKCFuZXcgUGF0aChjb250YWluZXJGdWxsUGF0aCkuaXNBYnNvbHV0ZSgpKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX0NMQVNTX0ZPTERFUl9OT1RfQUJTT0xVVEU7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQkJLy8gRW5zdXJlIHByb2plY3QgaXMgbm90IGNsb3NlZAotCQlpZiAocHJvamVjdCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX0NMQVNTX0ZPTERFUl9OT1RfRVhJU1Q7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gRW5zdXJlIHByb2plY3QgaXMgYWNjZXNzaWJsZS4KLQkJaWYgKCFwcm9qZWN0LmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLkVSUl9KQVZBX0NMQVNTX0ZPTERFUl9OT1RfRVhJU1Q7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gRW5zdXJlIHRoZSBwcm9qZWN0IGlzIGEgamF2YSBwcm9qZWN0LgotCQl0cnkgewotCQkJaWYgKCFwcm9qZWN0Lmhhc05hdHVyZShKYXZhQ29yZS5OQVRVUkVfSUQpKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19OT1RfSkFWQV9QUk9KRUNUOwotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMobXNnKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKMkVFUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQl9Ci0JCS8vIEVuc3VyZSB0aGUgc2VsZWN0ZWQgZm9sZGVyIGlzIGEgdmFsaWQgamF2YSBzb3VyY2UgZm9sZGVyIGZvciB0aGUgY29tcG9uZW50Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gZ2V0SmF2YVNvdXJjZUNvbnRhaW5lcigpOwotCQlpZiAoY29udGFpbmVyID09IG51bGwgfHwgKCEgY29udGFpbmVyLmdldEZ1bGxQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKGNvbnRhaW5lckZ1bGxQYXRoKSkpKSB7Ci0JCQlTdHJpbmcgbXNnID0gSjJFRUNvbW1vbk1lc3NhZ2VzLmdldFJlc291cmNlU3RyaW5nKEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9DTEFTU19GT0xERVJfTk9UX1NPVVJDRSwgbmV3IFN0cmluZ1tde2NvbnRhaW5lckZ1bGxQYXRofSk7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0KLQkJLy8gVmFsaWQgc291cmNlIGlzIHNlbGVjdGVkCi0JCXJldHVybiBXVFBDb21tb25QbHVnaW4uT0tfU1RBVFVTOwotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEl0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgY29ycmVjdG5lc3Mgb2YgZW50aXR5IHBhY2thZ2UKLQkgKiBpbiBhY2NvcmRhbmNlIHdpdGggSmF2YSBjb252ZW50aW9uIHJlcXVpcmVtZW50cy4gVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gCi0JICogCi0JICogQHNlZSBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0gcGFja05hbWUKLQkgKiBAcmV0dXJuIElTdGF0dXMgaXMgdGhlIHBhY2thZ2UgbmFtZSBzYXRpc2ZpZXMgSmF2YSBjb252ZW50aW9uIHJlcXVpcmVtZW50cwotCSAqLwotCQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZUphdmFQYWNrYWdlKFN0cmluZyBwYWNrTmFtZSkgewkJCi0JCWlmIChwYWNrTmFtZSA9PSBudWxsIHx8IHBhY2tOYW1lLmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZVdhcm5pbmdTdGF0dXMoRW50aXR5V2l6YXJkTXNnLkRFRkFVTFRfUEFDS0FHRV9XQVJOSU5HKTsKLQkJfQkJCQotCQkvLyBVc2Ugc3RhbmRhcmQgamF2YSBjb252ZW50aW9ucyB0byB2YWxpZGF0ZSB0aGUgcGFja2FnZSBuYW1lCi0JCUlTdGF0dXMgamF2YVN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZVBhY2thZ2VOYW1lKHBhY2tOYW1lLCBKYXZhQ29yZS5WRVJTSU9OXzFfNSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUpOwotCQlpZiAoamF2YVN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCVN0cmluZyBtc2cgPSBKMkVFQ29tbW9uTWVzc2FnZXMuRVJSX0pBVkFfUEFDQUtHRV9OQU1FX0lOVkFMSUQgKyBqYXZhU3RhdHVzLmdldE1lc3NhZ2UoKTsJCQkJCi0JCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCX0gZWxzZSBpZiAoamF2YVN0YXR1cy5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgewotCQkJU3RyaW5nIG1zZyA9IEoyRUVDb21tb25NZXNzYWdlcy5FUlJfSkFWQV9QQUNLQUdFX05BTUVfV0FSTklORyArIGphdmFTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVXYXJuaW5nU3RhdHVzKG1zZyk7Ci0JCX0JCQotCQkvLyBqYXZhIHBhY2thZ2UgbmFtZSBpcyB2YWxpZAotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiAgSXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIAotCSAqIHRoZSBjb3JyZWN0bmVzcyBvZiB4bWwgZmlsZSBsb2NhdGlvbi4gCi0JICogVGhpcyBtZXRob2Qgd2lsbCBhY2NlcHQgYSBudWxsIHBhcmFtZXRlci4gCi0JICogCi0JICogQHNlZSBOZXdGaWx0ZXJDbGFzc0RhdGFNb2RlbFByb3ZpZGVyI3ZhbGlkYXRlKFN0cmluZykKLQkgKiAKLQkgKiBAcGFyYW0geG1sTmFtZQotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyB0aGUgcGFja2FnZSBuYW1lIHNhdGlzZmllcyBKYXZhIGNvbnZlbnRpb24gcmVxdWlyZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJU3RhdHVzIHZhbGlkYXRlWG1sTmFtZShTdHJpbmcgeG1sTmFtZSkgewotCQlpZiAoZ2V0Qm9vbGVhblByb3BlcnR5KFhNTF9TVVBQT1JUKSkgewotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gdGhpcy5tb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShQUk9KRUNUX05BTUUpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSnBhWG1sUmVzb3VyY2Ugb3JtWG1sUmVzb3VyY2UgPSBTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHhtbE5hbWUpID8gbnVsbCA6IGdldE9ybVhtbFJlc291cmNlKHhtbE5hbWUpOwotCQkJCWlmIChvcm1YbWxSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgU3RhdHVzKAotCQkJCQkJCUlTdGF0dXMuRVJST1IsIEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwKLQkJCQkJCQlFbnRpdHlXaXphcmRNc2cuSU5WQUxJRF9YTUxfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGdldFRhcmdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlKG9ybVhtbFJlc291cmNlLmdldEZpbGUoKSkuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpID09IDApIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoCi0JCQkJCQlJU3RhdHVzLkVSUk9SLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQsCi0JCQkJCQlFbnRpdHlXaXphcmRNc2cuTUFQUElOR19GSUxFX05PVF9MSVNURURfRVJST1IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0T3JtWG1sUmVzb3VyY2UoU3RyaW5nIHhtbE5hbWUpIHsKLQkJcmV0dXJuIGdldFRhcmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKHhtbE5hbWUpKTsKLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGVudGl0eSBmaWVsZHMKLQkgKiBsaXN0IHRvIGVuc3VyZSB0aGVyZSBhcmUgbm90IGFueSBkdXBsaWNhdGVzLiBUaGlzIG1ldGhvZCB3aWxsIGFjY2VwdCBhIG51bGwgcGFyYW1ldGVyLiAKLQkgKiAKLQkgKiBAc2VlIE5ld0ZpbHRlckNsYXNzRGF0YU1vZGVsUHJvdmlkZXIjdmFsaWRhdGUoU3RyaW5nKQotCSAqIAotCSAqIEBwYXJhbSBlbnRpdGllcwotCSAqIEByZXR1cm4gSVN0YXR1cyBpcyB0aGUgZmllbGRzIG5hbWVzIGFyZSB1bmlxdWUKLQkgKi8KLQlwcml2YXRlIElTdGF0dXMgdmFsaWRhdGVGaWVsZHNMaXN0KEFycmF5TGlzdDxFbnRpdHlSb3c+IGVudGl0aWVzKSB7Ci0JCWlmIChlbnRpdGllcyAhPSBudWxsICYmICFlbnRpdGllcy5pc0VtcHR5KCkpIHsKLQkJCS8vIEVuc3VyZSB0aGVyZSBhcmUgbm90IGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBsaXN0Ci0JCQlib29sZWFuIGR1cCA9IGhhc0R1cGxpY2F0ZXNJbkVudGl0eUZpZWxkcyhlbnRpdGllcyk7Ci0JCQlpZiAoZHVwKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IEVudGl0eVdpemFyZE1zZy5EVVBMSUNBVEVEX0VOVElUWV9OQU1FU19NRVNTQUdFOwkJCQkKLQkJCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLmNyZWF0ZUVycm9yU3RhdHVzKG1zZyk7Ci0JCQl9Ci0JCQkvLyBFbnN1cmUgdGhhdCB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBhcmUgdmFsaWQKLQkJCVN0cmluZyBlcnJvck1zZyA9IGNoZWNrSW5wdXRFbGVtZW50c1R5cGVWYWxpZGF0aW9uKGVudGl0aWVzKTsKLQkJCWlmIChlcnJvck1zZyAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIFdUUENvbW1vblBsdWdpbi5jcmVhdGVFcnJvclN0YXR1cyhlcnJvck1zZyk7Ci0JCQl9Ci0JCQlTdHJpbmcgd2FybmluZ01zZyA9IGNoZWNrSW5wdXRFbGVtZW50c1R5cGVFeGlzdGVuY2UoZW50aXRpZXMpOwotCQkJaWYgKHdhcm5pbmdNc2cgIT0gbnVsbCkgewotCQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlV2FybmluZ1N0YXR1cyh3YXJuaW5nTXNnKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gV1RQQ29tbW9uUGx1Z2luLk9LX1NUQVRVUzsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY2hlY2tJbnB1dEVsZW1lbnRzVHlwZVZhbGlkYXRpb24oTGlzdDxFbnRpdHlSb3c+IGlucHV0RWxlbWVudHMpIHsKLQkJSVN0YXR1cyB2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCWZvciAoRW50aXR5Um93IGVudGl0eVJvdzogaW5wdXRFbGVtZW50cykgewotCQkJaWYgKGVudGl0eVJvdy5pc0tleSgpICYmICFlbnRpdHlSb3cuY291bGRCZUtleSgpKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUVudGl0eVdpemFyZE1zZy5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl9pbnZhbGlkUEtUeXBlLCBuZXcgT2JqZWN0W117ZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCl9KTsKLQkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJYnJlYWs7CQkJCQotCQkJfQkJCQotCQkJU3RyaW5nIHNpZyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNpZyA9IFNpZ25hdHVyZS5jcmVhdGVUeXBlU2lnbmF0dXJlKGVudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpLCB0cnVlKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChFbnRpdHlXaXphcmRNc2cuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfaW52YWxpZEFyZ3VtZW50LCBuZXcgT2JqZWN0W117ZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCl9KTsKLQkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSnB0SnBhVWlQbHVnaW4uUExVR0lOX0lELCBtZXNzYWdlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChzaWcgPT0gbnVsbCl7Ci0JCQkJdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUoZW50aXR5Um93LmdldFR5cGUoKSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWludCBzaWdUeXBlID0gU2lnbmF0dXJlLmdldFR5cGVTaWduYXR1cmVLaW5kKHNpZyk7Ci0JCQlpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQlTdHJpbmcgZWxlbWVudFNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcpOwotCQkJCWlmIChTaWduYXR1cmUuZ2V0VHlwZVNpZ25hdHVyZUtpbmQoZWxlbWVudFNpZ25hdHVyZSkgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICghdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBjaGVja0lucHV0RWxlbWVudHNUeXBlRXhpc3RlbmNlKExpc3Q8RW50aXR5Um93PiBpbnB1dEVsZW1lbnRzKSB7Ci0JCUlTdGF0dXMgdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXM9U3RhdHVzLk9LX1NUQVRVUzsKLQkJZm9yIChFbnRpdHlSb3cgZW50aXR5Um93OiBpbnB1dEVsZW1lbnRzKSB7Ci0JCQlTdHJpbmcgc2lnID0gU2lnbmF0dXJlLmNyZWF0ZVR5cGVTaWduYXR1cmUoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkgLHRydWUpOwotCQkJaWYgKHNpZyA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCUVudGl0eVdpemFyZE1zZy5FbnRpdHlEYXRhTW9kZWxQcm92aWRlcl90eXBlTm90SW5Qcm9qZWN0Q2xhc3NwYXRoLCBuZXcgT2JqZWN0W117ZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCl9KTsKLQkJCQl2YWxpZGF0ZUZpZWxkVHlwZVN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJCUpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbnQgc2lnVHlwZSA9IFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChzaWcpOwotCQkJaWYgKHNpZ1R5cGUgPT0gU2lnbmF0dXJlLkJBU0VfVFlQRV9TSUdOQVRVUkUpewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxzZSBpZiAoc2lnVHlwZSA9PSBTaWduYXR1cmUuQVJSQVlfVFlQRV9TSUdOQVRVUkUpIHsKLQkJCQlTdHJpbmcgZWxlbWVudFNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRFbGVtZW50VHlwZShzaWcpOwotCQkJCWlmKFNpZ25hdHVyZS5nZXRUeXBlU2lnbmF0dXJlS2luZChlbGVtZW50U2lnbmF0dXJlKSA9PSBTaWduYXR1cmUuQkFTRV9UWVBFX1NJR05BVFVSRSl7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlTdHJpbmcgcXVhbGlmaWVkTmFtZSA9IFNpZ25hdHVyZS50b1N0cmluZyhlbGVtZW50U2lnbmF0dXJlKTsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBnZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUKTsKLQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHF1YWxpZmllZE5hbWUpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlFbnRpdHlXaXphcmRNc2cuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfdHlwZU5vdEluUHJvamVjdENsYXNzcGF0aCwgbmV3IE9iamVjdFtde2VudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpfSk7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIGdldFByb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlBST0pFQ1QpOwotCQkJCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJCQlJVHlwZSB0eXBlID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQl0eXBlID0gamF2YVByb2plY3QuZmluZFR5cGUoZW50aXR5Um93LmdldEZxblR5cGVOYW1lKCkpOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdCgKLQkJCQkJCQlFbnRpdHlXaXphcmRNc2cuRW50aXR5RGF0YU1vZGVsUHJvdmlkZXJfdHlwZU5vdEluUHJvamVjdENsYXNzcGF0aCwgbmV3IE9iamVjdFtde2VudGl0eVJvdy5nZXRGcW5UeXBlTmFtZSgpfSk7Ci0JCQkJCXZhbGlkYXRlRmllbGRUeXBlU3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQkJCUpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCwgbWVzc2FnZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZighdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gdmFsaWRhdGVGaWVsZFR5cGVTdGF0dXMuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkJCQotCQkJCi0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCBwcm92aWRlcyBhIHNpbXBsZSBhbGdvcml0aG0gZm9yIGRldGVjdGluZwotCSAqIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgZW50cmllcyBpbiBhIGxpc3QuIEl0IHdpbGwgYWNjZXB0IGEgbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgcmV0dXJuCi0JICogYm9vbGVhbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIGJvb2xlYW4gYXJlIHRoZXJlIGR1cGxpY2F0aW9ucyBpbiB0aGUgbGlzdAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNEdXBsaWNhdGVzSW5FbnRpdHlGaWVsZHMoQXJyYXlMaXN0PEVudGl0eVJvdz4gaW5wdXQpIHsKLQkJaWYgKGlucHV0ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgbiA9IGlucHV0LnNpemUoKTsKLQkJLy8gbmVzdGVkIGZvciBsb29wcyB0byBjaGVjayBlYWNoIGVsZW1lbnQgdG8gc2VlIGlmIG90aGVyIGVsZW1lbnRzIGFyZSB0aGUgc2FtZQotCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJRW50aXR5Um93IGVudGl0eSA9IGlucHV0LmdldChpKTsKLQkJCWZvciAoaW50IGogPSBpICsgMTsgaiA8IG47IGorKykgewotCQkJCUVudGl0eVJvdyBpbnRFbnRpdHkgPSBpbnB1dC5nZXQoaik7Ci0JCQkJaWYgKGludEVudGl0eS5nZXROYW1lKCkuZXF1YWxzKGVudGl0eS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVByb2plY3QgZ2V0VGFyZ2V0SnBhUHJvamVjdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFRhcmdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBKcGFGYWNldC5pc0luc3RhbGxlZChwcm9qZWN0KSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb250YWluZXIgZ2V0SmF2YVNvdXJjZUNvbnRhaW5lcigpIHsKLQkJU3RyaW5nIGNvbnRhaW5lckZ1bGxQYXRoID0gZ2V0U3RyaW5nUHJvcGVydHkoU09VUkNFX0ZPTERFUik7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldFRhcmdldEpwYVByb2plY3QoKTsKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0ganBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCQl0cnkgewotCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBwZnIgOiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cygpKSB7Ci0JCQkJaWYgKHBmci5nZXRLaW5kKCkgPT0gSVBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSAoSUNvbnRhaW5lcikgcGZyLmdldFVuZGVybHlpbmdSZXNvdXJjZSgpOwotCQkJCQlpZiAoY29udGFpbmVyLmdldEZ1bGxQYXRoKCkuZXF1YWxzKG5ldyBQYXRoKGNvbnRhaW5lckZ1bGxQYXRoKSkpIHsKLQkJCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBqbWUpIHsKLQkJCS8vIGZhbGwgdGhyb3VnaAotCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGptZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBnZXRKYXZhUGFja2FnZUZyYWdtZW50Um9vdCgpIHsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0VGFyZ2V0SnBhUHJvamVjdCgpOwotCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBqcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JCQkvLyBSZXR1cm4gdGhlIHNvdXJjZSBmb2xkZXIgZm9yIHRoZSBqYXZhIHByb2plY3Qgb2YgdGhlIHNlbGVjdGVkIHByb2plY3QKLQkJCWlmIChqYXZhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJSUNvbnRhaW5lciBzb3VyY2VDb250YWluZXIgPSBnZXRKYXZhU291cmNlQ29udGFpbmVyKCk7Ci0JCQkJaWYgKHNvdXJjZUNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHNvdXJjZUNvbnRhaW5lcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlSb3cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9FbnRpdHlSb3cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMjk4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvbW9kZWwvRW50aXR5Um93LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEVudGl0eVJvdyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQlJBQ0tFVF9TUVVBUkUgPSAnWyc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBCUkFDS0VUX0FOR1VMQVIgPSAnPCc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfSkFWQV9MQU5HID0gImphdmEubGFuZy4iOwotCXByaXZhdGUgYm9vbGVhbiBrZXkgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBuYW1lID0gIiI7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9ICIiOwotCXByaXZhdGUgU3RyaW5nIGZxblR5cGVOYW1lID0gIiI7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQS19UWVBFUyA9IHsiaW50IiwgImxvbmciLCAic2hvcnQiLCAiY2hhciIsICJib29sZWFuIiwgImJ5dGUiLCAiZG91YmxlIiwgImZsb2F0IiwgCi0JCSJqYXZhLmxhbmcuU3RyaW5nIiwgImphdmEuc3FsLkRhdGUiLCAiamF2YS51dGlsLkRhdGUiLCAiamF2YS5sYW5nLkludGVnZXIiLCAiamF2YS5sYW5nLkxvbmciLCAiamF2YS5sYW5nLlNob3J0IiwKLQkJImphdmEubGFuZy5DaGFyYWN0ZXIiLCAiamF2YS5sYW5nLkJvb2xlYW4iLCAiamF2YS5sYW5nLkJ5dGUiLCAiamF2YS5sYW5nLkRvdWJsZSIsICJqYXZhLmxhbmcuRmxvYXQifTsKLQkKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBQS19UWVBFU19TSE9SVCA9IHsgIlN0cmluZyIsICJJbnRlZ2VyIiwgIkxvbmciLCAiU2hvcnQiLCAiQ2hhcmFjdGVyIiwgIkJvb2xlYW4iLCAKLQkJICJCeXRlIiwgIkRvdWJsZSIsICJGbG9hdCIgfTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIExpc3Q8U3RyaW5nPiBWQUxJRF9QS19UWVBFUyA9IEFycmF5cy5hc0xpc3QoUEtfVFlQRVMpOwotCXByaXZhdGUgZmluYWwgc3RhdGljIExpc3Q8U3RyaW5nPiBWQUxJRF9QS19UWVBFU19TSE9SVCA9IEFycmF5cy5hc0xpc3QoUEtfVFlQRVNfU0hPUlQpOwotCQotCS8qKgotCSAqIEByZXR1cm4gd2hldGhlciB0aGUgcHJlc2VudGVkIGVudGl0eSBmaWVsZCBpcyBwcmltYXJ5IGtleSBvciBwYXJ0IG9mIGNvbXBvc2l0ZSBwcmltYXJ5IGtleQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzS2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByZXNlbnRlZCBlbnRpdHkgZmllbGQgdG8gYmUgcHJpbWFyeSBrZXkgKG9yIHBhcnQgb2YgY29tcG9zaXRlIHByaW1hcmkga2V5KQotCSAqIAotCSAqIEBwYXJhbSBrZXkgCi0JICovCi0JcHVibGljIHZvaWQgc2V0S2V5KGJvb2xlYW4ga2V5KSB7Ci0JCXRoaXMua2V5ID0ga2V5OwotCX0KLQkJCi0JLyoqCi0JICogQ2hlY2sgd2hldGhlciB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IGlzIGFsbG93ZWQgdG8gYmUgcHJpbWFyeSBrZXkuCi0JICogVGhlIGxpbWl0YXRpb24gaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgdGhhdCBFbWJlZGRlZCBQSyBhcmUgbm90IGNoZWNrZWQKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIHR5cGUgb2YgZmllbGQgY291bGQgYmUgdXNlZCBhcyBwcmltYXJ5IGtleQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvdWxkQmVLZXkoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJlc3VsdCA9IFZBTElEX1BLX1RZUEVTLmNvbnRhaW5zKGdldEZxblR5cGVOYW1lKCkpOwkJCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW50aXR5IGZpZWxkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBwcmVzZW50ZWQgZW50aXR5IGZpZWxkCi0JICogQHBhcmFtIG5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0aGUgdHlwZSAoYXMgYSBzaW1wbGUgbmFtZSkgb2YgdGhlIGVudGl0eSBmaWVsZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdHlwZSAoYXMgYSBzaW1wbGUgbmFtZSkgb2YgdGhlIGVudGl0eSBmaWVsZAotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIHR5cGUgKGFzIGZ1bGx5IHF1YWxpZmllZCBuYW1lKSBvZiB0aGUgZW50aXR5IGZpZWxkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGcW5UeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGZxblR5cGVOYW1lOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyByZW1vdmVTcGFjZXMoU3RyaW5nIHN0cikgewotCQlzdHIgPSBzdHIudHJpbSgpOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoYXIgYyA9IHN0ci5jaGFyQXQoaSk7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoYykpIAotCQkJCXNiLmFwcGVuZChjKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNGUU4oU3RyaW5nIGZxbikgewotCQlTdHJpbmcgcmVzOwotCQlpbnQgYnNJbmRleCA9IGZxbi5pbmRleE9mKEJSQUNLRVRfU1FVQVJFKTsKLQkJaW50IGJhSW5kZXggPSBmcW4uaW5kZXhPZihCUkFDS0VUX0FOR1VMQVIpOwotCQlpZiAoYnNJbmRleCA9PSAtMSkgewotCQkJaWYgKGJhSW5kZXggPT0gLTEpIHJlcyA9IGZxbjsKLQkJCWVsc2UgcmVzID0gZnFuLnN1YnN0cmluZygwLCBiYUluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWlmIChiYUluZGV4ID09IC0xKSByZXMgPSBmcW4uc3Vic3RyaW5nKDAsIGJzSW5kZXgpOwotCQkJZWxzZSByZXMgPSBmcW4uc3Vic3RyaW5nKDAsIE1hdGgubWF4KGJzSW5kZXgsIGJhSW5kZXgpKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgb2YgdGhlIGVudGl0eSBmaWVsZAotCSAqIAotCSAqIEBwYXJhbSBmcW5UeXBlTmFtZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZxblR5cGVOYW1lKFN0cmluZyBmcW5UeXBlTmFtZSkgewotCQlmcW5UeXBlTmFtZSA9IHJlbW92ZVNwYWNlcyhmcW5UeXBlTmFtZSk7Ci0JCVN0cmluZyBmcW5CYXNpY1R5cGVOYW1lID0gZ2V0QmFzaWNGUU4oZnFuVHlwZU5hbWUpOwotCQlpZiAoZnFuQmFzaWNUeXBlTmFtZS5pbmRleE9mKERPVCkgPT0gLTEpIHsKLQkJCWlmIChWQUxJRF9QS19UWVBFU19TSE9SVC5jb250YWlucyhmcW5CYXNpY1R5cGVOYW1lKSkgewotCQkJCXRoaXMuZnFuVHlwZU5hbWUgPSBQQUNLQUdFX0pBVkFfTEFORyArIGZxblR5cGVOYW1lOwotCQkJCXNldFR5cGUoZnFuVHlwZU5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQl0aGlzLmZxblR5cGVOYW1lID0gZnFuVHlwZU5hbWU7Ci0JCQkJc2V0VHlwZShmcW5UeXBlTmFtZSk7Ci0JCQl9CQkJCi0JCX0gZWxzZSB7Ci0JCQl0aGlzLmZxblR5cGVOYW1lID0gZnFuVHlwZU5hbWU7Ci0JCQlzZXRUeXBlKGdldFNpbXBsZU5hbWUoZnFuVHlwZU5hbWUpKTsKLQkJfQkJCi0JfQotCi0JLyoqCi0JICogQHJldHVybiB3aGV0aGVyIHRoZSB0eXBlIG9mIHRoZSBlbnRpdHkgZmllbGQgaXMgYm9vbGVhbi4gVGhlIGluZm9ybWF0aW9uIGNvdWxkIGJlIHVzZWQgCi0JICogd2hlbiB0aGUgbmFtZSBvZiBnZXR0ZXIgc2hvdWxkIGJlIGNvbnN0cnVjdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCb29sZWFuKCkgewotCQlyZXR1cm4gImJvb2xlYW4iLmVxdWFscyhnZXRUeXBlKCkpOwotCX0KLQkKLQkvKioKLQkgKiBGb3IgaW50ZXJuYWwgcHVycG9zZSBvbmx5Ci0JICogQ29udmVydCBmdWxseSBxdWFsaWZpZWQgbmFtZSB0byB0aGUgc2ltcGxlIG9uZQotCSAqIEBwYXJhbSBmdWxseU5hbWUKLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBmb3JtIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBwYXJhbWV0ZXIobGFzdCBzZWdtZW50KQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNpbXBsZU5hbWUoU3RyaW5nIGZ1bGx5TmFtZSkgewotCQlyZXR1cm4gZnVsbHlOYW1lLnN1YnN0cmluZyhmdWxseU5hbWUubGFzdEluZGV4T2YoRE9UKSArIDEpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQKLQkJCQkrICgoZnFuVHlwZU5hbWUgPT0gbnVsbCkgPyAwIDogZnFuVHlwZU5hbWUuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChuYW1lID09IG51bGwpID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBJbXBsZW1lbnQgZXF1YWxzLCBkZXBlbmRpbmcgZnJvbSBuYW1lIG9mIHRoZSBlbnRpdHkgZmllbGQgYW5kIGl0cyB0eXBlLgotCSAqIFRoZSB0eXBlIGlzIHByZXNlbnRlZCBmcm9tIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZmluYWwgRW50aXR5Um93IG90aGVyID0gKEVudGl0eVJvdykgb2JqOwotCQlpZiAoZnFuVHlwZU5hbWUgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmZxblR5cGVOYW1lICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFmcW5UeXBlTmFtZS5lcXVhbHMob3RoZXIuZnFuVHlwZU5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIubmFtZSAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghbmFtZS5lcXVhbHMob3RoZXIubmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9tb2RlbC9JRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0lFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyZWE0ODMuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2VudGl0eS9kYXRhL21vZGVsL0lFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBieSBTQVAgQUcsIFdhbGxkb3JmLiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFNBUCBBRyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIERpbWl0ZXIgRGltaXRyb3YsIGQuZGltaXRyb3ZAc2FwLmNvbSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmFwcGxpY2F0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuSUFubm90YXRpb25zRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLmludGVybmFsLmNvbW1vbi5vcGVyYXRpb25zLklOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzIGV4dGVuZHMgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMsIElBbm5vdGF0aW9uc0RhdGFNb2RlbCB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gIklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfQVNfU1VQRVJDTEFTUyA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5NQVBQRURfQVNfU1VQRVJDTEFTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkhFUklUQU5DRSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkhFUklUQU5DRV9TVFJBVEVHWSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5JTkhFUklUQU5DRV9TVFJBVEVHWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU1VQUE9SVCA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfU1VQUE9SVCI7IC8vJE5PTi1OTFMtMSRYTUxfU1VQUE9SVAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkFNRSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5YTUxfTkFNRSI7IC8vJE5PTi1OTFMtMSRYTUxfU1VQUE9SVAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OQU1FID0gIklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLkVOVElUWV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUVfREVGQVVMVCA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5UQUJMRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9GSUVMRFMgPSAiSUVudGl0eURhdGFNb2RlbFByb3BlcnRpZXMuRU5USVRZX0ZJRUxEUyI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtfRklFTERTID0gIklFbnRpdHlEYXRhTW9kZWxQcm9wZXJ0aWVzLlBLX0ZJRUxEUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9BQ0NFU1NfVFlQRSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5GSUVMRF9BQ0NFU1NfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BQ0NFU1NfVFlQRSA9ICJJRW50aXR5RGF0YU1vZGVsUHJvcGVydGllcy5QUk9QRVJUWV9BQ0NFU1NfVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9vcGVyYXRpb24vTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24uamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9lbnRpdHkvZGF0YS9vcGVyYXRpb24vTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczNDQyOC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZW50aXR5L2RhdGEvb3BlcmF0aW9uL05ld0VudGl0eUNsYXNzT3BlcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTIgYnkgU0FQIEFHLCBXYWxsZG9yZi4gCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBTQVAgQUcgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBEaW1pdGVyIERpbWl0cm92LCBkLmRpbWl0cm92QHNhcC5jb20gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm9wZXJhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzLkV4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5qZXQuSkVURW1pdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5qZXQuSkVURXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWxNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRDb21tb25Db3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LlBsYXRmb3JtVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLnN5bmNocm9uaXplcnMuQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5TeW5jaHJvbm91c1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuc3luY2hyb25pemVycy5TeW5jaHJvbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5Bbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LkVudGl0eVRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuRW50aXR5V2l6YXJkTXNnOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuSWRDbGFzc1RlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC5DcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24uaW50ZXJuYWwuYW5ub3RhdGlvbnMuY29udHJvbGxlci5Bbm5vdGF0aW9uc0NvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmNvbW1vbi5pbnRlcm5hbC5hbm5vdGF0aW9ucy5jb250cm9sbGVyLkFubm90YXRpb25zQ29udHJvbGxlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwuY29tbW9uLm9wZXJhdGlvbnMuSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucGx1Z2luLkoyRUVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUuaW50ZXJuYWwucHJvamVjdC5XVFBKRVRFbWl0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC5vcGVyYXRpb24uQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmludGVybmFsLm9wZXJhdGlvbi5JQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkFic3RyYWN0RGF0YU1vZGVsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZW5hYmxlbWVudC5ub251aS5XRlRXcmFwcGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uUGx1Z2luOwotCi0vKioKLSAqIFRoZSBOZXdFbnRpdHlDbGFzc09wZXJhdGlvbiBpcyBJRGF0YU1vZGVsT3BlcmF0aW9uIGZvbGxvd2luZyB0aGUKLSAqIElEYXRhTW9kZWwgd2l6YXJkIGFuZCBvcGVyYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbE9wZXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBUaGlzIG9wZXJhdGlvbiBpcyB1c2VkIHRvIGdlbmVyYXRlIGphdmEgY2xhc3NlcyBmb3IgdGhlIG5ldyBKUEEgZW50aXR5LiBJdCB1c2VzIAotICogRW50aXR5RGF0YU1vZGVsUHJvdmlkZXIgdG8gc3RvcmUgdGhlIGFwcHJvcHJpYXRlIHByb3BlcnRpZXMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgdGhlIG5ldyBlbnRpdHkuIAotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWxFbnRpdHlEYXRhTW9kZWxQcm92aWRlcgotICogCi0gKiBBIFdUUEpldEVtaXR0ZXIgZW50aXR5IHRlbXBsYXRlIGlzIHVzZWQgdG8gY3JlYXRlIHRoZSBjbGFzcyB3aXRoIHRoZSBlbnRpdHkgdGVtcGxhdGUuIAotICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wcm9qZWN0LldUUEpFVEVtaXR0ZXIKLSAqIEBzZWUgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmVudGl0eS5kYXRhLm1vZGVsLkNyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0byBzdWJzdGFudGlhbCBjaGFuZ2VzLgotICovCi1wdWJsaWMgY2xhc3MgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24gZXh0ZW5kcyBBYnN0cmFjdERhdGFNb2RlbE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX0pBVkEgPSAiLmphdmEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICIvIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT05fU1RSSU5HID0gIjEuMCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRCA9ICJGSUVMRCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJQUk9QRVJUWSI7Ly8kTk9OLU5MUy0xJAkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBXVFBfQ1VTVE9NSVpBVElPTl9QTFVHSU4gPSAiV1RQX0NVU1RPTUlaQVRJT05fUExVR0lOIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFOTk9UQVRFRF9FTlRJVFlfVEVNUExBVEVfRklMRSA9ICIvdGVtcGxhdGVzL2Fubm90YXRlZF9lbnRpdHkuamF2YWpldCI7IC8vJE5PTi1OTFMtMSQJCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RFTVBMQVRFX0ZJTEUgPSAiL3RlbXBsYXRlcy9lbnRpdHkuamF2YWpldCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJRENMQVNTX1RFTVBMQVRFX0ZJTEUgPSAiL3RlbXBsYXRlcy9pZENsYXNzLmphdmFqZXQiOyAvLyROT04tTkxTLTEkCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfSUQgPSAiYnVpbGRlcklkIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9UQUJMRSA9ICJTSU5HTEVfVEFCTEUiOy8vJE5PTi1OTFMtMSQKLQkKLQkvKioKLQkgKiBNZXRob2QgbmFtZSBvZiB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURV9NRVRIT0QgPSAiZ2VuZXJhdGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBjb25zdHJ1Y3RvciB3aGljaCBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24uIAotCSAqIEFuIGluc3RhbmNlIG9mIHRoZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIHNob3VsZCBiZSBwYXNzZWQgaW4uIFRoaXMgZG9lcyBub3QgYWNjZXB0Ci0JICogbnVsbCBwYXJhbWV0ZXIuIEl0IHdpbGwgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24jQXJ0aWZhY3RFZGl0UHJvdmlkZXJPcGVyYXRpb24oSURhdGFNb2RlbCkKLQkgKiBAc2VlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKLQkgKiAKLQkgKiBAcGFyYW0gZGF0YU1vZGVsCi0JICogQHJldHVybiBOZXdGaWx0ZXJDbGFzc09wZXJhdGlvbgotCSAqLwotCXB1YmxpYyBOZXdFbnRpdHlDbGFzc09wZXJhdGlvbihJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCX0KLQotCS8qKgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXhlY3V0ZSBtZXRob2QgZHJpdmVzIHRoZSBydW5uaW5nIG9mIHRoZSBvcGVyYXRpb24uIAotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBjcmVhdGUgdGhlIGphdmEgc291cmNlIGZvbGRlciwgY3JlYXRlIHRoZSBqYXZhIHBhY2thZ2UsIGFuZCB0aGVuIAotCSAqIHRoZSBlbnRpdHkgKG9yIG1hcHBlZCBhcyBzdXBlcmNsYXNzKSBhbmQgSUQgY2xhc3MgZmlsZXMgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRlbXBsYXRlcy4gCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwub3BlcmF0aW9uLldUUE9wZXJhdGlvbiNleGVjdXRlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqIEBzZWUgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBkb0V4ZWN1dGUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJQWRhcHRhYmxlIGluZm8pIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gewotCQkvLyBDcmVhdGUgc291cmNlIGZvbGRlciBpZiBpdCBkb2VzIG5vdCBleGlzdAotCQljcmVhdGVKYXZhU291cmNlQ29udGFpbmVyKCk7Ci0JCS8vIENyZWF0ZSBqYXZhIHBhY2thZ2UgaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkJSVBhY2thZ2VGcmFnbWVudCBwYWNrID0gY3JlYXRlSmF2YVBhY2thZ2UoKTsKLQkJLy8gR2VuZXJhdGUgZmlsdGVyIGNsYXNzIHVzaW5nIHRlbXBsYXRlcwotCQl0cnkgewotCQkJZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhtb25pdG9yLCBwYWNrKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gT0tfU1RBVFVTOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBqYXZhIHBhY2thZ2UgYXMgc3BlY2lmaWVkIGJ5IHRoZSBuZXcgamF2YQotCSAqIGNsYXNzIGRhdGEgbW9kZWwuIElmIHRoZSBwYWNrYWdlIGRvZXMgbm90IGV4aXN0LCBpdCB3aWxsIGNyZWF0ZSB0aGUKLQkgKiBwYWNrYWdlLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IHJldHVybiBudWxsLgotCSAqIAotCSAqIEBzZWUgSU5ld0phdmFDbGFzc0RhdGFNb2RlbFByb3BlcnRpZXMjSkFWQV9QQUNLQUdFCi0JICogQHNlZSBJUGFja2FnZUZyYWdtZW50Um9vdCNjcmVhdGVQYWNrYWdlRnJhZ21lbnQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGJvb2xlYW4sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqIAotCSAqIEByZXR1cm4gSVBhY2thZ2VGcmFnbWVudCB0aGUgamF2YSBwYWNrYWdlCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElQYWNrYWdlRnJhZ21lbnQgY3JlYXRlSmF2YVBhY2thZ2UoKSB7Ci0JCS8vIFJldHJpZXZlIHRoZSBwYWNrYWdlIG5hbWUgZnJvbSB0aGUgamF2YSBjbGFzcyBkYXRhIG1vZGVsCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLkpBVkFfUEFDS0FHRSk7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2tSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBtb2RlbAotCQkJCS5nZXRQcm9wZXJ0eShJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcy5KQVZBX1BBQ0tBR0VfRlJBR01FTlRfUk9PVCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFjayA9IHBhY2tSb290LmdldFBhY2thZ2VGcmFnbWVudChwYWNrYWdlTmFtZSk7Ci0JCS8vIEhhbmRsZSBkZWZhdWx0IHBhY2thZ2UKLQkJaWYgKHBhY2sgPT0gbnVsbCkgewotCQkJcGFjayA9IHBhY2tSb290LmdldFBhY2thZ2VGcmFnbWVudCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQkJCi0JCQotCQkvLyBDcmVhdGUgdGhlIHBhY2thZ2UgZnJhZ21lbnQgaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkJaWYgKCFwYWNrLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgcGFja05hbWUgPSBwYWNrLmdldEVsZW1lbnROYW1lKCk7Ci0JCQl0cnkgewotCQkJCXBhY2sgPSBwYWNrUm9vdC5jcmVhdGVQYWNrYWdlRnJhZ21lbnQocGFja05hbWUsIHRydWUsIG51bGwpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBwYWNrYWdlCi0JCXJldHVybiBwYWNrOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgY3JlYXRpb24gb2YgYSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIGFuZCB0aGUgV1RQSkVURW1pdHRlcgotCSAqIHRvIGNyZWF0ZSB0aGUgamF2YSBjbGFzcyB3aXRoIHRoZSBhbm5vdGF0ZWQgdGFncy4gVGhpcyBtZXRob2QgYWNjZXB0cyBudWxsIGZvciBtb25pdG9yLCBpdCBkb2VzIG5vdCBhY2NlcHQgbnVsbCAKLQkgKiBmb3IgZnJhZ21lbnQuIElmIGFubm90YXRpb25zIGFyZSBub3QgYmVpbmcgdXNlZCB0aGUgdGFncyB3aWxsIGJlIG9taXR0ZWQgZnJvbSB0aGUgY2xhc3MuCi0JICogCi0JICogQHNlZSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsCi0JICogQHNlZSBOZXdFbnRpdHlDbGFzc09wZXJhdGlvbiNnZW5lcmF0ZVRlbXBsYXRlU291cmNlKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwsCi0JICogICAgICBJUHJvZ3Jlc3NNb25pdG9yKQotCSAqIAotCSAqIEBwYXJhbSBtb25pdG9yCi0JICogQHBhcmFtIGZyYWdtZW50Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogQHRocm93cyBXRlRXcmFwcGVkRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQYWNrYWdlRnJhZ21lbnQgZnJhZ21lbnQpIHRocm93cyBXRlRXcmFwcGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkgICAgLy8gQ3JlYXRlIHRoZSBlbnRpdHkgdGVtcGxhdGUgbW9kZWwKLQkgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCB0ZW1wTW9kZWwgPSBjcmVhdGVUZW1wbGF0ZU1vZGVsKCk7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0gICAgICAgIFN0cmluZyBlbnRpdHlDbGFzc1NvdXJjZSA9IG51bGw7Ci0gICAgICAgIFN0cmluZyBpZENsYXNzU291cmNlID0gbnVsbDsKLSAgICAgICAgLy8gR2VuZXJhdGUgdGhlIGphdmEgc291cmNlIGJhc2VkIG9uIHRoZSBlbnRpdHkgdGVtcGxhdGUgbW9kZWxzCi0gICAgICAgIHRyeSB7Ci0gICAgICAgIAlpZiAodGVtcE1vZGVsLmlzQXJ0aWZhY3RzQW5ub3RhdGVkKCkpIHsKLSAgICAgICAgCQlBbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZSB0ZW1wSW1wbCA9IEFubm90YXRlZEVudGl0eVRlbXBsYXRlLmNyZWF0ZShudWxsKTsKLSAgICAgICAgCQllbnRpdHlDbGFzc1NvdXJjZSA9IGdlbmVyYXRlVGVtcGxhdGVTb3VyY2UodGVtcE1vZGVsLCBBTk5PVEFURURfRU5USVRZX1RFTVBMQVRFX0ZJTEUsIHRlbXBJbXBsLCBtb25pdG9yKTsKLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgIAkJRW50aXR5VGVtcGxhdGUgdGVtcEltcGwgPSBFbnRpdHlUZW1wbGF0ZS5jcmVhdGUobnVsbCk7Ci0gICAgICAgIAkJZW50aXR5Q2xhc3NTb3VyY2UgPSBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKHRlbXBNb2RlbCwgRU5USVRZX1RFTVBMQVRFX0ZJTEUsIHRlbXBJbXBsLCBtb25pdG9yKTsKLSAgICAgICAgCX0KLSAgICAgICAgICAgIGlmICh0ZW1wTW9kZWwuaXNDb21wb3NpdGVQSygpKSB7Ci0gICAgICAgICAgICAJSWRDbGFzc1RlbXBsYXRlIHRlbXBJbXBsID0gSWRDbGFzc1RlbXBsYXRlLmNyZWF0ZShudWxsKTsKLSAgICAgICAgICAgIAlpZENsYXNzU291cmNlID0gZ2VuZXJhdGVUZW1wbGF0ZVNvdXJjZSh0ZW1wTW9kZWwsIElEQ0xBU1NfVEVNUExBVEVfRklMRSwgdGVtcEltcGwsIG1vbml0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFdGVFdyYXBwZWRFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZyYWdtZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgamF2YSBmaWxlCi0gICAgICAgICAgICBTdHJpbmcgamF2YUZpbGVOYW1lID0gdGVtcE1vZGVsLmdldENsYXNzTmFtZSgpICsgRE9UX0pBVkE7Ci0gICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZnJhZ21lbnQuZ2V0Q29tcGlsYXRpb25Vbml0KGphdmFGaWxlTmFtZSk7Ci0gICAgICAgICAgICAvLyBBZGQgdGhlIGNvbXBpbGF0aW9uIHVuaXQgdG8gdGhlIGphdmEgZmlsZQotICAgICAgICAgICAgaWYgKGN1ID09IG51bGwgfHwgIWN1LmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgY3UgPSBmcmFnbWVudC5jcmVhdGVDb21waWxhdGlvblVuaXQoamF2YUZpbGVOYW1lLCBlbnRpdHlDbGFzc1NvdXJjZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJRmlsZSBhRmlsZSA9IChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKTsKLSAgICAgICAgICAgIC8vIExldCB0aGUgYW5ub3RhdGlvbnMgY29udHJvbGxlciBwcm9jZXNzIHRoZSBhbm5vdGF0ZWQgcmVzb3VyY2UKLSAgICAgICAgICAgIGlmICh0ZW1wTW9kZWwuaXNBcnRpZmFjdHNBbm5vdGF0ZWQoKSkgewotICAgICAgICAgICAgCUFubm90YXRpb25zQ29udHJvbGxlciBjb250cm9sbGVyID0gQW5ub3RhdGlvbnNDb250cm9sbGVyTWFuYWdlci5JTlNUQU5DRS5nZXRBbm5vdGF0aW9uc0NvbnRyb2xsZXIocHJvamVjdCk7Ci0gICAgICAgICAgICAJaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgCQljb250cm9sbGVyLnByb2Nlc3MoYUZpbGUpOwotICAgICAgICAgICAgCX0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ3JlYXRlIElkQ2xhc3MgaWYgdGhlIHByaW1hcnkga2V5IGlzIGNvbXBsZXgKLSAgICAgICAgICAgIGlmIChpZENsYXNzU291cmNlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5UEtOYW1lID0gdGVtcE1vZGVsLmdldElkQ2xhc3NOYW1lKCkgKyBET1RfSkFWQTsKLSAgICAgICAgICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChlbnRpdHlQS05hbWUpOwotICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgY29tcGlsYXRpb24gdW5pdCB0byB0aGUgamF2YSBmaWxlCi0gICAgICAgICAgICAgICAgaWYgKGN1MSA9PSBudWxsIHx8ICFjdTEuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3UxID0gZnJhZ21lbnQuY3JlYXRlQ29tcGlsYXRpb25Vbml0KGVudGl0eVBLTmFtZSwgaWRDbGFzc1NvdXJjZSwgdHJ1ZSwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSAgICAgICAgICAgCQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoIXRlbXBNb2RlbC5pc0FydGlmYWN0c0Fubm90YXRlZCgpKSB7Ci0gICAgICAgIAlpZiAodGVtcE1vZGVsLmlzTm9uRW50aXR5U3VwZXJjbGFzcygpKSB7IAotICAgICAgICAJCWFkZE1hcHBlZFN1cGVyY2xhc3NUb1hNTCh0ZW1wTW9kZWwsIHByb2plY3QpLnNjaGVkdWxlKCk7Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCWFkZEVudGl0eVRvWE1MKHRlbXBNb2RlbCwgcHJvamVjdCkuc2NoZWR1bGUoKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICBpZiAodGVtcE1vZGVsLmlzQXJ0aWZhY3RzQW5ub3RhdGVkKCkgJiYgIUpwdEpwYUNvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKHByb2plY3QpKSB7Ci0gICAgICAgIAlyZWdpc3RlckNsYXNzSW5QZXJzaXN0ZW5jZVhtbCh0ZW1wTW9kZWwsIHByb2plY3QpLnNjaGVkdWxlKCk7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKioKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIFRoaXMgbWV0aG9kIHdpbGwgY3JlYXRlIGFuCi0gICAgICogaW5zdGFuY2Ugb2YgdGhlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwgdG8gYmUgdXNlZCBpbiBjb25qdW5jdGlvbgotICAgICAqIHdpdGggdGhlIFdUUEpFVEVtaXR0ZXIuIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybiBudWxsLgotICAgICAqIAotICAgICAqIEBzZWUgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbAotICAgICAqIEBzZWUgTmV3RW50aXR5Q2xhc3NPcGVyYXRpb24jZ2VuZXJhdGVVc2luZ1RlbXBsYXRlcyhJUHJvZ3Jlc3NNb25pdG9yLAotICAgICAqICAgICAgSVBhY2thZ2VGcmFnbWVudCkKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIENyZWF0ZUZpbHRlclRlbXBsYXRlTW9kZWwKLSAgICAgKi8KLSAgICBwcml2YXRlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgY3JlYXRlVGVtcGxhdGVNb2RlbCgpIHsKLSAgICAgICAgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCB0ZW1wbGF0ZU1vZGVsID0gbmV3IENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwobW9kZWwpOwotICAgICAgICByZXR1cm4gdGVtcGxhdGVNb2RlbDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBUaGlzIHdpbGwgdXNlIHRoZQotICAgICAqIFdUUEpFVEVtaXR0ZXIgdG8gY3JlYXRlIGFuIGFubm90YXRlZCBqYXZhIGZpbGUgYmFzZWQgb24gdGhlIHBhc3NlZCB0ZW1wbGF0ZSBtb2RlbC4gCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgYWNjZXB0IG51bGwgcGFyYW1ldGVycy4gSXQgd2lsbCBub3QgcmV0dXJuIG51bGwuIAotICAgICAqIElmIGFubm90YXRpb25zIGFyZSBub3QgdXNlZCwgaXQgd2lsbCB1c2UgdGhlIG5vbiBhbm5vdGF0ZWQgdGVtcGxhdGUgdG8gb21pdCB0aGUgYW5ub3RhdGVkIHRhZ3MuCi0gICAgICogCi0gICAgICogQHNlZSBOZXdFbnRpdHlDbGFzc09wZXJhdGlvbiNnZW5lcmF0ZVVzaW5nVGVtcGxhdGVzKElQcm9ncmVzc01vbml0b3IsCi0gICAgICogICAgICBJUGFja2FnZUZyYWdtZW50KQotICAgICAqIEBzZWUgSkVURW1pdHRlciNnZW5lcmF0ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLSAgICAgKiAgICAgIGphdmEubGFuZy5PYmplY3RbXSkKLSAgICAgKiBAc2VlIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdGVtcGxhdGVNb2RlbAotICAgICAqIEBwYXJhbSBtb25pdG9yCi0gICAgICogQHBhcmFtIHRlbXBsYXRlX2ZpbGUgCi0gICAgICogQHJldHVybiBTdHJpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIGphdmEgZmlsZQotICAgICAqIEB0aHJvd3MgSkVURXhjZXB0aW9uCi0gICAgICogQHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24gCi0gICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiAKLSAgICAgKiBAdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gCi0gICAgICogQHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uICAKLSAgICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZVRlbXBsYXRlU291cmNlKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgdGVtcGxhdGVNb2RlbCwgU3RyaW5nIHRlbXBsYXRlRmlsZSwgT2JqZWN0IHRlbXBsYXRlSW1wbCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSAKLSAgICAJCXRocm93cyBKRVRFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gewotICAgIAlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEoyRUVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWJvb2xlYW4gZHluYW1pY1RyYW5zbGF0aW9uID0gcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihKMkVFUGx1Z2luLkRZTkFNSUNfVFJBTlNMQVRJT05fT0ZfSkVUX1RFTVBMQVRFU19QUkVGX0tFWSk7Ci0JCWlmIChkeW5hbWljVHJhbnNsYXRpb24pIHsKLQkgICAgICAgIFVSTCB0ZW1wbGF0ZVVSTCA9IEZpbGVMb2NhdG9yLmZpbmQoSnB0SnBhVWlQbHVnaW4uaW5zdGFuY2UoKS5nZXRCdW5kbGUoKSwgbmV3IFBhdGgodGVtcGxhdGVGaWxlKSwgbnVsbCk7Ci0JICAgICAgICBjbGVhblVwT2xkRW1pdHRlclByb2plY3QoKTsKLQkgICAgICAgIFdUUEpFVEVtaXR0ZXIgZW1pdHRlciA9IG5ldyBXVFBKRVRFbWl0dGVyKHRlbXBsYXRlVVJMLnRvU3RyaW5nKCksIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLQkgICAgICAgIGVtaXR0ZXIuc2V0SW50ZWxsaWdlbnRMaW5raW5nRW5hYmxlZCh0cnVlKTsKLQkgICAgICAgIGVtaXR0ZXIuYWRkVmFyaWFibGUoV1RQX0NVU1RPTUlaQVRJT05fUExVR0lOLCBKcHRKcGFVaVBsdWdpbi5QTFVHSU5fSUQpOwotCSAgICAgICAgcmV0dXJuIGVtaXR0ZXIuZ2VuZXJhdGUobW9uaXRvciwgbmV3IE9iamVjdFtdIHsgdGVtcGxhdGVNb2RlbCB9KTsKLQkJfSBlbHNlIHsKLQkJCU1ldGhvZCBtZXRob2QgPSB0ZW1wbGF0ZUltcGwuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoR0VORVJBVEVfTUVUSE9ELCBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcyB9KTsKLQkJCXJldHVybiAoU3RyaW5nKSBtZXRob2QuaW52b2tlKHRlbXBsYXRlSW1wbCwgdGVtcGxhdGVNb2RlbCk7Ci0JCX0KLSAgICB9Ci0gICAgCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5LiBJdCB3aWxsIGNsZWFuIHVwIHRoZSBvbGQgZW1taXRlciBwcm9qZWN0IAotCSAqIGluIG9yZGVyIHRvIHByZXZlbnQgZ2VuZXJhdGlvbiBpc3N1ZXMgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFuVXBPbGRFbWl0dGVyUHJvamVjdCgpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChXVFBKRVRFbWl0dGVyLlBST0pFQ1RfTkFNRSk7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgIXByb2plY3QuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlJTWFya2VyW10gbWFya2VycyA9IHByb2plY3QuZmluZE1hcmtlcnMoSUphdmFNb2RlbE1hcmtlci5CVUlMRFBBVEhfUFJPQkxFTV9NQVJLRVIsIGZhbHNlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQlmb3IgKGludCBpID0gMCwgbCA9IG1hcmtlcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7Ci0JCQkJaWYgKCgoSW50ZWdlcikgbWFya2Vyc1tpXS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSkpLmludFZhbHVlKCkgPT0gSU1hcmtlci5TRVZFUklUWV9FUlJPUikgewotCQkJCQlwcm9qZWN0LmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBqYXZhIHNvdXJjZSBjb250YWluZXIgYXMgc3BlY2lmaWVkIGluIHRoZSBqYXZhCi0JICogY2xhc3MgZGF0YSBtb2RlbC4gSXQgd2lsbCBjcmVhdGUgdGhlIGphdmEgc291cmNlIGZvbGRlciBpZiBpdCBkb2VzIG5vdAotCSAqIGV4aXN0LiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHNlZSBJTmV3SmF2YUNsYXNzRGF0YU1vZGVsUHJvcGVydGllcyNTT1VSQ0VfRk9MREVSCi0JICogQHNlZSBJRm9sZGVyI2NyZWF0ZShib29sZWFuLCBib29sZWFuLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICogCi0JICogQHJldHVybiBJRm9sZGVyIHRoZSBqYXZhIHNvdXJjZSBmb2xkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSUNvbnRhaW5lciBjcmVhdGVKYXZhU291cmNlQ29udGFpbmVyKCkgewotCQkvLyBHZXQgdGhlIHNvdXJjZSBmb2xkZXIgbmFtZSBmcm9tIHRoZSBkYXRhIG1vZGVsCi0JCVN0cmluZyBjb250YWluZXJGdWxsUGF0aCA9IG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElOZXdKYXZhQ2xhc3NEYXRhTW9kZWxQcm9wZXJ0aWVzLlNPVVJDRV9GT0xERVIpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGFpbmVyKG5ldyBQYXRoKGNvbnRhaW5lckZ1bGxQYXRoKSk7Ci0JCS8vIElmIGNvbnRhaW5lciBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIHRoZSBmb2xkZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhdGgKLQkJaWYgKCEgY29udGFpbmVyLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCSgoSUZvbGRlcikgY29udGFpbmVyKS5jcmVhdGUodHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gUmV0dXJuIHRoZSBzb3VyY2UgZm9sZGVyCi0JCXJldHVybiBjb250YWluZXI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElBZGFwdGFibGUgaW5mbykgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBkb0V4ZWN1dGUobW9uaXRvciwgaW5mbyk7Ci0JfQotCQotCXB1YmxpYyBJUHJvamVjdCBnZXRUYXJnZXRQcm9qZWN0KCkgewotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShJQXJ0aWZhY3RFZGl0T3BlcmF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5QUk9KRUNUX05BTUUpOwotCQlyZXR1cm4gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQl9CQotCQkKLQkvKioKLQkgKiBBZGRzIGVudGl0eSB0byBPUk0gWE1MIGluIHNlcGFyYXRlIGpvYgotCSAqIAotCSAqIFNldCB0aGUganBhUHJvamVjdCBzeW5jaHJvbml6ZXJzIHRvIHN5bmNocm9ub3VzIHNvIHRoYXQgdGhlIG1vZGVsCi0JICogaGFzIGEgY2hhbmNlIHRvIGZ1bGx5IHVwZGF0ZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBzZXQgdGhpbmdzIG9uIGl0LiAoYnVnIDM0ODE0MykKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwgZW50aXR5IGRhdGEgbW9kZWwKLQkgKiBAcGFyYW0gcHJvamVjdCBKUEEgcHJvamVjdCBpbiB3aGljaCB0aGUgZW50aXR5IHdpbGwgYmUgY3JlYXRlZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEpvYiBhZGRFbnRpdHlUb1hNTChmaW5hbCBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsLCBmaW5hbCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUpvYiBqb2IgPSBuZXcgSm9iKEVudGl0eVdpemFyZE1zZy5BRERfRU5USVRZX1RPX1hNTCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0SnBhUHJvamVjdCgpOwotCQkJCVN5bmNocm9uaXplciBjb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIgPSBqcGFQcm9qZWN0LmdldENvbnRleHRNb2RlbFN5bmNocm9uaXplcigpOwotCQkJCUNhbGxiYWNrU3luY2hyb25pemVyIHVwZGF0ZVN5bmNocm9uaXplciA9IGpwYVByb2plY3QuZ2V0VXBkYXRlU3luY2hyb25pemVyKCk7Ci0JCQkJanBhUHJvamVjdC5zZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpKTsKLQkJCQlqcGFQcm9qZWN0LnNldFVwZGF0ZVN5bmNocm9uaXplcihidWlsZFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyKCkpOwotCQkJCXRyeSB7Ci0JCQkJCWZpbmFsIEpwYVhtbFJlc291cmNlIHhtbFJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UobW9kZWwsIHByb2plY3QpOwotCQkJCQlFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IChFbnRpdHlNYXBwaW5ncykgSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2plY3QpLmdldEpwYUZpbGUoeG1sUmVzb3VyY2UuZ2V0RmlsZSgpKS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncy5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgbW9kZWwuZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCQkJaWYgKG1vZGVsLmlzSW5oZXJpdGFuY2VTZXQoKSkgewotCQkJCQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koZ2V0TW9kZWxJbmhlcml0YW5jZVR5cGUobW9kZWwpKTsKLQkJCQkJfQotCi0JCQkJCWlmIChtb2RlbC5pc0VudGl0eU5hbWVTZXQoKSkgewotCQkJCQkJZW50aXR5LnNldFNwZWNpZmllZE5hbWUobW9kZWwuZ2V0RW50aXR5TmFtZSgpKTsKLQkJCQkJfQotCQkJCQlpZiAobW9kZWwuaXNUYWJsZU5hbWVTZXQoKSkgewotCQkJCQkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShtb2RlbC5nZXRUYWJsZU5hbWUoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKG1vZGVsLmlzQ29tcG9zaXRlUEsoKSkgewotCQkJCQkJZW50aXR5LmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShtb2RlbC5nZXRPcm1JZENsYXNzTmFtZSgpKTsKLQkJCQkJfQotCQkJCQlmb3IgKFN0cmluZyBmaWVsZE5hbWUgOiBtb2RlbC5nZXRQS0ZpZWxkcygpKSB7Ci0JCQkJCQlwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZChmaWVsZE5hbWUpLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkJCQl9Ci0KLQkJCQkJcGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKGdldE1vZGVsQWNjZXNzVHlwZShtb2RlbCkpOwotCi0JCQkJCXRyeSB7Ci0JCQkJCQl4bWxSZXNvdXJjZS5zYXZlSWZOZWNlc3NhcnkoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJICAgICAgICB9IGZpbmFsbHkgewotCQkJCQlqcGFQcm9qZWN0LnNldENvbnRleHRNb2RlbFN5bmNocm9uaXplcihjb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIpOwotCQkJCQlqcGFQcm9qZWN0LnNldFVwZGF0ZVN5bmNocm9uaXplcih1cGRhdGVTeW5jaHJvbml6ZXIpOyAgICAgICAJCi0JCSAgICAgICAgfQotCQkgICAgfQotCQl9OwotCQlyZXR1cm4gam9iOwotCX0KLQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZShDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsLCBJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChtb2RlbC5pc01hcHBpbmdYTUxEZWZhdWx0KCkpIHsKLQkJCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKG1vZGVsLmdldE1hcHBpbmdYTUxOYW1lKCkpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyBtYXBwZWQgc3VwZXJjbGFzcyB0byBPUk0gWE1MIGluIHNlcGFyYXRlIGpvYgotCSAqIAotCSAqIFNldCB0aGUganBhUHJvamVjdCBzeW5jaHJvbml6ZXJzIHRvIHN5bmNocm9ub3VzIHNvIHRoYXQgdGhlIG1vZGVsCi0JICogaGFzIGEgY2hhbmNlIHRvIGZ1bGx5IHVwZGF0ZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBzZXQgdGhpbmdzIG9uIGl0LiAoYnVnIDM0ODE0MykKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwgZW50aXR5IGRhdGEgbW9kZWwKLQkgKiBAcGFyYW0gcHJvamVjdCBKUEEgcHJvamVjdCBpbiB3aGljaCB0aGUgZW50aXR5IHdpbGwgYmUgY3JlYXRlZAotCSAqIEByZXR1cm4gdGhlIGNyZWF0ZWQgam9iCi0JICovCi0JcHJpdmF0ZSBKb2IgYWRkTWFwcGVkU3VwZXJjbGFzc1RvWE1MKGZpbmFsIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoRW50aXR5V2l6YXJkTXNnLkFERF9NQVBQRURfU1VQRVJDTEFTU19UT19YTUwpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldEpwYVByb2plY3QoKTsKLQkJCQlTeW5jaHJvbml6ZXIgY29udGV4dE1vZGVsU3luY2hyb25pemVyID0ganBhUHJvamVjdC5nZXRDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKTsKLQkJCQlDYWxsYmFja1N5bmNocm9uaXplciB1cGRhdGVTeW5jaHJvbml6ZXIgPSBqcGFQcm9qZWN0LmdldFVwZGF0ZVN5bmNocm9uaXplcigpOwotCQkJCWpwYVByb2plY3Quc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKGJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKSk7Ci0JCQkJanBhUHJvamVjdC5zZXRVcGRhdGVTeW5jaHJvbml6ZXIoYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplcigpKTsKLQkJCQl0cnkgewotCQkJCQlmaW5hbCBKcGFYbWxSZXNvdXJjZSB4bWxSZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKG1vZGVsLCBwcm9qZWN0KTsKLQkJCQkJRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSAoRW50aXR5TWFwcGluZ3MpIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdChwcm9qZWN0KS5nZXRKcGFGaWxlKHhtbFJlc291cmNlLmdldEZpbGUoKSkuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgbW9kZWwuZ2V0UXVhbGlmaWVkSmF2YUNsYXNzTmFtZSgpKTsKLQkJCQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQkJCQlpZiAobW9kZWwuaXNDb21wb3NpdGVQSygpKSB7Ci0JCQkJCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShtb2RlbC5nZXRPcm1JZENsYXNzTmFtZSgpKTsKLQkJCQkJfQotCi0JCQkJCWZvciAoU3RyaW5nIGZpZWxkTmFtZSA6IG1vZGVsLmdldFBLRmllbGRzKCkpIHsKLQkJCQkJCXBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKGZpZWxkTmFtZSkuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQkJCX0KLQotCQkJCQlwZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoZ2V0TW9kZWxBY2Nlc3NUeXBlKG1vZGVsKSk7Ci0KLQkJCQkJdHJ5IHsKLQkJCQkJCXhtbFJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkgICAgICAgIH0gZmluYWxseSB7Ci0JCQkJCWpwYVByb2plY3Quc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKGNvbnRleHRNb2RlbFN5bmNocm9uaXplcik7Ci0JCQkJCWpwYVByb2plY3Quc2V0VXBkYXRlU3luY2hyb25pemVyKHVwZGF0ZVN5bmNocm9uaXplcik7ICAgICAgIAkKLQkJICAgICAgICB9Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBqb2I7CQkKLQl9Ci0KLQlwcm90ZWN0ZWQgU3luY2hyb25pemVyIGJ1aWxkU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNTeW5jaHJvbml6ZXIodGhpcy5idWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWFuZCBidWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCgpIHsKLQkJcmV0dXJuIG5ldyBTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kIGltcGxlbWVudHMgQ29tbWFuZCB7Ci0JCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ2FsbGJhY2tTeW5jaHJvbml6ZXIgYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplcigpIHsKLQkJcmV0dXJuIG5ldyBDYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgYnVpbGRTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJZ2V0SnBhUHJvamVjdCgpLnVwZGF0ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0gICAgICAgIElQcm9qZWN0IHByb2plY3QgPSBnZXRUYXJnZXRQcm9qZWN0KCk7Ci0gICAgICAgIHJldHVybiBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JfQotCQotCXByb3RlY3RlZCBBY2Nlc3NUeXBlIGdldE1vZGVsQWNjZXNzVHlwZShDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBhY2Nlc3NUeXBlU3RyaW5nID0gRklFTEQ7Ci0JCWlmICghbW9kZWwuaXNGaWVsZEFjY2VzcygpKSB7Ci0JCQlhY2Nlc3NUeXBlU3RyaW5nID0gUFJPUEVSVFk7Ci0JCX0KLQkJcmV0dXJuIEFjY2Vzc1R5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoYWNjZXNzVHlwZVN0cmluZywgZ2V0SnBhUHJvamVjdCgpLmdldEpwYVBsYXRmb3JtKCksIEpwdENvbW1vbkNvcmVQbHVnaW4uSkFWQV9TT1VSQ0VfUkVTT1VSQ0VfVFlQRSk7Ly8gVE9ETwotCX0KLQotCXByb3RlY3RlZCBJbmhlcml0YW5jZVR5cGUgZ2V0TW9kZWxJbmhlcml0YW5jZVR5cGUoQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgaW5oZXJpdGFuY2VTdHJhdGVneSA9IG1vZGVsLmdldEluaGVyaXRhbmNlU3RyYXRlZ3lOYW1lKCk7Ci0JCWlmIChpbmhlcml0YW5jZVN0cmF0ZWd5LmVxdWFscyhFTVBUWV9TVFJJTkcpKSB7Ci0JCQlpbmhlcml0YW5jZVN0cmF0ZWd5ID0gU0lOR0xFX1RBQkxFOwotCQl9Ci0JCXJldHVybiBJbmhlcml0YW5jZVR5cGUuZnJvbU9ybVJlc291cmNlTW9kZWwoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlSW5oZXJpdGFuY2VUeXBlRnJvbVN0cmluZyhudWxsLCBpbmhlcml0YW5jZVN0cmF0ZWd5KSk7Ly9UT0RPCi0JfQotCi0JLyoqCi0JICogUmVnaXN0IHRoZSBjbGFzcyBpbiB0aGUgcGVyc2lzdGVuY2UueG1sCi0JICogCi0JICogQHBhcmFtIG1vZGVsIGVudGl0eSBkYXRhIG1vZGVsCi0JICogQHBhcmFtIHByb2plY3QgSlBBIHByb2plY3QgaW4gd2hpY2ggdGhlIGVudGl0eSB3aWxsIGJlIGNyZWF0ZWQKLQkgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIGpvYgotCSAqLwotCXByaXZhdGUgSm9iIHJlZ2lzdGVyQ2xhc3NJblBlcnNpc3RlbmNlWG1sKGZpbmFsIENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwgbW9kZWwsIGZpbmFsIElQcm9qZWN0IHByb2plY3QpIHsKLQkJSm9iIGpvYiA9IG5ldyBKb2IoRW50aXR5V2l6YXJkTXNnLkFQUExZX0NIQU5HRVNfVE9fUEVSU0lTVEVOQ0VfWE1MKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCQkJZmluYWwgSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSBqcGFQcm9qZWN0LmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gKFhtbFBlcnNpc3RlbmNlKSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCQkJCQkJRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzID0geG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQkJCQkJCVhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXRzLmdldCgwKTsvLyBNdWx0aXBseSBwZXJzaXN0ZW5jZSB1bml0IHN1cHBvcnQKLQkJCQkJCQkKLQkJCQkJCQlpZiAoIW1vZGVsLmlzTm9uRW50aXR5U3VwZXJjbGFzcygpKSB7Ci0JCQkJCQkJCVhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCQkJCQkJCWNsYXNzUmVmLnNldEphdmFDbGFzcyhtb2RlbC5nZXRRdWFsaWZpZWRKYXZhQ2xhc3NOYW1lKCkpOwotCQkJCQkJCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJcmV0dXJuIGpvYjsKLQotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gaW5wdXQgdGhlIG5hbWUgb2YgbWFwcGluZyBYTUwgZnJvbSB0aGUgY2xhc3Mgd2l6YXJkIHBhZ2UuIEl0IGlzIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgc291cmNlIGZvbGRlcgotCSAqIGFuZCBpbmNsdWRlcyBNRVRBLUlORiBmb2xkZXIKLQkgKiBAcmV0dXJuIHRoZSBzaW1wbGUgbmFtZSBvZiB0aGUgbWFwcGluZyBYTUwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMYXN0U2VnbWVudChTdHJpbmcgaW5wdXQpIHsKLQkJU3RyaW5nIG91dHB1dCA9IGlucHV0OwotCQlpZiAoaW5wdXQuaW5kZXhPZihTRVBBUkFUT1IpICE9IC0xKSB7Ci0JCQlvdXRwdXQgPSBpbnB1dC5zdWJzdHJpbmcoaW5wdXQubGFzdEluZGV4T2YoU0VQQVJBVE9SKSArIDEpOwotCQl9Ci0JCXJldHVybiBvdXRwdXQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Bc3NvY2lhdGlvbkZpZ3VyZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Bc3NvY2lhdGlvbkZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2M0NzRhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25GaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNob3Bib3hBbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkNvbG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvbHlnb25EZWNvcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Qb2x5bGluZUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlhZTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotCi0KLWNsYXNzIEFzc29jaWF0aW9uRmlndXJlIGV4dGVuZHMgQnV0dG9uIHsKLQkKLQlDb2xvciBlbmFibGVkQ29sb3IgPSBuZXcgQ29sb3IoIG51bGwsIDE0LDY2LDExNSk7Ci0JQ29sb3IgZGlzYWJsZWRMaW5lQ29sb3IgPSBuZXcgQ29sb3IoIG51bGwsIDE5MiwyMTUsMjMxKTsKLQlDb2xvciBzZWxlY3RlZENvbG9yID0gbmV3IENvbG9yKCBudWxsLCAyMzIsMjMyLDIzMiApOwotCi0JQ29sb3Igc2VsZWN0ZWRCb3JkZXJDb2xvciA9IG5ldyBDb2xvciggbnVsbCwgMTQsNjYsMTE1ICk7Ci0JTGluZUJvcmRlciBzZWxlY3RlZEJvcmRlciA9IG5ldyBMaW5lQm9yZGVyKCBzZWxlY3RlZEJvcmRlckNvbG9yLCAyICk7Ci0JTGluZUJvcmRlciB1bnNlbGVjdGVkQm9yZGVyID0gbmV3IExpbmVCb3JkZXIoIENvbG9yQ29uc3RhbnRzLmxpZ2h0R3JheSwgMSApOwotCUZvbnQgZGVzY3JpcHRpb25Gb250ID0gbmV3IEZvbnQobnVsbCwgIkFyaWFsIiwgOCwgU1dULk5PTkUpOwotCQotCS8qKgotCSAqIFRoZSBtb2RlbCBiZWhpbmQgdGhlIHRoZSB2aWV3IG9iamVjdAotCSAqLwotCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uOwotCVRhYmxlRmlndXJlIHRhYmxlRmlnMTsKLQlUYWJsZUZpZ3VyZSB0YWJsZUZpZzI7Ci0JUG9seWxpbmVDb25uZWN0aW9uIGNvbm5lY3Rpb24gOwotCQotCVBvbHlnb25EZWNvcmF0aW9uIHJlZmVycmVyRGVjb3JhdGlvbiA7CQotCVBvbHlnb25EZWNvcmF0aW9uIHJlZmVyZW5jZWREZWNvcmF0aW9uIDsKLQotCUxhYmVsIHJlZmVyZW5jZWRMYWJlbCA7Ci0JTGFiZWwgcmVmZXJyZXJMYWJlbCA7Ci0JTGFiZWwgZGVzY3JpcHRpb25MYWJlbCA7Ci0JCi0JQXNzb2NpYXRpb25GaWd1cmUoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24sIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJdGhpcy5hc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9uOwotCQkKLQkJWFlMYXlvdXQgY29udGVudHNMYXlvdXQgPSBuZXcgWFlMYXlvdXQoKTsKLQkJc2V0TGF5b3V0TWFuYWdlcihjb250ZW50c0xheW91dCk7Ci0JCXNldEJvcmRlciggdW5zZWxlY3RlZEJvcmRlciApOwotCi0JCS8vQ3JlYXRlIHRoZSBmaWd1cmVzIGZvciByZWZlcnJlciB0YWJsZSBhbmQgcmVmZXJlbmNlZCB0YWJsZQotCQl0YWJsZUZpZzEgPSBuZXcgVGFibGVGaWd1cmUoIGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKS5nZXROYW1lKCksIHJlc291cmNlTWFuYWdlcik7IAotCQl0YWJsZUZpZzIgPSBuZXcgVGFibGVGaWd1cmUoIGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSwgcmVzb3VyY2VNYW5hZ2VyKTsgCi0JCQotCQljb250ZW50c0xheW91dC5zZXRDb25zdHJhaW50KHRhYmxlRmlnMSwgbmV3IFJlY3RhbmdsZSgxMCwxMCwxNTAsMjApKTsKLQkJY29udGVudHNMYXlvdXQuc2V0Q29uc3RyYWludCh0YWJsZUZpZzIsIG5ldyBSZWN0YW5nbGUoMjgwLCAxMCwgMTUwLCAyMCkpOwotCi0JCWNvbm5lY3Rpb24gPSBkcmF3Q29ubmVjdGlvbih0YWJsZUZpZzEsIHRhYmxlRmlnMik7Ci0KLQkJYWRkKHRhYmxlRmlnMSk7Ci0JCWFkZCh0YWJsZUZpZzIpOwotCQlhZGQoY29ubmVjdGlvbik7Ci0JCQotCi0JCWRlc2NyaXB0aW9uTGFiZWwgPSBuZXcgTGFiZWwoIiIpOwotCQljb250ZW50c0xheW91dC5zZXRDb25zdHJhaW50KGRlc2NyaXB0aW9uTGFiZWwsIG5ldyBSZWN0YW5nbGUoMTAsMzAsLTEsLTEpKTsKLQkJZGVzY3JpcHRpb25MYWJlbC5zZXRGb250KCBkZXNjcmlwdGlvbkZvbnQgKTsgCi0JCWFkZChkZXNjcmlwdGlvbkxhYmVsKTsKLQotCQkvL3NldCB3aGl0ZSBiYWNrZ3JvdW5kCi0JCXRoaXMuc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJCi0JCXVwZGF0ZSgpOwotCQkKLQl9Ci0KLQlwcml2YXRlIFBvbHlsaW5lQ29ubmVjdGlvbiBkcmF3Q29ubmVjdGlvbihUYWJsZUZpZ3VyZSB0YWJsZUZpZzEsCi0JCQlUYWJsZUZpZ3VyZSB0YWJsZUZpZzIpIHsKLQkJLyogQ3JlYXRpbmcgdGhlIGNvbm5lY3Rpb24gKi8KLQkJUG9seWxpbmVDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgUG9seWxpbmVDb25uZWN0aW9uKCk7Ci0JCUNob3Bib3hBbmNob3Igc291cmNlQW5jaG9yID0gbmV3IENob3Bib3hBbmNob3IodGFibGVGaWcxKTsKLQkJQ2hvcGJveEFuY2hvciB0YXJnZXRBbmNob3IgPSBuZXcgQ2hvcGJveEFuY2hvcih0YWJsZUZpZzIpOwotCQljb25uZWN0aW9uLnNldFNvdXJjZUFuY2hvcihzb3VyY2VBbmNob3IpOwotCQljb25uZWN0aW9uLnNldFRhcmdldEFuY2hvcih0YXJnZXRBbmNob3IpOwotCQkKLQkJLyogQ3JlYXRpbmcgdGhlIGRlY29yYXRpb24gKi8KLQkJcmVmZXJyZXJEZWNvcmF0aW9uID0gbmV3IFNtb290aFBvbHlnb25EZWNvcmF0aW9uKCk7Ci0JCWNvbm5lY3Rpb24uc2V0U291cmNlRGVjb3JhdGlvbihyZWZlcnJlckRlY29yYXRpb24pOwotCi0JCXJlZmVyZW5jZWREZWNvcmF0aW9uID0gbmV3IFNtb290aFBvbHlnb25EZWNvcmF0aW9uKCk7Ci0JCWNvbm5lY3Rpb24uc2V0VGFyZ2V0RGVjb3JhdGlvbihyZWZlcmVuY2VkRGVjb3JhdGlvbik7Ci0JCQotCQkKLQkJLyogQWRkaW5nIGxhYmVscyB0byB0aGUgY29ubmVjdGlvbiAqLwotCQlDb25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yIHNvdXJjZUVuZHBvaW50TG9jYXRvciA9IAotCQkJbmV3IENvbm5lY3Rpb25FbmRwb2ludExvY2F0b3IoY29ubmVjdGlvbiwgZmFsc2UpOwotCQlzb3VyY2VFbmRwb2ludExvY2F0b3Iuc2V0VkRpc3RhbmNlKC01KTsKLQkJcmVmZXJyZXJMYWJlbCA9IG5ldyBMYWJlbCgiIik7Ci0JCWNvbm5lY3Rpb24uYWRkKHJlZmVycmVyTGFiZWwsIHNvdXJjZUVuZHBvaW50TG9jYXRvcik7Ci0KLQkJQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvciB0YXJnZXRFbmRwb2ludExvY2F0b3IgPSAKLQkJICAgICAgICBuZXcgQ29ubmVjdGlvbkVuZHBvaW50TG9jYXRvcihjb25uZWN0aW9uLCB0cnVlKTsKLQkJdGFyZ2V0RW5kcG9pbnRMb2NhdG9yLnNldFZEaXN0YW5jZSgtNSk7Ci0JCXJlZmVyZW5jZWRMYWJlbCA9IG5ldyBMYWJlbCgiIik7Ci0JCWNvbm5lY3Rpb24uYWRkKHJlZmVyZW5jZWRMYWJlbCwgdGFyZ2V0RW5kcG9pbnRMb2NhdG9yKTsKLQotCQlDb25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yIHJlbGF0aW9uc2hpcExvY2F0b3IgPSAKLQkJCW5ldyBDb25uZWN0aW9uRW5kcG9pbnRMb2NhdG9yKGNvbm5lY3Rpb24sdHJ1ZSk7Ci0JCXJlbGF0aW9uc2hpcExvY2F0b3Iuc2V0VURpc3RhbmNlKDEwKTsKLQkJcmVsYXRpb25zaGlwTG9jYXRvci5zZXRWRGlzdGFuY2UoLTIwKTsKLQkJTGFiZWwgcmVsYXRpb25zaGlwTGFiZWwgPSBuZXcgTGFiZWwoImNvbnRhaW5zIik7Ci0JCWNvbm5lY3Rpb24uYWRkKHJlbGF0aW9uc2hpcExhYmVsLHJlbGF0aW9uc2hpcExvY2F0b3IpOwotCQlyZXR1cm4gY29ubmVjdGlvbjsKLQl9Ci0KLQlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0QXNzb2NpYXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLmFzc29jaWF0aW9uOwotCX0gCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0ZWQgKCBib29sZWFuIGlzU2VsZWN0ZWQgKXsKLQkJdGhpcy5zZXRCYWNrZ3JvdW5kQ29sb3IoIGlzU2VsZWN0ZWQgPyBzZWxlY3RlZENvbG9yIDogQ29sb3JDb25zdGFudHMud2hpdGUgKTsKLQkJdGhpcy5zZXRCb3JkZXIoaXNTZWxlY3RlZD8gc2VsZWN0ZWRCb3JkZXIgOiB1bnNlbGVjdGVkQm9yZGVyKTsKLQl9Ci0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSB2aWV3IHdpdGggdGhlIGNoYW5nZXMgdXNlciBtYWRlIG9uIHRoZSBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpewotCQlib29sZWFuIGlzR2VuZXJhdGVkID0gYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKTsKLQkJCi0JCWNvbm5lY3Rpb24uc2V0Rm9yZWdyb3VuZENvbG9yKCBpc0dlbmVyYXRlZD8gZW5hYmxlZENvbG9yOiBkaXNhYmxlZExpbmVDb2xvciApOwotCQkKLQkJdGFibGVGaWcxLnNldEVuYWJsZWQoaXNHZW5lcmF0ZWQpOwotCQl0YWJsZUZpZzIuc2V0RW5hYmxlZChpc0dlbmVyYXRlZCk7Ci0JCWRlc2NyaXB0aW9uTGFiZWwuc2V0Rm9yZWdyb3VuZENvbG9yKGlzR2VuZXJhdGVkPyBlbmFibGVkQ29sb3I6IGRpc2FibGVkTGluZUNvbG9yKTsKLQotCQkvL3BhaW50RGlyZWN0aW9uYWxpdHlBbmRDYXJkaW5hbGl0eSAKLQkJU3RyaW5nIGNhcmRpbmFsaXR5U3RyOwotCQlTdHJpbmcgZGlyZWN0aW9uYWxpdHkgPSBhc3NvY2lhdGlvbi5nZXREaXJlY3Rpb25hbGl0eSgpOwotCQlTdHJpbmcgY2FyZGluYWxpdHkgPSBhc3NvY2lhdGlvbi5nZXRDYXJkaW5hbGl0eSgpOwotCQkvL0RyYXcgcmVmZXJyZXJSb2xlCi0JCWlmIChjYXJkaW5hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uTUFOWV9UT19PTkUpIHx8IGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkpKSB7Ci0JCQljYXJkaW5hbGl0eVN0ciA9ICIqIjsKLQkJfSBlbHNlIHsKLQkJCWNhcmRpbmFsaXR5U3RyID0gIjEiOwotCQl9Ci0JCWlmIChkaXJlY3Rpb25hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uQklfREkpIHx8IGRpcmVjdGlvbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PUFBPU0lURV9ESSkpIHsKLQkJCWNvbm5lY3Rpb24uc2V0U291cmNlRGVjb3JhdGlvbih0aGlzLnJlZmVycmVyRGVjb3JhdGlvbik7Ci0JCX1lbHNlewotCQkJY29ubmVjdGlvbi5zZXRTb3VyY2VEZWNvcmF0aW9uKG51bGwpOwotCQl9Ci0JCQotCQl0aGlzLnJlZmVycmVyTGFiZWwuc2V0VGV4dCggY2FyZGluYWxpdHlTdHIgKTsKLQkJCQotCQkvL0RyYXcgcmVmZXJlbmNlZFJvbGUKLQkJaWYgKGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSkgfHwgY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk9ORV9UT19PTkUpKSB7Ci0JCQljYXJkaW5hbGl0eVN0ciA9ICIxIjsKLQkJfSBlbHNlIHsKLQkJCWNhcmRpbmFsaXR5U3RyID0gIioiOwotCQl9Ci0JCWlmIChkaXJlY3Rpb25hbGl0eS5lcXVhbHMoQXNzb2NpYXRpb24uQklfREkpIHx8IGRpcmVjdGlvbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5OT1JNQUxfREkpKSB7Ci0JCQljb25uZWN0aW9uLnNldFRhcmdldERlY29yYXRpb24odGhpcy5yZWZlcmVuY2VkRGVjb3JhdGlvbik7Ci0JCX1lbHNlewotCQkJY29ubmVjdGlvbi5zZXRUYXJnZXREZWNvcmF0aW9uKG51bGwpOwotCQl9Ci0JCXRoaXMucmVmZXJlbmNlZExhYmVsLnNldFRleHQoY2FyZGluYWxpdHlTdHIpOwotCQkKLQkJU3RyaW5nIHRleHQgPSAiIjsKLQkJU3RyaW5nIHJlZmVycmVyVGFibGVOYW1lID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKTsKLQkJU3RyaW5nIHJlZmVyZW5jZWRUYWJsZSA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKLQkJaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSApICl7Ci0JCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9PbmVEZXNjLCByZWZlcmVuY2VkVGFibGUgLCByZWZlcnJlclRhYmxlTmFtZSApOyAKLQkJfWVsc2UgaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5PTkVfVE9fT05FICkgKXsKLQkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm9uZVRvT25lRGVzYywgcmVmZXJyZXJUYWJsZU5hbWUsIHJlZmVyZW5jZWRUYWJsZSApOwotCQl9ZWxzZSBpZiggY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWSkgKXsKLQkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb01hbnlEZXNjLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJlbmNlZFRhYmxlLCByZWZlcmVuY2VkVGFibGUsIHJlZmVycmVyVGFibGVOYW1lICk7CQkJCi0JCX0KLQkJCi0JCWlmKCBhc3NvY2lhdGlvbi5pc0N1c3RvbSgpICl7Ci0JCQljb25uZWN0aW9uLnNldExpbmVTdHlsZSggU1dULkxJTkVfRE9UKTsKLQkJfQotCQkKLQkJdGhpcy5kZXNjcmlwdGlvbkxhYmVsLnNldFRleHQodGV4dCk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuZGVzY3JpcHRpb25Gb250LmRpc3Bvc2UoKTsKLQkJdGhpcy5zZWxlY3RlZEJvcmRlckNvbG9yLmRpc3Bvc2UoKTsKLQkJdGhpcy5zZWxlY3RlZENvbG9yLmRpc3Bvc2UoKTsKLQkJdGhpcy5kaXNhYmxlZExpbmVDb2xvci5kaXNwb3NlKCk7Ci0JCXRoaXMuZW5hYmxlZENvbG9yLmRpc3Bvc2UoKTsKLQkJdGhpcy50YWJsZUZpZzEuZGlzcG9zZSgpOwotCQl0aGlzLnRhYmxlRmlnMi5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIGNsYXNzIFNtb290aFBvbHlnb25EZWNvcmF0aW9uIGV4dGVuZHMgUG9seWdvbkRlY29yYXRpb24KLQl7Ci0JCXB1YmxpYyBTbW9vdGhQb2x5Z29uRGVjb3JhdGlvbigpCi0JCXsKLQkJCXN1cGVyKCk7Ci0JCX0KLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBwYWludEZpZ3VyZShHcmFwaGljcyBncmFwaGljcykKLQkJewotCQkJaW50IHNhdmVkQW50aWFsaWFzID0gZ3JhcGhpY3MuZ2V0QW50aWFsaWFzKCk7Ci0JCQlncmFwaGljcy5zZXRBbnRpYWxpYXMoU1dULk9OKTsKLQkJCXN1cGVyLnBhaW50RmlndXJlKGdyYXBoaWNzKTsKLQkJCWdyYXBoaWNzLnNldEFudGlhbGlhcyhzYXZlZEFudGlhbGlhcyk7Ci0JCX0KLQl9Ci19IApkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Bc3NvY2lhdGlvblRhYmxlc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25UYWJsZXNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YzllNTQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Bc3NvY2lhdGlvblRhYmxlc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuLlNXVFV0aWwuY3JlYXRlQnV0dG9uOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuLlNXVFV0aWwuY3JlYXRlTGFiZWw7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5jcmVhdGVUZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLkFzc29jaWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25UYWJsZXNQYWdlIGV4dGVuZHMgTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlIHsKLQotCXByaXZhdGUgQnV0dG9uIHNpbXBsZUFzc29CdG47Ci0JcHJpdmF0ZSBCdXR0b24gbXRtQXNzb0J0bjsgCi0JcHJpdmF0ZSBUZXh0IHRhYmxlMVRleHRGaWVsZCA7Ci0JcHJpdmF0ZSBUZXh0IHRhYmxlMlRleHRGaWVsZCA7Ci0JcHJpdmF0ZSBUZXh0IGpvaW5UYWJsZVRleHRGaWVsZDsgCi0JcHJpdmF0ZSBCdXR0b24gam9pblRhYmxlQnJvd3NlOwotCQotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCQotCXB1YmxpYyBBc3NvY2lhdGlvblRhYmxlc1BhZ2UoT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXN1cGVyKGN1c3RvbWl6ZXIsICAiQXNzb2NpYXRpb25UYWJsZXNQYWdlIik7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyOwotCQlzZXRUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9kZXNjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXBvc2l0ZSk7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KDEsIHRydWUpKTsKLQkJCi0JCUdyb3VwIGFzc29jS2luZEdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5VTEwpOwotCQlpbnQgbkNvbHVtbnM9IDMgOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7Ci0JCWFzc29jS2luZEdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlhc3NvY0tpbmRHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9BU1NPQ0lBVElPTl9UQUJMRVMpOwotCQlhc3NvY0tpbmRHcm91cC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9hc3NvY0tpbmQpOwotCi0JCXNpbXBsZUFzc29CdG4gPSBjcmVhdGVCdXR0b24oYXNzb2NLaW5kR3JvdXAsIDMsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3NpbXBsZUFzc29jLCBTV1QuUkFESU8pOwotCQltdG1Bc3NvQnRuID0gY3JlYXRlQnV0dG9uKGFzc29jS2luZEdyb3VwLCAzLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9tMm1Bc3NvYywgU1dULlJBRElPKTsKLQotCQkKLQkJR3JvdXAgYXNzb2NUYWJsZXNHcm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OVUxMKTsKLQkJbkNvbHVtbnM9IDMgOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG5Db2x1bW5zOwotCQlhc3NvY1RhYmxlc0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSkpOwotCQlhc3NvY1RhYmxlc0dyb3VwLnNldExheW91dChsYXlvdXQpOwotCQkKLQkJCi0JCWFzc29jVGFibGVzR3JvdXAuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfYXNzb2NUYWJsZXMgKTsKLQkJCi0JCWNyZWF0ZUxhYmVsKGFzc29jVGFibGVzR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3RhYmxlMSk7Ci0JCXRhYmxlMVRleHRGaWVsZCA9IGNyZWF0ZVRleHQoYXNzb2NUYWJsZXNHcm91cCwgMSk7Ci0JCXRhYmxlMVRleHRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl1cGRhdGVQYWdlQ29tcGxldGUoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlCdXR0b24gYnJvd3NlcjEgPSBjcmVhdGVCdXR0b24oYXNzb2NUYWJsZXNHcm91cCwgMSwgIiIsIFNXVC5OT05FKTsKLQkJYnJvd3NlcjEuc2V0SW1hZ2UoIEltYWdlUmVwb3NpdG9yeS5nZXRCcm93c2VCdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlcikpOyAKLQotCQlicm93c2VyMS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVNlbGVjdFRhYmxlRGlhbG9nIGRsZyA9IG5ldyBTZWxlY3RUYWJsZURpYWxvZyhEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRBY3RpdmVTaGVsbCgpLCByZXNvdXJjZU1hbmFnZXIsIGN1c3RvbWl6ZXIuZ2V0VGFibGVOYW1lcygpKTsKLQkJCQlpZiggZGxnLm9wZW4oKSA9PURpYWxvZy5PSyApewotCQkJCQl0YWJsZTFUZXh0RmllbGQuc2V0VGV4dCggZGxnLmdldFNlbGVjdGVkVGFibGUoKSApOwotCQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX1JFRkVSUkVSX1RBQkxFLCB0YWJsZTFUZXh0RmllbGQuZ2V0VGV4dCgpKTsKLQkJCQkJZ2V0V2l6YXJkKCkuZ2V0Q29udGFpbmVyKCkudXBkYXRlQnV0dG9ucygpOwotCQkJCQkoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS51cGRhdGVUYWJsZU5hbWVzKCk7Ci0JCQkJfQotCQkJCXVwZGF0ZVBhZ2VDb21wbGV0ZSgpOwotCQkJfQotCQl9KTsKLQotCQljcmVhdGVMYWJlbChhc3NvY1RhYmxlc0dyb3VwLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90YWJsZTIpOwotCQl0YWJsZTJUZXh0RmllbGQgPSBjcmVhdGVUZXh0KGFzc29jVGFibGVzR3JvdXAsIDEpOwotCQl0YWJsZTJUZXh0RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIGJyb3dzZXIyID0gY3JlYXRlQnV0dG9uKGFzc29jVGFibGVzR3JvdXAsIDEsICIiLCBTV1QuTk9ORSk7Ci0JCWJyb3dzZXIyLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0QnJvd3NlQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpKTsgCi0KLQkJYnJvd3NlcjIuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTZWxlY3RUYWJsZURpYWxvZyBkbGcgPSBuZXcgU2VsZWN0VGFibGVEaWFsb2coIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHJlc291cmNlTWFuYWdlciwgY3VzdG9taXplci5nZXRUYWJsZU5hbWVzKCkpOwotCQkJCWlmKCBkbGcub3BlbigpID09IERpYWxvZy5PSyl7Ci0JCQkJCXRhYmxlMlRleHRGaWVsZC5zZXRUZXh0KCBkbGcuZ2V0U2VsZWN0ZWRUYWJsZSgpICk7Ci0JCQkJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dCggTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fUkVGRVJFTkNFRF9UQUJMRSwgdGFibGUyVGV4dEZpZWxkLmdldFRleHQoKSk7Ci0JCQkJCSgoTmV3QXNzb2NpYXRpb25XaXphcmQpZ2V0V2l6YXJkKCkpLnVwZGF0ZVRhYmxlTmFtZXMoKTsKLQkJCQl9Ci0JCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJY3JlYXRlTGFiZWwoYXNzb2NUYWJsZXNHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfaW50ZXJtZWRpYXRlVGFibGUgKTsKLQkJam9pblRhYmxlVGV4dEZpZWxkID0gY3JlYXRlVGV4dChhc3NvY1RhYmxlc0dyb3VwLCAxKTsKLQkJam9pblRhYmxlVGV4dEZpZWxkLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCWpvaW5UYWJsZUJyb3dzZSA9IGNyZWF0ZUJ1dHRvbihhc3NvY1RhYmxlc0dyb3VwLCAxLCAiIiwgU1dULk5PTkUpOwotCQlqb2luVGFibGVCcm93c2Uuc2V0SW1hZ2UoIEltYWdlUmVwb3NpdG9yeS5nZXRCcm93c2VCdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlcikpOyAKLQkJam9pblRhYmxlQnJvd3NlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkKLQkJam9pblRhYmxlQnJvd3NlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlTZWxlY3RUYWJsZURpYWxvZyBkbGcgPSBuZXcgU2VsZWN0VGFibGVEaWFsb2coIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCksIHJlc291cmNlTWFuYWdlciwgY3VzdG9taXplci5nZXRTY2hlbWEoKSApOwotCQkJCWlmKCBkbGcub3BlbigpID09IERpYWxvZy5PSyl7Ci0JCQkJCWpvaW5UYWJsZVRleHRGaWVsZC5zZXRUZXh0KCBkbGcuZ2V0U2VsZWN0ZWRUYWJsZSgpICk7Ci0JCQkJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dCggTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9UQUJMRSwgam9pblRhYmxlVGV4dEZpZWxkLmdldFRleHQoKSApOwotCQkJCQkoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS51cGRhdGVUYWJsZU5hbWVzKCk7Ci0JCQkJCWdldFdpemFyZCgpLmdldENvbnRhaW5lcigpLnVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQl9Ci0JCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCi0JCXNpbXBsZUFzc29CdG4uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlqb2luVGFibGVUZXh0RmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJam9pblRhYmxlVGV4dEZpZWxkLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCQkJam9pblRhYmxlVGV4dEZpZWxkLnNldFRleHQoIiIpOwotCQkJCWpvaW5UYWJsZUJyb3dzZS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk1BTllfVE9fT05FKTsKLQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5yZW1vdmUoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fVEFCTEUgKTsKLQkJCQkoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS51cGRhdGVUYWJsZU5hbWVzKCk7Ci0JCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0KLQkJbXRtQXNzb0J0bi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWpvaW5UYWJsZVRleHRGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCWpvaW5UYWJsZUJyb3dzZS5zZXRFbmFibGVkKHRydWUpOwotCQkJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dCggTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fQ0FESU5BTElUWSwgQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZKTsKLQkJCQkoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS51cGRhdGVUYWJsZU5hbWVzKCk7Ci0JCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwkJCi0JCQotCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSggZmFsc2UpOwotCQl0YWJsZTFUZXh0RmllbGQuc2V0Rm9jdXMoKTsgCi0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBpc1BhZ2VDb21wbGV0ZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVQYWdlQ29tcGxldGUoKSB7Ci0JCWlmKCB0aGlzLnRhYmxlMVRleHRGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPD0gMCB8fAotCQkJdGhpcy50YWJsZTJUZXh0RmllbGQuZ2V0VGV4dCgpLmxlbmd0aCgpIDw9IDApIHsKLQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYoIG10bUFzc29CdG4uZ2V0U2VsZWN0aW9uKCkgKXsKLQkJCWlmKCB0aGlzLmpvaW5UYWJsZVRleHRGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPD0gMCApewotCQkJCXNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Fzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25zTGlzdENvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWUxOTc4Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQXNzb2NpYXRpb25zTGlzdENvbXBvc2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuQWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkFjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5GaWd1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkZpZ3VyZUNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGluZUJvcmRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuVG9vbGJhckxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0vKioKLSAqIEEgRHJhdzJkIGZpZ3VyZSByZXByZXNlbnRpbmcgbGlzdCBvZiBhc3NvY2lhdGlvbnMgYmV0d2VlbiB0d28gZGF0YWJhc2UgdGFibGVzCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25zTGlzdENvbXBvc2l0ZSBleHRlbmRzIEZpZ3VyZUNhbnZhcyB7Ci0KLQlMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnM7ICAKLQlBc3NvY2lhdGlvblRvZ2dsZVNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyIDsKLQlUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgdGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlOyAvL3RoZSBwYXJlbnQgd2l6YXJkIHBhZ2UKLQlBc3NvY2lhdGlvbkZpZ3VyZSBzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlIDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQkKLQlwdWJsaWMgQXNzb2NpYXRpb25zTGlzdENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgdGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlLCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKXsKLQkJc3VwZXIocGFyZW50KTsKLQkJdGhpcy50YWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgPSB0YWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2U7Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyOwotCQkKLQkJc2V0Qm91bmRzKDEwLCAxMCAsIDUwMCwgMjAwKTsKLQkJQ29sb3IgYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAyNTUsMjU1LDI1NSk7Ci0JCXNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCi0JCUZpZ3VyZSBmaWd1cmUgPSBuZXcgRmlndXJlKCk7Ci0JCWZpZ3VyZS5zZXRMYXlvdXRNYW5hZ2VyKG5ldyBUb29sYmFyTGF5b3V0KCkpOwotCQlmaWd1cmUuc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKDEpKTsKLQkJdGhpcy5saXN0ZW5lciA9IG5ldyBBc3NvY2lhdGlvblRvZ2dsZVNlbGVjdGlvbkxpc3RlbmVyKCk7IAotCQkKLQkJdGhpcy5zZXRDb250ZW50cyhmaWd1cmUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUFzc29jaWF0aW9ucyhMaXN0PEFzc29jaWF0aW9uPiBhc3NvY2lhdGlvbnMpewotCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7Ci0JCXRoaXMuZGlzcG9zZUZpZ3VyZShmaWd1cmUpOwotCQkKLQkJdGhpcy5hc3NvY2lhdGlvbnMgPSBhc3NvY2lhdGlvbnM7Ci0JCWlmKCBhc3NvY2lhdGlvbnMgIT0gbnVsbCApewotCQkJZm9yKCBpbnQgaSA9IDA7IGkgPGFzc29jaWF0aW9ucy5zaXplKCk7IGkgKysgKXsKLQkJCQlBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbiA9IGFzc29jaWF0aW9ucy5nZXQoaSk7Ci0JCQkJQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWd1cmUgPSBuZXcgQXNzb2NpYXRpb25GaWd1cmUoYXNzb2NpYXRpb24sIHRoaXMucmVzb3VyY2VNYW5hZ2VyKTsKLQkJCQlhc3NvY0ZpZ3VyZS5hZGRBY3Rpb25MaXN0ZW5lciggbGlzdGVuZXIgKTsKLQkJCQlmaWd1cmUuYWRkKGFzc29jRmlndXJlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0U2VsZWN0ZWRBc3NvY2lhdGlvbigpewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlLmdldEFzc29jaWF0aW9uKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgdXBkYXRlU2VsZWN0ZWRBc3NvY2lhdGlvbigpewotCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7Ci0JCUxpc3Q8QXNzb2NpYXRpb25GaWd1cmU+IGFzc29jaWF0aW9uRmlndXJlcyA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQlmb3IoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWcgOiBhc3NvY2lhdGlvbkZpZ3VyZXMpewotCQkJaWYoIGFzc29jRmlnID09IHRoaXMuc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSl7Ci0JCQkJYXNzb2NGaWcudXBkYXRlKCk7IAotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEdldCB0aGUgYXNzb2NpYXRpb24ganVzdCBiZWZvcmUgdGhlIHNlbGVjdGVkIG9uZSBpbiBVSQotCSAqIEByZXR1cm4KLQkgKi8KLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgQXNzb2NpYXRpb24gZ2V0UHJldmlvdXNBc3NvY2lhdGlvbigpewotCQlGaWd1cmUgZmlndXJlID0gKEZpZ3VyZSl0aGlzLmdldENvbnRlbnRzKCk7Ci0JCUxpc3Q8QXNzb2NpYXRpb25GaWd1cmU+IGFzc29jaWF0aW9uRmlndXJlcyA9IGZpZ3VyZS5nZXRDaGlsZHJlbigpOwotCQlBc3NvY2lhdGlvbkZpZ3VyZSByZXQgPSBudWxsOwotCQlmb3IoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NGaWcgOiBhc3NvY2lhdGlvbkZpZ3VyZXMpewotCQkJaWYoIGFzc29jRmlnLmlzU2VsZWN0ZWQoKSApewotCQkJCWJyZWFrOyAKLQkJCX0KLQkJCXJldCA9IGFzc29jRmlnOwotCQl9Ci0JCXJldHVybiByZXQ9PW51bGw/bnVsbDpyZXQuZ2V0QXNzb2NpYXRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5kaXNwb3NlRmlndXJlKChGaWd1cmUpIGdldENvbnRlbnRzKCkpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUZpZ3VyZShGaWd1cmUgZmlndXJlKSB7Ci0JCWZvciAoQXNzb2NpYXRpb25GaWd1cmUgYXNzb2NpYXRpb25GaWd1cmUgOiAoTGlzdDxBc3NvY2lhdGlvbkZpZ3VyZT4pIGZpZ3VyZS5nZXRDaGlsZHJlbigpKSB7Ci0JCQlhc3NvY2lhdGlvbkZpZ3VyZS5yZW1vdmVBY3Rpb25MaXN0ZW5lcih0aGlzLmxpc3RlbmVyKTsKLQkJCWFzc29jaWF0aW9uRmlndXJlLmRpc3Bvc2UoKTsKLQkJfQotCQlmaWd1cmUucmVtb3ZlQWxsKCk7Ci0JCXRoaXMuc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSA9IG51bGw7Ci0JfQotCi0JY2xhc3MgQXNzb2NpYXRpb25Ub2dnbGVTZWxlY3Rpb25MaXN0ZW5lciBpbXBsZW1lbnRzIEFjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKEFjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQlBc3NvY2lhdGlvbkZpZ3VyZSBmaWd1cmUgPSAoQXNzb2NpYXRpb25GaWd1cmUgKWV2ZW50LmdldFNvdXJjZSgpIDsKLQkJCWZpZ3VyZS5zZXRTZWxlY3RlZCh0cnVlKTsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gZmlndXJlLmdldEFzc29jaWF0aW9uKCk7Ci0JCQl0YWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UudXBkYXRlQXNzb2NpYXRpb25FZGl0UGFuZWwoYXNzb2NpYXRpb24pOwotCQkJLy91bi1zZWxlY3QgdGhlIHByZXZpb3VzIHNlbGVjdGVkCi0JCQlpZiggc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZSAhPSBudWxsICAmJiBzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlIT0gZmlndXJlICl7Ci0JCQkJc2VsZWN0ZWRBc3NvY2lhdGlvbkZpZ3VyZS5zZXRTZWxlY3RlZCggZmFsc2UgKTsKLQkJCX0KLQkJCS8vSGlnaGxpZ2h0IG5ldyBzZWxlY3Rpb24KLQkJCXNlbGVjdGVkQXNzb2NpYXRpb25GaWd1cmUgPSBmaWd1cmU7Ci0JCQlzZWxlY3RlZEFzc29jaWF0aW9uRmlndXJlLnNldFNlbGVjdGVkKCB0cnVlICk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NhcmRpbmFsaXR5UGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9DYXJkaW5hbGl0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhNzNlNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NhcmRpbmFsaXR5UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci0KLQotcHVibGljIGNsYXNzIENhcmRpbmFsaXR5UGFnZSBleHRlbmRzIE5ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIExhYmVsIG10b0Rlc2NMYWJlbDsKLQlwcml2YXRlIExhYmVsIG90bURlc2NMYWJlbDsKLQlwcml2YXRlIExhYmVsIG90b0Rlc2NMYWJlbDsKLQlwcml2YXRlIExhYmVsIG10bURlc2NMYWJlbDsKLQkKLQlwcml2YXRlIEJ1dHRvbltdIGNhcmRpbmFsaXR5QnV0dG9ucyA9IG5ldyBCdXR0b25bNF07Ci0JCi0JcHJvdGVjdGVkIENhcmRpbmFsaXR5UGFnZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIpIHsKLQkJc3VwZXIoIGN1c3RvbWl6ZXIgLCAiQ2FyZGluYWxpdHlQYWdlIiApOwotCQlzZXRUaXRsZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY2FyZGluYWxpdHlQYWdlX3RpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jYXJkaW5hbGl0eVBhZ2VfZGVzYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gMSA7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0FTU09DSUFUSU9OX0NBUkRJTkFMSVRZKTsKLQotCQlDYXJkaW5hbGl0eVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IENhcmRpbmFsaXR5U2VsZWN0aW9uTGlzdGVuZXIoKTsKLQkJY2FyZGluYWxpdHlCdXR0b25zWzBdID0gY3JlYXRlUmFkaW9CdXR0b24oIGNvbXBvc2l0ZSwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9PbmUpOwotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMF0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIHNlbGVjdGlvbkxpc3RlbmVyICk7Ci0JCS8vRGVmYXVsdCBjYXJkaW5hbGl0eSBpcyBNVE8KLQkJY2FyZGluYWxpdHlCdXR0b25zWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZ2V0V2l6YXJkRGF0YU1vZGVsKCkucHV0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFksIEFzc29jaWF0aW9uLk1BTllfVE9fT05FKTsJCQotCi0JCW10b0Rlc2NMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm1hbnlUb09uZURlc2MpOwotCQkKLQkJY2FyZGluYWxpdHlCdXR0b25zWzFdID0gY3JlYXRlUmFkaW9CdXR0b24oIGNvbXBvc2l0ZSwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5vbmVUb01hbnkpOwotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIoIHNlbGVjdGlvbkxpc3RlbmVyICk7Ci0JCQotCQlvdG1EZXNjTGFiZWwgPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9PbmVEZXNjKTsKLQotCQljYXJkaW5hbGl0eUJ1dHRvbnNbMl0gPSBjcmVhdGVSYWRpb0J1dHRvbiggY29tcG9zaXRlLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm9uZVRvT25lKTsKLQkJY2FyZGluYWxpdHlCdXR0b25zWzJdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBzZWxlY3Rpb25MaXN0ZW5lciApOwotCi0JCW90b0Rlc2NMYWJlbCA9IGNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLm9uZVRvT25lRGVzYyk7Ci0KLQkJY2FyZGluYWxpdHlCdXR0b25zWzNdID0gY3JlYXRlUmFkaW9CdXR0b24oIGNvbXBvc2l0ZSwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9NYW55KTsKLQkJbXRtRGVzY0xhYmVsPSBjcmVhdGVMYWJlbChjb21wb3NpdGUsMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9NYW55RGVzYyk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKCB0cnVlICk7Ci0KLQkJY2FyZGluYWxpdHlCdXR0b25zWzBdLnNldEZvY3VzKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVXaXRoTmV3VGFibGVzKCkgewotCQlTdHJpbmcgczEgPSBnZXRSZWZlcnJlclRhYmxlTmFtZSgpIDsKLQkJU3RyaW5nIHMyID0gZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIDsKLQkJU3RyaW5nIGpvaW5UYWJsZU5hbWUgPSBnZXRKb2luVGFibGVOYW1lKCk7Ci0JCWlmKCBzMSA9PSBudWxsIHx8IHMyID09IG51bGwgKQotCQkJcmV0dXJuIDsKLQkJCi0JCXVwZGF0ZURlc2NyaXB0aW9uVGV4dChzMSwgczIpOwotCQlpZiggam9pblRhYmxlTmFtZSA9PSBudWxsICl7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbMF0uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWNhcmRpbmFsaXR5QnV0dG9uc1sxXS5zZXRFbmFibGVkKHRydWUpOwotCQkJY2FyZGluYWxpdHlCdXR0b25zWzJdLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbM10uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQltdG1EZXNjTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX1lbHNlewotCQkJY2FyZGluYWxpdHlCdXR0b25zWzBdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY2FyZGluYWxpdHlCdXR0b25zWzFdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY2FyZGluYWxpdHlCdXR0b25zWzJdLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJY2FyZGluYWxpdHlCdXR0b25zWzNdLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQljYXJkaW5hbGl0eUJ1dHRvbnNbM10uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJbXRtRGVzY0xhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJKChDb21wb3NpdGUpdGhpcy5nZXRDb250cm9sKCkpLmxheW91dCgpIDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVzY3JpcHRpb25UZXh0KFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCS8vTVRPCi0JCVN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvT25lRGVzYywgczIsIHMxKTsKLQkJbXRvRGVzY0xhYmVsLnNldFRleHQoIG1zZyApOwotCQkvL09UTQotCQltc2cgPSBTdHJpbmcuZm9ybWF0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMubWFueVRvT25lRGVzYywgczEsIHMyKTsKLQkJb3RtRGVzY0xhYmVsLnNldFRleHQoIG1zZyApOwotCQltc2cgPSBTdHJpbmcuZm9ybWF0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMub25lVG9PbmVEZXNjLCBzMSwgczIpOwotCQlvdG9EZXNjTGFiZWwuc2V0VGV4dCggbXNnICk7Ci0JCW1zZyA9IFN0cmluZy5mb3JtYXQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5tYW55VG9NYW55RGVzYywgczEsIHMyLCBzMiwgczEpOwotCQltdG1EZXNjTGFiZWwuc2V0VGV4dCggbXNnICk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmxpcFRvTmV4dFBhZ2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IDMwOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQkKLQkKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVSYWRpb0J1dHRvbihDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQgKSB7Ci0JCUJ1dHRvbiBidG4gPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULlJBRElPICk7Ci0JCWJ0bi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWJ0bi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ0bjsKLQl9Ci0JCi0KLQlwcml2YXRlIGNsYXNzIENhcmRpbmFsaXR5U2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiggZS5nZXRTb3VyY2UoKSA9PSBjYXJkaW5hbGl0eUJ1dHRvbnNbMF0pewotCQkJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZLCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORSk7Ci0JCQl9ZWxzZSBpZiggZS5nZXRTb3VyY2UoKSA9PSBjYXJkaW5hbGl0eUJ1dHRvbnNbMV0pewotCQkJCWdldFdpemFyZERhdGFNb2RlbCgpLnB1dChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZLCBBc3NvY2lhdGlvbi5PTkVfVE9fTUFOWSApOwotCQkJfWVsc2UgaWYoIGUuZ2V0U291cmNlKCkgPT0gY2FyZGluYWxpdHlCdXR0b25zWzJdKXsKLQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fQ0FESU5BTElUWSwgQXNzb2NpYXRpb24uT05FX1RPX09ORSk7Ci0JCQl9ZWxzZXsKLQkJCQlnZXRXaXphcmREYXRhTW9kZWwoKS5wdXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fQ0FESU5BTElUWSwgQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUNhcmRpbmFsaXR5UGFnZS50aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCQotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9DYXNjYWRlRGlhbG9nLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Nhc2NhZGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjNDE3Zi4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0Nhc2NhZGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlRyYXlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb25Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaGVscC5JV29ya2JlbmNoSGVscFN5c3RlbTsKLQotLyoqCi0gKiBTaW1wbGUgZGlhbG9nIGFsbG93cyB1c2VyIHRvIHNldCB0aGUgY2FzY2FkZSBwcm9wZXJ0eSBvZiBhbiBhc3NvY2lhdGlvblJvbGUuCi0gKiBUaGUgdmFsdWUgb2YgY2FzY2FkZSBjYW4gYmUgImFsbCIsIG9yIGFueSBjb21iaW5hdGlvbiBvZiBvdGhlciBzZWxlY3Rpb25zLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDYXNjYWRlRGlhbG9nIGV4dGVuZHMgVHJheURpYWxvZyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBBTExfQ0FTQ0FERVMgPSBuZXcgU3RyaW5nW10ge1RhZ05hbWVzLkFMTF9DQVNDQURFLCBUYWdOYW1lcy5QRVJTSVNUX0NBU0NBREUsIFRhZ05hbWVzLk1FUkdFX0NBU0NBREUKLQkJCSwgVGFnTmFtZXMuUkVNT1ZFX0NBU0NBREUsIFRhZ05hbWVzLlJFRlJFU0hfQ0FTQ0FERX07Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBBTExfQ0FTQ0FERVNfTEFCRUxTIAotCQk9IG5ldyBTdHJpbmdbXSB7ICImYWxsIiwgCQkvLyROT04tTkxTLTEkCi0JCQkJCQkiJnBlcnNpc3QiLAkJLy8kTk9OLU5MUy0xJAotCQkJCQkJIiZtZXJnZSIsCQkvLyROT04tTkxTLTEkCi0JCQkJCQkiJnJlbW92ZSIsCQkvLyROT04tTkxTLTEkCi0JCQkJCQkiJnJlZnJlc2gifTsJLy8kTk9OLU5MUy0xJAotCi0JCi0JcHJpdmF0ZSBCdXR0b25bXSBhbGxCdXR0b25zID0gbmV3IEJ1dHRvbltBTExfQ0FTQ0FERVMubGVuZ3RoXTsKLQotCXByaXZhdGUgQXNzb2NpYXRpb25Sb2xlIGFzc29jaWF0aW9uUm9sZTsKLQlwcml2YXRlIExpc3Q8U3RyaW5nPiBjYXNjYWRlczsKLQkKLQlwcm90ZWN0ZWQgQ2FzY2FkZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDYXNjYWRlRGlhbG9nIGNyZWF0ZShBc3NvY2lhdGlvblJvbGUgcm9sZSkgewotCQlDYXNjYWRlRGlhbG9nIGRsZyA9IG5ldyBDYXNjYWRlRGlhbG9nKERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldEFjdGl2ZVNoZWxsKCkgKTsKLQkJZGxnLnNldEFzc29jaWF0aW9uUm9sZShyb2xlKTsKLQkJcmV0dXJuIGRsZzsKLQl9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykgTWV0aG9kIGRlY2xhcmVkIG9uIFdpbmRvdy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0gICAgICAgIG5ld1NoZWxsLnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5zZWxlY3RDYXNjYWRlRGxnVGl0bGUpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKG5ld1NoZWxsLCBKcGFIZWxwQ29udGV4dElkcy5HRU5FUkFURV9FTlRJVElFU19XSVpBUkRfU0VMRUNUX0NBU0NBREUpOwotICAgIH0KLQkKLQlwcml2YXRlIHZvaWQgc2V0QXNzb2NpYXRpb25Sb2xlKEFzc29jaWF0aW9uUm9sZSByb2xlKSB7Ci0JCXRoaXMuYXNzb2NpYXRpb25Sb2xlID0gcm9sZTsKLQkJTGlzdDxTdHJpbmc+IGxpc3QgPSBTdHJpbmdVdGlsLnN0clRvTGlzdChhc3NvY2lhdGlvblJvbGUuZ2V0Q2FzY2FkZSgpLCAnLCcsIHRydWUvKnRyaW0qLyk7IC8vcm9sZS5nZXRDYXNjYWRlKCkgY29udGFpbnMgdGhlIGNvbW1hIHNlcGFyZWQgY2FzY2FkZXMgKHNlZSBiZWxvdykKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCQl9Ci0JCWNhc2NhZGVzID0gbGlzdDsKLQkJCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCWNyZWF0ZUNhc2NhZGVUeXBlc0dyb3VwKGNvbnRhaW5lcik7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29udGFpbmVyKTsKLQkJcmV0dXJuIGNvbnRhaW5lcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2FzY2FkZVR5cGVzR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IG5ldyBHcm91cChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZ3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyNzU7Ci0JCWdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCQlncm91cC5zZXRUZXh0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY2FzY2FkZSk7Ci0KLQkJZm9yKCBpbnQgaT0wOyBpPCBBTExfQ0FTQ0FERVMubGVuZ3RoOyBpICsrICl7Ci0JCQlCdXR0b24gY2hlY2tib3ggPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0spOwotCQkJY2hlY2tib3guc2V0VGV4dCggQUxMX0NBU0NBREVTX0xBQkVMU1tpXSApOwotCQkJY2hlY2tib3guc2V0U2VsZWN0aW9uKCBpc0luTGlzdChBTExfQ0FTQ0FERVNbaV0pICk7IC8vJE5PTi1OTFMtMSQKLQkJCWNoZWNrYm94LnNldERhdGEoQUxMX0NBU0NBREVTW2ldKTsKLQkJCWFsbEJ1dHRvbnNbaV0gPSBjaGVja2JveDsKLQkJCS8qaWYgPGNvZGU+YWxsPC9jb2RlPiBpcyBzZWxlY3RlZCB0aGVuIGRlc2VsZWN0IGFsbCBvdGhlcnMqLwotCQkJY2hlY2tib3guYWRkU2VsZWN0aW9uTGlzdGVuZXIoIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJQnV0dG9uIGIgPSAoQnV0dG9uKWUuZ2V0U291cmNlKCk7Ci0JCQkJCWlmKCBiLmdldFNlbGVjdGlvbigpICl7Ci0JCQkJCQlpZiggYiA9PSBhbGxCdXR0b25zWzBdICl7Ci0JCQkJCQkJZm9yKCBCdXR0b24gYnRuIDogYWxsQnV0dG9ucyApewotCQkJCQkJCQlpZiggYnRuICE9IGUuZ2V0U291cmNlKCkgKSBidG4uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlhbGxCdXR0b25zWzBdLnNldFNlbGVjdGlvbihmYWxzZSk7IAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciggQnV0dG9uIGIgOiBhbGxCdXR0b25zICl7Ci0JCQlpZiggYi5nZXRTZWxlY3Rpb24oKSApewotCQkJCWlmKCBidWlsZGVyLmxlbmd0aCgpPjAgKXsKLQkJCQkJYnVpbGRlci5hcHBlbmQoICcsJyk7Ci0JCQkJfQotCQkJCWJ1aWxkZXIuYXBwZW5kKCBiLmdldERhdGEoKSApOwotCQkJfQotCQl9Ci0JCXRoaXMuYXNzb2NpYXRpb25Sb2xlLnNldENhc2NhZGUoIGJ1aWxkZXIudG9TdHJpbmcoKSApOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9CQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5MaXN0KFN0cmluZyBjYXNjYWRlKSB7Ci0JCWZvciggU3RyaW5nIHMgOiBjYXNjYWRlcyApewotCQkJaWYoIHMuZXF1YWxzKGNhc2NhZGUgKSl7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLQotfQotCi1jbGFzcyBUYWdOYW1lcwotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDX1RBRyA9ICJiYXNpYyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FTQ0FERV9UQUcgPSAiY2FzY2FkZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1RBRyA9ICJjb2x1bW4iOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNQkVEREVEX1RBRyA9ICJlbWJlZGRlZCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRURERURfSURfVEFHID0gImVtYmVkZGVkLWlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFURURfVkFMVUVfVEFHID0gImdlbmVyYXRlZC12YWx1ZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVEFHID0gImlkIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DTEFTU19UQUcgPSAiaWQiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fQ09MVU1OX1RBRyA9ICJqb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5WRVJTRV9KT0lOX0NPTFVNTl9UQUcgPSAiaW52ZXJzZS1qb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9CX1RBRyA9ICJsb2IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BTllfVE9fTUFOWV9UQUcgPSAibWFueS10by1tYW55IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQU5ZX1RPX09ORV9UQUcgPSAibWFueS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBFRF9CWV9UQUcgPSAibWFwcGVkLWJ5IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVfVE9fTUFOWV9UQUcgPSAib25lLXRvLW1hbnkiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORV9UT19PTkVfVEFHID0gIm9uZS10by1vbmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBLX0pPSU5fQ09MVU1OX1RBRyA9ICJwcmltYXJ5LWtleS1qb2luLWNvbHVtbiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfVEFHID0gInRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1RBRyA9ICJ2ZXJzaW9uIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX1RBQkxFX1RBRyA9ICJqb2luLXRhYmxlIjsKLQotCS8qY2FzY2FkZSB0YWdzKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTExfQ0FTQ0FERSA9ICJhbGwiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RfQ0FTQ0FERSA9ICJwZXJzaXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9DQVNDQURFID0gIm1lcmdlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRU1PVkVfQ0FTQ0FERSA9ICJyZW1vdmUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRlJFU0hfQ0FTQ0FERSA9ICJyZWZyZXNoIjsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQ29sdW1uR2VuUGFuZWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vQ29sdW1uR2VuUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNjMTljZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0NvbHVtbkdlblBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci0KLS8qKgotICogVGhlIHBhbmVsIHVzZWQgaW4gdGhlIDxjb2RlPlRhYmxlc0FuZENvbHVtbnNQYWdlPC9jb2RlPiB3aXphcmQgcGFnZSAKLSAqIHRvIGVkaXQgdGhlIGNvbHVtbiBnZW5lcmF0aW9uIHByb3BlcnRpZXMuCi0gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgYnkgdGhlIDxjb2RlPk9STUdlbldpemFyZDwvY29kZT4gCi0gKiBpbXBsZW1lbnRhdGlvbi4KLQotICovCi1wdWJsaWMgY2xhc3MgQ29sdW1uR2VuUGFuZWwgCi17Ci0JV2l6YXJkUGFnZSB3aXphcmRQYWdlIDsgCi0JQ29tcG9zaXRlIHBhcmVudDsJLy9wYXJlbnQgY29udHJvbCB3aXRoIGdyaWQgbGF5b3V0Ci0JaW50IGNvbHVtbnM7IAkJLy90b3RhbCBjb2x1bW5zIGluIHRoZSBwYXJlbnQgY29tcG9zaXRlCi0JCi0JT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyOwotCQotCXByaXZhdGUgT1JNR2VuQ29sdW1uIG1Db2x1bW47Ci0JcHJpdmF0ZSBib29sZWFuIG1QYW5lbEluaXRlZDsKLQlwcml2YXRlIGJvb2xlYW4gbUlzVXBkYXRpbmdDb250cm9sczsKLQkKLQlwcml2YXRlIEdyb3VwIGNvbHVtbk1hcHBpbmdHcm91cDsKLQlwcml2YXRlIEJ1dHRvbiBtR2VuZXJhdGVkQ2hlY2tib3g7Ci0JcHJpdmF0ZSBUZXh0IG1Qcm9wTmFtZUZpZWxkOwotCXByaXZhdGUgQ29tYm8gbU1hcHBpbmdLaW5kQ29tYm87Ci0JcHJpdmF0ZSBDb21ibyBtUHJvcFR5cGVDb21ibzsKLQlwcml2YXRlIEJ1dHRvbiBtVXBkYXRlYWJsZUNoZWNrQm94OwotCXByaXZhdGUgQnV0dG9uIG1JbnNlcnRhYmxlQ2hlY2tCb3g7Ci0JCi0JcHJpdmF0ZSBHcm91cCBkb21haW5DbGFzc0dyb3VwIDsKLQlwcml2YXRlIFNjb3BlUGFuZWwgbVByb3BHZXRTY29wZVBhbmVsOwotCXByaXZhdGUgU2NvcGVQYW5lbCBtUHJvcFNldFNjb3BlUGFuZWw7Ci0JCi0JcHVibGljIENvbHVtbkdlblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zLCBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIsIFdpemFyZFBhZ2Ugd2l6YXJkUGFnZSApIHsKLQkJdGhpcy53aXphcmRQYWdlID0gd2l6YXJkUGFnZTsKLQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsKLQkJdGhpcy5wYXJlbnQgPXBhcmVudDsKLQkJdGhpcy5jb2x1bW5zID0gY29sdW1uczsKLQkJCi0JCWluaXRQYW5lbCgpOwotCX0KLQkvKioKLQkgKiBDaGFuZ2VzIHRoZSB0YWJsZSBlZGl0ZWQgYnkgdGhlIHBhbmVsLgotCSAqIFRoaXMgaXMgc3VwcG9zZWQgdG8gdXBkYXRlIHRoZSBwYW5lbCBlZGl0aW5nIGNvbnRyb2xzIAotCSAqIHVzaW5nIHRoZSBjb2x1bW4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbHVtbihPUk1HZW5Db2x1bW4gY29sdW1uKSB7Ci0JCW1Db2x1bW4gPSBjb2x1bW47Ci0JCQotCQkvKmxhenkgaW5pdCBwYW5lbCBiZWNhdXNlIGl0IHVzZXMgbUNvbHVtbiovCi0JCWlmICghbVBhbmVsSW5pdGVkKSB7Ci0JCQlpbml0UGFuZWwoKTsKLQkJCW1QYW5lbEluaXRlZCA9IHRydWU7Ci0JCX0KLQkJCi0JCXVwZGF0ZUNvbnRyb2xzKCk7Ci0JfQotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250cm9scygpIHsKLQkJaWYgKG1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJbUlzVXBkYXRpbmdDb250cm9scyA9IHRydWU7Ci0JCWJvb2xlYW4gaXNHZW5lcmF0ZWQgPSBtQ29sdW1uLmlzR2VuZXJhdGVkKCk7Ci0JCW1HZW5lcmF0ZWRDaGVja2JveC5zZXRTZWxlY3Rpb24oIGlzR2VuZXJhdGVkKTsKLQkJbUdlbmVyYXRlZENoZWNrYm94LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWVuYWJsZUNvbnRyb2xzKGlzR2VuZXJhdGVkKTsKLQkJdHJ5IHsKLQkJCW1Qcm9wTmFtZUZpZWxkLnNldFRleHQobUNvbHVtbi5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0KLQkJCW1Qcm9wVHlwZUNvbWJvLnNldFRleHQoIG1Db2x1bW4uZ2V0UHJvcGVydHlUeXBlKCkpOwotCQkJCi0JCQltTWFwcGluZ0tpbmRDb21iby5zZXRUZXh0KCBtQ29sdW1uLmdldE1hcHBpbmdLaW5kKCkpOwotCQkJCi0JCQltVXBkYXRlYWJsZUNoZWNrQm94LnNldFNlbGVjdGlvbiggbUNvbHVtbi5pc1VwZGF0ZWFibGUoKSk7Ci0JCQkKLQkJCW1JbnNlcnRhYmxlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKG1Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQkJCi0JCQltUHJvcEdldFNjb3BlUGFuZWwuZW5hYmxlQ29tcG9uZW50cyhpc0dlbmVyYXRlZCk7Ci0JCQltUHJvcEdldFNjb3BlUGFuZWwuc2V0U2NvcGUobUNvbHVtbi5nZXRQcm9wZXJ0eUdldFNjb3BlKCkpOwotCQkJCi0JCQltUHJvcFNldFNjb3BlUGFuZWwuZW5hYmxlQ29tcG9uZW50cyggaXNHZW5lcmF0ZWQgKTsKLQkJCW1Qcm9wU2V0U2NvcGVQYW5lbC5zZXRTY29wZShtQ29sdW1uLmdldFByb3BlcnR5U2V0U2NvcGUoKSk7Ci0KLQkJCWlmKCBtQ29sdW1uLmlzUGFydE9mQ29tcG9zaXRlUHJpbWFyeUtleSgpKXsKLQkJCQllbmFibGVDb250cm9scyhmYWxzZSk7Ci0JCQkJbVByb3BOYW1lRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQltR2VuZXJhdGVkQ2hlY2tib3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQkKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCi0JCW1Jc1VwZGF0aW5nQ29udHJvbHMgPSBmYWxzZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGVuYWJsZUNvbnRyb2xzKGJvb2xlYW4gaXNHZW5lcmF0ZWQpIHsKLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gdGhpcy5kb21haW5DbGFzc0dyb3VwLmdldENoaWxkcmVuKCk7Ci0JCWZvciggQ29udHJvbCBjOiBjb250cm9scyl7Ci0JCQljLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCX0KLQotCQljb250cm9scyA9IHRoaXMuY29sdW1uTWFwcGluZ0dyb3VwLmdldENoaWxkcmVuKCk7Ci0JCWZvciggQ29udHJvbCBjOiBjb250cm9scyl7Ci0JCQljLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCX0KLQl9Ci0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIHBhbmVsIGJ5IGFkZGluZyB0aGUgZWRpdGluZyBjb250cm9scy4KLQkgKiBAcGFyYW0gY29sdW1ucyAKLQkgKiBAcGFyYW0gcGFyZW50IAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQYW5lbCgpIHsKLQkJY3JlYXRlQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJdGhpcy5tUGFuZWxJbml0ZWQgPSB0cnVlOwotCX0KLQkKLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0tIFNjb3BlUGFuZWwgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBBIHBhbmVsIGNvbnRhaW5pbmcgMyByYWRpb3MgKHB1YmxpYywgcHJvdGVjdGVkLCBwcml2YXRlKQotCSAqLwotCXByaXZhdGUgY2xhc3MgU2NvcGVQYW5lbCAKLQl7Ci0JCXByaXZhdGUgQnV0dG9uIG1QdWJsaWNSYWRpbzsKLQkJcHJpdmF0ZSBCdXR0b24gbVByb3RlY3RlZFJhZGlvOwotCQlwcml2YXRlIEJ1dHRvbiBtUHJpdmF0ZVJhZGlvOwotCQkKLQkJcHVibGljIFNjb3BlUGFuZWwoQ29tcG9zaXRlIGNvbXAsIFNlbGVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkvL3N1cGVyKDMsIDIwLypoc3BhY2luZyovLCAwLyp2c3BhY2luZyovKTsKLQkJCQotCQkJQ29tcG9zaXRlIHJhZGlvR3JvdXAgPSBuZXcgQ29tcG9zaXRlKCBjb21wLCBTV1QuTk9ORSk7Ci0JCQlyYWRpb0dyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCB0cnVlKSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQkJcmFkaW9Hcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCQotCQkJLypzdHJpbmcgbm90IGxvY2FsaXplZCBpbnRlbnRpb25hbGx5LCB0aGV5IGFyZSB1c2VkIGFzIHRoZSBhY3R1YWwgCi0JCQkgKiBzY29wZSB2YWx1ZSAoc2VlIGdldFRleHQoKSB1c2FnZSkqLwotCQkJbVB1YmxpY1JhZGlvID0gbmV3IEJ1dHRvbiggcmFkaW9Hcm91cCwgU1dULlJBRElPICk7Ci0JCQltUHVibGljUmFkaW8uc2V0VGV4dCggInB1YmxpYyIpOwotCQkJbVB1YmxpY1JhZGlvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJbVByb3RlY3RlZFJhZGlvID0gbmV3IEJ1dHRvbiggcmFkaW9Hcm91cCwgU1dULlJBRElPICk7Ci0JCQltUHJvdGVjdGVkUmFkaW8uc2V0VGV4dCgicHJvdGVjdGVkIik7Ci0JCQltUHJvdGVjdGVkUmFkaW8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQltUHJpdmF0ZVJhZGlvID0gbmV3IEJ1dHRvbihyYWRpb0dyb3VwLCBTV1QuUkFESU8gKTsKLQkJCW1Qcml2YXRlUmFkaW8uc2V0VGV4dCggInByaXZhdGUiKTsKLQkJCW1Qcml2YXRlUmFkaW8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQkKLQkJCW1QdWJsaWNSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQltUHJvdGVjdGVkUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQkJbVByaXZhdGVSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCQkJCi0JCX0KLQkJcHVibGljIHZvaWQgZW5hYmxlQ29tcG9uZW50cyhib29sZWFuIGIpIHsKLQkJCW1QdWJsaWNSYWRpby5zZXRFbmFibGVkKGIpOwotCQkJbVByb3RlY3RlZFJhZGlvLnNldEVuYWJsZWQoYik7Ci0JCQltUHJpdmF0ZVJhZGlvLnNldEVuYWJsZWQoYik7Ci0JCX0KLQkJLyoqCi0JCSAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzY29wZS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCQlCdXR0b24gcmFkaW8gPSBudWxsOwotCQkJaWYgKG1QdWJsaWNSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXJhZGlvID0gbVB1YmxpY1JhZGlvOwotCQkJfSBlbHNlIGlmIChtUHJvdGVjdGVkUmFkaW8uZ2V0U2VsZWN0aW9uKCkgKSB7Ci0JCQkJcmFkaW8gPSBtUHJvdGVjdGVkUmFkaW87Ci0JCQl9IGVsc2UgaWYgKG1Qcml2YXRlUmFkaW8uZ2V0U2VsZWN0aW9uKCkgKSB7Ci0JCQkJcmFkaW8gPSBtUHJpdmF0ZVJhZGlvOwotCQkJfQotCQkJcmV0dXJuIHJhZGlvICE9IG51bGwgPyByYWRpby5nZXRUZXh0KCkgOiBudWxsOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHNldFNjb3BlKFN0cmluZyBzY29wZSkgewotCQkJbVB1YmxpY1JhZGlvLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQltUHJvdGVjdGVkUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCW1Qcml2YXRlUmFkaW8uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWlmKCBzY29wZSA9PSBudWxsICkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoc2NvcGUuZXF1YWxzKE9STUdlbkNvbHVtbi5QVUJMSUNfU0NPUEUpKSB7Ci0JCQkJbVB1YmxpY1JhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAoc2NvcGUuZXF1YWxzKE9STUdlbkNvbHVtbi5QUk9URUNURURfU0NPUEUpKSB7Ci0JCQkJbVByb3RlY3RlZFJhZGlvLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAoc2NvcGUuZXF1YWxzKE9STUdlbkNvbHVtbi5QUklWQVRFX1NDT1BFKSkgewotCQkJCW1Qcml2YXRlUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0gcHJpdmF0ZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQltR2VuZXJhdGVkQ2hlY2tib3ggPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJbUdlbmVyYXRlZENoZWNrYm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9nZW5Qcm9wKTsKLQkJbUdlbmVyYXRlZENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICghbUlzVXBkYXRpbmdDb250cm9scykgewotCQkJCQltQ29sdW1uLnNldEdlbmVyYXRlZChtR2VuZXJhdGVkQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkgKTsKLQkJCQkJdXBkYXRlQ29udHJvbHMoKTsKLQkJCQl9Ci0JCQl9fSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMobUdlbmVyYXRlZENoZWNrYm94LCBjb2x1bW5zKTsKLQkJCi0JCWNvbHVtbk1hcHBpbmdHcm91cCA9IG5ldyBHcm91cCggY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbk1hcHBpbmdHcm91cC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sTWFwcGluZyk7Ci0JCWNvbHVtbk1hcHBpbmdHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1ucywgZmFsc2UpKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMCA7Ci0JCWNvbHVtbk1hcHBpbmdHcm91cC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb2x1bW5NYXBwaW5nR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9wcm9wTmFtZSApOwotCQltUHJvcE5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgKTsKLQkJbVByb3BOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCVN0cmluZyBmbGROYW1lID0gbVByb3BOYW1lRmllbGQuZ2V0VGV4dCgpOwotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIoIGZsZE5hbWUsIAotCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzMsIEphdmFDb3JlLlZFUlNJT05fMV8zICk7Ci0JCQkJCWlmKCAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpewotCQkJCQkJbUNvbHVtbi5zZXRQcm9wZXJ0eU5hbWUoZmxkTmFtZSk7Ci0JCQkJCQl3aXphcmRQYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQl3aXphcmRQYWdlLnNldEVycm9yTWVzc2FnZShzdGF0dXMuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMobVByb3BOYW1lRmllbGQgLDMpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb2x1bW5NYXBwaW5nR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9wcm9wVHlwZSApOwotCQltUHJvcFR5cGVDb21ibyA9IG5ldyBDb21ibyhjb2x1bW5NYXBwaW5nR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJbVByb3BUeXBlQ29tYm8uc2V0SXRlbXMoIHRoaXMuY3VzdG9taXplci5nZXRBbGxQcm9wZXJ0eVR5cGVzKCkpOwotCQltUHJvcFR5cGVDb21iby5hZGRNb2RpZnlMaXN0ZW5lciggbmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiAoIW1Jc1VwZGF0aW5nQ29udHJvbHMpIHsKLQkJCQkJbUNvbHVtbi5zZXRQcm9wZXJ0eVR5cGUobVByb3BUeXBlQ29tYm8uZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKG1Qcm9wVHlwZUNvbWJvLDMpOwotCQkKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb2x1bW5NYXBwaW5nR3JvdXAsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9tYXBLaW5kICk7Ci0JCW1NYXBwaW5nS2luZENvbWJvID0gbmV3IENvbWJvKGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQltTWFwcGluZ0tpbmRDb21iby5zZXRJdGVtcyggdGhpcy5jdXN0b21pemVyLmdldEFsbE1hcHBpbmdLaW5kcygpKTsKLQkJbU1hcHBpbmdLaW5kQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCW1Db2x1bW4uc2V0TWFwcGluZ0tpbmQoKFN0cmluZyltTWFwcGluZ0tpbmRDb21iby5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQkKLQkJCX19KTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyhtTWFwcGluZ0tpbmRDb21ibyAsMyk7Ci0JCQotCQltVXBkYXRlYWJsZUNoZWNrQm94ID0gbmV3IEJ1dHRvbihjb2x1bW5NYXBwaW5nR3JvdXAsIFNXVC5DSEVDSyk7Ci0JCW1VcGRhdGVhYmxlQ2hlY2tCb3guc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2NvbFVwZGF0ZWFibGUpOwotCQltVXBkYXRlYWJsZUNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmICghbUlzVXBkYXRpbmdDb250cm9scykgewotCQkJCQltQ29sdW1uLnNldFVwZGF0ZWFibGUobVVwZGF0ZWFibGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKSApOwotCQkJCX0KLQkJCX19KTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyhtVXBkYXRlYWJsZUNoZWNrQm94ICw0KTsKLQkJCi0JCW1JbnNlcnRhYmxlQ2hlY2tCb3ggPSBuZXcgQnV0dG9uKGNvbHVtbk1hcHBpbmdHcm91cCwgU1dULkNIRUNLKTsKLQkJbUluc2VydGFibGVDaGVja0JveC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sSW5zZXJ0YWJsZSk7Ci0JCW1JbnNlcnRhYmxlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCW1Db2x1bW4uc2V0SW5zZXJ0YWJsZShtSW5zZXJ0YWJsZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9fSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMobUluc2VydGFibGVDaGVja0JveCAsNCk7Ci0JCQotCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgNCwiIik7IAotCQkKLQkJY3JlYXRlSmF2YUJlYW5Qcm9wZXJ0eUNvbnRyb2xzKGNvbXBvc2l0ZSwgY29sdW1ucyk7Ci0JfQotCQotCXZvaWQgY3JlYXRlSmF2YUJlYW5Qcm9wZXJ0eUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKXsKLQkJLy9KYXZhIGNsYXNzIGdlbmVyYXRpb24gcHJvcGVydGllcyAKLQkJZG9tYWluQ2xhc3NHcm91cCA9IG5ldyBHcm91cChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZG9tYWluQ2xhc3NHcm91cC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfYmVhblByb3AgKTsKLQkJZG9tYWluQ2xhc3NHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1ucywgZmFsc2UpKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJZG9tYWluQ2xhc3NHcm91cC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCi0JCVNXVFV0aWwuY3JlYXRlTGFiZWwoZG9tYWluQ2xhc3NHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2dldHRlclNjb3BlICk7Ci0JCW1Qcm9wR2V0U2NvcGVQYW5lbCA9IG5ldyBTY29wZVBhbmVsKGRvbWFpbkNsYXNzR3JvdXAsIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCWlmKCAoKEJ1dHRvbillLmdldFNvdXJjZSgpKS5nZXRTZWxlY3Rpb24oKSApCi0JCQkJCQltQ29sdW1uLnNldFByb3BlcnR5R2V0U2NvcGUobVByb3BHZXRTY29wZVBhbmVsLmdldFNjb3BlKCkpOwotCQkJCX0KLQkJCQkKLQkJCX19KTsKLQkJCi0JCVNXVFV0aWwuY3JlYXRlTGFiZWwoZG9tYWluQ2xhc3NHcm91cCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX3NldHRlclNjb3BlICk7Ci0JCW1Qcm9wU2V0U2NvcGVQYW5lbCA9IG5ldyBTY29wZVBhbmVsKGRvbWFpbkNsYXNzR3JvdXAsIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKCFtSXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCWlmKCAoKEJ1dHRvbillLmdldFNvdXJjZSgpKS5nZXRTZWxlY3Rpb24oKSApCi0JCQkJCQltQ29sdW1uLnNldFByb3BlcnR5U2V0U2NvcGUobVByb3BTZXRTY29wZVBhbmVsLmdldFNjb3BlKCkpOwotCQkJCX0KLQkJCX19KTsKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EYXRhYmFzZUdyb3VwLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0RhdGFiYXNlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFkZTliZS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0RhdGFiYXNlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN5bmNocm9uaXplZEJvb2xlYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQ2xvbmVJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5KcHRKcGFEYlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnVpLmludGVybmFsLkRUUFVpVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLQotLyoqCi0gKiBBIGNvbXBvc2l0ZSB1c2VkIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2UsIGluY2x1ZGVzIGZvbGxvd2luZyBVSSBjb250cm9sczoKLSAqIC0gY29ubmVjdGlvbiBjb21iby1ib3gKLSAqIC0gc2NoZW1hIGNvbWJvLWJveAotICogLSBhZGQgY29ubmVjdGlvbiBidXR0b24KLSAqIC0gcmVjb25uZWN0IGJ1dHRvbgotICovCi1wdWJsaWMgY2xhc3MgRGF0YWJhc2VHcm91cAotewotCXByaXZhdGUgZmluYWwgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgZmluYWwgU2V0PExpc3RlbmVyPiBsaXN0ZW5lcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRTZXQobmV3IEhhc2hTZXQ8TGlzdGVuZXI+KCkpOwotCi0JLy8gdGhlc2UgYXJlIGtlcHQgaW4gc3luY2ggd2l0aCB0aGUgc2VsZWN0aW9uCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBzZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlOwotCQotCXByaXZhdGUgU2NoZW1hIHNlbGVjdGVkU2NoZW1hOwotCi0JcHJpdmF0ZSBmaW5hbCBDb21ibyBjb25uZWN0aW9uQ29tYm9Cb3g7Ci0KLQlwcml2YXRlIGZpbmFsIENvbWJvIHNjaGVtYUNvbWJvQm94OwotCi0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gcmVjb25uZWN0QnV0dG9uOwotCi0JcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uTGlzdGVuZXIgY29ubmVjdGlvbkxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJV2l6YXJkQ29udGFpbmVyIHdpemFyZENvbnRhaW5lcjsKLQotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3Rpb24gKioqKioqKioqKgotCi0JcHJvdGVjdGVkIERhdGFiYXNlR3JvdXAoSVdpemFyZENvbnRhaW5lciB3aXphcmRDb250YWluZXIsIEpwYVByb2plY3QganBhUHJvamVjdCwgQ29tcG9zaXRlIHBhcmVudCwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciwgaW50IHdpZHRoSGludCkgewotCQlzdXBlcigpOwotCQl0aGlzLndpemFyZENvbnRhaW5lciA9IHdpemFyZENvbnRhaW5lcjsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7Ci0KLQkJLy8gY29ubmVjdGlvbiBjb21iby1ib3gKLQkJdGhpcy5idWlsZExhYmVsKHBhcmVudCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jb25uZWN0aW9uKTsKLQkJdGhpcy5jb25uZWN0aW9uQ29tYm9Cb3ggPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkNvbWJvQm94KHBhcmVudCwgd2lkdGhIaW50KTsKLQotCQkvLyBhZGQgY29ubmVjdGlvbiBidXR0b24KLQkJQnV0dG9uIGFkZENvbm5lY3Rpb25CdXR0b24gPSB0aGlzLmJ1aWxkQnV0dG9uKHBhcmVudCwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5hZGRDb25uZWN0aW9uTGluaywgSW1hZ2VSZXBvc2l0b3J5LmdldEFkZENvbm5lY3Rpb25CdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlciksIHRoaXMuYnVpbGRBZGRDb25uZWN0aW9uTGlua1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlhZGRDb25uZWN0aW9uQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIEEgY29tcG9zaXRlIGhvbGRzIHRoZSByZWNvbm5lY3QgYnV0dG9uICYgdGV4dAotCQl0aGlzLmJ1aWxkTGFiZWwocGFyZW50LCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKCBwYXJlbnQgLCBTV1QuTk9ORSApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZSA7Ci0JCWdyaWREYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJR3JpZExheW91dCBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpOwotCQkvLyBNYWtlIHRoZSByZWNvbm5lY3QgYnV0dG9uIHRvIGJlIGNsb3NlciB0byB0aGUgY29ubmVjdGlvbiBjb21iby4KLQkJZ3JpZExheW91dC5tYXJnaW5Ub3AgPSAtNTsKLQkJY29tcC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLQkJLy8gcmVjb25uZWN0aW9uIGJ1dHRvbgotCQl0aGlzLnJlY29ubmVjdEJ1dHRvbiA9IHRoaXMuYnVpbGRCdXR0b24oY29tcCwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jb25uZWN0TGluaywgSW1hZ2VSZXBvc2l0b3J5LmdldFJlY29ubmVjdEJ1dHRvbkltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSwgIHRoaXMuYnVpbGRSZWNvbm5lY3RMaW5rU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCXRoaXMuYnVpbGRMYWJlbChjb21wLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnNjaGVtYUluZm8pOwotCi0JCS8vIHNjaGVtYSBjb21iby1ib3gKLQkJdGhpcy5idWlsZExhYmVsKHBhcmVudCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5zY2hlbWEpOwotCQl0aGlzLnNjaGVtYUNvbWJvQm94ID0gdGhpcy5idWlsZFNjaGVtYUNvbWJvQm94KHBhcmVudCk7Ci0JCS8vIGZpbGxlcgotCQluZXcgTGFiZWwocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uTGlzdGVuZXIgPSB0aGlzLmJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdCgpCi0JewotCQkvLyBpbml0aWFsaXplIHN0YXRlLCBiYXNlZCBvbiBKUEEgcHJvamVjdAotCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpOwotCQl0aGlzLnNlbGVjdGVkU2NoZW1hID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCk7Ci0KLQkJaWYodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQl0aGlzLmZpcmVTY2hlbWFDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRTY2hlbWEpOwotCQl9Ci0JCWlmKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCXRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQl9Ci0KLQkJdGhpcy51cGRhdGVDb25uZWN0aW9uQ29tYm9Cb3goKTsKLQkJdGhpcy51cGRhdGVTY2hlbWFDb21ib0JveCgpOwotCQl0aGlzLnVwZGF0ZVJlY29ubmVjdExpbmsoKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRyYS13aXphcmQgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwdWJsaWMgU2NoZW1hIGdldFNlbGVjdGVkU2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZih0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkgewotCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY29ubmVjdGlvbklzQWN0aXZlKCkgewotCQlyZXR1cm4gKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSAmJiAodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmlzQWN0aXZlKCkpOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQkvKioKLQkgKiB0aGlzIGNhbiByZXR1cm4gbnVsbDsKLQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JICovCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBnZXRKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3QuZ2V0Q29ubmVjdGlvblByb2ZpbGUoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIGNhbiByZXR1cm4gbnVsbDsKLQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JICovCi0JcHJpdmF0ZSBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0JCS8vIElmIGEgc2NoZW1hIGlzIHNwZWNpZmllZCBmb3IgdGhlIEpQQSBwcm9qZWN0LCBzZXQgc2NoZW1hIHRvIHRoZSBzY2hlbWEgb2YgdGhlIEpQQSBwcm9qZWN0Ci0JCWlmICh0aGlzLmdldEpwYVByb2plY3RDb25uZWN0aW9uUHJvZmlsZSgpICE9IG51bGwpIHsKLQkJCS8vIHNjaGVtYSBjb3VsZCBiZSBudWxsIHdoZW4gdGhlIGRlZmF1bHQgc2NoZW1hIGRvZXMgbm90IGV4aXN0Ci0JCQlzY2hlbWEgPSBqcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYSgpOwotCQl9Ci0JCQotCQkvLyBzZWxlY3RlZCBjb25uZWN0aW9uIHByb2ZpbGUgY291bGQgYmUgbnVsbCB3aGVuIG5vIGNvbm5lY3Rpb24gc3BlY2lmaWVkCi0JCWlmIChzY2hlbWEgPT0gbnVsbCAmJiB0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkgewotCQkJLy8gY2hlY2sgaWYgdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBpcyBhY3RpdmUKLQkJCWlmICh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSkgewotCQkJCS8vIGlmIGFjdGl2ZSwgZ2V0IHRoZSBkZWZhdWx0IHNjaGVtYSBvZiB0aGUgc2VsZWN0ZWQgY29ubmVjdGlvbiBwcm9maWxlCi0JCQkJc2NoZW1hID0gdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQkJCS8vIGlmIHRoZSBkZWZhdWx0IHNjaGVtYSBkb2VzIG5vdCBleGlzdCwgZ2V0IHRoZSBmaXJzdCBhdmFpbGFibGUgc2NoZW1hCi0JCQkJaWYgKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQkJCUl0ZXJhYmxlPFNjaGVtYT4gc2NoZW1hdGEgPSB0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWF0YSgpOwotCQkJCQlpZiAoc2NoZW1hdGEuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKLQkJCQkJCXNjaGVtYSA9IHNjaGVtYXRhLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc2NoZW1hOwotCX0KLQotCS8qKgotCSAqIHRoZSBjb25uZWN0aW9uIGNvbWJvLWJveCBpcyB1cGRhdGVkIGF0IHN0YXJ0LXVwIGFuZCB3aGVuIHRoZSB1c2VyCi0JICogYWRkcyBhIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb25uZWN0aW9uQ29tYm9Cb3goKSB7Ci0JCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94LnJlbW92ZUFsbCgpOwotCQlmb3IoU3RyaW5nIGNwTmFtZSA6IHRoaXMuYnVpbGRTb3J0ZWRDb25uZWN0aW9uUHJvZmlsZU5hbWVzKCkpIHsKLQkJCXRoaXMuY29ubmVjdGlvbkNvbWJvQm94LmFkZChjcE5hbWUpOwotCQl9Ci0JCWlmKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Db21ib0JveC5zZWxlY3QodGhpcy5jb25uZWN0aW9uQ29tYm9Cb3guaW5kZXhPZih0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuZ2V0TmFtZSgpKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNvcnRlZFNldDxTdHJpbmc+IGJ1aWxkU29ydGVkQ29ubmVjdGlvblByb2ZpbGVOYW1lcygpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25Ub29scy5zb3J0ZWRTZXQoSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuZ2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lcygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjYWxsZWQgYXQgc3RhcnQtdXAgYW5kIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlY29ubmVjdExpbmsoKSB7Ci0JCXRoaXMucmVjb25uZWN0QnV0dG9uLnNldEVuYWJsZWQodGhpcy5yZWNvbm5lY3RMaW5rQ2FuQmVFbmFibGVkKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiByZWNvbm5lY3RMaW5rQ2FuQmVFbmFibGVkKCkgewotCQlyZXR1cm4gKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSAhPSBudWxsKSAmJiAhKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgc2NoZW1hIGNvbWJvLWJveCBpcyB1cGRhdGVkIGF0IHN0YXJ0LXVwIGFuZAotCSAqIHdoZW4gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZSBjaGFuZ2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNjaGVtYUNvbWJvQm94KCkgewotCQl0aGlzLnNjaGVtYUNvbWJvQm94LnJlbW92ZUFsbCgpOwotCQlmb3IoU3RyaW5nIG5hbWUgOiB0aGlzLmdldFNjaGVtYU5hbWVzKCkpIHsKLQkJCXRoaXMuc2NoZW1hQ29tYm9Cb3guYWRkKG5hbWUpOwotCQl9Ci0JCS8vIHRoZSBjdXJyZW50IHNjaGVtYSAqc2hvdWxkKiBiZSBpbiB0aGUgY3VycmVudCBjb25uZWN0aW9uIHByb2ZpbGUKLQkJaWYodGhpcy5zZWxlY3RlZFNjaGVtYSAhPSBudWxsKSB7Ci0JCQl0aGlzLnNjaGVtYUNvbWJvQm94LnNlbGVjdCh0aGlzLnNjaGVtYUNvbWJvQm94LmluZGV4T2YodGhpcy5zZWxlY3RlZFNjaGVtYS5nZXROYW1lKCkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSXRlcmFibGU8U3RyaW5nPiBnZXRTY2hlbWFOYW1lcygpIHsKLQkJU2NoZW1hQ29udGFpbmVyIHNjID0gdGhpcy5qcGFQcm9qZWN0LmdldERlZmF1bHREYlNjaGVtYUNvbnRhaW5lcigpOwotCQkvLyB1c2Ugc2NoZW1hICpuYW1lcyogc2luY2UgdGhlIGNvbWJvLWJveCBpcyByZWFkLW9ubHkKLQkJcmV0dXJuIChzYyAhPSBudWxsKSA/IHNjLmdldFNvcnRlZFNjaGVtYU5hbWVzKCkgOiBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgc3BlY2lmaWVkIG5hbWUgbWF0Y2hlcyB0aGUgbmFtZSBvZiB0aGUgSlBBIHByb2plY3QncwotCSAqIGNvbm5lY3Rpb24gcHJvZmlsZSwgcmV0dXJuIGl0OyBvdGhlcndpc2UsIGJ1aWxkIGEgbmV3IGNvbm5lY3Rpb24KLQkgKiBwcm9maWxlLgotCSAqLwotCXByaXZhdGUgQ29ubmVjdGlvblByb2ZpbGUgY2hlY2tKcGFQcm9qZWN0Q29ubmVjdGlvblByb2ZpbGUoU3RyaW5nIGNwTmFtZSkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBjcCA9IHRoaXMuZ2V0SnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCWlmKChjcCAhPSBudWxsKSAmJiBjcC5nZXROYW1lKCkuZXF1YWxzKGNwTmFtZSkpIHsKLQkJCXJldHVybiBjcDsKLQkJfQotCQlyZXR1cm4gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGNwTmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDb25uZWN0aW9uUHJvZmlsZSBidWlsZENvbm5lY3Rpb25Qcm9maWxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBKcHRKcGFEYlBsdWdpbi5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lciBjYWxsYmFja3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdGVkQ29ubmVjdGlvbkNoYW5nZWQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdGhpcy5jb25uZWN0aW9uQ29tYm9Cb3guZ2V0VGV4dCgpOwotCQlpZih0ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCWlmKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuOyAgLy8gbm8gY2hhbmdlCi0JCQl9Ci0JCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCXRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSA9IG51bGw7Ci0JCX0gCi0JCWVsc2UgewotCQkJaWYodGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID09IG51bGwpIHsKLQkJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmNoZWNrSnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKHRleHQpOwotCQkJfSAKLQkJCWVsc2UgewotCQkJCWlmKHRleHQuZXF1YWxzKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkJCXJldHVybjsgIC8vIG5vIGNoYW5nZQotCQkJCX0KLQkJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgPSB0aGlzLmNoZWNrSnBhUHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKHRleHQpOwotCQkJfQotCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5maXJlQ29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZSk7Ci0JCXRoaXMuY29ubmVjdGlvbkNoYW5nZWQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCkgewotCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuanBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWFDb250YWluZXIoKS5nZXRTY2hlbWFOYW1lZCh0aGlzLnNjaGVtYUNvbWJvQm94LmdldFRleHQoKSk7Ci0JCWlmKHRoaXMuc2VsZWN0ZWRTY2hlbWEgIT0gb2xkKSB7Ci0JCQlmaXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wZW4gdGhlIERUUCBOZXcgQ29ubmVjdGlvbiBQcm9maWxlIHdpemFyZC4KLQkgKiBJZiB0aGUgdXNlciBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24gcHJvZmlsZSwgc3RhcnQgdXNpbmcgaXQgYW5kCi0JICogY29ubmVjdCBpdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRDb25uZWN0aW9uKCkgewotCQlTdHJpbmcgYWRkZWRQcm9maWxlTmFtZSA9IERUUFVpVG9vbHMuY3JlYXRlTmV3Q29ubmVjdGlvblByb2ZpbGUoKTsKLQkJaWYoYWRkZWRQcm9maWxlTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47ICAvLyB1c2VyIHByZXNzZWQgIkNhbmNlbCIKLQkJfQotCQlpZih0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUgIT0gbnVsbCkgewotCQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcih0aGlzLmNvbm5lY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5idWlsZENvbm5lY3Rpb25Qcm9maWxlKGFkZGVkUHJvZmlsZU5hbWUpOwotCQl0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKHRoaXMuY29ubmVjdGlvbkxpc3RlbmVyKTsKLQkJdGhpcy51cGRhdGVDb25uZWN0aW9uQ29tYm9Cb3goKTsKLQkJdGhpcy5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJLy8gZXZlcnl0aGluZyBlbHNlIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgd2hlbiB3ZSBnZXQgdGhlIHJlc3VsdGluZyBvcGVuIGV2ZW50Ci0JCXRoaXMuZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZCh0aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUpOwotCQl0aGlzLnVwZGF0ZVNjaGVtYUNvbWJvQm94KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlY29ubmVjdCgpIHsKLQkJdHJ5IHsKLQkJCXRoaXMud2l6YXJkQ29udGFpbmVyLnJ1bih0cnVlLCB0cnVlLCBuZXcgSVJ1bm5hYmxlV2l0aFByb2dyZXNzKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bihmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIAotCQkJICAgIAl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCSAgICB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY29ubmVjdGluZ1RvRGF0YWJhc2UsIDEwKTsKLQkJCQkJZmluYWwgU3luY2hyb25pemVkQm9vbGVhbiBmaW5pc2hlZCA9IG5ldyBTeW5jaHJvbml6ZWRCb29sZWFuKGZhbHNlKTsKLQkJCQkJVGhyZWFkIHQgPSBuZXcgVGhyZWFkKCkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLnNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQkJCQkJCX0gCi0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZXgpOwotCQkJCQkJCX0gCi0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWZpbmlzaGVkLnNldFRydWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9CQkJCQkJCi0JCQkJCX07Ci0JCQkJCXQuc3RhcnQoKTsKLS8vIFVwZGF0aW5nIHRoZSBtb25pdG9yIGNhdXNlZCBUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UgYnV0dG9ucyB0byBiZSBkaXNhYmxlCi0vLwkJCQkJd2hpbGUoZmluaXNoZWQuaXNGYWxzZSgpKSB7Ci0vLwkJCQkJCVRocmVhZC5zbGVlcCgxMDAwKTsKLS8vCQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0vLwkJCQkJfQotCQkJICAgICAgICAvLyBldmVyeXRoaW5nIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQgd2hlbiB3ZSBnZXQgdGhlIHJlc3VsdGluZyBvcGVuIGV2ZW50Ci0JCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJICAgIH0KLQkJCX0pOwotCQl9IAotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJfQotCQl0aGlzLndpemFyZENvbnRhaW5lci51cGRhdGVCdXR0b25zKCk7Ci0JfQotCi0JLyoqCi0JICogY2FsbGVkIHdoZW4KLQkgKiAgICAgLSB0aGUgdXNlciBzZWxlY3RzIGEgbmV3IGNvbm5lY3Rpb24KLQkgKiAgICAgLSB0aGUgY29ubmVjdGlvbiB3YXMgb3BlbmVkCi0JICogICAgIC0gdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCAobmV2ZXIgaGFwcGVucz8pCi0JICogd2UgbmVlZCB0byB1cGRhdGUgdGhlIHNjaGVtYSBzdHVmZiBhbmQgdGhlIHJlY29ubmVjdCBsaW5rCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3Rpb25DaGFuZ2VkKCkgewotCQlTY2hlbWEgb2xkID0gdGhpcy5zZWxlY3RlZFNjaGVtYTsKLQkJdGhpcy5zZWxlY3RlZFNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCQlpZih0aGlzLnNlbGVjdGVkU2NoZW1hICE9IG9sZCkgewotCQkJdGhpcy5maXJlU2NoZW1hQ2hhbmdlZCh0aGlzLnNlbGVjdGVkU2NoZW1hKTsKLQkJfQotCQl0aGlzLnVwZGF0ZVNjaGVtYUNvbWJvQm94KCk7Ci0JCXRoaXMudXBkYXRlUmVjb25uZWN0TGluaygpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZENvbm5lY3Rpb25Db21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJLy8gbm90aGluZyBzcGVjaWFsIGZvciAiZGVmYXVsdCIgKGRvdWJsZS1jbGljaz8pCi0JCQkJdGhpcy53aWRnZXRTZWxlY3RlZChldmVudCk7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURhdGFiYXNlR3JvdXAudGhpcy5zZWxlY3RlZENvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlIGNvbm5lY3Rpb24gY29tYm8tYm94IHNlbGVjdGlvbiBsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2NoZW1hQ29tYm9Cb3hTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBmb3IgImRlZmF1bHQiIChkb3VibGUtY2xpY2s/KQotCQkJCXRoaXMud2lkZ2V0U2VsZWN0ZWQoZXZlbnQpOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEYXRhYmFzZUdyb3VwLnRoaXMuc2VsZWN0ZWRTY2hlbWFDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJEYXRhYmFzZUNvbm5lY3Rpb25XaXphcmRQYWdlIHNjaGVtYSBjb21iby1ib3ggc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgYnVpbGRBZGRDb25uZWN0aW9uTGlua1NlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGF0YWJhc2VHcm91cC50aGlzLmFkZENvbm5lY3Rpb24oKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkRhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UgYWRkIGNvbm5lY3Rpb24gbGluayBzZWxlY3Rpb24gbGlzdGVuZXIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJlY29ubmVjdExpbmtTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCURhdGFiYXNlR3JvdXAudGhpcy5yZWNvbm5lY3QoKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCQlyZXR1cm4gIkRhdGFiYXNlQ29ubmVjdGlvbldpemFyZFBhZ2UgcmVjb25uZWN0IGxpbmsgc2VsZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgQ29ubmVjdGlvbkxpc3RlbmVyIGJ1aWxkQ29ubmVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IENvbm5lY3Rpb25BZGFwdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUgIC8vIHRoaXMgcHJvYmFibHkgd29uJ3QgZXZlciBnZXQgY2FsbGVkLi4uCi0JCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgY3ApIHsKLQkJCQl0aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlwcml2YXRlIHZvaWQgY29ubmVjdGlvbkNoYW5nZWQoKSB7Ci0JCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKAotCQkJCQluZXcgUnVubmFibGUoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJRGF0YWJhc2VHcm91cC50aGlzLmNvbm5lY3Rpb25DaGFuZ2VkKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiAiRGF0YWJhc2VDb25uZWN0aW9uV2l6YXJkUGFnZSBjb25uZWN0aW9uIGxpc3RlbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogbGlzdGVuZXJzICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmKCAhIHRoaXMubGlzdGVuZXJzLmFkZChsaXN0ZW5lcikpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImR1cGxpY2F0ZSBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYoICEgdGhpcy5saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWlzc2luZyBsaXN0ZW5lcjogIiArIGxpc3RlbmVyKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJdGVyYXRvcjxMaXN0ZW5lcj4gbGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IENsb25lSXRlcmF0b3I8TGlzdGVuZXI+KHRoaXMubGlzdGVuZXJzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZUNvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChDb25uZWN0aW9uUHJvZmlsZSBjb25uZWN0aW9uUHJvZmlsZSkgewotCQlmb3IoSXRlcmF0b3I8TGlzdGVuZXI+IHN0cmVhbSA9IHRoaXMubGlzdGVuZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5zZWxlY3RlZENvbm5lY3Rpb25Qcm9maWxlQ2hhbmdlZChjb25uZWN0aW9uUHJvZmlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSkgewotCQlmb3IoSXRlcmF0b3I8TGlzdGVuZXI+IHN0cmVhbSA9IHRoaXMubGlzdGVuZXJzKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJc3RyZWFtLm5leHQoKS5zZWxlY3RlZFNjaGVtYUNoYW5nZWQoc2NoZW1hKTsKLQkJfQotCX0KLQotCS8vICoqKioqKioqKiogVUkgY29tcG9uZW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIExhYmVsIGJ1aWxkTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBidWlsZENvbm5lY3Rpb25Db21ib0JveChDb21wb3NpdGUgcGFyZW50LCBpbnQgd2lkdGhIaW50KSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkNFTlRFUiwgdHJ1ZSwgZmFsc2UpOwotCQkvL2dyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlIDsKLQkJZ3JpZERhdGEud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQljb21iby5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcy5idWlsZENvbm5lY3Rpb25Db21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSBDb21ibyBidWlsZFNjaGVtYUNvbWJvQm94KENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlIDsKLQkJY29tYm8uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRTY2hlbWFDb21ib0JveFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gYnVpbGRCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRvb2xUaXBUZXh0LCBJbWFnZSBpbWFnZSwgU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkVORCwgR3JpZERhdGEuQ0VOVEVSLCBmYWxzZSwgZmFsc2UpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsU3BhbiA9IDE7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYnV0dG9uLnNldEltYWdlKCBpbWFnZSApOwotCQlidXR0b24uc2V0VG9vbFRpcFRleHQoIHRvb2xUaXBUZXh0KTsKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVyIGludGVyZmFjZSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBBbGxvd3MgY2xpZW50cyB0byBsaXN0ZW4gZm9yIGNoYW5nZXMgdG8gdGhlIHNlbGVjdGVkIGNvbm5lY3Rpb24gcHJvZmlsZQotCSAqIGFuZCBzY2hlbWEuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIKLQl7Ci0JCXZvaWQgc2VsZWN0ZWRDb25uZWN0aW9uUHJvZmlsZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgY29ubmVjdGlvblByb2ZpbGUpOwotCQkKLQkJdm9pZCBzZWxlY3RlZFNjaGVtYUNoYW5nZWQoU2NoZW1hIHNjaGVtYSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0RlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0RlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOWZjNDQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9EZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLk5ld1dpemFyZE1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLlR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5UeXBlZFZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YUVsZW1lbnRDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhRWxlbWVudExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3VHlwZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuSkRUVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5PUk1HZW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLkVsZW1lbnRUcmVlU2VsZWN0aW9uRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLS8qKgotICogQSB3aXphcmQgcGFnZSBhbGxvd2luZyB0aGUgZW50cnkgb2YgdGhlIGRlZmF1bHQgdGFibGUgZ2VuZXJhdGlvbiAKLSAqIHByb3BlcnRpZXMgKEphdmEgY2xhc3NlcyBwYWNrYWdlLCBiYXNlIGNsYXNzLCBldGMpLgotICogVGhlc2UgcHJvcGVydGllcyBhcHBseSB0byBhbGwgdGFibGVzIHVubGVzcyBleHBsaWNpdGx5IG92ZXJyaWRkZW4gKGluIHRoZSB0YWJsZSBnZW5lcmF0aW9uIHBhZ2UpLgotICogCi0gKiBAYXV0aG9yIERhbm55IEp1Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBOZXdUeXBlV2l6YXJkUGFnZSB7Ci0KLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCS8qdGhlIGluc3RhbmNlIHVzZWQgdG8gZ2V0L3NldCB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzLiovCi0JcHJpdmF0ZSBPUk1HZW5UYWJsZSBkZWZhdWx0c1RhYmxlOwotCi0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXI7Ci0JCi0JcHJpdmF0ZSBUYWJsZUdlblBhbmVsIGRlZmF1bHRUYWJsZUdlblBhbmVsIDsKLQotCXByb3RlY3RlZCBEZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZShKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJc3VwZXIodHJ1ZSwgIkRlZmF1bHRUYWJsZUdlbmVyYXRpb25XaXphcmRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJc2V0VGl0bGUoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfdGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbiggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZGVzYyk7Ci0JfQotCQotCQotCS8vIC0tLS0tLS0tIEluaXRpYWxpemF0aW9uIC0tLS0tLS0tLQotCS8qKgotCSAqIFRoZSB3aXphcmQgb3duaW5nIHRoaXMgcGFnZSBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGlzIG1ldGhvZCB3aXRoIHRoZQotCSAqIGN1cnJlbnQgc2VsZWN0aW9uLiBUaGUgc2VsZWN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzIG9mIHRoZSB3aXphcmQgCi0JICogcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2VsZWN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGRzCi0JICovCi0Jdm9pZCBpbml0KElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnQgamVsZW0gPSBudWxsOwotCQlpZiAoIHNlbGVjdGlvbiE9bnVsbCAmJiBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkgaW5zdGFuY2VvZiBJSmF2YUVsZW1lbnQgKSB7Ci0JCQlqZWxlbSA9IChJSmF2YUVsZW1lbnQpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfWVsc2V7Ci0JCQlqZWxlbSA9IHRoaXMuanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwkJCQotCQl9Ci0JCWlmKCBqZWxlbSAhPW51bGwgKXsKLQkJCWluaXRDb250YWluZXJQYWdlKGplbGVtKTsKLQkJCWluaXRUeXBlUGFnZShqZWxlbSk7Ci0JCX0KLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gNAkJOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9DVVNUT01JWkVfREVGQVVMVF9FTlRJVFlfR0VORVJBVElPTik7Ci0KLQkJLy9DcmVhdGUgZW50aXR5IGFjY2VzcywgY29sbGVjdGlvbiB0eXBlLCBldGMgCi0JCWRlZmF1bHRUYWJsZUdlblBhbmVsID0gbmV3IFRhYmxlR2VuUGFuZWwoY29tcG9zaXRlLCA0LCB0cnVlLCB0aGlzKTsKLQkJCi0JCWNyZWF0ZURvbWFpbkphdmFDbGFzc2VzUHJvcGVydGllc0dyb3VwKGNvbXBvc2l0ZSwgNCk7Ci0JCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUgKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAodmlzaWJsZSkgewotCQkJT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyID0gZ2V0Q3VzdG9taXplcigpOwotCQkJLy9JZiB1c2VyIGNoYW5nZWQgdGhlIGNvbm5lY3Rpb24gb3Igc2NoZW1hCi0JCQlpZiAoIHRoaXMuY3VzdG9taXplciAhPSBjdXN0b21pemVyICkgewotCQkJCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXI7IAotCQkJCWRlZmF1bHRzVGFibGU9Y3VzdG9taXplci5jcmVhdGVHZW5UYWJsZShudWxsKTsKLQkJCQlkZWZhdWx0VGFibGVHZW5QYW5lbC5zZXRPUk1HZW5UYWJsZShkZWZhdWx0c1RhYmxlKTsKLQkJCQkvL3NldCB0aGUgc3VwZXIgY2xhc3MgYW5kIGltcGxlbWVudGVkIGludGVyZmFjZXMgdmFsdWUKLQkJCQlTdHJpbmcgYmFzZUNsYXNzID0gZGVmYXVsdHNUYWJsZS5nZXRFeHRlbmRzKCkgPT0gbnVsbCA/IiIgOiBkZWZhdWx0c1RhYmxlLmdldEV4dGVuZHMoKTsKLQkJCQlzZXRTdXBlckNsYXNzKGJhc2VDbGFzcywgdHJ1ZSk7Ci0JCQkJc2V0U3VwZXJJbnRlcmZhY2VzKGRlZmF1bHRzVGFibGUuZ2V0SW1wbGVtZW50cygpLCB0cnVlKTsKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCByb290ID0gZ2V0U291cmNlRm9sZGVyKCBkZWZhdWx0c1RhYmxlLmdldFNvdXJjZUZvbGRlcigpKTsKLQkJCQlTdHJpbmcgaW5pdFBhY2thZ2VOYW1lID0gdGhpcy5nZXRQYWNrYWdlVGV4dCgpOwotCQkJCWlmKCBpbml0UGFja2FnZU5hbWUubGVuZ3RoKCk9PTAgKXsKLQkJCQkJc2V0UGFja2FnZU5hbWUoIHJvb3QsIGRlZmF1bHRzVGFibGUuZ2V0UGFja2FnZSgpICk7Ci0JCQkJfQotCQkJCXNldFBhY2thZ2VGcmFnbWVudFJvb3Qocm9vdCwgdHJ1ZS8qY2FuQmVNb2RpZmllZCovKTsKLQkJCX0KLQkJfQotCX0KLQkKLQkvL3NlYXJjaCBmb3IgdGhlIHNvdXJjZSBmb2xkZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBvciByZXR1cm4gdGhlIGZpcnN0Ci0JLy9zb3VyY2UgZm9sZGVyIGlmIG5vdCBmb3VuZC4KLQlwcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IGdldFNvdXJjZUZvbGRlcihTdHJpbmcgc3JjRm9sZGVyKSB7Ci0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBudWxsOwotCQlzcmNGb2xkZXIgPSAnLycgKyBzcmNGb2xkZXI7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IHRoaXMuanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpOwotCi0JCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKGphdmFQcm9qZWN0KSkgewotCQkJLy9TYXZlIHRoZSBmaXJzdCBzb3VyY2Ugcm9vdCBpbiBjYXNlIHdlIGRvbid0IGZpbmQgb25lIHRoYXQgbWF0Y2hlcyB0aGUgc2F2ZWQgdmFsdWUKLQkJCWlmIChwYWNrYWdlRnJhZ21lbnRSb290ID09IG51bGwpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gcm9vdDsKLQkJCX0KLQkJCS8vY2hlY2sgZm9yIGFsdGVybmF0aXZlIHNvdXJjZSByb290IHRoYXQgbWF0Y2hlcyB0aGUgc2F2ZWQgdmFsdWUKLQkJCWlmIChyb290LmdldFBhdGgoKS50b1N0cmluZygpLmVxdWFscyhzcmNGb2xkZXIpKXsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290ID0gcm9vdDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFja2FnZUZyYWdtZW50Um9vdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHNldFBhY2thZ2VOYW1lKElQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QsIFN0cmluZyBwYWNrYWdlTmFtZSkgewotCQlpZiggcGFja2FnZU5hbWUgPT0gbnVsbCB8fCBwYWNrYWdlTmFtZS5sZW5ndGgoKSA9PSAwIHx8IHBhY2thZ2VGcmFnbWVudFJvb3Q9PW51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VOYW1lKTsKLQkJc2V0UGFja2FnZUZyYWdtZW50KHBhY2thZ2VGcmFnbWVudCwgdHJ1ZS8qY2FuQmVNb2RpZmllZCovKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvbWFpbkphdmFDbGFzc2VzUHJvcGVydGllc0dyb3VwKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCUdyb3VwIHBhcmVudCA9IG5ldyBHcm91cCggY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9kb21haW5KYXZhQ2xhc3MpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCBjb2x1bW5zLCBmYWxzZSkpOwotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJcGFyZW50LnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCQotCQkvL2RlZmF1bHQgSmF2YSBwYWNrYWdlIG5hbWUgb25seSBhdmFpbGFibGUgZm9yIGRlZmF1bHQgdGFibGUgZ2VuZXJhdGlvbgotCQljcmVhdGVDb250YWluZXJDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQljcmVhdGVQYWNrYWdlQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJY3JlYXRlU3VwZXJDbGFzc0NvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCWNyZWF0ZVN1cGVySW50ZXJmYWNlc0NvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJU3RhdHVzIHBhY2thZ2VDaGFuZ2VkKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnBhY2thZ2VDaGFuZ2VkKCk7IAotCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnbWVudCA9IGdldFBhY2thZ2VGcmFnbWVudCgpOwotCQkvL1N0cmluZyBzcmNGb2xkZXIgPSBwYWNrYWdlRnJhZ21lbnQuZ2V0UGF0aCgpLnRvUG9ydGFibGVTdHJpbmcoKTsKLQkJaWYgKGRlZmF1bHRzVGFibGUgIT0gbnVsbCAmJiAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCWRlZmF1bHRzVGFibGUuc2V0UGFja2FnZShwYWNrYWdlRnJhZ21lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9CQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJDbGFzc0NoYW5nZWQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIuc3VwZXJDbGFzc0NoYW5nZWQoKTsKLQkJU3RyaW5nIGJhc2VDbGFzcyA9IGdldFN1cGVyQ2xhc3MoKTsKLQkJaWYgKGJhc2VDbGFzcyAhPSBudWxsICYmIGRlZmF1bHRzVGFibGUgIT0gbnVsbCAmJiAhc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCVN0cmluZyBvbGRCYXNlQ2xhc3MgPSBkZWZhdWx0c1RhYmxlLmdldEV4dGVuZHMoKTsKLQkJCWlmICggIWJhc2VDbGFzcy5lcXVhbHMob2xkQmFzZUNsYXNzKSkgewotCQkJCWRlZmF1bHRzVGFibGUuc2V0RXh0ZW5kcyhiYXNlQ2xhc3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7IAotCX0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgY29udGFpbmVyQ2hhbmdlZCgpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci5jb250YWluZXJDaGFuZ2VkKCk7Ci0JCVN0cmluZyBzcmNGb2xkZXIgPSBnZXRQYWNrYWdlRnJhZ21lbnRSb290VGV4dCgpOwotCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7Ci0JCQlpZiAoZGVmYXVsdHNUYWJsZSAhPSBudWxsICkgewotCQkJCWRlZmF1bHRzVGFibGUuc2V0U291cmNlRm9sZGVyKCBzcmNGb2xkZXIgKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKiBPdmVycmlkZSB0byBhbGxvdyBzZWxlY3Qgc291cmNlIGZvbGRlciBpbiBjdXJyZW50IHByb2plY3Qgb25seQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3Q29udGFpbmVyV2l6YXJkUGFnZSNjaG9vc2VDb250YWluZXIoKQotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJUGFja2FnZUZyYWdtZW50Um9vdCBjaG9vc2VDb250YWluZXIoKSB7Ci0JCUNsYXNzPD8+W10gYWNjZXB0ZWRDbGFzc2VzID0gbmV3IENsYXNzW10geyBJUGFja2FnZUZyYWdtZW50Um9vdC5jbGFzcywgSUphdmFQcm9qZWN0LmNsYXNzIH07Ci0JCVR5cGVkRWxlbWVudFNlbGVjdGlvblZhbGlkYXRvciB2YWxpZGF0b3I9IG5ldyBUeXBlZEVsZW1lbnRTZWxlY3Rpb25WYWxpZGF0b3IoYWNjZXB0ZWRDbGFzc2VzLCBmYWxzZSkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkVmFsaWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQl0cnkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElKYXZhUHJvamVjdCkgewotCQkJCQkJSUphdmFQcm9qZWN0IGpwcm9qZWN0PSAoSUphdmFQcm9qZWN0KWVsZW1lbnQ7Ci0JCQkJCQlJUGF0aCBwYXRoPSBqcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQkJCXJldHVybiAoanByb2plY3QuZmluZFBhY2thZ2VGcmFnbWVudFJvb3QocGF0aCkgIT0gbnVsbCk7Ci0JCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCQlyZXR1cm4gSkRUVG9vbHMucGFja2FnZUZyYWdtZW50Um9vdElzU291cmNlRm9sZGVyKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOyAvLyBqdXN0IGxvZywgbm8gVUkgaW4gdmFsaWRhdGlvbgotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0KLQkJYWNjZXB0ZWRDbGFzc2VzPSBuZXcgQ2xhc3NbXSB7IElKYXZhTW9kZWwuY2xhc3MsIElQYWNrYWdlRnJhZ21lbnRSb290LmNsYXNzLCBJSmF2YVByb2plY3QuY2xhc3MgfTsKLQkJVmlld2VyRmlsdGVyIGZpbHRlcj0gbmV3IFR5cGVkVmlld2VyRmlsdGVyKGFjY2VwdGVkQ2xhc3NlcykgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnRSb290KSB7Ci0JCQkJCXJldHVybiBKRFRUb29scy5wYWNrYWdlRnJhZ21lbnRSb290SXNTb3VyY2VGb2xkZXIoKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLnNlbGVjdCh2aWV3ZXIsIHBhcmVudCwgZWxlbWVudCk7Ci0JCQl9Ci0JCX07Ci0KLQkJU3RhbmRhcmRKYXZhRWxlbWVudENvbnRlbnRQcm92aWRlciBwcm92aWRlcj0gbmV3IFN0YW5kYXJkSmF2YUVsZW1lbnRDb250ZW50UHJvdmlkZXIoKTsKLQkJSUxhYmVsUHJvdmlkZXIgbGFiZWxQcm92aWRlcj0gbmV3IEphdmFFbGVtZW50TGFiZWxQcm92aWRlcihKYXZhRWxlbWVudExhYmVsUHJvdmlkZXIuU0hPV19ERUZBVUxUKTsKLQkJRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2cgZGlhbG9nPSBuZXcgRWxlbWVudFRyZWVTZWxlY3Rpb25EaWFsb2coZ2V0U2hlbGwoKSwgbGFiZWxQcm92aWRlciwgcHJvdmlkZXIpOwotCQlkaWFsb2cuc2V0VmFsaWRhdG9yKHZhbGlkYXRvcik7Ci0JCWRpYWxvZy5zZXRDb21wYXJhdG9yKG5ldyBKYXZhRWxlbWVudENvbXBhcmF0b3IoKSk7Ci0JCWRpYWxvZy5zZXRUaXRsZShOZXdXaXphcmRNZXNzYWdlcy5OZXdDb250YWluZXJXaXphcmRQYWdlX0Nob29zZVNvdXJjZUNvbnRhaW5lckRpYWxvZ190aXRsZSk7Ci0JCWRpYWxvZy5zZXRNZXNzYWdlKE5ld1dpemFyZE1lc3NhZ2VzLk5ld0NvbnRhaW5lcldpemFyZFBhZ2VfQ2hvb3NlU291cmNlQ29udGFpbmVyRGlhbG9nX2Rlc2NyaXB0aW9uKTsKLQkJZGlhbG9nLmFkZEZpbHRlcihmaWx0ZXIpOwotCQlkaWFsb2cuc2V0SW5wdXQoanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpKTsKLQkJZGlhbG9nLnNldEluaXRpYWxTZWxlY3Rpb24oZ2V0UGFja2FnZUZyYWdtZW50Um9vdCgpKTsKLQkJZGlhbG9nLnNldEhlbHBBdmFpbGFibGUoZmFsc2UpOwotCi0JCWlmIChkaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJT2JqZWN0IGVsZW1lbnQ9IGRpYWxvZy5nZXRGaXJzdFJlc3VsdCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJSmF2YVByb2plY3QpIHsKLQkJCQlJSmF2YVByb2plY3QganByb2plY3Q9IChJSmF2YVByb2plY3QpZWxlbWVudDsKLQkJCQlyZXR1cm4ganByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdChqcHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudFJvb3QpIHsKLQkJCQlyZXR1cm4gKElQYWNrYWdlRnJhZ21lbnRSb290KWVsZW1lbnQ7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlRmllbGRDaGFuZ2VkKFN0cmluZyBmaWVsZE5hbWUpIHsKLQkJc3VwZXIuaGFuZGxlRmllbGRDaGFuZ2VkKGZpZWxkTmFtZSk7Ci0JCWlmICh0aGlzLmZDb250YWluZXJTdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJdXBkYXRlU3RhdHVzKGZDb250YWluZXJTdGF0dXMpOwotCQl9ZWxzZSBpZiggISB0aGlzLmZQYWNrYWdlU3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5PSykgKSB7Ci0JCQl1cGRhdGVTdGF0dXMoZlBhY2thZ2VTdGF0dXMpOwotCQl9IGVsc2UgaWYgKHRoaXMuZlN1cGVyQ2xhc3NTdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJdXBkYXRlU3RhdHVzKGZTdXBlckNsYXNzU3RhdHVzKTsKLQkJfSBlbHNlIHsKLQkJCXVwZGF0ZVN0YXR1cyhTdGF0dXMuT0tfU1RBVFVTKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMiIH0pCi0JcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJJbnRlcmZhY2VzQ2hhbmdlZCgpIHsKLQkJSVN0YXR1cyByZXQgPSBzdXBlci5zdXBlckludGVyZmFjZXNDaGFuZ2VkKCk7Ci0JCWlmICggcmV0LmlzT0soKSApIHsKLQkJCUxpc3QgaW50ZXJmYWNlcyA9IGdldFN1cGVySW50ZXJmYWNlcygpOwotCQkJaWYoZGVmYXVsdHNUYWJsZSE9bnVsbCkKLQkJCQlkZWZhdWx0c1RhYmxlLnNldEltcGxlbWVudHMoaW50ZXJmYWNlcyk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CQotCi0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGdldEN1c3RvbWl6ZXIoKSB7Ci0JCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgdGhpcy5nZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5nZXRDdXN0b21pemVyKCk7Ci0JfQkKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgewotICAgICAgICB0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0dlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0dlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMWI5YzcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9HZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUnVsZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLldvcmtzcGFjZUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuTG9jYWxSZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuUmVzb3VyY2VNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwudXRpbGl0eS5KRFRUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5FbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5CYXNlRW50aXR5R2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5EYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLk9STUdlblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLlBhY2thZ2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQgZXh0ZW5kcyBXaXphcmQgCi0JaW1wbGVtZW50cyBJTmV3V2l6YXJkICB7CQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTFBfQ09OVEVYVF9JRCA9IEpwdEpwYVVpUGx1Z2luLlBMVUdJTl9JRCArICIuR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uOwotCi0JcHJpdmF0ZSBPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBudWxsOwkKLQotCXByaXZhdGUgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UgcHJvamVjdFBhZ2U7CQotCi0JcHJpdmF0ZSBUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UgdGFibGVzU2VsZWN0b3JQYWdlOwotCi0JcHJpdmF0ZSBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgdGFibGVBc3NvY2lhdGlvbnNQYWdlOwotCQotCXByaXZhdGUgRGVmYXVsdFRhYmxlR2VuZXJhdGlvbldpemFyZFBhZ2UgZGVmYXVsdFRhYmxlR2VuZXJhdGlvblBhZ2U7Ci0JCi0JcHJpdmF0ZSBUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UgdGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25QYWdlOwotCQotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCQotCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCgpIHsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSBuZXcgTG9jYWxSZXNvdXJjZU1hbmFnZXIoSkZhY2VSZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkpOwotCQl0aGlzLnNldFdpbmRvd1RpdGxlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcyk7Ci0JfQotCQotCXB1YmxpYyBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCggSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5zZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCXRoaXMucmVzb3VyY2VNYW5hZ2VyID0gbmV3IExvY2FsUmVzb3VyY2VNYW5hZ2VyKEpGYWNlUmVzb3VyY2VzLmdldFJlc291cmNlcygpKTsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2dlbmVyYXRlRW50aXRpZXMpOwotCQl0aGlzLnNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEpwdEpwYVVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRVaUljb25zLkVOVElUWV9XSVpfQkFOTkVSKSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlzZXRGb3JjZVByZXZpb3VzQW5kTmV4dEJ1dHRvbnModHJ1ZSk7Ci0JCQotCQkvL0lmIHRoaXMuanBhUHJvamVjdCBpcyBub3QgaW5pdGlhbGl6ZWQgYmVjYXVzZSB1c2VyIGRpZG4ndCBzZWxlY3QgYSBKUEEgcHJvamVjdAotCQlpZiggdGhpcy5qcGFQcm9qZWN0ID09IG51bGwgKXsKLQkJCXRoaXMucHJvamVjdFBhZ2UgPSBuZXcgUHJvbXB0SlBBUHJvamVjdFdpemFyZFBhZ2UoSEVMUF9DT05URVhUX0lEKTsKLQkJCXRoaXMuYWRkUGFnZSh0aGlzLnByb2plY3RQYWdlKTsKLQkJCXJldHVybjsKLQkJfQotCQlhZGRNYWluUGFnZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTWFpblBhZ2VzKCkgewotCQl0aGlzLnRhYmxlc1NlbGVjdG9yUGFnZSA9IG5ldyBUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UodGhpcy5qcGFQcm9qZWN0LCB0aGlzLnJlc291cmNlTWFuYWdlcik7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLnRhYmxlc1NlbGVjdG9yUGFnZSk7Ci0JCQotCQl0aGlzLnRhYmxlQXNzb2NpYXRpb25zUGFnZSA9IG5ldyBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UodGhpcy5qcGFQcm9qZWN0LCB0aGlzLnJlc291cmNlTWFuYWdlcik7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLnRhYmxlQXNzb2NpYXRpb25zUGFnZSk7Ci0KLQkJdGhpcy5kZWZhdWx0VGFibGVHZW5lcmF0aW9uUGFnZSA9IG5ldyBEZWZhdWx0VGFibGVHZW5lcmF0aW9uV2l6YXJkUGFnZSh0aGlzLmpwYVByb2plY3QpOwotCQl0aGlzLmFkZFBhZ2UodGhpcy5kZWZhdWx0VGFibGVHZW5lcmF0aW9uUGFnZSk7Ci0JCXRoaXMuZGVmYXVsdFRhYmxlR2VuZXJhdGlvblBhZ2UuaW5pdCh0aGlzLnNlbGVjdGlvbik7Ci0JCQotCQl0aGlzLnRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uUGFnZSA9IG5ldyBUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UodGhpcy5qcGFQcm9qZWN0LCB0aGlzLnJlc291cmNlTWFuYWdlcik7Ci0JCXRoaXMuYWRkUGFnZSh0aGlzLnRhYmxlc0FuZENvbHVtbnNDdXN0b21pemF0aW9uUGFnZSk7Ci0JCXRoaXMudGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25QYWdlLmluaXQodGhpcy5zZWxlY3Rpb24pOwkJCi0JfQotCQotCXB1YmxpYyBPUk1HZW5DdXN0b21pemVyIGdldE9STUdlbkN1c3RvbWl6ZXIoKXsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIE9STUdlbkN1c3RvbWl6ZXIgd2hlbiB1c2VyIHNlbGVjdHMgYSBuZXcgY29ubmVjdGlvbiBwcm9maWxlIGFuZCBzY2hlbWEgCi0JICogCi0JICogSnBhUGxhdGZvcm0gaW1wbGVtZW50b3IgY2FuIHByb3ZpZGUgYSBjdXN0b20gT1JNR2VuQ3VzdG9taXplciBzcGVjaWZpYyB0byBhIHBsYXRmb3JtCi0JICogd2l0aCBBZGFwdGVyRmFjdG9yeSB0aHJvdWdoIEVjbGlwc2Ugb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIGV4dGVuc2lvbiBwb2ludDoKLQkgKiA8cHJlPiAKLQkgKiAgCi0JICo8ZXh0ZW5zaW9uCi0gICAgICogICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+Ci0gICAgICogPGZhY3RvcnkKLSAgICAgKiAgICAgICBhZGFwdGFibGVUeXBlPSJvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmtQbGF0Zm9ybSIKLSAgICAgKiAgICAgICBjbGFzcz0ib3JhY2xlLmVjbGlwc2UudG9vbHMub3JtLmludGVybmFsLkVjbGlwc2VMaW5rT1JNR2VuQ3VzdG9taXplckFkYXB0ZXJGYWN0b3J5Ij4KLSAgICAgKiAgICA8YWRhcHRlcgotICAgICAqICAgICAgICAgIHR5cGU9Im9yYWNsZS5lY2xpcHNlLnRvb2xzLm9ybS5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyIj4KLSAgICAgKiAgICA8L2FkYXB0ZXI+Ci0gICAgICogPC9mYWN0b3J5PgotICAgICAqPC9leHRlbnNpb24+Ci0JICo8L3ByZT4gCi0JICogCi0JICogQHBhcmFtIHNjaGVtYSAKLQkgKi8KLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBjcmVhdGVPUk1HZW5DdXN0b21pemVyKFNjaGVtYSBzY2hlbWEpewotCQlKcGFQbGF0Zm9ybSBqcGFQbGF0Zm9ybSA9IHRoaXMuanBhUHJvamVjdC5nZXRKcGFQbGF0Zm9ybSgpOwotCQlPYmplY3Qgb2JqID0gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKCBqcGFQbGF0Zm9ybSwgT1JNR2VuQ3VzdG9taXplci5jbGFzcyApOwotCQlpZiAob2JqICE9IG51bGwgICYmIG9iaiBpbnN0YW5jZW9mIE9STUdlbkN1c3RvbWl6ZXIpIHsKLQkJCXRoaXMuY3VzdG9taXplciA9IChPUk1HZW5DdXN0b21pemVyKSBvYmo7IAotCQkJdGhpcy5jdXN0b21pemVyLmluaXQoZ2V0Q3VzdG9taXphdGlvbkZpbGUoKSwgc2NoZW1hKTsgIAotCQl9IGVsc2V7Ci0JCQl0aGlzLmN1c3RvbWl6ZXIgPSBuZXcgQmFzZUVudGl0eUdlbkN1c3RvbWl6ZXIoICk7Ci0JCQl0aGlzLmN1c3RvbWl6ZXIuaW5pdChnZXRDdXN0b21pemF0aW9uRmlsZSgpLCBzY2hlbWEpOyAgCi0JCX0KLQotCQlPUk1HZW5UYWJsZSBuZXdEZWZhdWx0VGFibGUgPSBnZXRDdXN0b21pemVyKCkuY3JlYXRlR2VuVGFibGUobnVsbCk7Ci0JCWlmICggc2VsZWN0aW9uIT1udWxsICYmIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQYWNrYWdlRnJhZ21lbnQgKSB7Ci0JCQlJUGFja2FnZUZyYWdtZW50IHBhY2thZ2VGcmFnID0gKElQYWNrYWdlRnJhZ21lbnQpc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJbmV3RGVmYXVsdFRhYmxlLnNldFBhY2thZ2UoIHBhY2thZ2VGcmFnLmdldEVsZW1lbnROYW1lKCkgKTsKLQkJCWZvciAoSVBhY2thZ2VGcmFnbWVudFJvb3Qgcm9vdCA6IEpEVFRvb2xzLmdldEphdmFTb3VyY2VGb2xkZXJzKHRoaXMuanBhUHJvamVjdC5nZXRKYXZhUHJvamVjdCgpKSkgewotCQkJCVN0cmluZyBzcmNGb2xkZXIgPSByb290LmdldFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCk7Ci0JCQkJaWYoIHBhY2thZ2VGcmFnLmdldFBhdGgoKS50b1BvcnRhYmxlU3RyaW5nKCkuc3RhcnRzV2l0aCggc3JjRm9sZGVyICsnLycgKSl7Ci0JCQkJCW5ld0RlZmF1bHRUYWJsZS5zZXRTb3VyY2VGb2xkZXIoc3JjRm9sZGVyLnN1YnN0cmluZygxKSk7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXplcjsKLQl9IAotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q3VzdG9taXphdGlvbkZpbGVOYW1lKCkgewotCQlDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JCVN0cmluZyBjb25uZWN0aW9uID0gcHJvZmlsZSA9PSBudWxsID8gIiIgOiBwcm9maWxlLmdldE5hbWUoKTsKLQkJU3RyaW5nIG5hbWUgPSAib3JnLmVjbGlwc2UuanB0LmVudGl0eWdlbi4iICsgKGNvbm5lY3Rpb24gPT0gbnVsbCA/ICIiIDpjb25uZWN0aW9uLnJlcGxhY2UoJyAnLCAnLScpKTsgIC8vJE5PTi1OTFMtMSQKLQkJU2NoZW1hIHNjaGVtYSA9IGdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKCBzY2hlbWEhPSBudWxsICApIHsKLQkJCW5hbWUgKz0gIi4iICsgc2NoZW1hLmdldE5hbWUoKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm9kZXMgc3RhdGUgZmlsZS4gCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEN1c3RvbWl6YXRpb25GaWxlKCkgewotCQlTdHJpbmcgcHJvamVjdFBhdGggPSB0aGlzLmpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldExvY2F0aW9uKCkudG9Qb3J0YWJsZVN0cmluZygpOwotCQlGaWxlIGdlbkRpciA9IG5ldyBGaWxlKHByb2plY3RQYXRoICsgIi8uc2V0dGluZ3MiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIGdlbkRpci5ta2RpcnMoKTsKLQkJcmV0dXJuIG5ldyBGaWxlKGdlbkRpciwgZ2V0Q3VzdG9taXphdGlvbkZpbGVOYW1lKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWlmICh0aGlzLmpwYVByb2plY3QgPT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJdHJ5IHsKLQkJCXRoaXMuY3VzdG9taXplci5zZXREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciggYnVpbGREYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlcigpICk7Ci0JCQl0aGlzLmN1c3RvbWl6ZXIuc2F2ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCX0KLQkJT3ZlcndyaXRlQ29uZmlybWVyIG92ZXJ3cml0ZUNvbmZpcm1lciA9IG51bGw7Ci0JCWlmIChzaG93T3ZlcndyaXRlV2FybmluZygpKSB7Ci0JCQlvdmVyd3JpdGVDb25maXJtZXIgPSBuZXcgT3ZlcndyaXRlQ29uZmlybWVyKCk7Ci0JCX0KLQkJCi0JCVdvcmtzcGFjZUpvYiBnZW5FbnRpdGllc0pvYiA9IG5ldyBHZW5lcmF0ZUVudGl0aWVzSm9iKHRoaXMuanBhUHJvamVjdCwgZ2V0Q3VzdG9taXplcigpLCBvdmVyd3JpdGVDb25maXJtZXIpOwotCQlnZW5FbnRpdGllc0pvYi5zY2hlZHVsZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBnZW5lcmF0ZSBlbnRpdGllcyBqb2IgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIEdlbmVyYXRlRW50aXRpZXNKb2IgZXh0ZW5kcyBXb3Jrc3BhY2VKb2IgewotCQlmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCWZpbmFsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQkJZmluYWwgT3ZlcndyaXRlQ29uZmlybWVyIGNvbmZpcm1lcjsKLQkJR2VuZXJhdGVFbnRpdGllc0pvYihKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgT3ZlcndyaXRlQ29uZmlybWVyIGNvbmZpcm1lcikgewotCQkJc3VwZXIoSnB0VWlNZXNzYWdlcy5FbnRpdGllc0dlbmVyYXRvcl9qb2JOYW1lKTsKLQkJCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXI7Ci0JCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQkJdGhpcy5jb25maXJtZXIgPSBjb25maXJtZXI7Ci0JCQlJUmVzb3VyY2VSdWxlRmFjdG9yeSBydWxlRmFjdG9yeSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSdWxlRmFjdG9yeSgpOwotCQkJdGhpcy5zZXRSdWxlKHJ1bGVGYWN0b3J5Lm1vZGlmeVJ1bGUoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQkJfQotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSVN0YXR1cyBydW5JbldvcmtzcGFjZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCVBhY2thZ2VHZW5lcmF0b3IuZ2VuZXJhdGUodGhpcy5qcGFQcm9qZWN0LHRoaXMuY3VzdG9taXplciwgdGhpcy5jb25maXJtZXIsIG1vbml0b3IpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvd092ZXJ3cml0ZVdhcm5pbmcoKXsKLSAgICAJcmV0dXJuIE9wdGlvbmFsTWVzc2FnZURpYWxvZy5pc0RpYWxvZ0VuYWJsZWQoT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nLklEKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gKioqKioqKioqKiBvdmVyd3JpdGUgY29uZmlybWVyICoqKioqKioqKioKLQotCXN0YXRpYyBjbGFzcyBPdmVyd3JpdGVDb25maXJtZXIgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5PdmVyd3JpdGVDb25maXJtZXIgewotCQlwcml2YXRlIGJvb2xlYW4gb3ZlcndyaXRlQWxsID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBza2lwQWxsID0gZmFsc2U7Ci0KLQkJT3ZlcndyaXRlQ29uZmlybWVyKCkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gb3ZlcndyaXRlKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCWlmICh0aGlzLm92ZXJ3cml0ZUFsbCkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJaWYgKHRoaXMuc2tpcEFsbCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnByb21wdFVzZXIoY2xhc3NOYW1lKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBwcm9tcHRVc2VyKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKLQkJCS8vIGdldCBvbiB0aGUgVUkgdGhyZWFkIHN5bmNocm9ub3VzbHksIG5lZWQgZmVlZGJhY2sgYmVmb3JlIGNvbnRpbnVpbmcKLQkJCWZpbmFsIGJvb2xlYW4gcmV0W109bmV3IGJvb2xlYW5bMV07Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmaW5hbCBPdmVyd3JpdGVDb25maXJtZXJEaWFsb2cgZGlhbG9nID0gbmV3IE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBjbGFzc05hbWUpOwotCQkJCQlkaWFsb2cub3BlbigpOwotCQkJCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuQ0FOQ0VMKSB7Ci0JCQkJCQkvL3Rocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQkJc2tpcEFsbCA9IHRydWU7Ci0JCQkJCQlyZXRbMF0gPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCQlpZiAoZGlhbG9nLnllcygpKSB7Ci0JCQkJCQlyZXRbMF0gPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWlmIChkaWFsb2cueWVzVG9BbGwoKSkgewotCQkJCQkJb3ZlcndyaXRlQWxsID0gdHJ1ZTsKLQkJCQkJCXJldFswXSA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGRpYWxvZy5ubygpKSB7Ci0JCQkJCQlyZXRbMF0gPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoZGlhbG9nLm5vVG9BbGwoKSkgewotCQkJCQkJc2tpcEFsbCA9IHRydWU7Ci0JCQkJCQlyZXRbMF0gPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQkJcmV0dXJuIHJldFswXTsKLQkJfQotCi0JfQotCi0KLQkvLyAqKioqKioqKioqIG92ZXJ3cml0ZSBkaWFsb2cgKioqKioqKioqKgotCi0Jc3RhdGljIGNsYXNzIE92ZXJ3cml0ZUNvbmZpcm1lckRpYWxvZyBleHRlbmRzIE9wdGlvbmFsTWVzc2FnZURpYWxvZyB7Ci0JCXByaXZhdGUgYm9vbGVhbiB5ZXMgPSBmYWxzZTsKLQkJcHJpdmF0ZSBib29sZWFuIHllc1RvQWxsID0gZmFsc2U7Ci0JCXByaXZhdGUgYm9vbGVhbiBubyA9IGZhbHNlOwotCQlwcml2YXRlIGJvb2xlYW4gbm9Ub0FsbCA9IGZhbHNlOwotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRD0gImRvbnRTaG93T3ZlcndyaXRlRW50aXRlc0Zyb21TY2hlbWFzLndhcm5pbmciOyAvLyROT04tTkxTLTEkCi0KLQkJT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nKFNoZWxsIHBhcmVudCwgU3RyaW5nIGNsYXNzTmFtZSkgewotCQkJc3VwZXIoSUQsIHBhcmVudCwKLQkJCQkJSnB0VWlNZXNzYWdlcy5PdmVyd3JpdGVDb25maXJtZXJEaWFsb2dfdGl0bGUsCi0JCQkJCU5MUy5iaW5kKEpwdFVpTWVzc2FnZXMuT3ZlcndyaXRlQ29uZmlybWVyRGlhbG9nX3RleHQsIGNsYXNzTmFtZSksCi0JCQkJCU1lc3NhZ2VEaWFsb2cuV0FSTklORywKLQkJCQkJbmV3IFN0cmluZ1tdIHtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgCi0JCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfTEFCRUwsIAotCQkJCQkJCQkJSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgCi0JCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLk5PX1RPX0FMTF9MQUJFTCwgCi0JCQkJCQkJCQlJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH0sCi0JCQkJCTIpOwotCQl9Ci0JCQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuWUVTX0lELCBJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgZmFsc2UpOwotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQsIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9MQUJFTCwgZmFsc2UpOwotCQkJdGhpcy5jcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk5PX0lELCBJRGlhbG9nQ29uc3RhbnRzLk5PX0xBQkVMLCB0cnVlKTsKLQkJCXRoaXMuY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfSUQsIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0xBQkVMLCBmYWxzZSk7Ci0JCQl0aGlzLmNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCQl9Ci0KLQkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCQlzd2l0Y2ggKGJ1dHRvbklkKSB7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCA6Ci0JCQkJCXRoaXMueWVzUHJlc3NlZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuWUVTX1RPX0FMTF9JRCA6Ci0JCQkJCXRoaXMueWVzVG9BbGxQcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19JRCA6Ci0JCQkJCXRoaXMubm9QcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5OT19UT19BTExfSUQgOgotCQkJCQl0aGlzLm5vVG9BbGxQcmVzc2VkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgOgotCQkJCQl0aGlzLmNhbmNlbFByZXNzZWQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHllc1ByZXNzZWQoKSB7Ci0JCQl0aGlzLnllcyA9IHRydWU7Ci0JCQl0aGlzLnNldFJldHVybkNvZGUoT0spOwotCQkJdGhpcy5jbG9zZSgpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHllc1RvQWxsUHJlc3NlZCgpIHsKLQkJCXRoaXMueWVzVG9BbGwgPSB0cnVlOwotCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKLQkJCXRoaXMuY2xvc2UoKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBub1ByZXNzZWQoKSB7Ci0JCQl0aGlzLm5vID0gdHJ1ZTsKLQkJCXRoaXMuc2V0UmV0dXJuQ29kZShPSyk7Ci0JCQl0aGlzLmNsb3NlKCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgbm9Ub0FsbFByZXNzZWQoKSB7Ci0JCQl0aGlzLm5vVG9BbGwgPSB0cnVlOwotCQkJdGhpcy5zZXRSZXR1cm5Db2RlKE9LKTsKLQkJCXRoaXMuY2xvc2UoKTsKLQkJfQotCi0JCWJvb2xlYW4geWVzKCkgewotCQkJcmV0dXJuIHRoaXMueWVzOwotCQl9Ci0KLQkJYm9vbGVhbiB5ZXNUb0FsbCgpIHsKLQkJCXJldHVybiB0aGlzLnllc1RvQWxsOwotCQl9Ci0KLQkJYm9vbGVhbiBubygpIHsKLQkJCXJldHVybiB0aGlzLm5vOwotCQl9Ci0KLQkJYm9vbGVhbiBub1RvQWxsKCkgewotCQkJcmV0dXJuIHRoaXMubm9Ub0FsbDsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBidWlsZERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKCkgewotCQlyZXR1cm4gbmV3IExvY2FsRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIodGhpcy5qcGFQcm9qZWN0LmdldEpwYVBsYXRmb3JtKCkuZ2V0RW50aXR5R2VuZXJhdG9yRGF0YWJhc2VBbm5vdGF0aW9uTmFtZUJ1aWxkZXIoKSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBuYW1lIGJ1aWxkZXIgYWRhcHRlciAqKioqKioqKioqCi0KLQkvKioKLQkgKiBhZGFwdCB0aGUgSlBBIHBsYXRmb3JtLXN1cHBsaWVkIGJ1aWxkZXIgdG8gdGhlIGJ1aWxkZXIgaW50ZXJmYWNlCi0JICogZXhwZWN0ZWQgYnkgdGhlIGVudGl0eSBnZW5lcmF0b3IKLQkgKi8KLQlzdGF0aWMgY2xhc3MgTG9jYWxEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBpbXBsZW1lbnRzIERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIHsKLQkJcHJpdmF0ZSBFbnRpdHlHZW5lcmF0b3JEYXRhYmFzZUFubm90YXRpb25OYW1lQnVpbGRlciBidWlsZGVyOwotCQlMb2NhbERhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyKEVudGl0eUdlbmVyYXRvckRhdGFiYXNlQW5ub3RhdGlvbk5hbWVCdWlsZGVyIGJ1aWxkZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRUYWJsZUFubm90YXRpb25OYW1lKFN0cmluZyBlbnRpdHlOYW1lLCBUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZFRhYmxlQW5ub3RhdGlvbk5hbWUoZW50aXR5TmFtZSwgdGFibGUpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRDb2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZENvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGNvbHVtbik7Ci0JCX0KLQkJcHVibGljIFN0cmluZyBidWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShTdHJpbmcgYXR0cmlidXRlTmFtZSwgRm9yZWlnbktleSBmb3JlaWduS2V5KSB7Ci0JCQlyZXR1cm4gdGhpcy5idWlsZGVyLmJ1aWxkSm9pbkNvbHVtbkFubm90YXRpb25OYW1lKGF0dHJpYnV0ZU5hbWUsIGZvcmVpZ25LZXkpOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luQ29sdW1uQW5ub3RhdGlvbk5hbWUoQ29sdW1uIGNvbHVtbikgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5Db2x1bW5Bbm5vdGF0aW9uTmFtZShjb2x1bW4pOwotCQl9Ci0JCXB1YmxpYyBTdHJpbmcgYnVpbGRKb2luVGFibGVBbm5vdGF0aW9uTmFtZShUYWJsZSB0YWJsZSkgewotCQkJcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZEpvaW5UYWJsZUFubm90YXRpb25OYW1lKHRhYmxlKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkgewotCQlpZiAodGhpcy5wcm9qZWN0UGFnZSAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy50YWJsZXNTZWxlY3RvclBhZ2UgIT0gbnVsbCkgewotCQkJCXJldHVybiB0aGlzLnRhYmxlc1NlbGVjdG9yUGFnZTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnByb2plY3RQYWdlOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRTdGFydGluZ1BhZ2UoKTsKLSAgICB9Ci0JCi0JcHVibGljIE9STUdlbkN1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplciAoKXsKLQkJcmV0dXJuIGN1c3RvbWl6ZXI7Ci0JfSAKLQkKLQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgZ2V0UHJvamVjdENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldENvbm5lY3Rpb25Qcm9maWxlKCk7Ci0JfQotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SnBhUHJvamVjdChKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJaWYgKHRoaXMuanBhUHJvamVjdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQkJSVdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSBnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotCQkJaWYgKHRoaXMucHJvamVjdFBhZ2UgIT0gbnVsbCAmJiBjdXJyZW50UGFnZS5lcXVhbHModGhpcy5wcm9qZWN0UGFnZSkpIHsKLQkJCQlhZGRNYWluUGFnZXMoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLQkJcmV0dXJuIGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RGJTY2hlbWEoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJT2JqZWN0IHNlbCA9IHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJaWYgKCBzZWwgaW5zdGFuY2VvZiBJUmVzb3VyY2UgKSB7Ci0JCQlJUHJvamVjdCBwcm9qID0gKChJUmVzb3VyY2UpIHNlbCkuZ2V0UHJvamVjdCgpOwotCQkJSnBhUHJvamVjdCBqcGFQcm9qID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2opOwotCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvajsKLQkJfSBlbHNlIGlmKCBzZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdCApIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnRSb290IHJvb3QgPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3QpIHNlbDsKLQkJCUlQcm9qZWN0IHByb2ogPSByb290LmdldEphdmFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQkJSnBhUHJvamVjdCBqcGFQcm9qID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHByb2opOwotCQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvajsKLQkJfSBlbHNlIGlmKCBzZWwgaW5zdGFuY2VvZiBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50KSB7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50IGZyYWcgPSAob3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCkgc2VsOwotCQkJSVByb2plY3QgcHJvaiA9IGZyYWcuZ2V0SmF2YVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCQlKcGFQcm9qZWN0IGpwYVByb2ogPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvaik7Ci0JCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qOwotCQl9Ci0JCQotCQl0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllcyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIuZGlzcG9zZSgpOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Kb2luQ29sdW1uc1BhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vSm9pbkNvbHVtbnNQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGUzNmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Kb2luQ29sdW1uc1BhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklQYWdlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuUGFnZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db21ib0JveENlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQmFzZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2VsbE1vZGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlNXVFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5pbnRlcm5hbC51dGlsLlRhYmxlTGF5b3V0Q29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwYUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotCi0KLXB1YmxpYyBjbGFzcyBKb2luQ29sdW1uc1BhZ2UgZXh0ZW5kcyBOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBMYWJlbCBqb2luQ29sdW1uc0Rlc2NMYWJlbDE7Ci0JLyp0aGUgdGFibGUgY29udGFpbmluZyB0aGUgYXNzb2NpYXRpb24gY29sdW1ucyBiZXR3ZWVuIHRhYmxlMSBhbmQgdGFibGUyCi0JICogLCBvciB0YWJsZTEgYW5kIGpvaW4gdGFibGUgaWYgbWFueSB0byBtYW55Ki8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUxOwotCXByaXZhdGUgQXJyYXlMaXN0PFNpbXBsZUpvaW4+IHRhYmxlRGF0YU1vZGVsMSA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlSm9pbj4oKTsgIAotCXByaXZhdGUgQ29tcG9zaXRlIHRhYmxlc0dyb3VwMTsKLQkKLQlwcml2YXRlIExhYmVsIGpvaW5Db2x1bW5zRGVzY0xhYmVsMjsKLQkvKnRoZSB0YWJsZSBjb250YWluaW5nIHRoZSBhc3NvY2lhdGlvbiBjb2x1bW5zIGJldHdlZW4gam9pbiB0YWJsZSBhbmQgdGFibGUyCi0JICogaWYgbWFueSB0byBtYW55Ki8KLQlwcml2YXRlIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUyOwotCXByaXZhdGUgQXJyYXlMaXN0PFNpbXBsZUpvaW4+IHRhYmxlRGF0YU1vZGVsMiA9IG5ldyBBcnJheUxpc3Q8U2ltcGxlSm9pbj4oKTsgIAotCXByaXZhdGUgQ29tcG9zaXRlIHRhYmxlc0dyb3VwMjsKLQkKLQlzdGF0aWMgZmluYWwgU3RyaW5nW10gSk9JTkNPTFVNTlNfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMgPSB7ICJyZWZlcnJlckNvbHVtbiIsICJyZWZlcmVuY2VkQ29sdW1uIiB9OwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0lOQ09MVU1OMV9DT0xVTU5fSU5ERVggPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVggPSAxOwotCi0JcHJvdGVjdGVkIEpvaW5Db2x1bW5zUGFnZShPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgKSB7Ci0JCXN1cGVyKGN1c3RvbWl6ZXIsICJKb2luQ29sdW1uc1BhZ2UiKTsKLQkJc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9kZXNjKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKHBhcmVudCk7Ci0JCQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIEpwYUhlbHBDb250ZXh0SWRzLkdFTkVSQVRFX0VOVElUSUVTX1dJWkFSRF9KT0lOX0NPTFVNTlMpOwotCi0JCXRhYmxlc0dyb3VwMSA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuU0hBRE9XX0VUQ0hFRF9JTik7Ci0JCXRhYmxlc0dyb3VwMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQkJdGFibGVzR3JvdXAxLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQljcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbDEodGFibGVzR3JvdXAxKTsKLQotCQkvL2NyZWF0ZU10bUpvaW5Db2x1bW5zVGFibGUyKGNvbXBvc2l0ZSk7Ci0JCQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKCBmYWxzZSk7Ci0JCQotCQkoKFdpemFyZERpYWxvZylnZXRDb250YWluZXIoKSkuYWRkUGFnZUNoYW5nZWRMaXN0ZW5lcihuZXcgSVBhZ2VDaGFuZ2VkTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHBhZ2VDaGFuZ2VkKFBhZ2VDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiggZXZlbnQuZ2V0U2VsZWN0ZWRQYWdlKCkgPT0gSm9pbkNvbHVtbnNQYWdlLnRoaXMgKXsKLQkJCQkJKChDb21wb3NpdGUpSm9pbkNvbHVtbnNQYWdlLnRoaXMuZ2V0Q29udHJvbCgpKS5nZXRQYXJlbnQoKS5sYXlvdXQoKSA7CQkKLQkJCQkJCi0JCQkJfQotCQkJfQkJCQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTXRtSm9pbkNvbHVtbnNUYWJsZTIoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQl0YWJsZXNHcm91cDIgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULlNIQURPV19FVENIRURfSU4pOwotCQl0YWJsZXNHcm91cDIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXRhYmxlc0dyb3VwMi5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJY3JlYXRlSm9pbkNvbHVtbnNUYWJsZUNvbnRyb2wyKHRhYmxlc0dyb3VwMik7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHdpemFyZCBwYWdlIFVJIHdpdGggbmV3IHRhYmxlIG5hbWVzCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgdXBkYXRlV2l0aE5ld1RhYmxlcygpIHsKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gdGhpcy5nZXRDYXJkaW5hbGl0eSgpIDsKLQkJaWYoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKLQkJCXVwZGF0ZVdpdGhNdG1UYWJsZXMoKTsKLQkJfWVsc2V7Ci0JCQl1cGRhdGVXaXRoT3RtVGFibGVzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgV2l6YXJkIFVJIHdpdGggYSBzaW5nbGUgVGFibGVWaWV3ZXIgd2l0aCBjb2x1bW5zIGZyb20gdGhlIHR3byBhc3NvY2lhdGVkIGRhdGFiYXNlIHRhYmxlcwotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZVdpdGhPdG1UYWJsZXMoKSB7Ci0JCVRhYmxlQ29sdW1uW10gY29sdW1ucyA9IGpvaW5Db2x1bW5zVGFibGUxLmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpOwotCQlTdHJpbmcgdGFibGUxTmFtZSA9IHRoaXMuZ2V0UmVmZXJyZXJUYWJsZU5hbWUoKSA7Ci0JCVN0cmluZyB0YWJsZTJOYW1lID0gdGhpcy5nZXRSZWZlcmVuY2VkVGFibGVOYW1lKCkgOwotCQkKLQkJaWYoIHRhYmxlMU5hbWUgPT1udWxsIHx8IHRhYmxlMk5hbWUgPT0gbnVsbCApCi0JCQlyZXR1cm47Ci0JCQotCQljb2x1bW5zWzBdLnNldFRleHQoIHRhYmxlMU5hbWUgKTsKLQkJY29sdW1uc1sxXS5zZXRUZXh0KCB0YWJsZTJOYW1lICk7Ci0KLQkJLy9IaWRlIHRoZSBKb2luIGNvbHVtbiB0YWJsZSAyCi0JCWlmKCB0YWJsZXNHcm91cDIgIT1udWxsICkKLQkJCXRhYmxlc0dyb3VwMi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCi0JCXRhYmxlRGF0YU1vZGVsMS5jbGVhcigpOwotCQlqb2luQ29sdW1uc1RhYmxlMS5yZWZyZXNoKCk7Ci0JCQotCQlTdHJpbmcgbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwsIHRhYmxlMU5hbWUsIHRhYmxlMk5hbWUpOyAKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwxLnNldFRleHQobXNnKTsKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwxLnNldFRvb2xUaXBUZXh0KCBtc2cgKTsKLQkJdGFibGVzR3JvdXAxLmxheW91dCgpOwotCQkKLQkJU3RyaW5nW10gcmVmZXJyZXJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUxTmFtZSk7Ci0JCVN0cmluZ1tdIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7Ci0JCQotCQl1cGRhdGVDZWxsRWRpdG9ycyhqb2luQ29sdW1uc1RhYmxlMSwgcmVmZXJyZXJDb2x1bW5WYWx1ZXMsIHJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMpOwkJCi0KLQkJCi0JCSgoQ29tcG9zaXRlKXRoaXMuZ2V0Q29udHJvbCgpKS5sYXlvdXQoKSA7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIFdpemFyZCBVSSB3aXRoIGEgdHdvIFRhYmxlVmlld2VycyB3aXRoIHRoZSBmaXJzdCB3aXRoIGNvbHVtbnMgZnJvbSB0YWJsZTEgdG8gdGhlIE1UTSBqb2luIHRhYmxlCi0JICogYW5kIHRoZSBzZWNvbmQgb25lIHdpdGggY29sdW1ucyBmcm9tIHRoZSBNVE0gam9pbiB0YWJsZSB0byB0YWJsZTIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVXaXRoTXRtVGFibGVzKCkgewotCQlUYWJsZUNvbHVtbltdIGNvbHVtbnMgPSBqb2luQ29sdW1uc1RhYmxlMS5nZXRUYWJsZSgpLmdldENvbHVtbnMoKTsKLQkJU3RyaW5nIHRhYmxlMU5hbWUgPSB0aGlzLmdldFJlZmVycmVyVGFibGVOYW1lKCkgOwotCQlTdHJpbmcgdGFibGUyTmFtZSA9IHRoaXMuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpIDsKLQkJU3RyaW5nIGpvaW5UYWJsZU5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSA7Ci0JCWlmKCB0YWJsZTFOYW1lPT1udWxsIHx8IHRhYmxlMk5hbWU9PW51bGwgfHwgam9pblRhYmxlTmFtZT09bnVsbCApewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmKCB0YWJsZXNHcm91cDIgPT0gbnVsbCApewotCQkJY3JlYXRlTXRtSm9pbkNvbHVtbnNUYWJsZTIoIHRhYmxlc0dyb3VwMS5nZXRQYXJlbnQoKSk7Ci0JCX0gCi0KLQkJY29sdW1uc1swXS5zZXRUZXh0KCB0YWJsZTFOYW1lPT1udWxsPyIiOnRhYmxlMU5hbWUgKTsKLQkJY29sdW1uc1sxXS5zZXRUZXh0KCB0YWJsZTJOYW1lPT1udWxsPyIiOmpvaW5UYWJsZU5hbWUgKTsKLQkJCi0JCS8vVXBkYXRlIGpvaW4gY29sdW1uIFRhYmxlVmlld2VyIDEKLQkJdGFibGVEYXRhTW9kZWwxLmNsZWFyKCk7Ci0JCWpvaW5Db2x1bW5zVGFibGUxLnJlZnJlc2goKTsKLQkJCi0JCVN0cmluZyBtc2cgPSBTdHJpbmcuZm9ybWF0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbCwgdGFibGUxTmFtZSwgam9pblRhYmxlTmFtZSk7IAotCQlqb2luQ29sdW1uc0Rlc2NMYWJlbDEuc2V0VGV4dChtc2cpOwotCQlqb2luQ29sdW1uc0Rlc2NMYWJlbDEuc2V0VG9vbFRpcFRleHQoIG1zZyApOwotCQlTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcyA9IGdldFRhYmxlQ29sdW1ucyh0YWJsZTFOYW1lKTsKLQkJU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcyA9IGdldFRhYmxlQ29sdW1ucyhqb2luVGFibGVOYW1lKTsKLQkJCi0JCXVwZGF0ZUNlbGxFZGl0b3JzKGpvaW5Db2x1bW5zVGFibGUxLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApOwotCi0JCS8vVXBkYXRlIGpvaW4gY29sdW1uIFRhYmxlVmlld2VyIDIKLQkJY29sdW1ucyA9IGpvaW5Db2x1bW5zVGFibGUyLmdldFRhYmxlKCkuZ2V0Q29sdW1ucygpOwotCQljb2x1bW5zWzBdLnNldFRleHQoIGpvaW5UYWJsZU5hbWU9PW51bGw/IiI6am9pblRhYmxlTmFtZSApOwotCQljb2x1bW5zWzFdLnNldFRleHQoIHRhYmxlMk5hbWU9PW51bGw/IiI6dGFibGUyTmFtZSApOwotCQl0YWJsZXNHcm91cDEubGF5b3V0KCk7Ci0KLQkJdGFibGVEYXRhTW9kZWwyLmNsZWFyKCk7Ci0JCWpvaW5Db2x1bW5zVGFibGUyLnJlZnJlc2goKTsKLQkJbXNnID0gU3RyaW5nLmZvcm1hdChKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwsIGpvaW5UYWJsZU5hbWUsIHRhYmxlMk5hbWUpOyAKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwyLnNldFRleHQobXNnKTsKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwyLnNldFRvb2xUaXBUZXh0KCBtc2cgKTsKLQkJcmVmZXJyZXJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnMoam9pblRhYmxlTmFtZSk7Ci0JCXJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7Ci0JCXVwZGF0ZUNlbGxFZGl0b3JzKGpvaW5Db2x1bW5zVGFibGUyLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApOwotCQkKLQkJdGFibGVzR3JvdXAyLmxheW91dCgpOwotCi0JCS8vU2hvdyB0aGUgSm9pbiBjb2x1bW4gVGFibGVWaWV3ZXIgMgotCQl0YWJsZXNHcm91cDIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCi0JCQotCQkoKENvbXBvc2l0ZSl0aGlzLmdldENvbnRyb2woKSkubGF5b3V0KG5ldyBDb250cm9sW117dGhpcy50YWJsZXNHcm91cDEsIHRoaXMudGFibGVzR3JvdXAyfSk7CQkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkZFJlbW92ZUJ1dHRvbkNvbXBvc2l0ZShDb21wb3NpdGUgdGFibGVzR3JvdXAsIGZpbmFsIFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUsICBmaW5hbCBBcnJheUxpc3Q8U2ltcGxlSm9pbj4gdGFibGVEYXRhTW9kZWwpIHsKLQkJLy9BZGQgYW5kIFJlbW92ZSBKb2luQ29sdW1ucyBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRhYmxlc0dyb3VwLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgZmFsc2UpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJQnV0dG9uIGFkZEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCWFkZEJ1dHRvbi5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmFkZCApOwotCQlHcmlkRGF0YSBncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWFkZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJYWRkQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQotCQkJCVNpbXBsZUpvaW4gam9pbiA9IGdldERlZmF1bHROZXdKb2luKGpvaW5Db2x1bW5zVGFibGUpOwotCQkJCXRhYmxlRGF0YU1vZGVsLmFkZChqb2luKTsKLQkJCQlqb2luQ29sdW1uc1RhYmxlLnJlZnJlc2goKTsKLQkJCQkKLQkJCQkvL1VwZGF0ZSBXaXphcmQgbW9kZWwKLQkJCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2lucyA9IG51bGw7Ci0JCQkJaWYoIGpvaW5Db2x1bW5zVGFibGUgPT0gam9pbkNvbHVtbnNUYWJsZTEgKXsKLQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEgKTsKLQkJCQl9ZWxzZXsKLQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgKTsKLQkJCQl9Ci0JCQkJam9pbnMucHV0KCBqb2luLmZvcmVpZ25LZXksIGpvaW4ucHJpbWFyeUtleSk7Ci0JCQkJCi0JCQkJdXBkYXRlUGFnZUNvbXBsZXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLnJlbW92ZSApOwotCQlncmlkRGF0YSA9ICBuZXcgR3JpZERhdGEoKTsKLQkJZ3JpZERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXJlbW92ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcmVtb3ZlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKFN0cnVjdHVyZWRTZWxlY3Rpb24pam9pbkNvbHVtbnNUYWJsZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiggc2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuOwotCQkJCVNpbXBsZUpvaW4gam9pbiA9IChTaW1wbGVKb2luKXNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQotCQkJCS8vVXBkYXRlIFRhYmxlVmlld2VyIG1vZGVsCi0JCQkJdGFibGVEYXRhTW9kZWwucmVtb3ZlKCBqb2luICk7Ci0JCQkJLy9VcGRhdGUgV2l6YXJkIG1vZGVsCi0JCQkJCi0JCQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbnMgPSBudWxsOwotCQkJCWlmKCBqb2luQ29sdW1uc1RhYmxlID09IGpvaW5Db2x1bW5zVGFibGUxICl7Ci0JCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxICk7Ci0JCQkJfWVsc2V7Ci0JCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyICk7Ci0JCQkJfQotCQkJCWpvaW5zLnJlbW92ZShqb2luLmZvcmVpZ25LZXkpOwotCi0JCQkJam9pbkNvbHVtbnNUYWJsZS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJYWRkQnV0dG9uLnNldEZvY3VzKCk7Ci0JCQotCX0KLQotCXByb3RlY3RlZCBTaW1wbGVKb2luIGdldERlZmF1bHROZXdKb2luKFRhYmxlVmlld2VyIGpvaW5Db2x1bW5zVGFibGUpIHsKLQkJU3RyaW5nIHRhYmxlMU5hbWUgPSAiIjsKLQkJU3RyaW5nIHRhYmxlMk5hbWUgPSAiIjsKLQotCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBleGlzdGluZ0pvaW5zID0gbnVsbDsKLQkJaWYoIGpvaW5Db2x1bW5zVGFibGUgPT0gdGhpcy5qb2luQ29sdW1uc1RhYmxlMSApewotCQkJZXhpc3RpbmdKb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSApOwotCQkJaWYoIHRoaXMuZ2V0Sm9pblRhYmxlTmFtZSgpID09IG51bGwpIHsKLQkJCQl0YWJsZTFOYW1lID0gdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOwotCQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSA7Ci0JCQl9ZWxzZXsKLQkJCQl0YWJsZTFOYW1lID0gdGhpcy5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOwotCQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKSAgOwotCQkJfQotCQl9ZWxzZXsKLQkJCWV4aXN0aW5nSm9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIgKTsKLQkJCXRhYmxlMU5hbWUgPSB0aGlzLmdldEpvaW5UYWJsZU5hbWUoKTsKLQkJCXRhYmxlMk5hbWUgPSB0aGlzLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKSA7Ci0JCX0KLQkJLy9maW5kIG5leHQgYXZhaWxhYmxlIGNvbHVtbgotCQlTdHJpbmdbXSB0YWJsZTFDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUxTmFtZSk7Ci0JCVN0cmluZyBuZXh0Q29sMSA9ICIiOwotCQlmb3IoIFN0cmluZyBzOiB0YWJsZTFDb2x1bW5WYWx1ZXMgKXsKLQkJCWlmKCAhZXhpc3RpbmdKb2lucy5rZXlTZXQoKS5jb250YWlucyhzKSl7Ci0JCQkJbmV4dENvbDEgPSBzOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlTdHJpbmdbXSB0YWJsZTJDb2x1bW5WYWx1ZXMgPSBnZXRUYWJsZUNvbHVtbnModGFibGUyTmFtZSk7Ci0JCVN0cmluZyBuZXh0Q29sMiA9ICIiOwotCQlmb3IoIFN0cmluZyBzOiB0YWJsZTJDb2x1bW5WYWx1ZXMgKXsKLQkJCWlmKCAhZXhpc3RpbmdKb2lucy52YWx1ZXMoKS5jb250YWlucyhzKSl7Ci0JCQkJbmV4dENvbDIgPSBzOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2ltcGxlSm9pbiggbmV4dENvbDEsIG5leHRDb2wyKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5GbGlwVG9OZXh0UGFnZSgpIHsKLQkJcmV0dXJuIGlzUGFnZUNvbXBsZXRlKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZVBhZ2VDb21wbGV0ZSgpIHsKLQkJYm9vbGVhbiByZXQgPSB0YWJsZURhdGFNb2RlbDEuc2l6ZSgpPiAwIDsKLQkJc2V0UGFnZUNvbXBsZXRlKCByZXQgKTsKLQl9CQotCQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sMShDb21wb3NpdGUgdGFibGVzR3JvdXApIHsKLQkJam9pbkNvbHVtbnNEZXNjTGFiZWwxID0gY3JlYXRlTGFiZWwodGFibGVzR3JvdXAsIDIsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbCApOwotCQlqb2luQ29sdW1uc1RhYmxlMSA9IGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sKHRhYmxlc0dyb3VwLCB0aGlzLnRhYmxlRGF0YU1vZGVsMSk7Ci0JCWNyZWF0ZUFkZFJlbW92ZUJ1dHRvbkNvbXBvc2l0ZSh0YWJsZXNHcm91cCwgam9pbkNvbHVtbnNUYWJsZTEsIHRhYmxlRGF0YU1vZGVsMSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbDIoQ29tcG9zaXRlIHRhYmxlc0dyb3VwKSB7Ci0JCWpvaW5Db2x1bW5zRGVzY0xhYmVsMiA9IGNyZWF0ZUxhYmVsKHRhYmxlc0dyb3VwLCAyLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY29sc1BhZ2VfbGFiZWwgKTsKLQkJam9pbkNvbHVtbnNUYWJsZTIgPSBjcmVhdGVKb2luQ29sdW1uc1RhYmxlQ29udHJvbCh0YWJsZXNHcm91cCwgdGhpcy50YWJsZURhdGFNb2RlbDIpOwotCQljcmVhdGVBZGRSZW1vdmVCdXR0b25Db21wb3NpdGUodGFibGVzR3JvdXAsIGpvaW5Db2x1bW5zVGFibGUyLCB0YWJsZURhdGFNb2RlbDIpOwotCX0KLQkKLQlwcml2YXRlIFRhYmxlVmlld2VyIGNyZWF0ZUpvaW5Db2x1bW5zVGFibGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIEFycmF5TGlzdDxTaW1wbGVKb2luPiB0YWJsZURhdGFNb2RlbCApewkKLQkKLQkJVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0PSBuZXcgVGFibGVMYXlvdXRDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWFkZENvbHVtbkxheW91dERhdGEobGF5b3V0KTsKLQkJCi0JCWZpbmFsIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlIHRhYmxlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlKGxheW91dCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkKLQkJVGFibGVDb2x1bW4gcmVmZXJyZXJDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBKT0lOQ09MVU1OMV9DT0xVTU5fSU5ERVgpOwotCQlyZWZlcnJlckNvbHVtbi5zZXRUZXh0KCIldGFibGUxIik7Ci0JCXJlZmVycmVyQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlUYWJsZUNvbHVtbiByZWZlcmVuY2VkQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSwgSk9JTkNPTFVNTjJfQ09MVU1OX0lOREVYKTsKLQkJcmVmZXJlbmNlZENvbHVtbi5zZXRUZXh0KCIldGFibGUyIik7Ci0JCXJlZmVyZW5jZWRDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQkKLQkJR3JpZERhdGEgZ2Q9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50PSBTV1RVdGlsLmdldFRhYmxlSGVpZ2h0SGludCh0YWJsZSwgMyk7Ci0JCWdkLndpZHRoSGludCA9IDMwMDsKLQkJbGF5b3V0LnNldExheW91dERhdGEoZ2QpOwotCi0JCVRhYmxlVmlld2VyIG5ld0pvaW5Db2x1bW5zVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIodGFibGUpOwotCQluZXdKb2luQ29sdW1uc1RhYmxlLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCW5ld0pvaW5Db2x1bW5zVGFibGUuc2V0TGFiZWxQcm92aWRlcih0aGlzLmJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCW5ld0pvaW5Db2x1bW5zVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQluZXdKb2luQ29sdW1uc1RhYmxlLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlyZXR1cm4gKChTaW1wbGVKb2luKSBlMSkuZm9yZWlnbktleS5jb21wYXJlVG8oKChTaW1wbGVKb2luKSBlMikuZm9yZWlnbktleSk7Ci0JCQl9Ci0JCX0pOwotCQkKLQkJbmV3Sm9pbkNvbHVtbnNUYWJsZS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkvL2hhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCXBvcHVsYXRlVGFibGVEYXRhTW9kZWwoKTsKLQkJbmV3Sm9pbkNvbHVtbnNUYWJsZS5zZXRJbnB1dCggdGFibGVEYXRhTW9kZWwgKTsKLQkJcmV0dXJuIG5ld0pvaW5Db2x1bW5zVGFibGU7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgcG9wdWxhdGVUYWJsZURhdGFNb2RlbCgpewotCQlIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBkYXRhTW9kZWwgPSBnZXRXaXphcmREYXRhTW9kZWwoKTsKLQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbkNvbHVtbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxKTsKLQkJaWYoIGpvaW5Db2x1bW5zIT0gbnVsbCApewotCQkJZm9yKCBTdHJpbmcgcmVmZXJyZXJDb2x1bW4gOiBqb2luQ29sdW1ucy5rZXlTZXQoKSApewotCQkJCXRhYmxlRGF0YU1vZGVsMS5hZGQobmV3IFNpbXBsZUpvaW4ocmVmZXJyZXJDb2x1bW4sIGpvaW5Db2x1bW5zLmdldChyZWZlcnJlckNvbHVtbikgKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCVRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IGpvaW5Db2x1bW5zMiA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilkYXRhTW9kZWwuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzIpOwotCQlpZiggam9pbkNvbHVtbnMyIT0gbnVsbCApewotCQkJZm9yKCBTdHJpbmcgcmVmZXJyZXJDb2x1bW4gOiBqb2luQ29sdW1uczIua2V5U2V0KCkgKXsKLQkJCQl0YWJsZURhdGFNb2RlbDIuYWRkKG5ldyBTaW1wbGVKb2luKHJlZmVycmVyQ29sdW1uLCBqb2luQ29sdW1uczIuZ2V0KHJlZmVycmVyQ29sdW1uKSApKTsKLQkJCX0KLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKb2luQ29sdW1uc0NvbnRlbnRQcm92aWRlcigpOwotCX0KLQotCQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSm9pbkNvbHVtbnNUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZENvbHVtbkxheW91dERhdGEoVGFibGVMYXlvdXRDb21wb3NpdGUgbGF5b3V0KSB7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDUwLCB0cnVlKSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCB1cGRhdGVDZWxsRWRpdG9ycyhUYWJsZVZpZXdlciBqb2luQ29sdW1uc1RhYmxlLCBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcywgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcyApewotCQlqb2luQ29sdW1uc1RhYmxlLnNldENvbHVtblByb3BlcnRpZXMoSk9JTkNPTFVNTlNfVEFCTEVfQ09MVU1OX1BST1BFUlRJRVMpOwotCQlDb21ib0JveENlbGxFZGl0b3JbXSBlZGl0b3JzID0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcltKT0lOQ09MVU1OU19UQUJMRV9DT0xVTU5fUFJPUEVSVElFUy5sZW5ndGhdOwotCi0JCWVkaXRvcnNbSk9JTkNPTFVNTjFfQ09MVU1OX0lOREVYXT0gbmV3IENvbWJvQm94Q2VsbEVkaXRvcihqb2luQ29sdW1uc1RhYmxlLmdldFRhYmxlKCksIHJlZmVycmVyQ29sdW1uVmFsdWVzLCBTV1QuU0lOR0xFKTsKLQkJZWRpdG9yc1tKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVhdPSBuZXcgQ29tYm9Cb3hDZWxsRWRpdG9yKGpvaW5Db2x1bW5zVGFibGUuZ2V0VGFibGUoKSwgcmVmZXJlbmNlZENvbHVtblZhbHVlcywgU1dULlNJTkdMRSk7Ci0JCQotCQlqb2luQ29sdW1uc1RhYmxlLnNldENlbGxFZGl0b3JzKGVkaXRvcnMpOwotCQlqb2luQ29sdW1uc1RhYmxlLnNldENlbGxNb2RpZmllcih0aGlzLmJ1aWxkVGFibGVUYWJsZUNlbGxNb2RpZmllcihqb2luQ29sdW1uc1RhYmxlLCByZWZlcnJlckNvbHVtblZhbHVlcywgcmVmZXJlbmNlZENvbHVtblZhbHVlcyApKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VGFibGVDb2x1bW5zKFN0cmluZyB0YWJsZU5hbWUpewotCQlTY2hlbWEgc2NoZW1hID0gKFNjaGVtYSlnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fU0NIRU1BKTsKLQkJVGFibGUgdGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCh0YWJsZU5hbWUpOwotCQlMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKENvbHVtbiBjb2x1bW4gOiB0YWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCWxpc3QuYWRkKGNvbHVtbi5nZXROYW1lKCkpOwotCQl9Ci0JCVN0cmluZ1tdIHJldCA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ2VsbE1vZGlmaWVyIGJ1aWxkVGFibGVUYWJsZUNlbGxNb2RpZmllcihUYWJsZVZpZXdlciBqb2luQ29sdW1uc1RhYmxlLCBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcywgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcykgewotCQlyZXR1cm4gbmV3IEpvaW5Db2x1bW5zQ2VsbE1vZGlmaWVyKGpvaW5Db2x1bW5zVGFibGUsIHJlZmVycmVyQ29sdW1uVmFsdWVzLCByZWZlcmVuY2VkQ29sdW1uVmFsdWVzKTsKLQl9CQotCQotCS8qKgotCSAqIEEgQ29udGVudFByb3ZpZGVyIHRyYW5zbGF0ZXMgdGhlIFNpbXBsZUpvaW4gbGlzdCBpbnRvIGEgQ29sbGVjdGlvbiBmb3IgZGlzcGxheSAKLQkgKgotCSAqLwotCXByaXZhdGUgY2xhc3MgSm9pbkNvbHVtbnNDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJSm9pbkNvbHVtbnNDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7fQkKLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uPD8+KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBTaW1wbGUgdmFsdWUgb2JqZWN0IHVzZWQgYXMgbW9kZWwgYmFja2luZyB0aGUgSkZhY2UgdGFibGUgCi0JICoKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFNpbXBsZUpvaW4gewotCQlwdWJsaWMgU2ltcGxlSm9pbihTdHJpbmcgZm9yZWlnbktleSwgU3RyaW5nIHByaW1hcnlLZXkpIHsKLQkJCXRoaXMuZm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0JCQl0aGlzLnByaW1hcnlLZXkgPSBwcmltYXJ5S2V5OyAKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGZvcmVpZ25LZXk7Ci0JCXB1YmxpYyBTdHJpbmcgcHJpbWFyeUtleTsKLQkJCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCl7Ci0JCQlyZXR1cm4gIlsiKyB0aGlzLmZvcmVpZ25LZXkgKyAiID0gIiArIHRoaXMucHJpbWFyeUtleSArICJdIjsKLQkJfQotCX0KLQkKLQkvKioKLQkgKglBIENlbGxNb2RpZmllciB0byB1cGRhdGUgdGhlIGpvaW4gY29sdW1ucyBpbiB0aGUgd2l6YXJkIGRhdGEgbW9kZWwKLQkgKi8KLQlwcml2YXRlIGNsYXNzIEpvaW5Db2x1bW5zQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0JCXByaXZhdGUgVGFibGVWaWV3ZXIgam9pbkNvbHVtbnNUYWJsZTsKLQkJcHJpdmF0ZSBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlczsKLQkJcHJpdmF0ZSBTdHJpbmdbXSByZWZlcmVuY2VkQ29sdW1uVmFsdWVzOwotCQlKb2luQ29sdW1uc0NlbGxNb2RpZmllcihUYWJsZVZpZXdlciBqb2luQ29sdW1uc1RhYmxlLCBTdHJpbmdbXSByZWZlcnJlckNvbHVtblZhbHVlcywgU3RyaW5nW10gcmVmZXJlbmNlZENvbHVtblZhbHVlcykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuam9pbkNvbHVtbnNUYWJsZSA9IGpvaW5Db2x1bW5zVGFibGU7Ci0JCQl0aGlzLnJlZmVycmVyQ29sdW1uVmFsdWVzID0gcmVmZXJyZXJDb2x1bW5WYWx1ZXM7Ci0JCQl0aGlzLnJlZmVyZW5jZWRDb2x1bW5WYWx1ZXMgPSByZWZlcmVuY2VkQ29sdW1uVmFsdWVzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotLy8JCQlTaW1wbGVKb2luIGpvaW4gPSAoU2ltcGxlSm9pbikgZWxlbWVudDsKLS8vCQkJaWYgKHByb3BlcnR5LmVxdWFscyhKT0lOQ09MVU1OU19UQUJMRV9DT0xVTU5fUFJPUEVSVElFU1tKT0lOQ09MVU1OMl9DT0xVTU5fSU5ERVhdKSkgewotLy8JCQkJcmV0dXJuIGpvaW4ucHJpbWFyeUtleTsKLS8vCQkJfQotLy8JCQlyZXR1cm4gam9pbi5mb3JlaWduS2V5OwotCQkJLy8gcmV0dXJudCB0aGUgaW5kZXggb2YgdGhlIHZhbHVlIGluIHRoZSBDb21ib3hDZWxsRWRpdG9yCi0JCQlBcnJheUxpc3Q8U2ltcGxlSm9pbj4gdGFibGVEYXRhTW9kZWwgPSAoQXJyYXlMaXN0PFNpbXBsZUpvaW4+KSBqb2luQ29sdW1uc1RhYmxlLmdldElucHV0KCk7Ci0JCQlmb3IoaW50IGk9MDsgaTwgdGFibGVEYXRhTW9kZWwuc2l6ZSgpOyBpICsrICl7Ci0JCQkJaWYoIHRhYmxlRGF0YU1vZGVsLmdldChpKSA9PSBlbGVtZW50ICkKLQkJCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGkpOwotCQkJfQotCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDApOwotCQkJCi0JCX0KLQotCQkvKiogCi0JCSAqIGVsZW1lbnQgaXMgdGhlIHNlbGVjdGVkIFRhYmxlSXRlbQotCQkgKiB2YWx1ZSBpcyB0aGUgc2VsZWN0ZWQgaXRlbSBpbmRleCBpbiB0aGUgY29tYm9DZWxsRWRpdG9yIAotCQkgKi8KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXB1YmxpYyB2b2lkIG1vZGlmeShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJCWlmICggISAoZWxlbWVudCBpbnN0YW5jZW9mIFRhYmxlSXRlbSkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlJbnRlZ2VyIGluZGV4ID0gKEludGVnZXIpdmFsdWU7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IChUYWJsZUl0ZW0pZWxlbWVudDsKLQkJCWJvb2xlYW4gdW5jaGFuZ2VkID0gZmFsc2U7Ci0JCQlTaW1wbGVKb2luIGpvaW4gPSAoU2ltcGxlSm9pbikgaXRlbS5nZXREYXRhKCk7Ci0JCQlpZiAocHJvcGVydHkuZXF1YWxzKEpPSU5DT0xVTU5TX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0pPSU5DT0xVTU4xX0NPTFVNTl9JTkRFWF0pKSB7Ci0JCQkJdW5jaGFuZ2VkID0gam9pbi5mb3JlaWduS2V5LmVxdWFscyggcmVmZXJyZXJDb2x1bW5WYWx1ZXNbIGluZGV4LmludFZhbHVlKCkgXSApOwotCQkJCWlmICghIHVuY2hhbmdlZCkgewotCQkJCQkKLQkJCQkJLy91cGRhdGUgdGhlIHdpemFyZCBkYXRhbW9kZWwKLQkJCQkJVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gam9pbnMgPSBudWxsOwotCQkJCQlpZiggam9pbkNvbHVtbnNUYWJsZSA9PSBqb2luQ29sdW1uc1RhYmxlMSApewotCQkJCQkJam9pbnMgPSAoVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4pZ2V0V2l6YXJkRGF0YU1vZGVsKCkuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEgKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlqb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMiApOwotCQkJCQl9Ci0JCQkJCWpvaW5zLnJlbW92ZShqb2luLmZvcmVpZ25LZXkpOwotCQkJCQlqb2lucy5wdXQocmVmZXJyZXJDb2x1bW5WYWx1ZXNbIGluZGV4LmludFZhbHVlKCkgXSwgam9pbi5wcmltYXJ5S2V5KTsKLQotCQkJCQkvL1VwZGF0ZSB0aGUgVGFibGVWaWV3ZXIgbW9kZWwKLQkJCQkJam9pbi5mb3JlaWduS2V5ID0gcmVmZXJyZXJDb2x1bW5WYWx1ZXNbIGluZGV4LmludFZhbHVlKCldOwotCQkJCQlqb2luQ29sdW1uc1RhYmxlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJCi0JCQlpZiAocHJvcGVydHkuZXF1YWxzKEpPSU5DT0xVTU5TX1RBQkxFX0NPTFVNTl9QUk9QRVJUSUVTW0pPSU5DT0xVTU4yX0NPTFVNTl9JTkRFWF0pKSB7Ci0JCQkJdW5jaGFuZ2VkID0gam9pbi5wcmltYXJ5S2V5LmVxdWFscyggcmVmZXJlbmNlZENvbHVtblZhbHVlc1sgaW5kZXguaW50VmFsdWUoKV0gKSA7Ci0JCQkJaWYgKCEgdW5jaGFuZ2VkKSB7Ci0JCQkJCS8vVXBkYXRlIHRoZSBUYWJsZVZpZXdlciBtb2RlbAotCQkJCQlqb2luLnByaW1hcnlLZXkgPSByZWZlcmVuY2VkQ29sdW1uVmFsdWVzWyBpbmRleC5pbnRWYWx1ZSgpXSA7Ci0JCQkJCQotCQkJCQkvL1VwZGF0ZSB3aXphcmQgZGF0YSBtb2RlbAotCQkJCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2lucyA9IG51bGw7Ci0JCQkJCWlmKCBqb2luQ29sdW1uc1RhYmxlID09IGpvaW5Db2x1bW5zVGFibGUxICl7Ci0JCQkJCQlqb2lucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPilnZXRXaXphcmREYXRhTW9kZWwoKS5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSApOwotCQkJCQl9ZWxzZXsKLQkJCQkJCWpvaW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KWdldFdpemFyZERhdGFNb2RlbCgpLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyICk7Ci0JCQkJCX0KLQkJCQkJam9pbnMucHV0KGpvaW4uZm9yZWlnbktleSwgam9pbi5wcmltYXJ5S2V5KTsKLQotCQkJCQlqb2luQ29sdW1uc1RhYmxlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJCQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBBIHRhYmxlIGxhYmVsIHByb3ZpZGVyIHRvIHJldHVybiB0aGUgam9pbiBjb2x1bW4gbmFtZXMgZm9yIGRpc3BsYXkKLQkgKgotCSAqLwotCXByaXZhdGUgZmluYWwgY2xhc3MgSm9pbkNvbHVtbnNUYWJsZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIGltcGxlbWVudHMgSVRhYmxlTGFiZWxQcm92aWRlciB7Ci0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJaWYoICEoZWxlbWVudCBpbnN0YW5jZW9mIFNpbXBsZUpvaW4pICkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkgICAgICAgICAgICBjYXNlIDA6Ci0JICAgICAgICAgICAgCXJldHVybiAoKFNpbXBsZUpvaW4pZWxlbWVudCkuZm9yZWlnbktleTsKLQkgICAgICAgICAgICBjYXNlIDE6Ci0JICAgICAgICAgICAgCXJldHVybiAoKFNpbXBsZUpvaW4pZWxlbWVudCkucHJpbWFyeUtleTsKLQkgICAgICAgICAgICBkZWZhdWx0OgotCSAgICAgICAgICAgIAlBc3NlcnQuaXNUcnVlKGZhbHNlKTsKLQkgICAgICAgICAgICAJcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0JCX0KLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3QgZWxlbWVudCkgewotCQkgICAgcmV0dXJuIGdldENvbHVtblRleHQoZWxlbWVudCwgMCk7IC8vIG5lZWRlZCB0byBtYWtlIHRoZSBzb3J0ZXIgd29yawotCQl9Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9KcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pwdFVpRW50aXR5R2VuTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVhNWMzNC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL0pwdFVpRW50aXR5R2VuTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIExvY2FsaXplZCBtZXNzYWdlcyB1c2VkIGJ5IERhbGkgVUkuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAianB0X3VpX2VudGl0eV9nZW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz4gQlVORExFX0NMQVNTID0gSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jbGFzczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9SZXN0b3JlX0RlZmF1bHRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZ2VuZXJhdGVFbnRpdGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3NlbGVjdEpQQVByb2plY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9zZWxlY3RKUEFQcm9qZWN0X21zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zZWxlY3RUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9jaG9vc2VFbnRpdHlUYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV91cGRhdGVQZXJzaXN0ZW5jZVhtbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVDb2x1bW47Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfZ2V0VGFibGVzX2pvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfZ2V0VGFibGVzX3Rhc2tOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX2dldFRhYmxlc19zdWJUYXNrTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zdGF0dXNVcGRhdGVfdGFza05hbWU7Ci0KLQkvL0RhdGFiYXNlIGNvbm5lY3Rpb24gZ3JvdXAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25uZWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFkZENvbm5lY3Rpb25MaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbm5lY3RMaW5rOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNjaGVtYUluZm87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2NoZW1hOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbm5lY3RpbmdUb0RhdGFiYXNlOwotCQotCS8vRGVmYXVsdCB0YWJsZSBnZW4gcHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZG9tYWluSmF2YUNsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV90YWJsZU1hcHBpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVBhbmVsX2NsYXNzTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZmV0Y2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2NvbGxUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9zZXF1ZW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfc2VxdWVuY2VOb3RlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9hY2Nlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2tleUdlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZ2VuT3B0aW9uYWxBbm5vdGF0aW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZ2VuT3B0aW9uYWxBbm5vdGF0aW9uc19kZXNjOwotCQotCS8vQXNzbyBmaWd1cmUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYW55VG9PbmVEZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9uZVRvT25lRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYW55VG9NYW55RGVzYzsKLQkvL3RhYmxlIGFzc29jaWF0aW9uIHdpemFyZCBwYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9uZXdBc3NvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZWxBc3NvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2dlbkFzc29jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZW50aXR5UmVmOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3BlcnR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhc2NhZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9zZXRSZWY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9qb2luZWRXaGVuOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfdGFibGVKb2luOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcmRpbmFsaXR5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdENhc2NhZGVEbGdUaXRsZTsKLQkvL25ldyBhc3NvY2lhdGlvbiB3aXphcmQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfYXNzb2NLaW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV9zaW1wbGVBc3NvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfbTJtQXNzb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX2Fzc29jVGFibGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfdGFibGVzUGFnZV90YWJsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY190YWJsZXNQYWdlX3RhYmxlMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RhYmxlc1BhZ2VfaW50ZXJtZWRpYXRlVGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX2NvbHNQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9uZXdBc3NvY19jb2xzUGFnZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhZGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY2FyZGluYWxpdHlQYWdlX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfbmV3QXNzb2NfY2FyZGluYWxpdHlQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFueVRvT25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG9uZVRvTWFueTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBvbmVUb09uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYW55VG9NYW55OwotCS8vc2VsZWN0IHRhYmxlIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlbGVjdFRhYmxlRGxnVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2VsZWN0VGFibGVEbGdEZXNjOwotCS8vaW5kaXZpZHVhbCB0YWJsZSBhbmQgY29sdW1uIGdlbiBwcm9wZXJ0aWVzCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlc0FuZENvbHVtbnNQYWdlX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV9sYWJlbFRhYmxlQW5kQ29sdW1uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2dlblByb3A7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9jb2xNYXBwaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfcHJvcE5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9wcm9wVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX21hcEtpbmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9jb2xVcGRhdGVhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfY29sSW5zZXJ0YWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBHZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2NvbFBhbmVsX2JlYW5Qcm9wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEdlbmVyYXRlRW50aXRpZXNXaXphcmRfY29sUGFuZWxfZ2V0dGVyU2NvcGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR2VuZXJhdGVFbnRpdGllc1dpemFyZF9jb2xQYW5lbF9zZXR0ZXJTY29wZTsKLQlzdGF0aWMgewotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBCVU5ETEVfQ0xBU1MpOwotCX0KLQotCXByaXZhdGUgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcygpIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2N2I5ZDAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9OZXdBc3NvY2lhdGlvbldpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5Bc3NvY2lhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdBc3NvY2lhdGlvbldpemFyZCBleHRlbmRzIFdpemFyZCB7CQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJT05fU0NIRU1BID0gIkFTU09DSUFUSU9OX1NDSEVNQSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9SRUZFUlJFUl9UQUJMRSA9ICJBU1NPQ0lBVElPTl9SRUZFUlJFUl9UQUJMRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9SRUZFUkVOQ0VEX1RBQkxFID0gIkFTU09DSUFUSU9OX1JFRkVSRU5DRURfVEFCTEUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSA9ICJBU1NPQ0lBVElPTl9SRUZFUlJFUl9DT0xVTU5TMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyID0gIkFTU09DSUFUSU9OX1JFRkVSUkVSX0NPTFVNTlMyIjsgLy91c2VkIGluIE1UTSBhc3NvY2lhdGlvbnMgb25seSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQVNTT0NJQVRJT05fSk9JTl9UQUJMRSA9ICJBU1NPQ0lBVElPTl9KT0lOX1RBQkxFIjsgLy8gVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFTU09DSUFUSU9OX0NBRElOQUxJVFkgPSAiQVNTT0NJQVRJT05fQ0FESU5BTElUWSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdDsKLQlwcml2YXRlIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGFzc29jaWF0aW9uRGF0YU1vZGVsID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7Ci0KLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IG51bGw7CQotCQotCXByaXZhdGUgQXNzb2NpYXRpb25UYWJsZXNQYWdlIGFzc29jaWF0aW9uVGFibGVzUGFnZTsKLQlwcml2YXRlIEpvaW5Db2x1bW5zUGFnZSBqb2luQ29sdW1uc1BhZ2U7Ci0JcHJpdmF0ZSBDYXJkaW5hbGl0eVBhZ2UgY2FyZGluYWxpdHlQYWdlOwotCQotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCi0JcHVibGljIE5ld0Fzc29jaWF0aW9uV2l6YXJkKCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLmN1c3RvbWl6ZXIgPSBjdXN0b21pemVyOwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQkJdGhpcy5zZXRXaW5kb3dUaXRsZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX25ld0Fzc29jX3RpdGxlKTsKLQkJCi0JCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9TQ0hFTUEsIHRoaXMuY3VzdG9taXplci5nZXRTY2hlbWEoKSk7Ci0JCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMxLCBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0JCXRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWwucHV0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyLCBuZXcgVHJlZU1hcDxTdHJpbmcsIFN0cmluZz4oKSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCXN1cGVyLmFkZFBhZ2VzKCk7Ci0JCXRoaXMuYXNzb2NpYXRpb25UYWJsZXNQYWdlID0gbmV3IEFzc29jaWF0aW9uVGFibGVzUGFnZSggY3VzdG9taXplciwgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCQlhZGRQYWdlKHRoaXMuYXNzb2NpYXRpb25UYWJsZXNQYWdlKTsKLQkJCi0JCXRoaXMuam9pbkNvbHVtbnNQYWdlID0gbmV3IEpvaW5Db2x1bW5zUGFnZShjdXN0b21pemVyKTsKLQkJYWRkUGFnZSh0aGlzLmpvaW5Db2x1bW5zUGFnZSk7Ci0JCQotCQl0aGlzLmNhcmRpbmFsaXR5UGFnZSA9IG5ldyBDYXJkaW5hbGl0eVBhZ2UoY3VzdG9taXplcik7Ci0JCWFkZFBhZ2UodGhpcy5jYXJkaW5hbGl0eVBhZ2UpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyICgpewotCQlyZXR1cm4gY3VzdG9taXplcjsKLQl9IAotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKXsKLQkJcmV0dXJuIHRoaXMuanBhUHJvamVjdDsKLQl9Ci0KLS8vCXB1YmxpYyBTY2hlbWEgZ2V0RGVmYXVsdFNjaGVtYSgpIHsKLS8vCQlyZXR1cm4gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHREYlNjaGVtYSgpOwotLy8JfQotLy8KLS8vCXByaXZhdGUgYm9vbGVhbiBwcm9qZWN0RGVmYXVsdFNjaGVtYUV4aXN0cygpIHsKLS8vCQlyZXR1cm4gKCB0aGlzLmdldERlZmF1bHRTY2hlbWEoKSAhPSBudWxsKTsKLS8vCX0KLQotCXB1YmxpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBnZXREYXRhTW9kZWwoKXsKLQkJcmV0dXJuIHRoaXMuYXNzb2NpYXRpb25EYXRhTW9kZWw7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZVRhYmxlTmFtZXMoKXsKLQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHRoaXMuZ2V0UGFnZXMoKTsKLQkJZm9yKCBJV2l6YXJkUGFnZSBwYWdlIDogcGFnZXMpewotCQkJKChOZXdBc3NvY2lhdGlvbldpemFyZFBhZ2UpcGFnZSkudXBkYXRlV2l0aE5ld1RhYmxlcygpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXB1YmxpYyBBc3NvY2lhdGlvbiBnZXROZXdBc3NvY2lhdGlvbigpewotCQlTdHJpbmcgcmVmZXJyZXJUYWJsZU5hbWUgPWdldFJlZmVycmVyVGFibGVOYW1lKCk7IAotCQlTdHJpbmcgcmVmZXJlbmNlZFRhYmxlTmFtZSA9IGdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKLQkJTGlzdDxTdHJpbmc+IHJlZmVycmVyQ29sTmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQkJTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQkKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gKFN0cmluZylhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0NBRElOQUxJVFkgKTsKLQkJaWYoIGNhcmRpbmFsaXR5LmVxdWFscyhBc3NvY2lhdGlvbi5NQU5ZX1RPX01BTlkpICl7Ci0JCQlyZXR1cm4gY3JlYXRlTWFueVRvTWFueUFzc29jaWF0aW9uKCk7Ci0JCX0KLQkJCi0JCU9iamVjdCB2YWx1ZSA9IGFzc29jaWF0aW9uRGF0YU1vZGVsLmdldCggTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fSk9JTl9DT0xVTU5TMSk7Ci0JCWlmKHZhbHVlIT1udWxsKXsKLQkJCVRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+IGpvaW5Db2x1bW5zID0gKFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KXZhbHVlOwkJCi0JCQlmb3IoIFN0cmluZyBwayA6IGpvaW5Db2x1bW5zLmtleVNldCgpKXsKLQkJCQlyZWZlcnJlckNvbE5hbWVzLmFkZChwayk7Ci0JCQkJcmVmZXJlbmNlZENvbE5hbWVzLmFkZCggam9pbkNvbHVtbnMuZ2V0KHBrKSk7Ci0JCQl9Ci0JCX0KLQotCQkvKmlmIG9uZS10by1tYW55IHRoZW4gY29udmVydCBpdCB0byBtYW55LXRvLW9uZSB0byBiZSBjb25zaXN0ZW50IAotCQkgKiB3aXRoIHRoZSBhc3NvY2lhdGlvbnMgY29tcHV0ZWQgZnJvbSB0aGUgZGIgZm9yZWlnbiBrZXlzLgotCQkgKiBEb24ndCBzZWUgYXQgdGhpcyBwb2ludCBob3cgb25lLXRvLW1hbnkgd291bGQgCi0JCSAqIGFmZmVjdCB0aGUgZ2VuZXJhdGlvbi4qLwotCQlpZiggY2FyZGluYWxpdHkuZXF1YWxzKEFzc29jaWF0aW9uLk9ORV9UT19NQU5ZKSApewotCQkJY2FyZGluYWxpdHkgPSBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORTsKLQkJCQotCQkJU3RyaW5nIHRlbXAxID0gcmVmZXJyZXJUYWJsZU5hbWU7Ci0JCQlyZWZlcnJlclRhYmxlTmFtZSA9IHJlZmVyZW5jZWRUYWJsZU5hbWU7Ci0JCQlyZWZlcmVuY2VkVGFibGVOYW1lID0gdGVtcDE7Ci0JCQkKLQkJCUxpc3Q8U3RyaW5nPiB0ZW1wMiA9IHJlZmVycmVyQ29sTmFtZXM7Ci0JCQlyZWZlcnJlckNvbE5hbWVzID0gcmVmZXJlbmNlZENvbE5hbWVzOwotCQkJcmVmZXJlbmNlZENvbE5hbWVzID0gdGVtcDI7Ci0JCX0KLQkJCi0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbnVsbDsKLQkJYXNzb2NpYXRpb24gPSBuZXcgQXNzb2NpYXRpb24odGhpcy5jdXN0b21pemVyLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJyZXJDb2xOYW1lcwksIHJlZmVyZW5jZWRUYWJsZU5hbWUsIHJlZmVyZW5jZWRDb2xOYW1lcyk7Ci0JCWFzc29jaWF0aW9uLnNldENhcmRpbmFsaXR5KCBjYXJkaW5hbGl0eSApOwotCQlhc3NvY2lhdGlvbi5zZXRDdXN0b20odHJ1ZSk7Ci0JCXJldHVybiBhc3NvY2lhdGlvbjsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbiBjcmVhdGVNYW55VG9NYW55QXNzb2NpYXRpb24oKSB7Ci0JCVN0cmluZyByZWZlcnJlclRhYmxlTmFtZSA9Z2V0UmVmZXJyZXJUYWJsZU5hbWUoKTsgCi0JCVN0cmluZyBqb2luVGFibGUgPSBnZXRKb2luVGFibGVOYW1lKCk7Ci0JCVN0cmluZyByZWZlcmVuY2VkVGFibGVOYW1lID0gZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpOwotCi0JCUxpc3Q8U3RyaW5nPiByZWZlcnJlckNvbE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCUxpc3Q8U3RyaW5nPiByZWZlcnJlckpvaW5Db2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlPYmplY3QgdmFsdWUgPSBhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoIE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fQ09MVU1OUzEpOwotCQlpZih2YWx1ZSE9bnVsbCl7Ci0JCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2luQ29sdW1ucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPil2YWx1ZTsJCQotCQkJZm9yKCBTdHJpbmcgcGsgOiBqb2luQ29sdW1ucy5rZXlTZXQoKSl7Ci0JCQkJcmVmZXJyZXJDb2xOYW1lcy5hZGQocGspOwotCQkJCXJlZmVycmVySm9pbkNvbE5hbWVzLmFkZCggam9pbkNvbHVtbnMuZ2V0KHBrKSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXZhbHVlID0gYXNzb2NpYXRpb25EYXRhTW9kZWwuZ2V0KCBOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9KT0lOX0NPTFVNTlMyKTsKLQkJTGlzdDxTdHJpbmc+IHJlZmVyZW5jZWRDb2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlMaXN0PFN0cmluZz4gcmVmZXJlbmNlZEpvaW5Db2xOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlpZih2YWx1ZSE9bnVsbCl7Ci0JCQlUcmVlTWFwPFN0cmluZywgU3RyaW5nPiBqb2luQ29sdW1ucyA9IChUcmVlTWFwPFN0cmluZywgU3RyaW5nPil2YWx1ZTsJCQotCQkJZm9yKCBTdHJpbmcgcGsgOiBqb2luQ29sdW1ucy5rZXlTZXQoKSl7Ci0JCQkJcmVmZXJlbmNlZEpvaW5Db2xOYW1lcy5hZGQocGspOwotCQkJCXJlZmVyZW5jZWRDb2xOYW1lcy5hZGQoIGpvaW5Db2x1bW5zLmdldChwaykpOwotCQkJfQotCQl9Ci0KLQkJCi0JCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gbnVsbDsKLQkJYXNzb2NpYXRpb24gPSBuZXcgQXNzb2NpYXRpb24odGhpcy5jdXN0b21pemVyLCByZWZlcnJlclRhYmxlTmFtZSwgcmVmZXJyZXJDb2xOYW1lcywgCi0JCQkJcmVmZXJlbmNlZFRhYmxlTmFtZSwgcmVmZXJlbmNlZENvbE5hbWVzLCBqb2luVGFibGUsIHJlZmVycmVySm9pbkNvbE5hbWVzLCByZWZlcmVuY2VkSm9pbkNvbE5hbWVzKTsKLQkJcmV0dXJuIGFzc29jaWF0aW9uOwotCX0KLQotCVN0cmluZyBnZXRSZWZlcnJlclRhYmxlTmFtZSgpewotCQlyZXR1cm4gKFN0cmluZylhc3NvY2lhdGlvbkRhdGFNb2RlbC5nZXQoTmV3QXNzb2NpYXRpb25XaXphcmQuQVNTT0NJQVRJT05fUkVGRVJSRVJfVEFCTEUpOwotCX0KLQotCVN0cmluZyBnZXRSZWZlcmVuY2VkVGFibGVOYW1lKCl7Ci0JCXJldHVybiAoU3RyaW5nKWFzc29jaWF0aW9uRGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9SRUZFUkVOQ0VEX1RBQkxFKTsKLQl9Ci0JCi0JU3RyaW5nIGdldEpvaW5UYWJsZU5hbWUoKXsKLQkJcmV0dXJuIChTdHJpbmcpYXNzb2NpYXRpb25EYXRhTW9kZWwuZ2V0KE5ld0Fzc29jaWF0aW9uV2l6YXJkLkFTU09DSUFUSU9OX0pPSU5fVEFCTEUgKTsKLQl9Ci0JCi0JU3RyaW5nIGdldENhcmRpbmFsaXR5KCl7Ci0JCXJldHVybiAoU3RyaW5nKWFzc29jaWF0aW9uRGF0YU1vZGVsLmdldChOZXdBc3NvY2lhdGlvbldpemFyZC5BU1NPQ0lBVElPTl9DQURJTkFMSVRZICk7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL05ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjYzMTgxLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5ld0Fzc29jaWF0aW9uV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHJvdGVjdGVkIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQkKLQlwdWJsaWMgTmV3QXNzb2NpYXRpb25XaXphcmRQYWdlKE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXIgOwotCX0KLQkKLQlwcm90ZWN0ZWQgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0V2l6YXJkRGF0YU1vZGVsKCl7Ci0JCXJldHVybiAoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKXRoaXMuZ2V0V2l6YXJkKCkpLmdldERhdGFNb2RlbCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZmVycmVyVGFibGVOYW1lKCl7Ci0JCXJldHVybiAoKE5ld0Fzc29jaWF0aW9uV2l6YXJkKWdldFdpemFyZCgpKS5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpewotCQlyZXR1cm4gKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkuZ2V0UmVmZXJlbmNlZFRhYmxlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Sm9pblRhYmxlTmFtZSgpewotCQlyZXR1cm4gKChOZXdBc3NvY2lhdGlvbldpemFyZClnZXRXaXphcmQoKSkuZ2V0Sm9pblRhYmxlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2FyZGluYWxpdHkoKXsKLQkJcmV0dXJuICgoTmV3QXNzb2NpYXRpb25XaXphcmQpZ2V0V2l6YXJkKCkpLmdldENhcmRpbmFsaXR5KCkgOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB1cGRhdGVXaXRoTmV3VGFibGVzKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhlbHBzIHN5c3RlbS4KLQkgKiBAcmV0dXJuIFRoZSBwbGF0Zm9ybSdzIGhlbHAgc3lzdGVtCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1Byb21wdEpQQVByb2plY3RXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1Byb21wdEpQQVByb2plY3RXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMjQ4ZjAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9Qcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLXB1YmxpYyBjbGFzcyBQcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNFTEVDVF9QUk9KRUNUX1BBR0VfTkFNRSA9ICJTZWxlY3RKUEFQcm9qZWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVGFibGUgcHJvalRhYmxlOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgcHJvalRhYmxlVmlld2VyOwotCXByaXZhdGUgc3RhdGljIGludCBQUk9KRUNUX05BTUVfQ09MVU1OX0lOREVYID0gMDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBoZWxwQ29udGV4dElkOwotCQotCXByb3RlY3RlZCBQcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZSggZmluYWwgU3RyaW5nIGhlbHBDb250ZXh0SWQgKSB7Ci0JCXN1cGVyKFNFTEVDVF9QUk9KRUNUX1BBR0VfTkFNRSk7Ci0JCXNldFRpdGxlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfc2VsZWN0SlBBUHJvamVjdCApOwotCQlzZXRNZXNzYWdlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfc2VsZWN0SlBBUHJvamVjdF9tc2cgKTsKLQkJdGhpcy5oZWxwQ29udGV4dElkID0gaGVscENvbnRleHRJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gMTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG5Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7CQkJCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKCBjb21wb3NpdGUsIFNXVC5OT05FICk7Ci0JCWxhYmVsLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9zZWxlY3RKUEFQcm9qZWN0ICk7Ci0JCQotCQlwcm9qVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5WSVJUVUFMKTsJCQotCQlwcm9qVGFibGUgPSBwcm9qVGFibGVWaWV3ZXIuZ2V0VGFibGUoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoIFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSApOwotCQlwcm9qVGFibGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQkJCi0JCXByb2pUYWJsZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVKcGFQcm9qZWN0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JCQl9Ci0JCQkKLQkJfSk7Ci0JCQotCQlwcm9qVGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIocHJvalRhYmxlKTsKLQkJcHJvalRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFByb2plY3RUYWJsZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCXByb2pUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlcigpKTsKLQkJZmlsbEpwYVByb2plY3RMaXN0KCk7Ci0JCXNldENvbnRyb2woIGNvbXBvc2l0ZSApOwotCQl2YWxpZGF0ZSgpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgaGFuZGxlSnBhUHJvamVjdFNlbGVjdGlvbigpIHsKLQkJaWYgKHByb2pUYWJsZS5nZXRTZWxlY3Rpb25JbmRleCgpICE9IC0xKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9ICBwcm9qVGFibGUuZ2V0SXRlbShwcm9qVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQlTdHJpbmcgcHJvak5hbWUgPSBpdGVtLmdldFRleHQoMCk7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2pOYW1lKTsKLQkJCUpwYVByb2plY3QganBhUHJvaiA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCggcHJvamVjdCApOwotCQkJKChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZClnZXRXaXphcmQoKSkuc2V0SnBhUHJvamVjdChqcGFQcm9qKTsKLQkJCXZhbGlkYXRlKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGZpbGxKcGFQcm9qZWN0TGlzdCgpIHsKLQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJTGlzdDxTdHJpbmc+IHByb2pOYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IgKCBJUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHMgKQotCQl7Ci0JCQlKcGFQcm9qZWN0IGpwYVByb2ogPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoIHByb2plY3QgKTsKLQkJCWlmICgganBhUHJvaiAhPSBudWxsICkgewotCQkJCXByb2pOYW1lcy5hZGQocHJvamVjdC5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0JCXByb2pUYWJsZVZpZXdlci5zZXRJbnB1dChwcm9qTmFtZXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgdmFsaWRhdGUoKSB7Ci0JCWlmIChwcm9qVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKSAhPSAtMSkKLQkJCXNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJZWxzZQotCQkJc2V0UGFnZUNvbXBsZXRlKGZhbHNlKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybUhlbHAoKSAKLQl7Ci0JICAgIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKCB0aGlzLmhlbHBDb250ZXh0SWQgKTsKLQl9Ci0KLQkvLyBpbm5lciBjbGFzc2VzCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm9qZWN0VGFibGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkKLQkJewotCQkJaWYgKGNvbHVtbkluZGV4ID09IFBST0pFQ1RfTkFNRV9DT0xVTU5fSU5ERVgpCi0JCQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2Uob3JnLmVjbGlwc2UudWkuaWRlLklERS5TaGFyZWRJbWFnZXMuSU1HX09CSl9QUk9KRUNUKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpCi0JCXsKLQkJCWFzc2VydCBlbGVtZW50IGluc3RhbmNlb2YgU3RyaW5nOwotCQkJU3RyaW5nIHByb2plY3ROYW1lID0gKFN0cmluZyllbGVtZW50OwotCQkJaWYgKGNvbHVtbkluZGV4ID09IFBST0pFQ1RfTkFNRV9DT0xVTU5fSU5ERVgpCi0JCQkJcmV0dXJuIHByb2plY3ROYW1lOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIGZpbmFsIGNsYXNzIFByb2plY3RUYWJsZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0JewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCl7Ci0JCQlyZXR1cm4gKChDb2xsZWN0aW9uPD8+KSBpbnB1dEVsZW1lbnQpLnRvQXJyYXkoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKXt9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KXt9Ci0JCQotCX0KLX0JCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NXVFV0aWwuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU1dUVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjk1MDk3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU1dUVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLQotLyoqCi0gKiBDb2xsZWN0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcyB0byBjcmVhdGUgU1dUIFVJCi0gKgotICovCi1wdWJsaWMgY2xhc3MgU1dUVXRpbCB7Ci0JLyoqCi0JICogU2V0IHRoZSBsYXlvdXREYXRhIG9mIHRoZSBpbnB1dCBjb250cm9sIHRvIG9jY3VweSBzcGVjaWZpZWQgbnVtYmVyIG9mIGNvbHVtbnMKLQkgKiBAcGFyYW0gYwotCSAqIEBwYXJhbSBjb2x1bW5zCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZpbGxDb2x1bW5zKENvbnRyb2wgYywgaW50IGNvbHVtbnMpewotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCWMuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJcmV0dXJuIDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZmlsbENvbHVtbnNXaXRoSW5kZW50KENvbnRyb2wgYywgaW50IGNvbHVtbnMsIGludCBpbmRlbnQpewotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudCA7Ci0JCWMuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJcmV0dXJuIDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbGFiZWwgd2hpY2ggb2NjdXBpZXMgb25lIGdyaWQgY29sdW1uCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBuZXdMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIHRleHQgKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbGFiZWwgd2hpY2ggb2NjdXBpZXMgb25lIGdyaWQgY29sdW1uCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBMYWJlbCBuZXdMYWJlbFdpdGhJbmRlbnQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQsIGludCBpbmRlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCB0ZXh0ICk7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1AgOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxJbmRlbnQgPSBpbmRlbnQgOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBzZXBhcmF0b3IgbGluZS4gRXhwZWN0cyBhIDxjb2RlPkdyaWRMYXlvdXQ8L2NvZGU+IHdpdGggYXQgbGVhc3QgMSBjb2x1bW4uCi0JICogCi0JICogQHBhcmFtIGNvbXBvc2l0ZSB0aGUgcGFyZW50IGNvbXBvc2l0ZQotCSAqIEBwYXJhbSBuQ29sdW1ucyBudW1iZXIgb2YgY29sdW1ucyB0byBzcGFuCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBuQ29sdW1ucykgewotCQkobmV3IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5TZXBhcmF0b3IoCi0JCQkJU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKSkuZG9GaWxsSW50b0dyaWQoY29tcG9zaXRlLCBuQ29sdW1ucywgNSk7CQkKLQl9Ci0KLQkKLQlwdWJsaWMgc3RhdGljIEJ1dHRvbiBjcmVhdGVCdXR0b24oQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4sIFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJQnV0dG9uIGJ0biA9IG5ldyBCdXR0b24oY29udGFpbmVyLCBzdHlsZSk7Ci0JCWJ0bi5zZXRUZXh0KHRleHQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCWJ0bi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcmV0dXJuIGJ0bjsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb21ibyBjcmVhdGVDb21ibyhDb21wb3NpdGUgY29udGFpbmVyLCBpbnQgc3BhbiApIHsKLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8oY29udGFpbmVyLCBTV1QuU0lOR0xFIHwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGNyZWF0ZVRleHQoQ29tcG9zaXRlIGNvbnRhaW5lciwgaW50IHNwYW4gKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbnRhaW5lciwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gc3BhbjsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZT10cnVlOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0VGFibGVEaWFsb2cuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vU2VsZWN0VGFibGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjliOWVlMC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1NlbGVjdFRhYmxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkltYWdlUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5FbGVtZW50TGlzdFNlbGVjdGlvbkRpYWxvZzsKLQotLyoqCi0gKiBBIGRhdGFiYXNlIHRhYmxlIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggYWxsb3dzIHVzZXIgdG8gZmlsdGVyIHRhYmxlcyBieSBuYW1lCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RUYWJsZURpYWxvZyBleHRlbmRzIEVsZW1lbnRMaXN0U2VsZWN0aW9uRGlhbG9nIHsKLQkKLQlwdWJsaWMgU2VsZWN0VGFibGVEaWFsb2coU2hlbGwgc2hlbGwsIGZpbmFsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpewotCQlzdXBlcihzaGVsbCwgbmV3IElMYWJlbFByb3ZpZGVyKCl7Ci0JCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQlyZXR1cm4gSW1hZ2VSZXBvc2l0b3J5LmdldFRhYmxlSW1hZ2UocmVzb3VyY2VNYW5hZ2VyKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJcmV0dXJuIGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHt9Ci0JCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkge30KLQotCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHt9Ci0KLQkJfSk7Ci0JCXRoaXMuc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuc2VsZWN0VGFibGVEbGdUaXRsZSApOy8vCi0JCXRoaXMuc2V0TWVzc2FnZSggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5zZWxlY3RUYWJsZURsZ0Rlc2MpOy8vCi0JfQotCQotCXB1YmxpYyBTZWxlY3RUYWJsZURpYWxvZyhTaGVsbCBzaGVsbCwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciwgU2NoZW1hIHNjaGVtYSl7Ci0JCXRoaXMoc2hlbGwsIHJlc291cmNlTWFuYWdlcik7Ci0JCQotCQlBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCWZvciAoVGFibGUgdGFibGUgOiBzY2hlbWEuZ2V0VGFibGVzKCkpIHsKLQkJCWxpc3QuYWRkKHRhYmxlLmdldE5hbWUoKSk7Ci0JCX0KLQkJdGhpcy5zZXRFbGVtZW50cyggbGlzdC50b0FycmF5KCkgKTsKLQkJCi0JfQotCQotCXB1YmxpYyBTZWxlY3RUYWJsZURpYWxvZyhTaGVsbCBzaGVsbCwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlciwgTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMpewotCQl0aGlzKHNoZWxsLCByZXNvdXJjZU1hbmFnZXIpOwotCQl0aGlzLnNldEVsZW1lbnRzKCB0YWJsZU5hbWVzLnRvQXJyYXkoKSApOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdGVkVGFibGUoKSB7Ci0JCVN0cmluZyB0YWJsZU5hbWUgPSAoU3RyaW5nKXRoaXMuZ2V0Rmlyc3RSZXN1bHQoKTsKLQkJcmV0dXJuIHRhYmxlTmFtZSA7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVBc3NvY2lhdGlvbnNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjYzZjYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW4uU1dUVXRpbC5maWxsQ29sdW1uczsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbi5TV1RVdGlsLm5ld0xhYmVsOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuLlNXVFV0aWwubmV3TGFiZWxXaXRoSW5kZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZGlhbG9ncy5TdGF0dXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS53aXphcmRzLmRpYWxvZ2ZpZWxkcy5EaWFsb2dGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkud2l6YXJkcy5kaWFsb2dmaWVsZHMuSVN0cmluZ0J1dHRvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLkxheW91dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLlN0cmluZ0J1dHRvbkRpYWxvZ0ZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuQXNzb2NpYXRpb25Sb2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLk9STUdlbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC5PUk1HZW5DdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSW1hZ2VSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0YWNrTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRmlsbExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci0KLXB1YmxpYyBjbGFzcyBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBjdXN0b21pemVyIDsKLQkKLQlwcml2YXRlIEFzc29jaWF0aW9uc0xpc3RDb21wb3NpdGUgYXNzb2NpYXRpb25MaXN0OyAKLQlwcml2YXRlIEFzc29jaWF0aW9uIHNlbGVjdGVkQXNzb2NpYXRpb247Ci0JcHJpdmF0ZSBCdXR0b24gZGVsZXRlQXNzb2NpYXRpb25MaW5rIDsKLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVBc3NvY2lhdGlvbkxpbmsgOwotCQotCS8vQ29udHJvbHMgaW4gQXNzb2NpYXRpb24gRWRpdCBQYW5lbAotCXByaXZhdGUgQ29tcG9zaXRlIGFzc29jaWF0aW9uc0VkaXRQYW5lbCA7Ci0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94OyAKLQlwcml2YXRlIExhYmVsIGNhcmRpbmFsaXR5TGFiZWwgOwotCXByaXZhdGUgQ29tYm8gY2FyZGluYWxpdHlDb21ibyA7Ci0JLyp3aGV0aGVyIHRvIGdlbmVyYXRlIHRoZSByZWZlcnJlci0tPnJlZmVyZW5jZWQgcm9sZS4qLwotCXByaXZhdGUgQnV0dG9uIHJlZmVycmVyUm9sZUNoZWNrQm94OyAKLQkvKnRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBpbiB0aGUgcmVmZXJyZXItLT5yZWZlcmVuY2VkIHJvbGUuKi8KLQlwcml2YXRlIExhYmVsIHJlZmVycmVyUm9sZVByb3BlcnR5TGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IHJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQgOwotCS8qdGhlIGNhc2NhZGUgaW4gdGhlIHJlZmVycmVyLS0+cmVmZXJlbmNlZCByb2xlLiovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwcml2YXRlIFN0cmluZ0J1dHRvbkRpYWxvZ0ZpZWxkIHJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZDsKLQkvKndoZXRoZXIgdG8gZ2VuZXJhdGUgdGhlIHJlZmVyZW5jZWQtPnJlZmVycmVyIHJvbGUuKi8KLQlwcml2YXRlIEJ1dHRvbiByZWZlcmVuY2VkUm9sZUNoZWNrQm94OwotCS8qdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSByZWZlcmVuY2VkLT5yZWZlcnJlciByb2xlLiovCi0JcHJpdmF0ZSBMYWJlbCByZWZlcmVuY2VkUm9sZVByb3BlcnR5TGFiZWw7Ci0JcHJpdmF0ZSBUZXh0IHJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZCA7Ci0JLyp0aGUgY2FzY2FkZSBpbiB0aGUgcmVmZXJlbmNlZC0+cmVmZXJyZXIgcm9sZS4qLwotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHJpdmF0ZSBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCByZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZDsKLQlwcml2YXRlIExhYmVsIGpvaW5Db25kaXRpb25MYWJlbDsKLQlwcml2YXRlIFRleHQgam9pbkNvbmRpdGlvblRleHQ7IAotCQotCXByaXZhdGUgQ29tcG9zaXRlIGRldGFpbFBhbmVsOwotCXByaXZhdGUgU3RhY2tMYXlvdXQgZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQ7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgZW1wdHlQYW5lbDsKLQkKLQlwcm90ZWN0ZWQgZmluYWwgUmVzb3VyY2VNYW5hZ2VyIHJlc291cmNlTWFuYWdlcjsKLQotCXByb3RlY3RlZCBUYWJsZUFzc29jaWF0aW9uc1dpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXN1cGVyKCJUYWJsZSBBc3NvY2lhdGlvbnMiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQkJc2V0VGl0bGUoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV90aXRsZSk7Ci0JCXNldE1lc3NhZ2UoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZXNjKTsKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gMiA7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1RBQkxFX0FTU09DSUFUSU9OUyk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY1BhZ2VfbGFiZWwgKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKCBnZCApOwotCQkKLQkJY3JlYXRlQXNzb2NpYXRpb25zTGlzdFBhbmVsKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUFkZERlbGV0ZUJ1dHRvbnMoY29tcG9zaXRlLCBuQ29sdW1ucyk7Ci0JCVNXVFV0aWwuY3JlYXRlU2VwYXJhdG9yKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwotCQkKLQkJY3JlYXRlRGV0YWlsUGFuZWwoY29tcG9zaXRlKTsKLQkJc2V0Q29udHJvbChjb21wb3NpdGUpOwotCQkKLQkJY29tcG9zaXRlLmxheW91dCh0cnVlKTsKLQkJdGhpcy5zZXRQYWdlQ29tcGxldGUoIHRydWUpOwotCQkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQWRkRGVsZXRlQnV0dG9ucyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQkKLQkJQ29tcG9zaXRlIGMgPSBuZXcgQ29tcG9zaXRlKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsbENvbHVtbnMoYywgMSk7Ci0JCWMuc2V0TGF5b3V0KCBuZXcgR3JpZExheW91dCgxLHRydWUpICk7Ci0JCQotCQljcmVhdGVBc3NvY2lhdGlvbkxpbmsgPSBuZXcgQnV0dG9uKGMsIFNXVC5OT05FKTsKLQkJY3JlYXRlQXNzb2NpYXRpb25MaW5rLnNldFRvb2xUaXBUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX25ld0Fzc29jICk7Ci0JCWNyZWF0ZUFzc29jaWF0aW9uTGluay5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldEFkZEJ1dHRvbkltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSApOwotCQljcmVhdGVBc3NvY2lhdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGF1bmNoTmV3QXNzb2NpYXRpb25zV2l6YXJkKCk7Ci0JCQl9CQotCQkJCi0JCX0pOwotCQkKLQkJZGVsZXRlQXNzb2NpYXRpb25MaW5rID0gbmV3IEJ1dHRvbihjLCBTV1QuTk9ORSk7Ci0JCUNvbG9yIGZvcmVncm91bmQgPSBuZXcgQ29sb3IoRGlzcGxheS5nZXREZWZhdWx0KCksIDAsMCwyNTUpOwotCQlkZWxldGVBc3NvY2lhdGlvbkxpbmsuc2V0Rm9yZWdyb3VuZChmb3JlZ3JvdW5kKTsKLQkJZm9yZWdyb3VuZC5kaXNwb3NlKCk7Ci0JCWRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRJbWFnZSggSW1hZ2VSZXBvc2l0b3J5LmdldERlbGV0ZUJ1dHRvbkltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSk7Ci0JCWRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRUb29sVGlwVGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jUGFnZV9kZWxBc3NvYyApOwotCQlkZWxldGVBc3NvY2lhdGlvbkxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJQXNzb2NpYXRpb24gYXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbkxpc3QuZ2V0U2VsZWN0ZWRBc3NvY2lhdGlvbigpOwotCQkJCWlmKCBhc3NvY2lhdGlvbiAhPSBudWxsICl7Ci0JCQkJCU9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IGdldEN1c3RvbWl6ZXIoKTsKLQkJCQkJY3VzdG9taXplci5kZWxldGVBc3NvY2lhdGlvbihhc3NvY2lhdGlvbik7Ci0JCQkJCUxpc3Q8QXNzb2NpYXRpb24+IGFzc29jaWF0aW9ucyA9IGN1c3RvbWl6ZXIuZ2V0QXNzb2NpYXRpb25zKCk7Ci0JCQkJCWFzc29jaWF0aW9uTGlzdC51cGRhdGVBc3NvY2lhdGlvbnMoYXNzb2NpYXRpb25zKTsKLQkJCQkJaWYoIGFzc29jaWF0aW9ucy5zaXplKCk9PTAgKXsKLQkJCQkJCWhpZGVBc3NvY2lhdGlvbkRldGFpbCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQkKLQkJfSk7Ci0JCWRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlQXNzb2NpYXRpb25DaGVja2JveChDb21wb3NpdGUgY29tcG9zaXRlLCAgaW50IGNvbHVtbnMpIHsKLQkJZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWdlbmVyYXRlQXNzb2NpYXRpb25DaGVja0JveC5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZ2VuQXNzb2MpOwotCQlnZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gYXNzb2NpYXRpb25MaXN0LmdldFNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQkJCQlpZiggYXNzb2NpYXRpb24gPT0gbnVsbCApCi0JCQkJCXJldHVybjsKLQkJCQlhc3NvY2lhdGlvbi5zZXRHZW5lcmF0ZWQoZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LmdldFNlbGVjdGlvbigpKTsKLQkJCQkKLQkJCQl1cGRhdGVBc3NvY2lhdGlvbkVkaXRQYW5lbChhc3NvY2lhdGlvbik7Ci0JCQkJYXNzb2NpYXRpb25MaXN0LnVwZGF0ZVNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQkJCX0KLQotCQl9KTsKLQotCQlmaWxsQ29sdW1ucyhnZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3gsIGNvbHVtbnMtMSk7Ci0JCW5ld0xhYmVsKGNvbXBvc2l0ZSwgIiIpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlUmVmZXJyZXJSb2xlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgIGludCBjb2x1bW5zKSB7Ci0JCXJlZmVycmVyUm9sZUNoZWNrQm94ID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCXJlZmVycmVyUm9sZUNoZWNrQm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9lbnRpdHlSZWYgKTsKLQkJcmVmZXJyZXJSb2xlQ2hlY2tCb3guYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gZ2VuZXJhdGUgPSByZWZlcnJlclJvbGVDaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQkvL3JlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RWRpdGFibGUoIGdlbmVyYXRlICk7Ci0JCQkJcmVmZXJyZXJSb2xlUHJvcGVydHlMYWJlbC5zZXRFbmFibGVkKCBnZW5lcmF0ZSApOwotCQkJCXJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RW5hYmxlZCggZ2VuZXJhdGUgKTsKLQkJCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZChnZW5lcmF0ZSk7Ci0JCQkJCi0JCQkJLy9JZiBib3RoIHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3ggYW5kIHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3ggdW5jaGVja2VkLCAKLQkJCQkvL3RoZSBhc3NvY2lhdGlvbiBpdHNlbGYgc2hvdWxkbid0IGJlIGdlbmVyYXRlZCAKLQkJCQlpZiggIWdlbmVyYXRlICYmICFyZWZlcmVuY2VkUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKXsKLQkJCQkJZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWNhcmRpbmFsaXR5TGFiZWwuc2V0RW5hYmxlZCggZmFsc2UgKTsKLQkJCQkJY2FyZGluYWxpdHlDb21iby5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQkJcmVmZXJyZXJSb2xlQ2hlY2tCb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJfQotCQkJCQotCQkJCWRpcmVjdGlvbmFsaXR5Q2hlY2tCb3hDaGFuZ2VkKCApOwkJCQotCQkJCQotCQkJCWlmKCBnZW5lcmF0ZSApewotCQkJCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCk7Ci0JCQkJCXJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0VGV4dCggcm9sZS5nZXRQcm9wZXJ0eU5hbWUoKSApOwotCQkJCX0KLQkJCX0KLQotCQl9KTsKLQotCQlTV1RVdGlsLmZpbGxDb2x1bW5zV2l0aEluZGVudChyZWZlcnJlclJvbGVDaGVja0JveCAsIGNvbHVtbnMtMSwgMjAgKTsKLQkJbmV3TGFiZWwocGFyZW50LCAiIik7Ly8kTk9OLU5MUy0xJAotCQkKLQkJcmVmZXJyZXJSb2xlUHJvcGVydHlMYWJlbCA9IG5ld0xhYmVsV2l0aEluZGVudCggcGFyZW50LCAgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5wcm9wZXJ0eSwgNDAgKTsKLQkJcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZCA9IG5ldyBUZXh0KCBwYXJlbnQsIFNXVC5CT1JERVIpOwotCQlmaWxsQ29sdW1ucyhyZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkLCAyKTsKLQkJcmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlpZiggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcnJlclJvbGUoKSA9PSBudWxsICkKLQkJCQkJcmV0dXJuOwotCQkJCVN0cmluZyBmaWVsZE5hbWUgPSByZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkLmdldFRleHQoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUZpZWxkTmFtZSggZmllbGROYW1lICk7Ci0JCQkJaWYoICFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSApewotCQkJCQlzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpLnNldFByb3BlcnR5TmFtZShmaWVsZE5hbWUpOwotCQkJCX0KLQkJCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQkJCX0JCQkKLQkJfSk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCAiIiApOy8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQgPSBuZXcgU3RyaW5nQnV0dG9uRGlhbG9nRmllbGQoIG5ldyBJU3RyaW5nQnV0dG9uQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgY2hhbmdlQ29udHJvbFByZXNzZWQoRGlhbG9nRmllbGQgZmllbGQpIHsKLQkJCQlpZiggZWRpdENhc2NhZGUoIHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCkgKSl7Ci0JCQkJCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRUZXh0KHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJSb2xlKCkuZ2V0Q2FzY2FkZSgpKTsKLQkJCQl9Ci0JCQl9CQotCQl9KSA7Ci0JCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRMYWJlbFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuY2FzY2FkZSApOwotCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0QnV0dG9uTGFiZWwoIiIpOyAvLyROT04tTkxTLTEkCi0JCXJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5kb0ZpbGxJbnRvR3JpZChwYXJlbnQsIDMpOwotCQlyZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuZ2V0VGV4dENvbnRyb2wocGFyZW50KS5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWludCBtYXhGaWVsZFdpZHRoID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDQwKTsKLQkJTGF5b3V0VXRpbC5zZXRXaWR0aEhpbnQocmVmZXJyZXJSb2xlQ2FzY2FkZUZpZWxkLmdldFRleHRDb250cm9sKG51bGwpLCBtYXhGaWVsZFdpZHRoICk7Ci0JCUJ1dHRvbiBidG4gPSByZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuZ2V0Q2hhbmdlQ29udHJvbChudWxsKTsKLQkJR3JpZERhdGEgZGF0YSA9IChHcmlkRGF0YSlidG4uZ2V0TGF5b3V0RGF0YSgpOwotCQlidG4uc2V0SW1hZ2UoIEltYWdlUmVwb3NpdG9yeS5nZXRCcm93c2VCdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlcikgKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDsKLQkJYnRuLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlMYWJlbCBsYWJlbEN0cmwgID0gcmVmZXJyZXJSb2xlQ2FzY2FkZUZpZWxkLmdldExhYmVsQ29udHJvbChwYXJlbnQpOwotCQlkYXRhID0gKEdyaWREYXRhKWxhYmVsQ3RybC5nZXRMYXlvdXREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDQwIDsKLQkJbGFiZWxDdHJsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQkKLQkJbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCAiIiApOy8vJE5PTi1OTFMtMSQKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKSk7Ci0JCQotCX0JCi0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJc3VwZXIuc2V0VmlzaWJsZSh2aXNpYmxlKTsKLQkJaWYoIHZpc2libGUgKXsKLQkJCWhpZGVBc3NvY2lhdGlvbkRldGFpbCgpOwotCQkJdXBkYXRlQXNzb2NpYXRpb25zTGlzdFBhbmVsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGlkZUFzc29jaWF0aW9uRGV0YWlsKCApewotCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBlbXB0eVBhbmVsOwotCQl0aGlzLmRldGFpbFBhbmVsLmxheW91dCgpOwotCQl0aGlzLmRldGFpbFBhbmVsLmdldFBhcmVudCgpLmxheW91dCgpOwotCX0KLQkKLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBzdGF0dXMgbGluZSBhbmQgdGhlIE9LIGJ1dHRvbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHN0YXR1cwotCSAqIAotCSAqIEBwYXJhbSBzdGF0dXMgc3RhdHVzIHRvIGFwcGx5Ci0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJc2V0UGFnZUNvbXBsZXRlKCFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSk7Ci0JCQotCQlTdGF0dXNVdGlsLmFwcGx5VG9TdGF0dXNMaW5lKHRoaXMsIHN0YXR1cyk7Ci0JCWlmKCBzdGF0dXMuZ2V0Q29kZSgpID09IFN0YXR1cy5PSyApewotCQkJc2V0TWVzc2FnZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NQYWdlX2Rlc2MpOwotCQl9Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlUmVmZXJlbmNlZFJvbGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCAgaW50IGNvbHVtbnMpIHsKLQkJcmVmZXJlbmNlZFJvbGVDaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlyZWZlcmVuY2VkUm9sZUNoZWNrQm94LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9zZXRSZWYgKTsKLQkJcmVmZXJlbmNlZFJvbGVDaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYm9vbGVhbiBnZW5lcmF0ZSA9IHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoIGdlbmVyYXRlKTsKLQkJCQlyZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQuc2V0RW5hYmxlZCggZ2VuZXJhdGUpOwotCQkJCXJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLnNldEVuYWJsZWQoZ2VuZXJhdGUpOwotCQkJCQotCQkJCWlmKCAhZ2VuZXJhdGUgJiYgIXJlZmVycmVyUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKXsKLQkJCQkJZ2VuZXJhdGVBc3NvY2lhdGlvbkNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCWNhcmRpbmFsaXR5Q29tYm8uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkJCXJlZmVycmVyUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlyZWZlcmVuY2VkUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCX0KLQkJCQlkaXJlY3Rpb25hbGl0eUNoZWNrQm94Q2hhbmdlZCgpOwotCQkJCWlmKCBnZW5lcmF0ZSApewotCQkJCQlBc3NvY2lhdGlvblJvbGUgcm9sZSA9IHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKTsKLQkJCQkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLnNldFRleHQoIHJvbGUuZ2V0UHJvcGVydHlOYW1lKCkgKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJU1dUVXRpbC5maWxsQ29sdW1uc1dpdGhJbmRlbnQoIHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3ggLCBjb2x1bW5zLTEsIDIwICk7Ci0JCW5ld0xhYmVsKHBhcmVudCwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJCi0JCXJlZmVyZW5jZWRSb2xlUHJvcGVydHlMYWJlbCA9IFNXVFV0aWwubmV3TGFiZWxXaXRoSW5kZW50KHBhcmVudCwgIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMucHJvcGVydHksIDQwICk7Ci0JCQotCQlyZWZlcmVuY2VkUm9sZVByb3BlcnR5RmllbGQgPSBuZXcgVGV4dCggcGFyZW50LCBTV1QuQk9SREVSKTsKLQkJZmlsbENvbHVtbnMocmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLCAyKTsKLQkJcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpewotCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJaWYoIHNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKSA9PSBudWxsICkKLQkJCQkJcmV0dXJuIDsKLQkJCQkKLQkJCQlTdHJpbmcgZmllbGROYW1lID0gcmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLmdldFRleHQoKTsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUlkZW50aWZpZXIoZmllbGROYW1lLAotCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzMsIEphdmFDb3JlLlZFUlNJT05fMV8zKTsKLQkJCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7Ci0JCQkJCWlmKCAhZmllbGROYW1lLmVxdWFscyhzZWxlY3RlZEFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCkuZ2V0UHJvcGVydHlOYW1lKCkpICkKLQkJCQkJCXNlbGVjdGVkQXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFJvbGUoKS5zZXRQcm9wZXJ0eU5hbWUoZmllbGROYW1lKTsKLQkJCQl9Ci0JCQkJdXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JCQl9CQkJCi0JCX0pOwotCQkKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCggcGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoICIiICk7Ly8kTk9OLU5MUy0xJAotCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpKTsKLQkJCi0JCQotCQlyZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZCA9IG5ldyBTdHJpbmdCdXR0b25EaWFsb2dGaWVsZCggbmV3IElTdHJpbmdCdXR0b25BZGFwdGVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBjaGFuZ2VDb250cm9sUHJlc3NlZChEaWFsb2dGaWVsZCBmaWVsZCkgewotCQkJCWlmKCBlZGl0Q2FzY2FkZSggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpICkgKXsKLQkJCQkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0VGV4dCggc2VsZWN0ZWRBc3NvY2lhdGlvbi5nZXRSZWZlcmVuY2VkUm9sZSgpLmdldENhc2NhZGUoKSApOwotCQkJCX0KLQkJCX0JCi0JCX0pIDsKLQkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0TGFiZWxUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLmNhc2NhZGUgKTsKLQkJcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0QnV0dG9uTGFiZWwoIiIpOyAvLyROT04tTkxTLTEkCi0JCXJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLmRvRmlsbEludG9HcmlkKHBhcmVudCwgMyk7Ci0JCXJlZmVyZW5jZWRSb2xlQ2FzY2FkZUZpZWxkLmdldFRleHRDb250cm9sKHBhcmVudCkuc2V0RWRpdGFibGUoIGZhbHNlKTsKLQkJaW50IG1heEZpZWxkV2lkdGggPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoNDApOwotCQlMYXlvdXRVdGlsLnNldFdpZHRoSGludChyZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZC5nZXRUZXh0Q29udHJvbChudWxsKSwgbWF4RmllbGRXaWR0aCApOwotCQlCdXR0b24gYnRuID0gcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuZ2V0Q2hhbmdlQ29udHJvbChudWxsKTsKLQkJYnRuLnNldEltYWdlKCBJbWFnZVJlcG9zaXRvcnkuZ2V0QnJvd3NlQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpICk7Ci0JCUdyaWREYXRhIGRhdGEgPSAoR3JpZERhdGEpYnRuLmdldExheW91dERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkJFR0lOTklORzsKLQkJZGF0YS53aWR0aEhpbnQgPSAzMDsKLQkJYnRuLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlMYWJlbCBsYWJlbEN0cmwgID0gcmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuZ2V0TGFiZWxDb250cm9sKHBhcmVudCk7Ci0JCWRhdGEgPSAoR3JpZERhdGEpbGFiZWxDdHJsLmdldExheW91dERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNDAgOwotCQlsYWJlbEN0cmwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJCi0JCWxhYmVsID0gbmV3IExhYmVsKCBwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dCggIiIgKTsvLyROT04tTkxTLTEkCi0JCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCQkKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZXRhaWxQYW5lbChDb21wb3NpdGUgY29tcG9zaXRlICkgewotCQkKLQkJdGhpcy5kZXRhaWxQYW5lbCA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQl0aGlzLmRldGFpbFBhbmVsLnNldExheW91dERhdGEoZ2QpOwotCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0ID0gbmV3IFN0YWNrTGF5b3V0KCk7Ci0JCXRoaXMuZGV0YWlsUGFuZWwuc2V0TGF5b3V0KCB0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0ICk7Ci0JCQotCQllbXB0eVBhbmVsID0gbmV3IENvbXBvc2l0ZSggZGV0YWlsUGFuZWwsIFNXVC5OT05FKTsKLQkJZW1wdHlQYW5lbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsgCi0JCWRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBlbXB0eVBhbmVsOwotCQlkZXRhaWxQYW5lbC5sYXlvdXQoKTsKLQkJCi0JCWNvbXBvc2l0ZS5sYXlvdXQoKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQXNzb2NpYXRpb25zRWRpdFBhbmVsKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKCBjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZmlsbENvbHVtbnMocGFyZW50LCA0KTsKLQotCQljcmVhdGVHZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tib3gocGFyZW50LGNvbHVtbnMpOwotCQlpbnQgbkNvbHVtbnM9IDQgOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbkNvbHVtbnM7Ci0JCXBhcmVudC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0NhcmRpbmFsaXR5Ci0JCWNhcmRpbmFsaXR5TGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNhcmRpbmFsaXR5TGFiZWwuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5jYXJkaW5hbGl0eSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJY2FyZGluYWxpdHlMYWJlbC5zZXRMYXlvdXREYXRhKCBnZCApOwotCQkKLQkJY2FyZGluYWxpdHlDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZICk7Ci0JCQotCQlmaWxsQ29sdW1ucyhjYXJkaW5hbGl0eUNvbWJvLCAxKTsKLQkJCi0JCWNhcmRpbmFsaXR5Q29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RlZEFzc29jaWF0aW9uLnNldENhcmRpbmFsaXR5KCBjYXJkaW5hbGl0eUNvbWJvLmdldFRleHQoKSk7Ci0JCQkJYXNzb2NpYXRpb25MaXN0LnVwZGF0ZVNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQkvL0FkZGluZyBhIGZpbGxlciBjb2x1bW4KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoIHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KCAiIik7Ly8kTk9OLU5MUy0xJAotCQlHcmlkRGF0YSBsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJCi0JCS8vVGFibGUgam9pbiBjb25kaXRpb24KLQkJam9pbkNvbmRpdGlvbkxhYmVsID0gbmV3TGFiZWxXaXRoSW5kZW50KHBhcmVudCwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX3RhYmxlSm9pbiwgMjAgKTsKLQkJCi0JCWpvaW5Db25kaXRpb25UZXh0ID0gbmV3IFRleHQoIHBhcmVudCwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiApOwotCQlqb2luQ29uZGl0aW9uVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWpvaW5Db25kaXRpb25UZXh0LnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2pvaW5lZFdoZW4pOwotCQlsYXlvdXREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWxheW91dERhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYXlvdXREYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gU1dULlRPUDsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gNTA7Ci0JCWpvaW5Db25kaXRpb25UZXh0LnNldExheW91dERhdGEobGF5b3V0RGF0YSk7Ci0JCW5ld0xhYmVsKHBhcmVudCwgIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvL0dlbmVyYXRlIFVJIGNvbnRyb2xzIGZvciBSZWZlcnJlclJvbGUKLQkJY3JlYXRlR2VuZXJhdGVSZWZlcnJlclJvbGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCi0JCS8vR2VuZXJhdGUgVUkgY29udHJvbHMgZm9yIFJlZmVyZW5jZWRSb2xlCi0JCWNyZWF0ZUdlbmVyYXRlUmVmZXJlbmNlZFJvbGVDb250cm9scyhwYXJlbnQsIGNvbHVtbnMpOwotCQkKLQkJCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZWRpdENhc2NhZGUoQXNzb2NpYXRpb25Sb2xlIHJvbGUpIHsKLQkJQ2FzY2FkZURpYWxvZyBkbGcgPSBDYXNjYWRlRGlhbG9nLmNyZWF0ZShyb2xlKTsKLQkJaWYgKGRsZy5vcGVuKCkgPT0gV2luZG93LkNBTkNFTCApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSggcGFyZW50LCBTV1QuTlVMTCApOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KCBuZXcgRmlsbExheW91dCgpKTsKLQkJQ29sb3IgYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLDI1NSwgMCwwKTsKLQkJY29tcG9zaXRlLnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gZmFsc2U7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlsYXlvdXREYXRhLndpZHRoSGludCA9IDQwMDsKLQkJbGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gNDAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJCi0JCWFzc29jaWF0aW9uTGlzdCA9IG5ldyBBc3NvY2lhdGlvbnNMaXN0Q29tcG9zaXRlKGNvbXBvc2l0ZSwgdGhpcywgdGhpcy5yZXNvdXJjZU1hbmFnZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgbGF1bmNoTmV3QXNzb2NpYXRpb25zV2l6YXJkKCkgewotCQlPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBnZXRDdXN0b21pemVyKCk7Ci0JCU5ld0Fzc29jaWF0aW9uV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdBc3NvY2lhdGlvbldpemFyZCh0aGlzLmpwYVByb2plY3QsIGN1c3RvbWl6ZXIsIHRoaXMucmVzb3VyY2VNYW5hZ2VyKTsKLQkJCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKCB0aGlzLmdldFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaW50IHJldHVybkNvZGUgPSBkaWFsb2cub3BlbigpOwotCQlpZiAocmV0dXJuQ29kZSA9PSBXaW5kb3cuT0spIHsKLQkJCUFzc29jaWF0aW9uIGFzc29jaWF0aW9uID0gd2l6YXJkLmdldE5ld0Fzc29jaWF0aW9uKCk7Ci0JCQlpZiggYXNzb2NpYXRpb24gIT1udWxsICl7Ci0JCQkJY3VzdG9taXplci5hZGRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbik7Ci0JCQkJdXBkYXRlRm9yZWlnbktleUNvbHVtbkdlblByb3BlcnR5KGFzc29jaWF0aW9uKTsKLQkJCQl1cGRhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoKTsKLQkJCX0KLQkJfQkJCi0JfQotCS8qKgotCSAqIEZvciB1c2VyIGNyZWF0ZWQgYXNzb2NpYXRpb246Ci0JICogSWYgYXNzb2NpYXRpb24gaXMgdG8gYmUgZ2VuZXJhdGVkLCBubyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBnZXR0ZXIvc2V0dGVyIGZvciB0aGUgY29sdW1uIGl0c2VsZgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVGb3JlaWduS2V5Q29sdW1uR2VuUHJvcGVydHkoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24pIHsKLQkJLy9OZWVkIHRvIHByb2Nlc3MgTUFOWV9UT19PTkUgb25seSBzaW5jZSB0aGUgdGhlIGFzc29jaWF0aW9ucyBsaXN0IGFyZSBvcHRpbWl6ZWQgdG8gaGF2ZSBNQU5ZX1RPX09ORQotCQlpZiggYXNzb2NpYXRpb24uaXNDdXN0b20oKSAmJiBhc3NvY2lhdGlvbi5nZXRDYXJkaW5hbGl0eSgpLmVxdWFscyggQXNzb2NpYXRpb24uTUFOWV9UT19PTkUgKSApewotCQkJYm9vbGVhbiBnZW5lcmF0ZUNvbHVtbiA9ICAhYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKTsKLQkJCS8vVGhlICJNQU5ZIiBzaWRlIERCIHRhYmxlCi0JCQkvL09STUdlblRhYmxlIHRhYmxlMSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVyVGFibGUoKTsKLQkJCS8vVGhlICJPTkUiIHNpZGUgREIgdGFibGUKLQkJCS8vT1JNR2VuVGFibGUgdGFibGUyID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZFRhYmxlKCk7Ci0JCQkvL1RoZSBsaXN0IG9mIGZvcmVpZ24ga2V5IGNvbHVtbnMgaW4gdGhlIE1BTlkgc2lkZSwgc2hvdWxkIG5vdCBiZSBnZW5lcmF0ZWQKLQkJCS8vVGhlIGxpc3Qgb2YgcHJpbWFyeSBrZXlzIGluIHRoZSBPTkUgc2lkZSwgd2lsbCBiZSBnZW5lcmF0ZWQKLQkJCS8vTGlzdDxPUk1HZW5Db2x1bW4+IGxpc3QyID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbnMoKTsJCi0JCQlMaXN0PE9STUdlbkNvbHVtbj4gbGlzdDEgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbnMoKTsJCi0JCQlmb3IoT1JNR2VuQ29sdW1uIGMgOiBsaXN0MSApewotCQkJCWlmKCBjLmlzR2VuZXJhdGVkKCkgIT0gZ2VuZXJhdGVDb2x1bW4pewotCQkJCQlpZiggIWdlbmVyYXRlQ29sdW1uICYmIGMuZ2V0RGJDb2x1bW4oKS5pc1BhcnRPZlByaW1hcnlLZXkoKSApewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYy5zZXRHZW5lcmF0ZWQoZ2VuZXJhdGVDb2x1bW4pOwotCQkJCQljLnNldEluc2VydGFibGUoZ2VuZXJhdGVDb2x1bW4pOwotCQkJCQljLnNldFVwZGF0ZWFibGUoZ2VuZXJhdGVDb2x1bW4pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVBc3NvY2lhdGlvbnNMaXN0UGFuZWwoKSB7Ci0JCQlPUk1HZW5DdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBnZXRDdXN0b21pemVyKCk7Ci0JCQkvL0lmIHVzZXIgY2hhbmdlZCB0aGUgY29ubmVjdGlvbiBvciBzY2hlbWEKLQkJCWlmKCB0aGlzLmN1c3RvbWl6ZXIgIT0gY3VzdG9taXplciApewotCQkJCXRoaXMuY3VzdG9taXplciA9IGN1c3RvbWl6ZXI7IAotCQkJfQotCQkJTGlzdDxBc3NvY2lhdGlvbj4gYXNzb2NpYXRpb25zID0gY3VzdG9taXplci5nZXRBc3NvY2lhdGlvbnMoKTsKLQkJCXRoaXMuYXNzb2NpYXRpb25MaXN0LnVwZGF0ZUFzc29jaWF0aW9ucyggYXNzb2NpYXRpb25zICk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwdWJsaWMgdm9pZCB1cGRhdGVBc3NvY2lhdGlvbkVkaXRQYW5lbChBc3NvY2lhdGlvbiBhc3NvY2lhdGlvbikgewotCQl0aGlzLnNlbGVjdGVkQXNzb2NpYXRpb24gPSBhc3NvY2lhdGlvbjsKLQotCQlib29sZWFuIGVuYWJsZWQgPSBhc3NvY2lhdGlvbi5pc0N1c3RvbSgpOwotCQl0aGlzLmRlbGV0ZUFzc29jaWF0aW9uTGluay5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkKLQkJLy9DcmVhdGUgYW5kIGRpc3BsYXkgdGhlIGFzc29jaWF0aW9uc0VkaXRQYW5lbCBpZiBpdCB3YXMgaGlkZGVuIGJlZm9yZQotCQlpZiggYXNzb2NpYXRpb25zRWRpdFBhbmVsID09IG51bGwgKXsKLQkJCWFzc29jaWF0aW9uc0VkaXRQYW5lbCA9IHRoaXMuY3JlYXRlQXNzb2NpYXRpb25zRWRpdFBhbmVsKHRoaXMuZGV0YWlsUGFuZWwsIDQpOwotCQl9Ci0JCXRoaXMuZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQudG9wQ29udHJvbCA9IGFzc29jaWF0aW9uc0VkaXRQYW5lbDsKLQkJdGhpcy5kZXRhaWxQYW5lbC5sYXlvdXQoKTsKLQkJdGhpcy5kZXRhaWxQYW5lbC5nZXRQYXJlbnQoKS5sYXlvdXQoKTsKLQotCQkvL1VwZGF0ZSB0aGUgVUkgY29udHJvbHMgZnJvbSB0aGUgbW9kZWwKLQkJU3RyaW5nIHRhYmxlMU5hbWUgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlclRhYmxlTmFtZSgpOwotCQlTdHJpbmcgdGFibGUyTmFtZSA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRUYWJsZU5hbWUoKTsKLQkJU3RyaW5nIGpvaW5UYWJsZU5hbWUgPSBhc3NvY2lhdGlvbi5nZXRKb2luVGFibGVOYW1lKCk7Ci0JCQotCQlib29sZWFuIGlzR2VuZXJhdGVkID0gYXNzb2NpYXRpb24uaXNHZW5lcmF0ZWQoKTsKLQkJdGhpcy5nZW5lcmF0ZUFzc29jaWF0aW9uQ2hlY2tCb3guc2V0U2VsZWN0aW9uKGlzR2VuZXJhdGVkKTsKLQkJdGhpcy5yZWZlcnJlclJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOwotCQl0aGlzLnJlZmVycmVyUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLnNldEVuYWJsZWQoIGlzR2VuZXJhdGVkICk7Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOwotCQl0aGlzLmNhcmRpbmFsaXR5TGFiZWwuc2V0RW5hYmxlZChpc0dlbmVyYXRlZCk7Ci0JCXRoaXMuY2FyZGluYWxpdHlDb21iby5zZXRFbmFibGVkKGlzR2VuZXJhdGVkKTsKLQkJdGhpcy5qb2luQ29uZGl0aW9uTGFiZWwuc2V0RW5hYmxlZCggaXNHZW5lcmF0ZWQgKTsKLQkJdGhpcy5qb2luQ29uZGl0aW9uVGV4dC5zZXRFbmFibGVkKCBpc0dlbmVyYXRlZCApOwotCQkKLQkJU3RyaW5nIGNhcmRpbmFsaXR5ID0gYXNzb2NpYXRpb24uZ2V0Q2FyZGluYWxpdHkoKTsKLQkJaWYoIEFzc29jaWF0aW9uLk1BTllfVE9fTUFOWS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKLQkJCWNhcmRpbmFsaXR5Q29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQljYXJkaW5hbGl0eUNvbWJvLmFkZCggQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZKTsKLQkJfWVsc2V7Ci0JCQljYXJkaW5hbGl0eUNvbWJvLnJlbW92ZUFsbCgpOwotCQkJY2FyZGluYWxpdHlDb21iby5hZGQoIEFzc29jaWF0aW9uLk1BTllfVE9fT05FKTsKLQkJCWNhcmRpbmFsaXR5Q29tYm8uYWRkKCBBc3NvY2lhdGlvbi5PTkVfVE9fT05FKTsKLQkJfQotCQkKLQkJY2FyZGluYWxpdHlDb21iby5zZXRUZXh0KGNhcmRpbmFsaXR5KTsKLQkJY2FyZGluYWxpdHlDb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkvL2lmIE1UTQotCQlpZiggQXNzb2NpYXRpb24uTUFOWV9UT19NQU5ZLmVxdWFscyggY2FyZGluYWxpdHkgKSApewotCQkJdGV4dCA9IFN0cmluZy5mb3JtYXQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9zZXRSZWYsIHRhYmxlMk5hbWUsIHRhYmxlMU5hbWUpOwotCQl9ZWxzZXsKLQkJCXRleHQgPSBTdHJpbmcuZm9ybWF0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfYXNzb2NFZGl0b3JfZW50aXR5UmVmLCB0YWJsZTJOYW1lLCB0YWJsZTFOYW1lKTsKLQkJfQotCQl0aGlzLnJlZmVycmVyUm9sZUNoZWNrQm94LnNldFRleHQodGV4dCk7Ci0KLQkJLy9pZiBPVE8KLQkJaWYoIEFzc29jaWF0aW9uLk9ORV9UT19PTkUuZXF1YWxzKCBjYXJkaW5hbGl0eSApICl7Ci0JCQl0ZXh0ID0gU3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2VudGl0eVJlZiwgdGFibGUxTmFtZSwgdGFibGUyTmFtZSk7Ci0JCX1lbHNlewotCQkJdGV4dCA9IFN0cmluZy5mb3JtYXQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9zZXRSZWYsIHRhYmxlMU5hbWUsIHRhYmxlMk5hbWUpOwotCQl9Ci0JCXRoaXMucmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRUZXh0KHRleHQpOwotCi0JCS8vQXNzb2NpYXRpb25Sb2xlIHByb3BlcnRpZXMKLQkJQXNzb2NpYXRpb25Sb2xlIHJlZmVycmVyUm9sZSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVyUm9sZSgpOwotCQlpZiggcmVmZXJyZXJSb2xlICE9IG51bGwpewotCQkJdGhpcy5yZWZlcnJlclJvbGVDaGVja0JveC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCXRoaXMucmVmZXJyZXJSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KHJlZmVycmVyUm9sZS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0JCQl0aGlzLnJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJU3RyaW5nIGNhc2NhZGUgPSByZWZlcnJlclJvbGUuZ2V0Q2FzY2FkZSgpOwotCQkJaWYoIGNhc2NhZGUhPW51bGwgKSAKLQkJCQl0aGlzLnJlZmVycmVyUm9sZUNhc2NhZGVGaWVsZC5zZXRUZXh0KCBjYXNjYWRlICk7Ci0JCQkKLQkJCS8vaWYgTVRPOiAKLQkJCWlmKCBBc3NvY2lhdGlvbi5NQU5ZX1RPX09ORS5lcXVhbHMoIGNhcmRpbmFsaXR5ICkgKXsKLQkJCQl0aGlzLnJlZmVycmVyUm9sZUNoZWNrQm94LnNldEVuYWJsZWQoIGZhbHNlICk7Ci0JCQl9Ci0JCX1lbHNlewotCQkJdGhpcy5yZWZlcnJlclJvbGVDaGVja0JveC5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0JCQl0aGlzLnJlZmVycmVyUm9sZVByb3BlcnR5TGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLnJlZmVycmVyUm9sZVByb3BlcnR5RmllbGQuc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJdGhpcy5yZWZlcnJlclJvbGVQcm9wZXJ0eUZpZWxkLnNldFRleHQoIiIpOwotCQkJdGhpcy5yZWZlcnJlclJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCUFzc29jaWF0aW9uUm9sZSByZWZlcmVuY2VkUm9sZSA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRSb2xlKCk7Ci0JCWlmKCByZWZlcmVuY2VkUm9sZSAhPSBudWxsKXsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVDaGVja0JveC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVQcm9wZXJ0eUZpZWxkLnNldFRleHQocmVmZXJlbmNlZFJvbGUuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQkJdGhpcy5yZWZlcmVuY2VkUm9sZUNhc2NhZGVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJU3RyaW5nIGNhc2NhZGUgPSByZWZlcmVuY2VkUm9sZS5nZXRDYXNjYWRlKCk7Ci0JCQlpZiggY2FzY2FkZSE9bnVsbCApIAotCQkJCXRoaXMucmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0VGV4dChjYXNjYWRlKTsKLQkJfWVsc2V7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guc2V0U2VsZWN0aW9uKCBmYWxzZSApOwotCQkJdGhpcy5yZWZlcmVuY2VkUm9sZVByb3BlcnR5TGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQl0aGlzLnJlZmVyZW5jZWRSb2xlUHJvcGVydHlGaWVsZC5zZXRUZXh0KCIiKTsKLQkJCXRoaXMucmVmZXJlbmNlZFJvbGVDYXNjYWRlRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCS8vSm9pbiBjb25kaXRpb25zCi0JCXVwZGF0ZUpvaW5Db25kaXRpb25zKGFzc29jaWF0aW9uLCB0YWJsZTFOYW1lLCB0YWJsZTJOYW1lLCBqb2luVGFibGVOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlSm9pbkNvbmRpdGlvbnMoQXNzb2NpYXRpb24gYXNzb2NpYXRpb24sCi0JCQlTdHJpbmcgdGFibGUxTmFtZSwgU3RyaW5nIHRhYmxlMk5hbWUsIFN0cmluZyBqb2luVGFibGVOYW1lKSB7Ci0JCVN0cmluZyB0ZXh0ID0gIiVzIjsKLQkJaWYoIGpvaW5UYWJsZU5hbWUgPT0gbnVsbCApewotCQkJU3RyaW5nQnVpbGRlciBzdHJUZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCS8vdGV4dCA9IEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9hc3NvY0VkaXRvcl9qb2luZWRXaGVuOwotCQkJTGlzdDxTdHJpbmc+IGNvbHVtbkxpc3QxID0gYXNzb2NpYXRpb24uZ2V0UmVmZXJyZXJDb2x1bW5OYW1lcygpIDsKLQkJCUxpc3Q8U3RyaW5nPiBjb2x1bW5MaXN0MiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpOwotCQkJZm9yKCBpbnQgaT0wOyBpIDwgY29sdW1uTGlzdDEuc2l6ZSgpOyBpKyspewotCQkJCXN0clRleHQuYXBwZW5kKCB0YWJsZTFOYW1lICsgIi4iICsgY29sdW1uTGlzdDEuZ2V0KGkpICk7Ly8kTk9OLU5MUy0xJAotCQkJCXN0clRleHQuYXBwZW5kKCAiPSIgKTsvLyROT04tTkxTLTEkCi0JCQkJc3RyVGV4dC5hcHBlbmQoIHRhYmxlMk5hbWUgKyAiLiIgKyBjb2x1bW5MaXN0Mi5nZXQoaSkgKTsvLyROT04tTkxTLTEkCi0JCQkJaWYoIGkgPCBjb2x1bW5MaXN0MS5zaXplKCktMSApCi0JCQkJCXN0clRleHQuYXBwZW5kKCAiXG4gQU5EICIgKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlqb2luQ29uZGl0aW9uVGV4dC5zZXRUZXh0KCBTdHJpbmcuZm9ybWF0KCB0ZXh0ICwgc3RyVGV4dC50b1N0cmluZygpKSApOyAKLQkJfWVsc2V7Ci0JCQlTdHJpbmdCdWlsZGVyIHN0clRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQkJLy90ZXh0ID0gSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2Fzc29jRWRpdG9yX2pvaW5lZFdoZW47Ci0JCQlMaXN0PFN0cmluZz4gY29sdW1uTGlzdDEgPSBhc3NvY2lhdGlvbi5nZXRSZWZlcnJlckNvbHVtbk5hbWVzKCkgOwotCQkJTGlzdDxTdHJpbmc+IGpvaW5Db2x1bW5MaXN0MSA9IGFzc29jaWF0aW9uLmdldFJlZmVycmVySm9pbkNvbHVtbk5hbWVzKCkgIDsKLQkJCWZvciggaW50IGk9MDsgaSA8IGNvbHVtbkxpc3QxLnNpemUoKTsgaSsrKXsKLQkJCQlzdHJUZXh0LmFwcGVuZCggdGFibGUxTmFtZSArICIuIiArIGNvbHVtbkxpc3QxLmdldChpKSApOy8vJE5PTi1OTFMtMSQKLQkJCQlzdHJUZXh0LmFwcGVuZCggIj0iICk7Ly8kTk9OLU5MUy0xJAotCQkJCXN0clRleHQuYXBwZW5kKCBqb2luVGFibGVOYW1lICsgIi4iICsgam9pbkNvbHVtbkxpc3QxLmdldChpKSApOwotCQkJCXN0clRleHQuYXBwZW5kKCAiXG4gQU5EICIgKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkKLQkJCUxpc3Q8U3RyaW5nPiBqb2luVGFibGVDb2x1bW5MaXN0MiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRKb2luQ29sdW1uTmFtZXMoKTsKLQkJCUxpc3Q8U3RyaW5nPiBjb2x1bW5MaXN0MiA9IGFzc29jaWF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lcygpOwotCQkJZm9yKCBpbnQgaT0wOyBpIDwgam9pblRhYmxlQ29sdW1uTGlzdDIuc2l6ZSgpOyBpKyspewotCQkJCXN0clRleHQuYXBwZW5kKCBqb2luVGFibGVOYW1lICsgIi4iICsgam9pblRhYmxlQ29sdW1uTGlzdDIuZ2V0KGkpICk7Ci0JCQkJc3RyVGV4dC5hcHBlbmQoICI9IiApOy8vJE5PTi1OTFMtMSQKLQkJCQlzdHJUZXh0LmFwcGVuZCggdGFibGUyTmFtZSArICIuIiArIGNvbHVtbkxpc3QyLmdldChpKSApOy8vJE5PTi1OTFMtMSQKLQkJCQlpZiggaSA8IGpvaW5UYWJsZUNvbHVtbkxpc3QyLnNpemUoKS0xICkKLQkJCQkJc3RyVGV4dC5hcHBlbmQoICJcbiBBTkQgIiApOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCQotCQkJam9pbkNvbmRpdGlvblRleHQuc2V0VGV4dCggU3RyaW5nLmZvcm1hdCggdGV4dCAsIHN0clRleHQudG9TdHJpbmcoKSkgKTsgCi0JCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGxlZCB3aGVuIG9uZSBvZiByZWZlcnJlclJvbGVDaGVja0JveCBvciByZWZlcmVuY2VkUm9sZUNoZWNrQm94IAotCSAqIGNoYW5nZXMgdmFsdWUuIAotCSAqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpcmVjdGlvbmFsaXR5Q2hlY2tCb3hDaGFuZ2VkKCkgewotCQlTdHJpbmcgZGlyOwotCQlpZiAocmVmZXJyZXJSb2xlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWRpciA9IHJlZmVyZW5jZWRSb2xlQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkgPyBBc3NvY2lhdGlvbi5CSV9ESSA6IEFzc29jaWF0aW9uLk5PUk1BTF9ESTsKLQkJfSBlbHNlIHsKLQkJCWlmIChyZWZlcmVuY2VkUm9sZUNoZWNrQm94LmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZGlyID0gQXNzb2NpYXRpb24uT1BQT1NJVEVfREk7Ci0JCQl9IGVsc2UgewotCQkJCWRpciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQlzZWxlY3RlZEFzc29jaWF0aW9uLnNldERpcmVjdGlvbmFsaXR5KGRpcik7Ci0JCX0gZWxzZSB7Ci0JCQlzZWxlY3RlZEFzc29jaWF0aW9uLnNldEdlbmVyYXRlZChmYWxzZSk7Ci0JCX0KLQkJCi0JCXRoaXMuYXNzb2NpYXRpb25MaXN0LnVwZGF0ZVNlbGVjdGVkQXNzb2NpYXRpb24oKTsKLQl9CQotCQotCXByaXZhdGUgT1JNR2VuQ3VzdG9taXplciBnZXRDdXN0b21pemVyKCl7Ci0JCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgdGhpcy5nZXRXaXphcmQoKTsKLQkJcmV0dXJuIHdpemFyZC5nZXRDdXN0b21pemVyKCk7Ci0JfQotCQotCQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgCi0gICAgewotICAgICAgICB0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7Ci0gICAgfQotICAgIAotCXByb3RlY3RlZCBmaW5hbCBJV29ya2JlbmNoSGVscFN5c3RlbSBnZXRIZWxwU3lzdGVtKCkgewotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vd2hlbiB0aGUgSlBBIHByb2plY3Qgd2l6YXJkIHBhZ2UgaXMgc2hvd24gZmlyc3QsIHRoZSBvdGhlciB3aXphcmQgcGFnZXMgYXJlIGxhemlseSBidWlsdCwgdGh1cwotCQkvL2Fzc29jaWF0aW9uTGlzdCBjYW4gYmUgbnVsbCAtIGJ1ZyAzMDc4OTQKLQkJaWYgKHRoaXMuYXNzb2NpYXRpb25MaXN0ICE9IG51bGwpIHsKLQkJCXRoaXMuYXNzb2NpYXRpb25MaXN0LmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUZpZ3VyZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2YxNmZhLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVGaWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5Db2xvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuRmlndXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5HcmFwaGljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kcmF3MmQuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLkxpbmVCb3JkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLlBvc2l0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRyYXcyZC5nZW9tZXRyeS5JbnNldHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci0KLS8qKgotICogQSBkcmF3MkQgZmlndXJlIHJlcHJlc2VudGluZyBhIGRhdGFiYXNlIHRhYmxlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFRhYmxlRmlndXJlIGV4dGVuZHMgRmlndXJlCi17Ci0JcHJpdmF0ZSBDb2xvciB0YWJsZUNvbG9yID0gbmV3IENvbG9yKG51bGwsIDIyMCwgMjMyLCAyNDEpOwotCi0JcHJpdmF0ZSBGb250IHRhYmxlRm9udCA9IG5ldyBGb250KG51bGwsICJBcmlhbCIsIDgsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBDb2xvciBib3JkZXJDb2xvciA9IG5ldyBDb2xvcihudWxsLCAxNCwgNjYsIDExNSk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRMSU5FX0NPUk5FUl9SQURJVVMgPSA2OwotCi0JcHJvdGVjdGVkIGZpbmFsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXI7Ci0KLQlwdWJsaWMgVGFibGVGaWd1cmUoU3RyaW5nIG5hbWUsIFJlc291cmNlTWFuYWdlciByZXNvdXJjZU1hbmFnZXIpIHsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7Ci0JCUdyaWRMYXlvdXQgZ2wgPSBuZXcgR3JpZExheW91dCgpOwotCQlnbC5tYXJnaW5IZWlnaHQgPSAyOwotCQlnbC5tYXJnaW5XaWR0aCA9IDEwOwotCQlzZXRMYXlvdXRNYW5hZ2VyKGdsKTsKLQkJc2V0Qm9yZGVyKG5ldyBMaW5lQm9yZGVyKHRoaXMudGFibGVDb2xvciwgMCkpOwotCQlzZXRCYWNrZ3JvdW5kQ29sb3IodGhpcy50YWJsZUNvbG9yKTsKLQkJc2V0T3BhcXVlKHRydWUpOwotCQlzZXRTaXplKDE1MCwgMjApOwotCQlMYWJlbCBuYW1lTGFiZWwgPSBuZXcgTGFiZWwoIiIsIEltYWdlUmVwb3NpdG9yeS5nZXRUYWJsZU9iakltYWdlKHRoaXMucmVzb3VyY2VNYW5hZ2VyKSk7Ci0JCW5hbWVMYWJlbC5zZXRGb250KHRoaXMudGFibGVGb250KTsKLQkJbmFtZUxhYmVsLnNldFRleHQobmFtZSk7Ci0JCW5hbWVMYWJlbC5zZXRGb3JlZ3JvdW5kQ29sb3IodGhpcy5ib3JkZXJDb2xvcik7Ci0JCW5hbWVMYWJlbC5zZXRMYWJlbEFsaWdubWVudChQb3NpdGlvbkNvbnN0YW50cy5DRU5URVIpOwotCQlhZGQobmFtZUxhYmVsKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwYWludENsaWVudEFyZWEoR3JhcGhpY3MgZ3JhcGhpY3MpIHsKLQkJc3VwZXIucGFpbnRDbGllbnRBcmVhKGdyYXBoaWNzKTsKLQkJZ3JhcGhpY3MucHVzaFN0YXRlKCk7Ci0JCVJlY3RhbmdsZSByID0gZ2V0Qm91bmRzKCkuZ2V0Q29weSgpOwotCQlncmFwaGljcy5kcmF3Um91bmRSZWN0YW5nbGUoci5leHBhbmQobmV3IEluc2V0cygtMSwgLTEsIC0yLCAtMikpLCBPVVRMSU5FX0NPUk5FUl9SQURJVVMsIE9VVExJTkVfQ09STkVSX1JBRElVUyk7Ci0JCWdyYXBoaWNzLnBvcFN0YXRlKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJc3VwZXIuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWYgKGVuYWJsZWQpIHsKLQkJCXNldEJhY2tncm91bmRDb2xvcih0aGlzLnRhYmxlQ29sb3IpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0QmFja2dyb3VuZENvbG9yKENvbG9yQ29uc3RhbnRzLndoaXRlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXRoaXMuYm9yZGVyQ29sb3IuZGlzcG9zZSgpOwotCQl0aGlzLnRhYmxlRm9udC5kaXNwb3NlKCk7Ci0JCXRoaXMudGFibGVDb2xvci5kaXNwb3NlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVHZW5QYW5lbC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUdlblBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNmU3MmIuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZUdlblBhbmVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZ2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuUm93TGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotCi0vKioKLSAqIFRoZSBVSSBwYW5lbCBmb3Igc2V0dGluZyB0aGUgZGVmYXVsdCBhbmQgc3BlY2lmaWMgCi0gKiB0YWJsZSBlbnRpdHkgZ2VuZXJhdGlvbiBwcm9wZXJ0aWVzLgotICogCi0gKi8KLWNsYXNzIFRhYmxlR2VuUGFuZWwKLXsKLQlXaXphcmRQYWdlIHdpemFyZFBhZ2UgOyAKLQkKLQlwcml2YXRlIFRleHQgY2xhc3NOYW1lRmllbGQ7IC8vIHVzZWQgaW4gc2V0dGluZyBpbmRpdmlkdWFsIHRhYmxlL2VudGl0eSBnZW5lcmF0aW9uIG9ubHkKLQkKLQlwcml2YXRlIENvbWJvIGlkR2VuZXJhdG9yQ29tYm87Ci0JcHJpdmF0ZSBUZXh0IHNlcXVlbmNlTmFtZUZpZWxkOwotCQotCXByaXZhdGUgQnV0dG9uIGVudGl0eUFjY2Vzc0ZpZWxkOwotCXByaXZhdGUgQnV0dG9uIGVudGl0eUFjY2Vzc1Byb3BlcnR5OwotCXByaXZhdGUgQnV0dG9uIGFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0OwotCXByaXZhdGUgQnV0dG9uIGFzc29jaWF0aW9uRmV0Y2hFYWdlcjsKLQlwcml2YXRlIEJ1dHRvbiBhc3NvY2lhdGlvbkZldGNoTGF6eTsKLQkKLQlwcml2YXRlIEJ1dHRvbiBjb2xsZWN0aW9uVHlwZVNldDsKLQlwcml2YXRlIEJ1dHRvbiBjb2xsZWN0aW9uVHlwZUxpc3Q7Ci0JCi0JcHJpdmF0ZSBCdXR0b24gZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zOwotCQotCXByaXZhdGUgTGFiZWwgc2VxdWVuY2VOYW1lTm90ZUxhYmVsOyAKLQkKLQlwcml2YXRlIGJvb2xlYW4gaXNVcGRhdGluZ0NvbnRyb2xzOwotCQotCXByaXZhdGUgT1JNR2VuVGFibGUgbVRhYmxlOwotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRUYWJsZSA9IGZhbHNlOwotCQotCXB1YmxpYyBUYWJsZUdlblBhbmVsKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5zICwgYm9vbGVhbiBpc0RlZmF1bHRUYWJsZSwgV2l6YXJkUGFnZSB3aXphcmRQYWdlICAgKXsKLQkJc3VwZXIoKTsKLQkJdGhpcy53aXphcmRQYWdlID0gd2l6YXJkUGFnZTsKLQkJdGhpcy5pc0RlZmF1bHRUYWJsZSA9IGlzRGVmYXVsdFRhYmxlOwotCQljcmVhdGVUYWJsZU1hcHBpbmdQcm9wZXJ0aWVzR3JvdXAocGFyZW50LCBjb2x1bW5zKTsKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIDQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUYWJsZU1hcHBpbmdQcm9wZXJ0aWVzR3JvdXAoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtbnMpIHsKLQkJR3JvdXAgcGFyZW50ID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUgKTsKLQkJcGFyZW50LnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3RhYmxlTWFwcGluZyk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1ucywgZmFsc2UpKTsKLQkJR3JpZERhdGEgbGF5b3V0RGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJbGF5b3V0RGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlsYXlvdXREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbGF5b3V0RGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IGZhbHNlOwotCQlwYXJlbnQuc2V0TGF5b3V0RGF0YShsYXlvdXREYXRhKTsKLQkJCi0JCWNyZWF0ZUNsYXNzTmFtZUNvbnRyb2wocGFyZW50LCBjb2x1bW5zKTsKLQkJCi0JCWNyZWF0ZUlkR2VuZXJhdG9yQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJY3JlYXRlRW50aXR5QWNjZXNzQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJCi0JCS8vQXNzb2NpYXRpb25GZXRjaCBhbmQgQ29sbGVjdGlvblR5cGUgb25seSBhdmFpbGFibGUgZm9yIGRlZmF1bHQgdGFibGUgZ2VuZXJhdGlvbgotCQlpZiAoIGlzRGVmYXVsdFRhYmxlICkgewotCQkJY3JlYXRlQXNzb2NpYXRpb25GZXRjaENvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCQljcmVhdGVDb2xsZWN0aW9uVHlwZUNvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCQljcmVhdGVHZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbkNvbnRyb2xzKHBhcmVudCwgY29sdW1ucyk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9uQ29udHJvbHMoR3JvdXAgcGFyZW50LCBpbnQgY29sdW1ucykgewotCQlnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMgPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLICk7Ci0JCWdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9ucy5zZXRUZXh0KCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9nZW5PcHRpb25hbEFubm90YXRpb25zKTsKLQkJZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zLnNldFRvb2xUaXBUZXh0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2dlbk9wdGlvbmFsQW5ub3RhdGlvbnNfZGVzYyk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5zOwotCQlnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWdlbmVyYXRlT3B0aW9uYWxBbm5vdGF0aW9ucy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBnZW5lcmF0ZU9wdGlvbmFsQW5ub3RhdGlvbnMuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJbVRhYmxlLnNldEdlbmVyYXRlRERMQW5ub3RhdGlvbnMoc2VsZWN0ZWQpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ2xhc3NOYW1lQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgewotCQkvL0N1c3RvbWl6ZSBjbGFzcyBuYW1lIGZvciBzcGVjaWZpYyB0YWJsZSBvbmx5Ci0JCWlmICggIWlzRGVmYXVsdFRhYmxlICkgewotCQkJU1dUVXRpbC5jcmVhdGVMYWJlbCggcGFyZW50LCAxICwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlUGFuZWxfY2xhc3NOYW1lICk7Ci0JCQkKLQkJCWNsYXNzTmFtZUZpZWxkID0gbmV3IFRleHQocGFyZW50LCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUiApOwotCQkJLy9tUGFja2FnZU5hbWVGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCQlTV1RVdGlsLmZpbGxDb2x1bW5zKGNsYXNzTmFtZUZpZWxkLDMpOwotCQkJY2xhc3NOYW1lRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCl7Ci0JCQkJQFN1cHByZXNzV2FybmluZ3MoeyAgImRlcHJlY2F0aW9uIiB9KQotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlpZiAoZS5nZXRTb3VyY2UoKSA9PSBudWxsIHx8ICFpc1VwZGF0aW5nQ29udHJvbHMpIHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBjbGFzc05hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUphdmFUeXBlTmFtZSggY2xhc3NOYW1lICk7Ci0JCQkJCQlpZiggIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpICl7Ci0JCQkJCQkJbVRhYmxlLnNldENsYXNzTmFtZSggIGNsYXNzTmFtZSApOwotCQkJCQkJCXdpemFyZFBhZ2Uuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJd2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkJCi0JCQl9KTsKLQkJfQotCX0KLQkKLQljbGFzcyBBc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lcnsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWlmICghaXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJQnV0dG9uIHJhZGlvQnRuID0gKEJ1dHRvbillLmdldFNvdXJjZSgpOwotCQkJCW1UYWJsZS5zZXREZWZhdWx0RmV0Y2goIHJhZGlvQnRuLmdldERhdGEoKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVBc3NvY2lhdGlvbkZldGNoQ29udHJvbHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IGNvbHVtbnMpIHsKLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChjb21wb3NpdGUsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX2ZldGNoICk7Ci0JCQotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IFJvd0xheW91dCgpKTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyggcGFyZW50ICwgMyk7Ci0JCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0CT0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8gKTsKLQkJYXNzb2NpYXRpb25GZXRjaERlZmF1bHQuc2V0VGV4dCggIkRlZmF1bHQiKTsKLQkJYXNzb2NpYXRpb25GZXRjaERlZmF1bHQuc2V0RGF0YSggT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSCApOwkKLQkJCi0JCWFzc29jaWF0aW9uRmV0Y2hFYWdlciA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7Ci0JCWFzc29jaWF0aW9uRmV0Y2hFYWdlci5zZXRUZXh0KCAiJkVhZ2VyIik7Ci0JCWFzc29jaWF0aW9uRmV0Y2hFYWdlci5zZXREYXRhKCBPUk1HZW5UYWJsZS5FQUdFUl9GRVRDSCApOwotCi0JCWFzc29jaWF0aW9uRmV0Y2hMYXp5ID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8gKTsKLQkJYXNzb2NpYXRpb25GZXRjaExhenkuc2V0VGV4dCggIkxhJnp5Iik7Ci0JCWFzc29jaWF0aW9uRmV0Y2hMYXp5LnNldERhdGEoIE9STUdlblRhYmxlLkxBWllfRkVUQ0ggKTsKLQkJCi0JCUFzc29jaWF0aW9uRmV0Y2hMaXN0ZW5lciBhc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgPSBuZXcgQXNzb2NpYXRpb25GZXRjaExpc3RlbmVyKCk7Ci0JCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBhc3NvY2lhdGlvbkZldGNoTGlzdGVuZXIgKTsKLQkJYXNzb2NpYXRpb25GZXRjaExhenkuYWRkU2VsZWN0aW9uTGlzdGVuZXIoIGFzc29jaWF0aW9uRmV0Y2hMaXN0ZW5lciApOwotCQlhc3NvY2lhdGlvbkZldGNoRWFnZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIoIGFzc29jaWF0aW9uRmV0Y2hMaXN0ZW5lciApOwotCX0KLQotCWNsYXNzIENvbGxlY3Rpb25UeXBlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoIWlzVXBkYXRpbmdDb250cm9scykgewotCQkJCUJ1dHRvbiByYWRpb0J0biA9IChCdXR0b24pZS5nZXRTb3VyY2UoKTsKLQkJCQltVGFibGUuc2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCByYWRpb0J0bi5nZXREYXRhKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2xsZWN0aW9uVHlwZUNvbnRyb2xzKENvbXBvc2l0ZSBjb21wb3NpdGUsIGludCBjb2x1bW5zKSB7Ci0JCVNXVFV0aWwuY3JlYXRlTGFiZWwoY29tcG9zaXRlLCAxLCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfZGVmYXVsdFRhYmxlUGFnZV9jb2xsVHlwZSApOwotCQkKLQkJQ29tcG9zaXRlIHBhcmVudCA9IG5ldyBDb21wb3NpdGUoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMoIHBhcmVudCAsIDMpOwotCQkKLQkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldCA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPKTsKLQkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldC5zZXRUZXh0KCAiamF2YS51dGlsLlNlJnQiKTsKLQkJdGhpcy5jb2xsZWN0aW9uVHlwZVNldC5zZXREYXRhKCBPUk1HZW5UYWJsZS5TRVRfQ09MTEVDVElPTl9UWVBFICk7Ci0JCXRoaXMuY29sbGVjdGlvblR5cGVMaXN0ID0gbmV3IEJ1dHRvbiggcGFyZW50LCBTV1QuUkFESU8pOwotCQl0aGlzLmNvbGxlY3Rpb25UeXBlTGlzdC5zZXRUZXh0KCJqYXZhLnV0aWwuJkxpc3QiKTsKLQkJdGhpcy5jb2xsZWN0aW9uVHlwZUxpc3Quc2V0RGF0YShPUk1HZW5UYWJsZS5MSVNUX0NPTExFQ1RJT05fVFlQRSk7IAotCQkKLQkJQ29sbGVjdGlvblR5cGVMaXN0ZW5lciBjb2xsZWN0aW9uVHlwZUxpc3RlbmVyID0gbmV3IENvbGxlY3Rpb25UeXBlTGlzdGVuZXIoKTsKLQkJY29sbGVjdGlvblR5cGVMaXN0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBjb2xsZWN0aW9uVHlwZUxpc3RlbmVyICk7Ci0JCWNvbGxlY3Rpb25UeXBlU2V0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBjb2xsZWN0aW9uVHlwZUxpc3RlbmVyICk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRPUk1HZW5UYWJsZShPUk1HZW5UYWJsZSB0YWJsZSkgewotCQltVGFibGUgPSB0YWJsZTsKLQkJCi0JCWlzVXBkYXRpbmdDb250cm9scyA9IHRydWU7Ci0JCQkJCi0JCXRyeSB7Ci0JCQkvL0NsYXNzTmFtZUZpZWxkIGlzIG5vdCBhdmFpbGFibGUgZm9yIGRlZmF1bHQgdGFibGUKLQkJCWlmKGNsYXNzTmFtZUZpZWxkIT0gbnVsbCApCi0JCQkJY2xhc3NOYW1lRmllbGQuc2V0VGV4dCggbVRhYmxlLmdldENsYXNzTmFtZSgpICk7Ci0JCQkKLQkJCWZpbmFsIExpc3Q8U3RyaW5nPiBzY2hlbWVzID0gdGhpcy5tVGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEFsbElkR2VuZXJhdG9ycygpOwotCQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tzY2hlbWVzLnNpemUoKV07Ci0JCQlzY2hlbWVzLnRvQXJyYXkodmFsdWVzKTsKLQkJCWlkR2VuZXJhdG9yQ29tYm8uc2V0SXRlbXMoIHZhbHVlcyApOwotCQkJU3RyaW5nIGlkR2VuZXJhdG9yID0gbVRhYmxlLmdldElkR2VuZXJhdG9yKCk7Ci0JCQlpZEdlbmVyYXRvckNvbWJvLnNldFRleHQoIGlkR2VuZXJhdG9yKTsKLQkJCQotCQkJYm9vbGVhbiBpc1NlcXVlbmNlID0gdGhpcy5tVGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNlcXVlbmNlSWRHZW5lcmF0b3JzKCkuY29udGFpbnMoaWRHZW5lcmF0b3IpOwkJCi0JCQlTdHJpbmcgc2VxdWVuY2VOYW1lID0gbVRhYmxlLmlzRGVmYXVsdHNUYWJsZSgpID8gbVRhYmxlLmdldFNlcXVlbmNlKCkgOiBtVGFibGUuZ2V0Rm9ybWF0dGVkU2VxdWVuY2UoKTsKLQkJCXNlcXVlbmNlTmFtZSAgPSAoIHNlcXVlbmNlTmFtZSA9PSBudWxsID8gIiIgOiBzZXF1ZW5jZU5hbWUgKTsgCi0JCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRUZXh0KCBzZXF1ZW5jZU5hbWUgKTsKLQkJCWlmICggaXNTZXF1ZW5jZSApIHsKLQkJCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRFbmFibGVkKHRydWUpOwotCQkJCXNlcXVlbmNlTmFtZU5vdGVMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlzZXF1ZW5jZU5hbWVOb3RlTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl9Ci0JCQkKLQkJCVN0cmluZyBhY2Nlc3MgPSBtVGFibGUuZ2V0QWNjZXNzKCkgOwotCQkJaWYgKCAgT1JNR2VuVGFibGUuRklFTERfQUNDRVNTLmVxdWFscyggYWNjZXNzICkgKSB7Ci0JCQkJdGhpcy5lbnRpdHlBY2Nlc3NGaWVsZC5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCQl0aGlzLmVudGl0eUFjY2Vzc1Byb3BlcnR5LnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5lbnRpdHlBY2Nlc3NQcm9wZXJ0eS5zZXRTZWxlY3Rpb24oIHRydWUgKTsKLQkJCQl0aGlzLmVudGl0eUFjY2Vzc0ZpZWxkLnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLQkJCX0KLQkKLQkJCWlmIChhc3NvY2lhdGlvbkZldGNoTGF6eSAhPSBudWxsICYmIGFzc29jaWF0aW9uRmV0Y2hFYWdlciAhPSBudWxsICkgewotCQkJCVN0cmluZyBkZWZhdWx0RmV0Y2ggPSBtVGFibGUuZ2V0RGVmYXVsdEZldGNoKCk7Ci0JCQkJLy9yZXNldCBhbGwgdGhyZWUgYnV0dG9ucwotCQkJCWFzc29jaWF0aW9uRmV0Y2hEZWZhdWx0LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJYXNzb2NpYXRpb25GZXRjaEVhZ2VyLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJYXNzb2NpYXRpb25GZXRjaExhenkuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlpZiggT1JNR2VuVGFibGUuREVGQVVMVF9GRVRDSC5lcXVhbHMoIGRlZmF1bHRGZXRjaCApICkKLQkJCQkJYXNzb2NpYXRpb25GZXRjaERlZmF1bHQuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWVsc2UgaWYoIE9STUdlblRhYmxlLkVBR0VSX0ZFVENILmVxdWFscyggZGVmYXVsdEZldGNoICkgKQotCQkJCQlhc3NvY2lhdGlvbkZldGNoRWFnZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJCWVsc2UKLQkJCQkJYXNzb2NpYXRpb25GZXRjaExhenkuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfQotCQkJCi0JCQkvL0RlZmF1bHRUYWJsZSBvbmx5Ci0JCQlpZiAoY29sbGVjdGlvblR5cGVMaXN0ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgY1R5cGUgPSBtVGFibGUuZ2V0RGVmYXVsdENvbGxlY3Rpb25UeXBlKCk7Ci0JCQkJaWYgKCBPUk1HZW5UYWJsZS5MSVNUX0NPTExFQ1RJT05fVFlQRS5lcXVhbHMoIGNUeXBlICkgKSB7Ci0JCQkJCXRoaXMuY29sbGVjdGlvblR5cGVMaXN0LnNldFNlbGVjdGlvbiggdHJ1ZSApOwotCQkJCQl0aGlzLmNvbGxlY3Rpb25UeXBlU2V0LnNldFNlbGVjdGlvbiggZmFsc2UgKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aGlzLmNvbGxlY3Rpb25UeXBlU2V0LnNldFNlbGVjdGlvbiggdHJ1ZSApOwotCQkJCQl0aGlzLmNvbGxlY3Rpb25UeXBlTGlzdC5zZXRTZWxlY3Rpb24oIGZhbHNlICk7Ci0JCQkJfQotCQkJCQotCQkJCXRoaXMuZ2VuZXJhdGVPcHRpb25hbEFubm90YXRpb25zLnNldFNlbGVjdGlvbiggbVRhYmxlLmlzR2VuZXJhdGVERExBbm5vdGF0aW9ucygpKTsKLQkJCX0KLQkJCQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOwotCQl9Ci0JCQotCQlpc1VwZGF0aW5nQ29udHJvbHMgPSBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSWRHZW5lcmF0b3JDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgewotCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKHBhcmVudCwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfa2V5R2VuICk7Ci0KLQkJaWRHZW5lcmF0b3JDb21ibyA9IG5ldyBDb21ibyhwYXJlbnQsU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKGlkR2VuZXJhdG9yQ29tYm8sIDMpOwotCQkKLQkJaWRHZW5lcmF0b3JDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lciggbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpZiAoaXNVcGRhdGluZ0NvbnRyb2xzKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJCi0JCQkJaWRHZW5DaGFuZ2VkKCk7Ci0JCQl9fSk7Ci0KLQkJU1dUVXRpbC5jcmVhdGVMYWJlbChwYXJlbnQsIDEsIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF9kZWZhdWx0VGFibGVQYWdlX3NlcXVlbmNlICk7Ci0JCXNlcXVlbmNlTmFtZUZpZWxkID0gbmV3IFRleHQoIHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIgKTsKLQkJCi0JCVNXVFV0aWwuZmlsbENvbHVtbnMoc2VxdWVuY2VOYW1lRmllbGQsIDMpOwotCQlzZXF1ZW5jZU5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKXsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChlLmdldFNvdXJjZSgpID09IG51bGwgfHwgIWlzVXBkYXRpbmdDb250cm9scykgewotCi0JCQkJCWlmICggaWRHZW5lcmF0b3JDb21iby5nZXRUZXh0KCkuZXF1YWxzKCJzZXF1ZW5jZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN0cmluZyBzZXF1ZW5jZU5hbWUgPSBzZXF1ZW5jZU5hbWVGaWVsZC5nZXRUZXh0KCk7Ci0JCQkJCQlpZiAoIHNlcXVlbmNlTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIiR0YWJsZSIpID49IDAgfHwgIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJc2VxdWVuY2VOYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigiJHBrIikgPj0gMCApIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXNlcXVlbmNlTmFtZSA9IGNvbnZlcnRWYXJUb0xvd2VyQ2FzZSgiJHRhYmxlIiwgc2VxdWVuY2VOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXNlcXVlbmNlTmFtZSA9IGNvbnZlcnRWYXJUb0xvd2VyQ2FzZSgiJHBrIiwgc2VxdWVuY2VOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKCBzZXF1ZW5jZU5hbWUudHJpbSgpLmxlbmd0aCgpICE9IDAgKSB7Ci0JCQkJCQkJbVRhYmxlLnNldFNlcXVlbmNlKCBzZXF1ZW5jZU5hbWUgKTsKLQkJCQkJCX0gZWxzZXsKLQkJCQkJCQltVGFibGUuc2V0U2VxdWVuY2UoICIiICk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJcHJpdmF0ZSBTdHJpbmcgY29udmVydFZhclRvTG93ZXJDYXNlKFN0cmluZyB2YXIsIFN0cmluZyBzZXF1ZW5jZU5hbWUpIHsKLQkJCQlpbnQgbiA9IHNlcXVlbmNlTmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIHZhciApOwotCQkJCWlmKCBuPT0wICkgewotCQkJCQlyZXR1cm4gdmFyICsgc2VxdWVuY2VOYW1lLnN1YnN0cmluZyggdmFyLmxlbmd0aCgpKTsKLQkJCQl9IGVsc2UgaWYoIG4gPjAgKSB7Ci0JCQkJCXJldHVybiBzZXF1ZW5jZU5hbWUuc3Vic3RyaW5nKDAsbikgKyB2YXIgKyBzZXF1ZW5jZU5hbWUuc3Vic3RyaW5nKCBuICsgdmFyLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlcXVlbmNlTmFtZTsKLQkJCX0JCQkKLQkJfSk7Ci0JCQotCQlTV1RVdGlsLm5ld0xhYmVsKHBhcmVudCwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlTdHJpbmcgdGV4dCA9U3RyaW5nLmZvcm1hdCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2Vfc2VxdWVuY2VOb3RlLCAKLQkJCQlPUk1HZW5UYWJsZS5UQUJMRV9TRVFfUEFUVEVSTiwgT1JNR2VuVGFibGUuUEtfU0VRX1BBVFRFUk4pOwotCQlzZXF1ZW5jZU5hbWVOb3RlTGFiZWwuc2V0VGV4dCggdGV4dCApIDsKLQkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKCBzZXF1ZW5jZU5hbWVOb3RlTGFiZWwsIDMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpZEdlbkNoYW5nZWQoKSB7Ci0JCVN0cmluZyBzY2hlbWUgPSBpZEdlbmVyYXRvckNvbWJvLmdldFRleHQoKTsKLQkJbVRhYmxlLnNldElkR2VuZXJhdG9yKHNjaGVtZSk7Ci0JCQotCQlib29sZWFuIGlzU2VxdWVuY2UgPSB0aGlzLm1UYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U2VxdWVuY2VJZEdlbmVyYXRvcnMoKS5jb250YWlucyhzY2hlbWUpOwkJCi0JCWlmICghaXNTZXF1ZW5jZSkgewotCQkJc2VxdWVuY2VOYW1lRmllbGQuc2V0VGV4dCgiIik7Ci0JCQlzZXF1ZW5jZU5hbWVGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCW1UYWJsZS5zZXRTZXF1ZW5jZShudWxsKTsKLQkJCXNlcXVlbmNlTmFtZU5vdGVMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCXNlcXVlbmNlTmFtZUZpZWxkLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlDb2xvciBOT1RFX0xBQkVMX0NPTE9SID0gbmV3IENvbG9yKCBEaXNwbGF5LmdldERlZmF1bHQoKSwgMTAyLDEwMiwxMDIpOwotCQkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsLnNldEZvcmVncm91bmQoIE5PVEVfTEFCRUxfQ09MT1IgKTsKLQkJCU5PVEVfTEFCRUxfQ09MT1IuZGlzcG9zZSgpOwotCQkJc2VxdWVuY2VOYW1lTm90ZUxhYmVsLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlpZiAoIHNlcXVlbmNlTmFtZUZpZWxkLmdldFRleHQoKS5sZW5ndGgoKT09MCApIHsKLQkJCQlTdHJpbmcgbmV3TWVzc2FnZSA9ICJQbGVhc2Ugc3BlY2lmeSBhIHNlcXVlbmNlIG5hbWUiOwotCQkJCXRoaXMud2l6YXJkUGFnZS5zZXRNZXNzYWdlKG5ld01lc3NhZ2UpOwotCQkJCXRoaXMud2l6YXJkUGFnZS5zZXRQYWdlQ29tcGxldGUodHJ1ZSk7Ci0JCQl9IGVsc2UgewotCQkJCXRoaXMud2l6YXJkUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJdGhpcy53aXphcmRQYWdlLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQkKLQljbGFzcyBFbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXJ7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpZiAoIWlzVXBkYXRpbmdDb250cm9scykgewotCQkJCUJ1dHRvbiByYWRpb0J0biA9IChCdXR0b24pZS5nZXRTb3VyY2UoKTsKLQkJCQltVGFibGUuc2V0QWNjZXNzKCByYWRpb0J0bi5nZXREYXRhKCkudG9TdHJpbmcoKSApOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbnRpdHlBY2Nlc3NDb250cm9scyhDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQlTV1RVdGlsLmNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgMSwgSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfYWNjZXNzICk7Ci0JCQotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZSggY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMoIHBhcmVudCAsIDMpOwotCQlwYXJlbnQuc2V0TGF5b3V0KG5ldyBSb3dMYXlvdXQoKSk7Ci0KLQkJZW50aXR5QWNjZXNzRmllbGQgPSBuZXcgQnV0dG9uKCBwYXJlbnQsIFNXVC5SQURJTyApOwotCQllbnRpdHlBY2Nlc3NGaWVsZC5zZXRUZXh0KCAiJkZpZWxkIiApOyAvLyROT04tTkxTMSQKLQkJZW50aXR5QWNjZXNzRmllbGQuc2V0RGF0YSggT1JNR2VuVGFibGUuRklFTERfQUNDRVNTKTsKLQotCQllbnRpdHlBY2Nlc3NQcm9wZXJ0eSA9IG5ldyBCdXR0b24oIHBhcmVudCwgU1dULlJBRElPICk7Ci0JCWVudGl0eUFjY2Vzc1Byb3BlcnR5LnNldFRleHQoICAiJlByb3BlcnR5IiApOy8vJE5PTi1OTFMxJAotCQllbnRpdHlBY2Nlc3NQcm9wZXJ0eS5zZXREYXRhKCBPUk1HZW5UYWJsZS5QUk9QRVJUWV9BQ0NFU1MgKTsKLQkJCi0JCUVudGl0eUFjY2Vzc0ZldGNoTGlzdGVuZXIgZW50aXR5QWNjZXNzRmV0Y2hMaXN0ZW5lciA9IG5ldyBFbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyKCk7Ci0JCWVudGl0eUFjY2Vzc0ZpZWxkLmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBlbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyICk7Ci0JCWVudGl0eUFjY2Vzc1Byb3BlcnR5LmFkZFNlbGVjdGlvbkxpc3RlbmVyKCBlbnRpdHlBY2Nlc3NGZXRjaExpc3RlbmVyICk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9nZW4vVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyZmM2MDguLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLmdlbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLndpemFyZHMuZGlhbG9nZmllbGRzLkxheW91dFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3VHlwZVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlJlc291cmNlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLmludGVybmFsLk9STUdlbkN1c3RvbWl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5JbWFnZVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3RhY2tMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi1wdWJsaWMgY2xhc3MgVGFibGVzQW5kQ29sdW1uc0N1c3RvbWl6YXRpb25XaXphcmRQYWdlIGV4dGVuZHMgTmV3VHlwZVdpemFyZFBhZ2UgewotCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwcml2YXRlIFRyZWVWaWV3ZXIgdGFibGVDb2x1bW5UcmVlVmlld2VyOwotCQotCXByaXZhdGUgQ29tcG9zaXRlIGRldGFpbFBhbmVsIDsKLQlwcml2YXRlIFN0YWNrTGF5b3V0IGRldGFpbFBhbmVsU3RhdGNrTGF5b3V0OwotCXByaXZhdGUgQ29tcG9zaXRlIHRhYmxlR2VuRGV0YXRpbEdyb3VwOwotCXByaXZhdGUgQ29sdW1uR2VuUGFuZWwgY29sdW1uR2VuUGFuZWw7Ci0JcHJpdmF0ZSBDb21wb3NpdGUgY29sdW1uR2VuRGV0YXRpbEdyb3VwOwotCXByaXZhdGUgVGFibGVHZW5QYW5lbCB0YWJsZUdlblBhbmVsOwotCXByaXZhdGUgT1JNR2VuVGFibGUgc2VsZWN0ZWRUYWJsZTsKLQkKLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCQotCXByb3RlY3RlZCBUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXN1cGVyKHRydWUsICJUYWJsZXNBbmRDb2x1bW5zQ3VzdG9taXphdGlvbldpemFyZFBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmpwYVByb2plY3QgPSBqcGFQcm9qZWN0OwotCQl0aGlzLnJlc291cmNlTWFuYWdlciA9IHJlc291cmNlTWFuYWdlcjsKLQkJc2V0VGl0bGUoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV90aXRsZSApOwotCQlzZXRNZXNzYWdlKCBKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVzQW5kQ29sdW1uc1BhZ2VfZGVzYyk7Ci0JfQotCi0JLy8gLS0tLS0tLS0gSW5pdGlhbGl6YXRpb24gLS0tLS0tLS0tCi0JLyoqCi0JICogVGhlIHdpemFyZCBvd25pbmcgdGhpcyBwYWdlIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpdGggdGhlCi0JICogY3VycmVudCBzZWxlY3Rpb24uIFRoZSBzZWxlY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMgb2YgdGhlIHdpemFyZCAKLQkgKiBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3Rpb24gdXNlZCB0byBpbml0aWFsaXplIHRoZSBmaWVsZHMKLQkgKi8KLQl2b2lkIGluaXQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmICgganBhUHJvamVjdCAhPSBudWxsICkgewotCQkJSUphdmFFbGVtZW50IGplbGVtID0gdGhpcy5qcGFQcm9qZWN0LmdldEphdmFQcm9qZWN0KCk7Ci0JCQlpbml0Q29udGFpbmVyUGFnZShqZWxlbSk7Ci0JCQlpbml0VHlwZVBhZ2UoamVsZW0pOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlpbml0aWFsaXplRGlhbG9nVW5pdHMocGFyZW50KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCWludCBuQ29sdW1ucz0gMQk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX0NVU1RPTUlaRV9JTkRJVklEVUFMX0VOVElUSUVTKTsKLQotCQljcmVhdGVUYWJsZUFuZENvbHVtbnNMaXN0UGFuZWwoY29tcG9zaXRlLCAxKTsKLQkJCi0JCVNXVFV0aWwuY3JlYXRlTGFiZWwoIGNvbXBvc2l0ZSwgMSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJU1dUVXRpbC5jcmVhdGVTZXBhcmF0b3IoY29tcG9zaXRlLCAxKTsKLQkJCi0JCWNyZWF0ZUdlbmVyYXRlRGV0YWlsR3JvdXAoY29tcG9zaXRlLCAxKTsKLQotCQlzZXRDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKCB0cnVlICk7Ci0JfQotCQotCS8qKgotCSAqIEEgcGFuZWwgd2l0aCBKRmFjZSBUcmVlVmlld2VyIHNob3dpbmcgdGFibGVzIGFuZCBjb2x1bW5zIHRvIGJlIGdlbmVyYXRlZCBpbnRvIEpQQSBlbnRpdGllcwotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gY29sdW1ucwotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVUYWJsZUFuZENvbHVtbnNMaXN0UGFuZWwoQ29tcG9zaXRlIHBhcmVudCwgaW50IGNvbHVtbnMpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBjb2x1bW5zICk7Ci0JCWxhYmVsLnNldFRleHQoIEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZXNBbmRDb2x1bW5zUGFnZV9sYWJlbFRhYmxlQW5kQ29sdW1ucyApOwotCQlTV1RVdGlsLmZpbGxDb2x1bW5zKCBsYWJlbCAsIGNvbHVtbnMpOwotCQkKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uczsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gMjAwOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJCi0JCXRhYmxlQ29sdW1uVHJlZVZpZXdlciA9IG5ldyBUcmVlVmlld2VyKHBhcmVudCk7Ci0JCXRhYmxlQ29sdW1uVHJlZVZpZXdlci5nZXRUcmVlKCkuc2V0TGF5b3V0RGF0YSggZGF0YSk7CQkKLQkJdGFibGVDb2x1bW5UcmVlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGFibGVDb2x1bW5UcmVlQ29udGVudFByb3ZpZGVyKCkpOwotCQl0YWJsZUNvbHVtblRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgVGFibGVDb2x1bW5UcmVlTGFiZWxQcm92aWRlcigpKTsKLQkJCi0JCXRhYmxlQ29sdW1uVHJlZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoIG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCl7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXVwZGF0ZURldGFpbFBhbmVsKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZih2aXNpYmxlKXsKLQkJCU9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplciA9IGdldEN1c3RvbWl6ZXIoKTsKLQkJCS8vSWYgdXNlciBjaGFuZ2VkIHRoZSBjb25uZWN0aW9uIG9yIHNjaGVtYQotCQkJaWYoIHRoaXMuY3VzdG9taXplciAhPSBjdXN0b21pemVyICl7Ci0JCQkJdGhpcy5jdXN0b21pemVyID0gY3VzdG9taXplcjsgCi0JCQkJdGFibGVDb2x1bW5UcmVlVmlld2VyLnNldElucHV0KCBjdXN0b21pemVyICk7Ci0JCQl9ZWxzZXsKLQkJCQl0YWJsZUNvbHVtblRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJfQotCQkJTGlzdDxTdHJpbmc+IHRhYmxlTmFtZXMgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0VGFibGVOYW1lcygpOwotCQkJCi0JCQkvL1NlbGVjdCB0aGUgZmlyc3QgdGFibGUKLQkJCU9STUdlblRhYmxlIG9ybUdlblRhYmxlID0gdGhpcy5jdXN0b21pemVyLmdldFRhYmxlKHRhYmxlTmFtZXMuZ2V0KDApKTsKLQkJCXVwZGF0ZVRhYmVsR2VuRGV0YWlsKCBvcm1HZW5UYWJsZSApOwotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGV0YWlsUGFuZWwoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJVHJlZVNlbGVjdGlvbiB0cyA9IChUcmVlU2VsZWN0aW9uKXNlbGVjdGlvbjsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gdHMuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmKCBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE9STUdlblRhYmxlICl7Ci0JCQl1cGRhdGVUYWJlbEdlbkRldGFpbCggKE9STUdlblRhYmxlKXNlbGVjdGVkT2JqZWN0ICk7Ci0JCX1lbHNlIGlmKCBzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE9STUdlbkNvbHVtbiApewotCQkJdXBkYXRlQ29sdW1uR2VuRGV0YWlsKCAoT1JNR2VuQ29sdW1uKXNlbGVjdGVkT2JqZWN0ICk7Ci0JCX0KLQl9CQkJCi0JCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbHVtbkdlbkRldGFpbChPUk1HZW5Db2x1bW4gY29sdW1uKSB7Ci0JCWlmKGNvbHVtbkdlbkRldGF0aWxHcm91cD09bnVsbCl7Ci0JCQljb2x1bW5HZW5EZXRhdGlsR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGRldGFpbFBhbmVsLCBTV1QuTk9ORSk7Ci0JCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJZ3JpZExheW91dC5udW1Db2x1bW5zID0gNDsKLQkJCWNvbHVtbkdlbkRldGF0aWxHcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCQl0aGlzLmNvbHVtbkdlblBhbmVsID0gbmV3IENvbHVtbkdlblBhbmVsKGNvbHVtbkdlbkRldGF0aWxHcm91cCwgNCwgZ2V0Q3VzdG9taXplcigpICwgdGhpcyApOwotCQl9Ci0JCWNvbHVtbkdlblBhbmVsLnNldENvbHVtbihjb2x1bW4pOwotCQl0aGlzLmRldGFpbFBhbmVsU3RhdGNrTGF5b3V0LnRvcENvbnRyb2wgPSBjb2x1bW5HZW5EZXRhdGlsR3JvdXA7Ci0JCXRoaXMuZGV0YWlsUGFuZWwubGF5b3V0KCk7CQkKLQkJZGV0YWlsUGFuZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVRhYmVsR2VuRGV0YWlsKE9STUdlblRhYmxlIHRhYmxlKSB7Ci0JCXRoaXMuc2VsZWN0ZWRUYWJsZSA9IHRhYmxlOwotCQlpZih0YWJsZUdlbkRldGF0aWxHcm91cD09bnVsbCl7Ci0JCQl0YWJsZUdlbkRldGF0aWxHcm91cCA9IG5ldyBDb21wb3NpdGUoZGV0YWlsUGFuZWwsIFNXVC5OT05FKTsKLQkJCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSA0OwotCQkJdGFibGVHZW5EZXRhdGlsR3JvdXAuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCQkJCi0JCQl0aGlzLnRhYmxlR2VuUGFuZWwgPSBuZXcgVGFibGVHZW5QYW5lbCh0YWJsZUdlbkRldGF0aWxHcm91cCwgNCAsIGZhbHNlLCB0aGlzICk7Ci0JCQljcmVhdGVEb21haW5KYXZhQ2xhc3Nlc1Byb3BlcnRpZXNHcm91cCh0YWJsZUdlbkRldGF0aWxHcm91cCwgNCApOwotCQl9Ci0JCXRhYmxlR2VuUGFuZWwuc2V0T1JNR2VuVGFibGUodGFibGUpOwotCQkKLQkJdGhpcy5kZXRhaWxQYW5lbFN0YXRja0xheW91dC50b3BDb250cm9sID0gdGFibGVHZW5EZXRhdGlsR3JvdXA7Ci0JCXRoaXMuZGV0YWlsUGFuZWwubGF5b3V0KCk7CQkKLQotCQlTdHJpbmcgYmFzZUNsYXNzID0gU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eSh0YWJsZS5nZXRFeHRlbmRzKCkpID8gIiIgOiB0YWJsZS5nZXRFeHRlbmRzKCk7Ci0JCXNldFN1cGVyQ2xhc3MoYmFzZUNsYXNzLCB0cnVlKTsJCQkKLQkJCi0JCQotCQlzZXRTdXBlckludGVyZmFjZXModGFibGUuZ2V0SW1wbGVtZW50cygpLCB0cnVlKTsKLQkJCi0JCWRldGFpbFBhbmVsLmdldFBhcmVudCgpLmxheW91dCgpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEb21haW5KYXZhQ2xhc3Nlc1Byb3BlcnRpZXNHcm91cChDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1ucykgewotCQlHcm91cCBwYXJlbnQgPSBuZXcgR3JvdXAoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwYXJlbnQuc2V0VGV4dCggSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX2RlZmF1bHRUYWJsZVBhZ2VfZG9tYWluSmF2YUNsYXNzICk7Ci0JCXBhcmVudC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoY29sdW1ucywgZmFsc2UpKTsKLQkJU1dUVXRpbC5maWxsQ29sdW1ucyggcGFyZW50LCBjb2x1bW5zKTsKLQotCQljcmVhdGVTdXBlckNsYXNzQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQkJY3JlYXRlU3VwZXJJbnRlcmZhY2VzQ29udHJvbHMocGFyZW50LCBjb2x1bW5zKTsKLQotCQkvL1Jlc2l6ZSBzdXBwZXIgY2xhc3MgdGV4dCB3aWR0aCB0byBmaWxsIHRoZSBwYXJlbnQgZ3JvdXAuCi0JCS8vSGF2ZSB0byBkbyBpdCBpbmRpcmVjdGx5IHNpbmNlIGZTdXBlckNsYXNzRGlhbG9nRmllbGQgaXMgcHJpdmF0ZSBpbiBzdXBlciBjbGFzcy4KLQkJQ29udHJvbFtdIGNvbnRyb2xzID0gcGFyZW50LmdldENoaWxkcmVuKCk7Ci0JCWlmKCBjb250cm9scy5sZW5ndGg+MSAmJiBjb250cm9sc1sxXSBpbnN0YW5jZW9mIFRleHQgKXsKLQkJCVRleHQgdGV4dCA9IChUZXh0KShwYXJlbnQuZ2V0Q2hpbGRyZW4oKVsxXSk7Ci0JCQlMYXlvdXRVdGlsLnNldFdpZHRoSGludCh0ZXh0LCBnZXRNYXhGaWVsZFdpZHRoKCkpOwotCQkJTGF5b3V0VXRpbC5zZXRIb3Jpem9udGFsR3JhYmJpbmcodGV4dCk7Ci0JCX0JCQotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZSNzdXBlckNsYXNzQ2hhbmdlZCgpCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElTdGF0dXMgc3VwZXJDbGFzc0NoYW5nZWQoKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gc3VwZXIuc3VwZXJDbGFzc0NoYW5nZWQoKTsKLQkJU3RyaW5nIGJhc2VDbGFzcyA9IGdldFN1cGVyQ2xhc3MoKTsKLQkJaWYoYmFzZUNsYXNzIT1udWxsICYmIHRoaXMuc2VsZWN0ZWRUYWJsZSE9bnVsbCApewotCQkJU3RyaW5nIG9sZEJhc2VDbGFzcyA9IHRoaXMuc2VsZWN0ZWRUYWJsZS5nZXRFeHRlbmRzKCk7Ci0JCQlpZiggIWJhc2VDbGFzcy5lcXVhbHMob2xkQmFzZUNsYXNzKSkKLQkJCQl0aGlzLnNlbGVjdGVkVGFibGUuc2V0RXh0ZW5kcyhiYXNlQ2xhc3MpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7IAotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkud2l6YXJkcy5OZXdUeXBlV2l6YXJkUGFnZSNzdXBlckludGVyZmFjZXNDaGFuZ2VkKCkKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVN0YXR1cyBzdXBlckludGVyZmFjZXNDaGFuZ2VkKCkgewotCQlJU3RhdHVzIHN0YXR1cyA9IHN1cGVyLnN1cGVySW50ZXJmYWNlc0NoYW5nZWQoKTsKLQkJTGlzdDxTdHJpbmc+IHN1cGVySW50ZXJmYWNlcyA9IGdldFN1cGVySW50ZXJmYWNlcygpOwotCQlpZiAodGhpcy5zZWxlY3RlZFRhYmxlICE9IG51bGwpIHsKLQkJCXRoaXMuc2VsZWN0ZWRUYWJsZS5zZXRJbXBsZW1lbnRzKHN1cGVySW50ZXJmYWNlcyk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LnVpLndpemFyZHMuTmV3VHlwZVdpemFyZFBhZ2UjYWRkU3VwZXJJbnRlcmZhY2UoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlAT3ZlcnJpZGUKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgYm9vbGVhbiBhZGRTdXBlckludGVyZmFjZShTdHJpbmcgc3VwZXJJbnRlcmZhY2UpIHsKLQkJc3VwZXIuYWRkU3VwZXJJbnRlcmZhY2Uoc3VwZXJJbnRlcmZhY2UpOwotCQlMaXN0IGludGVyZmFjZXMgPSBnZXRTdXBlckludGVyZmFjZXMoKTsKLQkJaWYodGhpcy5zZWxlY3RlZFRhYmxlIT1udWxsKQotCQkJdGhpcy5zZWxlY3RlZFRhYmxlLnNldEltcGxlbWVudHMoaW50ZXJmYWNlcyk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGaWVsZENoYW5nZWQoU3RyaW5nIGZpZWxkTmFtZSkgewotCQlzdXBlci5oYW5kbGVGaWVsZENoYW5nZWQoZmllbGROYW1lKTsKLQkJaWYoIHRoaXMuZlN1cGVyQ2xhc3NTdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSl7Ci0JCQl1cGRhdGVTdGF0dXMoZlN1cGVyQ2xhc3NTdGF0dXMpOwotCQl9ZWxzZXsKLQkJCXNldE1lc3NhZ2UoIiIsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCX0KLQkJCi0JfQkKLQkKLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgZ2V0Q3VzdG9taXplcigpewotCQlHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCB3aXphcmQgPSAoR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQpIHRoaXMuZ2V0V2l6YXJkKCk7Ci0JCXJldHVybiB3aXphcmQuZ2V0Q3VzdG9taXplcigpOwotCX0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyLCBhbmQgbGFiZWwgcHJvdmlkZXIgZm9yIHRoZSBEQiBUYWJsZS9Db2x1bW4gVHJlZVZpZXdlcgotCSAqCi0JICovCi0JY2xhc3MgVGFibGVDb2x1bW5UcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0RWxlbWVudCkgewotCQkJaWYoIGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIE9STUdlbkN1c3RvbWl6ZXIgKXsKLQkJCQlPUk1HZW5DdXN0b21pemVyIGlucHV0ID0gKE9STUdlbkN1c3RvbWl6ZXIgKWlucHV0RWxlbWVudDsKLQkJCQlMaXN0PFN0cmluZz4gdGFibGVOYW1lTGlzdCA9IGlucHV0LmdldEdlblRhYmxlTmFtZXMoKTsKLQkJCQlMaXN0PE9STUdlblRhYmxlPiByZXQgPSBuZXcgQXJyYXlMaXN0PE9STUdlblRhYmxlPigpOwotCQkJCWZvcihTdHJpbmcgdCA6IHRhYmxlTmFtZUxpc3QpewotCQkJCQlPUk1HZW5UYWJsZSBvcm1HZW5UYWJsZSA9IGdldEN1c3RvbWl6ZXIoKS5nZXRUYWJsZSggdCApOwotCQkJCQlyZXQuYWRkKCBvcm1HZW5UYWJsZSApOwotCQkJCX0KLQkJCQlyZXR1cm4gcmV0LnRvQXJyYXkoKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0W117fTsKLQkJfQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmKCBwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT1JNR2VuVGFibGUgKXsKLQkJCQlPUk1HZW5UYWJsZSB0YWJsZSA9IChPUk1HZW5UYWJsZSkgcGFyZW50RWxlbWVudDsKLQkJCQlMaXN0PE9STUdlbkNvbHVtbj4gY29sdW1ucyA9IHRhYmxlLmdldENvbHVtbnMoKTsKLQkJCQlMaXN0PE9STUdlbkNvbHVtbj4gcmV0ID0gbmV3IEFycmF5TGlzdDxPUk1HZW5Db2x1bW4+KCk7Ci0JCQkJZm9yKCBPUk1HZW5Db2x1bW4gY29sIDogY29sdW1ucyl7Ci0JCQkJCWlmKCBjb2wuaXNGb3JlaWduS2V5KCkgKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmKCBjb2wuaXNQcmltYXJ5S2V5KCkgKXsKLQkJCQkJCXJldC5hZGQoMCxjb2wgKTsKLQkJCQkJfWVsc2V7Ci0JCQkJCQlyZXQuYWRkKGNvbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHJldC50b0FycmF5KCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFtde307Ci0JCX0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsgCi0JCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlbkNvbHVtbil7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuKCBlbGVtZW50IGluc3RhbmNlb2YgT1JNR2VuVGFibGUgKTsKLQkJfQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7fQotCX0KLQotCWNsYXNzIFRhYmxlQ29sdW1uVHJlZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyewotCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmKCBlbGVtZW50IGluc3RhbmNlb2YgT1JNR2VuVGFibGUgKXsKLQkJCQlyZXR1cm4gSW1hZ2VSZXBvc2l0b3J5LmdldFRhYmxlSW1hZ2UocmVzb3VyY2VNYW5hZ2VyKTsKLQkJCX1lbHNlIAlpZiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlbkNvbHVtbiApewotCQkJCU9STUdlbkNvbHVtbiBjb2wgPSAoIE9STUdlbkNvbHVtbillbGVtZW50OwotCQkJCXJldHVybiBjb2wuaXNQcmltYXJ5S2V5KCkgPwotCQkJCQkJSW1hZ2VSZXBvc2l0b3J5LmdldEtleUNvbHVtbkltYWdlKHJlc291cmNlTWFuYWdlcikgOgotCQkJCQkJSW1hZ2VSZXBvc2l0b3J5LmdldENvbHVtbkltYWdlKHJlc291cmNlTWFuYWdlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkKLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiggZWxlbWVudCBpbnN0YW5jZW9mIE9STUdlblRhYmxlICl7Ci0JCQkJcmV0dXJuICgoT1JNR2VuVGFibGUpZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJfWVsc2UgCQkJaWYoIGVsZW1lbnQgaW5zdGFuY2VvZiBPUk1HZW5Db2x1bW4gKXsKLQkJCQlyZXR1cm4gKChPUk1HZW5Db2x1bW4pZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlR2VuZXJhdGVEZXRhaWxHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgewotCQlkZXRhaWxQYW5lbCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCVNXVFV0aWwuZmlsbENvbHVtbnMoIGRldGFpbFBhbmVsLCBjb2x1bW5zKTsKLQkJICAKLQkJZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQgPSBuZXcgU3RhY2tMYXlvdXQoKTsKLQkJZGV0YWlsUGFuZWwuc2V0TGF5b3V0KGRldGFpbFBhbmVsU3RhdGNrTGF5b3V0KTsKLQkJICAKLQkJQ29tcG9zaXRlIGVtcHR5UGFuZWwgPSBuZXcgQ29tcG9zaXRlKGRldGFpbFBhbmVsLCBTV1QuTk9ORSk7Ci0JCWVtcHR5UGFuZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0KLQkJZGV0YWlsUGFuZWxTdGF0Y2tMYXlvdXQudG9wQ29udHJvbCA9IGVtcHR5UGFuZWw7Ci0JCWRldGFpbFBhbmVsLmxheW91dCgpOwotCX0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHBlcmZvcm1IZWxwKCkgCi0gICAgewotICAgICAgICB0aGlzLmdldEhlbHBTeXN0ZW0oKS5kaXNwbGF5SGVscCggR2VuZXJhdGVFbnRpdGllc0Zyb21TY2hlbWFXaXphcmQuSEVMUF9DT05URVhUX0lEICk7Ci0gICAgfQotCi0JcHJvdGVjdGVkIGZpbmFsIElXb3JrYmVuY2hIZWxwU3lzdGVtIGdldEhlbHBTeXN0ZW0oKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlc1NlbGVjdG9yV2l6YXJkUGFnZS5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL2dlbi9UYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ5NzQxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvZ2VuL1RhYmxlc1NlbGVjdG9yV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5nZW47Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Xb3Jrc3BhY2VKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1Yk1vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5SZXNvdXJjZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklCYXNlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuU1dUVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmludGVybmFsLnV0aWwuVGFibGVMYXlvdXRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4uaW50ZXJuYWwuT1JNR2VuQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwdEpwYVVpUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSW1hZ2VSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnBhSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5oZWxwLklXb3JrYmVuY2hIZWxwU3lzdGVtOwotCi1jbGFzcyBUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUQUJMRV9DT0xVTU5fSU5ERVggPSAwOwotCQotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCXByaXZhdGUgU2NoZW1hIHNjaGVtYTsKLQlwcml2YXRlIE9STUdlbkN1c3RvbWl6ZXIgY3VzdG9taXplcjsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlUGVyc2lzdGVuY2VYbWwgPSB0cnVlOwotCi0JcHJpdmF0ZSBEYXRhYmFzZUdyb3VwIGRhdGFiYXNlR3JvdXA7Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHRhYmxlVGFibGU7Ci0JcHJpdmF0ZSBCdXR0b24gdXBkYXRlUGVyc2lzdGVuY2VYbWxDaGVja0JveDsKLQlwcml2YXRlIEJ1dHRvbiByZWZyZXNoVGFibGVzQnV0dG9uOwotCXByaXZhdGUgQnV0dG9uIHNlbGVjdEFsbEJ1dHRvbjsKLQlwcml2YXRlIEJ1dHRvbiBkZXNlbGVjdEFsbEJ1dHRvbjsKLQotCXByaXZhdGUgV29ya3NwYWNlSm9iIGZldGNoVGFibGVzSm9iOwotCXByb3RlY3RlZCBmaW5hbCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQotCXB1YmxpYyBUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UoSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBSZXNvdXJjZU1hbmFnZXIgcmVzb3VyY2VNYW5hZ2VyKSB7Ci0JCXN1cGVyKCJUYWJsZXNTZWxlY3RvcldpemFyZFBhZ2UiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJdGhpcy5qcGFQcm9qZWN0ID0ganBhUHJvamVjdDsKLQkJdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSByZXNvdXJjZU1hbmFnZXI7Ci0JCXRoaXMuc2NoZW1hID0ganBhUHJvamVjdC5nZXREZWZhdWx0RGJTY2hlbWEoKTsKLQkJdGhpcy5zZXRUaXRsZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX3NlbGVjdFRhYmxlICk7Ci0JCXRoaXMuc2V0TWVzc2FnZShKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX2Nob29zZUVudGl0eVRhYmxlICk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBJRGlhbG9nUGFnZSBpbXBsZW1lbnRhdGlvbiAgKioqKioqKioqKgotCQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzLmluaXRpYWxpemVEaWFsb2dVbml0cyhwYXJlbnQpOwotCi0JCXRoaXMuc2V0UGFnZUNvbXBsZXRlKHRydWUpOwotCQl0aGlzLnNldENvbnRyb2wodGhpcy5idWlsZFRvcExldmVsQ29udHJvbChwYXJlbnQpKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkKLQkJdGhpcy5kb1N0YXR1c1VwZGF0ZSgpOwotCQl0aGlzLnVwZGF0ZUJ1dHRvbnMoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlpZih0aGlzLmRhdGFiYXNlR3JvdXAgIT0gbnVsbCkgewotCQkJdGhpcy5kYXRhYmFzZUdyb3VwLmRpc3Bvc2UoKTsKLQkJfQotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgcGVyZm9ybUhlbHAoKSB7Ci0gICAgCXRoaXMuZ2V0SGVscFN5c3RlbSgpLmRpc3BsYXlIZWxwKCBHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZC5IRUxQX0NPTlRFWFRfSUQpOwotICAgIH0KLSAgICAKLQlwcm90ZWN0ZWQgZmluYWwgSVdvcmtiZW5jaEhlbHBTeXN0ZW0gZ2V0SGVscFN5c3RlbSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpOwotCX0KLQotCS8vICoqKioqKioqKiogSVdpemFyZFBhZ2UgaW1wbGVtZW50YXRpb24gICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXB1YmxpYyBJV2l6YXJkUGFnZSBnZXRQcmV2aW91c1BhZ2UoKSB7Ci0JCUlXaXphcmRQYWdlIHByZXZpb3VzUGFnZSA9IHN1cGVyLmdldFByZXZpb3VzUGFnZSgpOwotCQlpZihwcmV2aW91c1BhZ2UgaW5zdGFuY2VvZiBQcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZSkKLQkJCS8vUHJldmVudCBnb2luZyBiYWNrIHRvIHRoZSBQcm9tcHRKUEFQcm9qZWN0V2l6YXJkUGFnZQotCQkJLy9pZiBKUEEgcHJvamVjdCBhbHJlYWR5IHNlbGVjdGVkCi0JCQlyZXR1cm4gcHJldmlvdXNQYWdlLmdldFByZXZpb3VzUGFnZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gcHJldmlvdXNQYWdlOwotCX0KLQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kcyAqKioqKioqKioqCi0KLQlwcml2YXRlIENvbXBvc2l0ZSBidWlsZFRvcExldmVsQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlpbnQgbkNvbHVtbnM9IDM7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBuQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQl0aGlzLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSnBhSGVscENvbnRleHRJZHMuR0VORVJBVEVfRU5USVRJRVNfV0laQVJEX1NFTEVDVF9UQUJMRVMpOwotCi0JCXRoaXMuZGF0YWJhc2VHcm91cCA9IHRoaXMuY3JlYXRlRGF0YWJhc2VHcm91cChjb21wb3NpdGUsIDQwMCk7Ci0KLQkJdGhpcy5jcmVhdGVUYWJsZXNTZWxlY3Rpb25Db250cm9sKGNvbXBvc2l0ZSwgbkNvbHVtbnMpOwotCi0JCXRoaXMudXBkYXRlUGVyc2lzdGVuY2VYbWxDaGVja0JveCA9IHRoaXMuYnVpbGRVcGRhdGVQZXJzaXN0ZW5jZVhtbENoZWNrQm94KGNvbXBvc2l0ZSk7Ci0JCXRoaXMuZmlsbENvbHVtbnModGhpcy51cGRhdGVQZXJzaXN0ZW5jZVhtbENoZWNrQm94LCAzKTsKLQkJCi0JCS8vRmlsbGVyIGNvbHVtbgotCQluZXcgTGFiZWwoIGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkvL1Jlc3RvcmUgZGVmYXVsdHMgYnV0dG9uCi0JCXRoaXMuYnVpbGRSZXN0b3JlRGVmYXVsdHNCdXR0b24oY29tcG9zaXRlKTsKLQotCQl0aGlzLnVwZGF0ZVNlbGVjdGlvblN0YXRlKHRoaXMuZGF0YWJhc2VHcm91cC5nZXRTZWxlY3RlZFNjaGVtYSgpKTsKLQkJdGhpcy5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnRhYmxlVGFibGUuZ2V0Q29udHJvbCgpLCBKcGFIZWxwQ29udGV4dElkcy5ESUFMT0dfR0VORVJBVEVfRU5USVRJRVNfVEFCTEVTKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFibGVzU2VsZWN0aW9uQ29udHJvbChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1ucykgewotCQlHcmlkRGF0YSBncmlkRGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ3JpZERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCQotCQlMYWJlbCB0YWJsZUxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQl0YWJsZUxhYmVsLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQl0YWJsZUxhYmVsLnNldFRleHQoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV90YWJsZXMgKTsKLQkJCi0JCVRhYmxlTGF5b3V0Q29tcG9zaXRlIGxheW91dCA9IG5ldyBUYWJsZUxheW91dENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJdGhpcy5hZGRDb2x1bW5MYXlvdXREYXRhKGxheW91dCk7Ci0KLQkJdGhpcy50YWJsZVRhYmxlID0gdGhpcy5idWlsZENoZWNrYm94VGFibGVWaWV3ZXIodGhpcy5idWlsZFRhYmxlKGxheW91dCkpOwotCi0JCXRoaXMuY3JlYXRlQnV0dG9uQ29tcG9zaXRlKHBhcmVudCk7Ci0JCXRoaXMuaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2wodGhpcy5wb3NzaWJsZVRhYmxlcygpKTsJCQotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVCdXR0b25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCl7Ci0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGJ1dHRvbkxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDEsIGZhbHNlKTsKLQkJYnV0dG9uTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWJ1dHRvbkxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0KGJ1dHRvbkxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSAgbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXRoaXMuc2VsZWN0QWxsQnV0dG9uID0gdGhpcy5idWlsZFNlbGVjdEFsbEJ1dHRvbihidXR0b25Db21wb3NpdGUpOwotCQl0aGlzLmRlc2VsZWN0QWxsQnV0dG9uID0gdGhpcy5idWlsZERlc2VsZWN0QWxsQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JCXRoaXMucmVmcmVzaFRhYmxlc0J1dHRvbiA9IHRoaXMuYnVpbGRSZWZyZXNoVGFibGVzQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSk7Ci0JfQotCQotCXByaXZhdGUgRGF0YWJhc2VHcm91cCBjcmVhdGVEYXRhYmFzZUdyb3VwKENvbXBvc2l0ZSBwYXJlbnQsIGludCB3aWR0aEhpbnQpIHsKLQkJRGF0YWJhc2VHcm91cCBkYkdyb3VwID0gbmV3IERhdGFiYXNlR3JvdXAodGhpcy5nZXRDb250YWluZXIoKSwgdGhpcy5qcGFQcm9qZWN0LCBwYXJlbnQsIHRoaXMucmVzb3VyY2VNYW5hZ2VyLCB3aWR0aEhpbnQpOwotCQkvKioKLQkJICogbGlzdGVuIGZvciB3aGVuIHRoZSBEYXRhYmFzZSBDb25uZWN0aW9uIGNoYW5nZXMgaXRzIHNlbGVjdGVkIHNjaGVtYQotCQkgKiBzbyB3ZSBjYW4ga2VlcCB0aGUgcGFnZSBpbiBzeW5jaAotCQkgKi8KLQkJY2xhc3MgRGF0YWJhc2VQYWdlTGlzdGVuZXIgaW1wbGVtZW50cyBEYXRhYmFzZUdyb3VwLkxpc3RlbmVyIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGVkQ29ubmVjdGlvblByb2ZpbGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlKSB7Ci0JCQkJanBhUHJvamVjdC5nZXREYXRhU291cmNlKCkuc2V0Q29ubmVjdGlvblByb2ZpbGVOYW1lKGNvbm5lY3Rpb25Qcm9maWxlLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGVkU2NoZW1hQ2hhbmdlZChTY2hlbWEgc2NoZW1hKSB7Ci0JCQkJaWYgKHNjaGVtYT09bnVsbCkgewotCQkJCQl1cGRhdGVUYWJsZXNMaXN0Vmlld2VyKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotCQkJCX0gCi0JCQkJZWxzZSB7Ci0JCQkJCS8vIHN0b3JlIHRoZSAqaWRlbnRpZmllciogaW4gdGhlIEpQQSBwcm9qZWN0LCBzaW5jZSBpdCBnZXRzIHB1dCBpbiBKYXZhIGFubm90YXRpb25zCi0JCQkJCWpwYVByb2plY3Quc2V0VXNlck92ZXJyaWRlRGVmYXVsdFNjaGVtYShzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJCQkJc2V0U2NoZW1hKHNjaGVtYSk7Ci0JCQkJCXVwZGF0ZUJ1dHRvbnMoKTsKLQkJCQkJdXBkYXRlU2VsZWN0aW9uU3RhdGUoc2NoZW1hKTsKLQkJCQl9Ci0JCQkJZG9TdGF0dXNVcGRhdGUoKTsKLQkJCX0KLQkJfQotCQlkYkdyb3VwLmFkZExpc3RlbmVyKG5ldyBEYXRhYmFzZVBhZ2VMaXN0ZW5lcigpKTsKLQkJZGJHcm91cC5pbml0KCk7Ci0JCXJldHVybiBkYkdyb3VwOwotCX0KLQotCS8vICoqKioqKioqKiogcHJpdmF0ZSBtZXRob2RzICoqKioqKioqKioKLQotCXByaXZhdGUgU2NoZW1hIGdldFNjaGVtYSgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHMpIHsKLQkJdGhpcy5zY2hlbWEgPSBzOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjb25uZWN0aW9uSXNBY3RpdmUoKSB7Ci0JCXJldHVybiB0aGlzLmRhdGFiYXNlR3JvdXAuY29ubmVjdGlvbklzQWN0aXZlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uPFRhYmxlPiBnZXRUYWJsZXMoU2NoZW1hIHNjaGVtYSkgewotCQlpZih0aGlzLmZldGNoVGFibGVzSm9iSXNSdW5uaW5nKCkpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy48VGFibGU+IGVtcHR5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9uVG9vbHMuY29sbGVjdGlvbihzY2hlbWEuZ2V0VGFibGVzKCkpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMoKSB7Ci0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldFNjaGVtYSgpOwotCQlpZihzY2hlbWEgIT0gbnVsbCAmJiBzY2hlbWEuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCXJldHVybiB0aGlzLmdldFRhYmxlcyhzY2hlbWEpOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy48VGFibGU+IGVtcHR5TGlzdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVCdXR0b25zKCkgewotCQlpZih0aGlzLnNlbGVjdEFsbEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnNlbGVjdEFsbEJ1dHRvbi5zZXRFbmFibGVkKHRoaXMuY29ubmVjdGlvbklzQWN0aXZlKCkpOwotCQl9Ci0JCWlmKHRoaXMucmVmcmVzaFRhYmxlc0J1dHRvbiAhPSBudWxsKSB7Ci0JCQl0aGlzLnJlZnJlc2hUYWJsZXNCdXR0b24uc2V0RW5hYmxlZCh0aGlzLmNvbm5lY3Rpb25Jc0FjdGl2ZSgpKTsKLQkJfQotCQlpZih0aGlzLmRlc2VsZWN0QWxsQnV0dG9uICE9IG51bGwpIHsKLQkJCXRoaXMuZGVzZWxlY3RBbGxCdXR0b24uc2V0RW5hYmxlZCh0aGlzLmNvbm5lY3Rpb25Jc0FjdGl2ZSgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlUGVyc2lzdGVuY2VYbWwoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlWG1sOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaG91bGRVcGRhdGVQZXJzaXN0ZW5jZVhtbChib29sZWFuIHVwZGF0ZVBlcnNpc3RlbmNlWG1sKXsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVhtbCA9IHVwZGF0ZVBlcnNpc3RlbmNlWG1sOwotCQl0aGlzLmRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZXN0b3JlVXBkYXRlUGVyc2lzdGVuY2VYbWxEZWZhdWx0KCkgewotCQl0aGlzLnVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3guc2V0U2VsZWN0aW9uKHRydWUpOwotCQl0aGlzLnNldFNob3VsZFVwZGF0ZVBlcnNpc3RlbmNlWG1sKHRydWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZWxlY3RBbGxUYWJsZXMoKSB7Ci0JCXRoaXMudGFibGVUYWJsZS5zZXRBbGxDaGVja2VkKHRydWUpOwotCQl0aGlzLmRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlc2VsZWN0QWxsVGFibGVzKCkgewotCQl0aGlzLnRhYmxlVGFibGUuc2V0QWxsQ2hlY2tlZChmYWxzZSk7Ci0JCXRoaXMuZG9TdGF0dXNVcGRhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVmcmVzaFRhYmxlcygpIHsKLQkJdGhpcy5zY2hlbWEucmVmcmVzaCgpOwotCQl0aGlzLnVwZGF0ZVNlbGVjdGlvblN0YXRlKHRoaXMuZGF0YWJhc2VHcm91cC5nZXRTZWxlY3RlZFNjaGVtYSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdFRhYmxlc1NlbGVjdGlvbkNvbnRyb2woQ29sbGVjdGlvbjxUYWJsZT4gcG9zc2libGVUYWJsZXMpIHsKLQkJdGhpcy50YWJsZVRhYmxlLnNldElucHV0KHBvc3NpYmxlVGFibGVzKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVJIGNvbXBvbmVudHMgKioqKioqKioqKgotCQotCXByaXZhdGUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGUgYnVpbGRUYWJsZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlIHRhYmxlID0gbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULlNJTkdMRSB8IFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5CT1JERVIgfCBTV1QuQ0hFQ0spOwotCi0JCVRhYmxlQ29sdW1uIHRhYmxlTmFtZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUsIFRBQkxFX0NPTFVNTl9JTkRFWCk7Ci0JCXRhYmxlTmFtZUNvbHVtbi5zZXRUZXh0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdGFibGVDb2x1bW4pOwotCQl0YWJsZU5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCXRhYmxlLmFkZEtleUxpc3RlbmVyKHRoaXMuYnVpbGRUYWJsZUtleUxpc3RlbmVyKCkpOwotCQkKLQkJR3JpZERhdGEgZ3JpZERhdGE9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlncmlkRGF0YS5oZWlnaHRIaW50PSBTV1RVdGlsLmdldFRhYmxlSGVpZ2h0SGludCh0YWJsZSwgMjApOwotCQlncmlkRGF0YS53aWR0aEhpbnQgPSAyNTA7Ci0JCWdyaWREYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncmlkRGF0YS5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWUgOwotCQkKLQkJQ29sb3IgYmFja2dyb3VuZENvbG9yID0gbmV3IENvbG9yKERpc3BsYXkuZ2V0RGVmYXVsdCgpLCAyNTUsIDAsMCk7Ci0JCXBhcmVudC5zZXRMYXlvdXREYXRhKGdyaWREYXRhKTsKLQkJcGFyZW50LnNldEJhY2tncm91bmQoYmFja2dyb3VuZENvbG9yKTsKLQkJYmFja2dyb3VuZENvbG9yLmRpc3Bvc2UoKTsKLQkJCi0JCXJldHVybiB0YWJsZTsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIGJ1aWxkQ2hlY2tib3hUYWJsZVZpZXdlcihvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZSBwYXJlbnQpIHsKLQkJQ2hlY2tib3hUYWJsZVZpZXdlciB0YWJsZVZpZXdlciA9IG5ldyBDaGVja2JveFRhYmxlVmlld2VyKHBhcmVudCk7Ci0JCXRhYmxlVmlld2VyLnNldFVzZUhhc2hsb29rdXAodHJ1ZSk7Ci0JCQotCQl0YWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJdGFibGVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKHRoaXMuYnVpbGRUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkpOwotCQkKLQkJdGFibGVWaWV3ZXIuc2V0U29ydGVyKHRoaXMuYnVpbGRUYWJsZVZpZXdlclNvcnRlcigpKTsKLQkJdGFibGVWaWV3ZXIuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcih0aGlzLmJ1aWxkVGFibGVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCQotCQlyZXR1cm4gdGFibGVWaWV3ZXI7Ci0JfQotCQotCXByaXZhdGUgVmlld2VyU29ydGVyIGJ1aWxkVGFibGVWaWV3ZXJTb3J0ZXIoKSB7Ci0JCXJldHVybiBuZXcgVmlld2VyU29ydGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgaW50IGNvbXBhcmUoVmlld2VyIHZpZXdlciwgT2JqZWN0IGUxLCBPYmplY3QgZTIpIHsKLQkJCQlyZXR1cm4gKChUYWJsZSkgZTEpLmdldE5hbWUoKS5jb21wYXJlVG8oKChUYWJsZSkgZTIpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkVXBkYXRlUGVyc2lzdGVuY2VYbWxDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUJ1dHRvbiBjaGVja0JveCA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQljaGVja0JveC5zZXRUZXh0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfdXBkYXRlUGVyc2lzdGVuY2VYbWwgKTsKLQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKHRoaXMudXBkYXRlUGVyc2lzdGVuY2VYbWwoKSk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRVcGRhdGVQZXJzaXN0ZW5jZVhtbFNlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQkKLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkUmVzdG9yZURlZmF1bHRzQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdyaWREYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRU5EOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCWJ1dHRvbi5zZXRUZXh0KEpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfUmVzdG9yZV9EZWZhdWx0cyk7Ci0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkUmVzdG9yZURlZmF1bHRzU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0JCQotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkU2VsZWN0QWxsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMuYnVpbGRTZWxlY3Rpb25CdXR0b24ocGFyZW50LAotCQkJSnB0VWlNZXNzYWdlcy5HZW5lcmFsX3NlbGVjdEFsbCwKLQkJCUltYWdlUmVwb3NpdG9yeS5nZXRTZWxlY3RBbGxCdXR0b25JbWFnZSh0aGlzLnJlc291cmNlTWFuYWdlcikpOwotCQkKLQkJYnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMuYnVpbGRTZWxlY3RBbGxTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZERlc2VsZWN0QWxsQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IHRoaXMuYnVpbGRTZWxlY3Rpb25CdXR0b24ocGFyZW50LAotCQkJSnB0VWlNZXNzYWdlcy5HZW5lcmFsX2Rlc2VsZWN0QWxsLAotCQkJSW1hZ2VSZXBvc2l0b3J5LmdldERlc2VsZWN0QWxsQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpKTsKLQkJCi0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkRGVzZWxlY3RBbGxTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBidWlsZFJlZnJlc2hUYWJsZXNCdXR0b24oQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gdGhpcy5idWlsZFNlbGVjdGlvbkJ1dHRvbihwYXJlbnQsCi0JCQlKcHRVaU1lc3NhZ2VzLkdlbmVyYWxfcmVmcmVzaCwKLQkJCUltYWdlUmVwb3NpdG9yeS5nZXRSZWZyZXNoQnV0dG9uSW1hZ2UodGhpcy5yZXNvdXJjZU1hbmFnZXIpKTsKLQkJCi0JCWJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzLmJ1aWxkUmVmcmVzaFRhYmxlc1NlbGVjdGlvbkxpc3RlbmVyKCkpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByaXZhdGUgQnV0dG9uIGJ1aWxkU2VsZWN0aW9uQnV0dG9uKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0b29sVGlwVGV4dCwgSW1hZ2UgYnV0dG9uSW1hZ2UpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUb29sVGlwVGV4dCh0b29sVGlwVGV4dCk7Ci0JCWJ1dHRvbi5zZXRJbWFnZShidXR0b25JbWFnZSk7Ci0JCUdyaWREYXRhIGdyaWREYXRhID0gIG5ldyBHcmlkRGF0YSgpOwotCQlncmlkRGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZ3JpZERhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQ29sdW1uTGF5b3V0RGF0YShUYWJsZUxheW91dENvbXBvc2l0ZSBsYXlvdXQpIHsKLQkJbGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxheW91dERhdGEgb2YgdGhlIGlucHV0IGNvbnRyb2wgdG8gb2NjdXB5IHNwZWNpZmllZCBudW1iZXIgb2YgY29sdW1ucwotCSAqIEBwYXJhbSBjCi0JICogQHBhcmFtIGNvbHVtbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlsbENvbHVtbnMoQ29udHJvbCBjLCBpbnQgY29sdW1ucyl7Ci0JCUdyaWREYXRhIGxheW91dERhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsU3BhbiA9IGNvbHVtbnM7Ci0JCWxheW91dERhdGEudmVydGljYWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJbGF5b3V0RGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxheW91dERhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSBmYWxzZTsKLQkJYy5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCQlyZXR1cm4gOwotCX0KLQotCXByaXZhdGUgSUJhc2VMYWJlbFByb3ZpZGVyIGJ1aWxkVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgVGFibGVUYWJsZUxhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgYnVpbGRUYWJsZVRhYmxlQ29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIoKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGxpc3RlbmVycyBjYWxsYmFja3MgKioqKioqKioqKgotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQl0aGlzLmRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBsaXN0ZW5lcnMgKioqKioqKioqKgotCQotCXByaXZhdGUgS2V5QWRhcHRlciBidWlsZFRhYmxlS2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5QWRhcHRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYoZS5rZXlDb2RlID09IFNXVC5GMiAmJiBlLnN0YXRlTWFzayA9PSBTV1QuTk9ORSkgewotCQkJCQllZGl0RW50aXR5TmFtZUlmUG9zc2libGUoKTsKLQkJCQkJZS5kb2l0PSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBidWlsZFRhYmxlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVRhYmxlc0xpc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFVwZGF0ZVBlcnNpc3RlbmNlWG1sU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNldFNob3VsZFVwZGF0ZVBlcnNpc3RlbmNlWG1sKHVwZGF0ZVBlcnNpc3RlbmNlWG1sQ2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkUmVzdG9yZURlZmF1bHRzU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmKGN1c3RvbWl6ZXIgIT0gbnVsbCAmJiBjdXN0b21pemVyLmdldEZpbGUoKSAhPSBudWxsICl7Ci0JCQkJCWlmKGN1c3RvbWl6ZXIuZ2V0RmlsZSgpLmV4aXN0cygpICl7Ci0JCQkJCQljdXN0b21pemVyLmdldEZpbGUoKS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQlkZXNlbGVjdEFsbFRhYmxlcygpOwotCQkJCQlyZXN0b3JlVXBkYXRlUGVyc2lzdGVuY2VYbWxEZWZhdWx0KCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkU2VsZWN0QWxsU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXNlbGVjdEFsbFRhYmxlcygpOwotCQkJfQotCQl9OwotCX0KLQkKLQlwcml2YXRlIFNlbGVjdGlvbkxpc3RlbmVyIGJ1aWxkRGVzZWxlY3RBbGxTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZGVzZWxlY3RBbGxUYWJsZXMoKTsKLQkJCX0KLQkJfTsKLQl9Ci0JCi0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBidWlsZFJlZnJlc2hUYWJsZXNTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcmVmcmVzaFRhYmxlcygpOwotCQkJfQotCQl9OwotCX0KLQotCS8vICoqKioqKioqKiogdGFibGUgYmVoYXZpb3JzICoqKioqKioqKioKLQotCXByaXZhdGUgdm9pZCBlZGl0RW50aXR5TmFtZUlmUG9zc2libGUoKSB7Ci0JCU9iamVjdFtdIHNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgdGhpcy50YWJsZVRhYmxlLmdldFNlbGVjdGlvbigpKS50b0FycmF5KCk7Ci0JCWlmIChzZWxlY3RlZC5sZW5ndGggIT0gMSkgewotCQkJcmV0dXJuOwotCQl9Ci0JfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxUYWJsZT4gZ2V0U2VsZWN0ZWRUYWJsZXMoKSB7Ci0JCUFycmF5TGlzdDxUYWJsZT4gc2VsZWN0ZWRUYWJsZXMgPSBuZXcgQXJyYXlMaXN0PFRhYmxlPigpOwotCQlmb3IgKE9iamVjdCBzZWxlY3RlZFRhYmxlIDogdGhpcy50YWJsZVRhYmxlLmdldENoZWNrZWRFbGVtZW50cygpKQotCQkJc2VsZWN0ZWRUYWJsZXMuYWRkKChUYWJsZSkgc2VsZWN0ZWRUYWJsZSk7Ci0JCXJldHVybiBzZWxlY3RlZFRhYmxlczsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVGFibGVzU2VsZWN0ZWQoKSB7Ci0JCXJldHVybiAodGhpcy50YWJsZVRhYmxlICE9IG51bGwpID8gKHRoaXMuZ2V0U2VsZWN0ZWRUYWJsZXMoKS5zaXplKCkgPiAwKSA6IGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVUYWJsZXNMaXN0Vmlld2VyKENvbGxlY3Rpb248VGFibGU+IHBvc3NpYmxlVGFibGVzKSB7Ci0JCWlmKHRoaXMudGFibGVUYWJsZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmluaXRUYWJsZXNTZWxlY3Rpb25Db250cm9sKHBvc3NpYmxlVGFibGVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0YWJsZUluaXRpYWxpemVkKCkgewotCQlyZXR1cm4gKHRoaXMudGFibGVUYWJsZSAhPSBudWxsKSAmJiAodGhpcy50YWJsZVRhYmxlLmdldFRhYmxlKCkuZ2V0SXRlbUNvdW50KCkgPiAwKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGZldGNoIHRhYmxlcyAqKioqKioqKioqCi0KLQlwcml2YXRlIGJvb2xlYW4gZmV0Y2hUYWJsZXNKb2JJc1J1bm5pbmcoKSB7Ci0JCXJldHVybiB0aGlzLmZldGNoVGFibGVzSm9iICE9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBXb3Jrc3BhY2VKb2IgYnVpbGRGZXRjaFRhYmxlc0pvYihmaW5hbCBTY2hlbWEgc2NoZW1hKSB7Ci0JCWZpbmFsIENvbGxlY3Rpb248VGFibGU+IHRhYmxlcyA9IG5ldyBBcnJheUxpc3Q8VGFibGU+KCk7Ci0KLQkJV29ya3NwYWNlSm9iIHdvcmtzcGFjZUpvYiA9IG5ldyBXb3Jrc3BhY2VKb2IoSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9nZXRUYWJsZXNfam9iTmFtZSkgewotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluV29ya3NwYWNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQl9Ci0JCQkJU3ViTW9uaXRvciBzdWJNb25pdG9yID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIAotCQkJCQlKcHRVaUVudGl0eUdlbk1lc3NhZ2VzLkdlbmVyYXRlRW50aXRpZXNXaXphcmRfdGFibGVTZWxlY3RQYWdlX2dldFRhYmxlc190YXNrTmFtZSwgNzUpOwotCQkJCXRyeSB7Ci0JCQkJCXN1Yk1vbml0b3IuYmVnaW5UYXNrKHNjaGVtYS5nZXRDb250YWluZXIoKS5nZXROYW1lKCksIDEwMCk7Ci0JCQkJCXN1Yk1vbml0b3Iuc3ViVGFzaygKLQkJCQkJCU5MUy5iaW5kKAotCQkJCQkJCUpwdFVpRW50aXR5R2VuTWVzc2FnZXMuR2VuZXJhdGVFbnRpdGllc1dpemFyZF90YWJsZVNlbGVjdFBhZ2VfZ2V0VGFibGVzX3N1YlRhc2tOYW1lLCAKLQkJCQkJCQlzY2hlbWEuZ2V0TmFtZSgpKSk7Ci0JCQkJCXN1Yk1vbml0b3Iud29ya2VkKDIwKTsKLQotCQkJCQl0YWJsZXMuYWRkQWxsKENvbGxlY3Rpb25Ub29scy5jb2xsZWN0aW9uKHNjaGVtYS5nZXRUYWJsZXMoKSkpOwotCQkJCQkKLQkJCQkJc3ViTW9uaXRvci53b3JrZWQoOTUpOwotCQkJCX0KLQkJCQljYXRjaChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQkJCX0KLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQotCQl3b3Jrc3BhY2VKb2IuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGRvbmUoZmluYWwgSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJCi0JCQkJIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCSAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJICAgICAgICAgICAgCSAgIHVwZGF0ZVRhYmxlc0xpc3RWaWV3ZXIodGFibGVzKTsKLQkJICAgICAgICAgICAgICAgfQotCQkJCSB9KTsKLQkJCQlldmVudC5nZXRKb2IoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCQlmZXRjaFRhYmxlc0pvYiA9IG51bGw7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gd29ya3NwYWNlSm9iOwotCX0KLQotCS8vICoqKioqKioqKiogdXBkYXRlcyAqKioqKioqKioqCi0JCi0JLyoqCi0JICogVXBkYXRlIHRoZSBzdGF0dXMgbGluZSBhbmQgdGhlIE9LIGJ1dHRvbiBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHN0YXR1cwotCSAqLwotCXByaXZhdGUgdm9pZCBkb1N0YXR1c1VwZGF0ZSgpIHsKLQkJaWYoICEgdGhpcy5oYXNUYWJsZXNTZWxlY3RlZCgpKSB7Ci0JCQl0aGlzLnNldFBhZ2VDb21wbGV0ZShmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNldFBhZ2VDb21wbGV0ZSh0cnVlKTsKLQkJCXRyeXsKLQkJCQl0aGlzLmdldENvbnRhaW5lcigpLnJ1bihmYWxzZSwgZmFsc2UsIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1biggZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yICkgCi0JCQkJICAgIAl0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLQkJCQkgICAgewotCQkJCQkJbW9uaXRvci5iZWdpblRhc2soSnB0VWlFbnRpdHlHZW5NZXNzYWdlcy5HZW5lcmF0ZUVudGl0aWVzV2l6YXJkX3RhYmxlU2VsZWN0UGFnZV9zdGF0dXNVcGRhdGVfdGFza05hbWUsIDEwKTsKLQkJCQkKLQkJCQkJCUNvbGxlY3Rpb248VGFibGU+IHJldCA9IFRhYmxlc1NlbGVjdG9yV2l6YXJkUGFnZS50aGlzLmdldFNlbGVjdGVkVGFibGVzKCk7Ci0JCQkJCQlBcnJheUxpc3Q8U3RyaW5nPiB0YWJsZU5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCQkJCQlmb3IoVGFibGUgdCA6IHJldCkgewotCQkJCQkJCXRhYmxlTmFtZXMuYWRkKHQuZ2V0TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJCVNjaGVtYSBzY2hlbWEgPSBnZXRTY2hlbWEoKTsKLQkJCQkJCWlmKHNjaGVtYSA9PSBudWxsKSB7Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJY3VzdG9taXplci5zZXRTY2hlbWEoc2NoZW1hKTsKLQkJCQkJCWN1c3RvbWl6ZXIuc2V0VGFibGVOYW1lcyh0YWJsZU5hbWVzKTsKLQkJCQkJCWN1c3RvbWl6ZXIuc2V0VXBkYXRlUGVyc2lzdGVuY2VYbWwodXBkYXRlUGVyc2lzdGVuY2VYbWwpOwotCQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQkJICAgIH0KLQkJCQl9KTsKLQkJCX0gCi0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0aW9uU3RhdGUoZmluYWwgU2NoZW1hIHNjaGVtYSkgewotCQlpZihzY2hlbWEgPT1udWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5qcGFQcm9qZWN0LnNldFVzZXJPdmVycmlkZURlZmF1bHRTY2hlbWEoc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0KLQkJaWYoICEgdGhpcy5mZXRjaFRhYmxlc0pvYklzUnVubmluZygpICYmICEgdGhpcy50YWJsZUluaXRpYWxpemVkKCkpIHsKLQkJCXRoaXMuZmV0Y2hUYWJsZXNKb2IgPSB0aGlzLmJ1aWxkRmV0Y2hUYWJsZXNKb2Ioc2NoZW1hKTsKLQkJCXRoaXMuZmV0Y2hUYWJsZXNKb2Iuc2NoZWR1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudXBkYXRlVGFibGVzTGlzdFZpZXdlcih0aGlzLmdldFRhYmxlcyhzY2hlbWEpKTsKLQkJfQotCi0JCS8vQ3JlYXRlIHRoZSBPUk1HZW5DdXN0b21pemVyCi0JCUdlbmVyYXRlRW50aXRpZXNGcm9tU2NoZW1hV2l6YXJkIHdpemFyZCA9IChHZW5lcmF0ZUVudGl0aWVzRnJvbVNjaGVtYVdpemFyZCkgZ2V0V2l6YXJkKCk7Ci0JCXRoaXMuY3VzdG9taXplciA9IHdpemFyZC5jcmVhdGVPUk1HZW5DdXN0b21pemVyKHNjaGVtYSk7Ci0KLQkJaWYodGhpcy50YWJsZVRhYmxlIT1udWxsICYmIHRoaXMudXBkYXRlUGVyc2lzdGVuY2VYbWxDaGVja0JveCE9bnVsbCAmJiB0aGlzLmN1c3RvbWl6ZXIgIT0gbnVsbCkgewotCQkJdGhpcy5yZXN0b3JlV2l6YXJkU3RhdGUoKTsKLQkJfQotCQl0aGlzLmRvU3RhdHVzVXBkYXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlc3RvcmVXaXphcmRTdGF0ZSgpIHsKLQkJYm9vbGVhbiBwYWdlQ29tcGxldGUgPSBmYWxzZTsKLQkJdGhpcy51cGRhdGVQZXJzaXN0ZW5jZVhtbENoZWNrQm94LnNldFNlbGVjdGlvbih0aGlzLmN1c3RvbWl6ZXIudXBkYXRlUGVyc2lzdGVuY2VYbWwoKSk7Ci0JCUxpc3Q8U3RyaW5nPiBwcmVTZWxlY3RlZFRhYmxlTmFtZXMgPSB0aGlzLmN1c3RvbWl6ZXIuZ2V0VGFibGVOYW1lcygpOwotCQlpZihwcmVTZWxlY3RlZFRhYmxlTmFtZXMhPW51bGwgJiYgcHJlU2VsZWN0ZWRUYWJsZU5hbWVzLnNpemUoKT4wKSB7Ci0JCQlTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCQlmb3IoU3RyaW5nIHMgOiBwcmVTZWxlY3RlZFRhYmxlTmFtZXMpewotCQkJCXNldC5hZGQocyk7Ci0JCQl9Ci0JICAgICAgICBUYWJsZUl0ZW1bXSBpdGVtcyA9IHRoaXMudGFibGVUYWJsZS5nZXRUYWJsZSgpLmdldEl0ZW1zKCk7Ci0JICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLQkgICAgICAgICAgICBUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCSAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGUgZWxlbWVudCA9IChvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlKWl0ZW0uZ2V0RGF0YSgpOwotCSAgICAgICAgICAgIGlmKGVsZW1lbnQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrID0gc2V0LmNvbnRhaW5zKGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkgICAgICAgICAgICAgICAgLy8gb25seSBzZXQgaWYgZGlmZmVyZW50LCB0byBhdm9pZCBmbGlja2VyCi0JICAgICAgICAgICAgICAgIGlmKGl0ZW0uZ2V0Q2hlY2tlZCgpICE9IGNoZWNrKSB7Ci0JICAgICAgICAgICAgICAgICAgICBpdGVtLnNldENoZWNrZWQoY2hlY2spOwotCSAgICAgICAgICAgICAgICAgICAgcGFnZUNvbXBsZXRlID0gdHJ1ZTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkJfQotCQlyZXR1cm4gcGFnZUNvbXBsZXRlOwotCX0KLQotCS8vICoqKioqKioqKiogaW5uZXIgY2xhc3NlcyAqKioqKioqKioqCi0JCi0JcHJpdmF0ZSBjbGFzcyBUYWJsZVRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JCQotCQlUYWJsZVRhYmxlTGFiZWxQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChUYWJsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJc3dpdGNoKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSBUQUJMRV9DT0xVTU5fSU5ERVg6Ci0JCQkJCXJldHVybiAoKFRhYmxlKSBlbGVtZW50KS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnZhbGlkIGNvbHVtbiBpbmRleDogIiArIGNvbHVtbkluZGV4KTsvLyAkTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlwcml2YXRlIGNsYXNzIFRhYmxlVGFibGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0KLQkJLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCQkKLQkJVGFibGVUYWJsZUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHt9Ci0KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHt9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKENvbGxlY3Rpb248Pz4pIGlucHV0RWxlbWVudCkudG9BcnJheSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZU5ld0ZpbGVXaXphcmRQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgwM2UxZC4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExICBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqICBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLm9ybTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UKLQkJZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBkYXRhTW9kZWw7Ci0JCi0JCi0JcHVibGljIE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UoCi0JCQlTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgSURhdGFNb2RlbCBkYXRhTW9kZWwsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkKLQkJc3VwZXIocGFnZU5hbWUsIHNlbGVjdGlvbik7Ci0JCWluaXQoZGF0YU1vZGVsKTsKLQkJc2V0VGl0bGUodGl0bGUpOwotCQlzZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGluaXQoSURhdGFNb2RlbCBkYXRhTW9kZWwpIHsKLQkJdGhpcy5kYXRhTW9kZWwgPSBkYXRhTW9kZWw7Ci0JCUlQYXRoIGNvbnRhaW5lclBhdGggPSAoSVBhdGgpIHRoaXMuZGF0YU1vZGVsLmdldFByb3BlcnR5KENPTlRBSU5FUl9QQVRIKTsKLQkJaWYgKGNvbnRhaW5lclBhdGggIT0gbnVsbCkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgoY29udGFpbmVyUGF0aCk7Ci0JCX0KLQkJU3RyaW5nIGZpbGVOYW1lID0gKFN0cmluZykgdGhpcy5kYXRhTW9kZWwuZ2V0UHJvcGVydHkoRklMRV9OQU1FKTsKLQkJaWYgKGZpbGVOYW1lICE9IG51bGwpIHsKLQkJCXNldEZpbGVOYW1lKGZpbGVOYW1lKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCXRoaXMuZGF0YU1vZGVsLnNldFByb3BlcnR5KENPTlRBSU5FUl9QQVRILCBnZXRDb250YWluZXJGdWxsUGF0aCgpKTsKLQkJdGhpcy5kYXRhTW9kZWwuc2V0UHJvcGVydHkoRklMRV9OQU1FLCBnZXRGaWxlTmFtZSgpKTsKLQkJCi0JCWJvb2xlYW4gdmFsaWQgPSBzdXBlci52YWxpZGF0ZVBhZ2UoKTsKLQkJaWYgKCEgdmFsaWQpIHsKLQkJCXJldHVybiB2YWxpZDsKLQkJfQotCQkKLQkJSVN0YXR1cyB2YWxpZGF0aW9uU3RhdHVzID0gdGhpcy5kYXRhTW9kZWwudmFsaWRhdGVQcm9wZXJ0eShDT05UQUlORVJfUEFUSCk7Ci0JCWlmICh2YWxpZGF0aW9uU3RhdHVzLmlzT0soKSkgewotCQkJdmFsaWRhdGlvblN0YXR1cyA9IHRoaXMuZGF0YU1vZGVsLnZhbGlkYXRlUHJvcGVydHkoRklMRV9OQU1FKTsKLQkJfQotCQlpZiAodmFsaWRhdGlvblN0YXR1cy5pc09LKCkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHZhbGlkYXRpb25TdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsKLQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCXNldE1lc3NhZ2UodmFsaWRhdGlvblN0YXR1cy5nZXRNZXNzYWdlKCksIElTdGF0dXMuV0FSTklORyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZSh2YWxpZGF0aW9uU3RhdHVzLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvb3JtL01hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ4NGE3Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLm9ybTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLnVpLkRhdGFNb2RlbFdpemFyZFBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBNYXBwaW5nRmlsZU9wdGlvbnNXaXphcmRQYWdlCi0JCWV4dGVuZHMgRGF0YU1vZGVsV2l6YXJkUGFnZSB7Ci0JCi0JcHJpdmF0ZSBMYWJlbCBhY2Nlc3NMYWJlbDsKLQkKLQlwcml2YXRlIENvbWJvIGFjY2Vzc0NvbWJvOwotCQotCXByaXZhdGUgQnV0dG9uIGFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uOwotCQotCXByaXZhdGUgTGFiZWwgcGVyc2lzdGVuY2VVbml0TGFiZWw7Ci0JCi0JcHJpdmF0ZSBDb21ibyBwZXJzaXN0ZW5jZVVuaXRDb21ibzsKLQkKLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVPcHRpb25zV2l6YXJkUGFnZSgKLQkJCVN0cmluZyBwYWdlTmFtZSwgSURhdGFNb2RlbCBkYXRhTW9kZWwsCi0JCQlTdHJpbmcgdGl0bGUsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQkKLQkJc3VwZXIoZGF0YU1vZGVsLCBwYWdlTmFtZSk7Ci0JCXNldFRpdGxlKHRpdGxlKTsKLQkJc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCQlzZXRQYWdlQ29tcGxldGUoZmFsc2UpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0VmFsaWRhdGlvblByb3BlcnR5TmFtZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10gewotCQkJQ09OVEFJTkVSX1BBVEgsCi0JCQlGSUxFX05BTUUsCi0JCQlERUZBVUxUX0FDQ0VTUywKLQkJCUFERF9UT19QRVJTSVNURU5DRV9VTklULAotCQkJUEVSU0lTVEVOQ0VfVU5JVAotCQl9OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZVRvcExldmVsQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJdGhpcy5hY2Nlc3NMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5hY2Nlc3NMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX2FjY2Vzc0xhYmVsKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQl0aGlzLmFjY2Vzc0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQl0aGlzLmFjY2Vzc0NvbWJvID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAxOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0aGlzLmFjY2Vzc0NvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRoaXMuc3luY2hIZWxwZXIuc3luY2hDb21ibyh0aGlzLmFjY2Vzc0NvbWJvLCBERUZBVUxUX0FDQ0VTUywgbnVsbCk7Ci0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCi0JCXRoaXMuYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULkJFR0lOTklORyk7Ci0JCXRoaXMuYWRkVG9QZXJzaXN0ZW5jZVVuaXRCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLk1hcHBpbmdGaWxlV2l6YXJkUGFnZV9hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCWRhdGEudmVydGljYWxJbmRlbnQgPSAxMDsKLQkJdGhpcy5hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ2hlY2tib3godGhpcy5hZGRUb1BlcnNpc3RlbmNlVW5pdEJ1dHRvbiwgQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIG51bGwpOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX3BlcnNpc3RlbmNlVW5pdExhYmVsKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQl0aGlzLmFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwZXJzaXN0ZW5jZVVuaXRMYWJlbC5zZXRFbmFibGVkKGFkZFRvUGVyc2lzdGVuY2VVbml0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Lypub3QgY2FsbGVkKi99Ci0JCX0pOwotCQkKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMTsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0aGlzLnN5bmNoSGVscGVyLnN5bmNoQ29tYm8odGhpcy5wZXJzaXN0ZW5jZVVuaXRDb21ibywgUEVSU0lTVEVOQ0VfVU5JVCwgbnVsbCk7Ci0JCQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQotLy8JCWNsYXNzVGV4dC5zZXRGb2N1cygpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgZ2V0SW5mb3BvcElEKCkpOwotCSAgICBEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZVdpemFyZC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL29ybS9NYXBwaW5nRmlsZVdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTMwZWZlLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9vcm0vTWFwcGluZ0ZpbGVXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMub3JtOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy4qOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnV0aWxpdHkuUGxhdGZvcm1Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhQ29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnB0SnBhVWlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaUljb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuSnB0VWlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGF0YW1vZGVsLklEYXRhTW9kZWxQYXVzaWJsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuaW50ZXJuYWwuZGlhbG9nLnVpLldhcm5pbmdEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnVpLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC51aS5XVFBDb21tb25VSVJlc291cmNlSGFuZGxlcjsKLQotcHVibGljIGNsYXNzIE1hcHBpbmdGaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkCi0JaW1wbGVtZW50cyBJTmV3V2l6YXJkIAotewotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGRhdGFNb2RlbDsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gaW5pdGlhbFNlbGVjdGlvbjsKLQkKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gbXVuZ2VkU2VsZWN0aW9uOwotCQotCXByaXZhdGUgSVdpemFyZFBhZ2UgZmlyc3RQYWdlOwotCQotCXByaXZhdGUgSVdpemFyZFBhZ2Ugc2Vjb25kUGFnZTsKLQkKLQkKLQlwdWJsaWMgTWFwcGluZ0ZpbGVXaXphcmQoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCQotCXB1YmxpYyBNYXBwaW5nRmlsZVdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLmRhdGFNb2RlbCA9IGRhdGFNb2RlbDsKLQkJc2V0V2luZG93VGl0bGUoSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZF90aXRsZSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEpwdEpwYVVpUGx1Z2luLmdldEltYWdlRGVzY3JpcHRvcihKcHRVaUljb25zLkpQQV9GSUxFX1dJWl9CQU5ORVIpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRoaXMuaW5pdGlhbFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJdGhpcy5tdW5nZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQotCQlpZiAoc2VsZWN0aW9uID09IG51bGwgfHwgc2VsZWN0aW9uLmlzRW1wdHkoKSkgewkKLQkJCXJldHVybjsKLQkJfQotCQkKLQkJT2JqZWN0IGZpcnN0U2VsZWN0aW9uID0gc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0IHBVbml0ID0gZXh0cmFjdFBlcnNpc3RlbmNlVW5pdChmaXJzdFNlbGVjdGlvbik7Ci0JCUlDb250YWluZXIgY29udGFpbmVyID0gZXh0cmFjdENvbnRhaW5lcihwVW5pdCwgZmlyc3RTZWxlY3Rpb24pOwotCQkKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQl0aGlzLm11bmdlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGNvbnRhaW5lcik7Ci0JCX0KLQkJCi0JCWlmIChwVW5pdCAhPSBudWxsKSB7Ci0JCQlnZXREYXRhTW9kZWwoKS5zZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX1BFUlNJU1RFTkNFX1VOSVQsIHRydWUpOwotCQkJZ2V0RGF0YU1vZGVsKCkuc2V0U3RyaW5nUHJvcGVydHkoUEVSU0lTVEVOQ0VfVU5JVCwgcFVuaXQuZ2V0TmFtZSgpKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBleHRyYWN0UGVyc2lzdGVuY2VVbml0KE9iamVjdCBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEpwYUNvbnRleHROb2RlKSB7Ci0JCQkvLyBtYXkgYmUgbnVsbCBpZiBub2RlIGlzIGFib3ZlIGxldmVsIG9mIHBlcnNpc3RlbmNlIHVuaXQsIGJ1dCBpbiB0aG9zZSBjYXNlcwotCQkJLy8gbnVsbCBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0Ci0JCQl0cnkgewotCQkJCXJldHVybiAoKEpwYUNvbnRleHROb2RlKSBzZWxlY3Rpb24pLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IC8qIGRvIG5vdGhpbmcsIGp1c3QgY29udGludWUgKi8gfQotCQl9Ci0JCQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSnBhQ29udGV4dE5vZGUgbm9kZSA9IChKcGFDb250ZXh0Tm9kZSkgKChJQWRhcHRhYmxlKSBzZWxlY3Rpb24pLmdldEFkYXB0ZXIoSnBhQ29udGV4dE5vZGUuY2xhc3MpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXJldHVybiBub2RlLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJfQotCQl9Ci0JCQotCQkvL2Fsc28gZ2V0IHRoZSBwZXJzaXN0ZW5jZSB1bml0IGZvciBhIGdpdmVuIGpwYSBwcm9qZWN0IHNlbGVjdGlvbgotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gKEpwYVByb2plY3QpICgoSUFkYXB0YWJsZSkgc2VsZWN0aW9uKS5nZXRBZGFwdGVyKEpwYVByb2plY3QuY2xhc3MpOwotCQkJaWYgKGpwYVByb2plY3QgIT0gbnVsbCkgewotCQkJCVBlcnNpc3RlbmNlWG1sIHBlcnNpc3RlbmNlWG1sID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQkJCWlmIChwZXJzaXN0ZW5jZVhtbCAhPSBudWxsKXsKLQkJCQkJUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVhtbC5nZXRQZXJzaXN0ZW5jZSgpOwotCQkJCQlpZiAocGVyc2lzdGVuY2UgIT0gbnVsbCAmJiBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpID4gMCkgewotCQkJCQkJcmV0dXJuIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29udGFpbmVyIGV4dHJhY3RDb250YWluZXIoUGVyc2lzdGVuY2VVbml0IHBVbml0LCBPYmplY3Qgc2VsZWN0aW9uKSB7Ci0JCWlmIChwVW5pdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcFVuaXQuZ2V0UmVzb3VyY2UoKS5nZXRQYXJlbnQoKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCXJldHVybiBnZXREZWZhdWx0Q29udGFpbmVyKChJUHJvamVjdCkgc2VsZWN0aW9uKTsKLQkJfQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJcmV0dXJuIChJQ29udGFpbmVyKSBzZWxlY3Rpb247Ci0JCX0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIEpwYUNvbnRleHROb2RlKSB7Ci0JCQlyZXR1cm4gZ2V0RGVmYXVsdENvbnRhaW5lcigoKEpwYUNvbnRleHROb2RlKSBzZWxlY3Rpb24pLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQl9Ci0JCQotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSUFkYXB0YWJsZSkgewotCQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgKChJQWRhcHRhYmxlKSBzZWxlY3Rpb24pLmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJcmV0dXJuIGdldERlZmF1bHRDb250YWluZXIoKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQlyZXR1cm4gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCX0KLQkJCX0KLQkJCUpwYUNvbnRleHROb2RlIG5vZGUgPSAoSnBhQ29udGV4dE5vZGUpICgoSUFkYXB0YWJsZSkgc2VsZWN0aW9uKS5nZXRBZGFwdGVyKEpwYUNvbnRleHROb2RlLmNsYXNzKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdENvbnRhaW5lcihub2RlLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElDb250YWluZXIgZ2V0RGVmYXVsdENvbnRhaW5lcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChKcGFGYWNldC5pc0luc3RhbGxlZChwcm9qZWN0KSkgewotCQkJcmV0dXJuIEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpLmdldERlZmF1bHRSZXNvdXJjZUxvY2F0aW9uKHByb2plY3QpOwotCQl9Ci0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQkJdGhpcy5maXJzdFBhZ2UgPSBidWlsZE1hcHBpbmdGaWxlTmV3RmlsZVdpemFyZFBhZ2UoKTsKLQkJdGhpcy5zZWNvbmRQYWdlID0gYnVpbGRNYXBwaW5nRmlsZU9wdGlvbnNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UodGhpcy5maXJzdFBhZ2UpOwotCQlhZGRQYWdlKHRoaXMuc2Vjb25kUGFnZSk7Ci0JfQotCQotCXByb3RlY3RlZCBNYXBwaW5nRmlsZU5ld0ZpbGVXaXphcmRQYWdlIGJ1aWxkTWFwcGluZ0ZpbGVOZXdGaWxlV2l6YXJkUGFnZSgpIHsKLQkJcmV0dXJuIG5ldyBNYXBwaW5nRmlsZU5ld0ZpbGVXaXphcmRQYWdlKAotCQkJCSJQYWdlXzEiLCB0aGlzLm11bmdlZFNlbGVjdGlvbiwgZ2V0RGF0YU1vZGVsKCksCi0JCQkJSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV90aXRsZSwgCi0JCQkJSnB0VWlNZXNzYWdlcy5NYXBwaW5nRmlsZVdpemFyZFBhZ2VfbmV3RmlsZV9kZXNjKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UgYnVpbGRNYXBwaW5nRmlsZU9wdGlvbnNXaXphcmRQYWdlKCkgewotCQlyZXR1cm4gbmV3IE1hcHBpbmdGaWxlT3B0aW9uc1dpemFyZFBhZ2UoCi0JCQkJIlBhZ2VfMiIsIGdldERhdGFNb2RlbCgpLAotCQkJCUpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfdGl0bGUsIAotCQkJCUpwdFVpTWVzc2FnZXMuTWFwcGluZ0ZpbGVXaXphcmRQYWdlX29wdGlvbnNfZGVzYyk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJLy8gb3ZlcnJpZGUgc28gdGhhdCB2aXNpdCB0byBzZWNvbmQgcGFnZSBpcyBub3QgbmVjZXNzYXJ5Ci0JCXJldHVybiB0aGlzLmZpcnN0UGFnZS5pc1BhZ2VDb21wbGV0ZSgpICYmIGdldERhdGFNb2RlbCgpLmlzVmFsaWQoKTsKLQl9Ci0JCi0JcHVibGljIElEYXRhTW9kZWwgZ2V0RGF0YU1vZGVsKCkgewotCQlpZiAodGhpcy5kYXRhTW9kZWwgPT0gbnVsbCkgewotCQkJdGhpcy5kYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChnZXREZWZhdWx0UHJvdmlkZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZGF0YU1vZGVsOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbFBhdXNpYmxlT3BlcmF0aW9uIGdldE9wZXJhdGlvbigpIHsKLQkJcmV0dXJuIChJRGF0YU1vZGVsUGF1c2libGVPcGVyYXRpb24pIGdldERhdGFNb2RlbCgpLmdldERlZmF1bHRPcGVyYXRpb24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJdHJ5IHsKLQkJCWZpbmFsIElTdGF0dXMgc3QgPSBydW5PcGVyYXRpb25zKCk7Ci0JCQkKLQkJCWlmIChzdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlKcHRKcGFVaVBsdWdpbi5sb2coc3QpOwotCQkJCVRocm93YWJsZSB0ID0gc3QuZ2V0RXhjZXB0aW9uKCkgPT0gbnVsbCA/IG5ldyBDb3JlRXhjZXB0aW9uKHN0KSA6IHN0LmdldEV4Y2VwdGlvbigpOwotCQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJCWdldFNoZWxsKCksIAotCQkJCQkJV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8wLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCAKLQkJCQkJCVdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgCi0JCQkJCQl0LCAwLCBmYWxzZSk7Ci0JCQl9IAotCQkJZWxzZSBpZihzdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORyl7Ci0JCQkJV2FybmluZ0RpYWxvZy5vcGVuV2FybmluZygKLQkJCQkJCWdldFNoZWxsKCksIAotCQkJCQkJV1RQQ29tbW9uVUlSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKFdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLldUUFdpemFyZF9VSV8yLCBuZXcgT2JqZWN0W117Z2V0V2luZG93VGl0bGUoKX0pLCAKLQkJCQkJCXN0LmdldE1lc3NhZ2UoKSwgCi0JCQkJCQlzdCwgSVN0YXR1cy5XQVJOSU5HKTsKLQkJCX0KLQkJCQotCQkJcG9zdFBlcmZvcm1GaW5pc2goKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUpwdEpwYVVpUGx1Z2luLmxvZyhlKTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJZ2V0U2hlbGwoKSwgCi0JCQkJCVdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMCwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgCi0JCQkJCVdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgCi0JCQkJCWUsIDAsIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJU3RhdHVzIHJ1bk9wZXJhdGlvbnMoKSB7Ci0JCQotCQljbGFzcyBDYXRjaFRocm93YWJsZVJ1bm5hYmxlV2l0aFByb2dyZXNzCi0JCQkJaW1wbGVtZW50cyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MgewotCQkJCi0JCQlwdWJsaWMgSVN0YXR1cyBzdGF0dXMgPSBudWxsOwotCQkJcHVibGljIFRocm93YWJsZSBjYXVnaHQgPSBudWxsOwotCQkJCi0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkJCXRyeSB7Ci0JCQkJCXN0YXR1cyA9IGdldE9wZXJhdGlvbigpLmV4ZWN1dGUocG0sIG51bGwpOwotCQkJCX0gCi0JCQkJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWNhdWdodCA9IGU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlDYXRjaFRocm93YWJsZVJ1bm5hYmxlV2l0aFByb2dyZXNzIHJ1bm5hYmxlID0gbmV3IENhdGNoVGhyb3dhYmxlUnVubmFibGVXaXRoUHJvZ3Jlc3MoKTsKLQkJCi0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4odHJ1ZSwgZmFsc2UsIHJ1bm5hYmxlKTsKLQkJfSAKLQkJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQlydW5uYWJsZS5jYXVnaHQgPSBlOwotCQl9Ci0JCQotCQlpZiAocnVubmFibGUuY2F1Z2h0ID09IG51bGwpIHsKLQkJCXJldHVybiBydW5uYWJsZS5zdGF0dXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlKcHRKcGFVaVBsdWdpbi5sb2cocnVubmFibGUuY2F1Z2h0KTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcigKLQkJCQkJZ2V0U2hlbGwoKSwgCi0JCQkJCVdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMCwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgCi0JCQkJCVdUUENvbW1vblVJUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZyhXVFBDb21tb25VSVJlc291cmNlSGFuZGxlci5XVFBXaXphcmRfVUlfMSwgbmV3IE9iamVjdFtde2dldFdpbmRvd1RpdGxlKCl9KSwgCi0JCQkJCXJ1bm5hYmxlLmNhdWdodCwgMCwgZmFsc2UpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgImlkIiwgMCwgcnVubmFibGUuY2F1Z2h0LmdldE1lc3NhZ2UoKSwgcnVubmFibGUuY2F1Z2h0KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RQZXJmb3JtRmluaXNoKCkKLQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsgICAgICAKLQkJCi0JCXRyeSB7Ci0JCQlJUGF0aCBjb250YWluZXJQYXRoID0gKElQYXRoKSBnZXREYXRhTW9kZWwoKS5nZXRQcm9wZXJ0eShDT05UQUlORVJfUEFUSCk7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXREYXRhTW9kZWwoKS5nZXRTdHJpbmdQcm9wZXJ0eShGSUxFX05BTUUpOwotCQkJSUNvbnRhaW5lciBjb250YWluZXIgPSBQbGF0Zm9ybVRvb2xzLmdldENvbnRhaW5lcihjb250YWluZXJQYXRoKTsKLQkJCUlGaWxlIGZpbGUgPSBjb250YWluZXIuZ2V0RmlsZShuZXcgUGF0aChmaWxlTmFtZSkpOwotCQkJb3BlbkVkaXRvcihmaWxlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGNhbnRPcGVuKSB7Ci0JCQl0aHJvdyBuZXcgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbihjYW50T3Blbik7Ci0JCX0gCi0JfQotCQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAJSnB0SnBhVWlQbHVnaW4ubG9nKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLSAgICB9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlnZXREYXRhTW9kZWwoKS5kaXNwb3NlKCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggY3JlYXRlTmV3TWFwcGluZ0ZpbGUoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uLCBTdHJpbmcgeG1sRmlsZU5hbWUpIHsKLQkJTWFwcGluZ0ZpbGVXaXphcmQgd2l6YXJkID0gbmV3IE1hcHBpbmdGaWxlV2l6YXJkKERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKSk7Ci0JCXdpemFyZC5nZXREYXRhTW9kZWwoKS5zZXRQcm9wZXJ0eShGSUxFX05BTUUsIHhtbEZpbGVOYW1lKTsKLQkJd2l6YXJkLmluaXQoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uKTsKLQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0Q3VycmVudFNoZWxsKCksIHdpemFyZCk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlJUGF0aCBjb250YWluZXJQYXRoID0gKElQYXRoKSB3aXphcmQuZ2V0RGF0YU1vZGVsKCkuZ2V0UHJvcGVydHkoQ09OVEFJTkVSX1BBVEgpOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gd2l6YXJkLmdldERhdGFNb2RlbCgpLmdldFN0cmluZ1Byb3BlcnR5KEZJTEVfTkFNRSk7Ci0JCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IFBsYXRmb3JtVG9vbHMuZ2V0Q29udGFpbmVyKGNvbnRhaW5lclBhdGgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBjb250YWluZXIuZ2V0RnVsbFBhdGgoKS5hcHBlbmQoZmlsZU5hbWUpOwotCQkJSVByb2plY3QgcHJvamVjdCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0KCk7Ci0JCQlJUGF0aCBydW50aW1lUGF0aCA9IEpwdENvbW1vbkNvcmVQbHVnaW4uZ2V0UmVzb3VyY2VMb2NhdG9yKHByb2plY3QpLmdldFJ1bnRpbWVQYXRoKHByb2plY3QsIGZpbGVQYXRoKTsKLQkJCQotCQkJcmV0dXJuIHJ1bnRpbWVQYXRoOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFNoZWxsIGdldEN1cnJlbnRTaGVsbCgpIHsKLQkgICAgcmV0dXJuIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCk7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL0FkZFRvRWFyQ29tcG9zaXRlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9BZGRUb0VhckNvbXBvc2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjRmMWVmLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL0FkZFRvRWFyQ29tcG9zaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMucHJvajsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMucHJvai5tb2RlbC5KcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLio7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UubGF5b3V0LkdyaWREYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmREaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qMmVlLnVpLnByb2plY3QuZmFjZXQuRWFyUHJvamVjdFdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLmRhdGFtb2RlbC51aS5EYXRhTW9kZWxTeW5jaEhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5ydW50aW1lLklSdW50aW1lOwotCi1wdWJsaWMgY2xhc3MgQWRkVG9FYXJDb21wb3NpdGUgewotCQotCXByaXZhdGUgZmluYWwgQnV0dG9uIGFkZFRvRWFyOwotCXByaXZhdGUgZmluYWwgQ29tYm8gY29tYm87Ci0JcHJpdmF0ZSBmaW5hbCBCdXR0b24gbmV3QnV0dG9uOwotCXByaXZhdGUgZmluYWwgTGFiZWwgbGFiZWw7Ci0JCi0JcHJpdmF0ZSBmaW5hbCBJRGF0YU1vZGVsIG1vZGVsOwotCXByaXZhdGUgRGF0YU1vZGVsU3luY2hIZWxwZXIgc3luY2hoZWxwZXI7Ci0JCi0JcHVibGljIEFkZFRvRWFyQ29tcG9zaXRlKElEYXRhTW9kZWwgbW9kZWwsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLnN5bmNoaGVscGVyID0gbmV3IERhdGFNb2RlbFN5bmNoSGVscGVyKG1vZGVsKTsKLQkJCi0JCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCWdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCQlncm91cC5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuQWRkVG9FYXJDb21wb3NpdGVfZWFyTWVtYmVyU2hpcCk7Ci0JCQotCQl0aGlzLmFkZFRvRWFyID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJdGhpcy5hZGRUb0Vhci5zZXRUZXh0KEpwdFVpTWVzc2FnZXMuQWRkVG9FYXJDb21wb3NpdGVfYWRkVG9FYXJMYWJlbCk7Ci0JCUdyaWREYXRhRmFjdG9yeS5kZWZhdWx0c0Zvcih0aGlzLmFkZFRvRWFyKS5zcGFuKDMsIDEpLmFwcGx5VG8odGhpcy5hZGRUb0Vhcik7Ci0JCXRoaXMuc3luY2hoZWxwZXIuc3luY2hDaGVja2JveChhZGRUb0VhciwgQUREX1RPX0VBUiwgbnVsbCk7Ci0JCQotCQl0aGlzLmxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTlVMTCk7Ci0JCXRoaXMubGFiZWwuc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkFkZFRvRWFyQ29tcG9zaXRlX2VhclByb2plY3RMYWJlbCk7Ci0JCXRoaXMuY29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5OT05FKTsKLQkJdGhpcy5jb21iby5zZXRMYXlvdXREYXRhKGdkaGZpbGwoKSk7Ci0JCQotCQl0aGlzLm5ld0J1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5QVVNIKTsKLQkJdGhpcy5uZXdCdXR0b24uc2V0VGV4dChKcHRVaU1lc3NhZ2VzLkFkZFRvRWFyQ29tcG9zaXRlX25ld0J1dHRvbkxhYmVsKTsKLQkJR3JpZERhdGFGYWN0b3J5LmRlZmF1bHRzRm9yKHRoaXMubmV3QnV0dG9uKS5hcHBseVRvKHRoaXMubmV3QnV0dG9uKTsKLQkJCi0JCXRoaXMubmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKAotCQkJbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJaGFuZGxlQWRkQnV0dG9uKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQotCQl0aGlzLnN5bmNoaGVscGVyLnN5bmNoQ29tYm8oY29tYm8sIEVBUl9QUk9KRUNUX05BTUUsIG5ldyBDb250cm9sW117bGFiZWwsIG5ld0J1dHRvbn0pOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBoYW5kbGVBZGRCdXR0b24oKSB7Ci0JCUVhclByb2plY3RXaXphcmQgd2l6YXJkID0gbmV3IEVhclByb2plY3RXaXphcmQoKTsKLQkJCi0JCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKG5ld0J1dHRvbi5nZXRTaGVsbCgpLCB3aXphcmQpOwotCQkKLQkJSVJ1bnRpbWUgcnVudGltZSA9IChJUnVudGltZSkgdGhpcy5tb2RlbC5nZXRQcm9wZXJ0eShGQUNFVF9SVU5USU1FKTsKLQkJd2l6YXJkLnNldFJ1bnRpbWVJbkRhdGFNb2RlbChydW50aW1lKTsKLQkJCi0JCWlmIChkaWFsb2cub3BlbigpICE9IFdpbmRvdy5DQU5DRUwpIHsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCVN0cmluZyBlYXJwcm9qID0gd2l6YXJkLmdldFByb2plY3ROYW1lKCk7Ci0JCQl0aGlzLm1vZGVsLnNldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUsIGVhcnByb2opOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIEdyaWREYXRhIGdkaGZpbGwoKSB7Ci0JCXJldHVybiBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBHcmlkRGF0YSBnZGhzcGFuKEdyaWREYXRhIGdkLCBpbnQgc3BhbikgewotCQlnZC5ob3Jpem9udGFsU3BhbiA9IHNwYW47Ci0JCXJldHVybiBnZDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHRoaXMuc3luY2hoZWxwZXIgIT0gbnVsbCl7Ci0JCQl0aGlzLnN5bmNoaGVscGVyLmRpc3Bvc2UoKTsKLQkJCXRoaXMuc3luY2hoZWxwZXIgPSBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tYm9UZXh0KCl7Ci0JCXJldHVybiB0aGlzLmNvbWJvLmdldFRleHQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KcGFQcm9qZWN0V2l6YXJkLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KcGFQcm9qZWN0V2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Njc3OTUuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSnBhUHJvamVjdFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMucHJvajsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5KcHRKcGFVaVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpSWNvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcHRVaU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLm1vZGVsLkpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0VGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbnRlcm5hbC53aXphcmRzLk5ld1Byb2plY3REYXRhTW9kZWxGYWNldFdpemFyZDsKLQotcHVibGljIGNsYXNzIEpwYVByb2plY3RXaXphcmQKLQkJZXh0ZW5kcyBOZXdQcm9qZWN0RGF0YU1vZGVsRmFjZXRXaXphcmQgewotCQotCXB1YmxpYyBKcGFQcm9qZWN0V2l6YXJkKCkgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLkpwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQkKLQlwdWJsaWMgSnBhUHJvamVjdFdpemFyZChJRGF0YU1vZGVsIGRhdGFNb2RlbCkgewotCQlzdXBlcihkYXRhTW9kZWwpOwotCQlzZXRXaW5kb3dUaXRsZShKcHRVaU1lc3NhZ2VzLkpwYVByb2plY3RXaXphcmRfdGl0bGUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGdldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKCkgewotCQlyZXR1cm4gSnB0SnBhVWlQbHVnaW4uZ2V0SW1hZ2VEZXNjcmlwdG9yKEpwdFVpSWNvbnMuSlBBX1dJWl9CQU5ORVIpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSVdpemFyZFBhZ2UgY3JlYXRlRmlyc3RQYWdlKCkgewotCQlyZXR1cm4gbmV3IEpwYVByb2plY3RXaXphcmRGaXJzdFBhZ2UobW9kZWwsICJmaXJzdC5wYWdlIik7IC8vJE5PTi1OTFMtMSQgCi0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGNyZWF0ZURhdGFNb2RlbCgpIHsKLQkJcmV0dXJuIERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFRlbXBsYXRlIGdldFRlbXBsYXRlKCkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0VGVtcGxhdGUoImpwdC5qcGEudGVtcGxhdGUiKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5hbFBlcnNwZWN0aXZlSUQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanB0LnVpLmpwYVBlcnNwZWN0aXZlIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KcGFQcm9qZWN0V2l6YXJkRmlyc3RQYWdlLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9KcGFQcm9qZWN0V2l6YXJkRmlyc3RQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjExYTAuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovSnBhUHJvamVjdFdpemFyZEZpcnN0UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqICB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqICBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IE9yYWNsZS4gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMucHJvajsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkZhY2V0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5KcGFIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkpwdFVpTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC53aXphcmRzLnByb2oubW9kZWwuSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW50ZXJuYWwud2l6YXJkcy5EYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZTsKLQotcHVibGljIGNsYXNzIEpwYVByb2plY3RXaXphcmRGaXJzdFBhZ2UKLQkJZXh0ZW5kcyBEYXRhTW9kZWxGYWNldENyZWF0aW9uV2l6YXJkUGFnZSAgewotCQotCXByaXZhdGUgQWRkVG9FYXJDb21wb3NpdGUgYWRkVG9FYXJDb21wb3NpdGU7Ci0JCi0JcHVibGljIEpwYVByb2plY3RXaXphcmRGaXJzdFBhZ2UoSURhdGFNb2RlbCBkYXRhTW9kZWwsIFN0cmluZyBwYWdlTmFtZSkgewotCQlzdXBlcihkYXRhTW9kZWwsIHBhZ2VOYW1lKTsKLQkJc2V0VGl0bGUoSnB0VWlNZXNzYWdlcy5OZXdKcGFQcm9qZWN0V2l6YXJkX2ZpcnN0UGFnZV90aXRsZSk7Ci0JCXNldERlc2NyaXB0aW9uKEpwdFVpTWVzc2FnZXMuTmV3SnBhUHJvamVjdFdpemFyZF9maXJzdFBhZ2VfZGVzY3JpcHRpb24pOwotCQlzZXRJbmZvcG9wSUQoSnBhSGVscENvbnRleHRJZHMuTkVXX0pQQV9QUk9KRUNUKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWZpbmFsIENvbXBvc2l0ZSB0b3AgPSBzdXBlci5jcmVhdGVUb3BMZXZlbENvbXBvc2l0ZShwYXJlbnQpOwotCQljcmVhdGVFYXJDb21wb3NpdGUodG9wKTsKLQkJY3JlYXRlV29ya2luZ1NldEdyb3VwUGFuZWwodG9wLCBuZXcgU3RyaW5nW10geyBSRVNPVVJDRV9XT1JLSU5HX1NFVCwgSkFWQV9XT1JLSU5HX1NFVCB9KTsKLQkJcmV0dXJuIHRvcDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVhckNvbXBvc2l0ZShDb21wb3NpdGUgdG9wKSB7Ci0JCXRoaXMuYWRkVG9FYXJDb21wb3NpdGUgPSBuZXcgQWRkVG9FYXJDb21wb3NpdGUoZ2V0RGF0YU1vZGVsKCksIHRvcCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGludGVybmFsTGF1bmNoTmV3UnVudGltZVdpemFyZChTaGVsbCBzaGVsbCwgSURhdGFNb2RlbCBtb2RlbCkgewotCQlJRmFjZXRlZFByb2plY3RXb3JraW5nQ29weSBmcHdjID0gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSBtb2RlbC5nZXRQcm9wZXJ0eShGQUNFVEVEX1BST0pFQ1RfV09SS0lOR19DT1BZKTsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gbW9kdWxlRmFjZXQgPSBGYWNldFRvb2xzLmdldE1vZHVsZUZhY2V0KGZwd2MpOwotCQlpZiAobW9kdWxlRmFjZXQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGxhdW5jaE5ld1J1bnRpbWVXaXphcmQoc2hlbGwsIG1vZGVsLCBtb2R1bGVGYWNldC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBsYXVuY2hOZXdSdW50aW1lV2l6YXJkKHNoZWxsLCBtb2RlbCk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2R1bGVUeXBlSUQoKSB7Ci0JCXJldHVybiBKcGFGYWNldC5JRDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQl0aGlzLmFkZFRvRWFyQ29tcG9zaXRlLmRpc3Bvc2UoKTsKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcmVEZWZhdWx0U2V0dGluZ3MoKSB7Ci0gICAgCXN1cGVyLnN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgCS8vIFRPRE8KLS8vICAgIAlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotLy8gICAgCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0vLyAgICAJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0vLyAgICAJCVN0cmluZyBmYWNldElEID0gZ2V0TW9kdWxlRmFjZXRJRCgpOwotLy8gICAgCQlJRGF0YU1vZGVsIGoyZWVNb2RlbCA9IG1hcC5nZXRGYWNldERhdGFNb2RlbChmYWNldElEKTsKLS8vICAgIAkJaWYoajJlZU1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUikpewotLy8gICAgCQkJU3RyaW5nIGxhc3RFQVJOYW1lID0gajJlZU1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLS8vICAgIAkJCXNldHRpbmdzLnB1dChTVE9SRV9MQUJFTCwgbGFzdEVBUk5hbWUpOwotLy8gICAgCQl9Ci0vLyAgICAJfQotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlRGVmYXVsdFNldHRpbmdzKCkgewotICAgIAlzdXBlci5yZXN0b3JlRGVmYXVsdFNldHRpbmdzKCk7Ci0gICAgICAgIC8vIFRPRE8KLS8vICAgIAlJRGlhbG9nU2V0dGluZ3Mgc2V0dGluZ3MgPSBnZXREaWFsb2dTZXR0aW5ncygpOwotLy8gICAgCWlmIChzZXR0aW5ncyAhPSBudWxsKSB7Ci0vLyAgICAJCVN0cmluZyBsYXN0RUFSTmFtZSA9IHNldHRpbmdzLmdldChTVE9SRV9MQUJFTCk7Ci0vLyAgICAJCWlmIChsYXN0RUFSTmFtZSAhPSBudWxsKXsKLS8vICAgIAkJCUZhY2V0RGF0YU1vZGVsTWFwIG1hcCA9IChGYWNldERhdGFNb2RlbE1hcCltb2RlbC5nZXRQcm9wZXJ0eShJRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX0RNX01BUCk7Ci0vLyAgICAJCQlTdHJpbmcgZmFjZXRJRCA9IGdldE1vZHVsZUZhY2V0SUQoKTsKLS8vICAgIAkJCUlEYXRhTW9kZWwgajJlZU1vZGVsID0gbWFwLmdldEZhY2V0RGF0YU1vZGVsKGZhY2V0SUQpOwotLy8gICAgCQkJajJlZU1vZGVsLnNldFByb3BlcnR5KElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5MQVNUX0VBUl9OQU1FLCBsYXN0RUFSTmFtZSk7Ci0vLyAgICAJCX0KLS8vICAgIAl9Ci0gICAgfQotICAgIAotLy8gICAgQE92ZXJyaWRlCi0vLyAgICBwcm90ZWN0ZWQgSURpYWxvZ1NldHRpbmdzIGdldERpYWxvZ1NldHRpbmdzKCkgewotLy8gICAgCXJldHVybiBKMkVFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCk7Ci0vLyAgICB9Ci0gICAgCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFZhbGlkYXRpb25Qcm9wZXJ0eU5hbWVzKCkgewotCQlTdHJpbmdbXSBzdXBlclByb3BlcnRpZXMgPSBzdXBlci5nZXRWYWxpZGF0aW9uUHJvcGVydHlOYW1lcygpOwotCQlMaXN0IGxpc3QgPSBBcnJheXMuYXNMaXN0KHN1cGVyUHJvcGVydGllcyk7Ci0JCUFycmF5TGlzdDxTdHJpbmc+IGFycmF5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlhcnJheUxpc3QuYWRkQWxsKGxpc3QpOwotCQlhcnJheUxpc3QuYWRkKEpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCWFycmF5TGlzdC5hZGQoSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSICk7Ci0JCXJldHVybiBhcnJheUxpc3QudG9BcnJheSggbmV3IFN0cmluZ1swXSApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL21vZGVsL0pwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL21vZGVsL0pwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5Njg4OS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2ludGVybmFsL3dpemFyZHMvcHJvai9tb2RlbC9KcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcwotCQlleHRlbmRzIElGYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMgewotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PRFVMRV9GQUNFVF9EQVRBX01PREVMIAotCQkJPSAiSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5NT0RVTEVfRkFDRVRfREFUQV9NT0RFTCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERFRF9VVElMSVRZX0ZBQ0VUCi0JCQk9ICJKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkFEREVEX1VUSUxJVFlfRkFDRVQiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX1RPX0VBUiAKLQkJCT0gIkpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQVJfUFJPSkVDVF9OQU1FIAotCQkJPSAiSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovbW9kZWwvSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvaW50ZXJuYWwvd2l6YXJkcy9wcm9qL21vZGVsL0pwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmVmNTkuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9pbnRlcm5hbC93aXphcmRzL3Byb2ovbW9kZWwvSnBhUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5wcm9qLm1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5GYWNldFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLkphdmFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5pbnRlcm5hbC5wbHVnaW4uSjJFRVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuajJlZS5wcm9qZWN0LmZhY2V0LklKMkVFRmFjZXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmoyZWUucHJvamVjdC5mYWNldC5JSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5GYWNldFByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5vcGVyYXRpb25zLlByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyTmV3OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5pbnRlcm5hbC5wbHVnaW4uV1RQQ29tbW9uTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmludGVybmFsLnBsdWdpbi5XVFBDb21tb25QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucnVudGltZS5JUnVudGltZTsKLQotcHVibGljIGNsYXNzIEpwYVByb2plY3RDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyCi0JCWV4dGVuZHMgRmFjZXRQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlciAKLQkJaW1wbGVtZW50cyBKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzIHsKLQkKLQlwcml2YXRlIElEYXRhTW9kZWxMaXN0ZW5lciBtb2R1bGVGYWNldERhdGFNb2RlbExpc3RlbmVyOwotCQotCQotCXB1YmxpYyBKcGFQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2R1bGVGYWNldERhdGFNb2RlbExpc3RlbmVyIAotCQkJPSBuZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChEYXRhTW9kZWxFdmVudCBldmVudCkgewotCQkJCQlpZiAoSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5TmFtZSgpKSkgewotCQkJCQkJaWYgKGlzUHJvcGVydHlTZXQoRUFSX1BST0pFQ1RfTkFNRSkpIHsKLQkJCQkJCQlzZXRQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FLCBldmVudC5nZXRQcm9wZXJ0eSgpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEVBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKElKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fRUFSLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJCXNldFByb3BlcnR5KEFERF9UT19FQVIsIGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFNldCBnZXRQcm9wZXJ0eU5hbWVzKCkgewotCQlTZXQgbmFtZXMgPSBzdXBlci5nZXRQcm9wZXJ0eU5hbWVzKCk7Ci0JCW5hbWVzLmFkZChNT0RVTEVfRkFDRVRfREFUQV9NT0RFTCk7Ci0JCW5hbWVzLmFkZChBRERFRF9VVElMSVRZX0ZBQ0VUKTsKLQkJbmFtZXMuYWRkKEVBUl9QUk9KRUNUX05BTUUpOwotCQluYW1lcy5hZGQoQUREX1RPX0VBUik7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCQkKLQkJQ29sbGVjdGlvbjxJUHJvamVjdEZhY2V0PiByZXF1aXJlZEZhY2V0cyA9IG5ldyBBcnJheUxpc3Q8SVByb2plY3RGYWNldD4oKTsKLQkJcmVxdWlyZWRGYWNldHMuYWRkKEphdmFGYWNldC5GQUNFVCk7Ci0JCXJlcXVpcmVkRmFjZXRzLmFkZChKcGFGYWNldC5GQUNFVCk7Ci0JCXNldFByb3BlcnR5KFJFUVVJUkVEX0ZBQ0VUU19DT0xMRUNUSU9OLCByZXF1aXJlZEZhY2V0cyk7Ci0JCQotCQlnZXREYXRhTW9kZWwoKS5hZGRMaXN0ZW5lcigKLQkJCQluZXcgSURhdGFNb2RlbExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoRGF0YU1vZGVsRXZlbnQgZXZlbnQpIHsKLQkJCQkJCWlmIChGQUNFVF9BQ1RJT05fTUFQLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eU5hbWUoKSkpIHsKLQkJCQkJCQl1cGRhdGVNb2R1bGVGYWNldERhdGFNb2RlbCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCWlmIChpc0FkZFRvRWFyKCkpIHsKLQkJCQlJU3RhdHVzIHN0YXR1cyA9IHZhbGlkYXRlRUFSKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlJUHJvamVjdCBlYXJQcm9qZWN0ID0gUHJvamVjdFV0aWxpdGllcy5nZXRQcm9qZWN0KGdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQkJaWYgKGVhclByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRFYXJQcm9qZWN0OwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlmYWNldGVkRWFyUHJvamVjdCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShlYXJQcm9qZWN0KTsKLQkJCQkJCQlpZiAoZmFjZXRlZEVhclByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJSjJFRVBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiBpc0FkZFRvRWFyKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5pc1Byb3BlcnR5RW5hYmxlZChwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChBRERFRF9VVElMSVRZX0ZBQ0VULmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKLQkJfQotCQllbHNlIGlmIChBRERfVE9fRUFSLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlJRGF0YU1vZGVsIG1vZHVsZUZhY2V0RGF0YU1vZGVsID0gZ2V0TW9kdWxlRmFjZXREYXRhTW9kZWwoKTsKLQkJCWlmIChtb2R1bGVGYWNldERhdGFNb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1vZHVsZUZhY2V0RGF0YU1vZGVsLmdldERlZmF1bHRQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoRUFSX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSURhdGFNb2RlbCBtb2R1bGVGYWNldERhdGFNb2RlbCA9IGdldE1vZHVsZUZhY2V0RGF0YU1vZGVsKCk7Ci0JCQlpZiAobW9kdWxlRmFjZXREYXRhTW9kZWwgIT1udWxsKSB7Ci0JCQkJcmV0dXJuIG1vZHVsZUZhY2V0RGF0YU1vZGVsLmdldERlZmF1bHRQcm9wZXJ0eShJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXREZWZhdWx0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltdIGdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChGQUNFVF9SVU5USU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpICYmIGlzQWRkVG9FYXIoKSkgewotCQkJRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBzdXBlci5nZXRWYWxpZFByb3BlcnR5RGVzY3JpcHRvcnMocHJvcGVydHlOYW1lKTsKLQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJUnVudGltZSBydCA9IChJUnVudGltZSkgZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHlWYWx1ZSgpOwotCQkJCWlmIChydCA9PSBudWxsIHx8IHJ0LnN1cHBvcnRzKElKMkVFRmFjZXRDb25zdGFudHMuRU5URVJQUklTRV9BUFBMSUNBVElPTl9GQUNFVCkpIHsKLQkJCQkJbGlzdC5hZGQoZGVzY3JpcHRvcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWRlc2NyaXB0b3JzID0gbmV3IERhdGFNb2RlbFByb3BlcnR5RGVzY3JpcHRvcltsaXN0LnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGVzY3JpcHRvcnNbaV0gPSAoRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yKSBsaXN0LmdldChpKTsKLQkJCX0KLQkJCXJldHVybiBkZXNjcmlwdG9yczsKLQkJfQotCQllbHNlIGlmIChFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7Ci0JCQlJRGF0YU1vZGVsIG1vZHVsZUZhY2V0RGF0YU1vZGVsID0gZ2V0TW9kdWxlRmFjZXREYXRhTW9kZWwoKTsKLQkJCWlmIChtb2R1bGVGYWNldERhdGFNb2RlbCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG1vZHVsZUZhY2V0RGF0YU1vZGVsLmdldFZhbGlkUHJvcGVydHlEZXNjcmlwdG9ycygKLQkJCQkJCUlKMkVFTW9kdWxlRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllcy5FQVJfUFJPSkVDVF9OQU1FKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBuZXcgRGF0YU1vZGVsUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQkJfQotCQl9Ci0JCQotCQlyZXR1cm4gc3VwZXIuZ2V0VmFsaWRQcm9wZXJ0eURlc2NyaXB0b3JzKHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHByb3BlcnR5U2V0KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlKSB7Ci0JCWlmIChFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IEFERF9UT19FQVIuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgRkFDRVRfUlVOVElNRS5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBNT0RVTEVfRkFDRVRfREFUQV9NT0RFTC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJSURhdGFNb2RlbCBtb2R1bGVGYWNldERhdGFNb2RlbCA9IGdldE1vZHVsZUZhY2V0RGF0YU1vZGVsKCk7Ci0JCQlpZiAobW9kdWxlRmFjZXREYXRhTW9kZWwgIT0gbnVsbCl7Ci0JCQkJaWYgKEVBUl9QUk9KRUNUX05BTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgTU9EVUxFX0ZBQ0VUX0RBVEFfTU9ERUwuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQkJbW9kdWxlRmFjZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoCi0JCQkJCQkJSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkVBUl9QUk9KRUNUX05BTUUsIGdldEVhclByb2plY3ROYW1lKCkpOwotCQkJCX0KLQkJCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBNT0RVTEVfRkFDRVRfREFUQV9NT0RFTC5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCQltb2R1bGVGYWNldERhdGFNb2RlbC5zZXRQcm9wZXJ0eSgKLQkJCQkJCQlJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQUREX1RPX0VBUiwgaXNBZGRUb0VhcigpKTsKLQkJCQl9Ci0JCQkJaWYgKEZBQ0VUX1JVTlRJTUUuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgTU9EVUxFX0ZBQ0VUX0RBVEFfTU9ERUwuZXF1YWxzKHByb3BlcnR5TmFtZSkpIHsKLQkJCQkJbW9kdWxlRmFjZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoCi0JCQkJCQkJSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1JVTlRJTUUsIGdldEZhY2V0UnVudGltZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXNBZGRUb0VhcigpKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVBUihtb2RlbC5nZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQkJCWlmIChlYXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCUlGYWNldGVkUHJvamVjdCBmYWNldGVkRWFyUHJvamVjdDsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZmFjZXRlZEVhclByb2plY3QgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUoZWFyUHJvamVjdCk7Ci0JCQkJCQkJaWYgKGZhY2V0ZWRFYXJQcm9qZWN0ICE9IG51bGwpIHsKLQkJCQkJCQkJc2V0UHJvcGVydHkoRkFDRVRfUlVOVElNRSwgZmFjZXRlZEVhclByb2plY3QuZ2V0UHJpbWFyeVJ1bnRpbWUoKSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCUoyRUVQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBtb2R1bGVGYWNldCA9IGZpbmRNb2R1bGVGYWNldCgpOwotCQkJCWlmIChpc0FkZFRvRWFyKCkpIHsKLQkJCQkJaWYgKG1vZHVsZUZhY2V0ID09IG51bGwpIHsKLQkJCQkJCWdldEZhY2V0ZWRQcm9qZWN0KCkuYWRkUHJvamVjdEZhY2V0KElKMkVFRmFjZXRDb25zdGFudHMuVVRJTElUWV9GQUNFVF8xMCk7Ci0JCQkJCQlzZXRCb29sZWFuUHJvcGVydHkoQURERURfVVRJTElUWV9GQUNFVCwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChtb2R1bGVGYWNldCAhPSBudWxsICYmIGlzQWRkZWRVdGlsaXR5RmFjZXQoKSkgewotCQkJCQkJaWYgKG1vZHVsZUZhY2V0LmVxdWFscyhJSjJFRUZhY2V0Q29uc3RhbnRzLlVUSUxJVFlfRkFDRVRfMTApKSB7Ci0JCQkJCQkJZ2V0RmFjZXRlZFByb2plY3QoKS5yZW1vdmVQcm9qZWN0RmFjZXQoSUoyRUVGYWNldENvbnN0YW50cy5VVElMSVRZX0ZBQ0VUXzEwKTsKLQkJCQkJCX0KLQkJCQkJCXNldEJvb2xlYW5Qcm9wZXJ0eShBRERFRF9VVElMSVRZX0ZBQ0VULCBmYWxzZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkVOQUJMRV9DSEcpOwotCQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEVBUl9QUk9KRUNUX05BTUUsIElEYXRhTW9kZWwuVkFMVUVfQ0hHKTsKLQkJCX0KLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRkFDRVRfUlVOVElNRSwgSURhdGFNb2RlbC5FTkFCTEVfQ0hHKTsKLQkJfQotCQkKLQkJcmV0dXJuIHN1cGVyLnByb3BlcnR5U2V0KHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSVN0YXR1cyBzdGF0dXMgPSBzdXBlci52YWxpZGF0ZShwcm9wZXJ0eU5hbWUpOwotCQkKLQkJaWYgKHN0YXR1cyA9PSBudWxsKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCQotCQlpZiAoISBzdGF0dXMuaXNPSygpKSB7Ci0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0JCQotCQlpZiAoQUREX1RPX0VBUi5lcXVhbHMocHJvcGVydHlOYW1lKSB8fCBFQVJfUFJPSkVDVF9OQU1FLmVxdWFscyhwcm9wZXJ0eU5hbWUpIHx8IEZBQ0VUX1BST0pFQ1RfTkFNRS5lcXVhbHMocHJvcGVydHlOYW1lKSkgewotCQkJaWYgKG1vZGVsLmdldEJvb2xlYW5Qcm9wZXJ0eShBRERfVE9fRUFSKSkgewotCQkJCXN0YXR1cyA9IHZhbGlkYXRlRUFSKG1vZGVsLmdldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQlpZiAoZ2V0U3RyaW5nUHJvcGVydHkoRkFDRVRfUFJPSkVDVF9OQU1FKS5lcXVhbHMoZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSkpKSB7Ci0JCQkJCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLlNBTUVfTU9EVUxFX0FORF9FQVJfTkFNRSwgbmV3IE9iamVjdFtde2dldFN0cmluZ1Byb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpfSk7Ci0JCQkJCQlzdGF0dXMgPSBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZUVBUihTdHJpbmcgZWFyTmFtZSkgewotCQlpZiAoZWFyTmFtZS5pbmRleE9mKCIjIikgIT0gLTEgfHwgZWFyTmFtZS5pbmRleE9mKCIvIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gV1RQQ29tbW9uUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKFdUUENvbW1vbk1lc3NhZ2VzLkVSUl9JTlZBTElEX0NIQVJTKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJfSAKLQkJZWxzZSBpZiAoZWFyTmFtZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBXVFBDb21tb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoV1RQQ29tbW9uTWVzc2FnZXMuRVJSX0VNUFRZX01PRFVMRV9OQU1FKTsKLQkJCXJldHVybiBXVFBDb21tb25QbHVnaW4uY3JlYXRlRXJyb3JTdGF0dXMoZXJyb3JNZXNzYWdlKTsKLQkJfQotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBQcm9qZWN0Q3JlYXRpb25EYXRhTW9kZWxQcm92aWRlck5ldy52YWxpZGF0ZVByb2plY3ROYW1lKGVhck5hbWUpOwotCQkvL2NoZWNrIGZvciB0aGUgZGVsZXRlZCBjYXNlLCB0aGUgcHJvamVjdCBpcyBkZWxldGVkIGZyb20gdGhlIHdvcmtzcGFjZSBidXQgc3RpbGwgZXhpc3RzIGluIHRoZQotCQkvL2ZpbGUgc3lzdGVtLgotCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJSVByb2plY3QgZWFyUHJvamVjdCA9IFByb2plY3RVdGlsaXRpZXMuZ2V0UHJvamVjdChnZXRTdHJpbmdQcm9wZXJ0eShFQVJfUFJPSkVDVF9OQU1FKSk7Ci0JCQlpZiAoISBlYXJQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQkJSVBhdGggcGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQkJCQlwYXRoID0gcGF0aC5hcHBlbmQoZWFyTmFtZSk7Ci0JCQkJc3RhdHVzID0gUHJvamVjdENyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXJOZXcudmFsaWRhdGVFeGlzdGluZyhlYXJOYW1lLCBwYXRoLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU1vZHVsZUZhY2V0RGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIG5ld01vZHVsZUZhY2V0RGF0YU1vZGVsID0gZmluZE1vZHVsZUZhY2V0RGF0YU1vZGVsKCk7Ci0JCUlEYXRhTW9kZWwgb2xkTW9kdWxlRmFjZXREYXRhTW9kZWwgPSBnZXRNb2R1bGVGYWNldERhdGFNb2RlbCgpOwotCQkKLQkJaWYgKG9sZE1vZHVsZUZhY2V0RGF0YU1vZGVsICE9IG5ld01vZHVsZUZhY2V0RGF0YU1vZGVsKSB7Ci0JCQlpZiAob2xkTW9kdWxlRmFjZXREYXRhTW9kZWwgIT0gbnVsbCkgewotCQkJCW9sZE1vZHVsZUZhY2V0RGF0YU1vZGVsLnJlbW92ZUxpc3RlbmVyKHRoaXMubW9kdWxlRmFjZXREYXRhTW9kZWxMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAobmV3TW9kdWxlRmFjZXREYXRhTW9kZWwgIT0gbnVsbCkgewotCQkJCW5ld01vZHVsZUZhY2V0RGF0YU1vZGVsLnNldFByb3BlcnR5KAotCQkJCQkJSUoyRUVNb2R1bGVGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkFERF9UT19FQVIsCi0JCQkJCQlnZXRQcm9wZXJ0eShBRERfVE9fRUFSKSk7Ci0JCQkJbmV3TW9kdWxlRmFjZXREYXRhTW9kZWwuc2V0UHJvcGVydHkoCi0JCQkJCQlJSjJFRU1vZHVsZUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuRUFSX1BST0pFQ1RfTkFNRSwKLQkJCQkJCWdldFByb3BlcnR5KEVBUl9QUk9KRUNUX05BTUUpKTsKLQkJCQluZXdNb2R1bGVGYWNldERhdGFNb2RlbC5hZGRMaXN0ZW5lcih0aGlzLm1vZHVsZUZhY2V0RGF0YU1vZGVsTGlzdGVuZXIpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5tb2RlbC5zZXRCb29sZWFuUHJvcGVydHkoQUREX1RPX0VBUiwgZmFsc2UpOwotCQkJCXRoaXMubW9kZWwuc2V0Qm9vbGVhblByb3BlcnR5KEFEREVEX1VUSUxJVFlfRkFDRVQsIGZhbHNlKTsKLQkJCX0KLQkJCXNldFByb3BlcnR5KE1PRFVMRV9GQUNFVF9EQVRBX01PREVMLCBuZXdNb2R1bGVGYWNldERhdGFNb2RlbCk7Ci0JCQl0aGlzLm1vZGVsLm5vdGlmeVByb3BlcnR5Q2hhbmdlKEFERF9UT19FQVIsIElEYXRhTW9kZWwuREVGQVVMVF9DSEcpOwotCQkJdGhpcy5tb2RlbC5ub3RpZnlQcm9wZXJ0eUNoYW5nZShFQVJfUFJPSkVDVF9OQU1FLCBJRGF0YU1vZGVsLkRFRkFVTFRfQ0hHKTsKLQkJCXRoaXMubW9kZWwubm90aWZ5UHJvcGVydHlDaGFuZ2UoRUFSX1BST0pFQ1RfTkFNRSwgSURhdGFNb2RlbC5WQUxJRF9WQUxVRVNfQ0hHKTsKLQkJfQkKLQl9Ci0JCi0JcHJvdGVjdGVkIElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5IGdldEZhY2V0ZWRQcm9qZWN0KCkgewotCQlyZXR1cm4gKElGYWNldGVkUHJvamVjdFdvcmtpbmdDb3B5KSB0aGlzLm1vZGVsLmdldFByb3BlcnR5KEZBQ0VURURfUFJPSkVDVF9XT1JLSU5HX0NPUFkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSVJ1bnRpbWUgZ2V0RmFjZXRSdW50aW1lKCkgewotCQlyZXR1cm4gKElSdW50aW1lKSBnZXRQcm9wZXJ0eShGQUNFVF9SVU5USU1FKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgZ2V0TW9kdWxlRmFjZXREYXRhTW9kZWwoKSB7Ci0JCXJldHVybiAoSURhdGFNb2RlbCkgZ2V0UHJvcGVydHkoTU9EVUxFX0ZBQ0VUX0RBVEFfTU9ERUwpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FkZGVkVXRpbGl0eUZhY2V0KCkgewotCQlyZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KEFEREVEX1VUSUxJVFlfRkFDRVQpOwotCX0KLQkKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FkZFRvRWFyKCkgewotCQlyZXR1cm4gZ2V0Qm9vbGVhblByb3BlcnR5KEFERF9UT19FQVIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVhclByb2plY3ROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nUHJvcGVydHkoRUFSX1BST0pFQ1RfTkFNRSk7Ci0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGZpbmRNb2R1bGVGYWNldERhdGFNb2RlbCgpIHsKLQkJRmFjZXRBY3Rpb25NYXAgbWFwID0gKEZhY2V0QWN0aW9uTWFwKSBnZXRQcm9wZXJ0eShGQUNFVF9BQ1RJT05fTUFQKTsKLQkJSVByb2plY3RGYWNldFZlcnNpb24gbW9kdWxlRmFjZXQgPSBmaW5kTW9kdWxlRmFjZXQoKTsKLQkJaWYgKG1vZHVsZUZhY2V0ICE9IG51bGwpIHsKLQkJCUlGYWNldGVkUHJvamVjdC5BY3Rpb24gYWN0aW9uID0gbWFwLmdldEFjdGlvbihtb2R1bGVGYWNldC5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpKTsKLQkJCXJldHVybiAoYWN0aW9uID09IG51bGwpID8gbnVsbCA6IChJRGF0YU1vZGVsKSBhY3Rpb24uZ2V0Q29uZmlnKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJvamVjdEZhY2V0VmVyc2lvbiBmaW5kTW9kdWxlRmFjZXQoKSB7Ci0JCXJldHVybiBGYWNldFRvb2xzLmdldE1vZHVsZUZhY2V0KGdldEZhY2V0ZWRQcm9qZWN0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvanBhMi9kZXRhaWxzL2phdmEvSmF2YVVpRmFjdG9yeTJfMC5qYXZhIGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9qcGEyL2RldGFpbHMvamF2YS9KYXZhVWlGYWN0b3J5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjE2ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9qcGEyL2RldGFpbHMvamF2YS9KYXZhVWlGYWN0b3J5Ml8wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGEyLmRldGFpbHMuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5KcGFDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5kZXRhaWxzLmphdmEuSmF2YVVpRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogVXNlIHtAbGluayBKYXZhVWlGYWN0b3J5Ml8wfSB0byBjcmVhdGUgYW55IGphdmEgSlBBIGNvbXBvc2l0ZXMKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LgotICogSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcKLSAqIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEphdmFVaUZhY3RvcnkyXzAKLQlleHRlbmRzIEphdmFVaUZhY3RvcnkKLXsJCi0KLQlKcGFDb21wb3NpdGUgY3JlYXRlSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMENvbXBvc2l0ZSgKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA+IHN1YmplY3RIb2xkZXIsCi0JCUNvbXBvc2l0ZSBwYXJlbnQsCi0JCVdpZGdldEZhY3Rvcnkgd2lkZ2V0RmFjdG9yeSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2pwYTIvZGV0YWlscy9vcm0vT3JtWG1sVWlGYWN0b3J5Ml8wLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL2pwYTIvZGV0YWlscy9vcm0vT3JtWG1sVWlGYWN0b3J5Ml8wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OWExMmQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9qcGEyL2RldGFpbHMvb3JtL09ybVhtbFVpRmFjdG9yeTJfMC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuanBhMi5kZXRhaWxzLm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuV2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmRldGFpbHMuSnBhQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuZGV0YWlscy5vcm0uT3JtWG1sVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLQotLyoqCi0gKiBVc2Uge0BsaW5rIE9ybVhtbFVpRmFjdG9yeTJfMH0gdG8gY3JlYXRlIGFueSBPUk0gSlBBIGNvbXBvc2l0ZXMKLSAqIDxwPgotICogUHJvdmlzaW9uYWwgQVBJOiBUaGlzIGludGVyZmFjZSBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIKLSAqIGRldmVsb3BtZW50IGFuZCBleHBlY3RlZCB0byBjaGFuZ2Ugc2lnbmlmaWNhbnRseSBiZWZvcmUgcmVhY2hpbmcgc3RhYmlsaXR5LgotICogSXQgaXMgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcKLSAqIGFkb3B0ZXJzIG9uIHRoZSB1bmRlcnN0YW5kaW5nIHRoYXQgYW55IGNvZGUgdGhhdCB1c2VzIHRoaXMgQVBJIHdpbGwgYWxtb3N0Ci0gKiBjZXJ0YWlubHkgYmUgYnJva2VuIChyZXBlYXRlZGx5KSBhcyB0aGUgQVBJIGV2b2x2ZXMuCi0gKgotICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLkJhc2VKcGFVaUZhY3RvcnkKLSAqCi0gKiBAdmVyc2lvbiAzLjAKLSAqIEBzaW5jZSAzLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBPcm1YbWxVaUZhY3RvcnkyXzAgZXh0ZW5kcyBPcm1YbWxVaUZhY3RvcnkKLXsKLQkKLQlKcGFDb21wb3NpdGUgY3JlYXRlT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wQ29tcG9zaXRlKAotCQlQcm9wZXJ0eVZhbHVlTW9kZWw8T3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wPiBzdWJqZWN0SG9sZGVyLAotCQlDb21wb3NpdGUgcGFyZW50LAotCQlXaWRnZXRGYWN0b3J5IHdpZGdldEZhY3RvcnkpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yUHJvdmlkZXIuamF2YSBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvbmF2aWdhdG9yL0pwYU5hdmlnYXRvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMjFkNmYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS9uYXZpZ2F0b3IvSnBhTmF2aWdhdG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm5hdmlnYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5JdGVtTGFiZWxQcm92aWRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLlRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIHRvIGNyZWF0ZSB0aGUgUHJvamVjdCBOYXZpZ2F0b3IgdmlldyBjb250ZW50cyBhbmQgCi0gKiBsYWJlbHMgZm9yIGEgZ2l2ZW4gSlBBIHByb2plY3QuCi0gKgotICogQHZlcnNpb24gMi4wCi0gKiBAc2luY2UgMi4wCi0gKiAKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYU5hdmlnYXRvclByb3ZpZGVyCi17Ci0JLyoqCi0JICogQnVpbGQgYW4gZmFjdG9yeSB0byBjcmVhdGUge0BsaW5rIFRyZWVJdGVtQ29udGVudFByb3ZpZGVyfXMKLQkgKi8KLQlUcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3RvcnkgZ2V0VHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCi0JLyoqCi0JICogQnVpbGQgYSBmYWN0b3J5IHRvIGNyZWF0ZSB7QGxpbmsgSXRlbUxhYmVsUHJvdmlkZXJ9cwotCSAqLwotCUl0ZW1MYWJlbFByb3ZpZGVyRmFjdG9yeSBnZXRJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkoKTsKLQkKLQl2b2lkIGRpc3Bvc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3N0cnVjdHVyZS9KcGFTdHJ1Y3R1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjY1NzlkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvc3RydWN0dXJlL0pwYVN0cnVjdHVyZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS5zdHJ1Y3R1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnVpLmpmYWNlLkl0ZW1MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuSXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udWkuamZhY2UuVHJlZUl0ZW1Db250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51aS5qZmFjZS5UcmVlSXRlbUNvbnRlbnRQcm92aWRlckZhY3Rvcnk7Ci0KLS8qKgotICogVGhpcyBwcm92aWRlciBpcyByZXNwb25zaWJsZSB0byBjcmVhdGUgdGhlIEpQQSBTdHJ1Y3R1cmUgdmlldyBjb250ZW50cyBhbmQgCi0gKiBsYWJlbHMgZm9yIGEgZ2l2ZW4gSlBBIHJlc291cmNlLgotICoKLSAqIEB2ZXJzaW9uIDMuMAotICogQHNpbmNlIDIuMAotICoKLSAqIFByb3Zpc2lvbmFsIEFQSTogVGhpcyBpbnRlcmZhY2UgaXMgcGFydCBvZiBhbiBpbnRlcmltIEFQSSB0aGF0IGlzIHN0aWxsCi0gKiB1bmRlciBkZXZlbG9wbWVudCBhbmQgZXhwZWN0ZWQgdG8gY2hhbmdlIHNpZ25pZmljYW50bHkgYmVmb3JlIHJlYWNoaW5nCi0gKiBzdGFiaWxpdHkuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGlzIGVhcmx5IHN0YWdlIHRvIHNvbGljaXQgZmVlZGJhY2sgZnJvbQotICogcGlvbmVlcmluZyBhZG9wdGVycyBvbiB0aGUgdW5kZXJzdGFuZGluZyB0aGF0IGFueSBjb2RlIHRoYXQgdXNlcyB0aGlzIEFQSQotICogd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpwYVN0cnVjdHVyZVByb3ZpZGVyIAotewotCS8qKgotCSAqIEJ1aWxkIGFuIGZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBUcmVlSXRlbUNvbnRlbnRQcm92aWRlcn1zCi0JICovCi0JVHJlZUl0ZW1Db250ZW50UHJvdmlkZXJGYWN0b3J5IGdldFRyZWVJdGVtQ29udGVudFByb3ZpZGVyRmFjdG9yeSgpOwotCQotCS8qKgotCSAqIEJ1aWxkIGEgZmFjdG9yeSB0byBjcmVhdGUge0BsaW5rIEl0ZW1MYWJlbFByb3ZpZGVyfXMKLQkgKi8KLQlJdGVtTGFiZWxQcm92aWRlckZhY3RvcnkgZ2V0SXRlbUxhYmVsUHJvdmlkZXJGYWN0b3J5KCk7Ci19CmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3RlbXBsYXRlcy9hbm5vdGF0ZWRfZW50aXR5LmphdmFqZXQgYi9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpL3RlbXBsYXRlcy9hbm5vdGF0ZWRfZW50aXR5LmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNGJjMWQuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS90ZW1wbGF0ZXMvYW5ub3RhdGVkX2VudGl0eS5qYXZhamV0CisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCVAIGpldCBwYWNrYWdlPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5IiAKLQlpbXBvcnRzPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLndpemFyZHMuZW50aXR5LmRhdGEubW9kZWwuKiBqYXZhLnV0aWwuKiAiIAotCWNsYXNzPSJBbm5vdGF0ZWRFbnRpdHlUZW1wbGF0ZSIgCi0lPgotPCUgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCi1pZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7ICU+cGFja2FnZSA8JT1tb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSU+OzwlfSU+Ci0KLTwlIENvbGxlY3Rpb248U3RyaW5nPiBpbXBvcnRzID0gbW9kZWwuZ2V0SW1wb3J0cyhmYWxzZSk7Ci1mb3IgKFN0cmluZyBhbkltcG9ydCA6IGltcG9ydHMpIHsgJT4KLWltcG9ydCA8JT1hbkltcG9ydCU+OwotPCUgfSAlPgotCi0vKioKLSAqIEVudGl0eSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBmb3IgRW50aXR5OiA8JT1tb2RlbC5nZXRFbnRpdHlOYW1lKCklPgotICoKLSAqLwotPCU9bW9kZWwuZ2V0QXJ0aWZhY3RUeXBlKCklPjwlU3RyaW5nIEVOVElUWV9OQU1FID0gbW9kZWwuZ2V0RW50aXR5TmFtZSgpOwotaWYgKG1vZGVsLmlzRW50aXR5TmFtZVNldCgpKSB7JT4obmFtZT0iPCU9RU5USVRZX05BTUUlPiIpPCV9JT4KLTwlaWYgKG1vZGVsLmlzVGFibGVOYW1lU2V0KCkpIHslPgotQFRhYmxlKG5hbWU9IjwlPW1vZGVsLmdldFRhYmxlTmFtZSgpJT4iKTwlfSU+Ci08JT1tb2RlbC5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCklPgotPCVpZiAobW9kZWwuaXNDb21wb3NpdGVQSygpKSB7JT4KLUBJZENsYXNzKDwlPW1vZGVsLmdldElkQ2xhc3NOYW1lKCklPi5jbGFzcyk8JX0lPgotcHVibGljIGNsYXNzIDwlPW1vZGVsLmdldENsYXNzTmFtZSgpJT48JVN0cmluZyBzdXBlckNsYXNzID0gbW9kZWwuZ2V0U3VwZXJjbGFzc05hbWUoKTsKLQlpZiAoISAiIi5lcXVhbHMoc3VwZXJDbGFzcykpIHslPiBleHRlbmRzIDwlPXN1cGVyQ2xhc3MlPjwlfSU+PCUKLQlMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCi0JaWYgKGludGVyZmFjZXMuc2l6ZSgpPjApIHslPiBpbXBsZW1lbnRzIDwlIH0KLQlmb3IgKGludCBpPTA7IGk8aW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotIAkJU3RyaW5nIElOVEVSRkFDRSA9IChTdHJpbmcpIGludGVyZmFjZXMuZ2V0KGkpOwotCQlpZiAoaT4wKSB7ICU+LCA8JX0lPjwlPUlOVEVSRkFDRSU+PCV9JT4gewotCi0JPCUgTGlzdDxFbnRpdHlSb3c+IGZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCUxpc3Q8U3RyaW5nPiBwa0ZpZWxkcyA9IG1vZGVsLmdldFBLRmllbGRzKCk7IAotIAlmb3IgKEVudGl0eVJvdyBlbnRpdHkgOiBmaWVsZHMpIHsKLQkJU3RyaW5nIE5BTUUgPSBlbnRpdHkuZ2V0TmFtZSgpOwotCQlpZiAocGtGaWVsZHMuY29udGFpbnMoTkFNRSkgJiYgbW9kZWwuaXNGaWVsZEFjY2VzcygpKSB7Ci0gICAgJT4gICAKLQlASWQ8JX0lPgotCXByaXZhdGUgPCU9ZW50aXR5LmdldFR5cGUoKSU+IDwlPWVudGl0eS5nZXROYW1lKCklPjs8JX0lPgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIDwlPW1vZGVsLmdldENsYXNzTmFtZSgpJT4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotICAgPCUKLQlmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsKLQlpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKLQkJU3RyaW5nIFRZUEUgPSBmaWVsZC5nZXRUeXBlKCk7Ci0JCVN0cmluZyBOQU1FID0gZmllbGQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgTUVUSE9EID0gTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7Ci0JaWYgKHBrRmllbGRzLmNvbnRhaW5zKE5BTUUpICYmICFtb2RlbC5pc0ZpZWxkQWNjZXNzKCkpIHsKLSAgICAlPiAgIAotCUBJZCA8JX0lPiAgIAotCXB1YmxpYyA8JT1UWVBFJT4gZ2V0PCU9TUVUSE9EJT4oKSB7Ci0JCXJldHVybiB0aGlzLjwlPU5BTUUlPjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQ8JT1NRVRIT0QlPig8JT1UWVBFJT4gPCU9TkFNRSU+KSB7Ci0JCXRoaXMuPCU9TkFNRSU+ID0gPCU9TkFNRSU+OwotCX0KLSAgIDwlfSU+Ci0gICAKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvdGVtcGxhdGVzL2VudGl0eS5qYXZhamV0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS90ZW1wbGF0ZXMvZW50aXR5LmphdmFqZXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZGM4MDYuLjAwMDAwMDAKLS0tIGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS90ZW1wbGF0ZXMvZW50aXR5LmphdmFqZXQKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08JUAgamV0IHBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkiIAotCWltcG9ydHM9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCi0JY2xhc3M9IkVudGl0eVRlbXBsYXRlIiAKLSU+Ci08JSBDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsIG1vZGVsID0gKENyZWF0ZUVudGl0eVRlbXBsYXRlTW9kZWwpIGFyZ3VtZW50OyAKLWlmIChtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9bnVsbCAmJiBtb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSE9IiIpIHsgJT5wYWNrYWdlIDwlPW1vZGVsLmdldEphdmFQYWNrYWdlTmFtZSgpJT47PCV9JT4KLQotPCUgQ29sbGVjdGlvbjxTdHJpbmc+IGltcG9ydHMgPSBtb2RlbC5nZXRJbXBvcnRzKGZhbHNlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAlPgotaW1wb3J0IDwlPWFuSW1wb3J0JT47Ci08JSB9ICU+Ci0KLS8qKgotICogRW50aXR5IGltcGxlbWVudGF0aW9uIGNsYXNzIGZvciBFbnRpdHk6IDwlPW1vZGVsLmdldEVudGl0eU5hbWUoKSU+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPjwlU3RyaW5nIHN1cGVyQ2xhc3MgPSBtb2RlbC5nZXRTdXBlcmNsYXNzTmFtZSgpOwotCWlmICghICIiLmVxdWFscyhzdXBlckNsYXNzKSkgeyU+IGV4dGVuZHMgPCU9c3VwZXJDbGFzcyU+PCV9JT48JQotCUxpc3Q8U3RyaW5nPiBpbnRlcmZhY2VzID0gbW9kZWwuZ2V0SW50ZXJmYWNlcygpOyAKLQlpZiAoaW50ZXJmYWNlcy5zaXplKCk+MCkgeyU+IGltcGxlbWVudHMgPCUgfQotCWZvciAoaW50IGk9MDsgaTxpbnRlcmZhY2VzLnNpemUoKTsgaSsrKSB7Ci0JCVN0cmluZyBJTlRFUkZBQ0UgPSAoU3RyaW5nKSBpbnRlcmZhY2VzLmdldChpKTsKLQkJaWYgKGk+MCkgeyAlPiwgPCV9JT48JT1JTlRFUkZBQ0UlPjwlfSU+IHsKLQotCTwlIExpc3Q8RW50aXR5Um93PiBmaWVsZHMgPSBtb2RlbC5nZXRFbnRpdHlGaWVsZHMoKTsgCi0JZm9yIChFbnRpdHlSb3cgZW50aXR5IDogZmllbGRzKSB7ICAgICAKLQklPiAKLQlwcml2YXRlIDwlPWVudGl0eS5nZXRUeXBlKCklPiA8JT1lbnRpdHkuZ2V0TmFtZSgpJT47PCV9JT4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsJCi0JcHVibGljIDwlPW1vZGVsLmdldENsYXNzTmFtZSgpJT4oKSB7Ci0JCXN1cGVyKCk7Ci0JfSAKLQk8JQotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsKLQklPiAgIAotCXB1YmxpYyA8JT1UWVBFJT4gZ2V0PCU9TUVUSE9EJT4oKSB7Ci0gCQlyZXR1cm4gdGhpcy48JT1OQU1FJT47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0PCU9TUVUSE9EJT4oPCU9VFlQRSU+IDwlPU5BTUUlPikgewotCQl0aGlzLjwlPU5BTUUlPiA9IDwlPU5BTUUlPjsKLQl9Ci0JPCV9JT4KLSAgIAotfQpkaWZmIC0tZ2l0IGEvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS90ZW1wbGF0ZXMvaWRDbGFzcy5qYXZhamV0IGIvanBhL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS90ZW1wbGF0ZXMvaWRDbGFzcy5qYXZhamV0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE3Njc1Li4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGEudWkvdGVtcGxhdGVzL2lkQ2xhc3MuamF2YWpldAorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08JUAgamV0CXBhY2thZ2U9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkiIAotCWltcG9ydHM9Im9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwud2l6YXJkcy5lbnRpdHkuZGF0YS5tb2RlbC4qIGphdmEudXRpbC4qICIgCi0JY2xhc3M9IklkQ2xhc3NUZW1wbGF0ZSIgCi0lPgotPCUgQ3JlYXRlRW50aXR5VGVtcGxhdGVNb2RlbCBtb2RlbCA9IChDcmVhdGVFbnRpdHlUZW1wbGF0ZU1vZGVsKSBhcmd1bWVudDsgCi1pZiAobW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPW51bGwgJiYgbW9kZWwuZ2V0SmF2YVBhY2thZ2VOYW1lKCkhPSIiKSB7ICU+cGFja2FnZSA8JT1tb2RlbC5nZXRKYXZhUGFja2FnZU5hbWUoKSU+OzwlfSU+Ci0KLTwlIENvbGxlY3Rpb248U3RyaW5nPiBpbXBvcnRzID0gbW9kZWwuZ2V0SW1wb3J0cyh0cnVlKTsKLWZvciAoU3RyaW5nIGFuSW1wb3J0IDogaW1wb3J0cykgeyAlPgotaW1wb3J0IDwlPWFuSW1wb3J0JT47Ci08JSB9ICU+Ci0KLS8qKgotICogSUQgY2xhc3MgZm9yIGVudGl0eTogPCU9bW9kZWwuZ2V0Q2xhc3NOYW1lKCklPgotICoKLSAqLyAKLXB1YmxpYyBjbGFzcyA8JT1tb2RlbC5nZXRJZENsYXNzTmFtZSgpJT4gCi08JSBMaXN0PFN0cmluZz4gaW50ZXJmYWNlcyA9IG1vZGVsLmdldEludGVyZmFjZXMoKTsgCi0JaWYgKGludGVyZmFjZXMuc2l6ZSgpPjApIHslPiBpbXBsZW1lbnRzIDwlIH0KLQlmb3IgKGludCBpPTA7IGk8aW50ZXJmYWNlcy5zaXplKCk7IGkrKykgewotCQlTdHJpbmcgSU5URVJGQUNFID0gKFN0cmluZykgaW50ZXJmYWNlcy5nZXQoaSk7Ci0JCWlmIChpPjApIHsgJT4sIDwlfSU+PCU9SU5URVJGQUNFJT48JX0lPiB7ICAgCi0gICAKLQk8JSBMaXN0PEVudGl0eVJvdz4gZmllbGRzID0gbW9kZWwuZ2V0RW50aXR5RmllbGRzKCk7Ci0JTGlzdDxTdHJpbmc+IHBrRmllbGRzID0gbW9kZWwuZ2V0UEtGaWVsZHMoKTsgCi0JZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZW50aXR5ID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKLQkJaWYgKCFwa0ZpZWxkcy5jb250YWlucyhlbnRpdHkuZ2V0TmFtZSgpKSkgewotCQkJY29udGludWU7Ci0JCX0KLQklPiAgICAgICAgIAotCXByaXZhdGUgPCU9ZW50aXR5LmdldFR5cGUoKSU+IDwlPWVudGl0eS5nZXROYW1lKCklPjs8JX0lPgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIDwlPW1vZGVsLmdldElkQ2xhc3NOYW1lKCklPigpIHt9Ci0KLQk8JQotCWZpZWxkcyA9IG1vZGVsLmdldEVudGl0eUZpZWxkcygpOwotCWlmIChmaWVsZHMgIT0gbnVsbCkgZm9yIChpbnQgaT0wOyBpPGZpZWxkcy5zaXplKCk7IGkrKykgewotCQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOwotCQlTdHJpbmcgVFlQRSA9IGZpZWxkLmdldFR5cGUoKTsKLQkJU3RyaW5nIE5BTUUgPSBmaWVsZC5nZXROYW1lKCk7Ci0JCWlmICghcGtGaWVsZHMuY29udGFpbnMoTkFNRSkpIHsKLQkJCWNvbnRpbnVlOwotCQl9IAkJCi0JCVN0cmluZyBNRVRIT0QgPSBOQU1FLnN1YnN0cmluZygwLDEpLnRvVXBwZXJDYXNlKCkgKyBOQU1FLnN1YnN0cmluZygxKTsgICAgICAgIAotCSU+Ci0KLQlwdWJsaWMgPCU9VFlQRSU+IGdldDwlPU1FVEhPRCU+KCkgewotCQlyZXR1cm4gdGhpcy48JT1OQU1FJT47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0PCU9TUVUSE9EJT4oPCU9VFlQRSU+IDwlPU5BTUUlPikgewotCQl0aGlzLjwlPU5BTUUlPiA9IDwlPU5BTUUlPjsKLQl9Ci0JPCV9JT4KLSAgIAotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JICovCQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAoIShvIGluc3RhbmNlb2YgPCU9bW9kZWwuZ2V0SWRDbGFzc05hbWUoKSU+KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCTwlPW1vZGVsLmdldElkQ2xhc3NOYW1lKCklPiBvdGhlciA9ICg8JT1tb2RlbC5nZXRJZENsYXNzTmFtZSgpJT4pIG87Ci0JCXJldHVybiB0cnVlCi08JSBpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQlFbnRpdHlSb3cgZmllbGQgPSAoRW50aXR5Um93KSBmaWVsZHMuZ2V0KGkpOyAKLQlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKLQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0gICAgICAgCWNvbnRpbnVlOwotICAgIH0lPgotPCUgCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOyAKLQlTdHJpbmcgR0VUX01FVEhPRCA9ICJnZXQiICsgTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7ICU+Ci08JQlpZiAoVFlQRS5lcXVhbHMoImJvb2xlYW4iKSB8fCBUWVBFLmVxdWFscygiYnl0ZSIpIHx8IFRZUEUuZXF1YWxzKCJjaGFyIikgfHwgVFlQRS5lcXVhbHMoInNob3J0IikgfHwgVFlQRS5lcXVhbHMoImludCIpIHx8IFRZUEUuZXF1YWxzKCJsb25nIikpIHsgJT4KLQkJCSYmIDwlPUdFVF9NRVRIT0QlPigpID09IG90aGVyLjwlPUdFVF9NRVRIT0QlPigpCi08JSAJfSBlbHNlIGlmIChUWVBFLmVxdWFscygiZG91YmxlIikpIHsgJT4KLQkJCSYmIChEb3VibGUuZG91YmxlVG9Mb25nQml0cyg8JT1HRVRfTUVUSE9EJT4oKSkgPT0gRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMob3RoZXIuPCU9R0VUX01FVEhPRCU+KCkpKQotPCUgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImZsb2F0IikpIHsgJT4KLQkJCSYmIChGbG9hdC5mbG9hdFRvSW50Qml0cyg8JT1HRVRfTUVUSE9EJT4oKSkgPT0gRmxvYXQuZmxvYXRUb0ludEJpdHMob3RoZXIuPCU9R0VUX01FVEhPRCU+KCkpKQotPCUgCX0gZWxzZSB7ICU+Ci0JCQkmJiAoPCU9R0VUX01FVEhPRCU+KCkgPT0gbnVsbCA/IG90aGVyLjwlPUdFVF9NRVRIT0QlPigpID09IG51bGwgOiA8JT1HRVRfTUVUSE9EJT4oKS5lcXVhbHMob3RoZXIuPCU9R0VUX01FVEhPRCU+KCkpKQotPCUgCX0gJT4KLTwlIH0gJT47Ci0JfQotCQotCS8qCSAKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IHJlc3VsdCA9IDE7Ci08JSBpZiAoZmllbGRzICE9IG51bGwpIGZvciAoaW50IGk9MDsgaTxmaWVsZHMuc2l6ZSgpOyBpKyspIHsgCi0JRW50aXR5Um93IGZpZWxkID0gKEVudGl0eVJvdykgZmllbGRzLmdldChpKTsKLQlTdHJpbmcgTkFNRSA9IGZpZWxkLmdldE5hbWUoKTsKLQlpZiAoIXBrRmllbGRzLmNvbnRhaW5zKE5BTUUpKSB7Ci0gICAgICAgCWNvbnRpbnVlOwotICAgIH0lPgotPCUgCVN0cmluZyBUWVBFID0gZmllbGQuZ2V0VHlwZSgpOyAKLQlTdHJpbmcgR0VUX01FVEhPRCA9ICJnZXQiICsgTkFNRS5zdWJzdHJpbmcoMCwxKS50b1VwcGVyQ2FzZSgpICsgTkFNRS5zdWJzdHJpbmcoMSk7ICU+Ci08JQlpZiAoVFlQRS5lcXVhbHMoImJvb2xlYW4iKSkgeyAlPgotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICg8JT1HRVRfTUVUSE9EJT4oKSA/IDEgOiAwKTsKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJpbnQiKSkgeyAlPgotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIDwlPUdFVF9NRVRIT0QlPigpOwotPCUgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImJ5dGUiKSB8fCBUWVBFLmVxdWFscygiY2hhciIpIHx8IFRZUEUuZXF1YWxzKCJzaG9ydCIpKSB7ICU+Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChpbnQpIDwlPUdFVF9NRVRIT0QlPigpKTsKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJsb25nIikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGludCkgKDwlPUdFVF9NRVRIT0QlPigpIF4gKDwlPUdFVF9NRVRIT0QlPigpID4+PiAzMikpKTsKLTwlIAl9IGVsc2UgaWYgKFRZUEUuZXF1YWxzKCJkb3VibGUiKSkgeyAlPgotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaW50KSAoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoPCU9R0VUX01FVEhPRCU+KCkgKSBeIChEb3VibGUuZG91YmxlVG9Mb25nQml0cyg8JT1HRVRfTUVUSE9EJT4oKSkgPj4+IDMyKSkpOwotPCUgCX0gZWxzZSBpZiAoVFlQRS5lcXVhbHMoImZsb2F0IikpIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBGbG9hdC5mbG9hdFRvSW50Qml0cyg8JT1HRVRfTUVUSE9EJT4oKSk7Ci08JSAJfSBlbHNlIHsgJT4KLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoPCU9R0VUX01FVEhPRCU+KCkgPT0gbnVsbCA/IDAgOiA8JT1HRVRfTUVUSE9EJT4oKS5oYXNoQ29kZSgpKTsKLTwlIAl9ICU+Ci08JSB9ICU+Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotICAgCi0gICAKLX0KZGlmZiAtLWdpdCBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0YTE3YS4uMDAwMDAwMAotLS0gYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC51aTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEudWk8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS8ucHJvamVjdCBiL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTc3NTFkLi4wMDAwMDAwCi0tLSBhL2pwYS9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudXRpbGl0eTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eSBhbmQgbW92ZWQgdG8gY29tbW9uIGNvbXBvbmVudDwvY29tbWVudD4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWNhMzVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmNvcmUudGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTJmZDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuY29yZS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD5yZW5hbWVkIHRvIHJnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5kYi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFmZmIxZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmRiLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZGIudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWFlZjcxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHM8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0Lmdlbi50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzNkODg3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuZ2VuLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PnJlbmFtZWQgdG8gb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHM8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUzZTAzYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3ODNhNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzlhOGNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA4OjM0IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmMDkxNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMS4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmUsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LAotIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpwYS5qcHFsLAotIG9yZy5lY2xpcHNlLnN3dCwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZSwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAwMiwgMjAwODwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExMTYzYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTU4Nzg5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWUgPSBEYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBFeHRlbnNpb24gVGVzdHMKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ3YThkMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvRXh0ZW5zaW9uVGVzdFBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVjZDZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0V4dGVuc2lvblRlc3RQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25UZXN0UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgRXh0ZW5zaW9uVGVzdFBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEV4dGVuc2lvblRlc3RQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBFeHRlbnNpb25UZXN0UGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWQwOTk0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5BYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nCi0JZXh0ZW5kcyBBYnN0cmFjdEphdmFBdHRyaWJ1dGVNYXBwaW5nPEFubm90YXRpb24+Ci17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9BVFRSSUJVVEVfTUFQUElOR19LRVkgPSAidGVzdEF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUVFJJQlVURV9BTk5PVEFUSU9OX05BTUUgPSAidGVzdC5UZXN0QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYThkYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uCi0JaW1wbGVtZW50cyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gSU5TVEFOQ0UgPSBuZXcgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nLlRFU1RfQVRUUklCVVRFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdEF0dHJpYnV0ZU1hcHBpbmcuVEVTVF9BVFRSSUJVVEVfQU5OT1RBVElPTl9OQU1FOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU3BlY2lmaWVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJcmV0dXJuIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKHRoaXMuZ2V0QW5ub3RhdGlvbk5hbWUoKSkgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8U3RyaW5nPiBnZXRTdXBwb3J0aW5nQW5ub3RhdGlvbk5hbWVzKCkgewotCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCX0KLQotCXB1YmxpYyBKYXZhQXR0cmlidXRlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSwgSnBhRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXJldHVybiAoKFRlc3RKcGFGYWN0b3J5KSBmYWN0b3J5KS5idWlsZEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwZXJzaXN0ZW50QXR0cmlidXRlKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gdGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9KYXZhVGVzdFR5cGVNYXBwaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MGRhMzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YVR5cGVNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RUeXBlTWFwcGluZwotCWV4dGVuZHMgQWJzdHJhY3RKYXZhVHlwZU1hcHBpbmc8QW5ub3RhdGlvbj4KLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfTUFQUElOR19LRVkgPSAidGVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfQU5OT1RBVElPTl9OQU1FID0gInRlc3QuVGVzdCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIEphdmFUZXN0VHlwZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgewotCQlyZXR1cm4gVEVTVF9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SWRDbGFzcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXBwZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHRhYmxlTmFtZUlzSW52YWxpZChTdHJpbmcgdGFibGVOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmFibGU8UXVlcnk+IGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL0phdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGJlMjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24KLQlpbXBsZW1lbnRzIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24KLXsKLQkvLyBzaW5nbGV0b24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbiBJTlNUQU5DRSA9IG5ldyBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb24gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8qKgotCSAqIEVuZm9yY2Ugc2luZ2xldG9uIHVzYWdlCi0JICovCi0JcHJpdmF0ZSBKYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIEphdmFUZXN0VHlwZU1hcHBpbmcuVEVTVF9UWVBFX01BUFBJTkdfS0VZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QW5ub3RhdGlvbk5hbWUoKSB7Ci0JCXJldHVybiBKYXZhVGVzdFR5cGVNYXBwaW5nLlRFU1RfVFlQRV9BTk5PVEFUSU9OX05BTUU7Ci0JfQotCi0JcHVibGljIEl0ZXJhYmxlPFN0cmluZz4gZ2V0U3VwcG9ydGluZ0Fubm90YXRpb25OYW1lcygpIHsKLQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVRlc3RUeXBlTWFwcGluZyBidWlsZE1hcHBpbmcoSmF2YVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb24sIEpwYUZhY3RvcnkgZmFjdG9yeSkgewotCQlyZXR1cm4gKChUZXN0SnBhRmFjdG9yeSkgZmFjdG9yeSkuYnVpbGRKYXZhVGVzdFR5cGVNYXBwaW5nKHBlcnNpc3RlbnRUeXBlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFCYXNpY01hcHBpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRhZGU0MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUJhc2ljTWFwcGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuQWJzdHJhY3RKYXZhQmFzaWNNYXBwaW5nOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFCYXNpY01hcHBpbmcKLQlleHRlbmRzIEFic3RyYWN0SmF2YUJhc2ljTWFwcGluZwotewotCXB1YmxpYyBUZXN0SmF2YUJhc2ljTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUVudGl0eS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEphdmFFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFlZTYzYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SmF2YUVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkFic3RyYWN0SmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnRpdHlBbm5vdGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEphdmFFbnRpdHkKLQlleHRlbmRzIEFic3RyYWN0SmF2YUVudGl0eQotewotCXByb3RlY3RlZCBUZXN0SmF2YUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50LCBFbnRpdHlBbm5vdGF0aW9uIG1hcHBpbmdBbm5vdGF0aW9uKSB7Ci0JCXN1cGVyKHBhcmVudCwgbWFwcGluZ0Fubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBKYXZhQ2FjaGVhYmxlMl8wIGdldENhY2hlYWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbGN1bGF0ZURlZmF1bHRDYWNoZWFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiM2UwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFGYWN0b3J5Ci0JZXh0ZW5kcyBBYnN0cmFjdEpwYUZhY3RvcnkKLXsKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSmF2YUVudGl0eSBidWlsZEphdmFFbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIHBhcmVudCwgRW50aXR5QW5ub3RhdGlvbiBlbnRpdHlBbm5vdGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgVGVzdEphdmFFbnRpdHkocGFyZW50LCBlbnRpdHlBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEphdmFCYXNpY01hcHBpbmcgYnVpbGRKYXZhQmFzaWNNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IFRlc3RKYXZhQmFzaWNNYXBwaW5nKHBhcmVudCk7Ci0JfQotCQotCXB1YmxpYyBKYXZhVGVzdFR5cGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RUeXBlTWFwcGluZyhKYXZhUGVyc2lzdGVudFR5cGUgcGFyZW50KSB7Ci0JCXJldHVybiBuZXcgSmF2YVRlc3RUeXBlTWFwcGluZyhwYXJlbnQpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nIGJ1aWxkSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBhcmVudCkgewotCQlyZXR1cm4gbmV3IEphdmFUZXN0QXR0cmlidXRlTWFwcGluZyhwYXJlbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0OGRkYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVZhcmlhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhUGxhdGZvcm1GYWN0b3J5LlNpbXBsZVZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qcGEuanBxbC5wYXJzZXIuRGVmYXVsdEpQUUxHcmFtbWFyOwotCi0vKioKLSAqIEFsbCB0aGUgc3RhdGUgaW4gdGhlIEpQQSBwbGF0Zm9ybSBzaG91bGQgYmUgInN0YXRpYyIgKGkuZS4gdW5jaGFuZ2luZyBvbmNlCi0gKiBpdCBpcyBpbml0aWFsaXplZCkuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRlc3RKcGFQbGF0Zm9ybUZhY3RvcnkKLQlpbXBsZW1lbnRzIEpwYVBsYXRmb3JtRmFjdG9yeQotewotCS8qKgotCSAqIHplcm8tYXJndW1lbnQgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgVGVzdEpwYVBsYXRmb3JtRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm0gYnVpbGRKcGFQbGF0Zm9ybShTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIG5ldyBHZW5lcmljSnBhUGxhdGZvcm0oCi0JCQlpZCwKLQkJCWJ1aWxkSnBhVmVyc2lvbigpLAotCQkJbmV3IFRlc3RKcGFGYWN0b3J5KCksCi0JCQluZXcgSnBhQW5ub3RhdGlvblByb3ZpZGVyKEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpLAotCQkJVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCWJ1aWxkSnBhUGxhdGZvcm1WYXJpYXRpb24oKSwKLQkJCURlZmF1bHRKUFFMR3JhbW1hci5pbnN0YW5jZSgpKTsKLQl9Ci0KLQlwcml2YXRlIEpwYVBsYXRmb3JtLlZlcnNpb24gYnVpbGRKcGFWZXJzaW9uKCkgewotCQlyZXR1cm4gbmV3IFNpbXBsZVZlcnNpb24oSnBhRmFjZXQuVkVSU0lPTl8xXzAuZ2V0VmVyc2lvblN0cmluZygpKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJCQlyZXR1cm4gIkJPT09ZQUghIjsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1WYXJpYXRpb24gYnVpbGRKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKcGFQbGF0Zm9ybVZhcmlhdGlvbigpIHsKLQkJCXB1YmxpYyBTdXBwb3J0ZWQgZ2V0VGFibGVQZXJDb25jcmV0ZUNsYXNzSW5oZXJpdGFuY2VJc1N1cHBvcnRlZCgpIHsKLQkJCQlyZXR1cm4gU3VwcG9ydGVkLk1BWUJFOwotCQkJfQotCQkJcHVibGljIGJvb2xlYW4gaXNKb2luVGFibGVPdmVycmlkYWJsZSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlwdWJsaWMgQWNjZXNzVHlwZVtdIGdldFN1cHBvcnRlZEFjY2Vzc1R5cGVzKEpwdFJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUpIHsKLQkJCQlyZXR1cm4gR0VORVJJQ19TVVBQT1JURURfQUNDRVNTX1RZUEVTOwotCQkJfQotCQl9OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNzJiZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2V4dGVuc2lvbi9yZXNvdXJjZS9UZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdENvbW1vbkNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLlJlc291cmNlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkRlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVHlwZU1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5BYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkphclJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSmF2YVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuT3JtUmVzb3VyY2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5QZXJzaXN0ZW5jZVJlc291cmNlTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGFibGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YUVudGl0eURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFWZXJzaW9uTWFwcGluZ0RlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybVhtbERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmljUGVyc2lzdGVuY2VYbWxEZWZpbml0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpwYVBsYXRmb3JtUHJvdmlkZXIKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJjb3JlLnRlc3RKcGFQbGF0Zm9ybSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIHNpbmdsZXRvbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIEpwYVBsYXRmb3JtUHJvdmlkZXIgSU5TVEFOQ0UgPSBuZXcgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIoKTsKLQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN0YXRpYyBKcGFQbGF0Zm9ybVByb3ZpZGVyIGluc3RhbmNlKCkgewotCQlyZXR1cm4gSU5TVEFOQ0U7Ci0JfQotCi0KLQkvKioKLQkgKiBFbmZvcmNlIHNpbmdsZXRvbiB1c2FnZQotCSAqLwotCXByaXZhdGUgVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHJlc291cmNlIG1vZGVscyAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0UmVzb3VyY2VUeXBlIGdldE1vc3RSZWNlbnRTdXBwb3J0ZWRSZXNvdXJjZVR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVZBX1NPVVJDRV9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRDb21tb25Db3JlUGx1Z2luLkpBUl9DT05URU5UX1RZUEUpKSB7Ci0JCQlyZXR1cm4gSnB0Q29tbW9uQ29yZVBsdWdpbi5KQVJfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uUEVSU0lTVEVOQ0VfWE1MXzFfMF9SRVNPVVJDRV9UWVBFOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFKSkgewotCQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF8xXzBfUkVTT1VSQ0VfVFlQRTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY29udGVudFR5cGUudG9TdHJpbmcoKSk7Ci0JCX0KLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBhZGRSZXNvdXJjZU1vZGVsUHJvdmlkZXJzVG8oQXJyYXlMaXN0PEpwYVJlc291cmNlTW9kZWxQcm92aWRlcj4gcHJvdmlkZXJzKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocHJvdmlkZXJzLCBSRVNPVVJDRV9NT0RFTF9QUk9WSURFUlMpOwotCX0KLQotCS8vIG9yZGVyIHNob3VsZCBub3QgYmUgaW1wb3J0YW50IGhlcmUKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEpwYVJlc291cmNlTW9kZWxQcm92aWRlcltdIFJFU09VUkNFX01PREVMX1BST1ZJREVSUyA9IG5ldyBKcGFSZXNvdXJjZU1vZGVsUHJvdmlkZXJbXSB7Ci0JCUphdmFSZXNvdXJjZU1vZGVsUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJSmFyUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCVBlcnNpc3RlbmNlUmVzb3VyY2VNb2RlbFByb3ZpZGVyLmluc3RhbmNlKCksCi0JCU9ybVJlc291cmNlTW9kZWxQcm92aWRlci5pbnN0YW5jZSgpCi0JfTsKLQotCi0JLy8gKioqKioqKioqKiBKYXZhIHR5cGUgbWFwcGluZ3MgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbj4gZGVmaW5pdGlvbnMpIHsKLQkJQ29sbGVjdGlvblRvb2xzLmFkZEFsbChkZWZpbml0aW9ucywgSkFWQV9UWVBFX01BUFBJTkdfREVGSU5JVElPTlMpOwotCX0KLQotCS8vIG9yZGVyIG1hdGNoZXMgdGhhdCB1c2VkIGJ5IHRoZSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gKEVjbGlwc2VMaW5rKQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgSmF2YVR5cGVNYXBwaW5nRGVmaW5pdGlvbltdIEpBVkFfVFlQRV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IEphdmFUeXBlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFFbnRpdHlEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRhYmxlRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhTWFwcGVkU3VwZXJjbGFzc0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YVRlc3RUeXBlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSAgLy8gYWRkZWQKLQl9OwotCi0KLQkvLyAqKioqKioqKioqIEphdmEgYXR0cmlidXRlIG1hcHBpbmdzICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25zVG8oQXJyYXlMaXN0PERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIERFRkFVTFRfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEZWZhdWx0SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uW10gREVGQVVMVF9KQVZBX0FUVFJJQlVURV9NQVBQSU5HX0RFRklOSVRJT05TID0gbmV3IERlZmF1bHRKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCkKLQl9OwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGFkZFNwZWNpZmllZEphdmFBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbnNUbyhBcnJheUxpc3Q8SmF2YUF0dHJpYnV0ZU1hcHBpbmdEZWZpbml0aW9uPiBkZWZpbml0aW9ucykgewotCQlDb2xsZWN0aW9uVG9vbHMuYWRkQWxsKGRlZmluaXRpb25zLCBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyk7Ci0JfQotCi0JLy8gb3JkZXIgbWF0Y2hlcyB0aGF0IHVzZWQgYnkgdGhlIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiAoRWNsaXBzZUxpbmspCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSBTUEVDSUZJRURfSkFWQV9BVFRSSUJVVEVfTUFQUElOR19ERUZJTklUSU9OUyA9IG5ldyBKYXZhQXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb25bXSB7Ci0JCUphdmFUcmFuc2llbnRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhSWRNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhVmVyc2lvbk1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFCYXNpY01hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZE1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlKYXZhTWFueVRvT25lTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSwKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFPbmVUb09uZU1hcHBpbmdEZWZpbml0aW9uLmluc3RhbmNlKCksCi0JCUphdmFUZXN0QXR0cmlidXRlTWFwcGluZ0RlZmluaXRpb24uaW5zdGFuY2UoKSAvLyBhZGRlZAotCX07Ci0KLQotCS8vICoqKioqKioqKiogcmVzb3VyY2UgZGVmaW5pdGlvbnMgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VEZWZpbml0aW9uc1RvKEFycmF5TGlzdDxSZXNvdXJjZURlZmluaXRpb24+IGRlZmluaXRpb25zKSB7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwoZGVmaW5pdGlvbnMsIFJFU09VUkNFX0RFRklOSVRJT05TKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlc291cmNlRGVmaW5pdGlvbltdIFJFU09VUkNFX0RFRklOSVRJT05TID0gbmV3IFJlc291cmNlRGVmaW5pdGlvbltdIHsKLQkJR2VuZXJpY1BlcnNpc3RlbmNlWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpLAotCQlHZW5lcmljT3JtWG1sRGVmaW5pdGlvbi5pbnN0YW5jZSgpCi0JfTsKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvZXh0ZW5zaW9uL3Jlc291cmNlL1Rlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZGIyMTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2Uvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9leHRlbnNpb24vcmVzb3VyY2UvVGVzdEpwYVBsYXRmb3JtVWlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuSnBhUGxhdGZvcm1VaTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLkpwYVBsYXRmb3JtVWlGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuR2VuZXJpY0pwYVBsYXRmb3JtVWlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnBsYXRmb3JtLmdlbmVyaWMuR2VuZXJpY0pwYVBsYXRmb3JtVWk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5wbGF0Zm9ybS5nZW5lcmljLkdlbmVyaWNOYXZpZ2F0b3JQcm92aWRlcjsKLQotcHVibGljIGNsYXNzIFRlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeSBpbXBsZW1lbnRzIEpwYVBsYXRmb3JtVWlGYWN0b3J5Ci17Ci0KLQkvKioKLQkgKiBaZXJvIGFyZyBjb25zdHJ1Y3RvciBmb3IgZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHVibGljIFRlc3RKcGFQbGF0Zm9ybVVpRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1VaSBidWlsZEpwYVBsYXRmb3JtVWkoKSB7Ci0JCXJldHVybiBuZXcgR2VuZXJpY0pwYVBsYXRmb3JtVWkoCi0JCQluZXcgR2VuZXJpY05hdmlnYXRvclByb3ZpZGVyKCksCi0JCQlHZW5lcmljSnBhUGxhdGZvcm1VaVByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjYTJkNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9jb21tb24vdXRpbGl0eS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanN0LyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI0ZjIwNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDcwYjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowODoyNyBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTVlZTZjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuMS4xMDAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZW0udXRpbDtidW5kbGUtdmVyc2lvbj0iWzIuMC4xMDAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHk7YnVuZGxlLXZlcnNpb249IlsyLjAuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS50ZXN0cztidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWZ3b3JrYmVuY2guaW50ZWdyYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLm1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLkpwdEpwYUNvcmVUZXN0c1BsdWdpbgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjIyN2NlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICB0ZXN0LnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTM0NTNhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVG8gY29kZSBkZXZlbG9wZXI6Ci0jICAgRG8gTk9UIGNoYW5nZSB0aGUgcHJvcGVydGllcyBiZXR3ZWVuIHRoaXMgbGluZSBhbmQgdGhlCi0jICAgIiUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJSIgbGluZS4KLSMgICBNYWtlIGEgbmV3IHByb3BlcnR5IG5hbWUsIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCBjaGFuZ2UKLSMgICB0aGUgY29kZSB0byB1c2UgdGhlIG5ldyBwcm9wZXJ0eS4KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyAlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotcGx1Z2luTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBDb3JlIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9KcHRKcGFDb3JlVGVzdHNQbHVnaW4uamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9KcHRKcGFDb3JlVGVzdHNQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxNjhhZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvSnB0SnBhQ29yZVRlc3RzUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQ29uZmlndXJlIHRoZSBjb3JlIGZvciB0ZXN0aW5nOjx1bD4KLSAqIDxsaT5oYW5kbGUgZXZlbnRzIHN5bmNocm9ub3VzbHkKLSAqIDxsaT5kbyBub3QgZmx1c2ggcHJlZmVyZW5jZXMKLSAqIDwvdWw+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdEpwYUNvcmVUZXN0c1BsdWdpbgotCWV4dGVuZHMgUGx1Z2luCi17Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSnB0SnBhQ29yZVRlc3RzUGx1Z2luIElOU1RBTkNFOwotCi0JcHVibGljIHN0YXRpYyBKcHRKcGFDb3JlVGVzdHNQbHVnaW4gaW5zdGFuY2UoKSB7Ci0JCXJldHVybiBJTlNUQU5DRTsKLQl9Ci0KLQotCS8vICoqKioqKioqKiogcGx1Zy1pbiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgSnB0SnBhQ29yZVRlc3RzUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlpZiAoSU5TVEFOQ0UgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQl9Ci0JCS8vIHRoaXMgY29udmVudGlvbiBpcyAqd2FjayouLi4gIH5ianYKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCUpwYVByb2plY3RNYW5hZ2VyIGpwYVByb2plY3RNYW5hZ2VyID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpOwotCQlSZWZsZWN0aW9uVG9vbHMuZXhlY3V0ZU1ldGhvZChqcGFQcm9qZWN0TWFuYWdlciwgImhhbmRsZUV2ZW50c1N5bmNocm9ub3VzbHkiKTsKLQkJUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVTdGF0aWNNZXRob2QoSnB0SnBhQ29yZVBsdWdpbi5jbGFzcywgImRvTm90Rmx1c2hQcmVmZXJlbmNlcyIpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9NaXNjVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9NaXNjVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjZTg1MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvTWlzY1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNaXNjVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWlzY1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEpvYnNBbmRMb2NrcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJTG9jayBsb2NrID0gSm9iLmdldEpvYk1hbmFnZXIoKS5uZXdMb2NrKCk7Ci0JCUpvYiB0ZXN0Sm9iID0gbmV3IFRlc3RKb2IobG9jayk7Ci0JCXRlc3RKb2Iuc2NoZWR1bGUoKTsKLQl9Ci0KLQljbGFzcyBUZXN0Sm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBmaW5hbCBJTG9jayBsb2NrOwotCQlUZXN0Sm9iKElMb2NrIGxvY2spIHsKLQkJCXN1cGVyKCJ0ZXN0IGpvYiIpOwotCQkJdGhpcy5sb2NrID0gbG9jazsKLQkJfQotCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJdGhpcy5ydW4oKTsKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCXByaXZhdGUgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCXRoaXMubG9jay5hY3F1aXJlKCk7Ci0JCQkJTWlzY1Rlc3RzLnNsZWVwKDEwMCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRoaXMubG9jay5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgdm9pZCBzbGVlcChsb25nIG1pbGxpcykgewotCQl0cnkgewotCQkJVGhyZWFkLnNsZWVwKG1pbGxpcyk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRKcGFDb3JlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9KcHRKcGFDb3JlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxYjEwNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0SnBhQ29yZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwubW9kZWwuSnB0SnBhQ29yZU1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5KcHRKcGFDb3JlUmVzb3VyY2VNb2RlbFRlc3RzOwotCi0vKioKLSAqIGRlY2VudHJhbGl6ZSB0ZXN0IGNyZWF0aW9uIGNvZGUKLSAqIAotICogUmVxdWlyZWQgSmF2YSBzeXN0ZW0gcHJvcGVydHk6Ci0gKiAgICAtRG9yZy5lY2xpcHNlLmpwdC5qcGEuamFyPTxqcGEuamFyIHBhdGg+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdEpwYUNvcmVUZXN0cyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9KQVJfUFJPUEVSVFkgPSBUZXN0SnBhUHJvamVjdC5KUEFfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUNvcmVUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRKcGFDb3JlTW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChKcHRKcGFDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVxdWlyZWRKYXJzRXhpc3RzKCkgewotCQlyZXR1cm4ganBhSmFyUHJvcGVydHlFeGlzdHMoKSAmJiBqcGFKYXJGaWxlRXhpc3RzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSB7Ci0JCWlmKCAhIGpwYUphclByb3BlcnR5RXhpc3RzKCkpIHsKLQkJCXJldHVybiBlcnJvck1pc3NpbmdQcm9wZXJ0eShKUEFfSkFSX1BST1BFUlRZKTsKLQkJfQotCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpKTsKLQl9Ci0KLQkvKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvck1pc3NpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiAibWlzc2luZyBKYXZhIHN5c3RlbSBwcm9wZXJ0eTogXCIiICsgcHJvcGVydHlOYW1lICsgIlwiIjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgcHJvcGVydHlWYWx1ZSArICJcIiI7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlwcml2YXRlIEpwdEpwYUNvcmVUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0NvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMWJiMjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC51dGlsaXR5LmpkdC5Bbm5vdGF0aW9uVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpwYVJvb3RDb250ZXh0Tm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwaW5nRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLkVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uR2VuZXJpY1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb250ZXh0TW9kZWxUZXN0Q2FzZSBleHRlbmRzIEFubm90YXRpb25UZXN0Q2FzZQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUFJPSkVDVF9OQU1FID0gIkNvbnRleHRNb2RlbFRlc3RQcm9qZWN0IjsKLQkKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgcGVyc2lzdGVuY2VYbWxSZXNvdXJjZTsKLQkKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2Ugb3JtWG1sUmVzb3VyY2U7Ci0JCi0JCi0JcHJvdGVjdGVkIENvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2UgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQl0aGlzLm9ybVhtbFJlc291cmNlID0gZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQl0aGlzLndhaXRGb3JXb3Jrc3BhY2VKb2JzVG9GaW5pc2goKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVhtbFJlc291cmNlID0gbnVsbDsKLQkJdGhpcy5vcm1YbWxSZXNvdXJjZSA9IG51bGw7Ci0JCUpwdEpwYUNvcmVQbHVnaW4uZ2V0V29ya3NwYWNlUHJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQl0aGlzLndhaXRGb3JXb3Jrc3BhY2VKb2JzVG9GaW5pc2goKTsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKYXZhUHJvamVjdCBidWlsZEphdmFQcm9qZWN0KGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJ1aWxkSnBhUHJvamVjdChCQVNFX1BST0pFQ1RfTkFNRSwgYXV0b0J1aWxkLCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykgCi0JCQl0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIFRlc3RKcGFQcm9qZWN0LmJ1aWxkSnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIHRoaXMuZ2V0SnBhRmFjZXRWZXJzaW9uU3RyaW5nKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCB0aGlzLmdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLnZhbHVlT2YodGhpcy5jcmVhdGVPcm1YbWwoKSkpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCS8vIGRlZmF1bHQgZmFjZXQgdmVyc2lvbiBpcyAyLjAgLSBtb3N0IHRlc3RzIHVzZSAxLjAKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEpwYUZhY2V0VmVyc2lvblN0cmluZygpIHsKLQkJcmV0dXJuIEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKTsKLQl9Ci0JCi0JLy8gbW9zdCB0ZXN0cyB1c2UgdGhlIGJhc2ljIGdlbmVyaWMgcGxhdGZvcm0KLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gR2VuZXJpY1BsYXRmb3JtLlZFUlNJT05fMV8wOwotCX0KLQotCS8vIG1vc3QgdGVzdHMgZG8gdXNlIGFuIG9ybS54bWwKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVPcm1YbWwoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgd2FpdEZvcldvcmtzcGFjZUpvYnNUb0ZpbmlzaCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCS8vIFRoaXMgam9iIHdpbGwgbm90IHN0YXJ0IHJ1bm5pbmcgdW50aWwgYWxsIHRoZSBvdGhlciB3b3Jrc3BhY2Ugam9icyBhcmUgZG9uZQotCQlKb2Igd2FpdEpvYiA9IG5ldyBKb2IoIldhaXQgam9iIikgewotCQkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJd2FpdEpvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQl3YWl0Sm9iLnNjaGVkdWxlKCk7Ci0JCXdhaXRKb2Iuam9pbigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMucGVyc2lzdGVuY2VYbWxSZXNvdXJjZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEpwYVhtbFJlc291cmNlIGdldE9ybVhtbFJlc291cmNlKCkgewotCQlyZXR1cm4gdGhpcy5vcm1YbWxSZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBJdCdzIG5pY2UgdG8gYmUgYWJsZSB0byBjYWxsIHRoaXMgbWV0aG9kIGZyb20gdGhlIGRlYnVnZ2VyLAotCSAqIHRvIGZvcmNlIHRoZSBYTUwgZmlsZXMgdG8gYmUgd3JpdHRlbiBvdXQgc28geW91IGNhbiBzZWUgdGhlaXIgY3VycmVudCBzdGF0ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlWG1sRmlsZXMoKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLnNhdmVYbWxGaWxlc18oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVhtbEZpbGVzXygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnBlcnNpc3RlbmNlWG1sUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JCXRoaXMub3JtWG1sUmVzb3VyY2Uuc2F2ZUlmTmVjZXNzYXJ5KCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxFbnRpdHlNYXBwaW5ncyBnZXRYbWxFbnRpdHlNYXBwaW5ncygpIHsKLQkJcmV0dXJuIChYbWxFbnRpdHlNYXBwaW5ncykgZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRSb290T2JqZWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZSBnZXRYbWxQZXJzaXN0ZW5jZSgpIHsKLQkJcmV0dXJuIChYbWxQZXJzaXN0ZW5jZSkgZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldFJvb3RPYmplY3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWFwcGluZ0ZpbGUgZ2V0TWFwcGluZ0ZpbGUoKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmdGaWxlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVudGl0eU1hcHBpbmdzIGdldEVudGl0eU1hcHBpbmdzKCkgewotCQlNYXBwaW5nRmlsZSBtYXBwaW5nRmlsZSA9IHRoaXMuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJcmV0dXJuIChtYXBwaW5nRmlsZSA9PSBudWxsKSA/IG51bGwgOiAoRW50aXR5TWFwcGluZ3MpIG1hcHBpbmdGaWxlLmdldFJvb3QoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFhtbFBlcnNpc3RlbmNlVW5pdCBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKSB7Ci0JCXJldHVybiBnZXRYbWxQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIENsYXNzUmVmIGdldFNwZWNpZmllZENsYXNzUmVmKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCQotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkgewotCQlyZXR1cm4gZ2V0U3BlY2lmaWVkQ2xhc3NSZWYoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEphdmFFbnRpdHkgZ2V0SmF2YUVudGl0eSgpIHsKLQkJcmV0dXJuIChKYXZhRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbENsYXNzUmVmKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKGNsYXNzTmFtZSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlWG1sQ2xhc3NSZWYoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVhtbEphdmFDbGFzc1JlZiB4bWxKYXZhQ2xhc3NSZWZUb1JlbW92ZSAgPSBudWxsOwotCQlmb3IgKFhtbEphdmFDbGFzc1JlZiB4bWxKYXZhQ2xhc3NSZWYgOiB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpKSB7Ci0JCQlpZiAoeG1sSmF2YUNsYXNzUmVmLmdldEphdmFDbGFzcygpLmVxdWFscyhjbGFzc05hbWUpKSB7Ci0JCQkJeG1sSmF2YUNsYXNzUmVmVG9SZW1vdmUgPSB4bWxKYXZhQ2xhc3NSZWY7Ci0JCQl9Ci0JCX0KLQkJaWYgKHhtbEphdmFDbGFzc1JlZlRvUmVtb3ZlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnJlbW92ZSh4bWxKYXZhQ2xhc3NSZWZUb1JlbW92ZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZFhtbE1hcHBpbmdGaWxlUmVmKFN0cmluZyBmaWxlTmFtZSkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoZmlsZU5hbWUpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSnBhUm9vdENvbnRleHROb2RlIGdldFJvb3RDb250ZXh0Tm9kZSgpIHsKLQkJcmV0dXJuIGdldEphdmFQcm9qZWN0KCkuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgZ2V0SmF2YVByb2plY3QoKSB7Ci0JCXJldHVybiAoVGVzdEpwYVByb2plY3QpIHN1cGVyLmdldEphdmFQcm9qZWN0KCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLmRlbGV0ZVJlc291cmNlKHJlc291cmNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcGFGaWxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYUZpbGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjAzMTMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYUZpbGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5FbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYUZpbGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEpwYUZpbGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJvb3RTdHJ1Y3R1cmVOb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSUZpbGUgZmlsZSA9IGdldE9ybVhtbFJlc291cmNlKCkuZ2V0RmlsZSgpOwotCQlKcGFGaWxlIG9ybVhtbEpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKSwgb3JtWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL3ZlcmlmeSB0aGUgbWFwcGluZyBmaWxlIHJlZmVyZW5jZSAid2lucyIgYXMgdGhlIHJvb3Qgc3RydWN0dXJlIG5vZGUgd2hlbiBib3RoCi0JCS8vcGVyc2lzdGVuY2UueG1sIDxjbGFzcz4gdGFnIGFuZCBtYXBwaW5nIGZpbGUgPGVudGl0eT4gdGFnIGV4aXN0IGZvciBhIHBhcnRpY3VsYXJ5IGphdmEgY2xhc3MKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZShvcm1QZXJzaXN0ZW50VHlwZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbnRpdHlNYXBwaW5nc1Jvb3RTdHJ1Y3R1cmVOb2RlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCksIG9ybVhtbEpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSAoSnBhWG1sUmVzb3VyY2UpIG9ybVhtbEpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShyZXNvdXJjZS5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEltcGxpZWRFbnRpdHlNYXBwaW5nc1Jvb3RTdHJ1Y3R1cmVOb2RlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQkKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnROb3ROdWxsKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0RXF1YWxzKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpLmdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpLCBvcm1YbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gKEpwYVhtbFJlc291cmNlKSBvcm1YbWxKcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUocmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKG9ybVhtbEpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXR5TWFwcGluZ3NSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCksIG9ybVhtbEpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShnZXRPcm1YbWxSZXNvdXJjZSgpLmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1YbWxKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGVyc2lzdGVuY2VSb290U3RydWN0dXJlTm9kZVBlcnNpc3RlbmNlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWFzc2VydEVxdWFscyhnZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCksIHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IChKcGFYbWxSZXNvdXJjZSkgcGVyc2lzdGVuY2VYbWxKcGFGaWxlLmdldFJlc291cmNlTW9kZWwoKTsKLQkJcmVzb3VyY2UuZ2V0Q29udGVudHMoKS5yZW1vdmUocmVzb3VyY2UuZ2V0Um9vdE9iamVjdCgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlJRmlsZSBmaWxlID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gKEpwYVhtbFJlc291cmNlKSBwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQlyZXNvdXJjZS5nZXRDb250ZW50cygpLnJlbW92ZShyZXNvdXJjZS5nZXRSb290T2JqZWN0KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UoamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUZpbGUgZmlsZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSAoSnBhWG1sUmVzb3VyY2UpIHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRSZXNvdXJjZU1vZGVsKCk7Ci0JCXJlc291cmNlLmdldENvbnRlbnRzKCkucmVtb3ZlKHJlc291cmNlLmdldFJvb3RPYmplY3QoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbmNlUm9vdFN0cnVjdHVyZU5vZGVSZW1vdmVkRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZpbGUgZmlsZSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlnZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCk7Ci0JCWFzc2VydEVxdWFscyhnZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCksIHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuZ2V0Q29udGVudHMoKS5yZW1vdmUoZ2V0WG1sUGVyc2lzdGVuY2UoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVhtbEpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JtSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlUGVyc2lzdGVuY2VYbWxSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKGdldFhtbFBlcnNpc3RlbmNlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKYXZhUm9vdFN0cnVjdHVyZU5vZGVQZXJzaXN0ZW5jZVhtbFJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldENvbnRlbnRzKCkucmVtb3ZlKGdldFhtbFBlcnNpc3RlbmNlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPcm1KYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUoamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBPcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQ2xhc3NSZWYpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3JtSmF2YVBlcnNpc3RlbnRUeXBlUm9vdFN0cnVjdHVyZU5vZGVSZW1vdmVkRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgT3JtUGVyc2lzdGVudFR5cGUpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFBhcmVudCgpIGluc3RhbmNlb2YgQ2xhc3NSZWYpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVTcGVjaWZpZWRDbGFzc1JlZigwKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUGVyc2lzdGVudFR5cGVSb290U3RydWN0dXJlTm9kZVJlbW92ZWRGcm9tUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlJdGVyYXRvcjxKcGFTdHJ1Y3R1cmVOb2RlPiByb290U3RydWN0dXJlTm9kZXMgPSBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpOwotCQlKcGFTdHJ1Y3R1cmVOb2RlIHJvb3RTdHJ1Y3R1cmVOb2RlID0gcm9vdFN0cnVjdHVyZU5vZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgcm9vdFN0cnVjdHVyZU5vZGUpOwotCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKSwgcm9vdFN0cnVjdHVyZU5vZGUuZ2V0UGFyZW50KCkpOwotCQlhc3NlcnRGYWxzZShyb290U3RydWN0dXJlTm9kZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlbW92ZVhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFBhcmVudCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW1wbGllZEphdmFQZXJzaXN0ZW50VHlwZVJvb3RTdHJ1Y3R1cmVOb2RlUmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNFbnRpdHlNYXBwaW5nc1JlbW92ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRDb250ZW50cygpLnJlbW92ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFBhcmVudCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNQZXJzaXN0ZW5jZVVuaXRSZW1vdmVkRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJZ2V0WG1sUGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkucmVtb3ZlKDApOwotCi0JCWFzc2VydEZhbHNlKGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2Rlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUm9vdFN0cnVjdHVyZU5vZGVzUGVyc2lzdGVuY2VVbml0UmVtb3ZlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpLnJlbW92ZVBlcnNpc3RlbmNlVW5pdCgwKTsKLQotCQlhc3NlcnRGYWxzZShqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhUm9vdFN0cnVjdHVyZU5vZGVzT3JtUGVyc2lzdGVudFR5cGVSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUoMCk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFBhcmVudCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFSb290U3RydWN0dXJlTm9kZXNPcm1UeXBlTWFwcGluZ01vcnBoZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUpwYUZpbGUgamF2YUpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoKElGaWxlKSBjdS5nZXRSZXNvdXJjZSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCQlqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKDApOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRQYXJlbnQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcm1KYXZhUm9vdFN0cnVjdHVyZU5vZGVNYXBwaW5nRmlsZVJlZkNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSnBhRmlsZSBqYXZhSnBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZSgoSUZpbGUpIGN1LmdldFJlc291cmNlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgiZm9vIik7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZSA9ICgoRW50aXR5TWFwcGluZ3MpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpLmdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCQotCQlJRmlsZSBmaWxlID0gZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLmdldEZpbGUoKTsKLQkJSnBhRmlsZSBvcm1YbWxKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwkJCi0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtWG1sSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSmF2YVJvb3RTdHJ1Y3R1cmVOb2RlTWFwcGluZ0ZpbGVSZWZDaGFuZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCksIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCi0JCU1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLCBqYXZhSnBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUphdmFSb290U3RydWN1dHJlTm9kZURlbGV0ZU9ybVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKcGFGaWxlIGphdmFKcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKChJRmlsZSkgY3UuZ2V0UmVzb3VyY2UoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUsIGphdmFKcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQkKLQkJZGVsZXRlUmVzb3VyY2UoZ2V0T3JtWG1sUmVzb3VyY2UoKSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50VHlwZSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKSwgamF2YUpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UGFyZW50KCkpOwotCX0KLQkvL1RPRE8gdGVzdCByb290U3RydWN0dXJlTm9kZXMgd2l0aCBhIHN0YXRpYyBpbm5lciBjbGFzcwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwYVByb2plY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnBhUHJvamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMTYxYTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvSnBhUHJvamVjdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5QZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5HZW5lcmljUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnBhUHJvamVjdFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUFJPSkVDVF9OQU1FID0gSnBhUHJvamVjdFRlc3RzLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLQkKLQlUZXN0SnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JCi0JcHVibGljIEpwYVByb2plY3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmpwYVByb2plY3QgPSBUZXN0SnBhUHJvamVjdC5idWlsZEpwYVByb2plY3QoQkFTRV9QUk9KRUNUX05BTUUsIGZhbHNlLCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpKTsgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IERhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpKTsJCQotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnBhRmFjZXQuVkVSU0lPTl8xXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSwgR2VuZXJpY1BsYXRmb3JtLlZFUlNJT05fMV8wKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl0aGlzLmpwYVByb2plY3QgPSBudWxsOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gdGhpcy5qcGFQcm9qZWN0LmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5QRVJTSVNURU5DRV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBwZXJzaXN0ZW5jZS54bWwgZmlsZSBiYWNrCi0JCWNyZWF0ZVBlcnNpc3RlbmNlWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLlBFUlNJU1RFTkNFX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUGVyc2lzdGVuY2VYbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBQZXJzaXN0ZW5jZUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBkZWZhdWx0IG9ybS54bWwgZmlsZSBiYWNrCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVPcm1YbWxGaWxlKFN0cmluZyBmaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlTmFtZSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlICBvcm0ueG1sIGZpbGUgYmFjawotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nRmlsZVJlc291cmNlRGlmZmVyZW50bHlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZU9ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0yLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgb3JtMi54bWwgZmlsZSBiYWNrCi0JCWNyZWF0ZU9ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRKcGFDb3JlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmMzMDQyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5KcHRKcGFDb3JlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YS5KcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybS5KcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2UuSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhLkdlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm0uR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuR2VuZXJpYzJfMFBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHM7Ci0KLS8qKgotICogUmVxdWlyZWQgSmF2YSBzeXN0ZW0gcHJvcGVydHk6Ci0gKiAgIC1Eb3JnLmVjbGlwc2UuanB0LmpwYS5qYXI9PGpwYS5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhQ29yZUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCWlmIChKcHRKcGFDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShKcGFQcm9qZWN0VGVzdHMuY2xhc3MpOwotCQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpwYUZpbGVUZXN0cy5jbGFzcyk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEdlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCQlzdWl0ZS5hZGRUZXN0KEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJCXN1aXRlLmFkZFRlc3QoR2VuZXJpYzJfMFBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuc3VpdGUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZS53YXJuaW5nKEpwdEpwYUNvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEpwYUNvcmVDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2JmNDI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkJCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFJZE1hcHBpbmcpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFCYXNpY01hcHBpbmcpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFJZE1hcHBpbmcpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNYXBwaW5nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUVtYmVkZGVkTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBwaW5nS2V5MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFFbWJlZGRlZE1hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlQXR0cmlidXRlLnNldFByaW1hcnlBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuc2V0UHJpbWFyeUFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzUHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROb25SZXNvbHZpbmdGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vblJlc29sdmluZ0ZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIik7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlLmlzRm9yKHJlc291cmNlRmllbGQpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzUGVyc2lzdGFibGVNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uUmVzb2x2aW5nTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlJdGVyYXRvcjxKYXZhUmVzb3VyY2VNZXRob2Q+IG1ldGhvZHMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VHZXR0ZXIgPSBtZXRob2RzLm5leHQoKTsKLQkJSmF2YVJlc291cmNlTWV0aG9kIHJlc291cmNlU2V0dGVyID0gbWV0aG9kcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJmb28iKTsKLQkKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGUuaXNGb3IocmVzb3VyY2VHZXR0ZXIsIHJlc291cmNlU2V0dGVyKSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vblJlc29sdmluZ0ZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIEZvbyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBGb28gZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBGb28gZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oRm9vIGZvbykgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuZm9vID0gZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiYzcxZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkZpZWxkQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5Qcm9wZXJ0eUFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlV2l0aE1ldGhvZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzIEFubm90YXRpb25UZXN0VHlwZUNoaWxkICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyAiICsgVFlQRV9OQU1FICsgIigpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICBzdXBlcigpOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTm90aGluZ0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0ZpZWxkQW5kTWV0aG9kQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9CQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhNZXRob2RBbm5vdGF0aW9uKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9CQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2U0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JLy9pbmhlcml0ZWQgY2xhc3MgaGF2aW5nIGFubm90YXRpb25zIHNldCB3aW5zIG92ZXIgdGhlIGRlZmF1bHQgYWNjZXNzIHNldCBvbiBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlUGVyc2lzdGVuY2VVbml0RGVmYXVsdEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sTm9BY2Nlc3NOb0Fubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eUFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQWNjZXNzTm9Bbm5vdGF0aW9ucygpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxFbnRpdHlQcm9wZXJ0eUFjY2Vzc0FuZEZpZWxkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy94bWwgYWNjZXNzIHNldCB0byBwcm9wZXJ0eSwgZmllbGQgYW5ub3RhdGlvbnMsIEphdmFQZXJzaXN0ZW50VHlwZSBhY2Nlc3MgaXMgZmllbGQKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eUZpZWxkQWNjZXNzQW5kUHJvcGVydHlBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgc2V0IHRvIGZpZWxkLCBwcm9wZXJ0eSBhbm5vdGF0aW9ucywgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcyBpcyBwcm9wZXJ0eQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQWNjZXNzRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotCS8vaW5oZXJpdGFuY2Ugd2lucyBvdmVyIGVudGl0eS1tYXBwaW5ncyBzcGVjaWZpZWQgYWNjZXNzCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eU1hcHBpbmdzQWNjZXNzV2l0aEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkRW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCQotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNoaWxkRW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NYbWxNZXRhZGF0YUNvbXBsZXRlRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgc2V0IHRvIHByb3BlcnR5LCBqYXZhIGhhcyBmaWVsZCBhbm5vdGF0aW9ucyBzbyB0aGUgYWNjZXNzIHNob3VsZCBiZSBmaWVsZAotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzTm9YbWxBY2Nlc3NYbWxNZXRkYXRhQ29tcGxldGVQcm9wZXJ0eUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBub3Qgc2V0LCBtZXRhZGF0YSBjb21wbGV0ZSBzZXQuICBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIHByb3BlcnR5IGJlY2F1c2UgcHJvcGVydGllcyBhcmUgYW5ub3RhdGVkCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJQZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7Ci0JCQotCQkvL3N1cGVyIGlzIG5vdCBhZGRlZCB0byB0aGUgcGVyc2lzdGVuY2VVbml0LCBidXQgaXQgc2hvdWxkIHN0aWxsIGJlIGZvdW5kCi0JCS8vYXMgdGhlIHN1cGVyUGVyc2lzdGVudFR5cGUgYmVjYXVzZSBvZiBpbXBsaWVkQ2xhc3NSZWZzIGFuZCBjaGFuZ2VzIGZvciBidWcgMTkwMzE3Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCX0JCi0JCi0JLy9FbnRpdHkgZXh0ZW5kcyBOb24tRW50aXR5IGV4dGVuZHMgRW50aXR5IAotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlMygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUNsYXNzUmVmIGNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWNsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChyb290SmF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0YW5jZUhpZXJhcmNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlTm9uUGVyc2lzdGVudCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVBlcnNpc3RlbnRFeHRlbmRzTm9uUGVyc2lzdGVudCgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCUl0ZXJhdG9yPFBlcnNpc3RlbnRUeXBlPiBpbmhlcml0YW5jZUhpZXJhcmNoeSA9IGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldEluaGVyaXRhbmNlSGllcmFyY2h5KCkuaXRlcmF0b3IoKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGFuY2VIaWVyYXJjaHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkMiIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5ID0gY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKS5pdGVyYXRvcigpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nS2V5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdLZXlNYXBwaW5nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuc2V0UHJpbWFyeUFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdElzTWFwcGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5pc01hcHBlZCgpKTsKLQkJCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsJCi0JCWFzc2VydEZhbHNlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmlzTWFwcGVkKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlLmdldEFjY2Vzc29yKCkgaW5zdGFuY2VvZiBGaWVsZEFjY2Vzc29yKTsKLQkJYXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5nZXRBY2Nlc3NvcigpIGluc3RhbmNlb2YgRmllbGRBY2Nlc3Nvcik7Ci0JCWF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlLmdldEFjY2Vzc29yKCkgaW5zdGFuY2VvZiBQcm9wZXJ0eUFjY2Vzc29yKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzU2l6ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygzLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU5hbWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZm9vIikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTmFtZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbmFtZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IHRlc3RUeXBlID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBpZEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBuYW1lQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQotCQlJRmllbGQgaWRGaWVsZCA9IHRlc3RUeXBlLmZpbmRQcmltYXJ5VHlwZSgpLmdldEZpZWxkKCJpZCIpOwotCQlpZEZpZWxkLnJlbmFtZSgiaWQyIiwgZmFsc2UsIG51bGwpOwotCQkKLQkJYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuYW1lQXR0cmlidXRlMiA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZDJBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQotCQlhc3NlcnROb3RTYW1lKGlkQXR0cmlidXRlLCBpZDJBdHRyaWJ1dGUpOwotCQlhc3NlcnRFcXVhbHMoImlkMiIsIGlkMkF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZUF0dHJpYnV0ZSwgbmFtZUF0dHJpYnV0ZTIpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBuYW1lQXR0cmlidXRlMi5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGVHZW5lcmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RHZW5lcmljTWFwcGVkU3VwZXJjbGFzcygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MiIpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuRW50aXR5MSIsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkVudGl0eTIiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MSAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgRW50aXR5MjxJbnRlZ2VyPiB7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY01hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkyPEs+IHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5Mi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NOb0F0dHJpYnV0ZXNBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzRmllbGRzQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTWV0aG9kc0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NGaWVsZHNBbmRNZXRob2RzQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTm9uUGVyc2lzdGFibGVNZXRob2RBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE5vblBlcnNpc3RhYmxlTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQZXJzaXN0YWJsZU1ldGhvZEFuZE5vblBlcnNpc3RhYmxlRmllbGRBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZFBlcnNpc3RhYmxlTWV0aG9kTm9uUGVyc2lzdGFibGVGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzTm9QZXJzaXN0YWJsZUZpZWxkc0Fubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Tm9QZXJzaXN0YWJsZUZpZWxkcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQotCS8vdGhpcyBpcyBpbnZhbGlkIGFuZCBjb3ZlcmVkIGJ5IHZhbGlkYXRpb24gKGJ1ZyAzNjAwMDIpCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc0NvbnN0cnVjdG9yQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRDb25zdHJ1Y3RvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE5vblBlcnNpc3RhYmxlTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0TmFtZU1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkUGVyc2lzdGFibGVNZXRob2ROb25QZXJzaXN0YWJsZUZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSB0cmFuc2llbnQgaW50IG5vdFBlcnNpc3RhYmxlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Tm9QZXJzaXN0YWJsZUZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRNZW1iZXJUeXBlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmRlbGV0ZShzYi5pbmRleE9mKCJwcml2YXRlIGludCBpZDsiKSwgc2IuaW5kZXhPZigicHJpdmF0ZSBpbnQgaWQ7IikgKyAicHJpdmF0ZSBpbnQgaWQ7Ii5sZW5ndGgoKSk7Ci0JCQkJc2IuZGVsZXRlKHNiLmluZGV4T2YoInByaXZhdGUgU3RyaW5nIG5hbWU7IiksIHNiLmluZGV4T2YoInByaXZhdGUgU3RyaW5nIG5hbWU7IikgKyAicHJpdmF0ZSBTdHJpbmcgbmFtZTsiLmxlbmd0aCgpKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlMGRmOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FIjsKLQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFubm90YXRpb25UZXN0VHlwZUNoaWxkIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQkJCi0JcHVibGljIEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRV8gKyAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZE92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IHNwZWNpZmllZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uMSA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgYXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDMpLmdldE5hbWUoKSk7ICAvLyB0aGUgb2xkIGRlZmF1bHQgam9pbiBjb2x1bW4KLQkJCi0JCWFzc2VydEVxdWFscyg0LCBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMSwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7ICAvLyB0aGUgb2xkIGRlZmF1bHQgam9pbiBjb2x1bW4KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZE92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gc3BlY2lmaWVkT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgS2luZC5UWVBFKTsKLQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZE92ZXJyaWRlID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gc3BlY2lmaWVkT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkKLQkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IHNwZWNpZmllZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigyKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKGFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzViYjk3MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9OQU1FID0gIk1ZX0FUVFJJQlVURV9PVkVSUklERV9OQU1FIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FID0gIk1ZX0FUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSI7Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5HZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGNvbHVtbiA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtblJlc291cmNlID0gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXRDb2x1bW4oKTsKLQkJY29sdW1uUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJCi0JCWNvbHVtbiA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uU2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbiBjb2x1bW4gPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uUmVzb3VyY2UgPSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldENvbHVtbigpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0Q29sdW1uKCkpOwotCQlhc3NlcnROb3ROdWxsKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkRlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkpLmdldCgxKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uRGVmYXVsdFRhYmxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzID0gQ29sbGVjdGlvblRvb2xzLmxpc3QoZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkpLmdldCgxKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUoYXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNDdmMmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Mb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtZXJhdGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkxvYkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFCYXNpY01hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZ0ZldGNoT3B0aW9uYWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyhmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIG9wdGlvbmFsPWZhbHNlKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aExvYigpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5MT0IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQExvYiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU5VTUVSQVRFRCwgSlBBLkVOVU1fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRFTVBPUkFMLCBKUEEuVEVNUE9SQUxfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QmFzaWNHZXREZWZhdWx0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQmFzaWNHZXREZWZhdWx0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWNNYXBwaW5nLmdldEZldGNoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsJCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWJhc2ljLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEZldGNoMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZ0ZldGNoT3B0aW9uYWxTcGVjaWZpZWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBiYXNpYy5nZXRGZXRjaCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkJBU0lDKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRGZXRjaDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWNyZWF0ZU9ybVhtbEZpbGUoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSByZXNvdXJjZVR5cGUuZ2V0TWV0aG9kcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGJhc2ljLmdldEZldGNoKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQykpOwotCQkKLQkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEJhc2ljVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnROb3RTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9EZWZhdWx0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0RW51bVR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKCgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSAoKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb1ZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9FbWJlZGRlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotLy9UT0RPCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgKChJT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9PbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0vL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLS8vCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQubWFwcGluZ0Fubm90YXRpb24oT25lVG9NYW55LkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0vL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgKChJTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0vL1RPRE8JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSU1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLm1hcHBpbmdBbm5vdGF0aW9uKE1hbnlUb01hbnkuQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJhc2ljR2V0RGVmYXVsdE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5pc0RlZmF1bHRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEJhc2ljR2V0RGVmYXVsdE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYmFzaWNNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQliYXNpYy5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3B0aW9uYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nRmV0Y2hPcHRpb25hbFNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3B0aW9uYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydFRydWUoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpKTsKLQkJCi0JCWJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcHRpb25hbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQliYXNpYy5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJYmFzaWMuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQkJCi0JCWJhc2ljLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlyZXNvdXJjZUZpZWxkLnNldFByaW1hcnlBbm5vdGF0aW9uKG51bGwsIEVtcHR5SXRlcmFibGUuPFN0cmluZz5pbnN0YW5jZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuaXNPcHRpb25hbCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdElzTG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gTG9iQ29udmVydGVyLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTG9iMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aExvYigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRUcnVlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gTG9iQ29udmVydGVyLmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKExvYkNvbnZlcnRlci5jbGFzcyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzTG9iVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkgPT0gTG9iQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpID09IExvYkNvbnZlcnRlci5jbGFzcyk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSA9PSBMb2JDb252ZXJ0ZXIuY2xhc3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJhc2ljR2V0RGVmYXVsdENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRCYXNpY0dldERlZmF1bHRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkQW5ub3RhdGlvbiA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldERlZmF1bHRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWRBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnVtZXJhdGVkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGVudW1lcmF0ZWQpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRFbnVtZXJhdGVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoYmFzaWNNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGVtcG9yYWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRlbXBvcmFsLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoYmFzaWNNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ2FzY2FkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJmZTYwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDYXNjYWRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhQ2FzY2FkZVRlc3RzCi0JZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyBKYXZhQ2FzY2FkZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDYXNjYWRlIGNhc2NhZGUgPSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJLy9zZXQgYWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCQotCQkvL3NldCBhbGwgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWFubm90YXRpb24uc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZUFsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCQkJCi0JCS8vc2V0IGFsbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJCi0JCS8vc2V0IGFsbCB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldEFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgcGVyc2lzdCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgcGVyc2lzdCB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkJCQkKLQkJLy9zZXQgcGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IHBlcnNpc3QgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDYXNjYWRlIGNhc2NhZGUgPSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCS8vc2V0IG1lcmdlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCQotCQkvL3NldCBtZXJnZSB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcgbWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNhc2NhZGUgY2FzY2FkZSA9IG1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkJCQkKLQkJLy9zZXQgbWVyZ2UgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWNhc2NhZGUuc2V0TWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCQotCQkvL3NldCBtZXJnZSB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldE1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDYXNjYWRlIGNhc2NhZGUgPSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJLy9zZXQgcmVtb3ZlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCQotCQkvL3NldCByZW1vdmUgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWFubm90YXRpb24uc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCQkJCi0JCS8vc2V0IHJlbW92ZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJCi0JCS8vc2V0IHJlbW92ZSB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldFJlbW92ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQkKLQkJLy9zZXQgcmVmcmVzaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQkKLQkJLy9zZXQgcmVmcmVzaCB0byBmYWxzZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYW5ub3RhdGlvbi5zZXRDYXNjYWRlUmVmcmVzaChmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZSBjYXNjYWRlID0gbWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQkJCQkKLQkJLy9zZXQgcmVmcmVzaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vc2V0IHJlZnJlc2ggdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRSZWZyZXNoKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDb2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmMzU5My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFDb2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QmFzZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YUNvbHVtblRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9ERUZJTklUSU9OID0gIk1ZX0NPTFVNTl9ERUZJTklUSU9OIjsKLQkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRCYXNpY0NvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbih0YWJsZT1cIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihjb2x1bW5EZWZpbml0aW9uPVwiIiArIENPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEphdmFDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoYmFzaWNNYXBwaW5nLmdldFBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXROYW1lKCksIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0QmFzaWNDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJY29sdW1uQW5ub3RhdGlvbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW5Bbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVGFibGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRUYWJsZVNwZWNpZmllZFRhYmxlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygoKEVudGl0eSkgYmFzaWNNYXBwaW5nLmdldFR5cGVNYXBwaW5nKCkpLmdldE5hbWUoKSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEJhc2ljQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRUYWJsZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWNvbHVtbi5zZXRUYWJsZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9ERUZJTklUSU9OLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtblRhYmxlU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJmb28iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb25VcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJYXNzZXJ0RXF1YWxzKDU1LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDY2LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRMZW5ndGgobnVsbCk7CQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwKSwgY29sdW1uQW5ub3RhdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwoY29sdW1uQW5ub3RhdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJYXNzZXJ0RXF1YWxzKDU1LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDY2LCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRQcmVjaXNpb24obnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZigxMDApKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwMCksIGNvbHVtbkFubm90YXRpb24uZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCWFzc2VydEVxdWFscyg1NSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNTUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNjYsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCWNvbHVtbkFubm90YXRpb24uc2V0U2NhbGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkU2NhbGUoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDEwMCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTAwKSwgY29sdW1uQW5ub3RhdGlvbi5nZXRTY2FsZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VW5pcXVlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfVU5JUVVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0VW5pcXVlKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCQotCQljb2x1bW5Bbm5vdGF0aW9uLnNldFVuaXF1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbkFubm90YXRpb24uZ2V0VW5pcXVlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfSU5TRVJUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9JTlNFUlRBQkxFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW5Bbm5vdGF0aW9uLnNldEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCQotCQljb2x1bW5Bbm5vdGF0aW9uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsJCi0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljQ29sdW1uQ29sdW1uRGVmaW5pdGlvblNldCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uQW5ub3RhdGlvbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2x1bW5Bbm5vdGF0aW9uLmdldEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhSZWFkT25seUJhc2VDb2x1bW4uREVGQVVMVF9OVUxMQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlCYXNlQ29sdW1uLkRFRkFVTFRfTlVMTEFCTEUsIGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uQW5ub3RhdGlvbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbkFubm90YXRpb24uc2V0TnVsbGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJCi0JCWNvbHVtbkFubm90YXRpb24uc2V0TnVsbGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7CQotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbkFubm90YXRpb24uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2x1bW5Bbm5vdGF0aW9uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNDb2x1bW5Db2x1bW5EZWZpbml0aW9uU2V0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5QmFzZUNvbHVtbi5ERUZBVUxUX1VQREFUQUJMRSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQkKLQkJY29sdW1uQW5ub3RhdGlvbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY0NvbHVtbkNvbHVtbkRlZmluaXRpb25TZXQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW5Bbm5vdGF0aW9uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW5Bbm5vdGF0aW9uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2x1bW5Bbm5vdGF0aW9uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZGFjYWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFUT1JfQ09MVU1OX05BTUUgPSAiTVlfRElTQ1JJTUlOQVRPUl9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTiA9ICJNWV9DT0xVTU5fREVGSU5JVElPTiI7Ci0JCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIiIgKyBESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGFic3RyYWN0IGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JCQotCXB1YmxpYyBKYXZhRGlzY3JpbWluYXRvckNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJEVFlQRSIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkRUWVBFIiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUiLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX0NPTFVNTl9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQotCQlhc3NlcnROdWxsKGRpc2NyaW1pbmF0b3JDb2x1bW4pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gZGlzY3JpbWluYXRvckNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXREaXNjcmltaW5hdG9yVHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGRpc2NyaW1pbmF0b3JDb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkRpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDU1KSk7Ci0JCWFzc2VydEVxdWFscyg1NSwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCi0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1NSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNjYpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDY2KSwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2NiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRMZW5ndGgoKSk7CQkKLQkJZGlzY3JpbWluYXRvckNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlkaXNjcmltaW5hdG9yQ29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwkKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoMTAwKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yQ29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMDApLCBkaXNjcmltaW5hdG9yQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGhVcGRhdGVzRnJvbVJlc291cmNlQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQljb2x1bW4uc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZig3OCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3OCksIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNzgsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJY29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oQ09MVU1OX0RFRklOSVRJT04pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fREVGSU5JVElPTiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJmb28iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLiIgKyAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgY2hpbGRFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBubyBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCi0JCQotCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgb24gcm9vdAotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRFRZUEUyIik7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGFic3RyYWN0RW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEVFlQRTIiLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEVFlQRTIiLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQkKLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggdGFibGUtcGVyLWNsYXNzIGluaGVyaXRhbmNlLCBkaXNjcmltaW5hdG9yIGNvbHVtbiBkb2VzIG5vdCBhcHBseQotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhYnN0cmFjdEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGFic3RyYWN0RW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5NjkyMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFFbWJlZGRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHVibGljIEphdmFFbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpOwotCQkKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNvdXJjZVR5cGUgPSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc291cmNlVHlwZSA9IGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGVtYmVkZGFibGUuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSwgImlkIik7Ci0JCWFzc2VydEVxdWFscyhvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSwgIm5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZW1iZWRkYWJsZS5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUudGFibGVOYW1lSXNJbnZhbGlkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS50YWJsZU5hbWVJc0ludmFsaWQoIkZPTyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkYWJsZS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmdldEFzc29jaWF0ZWRUYWJsZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRGYWxzZShlbWJlZGRhYmxlLmdldEFsbEFzc29jaWF0ZWRUYWJsZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVOYW1lc0luY2x1ZGluZ0luaGVyaXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKGVtYmVkZGFibGUuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCS8vVE9ETyBuZWVkIHRvIGNyZWF0ZSBhIHN1YmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgYW5kIHRlc3QgdGhpcwotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBlbWJlZGRhYmxlLmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2UwYjM5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FOwotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERURfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkSWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyIgbXlFbWJlZGRlZElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVtYmVkZGFibGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChFTUJFRERBQkxFX1RZUEVfTkFNRSkuYXBwZW5kKCIgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQotCXB1YmxpYyBKYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoKChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEVtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWRJZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZElkIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZElkIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZElkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkSWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2UyY2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRUREQUJMRV9UWVBFX05BTUUgPSAiTXlFbWJlZGRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiIG15RW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChFTUJFRERBQkxFX1RZUEVfTkFNRSkuYXBwZW5kKCIgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCi0JcHVibGljIEphdmFFbWJlZGRlZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoKChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZE1hcHBpbmdHZW5lcmljRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEdlbmVyaWNFbWJlZGRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVtYmVkZGFibGUxIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBFbnRpdHkxIHsgIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgRW1iZWRkYWJsZTE8SW50ZWdlcj4gbXlFbWJlZGRhYmxlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW50aXR5MS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RHZW5lcmljRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW1iZWRkYWJsZTE8VD4ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbWJlZGRhYmxlMS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUVtYmVkZGVkIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZCIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJzdGF0ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygic3RhdGUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQkvLzEuMCBwcm9qZWN0cyBkbyBub3Qgc3VwcG9ydCBkb3Qtbm90YXRpb24sIHRoaXMgdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgc3VwcG9ydCBkb2VzIG5vdCBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy56aXBDb2RlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IHRoZXJlIGlzIG5vIGF0dHJpYnV0ZSBvdmVycmlkZSBuYW1lZCB6aXBDb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInppcENvZGUucGx1c2ZvdXIiKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFiNWE2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZE5hdGl2ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTnVsbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhRW50aXR5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfTkFNRSA9ICJlbnRpdHlOYW1lIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0NSSU1JTkFUT1JfVkFMVUUgPSAiTVlfRElTQ1JJTUlOQVRPUl9WQUxVRSI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCQotCQotCXB1YmxpYyBKYXZhRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJbnZhbGlkTmFtZWRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5OQU1FRF9RVUVSSUVTLCBKUEEuTkFNRURfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcmllcyh2YWx1ZT17QE5hbWVkUXVlcnkocXVlcnk9XCJhc2RmXCIsIG5hbWU9XCJmb29cIiksIEBOYW1lZFF1ZXJ9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGFic3RyYWN0IGNsYXNzICIpLmFwcGVuZChUWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEZJTEVfTkFNRSwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRpb25PblByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQkJCUpQQS5NQVBQRURfU1VQRVJDTEFTUywgCi0JCQkJCUpQQS5CQVNJQywKLQkJCQkJSlBBLlZFUlNJT04sCi0JCQkJCUpQQS5UUkFOU0lFTlQsCi0JCQkJCUpQQS5FTUJFRERFRCwKLQkJCQkJSlBBLkVNQkVEREVEX0lELAotCQkJCQlKUEEuT05FX1RPX09ORSwKLQkJCQkJSlBBLk9ORV9UT19NQU5ZLAotCQkJCQlKUEEuTUFOWV9UT19PTkUsCi0JCQkJCUpQQS5NQU5ZX1RPX01BTlksCi0JCQkJCUpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEJhc2ljIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBiYXNpYzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFZlcnNpb24iKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHZlcnNpb247IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUcmFuc2llbnQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHRyYW5zaWVudDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkSWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtYmVkZGVkSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgU1VCX1RZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IG9uZVRvTWFueTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgbWFueVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgbWFueVRvTWFueTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7Ci0JCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5KG5hbWU9XCIiICsgRU5USVRZX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JWYWx1ZSh2YWx1ZT1cIiIgKyBESVNDUklNSU5BVE9SX1ZBTFVFICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT1cImZvb1wiKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9XCJiYXJcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlQWJzdHJhY3RUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneT1Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJUZXN0VHlwZUlkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlRlc3RUeXBlSWQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IChKYXZhRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJhc2RmIik7Ci0JCWVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQllbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3MpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJbmhlcml0YW5jZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVudGl0eSBlbnRpdHkgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQllbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiYXNkZiIpOwotCQllbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoIm15SWRDbGFzcyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbnRpdHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJbmhlcml0YW5jZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gKEphdmFFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoImFzZGYiKTsKLQkJZW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQllbnRpdHkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSW5oZXJpdGFuY2VBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzQW5ub3RhdGlvbnNPblN1cGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0aW9uT25Qcm9wZXJ0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUVfICsgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwkJCi0JCQotCQkoKElkTWFwcGluZykgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJcmVzb3VyY2VUeXBlLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpLm5leHQoKS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkvL25vIG1hcHBpbmcoSWQpIGFubm90YXRpb24sIGJ1dCBzdGlsbCBhIENvbHVtbiBhbm5vdGF0aW9uLCBzbyBhY2Nlc3Mgc2hvdWxkIHN0aWxsIGJlIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCi0JCSgoQmFzaWNNYXBwaW5nKSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCS8vc3RpbGwgYWNjZXNzVHlwZSBvZiBQUk9QRVJUWSBiZWNhdXNlIHRoZSBqYXZhIGNsYXNzIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhpcyBvcm0ueG1sCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBzdXBlclBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJcmVtb3ZlWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vb25seSBwYXJlbnQgc3BlY2lmaWVkIGluIG9ybS54bWwsIGkgdGhpbmsgdGhpcyBvdXRjb21lIGlzIHJpZ2h0Pz8KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCXJlbW92ZVhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJLy9ib3RoIHBhcmVudCBhbmQgY2hpbGQgc3BlY2lmaWVkIGluIG9ybS54bWwKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzV2l0aFhtbFNldHRpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0aW9uT25Qcm9wZXJ0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCQotCQkoKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCXJlc291cmNlVHlwZS5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCkucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJLy9ubyBtYXBwaW5nKElkKSBhbm5vdGF0aW9uLCBidXQgc3RpbGwgYSBDb2x1bW4gYW5ub3RhdGlvbiwgc28gYWNjZXNzIHNob3VsZCBzdGlsbCBiZSBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJKChCYXNpY01hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJLy9zdGlsbCBhY2Nlc3NUeXBlIG9mIFBST1BFUlRZIGJlY2F1c2UgdGhlIGphdmEgY2xhc3MgaXMgbm90IHNwZWNpZmllZCBpbiB0aGlzIG9ybS54bWwKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkvL25vdyBjbGFzcyBpcyBzcGVjaWZpZWQgaW4gb3JtLnhtbCwgc28gZW50aXR5TWFwcGluZ3MgYWNjZXNzIHNldHRpbmcgd2lucyBvdmVyIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJCi0JCS8vYWNjZXNzVHlwZSBzaG91bGQgYmUgUFJPUEVSVFkgbm93LCBqYXZhIGdldHMgdGhlIGFjY2VzcyBmcm9tIHhtbCBlbnRpdHkgaWYgaXQgaXMgc3BlY2lmaWVkCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lU3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnROdWxsKCgoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRnJvbVNwZWNpZmllZE5hbWVDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnRpdHkuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKEVOVElUWV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlTmFtZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFByaW1hcnlUYWJsZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZU5hbWUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0UHJpbWFyeVRhYmxlTmFtZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZU5hbWVXaXRoTnVsbFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlUYWJsZSB0YWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlIiwgY3UpOwotCQkKLQkJdGFibGUuc2V0U3BlY2lmaWVkTmFtZShUQUJMRV9OQU1FKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFByaW1hcnlUYWJsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCi0JCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coVEFCTEVfTkFNRSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEluaGVyaXRhbmNlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBnZXRKYXZhRW50aXR5KCkuZ2V0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRW50aXR5IHJvb3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUoY2hpbGRFbnRpdHksIHJvb3RFbnRpdHkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQkvL2NoYW5nZSByb290IGluaGVyaXRhbmNlIHN0cmF0ZWd5LCB2ZXJpZnkgZGVmYXVsdCBpcyBjaGFuZ2VkIGZvciBjaGlsZCBlbnRpdHkKLQkJcm9vdEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCByb290RW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBjaGlsZEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGNoaWxkRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSW5oZXJpdGFuY2UoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCWluaGVyaXRhbmNlLnNldFN0cmF0ZWd5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSW5oZXJpdGFuY2UoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgaW5oZXJpdGFuY2UuZ2V0U3RyYXRlZ3koKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhESVNDUklNSU5BVE9SX1ZBTFVFLCBnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQkKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGdldEphdmFFbnRpdHkoKS5nZXROYW1lKCksIGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEaXNjcmltaW5hdG9yVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfVkFMVUUsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yVmFsdWUgPSAoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWRpc2NyaW1pbmF0b3JWYWx1ZS5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQkKLQkJZGlzY3JpbWluYXRvclZhbHVlLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERpc2NyaW1pbmF0b3JWYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKERJU0NSSU1JTkFUT1JfVkFMVUUsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZGlzY3JpbWluYXRvclZhbHVlLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0VHJ1ZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCi0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRUcnVlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCi0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gc2Vjb25kYXJ5VGFibGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlUHJlc2VydmVQa0pvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJTQ0hFTUEiKTsKLQkJc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiUEtfTkFNRSIpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBzcGVjaWZpZWQgc2Vjb25kYXJ5IHRhYmxlLCBwa0pvaW5Db2x1bW5zIGZyb20gZmlyc3Qgc2hvdWxkIGJlIHNhdmVkLgotCQlTZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZTIgPSBnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSk7Ci0JCXNwZWNpZmllZFNlY29uZGFyeVRhYmxlMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCQotCQlJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IHNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmRhcnlUYWJsZSwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiU0NIRU1BIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiUEtfTkFNRSIsIHBrSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUgPSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kYXJ5VGFibGUsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlMik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlnZXRKYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlnZXRKYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQllbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhU2Vjb25kYXJ5VGFibGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhU2Vjb25kYXJ5VGFibGVzKSk7Ci0JCQotCQkKLQkJZW50aXR5Lm1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YVNlY29uZGFyeVRhYmxlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0KLQkJZW50aXR5Lm1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwLCAxKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YVNlY29uZGFyeVRhYmxlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBqYXZhU2Vjb25kYXJ5VGFibGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgamF2YVNlY29uZGFyeVRhYmxlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIGphdmFTZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2Vjb25kYXJ5VGFibGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBTZWNvbmRhcnlUYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gZW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRlZFRhYmxlcygpKSk7Ci0JCUl0ZXJhdG9yPFJlYWRPbmx5VGFibGU+IGFzc29jaWF0ZWRUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRlZFRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5VGFibGUgdGFibGUxID0gYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCVNlY29uZGFyeVRhYmxlIHRhYmxlMiA9IChTZWNvbmRhcnlUYWJsZSkgYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCVNlY29uZGFyeVRhYmxlIHRhYmxlMyA9IChTZWNvbmRhcnlUYWJsZSkgYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHRhYmxlMS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlMi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRhYmxlMy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRW50aXR5IHJvb3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUocm9vdEVudGl0eS5nZXRBbGxBc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkJSXRlcmF0b3I8UmVhZE9ubHlUYWJsZT4gYXNzb2NpYXRlZFRhYmxlcyA9IHJvb3RFbnRpdHkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5VGFibGUgdGFibGUxID0gYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCVNlY29uZGFyeVRhYmxlIHRhYmxlMiA9IChTZWNvbmRhcnlUYWJsZSkgYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCVNlY29uZGFyeVRhYmxlIHRhYmxlMyA9IChTZWNvbmRhcnlUYWJsZSkgYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHRhYmxlMS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlMi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRhYmxlMy5nZXROYW1lKCkpOwotCi0JCS8vVE9ETyBwcm9iYWJseSB3YW50IHRoaXMgdG8gYmUgMywgc2luY2UgaW4gdGhpcyBjYXNlIHRoZSBjaGlsZCBkZXNjcmlwdG9yIHJlYWxseSB1c2VzIHRoZQotCQkvL3BhcmVudCB0YWJsZSBiZWNhdXNlIGl0IGlzIHNpbmdsZSB0YWJsZSBpbmhlcml0YW5jZSBzdHJhdGVneS4gIE5vdCBzdXJlIHlldCBob3cgdG8gZGVhbCB3aXRoIHRoaXMuCi0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShjaGlsZEVudGl0eS5nZXRBbGxBc3NvY2lhdGVkVGFibGVzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUVudGl0eSBjaGlsZEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFbnRpdHkgcm9vdEVudGl0eSA9IChFbnRpdHkpIHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKHJvb3RFbnRpdHkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKSkpOwotCQlJdGVyYXRvcjxTdHJpbmc+IGFzc29jaWF0ZWRUYWJsZXMgPSByb290RW50aXR5LmdldEFsbEFzc29jaWF0ZWRUYWJsZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJU3RyaW5nIHRhYmxlMSA9IGFzc29jaWF0ZWRUYWJsZXMubmV4dCgpOwotCQlTdHJpbmcgdGFibGUyID0gYXNzb2NpYXRlZFRhYmxlcy5uZXh0KCk7Ci0JCVN0cmluZyB0YWJsZTMgPSBhc3NvY2lhdGVkVGFibGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdGFibGUxKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZTIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHRhYmxlMyk7Ci0JCQotCQkvL1RPRE8gcHJvYmFibHkgd2FudCB0aGlzIHRvIGJlIDMsIHNpbmNlIGluIHRoaXMgY2FzZSB0aGUgY2hpbGQgZGVzY3JpcHRvciByZWFsbHkgdXNlcyB0aGUKLQkJLy9wYXJlbnQgdGFibGUgYmVjYXVzZSBpdCBpcyBzaW5nbGUgdGFibGUgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kuICBOb3Qgc3VyZSB5ZXQgaG93IHRvIGRlYWwgd2l0aCB0aGlzLgotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUoY2hpbGRFbnRpdHkuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlTmFtZXMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2Vjb25kYXJ5VGFibGVUb1Jlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUyID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlMi5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlMyA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZTMuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlzZWNvbmRhcnlUYWJsZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlY29uZGFyeVRhYmxlRnJvbVJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMikuc2V0U3BlY2lmaWVkTmFtZSgiYmF6Iik7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhU2Vjb25kYXJ5VGFibGU+IHNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6Iiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6Iiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SmF2YUVudGl0eSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUikpOwotCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKSk7Ci0KLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHNlcXVlbmNlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQkJCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSB0YWJsZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlnZXRKYXZhRW50aXR5KCkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZ2V0SmF2YUVudGl0eSgpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCXBrSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlwa0pvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlwa0pvaW5Db2x1bW4uc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCXBrSm9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCXBrSm9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCS8vanVzdCB0aGUgZGVmYXVsdCBwa0pvaW5Db2x1bW4sIHNvIDEKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFFbnRpdHkoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJLy9vbmx5IHRoZSBzcGVjaWZpZWQgcGtKb2luQ29sdW1ucywgMwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YUVudGl0eSgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YUVudGl0eSgpLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHBrSm9pbkNvbHVtbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlwa0pvaW5Db2x1bW5zID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlnZXRKYXZhRW50aXR5KCkucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCXBrSm9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJcGtKb2luQ29sdW1ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQllbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMpKTsKLQkJCi0JCQotCQllbnRpdHkubW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkubW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YVByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gZW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCAgUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBlbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNEZWZhdWx0KCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW4uaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVOYW1lSXNJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZ2V0SmF2YUVudGl0eSgpLnRhYmxlTmFtZUlzSW52YWxpZChUWVBFX05BTUUpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkudGFibGVOYW1lSXNJbnZhbGlkKCJGT08iKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRGYWxzZShnZXRKYXZhRW50aXR5KCkudGFibGVOYW1lSXNJbnZhbGlkKCJCQVIiKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGZvb01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpLmdldE1hcHBpbmcoKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWZvb01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlmb29NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJZm9vTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQotCQlKYXZhRW50aXR5IHN1cGVyY2xhc3MgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKDYsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotLy8JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJSXRlcmF0b3I8UmVsYXRpb25zaGlwTWFwcGluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuYWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlSZWFkT25seUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCVJlYWRPbmx5Sm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQkKLQotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIikuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX0NPTFVNTiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlqb2luaW5nU3RyYXRlZ3kgPSAoKFJlYWRPbmx5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fQ09MVU1OIiwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCQotCQkKLQkJCi0JCQotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMSwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCUphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCW5hbWVkUXVlcnkxLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeTIgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQluYW1lZFF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7Ci0JCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MiwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MywgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZFF1ZXJ5MSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJmb28iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWROYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUludmFsaWROYW1lZFF1ZXJpZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQkKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJbmF0aXZlUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWROYXRpdmVRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFOYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQkKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5hbWVkUXVlcmllc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzU2l6ZSgpKTsKLQotCQkoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTIgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5MyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MiwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MywgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5LCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDIsIDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWROYXRpdmVRdWVyaWVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXNTaXplKCkpOwotCi0JCSgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUlkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0SWRDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzc0Fubm90YXRpb24gPSAoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy8gdGVzdCBzZXR0aW5nIGlkIGNsYXNzIG5hbWUgdG8gbm9uZXhpc3RlbnQgY2xhc3MuICB0ZXN0IGNsYXNzIG5hbWUgaXMgc2V0LCBidXQgY2xhc3MgaXMgbnVsbAotCQlTdHJpbmcgbm9uRXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuRm9vIjsKLQkJaWRDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUobm9uRXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsICgoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vIHRlc3Qgc2V0dGluZyBpZCBjbGFzcyBuYW1lIHRvIGV4aXN0ZW50IGNsYXNzLiAgdGVzdCBjbGFzcyBuYW1lIGlzIHNldCBhbmQgY2xhc3MgaXMgbm90IG51bGwKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLlRlc3RUeXBlSWQiOwotCQlpZENsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgIEBJZENsYXNzIHZhbHVlIHRvIG51bGwKLQkJaWRDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJLy9yZXNldCBASWRDbGFzcyB2YWx1ZSBhbmQgdGhlbiByZW1vdmUgQElkQ2xhc3MKLQkJaWRDbGFzc0Fubm90YXRpb24gPSAoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQotCQlpZENsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldElkQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdElkQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIG5vbkV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgIkZvbyI7Ci0JCWdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobm9uRXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCAoKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUVfICsgIlRlc3RUeXBlSWQiOwotCQlnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKGV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRJZENsYXNzUmVmZXJlbmNlKCkuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLmdldElkQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByaW1hcnlLZXlDb2x1bW5OYW1lV2l0aEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0JCQotCQkoKEphdmFJZE1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lEIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqYXZhRW50aXR5LmdldFByaW1hcnlLZXlDb2x1bW5OYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJJRCIpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgamF2YUVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkQ29uY3JldGVDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKGdldEphdmFFbnRpdHkoKS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQkJCi0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0SmF2YUVudGl0eSgpLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWRBYnN0cmFjdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0JCQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoZ2V0SmF2YUVudGl0eSgpLmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJLy90YWJsZS1wZXItY2xhc3MsIG5vIGRpc2NyaW1pbmF0b3IgY29sdW1uIGFsbG93ZWQKLQkJYXNzZXJ0RmFsc2UoY29uY3JldGVFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0RmFsc2UoYWJzdHJhY3RFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQotCQkKLQkJLy9zaW5nbGUtdGFibGUsIGRpc2NyaW1pbmF0b3IgY29sdW1uIGFsbG93ZWQgb24gcm9vdCBlbnRpdHkKLQkJYWJzdHJhY3RFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0RmFsc2UoY29uY3JldGVFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0VHJ1ZShhYnN0cmFjdEVudGl0eS5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RFbnRpdHlHZXREZWZhdWx0RGlzY3JpbWluYXRvckNvbHVtbk5hbWVUYWJsZVBlckNsYXNzSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlQWJzdHJhY3RUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlFbnRpdHkgY29uY3JldGVFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNvbmNyZXRlRW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQlFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgYWJzdHJhY3RFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBjb25jcmV0ZUVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCQotCQlhc3NlcnRUcnVlKGFic3RyYWN0RW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQlhc3NlcnRGYWxzZShjb25jcmV0ZUVudGl0eS5zcGVjaWZpZWREaXNjcmltaW5hdG9yQ29sdW1uSXNBbGxvd2VkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhYnN0cmFjdEVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydFRydWUoY29uY3JldGVFbnRpdHkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RmNjc1ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SID0gIk1ZX0dFTkVSQVRPUiI7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5HRU5FUkFURURfVkFMVUUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZShnZW5lcmF0b3I9XCIiICsgR0VORVJBVE9SICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhR2VuZXJhdGVkVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQotCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCBzZXF1ZW5jZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCQotCQlnZW5lcmF0ZWRWYWx1ZS5zZXRHZW5lcmF0b3IoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0R2VuZXJhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRHZW5lcmF0b3IoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkR2VuZXJhdG9yKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0R2VuZXJhdG9yKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldEdlbmVyYXRvcigpKTsKLQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5zZXRTcGVjaWZpZWRHZW5lcmF0b3IobnVsbCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbiBnZW5lcmF0ZWRWYWx1ZSA9IChHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0KLQkJLy9jaGFuZ2UgcmVzb3VyY2UgbW9kZWwgc2VxdWVuY2VHZW5lcmF0b3IgbmFtZSwgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3kob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5JREVOVElUWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0ZWRWYWx1ZS5ERUZBVUxUX1NUUkFURUdZLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXREZWZhdWx0U3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJhdGVkVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRlZFZhbHVlLkRFRkFVTFRfU1RSQVRFR1ksIGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldFN0cmF0ZWd5KCkpOwotCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLnNldFNwZWNpZmllZFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLklERU5USVRZKTsKLQkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5JREVOVElUWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuR2VuZXJhdGlvblR5cGUuSURFTlRJVFksIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuc2V0U3BlY2lmaWVkU3RyYXRlZ3kobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGVkVmFsdWUuREVGQVVMVF9TVFJBVEVHWSwgaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0JCWdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlhc3NlcnROb3ROdWxsKGdlbmVyYXRlZFZhbHVlKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZS5nZXRTdHJhdGVneSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSWRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhjN2Q4NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFJZE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0ZWRWYWx1ZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUdlbmVyYXRvckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFJZE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgSmF2YUlkTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUZW1wb3JhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGlkTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgaWRNYXBwaW5nLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgaWRNYXBwaW5nLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQotCQkvL3RyeSBhZGRpbmcgYW5vdGhlciBzZXF1ZW5jZSBnZW5lcmF0b3IsIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKSk7Ci0KLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHNlcXVlbmNlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgaWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBpZE1hcHBpbmcuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCQotCQkvL3RyeSBhZGRpbmcgYW5vdGhlciB0YWJsZSBnZW5lcmF0b3IsIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUikpOwotCQkKLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHRhYmxlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmF0ZWRWYWx1ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nR2VuZXJhdGVkVmFsdWUoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnROb3ROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuR0VORVJBVEVEX1ZBTFVFKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgZ2VuZXJhdGVkIHZhbHVlLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJaWRNYXBwaW5nLnJlbW92ZUdlbmVyYXRlZFZhbHVlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSkpOwotCQkKLQkJLy90cnkgcmVtb3ZpbmcgdGhlIGdlbmVyYXRlZFZhbHVlIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJaWRNYXBwaW5nLnJlbW92ZUdlbmVyYXRlZFZhbHVlKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YmRkMmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pbkNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFKb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBKYXZhSm9pbkNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgUHJvamVjdCB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgcHJval9pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5Bbm5vdGF0aW9uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbkFubm90YXRpb24pOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWpvaW5Db2x1bW5Bbm5vdGF0aW9uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJam9pbkNvbHVtbkFubm90YXRpb24uc2V0TmFtZSgiRk9PIik7CQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5Bbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCwgYW5ub3RhdGlvbiBpcyBOT1QgcmVtb3ZlZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWpvaW5Db2x1bW5Bbm5vdGF0aW9uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uQW5ub3RhdGlvbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW5Bbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJam9pbkNvbHVtbkFubm90YXRpb24gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5Bbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCS8vIDxhdHRyaWJ1dGUgbmFtZT5fPHJlZmVyZW5jZWQgY29sdW1uIG5hbWU+Ci0JLy8gICAgIG9yCi0JLy8gPHRhcmdldCBlbnRpdHkgbmFtZT5fPHJlZmVyZW5jZWQgY29sdW1uIG5hbWU+CQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmUoKTsKLQkJY3JlYXRlVGFyZ2V0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0vLwkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlcygpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0vLwkJSmF2YUpvaW5Db2x1bW5Kb2luaW5nU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtbkpvaW5pbmdTdHJhdGVneSgpOwotLy8JCUphdmFKb2luQ29sdW1uIGRlZmF1bHRKYXZhSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0vLwkKLS8vCQlhc3NlcnROdWxsKGRlZmF1bHRKYXZhSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vVE9ETyB0ZXN0IGRlZmF1bHQgam9pbiBjb2x1bW4gbmFtZQotLy8JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyBqb2luIHRhYmxlIG5hbWUgaXMgW3RhYmxlIG5hbWVdX1t0YXJnZXQgdGFibGUgbmFtZV0KLS8vCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCUphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlIHR5cGVSZXNvdXJjZSA9IGpwYVByb2plY3QoKS5qYXZhUGVyc2lzdGVudFR5cGVSZXNvdXJjZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlKYXZhUGVyc2lzdGVudHJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHR5cGVSZXNvdXJjZS5hdHRyaWJ1dGVzKCkubmV4dCgpOwotLy8JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5hbm5vdGF0aW9uKEpvaW5UYWJsZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQotLy8JCS8vdGFyZ2V0IGVudGl0eSBkb2VzIG5vdCByZXNvbHZlLCBkZWZhdWx0IG5hbWUgaXMgbnVsbAotLy8JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7Ci0vLwkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdCBuYW1lIGlzIGFnYWluIFt0YWJsZSBuYW1lXV9bdGFyZ2V0IHRhYmxlIG5hbWVdCi0vLwkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCS8vYWRkIHRoZSBqb2luIHRhYmxlIGFubm90YXRpb24sIHZlcmlmeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotLy8JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGUuQU5OT1RBVElPTl9OQU1FKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5hbm5vdGF0aW9uKEpvaW5UYWJsZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQkKLS8vCQkvL3NldCBhIHRhYmxlIG9uIHRoZSB0YXJnZXQgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLS8vCQltYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfRk9PIiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCS8vc2V0IGEgdGFibGUgb24gdGhlIG93bmluZyBlbnRpdHksIHZlcnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgdXBkYXRlcwotLy8JCWphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotLy8JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4pOwotCQkKLQkJCi0JCS8vc2V0IHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQkvL3NldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCAKLQkJamF2YUpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJLy9zZXQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JLy9UT0RPIHRlc3QgZGVmYXVsdCBqb2luIGNvbHVtbiByZWZlcmVuY2VkIGNvbHVtbiBuYW1lCi0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7Ci0JCQotCQkKLQkJLy9zZXQgdGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXRUYWJsZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQotCQkvL3NldCB0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKCJCQVIiLCBqYXZhSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJLy9zZXQgdGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgdGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkvL1RPRE8gdGVzdCBkZWZhdWx0IGpvaW4gY29sdW1uIHRhYmxlCi0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7Ci0JCQotCQkKLQkJLy9zZXQgdW5pcXVlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwkKLQkJamF2YUpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGphdmFKb2luQ29sdW1uLmdldFVuaXF1ZSgpKTsKLQkKLQkJLy9zZXQgdW5pcXVlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCAKLQkJamF2YUpvaW5Db2x1bW4uc2V0VW5pcXVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCB1bmlxdWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCkpOwotCQkKLQkJLy9zZXQgdW5pcXVlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0VW5pcXVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbik7Ci0JCQotCQkKLQkJLy9zZXQgbnVsbGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7CQotCQlqYXZhSm9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGphdmFKb2luQ29sdW1uLmdldE51bGxhYmxlKCkpOwotCQotCQkvL3NldCBudWxsYWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldE51bGxhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldE51bGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJCi0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQkvL3NldCBudWxsYWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgamF2YUpvaW5Db2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQkvL3NldCBudWxsYWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uKTsKLQkJCi0JCQotCQkvL3NldCBpbnNlcnRhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwkKLQkJamF2YUpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgamF2YUpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pbkNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkKLQkJSmF2YUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCS8vc2V0IGluc2VydGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGphdmFKb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4pOwotCQkKLQkJCi0JCS8vc2V0IHVwZGF0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YUpvaW5Db2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsJCi0JCWphdmFKb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCUphdmFKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqYXZhSm9pbkNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCi0JCS8vc2V0IHVwZGF0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgCi0JCWphdmFKb2luQ29sdW1uLnNldFVwZGF0YWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5Db2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCQotCQlKYXZhSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJLy9zZXQgdXBkYXRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqYXZhSm9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGphdmFKb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IHVwZGF0YWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luQ29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhSm9pblRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4MDg2MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFKb2luVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFKb2luVGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEphdmFKb2luVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFByb2plY3Q+IHByb2plY3RzOyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIFByb2plY3QgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHByb2pfaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9qZWN0LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUYXJnZXRFbnRpdHlXaXRoQmFja1BvaW50ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyBQcm9qZWN0IHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBwcm9qX2lkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9XCJwcm9qZWN0c1wiIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPCIgKyBUWVBFX05BTUUgKyAiPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9qZWN0LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhSm9pblRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWphdmFKb2luVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVBbm5vdGF0aW9uKTsKLQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJLy9qb2luVGFibGUgZGVmYXVsdCBuYW1lIGlzIG51bGwgYmVjYXVzZSB0YXJnZXRFbnRpdHkgaXMgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyBqb2luIHRhYmxlIG5hbWUgaXMgW3RhYmxlIG5hbWVdX1t0YXJnZXQgdGFibGUgbmFtZV0KLQkJY3JlYXRlVGFyZ2V0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvamVjdCIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkKLQkJLy90YXJnZXQgZW50aXR5IGRvZXMgbm90IHJlc29sdmUsIGRlZmF1bHQgbmFtZSBpcyBudWxsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdCBuYW1lIGlzIGFnYWluIFt0YWJsZSBuYW1lXV9bdGFyZ2V0IHRhYmxlIG5hbWVdCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkvL2FkZCB0aGUgam9pbiB0YWJsZSBhbm5vdGF0aW9uLCB2ZXJpZnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgaXMgdGhlIHNhbWUKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IGEgdGFibGUgb24gdGhlIHRhcmdldCBlbnRpdHksIHZlcnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgdXBkYXRlcwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IGEgdGFibGUgb24gdGhlIG93bmluZyBlbnRpdHksIHZlcnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgdXBkYXRlcwotCQlnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2pvaW5UYWJsZSBkZWZhdWx0IG5hbWUgaXMgbnVsbCBiZWNhdXNlIHRhcmdldEVudGl0eSBpcyBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL2FkZCB0YXJnZXQgZW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBqb2luIGNvbHVtbiBkZWZhdWx0IG5hbWUgYW5kIHJlZmVyZW5jZWQgY29sdW1uIHN0aWxsIG51bGwgYmVjYXVzZSBvd25pbmcgZW50aXR5IGhhcyBubyBwcmltYXJ5IGtleQotCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9qZWN0Iik7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vY3JlYXRlIHByaW1hcnkga2V5ICBpbiBvd25pbmcgZW50aXR5Ci0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9zZXQgc3BlY2lmaWVkIGNvbHVtbiBuYW1lIG9uIHByaW1hcnkga2V5IGluIG93bmluZyBlbnRpdHkKLQkJKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSUQiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQotCQkvL3RhcmdldCBlbnRpdHkgZG9lcyBub3QgcmVzb2x2ZSwgaW52ZXJzZSBqb2luIGNvbHVtbiBuYW1lIGFuZCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGlzIG51bGwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdHMgZm9yIGpvaW4gY29sdW1uIGFyZSBiYWNrCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9hZGQgdGhlIGpvaW4gdGFibGUgYW5ub3RhdGlvbiwgdmVyaWZ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIGlzIHRoZSBzYW1lCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Sm9pbkNvbHVtbnNCaWRpcmVjdGlvbmFsUmVsYXRpb25zaGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vam9pblRhYmxlIGRlZmF1bHQgbmFtZSBpcyBudWxsIGJlY2F1c2UgdGFyZ2V0RW50aXR5IGlzIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGpvaW4gY29sdW1uIGRlZmF1bHQgbmFtZSBhbmQgcmVmZXJlbmNlZCBjb2x1bW4gc3RpbGwgbnVsbCBiZWNhdXNlIG93bmluZyBlbnRpdHkgaGFzIG5vIHByaW1hcnkga2V5Ci0JCWNyZWF0ZVRhcmdldEVudGl0eVdpdGhCYWNrUG9pbnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9jcmVhdGUgcHJpbWFyeSBrZXkgIGluIG93bmluZyBlbnRpdHkKLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL3NldCBzcGVjaWZpZWQgY29sdW1uIG5hbWUgb24gcHJpbWFyeSBrZXkgaW4gb3duaW5nIGVudGl0eQotCQkoKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9JRCIpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCi0JCS8vdGFyZ2V0IGVudGl0eSBkb2VzIG5vdCByZXNvbHZlLCBpbnZlcnNlIGpvaW4gY29sdW1uIG5hbWUgYW5kIHJlZmVyZW5jZWQgY29sdW1uIG5hbWUgaXMgbnVsbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9kZWZhdWx0IHRhcmdldCBlbnRpdHkgZG9lcyByZXNvbHZlLCBzbyBkZWZhdWx0cyBmb3Igam9pbiBjb2x1bW4gYXJlIGJhY2sKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL2FkZCB0aGUgam9pbiB0YWJsZSBhbm5vdGF0aW9uLCB2ZXJpZnkgZGVmYXVsdCBqb2luIHRhYmxlIG5hbWUgaXMgdGhlIHNhbWUKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luVGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTY2hlbWEoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YUpvaW5UYWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoamF2YUpvaW5UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlqYXZhSm9pblRhYmxlLnNldFNjaGVtYSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUpvaW5UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlQW5ub3RhdGlvbik7Ci0JCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZUFubm90YXRpb24uZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gamF2YUpvaW5UYWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChqYXZhSm9pblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqYXZhSm9pblRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWphdmFKb2luVGFibGUuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqYXZhSm9pblRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGphdmFKb2luVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWphdmFKb2luVGFibGUuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFKb2luVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVBbm5vdGF0aW9uKTsKLQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZUFubm90YXRpb24uZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVBbm5vdGF0aW9uLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZUFubm90YXRpb24uam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVBbm5vdGF0aW9uLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJam9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkKLQkJam9pblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJam9pblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMik7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJLy8gZGVmYXVsdCBjb2x1bW5zCi0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNBdHRyaWJ1dGUgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc0F0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkucmVtb3ZlU3RyYXRlZ3koKTsKLQkJLy8gZGVmYXVsdCBqb2luIHRhYmxlCi0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzQXR0cmlidXRlLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vaWYgbm9uLW93bmluZyBzaWRlIG9mIHRoZSByZWxhdGlvbnNoaXAgdGhlbiBubyBkZWZhdWx0IGpvaW4gdGFibGUKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJmb28iKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQkKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4yID0gam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uMyA9IGpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhpbnZlcnNlSm9pbkNvbHVtbjIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoaW52ZXJzZUpvaW5Db2x1bW4zLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGludmVyc2VKb2luQ29sdW1uLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWludmVyc2VKb2luQ29sdW1ucyA9IGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkKLQkJam9pblRhYmxlLm1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJam9pblRhYmxlLm1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwLCAxKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmludmVyc2VKb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEludmVyc2VKb2luQ29sdW1uKDIpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuaW52ZXJzZUpvaW5Db2x1bW5BdCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCi0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUludmVyc2VKb2luQ29sdW1uKDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkgewotCQkvL1RPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQlqb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJLy9pZiBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCB0aGVuIG5vIGRlZmF1bHQgam9pbiB0YWJsZQotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgIGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCAgam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJam9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCWpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCQotCQlqb2luVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJam9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlqb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCWpvaW5UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCWpvaW5UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTM3ZmIzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBLZXlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9yZGVyQnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb24gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vbkNvbGxlY3Rpb25NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLk1hcDsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpLmFwcGVuZCgiOyIpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJEZXBhcnRtZW50IikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBFbXBsb3llZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnlBbm5vdGF0aW9uID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueUFubm90YXRpb24uc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueUFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnlBbm5vdGF0aW9uLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueUFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCi0JCQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LnNldEZldGNoKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5Sm9pbmluZ1N0cmF0ZWd5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQkvL3NldCBtYXBwZWRCeSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5IiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU1hbnlUb01hbnlSZWxhdGlvbnNoaXAgcmVsID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBkZWZhdWx0IHN0aWxsIHNldCwgaGFuZGxlZCBieSB2YWxpZGF0aW9uCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQkvL3Rlc3QgdGFyZ2V0IGlzIG5vdCBhbiBFbnRpdHksIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBzdGlsbCBleGlzdHMsIHRoaXMgY2FzZSBoYW5kbGVkIHdpdGggdmFsaWRhdGlvbgotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25NYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlOb25Db2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkNvbGxlY3Rpb25NYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQkJCi0KLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5QW5ub3RhdGlvbiA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQltYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFwS2V5QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXROb01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQotCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW9yZGVyQnkuc2V0VmFsdWUoIm5ld09yZGVyQnkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoIm5ld09yZGVyQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5vT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW9yZGVyQnkuc2V0VmFsdWUoIm5ld09yZGVyQnkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkKLQkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5vT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLS8vCQltYW55VG9NYW55TWFwcGluZy5zZXROb09yZGVyaW5nKGZhbHNlKTsgLy90aGlzIGRvZXMgbm90aGluZwotLy8JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotLy8JCW1hbnlUb01hbnlNYXBwaW5nLnNldE9yZGVyQnkoIm5ld09yZGVyQnkiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlckJ5KCkpOwotLy8JCU9yZGVyQnkgb3JkZXJCeSA9IChPcmRlckJ5KSByZXNvdXJjZUZpZWxkLmFubm90YXRpb24oT3JkZXJCeS5BTk5PVEFUSU9OX05BTUUpOwotLy8JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7Ci0vLwkKLS8vCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0vLwkJbWFueVRvTWFueU1hcHBpbmcuc2V0T3JkZXJCeShudWxsKTsKLS8vCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyQnkoKSk7Ci0vLwkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmFubm90YXRpb24oT3JkZXJCeS5BTk5PVEFUSU9OX05BTUUpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUGtPcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzUGtPcmRlcmluZygpKTsKLQkJCi0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc1BrT3JkZXJpbmcoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc1BrT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21PcmRlcmluZygpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQotCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJCi0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlGb3JNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIGVtcGxveWVlc01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIsIGVtcGxveWVlc01hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYWNkODcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb24gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljaXplZENvbGxlY3Rpb25NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJLy9zZXQgb3B0aW9uYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IG9wdGlvbmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0KLQkJCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRKb2luKCkgewotCQkvL1RPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5Db2x1bW5zLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgam9pbkNvbHVtbnMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCi0JCWpvaW5Db2x1bW5zLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQkKLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQkKLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUpvaW5Db2x1bW5zKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlqb2luQ29sdW1ucy5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpLnNldE5hbWUoIkZPTyIpOwotCQkoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigyLCBKUEEuSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMCwgMSwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShqb2luQ29sdW1ucy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCUpvaW5Db2x1bW4gc3BlY2lmaWVkSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW4uaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5nZXREZWZhdWx0Sm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXAgcmVsID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFueVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQkvL3Rlc3QgdGFyZ2V0IGlzIG5vdCBhbiBFbnRpdHksIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBzdGlsbCBleGlzdHMsIHRoaXMgY2FzZSBoYW5kbGVkIHdpdGggdmFsaWRhdGlvbgotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgbWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eUNvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlHZW5lcmljaXplZENvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY2l6ZWRDb2xsZWN0aW9uTWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9hZGQgdGFyZ2V0RW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBub3cgdGFyZ2V0IGVudGl0eSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlUeXBlTWFwcGluZyBhZGRyZXNzVHlwZU1hcHBpbmcgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJCi0JCW1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBtYW55VG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQotCQltYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgbWFueVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNzg4MTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhTnVsbFR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQ2xhc3NBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJUZXN0VHlwZUlkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlRlc3RUeXBlSWQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkYWJsZSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU51bGxUeXBlTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTmFtZUlzSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MudGFibGVOYW1lSXNJbnZhbGlkKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzcy50YWJsZU5hbWVJc0ludmFsaWQoIkZPTyIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXNzb2NpYXRlZFRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlc0luY2x1ZGluZ0luaGVyaXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEZhbHNlKG1hcHBlZFN1cGVyY2xhc3MuZ2V0QWxsQXNzb2NpYXRlZFRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0ZWRUYWJsZU5hbWVzSW5jbHVkaW5nSW5oZXJpdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RmFsc2UobWFwcGVkU3VwZXJjbGFzcy5nZXRBbGxBc3NvY2lhdGVkVGFibGVOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQkvL1RPRE8gbmVlZCB0byBjcmVhdGUgYSBzdWJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzIGFuZCB0ZXN0IHRoaXMKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKG1hcHBlZFN1cGVyY2xhc3MuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUobWFwcGVkU3VwZXJjbGFzcy5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwZWRTdXBlcmNsYXNzLmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0SWRDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUlkQ2xhc3NSZWZlcmVuY2UgaWRDbGFzc1JlZiA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCUlkQ2xhc3NBbm5vdGF0aW9uIGlkQ2xhc3NBbm5vdGF0aW9uID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vIHRlc3Qgc2V0dGluZyBpZCBjbGFzcyBuYW1lIHRvIG5vbmV4aXN0ZW50IGNsYXNzLiAgdGVzdCBjbGFzcyBuYW1lIGlzIHNldCwgYnV0IGNsYXNzIGlzIG51bGwKLQkJU3RyaW5nIG5vbkV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLkZvbyI7Ci0JCWlkQ2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vIHRlc3Qgc2V0dGluZyBpZCBjbGFzcyBuYW1lIHRvIGV4aXN0ZW50IGNsYXNzLiAgdGVzdCBjbGFzcyBuYW1lIGlzIHNldCBhbmQgY2xhc3MgaXMgbm90IG51bGwKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLlRlc3RUeXBlSWQiOwotCQlpZENsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXN0ZW50SWRDbGFzc05hbWUsICgoSWRDbGFzc0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyAgQElkQ2xhc3MgdmFsdWUgdG8gbnVsbCwgSWRDbGFzcyBhbm5vdGF0aW9uIGlzIHJlbW92ZWQKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vcmVzZXQgQElkQ2xhc3MgdmFsdWUgYW5kIHRoZW4gcmVtb3ZlIEBJZENsYXNzCi0JCWlkQ2xhc3NBbm5vdGF0aW9uID0gKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkKLQkJaWRDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoZXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSWRDbGFzc1JlZmVyZW5jZSBpZENsYXNzUmVmID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIG5vbkV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLkZvbyI7Ci0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobm9uRXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCAoKElkQ2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihJZENsYXNzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLlRlc3RUeXBlSWQiOwotCQlpZENsYXNzUmVmLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKGV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgKChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY0Mzc4OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJRVUVSWV9OQU1FIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUVVFUlkgPSAiTVlfUVVFUlkiOwotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWU9XCIiICsgUVVFUllfTkFNRSArICJcIiwgcXVlcnk9XCIiICsgUVVFUllfUVVFUlkgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JCQotCXB1YmxpYyBKYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJCi0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhxdWVyeUhpbnQyLCBoaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgaGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgaGludHMubmV4dCgpKTsKLQkJCi0JCWhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJbmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUXVlcnlIaW50PiBoaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQluYW1lZE5hdGl2ZVF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkTmF0aXZlUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBxdWVyeUFubm90YXRpb24gPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlxdWVyeUFubm90YXRpb24uYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJcXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXF1ZXJ5QW5ub3RhdGlvbi5hZGRIaW50KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlxdWVyeUFubm90YXRpb24ubW92ZUhpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlxdWVyeUFubm90YXRpb24ubW92ZUhpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQlxdWVyeUFubm90YXRpb24ucmVtb3ZlSGludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWhpbnRzID0gbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXF1ZXJ5QW5ub3RhdGlvbi5yZW1vdmVIaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaGludHMgPSBuYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXF1ZXJ5QW5ub3RhdGlvbi5yZW1vdmVIaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCQotCQlqYXZhTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXJ5QW5ub3RhdGlvbi5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlBbm5vdGF0aW9uLnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUFubm90YXRpb24uZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcXVlcnlBbm5vdGF0aW9uLnNldFJlc3VsdENsYXNzKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHF1ZXJ5QW5ub3RhdGlvbi5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gamF2YU5hbWVkTmF0aXZlUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWROYXRpdmVRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWphdmFOYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWROYXRpdmVRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFOYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWROYXRpdmVRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcobnVsbCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFOYW1lZFF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkUXVlcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk1YzI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU5hbWVkUXVlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5OYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFOYW1lZFF1ZXJ5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJNWV9RVUVSWSI7Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShuYW1lPVwiIiArIFFVRVJZX05BTUUgKyAiXCIsIHF1ZXJ5PVwiIiArIFFVRVJZX1FVRVJZICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgSmF2YU5hbWVkUXVlcnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoamF2YU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YU5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBqYXZhTmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJamF2YU5hbWVkUXVlcnkuc2V0UXVlcnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJamF2YU5hbWVkUXVlcnkuc2V0UXVlcnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqYXZhTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gamF2YU5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKGphdmFOYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgamF2YU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlOYW1lZFF1ZXJ5IG5hbWVkUXVlcnkgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJCi0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBuYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBRdWVyeUhpbnQ+IGhpbnRzID0gbmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhxdWVyeUhpbnQyLCBoaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgaGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgaGludHMubmV4dCgpKTsKLQkJCi0JCWhpbnRzID0gbmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgamF2YU5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGphdmFOYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGphdmFOYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqYXZhTmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFOYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIGphdmFOYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgamF2YU5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUXVlcnlIaW50PiBoaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YU5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5QW5ub3RhdGlvbiA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUXVlcnlIaW50PiBoaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJbmFtZWRRdWVyeUFubm90YXRpb24ubW92ZUhpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQluYW1lZFF1ZXJ5QW5ub3RhdGlvbi5tb3ZlSGludCgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWhpbnRzID0gbmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCi0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLnJlbW92ZUhpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQloaW50cyA9IG5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQotCQluYW1lZFF1ZXJ5QW5ub3RhdGlvbi5yZW1vdmVIaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJaGludHMgPSBuYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcnlBbm5vdGF0aW9uLnJlbW92ZUhpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJCi0JCU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBqYXZhTmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCQotCQlqYXZhTmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJamF2YU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWphdmFOYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlYTNlNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PcmRlckJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCBqYXZhLnV0aWwuTWFwOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBFbXBsb3llZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueUFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55QW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueUFubm90YXRpb24uc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnlBbm5vdGF0aW9uLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlBbm5vdGF0aW9uLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkKLQkJb25lVG9NYW55LnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0KLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5zZXRGZXRjaChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQkvL1RPRE8gdGhpcyBuZWVkcyB0byByZXR1cm4gbnVsbCBmb3IgMS4wIG1hcHBpbmdzLiAgd2Ugd2FudCB0aGUgdmFsaWRhdGlvbiBlcnJvciBmb3IgZG90LW5vdGF0aW9uIHNpbmNlIHRoaXMgaXMgb25seSBzdXBwb3J0ZWQgaW4gMi4wCi0JCS8vVE9ETyBuZWVkIHRvIGNvcHkgdGhpcyB0byBhbGwgdGhlIG90aGVyIG1hcHBlZCBieSB0ZXN0cy4KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnROdWxsKHN0YXRlRm9vTWFwcGluZyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBtYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb01hbnlSZWxhdGlvbnNoaXAgcmVsID0gbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGRlZmF1bHQgc3RpbGwgc2V0LCBoYW5kbGVkIGJ5IHZhbGlkYXRpb24KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW50aXR5LCBkZWZhdWx0IHRhcmdldCBlbnRpdHkgc3RpbGwgZXhpc3RzLCB0aGlzIGNhc2UgaGFuZGxlZCB3aXRoIHZhbGlkYXRpb24KLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRFbnRpdHlDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbGxlY3Rpb25PbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Tm9uQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25Db2xsZWN0aW9uT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCW1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0Tm9NYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IGphdmFPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9yZGVyQnkuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcmRlckJ5LmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTm9PcmRlcmluZygpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJb3JkZXJCeS5zZXRWYWx1ZSgibmV3T3JkZXJCeSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVBrT3JkZXJpbmcoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQkKLQkJT3JkZXJCeUFubm90YXRpb24gb3JkZXJCeSA9IChPcmRlckJ5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW9yZGVyQnkuc2V0VmFsdWUoIm5ld09yZGVyQnkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNQa09yZGVyaW5nKCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc1BrT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21PcmRlcmluZygpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkKLQkJLy9zZXQgb3JkZXJCeSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJCi0JCU9yZGVyQnlBbm5vdGF0aW9uIG9yZGVyQnkgPSAoT3JkZXJCeUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlvcmRlckJ5LnNldFZhbHVlKCJuZXdPcmRlckJ5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkKLQkJLy9zZXQgb3JkZXJCeSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5Rm9yTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlPbmVUb01hbnlNYXBwaW5nIGVtcGxveWVlc01hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIiwgZW1wbG95ZWVzTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODJkMmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb2xsZWN0aW9uT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNpemVkQ29sbGVjdGlvbk9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lQW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZUFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZUFubm90YXRpb24uc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lQW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmVBbm5vdGF0aW9uLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lQW5ub3RhdGlvbi5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kgbWFwcGVkQnkgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwZWRCeS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG1hcHBlZEJ5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0IG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRCeS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kgbWFwcGVkQnkgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChtYXBwZWRCeS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hcHBlZEJ5LnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYXBwZWRCeS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnlKb2luaW5nU3RyYXRlZ3kgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYXBwZWRCeS5zZXRNYXBwZWRCeUF0dHJpYnV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRCeS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCi0JCW9uZVRvT25lLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCi0JCQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5zZXRPcHRpb25hbChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQotCQkKLQkJLy9zZXQgb3B0aW9uYWwgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLnNldEZldGNoKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkSm9pbkNvbHVtbnMgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEpvaW4oKSB7Ci0JCS8vVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbkNvbHVtbnMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5Db2x1bW5zLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbkNvbHVtbnMuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJLy9pZiBub24tb3duaW5nIHNpZGUgb2YgdGhlIHJlbGF0aW9uc2hpcCB0aGVuIG5vIGRlZmF1bHQgam9pbiBjb2x1bW4KLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luQ29sdW1ucy5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IAotCQkJcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gCi0JCQlyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkpPSU5fQ09MVU1OKSk7Ci0KLQkJam9pbkNvbHVtbnMucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCi0JCQotCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCQotCQlqb2luQ29sdW1ucy5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUpvaW5Db2x1bW5zKSk7Ci0JCQotCQkKLQkJam9pbkNvbHVtbnMubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0KLQkJam9pbkNvbHVtbnMubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGpvaW5Db2x1bW5zLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhSm9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJKChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpLnNldE5hbWUoIkZPTyIpOwotCQkoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigyLCBKUEEuSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDIsIDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMCwgMSwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBqb2luQ29sdW1ucy5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWFzc2VydFRydWUoam9pbkNvbHVtbnMuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5pc0RlZmF1bHQoKSk7Ci0KLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gam9pbkNvbHVtbnMuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbi5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLmdldERlZmF1bHRKb2luQ29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydE51bGwoc3RhdGVGb29NYXBwaW5nKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJLy90YXJnZXRFbnRpdHkgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBkZWZhdWx0IHN0aWxsIHNldCwgaGFuZGxlZCBieSB2YWxpZGF0aW9uCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW50aXR5LCBkZWZhdWx0IHRhcmdldCBlbnRpdHkgc3RpbGwgZXhpc3RzLCB0aGlzIGNhc2UgaGFuZGxlZCB3aXRoIHZhbGlkYXRpb24KLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIG9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldEVudGl0eUNvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sbGVjdGlvbk9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0RW50aXR5R2VuZXJpY2l6ZWRDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNpemVkQ29sbGVjdGlvbk9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlc29sdmVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW50aXR5IHNob3VsZCByZXNvbHZlCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCVR5cGVNYXBwaW5nIGFkZHJlc3NUeXBlTWFwcGluZyA9IGFkZHJlc3NDbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkpOwotCQkKLQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWRkcmVzc1R5cGVNYXBwaW5nLCBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCXN0cmF0ZWd5LnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldFByaW1hcnlLZXlKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUHJpbWFyeUtleUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQotCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCXN0cmF0ZWd5LnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJCi0JCXN0cmF0ZWd5LnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQkKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUpvaW5Db2x1bW5zKSk7Ci0JCQotCQkKLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0KLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkZPTyIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBUiIpOwotCQkoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDIsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFByaW1hcnlLZXlKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDIsIDAsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDAsIDEsIFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCAgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCAgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb1ByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjA1MDFiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUgPSAiTVlfUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fREVGSU5JVElPTiA9ICJNWV9DT0xVTU5fREVGSU5JVElPTiI7Ci0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lPVwiIiArIFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQkKLQlwdWJsaWMgSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU5fTkFNRSwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtblJlc291cmNlID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCi0JCXBrSm9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVOb1NwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gcGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy9yZW1vdmUgQElkIGFubm90YXRpb24KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlpZEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKFBSSU1BUllfS0VZX0pPSU5fQ09MVU1OX05BTUUsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW5Bbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJY29sdW1uQW5ub3RhdGlvbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE51bGwoY29sdW1uQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKENPTFVNTl9ERUZJTklUSU9OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0RFRklOSVRJT04sIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBwa0pvaW5Db2x1bW5SZXNvdXJjZSA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQotCQlwa0pvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lTm9TcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkKLQkJLy9yZW1vdmUgQElkIGFubm90YXRpb24KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlpZEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlhc3NlcnROdWxsKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIHBrSm9pbkNvbHVtblJlc291cmNlID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCi0JCXBrSm9pbkNvbHVtblJlc291cmNlLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbkFubm90YXRpb24gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2x1bW5Bbm5vdGF0aW9uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzcGVjaWZpZWRQa0pvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWNvbHVtbkFubm90YXRpb24gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROdWxsKGNvbHVtbkFubm90YXRpb24uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWdldEphdmFFbnRpdHkoKS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhRW50aXR5KCkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNSZWZlcmVuY2VkQ29sdW1uUmVzb2x2ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKCgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2Qoc3BlY2lmaWVkUGtKb2luQ29sdW1uLCAicmVmZXJlbmNlZENvbHVtbklzUmVzb2x2ZWQiKSkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGJDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbi5pc1Jlc29sdmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGJSZWZlcmVuY2VkQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gc3BlY2lmaWVkUGtKb2luQ29sdW1uID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSgoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKHNwZWNpZmllZFBrSm9pbkNvbHVtbiwgInJlZmVyZW5jZWRDb2x1bW5Jc1Jlc29sdmVkIikpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERiVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkUGtKb2luQ29sdW1uLmdldERiVGFibGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFRdWVyeUhpbnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhUXVlcnlIaW50VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQxYmE3MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFRdWVyeUhpbnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUXVlcnlIaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5RdWVyeUhpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhUXVlcnlIaW50VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIlFVRVJZX05BTUUiOwotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTkFNRURfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KG5hbWU9XCIiICsgUVVFUllfTkFNRSArICJcIiwgaGludHM9QFF1ZXJ5SGludCgpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgSmF2YVF1ZXJ5SGludFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5hbWVkUXVlcnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwotCQlRdWVyeUhpbnQgcXVlcnlIaW50ID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBxdWVyeUFubm90YXRpb24gPSAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnRBbm5vdGF0aW9uID0gcXVlcnlBbm5vdGF0aW9uLmdldEhpbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKHF1ZXJ5SGludEFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlxdWVyeUhpbnRBbm5vdGF0aW9uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXF1ZXJ5SGludEFubm90YXRpb24uc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRIaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbiA9ICgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludEFubm90YXRpb24gPSBxdWVyeUFubm90YXRpb24uZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXF1ZXJ5SGludC5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnRBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcXVlcnlIaW50LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lZFF1ZXJ5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGVudGl0eSA9IGdldEphdmFFbnRpdHkoKTsKLQkJUXVlcnlIaW50IHF1ZXJ5SGludCA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEhpbnRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gcXVlcnlBbm5vdGF0aW9uID0gKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCVF1ZXJ5SGludEFubm90YXRpb24gcXVlcnlIaW50QW5ub3RhdGlvbiA9IHF1ZXJ5QW5ub3RhdGlvbi5nZXRIaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlxdWVyeUhpbnRBbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXF1ZXJ5SGludEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTmFtZWRRdWVyeSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7Ci0JCVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRIaW50cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbiA9ICgoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIE5hbWVkUXVlcnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludEFubm90YXRpb24gPSBxdWVyeUFubm90YXRpb24uZ2V0SGludHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlIaW50LnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBxdWVyeUhpbnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlxdWVyeUhpbnQuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50QW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzIzOGM3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5TZWNvbmRhcnlUYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFTZWNvbmRhcnlUYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPVwiZm9vXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZT1cImJhclwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0KLQkJCi0JcHVibGljIEphdmFTZWNvbmRhcnlUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWROYW1lQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJdGFibGUuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWRDYXRhbG9nQ2hhbmdlSW5SZXNvdXJjZU1vZGVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBzZWNvbmRhcnlUYWJsZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFKS5pdGVyYXRvcigpOwotCQkoKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZXMubmV4dCgpKS5zZXRDYXRhbG9nKCJmb28iKTsKLQkJKChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzLm5leHQoKSkuc2V0Q2F0YWxvZygiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VHNibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VHNibGVzLm5leHQoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHNlY29uZGFyeVRzYmxlcy5uZXh0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUZyb21TcGVjaWZpZWRTY2hlbWFDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZXMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5TRUNPTkRBUllfVEFCTEUpLml0ZXJhdG9yKCk7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkpLnNldFNjaGVtYSgiZm9vIik7Ci0JCSgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZVJlc291cmNlcy5uZXh0KCkpLnNldFNjaGVtYSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VHNibGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VHNibGVzLm5leHQoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgc2Vjb25kYXJ5VHNibGVzLm5leHQoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUuc2V0Q2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZSB0YWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCXRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgdGFibGVBbm5vdGF0aW9uLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQl0YWJsZVJlc291cmNlLnNldFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJU2Vjb25kYXJ5VGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIHRhYmxlQW5ub3RhdGlvbi5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gcGtKb2luQ29sdW1uID0gdGFibGVSZXNvdXJjZS5hZGRQa0pvaW5Db2x1bW4oMCk7Ci0JCXBrSm9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXBrSm9pbkNvbHVtbiA9IHRhYmxlUmVzb3VyY2UuYWRkUGtKb2luQ29sdW1uKDApOwotCQlwa0pvaW5Db2x1bW4uc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXRhYmxlUmVzb3VyY2UubW92ZVBrSm9pbkNvbHVtbigxLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJdGFibGVSZXNvdXJjZS5yZW1vdmVQa0pvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZFBrSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVSZXNvdXJjZS5yZW1vdmVQa0pvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCS8vanVzdCB0aGUgZGVmYXVsdCBwa0pvaW5Db2x1bW4sIHNvIDEKLQkJYXNzZXJ0RXF1YWxzKDEsIHNlY29uZGFyeVRhYmxlLmdldFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQkvL29ubHkgdGhlIHNwZWNpZmllZCBwa0pvaW5Db2x1bW5zLCAzCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQa0pvaW5Db2x1bW4gPSBzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsgCi0JCWFzc2VydE5vdE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbik7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGRlZmF1bHRQa0pvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCUl0ZXJhdG9yPFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbj4gcGtKb2luQ29sdW1ucyA9IHRhYmxlUmVzb3VyY2UuZ2V0UGtKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVByaW1hcnlLZXlKb2luQ29sdW1uPiBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zID0gc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlJdGVyYXRvcjxQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMgPSB0YWJsZVJlc291cmNlLmdldFBrSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQkKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5SZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFBrSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4+IHBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKTsKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRQa0pvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwa0pvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJcGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJcGtKb2luQ29sdW1uUmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRQa0pvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UocGtKb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXBrSm9pbkNvbHVtbnMgPSBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShwa0pvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlUmVzb3VyY2UuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gc3BlY2lmaWVkUGtKb2luQ29sdW1ucyA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkUGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRQa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZFBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJSXRlcmF0b3I8UHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBwa0pvaW5Db2x1bW5zID0gdGFibGVSZXNvdXJjZS5nZXRQa0pvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJcGtKb2luQ29sdW1ucyA9IHRhYmxlUmVzb3VyY2UuZ2V0UGtKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwa0pvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHBrSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcGtKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uR2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbiBkZWZhdWx0UGtKb2luQ29sdW1uID0gc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UGtKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCi0JCQotCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWlkQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFByaW1hcnlLZXlKb2luQ29sdW1uR2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW4gZGVmYXVsdFBrSm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSBASWQgYW5ub3RhdGlvbgotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWlkQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCi0JCWFzc2VydE51bGwoZGVmYXVsdFBrSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbklzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUoc2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uIHNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRQa0pvaW5Db2x1bW4uaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsICBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsICBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlzZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJc2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24gPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCXNlY29uZGFyeVRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZSA9IGdldEphdmFFbnRpdHkoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJc2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQ5NWQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FID0gIk1ZX1NFUVVFTkNFX0dFTkVSQVRPUiI7Ci0JCi0KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cIiIgKyBTRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoU0VRVUVOQ0VfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0KLQkJLy9jaGFuZ2UgcmVzb3VyY2UgbW9kZWwgc2VxdWVuY2VHZW5lcmF0b3IgbmFtZSwgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig4MikpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg4MiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgyKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoU2VxdWVuY2VHZW5lcmF0b3IuREVGQVVMVF9JTklUSUFMX1ZBTFVFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig4MikpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNlcXVlbmNlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MiksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigyMCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGdlbmVyYXRvckFubm90YXRpb24uZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDIwKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIwLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIwKSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDI1KSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDI1KSwgZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0JCi0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTZXF1ZW5jZU5hbWUoIm15U2VxdWVuY2VOYW1lIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCJteVNlcXVlbmNlTmFtZSIpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2VxdWVuY2VOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoIm15U2VxdWVuY2VOYW1lIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoIm15U2VxdWVuY2VOYW1lIiwgZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUobnVsbCk7Ci0JCWdlbmVyYXRvckFubm90YXRpb24gPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydE51bGwoZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzY5MjlhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9HRU5FUkFUT1JfTkFNRSA9ICJNWV9UQUJMRV9HRU5FUkFUT1IiOwotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRV9HRU5FUkFUT1IsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcihuYW1lPVwiIiArIFRBQkxFX0dFTkVSQVRPUl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9HRU5FUkFUT1JfTkFNRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0TmFtZSgpKTsKLQotCQkvL2NoYW5nZSByZXNvdXJjZSBtb2RlbCB0YWJsZUdlbmVyYXRvciBuYW1lLCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfR0VORVJBVE9SX05BTUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRDYXRhbG9nKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0Q2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgZ2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNjaGVtYSgpKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U2NoZW1hIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0KLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpICBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiWE1MX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBzY2hlbWEgdGFrZW4gZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIG5vdCBlbnRpdHktbWFwcGluZ3Mgc2luY2UgdGhlIGVudGl0eSBpcyBub3QgaW4gYW4gb3JtLnhtbCBmaWxlCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFNjaGVtYSgibXlTY2hlbWEiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0UGtDb2x1bW5OYW1lKCJteVBrQ29sdW1uTmFtZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgibXlQa0NvbHVtbk5hbWUiKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFBrQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCJteVBrQ29sdW1uTmFtZSIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uTmFtZSIsIGdlbmVyYXRvckFubm90YXRpb24uZ2V0UGtDb2x1bW5OYW1lKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0VmFsdWVDb2x1bW5OYW1lKCJteVZhbHVlQ29sdW1uTmFtZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlWYWx1ZUNvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlWYWx1ZUNvbHVtbk5hbWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0VmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgibXlWYWx1ZUNvbHVtbk5hbWUiKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCJteVZhbHVlQ29sdW1uTmFtZSIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIGdlbmVyYXRvckFubm90YXRpb24uZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uVmFsdWUoIm15UGtDb2x1bW5WYWx1ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlQa0NvbHVtblZhbHVlIiwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uVmFsdWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoIm15UGtDb2x1bW5WYWx1ZSIpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uVmFsdWUiLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgibXlQa0NvbHVtblZhbHVlIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gZ2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIGdlbmVyYXRvckFubm90YXRpb24uZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoODIsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MiksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRhYmxlR2VuZXJhdG9yLkRFRkFVTFRfSU5JVElBTF9WQUxVRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0RGVmYXVsdEluaXRpYWxWYWx1ZSgpKTsKLQkJCi0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoODIpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUYWJsZUdlbmVyYXRvci5ERUZBVUxUX0lOSVRJQUxfVkFMVUUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODIpLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiBnZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBnZW5lcmF0b3JBbm5vdGF0aW9uLmdldEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRvci5ERUZBVUxUX0FMTE9DQVRJT05fU0laRSwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyMCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyMCwgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMjApLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdG9yLkRFRkFVTFRfQUxMT0NBVElPTl9TSVpFLCBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5nZXREZWZhdWx0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKS5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMjApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhHZW5lcmF0b3IuREVGQVVMVF9BTExPQ0FUSU9OX1NJWkUsIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldERlZmF1bHRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyMCksIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpLnNldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZigyNSkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIGdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigyNSksIGdlbmVyYXRvckFubm90YXRpb24uZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPShKYXZhVGFibGVHZW5lcmF0b3IpICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkJSXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsICB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgIHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVHZW5lcmF0b3IoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSAoKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZUdlbmVyYXRvci5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsJCi0JCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gKChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQkKLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCXRhYmxlR2VuZXJhdG9yLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUdlbmVyYXRvckFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZUdlbmVyYXRvcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9ICgoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvckFubm90YXRpb24gPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7CQotCQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUdlbmVyYXRvckFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0phdmFUYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNTY5MTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFUYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lPVwiIiArIFRBQkxFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQkKLQlwdWJsaWMgSmF2YVRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0TmFtZVNwZWNpZmllZE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy90ZXN0IHRoYXQgc2V0dGluZyB0aGUgamF2YSBlbnRpdHkgbmFtZSB3aWxsIGNoYW5nZSB0aGUgdGFibGUgZGVmYXVsdCBuYW1lCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHROYW1lU2luZ2xlVGFibGVJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlFbnRpdHkgY2hpbGRFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRW50aXR5IHJvb3RFbnRpdHkgPSAoRW50aXR5KSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdFNhbWUoZ2V0SmF2YUVudGl0eSgpLCByb290RW50aXR5KTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgY2hpbGRFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcm9vdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy90ZXN0IHRoYXQgc2V0dGluZyB0aGUgcm9vdCBqYXZhIGVudGl0eSBuYW1lIHdpbGwgY2hhbmdlIHRoZSB0YWJsZSBkZWZhdWx0IG5hbWUgb2YgdGhlIGNoaWxkCi0JCXJvb3RFbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY2hpbGRFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCi0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IG9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJYTUxfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBzY2hlbWEgdGFrZW4gZnJvbSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIG5vdCBlbnRpdHktbWFwcGluZ3Mgc2luY2UgdGhlIGVudGl0eSBpcyBub3QgaW4gYW4gb3JtLnhtbCBmaWxlCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCS8vcmVtb3ZlIHRoZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbC4gIGRlZmF1bHQgc2NoZW1hIAotCQkvL3Nob3VsZCBzdGlsbCBjb21lIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBiZWNhdXNlIG9mIGltcGxpZWQgbWFwcGVkLWZpbGUtcmVmCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZShtYXBwaW5nRmlsZVJlZik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkKLQkJZmlsZS5kZWxldGUodHJ1ZSwgbnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWVTcGVjaWZpZWROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkTmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkKLQkJYXNzZXJ0TnVsbCh0YWJsZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGcm9tU3BlY2lmaWVkTmFtZUNoYW5nZUluUmVzb3VyY2VNb2RlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGUuc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5zZXRDYXRhbG9nKCJteUNhdGFsb2ciKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15Q2F0YWxvZyIsIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygibXlDYXRhbG9nIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygibXlDYXRhbG9nIik7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSBvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGphdmFFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgamF2YUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiWE1MX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqYXZhRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCS8vZGVmYXVsdCBjYXRhbG9nIHRha2VuIGZyb20gcGVyc2lzdGVuY2UtdW5pdGUtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlJRmlsZSBmaWxlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKS5nZXRGaWxlKCk7Ci0JCS8vcmVtb3ZlIHRoZSBtYXBwaW5nIGZpbGUgcmVmZXJlbmNlIGZyb20gdGhlIHBlcnNpc3RlbmNlLnhtbC4gIGRlZmF1bHQgc2NoZW1hIAotCQkvL3Nob3VsZCBzdGlsbCBjb21lIGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBiZWNhdXNlIG9mIGltcGxpZWQgbWFwcGVkLWZpbGUtcmVmCi0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLnJlbW92ZShtYXBwaW5nRmlsZVJlZik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCi0JCWZpbGUuZGVsZXRlKHRydWUsIG51bGwpOwotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIm15Q2F0YWxvZyIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCB0YWJsZVJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JCQotCQl0YWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUuc2V0U2NoZW1hKCJteVNjaGVtYSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIm15U2NoZW1hIik7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJteVNjaGVtYSIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlUmVzb3VyY2UgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteVNjaGVtYSIsIHRhYmxlUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCQkKLQkJdGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImZvbyIpOwotCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgIGdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZUFubm90YXRpb24gPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IHRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVRhYmxlIHRhYmxlID0gZ2V0SmF2YUVudGl0eSgpLmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gdGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSB0YWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhVGFibGUgdGFibGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlQW5ub3RhdGlvbiA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCi0JCXRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJdGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdEVudGl0eUdldERlZmF1bHROYW1lVGFibGVQZXJDbGFzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGFic3RyYWN0RW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZDQ4YzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhVHJhbnNpZW50TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zaWVudCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEphdmFUcmFuc2llbnRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVHJhbnNpZW50TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFRyYW5zaWVudE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROb3ROdWxsKHRyYW5zaWVudE1hcHBpbmcpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGYxYjkyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04sIEpQQS5URU1QT1JBTCwgSlBBLlRFTVBPUkFMX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgSmF2YVZlcnNpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVtcG9yYWwoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwodmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKHZlcnNpb25NYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9KcHRDb3JlQ29udGV4dEphdmFNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxZDI4Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZUNvbnRleHRKYXZhTW9kZWxUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFDYXNjYWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhRW1iZWRkZWRJZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhRW1iZWRkZWRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFHZW5lcmF0ZWRWYWx1ZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFJZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhSm9pbkNvbHVtblRlc3RzLmNsYXNzKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhSm9pblRhYmxlVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YU5hbWVkUXVlcnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhTmFtZWROYXRpdmVRdWVyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFRdWVyeUhpbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVNlY29uZGFyeVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVRhYmxlR2VuZXJhdG9yVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmF2YVRyYW5zaWVudE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdENvcmVDb250ZXh0SmF2YU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRW50aXR5TWFwcGluZ3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGUxYzUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW50aXR5TWFwcGluZ3NUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVudGl0eU1hcHBpbmdzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFZlcnNpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXNjcmlwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vc2V0IGRlc2NyaXB0aW9uIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldERlc2NyaXB0aW9uKCJuZXdEZXNjcmlwdGlvbiIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdEZXNjcmlwdGlvbiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCi0JCS8vc2V0IGRlc2NyaXB0aW9uIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVzY3JpcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvL3NldCBkZXNjcmlwdGlvbiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0RGVzY3JpcHRpb24oIm5ld0Rlc2NyaXB0aW9uIik7Ci0JCWFzc2VydEVxdWFscygibmV3RGVzY3JpcHRpb24iLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld0Rlc2NyaXB0aW9uIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vc2V0IGRlc2NyaXB0aW9uIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXREZXNjcmlwdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlc2NyaXB0aW9uKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJCi0JCS8vc2V0IHBhY2thZ2UgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZSgiZm9vLm1vZGVsIik7Ci0JCWFzc2VydEVxdWFscygiZm9vLm1vZGVsIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJCi0JCS8vc2V0IHBhY2thZ2UgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQYWNrYWdlKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQYWNrYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJCi0JCS8vc2V0IHBhY2thZ2UgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFBhY2thZ2UoImZvby5tb2RlbCIpOwotCQlhc3NlcnRFcXVhbHMoImZvby5tb2RlbCIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGFja2FnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28ubW9kZWwiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0KLQkJLy9zZXQgcGFja2FnZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0UGFja2FnZShudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBhY2thZ2UoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQYWNrYWdlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJERUZBVUxUX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIkRFRkFVTFRfU0NIRU1BIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRFRkFVTFRfU0NIRU1BIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2NoZW1hKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkRFRkFVTFRfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIkRFRkFVTFRfQ0FUQUxPRyIsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiREVGQVVMVF9DQVRBTE9HIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldENhdGFsb2coKSk7Ci0JfQkKLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQl9CQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9ybVBlcnNpc3RlbnRUeXBlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQkvL2FkZCBlbWJlZGRhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRhYmxlKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5hZGQoZW1iZWRkYWJsZSk7Ci0JCWVtYmVkZGFibGUuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0VHJ1ZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vYWRkIGVudGl0eSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJWG1sRW50aXR5IGVudGl0eSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eSgpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuYWRkKGVudGl0eSk7Ci0JCWVudGl0eS5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbzIiKTsKLQkJYXNzZXJ0VHJ1ZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28yIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQotCQkvL2FkZCBtYXBwZWQtc3VwZXJjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGVkU3VwZXJjbGFzcygpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmFkZChtYXBwZWRTdXBlcmNsYXNzKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbzMiKTsKLQkJYXNzZXJ0VHJ1ZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT3JtUGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJLy9hZGQgZW1iZWRkYWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWFzc2VydFRydWUoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQotCQkvL2FkZCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlhc3NlcnRUcnVlKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQotCQkvL2FkZCBtYXBwZWQtc3VwZXJjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKLQkJYXNzZXJ0VHJ1ZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlT3JtUGVyc2lzdGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RmFsc2UoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMyIpOwotCQkKLQkJLy9yZW1vdmUgb3JtUGVyc2lzdGVudFR5cGUgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlUGVyc2lzdGVudFR5cGUoMSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKDEpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVBlcnNpc3RlbnRUeXBlKDApOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhYmxlR2VuZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmFkZCh0YWJsZUdlbmVyYXRvclJlc291cmNlKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UyID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3IoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5hZGQoMCwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZTIpOwotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlMi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1UYWJsZUdlbmVyYXRvcj4gdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGVHZW5lcmF0b3IoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5hZGQoMSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZTMpOwotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlMy5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5tb3ZlKDIsIDApOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkucmVtb3ZlKDApOwotCQl0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5yZW1vdmUoMSk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuY2xlYXIoKTsKLQkJdGFibGVHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVGFibGVHZW5lcmF0b3I+IHRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0YWJsZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7Ci0JCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDEpOwotCQl0YWJsZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMik7Ci0JCXRhYmxlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVRhYmxlR2VuZXJhdG9yPiB0YWJsZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCU9ybVRhYmxlR2VuZXJhdG9yIHhtbFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3JzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxUYWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFibGVHZW5lcmF0b3IyLCB4bWxUYWJsZUdlbmVyYXRvcik7Ci0JCXhtbFRhYmxlR2VuZXJhdG9yID0gdGFibGVHZW5lcmF0b3JzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxUYWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHModGFibGVHZW5lcmF0b3IzLCB4bWxUYWJsZUdlbmVyYXRvcik7Ci0JCWFzc2VydEZhbHNlKHRhYmxlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKDEpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJeG1sVGFibGVHZW5lcmF0b3IgPSB0YWJsZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbFRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0YWJsZUdlbmVyYXRvcjIsIHhtbFRhYmxlR2VuZXJhdG9yKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCXRhYmxlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodGFibGVHZW5lcmF0b3JzLmhhc05leHQoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigxKTsKLQkJdGFibGVHZW5lcmF0b3IyLnNldE5hbWUoIkJBUiIpOwotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvcjMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDIpOwotCQl0YWJsZUdlbmVyYXRvcjMuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLm1vdmVUYWJsZUdlbmVyYXRvcigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkubW92ZVRhYmxlR2VuZXJhdG9yKDAsIDIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVHZW5lcmF0b3JzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsKLQkJdGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMSk7Ci0JCXRhYmxlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigyKTsKLQkJdGFibGVHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9ycygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmFkZChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UyID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoMCwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTIpOwotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UzID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5hZGQoMSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZTMpOwotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlMy5zZXROYW1lKCJCQVoiKTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkubW92ZSgyLCAwKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKDApOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkucmVtb3ZlKDEpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcnMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmNsZWFyKCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1TZXF1ZW5jZUdlbmVyYXRvcj4gc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlcXVlbmNlR2VuZXJhdG9ycy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMSk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigyKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtU2VxdWVuY2VHZW5lcmF0b3I+IHNlcXVlbmNlR2VuZXJhdG9ycyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuaXRlcmF0b3IoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IgeG1sU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZXF1ZW5jZUdlbmVyYXRvcjIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJeG1sU2VxdWVuY2VHZW5lcmF0b3IgPSBzZXF1ZW5jZUdlbmVyYXRvcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbFNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhzZXF1ZW5jZUdlbmVyYXRvcjMsIHhtbFNlcXVlbmNlR2VuZXJhdG9yKTsKLQkJYXNzZXJ0RmFsc2Uoc2VxdWVuY2VHZW5lcmF0b3JzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQl4bWxTZXF1ZW5jZUdlbmVyYXRvciA9IHNlcXVlbmNlR2VuZXJhdG9ycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sU2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlcXVlbmNlR2VuZXJhdG9yMiwgeG1sU2VxdWVuY2VHZW5lcmF0b3IpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsKLQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3JzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShzZXF1ZW5jZUdlbmVyYXRvcnMuaGFzTmV4dCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldE5hbWUoIkZPTyIpOwotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvcjIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDEpOwotCQlzZXF1ZW5jZUdlbmVyYXRvcjIuc2V0TmFtZSgiQkFSIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMik7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yMy5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuc2l6ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkubW92ZVNlcXVlbmNlR2VuZXJhdG9yKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5tb3ZlU2VxdWVuY2VHZW5lcmF0b3IoMCwgMik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLnNpemUoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VHZW5lcmF0b3JzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMSk7Ci0JCXNlcXVlbmNlR2VuZXJhdG9yMi5zZXROYW1lKCJCQVIiKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigyKTsKLQkJc2VxdWVuY2VHZW5lcmF0b3IzLnNldE5hbWUoIkJBWiIpOwotCQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5ID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeTMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKTsKLQkJbmFtZWRRdWVyeTMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTIsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTMsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZFF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCW5hbWVkTmF0aXZlUXVlcnkuc2V0TmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJbmFtZWROYXRpdmVRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyeTMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeTMsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWROYXRpdmVRdWVyeSwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDEpLnNldE5hbWUoIkJBUiIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWROYXRpdmVRdWVyeSgwLCAxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZE5hdGl2ZVF1ZXJpZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDViOGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5vcm0uR2VuZXJpY09ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0Lm9ybS5HZW5lcmljT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY09ybUlkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsTm9VbmRlcmx5aW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgibm9KYXZhQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlMigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkKLQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBqYXZhIGFjY2VzcyB0eXBlIEZJRUxELCBvcm0gYWNjZXNzIHR5cGUgUFJPUEVSVFksIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vdmVyaWZ5IGJvdGggdGhlIHByb3BlcnR5IGphdmEgcmVzb3VyY2UgYXR0cmlidXRlIGFuZCB0aGUgZmllbGQgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgYXJlIHVzZWQgaW4gb3JtCi0JCS8vYmVjYXVzZSB0aGUgZmllbGQgaXMgYW5ub3RhdGVkIGFuZCBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkRmllbGRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkUHJvcGVydHlBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGlkRmllbGRBdHRyaWJ1dGUpOwotCQlhc3NlcnROb3RTYW1lKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGlkUHJvcGVydHlBdHRyaWJ1dGUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gaWRQcm9wZXJ0eUF0dHJpYnV0ZTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBpZEZpZWxkQXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlqYXZhUmVzb3VyY2VBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOy8vZGVmYXVsdCBhY2Nlc3Mgd2lsbCBiZSBmaWVsZAotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZDIiKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1YmE4Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxCYXNpYzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkZWRJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHJhbnNpZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX1RZUEVfTkFNRSA9ICJNb2RlbCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX01PREVMX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIE1PREVMX1RZUEVfTkFNRTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBMT1lFRV9UWVBFX05BTUUgPSAiRW1wbG95ZWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9FTVBMT1lFRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTVBMT1lFRV9UWVBFX05BTUU7Ci0KLQkKLQlwdWJsaWMgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU1vZGVsVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGFic3RyYWN0IGNsYXNzICIpLmFwcGVuZChNT0RFTF9UWVBFX05BTUUpLmFwcGVuZCgiIHsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIE1PREVMX1RZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbXBsb3llZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoRU1QTE9ZRUVfVFlQRV9OQU1FKS5hcHBlbmQoIiBleHRlbmRzICIpLmFwcGVuZChNT0RFTF9UWVBFX05BTUUpLmFwcGVuZCgiIHsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGRlcGFydG1lbnQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkRhdGUgc3RhcnREYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEVNUExPWUVFX1RZUEVfTkFNRSArICIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVhtbFR5cGVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJYXNzZXJ0RmFsc2UoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuaXNFbXB0eSgpKTsKLS8vCQkKLS8vCQkvL2FkZCBlbWJlZGRhYmxlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCUVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVtYmVkZGFibGUoKTsKLS8vCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5hZGQoZW1iZWRkYWJsZSk7Ci0vLwkJZW1iZWRkYWJsZS5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbyIpOwotLy8JCWFzc2VydFRydWUoZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5oYXNOZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLS8vCQlhc3NlcnRUcnVlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLS8vCQkKLS8vCQkvL2FkZCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0vLwkJRW50aXR5IGVudGl0eSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUVudGl0eSgpOwotLy8JCW9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmFkZChlbnRpdHkpOwotLy8JCWVudGl0eS5zZXRDbGFzc05hbWUoIm1vZGVsLkZvbzIiKTsKLS8vCQlhc3NlcnRUcnVlKGVudGl0eU1hcHBpbmdzKCkub3JtUGVyc2lzdGVudFR5cGVzKCkuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbzIiLCBlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLm5leHQoKS5nZXRNYXBwaW5nKCkuZ2V0Q2xhc3NfKCkpOwotLy8JCWFzc2VydFRydWUob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMiIsIG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0vLwotLy8JCS8vYWRkIG1hcHBlZC1zdXBlcmNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotLy8JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcHBlZFN1cGVyY2xhc3MoKTsKLS8vCQlvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuYWRkKG1hcHBlZFN1cGVyY2xhc3MpOwotLy8JCW1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28zIik7Ci0vLwkJYXNzZXJ0VHJ1ZShlbnRpdHlNYXBwaW5ncygpLm9ybVBlcnNpc3RlbnRUeXBlcygpLmhhc05leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgZW50aXR5TWFwcGluZ3MoKS5vcm1QZXJzaXN0ZW50VHlwZXMoKS5uZXh0KCkuZ2V0TWFwcGluZygpLmdldENsYXNzXygpKTsKLS8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuaXNFbXB0eSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5pc0VtcHR5KCkpOwotLy8JCWFzc2VydEZhbHNlKG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28zIiwgb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0vLwl9Ci0vLwkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhYbWxUeXBlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRGYWxzZShnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzMiKTsKLQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMobWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLCBvcm1QZXJzaXN0ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudFR5cGU+IG9ybVBlcnNpc3RlbnRUeXBlcyA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGVzKCkuaXRlcmF0b3IoKTsKLQkJLy90aGUgc2FtZSBPcm1QZXJzaXN0ZW50VHlwZXMgc2hvdWxkIHN0aWxsIGJlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZXMubmV4dCgpLCBlbnRpdHlQZXJzaXN0ZW50VHlwZSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50VHlwZXMubmV4dCgpLCBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGVzLm5leHQoKSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlKTsKLQkJCi0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vMyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNBdHRyaWJ1dGUiKTsKLQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBiYXNpYy5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkQXR0cmlidXRlIik7Ci0JCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBlbWJlZGRlZC5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnRBdHRyaWJ1dGUiKTsKLQkKLQkJWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbkF0dHJpYnV0ZSIpOwotCQotCQlYbWxWZXJzaW9uIHZlcnNpb24gPSBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCB2ZXJzaW9uLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkQXR0cmlidXRlIik7Ci0JCi0JCVhtbElkIGlkID0gZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBpZC5nZXROYW1lKCkpOwotCQkKLQkJCi0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHBlcnNpc3RlbnRBdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBwZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBwZXJzaXN0ZW50QXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsIHBlcnNpc3RlbnRBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNBdHRyaWJ1dGUiKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkQXR0cmlidXRlIik7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25BdHRyaWJ1dGUiKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkQXR0cmlidXRlIik7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50QXR0cmlidXRlIik7Ci0JCi0JCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImJhc2ljQXR0cmlidXRlIikpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1iZWRkZWRBdHRyaWJ1dGUiKSkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgidmVyc2lvbkF0dHJpYnV0ZSIpKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZEF0dHJpYnV0ZSIpKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgidHJhbnNpZW50QXR0cmlidXRlIikpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKS5nZXROYW1lKCkpOwotCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkQXR0cmlidXRlIikpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKS5nZXROYW1lKCkpOwotCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImJhc2ljQXR0cmlidXRlIikpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb25BdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgIGVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ2ZXJzaW9uQXR0cmlidXRlIikpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUVtYmVkZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsICBlbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKS5nZXROYW1lKCkpOwotCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtYmVkZGVkQXR0cmlidXRlIikpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCVhtbEVudGl0eSBlbnRpdHkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnRBdHRyaWJ1dGUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCAgZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRUcmFuc2llbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0KLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgidHJhbnNpZW50QXR0cmlidXRlIikpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0QXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQllbnRpdHkuc2V0QXR0cmlidXRlcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVzKCkpOwotCQlYbWxCYXNpYyBiYXNpYyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEJhc2ljKCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuYWRkKGJhc2ljKTsKLQkJYmFzaWMuc2V0TmFtZSgiYmFzaWNBdHRyaWJ1dGUiKTsKLQkJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQkKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWQgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxFbWJlZGRlZCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmFkZChlbWJlZGRlZCk7Ci0JCWVtYmVkZGVkLnNldE5hbWUoImVtYmVkZGVkQXR0cmlidXRlIik7Ci0JCQotCQlJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCi0JCVhtbFZlcnNpb24gdmVyc2lvbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFZlcnNpb24oKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmFkZCh2ZXJzaW9uKTsKLQkJdmVyc2lvbi5zZXROYW1lKCJ2ZXJzaW9uQXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sSWQgaWQgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxJZCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmFkZChpZCk7Ci0JCWlkLnNldE5hbWUoImlkQXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHJhbnNpZW50KCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmFkZCh0cmFuc2llbnRSZXNvdXJjZSk7Ci0JCXRyYW5zaWVudFJlc291cmNlLnNldE5hbWUoInRyYW5zaWVudEF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hbnlUb09uZSgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5hZGQobWFueVRvT25lUmVzb3VyY2UpOwotCQltYW55VG9PbmVSZXNvdXJjZS5zZXROYW1lKCJtYW55VG9PbmVBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnlSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hbnlUb01hbnkoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmFkZChtYW55VG9NYW55UmVzb3VyY2UpOwotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TmFtZSgibWFueVRvTWFueUF0dHJpYnV0ZSIpOwotCQkKLQkJYXR0cmlidXRlcyA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnlSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9uZVRvTWFueSgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5hZGQob25lVG9NYW55UmVzb3VyY2UpOwotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXROYW1lKCJvbmVUb01hbnlBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT25lVG9PbmUoKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5hZGQob25lVG9PbmVSZXNvdXJjZSk7Ci0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0TmFtZSgib25lVG9PbmVBdHRyaWJ1dGUiKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpY0F0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbkF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueUF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnRBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQotCi0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRW1iZWRkZWRJZCgpOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuYWRkKGVtYmVkZGVkSWRSZXNvdXJjZSk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5zZXROYW1lKCJlbWJlZGRlZElkQXR0cmlidXRlIik7Ci0JCQotCQlhdHRyaWJ1dGVzID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25BdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lQXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlBdHRyaWJ1dGUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZEF0dHJpYnV0ZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50QXR0cmlidXRlIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkucmVtb3ZlKDApOwotCQllbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLnJlbW92ZSgwKTsKLQkJZW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5yZW1vdmUoMCk7Ci0JCWVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5LmdldEF0dHJpYnV0ZXMoKSk7Ci0JfQotCQotCQotCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRlZEF0dHJpYnV0ZXNSZXNvbHZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZU1vZGVsVHlwZSgpOwotCQljcmVhdGVFbXBsb3llZVR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGVtcGxveWVlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfRU1QTE9ZRUVfVFlQRV9OQU1FKTsKLQotCQkKLQkJZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibmFtZSIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHN0YXJ0RGF0ZUF0dHJpYnV0ZSA9IGVtcGxveWVlUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInN0YXJ0RGF0ZSIpOwotCQkoKE9ybUJhc2ljTWFwcGluZykgc3RhcnREYXRlQXR0cmlidXRlLmdldE1hcHBpbmcoKSkuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgKChPcm1CYXNpY01hcHBpbmcpIHN0YXJ0RGF0ZUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gZW1wbG95ZWVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpZEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlhc3NlcnROb3ROdWxsKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5FbXBsb3llZSIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Lk1vZGVsIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRQYXJlbnQoKS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZTg2ZTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdENvcmVPcm1Db250ZXh0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtWG1sVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW50aXR5TWFwcGluZ3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1CYXNpY01hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1DYXNjYWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUdlbmVyYXRlZFZhbHVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtSm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybUpvaW5UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1OYW1lZFF1ZXJ5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVF1ZXJ5SGludFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVNlY29uZGFyeVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcm1UYWJsZUdlbmVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9ybVZlcnNpb25NYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCQotCXByaXZhdGUgSnB0Q29yZU9ybUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkOGRhMTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUFzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnROdWxsKG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCi0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlqb2luaW5nU3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4NzljNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydE51bGwob3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYjE4ZDQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Mb2JDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUJhc2ljTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLkZFVENIX1RZUEUsIEpQQS5DT0xVTU4sIEpQQS5MT0IsIEpQQS5URU1QT1JBTCwgSlBBLlRFTVBPUkFMX1RZUEUsIEpQQS5FTlVNRVJBVEVELCBKUEEuRU5VTV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATG9iIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgb3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgYmFzaWNSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImJhc2ljTWFwcGluZyIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljTWFwcGluZyIsIGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtQmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUJhc2ljTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgYmFzaWNSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkKLQkJYmFzaWNSZXNvdXJjZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgYmFzaWNSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgYmFzaWNSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1CYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldEVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCQotCQliYXNpY1Jlc291cmNlLnNldEVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWNSZXNvdXJjZS5zZXRFbnVtZXJhdGVkKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0RW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgYmFzaWNSZXNvdXJjZS5nZXRFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldEVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkKLQkJYmFzaWNSZXNvdXJjZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxCYXNpYyBiYXNpY1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXRMb2IodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhMb2JDb252ZXJ0ZXIuY2xhc3MsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRUcnVlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0TG9iKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihMb2JDb252ZXJ0ZXIuY2xhc3MpOwotCQlhc3NlcnRUcnVlKGJhc2ljUmVzb3VyY2UuaXNMb2IoKSk7Ci0JCWFzc2VydEVxdWFscyhMb2JDb252ZXJ0ZXIuY2xhc3MsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkvL3NldCBsb2IgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNSZXNvdXJjZS5pc0xvYigpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQotCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldFRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgYmFzaWNSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQkvL1RPRE8gdGVzdCBkZWZhdWx0cwotCS8vVE9ETyB0ZXN0IG92ZXJyaWRpbmcgamF2YSBtYXBwaW5nIHdpdGggYSBkaWZmZXJlbnQgbWFwcGluZyB0eXBlIGluIHhtbAotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUJhc2ljTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybUJhc2ljTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUJhc2ljTWFwcGluZy5pc09wdGlvbmFsKCkpOwotCi0JCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0KLQkKLQkvL0BCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpCi0JLy9AQ29sdW1uKG5hbWU9Ik1ZX0NPTFVNTiIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCAKLQkvLyAgICBjb2x1bW5EZWZpbml0aW9uPSJDT0xVTU5fREVGSU5JVElPTiIsIHRhYmxlPSJNWV9UQUJMRSIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkvL0BDb2x1bW4oCi0JLy9ATG9iCi0JLy9AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkKLQkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiaWQiLCBiYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0RW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQkKLQkJQ29sdW1uIGNvbHVtbiA9IGJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFzaWNNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0VHJ1ZShiYXNpY01hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJCi0JCUNvbHVtbiBjb2x1bW4gPSBiYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRUcnVlKGNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1CYXNpY01hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1CYXNpY01hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQmFzaWNNYXBwaW5nLmlzRGVmYXVsdE9wdGlvbmFsKCkpOwotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCi0JfQotCS8vMyB0aGluZ3MgdGVzdGVkIGFib3ZlCi0JLy8xLiB2aXJ0dWFsIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGU9ZmFsc2UgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSB0aGUgamF2YSBhbm5vdGF0aW9ucwotCS8vMi4gdmlydHVhbCBtYXBwaW5nIG1ldGFkYXRhIGNvbXBsZXRlPXRydWUgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSBqYXZhIGRlZmF1bHRzLGFubm90YXRpb25zIGlnbm9yZWQKLQkvLzMuIHNwZWNpZmllZCBtYXBwaW5nIChtZXRhZGF0YSBjb21wbGV0ZT10cnVlL2ZhbHNlIC0gZGVmYXVsdHMgYXJlIHRha2VuIGZyb20gamF2YSBhbm5vdGF0aW9ucwotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlCYXNpY01hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCQotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUJhc2ljTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWMiKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpYyIpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ2FzY2FkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2M1NDguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUNhc2NhZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUNhc2NhZGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUNhc2NhZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkKLQkJLy9zZXQgYWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJLy9zZXQgYWxsIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCQotCQkvL3NldCBhbGwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWNhc2NhZGUuc2V0QWxsKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCi0JCS8vc2V0IGFsbCB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldEFsbChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IFBlcnNpc3QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCQotCQkvL3NldCBQZXJzaXN0IHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkJCi0JCS8vc2V0IFBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWNhc2NhZGUuc2V0UGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCS8vc2V0IFBlcnNpc3QgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvT25lLnNldENhc2NhZGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FzY2FkZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IE1lcmdlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJLy9zZXQgTWVyZ2UgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCQotCQkvL3NldCBNZXJnZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJY2FzY2FkZS5zZXRNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJLy9zZXQgTWVyZ2UgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkKLQkJLy9zZXQgUmVtb3ZlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJLy9zZXQgUmVtb3ZlIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCQotCQkvL3NldCBSZW1vdmUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWNhc2NhZGUuc2V0UmVtb3ZlKHRydWUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCi0JCS8vc2V0IFJlbW92ZSB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljYXNjYWRlLnNldFJlbW92ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb09uZS5zZXRDYXNjYWRlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUNhc2NhZGVUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQkJCi0JCS8vc2V0IFJlZnJlc2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLmdldENhc2NhZGUoKS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCQotCQkvL3NldCBSZWZyZXNoIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZVJlZnJlc2goZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9uZVRvT25lLmdldENhc2NhZGUoKS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0Q2FzY2FkZSgpKTsKLQkJCQkJCi0JCS8vc2V0IFJlZnJlc2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWNhc2NhZGUuc2V0UmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb25lVG9PbmUuZ2V0Q2FzY2FkZSgpLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCi0JCS8vc2V0IFJlZnJlc2ggdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY2FzY2FkZS5zZXRSZWZyZXNoKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGI0YzFiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1Db2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGJhc2ljLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VGFibGUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRUYWJsZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGJhc2ljLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWJhc2ljLnNldENvbHVtbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldE51bGxhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldE51bGxhYmxlKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXROdWxsYWJsZSgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVcGRhdGFibGUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldFVwZGF0YWJsZSgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpYy5zZXRDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sdW1uKCkpOwotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRJbnNlcnRhYmxlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljLmdldENvbHVtbigpLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWJhc2ljLmdldENvbHVtbigpLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldEluc2VydGFibGUoKSk7Ci0KLQkJYmFzaWMuc2V0Q29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVbmlxdWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VW5pcXVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0VW5pcXVlKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldENvbHVtbigpLmdldFVuaXF1ZSgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRVbmlxdWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TGVuZ3RoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0TGVuZ3RoKEludGVnZXIudmFsdWVPZigxMSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDExKSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIGJhc2ljLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWJhc2ljLnNldENvbHVtbihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2x1bW4oKSk7Ci0JCWJhc2ljLmdldENvbHVtbigpLnNldFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0UHJlY2lzaW9uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZigxMSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDExKSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIGJhc2ljLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRQcmVjaXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgYmFzaWMgPSBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjYWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIGJhc2ljID0gZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0Q29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWMuc2V0Q29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbHVtbigpKTsKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0U2NhbGUoSW50ZWdlci52YWx1ZU9mKDgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpYy5nZXRDb2x1bW4oKS5zZXRTY2FsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJYmFzaWMuZ2V0Q29sdW1uKCkuc2V0U2NhbGUoSW50ZWdlci52YWx1ZU9mKDExKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTEpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTEpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQliYXNpYy5zZXRDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyBiYXNpYyA9IGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldENvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBiYXNpYy5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpYy5nZXRDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlcy5uZXh0KCk7CQotCQkKLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBuYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBuYW1lVmlydHVhbE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbHVtbiBqYXZhQ29sdW1uID0gamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJbmFtZVZpcnR1YWxNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCXZpcnR1YWxDb2x1bW4gPSBuYW1lVmlydHVhbE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ1LCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ2LCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDQ3LCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCi0JCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQluYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJdmlydHVhbENvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCW5hbWVWaXJ0dWFsTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQl2aXJ0dWFsQ29sdW1uID0gbmFtZVZpcnR1YWxNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCW5hbWVWaXJ0dWFsTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQl2aXJ0dWFsQ29sdW1uID0gbmFtZVZpcnR1YWxNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIGZhbHNlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGdldHMgc2V0dGluZyBmcm9tIGphdmEgYW5ub3RhdGlvbgotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQluYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJdmlydHVhbENvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoNDUsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNDYsIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNDcsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibmFtZSIpOwotCi0JCU9ybUJhc2ljTWFwcGluZyBuYW1lVmlydHVhbE1hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoSmF2YUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2x1bW4gamF2YUNvbHVtbiA9IGphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFDb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQ29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbENvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVPcm1BdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQlCYXNpY01hcHBpbmcgbmFtZVZpcnR1YWxNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbmFtZU9ybUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IG5hbWVWaXJ0dWFsTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIikuZ2V0TWFwcGluZygpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQluYW1lVmlydHVhbE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBuYW1lT3JtQXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCXZpcnR1YWxDb2x1bW4gPSBuYW1lVmlydHVhbE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkvL21ha2UgbmFtZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgdmlydHVhbAotCQluYW1lT3JtQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm5hbWUiKTsKLQkJQmFzaWNNYXBwaW5nIG5hbWVTcGVjaWZpZWRNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgbmFtZU9ybUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gc3BlY2lmaWVkQ29sdW1uID0gbmFtZVNwZWNpZmllZE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRSIsIHNwZWNpZmllZENvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFIiwgc3BlY2lmaWVkQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotLy9wdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVOb0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQotLy8JT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JWG1sRW50aXR5IHhtbEVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vL30KLS8vCi0vL3B1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkKLS8vCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwlYbWxFbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKFhtbEVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JWG1sRW50aXR5IGNoaWxkWG1sRW50aXR5ID0gKFhtbEVudGl0eSkgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkKLS8vCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQotLy8JcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vL30KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MmFhMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvckNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5EaXNjcmltaW5hdG9yVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1EaXNjcmltaW5hdG9yQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybURpc2NyaW1pbmF0b3JDb2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBhYnN0cmFjdCBjbGFzcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCBGSUxFX05BTUUsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCVhtbEVudGl0eSBvcm1FbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLS8vCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQotLy8JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCW9ybUVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sRW50aXR5IG9ybUVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwkJWG1sRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCQotLy8JCXBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJcGFyZW50WG1sRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgpLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoMTEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTEpLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGlzY3JpbWluYXRvckNvbHVtbiBvcm1Db2x1bW4gPSBvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1EaXNjcmltaW5hdG9yQ29sdW1uIG9ybUNvbHVtbiA9IG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCQotCQkvL3NldCBkaXNjcmltaW5hdG9yIHR5cGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldERpc2NyaW1pbmF0b3JDb2x1bW4oT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sRGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgb3JtQ29sdW1uLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5EaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkKLQkJLy9zZXQgZGlzY3JpbWluYXRvciB0eXBlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXREaXNjcmltaW5hdG9yVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldERpc2NyaW1pbmF0b3JUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybURpc2NyaW1pbmF0b3JDb2x1bW4gb3JtQ29sdW1uID0gb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJCi0JCS8vc2V0IGRpc2NyaW1pbmF0b3IgdHlwZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbHVtbi5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuU1RSSU5HLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkRpc2NyaW1pbmF0b3JUeXBlLlNUUklORywgZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJLy9zZXQgZGlzY3JpbWluYXRvciB0eXBlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sdW1uLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNOb0Rpc2NyaW1pbmF0b3JDb2x1bW5JbkphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi4iICsgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBjaGlsZEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGVzdCBkZWZhdWx0cyB3aXRoIHNpbmdsZS10YWJsZSBpbmhlcml0YW5jZSwgbm8gc3BlY2lmaWVkIGRpc2NyaW1pbmF0b3IgY29sdW1uIHNldAotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQkKLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0IG9uIHJvb3QKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkRUWVBFMiIpOwotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5DSEFSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9OQU1FLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTEVOR1RILCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9ESVNDUklNSU5BVE9SX1RZUEUsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUyIiwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscygiRFRZUEUyIiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJCi0JCS8vdGVzdCBkZWZhdWx0cyB3aXRoIHRhYmxlLXBlci1jbGFzcyBpbmhlcml0YW5jZSwgZGlzY3JpbWluYXRvciBjb2x1bW4gZG9lcyBub3QgYXBwbHkKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShudWxsKTsKLQkJYWJzdHJhY3RFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBhYnN0cmFjdEVudGl0eS5nZXRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjaGlsZEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHNEaXNjcmltaW5hdG9yQ29sdW1uSW5KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuIiArICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgY2hpbGRFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCSgoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJKChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQkoKEVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuQ0hBUik7Ci0JCQotCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgaW4gamF2YQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yVHlwZS5DSEFSLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCQkKLQkJLy90ZXN0IGRlZmF1bHRzIHdpdGggc2luZ2xlLXRhYmxlIGluaGVyaXRhbmNlLCBzcGVjaWZpZWQgZGlzY3JpbWluYXRvciBjb2x1bW4gc2V0IGluIGphdmEsIG1ldGFkYXRhLWNvbXBsZXRlIHRydWUKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX05BTUUsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JDb2x1bW4uREVGQVVMVF9MRU5HVEgsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0RJU0NSSU1JTkFUT1JfVFlQRSwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCQotCQkvL3Rlc3QgZGVmYXVsdHMgd2l0aCBzaW5nbGUtdGFibGUgaW5oZXJpdGFuY2UsIHNwZWNpZmllZCBkaXNjcmltaW5hdG9yIGNvbHVtbiBzZXQgaW4gb3JtCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclR5cGUoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfTkFNRSwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvckNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgYWJzdHJhY3RFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhEaXNjcmltaW5hdG9yQ29sdW1uLkRFRkFVTFRfRElTQ1JJTUlOQVRPUl9UWVBFLCBhYnN0cmFjdEVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGNoaWxkRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgY2hpbGRFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLmdldERlZmF1bHREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmOTYzYzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkYWJsZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtRW1iZWRkYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW1iZWRkYWJsZS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW1iZWRkYWJsZVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbWJlZGRhYmxlLnNldENsYXNzKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbWJlZGRhYmxlLnNldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCS8vVE9ETyBhZGQgdGVzdHMgZm9yIHNldHRpbmcgdGhlIGNsYXNzTmFtZSB3aGVuIHRoZSBwYWNrYWdlIGlzIHNldCBvbiBlbnRpdHktbWFwcGluZ3MKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkvL1RPRE8gdGVzdCBkZWZhdWx0IGFjY2VzcyBmcm9tCi0JCS8vdW5kZXJseWluZyBqYXZhCi0JCS8vcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cwotCQkvL2VudGl0eS1tYXBwaW5ncwotCQkvL3dpdGggeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgc2V0Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRhYmxlUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZW1iZWRkYWJsZVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRhYmxlUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlvcm1FbWJlZGRhYmxlLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1FbWJlZGRhYmxlLmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybUVtYmVkZGFibGUuaXNPdmVycmlkZU1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVtYmVkZGFibGUuaXNPdmVycmlkZU1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGFibGUuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkYWJsZVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW1iZWRkYWJsZS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGFibGVSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZUVtYmVkZGFibGVFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5LmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkJCi0JLy90ZXN0IHdpdGggMiBFbWJlZGRhYmxlcywgbWFrZSB0aGUgc2Vjb25kIG9uZSBhbiBFbnRpdHkgc28gaXQgaGFzIHRvIG1vdmUgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0Ci0JcHVibGljIHZvaWQgdGVzdE1ha2VFbWJlZGRhYmxlRW50aXR5MigpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5LmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRUeXBlPiBwZXJzaXN0ZW50VHlwZXMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZU1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQllbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzLmdldEFjY2VzcygpKTsKLQkKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCS8vdGVzdCB3aXRoIDIgRW1iZWRkYWJsZXMsIG1ha2UgdGhlIHNlY29uZCBvbmUgYSBNYXBwZWRTdXBlcmNsYXNzIHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdAotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW1iZWRkYWJsZU1hcHBlZFN1cGVyY2xhc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vMiIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbWJlZGRhYmxlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZW1iZWRkYWJsZS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCi0JCWVtYmVkZGFibGVQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyAgbWFwcGVkU3VwZXJjbGFzcyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QWNjZXNzKCkpOwotCQotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMjIzOGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbENvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZElkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1FbWJlZGRlZElkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCi0JcHVibGljIE9ybUVtYmVkZGVkSWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERURfSUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiQV9TVEFURVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkTWFwcGluZyIsIHhtbEVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkTWFwcGluZyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCQkJCi0vLwkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQllbWJlZGRlZElkUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotLy8JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHhtbEVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkKLS8vCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotLy8JCWFzc2VydE51bGwoZW1iZWRkZWRJZFJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoSU1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWRNYXBwaW5nIik7Ci0vLwkJWG1sRW1iZWRkZWRJZE1hcHBpbmcgeG1sRW1iZWRkZWRJZE1hcHBpbmcgPSAoWG1sRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCUVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWRNYXBwaW5nIiwgeG1sRW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWRNYXBwaW5nIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJCQkKLS8vCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB4bWxFbWJlZGRlZElkTWFwcGluZy5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8JCi0vLwkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcuc2V0TmFtZShudWxsKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVtYmVkZGVkSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChlbWJlZGRlZElkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCVhtbFBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoSU1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWRNYXBwaW5nIik7Ci0vLwkJWG1sRW1iZWRkZWRJZE1hcHBpbmcgeG1sRW1iZWRkZWRJZE1hcHBpbmcgPSAoWG1sRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCUVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLS8vCQkKLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTIgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOwotLy8JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTMgPSB4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKTsKLS8vCQlvcm1SZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUzLnNldE5hbWUoIkJBWiIpOwotLy8JCW9ybVJlc291cmNlKCkuc2F2ZShudWxsKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTMsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZSwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApLnNldE5hbWUoIkZPTyIpOwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpLnNldE5hbWUoIkJBUiIpOwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIpLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygzLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQkKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwotLy8JCXhtbEVtYmVkZGVkSWRNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygxLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShJTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZE1hcHBpbmciKTsKLS8vCQlYbWxFbWJlZGRlZElkTWFwcGluZyB4bWxFbWJlZGRlZElkTWFwcGluZyA9IChYbWxFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotLy8KLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgxKS5zZXROYW1lKCJCQVIiKTsKLS8vCQl4bWxFbWJlZGRlZElkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyKS5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIsIDApOwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotLy8KLS8vCi0vLwkJeG1sRW1iZWRkZWRJZE1hcHBpbmcubW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDAsIDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8KLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkTWFwcGluZyIpOwotLy8JCVhtbEVtYmVkZGVkSWRNYXBwaW5nIHhtbEVtYmVkZGVkSWRNYXBwaW5nID0gKFhtbEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0vLwkJCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0vLwkJCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0vLwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0geG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0vLwotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8KLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8KLS8vCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHhtbEVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0vLwkJYXNzZXJ0RmFsc2UoeG1sRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkuaGFzTmV4dCgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkSWQiKTsKLQkJCi0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJvdmVycmlkZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1ZFUlJJREVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRJZE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRJZCIpOwotCQkKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRJZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZElkTW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZElkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZElkIik7Ci0JCQotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWRJZCBlbWJlZGRlZElkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkSWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbWJlZGRlZFJlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbWJlZGRlZFJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRW1iZWRkZWRNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0JCU9ybUVtYmVkZGVkSWRNYXBwaW5nIG9ybUVtYmVkZGVkSWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRlZElkIGVtYmVkZGVkSWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkSWRzKCkuZ2V0KDApOwotCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwkJCi0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRJZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkSWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGVkSWQgZW1iZWRkZWRJZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRJZHMoKS5nZXQoMCk7Ci0JCQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRJZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZElkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVtYmVkZGVkSWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1FbWJlZGRlZElkTWFwcGluZyA9IChPcm1FbWJlZGRlZElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQkKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVtYmVkZGFibGVBZGRyZXNzVHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUVfICsgIkFkZHJlc3MiKTsKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyB2aXJ0dWFsLCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBqYXZhRW1iZWRkZWRJZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnJlc29sdmVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbWJlZGRlZElkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbHVtbigpOwotCQkKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPT19DT0xVTU4iKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIGVtYmVkZGFibGVBZGRyZXNzVHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfU1RBVEVfQ09MVU1OIik7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX0NPTFVNTiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHNwZWNpZmllZCwgdmlydHVhbCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAotCQlwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1FbWJlZGRlZElkTWFwcGluZyBvcm1NYXBwaW5nID0gKE9ybUVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3JtT3ZlcnJpZGVDb250YWluZXIgPSBvcm1NYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1PdmVycmlkZXMgPSBvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIG9ybU92ZXJyaWRlID0gb3JtT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybU92ZXJyaWRlID0gb3JtT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQlvcm1PdmVycmlkZSA9IG9ybU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIG9ybU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1PdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCW9ybU92ZXJyaWRlID0gb3JtT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvcm1PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCW9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJb3JtT3ZlcnJpZGVzID0gb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCW9ybU92ZXJyaWRlID0gb3JtT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJb3JtT3ZlcnJpZGUgPSBvcm1PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJb3JtT3ZlcnJpZGUgPSBvcm1PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRV8gKyAiQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUphdmFFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJQ29sdW1uIGNvbHVtbiA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQl0aGlzLm9ybVhtbFJlc291cmNlLnNhdmVJZk5lY2Vzc2FyeSgpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCUphdmFWaXJ0dWFsQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxDb2x1bW4gPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiQV9TVEFURSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBX1NUQVRFIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFfU1RBVEUiLCB2aXJ0dWFsQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQ29sdW1uID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCS8vd2lsbCBiZSBhbiBPcm1FbWJlZGRlZE1hcHBpbmcgaW5zdGVhZCBvZiBPcm1FbWJlZGRlZElkTWFwcGluZyBzaW5jZSB0aGF0IGlzIHRoZSBkZWZhdWx0Ci0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJLy9UT0RPCi0vLwkJYXNzZXJ0RXF1YWxzKDQsIG9ybUVtYmVkZGVkSWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkSWRNYXBwaW5nLmRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSkpOwotLy8JCUxpc3RJdGVyYXRvcjxYbWxBdHRyaWJ1dGVPdmVycmlkZT4gb3JtQXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRJZE1hcHBpbmcuc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwotLy8JCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiY2l0eSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB4bWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLS8vCQkKLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRJZE1hcHBpbmcgb3JtRW1iZWRkZWRJZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRJZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW1iZWRkZWRJZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQkvL1RPRE8KLS8vCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUob3JtRW1iZWRkZWRJZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpKSk7Ci0vLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZElkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0vLwotLy8JCVhtbEF0dHJpYnV0ZU92ZXJyaWRlIG9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJWG1sQ29sdW1uIHhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiY2l0eSIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgeG1sQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNiksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0vLwkJCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCXhtbENvbHVtbiA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbWJlZGRlZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YmNkODEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVtYmVkZGVkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJjaXR5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FID0gIkVfQ0lUWSI7Ci0KLQlwdWJsaWMgT3JtRW1iZWRkZWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5FTUJFRERFRCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29sdW1uKG5hbWU9XCJBX1NUQVRFXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkTWFwcGluZyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW1iZWRkZWRSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVtYmVkZGVkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVtYmVkZGVkTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotLy8JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLS8vCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotLy8JCQotLy8JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotLy8JCQkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlMiA9IG9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZTIuc2V0TmFtZSgiQkFSIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUzLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZTMsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscyhhdHRyaWJ1dGVPdmVycmlkZSwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSk7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotLy8JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0vLwotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKS5zZXROYW1lKCJGT08iKTsKLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMSkuc2V0TmFtZSgiQkFSIik7Ci0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDIpLnNldE5hbWUoIkJBWiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygzLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJCi0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLnJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDApOwotLy8JCWFzc2VydEVxdWFscygxLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotLy8JCQotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsJCQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRV8gKyAiQWRkcmVzcyIpOwotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHZpcnR1YWwsIEphdmEgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb2x1bW4oKTsKLQkJCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZTIuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1NUQVRFX0NPTFVNTiIpOwotCQllbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgc3BlY2lmaWVkLCB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1NYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG9ybU92ZXJyaWRlQ29udGFpbmVyID0gb3JtTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgb3JtVmlydHVhbE92ZXJyaWRlID0gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJb3JtVmlydHVhbE92ZXJyaWRlID0gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtVmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJb3JtVmlydHVhbE92ZXJyaWRlID0gb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBvcm1WaXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCW9ybVZpcnR1YWxPdmVycmlkZSA9IG9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCW9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvcm1PdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJb3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlvcm1WaXJ0dWFsT3ZlcnJpZGUgPSBvcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb3JtVmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybVZpcnR1YWxPdmVycmlkZSA9IG9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtVmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybVZpcnR1YWxPdmVycmlkZSA9IG9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybVZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBjb2x1bW4gPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlWaXJ0dWFsQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbENvbHVtbiA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJBX1NUQVRFIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQ29sdW1uID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQkvL1RPRE8KLS8vCQlhc3NlcnRFcXVhbHMoNCwgb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCS8vVE9ETwotLy8JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbWJlZGRlZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpKSk7Ci0vLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8KLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm92ZXJyaWRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPVkVSUklERV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvLzEuMCBwcm9qZWN0cyBkbyBub3Qgc3VwcG9ydCBkb3Qtbm90YXRpb24sIHRoaXMgdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgc3VwcG9ydCBkb2VzIG5vdCBleGlzdAotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJLy9jaGVjayB0aGUgbmVzdGVkIGVtYmVkZGVkIChBZGRyZXNzLnppcENvZGUpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChPcm1FbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgdGhlcmUgaXMgbm8gYXR0cmlidXRlIG92ZXJyaWRlIG5hbWVkIHppcENvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChPcm1FbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1FbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MTQ1Y2UuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkQ2xhc3NSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUHJpbWFyeUtleUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUVudGl0eVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRF9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBDSElMRF9UWVBFX05BTUU7Ci0JCi0JCi0JcHVibGljIE9ybUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlEZWZhdWx0RmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoQ0hJTERfVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGVVbm1hcHBlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZChDSElMRF9UWVBFX05BTUUpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiKS5hcHBlbmQoVFlQRV9OQU1FKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oCi0JCQkJCUpQQS5NQVBQRURfU1VQRVJDTEFTUywgCi0JCQkJCUpQQS5CQVNJQywKLQkJCQkJSlBBLlZFUlNJT04sCi0JCQkJCUpQQS5UUkFOU0lFTlQsCi0JCQkJCUpQQS5FTUJFRERFRCwKLQkJCQkJSlBBLkVNQkVEREVEX0lELAotCQkJCQlKUEEuT05FX1RPX09ORSwKLQkJCQkJSlBBLk9ORV9UT19NQU5ZLAotCQkJCQlKUEEuTUFOWV9UT19PTkUsCi0JCQkJCUpQQS5NQU5ZX1RPX01BTlksCi0JCQkJCUpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEJhc2ljIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBiYXNpYzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFZlcnNpb24iKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHZlcnNpb247IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUcmFuc2llbnQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHRyYW5zaWVudDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkSWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtYmVkZGVkSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgQ0hJTERfVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgb25lVG9NYW55OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBtYW55VG9NYW55OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0QWJzdHJhY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgYWJzdHJhY3QgY2xhc3MgIikuYXBwZW5kKFRZUEVfTkFNRSkuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRklMRV9OQU1FLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklOSEVSSVRBTkNFLCBKUEEuSU5IRVJJVEFOQ0VfVFlQRSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7Ci0JCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJUZXN0VHlwZUlkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlRlc3RUeXBlSWQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5zZXRTcGVjaWZpZWROYW1lKCJGb28iKTsKLQkJLy94bWwgZGVmYXVsdCBlbnRpdHkgbmFtZSBjb21lcyBmcm9tIGphdmEKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldENsYXNzTmFtZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLnNldFNwZWNpZmllZE5hbWUoIkZvbzEiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28xIiwgb3JtRW50aXR5LmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRDbGFzc05hbWUoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldE5hbWUoIkJheiIpOwotCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkJheiIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtRW50aXR5LmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUVudGl0eS5zZXRDbGFzcygiY29tLkJhciIpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVudGl0eS5zZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JLy9UT0RPIGFkZCB0ZXN0cyBmb3Igc2V0dGluZyB0aGUgY2xhc3NOYW1lIHdoZW4gdGhlIHBhY2thZ2UgaXMgc2V0IG9uIGVudGl0eS1tYXBwaW5ncwotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEFjY2Vzc0Zyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJLy9qYXZhIGhhcyBubyBhbm5vdGF0aW9ucywgZGVmYXVsdEFjY2VzcyBpbiB4bWwgaXMgRklFTEQgYW55d2F5Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsJCQotCQkvL2VudGl0eU1hcHBpbmdzIGFjY2VzcyB3aW5zIG92ZXIgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBhY2Nlc3MKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsJCQotCQkvL3BlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgYWNjZXNzIHVzZWQgbm93Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJLy9qYXZhIGhhcyBhbm5vdGF0aW9ucyBvbiBmaWVsZHMgbm93LCB0aGF0IHNob3VsZCB3aW4gaW4gYWxsIGNhc2VzCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzRnJvbUphdmFGaWVsZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRBY2Nlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRBY2Nlc3NGcm9tSmF2YVByb3BlcnR5QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUFjY2VzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEFjY2Vzc05vVW5kZXJseWluZ0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkuYm9vbGVhblZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc092ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybUVudGl0eS5pc092ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydFRydWUob3JtRW50aXR5LmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUVudGl0eS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5pc01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKSk7Ci0KLQkJLy9zZXQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldEluaGVyaXRhbmNlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaGVyaXRhbmNlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgb3JtRW50aXR5LmdldEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneSgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3lGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RGVmYXVsdEZpZWxkQWNjZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJLy9ubyBpbmhlcml0YW5jZSBzdHJhdGVneSBzcGVjaWZpZWQgaW4gamF2YSBzbyBzaW5nbGUtdGFibGUgaXMgZGVmYXVsdAotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCS8vaW5oZXJpdGFuY2UgdGFnIGV4aXN0cyBpbiB4bWwsIHNvIGl0IG92ZXJyaWRlcyBhbnl0aGluZyBpbiBqYXZhCi0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0KLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kobnVsbCk7CQkKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5KT0lORUQsIG9ybUVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBvcm1FbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCS8vdGhpcyBzZXR0aW5nIG92ZXJyaWRlcyB0aGUgZmFsc2UgbWV0YS1kYXRhIGNvbXBsZXRlIGZvdW5kIG9uIG9ybUVudGl0eQotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3lGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlEZWZhdWx0RmllbGRBY2Nlc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIHN1cGVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBzdWJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMocGFyZW50WG1sRW50aXR5LCBjaGlsZFhtbEVudGl0eS5nZXRQYXJlbnRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuU0lOR0xFX1RBQkxFLCBjaGlsZFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCS8vY2hhbmdlIHJvb3QgaW5oZXJpdGFuY2Ugc3RyYXRlZ3ksIHZlcmlmeSBkZWZhdWx0IGlzIGNoYW5nZWQgZm9yIGNoaWxkIGVudGl0eQotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIHBhcmVudFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGNoaWxkWG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0KLQkJLy9zZXQgc3BlY2lmaWVkIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGluIGphdmEgYW5kIHZlcmlmeSBkZWZhdWx0cyBpbiB4bWwgYXJlIGNvcnJlY3QKLQkJcGFyZW50WG1sRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kobnVsbCk7Ci0JCXBhcmVudFhtbEVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgcGFyZW50WG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgY2hpbGRYbWxFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIHBhcmVudFhtbEVudGl0eS5nZXREZWZhdWx0SW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGNoaWxkWG1sRW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwotCQkKLQkJLy9zZXQgc3RyYXRlZ3kgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldEluaGVyaXRhbmNlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZUluaGVyaXRhbmNlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLnNldFN0cmF0ZWd5KG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydEVxdWFscyhJbmhlcml0YW5jZVR5cGUuSk9JTkVELCBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5nZXRTdHJhdGVneSgpKTsKLQkKLQkJLy9zZXQgc3RyYXRlZ3kgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKS5zZXRTdHJhdGVneShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlNJTkdMRV9UQUJMRSwgb3JtRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkluaGVyaXRhbmNlVHlwZS5TSU5HTEVfVEFCTEUsIGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkuZ2V0U3RyYXRlZ3koKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0SW5oZXJpdGFuY2UobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SW5oZXJpdGFuY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldEluaGVyaXRhbmNlKCkpOwotCQkKLQkJLy9zZXQgc3RyYXRlZ3kgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Jbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTLCBlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJLy9zZXQgc3RyYXRlZ3kgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRJbmhlcml0YW5jZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlMiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJc2Vjb25kYXJ5VGFibGUyLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlMyA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKTsKLQkJc2Vjb25kYXJ5VGFibGUzLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhzZWNvbmRhcnlUYWJsZTIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoc2Vjb25kYXJ5VGFibGUzLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHNlY29uZGFyeVRhYmxlLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUVudGl0eS5tb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVudGl0eS5tb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCwgMSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1TZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkubW92ZSgyLCAwKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLm1vdmUoMCwgMSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5yZW1vdmUoMSk7Ci0JCXNlY29uZGFyeVRhYmxlcyA9IG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNlY29uZGFyeVRhYmxlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgxKTsKLQkJc2Vjb25kYXJ5VGFibGVzID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzZWNvbmRhcnlUYWJsZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1cGVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRPcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBzdXBlclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRW50aXR5IGNoaWxkT3JtRW50aXR5ID0gKE9ybUVudGl0eSkgc3ViUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSBjaGlsZE9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKTsKLQkJCi0JCUphdmFTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGVGb28gPSBqYXZhRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlqYXZhU2Vjb25kYXJ5VGFibGVGb28uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCU9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVGb28gPSBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRPcm1FbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVGb28uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZUZvby5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlRm9vLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlRm9vLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRPcm1FbnRpdHkuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjaGlsZE9ybUVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQkKLQkJamF2YUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZT4gdmlydHVhbFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlMaXN0SXRlcmF0b3I8UmVhZE9ubHlTZWNvbmRhcnlUYWJsZT4gc2Vjb25kYXJ5VGFibGVzID0gY2hpbGRPcm1FbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNoaWxkT3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCQotCQljaGlsZE9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJCi0JCWNoaWxkT3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJCi0JCQotCQljaGlsZE9ybUVudGl0eS5zZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygwLCBjaGlsZE9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjaGlsZE9ybUVudGl0eS5nZXRTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtU2Vjb25kYXJ5VGFibGU+IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUZvbyA9IHNwZWNpZmllZFNlY29uZGFyeVRhYmxlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVGb28uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlRm9vLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRTZWNvbmRhcnlUYWJsZUZvby5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZFNlY29uZGFyeVRhYmxlRm9vLmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCQotCQljaGlsZE9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY2hpbGRPcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNoaWxkT3JtRW50aXR5LmdldFNlY29uZGFyeVRhYmxlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRPcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCi0JCWNoaWxkT3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgY2hpbGRPcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY2hpbGRPcm1FbnRpdHkuZ2V0U2Vjb25kYXJ5VGFibGVzU2l6ZSgpKTsKLQkJdmlydHVhbFNlY29uZGFyeVRhYmxlcyA9IGNoaWxkT3JtRW50aXR5LmdldFZpcnR1YWxTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxTZWNvbmRhcnlUYWJsZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbFNlY29uZGFyeVRhYmxlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL2FkZCBhIHNwZWNpZmllZCBzZWNvbmRhcnkgdGFibGUgdG8gdGhlIHBhcmVudCwgdGhpcyB3aWxsIG5vdCBhZmZlY3QgdmlydHVhbCBzZWNvbmRhcnlUYWJsZXMgaW4gY2hpbGQKLQkJcGFyZW50T3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIlBBUkVOVF9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoMiwgY2hpbGRPcm1FbnRpdHkuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlc1NpemUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGVkVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZEFjY2VzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRBc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkJCi0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGVudGl0eS5nZXRBc3NvY2lhdGVkVGFibGVzKCkpKTsKLQkKLQkJZW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoZW50aXR5LmdldEFzc29jaWF0ZWRUYWJsZXMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRlZFRhYmxlTmFtZXNJbmNsdWRpbmdJbmhlcml0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVOYW1lSXNJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoIkRJU0NfVkFMVUUiKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWROYW1lKCJFTlRJVFlfTkFNRSIpOwotCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIGVtYmVkZGFibGUuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbWJlZGRhYmxlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVtYmVkZGFibGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkKLQkvL1RPRE8gdGVzdCB0aGF0IGF0dHJpYnV0ZSBtYXBwaW5ncyBhcmUgbm90IHJlbW92ZWQgd2hlbiBjaGFuZ2luZyB0eXBlIG1hcHBpbmcuCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlFbWJlZGRhYmxlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJESVNDX1ZBTFVFIik7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTmFtZSgiRU5USVRZX05BTUUiKTsKLS8vCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlKElNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkKLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlLmdldEFjY2VzcygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoImJhc2ljTWFwcGluZyIsIGVtYmVkZGFibGUuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtRW1iZWRkYWJsZSBvcm1FbWJlZGRhYmxlID0gKE9ybUVtYmVkZGFibGUpIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscygiYmFzaWNNYXBwaW5nIiwgb3JtRW1iZWRkYWJsZS5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZXMoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VFbnRpdHlNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoIkRJU0NfVkFMVUUiKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWROYW1lKCJFTlRJVFlfTkFNRSIpOwotCQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3MuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlRW50aXR5TWFwcGVkU3VwZXJjbGFzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbzIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRElTQ19WQUxVRSIpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZE5hbWUoIkVOVElUWV9OQU1FIik7Ci0JCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBtYXBwZWRTdXBlcmNsYXNzLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGVkU3VwZXJjbGFzcy5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU2VxdWVuY2VHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQotCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlU2VxdWVuY2VHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJLy90cnkgcmVtb3ZpbmcgdGhlIHRhYmxlIGdlbmVyYXRvciBhZ2Fpbiwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVUYWJsZUdlbmVyYXRvcigpOwkJCi0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0KLQkJb3JtRW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yQ29sdW1uKG51bGwpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChvcm1FbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0RGlzY3JpbWluYXRvclZhbHVlKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXREaXNjcmltaW5hdG9yVmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGlzY3JpbWluYXRvclZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXREaXNjcmltaW5hdG9yVmFsdWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkRGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHREaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZpZWxkQWNjZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybUVudGl0eS5nZXROYW1lKCksIG9ybUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQotCQlqYXZhRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJCi0JCWphdmFFbnRpdHkuZ2V0RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlqYXZhRW50aXR5LnNldFNwZWNpZmllZERpc2NyaW1pbmF0b3JWYWx1ZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhvcm1FbnRpdHkuZ2V0TmFtZSgpLCBvcm1FbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4yID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4zID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHByaW1hcnlLZXlKb2luQ29sdW1uMiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhwcmltYXJ5S2V5Sm9pbkNvbHVtbjMsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocHJpbWFyeUtleUpvaW5Db2x1bW4sIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtRW50aXR5LnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRW50aXR5Lm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlVW5tYXBwZWQoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCSgoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCQotCQlPcm1FbnRpdHkgY2hpbGRFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydFRydWUoY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQljaGlsZFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQlwZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydFRydWUoY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBzcGVjaWZpZWRQa0pvaW5Db2x1bW4gPSBjaGlsZEVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJc3BlY2lmaWVkUGtKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vcmVtb3ZlIHRoZSBwa0pvaW5Db2x1bW4gZnJvbSB0aGUgY29udGV4dCBtb2RlLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBoYXMgYSBkZWZhdWx0IHBrSm9pbkNvbHVtbgotCQljaGlsZEVudGl0eS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkKLQkJY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbiA9IGNoaWxkRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlzcGVjaWZpZWRQa0pvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZFBrSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSIik7CQkKLQkJYXNzZXJ0RmFsc2UoY2hpbGRFbnRpdHkuZ2V0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJLy9ub3cgcmVtb3ZlIHRoZSBwa0pvaW5Db2x1bW4gZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZXMgYW5kIGhhcyBhIGRlZmF1bHQgcGtKb2luQ29sdW1uCi0JCWNoaWxkRW50aXR5LmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRUcnVlKGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uc0Zyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGaWVsZEFjY2VzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCSgoSmF2YUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotCQkKLQkJT3JtRW50aXR5IGNoaWxkRW50aXR5ID0gKE9ybUVudGl0eSkgY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNoaWxkUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4gamF2YVByaW1hcnlLZXlKb2luQ29sdW1uID0gamF2YUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJamF2YVByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOwotCQkKLQkJSmF2YVByaW1hcnlLZXlKb2luQ29sdW1uIGphdmFQcmltYXJ5S2V5Sm9pbkNvbHVtbjIgPSBqYXZhRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlqYXZhUHJpbWFyeUtleUpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkZPTzIiKTsKLQkJamF2YVByaW1hcnlLZXlKb2luQ29sdW1uMi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiQkFSMiIpOwotCQkKLQkJY2hpbGRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8UmVhZE9ubHlQcmltYXJ5S2V5Sm9pbkNvbHVtbj4gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucyA9IGNoaWxkRW50aXR5LmdldERlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlSZWFkT25seVByaW1hcnlLZXlKb2luQ29sdW1uIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IGRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTzIiLCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIyIiwgZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRGYWxzZShkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQljaGlsZEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWRlZmF1bHRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBjaGlsZEVudGl0eS5nZXREZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1uID0gZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBkZWZhdWx0UHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UoZGVmYXVsdFByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJZW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKYXZhQ29sdW1uIGphdmFDb2x1bW4gPSBlbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb2x1bW4oKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWphdmFDb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFDb2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoOCkpOwotCQlqYXZhQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig5KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOCksIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOSksIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJCi0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImJhc2ljIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFzaWMiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJiYXNpYyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1CYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJiYXNpYyIpLmdldE1hcHBpbmcoKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX05BTUUiKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9UT0RPIHNwZWNpZmllZCBvciBkZWZhdWx0PwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNyksIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOCksIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOSksIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX05BTUUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNOb0phdmFFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCQotCQkoKEphdmFFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVDb2x1bW5EZWZhdWx0c05vSmF2YUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlVW5tYXBwZWQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1FbnRpdHkgY2hpbGRFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZFR5cGUuZ2V0TWFwcGluZygpOwkKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgY2hpbGRPdmVycmlkZUNvbnRhaW5lciA9IGNoaWxkRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCU9ybVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBjaGlsZE92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJKChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNoaWxkVHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgKChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNoaWxkVHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikpLmdldE1hcHBpbmcoKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0NPTFVNTiIpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IGNoaWxkT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eURlZmF1bHRGaWVsZEFjY2VzcygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlEZWZhdWx0RmllbGRBY2Nlc3MoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfQ0hJTERfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsJCQotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXNpYyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7CQkKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhYnN0cmFjdEVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb25jcmV0ZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBjb25jcmV0ZUVudGl0eSA9IChPcm1FbnRpdHkpIGNvbmNyZXRlUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGNvbmNyZXRlRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQ0hJTERfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQkKLQkJYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChPcm1CYXNpY01hcHBpbmcpIGFic3RyYWN0UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKENISUxEX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCU9ybVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChPcm1WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCU9ybVZpcnR1YWxKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVfaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhDSElMRF9UWVBFX05BTUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0KLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGphdmFKb2luaW5nU3RyYXRlZ3kgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFIik7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJam9pbmluZ1N0cmF0ZWd5ID0gdmlydHVhbE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCU9ybVZpcnR1YWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQkKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCWpvaW5pbmdTdHJhdGVneSA9IHZpcnR1YWxPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCQotCQlwZXJzaXN0ZW50VHlwZTIuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSTkNFX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSMiIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYyIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0KLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJam9pbmluZ1N0cmF0ZWd5ID0gdmlydHVhbE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCW9ybUpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQkKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbE92ZXJyaWRlcy5uZXh0KCk7Ci0JCWpvaW5pbmdTdHJhdGVneSA9IHZpcnR1YWxPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJb3JtSm9pbkNvbHVtbiA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJOQ0VfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSMiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRjIiLCBvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCX0KLS8vVE9ETwotLy8JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc05vSmF2YUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9DSElMRF9UWVBFX05BTUUpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotLy8JCXBlcnNpc3RlbnRUeXBlMi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0vLwkJCi0vLwkJcGVyc2lzdGVudFR5cGUyLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpLnNldFNwZWNpZmllZE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotLy8JCXBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIikuc2V0U3BlY2lmaWVkTWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotLy8JCQkKLS8vCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygyLCBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLS8vCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotLy8JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uc1NpemUoKSk7Ci0vLwkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lX2lkIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhDSElMRF9UWVBFX05BTUUsIGpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG51bGwsIGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyh0cnVlLCBqb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0vLwotLy8JCQotLy8JCWVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkpOwotLy8JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IGVudGl0eS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKTsKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQllbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydEVxdWFscygxLCBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpKTsKLS8vCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCk7Ci0vLwkJYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJZW50aXR5LnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpLnNldFZpcnR1YWwodHJ1ZSk7Ci0vLwkJZW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJZW50aXR5LmdldEphdmFFbnRpdHkoKS52aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0vLwkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkuZ2V0SmF2YUVudGl0eSgpLnNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8JCUphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLS8vCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFIik7Ci0vLwkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotLy8JCWphdmFKb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLS8vCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLS8vCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLS8vCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQkKLS8vCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMobnVsbCwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1ucygpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCQotLy8JCXBlcnNpc3RlbnRUeXBlMi5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIikubWFrZVNwZWNpZmllZCgpOwotLy8JCU9ybU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZTIuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpLmdldE1hcHBpbmcoKTsKLS8vCQlqb2luQ29sdW1uID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uSm9pbmluZ1N0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLS8vCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX05BTUUiKTsKLS8vCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUk5DRV9OQU1FIik7Ci0vLwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSMiIpOwotLy8JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRjIiKTsKLS8vCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLS8vCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotLy8KLS8vCQkKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gZW50aXR5LnZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpOwotLy8JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJb3JtSm9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0UiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwotLy8JCQotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkudmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibWFueVRvT25lIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCW9ybUpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiTVlfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSTkNFX05BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSMiIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGMiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCU9ybU5hbWVkUXVlcnkgbmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZFF1ZXJ5IG5hbWVkUXVlcnkyID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5MyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7Ci0JCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZFF1ZXJ5PiBuYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTIsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeTMsIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMobmFtZWRRdWVyeSwgbmFtZWRRdWVyaWVzLm5leHQoKSk7Ci0JCQotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDAsIDEpOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkubW92ZSgyLCAwKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKDAsIDEpOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnJlbW92ZSgxKTsKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJbmFtZWROYXRpdmVRdWVyeS5zZXROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeTIgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQluYW1lZE5hdGl2ZVF1ZXJ5Mi5zZXROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnkzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKTsKLQkJbmFtZWROYXRpdmVRdWVyeTMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkTmF0aXZlUXVlcnk+IG5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5MywgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhuYW1lZE5hdGl2ZVF1ZXJ5LCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZE5hdGl2ZVF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWROYXRpdmVRdWVyeT4gbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkubW92ZU5hbWVkTmF0aXZlUXVlcnkoMCwgMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkTmF0aXZlUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZE5hdGl2ZVF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWROYXRpdmVRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkTmF0aXZlUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCUxpc3RJdGVyYXRvcjxPcm1OYW1lZE5hdGl2ZVF1ZXJ5PiBuYW1lZE5hdGl2ZVF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLm1vdmUoMiwgMCk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkTmF0aXZlUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkubW92ZSgwLCAxKTsKLQkJbmFtZWROYXRpdmVRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWROYXRpdmVRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5yZW1vdmUoMSk7Ci0JCW5hbWVkTmF0aXZlUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWROYXRpdmVRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZE5hdGl2ZVF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0SWRDbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IAotCQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJSWRDbGFzc1JlZmVyZW5jZSBpZENsYXNzUmVmID0gb3JtRW50aXR5LmdldElkQ2xhc3NSZWZlcmVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldElkQ2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCVN0cmluZyBub25FeGlzdGVudElkQ2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FICsgIi5Gb28iOwotCQllbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJU3RyaW5nIGV4aXN0ZW50SWRDbGFzc05hbWUgPSBQQUNLQUdFX05BTUUgKyAiLlRlc3RUeXBlSWQiOwotCQllbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKGV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXN0ZW50SWRDbGFzc05hbWUsIGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgIEBJZENsYXNzIHZhbHVlIHRvIG51bGwsIGlkLWNsYXNzIHRhZyBpcyBub3QgcmVtb3ZlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQkvL3Jlc2V0IEBJZENsYXNzIHZhbHVlIGFuZCB0aGVuIHJlbW92ZSBpZC1jbGFzcyB0YWcKLQkJZW50aXR5UmVzb3VyY2Uuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZSgibW9kZWwuRm9vIik7Ci0JCWVudGl0eVJlc291cmNlLnNldElkQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUlkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdElkQ2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSAKLQkJCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUlkQ2xhc3NSZWZlcmVuY2UgaWRDbGFzc1JlZiA9IG9ybUVudGl0eS5nZXRJZENsYXNzUmVmZXJlbmNlKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgbm9uRXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuRm9vIjsKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShub25FeGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhub25FeGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCVN0cmluZyBleGlzdGVudElkQ2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FICsgIi5UZXN0VHlwZUlkIjsKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShleGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXN0ZW50SWRDbGFzc05hbWUsIGVudGl0eVJlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpbWFyeUtleUNvbHVtbk5hbWVXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3VwZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1YlBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBzdWJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlzdXBlclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0UHJpbWFyeUtleUNvbHVtbk5hbWUoKSk7Ci0JCQotCQkoKE9ybUlkTWFwcGluZykgc3VwZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0lEIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBjaGlsZFhtbEVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKLQotCQkvL1RPRE8gb25jZSBidWcgMjI4NzE4IGlzIGZpeGVkCi0JCU9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IGNoaWxkWG1sRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIklEIik7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBjaGlsZFhtbEVudGl0eS5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWRDb25jcmV0ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQkKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvclZhbHVlSXNBbGxvd2VkQWJzdHJhY3RDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQkKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX0NISUxEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29uY3JldGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgY29uY3JldGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJCi0JCS8vdGFibGUtcGVyLWNsYXNzLCBubyBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbGxvd2VkCi0JCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGFic3RyYWN0RW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0KLQkJCi0JCS8vc2luZ2xlLXRhYmxlLCBkaXNjcmltaW5hdG9yIGNvbHVtbiBhbGxvd2VkIG9uIHJvb3QgZW50aXR5Ci0JCSgoSmF2YUVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3kobnVsbCk7Ci0JCWFzc2VydEZhbHNlKGNvbmNyZXRlRW50aXR5LnNwZWNpZmllZERpc2NyaW1pbmF0b3JDb2x1bW5Jc0FsbG93ZWQoKSk7Ci0JCWFzc2VydFRydWUoYWJzdHJhY3RFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFic3RyYWN0RW50aXR5R2V0RGVmYXVsdERpc2NyaW1pbmF0b3JDb2x1bW5OYW1lVGFibGVQZXJDbGFzc0luaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUFic3RyYWN0VGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29uY3JldGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKEVudGl0eSkgY29uY3JldGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKEVudGl0eSkgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MsIGFic3RyYWN0RW50aXR5LmdldERlZmF1bHRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQkKLQkJYXNzZXJ0VHJ1ZShhYnN0cmFjdEVudGl0eS5kaXNjcmltaW5hdG9yVmFsdWVJc1VuZGVmaW5lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29uY3JldGVFbnRpdHkuc3BlY2lmaWVkRGlzY3JpbWluYXRvckNvbHVtbklzQWxsb3dlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFRydWUoYWJzdHJhY3RFbnRpdHkuZGlzY3JpbWluYXRvclZhbHVlSXNVbmRlZmluZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXREZWZhdWx0RGlzY3JpbWluYXRvclZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKGNvbmNyZXRlRW50aXR5LmRpc2NyaW1pbmF0b3JWYWx1ZUlzVW5kZWZpbmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyYmFhNTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUdlbmVyYXRlZFZhbHVlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGVkVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1HZW5lcmF0ZWRWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpcHVibGljIGNsYXNzIE9ybUdlbmVyYXRlZFZhbHVlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1HZW5lcmF0ZWRWYWx1ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1HZW5lcmF0ZWRWYWx1ZSBvcm1HZW5lcmF0ZWRWYWx1ZSA9IG9ybUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQlYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJLy9zZXQgZ2VuZXJhdG9yIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLnNldEdlbmVyYXRvcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGdlbmVyYXRlZFZhbHVlUmVzb3VyY2UuZ2V0R2VuZXJhdG9yKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdlbmVyYXRlZFZhbHVlUmVzb3VyY2Uuc2V0R2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLmdldEdlbmVyYXRvcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1HZW5lcmF0ZWRWYWx1ZSBvcm1HZW5lcmF0ZWRWYWx1ZSA9IG9ybUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQlYbWxHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZVJlc291cmNlID0gaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUdlbmVyYXRlZFZhbHVlLnNldFNwZWNpZmllZEdlbmVyYXRvcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZ2VuZXJhdGVkVmFsdWVSZXNvdXJjZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUdlbmVyYXRlZFZhbHVlLnNldFNwZWNpZmllZEdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZVJlc291cmNlLmdldEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1HZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybUlkQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybUlkQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCUlkTWFwcGluZyBqYXZhSWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJR2VuZXJhdGVkVmFsdWUgamF2YUdlbmVyYXRlZFZhbHVlID0gamF2YUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlqYXZhR2VuZXJhdGVkVmFsdWUuc2V0U3BlY2lmaWVkR2VuZXJhdG9yKCJGb28iKTsKLQkJamF2YUdlbmVyYXRlZFZhbHVlLnNldFNwZWNpZmllZFN0cmF0ZWd5KEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3BlY2lmaWVkR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGphdmFHZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZFN0cmF0ZWd5KCkpOwotCQkKLQkJb3JtSWRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybUlkQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1JZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1JZEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLCBqYXZhR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7Ci0JCQotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9ybUlkQXR0cmlidXRlKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW9ybUlkQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCW9ybUlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybUlkQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgamF2YUdlbmVyYXRlZFZhbHVlLmdldFNwZWNpZmllZEdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFLCBqYXZhR2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1JZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YzlmYTEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybUlkTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRlZFZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRhYmxlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUlkTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtSWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4sIEpQQS5URU1QT1JBTCwgSlBBLlRFTVBPUkFMX1RZUEUsIEpQQS5HRU5FUkFURURfVkFMVUUsIEpQQS5HRU5FUkFUSU9OX1RZUEUsIEpQQS5UQUJMRV9HRU5FUkFUT1IsIEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneT1HZW5lcmF0aW9uVHlwZS5UQUJMRSwgZ2VuZXJhdG9yPVwibXlUYWJsZUdlbmVyYXRvclwiKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFRhYmxlR2VuZXJhdG9yKG5hbWU9XCJteVRhYmxlR2VuZXJhdG9yXCIsIHRhYmxlPVwibXlUYWJsZVwiLCBjYXRhbG9nPVwibXlDYXRhbG9nXCIsIHNjaGVtYT1cIm15U2NoZW1hXCIsIHBrQ29sdW1uTmFtZT1cIm15UGtDb2x1bW5OYW1lXCIsIHZhbHVlQ29sdW1uTmFtZT1cIm15VmFsdWVDb2x1bW5OYW1lXCIsIHBrQ29sdW1uVmFsdWU9XCJteVBrQ29sdW1uVmFsdWVcIiwgaW5pdGlhbFZhbHVlPTEsIGFsbG9jYXRpb25TaXplPTEpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cIm15U2VxdWVuY2VHZW5lcmF0b3JcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWRNYXBwaW5nIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWRNYXBwaW5nIiwgaWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlpZFJlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlpZFJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkTWFwcGluZyIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtSWRNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtSWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUlkTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWlkUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQotCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRVNUQU1QLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlpZFJlc291cmNlLnNldFRlbXBvcmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1JZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgaWRSZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSWRNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQkvL1RPRE8gdGVzdCBkZWZhdWx0cwotCS8vVE9ETyB0ZXN0IG92ZXJyaWRpbmcgamF2YSBtYXBwaW5nIHdpdGggYSBkaWZmZXJlbnQgbWFwcGluZyB0eXBlIGluIHhtbAotCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQotCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCQkJCi0JCS8vdHJ5IGFkZGluZyBhbm90aGVyIHNlcXVlbmNlIGdlbmVyYXRvciwgc2hvdWxkIGdldCBhbiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkJdHJ5IHsKLQkJCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGlkUmVzb3VyY2UuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCi0JCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5yZW1vdmVTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQotCQkvL3RyeSByZW1vdmluZyB0aGUgc2VxdWVuY2UgZ2VuZXJhdG9yIGFnYWluLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVNlcXVlbmNlR2VuZXJhdG9yKCk7CQkKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gbm90IHRocm93biIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZXF1ZW5jZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJaWRSZXNvdXJjZS5zZXRTZXF1ZW5jZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkJCQotCQlpZFJlc291cmNlLnNldFNlcXVlbmNlR2VuZXJhdG9yKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVGFibGVHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgdGFibGUgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLnJlbW92ZVRhYmxlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSB0YWJsZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkucmVtb3ZlVGFibGVHZW5lcmF0b3IoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYWJsZUdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkTWFwcGluZyIpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbElkIGlkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJaWRSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZUdlbmVyYXRvcigpKTsJCQotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSWRNYXBwaW5nLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEdlbmVyYXRvcnNTaXplKCkpOwotCQkKLQkJb3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0R2VuZXJhdG9yc1NpemUoKSk7Ci0KLQkJaWRSZXNvdXJjZS5zZXRUYWJsZUdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0VGFibGVHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUlkTWFwcGluZy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRHZW5lcmF0b3JzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkR2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZE1hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBpZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCi0JCW9ybUlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJCQkKLQkJLy90cnkgYWRkaW5nIGFub3RoZXIgc2VxdWVuY2UgZ2VuZXJhdG9yLCBzaG91bGQgZ2V0IGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotCQl0cnkgewotCQkJb3JtSWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIG5vdCB0aHJvd24iKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWFzc2VydE5vdE51bGwoaWRSZXNvdXJjZS5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0KLQkJb3JtSWRNYXBwaW5nLnJlbW92ZUdlbmVyYXRlZFZhbHVlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCi0JCS8vdHJ5IHJlbW92aW5nIHRoZSBzZXF1ZW5jZSBnZW5lcmF0b3IgYWdhaW4sIHNob3VsZCBnZXQgYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0JCXRyeSB7Ci0JCQlvcm1JZE1hcHBpbmcucmVtb3ZlR2VuZXJhdGVkVmFsdWUoKTsJCQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBub3QgdGhyb3duIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWRNYXBwaW5nIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgaWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGlkUmVzb3VyY2UuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCQotCQlpZFJlc291cmNlLnNldEdlbmVyYXRlZFZhbHVlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEdlbmVyYXRlZFZhbHVlKCkpOwotCQkJCQotCQlhc3NlcnROb3ROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCQkJCQotCQlpZFJlc291cmNlLnNldEdlbmVyYXRlZFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChpZFJlc291cmNlLmdldEdlbmVyYXRlZFZhbHVlKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1JZE1hcHBpbmcgb3JtSWRNYXBwaW5nID0gKE9ybUlkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUlkTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCkpOwotCi0JCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtSWRNYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0KLQkKLQkvL0BCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpCi0JLy9AQ29sdW1uKG5hbWU9Ik1ZX0NPTFVNTiIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCAKLQkvLyAgICBjb2x1bW5EZWZpbml0aW9uPSJDT0xVTU5fREVGSU5JVElPTiIsIHRhYmxlPSJNWV9UQUJMRSIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkvL0BDb2x1bW4oCi0JLy9ATG9iCi0JLy9AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkKLQkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiaWQiLCBpZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJQ29sdW1uIGNvbHVtbiA9IGlkTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDcpLCBjb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZSBnZW5lcmF0ZWRWYWx1ZSA9IGlkTWFwcGluZy5nZXRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlhc3NlcnRFcXVhbHMoIm15VGFibGVHZW5lcmF0b3IiLCBnZW5lcmF0ZWRWYWx1ZS5nZXRTcGVjaWZpZWRHZW5lcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5UQUJMRSwgZ2VuZXJhdGVkVmFsdWUuZ2V0U3BlY2lmaWVkU3RyYXRlZ3koKSk7Ci0KLS8vID4+PiBJJ20gZ29pbmcgdG8gYXJndWUgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhICJ2aXJ0dWFsIiBnZW5lcmF0b3IsCi0vLyBzaW5jZSBhIEphdmEgZ2VuZXJhdG9yIGlzICpub3QqIG92ZXJyaWRkZW4gd2hlbiBpdHMgSUQgbWFwcGluZyAob3IgZW50aXR5KQotLy8gaXMgb3ZlcnJpZGRlbiBpbiB0aGUgb3JtLnhtbCBmaWxlIC0gYm90aCB0aGUgb3JtLnhtbCBJRCBtYXBwaW5nIGFuZCB0aGUKLS8vIEphdmEgbWFwcGluZyBjYW4gZGVmaW5lIGFuICJhY3RpdmUiIGdlbmVyYXRvciBhcyBsb25nIGFzIHRoZXkgaGF2ZSBkaWZmZXJlbnQKLS8vIG5hbWVzICB+Ymp2Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IpOwotLy8JCWFzc2VydEVxdWFscygibXlUYWJsZUdlbmVyYXRvciIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVRhYmxlIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteUNhdGFsb2ciLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotLy8JCWFzc2VydEVxdWFscygibXlTY2hlbWEiLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVBrQ29sdW1uTmFtZSIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm15UGtDb2x1bW5WYWx1ZSIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVZhbHVlQ29sdW1uTmFtZSIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0KLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvcik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJteVNlcXVlbmNlR2VuZXJhdG9yIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1JZE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1JZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdGVkVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCkpOwotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRUYWJsZUdlbmVyYXRvcigpKTsKLQkJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1JZE1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQl9Ci0JCi0JLy8zIHRoaW5ncyB0ZXN0ZWQgYWJvdmUKLQkvLzEuIHZpcnR1YWwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZT1mYWxzZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIHRoZSBqYXZhIGFubm90YXRpb25zCi0JLy8yLiB2aXJ0dWFsIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGU9dHJ1ZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIGphdmEgZGVmYXVsdHMsYW5ub3RhdGlvbnMgaWdub3JlZAotCS8vMy4gc3BlY2lmaWVkIG1hcHBpbmcgKG1ldGFkYXRhIGNvbXBsZXRlPXRydWUvZmFsc2UgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSBqYXZhIGFubm90YXRpb25zCi0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElkTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9CQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0NjZhMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pbkNvbHVtblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybUpvaW5Db2x1bW5UZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQkJCi0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkJCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkJCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkJCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0Q29sdW1uRGVmaW5pdGlvbigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCB0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkKLQkJLy9zZXQgdGFibGUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFRhYmxlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRUcnVlKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7CQkKLQkJT3JtSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCVhtbEpvaW5Db2x1bW4gam9pbkNvbHVtblJlc291cmNlID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHRhYmxlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCB0YWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldE51bGxhYmxlKCkpOwotCQkKLQkJLy9zZXQgbnVsbGFibGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXROdWxsYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0JCi0JCS8vc2V0IG51bGxhYmxlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uUmVzb3VyY2UuZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQkvL3NldCBudWxsYWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldE51bGxhYmxlKCkpOwotCQkKLQkJLy9zZXQgbnVsbGFibGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TnVsbGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IHVwZGF0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFVwZGF0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkKLQkJLy9zZXQgdXBkYXRhYmxlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQkvL3NldCB1cGRhdGFibGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IHVwZGF0YWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldEluc2VydGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uUmVzb3VyY2UuZ2V0SW5zZXJ0YWJsZSgpKTsKLQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQlqb2luQ29sdW1uUmVzb3VyY2Uuc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkSW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJLy9zZXQgaW5zZXJ0YWJsZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwkJCi0JCU9ybUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlYbWxKb2luQ29sdW1uIGpvaW5Db2x1bW5SZXNvdXJjZSA9IGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IHVuaXF1ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJam9pbkNvbHVtblJlc291cmNlLnNldFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkKLQkJLy9zZXQgdW5pcXVlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW5SZXNvdXJjZS5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVbmlxdWUoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsJCQotCQlPcm1Kb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJWG1sSm9pbkNvbHVtbiBqb2luQ29sdW1uUmVzb3VyY2UgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKTsKLQotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5SZXNvdXJjZS5nZXRVbmlxdWUoKSk7Ci0JCQotCQkvL3NldCB1bmlxdWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Kb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtblJlc291cmNlLmdldFVuaXF1ZSgpKTsKLQkJCi0JCS8vc2V0IHVuaXF1ZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldFVuaXF1ZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtSm9pblRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzFmZDQ3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1Kb2luVGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uVmlydHVhbE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1Kb2luVGFibGVUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybUpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxQcm9qZWN0PiBwcm9qZWN0czsiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgUHJvamVjdCB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgcHJval9pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9Iik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRhcmdldEVudGl0eVdpdGhCYWNrUG9pbnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIFByb2plY3QgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHByb2pfaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShtYXBwZWRCeT1cInByb2plY3RzXCIiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248IiArIFRZUEVfTkFNRSArICI+IGVtcGxveWVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9Iik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb2plY3QuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCQotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7Ci0KLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWNyZWF0ZVRhcmdldEVudGl0eSgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUVfICsgIlByb2plY3QiKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0IiwgdmlydHVhbEpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0vL1RPRE8gbmVlZCB0byB0ZXN0IGpvaW5Db2x1bW4gZGVmYXVsdHMgaGVyZSBhcyB3ZWxsIGFzIGluIGphdmEgYW5kIGFsbCB0aGUgcmVsYXRpb3NoaXAgbWFwcGluZyB0eXBlcwotLy8JCWFzc2VydEVxdWFscygiaWRfcHJvamVjdF9pZCIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZF9wcm9qZWN0X2lkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZU9ybUpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotLy8JCWFzc2VydEVxdWFscygiaWRfcHJvamVjdF9pZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiaWRfcHJvamVjdF9pZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9IGphdmFNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGludmVyc2VKYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJJTlZFUlNFX05BTUUiKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlvcm1Kb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk5BTUUiLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFRF9OQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJaW52ZXJzZU9ybUpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInByb2plY3RzIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJY3JlYXRlVGFyZ2V0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHRhcmdldFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Qcm9qZWN0Iik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJCi0JCSgoSmF2YUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIHRydWUsIHdpbGwgaWdub3JlIGphdmEgYW5ub3RhdGlvbiBzZXR0aW5ncwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfUHJvamVjdCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGUgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCQkKLQkJamF2YU1hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJamF2YU1hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRV9OQU1FIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCSgoT3JtRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBUkdFVCIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX09STV9UQVJHRVQiLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGb28iKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCi0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0vLwkJWG1sRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlYbWxFbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQkKLS8vCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLS8vCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwotLy8JCXBhcmVudFhtbEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotLy8JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJWG1sRW50aXR5IHhtbEVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5qYXZhRW50aXR5KCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkpBVkFfU0NIRU1BIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJKQVZBX1NDSEVNQSIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotLy8JCS8veG1sIGVudGl0eSBub3cgaGFzIGEgdGFibGUgZWxlbWVudCBzbyBkZWZhdWx0IHNjaGVtYSBpcyBub3QgdGFrZW4gZnJvbSBqYXZhCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8KLS8vCQkKLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8KLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKG51bGwpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8JCWFzc2VydEVxdWFscygiSkFWQV9TQ0hFTUEiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IFNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueS5nZXRKb2luVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQltYW55VG9NYW55LmdldEpvaW5UYWJsZSgpLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Kb2luVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRm9vIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5GQUxTRSk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQotLy8JCXhtbEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotLy8JCWFzc2VydE51bGwoeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQkKLS8vCQl4bWxFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dOb0phdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJYXNzZXJ0TnVsbCh4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbVBhcmVudCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotLy8JCVhtbEVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoWG1sRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJWG1sRW50aXR5IGNoaWxkWG1sRW50aXR5ID0gKFhtbEVudGl0eSkgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0vLwkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwotLy8JCXBhcmVudFhtbEVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5KT0lORUQpOwotLy8JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJWG1sRW50aXR5IHhtbEVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJGT08iKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5lbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2coIkJBUiIpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkpBVkFfQ0FUQUxPRyIpOwotLy8JCWFzc2VydEVxdWFscygiSkFWQV9DQVRBTE9HIiwgeG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0vLwkJCi0vLwkJeG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotLy8JCS8veG1sIGVudGl0eSBub3cgaGFzIGEgdGFibGUgZWxlbWVudCBzbyBkZWZhdWx0IHNjaGVtYSBpcyBub3QgdGFrZW4gZnJvbSBqYXZhCi0vLwkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vCi0vLwkJCi0vLwkJeG1sRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8KLS8vCQl4bWxFbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZyhudWxsKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotLy8JCQotLy8JCXhtbEVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJKQVZBX0NBVEFMT0ciLCB4bWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLS8vfQotCi0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCVhtbEVudGl0eSB4bWxFbnRpdHkgPSAoWG1sRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sRW50aXR5LmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJLy9zZXQgY2xhc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0vLwkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCYXIiLCB4bWxFbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQllbnRpdHlSZXNvdXJjZS5zZXROYW1lKCJCYXoiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJheiIsIHhtbEVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCS8vc2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0vLwkJZW50aXR5UmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotLy8JCWFzc2VydEVxdWFscygiQmF6IiwgeG1sRW50aXR5LmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJZW50aXR5UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLS8vCQlhc3NlcnROdWxsKHhtbEVudGl0eS5nZXROYW1lKCkpOwotLy8JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1Kb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtSm9pblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtSm9pblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCi0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCVhtbEpvaW5UYWJsZSBqb2luVGFibGVSZXNvdXJjZSA9IG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1Kb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2UuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1Kb2luVGFibGUucmVtb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlvcm1Kb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEludmVyc2VKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtSm9pblRhYmxlLm1vdmVTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUpvaW5UYWJsZS5tb3ZlU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlPcm1Kb2luVGFibGUgb3JtSm9pblRhYmxlID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlYbWxKb2luVGFibGUgam9pblRhYmxlUmVzb3VyY2UgPSBtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpOwotCQkKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW9ybUpvaW5UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3JtSm9pblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCW9ybUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Kb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUpvaW5UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IGpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0KLQotCQlvcm1Kb2luVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCW1hbnlUb01hbnkuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJWG1sSm9pblRhYmxlIGpvaW5UYWJsZVJlc291cmNlID0gbWFueVRvTWFueS5nZXRKb2luVGFibGUoKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiRk9PIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgyLCAwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Kb2luVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB2aXJ0dWFsSm9pblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlqYXZhSm9pblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWphdmFKb2luVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJamF2YUpvaW5UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdmlydHVhbEpvaW5UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIHNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSAoKFZpcnR1YWxPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSB2aXJ0dWFsQXR0cmlidXRlKS5jb252ZXJ0VG9TcGVjaWZpZWQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygwLCAgc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJLy9qb2luVGFibGUgZGVmYXVsdCBuYW1lIGlzIG51bGwgYmVjYXVzZSB0YXJnZXRFbnRpdHkgaXMgbm90IGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0Ci0JCWFzc2VydE51bGwoam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyBqb2luIHRhYmxlIG5hbWUgaXMgW3RhYmxlIG5hbWVdX1t0YXJnZXQgdGFibGUgbmFtZV0KLQkJY3JlYXRlVGFyZ2V0RW50aXR5KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJvamVjdCIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9Qcm9qZWN0Iiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCi0JCS8vdGFyZ2V0IGVudGl0eSBkb2VzIG5vdCByZXNvbHZlLCBkZWZhdWx0IG5hbWUgaXMgbnVsbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkvL2RlZmF1bHQgdGFyZ2V0IGVudGl0eSBkb2VzIHJlc29sdmUsIHNvIGRlZmF1bHQgbmFtZSBpcyBhZ2FpbiBbdGFibGUgbmFtZV1fW3RhcmdldCB0YWJsZSBuYW1lXQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJLy9hZGQgdGhlIGpvaW4gdGFibGUgeG1sIGVsZW1lbnQsIHZlcmlmeSBkZWZhdWx0IGpvaW4gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX1Byb2plY3QiLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRKb2luVGFibGUoKSk7Ci0JCQotCQkvL3NldCBhIHRhYmxlIG9uIHRoZSB0YXJnZXQgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBqb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkvL3NldCBhIHRhYmxlIG9uIHRoZSBvd25pbmcgZW50aXR5LCB2ZXJ5IGRlZmF1bHQgam9pbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgam9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2pvaW5UYWJsZSBkZWZhdWx0IG5hbWUgaXMgbnVsbCBiZWNhdXNlIHRhcmdldEVudGl0eSBpcyBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL2FkZCB0YXJnZXQgZW50aXR5IHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0LCBqb2luIGNvbHVtbiBkZWZhdWx0IG5hbWUgYW5kIHJlZmVyZW5jZWQgY29sdW1uIHN0aWxsIG51bGwgYmVjYXVzZSBvd25pbmcgZW50aXR5IGhhcyBubyBwcmltYXJ5IGtleQotCQljcmVhdGVUYXJnZXRFbnRpdHkoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Qcm9qZWN0Iik7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vY3JlYXRlIHByaW1hcnkga2V5ICBpbiBvd25pbmcgZW50aXR5Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9zZXQgc3BlY2lmaWVkIGNvbHVtbiBuYW1lIG9uIHByaW1hcnkga2V5IGluIG93bmluZyBlbnRpdHkKLQkJKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSUQiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQkKLQkJLy90YXJnZXQgZW50aXR5IGRvZXMgbm90IHJlc29sdmUsIGludmVyc2Ugam9pbiBjb2x1bW4gbmFtZSBhbmQgcmVmZXJlbmNlZCBjb2x1bW4gbmFtZSBpcyBudWxsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL2RlZmF1bHQgdGFyZ2V0IGVudGl0eSBkb2VzIHJlc29sdmUsIHNvIGRlZmF1bHRzIGZvciBqb2luIGNvbHVtbiBhcmUgYmFjawotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vYWRkIHRoZSBqb2luIHRhYmxlIHhtbCBlbGVtZW50LCB2ZXJpZnkgZGVmYXVsdCBqb2luIGNvbHVtbiBkZWZhdWx0cyBhcmUgdGhlIHNhbWUKLQkJbWFueVRvTWFueS5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55LmdldEpvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5Db2x1bW5zQmlkaXJlY3Rpb25hbFJlbGF0aW9uc2hpcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vam9pblRhYmxlIGRlZmF1bHQgbmFtZSBpcyBudWxsIGJlY2F1c2UgdGFyZ2V0RW50aXR5IGlzIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vYWRkIHRhcmdldCBlbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGpvaW4gY29sdW1uIGRlZmF1bHQgbmFtZSBhbmQgcmVmZXJlbmNlZCBjb2x1bW4gc3RpbGwgbnVsbCBiZWNhdXNlIG93bmluZyBlbnRpdHkgaGFzIG5vIHByaW1hcnkga2V5Ci0JCWNyZWF0ZVRhcmdldEVudGl0eVdpdGhCYWNrUG9pbnRlcigpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByb2plY3QiKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9jcmVhdGUgcHJpbWFyeSBrZXkgIGluIG93bmluZyBlbnRpdHkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL3NldCBzcGVjaWZpZWQgY29sdW1uIG5hbWUgb24gcHJpbWFyeSBrZXkgaW4gb3duaW5nIGVudGl0eQotCQkoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9JRCIpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlc19NWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qZWN0c19wcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCQotCQkvL3RhcmdldCBlbnRpdHkgZG9lcyBub3QgcmVzb2x2ZSwgaW52ZXJzZSBqb2luIGNvbHVtbiBuYW1lIGFuZCByZWZlcmVuY2VkIGNvbHVtbiBuYW1lIGlzIG51bGwKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCS8vZGVmYXVsdCB0YXJnZXQgZW50aXR5IGRvZXMgcmVzb2x2ZSwgc28gZGVmYXVsdHMgZm9yIGpvaW4gY29sdW1uIGFyZSBiYWNrCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfTVlfSUQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicHJvamVjdHNfcHJval9pZCIsIGludmVyc2VKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9hZGQgdGhlIGpvaW4gdGFibGUgeG1sIGVsZW1lbnQsIHZlcmlmeSBkZWZhdWx0IGpvaW4gY29sdW1uIGRlZmF1bHRzIGFyZSB0aGUgc2FtZQotCQltYW55VG9NYW55LnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX01ZX0lEIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JRCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInByb2plY3RzX3Byb2pfaWQiLCBpbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9qX2lkIiwgaW52ZXJzZUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkuZ2V0Sm9pblRhYmxlKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzdhODUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5DYXNjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNBU0NBREVfVFlQRSwgSlBBLk9SREVSX0JZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygibWFueVRvTWFueU1hcHBpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlNYXBwaW5nIiwgbWFueVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbWFueVRvTWFueS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygibWFueVRvTWFueU1hcHBpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnlNYXBwaW5nIiwgbWFueVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG1hbnlUb01hbnkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueVJlc291cmNlLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0TWFwcGVkQnkoIm5ld01hcHBlZEJ5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCi0JCS8vc2V0bWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOwotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYW55VG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb01hbnlSZWxhdGlvbnNoaXAgcmVsID0gY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJbWFueVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQltYW55VG9NYW55LnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXROb01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0UGtNYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJCi0JCS8vc2V0IGN1c3RvbSBzcGVjaWZpZWQgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG9yZGVyQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnkuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JCi0JCS8vc2V0IG9yZGVyQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnkgbWFueVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoIm5ld09yZGVyQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5Iiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdPcmRlckJ5IiwgbWFueVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc05vT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Tm9PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0Tm9PcmRlcmluZyh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyBib29sZWFuIGlzT3JkZXJCeVBrKCkgewotLy8JCXJldHVybiAiIi5lcXVhbHMoZ2V0T3JkZXJCeSgpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5UGsoKSB7Ci0vLwkJc2V0T3JkZXJCeSgiIik7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDdXN0b21PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImZvbyIpOwotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9NYW55TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55Iik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFueVRvTWFueU1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueSIpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWZlcmVuY2VOYW1lIiwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW52ZXJzZU5hbWUiLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygibWFueVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnlNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueSIpOwotCQkKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotLy9UT0RPCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoSUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0TnVsbChzdGF0ZUZvb01hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2QyY2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASm9pbkNvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lPVwiTVlfUkVGRVJFTkNFRF9DT0xVTU5cIiwgdW5pcXVlPXRydWUsIG51bGxhYmxlPWZhbHNlLCBpbnNlcnRhYmxlPWZhbHNlLCB1cGRhdGFibGU9ZmFsc2UsIGNvbHVtbkRlZmluaXRpb249XCJDT0xVTU5fREVGSU5JVElPTlwiLCB0YWJsZT1cIk1ZX1RBQkxFXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVNYXBwaW5nIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZU1hcHBpbmciLCBtYW55VG9PbmUuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBtYW55VG9PbmUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9PbmUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJtYW55VG9PbmVNYXBwaW5nIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbnlUb09uZU1hcHBpbmciLCBtYW55VG9PbmUuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbWFueVRvT25lLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkKLQkJbWFueVRvT25lUmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZVJlc291cmNlLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvT25lUmVzb3VyY2Uuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCi0JCW1hbnlUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCi0JCS8vc2V0IG9wdGlvbmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZU1hcHBpbmciKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9PbmUgbWFueVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkKLQkJb3JtTWFueVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9PbmVNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJWG1sTWFueVRvT25lIG1hbnlUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBzdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtTWFueVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtTWFueVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvT25lTWFwcGluZyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE1hbnlUb09uZSBtYW55VG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJc3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJc3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9PbmVNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtTWFueVRvT25lTWFwcGluZy5pc09wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCi0JCQotCQlhc3NlcnRGYWxzZShzdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJLy9UT0RPIGRlZmF1bHQgam9pbkNvbHVtbnMKLQkJLy9hc3NlcnRUcnVlKG9ybU1hbnlUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkKLQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBtYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIGpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gbWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1NYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdE9wdGlvbmFsKCkpOwotCQkvL1RPRE8gaG1tLCBpcyB0aGlzIGNvcnJlY3Q/Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGluIHhtbCBvbmUtdG8tb25lCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtTWFueVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1NYW55VG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE1hbnlUb09uZSBtYXBwaW5nCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtTWFueVRvT25lTWFwcGluZy5kZWZhdWx0Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JLy8zIHRoaW5ncyB0ZXN0ZWQgYWJvdmUKLQkvLzEuIHZpcnR1YWwgbWFwcGluZyBtZXRhZGF0YSBjb21wbGV0ZT1mYWxzZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIHRoZSBqYXZhIGFubm90YXRpb25zCi0JLy8yLiB2aXJ0dWFsIG1hcHBpbmcgbWV0YWRhdGEgY29tcGxldGU9dHJ1ZSAtIGRlZmF1bHRzIGFyZSB0YWtlbiBmcm9tIGphdmEgZGVmYXVsdHMsYW5ub3RhdGlvbnMgaWdub3JlZAotCS8vMy4gc3BlY2lmaWVkIG1hcHBpbmcgKG1ldGFkYXRhIGNvbXBsZXRlPXRydWUvZmFsc2UgLSBkZWZhdWx0cyBhcmUgdGFrZW4gZnJvbSBqYXZhIGFubm90YXRpb25zCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NzhkYzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZENsYXNzUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdElkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlRlc3RUeXBlSWQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiVGVzdFR5cGVJZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKCJjb20uQmFyIik7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoImNvbS5CYXIiLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3MoImNvbS5CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjb20uQmFyIiwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscygiY29tLkJhciIsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENsYXNzTmFtZSgpKTsKLQl9Ci0JLy9UT0RPIGFkZCB0ZXN0cyBmb3Igc2V0dGluZyB0aGUgY2xhc3NOYW1lIHdoZW4gdGhlIHBhY2thZ2UgaXMgc2V0IG9uIGVudGl0eS1tYXBwaW5ncwotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0QWNjZXNzKCkpOwotCX0KLQkvL1RPRE8gdGVzdCBkZWZhdWx0IGFjY2VzcyBmcm9tCi0JCS8vdW5kZXJseWluZyBqYXZhCi0JCS8vcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cwotCQkvL2VudGl0eS1tYXBwaW5ncwotCQkvL3dpdGggeG1sLW1hcHBpbmctbWV0YWRhdGEtY29tcGxldGUgc2V0Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBvcm1NYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkKLQkJLy9zZXQgYWNjZXNzIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0TWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1NYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJb3JtTWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3Mgb3JtTWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTWFwcGVkU3VwZXJjbGFzcy5pc092ZXJyaWRlTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwob3JtTWFwcGVkU3VwZXJjbGFzcy5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShvcm1NYXBwZWRTdXBlcmNsYXNzLmlzT3ZlcnJpZGVNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYXBwZWRTdXBlcmNsYXNzLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9ybU1hcHBlZFN1cGVyY2xhc3MuaXNNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5LmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQl9Ci0JCQotCS8vdGVzdCB3aXRoIDIgTWFwcGVkU3VwZXJjbGFzc2VzLCBtYWtlIHRoZSBmaXJzdCBvbmUgYW4gRW50aXR5IHNvIGl0IGhhcyB0byBtb3ZlIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZU1hcHBlZFN1cGVyY2xhc3NFbnRpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW50aXR5LmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGVudGl0eS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldERpc2NyaW1pbmF0b3JWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVudGl0eS5nZXRDbGFzc18oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRUeXBlcy5uZXh0KCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VNYXBwZWRTdXBlcmNsYXNzRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQkKLQkJWG1sRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBlbWJlZGRhYmxlLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW1iZWRkYWJsZS5nZXRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBlbWJlZGRhYmxlLmdldEFjY2VzcygpKTsKLQkJCi0JCU9ybUVtYmVkZGFibGUgb3JtRW1iZWRkYWJsZSA9IChPcm1FbWJlZGRhYmxlKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIm1vZGVsLkZvbyIsIG9ybUVtYmVkZGFibGUuZ2V0Q2xhc3NfKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1FbWJlZGRhYmxlLmdldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQkvL3Rlc3Qgd2l0aCAyIE1hcHBlZFN1cGVyY2xhc3NlcywgbWFrZSB0aGUgZmlyc3Qgb25lIGFuIEVtYmVkZGFibGUgc28gaXQgaGFzIHRvIG1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAotCXB1YmxpYyB2b2lkIHRlc3RNYWtlTWFwcGVkU3VwZXJjbGFzc0VtYmVkZGFibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28yIik7Ci0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBtYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQltYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkKLQkJbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCVhtbEVtYmVkZGFibGUgZW1iZWRkYWJsZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygibW9kZWwuRm9vIiwgZW1iZWRkYWJsZS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVtYmVkZGFibGUuZ2V0TWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZW1iZWRkYWJsZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlPcm1FbWJlZGRhYmxlIG9ybUVtYmVkZGFibGUgPSAoT3JtRW1iZWRkYWJsZSkgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJtb2RlbC5Gb28iLCBvcm1FbWJlZGRhYmxlLmdldENsYXNzXygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtRW1iZWRkYWJsZS5nZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgbWFwcGVkU3VwZXJjbGFzc1BlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1QZXJzaXN0ZW50VHlwZT4gcGVyc2lzdGVudFR5cGVzID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudFR5cGVzLm5leHQoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50VHlwZXMubmV4dCgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWYgPSBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2Uuc2V0SWRDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCVN0cmluZyBub25FeGlzdGVudElkQ2xhc3NOYW1lID0gUEFDS0FHRV9OQU1FICsgIi5Gb28iOwotCQltYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpLnNldENsYXNzTmFtZShub25FeGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgZXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuVGVzdFR5cGVJZCI7Ci0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKGV4aXN0ZW50SWRDbGFzc05hbWUpOwotCQlhc3NlcnRFcXVhbHMoZXhpc3RlbnRJZENsYXNzTmFtZSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nICBASWRDbGFzcyB2YWx1ZSB0byBudWxsLCBpZC1jbGFzcyB0YWcgaXMgbm90IHJlbW92ZWQKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQkvL3Jlc2V0IEBJZENsYXNzIHZhbHVlIGFuZCB0aGVuIHJlbW92ZSBpZC1jbGFzcyB0YWcKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldElkQ2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuc2V0Q2xhc3NOYW1lKCJtb2RlbC5Gb28iKTsKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldElkQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RJZENsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCQotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlPcm1NYXBwZWRTdXBlcmNsYXNzIG9ybU1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlJZENsYXNzUmVmZXJlbmNlIGlkQ2xhc3NSZWYgPSBvcm1NYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKTsKLQkJCi0JCWFzc2VydE51bGwobWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldElkQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgbm9uRXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuRm9vIjsKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShub25FeGlzdGVudElkQ2xhc3NOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKG5vbkV4aXN0ZW50SWRDbGFzc05hbWUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRJZENsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobm9uRXhpc3RlbnRJZENsYXNzTmFtZSwgaWRDbGFzc1JlZi5nZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldElkQ2xhc3MoKSk7Ci0JCQotCQlTdHJpbmcgZXhpc3RlbnRJZENsYXNzTmFtZSA9IFBBQ0tBR0VfTkFNRSArICIuVGVzdFR5cGVJZCI7Ci0JCWlkQ2xhc3NSZWYuc2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoZXhpc3RlbnRJZENsYXNzTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhleGlzdGVudElkQ2xhc3NOYW1lLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGV4aXN0ZW50SWRDbGFzc05hbWUsIGlkQ2xhc3NSZWYuZ2V0U3BlY2lmaWVkSWRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoaWRDbGFzc1JlZi5nZXRJZENsYXNzKCkpOwotCQkKLQkJaWRDbGFzc1JlZi5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0SWRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzUmVmLmdldFNwZWNpZmllZElkQ2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGlkQ2xhc3NSZWYuZ2V0SWRDbGFzcygpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWJjYmUwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU5hbWVkTmF0aXZlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1RdWVyeUhpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTmFtZWROYXRpdmVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtTmFtZWROYXRpdmVRdWVyeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UXVlcnkoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UXVlcnkoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCi0JCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludC5zZXROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQyID0gb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApOwotCQlxdWVyeUhpbnQyLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVF1ZXJ5SGludCBxdWVyeUhpbnQzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDEpOwotCQlxdWVyeUhpbnQzLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IHF1ZXJ5SGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludDIsIHF1ZXJ5SGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludDMsIHF1ZXJ5SGludHMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHF1ZXJ5SGludCwgcXVlcnlIaW50cy5uZXh0KCkpOwotCQkKLQkJcXVlcnlIaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHF1ZXJ5SGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcXVlcnlIaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBxdWVyeUhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkZPTyIpOwotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQkKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZE5hdGl2ZVF1ZXJ5IG9ybU5hbWVkTmF0aXZlUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWROYXRpdmVRdWVyeSBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkTmF0aXZlUXVlcmllcygpLmdldCgwKTsKLQotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuYWRkSGludCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5hZGRIaW50KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5tb3ZlSGludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtTmFtZWROYXRpdmVRdWVyeS5tb3ZlSGludCgwLCAxKTsKLQkJaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxRdWVyeUhpbnQoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1RdWVyeUhpbnQ+IGhpbnRzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0JCQotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5tb3ZlKDIsIDApOwotCQloaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLm1vdmUoMCwgMSk7Ci0JCWhpbnRzID0gb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDEpOwotCQloaW50cyA9IG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnJlbW92ZSgxKTsKLQkJaGludHMgPSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtTmFtZWROYXRpdmVRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkTmF0aXZlUXVlcnkgb3JtTmFtZWROYXRpdmVRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkTmF0aXZlUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZE5hdGl2ZVF1ZXJ5IG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWROYXRpdmVRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU5hbWVkTmF0aXZlUXVlcnkuc2V0UmVzdWx0U2V0TWFwcGluZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UmVzdWx0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQluYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2Uuc2V0UmVzdWx0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkTmF0aXZlUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWROYXRpdmVRdWVyeSBvcm1OYW1lZE5hdGl2ZVF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkTmF0aXZlUXVlcnkgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZE5hdGl2ZVF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbmFtZWROYXRpdmVRdWVyeVJlc291cmNlLmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZE5hdGl2ZVF1ZXJ5UmVzb3VyY2UuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtTmFtZWROYXRpdmVRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1OYW1lZE5hdGl2ZVF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkTmF0aXZlUXVlcnlSZXNvdXJjZS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZE5hdGl2ZVF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtTmFtZWRRdWVyeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYzMxMjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU5hbWVkUXVlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxOYW1lZFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1OYW1lZFF1ZXJ5VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1OYW1lZFF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQluYW1lZFF1ZXJ5UmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU5hbWVkUXVlcnkuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5zZXRRdWVyeSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbmFtZWRRdWVyeVJlc291cmNlLnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRRdWVyeSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTmFtZWRRdWVyeS5zZXRRdWVyeSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1OYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0UXVlcnkoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1OYW1lZFF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeVJlc291cmNlLmdldFF1ZXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludCA9IG9ybU5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJcXVlcnlIaW50LnNldE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludDIgPSBvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCXF1ZXJ5SGludDIuc2V0TmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtUXVlcnlIaW50IHF1ZXJ5SGludDMgPSBvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCXF1ZXJ5SGludDMuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gcXVlcnlIaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MiwgcXVlcnlIaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50MywgcXVlcnlIaW50cy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocXVlcnlIaW50LCBxdWVyeUhpbnRzLm5leHQoKSk7Ci0JCQotCQlxdWVyeUhpbnRzID0gb3JtTmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVlcnlIaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBxdWVyeUhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHF1ZXJ5SGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1OYW1lZFF1ZXJ5IG9ybU5hbWVkUXVlcnkgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkKLQkJWG1sTmFtZWRRdWVyeSBuYW1lZFF1ZXJ5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQotCQlvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW9ybU5hbWVkUXVlcnkuYWRkSGludCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb3JtTmFtZWRRdWVyeS5hZGRIaW50KDIpLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCQotCQlvcm1OYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybU5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1OYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU5hbWVkUXVlcnkgb3JtTmFtZWRRdWVyeSA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQotCQlYbWxOYW1lZFF1ZXJ5IG5hbWVkUXVlcnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApOwotCi0JCW9ybU5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJb3JtTmFtZWRRdWVyeS5hZGRIaW50KDEpLnNldE5hbWUoIkJBUiIpOwotCQlvcm1OYW1lZFF1ZXJ5LmFkZEhpbnQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1OYW1lZFF1ZXJ5Lm1vdmVIaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtUXVlcnlIaW50PiBoaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1OYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDEpOwotCQloaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtTmFtZWRRdWVyeSBvcm1OYW1lZFF1ZXJ5ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCi0JCVhtbE5hbWVkUXVlcnkgbmFtZWRRdWVyeVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0KLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFF1ZXJ5SGludCgpKTsKLQkJCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVF1ZXJ5SGludD4gaGludHMgPSBvcm1OYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcnlSZXNvdXJjZS5nZXRIaW50cygpLm1vdmUoMiwgMCk7Ci0JCWhpbnRzID0gb3JtTmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkubW92ZSgwLCAxKTsKLQkJaGludHMgPSBvcm1OYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBoaW50cy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaGludHMuaGFzTmV4dCgpKTsKLQotCQluYW1lZFF1ZXJ5UmVzb3VyY2UuZ2V0SGludHMoKS5yZW1vdmUoMSk7Ci0JCWhpbnRzID0gb3JtTmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaGludHMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGhpbnRzLmhhc05leHQoKSk7Ci0KLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDEpOwotCQloaW50cyA9IG9ybU5hbWVkUXVlcnkuZ2V0SGludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGhpbnRzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShoaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJbmFtZWRRdWVyeVJlc291cmNlLmdldEhpbnRzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1OYW1lZFF1ZXJ5LmdldEhpbnRzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOWRkZjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDpvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFiYnI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5T25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNBU0NBREVfVFlQRSwgSlBBLk9SREVSX0JZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJCeShcImNpdHlcIiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueU1hcHBpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55TWFwcGluZyIsIG9uZVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9uZVRvTWFueS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueU1hcHBpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55TWFwcGluZyIsIG9uZVRvTWFueS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvbmVUb01hbnkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIm5ld1RhcmdldEVudGl0eSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgZW50aXR5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQlvbmVUb01hbnlSZXNvdXJjZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldG1hcHBlZEJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcHBlZEJ5IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlzdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibmV3TWFwcGVkQnkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdNYXBwZWRCeSIsIHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKG51bGwpOwotCQlhc3NlcnROdWxsKHN0cmF0ZWd5LmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcCByZWwgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT25lVG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlvbmVUb01hbnkuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0UGtNYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0Tm9NYXBLZXkodHJ1ZSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT3JkZXJCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQkJCQotCQkvL3NldCBvcmRlckJ5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuc2V0T3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQotCQkvL3NldCBvcmRlckJ5IHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueS5zZXRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0T3JkZXJCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgibmV3T3JkZXJCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld09yZGVyQnkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3T3JkZXJCeSIsIG9uZVRvTWFueS5nZXRPcmRlckJ5KCkpOwotCQotCQkvL3NldCBtYXBwZWRCeSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE9yZGVyQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc05vT3JkZXJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJmb28iKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkobnVsbCk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROb09yZGVyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXROb09yZGVyaW5nKHRydWUpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyBib29sZWFuIGlzT3JkZXJCeVBrKCkgewotLy8JCXJldHVybiAiIi5lcXVhbHMoZ2V0T3JkZXJCeSgpKTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCBzZXRPcmRlckJ5UGsoKSB7Ci0vLwkJc2V0T3JkZXJCeSgiIik7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNDdXN0b21PcmRlcmluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiZm9vIik7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KG51bGwpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoImludmVyc2VOYW1lIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJpbnZlcnNlUmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJjdXN0b21PcmRlciIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibWFwS2V5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlKb2luQ29sdW1uIGludmVyc2VKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJpbnZlcnNlTmFtZSIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiaW52ZXJzZVJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnlNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImN1c3RvbU9yZGVyIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJtYXBLZXkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiaW52ZXJzZU5hbWUiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoImludmVyc2VSZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb01hbnkiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInJlZmVyZW5jZU5hbWUiLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnZlcnNlTmFtZSIsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImludmVyc2VSZWZlcmVuY2VOYW1lIiwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9NYW55TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvTWFueSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlRhcmdldEVudGl0eSIsICgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueU1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiY3VzdG9tT3JkZXIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm1hcEtleSIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9NYW55Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0TnVsbChzdGF0ZUZvb01hcHBpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSB2aXJ0dWFsQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJT3JtT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCkuZ2V0TWFwcGluZygpOwotCQltYXBLZXlOYW1lcyA9IHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc0N1c3RvbU9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZGZlNzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvbmVUb09uZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvbmVUb09uZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvT25lLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvbmVUb09uZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb25lVG9PbmUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJuZXdUYXJnZXRFbnRpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldEVudGl0eSIsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGVudGl0eSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgibmV3VGFyZ2V0RW50aXR5Iik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0RW50aXR5Iiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdUYXJnZXRFbnRpdHkiLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBlbnRpdHkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQkJCQotCQkvL3NldCBmZXRjaCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZVJlc291cmNlLmdldEZldGNoKCkpOwotCQotCQlvbmVUb09uZVJlc291cmNlLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lUmVzb3VyY2UuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lLnNldE1hcHBlZEJ5KCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwoc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJLy9zZXQgbWFwcGVkQnkgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXN0cmF0ZWd5LnNldE1hcHBlZEJ5QXR0cmlidXRlKCJuZXdNYXBwZWRCeSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld01hcHBlZEJ5Iiwgc3RyYXRlZ3kuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TWFwcGVkQnkiLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkKLQkJLy9zZXQgbWFwcGVkQnkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzdHJhdGVneS5zZXRNYXBwZWRCeUF0dHJpYnV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzdHJhdGVneS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJCQkKLQkJLy9zZXQgb3B0aW9uYWwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0T3B0aW9uYWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQotCQlvbmVUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZVJlc291cmNlLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQkJCQotCQkvL3NldCBvcHRpb25hbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkKLQkJb3JtT25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQotCQkvL3NldCBvcHRpb25hbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZVJlc291cmNlLmdldE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IHN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCXN0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCXN0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IHN0cmF0ZWd5ID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCXN0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJc3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJc3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU9uZVRvT25lTWFwcGluZy5pc09wdGlvbmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJCi0JCWFzc2VydFRydWUob3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldEpvaW5Db2x1bW5zU2l6ZSgpID4gMCk7Ci0JCS8vVE9ETyBkZWZhdWx0IGpvaW5Db2x1bW5zCi0JCS8vYXNzZXJ0VHJ1ZShvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkuaGFzTmV4dCgpKTsKLQkKLQkKLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZE9wdGlvbmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VEX0NPTFVNTiIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgam9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT25lVG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBpbiB4bWwgb25lLXRvLW9uZQotLy8JCVhtbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJLy9UT0RPIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBpbiB4bWwKLQkJLy9hc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0Sm9pbkNvbHVtbnNTaXplKCkgPiAwKTsKLQkJCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBmb3Igc3BlY2lmaWVkIHhtbE9uZVRvT25lIG1hcHBpbmcKLS8vCQlYbWxKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSBvcm1PbmVUb09uZU1hcHBpbmcuZGVmYXVsdEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnROdWxsKG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZU1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJUYXJnZXRFbnRpdHkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgibWFwcGVkQnkiKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRBbGwodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UGVyc2lzdCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlbW92ZSh0cnVlKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgibmFtZSIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJyZWZlcmVuY2VOYW1lIik7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYXBwZWRCeSIsICgoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlRhcmdldEVudGl0eSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJtYXBwZWRCeSIpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRNZXJnZSh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVtb3ZlKHRydWUpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJuYW1lIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoInJlZmVyZW5jZU5hbWUiKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiVGFyZ2V0RW50aXR5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hcHBlZEJ5IiwgKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKCgoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoKChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T25lVG9PbmVNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJUYXJnZXRFbnRpdHkiLCAoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKCgoTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE1hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDYXNjYWRlKCkuaXNSZW1vdmUoKSk7Ci0JCQotCQlqb2luQ29sdW1uID0gKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygicmVmZXJlbmNlTmFtZSIsIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiVGFyZ2V0RW50aXR5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIm1hcHBlZEJ5Iik7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldE1lcmdlKHRydWUpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0UmVmcmVzaCh0cnVlKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIm5hbWUiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgicmVmZXJlbmNlTmFtZSIpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChJQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCQotCQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uID0gc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IHN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBzdHJhdGVneS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJc3RyYXRlZ3kucmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCXN0cmF0ZWd5LnJlbW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlzdHJhdGVneS5yZW1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQcmltYXJ5S2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBzdHJhdGVneSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJc3RyYXRlZ3kuYWRkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXN0cmF0ZWd5LmFkZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlzdHJhdGVneS5hZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtUHJpbWFyeUtleUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gc3RyYXRlZ3kuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJc3RyYXRlZ3kubW92ZVByaW1hcnlLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IHN0cmF0ZWd5LmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb09uZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvT25lUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9PbmVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0TnVsbChzdGF0ZUZvb01hcHBpbmcpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5MTI1ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2Uuc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVByaW1hcnlLZXlKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJCi0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKElNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJWG1sRW50aXR5IG9ybUVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuamF2YUVudGl0eSgpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1FbnRpdHkuZW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotLy8JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCi0vLwkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJb3JtRW50aXR5LmVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eSgpOwotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLS8vCQlYbWxFbnRpdHkgb3JtRW50aXR5ID0gKFhtbEVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0vLwkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShJTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCQlYbWxFbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKFhtbEVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChYbWxFbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJCi0vLwkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLS8vCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbiA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwocHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5zZXRDb2x1bW5EZWZpbml0aW9uKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1uUmVzb3VyY2UuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLnNldENvbHVtbkRlZmluaXRpb24oIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVByaW1hcnlLZXlKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5SZXNvdXJjZS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbiBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtblJlc291cmNlLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1RdWVyeUhpbnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTZkMTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVF1ZXJ5SGludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFF1ZXJ5SGludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtUXVlcnlIaW50VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1RdWVyeUhpbnRUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVF1ZXJ5SGludCBvcm1RdWVyeUhpbnQgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLmFkZEhpbnQoMCk7Ci0JCQotCQlYbWxRdWVyeUhpbnQgcXVlcnlIaW50UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldE5hbWVkUXVlcmllcygpLmdldCgwKS5nZXRIaW50cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlIaW50UmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1RdWVyeUhpbnQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgcXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlxdWVyeUhpbnRSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1RdWVyeUhpbnQgb3JtUXVlcnlIaW50ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5hZGRIaW50KDApOwotCQkKLQkJWG1sUXVlcnlIaW50IHF1ZXJ5SGludFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0SGludHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHF1ZXJ5SGludFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVF1ZXJ5SGludC5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIG9ybVF1ZXJ5SGludC5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBxdWVyeUhpbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUXVlcnlIaW50LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1RdWVyeUhpbnQgb3JtUXVlcnlIaW50ID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5hZGRIaW50KDApOwotCQkKLQkJWG1sUXVlcnlIaW50IHF1ZXJ5SGludFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCkuZ2V0SGludHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcXVlcnlIaW50UmVzb3VyY2Uuc2V0VmFsdWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtUXVlcnlIaW50LmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBxdWVyeUhpbnRSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlxdWVyeUhpbnRSZXNvdXJjZS5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUXVlcnlIaW50IG9ybVF1ZXJ5SGludCA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCkuYWRkSGludCgwKTsKLQkJCi0JCVhtbFF1ZXJ5SGludCBxdWVyeUhpbnRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldEhpbnRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocXVlcnlIaW50UmVzb3VyY2UuZ2V0VmFsdWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVF1ZXJ5SGludC5zZXRWYWx1ZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1RdWVyeUhpbnQuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHF1ZXJ5SGludFJlc291cmNlLmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUXVlcnlIaW50LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVF1ZXJ5SGludC5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChxdWVyeUhpbnRSZXNvdXJjZS5nZXRWYWx1ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YzI5YjIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlY29uZGFyeVRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5VW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhU2Vjb25kYXJ5VGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVByaW1hcnlLZXlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1TZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbFNlY29uZGFyeVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZWNvbmRhcnlUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybVNlY29uZGFyeVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1TZWNvbmRhcnlUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU2Vjb25kYXJ5VGFibGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJT3JtU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0KLQkJUmVhZE9ubHlTZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNlY29uZGFyeVRhYmxlc0FyZURlZmluZWRJblhtbCh0cnVlKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0U3BlY2lmaWVkU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkJCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTZWNvbmRhcnlUYWJsZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldFNjaGVtYSgiRk9PIik7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldFNjaGVtYSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5yZW1vdmVTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJCQVIiKTsKLQkJCi0JCU9ybVZpcnR1YWxTZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRWaXJ0dWFsU2Vjb25kYXJ5VGFibGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQkKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCi0JCQotCQlvcm1FbnRpdHkuc2V0U2Vjb25kYXJ5VGFibGVzQXJlRGVmaW5lZEluWG1sKHRydWUpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRPcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZE9ybUVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChwYXJlbnRPcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGNoaWxkT3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCXBhcmVudE9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydE51bGwocGFyZW50T3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjaGlsZE9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJcGFyZW50T3JtRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydE51bGwocGFyZW50T3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZE9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiSkFWQV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOyAvL3NjaGVtYSBpcyBub3QgZGVmYXVsdGVkIGZyb20gdW5kZXJseWluZyBqYXZhCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFNlY29uZGFyeVRhYmxlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCU9ybVNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgc2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApLmdldENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkucmVtb3ZlU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5zaXplKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlIGphdmFTZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCQotCQlPcm1WaXJ0dWFsU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0VmlydHVhbFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCQotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFaIik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTZWNvbmRhcnlUYWJsZXNBcmVEZWZpbmVkSW5YbWwodHJ1ZSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9ybUVudGl0eS5nZXRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydE51bGwob3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZSBqYXZhU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YVNlY29uZGFyeVRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkpBVkFfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybVNlY29uZGFyeVRhYmxlLmdldERlZmF1bHRDYXRhbG9nKCkpOyAvL3NjaGVtYSBpcyBub3QgZGVmYXVsdGVkIGZyb20gdW5kZXJseWluZyBqYXZhCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtU2Vjb25kYXJ5VGFibGUuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1TZWNvbmRhcnlUYWJsZS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJT3JtUHJpbWFyeUtleUpvaW5Db2x1bW4gcHJpbWFyeUtleUpvaW5Db2x1bW4gPSBvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uMiA9IG9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybVByaW1hcnlLZXlKb2luQ29sdW1uIHByaW1hcnlLZXlKb2luQ29sdW1uMyA9IG9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpOwotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMocHJpbWFyeUtleUpvaW5Db2x1bW4yLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHByaW1hcnlLZXlKb2luQ29sdW1uMywgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhwcmltYXJ5S2V5Sm9pbkNvbHVtbiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0KLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5yZW1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQkJb3JtU2Vjb25kYXJ5VGFibGUucmVtb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCi0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLm1vdmVTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVByaW1hcnlLZXlKb2luQ29sdW1uPiBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1TZWNvbmRhcnlUYWJsZS5tb3ZlU3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaW1hcnlLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1QcmltYXJ5S2V5Sm9pbkNvbHVtbj4gcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHByaW1hcnlLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJcHJpbWFyeUtleUpvaW5Db2x1bW5zID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0U3BlY2lmaWVkUHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBwcmltYXJ5S2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHByaW1hcnlLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UocHJpbWFyeUtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCXByaW1hcnlLZXlKb2luQ29sdW1ucyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcHJpbWFyeUtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShwcmltYXJ5S2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1TZWNvbmRhcnlUYWJsZS5nZXRTcGVjaWZpZWRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBvcm1TZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgIG9ybVNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybVNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUgPSBvcm1FbnRpdHkuYWRkU3BlY2lmaWVkU2Vjb25kYXJ5VGFibGUoMCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFNlY29uZGFyeVRhYmxlIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSBlbnRpdHlSZXNvdXJjZS5nZXRTZWNvbmRhcnlUYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1TZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5zaXplKCkpOwotCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW9ybVNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3JtU2Vjb25kYXJ5VGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybVNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmFkZFNwZWNpZmllZFNlY29uZGFyeVRhYmxlKDApOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxTZWNvbmRhcnlUYWJsZSBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0U2Vjb25kYXJ5VGFibGVzKCkuZ2V0KDApOwotCQkKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtU2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1TZWNvbmRhcnlUYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJb3JtU2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSBzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1TZWNvbmRhcnlUYWJsZSBvcm1TZWNvbmRhcnlUYWJsZSA9IG9ybUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sU2Vjb25kYXJ5VGFibGUgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFNlY29uZGFyeVRhYmxlcygpLmdldCgwKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVIiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1TZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhU2Vjb25kYXJ5VGFibGUgamF2YVNlY29uZGFyeVRhYmxlID0gamF2YUVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgpOwotCQlqYXZhU2Vjb25kYXJ5VGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiU0VDT05EQVJZIik7Ci0JCQotCQlSZWFkT25seVNlY29uZGFyeVRhYmxlIG9ybVNlY29uZGFyeVRhYmxlID0gb3JtRW50aXR5LmdldFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKG9ybVNlY29uZGFyeVRhYmxlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0KLQkJCi0JCWphdmFTZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCWphdmFTZWNvbmRhcnlUYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KCkuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0KLQkJTGlzdDxSZWFkT25seVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gQ29sbGVjdGlvblRvb2xzLmxpc3Qob3JtU2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB1bmlxdWVDb25zdHJhaW50cy5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLmdldCgwKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5nZXQoMSkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMuZ2V0KDIpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNlY29uZGFyeVRhYmxlc0FyZURlZmluZWRJblhtbCh0cnVlKTsKLQkJT3JtU2Vjb25kYXJ5VGFibGUgb3JtU2Vjb25kYXJ5VGFibGUyID0gb3JtRW50aXR5LmdldFNwZWNpZmllZFNlY29uZGFyeVRhYmxlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1TZWNvbmRhcnlUYWJsZTIuc2V0U3BlY2lmaWVkTmFtZSgiU0VDT05EQVJZIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIlNFQ09OREFSWSIsIG9ybVNlY29uZGFyeVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybVNlY29uZGFyeVRhYmxlMi5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1TZWNvbmRhcnlUYWJsZTIuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0NTI0OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxTZXF1ZW5jZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVNlcXVlbmNlR2VuZXJhdG9yVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRTZXF1ZW5jZU5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldFNlcXVlbmNlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2VxdWVuY2VOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTZXF1ZW5jZU5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2VxdWVuY2VOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gMSwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRJbml0aWFsVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQotCQkvL3NldCBpbml0aWFsIHZhbHVlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byA1MCwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA3ODNmNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1UYWJsZUdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVGFibGVHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcm1UYWJsZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtVGFibGVHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gMSwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCi0JCS8vc2V0IGluaXRpYWwgdmFsdWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRJbml0aWFsVmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkSW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBpbml0aWFsIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZigxMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQotCQkvL3NldCBpbml0aWFsIHZhbHVlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkSW5pdGlhbFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxMCksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byA1MCwgd2hpY2ggaGFwcGVucyB0byBiZSB0aGUgZGVmYXVsdCwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCi0JCS8vc2V0IGFsbG9jYXRpb24gc2l6ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgYWxsb2NhdGlvbiBzaXplIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDEwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTApLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEwKSwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MCksIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZSgpKTsKLQotCQkvL3NldCBhbGxvY2F0aW9uIHNpemUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRBbGxvY2F0aW9uU2l6ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldEFsbG9jYXRpb25TaXplKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZEFsbG9jYXRpb25TaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0VGFibGUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0U2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCQotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZFNjaGVtYSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGVHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5zZXRQa0NvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFBrQ29sdW1uTmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFBrQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRQa0NvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkUGtDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFZhbHVlQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0VmFsdWVDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkVmFsdWVDb2x1bW5OYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yLnNldFNwZWNpZmllZFZhbHVlQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLnNldFBrQ29sdW1uVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlR2VuZXJhdG9yLmdldFNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0UGtDb2x1bW5WYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFBrQ29sdW1uVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGVHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkUGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQl0YWJsZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRQa0NvbHVtblZhbHVlKCkpOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1UYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJSXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFRhYmxlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFRhYmxlR2VuZXJhdG9ycygpLmdldCgwKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQkKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRhYmxlR2VuZXJhdG9yIHRhYmxlR2VuZXJhdG9yID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRUYWJsZUdlbmVyYXRvcigwKTsJCQotCQlYbWxUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRUYWJsZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0KLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlUYWJsZUdlbmVyYXRvciB0YWJsZUdlbmVyYXRvciA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkVGFibGVHZW5lcmF0b3IoMCk7CQkKLQkJWG1sVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0VGFibGVHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkZPTyIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBUiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwotCi0JCQotCQlJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDIsIDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJdGFibGVHZW5lcmF0b3JSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvclJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzRnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgdmlydHVhbElkTWFwcGluZyA9IChJZE1hcHBpbmcpIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUphdmFJZE1hcHBpbmcgamF2YUlkTWFwcGluZyA9IChKYXZhSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhVGFibGVHZW5lcmF0b3IgamF2YVRhYmxlR2VuZXJhdG9yID0gamF2YUlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlqYXZhVGFibGVHZW5lcmF0b3Iuc2V0TmFtZSgiVEFCTEVfR0VORVJBVE9SIik7Ci0JCQotLy8gPj4+IEknbSBnb2luZyB0byBhcmd1ZSB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIGEgInZpcnR1YWwiIGdlbmVyYXRvciwKLS8vIHNpbmNlIGEgSmF2YSBnZW5lcmF0b3IgaXMgKm5vdCogb3ZlcnJpZGRlbiB3aGVuIGl0cyBJRCBtYXBwaW5nIChvciBlbnRpdHkpCi0vLyBpcyBvdmVycmlkZGVuIGluIHRoZSBvcm0ueG1sIGZpbGUgLSBib3RoIHRoZSBvcm0ueG1sIElEIG1hcHBpbmcgYW5kIHRoZQotLy8gSmF2YSBtYXBwaW5nIGNhbiBkZWZpbmUgYW4gImFjdGl2ZSIgZ2VuZXJhdG9yIGFzIGxvbmcgYXMgdGhleSBoYXZlIGRpZmZlcmVudAotLy8gbmFtZXMgIH5ianYKLQkJVGFibGVHZW5lcmF0b3IgdGFibGVHZW5lcmF0b3IgPSB2aXJ0dWFsSWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IpOwotLy8JCUl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotLy8JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhVGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgpLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQlqYXZhVGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqYXZhVGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgpLmFkZENvbHVtbk5hbWUoIkJBWiIpOwotCi0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IpOwotLy8JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGVHZW5lcmF0b3IuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotLy8JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIHZpcnR1YWxBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCkuZ2V0TWFwcGluZygpOwotCQotCQlPcm1UYWJsZUdlbmVyYXRvciBvcm1UYWJsZUdlbmVyYXRvcjIgPSBvcm1JZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJb3JtVGFibGVHZW5lcmF0b3IyLnNldE5hbWUoIlRBQkxFX0dFTkVSQVRPUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVRhYmxlR2VuZXJhdG9yMi5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1UYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOWQwNmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybVRhYmxlVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBPcm1UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtVGFibGUgb3JtVGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0TmFtZSgpKTsKLQotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJT3JtVGFibGUgb3JtVGFibGUgPSAoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldEphdmFUeXBlTWFwcGluZygpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tRW50aXR5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWROYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbVBhcmVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgcGFyZW50WG1sRW50aXR5ID0gKE9ybUVudGl0eSkgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FbnRpdHkgY2hpbGRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBjaGlsZE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJcGFyZW50WG1sRW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1UYWJsZSBvcm1UYWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuc2V0U2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IFNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwob3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCi0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYU5vSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdFNjaGVtYUZyb21QYXJlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGFyZW50T3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IHBhcmVudFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRW50aXR5IGNoaWxkWG1sRW50aXR5ID0gKE9ybUVudGl0eSkgY2hpbGRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHBhcmVudFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGNoaWxkWG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRTY2hlbWFGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0SmF2YVR5cGVNYXBwaW5nKCkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkpBVkFfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9TQ0hFTUEiLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQkvL3htbCBlbnRpdHkgbm93IGhhcyBhIHRhYmxlIGVsZW1lbnQgc28gZGVmYXVsdCBzY2hlbWEgaXMgbm90IHRha2VuIGZyb20gamF2YQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfU0NIRU1BIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1UYWJsZSBvcm1UYWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IFNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLnNldFRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRhYmxlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpLmdldENhdGFsb2coKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybVRhYmxlIG9ybVRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwob3JtVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlSZXNvdXJjZS5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldFRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0Q2F0YWxvZ0Zyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9ybUVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQotCQlvcm1FbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHRDYXRhbG9nTm9KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGFyZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHBhcmVudE9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBwYXJlbnRYbWxFbnRpdHkgPSAoT3JtRW50aXR5KSBwYXJlbnRPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVudGl0eSBjaGlsZFhtbEVudGl0eSA9IChPcm1FbnRpdHkpIGNoaWxkT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJcGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydE51bGwocGFyZW50WG1sRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY2hpbGRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQotCQlwYXJlbnRYbWxFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0TnVsbChwYXJlbnRYbWxFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChjaGlsZFhtbEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdENhdGFsb2dGcm9tUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRKYXZhVHlwZU1hcHBpbmcoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZENhdGFsb2coIkpBVkFfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ0FUQUxPRyIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQkvL3htbCBlbnRpdHkgbm93IGhhcyBhIHRhYmxlIGVsZW1lbnQgc28gZGVmYXVsdCBzY2hlbWEgaXMgbm90IHRha2VuIGZyb20gamF2YQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DQVRBTE9HIiwgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci19Ci0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoSU1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJWG1sRW50aXR5IG9ybUVudGl0eSA9IChYbWxFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLS8vCQlFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQkvL3NldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLS8vCQllbnRpdHlSZXNvdXJjZS5zZXRDbGFzc05hbWUoImNvbS5CYXIiKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJhciIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotLy8JCQotLy8JCWVudGl0eVJlc291cmNlLnNldE5hbWUoIkJheiIpOwotLy8JCWFzc2VydEVxdWFscygiQmF6Iiwgb3JtRW50aXR5LmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJLy9zZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLS8vCQllbnRpdHlSZXNvdXJjZS5zZXRDbGFzc05hbWUobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCYXoiLCBvcm1FbnRpdHkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQllbnRpdHlSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotLy8JCWFzc2VydE51bGwob3JtRW50aXR5LmdldE5hbWUoKSk7Ci0vLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGFibGUoKTsKLQkJZW50aXR5UmVzb3VyY2Uuc2V0VGFibGUodGFibGVSZXNvdXJjZSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUVudGl0eS5nZXRUYWJsZSgpLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpOwotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZSh0YWJsZVJlc291cmNlKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCAgb3JtRW50aXR5LmdldFRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1UYWJsZSB0YWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFRhYmxlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybVRhYmxlIHRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1UYWJsZSB0YWJsZSA9IG9ybUVudGl0eS5nZXRUYWJsZSgpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVGFibGUgdGFibGVSZXNvdXJjZSA9IGVudGl0eVJlc291cmNlLmdldFRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0KLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybVRhYmxlIHRhYmxlID0gb3JtRW50aXR5LmdldFRhYmxlKCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxUYWJsZSB0YWJsZVJlc291cmNlID0gZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSB0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJT3JtVGFibGUgdGFibGUgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFRhYmxlIHRhYmxlUmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpOwotCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZSh0YWJsZVJlc291cmNlKTsKLQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVIiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVoiKTsKLQotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGVSZXNvdXJjZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQl0YWJsZVJlc291cmNlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlUmVzb3VyY2UuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQotLy9UT0RPIG5vdCB5ZXQgc3VwcG9ydGluZyB1bmlxdWUgY29uc3RyaWFudHMgZnJvbSBqYXZhCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzKCkuYWRkT3JtUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0vLwkJCQkKLS8vCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1FbnRpdHkuZ2V0VGFibGUoKS51bmlxdWVDb25zdHJhaW50cygpOwotLy8JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0vLwotLy8JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0vLwkJamF2YUVudGl0eS5nZXRUYWJsZSgpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0vLwkJamF2YUVudGl0eS5nZXRUYWJsZSgpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0vLwkJamF2YUVudGl0eS5nZXRUYWJsZSgpLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0vLwkJCi0vLwkJCi0vLwkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gb3JtUmVzb3VyY2UoKS5nZXRFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotLy8JCWFzc2VydE51bGwoZW50aXR5UmVzb3VyY2UuZ2V0VGFibGUoKSk7Ci0vLwotLy8JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtRW50aXR5LmdldFRhYmxlKCkudW5pcXVlQ29uc3RyYWludHMoKTsKLS8vCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZXMoKS5uZXh0KCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVzKCkubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lcygpLm5leHQoKSk7Ci0vLwkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQllbnRpdHlSZXNvdXJjZS5zZXRUYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoMCwgIG9ybUVudGl0eS5nZXRUYWJsZSgpLnVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RFbnRpdHlHZXREZWZhdWx0TmFtZVRhYmxlUGVyQ2xhc3NJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVBYnN0cmFjdFRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWJzdHJhY3RQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBhYnN0cmFjdFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29uY3JldGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJT3JtRW50aXR5IGNvbmNyZXRlRW50aXR5ID0gKE9ybUVudGl0eSkgY29uY3JldGVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7CQkKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgYWJzdHJhY3RFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUywgY29uY3JldGVFbnRpdHkuZ2V0RGVmYXVsdEluaGVyaXRhbmNlU3RyYXRlZ3koKSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCS8vbWV0YS1kYXRhIGNvbXBsZXRlIHRydWUsIGluaGVyaXRhbmNlIHN0cmF0ZWd5IG5vIHNpbmdsZS10YWJsZQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwkKLQkJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlIiwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQkKLQkJLy9zZXQgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgdG8gdGFibGUtcGVyLWNsYXNzIGluIG9ybS54bWwKLQkJYWJzdHJhY3RFbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGFic3RyYWN0RW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBhYnN0cmFjdEVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYWJzdHJhY3RFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBjb25jcmV0ZUVudGl0eS5nZXRUYWJsZSgpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29uY3JldGVFbnRpdHkuZ2V0VGFibGUoKS5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbmNyZXRlRW50aXR5LmdldFRhYmxlKCkuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwODZmZjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxUcmFuc2llbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHJhbnNpZW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnRNYXBwaW5nIik7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmcgeG1sVHJhbnNpZW50bk1hcHBpbmcgPSAoT3JtVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFRyYW5zaWVudCB0cmFuc2llbnRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFRyYW5zaWVudHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB4bWxUcmFuc2llbnRuTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudE1hcHBpbmciLCB0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl0cmFuc2llbnRSZXNvdXJjZS5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHhtbFRyYW5zaWVudG5NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJdHJhbnNpZW50UmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh4bWxUcmFuc2llbnRuTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudE1hcHBpbmciKTsKLQkJT3JtVHJhbnNpZW50TWFwcGluZyB4bWxUcmFuc2llbnRuTWFwcGluZyA9IChPcm1UcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sVHJhbnNpZW50IHRyYW5zaWVudFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VHJhbnNpZW50cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygidHJhbnNpZW50TWFwcGluZyIsIHhtbFRyYW5zaWVudG5NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50TWFwcGluZyIsIHRyYW5zaWVudFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCXhtbFRyYW5zaWVudG5NYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgeG1sVHJhbnNpZW50bk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgdHJhbnNpZW50UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXhtbFRyYW5zaWVudG5NYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoeG1sVHJhbnNpZW50bk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0cmFuc2llbnRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1UcmFuc2llbnRNYXBwaW5nIG9ybVRyYW5zaWVudE1hcHBpbmcgPSAoT3JtVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybVRyYW5zaWVudE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JLy9AQmFzaWMoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlKQotCS8vQENvbHVtbihuYW1lPSJNWV9DT0xVTU4iLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgCi0JLy8gICAgY29sdW1uRGVmaW5pdGlvbj0iQ09MVU1OX0RFRklOSVRJT04iLCB0YWJsZT0iTVlfVEFCTEUiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JLy9AQ29sdW1uKAotCS8vQExvYgotCS8vQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApCi0JLy9ARW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHRyYW5zaWVudE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQotCQlPcm1UcmFuc2llbnRNYXBwaW5nIG9ybVRyYW5zaWVudE1hcHBpbmcgPSAoT3JtVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVHJhbnNpZW50TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybVRyYW5zaWVudE1hcHBpbmcgb3JtVHJhbnNpZW50TWFwcGluZyA9IChPcm1UcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1UcmFuc2llbnRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VHJhbnNpZW50TWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInRyYW5zaWVudCIpOwotCQkKLQkJVHJhbnNpZW50TWFwcGluZyB0cmFuc2llbnRNYXBwaW5nID0gKFRyYW5zaWVudE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh0cmFuc2llbnRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidHJhbnNpZW50Iik7Ci0JCQotCQlUcmFuc2llbnRNYXBwaW5nIHRyYW5zaWVudE1hcHBpbmcgPSAoVHJhbnNpZW50TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHRyYW5zaWVudE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0cmFuc2llbnQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNpZW50TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zaWVudCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUcmFuc2llbnRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVRyYW5zaWVudE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ0cmFuc2llbnQiKTsKLQkJCi0JCVRyYW5zaWVudE1hcHBpbmcgdHJhbnNpZW50TWFwcGluZyA9IChUcmFuc2llbnRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodHJhbnNpZW50TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidHJhbnNpZW50Iiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhN2EyZDIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL09ybVZlcnNpb25NYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JtVmVyc2lvbk1hcHBpbmdUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIE9ybVZlcnNpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBKUEEuQ09MVU1OLCBKUEEuVEVNUE9SQUwsIEpQQS5URU1QT1JBTF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbHVtbihuYW1lPVwiTVlfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiLCBsZW5ndGg9NSwgcHJlY2lzaW9uPTYsIHNjYWxlPTcpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uTWFwcGluZyIpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFZlcnNpb24gdmVyc2lvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInZlcnNpb25NYXBwaW5nIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uTWFwcGluZyIsIHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbk1hcHBpbmciKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uTWFwcGluZyIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbk1hcHBpbmciLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtVmVyc2lvbk1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCB2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbk1hcHBpbmciKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXZlcnNpb25SZXNvdXJjZS5zZXRUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl2ZXJzaW9uUmVzb3VyY2Uuc2V0VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbk1hcHBpbmciKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIHZlcnNpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKHZlcnNpb25SZXNvdXJjZS5nZXRUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0KLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgdmVyc2lvblJlc291cmNlLmdldFRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uUmVzb3VyY2UuZ2V0VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JLy9UT0RPIHRlc3QgZGVmYXVsdHMKLQkvL1RPRE8gdGVzdCBvdmVycmlkaW5nIGphdmEgbWFwcGluZyB3aXRoIGEgZGlmZmVyZW50IG1hcHBpbmcgdHlwZSBpbiB4bWwKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybVZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQotCQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IG9ybVZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCX0KLQkKLQkvL0BCYXNpYyhmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UpCi0JLy9AQ29sdW1uKG5hbWU9Ik1ZX0NPTFVNTiIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCAKLQkvLyAgICBjb2x1bW5EZWZpbml0aW9uPSJDT0xVTU5fREVGSU5JVElPTiIsIHRhYmxlPSJNWV9UQUJMRSIsIGxlbmd0aD01LCBwcmVjaXNpb249Niwgc2NhbGU9NykiKTsKLQkvL0BDb2x1bW4oCi0JLy9ATG9iCi0JLy9AVGVtcG9yYWwoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCkKLQkvL0BFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZlcnNpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbENvbnZlcnRlci5jbGFzcywgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlDb2x1bW4gY29sdW1uID0gdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ09MVU1OIiwgY29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIGNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig2KSwgY29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgY29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCU9ybUNvbHVtbiBvcm1Db2x1bW4gPSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgb3JtQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybVZlcnNpb25NYXBwaW5nIG9ybVZlcnNpb25NYXBwaW5nID0gKE9ybVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1WZXJzaW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7Ci0JCQotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygidmVyc2lvbiIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uTW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoInZlcnNpb24iLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmVyc2lvbk1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlWZXJzaW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJ2ZXJzaW9uIik7Ci0KLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5VmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAidmVyc2lvbiIpOwotCQkKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZlcnNpb25Nb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVZlcnNpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInZlcnNpb24iKTsKLQkJCi0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2ZXJzaW9uIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vT3JtWG1sVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1YbWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2JiOTFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9Pcm1YbWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eU1hcHBpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9ybVhtbFRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgT3JtWG1sVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLnNldE5hbWUoImZvbyIpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVhtbCBnZXRPcm1YbWwoKSB7Ci0JCXJldHVybiAoT3JtWG1sKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZVJlZnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWRkRW50aXR5TWFwcGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlc1NpemUoKSk7Ci0JCUpwYVhtbFJlc291cmNlIG9ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJb3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlvcm1SZXNvdXJjZS5zYXZlKG51bGwpOwotCQkKLQkJLy90aGUgQ29udGVudFR5cGUgb2YgdGhlIG9ybS54bWwgZmlsZSBpcyBubyBsb25nZXIgb3JtLCBzbyB0aGUganBhIGZpbGUgaXMgcmVtb3ZlZAotCQlhc3NlcnROdWxsKGdldE9ybVhtbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlc1NpemUoKSk7IC8vc2hvdWxkIG9ubHkgYmUgdGhlIHBlcnNpc3RlbmNlLnhtbCBmaWxlCi0JCQotCQlYbWxFbnRpdHlNYXBwaW5ncyB4bWxFbnRpdHlNYXBwaW5ncyA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCXhtbEVudGl0eU1hcHBpbmdzLnNldFZlcnNpb24oIjEuMCIpOwotCQlvcm1SZXNvdXJjZS5nZXRDb250ZW50cygpLmFkZCh4bWxFbnRpdHlNYXBwaW5ncyk7Ci0JCW9ybVJlc291cmNlLnNhdmUobnVsbCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGdldE9ybVhtbCgpLmdldFJvb3QoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVtb3ZlRW50aXR5TWFwcGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2Ugb3JtUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChnZXRPcm1YbWwoKS5nZXRSb290KCkpOwotCQkKLQkJb3JtUmVzb3VyY2UuZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlhc3NlcnROdWxsKGdldE9ybVhtbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNlMjVjMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlyZXR1cm4gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEoImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKCJhc2RmIik7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTY2hlbWEzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXRhbG9nMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2coIk1ZX0NBVEFMT0ciKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DQVRBTE9HIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyB0YWcgbm90IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZVBlcnNpc3QzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmQ2YzhjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzQWxsRmVhdHVyZXNVbnNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7CQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydEZhbHNlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlMigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWZUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2xhc3NSZWZUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzRiMTg5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0NsYXNzUmVmVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbEphdmFDbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDbGFzc1JlZlRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgQ2xhc3NSZWZUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNsYXNzTmFtZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgY2xhc3MgcmVmCi0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBjbGFzcyBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjbGFzcyBuYW1lIHRvIGRpZmZlcmVudCBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmJhci5Gb28iKTsKLQkJCi0JCWNsYXNzUmVmID0gcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjbGFzcyBuYW1lIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoIiIpOwotCQkKLQkJY2xhc3NSZWYgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgYmFjayB0byBub24gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJCi0JCWNsYXNzUmVmID0gcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNsYXNzTmFtZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgY2xhc3MgcmVmCi0JCVhtbEphdmFDbGFzc1JlZiB4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBjbGFzcyBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2xhc3MgbmFtZSB0byBkaWZmZXJlbnQgbmFtZSwgdGVzdCBlcXVhbGl0eQotCQljbGFzc1JlZi5zZXRDbGFzc05hbWUoImNvbS5iYXIuRm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjbGFzcyBuYW1lIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQljbGFzc1JlZi5zZXRDbGFzc05hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGNsYXNzUmVmLmdldENsYXNzTmFtZSgpLCB4bWxDbGFzc1JlZi5nZXRKYXZhQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgY2xhc3MgbmFtZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCWNsYXNzUmVmLnNldENsYXNzTmFtZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhjbGFzc1JlZi5nZXRDbGFzc05hbWUoKSwgeG1sQ2xhc3NSZWYuZ2V0SmF2YUNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQljbGFzc1JlZi5zZXRDbGFzc05hbWUoImNvbS5mb28uQmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoY2xhc3NSZWYuZ2V0Q2xhc3NOYW1lKCksIHhtbENsYXNzUmVmLmdldEphdmFDbGFzcygpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCQotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJCi0JCUNsYXNzUmVmIGNsYXNzUmVmID0gZ2V0U3BlY2lmaWVkQ2xhc3NSZWYoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgdG8gYSBjbGFzcyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBwcm9qZWN0Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXIiKTsKLQkJCi0JCWNsYXNzUmVmID0gZ2V0U3BlY2lmaWVkQ2xhc3NSZWYoKTsJCQotCQlhc3NlcnROdWxsKGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpKTsJCQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjQ1NmFkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0Q29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSb290Q29udGV4dE5vZGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQZXJzaXN0ZW5jZVhtbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBlcnNpc3RlbmNlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGVyc2lzdGVuY2VVbml0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwcGluZ0ZpbGVSZWZUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDbGFzc1JlZlRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQlwcml2YXRlIEpwdENvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZlRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9NYXBwaW5nRmlsZVJlZlRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODEwOTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvTWFwcGluZ0ZpbGVSZWZUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCi0gKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBwaW5nRmlsZVJlZlRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgTWFwcGluZ0ZpbGVSZWZUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmKCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVGaWxlTmFtZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgbWFwcGluZyBmaWxlIHJlZgotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxGaWxlUmVmLnNldEZpbGVOYW1lKCJmb28ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sRmlsZVJlZik7Ci0JCU1hcHBpbmdGaWxlUmVmIGZpbGVSZWYgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgZmlsZSBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyhmaWxlUmVmLmdldEZpbGVOYW1lKCksIHhtbEZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHRvIGRpZmZlcmVudCBmaWxlIG5hbWUsIHRlc3QgZXF1YWxpdHkKLQkJeG1sRmlsZVJlZi5zZXRGaWxlTmFtZSgiYmFyLnhtbCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbEZpbGVSZWYuc2V0RmlsZU5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxGaWxlUmVmLnNldEZpbGVOYW1lKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZpbGVSZWYuZ2V0RmlsZU5hbWUoKSwgeG1sRmlsZVJlZi5nZXRGaWxlTmFtZSgpKTsKLQkJCi0JCS8vIHNldCBmaWxlIG5hbWUgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxGaWxlUmVmLnNldEZpbGVOYW1lKCJiYXoueG1sIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RmlsZU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIG1hcHBpbmcgZmlsZSByZWYKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sRmlsZVJlZi5zZXRGaWxlTmFtZSgiZm9vLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbEZpbGVSZWYpOwotCQlNYXBwaW5nRmlsZVJlZiBmaWxlUmVmID0gcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IGZpbGUgbmFtZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgdG8gZGlmZmVyZW50IGZpbGUgbmFtZSwgdGVzdCBlcXVhbGl0eQotCQlmaWxlUmVmLnNldEZpbGVOYW1lKCJiYXIueG1sIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJLy8gc2V0IGZpbGUgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJZmlsZVJlZi5zZXRGaWxlTmFtZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJLy8gc2V0IGZpbGUgbmFtZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCWZpbGVSZWYuc2V0RmlsZU5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmlsZVJlZi5nZXRGaWxlTmFtZSgpLCB4bWxGaWxlUmVmLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJLy8gc2V0IGZpbGUgbmFtZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCWZpbGVSZWYuc2V0RmlsZU5hbWUoImJhei54bWwiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmaWxlUmVmLmdldEZpbGVOYW1lKCksIHhtbEZpbGVSZWYuZ2V0RmlsZU5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzY1NWVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VUZXN0cyBleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIFBlcnNpc3RlbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSgpIHsKLQkJcmV0dXJuIGdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFkZFBlcnNpc3RlbmNlVW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IGdldFhtbFBlcnNpc3RlbmNlKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCQkKLQkJLy8gY2xlYXIgeG1sIHBlcnNpc3RlbmNlIHVuaXRzLCB0ZXN0IHRoYXQgaXQncyBjbGVhciBpbiBjb250ZXh0Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5jbGVhcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gYWRkIHhtbCBwZXJzaXN0ZW5jZSB1bml0LCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byBjb250ZXh0Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgidGVzdCIpOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgYW5vdGhlciwgdGVzdCB0aGF0IGl0ICppc24ndCogYWRkIHRvIGNvbnRleHQKLQkJeG1sUGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoInRlc3QyIik7Ci0JCXhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5hZGQoeG1sUGVyc2lzdGVuY2VVbml0KTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFkZFBlcnNpc3RlbmNVbml0KCkgewotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IGdldFhtbFBlcnNpc3RlbmNlKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gcGVyc2lzdGVuY2UoKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBwZXJzaXN0ZW5jZSB1bml0cywgdGVzdCB0aGF0IGl0J3MgY2xlYXIgaW4gY29udGV4dAotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuY2xlYXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gYWRkIHBlcnNpc3RlbmNlIHVuaXQsIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIHJlc291cmNlCi0JCXBlcnNpc3RlbmNlLmFkZFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIsIHRlc3QgdGhhdCB3ZSBnZXQgYW4gZXhjZXB0aW9uCi0JCWJvb2xlYW4gZXhjZXB0aW9uID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlwZXJzaXN0ZW5jZS5hZGRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCWV4Y2VwdGlvbiA9IHRydWU7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoZXhjZXB0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVJlbW92ZVBlcnNpc3RlbmNlVW5pdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IGdldFhtbFBlcnNpc3RlbmNlKCk7Ci0JCVBlcnNpc3RlbmNlIHBlcnNpc3RlbmNlID0gZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS5nZXRQZXJzaXN0ZW5jZSgpOwotCQkKLQkJLy8gYWRkIGEgcGVyc2lzdGVuY2UgdW5pdCBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgeG1sIGFuZCAKLQkJLy8gb25lIGNvbnRleHQgcGVyc2lzdGVuY2UgdW5pdAotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUoInRlc3QiKTsKLQkJeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmFkZCh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgcGVyc2lzdGVuY2UgdW5pdCBmcm9tIHhtbCwgdGVzdCB0aGF0IGNvbnRleHQgcmVtYWlucyB1bmNoYW5nZWQKLQkJeG1sUGVyc2lzdGVuY2VVbml0ID0geG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLmdldCgwKTsKLQkJeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnJlbW92ZSh4bWxQZXJzaXN0ZW5jZVVuaXQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5vdGhlciBvbmUgZnJvbSB4bWwsIHRleHQgdGhhdCBpdCdzIG5vdyByZW1vdmVkIGZyb20gY29udGV4dAotCQl4bWxQZXJzaXN0ZW5jZVVuaXQgPSB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuZ2V0KDApOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkucmVtb3ZlKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlbW92ZVBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSBnZXRYbWxQZXJzaXN0ZW5jZSgpOwotCQlQZXJzaXN0ZW5jZSBwZXJzaXN0ZW5jZSA9IHBlcnNpc3RlbmNlKCk7Ci0JCQotCQkvLyBhZGQgYSBwZXJzaXN0ZW5jZSB1bml0IGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyB4bWwgYW5kIAotCQkvLyBvbmUgY29udGV4dCBwZXJzaXN0ZW5jZSB1bml0Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgidGVzdCIpOwotCQl4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuYWRkKHhtbFBlcnNpc3RlbmNlVW5pdCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBwZXJzaXN0ZW5jZSB1bml0LCB0ZXN0IHRoYXQgaXQncyByZW1vdmVkIGZyb20gcmVzb3VyY2UgYW5kIHRoYXQKLQkJLy8gYSAqbmV3KiBwZXJzaXN0ZW5jZSB1bml0IHJlcHJlc2VudGluZyB0aGUgcHJldmlvdXNseSB1bnJlcHJlc2VudGVkIG9uZQotCQkvLyBpcyBwcmVzZW50Ci0JCXBlcnNpc3RlbmNlLnJlbW92ZVBlcnNpc3RlbmNlVW5pdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIG5ldyBwZXJzaXN0ZW5jZSB1bml0LCB0ZXN0IHRoYXQgaXQncyByZW1vdmVkIGZyb20gcmVzb3VyY2UgYW5kIAotCQkvLyBjb250ZXh0Ci0JCXBlcnNpc3RlbmNlLnJlbW92ZVBlcnNpc3RlbmNlVW5pdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHNTaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjRkMDM1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLkxpc3RWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sRW51bVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLS8qKgotICogIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgUHJvcGVydHlDaGFuZ2VFdmVudCBwcm9wZXJ0eUNoYW5nZWRFdmVudDsKLQotCXByb3RlY3RlZCBpbnQgcHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudDsKLQotCXByb3RlY3RlZCBpbnQgcHJvcGVydGllc1RvdGFsOwotCi0JcHJvdGVjdGVkIGludCBtb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0KLQlwcm90ZWN0ZWQgaW50IG1vZGVsUHJvcGVydGllc1NpemU7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkvLyAqKioqKiogYWJzdHJhY3QgbWV0aG9kcyAqKioqKioqCi0JcHJvdGVjdGVkIGFic3RyYWN0IFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwb3B1bGF0ZVB1KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBtb2RlbCdzIHByb3BlcnR5IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHByb3BlcnR5TmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGdldAotCSAqIEB0aHJvd3MgRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBTZXRzIHRoZSBtb2RlbCdzIHByb3BlcnR5IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHByb3BlcnR5TmFtZS4KLQkgKiBVc2VkIGluIHZlcmlmeVNldFByb3BlcnR5KCkKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGJlIHNldAotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgdmFsdWUgb2YgcHJvcGVydHkKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbjsKLQotCQotCS8vICoqKioqKiBjb252ZW5pZW5jZSB0ZXN0IG1ldGhvZHMgKioqKioqKgotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQkvL1RPRE8geWVzLCBJIGtub3csIGFuIGluc3RhbmNlb2YgY2hlY2ssIHRoaXMgaXMgYSBMT1Qgb2Ygd29yayB0byBnZXQgcmlkIG9mIGluIHRoZSB0ZXN0cwotCQlpZiAodmFsdWUgaW5zdGFuY2VvZiBQZXJzaXN0ZW5jZVhtbEVudW1WYWx1ZSkgewotCQkJcmV0dXJuICgoUGVyc2lzdGVuY2VYbWxFbnVtVmFsdWUpIHZhbHVlKS5nZXRQcm9wZXJ0eVZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIDxFPiBFIGdldEZpcnN0RWxlbWVudChJdGVyYXRvcjxFPiBpdGVyYXRvcikgewotCQlpZihpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBpdGVyYXRvci5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHV0IGludG8gcGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMuIERvIG5vdCBhbGxvd3MgdG8gcHV0IGR1cGxpY2F0ZSBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IC0KLQkgKiAgICAgICAgICAgIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gdmFsdWUgLQotCSAqICAgICAgICAgICAgcHJvcGVydHkgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIGtleSwgdmFsdWUsIGZhbHNlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU3RyaW5nIGtleSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGFsbG93RHVwbGljYXRlcykgewotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSBrZXkgY2Fubm90IGJlIG51bGwiKTsKLQkJfQotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXRoaXMuc2V0TnVsbFByb3BlcnR5KGtleSk7Ci0JCWVsc2UKLQkJCXRoaXMucHV0UHJvcGVydHlfKGtleSwgdmFsdWUsIGFsbG93RHVwbGljYXRlcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1dFByb3BlcnR5XyhTdHJpbmcgcHVLZXksIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiBhbGxvd0R1cGxpY2F0ZXMpIHsKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkocHVLZXksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHZhbHVlKSwgYWxsb3dEdXBsaWNhdGVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROdWxsUHJvcGVydHkoU3RyaW5nIHB1S2V5KSB7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KHB1S2V5LCBudWxsLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJFdmVudCgpIHsKLQkJdGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudCA9IDA7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHRocm93TWlzc2luZ0RlZmluaXRpb24oU3RyaW5nIG1ldGhvZE5hbWUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbigiTWlzc2luZyBEZWZpbml0aW9uIGZvcjogIiArIG1ldGhvZE5hbWUgKyAiKCAiICsgcHJvcGVydHlOYW1lICsgIikiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKExpc3RFdmVudCBlKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlLmdldExpc3ROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS50aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50ID0gZXZlbnQ7Ci0JCQkJUGVyc2lzdGVuY2VVbml0VGVzdENhc2UudGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudENvdW50Kys7Ci0JCQl9Ci0JCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkJcmV0dXJuICJQZXJzaXN0ZW5jZVVuaXQgbGlzdGVuZXIiOwotCQkJfQotCQl9OwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZnkgaWYgdGhlIHByb3BlcnR5IGV4aXN0cyBpbiB0aGUgcGVzaXN0ZW5jZS54bWwKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9wZXJ0eUV4aXN0cyhTdHJpbmcgcHVQcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVQcm9wZXJ0eU5hbWUpICE9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvcGVydHlWYWx1ZUVxdWFscyhTdHJpbmcgcHVQcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXJldHVybiB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1UHJvcGVydHlOYW1lKS5nZXRWYWx1ZSgpLmVxdWFscyhwcm9wZXJ0eVZhbHVlKTsKLQl9Ci0JCi0JLy8gKioqKioqIHZlcmlmeSBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcyAqKioqKioqCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFBVmFsdWUoQm9vbGVhbiBleHBlY3RlZFZhbHVlLCBCb29sZWFuIHN1YmplY3RWYWx1ZSwgUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGFhLCBTdHJpbmcgcGVyc2lzdGVuY2VYbWxLZXkpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHN1YmplY3RWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBhYS5nZXRWYWx1ZSgpKTsKLQkJaWYgKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJYXNzZXJ0VHJ1ZSgiUGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlIG5vdCBlcXVhbHMiLCB0aGlzLnByb3BlcnR5VmFsdWVFcXVhbHMocGVyc2lzdGVuY2VYbWxLZXksIGV4cGVjdGVkVmFsdWUudG9TdHJpbmcoKSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCA8VCBleHRlbmRzIEVudW08VD4+IHZvaWQgdmVyaWZ5QUFWYWx1ZShUIGV4cGVjdGVkVmFsdWUsIFQgc3ViamVjdFZhbHVlLCBQcm9wZXJ0eVZhbHVlTW9kZWw8PyBleHRlbmRzIEVudW08VD4+IGFhLCBTdHJpbmcgcHVLZXkpIHsKLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHN1YmplY3RWYWx1ZSk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBhYS5nZXRWYWx1ZSgpKTsKLQkJaWYgKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCkgewotCQkJYXNzZXJ0VHJ1ZSgiUGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlIG5vdCBlcXVhbHMiLCB0aGlzLnByb3BlcnR5VmFsdWVFcXVhbHMocHVLZXksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKGV4cGVjdGVkVmFsdWUpKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRlc3RzOjxicj4KLQkgKiAxLiB2ZXJpZnkgdG90YWwgbnVtYmVyIG9mIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzPGJyPgotCSAqIDIuIHZlcmlmeSBQVSBoYXMgdGhlIGdpdmVuIHByb3BlcnR5TmFtZTxicj4KLQkgKiAzLiB2ZXJpZnkgbGlzdGVuaW5nIHRvIHByb3BlcnR5TGlzdEFkYXB0ZXI8YnI+Ci0JICogNC4gdmVyaWZ5IHRoYXQgdGhlIG1vZGVsIGNhbiBpZGVudGlmeSBwcm9wZXJ0eU5hbWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SW5pdGlhbFN0YXRlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwdUtleSwgTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0eUxpc3RBZGFwdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKCJUb3RhbCBub3QgdXBkYXRlZCBpbiBwb3B1bGF0ZVB1KCk6ICIsIHByb3BlcnR5TGlzdEFkYXB0ZXIuc2l6ZSgpLCB0aGlzLnByb3BlcnRpZXNUb3RhbCk7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShwdUtleSwgIlByb3BlcnR5IG5vdCBhZGRlZCB0byBwb3B1bGF0ZVB1KCkiKTsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnMocHJvcGVydHlMaXN0QWRhcHRlcik7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZ2V0TW9kZWwoKSwgcHJvcGVydHlOYW1lKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpOwotCQlhc3NlcnRUcnVlKCJtb2RlbC5pdGVtSXNQcm9wZXJ0eSgpIGlzIGZhbHNlOiAiLCB0aGlzLmdldE1vZGVsKCkuaXRlbUlzUHJvcGVydHkocHJvcGVydHkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwcm9wZXJ0eUlkRm9yKCkgbm90IHVwZGF0ZWQ6ICIsIHByb3BlcnR5TmFtZSwgdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSkpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHBlcnNpc3RlbmNlIHVuaXQgaXMgcG9wdWxhdGVkLCBhbmQgdGhhdCB0aGUgbW9kZWwgZm9yCi0JICogdGhlIHRlc3RlZCBQcm9wZXJ0eSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSBmcm9tIHRoZSBwZXJzaXN0ZW5jZQotCSAqIHVuaXQuCi0JICogQHRocm93cyBFeGNlcHRpb24gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5TW9kZWxJbml0aWFsaXplZChTdHJpbmcgcHVLZXksIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSk7Ci0JCWFzc2VydFRydWUoIm1vZGVsLml0ZW1Jc1Byb3BlcnR5KCkgaXMgZmFsc2U6ICIsIHRoaXMuZ2V0TW9kZWwoKS5pdGVtSXNQcm9wZXJ0eShwcm9wZXJ0eSkpOwotCi0JCWFzc2VydFRydWUoIlBlcnNpc3RlbmNlVW5pdCBub3QgcG9wdWxhdGVkIC0gcG9wdWxhdGVkUHUoKSIsIHRoaXMucHJvcGVydHlWYWx1ZUVxdWFscyhwdUtleSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoZXhwZWN0ZWRWYWx1ZSkpKTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJIk1vZGVsIG5vdCBpbml0aWFsaXplZCAtIG1vZGVsLmluaXRpYWxpemVQcm9wZXJ0aWVzKCkgLSBtb2RlbFZhbHVlID0gIiArIG1vZGVsVmFsdWUsIAotCQkJZXhwZWN0ZWRWYWx1ZSwgCi0JCQltb2RlbFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgd2l0aCB0aGUgcHJvcGVydHk6PGJyPgotCSAqIDEuIHZlcmlmaWVzIHRoZSBpbml0aWFsIHN0YXRlPGJyPgotCSAqIDIuIHBlcnNpc3RlbmNlVW5pdCBwdXRQcm9wZXJ0eTxicj4KLQkgKiAzLiBhZGFwdGVyIHNldFByb3BlcnR5PGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldFByb3BlcnR5KFN0cmluZyBwdUtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSk7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdldE1vZGVsKCkucHJvcGVydHlJZE9mKHByb3BlcnR5KTsKLQotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkocHVLZXksIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCQotCQkvLyBSZXBsYWNlIGJ5IHNldHRpbmcgbW9kZWwgb2JqZWN0Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgd2l0aCB0aGUgcHJvcGVydHk6PGJyPgotCSAqIDEuIHBlcmZvcm1zIGEgcmVtb3ZlIG9uIHRoZSBQVTxicj4KLQkgKiAyLiBwZXJmb3JtcyBhIGFkZCB3aXRoIHB1dFByb3BlcnR5PGJyPgotCSAqIDMuIHBlcmZvcm1zIGEgcmVwbGFjZSB3aXRoIHB1dFByb3BlcnR5PGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KFN0cmluZyBwdUtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShwdUtleSk7Ci0JCVN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0aGlzLmdldE1vZGVsKCkucHJvcGVydHlJZE9mKHByb3BlcnR5KTsKLQotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkocHVLZXksICAicGVyc2lzdGVuY2VVbml0LnByb3BlcnRpZXMgZG9lc24ndCBjb250YWluczogIik7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkocHVLZXkpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gQWRkIG9yaWdpbmFsIENhY2hlVHlwZURlZmF1bHQKLQkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkocHVLZXksIHRlc3RWYWx1ZTEpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JCQotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkocHVLZXksIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHRoZSBtb2RlbCdzIHByb3BlcnR5IGlkZW50aWZpZWQgYnkgdGhlIGdpdmVuIHByb3BlcnR5TmFtZQotCSAqIFVzZWQgaW4gdmVyaWZ5U2V0UHJvcGVydHkoKSBhbmQgdmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIGV4cGVjdGVkVmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KHByb3BlcnR5TmFtZSwgdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBWZXJpZmllcyB0aGUgZXZlbnQgb2YgdGhlIHB1dCgpIGFjdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcGVydHlOYW1lCi0JICogICAgICAgICAgICBuYW1lIG9mIHByb3BlcnR5IHRvIGJlIHZlcmlmaWVkCi0JICogQHBhcmFtIHByb3BlcnR5VmFsdWUKLQkgKiAgICAgICAgICAgIHZhbHVlIG9mIHByb3BlcnR5Ci0JICogQHBhcmFtIGV4cGVjdGVkVmFsdWUKLQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dEV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBwcm9wZXJ0eVZhbHVlLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQkKLQkJdGhpcy52ZXJpZnlFdmVudChwcm9wZXJ0eU5hbWUpOwotCQl0aGlzLnZlcmlmeUV2ZW50VmFsdWUocHJvcGVydHlWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0ZXN0czo8YnI+Ci0JICogMS4gdmVyaWZpZXMgdGhlIG5ldyB2YWx1ZSBvZiB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50PGJyPgotCSAqIDIuIHZlcmlmaWVzIHRoZSBnaXZlbiB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlFdmVudFZhbHVlKE9iamVjdCB2YWx1ZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50LmdldE5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGVzdHM6PGJyPgotCSAqIDEuIHZlcmlmaWVzIHRoYXQgYW4gZXZlbnQgaXMgZmlyZWQ8YnI+Ci0JICogMi4gdmVyaWZpZXMgdGhhdCBpdCBpcyB0aGUgY29ycmVjdCBldmVudDxicj4KLQkgKiAzLiB2ZXJpZmllcyB0aGF0IGEgc2luZ2xlIGV2ZW50IGlzIGZpcmVkPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5TmFtZSk7Ci0JCS8vIHZlcmlmeSBldmVudCBvY2N1cnJlbmNlCi0JCWFzc2VydFRydWUoIk5vIEV2ZW50IFJlY2VpdmVkLiIsIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnRDb3VudCA+IDApOwotCQlhc3NlcnRUcnVlKCJNdWx0aXBsZSBFdmVudCBSZWNlaXZlZCAoIiArICB0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQgKyAiKSIsCi0JCQl0aGlzLnByb3BlcnR5Q2hhbmdlZEV2ZW50Q291bnQgPCAyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlIYXNOb0xpc3RlbmVycyhMaXN0VmFsdWVNb2RlbDw/PiBsaXN0VmFsdWVNb2RlbCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUoKChBYnN0cmFjdE1vZGVsKSBsaXN0VmFsdWVNb2RlbCkuaGFzTm9MaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsPD8+IGxpc3RWYWx1ZU1vZGVsKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIGxpc3RWYWx1ZU1vZGVsKS5oYXNBbnlMaXN0Q2hhbmdlTGlzdGVuZXJzKExpc3RWYWx1ZU1vZGVsLkxJU1RfVkFMVUVTKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5SGFzTGlzdGVuZXJzKFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgbW9kZWwsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKCJMaXN0ZW5lciBub3QgYWRkZWQgaW4gc2V0VXAoKSAtICIgKyBwcm9wZXJ0eU5hbWUsICgoQWJzdHJhY3RNb2RlbCkgbW9kZWwpLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKHByb3BlcnR5TmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUhhc0xpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWw8Pz4gcHZtLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSgoKEFic3RyYWN0TW9kZWwpIHB2bSkuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMocHJvcGVydHlOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHVIYXNQcm9wZXJ0eShTdHJpbmcgcHVQcm9wZXJ0eU5hbWUsIFN0cmluZyBtc2cpIHsKLQkJYXNzZXJ0VHJ1ZShtc2cgKyAiIC0gIiArIHB1UHJvcGVydHlOYW1lLCB0aGlzLnByb3BlcnR5RXhpc3RzKHB1UHJvcGVydHlOYW1lKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShTdHJpbmcgcHVQcm9wZXJ0eU5hbWUsIFN0cmluZyBtc2cpIHsKLQkJYXNzZXJ0RmFsc2UobXNnICsgIiAtICIgKyBwdVByb3BlcnR5TmFtZSwgdGhpcy5wcm9wZXJ0eUV4aXN0cyhwdVByb3BlcnR5TmFtZSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1BlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliOTkyOGMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1YbWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0VGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSX0NMQVNTX05BTUUgPSAiSW5uZXJBbm5vdGF0aW9uVGVzdFR5cGUiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgVFlQRV9OQU1FICsgIi4iICsgSU5ORVJfQ0xBU1NfTkFNRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9USEVSX1RZUEVfTkFNRSA9ICJPdGhlclRlc3RUeXBlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfT1RIRVJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgT1RIRVJfVFlQRV9OQU1FOwotCi0KLQlwdWJsaWMgUGVyc2lzdGVuY2VVbml0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgbmFtZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBkaWZmZXJlbnQgbmFtZSwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZSgibmV3TmFtZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5hbWUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBuYW1lcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIHRvIGRpZmZlcmVudCBuYW1lLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROYW1lKCJuZXdOYW1lIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROYW1lKCkpOwotCQkKLQkJLy8gc2V0IG5hbWUgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0TmFtZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIHNldCBuYW1lIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5hbWUoIm5ld05hbWUiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVRyYW5zYWN0aW9uVHlwZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyAxIC0gaW5pdGlhbCB2YWx1ZSBpcyBkZWZhdWx0Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkpOwotCQkKLQkJLy8gMiAtIHNldCB2YWx1ZSwgY29udGV4dCBjaGFuZ2VkCi0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUoWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLkpUQSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLkpUQSwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZSgpKTsKLQkJCi0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRUcmFuc2FjdGlvblR5cGUoWG1sUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlLlJFU09VUkNFX0xPQ0FMKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyAzIC0gdW5zZXQgdmFsdWUsIGNvbnRleHQgY2hhbmdlZAotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0VHJhbnNhY3Rpb25UeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHJhbnNhY3Rpb25UeXBlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIDEgLSBpbml0aWFsIHZhbHVlIGlzIGRlZmF1bHQKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JCQotCQkvLyAyIC0gc2V0IGNvbnRleHQgdmFsdWUsIHJlc291cmNlIGNoYW5nZWQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuSlRBLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0VHJhbnNhY3Rpb25UeXBlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFRyYW5zYWN0aW9uVHlwZShQZXJzaXN0ZW5jZVVuaXRUcmFuc2FjdGlvblR5cGUuUkVTT1VSQ0VfTE9DQUwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFRyYW5zYWN0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIDMgLSBzZXQgY29udGV4dCB2YWx1ZSB0byBkZWZhdWx0LCByZXNvdXJjZSB1bnNldAotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKCkpOwotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRUcmFuc2FjdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZXNjcmlwdGlvbigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgZGVzY3JpcHRpb25zIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gZGlmZmVyZW50IGRlc2NyaXB0aW9uLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy8gc2V0IGRlc2NyaXB0aW9uIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24oIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24obnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXREZXNjcmlwdGlvbigibmV3RGVzY3JpcHRpb24iKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVzY3JpcHRpb24oKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IGRlc2NyaXB0aW9ucyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy8gc2V0IGRlc2NyaXB0aW9uIHRvIGRpZmZlcmVudCBkZXNjcmlwdGlvbiwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24oIm5ld0Rlc2NyaXB0aW9uIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCi0JCS8vIHNldCBkZXNjcmlwdGlvbiB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSwgcGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCkpOwotCQkKLQkJLy8gc2V0IGRlc2NyaXB0aW9uIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldERlc2NyaXB0aW9uKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCQotCQkvLyBzZXQgZGVzY3JpcHRpb24gYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0RGVzY3JpcHRpb24oIm5ld0Rlc2NyaXB0aW9uIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldERlc2NyaXB0aW9uKCksIHBlcnNpc3RlbmNlVW5pdC5nZXREZXNjcmlwdGlvbigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3ZpZGVyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBwcm92aWRlcnMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBkaWZmZXJlbnQgcHJvdmlkZXIsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCJuZXdQcm92aWRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCQotCQkvLyBzZXQgcHJvdmlkZXIgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcigiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcihudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3ZpZGVyKCJuZXdQcm92aWRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm92aWRlcigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgcHJvdmlkZXJzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCQotCQkvLyBzZXQgcHJvdmlkZXIgdG8gZGlmZmVyZW50IHByb3ZpZGVyLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcigibmV3UHJvdmlkZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCQkKLQkJLy8gc2V0IHByb3ZpZGVyIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvdmlkZXIoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSk7Ci0JCQotCQkvLyBzZXQgcHJvdmlkZXIgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvdmlkZXIobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm92aWRlcigpKTsKLQkJCi0JCS8vIHNldCBwcm92aWRlciBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm92aWRlcigibmV3UHJvdmlkZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvdmlkZXIoKSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3ZpZGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSnRhRGF0YVNvdXJjZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQganRhRGF0YVNvdXJjZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQganRhRGF0YVNvdXJjZSB0byBkaWZmZXJlbnQganRhRGF0YVNvdXJjZSwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZSgibmV3SnRhRGF0YVNvdXJjZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRKdGFEYXRhU291cmNlKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQganRhRGF0YVNvdXJjZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRKdGFEYXRhU291cmNlKCJuZXdKdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlKdGFEYXRhU291cmNlKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCBqdGFEYXRhU291cmNlcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIHRvIGRpZmZlcmVudCBqdGFEYXRhU291cmNlLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXRKdGFEYXRhU291cmNlKCJuZXdKdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldEp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQganRhRGF0YVNvdXJjZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXRKdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IGp0YURhdGFTb3VyY2UgdG8gbnVsbCwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0SnRhRGF0YVNvdXJjZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBqdGFEYXRhU291cmNlIGJhY2sgdG8gbm9uLW51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldEp0YURhdGFTb3VyY2UoIm5ld0p0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnRhRGF0YVNvdXJjZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5vbkp0YURhdGFTb3VyY2UoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGF0IG5vbkp0YURhdGFTb3VyY2VzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IG5vbkp0YURhdGFTb3VyY2UgdG8gZGlmZmVyZW50IG5vbkp0YURhdGFTb3VyY2UsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UoIm5ld05vbkp0YURhdGFTb3VyY2UiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIHRvIGVtcHR5IHN0cmluZywgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZSgiIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IG5vbkp0YURhdGFTb3VyY2UgYmFjayB0byBub24tbnVsbCwgdGVzdCBlcXVhbGl0eQotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZSgibmV3Tm9uSnRhRGF0YVNvdXJjZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Tm9uSnRhRGF0YVNvdXJjZSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgbm9uSnRhRGF0YVNvdXJjZXMgYXJlIGluaXRpYWxseSBlcXVhbAotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSB0byBkaWZmZXJlbnQgbm9uSnRhRGF0YVNvdXJjZSwgdGVzdCBlcXVhbGl0eQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0Tm9uSnRhRGF0YVNvdXJjZSgibmV3Tm9uSnRhRGF0YVNvdXJjZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCksIHBlcnNpc3RlbmNlVW5pdC5nZXROb25KdGFEYXRhU291cmNlKCkpOwotCQkKLQkJLy8gc2V0IG5vbkp0YURhdGFTb3VyY2UgdG8gZW1wdHkgc3RyaW5nLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0Tm9uSnRhRGF0YVNvdXJjZSgpKTsKLQkJCi0JCS8vIHNldCBub25KdGFEYXRhU291cmNlIHRvIG51bGwsIHRlc3QgZXF1YWxpdHkKLQkJcGVyc2lzdGVuY2VVbml0LnNldE5vbkp0YURhdGFTb3VyY2UobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JCQotCQkvLyBzZXQgbm9uSnRhRGF0YVNvdXJjZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXBlcnNpc3RlbmNlVW5pdC5zZXROb25KdGFEYXRhU291cmNlKCJuZXdOb25KdGFEYXRhU291cmNlIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoeG1sUGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSwgcGVyc2lzdGVuY2VVbml0LmdldE5vbkp0YURhdGFTb3VyY2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKYXJGaWxlUmVmczEoKSB7Ci0JCS8vIFRPRE8KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUphckZpbGVSZWZzMigpIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW1wbGllZE1hcHBpbmdGaWxlUmVmMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBvcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQkKLQkJLy8gcmVtb3ZlIG9ybS54bWwKLQkJZGVsZXRlUmVzb3VyY2Uob3JtUmVzb3VyY2UpOwotCQkKLQkJYXNzZXJ0RmFsc2Uob3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSW1wbGllZE1hcHBpbmdGaWxlUmVmMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBvcm1SZXNvdXJjZSA9IGdldE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQkKLQkJLy8gYWRkIHNwZWNpZmllZCBvcm0ueG1sCi0JCVhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgiTUVUQS1JTkYvb3JtLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydFRydWUob3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzMSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoZXJlIGFyZSBub25lIGluaXRpYWxseQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBtYXBwaW5nIGZpbGUgcmVmLCB0ZXN0IHRoYXQgaXQncyBhZGRlZCB0byBjb250ZXh0Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIHhtbE1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQl4bWxNYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZSgib3JtLnhtbCIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyIC4uLgotCQl4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybTIueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIG1hcHBpbmcgZmlsZSByZWZzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJvcm0ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQl4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybTIueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCksIDIpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgbWFwcGluZyBmaWxlIHJlZiBmcm9tIHhtbCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIGNvbnRleHQKLQkJeG1sTWFwcGluZ0ZpbGVSZWYgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDApOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSAuLi4KLQkJeG1sTWFwcGluZ0ZpbGVSZWYgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDApOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKHhtbE1hcHBpbmdGaWxlUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmczEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGVyZSBhcmUgbm9uZSBpbml0aWFsbHkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgbWFwcGluZyBmaWxlIHJlZiwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gcmVzb3VyY2UKLQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDApLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRTcGVjaWZpZWRNYXBwaW5nRmlsZVJlZigiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmdldCgwKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDEpLmdldEZpbGVOYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIsIHRlc3Rpbmcgb3JkZXIKLQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKDAsICJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5nZXQoMCkuZ2V0RmlsZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmdldCgxKS5nZXRGaWxlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0TWFwcGluZ0ZpbGVzKCkuZ2V0KDIpLmdldEZpbGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTWFwcGluZ0ZpbGVSZWZzMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIG1hcHBpbmcgZmlsZSByZWZzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgeG1sTWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCXhtbE1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKCJvcm0ueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQl4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIm9ybTIueG1sIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5hZGQoeG1sTWFwcGluZ0ZpbGVSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmc1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgbWFwcGluZyBmaWxlIHJlZiBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSB4bWwKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSAuLi4KLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVNwZWNpZmllZE1hcHBpbmdGaWxlUmVmKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3NSZWZzMSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoZXJlIGFyZSBub25lIGluaXRpYWxseQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgbWFwcGluZyBmaWxlIHJlZiwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gY29udGV4dAotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmFyIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyIC4uLgotCQl4bWxDbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCXhtbENsYXNzUmVmLnNldEphdmFDbGFzcygiY29tLmZvby5CYXoiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5hZGQoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2xhc3NSZWZzMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIGNsYXNzIHJlZnMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlYbWxKYXZhQ2xhc3NSZWYgeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmFyIik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJeG1sQ2xhc3NSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEphdmFDbGFzc1JlZigpOwotCQl4bWxDbGFzc1JlZi5zZXRKYXZhQ2xhc3MoImNvbS5mb28uQmF6Iik7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKHhtbENsYXNzUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBjbGFzcyByZWYgZnJvbSB4bWwsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSBjb250ZXh0Ci0JCXhtbENsYXNzUmVmID0geG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5nZXQoMCk7Ci0JCXhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkucmVtb3ZlKHhtbENsYXNzUmVmKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSAuLi4KLQkJeG1sQ2xhc3NSZWYgPSB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgwKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5yZW1vdmUoeG1sQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRDbGFzc1JlZnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2xhc3NSZWZzMSgpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhlcmUgYXJlIG5vbmUgaW5pdGlhbGx5Ci0JCWFzc2VydEVxdWFscygwLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBjbGFzcyByZWYsIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIGNvbnRleHQKLQkJcGVyc2lzdGVuY2VVbml0LmFkZFNwZWNpZmllZENsYXNzUmVmKCJGb28iKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApLmdldEphdmFDbGFzcygpKTsKLQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXBlcnNpc3RlbmNlVW5pdC5hZGRTcGVjaWZpZWRDbGFzc1JlZigiQmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDApLmdldEphdmFDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgxKS5nZXRKYXZhQ2xhc3MoKSk7Ci0JCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkU3BlY2lmaWVkQ2xhc3NSZWYoMCwgIkJheiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXoiLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmdldCgwKS5nZXRKYXZhQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5nZXQoMSkuZ2V0SmF2YUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuZ2V0KDIpLmdldEphdmFDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNsYXNzUmVmczIoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHR3byBjbGFzcyByZWZzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJWG1sSmF2YUNsYXNzUmVmIHhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKCJjb20uZm9vLkJhciIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JCXhtbENsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJeG1sQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKCJjb20uZm9vLkJheiIpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpLmFkZCh4bWxDbGFzc1JlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZENsYXNzUmVmc1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgY2xhc3MgcmVmIGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHhtbAotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lIC4uLgotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlU3BlY2lmaWVkQ2xhc3NSZWYoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgeG1sUGVyc2lzdGVuY2VVbml0LmdldENsYXNzZXMoKS5zaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbXBsaWVkQ2xhc3NSZWZzMSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFBlcnNpc3RlbnRJbm5lckNsYXNzKCk7Ci0JCQotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyhmYWxzZSk7Ci0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7Ci0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscygyLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCXRoaXMudmVyaWZ5VmlydHVhbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSk7Ci0JCXRoaXMudmVyaWZ5VmlydHVhbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FKTsKLQkJCi0JCXJlbW92ZVhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSk7Ci0JCXRoaXMudmVyaWZ5VmlydHVhbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQl0aGlzLnZlcmlmeVZpcnR1YWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMCwgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSk7Ci0JCQotCQlyZW1vdmVYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfSU5ORVJfQ0xBU1NfTkFNRSk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJdGhpcy52ZXJpZnlWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0lOTkVSX0NMQVNTX05BTUUpOwotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9JTk5FUl9DTEFTU19OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVZpcnR1YWxDbGFzc1JlZihTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWlmICh0aGlzLmdldFZpcnR1YWxDbGFzc1JlZihjbGFzc05hbWUpID09IG51bGwpIHsKLQkJCWZhaWwoIm1pc3NpbmcgdmlydHVhbCBjbGFzcyByZWY6ICIgKyBjbGFzc05hbWUpOwotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBDbGFzc1JlZiBnZXRWaXJ0dWFsQ2xhc3NSZWYoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlmb3IgKENsYXNzUmVmIHJlZiA6IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpKSB7Ci0JCQlpZiAoVG9vbHMudmFsdWVzQXJlRXF1YWwocmVmLmdldENsYXNzTmFtZSgpLCBjbGFzc05hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlZjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEltcGxpZWRDbGFzc1JlZnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgamF2YVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmcygpKSk7Ci0JCQotCQlqYXZhVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEltcGxpZWRDbGFzc1JlZnNTaXplKCkpOwotCQkKLQkJamF2YVR5cGUuYWRkQW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0SW1wbGllZENsYXNzUmVmc1NpemUoKSk7Ci0JCQotCQlqYXZhVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQkJCi0JCWphdmFUeXBlLmFkZEFubm90YXRpb24oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRJbXBsaWVkQ2xhc3NSZWZzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbmFtZVBlcnNpc3RlbnRUeXBlSW1wbGllZENsYXNzUmVmcygpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKS5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwotCQlJQ29tcGlsYXRpb25Vbml0IHRlc3RUeXBlID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQkJSUNvbXBpbGF0aW9uVW5pdCBvdGhlclRlc3RUeXBlID0gdGhpcy5jcmVhdGVUZXN0T3RoZXJUeXBlRW50aXR5KCk7Ci0JCQotCQlDbGFzc1JlZiB0ZXN0VHlwZUNsYXNzUmVmID0gdGhpcy5nZXRWaXJ0dWFsQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUNsYXNzUmVmIG90aGVyVGVzdFR5cGVDbGFzc1JlZiA9IHRoaXMuZ2V0VmlydHVhbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9PVEhFUl9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0VHlwZUNsYXNzUmVmKTsKLQkJYXNzZXJ0Tm90TnVsbChvdGhlclRlc3RUeXBlQ2xhc3NSZWYpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHRlc3RKYXZhUGVyc2lzdGVudFR5cGUgPSB0ZXN0VHlwZUNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3RoZXJUZXN0SmF2YVBlcnNpc3RlbnRUeXBlID0gb3RoZXJUZXN0VHlwZUNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJdGVzdFR5cGUuZmluZFByaW1hcnlUeXBlKCkucmVuYW1lKCJUZXN0VHlwZTIiLCBmYWxzZSwgbnVsbCk7Ci0JCQotCQl0ZXN0VHlwZUNsYXNzUmVmID0gdGhpcy5nZXRWaXJ0dWFsQ2xhc3NSZWYoInRlc3QuVGVzdFR5cGUyIik7Ci0JCW90aGVyVGVzdFR5cGVDbGFzc1JlZiA9IHRoaXMuZ2V0VmlydHVhbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9PVEhFUl9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0VHlwZUNsYXNzUmVmKTsKLQkJYXNzZXJ0Tm90TnVsbChvdGhlclRlc3RUeXBlQ2xhc3NSZWYpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG90aGVyVGVzdEphdmFQZXJzaXN0ZW50VHlwZSwgb3RoZXJUZXN0VHlwZUNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpKTsKLQkJYXNzZXJ0Tm90U2FtZSh0ZXN0SmF2YVBlcnNpc3RlbnRUeXBlLCB0ZXN0VHlwZUNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyAxIC0gaW5pdGlhbCB2YWx1ZSBpcyBkZWZhdWx0Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCS8vIDIgLSBzZXQgdmFsdWUsIGNvbnRleHQgY2hhbmdlZAotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXQuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCS8vIDMgLSB1bnNldCB2YWx1ZSwgY29udGV4dCBjaGFuZ2VkCi0JCXhtbFBlcnNpc3RlbmNlVW5pdC5zZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyAxIC0gaW5pdGlhbCB2YWx1ZSBpcyBkZWZhdWx0Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0RXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJCi0JCS8vIDIgLSBzZXQgdmFsdWUsIHJlc291cmNlIGNoYW5nZWQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdC5leGNsdWRlc1VubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcyhCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0U3BlY2lmaWVkRXhjbHVkZVVubGlzdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0LmV4Y2x1ZGVzVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCQotCQkvLyAzIC0gc2V0IGNvbnRleHQgdG8gZGVmYXVsdCwgcmVzb3VyY2UgdW5zZXQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRTcGVjaWZpZWRFeGNsdWRlVW5saXN0ZWRDbGFzc2VzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXQuZXhjbHVkZXNVbmxpc3RlZENsYXNzZXMoKSk7Ci0JCWFzc2VydE51bGwoeG1sUGVyc2lzdGVuY2VVbml0LmdldEV4Y2x1ZGVVbmxpc3RlZENsYXNzZXMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0aWVzMSgpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoZXJlIGFyZSBub25lIGluaXRpYWxseQotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCQkKLQkJLy8gYWRkICJwcm9wZXJ0aWVzIiwgdGVzdCB0aGF0IHRoZXJlJ3Mgbm8gcmVhbCBjaGFuZ2UgdG8gY29udGV4dAotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCWFzc2VydEVxdWFscygwLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyBhZGQgcHJvcGVydHksIHRlc3QgdGhhdCBpdCdzIGFkZGVkIHRvIGNvbnRleHQKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoImZvbyIpOwotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiYmFyIik7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCQkKLQkJLy8gYWRkIGFub3RoZXIgLi4uCi0JCXhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJGT08iKTsKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIkJBUiIpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3BlcnRpZXMyKCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCB0d28gcHJvcGVydGllcyBhbmQgdGVzdCB0aGF0IHRoZXJlIGFyZSB0d28gZXhpc3RpbmcgaW4geG1sIGFuZCBjb250ZXh0Ci0JCVhtbFByb3BlcnRpZXMgeG1sUHJvcGVydGllcyA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydGllcygpOwotCQl4bWxQZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydGllcyh4bWxQcm9wZXJ0aWVzKTsKLQkJWG1sUHJvcGVydHkgeG1sUHJvcGVydHkgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnR5KCk7Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoImZvbyIpOwotCQl4bWxQcm9wZXJ0eS5zZXRWYWx1ZSgiYmFyIik7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLmFkZCh4bWxQcm9wZXJ0eSk7Ci0JCXhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJGT08iKTsKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIkJBUiIpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgcHJvcGVydHkgZnJvbSB4bWwsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSBjb250ZXh0Ci0JCXhtbFByb3BlcnR5ID0geG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDApOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5yZW1vdmUoeG1sUHJvcGVydHkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZSAuLi4KLQkJeG1sUHJvcGVydHkgPSB4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5nZXQoMCk7Ci0JCXhtbFByb3BlcnRpZXMuZ2V0UHJvcGVydGllcygpLnJlbW92ZSh4bWxQcm9wZXJ0eSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvcGVydGllczEoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gdGVzdCB0aGVyZSBhcmUgbm9uZSBpbml0aWFsbHkKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQkJCi0JCS8vIGFkZCBwcm9wZXJ0eSwgdGVzdCB0aGF0IGl0J3MgYWRkZWQgdG8gcmVzb3VyY2UKLQkJcGVyc2lzdGVuY2VVbml0LmFkZFByb3BlcnR5KCkuc2V0TmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vIGFkZCBhbm90aGVyIC4uLgotCQlwZXJzaXN0ZW5jZVVuaXQuYWRkUHJvcGVydHkoKS5zZXROYW1lKCJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCS8vIGFkZCBhbm90aGVyIHRlc3Rpbmcgb3JkZXIKLQkJcGVyc2lzdGVuY2VVbml0LmFkZFByb3BlcnR5KDApLnNldE5hbWUoImJheiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmF6IiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcm9wZXJ0aWVzMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgdHdvIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJmb28iKTsKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoImJhciIpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQl4bWxQcm9wZXJ0eSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJvcGVydHkoKTsKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiRk9PIik7Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJCQVIiKTsKLQkJeG1sUHJvcGVydGllcy5nZXRQcm9wZXJ0aWVzKCkuYWRkKHhtbFByb3BlcnR5KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXNTaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHByb3BlcnR5IGZyb20gY29udGV4dCwgdGVzdCB0aGF0IGl0J3MgcmVtb3ZlZCBmcm9tIHJlc291cmNlCi0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVQcm9wZXJ0eSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm90aGVyIG9uZS4gIHRlc3QgdGhhdCBwcm9wZXJ0aWVzIG9iamVjdCBpcyBudWxsZWQKLQkJcGVyc2lzdGVuY2VVbml0LnJlbW92ZVByb3BlcnR5KCJGT08iLCAiQkFSIik7Ci0JCQotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvcGVydGllczMoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHR3byBwcm9wZXJ0aWVzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIiwgZmFsc2UpOwotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoImZvbyIsICJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCB4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFub3RoZXIgb25lLCB0ZXN0IHRoYXQgcHJvcGVydGllcyBvYmplY3QgaXMgbnVsbGVkCi0JCXBlcnNpc3RlbmNlVW5pdC5yZW1vdmVQcm9wZXJ0eSgiRk9PIik7Ci0JCQotCQlhc3NlcnROdWxsKHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJvcGVydGllczQoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkKLQkJLy8gYWRkIHR3byBwcm9wZXJ0aWVzIGFuZCB0ZXN0IHRoYXQgdGhlcmUgYXJlIHR3byBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJmb28iLCAiYmFyIiwgZmFsc2UpOwotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoIkZPTyIsICJCQVIiLCBmYWxzZSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQkJCi0JCS8vIG1vZGlmeSBhIHByb3BlcnR5LCB0ZXN0IGl0cyB2YWx1ZQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsICIiLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiIiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJmb28iKS5nZXRWYWx1ZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsICJCQVIiLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJmb28iKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBwcm9wZXJ0eSBmcm9tIGNvbnRleHQsIHRlc3QgdGhhdCBpdCdzIHJlbW92ZWQgZnJvbSByZXNvdXJjZQotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoIkZPTyIpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0eSgiRk9PIikpOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQotCQkvLyByZW1vdmUgYnkgc2V0dGluZyB2YWx1ZSB0byBudWxsLCB0ZXN0IHRoYXQgcHJvcGVydGllcyBvYmplY3QgaXMgbnVsbGVkCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgibm90RXhpc3QiLCBudWxsLCBmYWxzZSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJub3RFeGlzdCIpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsIG51bGwsIGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoImZvbyIpKTsKLQkJYXNzZXJ0TnVsbCh4bWxQZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByb3BlcnRpZXM1KCkgewotCQlYbWxQZXJzaXN0ZW5jZVVuaXQgeG1sUGVyc2lzdGVuY2VVbml0ID0gZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3RpbmcgZHVwbGljYXRlIGtleXMsIGFkZCBmb3VyIHByb3BlcnRpZXMgYW5kIHRlc3QgdGhhdCB0aGVyZSBhcmUgZm91ciBleGlzdGluZyBpbiB4bWwgYW5kIGNvbnRleHQKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJGT08iLCAiQkFSIiwgZmFsc2UpOwotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsICJiYXIgMyIsIHRydWUpOwotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsICJiYXIgMiIsIHRydWUpOwotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0UHJvcGVydHkoImZvbyIsICJiYXIgMSIsIHRydWUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIHhtbFBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydGllc1NpemUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYSBwcm9wZXJ0eSwgdGVzdCB0aGF0IHRoZXJlIGFyZSBmb3VyIGV4aXN0aW5nIGluIHhtbCBhbmQgY29udGV4dAotCQlwZXJzaXN0ZW5jZVVuaXQucmVtb3ZlUHJvcGVydHkoImZvbyIsICJiYXIgMSIpOwotCQlhc3NlcnRFcXVhbHMoMywgeG1sUGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnRpZXMoKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHBlcnNpc3RlbmNlVW5pdC5nZXRQcm9wZXJ0aWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Byb3BlcnR5KCkgewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyBhZGQgdHdvIHByb3BlcnRpZXMgYW5kIHRyeSB0byBhY2Nlc3MgaXQuCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRQcm9wZXJ0eSgiZm9vIiwgImJhciIsIGZhbHNlKTsKLQkJcGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnR5KCJGT08iLCAiQkFSIiwgZmFsc2UpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5IHByb3BlcnR5ID0gcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJmb28iKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm9wZXJ0eSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcHJvcGVydHkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJGT08iKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcGVyc2lzdGVuY2VVbml0LmdldFByb3BlcnR5KCJGT08iKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UHJvcGVydHkoIm5vdEV4aXN0IikpOwotCX0KLQkKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkgewotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydGllcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcm9wZXJ0eU5hbWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCBwcm9wZXJ0eSBmb3IgdGVzdGluZwotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQkKLQkJLy8gdGVzdCB0aGF0IG5hbWVzIGFyZSBpbml0aWFsbHkgZXF1YWwKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBkaWZmZXJlbnQgbmFtZSwgdGVzdCBlcXVhbGl0eQotCQl4bWxQcm9wZXJ0eS5zZXROYW1lKCJuZXdOYW1lIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0TmFtZSgiIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldE5hbWUoKSwgcGVyc2lzdGVuY2VVbml0Rmlyc3RQcm9wZXJ0eSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvLyBzZXQgbmFtZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFByb3BlcnR5LnNldE5hbWUoIm5ld05hbWUiKTsKLQotCQlhc3NlcnRFcXVhbHMoeG1sUHJvcGVydHkuZ2V0TmFtZSgpLCBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByb3BlcnR5VmFsdWUoKSB7Ci0JCVhtbFBlcnNpc3RlbmNlVW5pdCB4bWxQZXJzaXN0ZW5jZVVuaXQgPSBnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIGFkZCBwcm9wZXJ0eSBmb3IgdGVzdGluZwotCQlYbWxQcm9wZXJ0aWVzIHhtbFByb3BlcnRpZXMgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFByb3BlcnRpZXMoKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LnNldFByb3BlcnRpZXMoeG1sUHJvcGVydGllcyk7Ci0JCVhtbFByb3BlcnR5IHhtbFByb3BlcnR5ID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcm9wZXJ0eSgpOwotCQl4bWxQcm9wZXJ0aWVzLmdldFByb3BlcnRpZXMoKS5hZGQoeG1sUHJvcGVydHkpOwotCQkKLQkJLy8gdGVzdCB0aGF0IHZhbHVlcyBhcmUgaW5pdGlhbGx5IGVxdWFsCi0JCWFzc2VydEVxdWFscyh4bWxQcm9wZXJ0eS5nZXRWYWx1ZSgpLCBwZXJzaXN0ZW5jZVVuaXRGaXJzdFByb3BlcnR5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgdmFsdWUgdG8gZGlmZmVyZW50IHZhbHVlLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJuZXdWYWx1ZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB2YWx1ZSB0byBlbXB0eSBzdHJpbmcsIHRlc3QgZXF1YWxpdHkKLQkJeG1sUHJvcGVydHkuc2V0VmFsdWUoIiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB2YWx1ZSB0byBudWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCB2YWx1ZSBiYWNrIHRvIG5vbi1udWxsLCB0ZXN0IGVxdWFsaXR5Ci0JCXhtbFByb3BlcnR5LnNldFZhbHVlKCJuZXdWYWx1ZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHhtbFByb3BlcnR5LmdldFZhbHVlKCksIHBlcnNpc3RlbmNlVW5pdEZpcnN0UHJvcGVydHkoKS5nZXRWYWx1ZSgpKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJY3JlYXRlT3JtMlhtbEZpbGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVhtbCBvcm1NYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJT3JtWG1sIG9ybTJNYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybU1hcHBpbmdGaWxlLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCW9ybU1hcHBpbmdGaWxlLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJb3JtTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7CQotCQlhc3NlcnRGYWxzZShvcm1NYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5yZXNvdXJjZUV4aXN0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkJCQotCQlvcm0yTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7CQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJY3JlYXRlT3JtMlhtbEZpbGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVhtbCBvcm1NYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJT3JtWG1sIG9ybTJNYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCW9ybU1hcHBpbmdGaWxlLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkKLQkJb3JtTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7CQotCQlhc3NlcnRGYWxzZShvcm1NYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5yZXNvdXJjZUV4aXN0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHBlcnNpc3RlbmNlVW5pdC5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQkJCQotCQlvcm0yTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFkZFhtbE1hcHBpbmdGaWxlUmVmKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJY3JlYXRlT3JtMlhtbEZpbGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlUmVmcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVhtbCBvcm1NYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJT3JtWG1sIG9ybTJNYXBwaW5nRmlsZSA9IChPcm1YbWwpIG1hcHBpbmdGaWxlUmVmcy5uZXh0KCkuZ2V0TWFwcGluZ0ZpbGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQotCQlvcm1NYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkZPTyIpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgcGVyc2lzdGVuY2VVbml0LmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQkKLQkJb3JtTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwkKLQkJYXNzZXJ0RmFsc2Uob3JtTWFwcGluZ0ZpbGUuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkucmVzb3VyY2VFeGlzdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JCQkJCi0JCW9ybTJNYXBwaW5nRmlsZS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZENhdGFsb2coIkJBUiIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0RGVmYXVsdENhdGFsb2coKSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU9ybTJYbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCAib3JtMi54bWwiKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCQkKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoIk1FVEEtSU5GL29ybTIueG1sIik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T3RoZXJUeXBlRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgT1RIRVJfVFlQRV9OQU1FICsgIi5qYXZhIiwgT1RIRVJfVFlQRV9OQU1FLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhQZXJzaXN0ZW50SW5uZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICBwdWJsaWMgc3RhdGljIGNsYXNzICIgKyBJTk5FUl9DTEFTU19OQU1FICsgIiB7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyhmYWxzZSk7CQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCS8vcGVyc2lzdGVudFR5cGUgbm90IGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwgYW5kIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyBpcyBmYWxzZQotCQkvL3N0aWxsIGZpbmQgdGhlIHBlcnNpc3RlbnRUeXBlIGJlY2F1c2Ugb2YgY2hhbmdlcyBmb3IgYnVnIDE5MDMxNwotCQlhc3NlcnRGYWxzZShnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQkKLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIG5vdCBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sLCBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBzZXQgdG8gdHJ1ZQotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsJCi0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBsaXN0IGFzIGNsYXNzIGluIHBlcnNpc3RlbmNlLnhtbAotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyhmYWxzZSk7Ci0JCVhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCWNsYXNzUmVmLnNldEphdmFDbGFzcyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQotCQkKLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGZyb20gb3JtLnhtbCBmaWxlIHRoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRUeXBlLCBwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoIm1vZGVsLkZvbyIpKTsKLQotCQkvL3Rlc3QgcGVyc2lzdGVudFR5cGUgZnJvbSBvcm0ueG1sIGZpbGUgdGhhdCBpcyBpbXBsaWVkKG5vdCBzcGVjaWZpZWQpIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCX0KLQkKLS8vVE9ETwotLy8JU3RyaW5nIGdldERlZmF1bHRTY2hlbWEoKTsKLS8vCVN0cmluZyBnZXREZWZhdWx0Q2F0YWxvZygpOwotLy8JQWNjZXNzVHlwZSBnZXREZWZhdWx0QWNjZXNzKCk7Ci0vLwlib29sZWFuIGdldERlZmF1bHRDYXNjYWRlUGVyc2lzdCgpOwotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9QZXJzaXN0ZW5jZVhtbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYmQzMGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvUGVyc2lzdGVuY2VYbWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlWG1sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbFBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFBlcnNpc3RlbmNlWG1sVGVzdHMgZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBQZXJzaXN0ZW5jZVhtbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VYbWwgZ2V0UGVyc2lzdGVuY2VYbWwoKSB7Ci0JCXJldHVybiBnZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQWRkUGVyc2lzdGVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RXF1YWxzKDIsIGdldEpwYVByb2plY3QoKS5nZXRKcGFGaWxlc1NpemUoKSk7Ci0JCUpwYVhtbFJlc291cmNlIHBybSA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJcHJtLmdldENvbnRlbnRzKCkuY2xlYXIoKTsKLQkJcHJtLnNhdmUobnVsbCk7Ci0JCQotCQkvL3RoZSBDb250ZW50VHlwZSBvZiB0aGUgcGVyc2lzdGVuY2UueG1sIGZpbGUgaXMgbm8gbG9uZ2VyIHBlcnNpc3RlbmNlLCBzbyB0aGUganBhIGZpbGUgaXMgcmVtb3ZlZAotCQlhc3NlcnROdWxsKGdldFBlcnNpc3RlbmNlWG1sKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGVzU2l6ZSgpKTsgLy9zaG91bGQgb25seSBiZSB0aGUgb3JtLnhtbCBmaWxlCi0JCQotCQlYbWxQZXJzaXN0ZW5jZSB4bWxQZXJzaXN0ZW5jZSA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2UoKTsKLQkJeG1sUGVyc2lzdGVuY2Uuc2V0VmVyc2lvbigiMS4wIik7Ci0JCXBybS5nZXRDb250ZW50cygpLmFkZCh4bWxQZXJzaXN0ZW5jZSk7Ci0JCXBybS5zYXZlKG51bGwpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChnZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGVzU2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZW1vdmVQZXJzaXN0ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSBwcm0gPSBnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKSk7Ci0JCQotCQlwcm0uZ2V0Q29udGVudHMoKS5jbGVhcigpOwotCQlhc3NlcnROdWxsKGdldFBlcnNpc3RlbmNlWG1sKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1Jvb3RDb250ZXh0Tm9kZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Sb290Q29udGV4dE5vZGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjM1NGZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1Jvb3RDb250ZXh0Tm9kZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5KcGFSb290Q29udGV4dE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuUGVyc2lzdGVuY2VGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UueG1sLkpwYVhtbFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJvb3RDb250ZXh0Tm9kZVRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgUm9vdENvbnRleHROb2RlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBZGRQZXJzaXN0ZW5jZVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlkZWxldGVSZXNvdXJjZShnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkpOwotCQlKcGFSb290Q29udGV4dE5vZGUgYmFzZUpwYUNvbnRlbnQgPSBnZXRKYXZhUHJvamVjdCgpLmdldEpwYVByb2plY3QoKS5nZXRSb290Q29udGV4dE5vZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCQkKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IFBlcnNpc3RlbmNlRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoYmFzZUpwYUNvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZW1vdmVQZXJzaXN0ZW5jZVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSBwciA9IGdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKTsKLQkJSnBhUm9vdENvbnRleHROb2RlIGJhc2VKcGFDb250ZW50ID0gZ2V0SmF2YVByb2plY3QoKS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGJhc2VKcGFDb250ZW50LmdldFBlcnNpc3RlbmNlWG1sKCkpOwotCQkKLQkJZGVsZXRlUmVzb3VyY2UocHIpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNlSnBhQ29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L0dlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNmE3Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L0dlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5HZW5lcmljUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSwgR2VuZXJpY1BsYXRmb3JtLlZFUlNJT05fMl8wKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRKcGFGYWNldFZlcnNpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEdlbmVyaWNQbGF0Zm9ybS5WRVJTSU9OXzJfMDsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpYzJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4MGNmZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpYzJfMEphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEdlbmVyaWMyXzBKYXZhQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YUJhc2ljTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhQ2FzY2FkZTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YUVudGl0eTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhSWRNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY0phdmFQZXJzaXN0ZW50VHlwZTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljSmF2YVZlcnNpb25NYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljMl8wSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBmZjZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FID0gIk1ZX0FTU09DSUFUSU9OX09WRVJSSURFX05BTUUiOwotCi0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQ+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZT1cIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgR2VuZXJpY0phdmFBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gKChWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCi0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJam9pbmluZ1N0cmF0ZWd5LnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoNCwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCQotCQlqb2luaW5nU3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlqb2luaW5nU3RyYXRlZ3kubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUphdmFKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5hZGRKb2luQ29sdW1uKDIpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwkJCi0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVudGl0eSBlbnRpdHkgPSBnZXRKYXZhRW50aXR5KCk7CQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUoYXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luVGFibGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzTWFueVRvTWFueSgpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gKChWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBLaW5kLlRZUEUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UgPSAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0KLQkJCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc01hbnlUb01hbnkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9ICgoVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUpIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuc2V0TmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLnJlbW92ZUpvaW5Db2x1bW4oMCk7ICAvLyByZW1vdmUgZGVmYXVsdAotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkuYWRkSm9pbkNvbHVtbigwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5hZGRKb2luQ29sdW1uKDIpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLmpvaW5Db2x1bW5BdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLmpvaW5Db2x1bW5BdCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLmpvaW5Db2x1bW5BdCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2UuZ2V0Sm9pblRhYmxlKCkubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLm1vdmVKb2luQ29sdW1uKDAsIDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZS5nZXRKb2luVGFibGUoKS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlLmdldEpvaW5UYWJsZSgpLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5UYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NNYW55VG9NYW55KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wIHJlbCA9IChWaXJ0dWFsT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpOwotCQlWaXJ0dWFsSm9pblRhYmxlIGpvaW5UYWJsZSA9IHJlbC5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZF9Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19GT08iLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIG1hcHBlZFN1cGVyY2xhc3MgPSBnZXRKYXZhRW50aXR5KCkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUJhc2ljTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFCYXNpY01hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTU3ZjZiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUJhc2ljTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUJhc2ljTWFwcGluZzJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgR2VuZXJpY0phdmFCYXNpY01hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9EZWZhdWx0QmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0RW51bVR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKCgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSAoKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb1ZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvRW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9FbWJlZGRlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvVHJhbnNpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNNb3JwaFRvT25lVG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotLy9UT0RPCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsICgoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsICgoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9PbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0vL1RPRE8JYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb01hbnlUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgKChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljTW9ycGhUb01hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYmFzaWNNYXBwaW5nLnNldFNwZWNpZmllZE9wdGlvbmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQkKLS8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTG9iQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW51bWVyYXRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCYXNpY01vcnBoVG9FbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQliYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKExvYkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVudW1lcmF0ZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWJhc2ljTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQliYXNpY01hcHBpbmcuc2V0U3BlY2lmaWVkT3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQkKLS8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihMb2JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbnVtZXJhdGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNhc2NhZGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FzY2FkZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ODU4YWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ2FzY2FkZTJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNhc2NhZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFDYXNjYWRlMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUNhc2NhZGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVEZXRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZTJfMCBjYXNjYWRlID0gKEphdmFDYXNjYWRlMl8wKSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlRGV0YWNoKCkpOwotCQkKLQkJLy9zZXQgZGV0YWNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlhbm5vdGF0aW9uLnNldENhc2NhZGVEZXRhY2godHJ1ZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb24uaXNDYXNjYWRlRGV0YWNoKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCQotCQkvL3NldCBkZXRhY2ggdG8gZmFsc2UgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWFubm90YXRpb24uc2V0Q2FzY2FkZURldGFjaChmYWxzZSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShhbm5vdGF0aW9uLmlzQ2FzY2FkZURldGFjaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVEZXRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ2FzY2FkZTJfMCBjYXNjYWRlID0gKEphdmFDYXNjYWRlMl8wKSBtYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCWFzc2VydEZhbHNlKGFubm90YXRpb24uaXNDYXNjYWRlRGV0YWNoKCkpOwotCQkJCQkKLQkJLy9zZXQgZGV0YWNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQljYXNjYWRlLnNldERldGFjaCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9uLmlzQ2FzY2FkZURldGFjaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQkKLQkJLy9zZXQgZGV0YWNoIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNhc2NhZGUuc2V0RGV0YWNoKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UoYW5ub3RhdGlvbi5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUNvbGxlY3Rpb25UYWJsZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YTJiOGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVW5pcXVlQ29uc3RyYWludEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFDb2xsZWN0aW9uVGFibGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248U3RyaW5nPiBwcm9qZWN0czsiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlMyA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZTMpOwotCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZTMgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZTMuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCBjb2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQkvL2FkZCB0aGUgY29sbGVjdGlvbiB0YWJsZSBhbm5vdGF0aW9uLCB2ZXJpZnkgZGVmYXVsdCBjb2xsZWN0aW9uIHRhYmxlIG5hbWUgaXMgdGhlIHNhbWUKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCBjb2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCB0aGUgZW50aXR5IG5hbWUsIHZlcmlmeSBkZWZhdWx0IGNvbGxlY3Rpb24gdGFibGUgbmFtZSB1cGRhdGVzCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fcHJvamVjdHMiLCBjb2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkJCi0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldFNjaGVtYSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldFNjaGVtYSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQkKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldENhdGFsb2coIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coImZvbyIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBjb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBjb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVSZXNvdXJjZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0KLQkJY29sbGVjdGlvblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmFkZEpvaW5Db2x1bW4oMik7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UubW92ZUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1ucyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVSZXNvdXJjZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEpvaW5Db2x1bW4oKSB7Ci0JCS8vVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsICBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiZm9vIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJiYXIiKTsKLQkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgIGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50cyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCi0KLQkJY29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWEyMWFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJBZGRyZXNzIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0cmluZz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxJbnRlZ2VyLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhYmJyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxBZGRyZXNzLCBQcm9wZXJ0eUluZm8+IHBhcmNlbHM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8QWRkcmVzcywgUHJvcGVydHlJbmZvPiBwYXJjZWxzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByb3BlcnR5SW5mbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgcGFyY2VsTnVtYmVyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgc2l6ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLm1hdGguQmlnRGVjaW1hbCB0YXg7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvcGVydHlJbmZvLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRm9vIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxGb28+IGVsZW1lbnRDb2xsZWN0aW9uOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkZvby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbiA9IChFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uc2V0VGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uc2V0VGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uQW5ub3RhdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0RW50aXR5IG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCwgZGVmYXVsdCBzdGlsbCBzZXQsIGhhbmRsZWQgYnkgdmFsaWRhdGlvbgotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCS8vYWRkIHRhcmdldEVudGl0eSB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUNsYXNzUmVmIGFkZHJlc3NDbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBhZGRyZXNzQ2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJLy90ZXN0IHRhcmdldCBpcyBub3QgYW4gRW1iZWRkYWJsZSwgZGVmYXVsdCB0YXJnZXQgZW50aXR5IHN0aWxsIGV4aXN0cywgdGhpcyBjYXNlIGhhbmRsZWQgd2l0aCB2YWxpZGF0aW9uCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzTm9uR2VuZXJpY0NvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc0dlbmVyaWNDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc05vbkdlbmVyaWNNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFRhcmdldENsYXNzR2VuZXJpY01hcCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBtYXBwaW5nKSB7Ci0JCXJldHVybiAoRW1iZWRkYWJsZSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWFwcGluZywgImdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldCBlbWJlZGRhYmxlIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQkJLy9hZGQgdGFyZ2V0IGVtYmVkZGFibGUgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW1iZWRkYWJsZSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJVHlwZU1hcHBpbmcgYWRkcmVzc1R5cGVNYXBwaW5nID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcpKTsKLQkJCi0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlV2l0aEJhc2ljVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0IGlzIGEgYmFzaWMgdHlwZSwgc28gcmVzb2x2ZWQgdGFyZ2V0IGVtYmVkZGFibGUgaXMgbnVsbAotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlTm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLk5PX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5CQVNJQ19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5QW5ub3RhdGlvbiA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5vTWFwS2V5KHRydWUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3MpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzcyA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3NDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX2FkZHJlc3NlcyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGVtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBlbWJlZGRhYmxlLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImNpdHkiKS5nZXRNYXBwaW5nKCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX2FkZHJlc3NlcyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUubmFtZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRV8gKyAiU3RhdGUiKTsKLQkJCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIG5lc3RlZEVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgic3RhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFiYnIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHN0YXRlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlCYXNpY01hcHBpbmcgYWJick1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBzdGF0ZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhYmJyIikuZ2V0TWFwcGluZygpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJLy9jaGVjayB0aGUgbmVzdGVkIGVtYmVkZGVkIChBZGRyZXNzLnN0YXRlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBTdGF0ZS5hYmJyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoImFiYnIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vY29sbGVjdGlvbiB0YWJsZSBuYW1lCi0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfQ09MTEVDVElPTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTExFQ1RJT05fVEFCTEUiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CTEFIIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9wYXJjZWxzIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgYWRkcmVzc0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBhZGRyZXNzRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQotCQkKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCWNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgcHJvcGVydHlJbmZvRW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBwYXJjZWxOdW1iZXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcHJvcGVydHlJbmZvRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxOdW1iZXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PMSIpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIxIik7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRjEiKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTzEiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg1LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg1LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLm5hbWUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FXyArICJQcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FXyArICJTdGF0ZSIpOwotCQkJCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHZhbHVlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2YWx1ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5T3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2YWx1ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5T3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBvdmVycmlkZUFubm90YXRpb25zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgb3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgb3ZlcnJpZGVBbm5vdGF0aW9ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuc2l6ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJdmFsdWVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW1hcEtleU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJb3ZlcnJpZGVBbm5vdGF0aW9ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkZUFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIHZhbHVlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB2YWx1ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJdmFsdWVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW1hcEtleU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJb3ZlcnJpZGVBbm5vdGF0aW9ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IHZhbHVlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaXplIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5T3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZU1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IG92ZXJyaWRlQW5ub3RhdGlvbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnBhcmNlbE51bWJlciIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDMsIDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCW92ZXJyaWRlQW5ub3RhdGlvbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5zaXplIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIG92ZXJyaWRlQW5ub3RhdGlvbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnBhcmNlbE51bWJlciIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBvdmVycmlkZUFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGVBbm5vdGF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Gb28iKTsKLQkJCi0JCS8vSWYgdGhlcmUgaXMgYSBTdGFja092ZXJmbG93RXJyb3IgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gZ2V0IHRoZSBtYXBwaW5nCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTWFwcGluZ05hbWVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGVudW1lcmF0ZWQpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcEtleVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwodGVtcG9yYWwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5VGVtcG9yYWxVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGVtcG9yYWwuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKFRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygxLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IAotCQkJcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gCi0JCQlyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhSm9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUpvaW5Db2x1bW5zKSk7Ci0KLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhSm9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJGT08iKTsKLQkJKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigyLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigyLCAwLCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDAsIDEsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uSXNEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRUcnVlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpLmlzRGVmYXVsdCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEpvaW5Db2x1bW4uaXNEZWZhdWx0KCkpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUVtYmVkZGVkSWRNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NTdmMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhRW1iZWRkZWRJZE1hcHBpbmcyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRUREQUJMRV9UWVBFX05BTUUgPSAiTXlFbWJlZGRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVEX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIEVNQkVEREFCTEVfVFlQRV9OQU1FICsiIG15RW1iZWRkZWRJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVFbWJlZGRhYmxlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoRU1CRUREQUJMRV9UWVBFX05BTUUpLmFwcGVuZCgiIHsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsIEVNQkVEREFCTEVfVFlQRV9OQU1FICsgIi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0KLQlwdWJsaWMgR2VuZXJpY0phdmFFbWJlZGRlZElkTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRJZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVtYmVkZGVkSWRNYXBwaW5nIGVtYmVkZGVkSWRNYXBwaW5nID0gKEVtYmVkZGVkSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZElkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZElkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRW1iZWRkZWRJZE1hcHBpbmcgZW1iZWRkZWRJZE1hcHBpbmcgPSAoRW1iZWRkZWRJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkSWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkSWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbWJlZGRlZElkTWFwcGluZyBlbWJlZGRlZElkTWFwcGluZyA9IChFbWJlZGRlZElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRJZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0ODU2YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQuamF2YS5HZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRUREQUJMRV9UWVBFX05BTUUgPSAiTXlFbWJlZGRhYmxlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVELCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiIG15RW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKEVNQkVEREFCTEVfVFlQRV9OQU1FKS5hcHBlbmQoIiB7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQWRkcmVzc0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEFkZHJlc3MgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5Q3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgWmlwQ29kZSB6aXBDb2RlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY0phdmFFbWJlZGRlZE1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgQmFzaWNNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEVtYmVkZGVkTWFwcGluZ0dlbmVyaWNFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVUZXN0R2VuZXJpY0VtYmVkZGFibGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5FbnRpdHkxIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW1iZWRkYWJsZTEiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGFibGUiKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0RW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MSB7ICIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIEVtYmVkZGFibGUxPEludGVnZXI+IG15RW1iZWRkYWJsZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY0VtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVtYmVkZGFibGUxPFQ+IHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1iZWRkYWJsZTEuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlbGZSZWZlcmVudGlhbEVtYmVkZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkZvbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRm9vIGVtYmVkZGVkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkZvby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibXlFbWJlZGRlZCIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15RW1iZWRkZWQiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic3RhdGUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQkJCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJVmlydHVhbEpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhRW1iZWRkYWJsZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgamF2YUVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMSwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMiwgMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigwLCAxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCAgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCAgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm15RW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlFbWJlZGRlZCIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKSwgMSk7Ci0JCVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCVZpcnR1YWxKb2luVGFibGUgam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCVZpcnR1YWxKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gam9pblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9BZGRyZXNzIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlWaXJ0dWFsSm9pbkNvbHVtbiB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhRW1iZWRkYWJsZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgamF2YUVtYmVkZGFibGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pblRhYmxlU3RyYXRlZ3kgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCWpvaW5UYWJsZVN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX0NPTFVNTiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUpvaW5Db2x1bW4gaW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJJTlZFUlNFX0JBUiIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJJTlZFUlNFX0NPTFVNTl9ERUYiKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gQ29sbGVjdGlvblRvb2xzLmdldChvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCksIDEpOwotCQlqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCWpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lOVkVSU0VfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0JBUiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0NPTFVNTl9ERUYiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFFbWJlZGRlZE1hcHBpbmcgbmVzdGVkRW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbmVzdGVkRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygyLCBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG5lc3RlZEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy56aXBDb2RlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoSmF2YUVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEphdmFFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgiemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoSmF2YUVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0JCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoSmF2YUVtYmVkZGVkTWFwcGluZykgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJ6aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VsZlJlZmVyZW50aWFsRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlbGZSZWZlcmVudGlhbEVtYmVkZGVkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRm9vIik7Ci0JCQotCQkvL0lmIHRoZXJlIGlzIGEgU3RhY2tPdmVyZmxvd0Vycm9yIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdldCB0aGUgbWFwcGluZwotCQlKYXZhRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChKYXZhRW1iZWRkZWRNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1iZWRkZWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhRW50aXR5Ml8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5ZWU1MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFFbnRpdHkyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FjaGVhYmxlSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTG9ja01vZGVUeXBlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTmFtZWRRdWVyeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5TaGFyZWRDYWNoZU1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YUVudGl0eTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUVudGl0eTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkxvbmdUaW1lQ3VzdG9tZXIgZXh0ZW5kcyBDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInt9Iik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTG9uZ1RpbWVDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWU9XCJhXCIsIGpvaW5UYWJsZT1ASm9pblRhYmxlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIExvY2tNb2RlVHlwZTJfMCBsb2NrTW9kZU9mKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIHJlc291cmNlUXVlcnkpIHsKLQkJcmV0dXJuIHJlc291cmNlUXVlcnkgPT0gbnVsbCA/IG51bGwgOiBMb2NrTW9kZVR5cGUyXzAuZnJvbUphdmFSZXNvdXJjZU1vZGVsKHJlc291cmNlUXVlcnkuZ2V0TG9ja01vZGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5Ml8wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRW50aXR5IGVudGl0eSA9IHRoaXMuZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlOYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkxID0gKE5hbWVkUXVlcnkyXzApIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMCk7Ci0JCQluYW1lZFF1ZXJ5MS5zZXROYW1lKCJGT08iKTsKLQkJCW5hbWVkUXVlcnkxLnNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIHF1ZXJ5QW5ub3RhdGlvbiA9IChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHF1ZXJ5QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YocXVlcnlBbm5vdGF0aW9uKSk7Ci0KLQkJTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MiA9IChOYW1lZFF1ZXJ5Ml8wKSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApOwotCQkJbmFtZWRRdWVyeTIuc2V0TmFtZSgiQkFSIik7Ci0JCQluYW1lZFF1ZXJ5Mi5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuUkVBRCk7Ci0JCQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJcXVlcnlBbm5vdGF0aW9uID0gKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgcXVlcnlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLlJFQUQsIHRoaXMubG9ja01vZGVPZihxdWVyeUFubm90YXRpb24pKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTMgPSAoTmFtZWRRdWVyeTJfMCkgZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKTsKLQkJCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkJbmFtZWRRdWVyeTMuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLldSSVRFKTsKLQkJCi0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlxdWVyeUFubm90YXRpb24gPSAoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBxdWVyeUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuV1JJVEUsIHRoaXMubG9ja01vZGVPZihxdWVyeUFubm90YXRpb24pKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkyLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkzLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkxLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJCi0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZE5hdGl2ZVF1ZXJ5KDApLnNldE5hbWUoImZvbyIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRRdWVyeTJfMCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MSA9IChOYW1lZFF1ZXJ5Ml8wKSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpOwotCQkJbmFtZWRRdWVyeTEuc2V0TmFtZSgiQkFSIik7Ci0JCQluYW1lZFF1ZXJ5MS5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuUkVBRCk7Ci0JCQotCQlOYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkyID0gKE5hbWVkUXVlcnkyXzApIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMik7Ci0JCQluYW1lZFF1ZXJ5Mi5zZXROYW1lKCJCQVoiKTsKLQkJCW5hbWVkUXVlcnkyLnNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhTmFtZWRRdWVyaWVzKSk7Ci0JCQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5yZW1vdmVOYW1lZFF1ZXJ5KDApOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFOYW1lZFF1ZXJpZXMpKTsKLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIGFubm90YXRpb24xID0gKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgYW5ub3RhdGlvbjEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuUkVBRCwgdGhpcy5sb2NrTW9kZU9mKGFubm90YXRpb24xKSk7Ci0JCQotCQlOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uMiA9IChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFubm90YXRpb24yLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIHRoaXMubG9ja01vZGVPZihhbm5vdGF0aW9uMikpOwotCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJYW5ub3RhdGlvbjIgPSAoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhbm5vdGF0aW9uMi5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YoYW5ub3RhdGlvbjIpKTsKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlTmFtZWRRdWVyeTJfMCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKS5zZXROYW1lKCJGT08iKTsKLQkJTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MSA9IChOYW1lZFF1ZXJ5Ml8wKSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDEpOwotCQkJbmFtZWRRdWVyeTEuc2V0TmFtZSgiQkFSIik7Ci0JCQluYW1lZFF1ZXJ5MS5zZXRTcGVjaWZpZWRMb2NrTW9kZShMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQyk7Ci0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFOYW1lZFF1ZXJpZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLk5BTUVEX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YU5hbWVkUXVlcmllcykpOwotCQkKLQkJCi0JCWVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8SmF2YU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCW5hbWVkUXVlcnkxID0gKE5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YU5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCU5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uIGFubm90YXRpb24xID0gKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgYW5ub3RhdGlvbjEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgdGhpcy5sb2NrTW9kZU9mKGFubm90YXRpb24xKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgamF2YU5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQllbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5tb3ZlTmFtZWRRdWVyeSgwLCAxKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCW5hbWVkUXVlcnkxID0gKE5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhTmFtZWRRdWVyaWVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5OQU1FRF9RVUVSWSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYW5ub3RhdGlvbjEgPSAoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIGphdmFOYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhbm5vdGF0aW9uMS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YoYW5ub3RhdGlvbjEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSBqYXZhTmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWVkUXVlcmllczJfMCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKSkuc2V0TmFtZSgiRk9PIik7Ci0JCSgoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9RVUVSWSkpLnNldE5hbWUoIkJBUiIpOwotCQlOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uMSA9IChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCWFubm90YXRpb24xLnNldE5hbWUoIkJBWiIpOwotCQkJYW5ub3RhdGlvbjEuc2V0TG9ja01vZGUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5Mb2NrTW9kZVR5cGVfMl8wLk9QVElNSVNUSUMpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTEgPSAoTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBOYW1lZFF1ZXJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJbmFtZWRRdWVyaWVzID0gZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJbmFtZWRRdWVyeTEgPSAoTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQluYW1lZFF1ZXJ5MSA9IChOYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQluYW1lZFF1ZXJpZXMgPSBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBlbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCAgSlBBLk5BTUVEX1FVRVJZKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCW5hbWVkUXVlcmllcyA9IGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWRRdWVyaWVzMl8wU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbnRpdHkgZW50aXR5ID0gZ2V0SmF2YUVudGl0eSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXNTaXplKCkpOwotCi0JCSgoTmFtZWRRdWVyeTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKE5hbWVkUXVlcnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlkpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChOYW1lZFF1ZXJ5Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgSlBBLk5BTUVEX1FVRVJZKSkuc2V0TmFtZSgiQkFaIik7Ci0KLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWdldEphdmFFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gYWJzdHJhY3RFbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbnNUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBhYnN0cmFjdEVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBhYnN0cmFjdEVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQotCQlNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgamF2YUVudGl0eSA9IChKYXZhRW50aXR5KSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQotCQlKYXZhRW50aXR5IHN1cGVyY2xhc3MgPSAoSmF2YUVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKSkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcy5oYXNOZXh0KCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMywgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUF0dHJpYnV0ZU92ZXJyaWRlcykpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLS8vCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQlKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0vLwkvL1RPRE8gYWRkIGFsbCBtYXBwaW5nIHR5cGVzIHRvIHRoZSBtYXBwZWQgc3VwZXJjbGFzcyB0byB0ZXN0IHdoaWNoIG9uZXMgYXJlIG92ZXJyaWRhYmxlCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc01hcHBlZFN1cGVyY2xhc3NJbk9ybVhtbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBBc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJLy9NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKSkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcykpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgxLCAwKTsKLQkJSXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQlKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKTsKLQkJUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsJCQotCQlQZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKTsKLQkJUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsJCQotCQlQZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQlCYXNpY01hcHBpbmcgcGx1c0ZvdXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgemlwQ29kZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwbHVzZm91ciIpLmdldE1hcHBpbmcoKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUgiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDcpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkvL2NoZWNrIHRoZSB0b3AtbGV2ZWwgZW1iZWRkZWQgKEN1c3RvbWVyLmFkZHJlc3MpIGF0dHJpYnV0ZSBvdmVycmlkZSB0byB2ZXJpZnkgaXQgaXMgZ2V0dGluZyBzZXR0aW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgY29sdW1uIG9uIFppcGNvZGUucGx1c2ZvdXIKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCXNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdGF0ZSIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuYWRkQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSh0cnVlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCwgcGVyc2lzdGVuY2VVbml0Ml8wLmdldFNoYXJlZENhY2hlTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuQUxMKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRlZElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpLmdldFBhcmVudEVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JLy9UaGlzIGlzIGEgdGVzdCBmb3IgYnVnIDMwMTg5MgotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLmdldEpvaW5UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhbm5vdGF0aW9uLmdldEpvaW5UYWJsZSgpLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYSIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJSm9pblRhYmxlIGpvaW5UYWJsZSA9ICgoSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFJZE1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjNjMGRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YUlkTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFJZE1hcHBpbmcyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBHZW5lcmljSmF2YUlkTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgKChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUYWJsZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOy8vT25lVG9PbmUgd2l0aCBJZCBhbm5vdGF0aW9uIGlzIHZhbGlkIGluIEpQQSAyLjAKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJaWRNYXBwaW5nLmFkZEdlbmVyYXRlZFZhbHVlKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRUYWJsZUdlbmVyYXRvcigpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsvL01hbnlUb09uZSB3aXRoIElkIGFubm90YXRpb24gaXMgdmFsaWQgaW4gSlBBIDIuMAotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWlkTWFwcGluZy5hZGRHZW5lcmF0ZWRWYWx1ZSgpOwotCQlpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuYWRkVGFibGVHZW5lcmF0b3IoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKGlkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlpZE1hcHBpbmcuYWRkR2VuZXJhdGVkVmFsdWUoKTsKLQkJaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShpZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWJhZDZiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzJfMFRlc3RzCi0JZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9NYW55TWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxJbnRlZ2VyLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QW5ub3RhdGlvblRlc3RUeXBlPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8QWRkcmVzcywgUHJvcGVydHlJbmZvPiBwYXJjZWxzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByb3BlcnR5SW5mbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgcGFyY2VsTnVtYmVyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgc2l6ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLm1hdGguQmlnRGVjaW1hbCB0YXg7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvcGVydHlJbmZvLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG1hcEtleSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCW1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZzJfMCA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZzJfMCA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJBZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gbWFueVRvTWFueU1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzQW5ub3RhdGlvbiA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24pOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYXBLZXlDbGFzc0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3NDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludFF1ZXVlIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50UXVldWUiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgam9ic01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5QcmludEpvYiIpOwotCQlNYW55VG9NYW55TWFwcGluZyBxdWV1ZXNNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJxdWV1ZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIGpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgam9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBqb2JzT3JkZXJDb2x1bW4gPSBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsgLy90aGUgam9pbiB0YWJsZSBuYW1lCi0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIHF1ZXVlc09yZGVyQ29sdW1uID0gcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlqb2JzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlxdWV1ZXNPcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJKChFbnRpdHkpIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1RIRVJfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJcXVldWVzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50UXVldWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShtYXBwZWRCeT1cInF1ZXVlc1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxQcmludFF1ZXVlPiBxdWV1ZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRKb2IuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly9qb2luIHRhYmxlIG5hbWUKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1BSSU1BUllfVEFCTEUiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5NYXBwZWRCeVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoImVtcGxveWVlcyIpOwotCQkKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3NfIiArIFRZUEVfTkFNRSwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly9qb2luIHRhYmxlIG5hbWUgb2Ygb3duaW5nIG1hbnktdG8tbWFueQotCQkKLQkJUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5BZGRyZXNzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG93bmluZ01hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5UYWJsZVJlbGF0aW9uc2hpcFN0cmF0ZWd5KSBvd25pbmdNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRTdHJhdGVneSgpKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5UYWJsZVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZQotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJMQUgiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5zdGF0ZS5mb28iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZW51bWVyYXRlZCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORywgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnVtZXJhdGVkLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoKChFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShtYW55VG9NYW55TWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBLZXlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwodGVtcG9yYWwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleVRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24gdGVtcG9yYWwgPSAoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRlbXBvcmFsLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKFRlbXBvcmFsQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUobWFueVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCWpvaW5Db2x1bW4gPSAoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygwLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJbWFueVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gCi0JCQlyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IAotCQkJcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQltYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5SZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnNJdGVyYXRvciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJbWFueVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0KLQkJbWFueVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5SZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhSm9pbkNvbHVtbnMpKTsKLQotCi0JCW1hbnlUb01hbnlNYXBwaW5nLm1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQltYW55VG9NYW55TWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJGT08iKTsKLQkJKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigyLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDIsIDAsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigwLCAxLCBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnNJdGVyYXRvciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uSXNEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydFRydWUobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKS5pc0RlZmF1bHQoKSk7Ci0KLQkJbWFueVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkSm9pbkNvbHVtbi5pc0RlZmF1bHQoKSk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Sm9pbkNvbHVtbigpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzgzNjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZElkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRGVyaXZlZElkZW50aXR5Ml8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5FbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVmVyc2lvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhTWFueVRvT25lTWFwcGluZzJfMFRlc3RzCi0JZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgR2VuZXJpY0phdmFNYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1RyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9PbmVNYXBwaW5nIG1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZyBtYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBtYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gbWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImZvbyIpOwotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRGVyaXZlZElkZW50aXR5Ml8wIGRlcml2ZWRJZGVudGl0eSA9IGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcmVkb21pbmFudERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YURlcml2ZWRJZGVudGl0eTJfMCBkZXJpdmVkSWRlbnRpdHkgPSBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlkZXJpdmVkSWRlbnRpdHkuc2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUlkTWFwcGluZyk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTWFueVRvT25lTWFwcGluZzJfMCk7CQotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YUJhc2ljTWFwcGluZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3MGRlOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRyYW5zaWVudE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5BY2Nlc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pblRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljSmF2YU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KG9ycGhhblJlbW92YWw9ZmFsc2UpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIENvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxJbnRlZ2VyLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQW5ub3RhdGlvblRlc3RUeXBlIGVtcGxveWVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxBZGRyZXNzLCBQcm9wZXJ0eUluZm8+IHBhcmNlbHM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcm9wZXJ0eUluZm8iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHBhcmNlbE51bWJlcjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBJbnRlZ2VyIHNpemU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS5tYXRoLkJpZ0RlY2ltYWwgdGF4OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByb3BlcnR5SW5mby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9WZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9JZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLnNldFNwZWNpZmllZE9yZGVyQnkoImFzZGYiKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpvaW5UYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9yZGVyQnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5zZXRTcGVjaWZpZWRPcmRlckJ5KCJhc2RmIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKb2luVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPcmRlckJ5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuc2V0U3BlY2lmaWVkT3JkZXJCeSgiYXNkZiIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSm9pblRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT3JkZXJCeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRPbmVUb01hbnlHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSkpOyAJLy8gLmdldEVsZW1lbnQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvTWFueS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0KLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55Ml8wQW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55Ml8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydFNhbWUob25lVG9NYW55TWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCQkKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCXJlc291cmNlRmllbGQuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5KTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJbWFwS2V5LnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleUFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCW1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nMl8wID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcyXzAuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nMl8wID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzQW5ub3RhdGlvbiA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24pOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5JbnRlZ2VyIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkobWFwcGVkQnk9XCJxdWV1ZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgUHJpbnRRdWV1ZSBxdWV1ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJlbXBsb3llZSIpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL293aW5nIGVudGl0eSB0YWJsZSBuYW1lCi0JCQotCQlFbnRpdHkgYWRkcmVzc0VudGl0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pblRhYmxlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly9qb2luIHRhYmxlIG5hbWUKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRGb3JlaWduS2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHNKb2luQ29sdW1uU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChKb2luQ29sdW1uUmVsYXRpb25zaGlwKSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQkoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKTsKLQotCi0JCWFzc2VydE51bGwob3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkxBSCIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgYWRkcmVzc0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBhZGRyZXNzRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfUHJvcGVydHlJbmZvIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhbm5vdGF0aW9uLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgic2l6ZSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkJCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZU1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwS2V5RW51bWVyYXRlZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnVtZXJhdGVkLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShvbmVUb01hbnlNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcEtleVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZW1wb3JhbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleVRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKFRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlqb2luQ29sdW1uID0gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbnRpdHlLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlKb2luQ29sdW1uc1NpemUoKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlvbmVUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSAKLQkJCXJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSAKLQkJCXJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5T25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpOwotCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1uUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCUl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1uc0l0ZXJhdG9yID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zSXRlcmF0b3IuaGFzTmV4dCgpKTsKLQotCi0JCW9uZVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtblJlc291cmNlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtblJlc291cmNlcy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtblJlc291cmNlcy5oYXNOZXh0KCkpOwotCi0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQotCQlvbmVUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW5SZXNvdXJjZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVudGl0eUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gamF2YUpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFKb2luQ29sdW1ucykpOwotCi0KLQkJb25lVG9NYW55TWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlvbmVUb01hbnlNYXBwaW5nLm1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFKb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgamF2YUpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqYXZhSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGphdmFKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5T25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKS5zZXROYW1lKCJGT08iKTsKLQkJKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigyLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMiwgMCwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMCwgMSwgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zSXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlqb2luQ29sdW1uc0l0ZXJhdG9yID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnNJdGVyYXRvci5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1uc0l0ZXJhdG9yLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1uc0l0ZXJhdG9yLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zSXRlcmF0b3IgPSBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnNJdGVyYXRvci5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlKb2luQ29sdW1uSXNEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW50aXR5S2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlKb2luQ29sdW1uKCkuaXNEZWZhdWx0KCkpOwotCi0JCW9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJSm9pbkNvbHVtbiBzcGVjaWZpZWRKb2luQ29sdW1uID0gb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRKb2luQ29sdW1uLmlzRGVmYXVsdCgpKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUpvaW5Db2x1bW4oKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxOGI1Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcHNJZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb09uZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQmFzaWNBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVHJhbnNpZW50QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5WZXJzaW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFPbmVUb09uZU1hcHBpbmcyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNKYXZhT25lVG9PbmVNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUob3JwaGFuUmVtb3ZhbD1mYWxzZSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEJhc2ljQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb1ZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBJZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGVkSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luQ29sdW1ucyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJam9pbkNvbHVtbnMuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmVNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5Db2x1bW5zID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlqb2luQ29sdW1ucy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbkNvbHVtbnMgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWpvaW5Db2x1bW5zLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImZvbyIpOwotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YURlcml2ZWRJZGVudGl0eTJfMCBkZXJpdmVkSWRlbnRpdHkgPSBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEuSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YURlcml2ZWRJZGVudGl0eTJfMCBkZXJpdmVkSWRlbnRpdHkgPSBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlkZXJpdmVkSWRlbnRpdHkuc2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldE51bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJCi0JCSgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RmFsc2UoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiAoKEphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lR2V0RGVmYXVsdE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmlzRGVmYXVsdE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRPbmVUb09uZUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5pc09ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJIEphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJIAotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpKTsgCS8vIC5nZXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCSAKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvT25lTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJcmVzb3VyY2VGaWVsZC5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9QcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwkKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L2phdmEvR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjRlY2FjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JEZXJpdmVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlTcGVjaWZpZWRBY2Nlc3NGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQkFTSUMsIEpQQS5UUkFOU0lFTlQsIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgidHJhbnNpZW50Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVNwZWNpZmllZEFjY2Vzc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5CQVNJQywgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQkKLQlwdWJsaWMgR2VuZXJpY0phdmFQZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5U3BlY2lmaWVkQWNjZXNzRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5U3BlY2lmaWVkQWNjZXNzUHJvcGVydHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVQZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGlkUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBpZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGlkUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZXJpdmVkSWRNYXBwaW5nSW5pdGlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckRlcml2ZWRJZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGlkID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEVxdWFscyhpZC5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlpZC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhpZC5nZXRNYXBwaW5nS2V5KCksIE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlpZC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGlkLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROb3ROdWxsKGlkLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJCi0JCWlkLmdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJaWQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoaWQuZ2V0TWFwcGluZ0tleSgpLCBNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROb3ROdWxsKGlkLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJCi0JCWlkLmdldFJlc291cmNlQXR0cmlidXRlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGlkLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWlkLmdldFJlc291cmNlQXR0cmlidXRlKCkuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGlkLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjk5N2E3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkZpZWxkQWNjZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5Qcm9wZXJ0eUFjY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotCQkJfQotCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZFByb3BlcnR5RmllbGRTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdWJUeXBlV2l0aEZpZWxkQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZVdpdGhNZXRob2RBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kRXh0ZW5kc0ltcGxlbWVudHNUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyLmphdmEiLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIiwgbmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCAiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkJCi0JcHVibGljIEdlbmVyaWNKYXZhUGVyc2lzdGVudFR5cGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc05vdGhpbmdBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NGaWVsZEFuZE1ldGhvZEFubm90YXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRBbmRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0ZpZWxkQW5ub3RhdGVkUHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQotCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1Byb3BlcnR5QW5ub3RhdGVkRmllbGRTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZFByb3BlcnR5RmllbGRTcGVjaWZpZWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlcy5uZXh0KCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5zZXRQcmltYXJ5QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCWphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0KLQkJamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NJbmhlcml0YW5jZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9CQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2UzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhNZXRob2RBbm5vdGF0aW9uKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9CQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzSW5oZXJpdGFuY2U0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JLy9pbmhlcml0ZWQgY2xhc3MgaGF2aW5nIGFubm90YXRpb25zIHNldCB3aW5zIG92ZXIgdGhlIGRlZmF1bHQgYWNjZXNzIHNldCBvbiBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc0luaGVyaXRhbmNlUGVyc2lzdGVuY2VVbml0RGVmYXVsdEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sTm9BY2Nlc3NOb0Fubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eUFjY2Vzc05vQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWVudGl0eVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZW50aXR5UGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzQWNjZXNzTm9Bbm5vdGF0aW9ucygpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbEVudGl0eVByb3BlcnR5QWNjZXNzQW5kRmllbGRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQkvL3htbCBhY2Nlc3Mgc2V0IHRvIHByb3BlcnR5LCBmaWVsZCBhbm5vdGF0aW9ucywgSmF2YVBlcnNpc3RlbnRUeXBlIGFjY2VzcyBpcyBmaWVsZAotCQlPcm1QZXJzaXN0ZW50VHlwZSBlbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5RmllbGRBY2Nlc3NBbmRQcm9wZXJ0eUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gZmllbGQsIHByb3BlcnR5IGFubm90YXRpb25zLCBKYXZhUGVyc2lzdGVudFR5cGUgYWNjZXNzIGlzIHByb3BlcnR5Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IGVudGl0eVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQotCQllbnRpdHlQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNBY2Nlc3NGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0JLy9pbmhlcml0YW5jZSB3aW5zIG92ZXIgZW50aXR5LW1hcHBpbmdzIHNwZWNpZmllZCBhY2Nlc3MKLQlwdWJsaWMgdm9pZCB0ZXN0QWNjZXNzWG1sRW50aXR5TWFwcGluZ3NBY2Nlc3NXaXRoSW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY2hpbGRFbnRpdHlQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJCi0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlID0gY2hpbGRFbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBlbnRpdHlQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFjY2Vzc1htbE1ldGFkYXRhQ29tcGxldGVGaWVsZEFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8veG1sIGFjY2VzcyBzZXQgdG8gcHJvcGVydHksIGphdmEgaGFzIGZpZWxkIGFubm90YXRpb25zIHNvIHRoZSBhY2Nlc3Mgc2hvdWxkIGJlIGZpZWxkCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGVudGl0eVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBY2Nlc3NOb1htbEFjY2Vzc1htbE1ldGRhdGFDb21wbGV0ZVByb3BlcnR5QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy94bWwgYWNjZXNzIG5vdCBzZXQsIG1ldGFkYXRhIGNvbXBsZXRlIHNldC4gIEphdmFQZXJzaXN0ZW50VHlwZSBhY2Nlc3MgaXMgcHJvcGVydHkgYmVjYXVzZSBwcm9wZXJ0aWVzIGFyZSBhbm5vdGF0ZWQKLQkJT3JtUGVyc2lzdGVudFR5cGUgZW50aXR5UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gZW50aXR5UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVXaXRoRmllbGRBbm5vdGF0aW9uKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlDbGFzc1JlZiBjbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSByb290SmF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQljbGFzc1JlZiA9IGNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSk7Ci0JCWFzc2VydE51bGwocm9vdEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3VwZXJQZXJzaXN0ZW50VHlwZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZVdpdGhGaWVsZEFubm90YXRpb24oKTsKLQkJCi0JCS8vc3VwZXIgaXMgbm90IGFkZGVkIHRvIHRoZSBnZXRQZXJzaXN0ZW5jZVVuaXQsIGJ1dCBpdCBzaG91bGQgc3RpbGwgYmUgZm91bmQKLQkJLy9hcyB0aGUgc3VwZXJQZXJzaXN0ZW50VHlwZSBiZWNhdXNlIG9mIGltcGxpZWRDbGFzc1JlZnMgYW5kIGNoYW5nZXMgZm9yIGJ1ZyAxOTAzMTcKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoamF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKSk7Ci0JfQkKLQkKLQkvL0VudGl0eSBleHRlbmRzIE5vbi1FbnRpdHkgZXh0ZW5kcyBFbnRpdHkgCi0JcHVibGljIHZvaWQgdGVzdFN1cGVyUGVyc2lzdGVudFR5cGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJQ2xhc3NSZWYgY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJY2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhyb290SmF2YVBlcnNpc3RlbnRUeXBlLCBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkpOwotCQlhc3NlcnROdWxsKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRhbmNlSGllcmFyY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVOb25QZXJzaXN0ZW50KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlUGVyc2lzdGVudEV4dGVuZHNOb25QZXJzaXN0ZW50KCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZDIiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJvb3RKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJSXRlcmF0b3I8UGVyc2lzdGVudFR5cGU+IGluaGVyaXRhbmNlSGllcmFyY2h5ID0gY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUuZ2V0SW5oZXJpdGFuY2VIaWVyYXJjaHkoKS5pdGVyYXRvcigpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhjaGlsZEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHJvb3RKYXZhUGVyc2lzdGVudFR5cGUsIGluaGVyaXRhbmNlSGllcmFyY2h5Lm5leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0YW5jZUhpZXJhcmNoeTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQljcmVhdGVUZXN0U3ViVHlwZU5vblBlcnNpc3RlbnQoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGVQZXJzaXN0ZW50RXh0ZW5kc05vblBlcnNpc3RlbnQoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQyIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY2hpbGRKYXZhUGVyc2lzdGVudFR5cGUgPSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgcm9vdEphdmFQZXJzaXN0ZW50VHlwZSA9IGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlJdGVyYXRvcjxQZXJzaXN0ZW50VHlwZT4gaW5oZXJpdGFuY2VIaWVyYXJjaHkgPSBjaGlsZEphdmFQZXJzaXN0ZW50VHlwZS5nZXRJbmhlcml0YW5jZUhpZXJhcmNoeSgpLml0ZXJhdG9yKCk7CQotCQkKLQkJYXNzZXJ0RXF1YWxzKGNoaWxkSmF2YVBlcnNpc3RlbnRUeXBlLCBpbmhlcml0YW5jZUhpZXJhcmNoeS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMocm9vdEphdmFQZXJzaXN0ZW50VHlwZSwgaW5oZXJpdGFuY2VIaWVyYXJjaHkubmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcHBpbmdLZXlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBpbmdLZXkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGluZ0tleU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZ0tleSgpKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0tleU1hcHBpbmdDaGFuZ2VJblJlc291cmNlTW9kZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLnNldFByaW1hcnlBbm5vdGF0aW9uKEVtYmVkZGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQkJCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nS2V5TWFwcGluZ0NoYW5nZUluUmVzb3VyY2VNb2RlbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLnNldFByaW1hcnlBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc01hcHBlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydFRydWUoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuaXNNYXBwZWQoKSk7Ci0JCQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk5VTExfVFlQRV9NQVBQSU5HX0tFWSk7CQotCQlhc3NlcnRGYWxzZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5pc01hcHBlZCgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkQW5kTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5nZXRBY2Nlc3NvcigpIGluc3RhbmNlb2YgRmllbGRBY2Nlc3Nvcik7Ci0JCWF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShhdHRyaWJ1dGUuZ2V0QWNjZXNzb3IoKSBpbnN0YW5jZW9mIEZpZWxkQWNjZXNzb3IpOwotCQlhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKGF0dHJpYnV0ZS5nZXRBY2Nlc3NvcigpIGluc3RhbmNlb2YgUHJvcGVydHlBY2Nlc3Nvcik7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRNZXRob2QoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlc1NpemUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZEFuZE1ldGhvZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVOYW1lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkTWV0aG9kKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKSk7Ci0JCWFzc2VydE51bGwoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImZvbyIpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU5hbWVkMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJmb28iKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW5hbWVBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCB0ZXN0VHlwZSA9IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGlkQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgaWRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgbmFtZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkKLQkJSUZpZWxkIGlkRmllbGQgPSB0ZXN0VHlwZS5maW5kUHJpbWFyeVR5cGUoKS5nZXRGaWVsZCgiaWQiKTsKLQkJaWRGaWVsZC5yZW5hbWUoImlkMiIsIGZhbHNlLCBudWxsKTsKLQkJCi0JCWF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZUF0dHJpYnV0ZTIgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWQyQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0KLQkJYXNzZXJ0Tm90U2FtZShpZEF0dHJpYnV0ZSwgaWQyQXR0cmlidXRlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZDIiLCBpZDJBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVBdHRyaWJ1dGUsIG5hbWVBdHRyaWJ1dGUyKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgbmFtZUF0dHJpYnV0ZTIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTdXBlclBlcnNpc3RlbnRUeXBlR2VuZXJpYygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0R2VuZXJpY0VudGl0eSgpOwotCQljcmVhdGVUZXN0R2VuZXJpY01hcHBlZFN1cGVyY2xhc3MoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRW50aXR5MSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkVudGl0eTIiKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkVudGl0eTEiLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdC5FbnRpdHkyIiwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0R2VuZXJpY0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEVudGl0eTEgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzIEVudGl0eTI8SW50ZWdlcj4ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbnRpdHkxLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEdlbmVyaWNNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgRW50aXR5MjxLPiB7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVudGl0eTIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjMyMjQ0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuU2VxdWVuY2VHZW5lcmF0b3IyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi0vKioKLSAqICBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY0phdmFTZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNFX0dFTkVSQVRPUl9OQU1FID0gIlRFU1RfU0VRVUVOQ0VfR0VORVJBVE9SIjsKLQotCXB1YmxpYyBHZW5lcmljSmF2YVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogY2F0YWxvZyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoU2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQkJCi0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhbm5vdGF0aW9uLnNldENhdGFsb2coInRlc3RDYXRhbG9nIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0Q2F0YWxvZyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdENhdGFsb2ciLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0Q2F0YWxvZygpKTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZENhdGFsb2coInRlc3RDYXRhbG9nIik7Ci0JCQotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RDYXRhbG9nIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0KLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZygidGVzdENhdGFsb2ciKTsKLQkJCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgID0gKChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpKS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7CQotCQlhc3NlcnRFcXVhbHMoInRlc3RDYXRhbG9nIiwgYW5ub3RhdGlvbi5nZXRDYXRhbG9nKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldENhdGFsb2coKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgdGhpcy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBpZE1hcHBpbmcuZ2V0R2VuZXJhdG9yQ29udGFpbmVyKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3IoKTsKLQotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCAgPSAoKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSkpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsJCi0JCQotCQlhbm5vdGF0aW9uLnNldFNjaGVtYSgidGVzdFNjaGVtYSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygidGVzdFNjaGVtYSIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0U2NoZW1hIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNwZWNpZmllZFNjaGVtYSgidGVzdFNjaGVtYSIpOwotCQkKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3RTY2hlbWEiLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0U2NoZW1hRnJvbVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0KLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSAgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQl0aGlzLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQkJCi0JCXRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWRTY2hlbWEoIlhNTF9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXREZWZhdWx0U2NoZW1hKCkpOwotCi0JCXRoaXMuZ2V0RW50aXR5TWFwcGluZ3MoKS5yZW1vdmVQZXJzaXN0ZW50VHlwZSgwKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJLy9kZWZhdWx0IHNjaGVtYSB0YWtlbiBmcm9tIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgbm90IGVudGl0eS1tYXBwaW5ncyBzaW5jZSB0aGUgZW50aXR5IGlzIG5vdCBpbiBhbiBvcm0ueG1sIGZpbGUKLQkJaWRNYXBwaW5nID0gKElkTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgaWRNYXBwaW5nLmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmdldFNlcXVlbmNlR2VuZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0RGVmYXVsdFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGlkTWFwcGluZy5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKCJ0ZXN0U2NoZW1hIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkICA9ICgoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKSkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwkKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0U2NoZW1hIiwgYW5ub3RhdGlvbi5nZXRTY2hlbWEoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRTcGVjaWZpZWRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogdXRpbGl0eSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlcXVlbmNlR2VuZXJhdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VRVUVOQ0VfR0VORVJBVE9SLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZT1cIiIgKyBTRVFVRU5DRV9HRU5FUkFUT1JfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9qYXZhL0dlbmVyaWNKYXZhVmVyc2lvbk1hcHBpbmcyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmQwYTRmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvamF2YS9HZW5lcmljSmF2YVZlcnNpb25NYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuQWNjZXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljSmF2YVZlcnNpb25NYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQkKLQlwdWJsaWMgR2VuZXJpY0phdmFWZXJzaW9uTWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9CYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpICgoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSAoKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBUcmFuc2llbnRNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUcmFuc2llbnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9PbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQl2ZXJzaW9uTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJdmVyc2lvbk1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCXZlcnNpb25NYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQWNjZXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZSh2ZXJzaW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCXZlcnNpb25NYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQl2ZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKFRlbXBvcmFsQ29udmVydGVyKSB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEFjY2VzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RmFsc2UodmVyc2lvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihWZXJzaW9uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihBY2Nlc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiZjdkZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBPcm1Db250ZXh0TW9kZWxUZXN0cwotCWV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoR2VuZXJpYzJfME9ybUNvbnRleHRNb2RlbFRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtQ2FzY2FkZTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1Db2xsZWN0aW9uVGFibGUyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybUVudGl0eTJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1FbWJlZGRlZE1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJpY09ybVNlcXVlbmNlR2VuZXJhdG9yMl8wVGVzdHMuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBHZW5lcmljMl8wT3JtQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y5ZjcxNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQ+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCQkKLQlwdWJsaWMgR2VuZXJpY09ybUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBvcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCi0JCW9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRGYWxzZShlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmlzRW1wdHkoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmlzRW1wdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0JCWFzc2VydE51bGwoeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxBc3NvY2lhdGlvbk92ZXJyaWRlIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKTsKLQotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IGpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbjMuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkT3ZlcnJpZGUgPSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gc3BlY2lmaWVkT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0KLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMywgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlqb2luaW5nU3RyYXRlZ3kucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSBvcm1Bc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIHNwZWNpZmllZE92ZXJyaWRlID0gb3JtQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJT3JtSm9pbkNvbHVtblJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpvaW5pbmdTdHJhdGVneSA9IHNwZWNpZmllZE92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQkKLQkJam9pbmluZ1N0cmF0ZWd5LmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWpvaW5pbmdTdHJhdGVneS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqb2luaW5nU3RyYXRlZ3kuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCWpvaW5pbmdTdHJhdGVneS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJam9pbmluZ1N0cmF0ZWd5Lm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgb3JtQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRPdmVycmlkZSA9IG9ybUFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU9ybUpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSBzcGVjaWZpZWRPdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gam9pbkNvbHVtbnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoMSwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwkJCi0JCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKGpvaW5pbmdTdHJhdGVneS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIsIG9ybUVudGl0eS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlSZWFkT25seUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShhc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5UYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJKChPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0KLQkJCi0JCUpvaW5UYWJsZSBqb2luVGFibGUgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCk7Ci0JCWpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJKChPcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlPcm1Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKE9ybU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCk7Ci0JCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuc2V0TmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEpvaW5UYWJsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NNYW55VG9NYW55KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJUmVhZE9ubHlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQotCQlWaXJ0dWFsSm9pblRhYmxlIGpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGRfQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlvcm1FbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fRk9PIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBtYXBwZWRTdXBlcmNsYXNzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpOwotCQkoKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSkgIG1hcHBlZFN1cGVyY2xhc3MuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ2FzY2FkZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ2FzY2FkZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZWM0ZmIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNhc2NhZGUyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQ2FzY2FkZTJfMFRlc3RzIGV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1DYXNjYWRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FzY2FkZURldGFjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvT25lLnNldENhc2NhZGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlQ2FzY2FkZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0RldGFjaCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgZGV0YWNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZURldGFjaCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlRGV0YWNoKCkpOwotCQkKLQkJLy9zZXQgZGV0YWNoIHRvIGZhbHNlIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb09uZS5nZXRDYXNjYWRlKCkuc2V0Q2FzY2FkZURldGFjaChmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0RldGFjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlRGV0YWNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FzY2FkZURldGFjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmUgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FzY2FkZS5pc0RldGFjaCgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRDYXNjYWRlKCkpOwotCQkKLQkJLy9zZXQgZGV0YWNoIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQljYXNjYWRlLnNldERldGFjaCh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvbmVUb09uZS5nZXRDYXNjYWRlKCkuaXNDYXNjYWRlRGV0YWNoKCkpOwotCQkKLQkJLy9zZXQgZGV0YWNoIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNhc2NhZGUuc2V0RGV0YWNoKGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYXNjYWRlLmlzRGV0YWNoKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldENhc2NhZGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwY2IxNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVVuaXF1ZUNvbnN0cmFpbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFDb2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtQ29sbGVjdGlvblRhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29sbGVjdGlvblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtQ29sbGVjdGlvblRhYmxlMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgR2VuZXJpY09ybUNvbGxlY3Rpb25UYWJsZTJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILnRvU3RyaW5nKCkpOwotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5hZGQobWFwcGluZ0ZpbGVSZWYpOwotCQlnZXRQZXJzaXN0ZW5jZVhtbFJlc291cmNlKCkuc2F2ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFN0cmluZz4gcHJvamVjdHM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbENvbGxlY3Rpb25UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicHJvamVjdHMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfcHJvamVjdHMiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGphdmFDb2xsZWN0aW9uVGFibGUgPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFDb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDQVRBTE9HIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk5BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInByb2plY3RzIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5zZXRTcGVjaWZpZWROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29fcHJvamVjdHMiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5zZXRTcGVjaWZpZWROYW1lKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXJfcHJvamVjdHMiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXJfcHJvamVjdHMiLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIHRydWUsIHdpbGwgaWdub3JlIGphdmEgYW5ub3RhdGlvbiBzZXR0aW5ncwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCS8vcmVtb3ZlIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nIGZyb20gdGhlIG9ybS54bWwgZmlsZQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgdmlydHVhbENvbGxlY3Rpb25UYWJsZSA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL3NwZWNpZmllZE5hbWUgc2luY2UgdGhpcyBpcyBhIHZpcnR1YWwgbWFwcGluZyBub3cKLQkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXJfcHJvamVjdHMiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IFNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0KLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IENhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uMi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJT3JtSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLm1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5tb3ZlKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJmb28iKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJiYXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCAgb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8WG1sVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQotCQlYbWxVbmlxdWVDb25zdHJhaW50IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMCwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJGT08iKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDEsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFSIik7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgyLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkJBWiIpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDIsIDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubW92ZSgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNGcm9tSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSB2aXJ0dWFsQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGphdmFDb2xsZWN0aW9uVGFibGUgPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWphdmFDb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygwLCAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiMGRhYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCQotCXB1YmxpYyBHZW5lcmljT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24odGFyZ2V0Q2xhc3M9U3RyaW5nLmNsYXNzLCBmZXRjaD1GZXRjaFR5cGUuRUFHRVIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLkZFVENIX1RZUEUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0cmluZz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFiYnI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJGb28iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PEZvbz4gZWxlbWVudENvbGxlY3Rpb247IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRm9vLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZU1hcHBpbmciLCBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcHBpbmdOb1VuZGVyeWxpbmdKYXZhQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHNwZWNpZmllZEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgc3BlY2lmaWVkRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgc3BlY2lmaWVkRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHNwZWNpZmllZEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIHNwZWNpZmllZEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5BZGRyZXNzIik7Ci0KLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7CQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkJBU0lDX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFkZHJlc3MiKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuTk9fVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFkZHJlc3MiKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5CQVNJQ19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlvbmVUb01hbnkuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXkoKSk7Ly9ubyBwcmltYXJ5IGtleSBvbiBhbiBlbWJlZGRhYmxlCi0JCWFzc2VydFRydWUodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgeG1sT25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoeG1sT25lVG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCB4bWxPbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQl2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TWFwS2V5Q2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROb3ROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIkludGVnZXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9IChPcmRlcmFibGUyXzApIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCW9yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlPcmRlckNvbHVtbjJfMCBvcmRlckNvbHVtbiA9IG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJb3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsT3JkZXJDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoT3JkZXJhYmxlMl8wKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPcmRlcmFibGUyXzApIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlvcmRlcmFibGUgPSAoT3JkZXJhYmxlMl8wKSB2aXJ0dWFsQ29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbFZhbHVlQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJ1YnRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDYpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCS8vbm8gbG9uZ2VyIGFuIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbENvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlPcm1Db2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbFZhbHVlQ29sdW1uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUNvbHVtbiB2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCi0JCS8vZW50aXR5IHRhYmxlIHNob3VsZCBoYXZlIG5vIGFmZmVjdCBvbiB0aGUgY29sbGVjdGlvbiB0YWJsZSBkZWZhdWx0IG5hbWUKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQlhc3NlcnRFcXVhbHMoIkpBVkFfVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IHZpcnR1YWwKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCWFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQl2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwkJCi0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMiwgMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ05vVW5kZXJ5bGluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUyID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZTMgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJLy9lbWJlZGRlZCBtYXBwaW5nIGlzIHZpcnR1YWwsIHNwZWNpZmllZCBhdHRyaWJ1dGUgb3ZlcnJpZGVzIHNob3VsZCBleGlzdAotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbHVtbiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4gPSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb2x1bW4oKTsKLQkJCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZTMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFCYXNpY01hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfU1RBVEVfQ09MVU1OIik7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX0NPTFVNTiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PX1RBQkxFIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCXZpcnR1YWxPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyBzcGVjaWZpZWQsIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBvbmUgb2YgdGhlIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyB0byBzcGVjaWZpZWQsIHZlcmlmeSBvdGhlcnMgYXJlIHN0aWxsIHZpcnR1YWwKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIHZpcnR1YWxDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIHZpcnR1YWxDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQkKLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDYpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQkKLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCS8vbm8gbG9uZ2VyIGFuIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL2VudGl0eSB0YWJsZSBzaG91bGQgaGF2ZSBubyBhZmZlY3Qgb24gdGhlIGNvbGxlY3Rpb24gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQlhc3NlcnRFcXVhbHMoIkpBVkFfVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Gb28iKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgbWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLm1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLm1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVtYmVkZGVkTWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4MmEwMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGVkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmlydHVhbEpvaW5Db2x1bW5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuUmVhZE9ubHlPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU92ZXJyaWRlUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybUVtYmVkZGVkTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVtYmVkZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiY2l0eSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9DT0xVTU5fTkFNRSA9ICJFX0NJVFkiOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERBQkxFX1RZUEVfTkFNRSA9ICJNeUVtYmVkZGFibGUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBFTUJFRERBQkxFX1RZUEVfTkFNRTsKLQotCXB1YmxpYyBHZW5lcmljT3JtRW1iZWRkZWRNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbj1AQ29sdW1uKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX0NPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkVNQkVEREVELCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiIG15RW1iZWRkZWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW1iZWRkYWJsZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKEVNQkVEREFCTEVfVFlQRV9OQU1FKS5hcHBlbmQoIiB7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgRU1CRUREQUJMRV9UWVBFX05BTUUgKyAiLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQWRkcmVzc0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzIEFkZHJlc3MgeyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29sdW1uKG5hbWU9XCJBX1NUQVRFXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBaaXBDb2RlIHppcENvZGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJaaXBDb2RlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgcGx1c2ZvdXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJaaXBDb2RlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbWJlZGRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJGb28iKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEZvbyBlbWJlZGRlZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJGb28uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZE1hcHBpbmciLCBlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWVtYmVkZGVkUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbWJlZGRlZFJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWRNYXBwaW5nIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbWJlZGRlZE1hcHBpbmcuc2V0TmFtZSgibmV3TmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld05hbWUiLCBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRW1iZWRkZWRNYXBwaW5nLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoZW1iZWRkZWRSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZW50aXR5TWFwcGluZ3MoKS5hZGRPcm1QZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0vLwkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotLy8JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBvcm1SZXNvdXJjZSgpLmdldEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLS8vCQkJCQotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZTIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGUyLnNldE5hbWUoIkJBUiIpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwkJCi0vLwkJT3JtQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUzID0gb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpOwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlMy5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUyLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUzLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoYXR0cmlidXRlT3ZlcnJpZGUsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpOwotLy8JCQotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBlbnRpdHlNYXBwaW5ncygpLmFkZE9ybVBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0vLwkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkUGVyc2lzdGVudEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZE1hcHBpbmciKTsKLS8vCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0vLwkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IG9ybVJlc291cmNlKCkuZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotLy8KLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcuYWRkU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCkuc2V0TmFtZSgiRk9PIik7Ci0vLwkJb3JtRW1iZWRkZWRNYXBwaW5nLmFkZFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKDEpLnNldE5hbWUoIkJBUiIpOwotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5hZGRTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgyKS5zZXROYW1lKCJCQVoiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoMywgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCQotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0vLwotLy8JCW9ybUVtYmVkZGVkTWFwcGluZy5yZW1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgwKTsKLS8vCQlhc3NlcnRFcXVhbHMoMSwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotLy8JCWFzc2VydEVxdWFscygiQkFaIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLS8vCQkKLS8vCQlvcm1FbWJlZGRlZE1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoMCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLS8vCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWRNYXBwaW5nIik7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZyBvcm1FbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkTWFwcGluZyIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcgb3JtRW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXROYW1lKCkpOwotCi0JCQotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMiA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyB2aXJ0dWFsLCBzcGVjaWZpZWQgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRW1iZWRkZWRNYXBwaW5nIGphdmFFbWJlZGRlZE1hcHBpbmcgPSAoSmF2YUVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDb2x1bW4oKTsKLQkJCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT09fQ09MVU1OIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCUphdmFCYXNpY01hcHBpbmcgamF2YUJhc2ljTWFwcGluZyA9IChKYXZhQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50VHlwZTIuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpOwotCQlqYXZhQmFzaWNNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1NUQVRFX0NPTFVNTiIpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJCi0JCS8vZW1iZWRkZWQgbWFwcGluZyBpcyBzcGVjaWZpZWQsIHZpcnR1YWwgYXR0cmlidXRlIG92ZXJyaWRlcyBzaG91bGQgZXhpc3QKLQkJcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZykgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TVEFURV9DT0xVTU4iLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgdmlydHVhbEVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSB2aXJ0dWFsRW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxFbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0KLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBvdmVycmlkZSA9IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJUmVhZE9ubHlDb2x1bW4gY29sdW1uID0gb3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlvdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJY29sdW1uID0gb3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQlvdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJY29sdW1uID0gb3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiQV9TVEFURSIsIGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCW92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgb3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJY29sdW1uID0gb3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIHZpcnR1YWxFbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxFbWJlZGRlZE1hcHBpbmcuZ2V0TmFtZSgpKTsKLQotCQkvL1RPRE8KLS8vCQlhc3NlcnRFcXVhbHMoNCwgb3JtRW1iZWRkZWRNYXBwaW5nLnNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKG9ybUVtYmVkZGVkTWFwcGluZy5kZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkpKTsKLS8vCQlMaXN0SXRlcmF0b3I8WG1sQXR0cmlidXRlT3ZlcnJpZGU+IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG9ybUVtYmVkZGVkTWFwcGluZy5zcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLS8vCi0vLwkJWG1sQXR0cmlidXRlT3ZlcnJpZGUgb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQlYbWxDb2x1bW4geG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgeG1sQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nIG9ybUVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtRW1iZWRkZWRNYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCS8vVE9ETwotLy8JCWFzc2VydEVxdWFscyg0LCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShvcm1FbWJlZGRlZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpKSk7Ci0vLwkJTGlzdEl0ZXJhdG9yPFhtbEF0dHJpYnV0ZU92ZXJyaWRlPiBvcm1BdHRyaWJ1dGVPdmVycmlkZXMgPSBvcm1FbWJlZGRlZE1hcHBpbmcuZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotLy8KLS8vCQlYbWxBdHRyaWJ1dGVPdmVycmlkZSBvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotLy8JCVhtbENvbHVtbiB4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB4bWxDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHhtbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLS8vLy8JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIHhtbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0vLy8vCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDYpLCB4bWxDb2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotLy8vLwkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig3KSwgeG1sQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotLy8JCQotLy8JCW9ybUF0dHJpYnV0ZU92ZXJyaWRlID0gb3JtQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgeG1sQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotLy8KLS8vCQlvcm1BdHRyaWJ1dGVPdmVycmlkZSA9IG9ybUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG9ybUF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0vLwkJeG1sQ29sdW1uID0gb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLS8vCi0vLwkJb3JtQXR0cmlidXRlT3ZlcnJpZGUgPSBvcm1BdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiemlwIiwgb3JtQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vCQl4bWxDb2x1bW4gPSBvcm1BdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLS8vCQlhc3NlcnRFcXVhbHMoInppcCIsIHhtbENvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFZlcnNpb25NYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb0Jhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RW1iZWRkZWRNYXBwaW5nQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbWJlZGRlZCIpOwotCQkKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQllbWJlZGRlZFJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgib3ZlcnJpZGUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1ZFUlJJREVfQ09MVU1OIik7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvRW1iZWRkZWRJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9ICgoRW1iZWRkZWRJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm92ZXJyaWRlIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPVkVSUklERV9DT0xVTU4iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvT25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkTW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbWJlZGRlZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRlZE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlFbWJlZGRlZE1hcHBpbmdBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtYmVkZGVkIik7Ci0JCQotCQlFbWJlZGRlZE1hcHBpbmcgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVtYmVkZGVkTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQlBdHRyaWJ1dGVPdmVycmlkZSBhdHRyaWJ1dGVPdmVycmlkZSA9IGVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJvdmVycmlkZSIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJPVkVSUklERV9DT0xVTU4iKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydEVxdWFscygiZW1iZWRkZWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWRNb3JwaFRvTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUVtYmVkZGVkTWFwcGluZ0F0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZW1iZWRkZWQiKTsKLQkJCi0JCUVtYmVkZGVkTWFwcGluZyBlbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZW1iZWRkZWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIGF0dHJpYnV0ZU92ZXJyaWRlID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIm92ZXJyaWRlIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIk9WRVJSSURFX0NPTFVNTiIpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgTWFueVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoImVtYmVkZGVkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSBhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDEsIDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwU3RyYXRlZ3kgam9pbmluZ1N0cmF0ZWd5ID0gKChWaXJ0dWFsSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJVmlydHVhbEpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhRW1iZWRkYWJsZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIGphdmFFbWJlZGRhYmxlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9KT0lOX0NPTFVNTiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxKb2luQ29sdW1uUmVsYXRpb25zaGlwKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luaW5nU3RyYXRlZ3kuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX0NPTFVNTiIsIGpvaW5pbmdTdHJhdGVneS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJiYXIiKTsJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW1iZWRkZWQgZW1iZWRkZWRSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVtYmVkZGVkcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRlZE1hcHBpbmcoKTsKLQkJY3JlYXRlRW1iZWRkYWJsZVR5cGUoKTsKLQkJY3JlYXRlQWRkcmVzc0VudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm15RW1iZWRkZWQiKTsKLQkJT3JtRW1iZWRkZWRNYXBwaW5nMl8wIGVtYmVkZGVkTWFwcGluZyA9IChPcm1FbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCUl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlYbWxFbWJlZGRlZCBlbWJlZGRlZFJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RW1iZWRkZWRzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDEsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbWJlZGRlZFJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVtYmVkZGVkIGVtYmVkZGVkUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbWJlZGRlZHMoKS5nZXQoMCk7Ci0JCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgxLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgyLCBhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVtYmVkZGVkUmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW1iZWRkZWRSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkZWRNYXBwaW5nKCk7Ci0JCWNyZWF0ZUVtYmVkZGFibGVUeXBlKCk7Ci0JCWNyZWF0ZUFkZHJlc3NFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteUVtYmVkZGVkIik7Ci0JCU9ybUVtYmVkZGVkTWFwcGluZzJfMCBlbWJlZGRlZE1hcHBpbmcgPSAoT3JtRW1iZWRkZWRNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGVkTWFwcGluZygpOwotCQljcmVhdGVFbWJlZGRhYmxlVHlwZSgpOwotCQljcmVhdGVBZGRyZXNzRW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRV8gKyAiQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibXlFbWJlZGRlZCIpOwotCQlPcm1FbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKE9ybUVtYmVkZGVkTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKSwgMSk7Ci0JCVZpcnR1YWxKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luaW5nU3RyYXRlZ3kgPSAoKFZpcnR1YWxPdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlIGpvaW5UYWJsZSA9IGpvaW5pbmdTdHJhdGVneS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFubm90YXRpb25UZXN0VHlwZV9BZGRyZXNzIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlSZWFkT25seUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJBbm5vdGF0aW9uVGVzdFR5cGVfaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCVJlYWRPbmx5Sm9pbkNvbHVtbiB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX2lkIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQW5ub3RhdGlvblRlc3RUeXBlX0FkZHJlc3MiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YUVtYmVkZGFibGUgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBqYXZhRW1iZWRkYWJsZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneSBqb2luVGFibGVTdHJhdGVneSA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJam9pblRhYmxlU3RyYXRlZ3kuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBqb2luVGFibGVTdHJhdGVneS5nZXRKb2luVGFibGUoKS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fQ09MVU1OIik7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iKTsKLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJSm9pbkNvbHVtbiBpbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZVN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJNWV9JTlZFUlNFX0pPSU5fQ09MVU1OIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJNWV9JTlZFUlNFX1JFRkVSRU5DRV9DT0xVTU4iKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUoIklOVkVSU0VfQkFSIik7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIklOVkVSU0VfQ09MVU1OX0RFRiIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWludmVyc2VKb2luQ29sdW1uLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlpbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKSwgMSk7Ci0JCWpvaW5pbmdTdHJhdGVneSA9ICgoVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGpvaW5UYWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JTlZFUlNFX0pPSU5fQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9SRUZFUkVOQ0VfQ09MVU1OIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfQkFSIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfQ09MVU1OX0RFRiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCQotCQkvL2FkZCB0aGUgamF2YSBhc3NvY2lhdGlvbiBvdmVycmlkZSBhbmQgbWFrZSBzdXJlIHRoZSBzZXR0aW5ncyBhcmUgbm90IHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFzc29jaWF0aW9uIG92ZXJyaWRlIGRlZmF1bHRzIGluIHRoZSBzcGVjaWZpZWQgb3JtIGVtYmVkZGVkIG1hcHBpbmcKLQkJSmF2YUVtYmVkZGVkTWFwcGluZzJfMCBqYXZhRW1iZWRkZWRNYXBwaW5nID0gKEphdmFFbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlMaXN0SXRlcmF0b3I8SmF2YVJlYWRPbmx5QXNzb2NpYXRpb25PdmVycmlkZT4gamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gamF2YUVtYmVkZGVkTWFwcGluZy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoKEphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSkgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gKChKYXZhT3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfRk9PIik7Ci0JCUphdmFKb2luQ29sdW1uIGphdmFKb2luQ29sdW1uID0gamF2YUpvaW5UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fQ09MVU1OX05BTUUiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkpBVkFfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGphdmFJbnZlcnNlSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWphdmFJbnZlcnNlSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRSIpOwotCQlqYXZhSW52ZXJzZUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkpBVkFfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX05BTUUiKTsKLQkJCi0KLQkJCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKSwgMSk7Ci0JCWpvaW5pbmdTdHJhdGVneSA9ICgoVmlydHVhbE92ZXJyaWRlUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKTsKLQkJam9pblRhYmxlID0gam9pbmluZ1N0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgam9pblRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSm9pbkNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCWFzc2VydEVxdWFscygxLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEludmVyc2VKb2luQ29sdW1uID0gam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lOVkVSU0VfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9JTlZFUlNFX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9CQVIiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9DT0xVTU5fREVGIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCQotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlFbWJlZGRlZE1hcHBpbmcyXzAgdmlydHVhbEVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJteUVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlvdmVycmlkZUNvbnRhaW5lciA9IHZpcnR1YWxFbWJlZGRlZE1hcHBpbmcuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCVJlYWRPbmx5Sm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kgc3RyYXRlZ3kgPSAoKFJlYWRPbmx5T3ZlcnJpZGVSZWxhdGlvbnNoaXAyXzApIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCk7Ci0JCWpvaW5UYWJsZSA9IHN0cmF0ZWd5LmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfRk9PIiwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFJlYWRPbmx5Sm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IGpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fQ09MVU1OX05BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9DT0xVTU5fUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9GT08iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJdmlydHVhbEpvaW5Db2x1bW4gPSBqb2luQ29sdW1ucy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgam9pblRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgUmVhZE9ubHlKb2luQ29sdW1uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEludmVyc2VKb2luQ29sdW1uID0gaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0lOVkVSU0VfSk9JTl9DT0xVTU5fTkFNRSIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSU5WRVJTRV9KT0lOX0NPTFVNTl9SRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9GT08iLCB2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCXZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbiA9IGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfSU5WRVJTRV9KT0lOX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0lOVkVSU0VfUkVGRVJFTkNFX0NPTFVNTiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX0JBUiIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Q3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzMigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCWN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJRW1iZWRkZWRNYXBwaW5nIGVtYmVkZGVkTWFwcGluZyA9IChFbWJlZGRlZE1hcHBpbmcpIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZW1iZWRkZWRNYXBwaW5nLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlFbWJlZGRlZE1hcHBpbmcgbmVzdGVkRW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG5lc3RlZEVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy56aXBDb2RlKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCS8vc2V0IGFuIGF0dHJpYnV0ZSBvdmVycmlkZSBvbiBBZGRyZXNzLnppcENvZGUgZW1iZWRkZWQgbWFwcGluZwotCQlBdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0JCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBjdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKLS8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZWxmUmVmZXJlbnRpYWxFbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2VsZlJlZmVyZW50aWFsRW1iZWRkZWQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Gb28iKTsKLQotCQlFbWJlZGRlZE1hcHBpbmcyXzAgZW1iZWRkZWRNYXBwaW5nID0gKEVtYmVkZGVkTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtYmVkZGVkIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbWJlZGRlZE1hcHBpbmcuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVNYXBwaW5nTmFtZXMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1FbnRpdHkyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OWZlZjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybUVudGl0eTJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbWJlZGRlZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5Mb2NrTW9kZVR5cGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTmFtZWRRdWVyeTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE5hbWVkUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQuR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBHZW5lcmljT3JtRW50aXR5Ml8wVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0JCi0JCi0JcHVibGljIEdlbmVyaWNPcm1FbnRpdHkyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSU5IRVJJVEFOQ0UsIEpQQS5JTkhFUklUQU5DRV9UWVBFLCBKUEEuT05FX1RPX09ORSwgSlBBLk1BTllfVE9fT05FLCBKUEEuT05FX1RPX01BTlksIEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRhbmNlKHN0cmF0ZWd5PUluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpIik7Ci0JCQkJc2IuYXBwZW5kKCJhYnN0cmFjdCIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoInByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzNDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJMb25nVGltZUN1c3RvbWVyIGV4dGVuZHMgQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkxvbmdUaW1lQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgTG9ja01vZGVUeXBlMl8wIGxvY2tNb2RlT2YoWG1sTmFtZWRRdWVyeSByZXNvdXJjZVF1ZXJ5KSB7Ci0JCXJldHVybiByZXNvdXJjZVF1ZXJ5ID09IG51bGwgPyBudWxsIDogTG9ja01vZGVUeXBlMl8wLmZyb21Pcm1SZXNvdXJjZU1vZGVsKHJlc291cmNlUXVlcnkuZ2V0TG9ja01vZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZE5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQlPcm1OYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkgPSAoT3JtTmFtZWRRdWVyeTJfMCkgb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCW5hbWVkUXVlcnkuc2V0TmFtZSgiRk9PIik7Ci0JCQluYW1lZFF1ZXJ5LnNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDKTsKLQkJCQotCQlYbWxOYW1lZFF1ZXJ5IHJlc291cmNlUXVlcnkgPSBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgdGhpcy5sb2NrTW9kZU9mKHJlc291cmNlUXVlcnkpKTsKLQkJCi0JCU9ybU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTIgPSAoT3JtTmFtZWRRdWVyeTJfMCkgb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJCW5hbWVkUXVlcnkyLnNldE5hbWUoIkJBUiIpOwotCQkJbmFtZWRRdWVyeTIuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLlJFQUQpOwotCi0JCXJlc291cmNlUXVlcnkgPSBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHJlc291cmNlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuUkVBRCwgdGhpcy5sb2NrTW9kZU9mKHJlc291cmNlUXVlcnkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCU9ybU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTMgPSAoT3JtTmFtZWRRdWVyeTJfMCkgb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgxKTsKLQkJCW5hbWVkUXVlcnkzLnNldE5hbWUoIkJBWiIpOwotCQkJbmFtZWRRdWVyeTMuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLldSSVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCXJlc291cmNlUXVlcnkgPSBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuV1JJVEUsIHRoaXMubG9ja01vZGVPZihyZXNvdXJjZVF1ZXJ5KSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkyLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnkzLCBuYW1lZFF1ZXJpZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5hbWVkUXVlcnksIG5hbWVkUXVlcmllcy5uZXh0KCkpOwotCQkKLQkJbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlPcm1OYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkxID0gKE9ybU5hbWVkUXVlcnkyXzApIG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7Ci0JCQluYW1lZFF1ZXJ5MS5zZXROYW1lKCJCQVIiKTsKLQkJCW5hbWVkUXVlcnkxLnNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC5SRUFEKTsKLQkKLQkJCU9ybU5hbWVkUXVlcnkyXzAgbmFtZWRRdWVyeTIgPSAoT3JtTmFtZWRRdWVyeTJfMCkgb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgyKTsKLQkJCW5hbWVkUXVlcnkyLnNldE5hbWUoIkJBWiIpOwotCQkJbmFtZWRRdWVyeTIuc2V0U3BlY2lmaWVkTG9ja01vZGUoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMpOwotCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMywgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuc2l6ZSgpKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQlYbWxOYW1lZFF1ZXJ5IHhtbFF1ZXJ5MCA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgeG1sUXVlcnkwLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLlJFQUQsIHRoaXMubG9ja01vZGVPZih4bWxRdWVyeTApKTsKLQkKLQkJWG1sTmFtZWRRdWVyeSB4bWxRdWVyeTEgPSBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHhtbFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCB0aGlzLmxvY2tNb2RlT2YoeG1sUXVlcnkxKSk7Ci0KLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkucmVtb3ZlTmFtZWRRdWVyeSgwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCXhtbFF1ZXJ5MCA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgeG1sUXVlcnkwLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIHRoaXMubG9ja01vZGVPZih4bWxRdWVyeTApKTsKLQkJCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLnJlbW92ZU5hbWVkUXVlcnkoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZU5hbWVkUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIHBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5hZGROYW1lZFF1ZXJ5KDApLnNldE5hbWUoIkZPTyIpOwotCQlPcm1OYW1lZFF1ZXJ5Ml8wIG5hbWVkUXVlcnkxID0gKE9ybU5hbWVkUXVlcnkyXzApIG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmFkZE5hbWVkUXVlcnkoMSk7Ci0JCQluYW1lZFF1ZXJ5MS5zZXROYW1lKCJCQVIiKTsKLQkJCW5hbWVkUXVlcnkxLnNldFNwZWNpZmllZExvY2tNb2RlKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDKTsKLQkJb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtTmFtZWRRdWVyeT4gbmFtZWRRdWVyaWVzID0gb3JtRW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuZ2V0TmFtZWRRdWVyaWVzKCkuaXRlcmF0b3IoKTsKLQkJbmFtZWRRdWVyeTEgPSAoT3JtTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlYbWxOYW1lZFF1ZXJ5IHhtbFF1ZXJ5MCA9IGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgwKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgeG1sUXVlcnkwLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIHRoaXMubG9ja01vZGVPZih4bWxRdWVyeTApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLm1vdmVOYW1lZFF1ZXJ5KDAsIDEpOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJbmFtZWRRdWVyeTEgPSAoT3JtTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCVhtbE5hbWVkUXVlcnkgeG1sUXVlcnkxID0gZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDEpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB4bWxRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgdGhpcy5sb2NrTW9kZU9mKHhtbFF1ZXJ5MSkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTmFtZWRRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBwZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE5hbWVkUXVlcnkoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxOYW1lZFF1ZXJ5KCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTmFtZWRRdWVyeSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCVhtbE5hbWVkUXVlcnkgeG1sUXVlcnkgPSBlbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5nZXQoMik7Ci0JCQl4bWxRdWVyeS5zZXROYW1lKCJCQVoiKTsKLQkJCXhtbFF1ZXJ5LnNldExvY2tNb2RlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5Mb2NrTW9kZVR5cGVfMl8wLk9QVElNSVNUSUMpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybU5hbWVkUXVlcnk+IG5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJT3JtTmFtZWRRdWVyeTJfMCBuYW1lZFF1ZXJ5MSA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5tb3ZlKDIsIDApOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJbmFtZWRRdWVyeTEgPSAoT3JtTmFtZWRRdWVyeTJfMCkgbmFtZWRRdWVyaWVzLm5leHQoKTsKLQkJCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeTEuZ2V0TmFtZSgpKTsKLQkJCWFzc2VydEVxdWFscyhMb2NrTW9kZVR5cGUyXzAuT1BUSU1JU1RJQywgbmFtZWRRdWVyeTEuZ2V0TG9ja01vZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbmFtZWRRdWVyaWVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lZFF1ZXJpZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldE5hbWVkUXVlcmllcygpLm1vdmUoMCwgMSk7Ci0JCW5hbWVkUXVlcmllcyA9IG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCk7Ci0JCW5hbWVkUXVlcnkxID0gKE9ybU5hbWVkUXVlcnkyXzApIG5hbWVkUXVlcmllcy5uZXh0KCk7Ci0JCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkxLmdldE5hbWUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTG9ja01vZGVUeXBlMl8wLk9QVElNSVNUSUMsIG5hbWVkUXVlcnkxLmdldExvY2tNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcmllcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQluYW1lZFF1ZXJ5MSA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJpZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVkUXVlcmllcy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtRW50aXR5LmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFF1ZXJpZXNTaXplKCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0TmFtZWRRdWVyaWVzKCkucmVtb3ZlKDEpOwotCQluYW1lZFF1ZXJpZXMgPSBvcm1FbnRpdHkuZ2V0UXVlcnlDb250YWluZXIoKS5nZXROYW1lZFF1ZXJpZXMoKS5pdGVyYXRvcigpOwotCQluYW1lZFF1ZXJ5MSA9IChPcm1OYW1lZFF1ZXJ5Ml8wKSBuYW1lZFF1ZXJpZXMubmV4dCgpOwotCQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5MS5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKExvY2tNb2RlVHlwZTJfMC5PUFRJTUlTVElDLCBuYW1lZFF1ZXJ5MS5nZXRMb2NrTW9kZSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZWRRdWVyaWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UXVlcmllc1NpemUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXROYW1lZFF1ZXJpZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybUVudGl0eS5nZXRRdWVyeUNvbnRhaW5lcigpLmdldE5hbWVkUXVlcmllcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRRdWVyaWVzU2l6ZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCWVudGl0eS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQkKLQkJb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IG9ybUVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOwotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBhYnN0cmFjdEVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uc1RhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gb3JtRW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJT3JtRW50aXR5IGFic3RyYWN0RW50aXR5ID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOwotCQlvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotLy9UT0RPCi0vLwlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLS8vCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotLy8JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLS8vCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCQotLy8JCUl0ZXJhdG9yPFBlcnNpc3RlbnRBdHRyaWJ1dGU+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5hbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzID0gb3JtRW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IGVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBlbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDEsIDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCi0JCU9ybU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChPcm1NYXBwZWRTdXBlcmNsYXNzKSBvcm1FbnRpdHkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc0VudGl0eUhpZXJhY2h5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQotCQlPcm1FbnRpdHkgc3VwZXJjbGFzcyA9IChPcm1FbnRpdHkpIG9ybUVudGl0eS5nZXRQYXJlbnRFbnRpdHkoKTsKLQkJCi0JCXN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQmFzaWNNYXBwaW5nIGlkTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHN1cGVyY2xhc3MuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZW50aXR5LmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLS8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcyA9IG9ybUVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIHhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQl4bWxBc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMSwgMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuaXNFbXB0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotLy8KLS8vCQkvL01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0vLwkJLy9CYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5wZXJzaXN0ZW50VHlwZSgpLmF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGVudGl0eVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0vLwkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLS8vCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuZ2V0QW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdHlwZVJlc291cmNlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJLy9hZGQgdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyg1LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDEsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0KLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDAsIDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDAsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgxLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMiwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm1vdmUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVJc1ZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGUgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKE9ybUVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIGN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuWmlwQ29kZSIpOwotCi0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5zdHJlZXQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy5jaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS56aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCQotCQl6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCWFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9ICgoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSAoKE9ybUVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldE92ZXJyaWRlTmFtZWQoInBsdXNmb3VyIikpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCTEFIX1RBQkxFX09WRVJSSURFIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIik7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoT3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCS8vVE9ETyBJIGhhdmUgdGhlIGRlZmF1bHQgd3JvbmcgaW4gdGhpcyBjYXNlLCBidXQgdGhpcyB3YXMgd3JvbmcgYmVmb3JlIGFzIHdlbGwuICBOZWVkIHRvIGZpeCB0aGlzIGxhdGVyCi0vLwkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiQ3VzdG9tZXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2Uuc2V0Q2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gKFBlcnNpc3RlbmNlVW5pdDJfMCkgZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWFzc2VydEVxdWFscyhTaGFyZWRDYWNoZU1vZGUuVU5TUEVDSUZJRUQsIHBlcnNpc3RlbmNlVW5pdDJfMC5nZXRTaGFyZWRDYWNoZU1vZGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGVGcm9tU3VwZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IChQZXJzaXN0ZW5jZVVuaXQyXzApIGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBqYXZhQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSAoUGVyc2lzdGVuY2VVbml0Ml8wKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCS8vVGhpcyBpcyBhIHRlc3QgZm9yIGJ1ZyAzMDE4OTIKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQkKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCVhtbEFzc29jaWF0aW9uT3ZlcnJpZGVfMl8wIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoKFhtbEFzc29jaWF0aW9uT3ZlcnJpZGUpIHJlc291cmNlQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCSgoWG1sQXNzb2NpYXRpb25PdmVycmlkZSkgcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlKS5zZXROYW1lKCJhIik7Ci0JCQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBlbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImEiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlYbWxKb2luVGFibGUgcmVzb3VyY2VKb2luVGFibGUgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKTsKLQkJcmVzb3VyY2VBc3NvY2lhdGlvbk92ZXJyaWRlLnNldEpvaW5UYWJsZShyZXNvdXJjZUpvaW5UYWJsZSk7Ci0JCXJlc291cmNlSm9pblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlYbWxKb2luQ29sdW1uIHJlc291cmNlSm9pbkNvbHVtbiA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKTsKLQkJcmVzb3VyY2VKb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuYWRkKHJlc291cmNlSm9pbkNvbHVtbik7Ci0JCXJlc291cmNlSm9pbkNvbHVtbi5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gZW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKS5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlKb2luVGFibGUgam9pblRhYmxlID0gKChPcm1PdmVycmlkZVJlbGF0aW9uc2hpcDJfMCkgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhYzRjZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLk51bGxPcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYW55VG9NYW55XzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb01hbnlNYXBwaW5nMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljT3JtTWFueVRvTWFueU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGZvbzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBKUEEuT1JERVJfQlksIEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQsIEpQQS5FTlVNX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckJ5KFwiY2l0eVwiIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFwS2V5RW51bWVyYXRlZChFbnVtVHlwZS5TVFJJTkcpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW1hbnlUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldEN1c3RvbU1hcEtleSh0cnVlKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSB4bWxNYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxNYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIHhtbE1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxNYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQl2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQltYW55VG9NYW55LnNldE1hcEtleUNsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROb3ROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCW1hbnlUb01hbnkuc2V0TWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBwayBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJbnRlZ2VyIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlqb2JzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJam9ic01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJxdWV1ZXMiKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAicXVldWVzIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIHF1ZXVlc01hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIHF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIHF1ZXVlc09yZGVyQ29sdW1uID0gcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJCi0JCWpvYnNPcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCXF1ZXVlc09yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJam9ic09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkKLQkJKChFbnRpdHkpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkoKEVudGl0eSkgcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPVEhFUl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlxdWV1ZXNNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJxdWV1ZXMiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIGpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgam9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCWpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUyID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxKb2JzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJam9ic09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSB2aXJ0dWFsSm9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCXF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlMiA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInF1ZXVlcyIpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsUXVldWVzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgdmlydHVhbFF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcmRlcmFibGUyXzApIGphdmFKb2JzTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhUXVldWVzTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQlqYXZhUXVldWVzTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSk9JTl9UQUJMRSIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKT0lOX1RBQkxFIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50UXVldWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShtYXBwZWRCeT1cInF1ZXVlc1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PHRlc3QuUHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludEpvYiIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PHRlc3QuUHJpbnRRdWV1ZT4gcXVldWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUgQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUob3JtQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0U2NhbGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NSksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDYpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ3KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCi0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUsIG9ybS54bWwgdmlydHVhbCBjb2x1bW4gaWdub3JlcyBqYXZhIGNvbHVtbiBhbm5vdGF0aW9uCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCS8vbm8gbG9uZ2VyIGFuIGVsZW1lbnQgY29sbGVjdGlvbiBtYXBwaW5nCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwkJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUoSW50ZWdlci52YWx1ZU9mKDQ3KSk7Ci0KLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUNvbHVtbiBjb2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIGNoYW5nZXMgdGhlIGpvaW4gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgamF2YU1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL21ha2UgbmFtZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgdmlydHVhbAotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQkJYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJY29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgY29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgdmlydHVhbEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRFbnVtVHlwZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQl2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlNYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkgaW5zdGFuY2VvZiBOdWxsT3JtQ29udmVydGVyKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRUcnVlKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFueVRvTWFueVJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiTWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkKLQkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiTWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkKLQkJbWFueVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJNYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCi0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueV8yXzAgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMiA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjIsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMywgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4sIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCQotCQlqb2luQ29sdW1ucyA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55XzJfMCBtYW55VG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1NYW55VG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLm1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDAsIDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJtYW55VG9NYW55TWFwcGluZyIpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQotCQltYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQkKLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQltYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCW1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkubW92ZSgyLCAwKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQltYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5yZW1vdmUoMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE3ODg0Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtTWFueVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhc2NhZGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1EZXJpdmVkSWRlbnRpdHkyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0LkdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpY09ybU1hbnlUb09uZU1hcHBpbmcyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1NYW55VG9PbmVNYXBwaW5nMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgbWFueVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sRGVyaXZlZElkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUoZmFsc2UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYXBzSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxNYXBzSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGVyaXZlZElkZW50aXR5Ml8wIGRlcml2ZWRJZGVudGl0eSA9IGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc01hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtRGVyaXZlZElkZW50aXR5Ml8wIGRlcml2ZWRJZGVudGl0eSA9IGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCQotCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYW55VG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0TWFwc0lkKCJmb28iKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKCgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlT25lVG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVzb3VyY2VNYW55VG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBqYXZhTWFueVRvT25lTWFwcGluZyA9ICgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCkpOwotCQlNYW55VG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGUgPSAoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCUpvaW5Db2x1bW4gdmlydHVhbEludmVyc2VKb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJSmF2YUpvaW5UYWJsZSBqYXZhSm9pblRhYmxlID0gKChKYXZhTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJDQVRBTE9HIik7Ci0JCWphdmFKb2luVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJTQ0hFTUEiKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk5BTUUiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRkVSRU5DRURfTkFNRSIpOwotCQlKYXZhSm9pbkNvbHVtbiBpbnZlcnNlSmF2YUpvaW5Db2x1bW4gPSBqYXZhSm9pblRhYmxlLmFkZFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uKDApOwotCQlpbnZlcnNlSmF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiSU5WRVJTRV9OQU1FIik7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDQVRBTE9HIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCXZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk5BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQl2aXJ0dWFsSW52ZXJzZUpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfTkFNRSIsIHZpcnR1YWxJbnZlcnNlSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEludmVyc2VKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0TmFtZUZyb21KYXZhVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hbnlUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJT3JtSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9ICgoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHRhcmdldFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkoKEphdmFFbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoSmF2YUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgamF2YU1hbnlUb09uZU1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuZ2V0TWFwcGluZygpOwotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSk9JTl9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlIHRvIHRydWUsIHdpbGwgaWdub3JlIGphdmEgYW5ub3RhdGlvbiBzZXR0aW5ncwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCS8vcmVtb3ZlIG0tbSBtYXBwaW5nIGZyb20gdGhlIG9ybS54bWwgZmlsZQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJLy9vcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nMl8wKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUpvaW5UYWJsZSB2aXJ0dWFsSm9pblRhYmxlID0gKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ly9zcGVjaWZpZWROYW1lIHNpbmNlIHRoaXMgaXMgYSB2aXJ0dWFsIG1hcHBpbmcgbm93Ci0KLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXZpcnR1YWxKb2luVGFibGUgPSAoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZSk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQl2aXJ0dWFsSm9pblRhYmxlID0gKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRV9OQU1FIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKE9ybUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQVJHRVQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfTkFNRV9PUk1fVEFSR0VUIiwgdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlNYW55VG9PbmVNYXBwaW5nIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPcm1NYW55VG9PbmVNYXBwaW5nIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0RGVmYXVsdEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtTWFueVRvT25lTWFwcGluZy5pc0RlZmF1bHRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDc4NWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvTWFueU1hcHBpbmcyXzBUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnVtZXJhdGVkQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGExLmNvbnRleHQub3JtLk51bGxPcm1Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PbmVUb01hbnlNYXBwaW5nMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBHZW5lcmljT3JtT25lVG9NYW55TWFwcGluZzJfMFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlN0YXRlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFiYnI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCwgSlBBLkVOVU1fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBvcnBoYW5SZW1vdmFsID0gdHJ1ZSwgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNILCBDYXNjYWRlVHlwZS5ERVRBQ0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYXBLZXlFbnVtZXJhdGVkKEVudW1UeXBlLlNUUklORykiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUubmFtZSIpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5uYW1lIik7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQlwcml2YXRlIE9ybU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7Ci0JCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvTWFueU1hcHBpbmcpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvTWFueU1hcHBpbmcpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJb25lVG9NYW55LnNldE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0Q3VzdG9tTWFwS2V5KHRydWUpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoImNpdHkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9uZVRvTWFueS5nZXRNYXBLZXkoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvTWFueS5zZXRNYXBLZXlDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJb25lVG9NYW55LnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IG9uZVRvTWFueSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKCJxdWV1ZSIpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJb3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSAoT3JtUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxPcmRlckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJqb2JzIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpOwotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk9ORV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueShtYXBwZWRCeT1cInF1ZXVlXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJDb2x1bW4iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8UHJpbnRKb2I+IGpvYnM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRRdWV1ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19PTkUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBQcmludFF1ZXVlIHF1ZXVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50Sm9iLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsQWRkcmVzc2VzTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IHZpcnR1YWxBZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0NSwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg0NiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg0NywgdmlydHVhbENvbHVtbi5nZXRTY2FsZSgpKTsKLQotCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxBZGRyZXNzZXNNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHZpcnR1YWxDb2x1bW4gPSB2aXJ0dWFsQWRkcmVzc2VzTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCS8vZW50aXR5IHRhYmxlIGNoYW5nZXMgdGhlIGpvaW4gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiB0YWJsZSBlbGVtZW50IGluIEphdmEKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSkFWQV9KT0lOX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9KT0lOX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9tYWtlIG5hbWUgcGVyc2lzdGVudCBhdHRyaWJ1dGUgbm90IHZpcnR1YWwKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBzcGVjaWZpZWRBZGRyZXNzZXNNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIHNwZWNpZmllZENvbHVtbiA9IHNwZWNpZmllZEFkZHJlc3Nlc01hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydE51bGwoc3BlY2lmaWVkQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9BZGRyZXNzIiwgc3BlY2lmaWVkQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0Rm9yZWlnbktleUpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3Rlc3QgdmlydHVhbCBvcm0gbWFwcGluZywgc2V0dGluZyB0aGUgam9pbiBjb2x1bW4gb24gdGhlIGphdmEgbWFwcGluZwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJyID0gKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCXJyLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uID0gcnIuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsJCQotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJLy9vdmVycmlkZSB0aGUgbWFwcGluZyBpbiBvcm0ueG1sCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlyciA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCWFzc2VydEZhbHNlKHJyLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCi0JCXJyLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWpvaW5Db2x1bW4gPSByci5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwkJCi0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCU9ybUVudGl0eSBvcm1BZGRyZXNzRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlvcm1BZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19pZCIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3Rlc3QgdmlydHVhbCBvcm0gbWFwcGluZywgc2V0dGluZyB0aGUgam9pbiBjb2x1bW4gb24gdGhlIGphdmEgbWFwcGluZwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJyID0gKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCXJyLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJSmF2YUVudGl0eSBhZGRyZXNzRW50aXR5ID0gKEphdmFFbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCS8vb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW4gb3JtLnhtbAotCQlwZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJcnIgPSAoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlhc3NlcnRGYWxzZShyci5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQotCQlyci5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJT3JtRW50aXR5IG9ybUFkZHJlc3NFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX0FERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCS8vdGFyZ2V0IGZvcmVpZ24ga2V5IGNhc2UKLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0c0pvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3Rlc3QgdmlydHVhbCBvcm0gbWFwcGluZywgc2V0dGluZyB0aGUgam9pbiBjb2x1bW4gb24gdGhlIGphdmEgbWFwcGluZwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJyID0gKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCXJyLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKTsKLQotCQlhc3NlcnROdWxsKG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlKYXZhRW50aXR5IGFkZHJlc3NFbnRpdHkgPSAoSmF2YUVudGl0eSkgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9vdmVycmlkZSB0aGUgbWFwcGluZyBpbiBvcm0ueG1sCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCW9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlyciA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCWFzc2VydEZhbHNlKHJyLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCi0JCXJyLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEZhbHNlKCgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlvcmRlckNvbHVtbiA9ICgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpOwotCi0JCWFzc2VydE51bGwob3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlPcm1FbnRpdHkgb3JtQWRkcmVzc0VudGl0eSA9IChPcm1FbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJb3JtQWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldEVudW1UeXBlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRUcnVlKCgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKS5pc09ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoInRlc3QuQWRkcmVzcyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkgaW5zdGFuY2VvZiBOdWxsT3JtQ29udmVydGVyKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUob3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoKChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnlfMl8wIG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55XzJfMCBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55XzJfMCBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtT25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtT25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5yZW1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnJlbW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygxLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcucmVtb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuYWRkU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtT25lVG9NYW55TWFwcGluZy5hZGRTcGVjaWZpZWRNYXBLZXlKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmFkZFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcubW92ZVNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtT25lVG9NYW55TWFwcGluZy5tb3ZlU3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXlKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnlfMl8wIG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJCi0JCW9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQlvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBKb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5Sm9pbkNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQlqb2luQ29sdW1ucyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkubW92ZSgwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUpvaW5Db2x1bW5zKCkucmVtb3ZlKDApOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDE5NWYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybU9uZVRvT25lTWFwcGluZzJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FzY2FkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybURlcml2ZWRJZGVudGl0eTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbERlcml2ZWRJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE1hcHNJZF8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cwotCWV4dGVuZHMgR2VuZXJpYzJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEdlbmVyaWNPcm1PbmVUb09uZU1hcHBpbmcyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgb3JwaGFuUmVtb3ZhbCA9IHRydWUsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0VmFsdWUodHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiIik7Ci0JCWFzc2VydEVxdWFscygiIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCIiKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1EZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5ID0gY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNOdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFByZWRvbWluYW50RGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1EZXJpdmVkSWRlbnRpdHkyXzAgZGVyaXZlZElkZW50aXR5ID0gY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0VHJ1ZShkZXJpdmVkSWRlbnRpdHkudXNlc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKSk7Ci0JCWFzc2VydEZhbHNlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQkKLQkJZGVyaXZlZElkZW50aXR5LnNldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRGYWxzZShkZXJpdmVkSWRlbnRpdHkudXNlc051bGxEZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJCi0JCWRlcml2ZWRJZGVudGl0eS5zZXROdWxsRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpKTsKLQkJYXNzZXJ0RmFsc2UoZGVyaXZlZElkZW50aXR5LnVzZXNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCQlhc3NlcnRUcnVlKGRlcml2ZWRJZGVudGl0eS51c2VzTnVsbERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQkKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCXJlc291cmNlT25lVG9PbmUuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbCgoKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlT25lVG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBvbmVUb09uZU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCXByaXZhdGUgT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nKSB7Ci0JCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9ybU9uZVRvT25lTWFwcGluZyk7Ci0JCVhtbE9uZVRvT25lIG9uZVRvT25lUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvT25lUmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQotCQlvbmVUb09uZVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb09uZU1hcHBpbmcpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgamF2YU9uZVRvT25lTWFwcGluZyA9ICgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKSk7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvT25lTWFwcGluZyA9IChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9pZCIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJSm9pbkNvbHVtbiBpbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc19pZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9ICgoSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGludmVyc2VKYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJJTlZFUlNFX05BTUUiKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNBVEFMT0ciLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiU0NIRU1BIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJb3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWludmVyc2VPcm1Kb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlZFUlNFX05BTUUiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfUkVGRVJFTkNFRF9OQU1FIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSAoKE9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCSgoSmF2YUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsQXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSB2aXJ0dWFsQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSm9pblRhYmxlIHZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL3NwZWNpZmllZE5hbWUgc2luY2UgdGhpcyBpcyBhIHZpcnR1YWwgbWFwcGluZyBub3cKLQotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCXZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFX05BTUUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfTkFNRV9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBUkdFVCIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX09STV9UQVJHRVQiLCB2aXJ0dWFsSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvUHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwkKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBwZWRCeSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5zZXRKb2luVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pblRhYmxlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPbmVUb09uZU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gCi0JCQl2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9SRUZFUkVOQ0VEX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRUcnVlKCgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdmlydHVhbE9uZVRvT25lTWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT25lVG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBpbiB4bWwgb25lLXRvLW9uZQotLy8JCVhtbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydEZhbHNlKCgoT3JtT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb3JtT25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBiZjNlOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuanBhMS5jb250ZXh0LmphdmEuR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMKLQlleHRlbmRzIEdlbmVyaWMyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHVibGljIEdlbmVyaWNPcm1QZXJzaXN0ZW50QXR0cmlidXRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5JRCwgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZE5hbWVGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRXaXRoQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCksIDEpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZU51bGxBdHRyaWJ1dGVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJLy90YWtlIGEgdmlydHVhbCBtYXBwaW5nIHdpdGggYSBtYXBwaW5nIHR5cGUgYW5kIG1ha2UgaXQgc3BlY2lmaWVkCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgR2VuZXJpY0phdmFOdWxsQXR0cmlidXRlTWFwcGluZyk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtT25lVG9PbmVNYXBwaW5nKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJSXRlcmF0b3I8T3JtUGVyc2lzdGVudEF0dHJpYnV0ZT4gc3BlY2lmaWVkQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9ybUlkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsTm9VbmRlcmx5aW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgibm9KYXZhQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZTIoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCQotCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUmVzb3VyY2VBdHRyaWJ1dGUuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUpOwotCQkKLQkJCi0JCS8vc3BlY2lmaWVkIG9ybSBhdHRyaWJ1dGUsIGFjY2VzcyB0eXBlIG1hdGNoZXMgamF2YSA6IEZJRUxELCBuYW1lIG1hdGNoZXMgamF2YQotCQkvL2phdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNob3VsZCBiZSA9PSB0byBqYXZhIGNvbnRleHQgbW9kZWwgb2JqZWN0Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkKLQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBqYXZhIGFjY2VzcyB0eXBlIEZJRUxELCBvcm0gYWNjZXNzIHR5cGUgUFJPUEVSVFksIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vdmVyaWZ5IGJvdGggdGhlIHByb3BlcnR5IGphdmEgcmVzb3VyY2UgYXR0cmlidXRlIGFuZCB0aGUgZmllbGQgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgYXJlIHVzZWQgaW4gb3JtCi0JCS8vYmVjYXVzZSB0aGUgZmllbGQgaXMgYW5ub3RhdGVkIGFuZCBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkRmllbGRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGlkUHJvcGVydHlBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGlkRmllbGRBdHRyaWJ1dGUpOwotCQlhc3NlcnROb3RTYW1lKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIGlkUHJvcGVydHlBdHRyaWJ1dGUpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gaWRQcm9wZXJ0eUF0dHJpYnV0ZTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBpZEZpZWxkQXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlqYXZhUmVzb3VyY2VBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGphdmFSZXNvdXJjZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRUeXBlLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRNZXRob2RzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOy8vZGVmYXVsdCBhY2Nlc3Mgd2lsbCBiZSBmaWVsZAotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7CQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZDIiKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZSgiaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlTWl4ZWRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybUZpZWxkQXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1GaWVsZEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRPd25pbmdQZXJzaXN0ZW50VHlwZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1GaWVsZEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUob3JtUHJvcGVydHlBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtRmllbGRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCQotCQlvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUHJvcGVydHlBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJCi0JCSgoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3JtUHJvcGVydHlBdHRyaWJ1dGUpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJb3JtUHJvcGVydHlBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUHJvcGVydHlBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzUHJvcGVydHlJbkphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZ1Byb3BlcnR5QWNjZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2Vzc1Byb3BlcnR5SW5KYXZhMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJuYW1lIik7Ci0JCQotCQlhc3NlcnRUcnVlKG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0KLQkJCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCQotCQluYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpOwotCQlhc3NlcnRGYWxzZShuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgbmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhuYW1lSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RmFsc2Uob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCi0JCWFzc2VydEZhbHNlKG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgbmFtZU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBuYW1lT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG5hbWVKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUobmFtZUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzMmFhMjguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9vcm0vR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1QZXJzaXN0ZW50VHlwZTJfMFRlc3RzCi0JZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsJCi0KLQlwdWJsaWMgR2VuZXJpY09ybVBlcnNpc3RlbnRUeXBlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLQkJCX0KLQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTmFtZUZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGaWVsZFNwZWNpZmllZFByb3BlcnR5QW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEpQQS5JRCwgSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5UHJvcGVydHlTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5BQ0NFU1MsIEpQQTJfMC5BQ0NFU1NfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzV2l0aEphdmFBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzV2l0aEphdmFBbm5vdGF0aW9uc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZFByb3BlcnR5U3BlY2lmaWVkKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJCi0JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzMygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5RmllbGRTcGVjaWZpZWRQcm9wZXJ0eUFubm90YXRlZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCB2aXJ0dWFsQXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCB2aXJ0dWFsQXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgdmlydHVhbEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQkKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgc3BlY2lmaWVkQXR0cmlidXRlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCQotCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCB2aXJ0dWFsQXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLQkJCi0JCWphdmFQZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQkKLQkJamF2YVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L29ybS9HZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdlMTMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvb3JtL0dlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LlNlcXVlbmNlR2VuZXJhdG9yMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sU2VxdWVuY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5HZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLS8qKgotICogIEdlbmVyaWMyXzBPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWNPcm1TZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzCi0JZXh0ZW5kcyBHZW5lcmljMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXB1YmxpYyBHZW5lcmljT3JtU2VxdWVuY2VHZW5lcmF0b3IyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFNlcXVlbmNlR2VuZXJhdG9yKDApOwkJCi0JCVhtbFNlcXVlbmNlR2VuZXJhdG9yIHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFNlcXVlbmNlR2VuZXJhdG9ycygpLmdldCgwKTsKLQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2Uuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZygiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBzY2hlbWEgKioqKioqKioqKgotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMCBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMCkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigwKTsJCQotCQlYbWxTZXF1ZW5jZUdlbmVyYXRvciBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRTZXF1ZW5jZUdlbmVyYXRvcnMoKS5nZXQoMCk7Ci0KLQkJLy9zZXQgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5zZXRTY2hlbWEoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZS5nZXRTY2hlbWEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzAgc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzApIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkU2VxdWVuY2VHZW5lcmF0b3IoMCk7CQkKLQkJWG1sU2VxdWVuY2VHZW5lcmF0b3Igc2VxdWVuY2VHZW5lcmF0b3JSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0U2VxdWVuY2VHZW5lcmF0b3JzKCkuZ2V0KDApOwotCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvclJlc291cmNlLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yUmVzb3VyY2UuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wQ29ubmVjdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBDb25uZWN0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkxM2I5ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBDb25uZWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5jb25uZWN0aW9uLkpwYUNvbm5lY3Rpb24yXzA7Ci0KLS8qKgotICogIEdlbmVyaWNDb25uZWN0aW9uMl8wVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJpYzJfMENvbm5lY3Rpb25UZXN0cyBleHRlbmRzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cwotewotCXByaXZhdGUgSnBhQ29ubmVjdGlvbjJfMCBjb25uZWN0aW9uOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfVVJMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwdWJsaWMgR2VuZXJpYzJfMENvbm5lY3Rpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbm5lY3Rpb24gPSAoSnBhQ29ubmVjdGlvbjJfMCkgdGhpcy5zdWJqZWN0LmdldENvbm5lY3Rpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFDb25uZWN0aW9uMl8wLkRSSVZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYUNvbm5lY3Rpb24yXzAuVVJMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhQ29ubmVjdGlvbjJfMC5VU0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhQ29ubmVjdGlvbjJfMC5QQVNTV09SRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSA0OyAvLyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsICsgMTsgLy8gMSBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQkvLyBJbml0aWFsaXplcyBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KERSSVZFUl9LRVksIERSSVZFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVSTF9LRVksIFVSTF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFVTRVJfS0VZLCBVU0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUEFTU1dPUkRfS0VZLCBQQVNTV09SRF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuRFJJVkVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0RHJpdmVyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5VUkxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVcmwoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFDb25uZWN0aW9uMl8wLlVTRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRVc2VyKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFBhc3N3b3JkKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuRFJJVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXREcml2ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuVVJMX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVcmwoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYUNvbm5lY3Rpb24yXzAuVVNFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0VXNlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhQ29ubmVjdGlvbjJfMC5QQVNTV09SRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UGFzc3dvcmQoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERyaXZlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldERyaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlEUklWRVJfS0VZLAotCQkJRFJJVkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFLAotCQkJRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURyaXZlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRFJJVkVSX0tFWSwKLQkJCURSSVZFUl9URVNUX1ZBTFVFLAotCQkJRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVcmwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVVJMX0tFWSwKLQkJCVVSTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSwKLQkJCVVSTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVVSTF9LRVksCi0JCQlVUkxfVEVTVF9WQUxVRSwKLQkJCVVSTF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVXNlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUsCi0JCQlVU0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVVTRVJfS0VZLAotCQkJVVNFUl9URVNUX1ZBTFVFLAotCQkJVVNFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogUGFzc3dvcmQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRQYXNzd29yZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlQQVNTV09SRF9LRVksCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVBBU1NXT1JEX0tFWSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUUsCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQYXNzd29yZCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUEFTU1dPUkRfS0VZLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmljMl8wT3B0aW9uc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBPcHRpb25zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlYTA3ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBPcHRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2Uub3B0aW9ucy5KcGFPcHRpb25zMl8wOwotCi0vKioKLSAqICBHZW5lcmljT3B0aW9uczJfMFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBPcHRpb25zVGVzdHMgZXh0ZW5kcyBHZW5lcmljMl8wUGVyc2lzdGVuY2VVbml0VGVzdHMKLXsKLQlwcml2YXRlIEpwYU9wdGlvbnMyXzAgb3B0aW9uczsKLQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBwcmVQZXJzaXN0RXZlbnQ7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgcHJlVXBkYXRlRXZlbnQ7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgcHJlUmVtb3ZlRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0NLX1RJTUVPVVRfS0VZID0gSnBhT3B0aW9uczJfMC5QRVJTSVNURU5DRV9MT0NLX1RJTUVPVVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIExPQ0tfVElNRU9VVF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yID0gMjAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfVElNRU9VVF9LRVkgPSBKcGFPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1FVRVJZX1RJTUVPVVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVkgPSBKcGFPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXBlcnNpc3RfZ3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yID0gInRlc3RfMl9wcmUtcGVyc2lzdF9ncm91cCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSA9IEpwYU9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXVwZGF0ZV9ncm91cCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXVwZGF0ZV9ncm91cCI7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSA9IEpwYU9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFID0gInRlc3RfcHJlLXJlbW92ZV9ncm91cCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXJlbW92ZV9ncm91cCI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEdlbmVyaWMyXzBPcHRpb25zVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBiZWhhdmlvciAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5vcHRpb25zID0gKEpwYU9wdGlvbnMyXzApIHRoaXMuc3ViamVjdC5nZXRPcHRpb25zKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSnBhT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQlMaXN0Q2hhbmdlTGlzdGVuZXIgdmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLm9wdGlvbnMuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNULCB2YWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QsIHZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfTElTVCwgdmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQZXJzaXN0ZW5jZVVuaXQgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDU7IC8vIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAxOyAvLyAxIG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCS8vIEluaXRpYWxpemVzIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9DS19USU1FT1VUX0tFWSwgTE9DS19USU1FT1VUX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUVVFUllfVElNRU9VVF9LRVksIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLCBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0TG9ja1RpbWVvdXQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlFVRVJZX1RJTUVPVVRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRRdWVyeVRpbWVvdXQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKSB7Ci0JCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0cygpLml0ZXJhdG9yKCk7Ci0JCQltb2RlbFZhbHVlID0gdGhpcy5nZXRGaXJzdEVsZW1lbnQoaXRlcmF0b3IpOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKSB7Ci0JCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzKCkuaXRlcmF0b3IoKTsKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdldEZpcnN0RWxlbWVudChpdGVyYXRvcik7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZXMoKS5pdGVyYXRvcigpOwotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuZ2V0Rmlyc3RFbGVtZW50KGl0ZXJhdG9yKTsKLQkJfQotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuTE9DS19USU1FT1VUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRMb2NrVGltZW91dCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0UXVlcnlUaW1lb3V0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogTG9ja1RpbWVvdXQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRMb2NrVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMT0NLX1RJTUVPVVRfS0VZLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTE9DS19USU1FT1VUX0tFWSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxvY2tUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0NLX1RJTUVPVVRfS0VZLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBRdWVyeVRpbWVvdXQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeVRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVF1ZXJ5VGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUVVFUllfVElNRU9VVF9LRVksCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0IHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZENvbXBvc2l0ZVZhbHVlKAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRDb21wb3NpdGVWYWx1ZSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUNvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQ29tcG9zaXRlVmFsdWUoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkQ29tcG9zaXRlVmFsdWUoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeVJlbW92ZUNvbXBvc2l0ZVZhbHVlKAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cHMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25Hcm91cHNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TGlzdEV2ZW50cygKLQkJCUpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yLAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QpOwotCQkKLQkJdGhpcy52ZXJpZnlMaXN0RXZlbnRzKAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yLAotCQkJSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCk7Ci0JCQotCQl0aGlzLnZlcmlmeUxpc3RFdmVudHMoCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIsCi0JCQlKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNUKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIG92ZXJyaWRlICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNsZWFyRXZlbnQoKSB7Ci0JCXN1cGVyLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5wcmVQZXJzaXN0RXZlbnQgPSBudWxsOwotCQl0aGlzLnByZVVwZGF0ZUV2ZW50ID0gbnVsbDsKLQkJdGhpcy5wcmVSZW1vdmVFdmVudCA9IG51bGw7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLy8gKioqKioqKioqKiB2ZXJpZnkgVmFsaWRhdGlvbkdyb3VwIHByb3BlcnR5ICoqKioqKioqKioKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyLCB0cnVlKTsgCi0JCXRoaXMucHJvcGVydGllc1RvdGFsKys7Ci0JCXRoaXMudmVyaWZ5UHV0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCAoU3RyaW5nKXRlc3RWYWx1ZTEpKTsKLQkJLy8gUmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQktLXRoaXMucHJvcGVydGllc1RvdGFsOwotCQktLXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5yZW1vdmVQcm9wZXJ0eShrZXksIChTdHJpbmcpdGVzdFZhbHVlMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCAoU3RyaW5nKXRlc3RWYWx1ZTEpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEsIHRydWUpOyAKLQkJdGhpcy52ZXJpZnlQdXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZENvbXBvc2l0ZVZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBzdHJpbmdUZXN0VmFsdWUxID0gKFN0cmluZyl0ZXN0VmFsdWUxOwotCQlTdHJpbmcgc3RyaW5nVGVzdFZhbHVlMiA9IChTdHJpbmcpdGVzdFZhbHVlMjsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQl0aGlzLmFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMik7Ci0KLQkJYXNzZXJ0VHJ1ZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKSk7Ci0KLQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eVZhbHVlLmluZGV4T2Yoc3RyaW5nVGVzdFZhbHVlMSkgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHByb3BlcnR5VmFsdWUuaW5kZXhPZihzdHJpbmdUZXN0VmFsdWUyKSAhPSAtMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UmVtb3ZlQ29tcG9zaXRlVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0cmluZ1Rlc3RWYWx1ZTEgPSAoU3RyaW5nKXRlc3RWYWx1ZTE7Ci0JCVN0cmluZyBzdHJpbmdUZXN0VmFsdWUyID0gKFN0cmluZyl0ZXN0VmFsdWUyOwotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUxKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMSk7Ci0JCXRoaXMuYWRkVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAyKTsKLQotCQl0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMSk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKSk7Ci0JCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpLmdldFZhbHVlKCk7Ci0JCWFzc2VydFRydWUocHJvcGVydHlWYWx1ZS5pbmRleE9mKHN0cmluZ1Rlc3RWYWx1ZTEpICE9IC0xKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eVZhbHVlLmluZGV4T2Yoc3RyaW5nVGVzdFZhbHVlMikgPT0gLTEpOwotCQkKLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDEpOwotCQkKLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDApOwotCQlhc3NlcnRGYWxzZSh0aGlzLnZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSkpOwotCQkKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUxpc3RFdmVudHMoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHRlc3RWYWx1ZSwgU3RyaW5nIGxpc3ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gYWRkCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKS5nZXRMaXN0TmFtZSgpLCBsaXN0TmFtZSk7Ci0KLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQkKLQkJdGhpcy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZSk7Ci0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmdldEV2ZW50Rm9yKHByb3BlcnR5TmFtZSkpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKS5nZXRMaXN0TmFtZSgpLCBsaXN0TmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKSk7Ci0JCS8vIHZlcmlmeSBldmVudCB2YWx1ZQotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCAoU3RyaW5nKSBleHBlY3RlZFZhbHVlKSk7Ci0JCSByZXR1cm47Ci0JfQotCQotCS8vICoqKioqKioqKiogaW50ZXJuYWwgbWV0aG9kICoqKioqKioqKioKLQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkVmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlHZW5lcmljMl8wT3B0aW9uc1Rlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJR2VuZXJpYzJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJR2VuZXJpYzJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBlKSB7Ci0JCQkJR2VuZXJpYzJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlHZW5lcmljMl8wT3B0aW9uc1Rlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQkKLQkJCQlHZW5lcmljMl8wT3B0aW9uc1Rlc3RzLnRoaXMudmFsaWRhdGlvbkdyb3VwQ2hhbmdlZChlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGlvbkdyb3VwQ2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQlTdHJpbmcgbGlzdE5hbWUgPSBlLmdldExpc3ROYW1lKCk7Ci0JCQotCQlpZiAobGlzdE5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9MSVNUKSkKLQkJCXRoaXMucHJlUGVyc2lzdEV2ZW50ID0gZTsKLQkJZWxzZSBpZiAobGlzdE5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0xJU1QpKQotCQkJdGhpcy5wcmVVcGRhdGVFdmVudCA9IGU7Ci0JCWVsc2UgaWYgKGxpc3ROYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNUKSkKLQkJCXRoaXMucHJlUmVtb3ZlRXZlbnQgPSBlOwotCQllbHNlCi0JCQl0aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZhbGlkYXRpb25Hcm91cFZhbHVlKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZShwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlKHByb3BlcnR5VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImFkZFZhbGlkYXRpb25Hcm91cFZhbHVlIiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhKcGFPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigicmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9IHRoaXMub3B0aW9ucy52YWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0RXhpc3RzKHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9IHRoaXMub3B0aW9ucy52YWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVFeGlzdHMocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUV4aXN0cyhwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJ2ZXJpZnlWYWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9ICB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdHNTaXplKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gIHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVzU2l6ZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXJlc3VsdCA9ICB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3Zlc1NpemUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJ2ZXJpZnlWYWxpZGF0aW9uR3JvdXBTaXplIiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgZ2V0RXZlbnRGb3IoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJTGlzdENoYW5nZUV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCWV2ZW50ID0gdGhpcy5wcmVQZXJzaXN0RXZlbnQ7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSnBhT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJZXZlbnQgPSB0aGlzLnByZVVwZGF0ZUV2ZW50OwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEpwYU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCWV2ZW50ID0gdGhpcy5wcmVSZW1vdmVFdmVudDsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRFdmVudEZvciIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NjAyMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEdlbmVyaWMyXzBQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzCi0JZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEdlbmVyaWMyXzBDb25uZWN0aW9uVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHZW5lcmljMl8wT3B0aW9uc1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgR2VuZXJpYzJfMFBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyaWMyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTE1OGE0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJpYzJfMFBlcnNpc3RlbmNlVW5pdFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uR2VuZXJpY1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiAgR2VuZXJpY1BlcnNpc3RlbmNlVW5pdDJfMFRlc3RzCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljMl8wUGVyc2lzdGVuY2VVbml0VGVzdHMgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgc3ViamVjdDsKLQotCXByb3RlY3RlZCBQcm9wZXJ0eVZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0Ml8wPiBzdWJqZWN0SG9sZGVyOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXByb3RlY3RlZCBHZW5lcmljMl8wUGVyc2lzdGVuY2VVbml0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zdWJqZWN0ID0gdGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJdGhpcy5zdWJqZWN0SG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQyXzA+KHRoaXMuc3ViamVjdCk7Ci0JCXRoaXMucG9wdWxhdGVQdSgpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSwgR2VuZXJpY1BsYXRmb3JtLlZFUlNJT05fMl8wKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXQyXzAgZ2V0UGVyc2lzdGVuY2VVbml0KCkgewotCQlyZXR1cm4gKFBlcnNpc3RlbmNlVW5pdDJfMCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQWNjZXNzMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTUwOTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9BY2Nlc3MyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFjY2VzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQWNjZXNzVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQWNjZXNzMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEFjY2VzczJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFjY2Vzc09uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBY2Nlc3NPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQUNDRVNTLCBKUEEyXzAuQUNDRVNTX1RZUEUpOwotCQkJfQotCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QWNjZXNzT25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkFDQ0VTUywgSlBBMl8wLkFDQ0VTU19UWVBFKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFjY2Vzc09uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbiBhY2Nlc3MgPSAoQWNjZXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydE5vdE51bGwoYWNjZXNzKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGFjY2Vzcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QWNjZXNzT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0TnVsbChhY2Nlc3MpOwotCQkKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzIiwgY3UpOwotCi0JCWFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgYWNjZXNzLmdldFZhbHVlKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzKEZJRUxEKSIsIGN1KTsKLQkJCi0JCWFjY2Vzcy5zZXRWYWx1ZShBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGFjY2Vzcy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoUFJPUEVSVFkpIiwgY3UpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFjY2VzcygiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBY2Nlc3NPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydE5vdE51bGwoYWNjZXNzKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGFjY2Vzcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QWNjZXNzT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbiBhY2Nlc3MgPSAoQWNjZXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOwotCQlhc3NlcnROdWxsKGFjY2Vzcyk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzIiwgY3UpOwotCi0JCWFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkFDQ0VTUyk7Ci0JCWFzc2VydE5vdE51bGwoYWNjZXNzKTsKLQkJCi0JCWFjY2Vzcy5zZXRWYWx1ZShBY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGFjY2Vzcy5nZXRWYWx1ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFjY2VzcyhGSUVMRCkiLCBjdSk7Ci0JCQotCQlhY2Nlc3Muc2V0VmFsdWUoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBhY2Nlc3MuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzKFBST1BFUlRZKSIsIGN1KTsKLQkJCi0JCWFjY2Vzcy5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBY2Nlc3MoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzT25Qcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QWNjZXNzT25Qcm9wZXJ0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRNZXRob2RzKCksIDApOwotCQkKLQkJQWNjZXNzMl8wQW5ub3RhdGlvbiBhY2Nlc3MgPSAoQWNjZXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgYWNjZXNzLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBY2Nlc3NPblByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldE1ldGhvZHMoKSwgMCk7Ci0JCQotCQlBY2Nlc3MyXzBBbm5vdGF0aW9uIGFjY2VzcyA9IChBY2Nlc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOwotCQlhc3NlcnROdWxsKGFjY2Vzcyk7Ci0JCQotCQlyZXNvdXJjZU1ldGhvZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5BQ0NFU1MpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFjY2VzcyIsIGN1KTsKLQotCQlhY2Nlc3MgPSAoQWNjZXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VNZXRob2QuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQUNDRVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChhY2Nlc3MpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgYWNjZXNzLmdldFZhbHVlKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQWNjZXNzKEZJRUxEKSIsIGN1KTsKLQkJCi0JCWFjY2Vzcy5zZXRWYWx1ZShBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGFjY2Vzcy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBY2Nlc3MoUFJPUEVSVFkpIiwgY3UpOwotCQkKLQkJYWNjZXNzLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFjY2VzcygiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZTJfMFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjVlYWMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpPSU5fVEFCTEVfTkFNRSA9ICJNWV9KT0lOX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19OQU1FID0gIk1ZX0NBVEFMT0ciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRSA9ICJNWV9TQ0hFTUEiOwotCQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlMl8wVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCIiICsgSk9JTl9UQUJMRV9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShjYXRhbG9nID0gXCIiICsgQ0FUQUxPR19OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHNjaGVtYSA9IFwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGVBdChpbnQgaW5kZXgsIEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlcikgewotCQlyZXR1cm4gKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZU1lbWJlci5nZXRBbm5vdGF0aW9uKGluZGV4LCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikiLCBjdSk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhKT0lOX1RBQkxFX05BTUUsIGpvaW5UYWJsZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEpPSU5fVEFCTEVfTkFNRSwgam9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luVGFibGUuc2V0TmFtZSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQkJCi0JCWpvaW5UYWJsZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5UYWJsZSgpOwotCQlqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKGpvaW5UYWJsZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gam9pblRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChqb2luVGFibGUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQl0YWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIk1ZX0pPSU5fVEFCTEVcIiwgY2F0YWxvZyA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJdGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlR2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQotCQl0YWJsZS5zZXRTY2hlbWEoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIHNjaGVtYSA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQl0YWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVVbmlxdWVDb25zdHJhaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlQWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmdldENvbHVtbk5hbWVzU2l6ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCB1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlUmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pKSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlQWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSkiLCBjdSk7Ci0KLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0JCXRhYmxlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQotCi0JCXRhYmxlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCi0JCQotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCBpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVSZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpKSkiLCBjdSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXRhYmxlLm1vdmVJbnZlcnNlSm9pbkNvbHVtbigyLCAwKTsKLQkJaW52ZXJzZUpvaW5Db2x1bW5zID0gdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZUludmVyc2VKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUubW92ZUludmVyc2VKb2luQ29sdW1uKDAsIDIpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0SW52ZXJzZUpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlczJfMFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzMl8wVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUwNjAwZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luVGFibGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBc3NvY2lhdGlvbk92ZXJyaWRlczJfMFRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKT0lOX1RBQkxFX05BTUUgPSAiTVlfSk9JTl9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKLQkKLQlwdWJsaWMgQXNzb2NpYXRpb25PdmVycmlkZXMyXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCIiICsgSk9JTl9UQUJMRV9OQU1FICsgIlwiKSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGNhdGFsb2cgPSBcIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUywgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuSk9JTl9UQUJMRSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQotCXByaXZhdGUgQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZUF0KGludCBpbmRleCwgSmF2YVJlc291cmNlTWVtYmVyIHJlc291cmNlTWVtYmVyKSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24pIHJlc291cmNlTWVtYmVyLmdldEFubm90YXRpb24oaW5kZXgsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5hc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQXNzb2NpYXRpb25PdmVycmlkZUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXNzb2NpYXRpb25PdmVycmlkZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQXNzb2NpYXRpb25PdmVycmlkZVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDIgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiQkFaXCIpLCI7Ci0JCWV4cGVjdGVkMyA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpLCBAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQXNzb2NpYXRpb25PdmVycmlkZUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXNzb2NpYXRpb25PdmVycmlkZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQyID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSkiOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0KLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4pKSIsIGN1KTsKLQotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXNzb2NpYXRpb25PdmVycmlkZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlRmllbGQpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoSk9JTl9UQUJMRV9OQU1FLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoSk9JTl9UQUJMRV9OQU1FLCBqb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5UYWJsZS5zZXROYW1lKCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCQkKLQkJam9pblRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25UeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiBqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKGpvaW5UYWJsZSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5UYWJsZSgpOwotCQlqb2luVGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKGpvaW5UYWJsZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPblR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIGpvaW5UYWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwoam9pblRhYmxlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlU2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQotCQl0YWJsZS5zZXRDYXRhbG9nKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKG5hbWUgPSBcIk1ZX0pPSU5fVEFCTEVcIiwgY2F0YWxvZyA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUdldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQotCQl0YWJsZS5zZXRTY2hlbWEoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIHNjaGVtYSA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVNldFNjaGVtYU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJdGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVVbmlxdWVDb25zdHJhaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pKSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIiwgY3UpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlTW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkpIiwgY3UpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJCi0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSm9pbkNvbHVtbnMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUobmFtZSA9IFwiTVlfSk9JTl9UQUJMRVwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJQXNzb2NpYXRpb25PdmVycmlkZTJfMEFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGVBdCgwLCByZXNvdXJjZVR5cGUpOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luVGFibGUoKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikpIiwgY3UpOwotCi0JCQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0KLQkJdGFibGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQotCi0JCXRhYmxlLm1vdmVKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZUpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pblRhYmxlSW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbnZlcnNlSm9pbkNvbHVtbnMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCi0JCQotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0SW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZUludmVyc2VKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pblRhYmxlID0gQEpvaW5UYWJsZShuYW1lID0gXCJNWV9KT0lOX1RBQkxFXCIsIGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZVJlbW92ZUludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlSm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlBc3NvY2lhdGlvbk92ZXJyaWRlMl8wQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gYXNzb2NpYXRpb25PdmVycmlkZUF0KDAsIHJlc291cmNlVHlwZSk7Ci0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5UYWJsZSgpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigyKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpKSkiLCBjdSk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShpbnZlcnNlSm9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVNb3ZlSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5UYWJsZSA9IEBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5UYWJsZU1vdmVJbnZlcnNlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luVGFibGVTZXRJbnZlcnNlSm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGUyXzBBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSBhc3NvY2lhdGlvbk92ZXJyaWRlQXQoMCwgcmVzb3VyY2VUeXBlKTsKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pblRhYmxlKCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luVGFibGUgPSBASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJmb29cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCX0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ2FjaGVhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NhY2hlYWJsZTJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMThiZTVjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ2FjaGVhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5DYWNoZWFibGUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoZWFibGUyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQ2FjaGVhYmxlMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGVhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlYWJsZVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlYWJsZSh2YWx1ZT10cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVhYmxlV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZWFibGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUodmFsdWU9ZmFsc2UpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZWFibGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkKLQkJQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbiBjYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ2YWx1ZSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0NvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWNkZDljLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OQU1FID0gIk1ZX1NDSEVNQSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKLQkKLQlwdWJsaWMgQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2xsZWN0aW9uVGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sbGVjdGlvblRhYmxlKG5hbWUgPSBcIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sbGVjdGlvblRhYmxlKHNjaGVtYSA9IFwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2xsZWN0aW9uVGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sbGVjdGlvblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQotCQl0YWJsZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJdGFibGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2xsZWN0aW9uVGFibGUoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJdGFibGUuc2V0Q2F0YWxvZygiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKGNhdGFsb2cgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJdGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2xsZWN0aW9uVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCXRhYmxlLnNldFNjaGVtYSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoc2NoZW1hID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWFOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJdGFibGUuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sbGVjdGlvblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCi0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2xsZWN0aW9uVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSl9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0KLQkJCi0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCk7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigxKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbGxlY3Rpb25UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4pIiwgY3UpOwotCi0JCQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbGxlY3Rpb25UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sbGVjdGlvblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ09MTEVDVElPTl9UQUJMRSk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJdGFibGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbGxlY3Rpb25UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiB0YWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkNPTExFQ1RJT05fVEFCTEUpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQkKLQkJdGFibGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sbGVjdGlvblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQotCQl0YWJsZS5tb3ZlSm9pbkNvbHVtbigwLCAyKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2xsZWN0aW9uVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gdGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DT0xMRUNUSU9OX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5qb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2xsZWN0aW9uVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmOTY1My4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0VsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXB1YmxpYyBFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24oZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RWxlbWVudENvbGxlY3Rpb25XaXRoVGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbih0YXJnZXRDbGFzcyA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQlhc3NlcnROb3ROdWxsKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbGVtZW50Q29sbGVjdGlvbihmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbGVtZW50Q29sbGVjdGlvbiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aFRhcmdldENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aFRhcmdldENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0VGFyZ2V0Q2xhc3MoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbGVtZW50Q29sbGVjdGlvbih0YXJnZXRDbGFzcyA9IEZvby5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRDbGFzc051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVsZW1lbnRDb2xsZWN0aW9uV2l0aFRhcmdldENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0VGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0Q2xhc3MiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbGVtZW50Q29sbGVjdGlvbldpdGhUYXJnZXRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRDbGFzc05hbWUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcygiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVsZW1lbnRDb2xsZWN0aW9uKHRhcmdldENsYXNzID0gRm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0Q2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2UyXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2UyXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDc0ZjQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2UyXzBUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSmF2YVJlc291cmNlMl8wVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWNjZXNzMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFzc29jaWF0aW9uT3ZlcnJpZGUyXzBUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBc3NvY2lhdGlvbk92ZXJyaWRlczJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hlYWJsZTJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFueVRvTWFueTJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYW55VG9PbmUyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlKb2luQ29sdW1uczJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBzSWQyXzBBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT25lVG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9uZVRvT25lMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJCQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUmVzb3VyY2UyXzBUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzNkNWMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5qcGEyLkdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotewkKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWMyXzBKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFueVRvTWFueTJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4ZWZjMzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYW55VG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hbnlUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hbnlUb01hbnkyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgTWFueVRvTWFueTJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eSA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkobWFwcGVkQnkgPSBcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9NYW55LnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0YXJnZXRFbnRpdHkiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG1hbnlUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCW1hbnlUb01hbnkuc2V0TWFwcGVkQnkoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkobWFwcGVkQnkgPSBcImJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJtYXBwZWRCeSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBBTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQltYW55VG9NYW55LnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVEZXRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnkyXzBBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZURldGFjaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBERVRBQ0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZURldGFjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCS8vYSBzZWNvbmQgQ2FzY2FkZVR5cGUuQWxsIHNob3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOyAvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJICAvL3NldHRpbmdzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHNldCBpdCBmYWxzZSB0d2ljZT8KLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlUmVtb3ZlKGZhbHNlKTsJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hbnlUb09uZTJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYW55VG9PbmUyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyMGExYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hbnlUb09uZTJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYW55VG9PbmUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvT25lQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE1hbnlUb09uZTJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5ID0gQW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYW55VG9PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvT25lKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRhcmdldEVudGl0eSIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG1hbnlUb09uZS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJbWFueVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigib3B0aW9uYWwiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gQUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gTUVSR0UpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IFBFUlNJU1QpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBSRUZSRVNIKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVEZXRhY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lMl8wQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlRGV0YWNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gREVUQUNIKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZURldGFjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aENhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkvL2Egc2Vjb25kIENhc2NhZGVUeXBlLkFsbCBzaG91bGQgbm90IGhhdmUgYmVlbiBhZGRlZAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgY2FzY2FkZUFsbCB0byBmYWxzZSBhZ2Fpbiwgc2hvdWxkIGp1c3QgZG8gbm90aGluZwotCQltYW55VG9PbmUuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhEdXBsaWNhdGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJLy9zZXR0aW5ncyBpbnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgaXQgZmFsc2UgdHdpY2U/Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKGZhbHNlKTsJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNsYXNzMl8wQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUNsYXNzMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjQ2MzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDbGFzczJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX0tFWV9DTEFTU19WQUxVRSA9ICJNeUNsYXNzIjsKLQkKLQlwdWJsaWMgTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwS2V5Q2xhc3NXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q2xhc3MoIiArIE1BUF9LRVlfQ0xBU1NfVkFMVUUgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleUNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXlDbGFzcyk7Ci0JCWFzc2VydE51bGwobWFwS2V5Q2xhc3MuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXlDbGFzc1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCi0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzcyA9IChNYXBLZXlDbGFzczJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DTEFTUyk7Ci0JCWFzc2VydEVxdWFscyhNQVBfS0VZX0NMQVNTX1ZBTFVFLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleUNsYXNzV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKE1BUF9LRVlfQ0xBU1NfVkFMVUUsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQkKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDbGFzcyhmb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJbWFwS2V5Q2xhc3Muc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNsYXNzKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleUNsYXNzV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NMQVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNeUNsYXNzIiwgbWFwS2V5Q2xhc3MuZ2V0RnVsbHlRdWFsaWZpZWRDbGFzc05hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCi0JCW1hcEtleUNsYXNzLnNldFZhbHVlKFRZUEVfTkFNRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBtYXBLZXlDbGFzcy5nZXRGdWxseVF1YWxpZmllZENsYXNzTmFtZSgpKTsJCQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q2xhc3MoIiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmNhZTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JCi0JcHVibGljIE1hcEtleUNvbHVtbjJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q29sdW1uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlDb2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUNvbHVtbih0YWJsZSA9IFwiIiArIENPTFVNTl9UQUJMRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoZmluYWwgU3RyaW5nIGludEVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Q29sdW1uKCIgKyBpbnRFbGVtZW50ICsgIiA9IDUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRUYWJsZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb2x1bW4odGFibGUgPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1bmlxdWUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCi0JCWNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb2x1bW4odW5pcXVlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlDb2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudCgibnVsbGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q29sdW1uKG51bGxhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldE51bGxhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudCgiaW5zZXJ0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q29sdW1uKGluc2VydGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlDb2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVwZGF0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbHVtbih1cGRhdGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldExlbmd0aCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoImxlbmd0aCIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0KLQkJY29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlDb2x1bW4obGVuZ3RoID0gNSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0TGVuZ3RoKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFByZWNpc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoInByZWNpc2lvbiIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29sdW1uLmdldFByZWNpc2lvbigpKTsKLQotCQljb2x1bW4uc2V0UHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbHVtbihwcmVjaXNpb24gPSA1KSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRQcmVjaXNpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NhbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KCJzY2FsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0U2NhbGUoKSk7Ci0KLQkJY29sdW1uLnNldFNjYWxlKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q29sdW1uKHNjYWxlID0gNSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0U2NhbGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Q29sdW1uKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQ2OGQ4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcEtleUVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlFbnVtZXJhdGVkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcEtleUVudW1lcmF0ZWRXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQsIEpQQS5FTlVNX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlFbnVtZXJhdGVkKEVudW1UeXBlLk9SRElOQUwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXlFbnVtZXJhdGVkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfRU5VTUVSQVRFRCk7Ci0JCWFzc2VydE5vdE51bGwoZW51bWVyYXRlZCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5RW51bWVyYXRlZFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXlFbnVtZXJhdGVkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0VOVU1FUkFURUQpOwotCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUoRW51bVR5cGUuU1RSSU5HKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5RW51bWVyYXRlZChTVFJJTkcpIiwgY3UpOwotCQkKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5RW51bWVyYXRlZCgiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5RW51bWVyYXRlZCIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjcwMmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFCTEUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJNWV9SRUZfQ09MVU1OX05BTUUiOwotCQotCXB1YmxpYyBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1uKHRhYmxlID0gXCIiICsgQ09MVU1OX1RBQkxFICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1uKCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBtYXBLZXlKb2luQ29sdW1uQXQoaW50IGluZGV4LCBKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIpIHsKLQkJcmV0dXJuIChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VNZW1iZXIuZ2V0QW5ub3RhdGlvbihpbmRleCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1RBQkxFLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFRhYmxlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW4odGFibGUgPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidW5pcXVlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0KLQkJY29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW4odW5pcXVlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbihudWxsYWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgiaW5zZXJ0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1cGRhdGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Sm9pbkNvbHVtbih1cGRhdGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4MDhkYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL01hcEtleUpvaW5Db2x1bW5zMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuanBhMi5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1RBQkxFID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiTVlfUkVGX0NPTFVNTl9OQU1FIjsKLQkKLQlwdWJsaWMgTWFwS2V5Sm9pbkNvbHVtbnMyXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4sIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4odGFibGUgPSBcIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4sIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTiwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Sm9pbkNvbHVtbnMoQE1hcEtleUpvaW5Db2x1bW4oIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIG1hcEtleUpvaW5Db2x1bW5BdChpbnQgaW5kZXgsIEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlcikgewotCQlyZXR1cm4gKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZU1lbWJlci5nZXRBbm5vdGF0aW9uKGluZGV4LCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFRhYmxlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKHRhYmxlID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0VGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1bmlxdWUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0VW5pcXVlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQotCQljb2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0VW5pcXVlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbih1bmlxdWUgPSBmYWxzZSkpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBNYXBLZXlKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXROdWxsYWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldE51bGxhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBLZXlKb2luQ29sdW1ucyhATWFwS2V5Sm9pbkNvbHVtbihudWxsYWJsZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0TnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoImluc2VydGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gdGhpcy5tYXBLZXlKb2luQ29sdW1uQXQoMCwgcmVzb3VyY2VGaWVsZCk7Ci0KLQkJYXNzZXJ0VHJ1ZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldEluc2VydGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKGluc2VydGFibGUgPSBmYWxzZSkpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVwZGF0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLm1hcEtleUpvaW5Db2x1bW5BdCgwLCByZXNvdXJjZUZpZWxkKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVcGRhdGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMubWFwS2V5Sm9pbkNvbHVtbkF0KDAsIHJlc291cmNlRmllbGQpOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRVcGRhdGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUpvaW5Db2x1bW5zKEBNYXBLZXlKb2luQ29sdW1uKHVwZGF0YWJsZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbkNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQE1hcEtleUpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEpvaW5Db2x1bW5Ub0JlZ2lubmluZ09mTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQE1hcEtleUpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCQkKLQkJZXhwZWN0ZWQyID0gIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSwiOwotCQlleHBlY3RlZDMgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIEBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSB9KSI7Ci0JCWpvaW5Db2x1bW4gPSAoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKE1hcEtleUpvaW5Db2x1bW4yXzBBbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTlMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBMl8wLk1BUF9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSm9pbkNvbHVtbkNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQE1hcEtleUpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBNYXBLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQE1hcEtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJTWFwS2V5Sm9pbkNvbHVtbjJfMEFubm90YXRpb24gam9pbkNvbHVtbiA9IChNYXBLZXlKb2luQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQTJfMC5NQVBfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMiA9ICJATWFwS2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSI7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEyXzAuTUFQX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleUpvaW5Db2x1bW5zIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI0ZmYzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlIHsKLQotCXB1YmxpYyBNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9URU1QT1JBTCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleVRlbXBvcmFsIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbXBvcmFsV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuTUFQX0tFWV9URU1QT1JBTCwgSlBBLlRFTVBPUkFMX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW1wb3JhbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX1RFTVBPUkFMKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZW1wb3JhbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVtcG9yYWxXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9URU1QT1JBTCk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVtcG9yYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24gdGVtcG9yYWwgPSAoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfVEVNUE9SQUwpOwotCi0JCXRlbXBvcmFsLnNldFZhbHVlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5VGVtcG9yYWwoVElNRSkiLCBjdSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATWFwS2V5VGVtcG9yYWwoIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBzSWQyXzBBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvTWFwc0lkMl8wQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMTllNTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9NYXBzSWQyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFwc0lkMl8wQW5ub3RhdGlvblRlc3RzCi0JZXh0ZW5kcyBKYXZhUmVzb3VyY2VNb2RlbDJfMFRlc3RDYXNlCi17Ci0JcHVibGljIE1hcHNJZDJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwc0lkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHNJZFdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBzSWQoXCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcHNJZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwc0lkV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYXBzSWQyXzBBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcHNJZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCi0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IChNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYXBzSWQoXCJmb29cIikiLCBjdSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcHNJZCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvTWFueTJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb01hbnkyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0NWIxMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvanBhMi9yZXNvdXJjZS9qYXZhL09uZVRvTWFueTJfMEFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT25lVG9NYW55Ml8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE9uZVRvTWFueTJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KHRhcmdldEVudGl0eSA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkobWFwcGVkQnkgPSBcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvTWFueSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoZmV0Y2ggPSBMQVpZKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJb25lVG9NYW55LnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgb25lVG9NYW55LmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOwotCQkKLQkJb25lVG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJb25lVG9NYW55LnNldE1hcHBlZEJ5KCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShtYXBwZWRCeSA9IFwiYmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTWFwcGVkQnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1hcHBlZEJ5IiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBBTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZURldGFjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZURldGFjaCgpKTsKLQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVEZXRhY2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBERVRBQ0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlRGV0YWNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXNjYWRlTW9yZVRoYW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCS8vYSBzZWNvbmQgQ2FzY2FkZVR5cGUuQWxsIHNob3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOy8vVE9ETyBzaG91bGQgdGhlIHJlc291cmNlIG1vZGVsIGhhbmRsZSB0aGlzIGFuZCByZW1vdmUgYm90aCBNRVJHRSAKLQkJCQkJCQkJCQkvL3NldHRpbmdzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHNldCBpdCBmYWxzZSB0d2ljZT8KLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNdWx0aXBsZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb09uZTJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PbmVUb09uZTJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGI4YmVkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT25lVG9PbmUyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT25lVG9PbmUyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPbmVUb09uZTJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXB1YmxpYyBPbmVUb09uZTJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUodGFyZ2V0RW50aXR5ID0gQW5ub3RhdGlvblRlc3RUeXBlLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoTWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUobWFwcGVkQnkgPSBcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhEdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb09uZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJmZXRjaCIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJb25lVG9PbmUuc2V0VGFyZ2V0RW50aXR5KG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRhcmdldEVudGl0eSIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgb25lVG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUob3B0aW9uYWwgPSBmYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShtYXBwZWRCeSA9IFwiYmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1hcHBlZEJ5IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBBTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlRGV0YWNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlRGV0YWNoKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlRGV0YWNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBERVRBQ0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVEZXRhY2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhc2NhZGVNb3JlVGhhbk9uY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aENhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCS8vYSBzZWNvbmQgQ2FzY2FkZVR5cGUuQWxsIHNob3VsZCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiLCBjdSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JCQotCQkvL3Rlc3Qgc2V0dGluZyBjYXNjYWRlQWxsIHRvIGZhbHNlIGFnYWluLCBzaG91bGQganVzdCBkbyBub3RoaW5nCi0JCW9uZVRvT25lLnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aER1cGxpY2F0ZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOy8vVE9ETyBzaG91bGQgdGhlIHJlc291cmNlIG1vZGVsIGhhbmRsZSB0aGlzIGFuZCByZW1vdmUgYm90aCBNRVJHRSAKLQkJCQkJCQkJCQkvL3NldHRpbmdzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHNldCBpdCBmYWxzZSB0d2ljZT8KLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE11bHRpcGxlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PcmRlckNvbHVtbjJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9PcmRlckNvbHVtbjJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFhY2E0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPcmRlckNvbHVtbjJfMEFubm90YXRpb25UZXN0cyBleHRlbmRzIEphdmFSZXNvdXJjZU1vZGVsMl8wVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCQotCXB1YmxpYyBPcmRlckNvbHVtbjJfMEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJDb2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T3JkZXJDb2x1bW5XaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9yZGVyQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T3JkZXJDb2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9yZGVyQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9yZGVyQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KGZpbmFsIFN0cmluZyBib29sZWFuRWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJDb2x1bW4oIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJDb2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPcmRlckNvbHVtbihuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJDb2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPcmRlckNvbHVtbihudWxsYWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJDb2x1bW4iLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJpbnNlcnRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlPcmRlckNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPcmRlckNvbHVtbihpbnNlcnRhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidXBkYXRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCU9yZGVyQ29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T3JkZXJDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJT3JkZXJDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJDb2x1bW4odXBkYXRhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVwZGF0YWJsZShudWxsKTsKLQkJCi0JCWNvbHVtbiA9IChPcmRlckNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQ29sdW1uIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL2pwYTIvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzFiMzFhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9qcGEyL3Jlc291cmNlL2phdmEvU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmpwYTIucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5TZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi0vKioKLSAqICBTZXF1ZW5jZUdlbmVyYXRvcjJfMFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWwyXzBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0NBVEFMT0cgPSAiVEVTVF9DQVRBTE9HIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1NDSEVNQSA9ICJURVNUX1NDSEVNQSI7Ci0KLQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBjYXRhbG9nICoqKioqKioqKioKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhDYXRhbG9nKCk7CQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQ0FUQUxPRywgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9DQVRBTE9HLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0Q2F0YWxvZygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IoY2F0YWxvZyA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZXF1ZW5jZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogc2NoZW1hICoqKioqKioqKioKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSB0aGlzLmJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvcjJfMEFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfU0NIRU1BLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gdGhpcy5idWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3IyXzBBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1NDSEVNQSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U2NoZW1hKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKHNjaGVtYSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHNlcXVlbmNlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2VxdWVuY2VHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIHV0aWxpdHkgKioqKioqKioqKgotCQkKLQlwcm90ZWN0ZWQgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2VxdWVuY2VHZW5lcmF0b3IoIiArIGVsZW1lbnROYW1lICsgIiA9IFwiIiArIHZhbHVlICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJjYXRhbG9nIiwgR0VORVJBVE9SX0NBVEFMT0cpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJzY2hlbWEiLCBHRU5FUkFUT1JfU0NIRU1BKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnBhUHJvamVjdE1hbmFnZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL0pwYVByb2plY3RNYW5hZ2VyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE0NTY4Ny4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvbW9kZWwvSnBhUHJvamVjdE1hbmFnZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLm1vZGVsOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0RmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdFBsYXRmb3JtUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSnBhUHJvamVjdE1hbmFnZXJUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKiBjYXJyaWFnZSByZXR1cm4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXByb3RlY3RlZCBUZXN0RmFjZXRlZFByb2plY3QgdGVzdFByb2plY3Q7Ci0JcHVibGljIEpwYVByb2plY3RNYW5hZ2VyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJaWYgKHRoaXMuZGVidWcoKSkgewotCQkJdGhpcy5wcmludE5hbWUoKTsKLQkJfQotCQl0aGlzLnRlc3RQcm9qZWN0ID0gdGhpcy5idWlsZFRlc3RQcm9qZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRlYnVnKCkgewotCQlCb29sZWFuIGRlYnVnID0gKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5nZXRTdGF0aWNGaWVsZFZhbHVlKHRoaXMuZ2V0R2VuZXJpY0pwYVByb2plY3RNYW5hZ2VyQ2xhc3MoKSwgIkRFQlVHIik7Ci0JCXJldHVybiBkZWJ1Zy5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvLyBHZW5lcmljSnBhUHJvamVjdE1hbmFnZXIgaXMgcGFja2FnZS1wcml2YXRlCi0JcHJpdmF0ZSBDbGFzczw/PiBnZXRHZW5lcmljSnBhUHJvamVjdE1hbmFnZXJDbGFzcygpIHsKLQkJcmV0dXJuIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRDbGFzcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gdGhpcy5nZXROYW1lKCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJdGhpcy5wcmludE5hbWVCb3JkZXIobmFtZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lKTsKLQkJdGhpcy5wcmludE5hbWVCb3JkZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50TmFtZUJvcmRlcihTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gbmFtZS5sZW5ndGgoKTsgaS0tID4gMDsgKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50KCc9Jyk7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl0aGlzLnRlc3RQcm9qZWN0ID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQkvKiogCi0JICogQnVpbGRzIGEgcHJvamVjdCB3aXRoIHRoZSBqYXZhIGFuZCB1dGlsaXR5IGZhY2V0cyBpbnN0YWxsZWQsIGFuZCB3aXRoCi0JICogcHJlLWV4aXN0aW5nIGVudGl0aWVzIGFkZGVkLgotCSAqLwotCXByaXZhdGUgVGVzdEZhY2V0ZWRQcm9qZWN0IGJ1aWxkVGVzdFByb2plY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEphdmFQcm9qZWN0IHRqcCA9IFRlc3RKYXZhUHJvamVjdC5idWlsZEphdmFQcm9qZWN0KHRoaXMuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCksIHRydWUpOwotCQl0anAuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJ0ZXN0LnBrZyIsICJUZXN0RW50aXR5LmphdmEiLCAiQEVudGl0eSBwdWJsaWMgY2xhc3MgVGVzdEVudGl0eSB7fSIpOwotCQl0anAuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJ0ZXN0LnBrZyIsICJUZXN0RW50aXR5Mi5qYXZhIiwgIkBFbnRpdHkgcHVibGljIGNsYXNzIFRlc3RFbnRpdHkyIHt9Iik7Ci0JCXJldHVybiB0anA7Ci0JfQkKLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShUZXN0UGxhdGZvcm1Qcm9qZWN0IHAsIFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBwLmdldFByb2plY3QoKS5nZXRGaWxlKG5ldyBQYXRoKHBhdGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBtYWtlIHN1cmUgdGhlIERFQlVHIGNvbnN0YW50cyBhcmUgJ2ZhbHNlJyBiZWZvcmUgY2hlY2tpbmcgaW4gdGhlIGNvZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0REVCVUcoKSB7Ci0JCXRoaXMudmVyaWZ5REVCVUcodGhpcy5nZXRHZW5lcmljSnBhUHJvamVjdE1hbmFnZXJDbGFzcygpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5REVCVUcoQ2xhc3M8Pz4gY2xhenopIHsKLQkJYXNzZXJ0RmFsc2UoIlJlY29tcGlsZSB3aXRoIFwiREVCVUcgPSBmYWxzZVwiOiAiICsgY2xhenouZ2V0TmFtZSgpLAotCQkJCSgoQm9vbGVhbikgUmVmbGVjdGlvblRvb2xzLmdldFN0YXRpY0ZpZWxkVmFsdWUoY2xhenosICJERUJVRyIpKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQcm9qZWN0TWFuYWdlcigpIHsKLQkJYXNzZXJ0Tm90TnVsbChKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzLkNSRUFURV9PUk1fWE1MLCBCb29sZWFuLlRSVUUpOwotCQlyZXR1cm4gZGF0YU1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0Q2xvc2VSZW9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoSnBhRmFjZXQuSUQsICIxLjAiLCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQotCQl0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5jbG9zZShudWxsKTsKLQkJYXNzZXJ0RmFsc2UoIlByb2plY3QgaXMgbm90IGNsb3NlZCIsIHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmlzT3BlbigpKTsKLQkJanBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE51bGwoIkpwYVByb2plY3QgaXMgbm90IG51bGwiLCBqcGFQcm9qZWN0KTsKLQotCQl0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5vcGVuKG51bGwpOwotCQlhc3NlcnRUcnVlKHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmlzT3BlbigpKTsKLQkJanBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoIkpwYVByb2plY3QgaXMgbnVsbCIsIGpwYVByb2plY3QpOwotCQlhc3NlcnRFcXVhbHMoNCwganBhUHJvamVjdC5nZXRKcGFGaWxlc1NpemUoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL3Rlc3QvcGtnL1Rlc3RFbnRpdHkyLmphdmEiKSkpOwotCi0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL29ybS54bWwiKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0RGVsZXRlUmVpbXBvcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy50ZXN0UHJvamVjdC5pbnN0YWxsRmFjZXQoSnBhRmFjZXQuSUQsICIxLjAiLCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRKcGFQcm9qZWN0c1NpemUoKSk7Ci0KLQkJdGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKGZhbHNlLCB0cnVlLCBudWxsKTsKLQkJanBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscygwLCBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCkuZ2V0SnBhUHJvamVjdHNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpLmxlbmd0aCk7Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKS5nZXROYW1lKCkpOwotCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKS5sZW5ndGgpOwotCQlwcm9qZWN0Lm9wZW4obnVsbCk7Ci0KLQkJYXNzZXJ0VHJ1ZShwcm9qZWN0LmlzT3BlbigpKTsKLQkJYXNzZXJ0VHJ1ZShKcGFGYWNldC5pc0luc3RhbGxlZChwcm9qZWN0KSk7Ci0JCWpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmdldEpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eS5qYXZhIikpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL29ybS54bWwiKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RGYWNldEluc3RhbGxVbmluc3RhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpKTsKLQotCQl0aGlzLnRlc3RQcm9qZWN0Lmluc3RhbGxGYWNldChKcGFGYWNldC5JRCwgIjEuMCIsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLmdldEpwYVByb2plY3RzU2l6ZSgpKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGpwYVByb2plY3QuZ2V0SnBhRmlsZXNTaXplKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5LmphdmEiKSkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy90ZXN0L3BrZy9UZXN0RW50aXR5Mi5qYXZhIikpKTsKLQotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwiKSkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQotCQl0aGlzLnRlc3RQcm9qZWN0LnVuaW5zdGFsbEZhY2V0KEpwYUZhY2V0LklELCAiMS4wIik7Ci0JCWFzc2VydEVxdWFscygwLCBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCkuZ2V0SnBhUHJvamVjdHNTaXplKCkpOwotCQlqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWRpdEZhY2V0U2V0dGluZ3NGaWxlQWRkVGhlblJlbW92ZUpwYUZhY2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0KLQkJLy8gYWRkIHRoZSBKUEEgZmFjZXQgYnkgbW9kaWZ5aW5nIHRoZSBmYWNldCBzZXR0aW5ncyBmaWxlIGRpcmVjdGx5Ci0JCUlGaWxlIGZhY2V0U2V0dGluZ3NGaWxlID0gdGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICIuc2V0dGluZ3Mvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUueG1sIik7Ci0JCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZmFjZXRTZXR0aW5nc0ZpbGUuZ2V0Q29udGVudHMoKSk7Ci0JCWludCBmaWxlU2l6ZSA9IGluU3RyZWFtLmF2YWlsYWJsZSgpOwotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbZmlsZVNpemVdOwotCQlpblN0cmVhbS5yZWFkKGJ1Zik7Ci0JCWluU3RyZWFtLmNsb3NlKCk7Ci0KLQkJU3RyaW5nIG9sZERvY3VtZW50ID0gbmV3IFN0cmluZyhidWYpOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gIjxpbnN0YWxsZWQgZmFjZXQ9XCJqYXZhXCIgdmVyc2lvbj1cIjEuNVwiLz4iOwotCQlTdHJpbmcgbmV3U3RyaW5nID0gb2xkU3RyaW5nICsgQ1IgKyAiICAiICsgIjxpbnN0YWxsZWQgZmFjZXQ9XCJqcHQuanBhXCIgdmVyc2lvbj1cIjEuMFwiLz4iOwotCQlTdHJpbmcgbmV3RG9jdW1lbnQgPSBvbGREb2N1bWVudC5yZXBsYWNlQWxsKG9sZFN0cmluZywgbmV3U3RyaW5nKTsKLQotCQlmYWNldFNldHRpbmdzRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3RG9jdW1lbnQuZ2V0Qnl0ZXMoKSksIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKS5nZXRKcGFQcm9qZWN0c1NpemUoKSk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCS8vIHBlcnNpc3RlbmNlLnhtbCBhbmQgb3JtLnhtbCBkbyBub3QgZ2V0IGNyZWF0ZWQgaW4gdGhpcyBzaXR1YXRpb24gKD8pCi0JCWFzc2VydEVxdWFscygyLCBqcGFQcm9qZWN0LmdldEpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eS5qYXZhIikpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIikpKTsKLS8vCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QuZ2V0SnBhRmlsZSh0aGlzLmdldEZpbGUodGhpcy50ZXN0UHJvamVjdCwgInNyYy9NRVRBLUlORi9vcm0ueG1sIikpKTsKLQotCi0JCS8vIG5vdyByZW1vdmUgdGhlIEpQQSBmYWNldAotCQlmYWNldFNldHRpbmdzRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob2xkRG9jdW1lbnQuZ2V0Qnl0ZXMoKSksIGZhbHNlLCBmYWxzZSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygwLCBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCkuZ2V0SnBhUHJvamVjdHNTaXplKCkpOwotCQlqcGFQcm9qZWN0ID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0KHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJYXNzZXJ0TnVsbChqcGFQcm9qZWN0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVkaXRGYWNldFNldHRpbmdzRmlsZVJlbW92ZVRoZW5BZGRKcGFGYWNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnRlc3RQcm9qZWN0Lmluc3RhbGxGYWNldChKcGFGYWNldC5JRCwgIjEuMCIsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QodGhpcy50ZXN0UHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCi0JCS8vIHJlbW92ZSB0aGUgSlBBIGZhY2V0IGJ5IG1vZGlmeWluZyB0aGUgZmFjZXQgc2V0dGluZ3MgZmlsZSBkaXJlY3RseQotCQlJRmlsZSBmYWNldFNldHRpbmdzRmlsZSA9IHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAiLnNldHRpbmdzL29yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnhtbCIpOwotCQlJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGZhY2V0U2V0dGluZ3NGaWxlLmdldENvbnRlbnRzKCkpOwotCQlpbnQgZmlsZVNpemUgPSBpblN0cmVhbS5hdmFpbGFibGUoKTsKLQkJYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2ZpbGVTaXplXTsKLQkJaW5TdHJlYW0ucmVhZChidWYpOwotCQlpblN0cmVhbS5jbG9zZSgpOwotCi0JCVN0cmluZyBvbGREb2N1bWVudCA9IG5ldyBTdHJpbmcoYnVmKTsKLQkJU3RyaW5nIG9sZFN0cmluZyA9ICI8aW5zdGFsbGVkIGZhY2V0PVwiamF2YVwiIHZlcnNpb249XCIxLjVcIi8+IiArIENSICsgIiAgIiArICI8aW5zdGFsbGVkIGZhY2V0PVwianB0LmpwYVwiIHZlcnNpb249XCIxLjBcIi8+IjsKLQkJU3RyaW5nIG5ld1N0cmluZyA9ICI8aW5zdGFsbGVkIGZhY2V0PVwiamF2YVwiIHZlcnNpb249XCIxLjVcIi8+IjsKLQkJU3RyaW5nIG5ld0RvY3VtZW50ID0gb2xkRG9jdW1lbnQucmVwbGFjZUFsbChvbGRTdHJpbmcsIG5ld1N0cmluZyk7Ci0KLQkJZmFjZXRTZXR0aW5nc0ZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ld0RvY3VtZW50LmdldEJ5dGVzKCkpLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLmdldEpwYVByb2plY3RzU2l6ZSgpKTsKLQkJanBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE51bGwoanBhUHJvamVjdCk7Ci0KLQkJLy8gbm93IGFkZCB0aGUgSlBBIGZhY2V0IGJhY2sKLQkJZmFjZXRTZXR0aW5nc0ZpbGUuc2V0Q29udGVudHMobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG9sZERvY3VtZW50LmdldEJ5dGVzKCkpLCBmYWxzZSwgZmFsc2UsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMSwgSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpLmdldEpwYVByb2plY3RzU2l6ZSgpKTsKLQkJanBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWFzc2VydEVxdWFscyg0LCBqcGFQcm9qZWN0LmdldEpwYUZpbGVzU2l6ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eS5qYXZhIikpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0LmdldEpwYUZpbGUodGhpcy5nZXRGaWxlKHRoaXMudGVzdFByb2plY3QsICJzcmMvdGVzdC9wa2cvVGVzdEVudGl0eTIuamF2YSIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCIpKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdC5nZXRKcGFGaWxlKHRoaXMuZ2V0RmlsZSh0aGlzLnRlc3RQcm9qZWN0LCAic3JjL01FVEEtSU5GL29ybS54bWwiKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9tb2RlbC9KcHRKcGFDb3JlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdEpwYUNvcmVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNmRlMjkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL21vZGVsL0pwdEpwYUNvcmVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRKcGFDb3JlTW9kZWxUZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhQ29yZU1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKcGFQcm9qZWN0TWFuYWdlclRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0SnBhQ29yZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0Jhc2VKcGFQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYVBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyYzM1OC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vQmFzZUpwYVBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnBsYXRmb3JtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQmFzZUpwYVBsYXRmb3JtVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZQotewotCXByb3RlY3RlZCBUZXN0SnBhUHJvamVjdCBqcGFQcm9qZWN0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIlBsYXRmb3JtVGVzdFByb2plY3QiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJwbGF0Zm9ybS50ZXN0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9YTUxfTE9DQVRJT04gPSAic3JjL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JNX1hNTF9MT0NBVElPTiA9ICJzcmMvTUVUQS1JTkYvb3JtLnhtbCI7Ci0JCi0JCi0JcHVibGljIEJhc2VKcGFQbGF0Zm9ybVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuanBhUHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZGVsZXRlKHRydWUsIHRydWUsIG51bGwpOwotCQl0aGlzLmpwYVByb2plY3QgPSBudWxsOwotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLS8vCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50VHlwZXMoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotLy8JCUlGaWxlIHBlcnNpc3RlbmNlWG1sSUZpbGUgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGaWxlKFBFUlNJU1RFTkNFX1hNTF9MT0NBVElPTik7Ci0vLwkJSUpwYUZpbGUgcGVyc2lzdGVuY2VYbWxKcGFGaWxlID0ganBhUHJvamVjdC5nZXRKcGFQcm9qZWN0KCkuZ2V0SnBhRmlsZShwZXJzaXN0ZW5jZVhtbElGaWxlKTsKLS8vCQlQZXJzaXN0ZW5jZVhtbFJvb3RDb250ZW50Tm9kZSBwZXJzaXN0ZW5jZVJvb3QgPSAoUGVyc2lzdGVuY2VYbWxSb290Q29udGVudE5vZGUpIHBlcnNpc3RlbmNlWG1sSnBhRmlsZS5nZXRDb250ZW50KCk7Ci0vLwkJWG1sUGVyc2lzdGVuY2UgcGVyc2lzdGVuY2UgPSBwZXJzaXN0ZW5jZVJvb3QuZ2V0UGVyc2lzdGVuY2UoKTsKLS8vCQkKLS8vCQlJRmlsZSBvcm1YbWxJRmlsZSA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmdldEZpbGUoT1JNX1hNTF9MT0NBVElPTik7Ci0vLwkJSUpwYUZpbGUgb3JtWG1sSnBhRmlsZSA9IGpwYVByb2plY3QuZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGUob3JtWG1sSUZpbGUpOwotLy8JCVhtbFJvb3RDb250ZW50Tm9kZSBvcm1Sb290ID0gKFhtbFJvb3RDb250ZW50Tm9kZSkgb3JtWG1sSnBhRmlsZS5nZXRDb250ZW50KCk7Ci0vLwkJRW50aXR5TWFwcGluZ3NJbnRlcm5hbCBlbnRpdHlNYXBwaW5ncyA9IG9ybVJvb3QuZ2V0RW50aXR5TWFwcGluZ3MoKTsKLS8vCQkKLS8vCQkvLyBhZGQgeG1sIHBlcnNpc3RlbnQgdHlwZQotLy8JCVhtbEVudGl0eUludGVybmFsIHhtbEVudGl0eSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEVudGl0eUludGVybmFsKCk7Ci0vLwkJeG1sRW50aXR5LnNldFNwZWNpZmllZE5hbWUoIlhtbEVudGl0eSIpOwotLy8JCWVudGl0eU1hcHBpbmdzLmdldFR5cGVNYXBwaW5ncygpLmFkZCh4bWxFbnRpdHkpOwotLy8JCWVudGl0eU1hcHBpbmdzLmVSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGpwYVByb2plY3QuZ2V0SnBhUHJvamVjdCgpLmdldFBsYXRmb3JtKCkucGVyc2lzdGVudFR5cGVzKFBST0pFQ1RfTkFNRSkpKTsKLS8vCQkKLS8vCQkvLyBhZGQgamF2YSBwZXJzaXN0ZW50IHR5cGUKLS8vCQlqcGFQcm9qZWN0LmNyZWF0ZVR5cGUoUEFDS0FHRV9OQU1FLCAiSmF2YUVudGl0eS5qYXZhIiwgCi0vLwkJCQkiQEVudGl0eSBwdWJsaWMgY2xhc3MgSmF2YUVudGl0eSB7fSIKLS8vCQkJKTsKLS8vCQlYbWxKYXZhQ2xhc3NSZWYgamF2YUNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVKYXZhQ2xhc3NSZWYoKTsKLS8vCQlqYXZhQ2xhc3NSZWYuc2V0SmF2YUNsYXNzKFBBQ0tBR0VfTkFNRSArICIuSmF2YUVudGl0eSIpOwotLy8JCXBlcnNpc3RlbmNlLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5nZXQoMCkuZ2V0Q2xhc3NlcygpLmFkZChqYXZhQ2xhc3NSZWYpOwotLy8JCXBlcnNpc3RlbmNlLmVSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKGpwYVByb2plY3QuZ2V0SnBhUHJvamVjdCgpLmdldFBsYXRmb3JtKCkucGVyc2lzdGVudFR5cGVzKFBST0pFQ1RfTkFNRSkpKTsKLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnBhUGxhdGZvcm1FeHRlbnNpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzg3YzQ2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklBY3Rpb25Db25maWdGYWN0b3J5OwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKcGFQbGF0Zm9ybUV4dGVuc2lvblRlc3RzIGV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0lEID0gVGVzdEpwYVBsYXRmb3JtUHJvdmlkZXIuSUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIFRFU1RfUExBVEZPUk1fREVTQyA9IAotCQkJSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybShURVNUX1BMQVRGT1JNX0lEKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0xBQkVMID0gIlRlc3QgSnBhIFBsYXRmb3JtIjsKLQkKLQlwcm90ZWN0ZWQgVGVzdEpwYVByb2plY3QgdGVzdFByb2plY3Q7Ci0KLQlwdWJsaWMgSnBhUGxhdGZvcm1FeHRlbnNpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl2ZXJpZnlFeHRlbnNpb25UZXN0UHJvamVjdEV4aXN0cygpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgVGVzdEphdmFQcm9qZWN0IGJ1aWxkSmF2YVByb2plY3QoYm9vbGVhbiBhdXRvQnVpbGQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgYXV0b0J1aWxkLCB0aGlzLmJ1aWxkQ29uZmlnKCkpOwotCX0KLQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlBY3Rpb25Db25maWdGYWN0b3J5IGNvbmZpZ0ZhY3RvcnkgPSBuZXcgSnBhRmFjZXRJbnN0YWxsRGF0YU1vZGVsUHJvdmlkZXIoKTsKLQkJSURhdGFNb2RlbCBjb25maWcgPSAoSURhdGFNb2RlbCkgY29uZmlnRmFjdG9yeS5jcmVhdGUoKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KElGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuRkFDRVRfVkVSU0lPTl9TVFIsIEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIFRFU1RfUExBVEZPUk1fREVTQyk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUV4dGVuc2lvblRlc3RQcm9qZWN0RXhpc3RzKCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgZXh0ZW5zaW9uUG9pbnQgPSAKLQkJCXJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KEpwdEpwYUNvcmVQbHVnaW4uUExVR0lOX0lELCAianBhUGxhdGZvcm0iKTsKLQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBleHRlbnNpb25Qb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCWJvb2xlYW4gZXh0ZW5zaW9uRm91bmQgPSBmYWxzZTsKLQkJZm9yIChJRXh0ZW5zaW9uIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKLQkJCWlmIChleHRlbnNpb24uZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkuZXF1YWxzKEV4dGVuc2lvblRlc3RQbHVnaW4uUExVR0lOX0lEKSkgewotCQkJCWV4dGVuc2lvbkZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoIWV4dGVuc2lvbkZvdW5kKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWlzc2luZyBFeHRlbnNpb24gIiArIFRFU1RfUExBVEZPUk1fSUQgKyAiLiBUaGUgRXh0ZW5zaW9uVGVzdFByb2plY3QgcGx1Z2luIG11c3QgYmUgaW4geW91ciB0ZXN0aW5nIHdvcmtzcGFjZS4iKTsKLQkJfQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsSnBhUGxhdGZvcm1JZHMoKSB7Ci0JCWFzc2VydFRydWUoQ29sbGVjdGlvblRvb2xzLnNpemUoSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybXMoKSkgPj0gMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQbGF0Zm9ybUxhYmVsKCkgewotCQlhc3NlcnRFcXVhbHMoVEVTVF9QTEFURk9STV9MQUJFTCwgSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQbGF0Zm9ybU1hbmFnZXIoKS5nZXRKcGFQbGF0Zm9ybShURVNUX1BMQVRGT1JNX0lEKS5nZXRMYWJlbCgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQbGF0Zm9ybSgpIHsKLQkJYXNzZXJ0Tm90TnVsbChKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmJ1aWxkSnBhUGxhdGZvcm1JbXBsZW1lbnRhdGlvbih0aGlzLnRlc3RQcm9qZWN0LmdldFByb2plY3QoKSkpOwkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NjZjYzEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5FeHRlbnNpb25UZXN0UGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkphdmFUZXN0VHlwZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5KYXZhVGVzdFR5cGVNYXBwaW5nRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UuVGVzdEphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLlRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkNvbnRleHRNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUFjdGlvbkNvbmZpZ0ZhY3Rvcnk7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYVBsYXRmb3JtVGVzdHMKLQlleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IHRlc3RQcm9qZWN0OwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExVR0lOX0NMQVNTID0gRXh0ZW5zaW9uVGVzdFBsdWdpbi5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMQVRGT1JNX0NMQVNTX05BTUUgPSBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9MQUJFTCA9ICJUZXN0IEpwYSBQbGF0Zm9ybSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9KUEFfRkFDVE9SWSA9IFRlc3RKcGFGYWN0b3J5LmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1RZUEVfTUFQUElOR19QUk9WSURFUl9DTEFTUyA9IEphdmFUZXN0VHlwZU1hcHBpbmdEZWZpbml0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0FUVFJJQlVURV9NQVBQSU5HX1BST1ZJREVSX0NMQVNTID0gSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nRGVmaW5pdGlvbi5jbGFzcy5nZXROYW1lKCk7Ci0JCi0JcHVibGljIEpwYVBsYXRmb3JtVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJSnBhUGxhdGZvcm1FeHRlbnNpb25UZXN0cy52ZXJpZnlFeHRlbnNpb25UZXN0UHJvamVjdEV4aXN0cygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBUZXN0SmF2YVByb2plY3QgYnVpbGRKYXZhUHJvamVjdChib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBzdXBlci5idWlsZEpwYVByb2plY3QoUFJPSkVDVF9OQU1FLCBhdXRvQnVpbGQsIHRoaXMuYnVpbGRDb25maWcoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRDb25maWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUFjdGlvbkNvbmZpZ0ZhY3RvcnkgY29uZmlnRmFjdG9yeSA9IG5ldyBKcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcigpOwotCQlJRGF0YU1vZGVsIGNvbmZpZyA9IChJRGF0YU1vZGVsKSBjb25maWdGYWN0b3J5LmNyZWF0ZSgpOwotCQljb25maWcuc2V0UHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUiwgSnBhRmFjZXQuVkVSU0lPTl8xXzAuZ2V0VmVyc2lvblN0cmluZygpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KAotCQkJCQlKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIAotCQkJCQlKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVBsYXRmb3JtTWFuYWdlcigpLmdldEpwYVBsYXRmb3JtKFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLklEKSk7Ci0JCXJldHVybiBjb25maWc7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm0ganBhUGxhdGZvcm0oKSB7Ci0JCXJldHVybiB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRKcGFQbGF0Zm9ybSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKcGFGYWN0b3J5KCkgewotCQlhc3NlcnRUcnVlKGpwYVBsYXRmb3JtKCkuZ2V0SnBhRmFjdG9yeSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpLmVxdWFscyhURVNUX0pQQV9GQUNUT1JZKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RCdWlsZEphdmFUeXBlTWFwcGluZ0Zyb21NYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQl0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoSmF2YVRlc3RUeXBlTWFwcGluZy5URVNUX1RZUEVfTUFQUElOR19LRVkpOwotCQlKYXZhVHlwZU1hcHBpbmcgbWFwcGluZyA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhVGVzdFR5cGVNYXBwaW5nKTsKLQkJCi0JCXRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSk7Ci0JCW1hcHBpbmcgPSB0aGlzLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nIGluc3RhbmNlb2YgVGVzdEphdmFFbnRpdHkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEJ1aWxkSmF2YUF0dHJpYnV0ZU1hcHBpbmdGcm9tTWFwcGluZ0tleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YUF0dHJpYnV0ZSA9IHRoaXMuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoIm5hbWUiKTsKLQkJamF2YUF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KEphdmFUZXN0QXR0cmlidXRlTWFwcGluZy5URVNUX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBqYXZhQXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nIGluc3RhbmNlb2YgSmF2YVRlc3RBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJCi0JCWphdmFBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQltYXBwaW5nID0gamF2YUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUobWFwcGluZyBpbnN0YW5jZW9mIFRlc3RKYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcHJvamVjdHMvVGVzdEpwYVByb2plY3QuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SnBhUHJvamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmVjMjM4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9wcm9qZWN0cy9UZXN0SnBhUHJvamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuc3luY2hyb25pemVycy5DYWxsYmFja1N5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5zeW5jaHJvbml6ZXJzLlN5bmNocm9ub3VzU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLkNhbGxiYWNrU3luY2hyb25pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5zeW5jaHJvbml6ZXJzLlN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmFjZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLmRhdGFtb2RlbC5wcm9wZXJ0aWVzLklGYWNldERhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi0vKioKLSAqIFRoaXMgYnVpbGRzIGFuZCBob2xkcyBhICJKUEEiIHByb2plY3QuCi0gKiBTdXBwb3J0IGZvciBhZGRpbmcgcGFja2FnZXMgYW5kIHR5cGVzLgotICogCi0gKiBUaGUgSlBBIHByb2plY3QncyBzZXR0aW5ncyAocGxhdGZvcm0sIGRhdGFiYXNlIGNvbm5lY3Rpb24sIGV0Yy4pIGNhbiBiZQotICogY29udHJvbGxlZCBieSBidWlsZGluZyBhIGRhdGEgbW9kZWwgYW5kIHBhc3NpbmcgaXQgaW50byB0aGUgY29uc3RydWN0b3IuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRlc3RKcGFQcm9qZWN0IGV4dGVuZHMgVGVzdEphdmFQcm9qZWN0IHsKLQlmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuamFyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmphciI7Ci0KLQotCS8vICoqKioqKioqKiogYnVpbGRlcnMgKioqKioqKioqKgotCi0JcHVibGljIHN0YXRpYyBUZXN0SnBhUHJvamVjdCBidWlsZEpwYVByb2plY3QoU3RyaW5nIGJhc2VQcm9qZWN0TmFtZSwgYm9vbGVhbiBhdXRvQnVpbGQsIElEYXRhTW9kZWwganBhQ29uZmlnKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFRlc3RKcGFQcm9qZWN0KGJhc2VQcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBqcGFDb25maWcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVGVzdEpwYVByb2plY3QgYnVpbGRKcGFQcm9qZWN0KFN0cmluZyBiYXNlUHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gYnVpbGRKcGFQcm9qZWN0KGJhc2VQcm9qZWN0TmFtZSwgYXV0b0J1aWxkLCBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycy9pbml0aWFsaXphdGlvbiAqKioqKioqKioqCi0KLQlwdWJsaWMgVGVzdEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXRoaXMocHJvamVjdE5hbWUsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgVGVzdEpwYVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lLCBib29sZWFuIGF1dG9CdWlsZCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aGlzKHByb2plY3ROYW1lLCBhdXRvQnVpbGQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBUZXN0SnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzdXBlcihwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsKLQkJU3RyaW5nIGpwYUZhY2V0VmVyc2lvbiA9IEpwYUZhY2V0LlZFUlNJT05fMV8wLmdldFZlcnNpb25TdHJpbmcoKTsKLQkJaWYgKGpwYUNvbmZpZyAhPSBudWxsKSB7Ci0JCQlqcGFGYWNldFZlcnNpb24gPSBqcGFDb25maWcuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUik7Ci0JCX0KLQkJdGhpcy5pbnN0YWxsRmFjZXQoImpzdC51dGlsaXR5IiwgIjEuMCIpOwotCQl0aGlzLmluc3RhbGxGYWNldChKcGFGYWNldC5JRCwganBhRmFjZXRWZXJzaW9uLCBqcGFDb25maWcpOwotCQl0aGlzLmFkZEphcihqcGFKYXJOYW1lKCkpOwotCQlpZiAoZWNsaXBzZUxpbmtKYXJOYW1lKCkgIT0gbnVsbCkgewotCQkJdGhpcy5hZGRKYXIoZWNsaXBzZUxpbmtKYXJOYW1lKCkpOwotCQl9Ci0JCXRoaXMuanBhUHJvamVjdCA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdCh0aGlzLmdldFByb2plY3QoKSk7Ci0JCXRoaXMuanBhUHJvamVjdC5zZXREaXNjb3ZlcnNBbm5vdGF0ZWRDbGFzc2VzKHRydWUpOwotCQl0aGlzLmpwYVByb2plY3Quc2V0Q29udGV4dE1vZGVsU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplcigpKTsKLQkJdGhpcy5qcGFQcm9qZWN0LnNldFVwZGF0ZVN5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFN5bmNocm9uaXplciBidWlsZFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9ub3VzU3luY2hyb25pemVyKHRoaXMuYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbW1hbmQgYnVpbGRTeW5jaHJvbm91c0NvbnRleHRNb2RlbFN5bmNocm9uaXplckNvbW1hbmQoKSB7Ci0JCXJldHVybiBuZXcgU3luY2hyb25vdXNDb250ZXh0TW9kZWxTeW5jaHJvbml6ZXJDb21tYW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFN5bmNocm9ub3VzQ29udGV4dE1vZGVsU3luY2hyb25pemVyQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmQgewotCQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCQkJVGVzdEpwYVByb2plY3QudGhpcy5qcGFQcm9qZWN0LnN5bmNocm9uaXplQ29udGV4dE1vZGVsKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENhbGxiYWNrU3luY2hyb25pemVyIGJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXIoKSB7Ci0JCXJldHVybiBuZXcgQ2FsbGJhY2tTeW5jaHJvbm91c1N5bmNocm9uaXplcih0aGlzLmJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb21tYW5kIGJ1aWxkU3luY2hyb25vdXNVcGRhdGVTeW5jaHJvbml6ZXJDb21tYW5kKCkgewotCQlyZXR1cm4gbmV3IFN5bmNocm9ub3VzVXBkYXRlU3luY2hyb25pemVyQ29tbWFuZCgpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBTeW5jaHJvbm91c1VwZGF0ZVN5bmNocm9uaXplckNvbW1hbmQgaW1wbGVtZW50cyBDb21tYW5kIHsKLQkJcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJCVRlc3RKcGFQcm9qZWN0LnRoaXMuanBhUHJvamVjdC51cGRhdGUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBqcGFKYXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZWNsaXBzZUxpbmtKYXJOYW1lKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3lzdGVtUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIHB1YmxpYyBtZXRob2RzICoqKioqKioqKioKLQotCXB1YmxpYyBKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiB0aGlzLmpwYVByb2plY3Q7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0SnBhQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL0pwdEpwYUNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2OTI1ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0SnBhQ29yZVJlc291cmNlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuSnB0SnBhQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5qcGEyLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlMl8wVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSnB0SmF2YVJlc291cmNlVGVzdHM7Ci0KLS8qKgotICogUmVxdWlyZWQgSmF2YSBzeXN0ZW0gcHJvcGVydHk6Ci0gKiAgIC1Eb3JnLmVjbGlwc2UuanB0LmpwYS5qYXI9PGpwYS5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUNvcmVSZXNvdXJjZU1vZGVsVGVzdHMKLQlleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUNvcmVSZXNvdXJjZU1vZGVsVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0KLQkJaWYgKEpwdEpwYUNvcmVUZXN0cy5yZXF1aXJlZEphcnNFeGlzdHMoKSkgewotCQkJc3VpdGUuYWRkVGVzdChKcHRKYXZhUmVzb3VyY2VUZXN0cy5zdWl0ZSgpKTsKLQkJCXN1aXRlLmFkZFRlc3QoSmF2YVJlc291cmNlMl8wVGVzdHMuc3VpdGUoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdWl0ZS5hZGRUZXN0KFRlc3RTdWl0ZS53YXJuaW5nKEpwdEpwYUNvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEpwYUNvcmVSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODgzMWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQXNzb2NpYXRpb25PdmVycmlkZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgPSAiTVlfQVNTT0NJQVRJT05fT1ZFUlJJREUiOwotCQotCXB1YmxpYyBBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZU1lbWJlci5nZXRBbm5vdGF0aW9uKGluZGV4LCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoYXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydEVxdWFscyhBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDEpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSxASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0JCQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW5zID0gYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbikiLCBjdSk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUubW92ZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydE51bGwoYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Fzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MzRhYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Bc3NvY2lhdGlvbk92ZXJyaWRlc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Bc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEFzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSA9ICJNWV9BU1NPQ0lBVElPTl9PVkVSUklERSI7Ci0JCi0JcHVibGljIEFzc29jaWF0aW9uT3ZlcnJpZGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERVMsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1ufSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBnZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlTWVtYmVyLmdldEFubm90YXRpb24oaW5kZXgsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUpOwotCQlhc3NlcnRFcXVhbHMoQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBc3NvY2lhdGlvbk92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFTU09DSUFUSU9OX09WRVJSSURFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEFzc29jaWF0aW9uT3ZlcnJpZGVUb0JlZ2lubmluZ09mTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXNzb2NpYXRpb25PdmVycmlkZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGpvaW5Db2x1bW5zID0gQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiQkFaXCIpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0KLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMiA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVpcIiksIjsKLQkJZXhwZWN0ZWQzID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksIEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKSk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVBc3NvY2lhdGlvbk92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkJBWlwiKSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMiA9ICJAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCJGT09cIiwgam9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJCQVpcIikpIjsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXNzb2NpYXRpb25PdmVycmlkZXMiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQkKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSB0aGlzLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEpvaW5Db2x1bW5Bbm5vdGF0aW9uPiBqb2luQ29sdW1ucyA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXNzb2NpYXRpb25PdmVycmlkZXMoQEFzc29jaWF0aW9uT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFTU09DSUFUSU9OX09WRVJSSURFX05BTUUgKyAiXCIsIGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1ufSkpIiwgY3UpOwotCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbnMgPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmdldEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0TnVsbChqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSkiLCBjdSk7Ci0KLQkJCi0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZShudWxsKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuYWRkSm9pbkNvbHVtbigwKS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW59KSkiLCBjdSk7Ci0KLQkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXNzb2NpYXRpb25PdmVycmlkZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IHRoaXMuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSBhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0SW5zZXJ0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQlqb2luQ29sdW1uLnNldFRhYmxlKCJUQUJMRSIpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5tb3ZlSm9pbkNvbHVtbigwLCAyKTsKLQkJYXNzZXJ0TnVsbChhc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEFzc29jaWF0aW9uT3ZlcnJpZGVzKEBBc3NvY2lhdGlvbk92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBU1NPQ0lBVElPTl9PVkVSUklERV9OQU1FICsgIlwiLCBqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbiBhc3NvY2lhdGlvbk92ZXJyaWRlID0gdGhpcy5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgYXNzb2NpYXRpb25PdmVycmlkZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gYXNzb2NpYXRpb25PdmVycmlkZS5qb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBc3NvY2lhdGlvbk92ZXJyaWRlcyhAQXNzb2NpYXRpb25PdmVycmlkZShuYW1lID0gXCIiICsgQVNTT0NJQVRJT05fT1ZFUlJJREVfTkFNRSArICJcIiwgam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiZm9vXCIpLCBASm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9BdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlYzBjZjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZU92ZXJyaWRlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX09WRVJSSURFX05BTUUgPSAiTVlfQVRUUklCVVRFX09WRVJSSURFIjsKLQkKLQlwdWJsaWMgQXR0cmlidXRlT3ZlcnJpZGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBnZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VNZW1iZXIuZ2V0QW5ub3RhdGlvbihpbmRleCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnROb3ROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlKTsKLQkJYXNzZXJ0RXF1YWxzKEFUVFJJQlVURV9PVkVSUklERV9OQU1FLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydE51bGwoY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uR2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uU2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnJlbW92ZUNvbHVtbigpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4pOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUuYWRkQ29sdW1uKCk7Ci0JCWNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiLCBjb2x1bW4gPSBAQ29sdW1uKSIsIGN1KTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0F0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMzEyNzYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQXR0cmlidXRlT3ZlcnJpZGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VNZW1iZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVPdmVycmlkZXNUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSA9ICJNWV9BVFRSSUJVVEVfT1ZFUlJJREUiOwotCQotCXB1YmxpYyBBdHRyaWJ1dGVPdmVycmlkZXNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkFUVFJJQlVURV9PVkVSUklERVMsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlV2l0aENvbHVtbk9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQVRUUklCVVRFX09WRVJSSURFLCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KEphdmFSZXNvdXJjZU1lbWJlciByZXNvdXJjZU1lbWJlciwgaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZU1lbWJlci5nZXRBbm5vdGF0aW9uKGluZGV4LCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydE51bGwoY29sdW1uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IHRoaXMuZ2V0QXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZSk7Ci0JCWFzc2VydEVxdWFscyhBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZU9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnRFcXVhbHMoQVRUUklCVVRFX09WRVJSSURFX05BTUUsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEF0dHJpYnV0ZU92ZXJyaWRlV2l0aENvbHVtbk9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gdGhpcy5nZXRBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb25BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uU2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSB0aGlzLmdldEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGb29cIikpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnJlbW92ZUNvbHVtbigpOwotCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQXR0cmlidXRlT3ZlcnJpZGVDb3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAQXR0cmlidXRlT3ZlcnJpZGVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJGT09cIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQkFSXCIsIHRhYmxlID0gXCJCQVpcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGxlbmd0aCA9IDEsIHByZWNpc2lvbiA9IDEsIHNjYWxlID0gMSkpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRBdHRyaWJ1dGVPdmVycmlkZVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCB0YWJsZSA9IFwiQkFaXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxLCBwcmVjaXNpb24gPSAxLCBzY2FsZSA9IDEpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDIgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKSwiOwotCQlleHBlY3RlZDMgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuQVRUUklCVVRFX09WRVJSSURFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUF0dHJpYnV0ZU92ZXJyaWRlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIsIGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkJBUlwiLCB0YWJsZSA9IFwiQkFaXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBsZW5ndGggPSAxLCBwcmVjaXNpb24gPSAxLCBzY2FsZSA9IDEpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDEgPSAiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW4gPSBAQ29sdW1uKG5hbWUgPSBcIkZPT1wiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJCQVJcIiwgdGFibGUgPSBcIkJBWlwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgbGVuZ3RoID0gMSwgcHJlY2lzaW9uID0gMSwgc2NhbGUgPSAxKSkiOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQXR0cmlidXRlT3ZlcnJpZGVzIiwgY3UpOwotCX0KLQkvL25vdCBzdXJlIGkgd2FudCB0byB0ZXN0IHRoaXMgYXBpLCBob3cgY2FuIHdlIGtlZXAgQ29udGFpbmVyQW5ub3RhdGlvbi5hZGQsIG1vdmUsIHJlbW92ZSBmcm9tIGJlaW5nIHB1YmxpYz8KLQkvL3VzZXJzIHNob3VsZCBnbyB0aHJvdWdodCBBYnN0cmFjdEphdmFwZXJzaXN0ZW5jZVJlc291cmNlLiB0aGlzIGdldHMgY29uZnVzaW5nIGJlY2F1c2UgeW91IHdvdWxkIGhhbmRsZSBpdCBkaWZmZXJlbnRseQotCS8vZm9yIG5vbiB0b3AtbGV2ZWwgYW5ub3RhdGlvbnMKLS8vCXB1YmxpYyB2b2lkIHRlc3RBZGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZSgpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotLy8JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlcyBhdHRyaWJ1dGVPdmVycmlkZXMgPSAoQXR0cmlidXRlT3ZlcnJpZGVzKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLS8vCQlhc3NlcnROdWxsKGF0dHJpYnV0ZU92ZXJyaWRlcyk7Ci0vLwkJCi0vLwkJYXR0cmlidXRlUmVzb3VyY2UuYWRkQW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzID0gKEF0dHJpYnV0ZU92ZXJyaWRlcykgYXR0cmlidXRlUmVzb3VyY2UuYW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0vLwkJYXNzZXJ0Tm90TnVsbChhdHRyaWJ1dGVPdmVycmlkZXMpOwotLy8JCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzIik7Ci0vLwkJCi0vLwkJQXR0cmlidXRlT3ZlcnJpZGUgZm9vQXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZXMuYWRkKDApOwotLy8JCWZvb0F0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZvbyIpOwotLy8JCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIikpIik7Ci0vLwotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlIGJhckF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCgwKTsKLS8vCQliYXJBdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCYXIiKTsKLS8vCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkJhclwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIil9KSIpOwotLy8KLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdE1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QXR0cmlidXRlT3ZlcnJpZGVXaXRoQ29sdW1uT25GaWVsZCgpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZVJlc291cmNlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVR5cGVSZXNvdXJjZShjdSk7IAotLy8JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlUmVzb3VyY2UgYXR0cmlidXRlUmVzb3VyY2UgPSB0eXBlUmVzb3VyY2UuZmllbGRzKCkubmV4dCgpOwotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlcyBhdHRyaWJ1dGVPdmVycmlkZXMgPSAoQXR0cmlidXRlT3ZlcnJpZGVzKSBhdHRyaWJ1dGVSZXNvdXJjZS5hbm5vdGF0aW9uKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLS8vCQkKLS8vCQlBdHRyaWJ1dGVPdmVycmlkZSBmb29BdHRyaWJ1dGVPdmVycmlkZSA9IGF0dHJpYnV0ZU92ZXJyaWRlcy5hZGQoMSk7Ci0vLwkJZm9vQXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRm9vIik7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPVwiIiArIEFUVFJJQlVURV9PVkVSUklERV9OQU1FICsgIlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIil9KSIpOwotLy8JCQotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcy5tb3ZlKDAsIDEpOwotLy8JCQotLy8JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpfSkiKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RBdHRyaWJ1dGVPdmVycmlkZVdpdGhDb2x1bW5PbkZpZWxkKCk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRUeXBlUmVzb3VyY2UgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhVHlwZVJlc291cmNlKGN1KTsgCi0vLwkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVSZXNvdXJjZSBhdHRyaWJ1dGVSZXNvdXJjZSA9IHR5cGVSZXNvdXJjZS5maWVsZHMoKS5uZXh0KCk7Ci0vLwkJQXR0cmlidXRlT3ZlcnJpZGVzIGF0dHJpYnV0ZU92ZXJyaWRlcyA9IChBdHRyaWJ1dGVPdmVycmlkZXMpIGF0dHJpYnV0ZVJlc291cmNlLmFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpOwotLy8JCQotLy8JCUF0dHJpYnV0ZU92ZXJyaWRlIGZvb0F0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVzLmFkZCgxKTsKLS8vCQlmb29BdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGb28iKTsKLS8vCQkKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCIiICsgQVRUUklCVVRFX09WRVJSSURFX05BTUUgKyAiXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIkZvb1wiKX0pIik7Ci0vLwkJCi0vLwkJYXR0cmlidXRlT3ZlcnJpZGVzLnJlbW92ZSgwKTsKLS8vCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9XCJGb29cIikpIik7Ci0vLwotLy8JCWF0dHJpYnV0ZU92ZXJyaWRlcy5yZW1vdmUoMCk7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoKSIpOwotLy8KLS8vCX0KLQkKLQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9CYXNpY1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MGRmMzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQmFzaWNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBCYXNpY1Rlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEJhc2ljVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RCYXNpYygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkJBU0lDKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QmFzaWNXaXRoT3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0QmFzaWNXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5CQVNJQywgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyhmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RCYXNpYygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydE5vdE51bGwoYmFzaWMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QmFzaWNXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEJhc2ljV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgYmFzaWMuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQliYXNpYy5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGJhc2ljLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXNpYyhvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0QmFzaWNXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUJhc2ljQW5ub3RhdGlvbiBiYXNpYyA9IChCYXNpY0Fubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQkFTSUMpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBiYXNpYy5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWJhc2ljLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKGJhc2ljLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXNpYyIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEJhc2ljV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlCYXNpY0Fubm90YXRpb24gYmFzaWMgPSAoQmFzaWNBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkJBU0lDKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RCYXNpY1dpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljLmdldEZldGNoKCkpOwotCQkKLQkJYmFzaWMuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGJhc2ljLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBCYXNpYyhmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RCYXNpY1dpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJQmFzaWNBbm5vdGF0aW9uIGJhc2ljID0gKEJhc2ljQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5CQVNJQyk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGJhc2ljLmdldEZldGNoKCkpOwotCQkKLQkJYmFzaWMuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwoYmFzaWMuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEJhc2ljIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YmE4YmUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ29sdW1uVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1RBQkxFID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQkKLQlwdWJsaWMgQ29sdW1uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4odGFibGUgPSBcIiIgKyBDT0xVTU5fVEFCTEUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoZmluYWwgU3RyaW5nIGludEVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbigiICsgaW50RWxlbWVudCArICIgPSA1KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihuYW1lIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHRhYmxlID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRhYmxlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04sIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29sdW1uRGVmaW5pdGlvbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVuaXF1ZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVuaXF1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVuaXF1ZSgpKTsKLQotCQljb2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVuaXF1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKHVuaXF1ZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRVbmlxdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ1bmlxdWUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29sdW1uLmdldE51bGxhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihudWxsYWJsZSA9IGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm51bGxhYmxlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbnNlcnRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoImluc2VydGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKGluc2VydGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImluc2VydGFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidXBkYXRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXBkYXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0VXBkYXRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4odXBkYXRhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVwZGF0YWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInVwZGF0YWJsZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudCgibGVuZ3RoIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCWNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29sdW1uKGxlbmd0aCA9IDUpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImxlbmd0aCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudCgicHJlY2lzaW9uIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJlY2lzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0KLQkJY29sdW1uLnNldFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4ocHJlY2lzaW9uID0gNSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0UHJlY2lzaW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigicHJlY2lzaW9uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoInNjYWxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2FsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFNjYWxlKCkpOwotCi0JCWNvbHVtbi5zZXRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihzY2FsZSA9IDUpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFNjYWxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigic2NhbGUiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiZGU2MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBEaXNjcmltaW5hdG9yQ29sdW1uVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQkKLQlwdWJsaWMgRGlzY3JpbWluYXRvckNvbHVtblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoRGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX0NPTFVNTiwgSlBBLkRJU0NSSU1JTkFUT1JfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQERpc2NyaW1pbmF0b3JDb2x1bW4oZGlzY3JpbWluYXRvclR5cGUgPSBEaXNjcmltaW5hdG9yVHlwZS5DSEFSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoSW50RWxlbWVudChmaW5hbCBTdHJpbmcgaW50RWxlbWVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yQ29sdW1uKCIgKyBpbnRFbGVtZW50ICsgIiA9IDUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBEaXNjcmltaW5hdG9yQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3REaXNjcmltaW5hdG9yQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobmFtZSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvckNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCURpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChEaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQERpc2NyaW1pbmF0b3JDb2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihjb2x1bW5EZWZpbml0aW9uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KCJsZW5ndGgiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCWNvbHVtbi5zZXRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY29sdW1uLmdldExlbmd0aCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvckNvbHVtbihsZW5ndGggPSA1KSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRMZW5ndGgobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobGVuZ3RoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoRGlzY3JpbWluYXRvclR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuQ0hBUiwgY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGlzY3JpbWluYXRvclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE51bGwoY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCi0JCWNvbHVtbi5zZXREaXNjcmltaW5hdG9yVHlwZShEaXNjcmltaW5hdG9yVHlwZS5JTlRFR0VSKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIsIGNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvckNvbHVtbihkaXNjcmltaW5hdG9yVHlwZSA9IElOVEVHRVIpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGRpc2NyaW1pbmF0b3JUeXBlIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9EaXNjcmltaW5hdG9yVmFsdWVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFjZDFiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0Rpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIERpc2NyaW1pbmF0b3JWYWx1ZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRGlzY3JpbWluYXRvclZhbHVlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3REaXNjcmltaW5hdG9yVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARGlzY3JpbWluYXRvclZhbHVlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JWYWx1ZVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBEaXNjcmltaW5hdG9yVmFsdWUodmFsdWUgPSBcImRpc2NyaW1pbmF0b3JcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpc2NyaW1pbmF0b3JWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCi0JCURpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24gZGlzY3JpbWluYXRvclZhbHVlID0gKERpc2NyaW1pbmF0b3JWYWx1ZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5ESVNDUklNSU5BVE9SX1ZBTFVFKTsKLQkJYXNzZXJ0Tm90TnVsbChkaXNjcmltaW5hdG9yVmFsdWUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdERpc2NyaW1pbmF0b3JWYWx1ZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbiBkaXNjcmltaW5hdG9yVmFsdWUgPSAoRGlzY3JpbWluYXRvclZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkRJU0NSSU1JTkFUT1JfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoImRpc2NyaW1pbmF0b3IiLCBkaXNjcmltaW5hdG9yVmFsdWUuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RGlzY3JpbWluYXRvclZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uIGRpc2NyaW1pbmF0b3JWYWx1ZSA9IChEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRElTQ1JJTUlOQVRPUl9WQUxVRSk7Ci0KLQkJZGlzY3JpbWluYXRvclZhbHVlLnNldFZhbHVlKCJmb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARGlzY3JpbWluYXRvclZhbHVlKFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJZGlzY3JpbWluYXRvclZhbHVlLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBEaXNjcmltaW5hdG9yVmFsdWUoIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlZWUxNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbWJlZGRhYmxlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbWJlZGRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVtYmVkZGFibGVBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGFibGVBbmRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVtYmVkZGFibGVBbmRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFbWJlZGRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkYWJsZUFubm90YXRpb24pOwotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydE5vdE51bGwoZW50aXR5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkSWRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzE3ZWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW1iZWRkZWRJZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRJZFRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW1iZWRkZWRJZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREVEX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWRJZCIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVtYmVkZGVkSWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVtYmVkZGVkSWRBbm5vdGF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VtYmVkZGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzNWU3NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbWJlZGRlZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVtYmVkZGVkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVtYmVkZGVkVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFbWJlZGRlZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RW1iZWRkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVtYmVkZGVkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkZWRBbm5vdGF0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQ5ZGU2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbnRpdHlUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OQU1FID0gIkZvbyI7Ci0JCi0JcHVibGljIEVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5KG5hbWUgPSBcIiIgKyBFTlRJVFlfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnRUcnVlKGVudGl0eSAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKEVOVElUWV9OQU1FLCBlbnRpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBlbnRpdHkgPSAoRW50aXR5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydFRydWUoZW50aXR5ICE9IG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnROdWxsKGVudGl0eS5nZXROYW1lKCkpOwotCQllbnRpdHkuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgZW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudGl0eShuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUVudGl0eUFubm90YXRpb24gZW50aXR5ID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnRFcXVhbHMoRU5USVRZX05BTUUsIGVudGl0eS5nZXROYW1lKCkpOwotCQkKLQkJZW50aXR5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudGl0eSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFbnRpdHkobmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBtYXBwaW5nQW5ub3RhdGlvbiA9IChFbnRpdHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwaW5nQW5ub3RhdGlvbik7Ci0JCQotCQlNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbiBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBlZFN1cGVyY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRW51bWVyYXRlZFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ZjhkNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FbnVtZXJhdGVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1lcmF0ZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRW51bWVyYXRlZFRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgRW51bWVyYXRlZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVU1FUkFURUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnVtZXJhdGVkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudW1lcmF0ZWRXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlVNRVJBVEVELCBKUEEuRU5VTV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW51bWVyYXRlZChFbnVtVHlwZS5PUkRJTkFMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW51bWVyYXRlZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5FTlVNRVJBVEVEKTsKLQkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnVtZXJhdGVkV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFbnVtZXJhdGVkQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKEVudW1lcmF0ZWRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkVOVU1FUkFURUQpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnVtZXJhdGVkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJRW51bWVyYXRlZEFubm90YXRpb24gZW51bWVyYXRlZCA9IChFbnVtZXJhdGVkQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5FTlVNRVJBVEVEKTsKLQotCQllbnVtZXJhdGVkLnNldFZhbHVlKEVudW1UeXBlLlNUUklORyk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudW1lcmF0ZWQoU1RSSU5HKSIsIGN1KTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEVudW1lcmF0ZWQoIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudW1lcmF0ZWQiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9HZW5lcmF0ZWRWYWx1ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNTM2YTIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvR2VuZXJhdGVkVmFsdWVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5HZW5lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyYXRlZFZhbHVlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHRU5FUkFUT1IgPSAiTVlfR0VORVJBVE9SIjsKLQlwdWJsaWMgR2VuZXJhdGVkVmFsdWVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RHZW5lcmF0ZWRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkdFTkVSQVRFRF9WQUxVRSwgSlBBLkdFTkVSQVRJT05fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEdlbmVyYXRlZFZhbHVlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlV2l0aEdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkdFTkVSQVRFRF9WQUxVRSwgSlBBLkdFTkVSQVRJT05fVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEdlbmVyYXRlZFZhbHVlKGdlbmVyYXRvciA9IFwiIiArIEdFTkVSQVRPUiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5HRU5FUkFURURfVkFMVUUsIEpQQS5HRU5FUkFUSU9OX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IEdlbmVyYXRpb25UeXBlLlNFUVVFTkNFKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWFzc2VydE5vdE51bGwoZ2VuZXJhdGVkVmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRHZW5lcmF0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlV2l0aEdlbmVyYXRvcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SLCBnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEdlbmVyYXRvcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0R2VuZXJhdGVkVmFsdWVXaXRoR2VuZXJhdG9yKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1IsIGdlbmVyYXRlZFZhbHVlLmdldEdlbmVyYXRvcigpKTsKLQkJCi0JCWdlbmVyYXRlZFZhbHVlLnNldEdlbmVyYXRvcigiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZ2VuZXJhdGVkVmFsdWUuZ2V0R2VuZXJhdG9yKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZShnZW5lcmF0b3IgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCWdlbmVyYXRlZFZhbHVlLnNldEdlbmVyYXRvcihudWxsKTsKLQkJYXNzZXJ0TnVsbChnZW5lcmF0ZWRWYWx1ZS5nZXRHZW5lcmF0b3IoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZ2VuZXJhdG9yIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEdlbmVyYXRlZFZhbHVlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEdlbmVyYXRlZFZhbHVlV2l0aFN0cmF0ZWd5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlHZW5lcmF0ZWRWYWx1ZUFubm90YXRpb24gZ2VuZXJhdGVkVmFsdWUgPSAoR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkdFTkVSQVRFRF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhHZW5lcmF0aW9uVHlwZS5TRVFVRU5DRSwgZ2VuZXJhdGVkVmFsdWUuZ2V0U3RyYXRlZ3koKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RHZW5lcmF0ZWRWYWx1ZVdpdGhTdHJhdGVneSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uIGdlbmVyYXRlZFZhbHVlID0gKEdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuU0VRVUVOQ0UsIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJZ2VuZXJhdGVkVmFsdWUuc2V0U3RyYXRlZ3koR2VuZXJhdGlvblR5cGUuVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoR2VuZXJhdGlvblR5cGUuVEFCTEUsIGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBHZW5lcmF0ZWRWYWx1ZShzdHJhdGVneSA9IFRBQkxFKSIsIGN1KTsKLQkJCi0JCWdlbmVyYXRlZFZhbHVlLnNldFN0cmF0ZWd5KG51bGwpOwotCQlhc3NlcnROdWxsKGdlbmVyYXRlZFZhbHVlLmdldFN0cmF0ZWd5KCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigic3RyYXRlZ3kiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSWRDbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VkNTExMS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZENsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBJZENsYXNzVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9DTEFTU19WQUxVRSA9ICJNeUNsYXNzIjsKLQkKLQlwdWJsaWMgSWRDbGFzc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdElkQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5JRF9DTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkQ2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SWRDbGFzc1dpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLklEX0NMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWRDbGFzcygiICsgSURfQ0xBU1NfVkFMVUUgKyAiLmNsYXNzKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SWRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLklEX0NMQVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChpZENsYXNzKTsKLQkJYXNzZXJ0TnVsbChpZENsYXNzLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SWRDbGFzc1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLklEX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKElEX0NMQVNTX1ZBTFVFLCBpZENsYXNzLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SWRDbGFzc1dpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLklEX0NMQVNTKTsKLQkJYXNzZXJ0RXF1YWxzKElEX0NMQVNTX1ZBTFVFLCBpZENsYXNzLmdldFZhbHVlKCkpOwotCQkKLQkJaWRDbGFzcy5zZXRWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgaWRDbGFzcy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASWRDbGFzcyhmb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJaWRDbGFzcy5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASWRDbGFzcygiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RJZENsYXNzV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJSWRDbGFzc0Fubm90YXRpb24gaWRDbGFzcyA9IChJZENsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLklEX0NMQVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChpZENsYXNzLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk15Q2xhc3MiLCBpZENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0KLQotCQlpZENsYXNzLnNldFZhbHVlKFRZUEVfTkFNRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBpZENsYXNzLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCkpOwkJCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBJZENsYXNzKCIgKyBUWVBFX05BTUUgKyAiLmNsYXNzKSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0lkVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmYzMwMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9JZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLklkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIElkVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBJZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgbWFwcGluZ0Fubm90YXRpb24gPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBJZEFubm90YXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSW5oZXJpdGFuY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU3YmVlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0luaGVyaXRhbmNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Jbmhlcml0YW5jZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSW5oZXJpdGFuY2VUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIEluaGVyaXRhbmNlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLklOSEVSSVRBTkNFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2UiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0SW5oZXJpdGFuY2VXaXRoU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0YW5jZShzdHJhdGVneSA9IEluaGVyaXRhbmNlVHlwZS5KT0lORUQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SW5oZXJpdGFuY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCUluaGVyaXRhbmNlQW5ub3RhdGlvbiBpbmhlcml0YW5jZSA9IChJbmhlcml0YW5jZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5JTkhFUklUQU5DRSk7Ci0JCWFzc2VydE5vdE51bGwoaW5oZXJpdGFuY2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEluaGVyaXRhbmNlV2l0aFN0cmF0ZWd5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlJbmhlcml0YW5jZUFubm90YXRpb24gaW5oZXJpdGFuY2UgPSAoSW5oZXJpdGFuY2VBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuSU5IRVJJVEFOQ0UpOwotCQlhc3NlcnRFcXVhbHMoSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCwgaW5oZXJpdGFuY2UuZ2V0U3RyYXRlZ3koKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SW5oZXJpdGFuY2UoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlJbmhlcml0YW5jZUFubm90YXRpb24gaW5oZXJpdGFuY2UgPSAoSW5oZXJpdGFuY2VBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuSU5IRVJJVEFOQ0UpOwotCQlpbmhlcml0YW5jZS5zZXRTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3kgPSBUQUJMRV9QRVJfQ0xBU1MpIiwgY3UpOwotCQkKLQkJaW5oZXJpdGFuY2Uuc2V0U3RyYXRlZ3kobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigic3RyYXRlZ3kiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KUFRUb29sc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KUFRUb29sc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OThmODcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSlBUVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkZpZWxkQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5NZXRob2RBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LlR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKUFRUb29sc1Rlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSlBUVG9vbHNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcihmaW5hbCBTdHJpbmcgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiICsgbW9kaWZpZXIgKyAiIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEZpZWxkQXR0cmlidXRlIGZvb0ZpZWxkKElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJcmV0dXJuIHRoaXMuYnVpbGRGaWVsZCgiZm9vIiwgY3UpOwotCX0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoZmluYWwgU3RyaW5nIG1vZGlmaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIgKyBtb2RpZmllciArICIgaW50IGdldEZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKGludCBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBmb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQgaWQpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyAiICsgVFlQRV9OQU1FICsgIigpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICBzdXBlcigpOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVZvaWRNZXRob2RSZXR1cm5UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyB2b2lkIHNldEZvbyhpbnQgaWQpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICB0aGlzLmlkID0gaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlSW52YWxpZE1ldGhvZFJldHVyblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oImNvbS5mb28uRm9vIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBGb28gZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiBudWxsOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oRm9vIGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlSXNNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHB1YmxpYyBib29sZWFuIGlzRm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oYm9vbGVhbiBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJc01ldGhvZFJldHVybkludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBpc0ZvbygpIHsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICAgICByZXR1cm4gdGhpcy5pZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIHZvaWQgc2V0Rm9vKGludCBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVJc0FuZEdldE1ldGhvZFdpdGhNb2RpZmllcihmaW5hbCBTdHJpbmcgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIiArIG1vZGlmaWVyICsgIiBib29sZWFuIGlzRm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiICsgbW9kaWZpZXIgKyAiIGJvb2xlYW4gZ2V0Rm9vKCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHJldHVybiB0aGlzLmlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwdWJsaWMgdm9pZCBzZXRGb28oYm9vbGVhbiBpZCkgeyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgICAgIHRoaXMuaWQgPSBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIH0iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcihmaW5hbCBTdHJpbmcgbW9kaWZpZXIpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHVibGljIGludCBnZXRGb28oKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgcmV0dXJuIHRoaXMuaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICB9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIgKyBtb2RpZmllciArICIgdm9pZCBzZXRGb28oaW50IGlkKSB7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgICAgdGhpcy5pZCA9IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgfSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlV2l0aE1lbWJlclR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29TdGF0aWMge30iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIHB1YmxpYyBjbGFzcyBGb29Ob3RTdGF0aWMge30iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIHB1YmxpYyBAaW50ZXJmYWNlIE15QW5ub3RhdGlvbiB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgcHVibGljIGVudW0gTXlFbnVtIHt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJvdGVjdGVkIE1ldGhvZEF0dHJpYnV0ZSBmb29NZXRob2QoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlyZXR1cm4gdGhpcy5idWlsZE1ldGhvZCgiZ2V0Rm9vIiwgY3UpOwotCX0KLQotCS8vcHJpdmF0ZSBTdHJpbmcgZm9vOyAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkSXNQZXJzaXN0YWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoInByaXZhdGUiKTsKLQkJRmllbGRBdHRyaWJ1dGUgZmllbGRBdHRyaWJ1dGUgPSBmb29GaWVsZChjdSk7Ci0JCWFzc2VydFRydWUoZmllbGRBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9vOyAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZElzUGVyc2lzdGFibGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpZWxkV2l0aE1vZGlmaWVyKCJwcml2YXRlIHN0YXRpYyIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZEF0dHJpYnV0ZSA9IGZvb0ZpZWxkKGN1KTsKLQkJYXNzZXJ0RmFsc2UoZmllbGRBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wcml2YXRlIHRyYW5zaWVudCBTdHJpbmcgZm9vOyAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZElzUGVyc2lzdGFibGUzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpZWxkV2l0aE1vZGlmaWVyKCJwcml2YXRlIHRyYW5zaWVudCIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZEF0dHJpYnV0ZSA9IGZvb0ZpZWxkKGN1KTsKLQkJYXNzZXJ0RmFsc2UoZmllbGRBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wcml2YXRlIGZpbmFsIFN0cmluZyBmb287IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0RmllbGRJc1BlcnNpc3RhYmxlNCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVGaWVsZFdpdGhNb2RpZmllcigicHJpdmF0ZSBmaW5hbCIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZEF0dHJpYnV0ZSA9IGZvb0ZpZWxkKGN1KTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBTdHJpbmcgZm9vOyAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdEZpZWxkSXNQZXJzaXN0YWJsZTUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlRmllbGRXaXRoTW9kaWZpZXIoInB1YmxpYyIpOwotCQlGaWVsZEF0dHJpYnV0ZSBmaWVsZEF0dHJpYnV0ZSA9IGZvb0ZpZWxkKGN1KTsKLQkJYXNzZXJ0VHJ1ZShmaWVsZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQotCS8vcHVibGljIGludCBnZXRGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjAxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3Byb3RlY3RlZCBpbnQgZ2V0Rm9vKCkge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoInByb3RlY3RlZCIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9pbnQgZ2V0Rm9vKCkge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoIiIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wcml2YXRlIGludCBnZXRGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHJpdmF0ZSIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgc3RhdGljIGludCBnZXRGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVHZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyBzdGF0aWMiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCWFzc2VydEZhbHNlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQotCS8vcHVibGljIGZpbmFsIGludCBnZXRGb28oKSB7fSAtIHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjA2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUdldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIGZpbmFsIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBtZXRob2RBdHRyaWJ1dGUgPSBmb29NZXRob2QoY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQotCS8vcHVibGljIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMDcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwdWJsaWMiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCWFzc2VydFRydWUobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCS8vcHJvdGVjdGVkIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMDgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlU2V0TWV0aG9kV2l0aE1vZGlmaWVyKCJwcm90ZWN0ZWQiKTsKLQkJTWV0aG9kQXR0cmlidXRlIG1ldGhvZEF0dHJpYnV0ZSA9IGZvb01ldGhvZChjdSk7Ci0JCWFzc2VydFRydWUobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCS8vdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIwOSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVTZXRNZXRob2RXaXRoTW9kaWZpZXIoIiIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wcml2YXRlIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9ICBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHJpdmF0ZSIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKGludCBmb28pIHt9IC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjExKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVNldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIHN0YXRpYyIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0RmFsc2UobWV0aG9kQXR0cmlidXRlLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCi0JLy9wdWJsaWMgZmluYWwgdm9pZCBzZXRGb28oaW50IGZvbykge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVTZXRNZXRob2RXaXRoTW9kaWZpZXIoInB1YmxpYyBmaW5hbCIpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gZm9vTWV0aG9kKGN1KTsKLQkJYXNzZXJ0VHJ1ZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0KLQkvL3B1YmxpYyBib29sZWFuIGlzRm9vKCkge30gLSBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJc01ldGhvZCgpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gIHRoaXMuYnVpbGRNZXRob2QoImlzRm9vIiwgY3UpOwotCQlhc3NlcnRUcnVlKG1ldGhvZEF0dHJpYnV0ZS5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL3B1YmxpYyBpbnQgaXNGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxNCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJc01ldGhvZFJldHVybkludCgpOwotCQlNZXRob2RBdHRyaWJ1dGUgbWV0aG9kQXR0cmlidXRlID0gIHRoaXMuYnVpbGRNZXRob2QoImlzRm9vIiwgY3UpOwotCQlhc3NlcnRGYWxzZShtZXRob2RBdHRyaWJ1dGUuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgaW50IGlzRm9vKCkge30gLSBwZXJzaXN0YWJsZQotCS8vcHVibGljIGludCBnZXRGb28oKSB7fSAtIG5vdCBwZXJzaXN0YWJsZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJc0FuZEdldE1ldGhvZFdpdGhNb2RpZmllcigicHVibGljIik7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBpc0Zvb01ldGhvZCA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJpc0ZvbyIsIGN1KTsKLQkJTWV0aG9kQXR0cmlidXRlIGdldEZvb01ldGhvZCA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJnZXRGb28iLCBjdSk7Ci0JCQotCQlDb21waWxhdGlvblVuaXQgYXN0Um9vdCA9IHRoaXMuYnVpbGRBU1RSb290KGN1KTsKLQkJYXNzZXJ0VHJ1ZShpc0Zvb01ldGhvZC5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0Rm9vTWV0aG9kLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwotCX0KLQkKLQkvL3B1YmxpYyBpbnQgZm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMTYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlSW52YWxpZE1ldGhvZE5hbWUoKTsKLQkJTWV0aG9kQXR0cmlidXRlIGZvb01ldGhvZCA9ICB0aGlzLmJ1aWxkTWV0aG9kKCJmb28iLCBjdSk7Ci0JCWFzc2VydEZhbHNlKGZvb01ldGhvZC5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQotCS8vcHVibGljIHZvaWQgZ2V0Rm9vKCkge30gLSBub3QgcGVyc2lzdGFibGUgLSB2b2lkIHJldHVybiB0eXBlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVZvaWRNZXRob2RSZXR1cm5UeXBlKCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBmb29NZXRob2QgPSAgdGhpcy5idWlsZE1ldGhvZCgiZ2V0Rm9vIiwgY3UpOwotCQlhc3NlcnRGYWxzZShmb29NZXRob2QuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgRm9vIGdldEZvbygpIHt9IC0gcGVyc2lzdGFibGU/Pz8gLSBGb28gZG9lcyBub3QgcmVzb2x2ZQotCXB1YmxpYyB2b2lkIHRlc3RNZXRob2RJc1BlcnNpc3RhYmxlUHJvcGVydHlHZXR0ZXIxOCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVJbnZhbGlkTWV0aG9kUmV0dXJuVHlwZSgpOwotCQlNZXRob2RBdHRyaWJ1dGUgZ2V0Rm9vTWV0aG9kID0gIHRoaXMuYnVpbGRNZXRob2QoImdldEZvbyIsIGN1KTsKLQkJYXNzZXJ0VHJ1ZShnZXRGb29NZXRob2QuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9tZXRob2Qgd2l0aCBwYXJhbWV0ZXJzIC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjE5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZSgpOwotCQlNZXRob2RBdHRyaWJ1dGUgc2V0SWRNZXRob2QgPSAgaWRTZXRNZXRob2QoY3UpOwotCQlhc3NlcnRGYWxzZShzZXRJZE1ldGhvZC5pc1BlcnNpc3RhYmxlKHRoaXMuYnVpbGRBU1RSb290KGN1KSkpOwotCX0KLQkKLQkvL2NvbnN0cnVjdG9yIC0gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdE1ldGhvZElzUGVyc2lzdGFibGVQcm9wZXJ0eUdldHRlcjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUNvbnN0cnVjdG9yKCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBjb25zdHJ1Y3RvciA9ICBidWlsZE1ldGhvZChUWVBFX05BTUUsIGN1KTsKLQkJYXNzZXJ0RmFsc2UoY29uc3RydWN0b3IuaXNQZXJzaXN0YWJsZSh0aGlzLmJ1aWxkQVNUUm9vdChjdSkpKTsKLQl9Ci0JCi0JLy9ubyBjb3JyZXNwb25kaW5nIHNldCBtZXRob2QgLSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0TWV0aG9kSXNQZXJzaXN0YWJsZVByb3BlcnR5R2V0dGVyMjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU1ldGhvZEF0dHJpYnV0ZSBnZXROYW1lTWV0aG9kID0gIG5hbWVHZXRNZXRob2QoY3UpOwotCQlhc3NlcnRGYWxzZShnZXROYW1lTWV0aG9kLmlzUGVyc2lzdGFibGUodGhpcy5idWlsZEFTVFJvb3QoY3UpKSk7Ci0JfQotCQotCS8vcHVibGljIGNsYXNzIEFubm90YXRpb25UZXN0VHlwZQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RUeXBlKCk7Ci0JCVR5cGUgdHlwZSA9IHRlc3RUeXBlKGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydFRydWUodHlwZS5pc1BlcnNpc3RhYmxlKGFzdFJvb3QpKTsKLQl9Ci0JCi0JLy9wdWJsaWMgZmluYWwgY2xhc3MgTXlGaW5hbAotCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJmaW5hbHMiLCAiTXlGaW5hbC5qYXZhIiwgInB1YmxpYyBmaW5hbCBjbGFzcyBNeUZpbmFsIHsgfSIpOwotCQlUeXBlIHR5cGUgPSBidWlsZFR5cGUoIk15RmluYWwiLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKHR5cGUuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7Ci0JfQotCQotCS8vcHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZQotCXB1YmxpYyB2b2lkIHRlc3RUeXBlSXNQZXJzaXN0YWJsZTMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KCJpbnRlcmZhY2VzIiwgIk15SW50ZXJmYWNlLmphdmEiLCAicHVibGljIGludGVyZmFjZSBNeUludGVyZmFjZSB7IH0iKTsKLQkJVHlwZSB0eXBlID0gYnVpbGRUeXBlKCJNeUludGVyZmFjZSIsIGN1KTsKLQkJQ29tcGlsYXRpb25Vbml0IGFzdFJvb3QgPSB0aGlzLmJ1aWxkQVNUUm9vdChjdSk7Ci0JCWFzc2VydEZhbHNlKHR5cGUuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7Ci0JfQotCQotCS8vZW51bSBub3QgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUlzUGVyc2lzdGFibGU0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZUVudW1BbmRNZW1iZXJzKCJUZXN0RW51bSIsICJGT08sIEJBUiwgQkFaIik7Ci0JCVR5cGUgdHlwZSA9IGJ1aWxkVHlwZSgiVGVzdEVudW0iLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRGYWxzZSh0eXBlLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwotCX0KLQkKLQkvL2Fubm90YXRpb24gbm90IHBlcnNpc3RhYmxlCi0JcHVibGljIHZvaWQgdGVzdFR5cGVJc1BlcnNpc3RhYmxlNSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiVGVzdEFubm90YXRpb24iLCAiVGVzdEVudW0gZm9vKCk7Iik7Ci0JCVR5cGUgdHlwZSA9IGJ1aWxkVHlwZSgiVGVzdEFubm90YXRpb24iLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRGYWxzZSh0eXBlLmlzUGVyc2lzdGFibGUoYXN0Um9vdCkpOwotCX0KLQkKLQkvL3B1YmxpYyBzdGF0aWMgbWVtYmVyIHR5cGUgaXMgcGVyc2lzdGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUlzUGVyc2lzdGFibGU2KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlV2l0aE1lbWJlclR5cGVzKCk7Ci0JCVR5cGUgdGVzdFR5cGUgPSB0aGlzLnRlc3RUeXBlKGN1KTsKLQkJVHlwZSBtZW1iZXJUeXBlID0gdGhpcy5idWlsZFR5cGUodGVzdFR5cGUsICJGb29TdGF0aWMiLCAxLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKG1lbWJlclR5cGUuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7Ci0JfQotCQotCS8vbm9uLXN0YXRpYyBtZW1iZXIgdHlwZSBpcyBwZXJzaXN0YWJsZSwgaGFuZGxlZCB3aXRoIHZhbGlkYXRpb24KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUlzUGVyc2lzdGFibGU3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlV2l0aE1lbWJlclR5cGVzKCk7Ci0JCVR5cGUgdGVzdFR5cGUgPSB0aGlzLnRlc3RUeXBlKGN1KTsKLQkJVHlwZSBtZW1iZXJUeXBlID0gdGhpcy5idWlsZFR5cGUodGVzdFR5cGUsICJGb29Ob3RTdGF0aWMiLCAxLCBjdSk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBhc3RSb290ID0gdGhpcy5idWlsZEFTVFJvb3QoY3UpOwotCQlhc3NlcnRUcnVlKG1lbWJlclR5cGUuaXNQZXJzaXN0YWJsZShhc3RSb290KSk7Ci0JfQotCS8vVE9ETyBzdGlsbCBuZWVkIHRvIHRlc3QgdHlwZUlzUGVyc2lzdGFibGUoKSByZXR1cm5zIGZhbHNlIGZvciBsb2NhbCBhbmQgYW5vbnltb3VzIGNsYXNzZXMKLQotCi19Ci0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUF0dHJpYnV0ZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWMwNWZkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0phdmFSZXNvdXJjZUF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQuRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS51dGlsaXR5LmpkdC5Nb2RpZmllZERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VPbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkJhc2ljQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZUF0dHJpYnV0ZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEphdmFSZXNvdXJjZUF0dHJpYnV0ZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE5vblJlc29sdmluZ0ZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIEZvbyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlVmFyaWFibGVEZWNsYXJhdGlvbnNQZXJMaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZSA9IFwiYmF6XCIpIik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vLCBiYXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZEFuZEJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lID0gXCJGT09cIiwgdGFibGUgPSBcIk1ZX1RBQkxFXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZENvbHVtbkdlbmVyYXRlZFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQ09MVU1OLCBKUEEuSUQsIEpQQS5HRU5FUkFURURfVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAR2VuZXJhdGVkVmFsdWUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNdWx0aXBsZUNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZSA9IFwiRk9PXCIpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZSA9IFwiQkFSXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERFRCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcyhAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZXNFbXB0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREVELCBKUEEuQVRUUklCVVRFX09WRVJSSURFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGVkIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBBdHRyaWJ1dGVPdmVycmlkZXMoKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGgyQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRURERUQsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkZWQiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVQdWJsaWNBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICBwdWJsaWMgU3RyaW5nIGZvbzsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlUGFja2FnZUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICBTdHJpbmcgZm9vOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVGaW5hbEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICBwdWJsaWMgZmluYWwgU3RyaW5nIGZvbzsiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUF0dHJpYnV0ZUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSkpOwotCX0KLQotCS8vVGhpcyB3aWxsIHJlc3VsdCBpbiBhIGNvbXBpbGF0aW9uIGVycm9yLCBidXQgd2UgYXNzdW1lIHRoZSBmaXJzdCBjb2x1bW4gZm91bmQKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uUmVzb3VyY2UgPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2x1bW5SZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlDb2x1bW5Bbm5vdGF0aW9uIGNvbHVtblJlc291cmNlID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWNvbHVtblJlc291cmNlLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbihuYW1lID0gXCJGT09cIikiLCBjdSk7Ci0KLQkJY29sdW1uUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihuYW1lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUF0dHJpYnV0ZU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRBbmRCYXNpYygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkJBU0lDKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJCi0JCUphdmFSZXNvdXJjZU5vZGUgamF2YUF0dHJpYnV0ZU1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBCYXNpY0Fubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEJhc2ljIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuc2V0UHJpbWFyeUFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKGphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIE9uZVRvTWFueUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQElkIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBCYXNpYyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuc2V0UHJpbWFyeUFubm90YXRpb24oSlBBLklELCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASWQiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLnNldFByaW1hcnlBbm5vdGF0aW9uKEpQQS5JRCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKENvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQElkIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEphdmFBdHRyaWJ1dGVNYXBwaW5nQW5ub3RhdGlvbjMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRDb2x1bW5HZW5lcmF0ZWRWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIElkQW5ub3RhdGlvbik7Ci0JCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5zZXRQcmltYXJ5QW5ub3RhdGlvbigKLQkJCQlKUEEuQkFTSUMsIAotCQkJCUFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKLQkJCQkJQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUsCi0JCQkJCUdlbmVyYXRlZFZhbHVlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUV9KSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihCYXNpY0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSBpbnN0YW5jZW9mIEJhc2ljQW5ub3RhdGlvbik7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQElkIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEdlbmVyYXRlZFZhbHVlIiwgY3UpOyAvL25vdCBzdXBwb3J0ZWQgYnkgQmFzaWMKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4iLCBjdSk7IC8vY29tbW9uIGJldHdlZW4gSWQgYW5kIEJhc2ljCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKYXZhQXR0cmlidXRlTWFwcGluZ0Fubm90YXRpb25OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aElkQ29sdW1uR2VuZXJhdGVkVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkgaW5zdGFuY2VvZiBJZEFubm90YXRpb24pOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuc2V0UHJpbWFyeUFubm90YXRpb24oCi0JCQkJbnVsbCwgCi0JCQkJQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10gewotCQkJCQlDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSwKLQkJCQkJR2VuZXJhdGVkVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRX0pKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASWQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAR2VuZXJhdGVkVmFsdWUiLCBjdSk7IC8vbm90IHN1cHBvcnRlZCBieSBCYXNpYwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsgLy9jb21tb24gYmV0d2VlbiBJZCBhbmQgQmFzaWMKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YUF0dHJpYnV0ZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENvbHVtbiIsIGN1KTsKLQkJcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhQXR0cmlidXRlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb2x1bW4iLCBjdSk7Ci0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oSlBBLkNPTFVNTik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ29sdW1uIiwgY3UpOwotCX0KLQkKLQkvL3VwZGF0ZSBzb3VyY2UgY29kZSB0byBjaGFuZ2UgZnJvbSBASWQgdG8gQE9uZVRvT25lIGFuZCBtYWtlIHN1cmUgQENvbHVtbiBpcyBub3QgcmVtb3ZlZAotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VBdHRyaWJ1dGVNYXBwaW5nSW5Tb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlBbm5vdGF0ZWRGaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCWZpbmFsIEphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJaWRGaWVsZChjdSkuZWRpdChuZXcgRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJU291cmNlSWRBbm5vdGF0aW9uLkRFQ0xBUkFUSU9OX0FOTk9UQVRJT05fQURBUFRFUi5yZW1vdmVBbm5vdGF0aW9uKGRlY2xhcmF0aW9uKTsKLQkJCX0KLQkJfSk7CQkKLQkJCi0JCWN1LmNyZWF0ZUltcG9ydCgiamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmUiLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWlkRmllbGQoY3UpLmVkaXQobmV3IEVkaXRvcigpIHsKLQkJCXB1YmxpYyB2b2lkIGVkaXQoTW9kaWZpZWREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbikgewotCQkJCVNvdXJjZU9uZVRvT25lQW5ub3RhdGlvbi5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIubmV3TWFya2VyQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwkJCi0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkNPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbHVtbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YUF0dHJpYnV0ZUFubm90YXRpb25zTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnMoSlBBLkFUVFJJQlVURV9PVkVSUklERSkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbnNOb05lc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhQXR0cmlidXRlQW5ub3RhdGlvbnNDb250YWluZXJOb05lc3RhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzRW1wdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCX0KLQkJCSAgICAgICAgCi0JLy8JCQktLT4+CUBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJGT08iKQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhQXR0cmlidXRlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUF0dHJpYnV0ZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIikiLCBjdSk7Ci0JfQotCQotCS8vICBARW1iZWRkZWQgICAgIAkJCQktLT4+ICAgIEBFbWJlZGRlZAotCS8vCUBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJGT08iKQkJQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iQkFSIil9KQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YUF0dHJpYnV0ZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGhBdHRyaWJ1dGVPdmVycmlkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlQXR0cmlidXRlLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7IEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIikgfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oSlBBLkFUVFJJQlVURV9PVkVSUklERVMpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUF0dHJpYnV0ZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb25zU2l6ZShKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JfQotCQotCS8vICBARW1iZWRkZWQgICAgIAkJCQkKLQkvLwlAQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJGT08iKSkKLQkvLyAgICAgICAgICAgfHwKLQkvLyAgICAgICAgICAgXC8KLQkvLyAgQEVtYmVkZGVkICAgICAJCQkJCi0JLy8JQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWU9IkZPTyIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT0iQkFSIil9KQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhQXR0cmlidXRlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aEF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpLEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbihKUEEuQVRUUklCVVRFX09WRVJSSURFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlQXR0cmlidXRlLmdldEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpKTsKLQl9Ci0KLQkvL0BFbnRpdHkKLQkvL0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lPSJGT08iKQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhQXR0cmlidXRlQW5ub3RhdGlvbk5lc3RhYmxlQ29udGFpbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlIiwgY3UpOwotCX0KLQotCS8vQEVtYmVkZGVkCi0JLy9AQXR0cmlidXRlT3ZlcnJpZGVzKEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIikpCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlyZXNvdXJjZUF0dHJpYnV0ZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIikiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YUF0dHJpYnV0ZUFubm90YXRpb25JbmRleCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aDJBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSB0eXBlUmVzb3VyY2UgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCXJlc291cmNlQXR0cmlidXRlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBUlwiIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEF0dHJpYnV0ZU92ZXJyaWRlcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFBdHRyaWJ1dGVBbm5vdGF0aW9uSW5kZXgyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW1iZWRkZWRXaXRoMkF0dHJpYnV0ZU92ZXJyaWRlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIiksIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbWJlZGRlZFdpdGgyQXR0cmlidXRlT3ZlcnJpZGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIHJlc291cmNlQXR0cmlidXRlID0gdHlwZVJlc291cmNlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIiksIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJCi0JCXJlc291cmNlQXR0cmlidXRlLm1vdmVBbm5vdGF0aW9uKDAsIDIsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlcyh7QEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKSwgQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkZPT1wiKSwiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSmF2YVR5cGVBbm5vdGF0aW9uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVtYmVkZGVkV2l0aDJBdHRyaWJ1dGVPdmVycmlkZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUgcmVzb3VyY2VBdHRyaWJ1dGUgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VBdHRyaWJ1dGUuYWRkQW5ub3RhdGlvbigyLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZXMoe0BBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJGT09cIiksIEBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVJcIiksIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEF0dHJpYnV0ZU92ZXJyaWRlKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VBdHRyaWJ1dGUubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQXR0cmlidXRlT3ZlcnJpZGVzKHtAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiQkFSXCIpLCBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZSA9IFwiRk9PXCIpLCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBBdHRyaWJ1dGVPdmVycmlkZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhOb25SZXNvbHZpbmdGaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZXNvdXJjZUF0dHJpYnV0ZSA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkZvbyIsIHJlc291cmNlQXR0cmlidXRlLmdldFR5cGVOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0KLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoInRlc3QiLCAiRm9vLmphdmEiLCAicHVibGljIGNsYXNzIEZvbyB7fSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkZvbyIsIHJlc291cmNlQXR0cmlidXRlLmdldFR5cGVOYW1lKCkpOwotCX0KLQkKLQkvL3RoaXMgdGVzdHMgdGhhdCB3ZSBoYW5kbGUgbXV0bGlwbGUgdmFyaWFibGUgZGVjbGFyYXRpb25zIGluIG9uZSBsaW5lLgotCS8vVGhlIGFubm90YXRpb25zIHNob3VsZCBhcHBseSB0byBhbGwgZmllbGRzIGRlZmluZWQuICBUaGlzIGlzIG5vdCByZWFsbHkgYSB1c2VmdWwKLQkvL3RoaW5nIHRvIGRvIHdpdGggSlBBIGJleW9uZCB0aGUgbW9zdCBiYXNpYyB0aGluZ3MgdGhhdCB1c2UgZGVmYXVsdCBjb2x1bW4gbmFtZXMKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9uc1BlckxpbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zUGVyTGluZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgQ29sbGVjdGlvblRvb2xzLnNpemUodHlwZVJlc291cmNlLmdldEZpZWxkcygpKSk7Ci0JCUl0ZXJhdG9yPEphdmFSZXNvdXJjZUZpZWxkPiBmaWVsZHMgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IGZpZWxkcy5uZXh0KCk7Ci0JCUNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkID0gZmllbGRzLm5leHQoKTsKLQkJY29sdW1uID0gKENvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzUHVibGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZVB1YmxpY0F0dHJpYnV0ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHR5cGVSZXNvdXJjZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSB0eXBlUmVzb3VyY2UuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRUcnVlKE1vZGlmaWVyLmlzUHVibGljKGF0dHJpYnV0ZS5nZXRNb2RpZmllcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNQdWJsaWNGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVQYWNrYWdlQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEZhbHNlKE1vZGlmaWVyLmlzUHVibGljKGF0dHJpYnV0ZS5nZXRNb2RpZmllcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJc0ZpbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0VHlwZUZpbmFsQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydFRydWUoTW9kaWZpZXIuaXNGaW5hbChhdHRyaWJ1dGUuZ2V0TW9kaWZpZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRmluYWxGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGVQYWNrYWdlQXR0cmlidXRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgdHlwZVJlc291cmNlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGF0dHJpYnV0ZSA9IHR5cGVSZXNvdXJjZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEZhbHNlKE1vZGlmaWVyLmlzRmluYWwoYXR0cmlidXRlLmdldE1vZGlmaWVycygpKSk7Ci0JfQotCQotCS8vVE9ETyBhZGQgdGVzdHMgZm9yIEpQVFRvb2xzIHN0YXRpYyBtZXRob2RzCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzNmYTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZVBhY2thZ2VJbmZvQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLnNvdXJjZS5Tb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5pbnRlcm5hbC51dGlsaXR5LmpkdC5OdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlUGFja2FnZUluZm9Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwudXRpbGl0eS5qZHQuQW5ub3RhdGlvblRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5Db21tYW5kRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkJpdFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5SZWZsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UKLQkJZXh0ZW5kcyBBbm5vdGF0aW9uVGVzdENhc2UgewotCQotCXByaXZhdGUgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lciBqYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyOwotCXByb3RlY3RlZCBKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgamF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotCQotCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIgPSBuZXcgSmF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcigpOwotCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMuamF2YUVsZW1lbnRDaGFuZ2VMaXN0ZW5lcik7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5qYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBKYXZhRWxlbWVudENoYW5nZUxpc3RlbmVyCi0JCQlpbXBsZW1lbnRzIElFbGVtZW50Q2hhbmdlZExpc3RlbmVyIHsKLQkJCi0JCUphdmFFbGVtZW50Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLnRoaXMuamF2YUVsZW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJfQotCQkKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gU3RyaW5nVG9vbHMuYnVpbGRUb1N0cmluZ0Zvcih0aGlzKTsKLQkJfQotCX0KLQkKLQl2b2lkIGphdmFFbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmICh0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5zeW5jV2l0aEphdmFEZWx0YShldmVudC5nZXREZWx0YSgpKTsKLQl9Ci0JCi0JLyoqCi0JICogTkI6IHRoaXMgaXMgY29waWVkIGZyb20gR2VuZXJpY0pwYVByb2plY3QsIHNvIGl0IG1pZ2h0IG5lZWQgdG8gYmUKLQkgKiBrZXB0IGluIHN5bmNoIHdpdGggdGhhdCBjb2RlIGlmIGl0IGNoYW5nZXMuLi4geWVjaC4uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNXaXRoSmF2YURlbHRhKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCXN3aXRjaCAoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50LkpBVkFfTU9ERUwgOgotCQkJY2FzZSBJSmF2YUVsZW1lbnQuSkFWQV9QUk9KRUNUIDoKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCA6Ci0JCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UIDoKLQkJCQl0aGlzLnN5bmNXaXRoSmF2YURlbHRhQ2hpbGRyZW4oZGVsdGEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJSmF2YUVsZW1lbnQuQ09NUElMQVRJT05fVU5JVCA6Ci0JCQkJdGhpcy5qYXZhQ29tcGlsYXRpb25Vbml0Q2hhbmdlZChkZWx0YSk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsgLy8gaWdub3JlIHRoZSBlbGVtZW50cyBpbnNpZGUgYSBjb21waWxhdGlvbiB1bml0Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jV2l0aEphdmFEZWx0YUNoaWxkcmVuKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7Ci0JCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCXRoaXMuc3luY1dpdGhKYXZhRGVsdGEoY2hpbGQpOyAvLyByZWN1cnNlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBqYXZhQ29tcGlsYXRpb25Vbml0Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAodGhpcy5kZWx0YUlzUmVsZXZhbnQoZGVsdGEpKSB7Ci0JCQl0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5zeW5jaHJvbml6ZVdpdGhKYXZhU291cmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBkZWx0YUlzUmVsZXZhbnQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEpIHsKLQkJaWYgKEJpdFRvb2xzLm9ubHlGbGFnSXNTZXQoZGVsdGEuZ2V0RmxhZ3MoKSwgSUphdmFFbGVtZW50RGVsdGEuRl9QUklNQVJZX1dPUktJTkdfQ09QWSkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZGVsdGEuZ2V0S2luZCgpID09IElKYXZhRWxlbWVudERlbHRhLkNIQU5HRUQ7Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGFubm90YXRpb25OYW1lLCBTdHJpbmcgYW5ub3RhdGlvbkJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQocGFja2FnZU5hbWUsIGFubm90YXRpb25OYW1lICsgIi5qYXZhIiwgInB1YmxpYyBAaW50ZXJmYWNlICIgKyBhbm5vdGF0aW9uTmFtZSArICIgeyAiICsgYW5ub3RhdGlvbkJvZHkgKyAiIH0iKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlRW51bUFuZE1lbWJlcnMoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW51bU5hbWUsIFN0cmluZyBlbnVtQm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChwYWNrYWdlTmFtZSwgZW51bU5hbWUgKyAiLmphdmEiLCAicHVibGljIGVudW0gIiArIGVudW1OYW1lICsgIiB7ICIgKyBlbnVtQm9keSArICIgfSIpOwotCX0KLQkKLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlUGFja2FnZSBidWlsZEphdmFSZXNvdXJjZVBhY2thZ2UoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQlKYXZhUmVzb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdCBwa2dDdSA9IAotCQkJCW5ldyBTb3VyY2VQYWNrYWdlSW5mb0NvbXBpbGF0aW9uVW5pdCgKLQkJCQkJCWN1LAotCQkJCQkJdGhpcy5idWlsZEFubm90YXRpb25Qcm92aWRlcigpLAotCQkJCQkJTnVsbEFubm90YXRpb25FZGl0Rm9ybWF0dGVyLmluc3RhbmNlKCksCi0JCQkJCQlDb21tYW5kRXhlY3V0b3IuRGVmYXVsdC5pbnN0YW5jZSgpKTsKLQkJdGhpcy5qYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQgPSBwa2dDdTsKLQkJcmV0dXJuIHBrZ0N1LmdldFBhY2thZ2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBidWlsZEphdmFSZXNvdXJjZVR5cGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQl0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCA9IHRoaXMuYnVpbGRKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQoY3UpOwotCQl0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5yZXNvbHZlVHlwZXMoKTsKLQkJcmV0dXJuIHRoaXMuaGFja0phdmFSZXNvdXJjZVR5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSmF2YVJlc291cmNlVHlwZSBoYWNrSmF2YVJlc291cmNlVHlwZSgpIHsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VUeXBlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZSh0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCwgInByaW1hcnlUeXBlIik7Ci0JfQotCi0JcHJvdGVjdGVkIEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBidWlsZEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdChJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmICh0aGlzLmphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTb3VyY2VUeXBlQ29tcGlsYXRpb25Vbml0KAotCQkJY3UsCi0JCQl0aGlzLmJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCksCi0JCQlOdWxsQW5ub3RhdGlvbkVkaXRGb3JtYXR0ZXIuaW5zdGFuY2UoKSwKLQkJCUNvbW1hbmRFeGVjdXRvci5EZWZhdWx0Lmluc3RhbmNlKCkKLQkJKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpwYUFubm90YXRpb25Qcm92aWRlcih0aGlzLmFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIgYW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIEdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSmF2YVJlc291cmNlVHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMyZWU3NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KYXZhUmVzb3VyY2VUeXBlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0Lk1vZGlmaWVkRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnV0aWxpdHkuamR0LkFubm90YXRlZEVsZW1lbnQuRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5zb3VyY2UuU291cmNlRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLnJlc291cmNlLmphdmEuc291cmNlLlNvdXJjZUVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKYXZhUmVzb3VyY2VUeXBlVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgSmF2YVJlc291cmNlVHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RJbnZhbGlkQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KCJqYXZheC5wZXJzaXN0ZW5jZS5Gb28iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARm9vIik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARm9vIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE1lbWJlckVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIiAgICAgQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbyB7IH0iKS5hcHBlbmQoQ1IpOwotCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5RHVwbGljYXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eShuYW1lID0gXCJGaXJzdEVudGl0eVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5KG5hbWUgPSBcIlNlY29uZEVudGl0eVwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlMYXJnZShmaW5hbCBpbnQgaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkgKyBpKTsKLS8vCQkJfQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiICsgaSk7Ci0vLwkJCQlzYi5hcHBlbmQoQ1IpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgU3RyaW5nIHR5cGVOYW1lKCkgewotLy8JCQkJcmV0dXJuIFRZUEVfTkFNRSArIGk7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLS8vCi0vLwlwdWJsaWMgdm9pZCB0ZXN0TGFyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlmb3IgKGludCBpID0gU1RBUlQ7IGkgPD0gRU5EOyBpKyspIHsKLS8vCQkJdGhpcy5jcmVhdGVBbm5vdGF0aW9uQW5kTWVtYmVycygiRW50aXR5IiAraSwgIlN0cmluZyBuYW1lKCk7Iik7Ci0vLwkJfQotLy8KLS8vCQlMaXN0PElDb21waWxhdGlvblVuaXQ+IGN1cyA9IG5ldyBBcnJheUxpc3Q8SUNvbXBpbGF0aW9uVW5pdD4oKTsKLS8vCQlmb3IgKGludCBpID0gU1RBUlQ7IGkgPD0gRU5EOyBpKyspIHsKLS8vCQkJY3VzLmFkZChjcmVhdGVUZXN0RW50aXR5TGFyZ2UoaSkpOwotLy8JCX0KLS8vCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLwkJTGlzdDxKYXZhUGVyc2lzdGVudHJlc291cmNlVHlwZT4gcmVzb3VyY2VUeXBlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRyZXNvdXJjZVR5cGU+KCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBFTkQ7IGkrKykgewotLy8JCQlyZXNvdXJjZVR5cGVzLmFkZChidWlsZEphdmFyZXNvdXJjZVR5cGUoY3VzLmdldChpKSkpOyAKLS8vCQl9Ci0vLwkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLS8vCQkKLS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oZW5kLXN0YXJ0ICsgIm1zIik7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBFTkQ7IGkrKykgewotLy8JCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VUeXBlcy5nZXQoaSkuamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbnMoKSkpOwotLy8JCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZXMuZ2V0KGkpLmphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24oSlBBLkVOVElUWSArIChpKzEpKSk7Ci0vLwkJfQotLy8JCQotLy8KLS8vLy8JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZVR5cGUuamF2YVR5cGVBbm5vdGF0aW9ucygpKSk7Ci0vLwl9Ci0KLQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lID0gXCJGT09cIiwgc2NoZW1hID0gXCJCQVJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotLy8JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGVBbmRJZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlRW50aXR5QW5ub3RhdGlvbigpOwotLy8JCXRoaXMuY3JlYXRlQW5ub3RhdGlvbkFuZE1lbWJlcnMoIlRhYmxlIiwgIlN0cmluZyBuYW1lKCk7IFN0cmluZyBzY2hlbWEoKTsiKTsKLS8vCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKCJJZENsYXNzIiwgIkNsYXNzIHZhbHVlKCk7Iik7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5UQUJMRSwgSlBBLklEX0NMQVNTKTsKLS8vCQkJfQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLS8vCQkJCXNiLmFwcGVuZChDUik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBUYWJsZSIpOwotLy8JCQkJc2IuYXBwZW5kKENSKTsKLS8vCQkJCXNiLmFwcGVuZCgiQElkQ2xhc3MiKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotLy8KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU11bHRpcGxlVGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRhYmxlKG5hbWUgPSBcIkZPT1wiKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUobmFtZSA9IFwiQkFSXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtcHR5U2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKCkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGgyU2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWVtYmVyVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kTWVtYmVyVHlwZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIiAgICAgc3RhdGljIGNsYXNzIEZvb1N0YXRpYyB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgY2xhc3MgRm9vTm90U3RhdGljIHt9IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICBAaW50ZXJmYWNlIE15QW5ub3RhdGlvbiB7fSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAgZW51bSBNeUVudW0ge30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbk51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKSk7Ci0JfQotCi0JLy9UaGlzIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsYXRpb24gZXJyb3IsIGJ1dCB3ZSBhc3N1bWUgdGhlIGZpcnN0IHRhYmxlIGZvdW5kCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlNdWx0aXBsZVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZVJlc291cmNlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZVJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRhYmxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlUYWJsZUFubm90YXRpb24gdGFibGVBbm5vdGF0aW9uID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGVBbm5vdGF0aW9uLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShuYW1lID0gXCJGT09cIikiLCBjdSk7Ci0KLQkJdGFibGVBbm5vdGF0aW9uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobmFtZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVHlwZU1hcHBpbmdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZSgpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW1iZWRkYWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW1iZWRkYWJsZUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEVudGl0eSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFbWJlZGRhYmxlIiwgY3UpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnNldFByaW1hcnlBbm5vdGF0aW9uKEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUoamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFbnRpdHkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwcGVkU3VwZXJjbGFzcyIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFbWJlZGRhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SmF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZSgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5zZXRQcmltYXJ5QW5ub3RhdGlvbihKUEEuRU5USVRZLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRW50aXR5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpIGluc3RhbmNlb2YgRW50aXR5QW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARW50aXR5IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSIsIGN1KTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUphdmFUeXBlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUiLCBjdSk7Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUiLCBjdSk7Ci0JfQotCQotCS8vdXBkYXRlIHNvdXJjZSBjb2RlIHRvIGNoYW5nZSBmcm9tIEBFbnRpdHkgdG8gQEVtYmVkZGFibGUgYW5kIG1ha2Ugc3VyZSBAVGFibGUgaXMgbm90IHJlbW92ZWQKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hhbmdlVHlwZU1hcHBpbmdJblNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhUYWJsZSgpOwotCQlmaW5hbCBKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQl0ZXN0VHlwZShjdSkuZWRpdChuZXcgRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJU291cmNlRW50aXR5QW5ub3RhdGlvbi5ERUNMQVJBVElPTl9BTk5PVEFUSU9OX0FEQVBURVIucmVtb3ZlQW5ub3RhdGlvbihkZWNsYXJhdGlvbik7Ci0JCQl9Ci0JCX0pOwkKLQotCQljdS5jcmVhdGVJbXBvcnQoImphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGUiLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkKLQkJdGhpcy50ZXN0VHlwZShjdSkuZWRpdChuZXcgRWRpdG9yKCkgewotCQkJcHVibGljIHZvaWQgZWRpdChNb2RpZmllZERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCQkJU291cmNlRW1iZWRkYWJsZUFubm90YXRpb24uREVDTEFSQVRJT05fQU5OT1RBVElPTl9BREFQVEVSLm5ld01hcmtlckFubm90YXRpb24oZGVjbGFyYXRpb24pOwotCQkJfQotCQl9KTsJCQotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU5USVRZKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVNQkVEREFCTEUpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEphdmFUeXBlQW5ub3RhdGlvbnNOZXN0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVR5cGVBbm5vdGF0aW9uc05vTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SmF2YVR5cGVBbm5vdGF0aW9uc0NvbnRhaW5lck5vTmVzdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1wdHlTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCX0KLQkKLQkvLyAgQEVudGl0eSAgICAgLS0+PiAgICBARW50aXR5Ci0JLy8JCQkJCQlAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIikKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKSIsIGN1KTsKLQl9Ci0JCi0JLy8gIEBFbnRpdHkgICAgIAkJCQktLT4+ICAgIEBFbnRpdHkKLQkvLwlAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIikJCQlAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPSJCQVIiKX0pCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhVHlwZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlUmVzb3VyY2UgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoeyBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpIH0pIiwgY3UpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0JCi0JLy8gIEBFbnRpdHkgICAgIAkJCQkKLQkvLwlAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKSkKLQkvLyAgICAgICAgICAgfHwKLQkvLyAgICAgICAgICAgXC8KLQkvLyAgQEVudGl0eSAgICAgCQkJCQotCS8vCUBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKSwgQFNlY29uZGFyeVRhYmxlKG5hbWU9IkJBUiIpfSkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiKSxAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXI1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBUlwiKSxAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKYXZhVHlwZUFubm90YXRpb25OZXN0YWJsZUNvbnRhaW5lcjYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZVJlc291cmNlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlUmVzb3VyY2Uuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIil9KSIsIGN1KTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGVSZXNvdXJjZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZVJlc291cmNlLnNldE5hbWUoIkJBWiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyh7QFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBWlwiKSxAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCX0KLQotCi0JLy9ARW50aXR5Ci0JLy9AU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIikKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoU2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUiLCBjdSk7Ci0JfQotCQotCi0JLy9ARW50aXR5Ci0JLy9AU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lPSJGT08iKSkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YVR5cGVBbm5vdGF0aW9uTmVzdGFibGVDb250YWluZXIyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIikiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSmF2YVR5cGVBbm5vdGF0aW9uSW5kZXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoMlNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZXMiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKYXZhVHlwZUFubm90YXRpb25JbmRleDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoMlNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbilyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVoiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHlXaXRoMlNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbilyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigyLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJbmV3QW5ub3RhdGlvbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIil9KSIsIGN1KTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAyLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoe0BTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVpcIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGT09cIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVKYXZhVHlwZUFubm90YXRpb24yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5V2l0aDJTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCW5ld0Fubm90YXRpb24uc2V0TmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFaXCIpLCBAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRUeXBlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eVdpdGhNZW1iZXJUeXBlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9ubHkgbm90IGNsYXNzZXMgYW5kIGludGVyZmFjZXMgc2hvdWxkIGJlIHJldHVybmVkIGJ5ICNnZXRUeXBlcygpIiwgMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VUeXBlLmdldFR5cGVzKCkpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmx5IGVudW1zIHNob3VsZCBiZSByZXR1cm5lZCBieSAjZ2V0RW51bXMoKSIsIDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHJlc291cmNlVHlwZS5nZXRFbnVtcygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVFbnRpdHlBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEVudGl0eUR1cGxpY2F0ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRW50aXR5QW5ub3RhdGlvbiBqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTlRJVFkpOwotCQlhc3NlcnRFcXVhbHMoIkZpcnN0RW50aXR5IiwgamF2YVR5cGVNYXBwaW5nQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCQotCQlqYXZhVHlwZU1hcHBpbmdBbm5vdGF0aW9uID0gKEVudGl0eUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJGaXJzdEVudGl0eSIsIGphdmFUeXBlTWFwcGluZ0Fubm90YXRpb24uZ2V0TmFtZSgpKTsKLQkJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8JCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gVE9ETwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBUT0RPCQotCX0KLQkKLQkKLQkvL1RPRE8gbW9yZSB0ZXN0cyBoZXJlIHdpdGggc3VwZXJjbGFzc2VzIG90aGVyIHRoYW4gT2JqZWN0LgotCS8vMS4gVGVzdCB3aGVyZSB0aGUgc3VwZXJjbGFzcyBkb2VzIG5vdCByZXNvbHZlCi0JLy8yLiBUZXN0IGEgc3VwZXJjbGFzcyB0aGF0IGRvZXMgcmVzb2x2ZQotCS8vMy4gV2hhdCBhYm91dCBhIHN1cGVyY2xhc3MgdGhhdCBpcyBhIGNsYXNzIGZpbGUgaW4gYSBqYXI/PwotCS8vNC4KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3VwZXJjbGFzc1F1YWxpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuT2JqZWN0IiwgcmVzb3VyY2VUeXBlLmdldFN1cGVyY2xhc3NRdWFsaWZpZWROYW1lKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzQW5ub3RhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VUeXBlLmlzQW5ub3RhdGVkKCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oSlBBLkVOVElUWSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlVHlwZS5pc0Fubm90YXRlZCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VUeXBlLmlzQW5ub3RhdGVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0ZWRNZW1iZXJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RFbnRpdHlXaXRoTWVtYmVyRW1iZWRkYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5FTUJFRERBQkxFKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIG5lc3RlZFR5cGUgPSByZXNvdXJjZVR5cGUuZ2V0VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChuZXN0ZWRUeXBlLmdldEFubm90YXRpb24oSlBBLkVOVElUWSkpOwotCQlhc3NlcnROb3ROdWxsKG5lc3RlZFR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuRU1CRUREQUJMRSkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEludmFsaWRBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0SW52YWxpZEFubm90YXRpb25zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQkKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTcwYWI4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtblRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FID0gIk1ZX1JFRl9DT0xVTU5fTkFNRSI7Ci0JCi0JcHVibGljIEpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbih0YWJsZSA9IFwiIiArIENPTFVNTl9UQUJMRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudChmaW5hbCBTdHJpbmcgYm9vbGVhbkVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbigiICsgYm9vbGVhbkVsZW1lbnQgKyAiID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobmFtZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fVEFCTEUsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRUYWJsZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKHRhYmxlID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIih0YWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0KLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoY29sdW1uRGVmaW5pdGlvbiIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJ1bmlxdWUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VW5pcXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0KLQkJY29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4odW5pcXVlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFVuaXF1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aEJvb2xlYW5FbGVtZW50KCJudWxsYWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE51bGxhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROdWxsYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0TnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW4obnVsbGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0TnVsbGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoImluc2VydGFibGUiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEluc2VydGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldEluc2VydGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbihpbnNlcnRhYmxlID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldEluc2VydGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVwZGF0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVcGRhdGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbih1cGRhdGFibGUgPSBmYWxzZSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VXBkYXRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5Db2x1bW5zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1NjhhNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luQ29sdW1uc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlTWVtYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSm9pbkNvbHVtbnNUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fVEFCTEUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJNWV9SRUZfQ09MVU1OX05BTUUiOwotCQotCXB1YmxpYyBKb2luQ29sdW1uc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHRhYmxlID0gXCIiICsgQ09MVU1OX1RBQkxFICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fQ09MVU1OLCBKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX0NPTFVNTiwgSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKCIgKyBib29sZWFuRWxlbWVudCArICIgPSB0cnVlKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9DT0xVTU4sIEpQQS5KT0lOX0NPTFVNTlMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIEpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW5BdChKYXZhUmVzb3VyY2VNZW1iZXIgcmVzb3VyY2VNZW1iZXIsIGludCBpbmRleCkgewotCQlyZXR1cm4gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlTWVtYmVyLmdldEFubm90YXRpb25zKEpQQS5KT0lOX0NPTFVNTiksIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQotCQljb2x1bW4uc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9UQUJMRSwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gdGhpcy5qb2luQ29sdW1uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQljb2x1bW4uc2V0VGFibGUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4odGFibGUgPSBcIkZvb1wiKSkiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRUYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUsIGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSkiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInVuaXF1ZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRVbmlxdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRVbmlxdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VW5pcXVlKCkpOwotCi0JCWNvbHVtbi5zZXRVbmlxdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEZhbHNlKGNvbHVtbi5nZXRVbmlxdWUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKHVuaXF1ZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0VW5pcXVlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoIm51bGxhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydFRydWUoY29sdW1uLmdldE51bGxhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TnVsbGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0TnVsbGFibGUoKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5Db2x1bW5zKEBKb2luQ29sdW1uKG51bGxhYmxlID0gZmFsc2UpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXROdWxsYWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgiaW5zZXJ0YWJsZSIpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSB0aGlzLmpvaW5Db2x1bW5BdChyZXNvdXJjZUZpZWxkLCAwKTsKLQotCQlhc3NlcnRUcnVlKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkuYm9vbGVhblZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5zZXJ0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gdGhpcy5qb2luQ29sdW1uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRJbnNlcnRhYmxlKCkpOwotCi0JCWNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShjb2x1bW4uZ2V0SW5zZXJ0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4oaW5zZXJ0YWJsZSA9IGZhbHNlKSkiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0SW5zZXJ0YWJsZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1uKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbldpdGhCb29sZWFuRWxlbWVudCgidXBkYXRhYmxlIik7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IHRoaXMuam9pbkNvbHVtbkF0KHJlc291cmNlRmllbGQsIDApOwotCi0JCWFzc2VydFRydWUoY29sdW1uLmdldFVwZGF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFVwZGF0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gdGhpcy5qb2luQ29sdW1uQXQocmVzb3VyY2VGaWVsZCwgMCk7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRVcGRhdGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UoY29sdW1uLmdldFVwZGF0YWJsZSgpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pbkNvbHVtbnMoQEpvaW5Db2x1bW4odXBkYXRhYmxlID0gZmFsc2UpKSIsIGN1KTsKLQkJCi0JCWNvbHVtbi5zZXRVcGRhdGFibGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJASm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEpvaW5Db2x1bW5Ub0JlZ2lubmluZ09mTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdEpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQEpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQkJCi0JCWV4cGVjdGVkMiA9ICJASm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIiksIjsKLQkJZXhwZWN0ZWQzID0gIkBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGpvaW5Db2x1bW5zID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhKUEEuSk9JTl9DT0xVTU4pLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChKb2luQ29sdW1uQW5ub3RhdGlvbikgam9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoSm9pbkNvbHVtbkFubm90YXRpb24pIGpvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVKb2luQ29sdW1uQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJASm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCB1bmlxdWUgPSBmYWxzZSwgbnVsbGFibGUgPSBmYWxzZSwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCB0YWJsZSA9IFwiVEFCTEVcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMSA9ICJASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSI7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Kb2luVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmZiOGFjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5UYWJsZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpvaW5UYWJsZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQkxFX05BTUUgPSAiTVlfVEFCTEUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUFfTkFNRSA9ICJNWV9TQ0hFTUEiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRBTE9HX05BTUUgPSAiTVlfQ0FUQUxPRyI7Ci0JCi0JcHVibGljIEpvaW5UYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKG5hbWUgPSBcIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9UQUJMRSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKHNjaGVtYSA9IFwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkpPSU5fVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuSk9JTl9UQUJMRSwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbn0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhJbnZlcnNlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5KT0lOX1RBQkxFLCBKUEEuSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQEpvaW5Db2x1bW59KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhUQUJMRV9OQU1FLCB0YWJsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJdGFibGUuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgdGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXRhYmxlLnNldENhdGFsb2coIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShjYXRhbG9nID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQotCQl0YWJsZS5zZXRTY2hlbWEoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHNjaGVtYSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCXRhYmxlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQEpvaW5UYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJASm9pblRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSl9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCi0JCQotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMSk7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoam9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQl0YWJsZS5hZGRKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5qb2luQ29sdW1uQXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCXRhYmxlLnJlbW92ZUpvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQotCQl0YWJsZS5yZW1vdmVKb2luQ29sdW1uKDApOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IEBKb2luQ29sdW1uKSIsIGN1KTsKLQotCQkKLQkJdGFibGUucmVtb3ZlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZVdpdGhKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQlqb2luQ29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJSRUZfTkFNRSIpOwotCQlqb2luQ29sdW1uLnNldFVuaXF1ZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWpvaW5Db2x1bW4uc2V0VGFibGUoIlRBQkxFIik7Ci0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0JCXRhYmxlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIHVuaXF1ZSA9IGZhbHNlLCBudWxsYWJsZSA9IGZhbHNlLCBpbnNlcnRhYmxlID0gZmFsc2UsIHVwZGF0YWJsZSA9IGZhbHNlLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHRhYmxlID0gXCJUQUJMRVwiKSwgQEpvaW5Db2x1bW4sIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5qb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0VW5pcXVlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWpvaW5Db2x1bW4uc2V0VXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqb2luQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJam9pbkNvbHVtbi5zZXRUYWJsZSgiVEFCTEUiKTsKLQkJCi0JCXRhYmxlLmFkZEpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShqb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpLCBASm9pbkNvbHVtbn0pIiwgY3UpOwotCi0KLQkJdGFibGUubW92ZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWFzc2VydE51bGwodGFibGUuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGFibGUuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGFibGUuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgdW5pcXVlID0gZmFsc2UsIG51bGxhYmxlID0gZmFsc2UsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgdGFibGUgPSBcIlRBQkxFXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUuam9pbkNvbHVtbkF0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlqb2luQ29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUpvaW5UYWJsZUFubm90YXRpb24gdGFibGUgPSAoSm9pblRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0KLQkJCi0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SW52ZXJzZUpvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pblRhYmxlV2l0aEludmVyc2VKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkSW52ZXJzZUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEpvaW5UYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJSm9pblRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChKb2luVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkSW52ZXJzZUpvaW5Db2x1bW4oMCkuc2V0TmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpOwotCQl0YWJsZS5hZGRJbnZlcnNlSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5pbnZlcnNlSm9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUuaW52ZXJzZUpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDIpLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQkKLQkJdGFibGUucmVtb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJASm9pblRhYmxlKGludmVyc2VKb2luQ29sdW1ucyA9IHtASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGludmVyc2VKb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXRhYmxlLnJlbW92ZUludmVyc2VKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSBASm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikpIiwgY3UpOwotCQlpbnZlcnNlSm9pbkNvbHVtbnMgPSB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaW52ZXJzZUpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVJbnZlcnNlSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUludmVyc2VKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMiwgMCk7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5UYWJsZShpbnZlcnNlSm9pbkNvbHVtbnMgPSB7QEpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBASm9pbkNvbHVtbiwgQEpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSW52ZXJzZUpvaW5Db2x1bW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCXRhYmxlLmFkZEludmVyc2VKb2luQ29sdW1uKDEpLnNldE5hbWUoIkZPTyIpOwotCQkKLQkJSXRlcmF0b3I8Sm9pbkNvbHVtbkFubm90YXRpb24+IGludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5tb3ZlSW52ZXJzZUpvaW5Db2x1bW4oMCwgMik7Ci0JCWludmVyc2VKb2luQ29sdW1ucyA9IHRhYmxlLmdldEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydE51bGwoaW52ZXJzZUpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGludmVyc2VKb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBpbnZlcnNlSm9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uLCBASm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW52ZXJzZUpvaW5Db2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RKb2luVGFibGVXaXRoSW52ZXJzZUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKb2luVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKEpvaW5UYWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZS5nZXRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IHRhYmxlLmludmVyc2VKb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luVGFibGUoaW52ZXJzZUpvaW5Db2x1bW5zID0ge0BKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQEpvaW5Db2x1bW59KSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlNzU4Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEwIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci0KLXB1YmxpYyBjbGFzcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi0JCWV4dGVuZHMgSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVhfUEVSU0lTVEVOQ0VfUEFDS0FHRV9OQU1FID0gImphdmF4LnBlcnNpc3RlbmNlIjsgLy8kTk9OLU5MUy0xJAotCQotCQotCXB1YmxpYyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmphdmFQcm9qZWN0LmFkZEphcihUZXN0SnBhUHJvamVjdC5qcGFKYXJOYW1lKCkpOwotCQlpZiAoVGVzdEpwYVByb2plY3QuZWNsaXBzZUxpbmtKYXJOYW1lKCkgIT0gbnVsbCkgewotCQkJdGhpcy5qYXZhUHJvamVjdC5hZGRKYXIoVGVzdEpwYVByb2plY3QuZWNsaXBzZUxpbmtKYXJOYW1lKCkpOwotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCS8vIG5vdGhpbmcgYXMgb2YgeWV0Ci0JfQotCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKFN0cmluZyBhbm5vdGF0aW9uTmFtZSwgU3RyaW5nIGFubm90YXRpb25Cb2R5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKEpBVkFYX1BFUlNJU1RFTkNFX1BBQ0tBR0VfTkFNRSwgYW5ub3RhdGlvbk5hbWUsIGFubm90YXRpb25Cb2R5KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElDb21waWxhdGlvblVuaXQgY3JlYXRlRW51bUFuZE1lbWJlcnMoU3RyaW5nIGVudW1OYW1lLCBTdHJpbmcgZW51bUJvZHkpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlRW51bUFuZE1lbWJlcnMoSkFWQVhfUEVSU0lTVEVOQ0VfUEFDS0FHRV9OQU1FLCBlbnVtTmFtZSwgZW51bUJvZHkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEphdmFSZXNvdXJjZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRKYXZhUmVzb3VyY2VUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjdkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEphdmFSZXNvdXJjZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEphdmFSZXNvdXJjZVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRKYXZhUmVzb3VyY2VUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphdmFSZXNvdXJjZVR5cGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXZhUmVzb3VyY2VBdHRyaWJ1dGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKUFRUb29sc1Rlc3RzLmNsYXNzKTsKLQkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBc3NvY2lhdGlvbk92ZXJyaWRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXNzb2NpYXRpb25PdmVycmlkZXNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBdHRyaWJ1dGVPdmVycmlkZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEF0dHJpYnV0ZU92ZXJyaWRlc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJhc2ljVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29sdW1uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGlzY3JpbWluYXRvclZhbHVlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGlzY3JpbWluYXRvckNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtYmVkZGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbWJlZGRlZFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVtYmVkZGVkSWRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnVtZXJhdGVkVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJhdGVkVmFsdWVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJZENsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSWRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmhlcml0YW5jZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpvaW5Db2x1bW5UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKb2luQ29sdW1uc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpvaW5UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvYlRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1hbnlUb01hbnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYW55VG9PbmVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTmFtZWROYXRpdmVRdWVyeVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVkTmF0aXZlUXVlcmllc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5hbWVkUXVlcnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShOYW1lZFF1ZXJpZXNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPbmVUb01hbnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPbmVUb09uZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yZGVyQnlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFF1ZXJ5SGludFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNlY29uZGFyeVRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2Vjb25kYXJ5VGFibGVzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2VxdWVuY2VHZW5lcmF0b3JUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUYWJsZUdlbmVyYXRvclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVGVtcG9yYWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShUcmFuc2llbnRUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShWZXJzaW9uVGVzdHMuY2xhc3MpOwotCQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEphdmFSZXNvdXJjZVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0xvYlRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Mb2JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjYwYzgxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0xvYlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTG9iQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTG9iVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBMb2JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkxPQik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQExvYiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdExvYigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TG9iKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlMb2JBbm5vdGF0aW9uIGxvYiA9IChMb2JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkxPQik7Ci0JCWFzc2VydE5vdE51bGwobG9iKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb01hbnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhZTIyZjEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvTWFueVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE1hbnlUb01hbnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShmZXRjaCA9IEZldGNoVHlwZS5FQUdFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KHRhcmdldEVudGl0eSA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb01hbnkobWFwcGVkQnkgPSBcImZvb1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19NQU5ZLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvTWFueShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55KGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQltYW55VG9NYW55LnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBtYW55VG9NYW55LmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0YXJnZXRFbnRpdHkiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG1hbnlUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgbWFueVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG1hbnlUb01hbnkuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7IC8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtYW55VG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCW1hbnlUb01hbnkuc2V0TWFwcGVkQnkoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkobWFwcGVkQnkgPSBcImJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJtYXBwZWRCeSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBBTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVBlcnNpc3QodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZSh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9NYW55KGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQltYW55VG9NYW55LnNldENhc2NhZGVSZWZyZXNoKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhc2NhZGVNb3JlVGhhbk9uY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb01hbnlXaXRoQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJbWFueVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkvL2Egc2Vjb25kIENhc2NhZGVUeXBlLkFsbCBzaG91bGQgbm90IGhhdmUgYmVlbiBhZGRlZAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb01hbnkoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiLCBjdSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgY2FzY2FkZUFsbCB0byBmYWxzZSBhZ2Fpbiwgc2hvdWxkIGp1c3QgZG8gbm90aGluZwotCQltYW55VG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvTWFueVdpdGhEdXBsaWNhdGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBtYW55VG9NYW55ID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsgLy9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIAotCQkJCQkJCQkJCSAgLy9zZXR0aW5ncyBpbnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgaXQgZmFsc2UgdHdpY2U/Ci0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvTWFueUFubm90YXRpb24gbWFueVRvTWFueSA9IChNYW55VG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX01BTlkpOwotCQlhc3NlcnRUcnVlKG1hbnlUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUobWFueVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQltYW55VG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvTWFueShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCW1hbnlUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvT25lVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hbnlUb09uZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjFhN2EuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFueVRvT25lVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hbnlUb09uZUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hbnlUb09uZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE1hbnlUb09uZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHkgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFueVRvT25lV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFOWV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUob3B0aW9uYWwgPSB0cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQU5ZX1RPX09ORSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkV9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BTllfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFueVRvT25lKGNhc2NhZGUgPSB7Q2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLk1FUkdFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hbnlUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9PbmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgbWFueVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoZmV0Y2ggPSBMQVpZKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgbWFueVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJbWFueVRvT25lLnNldEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgbWFueVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidGFyZ2V0RW50aXR5IiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgbWFueVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOwotCQkKLQkJbWFueVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBtYW55VG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ly9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhPcHRpb25hbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBtYW55VG9PbmUgPSAoTWFueVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hbnlUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKG9wdGlvbmFsID0gZmFsc2UpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWxOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYW55VG9PbmUuZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0T3B0aW9uYWwobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvcHRpb25hbCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBBTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlTWVyZ2UodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShtYW55VG9PbmUuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVSZW1vdmUodHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFueVRvT25lKGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUmVmcmVzaCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNYW55VG9PbmUoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FzY2FkZU1vcmVUaGFuT25jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFueVRvT25lV2l0aENhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU1hbnlUb09uZUFubm90YXRpb24gbWFueVRvT25lID0gKE1hbnlUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFOWV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZUFsbCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkvL2Egc2Vjb25kIENhc2NhZGVUeXBlLkFsbCBzaG91bGQgbm90IGhhdmUgYmVlbiBhZGRlZAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIsIGN1KTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobWFueVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgY2FzY2FkZUFsbCB0byBmYWxzZSBhZ2Fpbiwgc2hvdWxkIGp1c3QgZG8gbm90aGluZwotCQltYW55VG9PbmUuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hbnlUb09uZVdpdGhEdXBsaWNhdGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQltYW55VG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJLy9zZXR0aW5ncyBpbnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgaXQgZmFsc2UgdHdpY2U/Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJbWFueVRvT25lLnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYW55VG9PbmVXaXRoTXVsdGlwbGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYW55VG9PbmVBbm5vdGF0aW9uIG1hbnlUb09uZSA9IChNYW55VG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BTllfVE9fT05FKTsKLQkJYXNzZXJ0VHJ1ZShtYW55VG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUobWFueVRvT25lLmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hbnlUb09uZShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCW1hbnlUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKGZhbHNlKTsJCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmNzRhYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBLZXlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hcEtleVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgTWFwS2V5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBfS0VZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwS2V5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcEtleVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQX0tFWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleShuYW1lID0gXCJrZXlcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwS2V5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk1BUF9LRVkpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5NQVBfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcEtleSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCi0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuTUFQX0tFWSk7Ci0KLQkJbWFwS2V5LnNldE5hbWUoImZvbyIpOwotCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleShuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE1hcEtleShuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2QwOGY2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW50aXR5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIE1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0FuZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcHBlZFN1cGVyY2xhc3NBbm5vdGF0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcHBlZFN1cGVyY2xhc3NBbmRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NBbmRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJSmF2YVJlc291cmNlTm9kZSBtYXBwaW5nQW5ub3RhdGlvbiA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIEVudGl0eUFubm90YXRpb24pOwotCQkKLQkJTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24gbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJYXNzZXJ0Tm90TnVsbChtYXBwZWRTdXBlcmNsYXNzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcmllc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJpZXNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGU2MGJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcmllc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTmFtZWROYXRpdmVRdWVyaWVzVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9OQU1FID0gIm15UXVlcnkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9RVUVSWSA9ICJTRUxFQ1QgbmFtZSBGUk9NIEVtcGxveWVlIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUkVTVUxUX0NMQVNTID0gIlJlc3VsdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORyA9ICJyZXN1bHRTZXRNYXBwaW5nIjsKLQkKLQlwdWJsaWMgTmFtZWROYXRpdmVRdWVyaWVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyaWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJJRVMsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFFVRVJZX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoInF1ZXJ5IiwgUVVFUllfUVVFUlkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgicmVzdWx0U2V0TWFwcGluZyIsIFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORyk7Ci0JfQotCQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KCIgKyBlbGVtZW50TmFtZSArICIgPSBcIiIgKyB2YWx1ZSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyaWVzKEBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzID0gIiArIFFVRVJZX1JFU1VMVF9DTEFTUyArICIuY2xhc3MpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUywgSlBBLk5BTUVEX05BVElWRV9RVUVSWSwgSlBBLlFVRVJZX0hJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9OQVRJVkVfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJpZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydE5vdE51bGwobmFtZWRRdWVyeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHF1ZXJ5ID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0Q2xhc3MoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9SRVNVTFRfQ0xBU1MsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlc3VsdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX0NMQVNTLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRDbGFzcyA9IGZvby5jbGFzcykiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0Tm90TnVsbChuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJlc3VsdCIsIG5hbWVkUXVlcnkuZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoKSk7Ly9idWcgMTk2MjAwIGNoYW5nZWQgdGhpcwotCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0Q2xhc3MoVFlQRV9OQU1FKTsJCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG5hbWVkUXVlcnkuZ2V0RnVsbHlRdWFsaWZpZWRSZXN1bHRDbGFzc05hbWUoKSk7CQkJCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3MgPSAiICsgVFlQRV9OQU1FICsgIi5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdFNldE1hcHBpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9SRVNVTFRfU0VUX01BUFBJTkcsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX1NFVF9NQVBQSU5HLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShyZXN1bHRTZXRNYXBwaW5nID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdFNldE1hcHBpbmcobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcmllcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIpLEBRdWVyeUhpbnQobmFtZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgyKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcmllcyhATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpKSIsIGN1KTsKLQkJCi0JCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgyLCAwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlSGludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgwLCAyKTsKLQkJCi0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5Q29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBOYW1lZE5hdGl2ZVF1ZXJpZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCByZXN1bHRDbGFzcyA9IEZvby5jbGFzcywgcmVzdWx0U2V0TWFwcGluZyA9IFwibWFwcGluZ1wiKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSSUVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuTkFNRURfTkFUSVZFX1FVRVJZKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZE5hdGl2ZVF1ZXJ5VG9CZWdpbm5pbmdPZkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQE5hbWVkTmF0aXZlUXVlcmllcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDIgPSAiQE5hbWVkTmF0aXZlUXVlcnkobmFtZSA9IFwiQkFaXCIpLCI7Ci0JCWV4cGVjdGVkMyA9ICJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpLCBATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJCQVJcIikgfSkiOwotCQluYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IG5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfTkFUSVZFX1FVRVJZKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLk5BTUVEX05BVElWRV9RVUVSWSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9OQVRJVkVfUVVFUklFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLk5BTUVEX05BVElWRV9RVUVSWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWROYXRpdmVRdWVyeUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATmFtZWROYXRpdmVRdWVyaWVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgcmVzdWx0Q2xhc3MgPSBGb28uY2xhc3MsIHJlc3VsdFNldE1hcHBpbmcgPSBcIm1hcHBpbmdcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMSA9ICJATmFtZWROYXRpdmVRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIHJlc3VsdENsYXNzID0gRm9vLmNsYXNzLCByZXN1bHRTZXRNYXBwaW5nID0gXCJtYXBwaW5nXCIpIjsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcmllcyIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGZhNjRkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkTmF0aXZlUXVlcnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE5hbWVkTmF0aXZlUXVlcnlUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX05BTUUgPSAibXlRdWVyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1FVRVJZID0gIlNFTEVDVCBuYW1lIEZST00gRW1wbG95ZWUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9SRVNVTFRfQ0xBU1MgPSAiUmVzdWx0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUkVTVUxUX1NFVF9NQVBQSU5HID0gInJlc3VsdFNldE1hcHBpbmciOwotCQotCXB1YmxpYyBOYW1lZE5hdGl2ZVF1ZXJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgUVVFUllfTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgicXVlcnkiLCBRVUVSWV9RVUVSWSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhTdHJpbmdFbGVtZW50KCJyZXN1bHRTZXRNYXBwaW5nIiwgUVVFUllfUkVTVUxUX1NFVF9NQVBQSU5HKTsKLQl9Ci0JCi0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWROYXRpdmVRdWVyeSgiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3MgPSAiICsgUVVFUllfUkVTVUxUX0NMQVNTICsgIi5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfTkFUSVZFX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkTmF0aXZlUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkTmF0aXZlUXVlcnkoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShxdWVyeSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlc3VsdENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFJlc3VsdENsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX0NMQVNTLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZXN1bHRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9DTEFTUywgbmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJCi0JCW5hbWVkUXVlcnkuc2V0UmVzdWx0Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0UmVzdWx0Q2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0Q2xhc3MgPSBmb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFJlc3VsdENsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RnVsbHlRdWFsaWZpZWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0KLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCWFzc2VydE5vdE51bGwobmFtZWRRdWVyeS5nZXRSZXN1bHRDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSZXN1bHQiLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCkpOy8vYnVnIDE5NjIwMCBjaGFuZ2VkIHRoaXMKLQotCQluYW1lZFF1ZXJ5LnNldFJlc3VsdENsYXNzKFRZUEVfTkFNRSk7CQkKLQkJCi0JCWFzc2VydEVxdWFscyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBuYW1lZFF1ZXJ5LmdldEZ1bGx5UXVhbGlmaWVkUmVzdWx0Q2xhc3NOYW1lKCkpOwkJCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KHJlc3VsdENsYXNzID0gIiArIFRZUEVfTkFNRSArICIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdWx0U2V0TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhSZXN1bHRTZXRNYXBwaW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUkVTVUxUX1NFVF9NQVBQSU5HLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFJlc3VsdFNldE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUmVzdWx0U2V0TWFwcGluZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1JFU1VMVF9TRVRfTUFQUElORywgbmFtZWRRdWVyeS5nZXRSZXN1bHRTZXRNYXBwaW5nKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFJlc3VsdFNldE1hcHBpbmcoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkTmF0aXZlUXVlcnkocmVzdWx0U2V0TWFwcGluZyA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRSZXN1bHRTZXRNYXBwaW5nKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UmVzdWx0U2V0TWFwcGluZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWROYXRpdmVRdWVyeSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfTkFUSVZFX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEFkZEhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkTmF0aXZlUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiKSxAUXVlcnlIaW50KG5hbWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWROYXRpdmVRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkTmF0aXZlUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9OQVRJVkVfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKSwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWROYXRpdmVRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZE5hdGl2ZVF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX05BVElWRV9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgwLCAyKTsKLQkJCi0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZE5hdGl2ZVF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQsIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL05hbWVkUXVlcmllc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTlhMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyaWVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBOYW1lZFF1ZXJpZXNUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX05BTUUgPSAibXlRdWVyeSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1FVRVJZID0gIlNFTEVDVCBuYW1lIEZST00gRW1wbG95ZWUiOwotCQotCXB1YmxpYyBOYW1lZFF1ZXJpZXNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9RVUVSSUVTLCBKUEEuTkFNRURfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFFVRVJZX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoInF1ZXJ5IiwgUVVFUllfUVVFUlkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KCIgKyBlbGVtZW50TmFtZSArICIgPSBcIiIgKyB2YWx1ZSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUklFUywgSlBBLk5BTUVEX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50fSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUlksIEpQQS5RVUVSWV9ISU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIiwgcXVlcnkgPSBcImJhclwiLCBoaW50cyA9IEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJpZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0Tm90TnVsbChuYW1lZFF1ZXJ5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfTkFNRSwgbmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATmFtZWRRdWVyeSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9RVUVSWSwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbmFtZWRRdWVyeS5nZXRRdWVyeSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShxdWVyeSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5zZXRRdWVyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZFF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJpZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyaWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJpZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiksQFF1ZXJ5SGludChuYW1lID0gXCJGT09cIiksIEBRdWVyeUhpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMik7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyaWVzKEBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCQkKLQkJbmFtZWRRdWVyeS5yZW1vdmVIaW50KDApOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSkiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZFF1ZXJ5KCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDIsIDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcmllcyhATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKX0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVIaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkKLQkJbmFtZWRRdWVyeS5tb3ZlSGludCgwLCAyKTsKLQkJCi0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJpZXMoQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGROYW1lZFF1ZXJ5Q29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TmFtZWRRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBOYW1lZFF1ZXJpZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSWSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5OQU1FRF9RVUVSSUVTKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5OQU1FRF9RVUVSWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTmFtZWRRdWVyeVRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0TmFtZWRRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBOYW1lZFF1ZXJpZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcIkJBUlwiKSB9KSI7Ci0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQkKLQkJZXhwZWN0ZWQyID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcIkJBWlwiKSwiOwotCQlleHBlY3RlZDMgPSAiQE5hbWVkUXVlcnkobmFtZSA9IFwiZm9vXCIsIHF1ZXJ5ID0gXCJiYXJcIiwgaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSwgQE5hbWVkUXVlcnkobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IG5hbWVkUXVlcmllcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuTkFNRURfUVVFUlkpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgKChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgbmFtZWRRdWVyaWVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSBuYW1lZFF1ZXJpZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoTmFtZWRRdWVyeUFubm90YXRpb24pIG5hbWVkUXVlcmllcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUlkpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuTkFNRURfUVVFUklFUykpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSkpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuTkFNRURfUVVFUlkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTmFtZWRRdWVyeUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJATmFtZWRRdWVyaWVzKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJATmFtZWRRdWVyeShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJZXhwZWN0ZWQxID0gIkBOYW1lZFF1ZXJ5KG5hbWUgPSBcImZvb1wiLCBxdWVyeSA9IFwiYmFyXCIsIGhpbnRzID0gQFF1ZXJ5SGludChuYW1lID0gXCJCQVJcIiwgdmFsdWUgPSBcIkZPT1wiKSkiOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZE5hdGl2ZVF1ZXJpZXMiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTmFtZWRRdWVyeVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExNDkxNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9OYW1lZFF1ZXJ5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTmFtZWRRdWVyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUXVlcnlIaW50QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTmFtZWRRdWVyeVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfTkFNRSA9ICJteVF1ZXJ5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfUVVFUlkgPSAiU0VMRUNUIG5hbWUgRlJPTSBFbXBsb3llZSI7Ci0JCi0JcHVibGljIE5hbWVkUXVlcnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoU3RyaW5nRWxlbWVudCgibmFtZSIsIFFVRVJZX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFN0cmluZ0VsZW1lbnQoInF1ZXJ5IiwgUVVFUllfUVVFUlkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoU3RyaW5nRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTkFNRURfUVVFUlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KCIgKyBlbGVtZW50TmFtZSArICIgPSBcIiIgKyB2YWx1ZSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5OQU1FRF9RVUVSWSwgSlBBLlFVRVJZX0hJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIiksIEBRdWVyeUhpbnR9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZWRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnROb3ROdWxsKG5hbWVkUXVlcnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX05BTUUsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCWFzc2VydEVxdWFscyhRVUVSWV9OQU1FLCBuYW1lZFF1ZXJ5LmdldE5hbWUoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG5hbWVkUXVlcnkuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShuYW1lID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBOYW1lZFF1ZXJ5KCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX1FVRVJZLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRRdWVyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQlhc3NlcnRFcXVhbHMoUVVFUllfUVVFUlksIG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBuYW1lZFF1ZXJ5LmdldFF1ZXJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KHF1ZXJ5ID0gXCJmb29cIikiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnNldFF1ZXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuZ2V0UXVlcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkUXVlcnkoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SGludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEhpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQkKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPFF1ZXJ5SGludEFubm90YXRpb24+IGl0ZXJhdG9yID0gbmFtZWRRdWVyeS5nZXRIaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgaXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwoaXRlcmF0b3IubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRIaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJCi0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDEpOwotCQlRdWVyeUhpbnRBbm5vdGF0aW9uIHF1ZXJ5SGludCA9IG5hbWVkUXVlcnkuYWRkSGludCgwKTsKLQkJcXVlcnlIaW50LnNldE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiKSxAUXVlcnlIaW50KG5hbWUgPSBcIkZPT1wiKSwgQFF1ZXJ5SGludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlSGludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TmFtZWRRdWVyeVdpdGhRdWVyeUhpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCU5hbWVkUXVlcnlBbm5vdGF0aW9uIG5hbWVkUXVlcnkgPSAoTmFtZWRRdWVyeUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5OQU1FRF9RVUVSWSk7Ci0JCW5hbWVkUXVlcnkuYWRkSGludCgwKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG5hbWVkUXVlcnkuaGludEF0KDIpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgyKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBuYW1lZFF1ZXJ5LmdldEhpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBOYW1lZFF1ZXJ5KGhpbnRzID0ge0BRdWVyeUhpbnQobmFtZSA9IFwiQkFaXCIpLCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JCQotCQluYW1lZFF1ZXJ5LnJlbW92ZUhpbnQoMCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHMgPSBAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpKSIsIGN1KTsKLQkJCi0JCW5hbWVkUXVlcnkucmVtb3ZlSGludCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE5hbWVkUXVlcnkoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlOYW1lZFF1ZXJ5QW5ub3RhdGlvbiBuYW1lZFF1ZXJ5ID0gKE5hbWVkUXVlcnlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuTkFNRURfUVVFUlkpOwotCQluYW1lZFF1ZXJ5LmFkZEhpbnQoMCkuc2V0TmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCi0JCW5hbWVkUXVlcnkubW92ZUhpbnQoMiwgMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgyKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbmFtZWRRdWVyeS5nZXRIaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATmFtZWRRdWVyeShoaW50cyA9IHtAUXVlcnlIaW50KG5hbWUgPSBcIkJBUlwiLCB2YWx1ZSA9IFwiRk9PXCIpLCBAUXVlcnlIaW50LCBAUXVlcnlIaW50KG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZUhpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3ROYW1lZFF1ZXJ5V2l0aFF1ZXJ5SGludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJbmFtZWRRdWVyeS5hZGRIaW50KDApLnNldE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwobmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQotCQluYW1lZFF1ZXJ5Lm1vdmVIaW50KDAsIDIpOwotCQkKLQkJYXNzZXJ0TnVsbChuYW1lZFF1ZXJ5LmhpbnRBdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG5hbWVkUXVlcnkuaGludEF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbmFtZWRRdWVyeS5oaW50QXQoMikuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG5hbWVkUXVlcnkuZ2V0SGludHNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludCwgQFF1ZXJ5SGludChuYW1lID0gXCJCQVpcIiksIEBRdWVyeUhpbnQobmFtZSA9IFwiQkFSXCIsIHZhbHVlID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9NYW55VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhlNmYwOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb01hbnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT25lVG9NYW55VGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgT25lVG9NYW55VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSh0YXJnZXRFbnRpdHkgPSBBbm5vdGF0aW9uVGVzdFR5cGUuY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19NQU5ZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55KG1hcHBlZEJ5ID0gXCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aENhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoTXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX01BTlksIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb01hbnkoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9NYW55V2l0aER1cGxpY2F0ZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fTUFOWSwgSlBBLkNBU0NBREVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9NYW55KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGZldGNoID0gTEFaWSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRGZXRjaE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvTWFueS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRGZXRjaChudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImZldGNoIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvTWFueS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0VGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInRhcmdldEVudGl0eSIsIGN1KTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIG9uZVRvTWFueS5nZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eUNsYXNzTmFtZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkodGFyZ2V0RW50aXR5ID0gRm9vLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgb25lVG9NYW55LmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgb25lVG9NYW55LmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvTWFueUFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBwZWRCeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCW9uZVRvTWFueS5zZXRNYXBwZWRCeSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkobWFwcGVkQnkgPSBcImJhclwiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJtYXBwZWRCeSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gQUxMKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gTUVSR0UpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9NYW55LmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IFBFUlNJU1QpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvTWFueShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVJlbW92ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9NYW55KGNhc2NhZGUgPSBSRUZSRVNIKSIsIGN1KTsKLQkJCi0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZVJlZnJlc2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhc2NhZGVNb3JlVGhhbk9uY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvTWFueVdpdGhDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJYXNzZXJ0VHJ1ZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZUFsbCgpKTsKLQkJLy9hIHNlY29uZCBDYXNjYWRlVHlwZS5BbGwgc2hvdWxkIG5vdCBoYXZlIGJlZW4gYWRkZWQKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IENhc2NhZGVUeXBlLkFMTCkiLCBjdSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueS5pc0Nhc2NhZGVBbGwoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQkJCi0JCS8vdGVzdCBzZXR0aW5nIGNhc2NhZGVBbGwgdG8gZmFsc2UgYWdhaW4sIHNob3VsZCBqdXN0IGRvIG5vdGhpbmcKLQkJb25lVG9NYW55LnNldENhc2NhZGVBbGwoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb01hbnlXaXRoRHVwbGljYXRlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJb25lVG9NYW55LnNldENhc2NhZGVNZXJnZShmYWxzZSk7Ly9UT0RPIHNob3VsZCB0aGUgcmVzb3VyY2UgbW9kZWwgaGFuZGxlIHRoaXMgYW5kIHJlbW92ZSBib3RoIE1FUkdFIAotCQkJCQkJCQkJCS8vc2V0dGluZ3MgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc2V0IGl0IGZhbHNlIHR3aWNlPwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnkuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY2FzY2FkZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9NYW55V2l0aE11bHRpcGxlQ2FzY2FkZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBvbmVUb01hbnkgPSAoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCWFzc2VydFRydWUob25lVG9NYW55LmlzQ2FzY2FkZU1lcmdlKCkpOwotCQlhc3NlcnRUcnVlKG9uZVRvTWFueS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb01hbnkoY2FzY2FkZSA9IFJFTU9WRSkiLCBjdSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0Q2FzY2FkZVJlbW92ZShmYWxzZSk7CQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PbmVUb09uZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMGY1NjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT25lVG9PbmVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBPbmVUb09uZVRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIE9uZVRvT25lVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUsIEpQQS5GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoZmV0Y2ggPSBGZXRjaFR5cGUuRUFHRVIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKHRhcmdldEVudGl0eSA9IEFubm90YXRpb25UZXN0VHlwZS5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShvcHRpb25hbCA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9uZVRvT25lV2l0aE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lKG1hcHBlZEJ5ID0gXCJmb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNdWx0aXBsZUNhc2NhZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PTkVfVE9fT05FLCBKUEEuQ0FTQ0FERV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUoY2FzY2FkZSA9IHtDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T25lVG9PbmVXaXRoRHVwbGljYXRlQ2FzY2FkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9ORV9UT19PTkUsIEpQQS5DQVNDQURFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPbmVUb09uZShjYXNjYWRlID0ge0Nhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5NRVJHRX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydE5vdE51bGwob25lVG9PbmUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvbmVUb09uZS5nZXRGZXRjaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoZmV0Y2ggPSBMQVpZKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9uZVRvT25lLmdldEZldGNoKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9PbmUuZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aFRhcmdldEVudGl0eSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb25lVG9PbmUuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldFRhcmdldEVudGl0eSgiRm9vIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKHRhcmdldEVudGl0eSA9IEZvby5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXRFbnRpdHlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhUYXJnZXRFbnRpdHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9uZVRvT25lLmdldFRhcmdldEVudGl0eSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldFRhcmdldEVudGl0eShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0YXJnZXRFbnRpdHkiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRGdWxseVF1YWxpZmllZFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoVGFyZ2V0RW50aXR5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgb25lVG9PbmUuZ2V0RnVsbHlRdWFsaWZpZWRUYXJnZXRFbnRpdHlDbGFzc05hbWUoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSh0YXJnZXRFbnRpdHkgPSBGb28uY2xhc3MpIiwgY3UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvbmVUb09uZS5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9uZVRvT25lLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCkpOyAvL2J1ZyAxOTYyMDAgY2hhbmdlZCB0aGlzCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T25lVG9PbmVXaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0T3B0aW9uYWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUob3B0aW9uYWwgPSBmYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPcHRpb25hbE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZS5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lV2l0aE1hcHBlZEJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwZWRCeU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmUuZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJb25lVG9PbmUuc2V0TWFwcGVkQnkoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShtYXBwZWRCeSA9IFwiYmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWFwcGVkQnlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNYXBwZWRCeSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb09uZS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCW9uZVRvT25lLnNldE1hcHBlZEJ5KG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm1hcHBlZEJ5IiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBBTEwpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBNRVJHRSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9uZVRvT25lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gUEVSU0lTVCkiLCBjdSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXNjYWRlUmVtb3ZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlUmVtb3ZlKHRydWUpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBSRU1PVkUpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhc2NhZGVSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJT25lVG9PbmVBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZVJlZnJlc2godHJ1ZSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT25lVG9PbmUoY2FzY2FkZSA9IFJFRlJFU0gpIiwgY3UpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvbmVUb09uZS5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYXNjYWRlTW9yZVRoYW5PbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVBbGwodHJ1ZSk7Ci0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkvL2Egc2Vjb25kIENhc2NhZGVUeXBlLkFsbCBzaG91bGQgbm90IGhhdmUgYmVlbiBhZGRlZAotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9uZVRvT25lKGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwpIiwgY3UpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZUFsbChmYWxzZSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvT25lLmlzQ2FzY2FkZUFsbCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCQkKLQkJLy90ZXN0IHNldHRpbmcgY2FzY2FkZUFsbCB0byBmYWxzZSBhZ2Fpbiwgc2hvdWxkIGp1c3QgZG8gbm90aGluZwotCQlvbmVUb09uZS5zZXRDYXNjYWRlQWxsKGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2Uob25lVG9PbmUuaXNDYXNjYWRlQWxsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImNhc2NhZGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhEdXBsaWNhdGVDYXNjYWRlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPbmVUb09uZUFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlhc3NlcnRUcnVlKG9uZVRvT25lLmlzQ2FzY2FkZU1lcmdlKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsvL1RPRE8gc2hvdWxkIHRoZSByZXNvdXJjZSBtb2RlbCBoYW5kbGUgdGhpcyBhbmQgcmVtb3ZlIGJvdGggTUVSR0UgCi0JCQkJCQkJCQkJLy9zZXR0aW5ncyBpbnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgaXQgZmFsc2UgdHdpY2U/Ci0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRDYXNjYWRlTWVyZ2UoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShvbmVUb09uZS5pc0Nhc2NhZGVNZXJnZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVDYXNjYWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPbmVUb09uZVdpdGhNdWx0aXBsZUNhc2NhZGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCU9uZVRvT25lQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUob25lVG9PbmUuaXNDYXNjYWRlUmVtb3ZlKCkpOwotCQkKLQkJb25lVG9PbmUuc2V0Q2FzY2FkZU1lcmdlKGZhbHNlKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPbmVUb09uZShjYXNjYWRlID0gUkVNT1ZFKSIsIGN1KTsKLQkJCi0JCW9uZVRvT25lLnNldENhc2NhZGVSZW1vdmUoZmFsc2UpOwkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjYXNjYWRlIiwgY3UpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL09yZGVyQnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3JkZXJCeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1YWYyMTAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT3JkZXJCeVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3JkZXJCeUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yZGVyQnlUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIE9yZGVyQnlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9yZGVyQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5PUkRFUl9CWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9yZGVyQnkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T3JkZXJCeVdpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk9SREVSX0JZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT3JkZXJCeSh2YWx1ZSA9IFwia2V5XCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9SREVSX0JZKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmRlckJ5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPcmRlckJ5V2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9SREVSX0JZKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkiLCBvcmRlckJ5LmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9yZGVyQnkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQotCQlPcmRlckJ5QW5ub3RhdGlvbiBvcmRlckJ5ID0gKE9yZGVyQnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9SREVSX0JZKTsKLQotCQlvcmRlckJ5LnNldFZhbHVlKCJmb28iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT3JkZXJCeShcImZvb1wiKSIsIGN1KTsKLQkJCi0JCW9yZGVyQnkuc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9yZGVyQnkiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9QcmltYXJ5S2V5Sm9pbkNvbHVtblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNjVkMzguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFByaW1hcnlLZXlKb2luQ29sdW1uVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05BTUUgPSAiTVlfQ09MVU1OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OID0gIkNPTFVNTl9ERUZJTklUSU9OIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX1JFRkVSRU5DRURfQ09MVU1OX05BTUUgPSAiTVlfUkVGX0NPTFVNTl9OQU1FIjsKLQkKLQlwdWJsaWMgUHJpbWFyeUtleUpvaW5Db2x1bW5UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCIiICsgQ09MVU1OX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihyZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiIiArIENPTFVNTl9SRUZFUkVOQ0VEX0NPTFVNTl9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCIiICsgQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCi0JCWNvbHVtbi5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydEVxdWFscyhDT0xVTU5fTkFNRSwgY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQljb2x1bW4uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikiLCBjdSk7Ci0KLQkJCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFByaW1hcnlLZXlKb2luQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaW1hcnlLZXlKb2luQ29sdW1uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTBiYjYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpbWFyeUtleUpvaW5Db2x1bW5zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRSA9ICJNWV9DT0xVTU4iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gPSAiQ09MVU1OX0RFRklOSVRJT04iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSA9ICJNWV9SRUZfQ09MVU1OX05BTUUiOwotCQotCXB1YmxpYyBQcmltYXJ5S2V5Sm9pbkNvbHVtbnNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiIiArIENPTFVNTl9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoUmVmZXJlbmNlZENvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4ocmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIiIgKyBDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uV2l0aENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1ucyhAUHJpbWFyeUtleUpvaW5Db2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiIiArIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTiwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5XaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9OQU1FLCBjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbHVtbi5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhSZWZlcmVuY2VkQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydEVxdWFscyhDT0xVTU5fUkVGRVJFTkNFRF9DT0xVTU5fTkFNRSwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCWNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoQFByaW1hcnlLZXlKb2luQ29sdW1uKHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAUHJpbWFyeUtleUpvaW5Db2x1bW4oIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gY29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCi0JCWNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihjb2x1bW5EZWZpbml0aW9uID0gXCJGb29cIikpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbigiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtbkNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIikgfSkiOwotCQlQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlqb2luQ29sdW1uLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uc1NpemUoSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RBZGRQcmltYXJ5S2V5Sm9pbkNvbHVtblRvQmVnaW5uaW5nT2ZMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0UHJpbWFyeUtleUpvaW5Db2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1ucyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpLCI7Ci0JCVN0cmluZyBleHBlY3RlZDMgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSB9KSI7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDIgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSwiOwotCQlleHBlY3RlZDMgPSAiQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSB9KSI7Ci0JCWpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHBrSm9pbkNvbHVtbnMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKFByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbikgcGtKb2luQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24pIHBrSm9pbkNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBwa0pvaW5Db2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydEVxdWFscygzLCByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zU2l6ZShKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlUHJpbWFyeUtleUpvaW5Db2x1bW5Db3B5RXhpc3RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RQcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU3RyaW5nIGV4cGVjdGVkMSA9ICJAUHJpbWFyeUtleUpvaW5Db2x1bW5zKHsiOwotCQlTdHJpbmcgZXhwZWN0ZWQyID0gIkBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpIH0pIjsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSAoUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJGT08iKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQkJCi0JCWV4cGVjdGVkMSA9ICJAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIpIjsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFByaW1hcnlLZXlKb2luQ29sdW1ucyIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1F1ZXJ5SGludFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9RdWVyeUhpbnRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTA3NDI3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1F1ZXJ5SGludFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk5hbWVkUXVlcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlF1ZXJ5SGludEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFF1ZXJ5SGludFRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVFUllfSElOVF9OQU1FID0gIm15SGludCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX0hJTlRfVkFMVUUgPSAibXlWYWx1ZSI7Ci0JCi0JcHVibGljIFF1ZXJ5SGludFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk5BTUVEX1FVRVJZLCBKUEEuUVVFUllfSElOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE5hbWVkUXVlcnkoaGludHMgPSB7QFF1ZXJ5SGludChuYW1lID0gXCIiICsgUVVFUllfSElOVF9OQU1FICsgIlwiLCB2YWx1ZSA9IFwiIiArIFFVRVJZX0hJTlRfVkFMVUUgKyAiXCIpLCBAUXVlcnlIaW50fSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQgPSBuYW1lZFF1ZXJ5LmhpbnRBdCgwKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX0hJTlRfTkFNRSwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE5hbWVkUXVlcnlXaXRoUXVlcnlIaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJTmFtZWRRdWVyeUFubm90YXRpb24gbmFtZWRRdWVyeSA9IChOYW1lZFF1ZXJ5QW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLk5BTUVEX1FVRVJZKTsKLQkJUXVlcnlIaW50QW5ub3RhdGlvbiBxdWVyeUhpbnQgPSBuYW1lZFF1ZXJ5LmhpbnRBdCgwKTsKLQkJYXNzZXJ0RXF1YWxzKFFVRVJZX0hJTlRfTkFNRSwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQlxdWVyeUhpbnQuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcXVlcnlIaW50LmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFF1ZXJ5SGludChuYW1lID0gXCJmb29cIiwgdmFsdWUgPSBcIiIgKyBRVUVSWV9ISU5UX1ZBTFVFICsgIlwiKSIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZWNvbmRhcnlUYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDRlZDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5VbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19OQU1FID0gIk1ZX0NBVEFMT0ciOwotCQotCXB1YmxpYyBTZWNvbmRhcnlUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIiIgKyBUQUJMRV9OQU1FICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKGNhdGFsb2cgPSBcIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoUGtKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCi0JCXRhYmxlLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0KLQkJdGFibGUuc2V0Q2F0YWxvZygiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgdGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZyA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZ051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJdGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldFNjaGVtYSgpKTsKLQotCQl0YWJsZS5zZXRTY2hlbWEoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUoc2NoZW1hID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWFOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCXRhYmxlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKCIsIGN1KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmdldENvbHVtbk5hbWVzU2l6ZSgpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJSXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMywgc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygzLCBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pfSkiLCBjdSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RQa0pvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UGtKb2luQ29sdW1uczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQa0pvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoUGtKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUGtKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQotCQkKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMCk7Ci0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsvL3Rlc3QgYWRkaW5nIGEgcGtKb2luQ29sdW1uIGluIGZyb250IG9mIDIgb3RoZXIgam9pbkNvbHVtbnMKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnBrSm9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwodGFibGUucGtKb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZS5wa0pvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRQa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksQFByaW1hcnlLZXlKb2luQ29sdW1uLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVQa0pvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVQa0pvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0KLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpKSIsIGN1KTsKLQotCQkKLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVQa0pvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQl0YWJsZS5tb3ZlUGtKb2luQ29sdW1uKDIsIDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVBrSm9pbkNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0KLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQl0YWJsZS5tb3ZlUGtKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZSA9IFwiUkVGX05BTUVcIiwgY29sdW1uRGVmaW5pdGlvbiA9IFwiQ09MVU1OX0RFRlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UGtKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoUGtKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlLmdldFBrSm9pbkNvbHVtbnNTaXplKCkpOwotCQkKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5wa0pvaW5Db2x1bW5BdCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJam9pbkNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBqb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKX0pIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlY29uZGFyeVRhYmxlc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODY2YTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU2Vjb25kYXJ5VGFibGVzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuTmVzdGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2Vjb25kYXJ5VGFibGVzVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJNWV9UQUJMRSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNQV9OQU1FID0gIk1ZX1NDSEVNQSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEFMT0dfTkFNRSA9ICJNWV9DQVRBTE9HIjsKLQkKLQlwdWJsaWMgU2Vjb25kYXJ5VGFibGVzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEUsIEpQQS5TRUNPTkRBUllfVEFCTEVTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHNjaGVtYSA9IFwiIiArIFNDSEVNQV9OQU1FICsgIlwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFQ09OREFSWV9UQUJMRSwgSlBBLlNFQ09OREFSWV9UQUJMRVMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKGNhdGFsb2cgPSBcIiIgKyBDQVRBTE9HX05BTUUgKyAiXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuU0VDT05EQVJZX1RBQkxFUywgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50fSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRUNPTkRBUllfVEFCTEVTLCBKUEEuU0VDT05EQVJZX1RBQkxFLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBUlwiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKX0pKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuU0VDT05EQVJZX1RBQkxFUyk7Ci0JCWFzc2VydE5vdE51bGwoc2Vjb25kYXJ5VGFibGVzKTsKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQotCQlhc3NlcnROdWxsKHNlY29uZGFyeVRhYmxlLmdldE5hbWUoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoVEFCTEVfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXNlY29uZGFyeVRhYmxlLnNldENhdGFsb2coIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNlY29uZGFyeVRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUoY2F0YWxvZyA9IFwiRm9vXCIpKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKENBVEFMT0dfTkFNRSwgc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhTY2hlbWEoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiBzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHNlY29uZGFyeVRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0TnVsbChzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJc2Vjb25kYXJ5VGFibGUuc2V0U2NoZW1hKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUoc2NoZW1hID0gXCJGb29cIikpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFNDSEVNQV9OQU1FLCBzZWNvbmRhcnlUYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwoc2Vjb25kYXJ5VGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgc2Vjb25kYXJ5VGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHNlY29uZGFyeVRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXNlY29uZGFyeVRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSwgQFVuaXF1ZUNvbnN0cmFpbnR9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSl9KSIsIGN1KTsKLQkJCi0JCXNlY29uZGFyeVRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSkiLCBjdSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlY29uZGFyeVRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0JCQotCQlzZWNvbmRhcnlUYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50LCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDApLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc2Vjb25kYXJ5VGFibGUudW5pcXVlQ29uc3RyYWludEF0KDEpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMikuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCQkKLQkJc2Vjb25kYXJ5VGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydEVxdWFscygwLCBzZWNvbmRhcnlUYWJsZS51bmlxdWVDb25zdHJhaW50QXQoMCkuZ2V0Q29sdW1uTmFtZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNlY29uZGFyeVRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQsIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pKSIsIGN1KTsKLQl9Ci0JCi0JCi0JLy8gIEBFbnRpdHkgICAgIAkJCQktLT4+ICAgIEBFbnRpdHkKLQkvLwlAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIikJCQlAU2Vjb25kYXJ5VGFibGVzKHtAU2Vjb25kYXJ5VGFibGUobmFtZT0iRk9PIiksIEBTZWNvbmRhcnlUYWJsZShuYW1lPSJCQVIiKX0pCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTZWNvbmRhcnlUYWJsZUNvcHlFeGlzdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdFNlY29uZGFyeVRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlTdHJpbmcgZXhwZWN0ZWQxID0gIkBTZWNvbmRhcnlUYWJsZXMoeyI7Ci0JCVN0cmluZyBleHBlY3RlZDIgPSAiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHsgXCJCQVJcIiB9KSksIjsKLQkJU3RyaW5nIGV4cGVjdGVkMyA9ICJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiQkFSXCIpIH0pIjsKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHNlY29uZGFyeVRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCXNlY29uZGFyeVRhYmxlLnNldE5hbWUoIkJBUiIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDEsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQyLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMywgY3UpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5TRUNPTkRBUllfVEFCTEUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFNlY29uZGFyeVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQFNlY29uZGFyeVRhYmxlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCBzY2hlbWEgPSBcIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0geyBcIkJBUlwiIH0pKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDIgPSAiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkJBWlwiKSwiOwotCQlleHBlY3RlZDMgPSAiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHsgXCJCQVJcIiB9KSksIEBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlzZWNvbmRhcnlUYWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQlzZWNvbmRhcnlUYWJsZS5zZXROYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDMsIGN1KTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IHNlY29uZGFyeVRhYmxlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhKUEEuU0VDT05EQVJZX1RBQkxFKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsICgoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSBzZWNvbmRhcnlUYWJsZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSkpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShKUEEuU0VDT05EQVJZX1RBQkxFKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNlY29uZGFyeVRhYmxlQ29weUV4aXN0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVN0cmluZyBleHBlY3RlZDEgPSAiQFNlY29uZGFyeVRhYmxlcyh7IjsKLQkJU3RyaW5nIGV4cGVjdGVkMiA9ICJAU2Vjb25kYXJ5VGFibGUobmFtZSA9IFwiRk9PXCIsIGNhdGFsb2cgPSBcIkJBUlwiLCBzY2hlbWEgPSBcIkJBWlwiLCB1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0geyBcIkJBUlwiIH0pKSwiOwotCQlTdHJpbmcgZXhwZWN0ZWQzID0gIkBTZWNvbmRhcnlUYWJsZShuYW1lID0gXCJCQVJcIikgfSkiOwotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gc2Vjb25kYXJ5VGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJc2Vjb25kYXJ5VGFibGUuc2V0TmFtZSgiQkFSIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKGV4cGVjdGVkMSwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucyhleHBlY3RlZDIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQzLCBjdSk7Ci0JCQotCQlleHBlY3RlZDEgPSAiQFNlY29uZGFyeVRhYmxlKG5hbWUgPSBcIkZPT1wiLCBjYXRhbG9nID0gXCJCQVJcIiwgc2NoZW1hID0gXCJCQVpcIiwgdW5pcXVlQ29uc3RyYWludHMgPSBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHsgXCJCQVJcIiB9KSkiOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoZXhwZWN0ZWQxLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2Vjb25kYXJ5VGFibGVzIiwgY3UpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RQa0pvaW5Db2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQa0pvaW5Db2x1bW5zMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0UGtKb2luQ29sdW1uc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RQa0pvaW5Db2x1bW5zMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRQa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFBrSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChTZWNvbmRhcnlUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEpQQS5TRUNPTkRBUllfVEFCTEUpOwotCQkKLQkJdGFibGUuYWRkUGtKb2luQ29sdW1uKDApLnNldE5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRQa0pvaW5Db2x1bW4oMSk7Ci0JCXRhYmxlLmFkZFBrSm9pbkNvbHVtbigwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIpLEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbn0pKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVBrSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVQa0pvaW5Db2x1bW4oMSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIil9KSkiLCBjdSk7Ci0KLQkJdGFibGUucmVtb3ZlUGtKb2luQ29sdW1uKDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIikpKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVBrSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZWNvbmRhcnlUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUGtKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZWNvbmRhcnlUYWJsZXNXaXRoUGtKb2luQ29sdW1ucygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlTZWNvbmRhcnlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBKUEEuU0VDT05EQVJZX1RBQkxFKTsKLQkJUHJpbWFyeUtleUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpvaW5Db2x1bW4gPSB0YWJsZS5wa0pvaW5Db2x1bW5BdCgwKTsKLQkJam9pbkNvbHVtbi5zZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGX05BTUUiKTsKLQkJam9pbkNvbHVtbi5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCXRhYmxlLm1vdmVQa0pvaW5Db2x1bW4oMiwgMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2Vjb25kYXJ5VGFibGVzKEBTZWNvbmRhcnlUYWJsZShwa0pvaW5Db2x1bW5zID0ge0BQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJGT09cIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVpcIiksIEBQcmltYXJ5S2V5Sm9pbkNvbHVtbihuYW1lID0gXCJCQVJcIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSBcIlJFRl9OQU1FXCIsIGNvbHVtbkRlZmluaXRpb24gPSBcIkNPTFVNTl9ERUZcIil9KSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlUGtKb2luQ29sdW1uMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0KLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1uQXQoMCk7Ci0JCWpvaW5Db2x1bW4uc2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRl9OQU1FIik7Ci0JCWpvaW5Db2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQl0YWJsZS5tb3ZlUGtKb2luQ29sdW1uKDAsIDIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlY29uZGFyeVRhYmxlcyhAU2Vjb25kYXJ5VGFibGUocGtKb2luQ29sdW1ucyA9IHtAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFaXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiQkFSXCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gXCJSRUZfTkFNRVwiLCBjb2x1bW5EZWZpbml0aW9uID0gXCJDT0xVTU5fREVGXCIpLCBAUHJpbWFyeUtleUpvaW5Db2x1bW4obmFtZSA9IFwiRk9PXCIpfSkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UGtKb2luQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2Vjb25kYXJ5VGFibGVzV2l0aFBrSm9pbkNvbHVtbnMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgSlBBLlNFQ09OREFSWV9UQUJMRSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZS5nZXRQa0pvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCVByaW1hcnlLZXlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gdGFibGUucGtKb2luQ29sdW1uQXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCi0JCWpvaW5Db2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZWNvbmRhcnlUYWJsZXMoQFNlY29uZGFyeVRhYmxlKHBrSm9pbkNvbHVtbnMgPSB7QFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcImZvb1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkZPT1wiKSwgQFByaW1hcnlLZXlKb2luQ29sdW1uKG5hbWUgPSBcIkJBWlwiKX0pKSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1NlcXVlbmNlR2VuZXJhdG9yVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU5OWNhZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9TZXF1ZW5jZUdlbmVyYXRvclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9OQU1FID0gIk1ZX0dFTkVSQVRPUiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9TRVFVRU5DRV9OQU1FID0gIk1ZX1NFUVVFTkNFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEdFTkVSQVRPUl9BTExPQ0FUSU9OX1NJWkUgPSBJbnRlZ2VyLnZhbHVlT2YoNSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSA9IEludGVnZXIudmFsdWVPZig1KTsKLQkKLQlwdWJsaWMgU2VxdWVuY2VHZW5lcmF0b3JUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvck9uRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvck9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJuYW1lIiwgR0VORVJBVE9SX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoInNlcXVlbmNlTmFtZSIsIEdFTkVSQVRPUl9TRVFVRU5DRV9OQU1FKTsKLQl9Ci0JCQotCXByb3RlY3RlZCBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTZXF1ZW5jZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoSW50RWxlbWVudCgiYWxsb2NhdGlvblNpemUiLCBHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFLmludFZhbHVlKCkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoImluaXRpYWxWYWx1ZSIsIEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFLmludFZhbHVlKCkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFNlcXVlbmNlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICIgPSAiICsgdmFsdWUgKyAiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2VHZW5lcmF0b3JPbkZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvck9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZUdlbmVyYXRvcik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXF1ZW5jZUdlbmVyYXRvck9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JPblR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnROb3ROdWxsKHNlcXVlbmNlR2VuZXJhdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX05BTUUsIHNlcXVlbmNlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9OQU1FLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IobmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBTZXF1ZW5jZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNlcXVlbmNlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U2VxdWVuY2VHZW5lcmF0b3JXaXRoU2VxdWVuY2VOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfU0VRVUVOQ0VfTkFNRSwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2VxdWVuY2VOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXF1ZW5jZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aFNlcXVlbmNlTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1NFUVVFTkNFX05BTUUsIHNlcXVlbmNlR2VuZXJhdG9yLmdldFNlcXVlbmNlTmFtZSgpKTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNlcXVlbmNlTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc2VxdWVuY2VHZW5lcmF0b3IuZ2V0U2VxdWVuY2VOYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTZXF1ZW5jZUdlbmVyYXRvcihzZXF1ZW5jZU5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldFNlcXVlbmNlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChzZXF1ZW5jZUdlbmVyYXRvci5nZXRTZXF1ZW5jZU5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlcXVlbmNlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QWxsb2NhdGlvblNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24gc2VxdWVuY2VHZW5lcmF0b3IgPSAoU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlNFUVVFTkNFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MDApLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRBbGxvY2F0aW9uU2l6ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IoYWxsb2NhdGlvblNpemUgPSA1MDApIiwgY3UpOwotCQkKLQkJc2VxdWVuY2VHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFNlcXVlbmNlR2VuZXJhdG9yKCIsIGN1KTsKLQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplID0gMCkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRJbml0aWFsVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFNlcXVlbmNlR2VuZXJhdG9yV2l0aEluaXRpYWxWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJU2VxdWVuY2VHZW5lcmF0b3JBbm5vdGF0aW9uIHNlcXVlbmNlR2VuZXJhdG9yID0gKFNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5TRVFVRU5DRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0lOSVRJQUxfVkFMVUUsIHNlcXVlbmNlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTZXF1ZW5jZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbiBzZXF1ZW5jZUdlbmVyYXRvciA9IChTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuU0VRVUVOQ0VfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFLCBzZXF1ZW5jZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlzZXF1ZW5jZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUwMCksIHNlcXVlbmNlR2VuZXJhdG9yLmdldEluaXRpYWxWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAU2VxdWVuY2VHZW5lcmF0b3IoaW5pdGlhbFZhbHVlID0gNTAwKSIsIGN1KTsKLQkJCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAU2VxdWVuY2VHZW5lcmF0b3IoIiwgY3UpOwotCi0JCXNlcXVlbmNlR2VuZXJhdG9yLnNldEluaXRpYWxWYWx1ZShJbnRlZ2VyLnZhbHVlT2YoMCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFNlcXVlbmNlR2VuZXJhdG9yKGluaXRpYWxWYWx1ZSA9IDApIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVGFibGVHZW5lcmF0b3JUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjJlYzA2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlR2VuZXJhdG9yVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUYWJsZUdlbmVyYXRvclRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX05BTUUgPSAiTVlfR0VORVJBVE9SIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1RBQkxFID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX0NBVEFMT0cgPSAiTVlfQ0FUQUxPRyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEdFTkVSQVRPUl9TQ0hFTUEgPSAiTVlfU0NIRU1BIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1BLX0NPTFVNTl9OQU1FID0gIk1ZX1BLX0NPTFVNTl9OQU1FIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1ZBTFVFX0NPTFVNTl9OQU1FID0gIk1ZX1ZBTFVFX0NPTFVNTl9OQU1FIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVE9SX1BLX0NPTFVNTl9WQUxVRSA9ICJNWV9QS19DT0xVTU5fVkFMVUUiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRSA9IEludGVnZXIudmFsdWVPZig1KTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFID0gSW50ZWdlci52YWx1ZU9mKDUpOwotCQotCXB1YmxpYyBUYWJsZUdlbmVyYXRvclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yT25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGVHZW5lcmF0b3IiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoIm5hbWUiLCBHRU5FUkFUT1JfTkFNRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJ0YWJsZSIsIEdFTkVSQVRPUl9UQUJMRSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFN0cmluZ0VsZW1lbnQoImNhdGFsb2ciLCBHRU5FUkFUT1JfQ0FUQUxPRyk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgic2NoZW1hIiwgR0VORVJBVE9SX1NDSEVNQSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoUGtDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoU3RyaW5nRWxlbWVudCgicGtDb2x1bW5OYW1lIiwgR0VORVJBVE9SX1BLX0NPTFVNTl9OQU1FKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhWYWx1ZUNvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJ2YWx1ZUNvbHVtbk5hbWUiLCBHRU5FUkFUT1JfVkFMVUVfQ09MVU1OX05BTUUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFBrQ29sdW1uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KCJwa0NvbHVtblZhbHVlIiwgR0VORVJBVE9SX1BLX0NPTFVNTl9WQUxVRSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhTdHJpbmdFbGVtZW50KGZpbmFsIFN0cmluZyBlbGVtZW50TmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcigiICsgZWxlbWVudE5hbWUgKyAiID0gXCIiICsgdmFsdWUgKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoSW50RWxlbWVudCgiYWxsb2NhdGlvblNpemUiLCBHRU5FUkFUT1JfQUxMT0NBVElPTl9TSVpFLmludFZhbHVlKCkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoImluaXRpYWxWYWx1ZSIsIEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFLmludFZhbHVlKCkpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aEludEVsZW1lbnQoZmluYWwgU3RyaW5nIGVsZW1lbnROYW1lLCBmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRhYmxlR2VuZXJhdG9yKCIgKyBlbGVtZW50TmFtZSArICIgPSAiICsgdmFsdWUgKyAiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEVfR0VORVJBVE9SLCBKUEEuVU5JUVVFX0NPTlNUUkFJTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlR2VuZXJhdG9yT25GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JPbkZpZWxkKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydE5vdE51bGwodGFibGVHZW5lcmF0b3IpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVHZW5lcmF0b3JPblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yT25UeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZUdlbmVyYXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9OQU1FLCB0YWJsZUdlbmVyYXRvci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfTkFNRSwgdGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9UQUJMRSwgdGFibGVHZW5lcmF0b3IuZ2V0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1RBQkxFLCB0YWJsZUdlbmVyYXRvci5nZXRUYWJsZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFRhYmxlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXRUYWJsZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodGFibGUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFRhYmxlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aENhdGFsb2coKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9DQVRBTE9HLCB0YWJsZUdlbmVyYXRvci5nZXRDYXRhbG9nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfQ0FUQUxPRywgdGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldENhdGFsb2coImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHRhYmxlR2VuZXJhdG9yLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGNhdGFsb2cgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwodGFibGVHZW5lcmF0b3IuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1NDSEVNQSwgdGFibGVHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1NDSEVNQSwgdGFibGVHZW5lcmF0b3IuZ2V0U2NoZW1hKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U2NoZW1hKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHNjaGVtYSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFNjaGVtYSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQa0NvbHVtbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFBrQ29sdW1uTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX1BLX0NPTFVNTl9OQU1FLCB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFBrQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoUGtDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfUEtfQ09MVU1OX05BTUUsIHRhYmxlR2VuZXJhdG9yLmdldFBrQ29sdW1uTmFtZSgpKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uTmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5OYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihwa0NvbHVtbk5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldFBrQ29sdW1uTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlQ29sdW1uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoVmFsdWVDb2x1bW5OYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfVkFMVUVfQ09MVU1OX05BTUUsIHRhYmxlR2VuZXJhdG9yLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWVDb2x1bW5OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhWYWx1ZUNvbHVtbk5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9WQUxVRV9DT0xVTU5fTkFNRSwgdGFibGVHZW5lcmF0b3IuZ2V0VmFsdWVDb2x1bW5OYW1lKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0VmFsdWVDb2x1bW5OYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB0YWJsZUdlbmVyYXRvci5nZXRWYWx1ZUNvbHVtbk5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKHZhbHVlQ29sdW1uTmFtZSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0VmFsdWVDb2x1bW5OYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlR2VuZXJhdG9yLmdldFZhbHVlQ29sdW1uTmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGVHZW5lcmF0b3IoIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhQa0NvbHVtblZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFLCB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtblZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQa0NvbHVtblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhQa0NvbHVtblZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfUEtfQ09MVU1OX1ZBTFVFLCB0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0UGtDb2x1bW5WYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGFibGVHZW5lcmF0b3IuZ2V0UGtDb2x1bW5WYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IocGtDb2x1bW5WYWx1ZSA9IFwiZm9vXCIpIiwgY3UpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0UGtDb2x1bW5WYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZUdlbmVyYXRvci5nZXRQa0NvbHVtblZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvcigiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRSwgdGFibGVHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEFsbG9jYXRpb25TaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhBbGxvY2F0aW9uU2l6ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQlhc3NlcnRFcXVhbHMoR0VORVJBVE9SX0FMTE9DQVRJT05fU0laRSwgdGFibGVHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRBbGxvY2F0aW9uU2l6ZShJbnRlZ2VyLnZhbHVlT2YoNTAwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTAwKSwgdGFibGVHZW5lcmF0b3IuZ2V0QWxsb2NhdGlvblNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGFsbG9jYXRpb25TaXplID0gNTAwKSIsIGN1KTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLnNldEFsbG9jYXRpb25TaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZUdlbmVyYXRvcigiLCBjdSk7Ci0KLQkJdGFibGVHZW5lcmF0b3Iuc2V0QWxsb2NhdGlvblNpemUoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihhbGxvY2F0aW9uU2l6ZSA9IDApIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5pdGlhbFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhJbml0aWFsVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJYXNzZXJ0RXF1YWxzKEdFTkVSQVRPUl9JTklUSUFMX1ZBTFVFLCB0YWJsZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEluaXRpYWxWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVHZW5lcmF0b3JXaXRoSW5pdGlhbFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCWFzc2VydEVxdWFscyhHRU5FUkFUT1JfSU5JVElBTF9WQUxVRSwgdGFibGVHZW5lcmF0b3IuZ2V0SW5pdGlhbFZhbHVlKCkpOwotCQkKLQkJdGFibGVHZW5lcmF0b3Iuc2V0SW5pdGlhbFZhbHVlKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1MDApLCB0YWJsZUdlbmVyYXRvci5nZXRJbml0aWFsVmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlR2VuZXJhdG9yKGluaXRpYWxWYWx1ZSA9IDUwMCkiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yKCIsIGN1KTsKLQotCQl0YWJsZUdlbmVyYXRvci5zZXRJbml0aWFsVmFsdWUoSW50ZWdlci52YWx1ZU9mKDApKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcihpbml0aWFsVmFsdWUgPSAwKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yT25GaWVsZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJdGFibGVHZW5lcmF0b3IuYWRkVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50czMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlR2VuZXJhdG9yV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUYWJsZUdlbmVyYXRvckFubm90YXRpb24gdGFibGVHZW5lcmF0b3IgPSAoVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRBQkxFX0dFTkVSQVRPUik7Ci0JCQkJCi0JCWFzc2VydEVxdWFscygzLCB0YWJsZUdlbmVyYXRvci5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvck9uRmllbGQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCVRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbiB0YWJsZUdlbmVyYXRvciA9IChUYWJsZUdlbmVyYXRvckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEVfR0VORVJBVE9SKTsKLQkJCi0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlR2VuZXJhdG9yLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50QXQoMCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0YWJsZUdlbmVyYXRvci51bmlxdWVDb25zdHJhaW50QXQoMSkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlR2VuZXJhdG9yLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5nZXRDb2x1bW5OYW1lc1NpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIHRhYmxlR2VuZXJhdG9yLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJGT09cIiksIEBVbmlxdWVDb25zdHJhaW50fSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIiwgY3UpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZUdlbmVyYXRvcih1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KSkiLCBjdSk7Ci0JCQotCQl0YWJsZUdlbmVyYXRvci5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlR2VuZXJhdG9yKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZUdlbmVyYXRvcldpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uIHRhYmxlR2VuZXJhdG9yID0gKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRV9HRU5FUkFUT1IpOwotCQkKLQkJdGFibGVHZW5lcmF0b3IubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGVHZW5lcmF0b3IodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KX0pIiwgY3UpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RhYmxlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0YTZiNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRhYmxlQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGFibGVUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUJMRV9OQU1FID0gIk1ZX1RBQkxFIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1BX05BTUUgPSAiTVlfU0NIRU1BIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FUQUxPR19OQU1FID0gIk1ZX0NBVEFMT0ciOwotCQotCXB1YmxpYyBUYWJsZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUYWJsZVdpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShuYW1lID0gXCIiICsgVEFCTEVfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUYWJsZShzY2hlbWEgPSBcIiIgKyBTQ0hFTUFfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUoY2F0YWxvZyA9IFwiIiArIENBVEFMT0dfTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGFibGVXaXRoVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5UQUJMRSwgSlBBLlVOSVFVRV9DT05TVFJBSU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVJcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkZPT1wifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFaXCJ9KX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydE51bGwodGFibGUuZ2V0TmFtZSgpKTsKLQotCQl0YWJsZS5zZXROYW1lKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZShuYW1lID0gXCJGb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKFRBQkxFX05BTUUsIHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQl0YWJsZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoQ2F0YWxvZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhDQVRBTE9HX05BTUUsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXRhYmxlLnNldENhdGFsb2coIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHRhYmxlLmdldENhdGFsb2coKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKGNhdGFsb2cgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENhdGFsb2dOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhDYXRhbG9nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQ0FUQUxPR19OQU1FLCB0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJdGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aFNjaGVtYSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZSk7Ci0JCWFzc2VydEVxdWFscyhTQ0hFTUFfTkFNRSwgdGFibGUuZ2V0U2NoZW1hKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJdGFibGUuc2V0U2NoZW1hKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHNjaGVtYSA9IFwiRm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2NoZW1hTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGVXaXRoU2NoZW1hKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoU0NIRU1BX05BTUUsIHRhYmxlLmdldFNjaGVtYSgpKTsKLQkJCi0JCXRhYmxlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0YWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIHRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVuaXF1ZUNvbnN0cmFpbnRzMigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMywgdGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJCi0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgwKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdGFibGUudW5pcXVlQ29uc3RyYWludEF0KDIpLmdldENvbHVtbk5hbWVzU2l6ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBUlwiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLCBAVW5pcXVlQ29uc3RyYWludH0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoIkZPTyIpOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApOwotCQl0YWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQl0YWJsZS51bmlxdWVDb25zdHJhaW50QXQoMSkuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50LEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0geyBcIkJBUlwiLCBcIkJBWlwiIH0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpfSkiLCBjdSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgyKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlMaXN0SXRlcmF0b3I8U3RyaW5nPiBjb2x1bW5OYW1lcyA9IHRhYmxlLnVuaXF1ZUNvbnN0cmFpbnRBdCgxKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgY29sdW1uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBjb2x1bW5OYW1lcy5uZXh0KCkpOwotCX0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlV2l0aFVuaXF1ZUNvbnN0cmFpbnRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KSwgQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pKSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGFibGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRhYmxlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCVRhYmxlQW5ub3RhdGlvbiB0YWJsZSA9IChUYWJsZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEpQQS5UQUJMRSk7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgiRk9PIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgiQkFSIik7Ci0JCXRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFaXCIpfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0ge0BVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkJBWlwiKX0pIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVpcIikpIiwgY3UpOwotCQkKLQkJdGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgwKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBUYWJsZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVVbmlxdWVDb25zdHJhaW50MygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJVGFibGVBbm5vdGF0aW9uIHRhYmxlID0gKFRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSlBBLlRBQkxFKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKCJCQVIiKTsKLQkJdGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKCJCQVoiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUYWJsZSh1bmlxdWVDb25zdHJhaW50cyA9IHtAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiRk9PXCIpLEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVJcIiksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0gXCJCQVpcIil9KSIsIGN1KTsKLQkJCi0JCXRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSxAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IFwiQkFSXCIpfSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDEpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRhYmxlKHVuaXF1ZUNvbnN0cmFpbnRzID0gQFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSBcIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQl0YWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQFRhYmxlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJGT09cIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBWlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiQkFSXCJ9KX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVVuaXF1ZUNvbnN0cmFpbnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUYWJsZVdpdGhVbmlxdWVDb25zdHJhaW50cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlUYWJsZUFubm90YXRpb24gdGFibGUgPSAoVGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihKUEEuVEFCTEUpOwotCQkKLQkJdGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMik7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGFibGUodW5pcXVlQ29uc3RyYWludHMgPSB7QFVuaXF1ZUNvbnN0cmFpbnQoY29sdW1uTmFtZXMgPSB7XCJCQVpcIn0pLCBAVW5pcXVlQ29uc3RyYWludChjb2x1bW5OYW1lcyA9IHtcIkJBUlwifSksIEBVbmlxdWVDb25zdHJhaW50KGNvbHVtbk5hbWVzID0ge1wiRk9PXCJ9KX0pIiwgY3UpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RlbXBvcmFsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5NTM5MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UZW1wb3JhbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGVtcG9yYWxUZXN0cyBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFRlbXBvcmFsVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLlRFTVBPUkFMKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVtcG9yYWwiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVtcG9yYWxXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5URU1QT1JBTCwgSlBBLlRFTVBPUkFMX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW1wb3JhbChUZW1wb3JhbFR5cGUuREFURSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW1wb3JhbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5URU1QT1JBTCk7Ci0JCWFzc2VydE5vdE51bGwodGVtcG9yYWwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbXBvcmFsV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLlRFTVBPUkFMKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW1wb3JhbCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCi0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuVEVNUE9SQUwpOwotCi0JCXRlbXBvcmFsLnNldFZhbHVlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGVtcG9yYWwoVElNRSkiLCBjdSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAVGVtcG9yYWwoIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zaWVudFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MTU1MTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNpZW50VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRyYW5zaWVudEFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFRyYW5zaWVudFRlc3RzIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgVHJhbnNpZW50VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUcmFuc2llbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5UUkFOU0lFTlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRyYW5zaWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNpZW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRyYW5zaWVudEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0VHJ1ZShtYXBwaW5nQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRyYW5zaWVudEFubm90YXRpb24pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVmVyc2lvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9WZXJzaW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYwNDVlNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9WZXJzaW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBWZXJzaW9uVGVzdHMgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBWZXJzaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuVkVSU0lPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RWZXJzaW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VOb2RlIG1hcHBpbmdBbm5vdGF0aW9uID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFZlcnNpb25Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobWFwcGluZ0Fubm90YXRpb24gaW5zdGFuY2VvZiBWZXJzaW9uQW5ub3RhdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy90ZXN0LnhtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YjY0YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5jbGFzc3BhdGggYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzEyOGYzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhZWNmNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODYwNjNiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA4OjQ5IEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3OTM4Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLkpwdEpwYURiVGVzdHNQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCi0gb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZTtidW5kbGUtdmVyc2lvbj0iMS4wLjEiLAotIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsO2J1bmRsZS12ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3Jtczt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9hYm91dC5odG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1MzRiYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjdhYjhmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL2RlcmJ5LnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQyZDE1Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvZGVyYnkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsIGZvciBEZXJieQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L2RlcmJ5L2xpYi9kZXJieS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQgZm9yIERlcmJ5Ci0jIHVybCA9IGpkYmM6ZGVyYnk6QzovZGVyYnkvZGF0YS90ZXN0ZGI7Y3JlYXRlPXRydWUKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL215c3FsLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0MDdkZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvbXlzcWwucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovbXlzcWwvbXlzcWwtY29ubmVjdG9yLWphdmEtNS4wLjYtYmluLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyBvcHRpb25hbCBmb3IgTXlTUUwKLSMgdXJsID0gamRiYzpteXNxbDovL2xvY2FsaG9zdDozMzA2CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlMTBnLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiOTExYjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGUxMGdYRS5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2N2MwMWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL29yYWNsZTEwZ1hFLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gc2NvdHQKLXBhc3N3b3JkID0gdGlnZXIKLQotIyB0aGUgSkRCQyBkcml2ZXIgSkFSKHMpIG11c3QgYmUgc3BlY2lmaWVkOwotIyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgSkFScywgc2VwYXJhdGUgdGhlIG5hbWVzIHdpdGggY29tbWFzCi0jIGphcnMgPSBDOi9vcmFjbGUvamRiYy9saWIvb2pkYmM1LmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOm9yYWNsZTp0aGluOkBsb2NhbGhvc3Q6MTUyMTpYRQotdXJsID0gCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvb3JhY2xlOWkucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjkxMWI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9vcmFjbGU5aS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgQ29uZmlndXJlIHRoZSB3b3Jrc3BhY2UtIGFuZCBkYXRhYmFzZSBzZXJ2ZXItc3BlY2lmaWMgc2V0dGluZ3MgaGVyZS4KLQotIyB1c2VyIGFuZCBwYXNzd29yZCBhcmUgb3B0aW9uYWwsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0KLXVzZXJJRCA9IHNjb3R0Ci1wYXNzd29yZCA9IHRpZ2VyCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovb3JhY2xlL2pkYmMvbGliL29qZGJjNS5qYXIKLWphcnMgPSAKLQotIyB0aGUgSkRCQyBVUkwgaXMgcmVxdWlyZWQKLSMgdXJsID0gamRiYzpvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6dGVzdGRiCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9wb3N0Z3Jlc3FsLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvcG9zdGdyZXNxbC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZhZmU0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9wb3N0Z3Jlc3FsLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3Bvc3RncmVzcWwvamRiYy9wb3N0Z3Jlc3FsLTguMi01MDUuamRiYzMuamFyCi1qYXJzID0gCi0KLSMgdGhlIEpEQkMgVVJMIGlzIG9wdGlvbmFsIGZvciBQb3N0Z3JlU1FMCi0jIHVybCA9IGpkYmM6cG9zdGdyZXNxbApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvY29uZmlnL3NxbHNlcnZlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzJiNjQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zcWxzZXJ2ZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIENvbmZpZ3VyZSB0aGUgd29ya3NwYWNlLSBhbmQgZGF0YWJhc2Ugc2VydmVyLXNwZWNpZmljIHNldHRpbmdzIGhlcmUuCi0KLSMgdXNlciBhbmQgcGFzc3dvcmQgYXJlIG9wdGlvbmFsLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtCi11c2VySUQgPSAKLXBhc3N3b3JkID0gCi0KLSMgdGhlIEpEQkMgZHJpdmVyIEpBUihzKSBtdXN0IGJlIHNwZWNpZmllZDsKLSMgaWYgdGhlcmUgYXJlIG11bHRpcGxlIEpBUnMsIHNlcGFyYXRlIHRoZSBuYW1lcyB3aXRoIGNvbW1hcwotIyBqYXJzID0gQzovc3Fsc2VydmVyL2xpYi9zcWxqZGJjLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnNxbHNlcnZlcjovL2xvY2FsaG9zdDoxNDMzCi11cmwgPSAKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZy9zeWJhc2UucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzZDVkNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9jb25maWcvc3liYXNlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBDb25maWd1cmUgdGhlIHdvcmtzcGFjZS0gYW5kIGRhdGFiYXNlIHNlcnZlci1zcGVjaWZpYyBzZXR0aW5ncyBoZXJlLgotCi0jIHVzZXIgYW5kIHBhc3N3b3JkIGFyZSBvcHRpb25hbCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQotdXNlcklEID0gCi1wYXNzd29yZCA9IAotCi0jIHRoZSBKREJDIGRyaXZlciBKQVIocykgbXVzdCBiZSBzcGVjaWZpZWQ7Ci0jIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBKQVJzLCBzZXBhcmF0ZSB0aGUgbmFtZXMgd2l0aCBjb21tYXMKLSMgamFycyA9IEM6L3N5YmFzZS9saWIvamNvbm4zLmphcgotamFycyA9IAotCi0jIHRoZSBKREJDIFVSTCBpcyByZXF1aXJlZAotIyB1cmwgPSBqZGJjOnN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAKLXVybCA9IApkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5ODc3OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lID0gSlBBIERCIFRlc3RzCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwotCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KREJDVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJlZmE0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRHJpdmVyTWFuYWdlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUaGVzZSBhcmVuJ3QgdGVzdHMuIFRoZXkgYXJlIGp1c3QgYW4gZWFzeSB3YXkgdG8gZHVtcCBKREJDIG1ldGFkYXRhIHRvIHRoZQotICogY29uc29sZS4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgSkRCQ1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEpEQkNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVyYnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoREVSQlkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNeVNRTCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShNWVNRTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yYWNsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmR1bXBNZXRhRGF0YShPUkFDTEUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQb3N0Z3JlU1FMKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZHVtcE1ldGFEYXRhKFBPU1RHUkVTUUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTeWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5kdW1wTWV0YURhdGEoU1lCQVNFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wTWV0YURhdGEoQ29ubmVjdGlvbkNvbmZpZyBjb25maWcpIHRocm93cyBFeGNlcHRpb24gewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKioqIFBMQVRGT1JNOiAiICsgY29uZmlnLnBsYXRmb3JtTmFtZSArICIgKioqKioiKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCUNsYXNzLmZvck5hbWUoY29uZmlnLmRyaXZlckNsYXNzTmFtZSk7Ci0JCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IERyaXZlck1hbmFnZXIuZ2V0Q29ubmVjdGlvbih0aGlzLmJ1aWxkVVJMKGNvbmZpZyksIGNvbmZpZy51c2VyLCBjb25maWcucGFzc3dvcmQpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNBVEFMT0dTOiIpOwotCQlKREJDVG9vbHMuZHVtcChjb25uZWN0aW9uLmdldE1ldGFEYXRhKCkuZ2V0Q2F0YWxvZ3MoKSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNDSEVNQVRBOiIpOwotCQlKREJDVG9vbHMuZHVtcChjb25uZWN0aW9uLmdldE1ldGFEYXRhKCkuZ2V0U2NoZW1hcygpKTsKLQkJY29ubmVjdGlvbi5jbG9zZSgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJ1aWxkVVJMKENvbm5lY3Rpb25Db25maWcgY29uZmlnKSB7Ci0JCXJldHVybiAiamRiYzoiICsgY29uZmlnLmRhdGFiYXNlVVJMOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBERVJCWSA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIkRlcmJ5IiwKLQkJCSJvcmcuYXBhY2hlLmRlcmJ5LmpkYmMuRW1iZWRkZWREcml2ZXIiLAotCQkJImRlcmJ5OkM6L2RlcmJ5L2RhdGEvdGVzdCIsCi0JCQludWxsLAotCQkJbnVsbAotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIE1ZU1FMID0KLQkJbmV3IENvbm5lY3Rpb25Db25maWcoCi0JCQkiTXlTUUwiLAotCQkJImNvbS5teXNxbC5qZGJjLkRyaXZlciIsCi0JCQkibXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNiIsCi0JCQkicm9vdCIsCi0JCQkib3JhY2xlIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIE9SQUNMRSA9Ci0JCW5ldyBDb25uZWN0aW9uQ29uZmlnKAotCQkJIk9yYWNsZSIsCi0JCQkib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIiwKLQkJCSJvcmFjbGU6dGhpbjpAbG9jYWxob3N0OjE1MjE6b3JjbCIsCi0JCQkic2NvdHQiLAotCQkJInRpZ2VyIgotCQkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBDb25uZWN0aW9uQ29uZmlnIFBPU1RHUkVTUUwgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJQb3N0Z3JlU1FMIiwKLQkJCSJvcmcucG9zdGdyZXNxbC5Ecml2ZXIiLAotCQkJInBvc3RncmVzcWw6cG9zdGdyZXMiLAotCQkJInBvc3RncmVzIiwKLQkJCSJvcmFjbGUiCi0JCSk7Ci0KLQkvLyB0aGUgU3liYXNlIHNlcnZlciBtdXN0IGJlIGNvbmZpZ3VyZWQgZXhwbGljaXRseSB0byAibG9jYWxob3N0IgotCS8vIGluIHRoZSBjb25maWcgZmlsZSBbU1lCQVNFXS9pbmkvc3FsLmluaQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBTWUJBU0UgPQotCQluZXcgQ29ubmVjdGlvbkNvbmZpZygKLQkJCSJTeWJhc2UiLAotCQkJImNvbS5zeWJhc2UuamRiYzMuamRiYy5TeWJEcml2ZXIiLAotCQkJInN5YmFzZTpUZHM6bG9jYWxob3N0OjUwMDAiLAotCQkJInNhIiwKLQkJCSJvcmFjbGUiCi0JCSk7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENvbm5lY3Rpb25Db25maWcgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBsYXRmb3JtTmFtZTsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBkcml2ZXJDbGFzc05hbWU7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZGF0YWJhc2VVUkw7Ci0JCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgdXNlcjsKLQkJcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKLQkJcHJvdGVjdGVkIENvbm5lY3Rpb25Db25maWcoCi0JCQkJU3RyaW5nIHBsYXRmb3JtTmFtZSwKLQkJCQlTdHJpbmcgZHJpdmVyQ2xhc3NOYW1lLAotCQkJCVN0cmluZyBkYXRhYmFzZVVSTCwKLQkJCQlTdHJpbmcgdXNlciwKLQkJCQlTdHJpbmcgcGFzc3dvcmQKLQkJKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5wbGF0Zm9ybU5hbWUgPSBwbGF0Zm9ybU5hbWU7Ci0JCQl0aGlzLmRyaXZlckNsYXNzTmFtZSA9IGRyaXZlckNsYXNzTmFtZTsKLQkJCXRoaXMuZGF0YWJhc2VVUkwgPSBkYXRhYmFzZVVSTDsKLQkJCXRoaXMudXNlciA9IHVzZXI7Ci0JCQl0aGlzLnBhc3N3b3JkID0gcGFzc3dvcmQ7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pEQkNUb29scy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmOGQ4NzkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSkRCQ1Rvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnNxbC5Db25uZWN0aW9uOwotaW1wb3J0IGphdmEuc3FsLlJlc3VsdFNldDsKLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zcWwuU3RhdGVtZW50OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLlJlc3VsdFNldEl0ZXJhdG9yOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKREJDVG9vbHMgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXAoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJZHVtcChleGVjdXRlKGNvbm5lY3Rpb24sIHNxbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJZHVtcE9uKHJlc3VsdFNldCwgcHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGR1bXBPbihSZXN1bHRTZXQgcmVzdWx0U2V0LCBQcmludFdyaXRlciBwdykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gbWFwcyA9IGNvbnZlcnRUb01hcHMocmVzdWx0U2V0KTsKLQkJZm9yIChJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gbWFwU3RyZWFtID0gbWFwcy5pdGVyYXRvcigpOyBtYXBTdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCWZvciAoSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgT2JqZWN0Pj4gZW50cnlTdHJlYW0gPSBtYXBTdHJlYW0ubmV4dCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgZW50cnlTdHJlYW0uaGFzTmV4dCgpOyApIHsKLQkJCQlNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5ID0gZW50cnlTdHJlYW0ubmV4dCgpOwotCQkJCXB3LnByaW50KGVudHJ5LmdldEtleSgpKTsKLQkJCQlwdy5wcmludCgiID0gIik7Ci0JCQkJcHcucHJpbnQoZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQkJcHcucHJpbnRsbigpOwotCQkJfQotCQkJaWYgKG1hcFN0cmVhbS5oYXNOZXh0KCkpIHsKLQkJCQlwdy5wcmludGxuKCk7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnRsbigidG90YWwgcm93czogIiArIG1hcHMuc2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gY29udmVydFRvTWFwcyhDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gY29udmVydFRvTWFwcyhleGVjdXRlKGNvbm5lY3Rpb24sIHNxbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzdWx0U2V0IGV4ZWN1dGUoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgc3FsKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RhdGVtZW50IHN0YXRlbWVudCA9IGNvbm5lY3Rpb24uY3JlYXRlU3RhdGVtZW50KCk7Ci0JCXN0YXRlbWVudC5leGVjdXRlKHNxbCk7Ci0JCVJlc3VsdFNldCByZXN1bHRTZXQgPSBzdGF0ZW1lbnQuZ2V0UmVzdWx0U2V0KCk7Ci0JCXN0YXRlbWVudC5jbG9zZSgpOwotCQlyZXR1cm4gcmVzdWx0U2V0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBjb252ZXJ0VG9NYXBzKFJlc3VsdFNldCByZXN1bHRTZXQpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PigpOwotCQlmb3IgKEl0ZXJhdG9yPEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBzdHJlYW0gPSBidWlsZE1hcEl0ZXJhdG9yKHJlc3VsdFNldCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJcm93cy5hZGQoc3RyZWFtLm5leHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJvd3M7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gYnVpbGRNYXBJdGVyYXRvcihSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBSZXN1bHRTZXRJdGVyYXRvcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4ocmVzdWx0U2V0LCBuZXcgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKGJ1aWxkQ29sdW1uTmFtZXMocmVzdWx0U2V0KSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gYnVpbGRDb2x1bW5OYW1lcyhSZXN1bHRTZXQgcmVzdWx0U2V0KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJU3RyaW5nW10gbmFtZXMgPSBuZXcgU3RyaW5nW3Jlc3VsdFNldC5nZXRNZXRhRGF0YSgpLmdldENvbHVtbkNvdW50KCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQluYW1lc1tpXSA9IHJlc3VsdFNldC5nZXRNZXRhRGF0YSgpLmdldENvbHVtbk5hbWUoaSArIDEpOyAgLy8gTkI6IFJlc3VsdFNldCBpbmRleC9zdWJzY3JpcHQgaXMgMS1iYXNlZAotCQl9Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlciBpbXBsZW1lbnRzIFJlc3VsdFNldEl0ZXJhdG9yLkFkYXB0ZXI8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBjb2x1bW5OYW1lczsKLQkJcHVibGljIE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihTdHJpbmdbXSBjb2x1bW5OYW1lcykgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uTmFtZXMgPSBjb2x1bW5OYW1lczsKLQkJfQotCQlwdWJsaWMgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGROZXh0KFJlc3VsdFNldCBycykgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCQlIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4odGhpcy5jb2x1bW5OYW1lcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLmNvbHVtbk5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJbWFwLnB1dCh0aGlzLmNvbHVtbk5hbWVzW2ldLCBycy5nZXRPYmplY3QoaSArIDEpKTsgIC8vIE5COiBSZXN1bHRTZXQgaW5kZXgvc3Vic2NyaXB0IGlzIDEtYmFzZWQKLQkJCX0KLQkJCXJldHVybiBtYXA7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM3YjhjMi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFEYlRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zLkFsbFBsYXRmb3JtVGVzdHM7Ci0KLS8qKgotICogIEpQVCBEQiBUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgSnB0SnBhRGJUZXN0cyB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhRGJUZXN0cy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKLSAgICAKLSAgICAgICAgc3VpdGUuYWRkVGVzdCggQWxsUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLSAgICAKLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEpwdEpwYURiVGVzdHMoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRGJUZXN0c1BsdWdpbi5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRGJUZXN0c1BsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDI4MzJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL0pwdEpwYURiVGVzdHNQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogIEpwdEpwYURiVGVzdHNQbHVnaW4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYURiVGVzdHNQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEpwdEpwYURiVGVzdHNQbHVnaW4gSU5TVEFOQ0U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSnB0SnBhRGJUZXN0c1BsdWdpbiBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IKLQkgKi8KLQlwdWJsaWMgSnB0SnBhRGJUZXN0c1BsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJSU5TVEFOQ0UgPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwbHVnLWluIGlzIHN0b3BwZWQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlOU1RBTkNFID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0FsbFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyZTk1NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvQWxsUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBBbGxQbGF0Zm9ybVRlc3RzIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEZXJieVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE15U1FMVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlMTBnVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGUxMGdYRVRlc3RzLmNsYXNzKTsKLS8vCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT3JhY2xlOWlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQb3N0Z3JlU1FMVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShTUUxTZXJ2ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTeWJhc2VUZXN0cy5jbGFzcyk7Ci0KLSAgICAgICAgcmV0dXJuIHN1aXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgQWxsUGxhdGZvcm1UZXN0cygpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RUUFBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNiN2I2MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRFRQUGxhdGZvcm1UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc3FsLkNvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS5zcWwuRGF0YWJhc2VNZXRhRGF0YTsKLWltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7Ci1pbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0TWV0YURhdGE7Ci1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuc3FsLlN0YXRlbWVudDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5JQ29ubmVjdGlvblByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5Qcm9maWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuSURyaXZlck1nbXRDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5kcml2ZXJzLklQcm9wZXJ0eVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuUHJvcGVydHlTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZHJpdmVycy5YTUxGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5pbnRlcm5hbC5Db25uZWN0aXZpdHlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LkluZGVudGluZ1ByaW50V3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlJlZmxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5SZXN1bHRTZXRJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db25uZWN0aW9uUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbm5lY3Rpb25Qcm9maWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5EYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkRhdGFiYXNlSWRlbnRpZmllckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuSnB0SnBhRGJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWFDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwuSnB0SnBhRGJUZXN0c1BsdWdpbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciB0ZXN0aW5nIERUUCB3cmFwcGVycyBvbiB2YXJpb3VzIGRhdGFiYXNlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRQUGxhdGZvcm1UZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRoZSBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGFyZSBsb2FkZWQgZnJvbSBhIEphdmEgcHJvcGVydGllcyBmaWxlIGluIHRoZQotCSAqICdvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL2NvbmZpZycgZGlyZWN0b3J5LiBFYWNoIGRhdGFiYXNlIHBsYXRmb3JtIGhhcwotCSAqIGl0cyBvd24gcHJvcGVydGllcyBmaWxlIChlLmcuICdkZXJieS5wcm9wZXJ0aWVzJykuCi0JICovCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIHBsYXRmb3JtUHJvcGVydGllczsKLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIERhbGkgY29ubmVjdGlvbiBwcm9maWxlIHdyYXBwZXIuCi0JICovCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGNvbm5lY3Rpb25Qcm9maWxlOwotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0YW50cyAqKioqKioqKioqCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fQ09ORklHX0RJUkVDVE9SWSA9ICJjb25maWciOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfUFJPUEVSVFkgPSAidXNlcklEIjsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VTRVJfSURfREVGQVVMVCA9ICJ1c2VyIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9QUk9QRVJUWSA9ICJwYXNzd29yZCI7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEQl9QQVNTV09SRF9ERUZBVUxUID0gIiI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREJfRFJJVkVSX0pBUlNfUFJPUEVSVFkgPSAiamFycyI7Ci0JCS8vIHJlcXVpcmVkIC0gbm8gZGVmYXVsdAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERCX1VSTF9QUk9QRVJUWSA9ICJ1cmwiOwotCQkvLyByZXF1aXJlZCAtIG5vIGRlZmF1bHQKLQotCi0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9yICoqKioqKioqKioKLQotCXByb3RlY3RlZCBEVFBQbGF0Zm9ybVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBzZXQtdXAvdGVhci1kb3duICoqKioqKioqKioKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0KLQkJdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMgPSB0aGlzLmxvYWRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQkJdGhpcy5idWlsZERUUERyaXZlckRlZmluaXRpb25GaWxlKCk7Ci0JCXRoaXMuYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZSgpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlID0gdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5idWlsZENvbm5lY3Rpb25Qcm9maWxlKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSwgRGF0YWJhc2VJZGVudGlmaWVyQWRhcHRlci5EZWZhdWx0Lmluc3RhbmNlKCkpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUgPSBudWxsOwotCQl0aGlzLnBsYXRmb3JtUHJvcGVydGllcyA9IG51bGw7Ci0KLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQkvLyAqKioqKiBwbGF0Zm9ybSBwcm9wZXJ0aWVzIGZpbGUKLQlwcml2YXRlIFByb3BlcnRpZXMgbG9hZFBsYXRmb3JtUHJvcGVydGllcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXAubG9hZCh0aGlzLmJ1aWxkUGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVVSTCgpLm9wZW5TdHJlYW0oKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgVVJMIGJ1aWxkUGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZVVSTCgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEJ1bmRsZSh0aGlzLmdldFRlc3RQbHVnaW5CdW5kbGVJRCgpKS5nZXRFbnRyeSh0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRlc3RQbHVnaW5CdW5kbGVJRCgpIHsKLQkJcmV0dXJuIEpwdEpwYURiVGVzdHNQbHVnaW4uQlVORExFX0lEOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVQYXRoKCkgewotCQlyZXR1cm4gdGhpcy5nZXRQbGF0Zm9ybVByb3BlcnRpZXNEaXJlY3RvcnlOYW1lKCkgKyAnLycgKyB0aGlzLmdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRGlyZWN0b3J5TmFtZSgpIHsKLQkJcmV0dXJuIFBMQVRGT1JNX0NPTkZJR19ESVJFQ1RPUlk7Ci0JfQotCi0JLyoqCi0JICogRWFjaCBkYXRhYmFzZSBwbGF0Zm9ybSBoYXMgYSBzZXBhcmF0ZSBwcm9wZXJ0aWVzIGZpbGUgaW4gdGhlICdjb25maWcnCi0JICogZGlyZWN0b3J5IHRoYXQgbXVzdCBiZSBjdXN0b21pemVkIGJ5IHdob21ldmVyIGlzIGV4ZWN1dGluZyB0aGUgdGVzdHMuCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpOwotCi0JLy8gKioqKiogZHJpdmVyIGRlZmluaXRpb24gZmlsZQotCXByaXZhdGUgdm9pZCBidWlsZERUUERyaXZlckRlZmluaXRpb25GaWxlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlYTUxGaWxlTWFuYWdlci5zZXRTdG9yYWdlTG9jYXRpb24odGhpcy5nZXREVFBEcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSk7Ci0JCVhNTEZpbGVNYW5hZ2VyLnNldEZpbGVOYW1lKHRoaXMuZ2V0RFRQRHJpdmVyRmlsZU5hbWUoKSk7Ci0KLQkJSVByb3BlcnR5U2V0W10gc2V0cyA9IFhNTEZpbGVNYW5hZ2VyLmxvYWRQcm9wZXJ0eVNldHMoKTsKLQkJZm9yIChJUHJvcGVydHlTZXQgc2V0IDogc2V0cykgewotCQkJaWYgKHNldC5nZXRJRCgpLmVxdWFscyh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKSkgewotCQkJCXJldHVybjsgIC8vIHByb3BlcnR5IHNldHMgbGl2ZSBhY3Jvc3MgdGVzdHMKLQkJCX0KLQkJfQotCi0JCVhNTEZpbGVNYW5hZ2VyLnNhdmVOYW1lZFByb3BlcnR5U2V0KHRoaXMuYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydHlTZXRzKCkpOwotCi0JCS8vIHZlcmlmeSB0aGUgZmlsZSB3YXMgY3JlYXRlZDoKLQkJRmlsZSBkcml2ZXJEZWZpbml0aW9uZUZpbGUgPSB0aGlzLmdldERUUERyaXZlckRlZmluaXRpb25Mb2NhdGlvbigpLmFwcGVuZCh0aGlzLmdldERUUERyaXZlckZpbGVOYW1lKCkpLnRvRmlsZSgpOwotCQlhc3NlcnRUcnVlKGRyaXZlckRlZmluaXRpb25lRmlsZS5leGlzdHMoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBnZXREVFBEcml2ZXJEZWZpbml0aW9uTG9jYXRpb24oKSB7Ci0JCXJldHVybiBDb25uZWN0aXZpdHlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXREVFBEcml2ZXJGaWxlTmFtZSgpIHsKLQkJcmV0dXJuIElEcml2ZXJNZ210Q29uc3RhbnRzLkRSSVZFUl9GSUxFOwotCX0KLQotCXByaXZhdGUgSVByb3BlcnR5U2V0W10gYnVpbGREVFBEcml2ZXJEZWZpbml0aW9uUHJvcGVydHlTZXRzKCkgewotCQlJUHJvcGVydHlTZXRbXSBwcm9wZXJ0eVNldHMgPSBuZXcgSVByb3BlcnR5U2V0WzFdOwotCQlQcm9wZXJ0eVNldEltcGwgcHJvcGVydHlTZXQgPSBuZXcgUHJvcGVydHlTZXRJbXBsKHRoaXMuZ2V0RHJpdmVyTmFtZSgpLCB0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKTsKLQkJcHJvcGVydHlTZXQuc2V0UHJvcGVydGllcyh0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpLCB0aGlzLmJ1aWxkRFRQRHJpdmVyRGVmaW5pdGlvblByb3BlcnRpZXMoKSk7Ci0JCXByb3BlcnR5U2V0c1swXSA9IHByb3BlcnR5U2V0OwotCQlyZXR1cm4gcHJvcGVydHlTZXRzOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKTsKLQotCXByaXZhdGUgUHJvcGVydGllcyBidWlsZERUUERyaXZlckRlZmluaXRpb25Qcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLnNldFByb3BlcnR5KENvbm5lY3Rpb25Qcm9maWxlLkRSSVZFUl9ERUZJTklUSU9OX1RZUEVfUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpKTsKLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfSkFSX0xJU1RfUFJPUF9JRCwgdGhpcy5nZXRKREJDRHJpdmVySmFyTGlzdCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRSSVZFUl9DTEFTU19QUk9QX0lELCB0aGlzLmdldERyaXZlckNsYXNzKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VUkxfUFJPUF9JRCwgdGhpcy5nZXRKREJDVVJMKCkpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLmdldFVzZXJJRCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy5nZXRQYXNzd29yZCgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpOwotCi0JLyoqCi0JICogVGhlIEpBUiBsaXN0IGlzIHdvcmtzcGFjZS1zcGVjaWZpYyBhbmQgaXMgc2V0IGluIHRoZSBwcm9wZXJ0aWVzIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SkRCQ0RyaXZlckphckxpc3QoKSB7Ci0JCXJldHVybiB0aGlzLmdldFJlcXVpcmVkUGxhdGZvcm1Qcm9wZXJ0eShEQl9EUklWRVJfSkFSU19QUk9QRVJUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKTsKLQotCS8qKgotCSAqIFRoZSBkYXRhYmFzZSBVUkwgaXMgd29ya3NwYWNlLXNwZWNpZmljIGFuZCBpcyBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZQotCSAqIGZvciBzb21lIGRhdGFiYXNlcy4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRKREJDVVJMKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfVVJMX1BST1BFUlRZLCB0aGlzLmdldERlZmF1bHRKREJDVVJMKCkpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVmYXVsdEpEQkNVUkwoKSB7Ci0JCXJldHVybiAiIjsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdXNlciBJRCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHNldCBpbiB0aGUgcHJvcGVydGllcyBmaWxlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VXNlcklEKCkgewotCQlyZXR1cm4gdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMuZ2V0UHJvcGVydHkoREJfVVNFUl9JRF9QUk9QRVJUWSwgREJfVVNFUl9JRF9ERUZBVUxUKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFzc3dvcmQgaXMgb3B0aW9uYWwgYW5kIGNhbiBiZSBzZXQgaW4gdGhlIHByb3BlcnRpZXMgZmlsZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXNzd29yZCgpIHsKLQkJcmV0dXJuIHRoaXMucGxhdGZvcm1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KERCX1BBU1NXT1JEX1BST1BFUlRZLCBEQl9QQVNTV09SRF9ERUZBVUxUKTsKLQl9Ci0KLQkvLyAqKioqKiBEVFAgY29ubmVjdGlvbiBwcm9maWxlCi0JcHJpdmF0ZSB2b2lkIGJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGUoKSB0aHJvd3MgQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUodGhpcy5nZXRQcm9maWxlTmFtZSgpKSAhPSBudWxsKSB7Ci0JCQlyZXR1cm47ICAvLyBwcm9maWxlcyBsaXZlIGFjcm9zcyB0ZXN0cwotCQl9Ci0JCXRoaXMuY3JlYXRlUHJvZmlsZSh0aGlzLmdldFByb2ZpbGVOYW1lKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5nZXRQcm9maWxlQnlOYW1lKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVByb2ZpbGUoU3RyaW5nIHByb2ZpbGVOYW1lKSB0aHJvd3MgQ29ubmVjdGlvblByb2ZpbGVFeGNlcHRpb24gewotCQl0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkuY3JlYXRlUHJvZmlsZSgKLQkJCQlwcm9maWxlTmFtZSwKLQkJCQl0aGlzLmdldFByb2ZpbGVEZXNjcmlwdGlvbigpLAotCQkJCXRoaXMuZ2V0UHJvdmlkZXJJRCgpLAotCQkJCXRoaXMuYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKQotCQkpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVySUQoKSB7Ci0JCXJldHVybiBDb25uZWN0aW9uUHJvZmlsZS5DT05ORUNUSU9OX1BST0ZJTEVfVFlQRTsKLQl9Ci0JIAotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIGJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5VU0VSTkFNRV9QUk9QX0lELCB0aGlzLmdldFVzZXJJRCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuUEFTU1dPUkRfUFJPUF9JRCwgdGhpcy5nZXRQYXNzd29yZCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EUklWRVJfREVGSU5JVElPTl9QUk9QX0lELCB0aGlzLmdldERyaXZlckRlZmluaXRpb25JRCgpKTsKLQotCQlwLnNldFByb3BlcnR5KElKREJDRHJpdmVyRGVmaW5pdGlvbkNvbnN0YW50cy5EUklWRVJfQ0xBU1NfUFJPUF9JRCwgdGhpcy5nZXREcml2ZXJDbGFzcygpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuVVJMX1BST1BfSUQsIHRoaXMuZ2V0SkRCQ1VSTCgpKTsKLQkJcC5zZXRQcm9wZXJ0eShJSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHMuREFUQUJBU0VfVkVORE9SX1BST1BfSUQsIHRoaXMuZ2V0RGF0YWJhc2VWZW5kb3IoKSk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX1ZFUlNJT05fUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZVZlcnNpb24oKSk7Ci0KLQkJcC5zZXRQcm9wZXJ0eShDb25uZWN0aW9uUHJvZmlsZS5EQVRBQkFTRV9TQVZFX1BXRF9QUk9QX0lELCB0aGlzLnBhc3N3b3JkSXNTYXZlZCgpKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcGFzc3dvcmRJc1NhdmVkKCkgewotCQlyZXR1cm4gInRydWUiOwotCX0KLQotCi0JLy8gKioqKioqKioqKiB0ZXN0cyAqKioqKioqKioqCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcigpIHRocm93cyBDb25uZWN0aW9uUHJvZmlsZUV4Y2VwdGlvbiB7Ci0JCVRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYWRkQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJU3RyaW5nIGNwTmFtZTEgPSB0aGlzLmdldFByb2ZpbGVOYW1lKCkgKyAiMSI7Ci0JCXRoaXMuY3JlYXRlUHJvZmlsZShjcE5hbWUxKTsKLQkJSUNvbm5lY3Rpb25Qcm9maWxlIGR0cENQID0gdGhpcy5nZXREVFBQcm9maWxlTWFuYWdlcigpLmdldFByb2ZpbGVCeU5hbWUoY3BOYW1lMSk7Ci0JCWFzc2VydE5vdE51bGwoZHRwQ1ApOwotCi0JCWFzc2VydEVxdWFscyhjcE5hbWUxLCBsaXN0ZW5lci5hZGRlZE5hbWUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCVN0cmluZyBjcE5hbWUyID0gdGhpcy5nZXRQcm9maWxlTmFtZSgpICsgIjIiOwotCQl0aGlzLmdldERUUFByb2ZpbGVNYW5hZ2VyKCkubW9kaWZ5UHJvZmlsZShkdHBDUCwgY3BOYW1lMiwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhjcE5hbWUxLCBsaXN0ZW5lci5yZW5hbWVkT2xkTmFtZSk7Ci0JCWFzc2VydEVxdWFscyhjcE5hbWUyLCBsaXN0ZW5lci5yZW5hbWVkTmV3TmFtZSk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJQ29ubmVjdGlvblByb2ZpbGUgY3AgPSB0aGlzLmdldENvbm5lY3Rpb25Qcm9maWxlRmFjdG9yeSgpLmJ1aWxkQ29ubmVjdGlvblByb2ZpbGUoY3BOYW1lMik7Ci0JCWFzc2VydE5vdE51bGwoY3ApOwotCi0JCXRoaXMuZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKS5kZWxldGVQcm9maWxlKGR0cENQKTsKLQkJYXNzZXJ0RXF1YWxzKGNwTmFtZTIsIGxpc3RlbmVyLnJlbW92ZWROYW1lKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQljcCA9IHRoaXMuZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkuYnVpbGRDb25uZWN0aW9uUHJvZmlsZShjcE5hbWUyKTsKLQkJYXNzZXJ0TnVsbChjcCk7Ci0KLQkJdGhpcy5nZXRDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkoKS5yZW1vdmVDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmFtZSgpIHsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0UHJvZmlsZU5hbWUoKSwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNBY3RpdmUoKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0Nvbm5lY3RlZCgpKTsKLQotCQl0aGlzLnZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpOwotCQl0aGlzLnZlcmlmeURhdGFiYXNlVmVuZG9yKCk7Ci0JCXRoaXMudmVyaWZ5RGF0YWJhc2VDb250ZW50KCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlVmVyc2lvbk51bWJlcigpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCWFzc2VydE5vdE51bGwoZGF0YWJhc2UpOwotCi0JCVN0cmluZyBhY3R1YWwgPSBkYXRhYmFzZS5nZXRWZXJzaW9uKCk7Ci0JCVN0cmluZyBleHBlY3RlZCA9IHRoaXMuZ2V0RGF0YWJhc2VWZXJzaW9uKCk7Ci0JCVN0cmluZyBlcnJvck1lc3NhZ2UgPSAiZXhwZWN0ZWQ6ICIgKyBleHBlY3RlZCArICIgLSBhY3R1YWw6ICIgKyBhY3R1YWw7Ci0JCS8vIHBhcnRpYWwgbWF0Y2ggaXMgZ29vZCBlbm91Z2gKLQkJYXNzZXJ0VHJ1ZShlcnJvck1lc3NhZ2UsIGFjdHVhbC5pbmRleE9mKGV4cGVjdGVkKSAhPSAtMSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlVmVuZG9yKCkgewotCQlEYXRhYmFzZSBkYXRhYmFzZSA9IHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKTsKLQkJU3RyaW5nIGFjdHVhbCA9IGRhdGFiYXNlLmdldFZlbmRvck5hbWUoKTsKLQkJU3RyaW5nIGV4cGVjdGVkID0gdGhpcy5nZXREYXRhYmFzZVZlbmRvcigpOwotCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeURhdGFiYXNlQ29udGVudCgpIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCWFzc2VydFRydWUoZGF0YWJhc2UuZ2V0U2NoZW1hdGFTaXplKCkgPj0gMCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IGRhdGFiYXNlLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0JCQlpZiAoc2NoZW1hLmdldFRhYmxlc1NpemUoKSA+IDApIHsKLQkJCQlUYWJsZSB0YWJsZSA9IHNjaGVtYS5nZXRUYWJsZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmdldENvbHVtbnNTaXplKCkgPj0gMCk7Ci0JCQkJYXNzZXJ0VHJ1ZSh0YWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSA+PSAwKTsKLQkJCQlhc3NlcnRUcnVlKHRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpID49IDApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpOwotCi0JcHVibGljIGZpbmFsIHZvaWQgdGVzdE9mZmxpbmUoKSB7Ci0JCWlmICggISB0aGlzLmV4ZWN1dGVPZmZsaW5lVGVzdHMoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnN1cHBvcnRzV29ya09mZmxpbmVNb2RlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLndvcmtPZmZsaW5lKCk7Ci0JCWFzc2VydFRydWUoc3RhdHVzLmlzT0soKSk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0FjdGl2ZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmlzV29ya2luZ09mZmxpbmUoKSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5pc0luYWN0aXZlKCkpOwotCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuaXNEaXNjb25uZWN0ZWQoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZUZvck9mZmxpbmVXb3JrKCkgewotCQlpZiAoICEgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jYW5Xb3JrT2ZmbGluZSgpKSB7Ci0JCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5zYXZlV29ya09mZmxpbmVEYXRhKCk7Ci0JCQlhc3NlcnRUcnVlKHN0YXR1cy5pc09LKCkpOwotCQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JCQlhc3NlcnRUcnVlKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuY2FuV29ya09mZmxpbmUoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyQ29ubmVjdCgpIHsKLQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc0FueUxpc3RlbmVycygpKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5vcGVuZWRQcm9maWxlKTsKLQkJbGlzdGVuZXIuY2xlYXIoKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5va1RvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5hYm91dFRvQ2xvc2VQcm9maWxlKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLCBsaXN0ZW5lci5jbG9zZWRQcm9maWxlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKCkpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJPZmZsaW5lKCkgewotCQlpZiAoICEgdGhpcy5leGVjdXRlT2ZmbGluZVRlc3RzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMucHJlcGFyZUZvck9mZmxpbmVXb3JrKCk7Ci0JCWxpc3RlbmVyLmNsZWFyKCk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS53b3JrT2ZmbGluZSgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9wZW5lZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLm9rVG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmFib3V0VG9DbG9zZVByb2ZpbGUpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUsIGxpc3RlbmVyLmNsb3NlZFByb2ZpbGUpOwotCQlsaXN0ZW5lci5jbGVhcigpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyRGF0YWJhc2UoKSB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uTGlzdGVuZXJDYXRhbG9nKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJaWYgKCAhIHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0RGF0YWJhc2UoKS5zdXBwb3J0c0NhdGFsb2dzKCkpIHsKLQkJCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCQkKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyB0YWtlIHRoZSBmaXJzdCBjYXRhbG9nCi0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGR0cENhdGFsb2cgPSB0aGlzLmdldEZpcnN0RFRQQ2F0YWxvZygpOwotCQlDYXRhbG9nIGNhdGFsb2cgPSB0aGlzLmdldENhdGFsb2dOYW1lZChkdHBDYXRhbG9nLmdldE5hbWUoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cENhdGFsb2cpLnJlZnJlc2goKTsKLQkJYXNzZXJ0U2FtZShjYXRhbG9nLCBsaXN0ZW5lci5jaGFuZ2VkQ2F0YWxvZyk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkxpc3RlbmVyU2NoZW1hKCkgewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQlMaXN0PG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nPiBkdHBDYXRhbG9ncyA9IHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKTsKLQkJb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cgZHRwQ2F0YWxvZyA9IG51bGw7Ci0JCW9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZHRwU2NoZW1hID0gbnVsbDsKLQkJU2NoZW1hIHNjaGVtYSA9IG51bGw7Ci0JCWlmICh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKSB7Ci0JCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOwotCQkJZHRwU2NoZW1hID0gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIGR0cENhdGFsb2cuZ2V0U2NoZW1hcygpLmdldCgwKTsKLQkJCXNjaGVtYSA9IHRoaXMuZ2V0Q2F0YWxvZ05hbWVkKGR0cENhdGFsb2cuZ2V0TmFtZSgpKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChkdHBDYXRhbG9ncy5pc0VtcHR5KCkpIHsKLQkJCQlkdHBTY2hlbWEgPSAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSkgdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJc2NoZW1hID0gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKGR0cFNjaGVtYS5nZXROYW1lKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlkdHBDYXRhbG9nID0gZHRwQ2F0YWxvZ3MuZ2V0KDApOyAgLy8gc2hvdWxkIGJlIHRoZSAidmlydHVhbCIgY2F0YWxvZwotCQkJCWFzc2VydEVxdWFscygiIiwgZHRwQ2F0YWxvZy5nZXROYW1lKCkpOwotCQkJCWR0cFNjaGVtYSA9IChvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuU2NoZW1hKSBkdHBDYXRhbG9nLmdldFNjaGVtYXMoKS5nZXQoMCk7Ci0JCQkJLy8gdGhlIHNjaGVtYXRhIGFyZSBoZWxkIGRpcmVjdGx5IGJ5IHRoZSBkYXRhYmFzZSBpbiB0aGlzIHNpdHVhdGlvbgotCQkJCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZChkdHBTY2hlbWEuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKHNjaGVtYS5nZXRUYWJsZXNTaXplKCkgPj0gMCk7ICAvLyBmb3JjZSB0YWJsZXMgdG8gYmUgbG9hZGVkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGR0cFNjaGVtYSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgbGlzdGVuZXIuY2hhbmdlZFNjaGVtYSk7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3VwcG9ydHNDYXRhbG9ncygpIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzID0gdGhpcy5zdXBwb3J0c0NhdGFsb2dzKCk7Ci0JCWFzc2VydEVxdWFscyhzdXBwb3J0c0NhdGFsb2dzLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuc3VwcG9ydHNDYXRhbG9ncygpKTsKLQkJaWYgKHN1cHBvcnRzQ2F0YWxvZ3MpIHsKLQkJCWFzc2VydFRydWUodGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dzU2l6ZSgpID4gMCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXREYXRhYmFzZSgpLmdldFNjaGVtYXRhU2l6ZSgpKTsKLQkJfSBlbHNlIHsKLQkJCWFzc2VydEVxdWFscygwLCB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ3NTaXplKCkpOwotCQkJYXNzZXJ0VHJ1ZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hdGFTaXplKCkgPiAwKTsKLQkJfQotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHNDYXRhbG9ncygpOwotCi0vLwlwdWJsaWMgdm9pZCB0ZXN0REVCVUcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3MoKTsKLS8vCQl0aGlzLmR1bXBKREJDU2NoZW1hdGEoKTsKLS8vCQl0aGlzLmR1bXBEYXRhYmFzZUNvbnRhaW5lcnMoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLQotCi0JLy8gKioqKioqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioqKioKLQotCXByb3RlY3RlZCBDb25uZWN0aW9uUHJvZmlsZUZhY3RvcnkgZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCkgewotCQlyZXR1cm4gSnB0SnBhRGJQbHVnaW4uZ2V0Q29ubmVjdGlvblByb2ZpbGVGYWN0b3J5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbm5lY3Rpb25Qcm9maWxlIGdldENvbm5lY3Rpb25Qcm9maWxlKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRGF0YWJhc2UgZ2V0RGF0YWJhc2UoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENhdGFsb2cgZ2V0RGVmYXVsdENhdGFsb2coKSB7Ci0JCXJldHVybiB0aGlzLmdldERhdGFiYXNlKCkuZ2V0RGVmYXVsdENhdGFsb2coKTsKLQl9Ci0KLQkvKioKLQkgKiBvbmx5IHZhbGlkIG9uIGRhdGFiYXNlcyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNhdGFsb2dzCi0JICovCi0JcHJvdGVjdGVkIFNjaGVtYSBnZXREZWZhdWx0U2NoZW1hKCkgewotCQlyZXR1cm4gdGhpcy5nZXREYXRhYmFzZSgpLmdldERlZmF1bHRTY2hlbWEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZyBnZXRDYXRhbG9nTmFtZWQoU3RyaW5nIGNhdGFsb2dOYW1lKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKGNhdGFsb2dOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkUGxhdGZvcm1Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlLZXkpIHsKLQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSB0aGlzLnBsYXRmb3JtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHByb3BlcnR5VmFsdWUpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YWJhc2UgcGxhdGZvcm0gcHJvcGVydGllcyBmaWxlICciICsgdGhpcy5nZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlUGF0aCgpCi0JCQkJCSsgIicgaXMgbWlzc2luZyBhIHZhbHVlIGZvciB0aGUgcHJvcGVydHkgJyIgKyBwcm9wZXJ0eUtleSArICInLiIpOwotCQl9Ci0JCXJldHVybiBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzQW55TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gY29ubmVjdGlvblByb2ZpbGVIYXNBbnlMaXN0ZW5lcnModGhpcy5jb25uZWN0aW9uUHJvZmlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzQW55TGlzdGVuZXJzKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGNwLCAiaGFzQW55TGlzdGVuZXJzIikpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbm5lY3Rpb25Qcm9maWxlSGFzTm9MaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBjb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKHRoaXMuY29ubmVjdGlvblByb2ZpbGUpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBjb25uZWN0aW9uUHJvZmlsZUhhc05vTGlzdGVuZXJzKENvbm5lY3Rpb25Qcm9maWxlIGNwKSB7Ci0JCXJldHVybiAoKEJvb2xlYW4pIFJlZmxlY3Rpb25Ub29scy5leGVjdXRlTWV0aG9kKGNwLCAiaGFzTm9MaXN0ZW5lcnMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIERUUCBtb2RlbCAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgUHJvZmlsZU1hbmFnZXIgZ2V0RFRQUHJvZmlsZU1hbmFnZXIoKSB7Ci0JCXJldHVybiBQcm9maWxlTWFuYWdlci5nZXRJbnN0YW5jZSgpOwotCX0KLQotCXByb3RlY3RlZCBJQ29ubmVjdGlvblByb2ZpbGUgZ2V0RFRQQ29ubmVjdGlvblByb2ZpbGUoKSB7Ci0JCXJldHVybiBnZXREVFBDb25uZWN0aW9uUHJvZmlsZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIElDb25uZWN0aW9uUHJvZmlsZSBnZXREVFBDb25uZWN0aW9uUHJvZmlsZShDb25uZWN0aW9uUHJvZmlsZSBjcCkgewotCQlyZXR1cm4gKElDb25uZWN0aW9uUHJvZmlsZSkgUmVmbGVjdGlvblRvb2xzLmdldEZpZWxkVmFsdWUoY3AsICJkdHBDb25uZWN0aW9uUHJvZmlsZSIpOwotCX0KLQotCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLnNxbC5zY2hlbWEuRGF0YWJhc2UgZ2V0RFRQRGF0YWJhc2UoKSB7Ci0JCXJldHVybiBnZXREVFBEYXRhYmFzZSh0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlIGdldERUUERhdGFiYXNlKERhdGFiYXNlIGRhdGFiYXNlKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkRhdGFiYXNlKSBSZWZsZWN0aW9uVG9vbHMuZ2V0RmllbGRWYWx1ZShkYXRhYmFzZSwgImR0cERhdGFiYXNlIik7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIExpc3Q8b3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2c+IGdldERUUENhdGFsb2dzKCkgewotCQlyZXR1cm4gdGhpcy5nZXREVFBEYXRhYmFzZSgpLmdldENhdGFsb2dzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldEZpcnN0RFRQQ2F0YWxvZygpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0RFRQQ2F0YWxvZ3MoKS5nZXQoMCk7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2dOYW1lZChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0RFRQQ2F0YWxvZyh0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKG5hbWUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5DYXRhbG9nIGdldERUUENhdGFsb2coQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCXJldHVybiAob3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLkNhdGFsb2cpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKGNhdGFsb2csICJkdHBDYXRhbG9nIik7Ci0JfQotCi0JcHJvdGVjdGVkIG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEgZ2V0RFRQU2NoZW1hTmFtZWQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGdldERUUFNjaGVtYSh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQobmFtZSkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLm1vZGVsYmFzZS5zcWwuc2NoZW1hLlNjaGVtYSBnZXREVFBTY2hlbWEoU2NoZW1hIHNjaGVtYSkgewotCQlyZXR1cm4gKG9yZy5lY2xpcHNlLmRhdGF0b29scy5tb2RlbGJhc2Uuc3FsLnNjaGVtYS5TY2hlbWEpIFJlZmxlY3Rpb25Ub29scy5nZXRGaWVsZFZhbHVlKHNjaGVtYSwgImR0cFNjaGVtYSIpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBleGVjdXRlIFNRTCAqKioqKioqKioqCi0KLQkvKioKLQkgKiBpZ25vcmUgYW55IGVycm9ycyAodXNlZnVsIGZvciBkcm9wcGluZyBkYXRhYmFzZSBvYmplY3RzIHRoYXQgbWlnaHQKLQkgKiBub3QgYmUgdGhlcmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycyhTdHJpbmcgc3FsKSB7Ci0JCXRyeSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoc3FsKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0vLwkJCVN5c3RlbS5lcnIucHJpbnRsbigiU1FMOiAiICsgc3FsKTsKLS8vCQkJZXgucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlVXBkYXRlKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlTdGF0ZW1lbnQgamRiY1N0YXRlbWVudCA9IHRoaXMuY3JlYXRlSkRCQ1N0YXRlbWVudCgpOwotCQl0cnkgewotCQkJamRiY1N0YXRlbWVudC5leGVjdXRlVXBkYXRlKHNxbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlqZGJjU3RhdGVtZW50LmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wKFN0cmluZyBzcWwpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQl0aGlzLmR1bXAoc3FsLCAzMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcChTdHJpbmcgc3FsLCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wT24oc3FsLCBwdywgY29sdW1uV2lkdGgpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcE9uKFN0cmluZyBzcWwsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBpbnQgY29sdW1uV2lkdGgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKHNxbCk7Ci0JCWZvciAoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93IDogdGhpcy5leGVjdXRlKHNxbCkpIHsKLQkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBmaWVsZCA6IHJvdy5lbnRyeVNldCgpKSB7Ci0JCQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKFN0cmluZy52YWx1ZU9mKGZpZWxkLmdldEtleSgpKSwgY29sdW1uV2lkdGgvMiwgcHcpOwotCQkJCXB3LnByaW50KCc9Jyk7Ci0JCQkJU3RyaW5nVG9vbHMucGFkT3JUcnVuY2F0ZU9uKFN0cmluZy52YWx1ZU9mKGZpZWxkLmdldFZhbHVlKCkpLCBjb2x1bW5XaWR0aC8yLCBwdyk7Ci0JCQkJcHcucHJpbnQoJyAnKTsKLQkJCX0KLQkJCXB3LnByaW50bG4oKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGV4ZWN1dGUoU3RyaW5nIHNxbCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCVN0YXRlbWVudCBqZGJjU3RhdGVtZW50ID0gdGhpcy5jcmVhdGVKREJDU3RhdGVtZW50KCk7Ci0JCWpkYmNTdGF0ZW1lbnQuZXhlY3V0ZShzcWwpOwotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyhqZGJjU3RhdGVtZW50LmdldFJlc3VsdFNldCgpKTsKLQkJamRiY1N0YXRlbWVudC5jbG9zZSgpOwotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwcm90ZWN0ZWQgQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiBidWlsZFJvd3MoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+KCk7Ci0JCUNvbGxlY3Rpb25Ub29scy5hZGRBbGwocm93cywgdGhpcy5idWlsZFJlc3VsdFNldEl0ZXJhdG9yKHJlc3VsdFNldCkpOwotCQlyZXR1cm4gcm93czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IGJ1aWxkUmVzdWx0U2V0SXRlcmF0b3IoUmVzdWx0U2V0IHJlc3VsdFNldCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgUmVzdWx0U2V0SXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+KHJlc3VsdFNldCwgbmV3IE1hcFJlc3VsdFNldEl0ZXJhdG9yQWRhcHRlcihyZXN1bHRTZXQuZ2V0TWV0YURhdGEoKSkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyCi0JCWltcGxlbWVudHMgUmVzdWx0U2V0SXRlcmF0b3IuQWRhcHRlcjxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4KLQl7Ci0JCXByaXZhdGUgZmluYWwgaW50IGNvbHVtbkNvdW50OwotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIGNvbHVtbk5hbWVzOwotCQlwdWJsaWMgTWFwUmVzdWx0U2V0SXRlcmF0b3JBZGFwdGVyKFJlc3VsdFNldE1ldGFEYXRhIHJzTWV0YURhdGEpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29sdW1uQ291bnQgPSByc01ldGFEYXRhLmdldENvbHVtbkNvdW50KCk7Ci0JCQl0aGlzLmNvbHVtbk5hbWVzID0gbmV3IFN0cmluZ1t0aGlzLmNvbHVtbkNvdW50ICsgMV07ICAvLyBsZWF2ZSB6ZXJvIHNsb3QgZW1wdHkKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IHRoaXMuY29sdW1uQ291bnQ7IGkrKykgeyAgLy8gTkI6IFJlc3VsdFNldCBpbmRleC9zdWJzY3JpcHQgaXMgMS1iYXNlZAotCQkJCXRoaXMuY29sdW1uTmFtZXNbaV0gPSByc01ldGFEYXRhLmdldENvbHVtbk5hbWUoaSk7Ci0JCQl9Ci0JCX0KLQkJcHVibGljIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IGJ1aWxkTmV4dChSZXN1bHRTZXQgcnMpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHRoaXMuY29sdW1uQ291bnQpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gdGhpcy5jb2x1bW5Db3VudDsgaSsrKSB7ICAvLyBOQjogUmVzdWx0U2V0IGluZGV4L3N1YnNjcmlwdCBpcyAxLWJhc2VkCi0JCQkJcm93LnB1dCh0aGlzLmNvbHVtbk5hbWVzW2ldLCBycy5nZXRPYmplY3QoaSkpOwotCQkJfQotCQkJcmV0dXJuIHJvdzsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdGF0ZW1lbnQgY3JlYXRlSkRCQ1N0YXRlbWVudCgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLmNyZWF0ZVN0YXRlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBDb25uZWN0aW9uIGdldEpEQkNDb25uZWN0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5nZXRKREJDQ29ubmVjdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCBEYXRhYmFzZU1ldGFEYXRhIGdldERhdGFiYXNlTWV0YURhdGEoKSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5nZXRNZXRhRGF0YSgpOwotCX0KLQotCi0JLy8gKioqKioqKioqKiBkdW1wIERUUCBtZXRhZGF0YSAqKioqKioqKioqCi0KLQkvKioKLQkgKiBkdW1wIGFsbCB0aGUgZGF0YWJhc2UgbWV0YWRhdGEgdG8gdGhlIGNvbnNvbGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2UoKSB7Ci0JCXRoaXMuZHVtcERhdGFiYXNlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIGR1bXAgdGhlIGRhdGFiYXNlIGNhdGFsb2dzIGFuZCBzY2hlbWF0YSB0byB0aGUgY29uc29sZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZUNvbnRhaW5lcnMoKSB7Ci0JCXRoaXMuZHVtcERhdGFiYXNlKGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wRGF0YWJhc2UoYm9vbGVhbiBkZWVwKSB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBEYXRhYmFzZU9uKHB3LCBkZWVwKTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBEYXRhYmFzZU9uKEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJRGF0YWJhc2UgZGF0YWJhc2UgPSB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldERhdGFiYXNlKCk7Ci0JCXB3LnByaW50KCJkYXRhYmFzZTogIik7Ci0JCXB3LnByaW50bG4oZGF0YWJhc2UuZ2V0TmFtZSgpKTsKLQkJaWYgKGRhdGFiYXNlLnN1cHBvcnRzQ2F0YWxvZ3MoKSkgewotCQkJZm9yIChDYXRhbG9nIGNhdGFsb2cgOiBkYXRhYmFzZS5nZXRDYXRhbG9ncygpKSB7Ci0JCQkJdGhpcy5kdW1wQ2F0YWxvZ09uKGNhdGFsb2csIHB3LCBkZWVwKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRoaXMuZHVtcFNjaGVtYUNvbnRhaW5lck9uKGRhdGFiYXNlLCBwdywgZGVlcCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wQ2F0YWxvZ09uKENhdGFsb2cgY2F0YWxvZywgSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcsIGJvb2xlYW4gZGVlcCkgewotCQlwdy5wcmludCgiY2F0YWxvZzogIik7Ci0JCXB3LnByaW50bG4oY2F0YWxvZy5nZXROYW1lKCkpOwotCQlwdy5pbmRlbnQoKTsKLQkJCXRoaXMuZHVtcFNjaGVtYUNvbnRhaW5lck9uKGNhdGFsb2csIHB3LCBkZWVwKTsKLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYUNvbnRhaW5lck9uKFNjaGVtYUNvbnRhaW5lciBzY2hlbWFDb250YWluZXIsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3LCBib29sZWFuIGRlZXApIHsKLQkJZm9yIChTY2hlbWEgc2NoZW1hIDogc2NoZW1hQ29udGFpbmVyLmdldFNjaGVtYXRhKCkpIHsKLQkJCXRoaXMuZHVtcFNjaGVtYU9uKHNjaGVtYSwgcHcsIGRlZXApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFNjaGVtYShTY2hlbWEgc2NoZW1hKSB7Ci0JCXRoaXMuZHVtcFNjaGVtYShzY2hlbWEsIHRydWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWEoU2NoZW1hIHNjaGVtYSwgYm9vbGVhbiBkZWVwKSB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBTY2hlbWFPbihzY2hlbWEsIHB3LCBkZWVwKTsKLQkJfQotCQlwdy5mbHVzaCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTY2hlbWFPbihTY2hlbWEgc2NoZW1hLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdywgYm9vbGVhbiBkZWVwKSB7Ci0JCXB3LnByaW50KCJzY2hlbWE6ICIpOwotCQlwdy5wcmludGxuKHNjaGVtYS5nZXROYW1lKCkpOwotCQlpZiAoZGVlcCkgewotCQkJcHcuaW5kZW50KCk7Ci0JCQkJZm9yIChUYWJsZSB0YWJsZSA6IHNjaGVtYS5nZXRUYWJsZXMoKSkgewotCQkJCQl0aGlzLmR1bXBUYWJsZU9uKHRhYmxlLCBwdyk7Ci0JCQkJfQotCQkJCWZvciAoU2VxdWVuY2Ugc2VxdWVuY2UgOiBzY2hlbWEuZ2V0U2VxdWVuY2VzKCkpIHsKLQkJCQkJdGhpcy5kdW1wU2VxdWVuY2VPbihzZXF1ZW5jZSwgcHcpOwotCQkJCX0KLQkJCXB3LnVuZGVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcFRhYmxlT24oVGFibGUgdGFibGUsIEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB7Ci0JCXB3LnByaW50KCJ0YWJsZTogIik7Ci0JCXB3LnByaW50bG4odGFibGUuZ2V0TmFtZSgpKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlmb3IgKENvbHVtbiBjb2x1bW4gOiB0YWJsZS5nZXRDb2x1bW5zKCkpIHsKLQkJCQl0aGlzLmR1bXBDb2x1bW5Pbihjb2x1bW4sIHB3KTsKLQkJCX0KLQkJCWZvciAoRm9yZWlnbktleSBmb3JlaWduS2V5IDogdGFibGUuZ2V0Rm9yZWlnbktleXMoKSkgewotCQkJCXRoaXMuZHVtcEZvcmVpZ25LZXlPbihmb3JlaWduS2V5LCBwdyk7Ci0JCQl9Ci0JCXB3LnVuZGVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBDb2x1bW5PbihDb2x1bW4gY29sdW1uLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiY29sdW1uOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgOiAiKTsKLQkJcHcucHJpbnQoY29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJaWYgKGNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSkgewotCQkJcHcucHJpbnQoIiBbcHJpbWFyeSBrZXldIik7Ci0JCX0KLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBGb3JlaWduS2V5T24oRm9yZWlnbktleSBmb3JlaWduS2V5LCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgiZm9yZWlnbiBrZXk6ICIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCI9PiIpOwotCQlwdy5wcmludChmb3JlaWduS2V5LmdldFJlZmVyZW5jZWRUYWJsZSgpLmdldE5hbWUoKSk7Ci0JCXB3LnByaW50KCIgKCIpOwotCQlmb3IgKEl0ZXJhdG9yPEZvcmVpZ25LZXkuQ29sdW1uUGFpcj4gc3RyZWFtID0gZm9yZWlnbktleS5nZXRDb2x1bW5QYWlycygpLml0ZXJhdG9yKCk7IHN0cmVhbS5oYXNOZXh0KCk7ICkgewotCQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gc3RyZWFtLm5leHQoKTsKLQkJCXB3LnByaW50KGNwLmdldEJhc2VDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkJcHcucHJpbnQoIj0+Iik7Ci0JCQlwdy5wcmludChjcC5nZXRSZWZlcmVuY2VkQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCWlmIChzdHJlYW0uaGFzTmV4dCgpKSB7Ci0JCQkJcHcucHJpbnQoIiwgIik7Ci0JCQl9Ci0JCX0KLQkJcHcucHJpbnQoJyknKTsKLQkJcHcucHJpbnRsbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGR1bXBTZXF1ZW5jZU9uKFNlcXVlbmNlIHNlcXVlbmNlLCBJbmRlbnRpbmdQcmludFdyaXRlciBwdykgewotCQlwdy5wcmludCgic2VxdWVuY2U6ICIpOwotCQlwdy5wcmludGxuKHNlcXVlbmNlLmdldE5hbWUoKSk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGR1bXAgSkRCQyBtZXRhZGF0YSAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCUluZGVudGluZ1ByaW50V3JpdGVyIHB3ID0gbmV3IEluZGVudGluZ1ByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoU3lzdGVtLm91dCkpOwotCQkvLyBzeW5jaHJvbml6ZSB0aGUgY29uc29sZSBzbyBldmVyeXRoaW5nIGlzIGNvbnRpZ3VvdXMKLQkJc3luY2hyb25pemVkIChTeXN0ZW0ub3V0KSB7Ci0JCQl0aGlzLmR1bXBKREJDQ2F0YWxvZ3NPbihwdyk7Ci0JCX0KLQkJcHcuZmx1c2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkdW1wSkRCQ0NhdGFsb2dzT24oSW5kZW50aW5nUHJpbnRXcml0ZXIgcHcpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlwdy5wcmludGxuKCJKREJDIGNhdGFsb2dzOiAiKTsKLQkJcHcuaW5kZW50KCk7Ci0JCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSB0aGlzLmJ1aWxkUm93cyh0aGlzLmdldERhdGFiYXNlTWV0YURhdGEoKS5nZXRDYXRhbG9ncygpKTsKLQkJCWZvciAoSXRlcmF0b3I8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHN0cmVhbSA9IHJvd3MuaXRlcmF0b3IoKTsgc3RyZWFtLmhhc05leHQoKTsgKSB7Ci0JCQkJSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93ID0gc3RyZWFtLm5leHQoKTsKLQkJCQlwdy5wcmludGxuKHJvdy5nZXQoIlRBQkxFX0NBVCIpKTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNTY2hlbWF0YSgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlJbmRlbnRpbmdQcmludFdyaXRlciBwdyA9IG5ldyBJbmRlbnRpbmdQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5vdXQpKTsKLQkJLy8gc3luY2hyb25pemUgdGhlIGNvbnNvbGUgc28gZXZlcnl0aGluZyBpcyBjb250aWd1b3VzCi0JCXN5bmNocm9uaXplZCAoU3lzdGVtLm91dCkgewotCQkJdGhpcy5kdW1wSkRCQ1NjaGVtYXRhT24ocHcpOwotCQl9Ci0JCXB3LmZsdXNoKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZHVtcEpEQkNTY2hlbWF0YU9uKEluZGVudGluZ1ByaW50V3JpdGVyIHB3KSB0aHJvd3MgU1FMRXhjZXB0aW9uIHsKLQkJcHcucHJpbnRsbigiSkRCQyBzY2hlbWF0YTogIik7Ci0JCXB3LmluZGVudCgpOwotCQkJQXJyYXlMaXN0PEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+PiByb3dzID0gdGhpcy5idWlsZFJvd3ModGhpcy5nZXREYXRhYmFzZU1ldGFEYXRhKCkuZ2V0U2NoZW1hcygpKTsKLQkJCWZvciAoSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcm93IDogcm93cykgewotCQkJCWlmIChyb3cuc2l6ZSgpID09IDIpIHsgIC8vIGNhdGFsb2dzIHdlcmUgYWRkZWQgaW4gamRrIDEuNAotCQkJCQlPYmplY3QgY2F0YWxvZyA9IHJvdy5nZXQoIlRBQkxFX0NBVEFMT0ciKTsKLQkJCQkJcHcucHJpbnQoY2F0YWxvZyk7Ci0JCQkJCXB3LnByaW50KCcuJyk7Ci0JCQkJfQotCQkJCU9iamVjdCBzY2hlbWEgPSByb3cuZ2V0KCJUQUJMRV9TQ0hFTSIpOwotCQkJCXB3LnByaW50bG4oc2NoZW1hKTsKLQkJCX0KLQkJcHcudW5kZW50KCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGNvbm5lY3Rpb24gcHJvZmlsZSBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uUHJvZmlsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29ubmVjdGlvblByb2ZpbGVMaXN0ZW5lciB7Ci0JCXB1YmxpYyBTdHJpbmcgYWRkZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbW92ZWROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWRPbGROYW1lOwotCQlwdWJsaWMgU3RyaW5nIHJlbmFtZWROZXdOYW1lOwotCi0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlQWRkZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMuYWRkZWROYW1lID0gbmFtZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjb25uZWN0aW9uUHJvZmlsZVJlbW92ZWQoU3RyaW5nIG5hbWUpIHsKLQkJCXRoaXMucmVtb3ZlZE5hbWUgPSBuYW1lOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbm5lY3Rpb25Qcm9maWxlUmVuYW1lZChTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBvbGROYW1lOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG5ld05hbWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLmFkZGVkTmFtZSA9IG51bGw7Ci0JCQl0aGlzLnJlbW92ZWROYW1lID0gbnVsbDsKLQkJCXRoaXMucmVuYW1lZE9sZE5hbWUgPSBudWxsOwotCQkJdGhpcy5yZW5hbWVkTmV3TmFtZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8vICoqKioqKioqKiogY29ubmVjdGlvbiBsaXN0ZW5lciAqKioqKioqKioqCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBDb25uZWN0aW9uTGlzdGVuZXIgewotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgb3BlbmVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG1vZGlmaWVkUHJvZmlsZTsKLQkJcHVibGljIENvbm5lY3Rpb25Qcm9maWxlIG9rVG9DbG9zZVByb2ZpbGU7Ci0JCXB1YmxpYyBDb25uZWN0aW9uUHJvZmlsZSBhYm91dFRvQ2xvc2VQcm9maWxlOwotCQlwdWJsaWMgQ29ubmVjdGlvblByb2ZpbGUgY2xvc2VkUHJvZmlsZTsKLQkJcHVibGljIERhdGFiYXNlIGNoYW5nZWREYXRhYmFzZTsKLQkJcHVibGljIENhdGFsb2cgY2hhbmdlZENhdGFsb2c7Ci0JCXB1YmxpYyBTY2hlbWEgY2hhbmdlZFNjaGVtYTsKLQkJcHVibGljIFNlcXVlbmNlIGNoYW5nZWRTZXF1ZW5jZTsKLQkJcHVibGljIFRhYmxlIGNoYW5nZWRUYWJsZTsKLQkJcHVibGljIENvbHVtbiBjaGFuZ2VkQ29sdW1uOwotCQlwdWJsaWMgRm9yZWlnbktleSBjaGFuZ2VkRm9yZWlnbktleTsKLQotCQlwdWJsaWMgdm9pZCBvcGVuZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5vcGVuZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBtb2RpZmllZChDb25uZWN0aW9uUHJvZmlsZSBwcm9maWxlKSB7Ci0JCQl0aGlzLm1vZGlmaWVkUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQkJcHVibGljIGJvb2xlYW4gb2tUb0Nsb3NlKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUpIHsKLQkJCXRoaXMub2tUb0Nsb3NlUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBhYm91dFRvQ2xvc2UoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5hYm91dFRvQ2xvc2VQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBjbG9zZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSkgewotCQkJdGhpcy5jbG9zZWRQcm9maWxlID0gcHJvZmlsZTsKLQkJfQotCQlwdWJsaWMgdm9pZCBkYXRhYmFzZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgRGF0YWJhc2UgZGF0YWJhc2UpIHsKLQkJCXRoaXMuY2hhbmdlZERhdGFiYXNlID0gZGF0YWJhc2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQl0aGlzLmNoYW5nZWRDYXRhbG9nID0gY2F0YWxvZzsKLQkJfQotCQlwdWJsaWMgdm9pZCBzY2hlbWFDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFNjaGVtYSBzY2hlbWEpIHsKLQkJCXRoaXMuY2hhbmdlZFNjaGVtYSA9IHNjaGVtYTsKLQkJfQotCQlwdWJsaWMgdm9pZCBzZXF1ZW5jZUNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLQkJCXRoaXMuY2hhbmdlZFNlcXVlbmNlID0gc2VxdWVuY2U7Ci0JCX0KLQkJcHVibGljIHZvaWQgdGFibGVDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIFRhYmxlIHRhYmxlKSB7Ci0JCQl0aGlzLmNoYW5nZWRUYWJsZSA9IHRhYmxlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGNvbHVtbkNoYW5nZWQoQ29ubmVjdGlvblByb2ZpbGUgcHJvZmlsZSwgQ29sdW1uIGNvbHVtbikgewotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gY29sdW1uOwotCQl9Ci0JCXB1YmxpYyB2b2lkIGZvcmVpZ25LZXlDaGFuZ2VkKENvbm5lY3Rpb25Qcm9maWxlIHByb2ZpbGUsIEZvcmVpZ25LZXkgZm9yZWlnbktleSkgewotCQkJdGhpcy5jaGFuZ2VkRm9yZWlnbktleSA9IGZvcmVpZ25LZXk7Ci0JCX0KLQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQl0aGlzLm9wZW5lZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5tb2RpZmllZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5va1RvQ2xvc2VQcm9maWxlID0gbnVsbDsKLQkJCXRoaXMuYWJvdXRUb0Nsb3NlUHJvZmlsZSA9IG51bGw7Ci0JCQl0aGlzLmNsb3NlZFByb2ZpbGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkRGF0YWJhc2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ2F0YWxvZyA9IG51bGw7Ci0JCQl0aGlzLmNoYW5nZWRTY2hlbWEgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkU2VxdWVuY2UgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkVGFibGUgPSBudWxsOwotCQkJdGhpcy5jaGFuZ2VkQ29sdW1uID0gbnVsbDsKLQkJCXRoaXMuY2hhbmdlZEZvcmVpZ25LZXkgPSBudWxsOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL0RlcmJ5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkODc5Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvRGVyYnlUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRGVyYnlUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIERlcmJ5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiZGVyYnkucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLkRlcmJ5IEVtYmVkZGVkIEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuZGVyYnkxMDEuZ2VuZXJpY0RyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIkRlcmJ5IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMC4xIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5hcGFjaGUuZGVyYnkuamRiYy5FbWJlZGRlZERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJEZXJieV8xMC4xX0VtYmVkZGVkIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJEZXJieSAxMC4xIEVtYmVkZGVkIEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmRlcmJ5LmVtYmVkZGVkLmNvbm5lY3Rpb25Qcm9maWxlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QxIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEVTVDEiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROdWxsKHNjaGVtYTIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQlzY2hlbWEyID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlhc3NlcnROb3RTYW1lKHNjaGVtYTEsIHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIExPT0tVUF9URVNUIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJMT09LVVBfVEVTVCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0IikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hSWRlbnRpZmllcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIGxvb2t1cF90ZXN0Iik7ICAvLyB0aGlzIGdldHMgZm9sZGVkIHRvIHVwcGVyY2FzZQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgXCJsb29rdXBfVEVTVFwiIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiTE9PS1VQX1RFU1QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJMT09LVVBfVEVTVCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cFRlc3QiKSk7Ci0JCWFzc2VydE51bGwoc2NoZW1hLmdldElkZW50aWZpZXIoIkxvb2t1cF9UZXN0IikpOwotCi0JCXNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfdGVzdCIpOwotCQlhc3NlcnRFcXVhbHMoIkxPT0tVUF9URVNUIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0KLQkJc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIlwibG9va3VwX1RFU1RcIiIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PX0JBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiRk9PIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBUiIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgVEFCTEVfVEVTVCIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIlNFVCBTQ0hFTUEgPSBUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlRBQkxFX1RFU1QiKTsKLQotCQkvLyBGT08KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyg0LCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKTsKLQkJYXNzZXJ0U2FtZShwa0NvbHVtbiwgaWRDb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoIklOVEVHRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImludCIsIGlkQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIG5hbWVDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5hbWVDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUobmFtZUNvbHVtbi5pc051bGxhYmxlKCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gc2FsYXJ5Q29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIlNBTEFSWSIpOwotCQlhc3NlcnRFcXVhbHMoIkRFQ0lNQUwiLCBzYWxhcnlDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHNhbGFyeUNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygxMSwgc2FsYXJ5Q29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHNhbGFyeUNvbHVtbi5nZXRTY2FsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBzYWxhcnlDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCi0JCUZvcmVpZ25LZXkgYmFyRksgPSBmb29UYWJsZS5nZXRGb3JlaWduS2V5cygpLml0ZXJhdG9yKCkubmV4dCgpOyAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgMSBmb3JlaWduIGtleQotCQlhc3NlcnRFcXVhbHMoMSwgYmFyRksuZ2V0Q29sdW1uUGFpcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGJhckZLLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCWFzc2VydE51bGwoYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJiYXIiKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0lEIiwgYmFyRksuZ2V0Sm9pbkNvbHVtbkFubm90YXRpb25JZGVudGlmaWVyKCJwcmltYXJ5QmFyIikpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBiYXJGSy5nZXRCYXNlVGFibGUoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoZm9vVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0U2FtZShzY2hlbWEsIGZvb1RhYmxlLmdldFNjaGVtYSgpKTsKLQotCQkvLyBCQVIKLQkJVGFibGUgYmFyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygzLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCi0JCUNvbHVtbiBpZDJDb2x1bW4gPSBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQyIik7Ci0JCWFzc2VydEVxdWFscygiSU5URUdFUiIsIGlkMkNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0vLwkJYXNzZXJ0VHJ1ZShpZDJDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOyAgLy8gZG9lc24ndCB3b3JrKD8pCi0JCWFzc2VydEZhbHNlKGlkMkNvbHVtbi5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkMkNvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBpZDJDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZS4uLgotCQlhc3NlcnRFcXVhbHMoMCwgaWQyQ29sdW1uLmdldFNjYWxlKCkpOyAgLy8gbm90IHN1cmUgd2hhdCB0byBleHBlY3QgaGVyZSBlaXRoZXIuLi4KLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJ5dGVbXSIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJDSFVOSyIpLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydFRydWUoYmFyVGFibGUuZ2V0Q29sdW1uTmFtZWQoIkNIVU5LIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBCQVoKLQkJVGFibGUgYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiQkFaIik7Ci0JCUNvbHVtbiBuaWNrbmFtZUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJOSUNLTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5pY2tuYW1lQ29sdW1uLmdldExlbmd0aCgpKTsKLS8vCQlhc3NlcnRUcnVlKG5pY2tuYW1lQ29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsgIC8vIGRvZXNuJ3Qgd29yayg/KQotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoIkZPT19CQVoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiRk9PX0lEIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPT19CQVoiKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkZPTyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJCQVIiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7ICAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhckRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEJBUiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEMiBJTlQgVU5JUVVFIE5PVCBOVUxMLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENIVU5LIEJMT0IoMTAwSykiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPTyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgSU5UIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgVkFSQ0hBUigyMCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgU0FMQVJZIERFQ0lNQUwoMTEsIDIpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBJTlQgUkVGRVJFTkNFUyBCQVIoSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIElOVCBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOSUNLTkFNRSBWQVJDSEFSKDIwKSBOT1QgTlVMTCBVTklRVUUiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPT19CQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPT19JRCBJTlQgUkVGRVJFTkNFUyBGT08oSUQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBWl9JRCBJTlQgUkVGRVJFTkNFUyBCQVooSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIENPTFVNTl9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIFNDSEVNQSA9IENPTFVNTl9URVNUIik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIkNPTFVNTl9URVNUIiwgInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIkNPTFVNTl9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgSU5URUdFUiwgXCJOYW1lXCIgVkFSQ0hBUigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYU5hbWVkKCJDT0xVTU5fVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiQ09MVU1OX1RFU1QiLCAidGVzdCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIkNPTFVNTl9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBPUkcgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgU0NIRU1BID0gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBFTVAgKElEIElOVEVHRVIgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUigyMCksICIgKwotCQkJCSJPUkdfSUQgSU5URUdFUiBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIk9SRyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiRU1QIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOQjogQSBEZXJieSBzY2hlbWEgbXVzdCBiZSBlbXB0eSBiZWZvcmUgaXQgY2FuIGJlIGRyb3BwZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRyb3BTY2hlbWEoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAodGhpcy5nZXREYXRhYmFzZSgpLmdldFNjaGVtYUZvcklkZW50aWZpZXIobmFtZSkgIT0gbnVsbCkgewotCQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFNDSEVNQSAiICsgbmFtZSArICIgUkVTVFJJQ1QiKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9NeVNRTFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWI3ZTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL015U1FMVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRyaXZlcnMuamRiYy5JSkRCQ0RyaXZlckRlZmluaXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkFycmF5VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5Gb3JlaWduS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuU2NoZW1hOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuVGFibGU7Ci0KLS8qKgotICogTXlTUUwKLSAqIAotICogTm90ZXM6PHVsPgotICogPGxpPldlIGNhbiBvbmx5IGdldCBkYXRhYmFzZSBvYmplY3RzIGZyb20gdGhlIGRhdGFiYXNlIGFzc29jaWF0ZWQgd2l0aCBvdXIKLSAqIGNvbm5lY3Rpb24gcHJvZmlsZS4KLSAqIDxsaT5XZSBjYW4gcmVmZXJlbmNlIG9iamVjdHMgYWNyb3NzIG11bHRpcGxlIGRhdGFiYXNlcywgc28gdGhleSBhcmUgc29ydGEgbGlrZQotICogc2NoZW1hcy4uLi4KLSAqIDxsaT5Gb3JlaWduIGtleXMgbXVzdCBiZSBkZWZpbmVkIGFzIHRhYmxlLWxldmVsIGNvbnN0cmFpbnRzOyB0aGV5IGNhbm5vdCBiZQotICogZGVmaW5lZCBhcyBwYXJ0IG9mIHRoZSBjb2x1bW4gY2xhdXNlLgotICogPGxpPkNhc2Utc2Vuc2l0aXZpdHkgYW5kIC1mb2xkaW5nIGlzIHdoYWNrZWQgb24gTXlTUUwuLi4uCi0gKiA8L3VsPgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNeVNRTFRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgTXlTUUxUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJteXNxbC5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uTXlTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvblR5cGUoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXlzcWwuNF8xLmRyaXZlclRlbXBsYXRlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVuZG9yKCkgewotCQlyZXR1cm4gIk15U3FsIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICI0LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAiY29tLm15c3FsLmpkYmMuRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRKREJDVVJMKCkgewotCQlyZXR1cm4gImpkYmM6bXlzcWw6Ly9sb2NhbGhvc3Q6MzMwNiI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJNeVNRTF80LjEiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIk15U1FMIDQuMSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFByb3BlcnRpZXMgYnVpbGREVFBDb25uZWN0aW9uUHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcCA9IHN1cGVyLmJ1aWxkRFRQQ29ubmVjdGlvblByb2ZpbGVQcm9wZXJ0aWVzKCk7Ci0JCXAuc2V0UHJvcGVydHkoSUpEQkNEcml2ZXJEZWZpbml0aW9uQ29uc3RhbnRzLkRBVEFCQVNFX05BTUVfUFJPUF9JRCwgdGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldERhdGFiYXNlTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZ2V0VXNlcklEKCk7ICAvLyBieSBjb252ZW50aW9uLi4uCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJcmV0dXJuIHRydWU7ICAvLyBzZWVtcyB0byB3b3JrLi4uCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdERhdGFiYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCS8vIERUUDogTXlTUUwgaGFzIGEgc2luZ2xlIHNjaGVtYSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGRhdGFiYXNlCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQodGhpcy5nZXREYXRhYmFzZU5hbWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hKTsKLQkJYXNzZXJ0U2FtZSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSwgc2NoZW1hKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZyh0aGlzLmdldERhdGFiYXNlTmFtZSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiZm9vX2JheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJmb28iKTsKLQkJdGhpcy5kcm9wVGFibGUoImJhciIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkvLyB0aGUgTXlTUUwgZGF0YWJhc2UgZG9lcyBOT1QgcmVmcmVzaCAtIHNlZSBidWcgMjc5NzIxLi4uCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQkvLyAuLi5yZWZyZXNoIHRoZSBzaW5nbGUgc2NoZW1hIGluc3RlYWQKLQkJKChJQ2F0YWxvZ09iamVjdCkgZ2V0RFRQU2NoZW1hKHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJLy8gaWYgdGhlIHRhYmxlcyBhcmUgY3JlYXRlZCB3aXRoIE15SVNBTSBhcyB0aGUgYmFja2luZyBzdG9yZQotCQkvLyB0aGVyZSB3aWxsIGJlIG5vIGZvcmVpZ24ga2V5cwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJpZCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5UIiwgaWRDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRTYW1lKGZvb1RhYmxlLCBpZENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSIiwgbmFtZUNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG5hbWVDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJQ29sdW1uIGJhckNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxPQiIsIGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJieXRlW10iLCBiYXJUYWJsZS5nZXRDb2x1bW5OYW1lZCgiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpLmlzTE9CKCkpOwotCQlhc3NlcnRTYW1lKGJhclRhYmxlLCBiYXJGSy5nZXRSZWZlcmVuY2VkVGFibGUoKSk7Ci0KLQkJLy8gRk9PX0JBWgotCQlUYWJsZSBmb29fYmF6VGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vX2JheiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbk5hbWVkKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXIiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgSU5URUdFUiBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGJhcl9pZCBJTlRFR0VSLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIENPTlNUUkFJTlQgQkFSIEZPUkVJR04gS0VZIChiYXJfaWQpIFJFRkVSRU5DRVMgYmFyKGlkKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIG5hbWUgVkFSQ0hBUigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBJTlQsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIElOVCwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBGT1JFSUdOIEtFWSAoZm9vX2lkKSBSRUZFUkVOQ0VTIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgRk9SRUlHTiBLRVkgKGJhel9pZCkgUkVGRVJFTkNFUyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogT24gV2luZG93cywgdGFibGUgbmFtZXMgZ2V0IGZvbGRlZCB0byBsb3dlcmNhc2UgYnkgZGVmYXVsdDsKLQkgKiBldmVuIGlmIHRoZSBuYW1lIGlzIGRlbGltaXRlZCAoYXBwYXJlbnRseSkuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0MSIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEVTVDIiKTsKLQkJdGhpcy5kcm9wVGFibGUoImBURVNUM2AiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0MSAoaWQgSU5URUdFUiwgbmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgVEVTVDIgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIGBURVNUM2AgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCS8vIHRoZSBNeVNRTCBkYXRhYmFzZSBkb2VzIE5PVCByZWZyZXNoIC0gc2VlIGJ1ZyAyNzk3MjEuLi4KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCS8vIC4uLnJlZnJlc2ggdGhlIHNpbmdsZSBzY2hlbWEgaW5zdGVhZAotCQkoKElDYXRhbG9nT2JqZWN0KSBnZXREVFBTY2hlbWEodGhpcy5nZXREZWZhdWx0U2NoZW1hKCkpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCVRhYmxlIHRlc3QxVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QxVGFibGUpOwotCi0JCS8vIGlmICdsY3RuJyBpcyAwIChVTklYKSwgdGhlIHRhYmxlIG5hbWUgaXMgY2FzZS1zZW5zaXRpdmUKLQkJaW50IGxjdG4gPSB0aGlzLmdldExvd2VyQ2FzZVRhYmxlTmFtZXNGcm9tRGF0YWJhc2UoKTsKLQotCQlTdHJpbmcgdGVzdDJJZGVudGlmaWVyID0gKGxjdG4gPT0gMCkgPyAiVEVTVDIiIDogInRlc3QyIjsKLQkJVGFibGUgdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIodGVzdDJJZGVudGlmaWVyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MlRhYmxlKTsKLQotCQlTdHJpbmcgdGVzdDNJZGVudGlmaWVyID0gKGxjdG4gPT0gMCkgPyAiYFRFU1QzYCIgOiAiYHRlc3QzYCI7Ci0JCVRhYmxlIHRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRlc3QzSWRlbnRpZmllcik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDNUYWJsZSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYFRFU1QzYCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRMb3dlckNhc2VUYWJsZU5hbWVzRnJvbURhdGFiYXNlKCkgdGhyb3dzIFNRTEV4Y2VwdGlvbiB7Ci0JCS8vIHRoZSB1bmRlcnNjb3JlIGlzIGEgd2lsZCBjaGFyYWN0ZXIgb24gTXlTUUwsIHNvIHdlIG5lZWQgdG8gZXNjYXBlIGl0Ci0JCUFycmF5TGlzdDxIYXNoTWFwPFN0cmluZywgT2JqZWN0Pj4gcm93cyA9IHRoaXMuZXhlY3V0ZSgic2hvdyB2YXJpYWJsZXMgbGlrZSAnbG93ZXJcXF9jYXNlXFxfdGFibGVcXF9uYW1lcyciKTsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSByb3dzLmdldCgwKTsKLQkJcmV0dXJuIEludGVnZXIudmFsdWVPZigoU3RyaW5nKSByb3cuZ2V0KCJWYWx1ZSIpKS5pbnRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIE15U1FMIHByZXNlcnZlcyB0aGUgY2FzZSBvZiBjb2x1bW4gbmFtZXMsIGRlbGltaXRlZCBvciBub3Q7Ci0JICogYnV0IHRoZXkgYXJlIDxlbT5ub3Q8L2VtPiBjYXNlLXNlbnNpdGl2ZSB3aGVuIHVzZWQgaW4gU1FMLgotCSAqIERlbGltaXRlcnMgYXJlIHVzZWZ1bCBmb3IgcmVzZXJ2ZWQgaWRlbnRpZmllcnMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKHRoaXMuZ2V0RGF0YWJhc2VOYW1lKCkpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIElOVEVHRVIsIG5hbWUgVkFSQ0hBUigyMCkpIik7Ci0JCS8vIHRoZSBNeVNRTCBkYXRhYmFzZSBkb2VzIE5PVCByZWZyZXNoIC0gc2VlIGJ1ZyAyNzk3MjEuLi4KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCS8vIC4uLnJlZnJlc2ggdGhlIHNpbmdsZSBzY2hlbWEgaW5zdGVhZAotCQkoKElDYXRhbG9nT2JqZWN0KSBnZXREVFBTY2hlbWEodGhpcy5nZXREZWZhdWx0U2NoZW1hKCkpKS5yZWZyZXNoKCk7Ci0KLQkJVGFibGUgdGFibGUgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbk5hbWVkKCJuYW1lIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgSU5URUdFUiwgTkFNRSBWQVJDSEFSKDIwKSkiKTsKLQkJLy8gdGhlIE15U1FMIGRhdGFiYXNlIGRvZXMgTk9UIHJlZnJlc2ggLSBzZWUgYnVnIDI3OTcyMS4uLgotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJLy8gLi4ucmVmcmVzaCB0aGUgc2luZ2xlIHNjaGVtYSBpbnN0ZWFkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGdldERUUFNjaGVtYSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5BTUUiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgSU5URUdFUiwgTmFtZSBWQVJDSEFSKDIwKSkiKTsKLQkJLy8gdGhlIE15U1FMIGRhdGFiYXNlIGRvZXMgTk9UIHJlZnJlc2ggLSBzZWUgYnVnIDI3OTcyMS4uLgotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJLy8gLi4ucmVmcmVzaCB0aGUgc2luZ2xlIHNjaGVtYSBpbnN0ZWFkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGdldERUUFNjaGVtYSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5hbWUiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChgSWRgIElOVEVHRVIsIGBOYW1lYCBWQVJDSEFSKDIwKSkiKTsKLQkJLy8gdGhlIE15U1FMIGRhdGFiYXNlIGRvZXMgTk9UIHJlZnJlc2ggLSBzZWUgYnVnIDI3OTcyMS4uLgotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJLy8gLi4ucmVmcmVzaCB0aGUgc2luZ2xlIHNjaGVtYSBpbnN0ZWFkCi0JCSgoSUNhdGFsb2dPYmplY3QpIGdldERUUFNjaGVtYSh0aGlzLmdldERlZmF1bHRTY2hlbWEoKSkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIk5hbWUiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQlib29sZWFuIHF1b3RlcyA9IHRoaXMuZ2V0QU5TSVF1b3Rlc0Zyb21EYXRhYmFzZSgpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImBJZGAiKSk7Ci0JCWlmIChxdW90ZXMpIHsKLQkJCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJJZFwiIikpOwotCQl9Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJgTmFtZWAiKSk7Ci0JCWlmIChxdW90ZXMpIHsKLQkJCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJOYW1lXCIiKSk7Ci0JCX0KLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0QU5TSVF1b3Rlc0Zyb21EYXRhYmFzZSgpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQlBcnJheUxpc3Q8SGFzaE1hcDxTdHJpbmcsIE9iamVjdD4+IHJvd3MgPSB0aGlzLmV4ZWN1dGUoIlNFTEVDVCBAQFNFU1NJT04uc3FsX21vZGUiKTsKLQkJTWFwPFN0cmluZywgT2JqZWN0PiByb3cgPSByb3dzLmdldCgwKTsKLQkJU3RyaW5nIHNxbF9tb2RlID0gKFN0cmluZykgcm93LmdldCgiQEBTRVNTSU9OLnNxbF9tb2RlIik7Ci0JCVN0cmluZ1tdIG1vZGVzID0gc3FsX21vZGUuc3BsaXQoIiwiKTsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihBcnJheVRvb2xzLmNvbnRhaW5zKG1vZGVzLCAiQU5TSV9RVU9URVMiKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgdGFibGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFRBQkxFIElGIEVYSVNUUyAiICsgdGFibGVOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDcxMWU4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGUxMGdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDkgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLWltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LnNxbS5jb3JlLnJ0ZS5JQ2F0YWxvZ09iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLkZvcmVpZ25LZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5TY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5UYWJsZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGUxMGdUZXN0cyggU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIoIG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGxhdGZvcm1Qcm9wZXJ0aWVzRmlsZU5hbWUoKSB7Ci0JCXJldHVybiAib3JhY2xlMTBnLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnXzEwLjEuMC40IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGcgKDEwLjEuMC40KSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGF0YWJhc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHRoaXMuY29ubmVjdGlvblByb2ZpbGUuZ2V0VXNlck5hbWUoKS50b1VwcGVyQ2FzZSgpLmVxdWFscygiU1lTIikpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2tpcHBlZCB0ZXN0OiAiICsgdGhpcy5nZXRDbGFzcygpICsgJy4nICsgdGhpcy5nZXROYW1lKCkpOwotCQkJcmV0dXJuOyAgLy8gU1lTIGRvZXMgbm90IGhhdmUgYSBzY2hlbWEKLQkJfQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQkvLyBPcmFjbGUgc2hvdWxkIGhhdmUgYSBzY2hlbWEgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSB1c2VyCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcih0aGlzLmdldFVzZXJJRCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLCBzY2hlbWEpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJmb29fYmF6Iik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImZvbyIpOwotCQl0aGlzLmRyb3BUYWJsZSgiYmFyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhekRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29CYXpEREwoKSk7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGZvb1RhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZm9vVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBwa0NvbHVtbiA9IGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJJRCIsIHBrQ29sdW1uLmdldE5hbWUoKSk7Ci0JCUNvbHVtbiBpZENvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIik7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0RXF1YWxzKCJOVU1CRVIiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGlkQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGlkQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubWF0aC5CaWdEZWNpbWFsIiwgaWRDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQotCQlDb2x1bW4gbmFtZUNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJWQVJDSEFSMiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCi0JCUNvbHVtbiBiYXJDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJOVU1CRVIiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfSUQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoMiwgYmFyVGFibGUuZ2V0Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBiYXJUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiSUQiLCBiYXJUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyVGFibGUuaXNQb3NzaWJsZUpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTE9CIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiY2h1bmsiKS5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiY2h1bmsiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImNodW5rIikuaXNMT0IoKSk7Ci0JCWFzc2VydFNhbWUoYmFyVGFibGUsIGJhckZLLmdldFJlZmVyZW5jZWRUYWJsZSgpKTsKLQotCQkvLyBGT09fQkFaCi0JCVRhYmxlIGZvb19iYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoImZvb19iYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJmb29faWQiKS5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoImZvb19iYXoiKTsKLQkJdGhpcy5kcm9wVGFibGUoImJheiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiZm9vIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJiYXIiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgIC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmFyRERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgYmFyICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBpZCBOVU1CRVIoMTApIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGNodW5rIEJMT0IiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIFZBUkNIQVIyKDIwKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXJfaWQgUkVGRVJFTkNFUyBiYXIoaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBiYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgbmFtZSBWQVJDSEFSMigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIGZvb19iYXogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGZvb19pZCBOVU1CRVIoMTApIFJFRkVSRU5DRVMgZm9vKGlkKSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXpfaWQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIGJheihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFibGVMb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiXCJ0ZXN0M1wiIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdDEgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBURVNUMiAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIFwidGVzdDNcIiAoaWQgTlVNQkVSKDEwKSwgbmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQlUYWJsZSB0ZXN0MVRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0MVRhYmxlKTsKLQkJdGVzdDFUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDFUYWJsZSk7Ci0KLQkJVGFibGUgdGVzdDJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwodGVzdDJUYWJsZSk7Ci0JCXRlc3QyVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJURVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHRlc3QyVGFibGUpOwotCi0JCVRhYmxlIHRlc3QzVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJcInRlc3QzXCIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0ZXN0M1RhYmxlKTsKLQkJdGVzdDNUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QzIik7Ci0JCWFzc2VydE51bGwodGVzdDNUYWJsZSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QxIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJURVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiXCJ0ZXN0M1wiIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29sdW1uTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJ0ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKGlkIE5VTUJFUigxMCksIG5hbWUgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoImlkIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIm5hbWUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoInRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSUQgTlVNQkVSKDEwKSwgTkFNRSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSUQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgTlVNQkVSKDEwKSwgTmFtZSBWQVJDSEFSMigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCS8vIGRlbGltaXRlZAotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSB0ZXN0IChcIklkXCIgTlVNQkVSKDEwKSwgXCJOYW1lXCIgVkFSQ0hBUjIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiSWRcIiIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJcIk5hbWVcIiIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgidGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyb3NzU2NoZW1hUmVmZXJlbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICggISB0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmdldFVzZXJOYW1lKCkudG9VcHBlckNhc2UoKS5lcXVhbHMoIlNZUyIpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgdGVzdDogIiArIHRoaXMuZ2V0Q2xhc3MoKSArICcuJyArIHRoaXMuZ2V0TmFtZSgpKTsKLQkJCXJldHVybjsgIC8vIFNZUyBkb2VzIG5vdCBoYXZlIGEgc2NoZW1hCi0JCX0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJEUk9QIFVTRVIgWFJFRl9URVNUMiBDQVNDQURFIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBVU0VSIFhSRUZfVEVTVDEgQ0FTQ0FERSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFVTRVIgWFJFRl9URVNUMSBJREVOVElGSUVEIEJZIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkFMVEVSIFVTRVIgWFJFRl9URVNUMSBRVU9UQSBVTkxJTUlURUQgT04gVVNFUlMiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgWFJFRl9URVNUMS5PUkcgKElEIE5VTUJFUigxMCkgUFJJTUFSWSBLRVksIE5BTUUgVkFSQ0hBUjIoMjApKSIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFVTRVIgWFJFRl9URVNUMiBJREVOVElGSUVEIEJZIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkFMVEVSIFVTRVIgWFJFRl9URVNUMiBRVU9UQSBVTkxJTUlURUQgT04gVVNFUlMiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJHUkFOVCBBTEwgT04gWFJFRl9URVNUMS5PUkcgVE8gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBYUkVGX1RFU1QyLkVNUCAoSUQgTlVNQkVSKDEwKSBQUklNQVJZIEtFWSwgTkFNRSBWQVJDSEFSMigyMCksICIgKwotCQkJCSJPUkdfSUQgTlVNQkVSKDEwKSBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0U2NoZW1hTmFtZWQoIlhSRUZfVEVTVDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIk9SRyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRTY2hlbWFOYW1lZCgiWFJFRl9URVNUMiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiRU1QIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiT1JHIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiT1JHX0lEIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoIklEIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJEUk9QIFVTRVIgWFJFRl9URVNUMiBDQVNDQURFIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBVU0VSIFhSRUZfVEVTVDEgQ0FTQ0FERSIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkcm9wVGFibGUoU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiRFJPUCBUQUJMRSAiICsgdGFibGVOYW1lICsgIiBDQVNDQURFIENPTlNUUkFJTlRTIik7Ci0JfQotCi0vLyBuZWVkIE9yYWNsZSBlbmFibGVtZW50IHBsdWctaW4KLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXF1ZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotLy8JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIkZPT19TRVEiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0VRVUVOQ0UgRk9PX1NFUSIpOwotLy8JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotLy8KLS8vCQlTZXF1ZW5jZSBzZXF1ZW5jZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0U2VxdWVuY2VGb3JJZGVudGlmaWVyKCJGT08iKTsKLS8vCQlhc3NlcnROb3ROdWxsKHNlcXVlbmNlKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkZPT19TRVEiLCBzZXF1ZW5jZS5nZXROYW1lKCkpOwotLy8KLS8vCQl0aGlzLmRyb3BTZXF1ZW5jZSgiRk9PX1NFUSIpOwotLy8KLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0vLwl9Ci0vLwotLy8JcHJpdmF0ZSB2b2lkIGRyb3BTZXF1ZW5jZShTdHJpbmcgc2VxdWVuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoIkRST1AgU0VRVUVOQ0UgIiArIHNlcXVlbmNlTmFtZSk7Ci0vLwl9Ci0vLwotCXByb3RlY3RlZCB2b2lkIGR1bXBVc2VyT2JqZWN0cygpIHRocm93cyBTUUxFeGNlcHRpb24gewotCQl0aGlzLmR1bXAoInNlbGVjdCAqIGZyb20gdXNlcl9vYmplY3RzIik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL09yYWNsZTEwZ1hFVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2NmE5YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlMTBnWEVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotCi0vKioKLSAqICBPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIFRlc3QKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgT3JhY2xlMTBnWEVUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIE9yYWNsZTEwZ1hFVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIm9yYWNsZTEwZ1hFLnByb3BlcnRpZXMiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyTmFtZSgpIHsKLQkJcmV0dXJuICJPcmFjbGUgMTBnIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuMTAuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiT3JhY2xlIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIxMCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJvcmFjbGUuamRiYy5PcmFjbGVEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlMTBnX1hFIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGUxMGcgWEUgUmVsZWFzZSAyICgxMC4yKSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvT3JhY2xlOWlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJlOTE5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9PcmFjbGU5aVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi0KLS8qKgotICogIE9yYWNsZSA5aSBUaGluIERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9yYWNsZTlpVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBPcmFjbGU5aVRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJvcmFjbGU5aS5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiT3JhY2xlIDlpIFRoaW4gRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLk9yYWNsZSBUaGluIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuOS5kcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJPcmFjbGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZXJzaW9uKCkgewotCQlyZXR1cm4gIjkiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyQ2xhc3MoKSB7Ci0JCXJldHVybiAib3JhY2xlLmpkYmMuT3JhY2xlRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIk9yYWNsZTlpIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJPcmFjbGU5aSBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJvb2xlYW4gZXhlY3V0ZU9mZmxpbmVUZXN0cygpIHsKLQkJLy8gd29ya2luZyBvZmZsaW5lIGlzIHByZXR0eSB1Z2x5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2RiL3Rlc3RzL2ludGVybmFsL3BsYXRmb3Jtcy9Qb3N0Z3JlU1FMVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU1MDFhNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvUG9zdGdyZVNRTFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLnRlc3RzLmludGVybmFsLnBsYXRmb3JtczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuc3FtLmNvcmUucnRlLklDYXRhbG9nT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBQb3N0Z3JlU1FMVGVzdHMgZXh0ZW5kcyBEVFBQbGF0Zm9ybVRlc3RzIHsKLQotCXB1YmxpYyBQb3N0Z3JlU1FMVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInBvc3RncmVzcWwucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIlBvc3RncmVTUUwgSkRCQyBEcml2ZXIiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RHJpdmVyRGVmaW5pdGlvbklEKCkgewotCQlyZXR1cm4gIkRyaXZlckRlZm4uUG9zdGdyZVNRTCBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uVHlwZSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5wb3N0Z3Jlc3FsLnBvc3RncmVzcWxEcml2ZXJUZW1wbGF0ZSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlbmRvcigpIHsKLQkJcmV0dXJuICJwb3N0Z3JlcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiOC54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0SkRCQ1VSTCgpIHsKLQkJLy8gdXNpbmcgdGhpcyBVUkwgd2lsbCByZXN1bHQgaW4gdGhlIERUUCBkYXRhYmFzZSBjb250YWluaW5nIGEgc2luZ2xlCi0JCS8vIGNhdGFsb2cgbmFtZWQgIiIgLSB3aGljaCwgdW5mb3J0dW5hdGVseSwgcmVzZW1ibGVzIHRoZSBwc2V1ZG8tY2F0YWxvZwotCQkvLyBnZW5lcmF0ZWQgYnkgRFRQIGZvciBkYXRhYmFzZXMgdGhhdCBkbyBub3QgcmV0dXJuIGFueSBjYXRhbG9ncyB2aWEKLQkJLy8gSkRCQyBtZXRhZGF0YSBjYWxscy4uLgotCQlyZXR1cm4gImpkYmM6cG9zdGdyZXNxbCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlTmFtZSgpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJQb3N0Z3JlU1FMIDguMiBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyBEVFAgZG9lcyBub3Qgc3VwcG9ydCBQb3N0Z3JlU1FMIG9mZi1saW5lIC0gc2VlIDIyNjcwNC8yNDE1NTgKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJURVNUMSIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QxIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVNjaGVtYSBzY2hlbWExID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QxIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFRFU1QyIik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlRFU1QyIik7Ci0JCWFzc2VydE51bGwoc2NoZW1hMik7ICAvLyBzaG91bGQgYmUgbnVsbCB1bnRpbCByZWZyZXNoCi0KLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0JCWFzc2VydFNhbWUodGhpcy5nZXREYXRhYmFzZSgpLCBsaXN0ZW5lci5jaGFuZ2VkRGF0YWJhc2UpOwotCi0JCXNjaGVtYTIgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQkJYXNzZXJ0Tm90U2FtZShzY2hlbWExLCB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEVTVDEiKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlRFU1QyIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEVTVDEiKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2NoZW1hTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJcImxvb2t1cF9URVNUXCIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgTE9PS1VQX1RFU1QiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoIkxPT0tVUF9URVNUIikpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJMT09LVVBfVEVTVCIpKTsKLQotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgibG9va3VwX3Rlc3QiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoImxvb2t1cF90ZXN0IikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfVEVTVCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX1RFU1QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfdGVzdFwiIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcImxvb2t1cF9URVNUXCIiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwiTE9PS1VQX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIkxPT0tVUF9URVNUIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgiTE9PS1VQX1RFU1QiKSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIikpOwotCi0JCWFzc2VydE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJsb29rdXBfdGVzdCIpKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigibG9va3VwX3Rlc3QiKSk7Ci0KLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF9URVNUIikpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJsb29rdXBfVEVTVCIpKTsKLQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJcIkxPT0tVUF9URVNUXCIiKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIlwibG9va3VwX1RFU1RcIiIpKTsKLQotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNjaGVtYUlkZW50aWZpZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wU2NoZW1hKCJMT09LVVBfVEVTVCIpOwotCQl0aGlzLmRyb3BTY2hlbWEoIlwibG9va3VwX1RFU1RcIiIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBsb29rdXBfdGVzdCIpOyAgLy8gdGhpcyBnZXRzIGZvbGRlZCB0byBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFwibG9va3VwX1RFU1RcIiIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYUZvcklkZW50aWZpZXIoIkxPT0tVUF9URVNUIik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJsb29rdXBfdGVzdCIsIHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBUZXN0IikpOwotCQlhc3NlcnROdWxsKHNjaGVtYS5nZXRJZGVudGlmaWVyKCJMb29rdXBfVGVzdCIpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoImxvb2t1cF90ZXN0Iik7Ci0JCWFzc2VydEVxdWFscygibG9va3VwX3Rlc3QiLCBzY2hlbWEuZ2V0SWRlbnRpZmllcigpKTsKLQotCQlzY2hlbWEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiXCJsb29rdXBfVEVTVFwiIik7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoKSk7Ci0JCWFzc2VydEVxdWFscygiXCJsb29rdXBfVEVTVFwiIiwgc2NoZW1hLmdldElkZW50aWZpZXIoImxvb2t1cF9URVNUIikpOwotCi0JCXRoaXMuZHJvcFNjaGVtYSgiXCJsb29rdXBfVEVTVFwiIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiTE9PS1VQX1RFU1QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFRBQkxFX1RFU1QiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEJhckRETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRGb29EREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmF6RERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0JhekRETCgpKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIik7Ci0KLQkJLy8gRk9PCi0JCVRhYmxlIGZvb1RhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiRk9PIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJRCIpOwotCQlhc3NlcnRTYW1lKHBrQ29sdW1uLCBpZENvbHVtbik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGlkQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNQYXJ0T2ZQcmltYXJ5S2V5KCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIlZBUkNIQVIiLCBuYW1lQ29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgbmFtZUNvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlDb2x1bW4gYmFyQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQkFSX0lEIik7Ci0JCWFzc2VydEVxdWFscygiSU5UNCIsIGJhckNvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoYmFyQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFyQ29sdW1uLmlzUGFydE9mUHJpbWFyeUtleSgpKTsKLQotCQlGb3JlaWduS2V5IGJhckZLID0gZm9vVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsgIC8vIHRoZXJlIHNob3VsZCBvbmx5IGJlIDEgZm9yZWlnbiBrZXkKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhckZLLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXJGSy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQlhc3NlcnROdWxsKGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigiYmFyIikpOwotCQlhc3NlcnRFcXVhbHMoImJhcl9pZCIsIGJhckZLLmdldEpvaW5Db2x1bW5Bbm5vdGF0aW9uSWRlbnRpZmllcigicHJpbWFyeUJhciIpKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgYmFyRksuZ2V0QmFzZVRhYmxlKCkpOwotCi0JCWFzc2VydEZhbHNlKGZvb1RhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFNhbWUoc2NoZW1hLCBmb29UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJLy8gQkFSCi0JCVRhYmxlIGJhclRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiQkFSIik7Ci0JCWFzc2VydEVxdWFscygyLCBiYXJUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGJhclRhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGJhclRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShiYXJUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJZVEVBIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQ0hVTksiKS5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgYmFyVGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiQ0hVTksiKS5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCQkvLyBhc3NlcnRUcnVlKGJhclRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkNIVU5LIikuZGF0YVR5cGVJc0xPQigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiRk9PX0JBWiIpOwotCQlhc3NlcnRFcXVhbHMoMiwgZm9vX2JhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZm9vX2JhelRhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRGb3JlaWduS2V5c1NpemUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmpvaW5UYWJsZU5hbWVJc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFRydWUoZm9vX2JhelRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIkZPT19JRCIpLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT09fQkFaIik7Ci0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgIkJBWiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJGT08iKTsKLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAiQkFSIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoIkNSRUFURSBUQUJMRSBCQVIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIElEIGludGVnZXIgUFJJTUFSWSBLRVksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgQ0hVTksgYnl0ZWEiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPTyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgSUQgaW50ZWdlciBQUklNQVJZIEtFWSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBOQU1FIHZhcmNoYXIoMjApLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBUl9JRCBpbnRlZ2VyIFJFRkVSRU5DRVMgQkFSKElEKSIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiKSIpLmFwcGVuZChDUik7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkQmF6RERMKCkgewotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoMjAwKTsKLQkJc2IuYXBwZW5kKCJDUkVBVEUgVEFCTEUgQkFaICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBJRCBpbnRlZ2VyIFBSSU1BUlkgS0VZLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIE5BTUUgdmFyY2hhcigyMCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0JhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiQ1JFQVRFIFRBQkxFIEZPT19CQVogKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEZPT19JRCBpbnQgUkVGRVJFTkNFUyBGT08oSUQpLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIEJBWl9JRCBpbnQgUkVGRVJFTkNFUyBCQVooSUQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbHVtbkxvb2t1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiVEFCTEVfVEVTVCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFNDSEVNQSBUQUJMRV9URVNUIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFRBQkxFX1RFU1QiKTsKLQotCQkvLyBsb3dlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoaWQgaW50LCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlUYWJsZSB0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigibmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gdXBwZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKElEIGludCwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcigiVEFCTEVfVEVTVCIpLmdldFRhYmxlRm9ySWRlbnRpZmllcigidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlRBQkxFX1RFU1QiLCAidGVzdCIpOwotCi0JCS8vIG1peGVkIGNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgVEFCTEUgdGVzdCAoSWQgaW50LCBOYW1lIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiSWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiTmFtZSIpKTsKLQotCQl0aGlzLmRyb3BUYWJsZSgiVEFCTEVfVEVTVCIsICJ0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiQ1JFQVRFIFRBQkxFIHRlc3QgKFwiSWRcIiBpbnQsIFwiTmFtZVwiIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKCJUQUJMRV9URVNUIikuZ2V0VGFibGVGb3JJZGVudGlmaWVyKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiXCJJZFwiIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIlwiTmFtZVwiIikpOwotCi0JCXRoaXMuZHJvcFRhYmxlKCJUQUJMRV9URVNUIiwgInRlc3QiKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJUQUJMRV9URVNUIik7Ci0KLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5yZW1vdmVDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3Jvc3NTY2hlbWFSZWZlcmVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDEiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gWFJFRl9URVNUMSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBPUkcgKElEIGludGVnZXIgUFJJTUFSWSBLRVksIE5BTUUgdmFyY2hhcigyMCkpIik7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0NIRU1BIFhSRUZfVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJTRVQgc2VhcmNoX3BhdGggVE8gWFJFRl9URVNUMiIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBUQUJMRSBFTVAgKElEIGludGVnZXIgUFJJTUFSWSBLRVksIE5BTUUgdmFyY2hhcigyMCksICIgKwotCQkJCSJPUkdfSUQgaW50ZWdlciBSRUZFUkVOQ0VTIFhSRUZfVEVTVDEuT1JHKElEKSkiKTsKLQotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoInhyZWZfdGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWExKTsKLQkJVGFibGUgb3JnVGFibGUgPSBzY2hlbWExLmdldFRhYmxlTmFtZWQoIm9yZyIpOwotCQlhc3NlcnROb3ROdWxsKG9yZ1RhYmxlKTsKLQotCQlTY2hlbWEgc2NoZW1hMiA9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFOYW1lZCgieHJlZl90ZXN0MiIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygib3JnIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygib3JnX2lkIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5kcm9wVGFibGUoIlhSRUZfVEVTVDIiLCAiRU1QIik7Ci0JCXRoaXMuZHJvcFNjaGVtYSgiWFJFRl9URVNUMiIpOwotCQl0aGlzLmRyb3BUYWJsZSgiWFJFRl9URVNUMSIsICJPUkciKTsKLQkJdGhpcy5kcm9wU2NoZW1hKCJYUkVGX1RFU1QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRyb3BUYWJsZShTdHJpbmcgc2NoZW1hTmFtZSwgU3RyaW5nIHRhYmxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNjaGVtYSBzY2hlbWE9IHRoaXMuZ2V0RGVmYXVsdENhdGFsb2coKS5nZXRTY2hlbWFGb3JJZGVudGlmaWVyKHNjaGVtYU5hbWUpOwotCQlpZiAoc2NoZW1hICE9IG51bGwpIHsKLQkJCWlmIChzY2hlbWEuZ2V0VGFibGVGb3JJZGVudGlmaWVyKHRhYmxlTmFtZSkgIT0gbnVsbCkgewotCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBUQUJMRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHRhYmxlTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHJvcFNjaGVtYShTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hRm9ySWRlbnRpZmllcihuYW1lKSAhPSBudWxsKSB7Ci0JCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkRST1AgU0NIRU1BICIgKyBuYW1lICsgIiBDQVNDQURFIik7Ci0JCX0KLQl9Ci0KLS8vIHNlZSAyNDE1NzgvMjQxNTU3Ci0vLwlwdWJsaWMgdm9pZCB0ZXN0U2VxdWVuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLS8vCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0vLwotLy8JCXRoaXMuZHJvcFNlcXVlbmNlKCJTRVFVRU5DRV9URVNUIiwgIkZPTyIpOwotLy8JCXRoaXMuZHJvcFNjaGVtYSgiU0VRVUVOQ0VfVEVTVCIpOwotLy8KLS8vCQl0aGlzLmV4ZWN1dGVVcGRhdGUoIkNSRUFURSBTQ0hFTUEgU0VRVUVOQ0VfVEVTVCIpOwotLy8JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiU0VUIHNlYXJjaF9wYXRoIFRPIFNFUVVFTkNFX1RFU1QiKTsKLS8vCi0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXJEREwoKSk7Ci0vLwkJdGhpcy5leGVjdXRlVXBkYXRlKCJDUkVBVEUgU0VRVUVOQ0UgRk9PIFNUQVJUIDEiKTsKLS8vLy8JCUxpc3Q8T2JqZWN0W10+IGxpc3QgPSB0aGlzLmV4ZWN1dGUoIlNFTEVDVCBuZXh0dmFsKCdmb28nKSIpOwotLy8vLwkJU3lzdGVtLm91dC5wcmludGxuKGxpc3QpOwotLy8JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotLy8KLS8vCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREZWZhdWx0Q2F0YWxvZygpLmdldFNjaGVtYU5hbWVkKCJTRVFVRU5DRV9URVNUIik7Ci0vLwkJU2VxdWVuY2Ugc2VxdWVuY2UgPSBzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZCgiRk9PIik7Ci0vLwkJYXNzZXJ0Tm90TnVsbChzZXF1ZW5jZSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJmb29fc2VxIiwgc2VxdWVuY2UuZ2V0TmFtZSgpKTsKLS8vCi0vLwkJdGhpcy5kcm9wU2VxdWVuY2UoIlNFUVVFTkNFX1RFU1QiLCAiRk9PIik7Ci0vLwkJdGhpcy5kcm9wU2NoZW1hKCJTRVFVRU5DRV9URVNUIik7Ci0vLwotLy8JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLS8vCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmRpc2Nvbm5lY3QoKTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIHZvaWQgZHJvcFNlcXVlbmNlKFN0cmluZyBzY2hlbWFOYW1lLCBTdHJpbmcgc2VxdWVuY2VOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQlTY2hlbWEgc2NoZW1hPSB0aGlzLmdldERlZmF1bHRDYXRhbG9nKCkuZ2V0U2NoZW1hTmFtZWQoc2NoZW1hTmFtZSk7Ci0vLwkJaWYgKHNjaGVtYSAhPSBudWxsKSB7Ci0vLwkJCWlmIChzY2hlbWEuZ2V0U2VxdWVuY2VOYW1lZChzZXF1ZW5jZU5hbWUpICE9IG51bGwpIHsKLS8vCQkJCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiRFJPUCBTRVFVRU5DRSAiICsgc2NoZW1hTmFtZSArICcuJyArIHNlcXVlbmNlTmFtZSk7Ci0vLwkJCX0KLS8vCQl9Ci0vLwl9Ci0vLwotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1NRTFNlcnZlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ2NTgzZi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU1FMU2VydmVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybXM7Ci0KLQotLyoqCi0gKiAgU1FMIFNlcnZlciAyMDA1IERyaXZlciBUZXN0Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNRTFNlcnZlclRlc3RzIGV4dGVuZHMgRFRQUGxhdGZvcm1UZXN0cyB7Ci0KLQlwdWJsaWMgU1FMU2VydmVyVGVzdHMoIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCBuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBsYXRmb3JtUHJvcGVydGllc0ZpbGVOYW1lKCkgewotCQlyZXR1cm4gInNxbHNlcnZlci5wcm9wZXJ0aWVzIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlck5hbWUoKSB7Ci0JCXJldHVybiAiTWljcm9zb2Z0IFNRTCBTZXJ2ZXIgMjAwNSBKREJDIERyaXZlciI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJEZWZpbml0aW9uSUQoKSB7Ci0JCXJldHVybiAiRHJpdmVyRGVmbi5NaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm1zZnQuc3Fsc2VydmVyLjIwMDUuZHJpdmVyVGVtcGxhdGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiU1FMU2VydmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERhdGFiYXNlVmVyc2lvbigpIHsKLQkJcmV0dXJuICIyMDA1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckNsYXNzKCkgewotCQlyZXR1cm4gImNvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIlNRTFNlcnZlcl8yMDA1IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJNaWNyb3NvZnQgU1FMIFNlcnZlciAyMDA1IEpEQkMgUHJvZmlsZSBbVGVzdF0iOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvdmlkZXJJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5LmRiLmdlbmVyaWMuY29ubmVjdGlvblByb2ZpbGUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIHN1cHBvcnRzQ2F0YWxvZ3MoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGV4ZWN1dGVPZmZsaW5lVGVzdHMoKSB7Ci0JCXJldHVybiB0cnVlOyAgLy8gaGF2ZW4ndCBhY3R1YWxseSB0cmllZCB0aGlzIHlldC4uLgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZGIvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm1zL1N5YmFzZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY5MWQ3YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5kYi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9kYi90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybXMvU3liYXNlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIudGVzdHMuaW50ZXJuYWwucGxhdGZvcm1zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5zcW0uY29yZS5ydGUuSUNhdGFsb2dPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5kYi5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZGIuRm9yZWlnbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmRiLlRhYmxlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTeWJhc2VUZXN0cyBleHRlbmRzIERUUFBsYXRmb3JtVGVzdHMgewotCi0JcHVibGljIFN5YmFzZVRlc3RzKCBTdHJpbmcgbmFtZSkgewotCQlzdXBlciggbmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQbGF0Zm9ybVByb3BlcnRpZXNGaWxlTmFtZSgpIHsKLQkJcmV0dXJuICJzeWJhc2UucHJvcGVydGllcyI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJOYW1lKCkgewotCQlyZXR1cm4gIlN5YmFzZSBKREJDIERyaXZlciBmb3IgU3liYXNlIEFTRSAxNS54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25JRCgpIHsKLQkJcmV0dXJuICJEcml2ZXJEZWZuLlN5YmFzZSBKREJDIERyaXZlciBmb3IgU3liYXNlIEFTRSAxNS54IjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERyaXZlckRlZmluaXRpb25UeXBlKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZGIuc3liYXNlLmFzZS5nZW5lcmljRHJpdmVyVGVtcGxhdGVfMTUiOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGF0YWJhc2VWZW5kb3IoKSB7Ci0JCXJldHVybiAiU3liYXNlX0FTRSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREYXRhYmFzZVZlcnNpb24oKSB7Ci0JCXJldHVybiAiMTUueCI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREcml2ZXJDbGFzcygpIHsKLQkJcmV0dXJuICJjb20uc3liYXNlLmpkYmMzLmpkYmMuU3liRHJpdmVyIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2ZpbGVOYW1lKCkgewotCQlyZXR1cm4gIlN5YmFzZV8xNSI7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9maWxlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAiU3liYXNlIEFTRSAxNSBqQ29ubmVjdCBKREJDIFByb2ZpbGUgW1Rlc3RdIjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdXBwb3J0c0NhdGFsb2dzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBleGVjdXRlT2ZmbGluZVRlc3RzKCkgewotCQkvLyB3b3JraW5nIG9mZmxpbmUgaXMgcHJldHR5IHVnbHkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN5YmFzZSAiZGF0YWJhc2VzIiBiZWNvbWUgRFRQICJjYXRhbG9ncyIKLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB0ZXN0MSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgdGVzdDIiKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB0ZXN0MSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlDYXRhbG9nIGNhdGFsb2cxID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGVzdDEiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMSk7Ci0JCVNjaGVtYSBzY2hlbWExID0gY2F0YWxvZzEuZ2V0U2NoZW1hTmFtZWQoImRibyIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTEpOwotCQlhc3NlcnRTYW1lKHNjaGVtYTEsIGNhdGFsb2cxLmdldERlZmF1bHRTY2hlbWEoKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgdGVzdDIiKTsKLQkJQ2F0YWxvZyBjYXRhbG9nMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QyIik7Ci0JCWFzc2VydE51bGwoY2F0YWxvZzIpOyAgLy8gc2hvdWxkIGJlIG51bGwgdW50aWwgcmVmcmVzaAotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlhc3NlcnRTYW1lKHRoaXMuZ2V0RGF0YWJhc2UoKSwgbGlzdGVuZXIuY2hhbmdlZERhdGFiYXNlKTsKLQotCQljYXRhbG9nMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRlc3QyIik7Ci0JCWFzc2VydE5vdE51bGwoY2F0YWxvZzIpOwotCQlTY2hlbWEgc2NoZW1hMiA9IGNhdGFsb2cyLmdldERlZmF1bHRTY2hlbWEoKTsKLQkJYXNzZXJ0Tm90TnVsbChzY2hlbWEyKTsKLQotCQlhc3NlcnROb3RTYW1lKGNhdGFsb2cxLCB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MSIpKTsgIC8vIHdlIHNob3VsZCBoYXZlIGEgbmV3IGNhdGFsb2cgYWZ0ZXIgdGhlIHJlZnJlc2gKLQkJYXNzZXJ0Tm90U2FtZShzY2hlbWExLCB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJ0ZXN0MSIpLmdldERlZmF1bHRTY2hlbWEoKSk7ICAvLyB3ZSBzaG91bGQgaGF2ZSBhIG5ldyBzY2hlbWEgYWZ0ZXIgdGhlIHJlZnJlc2gKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHRlc3QxIik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRhYmxlX3Rlc3QiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgZGF0YWJhc2UgdGFibGVfdGVzdCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygidGFibGVfdGVzdCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkQmFyRERMKCkpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUodGhpcy5idWlsZEZvb0RETCgpKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKHRoaXMuYnVpbGRCYXpEREwoKSk7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSh0aGlzLmJ1aWxkRm9vQmF6RERMKCkpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQlTY2hlbWEgc2NoZW1hID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgidGFibGVfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKTsKLQotCQkvLyBmb28KLQkJVGFibGUgZm9vVGFibGUgPSBzY2hlbWEuZ2V0VGFibGVOYW1lZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBmb29UYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldFByaW1hcnlLZXlDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzU2l6ZSgpKTsKLQotCQlDb2x1bW4gcGtDb2x1bW4gPSBmb29UYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBwa0NvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gaWRDb2x1bW4gPSBmb29UYWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKTsKLQkJYXNzZXJ0U2FtZShmb29UYWJsZSwgaWRDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydFNhbWUocGtDb2x1bW4sIGlkQ29sdW1uKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzUGFydE9mRm9yZWlnbktleSgpKTsKLQkJYXNzZXJ0VHJ1ZShpZENvbHVtbi5pc1BhcnRPZlVuaXF1ZUNvbnN0cmFpbnQoKSk7Ci0JCWFzc2VydEZhbHNlKGlkQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBpZENvbHVtbi5nZXREYXRhVHlwZU5hbWUoKSk7Ci0JCWFzc2VydFRydWUoaWRDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaWRDb2x1bW4uZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgaWRDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgaWRDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShpZENvbHVtbi5pc0xPQigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBpZENvbHVtbi5nZXRKYXZhVHlwZURlY2xhcmF0aW9uKCkpOwotCi0JCUNvbHVtbiBuYW1lQ29sdW1uID0gZm9vVGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKTsKLQkJYXNzZXJ0RmFsc2UobmFtZUNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCQlhc3NlcnRUcnVlKG5hbWVDb2x1bW4uaXNQYXJ0T2ZVbmlxdWVDb25zdHJhaW50KCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzTnVsbGFibGUoKSk7ICAvLyBpbXBsaWVkICJOT1QgTlVMTCIgPwotCi0JCWFzc2VydEVxdWFscygiVkFSQ0hBUiIsIG5hbWVDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzTnVtZXJpYygpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBuYW1lQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCBuYW1lQ29sdW1uLmdldFNjYWxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjAsIG5hbWVDb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRGYWxzZShuYW1lQ29sdW1uLmlzTE9CKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBuYW1lQ29sdW1uLmdldEphdmFUeXBlRGVjbGFyYXRpb24oKSk7Ci0KLQkJQ29sdW1uIGJhckNvbHVtbiA9IGZvb1RhYmxlLmdldENvbHVtbk5hbWVkKCJiYXJfaWQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJJTlQiLCBiYXJDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRUcnVlKGJhckNvbHVtbi5pc1BhcnRPZkZvcmVpZ25LZXkoKSk7Ci0JCWFzc2VydEZhbHNlKGJhckNvbHVtbi5pc1BhcnRPZlByaW1hcnlLZXkoKSk7Ci0KLQkJRm9yZWlnbktleSBiYXJGSyA9IGZvb1RhYmxlLmdldEZvcmVpZ25LZXlzKCkuaXRlcmF0b3IoKS5uZXh0KCk7ICAvLyB0aGVyZSBzaG91bGQgb25seSBiZSAxIGZvcmVpZ24ga2V5Ci0JCWFzc2VydEVxdWFscygxLCBiYXJGSy5nZXRDb2x1bW5QYWlyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFyRksuZ2V0QXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoImJhciIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXJfaWQiLCBiYXJGSy5nZXRKb2luQ29sdW1uQW5ub3RhdGlvbklkZW50aWZpZXIoInByaW1hcnlCYXIiKSk7Ci0JCWFzc2VydFNhbWUoZm9vVGFibGUsIGJhckZLLmdldEJhc2VUYWJsZSgpKTsKLQotCQlhc3NlcnRGYWxzZShmb29UYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRTYW1lKHNjaGVtYSwgZm9vVGFibGUuZ2V0U2NoZW1hKCkpOwotCi0JCS8vIEJBUgotCQlUYWJsZSBiYXJUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGJhclRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmFyVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYmFyVGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGJhclRhYmxlLmlzUG9zc2libGVKb2luVGFibGUoKSk7Ci0JCUNvbHVtbiBjaHVua0NvbHVtbiA9IGJhclRhYmxlLmdldENvbHVtbk5hbWVkKCJjaHVuayIpOwotCQlhc3NlcnRFcXVhbHMoIklNQUdFIiwgY2h1bmtDb2x1bW4uZ2V0RGF0YVR5cGVOYW1lKCkpOwotCQlhc3NlcnRGYWxzZShjaHVua0NvbHVtbi5pc051bWVyaWMoKSk7Ci0JCWFzc2VydFRydWUoY2h1bmtDb2x1bW4uaXNMT0IoKSk7Ci0JCWFzc2VydEVxdWFscygiYnl0ZVtdIiwgY2h1bmtDb2x1bW4uZ2V0SmF2YVR5cGVEZWNsYXJhdGlvbigpKTsKLQkJYXNzZXJ0U2FtZShiYXJUYWJsZSwgYmFyRksuZ2V0UmVmZXJlbmNlZFRhYmxlKCkpOwotCi0JCS8vIEJBWgotCQlUYWJsZSBiYXpUYWJsZSA9IHNjaGVtYS5nZXRUYWJsZU5hbWVkKCJiYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGJhelRhYmxlLmdldENvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYmF6VGFibGUuZ2V0UHJpbWFyeUtleUNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCi0JCUNvbHVtbiBuaWNrbmFtZUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJuaWNrbmFtZSIpOwotCQlhc3NlcnRUcnVlKG5pY2tuYW1lQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJQ29sdW1uIHNvbmdDb2x1bW4gPSBiYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgic29uZyIpOwotCQlhc3NlcnRGYWxzZShzb25nQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0KLQkJQ29sdW1uIHNhbGFyeUNvbHVtbiA9IGJhelRhYmxlLmdldENvbHVtbk5hbWVkKCJzYWxhcnkiKTsKLQkJYXNzZXJ0RmFsc2Uoc2FsYXJ5Q29sdW1uLmlzUGFydE9mVW5pcXVlQ29uc3RyYWludCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERUNJTUFMIiwgc2FsYXJ5Q29sdW1uLmdldERhdGFUeXBlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShzYWxhcnlDb2x1bW4uaXNOdW1lcmljKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAsIHNhbGFyeUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygyLCBzYWxhcnlDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgc2FsYXJ5Q29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RmFsc2Uoc2FsYXJ5Q29sdW1uLmlzTE9CKCkpOwotCi0JCS8vIEZPT19CQVoKLQkJVGFibGUgZm9vX2JhelRhYmxlID0gc2NoZW1hLmdldFRhYmxlTmFtZWQoImZvb19iYXoiKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZvb19iYXpUYWJsZS5nZXRDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGZvb19iYXpUYWJsZS5nZXRQcmltYXJ5S2V5Q29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBmb29fYmF6VGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5pc1Bvc3NpYmxlSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5qb2luVGFibGVOYW1lSXNEZWZhdWx0KCkpOwotCQlhc3NlcnRUcnVlKGZvb19iYXpUYWJsZS5nZXRDb2x1bW5OYW1lZCgiZm9vX2lkIikuaXNQYXJ0T2ZGb3JlaWduS2V5KCkpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBmb29fYmF6Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSBiYXoiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGZvbyIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgYmFyIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGFibGVfdGVzdCIpOwotCi0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUucmVtb3ZlQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5kaXNjb25uZWN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRCYXJEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBiYXIgKCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIGlkIGludGVnZXIgcHJpbWFyeSBrZXksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgY2h1bmsgaW1hZ2UiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEZvb0RETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGZvbyAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgaW50ZWdlciBwcmltYXJ5IGtleSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuYW1lIHZhcmNoYXIoMjApIHVuaXF1ZSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBiYXJfaWQgaW50ZWdlciByZWZlcmVuY2VzIGJhcihpZCkiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIikiKS5hcHBlbmQoQ1IpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBidWlsZEJhekRETCgpIHsKLQkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDIwMCk7Ci0JCXNiLmFwcGVuZCgiY3JlYXRlIHRhYmxlIGJheiAoIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgaWQgaW50ZWdlciBwcmltYXJ5IGtleSwiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBuaWNrbmFtZSB2YXJjaGFyKDIwKSBudWxsLCIpLmFwcGVuZChDUik7Ci0JCXNiLmFwcGVuZCgiICAgIHNvbmcgdmFyY2hhcigyMCkgbm90IG51bGwsIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgc2FsYXJ5IGRlY2ltYWwoMTAsIDIpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgYnVpbGRGb29CYXpEREwoKSB7Ci0JCVN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigyMDApOwotCQlzYi5hcHBlbmQoImNyZWF0ZSB0YWJsZSBmb29fYmF6ICgiKS5hcHBlbmQoQ1IpOwotCQlzYi5hcHBlbmQoIiAgICBmb29faWQgaW50ZWdlciByZWZlcmVuY2VzIGZvbyhpZCksIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIgICAgYmF6X2lkIGludGVnZXIgcmVmZXJlbmNlcyBiYXooaWQpIikuYXBwZW5kKENSKTsKLQkJc2IuYXBwZW5kKCIpIikuYXBwZW5kKENSKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRhYmxlTG9va3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuY29ubmVjdCgpOwotCQlUZXN0Q29ubmVjdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFRlc3RDb25uZWN0aW9uTGlzdGVuZXIoKTsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5hZGRDb25uZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlSWdub3JlRXJyb3JzKCJkcm9wIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHRhYmxlX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ0YWJsZV9sb29rdXBfdGVzdCIpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QxIChpZCBpbnRlZ2VyLCBuYW1lIHZhcmNoYXIoMjApKSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSB0YWJsZSBURVNUMiAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgW1Rlc3QzXSAoaWQgaW50ZWdlciwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJU2NoZW1hIHNjaGVtYSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInRhYmxlX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlTmFtZWQoInRlc3QxIikpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoInRlc3QxIikpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlTmFtZWQoIlRFU1QyIikpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYS5nZXRUYWJsZUZvcklkZW50aWZpZXIoIlRFU1QyIikpOwotCi0JCWFzc2VydE5vdE51bGwoc2NoZW1hLmdldFRhYmxlRm9ySWRlbnRpZmllcigiW1Rlc3QzXSIpKTsKLQotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgW1Rlc3QzXSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgVEVTVDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QxIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgZGF0YWJhc2UgdGFibGVfbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb2x1bW5Mb29rdXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jb25uZWN0aW9uUHJvZmlsZS5jb25uZWN0KCk7Ci0JCVRlc3RDb25uZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgVGVzdENvbm5lY3Rpb25MaXN0ZW5lcigpOwotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmFkZENvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGVJZ25vcmVFcnJvcnMoImRyb3AgZGF0YWJhc2UgY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIGNvbHVtbl9sb29rdXBfdGVzdCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygiY29sdW1uX2xvb2t1cF90ZXN0Iik7Ci0KLQkJLy8gbG93ZXJjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKGlkIGludGVnZXIsIG5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCVRhYmxlIHRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5OYW1lZCgiaWQiKSk7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uTmFtZWQoIm5hbWUiKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQkvLyB1cHBlcmNhc2UKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgdGVzdCAoSUQgaW50ZWdlciwgTkFNRSB2YXJjaGFyKDIwKSkiKTsKLQkJKChJQ2F0YWxvZ09iamVjdCkgdGhpcy5nZXREVFBEYXRhYmFzZSgpKS5yZWZyZXNoKCk7Ci0KLQkJdGFibGUgPSB0aGlzLmdldERhdGFiYXNlKCkuZ2V0Q2F0YWxvZ05hbWVkKCJjb2x1bW5fbG9va3VwX3Rlc3QiKS5nZXREZWZhdWx0U2NoZW1hKCkuZ2V0VGFibGVOYW1lZCgidGVzdCIpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIklEIikpOwotCQlhc3NlcnROb3ROdWxsKHRhYmxlLmdldENvbHVtbkZvcklkZW50aWZpZXIoIk5BTUUiKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQkvLyBtaXhlZCBjYXNlCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKElkIGludGVnZXIsIE5hbWUgdmFyY2hhcigyMCkpIik7Ci0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCi0JCXRhYmxlID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgiY29sdW1uX2xvb2t1cF90ZXN0IikuZ2V0RGVmYXVsdFNjaGVtYSgpLmdldFRhYmxlTmFtZWQoInRlc3QiKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJJZCIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJOYW1lIikpOwotCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCB0YWJsZSB0ZXN0Iik7Ci0KLQkJLy8gZGVsaW1pdGVkCi0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIHRlc3QgKFtJZF0gaW50ZWdlciwgW05hbWVdIHZhcmNoYXIoMjApKSIpOwotCQkoKElDYXRhbG9nT2JqZWN0KSB0aGlzLmdldERUUERhdGFiYXNlKCkpLnJlZnJlc2goKTsKLQotCQl0YWJsZSA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoImNvbHVtbl9sb29rdXBfdGVzdCIpLmdldERlZmF1bHRTY2hlbWEoKS5nZXRUYWJsZU5hbWVkKCJ0ZXN0Iik7Ci0JCWFzc2VydE5vdE51bGwodGFibGUuZ2V0Q29sdW1uRm9ySWRlbnRpZmllcigiW0lkXSIpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0YWJsZS5nZXRDb2x1bW5Gb3JJZGVudGlmaWVyKCJbTmFtZV0iKSk7Ci0KLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIHRlc3QiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiZHJvcCBkYXRhYmFzZSBjb2x1bW5fbG9va3VwX3Rlc3QiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcm9zc1NjaGVtYVJlZmVyZW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLmNvbm5lY3QoKTsKLQkJVGVzdENvbm5lY3Rpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBUZXN0Q29ubmVjdGlvbkxpc3RlbmVyKCk7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuYWRkQ29ubmVjdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZUlnbm9yZUVycm9ycygiZHJvcCBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coIm1hc3RlciIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImNyZWF0ZSBkYXRhYmFzZSB4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJ4cmVmX3Rlc3QxIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIHRhYmxlIG9yZyAoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB2YXJjaGFyKDIwKSkiKTsKLQotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygibWFzdGVyIik7Ci0JCXRoaXMuZXhlY3V0ZVVwZGF0ZSgiY3JlYXRlIGRhdGFiYXNlIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJjcmVhdGUgdGFibGUgZW1wIChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHZhcmNoYXIoMjApLCAiICsKLQkJCQkib3JnX2lkIGludGVnZXIgcmVmZXJlbmNlcyB4cmVmX3Rlc3QxLi5vcmcoaWQpKSIpOwotCi0JCSgoSUNhdGFsb2dPYmplY3QpIHRoaXMuZ2V0RFRQRGF0YWJhc2UoKSkucmVmcmVzaCgpOwotCQlDYXRhbG9nIGNhdGFsb2cxID0gdGhpcy5nZXREYXRhYmFzZSgpLmdldENhdGFsb2dOYW1lZCgieHJlZl90ZXN0MSIpOwotCQlhc3NlcnROb3ROdWxsKGNhdGFsb2cxKTsKLQkJU2NoZW1hIHNjaGVtYTEgPSBjYXRhbG9nMS5nZXRTY2hlbWFOYW1lZCgiZGJvIik7Ci0JCWFzc2VydE5vdE51bGwoc2NoZW1hMSk7Ci0JCVRhYmxlIG9yZ1RhYmxlID0gc2NoZW1hMS5nZXRUYWJsZU5hbWVkKCJvcmciKTsKLQkJYXNzZXJ0Tm90TnVsbChvcmdUYWJsZSk7Ci0KLQkJQ2F0YWxvZyBjYXRhbG9nMiA9IHRoaXMuZ2V0RGF0YWJhc2UoKS5nZXRDYXRhbG9nTmFtZWQoInhyZWZfdGVzdDIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjYXRhbG9nMik7Ci0JCVNjaGVtYSBzY2hlbWEyID0gY2F0YWxvZzIuZ2V0U2NoZW1hTmFtZWQoImRibyIpOwotCQlhc3NlcnROb3ROdWxsKHNjaGVtYTIpOwotCQlUYWJsZSBlbXBUYWJsZSA9IHNjaGVtYTIuZ2V0VGFibGVOYW1lZCgiZW1wIik7Ci0JCWFzc2VydE5vdE51bGwoZW1wVGFibGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW1wVGFibGUuZ2V0Rm9yZWlnbktleXNTaXplKCkpOwotCQlGb3JlaWduS2V5IGZrID0gZW1wVGFibGUuZ2V0Rm9yZWlnbktleXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGFibGUgcmVmVGFibGUgPSBmay5nZXRSZWZlcmVuY2VkVGFibGUoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWZUYWJsZSk7Ci0JCWFzc2VydEVxdWFscygib3JnIiwgcmVmVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGZrLmdldENvbHVtblBhaXJzU2l6ZSgpKTsKLQkJRm9yZWlnbktleS5Db2x1bW5QYWlyIGNwID0gZmsuZ2V0Q29sdW1uUGFpcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uIGJhc2VDb2x1bW4gPSBjcC5nZXRCYXNlQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygib3JnX2lkIiwgYmFzZUNvbHVtbi5nZXROYW1lKCkpOwotCQlDb2x1bW4gcmVmQ29sdW1uID0gY3AuZ2V0UmVmZXJlbmNlZENvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgcmVmQ29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJdGhpcy5nZXRKREJDQ29ubmVjdGlvbigpLnNldENhdGFsb2coInhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIHRhYmxlIGVtcCIpOwotCQl0aGlzLmdldEpEQkNDb25uZWN0aW9uKCkuc2V0Q2F0YWxvZygieHJlZl90ZXN0MSIpOwotCQl0aGlzLmV4ZWN1dGVVcGRhdGUoImRyb3AgdGFibGUgb3JnIik7Ci0JCXRoaXMuZ2V0SkRCQ0Nvbm5lY3Rpb24oKS5zZXRDYXRhbG9nKCJtYXN0ZXIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHhyZWZfdGVzdDIiKTsKLQkJdGhpcy5leGVjdXRlVXBkYXRlKCJkcm9wIGRhdGFiYXNlIHhyZWZfdGVzdDEiKTsKLQotCQl0aGlzLmNvbm5lY3Rpb25Qcm9maWxlLnJlbW92ZUNvbm5lY3Rpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvblByb2ZpbGUuZGlzY29ubmVjdCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmJmNDBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGNmNDVmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzNDY4NS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSNUdWUgTWFyIDA4IDEyOjA5OjEzIEVTVCAyMDExCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuNQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOWQyNTUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcztidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhtaTtidW5kbGUtdmVyc2lvbj0iWzIuNC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LmNvcmU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHM7YnVuZGxlLXZlcnNpb249IlszLjAuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1mO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjIwMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3JrcztidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMjAwLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjMuMCwyLjAuMCkiLAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iMy44LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNTM0YmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIyMjdjZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5Y2ZjZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gRWNsaXBzZUxpbmsgU3VwcG9ydCAtIENvcmUgVGVzdHMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL0pwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NDU0YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkpwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5KcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHM7Ci0KLS8qKgotICogZGVjZW50cmFsaXplIHRlc3QgY3JlYXRpb24gY29kZQotICogCi0gKiBSZXF1aXJlZCBKYXZhIHN5c3RlbSBwcm9wZXJ0eToKLSAqICAgIC1Eb3JnLmVjbGlwc2UuanB0LmpwYS5qYXI9PGpwYS5qYXIgcGF0aD4KLSAqICAgIC1Eb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmphcj08ZWNsaXBzZWxpbmsuamFyIHBhdGg+Ci0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9KQVJfUFJPUEVSVFkgPSBUZXN0SnBhUHJvamVjdC5KUEFfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19KQVJfUFJPUEVSVFkgPSBUZXN0SnBhUHJvamVjdC5FQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFk7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3QoSnB0SnBhRWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHJlcXVpcmVkSmFyc0V4aXN0cygpIHsKLQkJcmV0dXJuIGpwYUphclByb3BlcnR5RXhpc3RzKCkKLQkJCSYmIGpwYUphckZpbGVFeGlzdHMoKQotCQkJJiYgZWNsaXBzZWxpbmtKYXJQcm9wZXJ0eUV4aXN0cygpCi0JCQkmJiBlY2xpcHNlbGlua0phckZpbGVFeGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphclByb3BlcnR5RXhpc3RzKCkgewotCQlyZXR1cm4gZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkgIT0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGpwYUphckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoSlBBX0pBUl9QUk9QRVJUWSkpKS5leGlzdHMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKSB7Ci0JCXJldHVybiBnZXRTeXN0ZW1Qcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfUFJPUEVSVFkpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlY2xpcHNlbGlua0phckZpbGVFeGlzdHMoKSB7Ci0JCXJldHVybiAobmV3IEZpbGUoZ2V0U3lzdGVtUHJvcGVydHkoRUNMSVBTRUxJTktfSkFSX1BST1BFUlRZKSkpLmV4aXN0cygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJ1aWxkTWlzc2luZ0phckVycm9yTWVzc2FnZSgpIHsKLQkJaWYoICEganBhSmFyUHJvcGVydHlFeGlzdHMoKSkgewotCQkJcmV0dXJuIGVycm9yTWlzc2luZ1Byb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpOwotCQl9Ci0JCWVsc2UgaWYoICEganBhSmFyRmlsZUV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gZXJyb3JKYXJGaWxlRG9lc05vdEV4aXN0KGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfUFJPUEVSVFkpKTsKLQkJfQotCQllbHNlIGlmKCAhIGVjbGlwc2VsaW5rSmFyUHJvcGVydHlFeGlzdHMoKSkgewotCQkJcmV0dXJuIGVycm9yTWlzc2luZ1Byb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9QUk9QRVJUWSk7Ci0JCX0KLQkJcmV0dXJuIGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChnZXRTeXN0ZW1Qcm9wZXJ0eShFQ0xJUFNFTElOS19KQVJfUFJPUEVSVFkpKTsKLQl9Ci0KLQkvKioqKioqKioqKiogcHJpdmF0ZSAqKioqKioqKioqLwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJtaXNzaW5nIEphdmEgc3lzdGVtIHByb3BlcnR5OiBcIiIgKyBwcm9wZXJ0eU5hbWUgKyAiXCIiOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvckphckZpbGVEb2VzTm90RXhpc3QoU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJcmV0dXJuICJKQVIgZmlsZSBkb2Vzbid0IGV4aXN0OiBcIiIgKyBwcm9wZXJ0eVZhbHVlICsgIlwiIjsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3lzdGVtUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmZTVjYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjFfMS5FY2xpcHNlTGluazFfMTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2UgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlBBX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSA9ICJqYXZheC5wZXJzaXN0ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8xOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtTY2hlbWFWZXJzaW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsxXzEuU0NIRU1BX1ZFUlNJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOWE1MjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8xLkVjbGlwc2VMaW5rMV8xOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xSnBhUHJvamVjdFRlc3RzCi0JZXh0ZW5kcyBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXB1YmxpYyBFY2xpcHNlTGluazFfMUpwYVByb2plY3RUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSnBhUGxhdGZvcm1EZXNjcmlwdGlvbiBnZXRKcGFQbGF0Zm9ybURlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzE7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rSnBhUHJvamVjdCBnZXRKcGFQcm9qZWN0KCkgewotCQlyZXR1cm4gKEVjbGlwc2VMaW5rSnBhUHJvamVjdCkgc3VwZXIuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIDEuMSBvcm0gY29udGVudCB0eXBlCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rMV8xQ29udGVudFR5cGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHdpdGggZWNsaXBzZWxpbmsgb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB0aGlzIHRpbWUgd2l0aCBvcm0gY29udGVudCB0eXBlCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhQ29yZVBsdWdpbi5PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIDEuMSBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMU9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgCi0JCQkJSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGluazFfMUNvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlTmFtZSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04sIEVjbGlwc2VMaW5rMV8xLlNDSEVNQV9WRVJTSU9OKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgMS4xIGZpbGUKLQkJY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJLy9kZWxldGUgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGlmZmVyZW50bHlOYW1lZE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0KLQkJLy9jcmVhdGUgdGhlIG9ybTIueG1sIGZpbGUKLQkJY3JlYXRlRWNsaXBzZUxpbmsxXzFPcm1YbWxGaWxlKCJvcm0yLnhtbCIpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UobmV3IFBhdGgoIk1FVEEtSU5GL29ybTIueG1sIikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MXzFfMV9SRVNPVVJDRV9UWVBFLCByZXNvdXJjZS5nZXRSZXNvdXJjZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybTIueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0yLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgb3JtMi54bWwgZmlsZSBiYWNrCi0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8xT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzFfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWQwZmQyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazFfMkNvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUgPSAiamF2YXgucGVyc2lzdGVuY2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmsxXzJDb250ZXh0TW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rUGxhdGZvcm0uVkVSU0lPTl8xXzI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzJKcGFQcm9qZWN0VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MjcyMjUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsxXzJKcGFQcm9qZWN0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52MV8yLkVjbGlwc2VMaW5rMV8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuRGF0YU1vZGVsRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzIAotCWV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmsxXzJKcGFQcm9qZWN0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8yOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pwYVByb2plY3QpIHN1cGVyLmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayAxLjIgb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGluazFfMkNvbnRlbnRUeXBlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkKLQkJLy9kZWxldGUgdGhlIG9ybS54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpCi0JCXJlc291cmNlLmRlbGV0ZShudWxsKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkKLQkJLy9hZGQgdGhlIG9ybS54bWwgZmlsZSB3aXRoIGVjbGlwc2VsaW5rIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmtDb250ZW50VHlwZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5FQ0xJUFNFTElOS19PUk1fWE1MX0NPTlRFTlRfVFlQRSwgcmVzb3VyY2UuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygic3JjL01FVEEtSU5GL29ybS54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkKLQkJCi0JCS8vZGVsZXRlIHRoZSBvcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgdGhpcyB0aW1lIHdpdGggb3JtIGNvbnRlbnQgdHlwZQotCQljcmVhdGVEZWZhdWx0T3JtWG1sRmlsZSgpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCAxLjIgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmsxXzJPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlEYXRhTW9kZWwgY29uZmlnID0KLQkJCURhdGFNb2RlbEZhY3RvcnkuY3JlYXRlRGF0YU1vZGVsKG5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5GSUxFX05BTUUsIAotCQkJCUpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQkJY29uZmlnLmdldERlZmF1bHRPcGVyYXRpb24oKS5leGVjdXRlKG51bGwsIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGVXaXRoRWNsaXBzZUxpbmsxXzJDb250ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoSnB0SnBhQ29yZVBsdWdpbi5ERUZBVUxUX09STV9YTUxfUlVOVElNRV9QQVRILmxhc3RTZWdtZW50KCkpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdEVjbGlwc2VMaW5rMV8yT3JtWG1sRmlsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QQVRILCAKLQkJCQlnZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpLmdldEZvbGRlcigic3JjL01FVEEtSU5GIikuZ2V0RnVsbFBhdGgoKSk7Ci0JCWNvbmZpZy5zZXRQcm9wZXJ0eShKcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLkZJTEVfTkFNRSwgZmlsZU5hbWUpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnBhRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5WRVJTSU9OLCBFY2xpcHNlTGluazFfMi5TQ0hFTUFfVkVSU0lPTik7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwcGluZ0ZpbGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIDEuMiBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rMV8yT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF8xXzJfUkVTT1VSQ0VfVFlQRSwgcmVzb3VyY2UuZ2V0UmVzb3VyY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtMi54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVFY2xpcHNlTGluazFfMk9ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfMV8yX1JFU09VUkNFX1RZUEUsIHJlc291cmNlLmdldFJlc291cmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5Njc5Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuRWNsaXBzZUxpbmsyXzA7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SnBhRmFjZXRWZXJzaW9uU3RyaW5nKCkgewotCQlyZXR1cm4gSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8wOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtTY2hlbWFWZXJzaW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsyXzAuU0NIRU1BX1ZFUlNJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ1NjFlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmsyXzE7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SnBhRmFjZXRWZXJzaW9uU3RyaW5nKCkgewotCQlyZXR1cm4gSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8xOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtTY2hlbWFWZXJzaW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsyXzEuU0NIRU1BX1ZFUlNJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzJDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2ZiYjBlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuRWNsaXBzZUxpbmsyXzI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazJfMkNvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMkNvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SnBhRmFjZXRWZXJzaW9uU3RyaW5nKCkgewotCQlyZXR1cm4gSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8yOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtTY2hlbWFWZXJzaW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsyXzIuU0NIRU1BX1ZFUlNJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzNDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmsyXzNDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDZlZmU4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rMl8zQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucGxhdGZvcm0uSnBhUGxhdGZvcm1EZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuRWNsaXBzZUxpbmsyXzM7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFY2xpcHNlTGluazJfM0NvbnRleHRNb2RlbFRlc3RDYXNlIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGluazJfM0NvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SnBhRmFjZXRWZXJzaW9uU3RyaW5nKCkgewotCQlyZXR1cm4gSnBhRmFjZXQuVkVSU0lPTl8yXzAuZ2V0VmVyc2lvblN0cmluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMl8zOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RWNsaXBzZUxpbmtTY2hlbWFWZXJzaW9uKCkgewotCQlyZXR1cm4gRWNsaXBzZUxpbmsyXzMuU0NIRU1BX1ZFUlNJT047Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjM4MzY4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0VjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnBsYXRmb3JtLkpwYVBsYXRmb3JtRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5Db250ZXh0TW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotCWV4dGVuZHMgQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgSnBhWG1sUmVzb3VyY2UgZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZTsKLQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSA9IGdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkLCBJRGF0YU1vZGVsIGpwYUNvbmZpZykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRlc3RKcGFQcm9qZWN0IHRlc3RKcGFQcm9qZWN0ID0gc3VwZXIuYnVpbGRKcGFQcm9qZWN0KHByb2plY3ROYW1lLCBhdXRvQnVpbGQsIGpwYUNvbmZpZyk7Ci0KLQkJaWYgKGNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sKCkpIHsKLQkJCUVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uT3BlcmF0aW9uIG9wZXJhdGlvbiA9IAotCQkJCW5ldyBFY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbk9wZXJhdGlvbihidWlsZEVjbGlwc2VMaW5rT3JtQ29uZmlnKHRlc3RKcGFQcm9qZWN0KSk7Ci0JCQlvcGVyYXRpb24uZXhlY3V0ZShudWxsLCBudWxsKTsKLQkJfQotCi0JCXJldHVybiB0ZXN0SnBhUHJvamVjdDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVPcm1YbWwoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVFY2xpcHNlTGlua09ybVhtbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyhUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IAotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCXRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzLlZFUlNJT04sIHRoaXMuZ2V0RWNsaXBzZUxpbmtTY2hlbWFWZXJzaW9uKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgQm9vbGVhbi5UUlVFKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVjbGlwc2VMaW5rU2NoZW1hVmVyc2lvbigpIHsKLQkJcmV0dXJuIEVjbGlwc2VMaW5rLlNDSEVNQV9WRVJTSU9OOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFQbGF0Zm9ybURlc2NyaXB0aW9uIGdldEpwYVBsYXRmb3JtRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiAgRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzFfMDsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtKcGFQcm9qZWN0IGdldEpwYVByb2plY3QoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtKcGFQcm9qZWN0KSBzdXBlci5nZXRKcGFQcm9qZWN0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEphdmFFY2xpcHNlTGlua0VudGl0eSBnZXRKYXZhRW50aXR5KCkgewotCQlyZXR1cm4gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBKcGFYbWxSZXNvdXJjZSBnZXRPcm1YbWxSZXNvdXJjZSgpIHsKLQkJcmV0dXJuIHRoaXMuZWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgWG1sRW50aXR5TWFwcGluZ3MgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoWG1sRW50aXR5TWFwcGluZ3MpIHN1cGVyLmdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZ2V0RW50aXR5TWFwcGluZ3MoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncykgc3VwZXIuZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkNTE1NC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9FY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5KcHRGaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLk9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5wbGF0Zm9ybS5KcGFQbGF0Zm9ybURlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkVjbGlwc2VMaW5rSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5vcGVyYXRpb25zLkVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnBsYXRmb3JtLkVjbGlwc2VMaW5rUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKcGFQcm9qZWN0VGVzdHMKLQlleHRlbmRzIENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSnBhUHJvamVjdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZU9ybVhtbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEpwYVBsYXRmb3JtRGVzY3JpcHRpb24gZ2V0SnBhUGxhdGZvcm1EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8wOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBFY2xpcHNlTGlua0pwYVByb2plY3QgZ2V0SnBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua0pwYVByb2plY3QpIHN1cGVyLmdldEpwYVByb2plY3QoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlKTsKLQkJYXNzZXJ0RXF1YWxzKEpwdEpwYUNvcmVQbHVnaW4uT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCS8vYWRkIHRoZSBvcm0ueG1sIGZpbGUgd2l0aCBlY2xpcHNlbGluayBvcm0gY29udGVudCB0eXBlCi0JCWNyZWF0ZURlZmF1bHRPcm1YbWxGaWxlV2l0aEVjbGlwc2VMaW5rQ29udGVudFR5cGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQkJCi0JCQotCQkvL2FkZCB0aGUgb3JtLnhtbCBmaWxlIHRoaXMgdGltZSB3aXRoIG9ybSBjb250ZW50IHR5cGUKLQkJY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXREZWZhdWx0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFDb3JlUGx1Z2luLk9STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZQotCQljcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxGaWxlKCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0RGVmYXVsdEVjbGlwc2VMaW5rT3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCQotCQkvL2RlbGV0ZSB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlIGFuZCB2ZXJpZnkgaXQgaXMgbm90IHJldHVybmVkIGZyb20gZ2V0RGVmYXVsdE9ybVhtbFJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldERlZmF1bHRFY2xpcHNlTGlua09ybVhtbFJlc291cmNlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdE9ybVhtbEZpbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSURhdGFNb2RlbCBjb25maWcgPQotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IE9ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyKCkpOwotCQljb25maWcuc2V0UHJvcGVydHkoSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5DT05UQUlORVJfUEFUSCwgCi0JCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQljb25maWcuZ2V0RGVmYXVsdE9wZXJhdGlvbigpLmV4ZWN1dGUobnVsbCwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0T3JtWG1sRmlsZVdpdGhFY2xpcHNlTGlua0NvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgubGFzdFNlZ21lbnQoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0RWNsaXBzZUxpbmtPcm1YbWxGaWxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC5sYXN0U2VnbWVudCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlJRGF0YU1vZGVsIGNvbmZpZyA9Ci0JCQlEYXRhTW9kZWxGYWN0b3J5LmNyZWF0ZURhdGFNb2RlbChuZXcgRWNsaXBzZUxpbmtPcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm92aWRlcigpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCWdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkuZ2V0Rm9sZGVyKCJzcmMvTUVUQS1JTkYiKS5nZXRGdWxsUGF0aCgpKTsKLQkJY29uZmlnLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuRklMRV9OQU1FLCBmaWxlTmFtZSk7Ci0JCWNvbmZpZy5nZXREZWZhdWx0T3BlcmF0aW9uKCkuZXhlY3V0ZShudWxsLCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnBhWG1sUmVzb3VyY2UgcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZSk7Ci0JCQotCQkvL2FkZCB0aGUgZWNsaXBzZWxpbmstb3JtLnhtbCBmaWxlCi0JCWNyZWF0ZURlZmF1bHRFY2xpcHNlTGlua09ybVhtbEZpbGUoKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKEpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbi5ERUZBVUxUX0VDTElQU0VMSU5LX09STV9YTUxfUlVOVElNRV9QQVRIKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9lY2xpcHNlbGluay1vcm0ueG1sIiwgcmVzb3VyY2UuZ2V0RmlsZSgpLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKS50b1N0cmluZygpKTsKLQkJCi0JCS8vZGVsZXRlIHRoZSBlY2xpcHNlbGluay1vcm0ueG1sIGZpbGUgYW5kIHZlcmlmeSBpdCBpcyBub3QgcmV0dXJuZWQgZnJvbSBnZXRNYXBwaW5nRmlsZVJlc291cmNlKCkKLQkJcmVzb3VyY2UuZGVsZXRlKG51bGwpOwotCQlyZXNvdXJjZSA9IHRoaXMuZ2V0SnBhUHJvamVjdCgpLmdldE1hcHBpbmdGaWxlWG1sUmVzb3VyY2UoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERpZmZlcmVudGx5TmFtZWRNYXBwaW5nRmlsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUpwYVhtbFJlc291cmNlIHJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCi0JCS8vY3JlYXRlIHRoZSBvcm0yLnhtbCBmaWxlCi0JCWNyZWF0ZUVjbGlwc2VMaW5rT3JtWG1sRmlsZSgib3JtMi54bWwiKTsKLQkJcmVzb3VyY2UgPSB0aGlzLmdldEpwYVByb2plY3QoKS5nZXRNYXBwaW5nRmlsZVhtbFJlc291cmNlKG5ldyBQYXRoKCJNRVRBLUlORi9vcm0yLnhtbCIpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZSk7Ci0JCWFzc2VydEVxdWFscyhKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uRUNMSVBTRUxJTktfT1JNX1hNTF9DT05URU5UX1RZUEUsIHJlc291cmNlLmdldENvbnRlbnRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoInNyYy9NRVRBLUlORi9vcm0yLnhtbCIsIHJlc291cmNlLmdldEZpbGUoKS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQotCQkvL2RlbGV0ZSB0aGUgb3JtMi54bWwgZmlsZSBhbmQgdmVyaWZ5IGl0IGlzIG5vdCByZXR1cm5lZCBmcm9tIGdldE1hcHBpbmdGaWxlUmVzb3VyY2UoKQotCQlyZXNvdXJjZS5kZWxldGUobnVsbCk7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2UpOwotCQkKLQkJLy9hZGQgdGhlIG9ybTIueG1sIGZpbGUgYmFjawotCQljcmVhdGVFY2xpcHNlTGlua09ybVhtbEZpbGUoIm9ybTIueG1sIik7Ci0JCXJlc291cmNlID0gdGhpcy5nZXRKcGFQcm9qZWN0KCkuZ2V0TWFwcGluZ0ZpbGVYbWxSZXNvdXJjZShuZXcgUGF0aCgiTUVUQS1JTkYvb3JtMi54bWwiKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2UpOwotCQlhc3NlcnRFcXVhbHMoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkVDTElQU0VMSU5LX09STV9YTUxfQ09OVEVOVF9UWVBFLCByZXNvdXJjZS5nZXRDb250ZW50VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzcmMvTUVUQS1JTkYvb3JtMi54bWwiLCByZXNvdXJjZS5nZXRGaWxlKCkuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9KcHRKcGFFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDA3MTMxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L0pwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmEuSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybS5KcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzOwotCi0vKioKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VMaW5rQ29yZUNvbnRleHRNb2RlbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMucmVxdWlyZWRKYXJzRXhpc3RzKCkpIHsKLQkJCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0pwYVByb2plY3RUZXN0cy5jbGFzcyk7Ci0JCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFKcGFQcm9qZWN0VGVzdHMuY2xhc3MpOwotCQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8ySnBhUHJvamVjdFRlc3RzLmNsYXNzKTsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJCXN1aXRlLmFkZFRlc3QoSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5zdWl0ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCXN1aXRlLmFkZFRlc3QoVGVzdFN1aXRlLndhcm5pbmcoSnB0SnBhRWNsaXBzZUxpbmtDb3JlVGVzdHMuYnVpbGRNaXNzaW5nSmFyRXJyb3JNZXNzYWdlKCkpKTsKLQkJfQotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi0JcHJpdmF0ZSBKcHRKcGFFY2xpcHNlTGlua0NvcmVDb250ZXh0TW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWQ1NzZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhQ29sbGVjdGlvblRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFDb2xsZWN0aW9uVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHByb2plY3RzOyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQkKLQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldE5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUzID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlMyk7Ci0JCi0JCS8vc2V0IG5hbWUgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZSgiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlMyA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlMy5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbmFtZSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCS8vYWRkIHRoZSBjb2xsZWN0aW9uIHRhYmxlIGFubm90YXRpb24sIHZlcmlmeSBkZWZhdWx0IGNvbGxlY3Rpb24gdGFibGUgbmFtZSBpcyB0aGUgc2FtZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IHRoZSBlbnRpdHkgbmFtZSwgdmVyaWZ5IGRlZmF1bHQgY29sbGVjdGlvbiB0YWJsZSBuYW1lIHVwZGF0ZXMKLQkJZ2V0SmF2YUVudGl0eSgpLnNldFNwZWNpZmllZE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19wcm9qZWN0cyIsIGNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkU2NoZW1hKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUpOwotCQkKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0U2NoZW1hKCkpOwotCQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0U2NoZW1hKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQ29sbGVjdGlvblRhYmxlKTsKLQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJY29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZFNjaGVtYSgiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBzY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZENhdGFsb2coKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCQotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0Q2F0YWxvZygiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldENhdGFsb2coKSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuc2V0Q2F0YWxvZyhudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLnNldENhdGFsb2coIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRDYXRhbG9nKCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSk7Ci0JCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZygiZm9vIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Q2F0YWxvZygpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQljb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUpvaW5Db2x1bW4gam9pbkNvbHVtbjIgPSBjb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJam9pbkNvbHVtbjIuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQkKLQkJSm9pbkNvbHVtbiBqb2luQ29sdW1uMyA9IGNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpOwotCQlqb2luQ29sdW1uMy5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4yLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbjMsIGpvaW5Db2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQkKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZVJlc291cmNlID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVSZXNvdXJjZS5nZXRKb2luQ29sdW1uc1NpemUoKSk7Ci0JCQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMSkuZ2V0TmFtZSgpKTsKLQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMCkuZ2V0TmFtZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgam9pblRhYmxlUmVzb3VyY2UuZ2V0Sm9pbkNvbHVtbnNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJY29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQkJCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZVJlc291cmNlLmdldEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCQotCQljb2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhSm9pbkNvbHVtbj4gam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQljb2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCi0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlUmVzb3VyY2UgPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigwKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigxKTsKLQkJam9pblRhYmxlUmVzb3VyY2UuYWRkSm9pbkNvbHVtbigyKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLmpvaW5Db2x1bW5BdCgwKS5zZXROYW1lKCJGT08iKTsKLQkJam9pblRhYmxlUmVzb3VyY2Uuam9pbkNvbHVtbkF0KDEpLnNldE5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVSZXNvdXJjZS5qb2luQ29sdW1uQXQoMikuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQotCQlMaXN0SXRlcmF0b3I8SmF2YUpvaW5Db2x1bW4+IGpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLm1vdmVKb2luQ29sdW1uKDIsIDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJam9pbkNvbHVtbnMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVSZXNvdXJjZS5tb3ZlSm9pbkNvbHVtbigwLCAxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkKLQkJam9pblRhYmxlUmVzb3VyY2UucmVtb3ZlSm9pbkNvbHVtbigxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWpvaW5Db2x1bW5zID0gY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZVJlc291cmNlLnJlbW92ZUpvaW5Db2x1bW4oMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShjb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0Sm9pbkNvbHVtbigpIHsKLQkJLy9UT0RPCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRKb2luQ29sdW1uc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgY29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0VHJ1ZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RnZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgIGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50c1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJmb28iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgImJhciIpOwotCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgY29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludHMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlMaXN0SXRlcmF0b3I8VW5pcXVlQ29uc3RyYWludEFubm90YXRpb24+IHVuaXF1ZUNvbnN0cmFpbnRzID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBjb2xsZWN0aW9uVGFibGUgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uIGpvaW5UYWJsZUFubm90YXRpb24gPSAoQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQotCQljb2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxVbmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbj4gdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zID0gam9pblRhYmxlQW5ub3RhdGlvbi5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQkKLQkJY29sbGVjdGlvblRhYmxlLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsJCQotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJY29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQljb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgyKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24gam9pblRhYmxlQW5ub3RhdGlvbiA9IChDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCQkKLQkJCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9uPiB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMgPSBqb2luVGFibGVBbm5vdGF0aW9uLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQotCi0JCWNvbGxlY3Rpb25UYWJsZS5tb3ZlVW5pcXVlQ29uc3RyYWludCgwLCAxKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucyA9IGpvaW5UYWJsZUFubm90YXRpb24uZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRBbm5vdGF0aW9ucy5uZXh0KCkuY29sdW1uTmFtZUF0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50QW5ub3RhdGlvbnMubmV4dCgpLmNvbHVtbk5hbWVBdCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludEFubm90YXRpb25zLm5leHQoKS5jb2x1bW5OYW1lQXQoMCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVW5pcXVlQ29uc3RyYWludHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlKYXZhQ29sbGVjdGlvblRhYmxlMl8wIGNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wQW5ub3RhdGlvbiBqb2luVGFibGVBbm5vdGF0aW9uID0gKENvbGxlY3Rpb25UYWJsZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihDb2xsZWN0aW9uVGFibGUyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24uYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKCJGT08iKTsKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoIkJBUiIpOwotCQlqb2luVGFibGVBbm5vdGF0aW9uLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMikuYWRkQ29sdW1uTmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCWpvaW5UYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCWpvaW5UYWJsZUFubm90YXRpb24ucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gY29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQotCQlqb2luVGFibGVBbm5vdGF0aW9uLnJlbW92ZVVuaXF1ZUNvbnN0cmFpbnQoMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IGNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJam9pblRhYmxlQW5ub3RhdGlvbi5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBjb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYzA3MDkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuUmVmbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UcmFuc2llbnRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5CYXNpY0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW1iZWRkZWRJZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UcmFuc2llbnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlZlcnNpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1CRUREQUJMRV9UWVBFX05BTUUgPSAiQWRkcmVzcyI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgRU1CRUREQUJMRV9UWVBFX05BTUU7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1dpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdHJpbmc+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhOb25HZW5lcmljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8SW50ZWdlciwgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04sIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8QWRkcmVzcywgUHJvcGVydHlJbmZvPiBwYXJjZWxzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByb3BlcnR5SW5mbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgcGFyY2VsTnVtYmVyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgc2l6ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLm1hdGguQmlnRGVjaW1hbCB0YXg7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvcGVydHlJbmZvLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRm9vIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxGb28+IGVsZW1lbnRDb2xsZWN0aW9uOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkZvby5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEJhc2ljTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oQmFzaWNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJCi0JCXBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBWZXJzaW9uTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVmVyc2lvbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvSWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VtYmVkZGVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVtYmVkZGVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0lEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZElkTWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRW1iZWRkZWRJZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVHJhbnNpZW50TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVHJhbnNpZW50TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVHJhbnNpZW50QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQkKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPbmVUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb01hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCQotCQlwZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9NYW55TWFwcGluZyk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFueVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbiBlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25Bbm5vdGF0aW9uLnNldFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25Bbm5vdGF0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25Bbm5vdGF0aW9uLnNldFRhcmdldENsYXNzKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbkFubm90YXRpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IHRhcmdldCBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldEVudGl0eSBub3QgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIGRlZmF1bHQgc3RpbGwgc2V0LCBoYW5kbGVkIGJ5IHZhbGlkYXRpb24KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQkvL2FkZCB0YXJnZXRFbnRpdHkgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlDbGFzc1JlZiBhZGRyZXNzQ2xhc3NSZWYgPSBjbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCS8vdGVzdCB0YXJnZXQgaXMgbm90IGFuIEVtYmVkZGFibGUsIGRlZmF1bHQgdGFyZ2V0IGVudGl0eSBzdGlsbCBleGlzdHMsIHRoaXMgY2FzZSBoYW5kbGVkIHdpdGggdmFsaWRhdGlvbgotCQlhZGRyZXNzUGVyc2lzdGVudFR5cGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc05vbkdlbmVyaWNDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3NHZW5lcmljQ29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VGFyZ2V0Q2xhc3NOb25HZW5lcmljTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRUYXJnZXRDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRUYXJnZXRDbGFzc0dlbmVyaWNNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVtYmVkZGFibGUgZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBtYXBwaW5nKSB7Ci0JCXJldHVybiAoRW1iZWRkYWJsZSkgUmVmbGVjdGlvblRvb2xzLmV4ZWN1dGVNZXRob2QobWFwcGluZywgImdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZSIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQkvL3RhcmdldCBlbWJlZGRhYmxlIG5vdCBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdAotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQkJLy9hZGQgdGFyZ2V0IGVtYmVkZGFibGUgdG8gdGhlIHBlcnNpc3RlbmNlIHVuaXQsIG5vdyB0YXJnZXQgZW1iZWRkYWJsZSBzaG91bGQgcmVzb2x2ZQotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJQ2xhc3NSZWYgYWRkcmVzc0NsYXNzUmVmID0gY2xhc3NSZWZzLm5leHQoKTsKLQkJVHlwZU1hcHBpbmcgYWRkcmVzc1R5cGVNYXBwaW5nID0gYWRkcmVzc0NsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGFkZHJlc3NUeXBlTWFwcGluZywgdGhpcy5nZXRSZXNvbHZlZFRhcmdldEVtYmVkZGFibGUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKSk7Ci0KLQkJLy90ZXN0IGRlZmF1bHQgc3RpbGwgdGhlIHNhbWUgd2hlbiBzcGVjaWZpZWQgdGFyZ2V0IGVudGl0eSBpdCBzZXQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJmb28iKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFJlc29sdmVkVGFyZ2V0RW1iZWRkYWJsZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcpKTsKLQkJCi0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCQkKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhhZGRyZXNzVHlwZU1hcHBpbmcsIHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlV2l0aEJhc2ljVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCS8vdGFyZ2V0IGlzIGEgYmFzaWMgdHlwZSwgc28gcmVzb2x2ZWQgdGFyZ2V0IGVtYmVkZGFibGUgaXMgbnVsbAotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UmVzb2x2ZWRUYXJnZXRFbWJlZGRhYmxlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVsZW1lbnRDb2xsZWN0aW9uMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5FQUdFUiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQkvL3NldCBmZXRjaCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbjJfMEFubm90YXRpb24gZWxlbWVudENvbGxlY3Rpb24gPSAoRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWxlbWVudENvbGxlY3Rpb24yXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCi0JCS8vc2V0IGZldGNoIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUVtYmVkZGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlTm9uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE5vbkdlbmVyaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLk5PX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkVNQkVEREFCTEVfVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlVHlwZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5CQVNJQ19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5LnNldE5hbWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXlBbm5vdGF0aW9uID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5QW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCW1hcEtleUFubm90YXRpb24gPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldENsYXNzKCJBZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5zZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzc0Fubm90YXRpb24gPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXlDbGFzcyIsIG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXlDbGFzc0Fubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE1hcEtleUNsYXNzQ29sbGVjdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfT1JERVIiLCBvcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlvcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQ29sdW1uQW5ub3RhdGlvbiBjb2x1bW4gPSAoQ29sdW1uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQS5DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9hZGRyZXNzZXMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgZW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NlcyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24obnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKG51bGwpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9hZGRyZXNzZXMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWFubm90YXRpb24uc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInN0YXRlLm5hbWUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7CQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0VtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IHNwZWNpZmllZENsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUVtYmVkZGVkTWFwcGluZyBuZXN0ZWRFbWJlZGRlZE1hcHBpbmcgPSAoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInN0YXRlIikuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG5lc3RlZEVtYmVkZGVkTWFwcGluZy5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMiwgbmVzdGVkQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBuZXN0ZWRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBzdGF0ZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJQmFzaWNNYXBwaW5nIGFiYnJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3RhdGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWJiciIpLmdldE1hcHBpbmcoKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYWJick1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWFiYnJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQlhYmJyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCS8vY2hlY2sgdGhlIG5lc3RlZCBlbWJlZGRlZCAoQWRkcmVzcy5zdGF0ZSkgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gU3RhdGUuYWJicgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoKEVtYmVkZGVkTWFwcGluZykgYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJzdGF0ZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJhYmJyIik7Ci0JCWFzc2VydEVxdWFscygiYWJiciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vY29sbGVjdGlvbiB0YWJsZSBuYW1lCi0KLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0NPTExFQ1RJT05fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xMRUNUSU9OX1RBQkxFIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUNvbHVtbjJfMEFubm90YXRpb24gY29sdW1uID0gKE1hcEtleUNvbHVtbjJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEyXzAuTUFQX0tFWV9DT0xVTU4pOwotCQljb2x1bW4uc2V0TmFtZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CTEFIIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJLy9tb3ZlIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5QW5kVmFsdWVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfRU1CRUREQUJMRV9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZSBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArIl9wYXJjZWxzIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgYWRkcmVzc0VtYmVkZGFibGUgPSAoRW1iZWRkYWJsZSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgY2l0eU1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBhZGRyZXNzRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJjaXR5IikuZ2V0TWFwcGluZygpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInBhcmNlbHMiLCByZXNvdXJjZUZpZWxkLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCi0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyJfcGFyY2VscyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQotCQkKLQkJCi0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJCi0JCWNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUVtYmVkZGFibGUgcHJvcGVydHlJbmZvRW1iZWRkYWJsZSA9IChFbWJlZGRhYmxlKSBjbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCUJhc2ljTWFwcGluZyBwYXJjZWxOdW1iZXJNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcHJvcGVydHlJbmZvRW1iZWRkYWJsZS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxOdW1iZXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PMSIpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIxIik7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRjEiKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTzEiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUYxIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUobnVsbCk7Ci0JCXBhcmNlbE51bWJlck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKG51bGwpOwotCQlwYXJjZWxOdW1iZXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJcGFyY2VsTnVtYmVyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShudWxsKTsKLQkJZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInBhcmNlbE51bWJlciIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX3BhcmNlbHMiLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFSIik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5GT08yIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyg1LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImNpdHkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg1LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5jaXR5Iik7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLm5hbWUiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleUFuZFZhbHVlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlUHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX0VNQkVEREFCTEVfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkJCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnBhcmNlbE51bWJlciIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuc2l6ZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IHZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzaXplIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0YXgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZU1vdmVTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlBbmRWYWx1ZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9FTUJFRERBQkxFX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSB2YWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5uYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDMsIDIsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLnNpemUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5wYXJjZWxOdW1iZXIiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUubmFtZSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gdmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoInNpemUiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VsTnVtYmVyIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5Iiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVNlbGZSZWZlcmVudGlhbEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuRm9vIik7Ci0JCQotCQkvL0lmIHRoZXJlIGlzIGEgU3RhY2tPdmVyZmxvd0Vycm9yIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGdldCB0aGUgbWFwcGluZwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiZWxlbWVudENvbGxlY3Rpb24iKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKEVudW1lcmF0ZWRDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24gZW51bWVyYXRlZCA9IChNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGVudW1lcmF0ZWQpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRW51bVR5cGUuU1RSSU5HLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZW51bWVyYXRlZC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcEtleVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwodGVtcG9yYWwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5VGVtcG9yYWxVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJdGVtcG9yYWwuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKFRlbXBvcmFsQ29udmVydGVyKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nV2l0aENvbnZlcnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5DTEFTU19JTlNUQU5DRV9DT05WRVJURVIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGVjbGlwc2VsaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlY2xpcHNlbGlua0NvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTk4NDZjLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhRW50aXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuTWFwcGluZ0tleXMyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuRWNsaXBzZUxpbmtNYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFFbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0JCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXJXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQ3VzdG9tZXIuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkxvbmdUaW1lQ3VzdG9tZXIgZXh0ZW5kcyBDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInt9Iik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiTG9uZ1RpbWVDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFppcENvZGUgemlwQ29kZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlppcENvZGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBwbHVzZm91cjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlppcENvZGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGdldEphdmFFbnRpdHkoKS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlnZXRKYXZhRW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlMaXN0SXRlcmF0b3I8Q2xhc3NSZWY+IGNsYXNzUmVmcyA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFNwZWNpZmllZENsYXNzUmVmcygpLml0ZXJhdG9yKCk7Ci0JCWNsYXNzUmVmcy5uZXh0KCk7Ci0JCUphdmFFbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gYWJzdHJhY3RFbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCi0JCU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgbWFwcGVkU3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXNFbnRpdHlIaWVyYWNoeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gY2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJY2xhc3NSZWZzLm5leHQoKTsKLQkJSmF2YUVudGl0eSBqYXZhRW50aXR5ID0gKEphdmFFbnRpdHkpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGphdmFFbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCi0JCUphdmFFbnRpdHkgc3VwZXJjbGFzcyA9IChKYXZhRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscygyLCBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhdHRyaWJ1dGVPdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFBdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVSZXNvdXJjZXMubmV4dCgpKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXR0cmlidXRlT3ZlcnJpZGVzKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGphdmFBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JfQotLy8JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMCwgMSwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMSwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlSXNWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCUphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gZ2V0SmF2YUVudGl0eSgpLmdldE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLS8vCS8vVE9ETyBhZGQgYWxsIG1hcHBpbmcgdHlwZXMgdG8gdGhlIG1hcHBlZCBzdXBlcmNsYXNzIHRvIHRlc3Qgd2hpY2ggb25lcyBhcmUgb3ZlcnJpZGFibGUKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zTWFwcGVkU3VwZXJjbGFzc0luT3JtWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJTGlzdEl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJLy9hZGQgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uIGFzc29jaWF0aW9uT3ZlcnJpZGUgPSAoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiRk9PIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQotCQlhc3NvY2lhdGlvbk92ZXJyaWRlID0gKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlLnNldE5hbWUoIkJBWiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVNTT0NJQVRJT05fT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BU1NPQ0lBVElPTl9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlKYXZhRW50aXR5IGphdmFFbnRpdHkgPSAoSmF2YUVudGl0eSkgY2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBqYXZhRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0KLQkJLy9NYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHJlc291cmNlVHlwZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJLy9pZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQkKLQkJCi0vLwkJLy9UT0RPIGpvaW5Db2x1bW5zIGZvciBkZWZhdWx0IGFzc29jaWF0aW9uIG92ZXJyaWRlcwotLy8vLwlJSm9pbkNvbHVtbiBkZWZhdWx0Sm9pbkNvbHVtbiA9IGRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlLmpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8KLS8vLy8JSU1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChJTWFwcGVkU3VwZXJjbGFzcykgamF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotLy8vLwkKLS8vLy8JSU9uZVRvT25lTWFwcGluZyBhZGRyZXNzTWFwcGluZyA9IChJT25lVG9PbmVNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCUlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSBhZGRyZXNzTWFwcGluZy5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJCQVIiKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZSgiQkFaIik7Ci0vLy8vCQotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgcmVzb3VyY2VUeXBlLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZS5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlcy5BTk5PVEFUSU9OX05BTUUpKTsKLS8vLy8KLS8vLy8JYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLS8vLy8JZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBqYXZhRW50aXR5LmRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLm5leHQoKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKCJGT08iLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkJBWiIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUobnVsbCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkVGFibGUobnVsbCk7Ci0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCByZXNvdXJjZVR5cGUuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0Sm9pbkNvbHVtbi5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIGRlZmF1bHRKb2luQ29sdW1uLmdldFRhYmxlKCkpOwotLy8vLwkKLS8vLy8JamF2YUVudGl0eS5hZGRTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKDApLnNldE5hbWUoImFkZHJlc3MiKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZSA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJCQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gZ2V0SmF2YUVudGl0eSgpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbFRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnNTaXplKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXNzb2NpYXRpb25PdmVycmlkZVJlc291cmNlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8SmF2YUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVSZXNvdXJjZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlUmVzb3VyY2VzLmhhc05leHQoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMSwgMCk7Ci0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIGphdmFBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCAoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSBqYXZhQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgamF2YUFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCi0JCSgoQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVIiKTsKLQkJKChBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkJCi0JCUl0ZXJhdG9yPEphdmFBc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUubW92ZUFubm90YXRpb24oMiwgMCwgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VUeXBlLm1vdmVBbm5vdGF0aW9uKDAsIDEsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbigxLCAgQXNzb2NpYXRpb25PdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBBc3NvY2lhdGlvbk92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSAgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGdldEphdmFFbnRpdHkoKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CQkKLQkJUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDYsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0cmVldCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLmNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJCi0JCUJhc2ljTWFwcGluZyBwbHVzRm91ck1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSB6aXBDb2RlUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInBsdXNmb3VyIikuZ2V0TWFwcGluZygpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSCIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEUiKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVW5pcXVlKEJvb2xlYW4uVFJVRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig2KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCS8vY2hlY2sgdGhlIHRvcC1sZXZlbCBlbWJlZGRlZCAoQ3VzdG9tZXIuYWRkcmVzcykgYXR0cmlidXRlIG92ZXJyaWRlIHRvIHZlcmlmeSBpdCBpcyBnZXR0aW5nIHNldHRpbmdzIGZyb20gdGhlIHNwZWNpZmllZCBjb2x1bW4gb24gWmlwY29kZS5wbHVzZm91cgotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSAoVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlKSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZU5hbWVkKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyg2LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQkKLQkJLy9zZXQgYW4gYXR0cmlidXRlIG92ZXJyaWRlIG9uIEFkZHJlc3MuemlwQ29kZSBlbWJlZGRlZCBtYXBwaW5nCi0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKLS8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0JCUxpc3RJdGVyYXRvcjxDbGFzc1JlZj4gc3BlY2lmaWVkQ2xhc3NSZWZzID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0U3BlY2lmaWVkQ2xhc3NSZWZzKCkuaXRlcmF0b3IoKTsKLQkJUGVyc2lzdGVudFR5cGUgY3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCVBlcnNpc3RlbnRUeXBlIGFkZHJlc3NQZXJzaXN0ZW50VHlwZSA9IHNwZWNpZmllZENsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7CQkKLQkJUGVyc2lzdGVudFR5cGUgemlwQ29kZVBlcnNpc3RlbnRUeXBlID0gc3BlY2lmaWVkQ2xhc3NSZWZzLm5leHQoKS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChFbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RyZWV0IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuY2l0eSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUuemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTG9uZ1RpbWVDdXN0b21lciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsJCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJwbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQkKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSAoKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgKChFbWJlZGRlZE1hcHBpbmcpIGFkZHJlc3NQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiemlwQ29kZSIpLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKS5nZXRPdmVycmlkZU5hbWVkKCJwbHVzZm91ciIpKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkxBSF9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRV9PVkVSUklERSIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gKFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSkgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVOYW1lZCgiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfVEFCTEVfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoMjU1LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQkJCi0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnppcENvZGUucGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkvL1RPRE8gSSBoYXZlIHRoZSBkZWZhdWx0IHdyb25nIGluIHRoaXMgY2FzZSwgYnV0IHRoaXMgd2FzIHdyb25nIGJlZm9yZSBhcyB3ZWxsLiAgTmVlZCB0byBmaXggdGhpcyBsYXRlcgotLy8JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkVGFibGUoKSk7CQotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OX09WRVJSSURFIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpOwotCQlQZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQ3VzdG9tZXIiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Mb25nVGltZUN1c3RvbWVyIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBzcGVjaWZpZWRDbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQlzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpOwotCQlQZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBzcGVjaWZpZWRDbGFzc1JlZnMubmV4dCgpLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCi0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKEVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBjcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhRW50aXR5KCkpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzBBbm5vdGF0aW9uIGNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZWFibGUoZmFsc2UpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQljYWNoZWFibGVBbm5vdGF0aW9uID0gKENhY2hlYWJsZTJfMEFubm90YXRpb24pIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZWFibGUiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOwotCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKHRydWUpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsICBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSwgcGVyc2lzdGVuY2VVbml0LmdldFNoYXJlZENhY2hlTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuVU5TUEVDSUZJRUQpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaGVyaXRlZElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFFbnRpdHkoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YUVudGl0eSgpLmdldFBhcmVudEVudGl0eSgpKS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYmJhNzMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGVSZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleUNvbHVtbjJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk1hcEtleUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMEphdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8SW50ZWdlciwgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXAgYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFubm90YXRpb25UZXN0VHlwZT4gZW1wbG95ZWVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5FTEVNRU5UX0NPTExFQ1RJT04pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RhdGU+IHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiU3RhdGUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8QWRkcmVzcywgUHJvcGVydHlJbmZvPiBwYXJjZWxzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByb3BlcnR5SW5mbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgcGFyY2VsTnVtYmVyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEludGVnZXIgc2l6ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLm1hdGguQmlnRGVjaW1hbCB0YXg7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJvcGVydHlJbmZvLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9VVEVSLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPVVRFUiwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCWpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0KLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IChnZXRKYXZhUGVyc2lzdGVudFR5cGUoKSkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG1hbnlUb01hbnlNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5IiwgbWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYXBLZXkuc2V0TmFtZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hcEtleS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJTWFwS2V5QW5ub3RhdGlvbiBtYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQltYXBLZXkgPSAoTWFwS2V5QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChtYXBLZXkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcyXzAgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcyXzAgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBtYW55VG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nMl8wLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG1hbnlUb01hbnlNYXBwaW5nMl8wLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXMiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcyXzAuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBtYW55VG9NYW55TWFwcGluZzJfMC5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCU1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbiBtYXBLZXlDbGFzc0Fubm90YXRpb24gPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Q2xhc3MiLCBtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW1hcEtleUNsYXNzQW5ub3RhdGlvbi5zZXRWYWx1ZSgibXlNYXBLZXlDbGFzcyIpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJTdHJpbmciKTsKLQkJTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uIG1hcEtleUNsYXNzID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG1hcEtleUNsYXNzLmdldFZhbHVlKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQotCQkvL3Rlc3QgZGVmYXVsdCBzdGlsbCB0aGUgc2FtZSB3aGVuIHNwZWNpZmllZCB0YXJnZXQgZW50aXR5IGl0IHNldAotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXREZWZhdWx0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWFwS2V5Q2xhc3NDb2xsZWN0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLkludGVnZXIiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuSW50ZWdlciIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludFF1ZXVlIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50UXVldWUiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgam9ic01hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiam9icyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5QcmludEpvYiIpOwotCQlNYW55VG9NYW55TWFwcGluZyBxdWV1ZXNNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJxdWV1ZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIGpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgam9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlPcmRlckNvbHVtbjJfMCBqb2JzT3JkZXJDb2x1bW4gPSBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsgLy90aGUgam9pbiB0YWJsZSBuYW1lCi0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIHF1ZXVlc09yZGVyQ29sdW1uID0gcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlqb2JzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIGpvYnNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlxdWV1ZXNPcmRlckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJKChFbnRpdHkpIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1RIRVJfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9PVEhFUl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJcXVldWVzTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50UXVldWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShtYXBwZWRCeT1cInF1ZXVlc1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxQcmludFF1ZXVlPiBxdWV1ZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRKb2IuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbk1hcHBlZEJ5U3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZW1wbG95ZWVzIik7Ci0JCQotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzc18iICsgVFlQRV9OQU1FLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZSBvZiBvd25pbmcgbWFueS10by1tYW55Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LkFkZHJlc3MiKTsKLQkJTWFueVRvTWFueU1hcHBpbmcgb3duaW5nTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pblRhYmxlUmVsYXRpb25zaGlwU3RyYXRlZ3kpIG93bmluZ01hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldFN0cmF0ZWd5KCkpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pblRhYmxlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vam9pbiB0YWJsZSBuYW1lCi0JCQotCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9KT0lOX1RBQkxFIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJ2YWx1ZS5CQVIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkFaIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJMQUgiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCXJlc291cmNlRmllbGQubW92ZUFubm90YXRpb24oMSwgMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigxLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgiY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LnN0YXRlLmZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5zdGF0ZS5mb28iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8SmF2YUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRFcXVhbHMoImtleS5zdGF0ZS5mb28iLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuY2l0eSIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgc3BlY2lmaWVkT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNYXBLZXlFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbiBlbnVtZXJhdGVkID0gKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoZW51bWVyYXRlZCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORywgZW51bWVyYXRlZC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgbWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIG1hbnlUb01hbnlNYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnVtZXJhdGVkLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCQotCQllbnVtZXJhdGVkLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoKChFbnVtZXJhdGVkQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKG1hbnlUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShtYW55VG9NYW55TWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBLZXlUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcyXzAgbWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydE5vdE51bGwodGVtcG9yYWwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleVRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBtYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb24gdGVtcG9yYWwgPSAoTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXRlbXBvcmFsLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKFRlbXBvcmFsQ29udmVydGVyKSBtYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShtYW55VG9NYW55TWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydFNhbWUobWFueVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZiYmNlMC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBzSWQyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEyXzAuTUFQU19JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIEBNYXBzSWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJSmF2YU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFubm90YXRpb24uc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJYW5ub3RhdGlvbi5zZXRWYWx1ZSgiYmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiZm9vIik7Ci0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJCi0JCSgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RmFsc2UoKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoTWFwc0lkMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RmFsc2UoKChKYXZhTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJTWFueVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYWZlNDYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkNhY2hlYWJsZTJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlYWRPbmx5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkT25seSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENoYW5nZVRyYWNraW5nIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JLy9UT0RPIHRlc3QgaW5oZXJpdGluZyBhIGRlZmF1bHQgcmVhZG9ubHkgZnJvbSB5b3Ugc3VwZXJjbGFzcwotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JCQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsvL0Jvb2xlYW4uRkFMU0UgYW5kIG51bGwgcmVhbGx5IG1lYW4gdGhlIHNhbWUgdGhpbmcgc2luY2UgdGhlcmUgYXJlIG9ubHkgMiBzdGF0ZXMgaW4gdGhlIGphdmEgcmVzb3VyY2UgbW9kZWwKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUmVhZE9ubHlVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplckFubm90YXRpb24pOwotCi0KLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBtYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZShmYWxzZSkiLCBjdSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShudWxsKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24pOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlYWJsZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMEFubm90YXRpb24gY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEphdmFSZXNvdXJjZVR5cGUoKS5hZGRBbm5vdGF0aW9uKEpQQTJfMC5DQUNIRUFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbiA9IChDYWNoZWFibGUyXzBBbm5vdGF0aW9uKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0QW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlIiwgY3UpOwotCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKGZhbHNlKSIsIGN1KTsKLQkJCi0JCWNhY2hlYWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5UUlVFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGVhYmxlKHRydWUpIiwgY3UpOwotCQkKLQkJY2FjaGVhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlYWJsZSIsIGN1KTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkucmVtb3ZlQW5ub3RhdGlvbihKUEEyXzAuQ0FDSEVBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNhY2hlYWJsZUFubm90YXRpb24gPSAoQ2FjaGVhYmxlMl8wQW5ub3RhdGlvbikgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEFubm90YXRpb24oSlBBMl8wLkNBQ0hFQUJMRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsICBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlQW5ub3RhdGlvbik7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGVhYmxlIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWFzc2VydEVxdWFscyhTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUsIHBlcnNpc3RlbmNlVW5pdC5nZXRTaGFyZWRDYWNoZU1vZGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuQUxMKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0LnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLlVOU1BFQ0lGSUVEKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJbmhlcml0ZWRJc0RlZmF1bHRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBzdWJDYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGY3OTg2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyQ29sdW1uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDbGFzczJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlUZW1wb3JhbDJfMEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5PbmVUb01hbnkyXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCwgImphdmEudXRpbC5Db2xsZWN0aW9uIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFubm90YXRpb25UZXN0VHlwZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPEFkZHJlc3MsIFByb3BlcnR5SW5mbz4gcGFyY2VsczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJvcGVydHlJbmZvIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBwYXJjZWxOdW1iZXI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgSW50ZWdlciBzaXplOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEubWF0aC5CaWdEZWNpbWFsIHRheDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcm9wZXJ0eUluZm8uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQkJCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklELCAiamF2YS51dGlsLkNvbGxlY3Rpb24iKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkob3JwaGFuUmVtb3ZhbD1mYWxzZSkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIGdldE9ycGhhblJlbW92YWxPZihPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcpIHsKLQkJcmV0dXJuICgoSmF2YU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE9uZVRvTWFueUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb01hbnlNYXBwaW5nKTsKLQotCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9NYW55TWFwcGluZ09ycGhhblJlbW92YWxTcGVjaWZpZWQoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueTJfMEFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7IAkvLyAuZ2V0RWxlbWVudCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnROdWxsKG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQkKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueTJfMEFubm90YXRpb24gb25lVG9NYW55ID0gKE9uZVRvTWFueTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55LmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9NYW55TWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnkyXzBBbm5vdGF0aW9uIG9uZVRvTWFueSA9IChPbmVUb01hbnkyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJb25lVG9NYW55LnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvTWFueS5zZXRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0U2FtZShvbmVUb01hbnlNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JCQotCQlvbmVUb01hbnkuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJcmVzb3VyY2VGaWVsZC5zZXRQcmltYXJ5QW5ub3RhdGlvbihudWxsLCBFbXB0eUl0ZXJhYmxlLjxTdHJpbmc+aW5zdGFuY2UoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlNYXBLZXlBbm5vdGF0aW9uIG1hcEtleSA9IChNYXBLZXlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYXBLZXkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hcEtleS5zZXROYW1lKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JCQotCQltYXBLZXkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkJCQkKLQkJLy9zZXQgbWFwS2V5ICBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkoIm15TWFwS2V5Iik7Ci0JCU1hcEtleUFubm90YXRpb24gbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hcEtleS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleShudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJbWFwS2V5ID0gKE1hcEtleUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE51bGwobWFwS2V5LmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcGxveWVlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3NBbm5vdGF0aW9uID0gKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG1hcEtleUNsYXNzQW5ub3RhdGlvbik7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYXBLZXlDbGFzc0Fubm90YXRpb24uc2V0VmFsdWUoIm15TWFwS2V5Q2xhc3MiKTsKLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleUNsYXNzIiwgbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQl0aGlzLmdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFwS2V5Q2xhc3NBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbWFwS2V5Q2xhc3NBbm5vdGF0aW9uLnNldFZhbHVlKCJteU1hcEtleUNsYXNzIik7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUNsYXNzMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlNYXBLZXlDbGFzczJfMEFubm90YXRpb24gbWFwS2V5Q2xhc3MgPSAoTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oTWFwS2V5Q2xhc3MyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBtYXBLZXlDbGFzcy5nZXRWYWx1ZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlDbGFzczJfMEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCi0JCS8vdGVzdCBkZWZhdWx0IHN0aWxsIHRoZSBzYW1lIHdoZW4gc3BlY2lmaWVkIHRhcmdldCBlbnRpdHkgaXQgc2V0Ci0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCBvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRNYXBLZXlDbGFzc0NvbGxlY3Rpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0KLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCW9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIikuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgb25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFBlcnNpc3RlbnRUeXBlKCJ0ZXN0LlByaW50Sm9iIik7Ci0JCSgoRW50aXR5KSBwcmludEpvYlBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9UQUJMRSIpOwotCi0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRRdWV1ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkobWFwcGVkQnk9XCJxdWV1ZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQ29sdW1uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5MaXN0PFByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50Sm9iIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgUHJpbnRRdWV1ZSBxdWV1ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uTWFwcGVkQnlTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiZW1wbG95ZWUiKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vb3dpbmcgZW50aXR5IHRhYmxlIG5hbWUKLQotCQlFbnRpdHkgYWRkcmVzc0VudGl0eSA9IGdldFBlcnNpc3RlbmNlVW5pdCgpLmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWFwS2V5Q29sdW1uSm9pblRhYmxlU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL2pvaW4gdGFibGUgbmFtZQotCi0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfUFJJTUFSWV9UQUJMRSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbiBjb2x1bW4gPSAoTWFwS2V5Q29sdW1uMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEpQQTJfMC5NQVBfS0VZX0NPTFVNTik7Ci0JCWNvbHVtbi5zZXROYW1lKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUYXJnZXRGb3JlaWduS2V5Sm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQl9Ci0KLQkvL3RhcmdldCBmb3JlaWduIGtleSBjYXNlCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleUNvbHVtbkpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKEpvaW5Db2x1bW5SZWxhdGlvbnNoaXApIG9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJRW50aXR5IGFkZHJlc3NFbnRpdHkgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQlhZGRyZXNzRW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JLy90YXJnZXQgZm9yZWlnbiBrZXkgY2FzZQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzSm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoSm9pbkNvbHVtblJlbGF0aW9uc2hpcCkgb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCk7Ci0KLQotCQlhc3NlcnROdWxsKG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCUVudGl0eSBhZGRyZXNzRW50aXR5ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJYWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuQkxBSCIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ2YWx1ZS5CQVIiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCS8vbW92ZSBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJcmVzb3VyY2VGaWVsZC5tb3ZlQW5ub3RhdGlvbigxLCAwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCXNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkxBSCIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDEsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCBzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygidmFsdWUuQkFSIiwgc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoInZhbHVlLkJBUiIsIHNwZWNpZmllZE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJc3BlY2lmaWVkTWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygicGFyY2VscyIsIHJlc291cmNlRmllbGQuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkKLQkJTGlzdEl0ZXJhdG9yPENsYXNzUmVmPiBjbGFzc1JlZnMgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRTcGVjaWZpZWRDbGFzc1JlZnMoKS5pdGVyYXRvcigpOwotCQljbGFzc1JlZnMubmV4dCgpOwotCQlFbWJlZGRhYmxlIGFkZHJlc3NFbWJlZGRhYmxlID0gKEVtYmVkZGFibGUpIGNsYXNzUmVmcy5uZXh0KCkuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQkKLQkJQmFzaWNNYXBwaW5nIGNpdHlNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgYWRkcmVzc0VtYmVkZGFibGUuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiY2l0eSIpLmdldE1hcHBpbmcoKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRiIpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNikpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNykpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJwYXJjZWxzIiwgcmVzb3VyY2VGaWVsZC5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDQsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1LCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDcsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTY2FsZSgpKTsKLQotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkSW5zZXJ0YWJsZShudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKG51bGwpOwotCQljaXR5TWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgobnVsbCk7Ci0JCWNpdHlNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihudWxsKTsKLQkJY2l0eU1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkU2NhbGUobnVsbCk7Ci0JCWRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZSA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsiX1Byb3BlcnR5SW5mbyIsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgZGVmYXVsdEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGRlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYW5ub3RhdGlvbi5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVLZXlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eUluZm8oKTsKLQkJCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Qcm9wZXJ0eUluZm8iKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uIGF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5CQVIiKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInZhbHVlLkZPTzIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYXBLZXlWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgidmFsdWUuRk9PMiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJjaXR5Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuc3RhdGUuZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoNywgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwYXJjZWxzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQlBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoIkZPTyIpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUuc2V0TmFtZSgia2V5LkJBUiIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoNCwgbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0KLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5BVFRSSUJVVEVfT1ZFUlJJREUpOwotCQlhdHRyaWJ1dGVPdmVycmlkZS5zZXROYW1lKCJrZXkuY2l0eSIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoImtleS5zdGF0ZS5mb28iKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkFUVFJJQlVURV9PVkVSUklERSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlLnNldE5hbWUoInNpemUiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygyLCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFwS2V5VmFsdWVBdHRyaWJ1dGVPdmVycmlkZVNldFZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlS2V5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJvcGVydHlJbmZvKCk7Ci0JCQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuUHJvcGVydHlJbmZvIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCQkKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoInBhcmNlbHMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJdGVyYXRvcjxOZXN0YWJsZUFubm90YXRpb24+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbnMoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygia2V5LmNpdHkiLCAoKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbikgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJrZXkuc3RhdGUuZm9vIiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPEphdmFWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU+IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyg0LCBtYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleVZhbHVlTW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUtleU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5SW5mbygpOwotCQkKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlByb3BlcnR5SW5mbyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgicGFyY2VscyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQltYXBLZXlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxKYXZhQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZE92ZXJyaWRlcyA9IG1hcEtleUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLm1vdmVBbm5vdGF0aW9uKDEsIDAsIEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gYXR0cmlidXRlT3ZlcnJpZGVzID0gcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9ucyhBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCi0JCWFzc2VydEVxdWFscygia2V5LnN0YXRlLmZvbyIsICgoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImtleS5jaXR5IiwgKChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24pIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkT3ZlcnJpZGVzID0gbWFwS2V5QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBzcGVjaWZpZWRPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHNwZWNpZmllZE92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE1hcEtleUVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQlvbmVUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChlbnVtZXJhdGVkKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbnVtVHlwZS5TVFJJTkcsIGVudW1lcmF0ZWQuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChlbnVtZXJhdGVkLmdldFZhbHVlKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTWFwS2V5RW51bWVyYXRlZFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIG9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hcEtleUVudW1lcmF0ZWQyXzBBbm5vdGF0aW9uIGVudW1lcmF0ZWQgPSAoTWFwS2V5RW51bWVyYXRlZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQllbnVtZXJhdGVkLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudW1UeXBlLlNUUklORyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJCi0JCWVudW1lcmF0ZWQuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihNYXBLZXlFbnVtZXJhdGVkMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQlhc3NlcnRGYWxzZShvbmVUb01hbnlNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShvbmVUb01hbnlNYXBwaW5nLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcEtleVRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJb25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoVGVtcG9yYWxDb252ZXJ0ZXIuY2xhc3MpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0ZW1wb3JhbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQkoKFRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1hcEtleVRlbXBvcmFsVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFwS2V5VGVtcG9yYWwyXzBBbm5vdGF0aW9uIHRlbXBvcmFsID0gKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQl0ZW1wb3JhbC5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCQotCQl0ZW1wb3JhbC5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE1hcEtleVRlbXBvcmFsMl8wQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbCgoKFRlbXBvcmFsQ29udmVydGVyKSBvbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9uZVRvTWFueU1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKG9uZVRvTWFueU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5M2E3MjAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMEphdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuTWFwc0lkMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLk9uZVRvT25lMl8wQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmdPcnBoYW5SZW1vdmFsU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZShvcnBoYW5SZW1vdmFsPWZhbHNlKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgIiArIFRZUEVfTkFNRSArICIgb25lVG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREVEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVtYmVkZGVkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCUphdmFPbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBLklEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwc0lkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCU1hcHNJZDJfMEFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShNYXBzSWQyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpOwotCQlhbm5vdGF0aW9uLnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0VmFsdWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJmb28iKTsKLQkJTWFwc0lkMl8wQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE1hcHNJZDJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgYW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBhbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbCgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5JRCkpOwotCQlhc3NlcnRUcnVlKCgoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0TnVsbCgoKEphdmFPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEyXzAuTUFQU19JRCkpOwotCQlhc3NlcnROdWxsKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCS8vIHRoaXMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoaXQgd2FzIGEgYml0IG9mIGEgdGVzdGluZyBoYWNrIGFueXdheS4uLikKLQkJLy8gY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCS8vIHRoZSAqcmVhbCogdGVzdCBpcyB3aGV0aGVyIHRoZSBJZCBhbm5vdGF0aW9uIHN0aWxsIHJlc3VsdHMgaW4gYSAxOjEgbWFwcGluZy4uLgotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkobnVsbCk7ICAvLyBjbGVhciBhbnkgbWFwcGluZyBhbm5vdGF0aW9uCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSUQpOyAgLy8gYWRkIElkIGFubm90YXRpb24KLQkJdGhpcy5nZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhT25lVG9PbmVNYXBwaW5nMl8wKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSUQpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBMl8wLk1BUFNfSUQpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKTsJCi0JCQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLklEKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQTJfMC5NQVBTX0lEKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhQmFzaWNNYXBwaW5nKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSAoZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gb25lVG9PbmVNYXBwaW5nLmdldFJlc29sdmVkVGFyZ2V0RW50aXR5KCkucmVzb2x2ZUF0dHJpYnV0ZU1hcHBpbmcoInN0YXRlLmZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHN0YXRlRm9vTWFwcGluZy5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgSmF2YU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZykgewotCQlyZXR1cm4gKChKYXZhT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZUdldERlZmF1bHRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKS5pc0RlZmF1bHRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkT25lVG9PbmVHZXREZWZhdWx0T3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuaXNEZWZhdWx0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5KCk7Ci0JCXRoaXMuYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBtYXBwaW5nc09ycGhhblJlbW92YWwuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lMl8wQW5ub3RhdGlvbiBvbmVUb09uZSA9IChPbmVUb09uZTJfMEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX09ORSk7Ci0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy5jcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nT3JwaGFuUmVtb3ZhbFNwZWNpZmllZCgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZykuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0JCWFzc2VydE51bGwobWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmUyXzBBbm5vdGF0aW9uIG9uZVRvT25lID0gKE9uZVRvT25lMl8wQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpKTsgCS8vIC5nZXRFbGVtZW50KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE9ycGhhblJlbW92YWwyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdEVudGl0eSgpOwotCQl0aGlzLmFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgb25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob25lVG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9PbmUuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCi0JCW9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQltYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvbmVUb09uZU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbFVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLmNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJdGhpcy5hZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvT25lTWFwcGluZyk7Ci0KLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZTJfMEFubm90YXRpb24gb25lVG9PbmUgPSAoT25lVG9PbmUyXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCQotCQlvbmVUb09uZS5zZXRPcnBoYW5SZW1vdmFsKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0U2FtZShvbmVUb09uZU1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQkJCi0JCW9uZVRvT25lLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5GQUxTRSk7Ci0JCXJlc291cmNlRmllbGQuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcmVkb21pbmFudEpvaW5pbmdTdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5PTkVfVE9fT05FKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZU1hcHBpbmcyXzAgbWFwcGluZyA9IChPbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0KLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZWwuc2V0U3RyYXRlZ3lUb1ByaW1hcnlLZXlKb2luQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19PTkUpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCBtYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgbWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5QUklNQVJZX0tFWV9KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuUFJJTUFSWV9LRVlfSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7CQotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLlBSSU1BUllfS0VZX0pPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzJKYXZhRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzJKYXZhRW50aXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1ZDY2OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rMl8ySmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5EaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkVudGl0eUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSW5oZXJpdGFuY2VBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZE5hdGl2ZVF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5OYW1lZFF1ZXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5QcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuU2Vjb25kYXJ5VGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlNlcXVlbmNlR2VuZXJhdG9yQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UYWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVHZW5lcmF0b3JBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8ySmF2YUVudGl0eVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzJDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQotCi0JcHVibGljIEVjbGlwc2VMaW5rMl8ySmF2YUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoImFzZGYiKTsKLQkJZW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQllbnRpdHkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigxKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDEpOwotCQllbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYXBwZWRTdXBlcmNsYXNzKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJZW50aXR5LmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWVudGl0eS5hZGRTcGVjaWZpZWRTZWNvbmRhcnlUYWJsZSgwKTsKLQkJZW50aXR5LmFkZFNwZWNpZmllZFByaW1hcnlLZXlKb2luQ29sdW1uKDApOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBKUEEuQVRUUklCVVRFX09WRVJSSURFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgSlBBLkFTU09DSUFUSU9OX09WRVJSSURFKTsKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWVudGl0eS5zZXRTcGVjaWZpZWREaXNjcmltaW5hdG9yVmFsdWUoImFzZGYiKTsKLQkJZW50aXR5LmdldERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZW50aXR5LmdldEdlbmVyYXRvckNvbnRhaW5lcigpLmFkZFRhYmxlR2VuZXJhdG9yKCk7Ci0JCWVudGl0eS5nZXRHZW5lcmF0b3JDb250YWluZXIoKS5hZGRTZXF1ZW5jZUdlbmVyYXRvcigpOwotCQllbnRpdHkuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWROYXRpdmVRdWVyeSgwKTsKLQkJZW50aXR5LmdldFF1ZXJ5Q29udGFpbmVyKCkuYWRkTmFtZWRRdWVyeSgwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigxKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDEpOwotCQllbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJZW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMSk7Ci0JCWdldEphdmFQZXJzaXN0ZW50VHlwZSgpLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRhYmxlKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVudGl0eUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oVGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIFNlY29uZGFyeVRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBQcmltYXJ5S2V5Sm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEluaGVyaXRhbmNlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihEaXNjcmltaW5hdG9yVmFsdWVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKFRhYmxlR2VuZXJhdG9yQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihTZXF1ZW5jZUdlbmVyYXRvckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWRRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgTmFtZWROYXRpdmVRdWVyeUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMkphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzJKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwOWMyYmMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfMkphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVtYmVkZGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZENsYXNzQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8ySmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8yQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfMkphdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0SWRDbGFzc1JlZmVyZW5jZSgpLnNldFNwZWNpZmllZElkQ2xhc3NOYW1lKCJteUlkQ2xhc3MiKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDEpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigxKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigxKTsKLQotCQlnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0VHJ1ZShnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbnRpdHkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigxKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDEpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEVtYmVkZGFibGUpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9OdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldElkQ2xhc3NSZWZlcmVuY2UoKS5zZXRTcGVjaWZpZWRJZENsYXNzTmFtZSgibXlJZENsYXNzIik7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZEN1c3RvbUNvbnZlcnRlcigxKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMSk7Ci0JCW1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDEpOwotCQltYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJbWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMSk7Ci0KLQkJZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5OVUxMX1RZUEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFOdWxsVHlwZU1hcHBpbmcpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oTWFwcGVkU3VwZXJjbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oSWRDbGFzc0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfM0phdmFNdWx0aXRlbmFuY3lUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGluazJfM0phdmFNdWx0aXRlbmFuY3lUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjE0ZmIyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmsyXzNKYXZhTXVsdGl0ZW5hbmN5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSW5oZXJpdGFuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLk11bHRpdGVuYW50VHlwZTJfMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfM0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfM0phdmFNdWx0aXRlbmFuY3lUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8zQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfM0phdmFNdWx0aXRlbmFuY3lUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5NVUxUSVRFTkFOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXVsdGl0ZW5hbnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuTVVMVElURU5BTlQsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihuYW1lPVwiZm9vXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5NVUxUSVRFTkFOVCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OLCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU5TKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyh7QFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cImZvb1wiKSwgQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cImJhclwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXVsdGl0ZW5hbnRNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCQkJSlBBLk1BUFBFRF9TVVBFUkNMQVNTLAotCQkJCQlFY2xpcHNlTGluay5NVUxUSVRFTkFOVCwKLQkJCQkJRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXVsdGl0ZW5hbnQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIk1TX1RFTkFOVF9JRFwiKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TXVsdGl0ZW5hbnRSb290RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPigKLQkJCQkJSlBBLkVOVElUWSwKLQkJCQkJSlBBLklOSEVSSVRBTkNFLAotCQkJCQlFY2xpcHNlTGluay5NVUxUSVRFTkFOVCwKLQkJCQkJRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBJbmhlcml0ZW5hY2UiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE11bHRpdGVuYW50IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKG5hbWU9XCJST09UX0VOVElUWV9URU5BTlRfSURcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFN1YlR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJleHRlbmRzICIgKyBUWVBFX05BTUUgKyAiICIpOwotCQkJCXNiLmFwcGVuZCgie30iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIGdldEphdmFNdWx0aXRlbmFuY3koKSB7Ci0JCXJldHVybiBnZXRKYXZhRW50aXR5KCkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0VHlwZSgpKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXVsdGl0ZW5hbnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFR5cGUoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBtdWx0aXRlbmFudCA9IChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKTsKLQotCQltdWx0aXRlbmFudC5zZXRWYWx1ZShNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJbXVsdGl0ZW5hbnQuc2V0VmFsdWUoTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJbXVsdGl0ZW5hbnQuc2V0VmFsdWUoTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5WUEQsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW11bHRpdGVuYW50LnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXVsdGl0ZW5hbnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zIG11bHRpdGVuYW50ID0gKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSwgbXVsdGl0ZW5hbnQuZ2V0VmFsdWUoKSk7Ci0KLQotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5UKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFR5cGUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZTJfMy5UQUJMRV9QRVJfVEVOQU5ULCBtdWx0aXRlbmFudC5nZXRWYWx1ZSgpKTsKLQotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5WUEQpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5WUEQsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwkJCi0JCWFzc2VydEVxdWFscyhNdWx0aXRlbmFudFR5cGUyXzMuVlBELCBtdWx0aXRlbmFudC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SXNJbmNsdWRlQ3JpdGVyaWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmlzSW5jbHVkZUNyaXRlcmlhKCkpOwotCi0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5zZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmlzSW5jbHVkZUNyaXRlcmlhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlhc3NlcnROdWxsKGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW11bHRpdGVuYW50LnNldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJbXVsdGl0ZW5hbnQuc2V0SW5jbHVkZUNyaXRlcmlhKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJbXVsdGl0ZW5hbnQuc2V0SW5jbHVkZUNyaXRlcmlhKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROdWxsKGdldEphdmFNdWx0aXRlbmFuY3koKS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCW11bHRpdGVuYW50ID0gKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKG11bHRpdGVuYW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXVsdGl0ZW5hbnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJYXNzZXJ0TnVsbChnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zIG11bHRpdGVuYW50ID0gKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpOwotCi0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnQuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotCi0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5zZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXVsdGl0ZW5hbnQuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotCi0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5zZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEobnVsbCk7Ci0JCW11bHRpdGVuYW50ID0gKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKG11bHRpdGVuYW50LmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFuZERpc2NyaW1pbmF0b3JDb2x1bW5zID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRUcnVlKHRlbmFuZERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFuZERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBqYXZhTXVsdGl0ZW5hbmN5ID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpOwkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCi0JCSgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJGT08iKTsKLQkJKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigxLCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkJBUiIpOwotCQkoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDIsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFaIik7Ci0KLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBqYXZhTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlMaXN0SXRlcmF0b3I8SmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFuZERpc2NyaW1pbmF0b3JDb2x1bW5zID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQotCQlhc3NlcnRUcnVlKHRlbmFuZERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgdGVuYW5kRGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFuZERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdWx0aXRlbmFudCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11bHRpdGVuYW50KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zU2l6ZShFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWdldEphdmFNdWx0aXRlbmFuY3koKS5yZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDEpOwotCi0JCUl0ZXJhdG9yPE5lc3RhYmxlQW5ub3RhdGlvbj4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zID0gcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb25zKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zLmhhc05leHQoKSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMSk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9ucy5uZXh0KCkpLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zLmhhc05leHQoKSk7Ci0KLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCkuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0KLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb25zLmhhc05leHQoKSk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpLmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXVsdGl0ZW5hbnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIGphdmFNdWx0aXRlbmFuY3kgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCk7CQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCWphdmFNdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlqYXZhTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0KLQkJSXRlcmF0b3I8TmVzdGFibGVBbm5vdGF0aW9uPiBqYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShqYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMpKTsKLQotCi0JCWphdmFNdWx0aXRlbmFuY3kubW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxKYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBqYXZhTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQlqYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbnMoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSBqYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgamF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIGphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0KLQotCQlqYXZhTXVsdGl0ZW5hbmN5Lm1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDAsIDEpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCi0JCWphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9ucyhFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCAoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIGphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSBqYXZhVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsICgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgamF2YVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgamF2YU11bHRpdGVuYW5jeSA9IGdldEphdmFNdWx0aXRlbmFuY3koKTsJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0KLQkJKChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSkpLnNldE5hbWUoIkZPTyIpOwotCQkoKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKDEsIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMuQU5OT1RBVElPTl9OQU1FKSkuc2V0TmFtZSgiQkFSIik7Ci0JCSgoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oMiwgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMy5BTk5PVEFUSU9OX05BTUUpKS5zZXROYW1lKCJCQVoiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zPiB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigyLCAwLCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5tb3ZlQW5ub3RhdGlvbigwLCAxLCBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDEsICBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKDAsICBFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IGphdmFNdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCX0KLQotCS8vTWFwcGVkU3VwZXJjbGFzcyBzcGVjaWZpZXMgbXVsdGl0ZW5hbmN5LCBhbGwgc3ViY2xhc3MgZW50aXRpZXMgYXJlIG11bHRpdGVuYW50IGJ5IGRlZmF1bHQuCi0JcHVibGljIHZvaWQgdGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zV2l0aE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE11bHRpdGVuYW50TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBtdWx0aXRlbmFuY3kgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1TX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJLy9pZiB0aGUgamF2YSBlbnRpdHkgc3BlY2lmaWVzIG11bHRpdGVuYW50LCB0aGVuIGl0IGRvZXMgbm90IGdldCB0aGUgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyBmcm9tIHRoZSBtYXBwZWQgc3VwZXJjbGFzcwotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJURU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCX0KLQotCS8vUm9vdCBlbnRpdHkgc3BlY2lmaWVzIG11bHRpdGVuYW5jeSBhbmQgU0lOR0xFX1RBQkxFIGluaGVyaXRhbmNlLCBhbGwgc3ViY2xhc3MgZW50aXRpZXMgYXJlIG11bHRpdGVuYW50IGJ5IGRlZmF1bHQuCi0JcHVibGljIHZvaWQgdGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zV2l0aEluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNdWx0aXRlbmFudFJvb3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5ID0gZ2V0SmF2YU11bHRpdGVuYW5jeSgpOwotCQlhc3NlcnRUcnVlKG11bHRpdGVuYW5jeS5pc011bHRpdGVuYW50KCkpOyAvL211bHRpdGVuYW50IGJ5IGRlZmF1bHQgZnJvbSByb290IGVudGl0eQotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiUk9PVF9FTlRJVFlfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydFRydWUobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdCBmcm9tIHJvb3QgZW50aXR5Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJST09UX0VOVElUWV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWdldEphdmFFbnRpdHkoKS5nZXRSb290RW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbm90IG11bHRpdGVuYW50IHNpbmNlIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIHRhYmxlIHBlciBjbGFzcwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBnZXRNYXBwaW5nRmlsZSgpLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmFkZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJQVV9URU5BTlRfSUQiKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbm90IG11bHRpdGVuYW50IHNpbmNlIGluaGVyaXRhbmNlIHN0cmF0ZWd5IGlzIHRhYmxlIHBlciBjbGFzcwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJLy9nZXQgdGhlIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1uIGZyb20gdGhlIHBlcnNpc3RlbmNlIHVuaXQgZGVmYXVsdHMgaW5zdGVhZCBvZiB0aGUgcm9vdCBlbnRpdHkgc2luY2UgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUgcGVyIGNsYXNzCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRNdWx0aXRlbmFudCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiUFVfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCi0JCW11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiQ0hJTERfVEVOQU5UX0lEIik7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNISUxEX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7CQkKLQotCQlnZXRKYXZhRW50aXR5KCkuZ2V0Um9vdEVudGl0eSgpLnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLkpPSU5FRCk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNISUxEX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIlBVX1RFTkFOVF9JRCIpOwotCi0JCUphdmFFY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBtdWx0aXRlbmFuY3kgPSBnZXRKYXZhTXVsdGl0ZW5hbmN5KCk7Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc011bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQVV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCS8vaWYgdGhlcmUgYXJlIHNwZWNpZmllZCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zIHRoZW4gdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgZGVmYXVsdCBvbmVzCi0JCW11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRU5USVRZX1RFTkFOVF9JRCIpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXREZWZhdWx0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVOVElUWV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCS8vaWYgamF2YSBlbnRpdHkgaXMgbm90IG11bHRpdGVuYW50IHRoYW4gdGhlcmUgYXJlIG5vIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMKLQkJZ2V0SmF2YU11bHRpdGVuYW5jeSgpLnNldFNwZWNpZmllZE11bHRpdGVuYW50KGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zV2l0aEVudGl0eU1hcHBpbmdzRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIGdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpOwotCQllbnRpdHlNYXBwaW5ncy5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRU1fVEVOQU5UX0lEIik7Ci0KLQkJSmF2YUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeSA9IGdldEphdmFNdWx0aXRlbmFuY3koKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCi0JCS8vZW50aXR5IGlzIG5vdCBsaXN0ZWQgaW4gdGhlIG9ybS54bWwgZmlsZSwgc28gZG9lcyBub3QgZ2V0IGRlZmF1bHQgZnJvbSBlbnRpdHkgbWFwcGluZ3MKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGVudGl0eU1hcHBpbmdzLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQltdWx0aXRlbmFuY3kgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgcGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCS8vaWYgamF2YSBlbnRpdHkgaXMgbm90IFNJTkdMRV9UQUJMRSBtdWx0aXRlbmFudCB0aGFuIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCk7Ci0JCWFzc2VydEVxdWFscygwLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCi0JCS8vaWYgamF2YSBlbnRpdHkgaXMgbm90IFNJTkdMRV9UQUJMRSBtdWx0aXRlbmFudCB0aGFuIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZE11bHRpdGVuYW50KGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIlBVX1RFTkFOVF9JRCIpOwotCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJZW50aXR5TWFwcGluZ3MucmVtb3ZlUGVyc2lzdGVudFR5cGUoMCk7Ci0JCW11bHRpdGVuYW5jeSA9IGdldEphdmFNdWx0aXRlbmFuY3koKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiUFVfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQmFzaWNNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5NDdiOC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua011dGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpY0RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuTVVUQUJMRSwgImphdmEudXRpbC5EYXRlIik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuQ0xBU1NfSU5TVEFOQ0VfQ09OVkVSVEVSLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQliYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVGVtcG9yYWxBbm5vdGF0aW9uIHRlbXBvcmFsID0gKFRlbXBvcmFsQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsVHlwZS5USU1FLCB0ZW1wb3JhbC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKFRlbXBvcmFsQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnRVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0LnNldFZhbHVlKCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRTYW1lKGJhc2ljTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpYygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBiYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gYmFzaWNNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUobnVsbCk7Ci0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbik7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVCYXNpYygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBiYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGVGb3JEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljRGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBiYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc011dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWMoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gYmFzaWNNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhQ2FjaGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhZDc0N2QuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1RpbWVPZkRheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17CQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDYWNoaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNTaGFyZWQoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVBbm5vdGF0aW9uLmdldFNoYXJlZCgpKTsJCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2hhcmVkRmFsc2VVbnNldHNPdGhlckNhY2hlU2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJY2FjaGluZy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSk7Ci0JCWNhY2hpbmcuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig4MDAwKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJCi0JCQotCQkvL2V4aXN0ZW5jZSBjaGVja2luZyBpcyB0aGUgb25seSB0aGluZyB0aGF0IGlzbid0IHVuc2V0IHdoZW4gc2hhcmVkIGlzIHNldCB0byBmYWxzZQotCQlhc3NlcnRUcnVlKGNhY2hpbmcuaXNFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSwgY2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5IHRpbWVPZkRheUV4cGlyeSA9IGNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCXRpbWVPZkRheUV4cGlyeS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnROdWxsKGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsICJmYWxzZSIpOwotCQkKLQkJYXNzZXJ0RmFsc2UoY2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZUFubm90YXRpb24uZ2V0U2hhcmVkKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLkhBUkRfV0VBSywgY2FjaGVBbm5vdGF0aW9uLmdldFR5cGUoKSk7CQkKLQotCQotCQkvL3NldCBzcGVjaWZpZWQgdHlwZSB0byB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCwgdmVyaWZ5IGl0IGlzIG5vdCBzZXQgdG8gZGVmYXVsdAotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGVBbm5vdGF0aW9uLmdldFR5cGUoKSk7CQkKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLnNldFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxULCBFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLnRvU3RyaW5nKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIGNhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRUeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlVHlwZS5IQVJEX1dFQUspOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGUuSEFSRF9XRUFLLCBjYWNoZUFubm90YXRpb24uZ2V0VHlwZSgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlQW5ub3RhdGlvbi5nZXRBbHdheXNSZWZyZXNoKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXRBbHdheXNSZWZyZXNoKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLlRSVUUpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlQW5ub3RhdGlvbi5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldERpc2FibGVIaXRzKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVBbm5vdGF0aW9uLmdldERpc2FibGVIaXRzKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNEaXNhYmxlSGl0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGNhY2hlQW5ub3RhdGlvbi5nZXRDb29yZGluYXRpb25UeXBlKCkpOwkJCi0KLQkKLQkJLy9zZXQgc3BlY2lmaWVkIGNvb3JkaW5hdGlvbiB0eXBlIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoZUFubm90YXRpb24uZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsJCQotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWNhY2hlQW5ub3RhdGlvbi5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGVBbm5vdGF0aW9uLmdldENvb3JkaW5hdGlvblR5cGUoKSk7CQkJCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RIYXNFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKTsJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGluZy5pc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0V4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORykpOwotCQkKLQkJY2FjaGluZy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzRXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuRVhJU1RFTkNFX0NIRUNLSU5HKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGNhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJY2FjaGluZy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19DQUNIRSwgY2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBjYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbiBleGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgY2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRFeGlzdGVuY2VDaGVja2luZyh0cnVlKTsKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rRXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGV4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsJCQotCi0JCi0JCS8vc2V0IHNwZWNpZmllZCBjb29yZGluYXRpb24gdHlwZSB0byB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCwgdmVyaWZ5IGl0IGlzIG5vdCBzZXQgdG8gZGVmYXVsdAotCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgY2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgZXhpc3RlbmNlQ2hlY2tpbmdBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwkJCi0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFLCBjYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeSgpKTsKLQkJCi0JCWNhY2hlQW5ub3RhdGlvbi5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDU3KSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1NyksIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQkKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDU4KSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDU4KSwgY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsKLQkJCi0JCQotCQljYWNoaW5nLnNldEV4cGlyeShudWxsKTsKLQkJY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeVVuc2V0c0V4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQljYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQljYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNSksIGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQkKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDkwMCkpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDkwMCksIGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7CQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDkwMCksIGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFRpbWVPZkRheUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQotCQljYWNoZUFubm90YXRpb24uYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFkZFRpbWVPZkRheUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCUVjbGlwc2VMaW5rVGltZU9mRGF5IHRpbWVPZkRheUV4cGlyeSA9IGNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0Tm90TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnROb3ROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHModGltZU9mRGF5RXhwaXJ5LCBjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVRpbWVPZkRheUV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnROb3ROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJY2FjaGluZy5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUaW1lT2ZEYXlFeHBpcnlVbnNldHNFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoODAwKSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwMCksIGNhY2hlQW5ub3RhdGlvbi5nZXRFeHBpcnkoKSk7CQotCQkKLQkJCi0JCWNhY2hpbmcuYWRkRXhwaXJ5VGltZU9mRGF5KCk7Ci0KLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydE51bGwoY2FjaGVBbm5vdGF0aW9uLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjYWNoZUFubm90YXRpb24uZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXRTaXplKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U2l6ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGNhY2hlQW5ub3RhdGlvbi5nZXRTaXplKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxMDAsIGNhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NJWkVfREVGQVVMVCwgIjMzMyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMzMywgY2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMTAwLCBjYWNoaW5nLmdldFNpemUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJY2FjaGVBbm5vdGF0aW9uLnNldFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBjYWNoZUFubm90YXRpb24uZ2V0U2l6ZSgpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1MCksIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZElzb2xhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUphdmFFY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0KLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRJc29sYXRpb24oRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVEKTsKLQotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVELCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldElzb2xhdGlvbigpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVELCBjYWNoZUFubm90YXRpb24uZ2V0SXNvbGF0aW9uKCkpOwkJCi0KLQotCQkvL3NldCBzcGVjaWZpZWQgY29vcmRpbmF0aW9uIHR5cGUgdG8gdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQsIHZlcmlmeSBpdCBpcyBub3Qgc2V0IHRvIGRlZmF1bHQKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRJc29sYXRpb24oRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVEKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRTcGVjaWZpZWRJc29sYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoZUFubm90YXRpb24uZ2V0SXNvbGF0aW9uKCkpOwkJCi0KLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRJc29sYXRpb24obnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRJc29sYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQsIGNhY2hpbmcuZ2V0SXNvbGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRJc29sYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQsIGNhY2hpbmcuZ2V0SXNvbGF0aW9uKCkpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZUFubm90YXRpb24uc2V0SXNvbGF0aW9uKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRCwgY2FjaGVBbm5vdGF0aW9uLmdldElzb2xhdGlvbigpKTsJCQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVELCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldElzb2xhdGlvbigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJmM2RhMy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQ29udmVydFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEJhc2ljIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImNsYXNzLWluc3RhbmNlXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJjbGFzcy1pbnN0YW5jZVwiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydCBlY2xpcHNlTGlua0NvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0KSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0Lk5PX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuTk9fQ09OVkVSVEVSLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0RGVmYXVsdENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlY2xpcHNlTGlua0NvbnZlcnQuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnROYW1lMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0IGVjbGlwc2VMaW5rQ29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldENvbnZlcnRlck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUJhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYmFzaWNNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQlFY2xpcHNlTGlua0NvbnZlcnQgZWNsaXBzZUxpbmtDb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydCkgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWNsaXBzZUxpbmtDb252ZXJ0LmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQllY2xpcHNlTGlua0NvbnZlcnQuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnRBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJZWNsaXBzZUxpbmtDb252ZXJ0LnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUobnVsbCk7Ci0JCWNvbnZlcnRBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydEFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJOYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydC5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShiYXNpY01hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNGY5OWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhQ29udmVydGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydGVyKG5hbWU9XCJmb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ29udmVydGVyKGNvbnZlcnRlckNsYXNzPUZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YUNvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmdldE5hbWUoKSk7CQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlckNsYXNzKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsJCi0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYjNmNmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YUVtYmVkZGFibGVUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ3VzdG9taXplcihGb28uY2xhc3MiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDaGFuZ2VUcmFja2luZyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFFbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldEN1c3RvbWl6ZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQkKLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyQW5ub3RhdGlvbik7Ci0KLQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlV2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9IGVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplckFubm90YXRpb24uc2V0VmFsdWUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIiLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBlbWJlZGRhYmxlID0gKEVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVRUUklCVVRFIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVEKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhRW50aXR5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyNzllYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5FY2xpcHNlTGlua01hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVhZE9ubHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDdXN0b21pemVyKEZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQ2hhbmdlVHJhY2tpbmciKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkT25seSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFFbnRpdHlUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5CQVNJQ19DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChFY2xpcHNlTGlua01hcHBpbmdLZXlzLkJBU0lDX01BUF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5UUkFOU0ZPUk1BVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoRWNsaXBzZUxpbmtNYXBwaW5nS2V5cy5WQVJJQUJMRV9PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRDdXN0b21pemVyQ2xhc3MoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXIgY3VzdG9taXplciA9ICgoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQotCQkKLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyQW5ub3RhdGlvbik7Ci0KLQotCQljdXN0b21pemVyLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXJBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q3VzdG9taXplckNsYXNzVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gZW50aXR5LmdldEN1c3RvbWl6ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDaGFuZ2VUcmFja2luZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nIGNvbnRleHRDaGFuZ2VUcmFja2luZyA9IGVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBERUZFUlJFRCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gZW50aXR5LmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPQkpFQ1Qgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gREVGRVJSRUQgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gbnVsbCwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZyA9IChFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCS8vVE9ETyB0ZXN0IGluaGVyaXRpbmcgYSBkZWZhdWx0IHJlYWRvbmx5IGZyb20geW91IHN1cGVyY2xhc3MKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZFJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0VudGl0eSBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rRW50aXR5KSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUmVhZE9ubHkgcmVhZE9ubHkgPSBtYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCByZWFkT25seS5pc1JlYWRPbmx5KCkpOwotCQkKLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCXJlYWRPbmx5LnNldFNwZWNpZmllZFJlYWRPbmx5KG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOy8vQm9vbGVhbi5GQUxTRSBhbmQgbnVsbCByZWFsbHkgbWVhbiB0aGUgc2FtZSB0aGluZyBzaW5jZSB0aGVyZSBhcmUgb25seSAyIHN0YXRlcyBpbiB0aGUgamF2YSByZXNvdXJjZSBtb2RlbAotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkUmVhZE9ubHlVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rRW50aXR5IG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtFbnRpdHkpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRPbmx5LmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlYWRPbmx5LmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NDg5ZDUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5JZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLlRlbXBvcmFsQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQoXCJjbGFzcy1pbnN0YW5jZVwiKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRGF0ZSBteURhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFJZE1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUlkTWFwcGluZyBpZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnZlcnQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydCgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSWRNYXBwaW5nIGlkTWFwcGluZyA9IChJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJaWRNYXBwaW5nLnNldENvbnZlcnRlcihUZW1wb3JhbENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoVGVtcG9yYWxDb252ZXJ0ZXIpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVRlbXBvcmFsQW5ub3RhdGlvbiB0ZW1wb3JhbCA9IChUZW1wb3JhbEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbFR5cGUuVElNRSwgdGVtcG9yYWwuZ2V0VmFsdWUoKSk7Ci0JCQotCQlpZE1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlJZE1hcHBpbmcgaWRNYXBwaW5nID0gKElkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydC5zZXRWYWx1ZSgiZm9vIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgaWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0Q29udmVydGVyTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChpZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RmFsc2UoaWRNYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZShpZE1hcHBpbmcsIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gaWRNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyBpZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IGlkTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQltdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbXV0YWJsZUFubm90YXRpb24pOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gaWRNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJLy9zZXQgbXV0YWJsZSBkZWZhdWx0IHRvIGZhbHNlIGluIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHByb3BlcnRpZXMsIHZlcmlmeSBkZWZhdWx0IGluIGphdmEgc3RpbGwgdHJ1ZSBzaW5jZSB0aGlzIGlzIG5vdCBhIERhdGUvQ2FsZW5kYXIKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdE11dGFibGVGb3JEYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUlkRGF0ZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgaWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSBpZE1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc011dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGlkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gaWRNYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzTXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3Y2FiOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFNYW55VG9NYW55TWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19NQU5ZLCBFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhTWFueVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdEdldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgcmVzb3VyY2UgdG8gT1VURVIsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSB2YWx1ZSBmcm9tIHJlc291cmNlLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTM0NmU4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkJCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hbnlUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU1hbnlUb09uZU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Sm9pbkZldGNoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hNYW55VG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaCBjb250ZXh0Sm9pbkZldGNoID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbiBqb2luRmV0Y2hBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgY29udGV4dCB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIElOTkVSIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9VVEVSLCB0ZXN0IGNvbnRleHQKLQkJCi0JCWpvaW5GZXRjaEFubm90YXRpb24uc2V0VmFsdWUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgdmFsdWUgZnJvbSByZXNvdXJjZSwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhbm5vdGF0aW9uLCB0ZXh0IGNvbnRleHQKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoTWFueVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTk0YzI0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9taXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWFkT25seTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkT25seSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTLCBFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEN1c3RvbWl6ZXIoRm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENoYW5nZVRyYWNraW5nIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcmVhZE9ubHkuaXNSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JLy9UT0RPIHRlc3QgaW5oZXJpdGluZyBhIGRlZmF1bHQgcmVhZG9ubHkgZnJvbSB5b3Ugc3VwZXJjbGFzcwotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkT25seS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoUmVhZE9ubHkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtSZWFkT25seSByZWFkT25seSA9IG1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHJlYWRPbmx5LmlzUmVhZE9ubHkoKSk7Ci0JCQotCQlyZWFkT25seS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0KLQkJcmVhZE9ubHkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwocmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ly9Cb29sZWFuLkZBTFNFIGFuZCBudWxsIHJlYWxseSBtZWFuIHRoZSBzYW1lIHRoaW5nIHNpbmNlIHRoZXJlIGFyZSBvbmx5IDIgc3RhdGVzIGluIHRoZSBqYXZhIHJlc291cmNlIG1vZGVsCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRSZWFkT25seVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhSZWFkT25seSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1JlYWRPbmx5IHJlYWRPbmx5ID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZWFkT25seS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydE51bGwocmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcmVhZE9ubHkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1JlYWRPbmx5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVhZE9ubHkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSAoKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDdXN0b21pemVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ29udmVydEFuZEN1c3RvbWl6ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplciBjdXN0b21pemVyID0gKChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q3VzdG9taXplcigpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY3VzdG9taXplckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplckFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0KLQkJCi0JCWN1c3RvbWl6ZXIuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplckFubm90YXRpb24pOwotCi0KLQkJY3VzdG9taXplci5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjdXN0b21pemVyQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEN1c3RvbWl6ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1dpdGhDb252ZXJ0QW5kQ3VzdG9taXplckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBtYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGN1c3RvbWl6ZXIuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQlyZXNvdXJjZVR5cGUucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQljdXN0b21pemVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjdXN0b21pemVyLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCWN1c3RvbWl6ZXJBbm5vdGF0aW9uLnNldFZhbHVlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY3VzdG9taXplci5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NXaXRoQ2hhbmdlVHJhY2tpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZyBjb250ZXh0Q2hhbmdlVHJhY2tpbmcgPSBtYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCBjb250ZXh0IHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIEFUVFJJQlVURSBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIE9CSkVDVCBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIHJlc291cmNlIHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBBVVRPIHNwZWNpZmljYWxseSwgdGVzdCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUNoYW5nZVRyYWNraW5nLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGFubm90YXRpb24sIHRleHQgY29udGV4dAotCQkKLQkJcmVzb3VyY2VUeXBlLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzV2l0aENoYW5nZVRyYWNraW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmcgY29udGV4dENoYW5nZVRyYWNraW5nID0gbWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbiByZXNvdXJjZUNoYW5nZVRyYWNraW5nID0gKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJLy8gYmFzZSBhbm5vdGF0ZWQsIHRlc3QgcmVzb3VyY2UgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gQVVUTyBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8pOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgY29udGV4dENoYW5nZVRyYWNraW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBBVFRSSUJVVEUgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Q2hhbmdlVHJhY2tpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGNvbnRleHRDaGFuZ2VUcmFja2luZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gT0JKRUNUIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZUNoYW5nZVRyYWNraW5nLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIERFRkVSUkVEIHNwZWNpZmljYWxseSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VDaGFuZ2VUcmFja2luZy5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRDaGFuZ2VUcmFja2luZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIEFVVE8gc3BlY2lmaWNhbGx5ICh0aGlzIHRpbWUgZnJvbSBubyBhbm5vdGF0aW9uKSwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dENoYW5nZVRyYWNraW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCXJlc291cmNlQ2hhbmdlVHJhY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlQ2hhbmdlVHJhY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBjb250ZXh0Q2hhbmdlVHJhY2tpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0NmE0ZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lPVwiZm9vXCIsIGRlZmF1bHRPYmplY3RWYWx1ZT1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZT1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlckNvbnZlcnNpb25WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSLCBFY2xpcHNlTGluay5DT05WRVJTSU9OX1ZBTFVFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9iamVjdFR5cGVDb252ZXJ0ZXIobmFtZT1cImZvb1wiLCBkZWZhdWx0T2JqZWN0VmFsdWU9XCJiYXJcIiwgY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlPVwiZlwiLCBvYmplY3RWYWx1ZT1cImZlbWFsZVwiKSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU9iamVjdFR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0KLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnRlcik7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREYXRhVHlwZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGVVcGRhdGVzRnJvbVJlc291cmNlTW9kZWxDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREYXRhVHlwZSgiQmFyIik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKGNvbnZlcnRlcik7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CQotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUgPSBjb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOwotCQljb252ZXJzaW9uVmFsdWUuc2V0RGF0YVZhbHVlKCJGIik7Ci0JCWNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZSgiZmVtYWxlIik7Ci0JCQotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZSBjb252ZXJzaW9uVmFsdWUyID0gY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKTsKLQkJY29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVyc2lvblZhbHVlMi5zZXRPYmplY3RWYWx1ZSgibWFsZSIpOwotCQkKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygibWFsZSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRiIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZW1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnZlcnNpb25WYWx1ZTMgPSBjb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpOwotCQljb252ZXJzaW9uVmFsdWUzLnNldERhdGFWYWx1ZSgiTyIpOwotCQljb252ZXJzaW9uVmFsdWUzLnNldE9iamVjdFZhbHVlKCJtYWxlIik7Ci0JCQotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlID0gcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm1hbGUiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUgPSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoY29udmVyc2lvblZhbHVlMiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoY29udmVyc2lvblZhbHVlMywgY29udmVyc2lvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoY29udmVyc2lvblZhbHVlLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCQotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKS5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgyKS5zZXREYXRhVmFsdWUoIk8iKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0KLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgxKS5zZXREYXRhVmFsdWUoIk0iKTsKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgyKS5zZXREYXRhVmFsdWUoIk8iKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxFY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb24+IHJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJCi0JCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDIsMCk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsMSk7Ci0JCXJlc291cmNlQ29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlckFubm90YXRpb24uZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygzLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMpKTsKLQkJcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgcmVzb3VyY2VDb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIHJlc291cmNlQ29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkYiKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMSkuc2V0RGF0YVZhbHVlKCJNIik7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDIpLnNldERhdGFWYWx1ZSgiTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUoMiwgMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLm1vdmVDb252ZXJzaW9uVmFsdWUoMCwgMSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIk8iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCQotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgxKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiTyIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uVmFsdWVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJGIik7Ci0JCWNvbnZlcnRlckFubm90YXRpb24uYWRkQ29udmVyc2lvblZhbHVlKDEpLnNldERhdGFWYWx1ZSgiTSIpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLmFkZENvbnZlcnNpb25WYWx1ZSgyKS5zZXREYXRhVmFsdWUoIk8iKTsKLQkJCi0JCXRoaXMuZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUoImJheiIpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXoiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQotCQkKLQkJY29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyQW5ub3RhdGlvbi5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRPYmplY3RWYWx1ZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiYmF6Iik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoImJheiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXREZWZhdWx0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGVDb252ZXJ0ZXJDb252ZXJzaW9uVmFsdWUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZmVtYWxlIiwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxNDIzZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBQcml2YXRlT3duZWQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoT25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvTWFueSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASm9pbkZldGNoIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEV4dGVuZHNJbXBsZW1lbnRzVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiaW1wbGVtZW50cyBqYXZhLmlvLlNlcmlhbGl6YWJsZSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPCIgKyBUWVBFX05BTUUgKyAiPiBteVR5cGVzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9NYW55TWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhQcml2YXRlT3duZWRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9NYW55TWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJcHJpdmF0ZU93bmFibGUuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU93bmVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvTWFueU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua1ByaXZhdGVPd25lZEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEpvaW5GZXRjaFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSm9pbkZldGNoT25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rSm9pbkZldGNoIGNvbnRleHRKb2luRmV0Y2ggPSBtYW55VG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQkvLyBiYXNlIGFubm90YXRlZCwgdGVzdCByZXNvdXJjZSB2YWx1ZQotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gY2hhbmdlIGNvbnRleHQgdG8gSU5ORVIgc3BlY2lmaWNhbGx5LCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBPVVRFUiwgdGVzdCByZXNvdXJjZQotCQkKLQkJY29udGV4dEpvaW5GZXRjaC5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIsIGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCB0byBudWxsLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHkgKHRoaXMgdGltZSBmcm9tIG5vIGFubm90YXRpb24pLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCWpvaW5GZXRjaEFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9NYW55TWFwcGluZygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLk9ORV9UT19NQU5ZKTsKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcCByZWwgPSBtYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuT05FX1RPX01BTlkpOwotCQlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBtYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwIHJlbCA9IG1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTikpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9UQUJMRSkpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCWFubm90YXRpb24uc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEpQQS5KT0lOX1RBQkxFKSk7Ci0JCWFzc2VydE51bGwoYW5ub3RhdGlvbi5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEpQQS5KT0lOX0NPTFVNTik7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBKUEEuSk9JTl9DT0xVTU4pKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oSlBBLkpPSU5fVEFCTEUpKTsKLQkJYXNzZXJ0TnVsbChhbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgYXR0cmlidXRlcy5uZXh0KCkuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldEZldGNoKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlLkxBWlksIGFubm90YXRpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0VGFyZ2V0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoIkZvbyIpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldE1hcHBlZEJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuc2V0TWFwcGVkQnlBdHRyaWJ1dGUoIkZvbyIpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZUFsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldEFsbCh0cnVlKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzQWxsKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVBbGwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvTWFueSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc01lcmdlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVNZXJnZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb01hbnlTZXRDYXNjYWRlUGVyc2lzdCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb01hbnkoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFBlcnNpc3QodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvTWFueUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9NYW55U2V0Q2FzY2FkZVJlZnJlc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZWZyZXNoKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHNwZWNpZmllZE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCkuaXNSZWZyZXNoKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb01hbnlBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvTWFueVNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9NYW55KCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgc3BlY2lmaWVkT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKS5pc1JlbW92ZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9NYW55QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVtb3ZlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkMjUzNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb09uZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YU9uZVRvT25lTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewkKLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFByaXZhdGVPd25lZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhKb2luRmV0Y2hPbmVUb09uZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRFeHRlbmRzSW1wbGVtZW50c1RvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoImltcGxlbWVudHMgamF2YS5pby5TZXJpYWxpemFibGUiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBteVR5cGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFByaXZhdGVPd25lZE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1ByaXZhdGVPd25lZCBwcml2YXRlT3duYWJsZSA9IG9uZVRvT25lTWFwcGluZy5nZXRQcml2YXRlT3duZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJcHJpdmF0ZU93bmFibGUuc2V0UHJpdmF0ZU93bmVkKGZhbHNlKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBwcml2YXRlT3duYWJsZS5pc1ByaXZhdGVPd25lZCgpKTsKLQotCQlwcml2YXRlT3duYWJsZS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHByaXZhdGVPd25hYmxlLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU93bmVkVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoUHJpdmF0ZU93bmVkT25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkIHByaXZhdGVPd25hYmxlID0gb25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcHJpdmF0ZU93bmFibGUuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IGNvbnRleHQgdmFsdWUKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSByZXNvdXJjZSB0byBPVVRFUiwgdGVzdCBjb250ZXh0Ci0JCQotCQlqb2luRmV0Y2hBbm5vdGF0aW9uLnNldFZhbHVlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLk9VVEVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIHZhbHVlIGZyb20gcmVzb3VyY2UsIHRlc3QgY29udGV4dAotCQkKLQkJam9pbkZldGNoQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYW5ub3RhdGlvbiwgdGV4dCBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQkKLQkJYXNzZXJ0TnVsbChqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRKb2luRmV0Y2hWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEpvaW5GZXRjaE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2ggY29udGV4dEpvaW5GZXRjaCA9IG1hbnlUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCS8vIGJhc2UgYW5ub3RhdGVkLCB0ZXN0IHJlc291cmNlIHZhbHVlCi0JCQotCQlhc3NlcnROdWxsKGpvaW5GZXRjaEFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRKb2luRmV0Y2guZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBjaGFuZ2UgY29udGV4dCB0byBJTk5FUiBzcGVjaWZpY2FsbHksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydE51bGwoam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIE9VVEVSLCB0ZXN0IHJlc291cmNlCi0JCQotCQljb250ZXh0Sm9pbkZldGNoLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHRvIG51bGwsIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIGNoYW5nZSBjb250ZXh0IHRvIElOTkVSIHNwZWNpZmljYWxseSAodGhpcyB0aW1lIGZyb20gbm8gYW5ub3RhdGlvbiksIHRlc3QgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRKb2luRmV0Y2guc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJam9pbkZldGNoQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlLklOTkVSLCBqb2luRmV0Y2hBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0Sm9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwkKLQkJCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIGF0dHJpYnV0ZXMubmV4dCgpLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5MQVpZKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5GZXRjaFR5cGUuTEFaWSwgYW5ub3RhdGlvbi5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldFRhcmdldEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJGb28iKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIHNwZWNpZmllZE9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0VGFyZ2V0RW50aXR5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0TWFwcGVkQnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgiRm9vIik7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGFubm90YXRpb24uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0QWxsKHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc0FsbCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlQWxsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0Q2FzY2FkZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRGVmYXVsdE9uZVRvT25lKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5pc0RlZmF1bHQoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXREZWZhdWx0TWFwcGluZ0tleSgpKTsKLQkJCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIG9uZVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCW9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCkuc2V0TWVyZ2UodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzTWVyZ2UoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZU1lcmdlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdE9uZVRvT25lU2V0Q2FzY2FkZVBlcnNpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRQZXJzaXN0KHRydWUpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3BlY2lmaWVkT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5pc1BlcnNpc3QoKSk7Ci0KLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSAKLQkJCQkoT25lVG9PbmVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW5ub3RhdGlvbik7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhbm5vdGF0aW9uLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0T25lVG9PbmVTZXRDYXNjYWRlUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aERlZmF1bHRPbmVUb09uZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuaXNEZWZhdWx0KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0RGVmYXVsdE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLnNldFJlZnJlc2godHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVmcmVzaCgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW5ub3RhdGlvbiA9IAotCQkJCShPbmVUb09uZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbm5vdGF0aW9uKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGFubm90YXRpb24uaXNDYXNjYWRlUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRPbmVUb09uZVNldENhc2NhZGVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhEZWZhdWx0T25lVG9PbmUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGF0dHJpYnV0ZXMgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldERlZmF1bHRNYXBwaW5nS2V5KCkpOwotCQkKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJb25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKS5zZXRSZW1vdmUodHJ1ZSk7Ci0JCQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpLmlzUmVtb3ZlKCkpOwotCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gCi0JCQkJKE9uZVRvT25lQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFubm90YXRpb24pOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYW5ub3RhdGlvbi5pc0Nhc2NhZGVSZW1vdmUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFTdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTZjYWU2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhU3RydWN0Q29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAU3RydWN0Q29udmVydGVyKG5hbWU9XCJmb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJGb29cIiIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kU3RydWN0Q29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0KLQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lVXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlcigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldE5hbWUoImJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmdldE5hbWUoKSk7CQotCX0KLQkKLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFN0cnVjdENvbnZlcnRlckNsYXNzKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKLQotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldENvbnZlcnRlcigpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXJDbGFzc1VwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRTdHJ1Y3RDb252ZXJ0ZXJDbGFzcygpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRDb252ZXJ0ZXIoIkJhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydGVyKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0Q29udmVydGVyKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1YTdiOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0VjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFUeXBlQ29udmVydGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIobmFtZT1cImZvb1wiIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ29udmVydChcImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGU9Rm9vLmNsYXNzIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiZm9vXCIpIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAVHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUZvby5jbGFzcyIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZFR5cGVDb252ZXJ0ZXIoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0TmFtZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TmFtZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRUeXBlQ29udmVydGVyKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJiYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXROYW1lKCJGT08iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kRGF0YVR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZERhdGFUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0KLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJBbm5vdGF0aW9uLmdldERhdGFUeXBlKCkpOwotCi0KLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmREYXRhVHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgYmFzaWNNYXBwaW5nID0gKEphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsJCQotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVydGVyKTsKLQkJCi0JCWNvbnZlcnRlckFubm90YXRpb24uc2V0RGF0YVR5cGUoIkZvb0JhciIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhDb252ZXJ0QW5kT2JqZWN0VHlwZSgpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGJhc2ljTWFwcGluZyA9IChKYXZhRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udmVydGVyID0gYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQ29udmVydEFuZE9iamVjdFR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCi0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQljb252ZXJ0ZXJBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7CQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlckFubm90YXRpb24uZ2V0T2JqZWN0VHlwZSgpKTsKLQotCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyQW5ub3RhdGlvbi5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0T2JqZWN0VHlwZVVwZGF0ZXNGcm9tUmVzb3VyY2VNb2RlbENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnRBbmRPYmplY3RUeXBlKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkJCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUphdmFFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBiYXNpY01hcHBpbmcgPSAoSmF2YUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnZlcnRlciA9IGJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlckFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJCYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UoYmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwkJCi0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQljb252ZXJ0ZXIgPSBiYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJ0ZXIpOwotCQkKLQkJY29udmVydGVyQW5ub3RhdGlvbi5zZXRPYmplY3RUeXBlKCJGb29CYXIiKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7CQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvRWNsaXBzZUxpbmtKYXZhVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NmQyMDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvamF2YS9FY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVGVtcG9yYWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5UZW1wb3JhbEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDb252ZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTXV0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZlcnNpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVkVSU0lPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVmVyc2lvbiIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0KFwiY2xhc3MtaW5zdGFuY2VcIikiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OLCBFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04sIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0MigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aENvbnZlcnQoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LkNMQVNTX0lOU1RBTkNFX0NPTlZFUlRFUiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2ZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQkKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgdmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlUZW1wb3JhbEFubm90YXRpb24gdGVtcG9yYWwgPSAoVGVtcG9yYWxBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oVGVtcG9yYWxBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGVtcG9yYWxUeXBlLlRJTUUsIHRlbXBvcmFsLmdldFZhbHVlKCkpOwotCQkKLQkJdmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihUZW1wb3JhbEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0VXBkYXRlc0Zyb21SZXNvdXJjZU1vZGVsQ2hhbmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCVZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKFZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCQotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWNvbnZlcnQuc2V0VmFsdWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnROdWxsKHZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZlcnNpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJYXNzZXJ0U2FtZSh2ZXJzaW9uTWFwcGluZywgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uKCk7Ci0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nIHZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua011dGFibGUgbXV0YWJsZSA9IHZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQkKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSAoSmF2YVJlc291cmNlVHlwZSkgZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSwgS2luZC5UWVBFKTsKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLlRSVUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShCb29sZWFuLkZBTFNFKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGUuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uIG11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG11dGFibGVBbm5vdGF0aW9uKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCW11dGFibGVBbm5vdGF0aW9uID0gKEVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGUuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXV0YWJsZUFubm90YXRpb24uZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZVZlcnNpb24oKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gKEphdmFSZXNvdXJjZVR5cGUpIGdldEpwYVByb2plY3QoKS5nZXRKYXZhUmVzb3VyY2VUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUsIEtpbmQuVFlQRSk7Ci0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSByZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJYXNzZXJ0VHJ1ZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQkvL3NldCBtdXRhYmxlIGRlZmF1bHQgdG8gZmFsc2UgaW4gdGhlIHBlcnNpc3RlbmNlIHVuaXQgcHJvcGVydGllcywgdmVyaWZ5IGRlZmF1bHQgaW4gamF2YSBzdGlsbCB0cnVlIHNpbmNlIHRoaXMgaXMgbm90IGEgRGF0ZS9DYWxlbmRhcgotCQkoZ2V0UGVyc2lzdGVuY2VVbml0KCkpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0TXV0YWJsZUZvckRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbkRhdGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBnZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmVyc2lvbk1hcHBpbmcgPSAoRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTXV0YWJsZSBtdXRhYmxlID0gdmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCQotCQltdXRhYmxlLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsJCi0JCWFzc2VydEZhbHNlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCS8vc2V0IG11dGFibGUgZGVmYXVsdCB0byBmYWxzZSBpbiB0aGUgcGVyc2lzdGVuY2UgdW5pdCBwcm9wZXJ0aWVzLCB2ZXJpZnkgZGVmYXVsdCBpbiBqYXZhIHN0aWxsIHRydWUgc2luY2UgdGhpcyBpcyBub3QgYSBEYXRlL0NhbGVuZGFyCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJCi0JCShnZXRQZXJzaXN0ZW5jZVVuaXQoKSkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RmFsc2UobXV0YWJsZS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQkKLQkJKGdldFBlcnNpc3RlbmNlVW5pdCgpKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKG51bGwpOwotCQlhc3NlcnRGYWxzZShtdXRhYmxlLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc011dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlVmVyc2lvbigpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IGdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyB2ZXJzaW9uTWFwcGluZyA9IChFY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtNdXRhYmxlIG11dGFibGUgPSB2ZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCk7Ci0JCWFzc2VydFRydWUobXV0YWJsZS5pc011dGFibGUoKSk7Ci0JCQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCQkKLQkJbXV0YWJsZS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7CQotCQlhc3NlcnRUcnVlKG11dGFibGUuaXNNdXRhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFhMmQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L2phdmEvSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LmphdmE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUphdmFDb250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUJhc2ljTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUNhY2hpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFDb252ZXJ0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhRW1iZWRkYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YUlkTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFNYW55VG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwkJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFNYXBwZWRTdXBlcmNsYXNzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtKYXZhT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YU9uZVRvTWFueU1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFPbmVUb09uZU1hcHBpbmdUZXN0cy5jbGFzcyk7CQkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVN0cnVjdENvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rSmF2YVR5cGVDb252ZXJ0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua0phdmFWZXJzaW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUNvbGxlY3Rpb25UYWJsZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YUVudGl0eVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wSmF2YU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMEphdmFPbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBKYXZhT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzNKYXZhTXVsdGl0ZW5hbmN5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzJKYXZhRW50aXR5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzJKYXZhTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0RWNsaXBzZUxpbmtDb3JlSmF2YUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjg4OTU5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzIAotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmdQcm9wZXJ0eUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZEdldElkTWV0aG9kQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVNwZWNpZmllZE1hcHBpbmdLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCS8vdGFrZSBhIHZpcnR1YWwgbWFwcGluZyB3aXRoIGEgbWFwcGluZyB0eXBlIGFuZCBtYWtlIGl0IHNwZWNpZmllZAotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKS5nZXRLZXkoKSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlJdGVyYXRvcjxPcm1QZXJzaXN0ZW50QXR0cmlidXRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TWFrZVZpcnR1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCWFzc2VydEVxdWFscygwLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJSXRlcmF0b3I8T3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiB2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbE5vVW5kZXJseWluZ0phdmFBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpLnNldE5hbWUoIm5vSmF2YUF0dHJpYnV0ZSIpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZSgpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgKChJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCAoKEJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ1R5cGVXaGVuTWV0YWRhdGFDb21wbGV0ZTIoKSAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5OVUxMX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUlkTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJCQotCQkvL3ZpcnR1YWwgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUmVzb3VyY2VBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUmVzb3VyY2VGaWVsZCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJLy9zcGVjaWZpZWQgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2hvdWxkIGJlID09IHRvIGphdmEgY29udGV4dCBtb2RlbCBvYmplY3QKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQotCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGphdmEgYWNjZXNzIHR5cGUgRklFTEQsIG9ybSBhY2Nlc3MgdHlwZSBQUk9QRVJUWSwgbmFtZSBtYXRjaGVzIGphdmEKLQkJLy92ZXJpZnkgYm90aCB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgYW5kIHRoZSBmaWVsZCBqYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBhcmUgdXNlZCBpbiBvcm0KLQkJLy9iZWNhdXNlIHRoZSBmaWVsZCBpcyBhbm5vdGF0ZWQgYW5kIHByb3BlcnR5IGlzIHNwZWNpZmllZAotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRGaWVsZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRQcm9wZXJ0eUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRGaWVsZEF0dHJpYnV0ZSk7Ci0JCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRQcm9wZXJ0eUF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpZFByb3BlcnR5QXR0cmlidXRlOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGlkRmllbGRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWphdmFSZXNvdXJjZUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpLm5leHQoKSwgamF2YVJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ly9kZWZhdWx0IGFjY2VzcyB3aWxsIGJlIGZpZWxkCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkMiIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVNaXhlZEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtRmllbGRBdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLm5leHQoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVByb3BlcnR5QXR0cmlidXRlID0gYXR0cmlidXRlcy5uZXh0KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybUZpZWxkQXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE93bmluZ1BlcnNpc3RlbnRUeXBlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybUZpZWxkQXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1GaWVsZEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuSURfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVByb3BlcnR5QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1Qcm9wZXJ0eUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRUcnVlKG9ybVByb3BlcnR5QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQkKLQkJKChPcm1QZXJzaXN0ZW50QXR0cmlidXRlKSBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZSkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlvcm1Qcm9wZXJ0eUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1Qcm9wZXJ0eUF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydFRydWUob3JtUHJvcGVydHlBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLkZJRUxEKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuRklFTEQpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NQcm9wZXJ0eUluSmF2YSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nUHJvcGVydHlBY2Nlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydFRydWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0QpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEZhbHNlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE5vdFNhbWUoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRUcnVlKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0S2luZCgpID09IEtpbmQuTUVUSE9EKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNTllOGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudFR5cGVUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzIAotCWV4dGVuZHMgRWNsaXBzZUxpbmsxXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazFfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKTsKLQkJCQlzYi5hcHBlbmQoIkBDb2x1bW4obmFtZT1cIkZPT1wiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0vLwkKLS8vCXByaXZhdGUgdm9pZCBjcmVhdGVBY2Nlc3NUeXBlRW51bSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXRoaXMuY3JlYXRlRW51bUFuZE1lbWJlcnMoSlBBX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSwgIkFjY2Vzc1R5cGUiLCAiRklFTEQsIFBST1BFUlRZOyIpOwkKLS8vCX0KLS8vCQotLy8JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQl0aGlzLmNyZWF0ZUFubm90YXRpb25BbmRNZW1iZXJzKEpQQV9BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUsICJBY2Nlc3MiLCAiQWNjZXNzVHlwZSB2YWx1ZSgpOyIpOwotLy8JCWNyZWF0ZUFjY2Vzc1R5cGVFbnVtKCk7Ci0vLwl9Ci0vLwkKLS8vCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZUFjY2Vzc0Fubm90YXRpb24oKTsKLS8vCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotLy8JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBKUEEuSUQsIEpQQS5BQ0NFU1MsIEpQQS5BQ0NFU1NfVFlQRSk7Ci0vLwkJCX0KLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0vLwkJCQlzYi5hcHBlbmQoIkBBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSkiKTsKLS8vCQkJfQotLy8JCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmROYW1lRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKTsKLS8vCQkJCXNiLmFwcGVuZCgiQEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKSIpOwotLy8JCQl9Ci0vLwkJCQotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotLy8JCQkJc2IuYXBwZW5kKCJASWQiKTsKLS8vCQkJfQotLy8JCX0pOwotLy8JfQotLy8JCi0vLwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZpZWxkU3BlY2lmaWVkUHJvcGVydHlBbm5vdGF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVBY2Nlc3NBbm5vdGF0aW9uKCk7Ci0vLwkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotLy8JCQlAT3ZlcnJpZGUKLS8vCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLS8vCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgSlBBLklELCBKUEEuQUNDRVNTLCBKUEEuQUNDRVNTX1RZUEUpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpIik7Ci0vLwkJCX0KLS8vCQkJCi0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0vLwkJCQlzYi5hcHBlbmQoIkBJZCIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLS8vCi0vLwlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5U3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlQWNjZXNzQW5ub3RhdGlvbigpOwotLy8JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLS8vCQkJQE92ZXJyaWRlCi0vLwkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0vLwkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQUNDRVNTLCBKUEEuQUNDRVNTX1RZUEUpOwotLy8JCQl9Ci0vLwkJCUBPdmVycmlkZQotLy8JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLS8vCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotLy8JCQkJc2IuYXBwZW5kKCJAQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpIik7Ci0vLwkJCX0KLS8vCQl9KTsKLS8vCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY2Nlc3NXaXRoSmF2YUFubm90YXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQkKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgamF2YVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotCX0KLQotLy9UT0RPIEFjY2VzcyBhbm5vdGF0aW9uIHRlc3QJCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0QWNjZXNzV2l0aEphdmFBbm5vdGF0aW9uc1Byb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eUFubm90YXRlZEZpZWxkUHJvcGVydHlTcGVjaWZpZWQoKTsKLS8vCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotLy8JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGphdmFQZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBqYXZhUGVyc2lzdGVudFR5cGUuZ2V0QWNjZXNzKCkpOwotLy8JfQotLy8JCi0vLwlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5QW5ub3RhdGVkRmllbGRQcm9wZXJ0eVNwZWNpZmllZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLS8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygibmFtZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVzMigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCWNyZWF0ZVRlc3RFbnRpdHlQcm9wZXJ0eVNwZWNpZmllZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCQkKLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCWFzc2VydEZhbHNlKHZpcnR1YWxBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsQXR0cmlidXRlczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0RW50aXR5RmllbGRTcGVjaWZpZWRQcm9wZXJ0eUFubm90YXRlZCgpOwotLy8JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJTGlzdEl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8KLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8KLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUubWFrZVNwZWNpZmllZCgpOwotLy8JCQotLy8JCXZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUudmlydHVhbEF0dHJpYnV0ZXMoKTsKLS8vCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsQXR0cmlidXRlcy5uZXh0KCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEFjY2VzcygpKTsKLS8vCi0vLwkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLS8vCQkKLS8vCQkKLS8vCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5zcGVjaWZpZWRBdHRyaWJ1dGVzKCkubmV4dCgpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRQZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIHNwZWNpZmllZFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotLy8JCQotLy8JCQotLy8JCW9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCkubmV4dCgpLm1ha2VTcGVjaWZpZWQoKTsKLS8vCQl2aXJ0dWFsQXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLnZpcnR1YWxBdHRyaWJ1dGVzKCk7Ci0vLwkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsKLS8vCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotLy8KLS8vCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JfQotLy8KLS8vCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJY3JlYXRlVGVzdEVudGl0eVByb3BlcnR5U3BlY2lmaWVkKCk7Ci0vLwkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLS8vCQlKYXZhUGVyc2lzdGVudFR5cGUgamF2YVBlcnNpc3RlbnRUeXBlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7Ci0vLwkJCi0vLwkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0vLwkJCi0vLwkJamF2YVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLkZJRUxEKTsKLS8vCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEFjY2VzcygpKTsKLS8vCQkKLS8vCQlqYXZhUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotLy8KLS8vCQkKLS8vCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotLy8JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0QWNjZXNzKCkpOwotLy8JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ2NmM0Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsxXzFPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMV8xQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazFfMUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMV8xT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0KLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldEtleSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1Db2xsZWN0aW9uVGFibGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNhNGE3Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUNvbGxlY3Rpb25UYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5VbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVW5pcXVlQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUNvbGxlY3Rpb25UYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1Db2xsZWN0aW9uVGFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxDb2xsZWN0aW9uVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxVbmlxdWVDb25zdHJhaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxFbGVtZW50Q29sbGVjdGlvbl8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcm1Db2xsZWN0aW9uVGFibGVUZXN0cyAKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcm1Db2xsZWN0aW9uVGFibGVUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJWG1sTWFwcGluZ0ZpbGVSZWYgbWFwcGluZ0ZpbGVSZWYgPSBQZXJzaXN0ZW5jZUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE1hcHBpbmdGaWxlUmVmKCk7Ci0JCW1hcHBpbmdGaWxlUmVmLnNldEZpbGVOYW1lKEpwdEpwYUNvcmVQbHVnaW4uREVGQVVMVF9PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQsICJqYXZhLnV0aWwuQ29sbGVjdGlvbiIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IHByb2plY3RzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASWQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCQotCQkvL3NldCBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0TmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXROYW1lKCkpOwotCQotCQkvL3NldCBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldE5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCQotCQkvL3NldCBuYW1lIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxDb2xsZWN0aW9uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3RzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUNvbGxlY3Rpb25UYWJsZTJfMCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX3Byb2plY3RzIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YUNvbGxlY3Rpb25UYWJsZTJfMCBqYXZhQ29sbGVjdGlvblRhYmxlID0gamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJDQVRBTE9HIik7Ci0JCWphdmFDb2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKCJTQ0hFTUEiKTsKLQkJSmF2YUpvaW5Db2x1bW4gamF2YUpvaW5Db2x1bW4gPSBqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIk5BTUUiKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIlJFRkVSRU5DRURfTkFNRSIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTQ0hFTUEiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQl2aXJ0dWFsSm9pbkNvbHVtbiA9IHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJSRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkRWxlbWVudENvbGxlY3Rpb24oKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJwcm9qZWN0cyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkTmFtZSgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuc2V0U3BlY2lmaWVkTmFtZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQmFyX3Byb2plY3RzIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoIkJhcl9wcm9qZWN0cyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQkJCi0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJwcm9qZWN0cyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJQ29sbGVjdGlvblRhYmxlMl8wICB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiSkFWQV9DT0xMRUNUSU9OX1RBQkxFIiwgdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXJfcHJvamVjdHMiLCB2aXJ0dWFsQ29sbGVjdGlvblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQkKLQkJLy9zZXQgU2NoZW1hIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuc2V0U2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNjaGVtYSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldFNjaGVtYSgpKTsKLQotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkU2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJCi0JCS8vc2V0IFNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRTY2hlbWEoKSk7Ci0JCQotCQkvL3NldCBTY2hlbWEgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1Db2xsZWN0aW9uVGFibGUuc2V0U3BlY2lmaWVkU2NoZW1hKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29sbGVjdGlvblRhYmxlKCkpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldENhdGFsb2coIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0Q2F0YWxvZygpKTsKLQkKLQkJLy9zZXQgQ2F0YWxvZyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRDYXRhbG9nKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0KLQkJcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5zZXRDb2xsZWN0aW9uVGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRDYXRhbG9nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCkpOwotCQkKLQkJLy9zZXQgQ2F0YWxvZyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5zZXRTcGVjaWZpZWRDYXRhbG9nKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBDYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCU9ybUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IG9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlqb2luQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQkJCQotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4yID0gb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWpvaW5Db2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCQotCQlPcm1Kb2luQ29sdW1uIGpvaW5Db2x1bW4zID0gb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSk7Ci0JCWpvaW5Db2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhqb2luQ29sdW1uMiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGpvaW5Db2x1bW4zLCBqb2luQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoam9pbkNvbHVtbiwgam9pbkNvbHVtbnMubmV4dCgpKTsKLQkJCi0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0KLQkJT3JtQ29sbGVjdGlvblRhYmxlMl8wIG9ybUNvbGxlY3Rpb25UYWJsZSA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDApLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigxKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMikuc2V0U3BlY2lmaWVkTmFtZSgiQkFaIik7Ci0JCQotCQlYbWxDb2xsZWN0aW9uVGFibGUgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUgPSByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQkKLQkJb3JtQ29sbGVjdGlvblRhYmxlLnJlbW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRKb2luQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRTcGVjaWZpZWRKb2luQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCQkKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVNwZWNpZmllZEpvaW5Db2x1bW4oMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5tb3ZlU3BlY2lmaWVkSm9pbkNvbHVtbigwLCAxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFaIiwgcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luQ29sdW1ucygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0Sm9pbkNvbHVtbnMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCi0JCUxpc3RJdGVyYXRvcjxPcm1Kb2luQ29sdW1uPiBqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMiwgMCk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCWpvaW5Db2x1bW5zID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2luQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoam9pbkNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJam9pbkNvbHVtbnMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShqb2luQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldEpvaW5Db2x1bW5zKCkucmVtb3ZlKDEpOwotCQlqb2luQ29sdW1ucyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgam9pbkNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGpvaW5Db2x1bW5zLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRKb2luQ29sdW1ucygpLnJlbW92ZSgwKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29sbGVjdGlvblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVW5pcXVlQ29uc3RyYWludD4gdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCQkKLQkJWG1sVW5pcXVlQ29uc3RyYWludCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiZm9vIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDAsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiYmFyIik7Ci0JCQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VW5pcXVlQ29uc3RyYWludHNTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCAgb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzU2l6ZSgpKTsKLQkJCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImZvbyIpOwotCQkKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgxLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgImJhciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsICBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCByZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCi0JCU9ybUNvbGxlY3Rpb25UYWJsZTJfMCBvcm1Db2xsZWN0aW9uVGFibGUgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCXJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uc2V0Q29sbGVjdGlvblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbGxlY3Rpb25UYWJsZSgpKTsKLQkJWG1sQ29sbGVjdGlvblRhYmxlIHJlc291cmNlQ29sbGVjdGlvblRhYmxlID0gcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbi5nZXRDb2xsZWN0aW9uVGFibGUoKTsKLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDApLmFkZENvbHVtbk5hbWUoMCwgIkZPTyIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRVbmlxdWVDb25zdHJhaW50MigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDEpLmFkZENvbHVtbk5hbWUoMCwgIkJBUiIpOwotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJCQVoiKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJCi0JCUxpc3RJdGVyYXRvcjxYbWxVbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUl0ZXJhdG9yPE9ybVVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUucmVtb3ZlVW5pcXVlQ29uc3RyYWludCgxKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMuaGFzTmV4dCgpKTsKLQotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwkJCi0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW9ybUNvbGxlY3Rpb25UYWJsZS5yZW1vdmVVbmlxdWVDb25zdHJhaW50KDApOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzID0gcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5saXN0SXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5oYXNOZXh0KCkpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlVW5pcXVlQ29uc3RyYWludCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgwKS5hZGRDb2x1bW5OYW1lKDAsICJGT08iKTsKLQkJb3JtQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMSkuYWRkQ29sdW1uTmFtZSgwLCAiQkFSIik7Ci0JCW9ybUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvcm1Db2xsZWN0aW9uVGFibGUubW92ZVVuaXF1ZUNvbnN0cmFpbnQoMiwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPFhtbFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMgPSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmxpc3RJdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCi0KLQkJb3JtQ29sbGVjdGlvblRhYmxlLm1vdmVVbmlxdWVDb25zdHJhaW50KDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0KLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlcyA9IHJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkubGlzdEl0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlcy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5nZXQoMCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZXMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuZ2V0KDApKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2VzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLmdldCgwKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVVbmlxdWVDb25zdHJhaW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgcmVzb3VyY2VFbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQlPcm1Db2xsZWN0aW9uVGFibGUyXzAgb3JtQ29sbGVjdGlvblRhYmxlID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpOwotCQlyZXNvdXJjZUVsZW1lbnRDb2xsZWN0aW9uLnNldENvbGxlY3Rpb25UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb2xsZWN0aW9uVGFibGUoKSk7Ci0JCVhtbENvbGxlY3Rpb25UYWJsZSByZXNvdXJjZUNvbGxlY3Rpb25UYWJsZSA9IHJlc291cmNlRWxlbWVudENvbGxlY3Rpb24uZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCi0JCVhtbFVuaXF1ZUNvbnN0cmFpbnQgdW5pcXVlQ29uc3RyYWludFJlc291cmNlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVW5pcXVlQ29uc3RyYWludCgpOwotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLmFkZCgwLCB1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UpOwotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UuZ2V0Q29sdW1uTmFtZXMoKS5hZGQoMCwgIkZPTyIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFVuaXF1ZUNvbnN0cmFpbnQoKTsKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5hZGQoMSwgdW5pcXVlQ29uc3RyYWludFJlc291cmNlKTsKLQkJdW5pcXVlQ29uc3RyYWludFJlc291cmNlLmdldENvbHVtbk5hbWVzKCkuYWRkKDAsICJCQVIiKTsKLQotCQl1bmlxdWVDb25zdHJhaW50UmVzb3VyY2UgPSBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxVbmlxdWVDb25zdHJhaW50KCk7Ci0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuYWRkKDIsIHVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRSZXNvdXJjZS5nZXRDb2x1bW5OYW1lcygpLmFkZCgwLCAiQkFaIik7Ci0KLQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1VbmlxdWVDb25zdHJhaW50PiB1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLm1vdmUoMiwgMCk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5tb3ZlKDAsIDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCi0JCXJlc291cmNlQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkucmVtb3ZlKDEpOwotCQl1bmlxdWVDb25zdHJhaW50cyA9IG9ybUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkKLQkJcmVzb3VyY2VDb2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5yZW1vdmUoMSk7Ci0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gb3JtQ29sbGVjdGlvblRhYmxlLmdldFVuaXF1ZUNvbnN0cmFpbnRzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0JCQotCQlyZXNvdXJjZUNvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLnJlbW92ZSgwKTsKLQkJdW5pcXVlQ29uc3RyYWludHMgPSBvcm1Db2xsZWN0aW9uVGFibGUuZ2V0VW5pcXVlQ29uc3RyYWludHMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZSh1bmlxdWVDb25zdHJhaW50cy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbmlxdWVDb25zdHJhaW50c0Zyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRFbGVtZW50Q29sbGVjdGlvbigpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlDb2xsZWN0aW9uVGFibGUyXzAgdmlydHVhbENvbGxlY3Rpb25UYWJsZSA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFVuaXF1ZUNvbnN0cmFpbnQ+IHVuaXF1ZUNvbnN0cmFpbnRzID0gdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKHVuaXF1ZUNvbnN0cmFpbnRzLmhhc05leHQoKSk7Ci0KLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFDb2xsZWN0aW9uVGFibGUyXzAgamF2YUNvbGxlY3Rpb25UYWJsZSA9IGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuZ2V0Q29sbGVjdGlvblRhYmxlKCk7Ci0JCQotCQlqYXZhQ29sbGVjdGlvblRhYmxlLmFkZFVuaXF1ZUNvbnN0cmFpbnQoMCkuYWRkQ29sdW1uTmFtZSgwLCAiRk9PIik7Ci0JCWphdmFDb2xsZWN0aW9uVGFibGUuYWRkVW5pcXVlQ29uc3RyYWludCgxKS5hZGRDb2x1bW5OYW1lKDAsICJCQVIiKTsKLQkJamF2YUNvbGxlY3Rpb25UYWJsZS5hZGRVbmlxdWVDb25zdHJhaW50KDIpLmFkZENvbHVtbk5hbWUoMCwgIkJBWiIpOwotCi0JCXVuaXF1ZUNvbnN0cmFpbnRzID0gdmlydHVhbENvbGxlY3Rpb25UYWJsZS5nZXRVbmlxdWVDb25zdHJhaW50cygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydFRydWUodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB1bmlxdWVDb25zdHJhaW50cy5uZXh0KCkuZ2V0Q29sdW1uTmFtZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdW5pcXVlQ29uc3RyYWludHMubmV4dCgpLmdldENvbHVtbk5hbWVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHVuaXF1ZUNvbnN0cmFpbnRzLm5leHQoKS5nZXRDb2x1bW5OYW1lcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UodW5pcXVlQ29uc3RyYWludHMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCXZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoMCwgIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29sbGVjdGlvblRhYmxlKCkuZ2V0VW5pcXVlQ29uc3RyYWludHNTaXplKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjBiYjRlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkJhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LklkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVHJhbnNpZW50TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLk1hcHBpbmdLZXlzMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbGVtZW50Q29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRpYmxlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9PVkVSUklERV9OQU1FID0gImNpdHkiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgPSAiRV9DSVRZIjsKLQotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLkZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbih0YXJnZXRDbGFzcz1TdHJpbmcuY2xhc3MsIGZldGNoPUZldGNoVHlwZS5FQUdFUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkFUVFJJQlVURV9PVkVSUklERSwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAQXR0cmlidXRlT3ZlcnJpZGUobmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfTkFNRSArICJcIiwgY29sdW1uPUBDb2x1bW4obmFtZT1cIiIgKyBBVFRSSUJVVEVfT1ZFUlJJREVfQ09MVU1OX05BTUUgKyAiXCIpKSIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb24gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248U3RyaW5nPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTiwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlU2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVNQkVEREFCTEUpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkZvbyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARWxlbWVudENvbGxlY3Rpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkxpc3Q8Rm9vPiBlbGVtZW50Q29sbGVjdGlvbjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJGb28uamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lTWFwcGluZyIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib25lVG9PbmVNYXBwaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgbmFtZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE5hbWUoIm5ld05hbWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJuZXdOYW1lIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3TmFtZSIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWUoKSk7Ci0JCi0JCS8vc2V0IG5hbWUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZm9vIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXREZWZhdWx0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdFRhcmdldENsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZT0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNwZWNpZmllZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldEZldGNoKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb0lkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSWRNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgVmVyc2lvbk1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9UcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIFRyYW5zaWVudE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkVNQkVEREVEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBFbWJlZGRlZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9FbWJlZGRlZElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5FTUJFRERFRF9JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcm1QZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgRW1iZWRkZWRJZE1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE1hbnlUb01hbnlNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhUb09uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNEZWZhdWx0KCkpOwotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2goRmV0Y2hUeXBlLkVBR0VSKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIE9uZVRvTWFueU1hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vcnBoVG9NYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBNYW55VG9PbmVNYXBwaW5nKTsKLQkJYXNzZXJ0RXF1YWxzKCJvbmVUb09uZSIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgKChNYW55VG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb3JwaFRvQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UoZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzRGVmYXVsdCgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZEZldGNoKEZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEZhbHNlKGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc0RlZmF1bHQoKSk7CQotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBCYXNpY01hcHBpbmcpOwotCQlhc3NlcnRFcXVhbHMoIm9uZVRvT25lIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkuZ2V0TmFtZSgpKTsKLS8vVE9ETwlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCAoKElCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCQkJCi0JCS8vc2V0IGZldGNoIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRGZXRjaChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5FQUdFUik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRmV0Y2hUeXBlLkVBR0VSLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuTEFaWSwgZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmVNYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJCQkKLQkJLy9zZXQgZmV0Y2ggaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuRUFHRVIpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5GZXRjaFR5cGUuRUFHRVIsIGVsZW1lbnRDb2xsZWN0aW9uLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRTcGVjaWZpZWRGZXRjaChGZXRjaFR5cGUuTEFaWSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkZldGNoVHlwZS5MQVpZLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0KLQkJLy9zZXQgZmV0Y2ggdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkRmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRhcmdldENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldFRhcmdldENsYXNzKCkpOwotCQkJCQotCQkvL3NldCB0YXJnZXQgY2xhc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldFRhcmdldENsYXNzKCJuZXdUYXJnZXRDbGFzcyIpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldENsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5ld1RhcmdldENsYXNzIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JCi0JCS8vc2V0IHRhcmdldCBjbGFzcyB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5zZXRUYXJnZXRDbGFzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0VGFyZ2V0Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUYXJnZXRDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb24gPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIm5ld1RhcmdldENsYXNzIik7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibmV3VGFyZ2V0Q2xhc3MiLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQkKLQkJLy9zZXQgdGFyZ2V0IGNsYXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldENsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRUYXJnZXRDbGFzcygpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlRW1iZWRkYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5BZGRyZXNzIik7Ci0KLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsJCi0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoRW1iZWRkYWJsZUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQWRkcmVzcyIpOwotCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7CQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMC5UeXBlLkJBU0lDX1RZUEUsIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVR5cGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTm9uR2VuZXJpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFkZHJlc3MiKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuTk9fVFlQRSwgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlVHlwZSgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wLlR5cGUuRU1CRUREQUJMRV9UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVUeXBlQmFzaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFkZHJlc3MiKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwkKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydEVxdWFscyhFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAuVHlwZS5CQVNJQ19UWVBFLCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVUeXBlKCkpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW9uZVRvTWFueS5zZXRNYXBLZXkoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROb3ROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW9uZVRvTWFueS5nZXRNYXBLZXkoKS5zZXROYW1lKCJteU1hcEtleSIpOwotCQlvbmVUb01hbnkuc2V0TWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXkoKSk7Ly9ubyBwcmltYXJ5IGtleSBvbiBhbiBlbWJlZGRhYmxlCi0JCWFzc2VydFRydWUodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDdXN0b21NYXBLZXkodHJ1ZSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnkgeG1sT25lVG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoeG1sT25lVG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJteU1hcEtleSIpOwotCQlhc3NlcnRFcXVhbHMoIm15TWFwS2V5Iiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCB4bWxPbmVUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwoeG1sT25lVG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5uYW1lIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJYXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0Q2xhc3MoIlN0cmluZyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldE1hcEtleUNsYXNzKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCQotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXlDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0KLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb24uZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJTdHJpbmciLCBlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvbi5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdE9yZGVyQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9yZGVyYWJsZTJfMCBvcmRlcmFibGUgPSAoT3JkZXJhYmxlMl8wKSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlvcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJT3JkZXJDb2x1bW4yXzAgb3JkZXJDb2x1bW4gPSBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKE9yZGVyYWJsZTJfMCkgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9yZGVyYWJsZSA9IChPcmRlcmFibGUyXzApIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0T3JkZXJhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19PUkRFUiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbFZhbHVlQ29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhHZW5lcmljQmFzaWNFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJLy92aXJ0dWFsIGF0dHJ1YnRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiB2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbENvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NSksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ2KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCi0JCi0JCS8vc2V0IG1ldGFkYXRhLWNvbXBsZXRlLCBvcm0ueG1sIHZpcnR1YWwgY29sdW1uIGlnbm9yZXMgamF2YSBjb2x1bW4gYW5ub3RhdGlvbgotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQkvL25vIGxvbmdlciBhbiBlbGVtZW50IGNvbGxlY3Rpb24gbWFwcGluZwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuTlVMTF9BVFRSSUJVVEVfTUFQUElOR19LRVksIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEdlbmVyaWNCYXNpY0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJT3JtQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQ29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbHVtbi5pc0RlZmF1bHRVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgb3JtQ29sdW1uLmdldERlZmF1bHRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldERlZmF1bHRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFNjYWxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxWYWx1ZUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoR2VuZXJpY0Jhc2ljRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlDb2x1bW4gdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQotCQkvL2VudGl0eSB0YWJsZSBzaG91bGQgaGF2ZSBubyBhZmZlY3Qgb24gdGhlIGNvbGxlY3Rpb24gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbGxlY3Rpb25UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfQ09MTEVDVElPTl9UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiSkFWQV9UQUJMRSIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1RBQkxFIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldFZhbHVlQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RNb3ZlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7CQkKLQkJCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQotCQlhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9IG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRWYWx1ZUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuc2V0TmFtZSgiQkFaIik7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgyLCAwKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDAsIDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWxlbWVudENvbGxlY3Rpb25NYXBwaW5nTm9VbmRlcnlsaW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVtYmVkZGFibGVFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE5hbWUoKSk7Ci0KLQkJCi0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhFbWJlZGRhYmxlRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHBlcnNpc3RlbnRUeXBlMyA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgdmlydHVhbCwgc3BlY2lmaWVkIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldFZhbHVlQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgQXR0cmlidXRlT3ZlcnJpZGU+IHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCVJlYWRPbmx5QXR0cmlidXRlT3ZlcnJpZGUgYXR0cmlidXRlT3ZlcnJpZGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIFZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJQ29sdW1uIGphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbiA9IGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmdldENvbHVtbigpOwotCQkKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPT19DT0xVTU4iKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUYiKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlqYXZhQXR0cmlidXRlT3ZlcnJpZGVDb2x1bW4uc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCWphdmFBdHRyaWJ1dGVPdmVycmlkZUNvbHVtbi5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJamF2YUF0dHJpYnV0ZU92ZXJyaWRlQ29sdW1uLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIHBlcnNpc3RlbnRUeXBlMy5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibmFtZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJNWV9TVEFURV9DT0xVTU4iKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT09fVEFCTEUiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoNiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoNywgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU1RBVEVfQ09MVU1OIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgYXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJCi0JCQotCQkvL2VtYmVkZGVkIG1hcHBpbmcgaXMgc3BlY2lmaWVkLCB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgc2hvdWxkIGV4aXN0Ci0JCXBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgcGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSBlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0VmFsdWVBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQlhc3NlcnRFcXVhbHMoNCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlSZWFkT25seUF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NUQVRFX0NPTFVNTiIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9hZGRyZXNzZXMiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbE92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hYmJyIiwgdmlydHVhbE92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJLy9zZXQgb25lIG9mIHRoZSB2aXJ0dWFsIGF0dHJpYnV0ZSBvdmVycmlkZXMgdG8gc3BlY2lmaWVkLCB2ZXJpZnkgb3RoZXJzIGFyZSBzdGlsbCB2aXJ0dWFsCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg0LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCXZpcnR1YWxPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbE92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIHZpcnR1YWxPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCB2aXJ0dWFsT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQkvL3ZpcnR1YWwgYXR0cmlidXRlIGluIG9ybS54bWwsIGphdmEgYXR0cmlidXRlIGhhcyBubyB2YWx1ZSBDb2x1bW4gYW5ub3RhdGlvbgotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiB2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDYpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgb3JtLnhtbCB2aXJ0dWFsIGNvbHVtbiBpZ25vcmVzIGphdmEgY29sdW1uIGFubm90YXRpb24KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJLy9ubyBsb25nZXIgYW4gZWxlbWVudCBjb2xsZWN0aW9uIG1hcHBpbmcKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQkKLQkJQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKEphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiRk9PX1RBQkxFIik7Ci0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig0NSkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgb3JtQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHROdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db2x1bW4uaXNEZWZhdWx0VW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXREZWZhdWx0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXREZWZhdWx0UHJlY2lzaW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9TQ0FMRSwgb3JtQ29sdW1uLmdldERlZmF1bHRTY2FsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkTGVuZ3RoKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwS2V5Q29sdW1uVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCUNvbHVtbiB2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfYWRkcmVzc2VzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL2VudGl0eSB0YWJsZSBzaG91bGQgaGF2ZSBubyBhZmZlY3Qgb24gdGhlIGNvbGxlY3Rpb24gdGFibGUgZGVmYXVsdCBuYW1lCi0JCSgoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIHRhYmxlIGVsZW1lbnQgaW4gSmF2YQotCQlKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoSmF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb2xsZWN0aW9uVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0NPTExFQ1RJT05fVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCQlqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJKQVZBX1RBQkxFIik7CQotCQlhc3NlcnRFcXVhbHMoIkpBVkFfVEFCTEUiLCB2aXJ0dWFsQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJdmlydHVhbENvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2FkZHJlc3NlcyIsIHZpcnR1YWxDb2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZWxmUmVmZXJlbnRpYWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlU2VsZlJlZmVyZW50aWFsRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Gb28iKTsKLQotCQlFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgbWFwcGluZyA9IChFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIHBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbGVtZW50Q29sbGVjdGlvbiIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RmFsc2UobWFwcGluZy5nZXRBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZU1hcHBpbmdOYW1lcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbGVtZW50Q29sbGVjdGlvbk1hcHBpbmciKTsKLQkJT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbGVtZW50Q29sbGVjdGlvbl8yXzAgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEVsZW1lbnRDb2xsZWN0aW9ucygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihFbnVtZXJhdGVkQ29udmVydGVyLmNsYXNzKTsKLQkJKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCi0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMyXzAuRUxFTUVOVF9DT0xMRUNUSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyIpOwotCQlPcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nID0gKE9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVsZW1lbnRDb2xsZWN0aW9uXzJfMCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0RWxlbWVudENvbGxlY3Rpb25zKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCi0JCWVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRUZW1wb3JhbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVAsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRWxlbWVudENvbGxlY3Rpb25fMl8wIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCQkJCi0JCS8vc2V0IHRlbXBvcmFsIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLkRBVEUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRUZW1wb3JhbFR5cGUoVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwoZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzMl8wLkVMRU1FTlRfQ09MTEVDVElPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQ29udmVydGlibGVNYXBwaW5nIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSAoWG1sQ29udmVydGlibGVNYXBwaW5nKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCUphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChKYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5zZXRDb252ZXJ0KCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQllbGVtZW50Q29sbGVjdGlvblJlc291cmNlLnNldENvbnZlcnQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQotCQkKLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJRWNsaXBzZUxpbmtFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcyXzAgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZyA9IChFY2xpcHNlTGlua0VsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2aXJ0dWFsRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJamF2YUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwodmlydHVhbEVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZWxlbWVudENvbGxlY3Rpb25SZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnROdWxsKGphdmFFbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZzJfMCBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcgPSAoT3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQ29udmVydGlibGVNYXBwaW5nIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UgPSAoWG1sQ29udmVydGlibGVNYXBwaW5nKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRFbGVtZW50Q29sbGVjdGlvbnMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1FbGVtZW50Q29sbGVjdGlvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGVsZW1lbnRDb2xsZWN0aW9uUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKG51bGwpOwotCi0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIGZhbHNlIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtRWxlbWVudENvbGxlY3Rpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbGVtZW50Q29sbGVjdGlvblJlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1FbnRpdHlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWYwOGQzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkZWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkluaGVyaXRhbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUF0dHJpYnV0ZU92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1NYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5NYXBwaW5nS2V5czJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LkNhY2hlYWJsZUhvbGRlcjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LnBlcnNpc3RlbmNlLm9wdGlvbnMuU2hhcmVkQ2FjaGVNb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxBc3NvY2lhdGlvbk92ZXJyaWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCX1RZUEVfTkFNRSA9ICJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUgPSBQQUNLQUdFX05BTUUgKyAiLiIgKyBTVUJfVFlQRV9OQU1FOwotCQotCQotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybUVudGl0eVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRHZXRJZE1ldGhvZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczI7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgYWRkcmVzczQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RBYnN0cmFjdEVudGl0eVRhYmxlUGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JTkhFUklUQU5DRSwgSlBBLklOSEVSSVRBTkNFX1RZUEUsIEpQQS5PTkVfVE9fT05FLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5PTkVfVE9fTUFOWSwgSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJASW5oZXJpdGFuY2Uoc3RyYXRlZ3k9SW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUykiKTsKLQkJCQlzYi5hcHBlbmQoImFic3RyYWN0Iik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kR2V0SWRNZXRob2RBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgicHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3MyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBhZGRyZXNzMzsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGFkZHJlc3M0OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQ3VzdG9tZXIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbWJlZGRlZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJDdXN0b21lciAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJDdXN0b21lci5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRURERUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiTG9uZ1RpbWVDdXN0b21lciBleHRlbmRzIEN1c3RvbWVyICIpOwotCQkJCXNiLmFwcGVuZCgie30iKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJMb25nVGltZUN1c3RvbWVyLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERFRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5PTkVfVE9fT05FKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHN0cmVldDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBARW1iZWRkZWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgWmlwQ29kZSB6aXBDb2RlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiWmlwQ29kZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIHBsdXNmb3VyOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiWmlwQ29kZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5FTUJFRERFRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuYXR0cmlidXRlTWFwcGluZ0tleUFsbG93ZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5LmF0dHJpYnV0ZU1hcHBpbmdLZXlBbGxvd2VkKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSkpOwotCQlhc3NlcnRUcnVlKGVudGl0eS5hdHRyaWJ1dGVNYXBwaW5nS2V5QWxsb3dlZChNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGVudGl0eS5nZXRPdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JCQotCQkKLQkJZW50aXR5LnNldFNwZWNpZmllZEluaGVyaXRhbmNlU3RyYXRlZ3koSW5oZXJpdGFuY2VUeXBlLlRBQkxFX1BFUl9DTEFTUyk7Ci0JCQotCQlvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQllbnRpdHkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuVEFCTEVfUEVSX0NMQVNTKTsKLQkJCi0JCW92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUF0dHJpYnV0ZXMgPSBnZXRKYXZhRW50aXR5KCkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVzVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gb3JtRW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCW92ZXJyaWRhYmxlQXR0cmlidXRlcyA9IGFic3RyYWN0RW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG92ZXJyaWRhYmxlQXR0cmlidXRlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUF0dHJpYnV0ZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zVGFibGVQZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0QWJzdHJhY3RFbnRpdHlUYWJsZVBlckNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQkJCi0JCQotCQlPcm1FbnRpdHkgYWJzdHJhY3RFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1FbnRpdHkuZ2V0UGFyZW50RW50aXR5KCk7Ci0JCW92ZXJyaWRhYmxlQXNzb2NpYXRpb25zID0gYWJzdHJhY3RFbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0Iiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMuaGFzTmV4dCgpKTsKLQl9Ci0vL1RPRE8KLS8vCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUF0dHJpYnV0ZXNNYXBwZWRTdXBlcmNsYXNzSW5Pcm1YbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLS8vCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotLy8JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0vLwkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotLy8JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0vLwkJCi0vLwkJSXRlcmF0b3I8UGVyc2lzdGVudEF0dHJpYnV0ZT4gb3ZlcnJpZGFibGVBdHRyaWJ1dGVzID0gZ2V0SmF2YUVudGl0eSgpLmFsbE92ZXJyaWRhYmxlQXR0cmlidXRlcygpOwotLy8JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEVxdWFscygiZm9vIiwgb3ZlcnJpZGFibGVBdHRyaWJ1dGVzLm5leHQoKS5nZXROYW1lKCkpOwotLy8JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlcy5oYXNOZXh0KCkpOwotLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQotCQlJdGVyYXRvcjxTdHJpbmc+IG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMgPSBvcm1FbnRpdHkuZ2V0QWxsT3ZlcnJpZGFibGVBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvdmVycmlkYWJsZUF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG92ZXJyaWRhYmxlQXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgZW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IGVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUF0dHJpYnV0ZU92ZXJyaWRlPiBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQotCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkJBWiIpOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLm1vdmUoMSwgMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBdHRyaWJ1dGVPdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0KLQkJT3JtTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE9ybU1hcHBlZFN1cGVyY2xhc3MpIG9ybUVudGl0eS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQltYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUJhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLmdldFBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkFSIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMCwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzRW50aXR5SGllcmFjaHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEFic3RyYWN0RW50aXR5VGFibGVQZXJDbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCQotCi0JCU9ybUVudGl0eSBzdXBlcmNsYXNzID0gKE9ybUVudGl0eSkgb3JtRW50aXR5LmdldFBhcmVudEVudGl0eSgpOwotCQkKLQkJc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlCYXNpY01hcHBpbmcgaWRNYXBwaW5nID0gKEJhc2ljTWFwcGluZykgc3VwZXJjbGFzcy5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlpZE1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJBUiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0KLQkJaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUobnVsbCk7Ci0JCWlkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0JCS8vYWRkIGFuIGFubm90YXRpb24gdG8gdGhlIHJlc291cmNlIG1vZGVsIGFuZCB2ZXJpZnkgdGhlIGNvbnRleHQgbW9kZWwgaXMgdXBkYXRlZAotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiQkFSIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0QXR0cmlidXRlT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMywgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZU92ZXJyaWRlU2V0VmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlT3ZlcnJpZGVTZXRWaXJ0dWFsVHJ1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1BdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lcigpOwotCQkJCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvVmlydHVhbCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7CQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW92ZVNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDMsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCQotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIubW92ZVNwZWNpZmllZE92ZXJyaWRlKDIsIDApOwotCQlMaXN0SXRlcmF0b3I8T3JtQXR0cmlidXRlT3ZlcnJpZGU+IGF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQotCi0JCW92ZXJyaWRlQ29udGFpbmVyLm1vdmVTcGVjaWZpZWRPdmVycmlkZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBlbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgyKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXR0cmlidXRlT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEF0dHJpYnV0ZU92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5nZXQoMSkuc2V0TmFtZSgiQkFSIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBdHRyaWJ1dGVPdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkuZ2V0KDIpLnNldE5hbWUoIkJBWiIpOwotCQkJCi0JCUxpc3RJdGVyYXRvcjxPcm1BdHRyaWJ1dGVPdmVycmlkZT4gYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEF0dHJpYnV0ZU92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBhdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVPdmVycmlkZXMuaGFzTmV4dCgpKTsKLQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXR0cmlidXRlT3ZlcnJpZGVzKCkucmVtb3ZlKDEpOwotCQlhdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBdHRyaWJ1dGVPdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWF0dHJpYnV0ZU92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBdHRyaWJ1dGVPdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlPiB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXR0cmlidXRlT3ZlcnJpZGUgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBlbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMgPSBlbnRpdHkuZ2V0T3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2Uob3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotLy8JLy9UT0RPIGFkZCBhbGwgbWFwcGluZyB0eXBlcyB0byB0aGUgbWFwcGVkIHN1cGVyY2xhc3MgdG8gdGVzdCB3aGljaCBvbmVzIGFyZSBvdmVycmlkYWJsZQotCXB1YmxpYyB2b2lkIHRlc3RBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzID0gb3JtRW50aXR5LmdldEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbk5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25OYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFsbE92ZXJyaWRhYmxlQXNzb2NpYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkKLQkJSXRlcmF0b3I8U3RyaW5nPiBvdmVycmlkYWJsZUFzc29jaWF0aW9ucyA9IG9ybUVudGl0eS5nZXRBbGxPdmVycmlkYWJsZUFzc29jaWF0aW9uTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgb3ZlcnJpZGFibGVBc3NvY2lhdGlvbnMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIG92ZXJyaWRhYmxlQXNzb2NpYXRpb25zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczQiLCBvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShvdmVycmlkYWJsZUFzc29jaWF0aW9ucy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCQkvL2FkZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdmVyaWZ5IHRoZSBjb250ZXh0IG1vZGVsIGlzIHVwZGF0ZWQKLQkJWG1sQXNzb2NpYXRpb25PdmVycmlkZSB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCB4bWxBc3NvY2lhdGlvbk92ZXJyaWRlKTsKLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZS5zZXROYW1lKCJGT08iKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMSwgeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFSIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0KLQkJeG1sQXNzb2NpYXRpb25PdmVycmlkZSA9IE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgeG1sQXNzb2NpYXRpb25PdmVycmlkZSk7Ci0JCXhtbEFzc29jaWF0aW9uT3ZlcnJpZGUuc2V0TmFtZSgiQkFaIik7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQkvL21vdmUgYW4gYW5ub3RhdGlvbiB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgxLCAwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiRk9PIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCXNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsJCQotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgwKTsKLQkJc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkJCi0JCWFzc2VydEVxdWFscygiQkFSIiwgc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0KLQkJCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkucmVtb3ZlKDApOwotCQlzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7CQkKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0KLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FLCBlbnRpdHlSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydFRydWUoZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5pc0VtcHR5KCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDQsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQlPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJCi0vLwotLy8JCS8vTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKE1hcHBlZFN1cGVyY2xhc3MpIGphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLS8vCQkvL0Jhc2ljTWFwcGluZyBpZE1hcHBpbmcgPSAoQmFzaWNNYXBwaW5nKSBtYXBwZWRTdXBlcmNsYXNzLnBlcnNpc3RlbnRUeXBlKCkuYXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJCQVIiKTsKLS8vCQkKLS8vCQlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZW50aXR5UmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0KLS8vCQkvL2lkTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKG51bGwpOwotLy8JCS8vaWRNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKG51bGwpOwotLy8JCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vCQlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5nZXRBbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotLy8JCWFzc2VydE51bGwodHlwZVJlc291cmNlLmdldEFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXNBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSkpOwotCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQkKLS8vCQkvL1RPRE8gam9pbkNvbHVtbnMgZm9yIGRlZmF1bHQgYXNzb2NpYXRpb24gb3ZlcnJpZGVzCi0vLy8vCUlKb2luQ29sdW1uIGRlZmF1bHRKb2luQ29sdW1uID0gZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGUuam9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCQotLy8vLwotLy8vLwlJTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKElNYXBwZWRTdXBlcmNsYXNzKSBqYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0vLy8vCQotLy8vLwlJT25lVG9PbmVNYXBwaW5nIGFkZHJlc3NNYXBwaW5nID0gKElPbmVUb09uZU1hcHBpbmcpIG1hcHBlZFN1cGVyY2xhc3MucGVyc2lzdGVudFR5cGUoKS5hdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLS8vLy8JSUpvaW5Db2x1bW4gam9pbkNvbHVtbiA9IGFkZHJlc3NNYXBwaW5nLmFkZFNwZWNpZmllZEpvaW5Db2x1bW4oMCk7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoIkJBUiIpOwotLy8vLwlqb2luQ29sdW1uLnNldFNwZWNpZmllZFRhYmxlKCJCQVoiKTsKLS8vLy8JCi0vLy8vCWFzc2VydEVxdWFscyhTVUJfVFlQRV9OQU1FLCB0eXBlUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLS8vLy8JYXNzZXJ0TnVsbCh0eXBlUmVzb3VyY2UuYW5ub3RhdGlvbihBc3NvY2lhdGlvbk92ZXJyaWRlLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGVzLkFOTk9UQVRJT05fTkFNRSkpOwotLy8vLwotLy8vLwlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOwotLy8vLwlkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZSA9IGphdmFFbnRpdHkuZGVmYXVsdEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubmV4dCgpOwotLy8vLwlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBkZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoIkZPTyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiQkFSIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiQkFaIiwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCi0vLy8vCWpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZShudWxsKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZShudWxsKTsKLS8vLy8Jam9pbkNvbHVtbi5zZXRTcGVjaWZpZWRUYWJsZShudWxsKTsKLS8vLy8JYXNzZXJ0RXF1YWxzKFNVQl9UWVBFX05BTUUsIHR5cGVSZXNvdXJjZS5nZXROYW1lKCkpOwotLy8vLwlhc3NlcnROdWxsKHR5cGVSZXNvdXJjZS5hbm5vdGF0aW9uKEFzc29jaWF0aW9uT3ZlcnJpZGUuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCWFzc2VydE51bGwodHlwZVJlc291cmNlLmFubm90YXRpb24oQXNzb2NpYXRpb25PdmVycmlkZXMuQU5OT1RBVElPTl9OQU1FKSk7Ci0vLy8vCi0vLy8vCWRlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlID0gamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5uZXh0KCk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldE5hbWUoKSk7Ci0vLy8vCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGRlZmF1bHRKb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8vLwlhc3NlcnRFcXVhbHMoU1VCX1RZUEVfTkFNRSwgZGVmYXVsdEpvaW5Db2x1bW4uZ2V0VGFibGUoKSk7Ci0vLy8vCQotLy8vLwlqYXZhRW50aXR5LmFkZFNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUoMCkuc2V0TmFtZSgiYWRkcmVzcyIpOwotLy8vLwlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUoamF2YUVudGl0eS5kZWZhdWx0QXNzb2NpYXRpb25PdmVycmlkZXMoKSkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCi0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQkvL2FkZCB0byB0aGUgcmVzb3VyY2UgbW9kZWwgYW5kIHZlcmlmeSB0aGUgY29udGV4dCBtb2RlbCBpcyB1cGRhdGVkCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLnNldE5hbWUoIkZPTyIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMiwgb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRBc3NvY2lhdGlvbk92ZXJyaWRlc1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygzLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscygwLCBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCWFzc2VydEVxdWFscyg0LCBvdmVycmlkZUNvbnRhaW5lci5nZXRPdmVycmlkZXNTaXplKCkpOwotCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlhc3NlcnRFcXVhbHMoNCwgb3ZlcnJpZGVDb250YWluZXIuZ2V0T3ZlcnJpZGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgwLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5zZXROYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKDUsIG92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlc1NpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uT3ZlcnJpZGVTZXRWaXJ0dWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbk92ZXJyaWRlU2V0VmlydHVhbDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQkKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZVNldFZpcnR1YWxUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCQkKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMoMiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5zaXplKCkpOwotCi0JCUl0ZXJhdG9yPE9ybUFzc29jaWF0aW9uT3ZlcnJpZGU+IGFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygwLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnNpemUoKSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAidGVzdC5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FbnRpdHkgb3JtRW50aXR5ID0gKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIG92ZXJyaWRlQ29udGFpbmVyID0gb3JtRW50aXR5LmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCkubmV4dCgpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuc2l6ZSgpKTsKLQkJCi0JCQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMSwgMCk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlPiBhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMiIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0KLQotCQlvdmVycmlkZUNvbnRhaW5lci5tb3ZlU3BlY2lmaWVkT3ZlcnJpZGUoMCwgMSk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCBhc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBlbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQXNzb2NpYXRpb25PdmVycmlkZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJ0ZXN0LkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVudGl0eSBvcm1FbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIgb3ZlcnJpZGVDb250YWluZXIgPSBvcm1FbnRpdHkuZ2V0QXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgZW50aXR5UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5hZGQoMCwgT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQXNzb2NpYXRpb25PdmVycmlkZSgpKTsKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5nZXQoMCkuc2V0TmFtZSgiRk9PIik7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuYWRkKDEsIE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFzc29jaWF0aW9uT3ZlcnJpZGUoKSk7Ci0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkuZ2V0KDEpLnNldE5hbWUoIkJBUiIpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmFkZCgyLCBPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxBc3NvY2lhdGlvbk92ZXJyaWRlKCkpOwotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQkJCQotCQlMaXN0SXRlcmF0b3I8T3JtQXNzb2NpYXRpb25PdmVycmlkZT4gYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5tb3ZlKDIsIDApOwotCQlhc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFNwZWNpZmllZE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgYXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKGFzc29jaWF0aW9uT3ZlcnJpZGVzLmhhc05leHQoKSk7Ci0JCi0JCWVudGl0eVJlc291cmNlLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkubW92ZSgwLCAxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQotCQllbnRpdHlSZXNvdXJjZS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlcygpLnJlbW92ZSgxKTsKLQkJYXNzb2NpYXRpb25PdmVycmlkZXMgPSBvdmVycmlkZUNvbnRhaW5lci5nZXRTcGVjaWZpZWRPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIGFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShhc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCQkKLQkJZW50aXR5UmVzb3VyY2UuZ2V0QXNzb2NpYXRpb25PdmVycmlkZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc29jaWF0aW9uT3ZlcnJpZGVzID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzb2NpYXRpb25PdmVycmlkZUlzVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgInRlc3QuQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRW50aXR5IG9ybUVudGl0eSA9IChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBvdmVycmlkZUNvbnRhaW5lciA9IG9ybUVudGl0eS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlMaXN0SXRlcmF0b3I8T3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGU+IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczIiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzMyIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3M0IiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5oYXNOZXh0KCkpOwotCi0JCW92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpLm5leHQoKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQXNzb2NpYXRpb25PdmVycmlkZSBzcGVjaWZpZWRBc3NvY2lhdGlvbk92ZXJyaWRlID0gb3ZlcnJpZGVDb250YWluZXIuZ2V0U3BlY2lmaWVkT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcyA9IG92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwkKLQkJdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MyIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCQotCQl2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZSA9IHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzczMiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzNCIsIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMuaGFzTmV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgYWRkcmVzc1BlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB6aXBDb2RlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0cmVldCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLmNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJCi0JCXppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKLS8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NDdXN0b21lcldpdGhFbGVtZW50Q29sbGVjdGlvbigpOwotCQljcmVhdGVUZXN0RW50aXR5TG9uZ1RpbWVDdXN0b21lcigpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVaaXBDb2RlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBjdXN0b21lclBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBhZGRyZXNzUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHppcENvZGVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQljdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIikuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5czJfMC5FTEVNRU5UX0NPTExFQ1RJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJT3JtQXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscyg2LCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZT4gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcyA9IGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldFZpcnR1YWxPdmVycmlkZXMoKS5pdGVyYXRvcigpOwotCQlPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0cmVldCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUgPSB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLmNpdHkiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkxvbmdUaW1lQ3VzdG9tZXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0VGFibGUoKSk7CQkKLQkJdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlID0gdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicGx1c2ZvdXIiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJMb25nVGltZUN1c3RvbWVyIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0KLQkJCi0JCXppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJQmFzaWNNYXBwaW5nIHBsdXNGb3VyTWFwcGluZyA9IChCYXNpY01hcHBpbmcpIHppcENvZGVQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgicGx1c2ZvdXIiKS5nZXRNYXBwaW5nKCk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJCTEFIIik7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiQkxBSF9UQUJMRSIpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVcGRhdGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlwbHVzRm91ck1hcHBpbmcuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkTGVuZ3RoKEludGVnZXIudmFsdWVPZig1KSk7Ci0JCXBsdXNGb3VyTWFwcGluZy5nZXRDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDYpKTsKLQkJcGx1c0ZvdXJNYXBwaW5nLmdldENvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig3KSk7Ci0KLQkJYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIgPSAoKE9ybUVudGl0eSkgbG9uZ1RpbWVDdXN0b21lclBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0QXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJLy9jaGVjayB0aGUgdG9wLWxldmVsIGVtYmVkZGVkIChDdXN0b21lci5hZGRyZXNzKSBhdHRyaWJ1dGUgb3ZlcnJpZGUgdG8gdmVyaWZ5IGl0IGlzIGdldHRpbmcgc2V0dGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIGNvbHVtbiBvbiBaaXBjb2RlLnBsdXNmb3VyCi0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUgiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc051bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoNSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDYsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyg3LCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQkvL3NldCBhbiBhdHRyaWJ1dGUgb3ZlcnJpZGUgb24gQWRkcmVzcy56aXBDb2RlIGVtYmVkZGVkIG1hcHBpbmcKLQkJYWRkcmVzc1BlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJ6aXBDb2RlIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlID0gKChWaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpICgoRW1iZWRkZWRNYXBwaW5nKSBhZGRyZXNzUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInppcENvZGUiKS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCkuZ2V0T3ZlcnJpZGVOYW1lZCgicGx1c2ZvdXIiKSkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCXNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkJMQUhfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkJMQUhfVEFCTEVfT1ZFUlJJREUiKTsKLQkJc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT05fT1ZFUlJJREUiKTsKLQotCi0JCWF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCXZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZSA9IChPcm1WaXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUpIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyLmdldE92ZXJyaWRlTmFtZWQoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MuemlwQ29kZS5wbHVzZm91ciIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJMQUhfT1ZFUlJJREUiLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCTEFIX1RBQkxFX09WRVJSSURFIiwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDI1NSwgdmlydHVhbEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygwLCB2aXJ0dWFsQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0U2NhbGUoKSk7Ci0JCQotCQlzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZSA9IHZpcnR1YWxBdHRyaWJ1dGVPdmVycmlkZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcy56aXBDb2RlLnBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQkJLy9UT0RPIEkgaGF2ZSB0aGUgZGVmYXVsdCB3cm9uZyBpbiB0aGlzIGNhc2UsIGJ1dCB0aGlzIHdhcyB3cm9uZyBiZWZvcmUgYXMgd2VsbC4gIE5lZWQgdG8gZml4IHRoaXMgbGF0ZXIKLS8vCQlhc3NlcnRFcXVhbHMoInBsdXNmb3VyIiwgc3BlY2lmaWVkQXR0cmlidXRlT3ZlcnJpZGUuZ2V0Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkxBSF9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJDdXN0b21lciIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldERlZmF1bHRUYWJsZSgpKTsJCi0JCWFzc2VydEVxdWFscygiQkxBSF9UQUJMRV9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNwZWNpZmllZFRhYmxlKCkpOwkKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTl9PVkVSUklERSIsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzcGVjaWZpZWRBdHRyaWJ1dGVPdmVycmlkZS5nZXRDb2x1bW4oKS5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygyNTUsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHNwZWNpZmllZEF0dHJpYnV0ZU92ZXJyaWRlLmdldENvbHVtbigpLmdldFNjYWxlKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVudGl0eUxvbmdUaW1lQ3VzdG9tZXIoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlWmlwQ29kZSgpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkN1c3RvbWVyIik7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuTG9uZ1RpbWVDdXN0b21lciIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlppcENvZGUiKTsKLQotCQlPcm1Bc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyIGF0dHJpYnV0ZU92ZXJyaWRlQ29udGFpbmVyID0gKChPcm1FbnRpdHkpIGxvbmdUaW1lQ3VzdG9tZXJQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldEFzc29jaWF0aW9uT3ZlcnJpZGVDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlPiB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMgPSBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lci5nZXRWaXJ0dWFsT3ZlcnJpZGVzKCkuaXRlcmF0b3IoKTsKLQkJT3JtVmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUgPSB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Muc3RhdGUiLCB2aXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRWaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0N1c3RvbWVyV2l0aEVsZW1lbnRDb2xsZWN0aW9uKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlMb25nVGltZUN1c3RvbWVyKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlQWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVppcENvZGUoKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5DdXN0b21lciIpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkxvbmdUaW1lQ3VzdG9tZXIiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5aaXBDb2RlIik7Ci0KLQkJT3JtQXNzb2NpYXRpb25PdmVycmlkZUNvbnRhaW5lciBhdHRyaWJ1dGVPdmVycmlkZUNvbnRhaW5lciA9ICgoT3JtRW50aXR5KSBsb25nVGltZUN1c3RvbWVyUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRBc3NvY2lhdGlvbk92ZXJyaWRlQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjxPcm1WaXJ0dWFsQXNzb2NpYXRpb25PdmVycmlkZT4gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzID0gYXR0cmlidXRlT3ZlcnJpZGVDb250YWluZXIuZ2V0VmlydHVhbE92ZXJyaWRlcygpLml0ZXJhdG9yKCk7Ci0JCU9ybVZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlIHZpcnR1YWxBc3NvY2lhdGlvbk92ZXJyaWRlID0gdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzLnN0YXRlIiwgdmlydHVhbEFzc29jaWF0aW9uT3ZlcnJpZGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlMl8wID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbEVudGl0eSBlbnRpdHlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlMl8wLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eVJlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZTJfMC5zZXRTcGVjaWZpZWRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUyXzAuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJWG1sRW50aXR5IGVudGl0eVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGVhYmxlLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCi0JCWVudGl0eVJlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHlSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQllbnRpdHlSZXNvdXJjZS5zZXRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZW50aXR5UmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlhc3NlcnRFcXVhbHMoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFLCBwZXJzaXN0ZW5jZVVuaXQyXzAuZ2V0U2hhcmVkQ2FjaGVNb2RlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkFMTCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5VTlNQRUNJRklFRCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNEZWZhdWx0Q2FjaGVhYmxlRnJvbVN1cGVyVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgc3ViRW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1YkVudGl0eSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgZW50aXR5KS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7Ci0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBqYXZhQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGVGcm9tTWFwcGVkU3VwZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0U3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtFbnRpdHkgc3ViRW50aXR5ID0gKEVjbGlwc2VMaW5rRW50aXR5KSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1YkVudGl0eSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgbWFwcGVkU3VwZXJjbGFzcykuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKG51bGwpOwotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkJCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuTk9ORSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZWQ2NGEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkVudW1lcmF0ZWRDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5UZW1wb3JhbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT3JkZXJDb2x1bW4yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlcmFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9NYW55TWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5yZXNvdXJjZS5qYXZhLkpQQTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFueVRvTWFueV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RhdGUgc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzc1dpdGhFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuRUxFTUVOVF9DT0xMRUNUSU9OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEVsZW1lbnRDb2xsZWN0aW9uIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPFN0YXRlPiBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNYW55VG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwIGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwkJCQotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0gsIENhc2NhZGVUeXBlLkRFVEFDSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJCeShcImNpdHlcIiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQltYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQltYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoImZvbyIpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KG51bGwpOwotCQlhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBzdGF0ZUZvb01hcHBpbmcgPSBtYW55VG9NYW55TWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXNFbGVtZW50Q29sbGVjdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzZXMiKTsKLQotCQlhZGRYbWxDbGFzc1JlZihGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFkZFhtbENsYXNzUmVmKFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYW55VG9NYW55TWFwcGluZyBtYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBhdHRyaWJ1dGVOYW1lcyA9IAotCQkJbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJbWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJmb28iKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmZvbyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWRkcmVzcyIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UoYXR0cmlidXRlTmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgc3RhdGVGb29NYXBwaW5nID0gbWFueVRvTWFueU1hcHBpbmcuZ2V0UmVzb2x2ZWRUYXJnZXRFbnRpdHkoKS5yZXNvbHZlQXR0cmlidXRlTWFwcGluZygic3RhdGUuZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgc3RhdGVGb29NYXBwaW5nLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAibWFueVRvTWFueU1hcHBpbmciKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgb3JtTWFueVRvTWFueU1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYW55VG9NYW55IG1hbnlUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgZG9lcyBub3QgY2hhbmdlCi0JCW1hbnlUb01hbnkuc2V0TWFwS2V5KE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZU1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE5vdE51bGwobWFueVRvTWFueS5nZXRNYXBLZXkoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUoIm15TWFwS2V5Iik7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscygibXlNYXBLZXkiLCBtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55LmdldE1hcEtleSgpLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuc2V0TmFtZSgibXlNYXBLZXkiKTsKLQkJbWFueVRvTWFueS5zZXRNYXBLZXkobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmlzTm9NYXBLZXkoKSk7Ci0JCQotCQkKLQkJLy9zZXQgY3VzdG9tIHNwZWNpZmllZCBtYXBLZXkgaW4gdGhlIGphdmEsIHZlcmlmeSB2aXJ0dWFsIG9ybSBtYXBwaW5nIHVwZGF0ZXMKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldEN1c3RvbU1hcEtleSh0cnVlKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgiY2l0eSIpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWFwS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleSgibXlNYXBLZXkiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU1hcEtleSIsIG1hbnlUb01hbnkuZ2V0TWFwS2V5KCkuZ2V0TmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55LmdldE1hcEtleSgpLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQl2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwTWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCXNwZWNpZmllZE1hbnlUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJc3BlY2lmaWVkTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBzcGVjaWZpZWRNYW55VG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQotCQkvL3NldCBtYXBLZXkgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCBkb2VzIG5vdCBjaGFuZ2UKLQkJbWFueVRvTWFueS5zZXRNYXBLZXlDbGFzcyhPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDbGFzc1JlZmVyZW5jZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChtYW55VG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCQkJCQotCQkvL3NldCBtYXBLZXkgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLnNldENsYXNzTmFtZSgiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkJCi0JCW1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQltYW55VG9NYW55LnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVWaXJ0dWFsTWFwS2V5Q2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlNYW55VG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiSW50ZWdlciIpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueSBtYW55VG9NYW55ID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCQotCQkvL3NldCBtYXBLZXkgIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygiU3RyaW5nIik7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgbWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpLmdldENsYXNzTmFtZSgpKTsKLQkKLQkJLy9zZXQgbWFwS2V5IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T3JkZXJDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpOwotCQljcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludFF1ZXVlUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBqb2JzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50UXVldWVQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImpvYnMiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgam9ic01hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJam9ic01hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuc2V0U3RyYXRlZ3lUb01hcHBlZEJ5KCk7Ci0JCWpvYnNNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgicXVldWVzIik7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgInF1ZXVlcyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBxdWV1ZXNNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nKSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlnZXRPcm1YbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JCU9yZGVyYWJsZTJfMCBqb2JzT3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIGpvYnNNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJT3JkZXJDb2x1bW4yXzAgam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCU9yZGVyQ29sdW1uMl8wIHF1ZXVlc09yZGVyQ29sdW1uID0gcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJCi0JCWpvYnNPcmRlcmFibGUuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJam9ic09yZGVyQ29sdW1uID0gam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqb2JzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCXF1ZXVlc09yZGVyYWJsZS5zZXRPcmRlckNvbHVtbk9yZGVyaW5nKHRydWUpOwotCQlxdWV1ZXNPcmRlckNvbHVtbiA9IHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQkKLQkJam9ic09yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvYnNPcmRlckNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImpvYnNfT1JERVIiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJcXVldWVzT3JkZXJDb2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlckNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkKLQkJKChFbnRpdHkpIHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk1ZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEVfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRV9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQkoKEVudGl0eSkgcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPVEhFUl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgam9ic09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFX09USEVSX1RBQkxFIiwgcXVldWVzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlxdWV1ZXNNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0pPSU5fVEFCTEUiLCBqb2JzT3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyQ29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE9yZGVyQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50UXVldWVQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRRdWV1ZSIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZyBqb2JzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHByaW50Sm9iUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50Sm9iIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJxdWV1ZXMiKTsKLQkJT3JtTWFueVRvTWFueU1hcHBpbmcgcXVldWVzTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIGpvYnNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgam9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGpvYnNPcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCU9yZGVyYWJsZTJfMCBxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgcXVldWVzTWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHF1ZXVlc09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCQotCQlKYXZhTWFueVRvTWFueU1hcHBpbmcgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcpIGpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YUpvYnNNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqb2JzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGpvYnNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHF1ZXVlc09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCi0JCWpvYnNQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUyID0gcHJpbnRRdWV1ZVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJqb2JzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxKb2JzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgam9ic1BlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJam9ic09yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSB2aXJ0dWFsSm9ic01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgam9ic09yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgam9ic09yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCXF1ZXVlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlMiA9IHByaW50Sm9iUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoInF1ZXVlcyIpOwotCQlNYW55VG9NYW55TWFwcGluZyB2aXJ0dWFsUXVldWVzTWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgcXVldWVzUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlxdWV1ZXNPcmRlcmFibGUgPSAoKE9yZGVyYWJsZTJfMCkgdmlydHVhbFF1ZXVlc01hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcXVldWVzT3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBxdWV1ZXNPcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iX1ByaW50UXVldWUiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJxdWV1ZXNfT1JERVIiLCBxdWV1ZXNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXROYW1lKCkpOwotCQkKLQkJKChPcmRlcmFibGUyXzApIGphdmFKb2JzTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLmdldE9yZGVyQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2JfUHJpbnRRdWV1ZSIsIGpvYnNPcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYl9QcmludFF1ZXVlIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygicXVldWVzX09SREVSIiwgcXVldWVzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCUphdmFNYW55VG9NYW55TWFwcGluZyBqYXZhUXVldWVzTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSBxdWV1ZXNQZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJamF2YVF1ZXVlc01hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpPSU5fVEFCTEUiLCBqb2JzT3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgam9ic09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSk9JTl9UQUJMRSIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoInF1ZXVlc19PUkRFUiIsIHF1ZXVlc09yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLk9SREVSX0NPTFVNTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludFF1ZXVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkobWFwcGVkQnk9XCJxdWV1ZXNcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDx0ZXN0LlByaW50Sm9iPiBqb2JzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlByaW50UXVldWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRKb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BTllfVE9fTUFOWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQTJfMC5PUkRFUl9DT0xVTU4pOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiUHJpbnRKb2IiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDx0ZXN0LlByaW50UXVldWU+IHF1ZXVlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludEpvYi5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiB2aXJ0dWFsQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIHZpcnR1YWxDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIHZpcnR1YWxDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc0luc2VydGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb2x1bW4uaXNVbmlxdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX0xFTkdUSCwgdmlydHVhbENvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgdmlydHVhbENvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCB2aXJ0dWFsQ29sdW1uLmdldFNjYWxlKCkpOwotCi0JCS8vc2V0IENvbHVtbiBhbm5vdGF0aW9uIGluIEphdmEKLQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wIGphdmFNYW55VG9NYW55TWFwcGluZyA9IChKYXZhTWFueVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsJCQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0Q29sdW1uRGVmaW5pdGlvbigiQ09MVU1OX0RFRklOSVRJT04iKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZEluc2VydGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE51bGxhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVuaXF1ZShCb29sZWFuLlRSVUUpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFByZWNpc2lvbihJbnRlZ2VyLnZhbHVlT2YoNDYpKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFNjYWxlKEludGVnZXIudmFsdWVPZig0NykpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ09MVU1OX0RFRklOSVRJT04iLCB2aXJ0dWFsQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgdmlydHVhbENvbHVtbi5nZXRTcGVjaWZpZWRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDYpLCB2aXJ0dWFsQ29sdW1uLmdldFNwZWNpZmllZFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NyksIHZpcnR1YWxDb2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgb3JtLnhtbCB2aXJ0dWFsIGNvbHVtbiBpZ25vcmVzIGphdmEgY29sdW1uIGFubm90YXRpb24KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJLy9iZWNvbWVzIGEgMS1tIGJ5IGRlZmF1bHQKLQkJT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCXZpcnR1YWxDb2x1bW4gPSBhZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgdmlydHVhbENvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbENvbHVtbi5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxDb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29sdW1uLmlzVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCB2aXJ0dWFsQ29sdW1uLmdldExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCB2aXJ0dWFsQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIHZpcnR1YWxDb2x1bW4uZ2V0U2NhbGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsTWFwS2V5Q29sdW1uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJT3JtTWFueVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoT3JtTWFueVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkJCi0JCUNvbHVtbiBvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQotCQkvL3NldCBDb2x1bW4gYW5ub3RhdGlvbiBpbiBKYXZhCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFRhYmxlKCJGT09fVEFCTEUiKTsKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldENvbHVtbkRlZmluaXRpb24oIkNPTFVNTl9ERUZJTklUSU9OIik7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZFVwZGF0YWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWROdWxsYWJsZShCb29sZWFuLkZBTFNFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRMZW5ndGgoSW50ZWdlci52YWx1ZU9mKDQ1KSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRQcmVjaXNpb24oSW50ZWdlci52YWx1ZU9mKDQ2KSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJTWFueVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcgPSAoTWFueVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9lbnRpdHkgdGFibGUgY2hhbmdlcyB0aGUgam9pbiB0YWJsZSBkZWZhdWx0IG5hbWUKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFNYW55VG9NYW55TWFwcGluZzJfMCBqYXZhTWFueVRvTWFueU1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX0pPSU5fVEFCTEUiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWphdmFNYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRUYWJsZSgiSkFWQV9UQUJMRSIpOwkKLQkJYXNzZXJ0RXF1YWxzKCJKQVZBX1RBQkxFIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCi0JCS8vbWFrZSBuYW1lIHBlcnNpc3RlbnQgYXR0cmlidXRlIG5vdCB2aXJ0dWFsCi0JCWFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCU1hbnlUb01hbnlNYXBwaW5nIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZyA9IChNYW55VG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZEVudW1lcmF0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiZWxlbWVudENvbGxlY3Rpb25NYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueV8yXzAgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCQkJCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlFbnVtZXJhdGVkKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuU1RSSU5HKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0KLQkJLy9zZXQgZW51bWVyYXRlZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkRW51bWVyYXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJNYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1NYW55VG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5PUkRJTkFMLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLk9SRElOQUwsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRFbnVtVHlwZShFbnVtVHlwZS5TVFJJTkcpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5FbnVtVHlwZS5TVFJJTkcsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuU1RSSU5HLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlFbnVtZXJhdGVkKCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJNYW55VG9NYW55TWFwcGluZyIpOwotCQlPcm1NYW55VG9NYW55TWFwcGluZzJfMCBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1NYW55VG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb01hbnlfMl8wIG1hbnlUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5EQVRFLCAoKFRlbXBvcmFsQ29udmVydGVyKSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQotCQltYW55VG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FU1RBTVApOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgbWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCi0JCS8vc2V0IHRlbXBvcmFsIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW1hbnlUb01hbnlSZXNvdXJjZS5zZXRNYXBLZXlUZW1wb3JhbChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NYW55VG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG1hbnlUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZFRlbXBvcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIk1hbnlUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU1hbnlUb01hbnlNYXBwaW5nMl8wIG9ybU1hbnlUb01hbnlNYXBwaW5nID0gKE9ybU1hbnlUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFueVRvTWFueV8yXzAgbWFueVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwobWFueVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtTWFueVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5EQVRFLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFRlbXBvcmFsVHlwZShUZW1wb3JhbFR5cGUuVElNRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlRlbXBvcmFsVHlwZS5USU1FLCBtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuVElNRSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU1hbnlUb01hbnlNYXBwaW5nLnNldE1hcEtleUNvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCWFzc2VydE51bGwob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWNkYmEwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hbnlUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1NYW55VG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLnJlc291cmNlLmphdmEuSlBBMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sRGVyaXZlZElkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLnYyXzAuWG1sTWFwc0lkXzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG1hbnlUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBMl8wLk1BUFNfSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBtYW55VG9PbmU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fT05FKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYW55VG9PbmUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5NQU5ZX1RPX09ORSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNBU0NBREVfVFlQRSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lKGZldGNoPUZldGNoVHlwZS5MQVpZLCBvcHRpb25hbD1mYWxzZSwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSCwgQ2FzY2FkZVR5cGUuREVUQUNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVyaXZlZElkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbERlcml2ZWRJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibWFueVRvT25lIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRWYWx1ZShmYWxzZSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJtYW55VG9PbmUiKTsKLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSAoT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSkgY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm1hbnlUb09uZSIpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJCi0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hbnlUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRJZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0VHJ1ZSgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKCgoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLgotCQkJCWdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dEF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlT25lVG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQotCQljb250ZXh0QXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVzb3VyY2VNYW55VG9PbmUuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbCgoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbEpvaW5UYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFueVRvT25lTWFwcGluZygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlKYXZhTWFueVRvT25lTWFwcGluZzJfMCBqYXZhTWFueVRvT25lTWFwcGluZyA9ICgoSmF2YU1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCkpOwotCQlNYW55VG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9ICgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCUpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX2lkIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlKb2luQ29sdW1uIGludmVyc2VPcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgaW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldERlZmF1bHRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQlKYXZhSm9pblRhYmxlIGphdmFKb2luVGFibGUgPSAoKEphdmFNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGludmVyc2VKYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJJTlZFUlNFX05BTUUiKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0FUQUxPRyIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIlNDSEVNQSIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCW9ybUpvaW5Db2x1bW4gPSBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJOQU1FIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJFRkVSRU5DRURfTkFNRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWludmVyc2VPcm1Kb2luQ29sdW1uID0gb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIklOVkVSU0VfTkFNRSIsIGludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiLCBpbnZlcnNlT3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRGVmYXVsdE5hbWVGcm9tSmF2YVRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYW55VG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlPcm1NYW55VG9PbmVNYXBwaW5nMl8wIG9ybU1hbnlUb09uZU1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSAoKE9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSB0YXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0KLQkJKChKYXZhRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKEphdmFFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCUphdmFNYW55VG9PbmVNYXBwaW5nMl8wIGphdmFNYW55VG9PbmVNYXBwaW5nID0gKEphdmFNYW55VG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpLmdldE1hcHBpbmcoKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCU1hbnlUb09uZU1hcHBpbmcyXzAgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcgPSAoTWFueVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlvcm1Kb2luVGFibGUgPSAoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOy8vc3BlY2lmaWVkTmFtZSBzaW5jZSB0aGlzIGlzIGEgdmlydHVhbCBtYXBwaW5nIG5vdwotCi0JCSgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5yZW1vdmVTdHJhdGVneSgpOwotCQlvcm1Kb2luVGFibGUgPSAoKE1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydE51bGwob3JtSm9pblRhYmxlKTsKLQkJKChNYW55VG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFNYW55VG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCW9ybUpvaW5UYWJsZSA9ICgoTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVJfRk9PIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQkoKE9ybUVudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9UQUJMRV9OQU1FIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfRk9PIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHROYW1lKCkpOwotCi0JCSgoT3JtRW50aXR5KSB0YXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiT1JNX1RBUkdFVCIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX09STV9UQVJHRVQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFueVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCU9ybU1hbnlUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtTWFueVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU1hbnlUb09uZVJlbGF0aW9uc2hpcDJfMCByZWwgPSAoT3JtTWFueVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hbnlUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5TWFueVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJTWFueVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZyA9IChNYW55VG9PbmVNYXBwaW5nMl8wKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1JFRkVSRU5DRURfQ09MVU1OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfVEFCTEUiLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCAoKEVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZykgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCi0JCXZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZChNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJT3JtTWFueVRvT25lTWFwcGluZzJfMCBvcm1NYW55VG9PbmVNYXBwaW5nID0gKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSBvcm1NYW55VG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSBvcm1NYW55VG9PbmVNYXBwaW5nKS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFlM2I5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGUyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYWNoZWFibGVIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5wZXJzaXN0ZW5jZS5vcHRpb25zLlNoYXJlZENhY2hlTW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzBDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQl9UWVBFX05BTUUgPSAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FID0gUEFDS0FHRV9OQU1FICsgIi4iICsgU1VCX1RZUEVfTkFNRTsKLQotCXB1YmxpYyBFY2xpcHNlTGluazJfME9ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgiZXh0ZW5kcyAiICsgVFlQRV9OQU1FICsgIiAiKTsKLQkJCQlzYi5hcHBlbmQoInt9IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFUVFJJQlVURSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0VHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5IQVJEX1dFQUssIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVDb29yZGluYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGNvb3JkaW5hdGlvbiB0eXBlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHhtbE1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQl4bWxNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2l6ZShuZXcgSW50ZWdlcigxMDUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJeG1sTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNpemUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXhtbE1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVEaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNoYXJlZChudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsJCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleGlzdGVuY2UgY2hlY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9tQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlQ3VzdG9tQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVPYmplY3RUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXIoIkZvbyIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlci5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0Q29udmVydGVyKCJGb28yIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlU3RydWN0Q29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFNwZWNpZmllZENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlMl8wID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlYWJsZTJfMC5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUyXzAuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGVhYmxlMl8wLmdldFNwZWNpZmllZENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5nZXRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRDYWNoZWFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldENhY2hlYWJsZSgpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIG1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZSA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hlYWJsZS5nZXRTcGVjaWZpZWRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCQkKLQkJbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLnNldENhY2hlYWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwZWRTdXBlcmNsYXNzUmVzb3VyY2UuZ2V0Q2FjaGVhYmxlKCkpOwotCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQkJCi0JCW1hcHBlZFN1cGVyY2xhc3NSZXNvdXJjZS5zZXRDYWNoZWFibGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjYWNoZWFibGUuZ2V0U3BlY2lmaWVkQ2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgbWFwcGVkU3VwZXJjbGFzc1Jlc291cmNlLmdldENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSwgcGVyc2lzdGVuY2VVbml0Ml8wLmdldFNoYXJlZENhY2hlTW9kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5BTEwpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRU5BQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuVU5TUEVDSUZJRUQpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21TdXBlclR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NTdWJUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIHN1Yk9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBzdWJNYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgc3ViT3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgbWFwcGVkU3VwZXJjbGFzcyA9IChFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJQ2FjaGVhYmxlMl8wIHN1YkNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBzdWJNYXBwZWRTdXBlcmNsYXNzKS5nZXRDYWNoZWFibGUoKTsKLQkJQ2FjaGVhYmxlMl8wIGNhY2hlYWJsZSA9ICgoQ2FjaGVhYmxlSG9sZGVyMl8wKSBtYXBwZWRTdXBlcmNsYXNzKS5nZXRDYWNoZWFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQkKLQkJUGVyc2lzdGVuY2VVbml0Ml8wIHBlcnNpc3RlbmNlVW5pdDJfMCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUobnVsbCk7Ci0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5FTkFCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQljYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5OT05FKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzRGVmYXVsdENhY2hlYWJsZUZyb21KYXZhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzKCk7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzU3ViVHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBzdWJPcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1NVQl9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCUNhY2hlYWJsZTJfMCBjYWNoZWFibGUgPSAoKENhY2hlYWJsZUhvbGRlcjJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRDYWNoZWFibGUoKTsKLQkJCi0JCUNhY2hlYWJsZTJfMCBqYXZhQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGVhYmxlKCk7Ci0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdDJfMCBwZXJzaXN0ZW5jZVVuaXQyXzAgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShTaGFyZWRDYWNoZU1vZGUuRElTQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXQyXzAuc2V0U3BlY2lmaWVkU2hhcmVkQ2FjaGVNb2RlKFNoYXJlZENhY2hlTW9kZS5ESVNBQkxFX1NFTEVDVElWRSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWphdmFDYWNoZWFibGUuc2V0U3BlY2lmaWVkQ2FjaGVhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0RlZmF1bHRDYWNoZWFibGVGcm9tTWFwcGVkU3VwZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzcygpOwotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc1N1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgc3ViT3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9TVUJfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIHN1Yk1hcHBlZFN1cGVyY2xhc3MgPSAoRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBzdWJPcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBtYXBwZWRTdXBlcmNsYXNzID0gKEVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlDYWNoZWFibGUyXzAgc3ViQ2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIHN1Yk1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlDYWNoZWFibGUyXzAgY2FjaGVhYmxlID0gKChDYWNoZWFibGVIb2xkZXIyXzApIG1hcHBlZFN1cGVyY2xhc3MpLmdldENhY2hlYWJsZSgpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCQotCQlQZXJzaXN0ZW5jZVVuaXQyXzAgcGVyc2lzdGVuY2VVbml0Ml8wID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkKLQkJcGVyc2lzdGVuY2VVbml0Ml8wLnNldFNwZWNpZmllZFNoYXJlZENhY2hlTW9kZShudWxsKTsKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkRJU0FCTEVfU0VMRUNUSVZFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCQkKLQkJY2FjaGVhYmxlLnNldFNwZWNpZmllZENhY2hlYWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBzdWJDYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLkVOQUJMRV9TRUxFQ1RJVkUpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCWNhY2hlYWJsZS5zZXRTcGVjaWZpZWRDYWNoZWFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIHN1YkNhY2hlYWJsZS5pc0RlZmF1bHRDYWNoZWFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdDJfMC5zZXRTcGVjaWZpZWRTaGFyZWRDYWNoZU1vZGUoU2hhcmVkQ2FjaGVNb2RlLk5PTkUpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgc3ViQ2FjaGVhYmxlLmlzRGVmYXVsdENhY2hlYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoZWFibGUuaXNEZWZhdWx0Q2FjaGVhYmxlKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfME9ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDBiYmEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFubm90YXRlZEVsZW1lbnQuS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW51bWVyYXRlZENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5Q29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlRlbXBvcmFsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuQ2FzY2FkZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcmRlckNvbHVtbjJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9yZGVyYWJsZTJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lk9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9uZVRvTWFueU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5NYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb01hbnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS52Ml8wLlhtbE9uZVRvTWFueV8yXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8wQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLS8qKgotICogIEVjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5Db2xsZWN0aW9uPEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl9Ci0JfQotCQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb01hbnkiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGphdmEudXRpbC5NYXA8U3RyaW5nLCBBZGRyZXNzPiBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgYWJicjsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcDxTdHJpbmcsIEFkZHJlc3M+IGFkZHJlc3NlczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIG9ycGhhblJlbW92YWwgPSB0cnVlLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0gsIENhc2NhZGVUeXBlLkRFVEFDSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJCeShcImNpdHlcIiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxBZGRyZXNzPiBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0KLQlwcml2YXRlIE9ybU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9NYW55TWFwcGluZzJfMCBvbmVUb01hbnlNYXBwaW5nKSB7Ci0JCXJldHVybiAoKE9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzApIG9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0T3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT3JwaGFuUmVtb3ZhYmxlMl8wIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbCA9IHRoaXMuZ2V0T3JwaGFuUmVtb3ZhbE9mKG9uZVRvTWFueU1hcHBpbmcpOwotCQlYbWxPbmVUb01hbnkgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJbWFwcGluZ3NPcnBoYW5SZW1vdmFsLnNldFNwZWNpZmllZE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCi0JCW1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5zZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQljcmVhdGVUZXN0RW1iZWRkYWJsZVN0YXRlKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FXyArICJBZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUVfICsgIlN0YXRlIik7Ci0KLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFBrTWFwS2V5KHRydWUpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzUGtNYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJCi0JCS8vc2V0IGN1c3RvbSBzcGVjaWZpZWQgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldEN1c3RvbU1hcEtleSh0cnVlKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJLy9zZXQgbWV0YWRhdGEgY29tcGxldGUgYW5kIHZlcmlmeSB0aGF0IHRoZSBvcm0gbW9kZWwgaWdub3JlcyB0aGUgamF2YSBhbm5vdGF0aW9ucwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQl2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJSXRlcmF0b3I8U3RyaW5nPiBtYXBLZXlOYW1lcyA9IAotCQkJdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENhbmRpZGF0ZU1hcEtleU5hbWVzMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTm9uR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgidGVzdC5BZGRyZXNzIik7Ci0JCW1hcEtleU5hbWVzID0gdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUubmFtZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuYWJiciIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLm5hbWUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFiYnIiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiU3RyaW5nIik7Ci0JCW1hcEtleU5hbWVzID0gb3JtT25lVG9NYW55TWFwcGluZy5nZXRDYW5kaWRhdGVNYXBLZXlOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgbWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCi0JCS8vc2V0IG1hcEtleSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIGRvZXMgbm90IGNoYW5nZQotCQlvbmVUb01hbnkuc2V0TWFwS2V5Q2xhc3MoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCQkJCi0JCS8vc2V0IG1hcEtleSBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb01hbnkuZ2V0TWFwS2V5Q2xhc3MoKS5zZXRDbGFzc05hbWUoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJLy9zZXQgbWFwS2V5IG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQkKLQkJb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuc2V0Q2xhc3NOYW1lKCJTdHJpbmciKTsKLQkJb25lVG9NYW55LnNldE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVmlydHVhbE1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImphdmEubGFuZy5TdHJpbmciLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCQkKLQkJLy9zZXQgcGsgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKCJJbnRlZ2VyIik7Ci0JCWFzc2VydEVxdWFscygiSW50ZWdlciIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIkludGVnZXIiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0RGVmYXVsdE1hcEtleUNsYXNzKCkpOwotCQkKLQkJCi0JCS8vc2V0IGN1c3RvbSBzcGVjaWZpZWQgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCXZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXlDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuU3RyaW5nIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiamF2YS5sYW5nLlN0cmluZyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldERlZmF1bHRNYXBLZXlDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU1hcEtleUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSBvbmVUb01hbnkgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleUNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRNYXBLZXlDbGFzcygpKTsKLQkJCQkJCi0JCS8vc2V0IG1hcEtleSAgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoIlN0cmluZyIpOwotCQlhc3NlcnRFcXVhbHMoIlN0cmluZyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiU3RyaW5nIiwgb25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQkvL3NldCBtYXBLZXkgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1PbmVUb01hbnlNYXBwaW5nLnNldFNwZWNpZmllZE1hcEtleUNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5Q2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldE1hcEtleUNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludFF1ZXVlKCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlQcmludEpvYigpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludFF1ZXVlIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuUHJpbnRKb2IiKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImpvYnMiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlvbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5zZXRNYXBwZWRCeUF0dHJpYnV0ZSgicXVldWUiKTsKLQotCQlPcmRlcmFibGUyXzAgb3JkZXJhYmxlID0gKChPcmRlcmFibGUyXzApIG9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc09yZGVyQ29sdW1uT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNOb09yZGVyaW5nKCkpOwotCQkKLQkJb3JkZXJhYmxlLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JkZXJDb2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJCi0JCW9yZGVyQ29sdW1uLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiam9ic19PUkRFUiIsIG9yZGVyQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIlByaW50Sm9iIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBwcmludEpvYlBlcnNpc3RlbnRUeXBlID0gKE9ybVBlcnNpc3RlbnRUeXBlKSBnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZSgidGVzdC5QcmludEpvYiIpOwotCQkoKEVudGl0eSkgcHJpbnRKb2JQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVlfVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIk1ZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsT3JkZXJDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50UXVldWUoKTsKLQkJY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlByaW50UXVldWUiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5QcmludEpvYiIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiam9icyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0KLQkJT3JkZXJhYmxlMl8wIG9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSBvbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JkZXJhYmxlLmlzTm9PcmRlcmluZygpKTsKLQkJCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JkZXJhYmxlLmlzT3JkZXJDb2x1bW5PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImpvYnMiKTsKLQkJT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCW9yZGVyYWJsZSA9ICgoT3JkZXJhYmxlMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcmRlcmFibGUuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9yZGVyYWJsZS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiUHJpbnRKb2IiLCBvcmRlcmFibGUuZ2V0T3JkZXJDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJqb2JzX09SREVSIiwgb3JkZXJhYmxlLmdldE9yZGVyQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCSgoT3JkZXJhYmxlMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJQcmludEpvYiIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9yZGVyYWJsZS5nZXRPcmRlckNvbHVtbigpLmdldE5hbWUoKSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5UHJpbnRRdWV1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuSUQpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuT05FX1RPX01BTlkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEyXzAuT1JERVJfQ09MVU1OKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIlByaW50UXVldWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBuYW1lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KG1hcHBlZEJ5PVwicXVldWVcIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPcmRlckNvbHVtbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDxQcmludEpvYj4gam9iczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJQcmludFF1ZXVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVudGl0eVByaW50Sm9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5NQU5ZX1RPX09ORSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJQcmludEpvYiIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFByaW50UXVldWUgcXVldWU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiUHJpbnRKb2IuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdmlydHVhbCBhdHRyaWJ1dGUgaW4gb3JtLnhtbCwgamF2YSBhdHRyaWJ1dGUgaGFzIG5vIHZhbHVlIENvbHVtbiBhbm5vdGF0aW9uCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgb3JtQ29sdW1uLmdldFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCWFzc2VydFRydWUob3JtQ29sdW1uLmlzSW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNVcGRhdGFibGUoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29sdW1uLmlzTnVsbGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbHVtbi5pc1VuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9QUkVDSVNJT04sIG9ybUNvbHVtbi5nZXRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1NDQUxFLCBvcm1Db2x1bW4uZ2V0U2NhbGUoKSk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPT19UQUJMRSIsIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDQ1KSwgb3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig0NiksIG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRQcmVjaXNpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNDcpLCBvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkU2NhbGUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSwgb3JtLnhtbCB2aXJ0dWFsIGNvbHVtbiBpZ25vcmVzIGphdmEgY29sdW1uIGFubm90YXRpb24KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgYWRkcmVzc2VzTWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtQ29sdW1uLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbHVtbi5pc1VwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db2x1bW4uaXNOdWxsYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29sdW1uLmlzVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVhZE9ubHlDb2x1bW4uREVGQVVMVF9MRU5HVEgsIG9ybUNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWFkT25seUNvbHVtbi5ERUZBVUxUX1BSRUNJU0lPTiwgb3JtQ29sdW1uLmdldFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXRTY2FsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE51bGxNYXBLZXlDb2x1bW5EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzc2VzIik7Ci0KLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBhZGRyZXNzZXNWaXJ0dWFsTWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCQotCQlDb2x1bW4gb3JtQ29sdW1uID0gYWRkcmVzc2VzVmlydHVhbE1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCk7Ci0KLQkJLy9zZXQgQ29sdW1uIGFubm90YXRpb24gaW4gSmF2YQotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7CQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkZPT19UQUJMRSIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRDb2x1bW5EZWZpbml0aW9uKCJDT0xVTU5fREVGSU5JVElPTiIpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRJbnNlcnRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVXBkYXRhYmxlKEJvb2xlYW4uRkFMU0UpOwkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkTnVsbGFibGUoQm9vbGVhbi5GQUxTRSk7CQotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRVbmlxdWUoQm9vbGVhbi5UUlVFKTsJCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNDUpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkUHJlY2lzaW9uKEludGVnZXIudmFsdWVPZig0NikpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5zZXRTcGVjaWZpZWRTY2FsZShJbnRlZ2VyLnZhbHVlT2YoNDcpKTsKLQotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybUNvbHVtbi5nZXREZWZhdWx0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0SW5zZXJ0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbHVtbi5pc0RlZmF1bHRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db2x1bW4uaXNEZWZhdWx0TnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29sdW1uLmlzRGVmYXVsdFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfTEVOR1RILCBvcm1Db2x1bW4uZ2V0RGVmYXVsdExlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfUFJFQ0lTSU9OLCBvcm1Db2x1bW4uZ2V0RGVmYXVsdFByZWNpc2lvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlYWRPbmx5Q29sdW1uLkRFRkFVTFRfU0NBTEUsIG9ybUNvbHVtbi5nZXREZWZhdWx0U2NhbGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29sdW1uLmdldFNwZWNpZmllZExlbmd0aCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db2x1bW4uZ2V0U3BlY2lmaWVkUHJlY2lzaW9uKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRTY2FsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcEtleUNvbHVtblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy92aXJ0dWFsIGF0dHJpYnV0ZSBpbiBvcm0ueG1sLCBqYXZhIGF0dHJpYnV0ZSBoYXMgbm8gQ29sdW1uIGFubm90YXRpb24KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIGFkZHJlc3Nlc1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJQ29sdW1uIG9ybUNvbHVtbiA9IGFkZHJlc3Nlc1ZpcnR1YWxNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCi0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Db2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJLy9lbnRpdHkgdGFibGUgY2hhbmdlcyB0aGUgam9pbiB0YWJsZSBkZWZhdWx0IG5hbWUKLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL3NldCBDb2x1bW4gdGFibGUgZWxlbWVudCBpbiBKYXZhCi0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkpBVkFfSk9JTl9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuc2V0U3BlY2lmaWVkVGFibGUoIkpBVkFfVEFCTEUiKTsJCi0JCWFzc2VydEVxdWFscygiSkFWQV9UQUJMRSIsIG9ybUNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL21ha2UgbmFtZSBwZXJzaXN0ZW50IGF0dHJpYnV0ZSBub3QgdmlydHVhbAotCQlhZGRyZXNzZXNQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImFkZHJlc3NlcyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIGFkZHJlc3Nlc01hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgYWRkcmVzc2VzUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlvcm1Db2x1bW4gPSBhZGRyZXNzZXNNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpOwotCQlhc3NlcnROdWxsKG9ybUNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fVEFCTEVfQWRkcmVzcyIsIG9ybUNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCByZWwgPSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luQ29sdW1uKCkpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShudWxsKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGFyZ2V0Rm9yZWlnbktleUpvaW5Db2x1bW5TdHJhdGVneSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkR2VuZXJpY01hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtVGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQkvL3Rlc3QgdmlydHVhbCBvcm0gbWFwcGluZywgc2V0dGluZyB0aGUgam9pbiBjb2x1bW4gb24gdGhlIGphdmEgbWFwcGluZwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZzJfMCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcyXzAgamF2YU9uZVRvTWFueU1hcHBpbmcgPSAoSmF2YU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQotCQlKb2luQ29sdW1uIGpvaW5Db2x1bW4gPSAoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5Db2x1bW5TdHJhdGVneSgpLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7CQkKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCBqb2luQ29sdW1uLmdldERlZmF1bHRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJSmF2YUVudGl0eSBhZGRyZXNzRW50aXR5ID0gKEphdmFFbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJYWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCS8vb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW4gb3JtLnhtbAotCQlwZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0KLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWpvaW5Db2x1bW4gPSAoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsJCQotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFERFJFU1NfUFJJTUFSWV9UQUJMRSIsIGpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlPcm1FbnRpdHkgb3JtQWRkcmVzc0VudGl0eSA9IChPcm1FbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJb3JtQWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0KLQkJam9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfaWQiLCBqb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgam9pbkNvbHVtbi5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JLy90YXJnZXQgZm9yZWlnbiBrZXkgY2FzZQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNYXBLZXlDb2x1bW5Kb2luQ29sdW1uU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZEdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJLy90ZXN0IHZpcnR1YWwgb3JtIG1hcHBpbmcsIHNldHRpbmcgdGhlIGpvaW4gY29sdW1uIG9uIHRoZSBqYXZhIG1hcHBpbmcKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcyXzAgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nMl8wIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nMl8wKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpOwotCQkoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCUphdmFFbnRpdHkgYWRkcmVzc0VudGl0eSA9IChKYXZhRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXRUYWJsZSgpKTsKLQotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IChKYXZhUmVzb3VyY2VUeXBlKSBnZXRKcGFQcm9qZWN0KCkuZ2V0SmF2YVJlc291cmNlVHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FLCBLaW5kLlRZUEUpOwotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gcmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uIGNvbHVtbiA9IChNYXBLZXlDb2x1bW4yXzBBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmFkZEFubm90YXRpb24oSlBBMl8wLk1BUF9LRVlfQ09MVU1OKTsKLQkJY29sdW1uLnNldE5hbWUoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQUREUkVTU19QUklNQVJZX1RBQkxFIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCS8vb3ZlcnJpZGUgdGhlIG1hcHBpbmcgaW4gb3JtLnhtbAotCQlwZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQlwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRGYWxzZSgoKE9uZVRvTWFueVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0KLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX0tFWSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlPcm1FbnRpdHkgb3JtQWRkcmVzc0VudGl0eSA9IChPcm1FbnRpdHkpIG9ybVRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJb3JtQWRkcmVzc0VudGl0eS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzZXNfS0VZIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9BRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldFRhYmxlKCkpOy8vdGFyZ2V0IHRhYmxlIG5hbWUKLQotCQlvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3Nlc19LRVkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbHVtbigpLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29sdW1uKCkuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb2x1bW4oKS5nZXREZWZhdWx0VGFibGUoKSk7Ci0JfQotCi0JLy90YXJnZXQgZm9yZWlnbiBrZXkgY2FzZQotCXB1YmxpYyB2b2lkIHRlc3RPcmRlckNvbHVtbkRlZmF1bHRzSm9pbkNvbHVtblN0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRHZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCi0JCS8vdGVzdCB2aXJ0dWFsIG9ybSBtYXBwaW5nLCBzZXR0aW5nIHRoZSBqb2luIGNvbHVtbiBvbiB0aGUgamF2YSBtYXBwaW5nCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpOwotCQlPbmVUb01hbnlNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZzJfMCBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZzJfMCkgcGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQkoKE9yZGVyYWJsZTJfMCkgamF2YU9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkpLnNldE9yZGVyQ29sdW1uT3JkZXJpbmcodHJ1ZSk7Ci0JCU9yZGVyQ29sdW1uMl8wIG9yZGVyQ29sdW1uID0gKChPcmRlcmFibGUyXzApIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpKS5nZXRPcmRlckNvbHVtbigpOwotCi0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCi0JCUphdmFFbnRpdHkgYWRkcmVzc0VudGl0eSA9IChKYXZhRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCWFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsKLQotCQkvL292ZXJyaWRlIHRoZSBtYXBwaW5nIGluIG9ybS54bWwKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJcGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzApIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCi0JCSgoT25lVG9NYW55UmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pbkNvbHVtbigpOwotCQlhc3NlcnRGYWxzZSgoKE9yZGVyYWJsZTJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuaXNPcmRlckNvbHVtbk9yZGVyaW5nKCkpOwotCQkoKE9yZGVyYWJsZTJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuc2V0T3JkZXJDb2x1bW5PcmRlcmluZyh0cnVlKTsKLQkJb3JkZXJDb2x1bW4gPSAoKE9yZGVyYWJsZTJfMCkgb3JtT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKSkuZ2V0T3JkZXJDb2x1bW4oKTsKLQotCQlhc3NlcnROdWxsKG9yZGVyQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBRERSRVNTX1BSSU1BUllfVEFCTEUiLCBvcmRlckNvbHVtbi5nZXRUYWJsZSgpKTsvL3RhcmdldCB0YWJsZSBuYW1lCi0KLQkJT3JtRW50aXR5IG9ybUFkZHJlc3NFbnRpdHkgPSAoT3JtRW50aXR5KSBvcm1UYXJnZXRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCW9ybUFkZHJlc3NFbnRpdHkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzc2VzX09SREVSIiwgb3JkZXJDb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJPUk1fQUREUkVTU19QUklNQVJZX1RBQkxFIiwgb3JkZXJDb2x1bW4uZ2V0VGFibGUoKSk7Ly90YXJnZXQgdGFibGUgbmFtZQotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLgotCQkJZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUyXzAgY2FzY2FkZSA9IChDYXNjYWRlMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzRGV0YWNoKCkpOwotCi0JCWFzc2VydFRydWUodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRUcnVlKCgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKS5pc09ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyB2aXJ0dWFsT25lVG9NYW55TWFwcGluZyA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzTm9PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RmFsc2UoKChPcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZykuZ2V0T3JwaGFuUmVtb3ZhbCgpLmlzT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwpOwotCQlhc3NlcnRFcXVhbHMoRW51bVR5cGUuT1JESU5BTCwgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uRW51bVR5cGUuT1JESU5BTCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5RW51bWVyYXRlZChvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5TVFJJTkcsICgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkRW51bVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleUVudW1lcmF0ZWQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRFbnVtZXJhdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55TWFwcGluZyIpOwotCQlPcm1PbmVUb01hbnlNYXBwaW5nMl8wIG9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT3JtT25lVG9NYW55TWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvTWFueV8yXzAgb25lVG9NYW55UmVzb3VyY2UgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJCQkKLQkJLy9zZXQgZW51bWVyYXRlZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIoRW51bWVyYXRlZENvbnZlcnRlci5jbGFzcyk7Ci0JCSgoRW51bWVyYXRlZENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkRW51bVR5cGUoRW51bVR5cGUuT1JESU5BTCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLk9SRElOQUwsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleUVudW1lcmF0ZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhFbnVtVHlwZS5PUkRJTkFMLCAoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFNwZWNpZmllZEVudW1UeXBlKCkpOwotCQotCQkoKEVudW1lcmF0ZWRDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLnNldFNwZWNpZmllZEVudW1UeXBlKEVudW1UeXBlLlNUUklORyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkVudW1UeXBlLlNUUklORywgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVudW1UeXBlLlNUUklORywgKChFbnVtZXJhdGVkQ29udmVydGVyKSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRFbnVtVHlwZSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRNYXBLZXlDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwob25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5RW51bWVyYXRlZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleUNvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUZW1wb3JhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvTWFueU1hcHBpbmciKTsKLQkJT3JtT25lVG9NYW55TWFwcGluZzJfMCBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9ybU9uZVRvTWFueU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxPbmVUb01hbnlfMl8wIG9uZVRvTWFueVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9NYW55cygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkJCQotCQkvL3NldCB0ZW1wb3JhbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSk7Ci0JCWFzc2VydEVxdWFscyhUZW1wb3JhbFR5cGUuREFURSwgKChUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuZ2V0VGVtcG9yYWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuREFURSwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0JCi0JCW9uZVRvTWFueVJlc291cmNlLnNldE1hcEtleVRlbXBvcmFsKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQkKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5UZW1wb3JhbFR5cGUuVElNRVNUQU1QKTsKLQkJYXNzZXJ0RXF1YWxzKFRlbXBvcmFsVHlwZS5USU1FU1RBTVAsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUVTVEFNUCwgb25lVG9NYW55UmVzb3VyY2UuZ2V0TWFwS2V5VGVtcG9yYWwoKSk7Ci0KLQkJLy9zZXQgdGVtcG9yYWwgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJb25lVG9NYW55UmVzb3VyY2Uuc2V0TWFwS2V5VGVtcG9yYWwobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkVGVtcG9yYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnlNYXBwaW5nIik7Ci0JCU9ybU9uZVRvTWFueU1hcHBpbmcyXzAgb3JtT25lVG9NYW55TWFwcGluZyA9IChPcm1PbmVUb01hbnlNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55XzJfMCBvbmVUb01hbnlSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnlSZXNvdXJjZS5nZXRNYXBLZXlUZW1wb3JhbCgpKTsKLQkJCQkKLQkJLy9zZXQgdGVtcG9yYWwgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKFRlbXBvcmFsQ29udmVydGVyLmNsYXNzKTsKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5EQVRFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLkRBVEUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLkRBVEUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQkKLQkJKChUZW1wb3JhbENvbnZlcnRlcikgb3JtT25lVG9NYW55TWFwcGluZy5nZXRNYXBLZXlDb252ZXJ0ZXIoKSkuc2V0VGVtcG9yYWxUeXBlKFRlbXBvcmFsVHlwZS5USU1FKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uVGVtcG9yYWxUeXBlLlRJTUUsIG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnRFcXVhbHMoVGVtcG9yYWxUeXBlLlRJTUUsICgoVGVtcG9yYWxDb252ZXJ0ZXIpIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkpLmdldFRlbXBvcmFsVHlwZSgpKTsKLQotCQkvL3NldCB0ZW1wb3JhbCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0TWFwS2V5Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueVJlc291cmNlLmdldE1hcEtleVRlbXBvcmFsKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNhMTU5Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzBPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwOSwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotKiAKLSogQ29udHJpYnV0b3JzOgotKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5BdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Kb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFKb2luQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1Kb2luVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5DYXNjYWRlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5PcnBoYW5SZW1vdmFsSG9sZGVyMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVNYXBwaW5nMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQuamF2YS5KYXZhT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtTWFueVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuanBhMi5jb250ZXh0Lm9ybS5Pcm1PbmVUb09uZU1hcHBpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIuY29udGV4dC5vcm0uT3JtT3JwaGFuUmVtb3ZhYmxlMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQub3JtLk9ybU9ycGhhblJlbW92YWxIb2xkZXIyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmpwYTIucmVzb3VyY2UuamF2YS5KUEEyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hbnlUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLlhtbE9uZVRvT25lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxEZXJpdmVkSWRfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0udjJfMC5YbWxNYXBzSWRfMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfME9ybU9uZVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMENvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlICIgKyBUWVBFX05BTUUgKyAiIG9uZVRvT25lOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlmb3IgKE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBlYWNoIDogb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQllYWNoLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQTJfMC5NQVBTX0lEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSBATWFwc0lkIikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSAiICsgVFlQRV9OQU1FICsgIiBvbmVUb09uZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZm9yIChPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgZWFjaCA6IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKSkgewotCQkJZWFjaC5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiQWRkcmVzcy5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBMl8wLkVMRU1FTlRfQ09MTEVDVElPTik7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJBZGRyZXNzIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBFbGVtZW50Q29sbGVjdGlvbiIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuQ29sbGVjdGlvbjxTdGF0ZT4gc3RhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IHppcDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUsIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTUJFRERBQkxFKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJTdGF0ZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBmb287IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIlN0YXRlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9uZVRvT25lIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fT05FLCBKUEEuSk9JTl9DT0xVTU4sIEpQQS5GRVRDSF9UWVBFLCBKUEEuQ0FTQ0FERV9UWVBFLCBFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUsIEVjbGlwc2VMaW5rLlBSSVZBVEVfT1dORUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBvcnBoYW5SZW1vdmFsID0gdHJ1ZSwgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNILCBDYXNjYWRlVHlwZS5ERVRBQ0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5Db2x1bW4obmFtZT1cIk1ZX0NPTFVNTlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT1cIk1ZX1JFRkVSRU5DRURfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQFByaXZhdGVPd25lZCkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgQWRkcmVzcyBhZGRyZXNzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKTsJCQkJCi0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldElkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0SWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwaW5nLmdldElkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRJZChudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlcml2ZWRJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgib25lVG9PbmUiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxEZXJpdmVkSWRfMl8wIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFZhbHVlKGZhbHNlKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldElkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU1hcHNJZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE1hcHNJZERlcml2ZWRJZGVudGl0eSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBjb250ZXh0VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gY29udGV4dFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm9uZVRvT25lIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBjb250ZXh0TWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sTWFwc0lkXzJfMCByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCXJlc291cmNlTWFwcGluZy5zZXRNYXBzSWQoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwc0lkKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNYXBzSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNYXBzSWREZXJpdmVkSWRlbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE1hcHNJZF8yXzAgcmVzb3VyY2VNYXBwaW5nID0gcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuc2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCQkKLQkJY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5zZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoImJhciIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIHJlc291cmNlTWFwcGluZy5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udGV4dE1hcHBpbmcuZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQotCQljb250ZXh0TWFwcGluZy5nZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLnNldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYXBwaW5nLmdldERlcml2ZWRJZGVudGl0eSgpLmdldE1hcHNJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSWRBdHRyaWJ1dGVOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9ycGhNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoTWFwc0lkRGVyaXZlZElkZW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBjb250ZXh0QXR0cmlidXRlID0gKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJvbmVUb09uZSIpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJCi0JCVhtbE9uZVRvT25lIHJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlyZXNvdXJjZU9uZVRvT25lLnNldE1hcHNJZCgiZm9vIik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRJZERlcml2ZWRJZGVudGl0eVN0cmF0ZWd5KCkuZ2V0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VPbmVUb09uZS5nZXRNYXBzSWQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChPcm1PbmVUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYW55VG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hbnlUb09uZS5nZXRJZCgpKTsKLQkJYXNzZXJ0RmFsc2UoKChPcm1NYW55VG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFueVRvT25lLmdldE1hcHNJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKE9ybU1hbnlUb09uZU1hcHBpbmcyXzApIGNvbnRleHRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpKS4KLQkJCQlnZXREZXJpdmVkSWRlbnRpdHkoKS5nZXRNYXBzSWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFNwZWNpZmllZElkQXR0cmlidXRlTmFtZSgpKTsKLQkJCi0JCWNvbnRleHRBdHRyaWJ1dGUuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCXJlc291cmNlT25lVG9PbmUgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0SWQoKSk7Ci0JCWFzc2VydEZhbHNlKCgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0SWREZXJpdmVkSWRlbnRpdHlTdHJhdGVneSgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlT25lVG9PbmUuZ2V0TWFwc0lkKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuCi0JCQkJZ2V0RGVyaXZlZElkZW50aXR5KCkuZ2V0TWFwc0lkRGVyaXZlZElkZW50aXR5U3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRJZEF0dHJpYnV0ZU5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBwZWRCeUF0dHJpYnV0ZU5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lc0VsZW1lbnRDb2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3NXaXRoRWxlbWVudENvbGxlY3Rpb24oKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuU3RhdGUiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCi0JCWFkZFhtbENsYXNzUmVmKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlhZGRYbWxDbGFzc1JlZihQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYWRkWG1sQ2xhc3NSZWYoUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCU9uZVRvT25lTWFwcGluZyBvbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IGF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUuZm9vIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5hZGRyZXNzIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ6aXAiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eSgiZm9vIik7Ci0JCWF0dHJpYnV0ZU5hbWVzID0gCi0JCQlvbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldENhbmRpZGF0ZU1hcHBlZEJ5QXR0cmlidXRlTmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRGYWxzZShhdHRyaWJ1dGVOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb25lVG9PbmVNYXBwaW5nLnNldFNwZWNpZmllZFRhcmdldEVudGl0eShudWxsKTsKLQkJYXR0cmlidXRlTmFtZXMgPSAKLQkJCW9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0Q2FuZGlkYXRlTWFwcGVkQnlBdHRyaWJ1dGVOYW1lcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlIiwgYXR0cmlidXRlTmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZS5mb28iLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInN0YXRlLmFkZHJlc3MiLCBhdHRyaWJ1dGVOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIGF0dHJpYnV0ZU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKGF0dHJpYnV0ZU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIHN0YXRlRm9vTWFwcGluZyA9IG9uZVRvT25lTWFwcGluZy5nZXRSZXNvbHZlZFRhcmdldEVudGl0eSgpLnJlc29sdmVBdHRyaWJ1dGVNYXBwaW5nKCJzdGF0ZS5mb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBzdGF0ZUZvb01hcHBpbmcuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIE9ybU9ycGhhblJlbW92YWJsZTJfMCBnZXRPcnBoYW5SZW1vdmFsT2YoT25lVG9PbmVNYXBwaW5nMl8wIG9uZVRvT25lTWFwcGluZykgewotCQlyZXR1cm4gKChPcm1PcnBoYW5SZW1vdmFsSG9sZGVyMl8wKSBvbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZE9ycGhhblJlbW92YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lTWFwcGluZyIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgb3JtT25lVG9PbmVNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9ycGhhblJlbW92YWJsZTJfMCBtYXBwaW5nc09ycGhhblJlbW92YWwgPSB0aGlzLmdldE9ycGhhblJlbW92YWxPZihvcm1PbmVUb09uZU1hcHBpbmcpOwotCQlYbWxPbmVUb09uZSBvbmVUb09uZVJlc291cmNlID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb25lVG9PbmVSZXNvdXJjZS5nZXRPcnBoYW5SZW1vdmFsKCkpOwotCQkJCQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlvbmVUb09uZVJlc291cmNlLnNldE9ycGhhblJlbW92YWwoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkKLQkJb25lVG9PbmVSZXNvdXJjZS5zZXRPcnBoYW5SZW1vdmFsKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgbWFwcGluZ3NPcnBoYW5SZW1vdmFsLmdldFNwZWNpZmllZE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZU1hcHBpbmciKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIG9ybU9uZVRvT25lTWFwcGluZyA9IChPcm1PbmVUb09uZU1hcHBpbmcyXzApIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPcm1PcnBoYW5SZW1vdmFibGUyXzAgbWFwcGluZ3NPcnBoYW5SZW1vdmFsID0gdGhpcy5nZXRPcnBoYW5SZW1vdmFsT2Yob3JtT25lVG9PbmVNYXBwaW5nKTsKLQkJWG1sT25lVG9PbmUgb25lVG9PbmVSZXNvdXJjZSA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvT25lcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBtYXBwaW5nc09ycGhhblJlbW92YWwuZ2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvbmVUb09uZVJlc291cmNlLmdldE9ycGhhblJlbW92YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCQotCQltYXBwaW5nc09ycGhhblJlbW92YWwuc2V0U3BlY2lmaWVkT3JwaGFuUmVtb3ZhbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9uZVRvT25lUmVzb3VyY2UuZ2V0T3JwaGFuUmVtb3ZhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG1hcHBpbmdzT3JwaGFuUmVtb3ZhbC5nZXRTcGVjaWZpZWRPcnBoYW5SZW1vdmFsKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsSm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRPbmVUb09uZU1hcHBpbmcoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJSmF2YU9uZVRvT25lTWFwcGluZzJfMCBqYXZhT25lVG9PbmVNYXBwaW5nID0gKChKYXZhT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkuZ2V0TWFwcGluZygpKTsKLQkJT25lVG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuc2V0U3RyYXRlZ3lUb0pvaW5UYWJsZSgpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0KLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLQotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbEpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkQ2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnNTaXplKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxKb2luQ29sdW1uID0gdmlydHVhbEpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9BZGRyZXNzIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9pZCIsIHZpcnR1YWxKb2luQ29sdW1uLmdldERlZmF1bHROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlKb2luQ29sdW1uIHZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3NfaWQiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCUphdmFKb2luVGFibGUgamF2YUpvaW5UYWJsZSA9ICgoSmF2YU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlqYXZhSm9pblRhYmxlLnNldFNwZWNpZmllZENhdGFsb2coIkNBVEFMT0ciKTsKLQkJamF2YUpvaW5UYWJsZS5zZXRTcGVjaWZpZWRTY2hlbWEoIlNDSEVNQSIpOwotCQlKYXZhSm9pbkNvbHVtbiBqYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSm9pbkNvbHVtbigwKTsKLQkJamF2YUpvaW5Db2x1bW4uc2V0U3BlY2lmaWVkTmFtZSgiTkFNRSIpOwotCQlqYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgiUkVGRVJFTkNFRF9OQU1FIik7Ci0JCUphdmFKb2luQ29sdW1uIGludmVyc2VKYXZhSm9pbkNvbHVtbiA9IGphdmFKb2luVGFibGUuYWRkU3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW4oMCk7Ci0JCWludmVyc2VKYXZhSm9pbkNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJJTlZFUlNFX05BTUUiKTsKLQkJaW52ZXJzZUphdmFKb2luQ29sdW1uLnNldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCJJTlZFUlNFX1JFRkVSRU5DRURfTkFNRSIpOwotCi0JCWFzc2VydEVxdWFscygiRk9PIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNBVEFMT0ciLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiU0NIRU1BIiwgdmlydHVhbEpvaW5UYWJsZS5nZXRTcGVjaWZpZWRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygxLCB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTkFNRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiUkVGRVJFTkNFRF9OQU1FIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCXZpcnR1YWxJbnZlcnNlT3JtSm9pbkNvbHVtbiA9IHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9OQU1FIiwgdmlydHVhbEludmVyc2VPcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiSU5WRVJTRV9SRUZFUkVOQ0VEX05BTUUiLCB2aXJ0dWFsSW52ZXJzZU9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURlZmF1bHROYW1lRnJvbUphdmFUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aFZhbGlkT25lVG9PbmVNYXBwaW5nKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJhZGRyZXNzIik7Ci0JCU9ybU9uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCU9ybUpvaW5UYWJsZSBvcm1Kb2luVGFibGUgPSAoKE9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgdGFyZ2V0UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSArICJfQWRkcmVzcyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCi0JCSgoSmF2YUVudGl0eSkgdGFyZ2V0UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRUYWJsZSgpLnNldFNwZWNpZmllZE5hbWUoIkZPTyIpOwotCQlhc3NlcnRFcXVhbHMoVFlQRV9OQU1FICsgIl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChKYXZhRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldFRhYmxlKCkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0TmFtZSgpKTsKLQotCQlKYXZhT25lVG9PbmVNYXBwaW5nMl8wIGphdmFPbmVUb09uZU1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKS5nZXRNYXBwaW5nKCk7Ci0JCSgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIGphdmFPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJKChPbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgamF2YU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKSkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJKQVZBX0pPSU5fVEFCTEUiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byB0cnVlLCB3aWxsIGlnbm9yZSBqYXZhIGFubm90YXRpb24gc2V0dGluZ3MKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkvL29ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhUWVBFX05BTUUgKyAiX0FkZHJlc3MiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQkvL3JlbW92ZSBtLW0gbWFwcGluZyBmcm9tIHRoZSBvcm0ueG1sIGZpbGUKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCS8vb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMiA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCU9uZVRvT25lTWFwcGluZzJfMCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nID0gKE9uZVRvT25lTWFwcGluZzJfMCkgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQlKb2luVGFibGUgdmlydHVhbEpvaW5UYWJsZSA9ICgoT25lVG9PbmVSZWxhdGlvbnNoaXAyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuaXNWaXJ0dWFsKCkpOwotCQlhc3NlcnRFcXVhbHMoIkpBVkFfSk9JTl9UQUJMRSIsIHZpcnR1YWxKb2luVGFibGUuZ2V0U3BlY2lmaWVkTmFtZSgpKTsvL3NwZWNpZmllZE5hbWUgc2luY2UgdGhpcyBpcyBhIHZpcnR1YWwgbWFwcGluZyBub3cKLQotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLnJlbW92ZVN0cmF0ZWd5KCk7Ci0JCXZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxKb2luVGFibGUpOwotCQkoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBqYXZhT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCXZpcnR1YWxKb2luVGFibGUgPSAoKE9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkJBUl9GT08iLCB2aXJ0dWFsSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFCTEVfTkFNRSIpOwotCQlhc3NlcnRFcXVhbHMoIk9STV9UQUJMRV9OQU1FX0ZPTyIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0KLQkJKChPcm1FbnRpdHkpIHRhcmdldFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0VGFibGUoKS5zZXRTcGVjaWZpZWROYW1lKCJPUk1fVEFSR0VUIik7Ci0JCWFzc2VydEVxdWFscygiT1JNX1RBQkxFX05BTUVfT1JNX1RBUkdFVCIsIHZpcnR1YWxKb2luVGFibGUuZ2V0RGVmYXVsdE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByZWRvbWluYW50Sm9pbmluZ1N0cmF0ZWd5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoT25lVG9PbmVNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtT25lVG9PbmVNYXBwaW5nMl8wIGNvbnRleHRNYXBwaW5nID0gKE9ybU9uZVRvT25lTWFwcGluZzJfMCkgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wIHJlbCA9IChPcm1PbmVUb09uZVJlbGF0aW9uc2hpcDJfMCkgY29udGV4dE1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGNvbnRleHRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU1hcHBpbmcgPSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCi0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlbC5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9QcmltYXJ5S2V5Sm9pbkNvbHVtbigpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luVGFibGUoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVsLnNldFN0cmF0ZWd5VG9Kb2luQ29sdW1uKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7CQotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb09uZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgY29udGV4dFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY29udGV4dEF0dHJpYnV0ZSA9IGNvbnRleHRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlPcm1PbmVUb09uZU1hcHBpbmcyXzAgY29udGV4dE1hcHBpbmcgPSAoT3JtT25lVG9PbmVNYXBwaW5nMl8wKSBjb250ZXh0QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJT3JtT25lVG9PbmVSZWxhdGlvbnNoaXAyXzAgcmVsID0gKE9ybU9uZVRvT25lUmVsYXRpb25zaGlwMl8wKSBjb250ZXh0TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgY29udGV4dFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCVhtbE9uZVRvT25lIHJlc291cmNlTWFwcGluZyA9IHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmFkZChPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5hZGQoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSm9pbkNvbHVtbigpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldE1hcHBlZEJ5KCJmb28iKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzUHJpbWFyeUtleUpvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0KLQkJcmVzb3VyY2VNYXBwaW5nLnNldEpvaW5UYWJsZShPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKb2luVGFibGUoKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5jbGVhcigpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0UHJpbWFyeUtleUpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc1ByaW1hcnlLZXlKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCi0JCXJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmNsZWFyKCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldFByaW1hcnlLZXlKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRQcmltYXJ5S2V5Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNQcmltYXJ5S2V5Sm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nMl8wIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlKb2luQ29sdW1uIG9ybUpvaW5Db2x1bW4gPSAKLQkJCXZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pbkNvbHVtblN0cmF0ZWd5KCkuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVuaXF1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFVwZGF0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJDT0xVTU5fREVGSU5JVElPTiIsIG9ybUpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZTJfMCBjYXNjYWRlID0gKENhc2NhZGUyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0RldGFjaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgoKE9ycGhhblJlbW92YWxIb2xkZXIyXzApIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcpLmdldE9ycGhhblJlbW92YWwoKS5pc09ycGhhblJlbW92YWwoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzJfMCBvcm1PbmVUb09uZU1hcHBpbmcgPSAoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcyXzApIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1PbmVUb09uZU1hcHBpbmcuaXNPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGluIHhtbCBvbmUtdG8tb25lCi0vLwkJWG1sSm9pbkNvbHVtbiBvcm1Kb2luQ29sdW1uID0gb3JtT25lVG9PbmVNYXBwaW5nLnNwZWNpZmllZEpvaW5Db2x1bW5zKCkubmV4dCgpOwotLy8JCS8vVE9ETyBqYXZhIGRlZmF1bHQgY29sdW1ucyBuYW1lIGluIEphdmFTaW5nbGVSZWxhdGlvbnNoaXBNYXBwaW5nLkpvaW5Db2x1bW5Pd25lcgotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROYW1lKCkpOwotLy8JCS8vYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZEluc2VydGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKFRZUEVfTkFNRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRUYWJsZSgpKTsKLQotCQlDYXNjYWRlMl8wIGNhc2NhZGUgPSAoQ2FzY2FkZTJfMCkgb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNEZXRhY2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCi0JCWFzc2VydEZhbHNlKCgoT3JwaGFuUmVtb3ZhbEhvbGRlcjJfMCkgb3JtT25lVG9PbmVNYXBwaW5nKS5nZXRPcnBoYW5SZW1vdmFsKCkuaXNPcnBoYW5SZW1vdmFsKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMUVudGl0eU1hcHBpbmdzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMUVudGl0eU1hcHBpbmdzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc5MjM2OS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0FjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzFFbnRpdHlNYXBwaW5nc1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rMl8xRW50aXR5TWFwcGluZ3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJLy9zZXQgYWNjZXNzIHRvIFZJUlRVQUwgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkQWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlnZXRFbnRpdHlNYXBwaW5ncygpLnNldFNwZWNpZmllZEFjY2VzcyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCW9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyk7Ci0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkQWNjZXNzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBnZXRFbnRpdHlNYXBwaW5ncygpLmdldERlZmF1bHRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwoZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXREZWZhdWx0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzKCkpOwotCX0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlU3BlY2lmaWVkR2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzTWV0aG9kcyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZCgiZ2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0R2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEdldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCWVudGl0eU1hcHBpbmdzLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRHZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZW50aXR5TWFwcGluZ3MuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgYWNjZXNzLW1ldGhvZHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldFNldE1ldGhvZCgic2V0TWUiKTsKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkR2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXRHZXRNZXRob2QoKSk7Ci0KLQkJZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRHZXRNZXRob2QoImdldEZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIGVudGl0eU1hcHBpbmdzLmdldERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0R2V0TWV0aG9kKCkpOwotCi0JCWVudGl0eU1hcHBpbmdzLnNldFNwZWNpZmllZEdldE1ldGhvZCgiZ2V0QmFyIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRCYXIiLCBlbnRpdHlNYXBwaW5ncy5nZXRHZXRNZXRob2QoKSk7Ci0KLQkJZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRHZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRCYXIiLCBlbnRpdHlNYXBwaW5ncy5nZXRHZXRNZXRob2QoKSk7CQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQotCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNldE1ldGhvZCgic2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgZW50aXR5TWFwcGluZ3MuZ2V0RGVmYXVsdFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXRNZXRob2QoKSk7Ci0KLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBlbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldEJhciIsIGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQotCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChlbnRpdHlNYXBwaW5ncy5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldEJhciIsIGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQkvL3NldCBzZXRNZXRob2QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0QWNjZXNzTWV0aG9kcyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKCJzZXRGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IHNldE1ldGhvZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRTZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldFNldE1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkU2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCWFzc2VydE51bGwoZW50aXR5TWFwcGluZ3MuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQkvL3NldCBzZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQllbnRpdHlNYXBwaW5ncy5zZXRTcGVjaWZpZWRTZXRNZXRob2QoInNldE1lIik7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBlbnRpdHlNYXBwaW5ncy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0KLQkJLy9zZXQgc2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgZW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJLy9zZXQgc2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgZW50aXR5TWFwcGluZ3MuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgYWNjZXNzLW1ldGhvZHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZCgiZ2V0TWUiKTsKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJZW50aXR5TWFwcGluZ3Muc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKGVudGl0eU1hcHBpbmdzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybiAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTViZWEyYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMiBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQWNjZXNzTWV0aG9kc0hvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGluazJfMUNvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMU9ybVBlcnNpc3RlbnRUeXBlVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklELCBKUEEuQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gKE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPSAoWG1sQWNjZXNzTWV0aG9kc0hvbGRlcikgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCXhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuc2V0QWNjZXNzTWV0aG9kcyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKSk7Ci0JCXhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLnNldEdldE1ldGhvZCgiZ2V0Rm9vIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQl4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRHZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkR2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gKE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPSAoWG1sQWNjZXNzTWV0aG9kc0hvbGRlcikgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEdldE1ldGhvZCgiZ2V0TWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRNZSIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRNZSIsIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3BlY2lmaWVkR2V0TWV0aG9kMigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAoT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgeG1sQWNjZXNzTWV0aG9kc0hvbGRlciA9IChYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBhY2Nlc3MtbWV0aG9kcyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKCJzZXRNZSIpOwotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRHZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkR2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQl9Ci0KLQkvL1RPRE8gZGVmYXVsdCBmcm9tIHN1cGVyIGNsYXNzLCBkZWZhdWx0IGZyb20gbWFwcGVkIHN1cGVyIGNsYXNzLCB3aGF0IGFib3V0IGEgZGVmYXVsdCBvbiBhbiBlbWJlZGRhYmxlPwotCS8vZGVmYXVsdCBmcm9tIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMsIGRlZmF1bHQgZnJvbSBlbnRpdHktbWFwcGluZ3MsIGRlZmF1bHQgZnJvbSBqYXZhIGVudGl0eQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0R2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IChPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRUeXBlKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJWG1sQWNjZXNzTWV0aG9kc0hvbGRlciB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyID0gKFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Iiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldCIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCi0JCWdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRGb28iLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldEdldE1ldGhvZCgpKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRHZXRNZXRob2QoImdldEJhciIpOwotCQlhc3NlcnRFcXVhbHMoImdldEZvbyIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0QmFyIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0R2V0TWV0aG9kKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRHZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Iiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRCYXIiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRHZXRNZXRob2QoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRHZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNwZWNpZmllZFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAoT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgeG1sQWNjZXNzTWV0aG9kc0hvbGRlciA9IChYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCi0JCS8vc2V0IHNldE1ldGhvZCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5zZXRBY2Nlc3NNZXRob2RzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQWNjZXNzTWV0aG9kcygpKTsKLQkJeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKCJzZXRGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgc2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCXhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpLnNldFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAoT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50VHlwZSkgZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCVhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgeG1sQWNjZXNzTWV0aG9kc0hvbGRlciA9IChYbWxBY2Nlc3NNZXRob2RzSG9sZGVyKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkpOwotCQkKLQkJLy9zZXQgc2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgc2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtUGVyc2lzdGVudFR5cGUuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRTZXRNZXRob2QyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtRWNsaXBzZUxpbmtQZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IChPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRUeXBlKSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJWG1sQWNjZXNzTWV0aG9kc0hvbGRlciB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyID0gKFhtbEFjY2Vzc01ldGhvZHNIb2xkZXIpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRYbWxUeXBlTWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JCQotCQkvL3NldCBzZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRTZXRNZXRob2QoInNldE1lIik7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCB4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIGFjY2Vzcy1tZXRob2RzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQl4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRHZXRNZXRob2QoImdldE1lIik7Ci0JCS8vc2V0IHNldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoeG1sQWNjZXNzTWV0aG9kc0hvbGRlci5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCX0KLQotCS8vVE9ETyBkZWZhdWx0IGZyb20gc3VwZXIgY2xhc3MsIGRlZmF1bHQgZnJvbSBtYXBwZWQgc3VwZXIgY2xhc3MsIHdoYXQgYWJvdXQgYSBkZWZhdWx0IG9uIGFuIGVtYmVkZGFibGU/Ci0JLy9kZWZhdWx0IGZyb20gcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cywgZGVmYXVsdCBmcm9tIGVudGl0eS1tYXBwaW5ncywgZGVmYXVsdCBmcm9tIGphdmEgZW50aXR5Ci0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQlPcm1FY2xpcHNlTGlua1BlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gKE9ybUVjbGlwc2VMaW5rUGVyc2lzdGVudFR5cGUpIGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlYbWxBY2Nlc3NNZXRob2RzSG9sZGVyIHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIgPSAoWG1sQWNjZXNzTWV0aG9kc0hvbGRlcikgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldFhtbFR5cGVNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkU2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKHhtbEFjY2Vzc01ldGhvZHNIb2xkZXIuZ2V0QWNjZXNzTWV0aG9kcygpKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwpOwotCQlhc3NlcnROdWxsKG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0Iiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbCh4bWxBY2Nlc3NNZXRob2RzSG9sZGVyLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTcGVjaWZpZWRTZXRNZXRob2QoInNldEZvbyIpOwotCQlhc3NlcnRFcXVhbHMoInNldEZvbyIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldERlZmF1bHRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U2V0TWV0aG9kKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZFNldE1ldGhvZCgic2V0QmFyIik7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRCYXIiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTZXRNZXRob2QoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNwZWNpZmllZFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXQiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXREZWZhdWx0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldEJhciIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNldE1ldGhvZCgpKTsKLQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtUGVyc2lzdGVudFR5cGUuZ2V0RGVmYXVsdFNldE1ldGhvZCgpKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSB7Ci0JCXJldHVybihFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmsyXzFQZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YzkzZGIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8xUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5YbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxNYXBwaW5nRmlsZVJlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8xQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8xUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmsyXzFDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGluazJfMVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkgewotCQlyZXR1cm4oRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIChYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0FsbEZlYXR1cmVzVW5zZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYSgiYXNkZiIpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldENhdGFsb2coImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS52Ml8xLkVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5QWNjZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuUFJPUEVSVFkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0KLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQWNjZXNzVHlwZS5WSVJUVUFMLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzEuRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBnZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtBY2Nlc3NUeXBlLlZJUlRVQUwsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0udjJfMS5FY2xpcHNlTGlua0FjY2Vzc1R5cGUuVklSVFVBTCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzTWV0aG9kcyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0R2V0TWV0aG9kKCJnZXRGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRGb28iLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0Rm9vIiwgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCQotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0R2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlHZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEdldE1ldGhvZCgiZ2V0TWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRNZSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJnZXRNZSIsIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldEdldE1ldGhvZCgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUdldE1ldGhvZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRHZXRNZXRob2QoImdldE1lIik7Ci0JCWFzc2VydEVxdWFscygiZ2V0TWUiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygiZ2V0TWUiLCBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRHZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIGFjY2Vzcy1tZXRob2RzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRTZXRNZXRob2QoInNldE1lIik7Ci0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEdldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5R2V0TWV0aG9kMygpIHRocm93cyBFeGNlcHRpb24gewotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRHZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBvbmx5IGFjY2Vzcy1tZXRob2RzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kKCJnZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0R2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoImdldE1lIiwgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0R2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkR2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEdldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzTWV0aG9kcyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEFjY2Vzc01ldGhvZHMoKSk7Ci0KLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKCJzZXRGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRGb28iLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0Rm9vIiwgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCQotCQkvL3NldCBnZXRNZXRob2QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuc2V0U2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTZXRNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNldE1ldGhvZCgic2V0TWUiKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRNZSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzZXRNZSIsIGdldFhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzTWV0aG9kcygpLmdldFNldE1ldGhvZCgpKTsKLQkJCi0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNldE1ldGhvZDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IGdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBnZXRNZXRob2QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRTZXRNZXRob2QoInNldE1lIik7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydEVxdWFscygic2V0TWUiLCBnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5nZXRTZXRNZXRob2QoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIGFjY2Vzcy1tZXRob2RzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKS5zZXRHZXRNZXRob2QoImdldE1lIik7Ci0JCS8vc2V0IGdldE1ldGhvZCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNldE1ldGhvZChudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2V0TWV0aG9kMygpIHRocm93cyBFeGNlcHRpb24gewotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTZXRNZXRob2QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBvbmx5IGFjY2Vzcy1tZXRob2RzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKCJzZXRNZSIpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2V0TWV0aG9kKCkpOwotCQlhc3NlcnRFcXVhbHMoInNldE1lIiwgZ2V0WG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3NNZXRob2RzKCkuZ2V0U2V0TWV0aG9kKCkpOwotCQkKLQkJLy9zZXQgZ2V0TWV0aG9kIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNldE1ldGhvZCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2Vzc01ldGhvZHMoKSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8zT3JtTXVsdGl0ZW5hbmN5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGluazJfM09ybU11bHRpdGVuYW5jeVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkOTRlZmQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rMl8zT3JtTXVsdGl0ZW5hbmN5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnRlc3RzLmludGVybmFsLnByb2plY3RzLlRlc3RKYXZhUHJvamVjdC5Tb3VyY2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5Jbmhlcml0YW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTXVsdGl0ZW5hbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNdWx0aXRlbmFudEhvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzMuTXVsdGl0ZW5hbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rMl8zQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8zT3JtTXVsdGl0ZW5hbmN5VGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rMl8zQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJfVFlQRV9OQU1FID0gIkFubm90YXRpb25UZXN0VHlwZUNoaWxkIjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGVUxMWV9RVUFMSUZJRURfU1VCX1RZUEVfTkFNRSA9IFBBQ0tBR0VfTkFNRSArICIuIiArIFNVQl9UWVBFX05BTUU7Ci0KLQotCXB1YmxpYyBFY2xpcHNlTGluazJfM09ybU11bHRpdGVuYW5jeVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNdWx0aXRlbmFudE1hcHBlZFN1cGVyY2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJCQlKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsCi0JCQkJCUVjbGlwc2VMaW5rLk1VTFRJVEVOQU5ULAotCQkJCQlFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBNdWx0aXRlbmFudCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihuYW1lPVwiTVNfVEVOQU5UX0lEXCIpIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNdWx0aXRlbmFudFJvb3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KAotCQkJCQlKUEEuRU5USVRZLAotCQkJCQlKUEEuSU5IRVJJVEFOQ0UsCi0JCQkJCUVjbGlwc2VMaW5rLk1VTFRJVEVOQU5ULAotCQkJCQlFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEluaGVyaXRlbmFjZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJATXVsdGl0ZW5hbnQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4obmFtZT1cIlJPT1RfRU5USVRZX1RFTkFOVF9JRFwiKSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5FTlRJVFkpOwotCQkJCQlzYi5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQW5ub3RhdGlvblRlc3RUeXBlQ2hpbGQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoImV4dGVuZHMgIiArIFRZUEVfTkFNRSArICIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7fSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFubm90YXRpb25UZXN0VHlwZUNoaWxkLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlYbWxNdWx0aXRlbmFudEhvbGRlciBtdWx0aXRlbmFudEhvbGRlciA9IChYbWxNdWx0aXRlbmFudEhvbGRlcikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJbXVsdGl0ZW5hbnRIb2xkZXIuc2V0TXVsdGl0ZW5hbnQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNdWx0aXRlbmFudCgpKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBvcm1NdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlYbWxNdWx0aXRlbmFudCBtdWx0aXRlbmFudFJlc291cmNlID0gbXVsdGl0ZW5hbnRIb2xkZXIuZ2V0TXVsdGl0ZW5hbnQoKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudFJlc291cmNlLmdldFR5cGUoKSk7Ci0KLQkJLy9zZXQgdHlwZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5zZXRUeXBlKE11bHRpdGVuYW50VHlwZS5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFLCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpdGVuYW50VHlwZS5TSU5HTEVfVEFCTEUsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQkvL3NldCB0eXBlIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW11bHRpdGVuYW50UmVzb3VyY2Uuc2V0VHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudFJlc291cmNlLmdldFR5cGUoKSk7Ci0KLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5zZXRUeXBlKE11bHRpdGVuYW50VHlwZS5UQUJMRV9QRVJfVEVOQU5UKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlLlRBQkxFX1BFUl9URU5BTlQsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VHlwZSgpKTsKLQotCQltdWx0aXRlbmFudFJlc291cmNlLnNldFR5cGUoTXVsdGl0ZW5hbnRUeXBlLlZQRCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5WUEQsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlLlZQRCwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JCW11bHRpdGVuYW50SG9sZGVyLnNldE11bHRpdGVuYW50KG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybU11bHRpdGVuYW5jeS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG11bHRpdGVuYW50SG9sZGVyLmdldE11bHRpdGVuYW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlYbWxNdWx0aXRlbmFudEhvbGRlciBtdWx0aXRlbmFudEhvbGRlciA9IChYbWxNdWx0aXRlbmFudEhvbGRlcikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJbXVsdGl0ZW5hbnRIb2xkZXIuc2V0TXVsdGl0ZW5hbnQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNdWx0aXRlbmFudCgpKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBvcm1NdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlYbWxNdWx0aXRlbmFudCBtdWx0aXRlbmFudFJlc291cmNlID0gbXVsdGl0ZW5hbnRIb2xkZXIuZ2V0TXVsdGl0ZW5hbnQoKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudFJlc291cmNlLmdldFR5cGUoKSk7Ci0KLQkJLy9zZXQgdHlwZSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCW9ybU11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlLlNJTkdMRV9UQUJMRSwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JCW9ybU11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlZQRCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5WUEQsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlLlZQRCwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JCW9ybU11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCwgb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhNdWx0aXRlbmFudFR5cGUuVEFCTEVfUEVSX1RFTkFOVCwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUeXBlKCkpOwotCi0JCS8vc2V0IHR5cGUgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1NdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudFJlc291cmNlLmdldFR5cGUoKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCVhtbE11bHRpdGVuYW50SG9sZGVyIG11bHRpdGVuYW50SG9sZGVyID0gKFhtbE11bHRpdGVuYW50SG9sZGVyKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQltdWx0aXRlbmFudEhvbGRlci5zZXRNdWx0aXRlbmFudChFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE11bHRpdGVuYW50KCkpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG9ybU11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCVhtbE11bHRpdGVuYW50IG11bHRpdGVuYW50UmVzb3VyY2UgPSBtdWx0aXRlbmFudEhvbGRlci5nZXRNdWx0aXRlbmFudCgpOwotCi0JCWFzc2VydE51bGwob3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudFJlc291cmNlLmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQltdWx0aXRlbmFudFJlc291cmNlLnNldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdWx0aXRlbmFudFJlc291cmNlLmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQltdWx0aXRlbmFudFJlc291cmNlLnNldEluY2x1ZGVDcml0ZXJpYShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdWx0aXRlbmFudFJlc291cmNlLmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCW11bHRpdGVuYW50UmVzb3VyY2Uuc2V0SW5jbHVkZUNyaXRlcmlhKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJWG1sTXVsdGl0ZW5hbnRIb2xkZXIgbXVsdGl0ZW5hbnRIb2xkZXIgPSAoWG1sTXVsdGl0ZW5hbnRIb2xkZXIpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCW11bHRpdGVuYW50SG9sZGVyLnNldE11bHRpdGVuYW50KEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTXVsdGl0ZW5hbnQoKSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgb3JtTXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJWG1sTXVsdGl0ZW5hbnQgbXVsdGl0ZW5hbnRSZXNvdXJjZSA9IG11bHRpdGVuYW50SG9sZGVyLmdldE11bHRpdGVuYW50KCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCQlhc3NlcnROdWxsKG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotCi0JCS8vc2V0IGVudW1lcmF0ZWQgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybU11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0KLQkJb3JtTXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0SW5jbHVkZUNyaXRlcmlhKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYSgpKTsKLQotCQkvL3NldCBlbnVtZXJhdGVkIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtTXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZEluY2x1ZGVDcml0ZXJpYShudWxsKTsKLQkJYXNzZXJ0TnVsbChtdWx0aXRlbmFudFJlc291cmNlLmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkSW5jbHVkZUNyaXRlcmlhKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlYbWxNdWx0aXRlbmFudEhvbGRlciBtdWx0aXRlbmFudEhvbGRlciA9IChYbWxNdWx0aXRlbmFudEhvbGRlcikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJbXVsdGl0ZW5hbnRIb2xkZXIuc2V0TXVsdGl0ZW5hbnQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNdWx0aXRlbmFudCgpKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBvcm1NdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlYbWxNdWx0aXRlbmFudCBtdWx0aXRlbmFudFJlc291cmNlID0gbXVsdGl0ZW5hbnRIb2xkZXIuZ2V0TXVsdGl0ZW5hbnQoKTsKLQotCQlPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4gPSBvcm1NdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbi5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQotCQlPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yID0gb3JtTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQotCQlPcm1UZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uMl8zIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4zID0gb3JtTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMSk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4zLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCWFzc2VydEVxdWFscygiQkFSIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDIpLmdldE5hbWUoKSk7Ci0KLQkJTGlzdEl0ZXJhdG9yPE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHModGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjMsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscyh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkpOwotCi0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5mb28iKTsKLQkJWG1sTXVsdGl0ZW5hbnRIb2xkZXIgbXVsdGl0ZW5hbnRIb2xkZXIgPSAoWG1sTXVsdGl0ZW5hbnRIb2xkZXIpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCW11bHRpdGVuYW50SG9sZGVyLnNldE11bHRpdGVuYW50KEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTXVsdGl0ZW5hbnQoKSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgb3JtTXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJWG1sTXVsdGl0ZW5hbnQgbXVsdGl0ZW5hbnRSZXNvdXJjZSA9IG11bHRpdGVuYW50SG9sZGVyLmdldE11bHRpdGVuYW50KCk7Ci0KLQkJb3JtTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCkuc2V0U3BlY2lmaWVkTmFtZSgiRk9PIik7Ci0JCW9ybU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDEpLnNldFNwZWNpZmllZE5hbWUoIkJBUiIpOwotCQlvcm1NdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigyKS5zZXRTcGVjaWZpZWROYW1lKCJCQVoiKTsKLQotCQlhc3NlcnRFcXVhbHMoMywgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLnNpemUoKSk7Ci0KLQkJb3JtTXVsdGl0ZW5hbmN5LnJlbW92ZVNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMCk7Ci0JCWFzc2VydEVxdWFscygyLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCi0JCW9ybU11bHRpdGVuYW5jeS5yZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgwKS5nZXROYW1lKCkpOwotCi0JCW9ybU11bHRpdGVuYW5jeS5yZW1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDApOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLmZvbyIpOwotCQlYbWxNdWx0aXRlbmFudEhvbGRlciBtdWx0aXRlbmFudEhvbGRlciA9IChYbWxNdWx0aXRlbmFudEhvbGRlcikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJbXVsdGl0ZW5hbnRIb2xkZXIuc2V0TXVsdGl0ZW5hbnQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNdWx0aXRlbmFudCgpKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBvcm1NdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlYbWxNdWx0aXRlbmFudCBtdWx0aXRlbmFudFJlc291cmNlID0gbXVsdGl0ZW5hbnRIb2xkZXIuZ2V0TXVsdGl0ZW5hbnQoKTsKLQotCQlvcm1NdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigwKS5zZXRTcGVjaWZpZWROYW1lKCJGT08iKTsKLQkJb3JtTXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oMSkuc2V0U3BlY2lmaWVkTmFtZSgiQkFSIik7Ci0JCW9ybU11bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDIpLnNldFNwZWNpZmllZE5hbWUoIkJBWiIpOwotCi0JCWFzc2VydEVxdWFscygzLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuc2l6ZSgpKTsKLQotCi0JCW9ybU11bHRpdGVuYW5jeS5tb3ZlU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigyLCAwKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4yXzM+IHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgyKS5nZXROYW1lKCkpOwotCi0KLQkJb3JtTXVsdGl0ZW5hbmN5Lm1vdmVTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKDAsIDEpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCBtdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIG11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5nZXQoMikuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuZm9vIik7Ci0JCVhtbE11bHRpdGVuYW50SG9sZGVyIG11bHRpdGVuYW50SG9sZGVyID0gKFhtbE11bHRpdGVuYW50SG9sZGVyKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQltdWx0aXRlbmFudEhvbGRlci5zZXRNdWx0aXRlbmFudChFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE11bHRpdGVuYW50KCkpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG9ybU11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCVhtbE11bHRpdGVuYW50IG11bHRpdGVuYW50UmVzb3VyY2UgPSBtdWx0aXRlbmFudEhvbGRlci5nZXRNdWx0aXRlbmFudCgpOwotCi0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5hZGQoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkpOwotCQltdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuYWRkKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpKTsKLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmFkZChFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSk7Ci0KLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgwKS5zZXROYW1lKCJGT08iKTsKLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgxKS5zZXROYW1lKCJCQVIiKTsKLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLmdldCgyKS5zZXROYW1lKCJCQVoiKTsKLQotCQlMaXN0SXRlcmF0b3I8T3JtVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbjJfMz4gdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5tb3ZlKDIsIDApOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFSIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLm1vdmUoMCwgMSk7Ci0JCXRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zID0gb3JtTXVsdGl0ZW5hbmN5LmdldFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVoiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJCQVIiLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCB0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2UodGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMuaGFzTmV4dCgpKTsKLQotCQltdWx0aXRlbmFudFJlc291cmNlLmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkucmVtb3ZlKDEpOwotCQl0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucyA9IG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiQkFaIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLmhhc05leHQoKSk7Ci0KLQkJbXVsdGl0ZW5hbnRSZXNvdXJjZS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLnJlbW92ZSgxKTsKLQkJdGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMgPSBvcm1NdWx0aXRlbmFuY3kuZ2V0U3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoIkJBWiIsIHRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZSh0ZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucy5oYXNOZXh0KCkpOwotCi0JCW11bHRpdGVuYW50UmVzb3VyY2UuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydEZhbHNlKG9ybU11bHRpdGVuYW5jeS5nZXRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0KLQkvL01hcHBlZFN1cGVyY2xhc3Mgc3BlY2lmaWVzIG11bHRpdGVuYW5jeSwgYWxsIHN1YmNsYXNzIGVudGl0aWVzIGFyZSBtdWx0aXRlbmFudCBieSBkZWZhdWx0LgotCXB1YmxpYyB2b2lkIHRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1dpdGhNYXBwZWRTdXBlcmNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNdWx0aXRlbmFudE1hcHBlZFN1cGVyY2xhc3MoKTsKLQkJY3JlYXRlVGVzdFN1YlR5cGUoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZTIgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFubm90YXRpb25UZXN0VHlwZUNoaWxkIik7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUyLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1TX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJLy9pZiB0aGUgZW50aXR5IHNwZWNpZmllcyBtdWx0aXRlbmFudCwgdGhlbiBpdCBkb2VzIG5vdCBnZXQgdGhlIHRlbmFudCBkaXNjcmltaW5hdG9yIGNvbHVtbnMgZnJvbSB0aGUgbWFwcGVkIHN1cGVyY2xhc3MKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRNdWx0aXRlbmFudChmYWxzZSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG1hcHBlZFN1cGVyY2xhc3NNdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJbWFwcGVkU3VwZXJjbGFzc011bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRNdWx0aXRlbmFudCh0cnVlKTsKLQkJbWFwcGVkU3VwZXJjbGFzc011bHRpdGVuYW5jeS5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiTVNfVEVOQU5UX0lEIik7Ci0JCi0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1TX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvL1Jvb3QgZW50aXR5IHNwZWNpZmllcyBtdWx0aXRlbmFuY3kgYW5kIFNJTkdMRV9UQUJMRSBpbmhlcml0YW5jZSwgYWxsIHN1YmNsYXNzIGVudGl0aWVzIGFyZSBtdWx0aXRlbmFudCBieSBkZWZhdWx0LgotCXB1YmxpYyB2b2lkIHRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1dpdGhJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TXVsdGl0ZW5hbnRSb290RW50aXR5KCk7Ci0JCWNyZWF0ZVRlc3RTdWJUeXBlKCk7Ci0KLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5Bbm5vdGF0aW9uVGVzdFR5cGVDaGlsZCIpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCWFzc2VydFRydWUobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7IC8vbXVsdGl0ZW5hbnQgYnkgZGVmYXVsdCBmcm9tIHJvb3QgZW50aXR5Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJST09UX0VOVElUWV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRSb290RW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0VHJ1ZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsgLy9tdWx0aXRlbmFudCBieSBkZWZhdWx0IGZyb20gcm9vdCBlbnRpdHkKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzU3BlY2lmaWVkTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIlJPT1RfRU5USVRZX1RFTkFOVF9JRCIsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLmdldFJvb3RFbnRpdHkoKS5zZXRTcGVjaWZpZWRJbmhlcml0YW5jZVN0cmF0ZWd5KEluaGVyaXRhbmNlVHlwZS5UQUJMRV9QRVJfQ0xBU1MpOwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsgLy9ub3QgbXVsdGl0ZW5hbnQgc2luY2UgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUgcGVyIGNsYXNzCi0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMpIGdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuYWRkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIlBVX1RFTkFOVF9JRCIpOwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsgLy9ub3QgbXVsdGl0ZW5hbnQgc2luY2UgaW5oZXJpdGFuY2Ugc3RyYXRlZ3kgaXMgdGFibGUgcGVyIGNsYXNzCi0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQkvL2dldCB0aGUgZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW4gZnJvbSB0aGUgcGVyc2lzdGVuY2UgdW5pdCBkZWZhdWx0cyBpbnN0ZWFkIG9mIHRoZSByb290IGVudGl0eSBzaW5jZSBpbmhlcml0YW5jZSBzdHJhdGVneSBpcyB0YWJsZSBwZXIgY2xhc3MKLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZE11bHRpdGVuYW50KHRydWUpOwotCQlhc3NlcnRUcnVlKG11bHRpdGVuYW5jeS5pc1NwZWNpZmllZE11bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJQVV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwkJCi0KLQkJbXVsdGl0ZW5hbmN5LmFkZFNwZWNpZmllZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJDSElMRF9URU5BTlRfSUQiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0hJTERfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5nZXRSb290RW50aXR5KCkuc2V0U3BlY2lmaWVkSW5oZXJpdGFuY2VTdHJhdGVneShJbmhlcml0YW5jZVR5cGUuSk9JTkVEKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiQ0hJTERfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsJCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1dpdGhQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzKSBnZXRNYXBwaW5nRmlsZSgpLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmFkZFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKS5zZXRTcGVjaWZpZWROYW1lKCJQVV9URU5BTlRfSUQiKTsKLQotCQlPcm1FY2xpcHNlTGlua011bHRpdGVuYW5jeTJfMyBtdWx0aXRlbmFuY3kgPSAoKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkpLmdldE11bHRpdGVuYW5jeSgpOwotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0KLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiUFVfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQkvL2lmIHRoZXJlIGFyZSBzcGVjaWZpZWQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucyB0aGVuIHRoZXJlIHNob3VsZCBub3QgYmUgYW55IGRlZmF1bHQgb25lcwotCQltdWx0aXRlbmFuY3kuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkVOVElUWV9URU5BTlRfSUQiKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtdWx0aXRlbmFuY3kuZ2V0RGVmYXVsdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTlRJVFlfVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQkvL2lmIGVudGl0eSBpcyBub3QgU0lOR0xFX1RBQkxFIG11bHRpdGVuYW50IHRoYW4gdGhlcmUgYXJlIG5vIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoRW50aXR5TWFwcGluZ3NEZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0KLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBlbnRpdHlNYXBwaW5ncyA9IChFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzKSBnZXRNYXBwaW5nRmlsZSgpLmdldFJvb3QoKTsKLQkJZW50aXR5TWFwcGluZ3MuYWRkU3BlY2lmaWVkVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpLnNldFNwZWNpZmllZE5hbWUoIkVNX1RFTkFOVF9JRCIpOwotCi0JCU9ybUVjbGlwc2VMaW5rTXVsdGl0ZW5hbmN5Ml8zIG11bHRpdGVuYW5jeSA9ICgoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKSkuZ2V0TXVsdGl0ZW5hbmN5KCk7Ci0JCWFzc2VydEZhbHNlKG11bHRpdGVuYW5jeS5pc011bHRpdGVuYW50KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua011bHRpdGVuYW50VHlwZTJfMy5TSU5HTEVfVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoMSwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTV9URU5BTlRfSUQiLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCi0JCS8vaWYgZW50aXR5IGlzIG5vdCBTSU5HTEVfVEFCTEUgbXVsdGl0ZW5hbnQgdGhhbiB0aGVyZSBhcmUgbm8gZGVmYXVsdCB0ZW5hbnQgZGlzY3JpbWluYXRvciBjb2x1bW5zCi0JCW11bHRpdGVuYW5jeS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rTXVsdGl0ZW5hbnRUeXBlMl8zLlRBQkxFX1BFUl9URU5BTlQpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCQkvL2lmIGVudGl0eSBpcyBub3QgU0lOR0xFX1RBQkxFIG11bHRpdGVuYW50IHRoYW4gdGhlcmUgYXJlIG5vIGRlZmF1bHQgdGVuYW50IGRpc2NyaW1pbmF0b3IgY29sdW1ucwotCQltdWx0aXRlbmFuY3kuc2V0U3BlY2lmaWVkTXVsdGl0ZW5hbnQoZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoMCwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zU2l6ZSgpKTsKLQotCi0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSAoRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cykgZ2V0TWFwcGluZ0ZpbGUoKS5nZXRSb290KCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5hZGRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiUFVfVEVOQU5UX0lEIik7Ci0KLQkJbXVsdGl0ZW5hbmN5LnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtNdWx0aXRlbmFudFR5cGUyXzMuU0lOR0xFX1RBQkxFKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1fVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNXaXRoSmF2YU11bHRpdGVuYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJKChFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKS5zZXRTcGVjaWZpZWRNdWx0aXRlbmFudCh0cnVlKTsKLQkJCQkKLQkJT3JtRWNsaXBzZUxpbmtNdWx0aXRlbmFuY3kyXzMgbXVsdGl0ZW5hbmN5ID0gKChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpKS5nZXRNdWx0aXRlbmFuY3koKTsKLQkJYXNzZXJ0VHJ1ZShtdWx0aXRlbmFuY3kuaXNNdWx0aXRlbmFudCgpKTsgLy9pc011bHRpdGVuYW50IGlzIHRydWUgYmVjYXVzZSB0aGUgamF2YSBlbnRpdHkgc3BlY2lmaWVzIEBNdWx0aXRlbmFudAotCQlhc3NlcnRGYWxzZShtdWx0aXRlbmFuY3kuaXNTcGVjaWZpZWRNdWx0aXRlbmFudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGVudGl0eU1hcHBpbmdzID0gKEVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MpIGdldE1hcHBpbmdGaWxlKCkuZ2V0Um9vdCgpOwotCQllbnRpdHlNYXBwaW5ncy5hZGRTcGVjaWZpZWRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCkuc2V0U3BlY2lmaWVkTmFtZSgiRU1fVEVOQU5UX0lEIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDEsIG11bHRpdGVuYW5jeS5nZXRUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1fVEVOQU5UX0lEIiwgbXVsdGl0ZW5hbmN5LmdldFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQotCi0JCU9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gKE9ybVBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKSBnZXRNYXBwaW5nRmlsZSgpLmdldFJvb3QoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UobXVsdGl0ZW5hbmN5LmlzTXVsdGl0ZW5hbnQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBtdWx0aXRlbmFuY3kuZ2V0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbnNTaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU2MGM1YS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLkVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5TWFwcGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKCJGb28iKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCi0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZVR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQkKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxFbnRpdHlNYXBwaW5ncyByZXNvdXJjZUVudGl0eU1hcHBpbmdzID0gZ2V0WG1sRW50aXR5TWFwcGluZ3MoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCUVjbGlwc2VMaW5rRW50aXR5TWFwcGluZ3MgY29udGV4dEVudGl0eU1hcHBpbmdzID0gZ2V0RW50aXR5TWFwcGluZ3MoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IGNvbnRleHRFbnRpdHlNYXBwaW5ncy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJY29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJWG1sRW50aXR5TWFwcGluZ3MgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncyA9IGdldFhtbEVudGl0eU1hcHBpbmdzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua0VudGl0eU1hcHBpbmdzIGNvbnRleHRFbnRpdHlNYXBwaW5ncyA9IGdldEVudGl0eU1hcHBpbmdzKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBjb250ZXh0RW50aXR5TWFwcGluZ3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7CQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVhtbEVudGl0eU1hcHBpbmdzIHJlc291cmNlRW50aXR5TWFwcGluZ3MgPSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5ncyBjb250ZXh0RW50aXR5TWFwcGluZ3MgPSBnZXRFbnRpdHlNYXBwaW5ncygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gY29udGV4dEVudGl0eU1hcHBpbmdzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHlNYXBwaW5ncy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5TWFwcGluZ3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eU1hcHBpbmdzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUxMGY0Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1CYXNpY01hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ29udmVydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoTXV0YWJsZUJhc2ljRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5NVVRBQkxFLCAiamF2YS51dGlsLkRhdGUiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE11dGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgRGF0ZSBteURhdGU7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgICIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtQmFzaWNNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAKLQkJCShPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxCYXNpYyByZXNvdXJjZUJhc2ljID0gCi0JCQkoWG1sQmFzaWMpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGphdmFCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgdmlydHVhbENvbnRleHRCYXNpYyA9IChFY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCXZpcnR1YWxDb250ZXh0QmFzaWMgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlQmFzaWNEYXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJteURhdGUiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sQmFzaWMgcmVzb3VyY2VCYXNpYyA9IAotCQkJKFhtbEJhc2ljKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIikuZ2V0TWFwcGluZygpOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUJhc2ljLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VCYXNpYy5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUJhc2ljLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgYmFzaWMgbWFwcGluZwotCQkKLQkJamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIHhtbCwgdGVzdCBkZWZhdWx0IG11dGFibGUgZnJvbSBqYXZhCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyB2aXJ0dWFsQ29udGV4dEJhc2ljID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbENvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQl2aXJ0dWFsQ29udGV4dEJhc2ljID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIGNvbnRleHRCYXNpYyA9IAotCQkJKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbEJhc2ljIHJlc291cmNlQmFzaWMgPSAKLQkJCShYbWxCYXNpYykgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlQmFzaWMuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VCYXNpYy5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1CYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUJhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEJhc2ljIGJhc2ljUmVzb3VyY2UgPSAoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKTsKLQkJSmF2YUJhc2ljTWFwcGluZyBqYXZhQmFzaWNNYXBwaW5nID0gKEphdmFCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQotCQkKLQkJamF2YUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmlydHVhbEJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCi0JCWphdmFCYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUJhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sQmFzaWMgYmFzaWNSZXNvdXJjZSA9IChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApOwotCQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUJhc2ljTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1CYXNpY01hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNhY2hpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ2FjaGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ODA2NWIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ2FjaGluZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rVGltZU9mRGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLnYyXzIuQ2FjaGVJc29sYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtQ2FjaGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1DYWNoaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBjYWNoaW5nLmlzU2hhcmVkKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGVudGl0eS5nZXRDYWNoaW5nKCkuaXNTaGFyZWQoKSk7Ci0JCQotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2hhcmVkRmFsc2VVbnNldHNPdGhlckNhY2hlU2V0dGluZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQljYWNoaW5nLnNldFNwZWNpZmllZFNpemUoSW50ZWdlci52YWx1ZU9mKDUwMCkpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5GQUxTRSk7Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMpOwotCQljYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0NBQ0hFKTsKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwMDApKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJCi0JCS8vZXhpc3RlbmNlIGNoZWNraW5nIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgaXNuJ3QgdW5zZXQgd2hlbiBzaGFyZWQgaXMgc2V0IHRvIGZhbHNlCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfQ0FDSEUsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheSB0aW1lT2ZEYXlFeHBpcnkgPSBjYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQl0aW1lT2ZEYXlFeHBpcnkuc2V0SG91cihJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREZWZhdWx0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRUcnVlKGNhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCwgImZhbHNlIik7Ci0JCQotCQlhc3NlcnRGYWxzZShjYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGNhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSyk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgY2FjaGluZy5nZXRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGNhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5zZXRQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwgRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTC50b1N0cmluZygpKTsKLQkJCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBjYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBjYWNoaW5nLmdldFR5cGUoKSk7Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGNhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgZW50aXR5LmdldENhY2hpbmcoKS5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQkKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgY2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgZW50aXR5LmdldENhY2hpbmcoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQkJCi0JCS8vc2V0IHNwZWNpZmllZCBjb29yZGluYXRpb24gdHlwZSB0byB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCwgdmVyaWZ5IGl0IGlzIG5vdCBzZXQgdG8gZGVmYXVsdAotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUyk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBjYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgY2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGNhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoZW50aXR5LmdldENhY2hpbmcoKS5nZXRFeHBpcnkoKSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQljYWNoaW5nLnNldEV4cGlyeShJbnRlZ2VyLnZhbHVlT2YoNTgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1OCksIGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJCi0JCWNhY2hpbmcuc2V0RXhwaXJ5KG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhwaXJ5VW5zZXRzRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQljYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQljYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLnNldEhvdXIoSW50ZWdlci52YWx1ZU9mKDUpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQkKLQkJY2FjaGluZy5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDkwMCkpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig5MDApLCBjYWNoaW5nLmdldEV4cGlyeSgpKTsJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUaW1lT2ZEYXlFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUaW1lT2ZEYXlFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQlFY2xpcHNlTGlua1RpbWVPZkRheSB0aW1lT2ZEYXlFeHBpcnkgPSBjYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRpbWVPZkRheUV4cGlyeSwgY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVUaW1lT2ZEYXlFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRUaW1lT2ZEYXlFeHBpcnlVbnNldHNFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJCi0JCWNhY2hpbmcuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig4MDApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MDApLCBjYWNoaW5nLmdldEV4cGlyeSgpKTsJCi0JCQotCQljYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkJYXNzZXJ0TnVsbChjYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U3BlY2lmaWVkU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSB0eXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IGVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSl0eXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDYWNoaW5nIGNhY2hpbmcgPSBlbnRpdHkuZ2V0Q2FjaGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgY2FjaGluZy5nZXRTaXplKCkpOwotCQkKLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCQotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMTAwLCBjYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFX0RFRkFVTFQsICIzMzMiKTsKLQkJCi0JCWFzc2VydEVxdWFscygzMzMsIGNhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTcGVjaWZpZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMTAwLCBjYWNoaW5nLmdldFNpemUoKSk7Ci0JCQotCQljYWNoaW5nLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgZW50aXR5LmdldENhY2hpbmcoKS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRJc29sYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIHR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgZW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KXR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NhY2hpbmcgY2FjaGluZyA9IGVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbENhY2hlIHhtbENhY2hlID0gZW50aXR5LmdldFhtbFR5cGVNYXBwaW5nKCkuZ2V0Q2FjaGUoKTsKLQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoaW5nLmdldElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxDYWNoZSk7Ci0KLQkJY2FjaGluZy5zZXRTcGVjaWZpZWRJc29sYXRpb24oRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVEKTsJCQotCQl4bWxDYWNoZSA9IGVudGl0eS5nZXRYbWxUeXBlTWFwcGluZygpLmdldENhY2hlKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGVudGl0eS5nZXRDYWNoaW5nKCkuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVELCBlbnRpdHkuZ2V0Q2FjaGluZygpLmdldElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlSXNvbGF0aW9uVHlwZS5QUk9URUNURUQsIHhtbENhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQkvL3NldCBzcGVjaWZpZWQgaXNvbGF0aW9uIHRvIHRoZSBzYW1lIGFzIHRoZSBkZWZhdWx0LCB2ZXJpZnkgaXQgaXMgbm90IHNldCB0byBkZWZhdWx0Ci0JCWNhY2hpbmcuc2V0U3BlY2lmaWVkSXNvbGF0aW9uKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoaW5nLmdldElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlSXNvbGF0aW9uVHlwZS5TSEFSRUQsIHhtbENhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQljYWNoaW5nLnNldFNwZWNpZmllZElzb2xhdGlvbihudWxsKTsKLQkJeG1sQ2FjaGUgPSBlbnRpdHkuZ2V0WG1sVHlwZU1hcHBpbmcoKS5nZXRDYWNoZSgpOwotCQlhc3NlcnROdWxsKGNhY2hpbmcuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoaW5nLmdldElzb2xhdGlvbigpKTsKLQkJYXNzZXJ0TnVsbCh4bWxDYWNoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFNwZWNpZmllZElzb2xhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5KCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgdHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBlbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpdHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ2FjaGluZyBjYWNoaW5nID0gZW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sQ2FjaGUgeG1sQ2FjaGUgPSBlbnRpdHkuZ2V0WG1sVHlwZU1hcHBpbmcoKS5nZXRDYWNoZSgpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5TSEFSRUQsIGNhY2hpbmcuZ2V0SXNvbGF0aW9uKCkpOwotCQlhc3NlcnROdWxsKHhtbENhY2hlKTsKLQotCQllbnRpdHkuZ2V0WG1sVHlwZU1hcHBpbmcoKS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQl4bWxDYWNoZSA9IGVudGl0eS5nZXRYbWxUeXBlTWFwcGluZygpLmdldENhY2hlKCk7Ci0JCXhtbENhY2hlLnNldElzb2xhdGlvbihDYWNoZUlzb2xhdGlvblR5cGUuSVNPTEFURUQpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuSVNPTEFURUQsIGNhY2hpbmcuZ2V0SXNvbGF0aW9uKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUlzb2xhdGlvblR5cGUyXzIuSVNPTEFURUQsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCi0JCXhtbENhY2hlLnNldElzb2xhdGlvbihDYWNoZUlzb2xhdGlvblR5cGUuUFJPVEVDVEVEKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlBST1RFQ1RFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGNhY2hpbmcuZ2V0U3BlY2lmaWVkSXNvbGF0aW9uKCkpOwotCi0JCXhtbENhY2hlLnNldElzb2xhdGlvbihudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCwgY2FjaGluZy5nZXRJc29sYXRpb24oKSk7Ci0JCWFzc2VydE51bGwoY2FjaGluZy5nZXRTcGVjaWZpZWRJc29sYXRpb24oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjYWFkYjQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtQ29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBCYXNpYyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnQobmFtZT1cImZvb1wiKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQENvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1Db252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRDbGFzc05hbWUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q2xhc3NOYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDbGFzc05hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCU9ybUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCVhtbENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0Q29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlPcm1FY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQlYbWxDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldENvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIHVwZGF0ZWQKLQkJb3JtQ29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVtYmVkZGFibGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMTMxMGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW1iZWRkYWJsZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbWJlZGRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFN0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9taXplcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSwgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU1CRUREQUJMRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVNQkVEREFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbWJlZGRhYmxlIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTUJFRERBQkxFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW1iZWRkYWJsZSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBqYXZhQ29udGV4dEVtYmVkZGFibGUgPSAoSmF2YUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW1iZWRkYWJsZS5zZXRDdXN0b21pemVyKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgY3VzdG9taXplciBjbGFzcywgc2V0IGphdmEgY3VzdG9taXplciBjbGFzcywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygiYmFyIik7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vc2V0IHhtbCBjdXN0b21pemVyIG51bGwKLQkJamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5zZXRDdXN0b21pemVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW1iZWRkYWJsZS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ2hhbmdlVHJhY2tpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUgamF2YUNvbnRleHRFbWJlZGRhYmxlID0gKEphdmFFY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFUVFJJQlVURSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW1iZWRkYWJsZS5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKLQkJamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVRUUklCVVRFLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gT0JKRUNULCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gREVGRVJSRUQsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFVVE8sIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbWJlZGRhYmxlLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yQ3VzdG9tQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sQ29udmVydGVyIHJlc291cmNlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXRDbGFzc05hbWUoIkZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnRlci5zZXROYW1lKCJteUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0Q2xhc3NOYW1lKCJGb28yIik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JDdXN0b21Db252ZXJ0ZXJzKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIGNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI+IG9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXIgY29udGV4dENvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZEN1c3RvbUNvbnZlcnRlcigwKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbzIiKTsKLQkJY29udGV4dENvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcihjb250ZXh0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSBvcm1Db250ZXh0RW1iZWRkYWJsZSA9IChPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbWJlZGRhYmxlLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbWJlZGRhYmxlIHJlc291cmNlRW1iZWRkYWJsZSA9IChYbWxFbWJlZGRhYmxlKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVtYmVkZGFibGVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxUeXBlQ29udmVydGVyIHJlc291cmNlVHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQocmVzb3VyY2VUeXBlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlcj4gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZSgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsJCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldE5hbWUoIm15VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBjb250ZXh0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlVHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcihjb250ZXh0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlci5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlIG9ybUNvbnRleHRFbWJlZGRhYmxlID0gKE9ybUVjbGlwc2VMaW5rRW1iZWRkYWJsZSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVtYmVkZGFibGUuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVtYmVkZGFibGUgcmVzb3VyY2VFbWJlZGRhYmxlID0gKFhtbEVtYmVkZGFibGUpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW1iZWRkYWJsZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmFkZChyZXNvdXJjZVN0cnVjdENvbnZlcnRlcik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldENvbnZlcnRlcigiRm9vIik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcj4gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sU3RydWN0Q29udmVydGVyIHJlc291cmNlU3RydWN0Q29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U3RydWN0Q29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW1iZWRkYWJsZUZvclN0cnVjdENvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTUJFRERBQkxFX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VtYmVkZGFibGUgb3JtQ29udGV4dEVtYmVkZGFibGUgPSAoT3JtRWNsaXBzZUxpbmtFbWJlZGRhYmxlKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW1iZWRkYWJsZS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW1iZWRkYWJsZSByZXNvdXJjZUVtYmVkZGFibGUgPSAoWG1sRW1iZWRkYWJsZSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbWJlZGRhYmxlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJY29udGV4dFN0cnVjdENvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI+IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlckNsYXNzKCJGb28yIik7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlU3RydWN0Q29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVtYmVkZGFibGUuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbWJlZGRhYmxlLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW1iZWRkYWJsZS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybUVudGl0eVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwM2E5ZDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLk9ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUaW1lT2ZEYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rQ2FjaGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5qYXZhLkphdmFFY2xpcHNlTGlua0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FY2xpcHNlTGlua09ybUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUVudGl0eVRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtRW50aXR5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvckN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5Rm9yVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eUZvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yUmVhZE9ubHkoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFDb250ZXh0RW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuc2V0UmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KG51bGwpOwotCQlqYXZhQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCQotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gZmFsc2UsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IHhtbCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVJlYWRPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0RW50aXR5LmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dEVudGl0eS5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsJCi0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckN1c3RvbWl6ZXIoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rRW50aXR5IGphdmFDb250ZXh0RW50aXR5ID0gKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDdXN0b21pemVyKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENsYXNzUmVmZXJlbmNlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciBjbGFzcywgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIHNldCBqYXZhIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0Q2xhc3NOYW1lKG51bGwpOwotCQlqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAotCQlqYXZhQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQlyZXNvdXJjZUVudGl0eS5zZXRDdXN0b21pemVyKG51bGwpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUN1c3RvbWl6ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5zZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY3VzdG9taXplciB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtFbnRpdHkgamF2YUNvbnRleHRFbnRpdHkgPSAoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVRUUklCVVRFLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gT0JKRUNULCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gREVGRVJSRUQsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFVVE8sIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgY2hhbmdlIHRyYWNraW5nLCBzZXQgamF2YSBjaGFuZ2UgdHJhY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlyZXNvdXJjZUVudGl0eS5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKLQkJamF2YUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQlyZXNvdXJjZUVudGl0eS5zZXRDaGFuZ2VUcmFja2luZyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENoYW5nZVRyYWNraW5nKCkpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBqYXZhQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2hhbmdlVHJhY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uICB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2hhbmdlIHRyYWNraW5nIHRvIEFUVFJJQlVURSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gREVGRVJSRUQsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZUVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVVRPLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlRW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0RW50aXR5LmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dEVudGl0eS5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgdHlwZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRUeXBlKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUspOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkZVTEwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFR5cGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSB0eXBlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuSEFSRF9XRUFLLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0Q29vcmRpbmF0aW9uVHlwZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgY29vcmRpbmF0aW9uIHR5cGUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNvb3JkaW5hdGlvbiB0eXBlIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgeG1sRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJeG1sRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXhtbEVudGl0eS5nZXRDYWNoZSgpLnNldFNpemUobmV3IEludGVnZXIoMTA1KSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKG5ldyBJbnRlZ2VyKDUwKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTA1KSwgeG1sRW50aXR5LmdldENhY2hlKCkuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwNSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQl4bWxFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRTaXplKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB4bWxFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXhtbEVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgeG1sRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHhtbEVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDUwKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaXplKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRBbHdheXNSZWZyZXNoKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZURpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZERpc2FibGVIaXRzKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0U2hhcmVkKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JfQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTcGVjaWZpZWRTaGFyZWRGYWxzZVVuc2V0c090aGVyQ2FjaGVTZXR0aW5ncygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUspOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaXplKEludGVnZXIudmFsdWVPZig1MDApKTsKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZShFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUyk7Ci0JCW9ybUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFKTsKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0RXhwaXJ5KEludGVnZXIudmFsdWVPZig4MDAwKSk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJCi0JCS8vZXhpc3RlbmNlIGNoZWNraW5nIGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgaXNuJ3QgdW5zZXQgd2hlbiBzaGFyZWQgaXMgc2V0IHRvIGZhbHNlCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQlvcm1Db250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRTaGFyZWQobnVsbCk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5IHRpbWVPZkRheUV4cGlyeSA9IG9ybUNvbnRleHRDYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQl0aW1lT2ZEYXlFeHBpcnkuc2V0SG91cihJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQkKLQkJb3JtQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpKTsJCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRTaGFyZWQoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZUVudGl0eS5zZXRFeGlzdGVuY2VDaGVja2luZyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkV4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRFeGlzdGVuY2VDaGVja2luZyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7CQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgdG8gVHJ1ZSwgY2hlY2sgZGVmYXVsdHMgbm90IGZyb20gamF2YQotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldEV4aXN0ZW5jZUNoZWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBleGlzdGVuY2UgY2hlY2tpbmcsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZUVudGl0eS5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlLkNIRUNLX0RBVEFCQVNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBleGlzdGVuY2UgY2hlY2tpbmcgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEV4aXN0ZW5jZVR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIGV4cGlyeSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnkobmV3IEludGVnZXIoNDUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQ1KSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBleHBpcnksIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0RXhwaXJ5KG5ldyBJbnRlZ2VyKDU1KSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNDUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDQ1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSBleHBpcnkgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnkobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTUpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1NSksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0KLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIGJhY2sgdG8gbnVsbCwgY2hlY2sgZGVmYXVsdHMgZnJvbSBqYXZhCi0JCW9ybUNvbnRleHRFbnRpdHkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDU1KSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlRXhwaXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgZXhwaXJ5LCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dEVudGl0eS5nZXRDYWNoaW5nKCkuc2V0RXhwaXJ5KG5ldyBJbnRlZ2VyKDYwKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig2MCksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNjApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnkoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLnNldEV4cGlyeShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZUVudGl0eS5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIGV4cGlyeSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5zZXRFeHBpcnlUaW1lT2ZEYXkoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUaW1lT2ZEYXkoKSk7Ci0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihuZXcgSW50ZWdlcigxMCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgZXhwaXJ5LCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLmFkZEV4cGlyeVRpbWVPZkRheSgpOwotCQlqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuc2V0SG91cihuZXcgSW50ZWdlcigxMikpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgZXhwaXJ5IHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LmdldENhY2hlKCkuc2V0RXhwaXJ5VGltZU9mRGF5KG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlRW50aXR5LnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldEhvdXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dEVudGl0eS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0RW50aXR5LnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIGphdmFDb250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBleHBpcnksIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5hZGRFeHBpcnlUaW1lT2ZEYXkoKS5zZXRIb3VyKG5ldyBJbnRlZ2VyKDEyKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMiksIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0SG91cigpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgZXhwaXJ5IHRpbWUgb2YgZGF5IG1pbnV0ZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRFbnRpdHkuZ2V0Q2FjaGluZygpLmdldEV4cGlyeVRpbWVPZkRheSgpLnNldE1pbnV0ZShuZXcgSW50ZWdlcigzNSkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEyKSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q2FjaGUoKS5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMTIpLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRFeHBpcnlUaW1lT2ZEYXkoKS5nZXRIb3VyKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMzUpLCByZXNvdXJjZUVudGl0eS5nZXRDYWNoZSgpLmdldEV4cGlyeVRpbWVPZkRheSgpLmdldE1pbnV0ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDM1KSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkuZ2V0TWludXRlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgZXhwaXJ5IHRpbWUgb2YgZGF5IG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0RW50aXR5LmdldENhY2hpbmcoKS5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlRW50aXR5LmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKCJGb28iKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlQ29udmVydGVyMik7Ci0JCXJlc291cmNlQ29udmVydGVyMi5zZXRDbGFzc05hbWUoIkZvbzIiKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldE5hbWUoIm15Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVDdXN0b21Db252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVDdXN0b21Db252ZXJ0ZXIoY29udGV4dENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlVHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eUZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlVHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlVHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVR5cGVDb252ZXJ0ZXIoY29udGV4dFR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtFbnRpdHkgb3JtQ29udGV4dEVudGl0eSA9IChPcm1FY2xpcHNlTGlua0VudGl0eSkgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dEVudGl0eS5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sT2JqZWN0VHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZCgwLCByZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5Rm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rRW50aXR5IG9ybUNvbnRleHRFbnRpdHkgPSAoT3JtRWNsaXBzZUxpbmtFbnRpdHkpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRFbnRpdHkuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IChYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVPYmplY3RUeXBlQ29udmVydGVyKGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJGb28iKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFN0cnVjdENvbnZlcnRlcigpOwotCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCXJlc291cmNlU3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXIoIkZvbzIiKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkubW92ZSgwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua0VudGl0eSBvcm1Db250ZXh0RW50aXR5ID0gKE9ybUVjbGlwc2VMaW5rRW50aXR5KSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0RW50aXR5LmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVTdHJ1Y3RDb252ZXJ0ZXIoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VFbnRpdHkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZUVudGl0eS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVTdHJ1Y3RDb252ZXJ0ZXIoY29udGV4dFN0cnVjdENvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlRW50aXR5LmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwkKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNDM4Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1JZE1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUlkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtJZE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxJZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybUlkTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLklEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuSUQsIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATXV0YWJsZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBEYXRlIG15RGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoSWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0lkTWFwcGluZyBjb250ZXh0SWQgPSAKLQkJCShPcm1FY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxJZCByZXNvdXJjZUlkID0gCi0JCQkoWG1sSWQpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIFRPRE8gLSB0ZXN0IGRlZmF1bHRzIGZvciBqYXZhIHNlcmlhbGl6YWJsZSBhbmQgZGF0ZS90aW1lIHR5cGVzLCAKLQkJLy8gd2l0aCBhbmQgd2l0aG91dCBwZXJzaXN0ZW5jZSBwcm9wZXJ0eQotCQkKLQkJLy8gc2V0IG11dGFibGUgb24gamF2YSBiYXNpYyBtYXBwaW5nCi0JCQotCQlqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyByZW1vdmUgYXR0cmlidXRlIGZyb20geG1sLCB0ZXN0IGRlZmF1bHQgbXV0YWJsZSBmcm9tIGphdmEKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtJZE1hcHBpbmcgdmlydHVhbElkTWFwcGluZyA9IChFY2xpcHNlTGlua0lkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbElkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxJZE1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIHZpcnR1YWxCYXNpY01hcHBpbmcgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbEJhc2ljTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlTXV0YWJsZURhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhNdXRhYmxlSWREYXRlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteURhdGUiKTsKLQkJT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcgY29udGV4dElkID0gCi0JCQkoT3JtRWNsaXBzZUxpbmtJZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sSWQgcmVzb3VyY2VJZCA9IAotCQkJKFhtbElkKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyBqYXZhSWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIikuZ2V0TWFwcGluZygpOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byBmYWxzZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgbXV0YWJsZSB0byB0cnVlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZUlkLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VJZC5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBtdXRhYmxlIG9uIGphdmEgaWQgbWFwcGluZwotCQkKLQkJamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIHhtbCwgdGVzdCBkZWZhdWx0IG11dGFibGUgZnJvbSBqYXZhCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQlFY2xpcHNlTGlua0lkTWFwcGluZyB2aXJ0dWFsSWRNYXBwaW5nID0gKEVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UodmlydHVhbElkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbElkTWFwcGluZy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YUlkTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyB2aXJ0dWFsQmFzaWNNYXBwaW5nID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VJZC5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQmFzaWNNYXBwaW5nLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxCYXNpY01hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhSWRNYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCU9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nIGNvbnRleHRJZCA9IAotCQkJKE9ybUVjbGlwc2VMaW5rSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbElkIHJlc291cmNlSWQgPSAKLQkJCShYbWxJZCkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldElkcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0SWQuZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dElkLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBtdXRhYmxlIHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dElkLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlSWQuZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dElkLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dElkLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dElkLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUlkLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0SWQuZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRJZC5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ29udmVydCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aElkTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUlkTWFwcGluZyBvcm1JZE1hcHBpbmcgPSAoT3JtSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sSWQgYmFzaWNSZXNvdXJjZSA9IChYbWxJZCkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0SWRzKCkuZ2V0KDApOwotCQlKYXZhSWRNYXBwaW5nIGphdmFJZE1hcHBpbmcgPSAoSmF2YUlkTWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImlkIikuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQliYXNpY1Jlc291cmNlLnNldENvbnZlcnQoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCi0JCQotCQlqYXZhSWRNYXBwaW5nLnNldENvbnZlcnRlcihFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MpOwotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBqYXZhSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJSWRNYXBwaW5nIHZpcnR1YWxJZE1hcHBpbmcgPSAoSWRNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCB2aXJ0dWFsSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgdmlydHVhbElkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQlqYXZhSWRNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnROdWxsKGphdmFJZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtSWRNYXBwaW5nIG9ybUlkTWFwcGluZyA9IChPcm1JZE1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxJZCBiYXNpY1Jlc291cmNlID0gKFhtbElkKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRJZHMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydE51bGwob3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydE51bGwoYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkJCQotCQkvL3NldCBsb2IgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUlkTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtSWRNYXBwaW5nLmdldENvbnZlcnRlcigpKS5zZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCJiYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0KLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZShudWxsKTsKLQotCQlhc3NlcnROdWxsKG9ybUlkTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQotCQkvL3NldCBsb2IgdG8gZmFsc2UgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJb3JtSWRNYXBwaW5nLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1JZE1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNmMGNhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFueVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sTWFueVRvTWFueTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU1hbnlUb01hbnlNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuTUFOWV9UT19NQU5ZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX1RBQkxFKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5KT0lOX0NPTFVNTikuYXBwZW5kKCI7Iik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkRlcGFydG1lbnQiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb01hbnkiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luVGFibGUobmFtZT1cIkRFUF9FTVBcIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkRFUFRfSURcIiksIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiRU1QX0lEXCIpKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9CQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk1BTllfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvTWFueShmZXRjaD1GZXRjaFR5cGUuRUFHRVIsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9yZGVyQnkoXCJjaXR5XCIiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0YXRlIHN0YXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCB6aXA7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxNYW55VG9NYW55IHJlc291cmNlTWFueVRvTWFueSA9IAotCQkJKFhtbE1hbnlUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9NYW55cygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvTWFueS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvTWFueS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYW55VG9NYW55LnNldEpvaW5GZXRjaChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb01hbnkiKTsKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGNvbnRleHRNYW55VG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE1hbnlUb01hbnkgcmVzb3VyY2VNYW55VG9NYW55ID0gCi0JCQkoWG1sTWFueVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE1hbnlUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9NYW55LmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvTWFueSA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCi0JCWFzc2VydE51bGwobWFueVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueSA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCQotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpLmdldE1hcHBpbmcoKTsKLQkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQltYW55VG9NYW55ID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG1hbnlUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Sm9pblRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbXBsb3llZSgpOwotCQljcmVhdGVUZXN0RGVwYXJ0bWVudCgpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkRlcGFydG1lbnQiKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5FbXBsb3llZSIpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCU1hbnlUb01hbnlNYXBwaW5nIG1hbnlUb01hbnkgPSAoTWFueVRvTWFueU1hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJSm9pblRhYmxlIG9ybUpvaW5UYWJsZSA9IG1hbnlUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBfRU1QIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiREVQVF9JRCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJFTVBfSUQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSBhbmQgdmVyaWZ5IEpvaW5UYWJsZSBpbmZvIGlzIG5vdCB0YWtlbiBmcm9tIHRoZSBqYXZhCi0JCWRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCWF0dHJpYnV0ZSA9IGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIik7Ci0JCU9uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55ID0gKE9uZVRvTWFueU1hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9FbXBsb3llZSIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byBmYWxzZSwgYWRkIG1hcHBpbmcgdG8gb3JtLnhtbCB2ZXJpZnkgSm9pblRhYmxlIGluZm8gaXMgbm90IHRha2VuIGZyb20gdGhlIGphdmEKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhdHRyaWJ1dGUgPSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpOwotCQltYW55VG9NYW55ID0gKE1hbnlUb01hbnlNYXBwaW5nKSBhdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtSm9pblRhYmxlID0gbWFueVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRFUF9FTVAiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBUX0lEIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNUF9JRCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCQotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJlbXBsb3llZXMiKTsKLQkJYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJbWFueVRvTWFueSA9IChNYW55VG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1Kb2luVGFibGUgPSBtYW55VG9NYW55LmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9FbXBsb3llZSIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X2lkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0Sm9pbkNvbHVtbigpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1uc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJTWFueVRvTWFueU1hcHBpbmcgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nID0gKE1hbnlUb01hbnlNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoIkFkZHJlc3MiLCB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxNYW55VG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSB2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNDdXN0b21PcmRlcmluZygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgdmlydHVhbE1hbnlUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgKChFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcpIHZpcnR1YWxNYW55VG9NYW55TWFwcGluZykuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQotCQlhc3NlcnRFcXVhbHMoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0KLQkJT3JtRWNsaXBzZUxpbmtNYW55VG9NYW55TWFwcGluZyBvcm1NYW55VG9NYW55TWFwcGluZyA9IChPcm1FY2xpcHNlTGlua01hbnlUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0RmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0VGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU1hbnlUb01hbnlNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpLmdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSBvcm1NYW55VG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydFRydWUob3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuaXNOb09yZGVyaW5nKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0T3JkZXJhYmxlKCkuZ2V0U3BlY2lmaWVkT3JkZXJCeSgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmNTA3Mi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEphdmFQcm9qZWN0LlNvdXJjZVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkNhc2NhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkpvaW5Db2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxNYW55VG9PbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1NYW55VG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLk1BTllfVE9fT05FKS5hcHBlbmQoIjsiKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRGVwYXJ0bWVudCIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBATWFueVRvT25lIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEVtcGxveWVlIGVtcGxveWVlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkRlcGFydG1lbnQuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbXBsb3llZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkVtcGxveWVlIikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgZW1wSWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRW1wbG95ZWUuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuTUFOWV9UT19PTkUsIEpQQS5KT0lOX0NPTFVNTiwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gsIEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE1hbnlUb09uZShmZXRjaD1GZXRjaFR5cGUuTEFaWSwgb3B0aW9uYWw9ZmFsc2UsIHRhcmdldEVudGl0eT1BZGRyZXNzLmNsYXNzLCBjYXNjYWRlPXtDYXNjYWRlVHlwZS5BTEwsIENhc2NhZGVUeXBlLlBFUlNJU1QsIENhc2NhZGVUeXBlLk1FUkdFLCBDYXNjYWRlVHlwZS5SRU1PVkUsIENhc2NhZGVUeXBlLlJFRlJFU0h9KSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5Db2x1bW4obmFtZT1cIk1ZX0NPTFVNTlwiLCByZWZlcmVuY2VkQ29sdW1uTmFtZT1cIk1ZX1JFRkVSRU5DRURfQ09MVU1OXCIsIHVuaXF1ZT10cnVlLCBudWxsYWJsZT1mYWxzZSwgaW5zZXJ0YWJsZT1mYWxzZSwgdXBkYXRhYmxlPWZhbHNlLCBjb2x1bW5EZWZpbml0aW9uPVwiQ09MVU1OX0RFRklOSVRJT05cIiwgdGFibGU9XCJNWV9UQUJMRVwiKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU5USVRZKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLklEKTsKLQkJCQkJc2IuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiQWRkcmVzcyIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGlkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBjaXR5OyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIFN0cmluZyBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJBZGRyZXNzLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZSIpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgY29udGV4dE1hbnlUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSkgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sTWFueVRvT25lIHJlc291cmNlTWFueVRvT25lID0gCi0JCQkoWG1sTWFueVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TWFueVRvT25lcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIE9VVEVSLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU1hbnlUb09uZS5zZXRKb2luRmV0Y2goWG1sSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFueVRvT25lLnNldEpvaW5GZXRjaChudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlKb2luRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm1hbnlUb09uZSIpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgY29udGV4dE1hbnlUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxNYW55VG9PbmUgcmVzb3VyY2VNYW55VG9PbmUgPSAKLQkJCShYbWxNYW55VG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRNYW55VG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlTWFueVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5PVVRFUiwgcmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0TWFueVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE1hbnlUb09uZS5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShudWxsKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRNYW55VG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2hEZWZhdWx0RnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgbWFueVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZSA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCQotCQlFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcgamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcgPSAoRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCQlqYXZhUmVsYXRpb25zaGlwTWFwcGluZy5nZXRKb2luRmV0Y2goKS5zZXRWYWx1ZShFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIpOwotCQltYW55VG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChtYW55VG9PbmVNYXBwaW5nLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJbWFueVRvT25lTWFwcGluZyA9IChFY2xpcHNlTGlua1JlbGF0aW9uc2hpcE1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWUiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG1hbnlUb09uZU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZUZhbHNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlNYW55VG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7CQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotCQlNYW55VG9PbmVNYXBwaW5nIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nID0gKE1hbnlUb09uZU1hcHBpbmcpIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsJCi0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJBZGRyZXNzIiwgdmlydHVhbE1hbnlUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCi0JCUpvaW5Db2x1bW4gdmlydHVhbEpvaW5Db2x1bW4gPSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxNYW55VG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCi0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsICgoRWNsaXBzZUxpbmtKb2luRmV0Y2hNYXBwaW5nKSB2aXJ0dWFsTWFueVRvT25lTWFwcGluZykuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU1hbnlUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQotCQlPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcgb3JtTWFueVRvT25lTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua01hbnlUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkVBR0VSLCBvcm1NYW55VG9PbmVNYXBwaW5nLmdldERlZmF1bHRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU1hbnlUb09uZU1hcHBpbmcuaXNEZWZhdWx0T3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtTWFueVRvT25lTWFwcGluZy5nZXREZWZhdWx0VGFyZ2V0RW50aXR5KCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU1hbnlUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzQWxsKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVtb3ZlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtTWFueVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1NYXBwZWRTdXBlcmNsYXNzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDM2NGJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtDdXN0b21Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtFeGlzdGVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuamF2YS5KYXZhRWNsaXBzZUxpbmtDYWNoaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LmphdmEuSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENoYW5nZVRyYWNraW5nVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbENvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbE1hcHBlZFN1cGVyY2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yUmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUywgRWNsaXBzZUxpbmsuUkVBRF9PTkxZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLk1BUFBFRF9TVVBFUkNMQVNTKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJATWFwcGVkU3VwZXJjbGFzcyIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5NQVBQRURfU1VQRVJDTEFTUyk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcHBlZFN1cGVyY2xhc3MiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuTUFQUEVEX1NVUEVSQ0xBU1MpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBwZWRTdXBlcmNsYXNzIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVSZWFkT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclJlYWRPbmx5KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0UmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgcmVhZCBvbmx5LCBzZXQgamF2YSByZWFkIG9ubHkgdG8gdHJ1ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRUcnVlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNEZWZhdWx0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCi0JCS8vIHNldCB4bWwgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0VHJ1ZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5nZXRTcGVjaWZpZWRSZWFkT25seSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCByZWFkIG9ubHksIHNldCBqYXZhIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkoQm9vbGVhbi5GQUxTRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byBmYWxzZSwgY2hlY2sgb3ZlcnJpZGUKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHJlYWQgb25seSB0byB0cnVlLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzUmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JSZWFkT25seSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLnNldFNwZWNpZmllZFJlYWRPbmx5KEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydFRydWUob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmdldFNwZWNpZmllZFJlYWRPbmx5KCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgcmVhZCBvbmx5IHRvIGZhbHNlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5zZXRTcGVjaWZpZWRSZWFkT25seShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuaXNSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc0RlZmF1bHRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCByZWFkIG9ubHkgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuc2V0U3BlY2lmaWVkUmVhZE9ubHkobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0UmVhZE9ubHkoKS5pc1JlYWRPbmx5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRSZWFkT25seSgpLmlzRGVmYXVsdFJlYWRPbmx5KCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldFJlYWRPbmx5KCkuZ2V0U3BlY2lmaWVkUmVhZE9ubHkoKSk7CQotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ3VzdG9taXplckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ3VzdG9taXplcigpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCB4bWwgY3VzdG9taXplciwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIoT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2xhc3NSZWZlcmVuY2UoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGN1c3RvbWl6ZXIgY2xhc3MsIGNoZWNrIG92ZXJyaWRlCi0JCQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldENsYXNzTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnROdWxsKGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjdXN0b21pemVyIGNsYXNzLCBzZXQgamF2YSBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUobnVsbCk7Ci0JCWphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJiYXIiKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJLy8gc2V0IHhtbCBjdXN0b21pemVyIGNsYXNzLCBjaGVjayBvdmVycmlkZQotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5zZXRDbGFzc05hbWUoImZvbyIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0KLQkJLy9zZXQgeG1sIGN1c3RvbWl6ZXIgbnVsbAotCQlqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLnNldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcyhudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldEN1c3RvbWl6ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKSk7Ci0JCWFzc2VydE51bGwoamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21pemVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDdXN0b21pemVyKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldERlZmF1bHRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldFNwZWNpZmllZEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCJmb28iKTsKLQkJCi0JCWFzc2VydEVxdWFscygiZm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRDbGFzc05hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpLmdldEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0RGVmYXVsdEN1c3RvbWl6ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjdXN0b21pemVyIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuc2V0U3BlY2lmaWVkQ3VzdG9taXplckNsYXNzKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q3VzdG9taXplcigpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDdXN0b21pemVyKCkuZ2V0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXREZWZhdWx0Q3VzdG9taXplckNsYXNzKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldEN1c3RvbWl6ZXIoKS5nZXRTcGVjaWZpZWRDdXN0b21pemVyQ2xhc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNoYW5nZVRyYWNraW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydE51bGwob3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCB0eXBlIHRvIEFUVFJJQlVURSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBPQkpFQ1QsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5PQkpFQ1QsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgdHlwZSB0byBERUZFUlJFRCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbENoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHR5cGUgdG8gQVVUTywgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0VHlwZShYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTyk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBqYXZhQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIGNsZWFyIHhtbCBjaGFuZ2UgdHJhY2tpbmcsIHNldCBqYXZhIGNoYW5nZSB0cmFja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDaGFuZ2VUcmFja2luZyhudWxsKTsKLQkJamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVFRSSUJVVEUsIGphdmFDb250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHVuc2V0IG1ldGFkYXRhQ29tcGxldGUsIHNldCB4bWwgY2hhbmdlIHRyYWNraW5nIHRvIE9CSkVDVCwgY2hlY2sgY29udGV4dAotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENoYW5nZVRyYWNraW5nKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2hhbmdlVHJhY2tpbmcoKSk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFR5cGUoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSwgamF2YUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLk9CSkVDVCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDaGFuZ2VUcmFja2luZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBBVFRSSUJVVEUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBPQkpFQ1QsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNUKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuT0JKRUNULCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBERUZFUlJFRCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sQ2hhbmdlVHJhY2tpbmdUeXBlLkRFRkVSUkVELCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5ERUZFUlJFRCwgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjaGFuZ2UgdHJhY2tpbmcgdG8gQVVUTywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxDaGFuZ2VUcmFja2luZ1R5cGUuQVVUTywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdUeXBlLkFVVE8sIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGNoYW5nZSB0cmFja2luZyB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2hhbmdlVHJhY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NoYW5nZVRyYWNraW5nVHlwZS5BVVRPLCBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDaGFuZ2VUcmFja2luZygpLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnROdWxsKG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENoYW5nZVRyYWNraW5nKCkuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFR5cGUob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5DYWNoZVR5cGUuRlVMTCk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuRlVMTCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkVHlwZShFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLKTsKLQkJCi0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkNhY2hlVHlwZS5GVUxMLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5GVUxMLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkZVTEwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHR5cGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFR5cGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5XRUFLLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCQotCQkKLQkJLy8gY2xlYXIgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIGphdmFDb250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLldFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuV0VBSywgamF2YUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5TT0ZUX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZVR5cGUuU09GVF9XRUFLLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSB0eXBlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZFR5cGUoRWNsaXBzZUxpbmtDYWNoZVR5cGUuSEFSRF9XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVUeXBlLkhBUkRfV0VBSywgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLkhBUkRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlVHlwZS5IQVJEX1dFQUssIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFR5cGUoKSk7Ci0JCQkJCi0JCS8vIHNldCBjb250ZXh0IGN1c3RvbWl6ZXIgdG8gbnVsbCwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRUeXBlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVUeXBlLlNPRlRfV0VBSywgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZUNvb3JkaW5hdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSB0eXBlLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuSU5WQUxJREFURV9DSEFOR0VEX09CSkVDVFMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLklOVkFMSURBVEVfQ0hBTkdFRF9PQkpFQ1RTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSB0eXBlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRDb29yZGluYXRpb25UeXBlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgamF2YUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBjb29yZGluYXRpb24gdHlwZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9ORVdfT0JKRUNUU19XSVRIX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldENvb3JkaW5hdGlvblR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX09CSkVDVF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRDb29yZGluYXRpb25UeXBlKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjb29yZGluYXRpb24gdHlwZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDYWNoZUNvb3JkaW5hdGlvblR5cGUuU0VORF9PQkpFQ1RfQ0hBTkdFUywgb3JtQ29udGV4dENhY2hpbmcuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfT0JKRUNUX0NIQU5HRVMsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRDb29yZGluYXRpb25UeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQ29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0U2l6ZShuZXcgSW50ZWdlcigxMDUpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBzaXplLCBjaGVjayBkZWZhdWx0cwotCQkKLQkJamF2YUNvbnRleHRDYWNoaW5nLnNldFNwZWNpZmllZFNpemUobmV3IEludGVnZXIoNTApKTsKLQkJCi0JCWFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxMDUpLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIGphdmFDb250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTA1LCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMTAwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEwNSksIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNpemUobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgamF2YUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyg1MCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBvcm1Db250ZXh0Q2FjaGluZy5nZXREZWZhdWx0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNpemUoKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDUwLCBqYXZhQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUobnVsbCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZVNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShuZXcgSW50ZWdlcig1MCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoNTAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNTApLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaXplKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2l6ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxMDAsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2l6ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0KLQkJCQotCQkvLyBzZXQgamF2YSBjYWNoZSBhbHdheXMgcmVmcmVzaCwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0QWx3YXlzUmVmcmVzaChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldEFsd2F5c1JlZnJlc2gobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Fsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZEFsd2F5c1JlZnJlc2goQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzQWx3YXlzUmVmcmVzaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkQWx3YXlzUmVmcmVzaChudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNBbHdheXNSZWZyZXNoKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdEFsd2F5c1JlZnJlc2goKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRBbHdheXNSZWZyZXNoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2FjaGVSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSBzaXplLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCQkKLQkJLy8gc2V0IGphdmEgY2FjaGUgc2l6ZSwgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCi0JCS8vIHNldCB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2ggdG8gZmFsc2UKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkvLyBjbGVhciB4bWwgY2FjaGUgYWx3YXlzIHJlZnJlc2gsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFJlZnJlc2hPbmx5SWZOZXdlcihudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQotCQkKLQkJLy8gc2V0IG1ldGFkYXRhQ29tcGxldGUgYmFjayB0byBudWxsLCBjaGVjayBkZWZhdWx0cyBmcm9tIGphdmEKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhY2hlUmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkUmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1JlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZURpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFFY2xpcHNlTGlua0NhY2hpbmcgamF2YUNvbnRleHRDYWNoaW5nID0gKChKYXZhRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRNYXBwaW5nKCkpLmdldENhY2hpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCi0KLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5nZXREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJCi0JCS8vIHNldCB4bWwgY2FjaGUgc2l6ZSwgY2hlY2sgc2V0dGluZ3MKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuc2V0RGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQotCQkvLyBzZXQgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoIHRvIGZhbHNlCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldERpc2FibGVIaXRzKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXREaXNhYmxlSGl0cyhudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JCi0JCQotCQkvLyBjbGVhciB4bWwgY2FjaGUsIGNoZWNrIGRlZmF1bHRzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5zZXRDYWNoZShudWxsKTsKLQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHREaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZERpc2FibGVIaXRzKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEaXNhYmxlSGl0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYWNoZURpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ2FjaGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWREaXNhYmxlSGl0cygpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgY2FjaGUgc2l6ZSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpLnNldFNwZWNpZmllZERpc2FibGVIaXRzKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0Rpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRGlzYWJsZUhpdHMoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDYWNoZVNoYXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvckNhY2hpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlKYXZhRWNsaXBzZUxpbmtDYWNoaW5nIGphdmFDb250ZXh0Q2FjaGluZyA9ICgoSmF2YUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0TWFwcGluZygpKS5nZXRDYWNoaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJRWNsaXBzZUxpbmtDYWNoaW5nIG9ybUNvbnRleHRDYWNoaW5nID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGluZygpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQotCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGNhY2hlLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0Q2FjaGUoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQotCQkvLyBzZXQgeG1sIGNhY2hlIHNpemUsIGNoZWNrIHNldHRpbmdzCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLnNldFNoYXJlZChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIHNpemUsIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlqYXZhQ29udGV4dENhY2hpbmcuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc0RlZmF1bHRTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJLy8gc2V0IHhtbCBjYWNoZSBhbHdheXMgcmVmcmVzaCB0byBmYWxzZQotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Db250ZXh0Q2FjaGluZy5nZXRTcGVjaWZpZWRTaGFyZWQoKSk7Ci0KLQkJLy8gY2xlYXIgeG1sIGNhY2hlIGFsd2F5cyByZWZyZXNoLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKS5zZXRTaGFyZWQobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpLmdldFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIGNsZWFyIHhtbCBjYWNoZSwgY2hlY2sgZGVmYXVsdHMKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLnNldENhY2hlKG51bGwpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgamF2YUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkKLQkJCi0JCS8vIHNldCBtZXRhZGF0YUNvbXBsZXRlIHRvIFRydWUsIGNoZWNrIGRlZmF1bHRzIG5vdCBmcm9tIGphdmEKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIGphdmFDb250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSBiYWNrIHRvIG51bGwsIGNoZWNrIGRlZmF1bHRzIGZyb20gamF2YQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBqYXZhQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNTaGFyZWQoKSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2FjaGVTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q2FjaGUoKSk7Ci0JCWFzc2VydEVxdWFscyh0cnVlLCBvcm1Db250ZXh0Q2FjaGluZy5pc1NoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzRGVmYXVsdFNoYXJlZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnRleHRDYWNoaW5nLmdldFNwZWNpZmllZFNoYXJlZCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIHNpemUsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2hhcmVkKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hlKCkuZ2V0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCQkJCQotCQkvLyBzZXQgY29udGV4dCBjYWNoZSBzaXplIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkU2hhcmVkKG51bGwpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybUNvbnRleHRDYWNoaW5nLmlzU2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtQ29udGV4dENhY2hpbmcuaXNEZWZhdWx0U2hhcmVkKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkU2hhcmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlRXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJSmF2YUVjbGlwc2VMaW5rQ2FjaGluZyBqYXZhQ29udGV4dENhY2hpbmcgPSAoKEphdmFFY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldE1hcHBpbmcoKSkuZ2V0Q2FjaGluZygpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rQ2FjaGluZyBvcm1Db250ZXh0Q2FjaGluZyA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0KLQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBzZXR0aW5ncwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkJCi0JCS8vIHNldCBqYXZhIGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWphdmFDb250ZXh0Q2FjaGluZy5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5FeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQkvLyBjbGVhciB4bWwgZXhpc3RlbmNlIGNoZWNraW5nLCBjaGVjayBkZWZhdWx0cwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3Muc2V0RXhpc3RlbmNlQ2hlY2tpbmcobnVsbCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX05PTl9FWElTVEVOQ0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsJCi0JCQotCQkvLyBzZXQgbWV0YWRhdGFDb21wbGV0ZSB0byBUcnVlLCBjaGVjayBkZWZhdWx0cyBub3QgZnJvbSBqYXZhCi0KLQkJb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3Muc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRFeGlzdGVuY2VDaGVja2luZygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSwgamF2YUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKG51bGwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RXhpc3RlbmNlQ2hlY2tpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDYWNoaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlFY2xpcHNlTGlua0NhY2hpbmcgb3JtQ29udGV4dENhY2hpbmcgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGNhY2hlIGV4aXN0ZW5jZSBjaGVja2luZywgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCW9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENhY2hpbmcoKS5zZXRTcGVjaWZpZWRFeGlzdGVuY2VUeXBlKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRXhpc3RlbmNlVHlwZS5BU1NVTUVfRVhJU1RFTkNFLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RXhpc3RlbmNlVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rRXhpc3RlbmNlVHlwZS5DSEVDS19EQVRBQkFTRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0RGVmYXVsdEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQVNTVU1FX0VYSVNURU5DRSwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQkJCQkKLQkJLy8gc2V0IGNvbnRleHQgZXhpc3RlbmNlIGNoZWNraW5nIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQlvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDYWNoaW5nKCkuc2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZShudWxsKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0RXhpc3RlbmNlQ2hlY2tpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldEV4aXN0ZW5jZVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0V4aXN0ZW5jZVR5cGUuQ0hFQ0tfREFUQUJBU0UsIG9ybUNvbnRleHRDYWNoaW5nLmdldERlZmF1bHRFeGlzdGVuY2VUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udGV4dENhY2hpbmcuZ2V0U3BlY2lmaWVkRXhpc3RlbmNlVHlwZSgpKTsKLQl9Ci0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUN1c3RvbUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnRlciByZXNvdXJjZUNvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlQ29udmVydGVyKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0Q2xhc3NOYW1lKCJGb28iKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIuc2V0TmFtZSgibXlDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxDb252ZXJ0ZXIgcmVzb3VyY2VDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VDb252ZXJ0ZXIyLnNldENsYXNzTmFtZSgiRm9vMiIpOwotCQlyZXNvdXJjZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDdXN0b21Db252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRDdXN0b21Db252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0Q29udmVydGVyLnNldE5hbWUoIm15Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyPiBvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rQ3VzdG9tQ29udmVydGVyIG9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua0N1c3RvbUNvbnZlcnRlciBjb250ZXh0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkQ3VzdG9tQ29udmVydGVyKDApOwotCQljb250ZXh0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0Q29udmVydGVyMi5zZXROYW1lKCJteUNvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZUN1c3RvbUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q2xhc3NOYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0Q3VzdG9tQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlciA9IG9ybUNvbnRleHRDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZUN1c3RvbUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENsYXNzTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRDdXN0b21Db252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyMiIsIG9ybUNvbnRleHRDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlQ3VzdG9tQ29udmVydGVyKGNvbnRleHRDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldEN1c3RvbUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0ZvclR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJWG1sVHlwZUNvbnZlcnRlciByZXNvdXJjZVR5cGVDb252ZXJ0ZXIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlVHlwZUNvbnZlcnRlcik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlci5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VUeXBlQ29udmVydGVyMiA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sVHlwZUNvbnZlcnRlcigpOwotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VUeXBlQ29udmVydGVyMik7Ci0JCXJlc291cmNlVHlwZUNvbnZlcnRlcjIuc2V0RGF0YVR5cGUoIkZvbzIiKTsKLQkJcmVzb3VyY2VUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnJlbW92ZShyZXNvdXJjZVR5cGVDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVR5cGVDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yVHlwZUNvbnZlcnRlcnMoKTsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5NQVBQRURfU1VQRVJDTEFTU19UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzIG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzID0gKE9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpOwotCQlPcm1FY2xpcHNlTGlua0NvbnZlcnRlckNvbnRhaW5lciBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyID0gb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MuZ2V0Q29udmVydGVyQ29udGFpbmVyKCk7Ci0JCVhtbE1hcHBlZFN1cGVyY2xhc3MgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzID0gKFhtbE1hcHBlZFN1cGVyY2xhc3MpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0TWFwcGVkU3VwZXJjbGFzc2VzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgY29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyLnNldERhdGFUeXBlKCJGb28iKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPD8gZXh0ZW5kcyBFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXI+IG9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhbm90aGVyIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIGNvbnRleHRUeXBlQ29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJY29udGV4dFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCWNvbnRleHRUeXBlQ29udmVydGVyMi5zZXROYW1lKCJteVR5cGVDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLm1vdmVUeXBlQ29udmVydGVyKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlVHlwZUNvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlUeXBlQ29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5yZW1vdmVUeXBlQ29udmVydGVyKGNvbnRleHRUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlT2JqZWN0VHlwZUNvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JPYmplY3RUeXBlQ29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgcmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmFkZChyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0RGF0YVR5cGUoIkZvbyIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuYWRkKDAsIHJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQlyZXNvdXJjZU9iamVjdFR5cGVDb252ZXJ0ZXIyLnNldERhdGFUeXBlKCJGb28yIik7Ci0JCXJlc291cmNlT2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5tb3ZlKDAsIDEpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkucmVtb3ZlKDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5yZW1vdmUocmVzb3VyY2VPYmplY3RUeXBlQ29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlQ29udmVydGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0TWFwcGVkU3VwZXJjbGFzc0Zvck9iamVjdFR5cGVDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL2FkZCBhIGNvbnZlcnRlciB0byB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIGNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5zZXREYXRhVHlwZSgiRm9vIik7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLnNldE5hbWUoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCUxpc3RJdGVyYXRvcjw/IGV4dGVuZHMgRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyPiBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYW5vdGhlciBjb252ZXJ0ZXIgdG8gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyMi5zZXREYXRhVHlwZSgiRm9vMiIpOwotCQljb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIuc2V0TmFtZSgibXlPYmplY3RUeXBlQ29udmVydGVyMiIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgxKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRPYmplY3RUeXBlQ29udmVydGVyc1NpemUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlciA9IG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vbW92ZSBhIGNvbnZlcnRlciBpbiB0aGUgY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5tb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKS5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlciIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyID0gb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlPYmplY3RUeXBlQ29udmVydGVyMiIsIG9ybUNvbnRleHRPYmplY3RUeXBlQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZU9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15T2JqZWN0VHlwZUNvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKTsKLQkJb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIgPSBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteU9iamVjdFR5cGVDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dE9iamVjdFR5cGVDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlT2JqZWN0VHlwZUNvbnZlcnRlcihjb250ZXh0T2JqZWN0VHlwZUNvbnZlcnRlcjIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVN0cnVjdENvbnZlcnRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdE1hcHBlZFN1cGVyY2xhc3NGb3JTdHJ1Y3RDb252ZXJ0ZXJzKCk7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuTUFQUEVEX1NVUEVSQ0xBU1NfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybUVjbGlwc2VMaW5rTWFwcGVkU3VwZXJjbGFzcyBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcyA9IChPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3MpIG9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKTsKLQkJT3JtRWNsaXBzZUxpbmtDb252ZXJ0ZXJDb250YWluZXIgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlciA9IG9ybUNvbnRleHRNYXBwZWRTdXBlcmNsYXNzLmdldENvbnZlcnRlckNvbnRhaW5lcigpOwotCQlYbWxNYXBwZWRTdXBlcmNsYXNzIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcyA9IChYbWxNYXBwZWRTdXBlcmNsYXNzKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldE1hcHBlZFN1cGVyY2xhc3NlcygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9hZGQgYSBjb252ZXJ0ZXIgdG8gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbFN0cnVjdENvbnZlcnRlciByZXNvdXJjZVN0cnVjdENvbnZlcnRlciA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sU3RydWN0Q29udmVydGVyKCk7Ci0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuYWRkKHJlc291cmNlU3RydWN0Q29udmVydGVyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJGb28iKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlYbWxTdHJ1Y3RDb252ZXJ0ZXIgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxTdHJ1Y3RDb252ZXJ0ZXIoKTsKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5hZGQoMCwgcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJcmVzb3VyY2VTdHJ1Y3RDb252ZXJ0ZXIyLnNldENvbnZlcnRlcigiRm9vMiIpOwotCQlyZXNvdXJjZVN0cnVjdENvbnZlcnRlcjIuc2V0TmFtZSgibXlTdHJ1Y3RDb252ZXJ0ZXIyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9tb3ZlIGEgY29udmVydGVyIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgY2hlY2sgY29udGV4dCBtb2RlbAotCQlyZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLm1vdmUoMCwgMSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCQkKLQkJLy9yZW1vdmUgYSBjb252ZXJ0ZXIgZnJvbSB0aGUgcmVzb3VyY2UgbW9kZWwsIGNoZWNrIGNvbnRleHQgbW9kZWwKLQkJcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5yZW1vdmUoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCXJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkucmVtb3ZlKHJlc291cmNlU3RydWN0Q29udmVydGVyMik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldEFsbENvbnZlcnRlcnMoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlTdHJ1Y3RDb252ZXJ0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RNYXBwZWRTdXBlcmNsYXNzRm9yU3RydWN0Q29udmVydGVycygpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLk1BUFBFRF9TVVBFUkNMQVNTX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1FY2xpcHNlTGlua01hcHBlZFN1cGVyY2xhc3Mgb3JtQ29udGV4dE1hcHBlZFN1cGVyY2xhc3MgPSAoT3JtRWNsaXBzZUxpbmtNYXBwZWRTdXBlcmNsYXNzKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCk7Ci0JCU9ybUVjbGlwc2VMaW5rQ29udmVydGVyQ29udGFpbmVyIG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIgPSBvcm1Db250ZXh0TWFwcGVkU3VwZXJjbGFzcy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKTsKLQkJWG1sTWFwcGVkU3VwZXJjbGFzcyByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MgPSAoWG1sTWFwcGVkU3VwZXJjbGFzcykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRNYXBwZWRTdXBlcmNsYXNzZXMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCWNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoIkZvbyIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyLnNldE5hbWUoIm15U3RydWN0Q29udmVydGVyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyPiBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vYWRkIGFub3RoZXIgY29udmVydGVyIHRvIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlciBjb250ZXh0U3RydWN0Q29udmVydGVyMiA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuYWRkU3RydWN0Q29udmVydGVyKDApOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXRDb252ZXJ0ZXJDbGFzcygiRm9vMiIpOwotCQljb250ZXh0U3RydWN0Q29udmVydGVyMi5zZXROYW1lKCJteVN0cnVjdENvbnZlcnRlcjIiKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIyIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXROYW1lKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscygibXlTdHJ1Y3RDb252ZXJ0ZXIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL21vdmUgYSBjb252ZXJ0ZXIgaW4gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIubW92ZVN0cnVjdENvbnZlcnRlcigwLCAxKTsKLQkJCi0JCWFzc2VydEVxdWFscygyLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgcmVzb3VyY2VNYXBwZWRTdXBlcmNsYXNzLmdldFN0cnVjdENvbnZlcnRlcnMoKS5nZXQoMSkuZ2V0Q29udmVydGVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDEpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVycyA9IG9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIuZ2V0U3RydWN0Q29udmVydGVycygpLml0ZXJhdG9yKCk7Ci0JCW9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIgPSBvcm1Db250ZXh0U3RydWN0Q29udmVydGVycy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlciIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlciA9IG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXJzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JCQotCQkvL3JlbW92ZSBhIGNvbnZlcnRlciBmcm9tIHRoZSBjb250ZXh0IG1vZGVsLCBjaGVjayByZXNvdXJjZSBtb2RlbAotCQlvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLnJlbW92ZVN0cnVjdENvbnZlcnRlcigwKTsKLQkJCi0JCWFzc2VydEVxdWFscygxLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIHJlc291cmNlTWFwcGVkU3VwZXJjbGFzcy5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApLmdldENvbnZlcnRlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteVN0cnVjdENvbnZlcnRlcjIiLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udGV4dENvbnZlcnRlckhvbGRlci5nZXRTdHJ1Y3RDb252ZXJ0ZXJzU2l6ZSgpKTsKLQkJb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMgPSBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpOwotCQlvcm1Db250ZXh0U3RydWN0Q29udmVydGVyID0gb3JtQ29udGV4dFN0cnVjdENvbnZlcnRlcnMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBvcm1Db250ZXh0U3RydWN0Q29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15U3RydWN0Q29udmVydGVyMiIsIG9ybUNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIENvbGxlY3Rpb25Ub29scy5zaXplKHBlcnNpc3RlbmNlVW5pdC5nZXRBbGxDb252ZXJ0ZXJzKCkpKTsKLQkJCi0JCS8vcmVtb3ZlIGEgY29udmVydGVyIGZyb20gdGhlIGNvbnRleHQgbW9kZWwsIGNoZWNrIHJlc291cmNlIG1vZGVsCi0JCW9ybUNvbnRleHRDb252ZXJ0ZXJIb2xkZXIucmVtb3ZlU3RydWN0Q29udmVydGVyKGNvbnRleHRTdHJ1Y3RDb252ZXJ0ZXIyKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShvcm1Db250ZXh0Q29udmVydGVySG9sZGVyLmdldFN0cnVjdENvbnZlcnRlcnMoKS5pdGVyYXRvcigpLmhhc05leHQoKSk7Ci0JCWFzc2VydEVxdWFscygwLCByZXNvdXJjZU1hcHBlZFN1cGVyY2xhc3MuZ2V0U3RydWN0Q29udmVydGVycygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBDb2xsZWN0aW9uVG9vbHMuc2l6ZShwZXJzaXN0ZW5jZVVuaXQuZ2V0QWxsQ29udmVydGVycygpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc2MzRkNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnNpb25WYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLmNvbnRleHQub3JtLk9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uRWNsaXBzZUxpbmtPcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sQmFzaWM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxDb252ZXJzaW9uVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPYmplY3RUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuQkFTSUMsIEVjbGlwc2VMaW5rLkNPTlZFUlQsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1PYmplY3RUeXBlQ29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImlkIik7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0RGF0YVR5cGUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0RGF0YVR5cGUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0T2JqZWN0VHlwZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5T2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkT2JqZWN0VHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sT2JqZWN0VHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0T2JqZWN0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0IiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVEZWZhdWx0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZE9iamVjdFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbE9iamVjdFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldE9iamVjdFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0RGVmYXVsdE9iamVjdFZhbHVlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCQotCQkvL2FkZCBjb252ZXJzaW9uIHZhbHVlIHRvIHJlc291cmNlIG1vZGVsLCBjaGVjayBjb250ZXh0IG1vZGVsCi0JCVhtbENvbnZlcnNpb25WYWx1ZSByZXNvdXJjZUNvbnZlcnNpb25WYWx1ZSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sQ29udmVyc2lvblZhbHVlKCk7Ci0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5hZGQocmVzb3VyY2VDb252ZXJzaW9uVmFsdWUpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoImZvbyIpOwotCQlyZXNvdXJjZUNvbnZlcnNpb25WYWx1ZS5zZXRPYmplY3RWYWx1ZSgiYmFyIik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCS8vYWRkIGEgY29udmVyc2lvbiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0JCVhtbENvbnZlcnNpb25WYWx1ZSB4bWxDb252ZXJzaW9uVmFsdWUyID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxDb252ZXJzaW9uVmFsdWUoKTsKLQkJY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmFkZCgwLCB4bWxDb252ZXJzaW9uVmFsdWUyKTsKLQkJeG1sQ29udmVyc2lvblZhbHVlMi5zZXREYXRhVmFsdWUoImZvbzIiKTsKLQkJeG1sQ29udmVyc2lvblZhbHVlMi5zZXRPYmplY3RWYWx1ZSgiYmFyMiIpOwotCi0JCWFzc2VydEVxdWFscygyLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMSkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMSkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJLy9tb3ZlIGEgY29udmVyc2lvbiB2YWx1ZSBpbiB0aGUgcmVzb3VyY2UgbW9kZWwgbGlzdAotCQkKLQkJY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLm1vdmUoMCwgMSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWVzID0gb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMSkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJLy9yZW1vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGZyb20gdGhlIHJlc291cmNlIG1vZGVsIGxpc3QKLQotCQljb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkucmVtb3ZlKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJLy9jbGVhciB0aGUgY29udmVyc2lvbiB2YWx1ZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0JCWNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5jbGVhcigpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRPYmplY3RUeXBlQ29udmVydGVyKDApOwotCQlYbWxPYmplY3RUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRPYmplY3RUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscygwLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJCi0JCS8vYWRkIGNvbnZlcnNpb24gdmFsdWUgdG8gY29udGV4dCBtb2RlbCwgY2hlY2sgcmVzb3VyY2UgbW9kZWwKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWUgY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IG9ybUNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZS5zZXREYXRhVmFsdWUoImZvbyIpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlLnNldE9iamVjdFZhbHVlKCJiYXIiKTsKLQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8PyBleHRlbmRzIEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlPiBjb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLnNpemUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL2FkZCBhIGNvbnZlcnNpb24gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGV4dCBtb2RlbCBsaXN0Ci0JCUVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlIGNvbnRleHRDb252ZXJzaW9uVmFsdWUyID0gb3JtQ29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZTIuc2V0RGF0YVZhbHVlKCJmb28yIik7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUyLnNldE9iamVjdFZhbHVlKCJiYXIyIik7Ci0KLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZXMgPSBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWNvbnRleHRDb252ZXJzaW9uVmFsdWUgPSBjb250ZXh0Q29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQotCQkvL21vdmUgYSBjb252ZXJzaW9uIHZhbHVlIGluIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKLQkJCi0JCW9ybUNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDAsIDEpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldE9iamVjdFZhbHVlKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlID0gY29udGV4dENvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBjb250ZXh0Q29udmVyc2lvblZhbHVlLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIyIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5zaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMSkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhcjIiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuZ2V0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCS8vcmVtb3ZlIGEgY29udmVyc2lvbiB2YWx1ZSBmcm9tIHRoZSBjb250ZXh0IG1vZGVsIGxpc3QKLQotCQlvcm1Db252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtQ29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQljb250ZXh0Q29udmVyc2lvblZhbHVlcyA9IG9ybUNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJY29udGV4dENvbnZlcnNpb25WYWx1ZSA9IGNvbnRleHRDb252ZXJzaW9uVmFsdWVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udGV4dENvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnRleHRDb252ZXJzaW9uVmFsdWUuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0Q29udmVyc2lvblZhbHVlcygpLmdldCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyMiIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnNpb25WYWx1ZXMoKS5nZXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0KLQkJLy9jbGVhciB0aGUgY29udmVyc2lvbiB2YWx1ZSByZXNvdXJjZSBtb2RlbCBsaXN0Ci0JCW9ybUNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJzaW9uVmFsdWVzKCkuc2l6ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmUwYWUzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybU9uZVRvTWFueU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pblRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5Pcm1GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb01hbnlSZWxhdGlvbnNoaXAyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxKb2luRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sT25lVG9NYW55OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdERlcGFydG1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSk9JTl9UQUJMRSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSk9JTl9DT0xVTU4pLmFwcGVuZCgiOyIpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJEZXBhcnRtZW50IikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luVGFibGUobmFtZT1cIkRFUF9FTVBcIiwgam9pbkNvbHVtbnM9QEpvaW5Db2x1bW4obmFtZT1cIkRFUFRfSURcIiksIGludmVyc2VKb2luQ29sdW1ucz1ASm9pbkNvbHVtbihuYW1lPVwiRU1QX0lEXCIpKSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEVtcGxveWVlPiBlbXBsb3llZXM7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgifSIpLmFwcGVuZChDUik7Ci0JCX0KLQkJfTsKLQkJdGhpcy5qYXZhUHJvamVjdC5jcmVhdGVDb21waWxhdGlvblVuaXQoUEFDS0FHRV9OQU1FLCAiRGVwYXJ0bWVudC5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGVzdEVtcGxveWVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuRU5USVRZKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5JRCkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiRW1wbG95ZWUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBlbXBJZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJFbXBsb3llZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW50aXR5V2l0aE9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9NYW55IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWZvciAoT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGVhY2ggOiBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCWVhY2guY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWRNYXBPbmVUb01hbnlNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX01BTlksIEpQQS5JRCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55IikuYXBwZW5kKENSKTsJCQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBqYXZhLnV0aWwuTWFwPFN0cmluZywgQWRkcmVzcz4gYWRkcmVzc2VzOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwkJCQkKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmFsaWROb25HZW5lcmljTWFwT25lVG9NYW55TWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19NQU5ZLCBKUEEuSUQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQE9uZVRvTWFueSIpLmFwcGVuZChDUik7CQkJCQotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLk1hcCBhZGRyZXNzZXM7IikuYXBwZW5kKENSKTsJCQkKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIik7Ci0JCQkJCXNiLmFwcGVuZChKUEEuRU1CRUREQUJMRSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiQEVtYmVkZGFibGUiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgicHVibGljIGNsYXNzICIpLmFwcGVuZCgiU3RhdGUiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgZm9vOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJTdGF0ZS5qYXZhIiwgc291cmNlV3JpdGVyKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5PTkVfVE9fTUFOWSwgSlBBLkZFVENIX1RZUEUsIEpQQS5DQVNDQURFX1RZUEUsIEpQQS5PUkRFUl9CWSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9NYW55KGZldGNoPUZldGNoVHlwZS5FQUdFUiwgdGFyZ2V0RW50aXR5PUFkZHJlc3MuY2xhc3MsIGNhc2NhZGU9e0Nhc2NhZGVUeXBlLkFMTCwgQ2FzY2FkZVR5cGUuUEVSU0lTVCwgQ2FzY2FkZVR5cGUuTUVSR0UsIENhc2NhZGVUeXBlLlJFTU9WRSwgQ2FzY2FkZVR5cGUuUkVGUkVTSH0pIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT3JkZXJCeShcImNpdHlcIiIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQEpvaW5GZXRjaChKb2luRmV0Y2hUeXBlLklOTkVSKSIpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgamF2YS51dGlsLkNvbGxlY3Rpb248QWRkcmVzcz4gYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb01hbnkiKTsKLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRPbmVUb01hbnkgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIHByaXZhdGUgb3duZWQgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0UHJpdmF0ZU93bmVkKHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb01hbnkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkICB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQodHJ1ZSk7Ci0JCQotCQlhc3NlcnRUcnVlKHJlc291cmNlT25lVG9NYW55LmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRPbmVUb01hbnkuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBwcml2YXRlIG93bmVkIGJhY2sgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldFByaXZhdGVPd25lZCgpLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvTWFueS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvTWFueS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb01hbnkgcmVzb3VyY2VPbmVUb01hbnkgPSAKLQkJCShYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLklOTkVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLklOTkVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9NYW55LnNldEpvaW5GZXRjaChYbWxKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb01hbnkuc2V0Sm9pbkZldGNoKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9NYW55Iik7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZyBjb250ZXh0T25lVG9NYW55ID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbE9uZVRvTWFueSByZXNvdXJjZU9uZVRvTWFueSA9IAotCQkJKFhtbE9uZVRvTWFueSkgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldE9uZVRvTWFueXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBPVVRFUiwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIGNvbnRleHRPbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIG51bGwsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9NYW55LmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvTWFueS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dE9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaERlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcgb25lVG9NYW55ID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0KLQkJYXNzZXJ0TnVsbChvbmVUb01hbnkuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCW9uZVRvTWFueSA9IChFY2xpcHNlTGlua09uZVRvTWFueU1hcHBpbmcpIGRlcGFydG1lbnRQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiZW1wbG95ZWVzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROdWxsKG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsJCQotCQkKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFSZWxhdGlvbnNoaXBNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWphdmFSZWxhdGlvbnNoaXBNYXBwaW5nLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUik7Ci0JCWFzc2VydE51bGwob25lVG9NYW55LmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKGZhbHNlKTsKLQkJb25lVG9NYW55ID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuT1VURVIsIG9uZVRvTWFueS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdERlZmF1bHRKb2luVGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJT25lVG9NYW55TWFwcGluZyBvbmVUb01hbnkgPSAoT25lVG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydEVxdWFscyh0cnVlLCBhdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlKb2luVGFibGUgb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiREVQX0VNUCIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRFUFRfSUQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRU1QX0lEIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0KLQkJLy9zZXQgbWV0YWRhdGEtY29tcGxldGUgYW5kIHZlcmlmeSBKb2luVGFibGUgaW5mbyBpcyBub3QgdGFrZW4gZnJvbSB0aGUgamF2YQotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwkKLQkJYXR0cmlidXRlID0gZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZXMiKTsKLQkJb25lVG9NYW55ID0gKE9uZVRvTWFueU1hcHBpbmcpIGF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHModHJ1ZSwgYXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJb3JtSm9pblRhYmxlID0gb25lVG9NYW55LmdldFJlbGF0aW9uc2hpcCgpLmdldEpvaW5UYWJsZVN0cmF0ZWd5KCkuZ2V0Sm9pblRhYmxlKCk7Ci0JCWFzc2VydEVxdWFscygiRGVwYXJ0bWVudF9FbXBsb3llZSIsIG9ybUpvaW5UYWJsZS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wbG95ZWVzX2VtcElkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRJbnZlcnNlSm9pbkNvbHVtbigpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQotCQkvL3NldCBtZXRhZGF0YS1jb21wbGV0ZSB0byBmYWxzZSwgYWRkIG1hcHBpbmcgdG8gb3JtLnhtbCB2ZXJpZnkgSm9pblRhYmxlIGluZm8gaXMgbm90IHRha2VuIGZyb20gdGhlIGphdmEKLQkJZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uRkFMU0UpOwotCQlhdHRyaWJ1dGUgPSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpOwotCQlvbmVUb01hbnkgPSAoT25lVG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIGF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCW9ybUpvaW5UYWJsZSA9IG9uZVRvTWFueS5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luVGFibGVTdHJhdGVneSgpLmdldEpvaW5UYWJsZSgpOwotCQlhc3NlcnRFcXVhbHMoIkRFUF9FTVAiLCBvcm1Kb2luVGFibGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJERVBUX0lEIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEpvaW5Db2x1bW5zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIkVNUF9JRCIsIG9ybUpvaW5UYWJsZS5nZXRTcGVjaWZpZWRJbnZlcnNlSm9pbkNvbHVtbnMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImVtcElkIiwgb3JtSm9pblRhYmxlLmdldFNwZWNpZmllZEludmVyc2VKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCi0JCQotCQlkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImVtcGxveWVlcyIpOwotCQlhdHRyaWJ1dGUgPSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlcyIpOwotCQlvbmVUb01hbnkgPSAoT25lVG9NYW55TWFwcGluZykgYXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBhdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1Kb2luVGFibGUgPSBvbmVUb01hbnkuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0Sm9pblRhYmxlU3RyYXRlZ3koKS5nZXRKb2luVGFibGUoKTsKLQkJYXNzZXJ0RXF1YWxzKCJEZXBhcnRtZW50X0VtcGxveWVlIiwgb3JtSm9pblRhYmxlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSm9pbkNvbHVtbnNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoIkRlcGFydG1lbnRfaWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEpvaW5Db2x1bW4oKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtSm9pblRhYmxlLmdldERlZmF1bHRKb2luQ29sdW1uKCkuZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBvcm1Kb2luVGFibGUuZ2V0U3BlY2lmaWVkSW52ZXJzZUpvaW5Db2x1bW5zU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBsb3llZXNfZW1wSWQiLCBvcm1Kb2luVGFibGUuZ2V0RGVmYXVsdEludmVyc2VKb2luQ29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJlbXBJZCIsIG9ybUpvaW5UYWJsZS5nZXREZWZhdWx0SW52ZXJzZUpvaW5Db2x1bW4oKS5nZXRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVZpcnR1YWxNYXBLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCi0JCU9uZVRvTWFueU1hcHBpbmcgb3JtT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlKYXZhT25lVG9NYW55TWFwcGluZyBqYXZhT25lVG9NYW55TWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCkuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZE1hcEtleSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IHBrIG1hcEtleSBpbiB0aGUgamF2YSwgdmVyaWZ5IHZpcnR1YWwgb3JtIG1hcHBpbmcgdXBkYXRlcwotCQlqYXZhT25lVG9NYW55TWFwcGluZy5zZXRQa01hcEtleSh0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0TWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNQa01hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc0N1c3RvbU1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc05vTWFwS2V5KCkpOwotCQkKLQkJCi0JCS8vc2V0IGN1c3RvbSBzcGVjaWZpZWQgbWFwS2V5IGluIHRoZSBqYXZhLCB2ZXJpZnkgdmlydHVhbCBvcm0gbWFwcGluZyB1cGRhdGVzCi0JCWphdmFPbmVUb01hbnlNYXBwaW5nLnNldEN1c3RvbU1hcEtleSh0cnVlKTsKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkTWFwS2V5KCJjaXR5Iik7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkTWFwS2V5KCkpOwotCQlhc3NlcnRFcXVhbHMoImNpdHkiLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNDdXN0b21NYXBLZXkoKSk7Ci0JCWFzc2VydEZhbHNlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQkJCi0JCS8vc2V0IG1ldGFkYXRhIGNvbXBsZXRlIGFuZCB2ZXJpZnkgdGhhdCB0aGUgb3JtIG1vZGVsIGlnbm9yZXMgdGhlIGphdmEgYW5ub3RhdGlvbnMKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtT25lVG9NYW55TWFwcGluZyA9IChPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtT25lVG9NYW55TWFwcGluZy5nZXRTcGVjaWZpZWRNYXBLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1PbmVUb01hbnlNYXBwaW5nLmdldE1hcEtleSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9NYW55TWFwcGluZy5pc1BrTWFwS2V5KCkpOwotCQlhc3NlcnRGYWxzZShvcm1PbmVUb01hbnlNYXBwaW5nLmlzQ3VzdG9tTWFwS2V5KCkpOwotCQlhc3NlcnRUcnVlKG9ybU9uZVRvTWFueU1hcHBpbmcuaXNOb01hcEtleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE1hcE9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQkJY3JlYXRlVGVzdEVtYmVkZGFibGVTdGF0ZSgpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU1CRUREQUJMRV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLlN0YXRlIik7Ci0JCQotCQlPbmVUb01hbnlNYXBwaW5nIG9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQotCQlJdGVyYXRvcjxTdHJpbmc+IG1hcEtleU5hbWVzID0gCi0JCQlvbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDYW5kaWRhdGVNYXBLZXlOYW1lczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWYWxpZE5vbkdlbmVyaWNNYXBPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0JCWNyZWF0ZVRlc3RFbWJlZGRhYmxlU3RhdGUoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVNQkVEREFCTEVfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5TdGF0ZSIpOwotCQkKLQkJT25lVG9NYW55TWFwcGluZyBvcm1PbmVUb01hbnlNYXBwaW5nID0gKE9uZVRvTWFueU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzZXMiKS5nZXRNYXBwaW5nKCk7Ci0JCUphdmFPbmVUb01hbnlNYXBwaW5nIGphdmFPbmVUb01hbnlNYXBwaW5nID0gKEphdmFPbmVUb01hbnlNYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuZ2V0TWFwcGluZygpOwotCi0JCUl0ZXJhdG9yPFN0cmluZz4gbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJamF2YU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJ0ZXN0LkFkZHJlc3MiKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygic3RhdGUiLCBtYXBLZXlOYW1lcy5uZXh0KCkpOwotCQlhc3NlcnRFcXVhbHMoInppcCIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEZhbHNlKG1hcEtleU5hbWVzLmhhc05leHQoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzc2VzIikuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybU9uZVRvTWFueU1hcHBpbmcgPSAoT25lVG9NYW55TWFwcGluZykgb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3NlcyIpLmdldE1hcHBpbmcoKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCQkKLQkJb3JtT25lVG9NYW55TWFwcGluZy5zZXRTcGVjaWZpZWRUYXJnZXRFbnRpdHkoInRlc3QuQWRkcmVzcyIpOwotCQltYXBLZXlOYW1lcyA9IG9ybU9uZVRvTWFueU1hcHBpbmcuZ2V0Q2FuZGlkYXRlTWFwS2V5TmFtZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjaXR5IiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdGF0ZSIsIG1hcEtleU5hbWVzLm5leHQoKSk7Ci0JCWFzc2VydEVxdWFscygiemlwIiwgbWFwS2V5TmFtZXMubmV4dCgpKTsKLQkJYXNzZXJ0RmFsc2UobWFwS2V5TmFtZXMuaGFzTmV4dCgpKTsKLQkJCi0JCW9ybU9uZVRvTWFueU1hcHBpbmcuc2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCJTdHJpbmciKTsKLQkJbWFwS2V5TmFtZXMgPSBvcm1PbmVUb01hbnlNYXBwaW5nLmdldENhbmRpZGF0ZU1hcEtleU5hbWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBtYXBLZXlOYW1lcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5UHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IChYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZWwuc2V0U3RyYXRlZ3lUb0pvaW5Db2x1bW4oKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVsLnNldFN0cmF0ZWd5VG9NYXBwZWRCeSgpOwotCQlhc3NlcnRUcnVlKHJlc291cmNlTWFwcGluZy5nZXRKb2luQ29sdW1ucygpLmlzRW1wdHkoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0TWFwcGVkQnkoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKTsKLQkJCi0JCXJlbC5zZXRTdHJhdGVneVRvSm9pblRhYmxlKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUHJlZG9taW5hbnRKb2luaW5nU3RyYXRlZ3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhPbmVUb01hbnlNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIGNvbnRleHRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW50VHlwZShGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIGNvbnRleHRBdHRyaWJ1dGUgPSBjb250ZXh0VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIGNvbnRleHRNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgY29udGV4dEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCUVjbGlwc2VMaW5rT25lVG9NYW55UmVsYXRpb25zaGlwMl8wIHJlbCA9IGNvbnRleHRNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAoWG1sRW50aXR5KSBjb250ZXh0VHlwZS5nZXRNYXBwaW5nKCkuZ2V0WG1sVHlwZU1hcHBpbmcoKTsKLQkJWG1sT25lVG9NYW55IHJlc291cmNlTWFwcGluZyA9IChYbWxPbmVUb01hbnkpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb01hbnlzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydFRydWUocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkoImZvbyIpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5UYWJsZSgpKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5UYWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuYWRkKE9ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbEpvaW5Db2x1bW4oKSk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0TWFwcGVkQnkobnVsbCk7Ci0JCWdldEpwYVByb2plY3QoKS5zeW5jaHJvbml6ZUNvbnRleHRNb2RlbCgpOwotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pbkNvbHVtbnMoKS5pc0VtcHR5KCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlTWFwcGluZy5nZXRKb2luVGFibGUoKSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VNYXBwaW5nLmdldE1hcHBlZEJ5KCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pbkNvbHVtbigpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luVGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzTWFwcGVkQnkoKSk7Ci0JCQotCQlyZXNvdXJjZU1hcHBpbmcuc2V0Sm9pblRhYmxlKG51bGwpOwotCQlnZXRKcGFQcm9qZWN0KCkuc3luY2hyb25pemVDb250ZXh0TW9kZWwoKTsKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0VHJ1ZShyZWwuc3RyYXRlZ3lJc0pvaW5Db2x1bW4oKSk7Ci0JCWFzc2VydEZhbHNlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCQkKLQkJcmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuY2xlYXIoKTsKLQkJZ2V0SnBhUHJvamVjdCgpLnN5bmNocm9uaXplQ29udGV4dE1vZGVsKCk7Ci0JCWFzc2VydFRydWUocmVzb3VyY2VNYXBwaW5nLmdldEpvaW5Db2x1bW5zKCkuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU1hcHBpbmcuZ2V0Sm9pblRhYmxlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlTWFwcGluZy5nZXRNYXBwZWRCeSgpKTsKLQkJYXNzZXJ0RmFsc2UocmVsLnN0cmF0ZWd5SXNKb2luQ29sdW1uKCkpOwotCQlhc3NlcnRUcnVlKHJlbC5zdHJhdGVneUlzSm9pblRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShyZWwuc3RyYXRlZ3lJc01hcHBlZEJ5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVGYWxzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9NYW55TWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0U3BlY2lmaWVkRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldFNwZWNpZmllZFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbCh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS4KLQkJCWdldE1hcHBlZEJ5U3RyYXRlZ3koKS5nZXRNYXBwZWRCeUF0dHJpYnV0ZSgpKTsKLQotCQlDYXNjYWRlIGNhc2NhZGUgPSB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzTWVyZ2UoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjYXNjYWRlLmlzUmVmcmVzaCgpKTsKLQotCQlhc3NlcnRUcnVlKHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmlzQ3VzdG9tT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscygiY2l0eSIsIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldE9yZGVyYWJsZSgpLmdldFNwZWNpZmllZE9yZGVyQnkoKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZVRydWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvTWFueU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVksIHZpcnR1YWxQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb01hbnlNYXBwaW5nIHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9NYW55TWFwcGluZykgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgdmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5MQVpZLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0ZXN0LkFkZHJlc3MiLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRUYXJnZXRFbnRpdHkoKSk7Ci0JCWFzc2VydE51bGwodmlydHVhbE9uZVRvTWFueU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxPbmVUb01hbnlNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5pc05vT3JkZXJpbmcoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRPcmRlcmFibGUoKS5nZXRTcGVjaWZpZWRPcmRlckJ5KCkpOwotCi0JCWFzc2VydEVxdWFscyhudWxsLCB2aXJ0dWFsT25lVG9NYW55TWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmMTU1ZS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1PbmVUb09uZU1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS50ZXN0cy5pbnRlcm5hbC5wcm9qZWN0cy5UZXN0SmF2YVByb2plY3QuU291cmNlV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQ2FzY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSm9pbkNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rSm9pbkZldGNoTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0pvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEpvaW5GZXRjaFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLm9ybS5YbWxPbmVUb09uZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybU9uZVRvT25lTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RGVwYXJ0bWVudCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTb3VyY2VXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IFNvdXJjZVdyaXRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFNvdXJjZVRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLkVOVElUWSkuYXBwZW5kKCI7Iik7Ci0JCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpLmFwcGVuZChKUEEuSUQpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLk9ORV9UT19PTkUpLmFwcGVuZCgiOyIpOwotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJEZXBhcnRtZW50IikuYXBwZW5kKCIgIik7Ci0JCQkJc2IuYXBwZW5kKCJ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBJZCIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgaWQ7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBPbmVUb09uZSIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBFbXBsb3llZSBlbXBsb3llZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJ9IikuYXBwZW5kKENSKTsKLQkJfQotCQl9OwotCQl0aGlzLmphdmFQcm9qZWN0LmNyZWF0ZUNvbXBpbGF0aW9uVW5pdChQQUNLQUdFX05BTUUsICJEZXBhcnRtZW50LmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVUZXN0RW1wbG95ZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU291cmNlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG5ldyBTb3VyY2VXcml0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhcHBlbmRTb3VyY2VUbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQkJc2IuYXBwZW5kKCJpbXBvcnQgIikuYXBwZW5kKEpQQS5FTlRJVFkpLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKS5hcHBlbmQoSlBBLklEKS5hcHBlbmQoIjsiKTsKLQkJCQkJc2IuYXBwZW5kKENSKTsKLQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJwdWJsaWMgY2xhc3MgIikuYXBwZW5kKCJFbXBsb3llZSIpLmFwcGVuZCgiICIpOwotCQkJCXNiLmFwcGVuZCgieyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBASWQiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIHByaXZhdGUgaW50IGVtcElkOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkVtcGxveWVlLmphdmEiLCBzb3VyY2VXcml0ZXIpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuT05FX1RPX09ORSwgSlBBLkpPSU5fQ09MVU1OLCBKUEEuRkVUQ0hfVFlQRSwgSlBBLkNBU0NBREVfVFlQRSwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSCwgRWNsaXBzZUxpbmsuSk9JTl9GRVRDSF9UWVBFLCBFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBAT25lVG9PbmUoZmV0Y2g9RmV0Y2hUeXBlLkxBWlksIG9wdGlvbmFsPWZhbHNlLCB0YXJnZXRFbnRpdHk9QWRkcmVzcy5jbGFzcywgY2FzY2FkZT17Q2FzY2FkZVR5cGUuQUxMLCBDYXNjYWRlVHlwZS5QRVJTSVNULCBDYXNjYWRlVHlwZS5NRVJHRSwgQ2FzY2FkZVR5cGUuUkVNT1ZFLCBDYXNjYWRlVHlwZS5SRUZSRVNIfSkiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luQ29sdW1uKG5hbWU9XCJNWV9DT0xVTU5cIiwgcmVmZXJlbmNlZENvbHVtbk5hbWU9XCJNWV9SRUZFUkVOQ0VEX0NPTFVNTlwiLCB1bmlxdWU9dHJ1ZSwgbnVsbGFibGU9ZmFsc2UsIGluc2VydGFibGU9ZmFsc2UsIHVwZGF0YWJsZT1mYWxzZSwgY29sdW1uRGVmaW5pdGlvbj1cIkNPTFVNTl9ERUZJTklUSU9OXCIsIHRhYmxlPVwiTVlfVEFCTEVcIikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5JTk5FUikiKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBQcml2YXRlT3duZWQpIik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIik7CQkJCQotCQkJfQotCQl9KTsKLQl9CQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVNvdXJjZVdyaXRlciBzb3VyY2VXcml0ZXIgPSBuZXcgU291cmNlV3JpdGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kU291cmNlVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJCXNiLmFwcGVuZCgiaW1wb3J0ICIpOwotCQkJCQlzYi5hcHBlbmQoSlBBLkVOVElUWSk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCQlzYi5hcHBlbmQoImltcG9ydCAiKTsKLQkJCQkJc2IuYXBwZW5kKEpQQS5JRCk7Ci0JCQkJCXNiLmFwcGVuZCgiOyIpOwotCQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5Iik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoInB1YmxpYyBjbGFzcyAiKS5hcHBlbmQoIkFkZHJlc3MiKS5hcHBlbmQoIiAiKTsKLQkJCQlzYi5hcHBlbmQoInsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgQElkIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIGludCBpZDsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBpbnQgemlwOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIn0iKS5hcHBlbmQoQ1IpOwotCQl9Ci0JCX07Ci0JCXRoaXMuamF2YVByb2plY3QuY3JlYXRlQ29tcGlsYXRpb25Vbml0KFBBQ0tBR0VfTkFNRSwgIkFkZHJlc3MuamF2YSIsIHNvdXJjZVdyaXRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVByaXZhdGVPd25lZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBjb250ZXh0T25lVG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCi0JCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0RmFsc2UocmVzb3VyY2VPbmVUb09uZS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dE9uZVRvT25lLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBwcml2YXRlIG93bmVkIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9PbmUuc2V0UHJpdmF0ZU93bmVkKHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCS8vIHNldCB4bWwgcHJpdmF0ZSBvd25lZCBiYWNrIHRvIGZhbHNlLCBjaGVjayBjb250ZXh0Ci0JCQotCQlyZXNvdXJjZU9uZVRvT25lLnNldFByaXZhdGVPd25lZChmYWxzZSk7Ci0JCQotCQlhc3NlcnRGYWxzZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuaXNQcml2YXRlT3duZWQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlQcml2YXRlT3duZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAib25lVG9PbmUiKTsKLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgY29udGV4dE9uZVRvT25lID0gCi0JCQkoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sT25lVG9PbmUgcmVzb3VyY2VPbmVUb09uZSA9IAotCQkJKFhtbE9uZVRvT25lKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0T25lVG9PbmVzKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydEZhbHNlKHJlc291cmNlT25lVG9PbmUuaXNQcml2YXRlT3duZWQoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHByaXZhdGUgb3duZWQgIHRvIHRydWUsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9PbmUuZ2V0UHJpdmF0ZU93bmVkKCkuc2V0UHJpdmF0ZU93bmVkKHRydWUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShyZXNvdXJjZU9uZVRvT25lLmlzUHJpdmF0ZU93bmVkKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5pc1ByaXZhdGVPd25lZCgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHByaXZhdGUgb3duZWQgYmFjayB0byBmYWxzZSwgY2hlY2sgcmVzb3VyY2UKLQkJCi0JCWNvbnRleHRPbmVUb09uZS5nZXRQcml2YXRlT3duZWQoKS5zZXRQcml2YXRlT3duZWQoZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlSm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgIm9uZVRvT25lIik7Ci0JCUVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nIGNvbnRleHRPbmVUb09uZSA9IAotCQkJKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCi0JCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gSU5ORVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuSU5ORVIsIHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLklOTkVSLCBjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlT25lVG9PbmUuc2V0Sm9pbkZldGNoKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKFhtbEpvaW5GZXRjaFR5cGUuT1VURVIsIHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIGpvaW4gZmV0Y2ggdG8gbnVsbCwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VPbmVUb09uZS5zZXRKb2luRmV0Y2gobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlT25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVksICJvbmVUb09uZSIpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBjb250ZXh0T25lVG9PbmUgPSAKLQkJCShFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbEVudGl0eSByZXNvdXJjZUVudGl0eSA9IAotCQkJKFhtbEVudGl0eSlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApOwotCQlYbWxPbmVUb09uZSByZXNvdXJjZU9uZVRvT25lID0gCi0JCQkoWG1sT25lVG9PbmUpIHJlc291cmNlRW50aXR5LmdldEF0dHJpYnV0ZXMoKS5nZXRPbmVUb09uZXMoKS5nZXQoMCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JCQotCQkvLyBzZXQgY29udGV4dCBqb2luIGZldGNoIHRvIElOTkVSLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoWG1sSm9pbkZldGNoVHlwZS5JTk5FUiwgcmVzb3VyY2VPbmVUb09uZS5nZXRKb2luRmV0Y2goKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0pvaW5GZXRjaFR5cGUuSU5ORVIsIGNvbnRleHRPbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IGpvaW4gZmV0Y2ggdG8gT1VURVIsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJCi0JCWFzc2VydEVxdWFscyhYbWxKb2luRmV0Y2hUeXBlLk9VVEVSLCByZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5PVVRFUiwgY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgam9pbiBmZXRjaCB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dE9uZVRvT25lLmdldEpvaW5GZXRjaCgpLnNldFZhbHVlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZU9uZVRvT25lLmdldEpvaW5GZXRjaCgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0T25lVG9PbmUuZ2V0Sm9pbkZldGNoKCkuZ2V0VmFsdWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RKb2luRmV0Y2hEZWZhdWx0RnJvbUphdmEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVtcGxveWVlKCk7Ci0JCWNyZWF0ZVRlc3REZXBhcnRtZW50KCk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuRGVwYXJ0bWVudCIpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkVtcGxveWVlIik7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbnRUeXBlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvbmVUb09uZSA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQotCQlhc3NlcnROdWxsKG9uZVRvT25lLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQkKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlvbmVUb09uZSA9IChFY2xpcHNlTGlua09uZVRvT25lTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsJCQotCQkKLQkJRWNsaXBzZUxpbmtSZWxhdGlvbnNoaXBNYXBwaW5nIGphdmFSZWxhdGlvbnNoaXBNYXBwaW5nID0gKEVjbGlwc2VMaW5rUmVsYXRpb25zaGlwTWFwcGluZykgZGVwYXJ0bWVudFBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJlbXBsb3llZSIpLmdldE1hcHBpbmcoKTsKLQkJamF2YVJlbGF0aW9uc2hpcE1hcHBpbmcuZ2V0Sm9pbkZldGNoKCkuc2V0VmFsdWUoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSKTsKLQkJYXNzZXJ0TnVsbChvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJCi0JCWdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZShmYWxzZSk7Ci0JCW9uZVRvT25lID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSBkZXBhcnRtZW50UGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImVtcGxveWVlIikuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtKb2luRmV0Y2hUeXBlLk9VVEVSLCBvbmVUb09uZS5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmlydHVhbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlRmFsc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQljcmVhdGVUZXN0VGFyZ2V0RW50aXR5QWRkcmVzcygpOwotCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIFBBQ0tBR0VfTkFNRSArICIuQWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMywgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLQkJT25lVG9PbmVNYXBwaW5nIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcgPSAoT25lVG9PbmVNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCB2aXJ0dWFsT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuTEFaWSwgdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygiQWRkcmVzcyIsIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuCi0JCQlnZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0KLQkJSm9pbkNvbHVtbiB2aXJ0dWFsSm9pbkNvbHVtbiA9IAotCQkJdmlydHVhbE9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRTcGVjaWZpZWRKb2luQ29sdW1ucygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NPTFVNTiIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfUkVGRVJFTkNFRF9DT0xVTU4iLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRSZWZlcmVuY2VkQ29sdW1uTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCB2aXJ0dWFsSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkNPTFVNTl9ERUZJTklUSU9OIiwgdmlydHVhbEpvaW5Db2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9UQUJMRSIsIHZpcnR1YWxKb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IHZpcnR1YWxPbmVUb09uZU1hcHBpbmcuZ2V0Q2FzY2FkZSgpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydFRydWUoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rSm9pbkZldGNoVHlwZS5JTk5FUiwgKChFY2xpcHNlTGlua0pvaW5GZXRjaE1hcHBpbmcpIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcpLmdldEpvaW5GZXRjaCgpLmdldFZhbHVlKCkpOwotCQlhc3NlcnRUcnVlKCgoRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIHZpcnR1YWxPbmVUb09uZU1hcHBpbmcpLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RWaXJ0dWFsTWFwcGluZ01ldGFkYXRhQ29tcGxldGVUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlPbmVUb09uZU1hcHBpbmcoKTsKLQkJY3JlYXRlVGVzdFRhcmdldEVudGl0eUFkZHJlc3MoKTsKLQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBQQUNLQUdFX05BTUUgKyAiLkFkZHJlc3MiKTsKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsJCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCi0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgdmlydHVhbFBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0VHJ1ZSh2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0KLQkJRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcgb3JtT25lVG9PbmVNYXBwaW5nID0gKEVjbGlwc2VMaW5rT25lVG9PbmVNYXBwaW5nKSB2aXJ0dWFsUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7CQotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1PbmVUb09uZU1hcHBpbmcuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldEZldGNoKCkpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgb3JtT25lVG9PbmVNYXBwaW5nLmlzT3B0aW9uYWwoKSk7Ci0JCWFzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldFRhcmdldEVudGl0eSgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0UmVsYXRpb25zaGlwKCkuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLmdldE1hcHBlZEJ5QXR0cmlidXRlKCkpOwotCi0JCS8vVE9ETyBkZWZhdWx0IGpvaW4gY29sdW1ucyBpbiB4bWwgb25lLXRvLW9uZQotLy8JCVhtbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5zcGVjaWZpZWRKb2luQ29sdW1ucygpLm5leHQoKTsKLS8vCQkvL1RPRE8gamF2YSBkZWZhdWx0IGNvbHVtbnMgbmFtZSBpbiBKYXZhU2luZ2xlUmVsYXRpb25zaGlwTWFwcGluZy5Kb2luQ29sdW1uT3duZXIKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTmFtZSgpKTsKLS8vCQkvL2Fzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkUmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVW5pcXVlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkTnVsbGFibGUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgb3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVXBkYXRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0U3BlY2lmaWVkVGFibGUoKSk7Ci0KLQkJQ2FzY2FkZSBjYXNjYWRlID0gb3JtT25lVG9PbmVNYXBwaW5nLmdldENhc2NhZGUoKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc0FsbCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc01lcmdlKCkpOwotCQlhc3NlcnRGYWxzZShjYXNjYWRlLmlzUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlbW92ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1JlZnJlc2goKSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWVkTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5T25lVG9PbmVNYXBwaW5nKCk7Ci0JCWNyZWF0ZVRlc3RUYXJnZXRFbnRpdHlBZGRyZXNzKCk7Ci0KLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgUEFDS0FHRV9OQU1FICsgIi5BZGRyZXNzIik7Ci0KLQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYWRkcmVzcyIpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlPcm1FY2xpcHNlTGlua09uZVRvT25lTWFwcGluZyBvcm1PbmVUb09uZU1hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldE5hbWUoKSk7Ci0JCWFzc2VydE51bGwob3JtT25lVG9PbmVNYXBwaW5nLmdldFNwZWNpZmllZEZldGNoKCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRTcGVjaWZpZWRPcHRpb25hbCgpKTsKLQkJYXNzZXJ0TnVsbChvcm1PbmVUb09uZU1hcHBpbmcuZ2V0U3BlY2lmaWVkVGFyZ2V0RW50aXR5KCkpOwotCQlhc3NlcnROdWxsKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRNYXBwZWRCeVN0cmF0ZWd5KCkuZ2V0TWFwcGVkQnlBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRGZXRjaCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHRydWUsIG9ybU9uZVRvT25lTWFwcGluZy5pc09wdGlvbmFsKCkpOwotCQkvL1RPRE8gZGVmYXVsdCB0YXJnZXQgZW50aXR5IGluIHhtbAotCQkvL2Fzc2VydEVxdWFscygidGVzdC5BZGRyZXNzIiwgb3JtT25lVG9PbmVNYXBwaW5nLmdldERlZmF1bHRUYXJnZXRFbnRpdHkoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKG9ybU9uZVRvT25lTWFwcGluZy5nZXRSZWxhdGlvbnNoaXAoKS5nZXRKb2luQ29sdW1uU3RyYXRlZ3koKS5nZXRKb2luQ29sdW1uc1NpemUoKSA+IDApOwotCQkKLQkJLy9UT0RPIGRlZmF1bHQgam9pbiBjb2x1bW5zIGZvciBzcGVjaWZpZWQgeG1sT25lVG9PbmUgbWFwcGluZwotLy8JCVhtbEpvaW5Db2x1bW4gb3JtSm9pbkNvbHVtbiA9IG9ybU9uZVRvT25lTWFwcGluZy5kZWZhdWx0Sm9pbkNvbHVtbnMoKS5uZXh0KCk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE5hbWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVbmlxdWUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZE51bGxhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydE51bGwob3JtSm9pbkNvbHVtbi5nZXRTcGVjaWZpZWRVcGRhdGFibGUoKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0vLwkJYXNzZXJ0TnVsbChvcm1Kb2luQ29sdW1uLmdldFNwZWNpZmllZFRhYmxlKCkpOwotLy8JCQotLy8JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdE5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgb3JtSm9pbkNvbHVtbi5nZXREZWZhdWx0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVuaXF1ZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHROdWxsYWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBvcm1Kb2luQ29sdW1uLmdldERlZmF1bHRJbnNlcnRhYmxlKCkpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFVwZGF0YWJsZSgpKTsKLS8vCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtSm9pbkNvbHVtbi5nZXRDb2x1bW5EZWZpbml0aW9uKCkpOwotLy8JCWFzc2VydEVxdWFscyhUWVBFX05BTUUsIG9ybUpvaW5Db2x1bW4uZ2V0RGVmYXVsdFRhYmxlKCkpOwotCi0JCUNhc2NhZGUgY2FzY2FkZSA9IG9ybU9uZVRvT25lTWFwcGluZy5nZXRDYXNjYWRlKCk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNBbGwoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNNZXJnZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY2FzY2FkZS5pc1BlcnNpc3QoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZW1vdmUoKSk7Ci0JCWFzc2VydEZhbHNlKGNhc2NhZGUuaXNSZWZyZXNoKCkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybU9uZVRvT25lTWFwcGluZy5nZXRKb2luRmV0Y2goKS5nZXRWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2Uob3JtT25lVG9PbmVNYXBwaW5nLmdldFByaXZhdGVPd25lZCgpLmlzUHJpdmF0ZU93bmVkKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVBlcnNpc3RlbnRBdHRyaWJ1dGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODhiMjcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQW5ub3RhdGVkRWxlbWVudC5LaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQWNjZXNzVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5CYXNpY01hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSWRNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmpwYTEuY29udGV4dC5qYXZhLkdlbmVyaWNKYXZhTnVsbEF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0lkTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFDb3JlUGx1Z2luLkRFRkFVTFRfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVOdWxsQXR0cmlidXRlTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7CQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZChDUik7CQkJCi0JCQkJc2IuYXBwZW5kKCIgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7IikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlJZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5JRCwgSlBBLkNPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBJZCIpOwotCQkJCXNiLmFwcGVuZCgiQENvbHVtbihuYW1lPVwiRk9PXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLk9ORV9UT19PTkUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT25lVG9PbmUiKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIEFkZHJlc3MgYWRkcmVzczsiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlU3BlY2lmaWVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRUcnVlKG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1NwZWNpZmllZCgpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHNwZWNpZmllZEF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJuYW1lIiwgc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlhc3NlcnRGYWxzZShzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VTcGVjaWZpZWRNYXBwaW5nS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RUeXBlTnVsbEF0dHJpYnV0ZU1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCWFzc2VydEVxdWFscygzLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQkvL3Rha2UgYSB2aXJ0dWFsIG1hcHBpbmcgd2l0aCBhIG1hcHBpbmcgdHlwZSBhbmQgbWFrZSBpdCBzcGVjaWZpZWQKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBHZW5lcmljSmF2YU51bGxBdHRyaWJ1dGVNYXBwaW5nKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSwgTWFwcGluZ0tleXMuT05FX1RPX09ORV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlhc3NlcnRUcnVlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgT3JtRWNsaXBzZUxpbmtPbmVUb09uZU1hcHBpbmcpOwotCQkKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvU3BlY2lmaWVkKE1hcHBpbmdLZXlzLklEX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCUl0ZXJhdG9yPE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHNwZWNpZmllZEF0dHJpYnV0ZXMgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBzcGVjaWZpZWRBdHRyaWJ1dGVzLm5leHQoKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydFRydWUoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBPcm1FY2xpcHNlTGlua0lkTWFwcGluZyk7Ci0JCQotCQlzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gc3BlY2lmaWVkQXR0cmlidXRlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RmFsc2Uoc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNYWtlVmlydHVhbCgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKDAsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXNTaXplKCkpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBzcGVjaWZpZWRPcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuaXNWaXJ0dWFsKCkpOwotCQkKLQkJc3BlY2lmaWVkT3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9WaXJ0dWFsKCk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMCwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlJdGVyYXRvcjxPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHZpcnR1YWxBdHRyaWJ1dGVzID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgdmlydHVhbEF0dHJpYnV0ZSA9IHZpcnR1YWxBdHRyaWJ1dGVzLm5leHQoKTsJCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgdmlydHVhbEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQl2aXJ0dWFsQXR0cmlidXRlID0gdmlydHVhbEF0dHJpYnV0ZXMubmV4dCgpOwkJCi0JCWFzc2VydEVxdWFscygibmFtZSIsIHZpcnR1YWxBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1ha2VWaXJ0dWFsTm9VbmRlcmx5aW5nSmF2YUF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0VHlwZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuY29udmVydFRvU3BlY2lmaWVkKCk7Ci0KLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldFNwZWNpZmllZEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRNYXBwaW5nKCkuc2V0TmFtZSgibm9KYXZhQXR0cmlidXRlIik7Ci0JCWFzc2VydEVxdWFscygxLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlc1NpemUoKSk7Ci0JCWFzc2VydEVxdWFscygyLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzU2l6ZSgpKTsKLQkJCi0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXNwZWNpZmllZE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXNTaXplKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0U3BlY2lmaWVkQXR0cmlidXRlc1NpemUoKSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImlkIiwgb3JtUGVyc2lzdGVudFR5cGUuZ2V0VmlydHVhbEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm5hbWUiLCBvcm1QZXJzaXN0ZW50VHlwZS5nZXRTcGVjaWZpZWRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlKCkgIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCQotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldFZpcnR1YWxBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCAoKElkTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCkpLmdldENvbHVtbigpLmdldE5hbWUoKSk7Ci0JCQotCQkKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZ0tleSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZCIsICgoQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKSkuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFZpcnR1YWxNYXBwaW5nVHlwZVdoZW5NZXRhZGF0YUNvbXBsZXRlMigpICB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eU9uZVRvT25lTWFwcGluZygpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQkKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRWaXJ0dWFsQXR0cmlidXRlcygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nS2V5KCkpOwotCQkKLQkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0KLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLk5VTExfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5SWRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqYXZhUGVyc2lzdGVudFR5cGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGphdmFQZXJzaXN0ZW50QXR0cmlidXRlID0gamF2YVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQkJCi0JCS8vdmlydHVhbCBvcm0gYXR0cmlidXRlLCBhY2Nlc3MgdHlwZSBtYXRjaGVzIGphdmEgOiBGSUVMRCwgbmFtZSBtYXRjaGVzIGphdmEKLQkJYXNzZXJ0VHJ1ZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0Tm90U2FtZShqYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlhc3NlcnRUcnVlKGphdmFSZXNvdXJjZUF0dHJpYnV0ZS5nZXRLaW5kKCkgPT0gS2luZC5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscygiaWQiLCBqYXZhUmVzb3VyY2VBdHRyaWJ1dGUuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50VHlwZS5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0RmllbGRzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGphdmFSZXNvdXJjZUF0dHJpYnV0ZSk7Ci0JCQotCQkKLQkJLy9zcGVjaWZpZWQgb3JtIGF0dHJpYnV0ZSwgYWNjZXNzIHR5cGUgbWF0Y2hlcyBqYXZhIDogRklFTEQsIG5hbWUgbWF0Y2hlcyBqYXZhCi0JCS8vamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2hvdWxkIGJlID09IHRvIGphdmEgY29udGV4dCBtb2RlbCBvYmplY3QKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwotCQlhc3NlcnRGYWxzZShvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQotCQkKLQkJLy92aXJ0dWFsIG9ybSBhdHRyaWJ1dGUsIGphdmEgYWNjZXNzIHR5cGUgRklFTEQsIG9ybSBhY2Nlc3MgdHlwZSBQUk9QRVJUWSwgbmFtZSBtYXRjaGVzIGphdmEKLQkJLy92ZXJpZnkgYm90aCB0aGUgcHJvcGVydHkgamF2YSByZXNvdXJjZSBhdHRyaWJ1dGUgYW5kIHRoZSBmaWVsZCBqYXZhIHJlc291cmNlIGF0dHJpYnV0ZSBhcmUgdXNlZCBpbiBvcm0KLQkJLy9iZWNhdXNlIHRoZSBmaWVsZCBpcyBhbm5vdGF0ZWQgYW5kIHByb3BlcnR5IGlzIHNwZWNpZmllZAotCQkoKE9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUpLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpOwkJCi0JCW9ybVBlcnNpc3RlbnRUeXBlLnNldFNwZWNpZmllZEFjY2VzcyhBY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJTGlzdEl0ZXJhdG9yPE9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG9ybVBlcnNpc3RlbnRUeXBlLmdldEF0dHJpYnV0ZXMoKS5pdGVyYXRvcigpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRGaWVsZEF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaWRQcm9wZXJ0eUF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRGaWVsZEF0dHJpYnV0ZSk7Ci0JCWFzc2VydE5vdFNhbWUob3JtUGVyc2lzdGVudEF0dHJpYnV0ZSwgaWRQcm9wZXJ0eUF0dHJpYnV0ZSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpZFByb3BlcnR5QXR0cmlidXRlOwotCQlhc3NlcnROb3RTYW1lKGphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0QWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5QUk9QRVJUWSwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSgpLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIGlkRmllbGRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRBY2Nlc3MoKSk7Ci0JCWphdmFSZXNvdXJjZUF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlhc3NlcnRFcXVhbHMoImlkIiwgamF2YVJlc291cmNlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhqYXZhUGVyc2lzdGVudFR5cGUuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldE1ldGhvZHMoKS5pdGVyYXRvcigpLm5leHQoKSwgamF2YVJlc291cmNlQXR0cmlidXRlKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ly9kZWZhdWx0IGFjY2VzcyB3aWxsIGJlIGZpZWxkCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsJCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpLnNldE5hbWUoImlkMiIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUoKSk7Ci0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKS5zZXROYW1lKCJpZCIpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCi0JCQotCQlvcm1QZXJzaXN0ZW50VHlwZS5nZXRNYXBwaW5nKCkuc2V0U3BlY2lmaWVkTWV0YWRhdGFDb21wbGV0ZShCb29sZWFuLlRSVUUpOwotCQlhc3NlcnRFcXVhbHMoamF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1TdHJ1Y3RDb252ZXJ0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTNjOTgwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua09ybVN0cnVjdENvbnZlcnRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5NYXBwaW5nS2V5czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LkVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sU3RydWN0Q29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5CQVNJQywgRWNsaXBzZUxpbmsuQ09OVkVSVCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldENvbnZlcnRlcigibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgbmFtZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0Q29udmVydGVyQ2xhc3MoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRDb252ZXJ0ZXIoKSk7Ci0JCi0JCW9ybUNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcyhudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldENvbnZlcnRlcigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFN0cnVjdENvbnZlcnRlcigwKTsKLQkJWG1sU3RydWN0Q29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRTdHJ1Y3RDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUoIm15Q29udmVydCIpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0KLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIG5hbWUgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJY29udmVydGVyUmVzb3VyY2Uuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJiYXNpY01hcHBpbmciKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRTdHJ1Y3RDb252ZXJ0ZXIoMCk7Ci0JCVhtbFN0cnVjdENvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0U3RydWN0Q29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCQkKLQkJLy9zZXQgY29udmVydGVyIGNsYXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkKLQkJb3JtQ29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjMDk0Yi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UcmFuc2llbnRNYXBwaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtVHJhbnNpZW50TWFwcGluZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihKUEEuRU5USVRZLCBKUEEuVFJBTlNJRU5UKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUcmFuc2llbnQiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVRyYW5zaWVudE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhUcmFuc2llbnRNYXBwaW5nKCk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJCi0JCU9ybVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZS5pc1ZpcnR1YWwoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmdLZXkoKSk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gcGVyc2lzdGVudEF0dHJpYnV0ZS5jb252ZXJ0VG9TcGVjaWZpZWQoTWFwcGluZ0tleXMuVFJBTlNJRU5UX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbnRBdHRyaWJ1dGUyLmlzVmlydHVhbCgpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVksIHBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmdLZXkoKSk7Ci0JCWFzc2VydEVxdWFscyhNYXBwaW5nS2V5cy5UUkFOU0lFTlRfQVRUUklCVVRFX01BUFBJTkdfS0VZLCBwZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCkuZ2V0S2V5KCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVHlwZUNvbnZlcnRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJmZGQxZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5KUEE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5jb250ZXh0Lm9ybS5Pcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEJhc2ljOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5vcm0uWG1sVHlwZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5FY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aEJhc2ljTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLkJBU0lDLCBFY2xpcHNlTGluay5DT05WRVJULCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQEVudGl0eSIpLmFwcGVuZChDUik7Ci0JCQl9Ci0JCQkKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQmFzaWMiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBDb252ZXJ0KG5hbWU9XCJmb29cIikiKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCQotCXB1YmxpYyBFY2xpcHNlTGlua09ybVR5cGVDb252ZXJ0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoQmFzaWNNYXBwaW5nKCk7Ci0JCQotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgb3JtQmFzaWNNYXBwaW5nID0gKE9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsgCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlciBvcm1Db252ZXJ0ZXIgPSBvcm1CYXNpY01hcHBpbmcuZ2V0Q29udmVydGVyQ29udGFpbmVyKCkuYWRkVHlwZUNvbnZlcnRlcigwKTsKLQkJWG1sVHlwZUNvbnZlcnRlciBjb252ZXJ0ZXJSZXNvdXJjZSA9ICgoWG1sQmFzaWMpIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCkuZ2V0QXR0cmlidXRlcygpLmdldEJhc2ljcygpLmdldCgwKSkuZ2V0VHlwZUNvbnZlcnRlcnMoKS5nZXQoMCk7Ci0JCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXREYXRhVHlwZSgibXlDb252ZXJ0Iik7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0Iiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydCIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0RGF0YVR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IGdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksICJtb2RlbC5Gb28iKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLkJBU0lDX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDApOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXREYXRhVHlwZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgb3JtQ29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlclJlc291cmNlLmdldERhdGFUeXBlKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0RGF0YVR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXREYXRhVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU9iamVjdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDApOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXRPYmplY3RUeXBlKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE9iamVjdFR5cGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXRPYmplY3RUeXBlKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0T2JqZWN0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhCYXNpY01hcHBpbmcoKTsKLQkJCi0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVksICJpZCIpOwotCQlPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBvcm1CYXNpY01hcHBpbmcgPSAoT3JtRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOyAKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyIG9ybUNvbnZlcnRlciA9IG9ybUJhc2ljTWFwcGluZy5nZXRDb252ZXJ0ZXJDb250YWluZXIoKS5hZGRUeXBlQ29udmVydGVyKDApOwotCQlYbWxUeXBlQ29udmVydGVyIGNvbnZlcnRlclJlc291cmNlID0gKChYbWxCYXNpYykgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0QmFzaWNzKCkuZ2V0KDApKS5nZXRUeXBlQ29udmVydGVycygpLmdldCgwKTsKLQkJCi0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQljb252ZXJ0ZXJSZXNvdXJjZS5zZXROYW1lKCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCi0JCS8vc2V0IGNvbnZlcnRlciBjbGFzcyBuYW1lIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWNvbnZlcnRlclJlc291cmNlLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlclJlc291cmNlLmdldE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuQkFTSUNfQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiYmFzaWNNYXBwaW5nIik7Ci0JCU9ybUVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nIG9ybUJhc2ljTWFwcGluZyA9IChPcm1FY2xpcHNlTGlua0Jhc2ljTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7IAotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXIgb3JtQ29udmVydGVyID0gb3JtQmFzaWNNYXBwaW5nLmdldENvbnZlcnRlckNvbnRhaW5lcigpLmFkZFR5cGVDb252ZXJ0ZXIoMCk7Ci0JCVhtbFR5cGVDb252ZXJ0ZXIgY29udmVydGVyUmVzb3VyY2UgPSAoKFhtbEJhc2ljKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRCYXNpY3MoKS5nZXQoMCkpLmdldFR5cGVDb252ZXJ0ZXJzKCkuZ2V0KDApOwotCQotCQlhc3NlcnRFcXVhbHMobnVsbCwgb3JtQ29udmVydGVyLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCQotCQkvL3NldCBjb252ZXJ0ZXIgY2xhc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCB1cGRhdGVkCi0JCW9ybUNvbnZlcnRlci5zZXROYW1lKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBvcm1Db252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBjb252ZXJ0ZXJSZXNvdXJjZS5nZXROYW1lKCkpOwotCQotCQlvcm1Db252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIG9ybUNvbnZlcnRlci5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgY29udmVydGVyUmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYjk1NGUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhVmVyc2lvbk1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lm9ybS5Pcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVZlcnNpb25NYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0Jhc2ljTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5FY2xpcHNlTGlua0NvbnZlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQuRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5vcm0uT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQuRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZTsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtPcm1WZXJzaW9uTWFwcGluZ1Rlc3RzCi0JZXh0ZW5kcyBFY2xpcHNlTGlua0NvbnRleHRNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFksIEpQQS5WRVJTSU9OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARW50aXR5IikuYXBwZW5kKENSKTsKLQkJCX0KLQkJCQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBWZXJzaW9uIikuYXBwZW5kKENSKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oSlBBLkVOVElUWSwgSlBBLlZFUlNJT04sIEVjbGlwc2VMaW5rLk1VVEFCTEUsICJqYXZhLnV0aWwuRGF0ZSIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQkJCi0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFZlcnNpb24iKS5hcHBlbmQoQ1IpOwotCQkJCXNiLmFwcGVuZCgiICAgIEBNdXRhYmxlIikuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICBwcml2YXRlIERhdGUgbXlEYXRlOyIpLmFwcGVuZChDUik7Ci0JCQkJc2IuYXBwZW5kKENSKTsKLQkJCQlzYi5hcHBlbmQoIiAgICAiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZVRlc3RFbnRpdHlXaXRoVmVyc2lvbk1hcHBpbmcoKTsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSAKLQkJCWdldEVudGl0eU1hcHBpbmdzKCkuYWRkUGVyc2lzdGVudFR5cGUoTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVksIEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpOwotCQlPcm1QZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgPQotCQkJb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyBjb250ZXh0VmVyc2lvbiA9IAotCQkJKE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVmVyc2lvbiByZXNvdXJjZVZlcnNpb24gPSAKLQkJCShYbWxWZXJzaW9uKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJpZCIpLmdldE1hcHBpbmcoKTsKLQkJCi0JCS8vIGNoZWNrIGRlZmF1bHRzCi0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gdHJ1ZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gY2xlYXIgeG1sIG11dGFibGUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKG51bGwpOwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gVE9ETyAtIHRlc3QgZGVmYXVsdHMgZm9yIGphdmEgc2VyaWFsaXphYmxlIGFuZCBkYXRlL3RpbWUgdHlwZXMsIAotCQkvLyB3aXRoIGFuZCB3aXRob3V0IHBlcnNpc3RlbmNlIHByb3BlcnR5Ci0JCQotCQkvLyBzZXQgbXV0YWJsZSBvbiBqYXZhIGJhc2ljIG1hcHBpbmcKLQkJCi0JCWphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHJlbW92ZSBhdHRyaWJ1dGUgZnJvbSB4bWwsIHRlc3QgZGVmYXVsdCBtdXRhYmxlIGZyb20gamF2YQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmlydHVhbENvbnRleHRWZXJzaW9uID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUodmlydHVhbENvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgdmlydHVhbENvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZSh2aXJ0dWFsQ29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbWV0YWRhdGEgY29tcGxldGUKLQkJb3JtUGVyc2lzdGVudFR5cGUuZ2V0TWFwcGluZygpLnNldFNwZWNpZmllZE1ldGFkYXRhQ29tcGxldGUoQm9vbGVhbi5UUlVFKTsKLQkJb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcgY29udGV4dEJhc2ljID0gKEVjbGlwc2VMaW5rQmFzaWNNYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlMi5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjb250ZXh0QmFzaWMuZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVNdXRhYmxlRGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVUZXN0RW50aXR5V2l0aE11dGFibGVWZXJzaW9uRGF0ZSgpOwotCQlPcm1QZXJzaXN0ZW50VHlwZSBvcm1QZXJzaXN0ZW50VHlwZSA9IAotCQkJZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSk7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9Ci0JCQlvcm1QZXJzaXN0ZW50VHlwZS5hZGRTcGVjaWZpZWRBdHRyaWJ1dGUoTWFwcGluZ0tleXMuVkVSU0lPTl9BVFRSSUJVVEVfTUFQUElOR19LRVksICJteURhdGUiKTsKLQkJT3JtRWNsaXBzZUxpbmtWZXJzaW9uTWFwcGluZyBjb250ZXh0VmVyc2lvbiA9IAotCQkJKE9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxFbnRpdHkgcmVzb3VyY2VFbnRpdHkgPSAKLQkJCShYbWxFbnRpdHkpZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKTsKLQkJWG1sVmVyc2lvbiByZXNvdXJjZVZlcnNpb24gPSAKLQkJCShYbWxWZXJzaW9uKSByZXNvdXJjZUVudGl0eS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgamF2YVZlcnNpb25NYXBwaW5nID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRUeXBlLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpLmdldEF0dHJpYnV0ZU5hbWVkKCJteURhdGUiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQkvLyBjaGVjayBkZWZhdWx0cwotCQkKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgeG1sIG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKEJvb2xlYW4uRkFMU0UpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IHhtbCBtdXRhYmxlIHRvIHRydWUsIGNoZWNrIGNvbnRleHQKLQkJCi0JCXJlc291cmNlVmVyc2lvbi5zZXRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBjbGVhciB4bWwgbXV0YWJsZSwgY2hlY2sgY29udGV4dAotCQkKLQkJcmVzb3VyY2VWZXJzaW9uLnNldE11dGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCQotCQlnZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRPcHRpb25zKCkuc2V0VGVtcG9yYWxNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCWdldFBlcnNpc3RlbmNlVW5pdCgpLmdldE9wdGlvbnMoKS5zZXRUZW1wb3JhbE11dGFibGUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0T3B0aW9ucygpLnNldFRlbXBvcmFsTXV0YWJsZShudWxsKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydE51bGwoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCQotCQkvLyBzZXQgbXV0YWJsZSBvbiBqYXZhIHZlcnNpb24gbWFwcGluZwotCQkKLQkJamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5zZXRTcGVjaWZpZWRNdXRhYmxlKEJvb2xlYW4uVFJVRSk7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gcmVtb3ZlIGF0dHJpYnV0ZSBmcm9tIHhtbCwgdGVzdCBkZWZhdWx0IG11dGFibGUgZnJvbSBqYXZhCi0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuY29udmVydFRvVmlydHVhbCgpOwotCQlPcm1SZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIgPSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVOYW1lZCgibXlEYXRlIik7Ci0JCUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgdmlydHVhbENvbnRleHRWZXJzaW9uID0gKEVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKHZpcnR1YWxDb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdmlydHVhbENvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKHZpcnR1YWxDb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQlhc3NlcnRUcnVlKGphdmFWZXJzaW9uTWFwcGluZy5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IG1ldGFkYXRhIGNvbXBsZXRlCi0JCW9ybVBlcnNpc3RlbnRUeXBlLmdldE1hcHBpbmcoKS5zZXRTcGVjaWZpZWRNZXRhZGF0YUNvbXBsZXRlKEJvb2xlYW4uVFJVRSk7Ci0JCW9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoIm15RGF0ZSIpOwotCQlFY2xpcHNlTGlua0Jhc2ljTWFwcGluZyBjb250ZXh0QmFzaWMgPSAoRWNsaXBzZUxpbmtCYXNpY01hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRCYXNpYy5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dEJhc2ljLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoamF2YVZlcnNpb25NYXBwaW5nLmdldE11dGFibGUoKS5pc011dGFibGUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gCi0JCQlnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0KLQkJCW9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljIik7Ci0JCU9ybUVjbGlwc2VMaW5rVmVyc2lvbk1hcHBpbmcgY29udGV4dFZlcnNpb24gPSAKLQkJCShPcm1FY2xpcHNlTGlua1ZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJWG1sRW50aXR5IHJlc291cmNlRW50aXR5ID0gCi0JCQkoWG1sRW50aXR5KWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0RW50aXRpZXMoKS5nZXQoMCk7Ci0JCVhtbFZlcnNpb24gcmVzb3VyY2VWZXJzaW9uID0gCi0JCQkoWG1sVmVyc2lvbikgcmVzb3VyY2VFbnRpdHkuZ2V0QXR0cmlidXRlcygpLmdldFZlcnNpb25zKCkuZ2V0KDApOwotCQkKLQkJLy8gY2hlY2sgZGVmYXVsdHMKLQkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VWZXJzaW9uLmdldE11dGFibGUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5pc0RlZmF1bHRNdXRhYmxlKCkpOwotCQlhc3NlcnROdWxsKGNvbnRleHRWZXJzaW9uLmdldE11dGFibGUoKS5nZXRTcGVjaWZpZWRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNNdXRhYmxlKCkpOwotCQkKLQkJLy8gc2V0IGNvbnRleHQgbXV0YWJsZSB0byB0cnVlLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUoQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmdldFNwZWNpZmllZE11dGFibGUoKSk7Ci0JCWFzc2VydFRydWUoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IG11dGFibGUgdG8gZmFsc2UsIGNoZWNrIHJlc291cmNlCi0JCQotCQljb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuc2V0U3BlY2lmaWVkTXV0YWJsZShCb29sZWFuLkZBTFNFKTsKLQkJCi0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCByZXNvdXJjZVZlcnNpb24uZ2V0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzRGVmYXVsdE11dGFibGUoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQkJCi0JCS8vIHNldCBjb250ZXh0IHJlYWQgb25seSB0byBudWxsLCBjaGVjayByZXNvdXJjZQotCQkKLQkJY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLnNldFNwZWNpZmllZE11dGFibGUobnVsbCk7Ci0JCQotCQlhc3NlcnROdWxsKHJlc291cmNlVmVyc2lvbi5nZXRNdXRhYmxlKCkpOwotCQlhc3NlcnRGYWxzZShjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuaXNEZWZhdWx0TXV0YWJsZSgpKTsKLQkJYXNzZXJ0TnVsbChjb250ZXh0VmVyc2lvbi5nZXRNdXRhYmxlKCkuZ2V0U3BlY2lmaWVkTXV0YWJsZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udGV4dFZlcnNpb24uZ2V0TXV0YWJsZSgpLmlzTXV0YWJsZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3JlYXRlVGVzdEVudGl0eVdpdGhWZXJzaW9uTWFwcGluZygpOwotCQkKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCBGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJT3JtUGVyc2lzdGVudEF0dHJpYnV0ZSBvcm1QZXJzaXN0ZW50QXR0cmlidXRlID0gb3JtUGVyc2lzdGVudFR5cGUuYWRkU3BlY2lmaWVkQXR0cmlidXRlKE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZLCAiaWQiKTsKLQkJT3JtVmVyc2lvbk1hcHBpbmcgb3JtVmVyc2lvbk1hcHBpbmcgPSAoT3JtVmVyc2lvbk1hcHBpbmcpIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlYbWxWZXJzaW9uIGJhc2ljUmVzb3VyY2UgPSAoWG1sVmVyc2lvbikgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRFbnRpdGllcygpLmdldCgwKS5nZXRBdHRyaWJ1dGVzKCkuZ2V0VmVyc2lvbnMoKS5nZXQoMCk7Ci0JCUphdmFWZXJzaW9uTWFwcGluZyBqYXZhVmVyc2lvbk1hcHBpbmcgPSAoSmF2YVZlcnNpb25NYXBwaW5nKSBvcm1QZXJzaXN0ZW50VHlwZS5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKS5nZXRNYXBwaW5nKCk7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCQkJCi0JCS8vc2V0IGxvYiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJYmFzaWNSZXNvdXJjZS5zZXRDb252ZXJ0KCJteUNvbnZlcnQiKTsKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnQiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0KLQkJLy9zZXQgbG9iIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWJhc2ljUmVzb3VyY2Uuc2V0Q29udmVydChudWxsKTsKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQkKLQkJCi0JCWphdmFWZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiZm9vIik7Ci0JCQotCQlhc3NlcnROdWxsKG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJCi0JCQotCQlvcm1QZXJzaXN0ZW50QXR0cmlidXRlLmNvbnZlcnRUb1ZpcnR1YWwoKTsKLQkJT3JtUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUyID0gb3JtUGVyc2lzdGVudFR5cGUuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCVZlcnNpb25NYXBwaW5nIHZpcnR1YWxWZXJzaW9uTWFwcGluZyA9IChWZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZTIuZ2V0TWFwcGluZygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKEVjbGlwc2VMaW5rQ29udmVydC5jbGFzcywgdmlydHVhbFZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIHZpcnR1YWxWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCAoKEVjbGlwc2VMaW5rQ29udmVydCkgamF2YVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpKS5nZXRTcGVjaWZpZWRDb252ZXJ0ZXJOYW1lKCkpOwotCQkKLQkJKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIHZpcnR1YWxWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSB2aXJ0dWFsVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLmdldFNwZWNpZmllZENvbnZlcnRlck5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgKChFY2xpcHNlTGlua0NvbnZlcnQpIGphdmFWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQlqYXZhVmVyc2lvbk1hcHBpbmcuc2V0Q29udmVydGVyKG51bGwpOwotCQlhc3NlcnROdWxsKHZpcnR1YWxWZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJYXNzZXJ0TnVsbChqYXZhVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVudFR5cGUgb3JtUGVyc2lzdGVudFR5cGUgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmFkZFBlcnNpc3RlbnRUeXBlKE1hcHBpbmdLZXlzLkVOVElUWV9UWVBFX01BUFBJTkdfS0VZLCAibW9kZWwuRm9vIik7Ci0JCU9ybVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG9ybVBlcnNpc3RlbnRUeXBlLmFkZFNwZWNpZmllZEF0dHJpYnV0ZShNYXBwaW5nS2V5cy5WRVJTSU9OX0FUVFJJQlVURV9NQVBQSU5HX0tFWSwgImJhc2ljTWFwcGluZyIpOwotCQlPcm1WZXJzaW9uTWFwcGluZyBvcm1WZXJzaW9uTWFwcGluZyA9IChPcm1WZXJzaW9uTWFwcGluZykgb3JtUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCVhtbFZlcnNpb24gYmFzaWNSZXNvdXJjZSA9IChYbWxWZXJzaW9uKSBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldEVudGl0aWVzKCkuZ2V0KDApLmdldEF0dHJpYnV0ZXMoKS5nZXRWZXJzaW9ucygpLmdldCgwKTsKLQkKLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnROdWxsKGJhc2ljUmVzb3VyY2UuZ2V0Q29udmVydCgpKTsKLQkJCQkKLQkJLy9zZXQgbG9iIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgdXBkYXRlZAotCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCIiLCBiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JCWFzc2VydEVxdWFscyhFY2xpcHNlTGlua0NvbnZlcnQuY2xhc3MsIG9ybVZlcnNpb25NYXBwaW5nLmdldENvbnZlcnRlcigpLmdldFR5cGUoKSk7Ci0JCi0JCSgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuc2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgiYmFyIik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCQlhc3NlcnRFcXVhbHMoRWNsaXBzZUxpbmtDb252ZXJ0LmNsYXNzLCBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsICgoRWNsaXBzZUxpbmtDb252ZXJ0KSBvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKSkuZ2V0U3BlY2lmaWVkQ29udmVydGVyTmFtZSgpKTsKLQotCQkoKEVjbGlwc2VMaW5rQ29udmVydCkgb3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkpLnNldFNwZWNpZmllZENvbnZlcnRlck5hbWUobnVsbCk7Ci0KLQkJYXNzZXJ0TnVsbChvcm1WZXJzaW9uTWFwcGluZy5nZXRDb252ZXJ0ZXIoKS5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgYmFzaWNSZXNvdXJjZS5nZXRDb252ZXJ0KCkpOwotCi0JCS8vc2V0IGxvYiB0byBmYWxzZSBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlvcm1WZXJzaW9uTWFwcGluZy5zZXRDb252ZXJ0ZXIobnVsbCk7Ci0JCWFzc2VydE51bGwob3JtVmVyc2lvbk1hcHBpbmcuZ2V0Q29udmVydGVyKCkuZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0TnVsbChiYXNpY1Jlc291cmNlLmdldENvbnZlcnQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjkxYWYwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDEyIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0Lm9ybTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkFjY2Vzc1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVhtbE1hcHBpbmdGaWxlUmVmIG1hcHBpbmdGaWxlUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxNYXBwaW5nRmlsZVJlZigpOwotCQltYXBwaW5nRmlsZVJlZi5zZXRGaWxlTmFtZShKcHRKcGFFY2xpcHNlTGlua0NvcmVQbHVnaW4uREVGQVVMVF9FQ0xJUFNFTElOS19PUk1fWE1MX1JVTlRJTUVfUEFUSC50b1N0cmluZygpKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0TWFwcGluZ0ZpbGVzKCkuYWRkKG1hcHBpbmdGaWxlUmVmKTsKLQkJZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpLnNhdmUobnVsbCk7Ci0JfQotCQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0SXNBbGxGZWF0dXJlc1Vuc2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhIHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhID0gRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXNjYWRlUGVyc2lzdChmYWxzZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEoImFzZGYiKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRDYXRhbG9nKCJhc2RmIik7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2UuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzUmVzb3VyY2Uuc2V0Q2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0c1Jlc291cmNlLmlzVW5zZXQoKSk7Ci0JCQotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLlBST1BFUlRZKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5zZXRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0RGVmYXVsdHNSZXNvdXJjZS5pc1Vuc2V0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEoIk1ZX1NDSEVNQSIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRTY2hlbWEoKSk7Ci0JCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRTY2hlbWEobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVNjaGVtYTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNjaGVtYSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgc2NoZW1hIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkU2NoZW1hKCJNWV9TQ0hFTUEiKTsKLQkJYXNzZXJ0RXF1YWxzKCJNWV9TQ0hFTUEiLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCQkKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0U2NoZW1hKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5U2NoZW1hMygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCWFzc2VydEVxdWFscygiTVlfU0NIRU1BIiwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U2NoZW1hKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX1NDSEVNQSIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldFNjaGVtYSgpKTsKLQkJCi0JCS8vc2V0IHNjaGVtYSB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZFNjaGVtYShudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTY2hlbWEoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlQ2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHZlcmlmeSBjb250ZXh0IG1vZGVsIHVwZGF0ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIHJlc291cmNlIG1vZGVsCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZygpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnRFcXVhbHMoIk1ZX0NBVEFMT0ciLCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRDYXRhbG9nKCkpOwotCQkKLQkJLy9zZXQgY2F0YWxvZyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZENhdGFsb2cobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0Q2F0YWxvZygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5Q2F0YWxvZzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldFNjaGVtYSgiTVlfU0NIRU1BIik7Ci0JCS8vc2V0IGNhdGFsb2cgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0Q2F0YWxvZygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhdGFsb2czKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1tZXRhZGF0YSBlbGVtZW50IHNvIG9ubHkgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IGdldHMgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSh0cnVlKTsKLQkJCi0JCS8vc2V0IGNhdGFsb2cgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRDYXRhbG9nKCJNWV9DQVRBTE9HIik7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldENhdGFsb2coKSk7Ci0JCWFzc2VydEVxdWFscygiTVlfQ0FUQUxPRyIsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldENhdGFsb2coKSk7Ci0JCQotCQkvL3NldCBjYXRhbG9nIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQ2F0YWxvZyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRDYXRhbG9nKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9ybVBlcnNpc3RlbmNlVW5pdERlZmF1bHRzIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzID0gcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwsIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgdGFnIG5vdCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGNhc2NhZGVQZXJzaXN0IHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0Q2FzY2FkZVBlcnNpc3QoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlDYXNjYWRlUGVyc2lzdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCBpbiB0aGUgY29udGV4dCBtb2RlbCwgdmVyaWZ5IHJlc291cmNlIG1vZGVsIG1vZGlmaWVkCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydFRydWUoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJCi0JCS8vc2V0IGFub3RoZXIgZWxlbWVudCBvbiB0aGUgcGVyc2lzdGVuY2UtdW5pdC1kZWZhdWx0cyBlbGVtZW50IHNvIGl0IGRvZXNuJ3QgZ2V0IHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0Q2F0YWxvZygiTVlfQ0FUQUxPRyIpOwotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0RmFsc2UoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUNhc2NhZGVQZXJzaXN0MygpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gb25seSBwZXJzaXN0ZW5jZS11bml0LWRlZmF1bHRzIGVsZW1lbnQgZ2V0cyByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQkKLQkJLy9zZXQgY2FzY2FkZVBlcnNpc3QgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRDYXNjYWRlUGVyc2lzdCh0cnVlKTsKLQkJYXNzZXJ0VHJ1ZShwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5pc0Nhc2NhZGVQZXJzaXN0KCkpOwotCQlhc3NlcnRUcnVlKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmlzQ2FzY2FkZVBlcnNpc3QoKSk7Ci0JCQotCQkvL3NldCBjYXNjYWRlUGVyc2lzdCB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldENhc2NhZGVQZXJzaXN0KGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuaXNDYXNjYWRlUGVyc2lzdCgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSByZXNvdXJjZSBtb2RlbCwgdmVyaWZ5IGNvbnRleHQgbW9kZWwgdXBkYXRlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLnNldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5zZXRBY2Nlc3Mob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxEKTsKLQkJYXNzZXJ0RXF1YWxzKEFjY2Vzc1R5cGUuRklFTEQsIHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0RXF1YWxzKG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5vcm0uQWNjZXNzVHlwZS5GSUVMRCwgZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuZ2V0QWNjZXNzKCkpOwotCQotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgcmVzb3VyY2UgbW9kZWwKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkuc2V0QWNjZXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlBY2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlPcm1QZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyA9IHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5QUk9QRVJUWSk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLlBST1BFUlRZLCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuUFJPUEVSVFksIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgYWNjZXNzIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuc2V0U3BlY2lmaWVkQWNjZXNzKEFjY2Vzc1R5cGUuRklFTEQpOwotCQlhc3NlcnRFcXVhbHMoQWNjZXNzVHlwZS5GSUVMRCwgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnRFcXVhbHMob3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLm9ybS5BY2Nlc3NUeXBlLkZJRUxELCBnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuZ2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoKS5nZXRBY2Nlc3MoKSk7Ci0JCQotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBzbyBpdCBkb2Vzbid0IGdldCByZW1vdmVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLnNldENhc2NhZGVQZXJzaXN0KHRydWUpOwotCQkvL3NldCBhY2Nlc3MgdG8gbnVsbCBpbiB0aGUgY29udGV4dCBtb2RlbAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MobnVsbCk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0RGVmYXVsdHMuZ2V0U3BlY2lmaWVkQWNjZXNzKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeUFjY2VzczMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgcGVyc2lzdGVuY2VVbml0RGVmYXVsdHMgPSBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLmdldFNwZWNpZmllZEFjY2VzcygpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkvL3NldCBhbm90aGVyIGVsZW1lbnQgb24gdGhlIHBlcnNpc3RlbmNlLXVuaXQtbWV0YWRhdGEgZWxlbWVudCBzbyBvbmx5IHBlcnNpc3RlbmNlLXVuaXQtZGVmYXVsdHMgZWxlbWVudCBnZXRzIHJlbW92ZWQKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCQotCQkvL3NldCBhY2Nlc3MgaW4gdGhlIGNvbnRleHQgbW9kZWwsIHZlcmlmeSByZXNvdXJjZSBtb2RlbCBtb2RpZmllZAotCQlwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5zZXRTcGVjaWZpZWRBY2Nlc3MoQWNjZXNzVHlwZS5GSUVMRCk7Ci0JCWFzc2VydEVxdWFscyhBY2Nlc3NUeXBlLkZJRUxELCBwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydEVxdWFscyhvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2Uub3JtLkFjY2Vzc1R5cGUuRklFTEQsIGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKS5nZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpLmdldEFjY2VzcygpKTsKLQkJCi0JCS8vc2V0IGFjY2VzcyB0byBudWxsIGluIHRoZSBjb250ZXh0IG1vZGVsCi0JCXBlcnNpc3RlbmNlVW5pdERlZmF1bHRzLnNldFNwZWNpZmllZEFjY2VzcyhudWxsKTsKLQkJYXNzZXJ0TnVsbChwZXJzaXN0ZW5jZVVuaXREZWZhdWx0cy5nZXRTcGVjaWZpZWRBY2Nlc3MoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLmdldFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L29ybS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzOTg0Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5vcm07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5vcm0uT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sTWFwcGluZ0ZpbGVSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLkVjbGlwc2VMaW5rT3JtRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2Uub3JtLlhtbFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdE1ldGFkYXRhVGVzdHMKLQlleHRlbmRzIEVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2UKLXsKLQlwdWJsaWMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlYbWxNYXBwaW5nRmlsZVJlZiBtYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJbWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCWdldFhtbFBlcnNpc3RlbmNlVW5pdCgpLmdldE1hcHBpbmdGaWxlcygpLmFkZChtYXBwaW5nRmlsZVJlZik7Ci0JCWdldFBlcnNpc3RlbmNlWG1sUmVzb3VyY2UoKS5zYXZlKG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpIHsKLQkJcmV0dXJuIGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdElzQWxsRmVhdHVyZXNVbnNldCgpIHRocm93cyBFeGNlcHRpb24gewotCQlYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IEVjbGlwc2VMaW5rT3JtRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5zZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNVbnNldCgpKTsKLQkJCi0JCXBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwotCQkKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzVW5zZXQoKSk7Ci0JCQotCQlwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5zZXRQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cyhFY2xpcHNlTGlua09ybUZhY3RvcnkuZUlOU1RBTkNFLmNyZWF0ZVhtbFBlcnNpc3RlbmNlVW5pdERlZmF1bHRzKCkpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1Vuc2V0KCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlPcm1QZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSBwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSA9IGdldEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKTsKLQkJYXNzZXJ0RmFsc2UocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0TnVsbChnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkpOwotCQkKLQkJLy9zZXQgeG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUgaW4gdGhlIHJlc291cmNlIG1vZGVsLCB2ZXJpZnkgY29udGV4dCBtb2RlbCB1cGRhdGVkCi0JCWdldFhtbEVudGl0eU1hcHBpbmdzKCkuc2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpLnNldFhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKHRydWUpOwkJCi0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQotCQkvL3NldCB4bWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSB0byBudWxsIGluIHRoZSByZXNvdXJjZSBtb2RlbAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vZGlmeVhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnROdWxsKGdldFhtbEVudGl0eU1hcHBpbmdzKCkuZ2V0UGVyc2lzdGVuY2VVbml0TWV0YWRhdGEoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RNb2RpZnlYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT3JtUGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEgPSBnZXRFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCk7Ci0JCWFzc2VydEZhbHNlKHBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhLmlzWG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoKSk7Ci0JCWFzc2VydE51bGwoZ2V0WG1sRW50aXR5TWFwcGluZ3MoKS5nZXRQZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIGluIHRoZSBjb250ZXh0IG1vZGVsLCB2ZXJpZnkgcmVzb3VyY2UgbW9kZWwgbW9kaWZpZWQKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUodHJ1ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJYXNzZXJ0VHJ1ZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQkJCi0JCS8vc2V0IHhtbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlIHRvIG51bGwgaW4gdGhlIGNvbnRleHQgbW9kZWwKLQkJLy9zZXQgYW5vdGhlciBlbGVtZW50IG9uIHRoZSBwZXJzaXN0ZW5jZS11bml0LW1ldGFkYXRhIGVsZW1lbnQgc28gaXQgZG9lc24ndCBnZXQgcmVtb3ZlZAotCQlnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuc2V0UGVyc2lzdGVuY2VVbml0RGVmYXVsdHMoRWNsaXBzZUxpbmtPcm1GYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxQZXJzaXN0ZW5jZVVuaXREZWZhdWx0cygpKTsKLQkJcGVyc2lzdGVuY2VVbml0TWV0YWRhdGEuc2V0WG1sTWFwcGluZ01ldGFkYXRhQ29tcGxldGUoZmFsc2UpOwotCQlhc3NlcnRGYWxzZShwZXJzaXN0ZW5jZVVuaXRNZXRhZGF0YS5pc1htbE1hcHBpbmdNZXRhZGF0YUNvbXBsZXRlKCkpOwotCQlhc3NlcnRGYWxzZShnZXRYbWxFbnRpdHlNYXBwaW5ncygpLmdldFBlcnNpc3RlbmNlVW5pdE1ldGFkYXRhKCkuaXNYbWxNYXBwaW5nTWV0YWRhdGFDb21wbGV0ZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvb3JtL0pwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGE1MGJjNy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9vcm0vSnB0RWNsaXBzZUxpbmtDb3JlT3JtQ29udGV4dE1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAotICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQub3JtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17CQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRFY2xpcHNlTGlua0NvcmVPcm1Db250ZXh0TW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtFbnRpdHlNYXBwaW5nc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0TWV0YWRhdGFUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdERlZmF1bHRzVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1FbWJlZGRhYmxlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1FbnRpdHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybU1hcHBlZFN1cGVyY2xhc3NUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUJhc2ljTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtSWRNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtT25lVG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1QZXJzaXN0ZW50QXR0cmlidXRlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtVmVyc2lvbk1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua09ybUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtT2JqZWN0VHlwZUNvbnZlcnRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rT3JtU3RydWN0Q29udmVydGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1UeXBlQ29udmVydGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtPcm1DYWNoaW5nVGVzdHMuY2xhc3MpOwkKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMV8xT3JtUGVyc2lzdGVudEF0dHJpYnV0ZVRlc3RzLmNsYXNzKTsJCQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsxXzFPcm1QZXJzaXN0ZW50VHlwZVRlc3RzLmNsYXNzKTsJCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazFfMU9ybVRyYW5zaWVudE1hcHBpbmdUZXN0cy5jbGFzcyk7CQotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1Db2xsZWN0aW9uVGFibGVUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9ybUVsZW1lbnRDb2xsZWN0aW9uTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtRW50aXR5VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1NYW55VG9NYW55TWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtTWFueVRvT25lTWFwcGluZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtTWFwcGVkU3VwZXJjbGFzc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8wT3JtT25lVG9PbmVNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzBPcm1PbmVUb01hbnlNYXBwaW5nVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmsyXzFFbnRpdHlNYXBwaW5nc1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rMl8xUGVyc2lzdGVuY2VVbml0RGVmYXVsdHNUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfM09ybU11bHRpdGVuYW5jeVRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQkKLQkKLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZU9ybUNvbnRleHRNb2RlbFRlc3RzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9DYWNoaW5nQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2YzZWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ0FkYXB0ZXJUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZ0VudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5GbHVzaENsZWFyQ2FjaGU7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUKLSAqIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoaW5nQWRhcHRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgQ2FjaGluZyBjYWNoaW5nOwotCXByaXZhdGUgTGlzdEV2ZW50IGVudGl0aWVzRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEVTVCA9ICJFbXBsb3llZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RFU1RfMiA9ICJBZGRyZXNzIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RZUEVfREVGQVVMVF9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSA9IENhY2hlVHlwZS5zb2Z0X3dlYWs7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUVfMiA9IENhY2hlVHlwZS5mdWxsOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0laRV9ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSA9IDEyMzQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRV8yID0gNjc4OTA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSEFSRURfQ0FDSEVfREVGQVVMVF9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1NIQVJFRF9ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMiA9IHRydWU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9UWVBFX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSArIEVOVElUWV9URVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfVEVTVF9WQUxVRSA9IENhY2hlVHlwZS5zb2Z0X3dlYWs7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBDYWNoZVR5cGUgQ0FDSEVfVFlQRV9URVNUX1ZBTFVFXzIgPSBDYWNoZVR5cGUuZnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIQVJFRF9DQUNIRV9LRVkgPSBDYWNoaW5nLkVDTElQU0VMSU5LX1NIQVJFRF9DQUNIRSArIEVOVElUWV9URVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRV8yID0gdHJ1ZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NJWkVfS0VZID0gQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSVpFICsgRU5USVRZX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NJWkVfVEVTVF9WQUxVRSA9IDEyMzQ1OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBDQUNIRV9TSVpFX1RFU1RfVkFMVUVfMiA9IDY3ODkwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMVVNIX0NMRUFSX0NBQ0hFX0tFWSA9IENhY2hpbmcuRUNMSVBTRUxJTktfRkxVU0hfQ0xFQVJfQ0FDSEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBGbHVzaENsZWFyQ2FjaGUgRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSA9IEZsdXNoQ2xlYXJDYWNoZS5kcm9wOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRmx1c2hDbGVhckNhY2hlIEZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUVfMiA9IEZsdXNoQ2xlYXJDYWNoZS5tZXJnZTsKLQotCXB1YmxpYyBDYWNoaW5nQWRhcHRlclRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0Q2FjaGluZygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5jYWNoaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nLkNBQ0hFX1NJWkVfREVGQVVMVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNhY2hpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDYWNoaW5nRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGluZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENhY2hpbmcuRkxVU0hfQ0xFQVJfQ0FDSEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGVudGl0aWVzQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW50aXRpZXNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNhY2hpbmcuYWRkTGlzdENoYW5nZUxpc3RlbmVyKENhY2hpbmcuRU5USVRJRVNfTElTVCwgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSwgQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1NJWkVfREVGQVVMVF9LRVksIENBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTSEFSRURfQ0FDSEVfREVGQVVMVF9LRVksIFNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1NJWkVfS0VZLCBDQUNIRV9TSVpFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENBQ0hFX1RZUEVfS0VZLCBDQUNIRV9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNIQVJFRF9DQUNIRV9LRVksIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShGTFVTSF9DTEVBUl9DQUNIRV9LRVksIEZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkRW50aXRpZXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCQkJQ2FjaGluZ0FkYXB0ZXJUZXN0cy50aGlzLmVudGl0eUFkZGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMuZW50aXR5UmVtb3ZlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nQWRhcHRlclRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUNhY2hpbmdBZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZSkgewotCQkJCUNhY2hpbmdBZGFwdGVyVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9OwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGNsZWFyRXZlbnQoKSB7Ci0JCXN1cGVyLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5lbnRpdGllc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQl2b2lkIGVudGl0eUFkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBlbnRpdHlSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXRpZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJaW50IG9yaWdpbmFsTnVtYmVyT2ZFbnRpdGllcyA9IHRoaXMuY2FjaGluZy5nZXRFbnRpdGllc1NpemUoKTsKLQkJCi0JCXRoaXMuY2FjaGluZy5hZGRFbnRpdHkoRU5USVRZX1RFU1RfMik7Ci0JCWFzc2VydEVxdWFscygiRW50aXR5IG5vdCBhZGRlZCIsIHRoaXMuY2FjaGluZy5nZXRFbnRpdGllc1NpemUoKSwgb3JpZ2luYWxOdW1iZXJPZkVudGl0aWVzICsgMSk7Ci0JCQotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5lbnRpdGllc0V2ZW50KTsKLQkJLy8gdmVyaWZ5IGV2ZW50IGZvciB0aGUgZXhwZWN0ZWQgcHJvcGVydHkKLQkJYXNzZXJ0RXF1YWxzKCJXcm9uZyBFdmVudC4iLCB0aGlzLmVudGl0aWVzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ2FjaGluZy5FTlRJVElFU19MSVNUKTsKLQotCQkvLyByZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuY2FjaGluZy5yZW1vdmVFbnRpdHkoRU5USVRZX1RFU1RfMik7Ci0JCWFzc2VydEVxdWFscygiRW50aXR5IG5vdCByZW1vdmVkIiwgdGhpcy5jYWNoaW5nLmdldEVudGl0aWVzU2l6ZSgpLCBvcmlnaW5hbE51bWJlck9mRW50aXRpZXMpOwotCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDYWNoaW5nLkVOVElUSUVTX0xJU1QpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVUeXBlRGVmYXVsdCAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVR5cGVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgotCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfVFlQRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlVHlwZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogQ2FjaGVTaXplRGVmYXVsdCAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDYWNoZVNpemVEZWZhdWx0IHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbgotCSAqIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTaXplRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfS0VZLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX0tFWSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU0laRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU2l6ZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9LRVksCi0JCQlDQUNIRV9TSVpFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfREVGQVVMVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX0tFWSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNoYXJlZENhY2hlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9ERUZBVUxUX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVR5cGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVUeXBlIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUgUFUKLQkgKiBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX1RZUEVfS0VZLAotCQkJQ0FDSEVfVFlQRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCi0JCQlDYWNoaW5nRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFksCi0JCQlDQUNIRV9UWVBFX0tFWSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1RZUEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZ0VudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZLAotCQkJQ0FDSEVfVFlQRV9LRVksCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBDYWNoZVNpemUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ2FjaGVTaXplIHByb3BlcnR5IGJ5IHRoZSBDYWNoaW5nIGFkYXB0ZXIgd2hlbiB0aGUgUFUKLQkgKiBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNBQ0hFX1NJWkVfS0VZLAotCQkJQ0FDSEVfU0laRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRDYWNoaW5nUHJvcGVydHkoCi0JCQlDYWNoaW5nRW50aXR5LkNBQ0hFX1NJWkVfUFJPUEVSVFksCi0JCQlDQUNIRV9TSVpFX0tFWSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NJWkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZ0VudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZLAotCQkJQ0FDSEVfU0laRV9LRVksCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUUsCi0JCQlDQUNIRV9TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBTaGFyZWRDYWNoZSBwcm9wZXJ0eSBieSB0aGUgQ2FjaGluZyBhZGFwdGVyIHdoZW4gdGhlCi0JICogUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFNoYXJlZENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNIQVJFRF9DQUNIRV9LRVksCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0Q2FjaGluZ1Byb3BlcnR5KAotCQkJQ2FjaGluZ0VudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFksCi0JCQlTSEFSRURfQ0FDSEVfS0VZLAotCQkJU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUsCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2hhcmVkQ2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVDYWNoaW5nUHJvcGVydHkoCi0JCQlDYWNoaW5nRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSwKLQkJCVNIQVJFRF9DQUNIRV9LRVksCi0JCQlTSEFSRURfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRmx1c2hDbGVhckNhY2hlIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Rmx1c2hDbGVhckNhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX0tFWSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUZsdXNoQ2xlYXJDYWNoZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfS0VZLAotCQkJRkxVU0hfQ0xFQVJfQ0FDSEVfVEVTVF9WQUxVRSwKLQkJCUZMVVNIX0NMRUFSX0NBQ0hFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldENhY2hpbmdQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7Ci0JCQotCQkvLyBSZXBsYWNlIGJ5IHNldHRpbmcgbW9kZWwgb2JqZWN0Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkUmVtb3ZlQ2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5KTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOwotCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCBudWxsKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBQcm9wZXJ0eQotCQkrK3RoaXMucHJvcGVydGllc1RvdGFsOwotCQkrK3RoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTEpOwotCQl0aGlzLnZlcmlmeVB1dENhY2hpbmdQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIEVOVElUWV9URVNULCB0ZXN0VmFsdWUxKTsKLQkJCi0JCS8vIFNldCB0byBudWxsCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCBudWxsKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgbnVsbCk7Ci0JCQotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRDYWNoaW5nUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0Q2FjaGluZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy52ZXJpZnlDYWNoaW5nRXZlbnQocHJvcGVydHlOYW1lLCBlbnRpdHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDYWNoaW5nRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCUNhY2hpbmdFbnRpdHkgZW50aXR5ID0gKENhY2hpbmdFbnRpdHkpIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZ0VudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIGVudGl0eS5nZXRQYXJlbnQoKS5nZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZU9mKGVudGl0eU5hbWUpKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmdFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSkpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBlbnRpdHkuZ2V0UGFyZW50KCkuZ2V0Q2FjaGVTaXplT2YoZW50aXR5TmFtZSkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY2FjaGluZy5nZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lKSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nRW50aXR5LlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpIHsKLQkJCWFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlLCBlbnRpdHkuZ2V0UGFyZW50KCkuZ2V0U2hhcmVkQ2FjaGVPZihlbnRpdHlOYW1lKSk7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlT2YoZW50aXR5TmFtZSkpOwotCQl9Ci0JCWVsc2UgewotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJ2ZXJpZnlDYWNoaW5nRXZlbnQiLCBwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVUeXBlRGVmYXVsdCgoQ2FjaGVUeXBlKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZURlZmF1bHQoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9ERUZBVUxUX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRTaGFyZWRDYWNoZURlZmF1bHQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRGbHVzaENsZWFyQ2FjaGUoKEZsdXNoQ2xlYXJDYWNoZSkgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDYWNoaW5nUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZ0VudGl0eS5DQUNIRV9UWVBFX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVR5cGVPZihlbnRpdHlOYW1lLCAoQ2FjaGVUeXBlKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZ0VudGl0eS5DQUNIRV9TSVpFX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRDYWNoZVNpemVPZihlbnRpdHlOYW1lLCAoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmdFbnRpdHkuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSkKLQkJCXRoaXMuY2FjaGluZy5zZXRTaGFyZWRDYWNoZU9mKGVudGl0eU5hbWUsIChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0Q2FjaGluZ1Byb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVEZWZhdWx0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5DQUNIRV9TSVpFX0RFRkFVTFRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVNpemVEZWZhdWx0KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlRGVmYXVsdCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENhY2hpbmdFbnRpdHkuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jYWNoaW5nLmdldENhY2hlU2l6ZU9mKEVOVElUWV9URVNUKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nRW50aXR5LkNBQ0hFX1RZUEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRDYWNoZVR5cGVPZihFTlRJVFlfVEVTVCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ2FjaGluZ0VudGl0eS5TSEFSRURfQ0FDSEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZU9mKEVOVElUWV9URVNUKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDYWNoaW5nLkZMVVNIX0NMRUFSX0NBQ0hFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNhY2hpbmcuZ2V0Rmx1c2hDbGVhckNhY2hlKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9DYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9DYWNoaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzk0ODAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNhY2hpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2FjaGluZ0VudGl0eTsKLQotLyoqCi0gKiBDYWNoaW5nVmFsdWVNb2RlbFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENhY2hpbmdWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDYWNoaW5nIGNhY2hpbmc7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVZhbHVlTW9kZWw8Q2FjaGluZz4gY2FjaGluZ0hvbGRlcjsKLQkKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gY2FjaGVUeXBlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBjYWNoZVR5cGVMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2FjaGVUeXBlRXZlbnQ7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHNoYXJlZENhY2hlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBzaGFyZWRDYWNoZUxpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBzaGFyZWRDYWNoZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGNhY2hlVHlwZURlZmF1bHRIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGNhY2hlVHlwZURlZmF1bHRMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgY2FjaGVUeXBlRGVmYXVsdEV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBzaGFyZWRDYWNoZURlZmF1bHRIb2xkZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBzaGFyZWRDYWNoZURlZmF1bHRFdmVudDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUgPSAiRW1wbG95ZWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2FjaGVUeXBlIENBQ0hFX1RZUEVfVEVTVF9WQUxVRSA9IENhY2hlVHlwZS5oYXJkX3dlYWs7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENhY2hlVHlwZSBDQUNIRV9UWVBFX0RFRkFVTFRfVEVTVF9WQUxVRSA9IENhY2hlVHlwZS53ZWFrOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQotCXB1YmxpYyBDYWNoaW5nVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY2FjaGluZyA9IHRoaXMuc3ViamVjdC5nZXRDYWNoaW5nKCk7IC8vIFN1YmplY3QKLQkJdGhpcy5jYWNoaW5nSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPih0aGlzLmNhY2hpbmcpOwotCQkKLQkJdGhpcy5jYWNoZVR5cGVIb2xkZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlQUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5jYWNoZVR5cGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRDYWNoZVR5cGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNhY2hlVHlwZUhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVMaXN0ZW5lcik7Ci0JCXRoaXMuY2FjaGVUeXBlRXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5zaGFyZWRDYWNoZUhvbGRlciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZUFBKHRoaXMuY2FjaGluZ0hvbGRlcik7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVMaXN0ZW5lciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuc2hhcmVkQ2FjaGVMaXN0ZW5lcik7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IG51bGw7Ci0JCQotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIgPSB0aGlzLmJ1aWxkQ2FjaGVUeXBlRGVmYXVsdEFBKHRoaXMuY2FjaGluZ0hvbGRlcik7Ci0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdExpc3RlbmVyID0gdGhpcy5idWlsZENhY2hlVHlwZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2FjaGVUeXBlRGVmYXVsdExpc3RlbmVyKTsKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIgPSB0aGlzLmJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0QUEodGhpcy5jYWNoaW5nSG9sZGVyKTsKLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRMaXN0ZW5lciA9IHRoaXMuYnVpbGRTaGFyZWRDYWNoZURlZmF1bHRDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRMaXN0ZW5lcik7Ci0JCXRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUFic3RyYWN0TW9kZWwgc3ViamVjdENhY2hpbmcgPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5jYWNoaW5nOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBDYWNoZVR5cGU+IGNhY2hlVHlwZUFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4pIHRoaXMuY2FjaGVUeXBlSG9sZGVyOwotCQlhc3NlcnRUcnVlKGNhY2hlVHlwZUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuQ0FDSEVfVFlQRV9QUk9QRVJUWSkpOwotCQkKLQkJY2FjaGVUeXBlQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuY2FjaGVUeXBlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFkpKTsKLQkJYXNzZXJ0RmFsc2UoY2FjaGVUeXBlQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4gc2hhcmVkQ2FjaGVBQSA9IAotCQkJKFByb3BlcnR5QXNwZWN0QWRhcHRlcjxDYWNoaW5nLCBCb29sZWFuPikgdGhpcy5zaGFyZWRDYWNoZUhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShzaGFyZWRDYWNoZUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSk7Ci0JCQotCQlzaGFyZWRDYWNoZUFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLlNIQVJFRF9DQUNIRV9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShzaGFyZWRDYWNoZUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4gY2FjaGVUeXBlRGVmYXVsdEFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIENhY2hlVHlwZT4pIHRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShjYWNoZVR5cGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5DQUNIRV9UWVBFX0RFRkFVTFRfUFJPUEVSVFkpKTsKLQkJCi0JCWNhY2hlVHlwZURlZmF1bHRBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy5jYWNoZVR5cGVEZWZhdWx0TGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0Q2FjaGluZy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShjYWNoZVR5cGVEZWZhdWx0QUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4gc2hhcmVkQ2FjaGVEZWZhdWx0QUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQm9vbGVhbj4pIHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyOwotCQlhc3NlcnRUcnVlKHNoYXJlZENhY2hlRGVmYXVsdEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RDYWNoaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpKTsKLQkJCi0JCXNoYXJlZENhY2hlRGVmYXVsdEFBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnNoYXJlZENhY2hlRGVmYXVsdExpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdENhY2hpbmcuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ2FjaGluZy5TSEFSRURfQ0FDSEVfREVGQVVMVF9QUk9QRVJUWSkpOwotCQlhc3NlcnRGYWxzZShzaGFyZWRDYWNoZURlZmF1bHRBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFICsgRU5USVRZX05BTUVfVEVTVF9WQUxVRSwgCi0JCQlDQUNIRV9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCVNIQVJFRF9DQUNIRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRV9ERUZBVUxULCAKLQkJCUNBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsIAotCQkJU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY2FjaGluZzsKLQl9Ci0KLQkvKiogKioqKioqIENhY2hlVHlwZSAqKioqKioqICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxDYWNoZVR5cGU+IGJ1aWxkQ2FjaGVUeXBlQUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPihzdWJqZWN0SG9sZGVyLCBDYWNoaW5nLkNBQ0hFX1RZUEVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIENhY2hlVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldENhY2hlVHlwZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhDYWNoZVR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlVHlwZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkQ2FjaGVUeXBlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuY2FjaGVUeXBlRXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgKioqKioqKiAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRTaGFyZWRDYWNoZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuU0hBUkVEX0NBQ0hFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVPZihFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFNoYXJlZENhY2hlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hlVHlwZT4gYnVpbGRDYWNoZVR5cGVEZWZhdWx0QUEoUHJvcGVydHlWYWx1ZU1vZGVsPENhY2hpbmc+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q2FjaGluZywgQ2FjaGVUeXBlPihzdWJqZWN0SG9sZGVyLCBDYWNoaW5nLkNBQ0hFX1RZUEVfREVGQVVMVF9QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQ2FjaGVUeXBlIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0Q2FjaGVUeXBlRGVmYXVsdCgpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhDYWNoZVR5cGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldENhY2hlVHlwZURlZmF1bHQoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRDYWNoZVR5cGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIFNoYXJlZENhY2hlRGVmYXVsdCAqKioqKioqICovCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFNoYXJlZENhY2hlRGVmYXVsdEFBKFByb3BlcnR5VmFsdWVNb2RlbDxDYWNoaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPENhY2hpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIENhY2hpbmcuU0hBUkVEX0NBQ0hFX0RFRkFVTFRfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIEJvb2xlYW4gYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRTaGFyZWRDYWNoZURlZmF1bHQoKTsKLQkJCX0KLQotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBzZXRWYWx1ZV8oQm9vbGVhbiBlbnVtVmFsdWUpIHsKLQkJCQl0aGlzLnN1YmplY3Quc2V0U2hhcmVkQ2FjaGVEZWZhdWx0KGVudW1WYWx1ZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGJ1aWxkU2hhcmVkQ2FjaGVEZWZhdWx0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlDYWNoaW5nVmFsdWVNb2RlbFRlc3RzLnRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQgPSBlOwotCQkJfQotCQl9OwotCX0KLQotCS8qKiAqKioqKiogQmFzaWMgRW50aXR5J3MgUHJvcGVydGllcyBUZXN0cyAqKioqKioqICovCi0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0JCUNhY2hpbmdFbnRpdHkgZW50aXR5ID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eSIsIENhY2hlVHlwZS5mdWxsLCAxMDAsIHRydWUpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUoZW50aXR5LCBlbnRpdHkuY2xvbmUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUNhY2hpbmdFbnRpdHkgZW50aXR5MSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlBIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7Ci0JCUNhY2hpbmdFbnRpdHkgZW50aXR5MiA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlCIiwgQ2FjaGVUeXBlLmZ1bGwsIDEwMCwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscyhlbnRpdHkxLCBlbnRpdHkyKTsKLQkJQ2FjaGluZ0VudGl0eSBlbnRpdHkzID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eUMiLCBDYWNoZVR5cGUuZnVsbCwgMTAwLCB0cnVlKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTEsIGVudGl0eTMpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5MiwgZW50aXR5Myk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlDYWNoaW5nRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuaXNFbXB0eSgpKTsKLQkJdGhpcy5jYWNoaW5nLnNldENhY2hlU2l6ZU9mKGVudGl0eS5nZXROYW1lKCksIDEwMCk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eS5pc0VtcHR5KCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2ZXJpZnlDbG9uZShDYWNoaW5nRW50aXR5IG9yaWdpbmFsLCBDYWNoaW5nRW50aXR5IGNsb25lKSB7Ci0JCWFzc2VydE5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBvcmlnaW5hbCk7Ci0JCWFzc2VydEVxdWFscyhvcmlnaW5hbCwgY2xvbmUpOwotCX0KLQotCXByaXZhdGUgQ2FjaGluZ0VudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gdGhpcy5jYWNoaW5nLmFkZEVudGl0eShuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIENhY2hpbmdFbnRpdHkgYnVpbGRFbnRpdHkoU3RyaW5nIG5hbWUsIENhY2hlVHlwZSBjYWNoZVR5cGUsIEludGVnZXIgc2l6ZSwgQm9vbGVhbiBpc1NoYXJlZCkgewotCQlDYWNoaW5nRW50aXR5IGVudGl0eSA9IHRoaXMuY2FjaGluZy5hZGRFbnRpdHkobmFtZSk7Ci0JCXRoaXMuY2FjaGluZy5zZXRDYWNoZVR5cGVPZihlbnRpdHkuZ2V0TmFtZSgpLCBjYWNoZVR5cGUpOwotCQl0aGlzLmNhY2hpbmcuc2V0Q2FjaGVTaXplT2YoZW50aXR5LmdldE5hbWUoKSwgc2l6ZSk7Ci0JCXRoaXMuY2FjaGluZy5zZXRTaGFyZWRDYWNoZU9mKGVudGl0eS5nZXROYW1lKCksIGlzU2hhcmVkKTsKLQkJcmV0dXJuIGVudGl0eTsKLQl9Ci0JCi0JLyoqICoqKioqKiBDYWNoaW5nIFRlc3RzICoqKioqKiogKi8KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlIC0gZGVmYXVsdHMgZm9yIGVudGl0eSBsZXZlbCBjYWNoaW5nIGFyZSBlcXVhbCB0byB0aGUgcGVyc2lzdGVuY2UgdW5pdCBzZXR0aW5ncyAqKioqKioqICovCi0JCXRoaXMudmVyaWZ5Q2FjaGVUeXBlQUFWYWx1ZShDQUNIRV9UWVBFX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZURlZmF1bHQoKSwgdGhpcy5jYWNoaW5nLmdldERlZmF1bHRDYWNoZVR5cGUoKSk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGUgLSBkZWZhdWx0cyBmb3IgZW50aXR5IGxldmVsIGNhY2hpbmcgYXJlIGVxdWFsIHRvIHRoZSBwZXJzaXN0ZW5jZSB1bml0IHNldHRpbmdzICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUoU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHModGhpcy5jYWNoaW5nLmdldFNoYXJlZENhY2hlRGVmYXVsdCgpLCB0aGlzLmNhY2hpbmcuZ2V0RGVmYXVsdFNoYXJlZENhY2hlKCkpOwotCQkvKiogKioqKioqIENhY2hlVHlwZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKENBQ0hFX1RZUEVfREVGQVVMVF9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hpbmcuREVGQVVMVF9DQUNIRV9UWVBFX0RFRkFVTFQsIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0Q2FjaGVUeXBlRGVmYXVsdCgpKTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZURlZmF1bHQgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlRGVmYXVsdEFBVmFsdWUoU0hBUkVEX0NBQ0hFX0RFRkFVTFRfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoaW5nLkRFRkFVTFRfU0hBUkVEX0NBQ0hFX0RFRkFVTFQsIHRoaXMuY2FjaGluZy5nZXREZWZhdWx0U2hhcmVkQ2FjaGVEZWZhdWx0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvKiogKioqKioqIENhY2hlVHlwZSAqKioqKioqICovCi0JCXRoaXMuY2FjaGVUeXBlRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNhY2hlVHlwZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQ2FjaGVUeXBlIG5ld0NhY2hlVHlwZSA9IENhY2hlVHlwZS5mdWxsOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmNhY2hlVHlwZUhvbGRlci5zZXRWYWx1ZShuZXdDYWNoZVR5cGUpOwotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZUFBVmFsdWUobmV3Q2FjaGVUeXBlKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZUV2ZW50KTsKLQkJLyoqICoqKioqKiBTaGFyZWRDYWNoZSAqKioqKioqICovCi0JCXRoaXMuc2hhcmVkQ2FjaGVFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3U2hhcmVkQ2FjaGUgPSAhU0hBUkVEX0NBQ0hFX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIuc2V0VmFsdWUobmV3U2hhcmVkQ2FjaGUpOwotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlQUFWYWx1ZShuZXdTaGFyZWRDYWNoZSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5zaGFyZWRDYWNoZUV2ZW50KTsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUNhY2hlVHlwZSBuZXdDYWNoZVR5cGVEZWZhdWx0ID0gQ2FjaGVUeXBlLm5vbmU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuY2FjaGVUeXBlRGVmYXVsdEhvbGRlci5zZXRWYWx1ZShuZXdDYWNoZVR5cGVEZWZhdWx0KTsKLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVEZWZhdWx0QUFWYWx1ZShuZXdDYWNoZVR5cGVEZWZhdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmNhY2hlVHlwZURlZmF1bHRFdmVudCk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0SG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld1NoYXJlZENhY2hlRGVmYXVsdCA9ICFTSEFSRURfQ0FDSEVfREVGQVVMVF9URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlci5zZXRWYWx1ZShuZXdTaGFyZWRDYWNoZURlZmF1bHQpOwotCQl0aGlzLnZlcmlmeVNoYXJlZENhY2hlRGVmYXVsdEFBVmFsdWUobmV3U2hhcmVkQ2FjaGVEZWZhdWx0KTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8qKiAqKioqKiogQ2FjaGVUeXBlICoqKioqKiogKi8KLQkJdGhpcy5jYWNoZVR5cGVFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmNhY2hlVHlwZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlDYWNoZVR5cGVBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuY2FjaGVUeXBlRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUsIG5vdERlbGV0ZWQpOwotCQkvKiogKioqKioqIFNoYXJlZENhY2hlICoqKioqKiogKi8KLQkJdGhpcy5zaGFyZWRDYWNoZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5U2hhcmVkQ2FjaGVBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc2hhcmVkQ2FjaGVFdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoQ2FjaGluZy5FQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFLCBub3REZWxldGVkKTsKLQkJLyoqICoqKioqKiBDYWNoZVR5cGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0RXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5jYWNoZVR5cGVEZWZhdWx0SG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeUNhY2hlVHlwZURlZmF1bHRBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuY2FjaGVUeXBlRGVmYXVsdEV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDYWNoaW5nLkVDTElQU0VMSU5LX0NBQ0hFX1RZUEVfREVGQVVMVCwgbm90RGVsZXRlZCk7Ci0JCS8qKiAqKioqKiogU2hhcmVkQ2FjaGVEZWZhdWx0ICoqKioqKiogKi8KLQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLnNoYXJlZENhY2hlRGVmYXVsdEhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuc2hhcmVkQ2FjaGVEZWZhdWx0RXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KENhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfU0hBUkVEX0RFRkFVTFQsIG5vdERlbGV0ZWQpOwotCX0KLQotCS8qKiAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqICovCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUNhY2hlVHlwZUFBVmFsdWUoQ2FjaGVUeXBlIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpLCAKLQkJCXRoaXMuY2FjaGVUeXBlSG9sZGVyLCAKLQkJCUNhY2hpbmcuRUNMSVBTRUxJTktfQ0FDSEVfVFlQRSArIEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTaGFyZWRDYWNoZUFBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMuY2FjaGluZy5nZXRTaGFyZWRDYWNoZU9mKEVOVElUWV9OQU1FX1RFU1RfVkFMVUUpLCAKLQkJCXRoaXMuc2hhcmVkQ2FjaGVIb2xkZXIsIAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19TSEFSRURfQ0FDSEUgKyBFTlRJVFlfTkFNRV9URVNUX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5Q2FjaGVUeXBlRGVmYXVsdEFBVmFsdWUoQ2FjaGVUeXBlIHRlc3RWYWx1ZSkgewotCQl0aGlzLnZlcmlmeUFBVmFsdWUoCi0JCQl0ZXN0VmFsdWUsIAotCQkJdGhpcy5jYWNoaW5nLmdldENhY2hlVHlwZURlZmF1bHQoKSwgCi0JCQl0aGlzLmNhY2hlVHlwZURlZmF1bHRIb2xkZXIsIAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9UWVBFX0RFRkFVTFQpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTaGFyZWRDYWNoZURlZmF1bHRBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmNhY2hpbmcuZ2V0U2hhcmVkQ2FjaGVEZWZhdWx0KCksIAotCQkJdGhpcy5zaGFyZWRDYWNoZURlZmF1bHRIb2xkZXIsIAotCQkJQ2FjaGluZy5FQ0xJUFNFTElOS19DQUNIRV9TSEFSRURfREVGQVVMVCk7Ci0JfQotCi0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjlmZWZlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0N1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ3VzdG9taXphdGlvbkVudGl0eTsKLQotLyoqCi0gKiBDdXN0b21pemF0aW9uVmFsdWVNb2RlbFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDdXN0b21pemF0aW9uIGN1c3RvbWl6YXRpb247Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRocm93RXhjZXB0aW9uc0hvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGhyb3dFeGNlcHRpb25zTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHRocm93RXhjZXB0aW9uc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUVfVEVTVF9WQUxVRSA9ICJFbXBsb3llZSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFID0gImFjbWUuc2Vzc2lvbnMuQ3VzdG9taXplciI7Ci0KLQlwdWJsaWMgQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24gPSB0aGlzLnN1YmplY3QuZ2V0Q3VzdG9taXphdGlvbigpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPiBjdXN0b21pemF0aW9uSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxDdXN0b21pemF0aW9uPih0aGlzLmN1c3RvbWl6YXRpb24pOwotCQkKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIgPSB0aGlzLmJ1aWxkVGhyb3dFeGNlcHRpb25zQUEoY3VzdG9taXphdGlvbkhvbGRlcik7Ci0JCXRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVGhyb3dFeGNlcHRpb25zQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMudGhyb3dFeGNlcHRpb25zTGlzdGVuZXIpOwotCQl0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RDdXN0b21pemF0aW9uID0gKEFic3RyYWN0TW9kZWwpIHRoaXMuY3VzdG9taXphdGlvbjsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+IHRocm93RXhjZXB0aW9uc0FBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPEN1c3RvbWl6YXRpb24sIEJvb2xlYW4+KSB0aGlzLnRocm93RXhjZXB0aW9uc0hvbGRlcjsKLQkJYXNzZXJ0VHJ1ZSh0aHJvd0V4Y2VwdGlvbnNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0Q3VzdG9taXphdGlvbi5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKTsKLQkJCi0JCXRocm93RXhjZXB0aW9uc0FBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLnRocm93RXhjZXB0aW9uc0xpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdEN1c3RvbWl6YXRpb24uaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRocm93RXhjZXB0aW9uc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TLCAKLQkJCVRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuY3VzdG9taXphdGlvbjsKLQl9Ci0KLQkvLyAqKioqKiogVGhyb3dFeGNlcHRpb25zICoqKioqKioKLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGJ1aWxkVGhyb3dFeGNlcHRpb25zQUEoUHJvcGVydHlWYWx1ZU1vZGVsPEN1c3RvbWl6YXRpb24+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8Q3VzdG9taXphdGlvbiwgQm9vbGVhbj4oc3ViamVjdEhvbGRlciwgQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRocm93RXhjZXB0aW9ucyhlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRocm93RXhjZXB0aW9uc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJQ3VzdG9taXphdGlvblZhbHVlTW9kZWxUZXN0cy50aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKiogKioqKioqIEJhc2ljIEVudGl0eSdzIFByb3BlcnRpZXMgVGVzdHMgKioqKioqKiAqLwotCi0JcHVibGljIHZvaWQgdGVzdENsb25lKCkgewotCQlDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCi0JCXRoaXMudmVyaWZ5Q2xvbmUoZW50aXR5LCBlbnRpdHkuY2xvbmUoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0JCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5MSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlBIiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHkyID0gdGhpcy5idWlsZEVudGl0eSgiVGVzdEVudGl0eUIiLCBDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5MSwgZW50aXR5Mik7Ci0JCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5MyA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHlDIiwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKGVudGl0eTEsIGVudGl0eTMpOwotCQlhc3NlcnRFcXVhbHMoZW50aXR5MiwgZW50aXR5Myk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RJc0VtcHR5KCkgewotCQlDdXN0b21pemF0aW9uRW50aXR5IGVudGl0eSA9IHRoaXMuYnVpbGRFbnRpdHkoIlRlc3RFbnRpdHkiKTsKLQkJYXNzZXJ0VHJ1ZShlbnRpdHkuaXNFbXB0eSgpKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5LmdldE5hbWUoKSwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RmFsc2UoZW50aXR5LmlzRW1wdHkoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeUNsb25lKEN1c3RvbWl6YXRpb25FbnRpdHkgb3JpZ2luYWwsIEN1c3RvbWl6YXRpb25FbnRpdHkgY2xvbmUpIHsKLQkJYXNzZXJ0Tm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotCQlhc3NlcnRFcXVhbHMob3JpZ2luYWwsIG9yaWdpbmFsKTsKLQkJYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBjbG9uZSk7Ci0JfQotCi0JcHJpdmF0ZSBDdXN0b21pemF0aW9uRW50aXR5IGJ1aWxkRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb24uYWRkRW50aXR5KG5hbWUpOwotCX0KLQotCXByaXZhdGUgQ3VzdG9taXphdGlvbkVudGl0eSBidWlsZEVudGl0eShTdHJpbmcgbmFtZSwgU3RyaW5nIGFDbGFzc05hbWUpIHsKLQkJQ3VzdG9taXphdGlvbkVudGl0eSBlbnRpdHkgPSB0aGlzLmN1c3RvbWl6YXRpb24uYWRkRW50aXR5KG5hbWUpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHkuZ2V0TmFtZSgpLCBhQ2xhc3NOYW1lKTsKLQkJcmV0dXJuIGVudGl0eTsKLQl9Ci0KLQkvLyAqKioqKiogVGVzdHMgKioqKioqKiAKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKiAKLQkJdGhpcy52ZXJpZnlUaHJvd0V4Y2VwdGlvbnNBQVZhbHVlKFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRSk7Ci0JCWFzc2VydEVxdWFscyhDdXN0b21pemF0aW9uLkRFRkFVTFRfVEhST1dfRVhDRVBUSU9OUywgdGhpcy5jdXN0b21pemF0aW9uLmdldERlZmF1bHRUaHJvd0V4Y2VwdGlvbnMoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vICoqKioqKiBUaHJvd0V4Y2VwdGlvbnMgKioqKioqKiAKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld1Rocm93RXhjZXB0aW9ucyA9ICFUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zSG9sZGVyLnNldFZhbHVlKG5ld1Rocm93RXhjZXB0aW9ucyk7Ci0JCXRoaXMudmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShuZXdUaHJvd0V4Y2VwdGlvbnMpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIFRocm93RXhjZXB0aW9ucyAqKioqKioqCi0JCXRoaXMudGhyb3dFeGNlcHRpb25zRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5VGhyb3dFeGNlcHRpb25zQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRocm93RXhjZXB0aW9uc0V2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1RIUk9XX0VYQ0VQVElPTlMsIG5vdERlbGV0ZWQpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlUaHJvd0V4Y2VwdGlvbnNBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VGhyb3dFeGNlcHRpb25zKCksIAotCQkJdGhpcy50aHJvd0V4Y2VwdGlvbnNIb2xkZXIsIAotCQkJQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19USFJPV19FWENFUFRJT05TKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wQ29ubmVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOWRlYTYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5qcGEyLmNvbnRleHQucGVyc2lzdGVuY2UuY29ubmVjdGlvbi5KcGFDb25uZWN0aW9uMl8wOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjJfMDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBDb25uZWN0aW9uMl8wIGNvbm5lY3Rpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfU1FMX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfTkFUSVZFX1NRTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5BVElWRV9TUUxfVEVTVF9WQUxVRV8yID0gISBOQVRJVkVfU1FMX1RFU1RfVkFMVUU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0tFWSA9IEpwYUNvbm5lY3Rpb24yXzAuUEVSU0lTVEVOQ0VfSkRCQ19EUklWRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX1RFU1RfVkFMVUUgPSAiY29ubmVjdGlvbi5kcml2ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFXzIgPSAiY29ubmVjdGlvbi5kcml2ZXIuMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX0RSSVZFUl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0RSSVZFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfRFJJVkVSX1RFU1RfVkFMVUUgPSAibGVnYWN5LmNvbm5lY3Rpb24uZHJpdmVyIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VSTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1VSTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VSTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfVVJMX1RFU1RfVkFMVUUgPSAibGVnYWN5LmNvbm5lY3Rpb24udXJsIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfS0VZID0gSnBhQ29ubmVjdGlvbjJfMC5QRVJTSVNURU5DRV9KREJDX1VTRVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFID0gInRlc3QiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHQUNZX1VTRVJfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19VU0VSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9VU0VSX1RFU1RfVkFMVUUgPSAibGVnYWN5LmNvbm5lY3Rpb24udXNlciI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9LRVkgPSBKcGFDb25uZWN0aW9uMl8wLlBFUlNJU1RFTkNFX0pEQkNfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfUEFTU1dPUkRfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19QQVNTV09SRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRUdBQ1lfUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJsZWdhY3kuY29ubmVjdGlvbi5wYXNzd29yZCI7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzBDb25uZWN0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5jb25uZWN0aW9uID0gKENvbm5lY3Rpb24yXzApIHRoaXMuc3ViamVjdC5nZXRDb25uZWN0aW9uKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDg7IC8vIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDE7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJLy8gSW5pdGlhbGl6ZXMgRWNsaXBzZUxpbmsgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KExFR0FDWV9EUklWRVJfS0VZLCBMRUdBQ1lfRFJJVkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRFJJVkVSX0tFWSwgRFJJVkVSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVHQUNZX1VSTF9LRVksIExFR0FDWV9VUkxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVUkxfS0VZLCBVUkxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMRUdBQ1lfVVNFUl9LRVksIExFR0FDWV9VU0VSX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVVNFUl9LRVksIFVTRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMRUdBQ1lfUEFTU1dPUkRfS0VZLCBMRUdBQ1lfUEFTU1dPUkRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQQVNTV09SRF9LRVksIFBBU1NXT1JEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCQotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXJsKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0VXNlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUEFTU1dPUkRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRQYXNzd29yZCgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldERyaXZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFVybCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVc2VyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRQYXNzd29yZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQotCS8vICoqKioqKioqKiogUHJvcGVydGllcyBOYW1lIE1pZ3JhdGlvbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdERyaXZlclByb3BlcnR5TmFtZU1pZ3JhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCi0JCS8vIFZlcmlmeSBsZWdhY3kgZHJpdmVyIGV4aXN0cwotCQlhc3NlcnRUcnVlKCJMZWdhY3kgZHJpdmVyIG5vdCBleGlzdHMiLCB0aGlzLnByb3BlcnR5VmFsdWVFcXVhbHMoTEVHQUNZX0RSSVZFUl9LRVksIExFR0FDWV9EUklWRVJfVEVTVF9WQUxVRSkpOwotCQkKLQkJLy8gVmVyaWZ5IGRyaXZlciByZWFkIGluCi0JCWFzc2VydEVxdWFscygiSW5jb3JyZWN0IGRyaXZlciByZWFkIiwgdGhpcy5jb25uZWN0aW9uLmdldERyaXZlcigpLCBEUklWRVJfVEVTVF9WQUxVRSk7Ci0KLQkJLy8gQ2hhbmdlIGRyaXZlciB2YWx1ZQotCQl0aGlzLmNvbm5lY3Rpb24uc2V0RHJpdmVyKERSSVZFUl9URVNUX1ZBTFVFXzIpOwotCQkvLyBWZXJpZnkgZHJpdmVyIHZhbHVlIGNoYW5nZWQKLQkJYXNzZXJ0RXF1YWxzKCJEcml2ZXIgbm90IHNldCIsIHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKSwgRFJJVkVSX1RFU1RfVkFMVUVfMik7Ci0JCWFzc2VydFRydWUoIlBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSBub3Qgc2V0IiwgdGhpcy5wcm9wZXJ0eVZhbHVlRXF1YWxzKERSSVZFUl9LRVksIERSSVZFUl9URVNUX1ZBTFVFXzIpKTsKLQkJCi0JCS8vIFZlcmlmeSBsZWdhY3kgZW50cnkgaGFzIGJlZW4gZGVsZXRlZAotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX0RSSVZFUl9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNOYW1lc01pZ3JhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBjb25uZWN0aW9uLmluaXRpYWxpemVQcm9wZXJ0aWVzKCkgb2NjdXJyZWQgYmVmb3JlIHRlc3QucHVQb3B1bGF0ZSgpIHRoZXJlZm9yZQotCQkvLyB3ZSBjYW5ub3QgdGVzdCB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgbGVnYWN5IHByb3BlcnRpZXMgb25seSBleGlzdCBpbiB0aGUgeG1sCi0JCS8vIFZlcmlmeSB0aGF0IFVzZXIgJiBQYXNzd29yZCBleGlzdCBpbiBib3RoIGZvcm1zCi0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShVU0VSX0tFWSwgICJQcm9wZXJ0eSBub3QgZXhpc3RzIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShQQVNTV09SRF9LRVksICAiUHJvcGVydHkgbm90IGV4aXN0cyIpOwotCQl0aGlzLnZlcmlmeVB1SGFzUHJvcGVydHkoTEVHQUNZX1VTRVJfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBub3QgZXhpc3RzIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShMRUdBQ1lfUEFTU1dPUkRfS0VZLCAgIkxlZ2FjeSBwcm9wZXJ0eSBub3QgZXhpc3RzIik7Ci0JCQotCQkvLyBDaGFuZ2UgYSBwcm9wZXJ0eSB2YWx1ZSB0byB0cmlnZ2VyIG1pZ3JhdGlvbiByb3V0aW5lCi0JCXRoaXMuY29ubmVjdGlvbi5zZXROYXRpdmVTcWwoTkFUSVZFX1NRTF9URVNUX1ZBTFVFKTsKLQkJCi0JCS8vIFZlcmlmeSB0aGF0IGFsbCBsZWdhY3kgZW50cnkgaGFzIGJlZW4gZGVsZXRlZAotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoTEVHQUNZX0RSSVZFUl9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMRUdBQ1lfVVJMX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgaGFzIG5vdCBiZWVuIGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9VU0VSX0tFWSwgICJMZWdhY3kgcHJvcGVydHkgaGFzIG5vdCBiZWVuIGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdUhhc05vdFByb3BlcnR5KExFR0FDWV9QQVNTV09SRF9LRVksICAiTGVnYWN5IHByb3BlcnR5IGhhcyBub3QgYmVlbiBkZWxldGVkIik7Ci0JfQotCi0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wTG9nZ2luZ1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YTU5ZGQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBMb2dnaW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmcyXzA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZ0xldmVsOwotCi0vKioKLSAqICBFY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIExvZ2dpbmcyXzAgbG9nZ2luZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNRTF9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfU1FMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgU1FMX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5vZmY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgU1FMX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLnNldmVyZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TQUNUSU9OX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC53YXJuaW5nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmluZm87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfRVZFTlRfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuY29uZmlnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIEVWRU5UX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmZpbmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuZmluZXI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfUVVFUllfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuYWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFFVRVJZX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLm9mZjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19DQUNIRV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIENBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5zZXZlcmU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwud2FybmluZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BBR0FUSU9OX0xPR0dJTkdfS0VZID0gTG9nZ2luZzJfMC5FQ0xJUFNFTElOS19QUk9QQUdBVElPTl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5pbmZvOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmNvbmZpZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUVVFTkNJTkdfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1NFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5maW5lOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuZmluZXI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX0VKQl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIEVKQl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuZmluZXN0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIEVKQl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5hbGw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETVNfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX0RNU19DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIERNU19MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwub2ZmOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIERNU19MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5zZXZlcmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX0VKQl9PUl9NRVRBREFUQV9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIEVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwud2FybmluZzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFXzIgPSBMb2dnaW5nTGV2ZWwuaW5mbzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFNT0RFTF9MT0dHSU5HX0tFWSA9IExvZ2dpbmcyXzAuRUNMSVBTRUxJTktfTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5jb25maWc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmZpbmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWRVJfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1dFQVZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuZmluZXI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRV8yID0gTG9nZ2luZ0xldmVsLmZpbmVzdDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1BST1BFUlRJRVNfQ0FURUdPUllfTE9HR0lOR19MRVZFTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dpbmdMZXZlbCBQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5hbGw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5vZmY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfTE9HR0lOR19LRVkgPSBMb2dnaW5nMl8wLkVDTElQU0VMSU5LX1NFUlZFUl9DQVRFR09SWV9MT0dHSU5HX0xFVkVMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUUgPSBMb2dnaW5nTGV2ZWwuc2V2ZXJlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIFNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC53YXJuaW5nOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmxvZ2dpbmcgPSAoTG9nZ2luZzJfMCkgdGhpcy5zdWJqZWN0LmdldExvZ2dpbmcoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLlNRTF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5UUkFOU0FDVElPTl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5FVkVOVF9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5DT05ORUNUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLlFVRVJZX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLkNBQ0hFX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLlBST1BBR0FUSU9OX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLlNFUVVFTkNJTkdfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuRUpCX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLkRNU19DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5FSkJfT1JfTUVUQURBVEFfQ0FURUdPUllfTE9HR0lOR19QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcyXzAuTUVUQU1PREVMX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLldFQVZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZzJfMC5QUk9QRVJUSUVTX0NBVEVHT1JZX0xPR0dJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nMl8wLlNFUlZFUl9DQVRFR09SWV9MT0dHSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMgYmVmb3JlIHRlc3RpbmcuCi0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgPSAxNTsgLy8gUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDE7IC8vIDEgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJLy8gSW5pdGlhbGl6ZXMgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTUUxfTE9HR0lOR19LRVksIFNRTF9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRSQU5TQUNUSU9OX0xPR0dJTkdfS0VZLCBUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVWRU5UX0xPR0dJTkdfS0VZLCBFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KENPTk5FQ1RJT05fTE9HR0lOR19LRVksIENPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShRVUVSWV9MT0dHSU5HX0tFWSwgUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9MT0dHSU5HX0tFWSwgQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQUk9QQUdBVElPTl9MT0dHSU5HX0tFWSwgUFJPUEFHQVRJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVFVRU5DSU5HX0xPR0dJTkdfS0VZLCBTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRUpCX0xPR0dJTkdfS0VZLCBFSkJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShETVNfTE9HR0lOR19LRVksIERNU19MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX0tFWSwgRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTUVUQU1PREVMX0xPR0dJTkdfS0VZLCBNRVRBTU9ERUxfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWRVJfTE9HR0lOR19LRVksIFdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFBST1BFUlRJRVNfTE9HR0lOR19LRVksIFBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVJWRVJfTE9HR0lOR19LRVksIFNFUlZFUl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCi0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dpbmc7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQkKLQkJcmV0dXJuIHRoaXMubG9nZ2luZy5nZXRMZXZlbChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5sb2dnaW5nLnNldExldmVsKHByb3BlcnR5TmFtZSwgKExvZ2dpbmdMZXZlbCkgbmV3VmFsdWUpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFNxbCBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNxbExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTUUxfTE9HR0lOR19LRVksCi0JCQlTUUxfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNRTF9MT0dHSU5HX0tFWSwKLQkJCVNRTF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlTUUxfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVTcWxMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNRTF9MT0dHSU5HX0tFWSwKLQkJCVNRTF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlTUUxfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFRyYW5zYWN0aW9uIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VHJhbnNhY3Rpb25Mb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19LRVksCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVFJBTlNBQ1RJT05fTE9HR0lOR19LRVksCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRyYW5zYWN0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlUUkFOU0FDVElPTl9MT0dHSU5HX0tFWSwKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVRSQU5TQUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBFdmVudCBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV2ZW50TG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVWRU5UX0xPR0dJTkdfS0VZLAotCQkJRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVWRU5UX0xPR0dJTkdfS0VZLAotCQkJRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRVZFTlRfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFdmVudExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRVZFTlRfTE9HR0lOR19LRVksCi0JCQlFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlFVkVOVF9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogQ29ubmVjdGlvbiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldENvbm5lY3Rpb25Mb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX0tFWSwKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19LRVksCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUNPTk5FQ1RJT05fTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDb25uZWN0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfS0VZLAotCQkJQ09OTkVDVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlDT05ORUNUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBRdWVyeSBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFF1ZXJ5TG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVFVRVJZX0xPR0dJTkdfS0VZLAotCQkJUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVFVRVJZX0xPR0dJTkdfS0VZLAotCQkJUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJUVVFUllfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVRdWVyeUxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUVVFUllfTE9HR0lOR19LRVksCi0JCQlRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlRVUVSWV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogQ2FjaGUgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRDYWNoZUxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9MT0dHSU5HX0tFWSwKLQkJCUNBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlDQUNIRV9MT0dHSU5HX0tFWSwKLQkJCUNBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX0xPR0dJTkdfS0VZLAotCQkJQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJQ0FDSEVfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFByb3BhZ2F0aW9uIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvcGFnYXRpb25Mb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19LRVksCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUFJPUEFHQVRJT05fTE9HR0lOR19LRVksCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVByb3BhZ2F0aW9uTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlQUk9QQUdBVElPTl9MT0dHSU5HX0tFWSwKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVBST1BBR0FUSU9OX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTZXF1ZW5jaW5nIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2VxdWVuY2luZ0xvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfS0VZLAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX0tFWSwKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU0VRVUVOQ0lOR19MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlcXVlbmNpbmdMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19LRVksCi0JCQlTRVFVRU5DSU5HX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVNFUVVFTkNJTkdfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIEVKQiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEVKQkxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFSkJfTE9HR0lOR19LRVksCi0JCQlFSkJfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVKQl9MT0dHSU5HX0tFWSwKLQkJCUVKQl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlFSkJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFSkJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUVKQl9MT0dHSU5HX0tFWSwKLQkJCUVKQl9MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlFSkJfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIERNUyBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldERNU0xvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlETVNfTE9HR0lOR19LRVksCi0JCQlETVNfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCURNU19MT0dHSU5HX0tFWSwKLQkJCURNU19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlETVNfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVETVNMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCURNU19MT0dHSU5HX0tFWSwKLQkJCURNU19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlETVNfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIEVKQiBvciBNZXRhZGF0YSBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEVKQk9yTWV0YWRhdGFMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfS0VZLAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19LRVksCi0JCQlFSkJfT1JfTUVUQURBVEFfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRUpCT3JNZXRhZGF0YUxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfS0VZLAotCQkJRUpCX09SX01FVEFEQVRBX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCUVKQl9PUl9NRVRBREFUQV9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogTWV0YW1vZGVsIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0YW1vZGVsTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX0tFWSwKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTUVUQU1PREVMX0xPR0dJTkdfS0VZLAotCQkJTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZU1ldGFtb2RlbExvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJTUVUQU1PREVMX0xPR0dJTkdfS0VZLAotCQkJTUVUQU1PREVMX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCU1FVEFNT0RFTF9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogV2VhdmVyIExldmVsIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V2VhdmVyTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZFUl9MT0dHSU5HX0tFWSwKLQkJCVdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVkVSX0xPR0dJTkdfS0VZLAotCQkJV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZlckxvZ2dpbmdMZXZlbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVkVSX0xPR0dJTkdfS0VZLAotCQkJV0VBVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZFUl9MT0dHSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogUHJvcGVydGllcyBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnRpZXNMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUFJPUEVSVElFU19MT0dHSU5HX0tFWSwKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19LRVksCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRSwKLQkJCVBST1BFUlRJRVNfTE9HR0lOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQcm9wZXJ0aWVzTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfS0VZLAotCQkJUFJPUEVSVElFU19MT0dHSU5HX1RFU1RfVkFMVUUsCi0JCQlQUk9QRVJUSUVTX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBTZXJ2ZXIgTGV2ZWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXJ2ZXJMb2dnaW5nTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VSVkVSX0xPR0dJTkdfS0VZLAotCQkJU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTRVJWRVJfTE9HR0lOR19LRVksCi0JCQlTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2VydmVyTG9nZ2luZ0xldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVJWRVJfTE9HR0lOR19LRVksCi0JCQlTRVJWRVJfTE9HR0lOR19URVNUX1ZBTFVFLAotCQkJU0VSVkVSX0xPR0dJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNzI0YWUuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczJfMDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmtPcHRpb25zMl8wVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBPcHRpb25zMl8wIG9wdGlvbnM7Ci0JcHJpdmF0ZSBMaXN0Q2hhbmdlRXZlbnQgcHJlUGVyc2lzdEV2ZW50OwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IHByZVVwZGF0ZUV2ZW50OwotCXByaXZhdGUgTGlzdENoYW5nZUV2ZW50IHByZVJlbW92ZUV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DS19USU1FT1VUX0tFWSA9IE9wdGlvbnMyXzAuUEVSU0lTVEVOQ0VfTE9DS19USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgTE9DS19USU1FT1VUX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1RJTUVPVVRfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9RVUVSWV9USU1FT1VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBRVUVSWV9USU1FT1VUX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRV8yID0gMjAwOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZID0gT3B0aW9uczJfMC5QRVJTSVNURU5DRV9WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS1wZXJzaXN0X2dyb3VwIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1RFU1RfVkFMVUVfMiA9ICJ0ZXN0XzJfcHJlLXBlcnNpc3RfZ3JvdXAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS11cGRhdGVfZ3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS11cGRhdGVfZ3JvdXAiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVkgPSBPcHRpb25zMl8wLlBFUlNJU1RFTkNFX1ZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSA9ICJ0ZXN0X3ByZS1yZW1vdmVfZ3JvdXAiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIgPSAidGVzdF8yX3ByZS1yZW1vdmVfZ3JvdXAiOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSAoT3B0aW9uczJfMCkgdGhpcy5zdWJqZWN0LmdldE9wdGlvbnMoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLkxPQ0tfVElNRU9VVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCi0JCUxpc3RDaGFuZ2VMaXN0ZW5lciB2YWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkVmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMub3B0aW9ucy5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QsIHZhbGlkYXRpb25Hcm91cExpc3RDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCwgdmFsaWRhdGlvbkdyb3VwTGlzdENoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9MSVNULCB2YWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgZGlyZWN0bHkgdGhlIFBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNTsgLy8gUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDE7IC8vIDEgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJLy8gSW5pdGlhbGl6ZXMgUGVyc2lzdGVuY2VVbml0IHByb3BlcnRpZXMKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMT0NLX1RJTUVPVVRfS0VZLCBMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShRVUVSWV9USU1FT1VUX0tFWSwgUVVFUllfVElNRU9VVF9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9LRVksIFZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwgVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksIFZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMub3B0aW9uczsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRMb2NrVGltZW91dCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuUVVFUllfVElNRU9VVF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFF1ZXJ5VGltZW91dCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RzKCkuaXRlcmF0b3IoKTsKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmdldEZpcnN0RWxlbWVudChpdGVyYXRvcik7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXMoKS5pdGVyYXRvcigpOwotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuZ2V0Rmlyc3RFbGVtZW50KGl0ZXJhdG9yKTsKLQkJfQotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkgewotCQkJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSB0aGlzLm9wdGlvbnMuZ2V0VmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlcygpLml0ZXJhdG9yKCk7Ci0JCQltb2RlbFZhbHVlID0gdGhpcy5nZXRGaXJzdEVsZW1lbnQoaXRlcmF0b3IpOwotCQl9Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5MT0NLX1RJTUVPVVRfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldExvY2tUaW1lb3V0KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5RVUVSWV9USU1FT1VUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRRdWVyeVRpbWVvdXQoKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLmFkZFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMb2NrVGltZW91dCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExvY2tUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxPQ0tfVElNRU9VVF9LRVksCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlMT0NLX1RJTUVPVVRfS0VZLAotCQkJTE9DS19USU1FT1VUX1RFU1RfVkFMVUUsCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9ja1RpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUxPQ0tfVElNRU9VVF9LRVksCi0JCQlMT0NLX1RJTUVPVVRfVEVTVF9WQUxVRSwKLQkJCUxPQ0tfVElNRU9VVF9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFF1ZXJ5VGltZW91dCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFF1ZXJ5VGltZW91dCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlRVUVSWV9USU1FT1VUX0tFWSwKLQkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlRVUVSWV9USU1FT1VUX0tFWSwKLQkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSwKLQkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUXVlcnlUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlRVUVSWV9USU1FT1VUX0tFWSwKLQkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRSwKLQkJCVFVRVJZX1RJTUVPVVRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3QgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkQ29tcG9zaXRlVmFsdWUoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdENvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQ29tcG9zaXRlVmFsdWUoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGVDb21wb3NpdGVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZENvbXBvc2l0ZVZhbHVlKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlQ29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlSZW1vdmVDb21wb3NpdGVWYWx1ZSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByb3BlcnR5KAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfS0VZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkVmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlQ29tcG9zaXRlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRDb21wb3NpdGVWYWx1ZSgKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0tFWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZUNvbXBvc2l0ZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5UmVtb3ZlQ29tcG9zaXRlVmFsdWUoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9LRVksCi0JCQlWQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbkdyb3VwcyBsaXN0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkdyb3Vwc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlMaXN0RXZlbnRzKAotCQkJT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9URVNUX1ZBTFVFXzIsCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfTElTVCk7Ci0JCQotCQl0aGlzLnZlcmlmeUxpc3RFdmVudHMoCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSwKLQkJCVZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9URVNUX1ZBTFVFXzIsCi0JCQlPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9MSVNUKTsKLQkJCi0JCXRoaXMudmVyaWZ5TGlzdEV2ZW50cygKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZLAotCQkJVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1RFU1RfVkFMVUVfMiwKLQkJCU9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QpOwotCX0KLQotCS8vICoqKioqKioqKiogb3ZlcnJpZGUgKioqKioqKioqKgotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJFdmVudCgpIHsKLQkJc3VwZXIuY2xlYXJFdmVudCgpOwotCQl0aGlzLnByZVBlcnNpc3RFdmVudCA9IG51bGw7Ci0JCXRoaXMucHJlVXBkYXRlRXZlbnQgPSBudWxsOwotCQl0aGlzLnByZVJlbW92ZUV2ZW50ID0gbnVsbDsKLQl9Ci0KLQkvLyAqKioqKiogY29udmVuaWVuY2UgbWV0aG9kcyAqKioqKioqCi0KLQkvLyAqKioqKioqKioqIHZlcmlmeSBWYWxpZGF0aW9uR3JvdXAgcHJvcGVydHkgKioqKioqKioqKgotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTIsIHRydWUpOyAKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwrKzsKLQkJdGhpcy52ZXJpZnlQdXRWYWxpZGF0aW9uR3JvdXBQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZFJlbW92ZVZhbGlkYXRpb25Hcm91cFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIChTdHJpbmcpdGVzdFZhbHVlMSkpOwotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSwgKFN0cmluZyl0ZXN0VmFsdWUxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIChTdHJpbmcpdGVzdFZhbHVlMSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOwotCQkKLQkJLy8gQWRkIG9yaWdpbmFsIFByb3BlcnR5Ci0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMSwgdHJ1ZSk7IAotCQl0aGlzLnZlcmlmeVB1dFZhbGlkYXRpb25Hcm91cFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5QWRkQ29tcG9zaXRlVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHN0cmluZ1Rlc3RWYWx1ZTEgPSAoU3RyaW5nKXRlc3RWYWx1ZTE7Ci0JCVN0cmluZyBzdHJpbmdUZXN0VmFsdWUyID0gKFN0cmluZyl0ZXN0VmFsdWUyOwotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUxKSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMSk7Ci0JCXRoaXMuYWRkVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAyKTsKLQotCQlhc3NlcnRUcnVlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUxKSk7Ci0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpKTsKLQotCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoa2V5KS5nZXRWYWx1ZSgpOwotCQlhc3NlcnRUcnVlKHByb3BlcnR5VmFsdWUuaW5kZXhPZihzdHJpbmdUZXN0VmFsdWUxKSAhPSAtMSk7Ci0JCWFzc2VydFRydWUocHJvcGVydHlWYWx1ZS5pbmRleE9mKHN0cmluZ1Rlc3RWYWx1ZTIpICE9IC0xKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlSZW1vdmVDb21wb3NpdGVWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgc3RyaW5nVGVzdFZhbHVlMSA9IChTdHJpbmcpdGVzdFZhbHVlMTsKLQkJU3RyaW5nIHN0cmluZ1Rlc3RWYWx1ZTIgPSAoU3RyaW5nKXRlc3RWYWx1ZTI7Ci0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTEpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAxKTsKLQkJdGhpcy5hZGRWYWxpZGF0aW9uR3JvdXBWYWx1ZShwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpOwotCQlhc3NlcnRFcXVhbHModGhpcy5nZXRWYWxpZGF0aW9uR3JvdXBTaXplKHByb3BlcnR5TmFtZSksIDIpOwotCi0JCXRoaXMucmVtb3ZlVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUyKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMuZ2V0VmFsaWRhdGlvbkdyb3VwU2l6ZShwcm9wZXJ0eU5hbWUpLCAxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIHN0cmluZ1Rlc3RWYWx1ZTIpKTsKLQkJU3RyaW5nIHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGtleSkuZ2V0VmFsdWUoKTsKLQkJYXNzZXJ0VHJ1ZShwcm9wZXJ0eVZhbHVlLmluZGV4T2Yoc3RyaW5nVGVzdFZhbHVlMSkgIT0gLTEpOwotCQlhc3NlcnRUcnVlKHByb3BlcnR5VmFsdWUuaW5kZXhPZihzdHJpbmdUZXN0VmFsdWUyKSA9PSAtMSk7Ci0JCQotCQl0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMik7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMSk7Ci0JCQotCQl0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgc3RyaW5nVGVzdFZhbHVlMSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLmdldFZhbGlkYXRpb25Hcm91cFNpemUocHJvcGVydHlOYW1lKSwgMCk7Ci0JCWFzc2VydEZhbHNlKHRoaXMudmFsaWRhdGlvbkdyb3VwVmFsdWVFeGlzdHMocHJvcGVydHlOYW1lLCBzdHJpbmdUZXN0VmFsdWUxKSk7Ci0JCQotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoa2V5KSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5TGlzdEV2ZW50cyhTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdGVzdFZhbHVlLCBTdHJpbmcgbGlzdE5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBhZGQKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuYWRkVmFsaWRhdGlvbkdyb3VwVmFsdWUocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKSk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5nZXRFdmVudEZvcihwcm9wZXJ0eU5hbWUpLmdldExpc3ROYW1lKCksIGxpc3ROYW1lKTsKLQotCQkvLyByZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCQotCQl0aGlzLnJlbW92ZVZhbGlkYXRpb25Hcm91cFZhbHVlKHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZ2V0RXZlbnRGb3IocHJvcGVydHlOYW1lKSk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5nZXRFdmVudEZvcihwcm9wZXJ0eU5hbWUpLmdldExpc3ROYW1lKCksIGxpc3ROYW1lKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0VmFsaWRhdGlvbkdyb3VwUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGV4cGVjdGVkVmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyB2ZXJpZnkgZXZlbnQgcmVjZWl2ZWQKLQkJYXNzZXJ0Tm90TnVsbCgiTm8gRXZlbnQgRmlyZWQuIiwgdGhpcy5nZXRFdmVudEZvcihwcm9wZXJ0eU5hbWUpKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCWFzc2VydFRydWUodGhpcy52YWxpZGF0aW9uR3JvdXBWYWx1ZUV4aXN0cyhwcm9wZXJ0eU5hbWUsIChTdHJpbmcpIGV4cGVjdGVkVmFsdWUpKTsKLQkJIHJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBpbnRlcm5hbCBtZXRob2QgKioqKioqKioqKgotCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRWYWxpZGF0aW9uR3JvdXBMaXN0Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlcGxhY2VkKExpc3RSZXBsYWNlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rMl8wT3B0aW9uc1Rlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJCi0JCQkJRWNsaXBzZUxpbmsyXzBPcHRpb25zVGVzdHMudGhpcy52YWxpZGF0aW9uR3JvdXBDaGFuZ2VkKGUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0aW9uR3JvdXBDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBlKSB7Ci0JCVN0cmluZyBsaXN0TmFtZSA9IGUuZ2V0TGlzdE5hbWUoKTsKLQkJCi0JCWlmIChsaXN0TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX0xJU1QpKQotCQkJdGhpcy5wcmVQZXJzaXN0RXZlbnQgPSBlOwotCQllbHNlIGlmIChsaXN0TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfTElTVCkpCi0JCQl0aGlzLnByZVVwZGF0ZUV2ZW50ID0gZTsKLQkJZWxzZSBpZiAobGlzdE5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX0xJU1QpKQotCQkJdGhpcy5wcmVSZW1vdmVFdmVudCA9IGU7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVmFsaWRhdGlvbkdyb3VwVmFsdWUoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUEVSU0lTVF9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlUGVyc2lzdChwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuYWRkVmFsaWRhdGlvbkdyb3VwUHJlVXBkYXRlKHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfUkVNT1ZFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5hZGRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmUocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiYWRkVmFsaWRhdGlvbkdyb3VwVmFsdWUiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgcHJvcGVydHlWYWx1ZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9QRVJTSVNUX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0KHByb3BlcnR5VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMyXzAuVkFMSURBVElPTl9HUk9VUF9QUkVfVVBEQVRFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5yZW1vdmVWYWxpZGF0aW9uR3JvdXBQcmVVcGRhdGUocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnJlbW92ZVZhbGlkYXRpb25Hcm91cFByZVJlbW92ZShwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJyZW1vdmVWYWxpZGF0aW9uR3JvdXBWYWx1ZSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzKFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVBlcnNpc3RFeGlzdHMocHJvcGVydHlWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9VUERBVEVfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gdGhpcy5vcHRpb25zLnZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZUV4aXN0cyhwcm9wZXJ0eVZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1JFTU9WRV9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSB0aGlzLm9wdGlvbnMudmFsaWRhdGlvbkdyb3VwUHJlUmVtb3ZlRXhpc3RzKHByb3BlcnR5VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInZlcmlmeVZhbGlkYXRpb25Hcm91cFZhbHVlRXhpc3RzIiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRWYWxpZGF0aW9uR3JvdXBTaXplKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gIHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVQZXJzaXN0c1NpemUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQlyZXN1bHQgPSAgdGhpcy5vcHRpb25zLmdldFZhbGlkYXRpb25Hcm91cFByZVVwZGF0ZXNTaXplKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJcmVzdWx0ID0gIHRoaXMub3B0aW9ucy5nZXRWYWxpZGF0aW9uR3JvdXBQcmVSZW1vdmVzU2l6ZSgpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInZlcmlmeVZhbGlkYXRpb25Hcm91cFNpemUiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIExpc3RDaGFuZ2VFdmVudCBnZXRFdmVudEZvcihTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlMaXN0Q2hhbmdlRXZlbnQgZXZlbnQgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1BFUlNJU1RfUFJPUEVSVFkpKQotCQkJZXZlbnQgPSB0aGlzLnByZVBlcnNpc3RFdmVudDsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zMl8wLlZBTElEQVRJT05fR1JPVVBfUFJFX1VQREFURV9QUk9QRVJUWSkpCi0JCQlldmVudCA9IHRoaXMucHJlVXBkYXRlRXZlbnQ7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9uczJfMC5WQUxJREFUSU9OX0dST1VQX1BSRV9SRU1PVkVfUFJPUEVSVFkpKQotCQkJZXZlbnQgPSB0aGlzLnByZVJlbW92ZUV2ZW50OwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldEV2ZW50Rm9yIiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIGV2ZW50OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE2NDc5Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rMl8wUGVyc2lzdGVuY2VVbml0VGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGYWNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5wbGF0Zm9ybS5FY2xpcHNlTGlua1BsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5kYXRhbW9kZWwucHJvcGVydGllcy5JRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotLyoqCi0gKiAgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWNsaXBzZUxpbmsyXzBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZSBleHRlbmRzIFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHN1YmplY3Q7Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0PiBzdWJqZWN0SG9sZGVyOwotCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXByb3RlY3RlZCBFY2xpcHNlTGluazJfMFBlcnNpc3RlbmNlVW5pdFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuc3ViamVjdCA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCXRoaXMuc3ViamVjdEhvbGRlciA9IG5ldyBTaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+KHRoaXMuc3ViamVjdCk7Ci0JCXRoaXMucG9wdWxhdGVQdSgpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBJRGF0YU1vZGVsIGJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IHN1cGVyLmJ1aWxkSnBhQ29uZmlnRGF0YU1vZGVsKCk7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCBKcGFGYWNldC5WRVJTSU9OXzJfMC5nZXRWZXJzaW9uU3RyaW5nKCkpOwkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5QTEFURk9STSwgRWNsaXBzZUxpbmtQbGF0Zm9ybS5WRVJTSU9OXzJfMCk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YTQzYTcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtDb25uZWN0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5CYXRjaFdyaXRpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FeGNsdXNpdmVDb25uZWN0aW9uTW9kZTsKLQotLyoqCi0gKiAgQ29ubmVjdGlvbkFkYXB0ZXJUZXN0cwotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgUGVyc2lzdGVuY2VVbml0VHJhbnNhY3Rpb25UeXBlIFRSQU5TQUNUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5SRVNPVVJDRV9MT0NBTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZSBUUkFOU0FDVElPTl9UWVBFX1RFU1RfVkFMVUVfMiA9IFBlcnNpc3RlbmNlVW5pdFRyYW5zYWN0aW9uVHlwZS5KVEE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSA9ICJUZXN0X0pUQSI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUVfMiA9ICJUZXN0X0pUQV8yIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSA9ICJUZXN0X05vbl9KVEEiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTl9KVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRV8yID0gIlRlc3RfTm9uX0pUQV8yIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQVRJVkVfU1FMX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfTkFUSVZFX1NRTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTkFUSVZFX1NRTF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIE5BVElWRV9TUUxfVEVTVF9WQUxVRV8yID0gISBOQVRJVkVfU1FMX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVRDSF9XUklUSU5HX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfQkFUQ0hfV1JJVElORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJhdGNoV3JpdGluZyBCQVRDSF9XUklUSU5HX1RFU1RfVkFMVUUgPSBCYXRjaFdyaXRpbmcub3JhY2xlX2pkYmM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCYXRjaFdyaXRpbmcgQkFUQ0hfV1JJVElOR19URVNUX1ZBTFVFXzIgPSBCYXRjaFdyaXRpbmcuYnVmZmVyZWQ7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfU1RBVEVNRU5UU19LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIENBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBDQUNIRV9TVEFURU1FTlRTX1RFU1RfVkFMVUVfMiA9ICEgQ0FDSEVfU1RBVEVNRU5UU19URVNUX1ZBTFVFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0NBQ0hFX1NUQVRFTUVOVFNfU0laRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIENBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJJVkVSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfRFJJVkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSSVZFUl9URVNUX1ZBTFVFID0gImNvbm5lY3Rpb24uZHJpdmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUklWRVJfVEVTVF9WQUxVRV8yID0gImNvbm5lY3Rpb24uZHJpdmVyLjIiOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVSTF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1VSTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfVEVTVF9WQUxVRV8yID0gInRlc3RfMiI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfVVNFUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1RFU1RfVkFMVUUgPSAidGVzdCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFUl9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBU1NXT1JEX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUEFTU1dPUkQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkRfVEVTVF9WQUxVRSA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVNTV09SRF9URVNUX1ZBTFVFXzIgPSAidGVzdF8yIjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5EX1BBUkFNRVRFUlNfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19CSU5EX1BBUkFNRVRFUlM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIgPSAhIEJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19TSEFSRUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yID0gISBSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQURfQ09OTkVDVElPTlNfTUlOX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfUkVBRF9DT05ORUNUSU9OU19NSU47Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUgPSAxMDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFJFQURfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX1JFQURfQ09OTkVDVElPTlNfTUFYOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFXzIgPSAyMDA7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSA9IENvbm5lY3Rpb24uRUNMSVBTRUxJTktfV1JJVEVfQ09OTkVDVElPTlNfTUlOOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSA9IDEwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEludGVnZXIgV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMiA9IDIwMDsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUklURV9DT05ORUNUSU9OU19NQVhfS0VZID0gQ29ubmVjdGlvbi5FQ0xJUFNFTElOS19XUklURV9DT05ORUNUSU9OU19NQVg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFID0gMTAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yID0gMjAwOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0VYQ0xVU0lWRV9DT05ORUNUSU9OX01PREU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUUgPSBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZS5hbHdheXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSBFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUVfMiA9IEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlLmlzb2xhdGVkOwotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWllfQ09OTkVDVElPTl9LRVkgPSBDb25uZWN0aW9uLkVDTElQU0VMSU5LX0xBWllfQ09OTkVDVElPTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUVfMiA9ICEgTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUU7Ci0JCi0JLy8gKioqKioqKioqKiBjb25zdHJ1Y3RvcnMgKioqKioqKioqKgotCXB1YmxpYyBFY2xpcHNlTGlua0Nvbm5lY3Rpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGJlaGF2aW9yICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLmNvbm5lY3Rpb24gPSB0aGlzLnN1YmplY3QuZ2V0Q29ubmVjdGlvbigpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLkRSSVZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uVVJMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5QQVNTV09SRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uQklORF9QQVJBTUVURVJTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jb25uZWN0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmNvbm5lY3Rpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY29ubmVjdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKENvbm5lY3Rpb24uTEFaWV9DT05ORUNUSU9OX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTY7IC8vIEVjbGlwc2VMaW5rIHByb3BlcnRpZXMKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCArIDQ7IC8vIDQgbWlzYyBwcm9wZXJ0aWVzCi0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSA9IHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsOwotCQkKLQkJLy8gSW5pdGlhbGl6ZXMgRWNsaXBzZUxpbmsgcHJvcGVydGllcwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KE5BVElWRV9TUUxfS0VZLCBOQVRJVkVfU1FMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQkFUQ0hfV1JJVElOR19LRVksIEJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ0FDSEVfU1RBVEVNRU5UU19LRVksIENBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLCBDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShEUklWRVJfS0VZLCBEUklWRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVUkxfS0VZLCBVUkxfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShVU0VSX0tFWSwgVVNFUl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFBBU1NXT1JEX0tFWSwgUEFTU1dPUkRfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShCSU5EX1BBUkFNRVRFUlNfS0VZLCBCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksIFJFQURfQ09OTkVDVElPTlNfU0hBUkVEX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLCBSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFJFQURfQ09OTkVDVElPTlNfTUFYX0tFWSwgUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXUklURV9DT05ORUNUSU9OU19NSU5fS0VZLCBXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLCBXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX0tFWSwgRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMQVpZX0NPTk5FQ1RJT05fS0VZLCBMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJCi0JCS8vIEluaXRpYWxpemVzIFBVIGVsZW1lbnRzCi0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0U3BlY2lmaWVkVHJhbnNhY3Rpb25UeXBlKFRSQU5TQUNUSU9OX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0SnRhRGF0YVNvdXJjZShKVEFfREFUQV9TT1VSQ0VfVEVTVF9WQUxVRSk7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuc2V0Tm9uSnRhRGF0YVNvdXJjZShOT05fSlRBX0RBVEFfU09VUkNFX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmNvbm5lY3Rpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLk5BVElWRV9TUUxfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldE5hdGl2ZVNxbCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQkFUQ0hfV1JJVElOR19QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0QmF0Y2hXcml0aW5nKChCYXRjaFdyaXRpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkNBQ0hFX1NUQVRFTUVOVFNfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldENhY2hlU3RhdGVtZW50cygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRDYWNoZVN0YXRlbWVudHNTaXplKChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldERyaXZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VUkxfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFVybCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5VU0VSX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRVc2VyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKLQkJCXRoaXMuY29ubmVjdGlvbi5zZXRQYXNzd29yZCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CSU5EX1BBUkFNRVRFUlNfUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldEJpbmRQYXJhbWV0ZXJzKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zU2hhcmVkKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01JTl9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWluKChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0UmVhZENvbm5lY3Rpb25zTWF4KChJbnRlZ2VyKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldFdyaXRlQ29ubmVjdGlvbnNNaW4oKEludGVnZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLldSSVRFX0NPTk5FQ1RJT05TX01BWF9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0V3JpdGVDb25uZWN0aW9uc01heCgoSW50ZWdlcikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9QUk9QRVJUWSkpCi0JCQl0aGlzLmNvbm5lY3Rpb24uc2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5MQVpZX0NPTk5FQ1RJT05fUFJPUEVSVFkpKQotCQkJdGhpcy5jb25uZWN0aW9uLnNldExhenlDb25uZWN0aW9uKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5OQVRJVkVfU1FMX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0TmF0aXZlU3FsKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5CQVRDSF9XUklUSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0QmF0Y2hXcml0aW5nKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0Q2FjaGVTdGF0ZW1lbnRzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5DQUNIRV9TVEFURU1FTlRTX1NJWkVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRDYWNoZVN0YXRlbWVudHNTaXplKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5EUklWRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXREcml2ZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlVSTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVybCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uVVNFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFVzZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlBBU1NXT1JEX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UGFzc3dvcmQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkJJTkRfUEFSQU1FVEVSU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldEJpbmRQYXJhbWV0ZXJzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5SRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldFJlYWRDb25uZWN0aW9uc1NoYXJlZCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKENvbm5lY3Rpb24uUkVBRF9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRSZWFkQ29ubmVjdGlvbnNNaW4oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLlJFQURfQ09OTkVDVElPTlNfTUFYX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0UmVhZENvbm5lY3Rpb25zTWF4KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NSU5fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRXcml0ZUNvbm5lY3Rpb25zTWluKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5XUklURV9DT05ORUNUSU9OU19NQVhfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY29ubmVjdGlvbi5nZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ29ubmVjdGlvbi5FWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmNvbm5lY3Rpb24uZ2V0RXhjbHVzaXZlQ29ubmVjdGlvbk1vZGUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDb25uZWN0aW9uLkxBWllfQ09OTkVDVElPTl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jb25uZWN0aW9uLmdldExhenlDb25uZWN0aW9uKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE5hdGl2ZVNxbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldE5hdGl2ZVNxbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlOQVRJVkVfU1FMX0tFWSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlOQVRJVkVfU1FMX0tFWSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTmF0aXZlU3FsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlOQVRJVkVfU1FMX0tFWSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRSwKLQkJCU5BVElWRV9TUUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJhdGNoV3JpdGluZyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEJhdGNoV3JpdGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlCQVRDSF9XUklUSU5HX0tFWSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlCQVRDSF9XUklUSU5HX0tFWSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQmF0Y2hXcml0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlCQVRDSF9XUklUSU5HX0tFWSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRSwKLQkJCUJBVENIX1dSSVRJTkdfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIENhY2hlU3RhdGVtZW50cyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldENhY2hlU3RhdGVtZW50cygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlQ2FjaGVTdGF0ZW1lbnRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlDQUNIRV9TVEFURU1FTlRTX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBDYWNoZVN0YXRlbWVudHNTaXplIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q2FjaGVTdGF0ZW1lbnRzU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfS0VZLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX0tFWSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFLAotCQkJQ0FDSEVfU1RBVEVNRU5UU19TSVpFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUNhY2hlU3RhdGVtZW50c1NpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9LRVksCi0JCQlDQUNIRV9TVEFURU1FTlRTX1NJWkVfVEVTVF9WQUxVRSwKLQkJCUNBQ0hFX1NUQVRFTUVOVFNfU0laRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRHJpdmVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RHJpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCURSSVZFUl9LRVksCi0JCQlEUklWRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlEUklWRVJfS0VZLAotCQkJRFJJVkVSX1RFU1RfVkFMVUUsCi0JCQlEUklWRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRHJpdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlEUklWRVJfS0VZLAotCQkJRFJJVkVSX1RFU1RfVkFMVUUsCi0JCQlEUklWRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFVybCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFVybCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlVUkxfS0VZLAotCQkJVVJMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVVJMX0tFWSwKLQkJCVVSTF9URVNUX1ZBTFVFLAotCQkJVVJMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVVybCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVVJMX0tFWSwKLQkJCVVSTF9URVNUX1ZBTFVFLAotCQkJVVJMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBVc2VyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VXNlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlVU0VSX0tFWSwKLQkJCVVTRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlVU0VSX0tFWSwKLQkJCVVTRVJfVEVTVF9WQUxVRSwKLQkJCVVTRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVXNlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVVNFUl9LRVksCi0JCQlVU0VSX1RFU1RfVkFMVUUsCi0JCQlVU0VSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBQYXNzd29yZCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVBBU1NXT1JEX0tFWSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJUEFTU1dPUkRfS0VZLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRSwKLQkJCVBBU1NXT1JEX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVBhc3N3b3JkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlQQVNTV09SRF9LRVksCi0JCQlQQVNTV09SRF9URVNUX1ZBTFVFLAotCQkJUEFTU1dPUkRfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEJpbmRQYXJhbWV0ZXJzIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0QmluZFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQklORF9QQVJBTUVURVJTX0tFWSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUJJTkRfUEFSQU1FVEVSU19LRVksCi0JCQlCSU5EX1BBUkFNRVRFUlNfVEVTVF9WQUxVRSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVCaW5kUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQklORF9QQVJBTUVURVJTX0tFWSwKLQkJCUJJTkRfUEFSQU1FVEVSU19URVNUX1ZBTFVFLAotCQkJQklORF9QQVJBTUVURVJTX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNTaGFyZWQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zU2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX1NIQVJFRF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19TSEFSRURfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNaW4gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zTWluKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBSZWFkQ29ubmVjdGlvbnNNYXggdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWFkQ29ubmVjdGlvbnNNYXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlUmVhZENvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlSRUFEX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJUkVBRF9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBXcml0ZUNvbm5lY3Rpb25zTWluIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V3JpdGVDb25uZWN0aW9uc01pbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUlOX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdyaXRlQ29ubmVjdGlvbnNNaW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NSU5fVEVTVF9WQUxVRSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01JTl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFdyaXRlQ29ubmVjdGlvbnNNYXggdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXcml0ZUNvbm5lY3Rpb25zTWF4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9LRVksCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfS0VZLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUUsCi0JCQlXUklURV9DT05ORUNUSU9OU19NQVhfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV3JpdGVDb25uZWN0aW9uc01heCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX0tFWSwKLQkJCVdSSVRFX0NPTk5FQ1RJT05TX01BWF9URVNUX1ZBTFVFLAotCQkJV1JJVEVfQ09OTkVDVElPTlNfTUFYX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV4Y2x1c2l2ZUNvbm5lY3Rpb25Nb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfS0VZLAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0xVU0lWRV9DT05ORUNUSU9OX01PREVfS0VZLAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFLAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNsdXNpdmVDb25uZWN0aW9uTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJRVhDTFVTSVZFX0NPTk5FQ1RJT05fTU9ERV9LRVksCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUUsCi0JCQlFWENMVVNJVkVfQ09OTkVDVElPTl9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBMYXp5Q29ubmVjdGlvbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExhenlDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxBWllfQ09OTkVDVElPTl9LRVksCi0JCQlMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlMQVpZX0NPTk5FQ1RJT05fS0VZLAotCQkJTEFaWV9DT05ORUNUSU9OX1RFU1RfVkFMVUUsCi0JCQlMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTGF6eUNvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUxBWllfQ09OTkVDVElPTl9LRVksCi0JCQlMQVpZX0NPTk5FQ1RJT05fVEVTVF9WQUxVRSwKLQkJCUxBWllfQ09OTkVDVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjQwYzkwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0TW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZXBsYWNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkxpc3RDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DdXN0b21pemF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkN1c3RvbWl6YXRpb25FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUHJvZmlsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuV2VhdmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua0N1c3RvbWl6YXRpb247Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBDdXN0b21pemF0aW9uIGFkYXB0ZXIgd2hlbiB0aGUKLSAqIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIEN1c3RvbWl6YXRpb24gY3VzdG9taXphdGlvbjsKLQlwcml2YXRlIExpc3RFdmVudCBlbnRpdGllc0V2ZW50OwotCXByaXZhdGUgTGlzdEV2ZW50IHNlc3Npb25DdXN0b21pemVyc0V2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1RFU1QgPSAiRW1wbG95ZWUiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9URVNUXzIgPSAiQWRkcmVzcyI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSFJPV19FWENFUFRJT05TX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVEhST1dfRVhDRVBUSU9OUzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVEhST1dfRVhDRVBUSU9OU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRV8yID0gISBUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0xBWllfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0xBWlk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0NIQU5HRV9UUkFDS0lORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXRUFWSU5HX0ZFVENIX0dST1VQU19LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1dFQVZJTkdfRkVUQ0hfR1JPVVBTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFdFQVZJTkdfRkVUQ0hfR1JPVVBTX1RFU1RfVkFMVUVfMiA9ICEgV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfSU5URVJOQUxfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0lOVEVSTkFMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gV0VBVklOR19JTlRFUk5BTF9URVNUX1ZBTFVFXzIgPSAhIFdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfRUFHRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HX0VBR0VSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBXRUFWSU5HX0VBR0VSX1RFU1RfVkFMVUVfMiA9ICEgV0VBVklOR19FQUdFUl9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9PTkxZX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfVkFMSURBVElPTl9PTkxZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRV8yID0gISBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRFX1NDSEVNQV9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX1ZBTElEQVRFX1NDSEVNQTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRV8yID0gISBWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19TRVNTSU9OX0NVU1RPTUlaRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFID0gImphdmEubGFuZy5TdHJpbmciOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yID0gImphdmEubGFuZy5Cb29sZWFuIjsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQVZJTkdfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19XRUFWSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgV2VhdmluZyBXRUFWSU5HX1RFU1RfVkFMVUUgPSBXZWF2aW5nLmZhbHNlXzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFdlYXZpbmcgV0VBVklOR19URVNUX1ZBTFVFXzIgPSBXZWF2aW5nLnN0YXRpY187Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01JWkVSX0tFWSA9IEN1c3RvbWl6YXRpb24uRUNMSVBTRUxJTktfREVTQ1JJUFRPUl9DVVNUT01JWkVSICsgRU5USVRZX1RFU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFID0gImFjbWUuc2Vzc2lvbnMuRGVzY3JpcHRvckN1c3RvbWl6ZXIiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTUlaRVJfVEVTVF9WQUxVRV8yID0gImFjbWUuc2Vzc2lvbnMuQ3VzdG9taXplciI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRVJfS0VZID0gQ3VzdG9taXphdGlvbi5FQ0xJUFNFTElOS19QUk9GSUxFUjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9maWxlciBQUk9GSUxFUl9URVNUX1ZBTFVFID0gUHJvZmlsZXIucXVlcnlfbW9uaXRvcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRVJfVEVTVF9WQUxVRV8yID0gImN1c3RvbS5wcm9maWxlci50ZXN0IjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fSEFORExFUl9LRVkgPSBDdXN0b21pemF0aW9uLkVDTElQU0VMSU5LX0VYQ0VQVElPTl9IQU5ETEVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUUgPSAiYWNtZS5DdXN0b21TZXNzaW9uRXZlbnRMaXN0ZW5lciI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRV8yID0gIm9yYWNsZS5zZXNzaW9ucy5DdXN0b21TZXNzaW9uRXZlbnRMaXN0ZW5lciI7Ci0KLQkvLyAqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqCi0JcHVibGljIEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8vICoqKioqKioqKiogYmVoYXZpb3IgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbiA9IHRoaXMuc3ViamVjdC5nZXRDdXN0b21pemF0aW9uKCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfTEFaWV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLldFQVZJTkdfRkVUQ0hfR1JPVVBTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0lOVEVSTkFMX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5WQUxJREFUSU9OX09OTFlfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb25FbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0KLQkJTGlzdENoYW5nZUxpc3RlbmVyIHNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFNlc3Npb25DdXN0b21pemVyc0NoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuY3VzdG9taXphdGlvbi5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCwgc2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlTGlzdGVuZXIpOwotCQkKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGVudGl0aWVzQ2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkRW50aXRpZXNDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkTGlzdENoYW5nZUxpc3RlbmVyKEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCwgZW50aXRpZXNDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLgotCSAqLwotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHBvcHVsYXRlUHUoKSB7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMTM7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEhST1dfRVhDRVBUSU9OU19LRVksIFRIUk9XX0VYQ0VQVElPTlNfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0xBWllfS0VZLCBXRUFWSU5HX0xBWllfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0NIQU5HRV9UUkFDS0lOR19LRVksIFdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLCBXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFdFQVZJTkdfSU5URVJOQUxfS0VZLCBXRUFWSU5HX0lOVEVSTkFMX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoV0VBVklOR19FQUdFUl9LRVksIFdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFUSU9OX09OTFlfS0VZLCBWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShWQUxJREFURV9TQ0hFTUFfS0VZLCBWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLCBTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShXRUFWSU5HX0tFWSwgV0VBVklOR19URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShDVVNUT01JWkVSX0tFWSwgQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShQUk9GSUxFUl9LRVksIFBST0ZJTEVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0VQVElPTl9IQU5ETEVSX0tFWSwgRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExpc3RlbmVycyAqKioqKioqKioqCi0JcHJpdmF0ZSBMaXN0Q2hhbmdlTGlzdGVuZXIgYnVpbGRFbnRpdGllc0NoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IExpc3RDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLmVudGl0eUFkZGVkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLmVudGl0eVJlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy50aHJvd1Vuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCQotCXByaXZhdGUgTGlzdENoYW5nZUxpc3RlbmVyIGJ1aWxkU2Vzc2lvbkN1c3RvbWl6ZXJzQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgTGlzdENoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJBZGRlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy5zZXNzaW9uQ3VzdG9taXplclJlbW92ZWQoZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBlKSB7Ci0JCQkJRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMudGhpcy5zZXNzaW9uQ3VzdG9taXplclJlcGxhY2VkKGUpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMudGhyb3dVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgZSkgewotCQkJCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvblRlc3RzLnRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJMaXN0Q2xlYXJlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbGlzdENoYW5nZWQoTGlzdENoYW5nZUV2ZW50IGUpIHsKLQkJCQlFY2xpcHNlTGlua0N1c3RvbWl6YXRpb25UZXN0cy50aGlzLnRocm93VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY2xlYXJFdmVudCgpIHsKLQkJc3VwZXIuY2xlYXJFdmVudCgpOwotCQl0aGlzLmVudGl0aWVzRXZlbnQgPSBudWxsOwotCQl0aGlzLnNlc3Npb25DdXN0b21pemVyc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQl2b2lkIGVudGl0eUFkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBlbnRpdHlSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCXRoaXMuZW50aXRpZXNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBzZXNzaW9uQ3VzdG9taXplckFkZGVkKExpc3RBZGRFdmVudCBlKSB7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBlKSB7Ci0JCXRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQgPSBlOwotCX0KLQotCXZvaWQgc2Vzc2lvbkN1c3RvbWl6ZXJSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGUpIHsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudCA9IGU7Ci0JfQotCi0Jdm9pZCBzZXNzaW9uQ3VzdG9taXplckxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGUpIHsKLQkJdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudCA9IGU7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlRIUk9XX0VYQ0VQVElPTlNfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFRocm93RXhjZXB0aW9ucygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nTGF6eSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdDaGFuZ2VUcmFja2luZygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19GRVRDSF9HUk9VUFNfUFJPUEVSVFkpKQotCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFdlYXZpbmdGZXRjaEdyb3VwcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZ0ludGVybmFsKChCb29sZWFuKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0VBR0VSX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRXZWF2aW5nRWFnZXIoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRJT05fT05MWV9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0VmFsaWRhdGlvbk9ubHkoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0VmFsaWRhdGVTY2hlbWEoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLkVYQ0VQVElPTl9IQU5ETEVSX1BST1BFUlRZKSkKLQkJCXRoaXMuY3VzdG9taXphdGlvbi5zZXRFeGNlcHRpb25IYW5kbGVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uYWRkU2Vzc2lvbkN1c3RvbWl6ZXIoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0V2VhdmluZygoV2VhdmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpKSB7Ci0JCQlpZiAobmV3VmFsdWUuZ2V0Q2xhc3MoKS5pc0VudW0oKSkKLQkJCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0UHJvZmlsZXIoKFByb2ZpbGVyKSBuZXdWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJfQotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5USFJPV19FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VGhyb3dFeGNlcHRpb25zKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19MQVpZX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZ0xhenkoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLldFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5XRUFWSU5HX0ZFVENIX0dST1VQU19QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdGZXRjaEdyb3VwcygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19JTlRFUk5BTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdJbnRlcm5hbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uV0VBVklOR19FQUdFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFdlYXZpbmdFYWdlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uVkFMSURBVElPTl9PTkxZX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0VmFsaWRhdGlvbk9ubHkoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlZBTElEQVRFX1NDSEVNQV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFZhbGlkYXRlU2NoZW1hKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbi5FWENFUFRJT05fSEFORExFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5jdXN0b21pemF0aW9uLmdldEV4Y2VwdGlvbkhhbmRsZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlBST0ZJTEVSX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmN1c3RvbWl6YXRpb24uZ2V0UHJvZmlsZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uLlNFU1NJT05fQ1VTVE9NSVpFUl9QUk9QRVJUWSkpIHsKLQkJCUxpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yID0gdGhpcy5jdXN0b21pemF0aW9uLmdldFNlc3Npb25DdXN0b21pemVycygpLml0ZXJhdG9yKCk7Ci0JCQlpZihpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQltb2RlbFZhbHVlID0gaXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbkVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKEVOVElUWV9URVNUKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEN1c3RvbWl6YXRpb24uUFJPRklMRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpID8KLQkJCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihQUk9GSUxFUl9URVNUX1ZBTFVFKSA6IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkJCWV4cGVjdGVkVmFsdWU7Ci0JCX0KLQkJc3VwZXIudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlXyk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmN1c3RvbWl6YXRpb247Ci0JfQotCi0JLy8gKioqKioqKioqKiBlbnRpdGllcyBsaXN0ICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0RW50aXRpZXNMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGFkZAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLmFkZEVudGl0eShFTlRJVFlfVEVTVF8yKTsKLQkJCi0JCS8vIHZlcmlmeSBldmVudCByZWNlaXZlZAotCQlhc3NlcnROb3ROdWxsKCJObyBFdmVudCBGaXJlZC4iLCB0aGlzLmVudGl0aWVzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuZW50aXRpZXNFdmVudC5nZXRMaXN0TmFtZSgpLCBDdXN0b21pemF0aW9uLkVOVElUSUVTX0xJU1QpOwotCQkKLQkJLy8gcmVtb3ZlCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24ucmVtb3ZlRW50aXR5KEVOVElUWV9URVNUXzIpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuZW50aXRpZXNFdmVudCk7Ci0JCS8vIHZlcmlmeSBldmVudCBmb3IgdGhlIGV4cGVjdGVkIHByb3BlcnR5Ci0JCWFzc2VydEVxdWFscygiV3JvbmcgRXZlbnQuIiwgdGhpcy5lbnRpdGllc0V2ZW50LmdldExpc3ROYW1lKCksIEN1c3RvbWl6YXRpb24uRU5USVRJRVNfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBzZXNzaW9uQ3VzdG9taXplcnMgbGlzdCAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNlc3Npb25DdXN0b21pemVyc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gYWRkCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gdGhpcy5jdXN0b21pemF0aW9uLmFkZFNlc3Npb25DdXN0b21pemVyKFNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFXzIpOwotCQkKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCk7Ci0JCQotCQkvLyByZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCQotCQl0aGlzLmN1c3RvbWl6YXRpb24ucmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoY2xhc3NOYW1lKTsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOwotCQkvLyB2ZXJpZnkgZXZlbnQgZm9yIHRoZSBleHBlY3RlZCBwcm9wZXJ0eQotCQlhc3NlcnRFcXVhbHMoIldyb25nIEV2ZW50LiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQuZ2V0TGlzdE5hbWUoKSwgQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfTElTVCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJvd0V4Y2VwdGlvbnMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaHJvd0V4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRocm93RXhjZXB0aW9ucygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVEhST1dfRVhDRVBUSU9OU19LRVksCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlUSFJPV19FWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nTGF6eSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdMYXp5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfTEFaWV9LRVksCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0xBWllfS0VZLAotCQkJV0VBVklOR19MQVpZX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0xhenkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfTEFaWV9LRVksCi0JCQlXRUFWSU5HX0xBWllfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfTEFaWV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogV2VhdmluZ0NoYW5nZVRyYWNraW5nIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0V2VhdmluZ0NoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX0tFWSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmdDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfS0VZLAotCQkJV0VBVklOR19DSEFOR0VfVFJBQ0tJTkdfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfQ0hBTkdFX1RSQUNLSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBXZWF2aW5nRmV0Y2hHcm91cHMgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRXZWF2aW5nRmV0Y2hHcm91cHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfS0VZLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0ZldGNoR3JvdXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19LRVksCi0JCQlXRUFWSU5HX0ZFVENIX0dST1VQU19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19GRVRDSF9HUk9VUFNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdJbnRlcm5hbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdJbnRlcm5hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0ludGVybmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0lOVEVSTkFMX0tFWSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfSU5URVJOQUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmdFYWdlciB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmdFYWdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlV2VhdmluZ0VhZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlXRUFWSU5HX0VBR0VSX0tFWSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRSwKLQkJCVdFQVZJTkdfRUFHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFNlc3Npb25DdXN0b21pemVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2Vzc2lvbkN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX0tFWSwKLQkJCVNFU1NJT05fQ1VTVE9NSVpFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbkN1c3RvbWl6ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KAotCQkJQ3VzdG9taXphdGlvbi5TRVNTSU9OX0NVU1RPTUlaRVJfUFJPUEVSVFksCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfS0VZLAotCQkJU0VTU0lPTl9DVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX0NVU1RPTUlaRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFdlYXZpbmcgdGVzdHMgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgV2VhdmluZyBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4KLQkgKiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldFdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJV0VBVklOR19LRVksCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUUsCi0JCQlXRUFWSU5HX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVdlYXZpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVdFQVZJTkdfS0VZLAotCQkJV0VBVklOR19URVNUX1ZBTFVFLAotCQkJV0VBVklOR19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVmFsaWRhdGlvbk9ubHkgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWxpZGF0aW9uT25seSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlWQUxJREFUSU9OX09OTFlfS0VZLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVkFMSURBVElPTl9PTkxZX0tFWSwKLQkJCVZBTElEQVRJT05fT05MWV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVZhbGlkYXRpb25Pbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlWQUxJREFUSU9OX09OTFlfS0VZLAotCQkJVkFMSURBVElPTl9PTkxZX1RFU1RfVkFMVUUsCi0JCQlWQUxJREFUSU9OX09OTFlfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFZhbGlkYXRlU2NoZW1hIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsaWRhdGVTY2hlbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVkFMSURBVEVfU0NIRU1BX0tFWSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVZBTElEQVRFX1NDSEVNQV9LRVksCi0JCQlWQUxJREFURV9TQ0hFTUFfVEVTVF9WQUxVRSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVWYWxpZGF0ZVNjaGVtYSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVkFMSURBVEVfU0NIRU1BX0tFWSwKLQkJCVZBTElEQVRFX1NDSEVNQV9URVNUX1ZBTFVFLAotCQkJVkFMSURBVEVfU0NIRU1BX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBFeGNlcHRpb25IYW5kbGVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RXhjZXB0aW9uSGFuZGxlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlFWENFUFRJT05fSEFORExFUl9LRVksCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUVYQ0VQVElPTl9IQU5ETEVSX0tFWSwKLQkJCUVYQ0VQVElPTl9IQU5ETEVSX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNlcHRpb25IYW5kbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENFUFRJT05fSEFORExFUl9LRVksCi0JCQlFWENFUFRJT05fSEFORExFUl9URVNUX1ZBTFVFLAotCQkJRVhDRVBUSU9OX0hBTkRMRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEN1c3RvbWl6YXRpb24gY2xhc3MgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgQ3VzdG9taXphdGlvbiBwcm9wZXJ0eSBieSB0aGUgQ3VzdG9taXphdGlvbiBhZGFwdGVyIHdoZW4gdGhlCi0JICogUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldEN1c3RvbWl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJQ1VTVE9NSVpFUl9LRVksCi0JCQlDVVNUT01JWkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eSgKLQkJCUN1c3RvbWl6YXRpb25FbnRpdHkuREVTQ1JJUFRPUl9DVVNUT01JWkVSX1BST1BFUlRZLAotCQkJQ1VTVE9NSVpFUl9LRVksCi0JCQlDVVNUT01JWkVSX1RFU1RfVkFMVUUsCi0JCQlDVVNUT01JWkVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUN1c3RvbWl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVDdXN0b21pemF0aW9uUHJvcGVydHkoCi0JCQlDdXN0b21pemF0aW9uRW50aXR5LkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSwKLQkJCUNVU1RPTUlaRVJfS0VZLAotCQkJQ1VTVE9NSVpFUl9URVNUX1ZBTFVFLAotCQkJQ1VTVE9NSVpFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvLyAqKioqKioqKioqIFByb2ZpbGVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0UHJvZmlsZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJUFJPRklMRVJfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoUFJPRklMRVJfVEVTVF9WQUxVRSkpOyAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJLy8gdmVyaWZ5IHNldCBlbnVtIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlQUk9GSUxFUl9LRVksCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRQcm9maWxlcigKLQkJCVBST0ZJTEVSX0tFWSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUUsCi0JCQlQUk9GSUxFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQcm9maWxlcigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJUFJPRklMRVJfS0VZLAotCQkJUFJPRklMRVJfVEVTVF9WQUxVRSwKLQkJCVBST0ZJTEVSX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHNldHRpbmcgY3VzdG9tIHByb2ZpbGVyIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRQcm9maWxlcihTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSBwcm9maWxlci4KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCi0JCS8vIHRlc3Qgc2V0IChQcm9maWxlcikgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5jdXN0b21pemF0aW9uLnNldFByb2ZpbGVyKChQcm9maWxlcikgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHNldCBlbnVtIGxpdGVyYWwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxLnRvU3RyaW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHRlc3RWYWx1ZTEpKTsKLQotCQkvLyB0ZXN0IHNldCAoU3RyaW5nKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0UHJvZmlsZXIoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCi0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8vICoqKioqKioqKiogdmVyaWZ5IFNlc3Npb25DdXN0b21pemVyIHByb3BlcnR5ICoqKioqKioqKioKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlcGxhY2UKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShrZXksIHRlc3RWYWx1ZTIsIHRydWUpOyAKLQkJdGhpcy5wcm9wZXJ0aWVzVG90YWwrKzsKLQkJdGhpcy52ZXJpZnlQdXRTZXNzaW9uQ3VzdG9taXplclByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMSk7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSAKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlBZGRSZW1vdmVTZXNzaW9uQ3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBrZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkoa2V5LCAoU3RyaW5nKSB0ZXN0VmFsdWUxKTsKLQkJYXNzZXJ0RmFsc2UodGhpcy5jdXN0b21pemF0aW9uLnNlc3Npb25DdXN0b21pemVyRXhpc3RzKGtleSkpOwotCQlhc3NlcnRFcXVhbHModGhpcy5tb2RlbFByb3BlcnRpZXNTaXplLCB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCAtIDEpOwotCQkKLQkJLy8gQWRkIG9yaWdpbmFsIFByb3BlcnR5Ci0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMSwgdHJ1ZSk7IAotCQl0aGlzLnZlcmlmeVB1dFNlc3Npb25DdXN0b21pemVyUHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRTZXNzaW9uQ3VzdG9taXplclByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHJlY2VpdmVkCi0JCWFzc2VydE5vdE51bGwoIk5vIEV2ZW50IEZpcmVkLiIsIHRoaXMuc2Vzc2lvbkN1c3RvbWl6ZXJzRXZlbnQpOwotCQl0aGlzLnZlcmlmeVNlc3Npb25DdXN0b21pemVyRXZlbnQocHJvcGVydHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXNzaW9uQ3VzdG9taXplckV2ZW50KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbiBjdXN0b21pemF0aW9uID0gKEVjbGlwc2VMaW5rQ3VzdG9taXphdGlvbikgdGhpcy5zZXNzaW9uQ3VzdG9taXplcnNFdmVudC5nZXRTb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShjdXN0b21pemF0aW9uLnNlc3Npb25DdXN0b21pemVyRXhpc3RzKChTdHJpbmcpIGV4cGVjdGVkVmFsdWUpKTsKLQkJIHJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiB2ZXJpZnkgZW50aXR5IHByb3BlcnR5ICoqKioqKioqKioKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRDdXN0b21pemF0aW9uUHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGtleSwgT2JqZWN0IHRlc3RWYWx1ZTEsIE9iamVjdCB0ZXN0VmFsdWUyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KGtleSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTIpOwotCQkKLQkJLy8gUmVwbGFjZSBieSBzZXR0aW5nIG1vZGVsIG9iamVjdAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCXRoaXMudmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KHByb3BlcnR5TmFtZSwgRU5USVRZX1RFU1QsIHRlc3RWYWx1ZTEpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeUFkZFJlbW92ZUN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcga2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBSZW1vdmUKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCS0tdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCS0tdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLnJlbW92ZVByb3BlcnR5KGtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJYXNzZXJ0RXF1YWxzKHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZSwgdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgLSAxKTsKLQkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgbnVsbCk7Ci0JCQotCQkvLyBBZGQgb3JpZ2luYWwgUHJvcGVydHkKLQkJKyt0aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJKyt0aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUxKTsKLQkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMSk7Ci0JCQotCQkvLyBSZXBsYWNlCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoa2V5LCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRDdXN0b21pemF0aW9uUHJvcGVydHkocHJvcGVydHlOYW1lLCBFTlRJVFlfVEVTVCwgdGVzdFZhbHVlMik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5UHV0Q3VzdG9taXphdGlvblByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5RXZlbnQocHJvcGVydHlOYW1lKTsKLQkJdGhpcy52ZXJpZnlDdXN0b21pemF0aW9uRXZlbnQocHJvcGVydHlOYW1lLCBlbnRpdHlOYW1lLCBleHBlY3RlZFZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlDdXN0b21pemF0aW9uRXZlbnQoU3RyaW5nIHByb3BlcnR5TmFtZSwgU3RyaW5nIGVudGl0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gdmVyaWZ5IGV2ZW50IHZhbHVlCi0JCUN1c3RvbWl6YXRpb25FbnRpdHkgZW50aXR5ID0gKEN1c3RvbWl6YXRpb25FbnRpdHkpIHRoaXMucHJvcGVydHlDaGFuZ2VkRXZlbnQuZ2V0TmV3VmFsdWUoKTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoQ3VzdG9taXphdGlvbkVudGl0eS5ERVNDUklQVE9SX0NVU1RPTUlaRVJfUFJPUEVSVFkpKSB7Ci0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZSwgZW50aXR5LmdldFBhcmVudCgpLmdldERlc2NyaXB0b3JDdXN0b21pemVyT2YoZW50aXR5TmFtZSkpOwotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRoaXMuY3VzdG9taXphdGlvbi5nZXREZXNjcmlwdG9yQ3VzdG9taXplck9mKGVudGl0eU5hbWUpKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigidmVyaWZ5Q3VzdG9taXphdGlvbkV2ZW50IiwgcHJvcGVydHlOYW1lKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEN1c3RvbWl6YXRpb25Qcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhDdXN0b21pemF0aW9uRW50aXR5LkRFU0NSSVBUT1JfQ1VTVE9NSVpFUl9QUk9QRVJUWSkpCi0JCQl0aGlzLmN1c3RvbWl6YXRpb24uc2V0RGVzY3JpcHRvckN1c3RvbWl6ZXJPZihlbnRpdHlOYW1lLCAoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0Q3VzdG9taXphdGlvblByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Y2E0ZDEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLmZhY2V0LkpwYUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucGxhdGZvcm0uRWNsaXBzZUxpbmtQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLklEYXRhTW9kZWw7Ci0KLS8qKgotICogUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UgZXh0ZW5kcyBQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByb3RlY3RlZCBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBzdWJqZWN0OwotCi0JcHJvdGVjdGVkIFByb3BlcnR5VmFsdWVNb2RlbDxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdD4gc3ViamVjdEhvbGRlcjsKLQotCS8vICoqKioqKioqKiogY29uc3RydWN0b3JzICoqKioqKioqKioKLQlwcm90ZWN0ZWQgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnN1YmplY3QgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQl0aGlzLnN1YmplY3RIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0Pih0aGlzLnN1YmplY3QpOwotCQl0aGlzLnBvcHVsYXRlUHUoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgSURhdGFNb2RlbCBidWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpIHsKLQkJSURhdGFNb2RlbCBkYXRhTW9kZWwgPSBzdXBlci5idWlsZEpwYUNvbmZpZ0RhdGFNb2RlbCgpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLlBMQVRGT1JNLCBFY2xpcHNlTGlua1BsYXRmb3JtLlZFUlNJT05fMV8wKTsKLQkJcmV0dXJuIGRhdGFNb2RlbDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IGdldFBlcnNpc3RlbmNlVW5pdCgpIHsKLQkJcmV0dXJuIChFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCkgc3VwZXIuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzliZDBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0VjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLmludGVybmFsLm9wZXJhdGlvbnMuSnB0RmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuTWFwcGluZ0tleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQub3JtLk9ybVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5Pcm1GaWxlQ3JlYXRpb25EYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxKYXZhQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlhtbE1hcHBpbmdGaWxlUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnhtbC5KcGFYbWxSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLkpwdEpwYUVjbGlwc2VMaW5rQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5FY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwub3BlcmF0aW9ucy5FY2xpcHNlTGlua09ybUZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LkVjbGlwc2VMaW5rQ29udGV4dE1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5EYXRhTW9kZWxGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZnJhbWV3b3Jrcy5kYXRhbW9kZWwuSURhdGFNb2RlbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtDb250ZXh0TW9kZWxUZXN0Q2FzZQotewotCXB1YmxpYyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBib29sZWFuIGNyZWF0ZU9ybVhtbCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRFY2xpcHNlTGlua09ybUNvbmZpZyhUZXN0SnBhUHJvamVjdCB0ZXN0SnBhUHJvamVjdCkgewotCQlJRGF0YU1vZGVsIGRhdGFNb2RlbCA9IAotCQkJRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEVjbGlwc2VMaW5rT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvdmlkZXIoKSk7CQkKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwdEZpbGVDcmVhdGlvbkRhdGFNb2RlbFByb3BlcnRpZXMuQ09OVEFJTkVSX1BBVEgsIAotCQkJCXRlc3RKcGFQcm9qZWN0LmdldFByb2plY3QoKS5nZXRGb2xkZXIoInNyYy9NRVRBLUlORiIpLmdldEZ1bGxQYXRoKCkpOwotCQlkYXRhTW9kZWwuc2V0UHJvcGVydHkoT3JtRmlsZUNyZWF0aW9uRGF0YU1vZGVsUHJvcGVydGllcy5BRERfVE9fUEVSU0lTVEVOQ0VfVU5JVCwgQm9vbGVhbi5GQUxTRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEpQQS5FTlRJVFkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFbnRpdHkiKS5hcHBlbmQoQ1IpOwotCQkJfQotCQl9KTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVFY2xpcHNlTGlua0ltcGxpZWRNYXBwaW5nRmlsZVJlZjEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyByZW1vdmUgZWNsaXBzZWxpbmstb3JtLnhtbAotCQlkZWxldGVSZXNvdXJjZShlY2xpcHNlTGlua09ybVJlc291cmNlKTsKLQkJCi0JCWFzc2VydEZhbHNlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmMigpIHsKLQkJWG1sUGVyc2lzdGVuY2VVbml0IHhtbFBlcnNpc3RlbmNlVW5pdCA9IGdldFhtbFBlcnNpc3RlbmNlVW5pdCgpOwotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJCi0JCS8vIHRlc3QgdGhhdCB0aGVyZSBpcyBvbmUgaW5pdGlhbGx5Ci0JCUpwYVhtbFJlc291cmNlIGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UgPSBnZXRPcm1YbWxSZXNvdXJjZSgpOwotCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQkJCi0JCS8vIGFkZCBzcGVjaWZpZWQgZWNsaXBzZWxpbmstb3JtLnhtbAotCQlYbWxNYXBwaW5nRmlsZVJlZiB4bWxNYXBwaW5nRmlsZVJlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sTWFwcGluZ0ZpbGVSZWYoKTsKLQkJeG1sTWFwcGluZ0ZpbGVSZWYuc2V0RmlsZU5hbWUoIk1FVEEtSU5GL2VjbGlwc2VsaW5rLW9ybS54bWwiKTsKLQkJeG1sUGVyc2lzdGVuY2VVbml0LmdldE1hcHBpbmdGaWxlcygpLmFkZCh4bWxNYXBwaW5nRmlsZVJlZik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMSwgQ29sbGVjdGlvblRvb2xzLnNpemUocGVyc2lzdGVuY2VVbml0LmdldFNwZWNpZmllZE1hcHBpbmdGaWxlUmVmcygpKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGVjbGlwc2VMaW5rT3JtUmVzb3VyY2UuZmlsZUV4aXN0cygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZE1hcHBpbmdGaWxlUmVmKCkpOwotCQlhc3NlcnROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZUVjbGlwc2VMaW5rSW1wbGllZE1hcHBpbmdGaWxlUmVmMygpIHsKLQkJRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQotCQkvLyB0ZXN0IHRoYXQgdGhlcmUgaXMgb25lIGluaXRpYWxseQotCQlKcGFYbWxSZXNvdXJjZSBlY2xpcHNlTGlua09ybVJlc291cmNlID0gZ2V0T3JtWG1sUmVzb3VyY2UoKTsKLQkJYXNzZXJ0VHJ1ZShlY2xpcHNlTGlua09ybVJlc291cmNlLmZpbGVFeGlzdHMoKSk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRNYXBwaW5nRmlsZVJlZigpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0SW1wbGllZEVjbGlwc2VMaW5rTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCQotCQkvLyBpZ25vcmUgaW4gcGVyc2lzdGVuY2UgdW5pdAotCQlwZXJzaXN0ZW5jZVVuaXQuZ2V0R2VuZXJhbFByb3BlcnRpZXMoKS5zZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oQm9vbGVhbi5UUlVFKTsKLQkJCi0JCWFzc2VydFRydWUoZWNsaXBzZUxpbmtPcm1SZXNvdXJjZS5maWxlRXhpc3RzKCkpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSk7Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VVbml0LmdldEltcGxpZWRFY2xpcHNlTGlua01hcHBpbmdGaWxlUmVmKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nRmlsZVJlZnMoKSB7Ci0JCUVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IGdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQlMaXN0SXRlcmF0b3I8TWFwcGluZ0ZpbGVSZWY+IG1hcHBpbmdGaWxlUmVmcyA9IHBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZVJlZnMoKS5pdGVyYXRvcigpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkTWFwcGluZ0ZpbGVSZWYoKSwgbWFwcGluZ0ZpbGVSZWZzLm5leHQoKS5nZXRNYXBwaW5nRmlsZSgpLmdldFBhcmVudCgpKTsKLQkJYXNzZXJ0RXF1YWxzKHBlcnNpc3RlbmNlVW5pdC5nZXRJbXBsaWVkRWNsaXBzZUxpbmtNYXBwaW5nRmlsZVJlZigpLCBtYXBwaW5nRmlsZVJlZnMubmV4dCgpLmdldE1hcHBpbmdGaWxlKCkuZ2V0UGFyZW50KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNYXBwaW5nRmlsZVJlZnNTaXplKCkgewotCQlFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBnZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHBlcnNpc3RlbmNlVW5pdC5nZXRNYXBwaW5nRmlsZVJlZnNTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJzaXN0ZW50VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyhmYWxzZSk7CQotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCWNyZWF0ZVRlc3RFbnRpdHkoKTsKLQkJCi0JCS8vcGVyc2lzdGVudFR5cGUgbm90IGxpc3RlZCBpbiBwZXJzaXN0ZW5jZS54bWwgYW5kIGRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyBpcyBmYWxzZQotCQkvL3N0aWxsIGZpbmQgdGhlIHBlcnNpc3RlbnRUeXBlIGJlY2F1c2Ugb2YgY2hhbmdlcyBmb3IgYnVnIDE5MDMxNwotCQlhc3NlcnRGYWxzZShnZXRKcGFQcm9qZWN0KCkuZGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChwZXJzaXN0ZW5jZVVuaXQuZ2V0UGVyc2lzdGVudFR5cGUoRlVMTFlfUVVBTElGSUVEX1RZUEVfTkFNRSkpOwotCQkKLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIG5vdCBsaXN0ZWQgaW4gcGVyc2lzdGVuY2UueG1sLCBkaXNjb3ZlciBhbm5vdGF0ZWQgY2xhc3NlcyBzZXQgdG8gdHJ1ZQotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3Nlcyh0cnVlKTsJCi0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQkJCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBsaXN0IGFzIGNsYXNzIGluIHBlcnNpc3RlbmNlLnhtbAotCQlnZXRKcGFQcm9qZWN0KCkuc2V0RGlzY292ZXJzQW5ub3RhdGVkQ2xhc3NlcyhmYWxzZSk7Ci0JCVhtbEphdmFDbGFzc1JlZiBjbGFzc1JlZiA9IFBlcnNpc3RlbmNlRmFjdG9yeS5lSU5TVEFOQ0UuY3JlYXRlWG1sSmF2YUNsYXNzUmVmKCk7Ci0JCWNsYXNzUmVmLnNldEphdmFDbGFzcyhGVUxMWV9RVUFMSUZJRURfVFlQRV9OQU1FKTsKLQkJZ2V0WG1sUGVyc2lzdGVuY2VVbml0KCkuZ2V0Q2xhc3NlcygpLmFkZChjbGFzc1JlZik7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKEZVTExZX1FVQUxJRklFRF9UWVBFX05BTUUpKTsKLQotCQkKLQkJLy90ZXN0IHBlcnNpc3RlbnRUeXBlIGZyb20gb3JtLnhtbCBmaWxlIHRoYXQgaXMgc3BlY2lmaWVkIGluIHRoZSBwZXJzaXN0ZW5jZS54bWwKLQkJYWRkWG1sTWFwcGluZ0ZpbGVSZWYoSnB0SnBhRWNsaXBzZUxpbmtDb3JlUGx1Z2luLkRFRkFVTFRfRUNMSVBTRUxJTktfT1JNX1hNTF9SVU5USU1FX1BBVEgudG9TdHJpbmcoKSk7Ci0JCU9ybVBlcnNpc3RlbnRUeXBlIG9ybVBlcnNpc3RlbnRUeXBlID0gZ2V0RW50aXR5TWFwcGluZ3MoKS5hZGRQZXJzaXN0ZW50VHlwZShNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSwgIm1vZGVsLkZvbyIpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCQlhc3NlcnRFcXVhbHMob3JtUGVyc2lzdGVudFR5cGUsIHBlcnNpc3RlbmNlVW5pdC5nZXRQZXJzaXN0ZW50VHlwZSgibW9kZWwuRm9vIikpOwotCi0JCS8vdGVzdCBwZXJzaXN0ZW50VHlwZSBmcm9tIGVjbGlwc2VsaW5rLW9ybS54bWwgZmlsZSB0aGF0IGlzIGltcGxpZWQobm90IHNwZWNpZmllZCkgaW4gdGhlIHBlcnNpc3RlbmNlLnhtbAotCQlnZXRYbWxQZXJzaXN0ZW5jZVVuaXQoKS5nZXRNYXBwaW5nRmlsZXMoKS5yZW1vdmUoMCk7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVuY2VVbml0LmdldFBlcnNpc3RlbnRUeXBlKCJtb2RlbC5Gb28iKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZDBlMmYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkdlbmVyYWxQcm9wZXJ0aWVzOwotCi0vKioKLSAqICBHZW5lcmFsQWRhcHRlclRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEdlbmVyYWxQcm9wZXJ0aWVzQWRhcHRlclRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXRUZXN0Q2FzZQotewotCXByaXZhdGUgR2VuZXJhbFByb3BlcnRpZXMgZ2VuZXJhbFByb3BlcnRpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVkgPSBHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFXzIgPSAhIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUU7Ci0KLQkKLQlwdWJsaWMgR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5nZW5lcmFsUHJvcGVydGllcyA9IHRoaXMuc3ViamVjdC5nZXRHZW5lcmFsUHJvcGVydGllcygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCQkKLQkJdGhpcy5nZW5lcmFsUHJvcGVydGllcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDE7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyAyOyAvLyBtaXNjIHByb3BlcnRpZXMKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjEiLCAidmFsdWUuMSIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX0tFWSwgRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4yIiwgInZhbHVlLjIiKTsKLQotCQlyZXR1cm47Ci0JfQotCi0JCi0JLy8gKioqKioqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fS0VZLAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVksCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFLAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlRXhjbHVkZUVjbGlwc2VsaW5rT3JtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9LRVksCi0JCQlFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFLAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBtb2RlbFZhbHVlID0gbnVsbDsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoR2VuZXJhbFByb3BlcnRpZXMuRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuZ2VuZXJhbFByb3BlcnRpZXMuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigiZ2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCQlyZXR1cm4gbW9kZWxWYWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkpCi0JCQl0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzLnNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybSgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oInNldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmdlbmVyYWxQcm9wZXJ0aWVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9HZW5lcmFsUHJvcGVydGllc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAzNTY2Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0dlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5HZW5lcmFsUHJvcGVydGllczsKLQotLyoqCi0gKiBHZW5lcmFsUHJvcGVydHlWYWx1ZU1vZGVsVGVzdHMKLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBHZW5lcmFsUHJvcGVydGllcyBnZW5lcmFsUHJvcGVydHk7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIEVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1RFU1RfVkFMVUUgPSBCb29sZWFuLkZBTFNFOwotCi0JcHVibGljIEdlbmVyYWxQcm9wZXJ0aWVzVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMuZ2VuZXJhbFByb3BlcnR5ID0gdGhpcy5zdWJqZWN0LmdldEdlbmVyYWxQcm9wZXJ0aWVzKCk7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYWxQcm9wZXJ0aWVzPiBnZW5lcmFsUHJvcGVydHlIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPEdlbmVyYWxQcm9wZXJ0aWVzPih0aGlzLmdlbmVyYWxQcm9wZXJ0eSk7Ci0JCQotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlciA9IHRoaXMuYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQShnZW5lcmFsUHJvcGVydHlIb2xkZXIpOwotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUxpc3RlbmVyID0gdGhpcy5idWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUxpc3RlbmVyKTsKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEhhc0xpc3RlbmVycygpIHsKLQkJQWJzdHJhY3RNb2RlbCBzdWJqZWN0R2VuZXJhbFByb3BlcnR5ID0gKEFic3RyYWN0TW9kZWwpIHRoaXMuZ2VuZXJhbFByb3BlcnR5OyAvLyBTdWJqZWN0Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+IGV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPEdlbmVyYWxQcm9wZXJ0aWVzLCBCb29sZWFuPikgdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1Ib2xkZXI7Ci0JCWFzc2VydFRydWUoZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKSk7Ci0JCWFzc2VydFRydWUoc3ViamVjdEdlbmVyYWxQcm9wZXJ0eS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhHZW5lcmFsUHJvcGVydGllcy5FWENMVURFX0VDTElQU0VMSU5LX09STV9QUk9QRVJUWSkpOwotCQkKLQkJZXhjbHVkZUVjbGlwc2VsaW5rT3JtQUEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtTGlzdGVuZXIpOwotCQlhc3NlcnRGYWxzZShzdWJqZWN0R2VuZXJhbFByb3BlcnR5Lmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIAotCQkJRVhDTFVERV9FQ0xJUFNFTElOS19PUk1fVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuZ2VuZXJhbFByb3BlcnR5OwotCX0KLQotCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKgotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gYnVpbGRFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQShQcm9wZXJ0eVZhbHVlTW9kZWw8R2VuZXJhbFByb3BlcnRpZXM+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8R2VuZXJhbFByb3BlcnRpZXMsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIEdlbmVyYWxQcm9wZXJ0aWVzLkVYQ0xVREVfRUNMSVBTRUxJTktfT1JNX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0RXhjbHVkZUVjbGlwc2VsaW5rT3JtKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldEV4Y2x1ZGVFY2xpcHNlbGlua09ybShlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZEV4Y2x1ZGVFY2xpcHNlbGlua09ybUNoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMudGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogRXhjbHVkZUVjbGlwc2VsaW5rT3JtICoqKioqKiogCi0JCXRoaXMudmVyaWZ5RXhjbHVkZUVjbGlwc2VsaW5rT3JtQUFWYWx1ZShFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKEdlbmVyYWxQcm9wZXJ0aWVzLkRFRkFVTFRfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIHRoaXMuZ2VuZXJhbFByb3BlcnR5LmdldERlZmF1bHRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKiAKLQkJdGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlCb29sZWFuIG5ld0V4Y2x1ZGVFY2xpcHNlbGlua09ybSA9ICFFWENMVURFX0VDTElQU0VMSU5LX09STV9URVNUX1ZBTFVFOwotCQkvLyBNb2RpZnkgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlci5zZXRWYWx1ZShuZXdFeGNsdWRlRWNsaXBzZWxpbmtPcm0pOwotCQl0aGlzLnZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUobmV3RXhjbHVkZUVjbGlwc2VsaW5rT3JtKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQlTdHJpbmcgbm90RGVsZXRlZCA9ICJQcm9wZXJ0eSBub3QgZGVsZXRlZCI7Ci0JCS8vICoqKioqKiBFeGNsdWRlRWNsaXBzZWxpbmtPcm0gKioqKioqKgotCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuZXhjbHVkZUVjbGlwc2VsaW5rT3JtSG9sZGVyLnNldFZhbHVlKG51bGwpOwotCQkvLyB0ZXN0aW5nIEhvbGRlcgotCQl0aGlzLnZlcmlmeUV4Y2x1ZGVFY2xpcHNlbGlua09ybUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5leGNsdWRlRWNsaXBzZWxpbmtPcm1FdmVudCk7Ci0JCS8vIHRlc3RpbmcgUFUgcHJvcGVydGllcwotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkoR2VuZXJhbFByb3BlcnRpZXMuRUNMSVBTRUxJTktfRVhDTFVERV9FQ0xJUFNFTElOS19PUk0sIG5vdERlbGV0ZWQpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlFeGNsdWRlRWNsaXBzZWxpbmtPcm1BQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLmdlbmVyYWxQcm9wZXJ0eS5nZXRFeGNsdWRlRWNsaXBzZWxpbmtPcm0oKSwgCi0JCQl0aGlzLmV4Y2x1ZGVFY2xpcHNlbGlua09ybUhvbGRlciwgCi0JCQlHZW5lcmFsUHJvcGVydGllcy5FQ0xJUFNFTElOS19FWENMVURFX0VDTElQU0VMSU5LX09STSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0pwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkY2RkNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9KcHRFY2xpcHNlTGlua0NvcmVQZXJzaXN0ZW5jZUNvbnRleHRNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAxMCwgMjAxMSAgT3JhY2xlLiAKLSAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgCi0gKiAgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi0gKiAgYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCi0gKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqICAKLSAqICBDb250cmlidXRvcnM6IAotICogIAlPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgSnB0RWNsaXBzZUxpbmtDb3JlUGVyc2lzdGVuY2VDb250ZXh0TW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJhbFByb3BlcnRpZXNWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoR2VuZXJhbFByb3BlcnRpZXNBZGFwdGVyVGVzdHMuY2xhc3MpOwotLy8JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb25uZWN0aW9uVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VMaW5rQ29ubmVjdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEN1c3RvbWl6YXRpb25WYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtDdXN0b21pemF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2FjaGluZ1ZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDYWNoaW5nQWRhcHRlclRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTG9nZ2luZ0FkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcHRpb25zVmFsdWVNb2RlbFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9wdGlvbnNBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMENvbm5lY3Rpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfMExvZ2dpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGluazJfME9wdGlvbnNUZXN0cy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZVBlcnNpc3RlbmNlQ29udGV4dE1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0xvZ2dpbmdBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL0xvZ2dpbmdBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3MzYzOS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkxvZ2dpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZ0xldmVsOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgbW9kZWwgb2JqZWN0cyBieSB0aGUgTG9nZ2luZyBhZGFwdGVyIHdoZW4gdGhlCi0gKiBQZXJzaXN0ZW5jZVVuaXQgY2hhbmdlcy4KLSAqLwotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgTG9nZ2luZ0FkYXB0ZXJUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIExvZ2dpbmcgbG9nZ2luZzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFVkVMX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfTEVWRUw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnaW5nTGV2ZWwgTEVWRUxfVEVTVF9WQUxVRSA9IExvZ2dpbmdMZXZlbC5maW5lOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2luZ0xldmVsIExFVkVMX1RFU1RfVkFMVUVfMiA9IExvZ2dpbmdMZXZlbC5maW5lc3Q7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19USU1FU1RBTVA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFXzIgPSAhIFRJTUVTVEFNUF9URVNUX1ZBTFVFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX0tFWSA9IExvZ2dpbmcuRUNMSVBTRUxJTktfVEhSRUFEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJFQURfVEVTVF9WQUxVRSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBUSFJFQURfVEVTVF9WQUxVRV8yID0gISBUSFJFQURfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19TRVNTSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBTRVNTSU9OX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gU0VTU0lPTl9URVNUX1ZBTFVFXzIgPSAhIFNFU1NJT05fVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTlNfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19FWENFUFRJT05TOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBFWENFUFRJT05TX1RFU1RfVkFMVUUgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gRVhDRVBUSU9OU19URVNUX1ZBTFVFXzIgPSAhIEVYQ0VQVElPTlNfVEVTVF9WQUxVRTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9LRVkgPSBMb2dnaW5nLkVDTElQU0VMSU5LX0xPR19GSUxFX0xPQ0FUSU9OOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFID0gIkM6L3RlbXAiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIgPSAiQzovdG1wIjsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfS0VZID0gTG9nZ2luZy5FQ0xJUFNFTElOS19MT0dHRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUl9URVNUX1ZBTFVFID0gTG9nZ2VyLmphdmFfbG9nZ2VyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfVEVTVF9WQUxVRV8yID0gImN1c3RvbS5sb2dnZXIudGVzdCI7Ci0JCi0JcHVibGljIExvZ2dpbmdBZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5sb2dnaW5nID0gdGhpcy5zdWJqZWN0LmdldExvZ2dpbmcoKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCi0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLmxvZ2dpbmcuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihMb2dnaW5nLlRJTUVTVEFNUF9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5TRVNTSU9OX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5sb2dnaW5nLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoTG9nZ2luZy5MT0dfRklMRV9MT0NBVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMubG9nZ2luZy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMSIsICJ2YWx1ZS4xIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVElNRVNUQU1QX0tFWSwgVElNRVNUQU1QX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTEVWRUxfS0VZLCBMRVZFTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShUSFJFQURfS0VZLCBUSFJFQURfVEVTVF9WQUxVRS50b1N0cmluZygpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShTRVNTSU9OX0tFWSwgU0VTU0lPTl9URVNUX1ZBTFVFLnRvU3RyaW5nKCkpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KEVYQ0VQVElPTlNfS0VZLCBFWENFUFRJT05TX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoTE9HX0ZJTEVfTE9DQVRJT05fS0VZLCBMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShMT0dHRVJfS0VZLCBMT0dHRVJfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMZXZlbCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxFVkVMX0tFWSwKLQkJCUxFVkVMX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJTEVWRUxfS0VZLAotCQkJTEVWRUxfVEVTVF9WQUxVRSwKLQkJCUxFVkVMX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUxldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMRVZFTF9LRVksCi0JCQlMRVZFTF9URVNUX1ZBTFVFLAotCQkJTEVWRUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRpbWVzdGFtcCB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRpbWVzdGFtcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUSU1FU1RBTVBfS0VZLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVRpbWVzdGFtcCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVElNRVNUQU1QX0tFWSwKLQkJCVRJTUVTVEFNUF9URVNUX1ZBTFVFLAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBUaHJlYWQgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJVEhSRUFEX0tFWSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRIUkVBRF9LRVksCi0JCQlUSFJFQURfVEVTVF9WQUxVRSwKLQkJCVRIUkVBRF9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbiB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJU0VTU0lPTl9LRVksCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTl9LRVksCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fS0VZLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogRXhjZXB0aW9ucyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRVhDRVBUSU9OU19LRVksCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUUsCi0JCQlFWENFUFRJT05TX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlFWENFUFRJT05TX0tFWSwKLQkJCUVYQ0VQVElPTlNfVEVTVF9WQUxVRSwKLQkJCUVYQ0VQVElPTlNfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIExvZ0ZpbGVMb2NhdGlvbiAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldExvZ0ZpbGVMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlMT0dfRklMRV9MT0NBVElPTl9LRVksCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX0tFWSwKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVMb2dGaWxlTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX0tFWSwKLQkJCUxPR19GSUxFX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlMT0dfRklMRV9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbXB0eUZpbGVMb2NhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgcHVLZXkgPSBMT0dfRklMRV9MT0NBVElPTl9LRVk7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0KLQkJLy8gU2V0IEZpbGVMb2NhdGlvbiB0byAiIiAmIHZlcmlmeSB0aGF0IHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkCi0JCXRoaXMudmVyaWZ5UHVIYXNQcm9wZXJ0eShwdUtleSwgICJwZXJzaXN0ZW5jZVVuaXQucHJvcGVydGllcyBkb2Vzbid0IGNvbnRhaW5zOiAiKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsICIiKTsKLQotCQl0aGlzLnZlcmlmeVB1SGFzTm90UHJvcGVydHkocHVLZXksICAiUHJvcGVydHkgd2FzIG5vdCBkZWxldGVkIik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KSk7Ci0JfQotCQotCS8vICoqKioqKioqKiogTG9nZ2VyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TG9nZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUxPR0dFUl9LRVksCi0JCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihMT0dHRVJfVEVTVF9WQUxVRSkpOyAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJLy8gdmVyaWZ5IHNldCBlbnVtIHZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRMb2dnZXIoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlTG9nZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlMT0dHRVJfS0VZLAotCQkJTE9HR0VSX1RFU1RfVkFMVUUsCi0JCQlMT0dHRVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgc2V0dGluZyBjdXN0b20gbG9nZ2VyIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRMb2dnZXIoU3RyaW5nIGVsS2V5LCBPYmplY3QgdGVzdFZhbHVlMSwgT2JqZWN0IHRlc3RWYWx1ZTIpIHRocm93cyBFeGNlcHRpb24gewotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCQkvLyB0ZXN0IHNldCBjdXN0b20gbG9nZ2VyLgotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0KLQkJLy8gdGVzdCBzZXQgKExvZ2dlcikgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoTG9nZ2VyKSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQkJCi0JCS8vIHRlc3Qgc2V0IGVudW0gbGl0ZXJhbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTEudG9TdHJpbmcoKSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YodGVzdFZhbHVlMSkpOwotCi0JCS8vIHRlc3Qgc2V0IChTdHJpbmcpIG51bGwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMubG9nZ2luZy5zZXRMb2dnZXIoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxFVkVMX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRMZXZlbCgoTG9nZ2luZ0xldmVsKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USU1FU1RBTVBfUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldFRpbWVzdGFtcCgoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVEhSRUFEX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRUaHJlYWQoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldFNlc3Npb24oKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkVYQ0VQVElPTlNfUFJPUEVSVFkpKQotCQkJdGhpcy5sb2dnaW5nLnNldEV4Y2VwdGlvbnMoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR19GSUxFX0xPQ0FUSU9OX1BST1BFUlRZKSkKLQkJCXRoaXMubG9nZ2luZy5zZXRMb2dGaWxlTG9jYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HR0VSX1BST1BFUlRZKSkgewotCQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoTG9nZ2VyKSBuZXdWYWx1ZSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5sb2dnaW5nLnNldExvZ2dlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCX0KLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTEVWRUxfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMZXZlbCgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0VGltZXN0YW1wKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5USFJFQURfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRUaHJlYWQoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLlNFU1NJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRTZXNzaW9uKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5FWENFUFRJT05TX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLmxvZ2dpbmcuZ2V0RXhjZXB0aW9ucygpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKExvZ2dpbmcuTE9HX0ZJTEVfTE9DQVRJT05fUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMubG9nZ2luZy5nZXRMb2dGaWxlTG9jYXRpb24oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhMb2dnaW5nLkxPR0dFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5sb2dnaW5nLmdldExvZ2dlcigpOwotCQllbHNlCi0JCQl0aGlzLnRocm93TWlzc2luZ0RlZmluaXRpb24oImdldFByb3BlcnR5IiwgcHJvcGVydHlOYW1lKTsKLQkJcmV0dXJuIG1vZGVsVmFsdWU7Ci0JfQotCQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVB1dFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBleHBlY3RlZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGV4cGVjdGVkVmFsdWVfID0gZXhwZWN0ZWRWYWx1ZTsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoTG9nZ2luZy5MT0dHRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gKGV4cGVjdGVkVmFsdWUgIT0gbnVsbCAmJiBleHBlY3RlZFZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpID8KLQkJCQl0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihMT0dHRVJfVEVTVF9WQUxVRSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlOwotCQl9Ci0JCXN1cGVyLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgZXhwZWN0ZWRWYWx1ZV8pOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMubG9nZ2luZzsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9Mb2dnaW5nVmFsdWVNb2RlbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNzQwY2IuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlByb3BlcnR5QXNwZWN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Qcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLldyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuTG9nZ2luZzsKLQotLyoqCi0gKiBMb2dnaW5nVmFsdWVNb2RlbFRlc3RzCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIExvZ2dpbmdWYWx1ZU1vZGVsVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBMb2dnaW5nIGxvZ2dpbmc7Ci0KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPEJvb2xlYW4+IHRpbWVzdGFtcEhvbGRlcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgdGltZXN0YW1wTGlzdGVuZXI7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUV2ZW50IHRpbWVzdGFtcEV2ZW50OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRJTUVTVEFNUF9URVNUX1ZBTFVFID0gQm9vbGVhbi5GQUxTRTsKLQotCXB1YmxpYyBMb2dnaW5nVmFsdWVNb2RlbFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXRoaXMubG9nZ2luZyA9IHRoaXMuc3ViamVjdC5nZXRMb2dnaW5nKCk7IC8vIFN1YmplY3QKLQkJUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+IGxvZ2dpbmdIb2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPExvZ2dpbmc+KHRoaXMubG9nZ2luZyk7Ci0JCQotCQl0aGlzLnRpbWVzdGFtcEhvbGRlciA9IHRoaXMuYnVpbGRUaW1lc3RhbXBBQShsb2dnaW5nSG9sZGVyKTsKLQkJdGhpcy50aW1lc3RhbXBMaXN0ZW5lciA9IHRoaXMuYnVpbGRUaW1lc3RhbXBDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLnRpbWVzdGFtcEhvbGRlci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50aW1lc3RhbXBMaXN0ZW5lcik7Ci0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RIYXNMaXN0ZW5lcnMoKSB7Ci0JCUFic3RyYWN0TW9kZWwgc3ViamVjdExvZ2dpbmcgPSAoQWJzdHJhY3RNb2RlbCkgdGhpcy5sb2dnaW5nOyAvLyBTdWJqZWN0Ci0JCQotCQlQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4gdGltZXN0YW1wQUEgPSAKLQkJCShQcm9wZXJ0eUFzcGVjdEFkYXB0ZXI8TG9nZ2luZywgQm9vbGVhbj4pIHRoaXMudGltZXN0YW1wSG9sZGVyOwotCQlhc3NlcnRUcnVlKHRpbWVzdGFtcEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCQlhc3NlcnRUcnVlKHN1YmplY3RMb2dnaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSk7Ci0JCQotCQl0aW1lc3RhbXBBQS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSwgdGhpcy50aW1lc3RhbXBMaXN0ZW5lcik7Ci0JCWFzc2VydEZhbHNlKHN1YmplY3RMb2dnaW5nLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKHRpbWVzdGFtcEFBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJTG9nZ2luZy5FQ0xJUFNFTElOS19USU1FU1RBTVAsIAotCQkJVElNRVNUQU1QX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLmxvZ2dpbmc7Ci0JfQotCi0JLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZFRpbWVzdGFtcEFBKFByb3BlcnR5VmFsdWVNb2RlbDxMb2dnaW5nPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPExvZ2dpbmcsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIExvZ2dpbmcuVElNRVNUQU1QX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBCb29sZWFuIGJ1aWxkVmFsdWVfKCkgewotCQkJCXJldHVybiB0aGlzLnN1YmplY3QuZ2V0VGltZXN0YW1wKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKEJvb2xlYW4gZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldFRpbWVzdGFtcChlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZFRpbWVzdGFtcENoYW5nZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBlKSB7Ci0JCQkJTG9nZ2luZ1ZhbHVlTW9kZWxUZXN0cy50aGlzLnRpbWVzdGFtcEV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvLyAqKioqKiogVGVzdHMgKioqKioqKiAKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8vICoqKioqKiBUaW1lc3RhbXAgKioqKioqKiAKLQkJdGhpcy52ZXJpZnlUaW1lc3RhbXBBQVZhbHVlKFRJTUVTVEFNUF9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKExvZ2dpbmcuREVGQVVMVF9USU1FU1RBTVAsIHRoaXMubG9nZ2luZy5nZXREZWZhdWx0VGltZXN0YW1wKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyAqKioqKiogVGltZXN0YW1wICoqKioqKiogCi0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnRpbWVzdGFtcEhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJQm9vbGVhbiBuZXdUaW1lc3RhbXAgPSAhVElNRVNUQU1QX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMudGltZXN0YW1wSG9sZGVyLnNldFZhbHVlKG5ld1RpbWVzdGFtcCk7Ci0JCXRoaXMudmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShuZXdUaW1lc3RhbXApOwotCQlhc3NlcnROb3ROdWxsKHRoaXMudGltZXN0YW1wRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIFRpbWVzdGFtcCAqKioqKioqCi0JCXRoaXMudGltZXN0YW1wRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy50aW1lc3RhbXBIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5VGltZXN0YW1wQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLnRpbWVzdGFtcEV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCwgbm90RGVsZXRlZCk7Ci0JfQotCi0JLy8gKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKgotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhyZWUgdmFsdWUgdGVzdHM6PGJyPgotCSAqIDEuIHN1YmplY3QgdmFsdWU8YnI+Ci0JICogMi4gYXNwZWN0IGFkYXB0ZXIgdmFsdWU8YnI+Ci0JICogMy4gcGVyc2lzdGVuY2VVbml0IHByb3BlcnR5IHZhbHVlPGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVRpbWVzdGFtcEFBVmFsdWUoQm9vbGVhbiB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLCAKLQkJCXRoaXMubG9nZ2luZy5nZXRUaW1lc3RhbXAoKSwgCi0JCQl0aGlzLnRpbWVzdGFtcEhvbGRlciwgCi0JCQlMb2dnaW5nLkVDTElQU0VMSU5LX1RJTUVTVEFNUCk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnNBZGFwdGVyVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY0ZjMzYy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9PcHRpb25zQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0qIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0qIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0qIAotKiBDb250cmlidXRvcnM6Ci0qICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3B0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5UYXJnZXREYXRhYmFzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5UYXJnZXRTZXJ2ZXI7Ci0KLS8qKgotICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBtb2RlbCBvYmplY3RzIGJ5IHRoZSBPcHRpb24gYWRhcHRlciB3aGVuIHRoZQotICogUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9wdGlvbnNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBPcHRpb25zIG9wdGlvbnM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTl9OQU1FX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTl9OQU1FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSA9ICJzZXNzaW9uLW5hbWUudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbi1uYW1lLTIudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VTU0lPTlNfWE1MX0tFWSA9IE9wdGlvbnMuRUNMSVBTRUxJTktfU0VTU0lPTlNfWE1MOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OU19YTUxfVEVTVF9WQUxVRSA9ICJzZXNzaW9ucy14bWwudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFXzIgPSAic2Vzc2lvbnMteG1sLTIudGVzdCI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfREFUQUJBU0VfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19UQVJHRVRfREFUQUJBU0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBUYXJnZXREYXRhYmFzZSBUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSA9IFRhcmdldERhdGFiYXNlLmNsb3Vkc2NhcGU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0RGF0YWJhc2UudGVzdCI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFSR0VUX1NFUlZFUl9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RBUkdFVF9TRVJWRVI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGFyZ2V0U2VydmVyIFRBUkdFVF9TRVJWRVJfVEVTVF9WQUxVRSA9IFRhcmdldFNlcnZlci53ZWJsb2dpY185OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUVfMiA9ICJjdXN0b20udGFyZ2V0U2VydmVyLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQm9vbGVhbiBJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUVfMiA9ICEgSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZID0gT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0VWRU5UX0xJU1RFTkVSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSA9ICJhY21lLkN1c3RvbVNlc3Npb25FdmVudExpc3RlbmVyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUVfMiA9ICJvcmFjbGUuc2Vzc2lvbnMuQ3VzdG9tU2Vzc2lvbkV2ZW50TGlzdGVuZXIiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUE9SQUxfTVVUQUJMRV9LRVkgPSBPcHRpb25zLkVDTElQU0VMSU5LX1RFTVBPUkFMX01VVEFCTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSA9IHRydWU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCb29sZWFuIFRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yID0gISBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUU7Ci0KLQlwdWJsaWMgT3B0aW9uc0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLmJ1aWxkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLm9wdGlvbnMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25zLlRBUkdFVF9EQVRBQkFTRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMub3B0aW9ucy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKAotCQkJT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5vcHRpb25zLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4KLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbCA9IDc7Ci0JCXRoaXMucHJvcGVydGllc1RvdGFsID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWwgKyA0OyAvLyA0IG1pc2MgcHJvcGVydGllcwotCQl0aGlzLm1vZGVsUHJvcGVydGllc1NpemUgPSB0aGlzLm1vZGVsUHJvcGVydGllc1NpemVPcmlnaW5hbDsKLQkJCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoU0VTU0lPTl9OQU1FX0tFWSwgU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05TX1hNTF9LRVksIFNFU1NJT05TX1hNTF9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgibWlzYy5wcm9wZXJ0eS4xIiwgInZhbHVlLjEiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksIElOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoIm1pc2MucHJvcGVydHkuMyIsICJ2YWx1ZS4zIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoVEFSR0VUX0RBVEFCQVNFX0tFWSwgVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRBUkdFVF9TRVJWRVJfS0VZLCBUQVJHRVRfU0VSVkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLCBTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX1RFU1RfVkFMVUUpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJtaXNjLnByb3BlcnR5LjQiLCAidmFsdWUuNCIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KFRFTVBPUkFMX01VVEFCTEVfS0VZLCBURU1QT1JBTF9NVVRBQkxFX1RFU1RfVkFMVUUudG9TdHJpbmcoKSk7Ci0JCXJldHVybjsKLQl9Ci0JCi0JLy8gKioqKioqKioqKiBMaXN0ZW5lcnMgKioqKioqKioqKgotCi0JLy8gKioqKioqKioqKiBTZXNzaW9uTmFtZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFNlc3Npb25OYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlTRVNTSU9OX05BTUVfS0VZLAotCQkJU0VTU0lPTl9OQU1FX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlU2Vzc2lvbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVNFU1NJT05fTkFNRV9LRVksCi0JCQlTRVNTSU9OX05BTUVfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogU2Vzc2lvbnNYbWwgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRTZXNzaW9uc1htbCgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJU0VTU0lPTlNfWE1MX0tFWSwKLQkJCVNFU1NJT05TX1hNTF9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZVNlc3Npb25zWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OU19YTUxfS0VZLAotCQkJU0VTU0lPTlNfWE1MX1RFU1RfVkFMVUUsCi0JCQlTRVNTSU9OU19YTUxfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19LRVksCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX0tFWSwKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUsCi0JCQlJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogVGFyZ2V0RGF0YWJhc2UgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUpKTsgLy8gbW9kZWwgaXMgc3RvcmluZyBFY2xpcHNlTGlua1N0cmluZ1ZhbHVlCi0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlUQVJHRVRfREFUQUJBU0VfS0VZLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUUsCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRV8yKTsKLQkJLy8gdmVyaWZ5IHNldCBjdXN0b20gYW5kIGxpdGVyYWwgdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRUYXJnZXREYXRhYmFzZSgKLQkJCVRBUkdFVF9EQVRBQkFTRV9LRVksCi0JCQlUQVJHRVRfREFUQUJBU0VfVEVTVF9WQUxVRSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXREYXRhYmFzZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJVEFSR0VUX0RBVEFCQVNFX0tFWSwKLQkJCVRBUkdFVF9EQVRBQkFTRV9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX0RBVEFCQVNFX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIHNldHRpbmcgY3VzdG9tIHRhcmdldERhdGFiYXNlIGFuZCBsaXRlcmFscy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlTZXRUYXJnZXREYXRhYmFzZShTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXREYXRhYmFzZS4KLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRlc3RWYWx1ZTIpOwotCi0JCS8vIHRlc3Qgc2V0IChUYXJnZXREYXRhYmFzZSkgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JCQotCQkvLyB0ZXN0IHNldCBlbnVtIGxpdGVyYWwKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUxLnRvU3RyaW5nKCkpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKHRlc3RWYWx1ZTEpKTsKLQotCQkvLyB0ZXN0IHNldCAoU3RyaW5nKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbnVsbCk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShlbEtleSkpOwotCQl0aGlzLnZlcmlmeVB1dFByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0JfQotCQotCS8vICoqKioqKioqKiogVGFyZ2V0U2VydmVyIHRlc3RzICoqKioqKioqKioKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VGFyZ2V0U2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFKSk7IC8vIG1vZGVsIGlzIHN0b3JpbmcgRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZQotCQkvLyB2ZXJpZnkgc2V0IGVudW0gdmFsdWUKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCQkvLyB2ZXJpZnkgc2V0IGN1c3RvbSBhbmQgbGl0ZXJhbCB2YWx1ZQotCQl0aGlzLnZlcmlmeVNldFRhcmdldFNlcnZlcigKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVUYXJnZXRTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCVRBUkdFVF9TRVJWRVJfS0VZLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFLAotCQkJVEFSR0VUX1NFUlZFUl9URVNUX1ZBTFVFXzIpOwotCX0KLQkKLQkvKioKLQkgKiBWZXJpZmllcyBzZXR0aW5nIGN1c3RvbSB0YXJnZXRTZXJ2ZXIgYW5kIGxpdGVyYWxzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZlcmlmeVNldFRhcmdldFNlcnZlcihTdHJpbmcgZWxLZXksIE9iamVjdCB0ZXN0VmFsdWUxLCBPYmplY3QgdGVzdFZhbHVlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpOwotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gdGhpcy5nZXRNb2RlbCgpLnByb3BlcnR5SWRPZihwcm9wZXJ0eSk7Ci0JCS8vIHRlc3Qgc2V0IGN1c3RvbSB0YXJnZXRTZXJ2ZXIuCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMik7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0ZXN0VmFsdWUyKTsKLQotCQkvLyB0ZXN0IHNldCAoVGFyZ2V0U2VydmVyKSBudWxsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoZWxLZXkpKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQkKLQkJLy8gdGVzdCBzZXQgZW51bSBsaXRlcmFsCi0JCXRoaXMuY2xlYXJFdmVudCgpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgdGVzdFZhbHVlMS50b1N0cmluZygpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZih0ZXN0VmFsdWUxKSk7Ci0KLQkJLy8gdGVzdCBzZXQgKFN0cmluZykgbnVsbAotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KGVsS2V5KSk7Ci0JCXRoaXMudmVyaWZ5UHV0UHJvcGVydHkocHJvcGVydHlOYW1lLCBudWxsKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIEV2ZW50TGlzdGVuZXIgdGVzdHMgKioqKioqKioqKgotCXB1YmxpYyB2b2lkIHRlc3RTZXRFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfS0VZLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFLAotCQkJU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVFdmVudExpc3RlbmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlTRVNTSU9OX0VWRU5UX0xJU1RFTkVSX0tFWSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRSwKLQkJCVNFU1NJT05fRVZFTlRfTElTVEVORVJfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIFRlbXBvcmFsTXV0YWJsZSB0ZXN0cyAqKioqKioqKioqCi0JcHVibGljIHZvaWQgdGVzdFNldFRlbXBvcmFsTXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlVGVtcG9yYWxNdXRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlURU1QT1JBTF9NVVRBQkxFX0tFWSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRSwKLQkJCVRFTVBPUkFMX01VVEFCTEVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRTZXNzaW9uTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OU19YTUxfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldFNlc3Npb25zWG1sKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKQotCQkJdGhpcy5vcHRpb25zLnNldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygoQm9vbGVhbikgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0RGF0YWJhc2VQcm9wZXJ0eShuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfU0VSVkVSX1BST1BFUlRZKSkKLQkJCXRoaXMuc2V0VGFyZ2V0U2VydmVyUHJvcGVydHkobmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0RXZlbnRMaXN0ZW5lcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5URU1QT1JBTF9NVVRBQkxFX1BST1BFUlRZKSkKLQkJCXRoaXMub3B0aW9ucy5zZXRUZW1wb3JhbE11dGFibGUoKEJvb2xlYW4pIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJzZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFRhcmdldERhdGFiYXNlUHJvcGVydHkoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChuZXdWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldERhdGFiYXNlKChUYXJnZXREYXRhYmFzZSkgbmV3VmFsdWUpOwotCQllbHNlCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0RGF0YWJhc2UoKFN0cmluZykgbmV3VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUYXJnZXRTZXJ2ZXJQcm9wZXJ0eShPYmplY3QgbmV3VmFsdWUpIHsKLQkJaWYgKG5ld1ZhbHVlLmdldENsYXNzKCkuaXNFbnVtKCkpCi0JCQl0aGlzLm9wdGlvbnMuc2V0VGFyZ2V0U2VydmVyKChUYXJnZXRTZXJ2ZXIpIG5ld1ZhbHVlKTsKLQkJZWxzZQotCQkJdGhpcy5vcHRpb25zLnNldFRhcmdldFNlcnZlcigoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlPYmplY3QgbW9kZWxWYWx1ZSA9IG51bGw7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9OQU1FX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0U2Vzc2lvbk5hbWUoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlNFU1NJT05TX1hNTF9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFNlc3Npb25zWG1sKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLm9wdGlvbnMuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoT3B0aW9ucy5UQVJHRVRfREFUQUJBU0VfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUYXJnZXREYXRhYmFzZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX1NFUlZFUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldFRhcmdldFNlcnZlcigpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuU0VTU0lPTl9FVkVOVF9MSVNURU5FUl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5vcHRpb25zLmdldEV2ZW50TGlzdGVuZXIoKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRFTVBPUkFMX01VVEFCTEVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMub3B0aW9ucy5nZXRUZW1wb3JhbE11dGFibGUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlQdXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBleHBlY3RlZFZhbHVlXyA9IGV4cGVjdGVkVmFsdWU7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKE9wdGlvbnMuVEFSR0VUX0RBVEFCQVNFX1BST1BFUlRZKSB8fAotCQkJcHJvcGVydHlOYW1lLmVxdWFscyhPcHRpb25zLlRBUkdFVF9TRVJWRVJfUFJPUEVSVFkpKSB7Ci0JCQkKLQkJCWV4cGVjdGVkVmFsdWVfID0gdGhpcy5jb252ZXJ0VG9FY2xpcHNlTGlua1N0cmluZ1ZhbHVlKGV4cGVjdGVkVmFsdWUpOwotCQl9Ci0JCQotCQlzdXBlci52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGV4cGVjdGVkVmFsdWVfKTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydFRvRWNsaXBzZUxpbmtTdHJpbmdWYWx1ZShPYmplY3QgZXhwZWN0ZWRWYWx1ZSkgewotCQlyZXR1cm4gKFN0cmluZykgKChleHBlY3RlZFZhbHVlICE9IG51bGwgJiYgZXhwZWN0ZWRWYWx1ZS5nZXRDbGFzcygpLmlzRW51bSgpKSA/Ci0JCQkJdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoZXhwZWN0ZWRWYWx1ZSkgOiAvLyBtb2RlbCBpcyBzdG9yaW5nIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQkJCQlleHBlY3RlZFZhbHVlKTsgLy8gYWxyZWFkeSBhIEVjbGlwc2VMaW5rU3RyaW5nVmFsdWUKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWUxODM4Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL09wdGlvbnNWYWx1ZU1vZGVsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5Qcm9wZXJ0eUFzcGVjdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLlNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5Xcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk9wdGlvbnM7Ci0KLS8qKgotICogT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cwotICovCi1wdWJsaWMgY2xhc3MgT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIE9wdGlvbnMgb3B0aW9uczsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8Qm9vbGVhbj4gaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNMaXN0ZW5lcjsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlRXZlbnQgaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEJvb2xlYW4gSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfVEVTVF9WQUxVRSA9IEJvb2xlYW4uRkFMU0U7Ci0KLQlwdWJsaWMgT3B0aW9uc1ZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLm9wdGlvbnMgPSB0aGlzLnN1YmplY3QuZ2V0T3B0aW9ucygpOyAvLyBTdWJqZWN0Ci0JCVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBvcHRpb25zSG9sZGVyID0gbmV3IFNpbXBsZVByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPih0aGlzLm9wdGlvbnMpOwotCQkKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIgPSB0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUEob3B0aW9uc0hvbGRlcik7Ci0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXIgPSB0aGlzLmJ1aWxkSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQ2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzTGlzdGVuZXIpOwotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SGFzTGlzdGVuZXJzKCkgewotCQlBYnN0cmFjdE1vZGVsIHN1YmplY3RPcHRpb25zID0gKEFic3RyYWN0TW9kZWwpIHRoaXMub3B0aW9uczsgLy8gU3ViamVjdAotCQkKLQkJUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+IGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBID0gCi0JCQkoUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KSB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0hvbGRlcjsKLQkJYXNzZXJ0VHJ1ZShpbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQS5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpKTsKLQkJYXNzZXJ0VHJ1ZShzdWJqZWN0T3B0aW9ucy5oYXNBbnlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVycyhPcHRpb25zLlNFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVNfUFJPUEVSVFkpKTsKLQkJCi0JCWluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFLCB0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0xpc3RlbmVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3ViamVjdE9wdGlvbnMuaGFzQW55UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcnMoT3B0aW9ucy5TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1BST1BFUlRZKSk7Ci0JCWFzc2VydEZhbHNlKGluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBLmhhc0FueVByb3BlcnR5Q2hhbmdlTGlzdGVuZXJzKFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSkpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiAKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KAotCQkJT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCAKLQkJCUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXMgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm9wdGlvbnM7Ci0JfQotCi0JLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxCb29sZWFuPiBidWlsZEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0FBKFByb3BlcnR5VmFsdWVNb2RlbDxPcHRpb25zPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPE9wdGlvbnMsIEJvb2xlYW4+KHN1YmplY3RIb2xkZXIsIE9wdGlvbnMuU0VTU0lPTl9JTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19QUk9QRVJUWSkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgQm9vbGVhbiBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpOwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIHNldFZhbHVlXyhCb29sZWFuIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZSkgewotCQkJCU9wdGlvbnNWYWx1ZU1vZGVsVGVzdHMudGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqIFRlc3RzICoqKioqKiogCi0JcHVibGljIHZvaWQgdGVzdFZhbHVlKCkgewotCQkvLyAqKioqKiogSW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzICoqKioqKiogCi0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShJTkNMVURFX0RFU0NSSVBUT1JfUVVFUklFU19URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKE9wdGlvbnMuREVGQVVMVF9TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTLCB0aGlzLm9wdGlvbnMuZ2V0RGVmYXVsdEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqIAotCQl0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50ID0gbnVsbDsKLQkJdGhpcy52ZXJpZnlIYXNMaXN0ZW5lcnModGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIsIFByb3BlcnR5VmFsdWVNb2RlbC5WQUxVRSk7Ci0JCUJvb2xlYW4gbmV3SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzID0gIUlOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTX1RFU1RfVkFMVUU7Ci0JCS8vIE1vZGlmeSB0aGUgcHJvcGVydHkgaG9sZGVyCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzSG9sZGVyLnNldFZhbHVlKG5ld0luY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyk7Ci0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShuZXdJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXMpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROdWxsVmFsdWUoKSB7Ci0JCVN0cmluZyBub3REZWxldGVkID0gIlByb3BlcnR5IG5vdCBkZWxldGVkIjsKLQkJLy8gKioqKioqIEluY2x1ZGVEZXNjcmlwdG9yUXVlcmllcyAqKioqKioqCi0JCXRoaXMuaW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzRXZlbnQgPSBudWxsOwotCQkvLyBTZXR0aW5nIHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzQUFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbCh0aGlzLmluY2x1ZGVEZXNjcmlwdG9yUXVlcmllc0V2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShPcHRpb25zLkVDTElQU0VMSU5LX1NFU1NJT05fSU5DTFVERV9ERVNDUklQVE9SX1FVRVJJRVMsIG5vdERlbGV0ZWQpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlJbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNBQVZhbHVlKEJvb2xlYW4gdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwgCi0JCQl0aGlzLm9wdGlvbnMuZ2V0SW5jbHVkZURlc2NyaXB0b3JRdWVyaWVzKCksIAotCQkJdGhpcy5pbmNsdWRlRGVzY3JpcHRvclF1ZXJpZXNIb2xkZXIsIAotCQkJT3B0aW9ucy5FQ0xJUFNFTElOS19TRVNTSU9OX0lOQ0xVREVfREVTQ1JJUFRPUl9RVUVSSUVTKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIGdldC9zZXQgcHJvcGVydHkgKioqKioqKioqKgotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCBuZXdWYWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkFkYXB0ZXJUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTY2NmNlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5jb250ZXh0LnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5TY2hlbWFHZW5lcmF0aW9uOwotCi0vKioKLSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBtb2RlbCBvYmplY3QgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotICogd2hlbiB0aGUgUGVyc2lzdGVuY2VVbml0IGNoYW5nZXMuCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERExfR0VORVJBVElPTl9UWVBFX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMiA9IERkbEdlbmVyYXRpb25UeXBlLm5vbmU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVVRQVVRfTU9ERV9LRVkgPSBTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFID0gT3V0cHV0TW9kZS5zcWxfc2NyaXB0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT3V0cHV0TW9kZSBPVVRQVVRfTU9ERV9URVNUX1ZBTFVFXzIgPSBPdXRwdXRNb2RlLmRhdGFiYXNlOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENSRUFURV9GSUxFX05BTUVfS0VZID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19DUkVBVEVfRklMRV9OQU1FOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUgPSAiY3JlYXRlLWZpbGUtbmFtZS50ZXN0IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIgPSAiY3JlYXRlLWZpbGUtbmFtZS0yLnRlc3QiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRFJPUF9GSUxFX05BTUU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUgPSAiZHJvcC1maWxlLW5hbWUudGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMiA9ICJkcm9wLWZpbGUtbmFtZS0yLnRlc3QiOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSA9IFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfQVBQTElDQVRJT05fTE9DQVRJT047Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUgPSAiQzovdGVtcCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMiA9ICJDOi90bXAiOwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25BZGFwdGVyVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJCi0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lciA9IHRoaXMuYnVpbGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFksIHByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpOwotCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihTY2hlbWFHZW5lcmF0aW9uLkRST1BfRklMRV9OQU1FX1BST1BFUlRZLCBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IDk7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gNTsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShPVVRQVVRfTU9ERV9LRVksIHRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuMiIsICJ2YWx1ZS4yIik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjMiLCAidmFsdWUuMyIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS40IiwgInZhbHVlLjQiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShERExfR0VORVJBVElPTl9UWVBFX0tFWSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoQ1JFQVRFX0ZJTEVfTkFNRV9LRVksIENSRUFURV9GSUxFX05BTUVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoRFJPUF9GSUxFX05BTUVfS0VZLCBEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShBUFBMSUNBVElPTl9MT0NBVElPTl9LRVksIEFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUpOwotCQlyZXR1cm47Ci0JfQotCi0JLy8gKioqKioqKioqKiBDcmVhdGVGaWxlTmFtZSAqKioqKioqKioqCi0JLyoqCi0JICogVGVzdHMgdGhlIHVwZGF0ZSBvZiBDcmVhdGVGaWxlTmFtZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbgotCSAqIGFkYXB0ZXIgd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldENyZWF0ZUZpbGVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUNSRUFURV9GSUxFX05BTUVfS0VZLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCUNSRUFURV9GSUxFX05BTUVfS0VZLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVDcmVhdGVGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJQ1JFQVRFX0ZJTEVfTkFNRV9LRVksCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlDUkVBVEVfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCQotCS8vICoqKioqKioqKiogRHJvcEZpbGVOYW1lICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIERyb3BGaWxlTmFtZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCi0JICogd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldERyb3BGaWxlTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeU1vZGVsSW5pdGlhbGl6ZWQoCi0JCQlEUk9QX0ZJTEVfTkFNRV9LRVksCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFKTsKLQkJdGhpcy52ZXJpZnlTZXRQcm9wZXJ0eSgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUUsCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVEcm9wRmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCURST1BfRklMRV9OQU1FX0tFWSwgCi0JCQlEUk9QX0ZJTEVfTkFNRV9URVNUX1ZBTFVFLCAKLQkJCURST1BfRklMRV9OQU1FX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JLy8gKioqKioqKioqKiBBcHBsaWNhdGlvbkxvY2F0aW9uICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIEFwcGxpY2F0aW9uTG9jYXRpb24gcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24KLQkgKiBhZGFwdGVyIHdoZW4gdGhlIFBVIG9yIHRoZSBtb2RlbCBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RTZXRBcHBsaWNhdGlvbkxvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5TW9kZWxJbml0aWFsaXplZCgKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fS0VZLAotCQkJQVBQTElDQVRJT05fTE9DQVRJT05fVEVTVF9WQUxVRSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZUFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlBZGRSZW1vdmVQcm9wZXJ0eSgKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX0tFWSwKLQkJCUFQUExJQ0FUSU9OX0xPQ0FUSU9OX1RFU1RfVkFMVUUsCi0JCQlBUFBMSUNBVElPTl9MT0NBVElPTl9URVNUX1ZBTFVFXzIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRFbXB0eUFwcGxpY2F0aW9uTG9jYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHB1S2V5ID0gQVBQTElDQVRJT05fTE9DQVRJT05fS0VZOwotCQlQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHkgcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KHB1S2V5KTsKLQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IHRoaXMuZ2V0TW9kZWwoKS5wcm9wZXJ0eUlkT2YocHJvcGVydHkpOwotCi0JCS8vIFNldCBBcHBsaWNhdGlvbkxvY2F0aW9uIHRvICIiICYgdmVyaWZ5IHRoYXQgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQKLQkJdGhpcy52ZXJpZnlQdUhhc1Byb3BlcnR5KHB1S2V5LCAgInBlcnNpc3RlbmNlVW5pdC5wcm9wZXJ0aWVzIGRvZXNuJ3QgY29udGFpbnM6ICIpOwotCQl0aGlzLnNldFByb3BlcnR5KHByb3BlcnR5TmFtZSwgIiIpOwotCi0JCXRoaXMudmVyaWZ5UHVIYXNOb3RQcm9wZXJ0eShwdUtleSwgICJQcm9wZXJ0eSB3YXMgbm90IGRlbGV0ZWQiKTsKLQkJdGhpcy52ZXJpZnlQdXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIG51bGwpOwotCQlhc3NlcnROdWxsKHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkocHVLZXkpKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIE91dHB1dE1vZGUgKioqKioqKioqKgotCS8qKgotCSAqIFRlc3RzIHRoZSB1cGRhdGUgb2YgT3V0cHV0TW9kZSBwcm9wZXJ0eSBieSB0aGUgU2NoZW1hR2VuZXJhdGlvbiBhZGFwdGVyCi0JICogd2hlbiB0aGUgUFUgb3IgdGhlIG1vZGVsIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNldE91dHB1dE1vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJT1VUUFVUX01PREVfS0VZLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMudmVyaWZ5U2V0UHJvcGVydHkoCi0JCQlPVVRQVVRfTU9ERV9LRVksCi0JCQlPVVRQVVRfTU9ERV9URVNUX1ZBTFVFLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVtb3ZlT3V0cHV0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0aGlzLnZlcmlmeUFkZFJlbW92ZVByb3BlcnR5KAotCQkJT1VUUFVUX01PREVfS0VZLCAKLQkJCU9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yKTsKLQl9Ci0KLQkvLyAqKioqKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKioqKioKLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIERkbEdlbmVyYXRpb25UeXBlIHByb3BlcnR5IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uCi0JICogYWRhcHRlciB3aGVuIHRoZSBQVSBvciB0aGUgbW9kZWwgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGRsR2VuZXJhdGlvblR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdGhpcy52ZXJpZnlNb2RlbEluaXRpYWxpemVkKAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVNldFByb3BlcnR5KAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9LRVksCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUVfMik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFkZFJlbW92ZURkbEdlbmVyYXRpb25UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudmVyaWZ5QWRkUmVtb3ZlUHJvcGVydHkoCi0JCQlERExfR0VORVJBVElPTl9UWVBFX0tFWSwgCi0JCQlERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUsIAotCQkJRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIpOwotCX0KLQotCS8vICoqKioqKioqKiogZ2V0L3NldCBwcm9wZXJ0eSAqKioqKioqKioqCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG5ld1ZhbHVlKSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24gewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKLQkJCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKChPdXRwdXRNb2RlKSBuZXdWYWx1ZSk7Ci0JCS8vIGVsc2UgaWYoIHByb3BlcnR5TmFtZS5lcXVhbHMoIENhY2hpbmcuQ0FDSEVfU0laRV9QUk9QRVJUWSkpCi0JCS8vIFRPRE8KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkRETF9HRU5FUkFUSU9OX1RZUEVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERkbEdlbmVyYXRpb25UeXBlKChEZGxHZW5lcmF0aW9uVHlwZSkgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQVBQTElDQVRJT05fTE9DQVRJT05fUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldEFwcGxpY2F0aW9uTG9jYXRpb24oKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uQ1JFQVRFX0ZJTEVfTkFNRV9QUk9QRVJUWSkpCi0JCQl0aGlzLnNjaGVtYUdlbmVyYXRpb24uc2V0Q3JlYXRlRmlsZU5hbWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLnNldERyb3BGaWxlTmFtZSgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCWVsc2UKLQkJCXRoaXMudGhyb3dNaXNzaW5nRGVmaW5pdGlvbigic2V0UHJvcGVydHkiLCBwcm9wZXJ0eU5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uIHsKLQkJT2JqZWN0IG1vZGVsVmFsdWUgPSBudWxsOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLk9VVFBVVF9NT0RFX1BST1BFUlRZKSkKLQkJCW1vZGVsVmFsdWUgPSB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoU2NoZW1hR2VuZXJhdGlvbi5BUFBMSUNBVElPTl9MT0NBVElPTl9QUk9QRVJUWSkpCi0JCQltb2RlbFZhbHVlID0gdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmdldEFwcGxpY2F0aW9uTG9jYXRpb24oKTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhTY2hlbWFHZW5lcmF0aW9uLkNSRUFURV9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRDcmVhdGVGaWxlTmFtZSgpOwotCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFNjaGVtYUdlbmVyYXRpb24uRFJPUF9GSUxFX05BTUVfUFJPUEVSVFkpKQotCQkJbW9kZWxWYWx1ZSA9IHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXREcm9wRmlsZU5hbWUoKTsKLQkJZWxzZQotCQkJdGhpcy50aHJvd01pc3NpbmdEZWZpbml0aW9uKCJnZXRQcm9wZXJ0eSIsIHByb3BlcnR5TmFtZSk7Ci0JCXJldHVybiBtb2RlbFZhbHVlOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBQZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5zY2hlbWFHZW5lcmF0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MzgzMzAuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL2NvbnRleHQvcGVyc2lzdGVuY2UvU2NoZW1hR2VuZXJhdGlvbkJhc2ljQWRhcHRlclRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwuY29udGV4dC5wZXJzaXN0ZW5jZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuTGlzdEl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5JdGVtUHJvcGVydHlMaXN0VmFsdWVNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLm1vZGVsLnZhbHVlLkxpc3RBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5Qcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC52YWx1ZS5MaXN0VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuUHJvcGVydHlWYWx1ZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkRkbEdlbmVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLk91dHB1dE1vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuU2NoZW1hR2VuZXJhdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgbW9kZWwgb2JqZWN0IGJ5IHRoZSBTY2hlbWFHZW5lcmF0aW9uIGFkYXB0ZXIKLSAqIHdoZW4gdGhlIFBlcnNpc3RlbmNlVW5pdCBjaGFuZ2VzLgotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTY2hlbWFHZW5lcmF0aW9uQmFzaWNBZGFwdGVyVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdFRlc3RDYXNlCi17Ci0JcHJpdmF0ZSBTY2hlbWFHZW5lcmF0aW9uIHNjaGVtYUdlbmVyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBvdXRwdXRNb2RlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBkZGxHZW5UeXBlS2V5ID0gU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMiA9IE91dHB1dE1vZGUuZGF0YWJhc2U7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEZGxHZW5lcmF0aW9uVHlwZSBERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUgPSBEZGxHZW5lcmF0aW9uVHlwZS5kcm9wX2FuZF9jcmVhdGVfdGFibGVzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRGRsR2VuZXJhdGlvblR5cGUgRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFXzIgPSBEZGxHZW5lcmF0aW9uVHlwZS5ub25lOwotCi0JcHVibGljIFNjaGVtYUdlbmVyYXRpb25CYXNpY0FkYXB0ZXJUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQkKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uID0gdGhpcy5zdWJqZWN0LmdldFNjaGVtYUdlbmVyYXRpb24oKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcm9wZXJ0eUNoYW5nZUxpc3RlbmVyID0gdGhpcy5idWlsZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJdGhpcy5zY2hlbWFHZW5lcmF0aW9uLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFNjaGVtYUdlbmVyYXRpb24uRERMX0dFTkVSQVRJT05fVFlQRV9QUk9QRVJUWSwgcHJvcGVydHlDaGFuZ2VMaXN0ZW5lcik7Ci0JCXRoaXMuY2xlYXJFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRpcmVjdGx5IHRoZSBQVSBwcm9wZXJ0aWVzIGJlZm9yZSB0ZXN0aW5nLiBDYW5ub3QgdXNlCi0JICogUHJvcGVydHkgSG9sZGVyIHRvIGluaXRpYWxpemUgYmVjYXVzZSBpdCBpcyBub3QgY3JlYXRlZCB5ZXQKLQkgKi8KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBwb3B1bGF0ZVB1KCkgewotCQl0aGlzLnByb3BlcnRpZXNUb3RhbCA9IDY7Ci0JCXRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsID0gMjsKLQkJdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplID0gdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplT3JpZ2luYWw7Ci0JCQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4wIiwgInZhbHVlLjAiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5LCB0aGlzLmdldFByb3BlcnR5U3RyaW5nVmFsdWVPZihPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoInByb3BlcnR5LjIiLCAidmFsdWUuMiIpOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KCJwcm9wZXJ0eS4zIiwgInZhbHVlLjMiKTsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgicHJvcGVydHkuNCIsICJ2YWx1ZS40Iik7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoZGRsR2VuVHlwZUtleSwgdGhpcy5nZXRQcm9wZXJ0eVN0cmluZ1ZhbHVlT2YoRERMX0dFTkVSQVRJT05fVFlQRV9URVNUX1ZBTFVFKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiogKioqKioqIHRlc3QgbWV0aG9kcyAqKioqKioqICovCi0KLQkvKioKLQkgKiBUZXN0cyB0aGUgdXBkYXRlIG9mIE91dHB1dE1vZGUgcHJvcGVydHkgYnkgdGhlIFNjaGVtYUdlbmVyYXRpb24gYWRhcHRlcgotCSAqIHdoZW4gdGhlIFBVIGNoYW5nZXMuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE91dHB1dE1vZGVVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTGlzdFZhbHVlTW9kZWw8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBwcm9wZXJ0aWVzQWRhcHRlciA9IHRoaXMuYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcih0aGlzLnN1YmplY3RIb2xkZXIpOwotCQlMaXN0VmFsdWVNb2RlbDxQZXJzaXN0ZW5jZVVuaXQuUHJvcGVydHk+IHByb3BlcnR5TGlzdEFkYXB0ZXIgPSBuZXcgSXRlbVByb3BlcnR5TGlzdFZhbHVlTW9kZWxBZGFwdGVyPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4ocHJvcGVydGllc0FkYXB0ZXIsIFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eS5WQUxVRV9QUk9QRVJUWSk7Ci0JCQotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLnNjaGVtYUdlbmVyYXRpb24sIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpOwotCQkKLQkJLy8gQmFzaWMKLQkJYXNzZXJ0VHJ1ZShzY2hlbWFHZW5lcmF0aW9uLml0ZW1Jc1Byb3BlcnR5KHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkob3V0cHV0TW9kZUtleSkpKTsKLQkJYXNzZXJ0RXF1YWxzKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZQotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlbW92ZQotCQl0aGlzLmNsZWFyRXZlbnQoKTsKLQkJLS10aGlzLnByb3BlcnRpZXNUb3RhbDsKLQkJLS10aGlzLm1vZGVsUHJvcGVydGllc1NpemU7Ci0JCXRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkucmVtb3ZlUHJvcGVydHkob3V0cHV0TW9kZUtleSk7Ci0JCWFzc2VydE51bGwodGhpcy5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQcm9wZXJ0eShvdXRwdXRNb2RlS2V5KSk7Ci0JCWFzc2VydEVxdWFscyh0aGlzLm1vZGVsUHJvcGVydGllc1NpemUsIHRoaXMubW9kZWxQcm9wZXJ0aWVzU2l6ZU9yaWdpbmFsIC0gMSk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudCk7Ci0JCWFzc2VydE51bGwodGhpcy5wcm9wZXJ0eUNoYW5nZWRFdmVudC5nZXROZXdWYWx1ZSgpKTsKLQkJCi0JCS8vIEFkZCBvcmlnaW5hbCBPdXRwdXRNb2RlCi0JCSsrdGhpcy5wcm9wZXJ0aWVzVG90YWw7Ci0JCSsrdGhpcy5tb2RlbFByb3BlcnRpZXNTaXplOwotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCQkKLQkJLy8gUmVwbGFjZSBhZ2FpbgotCQl0aGlzLnBlcnNpc3RlbmNlVW5pdFNldFByb3BlcnR5KG91dHB1dE1vZGVLZXksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUVfMik7Ci0JCXRoaXMudmVyaWZ5UHV0RXZlbnQoU2NoZW1hR2VuZXJhdGlvbi5PVVRQVVRfTU9ERV9QUk9QRVJUWSwgT1VUUFVUX01PREVfVEVTVF9WQUxVRV8yLCB0aGlzLnNjaGVtYUdlbmVyYXRpb24uZ2V0T3V0cHV0TW9kZSgpKTsKLQkJCi0JCS8vIFJlcGxhY2UgYnkgc2V0dGluZyBtb2RlbCBvYmplY3QKLQkJdGhpcy5jbGVhckV2ZW50KCk7Ci0JCXRoaXMuc2NoZW1hR2VuZXJhdGlvbi5zZXRPdXRwdXRNb2RlKE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUpOwotCQl0aGlzLnZlcmlmeVB1dEV2ZW50KFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFksIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUsIHRoaXMuc2NoZW1hR2VuZXJhdGlvbi5nZXRPdXRwdXRNb2RlKCkpOwotCX0KLQotCS8vICoqKioqKiBjb252ZW5pZW5jZSBtZXRob2RzICoqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuZXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIExpc3RWYWx1ZU1vZGVsPFBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eT4gYnVpbGRQcm9wZXJ0aWVzQWRhcHRlcihQcm9wZXJ0eVZhbHVlTW9kZWw8RWNsaXBzZUxpbmtQZXJzaXN0ZW5jZVVuaXQ+IHN1YmplY3RIb2xkZXIpIHsKLQkJcmV0dXJuIG5ldyBMaXN0QXNwZWN0QWRhcHRlcjxFY2xpcHNlTGlua1BlcnNpc3RlbmNlVW5pdCwgUGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PihzdWJqZWN0SG9sZGVyLCBQZXJzaXN0ZW5jZVVuaXQuUFJPUEVSVElFU19MSVNUKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMaXN0SXRlcmFibGU8UGVyc2lzdGVuY2VVbml0LlByb3BlcnR5PiBnZXRMaXN0SXRlcmFibGUoKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIGludCBzaXplXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldFByb3BlcnRpZXNTaXplKCk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9jb250ZXh0L3BlcnNpc3RlbmNlL1NjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4ZTJiZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvY29udGV4dC9wZXJzaXN0ZW5jZS9TY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLmNvbnRleHQucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwubW9kZWwudmFsdWUuUHJvcGVydHlBc3BlY3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5tb2RlbC52YWx1ZS5TaW1wbGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLnZhbHVlLlByb3BlcnR5VmFsdWVNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwudmFsdWUuV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuRGRsR2VuZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuT3V0cHV0TW9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5TY2hlbWFHZW5lcmF0aW9uOwotCi0vKioKLSAqIFNjaGVtYUdlbmVyYXRpb25WYWx1ZU1vZGVsVGVzdHMKLSAqIAotICogVGVzdHMgdGhlIFByb3BlcnR5VmFsdWVNb2RlbCBvZiBTY2hlbWFHZW5lcmF0aW9uIG1vZGVsIGFuZCB0aGUgdXBkYXRlIG9mIHRoZQotICogUGVyc2lzdGVuY2VVbml0LgotICovCi1wdWJsaWMgY2xhc3MgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rUGVyc2lzdGVuY2VVbml0VGVzdENhc2UKLXsKLQlwcml2YXRlIFNjaGVtYUdlbmVyYXRpb24gc2NoZW1hR2VuOwotCXByaXZhdGUgUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+IHNjaGVtYUdlbkhvbGRlcjsKLQotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGRsR2VuZXJhdGlvblR5cGU+IGRkbEdlbmVyYXRpb25UeXBlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBkZGxHZW5lcmF0aW9uVHlwZUV2ZW50OwotCi0JcHJpdmF0ZSBXcml0YWJsZVByb3BlcnR5VmFsdWVNb2RlbDxPdXRwdXRNb2RlPiBvdXRwdXRNb2RlSG9sZGVyOwotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VFdmVudCBvdXRwdXRNb2RlRXZlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERkbEdlbmVyYXRpb25UeXBlIERETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSA9IERkbEdlbmVyYXRpb25UeXBlLmRyb3BfYW5kX2NyZWF0ZV90YWJsZXM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBPdXRwdXRNb2RlIE9VVFBVVF9NT0RFX1RFU1RfVkFMVUUgPSBPdXRwdXRNb2RlLnNxbF9zY3JpcHQ7Ci0KLQlwdWJsaWMgU2NoZW1hR2VuZXJhdGlvblZhbHVlTW9kZWxUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0aGlzLnNjaGVtYUdlbiA9IHRoaXMuc3ViamVjdC5nZXRTY2hlbWFHZW5lcmF0aW9uKCk7IC8vIFN1YmplY3QKLQkJdGhpcy5zY2hlbWFHZW5Ib2xkZXIgPSBuZXcgU2ltcGxlUHJvcGVydHlWYWx1ZU1vZGVsPFNjaGVtYUdlbmVyYXRpb24+KHRoaXMuc2NoZW1hR2VuKTsKLQkJCi0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIgPSB0aGlzLmJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZGRsR2VuZXJhdGlvblR5cGVMaXN0ZW5lciA9IHRoaXMuYnVpbGREZGxHZW5lcmF0aW9uVHlwZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCXRoaXMuZGRsR2VuZXJhdGlvblR5cGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIGRkbEdlbmVyYXRpb25UeXBlTGlzdGVuZXIpOwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOwotCQkKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVBQSh0aGlzLnNjaGVtYUdlbkhvbGRlcik7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgb3V0cHV0TW9kZUxpc3RlbmVyID0gdGhpcy5idWlsZE91dHB1dE1vZGVDaGFuZ2VMaXN0ZW5lcigpOwotCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUsIG91dHB1dE1vZGVMaXN0ZW5lcik7Ci0JCXRoaXMub3V0cHV0TW9kZUV2ZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyBkaXJlY3RseSB0aGUgUFUgcHJvcGVydGllcyBiZWZvcmUgdGVzdGluZy4gQ2Fubm90IHVzZQotCSAqIFByb3BlcnR5IEhvbGRlciB0byBpbml0aWFsaXplIGJlY2F1c2UgaXQgaXMgbm90IGNyZWF0ZWQgeWV0Ci0JICovCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVQdSgpIHsKLQkJdGhpcy5wZXJzaXN0ZW5jZVVuaXRTZXRQcm9wZXJ0eSgKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCURETF9HRU5FUkFUSU9OX1RZUEVfVEVTVF9WQUxVRSk7Ci0JCXRoaXMucGVyc2lzdGVuY2VVbml0U2V0UHJvcGVydHkoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAotCQkJT1VUUFVUX01PREVfVEVTVF9WQUxVRSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0UHJvcGVydGllcyBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIHRoaXMuc2NoZW1hR2VuOwotCX0KLQotCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCXByaXZhdGUgV3JpdGFibGVQcm9wZXJ0eVZhbHVlTW9kZWw8RGRsR2VuZXJhdGlvblR5cGU+IGJ1aWxkRGRsR2VuZXJhdGlvblR5cGVBQShQcm9wZXJ0eVZhbHVlTW9kZWw8U2NoZW1hR2VuZXJhdGlvbj4gc3ViamVjdEhvbGRlcikgewotCQlyZXR1cm4gbmV3IFByb3BlcnR5QXNwZWN0QWRhcHRlcjxTY2hlbWFHZW5lcmF0aW9uLCBEZGxHZW5lcmF0aW9uVHlwZT4oc3ViamVjdEhvbGRlciwgU2NoZW1hR2VuZXJhdGlvbi5ERExfR0VORVJBVElPTl9UWVBFX1BST1BFUlRZKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBEZGxHZW5lcmF0aW9uVHlwZSBidWlsZFZhbHVlXygpIHsKLQkJCQlyZXR1cm4gdGhpcy5zdWJqZWN0LmdldERkbEdlbmVyYXRpb25UeXBlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKERkbEdlbmVyYXRpb25UeXBlIGVudW1WYWx1ZSkgewotCQkJCXRoaXMuc3ViamVjdC5zZXREZGxHZW5lcmF0aW9uVHlwZShlbnVtVmFsdWUpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBidWlsZERkbEdlbmVyYXRpb25UeXBlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCA9IGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQlwcml2YXRlIFdyaXRhYmxlUHJvcGVydHlWYWx1ZU1vZGVsPE91dHB1dE1vZGU+IGJ1aWxkT3V0cHV0TW9kZUFBKFByb3BlcnR5VmFsdWVNb2RlbDxTY2hlbWFHZW5lcmF0aW9uPiBzdWJqZWN0SG9sZGVyKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlBc3BlY3RBZGFwdGVyPFNjaGVtYUdlbmVyYXRpb24sIE91dHB1dE1vZGU+KHN1YmplY3RIb2xkZXIsIFNjaGVtYUdlbmVyYXRpb24uT1VUUFVUX01PREVfUFJPUEVSVFkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIE91dHB1dE1vZGUgYnVpbGRWYWx1ZV8oKSB7Ci0JCQkJcmV0dXJuIHRoaXMuc3ViamVjdC5nZXRPdXRwdXRNb2RlKCk7Ci0JCQl9Ci0KLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVfKE91dHB1dE1vZGUgZW51bVZhbHVlKSB7Ci0JCQkJdGhpcy5zdWJqZWN0LnNldE91dHB1dE1vZGUoZW51bVZhbHVlKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgYnVpbGRPdXRwdXRNb2RlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGUpIHsKLQkJCQlTY2hlbWFHZW5lcmF0aW9uVmFsdWVNb2RlbFRlc3RzLnRoaXMub3V0cHV0TW9kZUV2ZW50ID0gZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VmFsdWUoKSB7Ci0JCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCQl0aGlzLnZlcmlmeURkbEdlbmVyYXRpb25UeXBlQUFWYWx1ZShERExfR0VORVJBVElPTl9UWVBFX1RFU1RfVkFMVUUpOwotCQlhc3NlcnRFcXVhbHMoCi0JCQlTY2hlbWFHZW5lcmF0aW9uLkRFRkFVTFRfU0NIRU1BX0dFTkVSQVRJT05fRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldERlZmF1bHREZGxHZW5lcmF0aW9uVHlwZSgpKTsKLQkJLyoqICoqKioqKiBPdXRwdXRNb2RlICoqKioqKiogKi8KLQkJdGhpcy52ZXJpZnlPdXRwdXRNb2RlQUFWYWx1ZShPVVRQVVRfTU9ERV9URVNUX1ZBTFVFKTsKLQkJYXNzZXJ0RXF1YWxzKAotCQkJU2NoZW1hR2VuZXJhdGlvbi5ERUZBVUxUX1NDSEVNQV9HRU5FUkFUSU9OX09VVFBVVF9NT0RFLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0RGVmYXVsdE91dHB1dE1vZGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8qKiAqKioqKiogRGRsR2VuZXJhdGlvblR5cGUgKioqKioqKiAqLwotCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlRXZlbnQgPSBudWxsOwotCQl0aGlzLnZlcmlmeUhhc0xpc3RlbmVycyh0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLCBQcm9wZXJ0eVZhbHVlTW9kZWwuVkFMVUUpOwotCQlEZGxHZW5lcmF0aW9uVHlwZSBuZXdEZGxHZW5lcmF0aW9uVHlwZSA9IERkbEdlbmVyYXRpb25UeXBlLmNyZWF0ZV90YWJsZXM7Ci0JCS8vIE1vZGlmeSB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5Ci0JCXRoaXMuc3ViamVjdC5zZXRQcm9wZXJ0eSgKLQkJCVNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fVFlQRSwKLQkJCXRoaXMuZ2V0UHJvcGVydHlTdHJpbmdWYWx1ZU9mKG5ld0RkbEdlbmVyYXRpb25UeXBlKSwKLQkJCWZhbHNlKTsKLQkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobmV3RGRsR2VuZXJhdGlvblR5cGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMuZGRsR2VuZXJhdGlvblR5cGVFdmVudCk7Ci0JCQotCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7Ci0JCXRoaXMudmVyaWZ5SGFzTGlzdGVuZXJzKHRoaXMub3V0cHV0TW9kZUhvbGRlciwgUHJvcGVydHlWYWx1ZU1vZGVsLlZBTFVFKTsKLQkJT3V0cHV0TW9kZSBuZXdPdXRwdXRNb2RlID0gT3V0cHV0TW9kZS5kYXRhYmFzZTsKLQkJLy8gTW9kaWZ5IHRoZSBwcm9wZXJ0eSBob2xkZXIKLQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLnNldFZhbHVlKG5ld091dHB1dE1vZGUpOwotCQl0aGlzLnZlcmlmeU91dHB1dE1vZGVBQVZhbHVlKG5ld091dHB1dE1vZGUpOwotCQlhc3NlcnROb3ROdWxsKHRoaXMub3V0cHV0TW9kZUV2ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TnVsbFZhbHVlKCkgewotCQkvKiogKioqKioqIERkbEdlbmVyYXRpb25UeXBlICoqKioqKiogKi8KLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50ID0gbnVsbDsKLQkJLy8gU2V0dGluZyB0aGUgcGVyc2lzdGVuY2VVbml0IGRpcmVjdGx5Ci0JCXRoaXMuc3ViamVjdC5zZXRQcm9wZXJ0eShTY2hlbWFHZW5lcmF0aW9uLkVDTElQU0VMSU5LX0RETF9HRU5FUkFUSU9OX1RZUEUsIG51bGwsIGZhbHNlKTsKLQkJdGhpcy5kZGxHZW5lcmF0aW9uVHlwZUhvbGRlci5zZXRWYWx1ZShudWxsKTsKLQkJLy8gdGVzdGluZyBIb2xkZXIKLQkJdGhpcy52ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5kZGxHZW5lcmF0aW9uVHlwZUV2ZW50KTsKLQkJLy8gdGVzdGluZyBQVSBwcm9wZXJ0aWVzCi0JCVBlcnNpc3RlbmNlVW5pdC5Qcm9wZXJ0eSBwcm9wZXJ0eSA9IHRoaXMuZ2V0UGVyc2lzdGVuY2VVbml0KCkuZ2V0UHJvcGVydHkoU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKLQkJYXNzZXJ0TnVsbChwcm9wZXJ0eSk7Ci0JCQotCQkvKiogKioqKioqIE91dHB1dE1vZGUgKioqKioqKiAqLwotCQl0aGlzLm91dHB1dE1vZGVFdmVudCA9IG51bGw7Ci0JCS8vIFNldHRpbmcgdGhlIHByb3BlcnR5IGhvbGRlcgotCQl0aGlzLm91dHB1dE1vZGVIb2xkZXIuc2V0VmFsdWUobnVsbCk7Ci0JCS8vIHRlc3RpbmcgSG9sZGVyCi0JCXRoaXMudmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUobnVsbCk7Ci0JCWFzc2VydE5vdE51bGwodGhpcy5vdXRwdXRNb2RlRXZlbnQpOwotCQkvLyB0ZXN0aW5nIFBVIHByb3BlcnRpZXMKLQkJcHJvcGVydHkgPSB0aGlzLmdldFBlcnNpc3RlbmNlVW5pdCgpLmdldFByb3BlcnR5KFNjaGVtYUdlbmVyYXRpb24uRUNMSVBTRUxJTktfRERMX0dFTkVSQVRJT05fT1VUUFVUX01PREUpOwotCQlhc3NlcnROdWxsKHByb3BlcnR5KTsKLQl9Ci0KLQkvKiogKioqKioqIGNvbnZlbmllbmNlIG1ldGhvZHMgKioqKioqKiAqLwotCS8qKgotCSAqIFBlcmZvcm1zIHRocmVlIHZhbHVlIHRlc3RzOjxicj4KLQkgKiAxLiBzdWJqZWN0IHZhbHVlPGJyPgotCSAqIDIuIGFzcGVjdCBhZGFwdGVyIHZhbHVlPGJyPgotCSAqIDMuIHBlcnNpc3RlbmNlVW5pdCBwcm9wZXJ0eSB2YWx1ZTxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2ZXJpZnlEZGxHZW5lcmF0aW9uVHlwZUFBVmFsdWUoRGRsR2VuZXJhdGlvblR5cGUgdGVzdFZhbHVlKSB7Ci0JCXRoaXMudmVyaWZ5QUFWYWx1ZSgKLQkJCXRlc3RWYWx1ZSwKLQkJCXRoaXMuc2NoZW1hR2VuLmdldERkbEdlbmVyYXRpb25UeXBlKCksCi0JCQl0aGlzLmRkbEdlbmVyYXRpb25UeXBlSG9sZGVyLAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9UWVBFKTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyB0aHJlZSB2YWx1ZSB0ZXN0czo8YnI+Ci0JICogMS4gc3ViamVjdCB2YWx1ZTxicj4KLQkgKiAyLiBhc3BlY3QgYWRhcHRlciB2YWx1ZTxicj4KLQkgKiAzLiBwZXJzaXN0ZW5jZVVuaXQgcHJvcGVydHkgdmFsdWU8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmVyaWZ5T3V0cHV0TW9kZUFBVmFsdWUoT3V0cHV0TW9kZSB0ZXN0VmFsdWUpIHsKLQkJdGhpcy52ZXJpZnlBQVZhbHVlKAotCQkJdGVzdFZhbHVlLAotCQkJdGhpcy5zY2hlbWFHZW4uZ2V0T3V0cHV0TW9kZSgpLAotCQkJdGhpcy5vdXRwdXRNb2RlSG9sZGVyLAotCQkJU2NoZW1hR2VuZXJhdGlvbi5FQ0xJUFNFTElOS19ERExfR0VORVJBVElPTl9PVVRQVVRfTU9ERSk7Ci0JfQotCi0JLy8gKioqKioqKioqKiBnZXQvc2V0IHByb3BlcnR5ICoqKioqKioqKioKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgbmV3VmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHRocm93cyBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9KcHRKcGFFY2xpcHNlbGlua0NvcmVSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1OTU0Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvSnB0SnBhRWNsaXBzZWxpbmtDb3JlUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKLSAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5KcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzOwotCi0vKioKLSAqIFJlcXVpcmVkIEphdmEgc3lzdGVtIHByb3BlcnR5OgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotcHVibGljIGNsYXNzIEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlpZihKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5yZXF1aXJlZEphcnNFeGlzdHMoKSkgewotCQkJc3VpdGUuYWRkVGVzdChKcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLnN1aXRlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VpdGUuYWRkVGVzdChUZXN0U3VpdGUud2FybmluZyhKcHRKcGFFY2xpcHNlTGlua0NvcmVUZXN0cy5idWlsZE1pc3NpbmdKYXJFcnJvck1lc3NhZ2UoKSkpOwotCQl9Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEpwYUVjbGlwc2VsaW5rQ29yZVJlc291cmNlTW9kZWxUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ2FjaGVUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTI0MzQ1Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NhY2hlVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2FjaGVDb29yZGluYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkNhY2hlSXNvbGF0aW9uVHlwZTJfMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5DYWNoZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDYWNoZVRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDYWNoZVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuQ0FDSEVfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENhY2hlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aENhY2hlVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLkNBQ0hFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZSh0eXBlID0gQ2FjaGVUeXBlLlNPRlQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoc2l6ZSA9IDUwKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhFeHBpcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5ID0gNTApIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoc2hhcmVkPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoQWx3YXlzUmVmcmVzaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShhbHdheXNSZWZyZXNoPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShyZWZyZXNoT25seUlmTmV3ZXI9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZGlzYWJsZUhpdHM9dHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoQ29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLkNBQ0hFX0NPT1JESU5BVElPTl9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoY29vcmRpbmF0aW9uVHlwZSA9IENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoSXNvbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuQ0FDSEVfSVNPTEFUSU9OX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShpc29sYXRpb24gPSBDYWNoZUlzb2xhdGlvblR5cGUuSVNPTEFURUQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FjaGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROb3ROdWxsKGNhY2hlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ2FjaGVUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGVUeXBlLlNPRlQsIGNhY2hlLmdldFR5cGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aENhY2hlVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQ2FjaGVUeXBlLlNPRlQsIGNhY2hlLmdldFR5cGUoKSk7Ci0JCQotCQljYWNoZS5zZXRUeXBlKENhY2hlVHlwZS5XRUFLKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlVHlwZS5XRUFLLCBjYWNoZS5nZXRUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZSh0eXBlID0gV0VBSykiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHR5cGUgPSBXRUFLKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaXplKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRTaXplKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaXplKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRTaXplKCkpOwotCQkKLQkJY2FjaGUuc2V0U2l6ZShJbnRlZ2VyLnZhbHVlT2YoODApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MCksIGNhY2hlLmdldFNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHNpemUgPSA4MCkiLCBjdSk7Ci0JCQotCQljYWNoZS5zZXRTaXplKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFNpemUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHNpemUgPSA4MCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2hhcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaGFyZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFNoYXJlZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRTaGFyZWQoKSk7Ci0JCQotCQljYWNoZS5zZXRTaGFyZWQoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXRTaGFyZWQoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHNoYXJlZD1mYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRTaGFyZWROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhTaGFyZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0U2hhcmVkKCkpOwotCQkKLQkJY2FjaGUuc2V0U2hhcmVkKG51bGwpOwotCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEV4cGlyeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoNTApLCBjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JCQotCQljYWNoZS5zZXRFeHBpcnkoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCBjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGV4cGlyeSA9IDgwKSIsIGN1KTsKLQkJCi0JCWNhY2hlLnNldEV4cGlyeShudWxsKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXRFeHBpcnkoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGV4cGlyeSA9IDgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEV4cGlyeVRpbWVPZkRheSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlFY2xpcHNlTGlua1RpbWVPZkRheUFubm90YXRpb24gdGltZU9mRGF5ID0gY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCk7Ci0JCWFzc2VydE5vdE51bGwodGltZU9mRGF5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkRXhwaXJ5VGltZU9mRGF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQljYWNoZS5hZGRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJCi0JCWFzc2VydE5vdE51bGwoY2FjaGUuZ2V0RXhwaXJ5VGltZU9mRGF5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUV4cGlyeVRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRXhwaXJ5VGltZU9mRGF5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpKTsKLQotCQljYWNoZS5yZW1vdmVFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0TnVsbChjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRBbHdheXNSZWZyZXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQljYWNoZS5zZXRBbHdheXNSZWZyZXNoKEJvb2xlYW4uRkFMU0UpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgY2FjaGUuZ2V0QWx3YXlzUmVmcmVzaCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoYWx3YXlzUmVmcmVzaD1mYWxzZSkiLCBjdSk7CQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldEFsd2F5c1JlZnJlc2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhBbHdheXNSZWZyZXNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQljYWNoZS5zZXRBbHdheXNSZWZyZXNoKG51bGwpOwotCQljYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldEFsd2F5c1JlZnJlc2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZyZXNoT25seUlmTmV3ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aFJlZnJlc2hPbmx5SWZOZXdlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQljYWNoZS5zZXRSZWZyZXNoT25seUlmTmV3ZXIoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjYWNoZS5nZXRSZWZyZXNoT25seUlmTmV3ZXIoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKHJlZnJlc2hPbmx5SWZOZXdlcj1mYWxzZSkiLCBjdSk7CQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRSZWZyZXNoT25seUlmTmV3ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhSZWZyZXNoT25seUlmTmV3ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0UmVmcmVzaE9ubHlJZk5ld2VyKCkpOwotCQkKLQkJY2FjaGUuc2V0UmVmcmVzaE9ubHlJZk5ld2VyKG51bGwpOwotCQljYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldFJlZnJlc2hPbmx5SWZOZXdlcigpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERpc2FibGVIaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhEaXNhYmxlSGl0cygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsJCQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNhYmxlSGl0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoRGlzYWJsZUhpdHMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgY2FjaGUuZ2V0RGlzYWJsZUhpdHMoKSk7Ci0JCQotCQljYWNoZS5zZXREaXNhYmxlSGl0cyhCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIGNhY2hlLmdldERpc2FibGVIaXRzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShkaXNhYmxlSGl0cz1mYWxzZSkiLCBjdSk7CQkJCi0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREaXNhYmxlSGl0c051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aERpc2FibGVIaXRzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjYWNoZS5nZXREaXNhYmxlSGl0cygpKTsKLQkJCi0JCWNhY2hlLnNldERpc2FibGVIaXRzKG51bGwpOwotCQljYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldERpc2FibGVIaXRzKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENhY2hlKCIsIGN1KTsKLQl9Ci0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ29vcmRpbmF0aW9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29vcmRpbmF0aW9uVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoQ29vcmRpbmF0aW9uVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5JTlZBTElEQVRFX0NIQU5HRURfT0JKRUNUUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWNhY2hlLnNldENvb3JkaW5hdGlvblR5cGUoQ2FjaGVDb29yZGluYXRpb25UeXBlLlNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlQ29vcmRpbmF0aW9uVHlwZS5TRU5EX05FV19PQkpFQ1RTX1dJVEhfQ0hBTkdFUywgY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2FjaGUoY29vcmRpbmF0aW9uVHlwZSA9IFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKSIsIGN1KTsKLQkJCi0JCWNhY2hlLnNldENvb3JkaW5hdGlvblR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY2FjaGUuZ2V0Q29vcmRpbmF0aW9uVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoY29vcmRpbmF0aW9uVHlwZSA9IFNFTkRfTkVXX09CSkVDVFNfV0lUSF9DSEFOR0VTKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBDYWNoZSgiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldElzb2xhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2FjaGVXaXRoSXNvbGF0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlSXNvbGF0aW9uVHlwZTJfMi5JU09MQVRFRCwgY2FjaGUuZ2V0SXNvbGF0aW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRJc29sYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aElzb2xhdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUlzb2xhdGlvblR5cGUyXzIuSVNPTEFURUQsIGNhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQljYWNoZS5zZXRJc29sYXRpb24oQ2FjaGVJc29sYXRpb25UeXBlMl8yLlNIQVJFRCk7Ci0JCWFzc2VydEVxdWFscyhDYWNoZUlzb2xhdGlvblR5cGUyXzIuU0hBUkVELCBjYWNoZS5nZXRJc29sYXRpb24oKSk7Ci0KLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDYWNoZShpc29sYXRpb24gPSBTSEFSRUQpIiwgY3UpOwotCi0JCWNhY2hlLnNldElzb2xhdGlvbihDYWNoZUlzb2xhdGlvblR5cGUyXzIuUFJPVEVDVEVEKTsKLQkJYXNzZXJ0RXF1YWxzKENhY2hlSXNvbGF0aW9uVHlwZTJfMi5QUk9URUNURUQsIGNhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENhY2hlKGlzb2xhdGlvbiA9IFBST1RFQ1RFRCkiLCBjdSk7Ci0KLQkJY2FjaGUuc2V0SXNvbGF0aW9uKG51bGwpOwotCQlhc3NlcnROdWxsKGNhY2hlLmdldElzb2xhdGlvbigpKTsKLQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGlzb2xhdGlvbiA9IFNIQVJFRCkiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJAQ2FjaGUoIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NoYW5nZVRyYWNraW5nVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0YzMwNi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DaGFuZ2VUcmFja2luZ1Rlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuQ2hhbmdlVHJhY2tpbmdUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2hhbmdlVHJhY2tpbmdBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDaGFuZ2VUcmFja2luZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBDaGFuZ2VUcmFja2luZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENoYW5nZVRyYWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DSEFOR0VfVFJBQ0tJTkcsIEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lOR19UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2hhbmdlVHJhY2tpbmciKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORywgRWNsaXBzZUxpbmsuQ0hBTkdFX1RSQUNLSU5HX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDaGFuZ2VUcmFja2luZyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VUcmFja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydE5vdE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q2hhbmdlVHJhY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtDaGFuZ2VUcmFja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNIQU5HRV9UUkFDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuREVGRVJSRUQsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUoQ2hhbmdlVHJhY2tpbmdUeXBlLkFUVFJJQlVURSk7Ci0JCWFzc2VydEVxdWFscyhDaGFuZ2VUcmFja2luZ1R5cGUuQVRUUklCVVRFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ2hhbmdlVHJhY2tpbmcoQVRUUklCVVRFKSIsIGN1KTsKLQkJCi0JCWV4aXN0ZW5jZUNoZWNraW5nLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihBVFRSSUJVVEUpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENoYW5nZVRyYWNraW5nIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQENoYW5nZVRyYWNraW5nKCIsIGN1KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Db252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGVlODIxLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIENvbnZlcnNpb25WYWx1ZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyIik7Ci0JCQl9Ci0JCX0pOwotCX0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUiwgRWNsaXBzZUxpbmsuQ09OVkVSU0lPTl9WQUxVRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCi0JcHVibGljIHZvaWQgdGVzdEdldERhdGFWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldERhdGFWYWx1ZSgiRk9PIik7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGT09cIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXREYXRhVmFsdWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGT09cIikpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldERhdGFWYWx1ZShudWxsKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSBAQ29udmVyc2lvblZhbHVlKSIsIGN1KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T2JqZWN0VmFsdWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IEBDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSkiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuc2V0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZSkiLCBjdSk7Ci0JCWFzc2VydEVxdWFscygxLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydEFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmMwNTBkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnRBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb252ZXJ0QW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgQ29udmVydEFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnQodmFsdWU9XCJteUNvbnZlcnRlclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24gY29udmVydCA9IChFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ09OVkVSVCk7Ci0JCWFzc2VydEVxdWFscygibXlDb252ZXJ0ZXIiLCBjb252ZXJ0LmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRBbm5vdGF0aW9uIGNvbnZlcnQgPSAoRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnQuc2V0VmFsdWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnQodmFsdWU9XCJCYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0QW5ub3RhdGlvbiBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rQ29udmVydEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DT05WRVJUKTsKLQkJYXNzZXJ0RXF1YWxzKCJteUNvbnZlcnRlciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0LnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnQiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ2YWx1ZSIsIGN1KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0NvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzc0NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQENvbnZlcnRlcihjb252ZXJ0ZXJDbGFzcz1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdENvbnZlcnRlcldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDb252ZXJ0ZXIobmFtZT1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhDb252ZXJ0ZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhDb252ZXJ0ZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRDb252ZXJ0ZXJDbGFzcygiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0ZXIoY29udmVydGVyQ2xhc3M9QmFyLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldENvbnZlcnRlckNsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q29udmVydGVyV2l0aENvbnZlcnRlckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLkNPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlckNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ29udmVydGVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiY29udmVydGVyQ2xhc3MiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBDb252ZXJ0ZXIobmFtZT1cImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0NvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQENvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0N1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0N1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI4YTI1Ni4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9DdXN0b21pemVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgQ3VzdG9taXplckFubm90YXRpb25UZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHVibGljIEN1c3RvbWl6ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDdXN0b21pemVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ3VzdG9taXplciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDdXN0b21pemVyV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ3VzdG9taXplcihGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDdXN0b21pemVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q3VzdG9taXplcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udmVydGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdEN1c3RvbWl6ZXJXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtDdXN0b21pemVyQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ1VTVE9NSVpFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb252ZXJ0ZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Q3VzdG9taXplcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua0N1c3RvbWl6ZXJBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DVVNUT01JWkVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0VmFsdWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAQ3VzdG9taXplcihCYXIuY2xhc3MpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDdXN0b21pemVyV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rQ3VzdG9taXplckFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNVU1RPTUlaRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXRWYWx1ZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEN1c3RvbWl6ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJGb28uY2xhc3MiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUyMWUwYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfMEphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5HZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuSnBhQW5ub3RhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhLkpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLmludGVybmFsLkVjbGlwc2VMaW5rMl8wSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlcjsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSBleHRlbmRzIEpwYUphdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UKLXsJCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19BTk5PVEFUSU9OU19QQUNLQUdFX05BTUUgPSAib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuYW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIEVjbGlwc2VMaW5rMl8wSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQW5ub3RhdGlvblByb3ZpZGVyIGJ1aWxkQW5ub3RhdGlvblByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpwYUFubm90YXRpb25Qcm92aWRlcigKLQkJCUdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCksCi0JCQlFY2xpcHNlTGluazJfMEpwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGluazJfM0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTk1MTEyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5Bbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkdlbmVyaWNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5KcGFBbm5vdGF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmEuSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUuaW50ZXJuYWwuRWNsaXBzZUxpbmsyXzNKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxpbmsyXzNKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIGV4dGVuZHMgSnBhSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZQotewkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVDTElQU0VMSU5LX0FOTk9UQVRJT05TX1BBQ0tBR0VfTkFNRSA9ICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hbm5vdGF0aW9ucyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgRWNsaXBzZUxpbmsyXzNKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBBbm5vdGF0aW9uUHJvdmlkZXIgYnVpbGRBbm5vdGF0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSnBhQW5ub3RhdGlvblByb3ZpZGVyKAotCQkJR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXIuaW5zdGFuY2UoKSwKLQkJCUVjbGlwc2VMaW5rMl8zSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZS5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWZjMTkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuR2VuZXJpY0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmludGVybmFsLkpwYUFubm90YXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YS5KcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5pbnRlcm5hbC5FY2xpcHNlTGlua0pwYUFubm90YXRpb25EZWZpbml0aW9uUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgZXh0ZW5kcyBKcGFKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi17CQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRUxJTktfQU5OT1RBVElPTlNfUEFDS0FHRV9OQU1FID0gIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmFubm90YXRpb25zIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIEFubm90YXRpb25Qcm92aWRlciBidWlsZEFubm90YXRpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKcGFBbm5vdGF0aW9uUHJvdmlkZXIoCi0JCQlHZW5lcmljSnBhQW5ub3RhdGlvbkRlZmluaXRpb25Qcm92aWRlci5pbnN0YW5jZSgpLAotCQkJRWNsaXBzZUxpbmtKcGFBbm5vdGF0aW9uRGVmaW5pdGlvblByb3ZpZGVyLmluc3RhbmNlKCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtQcmltYXJ5S2V5QW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3ODFmYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDExICBPcmFjbGUuIAotICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSAKLSAqICBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCAKLSAqICBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKLSAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogIAotICogIENvbnRyaWJ1dG9yczogCi0gKiAgCU9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25UZXN0cwotCWV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlCi17Ci0JcHVibGljIEVjbGlwc2VMaW5rUHJpbWFyeUtleUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlV2l0aFByaW1hcnlLZXlBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5QUklNQVJZX0tFWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFByaW1hcnlLZXkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlV2l0aFByaW1hcnlLZXlBbm5vdGF0aW9uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpKTsKLQkJCi0JCXJlc291cmNlVHlwZS5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5QUklNQVJZX0tFWSkpOwotCQkKLQkJcmVzb3VyY2VUeXBlLmFkZEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJTUFSWV9LRVkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlBSSU1BUllfS0VZKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfM1Rlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjNDRmYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9FY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRGlzY3JpbWluYXRvclR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzM7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzNUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rMl8zSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FID0gIk1ZX0NPTFVNTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT0xVTU5fREVGSU5JVElPTiA9ICJDT0xVTU5fREVGSU5JVElPTiI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9DT05URVhUX1BST1BFUlRZID0gImVjbGlwc2VsaW5rLmZvby1pZCI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9UQUJMRSA9ICJNWV9UQUJMRSI7Ci0KLQlwdWJsaWMgRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfM1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4iKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKG5hbWUgPSBcIiIgKyBDT0xVTU5fTkFNRSArICJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbldpdGhDb2x1bW5EZWZpbml0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGNvbHVtbkRlZmluaXRpb24gPSBcIiIgKyBDT0xVTU5fQ09MVU1OX0RFRklOSVRJT04gKyAiXCIpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoQ29udGV4dFByb3BlcnR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGNvbnRleHRQcm9wZXJ0eSA9IFwiIiArIENPTFVNTl9DT05URVhUX1BST1BFUlRZICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uV2l0aFRhYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKHRhYmxlID0gXCIiICsgQ09MVU1OX1RBQkxFICsgIlwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRlbmVuYXREaXNjcmltaW5hdG9yQ29sdW1uV2l0aERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4sIEpQQS5ESVNDUklNSU5BVE9SX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGRpc2NyaW1pbmF0b3JUeXBlID0gRGlzY3JpbWluYXRvclR5cGUuQ0hBUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29sdW1uV2l0aEludEVsZW1lbnQoZmluYWwgU3RyaW5nIGludEVsZW1lbnQpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigiICsgaW50RWxlbWVudCArICIgPSA1KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoZmluYWwgU3RyaW5nIGJvb2xlYW5FbGVtZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oIiArIGJvb2xlYW5FbGVtZW50ICsgIiA9IHRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0KLQkJY29sdW1uLnNldE5hbWUoIkZvbyIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKG5hbWUgPSBcIkZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX05BTUUsIGNvbHVtbi5nZXROYW1lKCkpOwotCQkKLQkJY29sdW1uLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKG5hbWUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbHVtbkRlZmluaXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoQ29sdW1uRGVmaW5pdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zIGNvbHVtbiA9IChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCQlhc3NlcnRFcXVhbHMoQ09MVU1OX0NPTFVNTl9ERUZJTklUSU9OLCBjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29sdW1uRGVmaW5pdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zIGNvbHVtbiA9IChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0Q29sdW1uRGVmaW5pdGlvbigpKTsKLQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbigiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29sdW1uLmdldENvbHVtbkRlZmluaXRpb24oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oY29sdW1uRGVmaW5pdGlvbiA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29sdW1uRGVmaW5pdGlvbihudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihjb2x1bW5EZWZpbml0aW9uIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbHVtbldpdGhJbnRFbGVtZW50KCJsZW5ndGgiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0Tm90TnVsbChjb2x1bW4pOwotCQlhc3NlcnROdWxsKGNvbHVtbi5nZXRMZW5ndGgoKSk7Ci0KLQkJY29sdW1uLnNldExlbmd0aChJbnRlZ2VyLnZhbHVlT2YoNSkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCBjb2x1bW4uZ2V0TGVuZ3RoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGxlbmd0aCA9IDUpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldExlbmd0aChudWxsKTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihsZW5ndGgiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXREaXNjcmltaW5hdG9yVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuZW5hdERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoRGlzY3JpbWluYXRvclR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKERpc2NyaW1pbmF0b3JUeXBlLkNIQVIsIGNvbHVtbi5nZXREaXNjcmltaW5hdG9yVHlwZSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERpc2NyaW1pbmF0b3JUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMgY29sdW1uID0gKEVjbGlwc2VMaW5rVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbkFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRFTkFOVF9ESVNDUklNSU5BVE9SX0NPTFVNTik7Ci0KLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0RGlzY3JpbWluYXRvclR5cGUoKSk7Ci0KLQkJY29sdW1uLnNldERpc2NyaW1pbmF0b3JUeXBlKERpc2NyaW1pbmF0b3JUeXBlLklOVEVHRVIpOwotCQlhc3NlcnRFcXVhbHMoRGlzY3JpbWluYXRvclR5cGUuSU5URUdFUiwgY29sdW1uLmdldERpc2NyaW1pbmF0b3JUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGRpc2NyaW1pbmF0b3JUeXBlID0gSU5URUdFUikiLCBjdSk7Ci0JCQotCQljb2x1bW4uc2V0RGlzY3JpbWluYXRvclR5cGUobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoZGlzY3JpbWluYXRvclR5cGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldENvbnRleHRQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbldpdGhDb250ZXh0UHJvcGVydHkoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9DT05URVhUX1BST1BFUlRZLCBjb2x1bW4uZ2V0Q29udGV4dFByb3BlcnR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRDb250ZXh0UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldENvbnRleHRQcm9wZXJ0eSgpKTsKLQotCQljb2x1bW4uc2V0Q29udGV4dFByb3BlcnR5KCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0Q29udGV4dFByb3BlcnR5KCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uKGNvbnRleHRQcm9wZXJ0eSA9IFwiRm9vXCIpIiwgY3UpOwotCi0JCQotCQljb2x1bW4uc2V0Q29udGV4dFByb3BlcnR5KG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKGNvbnRleHRQcm9wZXJ0eSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5XaXRoVGFibGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQkJYXNzZXJ0RXF1YWxzKENPTFVNTl9UQUJMRSwgY29sdW1uLmdldFRhYmxlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUYWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGVuYW50RGlzY3JpbWluYXRvckNvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zIGNvbHVtbiA9IChFY2xpcHNlTGlua1RlbmFudERpc2NyaW1pbmF0b3JDb2x1bW5Bbm5vdGF0aW9uMl8zKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5URU5BTlRfRElTQ1JJTUlOQVRPUl9DT0xVTU4pOwotCi0JCWFzc2VydE5vdE51bGwoY29sdW1uKTsKLQkJYXNzZXJ0TnVsbChjb2x1bW4uZ2V0VGFibGUoKSk7Ci0KLQkJY29sdW1uLnNldFRhYmxlKCJGb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb2x1bW4uZ2V0VGFibGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4odGFibGUgPSBcIkZvb1wiKSIsIGN1KTsKLQotCQkKLQkJY29sdW1uLnNldFRhYmxlKG51bGwpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKHRhYmxlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcmltYXJ5S2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDb2x1bW5XaXRoQm9vbGVhbkVsZW1lbnQoInByaW1hcnlLZXkiKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBjb2x1bW4uZ2V0UHJpbWFyeUtleSgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFByaW1hcnlLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRlbmFudERpc2NyaW1pbmF0b3JDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMyBjb2x1bW4gPSAoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVEVOQU5UX0RJU0NSSU1JTkFUT1JfQ09MVU1OKTsKLQotCQlhc3NlcnROb3ROdWxsKGNvbHVtbik7Ci0JCWFzc2VydE51bGwoY29sdW1uLmdldFByaW1hcnlLZXkoKSk7Ci0KLQkJY29sdW1uLnNldFByaW1hcnlLZXkoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBjb2x1bW4uZ2V0UHJpbWFyeUtleSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVGVuYW50RGlzY3JpbWluYXRvckNvbHVtbihwcmltYXJ5S2V5ID0gZmFsc2UpIiwgY3UpOwotCQkKLQkJY29sdW1uLnNldFByaW1hcnlLZXkobnVsbCk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJwcmltYXJ5S2V5IiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZWxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzNUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRWNsaXBzZWxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTAwNDhkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0VjbGlwc2VsaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuTXVsdGl0ZW5hbnRUeXBlMl8zOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFY2xpcHNlbGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfM1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzNKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFY2xpcHNlbGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfM1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11bHRpdGVuYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5NVUxUSVRFTkFOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE11bHRpdGVuYW50Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11bHRpdGVuYW50V2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5NVUxUSVRFTkFOVCwgRWNsaXBzZUxpbmsuTVVMVElURU5BTlRfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE11bHRpdGVuYW50KE11bHRpdGVuYW50VHlwZS5TSU5HTEVfVEFCTEUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q2FjaGVXaXRoSW5jbHVkZUNyaXRlcmlhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5NVUxUSVRFTkFOVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE11bHRpdGVuYW50KGluY2x1ZGVDcml0ZXJpYT10cnVlKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGl0ZW5hbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE11bHRpdGVuYW50KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0KLQkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UKTsKLQkJYXNzZXJ0Tm90TnVsbChtdWx0aXRlbmFudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdWx0aXRlbmFudFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBtdWx0aXRlbmFudCA9IChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVMVElURU5BTlQpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSwgbXVsdGl0ZW5hbnQuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNdWx0aXRlbmFudFdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBtdWx0aXRlbmFudCA9IChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVMVElURU5BTlQpOwotCQlhc3NlcnRFcXVhbHMoTXVsdGl0ZW5hbnRUeXBlMl8zLlNJTkdMRV9UQUJMRSwgbXVsdGl0ZW5hbnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQltdWx0aXRlbmFudC5zZXRWYWx1ZShNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCk7Ci0JCWFzc2VydEVxdWFscyhNdWx0aXRlbmFudFR5cGUyXzMuVEFCTEVfUEVSX1RFTkFOVCwgbXVsdGl0ZW5hbnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11bHRpdGVuYW50KFRBQkxFX1BFUl9URU5BTlQpIiwgY3UpOwotCQkKLQkJbXVsdGl0ZW5hbnQuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwobXVsdGl0ZW5hbnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKFRBQkxFX1BFUl9URU5BTlQpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11bHRpdGVuYW50IiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQE11bHRpdGVuYW50KCIsIGN1KTsKLQl9Ci0KLS8vCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0SW5jbHVkZUNyaXRlcmlhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEluY2x1ZGVDcml0ZXJpYSgpOwotLy8JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLS8vCQkKLS8vCQlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBtdWx0aXRlbmFudCA9IChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVMVElURU5BTlQpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11bHRpdGVuYW50LmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLS8vCX0KLS8vCQotLy8JcHVibGljIHZvaWQgdGVzdFNldEluY2x1ZGVDcml0ZXJpYSgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RDYWNoZVdpdGhJbmNsdWRlQ3JpdGVyaWEoKTsKLS8vCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0vLwkJCi0vLwkJRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMgbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UKTsKLS8vCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdWx0aXRlbmFudC5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0vLwkJCi0vLwkJbXVsdGl0ZW5hbnQuc2V0SW5jbHVkZUNyaXRlcmlhKEJvb2xlYW4uRkFMU0UpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdWx0aXRlbmFudC5nZXRJbmNsdWRlQ3JpdGVyaWEoKSk7Ci0vLwkJCi0vLwkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdWx0aXRlbmFudChpbmNsdWRlQ3JpdGVyaWE9ZmFsc2UpIiwgY3UpOwkJCi0vLwl9Ci0vLwkKLS8vCXB1YmxpYyB2b2lkIHRlc3RTZXRJbmNsdWRlQ3JpdGVyaWFOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0vLwkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENhY2hlV2l0aEluY2x1ZGVDcml0ZXJpYSgpOwotLy8JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLS8vCQkKLS8vCQlFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMyBtdWx0aXRlbmFudCA9IChFY2xpcHNlTGlua011bHRpdGVuYW50QW5ub3RhdGlvbjJfMykgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVMVElURU5BTlQpOwotLy8JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11bHRpdGVuYW50LmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLS8vCQkKLS8vCQltdWx0aXRlbmFudC5zZXRJbmNsdWRlQ3JpdGVyaWEobnVsbCk7Ci0vLwkJbXVsdGl0ZW5hbnQgPSAoRWNsaXBzZUxpbmtNdWx0aXRlbmFudEFubm90YXRpb24yXzMpIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VTFRJVEVOQU5UKTsKLS8vCQlhc3NlcnROdWxsKG11bHRpdGVuYW50LmdldEluY2x1ZGVDcml0ZXJpYSgpKTsKLS8vCQkKLS8vCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE11bHRpdGVuYW50IiwgY3UpOwotLy8JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJATXVsdGl0ZW5hbnQoIiwgY3UpOwotLy8JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvRXhpc3RlbmNlQ2hlY2tpbmdUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2ZkNzQyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0V4aXN0ZW5jZUNoZWNraW5nVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua0V4aXN0ZW5jZUNoZWNraW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FeGlzdGVuY2VUeXBlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFeGlzdGVuY2VDaGVja2luZ1Rlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQotCXB1YmxpYyBFeGlzdGVuY2VDaGVja2luZ1Rlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdEV4aXN0ZW5jZUNoZWNraW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5FWElTVEVOQ0VfQ0hFQ0tJTkcsIEVjbGlwc2VMaW5rLkVYSVNURU5DRV9UWVBFKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJARXhpc3RlbmNlQ2hlY2tpbmciKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORywgRWNsaXBzZUxpbmsuRVhJU1RFTkNFX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBFeGlzdGVuY2VDaGVja2luZyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGlzdGVuY2VDaGVja2luZygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmcoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWFzc2VydE5vdE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0RXhpc3RlbmNlQ2hlY2tpbmdXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24gZXhpc3RlbmNlQ2hlY2tpbmcgPSAoRWNsaXBzZUxpbmtFeGlzdGVuY2VDaGVja2luZ0Fubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkVYSVNURU5DRV9DSEVDS0lORyk7Ci0JCWFzc2VydEVxdWFscyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9FWElTVEVOQ0UsIGV4aXN0ZW5jZUNoZWNraW5nLmdldFZhbHVlKCkpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUoRXhpc3RlbmNlVHlwZS5BU1NVTUVfTk9OX0VYSVNURU5DRSk7Ci0JCWFzc2VydEVxdWFscyhFeGlzdGVuY2VUeXBlLkFTU1VNRV9OT05fRVhJU1RFTkNFLCBleGlzdGVuY2VDaGVja2luZy5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJARXhpc3RlbmNlQ2hlY2tpbmcoQVNTVU1FX05PTl9FWElTVEVOQ0UpIiwgY3UpOwotCQkKLQkJZXhpc3RlbmNlQ2hlY2tpbmcuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoZXhpc3RlbmNlQ2hlY2tpbmcuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiKEFTU1VNRV9OT05fRVhJU1RFTkNFKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBFeGlzdGVuY2VDaGVja2luZyIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBFeGlzdGVuY2VDaGVja2luZygiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pvaW5GZXRjaFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NjA5Y2MuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvSm9pbkZldGNoVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luRmV0Y2hUeXBlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBKb2luRmV0Y2hUZXN0cyBleHRlbmRzIEVjbGlwc2VMaW5rSmF2YVJlc291cmNlTW9kZWxUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgSm9pbkZldGNoVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2giKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5KT0lOX0ZFVENILCBFY2xpcHNlTGluay5KT0lOX0ZFVENIX1RZUEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBKb2luRmV0Y2goSm9pbkZldGNoVHlwZS5PVVRFUikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEpvaW5GZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0KLQkJRWNsaXBzZUxpbmtKb2luRmV0Y2hBbm5vdGF0aW9uIGpvaW5GZXRjaCA9IChFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5KT0lOX0ZFVENIKTsKLQkJYXNzZXJ0Tm90TnVsbChqb2luRmV0Y2gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQlhc3NlcnRFcXVhbHMoSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0Sm9pbkZldGNoV2l0aFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua0pvaW5GZXRjaEFubm90YXRpb24gam9pbkZldGNoID0gKEVjbGlwc2VMaW5rSm9pbkZldGNoQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkpPSU5fRkVUQ0gpOwotCQlhc3NlcnRFcXVhbHMoSm9pbkZldGNoVHlwZS5PVVRFUiwgam9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJam9pbkZldGNoLnNldFZhbHVlKEpvaW5GZXRjaFR5cGUuSU5ORVIpOwotCQlhc3NlcnRFcXVhbHMoSm9pbkZldGNoVHlwZS5JTk5FUiwgam9pbkZldGNoLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBKb2luRmV0Y2goSU5ORVIpIiwgY3UpOwotCQkKLQkJam9pbkZldGNoLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKGpvaW5GZXRjaC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoSU5ORVIpIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQEpvaW5GZXRjaCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIkBKb2luRmV0Y2goIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL0pwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkNWQwNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9KcHRFY2xpcHNlTGlua0NvcmVKYXZhUmVzb3VyY2VNb2RlbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotcHVibGljIGNsYXNzIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEpwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKENhY2hlVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ2hhbmdlVHJhY2tpbmdUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ29udmVydEFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQ3VzdG9taXplckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeGlzdGVuY2VDaGVja2luZ1Rlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpvaW5GZXRjaFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE11dGFibGVBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFY2xpcHNlTGlua1ByaW1hcnlLZXlBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJpdmF0ZU93bmVkVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVhZE9ubHlUZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRpbWVPZkRheVRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFRyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMFRlc3RzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VsaW5rTXVsdGl0ZW5hbnRBbm5vdGF0aW9uMl8zVGVzdHMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRWNsaXBzZUxpbmtUZW5hbnREaXNjcmltaW5hdG9yQ29sdW1uQW5ub3RhdGlvbjJfM1Rlc3RzLmNsYXNzKTsKLQkJCi0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLQlwcml2YXRlIEpwdEVjbGlwc2VMaW5rQ29yZUphdmFSZXNvdXJjZU1vZGVsVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5Q29udmVydEFubm90YXRpb24yXzBUZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTWFwS2V5Q29udmVydEFubm90YXRpb24yXzBUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2E2MzgwLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua01hcEtleUNvbnZlcnRBbm5vdGF0aW9uMl8wOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMFRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmsyXzBKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgTWFwS2V5Q29udmVydEFubm90YXRpb24yXzBUZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE1hcEtleUNvbnZlcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk1BUF9LRVlfQ09OVkVSVCk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE1hcEtleUNvbnZlcnQiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0Q29udmVydGVyV2l0aFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNYXBLZXlDb252ZXJ0KHZhbHVlPVwibXlDb252ZXJ0ZXJcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE1hcEtleUNvbnZlcnRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RNYXBLZXlDb252ZXJ0KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMCBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzApIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0VmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMCBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzApIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnQuc2V0VmFsdWUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnQuZ2V0VmFsdWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE1hcEtleUNvbnZlcnQodmFsdWU9XCJCYXJcIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdENvbnZlcnRlcldpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtNYXBLZXlDb252ZXJ0QW5ub3RhdGlvbjJfMCBjb252ZXJ0ID0gKEVjbGlwc2VMaW5rTWFwS2V5Q29udmVydEFubm90YXRpb24yXzApIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5NQVBfS0VZX0NPTlZFUlQpOwotCQlhc3NlcnRFcXVhbHMoIm15Q29udmVydGVyIiwgY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnQuc2V0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydC5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATWFwS2V5Q29udmVydCIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oInZhbHVlIiwgY3UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTXV0YWJsZUFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvTXV0YWJsZUFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQ0ZjBhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL011dGFibGVBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBNdXRhYmxlQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgTXV0YWJsZUFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE11dGFibGVXaXRoVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBNdXRhYmxlKHZhbHVlPXRydWUpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQotCQotCXB1YmxpYyB2b2lkIHRlc3RNdXRhYmxlQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSkpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwkJCi0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbihFY2xpcHNlTGluay5NVVRBQkxFKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0TXV0YWJsZVdpdGhWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbiBtdXRhYmxlQW5ub3RhdGlvbiA9IChFY2xpcHNlTGlua011dGFibGVBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuTVVUQUJMRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUsIG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLkZBTFNFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATXV0YWJsZSh2YWx1ZT1mYWxzZSkiLCBjdSk7Ci0JCQotCQltdXRhYmxlQW5ub3RhdGlvbi5zZXRWYWx1ZShudWxsKTsKLQkJbXV0YWJsZUFubm90YXRpb24uc2V0VmFsdWUoQm9vbGVhbi5GQUxTRSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJATXV0YWJsZShmYWxzZSkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE11dGFibGVXaXRoVmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rTXV0YWJsZUFubm90YXRpb24gbXV0YWJsZUFubm90YXRpb24gPSAoRWNsaXBzZUxpbmtNdXRhYmxlQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLk1VVEFCTEUpOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCBtdXRhYmxlQW5ub3RhdGlvbi5nZXRWYWx1ZSgpKTsKLQkJCi0JCW11dGFibGVBbm5vdGF0aW9uLnNldFZhbHVlKG51bGwpOwotCQlhc3NlcnROdWxsKG11dGFibGVBbm5vdGF0aW9uLmdldFZhbHVlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBNdXRhYmxlIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidmFsdWUiLCBjdSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9PYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMmYxNDkuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIE9iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQE9iamVjdFR5cGVDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkYXRhVHlwZT1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihvYmplY3RUeXBlPUZvby5jbGFzcykiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKG5hbWUgPSBcImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkZWZhdWx0T2JqZWN0VmFsdWUgPSBcImZcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIsIEVjbGlwc2VMaW5rLkNPTlZFUlNJT05fVkFMVUUpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGU9QmFyLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWNvbnZlcnRlci5zZXREYXRhVHlwZSgiaW50Iik7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGU9aW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERhdGFUeXBlTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEYXRhVHlwZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRhdGFUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUoIkJhciIpOwotCQlhc3NlcnRFcXVhbHMoIkJhciIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKG9iamVjdFR5cGU9QmFyLmNsYXNzKSIsIGN1KTsKLQkJCi0JCWNvbnZlcnRlci5zZXRPYmplY3RUeXBlKCJpbnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKG9iamVjdFR5cGU9aW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldE9iamVjdFR5cGUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJvYmplY3RUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJuYW1lPSIsIGN1KTsKLQl9Ci0JCi0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE9iamVjdFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aERlZmF1bHRPYmplY3RWYWx1ZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiZiIsIGNvbnZlcnRlci5nZXREZWZhdWx0T2JqZWN0VmFsdWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRPYmplY3RWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhEZWZhdWx0T2JqZWN0VmFsdWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImYiLCBjb252ZXJ0ZXIuZ2V0RGVmYXVsdE9iamVjdFZhbHVlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERlZmF1bHRPYmplY3RWYWx1ZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihkZWZhdWx0T2JqZWN0VmFsdWUgPSBcImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHRPYmplY3RWYWx1ZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoRGVmYXVsdE9iamVjdFZhbHVlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJmIiwgY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWNvbnZlcnRlci5zZXREZWZhdWx0T2JqZWN0VmFsdWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldERlZmF1bHRPYmplY3RWYWx1ZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRlZmF1bHRPYmplY3RWYWx1ZSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoMCwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCkuaGFzTmV4dCgpKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25WYWx1ZXMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCi0JCQotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDEpOwotCQkJCQotCQlhc3NlcnRFcXVhbHMoMiwgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlMaXN0SXRlcmF0b3I8RWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uPiBjb252ZXJzaW9uVmFsdWVzID0gY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXMoKS5pdGVyYXRvcigpOwotCQlhc3NlcnRUcnVlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0Tm90TnVsbChjb252ZXJzaW9uVmFsdWVzLm5leHQoKSk7Ci0JCWFzc2VydE5vdE51bGwoY29udmVyc2lvblZhbHVlcy5uZXh0KCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uVmFsdWVzMygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0T2JqZWN0VHlwZUNvbnZlcnRlcldpdGhDb252ZXJzaW9uVmFsdWVzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua09iamVjdFR5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuT0JKRUNUX1RZUEVfQ09OVkVSVEVSKTsKLQkJCQkKLQkJYXNzZXJ0RXF1YWxzKDIsIGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzU2l6ZSgpKTsKLQkJTGlzdEl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJRWNsaXBzZUxpbmtDb252ZXJzaW9uVmFsdWVBbm5vdGF0aW9uIGNvbnZlcnNpb25WYWx1ZSA9IGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJzaW9uVmFsdWUuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJY29udmVyc2lvblZhbHVlID0gY29udmVyc2lvblZhbHVlcy5uZXh0KCk7Ci0JCWFzc2VydEVxdWFscygiTSIsIGNvbnZlcnNpb25WYWx1ZS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RmFsc2UoY29udmVyc2lvblZhbHVlcy5oYXNOZXh0KCkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQkKLQkJY29udmVydGVyLmFkZENvbnZlcnNpb25WYWx1ZSgwKS5zZXRPYmplY3RWYWx1ZSgiRk9PIik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMSk7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0RGF0YVZhbHVlKCJCQVIiKTsKLQotCQlhc3NlcnRFcXVhbHMoIkJBUiIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldE9iamVjdFZhbHVlKCkpOwotCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihuYW1lID0gXCJiYXJcIiwgY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiQkFSXCIpLEBDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZX0pIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQ29udmVyc2lvblZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJCi0JCUl0ZXJhdG9yPEVjbGlwc2VMaW5rQ29udmVyc2lvblZhbHVlQW5ub3RhdGlvbj4gY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGZW1hbGUiLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnJlbW92ZUNvbnZlcnNpb25WYWx1ZSgxKTsKLQkJY29udmVyc2lvblZhbHVlcyA9IGNvbnZlcnRlci5nZXRDb252ZXJzaW9uVmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJYXNzZXJ0RXF1YWxzKCJGT08iLCBjb252ZXJzaW9uVmFsdWVzLm5leHQoKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVyc2lvblZhbHVlcy5uZXh0KCkuZ2V0T2JqZWN0VmFsdWUoKSk7Ci0JCWFzc2VydEZhbHNlKGNvbnZlcnNpb25WYWx1ZXMuaGFzTmV4dCgpKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCi0JCWNvbnZlcnRlci5yZW1vdmVDb252ZXJzaW9uVmFsdWUoMCk7Ci0JCWNvbnZlcnNpb25WYWx1ZXMgPSBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCWFzc2VydEVxdWFscygiTWFsZSIsIGNvbnZlcnNpb25WYWx1ZXMubmV4dCgpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRGYWxzZShjb252ZXJzaW9uVmFsdWVzLmhhc05leHQoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0gQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIikpIiwgY3UpOwotCi0JCQotCQljb252ZXJ0ZXIucmVtb3ZlQ29udmVyc2lvblZhbHVlKDApOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiQGNvbnZlcnNpb25WYWx1ZXMiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlciIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdE9iamVjdFR5cGVDb252ZXJ0ZXJXaXRoQ29udmVyc2lvblZhbHVlcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtPYmplY3RUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLk9CSkVDVF9UWVBFX0NPTlZFUlRFUik7Ci0JCWNvbnZlcnRlci5hZGRDb252ZXJzaW9uVmFsdWUoMCkuc2V0T2JqZWN0VmFsdWUoIkZPTyIpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBPYmplY3RUeXBlQ29udmVydGVyKGNvbnZlcnNpb25WYWx1ZXMgPSB7QENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKX0pIiwgY3UpOwotCi0JCWNvbnZlcnRlci5tb3ZlQ29udmVyc2lvblZhbHVlKDIsIDApOwotCQlhc3NlcnRFcXVhbHMoIkZlbWFsZSIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgwKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldERhdGFWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDEpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMSkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgyKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygzLCBjb252ZXJ0ZXIuZ2V0Q29udmVyc2lvblZhbHVlc1NpemUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJGXCIsIG9iamVjdFZhbHVlID0gXCJGZW1hbGVcIiksIEBDb252ZXJzaW9uVmFsdWUoZGF0YVZhbHVlID0gXCJNXCIsIG9iamVjdFZhbHVlID0gXCJNYWxlXCIpLCBAQ29udmVyc2lvblZhbHVlKG9iamVjdFZhbHVlID0gXCJGT09cIil9KSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdE1vdmVDb252ZXJzaW9uVmFsdWUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RPYmplY3RUeXBlQ29udmVydGVyV2l0aENvbnZlcnNpb25WYWx1ZXMoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rT2JqZWN0VHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5PQkpFQ1RfVFlQRV9DT05WRVJURVIpOwotCQljb252ZXJ0ZXIuYWRkQ29udmVyc2lvblZhbHVlKDApLnNldE9iamVjdFZhbHVlKCJGT08iKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAT2JqZWN0VHlwZUNvbnZlcnRlcihjb252ZXJzaW9uVmFsdWVzID0ge0BDb252ZXJzaW9uVmFsdWUob2JqZWN0VmFsdWUgPSBcIkZPT1wiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIkZcIiwgb2JqZWN0VmFsdWUgPSBcIkZlbWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShkYXRhVmFsdWUgPSBcIk1cIiwgb2JqZWN0VmFsdWUgPSBcIk1hbGVcIil9KSIsIGN1KTsKLQotCQljb252ZXJ0ZXIubW92ZUNvbnZlcnNpb25WYWx1ZSgwLCAyKTsKLQkJYXNzZXJ0RXF1YWxzKCJNYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDApLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIk0iLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMCkuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXRPYmplY3RWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGNvbnZlcnRlci5jb252ZXJzaW9uVmFsdWVBdCgxKS5nZXREYXRhVmFsdWUoKSk7Ci0JCWFzc2VydEVxdWFscygiRmVtYWxlIiwgY29udmVydGVyLmNvbnZlcnNpb25WYWx1ZUF0KDIpLmdldE9iamVjdFZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoIkYiLCBjb252ZXJ0ZXIuY29udmVyc2lvblZhbHVlQXQoMikuZ2V0RGF0YVZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMoMywgY29udmVydGVyLmdldENvbnZlcnNpb25WYWx1ZXNTaXplKCkpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQE9iamVjdFR5cGVDb252ZXJ0ZXIoY29udmVyc2lvblZhbHVlcyA9IHtAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiTVwiLCBvYmplY3RWYWx1ZSA9IFwiTWFsZVwiKSwgQENvbnZlcnNpb25WYWx1ZShvYmplY3RWYWx1ZSA9IFwiRk9PXCIpLCBAQ29udmVyc2lvblZhbHVlKGRhdGFWYWx1ZSA9IFwiRlwiLCBvYmplY3RWYWx1ZSA9IFwiRmVtYWxlXCIpfSkiLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1ByaXZhdGVPd25lZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkOGM2ZTguLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUHJpdmF0ZU93bmVkVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzLmludGVybmFsLnJlc291cmNlLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5Db2xsZWN0aW9uVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgUHJpdmF0ZU93bmVkVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFByaXZhdGVPd25lZFRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5QUklWQVRFX09XTkVEKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAUHJpdmF0ZU93bmVkIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UHJpdmF0ZU93bmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RQcml2YXRlT3duZWQoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rUHJpdmF0ZU93bmVkQW5ub3RhdGlvbiBwcml2YXRlT3duZWQgPSAoRWNsaXBzZUxpbmtQcml2YXRlT3duZWRBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUFJJVkFURV9PV05FRCk7Ci0JCWFzc2VydE5vdE51bGwocHJpdmF0ZU93bmVkKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRPbmx5VGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRPbmx5VGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkxZjU5Yy4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9SZWFkT25seVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkT25seUFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFJlYWRPbmx5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFJlYWRPbmx5VGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfT05MWSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFR5cGVBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFJlYWRPbmx5Iik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRPbmx5KCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uIHJlYWRPbmx5ID0gKEVjbGlwc2VMaW5rUmVhZE9ubHlBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX09OTFkpOwotCQlhc3NlcnROb3ROdWxsKHJlYWRPbmx5KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYjY1MmIuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkVHJhbnNmb3JtZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0UmVhZFRyYW5zZm9ybWVyV2l0aFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJDbGFzcz1Gb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBSZWFkVHJhbnNmb3JtZXIobWV0aG9kPVwidHJhbnNmb3JtZXJNZXRob2RcIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlYWRUcmFuc2Zvcm1lckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5yZW1vdmVBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpCTsKLQkJYXNzZXJ0TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuUkVBRF9UUkFOU0ZPUk1FUikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFJlYWRUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2Zvcm1lckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCXJlYWRUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCByZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUmVhZFRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3M9QmFyLmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtSZWFkVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHJlYWRUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5SRUFEX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCByZWFkVHJhbnNmb3JtZXIuZ2V0VHJhbnNmb3JtZXJDbGFzcygpKTsKLQkJCi0JCXJlYWRUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKG51bGwpOwotCQlhc3NlcnROdWxsKHJlYWRUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBSZWFkVHJhbnNmb3JtZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJ0cmFuc2Zvcm1lckNsYXNzIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCXJlYWRUcmFuc2Zvcm1lci5zZXRNZXRob2QoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIHJlYWRUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFJlYWRUcmFuc2Zvcm1lcihtZXRob2Q9XCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRob2ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RSZWFkVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1JlYWRUcmFuc2Zvcm1lckFubm90YXRpb24gcmVhZFRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rUmVhZFRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlJFQURfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgcmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCXJlYWRUcmFuc2Zvcm1lci5zZXRNZXRob2QobnVsbCk7Ci0JCWFzc2VydE51bGwocmVhZFRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAUmVhZFRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWV0aG9kIiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1N0cnVjdENvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2FhOWEuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvU3RydWN0Q29udmVydGVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnJlc291cmNlLmphdmEuRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aENvbnZlcnRlcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFN0cnVjdENvbnZlcnRlcihjb252ZXJ0ZXI9XCJGb29cIikiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBTdHJ1Y3RDb252ZXJ0ZXIobmFtZT1cImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U3RydWN0Q29udmVydGVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQuYWRkQW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcldpdGhDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldENvbnZlcnRlcigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoQ29udmVydGVyKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRDb252ZXJ0ZXIoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0Q29udmVydGVyKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIoY29udmVydGVyPVwiQmFyXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0Q29udmVydGVyTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aENvbnZlcnRlcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJY29udmVydGVyLnNldENvbnZlcnRlcihudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0Q29udmVydGVyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBTdHJ1Y3RDb252ZXJ0ZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjb252ZXJ0ZXIiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RTdHJ1Y3RDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5TVFJVQ1RfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0U3RydWN0Q29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtTdHJ1Y3RDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuU1RSVUNUX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZSgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFN0cnVjdENvbnZlcnRlcihuYW1lPVwiZm9vXCIpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFN0cnVjdENvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1N0cnVjdENvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rU3RydWN0Q29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlNUUlVDVF9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUobnVsbCk7Ci0JCWFzc2VydE51bGwoY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFN0cnVjdENvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9UaW1lT2ZEYXlUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGYyY2NkLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RpbWVPZkRheVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhdG9ycy5BcnJheUl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVGltZU9mRGF5VGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCi0JcHVibGljIFRpbWVPZkRheVRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoSG91cigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShob3VyPTUpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoTWludXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5DQUNIRSwgRWNsaXBzZUxpbmsuVElNRV9PRl9EQVkpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRUeXBlQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBDYWNoZShleHBpcnlUaW1lT2ZEYXkgPSBAVGltZU9mRGF5KG1pbnV0ZT01KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VGltZU9mRGF5V2l0aFNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShzZWNvbmQ9NSkpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuQ0FDSEUsIEVjbGlwc2VMaW5rLlRJTUVfT0ZfREFZKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kVHlwZUFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAQ2FjaGUoZXhwaXJ5VGltZU9mRGF5ID0gQFRpbWVPZkRheShtaWxsaXNlY29uZD01KSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RFeHBpcnlUaW1lT2ZEYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7Ci0JCQotCQlFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbiBjYWNoZSA9IChFY2xpcHNlTGlua0NhY2hlQW5ub3RhdGlvbikgcmVzb3VyY2VUeXBlLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuQ0FDSEUpOwotCQkKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQkKLQkJYXNzZXJ0Tm90TnVsbCh0aW1lT2ZEYXkpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0SG91cigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0SG91cigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0SG91cigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aEhvdXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0SG91cigpKTsKLQkJCi0JCXRpbWVPZkRheS5zZXRIb3VyKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldEhvdXIoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheShob3VyPTgwKSIsIGN1KTsKLQkJCi0JCXRpbWVPZkRheS5zZXRIb3VyKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRIb3VyKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihob3VyPTgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNaW51dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRpbWVPZkRheVdpdGhNaW51dGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOwotCQkKLQkJRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24gY2FjaGUgPSAoRWNsaXBzZUxpbmtDYWNoZUFubm90YXRpb24pIHJlc291cmNlVHlwZS5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLkNBQ0hFKTsKLQkJRWNsaXBzZUxpbmtUaW1lT2ZEYXlBbm5vdGF0aW9uIHRpbWVPZkRheSA9IGNhY2hlLmdldEV4cGlyeVRpbWVPZkRheSgpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDUpLCB0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbnV0ZShJbnRlZ2VyLnZhbHVlT2YoODApKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig4MCksIHRpbWVPZkRheS5nZXRNaW51dGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheShtaW51dGU9ODApIiwgY3UpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbnV0ZShudWxsKTsKLQkJYXNzZXJ0TnVsbCh0aW1lT2ZEYXkuZ2V0TWludXRlKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIihtaW51dGU9ODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheSIsIGN1KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0U2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoU2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0U2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUaW1lT2ZEYXlXaXRoU2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJCi0JCXRpbWVPZkRheS5zZXRTZWNvbmQoSW50ZWdlci52YWx1ZU9mKDgwKSk7Ci0JCWFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoODApLCB0aW1lT2ZEYXkuZ2V0U2Vjb25kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkoc2Vjb25kPTgwKSIsIGN1KTsKLQkJCi0JCXRpbWVPZkRheS5zZXRTZWNvbmQobnVsbCk7Ci0JCWFzc2VydE51bGwodGltZU9mRGF5LmdldFNlY29uZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIoc2Vjb25kPTgwKSIsIGN1KTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RHZXRNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbGxpc2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNaWxsaXNlY29uZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VGltZU9mRGF5V2l0aE1pbGxpc2Vjb25kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsKLQkJCi0JCUVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uIGNhY2hlID0gKEVjbGlwc2VMaW5rQ2FjaGVBbm5vdGF0aW9uKSByZXNvdXJjZVR5cGUuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5DQUNIRSk7Ci0JCUVjbGlwc2VMaW5rVGltZU9mRGF5QW5ub3RhdGlvbiB0aW1lT2ZEYXkgPSBjYWNoZS5nZXRFeHBpcnlUaW1lT2ZEYXkoKTsKLQkJYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig1KSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKEludGVnZXIudmFsdWVPZig4MCkpOwotCQlhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDgwKSwgdGltZU9mRGF5LmdldE1pbGxpc2Vjb25kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUaW1lT2ZEYXkobWlsbGlzZWNvbmQ9ODApIiwgY3UpOwotCQkKLQkJdGltZU9mRGF5LnNldE1pbGxpc2Vjb25kKG51bGwpOwotCQlhc3NlcnROdWxsKHRpbWVPZkRheS5nZXRNaWxsaXNlY29uZCgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCIobWlsbGlzZWNvbmQ9ODApIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRpbWVPZkRheSIsIGN1KTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvblRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzRkMGYuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuRmV0Y2hUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBUcmFuc2Zvcm1hdGlvbkFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uKG9wdGlvbmFsID0gdHJ1ZSkiKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoRmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OLCBKUEEuRkVUQ0hfVFlQRSk7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFRyYW5zZm9ybWF0aW9uKGZldGNoID0gRmV0Y2hUeXBlLkVBR0VSKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pKTsKLQkJCi0JCXJlc291cmNlRmllbGQuc2V0UHJpbWFyeUFubm90YXRpb24obnVsbCwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5zZXRQcmltYXJ5QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTiwgRW1wdHlJdGVyYWJsZS48U3RyaW5nPmluc3RhbmNlKCkpOwotCQlhc3NlcnROb3ROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRPcHRpb25hbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0T3B0aW9uYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aE9wdGlvbmFsKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uVFJVRSwgdHJhbnNmb3JtYXRpb24uZ2V0T3B0aW9uYWwoKSk7Ci0JCQotCQl0cmFuc2Zvcm1hdGlvbi5zZXRPcHRpb25hbChCb29sZWFuLkZBTFNFKTsKLQkJYXNzZXJ0RXF1YWxzKEJvb2xlYW4uRkFMU0UsIHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbihvcHRpb25hbCA9IGZhbHNlKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9wdGlvbmFsTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHJhbnNmb3JtYXRpb25XaXRoT3B0aW9uYWwoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uIHRyYW5zZm9ybWF0aW9uID0gKEVjbGlwc2VMaW5rVHJhbnNmb3JtYXRpb25Bbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuVFJBTlNGT1JNQVRJT04pOwotCQlhc3NlcnRFcXVhbHMoQm9vbGVhbi5UUlVFLCB0cmFuc2Zvcm1hdGlvbi5nZXRPcHRpb25hbCgpKTsKLQkJCi0JCXRyYW5zZm9ybWF0aW9uLnNldE9wdGlvbmFsKG51bGwpOwotCQlhc3NlcnROdWxsKHRyYW5zZm9ybWF0aW9uLmdldE9wdGlvbmFsKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbiIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9wdGlvbmFsIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmV0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFRyYW5zZm9ybWF0aW9uV2l0aEZldGNoKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbiB0cmFuc2Zvcm1hdGlvbiA9IChFY2xpcHNlTGlua1RyYW5zZm9ybWF0aW9uQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLlRSQU5TRk9STUFUSU9OKTsKLQkJYXNzZXJ0RXF1YWxzKEZldGNoVHlwZS5FQUdFUiwgdHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJdHJhbnNmb3JtYXRpb24uc2V0RmV0Y2goRmV0Y2hUeXBlLkxBWlkpOwotCQlhc3NlcnRFcXVhbHMoRmV0Y2hUeXBlLkxBWlksIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUcmFuc2Zvcm1hdGlvbihmZXRjaCA9IExBWlkpIiwgY3UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RmV0Y2hOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUcmFuc2Zvcm1hdGlvbldpdGhGZXRjaCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24gdHJhbnNmb3JtYXRpb24gPSAoRWNsaXBzZUxpbmtUcmFuc2Zvcm1hdGlvbkFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5UUkFOU0ZPUk1BVElPTik7Ci0JCWFzc2VydEVxdWFscyhGZXRjaFR5cGUuRUFHRVIsIHRyYW5zZm9ybWF0aW9uLmdldEZldGNoKCkpOwotCQkKLQkJdHJhbnNmb3JtYXRpb24uc2V0RmV0Y2gobnVsbCk7Ci0JCWFzc2VydE51bGwodHJhbnNmb3JtYXRpb24uZ2V0RmV0Y2goKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFRyYW5zZm9ybWF0aW9uIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigiZmV0Y2giLCBjdSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9lY2xpcHNlbGluay9jb3JlL3Rlc3RzL2ludGVybmFsL3Jlc291cmNlL2phdmEvVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmE4N2ZmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExIE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS50ZXN0cy5pbnRlcm5hbC5yZXNvdXJjZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQ29sbGVjdGlvblRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUucmVzb3VyY2UuamF2YS5FY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uOwotCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBUeXBlQ29udmVydGVyQW5ub3RhdGlvblRlc3RzIGV4dGVuZHMgRWNsaXBzZUxpbmtKYXZhUmVzb3VyY2VNb2RlbFRlc3RDYXNlIHsKLQkKLQlwdWJsaWMgVHlwZUNvbnZlcnRlckFubm90YXRpb25UZXN0cyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVGVzdFR5cGUobmV3IERlZmF1bHRBbm5vdGF0aW9uV3JpdGVyKCkgewotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpbXBvcnRzKCkgewotCQkJCXJldHVybiBuZXcgQXJyYXlJdGVyYXRvcjxTdHJpbmc+KEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJCX0KLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgYXBwZW5kSWRGaWVsZEFubm90YXRpb25UbyhTdHJpbmdCdWlsZGVyIHNiKSB7Ci0JCQkJc2IuYXBwZW5kKCJAVHlwZUNvbnZlcnRlciIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG9iamVjdFR5cGUgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBUeXBlQ29udmVydGVyKG5hbWUgPSBcImJhclwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0VHlwZUNvbnZlcnRlckFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXIoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCWFzc2VydE5vdE51bGwocmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKSk7Ci0JCQotCQlyZXNvdXJjZUZpZWxkLnJlbW92ZUFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHlwZURhdGFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aERhdGFUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIoZGF0YVR5cGUgPSBCYXIuY2xhc3MpIiwgY3UpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKCJpbnQiKTsKLQkJYXNzZXJ0RXF1YWxzKCJpbnQiLCBjb252ZXJ0ZXIuZ2V0RGF0YVR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihkYXRhVHlwZSA9IGludC5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXREYXRhVHlwZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoRGF0YVR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldERhdGFUeXBlKCkpOwotCQkKLQkJY29udmVydGVyLnNldERhdGFUeXBlKG51bGwpOwotCQlhc3NlcnROdWxsKGNvbnZlcnRlci5nZXREYXRhVHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oImRhdGFUeXBlIiwgY3UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRUeXBlT2JqZWN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhPYmplY3RUeXBlKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIGNvbnZlcnRlci5nZXRPYmplY3RUeXBlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTZXRPYmplY3RUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiQmFyIik7Ci0JCWFzc2VydEVxdWFscygiQmFyIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFR5cGVDb252ZXJ0ZXIob2JqZWN0VHlwZSA9IEJhci5jbGFzcykiLCBjdSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZSgiaW50Iik7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlcihvYmplY3RUeXBlID0gaW50LmNsYXNzKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE9iamVjdFR5cGVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE9iamVjdFR5cGUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgY29udmVydGVyLmdldE9iamVjdFR5cGUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0T2JqZWN0VHlwZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0T2JqZWN0VHlwZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm9iamVjdFR5cGUiLCBjdSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFR5cGVDb252ZXJ0ZXJXaXRoTmFtZSgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbiBjb252ZXJ0ZXIgPSAoRWNsaXBzZUxpbmtUeXBlQ29udmVydGVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKDAsIEVjbGlwc2VMaW5rLlRZUEVfQ09OVkVSVEVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJiYXIiLCBjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2V0TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0VHlwZUNvbnZlcnRlcldpdGhOYW1lKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uIGNvbnZlcnRlciA9IChFY2xpcHNlTGlua1R5cGVDb252ZXJ0ZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oMCwgRWNsaXBzZUxpbmsuVFlQRV9DT05WRVJURVIpOwotCQlhc3NlcnRFcXVhbHMoImJhciIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJY29udmVydGVyLnNldE5hbWUoImZvbyIpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIGNvbnZlcnRlci5nZXROYW1lKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBUeXBlQ29udmVydGVyKG5hbWUgPSBcImZvb1wiKSIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFNldE5hbWVOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RUeXBlQ29udmVydGVyV2l0aE5hbWUoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24gY29udmVydGVyID0gKEVjbGlwc2VMaW5rVHlwZUNvbnZlcnRlckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbigwLCBFY2xpcHNlTGluay5UWVBFX0NPTlZFUlRFUik7Ci0JCWFzc2VydEVxdWFscygiYmFyIiwgY29udmVydGVyLmdldE5hbWUoKSk7Ci0JCQotCQljb252ZXJ0ZXIuc2V0TmFtZShudWxsKTsKLQkJYXNzZXJ0TnVsbChjb252ZXJ0ZXIuZ2V0TmFtZSgpKTsKLQkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAVHlwZUNvbnZlcnRlciIsIGN1KTsKLQkJYXNzZXJ0U291cmNlRG9lc05vdENvbnRhaW4oIm5hbWU9IiwgY3UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZWNsaXBzZWxpbmsvY29yZS90ZXN0cy9pbnRlcm5hbC9yZXNvdXJjZS9qYXZhL1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgyYzhmNS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2VjbGlwc2VsaW5rL2NvcmUvdGVzdHMvaW50ZXJuYWwvcmVzb3VyY2UvamF2YS9Xcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMSBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMuaW50ZXJuYWwucmVzb3VyY2UuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUZpZWxkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLkNvbGxlY3Rpb25Ub29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmF0b3JzLkFycmF5SXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSlBBOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZWNsaXBzZWxpbmsuY29yZS5yZXNvdXJjZS5qYXZhLkVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb247Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIFdyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uVGVzdHMgZXh0ZW5kcyBFY2xpcHNlTGlua0phdmFSZXNvdXJjZU1vZGVsVGVzdENhc2UgewotCQotCXB1YmxpYyBXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvblRlc3RzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyKHRyYW5zZm9ybWVyQ2xhc3MgPSBGb28uY2xhc3MpIik7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb21waWxhdGlvblVuaXQgY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRlc3RUeXBlKG5ldyBEZWZhdWx0QW5ub3RhdGlvbldyaXRlcigpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaW1wb3J0cygpIHsKLQkJCQlyZXR1cm4gbmV3IEFycmF5SXRlcmF0b3I8U3RyaW5nPihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCQl9Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGFwcGVuZElkRmllbGRBbm5vdGF0aW9uVG8oU3RyaW5nQnVpbGRlciBzYikgewotCQkJCXNiLmFwcGVuZCgiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJ0cmFuc2Zvcm1lck1ldGhvZFwiKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aENvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUZXN0VHlwZShuZXcgRGVmYXVsdEFubm90YXRpb25Xcml0ZXIoKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGltcG9ydHMoKSB7Ci0JCQkJcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yPFN0cmluZz4oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIsIEpQQS5DT0xVTU4pOwotCQkJfQotCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgdm9pZCBhcHBlbmRJZEZpZWxkQW5ub3RhdGlvblRvKFN0cmluZ0J1aWxkZXIgc2IpIHsKLQkJCQlzYi5hcHBlbmQoIkBXcml0ZVRyYW5zZm9ybWVyKGNvbHVtbiA9IEBDb2x1bW4obmFtZSA9IFwiRk9PXCIpKSIpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHRlc3RXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpKTsKLQkJCi0JCXJlc291cmNlRmllbGQucmVtb3ZlQW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUikJOwotCQlhc3NlcnROdWxsKHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUikpOwotCQkKLQkJcmVzb3VyY2VGaWVsZC5hZGRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0VHJhbnNmb3JtZXJDbGFzcygpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFRyYW5zZm9ybWVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoVHJhbnNmb3JtZXJDbGFzcygpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJd3JpdGVUcmFuc2Zvcm1lci5zZXRUcmFuc2Zvcm1lckNsYXNzKCJCYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJCYXIiLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIodHJhbnNmb3JtZXJDbGFzcyA9IEJhci5jbGFzcykiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRUcmFuc2Zvcm1lckNsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhUcmFuc2Zvcm1lckNsYXNzKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCB3cml0ZVRyYW5zZm9ybWVyLmdldFRyYW5zZm9ybWVyQ2xhc3MoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnNldFRyYW5zZm9ybWVyQ2xhc3MobnVsbCk7Ci0JCWFzc2VydE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRUcmFuc2Zvcm1lckNsYXNzKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigidHJhbnNmb3JtZXJDbGFzcyIsIGN1KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhNZXRob2QoKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnRFcXVhbHMoInRyYW5zZm9ybWVyTWV0aG9kIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQl3cml0ZVRyYW5zZm9ybWVyLnNldE1ldGhvZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRNZXRob2QoKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIobWV0aG9kID0gXCJmb29cIikiLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3RTZXRNZXRob2ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aE1ldGhvZCgpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydEVxdWFscygidHJhbnNmb3JtZXJNZXRob2QiLCB3cml0ZVRyYW5zZm9ybWVyLmdldE1ldGhvZCgpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuc2V0TWV0aG9kKG51bGwpOwotCQlhc3NlcnROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0TWV0aG9kKCkpOwotCQkKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyIiwgY3UpOwotCQlhc3NlcnRTb3VyY2VEb2VzTm90Q29udGFpbigibWV0aG9kIiwgY3UpOwotCX0KLQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sdW1uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSB0aGlzLmNyZWF0ZVRlc3RXcml0ZVRyYW5zZm9ybWVyV2l0aENvbHVtbigpOwotCQlKYXZhUmVzb3VyY2VUeXBlIHJlc291cmNlVHlwZSA9IGJ1aWxkSmF2YVJlc291cmNlVHlwZShjdSk7IAotCQlKYXZhUmVzb3VyY2VGaWVsZCByZXNvdXJjZUZpZWxkID0gQ29sbGVjdGlvblRvb2xzLmdldChyZXNvdXJjZVR5cGUuZ2V0RmllbGRzKCksIDApOwotCQkKLQkJRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbiB3cml0ZVRyYW5zZm9ybWVyID0gKEVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24pIHJlc291cmNlRmllbGQuZ2V0QW5ub3RhdGlvbihFY2xpcHNlTGluay5XUklURV9UUkFOU0ZPUk1FUik7Ci0JCWFzc2VydE5vdE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7Ci0JCWFzc2VydEVxdWFscygiRk9PIiwgd3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKS5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuY3JlYXRlVGVzdFdyaXRlVHJhbnNmb3JtZXJXaXRoTWV0aG9kKCk7Ci0JCUphdmFSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBlID0gYnVpbGRKYXZhUmVzb3VyY2VUeXBlKGN1KTsgCi0JCUphdmFSZXNvdXJjZUZpZWxkIHJlc291cmNlRmllbGQgPSBDb2xsZWN0aW9uVG9vbHMuZ2V0KHJlc291cmNlVHlwZS5nZXRGaWVsZHMoKSwgMCk7Ci0JCQotCQlFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uIHdyaXRlVHJhbnNmb3JtZXIgPSAoRWNsaXBzZUxpbmtXcml0ZVRyYW5zZm9ybWVyQW5ub3RhdGlvbikgcmVzb3VyY2VGaWVsZC5nZXRBbm5vdGF0aW9uKEVjbGlwc2VMaW5rLldSSVRFX1RSQU5TRk9STUVSKTsKLQkJYXNzZXJ0TnVsbCh3cml0ZVRyYW5zZm9ybWVyLmdldENvbHVtbigpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIuYWRkQ29sdW1uKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOwkJCi0JCWFzc2VydFNvdXJjZUNvbnRhaW5zKCJAV3JpdGVUcmFuc2Zvcm1lcihtZXRob2QgPSBcInRyYW5zZm9ybWVyTWV0aG9kXCIsIGNvbHVtbiA9IEBDb2x1bW4pIiwgY3UpOwotCQkKLQkJd3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKS5zZXROYW1lKCJCQVIiKTsKLQkJYXNzZXJ0U291cmNlQ29udGFpbnMoIkBXcml0ZVRyYW5zZm9ybWVyKG1ldGhvZCA9IFwidHJhbnNmb3JtZXJNZXRob2RcIiwgY29sdW1uID0gQENvbHVtbihuYW1lID0gXCJCQVJcIikpIiwgY3UpOwotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUNvbHVtbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gdGhpcy5jcmVhdGVUZXN0V3JpdGVUcmFuc2Zvcm1lcldpdGhDb2x1bW4oKTsKLQkJSmF2YVJlc291cmNlVHlwZSByZXNvdXJjZVR5cGUgPSBidWlsZEphdmFSZXNvdXJjZVR5cGUoY3UpOyAKLQkJSmF2YVJlc291cmNlRmllbGQgcmVzb3VyY2VGaWVsZCA9IENvbGxlY3Rpb25Ub29scy5nZXQocmVzb3VyY2VUeXBlLmdldEZpZWxkcygpLCAwKTsKLQkJCi0JCUVjbGlwc2VMaW5rV3JpdGVUcmFuc2Zvcm1lckFubm90YXRpb24gd3JpdGVUcmFuc2Zvcm1lciA9IChFY2xpcHNlTGlua1dyaXRlVHJhbnNmb3JtZXJBbm5vdGF0aW9uKSByZXNvdXJjZUZpZWxkLmdldEFubm90YXRpb24oRWNsaXBzZUxpbmsuV1JJVEVfVFJBTlNGT1JNRVIpOwotCQlhc3NlcnROb3ROdWxsKHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkpOwotCQlhc3NlcnRFcXVhbHMoIkZPTyIsIHdyaXRlVHJhbnNmb3JtZXIuZ2V0Q29sdW1uKCkuZ2V0TmFtZSgpKTsKLQkJCi0JCXdyaXRlVHJhbnNmb3JtZXIucmVtb3ZlQ29sdW1uKCk7Ci0JCWFzc2VydE51bGwod3JpdGVUcmFuc2Zvcm1lci5nZXRDb2x1bW4oKSk7Ci0JCQotCQlhc3NlcnRTb3VyY2VDb250YWlucygiQFdyaXRlVHJhbnNmb3JtZXIiLCBjdSk7Ci0JCWFzc2VydFNvdXJjZURvZXNOb3RDb250YWluKCJjb2x1bW4iLCBjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGdldE5vbk51bGxDb2x1bW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC54bWwgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5lY2xpcHNlbGluay5jb3JlLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjNiNWRiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmVjbGlwc2VsaW5rLmNvcmUudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLmNsYXNzcGF0aCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE1MTRlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg1NzdiLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGVhZWJlLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowOTozOCBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0MmQwYS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmRiO2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbjtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvYWJvdXQuaHRtbCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzM1ODcuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4MWE2NzQuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0jIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAsIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uCi0jIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBPcmFjbGUgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXBsdWdpbk5hbWU9SmF2YSBQZXJzaXN0ZW5jZSBUb29scyBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvZ2VuL3Rlc3RzL2ludGVybmFsL0VudGl0eUdlblRvb2xzVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWU4NzBmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvRW50aXR5R2VuVG9vbHNUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmdlbi5pbnRlcm5hbC51dGlsLkVudGl0eUdlblRvb2xzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIAotICovCi1AU3VwcHJlc3NXYXJuaW5ncygibmxzIikKLXB1YmxpYyBjbGFzcyBFbnRpdHlHZW5Ub29sc1Rlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEVudGl0eUdlblRvb2xzVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTEoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1b28iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUzKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiZm9vIik7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWU0KCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGb29CYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb19iYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIkZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVDbGFzc05hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJGb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiRm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUNsYXNzTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQ2xhc3NOYW1lKCI0Rk9PX0JBUiIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUxKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJmb28iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiX0ZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyoiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoIl9vbyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjVvbyIsIG5hbWVzKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUyKCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCW5hbWVzLmFkZCgiRm9vIik7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvbyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPTyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT18iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvbzIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX29vIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNU9PIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTMoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJmb28iKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb28yIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT08iLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb18iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT08qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfb28iLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCI1T08iLCBuYW1lcykpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lNCgpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZvb0JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vX2JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoImZvb19iYXIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIl9GT09fQkFSIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJGT09fQkFSXyIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyXyIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfKiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiX2Zvb0JhciIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIjRGT09fQkFSIiwgbmFtZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZTUoKSB7Ci0JCUhhc2hTZXQ8U3RyaW5nPiBuYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJbmFtZXMuYWRkKCJGb29CYXIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXIyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRm9vQmFyIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29fYmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiZm9vX2JhciIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVIiLCBuYW1lcykpOwotCQlhc3NlcnRFcXVhbHMoImZvb0JhcjIiLCBFbnRpdHlHZW5Ub29scy5jb252ZXJ0VG9VbmlxdWVKYXZhU3R5bGVBdHRyaWJ1dGVOYW1lKCJfRk9PX0JBUiIsIG5hbWVzKSk7Ci0JCWFzc2VydEVxdWFscygiZm9vQmFyMiIsIEVudGl0eUdlblRvb2xzLmNvbnZlcnRUb1VuaXF1ZUphdmFTdHlsZUF0dHJpYnV0ZU5hbWUoIkZPT19CQVJfIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJmb29CYXJfIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiRk9PX0JBUl8qIiwgbmFtZXMpKTsKLQkJYXNzZXJ0RXF1YWxzKCJfZm9vQmFyIiwgRW50aXR5R2VuVG9vbHMuY29udmVydFRvVW5pcXVlSmF2YVN0eWxlQXR0cmlidXRlTmFtZSgiNEZPT19CQVIiLCBuYW1lcykpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFHZW5UZXN0cy5qYXZhIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL2dlbi90ZXN0cy9pbnRlcm5hbC9KcHRKcGFHZW5UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzBkZDg0Li4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS9nZW4vdGVzdHMvaW50ZXJuYWwvSnB0SnBhR2VuVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLmludGVybmFsLkVudGl0eUdlblRvb2xzVGVzdHM7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRKcGFHZW5UZXN0cyB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoIkpQVCBFbnRpdHkgR2VuZXJhdGlvbiBUZXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFbnRpdHlHZW5Ub29sc1Rlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0SnBhR2VuVGVzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3Rlc3QueG1sIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzL3Rlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGEwMjdmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLmdlbi50ZXN0cy90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLQotICBDb250cmlidXRvcnM6Ci0gICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gLS0+Ci08cHJvamVjdCBuYW1lPSJ0ZXN0c3VpdGUiIGRlZmF1bHQ9InJ1biIgYmFzZWRpcj0iLiI+Ci0JPCEtLSBUaGUgcHJvcGVydHkgJHtlY2xpcHNlLWhvbWV9IHNob3VsZCBiZSBwYXNzZWQgaW50byB0aGlzIHNjcmlwdCAtLT4KLQk8IS0tIFNldCBhIG1lYW5pbmdmdWwgZGVmYXVsdCB2YWx1ZSBmb3Igd2hlbiBpdCBpcyBub3QuIC0tPgotCTxlY2hvIG1lc3NhZ2U9ImJhc2VkaXIgJHtiYXNlZGlyfSIgLz4KLQk8ZWNobyBtZXNzYWdlPSJlY2xpcHNlIHBsYWNlICR7ZWNsaXBzZS1ob21lfSIgLz4KLQk8IS0tIHNldHMgdGhlIHByb3BlcnRpZXMgcGx1Z2luLW5hbWUgLS0+Ci0JPHByb3BlcnR5IG5hbWU9InBsdWdpbi1uYW1lIiB2YWx1ZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5nZW4udGVzdHMiLz4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgYWxsIGluaXRpYWxpemF0aW9uIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBkb25lIGZvciAtLT4KLQk8IS0tIGFsbCB0ZXN0cyB0aGF0IGFyZSB0byBiZSBydW4uIEluaXRpYWxpemF0aW9uIGZvciBpbmRpdmlkdWFsIHRlc3RzIC0tPgotCTwhLS0gc2hvdWxkIGJlIGRvbmUgd2l0aGluIHRoZSBib2R5IG9mIHRoZSBzdWl0ZSB0YXJnZXQuIC0tPgotCTx0YXJnZXQgbmFtZT0iaW5pdCI+Ci0JCTx0c3RhbXAvPgotCQk8ZGVsZXRlPgotCQkJPGZpbGVzZXQgZGlyPSIke2VjbGlwc2UtaG9tZX0iIGluY2x1ZGVzPSJvcmcqLnhtbCIvPgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgZGVmaW5lcyB0aGUgdGVzdHMgdGhhdCBuZWVkIHRvIGJlIHJ1bi4gLS0+Ci0JPHRhcmdldCBuYW1lPSJzdWl0ZSI+Ci0JCTxhbnQgdGFyZ2V0PSJnZW4tdGVzdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGEuZ2VuLnRlc3RzLmludGVybmFsLkpwdEpwYUdlblRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9IiIvPgotCQk8L2FudD4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlLCBjbGVhbnVwIj4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY2xhc3NwYXRoIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2ZWJmYi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvdWkvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pwdC9qcGEvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi9jb3JlLyoqIi8+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvY29tbW9uL3V0aWxpdHkvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY3ZzaWdub3JlIGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluCmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8ucHJvamVjdCBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjBlZTFmLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZTcwZDMuLjAwMDAwMDAKLS0tIGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBNYXIgMDggMTI6MDk6NTIgRVNUIDIwMTEKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS41CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGJmYTMyLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IAotIG9yZy5qdW5pdDtidW5kbGUtdmVyc2lvbj0iNC4zLjEiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qZmFjZSwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS50ZXN0cy5leHRlbnNpb24ucmVzb3VyY2UsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LAotIG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLAotIG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcjtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLnVpLmZvcm1zO2J1bmRsZS12ZXJzaW9uPSIzLjMuMTAwIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IjMuNC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzLmludGVybmFsLnBsYXRmb3JtO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGYwYWEzLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMTAgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM4ODdhZC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBPcmFjbGUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIFVJIFRlc3RzCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KZGlmZiAtLWdpdCBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL0pwdFVpVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyNzc5MS4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9KcHRVaVRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IE9yYWNsZS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybS5KcHRVaVBsYXRmb3JtVGVzdHM7Ci0KLS8qKgotICogUnVucyBhbGwgSlBUIFVJIFRlc3RzCi0gKi8KLXB1YmxpYyBjbGFzcyBKcHRVaVRlc3RzIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShKcHRVaVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0KEpwdFVpUGxhdGZvcm1UZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VWlUZXN0cygpIHsKLQkJc3VwZXIoKTsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMuamF2YSBiL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYwYWZhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhL3VpL3Rlc3RzL2ludGVybmFsL3BsYXRmb3JtL0pwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBDb3B5cmlnaHQgKGMpIDIwMTAgIE9yYWNsZS4gCi0gKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIAotICogIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotICogIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAotICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAgCi0gKiAgQ29udHJpYnV0b3JzOiAKLSAqICAJT3JhY2xlIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwucGxhdGZvcm0uSnBhUGxhdGZvcm1NYW5hZ2VySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuZXh0ZW5zaW9uLnJlc291cmNlLkV4dGVuc2lvblRlc3RQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnRlc3RzLmV4dGVuc2lvbi5yZXNvdXJjZS5UZXN0SnBhUGxhdGZvcm1Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUudGVzdHMuaW50ZXJuYWwucHJvamVjdHMuVGVzdEpwYVByb2plY3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQotcHVibGljIGNsYXNzIEpwYVBsYXRmb3JtVWlFeHRlbnNpb25UZXN0cyBleHRlbmRzIFRlc3RDYXNlCi17Ci0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IHRlc3RQcm9qZWN0OwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9OQU1FID0gIkV4dGVuc2lvblRlc3RQcm9qZWN0IjsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLQUdFX05BTUUgPSAiZXh0ZW5zaW9uLnRlc3QiOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTFVHSU5fQ0xBU1MgPSBFeHRlbnNpb25UZXN0UGx1Z2luLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BMVUdJTl9JRCA9IEV4dGVuc2lvblRlc3RQbHVnaW4uUExVR0lOX0lEOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9JRCA9IFRlc3RKcGFQbGF0Zm9ybVByb3ZpZGVyLklEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUExBVEZPUk1fQ0xBU1MgPSBUZXN0SnBhUGxhdGZvcm1Qcm92aWRlci5jbGFzcy5nZXROYW1lKCk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9QTEFURk9STV9MQUJFTCA9ICJUZXN0IEpwYSBQbGF0Zm9ybSI7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1VJX1BMQVRGT1JNX0lEID0gVEVTVF9QTEFURk9STV9JRDsKLQotCXB1YmxpYyBKcGFQbGF0Zm9ybVVpRXh0ZW5zaW9uVGVzdHMoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJdGhpcy50ZXN0UHJvamVjdCA9IHRoaXMuYnVpbGRKcGFQcm9qZWN0KFBST0pFQ1RfTkFNRSwgZmFsc2UpOyAgLy8gZmFsc2UgPSBubyBhdXRvLWJ1aWxkCi0JfQotCi0JcHJvdGVjdGVkIFRlc3RKcGFQcm9qZWN0IGJ1aWxkSnBhUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUsIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBUZXN0SnBhUHJvamVjdChwcm9qZWN0TmFtZSwgYXV0b0J1aWxkKTsgIC8vIGZhbHNlID0gbm8gYXV0by1idWlsZAotCX0KLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpLmRlbGV0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJdGhpcy50ZXN0UHJvamVjdCA9IG51bGw7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEpwYVByb2plY3QganBhUHJvamVjdCgpIHsKLQkJcmV0dXJuIHRoaXMudGVzdFByb2plY3QuZ2V0SnBhUHJvamVjdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RKcGFQbGF0Zm9ybSgpIHsKLQkJYXNzZXJ0Tm90TnVsbChKcGFQbGF0Zm9ybU1hbmFnZXJJbXBsLmluc3RhbmNlKCkuYnVpbGRKcGFQbGF0Zm9ybUltcGxlbWVudGF0aW9uKHRoaXMudGVzdFByb2plY3QuZ2V0UHJvamVjdCgpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGEudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGEvdWkvdGVzdHMvaW50ZXJuYWwvcGxhdGZvcm0vSnB0VWlQbGF0Zm9ybVRlc3RzLmphdmEgYi9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjk2MC4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYS91aS90ZXN0cy9pbnRlcm5hbC9wbGF0Zm9ybS9KcHRVaVBsYXRmb3JtVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgT3JhY2xlLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYS51aS50ZXN0cy5pbnRlcm5hbC5wbGF0Zm9ybTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLXB1YmxpYyBjbGFzcyBKcHRVaVBsYXRmb3JtVGVzdHMKLXsKLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoSnB0VWlQbGF0Zm9ybVRlc3RzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSnBhUGxhdGZvcm1VaUV4dGVuc2lvblRlc3RzLmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotCXByaXZhdGUgSnB0VWlQbGF0Zm9ybVRlc3RzKCkgewotCQlzdXBlcigpOwotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51aS50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI5YmQ3Zi4uMDAwMDAwMAotLS0gYS9qcGEvdGVzdHMvb3JnLmVjbGlwc2UuanB0LnVpLnRlc3RzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQudWkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLnRlc3RzPC9jb21tZW50PgotPC9wcm9qZWN0RGVzY3JpcHRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0IGIvanBhL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC51dGlsaXR5LnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzcxZTlhLi4wMDAwMDAwCi0tLSBhL2pwYS90ZXN0cy9vcmcuZWNsaXBzZS5qcHQudXRpbGl0eS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LnV0aWxpdHkudGVzdHM8L25hbWU+Ci0JPGNvbW1lbnQ+cmVuYW1lZCB0byBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkudGVzdHMgYW5kIG1vdmVkIHRvIGNvbW1vbiBjb21wb25lbnQ8L2NvbW1lbnQ+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvLnByb2plY3QgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTBjMGJiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZWxlbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nL3BvbS54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYTM1NDAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlbGVuZy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JCi0JPGdyb3VwSWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3I8L2dyb3VwSWQ+Ci0JPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3JfcGFyZW50PC9hcnRpZmFjdElkPgotCTx2ZXJzaW9uPjEuMS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCTxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0JCi0JPHByb3BlcnRpZXM+Ci0JCTx0eWNoby12ZXJzaW9uPjAuOS4wPC90eWNoby12ZXJzaW9uPgotCTwvcHJvcGVydGllcz4KLQkKLQk8bW9kdWxlcz4KLQkJPG1vZHVsZT4uLi8uLi9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpPC9tb2R1bGU+Ci0JCTwhLS0gbW9kdWxlPi4uLy4uL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzPC9tb2R1bGUgLS0+Ci0JCTxtb2R1bGU+Li4vLi4vZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZTwvbW9kdWxlPgotCQk8bW9kdWxlPi4uL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlcG9zaXRvcnk8L21vZHVsZT4KLQk8L21vZHVsZXM+Ci0JCi0JPGJ1aWxkPgotCQk8cGx1Z2lucz4KLQkJCTxwbHVnaW4+Ci0JCQkJPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLnR5Y2hvPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPnR5Y2hvLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8dmVyc2lvbj4ke3R5Y2hvLXZlcnNpb259PC92ZXJzaW9uPgotCQkJCTxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0JCQk8L3BsdWdpbj4KLQkJCTxwbHVnaW4+Ci0JCQkJPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLnR5Y2hvPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPnRhcmdldC1wbGF0Zm9ybS1jb25maWd1cmF0aW9uPC9hcnRpZmFjdElkPgotCQkJCTx2ZXJzaW9uPiR7dHljaG8tdmVyc2lvbn08L3ZlcnNpb24+Ci0JCQkJPGNvbmZpZ3VyYXRpb24+Ci0JCQkJCTxyZXNvbHZlcj5wMjwvcmVzb2x2ZXI+Ci0JCQkJPC9jb25maWd1cmF0aW9uPgotCQkJPC9wbHVnaW4+Ci0JCTwvcGx1Z2lucz4KLQk8L2J1aWxkPgotCQotCTxyZXBvc2l0b3JpZXM+Ci0JCTxyZXBvc2l0b3J5PgotCQkJPGlkPmluZGlnbzwvaWQ+Ci0JCQk8dXJsPmh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy9zdGFnaW5nLzwvdXJsPgotCQkJPGxheW91dD5wMjwvbGF5b3V0PgkJCQotCQk8L3JlcG9zaXRvcnk+CQotCQk8cmVwb3NpdG9yeT4KLQkJCTxpZD5KdW5vPC9pZD4KLQkJCTx1cmw+aHR0cDovL2J1aWxkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL2NvbW1pdHRlcnMvd3RwLVIzLjQuMC1JLzIwMTEwODA1MTUwNzM4L0ktMy40LjAtMjAxMTA4MDUxNTA3MzgvcmVwb3NpdG9yeS88L3VybD4KLQkJCTxsYXlvdXQ+cDI8L2xheW91dD4KLQkJPC9yZXBvc2l0b3J5PgotCQk8cmVwb3NpdG9yeT4KLQkJCTxpZD5HcmFwaGl0aTwvaWQ+Ci0JCQk8dXJsPmh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9ncmFwaGl0aS91cGRhdGVzL21pbGVzdG9uZXMvPC91cmw+Ci0JCQk8bGF5b3V0PnAyPC9sYXlvdXQ+Ci0JCTwvcmVwb3NpdG9yeT4KLQkJCi0JPC9yZXBvc2l0b3JpZXM+Ci0JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlcG9zaXRvcnkvLnByb2plY3QgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJlYTViMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlcG9zaXRvcnk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuVXBkYXRlU2l0ZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5VcGRhdGVTaXRlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeS9wb20ueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlcG9zaXRvcnkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM4ZGNjNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JCi0JPHBhcmVudD4KLQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3JfcGFyZW50PC9hcnRpZmFjdElkPgotCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcjwvZ3JvdXBJZD4KLQkJPHZlcnNpb24+MS4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0JCTxyZWxhdGl2ZVBhdGg+Li4vb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLQk8L3BhcmVudD4KLQkKLQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5PC9hcnRpZmFjdElkPgotCTxwYWNrYWdpbmc+ZWNsaXBzZS11cGRhdGUtc2l0ZTwvcGFja2FnaW5nPgotCTxuYW1lPkpQQSBFZGl0b3IgVXBkYXRlIFNpdGU8L25hbWU+Ci0JCi0JPGJ1aWxkPgotCQk8cGx1Z2lucz4KLQkJCTxwbHVnaW4+Ci0JCQkJPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLnR5Y2hvPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPm1hdmVuLW9zZ2ktcGFja2FnaW5nLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8Y29uZmlndXJhdGlvbj4KLQkJCQkJPGFyY2hpdmVTaXRlPnRydWU8L2FyY2hpdmVTaXRlPgotCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCTwvcGx1Z2luPgotCQk8L3BsdWdpbnM+Ci0JPC9idWlsZD4KLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVwb3NpdG9yeS9zaXRlLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5L3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNlYWU3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5yZXBvc2l0b3J5L3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmVfMS4xLjAucXVhbGlmaWVyLmphciIgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUiIHZlcnNpb249IjEuMS4wLnF1YWxpZmllciI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0ianBhX2RpYWdyYW1fZWRpdG9yIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8Y2F0ZWdvcnktZGVmIG5hbWU9ImpwYV9kaWFncmFtX2VkaXRvciIgbGFiZWw9IkpQQSBEaWFncmFtIEVkaXRvciIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvLnByb2plY3QgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkNmI3NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMyNDJhMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGYwODk5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDExIFNBUCBBRy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDExIFNBUCBBRy5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjI1NzMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuMS4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmUiIHZlcnNpb249IjAuOC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjEuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9wb20ueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlZDE0ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JCi0JPHBhcmVudD4KLQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3JfcGFyZW50PC9hcnRpZmFjdElkPgotCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcjwvZ3JvdXBJZD4KLQkJPHZlcnNpb24+MS4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0JCTxyZWxhdGl2ZVBhdGg+Li4vLi4vZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLQk8L3BhcmVudD4KLQkKLQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlPC9hcnRpZmFjdElkPgotCTxwYWNrYWdpbmc+ZWNsaXBzZS1mZWF0dXJlPC9wYWNrYWdpbmc+Ci0JPG5hbWU+SlBBIERpYWdyYW0gRWRpdG9yIEZlYXR1cmU8L25hbWU+Ci0JCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OTE2ZGYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkp1bmUgMDYsIDIwMDc8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaSBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYWJvdXQubWFwcGluZ3MgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI4MzkwYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncwotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcwotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0wPUBidWlsZEAKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzgzYzRiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IgU291cmNlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMTEuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDgzMjQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaW5pLFwKLSAgICAgICAgICAgICAgIGFib3V0Lm1hcHBpbmdzLFwKLSAgICAgICAgICAgICAgIGFib3V0LnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZTMyLmdpZixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8qKixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDAwYmEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVCdW5kbGUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLQotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCi0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUJ1bmRsZS9wbHVnaW4ucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmIwZDk2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlQnVuZGxlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5M2FhMC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIzYzhmZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvcgotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIERpYWdyYW0gRWRpdG9yCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAxMSBTQVAgQUcuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1wKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MTZkZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+SnVuZSAwNiwgMjAwNzwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGVlMzZhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgzOTBhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLTA9QGJ1aWxkQApkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTA1YTcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvciBTb3VyY2VcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAxMS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQ4MzI0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0LmluaSxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2UzMi5naWYsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzcmMvKiosXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZDdjYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYWU0OWQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWQwMGJhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCi0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci0KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCi0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkNWUxZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YmZjN2EuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotYnVpbGQueG1sCi0uc2V0dGluZ3MKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlLy5wcm9qZWN0IGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYTA0NTkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNmRlNzQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0cy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZGNiOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAxMSBTQVAgQUcuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvciBKVW5pdCBUZXN0cwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIEpQQSBEaWFncmFtIEVkaXRvciBKVW5pdCBUZXN0cwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMTEgU0FQIEFHLlwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLSMgbGljZW5zZSBhbmQgbGljZW5zZVVSTCBwcm9wZXJ0aWVzIHdlcmUgcmVtb3ZlZCBhcyBhIHJlc3VsdCB0byBtaWdyYXRpbmcgdG8gbmV3IFBERSBsaWNlbnNlIHN1cHBvcnQuIAotIyAgICBUaG9zZSBwcm9wZXJ0aWVzIGFyZSBub3cgYWRkZWQgYXQgYnVpbGQgdGltZS4gU2VlIGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VxdWlub3gvcDIvTGljZW5zZV9NZWNoYW5pc20uIAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZiOTQwZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnRlc3RzLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4xLjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZT0ib3JnLmVjbGlwc2UubGljZW5zZSIKLSAgICAgIGxpY2Vuc2UtZmVhdHVyZS12ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lYXN5bW9jayIgdmVyc2lvbj0iMi40LjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmUiIHZlcnNpb249IjAuOC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5mZWF0dXJlIiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQwZTExNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZmVhdHVyZS50ZW1wLmZvbGRlcgotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvLnByb2plY3QgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjQwMWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjU5OWZiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmZlYXR1cmUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRjYzEyNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIGFyY2hpdmVzIGZvciBEYWxpIEphdmEgUGVyc2lzdGVuY2UgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi0jIGxpY2Vuc2UgYW5kIGxpY2Vuc2VVUkwgcHJvcGVydGllcyB3ZXJlIHJlbW92ZWQgYXMgYSByZXN1bHQgdG8gbWlncmF0aW5nIHRvIG5ldyBQREUgbGljZW5zZSBzdXBwb3J0LiAKLSMgICAgVGhvc2UgcHJvcGVydGllcyBhcmUgbm93IGFkZGVkIGF0IGJ1aWxkIHRpbWUuIFNlZSBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9FcXVpbm94L3AyL0xpY2Vuc2VfTWVjaGFuaXNtLiAKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotIyBsaWNlbnNlIGFuZCBsaWNlbnNlVVJMIHByb3BlcnRpZXMgd2VyZSByZW1vdmVkIGFzIGEgcmVzdWx0IHRvIG1pZ3JhdGluZyB0byBuZXcgUERFIGxpY2Vuc2Ugc3VwcG9ydC4gCi0jICAgIFRob3NlIHByb3BlcnRpZXMgYXJlIG5vdyBhZGRlZCBhdCBidWlsZCB0aW1lLiBTZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veC9wMi9MaWNlbnNlX01lY2hhbmlzbS4gCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I0ZmU2ZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvZmVhdHVyZXMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3Jfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcl9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjEuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgbGljZW5zZS1mZWF0dXJlPSJvcmcuZWNsaXBzZS5saWNlbnNlIgotICAgICAgbGljZW5zZS1mZWF0dXJlLXZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy8uY3ZzaWdub3JlIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy8ucHJvamVjdCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGE4MDVmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmc8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTY0NDgzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmc7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2Fib3V0Lmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTYwNmIxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5KdW5lIDA2LCAyMDA3PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5pbmkgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MjBkN2YuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAidGlwc0FuZFRyaWNrc0hyZWYiIGNvbnRhaW5zIHRoZSBIZWxwIHRvcGljIGhyZWYgdG8gYSB0aXBzIGFuZCB0cmlja3MgcGFnZSAKLSMgb3B0aW9uYWwKLXRpcHNBbmRUcmlja3NIcmVmPS9vcmcuZWNsaXBzZS5qcHQuZG9jLnVzZXIvdGlwc19hbmRfdHJpY2tzLmh0bQotCi0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2Fib3V0Lm1hcHBpbmdzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGFhYjQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MKLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotMD1AYnVpbGRAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2Fib3V0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNDI5NGQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLWJsdXJiPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvclxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDExLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmY5ODQ5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5pbmksXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5tYXBwaW5ncyxcCi0gICAgICAgICAgICAgICBhYm91dC5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9jb21wb25lbnQueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmcvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVjNTE0Mi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuYnJhbmRpbmciPgotPGRlc2NyaXB0aW9uIHVybD0iIj48L2Rlc2NyaXB0aW9uPgotPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSI+PC9jb21wb25lbnQtZGVwZW5kcz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nIiBmcmFnbWVudD0iZmFsc2UiLz4KLTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIiBmcmFnbWVudD0iZmFsc2UiLz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9pY29ucy9XVFBfaWNvbl94MzJfdjIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA5YzJhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL2ljb25zL1dUUF9pY29uX3gzMl92Mi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5icmFuZGluZy9wbHVnaW4ucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmIwZDk2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmJyYW5kaW5nL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1wbHVnaW5OYW1lID0gRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIC0gSlBBIERpYWdyYW0gRWRpdG9yCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvLnByb2plY3QgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4NDMzNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmYzlmOC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuaGVscDtidW5kbGUtdmVyc2lvbj0iWzMuMy4xMDAsNC4wLjApIgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZDhkNzAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPkp1bmUsIDIwMDk8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjYxMTkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgaW1nLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaHRtbC8sXAotICAgICAgICAgICAgICAgKi54bWwKLWdlbmVyYXRlU291cmNlQnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL2dldHRpbmdfc3RhcnRlZC5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC9nZXR0aW5nX3N0YXJ0ZWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiOWYwNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL2dldHRpbmdfc3RhcnRlZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkdldHRpbmcgc3RhcnRlZDwvdGl0bGU+Ci0KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLQotCTxkaXYgY2xhc3M9InNlY3QxIj4KLQkJPCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotCQk8aDE+R2V0dGluZyBzdGFydGVkPC9oMT4KLQkJPHA+VGhlIEVjbGlwc2UgSURFIHByb3ZpZGVzIGEgSlBBIGRpYWdyYW0gZWRpdG9yIHRvb2wgdGhhdCBhbGxvd3MKLQkJCXlvdSB0byBjcmVhdGUsIGVkaXQsIGFuZCBkaXNwbGF5IHRoZSBhcHBsaWNhdGlvbiBkYXRhIG1vZGVsIChlbnRpdGllcwotCQkJYW5kIHRoZWlyIHJlbGF0aW9uc2hpcHMpIGluIGEgZ3JhcGhpY2FsIGVudmlyb25tZW50LjwvcD4KLQkJPHA+WW91IGNhbiB1c2Ugb25seSBvbmUgSlBBIGRpYWdyYW0gcGVyIHByb2plY3QsIGFuZCB5b3UgY2Fubm90Ci0JCQl2aXN1YWxpemUgZW50aXRpZXMgZnJvbSBkaWZmZXJlbnQgcHJvamVjdHMgaW4gb25lIEpQQSBkaWFncmFtLjwvcD4KLQkJPGRpdj4KLQkJCTxwPgotCQkJCTxiPkV4YW1wbGU6PC9iPgotCQkJPC9wPgotCQkJPHA+VGhlIGZvbGxvd2luZyBKUEEgZGlhZ3JhbSByZXByZXNlbnRzIHRoZSBkYXRhIG1vZGVsIG9mCi0JCQkJZW1wbG95ZWVzIHBhcnRpY2lwYXRpbmcgaW4gdmFyaW91cyBwcm9qZWN0cywgdGhhdCBpcywgdHdvIGVudGl0aWVzCi0JCQkJd2l0aCBhIGJpZGlyZWN0aW9uYWwgbWFueS10by1tYW55IHJlbGF0aW9uc2hpcDo8L3A+Ci0JCQk8ZGl2PgotCQkJCTxwPgotCQkJCQk8aW1nIHNyYz0iLi4vaW1nL2pwYV9kaWFncmFtX2VkaXRvci5naWYiCi0JCQkJCQlhbHQ9IlRoaXMgZ3JhcGhpYyBpcyBleHBsYWluZWQgaW4gdGhlIGFjY29tcGFueWluZyB0ZXh0LiIKLQkJCQkJCXRpdGxlPSJUaGlzIGdyYXBoaWMgaXMgZXhwbGFpbmVkIGluIHRoZSBhY2NvbXBhbnlpbmcgdGV4dC4iIC8+Ci0JCQkJPC9wPgotCQkJCTxiciAvPgotCQkJPC9kaXY+Ci0JCTwvZGl2PgotCQk8ZGl2PgotCQkJPGgyPkZlYXR1cmVzPC9oMj4KLQkJCTxwPlRoZSBKUEEgZGlhZ3JhbSBlZGl0b3IgY29tcHJpc2VzIHRoZSBmb2xsb3dpbmcgZ2VuZXJhbAotCQkJCWZlYXR1cmVzOjwvcD4KLQkJCTxkaXY+Ci0JCQkJPHVsPgotCQkJCQk8bGk+PHA+QWJpbGl0eSB0byBjcmVhdGUgZW50aXRpZXMgYW5kIGRlZmluZSByZWxhdGlvbnNoaXBzCi0JCQkJCQkJYmV0d2VlbiB0aGVtLjwvcD48L2xpPgotCQkJCQk8bGk+PHA+QWJpbGl0eSB0byBpbXBvcnQgZXhpc3RpbmcgZW50aXRpZXMgdG9nZXRoZXIgd2l0aAotCQkJCQkJCXRoZWlyIHJlbGF0aW9uc2hpcHMuPC9wPjwvbGk+Ci0JCQkJCTxsaT48cD5GdWxsIHN5bmNocm9uaXphdGlvbiB3aXRoIHRoZSB1bmRlcmx5aW5nCi0JCQkJCQkJYXBwbGljYXRpb24gY29kZSwgdGhhdCBpcywgd2hlbmV2ZXIgeW91IGFwcGx5IGEgY2hhbmdlIHRvIGFueSBvZgotCQkJCQkJCXRoZSBvYmplY3RzIG9uIHRoZSBkaWFncmFtLCB0aGUgY29ycmVzcG9uZGluZyBhcHBsaWNhdGlvbiBjb2RlCi0JCQkJCQkJdXBkYXRlcyBhdXRvbWF0aWNhbGx5LCBhbmQgdGhlIG9wcG9zaXRlLjwvcD48L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJRXJyb3IgYW5kIHdhcm5pbmcgbWFya2VycyB3aXRoIGluZm9ybWF0aXZlIHF1aWNrIGluZm8gdGV4dC4gWW91Ci0JCQkJCQkJY2FuIHZpZXcgZGV0YWlscyBvbiB0aGUgbWFya2VkIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIDxpPlByb2JsZW1zPC9pPgotCQkJCQkJCXZpZXcuCi0JCQkJCQk8L3A+PC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCUludGVncmF0aW9uIHdpdGggdGhlIDxpPkpQQSBEZXRhaWxzPC9pPiB2aWV3IGFuZCB0aGUgPGk+TWluaWF0dXJlCi0JCQkJCQkJCVZpZXc8L2k+LgotCQkJCQkJPC9wPjwvbGk+Ci0JCQkJPC91bD4KLQkJCTwvZGl2PgotCQk8L2Rpdj4KLQk8L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvcmVmZXJlbmNlX3Byb2plY3RfcGFnZS5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC9yZWZlcmVuY2VfcHJvamVjdF9wYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTFmM2IuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC9yZWZlcmVuY2VfcHJvamVjdF9wYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0gCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlByb3BlcnR5IHBhZ2UgJm5kYXNoOyBKUEEgRGlhZ3JhbSBFZGl0b3IgT3B0aW9uczwvdGl0bGU+Ci08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci08ZGl2IGNsYXNzPSJzZWN0MiI+PCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotPGgxPlByb3BlcnR5IHBhZ2UgJm5kYXNoOyBKUEEgRGlhZ3JhbSBFZGl0b3IgT3B0aW9uczwvaDE+Ci08cD5UaGlzIHRhYmxlIGxpc3RzIHRoZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9Imd1aS1vYmplY3QtdGl0bGUiPkpQQSBEaWFncmFtIEVkaXRvciBzZXR0aW5ncyBwYWdlPC9zcGFuPi48L3A+Ci08ZGl2IGNsYXNzPSJpbmZ0YmxpbmZvcm1hbCI+Ci08dGFibGUgY2xhc3M9IkluZm9ybWFsIiB0aXRsZT0iVGhpcyB0YWJsZSBkZXNjcmliZXMgdGhlIG9wdGlvbnMgb24gdGhlIEpQQSBEaWFncmFtIEVkaXRvciBQcm9wZXJ0aWVzIHBhZ2UuIiBzdW1tYXJ5PSJUaGlzIHRhYmxlIGRlc2NyaWJlcyB0aGUgb3B0aW9ucyBvbiB0aGUgSlBBIERpYWdyYW0gRWRpdG9yIFByb3BlcnRpZXMgcGFnZS4iIGRpcj0ibHRyIiBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIiBmcmFtZT0iYm9yZGVyIiBydWxlcz0iYWxsIiBjZWxscGFkZGluZz0iMyIgY2VsbHNwYWNpbmc9IjAiPgotPGNvbCB3aWR0aD0iMzIlIiAvPgotPGNvbCB3aWR0aD0iKiIgLz4KLTx0aGVhZD4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRoIGFsaWduPSJsZWZ0IiB2YWxpZ249ImJvdHRvbSIgaWQ9InIxYzEtdDM3Ij5Qcm9wZXJ0eTwvdGg+Ci08dGggYWxpZ249ImxlZnQiIHZhbGlnbj0iYm90dG9tIiBpZD0icjFjMi10MzciPkRlc2NyaXB0aW9uPC90aD4KLTwvdHI+Ci08L3RoZWFkPgotPHRib2R5PgotPHRyIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+Ci08dGQgYWxpZ249ImxlZnQiIGlkPSJyMmMxLXQzNyIgaGVhZGVycz0icjFjMS10MzciPjxhIGlkPSJzdGhyZWYyNzciIG5hbWU9InN0aHJlZjI3NyI+PC9hPjxhIGlkPSJzdGhyZWYyNzgiIG5hbWU9InN0aHJlZjI3OCI+PC9hPjxhIGlkPSJzdGhyZWYyNzkiIG5hbWU9InN0aHJlZjI3OSI+PC9hPjxhIGlkPSJzdGhyZWYyODAiIG5hbWU9InN0aHJlZjI4MCI+PC9hPkZvbGRlciBmb3IgZGlhZ3JhbXM8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyMmMxLXQzNyByMWMyLXQzNyI+U3BlY2lmeSB0aGUgZm9sZGVyIHdoZXJlIHRoZSBkaWFncmFtLnhtaSBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjNjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij5EZWZhdWx0IEphdmEgUGFja2FnZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM3IHIxYzItdDM3Ij5TcGVjaWZ5IHRoZSBqYXZhIHBhY2thZ2Ugd2hlcmUgdGhlIGVudGl0aWVzIHdpbGwgYmUgY3JlYXRlZCBieSBkZWZhdWx0LgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+RGVmYXVsdCB0YWJsZSBuYW1lIHByZWZpeDwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InIzYzEtdDM3IHIxYzItdDM3Ij5TcGVjaWZ5IHRoZSBwcmVmaXggd2l0aCB3aGljaCB0aGUgdGFibGVzIHdpbGwgYmUgY3JlYXRlZCBieSBkZWZhdWx0LgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InI0YzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+RWRpdGluZyBlbnRpdHkgbmFtZTwvdGQ+Ci08dGQgYWxpZ249ImxlZnQiIGhlYWRlcnM9InI0YzEtdDM3IHIxYzItdDM3Ij5EZXRlcm1pbmUgaWYgdGhlIGVkaXRpbmcgb2YgdGhlIGVudGl0eSBuYW1lIGluIHRoZSBkaWFncmFtIHNob3VsZCBhZmZlY3QgdGhlIGNsYXNzIG5hbWUgaW4gdGhlIHNvdXJjZSBmaWxlLgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+RW50aXR5IGFjY2VzcyB0eXBlPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjNjMS10MzcgcjFjMi10MzciPlNlbGVjdCBhbiBlbnRpdHkgYWNjZXNzIHR5cGUuCi08cD5UbyBhZGQgYW5ub3RhdGlvbnMgb24gdGhlIGZpZWxkIGxldmVsIGNob29zZSA8c3Bhbj48Yj5GaWVsZC1iYXNlZDwvYj48L3NwYW4+LjwvcD4KLTxwPlRvIGFkZCBhbm5vdGF0aW9ucyBvbiB0aGUgcHJvcGVydHkgbGV2ZWwgY2hvb3NlIDxzcGFuPjxiPlByb3BlcnR5LWJhc2VkPC9iPjwvc3Bhbj4uPC9wPgotPC90ZD4KLTwvdHI+Ci08dHIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KLTx0ZCBhbGlnbj0ibGVmdCIgaWQ9InIzYzEtdDM3IiBoZWFkZXJzPSJyMWMxLXQzNyI+RGVmYXVsdCBjb2xsZWN0aW9uIHR5cGU8L3RkPgotPHRkIGFsaWduPSJsZWZ0IiBoZWFkZXJzPSJyM2MxLXQzNyByMWMyLXQzNyI+U2VsZWN0IGEgY29sbGVjdGlvbiB0eXBlIG9mIHdoaWNoIHRoZSByZWxhdGlvbiBhdHRyaWJ1dGVzIHRvIGJlIGNyZWF0ZWQgYnkgZGVmYXVsdDoKLTxwPkNob29zZSA8c3Bhbj48Yj5qYXZhLnV0aWwuQ29sbGVjdGlvbjwvYj48L3NwYW4+LCBzbyB0aGF0IHRoZSByZWxhdGlvbiBhdHRyaWJ1dGVzIHRvIGJlIG9mIHR5cGUgQ29sbGVjdGlvbi48L3A+Ci08L3RkPgotPC90cj4KLTx0ciBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgotPHRkIGFsaWduPSJsZWZ0IiBpZD0icjRjMS10MzciIGhlYWRlcnM9InIxYzEtdDM3Ij5PbmUtdG8tTWFueSB1bmlkaXJlY3Rpb25hbCBvbGQgc3R5bGUgcmVsYXRpb25zaGlwPC90ZD4KLTx0ZCBhbGlnbj0ibGVmdCIgaGVhZGVycz0icjRjMS10MzcgcjFjMi10MzciPlNwZWNpZnkgaWYgdGhlIG9sZCBzdHlsZSBPbmUtdG8tTWFueSB1bmlkaXJlY3Rpb25hbCByZWxhdGlvbnNoaXAgKHN1cHBvcnRlZCBieSBKUEEgMS4wKSB0byBiZSB1c2VkLgotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLTxiciAvPjwvZGl2PgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfMjBfc3VwcG9ydC5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrXzIwX3N1cHBvcnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE2M2U3Mi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfMjBfc3VwcG9ydC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkpQQSBkaWFncmFtIGVkaXRvciBwYXJ0aWFsIHN1cHBvcnQgZm9yIEpQQSAyLjA8L3RpdGxlPgotCi08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci0KLQk8ZGl2IGNsYXNzPSJzZWN0MSI+Ci0JCTwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLQkJPGgxPkpQQSBkaWFncmFtIGVkaXRvciBwYXJ0aWFsIHN1cHBvcnQgZm9yIEpQQSAyLjA8L2gxPgotCQk8dGQ+PGRpdj4KLQkJCQk8dWw+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlUaGUgSlBBIGRpYWdyYW0gZWRpdG9yIHN1cHBvcnRzIHRoZSBuZXcgc3R5bGUgPGk+T25lLXRvLU1hbnk8L2k+Ci0JCQkJCQkJdW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zaGlwLiBJdCBtZWFucyB0aGF0IGluIEpQQSAyLjAgcHJvamVjdHMKLQkJCQkJCQl0aGUgY29ycmVzcG9uZGluZyByZWxhdGlvbnNoaXAgYXR0cmlidXRlIHdpbGwgYmUgY3JlYXRlZCB3aXRoCi0JCQkJCQkJYWRkaXRpb25hbAotCQkJCQkJCTx0dCB0aXRsZT0iT3V0cHV0Ij5ASm9pbkNvbHVtbnMocyk8L3R0PgotCQkJCQkJCWFubm90YXRpb24sIHNvIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgREIgc2NoZW1hIHdpbGwgYmUgY3JlYXRlZAotCQkJCQkJCXdpdGhvdXQgYWRkaXRpb25hbCBqb2luIHRhYmxlLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCTwvdWw+Ci0JCQk8L2Rpdj4KLQkJCTxkaXY+Ci0JCQkJPHA+Ci0JCQkJCTxiPk5vdGU6PC9iPgotCQkJCTwvcD4KLQkJCQk8cD4KLQkJCQkJVGhpcyBiZWhhdmlvciBpcyBvcHRpb25hbC4gWW91IG1heSBjaG9vc2UgZnJvbSB0aGUgZWRpdG9yCi0JCQkJCXByZWZlcmVuY2UgcGFnZSBvciBwcm9qZWN0IHByb3BlcnR5IHBhZ2UgdG8gY3JlYXRlIHRoaXMKLQkJCQkJcmVsYXRpb25zaGlwIChpbiBKUEEgMi4wIHByb2plY3RzKSBjb21wbGlhbnQgd2l0aCBKUEEgMS4wCi0JCQkJCXNwZWNpZmljYXRpb24sIGkuZS4gLSB3aXRob3V0IHRoZSBhZGRpdGlvbmFsCi0JCQkJCTx0dCB0aXRsZT0iT3V0cHV0Ij5ASm9pbkNvbHVtbnMocyk8L3R0PgotCQkJCQlhbm5vdGF0aW9uLgotCQkJCTwvcD4KLQkJCTwvZGl2PjwvdGQ+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19jb25maWd1cmluZ19lZGl0b3IuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19jb25maWd1cmluZ19lZGl0b3IuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZlNmEzNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfY29uZmlndXJpbmdfZWRpdG9yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+Q29uZmlndXJpbmcgdGhlIEpQQSBkaWFncmFtIGVkaXRvcjwvdGl0bGU+Ci0KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLQotCTxkaXYgY2xhc3M9InNlY3QxIj4KLQkJPCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotCQk8aDE+Q29uZmlndXJpbmcgdGhlIEpQQSBkaWFncmFtIGVkaXRvcjwvaDE+Ci0JCTx0ZD48ZGl2PgotCQkJCTx1bD4KLQkJCQkJPGxpPjxwPkNvbmZpZ3VyZSB0aGUgZ2xvYmFsIGRlZmF1bHQgc2V0dGluZ3Mgb2YgdGhlIEpQQQotCQkJCQkJCWRpYWdyYW0gZWRpdG9yPC9wPgotCQkJCQkJPGRpdj4KLQkJCQkJCQk8b2w+Ci0JCQkJCQkJCTxsaT5DaG9vc2UgPHNwYW4+PGk+V2luZG93PC9pPiAtJmd0OyA8aT5QcmVmZXJlbmNlczwvaT4gPC9zcGFuPiBpbgotCQkJCQkJCQkJdGhlIG1haW4gbWVudS48L2xpPgotCQkJCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCQkJU2VsZWN0IDxzcGFuPjxpPkdlbmVyYWw8L2k+IC0mZ3Q7IDxpPkVkaXRvcnM8L2k+IC0mZ3Q7IDxpPkpQQSBEaWFncmFtIEVkaXRvcjwvaT4gPC9zcGFuPiBpbiB0aGUKLQkJCQkJCQkJCQlwcm9wZXJ0aWVzIHRyZWUuCi0JCQkJCQkJCQk8L3A+PC9saT4KLQkJCQkJCQkJPGxpPjxwPgotCQkJCQkJCQkJCVNwZWNpZnkgdGhlIEpQQSBkaWFncmFtIGVkaXRvciBzZXR0aW5ncy4gVG8gcmVzdG9yZSB0aGUgZ2xvYmFsCi0JCQkJCQkJCQkJcHJlZGVmaW5lZCB2YWx1ZXMsIGNob29zZSA8aT5SZXN0b3JlIERlZmF1bHRzPC9pPi4KLQkJCQkJCQkJCTwvcD48L2xpPgotCQkJCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCQkJQ2hvb3NlIDxpPkFwcGx5PC9pPiwgdGhlbiBjaG9vc2UgPGk+T0s8L2k+LgotCQkJCQkJCQkJPC9wPjwvbGk+Ci0JCQkJCQkJPC9vbD4KLQkJCQkJCTwvZGl2PgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Q29uZmlndXJlIHRoZSBKUEEgZGlhZ3JhbSBlZGl0b3IgcGVyIHByb2plY3Q8L3A+Ci0JCQkJCQk8ZGl2PgotCQkJCQkJCTxvbD4KLQkJCQkJCQkJPGxpPjxwPgotCQkJCQkJCQkJCUluIHRoZSBjb250ZXh0IG1lbnUgb2YgdGhlIHByb2plY3QgaW4gdGhlIDxpPlByb2plY3QKLQkJCQkJCQkJCQkJRXhwbG9yZXI8L2k+LCBjaG9vc2UgPGk+UHJvcGVydGllczwvaT4uCi0JCQkJCQkJCQk8L3A+PC9saT4KLQkJCQkJCQkJPGxpPjxwPgotCQkJCQkJCQkJCVNlbGVjdCA8c3Bhbj48aT5KUEE8L2k+IC0mZ3Q7IDxpPkpQQSBEaWFncmFtIEVkaXRvcjwvaT4gPC9zcGFuPi4KLQkJCQkJCQkJCTwvcD48L2xpPgotCQkJCQkJCQk8bGk+PHA+Ci0JCQkJCQkJCQkJU3BlY2lmeSB0aGUgSlBBIGRpYWdyYW0gZWRpdG9yIHNldHRpbmdzLiBUbyByZXN0b3JlIHRoZSBnbG9iYWwKLQkJCQkJCQkJCQlkZWZhdWx0IHNldHRpbmdzLCBjaG9vc2UgPGk+UmVzdG9yZSBEZWZhdWx0czwvaT4uCi0JCQkJCQkJCQk8L3A+PC9saT4KLQkJCQkJCQkJPGxpPjxwPgotCQkJCQkJCQkJCUNob29zZSA8aT5BcHBseTwvaT4sIHRoZW4gY2hvb3NlIDxpPk9LPC9pPi4KLQkJCQkJCQkJCTwvcD48L2xpPgotCQkJCQkJCTwvb2w+Ci0JCQkJCQk8L2Rpdj4KLQkJCQkJPC9saT4KLQkJCQk8L3VsPgotCQkJPC9kaXY+Ci0JCTwvdGQ+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19tYW5hZ2VfZW50aXRpZXMuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19tYW5hZ2VfZW50aXRpZXMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NDUwZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfbWFuYWdlX2VudGl0aWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk1hbmFnaW5nIGVudGl0aWVzPC90aXRsZT4KLQotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotCi0JPGRpdiBjbGFzcz0ic2VjdDEiPgotCQk8IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci0JCTxoMT5NYW5hZ2luZyBlbnRpdGllczwvaDE+Ci0JCTx0ZD48cD5Zb3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIG9uIGEKLQkJCQlwYXJ0aWN1bGFyIGVudGl0eSBncmFwaGljYWwgbW9kZWw6PC9wPgotCQkJPGRpdj4KLQkJCQk8dWw+Ci0JCQkJCTxsaT48cD5SZW5hbWUgZW50aXRpZXM8L3A+Ci0JCQkJCQk8cD4KLQkJCQkJCQlJbiB0ZXJtcyBvZiBzb3VyY2UgY29kZSwgdGhpcyBvcGVyYXRpb24gY2hhbmdlcyB0aGUKLQkJCQkJCQk8dHQgdGl0bGU9Ik91dHB1dCI+bmFtZTwvdHQ+Ci0JCQkJCQkJYXR0cmlidXRlIG9mIHRoZQotCQkJCQkJCTx0dCB0aXRsZT0iT3V0cHV0Ij5ARW50aXR5PC90dD4KLQkJCQkJCQlhbm5vdGF0aW9uIG9ubHkuCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD5BZGQsIHJlbmFtZSwgb3IgcmVtb3ZlIGF0dHJpYnV0ZXM8L3A+Ci0JCQkJCQk8ZGl2PgotCQkJCQkJCTxwPgotCQkJCQkJCQk8Yj5Ob3RlOjwvYj4KLQkJCQkJCQk8L3A+Ci0JCQkJCQkJPHA+Ci0JCQkJCQkJCVRoZSBFY2xpcHNlIElERSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBnZXR0ZXIgYW5kIHNldHRlcgotCQkJCQkJCQltZXRob2RzIGZvciBuZXcgYXR0cmlidXRlcy4gVGhlIGRlZmF1bHQgZGF0YSB0eXBlIGZvciBuZXcKLQkJCQkJCQkJYXR0cmlidXRlcyBpcwotCQkJCQkJCQk8dHQgdGl0bGU9Ik91dHB1dCI+amF2YS5sYW5nLlN0cmluZzwvdHQ+Ci0JCQkJCQkJCS4KLQkJCQkJCQk8L3A+Ci0JCQkJCQkJPHA+SW4gdGVybXMgb2Ygc291cmNlIGNvZGUsIHJlbmFtaW5nIGF0dHJpYnV0ZXMgY2hhbmdlcyB0aGUKLQkJCQkJCQkJZmllbGQgbmFtZXMgb2YgZW50aXRpZXMsIHRvZ2V0aGVyIHdpdGggdGhlIGZpZWxkcycgZ2V0dGVyIGFuZAotCQkJCQkJCQlzZXR0ZXIgbWV0aG9kcy48L3A+Ci0JCQkJCQkJPHA+UmVtb3ZpbmcgYXR0cmlidXRlcyByZW1vdmVzIHRoZW0gZnJvbSB0aGUgZGF0YSBtb2RlbCBhbHNvLjwvcD4KLQkJCQkJCQk8ZGl2PkVuZCBvZiB0aGUgbm90ZS48L2Rpdj4KLQkJCQkJCTwvZGl2PgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Q29sbGFwc2Ugb3IgZXhwYW5kIGVudGl0aWVzIG9yIGF0dHJpYnV0ZSBncm91cHM8L3A+PC9saT4KLQkJCQkJPGxpPjxwPlNhdmUgb3IgZGlzY2FyZCB5b3VyIGNoYW5nZXM8L3A+PC9saT4KLQkJCQkJPGxpPjxwPlNhdmUgb3IgZGlzY2FyZCB5b3VyIGNoYW5nZXMgYW5kIHJlbW92ZSB0aGUgZW50aXR5Ci0JCQkJCQkJZnJvbSB0aGUgZGlhZ3JhbSB3aXRob3V0IHJlbW92aW5nIGl0IGZyb20gdGhlIGFwcGxpY2F0aW9uIGRhdGEKLQkJCQkJCQltb2RlbDwvcD48L2xpPgotCQkJCQk8bGk+PHA+UmVtb3ZlIHRoZSBlbnRpdHkgZnJvbSB0aGUgZGlhZ3JhbSBhbmQgZGVsZXRlIGl0Ci0JCQkJCQkJZnJvbSB0aGUgYXBwbGljYXRpb24gZGF0YSBtb2RlbDwvcD48L2xpPgotCQkJCTwvdWw+Ci0JCQk8L2Rpdj4KLQkJCTxwPlRvIHBlcmZvcm0gdGhlIGFjdGlvbnMgZGVzY3JpYmVkIGFib3ZlLCBmb2xsb3cgdGhlIHN0ZXBzOjwvcD4KLQkJCTxkaXY+Ci0JCQkJPG9sPgotCQkJCQk8bGk+PHA+UG9zaXRpb24gdGhlIG1vdXNlIGN1cnNvciBvdmVyIHRoZSBlbnRpdHkgeW91IHdhbnQKLQkJCQkJCQl0byBtYW5hZ2UuPC9wPgotCQkJCQkJPHA+QSBidXR0b24gYmFyIGFwcGVhcnMgYnkgdGhlIGVudGl0eS48L3A+Ci0JCQkJCQk8ZGl2PgotCQkJCQkJCTxwPgotCQkJCQkJCQk8aW1nIHNyYz0iLi4vaW1nL2pwYV9kaWFncmFtX2VudGl0eV9vcGVyYXRpb25zLmdpZiIKLQkJCQkJCQkJCWFsdD0iVGhpcyBncmFwaGljIGlzIGV4cGxhaW5lZCBpbiB0aGUgYWNjb21wYW55aW5nIHRleHQuIgotCQkJCQkJCQkJdGl0bGU9IlRoaXMgZ3JhcGhpYyBpcyBleHBsYWluZWQgaW4gdGhlIGFjY29tcGFueWluZyB0ZXh0LiIgLz4KLQkJCQkJCQk8L3A+Ci0JCQkJCQkJPGJyIC8+Ci0JCQkJCQk8L2Rpdj4KLQkJCQkJPC9saT4KLQkJCQkJPGxpPjxwPkNob29zZSB0aGUgcmVsZXZhbnQgcHVzaGJ1dHRvbi4gRWFjaCBidXR0b24gaGFzIGFuCi0JCQkJCQkJaW5mb3JtYXRpdmUgdG9vbHRpcCB0aGF0IGRlc2NyaWJlcyB0aGUgcmVsZXZhbnQgb3BlcmF0aW9uLjwvcD48L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJVG8gcmVuYW1lIGFuIGVudGl0eSBvciBhbiBhdHRyaWJ1dGUsIGRvdWJsZS1jbGljayB0aGUgdGl0bGUgb2YgYW4KLQkJCQkJCQllbnRpdHkgb3IgdGhlIGF0dHJpYnV0ZSwgY2hhbmdlIHRoZSBuYW1lLCBhbmQgY2hvb3NlCi0JCQkJCQkJPGtiZCB0aXRsZT0iS2V5Ym9hcmQgYnV0dG9uIj5FTlRFUjwva2JkPgotCQkJCQkJCS4KLQkJCQkJCTwvcD48L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJVG8gcmVtb3ZlIGFuIGF0dHJpYnV0ZSwgY2xpY2sgdGhlIGF0dHJpYnV0ZSBhbmQgY2hvb3NlCi0JCQkJCQkJPGtiZCB0aXRsZT0iS2V5Ym9hcmQgYnV0dG9uIj5ERUxFVEU8L2tiZD4KLQkJCQkJCQlvciBjaG9vc2UgPGk+RGVsZXRlPC9pPiBpbiB0aGUgY29udGV4dCBtZW51LgotCQkJCQkJPC9wPgotCQkJCQkJPHA+Ci0JCQkJCQkJWW91IGNhbiBhbHNvIHJlbW92ZSBhbiBhdHRyaWJ1dGUgYnkgcG9zaXRpb25pbmcgdGhlIG1vdXNlIGN1cnNvcgotCQkJCQkJCW92ZXIgdGhlIGF0dHJpYnV0ZSBhbmQgY2hvb3NpbmcgdGhlIDxpPkRlbGV0ZSBBdHRyaWJ1dGU8L2k+Ci0JCQkJCQkJcHVzaGJ1dHRvbi4KLQkJCQkJCTwvcD4KLQkJCQkJCTxkaXY+Ci0JCQkJCQkJPHA+Ci0JCQkJCQkJCTxpbWcgc3JjPSIuLi9pbWcvanBhX2RpYWdyYW1fZGVsZXRlX2F0dHJpYnV0ZS5naWYiCi0JCQkJCQkJCQlhbHQ9IlRoaXMgZ3JhcGhpYyBpcyBleHBsYWluZWQgaW4gdGhlIGFjY29tcGFueWluZyB0ZXh0LiIKLQkJCQkJCQkJCXRpdGxlPSJUaGlzIGdyYXBoaWMgaXMgZXhwbGFpbmVkIGluIHRoZSBhY2NvbXBhbnlpbmcgdGV4dC4iIC8+Ci0JCQkJCQkJPC9wPgotCQkJCQkJCTxwIC8+Ci0JCQkJCQk8L2Rpdj4KLQkJCQkJPC9saT4KLQkJCQk8L29sPgotCQkJPC9kaXY+Ci0JCTwvdGQ+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19vcGVuX2RpYWdyYW0uaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19vcGVuX2RpYWdyYW0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMxOWU2ZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfb3Blbl9kaWFncmFtLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiB4bWw6bGFuZz0iZW4iIGxhbmc9ImVuIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXMtYXNjaWkiIC8+Ci0KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtU3R5bGUtVHlwZSIgY29udGVudD0idGV4dC9jc3MiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVNjcmlwdC1UeXBlIiBjb250ZW50PSJ0ZXh0L2phdmFzY3JpcHQiIC8+Ci08dGl0bGU+T3BlbiBKUEEgRGlhZ3JhbSwgY3JlYXRlIGFuZCBkaXNwbGF5IGVudGl0aWVzPC90aXRsZT4KLQotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotCi0JPGRpdiBjbGFzcz0ic2VjdDEiPgotCQk8IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci0JCTxoMj5PcGVuaW5nIEpQQSBEaWFncmFtIEVkaXRvcjwvaDI+Ci0JCTx0ZD48ZGl2PgotCQkJCTxvbD4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCUluIHRoZSA8aT5Qcm9qZWN0IEV4cGxvcmVyPC9pPiwgc2VsZWN0IHRoZSBwcm9qZWN0IHRoYXQgeW91IGFyZQotCQkJCQkJCXVzaW5nIG9yIHdhbnQgdG8gdXNlIGZvciB5b3VyIGVudGl0aWVzLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJSW4gdGhlIGNvbnRleHQgbWVudSwgY2hvb3NlIDxzcGFuIHRpdGxlPSJOYXZpZ2F0aW9uIHBhdGgiPgotCQkJCQkJCQk8aT5KUEEgVG9vbHM8L2k+IC0mZ3J0OyA8aT5PcGVuIERpYWdyYW08L2k+Ci0JCQkJCQkJPC9zcGFuPi4KLQkJCQkJCTwvcD4KLQkJCQkJPC9saT4KLQkJCQk8L29sPgotCQkJPC9kaXY+PC90ZD4KLQkJPGgyPkNyZWF0aW5nIG5ldyBlbnRpdGllczwvaDI+Ci0JCTx0ZD48cD4KLQkJCQlJbiB0aGUgPGk+RW50aXRpZXM8L2k+IGxpc3Qgb2YgdGhlIDxpPlBhbGV0dGU8L2k+LCBjaG9vc2UgPHNwYW4+PGltZwotCQkJCQlzcmM9Ii4uL2ltZy9qcGFlZGl0b3JfZW50aXR5LmdpZiIgYWx0PSJFbnRpdHkiIHRpdGxlPSJFbnRpdHkiIC8+ICg8aQotCQkJCQl0aXRsZT0iUXVpY2sgaW5mbyI+RW50aXR5PC9pPik8L3NwYW4+LCB0aGVuIGNsaWNrIHRoZSBkaWFncmFtIGFyZWEuCi0JCQk8L3A+Ci0JCQk8cD5UaGUgRWNsaXBzZSBJREUgY3JlYXRlcyB0aGUgbmV3IGVudGl0eSB3aXRoIGEgcHJlZGVmaW5lZCBuYW1lCi0JCQkJYW5kIGEgcHJpbWFyeSBrZXkuPC9wPjwvdGQ+Ci0JCTxoMj5EaXNwbGF5aW5nIGV4aXN0aW5nIGVudGl0aWVzIChpZiBhbnkpIHdpdGhpbiBhIHByb2plY3Qgb24gdGhlCi0JCQlkaWFncmFtPC9oMj4KLQkJPHRkPjxkaXY+Ci0JCQkJPHVsPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJVG8gZGlzcGxheSBhIHNpbmdsZSBlbnRpdHksIGNvcHkgdGhlIGVudGl0eSB1c2luZyBkcmFnIGFuZCBkcm9wCi0JCQkJCQkJZnJvbSB0aGUgPGk+UHJvamVjdCBFeHBsb3JlcjwvaT4gdG8gdGhlIEpQQSBkaWFncmFtLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJVG8gZGlzcGxheSBhbGwgZW50aXRpZXMsIGNsaWNrIHRoZSBKUEEgZGlhZ3JhbSB3aXRoIHRoZSBzZWNvbmRhcnkKLQkJCQkJCQltb3VzZSBidXR0b24gYW5kIGNob29zZSA8aT5TaG93IEFsbCBFbnRpdGllczwvaT4sIG9yIGNvcHkgdGhlIDxpPkpQQQotCQkJCQkJCQlDb250ZW50PC9pPiBub2RlIGZyb20gdGhlIHByb2plY3QgaW4gdGhlIDxpPlByb2plY3QgRXhwbG9yZXI8L2k+IHRvCi0JCQkJCQkJdGhlIEpQQSBkaWFncmFtLCB1c2luZyBkcmFnIGFuZCBkcm9wLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCTwvdWw+Ci0JCQk8L2Rpdj48L3RkPgotCTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfb3Blbl9taW5pYXR1cmVfdmlldy5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX29wZW5fbWluaWF0dXJlX3ZpZXcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiMDFmOC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfb3Blbl9taW5pYXR1cmVfdmlldy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPk9wZW5pbmcgdGhlIE1pbmlhdHVyZSB2aWV3IG9yIHRoZSBKUEEgRGV0YWlscyB2aWV3PC90aXRsZT4KLQotPCEtLSBjb250ZW50cyAtLT4KLTwvaGVhZD4KLTxib2R5PgotCi0JPGRpdiBjbGFzcz0ic2VjdDEiPgotCQk8IS0tIGluZm9sZXZlbD0iYWxsIiBpbmZvdHlwZT0iR2VuZXJhbCIgLS0+Ci0JCTxoMj5PcGVuaW5nIHRoZSBNaW5pYXR1cmUgdmlldyBvciB0aGUgSlBBIERldGFpbHMgdmlldzwvaDI+Ci0JCTx0ZD48ZGl2PgotCQkJCTxvbD4KLQkJCQkJPGxpPjxwPkNsaWNrIHRoZSBKUEEgZGlhZ3JhbSB3aXRoIHRoZSBzZWNvbmRhcnkgbW91c2UKLQkJCQkJCQlidXR0b24uPC9wPjwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlDaG9vc2UgPGk+T3BlbiBNaW5pYXR1cmUgVmlldzwvaT4gb3IgPGk+T3BlbiBKUEEgRGV0YWlscyBWaWV3PC9pPiwKLQkJCQkJCQlyZXNwZWN0aXZlbHkuCi0JCQkJCQk8L3A+PC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCVRvIHNhdmUgdGhlIGRpYWdyYW0gYXMgYW4gaW1hZ2UsIGNob29zZSA8aT5TYXZlIGFzIEltYWdlPC9pPi4KLQkJCQkJCTwvcD48L2xpPgotCQkJCTwvb2w+Ci0JCQk8L2Rpdj4KLQkJCTxkaXY+Ci0JCQkJPHA+Ci0JCQkJCTxpbWcgc3JjPSIuLi9pbWcvanBhX21pbmlhdHVyZV92aWV3LmdpZiIKLQkJCQkJCWFsdD0iSlBBIEVkaXRvciBNaW5pYXR1cmUgdmlldy4iCi0JCQkJCQl0aXRsZT0iSlBBIEVkaXRvciBNaW5pYXR1cmUgdmlldy4iIC8+Ci0JCQkJPC9wPgotCQkJCTxiciAvPgotCQkJPC9kaXY+Ci0JCTwvdGQ+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdGFza19yZWZhY3Rvcl9lbnRpdGllcy5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX3JlZmFjdG9yX2VudGl0aWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNTJmZDIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX3JlZmFjdG9yX2VudGl0aWVzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPlJlZmFjdG9yLCB2aWV3LCBlZGl0IGFuZCByZW1vdmUgZW50aXRpZXMgYW5kIHRoZWlyCi0JYXR0cmlidXRlczwvdGl0bGU+Ci0KLTwhLS0gY29udGVudHMgLS0+Ci08L2hlYWQ+Ci08Ym9keT4KLQotCTxkaXYgY2xhc3M9InNlY3QxIj4KLQkJPCEtLSBpbmZvbGV2ZWw9ImFsbCIgaW5mb3R5cGU9IkdlbmVyYWwiIC0tPgotCQk8aDI+UmVmYWN0b3JpbmcgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZSB0eXBlczwvaDI+Ci0JCTx0ZD48ZGl2PgotCQkJCTxwPgotCQkJCQk8Yj5DYXV0aW9uOjwvYj4KLQkJCQk8L3A+Ci0JCQkJPGRpdj4KLQkJCQkJPHVsPgotCQkJCQkJPGxpPjxwPgotCQkJCQkJCQlJZiB5b3UgcmVuYW1lIG9yIG1vdmUgYW4gZW50aXR5IHVzaW5nIGEgZGlmZmVyZW50IGFwcHJvYWNoIChmb3IKLQkJCQkJCQkJZXhhbXBsZSwgdmlhIHRoZSA8aT5Qcm9qZWN0IEV4cGxvcmVyPC9pPiksIHRoZSBlbnRpdHkgZGlzYXBwZWFycwotCQkJCQkJCQlmcm9tIHRoZSBKUEEgZGlhZ3JhbS4KLQkJCQkJCQk8L3A+Ci0JCQkJCQk8L2xpPgotCQkJCQkJPGxpPjxwPldoZW4geW91IHJlZmFjdG9yIGFuIGF0dHJpYnV0ZSB0eXBlLCBhbnkgZXhpc3RpbmcKLQkJCQkJCQkJYnVzaW5lc3MgbG9naWMgd2l0aGluIHRoZSBhdHRyaWJ1dGUncyBhY2Nlc3MgbWV0aG9kcyBpcyBkZWxldGVkLjwvcD4KLQkJCQkJCTwvbGk+Ci0JCQkJCTwvdWw+Ci0JCQkJPC9kaXY+Ci0JCQk8L2Rpdj4KLQkJCTxwPlVzaW5nIHRoZSBKUEEgZGlhZ3JhbSBlZGl0b3IsIHlvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nCi0JCQkJcmVmYWN0b3Jpbmcgb3BlcmF0aW9uczo8L3A+Ci0JCQk8ZGl2PgotCQkJCTx1bD4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCVJlbmFtZSB0aGUgZW50aXR5IGNsYXNzIC0gaW4gdGhlIGNvbnRleHQgbWVudSBvZiB0aGUgZW50aXR5IG5hbWUsCi0JCQkJCQkJY2hvb3NlIDxzcGFuPjxpPlJlZmFjdG9yIEVudGl0eSBDbGFzczwvaT4gLSZndDsgPGk+UmVuYW1lPC9pPgotCQkJCQkJCTwvc3Bhbj4sIHRoZW4gY29tcGxldGUgdGhlIHdpemFyZC4KLQkJCQkJCTwvcD4KLQkJCQkJPC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCU1vdmUgdGhlIGVudGl0eSB0byBhbm90aGVyIHNvdXJjZSBwYWNrYWdlIC0gaW4gdGhlIGNvbnRleHQgbWVudQotCQkJCQkJCW9mIHRoZSBlbnRpdHkgbmFtZSwgY2hvb3NlIDxzcGFuPjxpPlJlZmFjdG9yIEVudGl0eQotCQkJCQkJCQkJQ2xhc3M8L2k+IC0mZ3Q7IDxpPk1vdmU8L2k+Ci0JCQkJCQkJPC9zcGFuPiwgdGhlbiBjb21wbGV0ZSB0aGUgd2l6YXJkLgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJUmVmYWN0b3IgYW4gYXR0cmlidXRlIHR5cGUgLSBpbiB0aGUgY29udGV4dCBtZW51IG9mIGFuIGF0dHJpYnV0ZSwKLQkJCQkJCQljaG9vc2UgPGk+UmVmYWN0b3IgQXR0cmlidXRlIFR5cGU8L2k+LCBjaGFuZ2UgdGhlIHR5cGUsIGFuZAotCQkJCQkJCWNob29zZSA8aT5PSzwvaT4uCi0JCQkJCQk8L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJPC91bD4KLQkJCTwvZGl2PjwvdGQ+Ci0KLQkJPGgyPlZpZXdpbmcgYW5kIGVkaXRpbmcgZW50aXRpZXMnIHNvdXJjZSBjb2RlPC9oMj4KLQkJPHRkPjxwPlRvIHZpZXcgYW5kIGVkaXQgdGhlIHNvdXJjZSBjb2RlIG9mIGEgcGFydGljdWxhcgotCQkJCWVudGl0eSwgZG91YmxlLWNsaWNrIHRoZSB0aXRsZSBvZiB0aGUgY29ycmVzcG9uZGluZyBlbnRpdHkgYmxvY2sgb24KLQkJCQl0aGUgZGlhZ3JhbS48L3A+Ci0JCQk8cD5UaGUgRWNsaXBzZSBJREUgb3BlbnMgdGhlIGVudGl0eSBjbGFzcyBpbiB0aGUgc3RhbmRhcmQgc291cmNlCi0JCQkJY29kZSBlZGl0b3IuPC9wPgotCQkJPHA+V2hlbiB5b3UgYXBwbHkgY2hhbmdlcyB0byB0aGUgc291cmNlIGNvZGUsIHRoZXkgYXJlCi0JCQkJYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgZGlhZ3JhbS48L3A+PC90ZD4KLQotCQk8aDI+UmVtb3ZpbmcgYWxsIGVudGl0aWVzIGZyb20gdGhlIGRpYWdyYW08L2gyPgotCQk8dGQ+PGRpdj4KLQkJCQk8cD4KLQkJCQkJPGI+Tm90ZTo8L2I+Ci0JCQkJPC9wPgotCQkJCTxwPlRoaXMgb3BlcmF0aW9uIHJlbW92ZXMgdGhlIGVudGl0aWVzIGZyb20gdGhlIEpQQSBkaWFncmFtCi0JCQkJCW9ubHksIHRoYXQgaXMsIHRoZXkgYXJlIG5vdCByZW1vdmVkIGZyb20gdGhlIHVuZGVybHlpbmcgYXBwbGljYXRpb24KLQkJCQkJZGF0YSBtb2RlbC48L3A+Ci0JCQk8L2Rpdj4KLQkJCTxkaXY+Ci0JCQkJPG9sPgotCQkJCQk8bGk+PHA+Q2xpY2sgdGhlIEpQQSBkaWFncmFtIHdpdGggdGhlIHNlY29uZGFyeSBtb3VzZQotCQkJCQkJCWJ1dHRvbi48L3A+Ci0JCQkJCTwvbGk+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlUbyBzYXZlIGFueSB1bnNhdmVkIGNoYW5nZXMgdG8gdGhlIGFwcGxpY2F0aW9uIGRhdGEgbW9kZWwsIGFuZAotCQkJCQkJCXJlbW92ZSBhbGwgZW50aXRpZXMgZnJvbSB0aGUgZGlhZ3JhbSwgY2hvb3NlIDxzcGFuPiA8aT5SZW1vdmUKLQkJCQkJCQkJCUFsbCBFbnRpdGllcyBmcm9tIERpYWdyYW08L2k+IC0mZ3Q7IDxpPi4uLmFuZCBTYXZlIENoYW5nZXM8L2k+Ci0JCQkJCQkJPC9zcGFuPgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCQk8bGk+PHA+Ci0JCQkJCQkJVG8gcmVtb3ZlIGFsbCBlbnRpdGllcyBmcm9tIHRoZSBkaWFncmFtIHdpdGhvdXQgc2F2aW5nIGFueQotCQkJCQkJCXVuc2F2ZWQgY2hhbmdlcyB0byB0aGUgZGF0YSBtb2RlbCwgY2hvb3NlIDxzcGFuPjxpPlJlbW92ZQotCQkJCQkJCQkJQWxsIEVudGl0aWVzIGZyb20gRGlhZ3JhbTwvaT4gLSZndDsgPGk+Li4uYW5kIERpc2NhcmQgQ2hhbmdlczwvaT4KLQkJCQkJCQk8L3NwYW4+LgotCQkJCQkJPC9wPgotCQkJCQk8L2xpPgotCQkJCTwvb2w+Ci0JCQk8L2Rpdj48L3RkPgotCTwvZGl2PgotPC9ib2R5PgotPC9odG1sPgotCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfcmVtb3ZlX2VudGl0aWVzLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3Rhc2tfcmVtb3ZlX2VudGl0aWVzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNTYwYmIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaHRtbC90YXNrX3JlbW92ZV9lbnRpdGllcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9ImVuIiBsYW5nPSJlbiI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXVzLWFzY2lpIiAvPgotCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVN0eWxlLVR5cGUiIGNvbnRlbnQ9InRleHQvY3NzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1TY3JpcHQtVHlwZSIgY29udGVudD0idGV4dC9qYXZhc2NyaXB0IiAvPgotPHRpdGxlPkRlZmluaW5nIGFuZCByZW1vdmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gZW50aXRpZXM8L3RpdGxlPgotCi08IS0tIGNvbnRlbnRzIC0tPgotPC9oZWFkPgotPGJvZHk+Ci0KLQk8ZGl2IGNsYXNzPSJzZWN0MSI+Ci0JCTwhLS0gaW5mb2xldmVsPSJhbGwiIGluZm90eXBlPSJHZW5lcmFsIiAtLT4KLQkJPGgxPkRlZmluaW5nIGFuZCByZW1vdmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gZW50aXRpZXM8L2gxPgotCQk8dGQ+PGRpdj4KLQkJCQk8b2w+Ci0JCQkJCTxsaT48cD4KLQkJCQkJCQlJbiB0aGUgPGk+UmVsYXRpb25zPC9pPiBsaXN0IG9mIHRoZSA8aT5QYWxldHRlPC9pPiwgY2hvb3NlIGEKLQkJCQkJCQlyZWxhdGlvbnNoaXAgdHlwZS4KLQkJCQkJCTwvcD4KLQkJCQkJPC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCUNsaWNrIHRoZSBzb3VyY2UgZW50aXR5IG9mIHRoZSByZWxhdGlvbnNoaXAgd2l0aCB0aGUgcHJpbWFyeQotCQkJCQkJCW1vdXNlIGJ1dHRvbiBvciBjaG9vc2UKLQkJCQkJCQk8a2JkIHRpdGxlPSJLZXlib2FyZCBidXR0b24iPkVTQ0FQRTwva2JkPgotCQkJCQkJCXRvIGNhbmNlbC4KLQkJCQkJCTwvcD4KLQkJCQkJPC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCUNsaWNrIHRoZSB0YXJnZXQgZW50aXR5IG9mIHRoZSByZWxhdGlvbnNoaXAgd2l0aCB0aGUgcHJpbWFyeQotCQkJCQkJCW1vdXNlIGJ1dHRvbiBvciBjaG9vc2UKLQkJCQkJCQk8a2JkIHRpdGxlPSJLZXlib2FyZCBidXR0b24iPkVTQ0FQRTwva2JkPgotCQkJCQkJCXRvIGNhbmNlbC4KLQkJCQkJCTwvcD4KLQkJCQkJCTxwPlRoZSBFY2xpcHNlIElERSBjcmVhdGVzIGFuZCB2aXN1YWxpemVzIHRoZSByZWxhdGlvbnNoaXAsIGFzCi0JCQkJCQkJd2VsbCBhcyB0aGUgcmVsZXZhbnQgcmVsYXRpb25zaGlwIGF0dHJpYnV0ZXMgb2YgdGhlIGVudGl0aWVzLAotCQkJCQkJCWRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiByZWxhdGlvbi48L3A+PC9saT4KLQkJCQkJPGxpPjxwPgotCQkJCQkJCVRvIHJlbW92ZSBhIHBhcnRpY3VsYXIgcmVsYXRpb25zaGlwLCBzZWxlY3QgdGhlIHJlbGF0aW9uIG9uIHRoZQotCQkJCQkJCUpQQSBkaWFncmFtIGFuZCBjaG9vc2UKLQkJCQkJCQk8a2JkIHRpdGxlPSJLZXlib2FyZCBidXR0b24iPkRFTEVURTwva2JkPgotCQkJCQkJCSwgb3IgY2hvb3NlIDxpPkRlbGV0ZTwvaT4gaW4gdGhlIGNvbnRleHQgbWVudS4KLQkJCQkJCTwvcD4KLQkJCQkJCTxkaXY+Ci0JCQkJCQkJPHA+UmVtb3ZpbmcgYSByZWxhdGlvbnNoaXAgdmlhIHRoZSBKUEEgZGlhZ3JhbSBhbHNvIHJlbW92ZXMKLQkJCQkJCQkJaXQgZnJvbSB0aGUgYXBwbGljYXRpb24gZGF0YSBtb2RlbCBhbmQgZGVsZXRlcyB0aGUgcmVsYXRpb25zaGlwCi0JCQkJCQkJCWF0dHJpYnV0ZXMgb2YgdGhlIHR3byByZWxhdGVkIGVudGl0aWVzLjwvcD4KLQkJCQkJCTwvZGl2PjwvbGk+Ci0JCQkJPC9vbD4KLQkJCTwvZGl2PjwvdGQ+Ci0JPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdG9jLmh0bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9odG1sL3RvYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWI5NjMxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2h0bWwvdG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+VGFibGUgb2YgQ29udGVudHM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQk8aDE+VGFibGUgb2YgQ29udGVudHM8L2gxPgotCVBsZWFzZSBlbnRlciB5b3VyIHRleHQgaGVyZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX2RpYWdyYW1fZGVsZXRlX2F0dHJpYnV0ZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX2RpYWdyYW1fZGVsZXRlX2F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjUzZjEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYV9kaWFncmFtX2RlbGV0ZV9hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYV9kaWFncmFtX2VkaXRvci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX2RpYWdyYW1fZWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZjOTVlNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX2RpYWdyYW1fZWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfZGlhZ3JhbV9lbnRpdHlfb3BlcmF0aW9ucy5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX2RpYWdyYW1fZW50aXR5X29wZXJhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODAwYTFiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfZGlhZ3JhbV9lbnRpdHlfb3BlcmF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9pbWcvanBhX21pbmlhdHVyZV92aWV3LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfbWluaWF0dXJlX3ZpZXcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNlMjU0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFfbWluaWF0dXJlX3ZpZXcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYWVkaXRvcl9lbnRpdHkuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvaW1nL2pwYWVkaXRvcl9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzQ5NWZmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL2ltZy9qcGFlZGl0b3JfZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjBhM2YuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRvIGNvZGUgZGV2ZWxvcGVyOgotIyAgIERvIE5PVCBjaGFuZ2UgdGhlIHByb3BlcnRpZXMgYmV0d2VlbiB0aGlzIGxpbmUgYW5kIHRoZQotIyAgICIlJSUgRU5EIE9GIFRSQU5TTEFURUQgUFJPUEVSVElFUyAlJSUiIGxpbmUuCi0jICAgTWFrZSBhIG5ldyBwcm9wZXJ0eSBuYW1lLCBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgY2hhbmdlCi0jICAgdGhlIGNvZGUgdG8gdXNlIHRoZSBuZXcgcHJvcGVydHkuCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIERvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ1YzZhYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KLTxwbHVnaW4+Ci0KLQk8IS0tID09PT09PT09PT09IC0tPgotCTwhLS0gRGVmaW5lIFRPQyAgLS0+Ci0JPCEtLSA9PT09PT09PT09PSAtLT4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICA8dG9jCi0gICAgICAgICAgICBmaWxlPSJ0b2MueG1sIgotICAgICAgICAgICAgcHJpbWFyeT0idHJ1ZSI+Ci0gICAgICA8L3RvYz4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL3RvYy54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci5kb2MudXNlci90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWJiZjYyLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLmRvYy51c2VyL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iSlBBIERpYWdyYW0gRWRpdG9yIFByb2plY3QgVXNlciBHdWlkZSI+Ci0KLQk8dG9waWMgbGFiZWw9IkdldHRpbmcgc3RhcnRlZCIgaHJlZj0iaHRtbC9nZXR0aW5nX3N0YXJ0ZWQuaHRtbCIvPgotCQotICAgIDx0b3BpYyBsYWJlbD0iVGFza3MiPgotICAgIAk8dG9waWMgaHJlZj0iUExVR0lOU19ST09UL29yZy5lY2xpcHNlLmpwdC5kb2MudXNlci9nZXR0aW5nX3N0YXJ0ZWQwMDMuaHRtIiBsYWJlbD0iQ3JlYXRlIG5ldyBKUEEgcHJvamVjdCI+Ci0gICAgCTwvdG9waWM+Ci0gICAgIDx0b3BpYyBocmVmPSJodG1sL3Rhc2tfY29uZmlndXJpbmdfZWRpdG9yLmh0bWwiIGxhYmVsPSJDb25maWd1cmluZyB0aGUgSlBBIGRpYWdyYW0gZWRpdG9yIj4KLSAgICAgPC90b3BpYz4KLSAgICAJPHRvcGljIGhyZWY9Imh0bWwvdGFza19vcGVuX2RpYWdyYW0uaHRtbCIgbGFiZWw9Ik9wZW4gSlBBIERpYWdyYW0sIGNyZWF0ZSBhbmQgZGlzcGxheSBlbnRpdGllcyI+Ci0gICAgCTwvdG9waWM+Ci0gICAgCTx0b3BpYyBocmVmPSJodG1sL3Rhc2tfcmVtb3ZlX2VudGl0aWVzLmh0bWwiIGxhYmVsPSJEZWZpbmluZyBhbmQgcmVtb3ZpbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGVudGl0aWVzIj4KLSAgICAJPC90b3BpYz4KLSAgICAJPHRvcGljIGhyZWY9Imh0bWwvdGFza19tYW5hZ2VfZW50aXRpZXMuaHRtbCIgbGFiZWw9Ik1hbmFnaW5nIGVudGl0aWVzIj4KLSAgICAJPC90b3BpYz4KLSAgICAJPHRvcGljIGhyZWY9Imh0bWwvdGFza19yZWZhY3Rvcl9lbnRpdGllcy5odG1sIiBsYWJlbD0iUmVmYWN0b3IsIHZpZXcsIGVkaXQgYW5kIHJlbW92ZSBlbnRpdGllcyBhbmQgdGhlaXIgYXR0cmlidXRlcyI+Ci0gICAgCTwvdG9waWM+Ci0gICAgCTx0b3BpYyBocmVmPSJodG1sL3Rhc2tfb3Blbl9taW5pYXR1cmVfdmlldy5odG1sIiBsYWJlbD0iT3BlbmluZyB0aGUgTWluaWF0dXJlIHZpZXcgb3IgdGhlIEpQQSBEZXRhaWxzIHZpZXciPgotICAgIAk8L3RvcGljPgotICAgIAk8dG9waWMgaHJlZj0iaHRtbC90YXNrXzIwX3N1cHBvcnQuaHRtbCIgbGFiZWw9IkpQQSBkaWFncmFtIGVkaXRvciBwYXJ0aWFsIHN1cHBvcnQgZm9yIEpQQSAyLjAiPgotICAgIAk8L3RvcGljPgotIAk8L3RvcGljPgotICAgIDx0b3BpYyBsYWJlbD0iUmVmZXJlbmNlIj4KLSAgICAgICA8dG9waWMgaHJlZj0iaHRtbC9yZWZlcmVuY2VfcHJvamVjdF9wYWdlLmh0bWwiIGxhYmVsPSJQcm9wZXJ0eSBwYWdlIC0gSlBBIERpYWdyYW0gRWRpdG9yIE9wdGlvbnMiPgotICAgICAgIDwvdG9waWM+Ci0gICAgPC90b3BpYz4gCi0KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLmNsYXNzcGF0aCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjJjMzUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNSIgLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIC8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIiAvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIgLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLmN2c2lnbm9yZSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDc3YTQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvLnByb2plY3QgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5OTQ5NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjYWQwOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIE1hciAwOCAxMjowOTo1NyBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzgxNGUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW4KLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnM7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjUuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ2VmO2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5ncmFwaGl0aTtidW5kbGUtdmVyc2lvbj0iWzAuOC4wLDEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW07YnVuZGxlLXZlcnNpb249IlswLjguMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBhdHRlcm47YnVuZGxlLXZlcnNpb249IlswLjguMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpO2J1bmRsZS12ZXJzaW9uPSJbMC44LjAsMS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamR0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy43LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjAuMCwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eTtidW5kbGUtdmVyc2lvbj0iWzIuMC4wLDMuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjQuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVtZjtidW5kbGUtdmVyc2lvbj0iWzEuMS4yMDAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMy4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtO2J1bmRsZS12ZXJzaW9uPSIxLjMuMTAwIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZGlhbG9nO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG47eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2U7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXRlc3Rlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9hYm91dC5odG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjU4Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDI+QWJvdXQgVGhpcyBDb250ZW50PC9IMj4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCAKLSAgb3V0IGJlbG93LiBJZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIAotICB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgCi0gIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJiM4MjE3O3MgbGljZW5zZSBmb3IgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotPGg0PjxhIG5hbWU9IkpQQSIgaWQ9IkpQQSI+PC9hPkphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHYxLjA8L2g0PgotCi08YmxvY2txdW90ZT4KLSAgPHA+VGhlIEphdmEgUGVyc2lzdGVuY2UgQVBJIChKUEEpIHdoaWNoIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2xhc3NmaXNoLmRldi5qYXZhLm5ldC9wdWJsaWMvQ0RETHYxLjAuaHRtbCI+Q0RETCAKLSAgICB2MS4wPC9hPiBpcyByZXF1aXJlZCBieSB0aGUgRGFsaSBKYXZhIFBlcnNpc3RlbmNlIFRvb2xzIFByb2plY3QgaW4gb3JkZXIgCi0gICAgdG8gc3VwcG9ydCB0aGlzIHN0YW5kYXJkLjwvcD4KLTwvYmxvY2txdW90ZT4KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDE4ZjVkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wLCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbgotIyBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLgotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSAuLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvY29tcG9uZW50LnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MDcyYTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PGNvbXBvbmVudCAgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkiPjxkZXNjcmlwdGlvbiB1cmw9IiI+PC9kZXNjcmlwdGlvbj48Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPjxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIiBmcmFnbWVudD0iZmFsc2UiLz48L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9Db21wb3VuZEtleS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9Db21wb3VuZEtleS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5OGQxM2QuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvQ29tcG91bmRLZXkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvRUpCXzE1eDE2LmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL0VKQl8xNXgxNi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyZmVmMDUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvRUpCXzE1eDE2LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2NtcEVudGl0eV9vYmouZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvY21wRW50aXR5X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZWQxZjkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvY21wRW50aXR5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYWRkX2F0dHJpYnV0ZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYWRkX2F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWE0YzEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2FkZF9hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2FkZF9lbnRpdHkuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2FkZF9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTc4Mzg0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9hZGRfZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9iYXNpYy5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvYmFzaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTQ3ZDc0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9iYXNpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkYWJsZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkYWJsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NTZmNzguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGFibGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGVkLWlkLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRlZC1pZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYzhlMjEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VtYmVkZGVkLWlkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRlZC5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW1iZWRkZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmFlNjY0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbWJlZGRlZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW50aXR5LW1hcHBpbmdzLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbnRpdHktbWFwcGluZ3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzQ5Yzk2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9lbnRpdHktbWFwcGluZ3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2VudGl0eS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwNmY0OC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9pZC5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvaWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjA1ZWMzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9pZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvanBhLWNvbnRlbnQuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2pwYS1jb250ZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhYjkxNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvanBhLWNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2pwYS1maWxlLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9qcGEtZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZTlmNDcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L2pwYS1maWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnktMS1kaXIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS0xLWRpci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Y2FjMDAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS0xLWRpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LTItZGlyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnktMi1kaXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2IzZDE0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW1hbnktMi1kaXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tbWFueS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg4ODViMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1tYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS0xLWRpci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUtMS1kaXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTRlMmNhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS0xLWRpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUtMi1kaXIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLTItZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyODAwNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFueS10by1vbmUtMi1kaXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYW55LXRvLW9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMWUyYjkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L21hbnktdG8tb25lLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYXBwZWQtc3VwZXJjbGFzcy5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2MzNzY0Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9tYXBwZWQtc3VwZXJjbGFzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvbnVsbC1hdHRyaWJ1dGUtbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTljMjMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L251bGwtdHlwZS1tYXBwaW5nLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9udWxsLXR5cGUtbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNzk0NzguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L251bGwtdHlwZS1tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tbWFueS0xLWRpci5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW1hbnktMS1kaXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTJlZjQ4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tbWFueS0xLWRpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW1hbnkuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1tYW55LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5MDAyNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW1hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUtMS1kaXIuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUtMS1kaXIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTkzYWNmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLTEtZGlyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLTItZGlyLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9vbmUtdG8tb25lLTItZGlyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU0YTlhZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS0yLWRpci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvb25lLXRvLW9uZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3OGVjMzYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L29uZS10by1vbmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3BlcnNpc3RlbmNlLXVuaXQuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3BlcnNpc3RlbmNlLXVuaXQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M0NWY2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9wZXJzaXN0ZW5jZS11bml0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9wZXJzaXN0ZW5jZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcGVyc2lzdGVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWY2MTZkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC9wZXJzaXN0ZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcmVtb3ZlX2F0dHJpYnV0ZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvcmVtb3ZlX2F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMTY2YjMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3JlbW92ZV9hdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3RyYW5zaWVudC5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvdHJhbnNpZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M1ZDgzZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvdHJhbnNpZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC92ZXJzaW9uLmdpZiBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL2VudC92ZXJzaW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyYTgxMC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvdmVyc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvd2FybmluZy5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9lbnQvd2FybmluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDA5ZTkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvZW50L3dhcm5pbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvcmVzdG9yZS5naWYgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9yZXN0b3JlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MTk4NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9yZXN0b3JlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL2ljb25zL3NhdmUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvc2F2ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMDg1MWEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvc2F2ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9zYXZlX2FuZF9yZW1vdmUuZ2lmIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvaWNvbnMvc2F2ZV9hbmRfcmVtb3ZlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcxZDIzMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9pY29ucy9zYXZlX2FuZF9yZW1vdmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjNTVhMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotcGx1Z2luTmFtZT1EYWxpIEphdmEgUGVyc2lzdGVuY2UgVG9vbHMgLSBKUEEgRGlhZ3JhbSBFZGl0b3IKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtCi0KLWRpYWdyYW1lZGl0b3IubmFtZSA9IEpQQSBEaWFncmFtIEVkaXRvcgotZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5tZW51LmxhYmVsID0gT3BlbiBEaWFncmFtCi1kaWFncmFtZWRpdG9yLm9wZW5kaWFncmFtLmFjdGlvbi5sYWJlbCA9IE9wZW4gRGlhZ3JhbQotZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5wcm9qZWN0Lm1lbnUubGFiZWwgPSBPcGVuIERpYWdyYW0KLWRpYWdyYW1lZGl0b3Iub3BlbmRpYWdyYW0uYWN0aW9uLnByb2plY3QubGFiZWwgPSBPcGVuIERpYWdyYW0KLWRpYWdyYW1lZGl0b3IucHJlZnBhZ2UgPSBKUEEgRGlhZ3JhbSBFZGl0b3IKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wbHVnaW4ueG1sIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkMzU5NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tCi0gICAgPGNvcHlyaWdodD4KLSAgIAotICAgIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICAgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICAgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAgIAotICAgIENvbnRyaWJ1dG9yczoKLSAgICAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAgIAotICAgIDwvY29weXJpZ2h0PgotICAgCi0gLS0+Ci08cGx1Z2luPgotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotICAgICAgPGVkaXRvcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3IiCi0gICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgotICAgICAgICAgICAgaWNvbj0iaWNvbnMvZW50L2VudGl0eS5naWYiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkiCi0gICAgICAgICAgICBtYXRjaGluZ1N0cmF0ZWd5PSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpLkpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kiCi0gICAgICAgICAgICBuYW1lPSIlZGlhZ3JhbWVkaXRvci5uYW1lIj4KLSAgICAgIDwvZWRpdG9yPgotICAgPC9leHRlbnNpb24+Ci0gICAKLSA8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBhZGFwdGFibGU9ImZhbHNlIgotICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5vcGVuRGlhZ3JhbUpwYSIKLSAgICAgICAgICBuYW1lRmlsdGVyPSIqIgotICAgICAgICAgIG9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZSI+Ci0gICAgICAgICAgCi0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuanBhUHJvamVjdEZhY2V0IiB2YWx1ZT0ianB0LmpwYSIvPgotCQkJPC9lbmFibGVtZW50PgotICAgICAgIDxtZW51Ci0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtSnBhTWVudSIKLSAgICAgICAgICAgICBsYWJlbD0iJWRpYWdyYW1lZGl0b3Iub3BlbmRpYWdyYW0ubWVudS5sYWJlbCI+Ci0gICAgICAgPC9tZW51PgotICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlIgotICAgICAgICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtSnBhQWN0aW9uIgotICAgICAgICAgICAgIGxhYmVsPSIlZGlhZ3JhbWVkaXRvci5vcGVuZGlhZ3JhbS5hY3Rpb24ubGFiZWwiPgotICAgICAgIDwvYWN0aW9uPgotICAgIDwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgIDxvYmplY3RDb250cmlidXRpb24KLSAgICAgICAgICBhZGFwdGFibGU9InRydWUiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLm9wZW5EaWFncmFtT25KcGFQcm9qZWN0IgotICAgICAgICAgIG5hbWVGaWx0ZXI9IioiCi0gICAgICAgICAgb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4KLQkJPGVuYWJsZW1lbnQ+Ci0JCQk8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IiB2YWx1ZT0ianB0LmpwYSIvPgotCQk8L2VuYWJsZW1lbnQ+Ci0gICAgICAgPGFjdGlvbgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGUiCi0gICAgICAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkub3BlbkRpYWdyYW1PbkpwYVByb2plY3RBY3Rpb24iCi0gICAgICAgICAgICAgbGFiZWw9IiVkaWFncmFtZWRpdG9yLm9wZW5kaWFncmFtLmFjdGlvbi5wcm9qZWN0LmxhYmVsIgotICAgICAgICAgICAgIG1lbnViYXJQYXRoPSJvcmcuZWNsaXBzZS5qcHQuanBhLnVpLm1lbnUuSnBhVG9vbHMvY29udGVudCI+Ci0gICAgICAgPC9hY3Rpb24+Ci0gICAgPC9vYmplY3RDb250cmlidXRpb24+Ci0gPC9leHRlbnNpb24+Ci08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotIAk8cGFnZQotICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkVkaXRvcnMiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UiCi0gICAgICAgIG5hbWU9IiVkaWFncmFtZWRpdG9yLnByZWZwYWdlIj4KLSAgIAk8L3BhZ2U+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotICAgPGluaXRpYWxpemVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLSAgIDwvaW5pdGlhbGl6ZXI+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLSAgIDxwYWdlCi0gICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UuanB0LmpwYS51aS5qcGFQcm9qZWN0UHJvcGVydGllcyIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZSIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5wcm9wZXJ0eXBhZ2UiCi0gICAgICAgICBuYW1lPSIlZGlhZ3JhbWVkaXRvci5wcmVmcGFnZSI+Ci0JCQk8ZW5hYmxlZFdoZW4+Ci0JCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ij4gCQkgICAgICAgIAotCQkgICAgICAgICAgPG9yPgotCQkJCSAgICA8dGVzdAotCQkJCQkgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJICAgICBwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkgICAgIHZhbHVlPSJqcHQuanBhOjEuMCI+Ci0JCQkJCTwvdGVzdD4KLQkJCQkJPHRlc3QKLQkJCQkJICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCSAgICAgcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJICAgICB2YWx1ZT0ianB0LmpwYToyLjAiPgotCQkJCQk8L3Rlc3Q+Ci0JCQkJICA8L29yPgkKLQkJICAgICAgICA8L2FkYXB0PiAKLQkJCTwvZW5hYmxlZFdoZW4+ICAgICAgICAgCi0gICA8L3BhZ2U+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5kaWFncmFtVHlwZVByb3ZpZGVycyI+Ci0gICA8ZGlhZ3JhbVR5cGVQcm92aWRlcgotICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIiCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciIKLSAgICAgICAgIG5hbWU9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIiPgotICAgICAgPGRpYWdyYW1UeXBlCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuSlBBRWRpdG9yRGlhZ3JhbVR5cGUiPgotICAgICAgPC9kaWFncmFtVHlwZT4KLSAgICAgIDxpbWFnZVByb3ZpZGVyCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlciI+Ci0gICAgICA8L2ltYWdlUHJvdmlkZXI+Ci0gICA8L2RpYWdyYW1UeXBlUHJvdmlkZXI+Ci08L2V4dGVuc2lvbj4KLTxleHRlbnNpb24KLSAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5kaWFncmFtVHlwZXMiPgotICAgPGRpYWdyYW1UeXBlCi0gICAgICAgICBkZXNjcmlwdGlvbj0iVGhpcyBpcyB0aGUgZGlhZ3JhbSB0eXBlIGZvciB0aGUgSlBBIGVkaXRvciIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5KUEFFZGl0b3JEaWFncmFtVHlwZSIKLSAgICAgICAgIG5hbWU9IkpQQSBlZGl0b3IgZGlhZ3JhbSB0eXBlIgotICAgICAgICAgdHlwZT0iSlBBIERpYWdyYW0iPgotICAgPC9kaWFncmFtVHlwZT4KLTwvZXh0ZW5zaW9uPgotPGV4dGVuc2lvbgotICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmltYWdlUHJvdmlkZXJzIj4KLSAgIDxpbWFnZVByb3ZpZGVyCi0gICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlciIKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyIj4KLSAgIDwvaW1hZ2VQcm92aWRlcj4KLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLnByb3BlcnR5VGVzdGVycyI+Ci0gICAgPHByb3BlcnR5VGVzdGVyCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvcGVydHl0ZXN0ZXIuSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGUiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIgotICAgICAgcHJvcGVydGllcz0ianBhUHJvamVjdEZhY2V0IgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5dGVzdGVyLkpwYVByb2plY3RGYWNldFZlcnNpb25Qcm9wZXJ0eVRlc3RlciI+Ci0gICAgPC9wcm9wZXJ0eVRlc3Rlcj4KLTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BvbS54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGIxY2ZmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQk8dmVyc2lvbj4xLjAuMTAwLVNOQVBTSE9UPC92ZXJzaW9uPgotCQotCTxwYXJlbnQ+Ci0JCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yX3BhcmVudDwvYXJ0aWZhY3RJZD4KLQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3I8L2dyb3VwSWQ+Ci0JCTx2ZXJzaW9uPjEuMS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCQk8cmVsYXRpdmVQYXRoPi4uLy4uL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnJlbGVuZy9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0JPC9wYXJlbnQ+Ci0JCi0JPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWk8L2FydGlmYWN0SWQ+Ci0JPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgotCTxuYW1lPkpQQSBEaWFncmFtIEVkaXRvciBQbHVnLWluPC9uYW1lPgkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvSlBBRGlhZ3JhbUVkaXRvci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL0pQQURpYWdyYW1FZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk1YThkNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvSlBBRGlhZ3JhbUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5Db250ZXh0TWVudVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5EZWZhdWx0RWRpdERvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ2VmLkVkaXRQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5lZGl0b3IuRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5pbnRlcm5hbC5wYXJ0cy5Db25uZWN0aW9uRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5Qcm9ncmVzc01vbml0b3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uRGVmYXVsdEpwYVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLnVpLmludGVybmFsLnNlbGVjdGlvbi5KcGFTZWxlY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5KUEFEaWFncmFtRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuRW50aXRpZXNDb29yZGluYXRlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUNoZWNrU3VtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLldycDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpQQURpYWdyYW1FZGl0b3IgZXh0ZW5kcyBEaWFncmFtRWRpdG9yIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgRGVmYXVsdEVkaXREb21haW4gZWRpdERvbWFpbjsKLQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRUeXBlIGlucHV0SnB0VHlwZTsKLQlwcml2YXRlIElTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSBqcGFTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLQotCXB1YmxpYyBKUEFEaWFncmFtRWRpdG9yKCkgewotCQl0aGlzKG5ldyBTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeUltcGwoKSk7Ci0JCWVkaXREb21haW4gPSBuZXcgRGVmYXVsdEVkaXREb21haW4odGhpcyk7Ci0JfQotCi0JcHVibGljIEpQQURpYWdyYW1FZGl0b3IoSVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IGpwYVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuanBhU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgPSBqcGFTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeTsKLQkJZWRpdERvbWFpbiA9IG5ldyBEZWZhdWx0RWRpdERvbWFpbih0aGlzKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIpIHN1cGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgdHlwZSkgewkJCi0JCWlmKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcy5lcXVhbHModHlwZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVXaXRob3V0RW50aXRpZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZpbmFsIERpYWdyYW0gZCA9IGdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCWZpbmFsIFdycCB3cnAgPSBuZXcgV3JwKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGQpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlKUEFDaGVja1N1bS5JTlNUQU5DRSgpLmFzc2lnbkVudGl0eVNoYXBlc01ENVN0cmluZ3MoZCwgTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkLmdldE5hbWUoKSkpOwotCQkJCUxpc3Q8U2hhcGU+IGNoaWxkcmVuID0gZC5nZXRDaGlsZHJlbigpOwotCQkJCUl0ZXJhdG9yPFNoYXBlPiBjaEl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQlib29sZWFuIHNhdmUgPSB0cnVlOwotCQkJCXdoaWxlIChjaEl0Lmhhc05leHQoKSkgewotCQkJCQlDb250YWluZXJTaGFwZSBzaCA9IChDb250YWluZXJTaGFwZSljaEl0Lm5leHQoKTsKLQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCQkJLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzaCk7Ci0JCQkJCVN0cmluZyBlbnROYW1lID0gSlBBRWRpdG9yVXRpbC5nZXRUZXh0KGpwdCk7Ci0JCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKGN1Lmhhc1Vuc2F2ZWRDaGFuZ2VzKCkpIHsKLQkJCQkJCQllbnROYW1lID0gIiogIiArIGVudE5hbWU7IAkvLyROT04tTkxTLTEkCi0JCQkJCQkJc2F2ZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiUHJvYmxlbSB3aXRoIGNvbXBpbGF0aW9uIHVuaXQiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkgCi0JCQkJCX0KLQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUhlYWRlcihzaCwgZW50TmFtZSk7Ci0JCQkJfQotCQkJCXdycC5zZXRPYmoobmV3IEJvb2xlYW4oc2F2ZSkpOwotCQkJfQotCQl9KTsJCQotCQlpZiAoKEJvb2xlYW4pd3JwLmdldE9iaigpKQotCQkJc3VwZXIuZG9TYXZlKG1vbml0b3IpOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRvU2F2ZShmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgRGlhZ3JhbSBkID0gZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJLy9JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGQpOwotCQlpZiAoKGQgPT0gbnVsbCkgfHwgKHRlZCA9PSBudWxsKSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigoZCA9PSBudWxsKSA/ICJEaWFncmFtIGlzIG51bGwiIDogIlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGlzIG51bGwiLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCSAvLyROT04tTkxTLTIkCSAgICAgCQkJCQkKLQkJCXJldHVybjsKLQkJfQotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlKUEFDaGVja1N1bS5JTlNUQU5DRSgpLmFzc2lnbkVudGl0eVNoYXBlc01ENVN0cmluZ3MoZCwgTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkLmdldE5hbWUoKSkpOwotCQkJCUxpc3Q8U2hhcGU+IGNoaWxkcmVuID0gZC5nZXRDaGlsZHJlbigpOwotCQkJCUl0ZXJhdG9yPFNoYXBlPiBjaEl0ID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY2hJdC5oYXNOZXh0KCkpIHsKLQkJCQkJU2hhcGUgc2ggPSBjaEl0Lm5leHQoKTsKLQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCQkJLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzaCk7Ci0JCQkJCWlmIChqcHQgIT0gbnVsbCkKLQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCQl9Ci0JCQkJLyoKLQkJCQlSZXNvdXJjZSByZXMgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRSZXNvdXJjZUJ5RGlhZ3JhbShkKTsKLQkJCQkKLQkJCQl0cnkgewotCQkJCQkvL2RvU2F2ZShtb25pdG9yKTsKLQkJCQkJcmVzLnNhdmUobnVsbCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IHNhdmUgdGhlIGRpYWdyYW0iKTsJLy8kTk9OLU5MUy0xJAotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOyAJCi0JCQkJfQotCQkJCSovCi0JCQkJCi0JCQl9Ci0JCX0pOwotCQkKLQkJLy9JUHJvamVjdCBwcm9qZWN0ID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbSgpLmdldFByb2plY3QoKTsKLQkJRW50aXRpZXNDb29yZGluYXRlc1hNTCB4bWwgPSBuZXcgRW50aXRpZXNDb29yZGluYXRlc1hNTChkLmdldE5hbWUoKSk7Ci0JCXhtbC5zdG9yZSgpOwotCQl4bWwuY2xvc2UoKTsKLQkJCi0JCXN1cGVyLmRvU2F2ZShtb25pdG9yKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgQ29udGV4dE1lbnVQcm92aWRlciBjcmVhdGVDb250ZXh0TWVudVByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IEpQQUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIoZ2V0R3JhcGhpY2FsVmlld2VyKCksCi0JCQkJZ2V0QWN0aW9uUmVnaXN0cnkoKSwKLQkJCQlnZXRDb25maWd1cmF0aW9uUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRXaXRoRmlsZUVkaXRvcklucHV0KGZpbmFsIElFZGl0b3JTaXRlIHNpdGUsCi0JCQlmaW5hbCBJRmlsZSBlbnRpdHlGaWxlKSB7Ci0JCURpYWdyYW0gZGlhZ3JhbSA9IG51bGw7Ci0JCXRyeSB7CQkJCi0JCQlQcm9ncmVzc01vbml0b3JEaWFsb2cgZGlhbG9nID0gbmV3IFByb2dyZXNzTW9uaXRvckRpYWxvZyhzaXRlCi0JCQkJCS5nZXRTaGVsbCgpKTsKLQkJCWRpYWxvZy5ydW4odHJ1ZSwgZmFsc2UsIG5ldyBJUnVubmFibGVXaXRoUHJvZ3Jlc3MoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKLQkJCQkJCXRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkJCW1vbml0b3IuYmVnaW5UYXNrKAotCQkJCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQURpYWdyYW1FZGl0b3Jfd2FpdGluZ0Zvck1vaW4sCi0JCQkJCQkJSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsJCQkJCQotCQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJaW5wdXRKcHRUeXBlID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoSmF2YUNvcmUKLQkJCQkJLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5RmlsZSkpOwotCQkJc2V0UGFydFByb3BlcnR5KAotCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuT1BFTl9XSE9MRV9QRVJTSVNURU5DRV9VTklUX0VESVRPUl9QUk9QRVJUWSwKLQkJCQkJaW5wdXRKcHRUeXBlLmdldE5hbWUoKSk7Ci0JCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gaW5wdXRKcHRUeXBlLmdldFBlcnNpc3RlbmNlVW5pdCgpOwotCQkJU3RyaW5nIGRpYWdyYW1VUkkgPSBNb2RlbEludGVncmF0aW9uVXRpbC5jcmVhdGVEaWFncmFtUGF0aChwZXJzaXN0ZW5jZVVuaXQpLnRvU3RyaW5nKCk7Ci0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkZWZhdWx0VHJhbnNFZGl0RG9tYWluID0gKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKWlucHV0SnB0VHlwZS4KLQkJCQkJCQkJZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKS5nZXRBZGFwdGVyKFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluLmNsYXNzKTsKLQkJCWRpYWdyYW0gPSBNb2RlbEludGVncmF0aW9uVXRpbC5jcmVhdGVEaWFncmFtKHBlcnNpc3RlbmNlVW5pdCwgMTAsIHRydWUpOwotCQkJSlBBRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1JbnB1dCA9IG5ldyBKUEFEaWFncmFtRWRpdG9ySW5wdXQoZGlhZ3JhbSwKLQkJCQkJCQkJCQkJCQkJCQkJCSAgIGRpYWdyYW1VUkksIAotCQkJCQkJCQkJCQkJCQkJCQkJICAgZGVmYXVsdFRyYW5zRWRpdERvbWFpbiwgCi0JCQkJCQkJCQkJCQkJCQkJCQkgICBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyLklELCAKLQkJCQkJCQkJCQkJCQkJCQkJCSAgIGZhbHNlKTsKLQkJCS8vTW9kZWxJbnRlZ3JhdGlvblV0aWwubWFwRGlhZ3JhbVRvUHJvamVjdChkaWFncmFtLCBwZXJzaXN0ZW5jZVVuaXQKLQkJCS8vCQkuZ2V0SnBhUHJvamVjdCgpKTsKLQkJCXN1cGVyLmluaXQoc2l0ZSwgZGlhZ3JhbUlucHV0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkvL01vZGVsSW50ZWdyYXRpb25VdGlsLnJlbW92ZURpYWdyYW1Qcm9qZWN0TWFwcGluZyhkaWFncmFtKTsKLQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhzdGF0dXMpOwotCQkJLy9Nb2RlbEludGVncmF0aW9uVXRpbC5yZW1vdmVEaWFncmFtUHJvamVjdE1hcHBpbmcoZGlhZ3JhbSk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLAotCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0JCQkvL01vZGVsSW50ZWdyYXRpb25VdGlsLnJlbW92ZURpYWdyYW1Qcm9qZWN0TWFwcGluZyhkaWFncmFtKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KQotCQkJdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsJCQotCQlJRmlsZSBlbnRpdHlGaWxlID0gKElGaWxlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJCi0JCWlmIChlbnRpdHlGaWxlICE9IG51bGwgJiYgZW50aXR5RmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzKCJqYXZhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW5pdFdpdGhGaWxlRWRpdG9ySW5wdXQoc2l0ZSwgZW50aXR5RmlsZSk7Ci0JCX0gZWxzZQotCQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAoIShzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247Ci0JCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCQlJdGVyYXRvcjxJU3RydWN0dXJlZFNlbGVjdGlvbj4gaXRlciA9IHN0cnVjdFNlbC5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyLmhhc05leHQoKSl7Ci0JCQlPYmplY3Qgb2JqZWN0ID0gaXRlci5uZXh0KCk7Ci0JCQlpZihvYmplY3QgaW5zdGFuY2VvZiBFZGl0UGFydCl7Ci0JCQkJRWRpdFBhcnQgZWRpdFBhcnQgPSAoRWRpdFBhcnQpIG9iamVjdDsKLQkJCQlpZihlZGl0UGFydCBpbnN0YW5jZW9mIENvbm5lY3Rpb25FZGl0UGFydCl7Ci0JCQkJCUNvbm5lY3Rpb25FZGl0UGFydCBjb25uZWN0aW9uRWRpdFBhcnQgPSAgKENvbm5lY3Rpb25FZGl0UGFydCkgKGVkaXRQYXJ0KTsKLQkJCQkJY29ubmVjdGlvbkVkaXRQYXJ0LnJlbW92ZUVkaXRQb2xpY3koRWRpdFBvbGljeS5DT05ORUNUSU9OX0JFTkRQT0lOVFNfUk9MRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQlPYmplY3QgbyA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCWlmIChvIGluc3RhbmNlb2YgRWRpdFBhcnQpIHsJCQkKLQkJCUpwYVNlbGVjdGlvbk1hbmFnZXIgc2VsZWN0aW9uTWFuYWdlciA9IGdldEpwYVNlbGVjdGlvbk1hbmFnZXIocGFydCk7Ci0JCQlPYmplY3QgbSA9ICgoRWRpdFBhcnQpIG8pLmdldE1vZGVsKCk7Ci0JCQlpZiAobSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmIChtIGluc3RhbmNlb2YgUGljdG9ncmFtRWxlbWVudCkgewotCQkJCU9iamVjdCBibyA9IGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCQkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KAotCQkJCQkJCQkoUGljdG9ncmFtRWxlbWVudCkgbSk7Ci0JCQkJaWYgKChibyA9PSBudWxsKSB8fCAoIShibyBpbnN0YW5jZW9mIEpwYVN0cnVjdHVyZU5vZGUpKSkKLQkJCQkJcmV0dXJuOwotCQkJCXNlbGVjdGlvbk1hbmFnZXIuc2VsZWN0KG5ldyBEZWZhdWx0SnBhU2VsZWN0aW9uKAotCQkJCQkJKEpwYVN0cnVjdHVyZU5vZGUpIGJvKSwgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBKcGFTZWxlY3Rpb25NYW5hZ2VyIGdldEpwYVNlbGVjdGlvbk1hbmFnZXIoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQlyZXR1cm4ganBhU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkuZ2V0U2VsZWN0aW9uTWFuYWdlcihwYXJ0LmdldFNpdGUoKQotCQkJCS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSVNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5IHsKLQkJcHVibGljIEpwYVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VsZWN0aW9uTWFuYWdlckZhY3RvcnlJbXBsIGltcGxlbWVudHMKLQkJCUlTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSB7Ci0KLQkJcHVibGljIEpwYVNlbGVjdGlvbk1hbmFnZXIgZ2V0U2VsZWN0aW9uTWFuYWdlcihJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJcmV0dXJuIFNlbGVjdGlvbk1hbmFnZXJGYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIod2luZG93KTsKLQkJfQotCi0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBEZWZhdWx0RWRpdERvbWFpbiBnZXRFZGl0RG9tYWluKCkgewotCQlyZXR1cm4gZWRpdERvbWFpbjsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL0pQQURpYWdyYW1FZGl0b3JQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkNjM0Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmRpYWxvZ3MuT3B0aW9uYWxNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mYWNhZGUuRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JLy8gVGhlIHBsdWctaW4gSUQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbiBwbHVnaW47Ci0JCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBjaGFuZ2VMaXN0ZW5lcjsKLQkJCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEpQQURpYWdyYW1FZGl0b3JQbHVnaW4oKSB7Ci0JfQotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JCQotCQlPcHRpb25hbE1lc3NhZ2VEaWFsb2cuc2V0RGlhbG9nRW5hYmxlZChKUEFFZGl0b3JDb25zdGFudHMuSlBBX1NVUFBPUlRfRElBTE9HX0lELCB0cnVlKTsKLQkJY2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlFY2xpcHNlRmFjYWRlLklOU1RBTkNFLmdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlFY2xpcHNlRmFjYWRlLklOU1RBTkNFLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIoY2hhbmdlTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqCi0JICogQHJldHVybiB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICovCi0JcHVibGljIHN0YXRpYyBKUEFEaWFncmFtRWRpdG9yUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4KLQkgKiBwbHVnLWluIHJlbGF0aXZlIHBhdGgKLQkgKgotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgaW1hZ2UgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcGF0aCkgewotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5fSUQsIHBhdGgpOwotCX0KLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbXNnKSB7Ci0gICAgICAgIGxvZ0Vycm9yKG1zZywgbnVsbCk7Ci0gICAgfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZ0Vycm9yKHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIHRocm93YWJsZSk7Ci0JfQotCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhbmQgZXhjZXB0aW9uIG9yIGVycm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgbXNnLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCWxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCB0aHJvd2FibGUpKTsKLQl9Ci0JCi0JLyoqCi0JICogTG9nIHRoZSBzcGVjaWZpZWQgc3RhdHVzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJcGx1Z2luLmdldExvZygpLmxvZyhzdGF0dXMpOwotICAgIH0KLQkKLQkKLQkvKioKLQkgKiBMb2cgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGFuZCBleGNlcHRpb24gb3IgZXJyb3IuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0luZm8oU3RyaW5nIG1zZykgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbXNnLCBudWxsKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2RpYWxvZy9TZWxlY3RUeXBlRGlhbG9nLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZGlhbG9nL1NlbGVjdFR5cGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4NWU5Ny4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZGlhbG9nL1NlbGVjdFR5cGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZGlhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLklKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuSmF2YVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuS2V5U3Ryb2tlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLmtleXMuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuVGl0bGVBcmVhRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LkNvbnRlbnRQcm9wb3NhbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZmllbGRhc3Npc3QuSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LlNpbXBsZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmZpZWxkYXNzaXN0LlRleHRDb250ZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuU3RyaW5nVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlNlbGVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5mb3Jtcy5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JUHJvZ3Jlc3NTZXJ2aWNlOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgU2VsZWN0VHlwZURpYWxvZyBleHRlbmRzIFRpdGxlQXJlYURpYWxvZyB7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0JcHJvdGVjdGVkIExhYmVsIGxhYmVsOwotCXByb3RlY3RlZCBUZXh0IHRleHQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB0eXBlOwotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCXByb3RlY3RlZCBDb250ZW50UHJvcG9zYWxBZGFwdGVyIGNvbnRlbnRQcm9wb3NhbEFkYXB0ZXI7Ci0JCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBLZXlTdHJva2Uga3MgPSBudWxsOwotCXN0YXRpYyB7Ci0JCXRyeSB7Ci0JCQlrcyA9IEtleVN0cm9rZS5nZXRJbnN0YW5jZSgiQ3RybCtTcGFjZSIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZTEpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbid0IGNyZWF0ZSBrZXlzdHJva2Ugb2JqZWN0IiwgZTEpOyAJLy8kTk9OLU5MUy0xJAotCQl9IAotCX0KLQkKLQlwdWJsaWMgU2VsZWN0VHlwZURpYWxvZyhTdHJpbmcgbWVzc2FnZSwKLQkJCQkJCQlTdHJpbmcgaW5pdGlhbFR5cGUpIHsKLQkJc3VwZXIoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0JCXRoaXMudGl0bGUgPSBKUEFFZGl0b3JNZXNzYWdlcy5TZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dUaXRsZTsKLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy50eXBlID0gaW5pdGlhbFR5cGU7Ci0JfQotCQotICAgIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLSAgICAgICAgQ29udHJvbCBjb250ZW50cyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0gICAgICAgIGluaXRpYWxpemVDb250cm9scygpOwotICAgICAgICB2YWxpZGF0ZVBhZ2UoKTsKLSAgICAgICAgcmV0dXJuIGNvbnRlbnRzOwotICAgIH0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotICAgICAgICBzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0gICAgICAgIHNoZWxsLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nV2luZG93VGl0bGUpOwotICAgIH0KLSAgICAKLSAgICAKLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbFNpemUoKSB7Ci0JCXJldHVybiBuZXcgUG9pbnQoY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoMzIwKSwKLQkJCQkJCSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoMTIwKSk7Ci0JfSAgICAKLSAgICAKLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJdHlwZSA9IHRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQkJCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNSZXNpemFibGUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMYWJlbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfdHlwZUxhYmVsKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVRleHRGaWVsZChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCXRleHQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQnJvd3NlQnRuKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuU2VsZWN0VHlwZURpYWxvZ19icm93c2VCdG5UeHQpOwotCQlicm93c2VCdXR0b24uc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuU2VsZWN0VHlwZURpYWxvZ19icm93c2VCdG5EZXNjKTsKLQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCUlKYXZhU2VhcmNoU2NvcGUgc2NvcGU9IFNlYXJjaEVuZ2luZS5jcmVhdGVXb3Jrc3BhY2VTY29wZSgpOwotCQkJCUlQcm9ncmVzc1NlcnZpY2Ugc2VydmljZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7CQkJCQotCQkJCVNlbGVjdGlvbkRpYWxvZyBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlkID0gSmF2YVVJLmNyZWF0ZVR5cGVEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSwgCi0JCQkJCXNlcnZpY2UsIAotCQkJCQlzY29wZSwgCi0JCQkJCUlKYXZhRWxlbWVudFNlYXJjaENvbnN0YW50cy5DT05TSURFUl9BTExfVFlQRVMsIAotCQkJCQlmYWxzZSwgCi0JCQkJCXRleHQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbid0IGNyZWF0ZSB0eXBlIHNlbGFjdGlvbiBkaWFsb2cgaW5zdGFuY2UiLCBlMSk7IAkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWQub3BlbigpOwotCQkJCU9iamVjdFtdIHJlcyA9IGQuZ2V0UmVzdWx0KCk7IAotCQkJCWlmIChyZXMgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCU9iamVjdFtdIG9iaiA9IGQuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYgKG9iaiA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJSVR5cGUgdHAgPSAoSVR5cGUpIG9ialswXTsKLQkJCQl0ZXh0LnNldFRleHQodHAuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCkpOwotCQkJCXRleHQuc2V0U2VsZWN0aW9uKDAsIHRwLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpLmxlbmd0aCgpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9Ci0JCX0pOwotCX0KLQkKLQlwcml2YXRlIElDb250ZW50UHJvcG9zYWxQcm92aWRlciBjcmVhdGVDb250ZW50UHJvcG9zYWxQcm92aWRlcigpIHsKLQkJU2ltcGxlQ29udGVudFByb3Bvc2FsUHJvdmlkZXIgY29udFByb3ZpZGVyID0gbmV3IFNpbXBsZUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKEpQQUVkaXRvckNvbnN0YW50cy5QUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTKTsKLQkJY29udFByb3ZpZGVyLnNldEZpbHRlcmluZyh0cnVlKTsKLQkJCi0JCWNvbnRlbnRQcm9wb3NhbEFkYXB0ZXIgPSBuZXcgQ29udGVudFByb3Bvc2FsQWRhcHRlcigKLQkJCQl0ZXh0LAotCQkJCW5ldyBUZXh0Q29udGVudEFkYXB0ZXIoKSwgCi0JCQkJY29udFByb3ZpZGVyLAotCQkJCWtzLAotCQkJCW5ldyBjaGFyW10geydiJywgJ2MnLCAnZCcsICdpJywgJ2YnLCAnbCcsICdzJywgJ2onLCAnQicsICdDJywgJ0QnLCAnSScsICdGJywgJ0wnLCAnUycsICdKJ30pOwotCQljb250ZW50UHJvcG9zYWxBZGFwdGVyLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCWNvbnRlbnRQcm9wb3NhbEFkYXB0ZXIuc2V0UHJvcG9zYWxBY2NlcHRhbmNlU3R5bGUoQ29udGVudFByb3Bvc2FsQWRhcHRlci5QUk9QT1NBTF9SRVBMQUNFKTsKLQkJcmV0dXJuIGNvbnRQcm92aWRlcjsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0gICAgICAgIENvbXBvc2l0ZSBwYXJlbnRDb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgIEdyaWRMYXlvdXQgcm93TGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnRDb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICAgICAKLSAgICAgICAgR3JpZERhdGEgZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgICBkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgICAgICBkLmhlaWdodEhpbnQgPSA0MDA7Ci0gICAgICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGQpOwotICAgICAgICAKLSAJCXJvd0xheW91dC5tYXJnaW5MZWZ0ID0gNTsKLSAJCXJvd0xheW91dC5tYXJnaW5Ub3AgPSA1OwotIAkJcm93TGF5b3V0Lm1hcmdpblJpZ2h0ID0gNTsKLSAJCXJvd0xheW91dC5tYXJnaW5Cb3R0b20gPSAzMDsKLSAJCQotIAkJY29tcG9zaXRlLnNldExheW91dChyb3dMYXlvdXQpOwotCQljcmVhdGVMYWJlbChjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKDQwLDIwKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5CRUdJTk5JTkc7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWNyZWF0ZVRleHRGaWVsZChjb21wb3NpdGUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKDMwMCwgMTcpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBTV1QuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5DRU5URVI7Ci0JCXRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGV4dC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQlzZXREaWFsb2dDb21wbGV0ZSh2YWxpZGF0ZVBhZ2UoKSk7Ci0JCQl9CQkJCi0JCX0pOwotCQljcmVhdGVCcm93c2VCdG4oY29tcG9zaXRlKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgxMDAsIDI1KTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IFNXVC5UT1A7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5MRUZUOwotCQlkYXRhLm1pbmltdW1XaWR0aCA9IDgwOwotCQlicm93c2VCdXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsJCQotCQljcmVhdGVDb250ZW50UHJvcG9zYWxQcm92aWRlcigpOwotCQlyZXR1cm4gcGFyZW50Q29tcG9zaXRlOwotCX0KLQkKLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbnRyb2xzKCkgewotICAgICAgICBzZXRUaXRsZSh0aXRsZSk7Ci0gICAgICAgIHNldE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgIHRleHQuc2V0VGV4dCh0eXBlKTsKLSAgICAgICAgdGV4dC5zZXRTZWxlY3Rpb24oMCwgdHlwZS5sZW5ndGgoKSk7Ci0gICAgICAgIHNldERpYWxvZ0NvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgICB9CQotCQotICAgIHByb3RlY3RlZCB2b2lkIHNldERpYWxvZ0NvbXBsZXRlKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgdGhpcy5nZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0gICAgfQkKLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlTdHJpbmcgdHlwZSA9IHRleHQuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJaWYgKFN0cmluZ1Rvb2xzLnN0cmluZ0lzRW1wdHkodHlwZSkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShKUEFFZGl0b3JNZXNzYWdlcy5TZWxlY3RUeXBlRGlhbG9nX2VtcHR5VHlwZUVycm9yVGV4dCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJSVN0YXR1cyBzdGF0ID0gZ2V0U3RhdHVzKCk7Ci0JCWlmIChzdGF0LmlzT0soKSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0TWVzc2FnZShtZXNzYWdlLAlJTWVzc2FnZS5OT05FKTsKLQkJfSBlbHNlIHsgCi0JCQlzZXRNZXNzYWdlKHN0YXQuZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZS5FUlJPUik7Ci0JCX0KLQkJcmV0dXJuIChzdGF0LmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0gICAgCVN0cmluZyB0eXBlID0gdGV4dC5nZXRUZXh0KCkudHJpbSgpOwotICAgIAlTdHJpbmdbXSB0eXBlcyA9IHR5cGUuc3BsaXQoIls8PlxcW1xcXSxdIik7CQkvLyROT04tTkxTLTEkCi0gICAgCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAJCXR5cGUgPSB0eXBlc1tpXS50cmltKCk7Ci0JCQlJU3RhdHVzIHN0YXQgPSBKYXZhQ29udmVudGlvbnMudmFsaWRhdGVKYXZhVHlwZU5hbWUodHlwZSwgSmF2YUNvcmUuVkVSU0lPTl8xXzYsIEphdmFDb3JlLlZFUlNJT05fMV82KTsKLQkJCWJvb2xlYW4gaXNQcmltaXRpdmUgPSBKUEFFZGl0b3JDb25zdGFudHMuUFJJTUlUSVZFX1RZUEVTX0FORF9XUkFQUEVSU19TRVQuY29udGFpbnModHlwZSk7Ci0JCQlpZiAoaXNQcmltaXRpdmUgfHwgKHN0YXQuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SKSkKLQkJCQljb250aW51ZTsKLQkJCXJldHVybiBzdGF0OwotICAgIAl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9EaXNwbGF5RmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0Rpc3BsYXlGYWNhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjMWI4NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL0Rpc3BsYXlGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSURpc3BsYXlGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotcHVibGljIGNsYXNzIERpc3BsYXlGYWNhZGUgaW1wbGVtZW50cyBJRGlzcGxheUZhY2FkZSB7Ci0KLQlwdWJsaWMgdm9pZCBhc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpIHsKLQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvRWNsaXBzZUZhY2FkZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9FY2xpcHNlRmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWRlMGYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9FY2xpcHNlRmFjYWRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mYWNhZGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklEaXNwbGF5RmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSmF2YUNvcmVGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JU3RhdGljSURFOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUZhY2FkZSBpbXBsZW1lbnRzIElFY2xpcHNlRmFjYWRlIHsKLQotCXB1YmxpYyBzdGF0aWMgRWNsaXBzZUZhY2FkZSBJTlNUQU5DRSA9IG5ldyBFY2xpcHNlRmFjYWRlKCk7Ci0JCi0JcHJpdmF0ZSBFY2xpcHNlRmFjYWRlKCkgewotCX0KLQotCXB1YmxpYyBJSmF2YUNvcmVGYWNhZGUgZ2V0SmF2YUNvcmUoKSB7Ci0JCXJldHVybiBuZXcgSmF2YUNvcmVGYWNhZGUoKTsKLQl9Ci0KLQlwdWJsaWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHVibGljIElEaXNwbGF5RmFjYWRlIGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBuZXcgRGlzcGxheUZhY2FkZSgpOwotCX0KLQkKLQlwdWJsaWMgSVN0YXRpY0lERSBnZXRJREUoKSB7Ci0JCXJldHVybiBuZXcgU3RhdGljSURFKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9KYXZhQ29yZUZhY2FkZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9KYXZhQ29yZUZhY2FkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMwNjhlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mYWNhZGUvSmF2YUNvcmVGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSmF2YUNvcmVGYWNhZGU7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhQ29yZUZhY2FkZSBpbXBsZW1lbnRzIElKYXZhQ29yZUZhY2FkZSB7Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL1N0YXRpY0lERS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZhY2FkZS9TdGF0aWNJREUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiMzI1NC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmFjYWRlL1N0YXRpY0lERS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSVN0YXRpY0lERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0aWNJREUgaW1wbGVtZW50cyBJU3RhdGljSURFIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUKLQkgKiBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5wcm92aWRlci5JU3RhdGljSURFI29wZW5FZGl0b3Iob3JnLmVjbGlwc2UKLQkgKiAuY29yZS5yZXNvdXJjZXMuSUZpbGUpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbkVkaXRvcihJRmlsZSBmaWxlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQlJREUub3BlbkVkaXRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpCi0JCQkJLmdldEFjdGl2ZVBhZ2UoKSwgZmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRBbGxFbnRpdGllc0ZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNjYjdlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZHJhdzJkLmdlb21ldHJ5LlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kYXRhdHlwZXMuSURpbWVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JQWRkRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIGltcGxlbWVudHMgSUFkZEZlYXR1cmUgewotCi0JaW50W10gbG93ZXJFZGdlcyA9IG5ldyBpbnRbMjAwXTsgCi0JaW50IG51bUluQVJvdzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElTVF9GUk9NX0VER0VfSCA9IDUwOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBESVNUX0ZST01fRURHRV9WID0gNTA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IERJU1RfSCA9IDEwMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgRElTVF9WID0gMTAwOwotCQotCXB1YmxpYyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY3R4KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCURpYWdyYW0gZCA9IGdldERpYWdyYW0oKTsKLQkJSnBhUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgdW5pdCA9IHByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS4KLQkJCQkJCQkJZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQkKLQkJUG9pbnQgbG93ZXN0UmlnaHRlc3RQb2ludE9mRXhpc3RpbmdEaWFncmFtID0gZ2V0TG93ZXN0UmlnaHRlc3RQb2ludChkKTsKLQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKLQkJCWxvd2VyRWRnZXNbaV0gPSBsb3dlc3RSaWdodGVzdFBvaW50T2ZFeGlzdGluZ0RpYWdyYW0ueSArIAotCQkJCQkJCQkoKChpICUgMiA9PSAwKSA/IDEgOiAyKSAqIAotCQkJCQkJCQkoKGxvd2VzdFJpZ2h0ZXN0UG9pbnRPZkV4aXN0aW5nRGlhZ3JhbS55ID09IDApID8gCi0JCQkJCQkJCQlESVNUX0ZST01fRURHRV9WIDogCi0JCQkJCQkJCQlESVNUX1YpKTsKLQkJfQotCQlJRGltZW5zaW9uIGRpbSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtRWRpdG9yKCkuZ2V0Q3VycmVudFNpemUoKTsKLQkJaW50IGRXaWR0aCA9IGRpbS5nZXRXaWR0aCgpOwotCQludW1JbkFSb3cgPSAoZFdpZHRoIC0gRElTVF9GUk9NX0VER0VfSCAtIDIwICsgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9XSURUSCkvKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEggKyBESVNUX0gpOwotCQludW1JbkFSb3cgPSAobnVtSW5BUm93ID4gMCkgPyBudW1JbkFSb3cgOiAxOwotCQkKLQkJbG93ZXJFZGdlc1swXSA9IGxvd2VzdFJpZ2h0ZXN0UG9pbnRPZkV4aXN0aW5nRGlhZ3JhbS55ICsgKChsb3dlc3RSaWdodGVzdFBvaW50T2ZFeGlzdGluZ0RpYWdyYW0ueSA9PSAwKSA/IERJU1RfRlJPTV9FREdFX1YgOiBESVNUX1YpOwkJCi0JCQotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogdW5pdC5nZXRDbGFzc1JlZnMoKSkgewotCQkJaWYgKGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsgLy8gbnVsbCBpZgotCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBjbGFzc1JlZi5nZXRKYXZhUGVyc2lzdGVudFR5cGUoKTsgCi0JCQkJaWYgKGpwdC5nZXRNYXBwaW5nS2V5KCkgPT0gTWFwcGluZ0tleXMuRU5USVRZX1RZUEVfTUFQUElOR19LRVkpIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCQlpZiAocGUgIT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJZmluYWwgQWRkQ29udGV4dCBjdHggPSBuZXcgQWRkQ29udGV4dCgpOwotCQkJCQljdHguc2V0VGFyZ2V0Q29udGFpbmVyKGQpOwotCQkJCQljdHguc2V0TmV3T2JqZWN0KGpwdCk7Ci0JCQkJCQotCQkJCQlJbmRleEFuZExvd2VyRWRnZSBpZSA9IGdldE1pbkxvd2VyRWRnZSgpOwotCQkJCQkKLQkJCQkJaW50IHggPSBESVNUX0ZST01fRURHRV9IICsgaWUuaW5kZXggKiAoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9XSURUSCArIERJU1RfSCk7Ci0JCQkJCWN0eC5zZXRMb2NhdGlvbih4LCBpZS5sb3dlckVkZ2UpOwotCQkJCQlmaW5hbCBBZGRKUEFFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IEFkZEpQQUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJCQkKLQkJCQkJZmluYWwgRGlhZ3JhbSB0YXJnZXREaWFncmFtID0gKERpYWdyYW0pIGN0eC5nZXRUYXJnZXRDb250YWluZXIoKTsKLQkJCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4odGFyZ2V0RGlhZ3JhbSk7Ci0JCQkJCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCQkJZnQuYWRkKGN0eCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IChDb250YWluZXJTaGFwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJCQkJbG93ZXJFZGdlc1tpZS5pbmRleF0gPSBlbnRpdHlTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKSArIGVudGl0eVNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgKyBESVNUX1Y7Ci0JCQkJfQotCQkJfQotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSBJbmRleEFuZExvd2VyRWRnZSBnZXRNaW5Mb3dlckVkZ2UoKSB7Ci0JCUluZGV4QW5kTG93ZXJFZGdlIHJlcyA9IG5ldyBJbmRleEFuZExvd2VyRWRnZSgpOwotCQlyZXMubG93ZXJFZGdlID0gMTAwMDAwMDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtSW5BUm93OyBpKyspIHsKLQkJCWlmIChsb3dlckVkZ2VzW2ldIDwgcmVzLmxvd2VyRWRnZSkgewotCQkJCXJlcy5sb3dlckVkZ2UgPSBsb3dlckVkZ2VzW2ldOwotCQkJCXJlcy5pbmRleCA9IGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldFRhcmdldEpQQVByb2plY3QoKSB7Ci0JCXJldHVybiBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGdldERpYWdyYW0oKS5nZXROYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFBvaW50IGdldExvd2VzdFJpZ2h0ZXN0UG9pbnQoRGlhZ3JhbSBkKSB7IAotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSBkLmdldENoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlcy5pdGVyYXRvcigpOwotCQlpbnQgeCA9IDA7Ci0JCWludCB5ID0gMDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgc2ggPSBpdC5uZXh0KCk7Ci0JCQlpbnQgcmlnaHRFZGdlID0gc2guZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRYKCkgKyAKLQkJCQkJCQlzaC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFdpZHRoKCk7Ci0JCQl4ID0gTWF0aC5tYXgoeCwgcmlnaHRFZGdlKTsKLQkJCWludCBsb3dlckVkZ2UgPSBzaC5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKSArCi0JCQkJCQkJIHNoLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCk7Ci0JCQl5ID0gTWF0aC5tYXgoeSwgbG93ZXJFZGdlKTsKLQkJfQotCQl4ID0gTWF0aC5tYXgoeCwgMyAqIChESVNUX0ggKyBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRIKSk7Ci0JCXJldHVybiBuZXcgUG9pbnQoeCwgeSk7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJdGhpcy5leGVjdXRlKG5ldyBDdXN0b21Db250ZXh0KCkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJpdmF0ZSBjbGFzcyBJbmRleEFuZExvd2VyRWRnZSB7Ci0JCWludCBpbmRleDsKLQkJaW50IGxvd2VyRWRnZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEF0dHJpYnV0ZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEF0dHJpYnV0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkZDllOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUFkZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSURpcmVjdEVkaXRpbmdJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0QWRkU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLldycDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0QWRkU2hhcGVGZWF0dXJlIHsKLQotCXByaXZhdGUgSUFkZEZlYXR1cmUgZ3JhcGhpY2FsQWRkOwotCi0JcHJpdmF0ZSBJQ3VzdG9tRmVhdHVyZSBleHBhbmRDb21wYXJ0bWVudEZlYXR1cmU7Ci0KLQlwdWJsaWMgQWRkQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMoZnAsIG5ldyBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlKGZwKSwgbmV3IEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKGZwKSk7Ci0JfQotCi0JcHVibGljIEFkZEF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwgSUFkZEZlYXR1cmUgZ3JhcGhpY2FsQWRkLCBJQ3VzdG9tRmVhdHVyZSBleHBhbmRGZWF0dXJlKSB7Ci0JCXN1cGVyKGZwKTsKLQkJdGhpcy5ncmFwaGljYWxBZGQgPSBncmFwaGljYWxBZGQ7Ci0JCWV4cGFuZENvbXBhcnRtZW50RmVhdHVyZSA9IGV4cGFuZEZlYXR1cmU7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKGZpbmFsIElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJT2JqZWN0IG8gPSBjb250ZXh0LmdldE5ld09iamVjdCgpOwotCQlpZiAoIShvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBvOwotLy8JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChnZXRGZWF0dXJlUHJvdmlkZXIoKSwgKEphdmFQZXJzaXN0ZW50VHlwZSluZXdBdHRyLmdldFBhcmVudCgpKTsKLQotCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KGdldEZlYXR1cmVQcm92aWRlcigpLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KG5ld0F0dHIpLCBuZXdBdHRyKTsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChuZXdBdHRyKTsgCi0JCWlmIChwZSAhPSBudWxsKSAKLQkJCXJldHVybiBwZTsKLQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpKTsKLQkJZmluYWwgV3JwIHdycCA9IG5ldyBXcnAoKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJQ29udGFpbmVyU2hhcGUgdGV4dFNoYXBlID0gZ3JhcGhpY2FsQWRkKGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCksIG5ld0F0dHIpOwotCQkJCWV4cGFuZChuZXdBdHRyKTsKLQkJCQllbmFibGVEaXJlY3RBZnRlckFkZGluZyh0ZXh0U2hhcGUpOwotCQkJCXdycC5zZXRPYmoodGV4dFNoYXBlKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiAoUGljdG9ncmFtRWxlbWVudCl3cnAuZ2V0T2JqKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJQ29udGFpbmVyU2hhcGUgYXR0cmlidXRlU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcGEpOwotCi0JCUlDdXN0b21Db250ZXh0IGN1c3RvbUNvbnRleHQgPSBuZXcgQ3VzdG9tQ29udGV4dChuZXcgUGljdG9ncmFtRWxlbWVudFtdIHsgYXR0cmlidXRlU2hhcGUuZ2V0Q29udGFpbmVyKCkgfSk7Ci0JCWV4cGFuZENvbXBhcnRtZW50RmVhdHVyZS5leGVjdXRlKGN1c3RvbUNvbnRleHQpOwotCX0KLQotCXByaXZhdGUgQ29udGFpbmVyU2hhcGUgZ3JhcGhpY2FsQWRkKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBuZXdBdHRyKSB7Ci0JCUFkZENvbnRleHQgY29udGV4dCA9IG5ldyBBZGRDb250ZXh0KCk7Ci0JCWNvbnRleHQuc2V0TmV3T2JqZWN0KG5ld0F0dHIpOwotCQljb250ZXh0LnNldFRhcmdldENvbnRhaW5lcihlbnRpdHlTaGFwZSk7Ci0JCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZ3JhcGhpY2FsQWRkLmFkZChjb250ZXh0KTsKLQkJcmV0dXJuIHRleHRTaGFwZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5hYmxlRGlyZWN0QWZ0ZXJBZGRpbmcoQ29udGFpbmVyU2hhcGUgdGV4dFNoYXBlKSB7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gdGV4dFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCWZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtID0gZ2EuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLmdldCgwKTsKLQkJaWYgKGdyYXBoaWNzQWxnb3JpdGhtIGluc3RhbmNlb2YgVGV4dCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGdyYXBoaWNzQWxnb3JpdGhtOwotCQkJSURpcmVjdEVkaXRpbmdJbmZvIGRpcmVjdEVkaXRpbmdJbmZvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlyZWN0RWRpdGluZ0luZm8oKTsKLQkJCWRpcmVjdEVkaXRpbmdJbmZvLnNldE1haW5QaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0JCQlkaXJlY3RFZGl0aW5nSW5mby5zZXRQaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0JCQlkaXJlY3RFZGl0aW5nSW5mby5zZXRHcmFwaGljc0FsZ29yaXRobSh0ZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotCQlPYmplY3QgbyA9IGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCXJldHVybiBvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkSlBBRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQWRkSlBBRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGEwMGZlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZEpQQUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5MaW5lU3R5bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuT3JpZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudXRpbC5JUHJlZGVmaW5lZFJlbmRlcmluZ1N0eWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuUHJlZGVmaW5lZENvbG9yZWRBcmVhczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLlNvdXJjZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYXBwZWRTdXBlcmNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JQWRkRW50aXR5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5HcmFwaGljc1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncyh7ICJyZXN0cmljdGlvbiIgfSkKLXB1YmxpYyBjbGFzcyBBZGRKUEFFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RBZGRTaGFwZUZlYXR1cmUgewotCi0JcHJpdmF0ZSBJUGVVdGlsRmFjYWRlIGZhY2FkZTsKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGU7Ci0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZTsKLQlwcml2YXRlIHN0YXRpYyBDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlOwotCi0KLQlwdWJsaWMgQWRkSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQkJZmFjYWRlID0gbmV3IFBlVXRpbEZhY2FkZSgpOwotCX0KLQotCXB1YmxpYyBBZGRKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsIElQZVV0aWxGYWNhZGUgZmFjYWRlKSB7Ci0JCXN1cGVyKGZwKTsKLQkJdGhpcy5mYWNhZGUgPSBmYWNhZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJT2JqZWN0IG5ld09iaiA9IGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0KLQkJaWYgKG5ld09iaiBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJaWYgKGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaWFncmFtKSB7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG5ld09iajsKLQkJCQlyZXR1cm4gY2hlY2tKUFRGb3JBZGRpbmcoanB0KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlpZiAoY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpIG5ld09iajsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoY3UpOwotCQkJCXJldHVybiBjaGVja0pQVEZvckFkZGluZyhqcHQpOwotCQkJfQotCQl9IGlmIChuZXdPYmogaW5zdGFuY2VvZiBTb3VyY2VUeXBlKSB7Ci0JCQlpZiAoY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKChTb3VyY2VUeXBlKW5ld09iaikuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJCQlyZXR1cm4gY2hlY2tKUFRGb3JBZGRpbmcoanB0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrSlBURm9yQWRkaW5nKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJaWYgKGpwdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVBpY3RvZ3JhbUVsZW1lbnRbXSBwaWN0b2dyYW1zID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkKLQkJCQkuZ2V0QWxsUGljdG9ncmFtRWxlbWVudHNGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQlKcGFQcm9qZWN0IHByb2ogPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGdldERpYWdyYW0oKS5nZXROYW1lKCkpOwotCQlpZiAocHJvaiAhPSBudWxsKQotCQkJaWYgKHByb2ogIT0ganB0LmdldEpwYVByb2plY3QoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAocGljdG9ncmFtcyA9PSBudWxsKSB8fCAocGljdG9ncmFtcy5sZW5ndGggPT0gMCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBQaWN0b2dyYW1FbGVtZW50IGFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQkJT2JqZWN0IG5ld09iaiA9IGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBudWxsOwotCQlpZiAobmV3T2JqIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBuZXdPYmo7Ci0JCQlpZiAoanB0LmdldE1hcHBpbmcoKSBpbnN0YW5jZW9mIEphdmFNYXBwZWRTdXBlcmNsYXNzKSB7Ci0JCQkJanB0ID0gY3JlYXRlRW50aXR5RnJvbUV4aXN0aW5nTWFwcGVkU3VwZXJjbGFzcyhmcCwganB0KTsKLQkJCX0JCQkKLQkJfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBJQ29tcGlsYXRpb25Vbml0KSB7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gKElDb21waWxhdGlvblVuaXQpIG5ld09iajsKLQkJCWpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJCWlmIChqcHQuZ2V0TWFwcGluZygpIGluc3RhbmNlb2YgSmF2YU1hcHBlZFN1cGVyY2xhc3MpIHsKLQkJCQlqcHQgPSBjcmVhdGVFbnRpdHlGcm9tRXhpc3RpbmdNYXBwZWRTdXBlcmNsYXNzKGZwLCBqcHQpOwotCQkJfQotCi0JCX0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgU291cmNlVHlwZSkgewotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9ICgoU291cmNlVHlwZSluZXdPYmopLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJanB0ID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoY3UpOwotCQl9Ci0JCWZpbmFsIERpYWdyYW0gdGFyZ2V0RGlhZ3JhbSA9IChEaWFncmFtKSBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpOwotCQkJCQotCSAgICBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IGZhY2FkZS5jcmVhdGVDb250YWluZXJTaGFwZSh0YXJnZXREaWFncmFtLCB0cnVlKTsKLQkJCi0JCWNyZWF0ZUVudGl0eVJlY3RhbmdsZShjb250ZXh0LCBlbnRpdHlTaGFwZSwKLQkJCQkJCQkJdGhpcy5nZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLQkJbGluayhlbnRpdHlTaGFwZSwganB0KTsKLQkJU2hhcGUgc2hhcGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVTaGFwZShlbnRpdHlTaGFwZSwgZmFsc2UpOwotCQlQb2x5bGluZSBoZWFkZXJCb3R0b21MaW5lID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoc2hhcGUsIG5ldyBpbnRbXSB7IDAsCi0JCQkJMzAsIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfV0lEVEgsIDMwIH0pOwotCQloZWFkZXJCb3R0b21MaW5lCi0JCQkJLnNldEZvcmVncm91bmQobWFuYWdlQ29sb3IoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CT1JERVJfQ09MT1IpKTsKLQkJaGVhZGVyQm90dG9tTGluZS5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9CT1JERVJfV0lEVEgpOwotCi0JCWFkZEhlYWRlcihqcHQsIGVudGl0eVNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRIKTsKLQkJCi0JCWNyZWF0ZUNvbXBhcnRtZW50cyhjb250ZXh0LCBqcHQsIGVudGl0eVNoYXBlKTsKLQkJZmlsbENvbXBhcnRtZW50cyhqcHQsZW50aXR5U2hhcGUpOwotCQkKLQkJU3RyaW5nIGtleSA9IGZwLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWlmIChmcC5nZXRCdXNpbmVzc09iamVjdEZvcktleShrZXkpID09IG51bGwpCi0JCQlmcC5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KGtleSwganB0KTsKLQotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDaG9wYm94QW5jaG9yKGVudGl0eVNoYXBlKTsKLQkJZW50aXR5U2hhcGUuc2V0VmlzaWJsZSh0cnVlKTsKLQkJbGF5b3V0UGljdG9ncmFtRWxlbWVudChlbnRpdHlTaGFwZSk7Ci0KLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSB1cGRhdGVGZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZnApOwotCQl1cGRhdGVGZWF0dXJlLnJlY29ubmVjdChqcHQpOwotCQotCQlyZXR1cm4gZW50aXR5U2hhcGU7Ci0JfQotCi0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudFR5cGUgY3JlYXRlRW50aXR5RnJvbUV4aXN0aW5nTWFwcGVkU3VwZXJjbGFzcygKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSUNyZWF0ZUNvbnRleHQgY29udCA9IG5ldyBDcmVhdGVDb250ZXh0KCk7Ci0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYWNrYWdlTmFtZSA9IGdldE1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlRGVjbGFyYXRpb24oZnAsIGpwdCwKLQkJCQkJcGFja2FnZU5hbWUpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihlKTsgCSAgICAgCQkJCQkKLQkJfQotCi0JCWJvb2xlYW4gaGFzUHJpbWFyeUtleSA9IGhhc01hcHBlZFN1cGVyY2xhc3NQcmltYXJ5S2V5QXR0cmlidXRlKGpwdCk7Ci0KLQkJQ3JlYXRlSlBBRW50aXR5RmVhdHVyZSBjcmVhdGVGZWF0dXJlID0gbmV3IENyZWF0ZUpQQUVudGl0eUZlYXR1cmUoZnAsCi0JCQkJdHJ1ZSwganB0LmdldE5hbWUoKSwgcGFja2FnZU5hbWUsIGhhc1ByaW1hcnlLZXkpOwotCQlPYmplY3RbXSBvYmplY3RzID0gY3JlYXRlRmVhdHVyZS5jcmVhdGUoY29udCk7Ci0JCWlmIChvYmplY3RzLmxlbmd0aCAhPSAwKSB7Ci0JCQlPYmplY3Qgb2JqID0gb2JqZWN0c1swXTsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBvYmo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGpwdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTWFwcGVkU3VwZXJjbGFzc1ByaW1hcnlLZXlBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCQotCQlmb3IgKEF0dHJpYnV0ZU1hcHBpbmcgbWFwIDogKChKYXZhTWFwcGVkU3VwZXJjbGFzcykganB0LmdldE1hcHBpbmcoKSkuZ2V0QWxsQXR0cmlidXRlTWFwcGluZ3MoKSkgewotCQkJaWYgKG1hcC5nZXRQcmltYXJ5S2V5Q29sdW1uTmFtZSgpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TWFwcGVkU3VwZXJjbGFzc1BhY2thZ2VEZWNsYXJhdGlvbigKLQkJCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJUGFja2FnZURlY2xhcmF0aW9uW10gcGFja2FnZXMgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KQotCQkJCS5nZXRQYWNrYWdlRGVjbGFyYXRpb25zKCk7Ci0JCWlmIChwYWNrYWdlcy5sZW5ndGggPiAwKSB7Ci0JCQlJUGFja2FnZURlY2xhcmF0aW9uIHBhY2thZ2VEZWNsID0gcGFja2FnZXNbMF07Ci0JCQlwYWNrYWdlTmFtZSA9IHBhY2thZ2VEZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuIHBhY2thZ2VOYW1lOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29tcGFydG1lbnRzKElBZGRDb250ZXh0IGNvbnRleHQsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSkgewotCQlwcmltYXJ5U2hhcGUgPSBjcmVhdGVDb21wYXJ0bWVudFJlY3RhbmdsZShlbnRpdHlTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hULCBKUEFFZGl0b3JNZXNzYWdlcy5BZGRKUEFFbnRpdHlGZWF0dXJlX3ByaW1hcnlLZXlzU2hhcGUpOwotCQlyZWxhdGlvblNoYXBlID0gY3JlYXRlQ29tcGFydG1lbnRSZWN0YW5nbGUoZW50aXR5U2hhcGUsIEdyYXBoaWNzVXBkYXRlci5nZXROZXh0Q29tcGFydG1lbnRZKHByaW1hcnlTaGFwZSkgKyBKUEFFZGl0b3JDb25zdGFudHMuU0VQQVJBVE9SX0hFSUdIVCwKLQkJCQkgSlBBRWRpdG9yTWVzc2FnZXMuQWRkSlBBRW50aXR5RmVhdHVyZV9yZWxhdGlvbkF0dHJpYnV0ZXNTaGFwZXMpOwotCQliYXNpY1NoYXBlID0gY3JlYXRlQ29tcGFydG1lbnRSZWN0YW5nbGUoZW50aXR5U2hhcGUsIEdyYXBoaWNzVXBkYXRlci5nZXROZXh0Q29tcGFydG1lbnRZKHJlbGF0aW9uU2hhcGUpICsgSlBBRWRpdG9yQ29uc3RhbnRzLlNFUEFSQVRPUl9IRUlHSFQsIEpQQUVkaXRvck1lc3NhZ2VzLkFkZEpQQUVudGl0eUZlYXR1cmVfYmFzaWNBdHRyaWJ1dGVzU2hhcGVzKTsKLQkJaWYgKElBZGRFbnRpdHlDb250ZXh0LmNsYXNzLmlzSW5zdGFuY2UoY29udGV4dCkpIHsKLQkJCUlBZGRFbnRpdHlDb250ZXh0IGVudGl0eUNvbnRleHQgPSAoSUFkZEVudGl0eUNvbnRleHQpIGNvbnRleHQ7Ci0JCQlHcmFwaGljc1VwZGF0ZXIuc2V0Q29sbGFwc2VkKHByaW1hcnlTaGFwZSwgZW50aXR5Q29udGV4dC5pc1ByaW1hcnlDb2xsYXBzZWQoKSk7Ci0JCQlHcmFwaGljc1VwZGF0ZXIuc2V0Q29sbGFwc2VkKGJhc2ljU2hhcGUsIGVudGl0eUNvbnRleHQuaXNCYXNpY0NvbGxhcHNlZCgpKTsKLQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQocmVsYXRpb25TaGFwZSwgZW50aXR5Q29udGV4dC5pc1JlbGF0aW9uQ29sbGFwc2VkKCkpOwotCQl9IGVsc2UgewotCQkJR3JhcGhpY3NVcGRhdGVyLnNldENvbGxhcHNlZChwcmltYXJ5U2hhcGUsIGZhbHNlKTsKLQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoYmFzaWNTaGFwZSwgZmFsc2UpOwotCQkJR3JhcGhpY3NVcGRhdGVyLnNldENvbGxhcHNlZChyZWxhdGlvblNoYXBlLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbXBhcnRtZW50cyhKYXZhUGVyc2lzdGVudFR5cGUganB0LCBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSkgewotCQlTdHJpbmdbXSBwcmltYXJ5S2V5QW5ub3RhdGlvbnMgPSBuZXcgU3RyaW5nW10ge0pQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lELCBKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9FTUJFRERFRF9JRH07Ci0JCWZvcihTdHJpbmcgYW5ub3RhdGlvbiA6IHByaW1hcnlLZXlBbm5vdGF0aW9ucyl7Ci0JCQlhZGRDb21wYXJ0bWVudENoaWxkcmVuKHByaW1hcnlTaGFwZSwganB0LCBhbm5vdGF0aW9uKTsKLQkJfQotCQlTdHJpbmdbXSByZWxhdGlvbkFubm90YXRpb25zID0gbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlksIAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FLCBKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FfTsKLQkgICAgZm9yKFN0cmluZyBhbm5vdGF0aW9uIDogcmVsYXRpb25Bbm5vdGF0aW9ucyl7Ci0JCSAgIGFkZENvbXBhcnRtZW50Q2hpbGRyZW4ocmVsYXRpb25TaGFwZSwganB0LCBhbm5vdGF0aW9uKTsKLQkgICAgfQotICAgICAgICBhZGRCYXNpY0F0dHJpYnV0ZXMoYmFzaWNTaGFwZSwganB0KTsKLSAgICAgICAgR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUVudGl0eVNoYXBlKGVudGl0eVNoYXBlKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGNyZWF0ZUNvbXBhcnRtZW50UmVjdGFuZ2xlKAotCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIGludCB5LCBTdHJpbmcgYXR0cmliVHh0KSB7Ci0JCWludCB3aWR0aCA9IGVudGl0eVNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0V2lkdGgoKTsKLQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb250YWluZXJTaGFwZSgKLQkJCQllbnRpdHlTaGFwZSwgZmFsc2UpOwotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lclNoYXBlLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUsIFNoYXBlVHlwZS5DT01QQVJUTUVOVAotCQkJCQkJLnRvU3RyaW5nKCkpOwotCQlSZWN0YW5nbGUgcmVjdCA9IGFkZENvbXBhcnRtZW50UmVjdGFuZ2xlKHksIHdpZHRoLCBjb250YWluZXJTaGFwZSk7Ci0JCQotCQlhZGRDb21wYXJ0bWVudEhlYWRlclRleHQoYXR0cmliVHh0LCB3aWR0aCwgcmVjdCk7Ci0JCQotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIHVwZGF0ZUZlYXR1cmUgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQotCQl1cGRhdGVGZWF0dXJlLmFkZFNlcGFyYXRvcnNUb1NoYXBlKGNvbnRhaW5lclNoYXBlKTsKLQkJCi0JCXJldHVybiBjb250YWluZXJTaGFwZTsKLQl9Ci0KLQlwcml2YXRlIFJlY3RhbmdsZSBhZGRDb21wYXJ0bWVudFJlY3RhbmdsZShpbnQgeSwgaW50IHdpZHRoLAotCQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSZWN0YW5nbGUoY29udGFpbmVyU2hhcGUpOwotCQlyZWN0LnNldEZpbGxlZChmYWxzZSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoZmFsc2UpOwotCQlyZWN0LnNldEhlaWdodCgwKTsKLQkJcmVjdC5zZXRXaWR0aCh3aWR0aCk7Ci0JCXJlY3Quc2V0WCgwKTsKLQkJcmVjdC5zZXRZKHkpOwotCQljb250YWluZXJTaGFwZS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCXJldHVybiByZWN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb21wYXJ0bWVudEhlYWRlclRleHQoU3RyaW5nIGF0dHJpYlR4dCwgaW50IHdpZHRoLAotCQkJUmVjdGFuZ2xlIHJlY3QpIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlUZXh0IHRleHQgPSBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmFkZFRleHQoZnAsIHJlY3QsIGF0dHJpYlR4dCk7Ci0JCXRleHQuZ2V0Rm9udCgpLnNldFNpemUoNyk7Ci0JCXRleHQuZ2V0Rm9udCgpLnNldEl0YWxpYyh0cnVlKTsKLQkJdGV4dC5nZXRGb250KCkuc2V0Qm9sZChmYWxzZSk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKHRleHQsIHdpZHRoKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKHRleHQsIDAsIDIsIHdpZHRoLAotCQkJCTEzKTsKLQkJdGV4dC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KE9yaWVudGF0aW9uLkFMSUdOTUVOVF9DRU5URVIpOwotCQl0ZXh0LnNldFZlcnRpY2FsQWxpZ25tZW50KE9yaWVudGF0aW9uLkFMSUdOTUVOVF9DRU5URVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRDb21wYXJ0bWVudENoaWxkcmVuKAotCQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlTdHJpbmcgYXR0cmlidXRlQW5ub3RhdGlvbnMpIHsKLQkJTGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0KLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBqcHQuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlIYXNoU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMoYXR0cmlidXRlKTsKLQkJCWlmIChhbm5vdGF0aW9ucy5jb250YWlucyhhdHRyaWJ1dGVBbm5vdGF0aW9ucykpIHsKLQkJCQlhdHRyaWJ1dGVzLmFkZChhdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JCWFkZEF0dHJpYnV0ZXMoY29udGFpbmVyU2hhcGUsIGF0dHJpYnV0ZXMpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkQmFzaWNBdHRyaWJ1dGVzKENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLCBKYXZhUGVyc2lzdGVudFR5cGUganB0KXsKLQkJTGlzdDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCQotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGpwdC5nZXRBdHRyaWJ1dGVzKCkpewotCQkJSGFzaFNldDxTdHJpbmc+IGFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKGF0dHJpYnV0ZSk7Ci0JCQlpZighKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lEKSkmJiAhKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0VNQkVEREVEX0lEKSkgJiYgIShhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpKSAmJiAKLQkJCQkJIShhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkpICYmICEoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpKSYmCi0JCQkJCSEoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX09ORSkpIHx8IGFubm90YXRpb25zLmlzRW1wdHkoKSl7Ci0JCQkJYXR0cmlidXRlcy5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQlhZGRBdHRyaWJ1dGVzKGNvbnRhaW5lclNoYXBlLCBhdHRyaWJ1dGVzKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZXMoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsCi0JCQlMaXN0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBhdHRyaWJ1dGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5zaXplKCk7IGkrKykgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gYXR0cmlidXRlcy5nZXQoaSk7Ci0JCQlhZGRBdHRyaWJ1dGUoanBhLCBlbnRpdHlTaGFwZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElQZVV0aWxGYWNhZGUgewotCQlwdWJsaWMgQ29udGFpbmVyU2hhcGUgY3JlYXRlQ29udGFpbmVyU2hhcGUoRGlhZ3JhbSBkaWFncmFtLCBib29sZWFuIGIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUm91bmRlZFJlY3RhbmdsZSBjcmVhdGVFbnRpdHlSZWN0YW5nbGUoSUFkZENvbnRleHQgY29udGV4dCwKLQkJCUNvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCBEaWFncmFtIGRpYWdyYW0pIHsKLQotCQlSb3VuZGVkUmVjdGFuZ2xlIGVudGl0eVJlY3RhbmdsZSA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVJvdW5kZWRSZWN0YW5nbGUoCi0JCQkJZW50aXR5U2hhcGUsIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQ09STkVSX1dJRFRILAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQ09STkVSX0hFSUdIVCk7Ci0JCWVudGl0eVJlY3RhbmdsZQotCQkJCS5zZXRGb3JlZ3JvdW5kKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGRpYWdyYW0sIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQk9SREVSX0NPTE9SKSk7Ci0JCWVudGl0eVJlY3RhbmdsZQotCQkJCS5zZXRCYWNrZ3JvdW5kKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGRpYWdyYW0sIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQkFDS0dST1VORCkpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRSZW5kZXJpbmdTdHlsZShlbnRpdHlSZWN0YW5nbGUuZ2V0UGljdG9ncmFtRWxlbWVudCgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksIAotCQkJCVByZWRlZmluZWRDb2xvcmVkQXJlYXMuZ2V0QWRhcHRlZEdyYWRpZW50Q29sb3JlZEFyZWFzKElQcmVkZWZpbmVkUmVuZGVyaW5nU3R5bGUuQkxVRV9XSElURV9HTE9TU19JRCkpOwotCQllbnRpdHlSZWN0YW5nbGUuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQk9SREVSX1dJRFRIKTsKLQkJZW50aXR5UmVjdGFuZ2xlLnNldExpbmVTdHlsZShMaW5lU3R5bGUuU09MSUQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbkFuZFNpemUoZW50aXR5UmVjdGFuZ2xlLCBjb250ZXh0Ci0JCQkJLmdldFgoKSwgY29udGV4dC5nZXRZKCksCi0JCQkJKGNvbnRleHQuZ2V0V2lkdGgoKSA9PSAtMSkgPyBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRICi0JCQkJCQk6IGNvbnRleHQuZ2V0V2lkdGgoKSwKLQkJCQkoY29udGV4dC5nZXRIZWlnaHQoKSA9PSAtMSkgPyBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0hFSUdIVAotCQkJCQkJOiBjb250ZXh0LmdldEhlaWdodCgpKTsKLQkJcmV0dXJuIGVudGl0eVJlY3RhbmdsZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBQZVV0aWxGYWNhZGUgaW1wbGVtZW50cyBJUGVVdGlsRmFjYWRlIHsKLQkJcHVibGljIENvbnRhaW5lclNoYXBlIGNyZWF0ZUNvbnRhaW5lclNoYXBlKERpYWdyYW0gZGlhZ3JhbSwgYm9vbGVhbiBiKSB7Ci0JCQlyZXR1cm4gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29udGFpbmVyU2hhcGUoZGlhZ3JhbSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEhlYWRlcihKYXZhUGVyc2lzdGVudFR5cGUgYWRkZWRXcmFwcGVyLAotCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIGludCB3aWR0aCkgewotCi0JCUNvbnRhaW5lclNoYXBlIGhlYWRlckljb25TaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbnRhaW5lclNoYXBlKAotCQkJCWVudGl0eVNoYXBlLCBmYWxzZSk7Ci0JCVJlY3RhbmdsZSBpY29uUmVjdCA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVJlY3RhbmdsZShoZWFkZXJJY29uU2hhcGUpOwotCQlpY29uUmVjdC5zZXRGaWxsZWQoZmFsc2UpOwotCQlpY29uUmVjdC5zZXRMaW5lVmlzaWJsZShmYWxzZSk7Ci0JCWljb25SZWN0LnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9SRUNUX0hFSUdIVCk7Ci0JCWljb25SZWN0LnNldFgoMCk7Ci0JCWljb25SZWN0LnNldFdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfSUNPTl9SRUNUX1dJRFRIKTsKLQkJaWNvblJlY3Quc2V0SGVpZ2h0KEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfSUNPTl9SRUNUX0hFSUdIVCk7Ci0JCWljb25SZWN0LnNldFkoMCk7Ci0JCUltYWdlIGhlYWRlckljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwKLQkJCQlKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLkpQQV9FTlRJVFkpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbkFuZFNpemUoaGVhZGVySWNvbiwgCi0JCQkJCQkJCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fSEVBREVSX1gsCi0JCQkJCQkJCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fSEVBREVSX1ksCi0JCQkJCQkJCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fV0lEVEgsIAotCQkJCQkJCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5JQ09OX0hFSUdIVCk7Ci0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoaGVhZGVySWNvblNoYXBlLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUsIFNoYXBlVHlwZS5JQ09OLnRvU3RyaW5nKCkpOwotCi0JCUNvbnRhaW5lclNoYXBlIGVudGl0eUhlYWRlclRleHRTaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbnRhaW5lclNoYXBlKGVudGl0eVNoYXBlLCBmYWxzZSk7Ci0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpCi0JCQkJLnNldFByb3BlcnR5VmFsdWUoZW50aXR5SGVhZGVyVGV4dFNoYXBlLAotCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSwgU2hhcGVUeXBlLkhFQURFUgotCQkJCQkJCQkudG9TdHJpbmcoKSk7Ci0JCVJlY3RhbmdsZSBoZWFkZXJSZWN0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUmVjdGFuZ2xlKGVudGl0eUhlYWRlclRleHRTaGFwZSk7Ci0JCWhlYWRlclJlY3Quc2V0RmlsbGVkKGZhbHNlKTsKLQkJaGVhZGVyUmVjdC5zZXRMaW5lVmlzaWJsZShmYWxzZSk7Ci0JCWhlYWRlclJlY3Quc2V0V2lkdGgod2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQkJaGVhZGVyUmVjdC5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9URVhUX1JFQ1RfSEVJR0hUKTsKLQkJaGVhZGVyUmVjdC5zZXRZKDIpOwotCQloZWFkZXJSZWN0LnNldFgoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9URVhUX1JFQ1RfWCk7Ci0KLQkJU3RyaW5nIGhlYWRlclRleHRTdHJpbmcgPSBKUEFFZGl0b3JVdGlsLmdldFRleHQoYWRkZWRXcmFwcGVyKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChhZGRlZFdyYXBwZXIpOwotCQlKUEFFZGl0b3JVdGlsLmJlY29tZVdvcmtpbmdDb3B5KGN1KTsKLQkJaGVhZGVyVGV4dFN0cmluZyA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShoZWFkZXJUZXh0U3RyaW5nKTsgCi0JCXRyeSB7Ci0JCQlpZiAoY3UuaGFzVW5zYXZlZENoYW5nZXMoKSkgewotCQkJCWhlYWRlclRleHRTdHJpbmcgPSBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1BSRUZJWF9ESVJUWSArIGhlYWRlclRleHRTdHJpbmc7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7IAotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IGNoZWNrIGNvbXBpbGF0aW9uIHVuaXQgZm9yIHVuc2F2ZWQgY2hhbmdlcyIsIGUpOyAgLy8kTk9OLU5MUy0xJAkJIAotCQl9Ci0JCVRleHQgaGVhZGVyVGV4dE9iaiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZURlZmF1bHRUZXh0KGdldERpYWdyYW0oKSwgaGVhZGVyUmVjdCwKLQkJCQloZWFkZXJUZXh0U3RyaW5nKTsKLQkJaGVhZGVyVGV4dE9iagotCQkJCS5zZXRGb3JlZ3JvdW5kKG1hbmFnZUNvbG9yKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfVEVYVF9GT1JFR1JPVU5EKSk7Ci0JCWhlYWRlclRleHRPYmouc2V0SG9yaXpvbnRhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfTEVGVCk7Ci0JCWhlYWRlclRleHRPYmouc2V0VmVydGljYWxBbGlnbm1lbnQoT3JpZW50YXRpb24uQUxJR05NRU5UX1RPUCk7Ci0JCWhlYWRlclRleHRPYmouZ2V0Rm9udCgpLnNldEJvbGQodHJ1ZSk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uQW5kU2l6ZShoZWFkZXJUZXh0T2JqLCAxLCAyLAotCQkJCXdpZHRoLCAyMCk7Ci0KLQkJcmV0dXJuIGVudGl0eUhlYWRlclRleHRTaGFwZTsKLQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIGFkZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwYSwKLQkJCUNvbnRhaW5lclNoYXBlIGNvbXBhcnRtZW50U2hhcGUpIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlmcC5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KGZwLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KHBhKSwgcGEpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlwYS5nZXRQYXJlbnQoKTsKLQkJU3RyaW5nIGtleSA9IGZwLmdldEtleUZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWlmIChmcC5nZXRCdXNpbmVzc09iamVjdEZvcktleShrZXkpID09IG51bGwpCi0JCQlmcC5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KGtleSwganB0KTsKLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSB1cGRhdGVGZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZnApOwotICAgICAgICB1cGRhdGVGZWF0dXJlLmFkZEF0dHJpYnV0ZXMoY29tcGFydG1lbnRTaGFwZS5nZXRDb250YWluZXIoKSwgcGEpOwotCQl1cGRhdGVGZWF0dXJlID0gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9BZGRSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZFJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGM2MmRiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0FkZFJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxEaXIuVU5JOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGUuTUFOWV9UT19NQU5ZOwotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGUuTUFOWV9UT19PTkU7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZS5PTkVfVE9fTUFOWTsKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlLk9ORV9UT19PTkU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUFkZEJlbmRwb2ludEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRCZW5kcG9pbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3RBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JJbWFnZUNyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxEaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5XcnA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi0KLXB1YmxpYyBjbGFzcyBBZGRSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEFkZEZlYXR1cmUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBTVEFSVF9DT0VGRklDSUVOVCA9IDAuMTsKLQotCXByaXZhdGUgSUpQQUVkaXRvckltYWdlQ3JlYXRvciBpbWFnZUNyZWF0b3I7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yVXRpbCBqcGFFZGl0b3JVdGlsOyAKLQotICAgIHB1YmxpYyBBZGRSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQl0aGlzKGZwLCBuZXcgSlBBRWRpdG9ySW1hZ2VDcmVhdG9yKCksIG5ldyBKUEFFZGl0b3JVdGlsSW1wbCgpKTsKLQl9Ci0KLQlwdWJsaWMgQWRkUmVsYXRpb25GZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsIAotCQkJCQkJCSAgSUpQQUVkaXRvckltYWdlQ3JlYXRvciBpbWFnZUNyZWF0b3IsIAotCQkJCQkJCSAgSUpQQUVkaXRvclV0aWwganBhRWRpdG9yVXRpbCkgewotICAgICAgICBzdXBlcihmcCk7Ci0JCXRoaXMuaW1hZ2VDcmVhdG9yID0gaW1hZ2VDcmVhdG9yOwotCQl0aGlzLmpwYUVkaXRvclV0aWwgPSBqcGFFZGl0b3JVdGlsOwotICAgIH0KLSAKLSAgICBwdWJsaWMgUGljdG9ncmFtRWxlbWVudCBhZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBmaW5hbCBJQWRkQ29ubmVjdGlvbkNvbnRleHQgYWRkQ29uQ29udGV4dCA9IChJQWRkQ29ubmVjdGlvbkNvbnRleHQpIGNvbnRleHQ7Ci0JCWZpbmFsIElSZWxhdGlvbiByZWxhdGlvbiA9IChJUmVsYXRpb24pIGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJZmluYWwgV3JwIHdycCA9IG5ldyBXcnAoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCVJlY29yZGluZ0NvbW1hbmQgcmMgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlGcmVlRm9ybUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oYWRkQ29uQ29udGV4dCwgcmVsYXRpb24sIGRpYWdyYW0pOwotCQkJCWltYWdlQ3JlYXRvci5jcmVhdGVDb25uZWN0aW9uTGluZShkaWFncmFtLCBjb25uZWN0aW9uKTsKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5wdXRLZXlUb0J1c2luZXNzT2JqZWN0KHJlbGF0aW9uLmdldElkKCksIHJlbGF0aW9uKTsKLQkJCQlsaW5rKGNvbm5lY3Rpb24sIHJlbGF0aW9uKTsKLQkJCQlsYXlvdXRQaWN0b2dyYW1FbGVtZW50KGNvbm5lY3Rpb24pOwotCQkJCXdycC5zZXRPYmooY29ubmVjdGlvbik7Ci0JCQl9CQkJCi0JCX07Ci0JCXRyeSB7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKHJjKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpewotCQkKLQkJfQotCQkKLQkJcmV0dXJuIChQaWN0b2dyYW1FbGVtZW50KXdycC5nZXRPYmooKTsKLSAgICB9Ci0gICAgICAgIAotCXByaXZhdGUgRnJlZUZvcm1Db25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24oSUFkZENvbm5lY3Rpb25Db250ZXh0IGFkZENvbkNvbnRleHQsIElSZWxhdGlvbiByZWxhdGlvbiwKLQkJCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSkgewotICAgICAgICBGcmVlRm9ybUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBlVXRpbCgpLmNyZWF0ZUZyZWVGb3JtQ29ubmVjdGlvbihkaWFncmFtKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRTdGFydChhZGRDb25Db250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRFbmQoYWRkQ29uQ29udGV4dC5nZXRUYXJnZXRBbmNob3IoKSk7Ci0gICAgICAgIGNvbm5lY3Rpb24uc2V0VmlzaWJsZSh0cnVlKTsKLSAgICAgICAgY29ubmVjdGlvbi5zZXRBY3RpdmUodHJ1ZSk7ICAgICAgICAKLSAgICAgICAgTGlzdDxQb2ludD4gcG9pbnRzID0ganBhRWRpdG9yVXRpbC5jcmVhdGVCZW5kUG9pbnRMaXN0KGNvbm5lY3Rpb24sIHJlbGF0aW9uLmdldE93bmVyKCkgPT0gcmVsYXRpb24uZ2V0SW52ZXJzZSgpKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgCVBvaW50IHAgPSBwb2ludHMuZ2V0KGkpOwotICAgICAgICAJQWRkQmVuZHBvaW50Q29udGV4dCBjdHggPSBuZXcgQWRkQmVuZHBvaW50Q29udGV4dChjb25uZWN0aW9uLCBwLngsIHAueSwgaSk7Ci0gICAgICAgICAgICBJQWRkQmVuZHBvaW50RmVhdHVyZSBmdCA9Z2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QWRkQmVuZHBvaW50RmVhdHVyZShjdHgpOwotICAgICAgICAgICAgZnQuYWRkQmVuZHBvaW50KGN0eCk7Ci0gICAgICAgIH0JCQotICAgICAgICBhZGREZWNvcmF0b3JzKGNvbm5lY3Rpb24sIHJlbGF0aW9uKTsgCi0gICAgICAgIGFkZFRleHREZWNvcmF0b3JzKGNvbm5lY3Rpb24sIHJlbGF0aW9uKTsKLQkJcmV0dXJuIGNvbm5lY3Rpb247Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZERlY29yYXRvcnMoRnJlZUZvcm1Db25uZWN0aW9uIGNvbm5lY3Rpb24sIElSZWxhdGlvbiByZWxhdGlvbikgewotCQlSZWxEaXIgZGlyZWN0aW9uID0gcmVsYXRpb24uZ2V0UmVsRGlyKCk7Ci0JCVJlbFR5cGUgdHlwZSA9IHJlbGF0aW9uLmdldFJlbFR5cGUoKTsKLQkJaWYgKE9ORV9UT19PTkUuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGRPbmVUb09uZURlY29yYXRvcihjb25uZWN0aW9uLCBkaXJlY3Rpb24sIHJlbGF0aW9uKTsKLQkJfSBlbHNlIGlmIChPTkVfVE9fTUFOWS5lcXVhbHModHlwZSkgJiYgVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlhZGRPbmVUb01hbnlEZWNvcmF0b3IoY29ubmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE1BTllfVE9fT05FLmVxdWFscyh0eXBlKSkgewotCQkJYWRkTWFueVRvT25lRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGRpcmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE1BTllfVE9fTUFOWS5lcXVhbHModHlwZSkpIHsKLQkJCWFkZE1hbnlUb01hbnlEZWNvcmF0b3IoY29ubmVjdGlvbiwgZGlyZWN0aW9uLCByZWxhdGlvbik7Ci0JCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFRleHREZWNvcmF0b3JzKEZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBJUmVsYXRpb24gcmVsYXRpb24pIHsKLQkJUmVsRGlyIGRpcmVjdGlvbiA9IHJlbGF0aW9uLmdldFJlbERpcigpOwotCQlSZWxUeXBlIHR5cGUgPSByZWxhdGlvbi5nZXRSZWxUeXBlKCk7Ci0JCWlmIChPTkVfVE9fT05FLmVxdWFscyh0eXBlKSkgewotCQkJYWRkT25lVG9PbmVUZXh0RGVjb3JhdG9yKGNvbm5lY3Rpb24sIGRpcmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE9ORV9UT19NQU5ZLmVxdWFscyh0eXBlKSAmJiBVTkkuZXF1YWxzKGRpcmVjdGlvbikpIHsKLQkJCWFkZE9uZVRvTWFueVRleHREZWNvcmF0b3IoY29ubmVjdGlvbiwgcmVsYXRpb24pOwotCQl9IGVsc2UgaWYgKE1BTllfVE9fT05FLmVxdWFscyh0eXBlKSkgewotCQkJYWRkTWFueVRvT25lVGV4dERlY29yYXRvcihjb25uZWN0aW9uLCBkaXJlY3Rpb24sIHJlbGF0aW9uKTsKLQkJfSBlbHNlIGlmIChNQU5ZX1RPX01BTlkuZXF1YWxzKHR5cGUpKSB7Ci0JCQlhZGRNYW55VG9NYW55VGV4dERlY29yYXRvcihjb25uZWN0aW9uLCBkaXJlY3Rpb24sIHJlbGF0aW9uKTsKLQkJfQotCX0JCi0KLQotCXByaXZhdGUgdm9pZCBhZGRPbmVUb09uZURlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgUmVsRGlyIGRpcmVjdGlvbiwgSVJlbGF0aW9uIHJlbCkgewotCQlkb3VibGUgc3RhcnRDb2VmZmljaWVudCA9IFNUQVJUX0NPRUZGSUNJRU5UOwotCQlkb3VibGUgZW5kQ29lZmZpY2llbnQgPSAxLjAgLSBzdGFydENvZWZmaWNpZW50OwkKLQkJaW50IGxlbiA9IEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7CQkKLQkJaWYgKFVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJQ29ubmVjdGlvbkRlY29yYXRvciBkID0gaW1hZ2VDcmVhdG9yLmNyZWF0ZUFycm93Q29ubmVjdGlvbkRlY29yYXRvcihjLCBlbmRDb2VmZmljaWVudCk7Ci0JCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksTWF0aC5yb3VuZCgtbGVuLzEwKSwgMCk7CQkJCQotCQl9IAotCX0KLSAgICAgICAgCi0JcHJpdmF0ZSB2b2lkIGFkZE9uZVRvTWFueURlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgSVJlbGF0aW9uIHJlbCkgewotCQlkb3VibGUgc3RhcnRDb2VmZmljaWVudCA9IFNUQVJUX0NPRUZGSUNJRU5UOwotCQlkb3VibGUgZW5kQ29lZmZpY2llbnQgPSAxLjAgLSBzdGFydENvZWZmaWNpZW50OwotCQlpbnQgbGVuID0gSlBBRWRpdG9yVXRpbC5jYWxjQ29ubmVjdGlvbkxlbmd0aChjKTsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBkID0gaW1hZ2VDcmVhdG9yLmNyZWF0ZU1hbnlFbmRXaXRoQXJyb3dEZWNvcmF0b3IoYywgZW5kQ29lZmZpY2llbnQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksTWF0aC5yb3VuZCgtbGVuLzEwKSwgMCk7Ci0JfQotICAgICAgICAgICAgICAgIAotCXByaXZhdGUgdm9pZCBhZGRNYW55VG9PbmVEZWNvcmF0b3IoRnJlZUZvcm1Db25uZWN0aW9uIGMsIFJlbERpciBkaXJlY3Rpb24sIElSZWxhdGlvbiByZWwpIHsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRPd25lcigpKTsKLQkJZG91YmxlIHN0YXJ0Q29lZmZpY2llbnQgPSBTVEFSVF9DT0VGRklDSUVOVDsKLQkJZG91YmxlIGVuZENvZWZmaWNpZW50ID0gMS4wIC0gc3RhcnRDb2VmZmljaWVudDsKLQkJaW50IGxlbiA9IEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7CQkKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBkMSA9IGltYWdlQ3JlYXRvci5jcmVhdGVNYW55U3RhcnREZWNvcmF0b3IoYywgc3RhcnRDb2VmZmljaWVudCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGQxLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksTWF0aC5yb3VuZChsZW4vMTApLCAwKTsKLQkJaWYgKFVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJQ29ubmVjdGlvbkRlY29yYXRvciBkMiA9IGltYWdlQ3JlYXRvci5jcmVhdGVBcnJvd0Nvbm5lY3Rpb25EZWNvcmF0b3IoYywgZW5kQ29lZmZpY2llbnQpOwotCQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZDIuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKC1sZW4vMTApLCAwKTsKLQkJfSAKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGFkZE1hbnlUb01hbnlEZWNvcmF0b3IoRnJlZUZvcm1Db25uZWN0aW9uIGMsIFJlbERpciBkaXJlY3Rpb24sIElSZWxhdGlvbiByZWwpIHsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRPd25lcigpKTsKLQkJZG91YmxlIHN0YXJ0Q29lZmZpY2llbnQgPSBTVEFSVF9DT0VGRklDSUVOVDsKLQkJZG91YmxlIGVuZENvZWZmaWNpZW50ID0gMS4wIC0gc3RhcnRDb2VmZmljaWVudDsJCQotCQlpbnQgbGVuID0gSlBBRWRpdG9yVXRpbC5jYWxjQ29ubmVjdGlvbkxlbmd0aChjKTsJCQotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQxID0gaW1hZ2VDcmVhdG9yLmNyZWF0ZU1hbnlTdGFydERlY29yYXRvcihjLCBzdGFydENvZWZmaWNpZW50KTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb24oZDEuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSxNYXRoLnJvdW5kKGxlbi8xMCksIDApOwotCQlpZiAoVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQgPSBpbWFnZUNyZWF0b3IuY3JlYXRlTWFueUVuZFdpdGhBcnJvd0RlY29yYXRvcihjLCBlbmRDb2VmZmljaWVudCk7Ci0JCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksTWF0aC5yb3VuZCgtbGVuLzEwKSwgMCk7Ci0JCX0gZWxzZSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldEludmVyc2UoKSk7Ci0JCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQgPSBpbWFnZUNyZWF0b3IuY3JlYXRlTWFueUVuZERlY29yYXRvcihjLCBlbmRDb2VmZmljaWVudCk7Ci0JCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCksTWF0aC5yb3VuZCgtbGVuLzEwKSwgMCk7Ci0JCX0KLSAgICB9Ci0gCi0JCi0JCi0JCi0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9uZVRvT25lVGV4dERlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgUmVsRGlyIGRpcmVjdGlvbiwgSVJlbGF0aW9uIHJlbCkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlPbmVUb09uZUFubm90YXRpb24gYSA9IG51bGw7Ci0JCUJvb2xlYW4gb3B0aW9uYWw7Ci0JCWJvb2xlYW4gaXNPcHRpb25hbCA9IGZhbHNlOwotCQlpZiAoUmVsRGlyLlVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJaXNPcHRpb25hbCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlID0gcmVsLmdldEludmVyc2UoKS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgKEphdmFQZXJzaXN0ZW50VHlwZSlpbnZlcnNlLmdldFBhcmVudCgpKTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBpbnZlcnNlLmdldE1hcHBpbmcoKTsKLQkJCWEgPSAoT25lVG9PbmVBbm5vdGF0aW9uKW1hcHBpbmcuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCWlmIChhICE9IG51bGwpIHsKLQkJCQlvcHRpb25hbCA9IGEuZ2V0T3B0aW9uYWwoKTsKLQkJCQlpc09wdGlvbmFsID0gKG9wdGlvbmFsID09IG51bGwpID8gdHJ1ZSA6IG9wdGlvbmFsLmJvb2xlYW5WYWx1ZSgpOwotCQkJCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCBpc09wdGlvbmFsID8gSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fT05FIDogSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX09ORSwgMC4wKTsJCQkJCi0JCQl9Ci0JCX0KLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRPd25lcigpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXIgPSByZWwuZ2V0T3duZXIoKS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlvd25lci51cGRhdGUoKTsKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IG93bmVyLmdldE1hcHBpbmcoKTsgIAotCQlhID0gKE9uZVRvT25lQW5ub3RhdGlvbiltYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7CQkKLQkJaWYgKGEgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJb3B0aW9uYWwgPSBhLmdldE9wdGlvbmFsKCk7Ci0JCWlzT3B0aW9uYWwgPSAob3B0aW9uYWwgPT0gbnVsbCkgPyB0cnVlIDogb3B0aW9uYWwuYm9vbGVhblZhbHVlKCk7CQkKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIGlzT3B0aW9uYWwgPyBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19PTkUgOiBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfT05FLCAxLjApOwkJCQkJCQkJCSAKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSwgMC4wKTsJCQkJCi0JCWlmICghVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldEludmVyc2UoKSk7Ci0JCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCksIDEuMCk7CQkJCQotCQl9Ci0JfQotICAgICAgICAKLQlwcml2YXRlIHZvaWQgYWRkT25lVG9NYW55VGV4dERlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgSVJlbGF0aW9uIHJlbCkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fT05FLCAwLjApOwotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fTiwgMS4wKTsJCi0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCksIDAuMCk7CQkJCQkJCi0JfQotICAgICAgICAgICAgICAgIAotCXByaXZhdGUgdm9pZCBhZGRNYW55VG9PbmVUZXh0RGVjb3JhdG9yKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCBSZWxEaXIgZGlyZWN0aW9uLCBJUmVsYXRpb24gcmVsKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19OLCAwLjApOwotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpLCAwLjApOwkJCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXIgPSByZWwuZ2V0T3duZXIoKS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gb3duZXIuZ2V0TWFwcGluZygpOwotCQlNYW55VG9PbmVBbm5vdGF0aW9uIGEgPSAoTWFueVRvT25lQW5ub3RhdGlvbiltYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWlmIChhID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlCb29sZWFuIG9wdGlvbmFsID0gYS5nZXRPcHRpb25hbCgpOwotCQlib29sZWFuIGlzT3B0aW9uYWwgPSAob3B0aW9uYWwgPT0gbnVsbCkgPyB0cnVlIDogb3B0aW9uYWwuYm9vbGVhblZhbHVlKCk7CQkKLQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIGlzT3B0aW9uYWwgPwotCQkJCQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19PTkUgOgotCQkJCQkJCQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfT05FLCAxLjApOwotCQlpZiAoIVVOSS5lcXVhbHMoZGlyZWN0aW9uKSkgewotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJaW1hZ2VDcmVhdG9yLmNyZWF0ZUNhcmRpbmFsaXR5Q29ubmVjdGlvbkRlY29yYXRvcihnZXREaWFncmFtKCksIGMsIHJlbC5nZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpLCAxLjApOwotCQl9Ci0gICAgfQotICAgIAotCXByaXZhdGUgdm9pZCBhZGRNYW55VG9NYW55VGV4dERlY29yYXRvcihGcmVlRm9ybUNvbm5lY3Rpb24gYywgUmVsRGlyIGRpcmVjdGlvbiwgSVJlbGF0aW9uIHJlbCkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldE93bmVyKCkpOwotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fTiwgMC4wKTsJCQotCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgSlBBRWRpdG9yQ29uc3RhbnRzLkNBUkRJTkFMSVRZX1pFUk9fTiwgMS4wKTsJCi0JCWltYWdlQ3JlYXRvci5jcmVhdGVDYXJkaW5hbGl0eUNvbm5lY3Rpb25EZWNvcmF0b3IoZ2V0RGlhZ3JhbSgpLCBjLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCksIDAuMCk7Ci0JCWlmICghVU5JLmVxdWFscyhkaXJlY3Rpb24pKSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVsLmdldEludmVyc2UoKSk7Ci0JCQlpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGdldERpYWdyYW0oKSwgYywgcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCksIDEuMCk7CQotCQl9Ci0gICAgfQotCi0JCi0JCi0JCi0JCi0JCi0gICAgcHVibGljIGJvb2xlYW4gY2FuQWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQWRkQ29ubmVjdGlvbkNvbnRleHQgJiYgY29udGV4dC5nZXROZXdPYmplY3QoKSBpbnN0YW5jZW9mIElSZWxhdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0gICAgCi19Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4Nzc5Y2MuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDcmVhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3RDcmVhdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdENyZWF0ZUZlYXR1cmUgewotCQotCXB1YmxpYyBDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBwcm92aWRlcikgewotCQlzdXBlcihwcm92aWRlciwgIiIsICIiKTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkNyZWF0ZShJQ3JlYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgT2JqZWN0W10gY3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQlTdHJpbmcgbmV3QXR0ck5hbWUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5jcmVhdGVOZXdBdHRyaWJ1dGUoanB0LCBmYWxzZSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGpwdCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHIgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQobmV3QXR0ck5hbWUpOwotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChuZXdBdHRyID09IG51bGwpICYmIChjbnQgPCAyNSkpIHsgCi0JCQluZXdBdHRyID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKG5ld0F0dHJOYW1lKTsKLQkJCWlmIChuZXdBdHRyID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlRocmVhZCBzbGVlcCBpbnRlcnJ1cHRlZCIsIGUpOyAgLy8kTk9OLU5MUy0xJAkJIAotCQkJCX0KLQkJCX0KLQkJCWNudCsrOwotCQl9Ci0JCWdldEZlYXR1cmVQcm92aWRlcigpLmFkZEFkZElnbm9yZSgoSmF2YVBlcnNpc3RlbnRUeXBlKW5ld0F0dHIuZ2V0UGFyZW50KCksIG5ld0F0dHIuZ2V0TmFtZSgpKTsKLQkJYWRkR3JhcGhpY2FsUmVwcmVzZW50YXRpb24oY29udGV4dCwgbmV3QXR0cik7Ci0gICAgICAgIGdldEZlYXR1cmVQcm92aWRlcigpLmdldERpcmVjdEVkaXRpbmdJbmZvKCkuc2V0QWN0aXZlKHRydWUpOwotICAgICAgICAKLSAgICAgICAgSVdvcmtiZW5jaFNpdGUgd3MgPSAoKElFZGl0b3JQYXJ0KWdldERpYWdyYW1FZGl0b3IoKSkuZ2V0U2l0ZSgpOwotICAgICAgICBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0gICAgICAgIGdldEZlYXR1cmVQcm92aWRlcigpLmdldEpQQUVkaXRvclV0aWwoKS5mb3JtYXRDb2RlKGN1LCB3cyk7Ci0KLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7bmV3QXR0cn07Ci0JfQkKLQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkxhYmVsOyAgCQkJCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbjsgIAotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxMTdhZi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuaW50ZXJuYWwuZmVhdHVyZXMuY29udGV4dC5pbXBsLmJhc2UuUGljdG9ncmFtRWxlbWVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZmVhdHVyZXMuRGVmYXVsdERlbGV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0RGVsZXRlRmVhdHVyZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBhdHRyTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCXN1cGVyKHByb3ZpZGVyKTsKLQl9CQotCQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFF1ZXN0aW9uVG9Vc2VyKCkgewotICAgIAlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2RlbGV0ZUF0dHJpYnV0ZVF1ZXN0aW9uLCBuZXcgT2JqZWN0W10ge2F0dHJOYW1lfSk7IAotICAgIH0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5VbmRvKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRBdHRyTmFtZShDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUpIHsKLQkJU3RyaW5nIHR4dCA9ICgoVGV4dCkodGV4dFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLmdldCgwKSkpLmdldFZhbHVlKCk7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IHR4dC5zdWJzdHJpbmcodHh0LmluZGV4T2YoJzonKSArIDEpOwotCQlhdHRyTmFtZSA9IGF0dHJOYW1lLnRyaW0oKTsJCi0JCXJldHVybiBhdHRyTmFtZTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBkZWxldGVBdHRyaWJ1dGUoQ29udGFpbmVyU2hhcGUgcGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUuZ2V0Q29udGFpbmVyKCkuZ2V0Q29udGFpbmVyKCkpOwkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZUF0dHJpYnV0ZShqcHQsIGF0dHJOYW1lLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JfQkKLQkKLSAgICBwdWJsaWMgdm9pZCBkZWxldGUoSURlbGV0ZUNvbnRleHQgY29udGV4dCkgewotICAgIAlkZWxldGUoY29udGV4dCwgdHJ1ZSk7Ci0gICAgfQotICAgIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHByZURlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyLnByZURlbGV0ZShjb250ZXh0KTsKLQl9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKElEZWxldGVDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gaGF2ZVRvQXNrKSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0IGN0eCA9IChQaWN0b2dyYW1FbGVtZW50Q29udGV4dCljb250ZXh0OwotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpY3R4LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsJCi0JCWlmICgodGV4dFNoYXBlID09IG51bGwpIHx8IHRleHRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBnZXRBdHRyTmFtZSh0ZXh0U2hhcGUpOwotCQl0aGlzLmF0dHJOYW1lID0gYXR0ck5hbWU7Ci0gICAgCWlmIChoYXZlVG9Bc2spIHsKLSAgICAJCWlmICghZ2V0VXNlckRlY2lzaW9uKGNvbnRleHQpKSB7Ci0gICAgCQkJcmV0dXJuOwotICAgIAkJfQotICAgIAl9ICAgIAkKLSAgICAJCi0gICAgICAgIHByZURlbGV0ZShjb250ZXh0KTsgCi0gICAgICAgIGlmICh0ZXh0U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSA9PSBudWxsKXsKLSAgICAgICAgCXJldHVybjsKLSAgICAgICAgfSAgICAgICAgCi0JCWRlbGV0ZUF0dHJpYnV0ZSh0ZXh0U2hhcGUsIGF0dHJOYW1lKTsKLSAgICB9Ci0KLSAgICAKLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVCdXNpbmVzc09iamVjdHMoT2JqZWN0W10gYnVzaW5lc3NPYmplY3RzKSB7Ci0gICAgICAgIGlmIChidXNpbmVzc09iamVjdHMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChPYmplY3QgYm8gOiBidXNpbmVzc09iamVjdHMpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVCdXNpbmVzc09iamVjdChibyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9ICAgIAotCQkKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25sYWJlbDsgCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbjsgCi0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViYmQ5My4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci0KLQotcHVibGljIGNsYXNzIENvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIGltcGxlbWVudHMgSUN1c3RvbUZlYXR1cmV7Ci0JCi0JcHVibGljIENvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlEaWFncmFtIGRpYWdyYW0gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpOwotCQlmaW5hbCBFTGlzdDxTaGFwZT4gZW50U2hhcGVzID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJZm9yIChmaW5hbCBQaWN0b2dyYW1FbGVtZW50IGVsIDogZW50U2hhcGVzKSB7Ci0JCQkJCVN0cmluZyBjb2xsYXBzZUZlYXR1cmVzID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShlbCwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTKTsKLQkJCQkJaWYgKGNvbGxhcHNlRmVhdHVyZXMgPT0gbnVsbCkgewkKLQkJCQkgICAgICAgIEdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBlbC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQkJCQkJYWxnby5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKTsKLQkJCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoZWwsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUywgU3RyaW5nLnZhbHVlT2YoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKSk7Ci0JCQkJCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKChDb250YWluZXJTaGFwZSkgZWwsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7CQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7CQotCQkJCQotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBbGxFbnRpdGllc01lbnVJdGVtOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmYjljNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5HcmFwaGljc1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBDb2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlewotCi0JcHVibGljIENvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgZWwgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnRzKClbMF07Ci0JCQotCQlmaW5hbCBDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZWw7Ci0JCWZpbmFsIENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlID0gY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCk7Ci0JCQotCQlmaW5hbCBHcmFwaGljc0FsZ29yaXRobSBhbGdvID0gZWwuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oYWxnbyk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJICAgIGFsZ28uc2V0SGVpZ2h0KEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9NSU5fSEVJR0hUKTsKLQkJCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoY29udGFpbmVyU2hhcGUsIHRydWUpOwotCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoZW50aXR5U2hhcGUsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7CQkJCQotCQkJfQotCQl9KTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgSUN1c3RvbUNvbnRleHQpIHsKLQkJCVBpY3RvZ3JhbUVsZW1lbnRbXSBwZXMgPSAoKElDdXN0b21Db250ZXh0KSBjb250ZXh0KS5nZXRQaWN0b2dyYW1FbGVtZW50cygpOwotCQkJaWYgKHBlcyAhPSBudWxsICYmIHBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJYm9vbGVhbiBjb2xsYXBzZVBvc3NpYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHBlc1tpXTsKLQkJCQkJT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCQkJaWYgKGJvICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIWNvbGxhcHNlUG9zc2libGUpIHsKLQkJCQkJCWlmKCFHcmFwaGljc1VwZGF0ZXIuaXNDb2xsYXBzZWQoKENvbnRhaW5lclNoYXBlKXBlKSkgewotCQkJCQkJCWNvbGxhcHNlUG9zc2libGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjb2xsYXBzZVBvc3NpYmxlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ29sbGFwc2VFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2OTVkZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Db2xsYXBzZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotCi0KLXB1YmxpYyBjbGFzcyBDb2xsYXBzZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgaW1wbGVtZW50cyBJQ3VzdG9tRmVhdHVyZXsKLQkKLQlwdWJsaWMgQ29sbGFwc2VFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlmaW5hbCBQaWN0b2dyYW1FbGVtZW50IGVsID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCQkKLSAgICAgICAgZmluYWwgR3JhcGhpY3NBbGdvcml0aG0gYWxnbyA9IGVsLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0gICAgICAgIAotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihhbGdvKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJYWxnby5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKTsKLQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMsIFN0cmluZy52YWx1ZU9mKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVCkpOwotCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoKENvbnRhaW5lclNoYXBlKSBlbCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChjb250ZXh0IGluc3RhbmNlb2YgSUN1c3RvbUNvbnRleHQpIHsKLQkJCVBpY3RvZ3JhbUVsZW1lbnRbXSBwZXMgPSAoKElDdXN0b21Db250ZXh0KSBjb250ZXh0KS5nZXRQaWN0b2dyYW1FbGVtZW50cygpOwotCQkJaWYgKHBlcyAhPSBudWxsICYmIHBlcy5sZW5ndGggPiAwKSB7Ci0JCQkJYm9vbGVhbiBjb2xsYXBzZVBvc3NpYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHBlc1tpXTsKLQkJCQkJT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCQkJaWYgKCEoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFjb2xsYXBzZVBvc3NpYmxlKSB7Ci0JCQkJCQlQcm9wZXJ0eSBwcm9wZXJ0eSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5KHBlLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQkJCQkJaWYgKHByb3BlcnR5ID09IG51bGwpIHsKLQkJCQkJCQljb2xsYXBzZVBvc3NpYmxlID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY29sbGFwc2VQb3NzaWJsZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDIxOWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlSlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3JlYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkFic3RyYWN0Q3JlYXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDcmVhdGVGZWF0dXJlIHsKLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUganBhUHJlZmVyZW5jZVN0b3JlID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lOwotCXByaXZhdGUgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNQcmltYXJ5a2V5OwotCi0KLQlwdWJsaWMgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0gICAgICAgIHN1cGVyKGZwLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYUVudGl0eUZlYXR1cmVOYW1lLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYUVudGl0eUZlYXR1cmVEZXNjcmlwdGlvbik7Ci0gICAgfQotCQotCXB1YmxpYyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCQlib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsCi0JCQlTdHJpbmcgbWFwcGVkU3VwZXJDbGFzc1BhY2thZ2UpIHsKLQkJdGhpcyhmcCwgaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIG1hcHBlZFN1cGVyY2xhc3NOYW1lLAotCQkJCW1hcHBlZFN1cGVyQ2xhc3NQYWNrYWdlLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIENyZWF0ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCwKLQkJCWJvb2xlYW4gaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSkgewotCQl0aGlzKGZwLCBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZCwgbWFwcGVkU3VwZXJjbGFzc05hbWUsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJYm9vbGVhbiBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZCwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lLAotCQkJU3RyaW5nIG1hcHBlZFN1cGVyQ2xhc3NQYWNrYWdlLCBib29sZWFuIGhhc1ByaW1hcnlLZXkpIHsKLQkJdGhpcyhmcCk7Ci0JCXRoaXMuaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQgPSBpc01hcHBlZFN1cGVyY2xhc3NDaGlsZDsKLQkJdGhpcy5tYXBwZWRTdXBlcmNsYXNzTmFtZSA9IG1hcHBlZFN1cGVyY2xhc3NOYW1lOwotCQl0aGlzLm1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlID0gbWFwcGVkU3VwZXJDbGFzc1BhY2thZ2U7Ci0JCXRoaXMuaGFzUHJpbWFyeWtleSA9IGhhc1ByaW1hcnlLZXk7Ci0JfQotCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5DcmVhdGUoSUNyZWF0ZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSBpbnN0YW5jZW9mIERpYWdyYW07Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwdWJsaWMgT2JqZWN0W10gY3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJTGlzdDxTaGFwZT4gc2hhcGVzID0gdGhpcy5nZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpLmdldENoaWxkcmVuKCk7Ci0JCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBudWxsOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCQlpZiAoKHNoYXBlcyA9PSBudWxsKSB8fCAoc2hhcGVzLnNpemUoKSA9PSAwKSkgewotCQkJanBhUHJvamVjdCA9IGdldFRhcmdldEpQQVByb2plY3QoKTsKLQkJCXRhcmdldFByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJfSBlbHNlIHsKLQkJCVNoYXBlIHNoID0gc2hhcGVzLmdldCgwKTsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzaCk7Ci0JCQlpZiAoanB0ID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLQkJCWpwYVByb2plY3QgPSBqcHQuZ2V0SnBhUHJvamVjdCgpOwotCQkJdGFyZ2V0UHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQl9ICAgIAkKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRKUEFFZGl0b3JVdGlsKCkuCi0JCQkJCQkJCWdlbmVyYXRlVW5pcXVlRW50aXR5TmFtZShqcGFQcm9qZWN0LCAKLQkJCQkJCQkJCQkJCQkJIEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpLCAKLQkJCQkJCQkJCQkJCQkJIGdldEZlYXR1cmVQcm92aWRlcigpKTsgCi0KLQkJaWYoIUpQQUVkaXRvclV0aWwuY2hlY2tJc1NldFBlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5KGpwYVByb2plY3QpKXsKLQkJCVNoZWxsIHNoZWxsID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yU3RhdHVzTXNnKTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihzaGVsbCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZ1RpdGxlLCAKLQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvck1zZywgc3RhdHVzKTsKLQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCX0KLQkJCi0JCWlmICghSnB0SnBhQ29yZVBsdWdpbi5kaXNjb3ZlckFubm90YXRlZENsYXNzZXModGFyZ2V0UHJvamVjdCkpIHsKLQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlUmVnaXN0ZXJFbnRpdHlJblhNTEpvYihqcGFQcm9qZWN0LCBlbnRpdHlOYW1lKTsKLQkJfQotCQkKLQkJdHJ5IHsKLQkJCXRoaXMuZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0SlBBRWRpdG9yVXRpbCgpLmNyZWF0ZUVudGl0eUluUHJvamVjdCh0YXJnZXRQcm9qZWN0LCBlbnRpdHlOYW1lLCBqcGFQcmVmZXJlbmNlU3RvcmUsIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsIGhhc1ByaW1hcnlrZXkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBjcmVhdGUgYW4gZW50aXR5IGluIHRoZSBwcm9qZWN0ICIgKyB0YXJnZXRQcm9qZWN0LmdldE5hbWUoKSwgZTEpOyAgLy8kTk9OLU5MUy0xJAkJIAotCQl9Ci0JCQotCQkKLQkJdHJ5IHsKLQkJCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVmcmVzaCB0aGUgcHJvamVjdCIsIGUxKTsgIC8vJE5PTi1OTFMtMSQJCSAKLQkJfQotCQkKLQkJTGlzdEl0ZXJhdG9yPFBlcnNpc3RlbmNlVW5pdD4gbGl0ID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCk7CQkKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gbGl0Lm5leHQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5TmFtZSk7Ci0KLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgoanB0ID09IG51bGwpICYmIChjbnQgPCAyNSkpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhyZWFkIHNsZWVwIGludGVycnVwdGVkIiwgZSk7ICAvLyROT04tTkxTLTEkCQkgCi0JCQl9Ci0JCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXB1LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eU5hbWUpOwotCQkJY250Kys7Ci0JCX0JCQotCQkKLQkJaWYgKGpwdCAhPSBudWxsKSB7Ci0JCQlhZGRHcmFwaGljYWxSZXByZXNlbnRhdGlvbihjb250ZXh0LCBqcHQpOwotCSAgICAgICAgSVdvcmtiZW5jaFNpdGUgd3MgPSAoKElFZGl0b3JQYXJ0KWdldERpYWdyYW1FZGl0b3IoKSkuZ2V0U2l0ZSgpOwotCSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCSAgICAgICAgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0SlBBRWRpdG9yVXRpbCgpLmZvcm1hdENvZGUoY3UsIHdzKTsJCQkKLQkJCXJldHVybiBuZXcgT2JqZWN0W10geyBqcHQgfTsKLQkJfSBlbHNlIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlRoZSBKUEEgZW50aXR5ICIgKyBlbnRpdHlOYW1lICsgIiBjb3VsZCBub3QgYmUgY3JlYXRlZCIsIG5ldyBFeGNlcHRpb24oKSk7ICAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQJIAotCQl9CQkKLQkJcmV0dXJuIG5ldyBPYmplY3RbXSB7fTsKLSAgICB9Ci0gICAgICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0Q3JlYXRlSW1hZ2VJZCgpIHsKLSAgICAgICAgcmV0dXJuIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuQUREX0pQQV9FTlRJVFk7Ci0gICAgfQotICAgIAotCUBPdmVycmlkZQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9ICAgICAgICAKLSAgICAgICAgCi0JcHJpdmF0ZSBKcGFQcm9qZWN0IGdldFRhcmdldEpQQVByb2plY3QoKSB7Ci0JCXJldHVybiBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRNb2luSW50ZWdyYXRpb25VdGlsKCkuZ2V0UHJvamVjdEJ5RGlhZ3JhbShnZXREaWFncmFtKCkpOwotCX0JCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDY1NGIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0gCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdENyZWF0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotICAKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlIGV4dGVuZHMKLQkJQWJzdHJhY3RDcmVhdGVGZWF0dXJlIHsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUganBhUHJlZmVyZW5jZVN0b3JlID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbgotCQkJLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCXB1YmxpYyBDcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcigKLQkJCQlmcCwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZU5hbWUsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmVEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlKElDcmVhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNvbnRleHQuZ2V0VGFyZ2V0Q29udGFpbmVyKCkgaW5zdGFuY2VvZiBEaWFncmFtOwotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBjcmVhdGUoSUNyZWF0ZUNvbnRleHQgY29udGV4dCkgewotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSB0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKQotCQkJCS5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKTsKLQkJSVByb2plY3QgdGFyZ2V0UHJvamVjdCA9IG51bGw7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JCWlmICgoc2hhcGVzID09IG51bGwpIHx8IChzaGFwZXMuc2l6ZSgpID09IDApKSB7Ci0JCQlqcGFQcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQkJdGFyZ2V0UHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQl9IGVsc2UgewotCQkJU2hhcGUgc2ggPSBzaGFwZXMuZ2V0KDApOwotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJaWYgKGpwdCA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgT2JqZWN0W10ge307Ci0JCQlqcGFQcm9qZWN0ID0ganB0LmdldEpwYVByb2plY3QoKTsKLQkJCXRhcmdldFByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJfQotCQkKLQkJU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkKLQkJCQkuZ2V0SlBBRWRpdG9yVXRpbCgpCi0JCQkJLmdlbmVyYXRlVW5pcXVlTWFwcGVkU3VwZXJjbGFzc05hbWUoCi0JCQkJCQlqcGFQcm9qZWN0LAotCQkJCQkJSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0UGFja2FnZShqcGFQcm9qZWN0LmdldFByb2plY3QoKSksCi0JCQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQotCQlpZiAoIUpwdEpwYUNvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKSkgewotCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVSZWdpc3RlckVudGl0eUluWE1MSm9iKGpwYVByb2plY3QsIG1hcHBlZFN1cGVyY2xhc3NOYW1lKTsKLQkJfQotCQkJCQotCi0JCXRyeSB7Ci0JCQl0aGlzLmdldEZlYXR1cmVQcm92aWRlcigpCi0JCQkJCS5nZXRKUEFFZGl0b3JVdGlsKCkKLQkJCQkJLmNyZWF0ZUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KHRhcmdldFByb2plY3QsCi0JCQkJCQkJbWFwcGVkU3VwZXJjbGFzc05hbWUsIGpwYVByZWZlcmVuY2VTdG9yZSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IGNyZWF0ZSBhbiBlbnRpdHkgaW4gdGhlIHByb2plY3QgIiArIHRhcmdldFByb2plY3QuZ2V0TmFtZSgpLCBlMSk7ICAvLyROT04tTkxTLTEkCQkgCi0JCX0KLQkJCi0JCUNyZWF0ZUpQQUVudGl0eUZlYXR1cmUgY3JlYXRlRW50aXR5RmVhdHVyZSA9IG5ldyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlKAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLCB0cnVlLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSk7Ci0JCXJldHVybiBjcmVhdGVFbnRpdHlGZWF0dXJlLmNyZWF0ZShjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUltYWdlSWQoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLkFERF9JTkhFUklURURfRU5USVRZOwotCX0KLQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRUYXJnZXRKUEFQcm9qZWN0KCkgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0TW9pbkludGVncmF0aW9uVXRpbCgpCi0JCQkJLmdldFByb2plY3RCeURpYWdyYW0oZ2V0RGlhZ3JhbSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNDQzODkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvTWFueUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcwotCQlDcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlCaURpckZlYXR1cmVOYW1lLCAgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOyAKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYW55VG9NYW55QmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgUGljdG9ncmFtRWxlbWVudCB0YXJnZXQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHNvdXJjZSkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCh0YXJnZXQpKTsJCQotCQkKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShvd25lckF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgb3duZXJBdHRyaWJ1dGVUZXh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsJCQotCi0JCVN0cmluZyBpbnZlcnNlQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKG93bmVyKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChpbnZlcnNlKSkKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoaW52ZXJzZUF0dHJpYnV0ZU5hbWUpOwotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMik7CQkKLQkJCi0JCU1hbnlUb01hbnlCaURpclJlbGF0aW9uIHJlbCA9IG5ldyBNYW55VG9NYW55QmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQotCX0JCi0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fTUFOWV8yX0RJUjsKLSAgICB9CQkJCQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDA0MGYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotCi0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU1hbnlUb01hbnlSZWxhdGlvbkZlYXR1cmUgCi0JCWV4dGVuZHMJQ3JlYXRlUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIoZnAsIG5hbWUsIGRlc2NyaXB0aW9uKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNThmZDUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcwotCQlDcmVhdGVNYW55VG9NYW55UmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvTWFueVVuaURpckZlYXR1cmVOYW1lLCAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOyAKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIFBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7CQkKLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IGF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVUZXh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsJCQotCQlNYW55VG9NYW55VW5pRGlyUmVsYXRpb24gcmVsYXRpb24gPSBuZXcgTWFueVRvTWFueVVuaURpclJlbGF0aW9uKGZwLCBvd25lciwgaW52ZXJzZSwgYXR0cmlidXRlVGV4dCwgdHJ1ZSwgCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KG93bmVyKSwKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoaW52ZXJzZSkpOyAKLQkJcmV0dXJuIHJlbGF0aW9uOwkJCi0JfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fTUFOWV8xX0RJUjsKLSAgICB9CQkJCQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlZWI1MjkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUgZXh0ZW5kcwotCQlDcmVhdGVNYW55VG9PbmVSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZU5hbWUsICAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9PbmVCaURpckZlYXR1cmVEZXNjcmlwdGlvbik7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFueVRvT25lQmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQlQaWN0b2dyYW1FbGVtZW50IHRhcmdldCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc291cmNlKSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRhcmdldCkpOwkJCi0JCQotCQlTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG93bmVyQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBvd25lckF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwkJCi0KLQkJU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUob3duZXIpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIgPSBpbnZlcnNlQXR0cmlidXRlTmFtZTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGludmVyc2UpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMiA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBpbnZlcnNlQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgb3duZXJBdHRyaWJ1dGVUZXh0LCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyKTsJCQotCQkKLQkJTWFueVRvT25lQmlEaXJSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvT25lQmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX01BTllfVE9fT05FXzJfRElSOwotICAgIH0JCQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMWM5ZWMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZSAKLQkJZXh0ZW5kcwlDcmVhdGVSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU1hbnlUb09uZVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWZjMTUwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckltYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMKLQkJQ3JlYXRlTWFueVRvT25lUmVsYXRpb25GZWF0dXJlIHsKLQotCXB1YmxpYyBDcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVOYW1lLCAgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbik7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgTWFueVRvT25lVW5pRGlyUmVsYXRpb24gY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgUGljdG9ncmFtRWxlbWVudCBzb3VyY2UsIFBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7Ci0JCQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IGF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBhdHRyaWJ1dGVUZXh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsJCQotCQlNYW55VG9PbmVVbmlEaXJSZWxhdGlvbiByZWxhdGlvbiA9IG5ldyBNYW55VG9PbmVVbmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIGF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsKLQkJcmV0dXJuIHJlbGF0aW9uOwotCX0KLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldENyZWF0ZUltYWdlSWQoKSB7Ci0gICAgICAgIHJldHVybiBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fTUFOWV9UT19PTkVfMV9ESVI7Ci0gICAgfQkJCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZWMyZDEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55UmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci0KLWFic3RyYWN0IGNsYXNzIENyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZSAKLQkJZXh0ZW5kcwlDcmVhdGVSZWxhdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViMzM2Ny4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZSBleHRlbmRzCi0JCUNyZWF0ZU9uZVRvTWFueVJlbGF0aW9uRmVhdHVyZSB7Ci0KLQlwdWJsaWMgQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnAsIEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlTmFtZSwgIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOyAKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBPbmVUb01hbnlVbmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQlQaWN0b2dyYW1FbGVtZW50IHRhcmdldCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc291cmNlKSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRhcmdldCkpOwkKLQkJCQkKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBhdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKQotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGF0dHJpYnV0ZU5hbWUpOwotCQkKLQkJU3RyaW5nIGF0dHJpYnV0ZVRleHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwkJCi0JCU9uZVRvTWFueVVuaURpclJlbGF0aW9uIHJlbGF0aW9uID0gbmV3IE9uZVRvTWFueVVuaURpclJlbGF0aW9uKGZwLCBvd25lciwgaW52ZXJzZSwgYXR0cmlidXRlVGV4dCwgdHJ1ZSwgCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KG93bmVyKSwKLQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoaW52ZXJzZSkpOwotCQlyZXR1cm4gcmVsYXRpb247CQotCX0JCi0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX09ORV9UT19NQU5ZXzFfRElSOwotICAgIH0JCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2NWE1ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIENyZWF0ZU9uZVRvT25lUmVsYXRpb25GZWF0dXJlIHsKLQkKLQlwdWJsaWMgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwLCBKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlTmFtZSwgIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVCaURpckZlYXR1cmVEZXNjcmlwdGlvbik7IAotCX0KLQkJCi0JQE92ZXJyaWRlCi0JcHVibGljIE9uZVRvT25lQmlEaXJSZWxhdGlvbiBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBQaWN0b2dyYW1FbGVtZW50IHNvdXJjZSwgCi0JCQlQaWN0b2dyYW1FbGVtZW50IHRhcmdldCkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc291cmNlKSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gKEphdmFQZXJzaXN0ZW50VHlwZSkoZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRhcmdldCkpOwkJCi0JCi0JCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCVN0cmluZyBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUob3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlVGV4dCA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7CQkKLQotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShvd25lcikpOwotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyMiA9IGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQoaW52ZXJzZSkpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGludmVyc2VBdHRyaWJ1dGVOYW1lKTsKLQkJU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVUZXh0ID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShpbnZlcnNlLCBvd25lckF0dHJpYnV0ZVRleHQsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcjIpOwkJCi0JCQotCQlPbmVUb09uZUJpRGlyUmVsYXRpb24gcmVsID0gbmV3IE9uZVRvT25lQmlEaXJSZWxhdGlvbihmcCwgb3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlVGV4dCwgaW52ZXJzZUF0dHJpYnV0ZVRleHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsgCi0JCXJldHVybiByZWw7CQkKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX09ORV9UT19PTkVfMl9ESVI7Ci0gICAgfQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRiOWZlYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotCi1hYnN0cmFjdCBjbGFzcyBDcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZSAKLQkJZXh0ZW5kcyBDcmVhdGVSZWxhdGlvbkZlYXR1cmUgewotCQotCXB1YmxpYyBDcmVhdGVPbmVUb09uZVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0NyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTEzMmQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JJbWFnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIENyZWF0ZU9uZVRvT25lUmVsYXRpb25GZWF0dXJlIHsKLQkKLQlwdWJsaWMgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCwgSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVVbmlEaXJGZWF0dXJlTmFtZSwgCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb24pOyAKLQl9Ci0JCQotCUBPdmVycmlkZQotCXB1YmxpYyBPbmVUb09uZVVuaURpclJlbGF0aW9uIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIFBpY3RvZ3JhbUVsZW1lbnQgc291cmNlLCAKLQkJCQkJCQkJCQkJCQkJUGljdG9ncmFtRWxlbWVudCB0YXJnZXQpIHsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBvd25lciA9IChKYXZhUGVyc2lzdGVudFR5cGUpKGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzb3VyY2UpKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKShnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQodGFyZ2V0KSk7Ci0JCQotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IG5hbWU7Ci0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpCi0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCVN0cmluZyBhdHRyaWJUeHQgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwkJCi0JCU9uZVRvT25lVW5pRGlyUmVsYXRpb24gcmVzID0gbmV3IE9uZVRvT25lVW5pRGlyUmVsYXRpb24oZnAsIG93bmVyLCBpbnZlcnNlLCBhdHRyaWJUeHQsIHRydWUsIAotCQkJCWdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChvd25lciksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KGludmVyc2UpKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0gICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVJbWFnZUlkKCkgewotICAgICAgICByZXR1cm4gSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX09ORV9UT19PTkVfMV9ESVI7Ci0gICAgfQkKLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlUmVsYXRpb25GZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVSZWxhdGlvbkZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUyYjViYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVSZWxhdGlvbkZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuQWJzdHJhY3RDcmVhdGVDb25uZWN0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIENyZWF0ZVJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3JlYXRlQ29ubmVjdGlvbkZlYXR1cmUgewotCi0JcHVibGljIENyZWF0ZVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCXN1cGVyKGZwLCBuYW1lLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQ3JlYXRlKElDcmVhdGVDb25uZWN0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBzb3VyY2UgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldFBlcnNpc3RlbnRUeXBlKGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgdGFyZ2V0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRQZXJzaXN0ZW50VHlwZShjb250ZXh0LmdldFRhcmdldEFuY2hvcigpKTsKLQkgICAgaWYgKHNvdXJjZSAhPSBudWxsICYmIHRhcmdldCAhPSBudWxsKSB7Ci0JICAgICAgICByZXR1cm4gdHJ1ZTsKLQkgICAgfQotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuU3RhcnRDb25uZWN0aW9uKElDcmVhdGVDb25uZWN0aW9uQ29udGV4dCBjb250ZXh0KSB7Ci0JICAgIGlmIChnZXRQZXJzaXN0ZW50VHlwZShjb250ZXh0LmdldFNvdXJjZUFuY2hvcigpKSAhPSBudWxsKSAKLQkgICAgICAgIHJldHVybiB0cnVlOwotCSAgICByZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBDb25uZWN0aW9uIGNyZWF0ZShJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCkgewotCSAgICBDb25uZWN0aW9uIG5ld0Nvbm5lY3Rpb24gPSBudWxsOwotCSAgICBQZXJzaXN0ZW50VHlwZSBzb3VyY2UgPSBnZXRQZXJzaXN0ZW50VHlwZShjb250ZXh0LmdldFNvdXJjZUFuY2hvcigpKTsKLQkgICAgUGVyc2lzdGVudFR5cGUgdGFyZ2V0ID0gZ2V0UGVyc2lzdGVudFR5cGUoY29udGV4dC5nZXRUYXJnZXRBbmNob3IoKSk7Ci0JICAgIGlmIChzb3VyY2UgIT0gbnVsbCAmJiB0YXJnZXQgIT0gbnVsbCkgewotCSAgICAJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBjcmVhdGVSZWxhdGlvbihnZXRGZWF0dXJlUHJvdmlkZXIoKSwgY29udGV4dC5nZXRTb3VyY2VBbmNob3IoKS5nZXRQYXJlbnQoKSwgCi0JICAgIAkJCQkJCQkJCQkJCQljb250ZXh0LmdldFRhcmdldEFuY2hvcigpLmdldFBhcmVudCgpKTsKLQkgICAgICAgIEFkZENvbm5lY3Rpb25Db250ZXh0IGFkZENvbnRleHQgPQotCSAgICAgICAgICAgIG5ldyBBZGRDb25uZWN0aW9uQ29udGV4dChjb250ZXh0LmdldFNvdXJjZUFuY2hvcigpLCBjb250ZXh0Ci0JICAgICAgICAgICAgICAgIC5nZXRUYXJnZXRBbmNob3IoKSk7Ci0JICAgICAgICBhZGRDb250ZXh0LnNldE5ld09iamVjdChyZWwpOwotCSAgICAgICAgbmV3Q29ubmVjdGlvbiA9Ci0JICAgICAgICAgICAgKENvbm5lY3Rpb24pIGdldEZlYXR1cmVQcm92aWRlcigpLmFkZElmUG9zc2libGUoYWRkQ29udGV4dCk7Ci0JICAgIH0gICAgCi0JICAgIHJldHVybiBuZXdDb25uZWN0aW9uOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBQZXJzaXN0ZW50VHlwZSBjbGFzcyBiZWxvbmdpbmcgdG8gdGhlIGFuY2hvciwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShBbmNob3IgYW5jaG9yKSB7Ci0JICAgIGlmIChhbmNob3IgIT0gbnVsbCkgewotCSAgICAgICAgT2JqZWN0IHJlZk9iamVjdCA9Ci0JICAgICAgICAgICAgZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGFuY2hvci5nZXRQYXJlbnQoKSk7Ci0JICAgICAgICBpZiAocmVmT2JqZWN0IGluc3RhbmNlb2YgUGVyc2lzdGVudFR5cGUpIHsKLQkgICAgICAgICAgICByZXR1cm4gKFBlcnNpc3RlbnRUeXBlKSByZWZPYmplY3Q7Ci0JICAgICAgICB9Ci0JICAgIH0KLQkgICAgcmV0dXJuIG51bGw7Ci0JfQotCQotCQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgT25lVG9PbmVSZWxhdGlvbiBiZXR3ZWVuIHR3byBQZXJzaXN0ZW50VHlwZSBjbGFzc2VzLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBBYnN0cmFjdFJlbGF0aW9uIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIFBpY3RvZ3JhbUVsZW1lbnQgc291cmNlLCAKLQkJCQkJCQkJCQkJCQkJCSAgIFBpY3RvZ3JhbUVsZW1lbnQgdGFyZ2V0KTsKLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsgCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlSlBBRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlSlBBRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjgxMDc3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZUpQQUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JTXVsdGlEZWxldGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5mZWF0dXJlcy5EZWZhdWx0RGVsZXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVKUEFFbnRpdHlGZWF0dXJlIGV4dGVuZHMgRGVmYXVsdERlbGV0ZUZlYXR1cmUgewotCQotCXByaXZhdGUgU3RyaW5nIGVudGl0eUNsYXNzTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZW50aXR5TmFtZSA9IG51bGw7Ci0JcHVibGljIERlbGV0ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7CQkKLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgZGVsZXRlKGZpbmFsIElEZWxldGVDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgIAkKLSAgICAJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJZW50aXR5Q2xhc3NOYW1lID0ganB0LmdldE5hbWUoKTsKLSAgICAJZW50aXR5TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGpwdCkpOwotICAgIAlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihwZSk7Ci0gICAgCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCWRlbGV0ZUVsKGNvbnRleHQpOwotCQkJfQotCQl9KTsKLSAgICAJCi0gICAgfQotICAgIAkKLSAgICBwdWJsaWMgdm9pZCBkZWxldGVFbChJRGVsZXRlQ29udGV4dCBjb250ZXh0KXsKLSAgICAJc3VwZXIuZGVsZXRlKGNvbnRleHQpOwotICAgIH0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBkZWxldGVCdXNpbmVzc09iamVjdChPYmplY3QgYm8pIHsKLSAgICAJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IG51bGw7Ci0JCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJanB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgYm87Ci0JCQkKLQkJCi0JCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBqcHQuZ2V0SnBhUHJvamVjdCgpOwotCQkJU3RyaW5nIG5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQkJCi0JCQkKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGVsZXRlRW50aXR5Q2xhc3MoanB0LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlpZiAoIUpwdEpwYUNvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCUpQQUVkaXRvclV0aWwuY3JlYXRlVW5yZWdpc3RlckVudGl0eUZyb21YTUxKb2IoanBhUHJvamVjdCwgbmFtZSk7Ci0JCQl9Ci0JCQkJCQkKLQkJfSAJCi0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlc3Rpb25Ub1VzZXIoKSB7Ci0gICAgCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5EZWxldGVKUEFFbnRpdHlGZWF0dXJlX2RlbGV0ZUpQQUVudGl0eVF1ZXN0aW9uLCBlbnRpdHlOYW1lLCBlbnRpdHlDbGFzc05hbWUpOwotICAgIH0KLSAgICAKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9CQkgICAgCi0JCi0JcHJvdGVjdGVkIGJvb2xlYW4gZ2V0VXNlckRlY2lzaW9uKElEZWxldGVDb250ZXh0IGNvbnRleHQpIHsKLQkJU3RyaW5nIG1zZyA9ICIiOyAgLy8kTk9OLU5MUy0xJAotCQlJTXVsdGlEZWxldGVJbmZvIG11bHRpRGVsZXRlSW5mbyA9IGNvbnRleHQuZ2V0TXVsdGlEZWxldGVJbmZvKCk7Ci0JCWlmIChtdWx0aURlbGV0ZUluZm8gIT0gbnVsbCkgewotCQkJbXNnID0gSlBBRWRpdG9yTWVzc2FnZXMuRGVsZXRlSlBBRW50aXR5RmVhdHVyZV9kZWxldGVKUEFFbnRpdGllc1F1ZXN0aW9uOwotCQl9IGVsc2UgewotCQkJaWYgKGVudGl0eUNsYXNzTmFtZSAhPSBudWxsICYmIGVudGl0eUNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQltc2cgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5EZWxldGVKUEFFbnRpdHlGZWF0dXJlX2RlbGV0ZUpQQUVudGl0eVF1ZXN0aW9uLCBlbnRpdHlOYW1lLCBlbnRpdHlDbGFzc05hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuRGVsZXRlRmVhdHVyZV9kZWxldGVDb25maXJtLCBtc2cpOwotCX0KLQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZVJlbGF0aW9uRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlUmVsYXRpb25GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTE4Y2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlUmVsYXRpb25GZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkRlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmZlYXR1cmVzLkRlZmF1bHREZWxldGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5BYnN0cmFjdFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5CaWRpcmVjdGlvbmFsUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuVW5pZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIERlbGV0ZVJlbGF0aW9uRmVhdHVyZSBleHRlbmRzIERlZmF1bHREZWxldGVGZWF0dXJlewotCQotCXByaXZhdGUgc3RhdGljIElKUEFFZGl0b3JVdGlsIHV0ID0gbnVsbDsKLQkJCi0JcHVibGljIERlbGV0ZVJlbGF0aW9uRmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQkJdXQgPSBmcC5nZXRKUEFFZGl0b3JVdGlsKCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGNhbkRlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQkKLQkKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFF1ZXN0aW9uVG9Vc2VyKCkgewotICAgIAlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuRGVsZXRlUmVsYXRpb25GZWF0dXJlX2RlbGV0ZVJlbGF0aW9uUXVlc3Rpb247Ci0gICAgfQotCQotICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAgIGlmIChidXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFnZXRVc2VyRGVjaXNpb24oY29udGV4dCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcmVEZWxldGUoY29udGV4dCk7Ci0gICAgICAgIEFic3RyYWN0UmVsYXRpb24gcmVsID0gKEFic3RyYWN0UmVsYXRpb24pYnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50OwotCQkKLSAgICAgICAgaWYgKHJlbCBpbnN0YW5jZW9mIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24pIHsKLSAgICAgICAgCVVuaWRpcmVjdGlvbmFsUmVsYXRpb24gcmVsYXRpb24gPSAoVW5pZGlyZWN0aW9uYWxSZWxhdGlvbilyZWw7Ci0gICAgICAgIAlDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZmVhdCA9IG5ldyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotICAgIAkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gcmVsYXRpb24uZ2V0QW5ub3RhdGVkQXR0cmlidXRlKCk7Ci0gICAgCQlQaWN0b2dyYW1FbGVtZW50IHRleHRTaGFwZSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChhdHRyaWJ1dGUpOwotICAgIAkJSURlbGV0ZUNvbnRleHQgZGVsQ3R4ID0gbmV3IERlbGV0ZUNvbnRleHQodGV4dFNoYXBlKTsgICAgCQkKLSAgICAJCWZlYXQuZGVsZXRlKGRlbEN0eCwgZmFsc2UpOwotICAgIAl9ICAgIAkKLQotICAgICAgICBpZiAocmVsIGluc3RhbmNlb2YgQmlkaXJlY3Rpb25hbFJlbGF0aW9uKSB7IAkJCQotICAgICAgICAJQmlkaXJlY3Rpb25hbFJlbGF0aW9uIHJlbGF0aW9uID0gKEJpZGlyZWN0aW9uYWxSZWxhdGlvbikocmVsKTsKLSAgICAgICAgCUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0ID0gbmV3IENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgICAgIAkKLSAgICAJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXR0cmlidXRlID0gcmVsYXRpb24uZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLSAgICAJCVBpY3RvZ3JhbUVsZW1lbnQgb3duZXJBdHRyaWJ1dGVUZXh0U2hhcGUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3Qob3duZXJBdHRyaWJ1dGUpOwotICAgIAkJSURlbGV0ZUNvbnRleHQgZGVsZXRlT3duZXJBdHRyaWJ1dGVDb250ZXh0ID0gbmV3IERlbGV0ZUNvbnRleHQob3duZXJBdHRyaWJ1dGVUZXh0U2hhcGUpOwotICAgIAkJZmVhdC5kZWxldGUoZGVsZXRlT3duZXJBdHRyaWJ1dGVDb250ZXh0LCBmYWxzZSk7Ci0gICAgCQkKLSAgICAJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBdHRyaWJ1dGUgPSByZWxhdGlvbi5nZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCk7Ci0gICAgCQlQaWN0b2dyYW1FbGVtZW50IGludmVyc2VBdHRyaWJ1dGVUZXh0U2hhcGUgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoaW52ZXJzZUF0dHJpYnV0ZSk7Ci0gICAgCQlJRGVsZXRlQ29udGV4dCBkZWxldGVJbnZlcnNlQXR0cmlidXRlQ29udGV4dCA9IG5ldyBEZWxldGVDb250ZXh0KGludmVyc2VBdHRyaWJ1dGVUZXh0U2hhcGUpOwotICAgIAkJZmVhdC5kZWxldGUoZGVsZXRlSW52ZXJzZUF0dHJpYnV0ZUNvbnRleHQsIGZhbHNlKTsgICAgCQkKLSAgICAJfSAgICAJCi0KLSAgICAgICAgcG9zdERlbGV0ZShjb250ZXh0KTsKLSAgICAgICAgCi0gICAgICAgIC8qCi0gICAgICAgIElSZW1vdmVDb250ZXh0IHJjID0gbmV3IFJlbW92ZUNvbnRleHQocGUpOwotICAgICAgICBJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotICAgICAgICBJUmVtb3ZlRmVhdHVyZSByZW1vdmVGZWF0dXJlID0gZmVhdHVyZVByb3ZpZGVyLmdldFJlbW92ZUZlYXR1cmUocmMpOwotICAgICAgICBpZiAocmVtb3ZlRmVhdHVyZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZW1vdmVGZWF0dXJlLnJlbW92ZShyYyk7Ci0gICAgICAgIH0KLSAgICAgICAgKi8KLSAgICAgICAgCi0gICAgICAgIAotICAgIH0JCi0gICAgCi0JcHVibGljIHZvaWQgcG9zdERlbGV0ZShJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudCA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAgIElSZWxhdGlvbiByZWwgPSAoSVJlbGF0aW9uKWJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudDsJCi0JCUlXb3JrYmVuY2hTaXRlIHdzID0gKChJRWRpdG9yUGFydClnZXREaWFncmFtRWRpdG9yKCkpLmdldFNpdGUoKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChyZWwuZ2V0T3duZXIoKSk7CQkKLSAgICAgICAgdXQub3JnYW5pemVJbXBvcnRzKGN1LCB3cyk7ICAgICAgICAKLQkJaWYgKHJlbCBpbnN0YW5jZW9mIEJpZGlyZWN0aW9uYWxSZWxhdGlvbikgewotCQkJY3UgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQocmVsLmdldEludmVyc2UoKSk7Ci0JCQl1dC5vcmdhbml6ZUltcG9ydHMoY3UsIHdzKTsgIAotCQl9Ci0JfQotICAgIAotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9ICAgIAotCQotCXByb3RlY3RlZCBib29sZWFuIGdldFVzZXJEZWNpc2lvbihJRGVsZXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBNZXNzYWdlRGlhbG9nLm9wZW5RdWVzdGlvbihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuRGVsZXRlRmVhdHVyZV9kZWxldGVDb25maXJtLCBKUEFFZGl0b3JNZXNzYWdlcy5EZWxldGVSZWxhdGlvbkZlYXR1cmVfZGVsZXRlUmVsYXRpb25RdWVzdGlvbik7Ci0JfQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDBiMzg1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0RpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGlyZWN0RWRpdGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdERpcmVjdEVkaXRpbmdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29udmVudGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0RGlyZWN0RWRpdGluZ0ZlYXR1cmUgewotCQotCXByaXZhdGUgYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCA9IGZhbHNlOwotCi0JcHVibGljIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RWRpdGluZ1R5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1RFWFQ7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRGlyZWN0RWRpdChJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxWYWx1ZShJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlnZXRGZWF0dXJlUHJvdmlkZXIoKS4KLQkJCQkJCQkJCQkJZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJaXNNZXRob2RBbm5vdGF0ZWQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChqcGEpOwotCQlUZXh0IHR4dCA9IChUZXh0KSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5nZXQoMCk7Ci0JCVN0cmluZyB2YWx1ZSA9ICB0eHQuZ2V0VmFsdWUoKTsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKQotCQkJdmFsdWUgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUodmFsdWUpOwkJCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGNoZWNrVmFsdWVWYWxpZChTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChpc01ldGhvZEFubm90YXRlZCkKLQkJCXZhbHVlID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHZhbHVlKTsJCQotCQlJU3RhdHVzIHN0YXR1cyA9IEphdmFDb252ZW50aW9ucy52YWxpZGF0ZUZpZWxkTmFtZSh2YWx1ZSwgSmF2YUNvcmUuVkVSU0lPTl8xXzUsIEphdmFDb3JlLlZFUlNJT05fMV81KTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXN0YXR1cyA9IGNoZWNrRHVwbGljYXRlQXR0cmlidXRlKHZhbHVlLCBjb250ZXh0KTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1cy5nZXRNZXNzYWdlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBjaGVja0R1cGxpY2F0ZUF0dHJpYnV0ZShTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2xkQXQgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0FsID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSgoSmF2YVBlcnNpc3RlbnRUeXBlKW9sZEF0LmdldFBhcmVudCgpKS5nZXRBdHRyaWJ1dGVOYW1lZCh2YWx1ZSk7Ci0JCWlmIChuZXdBbCAhPSBudWxsICYmICFuZXdBbC5lcXVhbHMob2xkQXQpKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX2F0dHJpYnV0ZUV4aXN0cywgdmFsdWUpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKSBzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChpc01ldGhvZEFubm90YXRlZCkKLQkJCXZhbHVlID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHZhbHVlKTsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvbGRBdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQotCQlJUmVsYXRpb24gcmVsID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUob2xkQXQpOwotCQlTdHJpbmcgaW52ZXJzZUpQVE5hbWUgPSBudWxsOwotCQlpZiAoQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UocmVsKSkgCi0JCQlpbnZlcnNlSlBUTmFtZSA9IHJlbC5nZXRJbnZlcnNlKCkuZ2V0TmFtZSgpOwotCQlpZiAob2xkQXQuZ2V0TmFtZSgpLmVxdWFscyh2YWx1ZSkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW5hbWVBdHRyaWJ1dGUob2xkQXQsIHZhbHVlLCBpbnZlcnNlSlBUTmFtZSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJCi0JCWlmIChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZyA9IHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpLmdldCgwKTsKLQkJZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gdmFsdWU7Ci0KLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oYWxnKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJKChUZXh0KSBhbGcpLnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2ZTQ1NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGlyZWN0RWRpdGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdERpcmVjdEVkaXRpbmdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuQ2xhc3NSZWY7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi0KLXB1YmxpYyBjbGFzcyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0RGlyZWN0RWRpdGluZ0ZlYXR1cmUgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFsbG93ZWQgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjEyMzQ1Njc4OTBfIjsJLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkgICAgc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldEVkaXRpbmdUeXBlKCkgewotCSAgICByZXR1cm4gVFlQRV9URVhUOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5EaXJlY3RFZGl0KElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEluaXRpYWxWYWx1ZShJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotCSAgICBTaGFwZSBzaCA9IChTaGFwZSljb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkgICAgQ29udGFpbmVyU2hhcGUgY3NoID0gc2guZ2V0Q29udGFpbmVyKCk7Ci0JICAgIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjc2gpOwotCSAgICByZXR1cm4gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoanB0KSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgY2hlY2tWYWx1ZVZhbGlkKFN0cmluZyB2YWx1ZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJLy9DU04gIzEzMDU2NjQgMjAxMAotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JICAgIENvbnRhaW5lclNoYXBlIGNzaCA9ICgoU2hhcGUpcGUpLmdldENvbnRhaW5lcigpOwkgICAgCi0JICAgIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3NoKTsKLSAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gU2lnbmF0dXJlLmdldFF1YWxpZmllcihqcHQuZ2V0TmFtZSgpKTsKLQkgICAgUGVyc2lzdGVuY2VVbml0IHVuaXQgPSBqcHQuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0gICAgICAgIAotCSAgICBmb3IoQ2xhc3NSZWYgY2xhc3NSZWYgOiB1bml0LmdldENsYXNzUmVmcygpKSB7Ci0JICAgIAlpZihjbGFzc1JlZi5nZXRDbGFzc05hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUgKyBTaWduYXR1cmUuQ19ET1QgKyB2YWx1ZSkgJiYgIShKUEFFZGl0b3JVdGlsLmdldFRleHQoanB0KS5lcXVhbHModmFsdWUpKSl7Ci0JCSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2R1cGxpY2F0ZUVudGl0eU5hbWUsIHBhY2thZ2VOYW1lK3ZhbHVlKTsKLQotCSAgICAJfQotCSAgICB9Ci0JICAgIAotCSAgICBpZiAodmFsdWUubGVuZ3RoKCkgPCAxKQotCSAgICAgICAgcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2NsYXNzTmFtZU1zZzsgCi0JICAgIGlmICh2YWx1ZS5jb250YWlucygiICIpKSAvLyROT04tTkxTLTEkCi0JICAgICAgICByZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfc2NwYWNlc05vdEFsbG93ZWRNc2c7IAotCSAgICBpZiAodmFsdWUuY29udGFpbnMoIlxuIikpIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIHJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9saW5lQnJlYWtzTm90QWxsb3dlZE1zZzsKLQkgICAgaWYodmFsdWUuY29udGFpbnMoInsiKSB8fCB2YWx1ZS5jb250YWlucygifSIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkgICAgCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9icmFjZXNOb3RBbGxvd2VkTXNnOwotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKLQkgICAgCWlmIChhbGxvd2VkLmluZGV4T2YodmFsdWUuY2hhckF0KGkpKSA8IDApCi0JICAgIAkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkRpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2ludmFsaWRTeW1ib2xzTXNnLCB2YWx1ZSk7CQotCSAgICB9Ci0JICAgIHJldHVybiBudWxsOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUsIElEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0KSB7Ci0JICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkgICAgQ29udGFpbmVyU2hhcGUgY3NoID0gKChTaGFwZSlwZSkuZ2V0Q29udGFpbmVyKCk7Ci0JICAgIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjc2gpOwotCSAgICBQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhqcHQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0KLQkgICAgU3RyaW5nIHNwZWNpZmllZEVudGl0eU1hcHBpbmdOYW1lID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0U3BlY2lmaWVkRW50aXR5TmFtZShqcHQpOwotCSAgICBpZihzcGVjaWZpZWRFbnRpdHlNYXBwaW5nTmFtZSA9PSBudWxsKXsKLQkgICAgCVJlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUgZnQgPSBuZXcgUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSwgdmFsdWUpOwotCSAgICAJZnQuZXhlY3V0ZShqcHQpOwotCSAgICAJcmV0dXJuOwotCSAgICB9IGVsc2UgewotCSAgICAKLQkgICAgSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVuYW1lRW50aXR5KGpwdCwgdmFsdWUpOwotLy8JICAgIFByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJCWlmIChKUEFEaWFncmFtUHJvcGVydHlQYWdlLmRvZXNEaXJlY3RlRWRpdGluZ0FmZmVjdENsYXNzTmFtZUJ5RGVmYXVsdChqcHQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSwgcHJvcHMpKSB7Ci0JCQkJUmVuYW1lRW50aXR5V2l0aG91dFVJRmVhdHVyZSBmdCA9IG5ldyBSZW5hbWVFbnRpdHlXaXRob3V0VUlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpLCB2YWx1ZSk7Ci0JCQkJZnQuZXhlY3V0ZShqcHQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCSAgICAKLQkgICAgZmluYWwgR3JhcGhpY3NBbGdvcml0aG0gYWxnID0gcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGFsZyk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJKChUZXh0KSBhbGcpLnNldFZhbHVlKHZhbHVlKTsKLQkJCX0KLQkJfSk7CSAgICAKLQkgICAgCi0JICAgIFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXRzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UmVsYXRlZEF0dHJpYnV0ZXMoanB0KTsKLQkgICAgSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gYXRzLml0ZXJhdG9yKCk7Ci0JICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkgICAgCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXQubmV4dCgpOwotCSAgICAJUGljdG9ncmFtRWxlbWVudCBwZWwgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCSAgICAJU3RyaW5nIG5ld0F0TmFtZSA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWUpOwotCSAgICAJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGF0KSkgCi0JICAgIAkJbmV3QXROYW1lID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5ld0F0TmFtZSk7Ci0JICAgIAl0cnkgewotCQkJCW5ld0F0TmFtZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbmFtZUF0dHJpYnV0ZShhdCwgbmV3QXROYW1lLCBqcHQuZ2V0TmFtZSgpLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSkuZ2V0TmFtZSgpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQl9Ci0JCQkKLQkgICAgCWZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBwZWwuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF0dE5hbWUgPSBuZXdBdE5hbWU7Ci0JICAJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZGl0ID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oYWxnbyk7Ci0JICAJCXRlZGl0LmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkaXQpIHsKLQkgIAkJCUBPdmVycmlkZQotCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkgIAkJCQkoKFRleHQpIGFsZ28pLnNldFZhbHVlKGF0dE5hbWUpOwotCSAgCQkJfQotCSAgCQl9KTsJIAotCSAgICB9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9CQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGI3YjEwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0Rpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotcHVibGljIGNsYXNzIERpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUgZXh0ZW5kcyBSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUgewotCi0JcHVibGljIERpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlybWF0aW9uVGV4dCgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZERpc2NhcmRBbGxFbnRpdGllc0NvbmZpcm1hdGlvbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCU1lc3NhZ2VEaWFsb2cgZGxnID0gbmV3IE1lc3NhZ2VEaWFsb2coRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0U2hlbGxzKClbMF0sIAotCQkJCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQWxsRW50aXRpZXNNZW51LCAKLQkJCQkJCQkJCQkJCW51bGwsIGdldENvbmZpcm1hdGlvblRleHQoKSwgMCwgCi0JCQkJCQkJCQkJCQluZXcgU3RyaW5nW10ge0pQQUVkaXRvck1lc3NhZ2VzLkJUTl9PSywgSlBBRWRpdG9yTWVzc2FnZXMuQlROX0NBTkNFTH0sIERpYWxvZy5DQU5DRUwpOwotCQlpZiAoZGxnLm9wZW4oKSAhPSBEaWFsb2cuT0spCi0JCQlyZXR1cm47CQkKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gdGhpcy5nZXREaWFncmFtKCkuZ2V0Q2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBzaCA9IGl0Lm5leHQoKTsKLQkJCVJlc3RvcmVFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFJlc3RvcmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCUlDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KG5ldyBQaWN0b2dyYW1FbGVtZW50W10geyBzaCB9KTsKLQkJCWZ0LmV4ZWN1dGUoY3R4KTsKLQkJCWFsbFNoYXBlcy5hZGQoc2gpOwotCQl9Ci0JCXN1cGVyLmV4ZWN1dGUoY29udGV4dCk7Ci0JfQkJCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuRGlzY2FyZEFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCQkKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEFsbEVudGl0aWVzRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MDFiNjguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlewotCQkKLQlwdWJsaWMgRXhwYW5kQWxsRW50aXRpZXNGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCQotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlFTGlzdDxTaGFwZT4gc2hhcGVzID0gZGlhZ3JhbS5nZXRDaGlsZHJlbigpOwotCQkJCWZvciAoUGljdG9ncmFtRWxlbWVudCBlbCA6IHNoYXBlcykgewkJCQotCQkJCQlTdHJpbmcgY29sbGFwc2VGZWF0dXJlcyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoZWwsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUyk7Ci0JCQkJCWlmIChjb2xsYXBzZUZlYXR1cmVzICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCQkJCQlpZihibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSl7Ci0JCQkJCQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGVsOwkKLQkJCQkJCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoY29udGFpbmVyU2hhcGUpOwotCQkJCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVFbnRpdHlIZWlndGgoY29udGFpbmVyU2hhcGUpOwotCQkJCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnJlbW92ZVByb3BlcnR5KGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCQkJCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY29udGFpbmVyU2hhcGUsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCQkJCQl9CQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyN2U0MzAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmV7Ci0JCi0JcHVibGljIEV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IGVsID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCi0JCU9iamVjdCBvYiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCWludCBwaWN0b2dyYW1IZWlnaHQgPSBKUEFFZGl0b3JDb25zdGFudHMuQ09NUEFSVE1FTlRfTUlOX0hFSUdIVDsKLQkJaW50IG5ld0hlaWdodCA9IEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9CVVRUT01fT0ZGU0VUOwotCQlmaW5hbCBDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZWw7Ci0JCWlmKG9iID09IG51bGwpCi0JCQluZXdIZWlnaHQgPSBHcmFwaGljc1VwZGF0ZXIuaW5jcmVhc2VDb21wYXJ0bWVudEhlaWd0aChjb250YWluZXJTaGFwZSwgbmV3SGVpZ2h0KTsKLQkJZmluYWwgaW50IHBpY3RIZWlnaHQgPSBwaWN0b2dyYW1IZWlnaHQgKyBuZXdIZWlnaHQ7Ci0gICAgICAgIGZpbmFsIEdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBlbC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgICAgICBmaW5hbCBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9IGNvbnRhaW5lclNoYXBlLmdldENvbnRhaW5lcigpOwotICAgICAgICBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihhbGdvKTsKLSAgICAgICAgdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCSAgICAgICAgYWxnby5zZXRIZWlnaHQocGljdEhlaWdodCk7Ci0JCSAgICAgICAgaW50IGhlaWdodCA9IEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCkgKwotCQkgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIAotCQkgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc1VwZGF0ZXIuZ2V0QmFzaWNTaGFwZShlbnRpdHlTaGFwZSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVDsKLQkJICAgICAgICAKLQkJICAgICAgICBpZihoZWlnaHQ+ZW50aXR5U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSl7Ci0JCSAgICAgICAgCUlDdXN0b21Db250ZXh0IGNvbnQgPSBuZXcgQ3VzdG9tQ29udGV4dChuZXcgUGljdG9ncmFtRWxlbWVudFtdIHtlbnRpdHlTaGFwZX0pOwotCQkgICAgICAgIAlJQ3VzdG9tRmVhdHVyZSBleHBhbmRFbnRpdHkgPSBuZXcgRXhwYW5kRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCSAgICAgICAgCWV4cGFuZEVudGl0eS5leGVjdXRlKGNvbnQpOwotCQkgICAgICAgIH0KLQkJICAgICAgICBHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUdyYXBoaWNzVXBkYXRlci5zZXRDb2xsYXBzZWQoY29udGFpbmVyU2hhcGUsIGZhbHNlKTsKLQkJCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGVudGl0eVNoYXBlLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSwgZmFsc2UpOwkJCQkKLQkJCX0KLSAgICAgICAgfSk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlib29sZWFuIHJldCA9IGZhbHNlOwotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIElDdXN0b21Db250ZXh0KSB7Ci0JCQlQaWN0b2dyYW1FbGVtZW50W10gcGVzID0gKChJQ3VzdG9tQ29udGV4dCkgY29udGV4dCkuZ2V0UGljdG9ncmFtRWxlbWVudHMoKTsKLQkJCWlmIChwZXMgIT0gbnVsbCAmJiBwZXMubGVuZ3RoID4gMCkgewotCQkJCWJvb2xlYW4gZXhwYW5kUG9zc2libGUgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcGVzW2ldOwotCQkJCQlPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQkJCQlpZiAoYm8gIT0gbnVsbCkgewotCQkJCQkJZXhwYW5kUG9zc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIWV4cGFuZFBvc3NpYmxlKSB7Ci0JCQkJCQlpZiAoR3JhcGhpY3NVcGRhdGVyLmlzQ29sbGFwc2VkKChDb250YWluZXJTaGFwZSlwZSkpIHsKLQkJCQkJCQlleHBhbmRQb3NzaWJsZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV4cGFuZFBvc3NpYmxlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXQ7Ci0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0V4cGFuZEVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1MmQyNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9FeHBhbmRFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgRXhwYW5kRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZXsKLQkJCi0JcHVibGljIEV4cGFuZEVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlmaW5hbCBQaWN0b2dyYW1FbGVtZW50IGVsID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCi0JCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChlbCk7Ci0JCWlmKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKXsKLQkJZmluYWwgQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGVsOwotCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjb250YWluZXJTaGFwZSk7Ci0JCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0KLQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUVudGl0eVNoYXBlKGNvbnRhaW5lclNoYXBlKTsKLQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUVudGl0eUhlaWd0aChjb250YWluZXJTaGFwZSk7Ci0JCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnJlbW92ZVByb3BlcnR5KGVsLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMpOwotCi0JCQkJCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY29udGFpbmVyU2hhcGUsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJQ3VzdG9tQ29udGV4dCkgewotCQkJUGljdG9ncmFtRWxlbWVudFtdIHBlcyA9ICgoSUN1c3RvbUNvbnRleHQpIGNvbnRleHQpLmdldFBpY3RvZ3JhbUVsZW1lbnRzKCk7Ci0JCQlpZiAocGVzICE9IG51bGwgJiYgcGVzLmxlbmd0aCA+IDApIHsKLQkJCQlib29sZWFuIGV4cGFuZFBvc3NpYmxlID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHBlc1tpXTsKLQkJCQkJT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCQkJaWYgKCEoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQkJaWYgKCFleHBhbmRQb3NzaWJsZSkgewotCQkJCQkJUHJvcGVydHkgcHJvcGVydHkgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eShwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTKTsKLQkJCQkJCWlmIChwcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQkJCQkJZXhwYW5kUG9zc2libGUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChleHBhbmRQb3NzaWJsZSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eU1lbnVJdGVtOwotCX0KLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVkM2U4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0dyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEFkZFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5XcnA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHMuU2hhcGVUeXBlOwotCi0KLXB1YmxpYyBjbGFzcyBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RBZGRTaGFwZUZlYXR1cmUgewotCi0JcHVibGljIEdyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIFBpY3RvZ3JhbUVsZW1lbnQgYWRkKGZpbmFsIElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSBjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpOwotCQlmaW5hbCBXcnAgd3JwID0gbmV3IFdycCgpOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihlbnRpdHlTaGFwZSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHIgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGNvbnRleHQuZ2V0TmV3T2JqZWN0KCk7Ci0JCQkJU3RyaW5nIHR4dCA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChuZXdBdHRyKTsKLQkJCQlIYXNoU2V0PFN0cmluZz4gYW5ub3RzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG5ld0F0dHIpOwotCQkJCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IG51bGw7Ci0JCQkJQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldFByaW1hcnlTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRSZWxhdGlvblNoYXBlKGVudGl0eVNoYXBlKTsKLQkJCQlDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldEJhc2ljU2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCXRleHRTaGFwZSA9IGFkZEF0dHJpYnV0ZVRvUHJvcGVybHlTaGFwZShlbnRpdHlTaGFwZSwgdHh0LCBhbm5vdHMsIHByaW1hcnlTaGFwZSwgcmVsYXRpb25TaGFwZSwgYmFzaWNTaGFwZSk7Ci0JCQkJbGluayh0ZXh0U2hhcGUsIG5ld0F0dHIpOwotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQkJCXdycC5zZXRPYmoodGV4dFNoYXBlKTsKLQkJCX0KLQkJCQotCQl9KTsKLQkJcmV0dXJuIChQaWN0b2dyYW1FbGVtZW50KXdycC5nZXRPYmooKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEF0dHJpYnV0ZVRvUHJvcGVybHlTaGFwZShDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSwgU3RyaW5nIHR4dCwgSGFzaFNldDxTdHJpbmc+IGFubm90cywKLQkJCUNvbnRhaW5lclNoYXBlIHByaW1hcnlTaGFwZSwgQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSwgQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSkgewotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSBudWxsOwotCQlpZiAoYW5ub3RzLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lEKSB8fCBhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERURfSUQpKSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgcHJpbWFyeVNoYXBlKTsKLQkJfSBlbHNlIGlmIChhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKQotCQkJCXx8IGFubm90cy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkKLQkJCQl8fCBhbm5vdHMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpCi0JCQkJfHwgYW5ub3RzLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpKSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgcmVsYXRpb25TaGFwZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGVUb1NoYXBlKGVudGl0eVNoYXBlLCB0eHQsIGFubm90cywgYmFzaWNTaGFwZSk7Ci0JCX0KLQkJcmV0dXJuIHRleHRTaGFwZTsKLQl9Ci0KLQlwcml2YXRlIENvbnRhaW5lclNoYXBlIGFkZEF0dHJpYnV0ZVRvU2hhcGUoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIFN0cmluZyB0eHQsIEhhc2hTZXQ8U3RyaW5nPiBhbm5vdHMsCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSkgewotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSBudWxsOwotCQlpbnQgY2hpbGRyZW5TaXplQmVmb3JlID0gY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKS5zaXplKCk7Ci0JCWludCBjb250YWluZXJIZWlnaHRCZWZvcmUgPSBjb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpOwotCQl0ZXh0U2hhcGUgPSBhZGRBdHRyaWJ1dGUoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGNvbnRhaW5lclNoYXBlLCB0eHQsIGFubm90cyk7Ci0KLQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUNvbnRhaW5lcihjb250YWluZXJTaGFwZSwgY2hpbGRyZW5TaXplQmVmb3JlLCBjb250YWluZXJIZWlnaHRCZWZvcmUpOwotCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5U2hhcGUoZW50aXR5U2hhcGUpOwotCi0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyU2hhcGUgYWRkQXR0cmlidXRlKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLAotCQkJU3RyaW5nIGF0dHJpYlR4dCwgSGFzaFNldDxTdHJpbmc+IGFubm90YXRpb25zKSB7Ci0KLQkJaW50IHdpZHRoID0gY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRXaWR0aCgpOwotCQlDb250YWluZXJTaGFwZSBpY29uU2hhcGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb250YWluZXJTaGFwZShjb250YWluZXJTaGFwZSwgZmFsc2UpOwotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGljb25TaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSwgU2hhcGVUeXBlLklDT04udG9TdHJpbmcoKSk7Ci0JCWludCBhdHRyaWJJbmRleCA9IGZwLmdldEF0dHJpYnNOdW0oY29udGFpbmVyU2hhcGUpOwotCQlSZWN0YW5nbGUgaWNvblJlY3QgPSBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmFkZFJlY3RhbmdsZUZvckljb24oaWNvblNoYXBlLCBhdHRyaWJJbmRleCk7Ci0JCUltYWdlIGljb24gPSBudWxsOwotCQlPYmplY3Qgb2IgPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY29udGFpbmVyU2hhcGUuZ2V0Q29udGFpbmVyKCkpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlvYjsKLQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCk7IAotCQlib29sZWFuIGlzQ29sbGVjdGlvbiA9IGlzTWV0aG9kQW5ub3RhdGVkID8gCi0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNHZXR0ZXJNZXRob2RSZXR1cm5UeXBlQ29sbGVjdGlvbihjb250YWluZXJTaGFwZS5nZXRDb250YWluZXIoKSwgZnAsIGF0dHJpYlR4dCkgOgotCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzQ29sbGVjdGlvbihjb250YWluZXJTaGFwZS5nZXRDb250YWluZXIoKSwgZnAsIGF0dHJpYlR4dCk7IAotCQlpZiAoaXNDb2xsZWN0aW9uICYmIGFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fVU5NQVBQRUQpOwotCQl9IGVsc2V7Ci0JCSAgICBpY29uID0gSlBBRWRpdG9yVXRpbC5jcmVhdGVBdHRyaWJ1dGVJY29uKGljb25SZWN0LCBhbm5vdGF0aW9ucyk7Ci0JCX0KLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKGljb24sIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1gsIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1ksCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLklDT05fV0lEVEgsIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX0hFSUdIVCk7Ci0JCUNvbnRhaW5lclNoYXBlIHRleHRTaGFwZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbnRhaW5lclNoYXBlKGNvbnRhaW5lclNoYXBlLCBmYWxzZSk7Ci0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUodGV4dFNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFLCBTaGFwZVR5cGUuQVRUUklCVVRFLnRvU3RyaW5nKCkpOwotCQlSZWN0YW5nbGUgdGV4dFJlY3RhbmdsZSA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkUmVjdGFuZ2xlRm9yVGV4dCh0ZXh0U2hhcGUsIGF0dHJpYkluZGV4LCB3aWR0aCk7Ci0JCXRleHRTaGFwZS5zZXRBY3RpdmUodHJ1ZSk7Ci0JCVRleHQgdGV4dCA9IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkVGV4dChmcCwgdGV4dFJlY3RhbmdsZSwgYXR0cmliVHh0KTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgodGV4dCwgd2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKHRleHQsIDEsIC0yLCB3aWR0aAotCQkJCS0gSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUiwgSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9SRUNUX0hFSUdIVCk7Ci0JCWZwLmluY3JlYXNlQXR0cmlic051bShjb250YWluZXJTaGFwZSk7Ci0JCXJldHVybiB0ZXh0U2hhcGU7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkFkZChJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ4Y2RmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0dyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5HcmFwaGljc1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotY2xhc3MgR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0KLQlwdWJsaWMgR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCWlmIChwZSA9PSBudWxsKSAKLQkJCXJldHVybjsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gIFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBlKTsKLQkJaWYgKHRlZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCVNoYXBlIHNoID0gKFNoYXBlKSBwZTsKLQkJCQlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2gpOwotCQkJCWlmICgoYm8gPT0gbnVsbCkgfHwgKCFKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MuaXNJbnN0YW5jZShibykpKQotCQkJCQlyZXR1cm47Ci0JCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIHBlOwotCQkJCUNvbnRhaW5lclNoYXBlIHByaW1TaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoZW50aXR5U2hhcGUpOwotCQkJCUNvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUgPSBHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQkJQ29udGFpbmVyU2hhcGUgYmFzaWNTaGFwZSA9IEdyYXBoaWNzVXBkYXRlci5nZXRCYXNpY1NoYXBlKGVudGl0eVNoYXBlKTsKLQotCQkJCXJlbW92ZUNvbXBhcnRtZW50Q2hpbGRyZW4ocHJpbVNoYXBlKTsKLQkJCQlyZW1vdmVDb21wYXJ0bWVudENoaWxkcmVuKHJlbGF0aW9uU2hhcGUpOwotCQkJCXJlbW92ZUNvbXBhcnRtZW50Q2hpbGRyZW4oYmFzaWNTaGFwZSk7Ci0KLQkJCQlyZWFkZENvbXBhcnRtZW50c0NoaWxkcmVuKChKYXZhUGVyc2lzdGVudFR5cGUpIGJvLCBlbnRpdHlTaGFwZSwgcHJpbVNoYXBlLCByZWxhdGlvblNoYXBlLCBiYXNpY1NoYXBlKTsKLQotCQkJCWxheW91dFBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQkJCXJlY29ubmVjdCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibyk7Ci0JCQl9Ci0JCX0pOwkJCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvbm5lY3QoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucHJvZHVjZUFsbFJlbGF0aW9ucyhqcHQsIGZwKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQlJdGVyYXRvcjxJUmVsYXRpb24+IGl0ID0gcmVscy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXQubmV4dCgpOwotCQkJQWRkUmVsYXRpb25GZWF0dXJlIHJlbEYgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGZwKTsKLQkJCUFuY2hvckNvbnRhaW5lciBhY1NvdXJjZSA9IChBbmNob3JDb250YWluZXIpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwuZ2V0T3duZXIoKSk7Ci0JCQlBbmNob3JDb250YWluZXIgYWNUYXJnZXQgPSAoQW5jaG9yQ29udGFpbmVyKSBmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsLmdldEludmVyc2UoKSk7Ci0JCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoYWNTb3VyY2UuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpLCBhY1RhcmdldAotCQkJCQkuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCkubmV4dCgpKTsKLQkJCWN0eC5zZXROZXdPYmplY3QocmVsKTsKLQkJCXJlbEYuYWRkKGN0eCk7Ci0vLwkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChmcCwganB0KTsKLQkJfQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JcHJpdmF0ZSB2b2lkIHJlYWRkQ29tcGFydG1lbnRzQ2hpbGRyZW4oSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsCi0JCQlDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGUsIENvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUsIENvbnRhaW5lclNoYXBlIGJhc2ljU2hhcGUpIHsKLQotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIHVwZGF0ZUZlYXR1cmUgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCXVwZGF0ZUZlYXR1cmUuYWRkU2VwYXJhdG9yc1RvU2hhcGUocHJpbWFyeVNoYXBlKTsKLQkJdXBkYXRlRmVhdHVyZS5hZGRTZXBhcmF0b3JzVG9TaGFwZShyZWxhdGlvblNoYXBlKTsKLQkJdXBkYXRlRmVhdHVyZS5hZGRTZXBhcmF0b3JzVG9TaGFwZShiYXNpY1NoYXBlKTsKLQotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSA6IGphdmFQZXJzaXN0ZW50VHlwZS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCXVwZGF0ZUZlYXR1cmUuYWRkQXR0cmlidXRlcyhlbnRpdHlTaGFwZSwgYXR0cmlidXRlKTsKLQotCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkucmVuZXdBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUxpc3RlbmVyKGF0dHJpYnV0ZSk7Ci0JCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5hZGRKUFRGb3JVcGRhdGUoamF2YVBlcnNpc3RlbnRUeXBlLmdldE5hbWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ29tcGFydG1lbnRDaGlsZHJlbihDb250YWluZXJTaGFwZSBjb21wYXJ0bWVudFNoYXBlKSB7Ci0JCWludCB5ID0gMDsKLQkJTGlzdDxTaGFwZT4gY2hpbGRyZW4gPSBjb21wYXJ0bWVudFNoYXBlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3IEFycmF5TGlzdDxTaGFwZT4oY29tcGFydG1lbnRTaGFwZS5nZXRDaGlsZHJlbigpKS5zaXplKCk7IGkrKykgewotCQkJU2hhcGUgc2hhcGUgPSBjb21wYXJ0bWVudFNoYXBlLmdldENoaWxkcmVuKCkuZ2V0KGkpOwotCQkJeSA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WSgpOwotCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChzaGFwZSk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEF0dHJpYnNOdW0oY29tcGFydG1lbnRTaGFwZSk7IGkgPiAwOyBpLS0pIHsKLQkJCVNoYXBlIHNoYXBlID0gY29tcGFydG1lbnRTaGFwZS5nZXRDaGlsZHJlbigpLmdldChpKTsKLQkJCXkgPSBzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKTsKLQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoc2hhcGUpOwotCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZGVjcmVhc2VBdHRyaWJzTnVtKGNvbXBhcnRtZW50U2hhcGUpOwotCQl9Ci0JCWNoaWxkcmVuID0gY29tcGFydG1lbnRTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlzaGlmdFVwTG93ZXJBdHRyaWJzKHksIGNoaWxkcmVuKTsKLQkJY29tcGFydG1lbnRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLnNldEhlaWdodCgwKTsKLQl9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNoaWZ0VXBMb3dlckF0dHJpYnMoaW50IHksIExpc3Q8U2hhcGU+IGNoaWxkcmVuKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6ZSgpOyBpKyspIHsKLQkJCVNoYXBlIHNocCA9IGNoaWxkcmVuLmdldChpKTsKLQkJCWlmIChzaHAgIT0gbnVsbCkgewotCQkJCWludCBnclkgPSBjaGlsZHJlbi5nZXQoaSkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCk7Ci0JCQkJaWYgKGdyWSA+IHkpIHsKLQkJCQkJY2hpbGRyZW4uZ2V0KGkpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuc2V0WShnclkgLSBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFU19QTEFDRU1FTlRfU1RFUCk7Ci0JCQkJfQotCQkJCWNoaWxkcmVuLmdldChpKS5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGNoaWxkcmVuLmdldChpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9KUEFNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0pQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTgwZTk1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0pQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkRlZmF1bHRNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmU7Ci0KLXB1YmxpYyBjbGFzcyBKUEFNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmUgZXh0ZW5kcwotCQlEZWZhdWx0TW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlIHsKLQotCXB1YmxpYyBKUEFNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbk1vdmVDb25uZWN0aW9uRGVjb3JhdG9yKAotCQkJSU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTGF5b3V0SlBBRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTGF5b3V0SlBBRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWVhZTRmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL0xheW91dEpQQUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmRhdGF0eXBlcy5JRGltZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUxheW91dENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdExheW91dEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklHcmFwaGljc1VwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JUGVTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLQotCi1wdWJsaWMgY2xhc3MgTGF5b3V0SlBBRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0TGF5b3V0RmVhdHVyZSB7Ci0KLQlwcml2YXRlIElQZVNlcnZpY2VVdGlsIHBlVXRpbCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgTGF5b3V0SlBBRW50aXR5RmVhdHVyZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0gICAgICAgIHN1cGVyKGZwKTsKLSAgICAgICAgcGVVdGlsID0gZnAuZ2V0UGVVdGlsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuTGF5b3V0KElMYXlvdXRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICBPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgICAgICByZXR1cm4gKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBsYXlvdXQoSUxheW91dENvbnRleHQgY29udGV4dCkgewotCQlib29sZWFuIGFueXRoaW5nQ2hhbmdlZCA9IGZhbHNlOwotCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSkgY29udGV4dAotCQkJCS5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGNvbnRhaW5lckdhID0gY29udGFpbmVyU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQotCQlpZihjb250YWluZXJHYS5nZXRIZWlnaHQoKSA8IEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVCl7Ci0JCQljb250YWluZXJHYS5zZXRIZWlnaHQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKTsKLQkJfQotCQkKLQkJY29uZmlndXJlRW50aXR5Q29sbGFwc2VFeHBhbmRQcm9wZXJ0eShjb250YWluZXJTaGFwZSwgY29udGFpbmVyR2EpOwotCQkKLQkJaWYgKGNvbnRhaW5lckdhLmdldFdpZHRoKCkgPCBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9XSURUSCkgewotCQkJY29udGFpbmVyR2Euc2V0V2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fV0lEVEgpOwotCQkJYW55dGhpbmdDaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpbnQgY29udGFpbmVyV2lkdGggPSBjb250YWluZXJHYS5nZXRXaWR0aCgpOwotCQlJdGVyYXRvcjxTaGFwZT4gaXRlciA9IGNvbnRhaW5lclNoYXBlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBzaGFwZSA9IGl0ZXIubmV4dCgpOwotCQkJYW55dGhpbmdDaGFuZ2VkID0gbGF5b3V0Q29udGFpbmVyRW50aXR5Q2hpbGRyZW4oYW55dGhpbmdDaGFuZ2VkLAotCQkJCQljb250YWluZXJXaWR0aCwgc2hhcGUpOwotCi0JCX0KLQkJUHJvcGVydHkgcHJvcGVydHkgPSBwZVV0aWwuZ2V0UHJvcGVydHkoY29udGFpbmVyU2hhcGUsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUyk7Ci0JCWlmIChwcm9wZXJ0eSA9PSBudWxsKSB7Ci0JCQlJR3JhcGhpY3NVcGRhdGVyIGd1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0R3JhcGhpY3NVcGRhdGVyKCk7Ci0JCQlndS51cGRhdGVFbnRpdHlIZWlndGgoY29udGFpbmVyU2hhcGUpOwotCQl9Ci0KLQkJcmV0dXJuIGFueXRoaW5nQ2hhbmdlZDsKLQl9Ci0KLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUVudGl0eUNvbGxhcHNlRXhwYW5kUHJvcGVydHkoCi0JCQlDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwgR3JhcGhpY3NBbGdvcml0aG0gY29udGFpbmVyR2EpIHsKLQkJaWYoY29udGFpbmVyR2EuZ2V0SGVpZ2h0KCkgPT0gSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKXsKLQkJCXBlVXRpbC5zZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lclNoYXBlLCBKUEFFZGl0b3JDb25zdGFudHMuQ09MTEFQU0VfRkVBVFVSRVMsIFN0cmluZy52YWx1ZU9mKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTUlOX0hFSUdIVCkpOwotCQl9Ci0JCWVsc2UgaWYoY29udGFpbmVyR2EuZ2V0SGVpZ2h0KCk+SlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9NSU5fSEVJR0hUKXsKLQkJCXBlVXRpbC5yZW1vdmVQcm9wZXJ0eShjb250YWluZXJTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTExBUFNFX0ZFQVRVUkVTKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsYXlvdXRDb250YWluZXJFbnRpdHlDaGlsZHJlbihib29sZWFuIGFueXRoaW5nQ2hhbmdlZCwKLQkJCWludCBjb250YWluZXJXaWR0aCwgU2hhcGUgc2hhcGUpIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhcGhpY3NBbGdvcml0aG0gPSBzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlJRGltZW5zaW9uIHNpemUgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jYWxjdWxhdGVTaXplKGdyYXBoaWNzQWxnb3JpdGhtKTsKLQkJaWYgKGNvbnRhaW5lcldpZHRoICE9IHNpemUuZ2V0V2lkdGgoKSkgewotCQkJaWYgKGdyYXBoaWNzQWxnb3JpdGhtIGluc3RhbmNlb2YgUG9seWxpbmUpIHsKLQkJCQlhbnl0aGluZ0NoYW5nZWQgPSBsYXlvdXRQb2x5bGluZShjb250YWluZXJXaWR0aCwKLQkJCQkJCWdyYXBoaWNzQWxnb3JpdGhtKTsKLQkJCX0gZWxzZSBpZiAoZ3JhcGhpY3NBbGdvcml0aG0gaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHsKLQkJCQkKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IChSZWN0YW5nbGUpIGdyYXBoaWNzQWxnb3JpdGhtOwotCQkJCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdyYSA9IHJlY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotCQkJCUl0ZXJhdG9yPEdyYXBoaWNzQWxnb3JpdGhtPiBpdCA9IGdyYS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3IgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChnciBpbnN0YW5jZW9mIEltYWdlKXsKLQkJCQkJCWxheW91dEhlYWRlckljb24oc2hhcGUsIGdyYXBoaWNzQWxnb3JpdGhtKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChnciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJCVRleHQgdHh0ID0gKFRleHQpIGdyOwotCQkJCQkJaWYoIXR4dC5nZXRGb250KCkuaXNJdGFsaWMoKSl7Ci0JCQkJCQkgICAgbGF5b3V0SGVhZGVyVGV4dChjb250YWluZXJXaWR0aCwgZ3JhcGhpY3NBbGdvcml0aG0sIGdyKTsKLQkJCQkJCX1lbHNlewotCQkJCQkJCWxheW91dEF0dHJpYnV0ZXNHcm91cHMoYW55dGhpbmdDaGFuZ2VkLCBnciwgY29udGFpbmVyV2lkdGgpOwotCQkJCQkJfQotCQkJCQl9CQkJCQkKLQkJCQl9Ci0JCQkJYW55dGhpbmdDaGFuZ2VkID0gdHJ1ZTsKLQkJCX0gCi0JCX0KLQkJcmV0dXJuIGFueXRoaW5nQ2hhbmdlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0SGVhZGVyVGV4dChpbnQgY29udGFpbmVyV2lkdGgsCi0JCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSwgR3JhcGhpY3NBbGdvcml0aG0gZ3IpIHsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sCi0JCQkJCQljb250YWluZXJXaWR0aCAtIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChnciwgY29udGFpbmVyV2lkdGggLSBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0SGVhZGVySWNvbihTaGFwZSBzaGFwZSwKLQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWNzQWxnb3JpdGhtKSB7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGhlYWRlckljb25HcmFwaGljc0FsZyA9IHNoYXBlCi0JCQkJLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyYXBoaWNzQWxnb3JpdGhtLCBKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX0lDT05fUkVDVF9XSURUSCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGhlYWRlckljb25HcmFwaGljc0FsZywgSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9JQ09OX1JFQ1RfSEVJR0hUKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbGF5b3V0UG9seWxpbmUoaW50IGNvbnRhaW5lcldpZHRoLAotCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhcGhpY3NBbGdvcml0aG0pIHsKLQkJYm9vbGVhbiBhbnl0aGluZ0NoYW5nZWQ7Ci0JCVBvbHlsaW5lIGhlYWRlckJvdHRvbUxpbmUgPSAoUG9seWxpbmUpIGdyYXBoaWNzQWxnb3JpdGhtOwotCQlQb2ludCBzZWNvbmRQb2ludCA9IGhlYWRlckJvdHRvbUxpbmUuZ2V0UG9pbnRzKCkuZ2V0KDEpOwotCQlQb2ludCBuZXdTZWNvbmRQb2ludCA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvaW50KC8qIGhlYWRlckJvdHRvbUxpbmUsICovCi0JCQkJY29udGFpbmVyV2lkdGgsIHNlY29uZFBvaW50LmdldFkoKSk7Ci0JCWhlYWRlckJvdHRvbUxpbmUuZ2V0UG9pbnRzKCkuc2V0KDEsIG5ld1NlY29uZFBvaW50KTsKLQkJYW55dGhpbmdDaGFuZ2VkID0gdHJ1ZTsKLQkJcmV0dXJuIGFueXRoaW5nQ2hhbmdlZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0QXR0cmlidXRlc0dyb3Vwcyhib29sZWFuIGFueXRoaW5nQ2hhbmdlZCwgR3JhcGhpY3NBbGdvcml0aG0gZ3JhcGhpY3NBbGdvcml0aG0sCi0JCQlpbnQgY29udGFpbmVyV2lkdGgpIHsKLQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFjdGl2ZUNvbnRhaW5lclBlKGdyYXBoaWNzQWxnb3JpdGhtKTsKLQkJbGF5b3V0Q29uY3JldGVDb21wYXJ0bWVudFNoYXBlKGFueXRoaW5nQ2hhbmdlZCwgY29udGFpbmVyU2hhcGUsIGNvbnRhaW5lcldpZHRoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0Q29uY3JldGVDb21wYXJ0bWVudFNoYXBlKGJvb2xlYW4gYW55dGhpbmdDaGFuZ2VkLCBDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwKLQkJCWludCBjb250YWluZXJXaWR0aCkgewotCi0JCWxheW91dENvbXBhcnRtZW50U2hhcGUoY29udGFpbmVyU2hhcGUsIGNvbnRhaW5lcldpZHRoKTsKLQotCQlJdGVyYXRvcjxTaGFwZT4gaXRlciA9IGNvbnRhaW5lclNoYXBlLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHNoYXBlID0gaXRlci5uZXh0KCk7Ci0JCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCQlpZiAoZ3JhcGhpY3NBbGdvcml0aG0gaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHsKLQkJCQlSZWN0YW5nbGUgcmVjdCA9IChSZWN0YW5nbGUpIGdyYXBoaWNzQWxnb3JpdGhtOwotCQkJCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdyYSA9IHJlY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotCQkJCWlmKGdyYS5pc0VtcHR5KCkpewotCQkJCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChncmFwaGljc0FsZ29yaXRobSwgY29udGFpbmVyV2lkdGgpOwotCQkJCX0KLQkJCQlJdGVyYXRvcjxHcmFwaGljc0FsZ29yaXRobT4gaXQgPSBncmEuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUdyYXBoaWNzQWxnb3JpdGhtIGdyID0gaXQubmV4dCgpOwotCQkJCQlpZiAoZ3IgaW5zdGFuY2VvZiBJbWFnZSkgewotCQkJCQkJbGF5b3V0QXR0cmlidXRlSWNvbihzaGFwZSwgZ3JhcGhpY3NBbGdvcml0aG0pOwotCQkJCQl9Ci0JCQkJCWlmIChnciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJCWxheW91dEF0dHJpYnV0ZVRleHQoY29udGFpbmVyV2lkdGgsIGdyYXBoaWNzQWxnb3JpdGhtLCBncik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYW55dGhpbmdDaGFuZ2VkID0gdHJ1ZTsKLQkJCX0gCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGF5b3V0QXR0cmlidXRlVGV4dChpbnQgY29udGFpbmVyV2lkdGgsCi0JCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSwgR3JhcGhpY3NBbGdvcml0aG0gZ3IpIHsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0V2lkdGgoZ3JhcGhpY3NBbGdvcml0aG0sCi0JCQkJCQljb250YWluZXJXaWR0aCAtIEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChnciwKLQkJCQkJCWNvbnRhaW5lcldpZHRoIC0gSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9URVhUX1JFQ1RfV0lEVEhfUkVEVUNFUik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxheW91dEF0dHJpYnV0ZUljb24oU2hhcGUgc2hhcGUsCi0JCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSkgewkJCi0JCUdyYXBoaWNzQWxnb3JpdGhtIGhlYWRlckljb25HcmFwaGljc0FsZyA9IHNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyYXBoaWNzQWxnb3JpdGhtLEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1JFQ1RfV0lEVEgpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRXaWR0aChoZWFkZXJJY29uR3JhcGhpY3NBbGcsIEpQQUVkaXRvckNvbnN0YW50cy5JQ09OX1JFQ1RfV0lEVEgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsYXlvdXRDb21wYXJ0bWVudFNoYXBlKENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLAotCQkJaW50IGNvbnRhaW5lcldpZHRoKSB7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdyYXBoaWMgPSBjb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBncmFwaGljcyA9IGdyYXBoaWMuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotCQlJdGVyYXRvcjxHcmFwaGljc0FsZ29yaXRobT4gaXRlcmF0b3IgPSBncmFwaGljcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlHcmFwaGljc0FsZ29yaXRobSBncmFwaGljc0FsZ29yaXRobSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyYXBoaWMsIGNvbnRhaW5lcldpZHRoKTsKLQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldFdpZHRoKGdyYXBoaWNzQWxnb3JpdGhtLCBjb250YWluZXJXaWR0aCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL01vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9Nb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDllNjM5Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL01vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklNb3ZlU2hhcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuRGVmYXVsdE1vdmVTaGFwZUZlYXR1cmU7Ci0KLS8qCi0gKiBUaGUgYXR0cmlidXRlIHNoYXBlcyAocmVzaWRpbmcgd2l0aGluIHRoZSBlbnRpdHkgc2hhcGVzKSAKLSAqIGFyZSBOT1Qgc3VwcG9zZWQgdG8gYmUgbW92ZWFibGUgKGF0IGxlYXN0IC0gbm90IGJ5IAotICogZHJhZy1hbmQtZHJvcCkuIFRoZSBvbmx5IHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byAKLSAqIGRpc2FibGUgdGhpcyBhYmlsaXR5Ci0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgTW92ZUF0dHJpYnV0ZUZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0TW92ZVNoYXBlRmVhdHVyZSB7Ci0JcHVibGljIE1vdmVBdHRyaWJ1dGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotICAgIHB1YmxpYyBib29sZWFuIGNhbk1vdmVTaGFwZShJTW92ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0F2YWlsYWJsZShJQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCXJldHVybiBmYWxzZTsKLSAgICB9CQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL01vdmVFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYmYzY2EuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnJlZmFjdG9yaW5nLnJlb3JnLlJlb3JnTW92ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIE1vdmVFbnRpdHlGZWF0dXJlIGV4dGVuZHMgUmVmYWN0b3JFbnRpdHlGZWF0dXJlIHsJCi0JCi0JcHVibGljIE1vdmVFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlJV29ya2JlbmNoU2l0ZSB3cyA9ICgoSUVkaXRvclBhcnQpZ2V0RGlhZ3JhbUVkaXRvcigpKS5nZXRTaXRlKCk7Ci0JCVJlb3JnTW92ZUFjdGlvbiBhY3Rpb24gPSBuZXcgUmVvcmdNb3ZlQWN0aW9uKHdzKTsKLQkJZXhlY3V0ZShjb250ZXh0LCBhY3Rpb24sIGN1KTsKLQl9Ci0JCi0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuTW92ZUVudGl0eUZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbjsKLQl9Ci0JCi0JCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eVNoYXBlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvTW92ZUVudGl0eVNoYXBlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDE2N2E3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL01vdmVFbnRpdHlTaGFwZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU1vdmVTaGFwZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0TW92ZVNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLQotCi1wdWJsaWMgY2xhc3MgTW92ZUVudGl0eVNoYXBlRmVhdHVyZSBleHRlbmRzIERlZmF1bHRNb3ZlU2hhcGVGZWF0dXJlIHsKLQotCXB1YmxpYyBNb3ZlRW50aXR5U2hhcGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBtb3ZlQWxsQmVuZHBvaW50cyhJTW92ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHBvc3RNb3ZlU2hhcGUoSU1vdmVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCQlDb250YWluZXJTaGFwZSBjcyA9IChDb250YWluZXJTaGFwZSljb250ZXh0LmdldFNoYXBlKCk7Ci0JCUpQQUVkaXRvclV0aWwucmVhcnJhbmdlQWxsQ29ubmVjdGlvbnMoY3MsIGdldEZlYXR1cmVQcm92aWRlcigpLCBmYWxzZSk7Ci0JCUNvbGxlY3Rpb248Q29udGFpbmVyU2hhcGU+IGNzcyA9IEpQQUVkaXRvclV0aWwuZ2V0UmVsYXRlZFNoYXBlcyhjcyk7Ci0JCUl0ZXJhdG9yPENvbnRhaW5lclNoYXBlPiBjc0l0ID0gY3NzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjc0l0Lmhhc05leHQoKSkgewotCQkJQ29udGFpbmVyU2hhcGUgY3MxID0gY3NJdC5uZXh0KCk7Ci0JCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGNzMSwgZ2V0RmVhdHVyZVByb3ZpZGVyKCksIHRydWUpOwotCQl9Ci0JfQkKLQkKLQkJQE92ZXJyaWRlCi0JIAlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbE1vdmUoZmluYWwgSU1vdmVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCSAJCVBpY3RvZ3JhbUVsZW1lbnQgZWwgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkgCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihlbCk7Ci0JIAkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JIAkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkgCQkJICAgbW92ZShjb250ZXh0KTsKLQkgCQkJfQotCSAJCX0pOwotCSAJfQotCSAJCi0JIAlwdWJsaWMgdm9pZCBtb3ZlKElNb3ZlU2hhcGVDb250ZXh0IGNvbnRleHQpewotCSAJCXN1cGVyLmludGVybmFsTW92ZShjb250ZXh0KTsKLQkgCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAgKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmY4ODFjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL09wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIE9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCQotCXB1YmxpYyBPcGVuSlBBRGV0YWlsc1ZpZXdGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQl0cnkgewotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuCi0JCQkJCXNob3dWaWV3KEpQQUVkaXRvckNvbnN0YW50cy5JRF9WSUVXX0pQQV9ERVRBSUxTKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2FuJ3Qgb3BlbiBKUEEgRGV0YWlscyB2aWV3IiwgZSk7ICAvLyROT04tTkxTLTEkCQkgCQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5KUEFEZXRhaWxzVmlldzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL09wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZDc4NTYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBPcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCQotCXB1YmxpYyBPcGVuTWluaWF0dXJlVmlld0ZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRyeSB7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS4KLQkJCQkJc2hvd1ZpZXcoSlBBRWRpdG9yQ29uc3RhbnRzLklEX1ZJRVdfTUlOSUFUVVJFKTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2FuJ3Qgb3BlbiBNaW5pYXR1cmUgdmlldyIsIGUpOyAgLy8kTk9OLU5MUy0xJAkJIAkJCQotCQl9Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWM0Mzg3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uQWJzdHJhY3RDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5kaWFsb2cuU2VsZWN0VHlwZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIHsKLQotCS8vcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhY2VySSB0cmFjZXIgPSBUcmFjaW5nTWFuYWdlci5nZXRUcmFjZXIoUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZS5jbGFzcyk7CQkJCQotCQotCXB1YmxpYyBSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJc3VwZXIoZnApOwotCX0KLQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCQkKLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKVswXTsKLQkJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJaWYgKChibyA9PSBudWxsKSB8fCAoIShibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSkpCi0JCQkJcmV0dXJuOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpYm87Ci0JCVN0cmluZyB0eXBlTmFtZSA9IEpQQUVkaXRvclV0aWwuZ2V0QXR0cmlidXRlVHlwZU5hbWVXaXRoR2VuZXJpY3MoanBhKTsKLQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLlNlbGVjdFR5cGVEaWFsb2dfY2hvb3NlQXR0cmlidXRlVHlwZURpYWxvZ1RleHQsIAotCQkJCWpwYS5nZXROYW1lKCksIEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZSgoKFBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKSkuZ2V0TmFtZSgpKSk7CQkKLQkJU2VsZWN0VHlwZURpYWxvZyBkID0gbmV3IFNlbGVjdFR5cGVEaWFsb2cobXNnLCB0eXBlTmFtZSk7Ci0JCWlmIChkLm9wZW4oKSAhPSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgbmV3VHlwZU5hbWUgPSBkLmdldFR5cGVOYW1lKCk7Ci0JCVN0cmluZ1tdIGF0dHJpYnV0ZVR5cGVUeXBlTmFtZXMgPSBKUEFFZGl0b3JVdGlsLmdldEdlbmVyaWNzRWxlbWVudFR5cGVzKG5ld1R5cGVOYW1lKTsKLQkJaWYgKGF0dHJpYnV0ZVR5cGVUeXBlTmFtZXMgIT0gbnVsbCkKLQkJCW5ld1R5cGVOYW1lID0gbmV3VHlwZU5hbWUuc3Vic3RyaW5nKDAsIG5ld1R5cGVOYW1lLmluZGV4T2YoJzwnKSkudHJpbSgpOwotCQkKLQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkuYWRkQWRkSWdub3JlKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLCBqcGEuZ2V0TmFtZSgpKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGpyYSA9IGpwYS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5hZGRSZW1vdmVJZ25vcmUoKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCksIGpyYS5nZXROYW1lKCkpOwotCQlib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkID0ganJhLmdldEtpbmQoKSA9PSBLaW5kLk1FVEhPRDsKLQotCQlMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uU3RyaW5ncyhqcGEpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5kZWxldGVBdHRyaWJ1dGUoKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCksIGpwYS5nZXROYW1lKCksCi0JCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuY3JlYXRlQU5ld0F0dHJpYnV0ZSgoSmF2YVBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKSwKLQkJCQlqcGEuZ2V0TmFtZSgpLCBuZXdUeXBlTmFtZSwgYXR0cmlidXRlVHlwZVR5cGVOYW1lcywganBhLmdldE5hbWUoKSwgYW5ub3RhdGlvbnMsCi0JCQkJZmFsc2UsIGlzTWV0aG9kQW5ub3RhdGVkLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCWdldEZlYXR1cmVQcm92aWRlcigpLnJlcGxhY2VBdHRyaWJ1dGUoanBhLCBuZXdBdCk7Ci0gICAgICAgIElXb3JrYmVuY2hTaXRlIHdzID0gKChJRWRpdG9yUGFydClnZXREaWFncmFtRWRpdG9yKCkpLmdldFNpdGUoKTsKLSAgICAgICAgSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdCgoSmF2YVBlcnNpc3RlbnRUeXBlKW5ld0F0LmdldFBhcmVudCgpKTsKLSAgICAgICAgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0SlBBRWRpdG9yVXRpbCgpLmZvcm1hdENvZGUoY3UsIHdzKTsJCQkJCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW1ha2VSZWxhdGlvbnMoZ2V0RmVhdHVyZVByb3ZpZGVyKCksIAotCQkJCSgoU2hhcGUpcGUpLmdldENvbnRhaW5lcigpLCAoSmF2YVBlcnNpc3RlbnRUeXBlKW5ld0F0LmdldFBhcmVudCgpKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JNZXNzYWdlcy5SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb247Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZWZhY3RvckVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdjYTUwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLmFjdGlvbnMuU2VsZWN0aW9uRGlzcGF0Y2hBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5KcHRSZXNvdXJjZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkFkZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25DbGVhckV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uUmVtb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLkNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkFkZEVudGl0eUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFTb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZmFjdG9yRW50aXR5RmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0KLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IG51bGw7Ci0JcHJvdGVjdGVkIFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gYXRzID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBoYXNOYW1lQW5ub3RhdGlvbiA9IGZhbHNlOwotCi0JcHVibGljIFJlZmFjdG9yRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotICAgIAlpZiAoIShjb250ZXh0IGluc3RhbmNlb2YgSUN1c3RvbUNvbnRleHQpKQotICAgIAkJcmV0dXJuIGZhbHNlOwotICAgIAlJQ3VzdG9tQ29udGV4dCBjdHggPSAoSUN1c3RvbUNvbnRleHQpY29udGV4dDsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGN0eC5nZXRJbm5lclBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0gICAgCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWJvOwotICAgIAkJaGFzTmFtZUFubm90YXRpb24gPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5oYXNOYW1lQW5ub3RhdGlvbihqcHQpOwotICAgIAkJcmV0dXJuIHRydWU7Ci0gICAgCX0KLSAgICAJaWYgKHBlIGluc3RhbmNlb2YgU2hhcGUpIHsKLSAgICAJCUNvbnRhaW5lclNoYXBlIGNzID0gKChTaGFwZSlwZSkuZ2V0Q29udGFpbmVyKCk7Ci0gICAgCQlpZiAoY3MgPT0gbnVsbCkKLSAgICAJCQlyZXR1cm4gZmFsc2U7Ci0gICAgIAkJYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MpOwotICAgICAgICAJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0gICAgICAgIAkJanB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlibzsKLSAgICAgICAgCQloYXNOYW1lQW5ub3RhdGlvbiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc05hbWVBbm5vdGF0aW9uKGpwdCk7Ci0gICAgICAgIAkJcmV0dXJuIHRydWU7Ci0gICAgICAgIAl9Ci0gICAgCX0gICAgCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0LCBTZWxlY3Rpb25EaXNwYXRjaEFjdGlvbiBhY3Rpb24sIElDb21waWxhdGlvblVuaXQgY3UpIHsKLQkJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWwgPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihjdSk7Ci0JCWZpbmFsIFNoYXBlIHBpY3QgPSAoU2hhcGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWdldEZlYXR1cmVQcm92aWRlcigpLgotCQkJCQkJCQkJZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBpY3QpOwotCQlmaW5hbCBQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanB0KTsKLQkJZmluYWwgU2VtYXBob3JlIHMgPSBuZXcgU2VtYXBob3JlKDApOwotCQlmaW5hbCBKUEFQcm9qZWN0TGlzdGVuZXIgbHNuciA9IG5ldyBKUEFQcm9qZWN0TGlzdGVuZXIocyk7Ci0JCWpwdC5nZXRKcGFQcm9qZWN0KCkuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIGxzbnIpOwotCQlTaG93QnVzeSBzaG93QnVzeSA9IG5ldyBTaG93QnVzeShzKTsKLQkJSlBBU29sdmVyLmlnbm9yZUV2ZW50cyA9IHRydWU7Ci0JCWZpbmFsIFN0cmluZyBvbGROYW1lID0ganB0LmdldE5hbWUoKTsKLQkJCi0JCXRyeSB7Ci0JCQlhY3Rpb24ucnVuKHNlbCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoRGlzcGxheS5nZXRDdXJyZW50KCksIHNob3dCdXN5KTsKLQkJanB0LmdldEpwYVByb2plY3QoKS5yZW1vdmVDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCUpQQVNvbHZlci5pZ25vcmVFdmVudHMgPSBmYWxzZTsKLQkJZmluYWwgYm9vbGVhbiByZW5hbWUgPSBSZW5hbWVFbnRpdHlGZWF0dXJlLmNsYXNzLmlzSW5zdGFuY2UodGhpcyk7Ci0JCQotCQlpZiAoIXNob3dCdXN5LmlzTW92ZWQoKSkgCi0JCQlyZXR1cm47Ci0JCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihwaWN0KTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlyZW1hcEVudGl0eShvbGROYW1lLCBwaWN0LCBwdSwgcmVuYW1lLCBsc25yLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCX0pOwkKLQl9Ci0JCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmV3TmFtZSwgSUNvbXBpbGF0aW9uVW5pdCBjdSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlmaW5hbCBTdHJpbmcgb2xkTmFtZSA9IGpwdC5nZXROYW1lKCk7Ci0JCWZpbmFsIFNoYXBlIHBpY3QgPSAoU2hhcGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuCi0JCQkJCQkJCQlnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdCk7CQkKLQkJZmluYWwgUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KGpwdCk7Ci0JCWZpbmFsIFNlbWFwaG9yZSBzID0gbmV3IFNlbWFwaG9yZSgwKTsKLQkJZmluYWwgSlBBUHJvamVjdExpc3RlbmVyIGxzbnIgPSBuZXcgSlBBUHJvamVjdExpc3RlbmVyKHMpOwotCQlqcHQuZ2V0SnBhUHJvamVjdCgpLmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBsc25yKTsKLQkJU2hvd0J1c3kgc2hvd0J1c3kgPSBuZXcgU2hvd0J1c3kocyk7Ci0JCUpQQVNvbHZlci5pZ25vcmVFdmVudHMgPSB0cnVlOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW5hbWVFbnRpdHlDbGFzcyhqcHQsIG5ld05hbWUsIGdldEZlYXR1cmVQcm92aWRlcigpKTsJCQotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgc2hvd0J1c3kpOwotCQlqcHQuZ2V0SnBhUHJvamVjdCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBsc25yKTsKLQkJSlBBU29sdmVyLmlnbm9yZUV2ZW50cyA9IGZhbHNlOwkJCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKHBpY3QpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCXJlbWFwRW50aXR5KG9sZE5hbWUsIHBpY3QsIHB1LCB0cnVlLCBsc25yLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtYXBFbnRpdHkoZmluYWwgU3RyaW5nIG9sZE5hbWUsCi0JCQkJCQkJCSAgIGZpbmFsIFNoYXBlIHBpY3QsCi0JCQkJCQkJCSAgIGZpbmFsIFBlcnNpc3RlbmNlVW5pdCBwdSwKLQkJCQkJCQkJICAgZmluYWwgYm9vbGVhbiByZW5hbWUsCi0JCQkJCQkJCSAgIGZpbmFsIEpQQVByb2plY3RMaXN0ZW5lciBsc25yLAotCQkJCQkJCQkgICBmaW5hbCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKERpc3BsYXkuZ2V0Q3VycmVudCgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJcHUuZ2V0SnBhUHJvamVjdCgpLnVwZGF0ZUFuZFdhaXQoKTsKLQkJCQlmaW5hbCBpbnQgeCA9IHBpY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRYKCk7Ci0JCQkJZmluYWwgaW50IHkgPSBwaWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WSgpOwotCQkJCWZpbmFsIGludCB3aWR0aCA9IHBpY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRXaWR0aCgpOwotCQkJCWZpbmFsIGludCBoZWlnaHQgPSBwaWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0SGVpZ2h0KCk7CQkKLQkJCQkKLQkJCQlmaW5hbCBDb250YWluZXJTaGFwZSBjcyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbnRhaW5lclNoYXBlKGZwLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCksIAotCQkJCQkJdHJ1ZSk7Ci0JCQkJY3Muc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkKLQkJCQlBZGRDb250ZXh0IGNvbnQgPSBuZXcgQWRkQ29udGV4dCgpOwotCQkJCWNvbnQuc2V0WCh4KTsKLQkJCQljb250LnNldFkoeSk7Ci0JCQkJY29udC5zZXRXaWR0aCh3aWR0aCk7Ci0JCQkJY29udC5zZXRIZWlnaHQoaGVpZ2h0KTsKLQkJCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3QgPSBBZGRKUEFFbnRpdHlGZWF0dXJlLmNyZWF0ZUVudGl0eVJlY3RhbmdsZShjb250LCBjcywgZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSk7IAkKLQkJCQlyZWN0LnNldEZpbGxlZCh0cnVlKTsKLQkJCQkKLQkJCQlJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChwaWN0KTsgCi0JCQkJUmVtb3ZlSlBBRW50aXR5RmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVKUEFFbnRpdHlGZWF0dXJlKGZwKTsKLQkJCQkKLQkJCQlib29sZWFuIHByaW1hcnlDb2xsYXBzZWQgPSBKUEFFZGl0b3JDb25zdGFudHMuVFJVRV9TVFJJTkcuZXF1YWxzKEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBSSU1BUllfQ09MTEFQU0VEKSk7Ci0JCQkJYm9vbGVhbiByZWxhdGlvbkNvbGxhcHNlZCA9IEpQQUVkaXRvckNvbnN0YW50cy5UUlVFX1NUUklORy5lcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LCBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQ09MTEFQU0VEKSk7Ci0JCQkJYm9vbGVhbiBiYXNpY0NvbGxhcHNlZCA9IEpQQUVkaXRvckNvbnN0YW50cy5UUlVFX1NUUklORy5lcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LCBKUEFFZGl0b3JDb25zdGFudHMuQkFTSUNfQ09MTEFQU0VEKSk7Ci0KLQkJCQlBZGRFbnRpdHlDb250ZXh0IGFkZEN0eCA9IG5ldyBBZGRFbnRpdHlDb250ZXh0KHByaW1hcnlDb2xsYXBzZWQsIHJlbGF0aW9uQ29sbGFwc2VkLCBiYXNpY0NvbGxhcHNlZCk7Ci0JCQkJU3RyaW5nIG5ld0pQVE5hbWUgPSBsc25yLmdldE5ld0pQVE5hbWUoKTsKLQkJCQkKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgbmV3SlBUID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SlBUKG5ld0pQVE5hbWUsIHB1KTsKLQkJCQlpZiAoIUpwdEpwYUNvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKG5ld0pQVC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCQlKUEFFZGl0b3JVdGlsLmNyZWF0ZVVucmVnaXN0ZXJFbnRpdHlGcm9tWE1MSm9iKG5ld0pQVC5nZXRKcGFQcm9qZWN0KCksIG9sZE5hbWUpOwotCQkJCX0JCQkJCQkJCQkKLQkJCQlpZiAocmVuYW1lKSB7Ci0JCQkJCVN0cmluZyB0YWJsZU5hbWUgPSBKUEFFZGl0b3JVdGlsLmZvcm1UYWJsZU5hbWUobmV3SlBUKTsKLQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuc2V0VGFibGVOYW1lKG5ld0pQVCwgdGFibGVOYW1lKTsKLQkJCQl9Ci0JCQkJYWRkQ3R4LnNldE5ld09iamVjdChuZXdKUFQpOwotCQkJCWFkZEN0eC5zZXRUYXJnZXRDb250YWluZXIoZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSk7Ci0JCQkJYWRkQ3R4LnNldFgoeCk7Ci0JCQkJYWRkQ3R4LnNldFkoeSk7Ci0JCQkJYWRkQ3R4LnNldFdpZHRoKHdpZHRoKTsKLQkJCQlhZGRDdHguc2V0SGVpZ2h0KGhlaWdodCk7Ci0JCQkJQWRkSlBBRW50aXR5RmVhdHVyZSBmdDEgPSBuZXcgQWRkSlBBRW50aXR5RmVhdHVyZShmcCk7Ci0JCQkJZnQucmVtb3ZlKGN0eCk7Ci0JCQkJZnQxLmFkZChhZGRDdHgpOwotCQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QobmV3SlBUKTsKLQkJCQlmcC5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbUVkaXRvcigpLnNldFBpY3RvZ3JhbUVsZW1lbnRGb3JTZWxlY3Rpb24ocGUpOwotCQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLmRlbGV0ZVBpY3RvZ3JhbUVsZW1lbnQoY3MpOwkKLQkJCQkKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwoZnAsIG5ld0pQVCk7Ci0JCQkJaWYgKCFKcHRKcGFDb3JlUGx1Z2luLmRpc2NvdmVyQW5ub3RhdGVkQ2xhc3NlcyhuZXdKUFQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSkpIHsKLQkJCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVSZWdpc3RlckVudGl0eUluWE1MSm9iKG5ld0pQVC5nZXRKcGFQcm9qZWN0KCksIG5ld0pQVE5hbWUpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCQotCX0KLQkKLQkKLQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgRGlhZ3JhbSBnZXREaWFncmFtKCkgewotCQlyZXR1cm4gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQkKLQljbGFzcyBTaG93QnVzeSBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJpdmF0ZSBTZW1hcGhvcmUgczsKLQkJYm9vbGVhbiBtb3ZlZCA9IGZhbHNlOwotCQlTaG93QnVzeShTZW1hcGhvcmUgcykgewotCQkJdGhpcy5zID0gczsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJdHJ5IHsKLQkJCQltb3ZlZCA9IHMudHJ5QWNxdWlyZSgyLCA0LCBUaW1lVW5pdC5TRUNPTkRTKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJUaHJlYWQgaW50ZXJydXB0ZWQiLCBlKTsgIC8vJE5PTi1OTFMtMSQJCSAJCQkJCQkJCi0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGlzTW92ZWQoKSB7Ci0JCQlyZXR1cm4gbW92ZWQ7Ci0JCX0JCQotCX0KLQkKLQlwdWJsaWMgY2xhc3MgSlBBUHJvamVjdExpc3RlbmVyIGltcGxlbWVudHMgQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBTZW1hcGhvcmUgcyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIG5ld0pwdE5hbWUgPSBudWxsOwotCQkKLQkJcHVibGljIEpQQVByb2plY3RMaXN0ZW5lcihTZW1hcGhvcmUgcykgewotCQkJdGhpcy5zID0gczsKLQkJfQotCQkJCQkJCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7Ci0JCQlJdGVyYXRvcjw/PiBpdCA9IGV2ZW50LmdldEl0ZW1zKCkuaXRlcmF0b3IoKTsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJSnBhRmlsZSBqcGFGaWxlID0gKEpwYUZpbGUpbzsKLQkJCQotCQkJSnB0UmVzb3VyY2VNb2RlbCBybSA9IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQkJaWYgKHJtID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFKYXZhUmVzb3VyY2VDb21waWxhdGlvblVuaXQuY2xhc3MuaXNJbnN0YW5jZShybSkpCi0JCQkJcmV0dXJuOwotCQkJSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0IGpyY3UgPSAoSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KXJtOwotCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGpydCA9IGpyY3UuZ2V0UHJpbWFyeVR5cGUoKTsJCQotCQkJbmV3SnB0TmFtZSA9IGpydC5nZXRRdWFsaWZpZWROYW1lKCk7Ci0JCQlzLnJlbGVhc2UoKTsKLQkJCWlmICgoYXRzID09IG51bGwpIHx8IGhhc05hbWVBbm5vdGF0aW9uKQotCQkJCXJldHVybjsKLQkJCWZpbmFsIEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdGVyID0gYXRzLml0ZXJhdG9yKCk7Ci0JCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBhdE9sZFRvTmV3TmFtZSA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCQkJCVNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gbmV3U2VsZkF0cyA9IG5ldyBIYXNoU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPigpOwotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXRlci5uZXh0KCk7Ci0JCQkJCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0Q29tcGlsYXRpb25Vbml0KChKYXZhUGVyc2lzdGVudFR5cGUpIGF0LmdldFBhcmVudCgpKTsKLQkJCQkJCWlmICghY3UuZXhpc3RzKCkpIHsKLQkJCQkJCQlhdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSlhdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKS5nZXRQZXJzaXN0ZW50VHlwZShuZXdKcHROYW1lKS5nZXRBdHRyaWJ1dGVOYW1lZChhdC5nZXROYW1lKCkpOwotCQkJCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0ID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQluZXdBdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlbmFtZUF0dHJpYnV0ZShhdCwgSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKG5ld0pwdE5hbWUpLCBuZXdKcHROYW1lLCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKGUpOwotCQkJCQkJCX0KLQkJCQkJCQlhdE9sZFRvTmV3TmFtZS5wdXQoYXQuZ2V0TmFtZSgpLCBuZXdBdC5nZXROYW1lKCkpOwotCQkJCQkJCW5ld1NlbGZBdHMuYWRkKG5ld0F0KTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVuYW1lQXR0cmlidXRlKGF0LCBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUobmV3SnB0TmFtZSksIG5ld0pwdE5hbWUsIGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdHIgPSAgbmV3U2VsZkF0cy5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBpdHIubmV4dCgpOwotCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIChKYXZhUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpOwotCQkJCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbSA9IGF0LmdldE1hcHBpbmcoKTsKLQkJCQkJCUFubm90YXRpb24gbWFwcGluZ0Fubm90YXRpb24gPSBtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJCQkJCQkJCQotCQkJCQkJaWYobWFwcGluZ0Fubm90YXRpb24gPT0gbnVsbCl7Ci0JCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGdldEZlYXR1cmVQcm92aWRlcigpLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWF0LmdldFBhcmVudCgpKTsKLQkJCQkJCQltYXBwaW5nQW5ub3RhdGlvbiA9IG0uZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCQkJCX0JCi0JCQkJCQlpZiAobWFwcGluZ0Fubm90YXRpb24gPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm47Ci0JCQkJCQlpZiAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UobWFwcGluZ0Fubm90YXRpb24pKSB7Ci0JCQkJCQkJT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uIG93bmFibGVNYXBwaW5nQW5ub3RhdGlvbiA9IChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pbWFwcGluZ0Fubm90YXRpb247Ci0JCQkJCQkJU3RyaW5nIG9sZE1hcHBlZEJ5ID0gb3duYWJsZU1hcHBpbmdBbm5vdGF0aW9uLmdldE1hcHBlZEJ5KCk7Ci0JCQkJCQkJaWYgKG9sZE1hcHBlZEJ5ICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIG5ld01hcHBlZEJ5ID0gYXRPbGRUb05ld05hbWUuZ2V0KG9sZE1hcHBlZEJ5KTsKLQkJCQkJCQkJaWYgKG5ld01hcHBlZEJ5ICE9IG51bGwpCi0JCQkJCQkJCQlvd25hYmxlTWFwcGluZ0Fubm90YXRpb24uc2V0TWFwcGVkQnkobmV3TWFwcGVkQnkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkKLQkJCQl9CQkJCQotCQkJfTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVtb3ZlZChDb2xsZWN0aW9uUmVtb3ZlRXZlbnQgYXJnMCkgewotCQkJcy5yZWxlYXNlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb2xsZWN0aW9uQ2hhbmdlZChDb2xsZWN0aW9uQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJfQotCQkKLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNsZWFyZWQoQ29sbGVjdGlvbkNsZWFyRXZlbnQgYXJnMCkge30KLQkJCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmV3SlBUTmFtZSgpIHsKLQkJCXJldHVybiBuZXdKcHROYW1lOwotCQl9Ci0JCQotCi0JfTsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMjVhYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCi0JcHJvdGVjdGVkIFNldDxTaGFwZT4gYWxsU2hhcGVzID0gbmV3IEhhc2hTZXQ8U2hhcGU+KCk7Ci0JCi0JcHVibGljIFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRDb25maXJtYXRpb25UZXh0KCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSBhbGxTaGFwZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgc2ggPSBpdC5uZXh0KCk7Ci0JCQlmaW5hbCBSZW1vdmVKUEFFbnRpdHlGZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZUpQQUVudGl0eUZlYXR1cmUodGhpcy5nZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlmaW5hbCBJUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChzaCk7Ci0JCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY3R4LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJCQotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4ocGUpOwotCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJQE92ZXJyaWRlCi0JCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCQlmdC5yZW1vdmUoY3R4KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MGFhYTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZSBleHRlbmRzIERlZmF1bHRSZW1vdmVGZWF0dXJlIHsKLQkKLSAgICBwdWJsaWMgUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgIAlzdXBlcihmcCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByZVJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJU2V0PFNoYXBlPiBzaGFwZXNGb3JEZWxldGlvbiA9IG5ldyBIYXNoU2V0PFNoYXBlPigpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJSUZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotICAgIAkJTGlzdDxTaGFwZT4gbHN0ID0gKChDb250YWluZXJTaGFwZSlwZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAJCWZvciAoaW50IGkgPSBsc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAJCQlTaGFwZSB0ZXh0U2hhcGUgPSBsc3QuZ2V0KGkpOwotICAgIAkJCU9iamVjdCBvID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0gICAgCQkJaWYgKChvICE9IG51bGwpICYmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKSB7Ci0gICAgCQkJCXNoYXBlc0ZvckRlbGV0aW9uLmFkZCh0ZXh0U2hhcGUpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlc0ZvckRlbGV0aW9uLml0ZXJhdG9yKCk7Ci0gICAgCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCQlSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGYgPSBuZXcgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmcCwgZmFsc2UsIHRydWUpOwotCQkJCUlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGl0Lm5leHQoKSk7Ci0JCQkJZi5yZW1vdmUoY3R4KTsgICAgCQkJCi0gICAgCQl9Ci0gICAgCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5yZW1vdmUoKChQZXJzaXN0ZW50VHlwZSlibykuZ2V0TmFtZSgpLCB0cnVlKTsgCi0gICAgCX0gCQkJCi0gICAgfQotICAgIAotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWQ2MDIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlQXR0cmlidXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5DdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5pbXBsLkRlZmF1bHRSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0UmVtb3ZlRmVhdHVyZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2tpcFJlbW92ZVJlbGF0aW9ucyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBza2lwQ3JlYXRlUmVsYXRpb25zID0gZmFsc2U7Ci0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gbnVsbDsKLQlwcml2YXRlIElDdXN0b21GZWF0dXJlIGdyYXBoaWNhbFJlbW92ZTsKLQotCXB1YmxpYyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJdGhpcyhmcCwgbmV3IEdyYXBoaWNhbFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoZnApKTsKLQl9Ci0KLQlwdWJsaWMgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLCBib29sZWFuIHNraXBSZW1vdmVSZWxhdGlvbnMsIGJvb2xlYW4gc2tpcENyZWF0ZVJlbGF0aW9ucykgewotCQl0aGlzKGZwKTsKLQkJdGhpcy5za2lwUmVtb3ZlUmVsYXRpb25zID0gc2tpcFJlbW92ZVJlbGF0aW9uczsKLQkJdGhpcy5za2lwQ3JlYXRlUmVsYXRpb25zID0gc2tpcENyZWF0ZVJlbGF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwLCBJQ3VzdG9tRmVhdHVyZSBncmFwaGljYWxSZW1vdmUpIHsKLQkJc3VwZXIoZnApOwotCQl0aGlzLmdyYXBoaWNhbFJlbW92ZSA9IGdyYXBoaWNhbFJlbW92ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRLZXkoU3RyaW5nIGtleSkgewotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIHN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByZVJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJaWYgKHBlID09IG51bGwpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlBpY3RvZ3JhbUVsZW1lbnQgaXMgbnVsbFxuIiwgbmV3IEV4Y2VwdGlvbigpKTsgIC8vJE5PTi1OTFMtMSQJCSAJCQkJCQkJCi0JCQlyZXR1cm47Ci0JCX0KLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlPYmplY3QgYm8gPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQlpZihibyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgYm87Ci0JCQkKLQkJCUhhc2hTZXQ8U3RyaW5nPiBpZ25vcmVzID0gKChKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpIGdldEZlYXR1cmVQcm92aWRlcigpKS5nZXRBZGRJZ25vcmUoKTsKLQkJCWlmICghaWdub3Jlcy5pc0VtcHR5KCkpIHsKLQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBpZ25vcmVzLml0ZXJhdG9yKCk7Ci0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBpdGVyU3RyID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChpdGVyU3RyLmVuZHNXaXRoKGpwYS5nZXROYW1lKCkpKSB7Ci0JCQkJCQlpZ25vcmVzLnJlbW92ZShpdGVyU3RyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCQotCQkJanB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCk7Ci0JCQlmcC5yZW1vdmUoZnAuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoYm8pKTsKLQkJCWlmICghc2tpcFJlbW92ZVJlbGF0aW9ucykgewotCQkJCUlSZWxhdGlvbiByZWwgPSBmcC5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShqcGEpOwotCQkJCXJlbW92ZVJlbGF0aW9uKHJlbCk7Ci0JCQl9Ci0JCX0KLQotCQlDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSA9ICgoQ29udGFpbmVyU2hhcGUpIHBlKS5nZXRDb250YWluZXIoKS5nZXRDb250YWluZXIoKTsKLQkJdHJ5ewotCQlncmFwaGljYWxSZW1vdmVBdHRyaWJ1dGUoZW50aXR5U2hhcGUpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSl7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKGUpOyAKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBncmFwaGljYWxSZW1vdmVBdHRyaWJ1dGUoUGljdG9ncmFtRWxlbWVudCBwZSkgewotCQlDdXN0b21Db250ZXh0IGN1c3RvbUNvbnRleHQgPSBuZXcgQ3VzdG9tQ29udGV4dCgpOwotCQljdXN0b21Db250ZXh0LnNldElubmVyUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCWdyYXBoaWNhbFJlbW92ZS5leGVjdXRlKGN1c3RvbUNvbnRleHQpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVSZWxhdGlvbihJUmVsYXRpb24gcmVsKSB7Ci0JCWlmIChyZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29ubmVjdGlvbiBjb25uID0gKENvbm5lY3Rpb24pIGdldEZlYXR1cmVQcm92aWRlcigpLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwpOwotCQlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGNvbm4pOwotCQlSZW1vdmVSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlUmVsYXRpb25GZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJZnQucmVtb3ZlKGN0eCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcG9zdFJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChza2lwQ3JlYXRlUmVsYXRpb25zKQotCQkJcmV0dXJuOwotCQlpZiAoanB0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChnZXRGZWF0dXJlUHJvdmlkZXIoKSwganB0KTsKLQotCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVscyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpCi0JCQkJLnByb2R1Y2VBbGxSZWxhdGlvbnMoanB0LCBnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUl0ZXJhdG9yPElSZWxhdGlvbj4gaXRlciA9IHJlbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gaXRlci5uZXh0KCk7Ci0JCQlDb250YWluZXJTaGFwZSBvd25lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoCi0JCQkJCXJlbC5nZXRPd25lcigpKTsKLQkJCUNvbnRhaW5lclNoYXBlIGludmVyc2VTaGFwZSA9IChDb250YWluZXJTaGFwZSkgZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KAotCQkJCQlyZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCUFkZENvbm5lY3Rpb25Db250ZXh0IGNudHggPSBuZXcgQWRkQ29ubmVjdGlvbkNvbnRleHQoSlBBRWRpdG9yVXRpbC5nZXRBbmNob3Iob3duZXJTaGFwZSksIEpQQUVkaXRvclV0aWwKLQkJCQkJLmdldEFuY2hvcihpbnZlcnNlU2hhcGUpKTsKLQkJCWNudHguc2V0TmV3T2JqZWN0KHJlbCk7Ci0JCQlBZGRSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCWZ0LmFkZChjbnR4KTsKLS8vCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGdldEZlYXR1cmVQcm92aWRlcigpLCBqcHQpOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlSlBBRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVtb3ZlSlBBRW50aXR5RmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTg4ZjA3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUpQQUVudGl0eUZlYXR1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLQotcHVibGljIGNsYXNzIFJlbW92ZUpQQUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0UmVtb3ZlRmVhdHVyZSB7Ci0JCi0JCi0gICAgcHVibGljIFJlbW92ZUpQQUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgIAlzdXBlcihmcCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByZVJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJCQkKLS8vCQlSZXN0b3JlRW50aXR5RmVhdHVyZSBmdCA9IG5ldyBSZXN0b3JlRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0vLwkJSUN1c3RvbUNvbnRleHQgY3VzdG9tQ29udGV4dCA9IG5ldyBDdXN0b21Db250ZXh0KG5ldyBQaWN0b2dyYW1FbGVtZW50W10geyBwZSB9KTsKLS8vCQlmdC5leGVjdXRlKGN1c3RvbUNvbnRleHQpOwotICAgIAkKLSAgICAJZmluYWwgT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJU2V0PFNoYXBlPiBzaGFwZXNGb3JEZWxldGlvbiA9IG5ldyBIYXNoU2V0PFNoYXBlPigpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWJvOwotICAgIAkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVzdG9yZUVudGl0eUNsYXNzKGpwdCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAgICAJCQotICAgIAkJSUZlYXR1cmVQcm92aWRlciBmcCA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotICAgIAkJTGlzdDxTaGFwZT4gbHN0ID0gKChDb250YWluZXJTaGFwZSlwZSkuZ2V0Q2hpbGRyZW4oKTsKLSAgICAJCWZvciAoaW50IGkgPSBsc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAJCQlTaGFwZSB0ZXh0U2hhcGUgPSBsc3QuZ2V0KGkpOwotICAgIAkJCU9iamVjdCBvID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0gICAgCQkJaWYgKChvICE9IG51bGwpICYmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpKSB7Ci0gICAgCQkJCXNoYXBlc0ZvckRlbGV0aW9uLmFkZCh0ZXh0U2hhcGUpOwotICAgIAkJCX0KLSAgICAJCX0KLSAgICAJCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlc0ZvckRlbGV0aW9uLml0ZXJhdG9yKCk7Ci0gICAgCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCQlSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGYgPSBuZXcgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmcCwgZmFsc2UsIHRydWUpOwotCQkJCUlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGl0Lm5leHQoKSk7Ci0JCQkJZi5yZW1vdmUoY3R4KTsgICAgCQkJCi0gICAgCQl9Ci0gICAgCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIAkJLy8tLVdvcmthcm91bmQgZm9yIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yODEzNDUKLSAgICAJCS8vSm9iIGpvYiA9IG5ldyBKb2IoIlJlbW92ZSBKUEEgZW50aXR5IikgewkJCQkvLyROT04tTkxTLTEkCi0JCQkvLwlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCSAgICAJCVN0cmluZyBuYW1lID0gKChQZXJzaXN0ZW50VHlwZSlibykuZ2V0TmFtZSgpOwotCQkJCQlnZXRGZWF0dXJlUHJvdmlkZXIoKS5yZW1vdmUobmFtZSwgdHJ1ZSk7Ci0JCQkJCS8vcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgCi0JCQkJCS8vCSAgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQkvLwkgIG5hbWUgKyAiIGlzIHJlbW92ZWQiKTsgCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCSAgCi0JCQkvLwl9Ci0gICAgCQkvL307Ci0gICAgCQkvL2pvYi5zY2hlZHVsZSgpOwotICAgIAkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAJfSAJCQkKLSAgICB9Ci0gICAgCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUNvbnRleHQgY3R4KSB7Ci0JCWlmICghSVJlbW92ZUNvbnRleHQuY2xhc3MuaXNJbnN0YW5jZShjdHgpKSAKLQkJCXJldHVybjsKLQkJSVJlbW92ZUNvbnRleHQgY29udGV4dCA9IChJUmVtb3ZlQ29udGV4dCljdHg7IAotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgCU9iamVjdCBibyA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgCWlmICghSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzLmlzSW5zdGFuY2UoYm8pKQotICAgIAkJcmV0dXJuOwotICAgIAlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlibzsKLQkJaWYgKEpQQUVkaXRvclV0aWwuaXNFbnRpdHlPcGVuRWxzZXdoZXJlKGpwdCwgdHJ1ZSkpIHsKLQkJCVN0cmluZyBzaG9ydEVudE5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoSlBBRWRpdG9yTWVzc2FnZXMuUmVtb3ZlSlBBRW50aXR5RmVhdHVyZV9kaXNjYXJkV2FybmluZ01zZywgc2hvcnRFbnROYW1lKTsKLQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLAotCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFTb2x2ZXJfY2xvc2VFZGl0b3JzLCBudWxsLCBtZXNzYWdlLAotCQkJTWVzc2FnZURpYWxvZy5XQVJOSU5HLCBuZXcgU3RyaW5nW117SlBBRWRpdG9yTWVzc2FnZXMuQlROX09LLCBKUEFFZGl0b3JNZXNzYWdlcy5CVE5fQ0FOQ0VMfSwgMCkgewotCQkJCXByb3RlY3RlZCBpbnQgZ2V0U2hlbGxTdHlsZSgpIHsKLQkJCQkJcmV0dXJuIFNXVC5DTE9TRSAKLQkJCQkJfCBTV1QuVElUTEUgfCBTV1QuQk9SREVSCi0JCQkJCXwgU1dULkFQUExJQ0FUSU9OX01PREFMCi0JCQkJCXwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7fX07Ci0JCQlpZiAoZGlhbG9nLm9wZW4oKSAhPSAwKQkKLQkJCQlyZXR1cm47ICAgIAkJCQotCQl9CQkKLQkJc3VwZXIuZXhlY3V0ZShjb250ZXh0KTsKLQl9Ci0JCi0JCi0JCi0KLQkKLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVSZWxhdGlvbkZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjczZTFkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZVJlbGF0aW9uRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JUmVtb3ZlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5BYnN0cmFjdEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuaW50ZXJuYWwuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5BYnN0cmFjdFJlbGF0aW9uOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgUmVtb3ZlUmVsYXRpb25GZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RGZWF0dXJlIGltcGxlbWVudHMgSVJlbW92ZUZlYXR1cmUgewotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gTWVzc2FnZXMuRGVmYXVsdFJlbW92ZUZlYXR1cmVfMF94ZmxkOwkKLQotCXB1YmxpYyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotICAgIHB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQkKLQotICAgIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCXJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLSAgICAJcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHByZVJlbW92ZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAJT2JqZWN0IGJvID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAJaWYgKGJvIGluc3RhbmNlb2YgQWJzdHJhY3RSZWxhdGlvbikgewotICAgIAkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSAoQWJzdHJhY3RSZWxhdGlvbilibzsKLSAgICAJCWdldEZlYXR1cmVQcm92aWRlcigpLnJlbW92ZShyZWwuZ2V0SWQoKSk7Ci0gICAgCX0gICAgCQotICAgIH0gICAgCi0gICAgICAgIAotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShmaW5hbCBJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmICghZ2V0VXNlckRlY2lzaW9uKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlwcmVSZW1vdmUoY29udGV4dCk7Ci0JCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJaWYgKHBlID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihwZSk7Ci0JCVJlY29yZGluZ0NvbW1hbmQgcmMgPSBuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlpZiAocGUgaW5zdGFuY2VvZiBTaGFwZSkgewotCQkJCQlTaGFwZSBzaGFwZSA9IChTaGFwZSkgcGU7Ci0JCQkJCXJlbW92ZUFsbENvbm5lY3Rpb25zKHNoYXBlKTsKLQkJCQl9Ci0JCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCQkJcG9zdFJlbW92ZShjb250ZXh0KTsKLQkJCX0KLQkJfTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUocmMpOwotCX0KLSAgICAKLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVBbGxDb25uZWN0aW9ucyhTaGFwZSBzaGFwZSkgewotCQlJRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IGdldEZlYXR1cmVQcm92aWRlcigpOwotCQlmb3IgKEl0ZXJhdG9yPEFuY2hvcj4gaXRlciA9IHNoYXBlLmdldEFuY2hvcnMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUFuY2hvciBhbmNob3IgPSBpdGVyLm5leHQoKTsKLQkJCWZvciAoSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXRlcmF0b3IgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBbGxDb25uZWN0aW9ucyhhbmNob3IpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGNvbm5lY3Rpb24uZVJlc291cmNlKCkgIT0gbnVsbCkgewotCQkJCQlJUmVtb3ZlQ29udGV4dCByYyA9IG5ldyBSZW1vdmVDb250ZXh0KGNvbm5lY3Rpb24pOwotCQkJCQlJUmVtb3ZlRmVhdHVyZSByZW1vdmVGZWF0dXJlID0gZmVhdHVyZVByb3ZpZGVyLmdldFJlbW92ZUZlYXR1cmUocmMpOwotCQkJCQlpZiAocmVtb3ZlRmVhdHVyZSAhPSBudWxsKSB7Ci0JCQkJCQlDb25uZWN0aW9uRGVjb3JhdG9yIGRlY29yYXRvcnNbXSA9IGNvbm5lY3Rpb24uZ2V0Q29ubmVjdGlvbkRlY29yYXRvcnMoKS50b0FycmF5KG5ldyBDb25uZWN0aW9uRGVjb3JhdG9yWzBdKTsKLQkJCQkJCWZvciAoQ29ubmVjdGlvbkRlY29yYXRvciBkZWNvcmF0b3IgOiBkZWNvcmF0b3JzKSB7Ci0JCQkJCQkJaWYgKGRlY29yYXRvciAhPSBudWxsICYmIChkZWNvcmF0b3IuZVJlc291cmNlKCkgIT0gbnVsbCkpIHsKLQkJCQkJCQkJRWNvcmVVdGlsLmRlbGV0ZShkZWNvcmF0b3IsIHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJlbW92ZUZlYXR1cmUucmVtb3ZlKHJjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBvc3RSZW1vdmUoSVJlbW92ZUNvbnRleHQgY29udGV4dCkgewotCX0KLQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FOwotCX0KLQkJCi0gICAgCi0JcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlyZXR1cm4gIChJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKXN1cGVyLmdldEZlYXR1cmVQcm92aWRlcigpOwotCX0gICAgCi0gICAgCi0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBJUmVtb3ZlQ29udGV4dCkgewotCQkJcmVtb3ZlKChJUmVtb3ZlQ29udGV4dCljb250ZXh0KTsKLQkJfQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1OGNmYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW5hbWVFbnRpdHlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlJlbmFtZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLQotcHVibGljIGNsYXNzIFJlbmFtZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBSZWZhY3RvckVudGl0eUZlYXR1cmUgewotCi0JcHVibGljIFJlbmFtZUVudGl0eUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJSVdvcmtiZW5jaFNpdGUgd3MgPSAoKElFZGl0b3JQYXJ0KWdldERpYWdyYW1FZGl0b3IoKSkuZ2V0U2l0ZSgpOwotCQlSZW5hbWVBY3Rpb24gYWN0aW9uID0gbmV3IFJlbmFtZUFjdGlvbih3cyk7Ci0JCWF0cyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFJlbGF0ZWRBdHRyaWJ1dGVzKGpwdCk7Ci0JCWV4ZWN1dGUoY29udGV4dCwgYWN0aW9uLCBjdSk7CQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuUmVuYW1lRW50aXR5RmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1JlbmFtZUVudGl0eVdpdGhvdXRVSUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4YmU3Yy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZW5hbWVFbnRpdHlXaXRob3V0VUlGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBSZW5hbWVFbnRpdHlXaXRob3V0VUlGZWF0dXJlIGV4dGVuZHMgUmVmYWN0b3JFbnRpdHlGZWF0dXJlIHsKLQkKLQlwcml2YXRlIFN0cmluZyBuZXdOYW1lID0gbnVsbDsKLQotCXB1YmxpYyBSZW5hbWVFbnRpdHlXaXRob3V0VUlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnAsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKGZwKTsKLQkJdGhpcy5uZXdOYW1lID0gbmV3TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlhdHMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRSZWxhdGVkQXR0cmlidXRlcyhqcHQpOwotCQlleGVjdXRlKG5ldyBDdXN0b21Db250ZXh0KCksIG5ld05hbWUsIGN1LCBqcHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQkvLyBub3QgdXNlZAotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1Jlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzMDhhYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXNpemVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZXNpemVTaGFwZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5EZWZhdWx0UmVzaXplU2hhcGVGZWF0dXJlOwotCi0KLXB1YmxpYyBjbGFzcyBSZXNpemVBdHRyaWJ1dGVGZWF0dXJlICBleHRlbmRzIERlZmF1bHRSZXNpemVTaGFwZUZlYXR1cmUgewotCi0JcHVibGljIFJlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUoSUZlYXR1cmVQcm92aWRlciBmcCkgewotCQlzdXBlcihmcCk7Ci0JfQotCQotICAgIHB1YmxpYyBib29sZWFuIGNhblJlc2l6ZVNoYXBlKElSZXNpemVTaGFwZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoSUNvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gaXNBdmFpbGFibGUoSUNvbnRleHQgY29udGV4dCkgewotICAgIAlyZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXNpemVKUEFFbnRpdHlGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXNpemVKUEFFbnRpdHlGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZjU5YjkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVzaXplSlBBRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVzaXplU2hhcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmltcGwuRGVmYXVsdFJlc2l6ZVNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci0KLQotcHVibGljIGNsYXNzIFJlc2l6ZUpQQUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBEZWZhdWx0UmVzaXplU2hhcGVGZWF0dXJlIHsKLQotCXB1YmxpYyBSZXNpemVKUEFFbnRpdHlGZWF0dXJlKElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLSAgICAgICAgc3VwZXIoZnApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNhblJlc2l6ZVNoYXBlKElSZXNpemVTaGFwZUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBib29sZWFuIGNhblJlc2l6ZSA9IHN1cGVyLmNhblJlc2l6ZVNoYXBlKGNvbnRleHQpOwotICAgICAgICBpZiAoY2FuUmVzaXplKSB7Ci0gICAgICAgIAlTaGFwZSBzaGFwZSA9IGNvbnRleHQuZ2V0U2hhcGUoKTsKLSAgICAgICAgICAgIE9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzaGFwZSk7ICAgICAgIAkKLSAgICAgICAgICAgIGlmIChibyA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoYm8gaW5zdGFuY2VvZiBQZXJzaXN0ZW50VHlwZSkgewotICAgICAgICAgICAgCVBlcnNpc3RlbnRUeXBlIGMgPSAoUGVyc2lzdGVudFR5cGUpIGJvOwotICAgICAgICAgICAgICAgIGlmIChjLmdldE5hbWUoKSAhPSBudWxsICYmIAotICAgICAgICAgICAgICAgIAkJYy5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBjYW5SZXNpemUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhblJlc2l6ZTsKLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSB2b2lkIHJlc2l6ZUNvbnRhaW5lclNoYXBlKElSZXNpemVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCQlzdXBlci5yZXNpemVTaGFwZShjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNpemVTaGFwZShmaW5hbCBJUmVzaXplU2hhcGVDb250ZXh0IGNvbnRleHQpIHsKLQkJZmluYWwgQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIGNvbnRleHQuZ2V0U2hhcGUoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZW50aXR5U2hhcGUpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlyZXNpemVDb250YWluZXJTaGFwZShjb250ZXh0KTsKLQkJCQlKUEFFZGl0b3JVdGlsLnJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGVudGl0eVNoYXBlLAotCQkJCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCksIGZhbHNlKTsKLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuICAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9Ci0JCi0gICAgCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXN0b3JlRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvUmVzdG9yZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiNjc0Ny4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9SZXN0b3JlRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgUmVzdG9yZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBYnN0cmFjdEN1c3RvbUZlYXR1cmUgewotCQotCXB1YmxpYyBSZXN0b3JlRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKVswXSk7Ci0JCWlmIChKUEFFZGl0b3JVdGlsLmlzRW50aXR5T3BlbkVsc2V3aGVyZShqcHQsIHRydWUpKSB7Ci0JCQlTdHJpbmcgc2hvcnRFbnROYW1lID0gSlBBRWRpdG9yVXRpbAotCQkJCQkucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKQotCQkJCQkJCS5nZXRFbnRpdHlOYW1lKGpwdCkpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZCgKLQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBU29sdmVyX2Nsb3NlV2FybmluZ01zZywgc2hvcnRFbnROYW1lKTsKLQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKQotCQkJCQkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBU29sdmVyX2Nsb3NlRWRpdG9ycywgbnVsbCwgbWVzc2FnZSwKLQkJCQkJTWVzc2FnZURpYWxvZy5XQVJOSU5HLAotCQkJCQluZXcgU3RyaW5nW10geyBKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0sgfSwgMCkgewotCQkJCXByb3RlY3RlZCBpbnQgZ2V0U2hlbGxTdHlsZSgpIHsKLQkJCQkJcmV0dXJuIFNXVC5DTE9TRSB8IFNXVC5USVRMRSB8IFNXVC5CT1JERVIKLQkJCQkJCQl8IFNXVC5BUFBMSUNBVElPTl9NT0RBTCB8IGdldERlZmF1bHRPcmllbnRhdGlvbigpOwotCQkJCX0KLQkJCX07Ci0JCQlkaWFsb2cub3BlbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlc3RvcmVFbnRpdHlDbGFzcyhqcHQsIGdldEZlYXR1cmVQcm92aWRlcigpKTsJCQotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW07Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NjVkNTEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1wdWJsaWMgY2xhc3MgU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZSBleHRlbmRzIFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZSB7Ci0KLQlwdWJsaWMgU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRDb25maXJtYXRpb25UZXh0KCkgewotCQlyZXR1cm4gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUFsbEVudGl0aWVzQ29uZmlybWF0aW9uOwotCX0KLQkKLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotCQlNZXNzYWdlRGlhbG9nIGRsZyA9IG5ldyBNZXNzYWdlRGlhbG9nKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldFNoZWxscygpWzBdLCAKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbGxFbnRpdGllc01lbnUsIAotCQkJCW51bGwsIGdldENvbmZpcm1hdGlvblRleHQoKSwgMCwgCi0JCQkJbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0ssIEpQQUVkaXRvck1lc3NhZ2VzLkJUTl9DQU5DRUx9LCBEaWFsb2cuQ0FOQ0VMKTsKLQkJaWYgKGRsZy5vcGVuKCkgIT0gRGlhbG9nLk9LKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSB0aGlzLmdldERpYWdyYW0oKS5nZXRDaGlsZHJlbigpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHNoID0gaXQubmV4dCgpOwotCQkJU2F2ZUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgU2F2ZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJSUN1c3RvbUNvbnRleHQgY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IHNoIH0pOwotCQkJZnQuZXhlY3V0ZShjdHgpOwotCQkJYWxsU2hhcGVzLmFkZChzaCk7Ci0JCX0KLQkJc3VwZXIuZXhlY3V0ZShjb250ZXh0KTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLlNhdmVBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlRW50aXR5RmVhdHVyZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUVudGl0eUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4OTY0Ny4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9TYXZlRW50aXR5RmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLkFic3RyYWN0Q3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIFNhdmVFbnRpdHlGZWF0dXJlIGV4dGVuZHMgQWJzdHJhY3RDdXN0b21GZWF0dXJlIHsKLQotCXB1YmxpYyBTYXZlRW50aXR5RmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZShJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0JCi0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKVswXSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQl9CQotCQotCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVNZW51SXRlbTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1VwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9mZWF0dXJlL1VwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZjkxNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvZmVhdHVyZS9VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5BYnN0cmFjdEN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLk9yaWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgVXBkYXRlQXR0cmlidXRlRmVhdHVyZSBleHRlbmRzIEFic3RyYWN0Q3VzdG9tRmVhdHVyZSB7Ci0KLQlwdWJsaWMgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShJRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXN1cGVyKGZwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWNvbm5lY3QoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucHJvZHVjZUFsbFJlbGF0aW9ucyhqcHQsIGZwKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCi0JCUl0ZXJhdG9yPElSZWxhdGlvbj4gaXQgPSByZWxzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlSZWxhdGlvbiByZWwgPSBpdC5uZXh0KCk7Ci0JCQlBZGRSZWxhdGlvbkZlYXR1cmUgcmVsRiA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUoZnApOwotCQkJQW5jaG9yQ29udGFpbmVyIGFjU291cmNlID0gKEFuY2hvckNvbnRhaW5lcikgZnAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbC5nZXRPd25lcigpKTsKLQkJCUFuY2hvckNvbnRhaW5lciBhY1RhcmdldCA9IChBbmNob3JDb250YWluZXIpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCWlmICgoYWNTb3VyY2UgIT0gbnVsbCkgJiYgKGFjVGFyZ2V0ICE9IG51bGwpKSB7IAotCQkJCUFkZENvbm5lY3Rpb25Db250ZXh0IGN0eCA9IG5ldyBBZGRDb25uZWN0aW9uQ29udGV4dChhY1NvdXJjZS5nZXRBbmNob3JzKCkuaXRlcmF0b3IoKS5uZXh0KCksIGFjVGFyZ2V0Ci0JCQkJCS5nZXRBbmNob3JzKCkuaXRlcmF0b3IoKS5uZXh0KCkpOwotCQkJCWN0eC5zZXROZXdPYmplY3QocmVsKTsKLQkJCQlyZWxGLmFkZChjdHgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB7QGxpbmsgR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZX0KLQkgKi8KLQlwdWJsaWMgdm9pZCBleGVjdXRlKElDdXN0b21Db250ZXh0IGNvbnRleHQpIHsKLQkJR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZSByZW1vdmUgPSBuZXcgR3JhcGhpY2FsUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCXJlbW92ZS5leGVjdXRlKGNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBHcmFwaGljYWxBZGRBdHRyaWJ1dGVGZWF0dXJlCi0JICogQHBhcmFtIGVudGl0eVNoYXBlCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENvbnRhaW5lclNoYXBlIGFkZEF0dHJpYnV0ZXMoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0dHIpIHsKLQkJQWRkQ29udGV4dCBjb250ZXh0ID0gbmV3IEFkZENvbnRleHQoKTsKLQkJY29udGV4dC5zZXROZXdPYmplY3QobmV3QXR0cik7Ci0JCWNvbnRleHQuc2V0VGFyZ2V0Q29udGFpbmVyKGVudGl0eVNoYXBlKTsKLQkJR3JhcGhpY2FsQWRkQXR0cmlidXRlRmVhdHVyZSBmZWF0dXJlID0gbmV3IEdyYXBoaWNhbEFkZEF0dHJpYnV0ZUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlyZXR1cm4gKENvbnRhaW5lclNoYXBlKSBmZWF0dXJlLmFkZChjb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRGZWF0dXJlUHJvdmlkZXIoKSB7Ci0JCXJldHVybiAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcikgc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUZXh0IGFkZFRleHQoSUZlYXR1cmVQcm92aWRlciBmcCwgUmVjdGFuZ2xlIHRleHRSZWN0YW5nbGUsIFN0cmluZyB0eHQpIHsKLQkJVGV4dCB0ZXh0ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlRGVmYXVsdFRleHQoZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSwgdGV4dFJlY3RhbmdsZSwgdHh0KTsKLQkJQ29sb3IgY29sb3IgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihmcC5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfVEVYVF9GT1JFR1JPVU5EKTsKLQkJdGV4dC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQkJdGV4dC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KE9yaWVudGF0aW9uLkFMSUdOTUVOVF9MRUZUKTsKLQkJdGV4dC5zZXRWZXJ0aWNhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfVE9QKTsKLQkJdGV4dC5nZXRGb250KCkuc2V0Qm9sZCh0cnVlKTsKLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZWN0YW5nbGUgYWRkUmVjdGFuZ2xlRm9yVGV4dChDb250YWluZXJTaGFwZSBjcywgaW50IGF0dHJpYkluZGV4LCBpbnQgd2lkdGgpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSZWN0YW5nbGUoY3MpOwotCQlyZWN0LnNldEZpbGxlZChmYWxzZSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoZmFsc2UpOwotCQlyZWN0LnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFX1JFQ1RfSEVJR0hUKTsKLQkJcmVjdC5zZXRXaWR0aCh3aWR0aCAtIEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIpOwotCQlyZWN0LnNldFgoSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURV9URVhUX1JFQ1RfWCk7Ci0JCXJlY3QKLQkJCQkuc2V0WShKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFU19UT1BfT0ZGU0VUICsgYXR0cmliSW5kZXgKLQkJCQkJCSogSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVApOwotCQlyZXR1cm4gcmVjdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlY3RhbmdsZSBhZGRSZWN0YW5nbGVGb3JJY29uKENvbnRhaW5lclNoYXBlIGNzLCBpbnQgYXR0cmliSW5kZXgpIHsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVSZWN0YW5nbGUoY3MpOwotCQlyZWN0LnNldEZpbGxlZChmYWxzZSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoZmFsc2UpOwotCQlyZWN0LnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9SRUNUX0hFSUdIVCk7Ci0JCXJlY3Quc2V0WChKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9SRUNUX0xFRlRfT0ZGU0VUKTsKLQkJcmVjdC5zZXRXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuSUNPTl9SRUNUX1dJRFRIKTsKLQkJcmVjdAotCQkJCS5zZXRZKEpQQUVkaXRvckNvbnN0YW50cy5BVFRSSUJVVEVTX1RPUF9PRkZTRVQgKyBhdHRyaWJJbmRleAotCQkJCQkJKiBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFU19QTEFDRU1FTlRfU1RFUCk7Ci0JCXJldHVybiByZWN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlcGFyYXRvcnNUb1NoYXBlKENvbnRhaW5lclNoYXBlIGNvbXBhcnRtZW50U2hhcGUpIHsKLQkJYWRkU2VwYXJhdG9yVG9Db2xsZWN0aW9uKGNvbXBhcnRtZW50U2hhcGUsIDApOwotCQlhZGRTZXBhcmF0b3JUb0NvbGxlY3Rpb24oY29tcGFydG1lbnRTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTVBBUlRNRU5UX01JTl9IRUlHSFQpOwotCX0KLQotCXByaXZhdGUgU2hhcGUgYWRkU2VwYXJhdG9yVG9Db2xsZWN0aW9uKENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLCBpbnQgeSkgewotCQlmaW5hbCBpbnQgd2lkdGggPSBjb250YWluZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFdpZHRoKCk7Ci0JCVNoYXBlIHNoYXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlU2hhcGUoY29udGFpbmVyU2hhcGUsIGZhbHNlKTsKLQkJUmVjdGFuZ2xlIHJlY3RhbmdsZSA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVJlY3RhbmdsZShzaGFwZSk7Ci0JCXJlY3RhbmdsZS5zZXRGb3JlZ3JvdW5kKG1hbmFnZUNvbG9yKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfQkFDS0dST1VORCkpOwotCQlyZWN0YW5nbGUuc2V0QmFja2dyb3VuZChtYW5hZ2VDb2xvcihKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0JPUkRFUl9DT0xPUikpOwotCQlyZWN0YW5nbGUuc2V0TGluZVZpc2libGUoZmFsc2UpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRTaXplKHJlY3RhbmdsZSwgd2lkdGgsIEpQQUVkaXRvckNvbnN0YW50cy5TRVBBUkFUT1JfSEVJR0hUKTsKLQkJR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuc2V0TG9jYXRpb25BbmRTaXplKHJlY3RhbmdsZSwgMCwgeSwgd2lkdGgsIEpQQUVkaXRvckNvbnN0YW50cy5TRVBBUkFUT1JfSEVJR0hUKTsKLQkJcmV0dXJuIHNoYXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9pMThuL0pQQUVkaXRvck1lc3NhZ2VzLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9KUEFFZGl0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGFmZGYxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9pMThuL0pQQUVkaXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEpQQUVudGl0eUZlYXR1cmVfYmFzaWNBdHRyaWJ1dGVzU2hhcGVzOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkSlBBRW50aXR5RmVhdHVyZV9wcmltYXJ5S2V5c1NoYXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkSlBBRW50aXR5RmVhdHVyZV9yZWxhdGlvbkF0dHJpYnV0ZXNTaGFwZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkxhYmVsOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2RlbGV0ZUF0dHJpYnV0ZVF1ZXN0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZURpYWdyYW1Kb2JfY3JlYXRlRGlhZ3JhbUpvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlRGlhZ3JhbUpvYl9nZXRKUEFEaWFncmFtTW9uaXRvclRhc2tOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUpQQUVudGl0eUZlYXR1cmVfY3JlYXRlRW50aXR5RXJyb3JNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yTXNnVGl0bGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yU3RhdHVzTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFFbnRpdHlGZWF0dXJlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFFbnRpdHlGZWF0dXJlTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYVByb2plY3RTZWxlY3Rpb25EaWFsb2dEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2pwYVByb2plY3RTZWxlY3Rpb25EaWFsb2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZUpQQUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzRmVhdHVyZV9jcmVhdGVJbmhlcml0ZWRFbnRpdHlGZWF0dXJlTmFtZTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvTWFueUJpRGlyRmVhdHVyZU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvTWFueVVuaURpckZlYXR1cmVOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZU5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmVfbWFueVRvT25lVW5pRGlyRmVhdHVyZU5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvTWFueVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9NYW55VW5pRGlyRmVhdHVyZU5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb09uZUJpRGlyRmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmVfb25lVG9PbmVCaURpckZlYXR1cmVOYW1lOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZU5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlRmVhdHVyZV9kZWxldGVDb25maXJtOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZUpQQUVudGl0eUZlYXR1cmVfZGVsZXRlSlBBRW50aXR5UXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVsZXRlSlBBRW50aXR5RmVhdHVyZV9kZWxldGVKUEFFbnRpdGllc1F1ZXN0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlbGV0ZVJlbGF0aW9uRmVhdHVyZV9kZWxldGVSZWxhdGlvblF1ZXN0aW9uOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX2F0dHJpYnV0ZUV4aXN0czsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlX2NsYXNzTmFtZU1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9icmFjZXNOb3RBbGxvd2VkTXNnOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0RWRpdEpQQUVudGl0eUZlYXR1cmVfZHVwbGljYXRlRW50aXR5TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9saW5lQnJlYWtzTm90QWxsb3dlZE1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9zcGFjZXNOb3RBbGxvd2VkTXNnOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2NsYXNzTmFtZU1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9saW5lQnJlYWtzTm90QWxsb3dlZE1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9zY3BhY2VzTm90QWxsb3dlZE1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9pbnZhbGlkU3ltYm9sc01zZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKcGFBcnRpZmFjdEZhY3RvcnlfQ2FuTm90Q2hlY2tSZXR1cm5UeXBlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRGlhZ3JhbUVkaXRvcl93YWl0aW5nRm9yTW9pbjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFEaWFncmFtUHJvcGVydHlQYWdlX2VyclNhdmVQcm9wc01zZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGV4dDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9wYWdlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0Q29sbGVjdGlvblR5cGVTZWN0aW9uVGl0dGxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lUHJlZml4TXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlVG9Vc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRQYWNrYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkVGFibGVOYW1lUHJlZml4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzVG9vbHRpcDsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUFjY2Vzc1R5cGVCdXR0b25Hcm91cFRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUFjY2Vzc1R5cGVCdXR0b25Hcm91cExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlGaWVsZEJhc2VkQWNjZXNzQnV0dG9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eVByb3BlcnR5QmFzZWRBY2Nlc3NCdXR0b25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGVmYXVsdEZvbGRlckNvbnRyb2xUb29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbExhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkRm9sZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbXB0eUZvbGRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2Vfb25lVG9NYW55T2xkU3R5bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX29uZVRvTWFueU9sZFN0eWxlVG9vbHRpcDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yUHJvcGVydHlQYWdlX29uZVRvTWFueU9sZFN0eWxlVG9vbHRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQXR0ckdyb3VwTWVudUl0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUF0dHJHcm91cE1lbnVJdGVtRGVzY3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VDb21wYXJ0VG9vbFRpcDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlRW50aXR5TWVudUl0ZW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbURlc2NyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQWxsRW50aXRpZXNNZW51SXRlbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW1EZXNjcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2N1c3RvbVN1Yk1lbnVEZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jdXN0b21TdWJNZW51VGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVBdHRyaWJ1dGVCdXR0b25sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVFbnRpdHlGcm9tTW9kZWxCdXR0b25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVFbnRpdHlGcm9tTW9kZWxCdXR0b25MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW07Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kaXNjYXJkQ2hhbmdlc01lbnVJdGVtRGVzY3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlRW50aXR5RnJvbURpYWdyYW1CdXR0b25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVFbnRpdHlGcm9tRGlhZ3JhbUJ1dHRvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVCdXR0b25UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVCdXR0b25EZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVNZW51SXRlbTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVNZW51SXRlbURlc2NyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Jlc3RvcmVCdXR0b25UZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Jlc3RvcmVCdXR0b25EZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQnV0dG9uVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQnV0dG9uRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Nob3dBbGxUaGVFbnRpdGllc0Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JTdWJNZW51OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbmFtZUVudGl0eUNsYXNzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX21vdmVFbnRpdHlDbGFzczsJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3BlbkpQQURldGFpbHNWaWV3OyAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuSlBBRGV0YWlsc1ZpZXdEZXNjOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuTWluaWF0dXJlVmlldzsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3Blbk1pbmlhdHVyZVZpZXdEZXNjOwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9hcHBseVBhdHRlcm47IAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2FwcGx5UGF0dGVybkRlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQXR0ck1lbnVJdGVtOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQXR0ck1lbnVJdGVtRGVzY3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQ29tcGFydFRvb2xUaXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHlNZW51SXRlbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRFbnRpdHltZW51SXRlbURlc2NyOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEFsbEVudGl0aWVzTWVudUl0ZW07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQWxsRW50aXRpZXNNZW51SXRlbURlc2NyOwkKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlZmFjdG9yQXR0cmlidXRlVHlwZTsgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JBdHRyaWJ1dGVUeXBlRGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbGxFbnRpdGllc01lbnU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUFsbEVudGl0aWVzQWN0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZERpc2NhcmRBbGxFbnRpdGllc0FjdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNDb25maXJtYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQ29uZmlybWF0aW9uOwkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9jYW50TWFrZURpYWdyYW1Xcml0YWJsZU1zZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX0pQQURpYWdyYW1SZWFkT25seVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5TXNnOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5SGFzVG9BZGRNc2c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX29wZW5KUEFEaWFncmFtRXJyb3JNc2dUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX29wZW5KUEFEaWFncmFtRXJyb3JNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9qcGFTdXBwb3J0V2FybmluZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfanBhU3VwcG9ydFdhcm5pbmdNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfbm9QZXJzaXN0ZW5jZVVuaXRNc2c7IAotCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Jyb3dzZUJ0blR4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTZWxlY3RUeXBlRGlhbG9nX2Jyb3dzZUJ0bkRlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ190eXBlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nV2luZG93VGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0VHlwZURpYWxvZ19pbnZhbGlkVHlwZU1zZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFR5cGVEaWFsb2dfaW52YWxpZFR5cGVNc2dUZXh0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNlbGVjdFR5cGVEaWFsb2dfZW1wdHlUeXBlRXJyb3JUZXh0OwotCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVXRpbF9mdWxsbmFtZVRvb2x0aXBUZXh0OwkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JVdGlsX3R5cGVUb29sdGlwVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKUEFFZGl0b3JVdGlsX2FwcGx5Q2hhbmdlc0pvYk5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBRWRpdG9yVXRpbF9pbmhlcml0VHlwZVRvb2x0aXBUZXh0OwotCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFsZXR0ZUNvbXBhcnRtZW50X0Nvbm5lY3Rpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBhbGV0dGVDb21wYXJ0bWVudF9PYmplY3RzOwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpQQVNvbHZlcl9jbG9zZVdhcm5pbmdNc2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlBBU29sdmVyX2Nsb3NlRWRpdG9yczsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb247Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZV9kaXNjYXJkV2FybmluZ01zZzsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVFbnRpdHlGZWF0dXJlX0NvbnRleHRNZW51T3BlcmF0aW9uRGVzY3JpcHRpb247Ci0JIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJUTl9PSzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVE5fQ0FOQ0VMOwkKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRW50aXR5RmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uOyAKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdENsb3NlRmlsZVN0cmVhbUVycm9yTVNHOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RDcmVhdGVET01GaWxlRXJyb3JNU0c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdEZpbmRGaWxlRXJyb3JNU0c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdE9idGFpblByb2plY3RFcnJvck1TRzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UGFyc2VGaWxlRXJyb3JNU0c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdFJlYWRGaWxlRXJyb3JNU0c7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdFJlZnJmcmVzaEZpbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb2RlbEludGVncmF0aW9uVXRpbF9DYW5ub3RTZXRGaWxlQ29udGVudEVycm9yTVNHOwotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSlBBRWRpdG9yTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgSlBBRWRpdG9yTWVzc2FnZXMoKSB7Ci0JfQotfQotCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL2kxOG4vbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5ODk1Zi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvaTE4bi9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIDxjb3B5cmlnaHQ+Ci0jCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0jCi0jIDwvY29weXJpZ2h0PgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFkZEpQQUVudGl0eUZlYXR1cmVfYmFzaWNBdHRyaWJ1dGVzU2hhcGVzPU90aGVyIEF0dHJpYnV0ZXMKLUFkZEpQQUVudGl0eUZlYXR1cmVfcHJpbWFyeUtleXNTaGFwZT1QcmltYXJ5IEtleQotQWRkSlBBRW50aXR5RmVhdHVyZV9yZWxhdGlvbkF0dHJpYnV0ZXNTaGFwZXM9UmVsYXRpb24gQXR0cmlidXRlcwotQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgb2YgdGhpcyBlbnRpdHkuCi1DbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uTGFiZWw9Q3JlYXRlIEF0dHJpYnV0ZQotCi1DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfY3JlYXRlQXR0cmlidXRlQnV0dG9uRGVzY3JpcHRpb249Q3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSBvZiB0aGlzIGVudGl0eS4KLUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZV9jcmVhdGVBdHRyaWJ1dGVCdXR0b25sYWJlbD1DcmVhdGUgQXR0cmlidXRlCi1DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmVfZGVsZXRlQXR0cmlidXRlUXVlc3Rpb249RG8geW91IHdhbnQgdG8gZGVsZXRlIGF0dHJpYnV0ZSAiezB9Ij8KLQotQ3JlYXRlRGlhZ3JhbUpvYl9jcmVhdGVEaWFncmFtSm9iTmFtZT1DcmVhdGluZyBkaWFncmFtIGZvcjogezB9Li4uCi1DcmVhdGVEaWFncmFtSm9iX2dldEpQQURpYWdyYW1Nb25pdG9yVGFza05hbWU9R2V0IEpQQSBEaWFncmFtCi1DcmVhdGVKUEFFbnRpdHlGZWF0dXJlX2NyZWF0ZUVudGl0eUVycm9yTXNnPUVudGl0eSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLUNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfY3JlYXRlRW50aXR5RXJyb3JNc2dUaXRsZT1DYW5ub3QgQ3JlYXRlIEVudGl0eQotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9jcmVhdGVFbnRpdHlFcnJvclN0YXR1c01zZz1QZXJzaXN0ZW5jZSBBUEkgbGlicmFyeSBpcyBub3QgaW50byB0aGUgcHJvamVjdCdzIGNsYXNzcGF0aC4KLUNyZWF0ZUpQQUVudGl0eUZlYXR1cmVfanBhRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBKUEEgZW50aXR5LgotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFFbnRpdHlGZWF0dXJlTmFtZT1KYXZhIEVudGl0eQotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFQcm9qZWN0U2VsZWN0aW9uRGlhbG9nRGVzY3JpcHRpb249U2VsZWN0IGEgSlBBIHByb2plY3QgdG8gY29udGFpbiB0aGUgZW50aXR5LgotQ3JlYXRlSlBBRW50aXR5RmVhdHVyZV9qcGFQcm9qZWN0U2VsZWN0aW9uRGlhbG9nVGl0bGU9U2VsZWN0IEpQQSBQcm9qZWN0Ci1DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmVfY3JlYXRlSW5oZXJpdGVkRW50aXR5RmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBhIG5ldyBKUEEgZW50aXR5IHRoYXQgd2lsbCBpbmhlcml0IGEgbmV3IE1hcHBlZCBTdXBlcmNsYXNzLgotQ3JlYXRlSlBBRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NGZWF0dXJlX2NyZWF0ZUluaGVyaXRlZEVudGl0eUZlYXR1cmVOYW1lPUluaGVyaXRlZCBFbnRpdHkKLQotQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlCaURpckZlYXR1cmVOYW1lPU1hbnktdG8tTWFueQotQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBiaWRpcmVjdGlvbmFsIG1hbnktdG8tbWFueSByZWxhdGlvbi4KLQotQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgdW5pZGlyZWN0aW9uYWwgbWFueS10by1tYW55IHJlbGF0aW9uLgotQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9tYW55VG9NYW55VW5pRGlyRmVhdHVyZU5hbWU9TWFueS10by1NYW55Ci0KLUNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgYmlkaXJlY3Rpb25hbCBtYW55LXRvLW9uZSByZWxhdGlvbi4KLUNyZWF0ZU1hbnlUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZUJpRGlyRmVhdHVyZU5hbWU9TWFueS10by1PbmUKLQotQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVEZXNjcmlwdGlvbj1DcmVhdGUgbmV3IHVuaWRpcmVjdGlvbmFsIG1hbnktdG8tb25lIHJlbGF0aW9uLgotQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX21hbnlUb09uZVVuaURpckZlYXR1cmVOYW1lPU1hbnktdG8tT25lCi0KLUNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyB1bmlkaXJlY3Rpb25hbCBvbmUtdG8tbWFueSByZWxhdGlvbi4KLUNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZV9vbmVUb01hbnlVbmlEaXJGZWF0dXJlTmFtZT1PbmUtdG8tTWFueQotCi1DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlRGVzY3JpcHRpb249Q3JlYXRlIG5ldyBiaWRpcmVjdGlvbmFsIG9uZS10by1vbmUgcmVsYXRpb24uCi1DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lQmlEaXJGZWF0dXJlTmFtZT1PbmUtdG8tT25lCi0KLUNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZURlc2NyaXB0aW9uPUNyZWF0ZSBuZXcgdW5pZGlyZWN0aW9uYWwgb25lLXRvLW9uZSByZWxhdGlvbi4KLUNyZWF0ZU9uZVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlX29uZVRvT25lVW5pRGlyRmVhdHVyZU5hbWU9T25lLXRvLU9uZQotCi1EZWxldGVGZWF0dXJlX2RlbGV0ZUNvbmZpcm09Q29uZmlybSBEZWxldGUKLURlbGV0ZUpQQUVudGl0eUZlYXR1cmVfZGVsZXRlSlBBRW50aXR5UXVlc3Rpb249RG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBlbnRpdHkgInswfSIgZnJvbSB0aGUgZGlhZ3JhbSBhbmQgZGVsZXRlIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgcmVzb3VyY2UgInsxfSI/Ci1EZWxldGVKUEFFbnRpdHlGZWF0dXJlX2RlbGV0ZUpQQUVudGl0aWVzUXVlc3Rpb249RG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBzZWxlY3RlZCBlbnRpdGllcyBmcm9tIHRoZSBkaWFncmFtIGFuZCBkZWxldGUgdGhlIGNvcnJlc3BvbmRpbmcgSmF2YSByZXNvdXJjZXM/Ci0KLURlbGV0ZVJlbGF0aW9uRmVhdHVyZV9kZWxldGVSZWxhdGlvblF1ZXN0aW9uPURvIHlvdSB3YW50IHRvIHJlbW92ZSB0aGlzIHJlbGF0aW9uIGZyb20gdGhlIGRpYWdyYW0gYW5kIHVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBKYXZhIHJlc291cmNlcz8KLQotRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzPUF0dHJpYnV0ZSB3aXRoIG5hbWUgInswfSIgYWxyZWFkeSBleGlzdHMuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9jbGFzc05hbWVNc2c9RW50ZXIgYW4gYXR0cmlidXRlIG5hbWUuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9saW5lQnJlYWtzTm90QWxsb3dlZE1zZz1Zb3UgY2Fubm90IHVzZSBsaW5lIGJyZWFrcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCi1EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZV9zcGFjZXNOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIHNwYWNlcyBpbiBhdHRyaWJ1dGUgbmFtZXMuCi0KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2JyYWNlc05vdEFsbG93ZWRNc2c9WW91IGNhbm5vdCB1c2UgYnJhY2VzIGluIGVudGl0eSBuYW1lcy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2NsYXNzTmFtZU1zZz1FbnRlciBhbiBlbnRpdHkgbmFtZS4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2R1cGxpY2F0ZUVudGl0eU5hbWU9RW50aXR5IHdpdGggbmFtZSAiezB9IiBhbHJlYWR5IGV4aXN0cy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX2xpbmVCcmVha3NOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIGxpbmUgYnJlYWtzIGluIGVudGl0eSBuYW1lcy4KLURpcmVjdEVkaXRKUEFFbnRpdHlGZWF0dXJlX3NjcGFjZXNOb3RBbGxvd2VkTXNnPVlvdSBjYW5ub3QgdXNlIHNwYWNlcyBpbiBlbnRpdHkgbmFtZXMuCi1EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZV9pbnZhbGlkU3ltYm9sc01zZz0iezB9IiBpcyBub3QgYSB2YWxpZCBlbnRpdHkgbmFtZS4KLURpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbj1SZW1vdmUgQWxsIEVudGl0aWVzIEZyb20gRGlhZ3JhbSBhbmQgRGlzY2FyZCBDaGFuZ2VzCi0KLUpwYUFydGlmYWN0RmFjdG9yeV9DYW5Ob3RDaGVja1JldHVyblR5cGU9Q2Fubm90IGNoZWNrIHRoZSByZXR1cm4gdHlwZQotCi1KUEFEaWFncmFtRWRpdG9yX3dhaXRpbmdGb3JNb2luPVdhaXRpbmcgZm9yIE1PSU4gY29ubmVjdGlvbiBpbml0aWFsaXphdGlvbi4uLgotCi1KUEFEaWFncmFtUHJvcGVydHlQYWdlX2VyclNhdmVQcm9wc01zZ1RpdGxlPUNhbm5vdCBTYXZlIFByb3BlcnRpZXMKLUpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2VfZXJyU2F2ZVByb3BzTXNnVGV4dD1UaGUgSlBBIGRpYWdyYW0gcHJvcGVydGllcyBjb3VsZCBub3QgYmUgc2F2ZWQKLQotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX3BhZ2VEZXNjcmlwdGlvbj1EZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgSlBBIGRpYWdyYW0gZWRpdG9yOgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25EZXNjcmlwdGlvbj1SZWxhdGlvbiBhdHRyaWJ1dGVzLCB3aGljaCB5b3UgZ2VuZXJhdGUgdXNpbmcgdGhlIEpQQSBlZGl0b3IsXG5hcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHRvIGJlIG9mIHRoZSBzcGVjaWZpZWQgY29sbGVjdGlvbiB0eXBlLgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25UaXR0bGU9RGVmYXVsdCBDb2xsZWN0aW9uIFR5cGUKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZU1zZz1FbnRpdGllcywgd2hpY2ggeW91IGdlbmVyYXRlIHVzaW5nIHRoZSBKUEEgZWRpdG9yIHBhbGV0dGUsXG5hcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGluIHRoZSBzcGVjaWZpZWQgcGFja2FnZS4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lUHJlZml4TXNnPUVudGl0aWVzLCB3aGljaCB5b3UgaGF2ZSBjcmVhdGVkLCB1c2luZyB0aGUgSlBBIGVkaXRvciBwYWxldHRlLCBhcmUgYXV0b21hdGljYWxseVxuYW5ub3RhdGVkIHdpdGggQFRhYmxlKG5hbWU9Li4uKSwgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGlzIGEgcmVzdWx0IG9mXG5jb25jYXRlbmF0aW9uIG9mIHRoZSBnaXZlbiBwcmVmaXggYW5kIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkuIElmIHlvdSBzZXRcbmEgYmxhbmsgcHJlZml4LCB0aGUgbmV3bHkgY3JlYXRlZCBlbnRpdGllcyBhcmUgbm90IGFubm90YXRlZCB3aXRoIEBUYWJsZS4KLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lTGFiZWw9RGVmYXVsdCAmdGFibGUgbmFtZSBwcmVmaXg6Ci1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VUb1VzZT1EZWZhdWx0ICZKYXZhIHBhY2thZ2UgZm9yIG5ldyBlbnRpdGllczoKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkUGFja2FnZT0iezB9IiBpcyBub3QgYSB2YWxpZCBKYXZhIGlkZW50aWZpZXIuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfaW52YWxpZFRhYmxlTmFtZVByZWZpeD1UYWJsZSBuYW1lIHByZWZpeCBtYXkgY29udGFpbiBsZXR0ZXJzLCBkaWdpdHMgYW5kIHVuZGVyc2NvcmVzIG9ubHksIGFuZCBtdXN0IG5vdCBzdGFydCB3aXRoIGEgZGlnaXQuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGlyZWN0RWRpdEFmZmVjdHNDbGFzcz0mRWRpdGluZyB0aGUgZW50aXR5IG5hbWUgaW4gdGhlIGRpYWdyYW0gYWZmZWN0cyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc291cmNlIGZpbGUKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzVG9vbHRpcD1JZiB0aGlzIG9wdGlvbiBpcyBjaGVja2VkIGFuZCB0aGUgZW50aXR5IG5hbWUgaXMgYXBwb2ludGVkXG5ieSB0aGUgQEVudGl0eSBhbm5vdGF0aW9uLCBkaXJlY3QgZW50aXR5IG5hbWUgZWRpdGluZyB3aWxsXG5hZmZlY3QgdGhlIGFubm90YXRpb24gYW5kIHdpbGwgY2F1c2UgY2xhc3MgbmFtZSByZWZhY3RvcmluZy5cbklmIHRoaXMgb3B0aW9uIGlzIHVuY2hlY2tlZCwgZGlyZWN0IGVkaXRpbmcgd2lsbCBhZmZlY3QgdGhlXG5hbm5vdGF0aW9uIG9ubHkuIElmIHRoZSBlbnRpdHkgbmFtZSBpcyBub3QgYXBwb2ludGVkIGJ5IHRoZVxuQEVudGl0eSBhbm5vdGF0aW9uLCBkaXJlY3QgZWRpdGluZyB3aWxsIGNhdXNlIGNsYXNzIG5hbWVcbnJlZmFjdG9yaW5nIHJlZ2FyZGxlc3MgdGhpcyBvcHRpb24gaXMgY2hlY2tlZCBvciBub3QuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwVG9vbHRpcD1FbnRpdGllcywgd2hpY2ggeW91IGdlbmVyYXRlIHVzaW5nIHRoZSBKUEEgZWRpdG9yIHBhbGV0dGUsXG5hcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBhY2Nlc3MuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwTGFiZWw9RW50aXR5IGFjY2VzcyB0eXBlCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5RmllbGRCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsPSZGaWVsZC1iYXNlZAotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eVByb3BlcnR5QmFzZWRBY2Nlc3NCdXR0b25MYWJlbD0mUHJvcGVydHktYmFzZWQKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbFRvb2x0aXA9VGhlIG5ld2x5IGNyZWF0ZWQgZGlhZ3JhbSBmaWxlKHMpIHdpbGwgYmUgc3RvcmVkIGluIHRoaXMgZm9sZGVyCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGVmYXVsdEZvbGRlckNvbnRyb2xMYWJlbD1Gb2xkZXIgZm9yICZkaWFncmFtczoKLUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9pbnZhbGlkRm9sZGVyPVRoZSBmb2xkZXIgbmFtZSBtdXN0IGJlIHByZWNlZGVkIGJ5ICJ7MH0iLgotSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VtcHR5Rm9sZGVyPVRoZSBmb2xkZXIgbmFtZSBmb3IgZGlhZ3JhbXMgbXVzdCBub3QgYmUgZW1wdHkuCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2Vfb25lVG9NYW55T2xkU3R5bGU9Jk9uZS10by1NYW55IHVuaWRpcmVjdGlvbmFsIG9sZCAoSlBBIDEuMCkgc3R5bGUgcmVsYXRpb25zIGluIEpQQSAyLjAgcHJvamVjdHMgCi1KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwPUlmIHRoaXMgb3B0aW9uIGlzIGNoZWNrZWQsIHRoZSBuZXdseSBjcmVhdGVkIE9uZS10by1NYW55XG51bmlkaXJlY3Rpb25hbCByZWxhdGlvbnMgaW4gSlBBIDIuMCBwcm9qZWN0cyB3aWxsIGJlIG9sZFxuKEpQQSAxLjApIHN0eWxlLiAgSS5lLiwgdGhlIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlcyB3aWxsXG5iZSBjcmVhdGVkIHdpdGhvdXQgQEpvaW5Db2x1bW4ocykgYW5ub3RhdGlvbi4KLQotSlBBRWRpdG9yUHJvcGVydHlQYWdlX29uZVRvTWFueU9sZFN0eWxlPSZPbmUtdG8tTWFueSB1bmlkaXJlY3Rpb25hbCBvbGQgKEpQQSAxLjApIHN0eWxlIHJlbGF0aW9ucwotSlBBRWRpdG9yUHJvcGVydHlQYWdlX29uZVRvTWFueU9sZFN0eWxlVG9vbHRpcD1JZiB0aGlzIG9wdGlvbiBpcyBjaGVja2VkLCB0aGUgbmV3bHkgY3JlYXRlZCBPbmUtdG8tTWFueVxudW5pZGlyZWN0aW9uYWwgcmVsYXRpb25zIHdpbGwgYmUgb2xkIChKUEEgMS4wKSBzdHlsZS5cbkkuZS4sIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMgd2lsbCBiZSBjcmVhdGVkIHdpdGhvdXRcbkBKb2luQ29sdW1uKHMpIGFubm90YXRpb24uCi0KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQXR0ckdyb3VwTWVudUl0ZW09Q29sbGFwc2UgQXR0cmlidXRlcyBHcm91cAotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBdHRyR3JvdXBNZW51SXRlbURlc2NyPUNvbGxhcHNlIHRoZSBhdHRyaWJ1dGVzIGdyb3VwLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VDb21wYXJ0VG9vbFRpcD1Eb3VibGUgY2xpY2sgdG8gY29sbGFwc2UgInswfSIgYXR0cmlidXRlcyBncm91cC4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlRW50aXR5TWVudUl0ZW09Q29sbGFwc2UgRW50aXR5Ci1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUVudGl0eU1lbnVJdGVtRGVzY3I9Q29sbGFwc2UgZW50aXR5LgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBbGxFbnRpdGllc01lbnVJdGVtPUNvbGxhcHNlIEFsbAotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBbGxFbnRpdGllc01lbnVJdGVtRGVzY3I9Q29sbGFwc2UgYWxsIGVudGl0aWVzCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jcmVhdGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbj1DcmVhdGUgbmV3IGF0dHJpYnV0ZSBvZiB0aGlzIGVudGl0eS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbmxhYmVsPUNyZWF0ZSBBdHRyaWJ1dGUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2N1c3RvbVN1Yk1lbnVEZXNjcmlwdGlvbj1DdXN0b20gZmVhdHVyZXMgc3VibWVudQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3VzdG9tU3ViTWVudVRleHQ9Q3VzdG9tCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbj1EZWxldGUgdGhpcyBhdHRyaWJ1dGUgZnJvbSB0aGUgbW9kZWwuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVBdHRyaWJ1dGVCdXR0b25sYWJlbD1EZWxldGUgQXR0cmlidXRlCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVFbnRpdHlGcm9tTW9kZWxCdXR0b25EZXNjcmlwdGlvbj1SZW1vdmUgdGhpcyBKUEEgZW50aXR5IGZyb20gdGhlIGRpYWdyYW0gYW5kIGRlbGV0ZSBpdCBmcm9tIHRoZSBKUEEgbW9kZWwuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVFbnRpdHlGcm9tTW9kZWxCdXR0b25MYWJlbD1EZWxldGUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2Rpc2NhcmRDaGFuZ2VzTWVudUl0ZW09RGlzY2FyZCBDaGFuZ2VzCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kaXNjYXJkQ2hhbmdlc01lbnVJdGVtRGVzY3I9RGlzY2FyZCBhbGwgY2hhbmdlcyBtYWRlIHRvIHRoaXMgSlBBIGVudGl0eSBhZnRlciB0aGUgbGFzdCBzYXZpbmcuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVFbnRpdHlGcm9tRGlhZ3JhbUJ1dHRvbkRlc2NyaXB0aW9uPURpc2NhcmQgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIEpQQSBlbnRpdHkgYWZ0ZXIgdGhlIGxhc3Qgc2F2aW5nIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgZGlhZ3JhbS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUVudGl0eUZyb21EaWFncmFtQnV0dG9uTGFiZWw9RGlzY2FyZCBDaGFuZ2VzIGFuZCBSZW1vdmUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVCdXR0b25UZXh0PVNhdmUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVCdXR0b25EZXNjcmlwdGlvbj1TYXZlIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBKUEEgZW50aXR5LgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtPVNhdmUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVNZW51SXRlbURlc2NyPVNhdmUgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIEpQQSBlbnRpdHkuCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZXN0b3JlQnV0dG9uVGV4dD1EaXNjYXJkIENoYW5nZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Jlc3RvcmVCdXR0b25EZXNjcmlwdGlvbj1EaXNjYXJkIGFsbCBjaGFuZ2VzIG1hZGUgdG8gdGhpcyBKUEEgZW50aXR5IGFmdGVyIHRoZSBsYXN0IHNhdmluZy4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVCdXR0b25UZXh0PVNhdmUgQW5kIFJlbW92ZQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUJ1dHRvbkRlc2NyaXB0aW9uPVNhdmUgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGlzIGVudGl0eSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRpYWdyYW0uCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zaG93QWxsVGhlRW50aXRpZXM9U2hvdyBBbGwgRW50aXRpZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Nob3dBbGxUaGVFbnRpdGllc0Rlc2M9U2hvdyBhbGwgZW50aXRpZXMgd2l0aGluIHRoZSBwcm9qZWN0IG9uIHRoZSBkaWFncmFtLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JTdWJNZW51PVJlZmFjdG9yIEVudGl0eSBDbGFzcwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVuYW1lRW50aXR5Q2xhc3M9UmVuYW1lLi4uCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9tb3ZlRW50aXR5Q2xhc3M9TW92ZS4uLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3BlbkpQQURldGFpbHNWaWV3PU9wZW4gSlBBIERldGFpbHMgVmlldwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3BlbkpQQURldGFpbHNWaWV3RGVzYz1PcGVuIHRoZSBKUEEgRGV0YWlscyB2aWV3IHRvIHZpZXcvbW9kaWZ5IHRoZSBkZXRhaWxzIG9mIHRoZSBzZWxlY3RlZCBwZXJzaXN0ZW50IG9iamVjdC4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX29wZW5NaW5pYXR1cmVWaWV3PU9wZW4gTWluaWF0dXJlIFZpZXcgCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuTWluaWF0dXJlVmlld0Rlc2M9T3BlbiB0aGUgTWluaWF0dXJlIHZpZXcgdG8gZGlzcGxheSB0aGUgZGlhZ3JhbSBpbiBhIGxhcmdlciBzY2FsZS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2FwcGx5UGF0dGVybj1BcHBseSBUZW1wbGF0ZS4uLiAKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2FwcGx5UGF0dGVybkRlc2M9QXBwbHkgVGVtcGxhdGUKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEF0dHJNZW51SXRlbT1FeHBhbmQgQXR0cmlidXRlcyBHcm91cAotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQXR0ck1lbnVJdGVtRGVzY3I9RXhwYW5kIHRoZSBhdHRyaWJ1dGVzIGdyb3VwLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQ29tcGFydFRvb2xUaXA9RG91YmxlIGNsaWNrIHRvIGV4cGFuZCAiezB9IiBhdHRyaWJ1dGVzIGdyb3VwLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kRW50aXR5TWVudUl0ZW09RXhwYW5kIEVudGl0eQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kRW50aXR5bWVudUl0ZW1EZXNjcj1FeHBhbmQgZW50aXR5LgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQWxsRW50aXRpZXNNZW51SXRlbT1FeHBhbmQgQWxsCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtRGVzY3I9RXhwYW5kIGFsbCBlbnRpdGllcy4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlZmFjdG9yQXR0cmlidXRlVHlwZT1SZWZhY3RvciBBdHRyaWJ1dGUgVHlwZS4uLgotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JBdHRyaWJ1dGVUeXBlRGVzYz1DaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIHNlbGVjdGVkIGF0dHJpYnV0ZS4KLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFsbEVudGl0aWVzTWVudT1SZW1vdmUgQWxsIEVudGl0aWVzIEZyb20gRGlhZ3JhbQotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUFsbEVudGl0aWVzQWN0aW9uPS4uLmFuZCBTYXZlIENoYW5nZXMKLUpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZERpc2NhcmRBbGxFbnRpdGllc0FjdGlvbj0uLi5hbmQgRGlzY2FyZCBDaGFuZ2VzCi1KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQWxsRW50aXRpZXNDb25maXJtYXRpb249RG8geW91IHdhbnQgdG8gc2F2ZSB0aGUgY2hhbmdlcyBhbmQgcmVtb3ZlIGFsbCBlbnRpdGllcyBmcm9tIHRoZSBkaWFncmFtPwotSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQ29uZmlybWF0aW9uPURvIHlvdSB3YW50IHRvIGRpc2NhcmQgdGhlIGNoYW5nZXMgYW5kIHJlbW92ZSBhbGwgZW50aXRpZXMgZnJvbSB0aGUgZGlhZ3JhbT8KLQotSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9jYW50TWFrZURpYWdyYW1Xcml0YWJsZVRpdGxlPUNhbid0IE1ha2UgRGlhZ3JhbSBXcml0YWJsZQotSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9jYW50TWFrZURpYWdyYW1Xcml0YWJsZU1zZz1DYW5ub3QgbWFrZSB0aGUgSlBBIGRpYWdyYW0gZmlsZSB3cml0YWJsZTpcblxuezB9Ci1KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX0pQQURpYWdyYW1SZWFkT25seVRpdGxlPUpQQSBEaWFncmFtIFJlYWQtT25seQotSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlNc2c9VGhlIEpQQSBkaWFncmFtIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc3luY2hyb25pemVkIHdpdGggdGhlIG1vZGVsLiBJbiBvcmRlciB0byBvcGVuIHRoZSBkaWFncmFtLCB0aGUgSlBBIGVkaXRvciBtdXN0IG1ha2UgdGhpcyBmaWxlIHdyaXRhYmxlLgotSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlIYXNUb0FkZE1zZz1DYW5ub3Qgc2hvdyB0aGUgc2VsZWN0ZWQgZW50aXR5IGluIHRoZSBKUEEgZGlhZ3JhbSwgYmVjYXVzZSB0aGUgZGlhZ3JhbSBmaWxlIGlzIHJlYWQtb25seS4gSW4gb3JkZXIgdG8gc2hvdyB0aGUgZW50aXR5LCB0aGUgSlBBIGVkaXRvciBtdXN0IG1ha2UgdGhpcyBmaWxlIHdyaXRhYmxlLgotCi1PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX29wZW5KUEFEaWFncmFtRXJyb3JNc2dUaXRsZT1DYW5ub3QgT3BlbiBEaWFncmFtCi1PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX29wZW5KUEFEaWFncmFtRXJyb3JNc2c9Q2Fubm90IG9wZW4gdGhlIEpQQSBkaWFncmFtIGVkaXRvcgotT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9qcGFTdXBwb3J0V2FybmluZ1RpdGxlPUpQQSBTdXBwb3J0Ci1PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX2pwYVN1cHBvcnRXYXJuaW5nTXNnPUpQQSBEaWFncmFtIEVkaXRvciBoYXMgcGFydGlhbCAgSlBBIDIuMCAgc3VwcG9ydCBvbmx5LiAgIFdoZW4geW91IHVzZSBpdCB3aXRoICBKUEEgMi4wIGVuYWJsZWQgcHJvamVjdHMgeW91IHNob3VsZCB2aXN1YWxpemUgSlBBIDEuMCBjb21wbGlhbnQgZW50aXRpZXMgb25seS4gT3RoZXJ3aXNlLCB0aGUgZWRpdG9yIGJlaGF2aW9yIHdpbGwgYmVjb21lIGVycmF0aWMuIAotT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdFRpdGxlPU5vIFBlcnNpc3RlbmNlIFVuaXQKLU9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfbm9QZXJzaXN0ZW5jZVVuaXRNc2c9VGhlIEpQQSBEaWFncmFtIEVkaXRvciBjYW4gbm90IGJlIG9wZW4sIGJlY2F1c2UgdGhlIHBlcnNpc3RlbmNlIHVuaXQgZG9lcyBub3QgZXhpc3Qgb3IgaXMgY29ycnVwdGVkLiAKLQotSlBBRWRpdG9yVXRpbF9mdWxsbmFtZVRvb2x0aXBUZXh0PVwgQ2xhc3MgTmFtZTogezB9IAotSlBBRWRpdG9yVXRpbF90eXBlVG9vbHRpcFRleHQ9XCBUeXBlOiB7MH0gCi1KUEFFZGl0b3JVdGlsX2FwcGx5Q2hhbmdlc0pvYk5hbWU9QXBwbHkgY2hhbmdlcyB0byBwZXJzaXN0ZW5jZS54bWwuCi1KUEFFZGl0b3JVdGlsX2luaGVyaXRUeXBlVG9vbHRpcFRleHQ9XCBDbGFzcyBOYW1lOiB7MH0gXG4gVGhpcyBlbnRpdHkgaW5oZXJpdHMgezF9Ci0KLVBhbGV0dGVDb21wYXJ0bWVudF9Db25uZWN0aW9ucz1SZWxhdGlvbnMKLVBhbGV0dGVDb21wYXJ0bWVudF9PYmplY3RzPUVudGl0aWVzCi0KLUJUTl9PSz1PSwotQlROX0NBTkNFTD1DYW5jZWwKLUVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90Q2xvc2VGaWxlU3RyZWFtRXJyb3JNU0c9Q2Fubm90IGNsb3NlIHRoZSBzdHJlYW0KLUVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90Q3JlYXRlRE9NRmlsZUVycm9yTVNHPUNhbm5vdCBjcmVhdGUgRE9NIGZpbGUuCi1FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdEZpbmRGaWxlRXJyb3JNU0c9Q2Fubm90IGZpbmQgZmlsZS4KLUVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90T2J0YWluUHJvamVjdEVycm9yTVNHPUNhbm5vdCBvYnRhaW4gcHJvamVjdC4KLUVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UGFyc2VGaWxlRXJyb3JNU0c9Q2Fubm90IHBhcnNlIGZpbGUuCi1FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdFJlYWRGaWxlRXJyb3JNU0c9Q2Fubm90IHJlYWQgZmlsZS4KLUVudGl0aWVzQ29vcmRpbmF0ZXNYTUxfQ2Fubm90UmVmcmZyZXNoRmlsZT1DYW5ub3QgcmVmcmVzaCB0aGUgZGlhZ3JhbSB4bWwgZmlsZS4KLQotU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nVGV4dD1TZWxlY3QgYSBwcmltaXRpdmUgdHlwZSBmb3IgdGhlIGF0dHJpYnV0ZSAiezB9IiBvZiB0aGUgZW50aXR5ICJ7MX0iIG9yIGNob29zZSB0aGUgIkJyb3dzZSIgYnV0dG9uIHRvIHNlbGVjdCBhIGNsYXNzIHR5cGUuCi1TZWxlY3RUeXBlRGlhbG9nX2Jyb3dzZUJ0blR4dD0mQnJvd3NlLi4uCi1TZWxlY3RUeXBlRGlhbG9nX2Jyb3dzZUJ0bkRlc2M9QnJvd3NlIHRvIHNlbGVjdCBhIGNsYXNzLgotU2VsZWN0VHlwZURpYWxvZ190eXBlTGFiZWw9JlR5cGU6Ci1TZWxlY3RUeXBlRGlhbG9nX2Nob29zZUF0dHJpYnV0ZVR5cGVEaWFsb2dXaW5kb3dUaXRsZT1TZWxlY3QgVHlwZQotU2VsZWN0VHlwZURpYWxvZ19jaG9vc2VBdHRyaWJ1dGVUeXBlRGlhbG9nVGl0bGU9U2VsZWN0IE5ldyBBdHRyaWJ1dGUgVHlwZQotU2VsZWN0VHlwZURpYWxvZ19pbnZhbGlkVHlwZU1zZ1RpdGxlPUludmFsaWQgVHlwZQotU2VsZWN0VHlwZURpYWxvZ19pbnZhbGlkVHlwZU1zZ1RleHQ9InswfSIgaXMgbm90IHZhbGlkIGphdmEgdHlwZSBvciBwcmltaXRpdmUuCi1TZWxlY3RUeXBlRGlhbG9nX2VtcHR5VHlwZUVycm9yVGV4dD1UaGUgbmV3IHR5cGUgbmFtZSBtdXN0IG5vdCBiZSBlbXB0eQotCi1KUEFTb2x2ZXJfY2xvc2VXYXJuaW5nTXNnPVRoZSBlbnRpdHkgInswfSIgaXMgb3BlbiBlbHNld2hlcmUgd2l0aCBpZGVudGljYWwgY2hhbmdlcy4gVXNpbmcgdGhpcyBidXR0b24gd2lsbCBub3QgbG9zZSB0aG9zZSBjaGFuZ2VzLiBDbG9zZSB0aGUgb3RoZXIgZWRpdG9yKHMpLCB3aGVyZSB0aGUgZW50aXR5ICJ7MH0iIGlzIG9wZW4gYW5kIHRyeSBhZ2FpbiEKLUpQQVNvbHZlcl9jbG9zZUVkaXRvcnM9Q2xvc2UgRWRpdG9ycyAgCi1Nb3ZlRW50aXR5RmVhdHVyZV9Db250ZXh0TWVudU9wZXJhdGlvbkRlc2NyaXB0aW9uPU1vdmUgRW50aXR5IENsYXNzCi0KLVJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbj1SZWZhY3RvciBBdHRyaWJ1dGUgVHlwZQotTW9kZWxJbnRlZ3JhdGlvblV0aWxfQ2Fubm90U2V0RmlsZUNvbnRlbnRFcnJvck1TRz1DYW5ub3Qgc2V0IGZpbGUgY29udGVudC4KLQotUmVtb3ZlSlBBRW50aXR5RmVhdHVyZV9kaXNjYXJkV2FybmluZ01zZz1UaGUgZW50aXR5ICJ7MH0iIGlzIG9wZW4gZWxzZXdoZXJlIHdpdGggaWRlbnRpY2FsIGNoYW5nZXMuIFVzaW5nIHRoaXMgYnV0dG9uIHdpbGwgcmVtb3ZlIHRoZSBlbnRpdHkgZnJvbSB0aGUgZGlhZ3JhbSwgYnV0IHdpbGwgbm90IGxvc2UgdGhvc2UgY2hhbmdlcy4gSW4gb3JkZXIgdG8gbG9zZSB0aGUgY2hhbmdlcyB5b3UgbmVlZCBmaXJzdCB0byBjbG9zZSB0aGUgb3RoZXIgZWRpdG9yKHMpLCB3aGVyZSB0aGUgZW50aXR5ICJ7MH0iIGlzIG9wZW4gYW5kIHRyeSBhZ2FpbiFcblxuRG8geW91IHdhbnQgdG8gY29udGludWUgd2l0aCByZW1vdmluZyBhbnl3YXk/Ci0KLVJlbmFtZUVudGl0eUZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbj1SZW5hbWUgRW50aXR5IENsYXNzCi0KLVNhdmVBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmVfQ29udGV4dE1lbnVPcGVyYXRpb25EZXNjcmlwdGlvbj1SZW1vdmUgQWxsIEVudGl0aWVzIEZyb20gRGlhZ3JhbSBhbmQgU2F2ZSBDaGFuZ2VzCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9KUEFEaWFncmFtRWRpdG9ySW5wdXQuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL0pQQURpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzM3MjhmLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL0pQQURpYWdyYW1FZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZWRpdG9yLkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQURpYWdyYW1FZGl0b3JJbnB1dDsKLQotCi1wdWJsaWMgY2xhc3MgSlBBRGlhZ3JhbUVkaXRvcklucHV0IGV4dGVuZHMgRGlhZ3JhbUVkaXRvcklucHV0IAotCQkJCQkJCQkJaW1wbGVtZW50cyBJSlBBRGlhZ3JhbUVkaXRvcklucHV0IHsKLQkKLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQlwcml2YXRlIFN0cmluZyBwcm9qZWN0TmFtZTsKLQkKLQotCXB1YmxpYyBKUEFEaWFncmFtRWRpdG9ySW5wdXQoRGlhZ3JhbSBkaWFncmFtLCAKLQkJCQkJCQkJIFN0cmluZyBkaWFncmFtVXJpU3RyaW5nLCAKLQkJCQkJCQkJIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgCi0JCQkJCQkJCSBTdHJpbmcgcHJvdmlkZXJJZCwgCi0JCQkJCQkJCSBib29sZWFuIGRpc3Bvc2VFZGl0aW5nRG9tYWluKSB7Ci0JCQotCQlzdXBlcihkaWFncmFtVXJpU3RyaW5nLCBkb21haW4sIHByb3ZpZGVySWQsIGRpc3Bvc2VFZGl0aW5nRG9tYWluKTsKLQkJdGhpcy5kaWFncmFtID0gZGlhZ3JhbTsgCi0JCXRoaXMucHJvamVjdE5hbWUgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW0uZ2V0TmFtZSgpKS5nZXROYW1lKCk7CQkKLQl9Ci0KLQlwdWJsaWMgSlBBRGlhZ3JhbUVkaXRvcklucHV0KERpYWdyYW0gZGlhZ3JhbSwKLQkJCQkJCQkJIFVSSSBkaWFncmFtVXJpLCAKLQkJCQkJCQkJIFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRvbWFpbiwgCi0JCQkJCQkJCSBTdHJpbmcgcHJvdmlkZXJJZCwgCi0JCQkJCQkJCSBib29sZWFuIGRpc3Bvc2VFZGl0aW5nRG9tYWluKSB7Ci0JCQotCQlzdXBlcihkaWFncmFtVXJpLCBkb21haW4sIHByb3ZpZGVySWQsIGRpc3Bvc2VFZGl0aW5nRG9tYWluKTsKLQkJdGhpcy5kaWFncmFtID0gZGlhZ3JhbTsKLQkJdGhpcy5wcm9qZWN0TmFtZSA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZGlhZ3JhbS5nZXROYW1lKCkpLmdldE5hbWUoKTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQlpZiAoYWRhcHRlci5lcXVhbHMoRU9iamVjdC5jbGFzcykpIHsKLQkJCXJldHVybiBnZXREaWFncmFtKCk7Ci0JCX0gCi0JCWlmIChhZGFwdGVyLmVxdWFscyhEaWFncmFtLmNsYXNzKSkgewotCQkJcmV0dXJuIGdldERpYWdyYW0oKTsKLQkJfQotCQlpZiAoYWRhcHRlci5lcXVhbHMoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4uY2xhc3MpKQotCQkJcmV0dXJuIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCQlpZiAoYWRhcHRlci5lcXVhbHMoSUZpbGUuY2xhc3MpKSB7Ci0JCQlSZXNvdXJjZSBlUmVzb3VyY2UgPSBkaWFncmFtLmVSZXNvdXJjZSgpOwotCQkJVVJJIGVVcmkgPSBlUmVzb3VyY2UuZ2V0VVJJKCk7Ci0JCQlpZiAoZVVyaS5pc1BsYXRmb3JtUmVzb3VyY2UoKSkgewotCQkJCVN0cmluZyBwbGF0Zm9ybVN0cmluZyA9IGVVcmkudG9QbGF0Zm9ybVN0cmluZyh0cnVlKTsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKQotCQkJCQkJLmZpbmRNZW1iZXIocGxhdGZvcm1TdHJpbmcpOwotCQkJfSBlbHNlIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbSgKLQkJCQkJCWRpYWdyYW0uZ2V0TmFtZSgpKS5nZXRQcm9qZWN0KCk7Ci0JCQkJcmV0dXJuIGZpbmRYTUxGaWxlKHByb2plY3QpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwcml2YXRlIElGaWxlIGZpbmRYTUxGaWxlKElQcm9qZWN0IHByb2plY3QpewotCQl0cnkgewotCQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gcHJvamVjdC5tZW1iZXJzKCk7Ci0JCQlmb3IgKElSZXNvdXJjZSByZXMgOiByZXNvdXJjZXMpIHsKLQkJCQlpZiAocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlJRmlsZSBleGlzdGluZ1hNTEZpbGUgPSAoKElGb2xkZXIpIHJlcykKLQkJCQkJCQkuZ2V0RmlsZShkaWFncmFtLmdldE5hbWUoKQotCQkJCQkJCQkJKyAiLiIgKyBNb2RlbEludGVncmF0aW9uVXRpbC5ESUFHUkFNX1hNTF9GSUxFX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGV4aXN0aW5nWE1MRmlsZSAhPSBudWxsICYmIGV4aXN0aW5nWE1MRmlsZS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGV4aXN0aW5nWE1MRmlsZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luCi0JCQkJCS5sb2dFcnJvcigKLQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdE9idGFpblByb2plY3RFcnJvck1TRywKLQkJCQkJCQllKTsKLQkJfQotCQlJRmlsZSBleGlzdGluZ1hNTEZpbGUgPSBwcm9qZWN0LmdldEZpbGUoTW9kZWxJbnRlZ3JhdGlvblV0aWwKLQkJCQkuZ2V0RGlhZ3JhbXNYTUxGb2xkZXJQYXRoKHByb2plY3QpCi0JCQkJLmFwcGVuZChkaWFncmFtLmdldE5hbWUoKSkKLQkJCQkuYWRkRmlsZUV4dGVuc2lvbigKLQkJCQkJCU1vZGVsSW50ZWdyYXRpb25VdGlsLkRJQUdSQU1fWE1MX0ZJTEVfRVhURU5TSU9OKSk7Ci0JCWlmIChleGlzdGluZ1hNTEZpbGUgIT0gbnVsbCAmJiBleGlzdGluZ1hNTEZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBleGlzdGluZ1hNTEZpbGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBEaWFncmFtIGdldERpYWdyYW0oKSB7Ci0JCXJldHVybiBkaWFncmFtOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBKUEFEaWFncmFtRWRpdG9ySW5wdXQgY3JlYXRlRWRpdG9ySW5wdXQoRGlhZ3JhbSBkaWFncmFtLCBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkb21haW4sIFN0cmluZyBwcm92aWRlcklkLAotCQkJYm9vbGVhbiBkaXNwb3NlRWRpdGluZ0RvbWFpbikgewotCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IGRpYWdyYW0uZVJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQkJZmluYWwgU3RyaW5nIGZyYWdtZW50ID0gcmVzb3VyY2UuZ2V0VVJJRnJhZ21lbnQoZGlhZ3JhbSk7Ci0JCWZpbmFsIFVSSSBmcmFnbWVudFVyaSA9IHJlc291cmNlLmdldFVSSSgpLmFwcGVuZEZyYWdtZW50KGZyYWdtZW50KTsKLQkJSlBBRGlhZ3JhbUVkaXRvcklucHV0IGRpYWdyYW1FZGl0b3JJbnB1dDsKLQkJZGlhZ3JhbUVkaXRvcklucHV0ID0gbmV3IEpQQURpYWdyYW1FZGl0b3JJbnB1dChkaWFncmFtLCBmcmFnbWVudFVyaSwgZG9tYWluLCBwcm92aWRlcklkLCBkaXNwb3NlRWRpdGluZ0RvbWFpbik7Ci0JCXJldHVybiBkaWFncmFtRWRpdG9ySW5wdXQ7Ci0JfQotCQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9qZWN0TmFtZSgpIHsKLQkJcmV0dXJuIHByb2plY3ROYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL0pQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3VpL0pQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjhjMDk3OS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuSU1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQURpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBpbXBsZW1lbnRzIElFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHsKLQkKLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAgPSBudWxsOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFX0dFTkVSQVRFRCA9ICJDT0RFX0dFTkVSQVRFRCI7IAkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX0NMSUNLID0gIkRPVUJMRV9DTElDSyI7CQkvLyROT04tTkxTLTEkCi0JCi0JCi0JcHVibGljIEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3koKSB7fQotCQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgaW50ZW5kZWQgc29sZWx5IGZvciB0aGUgdGVzdCBwdXJwb3NlcwotCSAqICAKLQkgKiBAcGFyYW0gZnAgdGhlIGZlYXR1cmUgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXRoaXMuZnAgPSBmcDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiwgSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmlsZUlucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0OwotCQkJSUZpbGUgZW50aXR5RmlsZSA9IGZpbGVJbnB1dC5nZXRGaWxlKCk7Ci0JCQlpZighZW50aXR5RmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXZhIikpeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlRdWFsaWZpZWROYW1lIHFuID0gbmV3IFF1YWxpZmllZE5hbWUobnVsbCwgRE9VQkxFX0NMSUNLKTsKLQkJCQlpZiAoInRydWUiLmVxdWFscyhlbnRpdHlGaWxlLmdldFNlc3Npb25Qcm9wZXJ0eShxbikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZW50aXR5RmlsZS5zZXRTZXNzaW9uUHJvcGVydHkocW4sIG51bGwpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBnZXQgc2Vzc2lvbiBwcm9wZXJ0eSBET1VCTEVfQ0xJQ0siLCBlMSk7ICAvLyROT04tTkxTLTEkCQkgCQkJCQkJCQotCQkJfQotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGlucHV0SnB0VHlwZSA9IG51bGw7IAotCQkJCi0JCQlpZiAoZnAgPT0gbnVsbCkgewotCQkJCWlucHV0SnB0VHlwZSA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5RmlsZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnB1dEpwdFR5cGUgPSBmcC5nZXRKUEFFZGl0b3JVdGlsKCkuZ2V0SlBUeXBlKEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5RmlsZSkpOwotCQkJfQotCQkJaWYgKGlucHV0SnB0VHlwZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBpbnB1dEpwdFR5cGUuZ2V0UGVyc2lzdGVuY2VVbml0KCk7Ci0JCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpOwotCi0JCQl0cnkgewotCQkJCUlFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCA9IGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpOwotCQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElKUEFEaWFncmFtRWRpdG9ySW5wdXQpIHsKLQkJCQkJSUpQQURpYWdyYW1FZGl0b3JJbnB1dCBqcElucHV0ID0gKElKUEFEaWFncmFtRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotCQkJCQlEaWFncmFtIGRpYWdyYW0gPSBqcElucHV0LmdldERpYWdyYW0oKTsKLQkJCQkJaWYgKGRpYWdyYW0gIT0gbnVsbCkgewotCQkJCQkJCi0JCQkJCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IG51bGw7Ci0JCQkJCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkaWFncmFtUHJvdmlkZXIgPSBudWxsOwotCQkJCQkJaWYgKGZwICE9IG51bGwpIHsKLQkJCQkJCQlmZWF0dXJlUHJvdmlkZXIgPSB0aGlzLmZwOwotCQkJCQkJCWRpYWdyYW1Qcm92aWRlciA9IGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWRpYWdyYW1Qcm92aWRlciA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb3ZpZGVyQnlEaWFncmFtKGRpYWdyYW0uZ2V0TmFtZSgpKTsKLQkJCQkJCQlmZWF0dXJlUHJvdmlkZXIgPSAoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilkaWFncmFtUHJvdmlkZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7Ci0JCQkJCQl9Ci0JCQkJCQlJTW9kZWxJbnRlZ3JhdGlvblV0aWwgbW9pbkludGVncmF0aW9uVXRpbCA9IGZlYXR1cmVQcm92aWRlci5nZXRNb2luSW50ZWdyYXRpb25VdGlsKCk7Ci0JCQkJCQlKcGFQcm9qZWN0IGpwYVByb2plY3RGcm9tRWRpdG9yID0gbW9pbkludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW0pOwotCQkJCQkJaWYgKGpwYVByb2plY3QuZXF1YWxzKGpwYVByb2plY3RGcm9tRWRpdG9yKSkgewotCQkJCQkJCWlmIChmaWxlSW5wdXQuZ2V0TmFtZSgpICE9IENPREVfR0VORVJBVEVEKSAKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGlucHV0SnB0VHlwZSk7Ci0JCQkJCQkJaWYgKHBlICE9IG51bGwpIHsKLQkJCQkJCQkJZGlhZ3JhbVByb3ZpZGVyLmdldERpYWdyYW1FZGl0b3IoKS5zZXRQaWN0b2dyYW1FbGVtZW50Rm9yU2VsZWN0aW9uKHBlKTsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCQotCQkJCQkJCUlDdXN0b21GZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0QWRkQWxsRW50aXRpZXNGZWF0dXJlKCk7Ci0JCQkJCQkJQ3VzdG9tQ29udGV4dCBjb250ZXh0ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJCQkJCQlmZWF0dXJlLmV4ZWN1dGUoY29udGV4dCk7Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSUpQQURpYWdyYW1FZGl0b3JJbnB1dCkgewotCQkJcmV0dXJuIGVkaXRvclJlZi5nZXRQYXJ0TmFtZSgpLmVxdWFscygoKElKUEFEaWFncmFtRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRQcm9qZWN0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjlkM2QuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGxhdGZvcm0uSURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZWRpdG9yLkRpYWdyYW1FZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5pbnRlcm5hbC5NZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuZGlhbG9ncy5PcHRpb25hbE1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5FcnJvckRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkljb25BbmRNZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLkNyZWF0ZURpYWdyYW1Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuV3JwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JT2JqZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklQcm9qZWN0RmFjZXRWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKHsgInVudXNlZCIsICJyZXN0cmljdGlvbiIgfSkKLXB1YmxpYyBjbGFzcyBPcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSU9iamVjdEFjdGlvbkRlbGVnYXRlIHsKLQkJCQotCXByaXZhdGUgY2xhc3MgT3BlbkVkaXRvclJ1bm5hYmxlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCQlwcml2YXRlIE9wZW5FZGl0b3JSdW5uYWJsZShEaWFncmFtIGRpYWdyYW0pIHsKLQkJCXRoaXMuZGlhZ3JhbSA9IGRpYWdyYW07Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkvL01vZGVsSW50ZWdyYXRpb25VdGlsLm1hcERpYWdyYW1Ub1Byb2plY3QoZGlhZ3JhbSwganBhUHJvamVjdCk7CQkJCi0JCQlvcGVuRGlhZ3JhbUVkaXRvcihkaWFncmFtKTsKLQkJfQotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBJRGlhZ3JhbUVkaXRvciBvcGVuRGlhZ3JhbUVkaXRvcihEaWFncmFtIGRpYWdyYW0pIHsKLQkJCi0JCVN0cmluZyBkaWFncmFtTmFtZSA9IGRpYWdyYW0uZ2V0TmFtZSgpOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXRQcm9qZWN0QnlEaWFncmFtKGRpYWdyYW1OYW1lKTsKLQkJaWYgKCFKUEFFZGl0b3JVdGlsLmNoZWNrSlBBRmFjZXRWZXJzaW9uKGpwYVByb2plY3QsICIxLjAiKSAmJiAhTW9kZWxJbnRlZ3JhdGlvblV0aWwuaXNEaWFncmFtT3BlbihkaWFncmFtTmFtZSkpIHsJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCWJvb2xlYW4gd2FzRW5hYmxlZCA9IE9wdGlvbmFsTWVzc2FnZURpYWxvZy5pc0RpYWxvZ0VuYWJsZWQoSlBBRWRpdG9yQ29uc3RhbnRzLkpQQV9TVVBQT1JUX0RJQUxPR19JRCk7Ci0JCQlpbnQgYnRuSW5kZXggPSBPcHRpb25hbE1lc3NhZ2VEaWFsb2cub3BlbihKUEFFZGl0b3JDb25zdGFudHMuSlBBX1NVUFBPUlRfRElBTE9HX0lELCAKLQkJCQkJCQkJCSAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmdldFNoZWxscygpWzBdLCAKLQkJCQkJCQkJCSAgIEpQQUVkaXRvck1lc3NhZ2VzLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfanBhU3VwcG9ydFdhcm5pbmdUaXRsZSwgCi0JCQkJCQkJCQkgICBEaXNwbGF5LmdldERlZmF1bHQoKS5nZXRTeXN0ZW1JbWFnZShTV1QuSUNPTl9XQVJOSU5HKSwKLQkJCQkJCQkJCSAgIEpQQUVkaXRvck1lc3NhZ2VzLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfanBhU3VwcG9ydFdhcm5pbmdNc2csIAotCQkJCQkJCQkJICAgMCwgCi0JCQkJCQkJCQkgICBuZXcgU3RyaW5nW10ge0pQQUVkaXRvck1lc3NhZ2VzLkJUTl9PS30sIAotCQkJCQkJCQkJICAgMCk7Ci0JCX0KLQkJCi0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRlZmF1bHRUcmFuc0VkaXREb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbigoZGlhZ3JhbS5lUmVzb3VyY2UoKS5nZXRSZXNvdXJjZVNldCgpKSk7IAotCQlmaW5hbCBKUEFEaWFncmFtRWRpdG9ySW5wdXQgZGlhZ3JhbUVkaXRvcklucHV0ID0gSlBBRGlhZ3JhbUVkaXRvcklucHV0LmNyZWF0ZUVkaXRvcklucHV0KGRpYWdyYW0sIGRlZmF1bHRUcmFuc0VkaXREb21haW4sIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIuSUQsIGZhbHNlKTsgCi0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJZmluYWwgSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWZpbmFsIFdycCB3cnAgPSBuZXcgV3JwKCk7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gSURFLm9wZW5FZGl0b3Iod29ya2JlbmNoUGFnZSwgZGlhZ3JhbUVkaXRvcklucHV0LCBKUEFEaWFncmFtRWRpdG9yLklEKTsKLQkJCWlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgSlBBRGlhZ3JhbUVkaXRvcikgewkJCQkKLQkJCQlKUEFEaWFncmFtRWRpdG9yIHJldCA9IChKUEFEaWFncmFtRWRpdG9yKSBlZGl0b3JQYXJ0OwotCQkJCXdycC5zZXRPYmoocmV0KTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdvcmtiZW5jaExpc3RlbmVyKCBuZXcgSVdvcmtiZW5jaExpc3RlbmVyKCkgewotCQkJCSAgICBwdWJsaWMgYm9vbGVhbiBwcmVTaHV0ZG93biggSVdvcmtiZW5jaCB3b3JrYmVuY2gsIGJvb2xlYW4gZm9yY2VkICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQkJCQkgICAgCXdvcmtiZW5jaFBhZ2UuY2xvc2VFZGl0b3IoIGVkaXRvclBhcnQsIHRydWUpOwotCQkJCSAgICAgICAgcmV0dXJuIHRydWU7Ci0JCQkJICAgIH0KLQkJCQkgCi0JCQkJICAgIHB1YmxpYyB2b2lkIHBvc3RTaHV0ZG93biggSVdvcmtiZW5jaCB3b3JrYmVuY2ggKXsKLQkJCQkgCi0JCQkJICAgIH0KLQkJCQl9KTsKLQkJCQkvL0NTTiAjMTMwNTg1MCAyMDEwCi0JCQkJLy9pZihyZXQuaXNEaXJ0eSgpKQotCQkJCS8vCXJldC5kb1NhdmUobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbid0IG9wZW4gSlBBIGVkaXRvciIsIGUpOyAgLy8kTk9OLU5MUy0xJAkJIAkJCQkJCQkKLQkJfQkKLQkJcmV0dXJuIChKUEFEaWFncmFtRWRpdG9yKXdycC5nZXRPYmooKTsKLQl9Ci0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9PUEVOSU5HX0RJQUdSQU0gPSBKUEFFZGl0b3JNZXNzYWdlcy5PcGVuSnBhRGlhZ3JhbUFjdGlvbkRlbGVnYXRlX29wZW5KUEFEaWFncmFtRXJyb3JNc2c7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JcHJpdmF0ZSBTaGVsbCBzaGVsbDsKLQlwcml2YXRlIFdlYWtSZWZlcmVuY2U8SVNlbGVjdGlvbj4gc2VsZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8SVNlbGVjdGlvbj4obnVsbCk7IAotCQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpIHsKLQkJc2hlbGwgPSB0YXJnZXRQYXJ0LmdldFNpdGUoKS5nZXRTaGVsbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsgICAgICAJCi0gICAgICAgIAlwZXJzaXN0ZW5jZVVuaXQgPSBvYnRhaW5KcGFQcm9qZWN0QW5kUGVyc2lzdGVuY2VVbml0KHNlbGVjdGlvblJlZi5nZXQoKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHBlcnNpc3RlbmNlVW5pdCA9PSBudWxsKSB7Ci0JCQlNZXNzYWdlRGlhbG9nLm9wZW5FcnJvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCksIAotCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdFRpdGxlLAotCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuT3BlbkpwYURpYWdyYW1BY3Rpb25EZWxlZ2F0ZV9ub1BlcnNpc3RlbmNlVW5pdE1zZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmluYWwgQ3JlYXRlRGlhZ3JhbUpvYiBjcmVhdGVEaWFncmFtUnVubmFibGUgPSBuZXcgQ3JlYXRlRGlhZ3JhbUpvYihwZXJzaXN0ZW5jZVVuaXQsIDEwLCB0cnVlKTsKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLnNldFJ1bGUoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSk7Ci0JCWNyZWF0ZURpYWdyYW1SdW5uYWJsZS5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzaGVsbC5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IE9wZW5FZGl0b3JSdW5uYWJsZShjcmVhdGVEaWFncmFtUnVubmFibGUuZ2V0RGlhZ3JhbSgpKSk7Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVEaWFncmFtUnVubmFibGUuc2V0VXNlcih0cnVlKTsKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJc2VsZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8SVNlbGVjdGlvbj4oc2VsZWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUGVyc2lzdGVuY2VVbml0IG9idGFpbkpwYVByb2plY3RBbmRQZXJzaXN0ZW5jZVVuaXQoSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJT2JqZWN0IGZpcnN0RWxlbWVudCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmIChmaXJzdEVsZW1lbnQgaW5zdGFuY2VvZiBKcGFOb2RlKSB7Ci0gICAgICAgIAlqcGFQcm9qZWN0ID0gKChKcGFOb2RlKWZpcnN0RWxlbWVudCkuZ2V0SnBhUHJvamVjdCgpOwotICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RWxlbWVudCBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlqcGFQcm9qZWN0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SnBhUHJvamVjdCgoSVByb2plY3QpZmlyc3RFbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCX0KLQkJCi0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRXhjZXB0aW9uKEV4Y2VwdGlvbiBlKSB7Ci0JCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoRVJST1JfT1BFTklOR19ESUFHUkFNLCBlKTs7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbmV3IEVyclN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBlLnRvU3RyaW5nKCksIGUpOwotCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Ioc2hlbGwsIEpQQUVkaXRvck1lc3NhZ2VzLk9wZW5KcGFEaWFncmFtQWN0aW9uRGVsZWdhdGVfb3BlbkpQQURpYWdyYW1FcnJvck1zZ1RpdGxlLCAKLQkJCQlFUlJPUl9PUEVOSU5HX0RJQUdSQU0sIHN0YXR1cyk7Ci0JfQotCQotCXByaXZhdGUgY2xhc3MgRXJyU3RhdHVzIGV4dGVuZHMgU3RhdHVzIHsKLQkJCi0JCXB1YmxpYyBFcnJTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCQlzdXBlcihzZXZlcml0eSwgbWVzc2FnZSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJfQotCQkKLQkJcHVibGljIElTdGF0dXNbXSBnZXRDaGlsZHJlbigpIHsKLQkJCVN0YWNrVHJhY2VFbGVtZW50W10gc3QgPSBnZXRFeGNlcHRpb24oKS5nZXRTdGFja1RyYWNlKCk7Ci0JCQlJU3RhdHVzW10gcmVzID0gbmV3IElTdGF0dXNbc3QgPT0gbnVsbCA/IDAgOiBzdC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdC5sZW5ndGg7IGkrKykgCi0JCQkJcmVzW2ldID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBzdFtpXS50b1N0cmluZygpKTsKLQkJCXJldHVybiByZXM7Ci0JCX0KLQl9Ci0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL0NyZWF0ZURpYWdyYW1Kb2IuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvQ3JlYXRlRGlhZ3JhbUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVhOGYxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvQ3JlYXRlRGlhZ3JhbUpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbDsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDcmVhdGVEaWFncmFtSm9iIGV4dGVuZHMgSm9iIHsKLQotCS8vcHJpdmF0ZSBDb25uZWN0aW9uIG1vaW5Db25uZWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQ7Ci0JcHJpdmF0ZSBEaWFncmFtIGRpYWdyYW07Ci0JcHJpdmF0ZSBpbnQgZ3JpZDsKLQlwcml2YXRlIGJvb2xlYW4gc25hcDsKLQkKLQkvKgotCXB1YmxpYyBDb25uZWN0aW9uIGdldE1vaW5Db25uZWN0aW9uKCkgewotCQlyZXR1cm4gbW9pbkNvbm5lY3Rpb247Ci0JfQotCSovCi0JCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpIHsKLQkJcmV0dXJuIGRpYWdyYW07Ci0JfQotCi0JcHVibGljIENyZWF0ZURpYWdyYW1Kb2IoUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgaW50IGdyaWQsIGJvb2xlYW4gc25hcCkgewotCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5DcmVhdGVEaWFncmFtSm9iX2NyZWF0ZURpYWdyYW1Kb2JOYW1lLCBuZXcgT2JqZWN0W10geyBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldE5hbWUoKX0pKTsgCi0JCXRoaXMucGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VVbml0OwotCQl0aGlzLmdyaWQgPSBncmlkOwotCQl0aGlzLnNuYXAgPSBzbmFwOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy9JUHJvamVjdCBwcm9qZWN0ID0gcGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCXRyeXsKLQkJCW1vbml0b3IuYmVnaW5UYXNrKEpQQUVkaXRvck1lc3NhZ2VzLkNyZWF0ZURpYWdyYW1Kb2JfZ2V0SlBBRGlhZ3JhbU1vbml0b3JUYXNrTmFtZSwgMyk7IAotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkvL21vaW5Db25uZWN0aW9uID0gQ29ubmVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDb25uZWN0aW9uKHByb2plY3QpOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQlkaWFncmFtID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuY3JlYXRlRGlhZ3JhbShwZXJzaXN0ZW5jZVVuaXQsIGdyaWQsIHNuYXApOwotCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9JTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvSU1vZGVsSW50ZWdyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOGM2Y2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9JTW9kZWxJbnRlZ3JhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsSW50ZWdyYXRpb25VdGlsIHsKLQlwdWJsaWMgSnBhUHJvamVjdCBnZXRQcm9qZWN0QnlEaWFncmFtKERpYWdyYW0gZGlhZ3JhbSk7Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOTYyNzQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9Nb2RlbEludGVncmF0aW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uRUZTOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5JRmlsZVN5c3RlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5lZGl0b3IuRGlhZ3JhbUVkaXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEludGVncmF0aW9uVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUFHUkFNX0ZJTEVfRVhURU5TSU9OID0gInhtaSI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUdSQU1fWE1MX0ZJTEVfRVhURU5TSU9OID0gInhtbCI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpQQV9ESUFHUkFNX1RZUEUgPSAiSlBBIERpYWdyYW0iOyAJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVTX0ZPTERFUiA9ICJzcmMiOwkJLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB4bWlFeGlzdHMgPSBmYWxzZTsKLQlwcml2YXRlIHN0YXRpYyBXZWFrSGFzaE1hcDxJUHJvamVjdCwgV2Vha1JlZmVyZW5jZTxEaWFncmFtPj4gcHJvamVjdFRvRGlhZ3JhbSA9IG5ldyAgV2Vha0hhc2hNYXA8SVByb2plY3QsIFdlYWtSZWZlcmVuY2U8RGlhZ3JhbT4+KCk7Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBjcmVhdGVEaWFncmFtUGF0aChQZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JICAgIElQcm9qZWN0IHByb2plY3QgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKTsKLQkgICAgU3RyaW5nIGRpYWdyYW1OYW1lID0gcGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKS5nZXROYW1lKCk7Ci0JCUlQYXRoIG5ld1hNSUZpbGVQYXRoID0gZ2V0RGlhZ3JhbXNGb2xkZXJQYXRoKHByb2plY3QpLmFwcGVuZChkaWFncmFtTmFtZSkuYWRkRmlsZUV4dGVuc2lvbihESUFHUkFNX0ZJTEVfRVhURU5TSU9OKTsJCi0JCUlGaWxlU3lzdGVtIGZpbGVTeXN0ZW0gPSBFRlMuZ2V0TG9jYWxGaWxlU3lzdGVtKCk7Ci0JCUlGaWxlU3RvcmUgbmV3WE1JRmlsZSA9IGZpbGVTeXN0ZW0uZ2V0U3RvcmUobmV3WE1JRmlsZVBhdGgpOwotICAgICAgICAKLQkgICAgSVBhdGggZm9sZGVyUGF0aCA9IGNvcHlFeGlzdGluZ1hNSUNvbnRlbnRBbmREZWxldGVGaWxlKHByb2plY3QsIGRpYWdyYW1OYW1lLCBuZXdYTUlGaWxlKTsKLQkgICAgaWYoZm9sZGVyUGF0aCAhPSBudWxsKXsKLQkJICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJQYXRoLnNlZ21lbnQoMCkpOwotCQkgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBmb2xkZXJQYXRoLnNlZ21lbnRDb3VudCgpOyBpKyspIHsKLQkJICAgIAlwYXRoID0gcGF0aC5hcHBlbmQoZm9sZGVyUGF0aC5zZWdtZW50KGkpKTsKLQkJCSAgICBJRm9sZGVyIGZvbGRlciA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0Rm9sZGVyKHBhdGgpOwotCQkJICAgIGlmICghZm9sZGVyLmV4aXN0cygpKQotCQkJICAgIAlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkgICAgfQkgICAgCQotCSAgICAJSUZpbGUgZGlhZ3JhbVhNTEZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZm9sZGVyUGF0aC5hcHBlbmQoZGlhZ3JhbU5hbWUpLmFkZEZpbGVFeHRlbnNpb24oRElBR1JBTV9YTUxfRklMRV9FWFRFTlNJT04pKTsKLQkgICAgCVN0cmluZyBjb250ZW50ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgPz5cbiIrIC8vJE5PTi1OTFMtMSQKLQkJICAgCQkJIjxlbnRpdGllcz5cbiIrIC8vJE5PTi1OTFMtMSQKLQkJICAgCQkJIjwvZW50aXRpZXM+XG4iOyAvLyROT04tTkxTLTEkCi0JICAgIAlpZihkaWFncmFtWE1MRmlsZSA9PSBudWxsIHx8ICFkaWFncmFtWE1MRmlsZS5leGlzdHMoKSl7Ci0JCQkgICBJbnB1dFN0cmVhbSBzb3VyY2UgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudC5nZXRCeXRlcygpKTsKLQkJCSAgIGRpYWdyYW1YTUxGaWxlLmNyZWF0ZShzb3VyY2UsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkgICB9IGVsc2UKLQkJCQl0cnkgewotCQkJCQlpZihkaWFncmFtWE1MRmlsZS5nZXRDb250ZW50cygpLnJlYWQoKSA9PSAtMSl7Ci0JCQkJCQkgICBkaWFncmFtWE1MRmlsZS5zZXRDb250ZW50cyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oY29udGVudC5nZXRCeXRlcygpKSwgdHJ1ZSwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKEpQQUVkaXRvck1lc3NhZ2VzLk1vZGVsSW50ZWdyYXRpb25VdGlsX0Nhbm5vdFNldEZpbGVDb250ZW50RXJyb3JNU0csIGUpOwotCQkJCX0KLQkgICAgfQotCi0JICAgIHJldHVybiBuZXdYTUlGaWxlUGF0aDsJCQotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBJUGF0aCBjb3B5RXhpc3RpbmdYTUlDb250ZW50KElDb250YWluZXIgY29udGFpbmVyLAotCQkJU3RyaW5nIHhtaUZpbGVOYW1lLCBJRmlsZVN0b3JlIG5ld1hNSUZpbGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sCUNvcmVFeGNlcHRpb24gewotCQlJUGF0aCBmb2xkZXJQYXRoID0gbnVsbDsKLQkJSVJlc291cmNlW10gcmVzb3VyY2VzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkgICAgZm9yKElSZXNvdXJjZSByZXMgOiByZXNvdXJjZXMpewotCSAgICAJaWYocmVzIGluc3RhbmNlb2YgSUZvbGRlcikgewotCSAgICAJCWZvbGRlclBhdGggPSAoKElGb2xkZXIpcmVzKS5nZXRGdWxsUGF0aCgpOwotCQkJCUlGaWxlIGV4aXN0aW5nWE1JRmlsZSA9KChJRm9sZGVyKXJlcykuZ2V0RmlsZSh4bWlGaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkgICAgCQlpZihleGlzdGluZ1hNSUZpbGUgIT0gbnVsbCAmJiBleGlzdGluZ1hNSUZpbGUuZXhpc3RzKCkpewotCQkgICAgCQlJRmlsZVN0b3JlIGZvbGRlciA9IEVGUy5nZXRMb2NhbEZpbGVTeXN0ZW0oKS5nZXRTdG9yZShleGlzdGluZ1hNSUZpbGUuZ2V0TG9jYXRpb25VUkkoKSk7Ci0JICAgIAkJCWZvbGRlci5jb3B5KG5ld1hNSUZpbGUsIEVGUy5PVkVSV1JJVEUsIG51bGwpOwotCSAgICAJCSAgICBleGlzdGluZ1hNSUZpbGUuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCSAgICAJCSAgICBzZXRYbWlFeGlzdHModHJ1ZSk7Ci0JICAgIAkJICAgIHJldHVybiBmb2xkZXJQYXRoOwotCSAgICAJCX0KLQkgICAgCX0KLQkgICAgCWlmKHJlcyBpbnN0YW5jZW9mIElDb250YWluZXIpIAotCSAgICAJCWNvcHlFeGlzdGluZ1hNSUNvbnRlbnQoKElDb250YWluZXIpcmVzLAotCSAgICAJCQkJeG1pRmlsZU5hbWUsIG5ld1hNSUZpbGUpOwotCSAgICB9CQkKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUGF0aCBjb3B5RXhpc3RpbmdYTUlDb250ZW50QW5kRGVsZXRlRmlsZShJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIGRpYWdyYW1OYW1lLCBJRmlsZVN0b3JlIG5ld1hNSUZpbGUpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24sCUNvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgeG1pRmlsZU5hbWUgPSBkaWFncmFtTmFtZSArICIuIiArIERJQUdSQU1fRklMRV9FWFRFTlNJT047CQkvLyROT04tTkxTLTEkCi0JCUlQYXRoIGZvbGRlclBhdGggPSBjb3B5RXhpc3RpbmdYTUlDb250ZW50KHByb2plY3QsIHhtaUZpbGVOYW1lLCBuZXdYTUlGaWxlKTsKLQkJaWYgKGZvbGRlclBhdGggIT0gbnVsbCkKLQkJCXJldHVybiBmb2xkZXJQYXRoOwotCSAgICBJUGF0aCBwcm9qZWN0UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkgICAgZm9sZGVyUGF0aCA9IHByb2plY3RQYXRoLmFwcGVuZChnZXREaWFncmFtc1hNTEZvbGRlclBhdGgocHJvamVjdCkpOwotCSAgICByZXR1cm4gZm9sZGVyUGF0aDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBEaWFncmFtIGNyZWF0ZURpYWdyYW0oUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCwgCi0JCQkJCQkJCQkJaW50IGdyaWQsIAotCQkJCQkJCQkJCWJvb2xlYW4gc25hcCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJUGF0aCBwYXRoID0gY3JlYXRlRGlhZ3JhbVBhdGgocGVyc2lzdGVuY2VVbml0KTsKLQkJRGlhZ3JhbSBkID0gY3JlYXRlRGlhZ3JhbShwZXJzaXN0ZW5jZVVuaXQuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSwgcGF0aCwgcGVyc2lzdGVuY2VVbml0LmdldEpwYVByb2plY3QoKS5nZXROYW1lKCksIGdyaWQsIHNuYXApOyAKLQkgICAgcmV0dXJuIGQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGVkaXRpbmdEb21haW4gPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihkaWFncmFtKTsKLQkJcmV0dXJuIGVkaXRpbmdEb21haW47Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VTZXQgZ2V0UmVzb3VyY2VTZXQoRGlhZ3JhbSBkaWFncmFtKSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGdldFByb2plY3RCeURpYWdyYW0oZGlhZ3JhbS5nZXROYW1lKCkpOwotCQlpZiAoanBhUHJvamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIGRlZmF1bHRUcmFuc0VkaXREb21haW4gPSAoVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4panBhUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0QWRhcHRlcihUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5jbGFzcyk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gZGVmYXVsdFRyYW5zRWRpdERvbWFpbi5nZXRSZXNvdXJjZVNldCgpOwotCQlyZXR1cm4gcmVzb3VyY2VTZXQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFdycCB7Ci0JCXByaXZhdGUgT2JqZWN0IG87Ci0JCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQkJcmV0dXJuIG87Ci0JCX0KLQkJCi0JCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgbykgewotCQkJdGhpcy5vID0gbzsKLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIERpYWdyYW0gY3JlYXRlRGlhZ3JhbShJUHJvamVjdCBwcm9qZWN0LCAKLQkJCQkJCQkJCSBJUGF0aCBkaWFncmFtRmlsZU5hbWUsCi0JCQkJCQkJCQkgU3RyaW5nIGRpYWdyYW1OYW1lLAotCQkJCQkJCQkJIGludCBncmlkLCAKLQkJCQkJCQkJCSBib29sZWFuIHNuYXApIHsKLQkJCi0JCURpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW1CeVByb2plY3QocHJvamVjdCk7Ci0JCWlmIChkaWFncmFtICE9IG51bGwpCi0JCQlyZXR1cm4gZGlhZ3JhbTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gZGVmYXVsdFRyYW5zRWRpdERvbWFpbiA9IERpYWdyYW1FZGl0b3JGYWN0b3J5LmNyZWF0ZVJlc291cmNlU2V0QW5kRWRpdGluZ0RvbWFpbigpOwotCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCA9IGRlZmF1bHRUcmFuc0VkaXREb21haW4uZ2V0UmVzb3VyY2VTZXQoKTsKLQotCQlTdHJpbmcgcGF0aE5hbWUgPSBkaWFncmFtRmlsZU5hbWUudG9TdHJpbmcoKTsKLQkJVVJJIHJlc291cmNlVVJJID0gVVJJLmNyZWF0ZUZpbGVVUkkocGF0aE5hbWUpOwotCQlmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlU2V0LmNyZWF0ZVJlc291cmNlKHJlc291cmNlVVJJKTsKLQkJLy9yZXNvdXJjZS5zZXRUcmFja2luZ01vZGlmaWNhdGlvbihmYWxzZSk7Ci0JCQkvLyhSZXNvdXJjZVNldE1hbmFnZXIuZ2V0UHJvamVjdEZvclJlc291cmNlU2V0KHJlc291cmNlU2V0KSk7Ci0JCWRlZmF1bHRUcmFuc0VkaXREb21haW4uZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZChkZWZhdWx0VHJhbnNFZGl0RG9tYWluKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQl0cnkgewotCQkJCQlyZXNvdXJjZS5sb2FkKG51bGwpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dJbmZvKCJUaGUgZGlhZ3JhbSBmaWxlIGRvZXMgbm90IGV4aXN0LiBJdCB3aWxsIGJlIGNyZWF0ZWQiKTsJCS8vJE5PTi1OTFMtMSQKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dJbmZvKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQkKLQkJaWYgKCFyZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJcmV0dXJuIGNyZWF0ZU5ld0RpYWdyYW0ocHJvamVjdCwgZGVmYXVsdFRyYW5zRWRpdERvbWFpbiwgcmVzb3VyY2VTZXQsIHJlc291cmNlLCBkaWFncmFtTmFtZSwgZ3JpZCwgc25hcCk7Ci0JCQotCQlFTGlzdDxFT2JqZWN0PiBvYmpzID0gcmVzb3VyY2UuZ2V0Q29udGVudHMoKTsKLQkJaWYgKG9ianMgPT0gbnVsbCkgCi0JCQlyZXR1cm4gY3JlYXRlTmV3RGlhZ3JhbShwcm9qZWN0LCBkZWZhdWx0VHJhbnNFZGl0RG9tYWluLCByZXNvdXJjZVNldCwgcmVzb3VyY2UsIGRpYWdyYW1OYW1lLCBncmlkLCBzbmFwKTsKLQkJSXRlcmF0b3I8RU9iamVjdD4gaXQgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUVPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKChvYmogPT0gbnVsbCkgJiYgIURpYWdyYW0uY2xhc3MuaXNJbnN0YW5jZShvYmopKQotCQkJCWNvbnRpbnVlOwotCQkJZGlhZ3JhbSA9IChEaWFncmFtKW9iajsKLQkJCS8vZGlhZ3JhbXNUb1Jlc291cmNlcy5wdXQoZGlhZ3JhbSwgcmVzb3VyY2UpOwotCQkJZGVmYXVsdFRyYW5zRWRpdERvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkJcmV0dXJuIGRpYWdyYW07Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU5ld0RpYWdyYW0ocHJvamVjdCwgZGVmYXVsdFRyYW5zRWRpdERvbWFpbiwgcmVzb3VyY2VTZXQsIHJlc291cmNlLCBkaWFncmFtTmFtZSwgZ3JpZCwgc25hcCk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIERpYWdyYW0gY3JlYXRlTmV3RGlhZ3JhbShmaW5hbCBJUHJvamVjdCBwcm9qZWN0LAotCQkJCQkJCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBlZGl0aW5nRG9tYWluLAotCQkJCQkJCQkJCQlSZXNvdXJjZVNldCByZXNvdXJjZVNldCwKLQkJCQkJCQkJCQkJZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UsCi0JCQkJCQkJCQkJCWZpbmFsIFN0cmluZyBkaWFncmFtTmFtZSwKLQkJCQkJCQkJCQkJZmluYWwgaW50IGdyaWQsIAotCQkJCQkJCQkJCQlmaW5hbCBib29sZWFuIHNuYXApIHsKLQkJZmluYWwgV3JwIHdycCA9IG5ldyBXcnAoKTsKLQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKGVkaXRpbmdEb21haW4pIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCURpYWdyYW0gZGlhZ3JhbSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZURpYWdyYW0oSlBBX0RJQUdSQU1fVFlQRSwgZGlhZ3JhbU5hbWUsIGdyaWQsIHNuYXApOwotCQkJCXByb2plY3RUb0RpYWdyYW0ucHV0KHByb2plY3QsIG5ldyBXZWFrUmVmZXJlbmNlPERpYWdyYW0+KGRpYWdyYW0pKTsKLQkJCQl3cnAuc2V0T2JqZWN0KGRpYWdyYW0pOwotCQkJCXJlc291cmNlLmdldENvbnRlbnRzKCkuYWRkKGRpYWdyYW0pOwotCQkJCXRyeSB7Ci0JCQkJCXJlc291cmNlLnNhdmUoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBjcmVhdGUgbmV3IGRpYWdyYW0iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0JCQkJCi0JCQl9Ci0JCX0pOwkKLQkJZWRpdGluZ0RvbWFpbi5nZXRDb21tYW5kU3RhY2soKS5mbHVzaCgpOwotCQkvL21hcERpYWdyYW1Ub1Byb2plY3QoKERpYWdyYW0pd3JwLmdldE9iamVjdCgpLCByZXNvdXJjZSk7Ci0JCXJldHVybiAoRGlhZ3JhbSl3cnAuZ2V0T2JqZWN0KCk7CQkKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRSZXNvdXJjZUZvbGRlclBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gZ2V0RU1GUmVzb3VyY2VGb2xkZXJQYXRoKHByb2plY3QpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBJUGF0aCBnZXRFTUZSZXNvdXJjZUZvbGRlclBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlyZXR1cm4gcHJvamVjdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkuYXBwZW5kKERFRkFVTFRfUkVTX0ZPTERFUik7CQkKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0RGlhZ3JhbXNYTUxGb2xkZXJQYXRoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7CQkKLQkJcmV0dXJuIG5ldyBQYXRoKEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdEZvbGRlcihwcm9qZWN0LCBwcm9wcykpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldERpYWdyYW1zRm9sZGVyUGF0aChJUHJvamVjdCBwcm9qZWN0KXsKLQkJcmV0dXJuIEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKTsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgSnBhUHJvamVjdCBnZXRQcm9qZWN0QnlEaWFncmFtKFN0cmluZyBkaWFncmFtTmFtZSkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGRpYWdyYW1OYW1lKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKcGFQcm9qZWN0KHByb2plY3QpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RpYWdyYW1PcGVuKFN0cmluZyBkaWFncmFtTmFtZSkgewotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHdvcmtiZW5jaFBhZ2UgPSB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQlJRWRpdG9yUmVmZXJlbmNlW10gZWRpdG9yUmVmcyA9IHdvcmtiZW5jaFBhZ2UuZ2V0RWRpdG9yUmVmZXJlbmNlcygpOwotCQlmb3IgKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmIDogZWRpdG9yUmVmcykgewotCQkJaWYoIUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELmVxdWFscyhlZGl0b3JSZWYuZ2V0SWQoKSkpIAotCQkJCWNvbnRpbnVlOwotCQkJSlBBRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoSlBBRGlhZ3JhbUVkaXRvcillZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCWlmIChlZGl0b3IgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIgZGlhZ3JhbVByb3ZpZGVyID0gZWRpdG9yLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKTsgIAotCQkJRGlhZ3JhbSBkID0gZGlhZ3JhbVByb3ZpZGVyLmdldERpYWdyYW0oKTsKLQkJCWlmIChkaWFncmFtTmFtZS5lcXVhbHMoZC5nZXROYW1lKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9CQkKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkJCQotCQkKLQlwdWJsaWMgc3RhdGljIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIgZ2V0UHJvdmlkZXJCeURpYWdyYW0oU3RyaW5nIGRpYWdyYW1OYW1lKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gd29ya2JlbmNoUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgOiBlZGl0b3JSZWZzKSB7Ci0JCQlpZighSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQuZXF1YWxzKGVkaXRvclJlZi5nZXRJZCgpKSkgCi0JCQkJY29udGludWU7Ci0JCQlKUEFEaWFncmFtRWRpdG9yIGVkaXRvciA9IChKUEFEaWFncmFtRWRpdG9yKWVkaXRvclJlZi5nZXRFZGl0b3IoZmFsc2UpOwotCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBkaWFncmFtUHJvdmlkZXIgPSBlZGl0b3IuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpOyAgCi0JCQlEaWFncmFtIGQgPSBkaWFncmFtUHJvdmlkZXIuZ2V0RGlhZ3JhbSgpOwotCQkJaWYgKGRpYWdyYW1OYW1lLmVxdWFscyhkLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIGRpYWdyYW1Qcm92aWRlcjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHhtaUV4aXN0cygpIHsKLQkJcmV0dXJuIHhtaUV4aXN0czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0WG1pRXhpc3RzKGJvb2xlYW4geG1pRXhpc3RzKSB7Ci0JCU1vZGVsSW50ZWdyYXRpb25VdGlsLnhtaUV4aXN0cyA9IHhtaUV4aXN0czsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQYXRoIGdldERpYWdyYW1YTUxGdWxsUGF0aChTdHJpbmcgZGlhZ3JhbU5hbWUpIHsKLQkJaWYgKGRpYWdyYW1OYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gZ2V0UHJvamVjdEJ5RGlhZ3JhbShkaWFncmFtTmFtZSk7Ci0JCWlmIChqcGFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVByb2plY3QgcHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQlyZXR1cm4gcHJvamVjdC5nZXRGaWxlKE1vZGVsSW50ZWdyYXRpb25VdGlsCi0JCQkJLmdldERpYWdyYW1zWE1MRm9sZGVyUGF0aChwcm9qZWN0KQotCQkJCS5hcHBlbmQoZGlhZ3JhbU5hbWUpCi0JCQkJLmFkZEZpbGVFeHRlbnNpb24oCi0JCQkJCQlNb2RlbEludGVncmF0aW9uVXRpbC5ESUFHUkFNX1hNTF9GSUxFX0VYVEVOU0lPTikpLmdldEZ1bGxQYXRoKCk7Ci0JfQotCQotCXN5bmNocm9uaXplZCBwdWJsaWMgc3RhdGljIHZvaWQgcHV0UHJvamVjdFRvRGlhZ3JhbShJUHJvamVjdCBwcm9qZWN0LCBEaWFncmFtIGQpIHsKLQkJcHJvamVjdFRvRGlhZ3JhbS5wdXQocHJvamVjdCwgbmV3IFdlYWtSZWZlcmVuY2U8RGlhZ3JhbT4oZCkpOwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgc3RhdGljIERpYWdyYW0gZ2V0RGlhZ3JhbUJ5UHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSB3b3JrYmVuY2hQYWdlID0gbnVsbDsgCi0JCXRyeSB7Ci0JCQl3b3JrYmVuY2hQYWdlID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCUlFZGl0b3JSZWZlcmVuY2VbXSBlZGl0b3JSZWZzID0gd29ya2JlbmNoUGFnZS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQlmb3IgKElFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmIDogZWRpdG9yUmVmcykgewotCQkJCWlmKCFKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRC5lcXVhbHMoZWRpdG9yUmVmLmdldElkKCkpKSAKLQkJCQkJY29udGludWU7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSAoSlBBRGlhZ3JhbUVkaXRvcillZGl0b3JSZWYuZ2V0RWRpdG9yKGZhbHNlKTsKLQkJCQlpZiAoZWRpdG9yID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIgZGlhZ3JhbVByb3ZpZGVyID0gZWRpdG9yLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKTsgIAotCQkJCURpYWdyYW0gZCA9IGRpYWdyYW1Qcm92aWRlci5nZXREaWFncmFtKCk7Ci0JCQkJaWYgKGQuZ2V0TmFtZSgpLmVxdWFscyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJCXJldHVybiBkOwotCQkJfQkJCQotCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCQlXZWFrUmVmZXJlbmNlPERpYWdyYW0+IHJlZiA9IHByb2plY3RUb0RpYWdyYW0uZ2V0KHByb2plY3QpOwotCQlpZiAocmVmICE9IG51bGwpCi0JCQlyZXR1cm4gcmVmLmdldCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsSW1wbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdXRpbC9Nb2RlbEludGVncmF0aW9uVXRpbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE2N2ZlNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLQotcHVibGljIGNsYXNzIE1vZGVsSW50ZWdyYXRpb25VdGlsSW1wbCBpbXBsZW1lbnRzIElNb2RlbEludGVncmF0aW9uVXRpbCB7Ci0JCi0JcHVibGljIEpwYVByb2plY3QgZ2V0UHJvamVjdEJ5RGlhZ3JhbShEaWFncmFtIGRpYWdyYW0pIHsKLQkJcmV0dXJuIE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZGlhZ3JhbS5nZXROYW1lKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyZDg4ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcwotCQlBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRElBR1JBTV9GT0xERVIgCQkJCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmRpYWdyYW1mb2xkZXIiOwkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FTlRJVFlfUEFDS0FHRSAJCQkJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZW50aXR5LmRlZmF1bHRQYWNrYWdlIjsJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1RBQkxFX05BTUVfUFJFRklYIAkJCT0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmVudGl0eS5kZWZhdWx0VGFibGVOYW1lUHJlZml4IjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ESVJFQ1RfRURJVF9DTEFTU19OQU1FIAkJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZW50aXR5LmRlZmF1bHREaXJlY3RFZGl0Q2xhc3NOYW1lIjsJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VOVElUWV9BQ0NFU1NfVFlQRSAJCQk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5lbnRpdHkuZGVmYXVsdEVudGl0eUFjY2Vzc1R5cGUiOwkvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRkFVTFRfQ09MTEVDVElPTl9UWVBFIAk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5lbnRpdHkuZGVmYXVsdENvbGxlY3Rpb25UeXBlIjsJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9PTkVfVE9fTUFOWV9PTERfU1RZTEUJICAJPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuZW50aXR5LmRlZmF1bHRPbmVUb01hbnlPbGRTdHlsZSI7CQkJLy8kTk9OLU5MUy0xJAotCQotCi0JCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX0RJQUdSQU1fRk9MREVSCQkgCT0gImRpYWdyYW1zIjsJCQkvLyROT04tTkxTLTEkCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTF9FTlRJVFlfUEFDS0FHRSAJCQk9ICJvcmcucGVyc2lzdGVuY2UiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX1BSRUZJWCAJCQkJCT0gIlRfIjsJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfQUNDRVNTX0ZJRUxEX0JBU0VEIAkJPSAiZmllbGQiOwkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX0FDQ0VTU19QUk9QRVJUWV9CQVNFRCAJPSAicHJvcGVydHkiOwkJCS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9WQUxfQ09MTEVDVElPTl9UWVBFIAk9ICJjb2xsZWN0aW9uIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX0xJU1RfVFlQRSAJCQk9ICJsaXN0IjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMX1NFVF9UWVBFIAkJCT0gInNldCI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTF9NQVBfVFlQRSAJCQk9ICJtYXAiOwkJCS8vJE5PTi1OTFMtMSQKLQotCQotCQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBzdG9yZTsKLQotCXB1YmxpYyBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIoKSB7Ci0JCXN0b3JlID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlwdWJsaWMgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJdGhpcy5zdG9yZSA9IHN0b3JlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWVvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjCi0JICogaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJc3RvcmUuc2V0RGVmYXVsdChQUk9QRVJUWV9ESUFHUkFNX0ZPTERFUiwgUFJPUEVSVFlfVkFMX0RJQUdSQU1fRk9MREVSKTsJCQotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0VOVElUWV9QQUNLQUdFLCBQUk9QRVJUWV9WQUxfRU5USVRZX1BBQ0tBR0UpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX1RBQkxFX05BTUVfUFJFRklYLCBQUk9QRVJUWV9WQUxfUFJFRklYKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQUk9QRVJUWV9ESVJFQ1RfRURJVF9DTEFTU19OQU1FLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQUk9QRVJUWV9FTlRJVFlfQUNDRVNTX1RZUEUsIFBST1BFUlRZX1ZBTF9BQ0NFU1NfRklFTERfQkFTRUQpOwotCQlzdG9yZS5zZXREZWZhdWx0KFBST1BFUlRZX0RFRkFVTFRfQ09MTEVDVElPTl9UWVBFLCBQUk9QRVJUWV9WQUxfQ09MTEVDVElPTl9UWVBFKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQUk9QRVJUWV9PTkVfVE9fTUFOWV9PTERfU1RZTEUsIGZhbHNlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1M2M1ZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUmFkaW9Hcm91cEZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuU3RyaW5nRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLlN0cmluZ1Rvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZSBleHRlbmRzIEZpZWxkRWRpdG9yUHJlZmVyZW5jZVBhZ2UKLQkJaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIAlGSUNUSVZFX1BST0pFQ1RfTkFNRSA9ICJQUk9KRUNUIE5BTUUiOwkJLy8kTk9OLU5MUy0xJCAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgCUNPTExFQ1RJSU9OX1RZUEUgPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIAlMSVNUX1RZUEUgPSAiamF2YS51dGlsLkxpc3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIAlTRVRfVFlQRSA9ICJqYXZhLnV0aWwuU2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAJTUFQX1RZUEUgPSAiamF2YS51dGlsLk1hcCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIFN0cmluZ0ZpZWxkRWRpdG9yIAkJZkRlZmF1bHREaWFncmFtRm9sZGVyRmllbGQ7Ci0JcHJpdmF0ZSBTdHJpbmdGaWVsZEVkaXRvciAJCWZEZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkOwotCXByaXZhdGUgU3RyaW5nRmllbGRFZGl0b3IgCQlmRGVmYXVsdFRhYmxlTmFtZVByZWZpeDsKLQlwcml2YXRlIEpQQUJvb2xlYW5GaWVsZEVkaXRvciAJZGlyZWN0RWRpdEFmZmVjdHNDbGFzczsKLQlwcml2YXRlIFJhZGlvR3JvdXBGaWVsZEVkaXRvciAJZW50aXR5QWNjZXNzVHlwZUNob29zZXI7Ci0JcHJpdmF0ZSBSYWRpb0dyb3VwRmllbGRFZGl0b3IgICBkZWZhdWx0Q29sbGVjdGlvblR5cGVDaG9vc2VyOwotCXByaXZhdGUgSlBBQm9vbGVhbkZpZWxkRWRpdG9yIAlvbmVUb01hbnlPbGRTdHlsZTsKLQotCXB1YmxpYyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UoKSB7Ci0JCXN1cGVyKEdSSUQpOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUoSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfcGFnZURlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCQkKLQlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVGaWVsZEVkaXRvcnMoKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBnZXRGaWVsZEVkaXRvclBhcmVudCgpOwotCQljcmVhdGVGb2xkZXJGaWVsZChwYXJlbnQpOwotCQljcmVhdGVFbnRpdHlQYWNrYWdlRmllbGQocGFyZW50KTsKLQkJY3JlYXRlVGFibGVOYW1lRmllbGQocGFyZW50KTsKLQkJCi0JCWRpcmVjdEVkaXRBZmZlY3RzQ2xhc3MgPSBuZXcgSlBBQm9vbGVhbkZpZWxkRWRpdG9yKCIiLAkvLyROT04tTkxTLTEkIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kaXJlY3RFZGl0QWZmZWN0c0NsYXNzLCAKLQkJCQlCb29sZWFuRmllbGRFZGl0b3IuREVGQVVMVCwgcGFyZW50KTsKLQkJZGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5zZXRQcmVmZXJlbmNlTmFtZShKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRElSRUNUX0VESVRfQ0xBU1NfTkFNRSk7Ci0JCWRpcmVjdEVkaXRBZmZlY3RzQ2xhc3MuZ2V0Q2hlY2tCb3gocGFyZW50KS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGlyZWN0RWRpdEFmZmVjdHNDbGFzc1Rvb2x0aXApOwotCQlhZGRGaWVsZChkaXJlY3RFZGl0QWZmZWN0c0NsYXNzKTsJCQotCQllbnRpdHlBY2Nlc3NUeXBlQ2hvb3NlciA9IG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoCi0JCQkJSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9BQ0NFU1NfVFlQRSwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5QWNjZXNzVHlwZUJ1dHRvbkdyb3VwTGFiZWwsCi0JCQkJMSwKLQkJCSAgICBuZXcgU3RyaW5nW11bXSB7Ci0JCQkJCXtKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5RmllbGRCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsLCBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0FDQ0VTU19GSUVMRF9CQVNFRH0sCi0JCQkJCXtKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5UHJvcGVydHlCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsLCBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0FDQ0VTU19QUk9QRVJUWV9CQVNFRH19LAkJCQkKLQkJCQkJcGFyZW50LCB0cnVlKTsKLQkJZW50aXR5QWNjZXNzVHlwZUNob29zZXIuc2V0UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQkJZW50aXR5QWNjZXNzVHlwZUNob29zZXIuZ2V0UmFkaW9Cb3hDb250cm9sKHBhcmVudCkuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUFjY2Vzc1R5cGVCdXR0b25Hcm91cFRvb2x0aXApOwotCQlhZGRGaWVsZChlbnRpdHlBY2Nlc3NUeXBlQ2hvb3Nlcik7Ci0JCQotCQkKLQkJCi0JCWRlZmF1bHRDb2xsZWN0aW9uVHlwZUNob29zZXIgPSBuZXcgUmFkaW9Hcm91cEZpZWxkRWRpdG9yKAotCQkJCUpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ERUZBVUxUX0NPTExFQ1RJT05fVFlQRSwKLQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvblRpdHRsZSwKLQkJCQkxLAotCQkJICAgIG5ldyBTdHJpbmdbXVtdIHsKLQkJCQkJe0NPTExFQ1RJSU9OX1RZUEUsIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQ09MTEVDVElPTl9UWVBFfSwKLQkJCQkJe0xJU1RfVFlQRSwgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9MSVNUX1RZUEV9LAkJCi0JCQkJCXtTRVRfVFlQRSwgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9TRVRfVFlQRX0sCi0JCQkJCXtNQVBfVFlQRSwgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9NQVBfVFlQRX19LAotCQkJCQlwYXJlbnQsIHRydWUpOwotCQlkZWZhdWx0Q29sbGVjdGlvblR5cGVDaG9vc2VyLnNldFByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWRlZmF1bHRDb2xsZWN0aW9uVHlwZUNob29zZXIuZ2V0UmFkaW9Cb3hDb250cm9sKHBhcmVudCkuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCWFkZEZpZWxkKGRlZmF1bHRDb2xsZWN0aW9uVHlwZUNob29zZXIpOwotCQkKLQkJb25lVG9NYW55T2xkU3R5bGUgPSBuZXcgSlBBQm9vbGVhbkZpZWxkRWRpdG9yKCIiLAkvLyROT04tTkxTLTEkIAotCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZSwgCi0JCQkJQm9vbGVhbkZpZWxkRWRpdG9yLkRFRkFVTFQsIHBhcmVudCk7Ci0JCW9uZVRvTWFueU9sZFN0eWxlLnNldFByZWZlcmVuY2VOYW1lKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9PTkVfVE9fTUFOWV9PTERfU1RZTEUpOwotCQlvbmVUb01hbnlPbGRTdHlsZS5nZXRDaGVja0JveChwYXJlbnQpLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9vbmVUb01hbnlPbGRTdHlsZVRvb2x0aXApOwotCQlhZGRGaWVsZChvbmVUb01hbnlPbGRTdHlsZSk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRm9sZGVyRmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmRGVmYXVsdERpYWdyYW1Gb2xkZXJGaWVsZCA9IG5ldyBDdXN0b21TdHJpbmdGaWVsZEVkaXRvcigKLQkJCQlKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRElBR1JBTV9GT0xERVIsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sTGFiZWwsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVWYWx1ZSgpIHsKLQkJCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRGb2xkZXIoSVBhdGguU0VQQVJBVE9SICsgRklDVElWRV9QUk9KRUNUX05BTUUgKyBJUGF0aC5TRVBBUkFUT1IKLQkJCQkJCQkJCQkJCQkgKyBmRGVmYXVsdERpYWdyYW1Gb2xkZXJGaWVsZC5nZXRTdHJpbmdWYWx1ZSgpLnRyaW0oKSwgRklDVElWRV9QUk9KRUNUX05BTUUpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQkKLQkJZkRlZmF1bHREaWFncmFtRm9sZGVyRmllbGQuZ2V0VGV4dENvbnRyb2wocGFyZW50KS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQotCQlmRGVmYXVsdERpYWdyYW1Gb2xkZXJGaWVsZC5nZXRMYWJlbENvbnRyb2wocGFyZW50KS4KLQkJc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcCk7Ci0JCWFkZEZpZWxkKGZEZWZhdWx0RGlhZ3JhbUZvbGRlckZpZWxkKTsKLQkJCi0JCQotCQlmRGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZCA9IG5ldyBDdXN0b21TdHJpbmdGaWVsZEVkaXRvcigKLQkJCQlKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRU5USVRZX1BBQ0tBR0UsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlVG9Vc2UsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpIHsKLQkJCQkJcHJvdGVjdGVkIElTdGF0dXMgdmFsaWRhdGVWYWx1ZSgpIHsKLQkJCQkJCXJldHVybiB2YWxpZGF0ZURlZmF1bHRQYWNrYWdlKGZEZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLmdldFN0cmluZ1ZhbHVlKCkudHJpbSgpKTsKLQkJCQkJfQkKLQkJCQl9OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFbnRpdHlQYWNrYWdlRmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmRGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5nZXRUZXh0Q29udHJvbChwYXJlbnQpLmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJfQotCQl9KTsKLQkJCQotCQlmRGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5nZXRMYWJlbENvbnRyb2wocGFyZW50KS4KLQkJCQlzZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdFBhY2thZ2VNc2cpOwotCQlhZGRGaWVsZChmRGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZCk7CQkKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlVGFibGVOYW1lRmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlmRGVmYXVsdFRhYmxlTmFtZVByZWZpeCA9IG5ldyBDdXN0b21TdHJpbmdGaWVsZEVkaXRvcigKLQkJCQlKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVEFCTEVfTkFNRV9QUkVGSVgsCi0JCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVMYWJlbCwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkgewotCQkJCQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVZhbHVlKCkgewotCQkJCQkJcmV0dXJuIHZhbGlkYXRlVGFibGVOYW1lUHJlZml4KGZEZWZhdWx0VGFibGVOYW1lUHJlZml4LmdldFN0cmluZ1ZhbHVlKCkudHJpbSgpKTsKLQkJCQkJfQotCQkJCX07Ci0JCQkJZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXguZ2V0VGV4dENvbnRyb2wocGFyZW50KS5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCQkJCi0JCWZEZWZhdWx0VGFibGVOYW1lUHJlZml4LmdldExhYmVsQ29udHJvbChwYXJlbnQpLgotCQkJCXNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lUHJlZml4TXNnKTsKLQkJYWRkRmllbGQoZkRlZmF1bHRUYWJsZU5hbWVQcmVmaXgpOwotCQkKLQkJCi0JCQotCQlmRGVmYXVsdFRhYmxlTmFtZVByZWZpeC5nZXRUZXh0Q29udHJvbChwYXJlbnQpLgotCQkJCXNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lUHJlZml4TXNnKTsJCQotCX0KLQkKLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVEZWZhdWx0Rm9sZGVyKFN0cmluZyBkZWZhdWx0Rm9sZGVyLCBTdHJpbmcgcHJvamVjdE5hbWUpIHsKLQkJZGVmYXVsdEZvbGRlciA9IGRlZmF1bHRGb2xkZXIudHJpbSgpOwotCQlpZiAoU3RyaW5nVG9vbHMuc3RyaW5nSXNFbXB0eShkZWZhdWx0Rm9sZGVyKSkgCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCAKLQkJCQkJICBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLlBMVUdJTl9JRCwgCi0JCQkJCSAgSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VtcHR5Rm9sZGVyKTsKLQkJZGVmYXVsdEZvbGRlciA9IElQYXRoLlNFUEFSQVRPUiArIHByb2plY3ROYW1lICsgSVBhdGguU0VQQVJBVE9SICsgZGVmYXVsdEZvbGRlcjsgCi0JCWlmICghZGVmYXVsdEZvbGRlci5zdGFydHNXaXRoKElQYXRoLlNFUEFSQVRPUiArIHByb2plY3ROYW1lICsgSVBhdGguU0VQQVJBVE9SKSkKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIAotCQkJCQkJCSAgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5QTFVHSU5fSUQsIAotCQkJCQkJCSAgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRGb2xkZXIsIAotCQkJCQkJCQkJICAJCQkgICBJUGF0aC5TRVBBUkFUT1IgKyBwcm9qZWN0TmFtZSArIElQYXRoLlNFUEFSQVRPUikpOwotCQlJU3RhdHVzIHJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS52YWxpZGF0ZVBhdGgoZGVmYXVsdEZvbGRlciwgSVJlc291cmNlLkZPTERFUik7Ci0JCXJldHVybiByZXM7Ci0JfQotCQkKLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdmFsaWRhdGVEZWZhdWx0UGFja2FnZShTdHJpbmcgZGVmYXVsdFBhY2thZ2UpIHsKLQkJSVN0YXR1cyB2YWxpZGF0ZURlZmF1bHRQYWNrYWdlU3RhdHVzID0gSmF2YUNvbnZlbnRpb25zCi0JCQkJLnZhbGlkYXRlUGFja2FnZU5hbWUoZGVmYXVsdFBhY2thZ2UsIEphdmFDb3JlLlZFUlNJT05fMV81LAotCQkJCQkJSmF2YUNvcmUuVkVSU0lPTl8xXzUpOwotCQlpZiAodmFsaWRhdGVEZWZhdWx0UGFja2FnZVN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuT0spIAotCQkJcmV0dXJuIHZhbGlkYXRlRGVmYXVsdFBhY2thZ2VTdGF0dXM7IAotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKUEFEaWFncmFtRWRpdG9yLklELCBudWxsKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIHZhbGlkYXRlVGFibGVOYW1lUHJlZml4KFN0cmluZyB0YWJsZU5hbWVQcmVmaXgpIHsKLQkJU3RyaW5nIHMgPSB0YWJsZU5hbWVQcmVmaXg7Ci0JCWlmIChTdHJpbmdUb29scy5zdHJpbmdJc0VtcHR5KHMpKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlBBRGlhZ3JhbUVkaXRvci5JRCwgbnVsbCk7Ci0JCWlmIChDaGFyYWN0ZXIuaXNEaWdpdChzLmNoYXJBdCgwKSkpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRUYWJsZU5hbWVQcmVmaXgsIAotCQkJCQl0YWJsZU5hbWVQcmVmaXgpOwotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlBBRGlhZ3JhbUVkaXRvci5JRCwgbWVzc2FnZSk7CQkJCQkJCi0JCX0JCQotCQlmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHMuY2hhckF0KGkpOwotCQkJaWYgKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoKSAmJiAoY2ggIT0gJ18nKSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2ludmFsaWRUYWJsZU5hbWVQcmVmaXgsIAotCQkJCQkJdGFibGVOYW1lUHJlZml4KTsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKUEFEaWFncmFtRWRpdG9yLklELCBtZXNzYWdlKTsJCQkJCQkKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlBBRGlhZ3JhbUVkaXRvci5JRCwgbnVsbCk7CQotCX0JCi0JCi0JcHVibGljIGFic3RyYWN0IGNsYXNzIEN1c3RvbVN0cmluZ0ZpZWxkRWRpdG9yIGV4dGVuZHMgU3RyaW5nRmllbGRFZGl0b3IgewotCQlwdWJsaWMgQ3VzdG9tU3RyaW5nRmllbGRFZGl0b3IoU3RyaW5nIHByb3BlcnR5TmFtZSwKLQkJCQkJCQkJCSAgIFN0cmluZyBsYWJlbE5hbWUsCi0JCQkJCQkJCQkgICBDb21wb3NpdGUgZmllbGRFZGl0b3JQYXJlbnQpIHsKLQkJCQotCQkJc3VwZXIocHJvcGVydHlOYW1lLCBsYWJlbE5hbWUsIGZpZWxkRWRpdG9yUGFyZW50KTsKLQkJfQotCQkKLQkJU3RyaW5nIG1zZzsKLQkJU3RyaW5nIHByZWZpeE1zZzsKLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIGNoZWNrU3RhdGUoKSB7Ci0JCQlJU3RhdHVzIHN0YXQgPSB2YWxpZGF0ZVZhbHVlKCk7Ci0JCQlpZiAoc3RhdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc3RhdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7CQkJCi0JCX0KLQkJCi0JCXByb3RlY3RlZCBib29sZWFuIGRvQ2hlY2tTdGF0ZSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9CQotCQkJCQotCQlhYnN0cmFjdCBwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVZhbHVlKCk7Ci0JfQotCQotCQotCXB1YmxpYyBjbGFzcyBKUEFCb29sZWFuRmllbGRFZGl0b3IgZXh0ZW5kcyBCb29sZWFuRmllbGRFZGl0b3IgewotCQlwdWJsaWMgSlBBQm9vbGVhbkZpZWxkRWRpdG9yKFN0cmluZyBuYW1lLCBTdHJpbmcgbGFiZWxUZXh0LCBpbnQgc3R5bGUsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKG5hbWUsIGxhYmVsVGV4dCwgc3R5bGUsIHBhcmVudCk7Ci0JCX0KLQkJCQkKLQkJcHVibGljIEJ1dHRvbiBnZXRDaGVja0JveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hhbmdlQ29udHJvbChwYXJlbnQpOwotCQl9CQkKLQl9Ci0JCi0gICAgc3luY2hyb25pemVkIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlUGFnZSgpIHsKLSAgICAJCi0gICAgCUlTdGF0dXMgc3RhdEZvbGRlciA9IEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZS4KLSAgICAJCQkJCQkJdmFsaWRhdGVEZWZhdWx0Rm9sZGVyKGZEZWZhdWx0RGlhZ3JhbUZvbGRlckZpZWxkLmdldFRleHRDb250cm9sKGdldEZpZWxkRWRpdG9yUGFyZW50KCkpLmdldFRleHQoKS50cmltKCksIAotICAgIAkJCQkJCQlGSUNUSVZFX1BST0pFQ1RfTkFNRSk7Ci0gICAgCUlTdGF0dXMgc3RhdFBhY2sgPSBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UuCi0gICAgCQkJCQkJCXZhbGlkYXRlRGVmYXVsdFBhY2thZ2UoZkRlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuZ2V0VGV4dENvbnRyb2woZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgCQotICAgIAlJU3RhdHVzIHN0YXRQcmVmID0gSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlLgotICAgIAkJCQkJCQl2YWxpZGF0ZVRhYmxlTmFtZVByZWZpeChmRGVmYXVsdFRhYmxlTmFtZVByZWZpeC5nZXRUZXh0Q29udHJvbChnZXRGaWVsZEVkaXRvclBhcmVudCgpKS5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAJCi0gICAgCWlmIChzdGF0Rm9sZGVyLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgIAkJc2V0RXJyb3JNZXNzYWdlKHN0YXRGb2xkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICAJCXNldFZhbGlkKGZhbHNlKTsKLSAgICAJCXJldHVybjsKLSAgICAJfSAgICAJICAgIAkKLSAgICAJaWYgKHN0YXRQYWNrLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgIAkJc2V0RXJyb3JNZXNzYWdlKHN0YXRQYWNrLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQlzZXRWYWxpZChmYWxzZSk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0gCi0gICAgCWlmIChzdGF0UHJlZi5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpIHsKLSAgICAJCXNldEVycm9yTWVzc2FnZShzdGF0UHJlZi5nZXRNZXNzYWdlKCkpOwotICAgIAkJc2V0VmFsaWQoZmFsc2UpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCXNldEVycm9yTWVzc2FnZShudWxsKTsKLSAgICAJc2V0VmFsaWQodHJ1ZSk7Ci0gICAgCWlmIChzdGF0UGFjay5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgeyAgIAkJCi0gICAgCQlzZXRNZXNzYWdlKHN0YXRQYWNrLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAlpZiAoc3RhdFByZWYuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLldBUk5JTkcpIHsgICAJCQotICAgIAkJc2V0TWVzc2FnZShzdGF0UHJlZi5nZXRNZXNzYWdlKCksIElNZXNzYWdlUHJvdmlkZXIuV0FSTklORyk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJc2V0TWVzc2FnZShudWxsLCBJTWVzc2FnZVByb3ZpZGVyLk5PTkUpOwotICAgIH0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm9wZXJ0eXBhZ2UvSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9KUEFEaWFncmFtUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZjBiZWUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3BlcnR5cGFnZS9KUEFEaWFncmFtUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JTWVzc2FnZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi1wdWJsaWMgY2xhc3MgSlBBRGlhZ3JhbVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9TRVRUSU5HU19QQVRIID0gIi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkiOwkvLyROT04tTkxTLTEkOwotCXByb3RlY3RlZCBJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pQQTEwUHJvamVjdCA9IGZhbHNlOwkJCQkvLyROT04tTkxTLTEkOwotCQotCXByaXZhdGUgUHJvcGVydGllcyBlZGl0b3JQcm9wczsKLQkKLQlwcml2YXRlIFRleHQgdHh0RGVmYXVsdEZvbGRlckZpZWxkOwotCXByaXZhdGUgVGV4dCB0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkOwotCXByaXZhdGUgVGV4dCB0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4OwotCXByaXZhdGUgQnV0dG9uIGNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzczsKLQlwcml2YXRlIEdyb3VwIGdyb3VwQWNjZXNzVHlwZTsKLQlwcml2YXRlIEdyb3VwIGdyb3VwQ29sbGVjdGlvblR5cGU7Ci0JcHJpdmF0ZSBCdXR0b24gYnRuRmllbGRCYXNlZEFjY2VzczsKLQlwcml2YXRlIEJ1dHRvbiBidG5Qcm9wZXJ0eUJhc2VkQWNjZXNzOwotCXByaXZhdGUgQnV0dG9uIGJ0bkNvbGxlY3Rpb25UeXBlOwotCXByaXZhdGUgQnV0dG9uIGJ0bkxpc3RUeXBlOwotCXByaXZhdGUgQnV0dG9uIGJ0blNldFR5cGU7Ci0JcHJpdmF0ZSBCdXR0b24gYnRuTWFwVHlwZTsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja09uZVRvTWFueU9sZFN0eWxlOwotCi0JcHJpdmF0ZSBib29sZWFuIHByb3BzTW9kaWZpZWQgPSBmYWxzZTsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBRVUFMSUZJRVIgCQkJCQkJCQk9ICJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aSI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0RFRkFVTFRfRElBR1JBTV9GT0xERVIJCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAiZGlhZ3JhbUZvbGRlciIpOwkJCS8vJE5PTi1OTFMtMSQ7CQotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0RFRkFVTFRfUEFDS0FHRSAJCQkJPSBuZXcgUXVhbGlmaWVkTmFtZShRVUFMSUZJRVIsICJkZWZhdWx0UGFja2FnZSIpOwkJCS8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgUFJPUF9ERUZBVUxUX1RBQkxFX05BTUVfUFJFRklYIAk9IG5ldyBRdWFsaWZpZWROYW1lKFFVQUxJRklFUiwgImRlZmF1bHRUYWJsZU5hbWVQcmVmaXgiKTsJLy8kTk9OLU5MUy0xJDsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgUFJPUF9ESVJFQ1RfRURJVF9BRkZFQ1RTX0NMQVNTIAk9IG5ldyBRdWFsaWZpZWROYW1lKFFVQUxJRklFUiwgImRpcmVjdEVkaXRBZmZlY3RzQ2xhc3MiKTsJLy8kTk9OLU5MUy0xJDsKLQlzdGF0aWMgcHVibGljIGZpbmFsIFF1YWxpZmllZE5hbWUgUFJPUF9BQ0NFU1NfVFlQRSAJCQkJCT0gbmV3IFF1YWxpZmllZE5hbWUoUVVBTElGSUVSLCAiYWNjZXNzVHlwZSIpOwkJCQkvLyROT04tTkxTLTEkOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgUXVhbGlmaWVkTmFtZSBQUk9QX0NPTExFQ1RJT05fVFlQRSAJCQkJPSBuZXcgUXVhbGlmaWVkTmFtZShRVUFMSUZJRVIsICJjb2xsZWN0aW9uVHlwZSIpOwkJCS8vJE5PTi1OTFMtMSQ7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBRdWFsaWZpZWROYW1lIFBST1BfT05FX1RPX01BTllfT0xEX1NUWUxFCQk9IG5ldyBRdWFsaWZpZWROYW1lKFFVQUxJRklFUiwgIm9uZVRvTWFueU9sZFN0eWxlIik7CQkvLyROT04tTkxTLTEkOwotCQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9UWVBFID0gImphdmEudXRpbC5Db2xsZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVRfVFlQRSA9ICJqYXZhLnV0aWwuU2V0IjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9UWVBFID0gImphdmEudXRpbC5NYXAiOyAvLyROT04tTkxTLTEkCi0KLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZmluYWwgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZUNvbnRhaW5lcihwYXJlbnQpOwotCQlwcm9qZWN0ID0gKElQcm9qZWN0KWdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJaXNKUEExMFByb2plY3QgPSBKUEFFZGl0b3JVdGlsLmNoZWNrSlBBRmFjZXRWZXJzaW9uKHByb2plY3QsICIxLjAiKTsJCQkJLy8kTk9OLU5MUy0xJDsJCQotCQlsb2FkUHJvcGVydGllcygpOwotCQljcmVhdGVEZWZhdWx0Rm9sZGVyQ29udHJvbChjb21wb3NpdGUpOwotCQljcmVhdGVEZWZhdWx0UGFja2FnZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlRGVmYXVsdFRhYmxlTmFtZVByZWZpeENvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlRGlyZWN0RWRpdEFmZmVjdHNDbGFzc0NvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlQWNjZXNzVHlwZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJY3JlYXRlRGVmYXVsdENvbGxlY3Rpb25UeXBlQ29udHJvbChjb21wb3NpdGUpOwotCQlpZiAoIWlzSlBBMTBQcm9qZWN0KQotCQkJY3JlYXRlT25lVG9NYW55T2xkU3R5bGVDb250cm9sKGNvbXBvc2l0ZSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJdmFsaWRhdGVQYWdlKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7CQkKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlQ29udGFpbmVyKENvbXBvc2l0ZSBwYXJlbnQpIHsJCi0JCWZpbmFsIENvbXBvc2l0ZSBjb21wb3NpdGU9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpKTsKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdsKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0Rm9sZGVyQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUxhYmVsIGxibERlZmF1bHRGb2xkZXIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuRklMTCk7IAotCQlsYmxEZWZhdWx0Rm9sZGVyLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sTGFiZWwpOwotCQlsYmxEZWZhdWx0Rm9sZGVyLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9kZWZhdWx0Rm9sZGVyQ29udHJvbFRvb2x0aXApOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYmxEZWZhdWx0Rm9sZGVyLnNldExheW91dERhdGEoZ2QpOwkKLQkJdHh0RGVmYXVsdEZvbGRlckZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIgfCBTV1QuRklMTCk7Ci0JCWxibERlZmF1bHRGb2xkZXIuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0eHREZWZhdWx0Rm9sZGVyRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCSAgICBTdHJpbmcgZGVmYXVsdEZvbGRlciA9IGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9ESUFHUkFNX0ZPTERFUi5nZXRMb2NhbE5hbWUoKSk7Ci0JICAgIHR4dERlZmF1bHRGb2xkZXJGaWVsZC5zZXRUZXh0KGRlZmF1bHRGb2xkZXIpOwotCSAgICB0eHREZWZhdWx0Rm9sZGVyRmllbGQuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2RlZmF1bHRGb2xkZXJDb250cm9sVG9vbHRpcCk7Ci0JICAgIHR4dERlZmF1bHRGb2xkZXJGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0JCQkKLQkJfSk7Ci0JfQotCQotCQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGVmYXVsdFBhY2thZ2VDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGJsRGVmYXVsdFBhY2thZ2UgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuRklMTCk7IAotCQlsYmxEZWZhdWx0UGFja2FnZS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZVRvVXNlKTsKLQkJbGJsRGVmYXVsdFBhY2thZ2Uuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJbGJsRGVmYXVsdFBhY2thZ2Uuc2V0TGF5b3V0RGF0YShnZCk7CQotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIgfCBTV1QuRklMTCk7Ci0JCWxibERlZmF1bHRQYWNrYWdlLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0UGFja2FnZU1zZyk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl0eHREZWZhdWx0RW50aXR5UGFja2FnZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkgICAgU3RyaW5nIGRlZmF1bHRQYWNrYWdlTmFtZSA9IGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9QQUNLQUdFLmdldExvY2FsTmFtZSgpKTsKLQkJdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5zZXRUZXh0KGRlZmF1bHRQYWNrYWdlTmFtZSk7Ci0JCXR4dERlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRQYWNrYWdlTXNnKTsKLQkJdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQl2YWxpZGF0ZVBhZ2UoKTsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0JCQkKLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVEZWZhdWx0VGFibGVOYW1lUHJlZml4Q29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCUxhYmVsIGxibERlZmF1bHRUYWJsZU5hbWVQcmZpeCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5GSUxMKTsgCi0JCWxibERlZmF1bHRUYWJsZU5hbWVQcmZpeC5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9EZWZhdWx0VGFibGVOYW1lTGFiZWwpOwotCQlsYmxEZWZhdWx0VGFibGVOYW1lUHJmaXguc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlsYmxEZWZhdWx0VGFibGVOYW1lUHJmaXguc2V0TGF5b3V0RGF0YShnZCk7CQotCQl0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5CT1JERVIpOwotCQlsYmxEZWZhdWx0VGFibGVOYW1lUHJmaXguc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCi0JICAgIFN0cmluZyBkZWZhdWx0VGFibGVOYW1lUHJlZml4ID0gIGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9UQUJMRV9OQU1FX1BSRUZJWC5nZXRMb2NhbE5hbWUoKSk7Ci0JCXR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguc2V0VGV4dChkZWZhdWx0VGFibGVOYW1lUHJlZml4KTsJCi0JCXR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRUYWJsZU5hbWVQcmVmaXhNc2cpOwotCQl0eHREZWZhdWx0VGFibGVOYW1lUHJlZml4LmFkZE1vZGlmeUxpc3RlbmVyKG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXZhbGlkYXRlUGFnZSgpOwotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQkJCQotCQl9KTsJCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGlyZWN0RWRpdEFmZmVjdHNDbGFzc0NvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuQ0hFQ0spOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGlyZWN0RWRpdEFmZmVjdHNDbGFzcyk7Ci0JCWNoZWNrRGlyZWN0RWRpdEFmZmVjdHNDbGFzcy5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZGlyZWN0RWRpdEFmZmVjdHNDbGFzc1Rvb2x0aXApOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5UT1AsIGZhbHNlLCBmYWxzZSwgMiwgMSkpOwotCQkKLQkJYm9vbGVhbiBkZWZhdWx0RGlyZWN0RWRpdEFmZmVjdHNDbGFzcyA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfRElSRUNUX0VESVRfQUZGRUNUU19DTEFTUy5nZXRMb2NhbE5hbWUoKSkpOwotCQljaGVja0RpcmVjdEVkaXRBZmZlY3RzQ2xhc3Muc2V0U2VsZWN0aW9uKGRlZmF1bHREaXJlY3RFZGl0QWZmZWN0c0NsYXNzKTsKLQkJY2hlY2tEaXJlY3RFZGl0QWZmZWN0c0NsYXNzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9uZVRvTWFueU9sZFN0eWxlQ29udHJvbChDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWNoZWNrT25lVG9NYW55T2xkU3R5bGUgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuQ0hFQ0spOwotCQljaGVja09uZVRvTWFueU9sZFN0eWxlLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJvcGVydHlQYWdlX29uZVRvTWFueU9sZFN0eWxlKTsKLQkJY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5zZXRUb29sVGlwVGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcm9wZXJ0eVBhZ2Vfb25lVG9NYW55T2xkU3R5bGVUb29sdGlwKTsKLQkJY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULlRPUCwgZmFsc2UsIGZhbHNlLCAyLCAxKSk7Ci0JCQotCQlib29sZWFuIGRlZmF1bHREaXJlY3RFZGl0QWZmZWN0c0NsYXNzID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4oZWRpdG9yUHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUuZ2V0TG9jYWxOYW1lKCkpKTsKLQkJY2hlY2tPbmVUb01hbnlPbGRTdHlsZS5zZXRTZWxlY3Rpb24oZGVmYXVsdERpcmVjdEVkaXRBZmZlY3RzQ2xhc3MpOwotCQljaGVja09uZVRvTWFueU9sZFN0eWxlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsJCQkKLQl9Ci0JCi0JCi0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZURlZmF1bHRDb2xsZWN0aW9uVHlwZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlncm91cENvbGxlY3Rpb25UeXBlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgMCk7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfRGVmYXVsdENvbGxlY3Rpb25UeXBlU2VjdGlvblRpdHRsZSk7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0VG9vbFRpcFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX0RlZmF1bHRDb2xsZWN0aW9uVHlwZVNlY3Rpb25EZXNjcmlwdGlvbik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQotCQlHcmlkTGF5b3V0IGdsID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJZ2wubnVtQ29sdW1ucyA9IDE7Ci0JCWdyb3VwQ29sbGVjdGlvblR5cGUuc2V0TGF5b3V0KGdsKTsKLQkJCi0JCVN0cmluZyBkZWZhdWx0Q29sbGVjdGlvblR5cGUgPSBlZGl0b3JQcm9wcy5nZXRQcm9wZXJ0eShQUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQotCQljcmVhdGVDb2xsZWN0aW9uVHlwZUJ1dHRvbihjb21wb3NpdGUsIGdkLCBkZWZhdWx0Q29sbGVjdGlvblR5cGUpOwotCQljcmVhdGVMaXN0VHlwZUJ1dHRvbihjb21wb3NpdGUsIGdkLCBkZWZhdWx0Q29sbGVjdGlvblR5cGUpOwotCQljcmVhdGVTZXRUeXBlQnV0dG9uKGNvbXBvc2l0ZSwgZ2QsIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSk7Ci0JCWNyZWF0ZU1hcFR5cGVCdXR0b24oY29tcG9zaXRlLCBnZCwgZGVmYXVsdENvbGxlY3Rpb25UeXBlKTsKLQotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlQWNjZXNzVHlwZUNvbnRyb2woQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlncm91cEFjY2Vzc1R5cGUgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCAwKTsKLQkJZ3JvdXBBY2Nlc3NUeXBlLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUFjY2Vzc1R5cGVCdXR0b25Hcm91cExhYmVsKTsKLQkJZ3JvdXBBY2Nlc3NUeXBlLnNldFRvb2xUaXBUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZV9lbnRpdHlBY2Nlc3NUeXBlQnV0dG9uR3JvdXBUb29sdGlwKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ3JvdXBBY2Nlc3NUeXBlLnNldExheW91dERhdGEoZ2QpOwotCQkKLQkJR3JpZExheW91dCBnbCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdsLm51bUNvbHVtbnMgPSAxOwotCQlncm91cEFjY2Vzc1R5cGUuc2V0TGF5b3V0KGdsKTsKLQkJCi0JCVN0cmluZyBkZWZhdWx0QWNjZXNzVHlwZSA9IGVkaXRvclByb3BzLmdldFByb3BlcnR5KFBST1BfQUNDRVNTX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQkKLQkJY3JlYXRlRmllbGRBY2Nlc3NCdXR0b24oY29tcG9zaXRlLCBnZCwgZGVmYXVsdEFjY2Vzc1R5cGUpOwotCQljcmVhdGVQcm9wZXJ0eUFjY2Vzc0J1dHRvbihjb21wb3NpdGUsIGdkLCBkZWZhdWx0QWNjZXNzVHlwZSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb2xsZWN0aW9uVHlwZUJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkRGF0YSBnZCwgU3RyaW5nIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSkgewotCQlidG5Db2xsZWN0aW9uVHlwZSA9IG5ldyBCdXR0b24oZ3JvdXBDb2xsZWN0aW9uVHlwZSwgU1dULlJBRElPIHwgU1dULkZMQVQpOwotCQlidG5Db2xsZWN0aW9uVHlwZS5zZXRUZXh0KENPTExFQ1RJT05fVFlQRSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ0bkNvbGxlY3Rpb25UeXBlLnNldExheW91dERhdGEoZ2QpOwotCQlidG5Db2xsZWN0aW9uVHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0NPTExFQ1RJT05fVFlQRSkpOwotCQlidG5Db2xsZWN0aW9uVHlwZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcHJvcHNNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCQkKLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVMaXN0VHlwZUJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkRGF0YSBnZCwgU3RyaW5nIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSkgewotCQlidG5MaXN0VHlwZSA9IG5ldyBCdXR0b24oZ3JvdXBDb2xsZWN0aW9uVHlwZSwgU1dULlJBRElPIHwgU1dULkZMQVQpOwotCQlidG5MaXN0VHlwZS5zZXRUZXh0KExJU1RfVFlQRSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ0bkxpc3RUeXBlLnNldExheW91dERhdGEoZ2QpOwotCQlidG5MaXN0VHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0xJU1RfVFlQRSkpOwotCQlidG5MaXN0VHlwZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcHJvcHNNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkge30JCQkKLQkJfSk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVTZXRUeXBlQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWREYXRhIGdkLCBTdHJpbmcgZGVmYXVsdENvbGxlY3Rpb25UeXBlKSB7Ci0JCWJ0blNldFR5cGUgPSBuZXcgQnV0dG9uKGdyb3VwQ29sbGVjdGlvblR5cGUsIFNXVC5SQURJTyB8IFNXVC5GTEFUKTsKLQkJYnRuU2V0VHlwZS5zZXRUZXh0KFNFVF9UWVBFKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnRuU2V0VHlwZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYnRuU2V0VHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX1NFVF9UWVBFKSk7Ci0JCWJ0blNldFR5cGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXByb3BzTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHt9CQkJCi0JCX0pOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlTWFwVHlwZUJ1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkRGF0YSBnZCwgU3RyaW5nIGRlZmF1bHRDb2xsZWN0aW9uVHlwZSkgewotCQlidG5NYXBUeXBlID0gbmV3IEJ1dHRvbihncm91cENvbGxlY3Rpb25UeXBlLCBTV1QuUkFESU8gfCBTV1QuRkxBVCk7Ci0JCWJ0bk1hcFR5cGUuc2V0VGV4dChNQVBfVFlQRSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ0bk1hcFR5cGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJ0bk1hcFR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9NQVBfVFlQRSkpOwotCQlidG5NYXBUeXBlLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsKLQl9CQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVGaWVsZEFjY2Vzc0J1dHRvbihDb21wb3NpdGUgY29tcG9zaXRlLCBHcmlkRGF0YSBnZCwgU3RyaW5nIGRlZmF1bHRBY2Nlc3NUeXBlKSB7Ci0JCWJ0bkZpZWxkQmFzZWRBY2Nlc3MgPSBuZXcgQnV0dG9uKGdyb3VwQWNjZXNzVHlwZSwgU1dULlJBRElPIHwgU1dULkZMQVQpOwotCQlidG5GaWVsZEJhc2VkQWNjZXNzLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlX2VudGl0eUZpZWxkQmFzZWRBY2Nlc3NCdXR0b25MYWJlbCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWJ0bkZpZWxkQmFzZWRBY2Nlc3Muc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWJ0bkZpZWxkQmFzZWRBY2Nlc3Muc2V0U2VsZWN0aW9uKGRlZmF1bHRBY2Nlc3NUeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0FDQ0VTU19GSUVMRF9CQVNFRCkpOwotCQlidG5GaWVsZEJhc2VkQWNjZXNzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb3BlcnR5QWNjZXNzQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUsIEdyaWREYXRhIGdkLCBTdHJpbmcgZGVmYXVsdEFjY2Vzc1R5cGUpIHsKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2VzcyA9IG5ldyBCdXR0b24oZ3JvdXBBY2Nlc3NUeXBlLCBTV1QuUkFESU8gfCBTV1QuRkxBVCk7Ci0JCWJ0blByb3BlcnR5QmFzZWRBY2Nlc3Muc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VfZW50aXR5UHJvcGVydHlCYXNlZEFjY2Vzc0J1dHRvbkxhYmVsKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJYnRuUHJvcGVydHlCYXNlZEFjY2Vzcy5zZXRMYXlvdXREYXRhKGdkKTsJCi0JCWJ0blByb3BlcnR5QmFzZWRBY2Nlc3Muc2V0U2VsZWN0aW9uKGRlZmF1bHRBY2Nlc3NUeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0FDQ0VTU19QUk9QRVJUWV9CQVNFRCkpOwotCQlidG5Qcm9wZXJ0eUJhc2VkQWNjZXNzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwcm9wc01vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7fQkJCQotCQl9KTsJCQotCX0KLQkKLSAgICBwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JICAgIFN0cmluZyBkZWZhdWx0Rm9sZGVyID0gc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESUFHUkFNX0ZPTERFUik7Ci0JCXR4dERlZmF1bHRGb2xkZXJGaWVsZC5zZXRUZXh0KGRlZmF1bHRGb2xkZXIpOwkJCi0JICAgIFN0cmluZyBkZWZhdWx0UGFja2FnZU5hbWUgPSBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0VOVElUWV9QQUNLQUdFKTsKLQkJdHh0RGVmYXVsdEVudGl0eVBhY2thZ2VGaWVsZC5zZXRUZXh0KGRlZmF1bHRQYWNrYWdlTmFtZSk7CQkKLQkgICAgU3RyaW5nIGRlZmF1bHRUYWJsZU5hbWVQcmVmaXggPSAgc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9UQUJMRV9OQU1FX1BSRUZJWCk7Ci0JCXR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguc2V0VGV4dChkZWZhdWx0VGFibGVOYW1lUHJlZml4KTsJCSAgCi0JICAgIGJvb2xlYW4gZGVmYXVsdERpcmVjdEVkaXRBZmZlY3RzQ2xhc3MgPSBzdG9yZS5nZXRCb29sZWFuKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESVJFQ1RfRURJVF9DTEFTU19OQU1FKTsKLQkJY2hlY2tEaXJlY3RFZGl0QWZmZWN0c0NsYXNzLnNldFNlbGVjdGlvbihkZWZhdWx0RGlyZWN0RWRpdEFmZmVjdHNDbGFzcyk7Ci0JCVN0cmluZyBkZWZhdWx0QWNjZXNzVHlwZSA9IHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRU5USVRZX0FDQ0VTU19UWVBFKTsKLQkJYnRuRmllbGRCYXNlZEFjY2Vzcy5zZXRTZWxlY3Rpb24oZGVmYXVsdEFjY2Vzc1R5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX0ZJRUxEX0JBU0VEKSk7Ci0JCWJ0blByb3BlcnR5QmFzZWRBY2Nlc3Muc2V0U2VsZWN0aW9uKGRlZmF1bHRBY2Nlc3NUeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0FDQ0VTU19QUk9QRVJUWV9CQVNFRCkpOwkJCi0JCVN0cmluZyBkZWZhdWx0Q29sbGVjdGlvblR5cGUgPSBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RFRkFVTFRfQ09MTEVDVElPTl9UWVBFKTsKLQkJYnRuQ29sbGVjdGlvblR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9DT0xMRUNUSU9OX1RZUEUpKTsKLQkJYnRuTGlzdFR5cGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRDb2xsZWN0aW9uVHlwZS5lcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9MSVNUX1RZUEUpKTsJCQotCQlidG5TZXRUeXBlLnNldFNlbGVjdGlvbihkZWZhdWx0Q29sbGVjdGlvblR5cGUuZXF1YWxzKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfU0VUX1RZUEUpKTsKLQkJYnRuTWFwVHlwZS5zZXRTZWxlY3Rpb24oZGVmYXVsdENvbGxlY3Rpb25UeXBlLmVxdWFscyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX01BUF9UWVBFKSk7Ci0JICAgIGJvb2xlYW4gZGVmYXVsdE9uZVRvTWFueU9sZFN0eWxlID0gc3RvcmUuZ2V0Qm9vbGVhbihKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfT05FX1RPX01BTllfT0xEX1NUWUxFKTsKLQkgICAgaWYgKCFpc0pQQTEwUHJvamVjdCkKLQkgICAgCWNoZWNrT25lVG9NYW55T2xkU3R5bGUuc2V0U2VsZWN0aW9uKGRlZmF1bHRPbmVUb01hbnlPbGRTdHlsZSk7CQkKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0gICAgfQotICAgIAotICAgIHN5bmNocm9uaXplZCBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVBhZ2UoKSB7Ci0gICAgCUlTdGF0dXMgc3RhdEZvbGRlciA9IEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZS52YWxpZGF0ZURlZmF1bHRGb2xkZXIodHh0RGVmYXVsdEZvbGRlckZpZWxkLmdldFRleHQoKS50cmltKCksIAotICAgIAkJCQkJCQkJCQkJCQkJCQkJCXByb2plY3QuZ2V0TmFtZSgpKTsKLSAgICAJSVN0YXR1cyBzdGF0UGFjayA9IEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZS52YWxpZGF0ZURlZmF1bHRQYWNrYWdlKHR4dERlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0gICAgCUlTdGF0dXMgc3RhdFByZWYgPSBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UudmFsaWRhdGVUYWJsZU5hbWVQcmVmaXgodHh0RGVmYXVsdFRhYmxlTmFtZVByZWZpeC5nZXRUZXh0KCkudHJpbSgpKTsKLSAgICAJaWYgKHN0YXRGb2xkZXIuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0gICAgCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdEZvbGRlci5nZXRNZXNzYWdlKCkpOwotICAgIAkJc2V0VmFsaWQoZmFsc2UpOwotICAgIAkJcmV0dXJuOwotICAgIAl9ICAgIAkgICAgCQotICAgIAlpZiAoc3RhdFBhY2suZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSB7Ci0gICAgCQlzZXRFcnJvck1lc3NhZ2Uoc3RhdFBhY2suZ2V0TWVzc2FnZSgpKTsKLSAgICAJCXNldFZhbGlkKGZhbHNlKTsKLSAgICAJCXJldHVybjsKLSAgICAJfSAKLSAgICAJaWYgKHN0YXRQcmVmLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotICAgIAkJc2V0RXJyb3JNZXNzYWdlKHN0YXRQcmVmLmdldE1lc3NhZ2UoKSk7Ci0gICAgCQlzZXRWYWxpZChmYWxzZSk7Ci0gICAgCQlyZXR1cm47Ci0gICAgCX0KLSAgICAJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotICAgIAlzZXRWYWxpZCh0cnVlKTsKLSAgICAJaWYgKHN0YXRQYWNrLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5XQVJOSU5HKSB7ICAgCQkKLSAgICAJCXNldE1lc3NhZ2Uoc3RhdFBhY2suZ2V0TWVzc2FnZSgpLCBJTWVzc2FnZVByb3ZpZGVyLldBUk5JTkcpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgCWlmIChzdGF0UHJlZi5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuV0FSTklORykgeyAgIAkJCi0gICAgCQlzZXRNZXNzYWdlKHN0YXRQcmVmLmdldE1lc3NhZ2UoKSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLSAgICAJCXJldHVybjsKLSAgICAJfQotICAgIAlzZXRNZXNzYWdlKG51bGwsIElNZXNzYWdlUHJvdmlkZXIuTk9ORSk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLSAgICAJc2F2ZVNldHRpbmdzSWZNb2RpZmllZCgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0gICAgCXJldHVybiBzYXZlU2V0dGluZ3NJZk1vZGlmaWVkKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgYm9vbGVhbiBzYXZlU2V0dGluZ3NJZk1vZGlmaWVkKCkgewotICAgIAlpZiAocHJvcHNNb2RpZmllZCkgewotICAgIAkJYm9vbGVhbiBzYXZlZCA9IHNhdmVTZXR0aW5ncygpOwotICAgIAkJcHJvcHNNb2RpZmllZCA9ICFzYXZlZDsKLSAgICAJCXJldHVybiBzYXZlZDsKLSAgICAJfQotICAgIAlyZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHNhdmVTZXR0aW5ncygpIHsKLSAgICAJcHV0TmV3VmFsc0luUHJvcHMoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IChJUHJvamVjdClnZXRFbGVtZW50KCkuZ2V0QWRhcHRlcihJUHJvamVjdC5jbGFzcyk7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKFBST0pFQ1RfU0VUVElOR1NfUEFUSCk7Ci0JCUlGaWxlIHF1YXJ0ekRhdGFYTUxGaWxlID0gcHJvamVjdC5nZXRGaWxlKHBhdGgpOwkKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUocXVhcnR6RGF0YVhNTEZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQlPdXRwdXRTdHJlYW0gb3MgPSBudWxsOyAKLQkJdHJ5IHsKLQkJCW9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7IAotCQkJZWRpdG9yUHJvcHMuc3RvcmUob3MsICJUaGlzIGZpbGUgY29udGFpbnMgSlBBIERpYWdyYW0gRWRpdG9yIHNldHRpbmdzIik7CS8vJE5PTi1OTFMtMSQ7Ci0JCQlvcy5jbG9zZSgpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIAotCQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZV9lcnJTYXZlUHJvcHNNc2dUaXRsZSwgCi0JCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFEaWFncmFtUHJvcGVydHlQYWdlX2VyclNhdmVQcm9wc01zZ1RleHQpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCQotCXByaXZhdGUgdm9pZCBwdXROZXdWYWxzSW5Qcm9wcygpIHsKLQkJZWRpdG9yUHJvcHMucHV0KFBST1BfREVGQVVMVF9ESUFHUkFNX0ZPTERFUi5nZXRMb2NhbE5hbWUoKSwgdHh0RGVmYXVsdEZvbGRlckZpZWxkLmdldFRleHQoKS50cmltKCkpOwotCQllZGl0b3JQcm9wcy5wdXQoUFJPUF9ERUZBVUxUX1BBQ0tBR0UuZ2V0TG9jYWxOYW1lKCksIHR4dERlZmF1bHRFbnRpdHlQYWNrYWdlRmllbGQuZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCWVkaXRvclByb3BzLnB1dChQUk9QX0RFRkFVTFRfVEFCTEVfTkFNRV9QUkVGSVguZ2V0TG9jYWxOYW1lKCksIHR4dERlZmF1bHRUYWJsZU5hbWVQcmVmaXguZ2V0VGV4dCgpLnRyaW0oKSk7Ci0JCWVkaXRvclByb3BzLnB1dChQUk9QX0RJUkVDVF9FRElUX0FGRkVDVFNfQ0xBU1MuZ2V0TG9jYWxOYW1lKCksICIiICsgY2hlY2tEaXJlY3RFZGl0QWZmZWN0c0NsYXNzLmdldFNlbGVjdGlvbigpKTsJLy8kTk9OLU5MUy0xJDsKLQkJZWRpdG9yUHJvcHMucHV0KFBST1BfQUNDRVNTX1RZUEUuZ2V0TG9jYWxOYW1lKCksIGJ0bkZpZWxkQmFzZWRBY2Nlc3MuZ2V0U2VsZWN0aW9uKCkgPyBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0FDQ0VTU19GSUVMRF9CQVNFRCA6IEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9WQUxfQUNDRVNTX1BST1BFUlRZX0JBU0VEKTsJCQotCQllZGl0b3JQcm9wcy5wdXQoUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCksIGdldENvbGxlY3Rpb25Qcm9wZXJ0eSgpKTsKLQkJaWYgKCFpc0pQQTEwUHJvamVjdCkKLQkJCWVkaXRvclByb3BzLnB1dChQUk9QX09ORV9UT19NQU5ZX09MRF9TVFlMRS5nZXRMb2NhbE5hbWUoKSwgIiIgKyBjaGVja09uZVRvTWFueU9sZFN0eWxlLmdldFNlbGVjdGlvbigpKTsJLy8kTk9OLU5MUy0xJDsKLQl9Ci0JCi0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29sbGVjdGlvblByb3BlcnR5KCl7Ci0JCWlmIChidG5Db2xsZWN0aW9uVHlwZS5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX0NPTExFQ1RJT05fVFlQRTsKLQkJZWxzZSBpZiAoYnRuTGlzdFR5cGUuZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9MSVNUX1RZUEU7Ci0JCWVsc2UgaWYgKGJ0blNldFR5cGUuZ2V0U2VsZWN0aW9uKCkpCi0JCQlyZXR1cm4gSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9TRVRfVFlQRTsKLQkJZWxzZSBpZiAoYnRuTWFwVHlwZS5nZXRTZWxlY3Rpb24oKSkKLQkJCXJldHVybiBKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfVkFMX01BUF9UWVBFOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGNyZWF0ZURlZmF1bHRQcm9wcygpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wcyhzdG9yZSk7Ci0JfQotCQotCXN0YXRpYyBwcml2YXRlIFByb3BlcnRpZXMgY3JlYXRlRGVmYXVsdFByb3BzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJUHJvcGVydGllcyBlZGl0b3JEZWZhdWx0UHJvcHMgPSBuZXcgUHJvcGVydGllcygpOyAKLQkJZWRpdG9yRGVmYXVsdFByb3BzLnNldFByb3BlcnR5KFBST1BfREVGQVVMVF9ESUFHUkFNX0ZPTERFUi5nZXRMb2NhbE5hbWUoKSwgc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESUFHUkFNX0ZPTERFUikpOwkJCi0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0RFRkFVTFRfUEFDS0FHRS5nZXRMb2NhbE5hbWUoKSwgc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfUEFDS0FHRSkpOwotCQllZGl0b3JEZWZhdWx0UHJvcHMuc2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX1RBQkxFX05BTUVfUFJFRklYLmdldExvY2FsTmFtZSgpLCBzdG9yZS5nZXRTdHJpbmcoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1RBQkxFX05BTUVfUFJFRklYKSk7Ci0JCWVkaXRvckRlZmF1bHRQcm9wcy5zZXRQcm9wZXJ0eShQUk9QX0RJUkVDVF9FRElUX0FGRkVDVFNfQ0xBU1MuZ2V0TG9jYWxOYW1lKCksICIiICsgc3RvcmUuZ2V0Qm9vbGVhbihKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRElSRUNUX0VESVRfQ0xBU1NfTkFNRSkpOwkvLyROT04tTkxTLTEkOwotCQllZGl0b3JEZWZhdWx0UHJvcHMuc2V0UHJvcGVydHkoUFJPUF9BQ0NFU1NfVFlQRS5nZXRMb2NhbE5hbWUoKSwgc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfQUNDRVNTX1RZUEUpKTsJCQotCQllZGl0b3JEZWZhdWx0UHJvcHMuc2V0UHJvcGVydHkoUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCksIHN0b3JlLmdldFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfREVGQVVMVF9DT0xMRUNUSU9OX1RZUEUpKTsKLQkJZWRpdG9yRGVmYXVsdFByb3BzLnNldFByb3BlcnR5KFBST1BfT05FX1RPX01BTllfT0xEX1NUWUxFLmdldExvY2FsTmFtZSgpLCAiIiArIHN0b3JlLmdldEJvb2xlYW4oSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX09ORV9UT19NQU5ZX09MRF9TVFlMRSkpOwkvLyROT04tTkxTLTEkOwotCQkKLQkJCi0JCXJldHVybiBlZGl0b3JEZWZhdWx0UHJvcHM7Ci0JfQotCi0JCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcm9wZXJ0aWVzKCkgewotCQlQcm9wZXJ0aWVzIGRlZmF1bHRQcm9wcyA9IGNyZWF0ZURlZmF1bHRQcm9wcygpOwotCQllZGl0b3JQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKGRlZmF1bHRQcm9wcyk7Ci0JCQotCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KWdldEVsZW1lbnQoKS5nZXRBZGFwdGVyKElQcm9qZWN0LmNsYXNzKTsKLQkJUGF0aCBwYXRoID0gbmV3IFBhdGgoUFJPSkVDVF9TRVRUSU5HU19QQVRIKTsKLQkJSUZpbGUgZWRpdG9yUHJvamVjdFByb3BlcnRpZXMgPSBwcm9qZWN0LmdldEZpbGUocGF0aCk7Ci0JCQotCQlGaWxlIHByb3BlcnRpZXNGaWxlID0gbmV3IEZpbGUoZWRpdG9yUHJvamVjdFByb3BlcnRpZXMuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCkpOwotCQlpZiAocHJvcGVydGllc0ZpbGUuZXhpc3RzKCkpIHsKLQkJCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHByb3BlcnRpZXNGaWxlKTsKLQkJCQllZGl0b3JQcm9wcy5sb2FkKGlzKTsJCi0JCQkJaXMuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCX0KLQkKLQlzdGF0aWMgcHVibGljIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoSVByb2plY3QgcHJvamVjdCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCVByb3BlcnRpZXMgZGVmYXVsdFByb3BzID0gY3JlYXRlRGVmYXVsdFByb3BzKHN0b3JlKTsKLQkJUHJvcGVydGllcyBlZGl0b3JQcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKGRlZmF1bHRQcm9wcyk7Ci0JCQotCQlQYXRoIHBhdGggPSBuZXcgUGF0aChQUk9KRUNUX1NFVFRJTkdTX1BBVEgpOwotCQlJRmlsZSBlZGl0b3JQcm9qZWN0UHJvcGVydGllcyA9IHByb2plY3QuZ2V0RmlsZShwYXRoKTsKLQkJCi0JCUZpbGUgcHJvcGVydGllc0ZpbGUgPSBuZXcgRmlsZShlZGl0b3JQcm9qZWN0UHJvcGVydGllcy5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCWlmIChwcm9wZXJ0aWVzRmlsZS5leGlzdHMoKSkgewotCQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocHJvcGVydGllc0ZpbGUpOwotCQkJCWVkaXRvclByb3BzLmxvYWQoaXMpOwkKLQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBlZGl0b3JQcm9wczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdEZvbGRlcihJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlyZXR1cm4gZ2V0RGVmYXVsdEZvbGRlcihwcm9qZWN0LCBwcm9wcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRQYWNrYWdlKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCXJldHVybiBnZXREZWZhdWx0UGFja2FnZShwcm9qZWN0LCBwcm9wcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRUYWJsZVByZWZpeE5hbWUoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGdldERlZmF1bHRUYWJsZVByZWZpeE5hbWUocHJvamVjdCwgcHJvcHMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZG9lc0RpcmVjdGVFZGl0aW5nQWZmZWN0Q2xhc3NOYW1lQnlEZWZhdWx0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCXJldHVybiBkb2VzRGlyZWN0ZUVkaXRpbmdBZmZlY3RDbGFzc05hbWVCeURlZmF1bHQocHJvamVjdCwgcHJvcHMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBY2Nlc3NGaWVsZEJhc2VkKElQcm9qZWN0IHByb2plY3QpIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCXJldHVybiBpc0FjY2Vzc0ZpZWxkQmFzZWQocHJvamVjdCwgcHJvcHMpOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29sbGVjdGlvblR5cGUoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGlzQ29sbGVjdGlvblR5cGUocHJvamVjdCwgcHJvcHMpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMaXN0VHlwZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlyZXR1cm4gaXNMaXN0VHlwZShwcm9qZWN0LCBwcm9wcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NldFR5cGUoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGlzU2V0VHlwZShwcm9qZWN0LCBwcm9wcyk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hcFR5cGUoSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkJcmV0dXJuIGlzTWFwVHlwZShwcm9qZWN0LCBwcm9wcyk7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkT25lVG9NYW55VW5pZGlyQmVPbGRTdHlsZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCQlyZXR1cm4gc2hvdWxkT25lVG9NYW55VW5pZGlyQmVPbGRTdHlsZShwcm9qZWN0LCBwcm9wcyk7Ci0JfQkKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERlZmF1bHRGb2xkZXIoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX0RJQUdSQU1fRk9MREVSLmdldExvY2FsTmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhY2thZ2UoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ERUZBVUxUX1BBQ0tBR0UuZ2V0TG9jYWxOYW1lKCkpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZWZhdWx0VGFibGVQcmVmaXhOYW1lKElQcm9qZWN0IHByb2plY3QsIFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJcmV0dXJuIHByb3BzLmdldFByb3BlcnR5KFBST1BfREVGQVVMVF9UQUJMRV9OQU1FX1BSRUZJWC5nZXRMb2NhbE5hbWUoKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkb2VzRGlyZWN0ZUVkaXRpbmdBZmZlY3RDbGFzc05hbWVCeURlZmF1bHQoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9ESVJFQ1RfRURJVF9BRkZFQ1RTX0NMQVNTLmdldExvY2FsTmFtZSgpKSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjY2Vzc0ZpZWxkQmFzZWQoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlTdHJpbmcgYWNjZXNzVHlwZSA9IHByb3BzLmdldFByb3BlcnR5KFBST1BfQUNDRVNTX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQlyZXR1cm4gYWNjZXNzVHlwZS5lcXVhbHMoImZpZWxkIik7CS8vJE5PTi1OTFMtMSQ7Ci0JfQkKLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uVHlwZShJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCVN0cmluZyBhY2Nlc3NUeXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQlyZXR1cm4gYWNjZXNzVHlwZS5lcXVhbHMoImNvbGxlY3Rpb24iKTsJLy8kTk9OLU5MUy0xJDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGlzdFR5cGUoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlTdHJpbmcgYWNjZXNzVHlwZSA9IHByb3BzLmdldFByb3BlcnR5KFBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpKTsKLQkJcmV0dXJuIGFjY2Vzc1R5cGUuZXF1YWxzKCJsaXN0Iik7CS8vJE5PTi1OTFMtMSQ7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NldFR5cGUoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlTdHJpbmcgYWNjZXNzVHlwZSA9IHByb3BzLmdldFByb3BlcnR5KFBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpKTsKLQkJcmV0dXJuIGFjY2Vzc1R5cGUuZXF1YWxzKCJzZXQiKTsJLy8kTk9OLU5MUy0xJDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTWFwVHlwZShJUHJvamVjdCBwcm9qZWN0LCBQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCVN0cmluZyBhY2Nlc3NUeXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCkpOwotCQlyZXR1cm4gYWNjZXNzVHlwZS5lcXVhbHMoIm1hcCIpOwkvLyROT04tTkxTLTEkOwotCX0JCi0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNob3VsZE9uZVRvTWFueVVuaWRpckJlT2xkU3R5bGUoSVByb2plY3QgcHJvamVjdCwgUHJvcGVydGllcyBwcm9wcykgewotCQlyZXR1cm4gQm9vbGVhbi5wYXJzZUJvb2xlYW4ocHJvcHMuZ2V0UHJvcGVydHkoUFJPUF9PTkVfVE9fTUFOWV9PTERfU1RZTEUuZ2V0TG9jYWxOYW1lKCkpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm9wZXJ0eXRlc3Rlci9KcGFQcm9qZWN0RmFjZXRWZXJzaW9uUHJvcGVydHlUZXN0ZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm9wZXJ0eXRlc3Rlci9KcGFQcm9qZWN0RmFjZXRWZXJzaW9uUHJvcGVydHlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZhMDBmMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvcGVydHl0ZXN0ZXIvSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5dGVzdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5Qcm9wZXJ0eVRlc3RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotCi1wdWJsaWMgY2xhc3MgSnBhUHJvamVjdEZhY2V0VmVyc2lvblByb3BlcnR5VGVzdGVyIGV4dGVuZHMgUHJvcGVydHlUZXN0ZXJ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJqcHQuanBhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSVByb2plY3RGYWNldCBGQUNFVCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJRCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLAotCQkJT2JqZWN0IHZhbHVlKSB7Ci0JCQotCQlTdHJpbmdbXSBzdWJWYWx1ZXMgPSAoKFN0cmluZykgdmFsdWUpLnNwbGl0KCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlY2VpdmVySWQgPSBzdWJWYWx1ZXNbMF07Ci0KLQkJaWYgKHJlY2VpdmVyIGluc3RhbmNlb2YgSnBhTm9kZSkgewotCQkJaWYocmVjZWl2ZXJJZC5lcXVhbHMoSUQpKXsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0JCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9BZGRFbnRpdHlDb250ZXh0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvQWRkRW50aXR5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc0ZDlhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9BZGRFbnRpdHlDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBQZXR5YSBTYWJldmEgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFkZEVudGl0eUNvbnRleHQgZXh0ZW5kcyBBZGRDb250ZXh0IGltcGxlbWVudHMgSUFkZEVudGl0eUNvbnRleHR7Ci0JcHJpdmF0ZSBib29sZWFuIHByaW1hcnlDb2xsYXBzZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIHJlbGF0aW9uQ29sbGFwc2VkOwotCXByaXZhdGUgYm9vbGVhbiBiYXNpY0NvbGxhcHNlZDsKLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnlDb2xsYXBzZWQoKSB7Ci0JCXJldHVybiBwcmltYXJ5Q29sbGFwc2VkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRQcmltYXJ5Q29sbGFwc2VkKGJvb2xlYW4gcHJpbWFyeUNvbGxhcHNlZCkgewotCQl0aGlzLnByaW1hcnlDb2xsYXBzZWQgPSBwcmltYXJ5Q29sbGFwc2VkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25Db2xsYXBzZWQoKSB7Ci0JCXJldHVybiByZWxhdGlvbkNvbGxhcHNlZDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0UmVsYXRpb25Db2xsYXBzZWQoYm9vbGVhbiByZWxhdGlvbkNvbGxhcHNlZCkgewotCQl0aGlzLnJlbGF0aW9uQ29sbGFwc2VkID0gcmVsYXRpb25Db2xsYXBzZWQ7Ci0JfQotCi0JcHVibGljIEFkZEVudGl0eUNvbnRleHQoYm9vbGVhbiBwcmltYXJ5Q29sbGFwc2VkLAotCQkJYm9vbGVhbiByZWxhdGlvbkNvbGxhcHNlZCwgYm9vbGVhbiBiYXNpY0NvbGxhcHNlZCkgewotCQlzdXBlcigpOwotCQl0aGlzLnByaW1hcnlDb2xsYXBzZWQgPSBwcmltYXJ5Q29sbGFwc2VkOwotCQl0aGlzLnJlbGF0aW9uQ29sbGFwc2VkID0gcmVsYXRpb25Db2xsYXBzZWQ7Ci0JCXRoaXMuYmFzaWNDb2xsYXBzZWQgPSBiYXNpY0NvbGxhcHNlZDsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNCYXNpY0NvbGxhcHNlZCgpIHsKLQkJcmV0dXJuIGJhc2ljQ29sbGFwc2VkOwotCX0KLQlwdWJsaWMgdm9pZCBzZXRCYXNpY0NvbGxhcHNlZChib29sZWFuIGJhc2ljQ29sbGFwc2VkKSB7Ci0JCXRoaXMuYmFzaWNDb2xsYXBzZWQgPSBiYXNpY0NvbGxhcHNlZDsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSUFkZEVudGl0eUNvbnRleHQuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JQWRkRW50aXR5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmQxN2M1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JQWRkRW50aXR5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgUGV0eWEgU2FiZXZhIC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBZGRFbnRpdHlDb250ZXh0IHsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUHJpbWFyeUNvbGxhcHNlZCgpOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZWxhdGlvbkNvbGxhcHNlZCgpOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNCYXNpY0NvbGxhcHNlZCgpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0lKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NWJiYzIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0lKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRGVsZXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLklDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuSU1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxEaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSVBlU2VydmljZVV0aWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGV4dGVuZHMgSUZlYXR1cmVQcm92aWRlcnsKLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBoYXNPYmplY3RXaXRoTmFtZShTdHJpbmcgbmFtZSk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleUZvckJ1c2luZXNzT2JqZWN0KE9iamVjdCBibyk7Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KTsKLQkKLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5LCBib29sZWFuIHNhdmUpOwkKLQotCXB1YmxpYyBJUmVsYXRpb24gZ2V0UmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKTsKLQkKLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUganB0MSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIpOwotCi0JcHVibGljIE9iamVjdCBnZXRCdXNpbmVzc09iamVjdEZvcktleShTdHJpbmcga2V5KTsKLQotCXB1YmxpYyB2b2lkIGFkZEpQVEZvclVwZGF0ZShTdHJpbmcganB0TmFtZSk7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBkb2VzUmVsYXRpb25FeGlzdChKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsIAotCQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSwKLQkJCVJlbFR5cGUgcmVsVHlwZSwgCi0JCQlSZWxEaXIgcmVsRGlyKTsKLSAgICAKLQlwdWJsaWMgdm9pZCByZXN0b3JlRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpOwotCQotCXB1YmxpYyB2b2lkIGFkZFJlbW92ZUlnbm9yZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXROYW1lKTsKLQkKLQlwdWJsaWMgdm9pZCBhZGRBZGRJZ25vcmUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGF0TmFtZSk7Ci0JCi0gICAgcHVibGljIHZvaWQgcHV0S2V5VG9CdXNpbmVzc09iamVjdChTdHJpbmcga2V5LCBPYmplY3QgYm8pOwotICAgIAotCXB1YmxpYyBpbnQgZ2V0QXR0cmlic051bShTaGFwZSBzaCk7ICAgIAotICAgIAotCXB1YmxpYyBpbnQgaW5jcmVhc2VBdHRyaWJzTnVtKFNoYXBlIHNoKTsKLQkKLQlwdWJsaWMgaW50IGRlY3JlYXNlQXR0cmlic051bShTaGFwZSBzaCk7Ci0JCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvbGRBdCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXQpOwotICAgIAkKLQlwdWJsaWMgdm9pZCByZW5ld0F0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5TGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKTsKLQotCXB1YmxpYyBJUGVTZXJ2aWNlVXRpbCBnZXRQZVV0aWwoKTsKLQkKLQlwdWJsaWMgSUpQQUVkaXRvclV0aWwgZ2V0SlBBRWRpdG9yVXRpbCgpOwotCi0JcHVibGljIElEZWxldGVGZWF0dXJlIGdldERlbGV0ZUZlYXR1cmUoSURlbGV0ZUNvbnRleHQgY29udGV4dCk7Ci0JCi0JcHVibGljIElDdXN0b21GZWF0dXJlIGdldEFkZEFsbEVudGl0aWVzRmVhdHVyZSgpOwotCQotCXB1YmxpYyBJTW9kZWxJbnRlZ3JhdGlvblV0aWwgZ2V0TW9pbkludGVncmF0aW9uVXRpbCgpOwotCQotCXB1YmxpYyBJR3JhcGhpY3NVcGRhdGVyIGdldEdyYXBoaWNzVXBkYXRlcigpOwotCi0JcHVibGljIHZvaWQgYWRkQXR0cmliRm9yVXBkYXRlKFBlcnNpc3RlbmNlVW5pdCBwdSwgU3RyaW5nIGVudEF0TWFwcGVkQnkpOwotCQotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbigpOwotCQotCXB1YmxpYyBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKElQcm9qZWN0IHByb2plY3QpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0lKUEFFZGl0b3JJbWFnZUNyZWF0b3IuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNWQ1NzUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0lKUEFFZGl0b3JJbWFnZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLQotcHVibGljIGludGVyZmFjZSBJSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIHsKLQkKLQlzdGF0aWMgcHVibGljIGVudW0gUmVsRW5kRGlyIHsKLQkJVVAsCi0JCUxFRlQsCi0JCVJJR0hULAotCQlET1dOCi0JfQotCi0JcHVibGljIFBvbHlsaW5lIGNyZWF0ZUNvbm5lY3Rpb25MaW5lKERpYWdyYW0gZCwgQ29ubmVjdGlvbiBjb25uZWN0aW9uKTsKLQotCS8vcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlVGV4dENvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKTsKLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZUFycm93Q29ubmVjdGlvbkRlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbik7Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVNYW55RW5kV2l0aEFycm93RGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKTsKLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZU1hbnlTdGFydERlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbik7Ci0JCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueUVuZERlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbik7Ci0KLQlwdWJsaWMgQ29ubmVjdGlvbkRlY29yYXRvciBjcmVhdGVJY29uQ29ubmVjdGlvbkRlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBpY29uSWQsIGRvdWJsZSBsb2NhdGlvbik7Ci0JCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKERpYWdyYW0gZCwgQ29ubmVjdGlvbiBjLCBTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKTsKLQkKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTVmOWIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdlZi5FZGl0UGFydFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYudWkuYWN0aW9ucy5BY3Rpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5lZGl0b3IuRGlhZ3JhbUVkaXRvckNvbnRleHRNZW51UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuaW50ZXJuYWwuY29uZmlnLklDb25maWd1cmF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlciBleHRlbmRzIERpYWdyYW1FZGl0b3JDb250ZXh0TWVudVByb3ZpZGVyIHsKLQlwdWJsaWMgSlBBRWRpdG9yQ29udGV4dE1lbnVQcm92aWRlcihFZGl0UGFydFZpZXdlciB2aWV3ZXIsIAotCQkJCQkJCQkJCUFjdGlvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCAKLQkJCQkJCQkJCQlJQ29uZmlndXJhdGlvblByb3ZpZGVyIGNvbmZpZ3VyYXRpb25Qcm92aWRlcikgewotCQlzdXBlcih2aWV3ZXIsIHJlZ2lzdHJ5LCBjb25maWd1cmF0aW9uUHJvdmlkZXIpOwotCX0KLQkJCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREZWZhdWx0TWVudUdyb3VwRWRpdChJTWVudU1hbmFnZXIgbWFuYWdlciwgUG9pbnQgbWVudUxvY2F0aW9uKSB7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEFjdGlvblRvTWVudUlmQXZhaWxhYmxlKElNZW51TWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgYWN0aW9uSWQsIFN0cmluZyBtZW51R3JvdXApIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscygicHJlZGVmaW5lZCByZW1vdmUgYWN0aW9uIikgfHwJLy8kTk9OLU5MUy0xJAotCQkJYWN0aW9uSWQuZXF1YWxzKCJwcmVkZWZpbmVkIHVwZGF0ZSBhY3Rpb24iKSkgCS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJc3VwZXIuYWRkQWN0aW9uVG9NZW51SWZBdmFpbGFibGUobWFuYWdlciwgYWN0aW9uSWQsIG1lbnVHcm91cCk7Ci0JfQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OTI2NWQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlJlY29yZGluZ0NvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi51dGlsLlRyYW5zYWN0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5BYnN0cmFjdERpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBsYXRmb3JtLklEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklUb29sQmVoYXZpb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZS5FY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkQWxsRW50aXRpZXNGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZVJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkVudGl0aWVzQ29vcmRpbmF0ZXNYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFDaGVja1N1bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQVNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLlNpemVQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBleHRlbmRzIEFic3RyYWN0RGlhZ3JhbVR5cGVQcm92aWRlciB7Ci0JCi0JcHJpdmF0ZSBJVG9vbEJlaGF2aW9yUHJvdmlkZXJbXSB0b29sQmVoYXZpb3JQcm92aWRlcnM7Ci0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLSAgICBib29sZWFuIGlzRGlzcG9zZWQgPSBmYWxzZTsKLSAgICBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JCi0gICAgcHVibGljIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIoKSB7Ci0gICAgCUlGZWF0dXJlUHJvdmlkZXIgZnAgPSBuZXcgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyKHRoaXMsIG5ldyBKUEFTb2x2ZXIoKSk7Ci0gICAgICAgIHNldEZlYXR1cmVQcm92aWRlcihmcCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChEaWFncmFtIGRpYWdyYW0sIElEaWFncmFtRWRpdG9yIGRpYWdyYW1FZGl0b3IpIHsKLSAgICAJc3VwZXIuaW5pdChkaWFncmFtLCBkaWFncmFtRWRpdG9yKTsKLSAgICAJaWYgKGdldFRhcmdldEpQQVByb2plY3QoKSA9PSBudWxsKQotICAgIAkJY2xvc2VFZGl0b3IoKTsKLSAgICAJSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlciBwcm92aWRlciA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb3ZpZGVyQnlEaWFncmFtKGRpYWdyYW0uZ2V0TmFtZSgpKTsKLSAgICAJaWYgKChwcm92aWRlciAhPSBudWxsKSAmJiBwcm92aWRlci5pc0FsaXZlKCkpIAotICAgIAkJcHJvdmlkZXIuZ2V0RGlhZ3JhbUVkaXRvcigpLmdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCkuY2xvc2VFZGl0b3IocHJvdmlkZXIuZ2V0RGlhZ3JhbUVkaXRvcigpLCB0cnVlKTsKLQl9Ci0gICAgCi0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElUb29sQmVoYXZpb3JQcm92aWRlcltdIGdldEF2YWlsYWJsZVRvb2xCZWhhdmlvclByb3ZpZGVycygpIHsKLSAgICAgICAgaWYgKHRvb2xCZWhhdmlvclByb3ZpZGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0b29sQmVoYXZpb3JQcm92aWRlcnMgPQotICAgICAgICAgICAgICAgIG5ldyBJVG9vbEJlaGF2aW9yUHJvdmlkZXJbXSB7IG5ldyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcih0aGlzLCBFY2xpcHNlRmFjYWRlLklOU1RBTkNFKSB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0b29sQmVoYXZpb3JQcm92aWRlcnM7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotCXB1YmxpYyBKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotICAgIAlyZXR1cm4gKEpQQUVkaXRvckZlYXR1cmVQcm92aWRlcilzdXBlci5nZXRGZWF0dXJlUHJvdmlkZXIoKTsKLSAgICB9Ci0gICAgCi0JQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLQlwdWJsaWMgYm9vbGVhbiBoYXNUb0FkZCgpIHsKLQkJSnBhUHJvamVjdCBwcm9qZWN0ID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQlQZXJzaXN0ZW5jZVVuaXQgdW5pdCA9IHByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS4KLQkJCQkJCQkJZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCQotCQlmb3IgKENsYXNzUmVmIGNsYXNzUmVmIDogdW5pdC5nZXRDbGFzc1JlZnMoKSkgewotCQkJaWYgKGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpICE9IG51bGwpIHsgCi0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IGNsYXNzUmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOyAKLQkJCQlpZiAoanB0LmdldE1hcHBpbmdLZXkoKSA9PSBNYXBwaW5nS2V5cy5FTlRJVFlfVFlQRV9NQVBQSU5HX0tFWSkgewotCQkJCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZ2V0RmVhdHVyZVByb3ZpZGVyKCkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQkJCWlmIChwZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIHRydWU7CQkJCQkKLQkJCQl9Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotICAgICAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLQlwdWJsaWMgCXZvaWQgcG9zdEluaXQoKSB7Ci0gICAgCWZpbmFsIFN0cmluZyBqcHROYW1lID0gZ2V0RGlhZ3JhbUVkaXRvcigpLmdldFBhcnRQcm9wZXJ0eShKUEFFZGl0b3JDb25zdGFudHMuT1BFTl9XSE9MRV9QRVJTSVNURU5DRV9VTklUX0VESVRPUl9QUk9QRVJUWSk7Ci0JCWlmIChqcHROYW1lICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gaGFzVG9BZGQgPSBoYXNUb0FkZCgpOyAKLQkJCWJvb2xlYW4gcmVhZE9ubHkgPSBvcGVuUGVyc2lzdGVkRGlhZ3JhbShoYXNUb0FkZCk7Ci0JCQlpZiAoaGFzVG9BZGQgJiYgIXJlYWRPbmx5KQotCQkJYWRkUmVtYWluaW5nRW50aXRpZXMoKTsKLQkJfSBlbHNlCi0JCQl0cnkgewotCQkJCW9wZW5QZXJzaXN0ZWREaWFncmFtKGZhbHNlKTsKLQkJCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGRSZW1haW5pbmdFbnRpdGllcygpIHsKLQkJZmluYWwgQWRkQWxsRW50aXRpZXNGZWF0dXJlIGZlYXR1cmUgPSBuZXcgQWRkQWxsRW50aXRpZXNGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJZmluYWwgQ3VzdG9tQ29udGV4dCBjb250ZXh0ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4oZmVhdHVyZS5nZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQlmZWF0dXJlLmV4ZWN1dGUoY29udGV4dCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotICAgIHByaXZhdGUgdm9pZCBjbG9zZUVkaXRvcigpIHsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7CQkJCQkKLQkJCQlwYWdlLmNsb3NlRWRpdG9yKGdldERpYWdyYW1FZGl0b3IoKSwgZmFsc2UpOwotCQkJfQotCQl9KTsgICAgCQotICAgIH0KLSAgICAKLQlwcml2YXRlIGJvb2xlYW4gb3BlblBlcnNpc3RlZERpYWdyYW0oYm9vbGVhbiBoYXNUb0FkZCkgewkKLQkJZmluYWwgSnBhUHJvamVjdCBwcm9qID0gZ2V0VGFyZ2V0SlBBUHJvamVjdCgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gcHJvai5nZXRQcm9qZWN0KCk7Ci0JCWZpbmFsIERpYWdyYW0gZGlhZ3JhbSA9IGdldERpYWdyYW0oKTsKLQkJTW9kZWxJbnRlZ3JhdGlvblV0aWwucHV0UHJvamVjdFRvRGlhZ3JhbShwcm9qZWN0LCBkaWFncmFtKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KHByb2opOwotCQlTdHJpbmcgZGlhZ3JhbU5hbWUgPSBwdS5nZXROYW1lKCk7Ci0JICAgIElQYXRoIHBhdGggPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXREaWFncmFtc0ZvbGRlclBhdGgocHJvamVjdCkuYXBwZW5kKGRpYWdyYW1OYW1lKS5hZGRGaWxlRXh0ZW5zaW9uKE1vZGVsSW50ZWdyYXRpb25VdGlsLkRJQUdSQU1fRklMRV9FWFRFTlNJT04pOwotCQlmaW5hbCBJRmlsZSBmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQlib29sZWFuIHJlYWRPbmx5ID0gKGYgIT0gbnVsbCkgJiYgZi5leGlzdHMoKSAmJiBmLmlzUmVhZE9ubHkoKTsKLQkJaWYgKHJlYWRPbmx5KSB7Ci0JCQlpZiAoSlBBQ2hlY2tTdW0uSU5TVEFOQ0UoKS5pc01vZGVsRGlmZmVyZW50RnJvbURpYWdyYW0oZGlhZ3JhbSwgcHJvaikgfHwgaGFzVG9BZGQpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IGhhc1RvQWRkID8gSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9KUEFEaWFncmFtUmVhZE9ubHlIYXNUb0FkZE1zZyA6IAotCQkJCQkJCQlKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX0pQQURpYWdyYW1SZWFkT25seU1zZzsKLQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCUpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXJfSlBBRGlhZ3JhbVJlYWRPbmx5VGl0bGUsIG51bGwsIG1lc3NhZ2UsCi0JCQkJCQlNZXNzYWdlRGlhbG9nLklORk9STUFUSU9OLCBuZXcgU3RyaW5nW10ge0pQQUVkaXRvck1lc3NhZ2VzLkJUTl9PSywgSlBBRWRpdG9yTWVzc2FnZXMuQlROX0NBTkNFTH0sIDApIHsKLQkJCQkJQE92ZXJyaWRlCi0JCQkJCXByb3RlY3RlZCBpbnQgZ2V0U2hlbGxTdHlsZSgpIHsKLQkJCQkJCXJldHVybiBTV1QuVElUTEUgfCBTV1QuQk9SREVSCi0JCQkJCQkJfCBTV1QuQVBQTElDQVRJT05fTU9EQUwKLQkJCQkJCQl8IGdldERlZmF1bHRPcmllbnRhdGlvbigpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlpZiAoZGlhbG9nLm9wZW4oKSA9PSAxKSB7Ci0JCQkJCWNsb3NlRWRpdG9yKCk7CQkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0YXR1cyBzdGF0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnZhbGlkYXRlRWRpdChuZXcgSUZpbGVbXXtmfSwgbnVsbCk7Ci0JCQkJCWlmICghc3RhdC5pc09LKCkpIHsKLQkJCQkJCW1lc3NhZ2UgPSBOTFMuYmluZChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyX2NhbnRNYWtlRGlhZ3JhbVdyaXRhYmxlTXNnLCAKLQkJCQkJCQkJc3RhdC5nZXRNZXNzYWdlKCkpOzsKLQkJCQkJCWRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSwKLQkJCQkJCQkJSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcl9jYW50TWFrZURpYWdyYW1Xcml0YWJsZVRpdGxlLCBudWxsLCBtZXNzYWdlLAotCQkJCQkJCQlNZXNzYWdlRGlhbG9nLkNBTkNFTCwgbmV3IFN0cmluZ1tdIHtKUEFFZGl0b3JNZXNzYWdlcy5CVE5fT0t9LCAwKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIGludCBnZXRTaGVsbFN0eWxlKCkgewotCQkJCQkJCQlyZXR1cm4gU1dULkNMT1NFIHwgU1dULlRJVExFIHwgU1dULkJPUkRFUgotCQkJCQkJCQkJfCBTV1QuQVBQTElDQVRJT05fTU9EQUwKLQkJCQkJCQkJCXwgZ2V0RGVmYXVsdE9yaWVudGF0aW9uKCk7Ci0JCQkJCQkJfQotCQkJCQkJfTsKLQkJCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCQljbG9zZUVkaXRvcigpOwkJCQkJCQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZWFkT25seSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gcmVhZE9ubHk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJlbW92ZUNvbm5lY3Rpb25zKCk7Ci0JCQotCQlmaW5hbCBIYXNodGFibGU8U3RyaW5nLCBTaXplUG9zaXRpb24+IG1hcmtzID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIFNpemVQb3NpdGlvbj4oKTsgCQkJCQotCQlFbnRpdGllc0Nvb3JkaW5hdGVzWE1MIHhtbCA9IG5ldyBFbnRpdGllc0Nvb3JkaW5hdGVzWE1MKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJeG1sLmxvYWQobWFya3MpOwotCQl4bWwuY2xlYW4oKTsKLQkJCQkKLQkJTGlzdDxTaGFwZT4gcGljdHMgPSBkaWFncmFtLmdldENoaWxkcmVuKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHBpY3RzLml0ZXJhdG9yKCk7Ci0JCUhhc2hTZXQ8U2hhcGU+IHRvRGVsZXRlID0gbmV3IEhhc2hTZXQ8U2hhcGU+KCk7Ci0JCS8vIGNvbGxlY3RpbmcgZGF0YSBmcm9tIHRoZSBzYXZlZCBwaWN0b2dyYW1zCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHBpY3QgPSBpdC5uZXh0KCk7Ci0JCQl0b0RlbGV0ZS5hZGQocGljdCk7Ci0JCX0KLQkJCi0JCWZpbmFsIEl0ZXJhdG9yPFNoYXBlPiBpdGVyID0gdG9EZWxldGUuaXRlcmF0b3IoKTsKLQkJCQkKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oZGlhZ3JhbSk7Ci0JCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJQE92ZXJyaWRlCi0JCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotCQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGl0ZXIubmV4dCgpKTsKLQkJCQlDb2xsZWN0aW9uPENvbm5lY3Rpb24+IGNucyA9IGRpYWdyYW0uZ2V0Q29ubmVjdGlvbnMoKTsKLQkJCQlJdGVyYXRvcjxDb25uZWN0aW9uPiBpdGVyYSA9IGNucy5pdGVyYXRvcigpOwotCQkJCVNldDxDb25uZWN0aW9uPiB0b0RlbCA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb24+KCk7Ci0JCQkJd2hpbGUgKGl0ZXJhLmhhc05leHQoKSkgCi0JCQkJCXRvRGVsLmFkZChpdGVyYS5uZXh0KCkpOwotCQkJCWl0ZXJhID0gdG9EZWwuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlcmEuaGFzTmV4dCgpKQotCQkJCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5kZWxldGVQaWN0b2dyYW1FbGVtZW50KGl0ZXJhLm5leHQoKSk7CQkKLQkJCQkKLQkJCQlFbnVtZXJhdGlvbjxTdHJpbmc+IGl0ciA9IG1hcmtzLmtleXMoKTsKLQkJCQkKLQkJCQkvLyBjcmVhdGUgbmV3IHBpY3RvZ3JhbXMKLQkJCQl3aGlsZSAoaXRyLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gaXRyLm5leHRFbGVtZW50KCk7Ci0JCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUocHJvaiwgZW50aXR5TmFtZSk7Ci0JCQkJCWlmIChqcHQgIT0gbnVsbCkgewotCQkJCQkJU2l6ZVBvc2l0aW9uIHNwID0gbWFya3MuZ2V0KGVudGl0eU5hbWUpOwotCQkJCQkJQWRkQ29udGV4dCBjdHggPSBuZXcgQWRkRW50aXR5Q29udGV4dChzcC5wcmltYXJ5Q29sbGFwc2VkLAotCQkJCQkJCQlzcC5yZWxhdGlvbkNvbGxhcHNlZCwgc3AuYmFzaWNDb2xsYXBzZWQpOwotCQkJCQkJY3R4LnNldE5ld09iamVjdChqcHQpOwotCQkJCQkJY3R4LnNldFRhcmdldENvbnRhaW5lcihnZXREaWFncmFtKCkpOwotCQkJCQkJY3R4LnNldFdpZHRoKHNwLmdldFdpZHRoKCkpOwotCQkJCQkJY3R4LnNldEhlaWdodChzcC5nZXRIZWlnaHQoKSk7Ci0JCQkJCQljdHguc2V0WChzcC5nZXRYKCkpOwotCQkJCQkJY3R4LnNldFkoc3AuZ2V0WSgpKTsKLQkJCQkJCUFkZEpQQUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgQWRkSlBBRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQkJCQlmdC5hZGQoY3R4KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0JCQkKLQkJfSk7Ci0JCWdldERpYWdyYW1FZGl0b3IoKS5zYXZlV2l0aG91dEVudGl0aWVzKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCS8vIGRlbGV0ZSBvbGQgcGljdG9ncmFtcwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUNvbm5lY3Rpb25zKCkgewotCQlDb2xsZWN0aW9uPG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbj4gY29ucyA9IGdldERpYWdyYW0oKS5nZXRDb25uZWN0aW9ucygpOwotCQlJdGVyYXRvcjxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb24+IGNvbnNJdCA9IGNvbnMuaXRlcmF0b3IoKTsKLQkJQ29sbGVjdGlvbjxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb24+IGFsbENvbnMgPSBuZXcgSGFzaFNldDxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb24+KCk7Ci0JCXdoaWxlIChjb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQlvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb24gY29uID0gY29uc0l0Lm5leHQoKTsKLQkJCWFsbENvbnMuYWRkKGNvbik7Ci0JCX0KLQkJY29uc0l0ID0gYWxsQ29ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoY29uc0l0Lmhhc05leHQoKSkgewotCQkJb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uIGNvbiA9IGNvbnNJdC5uZXh0KCk7Ci0JICAgIAlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGNvbik7Ci0JICAgIAlSZW1vdmVSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlUmVsYXRpb25GZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkgICAgCWZ0LnJlbW92ZShjdHgpOwkJCQotCQl9CQkKLQl9Ci0JCi0JQE92ZXJyaWRlCi0JcHVibGljIEpQQURpYWdyYW1FZGl0b3IgZ2V0RGlhZ3JhbUVkaXRvcigpIHsKLQkJcmV0dXJuIChKUEFEaWFncmFtRWRpdG9yKXN1cGVyLmdldERpYWdyYW1FZGl0b3IoKTsKLQl9ICAgIAotICAgIAotCXByaXZhdGUgSnBhUHJvamVjdCBnZXRUYXJnZXRKUEFQcm9qZWN0KCkgewotCQlyZXR1cm4gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShnZXREaWFncmFtKCkuZ2V0TmFtZSgpKTsKLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNBbGl2ZSgpIHsKLQkJcmV0dXJuICFpc0Rpc3Bvc2VkOwotCX0KLQkgICAgICAgICAgIAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJc2V0RmVhdHVyZVByb3ZpZGVyKG51bGwpOwotCQlpc0Rpc3Bvc2VkID0gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckZlYXR1cmVQcm92aWRlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckZlYXR1cmVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzk0ZGNjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUFkZEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUNyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklDcmVhdGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEZWxldGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEaXJlY3RFZGl0aW5nRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JTGF5b3V0RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklNb3ZlU2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZWFzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSVJlbW92ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSVJlc2l6ZVNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JRGVsZXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEaXJlY3RFZGl0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklMYXlvdXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklNb3ZlU2hhcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUmVzaXplU2hhcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jdXN0b20uSUN1c3RvbUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5SZWFzb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuaW50ZXJuYWwuc2VydmljZXMuR3JhcGhpdGlJbnRlcm5hbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWkuZmVhdHVyZXMuRGVmYXVsdEZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLkNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5Tb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkFkZFJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNvbGxhcHNlRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZUpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlTWFueVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EZWxldGVKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGVsZXRlUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkV4cGFuZENvbXBhcnRtZW50U2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRXhwYW5kRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkpQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkxheW91dEpQQUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Nb3ZlQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLk1vdmVFbnRpdHlTaGFwZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZVJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlc2l6ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZXNpemVKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5JTW9kZWxJbnRlZ3JhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uLlJlbFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5HcmFwaGljc1VwZGF0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpwYVNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklQZVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuUGVTZXJ2aWNlVXRpbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBleHRlbmRzIERlZmF1bHRGZWF0dXJlUHJvdmlkZXIgaW1wbGVtZW50cyBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHsKLQkKLQlwcml2YXRlIENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBjbGlja0FkZEF0dEJ0bkZlYXQgPSBudWxsOwotCXByaXZhdGUgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlIGNsaWNrUmVtb3ZlQXR0QnRuRmVhdCA9IG51bGw7Ci0JcHJpdmF0ZSBJUGVTZXJ2aWNlVXRpbCBwZVV0aWwgPSBuZXcgUGVTZXJ2aWNlVXRpbEltcGwoKTsKLQlwcml2YXRlIElKUEFFZGl0b3JVdGlsIGpwYUVkaXRvclV0aWwgPSBuZXcgSlBBRWRpdG9yVXRpbEltcGwoKTsKLQlwcml2YXRlIElNb2RlbEludGVncmF0aW9uVXRpbCBtb2luSW50ZWdyYXRpb25VdGlsID0gbmV3IE1vZGVsSW50ZWdyYXRpb25VdGlsSW1wbCgpOyAKLQlwcml2YXRlIElHcmFwaGljc1VwZGF0ZXIgZ3JhcGhpY3NVcGRhdGVyID0gbmV3IEdyYXBoaWNzVXBkYXRlckltcGwoKTsgCi0JCi0gICAgcHVibGljIEpQQUVkaXRvckZlYXR1cmVQcm92aWRlcihJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAsIElKcGFTb2x2ZXIgaXMpIHsKLSAgICAgICAgc3VwZXIoZHRwKTsKLSAgICAgICAgaXMuc2V0RmVhdHVyZVByb3ZpZGVyKHRoaXMpOwotICAgICAgICB0aGlzLnNldEluZGVwZW5kZW5jZVNvbHZlcihpcyk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHN0b3BUaHJlYWQoKSB7Ci0gICAgCWlmIChnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSAhPSBudWxsKQotICAgIAkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnN0b3BUaHJlYWQoKTsKLSAgICB9Ci0gICAgCi0JcHVibGljIHZvaWQgYWRkSlBURm9yVXBkYXRlKFN0cmluZyBqcHROYW1lKSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRKUFRGb3JVcGRhdGUoanB0TmFtZSk7Ci0JfQotCi0gICAgCQotCXB1YmxpYyB2b2lkIGFkZFJlbW92ZUlnbm9yZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXROYW1lKSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRSZW1vdmVJZ25vcmUoanB0LmdldE5hbWUoKSArICIuIiArIGF0TmFtZSk7ICAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyB2b2lkIGFkZEFkZElnbm9yZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXROYW1lKSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRBZGRJZ25vcmUoanB0LmdldE5hbWUoKSArICIuIiArIGF0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JcHVibGljIEhhc2hTZXQ8U3RyaW5nPiBnZXRBZGRJZ25vcmUoKSB7Ci0JCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuZ2V0QWRkSWdub3JlKCk7IAotCX0KLQotCQotCXB1YmxpYyB2b2lkIGFkZEF0dHJpYkZvclVwZGF0ZShQZXJzaXN0ZW5jZVVuaXQgcHUsIFN0cmluZyBlbnRBdE1hcHBlZEJ5KSB7Ci0JCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5hZGRBdHRyaWJGb3JVcGRhdGUocHUsIGVudEF0TWFwcGVkQnkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1JlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MikgewotCQlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmV4aXN0c1JlbGF0aW9uKGpwdDEsIGpwdDIpOwotCX0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUFkZEZlYXR1cmUgZ2V0QWRkRmVhdHVyZShJQWRkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgCU9iamVjdCBuZXdPYmogPSBjb250ZXh0LmdldE5ld09iamVjdCgpOyAKLSAgICAgICAgaWYgKG5ld09iaiBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYgKG5ld09iaiBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsKLSAgICAgICAgCSByZXR1cm4gbmV3IEFkZFJlbGF0aW9uRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBQZXJzaXN0ZW50QXR0cmlidXRlKSB7IAotICAgICAgICAJaWYgKERpYWdyYW0uY2xhc3MuaXNJbnN0YW5jZShjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpKSkgeyAgICAgCQkJCi0gICAgICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgICAgIAl9IGVsc2UgewotICAgICAgICAJCXJldHVybiBuZXcgQWRkQXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgCX0KLSAgICAgICAgfSBlbHNlIGlmIChuZXdPYmogaW5zdGFuY2VvZiBDb21waWxhdGlvblVuaXQpIHsKLSAgICAgICAgCUNvbXBpbGF0aW9uVW5pdCBjdSA9IChDb21waWxhdGlvblVuaXQpbmV3T2JqOwotICAgICAgICAJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLSAgICAgICAgCWlmIChqcHQgIT0gbnVsbCkgcmV0dXJuIG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwotICAgICAgICB9IGVsc2UgaWYgKChuZXdPYmogaW5zdGFuY2VvZiBKcGFOb2RlKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUodGhpcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAobmV3T2JqIGluc3RhbmNlb2YgU291cmNlVHlwZSkgewotICAgICAgICAJcmV0dXJuIG5ldyBBZGRKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRBZGRGZWF0dXJlKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNyZWF0ZUZlYXR1cmVbXSBnZXRDcmVhdGVGZWF0dXJlcygpIHsKLSAgICAJcmV0dXJuIG5ldyBJQ3JlYXRlRmVhdHVyZVtdIHsgbmV3IENyZWF0ZUpQQUVudGl0eUZlYXR1cmUodGhpcyksIG5ldyBDcmVhdGVKUEFFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0ZlYXR1cmUodGhpcykgfTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0JcHVibGljIElEZWxldGVGZWF0dXJlIGdldERlbGV0ZUZlYXR1cmUoSURlbGV0ZUNvbnRleHQgY29udGV4dCkgewotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgCU9iamVjdCBibyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgIAkJcmV0dXJuIG5ldyBEZWxldGVKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwkKLSAgICAJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEFic3RyYWN0UmVsYXRpb24pIHsKLSAgICAJCXJldHVybiBuZXcgRGVsZXRlUmVsYXRpb25GZWF0dXJlKHRoaXMpOwotICAgIAl9IGVsc2UgaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLSAgICAJCXJldHVybiBuZXcgQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKHRoaXMpOwotICAgIAl9Ci0JCXJldHVybiBudWxsOwotCX0gICAgCi0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUN1c3RvbUZlYXR1cmVbXSBnZXRDdXN0b21GZWF0dXJlcyhJQ3VzdG9tQ29udGV4dCBjb250ZXh0KSB7Ci0JCUlDdXN0b21GZWF0dXJlW10gcmV0ID0gc3VwZXIuZ2V0Q3VzdG9tRmVhdHVyZXMoY29udGV4dCk7Ci0JCUxpc3Q8SUN1c3RvbUZlYXR1cmU+IHJldExpc3QgPSBuZXcgQXJyYXlMaXN0PElDdXN0b21GZWF0dXJlPigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykgewotCQkJcmV0TGlzdC5hZGQocmV0W2ldKTsKLQkJfQotCQkKLQkJcmV0TGlzdC5hZGQobmV3IENvbGxhcHNlQWxsRW50aXRpZXNGZWF0dXJlKHRoaXMpKTsKLQotCQlyZXRMaXN0LmFkZChuZXcgQ29sbGFwc2VFbnRpdHlGZWF0dXJlKHRoaXMpKTsKLQkJcmV0TGlzdC5hZGQobmV3IEV4cGFuZEVudGl0eUZlYXR1cmUodGhpcykpOwotCQotCQlyZXRMaXN0LmFkZChuZXcgQ29sbGFwc2VDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSh0aGlzKSk7Ci0JCXJldExpc3QuYWRkKG5ldyBFeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSh0aGlzKSk7Ci0JCQotCQlyZXQgPSByZXRMaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0gICAgCi0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElSZXNpemVTaGFwZUZlYXR1cmUgZ2V0UmVzaXplU2hhcGVGZWF0dXJlKElSZXNpemVTaGFwZUNvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0JCWlmIChnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlyZXR1cm4gbmV3IFJlc2l6ZUpQQUVudGl0eUZlYXR1cmUodGhpcyk7Ci0JCX0KLSAgICAJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAlpZiAoZ2EgPT0gbnVsbCkgCi0gICAgCQlyZXR1cm4gc3VwZXIuZ2V0UmVzaXplU2hhcGVGZWF0dXJlKGNvbnRleHQpOwotICAgIAlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAJaWYgKChjaCAhPSBudWxsKSAmJiAoY2guc2l6ZSgpID4gMCkgJiYgKGNoLmdldCgwKSBpbnN0YW5jZW9mIFRleHQpKSB7Ci0gICAgCQlyZXR1cm4gbmV3IFJlc2l6ZUF0dHJpYnV0ZUZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLQkJCi0JCXJldHVybiBzdXBlci5nZXRSZXNpemVTaGFwZUZlYXR1cmUoY29udGV4dCk7Ci0gICAgfQotICAgICAgCi0gICAgCi0gICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUxheW91dEZlYXR1cmUgZ2V0TGF5b3V0RmVhdHVyZShJTGF5b3V0Q29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGljdG9ncmFtRWxlbWVudCA9IGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpOwotICAgICAgICBPYmplY3QgYm8gPSBnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdG9ncmFtRWxlbWVudCk7Ci0gICAgICAgIGlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBMYXlvdXRKUEFFbnRpdHlGZWF0dXJlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRMYXlvdXRGZWF0dXJlKGNvbnRleHQpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVJlbW92ZUZlYXR1cmUgZ2V0UmVtb3ZlRmVhdHVyZShJUmVtb3ZlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsgICAKLSAgICAgICAgaWYgKGJvID09IG51bGwpCi0gICAgICAgIAlzdXBlci5nZXRSZW1vdmVGZWF0dXJlKGNvbnRleHQpOwotICAgIAlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAJCXJldHVybiBuZXcgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZSh0aGlzKTsJCi0gICAgCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7IAotICAgIAkJcmV0dXJuIG5ldyBSZW1vdmVSZWxhdGlvbkZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLSAgICAJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAlpZiAoZ2EgPT0gbnVsbCkgCi0gICAgCQlyZXR1cm4gc3VwZXIuZ2V0UmVtb3ZlRmVhdHVyZShjb250ZXh0KTsKLSAgICAJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2ggPSBnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgCWlmICgoY2ggIT0gbnVsbCkgJiYgKGNoLnNpemUoKSA+IDApICYmIChjaC5nZXQoMCkgaW5zdGFuY2VvZiBUZXh0KSkgewotICAgIAkJcmV0dXJuIG5ldyBSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlKHRoaXMpOwotICAgIAl9Ci0gICAgCXJldHVybiBzdXBlci5nZXRSZW1vdmVGZWF0dXJlKGNvbnRleHQpOwotICAgIH0KLSAgICAgICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDcmVhdGVDb25uZWN0aW9uRmVhdHVyZVtdIGdldENyZWF0ZUNvbm5lY3Rpb25GZWF0dXJlcygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBJQ3JlYXRlQ29ubmVjdGlvbkZlYXR1cmVbXSB7Ci0gICAgICAgIAluZXcgQ3JlYXRlT25lVG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUodGhpcyksCi0gICAgICAgICAgICBuZXcgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwgICAgICAgICAgIAotICAgICAgICAJbmV3IENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAJbmV3IENyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwKLSAgICAgICAgICAgIG5ldyBDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKSwgICAgICAgICAgICAKLSAgICAgICAgCW5ldyBDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKHRoaXMpLAotICAgICAgICAgICAgbmV3IENyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZSh0aGlzKQotICAgICAgICB9OwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVJlYXNvbiBjYW5BZGQoSUFkZENvbnRleHQgY29udGV4dCkgewotICAgIAlyZXR1cm4gUmVhc29uLmNyZWF0ZVRydWVSZWFzb24oKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIElDdXN0b21GZWF0dXJlIGdldEFkZEFsbEVudGl0aWVzRmVhdHVyZSgpIHsKLSAgICAJcmV0dXJuIG5ldyBBZGRBbGxFbnRpdGllc0ZlYXR1cmUodGhpcyk7IAotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSU1vdmVTaGFwZUZlYXR1cmUgZ2V0TW92ZVNoYXBlRmVhdHVyZShJTW92ZVNoYXBlQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAgICAgaWYgKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcy5pc0luc3RhbmNlKGJvKSkgewotICAgICAgICAJcmV0dXJuIG5ldyBNb3ZlRW50aXR5U2hhcGVGZWF0dXJlKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGJvID09IG51bGwpewotICAgIAkJcmV0dXJuIG5ldyBNb3ZlQXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgfSAKLSAgICAJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAlpZiAoZ2EgPT0gbnVsbCkgCi0gICAgCQlyZXR1cm4gc3VwZXIuZ2V0TW92ZVNoYXBlRmVhdHVyZShjb250ZXh0KTsKLSAgICAJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2ggPSBnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgCWlmICgoY2ggIT0gbnVsbCkgJiYgKGNoLnNpemUoKSA+IDApICYmIChjaC5nZXQoMCkgaW5zdGFuY2VvZiBUZXh0KSkgewotICAgIAkJcmV0dXJuIG5ldyBNb3ZlQXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAJfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0TW92ZVNoYXBlRmVhdHVyZShjb250ZXh0KTsKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElEaXJlY3RFZGl0aW5nRmVhdHVyZSBnZXREaXJlY3RFZGl0aW5nRmVhdHVyZShJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCkgewotICAgICAgICBQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIEdyYXBoaWNzQWxnb3JpdGhtIGdhID0gcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLSAgICAgICAgaWYgKCEoZ2EgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2ggPSBnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCk7Ci0gICAgICAgIGlmICgoY2ggPT0gbnVsbCkgfHwgKGNoLnNpemUoKSA9PSAwKSkgCi0gICAgICAgIAlyZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdGluZ0ZlYXR1cmUoY29udGV4dCk7Ci0gICAgICAgIGdhID0gY2guZ2V0KDApOwotICAgICAgICBpZiAoIShnYSBpbnN0YW5jZW9mIFRleHQpKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgaWYoKChUZXh0KWdhKS5nZXRGb250KCkuaXNJdGFsaWMoKSkKLSAgICAJCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsKLSAgICAgICAgT2JqZWN0IGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKTsKLSAgICAgICAgaWYgKGJvICE9IG51bGwpIHsKLSAgICAgICAgCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0gICAgICAgIAkJcmV0dXJuIG5ldyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZSh0aGlzKTsKLSAgICAgICAgCX0KLSAgICAgICAgfQotICAgICAgICBpZiAoIShwZSBpbnN0YW5jZW9mIFNoYXBlKSkgCi0gICAgICAgIAlyZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdGluZ0ZlYXR1cmUoY29udGV4dCk7Ci0gICAgICAgIFNoYXBlIHNoID0gKFNoYXBlKXBlOwotICAgICAgICBDb250YWluZXJTaGFwZSBjc2ggPSBzaC5nZXRDb250YWluZXIoKTsKLSAgICAgICAgaWYgKGNzaCA9PSBudWxsKSAKLSAgICAgICAgCXJldHVybiBzdXBlci5nZXREaXJlY3RFZGl0aW5nRmVhdHVyZShjb250ZXh0KTsgCi0gICAgICAgIGJvID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzaCk7Ci0gICAgICAgIGlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSl7IAotICAgICAgICAgICAgcmV0dXJuIG5ldyBEaXJlY3RFZGl0SlBBRW50aXR5RmVhdHVyZSh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RGlyZWN0RWRpdGluZ0ZlYXR1cmUoY29udGV4dCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZE1pc3NpbmdSZWxhdGlvbnMoSmF2YVBlcnNpc3RlbnRUeXBlIG5ld0VudGl0eSwgQ29udGFpbmVyU2hhcGUgbmV3U2hhcGUpIHsKLSAgICAgICAgQ29sbGVjdGlvbjxQaWN0b2dyYW1FbGVtZW50PiBhbGxDb250YWluZWRQaWN0b2dyYW1FbGVtZW50cyA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpCi0gICAgICAgIC5nZXRBbGxDb250YWluZWRQaWN0b2dyYW1FbGVtZW50cyhnZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLSAgICAgICAgCi0gICAgICAgIGZvciAoUGljdG9ncmFtRWxlbWVudCBwZSA6IGFsbENvbnRhaW5lZFBpY3RvZ3JhbUVsZW1lbnRzKSB7Ci0gICAgICAgIAlpZiAoKHBlICE9IG5ld1NoYXBlKSAmJiAocGUgaW5zdGFuY2VvZiBDb250YWluZXJTaGFwZSkpIHsKLSAgICAgICAgCQlKYXZhUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlnZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotICAgICAgICAJCUFic3RyYWN0UmVsYXRpb24gbmV3UmVsID0gcHJvZHVjZU5lY2Vzc2FyeVJlbGF0aW9uKG5ld0VudGl0eSwgZW50aXR5KTsKLSAgICAgICAgCQlpZiAobmV3UmVsICE9IG51bGwpIHsKLSAgICAgICAgCQkJSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyID0gbmV3UmVsLmdldE93bmVyKCk7Ci0gICAgICAgIAkJCUphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlID0gbmV3UmVsLmdldEludmVyc2UoKTsKLSAgICAgICAgCQkJQ29udGFpbmVyU2hhcGUgb3duZXJTaGFwZSA9IChDb250YWluZXJTaGFwZSlnZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3Qob3duZXIpOwotICAgICAgICAJCQlDb250YWluZXJTaGFwZSBpbnZlcnNlU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGludmVyc2UpOwotICAgICAgICAgCQkJQWRkUmVsYXRpb25GZWF0dXJlIGYgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKHRoaXMpOwotICAgICAgICAJCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjdHggPSAKLSAgICAgICAgCQkJCW5ldyBBZGRDb25uZWN0aW9uQ29udGV4dChKUEFFZGl0b3JVdGlsLmdldEFuY2hvcihvd25lclNoYXBlKSwgSlBBRWRpdG9yVXRpbC5nZXRBbmNob3IoaW52ZXJzZVNoYXBlKSk7Ci0gICAgICAgIAkJCWYuYWRkKGN0eCk7Ci0gICAgICAgIAkJfQotICAgICAgICAJfQotICAgICAgICB9Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIHJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnJlbmV3QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlMaXN0ZW5lcihqcGEpOwotCX0KLSAgICAgICAgCi0gICAgcHJpdmF0ZSBBYnN0cmFjdFJlbGF0aW9uIHByb2R1Y2VOZWNlc3NhcnlSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUgZW50MSwgSmF2YVBlcnNpc3RlbnRUeXBlIGVudDIpIHsKLSAgICAJcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIAotCXB1YmxpYyBTdHJpbmcgcHJvZHVjZUtleUZvclJlbChKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnByb2R1Y2VLZXlGb3JSZWwoanB0LCBhdHRyaWJ1dGVOYW1lKTsKLQl9Ci0KLSAgICAKLSAgICBwdWJsaWMgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlIGdldENsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSgpIHsKLSAgICAJaWYgKGNsaWNrQWRkQXR0QnRuRmVhdCA9PSBudWxsKSB7Ci0gICAgCQljbGlja0FkZEF0dEJ0bkZlYXQgPSBuZXcgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKHRoaXMpOwotICAgIAl9Ci0gICAgCXJldHVybiBjbGlja0FkZEF0dEJ0bkZlYXQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUgZ2V0Q2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKCkgewotICAgIAlpZiAoY2xpY2tSZW1vdmVBdHRCdG5GZWF0ID09IG51bGwpIHsKLSAgICAJCWNsaWNrUmVtb3ZlQXR0QnRuRmVhdCA9IG5ldyBDbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUodGhpcyk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIGNsaWNrUmVtb3ZlQXR0QnRuRmVhdDsKLSAgICB9ICAgIAotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJTW92ZUNvbm5lY3Rpb25EZWNvcmF0b3JGZWF0dXJlIGdldE1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZSgKLSAgICAJCUlNb3ZlQ29ubmVjdGlvbkRlY29yYXRvckNvbnRleHQgY29udGV4dCkgewotICAgICAgCSByZXR1cm4gbmV3IEpQQU1vdmVDb25uZWN0aW9uRGVjb3JhdG9yRmVhdHVyZSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KFN0cmluZyBrZXkpIHsKLSAgICAJcmV0dXJuIGdldEluZGVwZW5kZW5jZVNvbHZlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGtleSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJvKSB7Ci0gICAgCXJldHVybiBnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKS5nZXRLZXlGb3JCdXNpbmVzc09iamVjdChibyk7Ci0gICAgfQotICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBwdXRLZXlUb0J1c2luZXNzT2JqZWN0KFN0cmluZyBrZXksIE9iamVjdCBibykgewotICAgIAkoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuYWRkS2V5QnVzaW5lc3NPYmplY3Qoa2V5LCBibyk7Ci0gICAgfSAgCi0gICAgCi0gICAgcHVibGljIE9iamVjdCByZW1vdmUoU3RyaW5nIGtleSkgewotICAgIAlyZXR1cm4gcmVtb3ZlKGtleSwgZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5LCBib29sZWFuIHNhdmUpIHsKLSAgICAJT2JqZWN0IHJlcyA9IGdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGtleSk7Ci0gICAgCWlmIChyZXMgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLSAgICAJCWZpbmFsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlczsKLSAgICAJCWlmIChzYXZlKQotICAgIAkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgdGhpcyk7Ci0gICAgCQlpZighKGpwdC5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhRW50aXR5KSl7Ci0gICAgCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotICAgIAkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgCQkJICAgICAgICAgIHJlbW92ZUZyb21EaWFncmFtSWZOb3RFbnRpdHkoanB0KTsKLSAgICAJCQkJfX0pOwotICAgIAkJfQotCi0gICAgCX0KLSAgICAJcmV0dXJuICgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5yZW1vdmUoa2V5KTsKLSAgICB9ICAgIAotICAgIAotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFsbENvbm5lY3Rpb25zKFNoYXBlIHNoYXBlKSB7Ci0JCWZvciAoSXRlcmF0b3I8QW5jaG9yPiBpdGVyID0gc2hhcGUuZ2V0QW5jaG9ycygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJQW5jaG9yIGFuY2hvciA9IGl0ZXIubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvcjxDb25uZWN0aW9uPiBpdGVyYXRvciA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFsbENvbm5lY3Rpb25zKGFuY2hvcikuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoR3JhcGhpdGlJbnRlcm5hbC5nZXRFbWZTZXJ2aWNlKCkuaXNPYmplY3RBbGl2ZShjb25uZWN0aW9uKSkgewotIAkJCQkJT2JqZWN0IG9iID0gZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNvbm5lY3Rpb24pOwotCQkJCQkJaWYob2IgaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKXsKLQkJCQkJCQlTdHJpbmcga2V5ID0gZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3Qob2IpOwotCQkJCQkJCSgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5yZW1vdmUoa2V5KTsKLQkJCQkJCX0KLQkJCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChjb25uZWN0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRnJvbURpYWdyYW1JZk5vdEVudGl0eShmaW5hbCBKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgY3MgPSB0aGlzLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQlpZiAoY3MgIT0gbnVsbCkgewotCQkJZmluYWwgU2hhcGUgc2hhcGUgPSAoU2hhcGUpIGNzOwotCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0VHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4odGhpcwotCQkJCQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKSk7Ci0JCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCXJlbW92ZUFsbENvbm5lY3Rpb25zKHNoYXBlKTsKLQkJCQkJR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZGVsZXRlUGljdG9ncmFtRWxlbWVudChjcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQotICAgIAotICAgIHB1YmxpYyBib29sZWFuIGhhc09iamVjdFdpdGhOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuY29udGFpbnNLZXkobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VBdHRyaWJ1dGUoZmluYWwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2xkQXQsIGZpbmFsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0KSB7Ci0gICAgCWZpbmFsIFBpY3RvZ3JhbUVsZW1lbnQgcGUgPSB0aGlzLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChvbGRBdCk7Ci0gICAgCWlmIChwZSA9PSBudWxsKSB7Ci0gICAgCQkvL1N5c3RlbS5lcnIucHJpbnRsbigiUGljdG9ncmFtRWxlbWVudCBpcyBudWxsXG4iKTsKLSAgICAJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7ICAgIAkJCi0gICAgCQkvL3JldHVybjsKLSAgICAJfQotICAgIAlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihwZSk7Ci0gICAgCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkgICAgCUpQQVNvbHZlciBzb2x2ZXIgPSAoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpOyAKLQkJICAgIAlzb2x2ZXIucmVtb3ZlKHNvbHZlci5nZXRLZXlGb3JCdXNpbmVzc09iamVjdChvbGRBdCkpOwotCQkgICAgCXNvbHZlci5hZGRLZXlCdXNpbmVzc09iamVjdChzb2x2ZXIuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QobmV3QXQpLCBuZXdBdCk7Ci0JCSAgICAJaWYgKG5ld0F0ID09IG51bGwpIHsKLQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiTmV3IGF0dHJpYnV0ZSBpcyBudWxsXG4iLCBuZXcgRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCSAgICAJCXJldHVybjsKLQkJICAgIAl9Ci0JCSAgICAJbGluayhwZSwgbmV3QXQpOwotCQkgICAgCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJICAgIAlpZiAoZ2EgPT0gbnVsbCkKLQkJICAgIAkJcmV0dXJuOwotCQkgICAgCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGNoID0gZ2EuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotCQkgICAgCSgoVGV4dCljaC5nZXQoMCkpLnNldFZhbHVlKG5ld0F0LmdldE5hbWUoKSk7Ci0JCQl9Ci0gICAgCX0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgYm9vbGVhbiBkb2VzUmVsYXRpb25FeGlzdChKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsIAotCQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSwKLQkJCVJlbFR5cGUgcmVsVHlwZSwgCi0JCQlSZWxEaXIgcmVsRGlyKSB7Ci0gICAgCQotICAgIAlTdHJpbmcgaWQgPSBBYnN0cmFjdFJlbGF0aW9uLmdlbmVyYXRlSWQob3duZXIsIGludmVyc2UsIG93bmVyQXR0cmlidXRlTmFtZSwgcmVsVHlwZSwgcmVsRGlyKTsKLSAgICAJcmV0dXJuIChnZXRCdXNpbmVzc09iamVjdEZvcktleShpZCkgIT0gbnVsbCk7Ci0gICAgfSAgIAotICAgIAotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCXJldHVybiAoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuaXNSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShqcGEpOwotCX0KLQkKLQlwdWJsaWMgSVJlbGF0aW9uIGdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlyZXR1cm4gKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLmdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKGpwYSk7Ci0JfSAgICAKLQkJCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmV0dXJuICgoSlBBU29sdmVyKWdldEluZGVwZW5kZW5jZVNvbHZlcigpKS5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXN0b3JlRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJKChKUEFTb2x2ZXIpZ2V0SW5kZXBlbmRlbmNlU29sdmVyKCkpLnJlc3RvcmVFbnRpdHkoanB0KTsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRBdHRyaWJzTnVtKFNoYXBlIHNoKSB7Ci0JCVN0cmluZyBzID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShzaCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfQVRUUklCU19OVU0pOwotCQlpbnQgcmVzID0gMDsKLQkJaWYgKHMgPT0gbnVsbCkgewotCQkJc2V0QXR0cmlic051bSgwLCBzaCk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXMgPSBJbnRlZ2VyLnBhcnNlSW50KHMpOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXB1YmxpYyBpbnQgaW5jcmVhc2VBdHRyaWJzTnVtKFNoYXBlIHNoKSB7Ci0JCWludCBhdHRyaWJzTnVtID0gZ2V0QXR0cmlic051bShzaCk7Ci0JCWF0dHJpYnNOdW0rKzsKLQkJc2V0QXR0cmlic051bShhdHRyaWJzTnVtLCBzaCk7Ci0JCXJldHVybiBhdHRyaWJzTnVtOwotCX0KLQkKLQlwdWJsaWMgaW50IGRlY3JlYXNlQXR0cmlic051bShTaGFwZSBzaCkgewotCQlpbnQgYXR0cmlic051bSA9IGdldEF0dHJpYnNOdW0oc2gpOwotCQlhdHRyaWJzTnVtLS07Ci0JCXNldEF0dHJpYnNOdW0oYXR0cmlic051bSwgc2gpOwotCQlyZXR1cm4gYXR0cmlic051bTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnNOdW0oaW50IG5ld0F0dHJpYnNOdW0sIFNoYXBlIHNoKSB7Ci0JCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoc2gsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0FUVFJJQlNfTlVNLCAiIiArIG5ld0F0dHJpYnNOdW0pOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qCi0JcHVibGljIENvbGxlY3Rpb248UmVzb3VyY2VPcGVyYXRpb24+IGdldEFmZmVjdGVkUGFydGl0aW9uc0Zvck1vZGlmaWNhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBIYXNoU2V0PFJlc291cmNlT3BlcmF0aW9uPigpOwotCX0KLQkqLwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3RvcFRocmVhZCgpOwotCQkoKEpQQVNvbHZlcilnZXRJbmRlcGVuZGVuY2VTb2x2ZXIoKSkuZGlzcG9zZSgpOwotCQlzZXRJbmRlcGVuZGVuY2VTb2x2ZXIobnVsbCk7Ci0JfQotCi0KLQlwdWJsaWMgSVBlU2VydmljZVV0aWwgZ2V0UGVVdGlsKCkgewotCQlyZXR1cm4gcGVVdGlsOwotCX0KLQkKLQlwdWJsaWMgSUpQQUVkaXRvclV0aWwgZ2V0SlBBRWRpdG9yVXRpbCgpIHsKLQkJcmV0dXJuIHRoaXMuanBhRWRpdG9yVXRpbDsKLQl9Ci0JCi0JcHVibGljIElNb2RlbEludGVncmF0aW9uVXRpbCBnZXRNb2luSW50ZWdyYXRpb25VdGlsKCkgewotCQlyZXR1cm4gbW9pbkludGVncmF0aW9uVXRpbDsKLQl9Ci0JCi0JcHVibGljIElHcmFwaGljc1VwZGF0ZXIgZ2V0R3JhcGhpY3NVcGRhdGVyKCkgewotCQlyZXR1cm4gZ3JhcGhpY3NVcGRhdGVyOwotCX0KLQotCXB1YmxpYyBUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBnZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbigpIHsKLQkJRGlhZ3JhbSBkaWFncmFtID0gZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKTsKLQkJcmV0dXJuIFRyYW5zYWN0aW9uVXRpbC5nZXRFZGl0aW5nRG9tYWluKGRpYWdyYW0pOwotCX0KLQkKLQlwdWJsaWMgUGljdG9ncmFtRWxlbWVudCBnZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJ1c2luZXNzT2JqZWN0KSB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBzdXBlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYnVzaW5lc3NPYmplY3QpOwotCQkvKgotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChwZSA9PSBudWxsKSAmJiAoY250IDwgMjApKSB7Ci0JCQkvL1N5c3RlbS5vdXQucHJpbnRsbigibG9vcCIpOwotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9vcDsgaGM6IiArIGJ1c2luZXNzT2JqZWN0Lmhhc2hDb2RlKCkpOwotCQkJcGUgPSBzdXBlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYnVzaW5lc3NPYmplY3QpOwotCQkJY250Kys7Ci0JCX0KLQkJaWYgKHBlID09IG51bGwpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRlAgLSBQRSBpcyBudWxsOyBoYzoiICsgYnVzaW5lc3NPYmplY3QuaGFzaENvZGUoKSk7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHBlOwotCX0KLQkKLQlwdWJsaWMgUHJvcGVydGllcyBsb2FkUHJvcGVydGllcyhJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCXJldHVybiBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckltYWdlQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjMxOTgwLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JJbWFnZUNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Qb2x5bGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudXRpbC5JQ29sb3JDb25zdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9ySW1hZ2VDcmVhdG9yIGltcGxlbWVudHMgSUpQQUVkaXRvckltYWdlQ3JlYXRvciB7Ci0KLQlwdWJsaWMgUG9seWxpbmUgY3JlYXRlQ29ubmVjdGlvbkxpbmUoRGlhZ3JhbSBkLCBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLQkJUG9seWxpbmUgcG9seWxpbmUgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2x5bGluZShjb25uZWN0aW9uKTsKLQkJcG9seWxpbmUuc2V0Rm9yZWdyb3VuZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihkLCBKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX0NPTE9SKSk7Ci0JCXBvbHlsaW5lLnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJcmV0dXJuIHBvbHlsaW5lOwotCX0KLQotCS8qCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlVGV4dENvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgdGV4dERlY29yYXRvciA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3IoY29ubmVjdGlvbiwgdHJ1ZSwgMC41LCB0cnVlKTsKLQkJVGV4dCB0eHQgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVEZWZhdWx0VGV4dCh0ZXh0RGVjb3JhdG9yKTsKLQkJdHh0LnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJdHh0LnNldFZhbHVlKHRleHQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihjb25uZWN0aW9uLmdldFBhcmVudCgpLCBJQ29sb3JDb25zdGFudC5CTEFDSyk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKHR4dCwgNSwgLTIwKTsKLQkJcmV0dXJuIHRleHREZWNvcmF0b3I7Ci0JfQotCSovCi0JCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKERpYWdyYW0gZCwgQ29ubmVjdGlvbiBjLCBTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgdGV4dERlY29yYXRvciA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3IoYywgdHJ1ZSwgbG9jYXRpb24sIHRydWUpOwotCQlUZXh0IHR4dCA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZURlZmF1bHRUZXh0KGQsIHRleHREZWNvcmF0b3IpOwotCQl0eHQuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfV0lEVEgpOwotCQl0eHQuc2V0VmFsdWUodGV4dCk7Ci0JCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGMuZ2V0UGFyZW50KCksIElDb2xvckNvbnN0YW50LkJMQUNLKTsKLQkJUG9pbnQgcHQgPSBKUEFFZGl0b3JVdGlsLnJlY2FsY1RleHREZWNvcmF0b3JQb3NpdGlvbigoRnJlZUZvcm1Db25uZWN0aW9uKWMsIHRleHREZWNvcmF0b3IpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbih0eHQsIHB0LngsIHB0LnksIGZhbHNlKTsKLQkJcmV0dXJuIHRleHREZWNvcmF0b3I7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlQXJyb3dDb25uZWN0aW9uRGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgY2QgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGZhbHNlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCVBvbHlsaW5lIGFycm93ID0gbnVsbDsgCi0JCQlhcnJvdyA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvbHlsaW5lKGNkLCBuZXcgaW50W10geyAxMSwgMywgMCwgMCwgMTEsIC0zLCAxMSwgM30pOwotCQlhcnJvdy5zZXRGb3JlZ3JvdW5kKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLm1hbmFnZUNvbG9yKGNvbm5lY3Rpb24uZ2V0UGFyZW50KCksIEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfQ09MT1IpKTsKLQkJYXJyb3cuc2V0TGluZVdpZHRoKEpQQUVkaXRvckNvbnN0YW50cy5DT05ORUNUSU9OX0xJTkVfV0lEVEgpOwotCQlyZXR1cm4gY2Q7Ci0JfQotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueUVuZFdpdGhBcnJvd0RlY29yYXRvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIGRvdWJsZSBsb2NhdGlvbikgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGNkID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29ubmVjdGlvbkRlY29yYXRvcihjb25uZWN0aW9uLCBmYWxzZSwgbG9jYXRpb24sIHRydWUpOwotCQlQb2x5bGluZSBhcnJvdyA9IG51bGw7Ci0JCWFycm93ID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlUG9seWxpbmUoY2QsIG5ldyBpbnRbXSB7IC0yLCA3LCA2LCAwLCAtMiwgLTcsIDYsIDAsIDIwLCAzLCAyMCwgLTMsIDcsIDB9KTsKLQkJYXJyb3cuc2V0Rm9yZWdyb3VuZChHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5tYW5hZ2VDb2xvcihjb25uZWN0aW9uLmdldFBhcmVudCgpLCBKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX0NPTE9SKSk7Ci0JCWFycm93LnNldExpbmVXaWR0aChKUEFFZGl0b3JDb25zdGFudHMuQ09OTkVDVElPTl9MSU5FX1dJRFRIKTsKLQkJcmV0dXJuIGNkOwotCX0KLQotCXB1YmxpYyBDb25uZWN0aW9uRGVjb3JhdG9yIGNyZWF0ZU1hbnlFbmREZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBjZCA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUNvbm5lY3Rpb25EZWNvcmF0b3IoY29ubmVjdGlvbiwgZmFsc2UsIGxvY2F0aW9uLCB0cnVlKTsKLQkJUG9seWxpbmUgYXJyb3cgPSBudWxsOwotCQlhcnJvdyA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvbHlsaW5lKGNkLCBuZXcgaW50W10geyAwLCA3LCAKLQkJCQkJCQkJCQkJCQkgOCwgMCwgCi0JCQkJCQkJCQkJCQkJMCwgLTcgfSk7Ci0JCWFycm93LnNldEZvcmVncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoY29ubmVjdGlvbi5nZXRQYXJlbnQoKSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9DT0xPUikpOwotCQlhcnJvdy5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXJldHVybiBjZDsKLQl9Ci0JCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlTWFueVN0YXJ0RGVjb3JhdG9yKENvbm5lY3Rpb24gY29ubmVjdGlvbiwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgY2QgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5jcmVhdGVDb25uZWN0aW9uRGVjb3JhdG9yKGNvbm5lY3Rpb24sIGZhbHNlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCVBvbHlsaW5lIGFycm93ID0gbnVsbDsKLQkJYXJyb3cgPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2x5bGluZShjZCwgbmV3IGludFtdIHswLCA3LCAKLQkJCQkJCQkJCQkJCQkgLTgsIDAsIAotCQkJCQkJCQkJCQkJCTAsIC03IH0pOwkJCi0JCWFycm93LnNldEZvcmVncm91bmQoR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkubWFuYWdlQ29sb3IoY29ubmVjdGlvbi5nZXRQYXJlbnQoKSwgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9DT0xPUikpOwotCQlhcnJvdy5zZXRMaW5lV2lkdGgoSlBBRWRpdG9yQ29uc3RhbnRzLkNPTk5FQ1RJT05fTElORV9XSURUSCk7Ci0JCXJldHVybiBjZDsKLQl9CQotCi0JcHVibGljIENvbm5lY3Rpb25EZWNvcmF0b3IgY3JlYXRlSWNvbkNvbm5lY3Rpb25EZWNvcmF0b3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgaWNvbklkLCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBpY29uRGVjb3JhdG9yID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuY3JlYXRlQ29ubmVjdGlvbkRlY29yYXRvcihjb25uZWN0aW9uLCB0cnVlLCBsb2NhdGlvbiwgdHJ1ZSk7Ci0JCUltYWdlIGljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShjb25uZWN0aW9uLCBpY29uSWQpOwotCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihpY29uLCA1LCAtMjApOwotCQlyZXR1cm4gaWNvbkRlY29yYXRvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JJbWFnZVByb3ZpZGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjkwNWFlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JJbWFnZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS51aS5wbGF0Zm9ybS5BYnN0cmFjdEltYWdlUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RJbWFnZVByb3ZpZGVyIHsKLQotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLkpQQUVkaXRvckltYWdlUHJvdmlkZXIiOwkvLyROT04tTkxTLTEkCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUkUgPSAib3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuIjsgCQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfRU5USVRZID0gUFJFICsgImVudGl0eSI7IAkJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFERF9KUEFfRU5USVRZID0gUFJFICsgImFkZF9lbnRpdHkiOyAJCQkJCQkJCS8vJE5PTi1OTFMtMSQgICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUREX0lOSEVSSVRFRF9FTlRJVFkgPSBQUkUgKyAibWFwcGVkX3N1cGVyY2xhc3MiOyAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0tFWSA9IFBSRSArICJwayI7IAkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0JBU0lDID0gUFJFICsgImZpZWxkIjsgCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERfQVRUUklCVVRFID0gUFJFICsgImFkZF9hdHRyaWJ1dGUiOyAJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVNT1ZFX0FUVFJJQlVURSA9IFBSRSArICJyZW1vdmVfYXR0cmlidXRlIjsgCQkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19PTkUgPSBQUkUgKyAib25lX3RvX29uZV9yZWxhdGlvbiI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19NQU5ZID0gUFJFICsgIm9uZV90b19tYW55X3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fTUFOWV9UT19PTkUgPSBQUkUgKyAibWFueV90b19vbmVfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9NQU5ZX1RPX01BTlkgPSBQUkUgKyAibWFueV90b19tYW55X3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRU1CRURERURfSUQgPSBQUkUgKyAiZW1iZWRkZWRfaWQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9WRVJTSU9OID0gUFJFICsgInZlcnNpb24iOyAvLyROT04tTkxTLTEkIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVFJBTlNJRU5UID0gUFJFICsgInRyYW5zaWVudCI7IC8vJE5PTi1OTFMtMSQgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fRU1CRURERUQgPSBQUkUgKyAiZW1iZWRkZWQiOyAvLyROT04tTkxTLTEkIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElDT05fVU5NQVBQRUQgPSBQUkUgKyAidW5tYXBwZWQiOyAvLyROT04tTkxTLTEkICAKLQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9PTkVfVE9fT05FXzFfRElSID0gUFJFICsgIm9uZV90b19vbmVfMV9kaXJfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9PTkVfVE9fTUFOWV8xX0RJUiA9IFBSRSArICJvbmVfdG9fbWFueV8xX2Rpcl9yZWxhdGlvbiI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01BTllfVE9fT05FXzFfRElSID0gUFJFICsgIm1hbnlfdG9fb25lXzFfZGlyX3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJCAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01BTllfVE9fTUFOWV8xX0RJUiA9IFBSRSArICJtYW55X3RvX21hbnlfMV9kaXJfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX09ORV9UT19PTkVfMl9ESVIgPSBQUkUgKyAib25lX3RvX29uZV8yX2Rpcl9yZWxhdGlvbiI7IAkJCS8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01BTllfVE9fT05FXzJfRElSID0gUFJFICsgIm1hbnlfdG9fb25lXzJfZGlyX3JlbGF0aW9uIjsgCQkJLy8kTk9OLU5MUy0xJCAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX01BTllfVE9fTUFOWV8yX0RJUiA9IFBSRSArICJtYW55X3RvX21hbnlfMl9kaXJfcmVsYXRpb24iOyAJCQkvLyROT04tTkxTLTEkCi0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TQVZFID0gUFJFICsgInNhdmUiOyAJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9SRVNUT1JFID0gUFJFICsgInJlc3RvcmUiOyAJCQkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9TQVZFX0FORF9SRU1PVkUgPSBQUkUgKyAic2F2ZV9hbmRfcmVtb3ZlIjsgCQkJLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRk9MREVSX0ZPUl9JTUcgPSAiaWNvbnMvIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgcHVibGljIEpQQUVkaXRvckltYWdlUHJvdmlkZXIoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkQXZhaWxhYmxlSW1hZ2VzKCkgeyAgICAgICAgCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9CQVNJQywgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvYmFzaWMuZ2lmIik7CQkJCQkJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChKUEFfRU5USVRZLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9lbnRpdHkuZ2lmIik7CQkJCQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoQUREX0pQQV9FTlRJVFksIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L2FkZF9lbnRpdHkuZ2lmIik7CQkJCQkvLyROT04tTkxTLTEkICAgICAgICAKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChBRERfSU5IRVJJVEVEX0VOVElUWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvbWFwcGVkLXN1cGVyY2xhc3MuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChQUklNQVJZX0tFWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvaWQuZ2lmIik7CQkJCQkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKEFERF9BVFRSSUJVVEUsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L2FkZF9hdHRyaWJ1dGUuZ2lmIik7CQkJLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKFJFTU9WRV9BVFRSSUJVVEUsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L3JlbW92ZV9hdHRyaWJ1dGUuZ2lmIik7CS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX09ORV9UT19PTkUsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L29uZS10by1vbmUuZ2lmIik7CQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9PTkVfVE9fTUFOWSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvb25lLXRvLW1hbnkuZ2lmIik7CQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9NQU5ZX1RPX09ORSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvbWFueS10by1vbmUuZ2lmIik7CQkvLyROT04tTkxTLTEkCi0gICAgICAgIGFkZEltYWdlRmlsZVBhdGgoSUNPTl9NQU5ZX1RPX01BTlksIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L21hbnktdG8tbWFueS5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX0VNQkVEREVEX0lELCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9lbWJlZGRlZC1pZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fVkVSU0lPTiwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvdmVyc2lvbi5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fVFJBTlNJRU5ULCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC90cmFuc2llbnQuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX0VNQkVEREVELCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9lbWJlZGRlZC5naWYiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fVU5NQVBQRUQsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAiZW50L251bGwtYXR0cmlidXRlLW1hcHBpbmcuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fT05FX1RPX09ORV8xX0RJUiwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvb25lLXRvLW9uZS0xLWRpci5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX09ORV9UT19NQU5ZXzFfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9vbmUtdG8tbWFueS0xLWRpci5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX01BTllfVE9fT05FXzFfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW9uZS0xLWRpci5naWYiKTsJCS8vJE5PTi1OTFMtMSQgICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fTUFOWV9UT19NQU5ZXzFfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW1hbnktMS1kaXIuZ2lmIik7CQkvLyROT04tTkxTLTEkCi0gICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fT05FX1RPX09ORV8yX0RJUiwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJlbnQvb25lLXRvLW9uZS0yLWRpci5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX01BTllfVE9fT05FXzJfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW9uZS0yLWRpci5naWYiKTsJCS8vJE5PTi1OTFMtMSQgICAgICAgIAotICAgICAgICBhZGRJbWFnZUZpbGVQYXRoKElDT05fTUFOWV9UT19NQU5ZXzJfRElSLCBST09UX0ZPTERFUl9GT1JfSU1HICsgImVudC9tYW55LXRvLW1hbnktMi1kaXIuZ2lmIik7CQkvLyROT04tTkxTLTEkICAgICAgICAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX1NBVkUsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAic2F2ZS5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX1JFU1RPUkUsIFJPT1RfRk9MREVSX0ZPUl9JTUcgKyAicmVzdG9yZS5naWYiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAgICAgYWRkSW1hZ2VGaWxlUGF0aChJQ09OX1NBVkVfQU5EX1JFTU9WRSwgUk9PVF9GT0xERVJfRk9SX0lNRyArICJzYXZlX2FuZF9yZW1vdmUuZ2lmIik7CQkvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDcwZWVkNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEb3VibGVDbGlja0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JUGljdG9ncmFtRWxlbWVudENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkNyZWF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkRlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLlJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLklDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmludGVybmFsLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5iYXNlLlBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGFsZXR0ZS5JUGFsZXR0ZUNvbXBhcnRtZW50RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGFsZXR0ZS5JVG9vbEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnBhbGV0dGUuaW1wbC5QYWxldHRlQ29tcGFydG1lbnRFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wbGF0Zm9ybS5JUGxhdGZvcm1JbWFnZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS50Yi5Db250ZXh0QnV0dG9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuQ29udGV4dEVudHJ5SGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLkNvbnRleHRNZW51RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuRGVmYXVsdFRvb2xCZWhhdmlvclByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklDb250ZXh0QnV0dG9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSUNvbnRleHRCdXR0b25QYWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklDb250ZXh0TWVudUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudGIuSW1hZ2VEZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZhY2FkZS5FY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkQWxsRW50aXRpZXNGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Db2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQ29sbGFwc2VFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGVsZXRlSlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkRpc2NhcmRBbmRSZW1vdmVBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5FeHBhbmRBbGxFbnRpdGllc0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5FeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkV4cGFuZEVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5Nb3ZlRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLk9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5PcGVuTWluaWF0dXJlVmlld0ZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVuYW1lRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlc3RvcmVFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlNhdmVFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51aS5KUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuR3JhcGhpY3NVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlciBleHRlbmRzIERlZmF1bHRUb29sQmVoYXZpb3JQcm92aWRlciB7Ci0KLQlwcml2YXRlIElFY2xpcHNlRmFjYWRlIGZhY2FkZTsKLQotICAgIHB1YmxpYyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcihJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHApIHsKLSAgICAJdGhpcyhkdHAsIEVjbGlwc2VGYWNhZGUuSU5TVEFOQ0UpOwotICAgIH0KLQotICAgIHB1YmxpYyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcihJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAsIElFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUpIHsKLSAgICAgICAgc3VwZXIoZHRwKTsKLSAgICAgICAgdGhpcy5mYWNhZGUgPSBlY2xpcHNlRmFjYWRlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUNvbnRleHRCdXR0b25QYWREYXRhIGdldENvbnRleHRCdXR0b25QYWQoSVBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgSUNvbnRleHRCdXR0b25QYWREYXRhIGRhdGEgPSBzdXBlci5nZXRDb250ZXh0QnV0dG9uUGFkKGNvbnRleHQpOyAgICAgICAgCi0gICAgICAgIENvbnRhaW5lclNoYXBlIGNzID0gbnVsbDsKLSAgICAgICAgCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSAoKFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KSBjb250ZXh0KS5nZXRQaWN0b2dyYW1FbGVtZW50KCk7Ci0gICAgICAgIAkgIE9iamVjdCBvYiA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0gICAgICAJCWlmIChvYiA9PSBudWxsKXsKLSAgICAgIAkJCXJldHVybiBudWxsOwotICAgICAgICAgICB9Ci0gICAgICAgIAlpZiAocGUgaW5zdGFuY2VvZiBDb250YWluZXJTaGFwZSkgewotICAgICAgICAgICAgCWNzID0gKENvbnRhaW5lclNoYXBlKXBlOwotICAgICAgICAgICAgCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gY3MuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLSAgICAgICAgICAgIAlpZiAoZ2EgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHsKLSAgICAgICAgICAgIAkJTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gZ2FzID0gKChSZWN0YW5nbGUpZ2EpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAgICAgICAgIAkJaWYgKChnYXMuc2l6ZSgpID4gMCkgJiYgKGdhcy5nZXQoMCkgaW5zdGFuY2VvZiBUZXh0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0R2VuZXJpY0NvbnRleHRCdXR0b25zKGRhdGEsIHBlLCAwKTsgICAgICAgICAgICAJCQkKLSAgICAgICAgICAgIAkJCUNsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0ID0gZ2V0Q29uY3JldGVGZWF0dXJlUHJvdmlkZXIoKQotCQkJCQkJCQkuZ2V0Q2xpY2tSZW1vdmVBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKCk7Ci0gICAgICAgICAgICAJCQlEZWxldGVDb250ZXh0IGRlbEN0eCA9IG5ldyBEZWxldGVDb250ZXh0KGNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHRCdXR0b25FbnRyeSBidG4gPSAgbmV3IENvbnRleHRCdXR0b25FbnRyeShmZWF0LCBkZWxDdHgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGVsZXRlQXR0cmlidXRlQnV0dG9ubGFiZWwpOyAKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ0bi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVBdHRyaWJ1dGVCdXR0b25EZXNjcmlwdGlvbik7IAotICAgICAgICAgICAgICAgICAgICAgICAgYnRuLnNldEljb25JZChJUGxhdGZvcm1JbWFnZUNvbnN0YW50cy5JTUdfRURJVF9ERUxFVEUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXREb21haW5TcGVjaWZpY0NvbnRleHRCdXR0b25zKCkuYWRkKGJ0bik7ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7IAotICAgICAgICAgICAgCQl9Ci0gICAgICAgICAgICAJfSAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgCQkKLSAgICAgICAgCX0gZWxzZSB7Ci0gICAgICAgIAkJcmV0dXJuIGRhdGE7Ci0gICAgICAgIAl9Ci0gICAgICAgIAkKLQkJc2V0R2VuZXJpY0NvbnRleHRCdXR0b25zKGRhdGEsIHBlLCBDT05URVhUX0JVVFRPTl9ERUxFVEUKLQkJCQl8IENPTlRFWFRfQlVUVE9OX1JFTU9WRSk7Ci0JCUxpc3Q8SUNvbnRleHRCdXR0b25FbnRyeT4gYnV0dG9ucyA9IGRhdGEuZ2V0R2VuZXJpY0NvbnRleHRCdXR0b25zKCk7Ci0JCUl0ZXJhdG9yPElDb250ZXh0QnV0dG9uRW50cnk+IGJ0bnNJdCA9IGJ1dHRvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJ0bnNJdC5oYXNOZXh0KCkpIHsKLQkJCUlDb250ZXh0QnV0dG9uRW50cnkgYnV0dG9uID0gYnRuc0l0Lm5leHQoKTsKLQkJCWlmIChidXR0b24uZ2V0RmVhdHVyZSgpIGluc3RhbmNlb2YgUmVtb3ZlSlBBRW50aXR5RmVhdHVyZSkgewotCQkJCWJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUVudGl0eUZyb21EaWFncmFtQnV0dG9uTGFiZWwpOwotCQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVFbnRpdHlGcm9tRGlhZ3JhbUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCX0gZWxzZSBpZiAoYnV0dG9uLmdldEZlYXR1cmUoKSBpbnN0YW5jZW9mIERlbGV0ZUpQQUVudGl0eUZlYXR1cmUpIHsKLQkJCQlidXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kZWxldGVFbnRpdHlGcm9tTW9kZWxCdXR0b25MYWJlbCk7Ci0JCQkJYnV0dG9uLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2RlbGV0ZUVudGl0eUZyb21Nb2RlbEJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCi0JCUNvbnRleHRCdXR0b25FbnRyeSBidXR0b24gPSBudWxsOwotCQlpZiAoY29udGV4dCBpbnN0YW5jZW9mIFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KSB7Ci0KLQkJCUNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZSBmZWF0dXJlID0gZ2V0Q29uY3JldGVGZWF0dXJlUHJvdmlkZXIoKS5nZXRDbGlja0FkZEF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmUoKTsKLQkJCUNyZWF0ZUNvbnRleHQgY3JlYXRlQ3R4ID0gbmV3IENyZWF0ZUNvbnRleHQoKTsKLQkJCWNyZWF0ZUN0eC5zZXRUYXJnZXRDb250YWluZXIoY3MpOwotCQkJYnV0dG9uID0gbmV3IENvbnRleHRCdXR0b25FbnRyeShmZWF0dXJlLCBjcmVhdGVDdHgpOwotCQkJYnV0dG9uLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY3JlYXRlQXR0cmlidXRlQnV0dG9ubGFiZWwpOwotCQkJYnV0dG9uLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NyZWF0ZUF0dHJpYnV0ZUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCWJ1dHRvbi5zZXRJY29uSWQoSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5BRERfQVRUUklCVVRFKTsKLQkJCWRhdGEuZ2V0RG9tYWluU3BlY2lmaWNDb250ZXh0QnV0dG9ucygpLmFkZChidXR0b24pOwotCi0JCQlQaWN0b2dyYW1FbGVtZW50Q29udGV4dCBjID0gKFBpY3RvZ3JhbUVsZW1lbnRDb250ZXh0KSBjb250ZXh0OwotCQkJUmVtb3ZlQW5kU2F2ZUVudGl0eUZlYXR1cmUgZnQyID0gbmV3IFJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCVJlbW92ZUNvbnRleHQgcmVtQ3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoYy5nZXRQaWN0b2dyYW1FbGVtZW50KCkpOwotCQkJYnV0dG9uID0gbmV3IENvbnRleHRCdXR0b25FbnRyeShmdDIsIHJlbUN0eCk7Ci0JCQlidXR0b24uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbmRTYXZlQnV0dG9uVGV4dCk7Ci0JCQlidXR0b24uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kU2F2ZUJ1dHRvbkRlc2NyaXB0aW9uKTsKLQkJCWJ1dHRvbi5zZXRJY29uSWQoSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX1NBVkVfQU5EX1JFTU9WRSk7Ci0JCQlkYXRhLmdldERvbWFpblNwZWNpZmljQ29udGV4dEJ1dHRvbnMoKS5hZGQoYnV0dG9uKTsKLQotCQkJU2F2ZUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgU2F2ZUVudGl0eUZlYXR1cmUoZ2V0Q29uY3JldGVGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCQlDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQljdHguc2V0UGljdG9ncmFtRWxlbWVudHMobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IGMuZ2V0UGljdG9ncmFtRWxlbWVudCgpIH0pOwotCQkJYnV0dG9uID0gbmV3IENvbnRleHRCdXR0b25FbnRyeShmdCwgY3R4KTsKLQkJCWJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVCdXR0b25UZXh0KTsKLQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9zYXZlQnV0dG9uRGVzY3JpcHRpb24pOwotCQkJYnV0dG9uLnNldEljb25JZChKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fU0FWRSk7Ci0JCQlkYXRhLmdldERvbWFpblNwZWNpZmljQ29udGV4dEJ1dHRvbnMoKS5hZGQoYnV0dG9uKTsKLQotCQkJUmVzdG9yZUVudGl0eUZlYXR1cmUgZnQxID0gbmV3IFJlc3RvcmVFbnRpdHlGZWF0dXJlKGdldENvbmNyZXRlRmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQoKTsKLQkJCWN0eC5zZXRQaWN0b2dyYW1FbGVtZW50cyhuZXcgUGljdG9ncmFtRWxlbWVudFtdIHsgYy5nZXRQaWN0b2dyYW1FbGVtZW50KCkgfSk7Ci0JCQlidXR0b24gPSBuZXcgQ29udGV4dEJ1dHRvbkVudHJ5KGZ0MSwgY3R4KTsKLQkJCWJ1dHRvbi5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Jlc3RvcmVCdXR0b25UZXh0KTsKLQkJCWJ1dHRvbi5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZXN0b3JlQnV0dG9uRGVzY3JpcHRpb24pOwotCQkJYnV0dG9uLnNldEljb25JZChKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fUkVTVE9SRSk7Ci0JCQlkYXRhLmdldERvbWFpblNwZWNpZmljQ29udGV4dEJ1dHRvbnMoKS5hZGQoYnV0dG9uKTsKLQotCQkJY3R4ID0gbmV3IEN1c3RvbUNvbnRleHQobmV3IFBpY3RvZ3JhbUVsZW1lbnRbXSB7IHBlIH0pOwotCQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQkJCUlDdXN0b21GZWF0dXJlW10gY3VzdG9tRmVhdHVyZXMgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0Q3VzdG9tRmVhdHVyZXMoY3R4KTsKLQkJCWludCBmZWF0dXJlQ291bnQgPSBjdXN0b21GZWF0dXJlcy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVDb3VudDsgaSsrKSB7Ci0JCQkJSUN1c3RvbUZlYXR1cmUgY3VzdG9tRmVhdHVyZSA9IGN1c3RvbUZlYXR1cmVzW2ldOwotCQkJCWlmIChjdXN0b21GZWF0dXJlLmlzQXZhaWxhYmxlKGN0eCkpIHsKLQkJCQkJaWYgKChjdXN0b21GZWF0dXJlIGluc3RhbmNlb2YgQ29sbGFwc2VFbnRpdHlGZWF0dXJlKSkgewotCQkJCQkJSUNvbnRleHRCdXR0b25FbnRyeSBjb250ZXh0QnV0dG9uID0gQ29udGV4dEVudHJ5SGVscGVyCi0JCQkJCQkJCS5jcmVhdGVDb2xsYXBzZUNvbnRleHRCdXR0b24odHJ1ZSwgY3VzdG9tRmVhdHVyZSwgY3R4KTsKLQkJCQkJCWRhdGEuc2V0Q29sbGFwc2VDb250ZXh0QnV0dG9uKGNvbnRleHRCdXR0b24pOwotCQkJCQl9IGVsc2UgaWYgKChjdXN0b21GZWF0dXJlIGluc3RhbmNlb2YgRXhwYW5kRW50aXR5RmVhdHVyZSkpIHsKLQkJCQkJCUlDb250ZXh0QnV0dG9uRW50cnkgY29udGV4dEJ1dHRvbiA9IENvbnRleHRFbnRyeUhlbHBlcgotCQkJCQkJCQkuY3JlYXRlQ29sbGFwc2VDb250ZXh0QnV0dG9uKGZhbHNlLAljdXN0b21GZWF0dXJlLCBjdHgpOwotCQkJCQkJZGF0YS5zZXRDb2xsYXBzZUNvbnRleHRCdXR0b24oY29udGV4dEJ1dHRvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBkYXRhOwotICAgIH0KLQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJUGFsZXR0ZUNvbXBhcnRtZW50RW50cnlbXSBnZXRQYWxldHRlKCkgewotICAgICAgICBMaXN0PElQYWxldHRlQ29tcGFydG1lbnRFbnRyeT4gcmV0ID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8SVBhbGV0dGVDb21wYXJ0bWVudEVudHJ5PigpOwotICAgICAgICBJUGFsZXR0ZUNvbXBhcnRtZW50RW50cnlbXSBzdXBlckNvbXBhcnRtZW50cyA9Ci0gICAgICAgICAgICBzdXBlci5nZXRQYWxldHRlKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJDb21wYXJ0bWVudHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgCVN0cmluZyBuZXdMYWJlbCA9IChzdXBlckNvbXBhcnRtZW50c1tpXS5nZXRMYWJlbCgpLmVxdWFscygiT2JqZWN0cyIpID8gLy8kTk9OLU5MUy0xJAotICAgICAgICAJCQlKUEFFZGl0b3JNZXNzYWdlcy5QYWxldHRlQ29tcGFydG1lbnRfT2JqZWN0cyA6IAotICAgICAgICAJCQkJSlBBRWRpdG9yTWVzc2FnZXMuUGFsZXR0ZUNvbXBhcnRtZW50X0Nvbm5lY3Rpb25zKTsgCi0gICAgICAgIAlQYWxldHRlQ29tcGFydG1lbnRFbnRyeSBlbnRyeSA9IG5ldyBQYWxldHRlQ29tcGFydG1lbnRFbnRyeShuZXdMYWJlbCwgc3VwZXJDb21wYXJ0bWVudHNbaV0uZ2V0SWNvbklkKCkpOyAgICAgICAKLSAgICAgICAgCUxpc3Q8SVRvb2xFbnRyeT4gbHN0ID0gc3VwZXJDb21wYXJ0bWVudHNbaV0uZ2V0VG9vbEVudHJpZXMoKTsKLSAgICAgICAgCUl0ZXJhdG9yPElUb29sRW50cnk+IGl0ID0gbHN0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIAl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgCQllbnRyeS5hZGRUb29sRW50cnkoaXQubmV4dCgpKTsKLSAgICAgICAgCX0KLSAgICAgICAgCXJldC5hZGQoZW50cnkpOwotICAgICAgICB9Ci0gICAgICAgIElQYWxldHRlQ29tcGFydG1lbnRFbnRyeSBlbiA9IHJldC5nZXQoMCk7Ci0gICAgICAgIHJldC5zZXQoMCwgcmV0LmdldCgxKSk7Ci0gICAgICAgIHJldC5zZXQoMSwgZW4pOwotICAgICAgICByZXR1cm4gcmV0LnRvQXJyYXkobmV3IElQYWxldHRlQ29tcGFydG1lbnRFbnRyeVtyZXQuc2l6ZSgpXSk7Ci0gICAgfQotICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElEZWNvcmF0b3JbXSBnZXREZWNvcmF0b3JzKFBpY3RvZ3JhbUVsZW1lbnQgcGUpIHsKLQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKTsKLQkJT2JqZWN0IGJvID0gZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSk7Ci0KLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcGVyc2lzdGVudFR5cGUgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBibzsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCk7Ci0JCQlpZighZmlsZS5leGlzdHMoKSl7Ci0JCQkJcmV0dXJuIG5ldyBJRGVjb3JhdG9yWzBdOwotCQkJfQotCQkJSU1hcmtlcltdIG1hcmtlcnMgPSBuZXcgSU1hcmtlclswXTsKLQkJCXRyeSB7Ci0JCQkJbWFya2VycyA9IGZpbGUuZmluZE1hcmtlcnMobnVsbCwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQlJRGVjb3JhdG9yW10gcmVzdWx0ID0gbmV3IElEZWNvcmF0b3JbMV07Ci0JCQkJaWYgKG1hcmtlcnMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybiBzdXBlci5nZXREZWNvcmF0b3JzKHBlKTsKLQkJCQlJTWFya2VyIG1hcmtlciA9IGdldEhpZ2hlc3RQcmlvTWFya2VyKG1hcmtlcnMpOwotCQkJCUltYWdlRGVjb3JhdG9yIGltYWdlUmVuZGVyaW5nRGVjb3JhdG9yID0gY3JlYXRlRGVjb3JhdG9yRnJvbU1hcmtlcihtYXJrZXIpOwotCQkJCWlmIChpbWFnZVJlbmRlcmluZ0RlY29yYXRvciAhPSBudWxsKSB7Ci0JCQkJCWltYWdlUmVuZGVyaW5nRGVjb3JhdG9yLnNldFgoNSAqIChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFdpZHRoKCkgLyA2KSk7Ci0JCQkJCWltYWdlUmVuZGVyaW5nRGVjb3JhdG9yLnNldFkoNSAqIChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpIC8gNikpOwotCQkJCQlyZXN1bHRbMF0gPSBpbWFnZVJlbmRlcmluZ0RlY29yYXRvcjsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdFswXSAhPSBudWxsKQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXREZWNvcmF0b3JzKHBlKTsKLQl9Ci0KLQlwcml2YXRlIElNYXJrZXIgZ2V0SGlnaGVzdFByaW9NYXJrZXIoSU1hcmtlcltdIG1hcmtlcnMpIHsKLQkJSU1hcmtlciByZXN1bHQgPSBtYXJrZXJzWzBdOwotCQlmb3IgKElNYXJrZXIgbWFya2VyIDogbWFya2VycykgewotCQkJdHJ5IHsKLQkJCQlmaW5hbCBJbnRlZ2VyIHJlc3VsdFNldmVyaXR5ID0gKEludGVnZXIpIHJlc3VsdC5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7Ci0JCQkJaWYgKHJlc3VsdFNldmVyaXR5ID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChJTWFya2VyLlNFVkVSSVRZX0VSUk9SID09IHJlc3VsdFNldmVyaXR5KQotCQkJCQkvLyByZXR1cm4gdGhlIGZpcnN0IGVycm9yIG1hcmtlcgotCQkJCQlicmVhazsKLQkJCQlJbnRlZ2VyIG1hcmtlclNldmVyaXR5ID0gKEludGVnZXIpIG1hcmtlci5nZXRBdHRyaWJ1dGUoSU1hcmtlci5TRVZFUklUWSk7Ci0JCQkJaWYgKChtYXJrZXJTZXZlcml0eSAhPSBudWxsKSAmJiAobWFya2VyU2V2ZXJpdHkgPiByZXN1bHRTZXZlcml0eSkpCi0JCQkJCXJlc3VsdCA9IG1hcmtlcjsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhlLmdldFN0YXR1cygpKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSW1hZ2VEZWNvcmF0b3IgY3JlYXRlRGVjb3JhdG9yRnJvbU1hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQl0cnkgewotCQkJSW50ZWdlciBzZXZlcml0eSA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFkpOwotCQkJU3RyaW5nIGRlY29yYXRvclR5cGUgPSBJUGxhdGZvcm1JbWFnZUNvbnN0YW50cy5JTUdfRUNMSVBTRV9JTkZPUk1BVElPTl9UU0s7Ci0JCQlpZiAoc2V2ZXJpdHkgIT0gbnVsbCkgewotCQkJCXN3aXRjaCAoc2V2ZXJpdHkpIHsKLQkJCQljYXNlIDA6Ci0JCQkJCWRlY29yYXRvclR5cGUgPSBJUGxhdGZvcm1JbWFnZUNvbnN0YW50cy5JTUdfRUNMSVBTRV9JTkZPUk1BVElPTl9UU0s7Ci0JCQkJY2FzZSAxOgotCQkJCQlkZWNvcmF0b3JUeXBlID0gSVBsYXRmb3JtSW1hZ2VDb25zdGFudHMuSU1HX0VDTElQU0VfV0FSTklOR19UU0s7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjoKLQkJCQkJZGVjb3JhdG9yVHlwZSA9IElQbGF0Zm9ybUltYWdlQ29uc3RhbnRzLklNR19FQ0xJUFNFX0VSUk9SX1RTSzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUltYWdlRGVjb3JhdG9yIGltYWdlUmVuZGVyaW5nRGVjb3JhdG9yID0gbmV3IEltYWdlRGVjb3JhdG9yKGRlY29yYXRvclR5cGUpOwotCQkJCWltYWdlUmVuZGVyaW5nRGVjb3JhdG9yLnNldE1lc3NhZ2UoKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpKTsKLQkJCQlyZXR1cm4gaW1hZ2VSZW5kZXJpbmdEZWNvcmF0b3I7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkKLSAgICBwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXAoR3JhcGhpY3NBbGdvcml0aG0gZ2EpIHsKLSAgICAJUGljdG9ncmFtRWxlbWVudCBwZSA9IGdhLmdldFBpY3RvZ3JhbUVsZW1lbnQoKTsKLSAgICAgICAgaWYgKCEoZ2EgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSAKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICBMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAgICAgaWYgKChjaCA9PSBudWxsKSB8fCAoY2guc2l6ZSgpID09IDApKSAKLSAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICBnYSA9IGNoLmdldCgwKTsKLSAgICAgICAgaWYgKCEoZ2EgaW5zdGFuY2VvZiBUZXh0KSkgCi0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgRm9udCBmID0gKChUZXh0KWdhKS5nZXRGb250KCk7Ci0gICAgICAgIGlmIChmID09IG51bGwpCi0gICAgICAgIAlyZXR1cm4gIiI7CQkvLyROT04tTkxTLTEkCi0gICAgICAgIGlmKGYuaXNJdGFsaWMoKSl7Ci0gICAgICAgIAlyZXR1cm4gZ2V0VG9vbFRpcEZvckNvbXBhcnRtZW50U2hhcGUoZ2EpOwotICAgIAl9Ci0gICAgICAgIAotICAgICAgICBPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpOwotCQlpZiAoYm8gIT0gbnVsbCkgewotCQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQkJU3RyaW5nIHN1cGVyUGVyc2lzdGVudFR5cGVOYW1lID0gbnVsbDsKLQkJCQlpZiAoKChKYXZhUGVyc2lzdGVudFR5cGUpIGJvKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJCQlzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSA9ICgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibykuZ2V0U3VwZXJQZXJzaXN0ZW50VHlwZSgpLmdldE5hbWUoKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2V0VG9vbHRpcFRleHQoKEphdmFQZXJzaXN0ZW50VHlwZSlibywgc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZXRUb29sdGlwVGV4dCgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpYm8pOwotCQkJCX0KLQkJCX0KLQkJfQotICAgICAgICBpZiAoIShwZSBpbnN0YW5jZW9mIFNoYXBlKSkgCi0gICAgICAgIAlyZXR1cm4gbnVsbDsKLSAgICAgICAgU2hhcGUgc2ggPSAoU2hhcGUpcGU7Ci0gICAgICAgIENvbnRhaW5lclNoYXBlIGNzaCA9IHNoLmdldENvbnRhaW5lcigpOwotICAgICAgICBpZiAoY3NoID09IG51bGwpIAotICAgICAgICAJcmV0dXJuIG51bGw7IAotICAgICAgICBibyA9IGdldEZlYXR1cmVQcm92aWRlcigpLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjc2gpOwotCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCVN0cmluZyBzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSA9IG51bGw7Ci0JCQlpZiAoKChKYXZhUGVyc2lzdGVudFR5cGUpIGJvKS5nZXRTdXBlclBlcnNpc3RlbnRUeXBlKCkgIT0gbnVsbCkgewotCQkJCXN1cGVyUGVyc2lzdGVudFR5cGVOYW1lID0gKChKYXZhUGVyc2lzdGVudFR5cGUpIGJvKQotCQkJCQkJLmdldFN1cGVyUGVyc2lzdGVudFR5cGUoKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZXRUb29sdGlwVGV4dCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBibywKLQkJCQkJc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUpOwotCQl9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRvb2xUaXBGb3JDb21wYXJ0bWVudFNoYXBlKEdyYXBoaWNzQWxnb3JpdGhtIGdhKSB7Ci0JCVRleHQgdHh0ID0gKFRleHQpIGdhOwotCQlDb250YWluZXJTaGFwZSBzaGFwZSA9IChDb250YWluZXJTaGFwZSkgR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWN0aXZlQ29udGFpbmVyUGUoZ2EpOwotCQkJaWYoR3JhcGhpY3NVcGRhdGVyLmlzQ29sbGFwc2VkKHNoYXBlKSkKLQkJCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQ29tcGFydFRvb2xUaXAsIHR4dC5nZXRWYWx1ZSgpKTsKLQkJCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUNvbXBhcnRUb29sVGlwLCB0eHQuZ2V0VmFsdWUoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIEpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBnZXRDb25jcmV0ZUZlYXR1cmVQcm92aWRlcigpIHsKLQkJcmV0dXJuIChKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpc3VwZXIuZ2V0RmVhdHVyZVByb3ZpZGVyKCk7CQkKLQl9Ci0JCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElDb250ZXh0TWVudUVudHJ5W10gZ2V0Q29udGV4dE1lbnUoSUN1c3RvbUNvbnRleHQgY29udGV4dCkgewotICAgIAlJQ3VzdG9tQ29udGV4dCBjdXN0b21Db250ZXh0ID0gKElDdXN0b21Db250ZXh0KWNvbnRleHQ7Ci0gICAgCVBpY3RvZ3JhbUVsZW1lbnRbXSBwaWN0RWxzID0gY3VzdG9tQ29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpOwotICAgIAkKLSAgICAJSUN1c3RvbUZlYXR1cmUgc2F2ZUVudGl0eUZlYXR1cmUgPSBuZXcgU2F2ZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlDb250ZXh0TWVudUVudHJ5IHNhdmVFbnRpdHlNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KHNhdmVFbnRpdHlGZWF0dXJlLCBjb250ZXh0KTsKLQkJc2F2ZUVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2F2ZU1lbnVJdGVtKTsKLQkJc2F2ZUVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3NhdmVNZW51SXRlbURlc2NyKTsKLQkJc2F2ZUVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotCQkKLQkJSUN1c3RvbUZlYXR1cmUgcmVzdG9yZUVudGl0eUZlYXR1cmUgPSBuZXcgUmVzdG9yZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlDb250ZXh0TWVudUVudHJ5IHJlc3RvcmVFbnRpdHlNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KHJlc3RvcmVFbnRpdHlGZWF0dXJlLCBjb250ZXh0KTsKLQkJcmVzdG9yZUVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZGlzY2FyZENoYW5nZXNNZW51SXRlbSk7Ci0JCXJlc3RvcmVFbnRpdHlNZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9kaXNjYXJkQ2hhbmdlc01lbnVJdGVtRGVzY3IpOwotCQlyZXN0b3JlRW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7CQkKLSAgICAJCi0JCUlDdXN0b21GZWF0dXJlIGNvbGxhcHNlRmVhdHVyZSA9IG5ldyBDb2xsYXBzZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlDb250ZXh0TWVudUVudHJ5IGNvbGxhcHNlRW50aXR5TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjb2xsYXBzZUZlYXR1cmUsIGNvbnRleHQpOwotCQljb2xsYXBzZUVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbSk7Ci0JCWNvbGxhcHNlRW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VFbnRpdHlNZW51SXRlbURlc2NyKTsKLQkJY29sbGFwc2VFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLQkJCi0JCUlDdXN0b21GZWF0dXJlIGNvbGxhcHNlQWxsRmVhdHVyZSA9IG5ldyBDb2xsYXBzZUFsbEVudGl0aWVzRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUNvbnRleHRNZW51RW50cnkgY29sbGFwc2VBbGxNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGNvbGxhcHNlQWxsRmVhdHVyZSwgY29udGV4dCk7Ci0JCWNvbGxhcHNlQWxsTWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUFsbEVudGl0aWVzTWVudUl0ZW0pOwotCQljb2xsYXBzZUFsbE1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2NvbGxhcHNlQWxsRW50aXRpZXNNZW51SXRlbURlc2NyKTsKLQkJY29sbGFwc2VBbGxNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsJCQotCi0JCUlDdXN0b21GZWF0dXJlIGV4cGFuZEZlYXR1cmUgPSBuZXcgRXhwYW5kRW50aXR5RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0JCUNvbnRleHRNZW51RW50cnkgZXhwYW5kRW50aXR5TWVudUl0ZW09IG5ldyBDb250ZXh0TWVudUVudHJ5KGV4cGFuZEZlYXR1cmUsIGNvbnRleHQpOwotCQlleHBhbmRFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEVudGl0eU1lbnVJdGVtKTsKLQkJZXhwYW5kRW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kRW50aXR5bWVudUl0ZW1EZXNjcik7Ci0JCWV4cGFuZEVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotCQkKLQkJSUN1c3RvbUZlYXR1cmUgZXhwYW5kQWxsRmVhdHVyZSA9IG5ldyBFeHBhbmRBbGxFbnRpdGllc0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQlDb250ZXh0TWVudUVudHJ5IGV4cGFuZEFsbE1lbnVJdGVtPSBuZXcgQ29udGV4dE1lbnVFbnRyeShleHBhbmRBbGxGZWF0dXJlLCBjb250ZXh0KTsKLQkJZXhwYW5kQWxsTWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9leHBhbmRBbGxFbnRpdGllc01lbnVJdGVtKTsKLQkJZXhwYW5kQWxsTWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQWxsRW50aXRpZXNNZW51SXRlbURlc2NyKTsKLQkJZXhwYW5kQWxsTWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7CQkKLQotICAgICAgICBJQ3VzdG9tRmVhdHVyZSBvcGVuSlBBRGV0YWlsc1ZpZXdGZWF0dXJlID0gbmV3IE9wZW5KUEFEZXRhaWxzVmlld0ZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotICAgICAgICBDb250ZXh0TWVudUVudHJ5IG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkob3BlbkpQQURldGFpbHNWaWV3RmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3BlbkpQQURldGFpbHNWaWV3KTsKLSAgICAgICAgb3BlbkpQQURldGFpbHNWaWV3TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3BlbkpQQURldGFpbHNWaWV3RGVzYyk7Ci0gICAgICAgIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAKLSAgICAgICAgSUN1c3RvbUZlYXR1cmUgb3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlID0gbmV3IE9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgICAgIENvbnRleHRNZW51RW50cnkgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KG9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9vcGVuTWluaWF0dXJlVmlldyk7Ci0gICAgICAgIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfb3Blbk1pbmlhdHVyZVZpZXdEZXNjKTsKLSAgICAgICAgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsKLSAgICAgICAgCi0gICAgICAgIGJvb2xlYW4gaXNFbXB0eSA9IHRydWU7Ci0gICAgICAgIENvbnRleHRNZW51RW50cnkgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51ID0gbnVsbDsKLSAgICAgICAgaWYoZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKS5nZXRDaGlsZHJlbigpLnNpemUoKSE9MCl7Ci0gICAgICAgIGlzRW1wdHkgPSBmYWxzZTsKLSAgICAgICAgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51ID0gbmV3IENvbnRleHRNZW51RW50cnkobnVsbCwgbnVsbCk7Ci0gICAgICAgIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFsbEVudGl0aWVzTWVudSk7Ci0gICAgICAgIHJlbW92ZUFsbEVudGl0aWVzU3VibWVudS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZW1vdmVBbGxFbnRpdGllc01lbnUpOwotICAgICAgICByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUuc2V0U3VibWVudSh0cnVlKTsKLQkJCi0gICAgICAgIElDdXN0b21GZWF0dXJlIGN1c3RvbUZlYXR1cmUgPSBuZXcgU2F2ZUFuZFJlbW92ZUFsbEVudGl0aWVzRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgIAkKLSAgICAgICAgQ29udGV4dE1lbnVFbnRyeSBzYXZlQW5kUmVtb3ZFbnRpdHlNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGN1c3RvbUZlYXR1cmUsIGNvbnRleHQpOwotICAgICAgICBzYXZlQW5kUmVtb3ZFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVBbGxFbnRpdGllc0FjdGlvbik7Ci0gICAgICAgIHNhdmVBbmRSZW1vdkVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbW92ZUFuZFNhdmVBbGxFbnRpdGllc0FjdGlvbik7Ci0gICAgICAgIHNhdmVBbmRSZW1vdkVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAKLQkJY3VzdG9tRmVhdHVyZSA9IG5ldyBEaXNjYXJkQW5kUmVtb3ZlQWxsRW50aXRpZXNGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsgICAgCQotICAgICAgICBDb250ZXh0TWVudUVudHJ5IGRpc2NhcmRBbmRSZW1vdkVudGl0eU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY3VzdG9tRmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgIGRpc2NhcmRBbmRSZW1vdkVudGl0eU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQWN0aW9uKTsKLSAgICAgICAgZGlzY2FyZEFuZFJlbW92RW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVtb3ZlQW5kRGlzY2FyZEFsbEVudGl0aWVzQWN0aW9uKTsKLSAgICAgICAgZGlzY2FyZEFuZFJlbW92RW50aXR5TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgIAotICAgICAgICByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUuYWRkKHNhdmVBbmRSZW1vdkVudGl0eU1lbnVJdGVtKTsKLSAgICAgICAgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LmFkZChkaXNjYXJkQW5kUmVtb3ZFbnRpdHlNZW51SXRlbSk7Ci0gICAgICAgIAotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0KLSAgICAJaWYgKChwaWN0RWxzID09IG51bGwpIHx8IChwaWN0RWxzLmxlbmd0aCA9PSAwKSkgCi0gICAgCQlyZXR1cm4gbmV3IElDb250ZXh0TWVudUVudHJ5W10geyBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbSB9OwotICAgIAlpZiAocGljdEVsc1swXSBpbnN0YW5jZW9mIENvbnRhaW5lclNoYXBlKSB7Ci0gICAgCQlPYmplY3Qgb2IgPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGljdEVsc1swXSk7Ci0gICAgICAgICAgICBpZiAocGljdEVsc1swXSBpbnN0YW5jZW9mIERpYWdyYW0pIHsKLSAgICAgICAgICAgIAlJQ3VzdG9tRmVhdHVyZSBjdXN0b21GZWF0dXJlID0gbmV3IEFkZEFsbEVudGl0aWVzRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7ICAgIAkKLSAgICAgICAgICAgICAgICBDb250ZXh0TWVudUVudHJ5IHNob3dBbGxFbnRzTWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjdXN0b21GZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBzaG93QWxsRW50c01lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfc2hvd0FsbFRoZUVudGl0aWVzKTsKLSAgICAgICAgICAgICAgICBzaG93QWxsRW50c01lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3Nob3dBbGxUaGVFbnRpdGllc0Rlc2MpOwotICAgICAgICAgICAgICAgIHNob3dBbGxFbnRzTWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0gICAgICAgICAgICAgICAgaWYoaXNFbXB0eSl7Ci0gICAgICAgICAgICAgICAgCXJldHVybiBuZXcgSUNvbnRleHRNZW51RW50cnlbXSB7IHNob3dBbGxFbnRzTWVudUl0ZW0sCi0gICAgICAgICAgICAgICAgCQkJIGNvbGxhcHNlQWxsTWVudUl0ZW0sCi0gICAgICAgICAgICAgICAgCQkJIGV4cGFuZEFsbE1lbnVJdGVtLAotCQkJCQkJCSBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbSwKLQkJCQkJCQkgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbX07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElDb250ZXh0TWVudUVudHJ5W10geyBzaG93QWxsRW50c01lbnVJdGVtLCAKLSAgICAgICAgICAgICAgICAJCQkJCQkJCSByZW1vdmVBbGxFbnRpdGllc1N1Ym1lbnUsCi0gICAgICAgICAgICAgICAgCQkJCQkJCQkgY29sbGFwc2VBbGxNZW51SXRlbSwKLSAgICAgICAgICAgICAgICAJCQkJCQkJCSBleHBhbmRBbGxNZW51SXRlbSwKLSAgICAgICAgICAgICAgICAJCQkJCQkJCSBvcGVuSlBBRGV0YWlsc1ZpZXdNZW51SXRlbSwKLSAgICAgICAgICAgICAgICAJCQkJCQkJCSBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIAl9ICAgIAotICAgICAgICAgICAgaWYoKG9iID09IG51bGwpICYmIChwaWN0RWxzWzBdLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKXsKLSAgICAgICAgICAgIAlJQ3VzdG9tRmVhdHVyZSBjb2xsYXBzZUNvbXBhcnRtZW50RmVhdHVyZSA9IG5ldyBDb2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsKLSAgICAgICAgCQlDb250ZXh0TWVudUVudHJ5IGNvbGxhcHNlQ29tcGFydG1lbnRNZW51SXRlbSA9IG5ldyBDb250ZXh0TWVudUVudHJ5KGNvbGxhcHNlQ29tcGFydG1lbnRGZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgCQljb2xsYXBzZUNvbXBhcnRtZW50TWVudUl0ZW0uc2V0VGV4dChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9jb2xsYXBzZUF0dHJHcm91cE1lbnVJdGVtKTsKLSAgICAgICAgCQljb2xsYXBzZUNvbXBhcnRtZW50TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfY29sbGFwc2VBdHRyR3JvdXBNZW51SXRlbURlc2NyKTsKLSAgICAgICAgCQljb2xsYXBzZUNvbXBhcnRtZW50TWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7Ci0KLSAgICAgICAgCQlJQ3VzdG9tRmVhdHVyZSBleHBhbmRDb21wYXJ0bWVudEZlYXR1cmUgPSBuZXcgRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotICAgICAgICAJCUNvbnRleHRNZW51RW50cnkgZXhwYW5kQ29tcGFydG1lbnRNZW51SXRlbT0gbmV3IENvbnRleHRNZW51RW50cnkoZXhwYW5kQ29tcGFydG1lbnRGZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgCQlleHBhbmRDb21wYXJ0bWVudE1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfZXhwYW5kQXR0ck1lbnVJdGVtKTsKLSAgICAgICAgCQlleHBhbmRDb21wYXJ0bWVudE1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2V4cGFuZEF0dHJNZW51SXRlbURlc2NyKTsKLSAgICAgICAgCQlleHBhbmRDb21wYXJ0bWVudE1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAJCXJldHVybiBuZXcgSUNvbnRleHRNZW51RW50cnlbXSB7Y29sbGFwc2VDb21wYXJ0bWVudE1lbnVJdGVtLCBleHBhbmRDb21wYXJ0bWVudE1lbnVJdGVtfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgIC8vQXBwbHkgUGF0dGVybiBtZW51Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIElDdXN0b21GZWF0dXJlIGFwcGx5UGF0dGVybkZlYXR1cmUgPSBuZXcgQXBwbHlQYXR0ZXJuRmVhdHVyZShnZXRGZWF0dXJlUHJvdmlkZXIoKSk7Ci0gICAgICAgICAgICBDb250ZXh0TWVudUVudHJ5IGFwcGx5UGF0dGVybk1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoYXBwbHlQYXR0ZXJuRmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgICAgICBhcHBseVBhdHRlcm5NZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX2FwcGx5UGF0dGVybik7Ci0gICAgICAgICAgICBhcHBseVBhdHRlcm5NZW51SXRlbS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9hcHBseVBhdHRlcm5EZXNjKTsKLSAgICAgICAgICAgIGFwcGx5UGF0dGVybk1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAgICAgLy9BcHBseSBQYXR0ZXJuIG1lbnUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgCi0gICAgICAgICAgICBDb250ZXh0TWVudUVudHJ5IHJlZmFjdG9yQ2xhc3NTdWJtZW51ID0gbmV3IENvbnRleHRNZW51RW50cnkobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICByZWZhY3RvckNsYXNzU3VibWVudS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlZmFjdG9yU3ViTWVudSk7Ci0gICAgICAgICAgICByZWZhY3RvckNsYXNzU3VibWVudS5zZXREZXNjcmlwdGlvbihKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcl9yZWZhY3RvclN1Yk1lbnUpOwotICAgICAgICAgICAgcmVmYWN0b3JDbGFzc1N1Ym1lbnUuc2V0U3VibWVudSh0cnVlKTsKLSAgICAgICAgICAgIAotICAgIAkJCi0gICAgICAgICAgICBJQ3VzdG9tRmVhdHVyZSBjdXN0b21GZWF0dXJlID0gbmV3IFJlbmFtZUVudGl0eUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAgICAJCi0gICAgICAgICAgICBDb250ZXh0TWVudUVudHJ5IHJlbmFtZUVudGl0eU1lbnVJdGVtID0gbmV3IENvbnRleHRNZW51RW50cnkoY3VzdG9tRmVhdHVyZSwgY29udGV4dCk7Ci0gICAgICAgICAgICByZW5hbWVFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbmFtZUVudGl0eUNsYXNzKTsKLSAgICAgICAgICAgIHJlbmFtZUVudGl0eU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlbmFtZUVudGl0eUNsYXNzKTsKLSAgICAgICAgICAgIHJlbmFtZUVudGl0eU1lbnVJdGVtLnNldFN1Ym1lbnUoZmFsc2UpOwotICAgICAgICAgICAgCi0gICAgCQljdXN0b21GZWF0dXJlID0gbmV3IE1vdmVFbnRpdHlGZWF0dXJlKGdldEZlYXR1cmVQcm92aWRlcigpKTsgICAgCQotICAgICAgICAgICAgQ29udGV4dE1lbnVFbnRyeSBtb3ZlRW50aXR5TWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjdXN0b21GZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIG1vdmVFbnRpdHlNZW51SXRlbS5zZXRUZXh0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX21vdmVFbnRpdHlDbGFzcyk7Ci0gICAgICAgICAgICBtb3ZlRW50aXR5TWVudUl0ZW0uc2V0RGVzY3JpcHRpb24oSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfbW92ZUVudGl0eUNsYXNzKTsKLSAgICAgICAgICAgIG1vdmVFbnRpdHlNZW51SXRlbS5zZXRTdWJtZW51KGZhbHNlKTsgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgcmVmYWN0b3JDbGFzc1N1Ym1lbnUuYWRkKHJlbmFtZUVudGl0eU1lbnVJdGVtKTsKLSAgICAgICAgICAgIHJlZmFjdG9yQ2xhc3NTdWJtZW51LmFkZChtb3ZlRW50aXR5TWVudUl0ZW0pOyAgCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIFN0cmluZyBzaGFwZVR5cGUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHBpY3RFbHNbMF0sIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoKHNoYXBlVHlwZSA9PSBudWxsKSB8fCAhc2hhcGVUeXBlLmVxdWFscyhTaGFwZVR5cGUuQVRUUklCVVRFLnRvU3RyaW5nKCkpKSAKLSAgICAgICAgICAgIAlyZXR1cm4gbmV3IElDb250ZXh0TWVudUVudHJ5W10geyBzYXZlRW50aXR5TWVudUl0ZW0sCi0gICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmYWN0b3JDbGFzc1N1Ym1lbnUsCi0gICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VFbnRpdHlNZW51SXRlbSwgCi0gICAgICAgICAgICAJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VBbGxNZW51SXRlbSwKLSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRFbnRpdHlNZW51SXRlbSwKLSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRBbGxNZW51SXRlbSwKLSAgICAgICAgICAgIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlRW50aXR5TWVudUl0ZW0sCi0gICAgICAgICAgICAJCQkJCQkJCQkgLy9hcHBseVBhdHRlcm5NZW51SXRlbSwgCi0gICAgICAgICAgICAJCQkJCQkJCQkgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LAotICAgICAgICAgICAgCQkJCQkJCQkJIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLAotICAgICAgICAgICAgCQkJCQkJCQkJIG9wZW5NaW5pYXR1cmVWaWV3TWVudUl0ZW19OwotICAgICAgICAgICAgCi0gICAgCQljdXN0b21GZWF0dXJlID0gbmV3IFJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmUoZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOyAgICAgCQkKLSAgICAgICAgICAgIENvbnRleHRNZW51RW50cnkgcmVmYWN0b3JBdHRyaWJ1dGVUeXBlTWVudUl0ZW0gPSBuZXcgQ29udGV4dE1lbnVFbnRyeShjdXN0b21GZWF0dXJlLCBjb250ZXh0KTsKLSAgICAgICAgICAgIHJlZmFjdG9yQXR0cmlidXRlVHlwZU1lbnVJdGVtLnNldFRleHQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJfcmVmYWN0b3JBdHRyaWJ1dGVUeXBlKTsKLSAgICAgICAgICAgIHJlZmFjdG9yQXR0cmlidXRlVHlwZU1lbnVJdGVtLnNldERlc2NyaXB0aW9uKEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyX3JlZmFjdG9yQXR0cmlidXRlVHlwZURlc2MpOwotICAgICAgICAgICAgcmVmYWN0b3JBdHRyaWJ1dGVUeXBlTWVudUl0ZW0uc2V0U3VibWVudShmYWxzZSk7ICAgICAgICAgICAgICAgICAgIAotCi0gICAgICAgIAlyZXR1cm4gbmV3IElDb250ZXh0TWVudUVudHJ5W10geyByZWZhY3RvckNsYXNzU3VibWVudSwgCi0gICAgICAgIAkJCQkJCQkJCSByZWZhY3RvckF0dHJpYnV0ZVR5cGVNZW51SXRlbSwgCi0gICAgICAgIAkJCQkJCQkJCSBjb2xsYXBzZUFsbE1lbnVJdGVtLAotICAgICAgICAJCQkJCQkJCQkgZXhwYW5kQWxsTWVudUl0ZW0sCi0gICAgICAgIAkJCQkJCQkJCSAvL2FwcGx5UGF0dGVybk1lbnVJdGVtLCAKLSAgICAgICAgCQkJCQkJCQkJIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLAotICAgICAgICAJCQkJCQkJCQkgb3Blbk1pbmlhdHVyZVZpZXdNZW51SXRlbX07Ci0gICAgCX0KLSAgICAJcmV0dXJuIG5ldyBJQ29udGV4dE1lbnVFbnRyeVtdIHsgcmVtb3ZlQWxsRW50aXRpZXNTdWJtZW51LAotICAgIAkJCQkJCQkJCSBjb2xsYXBzZUFsbE1lbnVJdGVtLAotICAgIAkJCQkJCQkJCSBleHBhbmRBbGxNZW51SXRlbSwgCi0gICAgCQkJCQkJCQkJIG9wZW5KUEFEZXRhaWxzVmlld01lbnVJdGVtLAotICAgIAkJCQkJCQkJCSBvcGVuTWluaWF0dXJlVmlld01lbnVJdGVtfTsKLSAgICB9Ci0KLQlAT3ZlcnJpZGUKLQlwdWJsaWMgSUN1c3RvbUZlYXR1cmUgZ2V0RG91YmxlQ2xpY2tGZWF0dXJlKElEb3VibGVDbGlja0NvbnRleHQgY29udGV4dCkgewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpWzBdOwotCQlPYmplY3QgYm8gPSBnZXRGZWF0dXJlUHJvdmlkZXIoKS5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoCi0JCQkJcGUpOwotCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBibzsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGpwYS5nZXRSZXNvdXJjZSgpOwotCQkJdHJ5IHsKLQkJCQlmaWxlLnNldFNlc3Npb25Qcm9wZXJ0eShuZXcgUXVhbGlmaWVkTmFtZShudWxsLCBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LkRPVUJMRV9DTElDSyksICJ0cnVlIik7CS8vJE5PTi1OTFMtMSQJCQkKLQkJCQlmYWNhZGUuZ2V0SURFKCkub3BlbkVkaXRvcihmaWxlKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3Qgb3BlbiBlZGl0b3IiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvcGVuIGVkaXRvciIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQkJCQkKLQkJCX0KLQkJfQotCQlpZiAoYm8gaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBibzsKLQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIGpwdC5nZXRSZXNvdXJjZSgpOwotCQkJdHJ5IHsKLQkJCQlmaWxlLnNldFNlc3Npb25Qcm9wZXJ0eShuZXcgUXVhbGlmaWVkTmFtZShudWxsLCBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5LkRPVUJMRV9DTElDSyksICJ0cnVlIik7CS8vJE5PTi1OTFMtMSQKLQkJCQlmYWNhZGUuZ2V0SURFKCkub3BlbkVkaXRvcihmaWxlKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3Qgb3BlbiBlZGl0b3IiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkJCQkKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvcGVuIGVkaXRvciIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJfQotCQl9Ci0JCWlmICgoYm8gPT0gbnVsbCkgJiYgKHBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkgaW5zdGFuY2VvZiBSZWN0YW5nbGUpKSB7Ci0JCQlJQ3VzdG9tQ29udGV4dCBjb250ID0gbmV3IEN1c3RvbUNvbnRleHQoCi0JCQkJCW5ldyBQaWN0b2dyYW1FbGVtZW50W10geyBwZSB9KTsKLQkJCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBwZTsKLQkJCWlmIChHcmFwaGljc1VwZGF0ZXIuaXNDb2xsYXBzZWQoY29udGFpbmVyU2hhcGUpKSB7Ci0JCQkJRXhwYW5kQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBFeHBhbmRDb21wYXJ0bWVudFNoYXBlRmVhdHVyZSgKLQkJCQkJCWdldEZlYXR1cmVQcm92aWRlcigpKTsKLQkJCQlmZWF0dXJlLmV4ZWN1dGUoY29udCk7Ci0JCQl9IGVsc2UgewotCQkJCUNvbGxhcHNlQ29tcGFydG1lbnRTaGFwZUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBDb2xsYXBzZUNvbXBhcnRtZW50U2hhcGVGZWF0dXJlKAotCQkJCQkJZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCQkJCWZlYXR1cmUuZXhlY3V0ZShjb250KTsKLQkJCX0KLQotCQl9Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXREb3VibGVDbGlja0ZlYXR1cmUoY29udGV4dCk7Ci0JfSAgIAkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvQWJzdHJhY3RSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9BYnN0cmFjdFJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjFmM2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9BYnN0cmFjdFJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RSZWxhdGlvbiBpbXBsZW1lbnRzIElSZWxhdGlvbiB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgU0VQQVJBVE9SID0gIjsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lcjsKLQlwcm90ZWN0ZWQgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2U7Ci0JcHJvdGVjdGVkIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCXByb3RlY3RlZCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCi0JcHJvdGVjdGVkIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBpbnZlcnNlQXR0cmlidXRlTmFtZTsKLQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlPFJlbFR5cGUsIFN0cmluZz4gcmVsVHlwZVRvSWRQYXJ0ID0gbmV3IEhhc2h0YWJsZTxSZWxUeXBlLCBTdHJpbmc+KCk7IAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgSGFzaHRhYmxlPFJlbERpciwgU3RyaW5nPiByZWxEaXJUb0lkUGFydCA9IG5ldyBIYXNodGFibGU8UmVsRGlyLCBTdHJpbmc+KCk7IAotCQotCXN0YXRpYyB7Ci0JCXJlbFR5cGVUb0lkUGFydC5wdXQoUmVsVHlwZS5PTkVfVE9fT05FLCAiMS0xIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVsVHlwZVRvSWRQYXJ0LnB1dChSZWxUeXBlLk9ORV9UT19NQU5ZLCAiMS1OIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVsVHlwZVRvSWRQYXJ0LnB1dChSZWxUeXBlLk1BTllfVE9fT05FLCAiTi0xIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVsVHlwZVRvSWRQYXJ0LnB1dChSZWxUeXBlLk1BTllfVE9fTUFOWSwgIk4tTiIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlyZWxEaXJUb0lkUGFydC5wdXQoUmVsRGlyLlVOSSwgIi0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVsRGlyVG9JZFBhcnQucHV0KFJlbERpci5CSSwgIjwtPiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBBYnN0cmFjdFJlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UpIHsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCQl0aGlzLmludmVyc2UgPSBpbnZlcnNlOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gZ2VuZXJhdGVJZChvd25lciwgaW52ZXJzZSwgZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCksIGdldFJlbFR5cGUoKSwgZ2V0UmVsRGlyKCkpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7IAotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEludmVyc2UoKSB7Ci0JCXJldHVybiBpbnZlcnNlOyAKLQl9CQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCBzZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLmludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyQXR0cmlidXRlTmFtZShTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lKSB7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldE93bmVyQXR0cmlidXRlTmFtZSgpIHsKLQkJaWYgKHRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgIT0gbnVsbCkKLQkJCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZS5nZXROYW1lKCk7Ci0JCXJldHVybiBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldEludmVyc2VBdHRyaWJ1dGVOYW1lKFN0cmluZyBpbnZlcnNlQXR0cmlidXRlTmFtZSkgewotCQl0aGlzLmludmVyc2VBdHRyaWJ1dGVOYW1lID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSB7Ci0JCWlmICh0aGlzLmludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUgIT0gbnVsbCkKLQkJCXJldHVybiBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlLmdldE5hbWUoKTsKLQkJcmV0dXJuIGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCX0KLQkKLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0SWQoKS5oYXNoQ29kZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyUmVsKSB7Ci0JCWlmICghSVJlbGF0aW9uLmNsYXNzLmlzSW5zdGFuY2Uob3RoZXJSZWwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0SWQoKS5lcXVhbHMoKChJUmVsYXRpb24pb3RoZXJSZWwpLmdldElkKCkpOwotCX0KLQkKLQlwdWJsaWMgYWJzdHJhY3QgUmVsVHlwZSBnZXRSZWxUeXBlKCk7IAotCQotCXB1YmxpYyBhYnN0cmFjdCBSZWxEaXIgZ2V0UmVsRGlyKCk7Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVJZChKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsIAotCQkJCQkJCQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSwKLQkJCQkJCQkJCVJlbFR5cGUgcmVsVHlwZSwgCi0JCQkJCQkJCQlSZWxEaXIgcmVsRGlyKSB7Ci0JCVN0cmluZyBpZCA9IG93bmVyLmdldE5hbWUoKSArICItIiArIGludmVyc2UuZ2V0TmFtZSgpICsgU0VQQVJBVE9SICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVsVHlwZVRvSWRQYXJ0LmdldChyZWxUeXBlKSArIFNFUEFSQVRPUiArCi0JCQkJCXJlbERpclRvSWRQYXJ0LmdldChyZWxEaXIpICsgU0VQQVJBVE9SICsgb3duZXJBdHRyaWJ1dGVOYW1lOyAKLQkJcmV0dXJuIGlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9CaWRpcmVjdGlvbmFsUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ZmJjMWYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9CaWRpcmVjdGlvbmFsUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIEJpZGlyZWN0aW9uYWxSZWxhdGlvbiBleHRlbmRzIElSZWxhdGlvbiB7Ci0JCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKTsgCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0lSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9JUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1Njg0Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL0lSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLQotcHVibGljIGludGVyZmFjZSBJUmVsYXRpb24gewotCi0JcHVibGljIHN0YXRpYyBlbnVtIFJlbFR5cGUgewotCQlPTkVfVE9fT05FLCBPTkVfVE9fTUFOWSwgTUFOWV9UT19PTkUsIE1BTllfVE9fTUFOWQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZW51bSBSZWxEaXIgewotCQlVTkksIEJJCi0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRJZCgpOwotCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50VHlwZSBnZXRPd25lcigpOwotCi0JcHVibGljIGFic3RyYWN0IEphdmFQZXJzaXN0ZW50VHlwZSBnZXRJbnZlcnNlKCk7Ci0JCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgpOwotCQkKLQlwdWJsaWMgdm9pZCBzZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUpOwotCQkJCQotCXB1YmxpYyB2b2lkIHNldE93bmVyQXR0cmlidXRlTmFtZShTdHJpbmcgb3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJCi0JcHVibGljIHZvaWQgc2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRPd25lckF0dHJpYnV0ZU5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBSZWxUeXBlIGdldFJlbFR5cGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBSZWxEaXIgZ2V0UmVsRGlyKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlCaURpclJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlCaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDllMmMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55QmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE1hbnlUb01hbnlCaURpclJlbGF0aW9uIGV4dGVuZHMgTWFueVRvTWFueVJlbGF0aW9uIGltcGxlbWVudHMgQmlkaXJlY3Rpb25hbFJlbGF0aW9uIHsKLQkKLQlwdWJsaWMgTWFueVRvTWFueUJpRGlyUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJICAgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsCi0JCQkJCQkJCSAgIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgIFN0cmluZyBpbnZlcnNlQXR0cmlidXRlTmFtZSwKLQkJCQkJCQkJICAgYm9vbGVhbiBjcmVhdGVBdHRyaWJzLAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsIAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQl0aGlzLmludmVyc2VBdHRyaWJ1dGVOYW1lID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7CQkKLQl9Ci0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnJlbGF0aW9ucy5CaWRpcmVjdGlvbmFsUmVsYXRpb24jZ2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoKQotCSAqLwotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRPd25lckFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUpIHsKLQkJdGhpcy5vd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IG93bmVyQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnJlbGF0aW9ucy5CaWRpcmVjdGlvbmFsUmVsYXRpb24jZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpCi0JICovCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLCBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0SW52ZXJzZUF0dHJpYnV0ZU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCQotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdEludmVyc2VBdHRyaWJ1dGVOYW1lKTsKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChvd25lcikpIHsKLQkJCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShpbnZlcnNlQXR0cmlidXRlTmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0SW52ZXJzZUF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQkKLQkJb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIG93bmVyLCBpbnZlcnNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkJSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc01hcFR5cGUob3duZXIuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSkgPyBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRJZFR5cGUoaW52ZXJzZSkgOiBudWxsLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICB0cnVlLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBvd25lckNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkgICBpbnZlcnNlQ1UpOwotCQkKLQkJU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShvd25lci5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0T3duZXJBdHRyaWJ1dGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUob3duZXIpKTsKLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihvd25lckF0dHJpYnV0ZU5hbWUpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE93bmVyQXR0cmlidXRlTmFtZSk7CQkJCQotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGludmVyc2UpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUob3duZXJBdHRyaWJ1dGVOYW1lKTsKLQkJCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShhY3RPd25lckF0dHJpYnV0ZU5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWJvb2xlYW4gaXNNYXAgPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmlzTWFwVHlwZShvd25lci5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKTsKLQkJaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgaW52ZXJzZSwgb3duZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGlzTWFwID8gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SWRUeXBlKG93bmVyKSA6IG51bGwsCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIHRydWUsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGludmVyc2VDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBvd25lckNVKTsKLQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE1hbnlUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSwgaW52ZXJzZSwgaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSwgaXNNYXApOwkJCi0JfSAJCi0JCi0JcHVibGljIFJlbERpciBnZXRSZWxEaXIoKSB7Ci0JCXJldHVybiBSZWxEaXIuQkk7Ci0JfQotCQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55UmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY4MzNiNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFueVRvTWFueVJlbGF0aW9uIGV4dGVuZHMgQWJzdHJhY3RSZWxhdGlvbiB7Ci0KLQlwdWJsaWMgTWFueVRvTWFueVJlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCX0KLQkKLQlwdWJsaWMgUmVsVHlwZSBnZXRSZWxUeXBlKCkgewotCQlyZXR1cm4gUmVsVHlwZS5NQU5ZX1RPX01BTlk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlVbmlEaXJSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9NYW55VW5pRGlyUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwYzIzYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb01hbnlVbmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgTWFueVRvTWFueVVuaURpclJlbGF0aW9uIGV4dGVuZHMgTWFueVRvTWFueVJlbGF0aW9uIGltcGxlbWVudHMgVW5pZGlyZWN0aW9uYWxSZWxhdGlvbiB7Ci0KLQlwdWJsaWMgTWFueVRvTWFueVVuaURpclJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSwKLQkJCQkJCQkJCVN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCQlib29sZWFuIGNyZWF0ZUF0dHJpYnMsCi0JCQkJCQkJCQlJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCQlJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgeyAKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJaWYgKGNyZWF0ZUF0dHJpYnMpCi0JCQljcmVhdGVSZWxhdGlvbihmcCwgb3duZXJDVSwgaW52ZXJzZUNVKTsJCQotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBhbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQlJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlTdHJpbmcgbmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShpbnZlcnNlLmdldE5hbWUoKSk7Ci0JCVN0cmluZyBhY3ROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEVudGl0eU5hbWUoaW52ZXJzZSkpOwotCQkKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJYm9vbGVhbiBpc01hcCA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuaXNNYXBUeXBlKG93bmVyLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCQlpc01hcCA/IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldElkVHlwZShpbnZlcnNlKSA6IG51bGwsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgdHJ1ZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgaW52ZXJzZUNVKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSwgaXNNYXApOwotCQkKLQl9IAotCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLlVOSTsKLQl9CQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lQmlEaXJSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVCaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDJjNTAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVCaURpclJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm9wZXJ0eXBhZ2UuSlBBRGlhZ3JhbVByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgTWFueVRvT25lQmlEaXJSZWxhdGlvbiAgZXh0ZW5kcyBNYW55VG9PbmVSZWxhdGlvbiBpbXBsZW1lbnRzIEJpZGlyZWN0aW9uYWxSZWxhdGlvbnsKLQotCXB1YmxpYyBNYW55VG9PbmVCaURpclJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsIAotCQkJCQkJCQkgIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgU3RyaW5nIGludmVyc2VBdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQkgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywKLQkJCQkJCQkJICBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSAgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsKLQkJdGhpcy5pbnZlcnNlQXR0cmlidXRlTmFtZSA9IGludmVyc2VBdHRyaWJ1dGVOYW1lOwotCQlpZiAoY3JlYXRlQXR0cmlicykKLQkJCWNyZWF0ZVJlbGF0aW9uKGZwLCBvd25lckNVLCBpbnZlcnNlQ1UpOwotCQkKLQl9CQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7Ci0KLQkJb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIG93bmVyLCBpbnZlcnNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCBmYWxzZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgaW52ZXJzZUNVKTsKLQkJCi0JCW5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUob3duZXIuZ2V0TmFtZSgpKTsKLQkJYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKG93bmVyKSk7CQotCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG5hbWUpOwotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwkJCQkKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChpbnZlcnNlKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShpbnZlcnNlLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJYm9vbGVhbiBpc01hcCA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuaXNNYXBUeXBlKG93bmVyLmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCkpOwotCQlpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBpbnZlcnNlLCBvd25lciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgaXNNYXAgPyBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRJZFR5cGUob3duZXIpIDogbnVsbCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgdHJ1ZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgaW52ZXJzZUNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIG93bmVyQ1UpOwotCQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvT25lQmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZwLCBvd25lciwgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUsIGludmVyc2UsIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUsIGlzTWFwKTsJCQotCX0gCQotCQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5CSTsKLQl9Ci0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZVJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZGYxMzEuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9NYW55VG9PbmVSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgTWFueVRvT25lUmVsYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlbGF0aW9uewotCi0JcHVibGljIE1hbnlUb09uZVJlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCX0KLQkKLQlwdWJsaWMgUmVsVHlwZSBnZXRSZWxUeXBlKCkgewotCQlyZXR1cm4gUmVsVHlwZS5NQU5ZX1RPX09ORTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lVW5pRGlyUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvTWFueVRvT25lVW5pRGlyUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5ZWIyOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL01hbnlUb09uZVVuaURpclJlbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBNYW55VG9PbmVVbmlEaXJSZWxhdGlvbiBleHRlbmRzIE1hbnlUb09uZVJlbGF0aW9uIGltcGxlbWVudHMgVW5pZGlyZWN0aW9uYWxSZWxhdGlvbiB7Ci0KLQlwdWJsaWMgTWFueVRvT25lVW5pRGlyUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJICAgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsCi0JCQkJCQkJCSAgIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgIGJvb2xlYW4gY3JlYXRlQXR0cmlicywKLQkJCQkJCQkJICAgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewkJCi0JCXN1cGVyKG93bmVyLCBpbnZlcnNlKTsKLQkJdGhpcy5vd25lckF0dHJpYnV0ZU5hbWUgPSBvd25lckF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7CQkKLQl9CQotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBhbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQkJU3RyaW5nIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCVN0cmluZyBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpOwotCQkKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKG93bmVyKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIJPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VVbmlxdWVBdHRyaWJ1dGVOYW1lKG93bmVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOyAKLQkJCi0JCS8vZnAuYWRkQWRkSWdub3JlKG93bmVyLCBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIpOwotCQkKLQkJb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIG93bmVyLCBpbnZlcnNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCBmYWxzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIG93bmVyQ1UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGludmVyc2VDVSk7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE1hbnlUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5VTkk7Ci0JfQkJCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvTWFueVJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNWU3MTMuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb01hbnlSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT25lVG9NYW55UmVsYXRpb24gZXh0ZW5kcyBBYnN0cmFjdFJlbGF0aW9uIHsKLQkKLQlwdWJsaWMgT25lVG9NYW55UmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JfQotCQotCXB1YmxpYyBSZWxUeXBlIGdldFJlbFR5cGUoKSB7Ci0JCXJldHVybiBSZWxUeXBlLk9ORV9UT19NQU5ZOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb01hbnlVbmlEaXJSZWxhdGlvbi5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb01hbnlVbmlEaXJSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWYwNjM3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9NYW55VW5pRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci0KLQotcHVibGljIGNsYXNzIE9uZVRvTWFueVVuaURpclJlbGF0aW9uIGV4dGVuZHMgT25lVG9NYW55UmVsYXRpb24gaW1wbGVtZW50cyBVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIHsKLQotCXB1YmxpYyBPbmVUb01hbnlVbmlEaXJSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXIsIAotCQkJCQkJCQkgICBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZSwKLQkJCQkJCQkJICAgU3RyaW5nIG93bmVyQXR0cmlidXRlTmFtZSwKLQkJCQkJCQkJICAgYm9vbGVhbiBjcmVhdGVBdHRyaWJzLCAKLQkJCQkJCQkJICAgSUNvbXBpbGF0aW9uVW5pdCBvd25lckNVLAotCQkJCQkJCQkgICBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQlpZiAoY3JlYXRlQXR0cmlicykKLQkJCWNyZWF0ZVJlbGF0aW9uKGZwLCBvd25lckNVLCBpbnZlcnNlQ1UpOwkJCi0JfQkKLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBvd25lckFubm90YXRlZEF0dHJpYnV0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMub3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBhbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwKLQkJCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUob3duZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlcik7IAotCQlib29sZWFuIGlzTWFwID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc01hcFR5cGUob3duZXIuZ2V0SnBhUHJvamVjdCgpLmdldFByb2plY3QoKSk7Ci0JCW93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBvd25lciwgaW52ZXJzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGlzTWFwID8gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SWRUeXBlKGludmVyc2UpIDogbnVsbCwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyLCB0cnVlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgaW52ZXJzZUNVKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkT25lVG9NYW55VW5pZGlyZWN0aW9uYWxSZWxhdGlvbihmcCwgb3duZXIsIG93bmVyQW5ub3RhdGVkQXR0cmlidXRlLCBpc01hcCk7Ci0JfSAKLQkKLQlwdWJsaWMgUmVsRGlyIGdldFJlbERpcigpIHsKLQkJcmV0dXJuIFJlbERpci5VTkk7Ci0JfQkJCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZUJpRGlyUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9PbmVCaURpclJlbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZTdjY2MuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9PbmVUb09uZUJpRGlyUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KUEFFZGl0b3JVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotCi0KLXB1YmxpYyBjbGFzcyBPbmVUb09uZUJpRGlyUmVsYXRpb24gZXh0ZW5kcyBPbmVUb09uZVJlbGF0aW9uIGltcGxlbWVudHMgQmlkaXJlY3Rpb25hbFJlbGF0aW9uewotCXB1YmxpYyBPbmVUb09uZUJpRGlyUmVsYXRpb24oSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIG93bmVyLCAKLQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50VHlwZSBpbnZlcnNlLCAKLQkJCQkJCQkJIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSBTdHJpbmcgaW52ZXJzZUF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSBib29sZWFuIGNyZWF0ZUF0dHJpYnMsCi0JCQkJCQkJCSBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSBJQ29tcGlsYXRpb25Vbml0IGludmVyc2VDVSkgewotCQlzdXBlcihvd25lciwgaW52ZXJzZSk7Ci0JCXRoaXMub3duZXJBdHRyaWJ1dGVOYW1lID0gb3duZXJBdHRyaWJ1dGVOYW1lOwotCQl0aGlzLmludmVyc2VBdHRyaWJ1dGVOYW1lID0gaW52ZXJzZUF0dHJpYnV0ZU5hbWU7Ci0JCWlmIChjcmVhdGVBdHRyaWJzKQotCQkJY3JlYXRlUmVsYXRpb24oZnAsIG93bmVyQ1UsIGludmVyc2VDVSk7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLm93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGdldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUoCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKSB7Ci0JCXRoaXMuaW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSA9IGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElDb21waWxhdGlvblVuaXQgb3duZXJDVSwgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJU3RyaW5nIG5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoaW52ZXJzZS5nZXROYW1lKCkpOwotCQlTdHJpbmcgYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGludmVyc2UpKTsKLQotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCQotCQlvd25lckFubm90YXRlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZEF0dHJpYnV0ZShmcCwgb3duZXIsIGludmVyc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGZhbHNlLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgb3duZXJDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgaW52ZXJzZUNVKTsKLQkJCi0JCW5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUob3duZXIuZ2V0TmFtZSgpKTsKLQkJYWN0TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKG93bmVyKSk7Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7CQkKLQkJCi0JCWlmIChKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZChpbnZlcnNlKSkgewotCQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKG5hbWUpOwotCQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKGFjdE5hbWUpOwotCQl9Ci0JCW5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoaW52ZXJzZSwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsgCi0JCWludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZnAsIGludmVyc2UsIG93bmVyLCAKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBuYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIsIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJICAgZmFsc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSAgIGludmVyc2VDVSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgICBvd25lckNVKTsKLQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE9uZVRvT25lQmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZwLCBvd25lciwgb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGUsIGludmVyc2UsIGludmVyc2VBbm5vdGF0ZWRBdHRyaWJ1dGUpOwkJCi0JfSAJCi0JCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLkJJOwotCX0JCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9PbmVSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjExOWYzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9PbmVSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgT25lVG9PbmVSZWxhdGlvbiBleHRlbmRzIEFic3RyYWN0UmVsYXRpb24gewotCQotCXB1YmxpYyBPbmVUb09uZVJlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCX0KLQkKLQlwdWJsaWMgUmVsVHlwZSBnZXRSZWxUeXBlKCkgewotCQlyZXR1cm4gUmVsVHlwZS5PTkVfVE9fT05FOwotCX0KLQkJCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL09uZVRvT25lVW5pRGlyUmVsYXRpb24uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9PbmVVbmlEaXJSZWxhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDI5MDY4Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC9yZWxhdGlvbnMvT25lVG9PbmVVbmlEaXJSZWxhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLQotCi1wdWJsaWMgY2xhc3MgT25lVG9PbmVVbmlEaXJSZWxhdGlvbiBleHRlbmRzIE9uZVRvT25lUmVsYXRpb24gaW1wbGVtZW50cyBVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIHsKLQotCXB1YmxpYyBPbmVUb09uZVVuaURpclJlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lciwgCi0JCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2UsIAotCQkJCQkJCQkgIFN0cmluZyBvd25lckF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCSAgYm9vbGVhbiBjcmVhdGVBdHRyaWJzLCAKLQkJCQkJCQkJICBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsCi0JCQkJCQkJCSAgSUNvbXBpbGF0aW9uVW5pdCBpbnZlcnNlQ1UpIHsKLQkJc3VwZXIob3duZXIsIGludmVyc2UpOwotCQl0aGlzLm93bmVyQXR0cmlidXRlTmFtZSA9IG93bmVyQXR0cmlidXRlTmFtZTsgCi0JCWlmIChjcmVhdGVBdHRyaWJzKSAKLQkJCWNyZWF0ZVJlbGF0aW9uKGZwLCBvd25lckNVLCBpbnZlcnNlQ1UpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0QW5ub3RhdGVkQXR0cmlidXRlKCkgewotCQlyZXR1cm4gb3duZXJBbm5vdGF0ZWRBdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QW5ub3RhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGFubm90YXRlZEF0dHJpYnV0ZSkgewotCQl0aGlzLm93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gYW5ub3RhdGVkQXR0cmlidXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVSZWxhdGlvbihJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBJQ29tcGlsYXRpb25Vbml0IG93bmVyQ1UsIElDb21waWxhdGlvblVuaXQgaW52ZXJzZUNVKSB7Ci0JCVN0cmluZyBuYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGludmVyc2UuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGFjdE5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShpbnZlcnNlKSk7Ci0JCQotCQlTdHJpbmcgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuYW1lKTsKLQkJU3RyaW5nIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciA9IEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSk7Ci0JCQotCQlpZiAoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNNZXRob2RBbm5vdGF0ZWQob3duZXIpKSB7Ci0JCQluYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUobmFtZSk7Ci0JCQlhY3ROYW1lV2l0aE5vbkNhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoYWN0TmFtZSk7Ci0JCX0KLQkJbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgbmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVW5pcXVlQXR0cmlidXRlTmFtZShvd25lciwgYWN0TmFtZVdpdGhOb25DYXBpdGFsTGV0dGVyKTsKLQkJCi0JCW93bmVyQW5ub3RhdGVkQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkQXR0cmlidXRlKGZwLCBvd25lciwgaW52ZXJzZSwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIG5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgCi0JCQkJCQkJCQkJCQkJCQkJCQkJIGFjdE5hbWVXaXRoTm9uQ2FwaXRhbExldHRlciwgZmFsc2UsIAotCQkJCQkJCQkJCQkJCQkJCQkJCSBvd25lckNVLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBpbnZlcnNlQ1UpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZnAsIG93bmVyLCBvd25lckFubm90YXRlZEF0dHJpYnV0ZSk7Ci0JCQotCX0gCi0JCQotCXB1YmxpYyBSZWxEaXIgZ2V0UmVsRGlyKCkgewotCQlyZXR1cm4gUmVsRGlyLlVOSTsKLQl9CQkKLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3JlbGF0aW9ucy9VbmlkaXJlY3Rpb25hbFJlbGF0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL1VuaWRpcmVjdGlvbmFsUmVsYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZmYjg1YS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvcmVsYXRpb25zL1VuaWRpcmVjdGlvbmFsUmVsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVuaWRpcmVjdGlvbmFsUmVsYXRpb24gZXh0ZW5kcyBJUmVsYXRpb24gewotCQotCXB1YmxpYyBhYnN0cmFjdCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRBbm5vdGF0ZWRBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpOwotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0VudGl0aWVzQ29vcmRpbmF0ZXNYTUwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0VudGl0aWVzQ29vcmRpbmF0ZXNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI3YjQwMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9FbnRpdGllc0Nvb3JkaW5hdGVzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGb2xkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRW50aXRpZXNDb29yZGluYXRlc1hNTCB7Ci0JCi0JcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudDsKLQlwcml2YXRlIEVsZW1lbnQgcm9vdEVsZW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvamVjdE5hbWU7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VMRU1FTlRfUE9TSVRJT04gPSAiXG5cdFx0IjsgLy8kTk9OLU5MUy0xJAotCQkKLQlwdWJsaWMgRW50aXRpZXNDb29yZGluYXRlc1hNTChTdHJpbmcgcHJvamVjdE5hbWUpewotCQl0aGlzLnByb2plY3ROYW1lID0gcHJvamVjdE5hbWU7Ci0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCQlpcyA9IChJbnB1dFN0cmVhbSlmaW5kWE1MRmlsZSh0cnVlKTsKLQkJCWRvY3VtZW50ID0gZG9jdW1lbnRCdWlsZGVyLnBhcnNlKGlzKTsKLQkJCXJvb3RFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihKUEFFZGl0b3JNZXNzYWdlcy5FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdFBhcnNlRmlsZUVycm9yTVNHLCBlKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RQYXJzZUZpbGVFcnJvck1TRywgZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RSZWFkRmlsZUVycm9yTVNHLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQkKLSAgICBwcml2YXRlIENsb3NlYWJsZSBmaW5kWE1MRmlsZShib29sZWFuIGlucHV0U3RyZWFtKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uewotICAgIAlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZVtdIHJlc291cmNlcyA9IHByb2plY3QubWVtYmVycygpOwotCQkJZm9yIChJUmVzb3VyY2UgcmVzIDogcmVzb3VyY2VzKSB7Ci0JCQkJaWYgKHJlcyBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCQkJSUZpbGUgZXhpc3RpbmdYTUxGaWxlID0gKChJRm9sZGVyKSByZXMpLmdldEZpbGUocHJvamVjdE5hbWUgKyAiLiIgKyBNb2RlbEludGVncmF0aW9uVXRpbC5ESUFHUkFNX1hNTF9GSUxFX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGV4aXN0aW5nWE1MRmlsZSAhPSBudWxsICYmIGV4aXN0aW5nWE1MRmlsZS5leGlzdHMoKSkgewotCQkJCQkJcmV0dXJuIGlucHV0U3RyZWFtID8gCi0JCQkJCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZXhpc3RpbmdYTUxGaWxlLmdldExvY2F0aW9uVVJJKCkpKSA6Ci0JCQkJCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShleGlzdGluZ1hNTEZpbGUuZ2V0TG9jYXRpb25VUkkoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RPYnRhaW5Qcm9qZWN0RXJyb3JNU0csIGUpOwotCQl9Ci0JCUlGaWxlIGV4aXN0aW5nWE1MRmlsZSA9IHByb2plY3QuZ2V0RmlsZShNb2RlbEludGVncmF0aW9uVXRpbC5nZXREaWFncmFtc1hNTEZvbGRlclBhdGgocHJvamVjdCkuYXBwZW5kKHByb2plY3ROYW1lKS5hZGRGaWxlRXh0ZW5zaW9uKE1vZGVsSW50ZWdyYXRpb25VdGlsLkRJQUdSQU1fWE1MX0ZJTEVfRVhURU5TSU9OKSk7Ci0JCXJldHVybiBpbnB1dFN0cmVhbSA/IG5ldyBGaWxlSW5wdXRTdHJlYW0obmV3IEZpbGUoZXhpc3RpbmdYTUxGaWxlLmdldExvY2F0aW9uVVJJKCkpKSA6Ci0JCQkJCQkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShuZXcgRmlsZShleGlzdGluZ1hNTEZpbGUuZ2V0TG9jYXRpb25VUkkoKSkpOwotICAgIH0KLQkKLSAgICBzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgc3RvcmUoKSB7Ci0gICAgCUlQcm9qZWN0IHByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUpOwotICAgIAlEaWFncmFtIGRpYWdyYW0gPSBNb2RlbEludGVncmF0aW9uVXRpbC5nZXREaWFncmFtQnlQcm9qZWN0KHByb2plY3QpOwotCQlMaXN0PFNoYXBlPiBwaWN0cyA9IGRpYWdyYW0uZ2V0Q2hpbGRyZW4oKTsKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gcGljdHMuaXRlcmF0b3IoKTsKLQkJLy8gY29sbGVjdGluZyBkYXRhIGZyb20gdGhlIHNhdmVkIHBpY3RvZ3JhbXMKLQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQocm9vdEVsZW1lbnQpOwotCQlyb290RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImVudGl0aWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJZG9jdW1lbnQuYXBwZW5kQ2hpbGQocm9vdEVsZW1lbnQpOwotCi0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHBpY3QgPSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgbmFtZSA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUocGljdCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfRU5USVRZX0NMQVNTX05BTUUpOwotCi0JCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3QgPSAoUm91bmRlZFJlY3RhbmdsZSkgcGljdC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCi0JCQlib29sZWFuIGlzUHJpbWFyeUNvbGxhcHNlZCA9IEpQQUVkaXRvckNvbnN0YW50cy5UUlVFX1NUUklORy5lcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LAotCQkJCQkJCUpQQUVkaXRvckNvbnN0YW50cy5QUklNQVJZX0NPTExBUFNFRCkpOwotCQkJYm9vbGVhbiBpc1JlbGF0aW9uQ29sbGFwc2VkID0gSlBBRWRpdG9yQ29uc3RhbnRzLlRSVUVfU1RSSU5HLmVxdWFscyhHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHBpY3QsCi0JCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX0NPTExBUFNFRCkpOwotCQkJYm9vbGVhbiBpc0Jhc2ljQ29sbGFwc2VkID0gSlBBRWRpdG9yQ29uc3RhbnRzLlRSVUVfU1RSSU5HLmVxdWFscyhHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHBpY3QsCi0JCQkJCQkJSlBBRWRpdG9yQ29uc3RhbnRzLkJBU0lDX0NPTExBUFNFRCkpOwotCi0JCQlFbGVtZW50IGVudGl0eSA9IGNyZWF0ZUVudGl0eUVsZW1lbnRUYWcoZG9jdW1lbnQsIHJvb3RFbGVtZW50LCBKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1hNTF9UQUcsIFhNTF9FTEVNRU5UX1BPU0lUSU9OKTsKLQkJCVRleHQgbmFtZVRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuYW1lKTsKLQkJCUVsZW1lbnQgZW50aXR5TmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9OQU1FX1RBRyk7Ci0JCQljcmVhdGVDaGlsZEVsZW1lbnRUYWcoZG9jdW1lbnQsIG5hbWVUZXh0LCBlbnRpdHlOYW1lLCBlbnRpdHksIFhNTF9FTEVNRU5UX1BPU0lUSU9OKTsKLQotCQkJVGV4dCB3aWR0aCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy52YWx1ZU9mKHJlY3QuZ2V0V2lkdGgoKSkpOwotCQkJRWxlbWVudCBlbnRpdHlXaWR0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9XSURUSF9UQUcpOwotCQkJY3JlYXRlQ2hpbGRFbGVtZW50VGFnKGRvY3VtZW50LCB3aWR0aCwgZW50aXR5V2lkdGgsIGVudGl0eSwgWE1MX0VMRU1FTlRfUE9TSVRJT04pOwotCi0JCQlUZXh0IGhlaWdodCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy52YWx1ZU9mKHJlY3QuZ2V0SGVpZ2h0KCkpKTsKLQkJCUVsZW1lbnQgZW50aXR5SGVpZ2h0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0hFSUdIVF9UQUcpOwotCQkJY3JlYXRlQ2hpbGRFbGVtZW50VGFnKGRvY3VtZW50LCBoZWlnaHQsIGVudGl0eUhlaWdodCwgZW50aXR5LCBYTUxfRUxFTUVOVF9QT1NJVElPTik7Ci0KLQkJCVRleHQgeENvb3JkaW5hdGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihyZWN0LmdldFgoKSkpOwotCQkJRWxlbWVudCBlbnRpdHlYQ29vcmRpbmF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9YX0NPT1JESU5BVEVfVEFHKTsKLQkJCWNyZWF0ZUNoaWxkRWxlbWVudFRhZyhkb2N1bWVudCwgeENvb3JkaW5hdGUsIGVudGl0eVhDb29yZGluYXRlLAllbnRpdHksIFhNTF9FTEVNRU5UX1BPU0lUSU9OKTsKLQotCQkJVGV4dCB5Q29vcmRpbmF0ZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZy52YWx1ZU9mKHJlY3QuZ2V0WSgpKSk7Ci0JCQlFbGVtZW50IGVudGl0eVlDb29yZGluYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1lfQ09PUkRJTkFURV9UQUcpOwotCQkJY3JlYXRlQ2hpbGRFbGVtZW50VGFnKGRvY3VtZW50LCB5Q29vcmRpbmF0ZSwgZW50aXR5WUNvb3JkaW5hdGUsCWVudGl0eSwgWE1MX0VMRU1FTlRfUE9TSVRJT04pOwotCQkJCi0JCQlUZXh0IHByaW1hcnlDb2xsYXBzZWQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihpc1ByaW1hcnlDb2xsYXBzZWQpKTsKLQkJCUVsZW1lbnQgZW50aXR5UHJpbWFyeUNvbGxhcHNlZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9QUklNQVJZX1NFQ1RJT05fU1RBVEVfVEFHKTsKLQkJCWNyZWF0ZUNoaWxkRWxlbWVudFRhZyhkb2N1bWVudCwgcHJpbWFyeUNvbGxhcHNlZCwgZW50aXR5UHJpbWFyeUNvbGxhcHNlZCwgZW50aXR5LCBYTUxfRUxFTUVOVF9QT1NJVElPTik7CQotCQkJCi0JCQlUZXh0IHJlbGF0aW9uQ29sbGFwc2VkID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nLnZhbHVlT2YoaXNSZWxhdGlvbkNvbGxhcHNlZCkpOwotCQkJRWxlbWVudCBlbnRpdHlSZWxhdGlvbkNvbGxhcHNlZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9SRUxBVElPTl9TRUNUSU9OX1NUQVRFX1RBRyk7Ci0JCQljcmVhdGVDaGlsZEVsZW1lbnRUYWcoZG9jdW1lbnQsIHJlbGF0aW9uQ29sbGFwc2VkLCBlbnRpdHlSZWxhdGlvbkNvbGxhcHNlZCwJZW50aXR5LCBYTUxfRUxFTUVOVF9QT1NJVElPTik7Ci0JCQkKLQkJCVRleHQgYmFzaWNDb2xsYXBzZWQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcudmFsdWVPZihpc0Jhc2ljQ29sbGFwc2VkKSk7Ci0JCQlFbGVtZW50IGVudGl0eUJhc2ljQ29sbGFwc2VkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0JBU0lDX1NFQ1RJT05fU1RBVEVfVEFHKTsKLQkJCWNyZWF0ZUNoaWxkRWxlbWVudFRhZyhkb2N1bWVudCwgYmFzaWNDb2xsYXBzZWQsIGVudGl0eUJhc2ljQ29sbGFwc2VkLAllbnRpdHksICJcblx0Iik7CSAvLyROT04tTkxTLTEkCi0JCQkKLQkJCXJvb3RFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJcbiIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJTW9kZWxJbnRlZ3JhdGlvblV0aWwuc2V0WG1pRXhpc3RzKGZhbHNlKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgbG9hZChIYXNodGFibGU8U3RyaW5nLCBTaXplUG9zaXRpb24+IG1hcmtzKXsKLQkJaWYocm9vdEVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpPD0xKXsKLQkJCWlmKE1vZGVsSW50ZWdyYXRpb25VdGlsLnhtaUV4aXN0cygpKXsKLQkJCQlzdG9yZSgpOwotCQkJCXNhdmUoKTsKLQkJCX0KLQkJfSAKLQkJCi0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcm9vdEVsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9YTUxfVEFHKTsKLQkJZm9yKGludCBpPTA7IGk8bm9kZUxpc3QuZ2V0TGVuZ3RoKCk7aSsrKXsKLQkJCUVsZW1lbnQgbm9kZSA9IChFbGVtZW50KSBub2RlTGlzdC5pdGVtKGkpOwotCQkJU3RyaW5nIGVudGl0eU5hbWUgPSBub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfTkFNRV9UQUcpLml0ZW0oMCkuZ2V0VGV4dENvbnRlbnQoKTsKLQkJCWludCB3aWR0aCA9IEludGVnZXIucGFyc2VJbnQobm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1dJRFRIX1RBRykuaXRlbSgwKS5nZXRUZXh0Q29udGVudCgpKTsKLQkJCWludCBoZWlnaHQgPSBJbnRlZ2VyLnBhcnNlSW50KG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9IRUlHSFRfVEFHKS5pdGVtKDApLmdldFRleHRDb250ZW50KCkpOwotCQkJaW50IHhDb29yZGluYXRlID0gSW50ZWdlci5wYXJzZUludChub2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpQQUVkaXRvckNvbnN0YW50cy5FTlRJVFlfWF9DT09SRElOQVRFX1RBRykuaXRlbSgwKS5nZXRUZXh0Q29udGVudCgpKTsKLQkJCWludCB5Q29vcmRpbmF0ZSA9IEludGVnZXIucGFyc2VJbnQobm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1lfQ09PUkRJTkFURV9UQUcpLml0ZW0oMCkuZ2V0VGV4dENvbnRlbnQoKSk7Ci0JCQlib29sZWFuIGlzUHJpbWFyeUNvbGxhcHNlZCA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKG5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlBBRWRpdG9yQ29uc3RhbnRzLkVOVElUWV9QUklNQVJZX1NFQ1RJT05fU1RBVEVfVEFHKS5pdGVtKDApLmdldFRleHRDb250ZW50KCkpOwotCQkJYm9vbGVhbiBpc1JlbGF0aW9uQ29sbGFwc2VkID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4obm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX1JFTEFUSU9OX1NFQ1RJT05fU1RBVEVfVEFHKS5pdGVtKDApLmdldFRleHRDb250ZW50KCkpOwotCQkJYm9vbGVhbiBpc0Jhc2ljQ29sbGFwc2VkID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4obm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZShKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX0JBU0lDX1NFQ1RJT05fU1RBVEVfVEFHKS5pdGVtKDApLmdldFRleHRDb250ZW50KCkpOwotCQkJCi0JCQlTaXplUG9zaXRpb24gcmVjdFNQID0gbmV3IFNpemVQb3NpdGlvbih3aWR0aCwgaGVpZ2h0LCB4Q29vcmRpbmF0ZSwgeUNvb3JkaW5hdGUpOwotCQkJcmVjdFNQLnByaW1hcnlDb2xsYXBzZWQgPSBpc1ByaW1hcnlDb2xsYXBzZWQ7Ci0JCQlyZWN0U1AucmVsYXRpb25Db2xsYXBzZWQgPSBpc1JlbGF0aW9uQ29sbGFwc2VkOwotCQkJcmVjdFNQLmJhc2ljQ29sbGFwc2VkID0gaXNCYXNpY0NvbGxhcHNlZDsKLQkJCQotCQkJbWFya3MucHV0KGVudGl0eU5hbWUsIHJlY3RTUCk7Ci0JCX0KLQkJCi0JfQotCQotCXByaXZhdGUgRWxlbWVudCBjcmVhdGVFbnRpdHlFbGVtZW50VGFnKERvY3VtZW50IGRvY3VtZW50LCBFbGVtZW50IHNjaGVkdWxlRWxlbWVudCwgU3RyaW5nIGRlc2NyLCBTdHJpbmcgcG9zaXRpb24pIHsKLQkJRWxlbWVudCBqb2IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGRlc2NyKTsKLQkJc2NoZWR1bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJcblx0IikpOyAvLyROT04tTkxTLTEkCi0JCXNjaGVkdWxlRWxlbWVudC5hcHBlbmRDaGlsZChqb2IpOwotCQlqb2IuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocG9zaXRpb24pKTsKLQkJCi0JCXJldHVybiBqb2I7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBjcmVhdGVDaGlsZEVsZW1lbnRUYWcoRG9jdW1lbnQgZG9jdW1lbnQsIFRleHQgbmFtZVRleHQsIEVsZW1lbnQgbmFtZUVsLCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIFN0cmluZyBwb3NpdGlvbikgewotCQlwYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKG5hbWVFbCk7Ci0JCW5hbWVFbC5hcHBlbmRDaGlsZChuYW1lVGV4dCk7Ci0JCXBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocG9zaXRpb24pKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2F2ZSgpIHsKLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lckZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7Ci0JCQlvcyA9IChPdXRwdXRTdHJlYW0pZmluZFhNTEZpbGUoZmFsc2UpOwotCQkJdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KG9zKSk7Ci0JCQlvcy5mbHVzaCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihKUEFFZGl0b3JNZXNzYWdlcy5FbnRpdGllc0Nvb3JkaW5hdGVzWE1MX0Nhbm5vdENyZWF0ZURPTUZpbGVFcnJvck1TRywgZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCW9zLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0JCQotCX0KLQkKLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCXNhdmUoKTsKLQkJY2xlYW4oKTsKLQl9Ci0JCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGNsZWFuKCkgewotCQl0cnkgewotCSAgICAJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwcm9qZWN0TmFtZSk7CQkJCi0JICAgIAlwcm9qZWN0LnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuRW50aXRpZXNDb29yZGluYXRlc1hNTF9DYW5ub3RSZWZyZnJlc2hGaWxlLCBlKTsKLQkJfQkJCi0JCWRvY3VtZW50ID0gbnVsbDsKLQkJcm9vdEVsZW1lbnQgPSBudWxsOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9FbnRpdHlDaGFuZ2VMaXN0ZW5lci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvRW50aXR5Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFlNDAxYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9FbnRpdHlDaGFuZ2VMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFwcGVkQnlSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhQXR0cmlidXRlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVJlbGF0aW9uc2hpcE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5jb250ZXh0LmphdmEuSmF2YU51bGxUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZUFuZFNhdmVFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEVudGl0eUNoYW5nZUxpc3RlbmVyIGV4dGVuZHMgVGhyZWFkIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBQQVVTRV9EVVJBVElPTiA9IDI1MDsKLQlwcml2YXRlIGJvb2xlYW4gZ29PbiA9IHRydWU7Ci0JcHJpdmF0ZSBKUEFTb2x2ZXIgc29sdmVyOwotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JcHJpdmF0ZSBTZXQ8U3RyaW5nPiBqcHRzVG9VcGRhdGUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7IAotCXByaXZhdGUgSGFzaHRhYmxlPFN0cmluZywgUGVyc2lzdGVuY2VVbml0PiBhdHRyaWJzVG9VcGRhdGUgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgUGVyc2lzdGVuY2VVbml0PigpOyAKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRVBBUkFUT1IgPSAiOyI7CQkvLyROT04tTkxTLTEkCi0JCi0JRW50aXR5Q2hhbmdlTGlzdGVuZXIoSlBBU29sdmVyIHNvbHZlcikgewotCQl0aGlzLnNvbHZlciA9IHNvbHZlcjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVByb3ZpZGVyKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyKSB7Ci0JCXRoaXMuZmVhdHVyZVByb3ZpZGVyID0gZmVhdHVyZVByb3ZpZGVyOwotCX0KLQkJCQkKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVVwZGF0ZUZyb21Nb2RlbCB0YXNrQ2xhc3MgPSBuZXcgVXBkYXRlRnJvbU1vZGVsKCk7Ci0JCXdoaWxlIChnb09uKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChQQVVTRV9EVVJBVElPTik7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhyZWFkIHNsZWVwIGludGVycnVwcnRlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJfQotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHRhc2tDbGFzcyk7Ci0JCX0KLQkJc29sdmVyID0gbnVsbDsKLQkJZmVhdHVyZVByb3ZpZGVyID0gbnVsbDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc3RvcFRocmVhZCgpIHsKLQkJZ29PbiA9IGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRKUFRGb3JVcGRhdGUoU3RyaW5nIGpwdE5hbWUpIHsKLQkJc3luY2hyb25pemVkIChqcHRzVG9VcGRhdGUpIHsKLQkJCWpwdHNUb1VwZGF0ZS5hZGQoanB0TmFtZSk7Ci0JCX0KLQl9Ci0JCQkKLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJGb3JVcGRhdGUoUGVyc2lzdGVuY2VVbml0IHB1LCBTdHJpbmcgZW50QXRNYXBwZWRCeSkgewotCQlzeW5jaHJvbml6ZWQgKGF0dHJpYnNUb1VwZGF0ZSkgewotCQkJYXR0cmlic1RvVXBkYXRlLnB1dChlbnRBdE1hcHBlZEJ5LCBwdSk7Ci0JCX0KLQl9Ci0JCQkKLQlwcml2YXRlIGNsYXNzIFVwZGF0ZUZyb21Nb2RlbCBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJZXhlYygpOwotCQl9Ci0KLQkJCi0JCXByaXZhdGUgdm9pZCBleGVjKCkgewotCQkJdHJ5IHsKLQkJCQlzeW5jaHJvbml6ZWQgKGpwdHNUb1VwZGF0ZSkgewotCQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ciA9IGpwdHNUb1VwZGF0ZS5pdGVyYXRvcigpOwotCQkJCQlpZiAoaXRyLmhhc05leHQoKSkgewotCQkJCQkJU3RyaW5nIGpwdE5hbWUgPSBpdHIubmV4dCgpOwotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGpwdE5hbWUpOwotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW1ha2VSZWxhdGlvbnMoZmVhdHVyZVByb3ZpZGVyLCBudWxsLCBqcHQpOwotCQkJCQkJCWpwdHNUb1VwZGF0ZS5yZW1vdmUoanB0TmFtZSk7Ci0JCQkJCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHt9IAotCQkJCQl9Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248T2JqZWN0PiB2YWxzID0gc29sdmVyLmdldFZpc3VhbGl6ZWRPYmplY3RzKCk7Ci0JCQkJSXRlcmF0b3I8T2JqZWN0PiBpdCA9IHZhbHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJCQlpZiAobyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpbzsKLQkJCQkJCWZpbmFsIENvbnRhaW5lclNoYXBlIGVudFNoYXBlID0gKENvbnRhaW5lclNoYXBlKWZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3Qobyk7Ci0JCQkJCQlpZiAoZW50U2hhcGUgPT0gbnVsbCkgCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanB0KTsKLQkJCQkJCVBlcnNpc3RlbnRUeXBlIHB0ID0gcHUuZ2V0UGVyc2lzdGVudFR5cGUoanB0LmdldE5hbWUoKSk7Ci0JCQkJCQkKLQkJCQkJCWlmICgocHQgPT0gbnVsbCkgfHwgIUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmhhc0VudGl0eUFubm90YXRpb24oanB0KSkgewotCQkJCQkJCQotCQkJCQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmZvcmNlU2F2ZUVudGl0eUNsYXNzKGpwdCwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJCQkJCQkKLQkJCQkJCQlpZihqcHQuZ2V0TWFwcGluZygpID09IG51bGwgfHwgKGpwdC5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhTnVsbFR5cGVNYXBwaW5nKSkgewotCQkJCQkJCQlpZiAoIUpwdEpwYUNvcmVQbHVnaW4uZGlzY292ZXJBbm5vdGF0ZWRDbGFzc2VzKGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihqcHQuZ2V0SnBhUHJvamVjdCgpLCBqcHQuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkKLQkJCQkJCQlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGVudFNoYXBlKTsKLQkJCQkJCQlSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZSBmdCA9IG5ldyBSZW1vdmVBbmRTYXZlRW50aXR5RmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQkJCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfSBlbHNlIHsJCi0JCQkJCQkJCi0JCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJCQkJCQlTdHJpbmcgZW50TmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRFbnRpdHlOYW1lKGpwdCkpOyAKLQkJCQkJCQl0cnkgewotCQkJCQkJCQlmaW5hbCBTdHJpbmcgbmV3SGVhZGVyID0gKGN1Lmhhc1Vuc2F2ZWRDaGFuZ2VzKCkgPyAiKiAiIDogIiIpICsgZW50TmFtZTsJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJR3JhcGhpY3NVcGRhdGVyLnVwZGF0ZUhlYWRlcihlbnRTaGFwZSwgbmV3SGVhZGVyKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJCQkJCQkKLQkJCQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY2hlY2sgY29tcGlsYXRpb24gdW5pdCBmb3IgdW5zYXZlZCBjaGFuZ2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJCQkJfQkJCQkJCQkJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9CQkKLQkJCQlzeW5jaHJvbml6ZWQgKGF0dHJpYnNUb1VwZGF0ZSkgewotCQkJCQlTZXQ8U3RyaW5nPiBhdFNldCA9IGF0dHJpYnNUb1VwZGF0ZS5rZXlTZXQoKTsKLQkJCQkJSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gYXRTZXQuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCQlTdHJpbmcganB0QXRNQiA9IGl0ZXIubmV4dCgpOwotCQkJCQkJU3RyaW5nW10ganB0QW5kQXR0cmliID0ganB0QXRNQi5zcGxpdChTRVBBUkFUT1IpOyAKLQkJCQkJCVBlcnNpc3RlbmNlVW5pdCBwdSA9IGF0dHJpYnNUb1VwZGF0ZS5nZXQoanB0QXRNQik7Ci0JCQkJCQlTdHJpbmcgZW50aXR5TmFtZSA9IGpwdEFuZEF0dHJpYlswXTsKLQkJCQkJCVN0cmluZyBhdHRyaWJOYW1lID0ganB0QW5kQXR0cmliWzFdOwotCQkJCQkJU3RyaW5nIG1hcHBlZEJ5ID0ganB0QW5kQXR0cmliWzJdOwotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5TmFtZSk7Ci0JCQkJCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmliTmFtZSk7Ci0JCQkJCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIGpwdCk7Ci0JCQkJCQkJaWYgKGpwYSAhPSBudWxsKSB7Ci0JCQkJCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIG1hcHBpbmcgPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJCQkJCQlBbm5vdGF0aW9uIGEgPSBtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQkJCQkJCWlmKGEgPT0gbnVsbCl7Ci0JCQkJCQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwoZmVhdHVyZVByb3ZpZGVyLCBqcHQpOwotCQkJCQkJCQkJbWFwcGluZyA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQkJCQkJCQlhID0gbWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmIChhID09IG51bGwpCi0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCWlmIChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24uY2xhc3MuaXNJbnN0YW5jZShtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpKSB7Ci0JCQkJCQkJCQlKYXZhUmVsYXRpb25zaGlwTWFwcGluZyByZWxhdGlvbnNoaXBNYXBwaW5nID0gKEphdmFSZWxhdGlvbnNoaXBNYXBwaW5nKW1hcHBpbmc7IAotCQkJCQkJCQkJTWFwcGVkQnlSZWxhdGlvbnNoaXAgb3duYWJsZVJlZiA9IChNYXBwZWRCeVJlbGF0aW9uc2hpcClyZWxhdGlvbnNoaXBNYXBwaW5nLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJCQkJCQkJaWYgKCFvd25hYmxlUmVmLnN0cmF0ZWd5SXNNYXBwZWRCeSgpKSB7Ci0JCQkJCQkJCQkgICAgb3duYWJsZVJlZi5zZXRTdHJhdGVneVRvTWFwcGVkQnkoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCW93bmFibGVSZWYuZ2V0TWFwcGVkQnlTdHJhdGVneSgpLnNldE1hcHBlZEJ5QXR0cmlidXRlKG1hcHBlZEJ5KTsJCQkJCQkJCQkKLQkJCQkJCQkJCWF0dHJpYnNUb1VwZGF0ZS5yZW1vdmUoanB0QXRNQik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJCAKLQkJCX0JCQkKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0dyYXBoaWNzVXBkYXRlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvR3JhcGhpY3NVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZDdjMjUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvR3JhcGhpY3NVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvckNvbnN0YW50cy5TaGFwZVR5cGU7Ci0KLQotcHVibGljIGNsYXNzIEdyYXBoaWNzVXBkYXRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUFJJTUFSWV9TSEFQRV9JTkRFWCA9IDM7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFTEFUSU9OX1NIQVBFX0NPTlNUQU5UID0gNDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQkFTSUNfU0hBUEVfSU5ERVggPSA1OwotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5jcmVhc2VDb21wYXJ0bWVudEhlaWd0aChDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSwKLQkJCWludCBoZWlnaHQpIHsKLQkJZm9yKFNoYXBlIHNoYXBlIDogY29udGFpbmVyU2hhcGUuZ2V0Q2hpbGRyZW4oKSl7Ci0JCQlJdGVyYXRvcjxHcmFwaGljc0FsZ29yaXRobT4gaXRlcmF0b3IgPSBzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKS5pdGVyYXRvcigpOwotCQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCSAgICBpZihpdGVyYXRvci5uZXh0KCkgaW5zdGFuY2VvZiBUZXh0KQotCQkJICAgICAgICBoZWlnaHQgPSBoZWlnaHQgKyBKUEFFZGl0b3JDb25zdGFudHMuQVRUUklCVVRFU19QTEFDRU1FTlRfU1RFUDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaGVpZ2h0OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlQ29udGFpbmVyKENvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlLCAKLQkJCWludCBjaGlsZHJlblNpemVCZWZvcmUsIGludCBjb250YWluZXJIZWlnaHRCZWZvcmUpewotCQlpbnQgY2hpbGRyZW5TaXplQWZ0ZXIgPSBjb250YWluZXJTaGFwZS5nZXRDaGlsZHJlbigpLnNpemUoKTsKLQkJaW50IGNvbnRhaW5lckhlaWdodEFmdGVyID0gMDsKLQkJaWYoY2hpbGRyZW5TaXplQmVmb3JlID09IDIpewotCQkJCWNvbnRhaW5lckhlaWdodEJlZm9yZSA9IEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9NSU5fSEVJR0hUICsgSlBBRWRpdG9yQ29uc3RhbnRzLkNPTVBBUlRNRU5UX0JVVFRPTV9PRkZTRVQ7Ci0JCX0KLQkJY29udGFpbmVySGVpZ2h0QWZ0ZXIgPSBjb250YWluZXJIZWlnaHRCZWZvcmUgKyAoKChjaGlsZHJlblNpemVBZnRlciAtIGNoaWxkcmVuU2l6ZUJlZm9yZSkvMikqSlBBRWRpdG9yQ29uc3RhbnRzLkFUVFJJQlVURVNfUExBQ0VNRU5UX1NURVApOwotCQkKLQkJaWYoIWlzQ29sbGFwc2VkKGNvbnRhaW5lclNoYXBlKSkKLQkJCWNvbnRhaW5lclNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuc2V0SGVpZ2h0KGNvbnRhaW5lckhlaWdodEFmdGVyKTsKLQkJZWxzZSAKLQkJCWNvbnRhaW5lclNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuc2V0SGVpZ2h0KEpQQUVkaXRvckNvbnN0YW50cy5DT01QQVJUTUVOVF9NSU5fSEVJR0hUKTsKLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZUVudGl0eVNoYXBlKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKXsKLQkJQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlID0gZ2V0UHJpbWFyeVNoYXBlKGVudGl0eVNoYXBlKTsKLQkJQ29udGFpbmVyU2hhcGUgcmVsYXRpb25TaGFwZSA9IGdldFJlbGF0aW9uU2hhcGUoZW50aXR5U2hhcGUpOwotCQlDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlID0gZ2V0QmFzaWNTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQotCQlwcmltYXJ5U2hhcGUuc2V0VmlzaWJsZSghaXNFbXB0eUNvbXBhcnRtZW50KHByaW1hcnlTaGFwZSkpOwotCQliYXNpY1NoYXBlLnNldFZpc2libGUoIWlzRW1wdHlDb21wYXJ0bWVudChiYXNpY1NoYXBlKSk7Ci0JCXJlbGF0aW9uU2hhcGUuc2V0VmlzaWJsZSghaXNFbXB0eUNvbXBhcnRtZW50KHJlbGF0aW9uU2hhcGUpKTsKLQotICAgICAgICByZWxhdGlvblNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuc2V0WShnZXROZXh0Q29tcGFydG1lbnRZKHByaW1hcnlTaGFwZSkpOwotICAgICAgICBiYXNpY1NoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuc2V0WShnZXROZXh0Q29tcGFydG1lbnRZKHJlbGF0aW9uU2hhcGUpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW1wdHlDb21wYXJ0bWVudChDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGUpIHsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZS5nZXRDaGlsZHJlbigpLnNpemUoKSA8PSAyOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlRW50aXR5SGVpZ3RoKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKXsKLQkJQ29udGFpbmVyU2hhcGUgcHJpbWFyeVNoYXBlID0gR3JhcGhpY3NVcGRhdGVyLmdldFByaW1hcnlTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCUNvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUgPSBHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShlbnRpdHlTaGFwZSk7Ci0JCUNvbnRhaW5lclNoYXBlIGJhc2ljU2hhcGUgPSBHcmFwaGljc1VwZGF0ZXIuZ2V0QmFzaWNTaGFwZShlbnRpdHlTaGFwZSk7Ci0JCQotICAgICAgICBlbnRpdHlTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLnNldEhlaWdodChKUEFFZGl0b3JDb25zdGFudHMuRU5USVRZX01JTl9IRUlHSFQgKyAKLSAgICAgICAgCQlwcmltYXJ5U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKSArIHJlbGF0aW9uU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKQotICAgICAgICAJCSsgYmFzaWNTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldEhlaWdodCgpICsgMik7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgaW50IGdldE5leHRDb21wYXJ0bWVudFkoQ29udGFpbmVyU2hhcGUgY29tcGFydG1lbnRTaGFwZSl7Ci0JCWlmKGlzRW1wdHlDb21wYXJ0bWVudChjb21wYXJ0bWVudFNoYXBlKSkKLQkJCXJldHVybiBjb21wYXJ0bWVudFNoYXBlLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkuZ2V0WSgpOwotCQlyZXR1cm4gY29tcGFydG1lbnRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpLmdldFkoKSArIGNvbXBhcnRtZW50U2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRIZWlnaHQoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENvbnRhaW5lclNoYXBlIGdldFByaW1hcnlTaGFwZShDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSl7Ci0JCUxpc3Q8U2hhcGU+IGNoaWxkcmVuID0gZW50aXR5U2hhcGUuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYoY2hpbGRyZW4uc2l6ZSgpIDwgUFJJTUFSWV9TSEFQRV9JTkRFWCsxKQotCQkJcmV0dXJuIG51bGw7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGFsZyA9IGNoaWxkcmVuLmdldChQUklNQVJZX1NIQVBFX0lOREVYKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlDb250YWluZXJTaGFwZSBwcmltYXJ5U2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWN0aXZlQ29udGFpbmVyUGUoYWxnKTsKLQkJcmV0dXJuIHByaW1hcnlTaGFwZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb250YWluZXJTaGFwZSBnZXRDb21wYXJ0bWVudFNlcGFyYXRvclNoYXBlKENvbnRhaW5lclNoYXBlIGNvbXBhcnRtZW50U2hhcGUpewotCQlHcmFwaGljc0FsZ29yaXRobSBhbGcgPSBjb21wYXJ0bWVudFNoYXBlLmdldENoaWxkcmVuKCkuZ2V0KDApLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUNvbnRhaW5lclNoYXBlIHByaW1hcnlTZXBhcmF0b3JTaGFwZSA9IChDb250YWluZXJTaGFwZSkgR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0QWN0aXZlQ29udGFpbmVyUGUoYWxnKTsKLQkJcmV0dXJuIHByaW1hcnlTZXBhcmF0b3JTaGFwZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBDb250YWluZXJTaGFwZSBnZXRSZWxhdGlvblNoYXBlKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlKXsKLQkJTGlzdDxTaGFwZT4gY2hpbGRyZW4gPSBlbnRpdHlTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlpZihjaGlsZHJlbi5zaXplKCk8UkVMQVRJT05fU0hBUEVfQ09OU1RBTlQrMSkKLQkJCXJldHVybiBudWxsOwotCQlHcmFwaGljc0FsZ29yaXRobSBhbGcgPSBjaGlsZHJlbi5nZXQoUkVMQVRJT05fU0hBUEVfQ09OU1RBTlQpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUNvbnRhaW5lclNoYXBlIHJlbGF0aW9uU2hhcGUgPSAoQ29udGFpbmVyU2hhcGUpIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFjdGl2ZUNvbnRhaW5lclBlKGFsZyk7Ci0JCXJldHVybiByZWxhdGlvblNoYXBlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbnRhaW5lclNoYXBlIGdldEJhc2ljU2hhcGUoQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUpewotCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGVudGl0eVNoYXBlLmdldENoaWxkcmVuKCk7Ci0JCWlmKGNoaWxkcmVuLnNpemUoKSA8IEJBU0lDX1NIQVBFX0lOREVYKzEpCi0JCQlyZXR1cm4gbnVsbDsKLQkJR3JhcGhpY3NBbGdvcml0aG0gYWxnID0gY2hpbGRyZW4uZ2V0KEJBU0lDX1NIQVBFX0lOREVYKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlDb250YWluZXJTaGFwZSBiYXNpY1NoYXBlID0gKENvbnRhaW5lclNoYXBlKSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRBY3RpdmVDb250YWluZXJQZShhbGcpOwotCQlyZXR1cm4gYmFzaWNTaGFwZTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29sbGFwc2VkKENvbnRhaW5lclNoYXBlIGNvbXBhcnRtZW50U2hhcGUpIHsKLQkJQ29udGFpbmVyU2hhcGUgY29udGFpbmVyID0gY29tcGFydG1lbnRTaGFwZS5nZXRDb250YWluZXIoKTsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmKGNvbXBhcnRtZW50U2hhcGUuZXF1YWxzKEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoY29udGFpbmVyKSkpCi0JCQlyZXN1bHQgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lciwgSlBBRWRpdG9yQ29uc3RhbnRzLlBSSU1BUllfQ09MTEFQU0VEKTsKLQkJZWxzZSBpZihjb21wYXJ0bWVudFNoYXBlLmVxdWFscyhHcmFwaGljc1VwZGF0ZXIuZ2V0QmFzaWNTaGFwZShjb250YWluZXIpKSkKLQkJCXJlc3VsdCA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoY29udGFpbmVyLCBKUEFFZGl0b3JDb25zdGFudHMuQkFTSUNfQ09MTEFQU0VEKTsKLQkJZWxzZSBpZihjb21wYXJ0bWVudFNoYXBlLmVxdWFscyhHcmFwaGljc1VwZGF0ZXIuZ2V0UmVsYXRpb25TaGFwZShjb250YWluZXIpKSkKLQkJCXJlc3VsdCA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldFByb3BlcnR5VmFsdWUoY29udGFpbmVyLCBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQ09MTEFQU0VEKTsKLQkJaWYoQm9vbGVhbi50b1N0cmluZyh0cnVlKS5lcXVhbHMocmVzdWx0KSkgCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gY29tcGFydG1lbnRTaGFwZQotCSAqIEBwYXJhbSBjb2xsYXBzZWQgCi0JICogQHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2V0Q29sbGFwc2VkKENvbnRhaW5lclNoYXBlIGNvbXBhcnRtZW50U2hhcGUsIGJvb2xlYW4gY29sbGFwc2VkKSB7Ci0JCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lciA9IGNvbXBhcnRtZW50U2hhcGUuZ2V0Q29udGFpbmVyKCk7Ci0JCWlmKGNvbXBhcnRtZW50U2hhcGUuZXF1YWxzKEdyYXBoaWNzVXBkYXRlci5nZXRQcmltYXJ5U2hhcGUoY29udGFpbmVyKSkpIHsKLQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoY29udGFpbmVyLCBKUEFFZGl0b3JDb25zdGFudHMuUFJJTUFSWV9DT0xMQVBTRUQsIEJvb2xlYW4udG9TdHJpbmcoY29sbGFwc2VkKSk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmKGNvbXBhcnRtZW50U2hhcGUuZXF1YWxzKEdyYXBoaWNzVXBkYXRlci5nZXRCYXNpY1NoYXBlKGNvbnRhaW5lcikpKSB7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKGNvbnRhaW5lciwgSlBBRWRpdG9yQ29uc3RhbnRzLkJBU0lDX0NPTExBUFNFRCwgQm9vbGVhbi50b1N0cmluZyhjb2xsYXBzZWQpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYoY29tcGFydG1lbnRTaGFwZS5lcXVhbHMoR3JhcGhpY3NVcGRhdGVyLmdldFJlbGF0aW9uU2hhcGUoY29udGFpbmVyKSkpIHsKLQkJCUdyYXBoaXRpLmdldFBlU2VydmljZSgpLnNldFByb3BlcnR5VmFsdWUoY29udGFpbmVyLCBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQ09MTEFQU0VELCBCb29sZWFuLnRvU3RyaW5nKGNvbGxhcHNlZCkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgdXBkYXRlSGVhZGVyKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLCBmaW5hbCBTdHJpbmcgbmV3SGVhZGVyKSB7Ci0JCWlmKGVudGl0eVNoYXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlMaXN0PFNoYXBlPiBzaGFwZXMgPSBlbnRpdHlTaGFwZS5nZXRDaGlsZHJlbigpOwotCQlJdGVyYXRvcjxTaGFwZT4gc2hJdCA9IHNoYXBlcy5pdGVyYXRvcigpOwotCQlTaGFwZSBoZWFkZXJTaGFwZSA9IG51bGw7OwotCQl3aGlsZSAoc2hJdC5oYXNOZXh0KCkpIHsKLQkJCWhlYWRlclNoYXBlID0gc2hJdC5uZXh0KCk7Ci0JCQlTdHJpbmcgc2hhcGVUeXBlID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShoZWFkZXJTaGFwZSwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU0hBUEVfVFlQRSk7Ci0JCQlpZiAoU2hhcGVUeXBlLkhFQURFUi50b1N0cmluZygpLmVxdWFscyhzaGFwZVR5cGUpKSAKLQkJCQlicmVhazsKLQkJCWhlYWRlclNoYXBlID0gbnVsbDsKLQkJfQotCQlpZiAoaGVhZGVyU2hhcGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBoZWFkZXJTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlpZiAoZ2EgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgVGV4dCB0eHQgPSAoVGV4dClnYS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotCQlpZiAoIUpQQUVkaXRvclV0aWwuYXJlSGVhZGVyc0VxdWFsKHR4dC5nZXRWYWx1ZSgpLCBuZXdIZWFkZXIpKSB7Ci0JCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbih0eHQpOwotCQkJUmVjb3JkaW5nQ29tbWFuZCByYyA9IG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJCXByb3RlY3RlZCB2b2lkIGRvRXhlY3V0ZSgpIHsKLQkJCQkJdHh0LnNldFZhbHVlKG5ld0hlYWRlcik7CQkKLQkJCQl9CQkKLQkJCX07CQkJCi0JCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShyYyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9HcmFwaGljc1VwZGF0ZXJJbXBsLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9HcmFwaGljc1VwZGF0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzg4YTkuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvR3JhcGhpY3NVcGRhdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotCi1wdWJsaWMgY2xhc3MgR3JhcGhpY3NVcGRhdGVySW1wbCBpbXBsZW1lbnRzIElHcmFwaGljc1VwZGF0ZXIgewotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVudGl0eUhlaWd0aChDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSkgewotCQlHcmFwaGljc1VwZGF0ZXIudXBkYXRlRW50aXR5SGVpZ3RoKGVudGl0eVNoYXBlKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JRGlzcGxheUZhY2FkZS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSURpc3BsYXlGYWNhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZlZDZkZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JRGlzcGxheUZhY2FkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBJRGlzcGxheUZhY2FkZSB7Ci0KLQlwdWJsaWMgdm9pZCBhc3luY0V4ZWMoUnVubmFibGUgcnVubmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUVjbGlwc2VGYWNhZGUuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lFY2xpcHNlRmFjYWRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTcxNjYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUVjbGlwc2VGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElFY2xpcHNlRmFjYWRlIHsKLQotCXB1YmxpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpOwotCi0JcHVibGljIElKYXZhQ29yZUZhY2FkZSBnZXRKYXZhQ29yZSgpOwotCQotCXB1YmxpYyBJRGlzcGxheUZhY2FkZSBnZXREaXNwbGF5KCk7Ci0JCi0JcHVibGljIElTdGF0aWNJREUgZ2V0SURFKCk7Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JR3JhcGhpY3NVcGRhdGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JR3JhcGhpY3NVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYjQ4NDQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUdyYXBoaWNzVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElHcmFwaGljc1VwZGF0ZXIgewotCQotCXB1YmxpYyB2b2lkIHVwZGF0ZUVudGl0eUhlaWd0aChDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKUEFEaWFncmFtRWRpdG9ySW5wdXQuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKUEFEaWFncmFtRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0MDliYi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSlBBRGlhZ3JhbUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpQQURpYWdyYW1FZGl0b3JJbnB1dCBleHRlbmRzIElFZGl0b3JJbnB1dCB7Ci0JCi0JcHVibGljIERpYWdyYW0gZ2V0RGlhZ3JhbSgpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvamVjdE5hbWUoKTsKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpQQUVkaXRvclV0aWwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKUEFFZGl0b3JVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZDI0NzguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpQQUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb25EZWNvcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yLlJlbEVuZERpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBJSlBBRWRpdG9yVXRpbCB7Ci0JCi0JcHVibGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3QoRnJlZUZvcm1Db25uZWN0aW9uIGMsICBpbnQgY250LCBpbnQgY29ubmVjdGlvbnNOdW0sIGJvb2xlYW4gc2VsZlJlbGF0aW9uKTsKLQkKLQlwdWJsaWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdChGcmVlRm9ybUNvbm5lY3Rpb24gYywgYm9vbGVhbiBzZWxmUmVsYXRpb24pOwotCQotCXB1YmxpYyBpbnQgY2FsY0Nvbm5lY3Rpb25MZW5ndGgoRnJlZUZvcm1Db25uZWN0aW9uIGMpOwotCQotCXB1YmxpYyBSZWxFbmREaXIgZ2V0Q29ubmVjdGlvblN0YXJ0RGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKTsKLQkKLQlwdWJsaWMgUmVsRW5kRGlyIGdldENvbm5lY3Rpb25FbmREaXIoRnJlZUZvcm1Db25uZWN0aW9uIGMpOwotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0SlBUeXBlKElDb21waWxhdGlvblVuaXQgY3UpOwotCQotCXB1YmxpYyB2b2lkIG9yZ2FuaXplSW1wb3J0cyhJQ29tcGlsYXRpb25Vbml0IGN1LCBJV29ya2JlbmNoU2l0ZSB3cyk7Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpOwotCQotCXB1YmxpYyB2b2lkIGZvcm1hdENvZGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpOwotCQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVVbmlxdWVFbnRpdHlOYW1lKEpwYVByb2plY3QganBhUHJvamVjdCwgCi0JCQkgIFN0cmluZyBwYWNrLCAKLQkJCSAgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCk7Ci0JCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVVuaXF1ZU1hcHBlZFN1cGVyY2xhc3NOYW1lKEpwYVByb2plY3QganBhUHJvamVjdCwKLQkJCVN0cmluZyBwYWNrLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKTsKLQotCXB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwgCi0JCQkJCQkJCQkgICBTdHJpbmcgZW50aXR5TmFtZSwgCi0JCQkJCQkJCQkgICBJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSwKLQkJCQkJCQkJCSAgIGJvb2xlYW4gaXNNYXBwZWRTdXBlckNsYXNzQ2hpbGQsIAotCQkJCQkJCQkJICAgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lLCAKLQkJCQkJCQkJCSAgIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSwgCi0JCQkJCQkJCQkgICBib29sZWFuIGhhc1ByaW1hcnlLZXkpIHRocm93cyBFeGNlcHRpb247Ci0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5RnJvbU1hcHBlZFN1cGVyY2xhc3NJblByb2plY3QoSVByb2plY3QgcHJvamVjdCwKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUpIHRocm93cyBFeGNlcHRpb247Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDYXJkaW5hbGl0eURlY29yYXRvcihDb25uZWN0aW9uRGVjb3JhdG9yIGNkKTsKLQkKLQlwdWJsaWMgdm9pZCBkaXNjYXJkV29ya2luZ0NvcHlPbmNlKElDb21waWxhdGlvblVuaXQgY3UpOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUphdmFDb3JlRmFjYWRlLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSmF2YUNvcmVGYWNhZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMTY5My4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JSmF2YUNvcmVGYWNhZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIEtpcmlsIE1pdG92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotCi1wdWJsaWMgaW50ZXJmYWNlIElKYXZhQ29yZUZhY2FkZSB7Ci0KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpwYVNvbHZlci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSUpwYVNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MThkMDFlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0lKcGFTb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuaW1wbC5JSW5kZXBlbmRlbmNlU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBJSnBhU29sdmVyIGV4dGVuZHMgSUluZGVwZW5kZW5jZVNvbHZlciB7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRGZWF0dXJlUHJvdmlkZXIoCi0JCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JUGVTZXJ2aWNlVXRpbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVBlU2VydmljZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1YTBjOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JUGVTZXJ2aWNlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLlByb3BlcnR5Q29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJUGVTZXJ2aWNlVXRpbCB7Ci0KLQlwdWJsaWMgRnJlZUZvcm1Db25uZWN0aW9uIGNyZWF0ZUZyZWVGb3JtQ29ubmVjdGlvbihEaWFncmFtIGRpYWdyYW0pOwotCQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSk7Ci0JCi0JcHVibGljIFByb3BlcnR5IGdldFByb3BlcnR5KFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5KTsKLQkKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVQcm9wZXJ0eShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSk7IAotCQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JU3RhdGljSURFLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9JU3RhdGljSURFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNGVlMGUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSVN0YXRpY0lERS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJU3RhdGljSURFIHsKLQotCXB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoSUZpbGUgZmlsZSkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBQ2hlY2tTdW0uamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUNoZWNrU3VtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMWM2ZTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBQ2hlY2tTdW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLQotcHVibGljIGNsYXNzIEpQQUNoZWNrU3VtIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBKUEFDaGVja1N1bSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZURpZ2VzdCBtZDUgPSBudWxsOwotCQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEpQQUNoZWNrU3VtIElOU1RBTkNFKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsJLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDb3VsZG4ndCBjcmVhdGUgaW5zdGFuY2Ugb2YgTUQ1IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWluc3RhbmNlID0gbmV3IEpQQUNoZWNrU3VtKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOyAKLQl9Ci0JCQotCXB1YmxpYyBTdHJpbmcgZ2V0U2F2ZWRTaGFwZU1ENShTaGFwZSBzaCkgewkKLQkJU3RyaW5nIGNoZWNrU3VtU3RyaW5nID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShzaCwgSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfRU5USVRZX0NIRUNLU1VNKTsKLQkJaWYgKGNoZWNrU3VtU3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNoZWNrU3VtU3RyaW5nOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhc3NpZ25FbnRpdHlTaGFwZXNNRDVTdHJpbmdzKERpYWdyYW0gZCwgSnBhUHJvamVjdCBqcGFQcm9qZWN0KSB7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJTGlzdDxTaGFwZT4gcGljdHMgPSBkLmdldENoaWxkcmVuKCk7Ci0JCWlmIChwaWN0cy5zaXplKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ID0gcGljdHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgcGljdCA9IGl0Lm5leHQoKTsKLQkJCVN0cmluZyBuYW1lID0gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShwaWN0LCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0xBU1NfTkFNRSk7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SlBUKG5hbWUsIHB1KTsKLQkJCVN0cmluZyBoYXNoID0gIiI7CS8vJE5PTi1OTFMtMSQKLQkJCWlmIChqcHQgIT0gbnVsbCkgewotCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJCWhhc2ggPSBnZW5lcmF0ZUNvbXBpbGF0aW9uVW5pdE1ENVN0cmluZyhjdSk7Ci0JCQl9Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKHBpY3QsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX0VOVElUWV9DSEVDS1NVTSwgaGFzaCk7Ci0JCX0KLQl9Ci0KLQkJCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNvbXBpbGF0aW9uVW5pdE1ENVN0cmluZyhJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCVN0cmluZyBzcmMgPSBudWxsOwotCQl0cnkgewotCQkJc3JjID0gY3UuZ2V0U291cmNlKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBnZXQgdGhlIHNvdXJjZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdCIsIGUpOyAvLyROT04tTkxTLTEkCQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJYnl0ZVtdIHJlcyA9IG1kNS5kaWdlc3Qoc3JjLmdldEJ5dGVzKCkpOwotCQlTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChieXRlIGIgOiByZXMpCi0JCQlzYi5hcHBlbmQoQnl0ZS50b1N0cmluZyhiKSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwkJCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW50aXR5TW9kZWxDaGFuZ2VkKFNoYXBlIHNoLCBKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJaWYgKHNoID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgCi0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJU3RyaW5nIG5hbWUgPSBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0xBU1NfTkFNRSk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKUFQobmFtZSwgcHUpOwotCQlTdHJpbmcgc2F2ZWRNRDUgPSBnZXRTYXZlZFNoYXBlTUQ1KHNoKTsJCi0JCVN0cmluZyBhY3R1YWxNRDUgPSAiIjsJLy8kTk9OLU5MUy0xJAotCQlpZiAoanB0ICE9IG51bGwpIHsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSBKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJYWN0dWFsTUQ1ID0gZ2VuZXJhdGVDb21waWxhdGlvblVuaXRNRDVTdHJpbmcoY3UpOwotCQl9Ci0JCXJldHVybiAhc2F2ZWRNRDUuZXF1YWxzKGFjdHVhbE1ENSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxEaWZmZXJlbnRGcm9tRGlhZ3JhbShEaWFncmFtIGQsIEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlMaXN0PFNoYXBlPiBwaWN0cyA9IGQuZ2V0Q2hpbGRyZW4oKTsKLQkJaWYgKHBpY3RzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvcjxTaGFwZT4gaXQgPSBwaWN0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlTaGFwZSBwaWN0ID0gaXQubmV4dCgpOwotCQkJaWYgKGlzRW50aXR5TW9kZWxDaGFuZ2VkKHBpY3QsIGpwYVByb2plY3QpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JDb25zdGFudHMuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmUxNGVkLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkudXRpbC5Db2xvckNvbnN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnV0aWwuSUNvbG9yQ29uc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yQ29uc3RhbnRzIHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfUFJFRklYX0RJUlRZID0gIiogIjsJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPiBQUklNSVRJVkVfVE9fV1JBUFBFUiA9IG5ldyBIYXNodGFibGU8U3RyaW5nLFN0cmluZz4oKTsKLQkKLQlwdWJsaWMgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBXUkFQUEVSX1NJTVBMRV9OQU1FUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJCi0JcHVibGljIHN0YXRpYyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IEFOTk9UQVRJT05fTkFNRV9UT19LRVkgPSBuZXcgSGFzaHRhYmxlPFN0cmluZywgU3RyaW5nPigpOwotCXB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gQ0FSRElOQUxJVFlfTEFCRUxTID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTExBUFNFX0ZFQVRVUkVTID0gImNvbGxhcHNlRmVhdHVyZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJQ29sb3JDb25zdGFudCBFTlRJVFlfVEVYVF9GT1JFR1JPVU5EID0KLSAgICAgICAgbmV3IENvbG9yQ29uc3RhbnQoMCwgMCwgNTEpOwotCQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb2xvckNvbnN0YW50IEVOVElUWV9CQUNLR1JPVU5EID0KLSAgICAgICAgbmV3IENvbG9yQ29uc3RhbnQoMjEyLCAyMzEsIDI0OCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElDb2xvckNvbnN0YW50IENPTk5FQ1RJT05fTElORV9DT0xPUiA9IAotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCg5OCwgMTMxLDE2Nyk7CQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgSUNvbG9yQ29uc3RhbnQgRU5USVRZX0JPUkRFUl9DT0xPUiA9IAotICAgICAgICBuZXcgQ29sb3JDb25zdGFudCg5OCwgMTMxLDE2Nyk7CQkKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUUlVFX1NUUklORyA9IEJvb2xlYW4udG9TdHJpbmcodHJ1ZSk7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09OTkVDVElPTl9MSU5FX1dJRFRIID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlRJVFlfQk9SREVSX1dJRFRIID0gMjsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlRJVFlfQ09STkVSX1dJRFRIID0gNjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBFTlRJVFlfQ09STkVSX0hFSUdIVCA9IDY7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX01JTl9IRUlHSFQgPSAzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRJVFlfTUlOX1dJRFRIID0gNTA7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgRU5USVRZX1dJRFRIID0gMTIwOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVOVElUWV9IRUlHSFQgPSA3MDsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVfUkVDVF9IRUlHSFQgPSAzMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVTX1RPUF9PRkZTRVQgPSAxNTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBBVFRSSUJVVEVTX1BMQUNFTUVOVF9TVEVQID0gMjA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFX1RFWFRfUkVDVF9YID0gMjE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFX1RFWFRfUkVDVF9XSURUSF9SRURVQ0VSID0gMjE7Ci0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9SRUNUX0xFRlRfT0ZGU0VUID0gMDsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX0hFQURFUl9YID0gNzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX0hFQURFUl9ZID0gNzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRUFERVJfSUNPTl9SRUNUX1dJRFRIID0gMjQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSEVBREVSX0lDT05fUkVDVF9IRUlHSFQgPSAyNDsgCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSEVBREVSX1RFWFRfUkVDVF9IRUlHSFQgPSAyMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRUFERVJfVEVYVF9SRUNUX1ggPSAyNTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBIRUFERVJfVEVYVF9SRUNUX1dJRFRIX1JFRFVDRVIgPSAyNTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBJQ09OX1ggPSA0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fWSA9IDQ7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9XSURUSCA9IDE2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IElDT05fSEVJR0hUID0gMTY7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9SRUNUX1dJRFRIID0gMjA7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgSUNPTl9SRUNUX0hFSUdIVCA9IDIwOwotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFUEFSQVRPUl9IRUlHSFQgPSAyOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTVBBUlRNRU5UX01JTl9IRUlHSFQgPSAxMzsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT01QQVJUTUVOVF9CVVRUT01fT0ZGU0VUID0gNTsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0JBU0lDID0gIkJhc2ljIjsgCQkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9JRCA9ICJJZCI7IAkJCQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX09ORV9UT19PTkUgPSAiT25lVG9PbmUiOyAJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9PTkVfVE9fTUFOWSA9ICJPbmVUb01hbnkiOyAJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX01BTllfVE9fT05FID0gIk1hbnlUb09uZSI7IAkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UQVRJT05fTUFOWV9UT19NQU5ZID0gIk1hbnlUb01hbnkiOyAJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX1ZFUlNJT04gPSAiVmVyc2lvbiI7IAkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RBVElPTl9FTUJFRERFRCA9ICJFbWJlZGRlZCI7IAkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX0VNQkVEREVEX0lEID0gIkVtYmVkZGVkSWQiOyAJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVEFUSU9OX1RSQU5TSUVOVCA9ICJUcmFuc2llbnQiOyAJCQkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05fVFlQRV9VTklESVJFQ1RJT05BTCA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMID0gMjsKLQkKLQlwdWJsaWMgc3RhdGljIEhhc2hTZXQ8U3RyaW5nPiBSRUxBVElPTl9BTk5PVEFUSU9OUyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QX0VOVElUWV9DTEFTU19OQU1FID0gInByb3BfZW50aXR5X2NsYXNzX25hbWUiOwkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUF9TSEFQRV9UWVBFID0gInByb3Bfc2hhcGVfdHlwZSI7CQkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQUk9QX0FUVFJJQlNfTlVNID0gInByb3BfYXR0cmlic19udW0iOwkJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUFJPUF9TUEVDSUZJRURfTkFNRSA9ICJzcGVjaWZpZWROYW1lIjsJCS8vJE5PTi1OTFMtMSQKLQkJCi0JcHVibGljIHN0YXRpYyBlbnVtIERlY29yYXRvclR5cGUgewotCQlDQVJESU5BTElUWSwKLQkJQVNTT0NJQVRJT04KLQl9Ci0KLQkvL3B1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BfQ09OX0RJUl9TVEFSVCA9ICJwcm9wX2Nvbl9kaXJfc3RhcnQiOwkJCS8vJE5PTi1OTFMtMSQKLQkvL3B1YmxpYyBzdGF0aWMgU3RyaW5nIFBST1BfQ09OX0RJUl9FTkQgPSAicHJvcF9jb25fZGlyX2VuZCI7CQkJCS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRF9WSUVXX0pQQV9ERVRBSUxTID0gIm9yZy5lY2xpcHNlLmpwdC51aS5qcGFEZXRhaWxzVmlldyI7CQkJCQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElEX1ZJRVdfTUlOSUFUVVJFID0gIm9yZy5lY2xpcHNlLmdyYXBoaXRpLnVpLmludGVybmFsLmVkaXRvci50aHVtYm5haWx2aWV3IjsJLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENBUkRJTkFMSVRZX1pFUk9fT05FID0gIjAuLjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0FSRElOQUxJVFlfT05FID0gIjEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ0FSRElOQUxJVFlfWkVST19OID0gIjAuLk4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBlbnVtIFNoYXBlVHlwZSB7SUNPTiwgSEVBREVSLCBBVFRSSUJVVEUsIENPTVBBUlRNRU5UfTsKLQkKLQlzdGF0aWMgewotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX0JBU0lDLCBNYXBwaW5nS2V5cy5CQVNJQ19BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX0lELCBNYXBwaW5nS2V5cy5JRF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX09ORV9UT19PTkUsIE1hcHBpbmdLZXlzLk9ORV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJQU5OT1RBVElPTl9OQU1FX1RPX0tFWS5wdXQoQU5OT1RBVElPTl9PTkVfVE9fTUFOWSwgTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJQU5OT1RBVElPTl9OQU1FX1RPX0tFWS5wdXQoQU5OT1RBVElPTl9NQU5ZX1RPX09ORSwgTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJQU5OT1RBVElPTl9OQU1FX1RPX0tFWS5wdXQoQU5OT1RBVElPTl9NQU5ZX1RPX01BTlksIE1hcHBpbmdLZXlzLk1BTllfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlBTk5PVEFUSU9OX05BTUVfVE9fS0VZLnB1dChBTk5PVEFUSU9OX1ZFUlNJT04sIE1hcHBpbmdLZXlzLlZFUlNJT05fQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJQU5OT1RBVElPTl9OQU1FX1RPX0tFWS5wdXQoQU5OT1RBVElPTl9FTUJFRERFRCwgTWFwcGluZ0tleXMuRU1CRURERURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJQU5OT1RBVElPTl9OQU1FX1RPX0tFWS5wdXQoQU5OT1RBVElPTl9FTUJFRERFRF9JRCwgTWFwcGluZ0tleXMuRU1CRURERURfSURfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJQU5OT1RBVElPTl9OQU1FX1RPX0tFWS5wdXQoQU5OT1RBVElPTl9UUkFOU0lFTlQsIE1hcHBpbmdLZXlzLlRSQU5TSUVOVF9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQkKLQkJUkVMQVRJT05fQU5OT1RBVElPTlMuYWRkKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpOwotCQlSRUxBVElPTl9BTk5PVEFUSU9OUy5hZGQoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpOwotCQlSRUxBVElPTl9BTk5PVEFUSU9OUy5hZGQoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpOwotCQlSRUxBVElPTl9BTk5PVEFUSU9OUy5hZGQoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKTsJCi0JCQotCQlDQVJESU5BTElUWV9MQUJFTFMuYWRkKENBUkRJTkFMSVRZX1pFUk9fT05FKTsKLQkJQ0FSRElOQUxJVFlfTEFCRUxTLmFkZChDQVJESU5BTElUWV9PTkUpOwotCQlDQVJESU5BTElUWV9MQUJFTFMuYWRkKENBUkRJTkFMSVRZX1pFUk9fTik7Ci0JCQotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoImludCIsIEludGVnZXIuY2xhc3MuZ2V0TmFtZSgpKTsJCS8vJE5PTi1OTFMtMSQKLQkJUFJJTUlUSVZFX1RPX1dSQVBQRVIucHV0KCJsb25nIiwgTG9uZy5jbGFzcy5nZXROYW1lKCkpOwkJCS8vJE5PTi1OTFMtMSQKLQkJUFJJTUlUSVZFX1RPX1dSQVBQRVIucHV0KCJkb3VibGUiLCBEb3VibGUuY2xhc3MuZ2V0TmFtZSgpKTsJCS8vJE5PTi1OTFMtMSQKLQkJUFJJTUlUSVZFX1RPX1dSQVBQRVIucHV0KCJmbG9hdCIsIEZsb2F0LmNsYXNzLmdldE5hbWUoKSApOwkJLy8kTk9OLU5MUy0xJAotCQlQUklNSVRJVkVfVE9fV1JBUFBFUi5wdXQoImJvb2xlYW4iLCBCb29sZWFuLmNsYXNzLmdldE5hbWUoKSk7CS8vJE5PTi1OTFMtMSQKLQkJUFJJTUlUSVZFX1RPX1dSQVBQRVIucHV0KCJjaGFyIiwgQ2hhcmFjdGVyLmNsYXNzLmdldE5hbWUoKSk7CS8vJE5PTi1OTFMtMSQKLQkJUFJJTUlUSVZFX1RPX1dSQVBQRVIucHV0KCJieXRlIiwgQnl0ZS5jbGFzcy5nZXROYW1lKCkpOwkJCS8vJE5PTi1OTFMtMSQKLQkJUFJJTUlUSVZFX1RPX1dSQVBQRVIucHV0KCJzaG9ydCIsIFNob3J0LmNsYXNzLmdldE5hbWUoKSk7CQkvLyROT04tTkxTLTEkCi0JCQotCQlXUkFQUEVSX1NJTVBMRV9OQU1FUy5hZGQoIkludGVnZXIiKTsJCS8vJE5PTi1OTFMtMSQKLQkJV1JBUFBFUl9TSU1QTEVfTkFNRVMuYWRkKCJMb25nIik7CQkJLy8kTk9OLU5MUy0xJAotCQlXUkFQUEVSX1NJTVBMRV9OQU1FUy5hZGQoIkRvdWJsZSIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJV1JBUFBFUl9TSU1QTEVfTkFNRVMuYWRkKCJGbG9hdCIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJV1JBUFBFUl9TSU1QTEVfTkFNRVMuYWRkKCJCb29sZWFuIik7CQkvLyROT04tTkxTLTEkCi0JCVdSQVBQRVJfU0lNUExFX05BTUVTLmFkZCgiQ2hhcmFjdGVyIik7CQkvLyROT04tTkxTLTEkCi0JCVdSQVBQRVJfU0lNUExFX05BTUVTLmFkZCgiQnl0ZSIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJV1JBUFBFUl9TSU1QTEVfTkFNRVMuYWRkKCJTaG9ydCIpOwkJCS8vJE5PTi1OTFMtMSQKLQkJV1JBUFBFUl9TSU1QTEVfTkFNRVMuYWRkKCJTdHJpbmciKTsJCQkvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFJJTUlUSVZFX1RZUEVTX0FORF9XUkFQUEVSUyA9IHsiaW50IiwgCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCSAiSW50ZWdlciIsIAkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCSAibG9uZyIsIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQkJCQkJCQkgIkxvbmciLCAJCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgInNob3J0IiwgCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCSAiU2hvcnQiLCAJCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgImNoYXIiLCAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJDaGFyYWN0ZXIiLAkJCQkJLy8kTk9OLU5MUy0xJAkJCQkJCQkJCQkJCQkJCQkgCi0JCQkJCQkJCQkJCQkJCQkJICJib29sZWFuIiwgCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJCb29sZWFuIiwgCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgImJ5dGUiLCAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJCeXRlIiwgCQkJCQkJLy8kTk9OLU5MUy0xJAkJCQkJCQkJCQkJCQkJCQkgCi0JCQkJCQkJCQkJCQkJCQkJICJkb3VibGUiLCAJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJEb3VibGUiLCAJCQkJCQkvLyROT04tTkxTLTEkCQkJCQkJCQkJCQkJCQkJCSAKLQkJCQkJCQkJCQkJCQkJCQkgImZsb2F0IiwJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQkJCQkJICJGbG9hdCIsCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCQkJCSAiU3RyaW5nIn07CQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCQkJCi0JcHVibGljIGZpbmFsIHN0YXRpYyBIYXNoU2V0PFN0cmluZz4gUFJJTUlUSVZFX1RZUEVTX0FORF9XUkFQUEVSU19TRVQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CQotCQotCXN0YXRpYyB7Ci0JCWZvciAoU3RyaW5nIHR5cGUgOiBQUklNSVRJVkVfVFlQRVNfQU5EX1dSQVBQRVJTKQotCQkJUFJJTUlUSVZFX1RZUEVTX0FORF9XUkFQUEVSU19TRVQuYWRkKHR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QRU5fV0hPTEVfUEVSU0lTVEVOQ0VfVU5JVF9FRElUT1JfUFJPUEVSVFkgPSAiSlBBRGlhZ3JhbUVkaXRvcl9vcGVuV2hvbGVQZXJzaXN0ZW5jZVVuaXQiOwkvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklNQVJZX0NPTExBUFNFRCA9ICJwcmltYXJ5IGNvbGxhcHNlZCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNJQ19DT0xMQVBTRUQgPSAiYmFzaWMgY29sbGFwc2VkIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVMQVRJT05fQ09MTEFQU0VEID0gInJlbGF0aW9uIGNvbGxhcHNlZCI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FTlRJVFlfQ0hFQ0tTVU0gPSAiZGlhZ3JhbS5jaGVja3N1bSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfU1VQUE9SVF9ESUFMT0dfSUQgPSAianBhX3N1cHBvcnRfd2FybmluZyI7CS8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfWE1MX1RBRyA9ICJlbnRpdHkiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX05BTUVfVEFHID0gImVudGl0eS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9XSURUSF9UQUcgPSAiZW50aXR5LXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0hFSUdIVF9UQUcgPSAiZW50aXR5LWhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9YX0NPT1JESU5BVEVfVEFHID0gImVudGl0eS1YLUNvb3JkaW5hdGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfWV9DT09SRElOQVRFX1RBRyA9ICJlbnRpdHktWS1Db29yZGluYXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1BSSU1BUllfU0VDVElPTl9TVEFURV9UQUcgPSAicHJpbWFyeS1jb2xsYXBzZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfUkVMQVRJT05fU0VDVElPTl9TVEFURV9UQUcgPSAicmVsYXRpb24tY29sbGFwc2VkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0JBU0lDX1NFQ1RJT05fU1RBVEVfVEFHID0gImJhc2ljLWNvbGxhcHNlZCI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM1MzgzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvclV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5SZWNvcmRpbmdDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24udXRpbC5UcmFuc2FjdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuSUZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5Sb3VuZGVkUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guSmF2YVNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLkZvcm1hdEFsbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuYWN0aW9ucy5Pcmdhbml6ZUltcG9ydHNBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5DbGFzc1JlZjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sSmF2YUNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5wZXJzaXN0ZW5jZS5YbWxQZXJzaXN0ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UucGVyc2lzdGVuY2UuWG1sUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS54bWwuSnBhWG1sUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mYWNhZGUuRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5pMThuLkpQQUVkaXRvck1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvci5SZWxFbmREaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9ySW1hZ2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuSVJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSVByb2plY3RGYWNldFZlcnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JVdGlsIHsKLQkKLQotCXByaXZhdGUgc3RhdGljIElQZVNlcnZpY2VVdGlsIHBlVXRpbCA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBFUlNJU1RFTkNFX1BST1ZJREVSX0xJQlJBUllfU1RSSU5HID0gImphdmF4L3BlcnNpc3RlbmNlLyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKFN0cmluZyBzKSB7Ci0JCWlmIChzLmxlbmd0aCgpID09IDApIHJldHVybiBzOwotCQlTdHJpbmcgcmVzID0gcy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpICsgcy5zdWJzdHJpbmcoMSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKFN0cmluZyBzKSB7Ci0JCWlmIChzLmxlbmd0aCgpID09IDApIHJldHVybiBzOwotCQlTdHJpbmcgcmVzID0gcy5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpICsgcy5zdWJzdHJpbmcoMSk7Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJldmVydEZpcnN0TGV0dGVyQ2FzZShTdHJpbmcgcykgewotCQlpZiAoKHMgPT0gbnVsbCkgfHwgKHMubGVuZ3RoKCkgPT0gMCkpCi0JCQlyZXR1cm4gczsKLQkJcmV0dXJuIChDaGFyYWN0ZXIuaXNMb3dlckNhc2Uocy5jaGFyQXQoMCkpID8gCi0JCQkJcy5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpIDoKLQkJCQlzLnN1YnN0cmluZygwLCAxKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpICsKLQkJCQlzLnN1YnN0cmluZygxKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIHN0YXRpYyBJUGVTZXJ2aWNlVXRpbCBnZXRQZVV0aWwoKSB7Ci0JCWlmIChwZVV0aWwgPT0gbnVsbCkKLQkJCXBlVXRpbCA9IG5ldyBQZVNlcnZpY2VVdGlsSW1wbCgpOwotCQlyZXR1cm4gcGVVdGlsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzSWdub3JlRmlyc3RMZXR0ZXJDYXNlKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCWlmICgoczEgPT0gbnVsbCkgJiYgKHMyID09IG51bGwpKSAKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoKHMxID09IG51bGwpIHx8IChzMiA9PSBudWxsKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHMxLmxlbmd0aCgpICE9IHMyLmxlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoczEubGVuZ3RoKCkgPT0gMCkgCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHMxLnN1YnN0cmluZygwLCAxKS5lcXVhbHNJZ25vcmVDYXNlKHMyLnN1YnN0cmluZygwLCAxKSkgJiYKLQkJCQlzMS5zdWJzdHJpbmcoMSkuZXF1YWxzKHMyLnN1YnN0cmluZygxKSk7Ci0JfQotCQotICAgIHB1YmxpYyBzdGF0aWMgQW5jaG9yIGdldEFuY2hvcihDb250YWluZXJTaGFwZSBjcykgeyAKLSAgICAJQ29sbGVjdGlvbjxBbmNob3I+IGFuY2hvcnMgID0gY3MuZ2V0QW5jaG9ycygpOwotCSAgICByZXR1cm4gYW5jaG9ycy5pdGVyYXRvcigpLm5leHQoKTsgICAgCQotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEFuY2hvciBnZXRBbmNob3IoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgSUZlYXR1cmVQcm92aWRlciBmcCkgewotICAgIAlQaWN0b2dyYW1FbGVtZW50IHBlID0gZnAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0gICAgCWlmICgocGUgPT0gbnVsbCkgfHwgKCEocGUgaW5zdGFuY2VvZiBDb250YWluZXJTaGFwZSkpKQotICAgIAkJcmV0dXJuIG51bGw7Ci0gICAgCXJldHVybiBnZXRBbmNob3IoKENvbnRhaW5lclNoYXBlKXBlKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotICAgIAlyZXR1cm4gYXQuZ2V0TmFtZSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXR1cm5TaW1wbGVOYW1lKFN0cmluZyBzKSB7Ci0gICAgCXJldHVybiBzLnN1YnN0cmluZyhzLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHMpIHsKLSAgICAJaWYgKChzLnN0YXJ0c1dpdGgoIlwiIikpICYmIChzLmVuZHNXaXRoKCJcIiIpKSkgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIAkJcmV0dXJuIHMuc3Vic3RyaW5nKDEsIHMubGVuZ3RoKCkgLSAxKTsKLSAgICAJcmV0dXJuIHM7Ci0gICAgfQotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRvb2x0aXBUZXh0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlTdHJpbmcgc3VwZXJQZXJzaXN0ZW50VHlwZU5hbWUpIHsKLQkJU3RyaW5nIHJlcyA9IGpwdC5nZXROYW1lKCk7Ci0JCWlmIChzdXBlclBlcnNpc3RlbnRUeXBlTmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuSlBBRWRpdG9yVXRpbF9pbmhlcml0VHlwZVRvb2x0aXBUZXh0LAotCQkJCQluZXcgT2JqZWN0W10geyByZXMsIHN1cGVyUGVyc2lzdGVudFR5cGVOYW1lIH0pOwotCQl9Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChKUEFFZGl0b3JNZXNzYWdlcy5KUEFFZGl0b3JVdGlsX2Z1bGxuYW1lVG9vbHRpcFRleHQsCi0JCQkJbmV3IE9iamVjdFtdIHsgcmVzIH0pOwotCX0KLQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGVOYW1lKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0KSB7Ci0gICAgCXJldHVybiBnZXRBdHRyaWJ1dGVUeXBlTmFtZShhdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpKTsKLSAgICB9ICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVR5cGVOYW1lKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdCkgewotICAgIAlyZXR1cm4gYXQuZ2V0VHlwZU5hbWUoKTsKLSAgICB9ICAgICAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRBdHRyaWJ1dGVUeXBlVHlwZU5hbWVzKEphdmFSZXNvdXJjZUF0dHJpYnV0ZSBhdCkgewotICAgIAlMaXN0SXRlcmF0b3I8U3RyaW5nPiB0dCA9IGF0LmdldFR5cGVUeXBlQXJndW1lbnROYW1lcygpLml0ZXJhdG9yKCk7Ci0gICAgCWlmICgodHQgPT0gbnVsbCkgfHwgIXR0Lmhhc05leHQoKSkgCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJTGlua2VkTGlzdDxTdHJpbmc+IHJlcyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkgICAgd2hpbGUgKHR0Lmhhc05leHQoKSkgCi0JICAgIAlyZXMuYWRkKHR0Lm5leHQoKSk7IAotICAgIAlyZXR1cm4gcmVzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBdHRyaWJ1dGVUeXBlTmFtZVdpdGhHZW5lcmljcyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotICAgIAlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZU5hbWVXaXRoR2VuZXJpY3MoYXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0gICAgfQotCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVHlwZU5hbWVXaXRoR2VuZXJpY3MoSmF2YVJlc291cmNlQXR0cmlidXRlIGF0KSB7Ci0gICAgCVN0cmluZ0J1aWxkZXIgcmVzID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0QXR0cmlidXRlVHlwZU5hbWUoYXQpKTsKLSAgICAJTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBhdC5nZXRUeXBlVHlwZUFyZ3VtZW50TmFtZXMoKS5pdGVyYXRvcigpOwotICAgIAlpZiAoKGl0ICE9IG51bGwpICYmIGl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgnPCcpOwotCSAgICAJcmVzLmFwcGVuZChjcmVhdGVDb21tYVNlcGFyYXRlZExpc3RPZkZ1bGxUeXBlTmFtZXMoaXQpKTsKLQkgICAgCXJlcy5hcHBlbmQoJz4nKTsKLSAgICAJfQotICAgIAlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7Ci0gICAgfSAgICAgICAgCi0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRHZW5lcmljc0VsZW1lbnRUeXBlcyhTdHJpbmcgdHlwZU5hbWUpIHsKLSAgICAJaWYgKHR5cGVOYW1lLmluZGV4T2YoIjwiKSA9PSAtMSkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJU3RyaW5nIHR5cGVzID0gdHlwZU5hbWUuc3Vic3RyaW5nKHR5cGVOYW1lLmluZGV4T2YoIjwiKSArIDEsIHR5cGVOYW1lLmxhc3RJbmRleE9mKCI+IikpOwkvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLSAgICAJU3RyaW5nW10gdHlwZU5hbWVzID0gdHlwZXMuc3BsaXQoIiwiKTsJCS8vJE5PTi1OTFMtMSQKLSAgICAJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlTmFtZXMubGVuZ3RoOyBpKyspIHsKLSAgICAJCXR5cGVOYW1lc1tpXSA9IHR5cGVOYW1lc1tpXS50cmltKCk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHR5cGVOYW1lczsKLSAgICB9ICAgICAgICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKFN0cmluZ1tdIHN0cmluZ3MpIHsKLSAgICAJaWYgKChzdHJpbmdzID09IG51bGwpIHx8IChzdHJpbmdzLmxlbmd0aCA9PSAwKSkKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzdHJpbmdzWzBdKSk7Ci0gICAgCWZvciAoaW50IGkgPSAxOyBpIDwgc3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgIAkJcmVzLmFwcGVuZCgiLCAiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0gICAgCQlyZXMuYXBwZW5kKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzdHJpbmdzW2ldKSk7Ci0gICAgCX0KLSAgICAJcmV0dXJuIHJlcy50b1N0cmluZygpOwotICAgIH0gICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUNvbW1hU2VwYXJhdGVkTGlzdE9mU2ltcGxlVHlwZU5hbWVzKExpc3RJdGVyYXRvcjxTdHJpbmc+IHN0ckl0KSB7Ci0gICAgCWlmICgoc3RySXQgPT0gbnVsbCkgfHwgIXN0ckl0Lmhhc05leHQoKSkgCi0gICAgCQlyZXR1cm4gbnVsbDsKLSAgICAJU3RyaW5nQnVpbGRlciByZXMgPSBuZXcgU3RyaW5nQnVpbGRlcihKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoc3RySXQubmV4dCgpKSk7ICAgIAkKLQkgICAgd2hpbGUgKHN0ckl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgiLCAiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JICAgIAlyZXMuYXBwZW5kKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShzdHJJdC5uZXh0KCkpKTsKLQkgICAgfQotICAgIAlyZXR1cm4gcmVzLnRvU3RyaW5nKCk7ICAgIAkKLSAgICB9ICAgICAKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVDb21tYVNlcGFyYXRlZExpc3RPZkZ1bGxUeXBlTmFtZXMoTGlzdEl0ZXJhdG9yPFN0cmluZz4gc3RySXQpIHsKLSAgICAJaWYgKChzdHJJdCA9PSBudWxsKSB8fCAhc3RySXQuaGFzTmV4dCgpKSAKLSAgICAJCXJldHVybiBudWxsOwotICAgIAlTdHJpbmdCdWlsZGVyIHJlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0ckl0Lm5leHQoKSk7ICAgIAkKLQkgICAgd2hpbGUgKHN0ckl0Lmhhc05leHQoKSkgewotCSAgICAJcmVzLmFwcGVuZCgiLCAiKTsJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JICAgIAlyZXMuYXBwZW5kKHN0ckl0Lm5leHQoKSk7Ci0JICAgIH0KLSAgICAJcmV0dXJuIHJlcy50b1N0cmluZygpOyAgICAJCi0gICAgfSAgICAgICAgICAgICAgICAgICAgCi0gICAgCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGV4dChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0gICAgCXJldHVybiBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9vbHRpcFRleHQoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotICAgIAlTdHJpbmcgcmVzID0ganB0LmdldE5hbWUoKTsKLSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclV0aWxfZnVsbG5hbWVUb29sdGlwVGV4dCwgbmV3IE9iamVjdFtdIHsgcmVzIH0pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKUFR5cGUoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotICAgIAlTdHJpbmcgbmFtZSA9IGN1LmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmICghbmFtZS5lbmRzV2l0aCgiLmphdmEiKSkJCQkJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0gICAgCUlUeXBlIHRwID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0gICAgCWlmICh0cCA9PSBudWxsKQotICAgIAkJcmV0dXJuIG51bGw7OwotICAgIAluYW1lID0gdHAuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKCk7Ci0JCUlKYXZhUHJvamVjdCBqcCA9IGN1LmdldEphdmFQcm9qZWN0KCk7Ci0gICAgCUpwYVByb2plY3QgcHJvaiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwcm9qID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0SnBhUHJvamVjdChqcC5nZXRQcm9qZWN0KCkpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvYnRhaW4gdGhlIEpQQSBwcm9qZWN0LiIsIGUpOyAvLyROT04tTkxTLTEkCQotCQl9Ci0JCWlmIChwcm9qID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLSAgICAJUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0KHByb2opOwotICAgIAlQZXJzaXN0ZW50VHlwZSBwdCA9IHB1LmdldFBlcnNpc3RlbnRUeXBlKG5hbWUpOwotCQlpZiAoKHB0ID09IG51bGwpIHx8ICghKHB0IGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSkpCi0JCQlyZXR1cm4gbnVsbDsKLSAgICAJcmV0dXJuCShKYXZhUGVyc2lzdGVudFR5cGUpcHQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVGcm9tU2hhcGUoU2hhcGUgc2gpIHsKLSAgICAJQ29udGFpbmVyU2hhcGUgY3NoID0gKENvbnRhaW5lclNoYXBlKXNoOwotICAgIAlMaXN0PFNoYXBlPiBzaGFwZXMgPSBjc2guZ2V0Q2hpbGRyZW4oKTsKLSAgICAJSXRlcmF0b3I8U2hhcGU+IGl0ID0gc2hhcGVzLml0ZXJhdG9yKCk7Ci0gICAgCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAJCVNoYXBlIHNoYXBlID0gaXQubmV4dCgpOwotICAgIAkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotICAgIAkJaWYgKGdhIGluc3RhbmNlb2YgUmVjdGFuZ2xlKSB7Ci0gICAgCQkJUmVjdGFuZ2xlIHJlY3QgPSAoUmVjdGFuZ2xlKWdhOwotICAgIAkJCWlmIChyZWN0LmdldFkoKSA9PSAwKSB7Ci0gICAgCQkJCUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGdhcyA9IHJlY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpOwotICAgIAkJCQlpZiAoZ2FzLnNpemUoKSA+IDApIHsgCi0gICAgCQkJCQlHcmFwaGljc0FsZ29yaXRobSBncmEgPSBnYXMuZ2V0KDApOwotICAgIAkJCQkJaWYgKGdyYSBpbnN0YW5jZW9mIFRleHQpCi0gICAgCQkJCQkJcmV0dXJuICgoVGV4dClncmEpLmdldFZhbHVlKCk7IAotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9Ci0gICAgCXJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TmFtZU9mU2hhcGUoU2hhcGUgc2gsIFN0cmluZyBuYW1lKSB7Ci0gICAgCUNvbnRhaW5lclNoYXBlIGNzaCA9IChDb250YWluZXJTaGFwZSlzaDsKLSAgICAJTGlzdDxTaGFwZT4gc2hhcGVzID0gY3NoLmdldENoaWxkcmVuKCk7Ci0gICAgCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IHNoYXBlcy5pdGVyYXRvcigpOwotICAgIAl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgCQlTaGFwZSBzaGFwZSA9IGl0Lm5leHQoKTsKLSAgICAJCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLSAgICAJCWlmIChnYSBpbnN0YW5jZW9mIFJlY3RhbmdsZSkgewotICAgIAkJCVJlY3RhbmdsZSByZWN0ID0gKFJlY3RhbmdsZSlnYTsKLSAgICAJCQlpZiAocmVjdC5nZXRZKCkgPT0gMCkgewotICAgIAkJCQlMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBnYXMgPSByZWN0LmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKTsKLSAgICAJCQkJaWYgKGdhcy5zaXplKCkgPiAwKSB7IAotICAgIAkJCQkJR3JhcGhpY3NBbGdvcml0aG0gZ3JhID0gZ2FzLmdldCgwKTsKLSAgICAJCQkJCWlmIChncmEgaW5zdGFuY2VvZiBUZXh0KSB7Ci0gICAgCQkJCQkJKChUZXh0KWdyYSkuc2V0VmFsdWUobmFtZSk7Ci0gICAgCQkJCQkJcmV0dXJuOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgIAkJfQotICAgIAl9OwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SlBUTmFtZUluU2hhcGUoQ29udGFpbmVyU2hhcGUgY3MsIFN0cmluZyBuZXdOYW1lKSB7Ci0gICAgCXNldEpQVE5hbWVJblNoYXBlKGNzLCBuZXdOYW1lLCBnZXRQZVV0aWwoKSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRKUFROYW1lSW5TaGFwZShDb250YWluZXJTaGFwZSBjcywgU3RyaW5nIG5ld05hbWUsIElQZVNlcnZpY2VVdGlsIHBlVXRpbCkgewotICAgIAlMaXN0PFNoYXBlPiBzaGFwZXMgPSBjcy5nZXRDaGlsZHJlbigpOwotICAgIAlJdGVyYXRvcjxTaGFwZT4gaXQgPSBzaGFwZXMuaXRlcmF0b3IoKTsKLSAgICAJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgIAkJU2hhcGUgc2ggPSBpdC5uZXh0KCk7Ci0gICAgCQlTdHJpbmcgcHJvcFNoYXBlVHlwZSA9IHBlVXRpbC5nZXRQcm9wZXJ0eVZhbHVlKHNoLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFKTsKLSAgICAJCWlmICghU2hhcGVUeXBlLkhFQURFUi50b1N0cmluZygpLmVxdWFscyhwcm9wU2hhcGVUeXBlKSkKLSAgICAJCQljb250aW51ZTsKLSAgICAJCVRleHQgdHh0ID0gKFRleHQpc2guZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRHcmFwaGljc0FsZ29yaXRobUNoaWxkcmVuKCkuZ2V0KDApOwotICAgIAkJdHh0LnNldFZhbHVlKG5ld05hbWUpOwotICAgIAkJcmV0dXJuOwotICAgIAl9Ci0gICAgfQotICAgIAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAJaWYgKChuYW1lID09IG51bGwpIHx8IChuYW1lLmxlbmd0aCgpID09IDApKSAKLQkJCXJldHVybiAiIjsJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotICAgIAlpZiAobmFtZS5sZW5ndGgoKSA9PSAxKQotICAgIAkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotICAgIAlTdHJpbmcgc2Vjb25kU3ltYm9sID0gbmFtZS5zdWJzdHJpbmcoMSwgMik7IAotICAgIAlpZiAoc2Vjb25kU3ltYm9sLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKS5lcXVhbHMoc2Vjb25kU3ltYm9sLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkpCi0gICAgCQlyZXR1cm4gZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0gICAgCXJldHVybiAoaXNVcHBlckNhc2Uoc2Vjb25kU3ltYm9sKSkgPyAKLSAgICAJCQljYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSkgOiAKLSAgICAJCQkJZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VwcGVyQ2FzZShTdHJpbmcgcykgewotICAgIAlpZiAoKHMgPT0gbnVsbCkgfHwgKHMubGVuZ3RoKCkgPT0gMCkgfHwgKHMubGVuZ3RoKCkgPiAxKSkgCi0gICAgCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGdpdmVuIHN0cmluZyBoYXMgdG8gY29udGFpbiBvbmUgc3ltYm9sIGV4YWN0bHkiKTsJLy8kTk9OLU5MUy0xJAotICAgIAlyZXR1cm4gcy50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkuZXF1YWxzKHMpOwotICAgIH0KLSAgICAKLSAgICAKLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUmVnaXN0ZXJFbnRpdHlJblhNTEpvYihmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIGZpbmFsIFN0cmluZyBjbGFzc0ZRTikgewotCQlmaW5hbCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IGpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCQlyZXNvdXJjZS5tb2RpZnkobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCVhtbFBlcnNpc3RlbmNlIHhtbFBlcnNpc3RlbmNlID0gKFhtbFBlcnNpc3RlbmNlKSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCQkJRUxpc3Q8WG1sUGVyc2lzdGVuY2VVbml0PiBwZXJzaXN0ZW5jZVVuaXRzID0geG1sUGVyc2lzdGVuY2UuZ2V0UGVyc2lzdGVuY2VVbml0cygpOwotCQkJCVhtbFBlcnNpc3RlbmNlVW5pdCBwZXJzaXN0ZW5jZVVuaXQgPSBwZXJzaXN0ZW5jZVVuaXRzLmdldCgwKTsgLy8gTXVsdGlwbHkgcGVyc2lzdGVuY2UgdW5pdCBzdXBwb3J0Ci0JCQkJYm9vbGVhbiByZWdpc3RlcmVkID0gZmFsc2U7Ci0JCQkJSXRlcmF0b3I8WG1sSmF2YUNsYXNzUmVmPiBpdCA9IHBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBjbGFzc05hbWUgPSBpdC5uZXh0KCkuZ2V0SmF2YUNsYXNzKCk7Ci0JCQkJCWlmIChjbGFzc0ZRTi5lcXVhbHMoY2xhc3NOYW1lKSkgewotCQkJCQkJcmVnaXN0ZXJlZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIXJlZ2lzdGVyZWQpIHsKLQkJCQkJWG1sSmF2YUNsYXNzUmVmIGNsYXNzUmVmID0gUGVyc2lzdGVuY2VGYWN0b3J5LmVJTlNUQU5DRS5jcmVhdGVYbWxKYXZhQ2xhc3NSZWYoKTsKLQkJCQkJY2xhc3NSZWYuc2V0SmF2YUNsYXNzKGNsYXNzRlFOKTsKLQkJCSAgICAgCXBlcnNpc3RlbmNlVW5pdC5nZXRDbGFzc2VzKCkuYWRkKGNsYXNzUmVmKTsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotICAgIAotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVVbnJlZ2lzdGVyRW50aXR5RnJvbVhNTEpvYihmaW5hbCBKcGFQcm9qZWN0IGpwYVByb2plY3QsIGZpbmFsIFN0cmluZyBjbGFzc0ZRTikgewotCQlmaW5hbCBKcGFYbWxSZXNvdXJjZSByZXNvdXJjZSA9IGpwYVByb2plY3QuZ2V0UGVyc2lzdGVuY2VYbWxSZXNvdXJjZSgpOwotCi0JCXJlc291cmNlLm1vZGlmeShuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJWG1sUGVyc2lzdGVuY2UgeG1sUGVyc2lzdGVuY2UgPSAoWG1sUGVyc2lzdGVuY2UpIHJlc291cmNlLmdldFJvb3RPYmplY3QoKTsKLQkJCQlFTGlzdDxYbWxQZXJzaXN0ZW5jZVVuaXQ+IHBlcnNpc3RlbmNlVW5pdHMgPSB4bWxQZXJzaXN0ZW5jZS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCk7Ci0JCQkJWG1sUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlVW5pdHMuZ2V0KDApOy8vIE11bHRpcGx5IHBlcnNpc3RlbmNlIHVuaXQgc3VwcG9ydAotCQkJCUVMaXN0PFhtbEphdmFDbGFzc1JlZj4gY1JlZnMgPSBwZXJzaXN0ZW5jZVVuaXQuZ2V0Q2xhc3NlcygpOwotCQkJCWZvciAoWG1sSmF2YUNsYXNzUmVmIGNSZWYgOiBjUmVmcykKLQkJCQkJaWYgKGNSZWYuZ2V0SmF2YUNsYXNzKCkuZXF1YWxzKGNsYXNzRlFOKSkgewotCQkJCQkJY1JlZnMucmVtb3ZlKGNSZWYpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVJbXBvcnRzKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyB0eXBlRlFOKSB7Ci0JCWlmICh0eXBlRlFOID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXR5cGVGUU4gPSB0eXBlRlFOLnRyaW0oKTsKLQkJU3RyaW5nW10gdHlwZUZRTnMgPSBnZXRBbGxUeXBlcyh0eXBlRlFOKTsKLQkJY3JlYXRlSW1wb3J0cyhjdSwgdHlwZUZRTnMpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBbGxUeXBlcyhTdHJpbmcgdHlwZUZRTil7Ci0JCXR5cGVGUU4gPSB0eXBlRlFOLnJlcGxhY2UoJ1snLCAnLCcpOwotCQl0eXBlRlFOID0gdHlwZUZRTi5yZXBsYWNlKCddJywgJywnKTsKLQkJdHlwZUZRTiA9IHR5cGVGUU4ucmVwbGFjZSgnPCcsICcsJyk7Ci0JCXR5cGVGUU4gPSB0eXBlRlFOLnJlcGxhY2UoJz4nLCAnLCcpOwotCQlTdHJpbmdbXSByZXMgPSB0eXBlRlFOLnRyaW0oKS5zcGxpdCgiLCIpOwkvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKQotCQkJcmVzW2ldID0gcmVzW2ldLnRyaW0oKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgU3RyaW5nW10gdHlwZUZRTnMpIHsKLQkJTnVsbFByb2dyZXNzTW9uaXRvciBucG0gPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlmb3IgKFN0cmluZyB0eXBlRlFOIDogdHlwZUZRTnMpIHsKLQkJCWlmICh0eXBlRlFOLnN0YXJ0c1dpdGgoImphdmEubGFuZy4iKSB8fCAhdHlwZUZRTi5jb250YWlucygiLiIpKQkJLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCWN1LmNyZWF0ZUltcG9ydCh0eXBlRlFOLCBudWxsLCBucG0pOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHt9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlSW1wb3J0KElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyB0eXBlRlFOKSB7Ci0JCWlmICh0eXBlRlFOLnN0YXJ0c1dpdGgoImphdmEubGFuZy4iKSB8fCAhdHlwZUZRTi5jb250YWlucygiLiIpKSAJCS8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIHJldHVyblNpbXBsZU5hbWUodHlwZUZRTik7CQkJCi0JCQotCQlOdWxsUHJvZ3Jlc3NNb25pdG9yIG5wbSA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCVN0cmluZyBzaW1wbGVOYW1lID0gcmV0dXJuU2ltcGxlTmFtZSh0eXBlRlFOKTsKLQkJSUltcG9ydERlY2xhcmF0aW9uW10gaWRzID0gbmV3IElJbXBvcnREZWNsYXJhdGlvblswXTsKLQkJdHJ5IHsKLQkJCWlkcyA9IGN1LmdldEltcG9ydHMoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHt9CQkKLQkJZm9yIChJSW1wb3J0RGVjbGFyYXRpb24gaWQgOiBpZHMpIHsKLQkJCVN0cmluZyBpbXBOYW1lID0gaWQuZ2V0RWxlbWVudE5hbWUoKTsgCi0JCQlpZiAoaW1wTmFtZS5lbmRzV2l0aCgiKiIpKQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCWlmIChpbXBOYW1lLmVuZHNXaXRoKCIuIiArIHNpbXBsZU5hbWUpKQkJCS8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHlwZUZRTjsKLQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuV1JBUFBFUl9TSU1QTEVfTkFNRVMuY29udGFpbnMoc2ltcGxlTmFtZSkpCi0JCQkJcmV0dXJuIHR5cGVGUU47Ci0JCX0KLQkJdHJ5IHsKLQkJCWN1LmNyZWF0ZUltcG9ydCh0eXBlRlFOLCBudWxsLCBucG0pOwotCQkJcmV0dXJuIHJldHVyblNpbXBsZU5hbWUodHlwZUZRTik7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7fQotCQlyZXR1cm4gdHlwZUZRTjsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlIGNyZWF0ZUF0dHJpYnV0ZUljb24oUmVjdGFuZ2xlIGljb25SZWN0LCBTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucykgewotCQlJbWFnZSBpY29uID0gbnVsbDsKLQkJaWYgKChhbm5vdGF0aW9ucyA9PSBudWxsKSB8fCAoYW5ub3RhdGlvbnMuc2l6ZSgpID09IDApIHx8IGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0JBU0lDKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fQkFTSUMpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX0lEKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLlBSSU1BUllfS0VZKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9ucy5jb250YWlucyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fT05FX1RPX09ORSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9PTkVfVE9fTUFOWSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpKSB7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9NQU5ZX1RPX09ORSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKSkgewotCQkJaWNvbiA9IEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZUltYWdlKGljb25SZWN0LCBKUEFFZGl0b3JJbWFnZVByb3ZpZGVyLklDT05fTUFOWV9UT19NQU5ZKTsJCQotCQl9IGVsc2UgaWYoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERURfSUQpKXsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX0VNQkVEREVEX0lEKTsKLQkJfSBlbHNlIGlmKGFubm90YXRpb25zLmNvbnRhaW5zKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX1ZFUlNJT04pKXsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX1ZFUlNJT04pOwotCQl9IGVsc2UgaWYoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fVFJBTlNJRU5UKSl7Ci0JCQlpY29uID0gR3JhcGhpdGkuZ2V0R2FTZXJ2aWNlKCkuY3JlYXRlSW1hZ2UoaWNvblJlY3QsIEpQQUVkaXRvckltYWdlUHJvdmlkZXIuSUNPTl9UUkFOU0lFTlQpOwotCQl9IGVsc2UgaWYoYW5ub3RhdGlvbnMuY29udGFpbnMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fRU1CRURERUQpKXsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX0VNQkVEREVEKTsKLQkJfSBlbHNlIHsKLQkJCWljb24gPSBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVJbWFnZShpY29uUmVjdCwgSlBBRWRpdG9ySW1hZ2VQcm92aWRlci5JQ09OX0JBU0lDKTsJCQkKLQkJfQkKLQkJcmV0dXJuIGljb247Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU2hhcGUgZ2V0SWNvblNoYXBlKFNoYXBlIGF0dHJpYnV0ZVNoYXBlKSB7Ci0JCWludCB5ID0gYXR0cmlidXRlU2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKS5nZXRZKCk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gYXR0cmlidXRlU2hhcGUuZ2V0Q29udGFpbmVyKCk7Ci0JCUl0ZXJhdG9yPFNoYXBlPiBpdCA9IGNzLmdldENoaWxkcmVuKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU2hhcGUgc2hwID0gaXQubmV4dCgpOwotCQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBzaHAuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsgCi0JCQlpZiAoKGdhICE9IG51bGwpICYmIChnYS5nZXRZKCkgPT0geSkgJiYgCi0JCQkJKFNoYXBlVHlwZS5JQ09OLnRvU3RyaW5nKCkuCi0JCQkJCQllcXVhbHMoR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHlWYWx1ZShzaHAsIAotCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9TSEFQRV9UWVBFKSkpKSAKLQkJCQlyZXR1cm4gc2hwOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248Q29udGFpbmVyU2hhcGU+IGdldFJlbGF0ZWRTaGFwZXMoQ29udGFpbmVyU2hhcGUgY3MpIHsKLQkJQ29sbGVjdGlvbjxDb250YWluZXJTaGFwZT4gcmVzID0gbmV3IEhhc2hTZXQ8Q29udGFpbmVyU2hhcGU+KCk7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gY29ucyA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb24+KCk7ICAKLQkJSXRlcmF0b3I8QW5jaG9yPiBhbnNJdCA9IGNzLmdldEFuY2hvcnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoYW5zSXQuaGFzTmV4dCgpKSB7Ci0JCQlBbmNob3IgYW4gPSBhbnNJdC5uZXh0KCk7Ci0JCQljb25zLmFkZEFsbChhbi5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpOwotCQkJY29ucy5hZGRBbGwoYW4uZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJfQotCQlJdGVyYXRvcjxDb25uZWN0aW9uPiBjb25zSXQgPSBjb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChjb25zSXQuaGFzTmV4dCgpKSB7Ci0JCQlDb25uZWN0aW9uIGNvbiA9IGNvbnNJdC5uZXh0KCk7Ci0JCQlDb250YWluZXJTaGFwZSBjczEgPSAoQ29udGFpbmVyU2hhcGUpY29uLmdldFN0YXJ0KCkuZ2V0UGFyZW50KCk7IAotCQkJaWYgKGNzMSAhPSBjcykKLQkJCQlyZXMuYWRkKGNzMSk7Ci0JCQljczEgPSAoQ29udGFpbmVyU2hhcGUpY29uLmdldEVuZCgpLmdldFBhcmVudCgpOwotCQkJaWYgKGNzMSAhPSBjcykKLQkJCQlyZXMuYWRkKGNzMSk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci0JCQotCXB1YmxpYyBzdGF0aWMgaW50IGNhbGNDb25uZWN0aW9uTGVuZ3RoKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQ+IHB0cyA9IGMuZ2V0QmVuZHBvaW50cygpOwotCQlpbnQgbGVuID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwdHMuc2l6ZSgpIC0gMTsgaSsrKSB7Ci0JCQlsZW4gPSBsZW4gKyAoKHB0cy5nZXQoaSkuZ2V0WCgpID09IHB0cy5nZXQoaSArIDEpLmdldFgoKSkgPwotCQkJCQlNYXRoLmFicyhwdHMuZ2V0KGkpLmdldFkoKSAtIHB0cy5nZXQoaSArIDEpLmdldFkoKSkgOgotCQkJCQlNYXRoLmFicyhwdHMuZ2V0KGkpLmdldFgoKSAtIHB0cy5nZXQoaSArIDEpLmdldFgoKSkpOwkKLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0KEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgYm9vbGVhbiBzZWxmUmVsYXRpb24pIHsKLQkJaW50IGNudCA9IGdldE51bWJlck9mQ29ubmVjdGlvbnNXaXRoU2FtZUVuZHNBcyhjKTsKLQkJcmV0dXJuIGNyZWF0ZUJlbmRQb2ludExpc3QoYywgY250IC0gMSwgY250LCBzZWxmUmVsYXRpb24pOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBMaXN0PFBvaW50PiBjcmVhdGVCZW5kUG9pbnRMaXN0KEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtLCAgYm9vbGVhbiBzZWxmUmVsYXRpb24pIHsKLQkJcmV0dXJuIHNlbGZSZWxhdGlvbiA/IAotCQkJCWNyZWF0ZUJlbmRQb2ludExpc3RGb3JTZWxmUmVsYXRpb24oYywgY250LCBjb25uZWN0aW9uc051bSkgOgotCQkJCWNyZWF0ZUJlbmRQb2ludExpc3RGb3JOb25TZWxmUmVsYXRpb24oYywgY250LCBjb25uZWN0aW9uc051bSk7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3RGb3JTZWxmUmVsYXRpb24oRnJlZUZvcm1Db25uZWN0aW9uIGMsICBpbnQgY250LCBpbnQgY29ubmVjdGlvbnNOdW0pIHsKLQkJZmluYWwgaW50IEFCU19TSElGVCA9IDE1OyAKLQkJCi0JCWludCBlbXB0aWVzdFF1YWRyYW50ID0gZ2V0RW1wdGllc3RRdWFkcmFudChjKTsKLQkJYm9vbGVhbiBldmVuUXVhZHJhbnQgPSAoZW1wdGllc3RRdWFkcmFudCA9PSAyKSB8fCAoZW1wdGllc3RRdWFkcmFudCA9PSA0KTsKLQkJCi0JCVJvdW5kZWRSZWN0YW5nbGUgcmVjdCA9IChSb3VuZGVkUmVjdGFuZ2xlKWMuZ2V0U3RhcnQoKS5nZXRQYXJlbnQoKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQkKLQkJZmxvYXQgaGFsZldpZHRoID0gcmVjdC5nZXRXaWR0aCgpIC8gMi4wZjsKLQkJZmxvYXQgaGFsZkhlaWdodCA9IHJlY3QuZ2V0SGVpZ2h0KCkgLyAyLjBmOwotCQkKLQkJaW50IGNlbnRlclggPSBNYXRoLnJvdW5kKGhhbGZXaWR0aCArIHJlY3QuZ2V0WCgpKTsKLQkJaW50IGNlbnRlclkgPSBNYXRoLnJvdW5kKGhhbGZIZWlnaHQgKyByZWN0LmdldFkoKSk7Ci0JCQotCQlib29sZWFuIHN0YXJ0SG9yaXpvbnRhbCA9IGZhbHNlOwotCQlib29sZWFuIGVuZEhvcml6b250YWwgPSAhc3RhcnRIb3Jpem9udGFsOwkKLQotCQkKLQkJaW50IHN0YXJ0RGlyZWN0aW9uID0gKChlbXB0aWVzdFF1YWRyYW50ID09IDIpIHx8IChlbXB0aWVzdFF1YWRyYW50ID09IDMpKSA/IDEgOiAtMTsgIC8vIDEgb3IgLTE7IDEgZm9yIFJJR0hUL0RPV047IC0xIGZvciBMRUZUL1VQCi0JCWludCBlbmREaXJlY3Rpb24gPSAoKGVtcHRpZXN0UXVhZHJhbnQgPT0gMSkgfHwgKGVtcHRpZXN0UXVhZHJhbnQgPT0gMikpID8gMSA6IC0xOwotCQkKLQkJaW50IHg7Ci0JCWludCB5OyAKLQkJCi0JCQotCQlpZiAoZW5kSG9yaXpvbnRhbCkgewotCQkJeCA9IGNlbnRlclggKyBNYXRoLnJvdW5kKGhhbGZXaWR0aCAqIGVuZERpcmVjdGlvbik7IAotCQkJeSA9IGNlbnRlclk7Ci0JCX0gZWxzZSB7Ci0JCQl4ID0gY2VudGVyWDsgCi0JCQl5ID0gY2VudGVyWSArIE1hdGgucm91bmQoaGFsZkhlaWdodCAqIGVuZERpcmVjdGlvbik7CQkJCi0JCX0KLQkJaW50IFNISUZUID0gZXZlblF1YWRyYW50ID8gLUFCU19TSElGVCAqIGVuZERpcmVjdGlvbiA6IEFCU19TSElGVCAqIGVuZERpcmVjdGlvbjsJCi0JCVBvaW50IGVuZFBvaW50ID0gbmV3IFBvaW50KHggKyAoZW5kSG9yaXpvbnRhbCA/IDAgOiAoY250ICogU0hJRlQpKSwgeSArIChlbmRIb3Jpem9udGFsID8gKGNudCAqIFNISUZUKSA6IDApKTsKLQkJCi0JCQotCQlpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQl4ID0gY2VudGVyWCArIE1hdGgucm91bmQoaGFsZldpZHRoICogc3RhcnREaXJlY3Rpb24pOyAKLQkJCXkgPSBjZW50ZXJZOwotCQl9IGVsc2UgewotCQkJeCA9IGNlbnRlclg7IAotCQkJeSA9IGNlbnRlclkgKyBNYXRoLnJvdW5kKGhhbGZIZWlnaHQgKiBzdGFydERpcmVjdGlvbik7CQkJCi0JCX0KLQkJU0hJRlQgPSBldmVuUXVhZHJhbnQgPyAtQUJTX1NISUZUICogc3RhcnREaXJlY3Rpb24gOiBBQlNfU0hJRlQgKiBzdGFydERpcmVjdGlvbjsJCQotCQlQb2ludCBzdGFydFBvaW50ID0gbmV3IFBvaW50KHggKyAoc3RhcnRIb3Jpem9udGFsID8gMCA6IChjbnQgKiBTSElGVCkpLCB5ICsgKHN0YXJ0SG9yaXpvbnRhbCA/IChjbnQgKiBTSElGVCkgOiAwKSk7Ci0JCQotCQkvLyBzZWNvbmQgcG9pbnQKLQkJTGlzdDxQb2ludD4gcmVzID0gbmV3IExpbmtlZExpc3Q8UG9pbnQ+KCk7Ci0JCXJlcy5hZGQoc3RhcnRQb2ludCk7Ci0JCWlmIChzdGFydEhvcml6b250YWwpIHsKLQkJCXggPSBzdGFydFBvaW50LnggKyBzdGFydERpcmVjdGlvbiAqIDUwICsgKChldmVuUXVhZHJhbnQgPyAtIGNudCA6IGNudCkgKiBTSElGVCk7Ci0JCQl5ID0gc3RhcnRQb2ludC55OwotCQl9IGVsc2UgewotCQkJeCA9IHN0YXJ0UG9pbnQueDsKLQkJCXkgPSBzdGFydFBvaW50LnkgKyBzdGFydERpcmVjdGlvbiAqIDUwICsgKChldmVuUXVhZHJhbnQgPyAtIGNudCA6IGNudCkgKiBTSElGVCk7Ci0JCX0KLQkJcmVzLmFkZChuZXcgUG9pbnQoeCwgeSkpOwotCQkKLQkJLy8gbWlkZGxlIHBvaW50Ci0JCVNISUZUID0gQUJTX1NISUZUICogZW5kRGlyZWN0aW9uOwotCQlpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQl5ID0geSArIE1hdGgucm91bmQoaGFsZkhlaWdodCArIDUwKSAqIGVuZERpcmVjdGlvbiArICgyICpjbnQgKiBTSElGVCk7Ci0JCX0gZWxzZSB7Ci0JCQl4ID0geCArIE1hdGgucm91bmQoaGFsZldpZHRoICsgNTApICogZW5kRGlyZWN0aW9uICsgKDIgKiBjbnQgKiBTSElGVCk7Ci0JCX0KLQkJcmVzLmFkZChuZXcgUG9pbnQoeCwgeSkpOwotCQkKLQkJLy8gZm91cnRoIHBvaW50Ci0JCWlmIChzdGFydEhvcml6b250YWwpIHsKLQkJCXggPSBlbmRQb2ludC54OwotCQl9IGVsc2UgewotCQkJeSA9IGVuZFBvaW50Lnk7Ci0JCX0KLQkJcmVzLmFkZChuZXcgUG9pbnQoeCwgeSkpOwotCQkKLQkJCi0JCXJlcy5hZGQoZW5kUG9pbnQpOwotCQkKLQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0JCQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RW1wdGllc3RRdWFkcmFudChGcmVlRm9ybUNvbm5lY3Rpb24gc2VsZlJlbCkgewotCQlBbmNob3IgYW5jaG9yID0gc2VsZlJlbC5nZXRTdGFydCgpOwotCQlSb3VuZGVkUmVjdGFuZ2xlIHByaW1SZWN0ID0gKFJvdW5kZWRSZWN0YW5nbGUpYW5jaG9yLmdldFBhcmVudCgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gY29ucyA9IG5ldyBIYXNoU2V0PENvbm5lY3Rpb24+KCk7Ci0JCWNvbnMuYWRkQWxsKGFuY2hvci5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCkpOwotCQljb25zLmFkZEFsbChhbmNob3IuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKTsKLQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXQgPSBjb25zLml0ZXJhdG9yKCk7Ci0JCUNvbGxlY3Rpb248QW5jaG9yPiBhbmNob3JzID0gbmV3IEhhc2hTZXQ8QW5jaG9yPigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlDb25uZWN0aW9uIGMgPSBpdC5uZXh0KCk7Ci0JCQlBbmNob3IgYSA9IGMuZ2V0U3RhcnQoKTsKLQkJCWlmIChhICE9IGFuY2hvcikKLQkJCQlhbmNob3JzLmFkZChhKTsKLQkJCWEgPSBjLmdldEVuZCgpOwotCQkJaWYgKGEgIT0gYW5jaG9yKQotCQkJCWFuY2hvcnMuYWRkKGEpOwkJCQotCQl9Ci0JCUl0ZXJhdG9yPEFuY2hvcj4gaXRBbmNob3JzID0gYW5jaG9ycy5pdGVyYXRvcigpOwotCQlmbG9hdFtdIHF1YWRyYW50SGFiaXRhdCA9IG5ldyBmbG9hdFs1XTsKLQkJd2hpbGUgKGl0QW5jaG9ycy5oYXNOZXh0KCkpIHsKLQkJCUFuY2hvciBhID0gaXRBbmNob3JzLm5leHQoKTsKLQkJCVJvdW5kZWRSZWN0YW5nbGUgcmVjdCA9IChSb3VuZGVkUmVjdGFuZ2xlKWEuZ2V0UGFyZW50KCkuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKTsKLQkJCWludCBxID0gZ2V0UXVhZHJhbnQocHJpbVJlY3QsIHJlY3QpOwotCQkJcXVhZHJhbnRIYWJpdGF0W3FdICs9IDEuNWY7Ci0JCQlpZiAocSA9PSAxKSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0WzRdID0gcXVhZHJhbnRIYWJpdGF0WzRdICsgMC41ZjsKLQkJCX0gZWxzZSBpZiAocSA9PSA0KSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0WzFdICs9ICAwLjVmOwotCQkJfQotCQkJaWYgKHEgPCA0KSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0W3EgKyAxXSArPSAwLjVmOwotCQkJfQotCQkJaWYgKHEgPiAxKSB7Ci0JCQkJcXVhZHJhbnRIYWJpdGF0W3EgLSAxXSArPSAwLjVmOwotCQkJfQkJCQotCQl9Ci0JCWZsb2F0IG1pbkhhYml0YXQgPSBGbG9hdC5NQVhfVkFMVUU7Ci0JCWludCBlbXB0aWVzdFF1YWRyYW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKLQkJCWlmIChxdWFkcmFudEhhYml0YXRbaV0gPCBtaW5IYWJpdGF0KSB7Ci0JCQkJZW1wdGllc3RRdWFkcmFudCA9IGk7Ci0JCQkJbWluSGFiaXRhdCA9IHF1YWRyYW50SGFiaXRhdFtpXTsgCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVtcHRpZXN0UXVhZHJhbnQ7Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGludCBnZXRRdWFkcmFudChSb3VuZGVkUmVjdGFuZ2xlIHByaW1SZWN0LCBSb3VuZGVkUmVjdGFuZ2xlIHJlY3QpIHsKLQkJaW50IHByaW1DZW50ZXJYID0gcHJpbVJlY3QuZ2V0WCgpICsgTWF0aC5yb3VuZChwcmltUmVjdC5nZXRXaWR0aCgpIC8gMi4wZik7Ci0JCWludCBwcmltQ2VudGVyWSA9IHByaW1SZWN0LmdldFkoKSArIE1hdGgucm91bmQocHJpbVJlY3QuZ2V0SGVpZ2h0KCkgLyAyLjBmKTsKLQkJaW50IGNlbnRlclggPSByZWN0LmdldFgoKSArIE1hdGgucm91bmQocmVjdC5nZXRXaWR0aCgpIC8gMi4wZik7Ci0JCWludCBjZW50ZXJZID0gcmVjdC5nZXRZKCkgKyBNYXRoLnJvdW5kKHJlY3QuZ2V0SGVpZ2h0KCkgLyAyLjBmKTsKLQkJaWYgKHByaW1DZW50ZXJYIDwgY2VudGVyWCkgCi0JCQlpZiAocHJpbUNlbnRlclkgPiBjZW50ZXJZKQotCQkJCXJldHVybiAxOwotCQkJZWxzZSAKLQkJCQlyZXR1cm4gMjsKLQkJZWxzZSAKLQkJCWlmIChwcmltQ2VudGVyWSA+IGNlbnRlclkpCi0JCQkJcmV0dXJuIDQ7Ci0JCQllbHNlIAotCQkJCXJldHVybiAzOwotCX0KLQkJCi0JcHJpdmF0ZSBzdGF0aWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdEZvck5vblNlbGZSZWxhdGlvbihGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGludCBjbnQsIGludCBjb25uZWN0aW9uc051bSkgewotCQlmaW5hbCBpbnQgQUJTX1NISUZUID0gMTU7IAotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3RTdGFydCA9IChSb3VuZGVkUmVjdGFuZ2xlKWMuZ2V0U3RhcnQoKS5nZXRQYXJlbnQoKS5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3RFbmQgPSAoUm91bmRlZFJlY3RhbmdsZSljLmdldEVuZCgpLmdldFBhcmVudCgpLmdldEdyYXBoaWNzQWxnb3JpdGhtKCk7Ci0JCQotCQlmbG9hdCBzdGFydEhhbGZXaWR0aCA9IHJlY3RTdGFydC5nZXRXaWR0aCgpIC8gMi4wZjsKLQkJZmxvYXQgc3RhcnRIYWxmSGVpZ2h0ID0gcmVjdFN0YXJ0LmdldEhlaWdodCgpIC8gMi4wZjsKLQkJZmxvYXQgZW5kSGFsZldpZHRoID0gcmVjdEVuZC5nZXRXaWR0aCgpIC8gMi4wZjsKLQkJZmxvYXQgZW5kSGFsZkhlaWdodCA9IHJlY3RFbmQuZ2V0SGVpZ2h0KCkgLyAyLjBmOwotCi0JCQotCQlpbnQgc3RhcnRDZW50ZXJYID0gTWF0aC5yb3VuZChzdGFydEhhbGZXaWR0aCArIHJlY3RTdGFydC5nZXRYKCkpOwotCQlpbnQgc3RhcnRDZW50ZXJZID0gTWF0aC5yb3VuZChzdGFydEhhbGZIZWlnaHQgKyByZWN0U3RhcnQuZ2V0WSgpKTsKLQkJaW50IGVuZENlbnRlclggPSBNYXRoLnJvdW5kKGVuZEhhbGZXaWR0aCArIHJlY3RFbmQuZ2V0WCgpKTsKLQkJaW50IGVuZENlbnRlclkgPSBNYXRoLnJvdW5kKGVuZEhhbGZIZWlnaHQgKyByZWN0RW5kLmdldFkoKSk7Ci0JCWludCB4RGVsdGEgPSBlbmRDZW50ZXJYIC0gc3RhcnRDZW50ZXJYOwotCQlpbnQgeURlbHRhID0gZW5kQ2VudGVyWSAtIHN0YXJ0Q2VudGVyWTsKLQkJCi0JCWJvb2xlYW4gc3RhcnRIb3Jpem9udGFsID0gdHJ1ZTsKLQkJaW50IHg7Ci0JCWludCB5OyAKLQkJCi0JCWlmICh4RGVsdGEgIT0gMCkgewotCQkJeCA9IHN0YXJ0Q2VudGVyWCArIE1hdGgucm91bmQoc3RhcnRIYWxmV2lkdGggKiBNYXRoLnNpZ251bSh4RGVsdGEpKTsgCi0JCQl5ID0gc3RhcnRDZW50ZXJZICsgTWF0aC5yb3VuZChNYXRoLmFicyhzdGFydEhhbGZXaWR0aCAvIHhEZWx0YSkgKiB5RGVsdGEpOwotCQl9IGVsc2UgewotCQkJeCA9IHN0YXJ0Q2VudGVyWCArIE1hdGgucm91bmQoTWF0aC5hYnMoc3RhcnRIYWxmSGVpZ2h0IC8geURlbHRhKSAqIHhEZWx0YSk7IAotCQkJeSA9IHN0YXJ0Q2VudGVyWSArIE1hdGgucm91bmQoc3RhcnRIYWxmSGVpZ2h0ICogTWF0aC5zaWdudW0oeURlbHRhKSk7CQkJCi0JCX0KLQkJCi0JCWlmIChNYXRoLmFicyh5IC0gc3RhcnRDZW50ZXJZKSArIDAuMSA+IHN0YXJ0SGFsZkhlaWdodCkgewotCQkJc3RhcnRIb3Jpem9udGFsID0gZmFsc2U7OwotCQkJeCA9IHN0YXJ0Q2VudGVyWCArIE1hdGgucm91bmQoTWF0aC5hYnMoc3RhcnRIYWxmSGVpZ2h0IC8geURlbHRhKSAqIHhEZWx0YSk7CQkJCi0JCQl5ID0gc3RhcnRDZW50ZXJZICsgTWF0aC5yb3VuZChzdGFydEhhbGZIZWlnaHQgKiBNYXRoLnNpZ251bSh5RGVsdGEpKTsKLQkJfQotCQlpbnQgU0hJRlQ7Ci0JCSBpZiAoc3RhcnRIb3Jpem9udGFsKSB7Ci0JCQkgU0hJRlQgPSAoeSA8IHN0YXJ0Q2VudGVyWSkgPyBBQlNfU0hJRlQgOiAtQUJTX1NISUZUOwotCQkgfSBlbHNlIHsKLQkJCSBTSElGVCA9ICh4IDwgc3RhcnRDZW50ZXJYKSA/IEFCU19TSElGVCA6IC1BQlNfU0hJRlQ7Ci0JCSB9Ci0KLQkJCi0JCVBvaW50IHN0YXJ0UG9pbnQgPSBuZXcgUG9pbnQoeCArIChzdGFydEhvcml6b250YWwgPyAwIDogKGNudCAqIFNISUZUKSksIHkgKyAoc3RhcnRIb3Jpem9udGFsID8gKGNudCAqIFNISUZUKSA6IDApKTsKLQkJTGlzdDxQb2ludD4gcmVzID0gbmV3IExpbmtlZExpc3Q8UG9pbnQ+KCk7Ci0JCQotCQl4RGVsdGEgPSBzdGFydENlbnRlclggLSBlbmRDZW50ZXJYOwotCQl5RGVsdGEgPSBzdGFydENlbnRlclkgLSBlbmRDZW50ZXJZOwotCQkKLQkJYm9vbGVhbiBzdHJhaWdodCA9ICh4RGVsdGEgPT0gMCkgfHwgKHlEZWx0YSA9PSAwKTsgCi0JCQotCQlyZXMuYWRkKHN0YXJ0UG9pbnQpOwotCQkKLQkJYm9vbGVhbiBlbmRIb3Jpem9udGFsID0gdHJ1ZTsJCi0JCQotCQlpZiAoeERlbHRhICE9IDApIHsKLQkJCXggPSBlbmRDZW50ZXJYICsgTWF0aC5yb3VuZChlbmRIYWxmV2lkdGggKiBNYXRoLnNpZ251bSh4RGVsdGEpKTsgCi0JCQl5ID0gZW5kQ2VudGVyWSArIE1hdGgucm91bmQoTWF0aC5hYnMoZW5kSGFsZldpZHRoIC8geERlbHRhKSAqIHlEZWx0YSk7Ci0JCX0gZWxzZSB7Ci0JCQl4ID0gZW5kQ2VudGVyWCArIE1hdGgucm91bmQoTWF0aC5hYnMoZW5kSGFsZkhlaWdodCAvIHlEZWx0YSkgKiB4RGVsdGEpOwotCQkJeSA9IGVuZENlbnRlclkgKyBNYXRoLnJvdW5kKGVuZEhhbGZIZWlnaHQgKiBNYXRoLnNpZ251bSh5RGVsdGEpKTsgCi0JCX0KLQkJaWYgKE1hdGguYWJzKHkgLSBlbmRDZW50ZXJZKSArIDAuMSA+IGVuZEhhbGZIZWlnaHQpIHsKLQkJCWVuZEhvcml6b250YWwgPSBmYWxzZTsKLQkJCXggPSBlbmRDZW50ZXJYICsgTWF0aC5yb3VuZChNYXRoLmFicyhlbmRIYWxmSGVpZ2h0IC8geURlbHRhKSAqIHhEZWx0YSk7CQkJCi0JCQl5ID0gZW5kQ2VudGVyWSArIE1hdGgucm91bmQoZW5kSGFsZkhlaWdodCAqIE1hdGguc2lnbnVtKHlEZWx0YSkpOwotCQl9Ci0JCQotCQkgaWYgKGVuZEhvcml6b250YWwpIHsKLQkJCSBTSElGVCA9ICh5IDwgZW5kQ2VudGVyWSkgPyBBQlNfU0hJRlQgOiAtQUJTX1NISUZUOwotCQkgfSBlbHNlIHsKLQkJCSBTSElGVCA9ICh4IDwgZW5kQ2VudGVyWCkgPyBBQlNfU0hJRlQgOiAtQUJTX1NISUZUOwotCQkgfQotCQlQb2ludCBlbmRQb2ludCA9IG5ldyBQb2ludCh4ICsgKGVuZEhvcml6b250YWwgPyAwIDogKGNudCAqIFNISUZUKSksIHkgKyAoZW5kSG9yaXpvbnRhbCA/IChjbnQgKiBTSElGVCkgOiAwKSk7Ci0KLQkJaWYgKCFzdHJhaWdodCkgewotCQkJaWYgKHN0YXJ0SG9yaXpvbnRhbCAmJiBlbmRIb3Jpem9udGFsKSB7Ci0JCQkJaWYgKHN0YXJ0UG9pbnQueSAhPSBlbmRQb2ludC55KSB7Ci0JCQkJCXggPSBzdGFydFBvaW50LnggKyBNYXRoLnJvdW5kKChlbmRQb2ludC54IC0gc3RhcnRQb2ludC54KSAvIDIuMGYpICsgY250ICogQUJTX1NISUZUOyAKLQkJCQkJUG9pbnQgcCA9IG5ldyBQb2ludCh4LCBzdGFydFBvaW50LnkpOwotCQkJCQlyZXMuYWRkKHApOwotCQkJCQlwID0gbmV3IFBvaW50KHgsIGVuZFBvaW50LnkpOwotCQkJCQlyZXMuYWRkKHApOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoIXN0YXJ0SG9yaXpvbnRhbCAmJiAhZW5kSG9yaXpvbnRhbCkgewotCQkJCWlmIChzdGFydFBvaW50LnggIT0gZW5kUG9pbnQueCkgewotCQkJCQl5ID0gc3RhcnRQb2ludC55ICsgTWF0aC5yb3VuZCgoZW5kUG9pbnQueSAtIHN0YXJ0UG9pbnQueSkgLyAyLjBmKSArIGNudCAqIEFCU19TSElGVCAvKiogKGludClNYXRoLnNpZ251bSh5RGVsdGEpKi87IAotCQkJCQlQb2ludCBwID0gbmV3IFBvaW50KHN0YXJ0UG9pbnQueCwgeSk7Ci0JCQkJCXJlcy5hZGQocCk7Ci0JCQkJCXAgPSBuZXcgUG9pbnQoZW5kUG9pbnQueCwgeSk7Ci0JCQkJCXJlcy5hZGQocCk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzdGFydEhvcml6b250YWwpIHsKLQkJCQlQb2ludCBwID0gbmV3IFBvaW50KGVuZFBvaW50LngsIHN0YXJ0UG9pbnQueSk7Ci0JCQkJcmVzLmFkZChwKTsKLQkJCX0gZWxzZSBpZiAoZW5kSG9yaXpvbnRhbCkgewotCQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoc3RhcnRQb2ludC54LCBlbmRQb2ludC55KTsKLQkJCQlyZXMuYWRkKHApOwkJCQotCQkJfQotCQl9Ci0KLQkJcmVzLmFkZChlbmRQb2ludCk7CQkJCQotCQlyZXR1cm4gcmVzOwotCX0KLQkJCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHJlYXJyYW5nZUFsbENvbm5lY3Rpb25zKGZpbmFsIENvbnRhaW5lclNoYXBlIGNzLCAKLQkJCQkJCQkJCQkJICAgZmluYWwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgCi0JCQkJCQkJCQkJCSAgIGZpbmFsIGJvb2xlYW4gc2VsZk9ubHkpIHsKLQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oY3MpOwotCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCUxpc3Q8QW5jaG9yPiBhbmNob3JzRnJvbSA9IGdldEFuY2hvcnMoY3MpOwotCQkJCWZvciAoQW5jaG9yIGFuY2hvckZyb20gOiBhbmNob3JzRnJvbSkgewotCQkJCQlDb2xsZWN0aW9uPENvbm5lY3Rpb24+IG91dGdvaW5nQ29ubmVjdGlvbnMgPSBhbmNob3JGcm9tLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKTsKLQkJCQkJQ29sbGVjdGlvbjxDb25uZWN0aW9uPiBpbmNvbWluZ0Nvbm5lY3Rpb25zID0gYW5jaG9yRnJvbS5nZXRJbmNvbWluZ0Nvbm5lY3Rpb25zKCk7Ci0JCQkJCQotCQkJCQlTZXQ8U2V0PENvbm5lY3Rpb24+PiBzZXRzID0gbmV3IEhhc2hTZXQ8U2V0PENvbm5lY3Rpb24+PigpOwotCQkJCQlJdGVyYXRvcjxDb25uZWN0aW9uPiBpdCA9IG91dGdvaW5nQ29ubmVjdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgCi0JCQkJCQlhZGRDb25uZWN0aW9uKHNldHMsIGl0Lm5leHQoKSwgc2VsZk9ubHkpOwotCQkJCQlpdCA9IGluY29taW5nQ29ubmVjdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgCi0JCQkJCQlhZGRDb25uZWN0aW9uKHNldHMsIGl0Lm5leHQoKSwgc2VsZk9ubHkpOwotCQkJCQkKLQkJCQkJSXRlcmF0b3I8U2V0PENvbm5lY3Rpb24+PiBzZXRzSXRlciA9IHNldHMuaXRlcmF0b3IoKTsKLQkJCQkJd2hpbGUgKHNldHNJdGVyLmhhc05leHQoKSkgewotCQkJCQkJU2V0PENvbm5lY3Rpb24+IHNldCA9IHNldHNJdGVyLm5leHQoKTsKLQkJCQkJCWludCBjbnQgPSAwOwotCQkJCQkJaW50IHNldFNpemUgPSBzZXQuc2l6ZSgpOwotCQkJCQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gY0l0ZXIgPSBzZXQuaXRlcmF0b3IoKTsKLQkJCQkJCXdoaWxlIChjSXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlDb25uZWN0aW9uIGMgPSBjSXRlci5uZXh0KCk7Ci0JCQkJCQkJSVJlbGF0aW9uIHJlbCA9IChJUmVsYXRpb24pZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGMpOwotCQkJCQkJCXJlYXJyYW5nZUNvbm5lY3Rpb24oYywgY250LCBzZXRTaXplLCAgcmVsLmdldE93bmVyKCkgPT0gcmVsLmdldEludmVyc2UoKSk7Ci0JCQkJCQkJY250Kys7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9CQkJCi0JCX0pOyAgCi0JfQotCQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBhcmVDb25uZWN0aW9uc1dpdGhJZGVudGljYWxFbmRzKENvbm5lY3Rpb24gYzEsIENvbm5lY3Rpb24gYzIpIHsKLQkJcmV0dXJuICgoYzEuZ2V0U3RhcnQoKSA9PSBjMi5nZXRTdGFydCgpKSAmJiAoYzEuZ2V0RW5kKCkgPT0gYzIuZ2V0RW5kKCkpKSB8fAotCQkJICAgKChjMS5nZXRTdGFydCgpID09IGMyLmdldEVuZCgpKSAmJiAoYzEuZ2V0RW5kKCkgPT0gYzIuZ2V0U3RhcnQoKSkpOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY29ubmVjdGlvbkJlbG9uZ3NUb1NldChDb25uZWN0aW9uIGMsIFNldDxDb25uZWN0aW9uPiBzKSB7Ci0JCWlmIChzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ29ubmVjdGlvbiBleGFtcGxlID0gcy5pdGVyYXRvcigpLm5leHQoKTsKLQkJcmV0dXJuIGFyZUNvbm5lY3Rpb25zV2l0aElkZW50aWNhbEVuZHMoYywgZXhhbXBsZSk7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgaW50IGdldE51bWJlck9mQ29ubmVjdGlvbnNXaXRoU2FtZUVuZHNBcyhDb25uZWN0aW9uIGMpIHsKLQkJQW5jaG9yIGZyb20gPSBjLmdldFN0YXJ0KCk7Ci0JCUFuY2hvciB0byA9IGMuZ2V0RW5kKCk7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gY3MxID0gZnJvbS5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCk7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbj4gY3MyID0gdG8uZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpOwotCQlpbnQgY250ID0gMDsKLQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXQgPSBjczEuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJQ29ubmVjdGlvbiBjb24gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29uLmdldEVuZCgpID09IHRvKQotCQkJCWNudCsrOwotCQl9Ci0JCWlmIChmcm9tID09IHRvKQotCQkJcmV0dXJuIGNudDsKLQkJaXQgPSBjczIuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJQ29ubmVjdGlvbiBjb24gPSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29uLmdldEVuZCgpID09IGZyb20pCi0JCQkJY250Kys7Ci0JCQl9Ci0JCXJldHVybiBjbnQ7Ci0JfQotCQotCXN0YXRpYyB2b2lkIGFkZENvbm5lY3Rpb24oU2V0PFNldDxDb25uZWN0aW9uPj4gc2V0cywgQ29ubmVjdGlvbiBjLCBib29sZWFuIHNlbGZPbmx5KSB7Ci0JCWlmIChzZXRzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIidzZXRzJyBwYXJhbWV0ZXIgc2hvdWxkIG5vdCBiZSBudWxsIik7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGZPbmx5ICYmIChjLmdldFN0YXJ0KCkgIT0gYy5nZXRFbmQoKSkpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yPFNldDxDb25uZWN0aW9uPj4gc2V0c0l0ZXIgPSBzZXRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChzZXRzSXRlci5oYXNOZXh0KCkpIHsKLQkJCVNldDxDb25uZWN0aW9uPiBzZXQgPSBzZXRzSXRlci5uZXh0KCk7Ci0JCQlpZiAoY29ubmVjdGlvbkJlbG9uZ3NUb1NldChjLCBzZXQpKSB7Ci0JCQkJc2V0cy5yZW1vdmUoc2V0KTsKLQkJCQlzZXQuYWRkKGMpOwotCQkJCXNldHMuYWRkKHNldCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JfQotCQlTZXQ8Q29ubmVjdGlvbj4gbmV3U2V0ID0gbmV3IEhhc2hTZXQ8Q29ubmVjdGlvbj4oKTsKLQkJbmV3U2V0LmFkZChjKTsKLQkJc2V0cy5hZGQobmV3U2V0KTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyB2b2lkIHJlYXJyYW5nZUNvbm5lY3Rpb24oQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBpbnQgY250LCBpbnQgY29ubmVjdGlvbnNOdW0sIGJvb2xlYW4gc2VsZlJlbGF0aW9uKSB7Ci0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjID0gKEZyZWVGb3JtQ29ubmVjdGlvbiljb25uZWN0aW9uOwotCQlyZWFycmFuZ2VDb25uZWN0aW9uQmVuZFBvaW50cyhjLCBjbnQsIGNvbm5lY3Rpb25zTnVtLCBzZWxmUmVsYXRpb24pOwotCQlyZWFycmFuZ2VDb25uZWN0aW9uRGVjb3JhdG9yc0xvY2F0aW9uKGMsICBjbnQsIGNvbm5lY3Rpb25zTnVtKTsJCQkJCQkJCQkJCi0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCByZWFycmFuZ2VDb25uZWN0aW9uQmVuZFBvaW50cyhGcmVlRm9ybUNvbm5lY3Rpb24gYywgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtLCBib29sZWFuIHNlbGZSZWxhdGlvbikgewotCQlMaXN0PG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50PiBvbGRQdHMgPSBjLmdldEJlbmRwb2ludHMoKTsKLQkJTGlzdDxvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ+IG5ld1B0cyA9IEpQQUVkaXRvclV0aWwuY3JlYXRlQmVuZFBvaW50TGlzdChjLCBjbnQsIGNvbm5lY3Rpb25zTnVtLCAgc2VsZlJlbGF0aW9uKTsKLQkJaWYgKG5ld1B0cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkJCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgTWF0aC5taW4ob2xkUHRzLnNpemUoKSwgbmV3UHRzLnNpemUoKSk7IGkrKykgewotCQkJb2xkUHRzLnNldChpLCBHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5jcmVhdGVQb2ludCgvKmMsICovbmV3UHRzLmdldChpKS54LCBuZXdQdHMuZ2V0KGkpLnkpKTsKLQkJfQotCQlpbnQgZGlmZiA9IG9sZFB0cy5zaXplKCkgLSBuZXdQdHMuc2l6ZSgpOwotCQlpZiAoZGlmZiA+IDApIHsKLQkJCWZvciAoaW50IGkgPSBvbGRQdHMuc2l6ZSgpIC0gMTsgaSA+PSBuZXdQdHMuc2l6ZSgpOyBpLS0pIAotCQkJCW9sZFB0cy5yZW1vdmUoaSk7Ci0JCX0gZWxzZSBpZiAoZGlmZiA8IDApIHsKLQkJCWZvciAoaW50IGkgPSBvbGRQdHMuc2l6ZSgpOyBpIDwgbmV3UHRzLnNpemUoKTsgaSsrKSAKLQkJCQlvbGRQdHMuYWRkKEdyYXBoaXRpLmdldEdhU2VydmljZSgpLmNyZWF0ZVBvaW50KC8qYywgKi9uZXdQdHMuZ2V0KGkpLngsIG5ld1B0cy5nZXQoaSkueSkpOwotCQl9Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCByZWFycmFuZ2VDb25uZWN0aW9uRGVjb3JhdG9yc0xvY2F0aW9uKEZyZWVGb3JtQ29ubmVjdGlvbiBjLCAgaW50IGNudCwgaW50IGNvbm5lY3Rpb25zTnVtKSB7Ci0JCUNvbGxlY3Rpb248Q29ubmVjdGlvbkRlY29yYXRvcj4gZGNycyA9IGMuZ2V0Q29ubmVjdGlvbkRlY29yYXRvcnMoKTsKLQkJCQlpbnQgbGVuID0gSlBBRWRpdG9yVXRpbC5jYWxjQ29ubmVjdGlvbkxlbmd0aChjKTsKLQkJCQlmb3IgKENvbm5lY3Rpb25EZWNvcmF0b3IgZGNyIDogZGNycykgewotCQkJCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IGRjci5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQkJCQlpZiAoZ2EgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCQlpZiAoTWF0aC5hYnMoZGNyLmdldExvY2F0aW9uKCkgLSAwLjUpIDwgMC4wMDAxKSAKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCVBvaW50IHB0ID0gcmVjYWxjVGV4dERlY29yYXRvclBvc2l0aW9uKGMsIGRjcik7Ci0JCQkJCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihnYSwgcHQueCwgcHQueSwgZmFsc2UpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGRjci5nZXRMb2NhdGlvbigpIDwgMC41KSB7Ci0JCQkJCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbihkY3IuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSwgCi0JCQkJCQkJCU1hdGgucm91bmQobGVuIC8xMCkgLCAwKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUdyYXBoaXRpLmdldEdhU2VydmljZSgpLnNldExvY2F0aW9uKGRjci5nZXRHcmFwaGljc0FsZ29yaXRobSgpLCAKLQkJCQkJCQkJTWF0aC5yb3VuZCgtbGVuIC8xMCkgLCAwKTsKLQkJCQkJfQotCQkJCX0KLQl9Ci0JCi0JCi0JcHVibGljIHN0YXRpYyBQb2ludCByZWNhbGNUZXh0RGVjb3JhdG9yUG9zaXRpb24oRnJlZUZvcm1Db25uZWN0aW9uIGMsIAotCQkJCQkJCQkJCQkgQ29ubmVjdGlvbkRlY29yYXRvciBkY3IpIHsKLQkJaW50IENPUlIgPSA1OwotCQlpbnQgVFhUX0hFSUdIVCA9IDg7Ci0JCWRvdWJsZSBsb2NhdGlvbiA9IGRjci5nZXRMb2NhdGlvbigpOwotCQlSZWxFbmREaXIgcmVsRW5kRGlyID0gKGxvY2F0aW9uIDwgMC41KSA/IAotCQkJCUpQQUVkaXRvclV0aWwuZ2V0Q29ubmVjdGlvblN0YXJ0RGlyKGMpIDoKLQkJCQkJSlBBRWRpdG9yVXRpbC5nZXRDb25uZWN0aW9uRW5kRGlyKGMpOwotCQlUZXh0IHR4dCA9IChUZXh0KWRjci5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlpbnQgVFhUX1dJRFRIID0gdHh0LmdldFZhbHVlKCkubGVuZ3RoKCkgKiA2OwotCQlib29sZWFuIGlzQ2FyZGluYWxpdHkgPSBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfTEFCRUxTLmNvbnRhaW5zKHR4dC5nZXRWYWx1ZSgpKTsgCi0JCWludCB4ID0gMDsKLQkJaW50IHkgPSAwOwotCQlpZiAocmVsRW5kRGlyLmVxdWFscyhSZWxFbmREaXIuTEVGVCkpIHsKLQkJCXggPSBDT1JSICsgKGlzQ2FyZGluYWxpdHkgPyAyIDogMTIpOwotCQkJeSA9IGlzQ2FyZGluYWxpdHkgPyAoLUNPUlIgLSAzIC0gVFhUX0hFSUdIVCkgOiBDT1JSIC0gMzsKLQkJfSBlbHNlIGlmIChyZWxFbmREaXIuZXF1YWxzKFJlbEVuZERpci5SSUdIVCkpIHsKLQkJCXggPSAtIFRYVF9XSURUSDsKLQkJCXkgPSBpc0NhcmRpbmFsaXR5ID8gKC1DT1JSIC0gMyAtIFRYVF9IRUlHSFQpIDogQ09SUiAtIDM7Ci0JCX0gZWxzZSBpZiAocmVsRW5kRGlyLmVxdWFscyhSZWxFbmREaXIuVVApKSB7Ci0JCQl4ID0gaXNDYXJkaW5hbGl0eSA/ICgtQ09SUiAtIFRYVF9XSURUSCkgOiBDT1JSOwotCQkJeSA9IGlzQ2FyZGluYWxpdHkgPyBDT1JSIDogQ09SUiArIFRYVF9IRUlHSFQgKyAyOwotCQl9IGVsc2UgaWYgKHJlbEVuZERpci5lcXVhbHMoUmVsRW5kRGlyLkRPV04pKSB7Ci0JCQl4ID0gaXNDYXJkaW5hbGl0eSA/ICgtQ09SUiAtIFRYVF9XSURUSCkgOiBDT1JSOwotCQkJeSA9IC1DT1JSIC0gKGlzQ2FyZGluYWxpdHkgPyBUWFRfSEVJR0hUIDogKFRYVF9IRUlHSFQgKyAyKSAqIDIpOwotCQl9Ci0JCXJldHVybiBuZXcgUG9pbnQoeCwgeSk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZvcm1UYWJsZU5hbWUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgeyAKLQkJSVByb2plY3QgcHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpOwotCQlQcm9wZXJ0aWVzIHByb3BzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5sb2FkUHJvcGVydGllcyhwcm9qZWN0KTsKLQkgICAgU3RyaW5nIHRhYmxlTmFtZVByZWZpeCA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFRhYmxlUHJlZml4TmFtZShwcm9qZWN0LCBwcm9wcyk7Ci0JICAgIFN0cmluZyBzaG9ydEVudGl0eU5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpKTsgCi0JICAgIGlmICh0YWJsZU5hbWVQcmVmaXgubGVuZ3RoKCkgPT0gMCkKLQkgICAgCXJldHVybiBzaG9ydEVudGl0eU5hbWU7Ci0JCXJldHVybiB0YWJsZU5hbWVQcmVmaXggKyBzaG9ydEVudGl0eU5hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCX0KLQkKLQlzdGF0aWMgcHJpdmF0ZSBMaXN0PEFuY2hvcj4gZ2V0QW5jaG9ycyhDb250YWluZXJTaGFwZSBjb250YWluZXJTaGFwZSkgewotCQlMaXN0PEFuY2hvcj4gcmV0ID0gbmV3IEFycmF5TGlzdDxBbmNob3I+KCk7Ci0JCXJldC5hZGRBbGwoY29udGFpbmVyU2hhcGUuZ2V0QW5jaG9ycygpKTsKLQotCQlMaXN0PFNoYXBlPiBjaGlsZHJlbiA9IGNvbnRhaW5lclNoYXBlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoU2hhcGUgc2hhcGUgOiBjaGlsZHJlbikgewotCQkJaWYgKHNoYXBlIGluc3RhbmNlb2YgQ29udGFpbmVyU2hhcGUpIHsKLQkJCQlyZXQuYWRkQWxsKGdldEFuY2hvcnMoKENvbnRhaW5lclNoYXBlKSBzaGFwZSkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXQuYWRkQWxsKHNoYXBlLmdldEFuY2hvcnMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9CQotCQotCXN0YXRpYyBwdWJsaWMgUmVsRW5kRGlyIGdldENvbm5lY3Rpb25TdGFydERpcihGcmVlRm9ybUNvbm5lY3Rpb24gYykgewotCQlFTGlzdDxvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludD4gcHRzID0gYy5nZXRCZW5kcG9pbnRzKCk7Ci0JCXJldHVybiBnZXRDb25uZWN0aW9uRW5kRGlyKHB0cy5nZXQoMCksIHB0cy5nZXQoMSkpOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIFJlbEVuZERpciBnZXRDb25uZWN0aW9uRW5kRGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCUxpc3Q8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQ+IHB0cyA9IGMuZ2V0QmVuZHBvaW50cygpOwotCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbkVuZERpcihwdHMuZ2V0KHB0cy5zaXplKCkgLSAxKSwgcHRzLmdldChwdHMuc2l6ZSgpIC0gMikpOwotCX0JCi0JCi0Jc3RhdGljIHByaXZhdGUgUmVsRW5kRGlyIGdldENvbm5lY3Rpb25FbmREaXIob3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQgcHRFbmQsCi0JCQlvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludCBwdE5leHRUb0VuZCkgewotCQlpZiAocHRFbmQuZ2V0WCgpID09IHB0TmV4dFRvRW5kLmdldFgoKSkgewotCQkJcmV0dXJuIChwdE5leHRUb0VuZC5nZXRZKCkgPiBwdEVuZC5nZXRZKCkpID8gUmVsRW5kRGlyLlVQIDogUmVsRW5kRGlyLkRPV047Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gKHB0TmV4dFRvRW5kLmdldFgoKSA+IHB0RW5kLmdldFgoKSkgPyBSZWxFbmREaXIuTEVGVCA6IFJlbEVuZERpci5SSUdIVDsKLQkJfQkJCi0JfQotCQotCXN0YXRpYyBwdWJsaWMgdm9pZCBvcmdhbml6ZUltcG9ydHMoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpIHsKLQkJT3JnYW5pemVJbXBvcnRzQWN0aW9uIGFjdGlvbiA9IG5ldyBPcmdhbml6ZUltcG9ydHNBY3Rpb24od3MpOwotCQlhY3Rpb24ucnVuKGN1KTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyB2b2lkIGZvcm1hdENvZGUoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSVdvcmtiZW5jaFNpdGUgd3MpIHsKLQkJRm9ybWF0QWxsQWN0aW9uIGFjdGlvbiA9IG5ldyBGb3JtYXRBbGxBY3Rpb24od3MpOwotCQlhY3Rpb24ucnVuKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGN1KSk7Ci0JfQotCQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlRW50aXR5TmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIAotCQkJCQkJCQkJCQkJICBTdHJpbmcgcGFjaywgCi0JCQkJCQkJCQkJCQkgIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLSAgICAJU3RyaW5nIE5BTUUgPSBwYWNrICsgIi5FbnRpdHkiOyAvLyROT04tTkxTLTEkCi0gICAgCVN0cmluZyBuYW1lID0gbnVsbDsKLSAgICAJCi0gICAgCUhhc2hTZXQ8U3RyaW5nPiBKUEFQcm9qZWN0RW50aXR5TmFtZXMgPSBnZXRFbnRpdHlOYW1lcyhqcGFQcm9qZWN0KTsKLSAgICAgICAJSGFzaFNldDxTdHJpbmc+IEpQQVByb2plY3RFbnRpdHlTaW1wbGVOYW1lcyA9IGdldEVudGl0eVNpbXBsZU5hbWVzKGpwYVByb2plY3QpOwotICAgICAgIAkKLSAgICAJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwMDAwMDA7IGkrKykgewotICAgIAkJbmFtZSA9IE5BTUUgKyBpOwotICAgIAkJaWYgKCghZnAuaGFzT2JqZWN0V2l0aE5hbWUobmFtZSkpICYmCi0gICAgCQkJCSFKUEFQcm9qZWN0RW50aXR5TmFtZXMuY29udGFpbnMobmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpICYmIAotICAgIAkJCQkhSlBBUHJvamVjdEVudGl0eVNpbXBsZU5hbWVzLmNvbnRhaW5zKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShuYW1lKS50b0xvd2VyQ2FzZShMb2NhbGUuRU5HTElTSCkpICYmCi0gICAgCQkJCSFpc0phdmFGaWxlSW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuYW1lLCBwYWNrKSkgCi0gICAgCQkJYnJlYWs7Ci0gICAgCX0KLSAgICAJcmV0dXJuIG5hbWU7Ci0gICAgfQotCQotCQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlTWFwcGVkU3VwZXJjbGFzc05hbWUoCi0JCQlKcGFQcm9qZWN0IGpwYVByb2plY3QsIFN0cmluZyBwYWNrLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCVN0cmluZyBOQU1FID0gcGFjayArICIuTWFwcGVkU3VwZXJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JCUhhc2hTZXQ8U3RyaW5nPiBKUEFQcm9qZWN0RW50aXR5TmFtZXMgPSBnZXRFbnRpdHlOYW1lcyhqcGFQcm9qZWN0KTsKLQkJSGFzaFNldDxTdHJpbmc+IEpQQVByb2plY3RFbnRpdHlTaW1wbGVOYW1lcyA9IGdldEVudGl0eVNpbXBsZU5hbWVzKGpwYVByb2plY3QpOwotCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgMTAwMDAwMDAwOyBpKyspIHsKLQkJCW5hbWUgPSBOQU1FICsgaTsKLQkJCWlmICgoIWZwLmhhc09iamVjdFdpdGhOYW1lKG5hbWUpKSAmJiAhSlBBUHJvamVjdEVudGl0eU5hbWVzLmNvbnRhaW5zKG5hbWUKLQkJCQkJLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkgJiYgIUpQQVByb2plY3RFbnRpdHlTaW1wbGVOYW1lcy5jb250YWlucyhKUEFFZGl0b3JVdGlsCi0JCQkJCS5yZXR1cm5TaW1wbGVOYW1lKG5hbWUpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSkKLQkJCQkJJiYgIWlzSmF2YUZpbGVJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5hbWUsIHBhY2spKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkJCQkKLQotCQotCXN0YXRpYyBwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmcgZW50aXR5TmFtZSwgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUsCi0JCQlib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsCi0JCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UsIGJvb2xlYW4gaGFzUHJpbWFyeUtleSkKLQkJCXRocm93cyBFeGNlcHRpb24gewotCQlJRm9sZGVyIGZvbGRlciA9IGdldFBhY2thZ2VGb2xkZXIocHJvamVjdCk7Ci0JCXJldHVybiBjcmVhdGVFbnRpdHkocHJvamVjdCwgZm9sZGVyLCBlbnRpdHlOYW1lLAotCQkJCWlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBtYXBwZWRTdXBlcmNsYXNzTmFtZSwKLQkJCQltYXBwZWRTdXBlcmNsYXNzUGFja2FnZSwgaGFzUHJpbWFyeUtleSk7Ci0JfQotCi0JCQkJCi0Jc3RhdGljIHB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0luUHJvamVjdCgKLQkJCUlQcm9qZWN0IHByb2plY3QsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwKLQkJCUlQcmVmZXJlbmNlU3RvcmUganBhUHJlZmVyZW5jZVN0b3JlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUZvbGRlciBmb2xkZXIgPSBnZXRQYWNrYWdlRm9sZGVyKHByb2plY3QpOwotCQljcmVhdGVNYXBwZWRTdXBlcmNsYXNzKHByb2plY3QsIGZvbGRlciwgbWFwcGVkU3VwZXJjbGFzc05hbWUpOwotCQlyZXR1cm4gY3JlYXRlTWFwcGVkU3VwZXJjbGFzcyhwcm9qZWN0LCBmb2xkZXIsIG1hcHBlZFN1cGVyY2xhc3NOYW1lKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCQlwcml2YXRlIHN0YXRpYyBJRm9sZGVyIGdldFBhY2thZ2VGb2xkZXIoSVByb2plY3QgcHJvamVjdCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsJCQotCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIHBhY2thZ2VGcmFnbWVudFJvb3RzID0gbmV3IElQYWNrYWdlRnJhZ21lbnRSb290WzBdOwotCQlmaW5hbCBJQ2xhc3NwYXRoRW50cnlbXSBjbGFzc3BhdGhFbnRyaWVzID0gIGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwkJCi0JCWZvciAoSUNsYXNzcGF0aEVudHJ5IGNsYXNzcGF0aEVudHJ5IDogY2xhc3NwYXRoRW50cmllcykgewotCQkJaWYgKGNsYXNzcGF0aEVudHJ5LmdldEVudHJ5S2luZCgpID09IElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFKSB7Ci0JCQkJcGFja2FnZUZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290cyhjbGFzc3BhdGhFbnRyeSk7Ci0JCQkJYnJlYWs7Ci0JCQl9ICAJCQkKLQkJfQotCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290IHBhY2thZ2VGcmFnbWVudFJvb3QgPSBwYWNrYWdlRnJhZ21lbnRSb290c1swXTsKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0UGFja2FnZShwcm9qZWN0LCBwcm9wcykpOwotCQlpZihwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkgPT0gZmFsc2UpIHsKLQkJCXBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudFJvb3QuY3JlYXRlUGFja2FnZUZyYWdtZW50KEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UocHJvamVjdCwgcHJvcHMpLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQlJRm9sZGVyIGZvbGRlciA9IChJRm9sZGVyKSBwYWNrYWdlRnJhZ21lbnQuZ2V0Q29ycmVzcG9uZGluZ1Jlc291cmNlKCk7Ci0JCXJldHVybiBmb2xkZXI7Ci0KLQl9Ci0JCi0Jc3RhdGljIHByaXZhdGUgSUZpbGUgY3JlYXRlTWFwcGVkU3VwZXJjbGFzcyhJUHJvamVjdCBwcm9qZWN0LAotCQkJSUZvbGRlciBmb2xkZXIsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NTaG9ydE5hbWUgPSBtYXBwZWRTdXBlcmNsYXNzTmFtZQotCQkJCS5zdWJzdHJpbmcobWFwcGVkU3VwZXJjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUobWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSArICIuamF2YSIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgY29udGVudCA9ICJwYWNrYWdlICIgKyBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKHByb2plY3QpICsgIjtcblxuIiAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJCQkJKyAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7XG5cbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJATWFwcGVkU3VwZXJjbGFzcyBcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJwdWJsaWMgY2xhc3MgIiArIG1hcHBlZFN1cGVyY2xhc3NTaG9ydE5hbWUgKyAiIHtcblxuIiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAifSI7IC8vJE5PTi1OTFMtMSQKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS53cml0ZShjb250ZW50LmdldEJ5dGVzKCkpOwotCQkJCXN0cmVhbS5mbHVzaCgpOwotCQkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJlYW0udG9CeXRlQXJyYXkoKSksCi0JCQkJCQl0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0KLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc0phdmFGaWxlSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIAotCQkJCQkJCQkJCQkgIFN0cmluZyBlbnRpdHlOYW1lLAotCQkJCQkJCQkJCQkgIFN0cmluZyBkZWZhdWx0RW50aXR5UGFjYWthZ2UpIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbMF07Ci0JCUlDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMgPSBudWxsOwotCQl0cnkgewotCQkJY2xhc3NwYXRoRW50cmllcyA9IGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IG9idGFpbiB0aGUgY2xhc3NwYXRoIiwgZSk7IC8vJE5PTi1OTFMtMSQJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCQotCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBjbGFzc3BhdGhFbnRyeSA6IGNsYXNzcGF0aEVudHJpZXMpIHsKLQkJCWlmIChjbGFzc3BhdGhFbnRyeS5nZXRFbnRyeUtpbmQoKSA9PSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSkgewotCQkJCXBhY2thZ2VGcmFnbWVudFJvb3RzID0gamF2YVByb2plY3QuZ2V0UGFja2FnZUZyYWdtZW50Um9vdHMoY2xhc3NwYXRoRW50cnkpOwotCQkJCWJyZWFrOwotCQkJfSAgCQkJCi0JCX0KLQotCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gcGFja2FnZUZyYWdtZW50Um9vdHNbMF07Ci0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gcGFja2FnZUZyYWdtZW50Um9vdC5nZXRQYWNrYWdlRnJhZ21lbnQoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5nZXREZWZhdWx0UGFja2FnZShwcm9qZWN0KSk7Ci0JCWlmKCFwYWNrYWdlRnJhZ21lbnQuZXhpc3RzKCkpIAotCQkJcmV0dXJuIGZhbHNlOwotCQlJRm9sZGVyIGZvbGRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmb2xkZXIgPSAoSUZvbGRlcikgcGFja2FnZUZyYWdtZW50LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IG9idGFpbiB0aGUgZm9sZGVyIiwgZSk7IC8vJE5PTi1OTFMtMSQJCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0JCi0JCWlmICghZm9sZGVyLmV4aXN0cygpKSAKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGVudGl0eVNob3J0TmFtZSA9IGVudGl0eU5hbWUuc3Vic3RyaW5nKGVudGl0eU5hbWUKLQkJCQkubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZW50aXR5U2hvcnROYW1lICsgIi5qYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgcHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQkJCQkJCQkJCQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWVDYW5kaWRhdGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVOYW1lQ2FuZGlkYXRlOwotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwMDAwMDsgaSsrKSB7Ci0JCQlpZiAoanB0LmdldEF0dHJpYnV0ZU5hbWVkKG5hbWUpID09IG51bGwpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQluYW1lID0gYXR0cmlidXRlTmFtZUNhbmRpZGF0ZSArICJfIiArIGk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgcHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGZvcmJpZGRlbk5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lQ2FuZGlkYXRlKSB7Ci0JCVN0cmluZyBuYW1lID0gYXR0cmlidXRlTmFtZUNhbmRpZGF0ZTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCAxMDAwMDAwMDA7IGkrKykgewotCQkJaWYgKChqcHQuZ2V0QXR0cmlidXRlTmFtZWQobmFtZSkgPT0gbnVsbCkgJiYgIW5hbWUuZXF1YWxzKGZvcmJpZGRlbk5hbWUpKQotCQkJCXJldHVybiBuYW1lOwotCQkJbmFtZSA9IGF0dHJpYnV0ZU5hbWVDYW5kaWRhdGUgKyAiXyIgKyBpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW50aXR5T3BlbkVsc2V3aGVyZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBib29sZWFuIGNoZWNrRGlydHkpIHsKLQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkUmVmcyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlZFJlZnMubGVuZ3RoOyBpKyspIHsKLQkJCUlFZGl0b3JQYXJ0IGVkID0gZWRSZWZzW2ldLmdldEVkaXRvcihmYWxzZSk7Ci0JCQlpZiAoZWQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChjaGVja0RpcnR5ICYmICFlZC5pc0RpcnR5KCkpCi0JCQkJY29udGludWU7Ci0JCQlJRWRpdG9ySW5wdXQgZWRJbnAgPSBlZC5nZXRFZGl0b3JJbnB1dCgpOwotCQkJaWYgKEZpbGVFZGl0b3JJbnB1dC5jbGFzcy5pc0luc3RhbmNlKGVkSW5wKSkgewotCQkJCUZpbGVFZGl0b3JJbnB1dCBmZWRJbnB1dCA9IChGaWxlRWRpdG9ySW5wdXQpZWRJbnA7IAotCQkJCWlmIChmZWRJbnB1dC5nZXRGaWxlKCkuZXF1YWxzKGpwdC5nZXRSZXNvdXJjZSgpKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwkJCi0JfQotCQkKLQlwdWJsaWMgc3RhdGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmV0dXJuIGdldENvbXBpbGF0aW9uVW5pdCgoSUZpbGUpIGpwdC5nZXRSZXNvdXJjZSgpKTsKLQl9CQkKLQkKLQlwdWJsaWMgc3RhdGljIElDb21waWxhdGlvblVuaXQgZ2V0Q29tcGlsYXRpb25Vbml0KElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEVjbGlwc2VGYWNhZGUuSU5TVEFOQ0UuZ2V0SmF2YUNvcmUoKS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgYmVjb21lV29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQl0cnkgewotCQkJY3UuYmVjb21lV29ya2luZ0NvcHkobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBkaXNjYXJkIHRoZSB3b3JraW5nIGNvcHkiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNjYXJkV29ya2luZ0NvcHkoSUNvbXBpbGF0aW9uVW5pdCBjdSkgewotCQl3aGlsZSAoY3UuaXNXb3JraW5nQ29weSgpKQotCQkJdHJ5IHsKLQkJCQljdS5kaXNjYXJkV29ya2luZ0NvcHkoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2FuJ3QgZGlzY2FyZCB0aGUgd29ya2luZyBjb3B5IiwgZSk7IC8vJE5PTi1OTFMtMSQJCQotCQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGlzY2FyZFdvcmtpbmdDb3B5T25jZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQl0cnkgewotCQkJCWN1LmRpc2NhcmRXb3JraW5nQ29weSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBkaXNjYXJkIHRoZSB3b3JraW5nIGNvcHkiLCBlKTsgLy8kTk9OLU5MUy0xJAkJCi0JCQl9Ci0JfQotCQkKLQlzdGF0aWMgcHJpdmF0ZSBJRmlsZSBjcmVhdGVFbnRpdHkoSVByb2plY3QgcHJvamVjdCwgSUZvbGRlciBmb2xkZXIsIFN0cmluZyBlbnRpdHlOYW1lLCBib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCAKLQkJCVN0cmluZyBtYXBwZWRTdXBlcmNsYXNzTmFtZSwgU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlLCBib29sZWFuIGhhc1ByaW1hcnlLZXkpIHRocm93cyBFeGNlcHRpb24gewotCi0KLQkJCi0JCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsJCQotCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsJCQkJCi0JCX0KLQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGVudGl0eVNob3J0TmFtZSArICIuamF2YSIpOwkJIC8vJE5PTi1OTFMtMSQKLQkJUHJvcGVydGllcyBwcm9wcyA9IEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UubG9hZFByb3BlcnRpZXMocHJvamVjdCk7Ci0JCVN0cmluZyB0YWJsZU5hbWVQcmVmaXggPSBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRUYWJsZVByZWZpeE5hbWUocHJvamVjdCwgcHJvcHMpOwotCQlTdHJpbmcgdGFibGVOYW1lID0gKHRhYmxlTmFtZVByZWZpeC5sZW5ndGgoKSA+IDApID8gKHRhYmxlTmFtZVByZWZpeCArIGVudGl0eVNob3J0TmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkpIDogIiI7CS8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBmaWVsZEJhc2VkQWNjZXNzID0gSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5pc0FjY2Vzc0ZpZWxkQmFzZWQocHJvamVjdCwgcHJvcHMpOwotCQkKLQkJU3RyaW5nIGNsYXNzRGVjbGFyYXRpb25TdHJpbmdDb250ZW50ID0gbnVsbDsKLQkJaWYgKGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkKSB7Ci0JCQlTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSA9IG1hcHBlZFN1cGVyY2xhc3NOYW1lLnN1YnN0cmluZyhtYXBwZWRTdXBlcmNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQljbGFzc0RlY2xhcmF0aW9uU3RyaW5nQ29udGVudCA9ICJwdWJsaWMgY2xhc3MgIiArIGVudGl0eVNob3J0TmFtZSArICIgZXh0ZW5kcyAiICsgbWFwcGVkU3VwZXJjbGFzc1Nob3J0TmFtZSArICIge1xuXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgewotCQkJY2xhc3NEZWNsYXJhdGlvblN0cmluZ0NvbnRlbnQgPSAicHVibGljIGNsYXNzICIgKyBlbnRpdHlTaG9ydE5hbWUgKyAiIHtcblxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JCVN0cmluZyBwYWNrYWdlSW1wb3J0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1hcHBlZFN1cGVyY2xhc3NQYWNrYWdlICE9IG51bGwKLQkJCQkmJiAhbWFwcGVkU3VwZXJjbGFzc1BhY2thZ2UuZXF1YWxzKCIiKSAmJiAhKEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuZ2V0RGVmYXVsdFBhY2thZ2UocHJvamVjdCwgcHJvcHMpLmVxdWFscyhtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXBhY2thZ2VJbXBvcnQgPSAiaW1wb3J0ICIgKyBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSArICIuKjsiOyAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCVN0cmluZyBwcmltYXJ5S2V5RGVjbGFyYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWhhc1ByaW1hcnlLZXkpIHsKLQkJCXByaW1hcnlLZXlEZWNsYXJhdGlvbiA9IChmaWVsZEJhc2VkQWNjZXNzID8gIiAgQElkIFxuIiA6ICIiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAiICBwcml2YXRlIGxvbmcgaWQ7XG5cbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrIChmaWVsZEJhc2VkQWNjZXNzID8gIiIgOiAiICBASWQgXG4iKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJKyAiICBwdWJsaWMgbG9uZyBnZXRJZCgpIHtcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgICAgcmV0dXJuIGlkO1xuIiAvLyROT04tTkxTLTEkCi0JCQkJCSsgIiAgfVxuXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiICBwdWJsaWMgdm9pZCBzZXRJZChsb25nIGlkKSB7XG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiICAgIHRoaXMuaWQgPSBpZDtcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICIgIH1cblxuIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJICBTdHJpbmcgY29udGVudCA9ICJwYWNrYWdlICIgKyBKUEFEaWFncmFtUHJvcGVydHlQYWdlLmdldERlZmF1bHRQYWNrYWdlKHByb2plY3QsIHByb3BzKSArICI7XG5cbiIgLy8kTk9OLU5MUy0xJAkvLyROT04tTkxTLTIkCi0JCQkJCSsgImltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS4qO1xuIiAgLy8kTk9OLU5MUy0xJAotCQkJCQkrIHBhY2thZ2VJbXBvcnQrIlxuXG4iIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiQEVudGl0eSBcbiIgLy8kTk9OLU5MUy0xJAotCQkJCQkrICgodGFibGVOYW1lLmxlbmd0aCgpID4gMCkgPyAoIkBUYWJsZShuYW1lPVwiIiArIHRhYmxlTmFtZSArICJcIilcbiIpIDogIiIpICAvLyROT04tTkxTLTEkCS8vJE5PTi1OTFMtMiQJLy8kTk9OLU5MUy0zJAotCQkJCQkrIGNsYXNzRGVjbGFyYXRpb25TdHJpbmdDb250ZW50Ci0JCQkJCSsgcHJpbWFyeUtleURlY2xhcmF0aW9uCi0JCQkJCSsifSI7IC8vJE5PTi1OTFMtMSQKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS53cml0ZShjb250ZW50LmdldEJ5dGVzKCkpOwotCQkJCXN0cmVhbS5mbHVzaCgpOwotCQkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJlYW0udG9CeXRlQXJyYXkoKSksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQkJCi0JCi0Jc3RhdGljIHByaXZhdGUgSGFzaFNldDxTdHJpbmc+IGdldEVudGl0eU5hbWVzKEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlIYXNoU2V0PFN0cmluZz4gbmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JCUxpc3RJdGVyYXRvcjxQZXJzaXN0ZW5jZVVuaXQ+IGxpdCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKS4KLQkJCQkJCQkJCQkJCWdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IGxpdC5uZXh0KCk7Ci0JCWZvciAoQ2xhc3NSZWYgY2YgOiBwdS5nZXRDbGFzc1JlZnMoKSkgewotCQkJbmFtZXMuYWRkKGNmLmdldENsYXNzTmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gbmFtZXM7Ci0JfQotCQotCXN0YXRpYyBwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBnZXRFbnRpdHlTaW1wbGVOYW1lcyhKcGFQcm9qZWN0IGpwYVByb2plY3QpIHsKLQkJSGFzaFNldDxTdHJpbmc+IG5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlMaXN0SXRlcmF0b3I8UGVyc2lzdGVuY2VVbml0PiBsaXQgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuCi0JCQkJCQkJCQkJCQlnZXRQZXJzaXN0ZW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdHMoKS5pdGVyYXRvcigpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBsaXQubmV4dCgpOwkJCQotCQlmb3IgKENsYXNzUmVmIGNmIDogcHUuZ2V0Q2xhc3NSZWZzKCkpIHsKLQkJCW5hbWVzLmFkZChKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoY2YuZ2V0Q2xhc3NOYW1lKCkpLnRvTG93ZXJDYXNlKExvY2FsZS5FTkdMSVNIKSk7Ci0JCX0KLQkJcmV0dXJuIG5hbWVzOwotCX0JCQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NhcmRpbmFsaXR5RGVjb3JhdG9yKENvbm5lY3Rpb25EZWNvcmF0b3IgY2QpIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gZ2EgPSBjZC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQlpZiAoIVRleHQuY2xhc3MuaXNJbnN0YW5jZShnYSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVRleHQgdHh0ID0gKFRleHQpZ2E7Ci0JCXJldHVybiBKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfTEFCRUxTLmNvbnRhaW5zKHR4dC5nZXRWYWx1ZSgpKTsKLQl9Ci0JCi0JCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VG9vbHRpcFRleHQoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQpIHsKLSAgICAJU3RyaW5nIHJlcyA9IGdldEF0dHJpYnV0ZVR5cGVOYW1lKGF0KTsKLSAgICAJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpQQUVkaXRvck1lc3NhZ2VzLkpQQUVkaXRvclV0aWxfdHlwZVRvb2x0aXBUZXh0LCBuZXcgT2JqZWN0W10geyByZXMgfSk7IAotICAgIH0KLSAgICAKLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2hlY2tKUEFGYWNldFZlcnNpb24oSnBhUHJvamVjdCBqcGFQcm9qZWN0LCBTdHJpbmcgdmVyc2lvbikgewotCQlyZXR1cm4gY2hlY2tKUEFGYWNldFZlcnNpb24oanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIHZlcnNpb24pOwotCX0JCi0JCi0JCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNoZWNrSlBBRmFjZXRWZXJzaW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmcHJvaiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmcHJvaiA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDb3VsZCBub3QgY3JlYXRlIGZhY2V0ZWQgcHJvamVjdCBmcm9tICIgKyBwcm9qZWN0LmdldE5hbWUoKSwgZSk7IC8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JCVNldDxJUHJvamVjdEZhY2V0VmVyc2lvbj4gcHJvakZhY2V0cyA9IGZwcm9qLmdldFByb2plY3RGYWNldHMoKTsKLQkJSXRlcmF0b3I8SVByb2plY3RGYWNldFZlcnNpb24+IGl0ID0gcHJvakZhY2V0cy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJUHJvamVjdEZhY2V0VmVyc2lvbiBmdiA9IGl0Lm5leHQoKTsKLQkJCWlmIChmdi5nZXRQcm9qZWN0RmFjZXQoKS5nZXRJZCgpLmVxdWFscygianB0LmpwYSIpKSB7CS8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZnYuZ2V0VmVyc2lvblN0cmluZygpLmVxdWFscyh2ZXJzaW9uKTsJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRQcmltaXRpdmVXcmFwcGVyKFN0cmluZyBwcmltaXRpdmUpIHsKLQkJcmV0dXJuIEpQQUVkaXRvckNvbnN0YW50cy5QUklNSVRJVkVfVE9fV1JBUFBFUi5nZXQocHJpbWl0aXZlKTsKLQl9Ci0JCi0Jc3RhdGljIHByaXZhdGUgRmlsZSBnZXRGaWxlKElQYXRoIGNsYXNzUGF0aEVudHJ5KSB7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmID0gcm9vdC5nZXRGaWxlKGNsYXNzUGF0aEVudHJ5KTsKLQkJaWYgKChmICE9IG51bGwpICYmIGYuZXhpc3RzKCkpIHsKLQkJCVVSSSB1cmkgPSBmLmdldExvY2F0aW9uVVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIAotCQkJCXJldHVybiBuZXcgRmlsZShjbGFzc1BhdGhFbnRyeS50b09TU3RyaW5nKCkpOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUodXJpKTsKLQkJCXJldHVybiBmaWxlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBGaWxlKGNsYXNzUGF0aEVudHJ5LnRvT1NTdHJpbmcoKSk7IAkKLQkJfQotCi0JfQotCQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1BlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5SW5DbGFzc3BhdGgoSVBhdGggY2xhc3NQYXRoRW50cnkpIHsKLQkJdHJ5IHsKLQkJCUZpbGUgZiA9IGdldEZpbGUoY2xhc3NQYXRoRW50cnkpOwotCQkJaWYgKChmID09IG51bGwpIHx8ICFmLmV4aXN0cygpKSAKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlKYXJGaWxlIGphciA9IG5ldyBKYXJGaWxlKGYpOwotCQkJRW51bWVyYXRpb248SmFyRW50cnk+IGVudHJpZXMgPSBqYXIuZW50cmllcygpOwotCi0JCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChlbnRyeS5nZXROYW1lKCkuZXF1YWxzKFBFUlNJU1RFTkNFX1BST1ZJREVSX0xJQlJBUllfU1RSSU5HKSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihlKTsgCSAgICAgCQkJCQkKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQkKLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2hlY2tJc1NldFBlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5KEpwYVByb2plY3QganBhUHJvamVjdCkgewotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXSB7IGphdmFQcm9qZWN0IH07Ci0JCUphdmFTZWFyY2hTY29wZSBzY29wZSA9IChKYXZhU2VhcmNoU2NvcGUpIFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQlib29sZWFuIGlzQWRkZWQgPSBmYWxzZTsKLQotCQlJUGF0aFtdIHBhdGhzID0gc2NvcGUuZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUlQYXRoIHBhdGggPSBwYXRoc1tpXTsKLQkJCWlmIChpc1BlcnNpc3RlbmNlUHJvdmlkZXJMaWJyYXJ5SW5DbGFzc3BhdGgocGF0aCkpIHsKLQkJCQlpc0FkZGVkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNBZGRlZDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3V0T2ZmU3RyaW5nUHJlZml4KFN0cmluZyBzLCBTdHJpbmcgcHJlZml4KSB7Ci0JCWlmIChzLnN0YXJ0c1dpdGgocHJlZml4KSkgCi0JCQlyZXR1cm4gcy5zdWJzdHJpbmcocHJlZml4Lmxlbmd0aCgpKTsKLQkJcmV0dXJuIHM7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGN1dE9mZkhlYWRlckRpcnR5UHJlZml4KFN0cmluZyBoZWFkZXIpIHsKLQkJcmV0dXJuIGN1dE9mZlN0cmluZ1ByZWZpeChoZWFkZXIsIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfUFJFRklYX0RJUlRZKTsKLQl9CQotCQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBhcmVIZWFkZXJzRXF1YWwoU3RyaW5nIGgxLCBTdHJpbmcgaDIpIHsKLQkJaDEgPSBjdXRPZmZIZWFkZXJEaXJ0eVByZWZpeChoMSk7Ci0JCWgyID0gY3V0T2ZmSGVhZGVyRGlydHlQcmVmaXgoaDIpOwotCQlyZXR1cm4gaDEuZXF1YWxzKGgyKTsKLQl9Ci0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbEltcGwuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pQQUVkaXRvclV0aWxJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MWFkMGQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckltYWdlQ3JlYXRvci5SZWxFbmREaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hTaXRlOwotCi0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JVdGlsSW1wbCBpbXBsZW1lbnRzIElKUEFFZGl0b3JVdGlsIHsKLQotCXB1YmxpYyBpbnQgY2FsY0Nvbm5lY3Rpb25MZW5ndGgoRnJlZUZvcm1Db25uZWN0aW9uIGMpIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuY2FsY0Nvbm5lY3Rpb25MZW5ndGgoYyk7Ci0JfQotCi0JcHVibGljIExpc3Q8UG9pbnQ+IGNyZWF0ZUJlbmRQb2ludExpc3QoRnJlZUZvcm1Db25uZWN0aW9uIGMsICBpbnQgY250LCBpbnQgY29ubmVjdGlvbnNOdW0sICBib29sZWFuIHNlbGZSZWxhdGlvbikgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5jcmVhdGVCZW5kUG9pbnRMaXN0KGMsICBjbnQsIGNvbm5lY3Rpb25zTnVtLCBzZWxmUmVsYXRpb24pOwotCX0KLQkKLQlwdWJsaWMgTGlzdDxQb2ludD4gY3JlYXRlQmVuZFBvaW50TGlzdChGcmVlRm9ybUNvbm5lY3Rpb24gYywgIGJvb2xlYW4gc2VsZlJlbGF0aW9uKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmNyZWF0ZUJlbmRQb2ludExpc3QoYywgIHNlbGZSZWxhdGlvbik7Ci0JfQotCQotCXB1YmxpYyBSZWxFbmREaXIgZ2V0Q29ubmVjdGlvblN0YXJ0RGlyKEZyZWVGb3JtQ29ubmVjdGlvbiBjKSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldENvbm5lY3Rpb25TdGFydERpcihjKTsKLQkJCi0JfQotCQotCXB1YmxpYyBSZWxFbmREaXIgZ2V0Q29ubmVjdGlvbkVuZERpcihGcmVlRm9ybUNvbm5lY3Rpb24gYykgewotCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5nZXRDb25uZWN0aW9uRW5kRGlyKGMpOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldEpQVHlwZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldEpQVHlwZShjdSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIG9yZ2FuaXplSW1wb3J0cyhJQ29tcGlsYXRpb25Vbml0IGN1LCBJV29ya2JlbmNoU2l0ZSB3cykgewotCQlKUEFFZGl0b3JVdGlsLm9yZ2FuaXplSW1wb3J0cyhjdSwgd3MpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBmb3JtYXRDb2RlKElDb21waWxhdGlvblVuaXQgY3UsIElXb3JrYmVuY2hTaXRlIHdzKSB7Ci0JCUpQQUVkaXRvclV0aWwuZm9ybWF0Q29kZShjdSwgd3MpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVW5pcXVlRW50aXR5TmFtZShKcGFQcm9qZWN0IGpwYVByb2plY3QsIAotCQkJICBTdHJpbmcgcGFjaywgCi0JCQkgIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2VuZXJhdGVVbmlxdWVFbnRpdHlOYW1lKGpwYVByb2plY3QsIHBhY2ssIGZwKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVVuaXF1ZU1hcHBlZFN1cGVyY2xhc3NOYW1lKEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIHBhY2ssIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuZ2VuZXJhdGVVbmlxdWVNYXBwZWRTdXBlcmNsYXNzTmFtZShqcGFQcm9qZWN0LCBwYWNrLCBmcCk7Ci0JfQotCi0JCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eUluUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LCBTdHJpbmcgZW50aXR5TmFtZSwgSVByZWZlcmVuY2VTdG9yZSBqcGFQcmVmZXJlbmNlU3RvcmUsCi0JCQlib29sZWFuIGlzTWFwcGVkU3VwZXJjbGFzc0NoaWxkLCBTdHJpbmcgbWFwcGVkU3VwZXJjbGFzc05hbWUsIFN0cmluZyBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSwgYm9vbGVhbiBoYXNQcmltYXJ5S2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KHByb2plY3QsIGVudGl0eU5hbWUsIGpwYVByZWZlcmVuY2VTdG9yZSwgaXNNYXBwZWRTdXBlcmNsYXNzQ2hpbGQsIAotCQkJCW1hcHBlZFN1cGVyY2xhc3NOYW1lLCBtYXBwZWRTdXBlcmNsYXNzUGFja2FnZSwgaGFzUHJpbWFyeUtleSk7Ci0gCX0KLQotCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0NhcmRpbmFsaXR5RGVjb3JhdG9yKENvbm5lY3Rpb25EZWNvcmF0b3IgZGMpIHsKLQkJcmV0dXJuIEpQQUVkaXRvclV0aWwuaXNDYXJkaW5hbGl0eURlY29yYXRvcihkYyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY2FyZFdvcmtpbmdDb3B5T25jZShJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCUpQQUVkaXRvclV0aWwuZGlzY2FyZFdvcmtpbmdDb3B5T25jZShjdSk7Ci0JfQotCQotCXB1YmxpYyBJRmlsZSBjcmVhdGVFbnRpdHlGcm9tTWFwcGVkU3VwZXJjbGFzc0luUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nIG1hcHBlZFN1cGVyY2xhc3NOYW1lLCBJUHJlZmVyZW5jZVN0b3JlIGpwYVByZWZlcmVuY2VTdG9yZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBKUEFFZGl0b3JVdGlsLmNyZWF0ZUVudGl0eUZyb21NYXBwZWRTdXBlcmNsYXNzSW5Qcm9qZWN0KHByb2plY3QsIG1hcHBlZFN1cGVyY2xhc3NOYW1lLCBqcGFQcmVmZXJlbmNlU3RvcmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSlBBU29sdmVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFTb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI1YWZiMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9KUEFTb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwucmVzb3VyY2VzLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlckRlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uUmVjb3JkaW5nQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLnV0aWwuVHJhbnNhY3Rpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5BZGRDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LmltcGwuUmVtb3ZlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRGlhZ3JhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkZyZWVGb3JtQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlBpY3RvZ3JhbUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5zZXJ2aWNlcy5HcmFwaGl0aTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmUuUGFja2FnZUZyYWdtZW50Um9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUuSnB0UmVzb3VyY2VNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYXRvcnMuQXJyYXlJdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50LkNvbGxlY3Rpb25BZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvbkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5Db2xsZWN0aW9uQ2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuQ29sbGVjdGlvblJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuU3RhdGVDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmxpc3RlbmVyLlN0YXRlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuTWFueVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5NYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0Lk9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5PcHRpb25hbE1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWFkT25seVJlbGF0aW9uc2hpcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVsYXRpb25zaGlwTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5SZWxhdGlvbnNoaXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9PbmVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmFjYWRlLkVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuQWRkUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlJlbW92ZVJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSlBBRWRpdG9yRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQWJzdHJhY3RSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQotcHVibGljIGNsYXNzIEpQQVNvbHZlciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJSnBhU29sdmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFNldDxKUEFTb2x2ZXI+IHNvbHZlcnNTZXQgPSBuZXcgSGFzaFNldDxKUEFTb2x2ZXI+KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBXb3JraW5nQ29weUNoYW5nZUxpc3RlbmVyIHdjbHNuciA9IG51bGw7Ci0KLQlwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIE9iamVjdD4ga2V5VG9CTzsKLQlwcml2YXRlIFdlYWtIYXNoTWFwPEpwYVByb2plY3QsIFdlYWtSZWZlcmVuY2U8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPj4gcHJvamVjdFRvRW50aXR5TGlzdGVuZXI7Ci0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudFR5cGUsIFdlYWtSZWZlcmVuY2U8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+IGVudGl0eVRvUHJvcExpc3RlbmVyOwotCXByaXZhdGUgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+IGF0dHJpYnV0ZVRvUHJvcExpc3RlbmVyOwotCXByaXZhdGUgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+PiBhdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lcjsJCQotCXByaXZhdGUgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyOwkKLQlwcml2YXRlIFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PiBhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lcjsKLQlwcml2YXRlIFdlYWtIYXNoTWFwPEphdmFQZXJzaXN0ZW50VHlwZSwgV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+PiBlbnRpdHlUb0F0TGlzdGVuZXI7Ci0JcHJpdmF0ZSBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudFR5cGUsIFdlYWtSZWZlcmVuY2U8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4+IGVudGl0eVRvU3RhdGVMaXN0ZW5lcjsKLQlwcml2YXRlIEVudGl0eUNoYW5nZUxpc3RlbmVyIGVudGl0eU5hbWVMaXN0ZW5lcjsKLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCXByaXZhdGUgSGFzaFNldDxTdHJpbmc+IHJlbW92ZUlnbm9yZSA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQlwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiByZW1vdmVSZWxJZ25vcmUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLQlwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBhZGRJZ25vcmUgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0JcHJpdmF0ZSBIYXNodGFibGU8U3RyaW5nLCBJUmVsYXRpb24+IGF0dHJpYlRvUmVsID0gbmV3IEhhc2h0YWJsZTxTdHJpbmcsIElSZWxhdGlvbj4oKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VQQVJBVE9SID0gIi0iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGU7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yVXRpbCB1dGlsID0gbnVsbDsKLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSB1bmlxdWUga2V5IGZvciB0aGUgZ2l2ZW4gYnVzaW5lc3Mgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBibwotCSAqICAgICAgICAgICAgdGhlIGdpdmVuIGJ1c2luZXNzIG9iamVjdAotCSAqIAotCSAqIEByZXR1cm4gdW5pcXVlIGtleQotCSAqLwotCXB1YmxpYyBKUEFTb2x2ZXIoKSB7Ci0JCXRoaXMoRWNsaXBzZUZhY2FkZS5JTlNUQU5DRSwgbmV3IEpQQUVkaXRvclV0aWxJbXBsKCkpOwotCQlzeW5jaHJvbml6ZWQgKEpQQVNvbHZlci5jbGFzcykgewotCQkJaWYgKHdjbHNuciA9PSBudWxsKSB7Ci0JCQkJd2Nsc25yID0gbmV3IFdvcmtpbmdDb3B5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKHdjbHNuciwgRWxlbWVudENoYW5nZWRFdmVudC5QT1NUX0NIQU5HRSB8IEVsZW1lbnRDaGFuZ2VkRXZlbnQuUE9TVF9SRUNPTkNJTEUpOwotCQkJfQotCQl9Ci0JCXNvbHZlcnNTZXQuYWRkKHRoaXMpOwotCX0KLQkKLQlwdWJsaWMgSlBBU29sdmVyKElFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUsIElKUEFFZGl0b3JVdGlsIHV0aWwpIHsKLQkJdGhpcy5lY2xpcHNlRmFjYWRlID0gZWNsaXBzZUZhY2FkZTsKLQkJZWNsaXBzZUZhY2FkZS5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKTsKLQkJa2V5VG9CTyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBPYmplY3Q+KCk7Ci0JCXByb2plY3RUb0VudGl0eUxpc3RlbmVyID0gbmV3IFdlYWtIYXNoTWFwPEpwYVByb2plY3QsIFdlYWtSZWZlcmVuY2U8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJZW50aXR5VG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRUeXBlLCBXZWFrUmVmZXJlbmNlPFByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+PigpOwotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lciA9IG5ldyBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+PigpOwotCQlhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lciA9IG5ldyBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPj4oKTsKLQkJYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4+KCk7IAotCQllbnRpdHlUb0F0TGlzdGVuZXIgPSBuZXcgV2Vha0hhc2hNYXA8SmF2YVBlcnNpc3RlbnRUeXBlLCBXZWFrUmVmZXJlbmNlPExpc3RDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0JCWVudGl0eVRvU3RhdGVMaXN0ZW5lciA9IG5ldyBXZWFrSGFzaE1hcDxKYXZhUGVyc2lzdGVudFR5cGUsIFdlYWtSZWZlcmVuY2U8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4+KCk7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lciA9IG5ldyBFbnRpdHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJZW50aXR5TmFtZUxpc3RlbmVyLnNldE5hbWUoIkVudGl0eSBOYW1lIENoYW5nZSBMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCi0JCXRoaXMudXRpbCA9IHV0aWw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0KLQkJY2xvc2VEaWFncmFtRWRpdG9ySWZQcm9qZWN0SXNEZWxldGVkKGV2ZW50KTsKLQkJCi0JCXVucmVnaXN0ZXJEZWx0ZWRFbnRpdHkoZXZlbnQpOwotCQkKLQkJSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzID0gZXZlbnQuZmluZE1hcmtlckRlbHRhcyhudWxsLCB0cnVlKTsKLQkJU2V0PElGaWxlPiBmaWxlc1RvVXBkYXRlID0gbmV3IEhhc2hTZXQ8SUZpbGU+KCk7Ci0JCWZvciAoSU1hcmtlckRlbHRhIGRlbHRhIDogbWFya2VyRGVsdGFzKSB7Ci0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQkJY29udGludWU7Ci0JCQlmaWxlc1RvVXBkYXRlLmFkZCgoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCkpOwotCQl9Ci0JCQotCQkvLyB1cGRhdGUgaXMgbWFkZSB0byB0aGUgd2hvbGUgZWRpdG9yLiBGaW5kIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uIHBlCi0JCS8vIHRvIGJlIHVwZGF0ZSBhbmQgYnJlYWsgdGhlIGl0ZXJhdGlvbgotCQlib29sZWFuIHVwZGF0ZUVkaXRvciA9IGZhbHNlOwotCQlGSUxFOiBmb3IgKElGaWxlIGZpbGUgOiBmaWxlc1RvVXBkYXRlKSB7Ci0JCQlmb3IgKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQgOiBlbnRpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKSkgewotCQkJCWlmIChqcHQuZ2V0UmVzb3VyY2UoKS5lcXVhbHMoZmlsZSkpIHsKLQkJCQkJZmluYWwgUGljdG9ncmFtRWxlbWVudCBlbGVtZW50ID0gZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWVsc2UgewotCQkJCQkJdXBkYXRlRWRpdG9yID0gdHJ1ZTsKLQkJCQkJCWJyZWFrIEZJTEU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHVwZGF0ZUVkaXRvcikgewotCQkJZWNsaXBzZUZhY2FkZS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmKGZlYXR1cmVQcm92aWRlciAhPSBudWxsKQotCQkJCQkJZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtRWRpdG9yKCkucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0pOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZW1vdmVJZ25vcmUoU3RyaW5nIGF0TmFtZSkgewotCQlyZW1vdmVJZ25vcmUuYWRkKGF0TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVtb3ZlUmVsSWdub3JlKFN0cmluZyBhdE5hbWUpIHsKLQkJcmVtb3ZlUmVsSWdub3JlLmFkZChhdE5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgYWRkSlBURm9yVXBkYXRlKFN0cmluZyBqcHROYW1lKSB7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5hZGRKUFRGb3JVcGRhdGUoanB0TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWRkSWdub3JlKFN0cmluZyBhdE5hbWUpIHsKLQkJYWRkSWdub3JlLmFkZChhdE5hbWUpOwotCX0KLQkKLQlwdWJsaWMgSGFzaFNldDxTdHJpbmc+IGdldEFkZElnbm9yZSgpeyAKLSAJCXJldHVybiBhZGRJZ25vcmU7IAotIAl9IAotCi0JCi0JcHVibGljIHZvaWQgc3RvcFRocmVhZCgpIHsKLQkJZW50aXR5TmFtZUxpc3RlbmVyLnN0b3BUaHJlYWQoKTsKLQkJZW50aXR5TmFtZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgcHVibGljIEVudGl0eUNoYW5nZUxpc3RlbmVyIGdldE1vbml0b3IoKSB7Ci0JCWlmIChlbnRpdHlOYW1lTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZW50aXR5TmFtZUxpc3RlbmVyID0gbmV3IEVudGl0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQkJZW50aXR5TmFtZUxpc3RlbmVyLnNldE5hbWUoIkVudGl0eSBOYW1lIENoYW5nZSBMaXN0ZW5lciIpOyAvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJcmV0dXJuIGVudGl0eU5hbWVMaXN0ZW5lcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS51dGlsLklKcGFTb2x2ZXIjc2V0RmVhdHVyZVByb3ZpZGVyKG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVByb3ZpZGVyKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyKSB7Ci0JCXRoaXMuZmVhdHVyZVByb3ZpZGVyID0gZmVhdHVyZVByb3ZpZGVyOwotCQllbnRpdHlOYW1lTGlzdGVuZXIuc2V0RmVhdHVyZVByb3ZpZGVyKGZlYXR1cmVQcm92aWRlcik7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5zZXREYWVtb24odHJ1ZSk7Ci0JCWVudGl0eU5hbWVMaXN0ZW5lci5zdGFydCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoT2JqZWN0IGJvKSB7Ci0JCWlmIChibyA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGJvOwotCQkJU3RyaW5nIG5hbWUgPSBqcHQuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIG5hbWU7Ci0JCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChBYnN0cmFjdFJlbGF0aW9uKSBibykuZ2V0SWQoKTsKLQkJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgYm87Ci0JCQlyZXR1cm4gKCgoUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpLmdldE5hbWUoKSArICItIiArIGF0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYm8udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgYnVzaW5lc3Mgb2JqZWN0IGZvciB0aGUgZ2l2ZW4ga2V5LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUga2V5Ci0JICogCi0JICogQHJldHVybiB0aGUgYnVzaW5lc3Mgb2JqZWN0Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRCdXNpbmVzc09iamVjdEZvcktleShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4ga2V5VG9CTy5nZXQoa2V5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2R1Y2VPd25lcktleUZvclJlbChBYnN0cmFjdFJlbGF0aW9uIHJlbCkgewotCQlyZXR1cm4gcHJvZHVjZUtleUZvclJlbChyZWwuZ2V0T3duZXIoKSwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByb2R1Y2VJbnZlcnNlS2V5Rm9yUmVsKEFic3RyYWN0UmVsYXRpb24gcmVsKSB7Ci0JCXJldHVybiBwcm9kdWNlS2V5Rm9yUmVsKHJlbC5nZXRJbnZlcnNlKCksIHJlbC5nZXRJbnZlcnNlQXR0cmlidXRlTmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHByb2R1Y2VLZXlGb3JSZWwoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJcmV0dXJuIGpwdC5nZXROYW1lKCkgKyBTRVBBUkFUT1IgKyBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEtleUJ1c2luZXNzT2JqZWN0KFN0cmluZyBrZXksIE9iamVjdCBibykgewotCQlrZXlUb0JPLnB1dChrZXksIGJvKTsKLQkJaWYgKGJvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRUeXBlKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgYm87Ci0JCQlKcGFQcm9qZWN0IHByb2ogPSBqcHQuZ2V0SnBhUHJvamVjdCgpOwotCQkJYWRkTGlzdGVuZXJzVG9Qcm9qZWN0KHByb2opOwotCQkJYWRkTGlzdGVuZXJzVG9FbnRpdHkoanB0KTsKLQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKHBlLCBKUEFFZGl0b3JDb25zdGFudHMuUFJPUF9FTlRJVFlfQ0xBU1NfTkFNRSwganB0LmdldE5hbWUoKSk7Ci0JCX0gZWxzZSBpZiAoYm8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7Ci0JCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IChBYnN0cmFjdFJlbGF0aW9uKSBibzsKLQkJCWF0dHJpYlRvUmVsLnB1dChwcm9kdWNlT3duZXJLZXlGb3JSZWwocmVsKSwgcmVsKTsKLQkJCWlmIChyZWwgaW5zdGFuY2VvZiBCaWRpcmVjdGlvbmFsUmVsYXRpb24pIHsKLQkJCQlhdHRyaWJUb1JlbC5wdXQocHJvZHVjZUludmVyc2VLZXlGb3JSZWwocmVsKSwgcmVsKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChibyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSB7Ci0JCQlhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb0F0dHJpYnV0ZSgoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpYm8pOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCByZW1vdmUoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IG8gPSBrZXlUb0JPLnJlbW92ZShrZXkpOwotCQlpZiAobyBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG87Ci0JCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0IDoganB0LmdldEF0dHJpYnV0ZXMoKSkgewotCQkJCVN0cmluZyBrID0gZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCQkJCXJlbW92ZShrKTsKLQkJCX0KLQkJCQotCQkJcmVtb3ZlTGlzdGVuZXJzRnJvbUVudGl0eShqcHQpOwotCQkJRGlhZ3JhbSBkID0gZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKS5nZXREaWFncmFtKCk7Ci0JCQlpZiAoZC5nZXRDaGlsZHJlbigpLnNpemUoKSA9PSAxKSB7Ci0JCQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IHJlZiA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLnJlbW92ZShqcHQuZ2V0SnBhUHJvamVjdCgpKTsKLQkJCQlpZiAocmVmICE9IG51bGwpIHsKLQkJCQkJQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyIGNoID0gcmVmLmdldCgpOwotCQkJCQlpZiAoY2ggIT0gbnVsbCkgCi0JCQkJCQlqcHQuZ2V0SnBhUHJvamVjdCgpLnJlbW92ZUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcihKcGFQcm9qZWN0LkpQQV9GSUxFU19DT0xMRUNUSU9OLCBjaCk7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCQlKUEFFZGl0b3JVdGlsLmRpc2NhcmRXb3JraW5nQ29weU9uY2UoY3UpOwotCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBBYnN0cmFjdFJlbGF0aW9uKSB7Ci0JCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IChBYnN0cmFjdFJlbGF0aW9uKSBvOwotCQkJYXR0cmliVG9SZWwucmVtb3ZlKHByb2R1Y2VPd25lcktleUZvclJlbChyZWwpKTsKLQkJCWlmIChyZWwgaW5zdGFuY2VvZiBCaWRpcmVjdGlvbmFsUmVsYXRpb24pIAotCQkJCWF0dHJpYlRvUmVsLnJlbW92ZShwcm9kdWNlSW52ZXJzZUtleUZvclJlbChyZWwpKTsKLQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIHsKLQkJCXJlbW92ZUxpc3RlbmVyc0Zyb21BdHRyaWJ1dGUoKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKW8pOwotCQl9Ci0JCXJldHVybiBvOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCXJldHVybiB1dGlsLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVN0cmluZyBrZXkgPSBwcm9kdWNlS2V5Rm9yUmVsKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLCBqcGEuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGF0dHJpYlRvUmVsLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCi0JcHVibGljIElSZWxhdGlvbiBnZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJU3RyaW5nIGtleSA9IHByb2R1Y2VLZXlGb3JSZWwoKEphdmFQZXJzaXN0ZW50VHlwZSlqcGEuZ2V0UGFyZW50KCksIGpwYS5nZXROYW1lKCkpOwotCQlyZXR1cm4gYXR0cmliVG9SZWwuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIFNldDxJUmVsYXRpb24+IGdldFJlbGF0aW9uc1JlbGF0ZWRUb0VudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUhhc2hTZXQ8SVJlbGF0aW9uPiByZXMgPSBuZXcgSGFzaFNldDxJUmVsYXRpb24+KCk7Ci0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgOiBqcHQuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gZ2V0UmVsYXRpb25SZWxhdGVkVG9BdHRyaWJ1dGUoYXQpOwotCQkJaWYgKHJlbCAhPSBudWxsKQotCQkJCXJlcy5hZGQocmVsKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1JlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MikgewotCQlTZXQ8SVJlbGF0aW9uPiByZWxzID0gZ2V0UmVsYXRpb25zUmVsYXRlZFRvRW50aXR5KGpwdDEpOwotCQlpZiAoZXhpc3RzUmVsYXRpb24oanB0MSwganB0MiwgcmVscykpCi0JCQlyZXR1cm4gdHJ1ZTsJCQotCQlyZWxzID0gZ2V0UmVsYXRpb25zUmVsYXRlZFRvRW50aXR5KGpwdDIpOwotCQlyZXR1cm4gZXhpc3RzUmVsYXRpb24oanB0MSwganB0MiwgcmVscyk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGV4aXN0c1JlbGF0aW9uKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCAKLQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIsCi0JCQkJCQkJCQkgIFNldDxJUmVsYXRpb24+IHJlbHMpIHsKLQkJSXRlcmF0b3I8SVJlbGF0aW9uPiBpdCA9IHJlbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSVJlbGF0aW9uIHJlbCA9IGl0Lm5leHQoKTsKLQkJCWlmICgoanB0MS5lcXVhbHMocmVsLmdldE93bmVyKCkpICYmIGpwdDIuZXF1YWxzKHJlbC5nZXRJbnZlcnNlKCkpKSB8fAotCQkJCSgoanB0Mi5lcXVhbHMocmVsLmdldE93bmVyKCkpICYmIGpwdDEuZXF1YWxzKHJlbC5nZXRJbnZlcnNlKCkpKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbjxPYmplY3Q+IGdldFZpc3VhbGl6ZWRPYmplY3RzKCkgewotCQlyZXR1cm4ga2V5VG9CTy52YWx1ZXMoKTsKLQl9CQotCQotCXB1YmxpYyB2b2lkIHJlbmV3QXR0cmlidXRlTWFwcGluZ1Byb3BMaXN0ZW5lcihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmVuZXdBdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lQcm9wZXJ0eUxpc3RlbmVyKGpwYSk7Ci0JCXJlbmV3QXR0cmlidXRlTWFwcGluZ09wdFByb3BMaXN0ZW5lcihqcGEpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW5ld0F0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5TGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IHJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQlpZiAocmVmICE9IG51bGwpCi0JCQlsc24gPSByZWYuZ2V0KCk7Ci0JCQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQlyZXR1cm47Ci0JCVJlbGF0aW9uc2hpcCByciA9ICgoUmVsYXRpb25zaGlwTWFwcGluZykgamFtKS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJaWYgKHJyID09IG51bGwpCi0JCQlyZXR1cm47CQkJCi0JCVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpzID0gcnIuZ2V0U3RyYXRlZ3koKTsKLQkJaWYgKChqcyA9PSBudWxsKSB8fCAhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5jbGFzcy5pc0luc3RhbmNlKGpzKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJanMucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIGxzbik7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyROT04tTkxTLTEkCi0JCX0KLQkJbHNuID0gbmV3IEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJanMuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5Lk1BUFBFRF9CWV9BVFRSSUJVVEVfUFJPUEVSVFksIGxzbik7Ci0JCXJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+KGxzbik7Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIHJlZik7Ci0JCQotCX0KLQkKLQlwdWJsaWMgdm9pZCByZW5ld0F0dHJpYnV0ZU1hcHBpbmdPcHRQcm9wTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IG51bGw7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+IHJlZiA9IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQlpZiAocmVmICE9IG51bGwpCi0JCQlsc24gPSByZWYuZ2V0KCk7CQotCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQlpZiAoamFtID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghTWFueVRvT25lTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkgJiYgIU9uZVRvT25lTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQlyZXR1cm47Ci0JCQotCQl0cnkgewotCQlpZiAobHNuICE9IG51bGwpIAotCQkJamFtLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uYWxNYXBwaW5nLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgbHNuKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vJE5PTi1OTFMtMSQKLQkJfQotCQlsc24gPSBuZXcgQXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJamFtLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoT3B0aW9uYWxNYXBwaW5nLlNQRUNJRklFRF9PUFRJT05BTF9QUk9QRVJUWSwgbHNuKTsKLQkJcmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+KGxzbik7Ci0JCWF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIHJlZik7Ci0JfQotCQotCi0JcHJpdmF0ZSB2b2lkIGFkZExpc3RlbmVyc1RvUHJvamVjdChKcGFQcm9qZWN0IHByb2opIHsKLQkJYWRkRW50aXRpZXNMaXN0ZW5lclRvUHJvamVjdChwcm9qKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRW50aXRpZXNMaXN0ZW5lclRvUHJvamVjdChKcGFQcm9qZWN0IHByb2opIHsKLQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBwcm9qZWN0VG9FbnRpdHlMaXN0ZW5lci5nZXQocHJvaik7Ci0JCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQkvKgotCQkJaWYgKCFwcm9qLmdldFVwZGF0ZXIoKS5nZXRDbGFzcygpLmlzSW5zdGFuY2UoU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlci5jbGFzcykpCi0JCQkJcHJvai5zZXRVcGRhdGVyKG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKHByb2opKTsKLQkJCSovCi0JCQlsc25yID0gbmV3IEpQQVByb2plY3RMaXN0ZW5lcigpOwotCQkJcHJvai5hZGRDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoSnBhUHJvamVjdC5KUEFfRklMRVNfQ09MTEVDVElPTiwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Q29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCXByb2plY3RUb0VudGl0eUxpc3RlbmVyLnB1dChwcm9qLCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRMaXN0ZW5lcnNUb0VudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWFkZEF0TGlzdGVuZXJUb0VudGl0eShqcHQpOwotCQlhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb0VudGl0eShqcHQpOwotCQlhZGRTdGF0ZUxpc3RlbmVyVG9FbnRpdHkoanB0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXRMaXN0ZW5lclRvRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBlbnRpdHlUb0F0TGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCUxpc3RDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VMaXN0ZW5lcigpOwotCQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxMaXN0Q2hhbmdlTGlzdGVuZXI+KGxzbnIpOwotCQkJZW50aXR5VG9BdExpc3RlbmVyLnB1dChqcHQsIGxzbnJSZWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gZW50aXR5VG9Qcm9wTGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBFbnRpdHlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlqcHQuZ2V0TWFwcGluZygpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQllbnRpdHlUb1Byb3BMaXN0ZW5lci5wdXQoanB0LCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJYWRkUHJvcGVydGllc0xpc3RlbmVyVG9BdHRyaWJ1dGVJdHNlbGYoanBhKTsKLQkJYWRkUHJvcGVydGllc0xpc3RlbmVyVG9Kb2luaW5nU3RyYXRlZ3koanBhKTsJCQotCQlhZGRQcm9wZXJ0aWVzTGlzdGVuZXJUb1JlbGF0aW9uc2hpcFJlZmVyZW5jZShqcGEpOwotCQlhZGRPcHRQcm9wTGlzdGVuZXJUb0F0dHJpYnV0ZU1hcHBpbmcoanBhKTsJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvQXR0cmlidXRlSXRzZWxmKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJQXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCWpwYS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSwgbHNucik7Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQkJCQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdFByb3BMaXN0ZW5lclRvQXR0cmlidXRlTWFwcGluZyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJaWYgKGphbSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWlmICghSmF2YU1hbnlUb09uZU1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pICYmCi0JCQkJCSFKYXZhT25lVG9PbmVNYXBwaW5nLmNsYXNzLmlzSW5zdGFuY2UoamFtKSkKLQkJCQlyZXR1cm47Ci0JCQlqYW0uYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihPcHRpb25hbE1hcHBpbmcuU1BFQ0lGSUVEX09QVElPTkFMX1BST1BFUlRZLCBsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQotCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgYWRkUHJvcGVydGllc0xpc3RlbmVyVG9Kb2luaW5nU3RyYXRlZ3koSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCQotCQlXZWFrUmVmZXJlbmNlPEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJbHNuclJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciA9PSBudWxsKSB7Ci0JCQlsc25yID0gbmV3IEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoKTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJcmV0dXJuOwotCQkJUmVsYXRpb25zaGlwIHJyID0gKChSZWxhdGlvbnNoaXBNYXBwaW5nKSBqYW0pLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJaWYgKHJyID09IG51bGwpCi0JCQkJcmV0dXJuOwkJCQotCQkJUmVsYXRpb25zaGlwU3RyYXRlZ3kganMgPSByci5nZXRTdHJhdGVneSgpOwotCQkJaWYgKChqcyA9PSBudWxsKSB8fCAhTWFwcGVkQnlSZWxhdGlvbnNoaXBTdHJhdGVneS5jbGFzcy5pc0luc3RhbmNlKGpzKSkKLQkJCQlyZXR1cm47Ci0JCQlsc25yUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4obHNucik7Ci0JCQlhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5wdXQoanBhLCBsc25yUmVmKTsKLQkJfQotCQkKLQl9Ci0JCi0JCi0JcHJpdmF0ZSB2b2lkIGFkZFByb3BlcnRpZXNMaXN0ZW5lclRvUmVsYXRpb25zaGlwUmVmZXJlbmNlKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQkKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCUF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWxzbnJSZWYgPSBhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJaWYgKChqYW0gPT0gbnVsbCkgfHwgIVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pKQotCQkJCXJldHVybjsKLQkJCVJlbGF0aW9uc2hpcCByciA9ICgoUmVsYXRpb25zaGlwTWFwcGluZykgamFtKS5nZXRSZWxhdGlvbnNoaXAoKTsKLQkJCWlmIChyciA9PSBudWxsKQotCQkJCXJldHVybjsJCQotCQkJcnIuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihSZWFkT25seVJlbGF0aW9uc2hpcC5TVFJBVEVHWV9QUk9QRVJUWSwgbHNucik7Ci0JCQlyci5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIG5ldyBBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcigpKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCWF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyLnB1dChqcGEsIGxzbnJSZWYpOwotCQl9Ci0JCQotCX0KLQkKLQotCQotCXByaXZhdGUgdm9pZCBhZGRTdGF0ZUxpc3RlbmVyVG9FbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlXZWFrUmVmZXJlbmNlPFN0YXRlQ2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBlbnRpdHlUb1N0YXRlTGlzdGVuZXIuZ2V0KGpwdCk7Ci0JCVN0YXRlQ2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgPT0gbnVsbCkgewotCQkJbHNuciA9IG5ldyBFbnRpdHlTdGF0ZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCQlqcHQuYWRkU3RhdGVDaGFuZ2VMaXN0ZW5lcihsc25yKTsKLQkJCWxzbnJSZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPihsc25yKTsKLQkJCWVudGl0eVRvU3RhdGVMaXN0ZW5lci5wdXQoanB0LCBsc25yUmVmKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVMaXN0ZW5lcnNGcm9tRW50aXR5KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmVtb3ZlQXRMaXN0ZW5lckZyb21FbnRpdHkoanB0KTsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUVudGl0eShqcHQpOwotCQlyZW1vdmVTdGF0ZUxpc3RlbmVyRnJvbUVudGl0eShqcHQpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlTGlzdGVuZXJzRnJvbUF0dHJpYnV0ZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZShqcGEpOwotCX0JCi0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXRMaXN0ZW5lckZyb21FbnRpdHkoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlXZWFrUmVmZXJlbmNlPExpc3RDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvQXRMaXN0ZW5lci5nZXQoanB0KTsKLQkJTGlzdENoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWVudGl0eVRvQXRMaXN0ZW5lci5yZW1vdmUoanB0KTsKLQkJCWpwdC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7CQkJCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVdlYWtSZWZlcmVuY2U8UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvUHJvcExpc3RlbmVyLmdldChqcHQpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWVudGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcHQpOwotCQkJdHJ5IHsKLQkJCQlqcHQuZ2V0TWFwcGluZygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNucik7CQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCXJlbW92ZVByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGVJdHNlbGYoanBhKTsKLQkJcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUpvaW5pbmdTdHJhdGVneShqcGEpOwotCQlyZW1vdmVQcm9wTGlzdGVuZXJGcm9tUmVsYXRpb25zaGlwUmVmZXJlbmNlKGpwYSk7Ci0JCXJlbW92ZU9wdFByb3BMaXN0ZW5lckZyb21BdHRyaWJ1dGVNYXBwaW5nKGpwYSk7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZUl0c2VsZihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlVG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQl0cnkgewotCQkJCWpwYS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFBlcnNpc3RlbnRBdHRyaWJ1dGUuTUFQUElOR19QUk9QRVJUWSwgbHNucik7CQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQotCX0JCi0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVByb3BMaXN0ZW5lckZyb21Kb2luaW5nU3RyYXRlZ3koSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbnIgPSBudWxsOwkJCi0JCWxzbnJSZWYgPSBhdHRyaWJ1dGVKb2luaW5nU3RyYXRlZ3lUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJbHNuciA9IG51bGw7Ci0JCWlmIChsc25yUmVmICE9IG51bGwpCi0JCQlsc25yID0gbHNuclJlZi5nZXQoKTsKLQkJaWYgKGxzbnIgIT0gbnVsbCkgewotCQkJYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQl0cnkgewkJCQotCQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQkJaWYgKChqYW0gPT0gbnVsbCkgfHwgIVJlbGF0aW9uc2hpcE1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShqYW0pKQotCQkJCQlyZXR1cm47Ci0JCQkJUmVsYXRpb25zaGlwIHJyID0gKChSZWxhdGlvbnNoaXBNYXBwaW5nKSBqYW0pLmdldFJlbGF0aW9uc2hpcCgpOwotCQkJCWlmIChyciA9PSBudWxsKQotCQkJCQlyZXR1cm47CQkJCi0JCQkJUmVsYXRpb25zaGlwU3RyYXRlZ3kganMgPSByci5nZXRTdHJhdGVneSgpOwotCQkJCWlmICgoanMgPT0gbnVsbCkgfHwgIU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuY2xhc3MuaXNJbnN0YW5jZShqcykpCi0JCQkJCXJldHVybjsKLQkJCQlqcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgbHNucik7CQkJCQkJCQotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQkJCi0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlT3B0UHJvcExpc3RlbmVyRnJvbUF0dHJpYnV0ZU1hcHBpbmcoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5Q2hhbmdlTGlzdGVuZXI+IGxzbnJSZWYgPSBhdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5nZXQoanBhKTsKLQkJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsJCQotCQlsc25yUmVmID0gYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCWxzbnIgPSBudWxsOwotCQlpZiAobHNuclJlZiAhPSBudWxsKQotCQkJbHNuciA9IGxzbnJSZWYuZ2V0KCk7Ci0JCWlmIChsc25yICE9IG51bGwpIHsKLQkJCWF0dHJpYnV0ZU1hcHBpbmdPcHRpb25hbGl0eVRvUHJvcExpc3RlbmVyLnJlbW92ZShqcGEpOwotCQkJdHJ5IHsJCQkKLQkJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBqYW0gPSBqcGEuZ2V0TWFwcGluZygpOwotCQkJCWlmICgoamFtID09IG51bGwpIHx8ICFSZWxhdGlvbnNoaXBNYXBwaW5nLmNsYXNzLmlzSW5zdGFuY2UoamFtKSkKLQkJCQkJcmV0dXJuOwotCQkJCWphbS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIGxzbnIpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyROT04tTkxTLTEkCi0JCQl9CQkKLQkJfQkJCi0JfQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvcExpc3RlbmVyRnJvbVJlbGF0aW9uc2hpcFJlZmVyZW5jZShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiBsc25yUmVmID0gYXR0cmlidXRlUmVsYXRpb25zaGlwUmVmZXJlbmNlVG9Qcm9wTGlzdGVuZXIuZ2V0KGpwYSk7Ci0JCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuciA9IG51bGw7CQkKLQkJbHNuclJlZiA9IGF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVRvUHJvcExpc3RlbmVyLmdldChqcGEpOwotCQlsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciAhPSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanBhKTsKLQkJCXRyeSB7CQkJCi0JCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgamFtID0ganBhLmdldE1hcHBpbmcoKTsKLQkJCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJCXJldHVybjsKLQkJCQlSZWxhdGlvbnNoaXAgcnIgPSAoKFJlbGF0aW9uc2hpcE1hcHBpbmcpIGphbSkuZ2V0UmVsYXRpb25zaGlwKCk7Ci0JCQkJaWYgKHJyID09IG51bGwpCi0JCQkJCXJldHVybjsJCQkKLQkJCQlyci5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKFJlYWRPbmx5UmVsYXRpb25zaGlwLlNUUkFURUdZX1BST1BFUlRZLCBsc25yKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8kTk9OLU5MUy0xJAotCQkJfQkJCi0JCX0JCQkJCi0JfQotCQkKLQotCXByaXZhdGUgdm9pZCByZW1vdmVTdGF0ZUxpc3RlbmVyRnJvbUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVdlYWtSZWZlcmVuY2U8U3RhdGVDaGFuZ2VMaXN0ZW5lcj4gbHNuclJlZiA9IGVudGl0eVRvU3RhdGVMaXN0ZW5lci5nZXQoanB0KTsKLQkJU3RhdGVDaGFuZ2VMaXN0ZW5lciBsc25yID0gbnVsbDsKLQkJaWYgKGxzbnJSZWYgIT0gbnVsbCkKLQkJCWxzbnIgPSBsc25yUmVmLmdldCgpOwotCQlpZiAobHNuciAhPSBudWxsKSB7Ci0JCQllbnRpdHlUb1N0YXRlTGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlqcHQucmVtb3ZlU3RhdGVDaGFuZ2VMaXN0ZW5lcihsc25yKTsJCQkKLQkJfQotCX0KLQotCS8vLS0tLS0tLS0tLS0tLS0tCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVN0YXRlQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudFR5cGU+IGl0ID0gZW50aXR5VG9TdGF0ZUxpc3RlbmVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVNldDxKYXZhUGVyc2lzdGVudFR5cGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudFR5cGU+KCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgCi0JCQlzLmFkZChpdC5uZXh0KCkpOwotCQlpdCA9IHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxTdGF0ZUNoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb1N0YXRlTGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlTdGF0ZUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJanB0LnJlbW92ZVN0YXRlQ2hhbmdlTGlzdGVuZXIobHNuKTsKLQkJfQotCQllbnRpdHlUb1N0YXRlTGlzdGVuZXIuY2xlYXIoKTsKLQkJZW50aXR5VG9TdGF0ZUxpc3RlbmVyID0gbnVsbDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUVudGl0eVByb3BDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gaXQgPSBlbnRpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPiBzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPigpOwotCQl3aGlsZShpdC5oYXNOZXh0KCkpIAotCQkJcy5hZGQoaXQubmV4dCgpKTsKLQkJaXQgPSBzLml0ZXJhdG9yKCk7CQkKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanB0KTsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQlqcHQuZ2V0TWFwcGluZygpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoUGVyc2lzdGVudFR5cGUuTkFNRV9QUk9QRVJUWSwgbHNuKTsKLQkJfQotCQllbnRpdHlUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQllbnRpdHlUb1Byb3BMaXN0ZW5lciA9IG51bGw7Ci0JfQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVBdHRyaWJ1dGVQcm9wQ2hhbmdlTGlzdGVuZXJzKCkgewotCQlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyPiByZWYgPSBhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5yZW1vdmUoanBhKTsKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQl0cnkgewotCQkJCQlqcGEucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihQZXJzaXN0ZW50QXR0cmlidXRlLk1BUFBJTkdfUFJPUEVSVFksIGxzbik7Ci0JCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJfQotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQlhdHRyaWJ1dGVUb1Byb3BMaXN0ZW5lciA9IG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcENoYW5nZUxpc3RlbmVycygpIHsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBzID0gbmV3IEhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgCi0JCQlzLmFkZChpdC5uZXh0KCkpOwotCQlpdCA9IHMuaXRlcmF0b3IoKTsJCQotCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGl0Lm5leHQoKTsKLQkJCVdlYWtSZWZlcmVuY2U8QXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcj4gcmVmID0gYXR0cmlidXRlSm9pbmluZ1N0cmF0ZWd5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gIT0gbnVsbCkgCi0JCQkJdHJ5IHsKLQkJCQkJanBhLmdldE1hcHBpbmcoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuTUFQUEVEX0JZX0FUVFJJQlVURV9QUk9QRVJUWSwgbHNuKTsKLQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQl9Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyLmNsZWFyKCk7Ci0JCWF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVRvUHJvcExpc3RlbmVyID0gbnVsbDsKLQl9CQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlT3B0UHJvcExpc3RlbmVycygpIHsKLQkJSXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gdGhpcy5hdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlUb1Byb3BMaXN0ZW5lci5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lcj4gcmVmID0gYXR0cmlidXRlTWFwcGluZ09wdGlvbmFsaXR5VG9Qcm9wTGlzdGVuZXIucmVtb3ZlKGpwYSk7Ci0JCQlpZiAocmVmID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxzbiA9IHJlZi5nZXQoKTsKLQkJCWlmIChsc24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGpwYS5nZXRNYXBwaW5nKCk7Ci0JCQlpZiAoKGphbSA9PSBudWxsKSB8fCAhUmVsYXRpb25zaGlwTWFwcGluZy5jbGFzcy5pc0luc3RhbmNlKGphbSkpCi0JCQkJY29udGludWU7CQkJCi0JCQl0cnkgewotCQkJCWphbS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKE9wdGlvbmFsTWFwcGluZy5TUEVDSUZJRURfT1BUSU9OQUxfUFJPUEVSVFksIGxzbik7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lci5jbGVhcigpOwotCQlhdHRyaWJ1dGVSZWxhdGlvbnNoaXBSZWZlcmVuY2VUb1Byb3BMaXN0ZW5lciA9IG51bGw7CQkKLQl9CQotCQotCXByaXZhdGUgdm9pZCByZW1vdmVFbnRpdHlBdHRyaWJ1dGVDaGFuZ2VMaXN0ZW5lcnMoKSB7Ci0JCUl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50VHlwZT4gaXQgPSBlbnRpdHlUb0F0TGlzdGVuZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4gcyA9IG5ldyBIYXNoU2V0PEphdmFQZXJzaXN0ZW50VHlwZT4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IGl0Lm5leHQoKTsKLQkJCVdlYWtSZWZlcmVuY2U8TGlzdENoYW5nZUxpc3RlbmVyPiByZWYgPSBlbnRpdHlUb0F0TGlzdGVuZXIucmVtb3ZlKGpwdCk7Ci0JCQlMaXN0Q2hhbmdlTGlzdGVuZXIgbHNuID0gcmVmLmdldCgpOwotCQkJaWYgKGxzbiAhPSBudWxsKSAKLQkJCQlqcHQucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbik7Ci0JCX0KLQkJZW50aXR5VG9BdExpc3RlbmVyLmNsZWFyKCk7Ci0JCWVudGl0eVRvQXRMaXN0ZW5lciA9IG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlUHJvamVjdExpc3RlbmVycygpIHsJCQotCQlJdGVyYXRvcjxKcGFQcm9qZWN0PiBpdCA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVNldDxKcGFQcm9qZWN0PiBzID0gbmV3IEhhc2hTZXQ8SnBhUHJvamVjdD4oKTsKLQkJd2hpbGUoaXQuaGFzTmV4dCgpKSAKLQkJCXMuYWRkKGl0Lm5leHQoKSk7Ci0JCWl0ID0gcy5pdGVyYXRvcigpOwkJCi0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJSnBhUHJvamVjdCBwcm9qZWN0ID0gaXQubmV4dCgpOwotCQkJV2Vha1JlZmVyZW5jZTxDb2xsZWN0aW9uQ2hhbmdlTGlzdGVuZXI+IHJlZiA9IHByb2plY3RUb0VudGl0eUxpc3RlbmVyLnJlbW92ZShwcm9qZWN0KTsKLQkJCUNvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBsc24gPSByZWYuZ2V0KCk7Ci0JCQlpZiAobHNuICE9IG51bGwpIAotCQkJCXByb2plY3QucmVtb3ZlQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKEpwYVByb2plY3QuSlBBX0ZJTEVTX0NPTExFQ1RJT04sIGxzbik7Ci0JCX0KLQkJcHJvamVjdFRvRW50aXR5TGlzdGVuZXIuY2xlYXIoKTsKLQkJcHJvamVjdFRvRW50aXR5TGlzdGVuZXIgPSBudWxsOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsTGlzdGVuZXJzKCkgewotCQlyZW1vdmVPcHRQcm9wTGlzdGVuZXJzKCk7Ci0JCXJlbW92ZUF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlQXR0cmlidXRlUHJvcENoYW5nZUxpc3RlbmVycygpOwotCQlyZW1vdmVFbnRpdHlTdGF0ZUNoYW5nZUxpc3RlbmVycygpOwkKLQkJcmVtb3ZlRW50aXR5UHJvcENoYW5nZUxpc3RlbmVycygpOwotCQlyZW1vdmVFbnRpdHlBdHRyaWJ1dGVDaGFuZ2VMaXN0ZW5lcnMoKTsKLQkJcmVtb3ZlUHJvamVjdExpc3RlbmVycygpOwotCQllY2xpcHNlRmFjYWRlLmdldFdvcmtzcGFjZSgpLnJlbW92ZVJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUl0ZXJhdG9yPE9iamVjdD4gaXQgPSBrZXlUb0JPLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBibyA9IGl0Lm5leHQoKTsKLQkJCWlmICghSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzLmlzSW5zdGFuY2UoYm8pKQotCQkJCWNvbnRpbnVlOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KCgoSmF2YVBlcnNpc3RlbnRUeXBlKWJvKSk7Ci0JCQl1dGlsLmRpc2NhcmRXb3JraW5nQ29weU9uY2UoY3UpOwotCQl9Ci0JCQotCQl1dGlsID0gbnVsbDsKLQkJa2V5VG9CTy5jbGVhcigpOwotCQlhdHRyaWJUb1JlbC5jbGVhcigpOwotCQlrZXlUb0JPID0gbnVsbDsKLQkJYXR0cmliVG9SZWwgPSBudWxsOwkKLQkJcmVtb3ZlQWxsTGlzdGVuZXJzKCk7Ci0JCWZlYXR1cmVQcm92aWRlciA9IG51bGw7Ci0JCXN5bmNocm9uaXplZCAoSlBBU29sdmVyLmNsYXNzKSB7Ci0JCQlzb2x2ZXJzU2V0LnJlbW92ZSh0aGlzKTsKLQkJCWlmIChzb2x2ZXJzU2V0LmlzRW1wdHkoKSkgewotCQkJCUphdmFDb3JlLnJlbW92ZUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIod2Nsc25yKTsKLQkJCQl3Y2xzbnIgPSBudWxsOwotCQkJfQotCQl9Ci0JfQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBrZXlUb0JPLmNvbnRhaW5zS2V5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRoaXMuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCUpQQUVkaXRvclV0aWwuZGlzY2FyZFdvcmtpbmdDb3B5T25jZShjdSk7Ci0JCUpQQUVkaXRvclV0aWwuYmVjb21lV29ya2luZ0NvcHkoY3UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpZ25vcmVFdmVudHMgPSBmYWxzZTsgCi0JCi0JcHVibGljIHN0YXRpYyBjbGFzcyBXb3JraW5nQ29weUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgIGVsZW1lbnRDaGFuZ2VkKEVsZW1lbnRDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCU9iamVjdCBvID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoIUlKYXZhRWxlbWVudERlbHRhLmNsYXNzLmlzSW5zdGFuY2UobykpCi0JCQkJcmV0dXJuOwotCi0JCQlJSmF2YUVsZW1lbnREZWx0YSBqZWQgPSAoSUphdmFFbGVtZW50RGVsdGEpbzsKLQkJCVNldDxJQ29tcGlsYXRpb25Vbml0PiBhZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMgPSBnZXRBZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMoamVkKTsKLQkJCQotCQkJZm9yIChJQ29tcGlsYXRpb25Vbml0IGN1IDogYWZmZWN0ZWRDb21waWxhdGlvblVuaXRzKSB7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpQQUVkaXRvclV0aWwuZ2V0SlBUeXBlKGN1KTsKLQkJCQlmb3IgKEpQQVNvbHZlciBzb2x2ZXIgOiBzb2x2ZXJzU2V0KSB7Ci0JCQkJCWZpbmFsIENvbnRhaW5lclNoYXBlIGNzID0gKENvbnRhaW5lclNoYXBlKXNvbHZlci5mZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCQkJCWlmIChjcyA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQlTdHJpbmcgZW50TmFtZSA9IEpQQUVkaXRvclV0aWwuZ2V0VGV4dChqcHQpOwotCQkJCQl0cnkgewotCQkJCQkJZmluYWwgU3RyaW5nIG5ld0hlYWRlciA9IChjdS5oYXNVbnNhdmVkQ2hhbmdlcygpID8gIiogIiA6ICIiKSArIGVudE5hbWU7CS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCUdyYXBoaWNzVXBkYXRlci51cGRhdGVIZWFkZXIoY3MsIG5ld0hlYWRlcik7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCQkJCQkJCi0JCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgY2hlY2sgY29tcGlsYXRpb24gdW5pdCBmb3IgdW5zYXZlZCBjaGFuZ2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJIAotCQkJCQl9CQotCQkJCX0KLQkJCQkKLQkJCX0JCQkKLQkJfQotCQkKLQkJcHJpdmF0ZSBTZXQ8SUNvbXBpbGF0aW9uVW5pdD4gZ2V0QWZmZWN0ZWRDb21waWxhdGlvblVuaXRzKElKYXZhRWxlbWVudERlbHRhIGRlbHRhKSB7IAotCQkJU2V0PElDb21waWxhdGlvblVuaXQ+IHJlcyA9IG5ldyBIYXNoU2V0PElDb21waWxhdGlvblVuaXQ+KCk7Ci0JCQlJSmF2YUVsZW1lbnQgZWwgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoSUNvbXBpbGF0aW9uVW5pdC5jbGFzcy5pc0luc3RhbmNlKGVsKSkKLQkJCQlyZXMuYWRkKChJQ29tcGlsYXRpb25Vbml0KWVsKTsKLQkJCUlKYXZhRWxlbWVudERlbHRhW10gY2hpbGRyZW4gPSBkZWx0YS5nZXRDaGFuZ2VkQ2hpbGRyZW4oKTsKLQkJCWZvciAoSUphdmFFbGVtZW50RGVsdGEgY2hpbGQgOiBjaGlsZHJlbikgewotCQkJCVNldDxJQ29tcGlsYXRpb25Vbml0PiBjdXMgPSBnZXRBZmZlY3RlZENvbXBpbGF0aW9uVW5pdHMoY2hpbGQpOwotCQkJCXJlcy5hZGRBbGwoY3VzKTsKLQkJCX0KLQkJCXJldHVybiByZXM7Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGNsYXNzIEpQQVByb2plY3RMaXN0ZW5lciBpbXBsZW1lbnRzIENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lciB7CQkJCQotCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoQ29sbGVjdGlvblJlbW92ZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoaWdub3JlRXZlbnRzKQotCQkJCXJldHVybjsKLQotCQkJSXRlcmF0b3I8Pz4gaXQgPSBldmVudC5nZXRJdGVtcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCEobyBpbnN0YW5jZW9mIEpwYUZpbGUpKQotCQkJCQljb250aW51ZTsKLQkJCQlmaW5hbCBKcGFGaWxlIGpwYUZpbGUgPSAoSnBhRmlsZSlvOwotCQkJCUpwdFJlc291cmNlTW9kZWwganJtID0gKChKcGFGaWxlKW8pLmdldFJlc291cmNlTW9kZWwoKTsKLQkJCQlpZiAoIUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5jbGFzcy5pc0luc3RhbmNlKGpybSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdClqcm07Ci0JCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGpyYXQgPSBqcmN1LmdldFByaW1hcnlUeXBlKCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSBqcmF0LmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCQkKLQkJCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBqcGFGaWxlLmdldEpwYVByb2plY3QoKTsKLQkJCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCQkJaWYocHUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JCQkJZmluYWwgQ29udGFpbmVyU2hhcGUgY3MgPSAoQ29udGFpbmVyU2hhcGUpZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQkJCWlmIChjcyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJZmluYWwgUmVtb3ZlQ29udGV4dCBjdHggPSBuZXcgUmVtb3ZlQ29udGV4dChjcyk7Ci0JCQkJZmluYWwgSVJlbW92ZUZlYXR1cmUgZnQgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UmVtb3ZlRmVhdHVyZShjdHgpOzsKLQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiB0ZWQgPSBUcmFuc2FjdGlvblV0aWwuZ2V0RWRpdGluZ0RvbWFpbihjcyk7Ci0JCQkJCQl0ZWQuZ2V0Q29tbWFuZFN0YWNrKCkuZXhlY3V0ZShuZXcgUmVjb3JkaW5nQ29tbWFuZCh0ZWQpIHsKLQkJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCQlwcm90ZWN0ZWQgdm9pZCBkb0V4ZWN1dGUoKSB7Ci0JCQkJCQkJCWZ0LnJlbW92ZShjdHgpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhyKTsKLQkJCX0JCQkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbGxlY3Rpb25DbGVhcmVkKENvbGxlY3Rpb25DbGVhckV2ZW50IGFyZzApIHt9Ci0KLQkJcHVibGljIHZvaWQgY29sbGVjdGlvbkNoYW5nZWQoQ29sbGVjdGlvbkNoYW5nZUV2ZW50IGV2ZW50KSB7fQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoQ29sbGVjdGlvbkFkZEV2ZW50IGV2ZW50KSB7fQotCX07Ci0KLQlwdWJsaWMgY2xhc3MgRW50aXR5U3RhdGVDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFN0YXRlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZWQoU3RhdGVDaGFuZ2VFdmVudCBldmVudCkgewotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCQotCQlwdWJsaWMgdm9pZCBpdGVtc0FkZGVkKExpc3RBZGRFdmVudCBldmVudCkgewotCQkJQWRkRW50aXR5QXR0cmlidXRlcyB0YXNrID0gbmV3IEFkZEVudGl0eUF0dHJpYnV0ZXMoZXZlbnQpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHRhc2spOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJUmVtb3ZlRW50aXR5QXR0cmlidXRlcyB0YXNrID0gbmV3IFJlbW92ZUVudGl0eUF0dHJpYnV0ZXMoZXZlbnQpOwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHRhc2spOwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHt9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNNb3ZlZChMaXN0TW92ZUV2ZW50IGFyZzApIHt9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGFyZzApIHt9Ci0KLQkJcHVibGljIHZvaWQgbGlzdENsZWFyZWQoTGlzdENsZWFyRXZlbnQgYXJnMCkge30KLQl9OwotCi0JcHVibGljIGNsYXNzIEVudGl0eVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWUgPSBldmVudC5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJCWlmIChwcm9wTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLlBST1BfU1BFQ0lGSUVEX05BTUUpKSB7CQotCQkJCWZpbmFsIEphdmFFbnRpdHkgamUgPSAoSmF2YUVudGl0eSlldmVudC5nZXRTb3VyY2UoKTsKLQkJCQlSdW5uYWJsZSBqb2IgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCVRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluIHRlZCA9IGZlYXR1cmVQcm92aWRlci5nZXRUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbigpOwotCQkJCQkJdGVkLmdldENvbW1hbmRTdGFjaygpLmV4ZWN1dGUobmV3IFJlY29yZGluZ0NvbW1hbmQodGVkKSB7Ci0JCQkJCQkJQE92ZXJyaWRlCi0JCQkJCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gamUuZ2V0UGVyc2lzdGVudFR5cGUoKTsgCi0JCQkJCQkJCXVwZGF0ZUpQVE5hbWUoanB0KTsKLQkJCQkJCQkgICAgU3RyaW5nIHRhYmxlTmFtZSA9IEpQQUVkaXRvclV0aWwuZm9ybVRhYmxlTmFtZShqcHQpOwotCQkJCQkJCSAgICBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5zZXRUYWJsZU5hbWUoanB0LCB0YWJsZU5hbWUpOwotCQkJCQkJCX0JCQkJCQkKLQkJCQkJCX0pOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlEaXNwbGF5LmdldERlZmF1bHQoKS5zeW5jRXhlYyhqb2IpOwotCQkJfQotCQl9Ci0JfQotCQotCXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMKLQkJCVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQotCQkJTW9kZWwgc291cmNlID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoIUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzLmlzSW5zdGFuY2Uoc291cmNlKSkKLQkJCQlyZXR1cm47Ci0JCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gZmVhdHVyZVByb3ZpZGVyCi0JCQkJCS5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgc291cmNlKQotCQkJCQkJCS5nZXRQYXJlbnQoKSk7CQkJCi0JCQlmaW5hbCBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIGZ0ID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoCi0JCQkJCWZlYXR1cmVQcm92aWRlcik7Ci0JCQlmaW5hbCBDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQljdHguc2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlmdC5leGVjdXRlKGN0eCk7CQkJCQkKLQkJCQl9Ci0JCQl9OwotCQkJRGlzcGxheS5nZXREZWZhdWx0KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLQkJCVN0cmluZyBwcm9wTmFtZSA9IGV2ZW50LmdldFByb3BlcnR5TmFtZSgpOwotCQkJaWYgKHByb3BOYW1lLmVxdWFscyhQZXJzaXN0ZW50QXR0cmlidXRlLk1BUFBJTkdfUFJPUEVSVFkpKSB7Ci0JCQkJcmVuZXdBdHRyaWJ1dGVNYXBwaW5nUHJvcExpc3RlbmVyKChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgc291cmNlKTsKLQkJCX0KLQkJfQotCX0JCi0KLQkvKiAKLQkgKiBUaGlzIGxpc3RlbmVyIGxpc3RlbnMgd2hlbiBtYXBwZWRCeSBoYXMgYmVlbiBjaGFuZ2VkCi0JICovCi0JcHVibGljIGNsYXNzIEF0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCi0JCQlNb2RlbCBtID0gZXZlbnQuZ2V0U291cmNlKCk7Ci0JCQlpZiAoIU1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kuY2xhc3MuaXNJbnN0YW5jZShtKSkKLQkJCQlyZXR1cm47Ci0JCQlNYXBwZWRCeVJlbGF0aW9uc2hpcFN0cmF0ZWd5IGpzID0gKE1hcHBlZEJ5UmVsYXRpb25zaGlwU3RyYXRlZ3kpbTsKLQkJCUpwYU5vZGUgbmQgPSBqcy5nZXRQYXJlbnQoKTsKLQkJCWlmIChuZCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCW5kID0gbmQuZ2V0UGFyZW50KCk7Ci0JCQlpZiAobmQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQluZCA9IG5kLmdldFBhcmVudCgpOwotCQkJaWYgKChuZCA9PSBudWxsKSB8fCAhSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MuaXNJbnN0YW5jZShuZCkpCi0JCQkJcmV0dXJuOwkJCQotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpbmQ7Ci0JCQlpZiAoIWF0LmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFJlc291cmNlKCkuZXhpc3RzKCkpCi0JCQkJcmV0dXJuOwotCQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYXQuZ2V0UGFyZW50KCkpOwotCQkJZmluYWwgVXBkYXRlQXR0cmlidXRlRmVhdHVyZSBmdCA9IG5ldyBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7IAotCQkJZmluYWwgQ3VzdG9tQ29udGV4dCBjdHggPSBuZXcgQ3VzdG9tQ29udGV4dCgpOwotCQkJY3R4LnNldElubmVyUGljdG9ncmFtRWxlbWVudChwZSk7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZ0LmV4ZWN1dGUoY3R4KTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS5hc3luY0V4ZWMocnVubmFibGUpOwotCQl9Ci0JfQkJCi0JCi0JCi0JcHVibGljIGNsYXNzIEF0dHJpYnV0ZVJlbGF0aW9uc2hpcFJlZmVyZW5jZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewkJCi0JCQlSZWxhdGlvbnNoaXAgcnIgPSAoUmVsYXRpb25zaGlwKWV2ZW50LmdldFNvdXJjZSgpOwotCQkJSnBhTm9kZSBwID0gcnIuZ2V0UGFyZW50KCk7Ci0JCQlpZiAocCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXAgPSBwLmdldFBhcmVudCgpOwotCQkJaWYgKHAgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIUphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzLmlzSW5zdGFuY2UocCkpCi0JCQkJcmV0dXJuOwotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKXA7Ci0JCQlyZW5ld0F0dHJpYnV0ZUpvaW5pbmdTdHJhdGVneVByb3BlcnR5TGlzdGVuZXIoanBhKTsKLQkJCWlmICghanBhLmdldFBhcmVudCgpLmdldFBhcmVudCgpLmdldFJlc291cmNlKCkuZXhpc3RzKCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGZlYXR1cmVQcm92aWRlciA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwYS5nZXRQYXJlbnQoKSk7Ci0JCQlmaW5hbCBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIGZ0ID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsgCi0JCQlmaW5hbCBDdXN0b21Db250ZXh0IGN0eCA9IG5ldyBDdXN0b21Db250ZXh0KCk7Ci0JCQljdHguc2V0SW5uZXJQaWN0b2dyYW1FbGVtZW50KHBlKTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJZnQuZXhlY3V0ZShjdHgpOwotCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhydW5uYWJsZSk7CQkKLQkJfQotCX0JCQotCQotCXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVNYXBwaW5nT3B0aW9uYWxpdHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJQm9vbGVhbiBvcHRpb25hbCA9IChCb29sZWFuKWV2ZW50LmdldE5ld1ZhbHVlKCk7Ci0JCQlib29sZWFuIGlzT3B0aW9uYWwgPSAob3B0aW9uYWwgPT0gbnVsbCkgPyB0cnVlIDogb3B0aW9uYWwuYm9vbGVhblZhbHVlKCk7Ci0JCQlPcHRpb25hbE1hcHBpbmcgbm0gPSAoT3B0aW9uYWxNYXBwaW5nKWV2ZW50LmdldFNvdXJjZSgpOwotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKW5tLmdldFBhcmVudCgpOwotCQkJSVJlbGF0aW9uIHJlbCA9IGZlYXR1cmVQcm92aWRlci5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShqcGEpOwotCQkJYm9vbGVhbiBhdEJlZ2lubmluZyA9ICFyZWwuZ2V0T3duZXIoKS5lcXVhbHMoanBhLmdldFBhcmVudCgpKSB8fCAKLQkJCQkJCQkJICAhcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpLmVxdWFscyhqcGEuZ2V0TmFtZSgpKTsKLQkJCWZpbmFsIENvbm5lY3Rpb24gYyA9IChDb25uZWN0aW9uKWZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsKTsKLQkJCUNvbGxlY3Rpb248Q29ubmVjdGlvbkRlY29yYXRvcj4gY29uRGVjcyA9IGMuZ2V0Q29ubmVjdGlvbkRlY29yYXRvcnMoKTsKLQkJCUl0ZXJhdG9yPENvbm5lY3Rpb25EZWNvcmF0b3I+IGl0ID0gY29uRGVjcy5pdGVyYXRvcigpOwotCQkJZmluYWwgU3RyaW5nIG5ld0xhYmVsVGV4dCA9IGlzT3B0aW9uYWwgPyAKLQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfWkVST19PTkUgOiAKLQkJCQkJCQkJCQlKUEFFZGl0b3JDb25zdGFudHMuQ0FSRElOQUxJVFlfT05FOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWZpbmFsIENvbm5lY3Rpb25EZWNvcmF0b3IgY2QgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKCFKUEFFZGl0b3JVdGlsLmlzQ2FyZGluYWxpdHlEZWNvcmF0b3IoY2QpKQotCQkJCQljb250aW51ZTsKLQkJCQlkb3VibGUgZCA9IGNkLmdldExvY2F0aW9uKCk7Ci0JCQkJaWYgKChhdEJlZ2lubmluZyAmJiBkID4gMC41KSB8fCAoIWF0QmVnaW5uaW5nICYmIGQgPD0gMC41KSkKLQkJCQkJY29udGludWU7Ci0JCQkJCi0JCQkJVHJhbnNhY3Rpb25hbEVkaXRpbmdEb21haW4gdGVkID0gVHJhbnNhY3Rpb25VdGlsLmdldEVkaXRpbmdEb21haW4oY2QpOwotCQkJCXRlZC5nZXRDb21tYW5kU3RhY2soKS5leGVjdXRlKG5ldyBSZWNvcmRpbmdDb21tYW5kKHRlZCkgewotCQkJCQlAT3ZlcnJpZGUKLQkJCQkJcHJvdGVjdGVkIHZvaWQgZG9FeGVjdXRlKCkgewotCQkJCQkJVGV4dCB0eHQgPSAoVGV4dCljZC5nZXRHcmFwaGljc0FsZ29yaXRobSgpOwotCQkJCQkJdHh0LnNldFZhbHVlKG5ld0xhYmVsVGV4dCk7Ci0JCQkJCQkKLQkJCQkJCVBvaW50IHB0ID0gSlBBRWRpdG9yVXRpbC5yZWNhbGNUZXh0RGVjb3JhdG9yUG9zaXRpb24oKEZyZWVGb3JtQ29ubmVjdGlvbiljLCBjZCk7Ci0JCQkJCQlHcmFwaGl0aS5nZXRHYVNlcnZpY2UoKS5zZXRMb2NhdGlvbih0eHQsIHB0LngsIHB0LnksIGZhbHNlKTsJCQkJCQkKLQkJCQkJfQotCQkJCX0pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQkKLQotCXB1YmxpYyBjbGFzcyBSZW1vdmVFbnRpdHlBdHRyaWJ1dGVzIGltcGxlbWVudHMgUnVubmFibGUgewotCQlMaXN0UmVtb3ZlRXZlbnQgZXZlbnQgPSBudWxsOwotCi0JCXB1YmxpYyBSZW1vdmVFbnRpdHlBdHRyaWJ1dGVzKExpc3RSZW1vdmVFdmVudCBldmVudCkgewotCQkJdGhpcy5ldmVudCA9IGV2ZW50OwotCQl9Ci0KLQkJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCUFycmF5SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGl0ID0gKEFycmF5SXRlcmF0b3I8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KSBldmVudC5nZXRJdGVtcygpLml0ZXJhdG9yKCk7Ci0JCQkJU2V0PFNoYXBlPiBzaGFwZXNUb1JlbW92ZSA9IG5ldyBIYXNoU2V0PFNoYXBlPigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBpdC5uZXh0KCk7Ci0JCQkJCS8qCi0JCQkJCVN0cmluZyBrZXkgPSBnZXRLZXlGb3JCdXNpbmVzc09iamVjdChhdCk7Ci0JCQkJCXJlbW92ZShrZXkpOwotCQkJCQkqLwotCQkJCQlpZiAocmVtb3ZlSWdub3JlLnJlbW92ZSgoKFBlcnNpc3RlbnRUeXBlKWF0LmdldFBhcmVudCgpKS5nZXROYW1lKCkgKyAiLiIgKyBhdC5nZXROYW1lKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZTsKLQkJCQkJU2hhcGUgYXRTaGFwZSA9IChTaGFwZSkgZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChhdCk7Ci0JCQkJCWlmIChhdFNoYXBlID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJCi0JCQkJCQotCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlldmVudC5nZXRTb3VyY2UoKTsKLQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbmV3QXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKG5ld0F0ICE9IG51bGwpIHsKLQkJCQkJCVJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIsIHRydWUsIHRydWUpOwotCQkJCQkJUmVtb3ZlQ29udGV4dCBjID0gbmV3IFJlbW92ZUNvbnRleHQoYXRTaGFwZSk7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWZ0LnJlbW92ZShjKTsKLQkJCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlZSkgewotCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCUFkZEF0dHJpYnV0ZUZlYXR1cmUgZnQxID0gbmV3IEFkZEF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJCQkJCUFkZENvbnRleHQgYzEgPSBuZXcgQWRkQ29udGV4dCgpOwotCQkJCQkJYzEuc2V0TmV3T2JqZWN0KG5ld0F0KTsKLQkJCQkJCWZ0MS5hZGQoYzEpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJc2hhcGVzVG9SZW1vdmUuYWRkKGF0U2hhcGUpOwotCQkJCQlJUmVsYXRpb24gcmVsID0gZmVhdHVyZVByb3ZpZGVyLmdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKGF0KTsKLQkJCQkJaWYgKHJlbCA9PSBudWxsKQotCQkJCQkJY29udGludWU7Ci0JCQkJCUNvbm5lY3Rpb24gY29ubiA9IChDb25uZWN0aW9uKSBmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbCk7Ci0JCQkJCXdoaWxlIChjb25uICE9IG51bGwpIHsKLQkJCQkJCVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoY29ubik7Ci0JCQkJCQlSZW1vdmVSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgUmVtb3ZlUmVsYXRpb25GZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJCQlmdC5yZW1vdmUoY3R4KTsKLQkJCQkJCWNvbm4gPSAoQ29ubmVjdGlvbikgZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJCUl0ZXJhdG9yPFNoYXBlPiBpdHIgPSBzaGFwZXNUb1JlbW92ZS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJCVNoYXBlIGF0U2hhcGUgPSBpdHIubmV4dCgpOwotCQkJCQlSZW1vdmVDb250ZXh0IGN0eCA9IG5ldyBSZW1vdmVDb250ZXh0KGF0U2hhcGUpOwotCQkJCQlSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyLCB0cnVlLCB0cnVlKTsKLQkJCQkJZnQucmVtb3ZlKGN0eCk7Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZWxzID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucHJvZHVjZUFsbFJlbGF0aW9ucygKLQkJCQkJCShKYXZhUGVyc2lzdGVudFR5cGUpIGV2ZW50LmdldFNvdXJjZSgpLCBmZWF0dXJlUHJvdmlkZXIpOwotCQkJCUl0ZXJhdG9yPElSZWxhdGlvbj4gaXRlciA9IHJlbHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJSVJlbGF0aW9uIHJlbCA9IGl0ZXIubmV4dCgpOwotCQkJCQlDb250YWluZXJTaGFwZSBvd25lclNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBmZWF0dXJlUHJvdmlkZXIKLQkJCQkJCQkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbC5nZXRPd25lcigpKTsKLQkJCQkJQ29udGFpbmVyU2hhcGUgaW52ZXJzZVNoYXBlID0gKENvbnRhaW5lclNoYXBlKSBmZWF0dXJlUHJvdmlkZXIKLQkJCQkJCQkuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJCQlBZGRDb25uZWN0aW9uQ29udGV4dCBjbnR4ID0gbmV3IEFkZENvbm5lY3Rpb25Db250ZXh0KEpQQUVkaXRvclV0aWwuZ2V0QW5jaG9yKG93bmVyU2hhcGUpLAotCQkJCQkJCUpQQUVkaXRvclV0aWwuZ2V0QW5jaG9yKGludmVyc2VTaGFwZSkpOwotCQkJCQljbnR4LnNldE5ld09iamVjdChyZWwpOwotCQkJCQlBZGRSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQWRkUmVsYXRpb25GZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCQkJCWZ0LmFkZChjbnR4KTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGNsYXNzIEFkZEVudGl0eUF0dHJpYnV0ZXMgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCUxpc3RBZGRFdmVudCBldmVudCA9IG51bGw7Ci0KLQkJcHVibGljIEFkZEVudGl0eUF0dHJpYnV0ZXMoTGlzdEFkZEV2ZW50IGV2ZW50KSB7Ci0JCQl0aGlzLmV2ZW50ID0gZXZlbnQ7Ci0JCX0KLQotCQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCXRyeSB7Ci0JCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGV2ZW50LmdldFNvdXJjZSgpOwotCQkJCUNvbnRhaW5lclNoYXBlIGVudFNoYXBlID0gKENvbnRhaW5lclNoYXBlKWZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KTsKLQkJCQkKLQkJCQkvLyByZW1vdmUgaW52YWxpZGF0ZWQgcmVsYXRpb25zIChpZiBhbnkpCi0JCQkJQXJyYXlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gaXQgPSAoQXJyYXlJdGVyYXRvcjxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4pIGV2ZW50LmdldEl0ZW1zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0ID0gaXQubmV4dCgpOwotCQkJCQkvL1NoYXBlIGF0U2hhcGUgPSAoU2hhcGUpIGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoYXQpOwotCQkJCQkvL2lmIChhdFNoYXBlICE9IG51bGwpCi0JCQkJCS8vCWNvbnRpbnVlOwotCQkJCQlpZiAoYWRkSWdub3JlLnJlbW92ZSgoKFBlcnNpc3RlbnRUeXBlKWF0LmdldFBhcmVudCgpKS5nZXROYW1lKCkgKyAiLiIgKyBhdC5nZXROYW1lKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZTsKLQkJCQkJQWRkQ29udGV4dCBjdHggPSBuZXcgQWRkQ29udGV4dCgpOwotCQkJCQljdHguc2V0TmV3T2JqZWN0KGF0KTsKLQkJCQkJY3R4LnNldFRhcmdldENvbnRhaW5lcihlbnRTaGFwZSk7Ci0JCQkJCUFkZEF0dHJpYnV0ZUZlYXR1cmUgZnQgPSBuZXcgQWRkQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQkJCQlmdC5hZGQoY3R4KTsKLQkJCQl9Ci0JCQkJLy9KcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZW1ha2VSZWxhdGlvbnMoKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIpZmVhdHVyZVByb3ZpZGVyLCBlbnRTaGFwZSwganB0KTsKLQkJCQlmZWF0dXJlUHJvdmlkZXIuYWRkSlBURm9yVXBkYXRlKGpwdC5nZXROYW1lKCkpOwotCi0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJGb3JVcGRhdGUoUGVyc2lzdGVuY2VVbml0IHB1LCBTdHJpbmcgZW50QXRNYXBwZWRCeSkgewotCQllbnRpdHlOYW1lTGlzdGVuZXIuYWRkQXR0cmliRm9yVXBkYXRlKHB1LCBlbnRBdE1hcHBlZEJ5KTsKLQl9Ci0KLQkKLQlwcml2YXRlIHZvaWQgdXBkYXRlSlBUTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCVN0cmluZyBlbnROYW1lID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0RW50aXR5TmFtZShqcHQpOwotCQllbnROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGVudE5hbWUpOwotCQlDb250YWluZXJTaGFwZSBlbnRTaGFwZSA9IChDb250YWluZXJTaGFwZSlmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCUpQQUVkaXRvclV0aWwuc2V0SlBUTmFtZUluU2hhcGUoZW50U2hhcGUsIGVudE5hbWUpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgY2xvc2VEaWFncmFtRWRpdG9ySWZQcm9qZWN0SXNEZWxldGVkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IGV2ZW50LmdldFJlc291cmNlKCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmICFyZXNvdXJjZS5leGlzdHMoKSB8fCBldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0NMT1NFIHx8IChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkpIHsKLQkJCSAgICBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJUHJvamVjdCkgewotCQkJCQlmaW5hbCBJRGlhZ3JhbVR5cGVQcm92aWRlciBwcm92aWRlciA9IGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCk7Ci0JCQkJCWlmIChwcm92aWRlciBpbnN0YW5jZW9mIEpQQUVkaXRvckRpYWdyYW1UeXBlUHJvdmlkZXIpIHsKLQkJCQkJCWZpbmFsIEpQQURpYWdyYW1FZGl0b3IgZGlhZ3JhbUJ5U2VsZWN0ZWRQcm9qZWN0ID0gKChKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyKSBwcm92aWRlcikuZ2V0RGlhZ3JhbUVkaXRvcigpOwotCQkJCQkJZmluYWwgRGlhZ3JhbSBkaWFncmFtID0gKChKUEFFZGl0b3JEaWFncmFtVHlwZVByb3ZpZGVyKXByb3ZpZGVyKS5nZXREaWFncmFtKCk7Ci0JCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCQkJCQlpZiAoKE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldFByb2plY3RCeURpYWdyYW0oZGlhZ3JhbS5nZXROYW1lKCkpLmdldFByb2plY3QoKSkuZXF1YWxzKHJlc291cmNlKSkgewotCQkJCQkJCQkJCQlwYWdlLmNsb3NlRWRpdG9yKGRpYWdyYW1CeVNlbGVjdGVkUHJvamVjdCwgZmFsc2UpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJEZWx0ZWRFbnRpdHkoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYoKGV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UpIHx8IChldmVudC5nZXRUeXBlKCkgPT0gSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0RFTEVURSkpCi0JCQlyZXR1cm47Ci0JCQotCQlJUmVzb3VyY2VEZWx0YSBjaGFuZ2VkRGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IGNoYW5nZWREZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCWZvciAoSVJlc291cmNlRGVsdGEgZGVsdGEgOiBkZWx0YXMpIHsKLQkJCWZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSA9IGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQlmb3IgKElSZXNvdXJjZURlbHRhIGRlbHRhUmVzb3VyY2UgOiBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCkpIHsKLQkJCQkJCUxpc3Q8SVJlc291cmNlRGVsdGE+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8SVJlc291cmNlRGVsdGE+KCk7Ci0JCQkJCQlyZXNvdXJjZXMgPSBmaW5kRGVsZXRlZFJlc291cmNlKGRlbHRhUmVzb3VyY2UsIHJlc291cmNlcyk7Ci0JCQkJCQlmb3IgKElSZXNvdXJjZURlbHRhIHJlc291cmNlRGVsdGEgOiByZXNvdXJjZXMpIHsKLQkJCQkJCQlpZiAocmVzb3VyY2VEZWx0YS5nZXRSZXNvdXJjZSgpIGluc3RhbmNlb2YgRmlsZSkgewotCQkJCQkJCQlJRmlsZSBmaWxlID0gdGhpcy5lY2xpcHNlRmFjYWRlLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKCgoRmlsZSkgcmVzb3VyY2VEZWx0YS5nZXRSZXNvdXJjZSgpKS5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpICYmIGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFscygiamF2YSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKcGFQcm9qZWN0KChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJCQkJCQkJCQlpZiAoanBhUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvamVjdCk7Ci0JCQkJCQkJCQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdFtdIGZyYWdtZW50Um9vdHMgPSBqYXZhUHJvamVjdC5nZXRBbGxQYWNrYWdlRnJhZ21lbnRSb290cygpOwotCQkJCQkJCQkJCQkJZm9yIChJUGFja2FnZUZyYWdtZW50Um9vdCBmcmFnbWVudFJvb3QgOiBmcmFnbWVudFJvb3RzKSB7Ci0JCQkJCQkJCQkJCQkJaWYgKChmcmFnbWVudFJvb3QgaW5zdGFuY2VvZiBQYWNrYWdlRnJhZ21lbnRSb290KSAmJiBmcmFnbWVudFJvb3QuZ2V0S2luZCgpID09IFBhY2thZ2VGcmFnbWVudFJvb3QuS19TT1VSQ0UpIHsKLQkJCQkJCQkJCQkJCQkJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKFBhY2thZ2VGcmFnbWVudFJvb3QpIGZyYWdtZW50Um9vdDsKLQkJCQkJCQkJCQkJCQkJU3RyaW5nIHNvdXJjZWZvbGRlciA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UmVzb3VyY2UoKS5nZXROYW1lKCk7Ci0JCQkJCQkJCQkJCQkJCVN0cmluZ1tdIGZxID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuc3BsaXQoc291cmNlZm9sZGVyKTsKLQkJCQkJCQkJCQkJCQkJU3RyaW5nIGZxTmFtZSA9IGZxWzFdLnJlcGxhY2UoIi8iLCAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJCQkJZnFOYW1lID0gZnFOYW1lLnJlcGxhY2VGaXJzdCgiLiIsICIiKS5yZXBsYWNlKCIuamF2YSIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJCQkJCQkJCQkvL0pQQUVkaXRvclV0aWwuY3JlYXRlVW5yZWdpc3RlckVudGl0eUZyb21YTUxKb2IoanBhUHJvamVjdCwgZnFOYW1lKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JCi0JcHJpdmF0ZSBMaXN0PElSZXNvdXJjZURlbHRhPiBmaW5kRGVsZXRlZFJlc291cmNlKElSZXNvdXJjZURlbHRhIGRlbHRhLCBMaXN0PElSZXNvdXJjZURlbHRhPiByZXNvdXJjZXMpewotCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCWZvciAoSVJlc291cmNlRGVsdGEgZGVsIDogZGVsdGFzKSB7Ci0JCQkJZmluZERlbGV0ZWRSZXNvdXJjZShkZWwsIHJlc291cmNlcyk7Ci0JCQkJaWYoZGVsLmdldEFmZmVjdGVkQ2hpbGRyZW4oKS5sZW5ndGg9PTApCi0JCQkJICAgIHJlc291cmNlcy5hZGQoZGVsKTsKLQkJCX0KLQkJcmV0dXJuIHJlc291cmNlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL0pwYUFydGlmYWN0RmFjdG9yeS5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSnBhQXJ0aWZhY3RGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjhhY2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvSnBhQXJ0aWZhY3RGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbm5lY3Rpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuaW1wbC5SZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuc2VydmljZXMuR3JhcGhpdGk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUltcG9ydERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Db21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLkpwdFJlc291cmNlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi5jb3JlLnJlc291cmNlLmphdmEuSmF2YVJlc291cmNlQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLk5lc3RhYmxlQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBbm5vdGF0ZWRFbGVtZW50LktpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5BcnJheUxpc3RJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLlN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLk1hcHBpbmdLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5QZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFBdHRyaWJ1dGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YUVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFNYW55VG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU9uZVRvT25lTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVR5cGVNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLkNsYXNzUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5BdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5FbWJlZGRlZElkQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5JZEFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSWRDbGFzc0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuSm9pbkNvbHVtbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFueVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuTWFwS2V5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5PbmVUb01hbnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvT25lQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Pd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuVGFibGVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5SZW1vdmVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmkxOG4uSlBBRWRpdG9yTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvcGVydHlwYWdlLkpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxEaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55QmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvTWFueVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9PbmVVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk9uZVRvT25lQmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuVW5pZGlyZWN0aW9uYWxSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci0KLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKcGFBcnRpZmFjdEZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnBhQXJ0aWZhY3RGYWN0b3J5IElOU1RBTkNFID0gbmV3IEpwYUFydGlmYWN0RmFjdG9yeSgpOwkKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX05VTV9PRl9JVEVSQVRJT05TID0gMjU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBVVNFX0RVUkFUSU9OID0gMjAwOwotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xMRUNUSU9OX1RZUEUgPSAiamF2YS51dGlsLkNvbGxlY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJU1RfVFlQRSA9ICJqYXZhLnV0aWwuTGlzdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX1RZUEUgPSAiamF2YS51dGlsLlNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQX1RZUEUgPSAiamF2YS51dGlsLk1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXN5bmNocm9uaXplZCBwdWJsaWMgc3RhdGljIEpwYUFydGlmYWN0RmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIElOU1RBTkNFOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQkJCQkJCQkJCQkgIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCQlhZGRPbmVUb09uZVJlbGF0aW9uKGZwLCBqcHQsIGF0dHJpYnV0ZSwgbnVsbCwgbnVsbCwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9VTklESVJFQ1RJT05BTCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE9uZVRvT25lQmlkaXJlY3Rpb25hbFJlbGF0aW9uIChJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MSwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MiwKLQkJCQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMikgewotCQkKLQkJYWRkT25lVG9PbmVSZWxhdGlvbihmcCwganB0MSwgYXR0cmlidXRlMSwganB0MiwgYXR0cmlidXRlMiwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkT25lVG9PbmVSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgb3duZXJKUFQsIAotCQkJCQkJCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdHRpYnV0ZSwgCi0JCQkJCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVmZXJlbmNlZEpQVCwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZWZlcmVuY2VkQXR0cmlidXRlLCBpbnQgZGlyZWN0aW9uKSB7Ci0JCQotCQlpZihvd25lckpQVC5nZXRBdHRyaWJ1dGVOYW1lZChvd25lckF0dGlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCl7Ci0JCQkgICByZWZyZXNoRW50aXR5TW9kZWwoZnAsIG93bmVySlBUKTsKLQkJfQotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0ciA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3duZXJKUFQKLQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShvd25lckF0dGlidXRlLmdldE5hbWUoKSk7Ci0JCWF0dHIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5zZXRQcmltYXJ5QW5ub3RhdGlvbigiamF2YXgucGVyc2lzdGVuY2UuT25lVG9PbmUiLCBuZXcgQXJyYXlMaXN0SXRlcmFibGU8U3RyaW5nPigpKTsJLy8kTk9OLU5MUy0xJAotCQlpZiAoZGlyZWN0aW9uID09IEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwpIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCByZWZlcmVuY2VkSlBUKTsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIyID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSByZWZlcmVuY2VkSlBULnJlc29sdmVBdHRyaWJ1dGUocmVmZXJlbmNlZEF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJYXR0cjIuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCQlhdHRyMi5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCkudXBkYXRlKCk7Ci0JCQlKYXZhT25lVG9PbmVNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU9uZVRvT25lTWFwcGluZykgYXR0cjIuZ2V0TWFwcGluZygpOwotCQkJT25lVG9PbmVBbm5vdGF0aW9uIGFubm90YXRpb24gPSBtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQlpZihhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgcmVmZXJlbmNlZEpQVCk7Ci0JCQkJYW5ub3RhdGlvbiA9ICgoSmF2YU9uZVRvT25lTWFwcGluZykgYXR0cjIuZ2V0TWFwcGluZygpKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJfQotCQkJYW5ub3RhdGlvbi5zZXRNYXBwZWRCeShvd25lckF0dGlidXRlLmdldE5hbWUoKSk7Ci0JCX0JCQotCQkKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkT25lVG9NYW55VW5pZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCQkJCSAgIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZSwgYm9vbGVhbiBpc01hcCkgewotCQkKLQkJYWRkT25lVG9NYW55UmVsYXRpb24oZnAsIGpwdCwgYXR0cmlidXRlLCBudWxsLCBudWxsLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX1VOSURJUkVDVElPTkFMLCBpc01hcCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFkZE9uZVRvTWFueUJpZGlyZWN0aW9uYWxSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MSwgCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUxLCBKYXZhUGVyc2lzdGVudFR5cGUganB0MiwKLQkJCQkJCQkJCQkJCSAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMiwgYm9vbGVhbiBpc01hcCkgewotCQkKLQkJYWRkT25lVG9NYW55UmVsYXRpb24oZnAsIGpwdDEsIGF0dHJpYnV0ZTEsIGpwdDIsIGF0dHJpYnV0ZTIsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfQklESVJFQ1RJT05BTCwgaXNNYXApOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYW55VG9PbmVCaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEsIAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMSwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIsCi0JCQkJCQkJCQkJCQkgIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZTIsIGJvb2xlYW4gaXNNYXApIHsKLQkJCi0JCWFkZE1hbnlUb09uZVJlbGF0aW9uKGZwLCBqcHQxLCBhdHRyaWJ1dGUxLCBqcHQyLCBhdHRyaWJ1dGUyLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwsIGlzTWFwKTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgYWRkT25lVG9NYW55UmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIHNpbmdsZVNpZGVKUFQsIAotCQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNpbmdsZVNpZGVBdHRpYnV0ZSwgCi0JCQkJCQkJCQkgSmF2YVBlcnNpc3RlbnRUeXBlIG1hbnlTaWRlSlBULCAKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG1hbnlTaWRlQXR0cmlidXRlLCBpbnQgZGlyZWN0aW9uLCBib29sZWFuIGlzTWFwKSB7Ci0JCQotCQkvL2lmKHNpbmdsZVNpZGVKUFQuZ2V0QXR0cmlidXRlTmFtZWQoc2luZ2xlU2lkZUF0dGlidXRlLmdldE5hbWUoKSkgPT0gbnVsbCl7Ci0JCQkgICByZWZyZXNoRW50aXR5TW9kZWwoZnAsIHNpbmdsZVNpZGVKUFQpOwotCQkvL30KLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVkU2luZ2xlU2lkZUF0dHJpYnV0ZSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgc2luZ2xlU2lkZUpQVAotCQkJCS5yZXNvbHZlQXR0cmlidXRlKHNpbmdsZVNpZGVBdHRpYnV0ZS5nZXROYW1lKCkpOwotCQlyZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUKLQkJCQkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5PTkVfVE9fTUFOWV9BVFRSSUJVVEVfTUFQUElOR19LRVkpOwotCQlpZiAoZGlyZWN0aW9uID09IEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwpIHsKLQkJCXJlc29sdmVkU2luZ2xlU2lkZUF0dHJpYnV0ZS5nZXRKcGFQcm9qZWN0KCkuZ2V0Um9vdENvbnRleHROb2RlKCkKLQkJCQkJLnVwZGF0ZSgpOwotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIHNpbmdsZVNpZGVKUFQpOwotCQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IHJlc29sdmVkU2luZ2xlU2lkZUF0dHJpYnV0ZQotCQkJCQkuZ2V0TWFwcGluZygpOwotCQkJaWYgKCFtYXBwaW5nLmdldENsYXNzKCkuaXNJbnN0YW5jZShKYXZhT25lVG9NYW55TWFwcGluZy5jbGFzcykpIAotCQkJCXJldHVybjsKLQkJCU9uZVRvTWFueUFubm90YXRpb24gYW5ub3RhdGlvbiA9ICgoSmF2YU9uZVRvTWFueU1hcHBpbmcpbWFwcGluZykuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCWlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgc2luZ2xlU2lkZUpQVCk7Ci0JCQkJbWFwcGluZyA9IHJlc29sdmVkU2luZ2xlU2lkZUF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCQkJYW5ub3RhdGlvbiA9ICgoSmF2YU9uZVRvTWFueU1hcHBpbmcpbWFwcGluZykuZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJCX0KLQkJCQotCQkJaWYoYW5ub3RhdGlvbiA9PSBudWxsKXsKLQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgc2luZ2xlU2lkZUpQVCk7Ci0JCQkJYW5ub3RhdGlvbiA9ICgoSmF2YU9uZVRvTWFueU1hcHBpbmcpcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlCi0JCQkJCS5nZXRNYXBwaW5nKCkpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCQlhbm5vdGF0aW9uLnNldE1hcHBlZEJ5KG1hbnlTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7CQkJCQkJCi0JCQkKLQkJfQotCQlpZiAoaXNNYXApCi0JCQlzaW5nbGVTaWRlQXR0aWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJaWYgKGRpcmVjdGlvbiA9PSBKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9CSURJUkVDVElPTkFMKSB7Ci0JCQlpZihtYW55U2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChtYW55U2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpID09IG51bGwpewotCQkJCSAgIHJlZnJlc2hFbnRpdHlNb2RlbChmcCwgbWFueVNpZGVKUFQpOwotCQkJfQotCQkJCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZE1hbnlTaWRlQXR0cmlidXRlID0gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKSBtYW55U2lkZUpQVAotCQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShtYW55U2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQkJcmVzb2x2ZWRNYW55U2lkZUF0dHJpYnV0ZS5zZXRNYXBwaW5nS2V5KE1hcHBpbmdLZXlzLk1BTllfVE9fT05FX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCX0gZWxzZSB7Ci0JCQlhZGRKb2luQ29sdW1uSWZOZWNlc3NhcnkocmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlLCBzaW5nbGVTaWRlSlBULCBmcCk7Ci0JCX0JCQotCX0KLQkKLQlwcml2YXRlIHZvaWQgYWRkSm9pbkNvbHVtbklmTmVjZXNzYXJ5KEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSwKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIElGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQotCQlpZiAoSlBBRWRpdG9yVXRpbC5jaGVja0pQQUZhY2V0VmVyc2lvbihqcGEuZ2V0SnBhUHJvamVjdCgpLCAiMS4wIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCUpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2Uuc2hvdWxkT25lVG9NYW55VW5pZGlyQmVPbGRTdHlsZShqcGEKLQkJCQkJCS5nZXRKcGFQcm9qZWN0KCkuZ2V0UHJvamVjdCgpKSkKLQkJCXJldHVybjsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVbXSBpZHMgPSBnZXRJZHMoanB0KTsKLQkJaWYgKGlkcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJZmluYWwgU3RyaW5nIHRhYmxlTmFtZSA9IGdldFRhYmxlTmFtZShqcHQpOwotCQlpZiAoaWRzLmxlbmd0aCA9PSAxKSB7Ci0JCQlpZiAoaXNTaW1wbGVJZChpZHNbMF0pKSB7Ci0JCQkJSm9pbkNvbHVtbkFubm90YXRpb24gYW4gPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGpwYQotCQkJCQkJLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbigwLCAKLQkJCQkJCQkJSm9pbkNvbHVtbkFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCQlTdHJpbmcgaWRDb2xOYW1lID0gZ2V0Q29sdW1uTmFtZShpZHNbMF0pOwotCQkJCWFuLnNldE5hbWUodGFibGVOYW1lICsgIl8iICsgaWRDb2xOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFuLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKGlkQ29sTmFtZSk7Ci0JCQl9IGVsc2UgewotCQkJCUhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gYXROYW1lVG9Db2xOYW1lID0gZ2V0T3ZlcnJpZGRlbkNvbE5hbWVzKGlkc1swXSk7Ci0JCQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gZ2V0UGVyc2lzdGVuY2VVbml0KGpwdCk7Ci0JCQkJU3RyaW5nIGVtYmVkZGFibGVUeXBlTmFtZSA9IGlkc1swXS5nZXRUeXBlTmFtZSgpOwotCQkJCUVtYmVkZGFibGUgZW1iID0gcHUuZ2V0RW1iZWRkYWJsZShlbWJlZGRhYmxlVHlwZU5hbWUpOwotCQkJCWZvciAoQXR0cmlidXRlTWFwcGluZyBhbSA6IGVtYi5nZXRBbGxBdHRyaWJ1dGVNYXBwaW5ncygpKSB7Ci0JCQkJCUpvaW5Db2x1bW5Bbm5vdGF0aW9uIGpjID0gKEpvaW5Db2x1bW5Bbm5vdGF0aW9uKSBqcGEuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKGpwYS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgYW0KLQkJCQkJCQkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJCQlTdHJpbmcgaWRDb2xOYW1lID0gYXROYW1lVG9Db2xOYW1lLmdldChhdC5nZXROYW1lKCkpOwotCQkJCQlpZENvbE5hbWUgPSAoaWRDb2xOYW1lICE9IG51bGwpID8gaWRDb2xOYW1lCi0JCQkJCQkJOiBnZXRDb2x1bW5OYW1lKGF0KTsKLQkJCQkJamMuc2V0TmFtZSh0YWJsZU5hbWUgKyAiXyIgKyBpZENvbE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWpjLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKGlkQ29sTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpZEF0IDogaWRzKSB7Ci0JCQkJSm9pbkNvbHVtbkFubm90YXRpb24gamMgPSAoSm9pbkNvbHVtbkFubm90YXRpb24pIGpwYS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oIGpwYS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zU2l6ZShKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpLCBKb2luQ29sdW1uQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkJCVN0cmluZyBpZENvbE5hbWUgPSBnZXRDb2x1bW5OYW1lKGlkQXQpOwotCQkJCWpjLnNldE5hbWUodGFibGVOYW1lICsgIl8iICsgaWRDb2xOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWpjLnNldFJlZmVyZW5jZWRDb2x1bW5OYW1lKGlkQ29sTmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEhhc2h0YWJsZTxTdHJpbmcsIFN0cmluZz4gZ2V0T3ZlcnJpZGRlbkNvbE5hbWVzKAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZW1iSWRBdCkgewotCQlIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+IHJlcyA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBTdHJpbmc+KCk7Ci0JCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbiBhb24gPSAoQXR0cmlidXRlT3ZlcnJpZGVBbm5vdGF0aW9uKSBlbWJJZEF0Ci0JCQkJLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbigwLCAKLQkJCQkJCUF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlpZiAoYW9uICE9IG51bGwpIHsKLQkJCUNvbHVtbkFubm90YXRpb24gY29sQW4gPSBhb24uZ2V0Q29sdW1uKCk7Ci0JCQlpZiAoY29sQW4gPT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzOwotCQkJU3RyaW5nIGNvbE5hbWUgPSBjb2xBbi5nZXROYW1lKCk7Ci0JCQlpZiAoY29sTmFtZSA9PSBudWxsKQotCQkJCXJldHVybiByZXM7Ci0JCQlyZXMucHV0KGFvbi5nZXROYW1lKCksIGNvbE5hbWUpOwotCQkJcmV0dXJuIHJlczsKLQkJfQotCQlJdGVyYWJsZTxBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24+IGl0ID0gbmV3IFN1Ykxpc3RJdGVyYWJsZVdyYXBwZXI8TmVzdGFibGVBbm5vdGF0aW9uLCBBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24+KAotCQkJZW1iSWRBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zKEF0dHJpYnV0ZU92ZXJyaWRlQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpKTsKLQkJZm9yIChBdHRyaWJ1dGVPdmVycmlkZUFubm90YXRpb24gYW4gOiBpdCkgewotCQkJQ29sdW1uQW5ub3RhdGlvbiBjb2xBbiA9IGFuLmdldENvbHVtbigpOwotCQkJaWYgKGNvbEFuID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgY29sTmFtZSA9IGNvbEFuLmdldE5hbWUoKTsKLQkJCWlmIChjb2xOYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlyZXMucHV0KGFuLmdldE5hbWUoKSwgY29sTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9CQotCQotCQotCXB1YmxpYyB2b2lkIGFkZE1hbnlUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgCi0JCQkJCQkJCQkJCQkgICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJCi0JCWFkZE1hbnlUb09uZVJlbGF0aW9uKGZwLCBqcHQsIGF0dHJpYnV0ZSwgbnVsbCwgbnVsbCwKLQkJCQlKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fVFlQRV9VTklESVJFQ1RJT05BTCwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYW55VG9PbmVSZWxhdGlvbihJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUgbWFueVNpZGVKUFQsIAotCQkJCQkJCQkJIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG1hbnlTaWRlQXR0cmlidXRlLCAKLQkJCQkJCQkJCSBKYXZhUGVyc2lzdGVudFR5cGUgc2luZ2xlU2lkZUpQVCwgCi0JCQkJCQkJCQkgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgc2luZ2xlU2lkZUF0dGlidXRlLCAKLQkJCQkJCQkJCSBpbnQgZGlyZWN0aW9uLCBib29sZWFuIGlzTWFwKSB7Ci0JCQotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIG1hbnlTaWRlSlBUKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlc29sdmVkTWFueVNpZGVBdHRyaWJ1dGUgPSBtYW55U2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChtYW55U2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpOwotCQlyZXNvbHZlZE1hbnlTaWRlQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19PTkVfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCi0JCWlmIChkaXJlY3Rpb24gPT0gSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfVU5JRElSRUNUSU9OQUwpIAotCQkJcmV0dXJuOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlID0gc2luZ2xlU2lkZUpQVC5nZXRBdHRyaWJ1dGVOYW1lZChzaW5nbGVTaWRlQXR0aWJ1dGUuZ2V0TmFtZSgpKTsKLQkJcmVzb2x2ZWRTaW5nbGVTaWRlQXR0cmlidXRlLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuT05FX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBzaW5nbGVTaWRlSlBUKTsKLQkJSmF2YU9uZVRvTWFueU1hcHBpbmcgbWFwcGluZyA9IChKYXZhT25lVG9NYW55TWFwcGluZylyZXNvbHZlZFNpbmdsZVNpZGVBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGEgPSBtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCWlmIChhID09IG51bGwpIAotCQkJcmV0dXJuOwotCQlhLnNldE1hcHBlZEJ5KG1hbnlTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCWlmIChpc01hcCkKLQkJCXNpbmdsZVNpZGVBdHRpYnV0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmFkZEFubm90YXRpb24oTWFwS2V5QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRNYW55VG9NYW55QmlkaXJlY3Rpb25hbFJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLCAKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHJpYnV0ZTEsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQyLAotCQkJCQkJCQkJCQkJICAgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlMiwgYm9vbGVhbiBpc01hcCkgewotCQkKLQkJYWRkTWFueVRvTWFueVJlbGF0aW9uKGZwLCBqcHQxLCBhdHRyaWJ1dGUxLCBqcHQyLCBhdHRyaWJ1dGUyLAotCQkJCUpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwsIGlzTWFwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWFueVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oSUZlYXR1cmVQcm92aWRlciBmcCwgSmF2YVBlcnNpc3RlbnRUeXBlIGFubm90YXRlZEpQVCwKLQkJCQkJCQkJCQkJCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRBdHRyaWJ1dGUsIGJvb2xlYW4gaXNNYXApIHsKLQkJCi0JCWFkZE1hbnlUb01hbnlSZWxhdGlvbihmcCwgYW5ub3RhdGVkSlBULCBhbm5vdGF0ZWRBdHRyaWJ1dGUsIG51bGwsIG51bGwsCi0JCQkJSlBBRWRpdG9yQ29uc3RhbnRzLlJFTEFUSU9OX1RZUEVfVU5JRElSRUNUSU9OQUwsIGlzTWFwKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRkTWFueVRvTWFueVJlbGF0aW9uKElGZWF0dXJlUHJvdmlkZXIgZnAsIEphdmFQZXJzaXN0ZW50VHlwZSBvd25lclNpZGVKUFQsIAotCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lclNpZGVBdHRyaWJ1dGUsIAotCQkJCQkJCQkJICBKYXZhUGVyc2lzdGVudFR5cGUgaW52ZXJzZVNpZGVKUFQsIAotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZVNpZGVBdHRpYnV0ZSwgaW50IGRpcmVjdGlvbiwgYm9vbGVhbiBpc01hcCkgewotCQkKLQkJaWYob3duZXJTaWRlSlBULmdldEF0dHJpYnV0ZU5hbWVkKG93bmVyU2lkZUF0dHJpYnV0ZS5nZXROYW1lKCkpID09IG51bGwpewotCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBvd25lclNpZGVKUFQpOwotCQl9Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXNvbHZlZE93bmVyU2lkZUF0dHJpYnV0ZSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgb3duZXJTaWRlSlBUCi0JCQkJLnJlc29sdmVBdHRyaWJ1dGUob3duZXJTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7Ci0JCXJlc29sdmVkT3duZXJTaWRlQXR0cmlidXRlCi0JCQkJLnNldE1hcHBpbmdLZXkoTWFwcGluZ0tleXMuTUFOWV9UT19NQU5ZX0FUVFJJQlVURV9NQVBQSU5HX0tFWSk7Ci0JCWlmIChpc01hcCkKLQkJCXJlc29sdmVkT3duZXJTaWRlQXR0cmlidXRlLmdldFJlc291cmNlQXR0cmlidXRlKCkuYWRkQW5ub3RhdGlvbihNYXBLZXlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQotCQlpZiAoZGlyZWN0aW9uID09IEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9UWVBFX0JJRElSRUNUSU9OQUwpIHsKLQkJCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCBpbnZlcnNlU2lkZUpQVCk7Ci0JCQkvKgotCQkJaWYoaW52ZXJzZVNpZGVKUFQuZ2V0QXR0cmlidXRlTmFtZWQoaW52ZXJzZVNpZGVBdHRpYnV0ZS5nZXROYW1lKCkpID09IG51bGwpewotCQkJCSAgIHJlZnJlc2hFbnRpdHlNb2RlbChmcCwgaW52ZXJzZVNpZGVKUFQpOwotCQkJfQotCQkJKi8KLQkJCQotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVzb2x2ZWRJbnZlcnNlU2lkZUF0dHJpYnV0ZSA9IChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkgaW52ZXJzZVNpZGVKUFQKLQkJCQkJLnJlc29sdmVBdHRyaWJ1dGUoaW52ZXJzZVNpZGVBdHRpYnV0ZS5nZXROYW1lKCkpOwotCQkJcmVzb2x2ZWRJbnZlcnNlU2lkZUF0dHJpYnV0ZQotCQkJCQkuc2V0TWFwcGluZ0tleShNYXBwaW5nS2V5cy5NQU5ZX1RPX01BTllfQVRUUklCVVRFX01BUFBJTkdfS0VZKTsKLQkJCXJlc29sdmVkSW52ZXJzZVNpZGVBdHRyaWJ1dGUuZ2V0SnBhUHJvamVjdCgpLmdldFJvb3RDb250ZXh0Tm9kZSgpCi0JCQkJCS51cGRhdGUoKTsKLQkJCQotCQkJSmF2YU1hbnlUb01hbnlNYXBwaW5nIG1hcHBpbmcgPSAoSmF2YU1hbnlUb01hbnlNYXBwaW5nKSByZXNvbHZlZEludmVyc2VTaWRlQXR0cmlidXRlCi0JCQkJCS5nZXRNYXBwaW5nKCk7Ci0JCQlNYW55VG9NYW55QW5ub3RhdGlvbiBhID0gbWFwcGluZy5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJaWYobWFwcGluZyA9PSBudWxsIHx8IGEgPT0gbnVsbCl7Ci0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIGludmVyc2VTaWRlSlBUKTsKLQkJCQltYXBwaW5nID0gKEphdmFNYW55VG9NYW55TWFwcGluZykgcmVzb2x2ZWRJbnZlcnNlU2lkZUF0dHJpYnV0ZQotCQkJCQkuZ2V0TWFwcGluZygpOwotCQkJCWEgPSBtYXBwaW5nLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoYSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWEuc2V0TWFwcGVkQnkob3duZXJTaWRlQXR0cmlidXRlLmdldE5hbWUoKSk7CQotCQkJaWYgKGlzTWFwKQotCQkJCXJlc29sdmVkSW52ZXJzZVNpZGVBdHRyaWJ1dGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5hZGRBbm5vdGF0aW9uKE1hcEtleUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJfQkJCi0JCQotCX0KLQkJCi0JcHVibGljIHZvaWQgcmVzdG9yZUVudGl0eUNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCWZwLnJlc3RvcmVFbnRpdHkoanB0KTsKLQl9ICAgIAkKLQkKLQlwdWJsaWMgdm9pZCBmb3JjZVNhdmVFbnRpdHlDbGFzcyhmaW5hbCBKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQlmaW5hbCBJQ29tcGlsYXRpb25Vbml0IGN1ID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCURpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGN1LmlzV29ya2luZ0NvcHkoKSkgCi0JCQkJCQljdS5jb21taXRXb3JraW5nQ29weSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJY3Uuc2F2ZShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoY3UuZ2V0UmVzb3VyY2UoKS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkgJiYgY3UuZ2V0UmVzb3VyY2UoKS5pc0FjY2Vzc2libGUoKSkKLQkJCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBzYXZlIGVudGl0eSAnIiArIGpwdC5nZXROYW1lKCkgKyAiJyIsIGUpOwkvLyROT04tTkxTLTEkCQkvLyROT04tTkxTLTIkCQkKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBkZWxldGVFbnRpdHlDbGFzcyhKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJdHJ5IHsKLQkJCUpwYVByb2plY3QganBhUHJvamVjdCA9IGpwdC5nZXRKcGFQcm9qZWN0KCk7Ci0JCQlqcGFQcm9qZWN0LnVwZGF0ZUFuZFdhaXQoKTsKLQkJCUpQQUVkaXRvclV0aWwuZGlzY2FyZFdvcmtpbmdDb3B5KGN1KTsKLQkJCWN1LmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXJldHVybiB0cnVlOwkJCQotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IGRlbGV0ZSB0aGUgSlBBIGVudGl0eSBjbGFzcyIsIGUpOyAvLyROT04tTkxTLTEkCQkJCQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfSAKLQkgICAKLQlwdWJsaWMgdm9pZCBkZWxldGVQZXJzaXN0ZW5jZVR5cGVSZXNvdXJjZShQZXJzaXN0ZW50VHlwZSB0eXBlKQotCQkJdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlKcGFQcm9qZWN0IHByb2ogPSB0eXBlLmdldEpwYVByb2plY3QoKTsKLQkJU3RyaW5nIHR5cGVOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0JCUlSZXNvdXJjZSBlbnRpdHlSZXNvdXJjZSA9IHR5cGUuZ2V0UmVzb3VyY2UoKTsKLQkJLy90eXBlLmRpc3Bvc2UoKTsKLQkJZW50aXR5UmVzb3VyY2UuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwkKLQkJaW50IGNudCA9IDA7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBnZXRDb250ZXh0UGVyc2lzdGVudFR5cGUocHJvaiwgdHlwZU5hbWUpOwotCQl3aGlsZSAoKGpwdCAhPSBudWxsKSAmJiAoY250IDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoUEFVU0VfRFVSQVRJT04pOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlNsZWVwIGludGVycnVwdGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQl9Ci0JCQljbnQrKzsKLQkJfQotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKEpwYVByb2plY3QganBhUHJvamVjdCwgCi0JCQkJCQkJCQkJCQkJICAgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkVHlwZU5hbWUpIHsKLQkJCi0JCVBlcnNpc3RlbmNlVW5pdCB1bml0ID0gZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOwotCQlmb3IgKENsYXNzUmVmIHJlZiA6IHVuaXQuZ2V0Q2xhc3NSZWZzKCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSByZWYuZ2V0SmF2YVBlcnNpc3RlbnRUeXBlKCk7IAotCQkJaWYgKChqcHQgIT0gbnVsbCkgJiYganB0LmdldE5hbWUoKS5lcXVhbHMoZnVsbHlRdWFsaWZpZWRUeXBlTmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVmLmdldEphdmFQZXJzaXN0ZW50VHlwZSgpOwotCQkJfQotCQl9IAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gbmFtZSBvZiB0aGUgZW50aXR5IGZyb20gQEVudGl0eShuYW1lPSIuLi4iKS4KLQkgKiBJZiB0aGVyZSBpcyBubyBzdWNoIGFubm90YXRpb24sIHJldHVybnMgdGhlIAotCSAqIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW50aXR5TmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybiAiIjsJLy8kTk9OLU5MUy0xJAotCQlKYXZhUmVzb3VyY2VUeXBlIGpycHQgPSBjb252ZXJ0SlBUVG9KUlQoanB0KTsKLQkJaWYgKGpycHQgPT0gbnVsbCkgCi0JCQlyZXR1cm4gIiI7CS8vJE5PTi1OTFMtMSQKLQkJCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSmF2YVR5cGVNYXBwaW5nIG1hcHBpbmcgPSBqcHQuZ2V0TWFwcGluZygpOwotCQlpZiAoKG1hcHBpbmcgIT0gbnVsbCkgJiYgSmF2YUVudGl0eS5jbGFzcy5pc0luc3RhbmNlKG1hcHBpbmcpKQotCQkJbmFtZSA9ICgoSmF2YUVudGl0eSltYXBwaW5nKS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQluYW1lID0ganB0LmdldE5hbWUoKTsKLQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJCQkJCQkJCi0JcHVibGljIGJvb2xlYW4gaGFzTmFtZUFubm90YXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlpZiAoanB0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUphdmFSZXNvdXJjZVR5cGUganJwdCA9IGNvbnZlcnRKUFRUb0pSVChqcHQpOwotCQlpZiAoanJwdCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlKYXZhRW50aXR5IG1hcHBpbmcgPSAoSmF2YUVudGl0eSkganB0LmdldE1hcHBpbmcoKTsKLQkJaWYgKG1hcHBpbmcgIT0gbnVsbCkKLQkJCXJldHVybiAobWFwcGluZy5nZXRTcGVjaWZpZWROYW1lKCkgIT0gbnVsbCk7Ci0JCXJldHVybiBmYWxzZTsKLQkJCQkJCQl9Ci0JCi0JLyoKLQlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZSBqcnB0ID0ganBhLmdldEpwYVByb2plY3QoKQotCQkJCS5nZXRKYXZhUmVzb3VyY2VQZXJzaXN0ZW50VHlwZShqcGEuZ2V0TmFtZSgpKTsKLQkJQVNUTm9kZSBuZCA9IGpycHQuZ2V0TWVtYmVyKCkuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpLmdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChuZCBpbnN0YW5jZW9mIFR5cGVEZWNsYXJhdGlvbikgewotCQkJTGlzdEl0ZXJhdG9yPD8+IG1vZGZzID0gKChUeXBlRGVjbGFyYXRpb24pIG5kKS5tb2RpZmllcnMoKQotCQkJCQkubGlzdEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobW9kZnMuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG1vZGYgPSBtb2Rmcy5uZXh0KCk7Ci0JCQkJaWYgKG1vZGYgaW5zdGFuY2VvZiBOb3JtYWxBbm5vdGF0aW9uKSB7Ci0JCQkJCU5vcm1hbEFubm90YXRpb24gYW4gPSAoTm9ybWFsQW5ub3RhdGlvbiltb2RmOwotCQkJCQkJTGlzdDxNZW1iZXJWYWx1ZVBhaXI+IHZhbHMgPSBhbi52YWx1ZXMoKTsKLQkJCQkJCWlmICh2YWxzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCQkJTWVtYmVyVmFsdWVQYWlyIG12cCA9IHZhbHMuZ2V0KGkpOwotCQkJCQkJCQlpZiAobXZwLmdldE5hbWUoKS50b1N0cmluZygpLmVxdWFscygibmFtZSIpKSA7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gSlBBRWRpdG9yVXRpbC5zdHJpcFF1b3RlcyhtdnAuZ2V0VmFsdWUoKQotCQkJCQkJCQkJLnRvU3RyaW5nKCkpOwotCQkJCQkJCQkKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJfSAJCQkKLQkJCX0KLQkJfQkJCi0JCXJldHVybiBqcGEuZ2V0TmFtZSgpOwotCX0KLQkqLwotCQotCXB1YmxpYyBib29sZWFuIGhhc0VudGl0eUFubm90YXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlyZXR1cm4gKGpwdC5nZXRNYXBwaW5nKCkgaW5zdGFuY2VvZiBKYXZhRW50aXR5KTsKLQl9CQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lmaWVkRW50aXR5TmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0KXsKLQkJSmF2YUVudGl0eSBnamUgPSAoSmF2YUVudGl0eSkganB0LmdldE1hcHBpbmcoKTsKLQkJcmV0dXJuIGdqZS5nZXRTcGVjaWZpZWROYW1lKCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbmFtZUVudGl0eShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgbmV3TmFtZSkgewotCQlKYXZhRW50aXR5IGdqZSA9IChKYXZhRW50aXR5KWpwdC5nZXRNYXBwaW5nKCk7Ci0JCWdqZS5zZXRTcGVjaWZpZWROYW1lKG5ld05hbWUpOwkKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGFkZEF0dHJpYnV0ZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBhdHRyaWJ1dGVUeXBlLCAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgYm9vbGVhbiBpc0NvbGxlY3Rpb24sIElDb21waWxhdGlvblVuaXQgY3UxLAotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIpIHsKLQkJCi0JCXJldHVybiBhZGRBdHRyaWJ1dGUoZnAsIGpwdCwgYXR0cmlidXRlVHlwZSwgbnVsbCwgYXR0cmlidXRlTmFtZSwKLQkJCQlhY3ROYW1lLCBpc0NvbGxlY3Rpb24sIGN1MSwgY3UyKTsKLQl9Ci0JCi0JcHVibGljIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGFkZEF0dHJpYnV0ZShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCQkJCQkJCQkJCUphdmFQZXJzaXN0ZW50VHlwZSBhdHRyaWJ1dGVUeXBlLCBTdHJpbmcgbWFwS2V5VHlwZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJCQkJCQlTdHJpbmcgYWN0TmFtZSwgYm9vbGVhbiBpc0NvbGxlY3Rpb24sIElDb21waWxhdGlvblVuaXQgY3UxLAotCQkJCQkJCQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIpIHsKLQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlKUEFFZGl0b3JVdGlsLmNyZWF0ZUltcG9ydChjdTEsIGN1Mi5nZXRUeXBlKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKS5nZXRFbGVtZW50TmFtZSgpKTsKLQkJCXR5cGUgPSBjdTEuZmluZFByaW1hcnlUeXBlKCk7CQotCQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQkJaWYgKGRvZXNBdHRyaWJ1dGVFeGlzdChqcHQsIGFjdE5hbWUpKSB7Ci0JCQkJcmV0dXJuIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSkganB0Ci0JCQkJCQkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJCX0KLQkJCWlmIChpc0NvbGxlY3Rpb24pIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0ganB0LmdldEpwYVByb2plY3QoKS5nZXRQcm9qZWN0KCk7Ci0JCQkJUHJvcGVydGllcyBwcm9wcyA9IGZwLmxvYWRQcm9wZXJ0aWVzKHByb2plY3QpOwotCi0JCQkJaWYgKEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuaXNDb2xsZWN0aW9uVHlwZShwcm9qZWN0LCBwcm9wcykpIHsKLQkJCQkJY3JlYXRlQ29udGVudFR5cGUoYXR0cmlidXRlVHlwZSwgYWN0TmFtZSwgY3UxLCB0eXBlLCBDT0xMRUNUSU9OX1RZUEUpOwotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5HZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgCi0JCQkJCQkJYWN0TmFtZSwgQ09MTEVDVElPTl9UWVBFKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCXR5cGUuY3JlYXRlTWV0aG9kKGdlblNldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0cmlidXRlTmFtZSwKLQkJCQkJCQlKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBDT0xMRUNUSU9OX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGVsc2UgaWYgKEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuaXNMaXN0VHlwZShwcm9qZWN0LCBwcm9wcykpIHsKLQkJCQkJY3JlYXRlQ29udGVudFR5cGUoYXR0cmlidXRlVHlwZSwgYWN0TmFtZSwgY3UxLCB0eXBlLCBMSVNUX1RZUEUpOwotCQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5HZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgCi0JCQkJCQkJYWN0TmFtZSwgTElTVF9UWVBFKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCXR5cGUuY3JlYXRlTWV0aG9kKGdlblNldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0cmlidXRlTmFtZSwKLQkJCQkJCQlKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBMSVNUX1RZUEUpLCBudWxsLCBmYWxzZSwKLQkJCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGVsc2UgaWYgKEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuaXNTZXRUeXBlKHByb2plY3QsIHByb3BzKSkgewotCQkJCQljcmVhdGVDb250ZW50VHlwZShhdHRyaWJ1dGVUeXBlLCBhY3ROYW1lLCBjdTEsIHR5cGUsIFNFVF9UWVBFKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCUpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSksIAotCQkJCQkJCWFjdE5hbWUsIFNFVF9UWVBFKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCXR5cGUuY3JlYXRlTWV0aG9kKGdlblNldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0cmlidXRlTmFtZSwKLQkJCQkJCQlKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBTRVRfVFlQRSksIG51bGwsIGZhbHNlLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW1hcEtleVR5cGUgPSBjcmVhdGVDb250ZW50VHlwZShtYXBLZXlUeXBlLCBhdHRyaWJ1dGVUeXBlLCBhY3ROYW1lLCBjdTEsIHR5cGUsIE1BUF9UWVBFKTsKLQkJCQkJdHlwZS5jcmVhdGVNZXRob2QoZ2VuR2V0dGVyV2l0aEFwcHJvcHJpYXRlVHlwZShhdHRyaWJ1dGVOYW1lLCBtYXBLZXlUeXBlLAotCQkJCQkJCUpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhdHRyaWJ1dGVUeXBlLmdldE5hbWUoKSksIAotCQkJCQkJCWFjdE5hbWUsIE1BUF9UWVBFKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCXR5cGUuY3JlYXRlTWV0aG9kKGdlblNldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0cmlidXRlTmFtZSwgbWFwS2V5VHlwZSwKLQkJCQkJCQlKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCAKLQkJCQkJCQlhY3ROYW1lLCBNQVBfVFlQRSksIG51bGwsIGZhbHNlLAotCQkJCQkJCW5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJdHlwZQotCQkJCQkJLmNyZWF0ZUZpZWxkKAotCQkJCQkJCQkiICBwcml2YXRlICIgKyBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpICsgIiAiICsgSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKSArICI7IiwgbnVsbCwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCXR5cGUuY3JlYXRlTWV0aG9kKGdlbkdldHRlckNvbnRlbnRzKGF0dHJpYnV0ZU5hbWUsCi0JCQkJCQlKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYXR0cmlidXRlVHlwZS5nZXROYW1lKCkpLCBudWxsLAotCQkJCQkJYWN0TmFtZSwgbnVsbCwgaXNDb2xsZWN0aW9uKSwgbnVsbCwgZmFsc2UsCi0JCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl0eXBlLmNyZWF0ZU1ldGhvZChnZW5TZXR0ZXJDb250ZW50cyhhdHRyaWJ1dGVOYW1lLAotCQkJCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSwgbnVsbCwKLQkJCQkJCWFjdE5hbWUsIGlzQ29sbGVjdGlvbiksIG51bGwsIGZhbHNlLAotCQkJCQkJbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ubm90IGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgd2l0aCBuYW1lICIgKyBhdHRyaWJ1dGVOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAkJCQkKLQkJfQotCQkKLQkJaWYoanB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpID09IG51bGwpewotCQkJICAgcmVmcmVzaEVudGl0eU1vZGVsKGZwLCBqcHQpOwotCQl9Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXMgPSAgZ2V0QXR0cmlidXRlRnJvbUVudGl0eShqcHQsIGFjdE5hbWUpOwotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250ZW50VHlwZShKYXZhUGVyc2lzdGVudFR5cGUgYXR0cmlidXRlVHlwZSwKLQkJCVN0cmluZyBhY3ROYW1lLCBJQ29tcGlsYXRpb25Vbml0IGN1MSwgSVR5cGUgdHlwZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlKQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWNyZWF0ZUNvbnRlbnRUeXBlKG51bGwsIGF0dHJpYnV0ZVR5cGUsCi0JCQkJYWN0TmFtZSwgY3UxLCB0eXBlLCBjb2xsZWN0aW9uVHlwZSk7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGNyZWF0ZUNvbnRlbnRUeXBlKFN0cmluZyBtYXBLZXlUeXBlLCBKYXZhUGVyc2lzdGVudFR5cGUgYXR0cmlidXRlVHlwZSwKLQkJCVN0cmluZyBhY3ROYW1lLCBJQ29tcGlsYXRpb25Vbml0IGN1MSwgSVR5cGUgdHlwZSwgU3RyaW5nIGNvbGxlY3Rpb25UeXBlKQotCQkJdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQlpZiAobWFwS2V5VHlwZSAhPSBudWxsKSB7Ci0JCQltYXBLZXlUeXBlID0gSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnQoY3UxLCBtYXBLZXlUeXBlKTsgCi0JCX0KLQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnQoY3UxLCBjb2xsZWN0aW9uVHlwZSk7Ci0JCXR5cGUuY3JlYXRlRmllbGQoCi0JCQkJIiAgcHJpdmF0ZSAiICsgSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGNvbGxlY3Rpb25UeXBlKSArICI8IiArLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJKChtYXBLZXlUeXBlICE9IG51bGwpID8gKG1hcEtleVR5cGUgKyAiLCAiKSA6ICIiKSArCQkJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJpYnV0ZVR5cGUuZ2V0TmFtZSgpKSArICI+ICIgKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpICsgIC8vJE5PTi1OTFMtMSQKLQkJCQkiOyIsIG51bGwsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsgLy8kTk9OLU5MUy0xJCAKLQkJcmV0dXJuIG1hcEtleVR5cGU7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlZnJlc2hFbnRpdHlNb2RlbChJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmKGNvbnZlcnRKUFRUb0pSVChqcHQpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChmcCA9PSBudWxsKSB7Ci0JCQlqcHQudXBkYXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU2hhcGUgZWwgPSAoU2hhcGUpIGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpOwotCQlpZihKUEFDaGVja1N1bS5JTlNUQU5DRSgpLmlzRW50aXR5TW9kZWxDaGFuZ2VkKGVsLCBqcHQuZ2V0SnBhUHJvamVjdCgpKSl7Ci0JCQl0cnkgewotCQkJCWpwdC51cGRhdGUoKTsKLQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCi0JCQl9Ci0JCX0KLQl9Ci0JCi0JcHVibGljIGJvb2xlYW4gaXNDb2xsZWN0aW9uKENvbnRhaW5lclNoYXBlIGVudGl0eVNoYXBlLAotCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgU3RyaW5nIGF0dHJUeHQpIHsKLQkJT2JqZWN0IG9iID0gZnAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGVudGl0eVNoYXBlKTsKLQkJaWYob2IgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudFR5cGUpewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG9iOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJCUlUeXBlIHR5cGUgPSBjdS5nZXRUeXBlKEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShqcHQuZ2V0TmFtZSgpKSk7Ci0JCQlJRmllbGQgZmllbGQgPSB0eXBlLmdldEZpZWxkKGF0dHJUeHQpOwotCQkJaW50IGNudCA9IDA7Ci0JCQl3aGlsZSAoKGNudCA8IDIwKSAmJiAhZmllbGQuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlNsZWVwIGludGVycnVwdGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfQotCQkJCWZpZWxkID0gdHlwZS5nZXRGaWVsZChhdHRyVHh0KTsKLQkJCQljbnQrKzsKLQkJCX0KLQkJCWlmIChmaWVsZC5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCWlmKGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKS5jb250YWlucygiTGlzdCIpIHx8IGZpZWxkLmdldFR5cGVTaWduYXR1cmUoKS5jb250YWlucygiU2V0IikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfHwgZmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpLmNvbnRhaW5zKCJDb2xsZWN0aW9uIikgfHwgZmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpLmNvbnRhaW5zKCJNYXAiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQl8fCBmaWVsZC5nZXRUeXBlU2lnbmF0dXJlKCkuZW5kc1dpdGgoIltdIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoSlBBRWRpdG9yTWVzc2FnZXMuSnBhQXJ0aWZhY3RGYWN0b3J5X0Nhbk5vdENoZWNrUmV0dXJuVHlwZSArCi0JCQkJCQkJIiAiICsgYXR0clR4dCArICJcIiIsIGUpOyAvLyROT04tTkxTLTEkCQkvLyROT04tTkxTLTIkCQkKLQkJCQl9CQkJCQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0dldHRlck1ldGhvZFJldHVyblR5cGVDb2xsZWN0aW9uKAotCQkJQ29udGFpbmVyU2hhcGUgZW50aXR5U2hhcGUsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCQlTdHJpbmcgYXR0clR4dCkgewotCQlPYmplY3Qgb2IgPSBmcC5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoZW50aXR5U2hhcGUpOwotCQlpZihvYiBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50VHlwZSl7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBvYjsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQkJSVR5cGUgdHlwZSA9IGN1LmdldFR5cGUoSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGpwdC5nZXROYW1lKCkpKTsKLQkJCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyID0gYXR0clR4dC5zdWJzdHJpbmcoMCwgMSkKLQkJCQkJLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKQotCQkJCQkrIGF0dHJUeHQuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgbWV0aG9kTmFtZSA9ICJnZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlcjsgIC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZCBtZXRob2QgPSB0eXBlLmdldE1ldGhvZChtZXRob2ROYW1lLCBuZXcgU3RyaW5nWzBdKTsKLQkJdHJ5IHsKLQkJCWlmKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuY29udGFpbnMoIkxpc3QiKSB8fCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmNvbnRhaW5zKCJTZXQiKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfHwgbWV0aG9kLmdldFJldHVyblR5cGUoKS5jb250YWlucygiQ29sbGVjdGlvbiIpIHx8IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkuY29udGFpbnMoIk1hcCIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl8fCBtZXRob2QuZ2V0UmV0dXJuVHlwZSgpLmVuZHNXaXRoKCJbXSIpKSAvLyROT04tTkxTLTEkCi0JCQkgIHJldHVybiB0cnVlOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihKUEFFZGl0b3JNZXNzYWdlcy5KcGFBcnRpZmFjdEZhY3RvcnlfQ2FuTm90Q2hlY2tSZXR1cm5UeXBlICsgCi0JCQkJCSIgIiArIGF0dHJUeHQgKyAiXCIiLCBlKTsgLy8kTk9OLU5MUy0xJAkJLy8kTk9OLU5MUy0yJAkJCi0JCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgY3JlYXRlTmV3QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIAotCQkJYm9vbGVhbiBpc0NvbGxlY3Rpb24sIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUlDb21waWxhdGlvblVuaXQgaWpsID0gZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCk7Ci0JCVN0cmluZyBhdHRyVHlwZU5hbWUgPSAiamF2YS5sYW5nLlN0cmluZyI7IAkJCQkJCQkJCQkJCQkJCQkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3QXR0ck5hbWUgPSBnZW5VbmlxdWVBdHRyTmFtZShqcHQsIGF0dHJUeXBlTmFtZSwgZnApOwotCQlyZXR1cm4gYWRkTmV3QXR0cmlidXRlKGpwdCwgaWpsLCBuZXdBdHRyTmFtZSwgYXR0clR5cGVOYW1lLAotCQkJCSJAQmFzaWMiLCBuZXdBdHRyTmFtZSwgaXNDb2xsZWN0aW9uLCBmcCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoKLQkgKiBwdWJsaWMgU3RyaW5nIGNyZWF0ZU5ld0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBTdHJpbmcgYXR0ck5hbWUsCi0JICogU3RyaW5nIGF0dHJUeXBlTmFtZSwgU3RyaW5nIGFubm90YXRpb24sIFN0cmluZyBhY3ROYW1lLCBib29sZWFuCi0JICogaXNDb2xsZWN0aW9uLCBKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkgKiAKLQkgKiBJQ29tcGlsYXRpb25Vbml0IGlqbCA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOyByZXR1cm4KLQkgKiBhZGROZXdBdHRyaWJ1dGUoanB0LCBpamwsIGF0dHJOYW1lLCBhdHRyVHlwZU5hbWUsIGFubm90YXRpb24sIGFjdE5hbWUsCi0JICogaXNDb2xsZWN0aW9uLCBmcCk7IH0KLQkqLwotCQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBjcmVhdGVBTmV3QXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIAotCQkJU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clR5cGVOYW1lLCBTdHJpbmdbXSBhdHRyVHlwZUVsZW1lbnROYW1lcywKLQkJCVN0cmluZyBhY3ROYW1lLCBMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLAotCQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBpamwgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJcmV0dXJuIGFkZEFOZXdBdHRyaWJ1dGUoanB0LCBpamwsIGF0dHJOYW1lLCBhdHRyVHlwZU5hbWUsCi0JCQkJYXR0clR5cGVFbGVtZW50TmFtZXMsIGFjdE5hbWUsIGFubm90YXRpb25zLCBpc0NvbGxlY3Rpb24sCi0JCQkJaXNNZXRob2RBbm5vdGF0ZWQsIGZwKTsKLQl9Ci0JCQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYWRkQU5ld0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCUlDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlTmFtZSwKLQkJCVN0cmluZ1tdIGF0dHJUeXBlRWxlbWVudE5hbWVzLCBTdHJpbmcgYWN0TmFtZSwKLQkJCUxpc3Q8U3RyaW5nPiBhbm5vdGF0aW9ucywgYm9vbGVhbiBpc0NvbGxlY3Rpb24sCi0JCQlib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWF0dHIgPSBtYWtlTmV3QXR0cmlidXRlKGZwLCBqcHQsIGN1LCBhdHRyTmFtZSwgYXR0clR5cGVOYW1lLAotCQkJCQlhdHRyVHlwZUVsZW1lbnROYW1lcywgYWN0TmFtZSwgYW5ub3RhdGlvbnMsIGlzQ29sbGVjdGlvbiwKLQkJCQkJaXNNZXRob2RBbm5vdGF0ZWQpOwotCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IGNyZWF0ZSBhIG5ldyBhdHRyaWJ1dGUgd2l0aCBuYW1lICIgKyBhdHRyTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JCXJldHVybiBhdHRyOwkJCQkJCQotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGFkZE5ld0F0dHJpYnV0ZShKYXZhUGVyc2lzdGVudFR5cGUganB0LCBJQ29tcGlsYXRpb25Vbml0IGN1LAotCQkJU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clR5cGVOYW1lLCBTdHJpbmcgYW5ub3RhdGlvbiwKLQkJCVN0cmluZyBhY3ROYW1lLCBib29sZWFuIGlzQ29sbGVjdGlvbiwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJdHJ5IHsKLQkJCUxpc3Q8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQkJCWFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCWJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKQotCQkJCQkuaXNNZXRob2RBbm5vdGF0ZWQoanB0KTsKLQkJCW1ha2VOZXdBdHRyaWJ1dGUoZnAsIGpwdCwgY3UsIGF0dHJOYW1lLCBhdHRyVHlwZU5hbWUsIG51bGwsIGFjdE5hbWUsCi0JCQkJCWFubm90YXRpb25zLCBpc0NvbGxlY3Rpb24sIGlzTWV0aG9kQW5ub3RhdGVkKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIHdpdGggbmFtZSAiICsgYXR0ck5hbWUsIGUpOyAvLyROT04tTkxTLTEkCQkKLQkJfQotCQlyZXR1cm4gYXR0ck5hbWU7CQkJCQotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFrZU5ld0F0dHJpYnV0ZShJRmVhdHVyZVByb3ZpZGVyIGZwLCBKYXZhUGVyc2lzdGVudFR5cGUganB0LCAKLQkJCUlDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJUeXBlTmFtZSwKLQkJCVN0cmluZ1tdIGF0dHJUeXBlcywgU3RyaW5nIGFjdE5hbWUsCi0JCQlMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gaXNDb2xsZWN0aW9uLAotCQkJYm9vbGVhbiBpc01ldGhvZEFubm90YXRlZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCQotCQlJVHlwZSB0eXBlID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0JCVN0cmluZyBjb250ZW50cyA9ICIiOyAJCQkJCQkJCQkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJaXNNZXRob2RBbm5vdGF0ZWQgPSAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgJiYgKCFhbm5vdGF0aW9ucy5pc0VtcHR5KCkpID8gaXNNZXRob2RBbm5vdGF0ZWQKLQkJCQk6IEpwYUFydGlmYWN0RmFjdG9yeS5JTlNUQU5DRS5pc01ldGhvZEFubm90YXRlZChqcHQpOwotCQkKLQkJaWYgKCFpc01ldGhvZEFubm90YXRlZCkgewotCQkJaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvcjxTdHJpbmc+IGl0ID0gYW5ub3RhdGlvbnMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCVN0cmluZyBhbiA9IGl0Lm5leHQoKTsKLQkJCQkJY29udGVudHMgKz0gIiAgICIgKyBhbiArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0JCQkJCQkJCi0JCQl9Ci0JCX0KLQkJCi0JCWlmKGFubm90YXRpb25zIT1udWxsICYmIGFubm90YXRpb25zLmNvbnRhaW5zKCJAQmFzaWMiKSl7IC8vJE5PTi1OTFMtMSQKLQkJCWlmKCFjdS5nZXRJbXBvcnQoImphdmF4LnBlcnNpc3RlbmNlLioiKS5leGlzdHMoKSAmJiAhY3UuZ2V0SW1wb3J0KCJqYXZheC5wZXJzaXN0ZW5jZS5CYXNpYyIpLmV4aXN0cygpKXsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnRzKGN1LCAiamF2YXgucGVyc2lzdGVuY2UuQmFzaWMiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCQotCQlib29sZWFuIHNob3VsZEFkZEltcG9ydCA9IHRydWU7Ci0JCUlJbXBvcnREZWNsYXJhdGlvbltdIGltcG9ydERlY2xhcmF0aW9ucyA9IGN1LmdldEltcG9ydHMoKTsKLQkJU3RyaW5nIGF0dHJTaG9ydFR5cGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJUeXBlTmFtZSk7Ci0JCWZvcihJSW1wb3J0RGVjbGFyYXRpb24gaW1wb3J0RGVjbCA6IGltcG9ydERlY2xhcmF0aW9ucyl7Ci0JCQlTdHJpbmcgaW1wb3J0ZWREZWNsYXJhdGlvbkZRTiA9IGltcG9ydERlY2wuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCVN0cmluZyBpbXBvcnRlZERlY2xhcmF0aW9uU2hvcnROYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGltcG9ydGVkRGVjbGFyYXRpb25GUU4pOwotCQkJaWYoYXR0clNob3J0VHlwZU5hbWUuZXF1YWxzKGltcG9ydGVkRGVjbGFyYXRpb25TaG9ydE5hbWUpICYmICFhdHRyVHlwZU5hbWUuZXF1YWxzKGltcG9ydGVkRGVjbGFyYXRpb25GUU4pKQotCQkJCXNob3VsZEFkZEltcG9ydCA9IGZhbHNlOwotCQl9Ci0JCQotCQlpZihzaG91bGRBZGRJbXBvcnQpewotCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnRzKGN1LCBhdHRyVHlwZU5hbWUpOwotCQkgICAgYXR0clR5cGVOYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGF0dHJUeXBlTmFtZSk7Ci0JCX0KLQkJaWYgKChhdHRyVHlwZXMgIT0gbnVsbCkgJiYgKGF0dHJUeXBlcy5sZW5ndGggPiAwKSkgewotCQkJSlBBRWRpdG9yVXRpbC5jcmVhdGVJbXBvcnRzKGN1LCBhdHRyVHlwZXMpOwotCQl9Ci0JCQotCQljb250ZW50cyArPSAiICAgIHByaXZhdGUgIiArIGF0dHJUeXBlTmFtZSArIC8vJE5PTi1OTFMtMSQKLQkJCQkoKGF0dHJUeXBlcyA9PSBudWxsKSA/ICIiIDogKCI8IiArIEpQQUVkaXRvclV0aWwuY3JlYXRlQ29tbWFTZXBhcmF0ZWRMaXN0T2ZTaW1wbGVUeXBlTmFtZXMoYXR0clR5cGVzKSArICI+IikpICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkiICIgKyBhdHRyTmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQkKLQotCQl0eXBlLmNyZWF0ZU1ldGhvZCgKLQkJCQlnZW5TZXR0ZXJDb250ZW50cyhhdHRyTmFtZSwgYXR0clR5cGVOYW1lLCBhdHRyVHlwZXMsCi0JCQkJCQlhY3ROYW1lLCBpc0NvbGxlY3Rpb24pLCBudWxsLCBmYWxzZSwKLQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQl0eXBlLmNyZWF0ZU1ldGhvZCgKLQkJCQkJZ2VuR2V0dGVyQ29udGVudHMoYXR0ck5hbWUsIGF0dHJUeXBlTmFtZSwKLQkJCQkJCQlhdHRyVHlwZXMsIGFjdE5hbWUsIGFubm90YXRpb25zLAotCQkJCQkJCWlzQ29sbGVjdGlvbiksIG51bGwsIGZhbHNlLAotCQkJCQluZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXR5cGUuY3JlYXRlRmllbGQoY29udGVudHMsIG51bGwsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBlbHNlIHsKLQkJCXR5cGUuY3JlYXRlRmllbGQoY29udGVudHMsIG51bGwsIGZhbHNlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCXR5cGUuY3JlYXRlTWV0aG9kKAotCQkJCQlnZW5HZXR0ZXJDb250ZW50cyhhdHRyTmFtZSwgYXR0clR5cGVOYW1lLAotCQkJCQkJCWF0dHJUeXBlcywgYWN0TmFtZSwgbnVsbCwgaXNDb2xsZWN0aW9uKSwKLQkJCQkJbnVsbCwgZmFsc2UsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9CQkKLQkJCi0JCWludCBjbnQgPSAwOwotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyTmFtZSk7Ci0JCXdoaWxlICgoanBhID09IG51bGwpICYmIChjbnQgPCAyNSkpIHsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcihlKTsKLQkJCX0KLQkJCWpwYSA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyTmFtZSk7Ci0JCQljbnQrKzsKLQkJfQotCQkJCi0JCS8qCi0JCWlmKGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyTmFtZSkgPT0gbnVsbCl7Ci0JCQkgICByZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCX0KLQkJKi8KLQkJCi0JCXJldHVybiBnZXRBdHRyaWJ1dGVGcm9tRW50aXR5KGpwdCwgYXR0ck5hbWUpOwotCX0KLQkJCi0JcHVibGljIHZvaWQgZGVsZXRlQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLAotCQkJCQkJCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlTdHJpbmcgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlciA9IGF0dHJpYnV0ZU5hbWUuc3Vic3RyaW5nKDAsIDEpCi0JCQkJLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKQotCQkJCSsgYXR0cmlidXRlTmFtZS5zdWJzdHJpbmcoMSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcFVuaXQgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsJCQotCQlJVHlwZSBqYXZhVHlwZSA9IGNvbXBVbml0LmZpbmRQcmltYXJ5VHlwZSgpOwotCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSA9IG51bGw7Ci0JCVN0cmluZyBnZXR0ZXJQcmVmaXggPSAiZ2V0IjsgCQkJLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IAotCQlJTWV0aG9kIGdldEF0dHJpYnV0ZU1ldGhvZCA9IGphdmFUeXBlLmdldE1ldGhvZChtZXRob2ROYW1lLAotCQkJCW5ldyBTdHJpbmdbMF0pOwotCQlpZiAoIWdldEF0dHJpYnV0ZU1ldGhvZC5leGlzdHMoKSkgewotCQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKGF0dHJpYnV0ZU5hbWUpOwotCQkJU3RyaW5nIHR5cGVOYW1lID0ganBhLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0VHlwZU5hbWUoKTsKLQkJCWlmICgiYm9vbGVhbiIuZXF1YWxzKHR5cGVOYW1lKSkgewkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJZ2V0dGVyUHJlZml4ID0gImlzIjsJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IAkJCQkKLQkJCQlnZXRBdHRyaWJ1dGVNZXRob2QgPSBqYXZhVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwKLQkJCQkJCW5ldyBTdHJpbmdbMF0pOwotCQkJfQkJCi0JCQl0cnkgewotCQkJCWlmICgoZ2V0QXR0cmlidXRlTWV0aG9kICE9IG51bGwpICYmIGdldEF0dHJpYnV0ZU1ldGhvZC5leGlzdHMoKSk7Ci0JCQkJCXR5cGVTaWduYXR1cmUgPSBnZXRBdHRyaWJ1dGVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUxKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IG9idGFpbiB0aGUgdHlwZSBvZiB0aGUgZ2V0dGVyIHdpdGggbmFtZSAiICsgbWV0aG9kTmFtZSArICIoKSIsIGUxKTsgCS8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQkJfQkJCQotCQl9Ci0JCWlmICh0eXBlU2lnbmF0dXJlID09IG51bGwpCi0JCSAJbWV0aG9kTmFtZSA9IG51bGw7CQkKLQkJCi0JCWJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKQotCQkJCS5pc01ldGhvZEFubm90YXRlZChqcHQpOwotCQlpZiAoaXNNZXRob2RBbm5vdGF0ZWQpIHsKLQkJCXRyeSB7Ci0JCQkJSUZpZWxkIGF0dHJpYnV0ZUZpZWxkID0gamF2YVR5cGUuZ2V0RmllbGQoYXR0cmlidXRlTmFtZSk7Ci0JCQkJCi0JCQkJaWYgKChhdHRyaWJ1dGVGaWVsZCAhPSBudWxsKSAmJiAhYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpCi0JCQkJCWF0dHJpYnV0ZUZpZWxkID0gamF2YVR5cGUuZ2V0RmllbGQoSlBBRWRpdG9yVXRpbC5yZXZlcnRGaXJzdExldHRlckNhc2UoYXR0cmlidXRlTmFtZSkpOwotCQkJCWlmICgoYXR0cmlidXRlRmllbGQgIT0gbnVsbCkgJiYgYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpIAotCQkJCQlhdHRyaWJ1dGVGaWVsZC5kZWxldGUodHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBmaWVsZCB3aXRoIG5hbWUgIiArIGF0dHJpYnV0ZU5hbWUsIGUpOyAJLy8kTk9OLU5MUy0xJAkKLQkJCX0gCi0JCQl0cnkgewotCQkJCW1ldGhvZE5hbWUgPSBnZXR0ZXJQcmVmaXggKyBhdHRyTmFtZVdpdGhDYXBpdGFsTGV0dGVyOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGdldEF0dHJpYnV0ZU1ldGhvZCAhPSBudWxsKSB7Ci0JCQkJCXR5cGVTaWduYXR1cmUgPSBnZXRBdHRyaWJ1dGVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCQlpZiAoZ2V0QXR0cmlidXRlTWV0aG9kLmV4aXN0cygpKQotCQkJCQkJZ2V0QXR0cmlidXRlTWV0aG9kLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW1vdmUgdGhlIGF0dHJpYnV0ZSBnZXR0ZXIgd2l0aCBuYW1lICIgKyBtZXRob2ROYW1lICsgIigpIiwgZSk7IAkvLyROT04tTkxTLTEkCSAvLyROT04tTkxTLTIkCi0JCQl9IAkKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZ2V0QXR0cmlidXRlTWV0aG9kLmV4aXN0cygpKSB7Ci0JCQkJCXR5cGVTaWduYXR1cmUgPSBnZXRBdHRyaWJ1dGVNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotCQkJCQlnZXRBdHRyaWJ1dGVNZXRob2QuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbW92ZSB0aGUgYXR0cmlidXRlIGdldHRlciB3aXRoIG5hbWUgIiArIG1ldGhvZE5hbWUgKyAiKCkiLCBlKTsgCS8vJE5PTi1OTFMtMSQJIC8vJE5PTi1OTFMtMiQKLQkJCX0gCQotCQkJdHJ5IHsKLQkJCQlJRmllbGQgYXR0cmlidXRlRmllbGQgPSBqYXZhVHlwZS5nZXRGaWVsZChhdHRyaWJ1dGVOYW1lKTsKLQkJCQlpZiAoYXR0cmlidXRlRmllbGQgIT0gbnVsbCkKLQkJCQkJaWYgKCFhdHRyaWJ1dGVGaWVsZC5leGlzdHMoKSkKLQkJCQkJCWF0dHJpYnV0ZUZpZWxkID0gamF2YVR5cGUuZ2V0RmllbGQoSlBBRWRpdG9yVXRpbC5yZXZlcnRGaXJzdExldHRlckNhc2UoYXR0cmlidXRlTmFtZSkpOwkJCQotCQkJCWlmICgoYXR0cmlidXRlRmllbGQgIT0gbnVsbCkgJiYgYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpCi0JCQkJCWF0dHJpYnV0ZUZpZWxkLmRlbGV0ZSh0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbW92ZSB0aGUgYXR0cmlidXRlIGZpZWxkIHdpdGggbmFtZSAiICsgYXR0cmlidXRlTmFtZSwgZSk7IAkvLyROT04tTkxTLTEkCQotCQkJfSAJCQkKLQkJfQotCQl0cnkgewotCQkJbWV0aG9kTmFtZSA9ICJzZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlcjsgLy8kTk9OLU5MUy0xJAotCQkJSU1ldGhvZCBzZXRBdHRyaWJ1dGVNZXRob2QgPSBqYXZhVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwKLQkJCQkJbmV3IFN0cmluZ1tdIHsgdHlwZVNpZ25hdHVyZSB9KTsKLQkJCWlmICgoc2V0QXR0cmlidXRlTWV0aG9kICE9IG51bGwpICYmIHNldEF0dHJpYnV0ZU1ldGhvZC5leGlzdHMoKSkKLQkJCQlzZXRBdHRyaWJ1dGVNZXRob2QuZGVsZXRlKHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbW92ZSB0aGUgYXR0cmlidXRlIHNldHRlciB3aXRoIG5hbWUgIiArIG1ldGhvZE5hbWUgKyAiKC4uLikiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCQotCQl9IAkJCi0JCQotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBqcHQucmVzb2x2ZUF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKGF0ICE9IG51bGwpICYmIChjIDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgeyAKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKFBBVVNFX0RVUkFUSU9OKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJUaHJlYWQuc2xlZXAoKSBpbnRlcnJ1cHRlZCIsIGUpOyAvLyROT04tTkxTLTEkCQkKLQkJCX0JCi0JCQlhdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsJCQkKLQkJCWMrKzsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlblVuaXF1ZUF0dHJOYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIAotCQkJU3RyaW5nIGF0dHJUeXBlTmFtZSwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBpamwgPSBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KTsKLQkJSVR5cGUgdHlwZSA9IG51bGw7Ci0JCXR5cGUgPSBpamwuZmluZFByaW1hcnlUeXBlKCk7Ci0JCVNldDxTdHJpbmc+IGF0dHJOYW1lcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLQkJZm9yIChTdHJpbmcgbmFtZSA6IGpwdC5nZXRBdHRyaWJ1dGVOYW1lcygpKSB7Ci0JCQlhdHRyTmFtZXMuYWRkKG5hbWUpOwotCQl9CQkKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwMDAwMDAwOyBpKyspIHsKLQkJCW5hbWUgPSAiYXR0cmlidXRlIiArIGk7ICAJLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXIgPSBKUEFFZGl0b3JVdGlsCi0JCQkJCS5jYXBpdGFsaXplRmlyc3RMZXR0ZXIobmFtZSk7Ci0JCQlTdHJpbmcgZ2V0dGVyTmFtZSA9ICJnZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbExldHRlcjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHNldHRlck5hbWUgPSAic2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxMZXR0ZXI7ICAvLyROT04tTkxTLTEkCi0JCQlpZiAoIWF0dHJOYW1lcy5jb250YWlucyhuYW1lKSkgewotCQkJCUlGaWVsZCBmbGQgPSB0eXBlLmdldEZpZWxkKG5hbWUpOwotCQkJCUlNZXRob2QgZ2V0dGVyID0gdHlwZS5nZXRNZXRob2QoZ2V0dGVyTmFtZSwgbmV3IFN0cmluZ1tdIHt9KTsKLQkJCQlJTWV0aG9kIHNldHRlcjEgPSB0eXBlLmdldE1ldGhvZChzZXR0ZXJOYW1lLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgYXR0clR5cGVOYW1lIH0pOwotCQkJCUlNZXRob2Qgc2V0dGVyMiA9IHR5cGUuZ2V0TWV0aG9kKHNldHRlck5hbWUsCi0JCQkJCQluZXcgU3RyaW5nW10geyAiUVNldDxRIiArIGF0dHJUeXBlTmFtZSArICI7PjsiIH0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJTWV0aG9kIHNldHRlcjMgPSB0eXBlCi0JCQkJCQkuZ2V0TWV0aG9kKAotCQkJCQkJCQlzZXR0ZXJOYW1lLAotCQkJCQkJCQluZXcgU3RyaW5nW10geyAiUUNvbGxlY3Rpb248USIgKyBhdHRyVHlwZU5hbWUgKyAiOz47IiB9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJSU1ldGhvZCBzZXR0ZXI0ID0gdHlwZS5nZXRNZXRob2Qoc2V0dGVyTmFtZSwKLQkJCQkJCW5ldyBTdHJpbmdbXSB7ICJRU2V0OyIgfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlJTWV0aG9kIHNldHRlcjUgPSB0eXBlLmdldE1ldGhvZChzZXR0ZXJOYW1lLAotCQkJCQkJbmV3IFN0cmluZ1tdIHsgIlFDb2xsZWN0aW9uOyIgfSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIWZsZC5leGlzdHMoKSAmJiAhZ2V0dGVyLmV4aXN0cygpICYmICFzZXR0ZXIxLmV4aXN0cygpCi0JCQkJCQkmJiAhc2V0dGVyMi5leGlzdHMoKSAmJiAhc2V0dGVyMy5leGlzdHMoKQotCQkJCQkJJiYgIXNldHRlcjQuZXhpc3RzKCkgJiYgIXNldHRlcjUuZXhpc3RzKCkpCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkJCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucyhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmliaXRlKSB7CQotCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUganJwdCA9IHBlcnNpc3RlbnRBdHRyaWJpdGUuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKTsKLQkJQW5ub3RhdGlvbltdIHJlcyA9IG5ldyBBbm5vdGF0aW9uW2pycHQuZ2V0QW5ub3RhdGlvbnNTaXplKCldOwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tYXBwaW5nQW5ub3RhdGlvbnNTaXplKCkgKyBqcnB0LnN1cHBvcnRpbmdBbm5vdGF0aW9uc1NpemUoKV07Ci0JCWludCBjID0gMDsKLQkJZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBqcnB0LmdldEFubm90YXRpb25zKCkpIHsKLQkJCXJlc1tjXSA9IGFubm90YXRpb247Ci0JCQljKys7Ci0JCX0KLQkJLyoKLQkJaXQgPSBqcnB0LnN1cHBvcnRpbmdBbm5vdGF0aW9ucygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlyZXNbY10gPSBpdC5uZXh0KCk7Ci0JCQljKys7Ci0JCX0KLQkJKi8KLQkJcmV0dXJuIHJlczsKLQl9CQkKLQkKLQlwdWJsaWMgSGFzaFNldDxTdHJpbmc+IGdldEFubm90YXRpb25OYW1lcygKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJpdGUpIHsKLQkJCi0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqcnB0ID0gcGVyc2lzdGVudEF0dHJpYml0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlIYXNoU2V0PFN0cmluZz4gcmVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCQlmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGpycHQuZ2V0QW5ub3RhdGlvbnMoKSkgewotCQkJcmVzLmFkZChKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYW5ub3RhdGlvbi5nZXRBbm5vdGF0aW9uTmFtZSgpKSk7Ci0JCX0KLQkJLyoKLQkJaXQgPSBqcnB0LnN1cHBvcnRpbmdBbm5vdGF0aW9ucygpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSAKLQkJCXJlcy5hZGQoSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChpdC5uZXh0KCkuZ2V0QW5ub3RhdGlvbk5hbWUoKSkpOwotCQkqLwotCQlyZXR1cm4gcmVzOwotCX0JCi0JCi0JcHVibGljIExpc3Q8U3RyaW5nPiBnZXRBbm5vdGF0aW9uU3RyaW5ncygKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHBlcnNpc3RlbnRBdHRyaWJpdGUpIHsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKXBlcnNpc3RlbnRBdHRyaWJpdGUuZ2V0UGFyZW50KCk7Ci0JCUNvbXBpbGF0aW9uVW5pdCBqZHRDVSA9IGpwdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCkuZ2V0SmF2YVJlc291cmNlQ29tcGlsYXRpb25Vbml0KCkuYnVpbGRBU1RSb290KCk7Ci0JCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqcnB0ID0gcGVyc2lzdGVudEF0dHJpYml0ZS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQlMaXN0PFN0cmluZz4gcmVzID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOwotCQlmb3IgKEFubm90YXRpb24gYW4gOiBqcnB0LmdldEFubm90YXRpb25zKCkpIHsKLQkJCW9yZy5lY2xpcHNlLmpkdC5jb3JlLmRvbS5Bbm5vdGF0aW9uIGpkdEFuID0gYW4uZ2V0QXN0QW5ub3RhdGlvbihqZHRDVSk7Ci0JCQlyZXMuYWRkKGpkdEFuLnRvU3RyaW5nKCkpOwotCQl9Ci0JCS8qCi0JCWl0ID0ganJwdC5zdXBwb3J0aW5nQW5ub3RhdGlvbnMoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgeyAKLQkJCUFubm90YXRpb24gYW4gPSBpdC5uZXh0KCk7Ci0JCQlvcmcuZWNsaXBzZS5qZHQuY29yZS5kb20uQW5ub3RhdGlvbiBqZHRBbiA9IGFuLmdldEpkdEFubm90YXRpb24oamR0Q1UpOwotCQkJcmVzLmFkZChqZHRBbi50b1N0cmluZygpKTsKLQkJfQotCQkqLwotCQlyZXR1cm4gcmVzOwotCX0JCi0JCQotCXByaXZhdGUgYm9vbGVhbiBpc05vbk93bmVyKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0KSB7Ci0JCUphdmFBdHRyaWJ1dGVNYXBwaW5nIGphbSA9IGF0LmdldE1hcHBpbmcoKTsKLQkJLy9pZiAoamFtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgPT0gbnVsbCkgewotCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIChKYXZhUGVyc2lzdGVudFR5cGUpYXQuZ2V0UGFyZW50KCkpOwotCQkJamFtID0gYXQuZ2V0TWFwcGluZygpOwotCQkvL30KLQkJaWYgKCEoamFtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24gbm9tID0gKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilqYW0uZ2V0TWFwcGluZ0Fubm90YXRpb24oKTsKLQkJcmV0dXJuIG5vbS5nZXRNYXBwZWRCeSgpICE9IG51bGw7Ci0JfQotCQotCXB1YmxpYyBDb2xsZWN0aW9uPElSZWxhdGlvbj4gcHJvZHVjZUFsbFJlbGF0aW9ucygKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBuZXdKUFQsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZXMgPSBwcm9kdWNlUmVsYXRpb25zKG5ld0pQVCwgZnApOwotCQlJdGVyYXRvcjxJUmVsYXRpb24+IGl0ID0gcmVzLml0ZXJhdG9yKCk7Ci0JCUhhc2hTZXQ8SmF2YVBlcnNpc3RlbnRUeXBlPiBjaGVja2VkRW50aXRpZXMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudFR5cGU+KCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlSZWxhdGlvbiByZWwgPSBpdC5uZXh0KCk7Ci0JCQljaGVja2VkRW50aXRpZXMuYWRkKHJlbC5nZXRPd25lcigpKTsKLQkJCWNoZWNrZWRFbnRpdGllcy5hZGQocmVsLmdldEludmVyc2UoKSk7Ci0JCX0KLQkJTGlzdDxTaGFwZT4gc2hhcGVzID0gZnAuZ2V0RGlhZ3JhbVR5cGVQcm92aWRlcigpLmdldERpYWdyYW0oKQotCQkJCS5nZXRDaGlsZHJlbigpOwotCQlJdGVyYXRvcjxTaGFwZT4gaXRlciA9IHNoYXBlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVNoYXBlIHNoID0gaXRlci5uZXh0KCk7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgZnAKLQkJCQkJLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChzaCk7Ci0JCQlpZiAoanB0ID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvL2lmICghY2hlY2tlZEVudGl0aWVzLmNvbnRhaW5zKGpwdCkpIHsKLQkJCQlDb2xsZWN0aW9uPElSZWxhdGlvbj4gcmVscyA9IHByb2R1Y2VSZWxhdGlvbnMoanB0LCBuZXdKUFQsIGZwKTsKLQkJCQlyZXMuYWRkQWxsKHJlbHMpOwotCQkJLy99Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQkgfQotCQotCXByaXZhdGUgQ29sbGVjdGlvbjxJUmVsYXRpb24+IHByb2R1Y2VSZWxhdGlvbnMoCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgbmV3SlBULCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlIYXNoU2V0PElSZWxhdGlvbj4gcmVzID0gbmV3IEhhc2hTZXQ8SVJlbGF0aW9uPigpOwotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0IDogbmV3SlBULmdldEF0dHJpYnV0ZXMoKSkgewotCQkJSVJlbGF0aW9uIHJlbCA9IHByb2R1Y2VSZWxhdGlvbihhdCwgZnApOwotCQkJaWYgKHJlbCAhPSBudWxsKQotCQkJCXJlcy5hZGQocmVsKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1JlbGF0aW9uQW5ub3RhdGVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQkKLQkJSGFzaFNldDxTdHJpbmc+IGFuTmFtZXMgPSBnZXRBbm5vdGF0aW9uTmFtZXMoanBhKTsKLQkJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGFuTmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU3RyaW5nIGFuTmFtZSA9IGl0Lm5leHQoKTsKLQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoYW5OYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7CQkKLQl9Ci0JCi0JcHVibGljIElSZWxhdGlvbiBwcm9kdWNlUmVsYXRpb24oCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmliaXRlLAotCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGpycGEgPSBwZXJzaXN0ZW50QXR0cmliaXRlCi0JCQkJLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQotCQlJUmVsYXRpb24gcmVzID0gbnVsbDsKLQkJQW5ub3RhdGlvbltdIGFucyA9IGdldEFubm90YXRpb25zKHBlcnNpc3RlbnRBdHRyaWJpdGUpOwotCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsKLQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoKFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKWFuLCBqcnBhKTsKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUID0gKEphdmFQZXJzaXN0ZW50VHlwZSlmcC5nZXRCdXNpbmVzc09iamVjdEZvcktleShyZWxUeXBlTmFtZSk7Ci0JCQkJaWYgKHJlbEpQVCAhPSBudWxsKSAKLQkJCQkJcmVzID0gcHJvZHVjZVJlbGF0aW9uKHBlcnNpc3RlbnRBdHRyaWJpdGUsIGFuLCByZWxKUFQsIGZwKTsKLQkJCQlyZXR1cm4gcmVzOwotCQkJfQkJCQkJCQkJCQotCQl9Ci0JCXJldHVybiByZXM7Ci0JCQkJCi0JfQotCQkKLQlwcml2YXRlIENvbGxlY3Rpb248SVJlbGF0aW9uPiBwcm9kdWNlUmVsYXRpb25zKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQxLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDIsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnApIHsKLQkJCi0JCUNvbGxlY3Rpb248SVJlbGF0aW9uPiByZXNTZXQgPSBuZXcgSGFzaFNldDxJUmVsYXRpb24+KCk7Ci0JCUlSZWxhdGlvbiByZXMgPSBudWxsOwotCQlmb3IgKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0IDoganB0MS5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCUlSZXNvdXJjZSByID0gYXQuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghci5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlKYXZhUmVzb3VyY2VBdHRyaWJ1dGUganJwYSA9IGF0LmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCQkJQW5ub3RhdGlvbltdIGFucyA9IHRoaXMuZ2V0QW5ub3RhdGlvbnMoYXQpOwotCQkJCWZvciAoQW5ub3RhdGlvbiBhbiA6IGFucykgewotCQkJCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUoYW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCQlTdHJpbmcgcmVsVHlwZU5hbWUgPSBnZXRSZWxUeXBlTmFtZSgoUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pYW4sIGpycGEpOwotCQkJCQkJaWYgKCFyZWxUeXBlTmFtZS5lcXVhbHMoanB0Mi5nZXROYW1lKCkpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCA9IChKYXZhUGVyc2lzdGVudFR5cGUpIGZwCi0JCQkJCQkJCS5nZXRCdXNpbmVzc09iamVjdEZvcktleShqcHQyLmdldE5hbWUoKSk7Ci0JCQkJCQlyZXMgPSBwcm9kdWNlUmVsYXRpb24oYXQsIGFuLCByZWxKUFQsIGZwKTsKLQkJCQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQkJCQlyZXNTZXQuYWRkKHJlcyk7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJfQkJCQkKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IAotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gcmVzU2V0OwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxhdGlvbiBhbm5vdGF0aW9uIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaWYgdGhlcmUgaXMgYW55LiBJZiBub3QgLSByZXR1cm5zIG51bGwKLQkgKiAKLQkgKiBAcGFyYW0gYXQKLQkgKiBAcmV0dXJuCi0JICovCi0JCi0JLyoKLQlwcml2YXRlIElBbm5vdGF0aW9uIGdldFJlbGF0aW9uQW5ub3RhdGlvbihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCkgewotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBhdC5nZXRSZXNvdXJjZVBlcnNpc3RlbnRBdHRyaWJ1dGUoKTsKLQkJSUFubm90YXRhYmxlIG0gPSBnZXRBdHRyaWJ1dGVNZW1iZXIoYXQpOwotCQlJQW5ub3RhdGlvbltdIGFucyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhbnMgPSBtLmdldEFubm90YXRpb25zKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0cmFjZXIuZXJyb3IoIiIsIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChJQW5ub3RhdGlvbiBhbiA6IGFucykgewotCQkJaWYgKEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9BTk5PVEFUSU9OUy5jb250YWlucyhKUEFFZGl0b3JVdGlsLmN1dEZyb21MYXN0RG90KGFuLmdldEVsZW1lbnROYW1lKCkpKSkgewotCQkJCXJldHVybiBhbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JKi8KLQkKLQkvKgotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRSZWxhdGVkQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUKSB7Ci0KLQkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBpdCA9IHJlbEpQVC5hdHRyaWJ1dGVzKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlbEVudGl0eUF0ID0gaXQubmV4dCgpOwotCQkJSmF2YVJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSBqcnBhID0gcmVsRW50aXR5QXQKLQkJCQkJLmdldFJlc291cmNlUGVyc2lzdGVudEF0dHJpYnV0ZSgpOwotCQkJQVNUTm9kZSBuZCA9IGpycGEuZ2V0TWVtYmVyKCkuZ2V0TW9kaWZpZWREZWNsYXJhdGlvbigpCi0JCQkJCS5nZXREZWNsYXJhdGlvbigpOwotCQkJaWYgKChuZCBpbnN0YW5jZW9mIE1ldGhvZERlY2xhcmF0aW9uKQotCQkJCQl8fCAobmQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSkgewotCQkJCUxpc3RJdGVyYXRvcjw/PiBtb2RmcyA9ICgoQm9keURlY2xhcmF0aW9uKSBuZCkubW9kaWZpZXJzKCkKLQkJCQkJCS5saXN0SXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAobW9kZnMuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBtb2RmID0gbW9kZnMubmV4dCgpOwotCQkJCQlpZiAobW9kZiBpbnN0YW5jZW9mIEFubm90YXRpb24pIHsKLQkJCQkJCUFubm90YXRpb24gYW4gPSAoQW5ub3RhdGlvbikgbW9kZjsKLQkJCQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IGFuLmdldFR5cGVOYW1lKCkKLQkJCQkJCQkJLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCQkJYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZQotCQkJCQkJCQkuc3Vic3RyaW5nKGFubm90YXRpb25OYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMKLQkJCQkJCQkJLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCQkJCVN0cmluZyBvd25lclR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoYW4sIGpycGEpOwotCQkJCQkJCWlmICghb3duZXJUeXBlTmFtZS5lcXVhbHMoanB0LmdldE5hbWUoKSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCXJldHVybiByZWxFbnRpdHlBdDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQkqLwotCQotCQotCS8qCi0JICogSWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyByZWxhdGlvbiBhbm5vdGF0ZWQgYW5kIHBvaW50cyB0byBzb21lIGVudGl0eSwKLQkgKiB3aGljaCBpcyB2aXN1YWxpemVkIGluIHRoZSBkaWFncmFtIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBvaW50ZWQKLQkgKiBlbnRpdHkuIE90aGVyd2lzZSAtIG51bGwKLQkgKi8KLQkKLQkvKgotCXB1YmxpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UmVsYXRlZEVudGl0eShKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEsIAotCQkJCQkJCQkJCQkgICBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCQotCQlKYXZhUmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlIGpycGEgPSBqcGEKLQkJCQkuZ2V0UmVzb3VyY2VQZXJzaXN0ZW50QXR0cmlidXRlKCk7Ci0JCUlUeXBlIHQgPSBqcnBhLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLmdldENvbXBpbGF0aW9uVW5pdCgpLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJQW5ub3RhdGFibGUgbSA9IGdldEF0dHJpYnV0ZU1lbWJlcihqcGEpOwotCQlJQW5ub3RhdGlvbltdIGFucyA9IG0uZ2V0QW5ub3RhdGlvbnMoKTsKLQkJZm9yIChJQW5ub3RhdGlvbiBhbiA6IGFucykgewotCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gYW4uZ2V0RWxlbWVudE5hbWUoKTsKLQkJCWFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5jdXRGcm9tTGFzdERvdChhbm5vdGF0aW9uTmFtZSk7Ci0KLQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMKLQkJCQkJLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKGFuLCBqcnBhKTsJCQkJCQkKLQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUID0gKEphdmFQZXJzaXN0ZW50VHlwZSkganBhCi0JCQkJCQkuZ2V0UGVyc2lzdGVudFR5cGUoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKQotCQkJCQkJLmdldFBlcnNpc3RlbnRUeXBlKHJlbFR5cGVOYW1lKTsKLQkJCQlpZiAocmVsSlBUICE9IG51bGwpCi0JCQkJCWlmIChmcC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QocmVsSlBUKSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHJlbEpQVDsKLQkJCX0JCQkJCQkKLQkJCQotCQkJCi0JCX0KLQkJCi0JCWlmICgobmQgaW5zdGFuY2VvZiBNZXRob2REZWNsYXJhdGlvbikKLQkJCQl8fCAobmQgaW5zdGFuY2VvZiBGaWVsZERlY2xhcmF0aW9uKSkgewotCQkJTGlzdEl0ZXJhdG9yPD8+IG1vZGZzID0gKChCb2R5RGVjbGFyYXRpb24pIG5kKS5tb2RpZmllcnMoKQotCQkJCQkubGlzdEl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobW9kZnMuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG1vZGYgPSBtb2Rmcy5uZXh0KCk7Ci0JCQkJaWYgKG1vZGYgaW5zdGFuY2VvZiBBbm5vdGF0aW9uKSB7Ci0JCQkJCUFubm90YXRpb24gYW4gPSAoQW5ub3RhdGlvbiltb2RmOwotCQkJCQlTdHJpbmcgYW5ub3RhdGlvbk5hbWUgPSBhbi5nZXRUeXBlTmFtZSgpCi0JCQkJCQkJLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCQlhbm5vdGF0aW9uTmFtZSA9IGFubm90YXRpb25OYW1lLnN1YnN0cmluZyhhbm5vdGF0aW9uTmFtZQotCQkJCQkJCS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMKLQkJCQkJCQkuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCQlTdHJpbmcgcmVsVHlwZU5hbWUgPSBnZXRSZWxUeXBlTmFtZShhbiwganJwYSk7CQkJCQkJCi0JCQkJCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUID0gKEphdmFQZXJzaXN0ZW50VHlwZSkganBhCi0JCQkJCQkJCS5nZXRQZXJzaXN0ZW50VHlwZSgpLmdldFBlcnNpc3RlbmNlVW5pdCgpCi0JCQkJCQkJCS5nZXRQZXJzaXN0ZW50VHlwZShyZWxUeXBlTmFtZSk7Ci0JCQkJCQlpZiAocmVsSlBUICE9IG51bGwpCi0JCQkJCQkJaWYgKGZwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChyZWxKUFQpICE9IG51bGwpCi0JCQkJCQkJCXJldHVybiByZWxKUFQ7Ci0JCQkJCX0JCQkJCQkKLQkJCQl9CQkJCQkJCQkJCQkJCQkKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JKi8KLQkJCi0JcHVibGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRKUFQoU3RyaW5nIG5hbWUsIFBlcnNpc3RlbmNlVW5pdCBwdSkgewotCQlwdS5nZXRKcGFQcm9qZWN0KCkudXBkYXRlQW5kV2FpdCgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgcHUuZ2V0UGVyc2lzdGVudFR5cGUobmFtZSk7Ci0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKGpwdCA9PSBudWxsKSAmJiAoY250IDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoUEFVU0VfRFVSQVRJT04pOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlNsZWVwIGludGVycnVwdGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQJCQotCQkJfQotCQkJanB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlwdS5nZXRQZXJzaXN0ZW50VHlwZShuYW1lKTsKLQkJCWNudCsrOwotCQl9CQkKLQkJcmV0dXJuIGpwdDsKLQl9Ci0JCi0JLyoKLQkgKiBSZXR1cm4gYWxsIHRoZSBhdHRyaWJ1dGVzIGJlbG9uZ2luZyB0byBhbm90aGVyIGVudGl0aWVzIGFuZAotCSAqIGludm9sdmVkIGluIGEgcmVsYXRpb24gd2l0aCB0aGUgZW50aXR5IGdpdmVuIGFzIHBhcmFtZXRlcgotCSAqLwotCXB1YmxpYyBTZXQ8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IGdldFJlbGF0ZWRBdHRyaWJ1dGVzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiByZXMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJSXRlcmF0b3I8SnBhRmlsZT4gaXQgPSBqcHQuZ2V0SnBhUHJvamVjdCgpLmdldEpwYUZpbGVzKCkuaXRlcmF0b3IoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5LklOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdChqcHQuZ2V0SnBhUHJvamVjdCgpKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSnBhRmlsZSBqcGFGaWxlID0gaXQubmV4dCgpOwotCQkJSnB0UmVzb3VyY2VNb2RlbCBybSA9IGpwYUZpbGUuZ2V0UmVzb3VyY2VNb2RlbCgpOwotCQkJaWYgKHJtID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdC5jbGFzcy5pc0luc3RhbmNlKHJtKSkKLQkJCQljb250aW51ZTsKLQkJCUphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCBqcmN1ID0gKEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdClybTsKLQkJCS8vQ1NOICMxMzA4NTkgMjAxMAotCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGpydCA9IGpyY3UuZ2V0UHJpbWFyeVR5cGUoKTsKLQkJCWlmIChqcnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBuYW1lID0ganJ0LmdldFF1YWxpZmllZE5hbWUoKTsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQxID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgcHUKLQkJCQkJLmdldFBlcnNpc3RlbnRUeXBlKG5hbWUpOwotCQkJaWYgKGpwdDEgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4gcmVsQXRzID0gZ2V0UmVsQXR0cmlidXRlcyhqcHQsIGpwdDEpOwotCQkJaWYgKHJlbEF0cyAhPSBudWxsKQotCQkJCXJlcy5hZGRBbGwocmVsQXRzKTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgKGlmIHRoZXJlIGlzIGFueSkgYmVsb25naW5nIHRvIGpwdDEgYW5kCi0JICogaW52b2x2ZWQgaW4gYSByZWxhdGlvbiB3aXRoIGpwdAotCSAqLwotCQotCXByaXZhdGUgU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRSZWxBdHRyaWJ1dGVzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgcmVsSlBUKSB7Ci0KLQkJU2V0PEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiByZXMgPSBuZXcgSGFzaFNldDxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJZm9yIChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA6IHJlbEpQVC5nZXRBdHRyaWJ1dGVzKCkpIHsKLQkJCUlSZXNvdXJjZSByID0gYXQuZ2V0UGFyZW50KCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmICghci5leGlzdHMoKSkKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOwotCQkJQW5ub3RhdGlvbltdIGFucyA9IGdldEFubm90YXRpb25zKGF0KTsJCQkKLQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IG51bGw7Ci0JCQlmb3IgKEFubm90YXRpb24gYW4gOiBhbnMpIHsKLQkJCQlhbm5vdGF0aW9uTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShhbi5nZXRBbm5vdGF0aW9uTmFtZSgpKTsgCi0JCQkJaWYgKEpQQUVkaXRvckNvbnN0YW50cy5SRUxBVElPTl9BTk5PVEFUSU9OUy5jb250YWlucyhhbm5vdGF0aW9uTmFtZSkpIHsKLQkJCQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gZ2V0UmVsVHlwZU5hbWUoKFJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKWFuLCBhdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpKTsKLQkJCQkJaWYgKCFyZWxUeXBlTmFtZS5lcXVhbHMoanB0LmdldE5hbWUoKSkpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmVzLmFkZChhdCk7Ci0JCQkJfQotCQkJfQkJCQotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotCQotCQotCXB1YmxpYyB2b2lkIHJlbmFtZUVudGl0eUNsYXNzKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBuZXdFbnRpdHlOYW1lLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCXJlbmFtZUVudGl0eUNsYXNzKGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBuZXdFbnRpdHlOYW1lKTsKLQl9Ci0JCQotCXByaXZhdGUgdm9pZCByZW5hbWVFbnRpdHlDbGFzcyhJQ29tcGlsYXRpb25Vbml0IGN1LCBTdHJpbmcgbmV3TmFtZSkgewotCQlJVHlwZSBqYXZhVHlwZSA9IGN1LmZpbmRQcmltYXJ5VHlwZSgpOwotCQlyZW5hbWVUeXBlKGphdmFUeXBlLCBuZXdOYW1lKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZVR5cGUoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJaWYgKCF0eXBlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkTmFtZSA9IHR5cGUuZ2V0RWxlbWVudE5hbWUoKTsKLQkJdHJ5IHsKLQkJCVJlbmFtZVN1cHBvcnQgcyA9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKHR5cGUsIG5ld05hbWUsIFJlbmFtZVN1cHBvcnQuVVBEQVRFX1JFRkVSRU5DRVMpOwotCQkJSVdvcmtiZW5jaFdpbmRvdyB3dyA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCVNoZWxsIHNoID0gd3cuZ2V0U2hlbGwoKTsKLQkJCXMucGVyZm9ybShzaCwgd3cpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZTEpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW5hbWUgdGhlIHR5cGUgIiArIG9sZE5hbWUsIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0KLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVuYW1lQXR0cmlidXRlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsCi0JCQlTdHJpbmcgb2xkTmFtZSwgU3RyaW5nIG5ld05hbWUsIFN0cmluZyBpbnZlcnNlRW50aXR5TmFtZSwKLQkJCQkJCQkJCSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQluZXdOYW1lID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuZXdOYW1lKTsKLQkJaWYgKEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCkpIHsJCQotCQkJbmV3TmFtZSA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShuZXdOYW1lKTsKLQkJfSAKLQkJbmV3TmFtZSA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVVuaXF1ZUF0dHJpYnV0ZU5hbWUoanB0LCBuZXdOYW1lKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0gbnVsbDsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb2xkQXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQob2xkTmFtZSk7Ci0JCWZwLmFkZEFkZElnbm9yZSgoSmF2YVBlcnNpc3RlbnRUeXBlKW9sZEF0LmdldFBhcmVudCgpLCBuZXdOYW1lKTsKLQkJSmF2YVJlc291cmNlQXR0cmlidXRlIGpyYSA9IG9sZEF0Ci0JCQkJLmdldFJlc291cmNlQXR0cmlidXRlKCk7Ci0JCWZwLmFkZFJlbW92ZUlnbm9yZSgoSmF2YVBlcnNpc3RlbnRUeXBlKW9sZEF0LmdldFBhcmVudCgpLCBqcmEuZ2V0TmFtZSgpKTsKLQkJSVJlbGF0aW9uIHJlbCA9IGZwLmdldFJlbGF0aW9uUmVsYXRlZFRvQXR0cmlidXRlKG9sZEF0KTsKLQkJU3RyaW5nIGludmVyc2VKUEFOYW1lID0gbnVsbDsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGludmVyc2VKUFQgPSBudWxsOwotCQlpZiAoQmlkaXJlY3Rpb25hbFJlbGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UocmVsKSkgewotCQkJaW52ZXJzZUpQVCA9IHJlbC5nZXRJbnZlcnNlKCk7Ci0JCQlpZiAoaW52ZXJzZUpQVCAhPSBvbGRBdC5nZXRQYXJlbnQoKSkgewotCQkJCXB1ID0gSnBhQXJ0aWZhY3RGYWN0b3J5LklOU1RBTkNFLmdldFBlcnNpc3RlbmNlVW5pdChqcHQpOwotCQkJCWludmVyc2VKUEFOYW1lID0gcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpOwotCQlyZW5hbWVBdHRyaWJ1dGUoY3UsIG9sZE5hbWUsIG5ld05hbWUsIGZwLCB0aGlzLmlzTWV0aG9kQW5ub3RhdGVkKGpwdCkpOwotCQlyZWZyZXNoRW50aXR5TW9kZWwoZnAsIGpwdCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG5ld0F0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKG5ld05hbWUpOwotCQlpZiAobmV3QXQgPT0gbnVsbCkKLQkJCW5ld0F0ID0ganB0LmdldEF0dHJpYnV0ZU5hbWVkKEpQQUVkaXRvclV0aWwKLQkJCQkJLnJldmVydEZpcnN0TGV0dGVyQ2FzZShuZXdOYW1lKSk7Ci0JCWludCBjID0gMDsKLQkJd2hpbGUgKChuZXdBdCA9PSBudWxsKSAmJiAoYyA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsKLQkJCWMrKzsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKFBBVVNFX0RVUkFUSU9OKTsKLQkJCQluZXdBdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChuZXdOYW1lKTsKLQkJCQlpZiAobmV3QXQgPT0gbnVsbCkKLQkJCQkJbmV3QXQgPSAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpIGpwdAotCQkJCQkJCS5yZXNvbHZlQXR0cmlidXRlKEpQQUVkaXRvclV0aWwKLQkJCQkJCQkJCS5yZXZlcnRGaXJzdExldHRlckNhc2UobmV3TmFtZSkpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIlRocmVhZC5zbGVlcCgpIGludGVycnVwdGVkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAobmV3QXQgPT0gbnVsbCkgewotCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiVGhlIGF0dHJpYnV0ZSAiICsgbmV3TmFtZSArICIgY291bGQgbm90IGJlIHJlc29sdmVkIiwgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCkpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCX0KLQkJZnAuYWRkUmVtb3ZlSWdub3JlKGpwdCwgb2xkQXQuZ2V0TmFtZSgpKTsKLQkJdHJ5IHsKLQkJCWZwLnJlcGxhY2VBdHRyaWJ1dGUob2xkQXQsIG5ld0F0KTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXdBdDsKLQkJfQotCQlpZiAoaW52ZXJzZUpQQU5hbWUgIT0gbnVsbCkgewotCQkJZnAuYWRkQXR0cmliRm9yVXBkYXRlKHB1LCBpbnZlcnNlRW50aXR5TmFtZQotCQkJCQkrIEVudGl0eUNoYW5nZUxpc3RlbmVyLlNFUEFSQVRPUiArIGludmVyc2VKUEFOYW1lCi0JCQkJCSsgRW50aXR5Q2hhbmdlTGlzdGVuZXIuU0VQQVJBVE9SICsgbmV3QXQuZ2V0TmFtZSgpKTsKLQkJCXRoaXMucmVmcmVzaEVudGl0eU1vZGVsKGZwLCBpbnZlcnNlSlBUKTsKLQkJCUFubm90YXRpb24gYSA9IHJlbC5nZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKCkuZ2V0TWFwcGluZygpLmdldE1hcHBpbmdBbm5vdGF0aW9uKCk7Ci0JCQlpZiAoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uLmNsYXNzLmlzSW5zdGFuY2UoYSkpIHsKLQkJCQlib29sZWFuIGV4Y2UgPSB0cnVlOwotCQkJCWludCBjbnQgPSAwOwotCQkJCQl3aGlsZSAoZXhjZSAmJiAoY250IDwgMjUpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCQkJCWEgPSByZWwuZ2V0SW52ZXJzZUFubm90YXRlZEF0dHJpYnV0ZSgpLmdldE1hcHBpbmcoKS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpOwotCQkJCQkJKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pYSkuc2V0TWFwcGVkQnkobmV3QXQuZ2V0TmFtZSgpKTsKLQkJCQkJCWV4Y2UgPSBmYWxzZTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHt9Ci0JCQkJCWNudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVsICE9IG51bGwpCi0JCQl1cGRhdGVSZWxhdGlvbihqcHQsIGZwLCByZWwpOwotCQkKLQkJcmV0dXJuIG5ld0F0OwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVSZWxhdGlvbihKYXZhUGVyc2lzdGVudFR5cGUganB0LAotCQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwgSVJlbGF0aW9uIHJlbCkgewotCQlVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlIHVwZGF0ZUZlYXR1cmUgPSBuZXcgVXBkYXRlQXR0cmlidXRlRmVhdHVyZShmcCk7Ci0JCWlmIChqcHQuZXF1YWxzKHJlbC5nZXRJbnZlcnNlKCkpKSB7Ci0JCQl1cGRhdGVGZWF0dXJlLnJlY29ubmVjdChyZWwuZ2V0T3duZXIoKSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cGRhdGVGZWF0dXJlLnJlY29ubmVjdChyZWwuZ2V0SW52ZXJzZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZW5hbWVBdHRyaWJ1dGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhLAotCQkJU3RyaW5nIG5ld05hbWUsIFN0cmluZyBuZXdFbnRpdHlOYW1lLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlyZXR1cm4gcmVuYW1lQXR0cmlidXRlKChKYXZhUGVyc2lzdGVudFR5cGUpanBhLmdldFBhcmVudCgpLCBqcGEuZ2V0TmFtZSgpLCBuZXdOYW1lLAotCQkJCW5ld0VudGl0eU5hbWUsIGZwKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVuYW1lQXR0cmlidXRlKElDb21waWxhdGlvblVuaXQgY3UsIFN0cmluZyBvbGROYW1lLAotCQkJU3RyaW5nIG5ld05hbWUsIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIGJvb2xlYW4gaXNNZXRob2RBbm5vdGF0ZWQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUlUeXBlIGphdmFUeXBlID0gY3UuZmluZFByaW1hcnlUeXBlKCk7Ci0JCWlmIChqYXZhVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRmllbGQgYXR0cmlidXRlRmllbGQgPSBudWxsOwotCQlTdHJpbmcgdHlwZVNpZ25hdHVyZSA9IG51bGw7Ci0JCWlmIChpc01ldGhvZEFubm90YXRlZCkgewotCQkJYXR0cmlidXRlRmllbGQgPSBqYXZhVHlwZS5nZXRGaWVsZChvbGROYW1lKTsKLQkJCWlmICghYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpCi0JCQkJYXR0cmlidXRlRmllbGQgPSAgamF2YVR5cGUuZ2V0RmllbGQoSlBBRWRpdG9yVXRpbC5yZXZlcnRGaXJzdExldHRlckNhc2Uob2xkTmFtZSkpOwotCQl9IGVsc2UgewotCQkJYXR0cmlidXRlRmllbGQgPSBqYXZhVHlwZS5nZXRGaWVsZChvbGROYW1lKTsKLQkJfQotCQlTdHJpbmcgZ2V0dGVyUHJlZml4ID0gImdldCI7CS8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1ldGhvZE5hbWUgPSBnZXR0ZXJQcmVmaXggKyBKUEFFZGl0b3JVdGlsLmNhcGl0YWxpemVGaXJzdExldHRlcihvbGROYW1lKTsgCS8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZCBnZXR0ZXIgPSBqYXZhVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IFN0cmluZ1swXSk7Ci0JCWlmICghZ2V0dGVyLmV4aXN0cygpKSB7Ci0JCQlnZXR0ZXJQcmVmaXggPSAiaXMiOwkvLyROT04tTkxTLTEkCi0JCX0KLQkJbWV0aG9kTmFtZSA9IGdldHRlclByZWZpeCArIEpQQUVkaXRvclV0aWwuY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKG9sZE5hbWUpOyAJLy8kTk9OLU5MUy0xJAotCQlnZXR0ZXIgPSBqYXZhVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgbmV3IFN0cmluZ1swXSk7CQkKLQkJCi0JCWlmIChpc01ldGhvZEFubm90YXRlZCkgewotCQkJdHJ5IHsKLQkJCQl0eXBlU2lnbmF0dXJlID0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsKLQkJCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlMSkgewotCQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCBvYnRhaW4gdHlwZSBzaWduYXR1cmUgb2YgdGhlIGdldHRlciBvZiB0aGUgYXR0cmlidXRlICIgKyBvbGROYW1lLCBlMSk7IC8vJE5PTi1OTFMtMSQgIAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICgodHlwZVNpZ25hdHVyZSA9PSBudWxsKSB8fCAKLQkJCQkJKCEiWiIuZXF1YWxzKHR5cGVTaWduYXR1cmUpICYmICFnZXR0ZXJQcmVmaXguZXF1YWxzKCJnZXQiKSkpIHsJCS8vJE5PTi1OTFMtMSQgCS8vJE5PTi1OTFMtMiQgCi0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IG9idGFpbiB0eXBlIHNpZ25hdHVyZSBvZiB0aGUgZ2V0dGVyIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAgCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQl0eXBlU2lnbmF0dXJlID0gYXR0cmlidXRlRmllbGQuZ2V0VHlwZVNpZ25hdHVyZSgpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3Qgb2J0YWluIHR5cGUgc2lnbmF0dXJlIG9mIHRoZSBmaWVsZCBvZiB0aGUgYXR0cmlidXRlICIgKyBvbGROYW1lLCBlKTsgLy8kTk9OLU5MUy0xJCAgCi0JCQkJcmV0dXJuOwotCQkJfQkJCQotCQl9Ci0KLQkJbWV0aG9kTmFtZSA9ICJzZXQiICsgSlBBRWRpdG9yVXRpbC5jYXBpdGFsaXplRmlyc3RMZXR0ZXIob2xkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJSU1ldGhvZCBzZXR0ZXIgPSBqYXZhVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwKLQkJCQluZXcgU3RyaW5nW10geyB0eXBlU2lnbmF0dXJlIH0pOwotCi0JCWlmIChzZXR0ZXIuZXhpc3RzKCkpCi0JCQlyZW5hbWVTZXR0ZXIoc2V0dGVyLCBuZXdOYW1lKTsKLQkJaWYgKGlzTWV0aG9kQW5ub3RhdGVkKSB7Ci0JCQlpZiAoYXR0cmlidXRlRmllbGQuZXhpc3RzKCkpCi0JCQkJcmVuYW1lRmllbGQoYXR0cmlidXRlRmllbGQsIG5ld05hbWUsIGlzTWV0aG9kQW5ub3RhdGVkKTsJCQkKLQkJCWlmIChnZXR0ZXIuZXhpc3RzKCkpCi0JCQkJcmVuYW1lR2V0dGVyKGdldHRlciwgbmV3TmFtZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZ2V0dGVyLmV4aXN0cygpKQotCQkJCXJlbmFtZUdldHRlcihnZXR0ZXIsIG5ld05hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZUZpZWxkLmV4aXN0cygpKQotCQkJCXJlbmFtZUZpZWxkKGF0dHJpYnV0ZUZpZWxkLCBuZXdOYW1lLCBpc01ldGhvZEFubm90YXRlZCk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCByZW5hbWVGaWVsZChJRmllbGQgZmllbGQsIFN0cmluZyBuZXdOYW1lLCBib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlpZiAoIWZpZWxkLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkTmFtZSA9IGZpZWxkLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChvbGROYW1lLmVxdWFscyhuZXdOYW1lKSkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCVJlbmFtZVN1cHBvcnQgcyA9IFJlbmFtZVN1cHBvcnQuY3JlYXRlKGZpZWxkLCAKLQkJCQkJCQkJCQkJCSAgIGlzTWV0aG9kQW5ub3RhdGVkID8gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihuZXdOYW1lKSA6IG5ld05hbWUsCi0JCQkJCQkJCQkJCQkgICBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3dyA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU2hlbGwgc2ggPSB3dy5nZXRTaGVsbCgpOwotCQkJCXMucGVyZm9ybShzaCwgd3cpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbmFtZSB0aGUgZmllbGQgb2YgdGhlIGF0dHJpYnV0ZSAiICsgb2xkTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQgIAotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgcmVuYW1lIHRoZSBmaWVsZCBvZiB0aGUgYXR0cmlidXRlICIgKyBvbGROYW1lLCBlMSk7IC8vJE5PTi1OTFMtMSQgIAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZUdldHRlcihJTWV0aG9kIGdldHRlciwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICghZ2V0dGVyLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkTmFtZSA9IGdldHRlci5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgZ2V0dGVyVHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnZXR0ZXJUeXBlID0gZ2V0dGVyLmdldFJldHVyblR5cGUoKTsKLQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUyKSB7Ci0JCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW4ndCBvYnRhaW4gZ2V0dGVyIHR5cGUiLCBlMik7IC8vJE5PTi1OTFMtMSQgIAotCQl9Ci0JCVN0cmluZyBuZXdHZXR0ZXJOYW1lID0gKCJaIi5lcXVhbHMoZ2V0dGVyVHlwZSkgPyAiaXMiIDogImdldCIpICsJCS8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAkvLyROT04tTkxTLTMkCi0JCQlKUEFFZGl0b3JVdGlsLmNhcGl0YWxpemVGaXJzdExldHRlcihuZXdOYW1lKTsKLQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld0dldHRlck5hbWUpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJUmVuYW1lU3VwcG9ydCBzID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoZ2V0dGVyLCBuZXdHZXR0ZXJOYW1lLAotCQkJCQlSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3dyA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU2hlbGwgc2ggPSB3dy5nZXRTaGVsbCgpOwotCQkJCXMucGVyZm9ybShzaCwgd3cpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbmFtZSB0aGUgZ2V0dGVyIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW5hbWUgdGhlIGdldHRlciBvZiB0aGUgYXR0cmlidXRlICIgKyBvbGROYW1lLCBlMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkJCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZVNldHRlcihJTWV0aG9kIHNldHRlciwgU3RyaW5nIG5ld05hbWUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmICghc2V0dGVyLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgb2xkTmFtZSA9IHNldHRlci5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3U2V0dGVyTmFtZSA9ICJzZXQiCQkJLy8kTk9OLU5MUy0xJAotCQkJKyBKUEFFZGl0b3JVdGlsLmNhcGl0YWxpemVGaXJzdExldHRlcihuZXdOYW1lKTsKLQkJaWYgKG9sZE5hbWUuZXF1YWxzKG5ld1NldHRlck5hbWUpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJUmVuYW1lU3VwcG9ydCBzID0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoc2V0dGVyLCBuZXdTZXR0ZXJOYW1lLAotCQkJCQlSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3dyA9IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4uZ2V0RGVmYXVsdCgpCi0JCQkJCQkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJU2hlbGwgc2ggPSB3dy5nZXRTaGVsbCgpOwotCQkJCXMucGVyZm9ybShzaCwgd3cpOwotCQkJfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5sb2dFcnJvcigiQ2Fubm90IHJlbmFtZSB0aGUgc2V0dGVyIG9mIHRoZSBhdHRyaWJ1dGUgIiArIG9sZE5hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCUpQQURpYWdyYW1FZGl0b3JQbHVnaW4ubG9nRXJyb3IoIkNhbm5vdCByZW5hbWUgdGhlIHNldHRlciBvZiB0aGUgYXR0cmlidXRlICIgKyBvbGROYW1lLCBlMSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByaXZhdGUgSVJlbGF0aW9uIHByb2R1Y2VSZWxhdGlvbihKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmliaXRlLCBBbm5vdGF0aW9uIGFuLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCi0JCUhhc2h0YWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgQW5ub3RhdGlvbj4gaHQgPSBnZXRSZWxBdHRyaWJ1dGVBbm5vdGF0aW9uKAotCQkJCXBlcnNpc3RlbnRBdHRyaWJpdGUsIHJlbEpQVCk7Ci0JCWlmIChodCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvZHVjZVVuaURpclJlbGF0aW9uKChKYXZhUGVyc2lzdGVudFR5cGUpcGVyc2lzdGVudEF0dHJpYml0ZQotCQkJCQkuZ2V0UGFyZW50KCksIHBlcnNpc3RlbnRBdHRyaWJpdGUsIGFuLCByZWxKUFQsIGZwKTsKLQkJfSBlbHNlIHsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlbEF0ID0gaHQua2V5cygpLm5leHRFbGVtZW50KCk7Ci0JCQlBbm5vdGF0aW9uIHJlbEFuID0gaHQuZ2V0KHJlbEF0KTsKLQkJCXJldHVybiBwcm9kdWNlQmlEaXJSZWxhdGlvbigoSmF2YVBlcnNpc3RlbnRUeXBlKXBlcnNpc3RlbnRBdHRyaWJpdGUKLQkJCQkJLmdldFBhcmVudCgpLCBwZXJzaXN0ZW50QXR0cmliaXRlLCBhbiwgcmVsSlBULAotCQkJCQlyZWxBdCwgcmVsQW4sIGZwKTsKLQkJfQotCQkKLQl9Ci0JCi0JcHJpdmF0ZSBIYXNodGFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEFubm90YXRpb24+IGdldFJlbEF0dHJpYnV0ZUFubm90YXRpb24oCi0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEsIEphdmFQZXJzaXN0ZW50VHlwZSByZWxKUFQpIHsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKWpwYS5nZXRQYXJlbnQoKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIGpwdCk7Ci0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVsRW50QXQgOiByZWxKUFQuZ2V0QXR0cmlidXRlcygpKQl7Ci0JCQlJUmVzb3VyY2UgciA9IHJlbEVudEF0LmdldFBhcmVudCgpLmdldFJlc291cmNlKCk7Ci0JCQlpZiAoIXIuZXhpc3RzKCkpCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKLQkJCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSByZWxKUkEgPSByZWxFbnRBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpOwotCQkJQW5ub3RhdGlvbltdIGFucyA9IHRoaXMuZ2V0QW5ub3RhdGlvbnMocmVsRW50QXQpOwotCQkJZm9yIChBbm5vdGF0aW9uIGFuIDogYW5zKSB7Ci0JCQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGFuLmdldEFubm90YXRpb25OYW1lKCkpOwotCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMuY29udGFpbnMoYW5ub3RhdGlvbk5hbWUpKSB7Ci0JCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKChSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilhbiwgcmVsSlJBKTsJCQkJCQotCQkJCQlpZiAoIXJlbFR5cGVOYW1lLmVxdWFscyhqcHQuZ2V0TmFtZSgpKSkgCi0JCQkJCQljb250aW51ZTsJCQkJCQkJCQkJCQkJCQotCQkJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtcCA9IHJlbEVudEF0LmdldE1hcHBpbmcoKTsKLQkJCQkJaWYobXAuZ2V0TWFwcGluZ0Fubm90YXRpb24oKSA9PSBudWxsKSB7Ci0JCQkJCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5yZWZyZXNoRW50aXR5TW9kZWwobnVsbCwgKEphdmFQZXJzaXN0ZW50VHlwZSlyZWxFbnRBdC5nZXRQYXJlbnQoKSk7Ci0JCQkJCQltcCA9IHJlbEVudEF0LmdldE1hcHBpbmcoKTsKLQkJCQkJfQotCQkJCQlpZiAoIU93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5jbGFzcy5pc0luc3RhbmNlKG1wLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCVN0cmluZyBtYXBwZWRCeSA9ICgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW1wLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldE1hcHBlZEJ5KCk7Ci0JCQkJCWlmICghanBhLmdldE5hbWUoKS5lcXVhbHMobWFwcGVkQnkpKSAKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlIYXNodGFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEFubm90YXRpb24+IGh0ID0gbmV3IEhhc2h0YWJsZTxKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSwgQW5ub3RhdGlvbj4oKTsKLQkJCQkJaHQucHV0KHJlbEVudEF0LCBhbik7Ci0JCQkJCXJldHVybiBodDsJCQkJCQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCQkKLQkJCQotCQkJLyoKLQkJCUFTVE5vZGUgbmQgPSBqcnBhLmdldE1lbWJlcigpLmdldE1vZGlmaWVkRGVjbGFyYXRpb24oKQotCQkJCQkuZ2V0RGVjbGFyYXRpb24oKTsKLQkJCVN0cmluZyBhbm5vdGF0aW9uTmFtZSA9IG51bGw7Ci0JCQlpZiAoKG5kIGluc3RhbmNlb2YgTWV0aG9kRGVjbGFyYXRpb24pCi0JCQkJCXx8IChuZCBpbnN0YW5jZW9mIEZpZWxkRGVjbGFyYXRpb24pKSB7Ci0JCQkJTGlzdEl0ZXJhdG9yPD8+IG1vZGZzID0gKChCb2R5RGVjbGFyYXRpb24pIG5kKS5tb2RpZmllcnMoKQotCQkJCQkJLmxpc3RJdGVyYXRvcigpOwotCQkJCXdoaWxlIChtb2Rmcy5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG1vZGYgPSBtb2Rmcy5uZXh0KCk7Ci0JCQkJCWlmIChtb2RmIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotCQkJCQkJQW5ub3RhdGlvbiBhbiA9IChBbm5vdGF0aW9uKW1vZGY7Ci0JCQkJCQlhbm5vdGF0aW9uTmFtZSA9IGFuLmdldFR5cGVOYW1lKCkKLQkJCQkJCQkJLmdldEZ1bGx5UXVhbGlmaWVkTmFtZSgpOwotCQkJCQkJYW5ub3RhdGlvbk5hbWUgPSBhbm5vdGF0aW9uTmFtZQotCQkJCQkJCQkuc3Vic3RyaW5nKGFubm90YXRpb25OYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCQkJCWlmIChKUEFFZGl0b3JDb25zdGFudHMuUkVMQVRJT05fQU5OT1RBVElPTlMKLQkJCQkJCQkJLmNvbnRhaW5zKGFubm90YXRpb25OYW1lKSkgewotCQkJCQkJCVN0cmluZyByZWxUeXBlTmFtZSA9IGdldFJlbFR5cGVOYW1lKGFuLCBqcnBhKTsJCQkJCQotCQkJCQkJCWlmICghcmVsVHlwZU5hbWUuZXF1YWxzKGpwdC5nZXROYW1lKCkpKSAKLQkJCQkJCQkJY29udGludWU7CQkJCQkJCQkJCQkJCQkKLQkJCQkJCQlKYXZhQXR0cmlidXRlTWFwcGluZyBtcCA9IGF0LmdldFNwZWNpZmllZE1hcHBpbmcoKTsKLQkJCQkJCQlpZiAoIU93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbi5jbGFzcy5pc0luc3RhbmNlKG1wLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQlTdHJpbmcgbWFwcGVkQnkgPSAoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiltcC5nZXRNYXBwaW5nQW5ub3RhdGlvbigpKS5nZXRNYXBwZWRCeSgpOwotCQkJCQkJCWlmICghanBhLmdldE5hbWUoKS5lcXVhbHMobWFwcGVkQnkpKSAKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJSGFzaHRhYmxlPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLCBBbm5vdGF0aW9uPiBodCA9IG5ldyBIYXNodGFibGU8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUsIEFubm90YXRpb24+KCk7Ci0JCQkJCQkJaHQucHV0KGF0LCBhbik7Ci0JCQkJCQkJcmV0dXJuIGh0OwotCQkJCQkJfQotCQkJCQl9IAkJCQotCQkJCX0KLQkJCX0KLQkJCSovCQkJCi0JCi0JcHJpdmF0ZSBVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIHByb2R1Y2VVbmlEaXJSZWxhdGlvbigKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0LCBBbm5vdGF0aW9uIGFuLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCwgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCkgewotCQkKLQkJaWYgKGlzTm9uT3duZXIoYXQpIHx8ICFKUEFFZGl0b3JVdGlsLmdldENvbXBpbGF0aW9uVW5pdCgoSmF2YVBlcnNpc3RlbnRUeXBlKSBhdC5nZXRQYXJlbnQoKSkuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGFuLmdldEFubm90YXRpb25OYW1lKCkpOwotCQlVbmlkaXJlY3Rpb25hbFJlbGF0aW9uIHJlcyA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0LmdldE5hbWUoKTsKLQkJaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgewotCQkJaWYgKCFmcC5kb2VzUmVsYXRpb25FeGlzdChqcHQsIHJlbEpQVCwgYXR0ck5hbWUsIFJlbFR5cGUuT05FX1RPX09ORSwKLQkJCQkJUmVsRGlyLlVOSSkpCi0JCQkJcmVzID0gbmV3IE9uZVRvT25lVW5pRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgZmFsc2UsCi0JCQkJCQlmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9uTmFtZQotCQkJCS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fT05FX1RPX01BTlkpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgUmVsVHlwZS5PTkVfVE9fTUFOWSwKLQkJCQkJUmVsRGlyLlVOSSkpCi0JCQkJcmVzID0gbmV3IE9uZVRvTWFueVVuaURpclJlbGF0aW9uKGZwLCBqcHQsIHJlbEpQVCwgYXR0ck5hbWUsIGZhbHNlLAotCQkJCQkJZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksIGZwCi0JCQkJCQkJCS5nZXRDb21waWxhdGlvblVuaXQocmVsSlBUKSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbk5hbWUKLQkJCQkuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FKSkgewotCQkJaWYgKCFmcC5kb2VzUmVsYXRpb25FeGlzdChqcHQsIHJlbEpQVCwgYXR0ck5hbWUsIFJlbFR5cGUuTUFOWV9UT19PTkUsCi0JCQkJCVJlbERpci5VTkkpKQotCQkJCXJlcyA9IG5ldyBNYW55VG9PbmVVbmlEaXJSZWxhdGlvbihmcCwganB0LCByZWxKUFQsIGF0dHJOYW1lLCBmYWxzZSwKLQkJCQkJCWZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBmcAotCQkJCQkJCQkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbEpQVCkpOwotCQl9IGVsc2UgaWYgKGFubm90YXRpb25OYW1lCi0JCQkJLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX01BTlkpKSB7Ci0JCQlpZiAoIWZwLmRvZXNSZWxhdGlvbkV4aXN0KGpwdCwgcmVsSlBULCBhdHRyTmFtZSwgUmVsVHlwZS5NQU5ZX1RPX01BTlksCi0JCQkJCVJlbERpci5VTkkpKQotCQkJCXJlcyA9IG5ldyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBhdHRyTmFtZSwKLQkJCQkJCWZhbHNlLCBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfQotCQlpZiAocmVzICE9IG51bGwpCi0JCQlyZXMuc2V0QW5ub3RhdGVkQXR0cmlidXRlKGF0KTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JCi0JcHJpdmF0ZSBCaWRpcmVjdGlvbmFsUmVsYXRpb24gcHJvZHVjZUJpRGlyUmVsYXRpb24oSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0LCBBbm5vdGF0aW9uIGFuLAotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHJlbEpQVCwgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgcmVsQXQsCi0JCQlBbm5vdGF0aW9uIHJlbEFuLCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwKSB7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLnJlZnJlc2hFbnRpdHlNb2RlbChudWxsLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlbEF0LmdldFBhcmVudCgpKTsKLQkJU3RyaW5nIGFubm90YXRpb25OYW1lID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKGFuLmdldEFubm90YXRpb25OYW1lKCkpOwotCQlTdHJpbmcgcmVsQW5ub3RhdGlvbk5hbWUgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUocmVsQW4uZ2V0QW5ub3RhdGlvbk5hbWUoKSk7Ci0JCWlmICghYW5ub3RhdGlvbk5hbWVzTWF0Y2goYW5ub3RhdGlvbk5hbWUsIHJlbEFubm90YXRpb25OYW1lKSkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkpIAotCQkJcmV0dXJuIHByb2R1Y2VCaURpclJlbGF0aW9uKHJlbEpQVCwgcmVsQXQsIHJlbEFuLCBqcHQsIGF0LCBhbiwgZnApOwotCQlpZiAoaXNOb25Pd25lcihhdCkgJiYgaXNOb25Pd25lcihyZWxBdCkpIAotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhbm5vdGF0aW9uTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19PTkUpKSB7Ci0JCQlpZiAoaXNOb25Pd25lcihhdCkgfHwgIWlzTm9uT3duZXIocmVsQXQpKSAKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoYW5ub3RhdGlvbk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkpIHsKLQkJCWlmICghaXNOb25Pd25lcihhdCkgJiYgIWlzTm9uT3duZXIocmVsQXQpKSAKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpc05vbk93bmVyKGF0KSkgCi0JCQkJcmV0dXJuIHByb2R1Y2VCaURpclJlbGF0aW9uKHJlbEpQVCwgcmVsQXQsIHJlbEFuLCBqcHQsIGF0LCBhbiwKLQkJCQkJCWZwKTsKLQkJfQkJCi0JCVN0cmluZyBvd25lckF0dHJOYW1lID0gYXQuZ2V0TmFtZSgpOwotCQlTdHJpbmcgaW52ZXJzZUF0dHJOYW1lID0gcmVsQXQuZ2V0TmFtZSgpOwotCQkKLQkJSmF2YUF0dHJpYnV0ZU1hcHBpbmcgbSA9IHJlbEF0LmdldE1hcHBpbmcoKTsKLQkJCi0JCWlmICgobSAhPSBudWxsKSl7Ci0JCQlpZiAobS5nZXRNYXBwaW5nQW5ub3RhdGlvbigpPT1udWxsKSB7Ci0JCQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIChKYXZhUGVyc2lzdGVudFR5cGUpcmVsQXQuZ2V0UGFyZW50KCkpOwotCQkJCW0gPSByZWxBdC5nZXRNYXBwaW5nKCk7Ci0JCQl9Ci0JCQlpZihtLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkgaW5zdGFuY2VvZiBPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24pIHsKLQkJCi0JCQlTdHJpbmcgbWFwcGVkQnkgPSAoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiltLmdldE1hcHBpbmdBbm5vdGF0aW9uKCkpLmdldE1hcHBlZEJ5KCk7Ci0JCQlpZiAobWFwcGVkQnkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICghbWFwcGVkQnkuZXF1YWxzKG93bmVyQXR0ck5hbWUpKQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCQotCQlCaWRpcmVjdGlvbmFsUmVsYXRpb24gcmVzID0gbnVsbDsKLQkJaWYgKGFubm90YXRpb25OYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKSkgewotCQkJaWYgKCFmcC5kb2VzUmVsYXRpb25FeGlzdChqcHQsIHJlbEpQVCwgb3duZXJBdHRyTmFtZSwgUmVsVHlwZS5PTkVfVE9fT05FLAotCQkJCQlSZWxEaXIuQkkpKQotCQkJCXJlcyA9IG5ldyBPbmVUb09uZUJpRGlyUmVsYXRpb24oZnAsIGpwdCwgcmVsSlBULCBvd25lckF0dHJOYW1lLAotCQkJCQkJaW52ZXJzZUF0dHJOYW1lLCBmYWxzZSwgZnAuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksIGZwCi0JCQkJCQkJCS5nZXRDb21waWxhdGlvblVuaXQocmVsSlBUKSk7Ci0JCX0gZWxzZSBpZiAoYW5ub3RhdGlvbk5hbWUKLQkJCQkuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FKSkgewotCQkJaWYgKCFmcC5kb2VzUmVsYXRpb25FeGlzdChqcHQsIHJlbEpQVCwgb3duZXJBdHRyTmFtZSwgUmVsVHlwZS5NQU5ZX1RPX09ORSwKLQkJCQkJUmVsRGlyLkJJKSkKLQkJCQlyZXMgPSBuZXcgTWFueVRvT25lQmlEaXJSZWxhdGlvbihmcCwganB0LCByZWxKUFQsIG93bmVyQXR0ck5hbWUsCi0JCQkJCQlpbnZlcnNlQXR0ck5hbWUsIGZhbHNlLCBmcC5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgZnAKLQkJCQkJCQkJLmdldENvbXBpbGF0aW9uVW5pdChyZWxKUFQpKTsKLQkJfSBlbHNlIGlmIChhbm5vdGF0aW9uTmFtZQotCQkJCS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKSkgewotCQkJaWYgKCFmcC5kb2VzUmVsYXRpb25FeGlzdChqcHQsIHJlbEpQVCwgb3duZXJBdHRyTmFtZSwgUmVsVHlwZS5NQU5ZX1RPX01BTlksCi0JCQkJCVJlbERpci5CSSkpCi0JCQkJcmVzID0gbmV3IE1hbnlUb01hbnlCaURpclJlbGF0aW9uKGZwLCBqcHQsIHJlbEpQVCwgb3duZXJBdHRyTmFtZSwKLQkJCQkJCWludmVyc2VBdHRyTmFtZSwgZmFsc2UsIGZwLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCBmcAotCQkJCQkJCQkuZ2V0Q29tcGlsYXRpb25Vbml0KHJlbEpQVCkpOwotCQl9Ci0JCWlmIChyZXMgIT0gbnVsbCkgewotCQkJcmVzLnNldE93bmVyQW5ub3RhdGVkQXR0cmlidXRlKGF0KTsKLQkJCXJlcy5zZXRJbnZlcnNlQW5ub3RhdGVkQXR0cmlidXRlKHJlbEF0KTsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQkKLQlwcml2YXRlIGJvb2xlYW4gYW5ub3RhdGlvbk5hbWVzTWF0Y2goU3RyaW5nIGFuMU5hbWUsIFN0cmluZyBhbjJOYW1lKSB7Ci0JCWlmIChhbjFOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fT05FKQotCQkJCSYmIGFuMk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19PTkUpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmIChhbjFOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9PTkVfVE9fTUFOWSkKLQkJCQkmJiBhbjJOYW1lLmVxdWFscyhKUEFFZGl0b3JDb25zdGFudHMuQU5OT1RBVElPTl9NQU5ZX1RPX09ORSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKGFuMU5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fT05FKQotCQkJCSYmIGFuMk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX09ORV9UT19NQU5ZKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSBpZiAoYW4xTmFtZS5lcXVhbHMoSlBBRWRpdG9yQ29uc3RhbnRzLkFOTk9UQVRJT05fTUFOWV9UT19NQU5ZKQotCQkJCSYmIGFuMk5hbWUuZXF1YWxzKEpQQUVkaXRvckNvbnN0YW50cy5BTk5PVEFUSU9OX01BTllfVE9fTUFOWSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuR2V0dGVyQ29udGVudHMoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clR5cGUsCi0JCQlTdHJpbmdbXSBhdHRyVHlwZUVsZW1lbnROYW1lcywgU3RyaW5nIGFjdE5hbWUsCi0JCQlMaXN0PFN0cmluZz4gYW5ub3RhdGlvbnMsIGJvb2xlYW4gaXNDb2xsZWN0aW9uKSB7Ci0JCQotCQlTdHJpbmcgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgPSBhY3ROYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCkKLQkJCQkrIGFjdE5hbWUuc3Vic3RyaW5nKDEpOwotCQlTdHJpbmcgY29udGVudHMgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGFubm90YXRpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGFuID0gaXQubmV4dCgpOwotCQkJCWNvbnRlbnRzICs9ICIgICAiICsgYW4gKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlpZiAoaXNDb2xsZWN0aW9uKSB7Ci0JCQljb250ZW50cyArPSAiICAgIHB1YmxpYyBDb2xsZWN0aW9uPCIrIGF0dHJUeXBlICsgIj4gZ2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxBICsgIigpIHtcbiIgKyAgCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIAotCQkJCQkiICAgICAgICByZXR1cm4gIgkvLyROT04tTkxTLTEkCi0JCQkJCSsgSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKSArICI7XG4iICsgLy8kTk9OLU5MUy0xJCAKLQkJCSAgIiAgICB9XG4iOyAgLy8kTk9OLU5MUy0xJAkJCQotCQl9IGVsc2UgewotCQkJY29udGVudHMgKz0gIiAgICBwdWJsaWMgIisgYXR0clR5cGUgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkJKChhdHRyVHlwZUVsZW1lbnROYW1lcyA9PSBudWxsKT8iIjooIjwiICsgSlBBRWRpdG9yVXRpbC5jcmVhdGVDb21tYVNlcGFyYXRlZExpc3RPZlNpbXBsZVR5cGVOYW1lcyhhdHRyVHlwZUVsZW1lbnROYW1lcykgKyAiPiIpKSArIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCQkJKGF0dHJUeXBlLmVxdWFscygiYm9vbGVhbiIpID8gIiBpcyIgOiAiIGdldCIpICsgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgKyAiKCkge1xuIiArICAJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAKLQkJCQkJIiAgICAgICAgcmV0dXJuICIJLy8kTk9OLU5MUy0xJAotCQkJCQkrIEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSkgKyAiO1xuIiArIC8vJE5PTi1OTFMtMSQgCi0JCQkgICIgICAgfVxuIjsgIAkJCQkJCQkJCQkJCQkJCQkvLyROT04tTkxTLTEkCQkJCi0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5TZXR0ZXJDb250ZW50cyhTdHJpbmcgYXR0ck5hbWUsIFN0cmluZyBhdHRyVHlwZSwKLQkJCVN0cmluZ1tdIGF0dHJUeXBlRWxlbWVudE5hbWVzLCBTdHJpbmcgYWN0TmFtZSwgYm9vbGVhbiBpc0NvbGxlY3Rpb24pIHsKLQkJCi0JCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsQSA9IGFjdE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKExvY2FsZS5FTkdMSVNIKQotCQkJCSsgYWN0TmFtZS5zdWJzdHJpbmcoMSk7Ci0JCVN0cmluZyBjb250ZW50cyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChpc0NvbGxlY3Rpb24pIHsKLQkJCWNvbnRlbnRzID0gIiAgICBwdWJsaWMgdm9pZCBzZXQiICsgYXR0ck5hbWVXaXRoQ2FwaXRhbEEgKyAiKENvbGxlY3Rpb248IiArIGF0dHJUeXBlICsgIj4gcGFyYW0pICIgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkie1xuIiArIC8vJE5PTi1OTFMtMSQgCi0JCQkJCSIgICAgICAgIHRoaXMuIgkvLyROT04tTkxTLTEkCi0JCQkJCSsgSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihhY3ROYW1lKQotCQkJCQkrICIgPSBwYXJhbTtcbiIgKyAvLyROT04tTkxTLTEkIAotCQkJCQkJICAiICAgIH1cbiI7ICAJLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJY29udGVudHMgPSAiICAgIHB1YmxpYyB2b2lkIHNldCIgKyBhdHRyTmFtZVdpdGhDYXBpdGFsQSArICIoIiArIGF0dHJUeXBlICsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCSgoYXR0clR5cGVFbGVtZW50TmFtZXMgPT0gbnVsbCk/IiI6KCI8IiArIEpQQUVkaXRvclV0aWwuY3JlYXRlQ29tbWFTZXBhcmF0ZWRMaXN0T2ZTaW1wbGVUeXBlTmFtZXMoYXR0clR5cGVFbGVtZW50TmFtZXMpICsgIj4iKSkgKyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkiIHBhcmFtKSB7XG4iCS8vJE5PTi1OTFMtMSQKLQkJCQkJKyAKLQkJCQkJIiAgICAgICAgdGhpcy4iCS8vJE5PTi1OTFMtMSQKLQkJCQkJKyBKUEFFZGl0b3JVdGlsLmRlY2FwaXRhbGl6ZUZpcnN0TGV0dGVyKGFjdE5hbWUpCi0JCQkJCSsgIiA9IHBhcmFtO1xuIiArIC8vJE5PTi1OTFMtMSQgCi0JCQkgICIgICAgfVxuIjsgIAkJCS8vJE5PTi1OTFMtMSQJCQkKLQkJfQotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkdldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clR5cGUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGdlbkdldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0ck5hbWUsIG51bGwsIGF0dHJUeXBlLAotCQkJCWFjdE5hbWUsIHR5cGUpOwotCX0KLQotCQotCXByaXZhdGUgU3RyaW5nIGdlbkdldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgbWFwS2V5VHlwZSwgU3RyaW5nIGF0dHJUeXBlLAotCQkJU3RyaW5nIGFjdE5hbWUsIFN0cmluZyB0eXBlKSB7Ci0KLQkJU3RyaW5nIGF0dHJOYW1lV2l0aENhcGl0YWxBID0gYWN0TmFtZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoCi0JCQkJTG9jYWxlLkVOR0xJU0gpCi0JCQkJKyBhY3ROYW1lLnN1YnN0cmluZygxKTsKLQkJU3RyaW5nIGNvbnRlbnRzID0gIiAgICBwdWJsaWMgIiArIEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZSh0eXBlKSArIAkJLy8kTk9OLU5MUy0xJAotCQkJCSI8IiArICgobWFwS2V5VHlwZSAhPSBudWxsKSA/IChtYXBLZXlUeXBlICsgIiwgIikgOiAiIikgICsgIGF0dHJUeXBlICsgIj4gIiArCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkiZ2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxBICsgIigpIHtcbiIgKyAJLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJIiAgICAgICAgcmV0dXJuICIgCS8vJE5PTi1OTFMtMSQKLQkJCQkrIEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSkgKyAiO1xuIiArIAkJLy8kTk9OLU5MUy0xJAotCQkJCSIgICAgfVxuIjsgCS8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdlblNldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoU3RyaW5nIGF0dHJOYW1lLCBTdHJpbmcgYXR0clR5cGUsCi0JCQlTdHJpbmcgYWN0TmFtZSwgU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGdlblNldHRlcldpdGhBcHByb3ByaWF0ZVR5cGUoYXR0ck5hbWUsIG51bGwsIGF0dHJUeXBlLAotCQkJCWFjdE5hbWUsIHR5cGUpOwotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZW5TZXR0ZXJXaXRoQXBwcm9wcmlhdGVUeXBlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIG1hcEtleVR5cGUsIFN0cmluZyBhdHRyVHlwZSwKLQkJCVN0cmluZyBhY3ROYW1lLCBTdHJpbmcgdHlwZSkgewotCi0JCVN0cmluZyBhdHRyTmFtZVdpdGhDYXBpdGFsQSA9IGFjdE5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKAotCQkJCUxvY2FsZS5FTkdMSVNIKQotCQkJCSsgYWN0TmFtZS5zdWJzdHJpbmcoMSk7Ci0JCVN0cmluZyBjb250ZW50cyA9ICIgICAgcHVibGljIHZvaWQgc2V0IiArIGF0dHJOYW1lV2l0aENhcGl0YWxBICsgCQkJLy8kTk9OLU5MUy0xJAotCQkJCSIoIiArIEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZSh0eXBlKSArIAkJCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkiPCIgKyAoKG1hcEtleVR5cGUgIT0gbnVsbCkgPyAobWFwS2V5VHlwZSArICIsICIpIDogIiIpICsgYXR0clR5cGUgKyAiPiBwYXJhbSkgIiArCS8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkie1xuIiArICAgCS8vJE5PTi1OTFMtMSQKLQkJCQkiICAgICAgICB0aGlzLiIgCS8vJE5PTi1OTFMtMSQKLQkJCQkrIEpQQUVkaXRvclV0aWwuZGVjYXBpdGFsaXplRmlyc3RMZXR0ZXIoYWN0TmFtZSkKLQkJCQkrICIgPSBwYXJhbTtcbiIgKyAJLy8kTk9OLU5MUy0xJAotCQkJCSIgICAgfVxuIjsgCQkJLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29udGVudHM7Ci0JfQotCQotCS8qCi0JcHJpdmF0ZSBTdHJpbmcgcmV0dXJuU2ltcGxlTmFtZShTdHJpbmcgaW5wdXQpIHsKLQkJU3RyaW5nIG5hbWUgPSBpbnB1dDsKLQkJaWYgKG5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQkqLwotCQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRnJvbUVudGl0eSgKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXRoaXMucmVmcmVzaEVudGl0eU1vZGVsKG51bGwsIGpwdCk7Ci0JCVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgPSBqcHQuZ2V0QXR0cmlidXRlTmFtZWQoYXR0cmlidXRlTmFtZSk7Ci0JCWlmIChhdCA9PSBudWxsKSB7Ci0JCQlqcHQuZ2V0SmF2YVJlc291cmNlVHlwZSgpLnN5bmNocm9uaXplV2l0aChqcHQuZ2V0SmF2YVJlc291cmNlVHlwZSgpLmdldEphdmFSZXNvdXJjZUNvbXBpbGF0aW9uVW5pdCgpLmJ1aWxkQVNUUm9vdCgpKTsKLQkJCWpwdC51cGRhdGUoKTsKLQkJfQotCQlpbnQgYyA9IDA7Ci0JCXdoaWxlICgoYXQgPT0gbnVsbCkgJiYgKGMgPCBNQVhfTlVNX09GX0lURVJBVElPTlMpKSB7CQkKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKFBBVVNFX0RVUkFUSU9OKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmxvZ0Vycm9yKCJDYW5ub3QgZ2V0IHRoZSBhdHRyaWJ1dGUgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWF0dHJpYnV0ZU5hbWUgKyAiIGZyb20gIiArIGpwdC5nZXROYW1lKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChhdHRyaWJ1dGVOYW1lKTsKLQkJCWMrKzsKLQkJfQotCQlyZXR1cm4gKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKWF0OwkJCi0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBkb2VzQXR0cmlidXRlRXhpc3QoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCwgU3RyaW5nIG5hbWUpCi0JCQkJCQkJCQkJCXRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQlpZiAoanB0LnJlc29sdmVBdHRyaWJ1dGUobmFtZSkgIT0gbnVsbCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGV4aXN0czsKLQl9Ci0JCQotCXB1YmxpYyBKYXZhUmVzb3VyY2VUeXBlIGNvbnZlcnRKUFRUb0pSVChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkgCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChKYXZhUmVzb3VyY2VUeXBlKSBqcHQuZ2V0SnBhUHJvamVjdCgpLmdldEphdmFSZXNvdXJjZVR5cGUoanB0LmdldE5hbWUoKSwgS2luZC5UWVBFKTsKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCAgPSBqcGFGaWxlLmdldEpwYVByb2plY3QoKTsKLQkJaWYgKGpwYVByb2plY3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0UGVyc2lzdGVuY2VVbml0KGpwYVByb2plY3QpOyAKLQl9Ci0JCi0JcHVibGljIFBlcnNpc3RlbmNlVW5pdCBnZXRQZXJzaXN0ZW5jZVVuaXQoSnBhUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWlmKHByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCkuZ2V0UGVyc2lzdGVuY2VYbWwoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBwcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpLmdldFBlcnNpc3RlbmNlWG1sKCkuZ2V0UGVyc2lzdGVuY2UoKQotCQkJCS5nZXRQZXJzaXN0ZW5jZVVuaXRzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JfQotCQotCXB1YmxpYyBQZXJzaXN0ZW5jZVVuaXQgZ2V0UGVyc2lzdGVuY2VVbml0KEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJcmV0dXJuIGpwdC5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsgCi0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIpIHsKLQkJcmV0dXJuIGF0dHIuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRLaW5kKCkgPT0gS2luZC5NRVRIT0Q7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzTWV0aG9kQW5ub3RhdGVkKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJTGlzdEl0ZXJhdG9yPEphdmFQZXJzaXN0ZW50QXR0cmlidXRlPiBsaSA9IGpwdC5nZXRBdHRyaWJ1dGVzKCkuaXRlcmF0b3IoKTsKLQkJaWYgKCFsaS5oYXNOZXh0KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoaXNNZXRob2RBbm5vdGF0ZWQobGkubmV4dCgpKSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbWFrZVJlbGF0aW9ucyhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwLAotCQkJQ29udGFpbmVyU2hhcGUgY3MsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJaWYgKGNzID09IG51bGwpIAotCQkJY3MgPSAoQ29udGFpbmVyU2hhcGUpZnAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCk7Ci0JCWlmIChjcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZW1vdmVPbGRSZWxhdGlvbnMoZnAsIGNzKTsKLQkJYWRkTmV3UmVsYXRpb25zKGZwLCBqcHQpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTmFtZShKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCWlmIChqcHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAKLQkJSmF2YVJlc291cmNlVHlwZSBqcnQgPSBjb252ZXJ0SlBUVG9KUlQoanB0KTsKLQkJaWYgKGpydCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IAotCQlUYWJsZUFubm90YXRpb24gdGFuID0gKFRhYmxlQW5ub3RhdGlvbilqcnQuZ2V0QW5ub3RhdGlvbigiamF2YXgucGVyc2lzdGVuY2UuVGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdGFibGVOYW1lID0gbnVsbDsKLQkJaWYgKHRhbiA9PSBudWxsKXsKLQkJCXRhYmxlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShqcHQuZ2V0TmFtZSgpKTsKLQkJfSBlbHNlIHsKLQkJCXRhYmxlTmFtZSA9IHRhbi5nZXROYW1lKCk7CQkKLQkJfQkJCi0JCWlmICh0YWJsZU5hbWUgPT0gbnVsbCkKLQkJCXRhYmxlTmFtZSA9IEpQQUVkaXRvclV0aWwucmV0dXJuU2ltcGxlTmFtZShqcHQuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHRhYmxlTmFtZTsKLQl9Ci0JCi0JCi0JcHVibGljIHZvaWQgc2V0VGFibGVOYW1lKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQsIFN0cmluZyB0YWJsZU5hbWUpIHsKLQkJaWYgKGpwdCA9PSBudWxsKQotCQkJcmV0dXJuOyAKLQkJSmF2YVJlc291cmNlVHlwZSBqcnQgPSBjb252ZXJ0SlBUVG9KUlQoanB0KTsKLQkJaWYgKGpydCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47IAotCQl9Ci0JCVRhYmxlQW5ub3RhdGlvbiB0YSA9IChUYWJsZUFubm90YXRpb24panJ0LmdldEFubm90YXRpb24oImphdmF4LnBlcnNpc3RlbmNlLlRhYmxlIik7CS8vJE5PTi1OTFMtMSQKLQkJaWYgKHRhICE9IG51bGwpIAotCQkJdGEuc2V0TmFtZSh0YWJsZU5hbWUpOwkJCi0JfQotCQotCS8qCi0JcHJpdmF0ZSBPYmplY3QgZXh0cmFjdEFubm90YXRpb25NZW1iZXJWYWx1ZShBbm5vdGF0aW9uIGFuLCBTdHJpbmcgbWVtYmVyTmFtZSkgewotCQkKLQkJYW4uCi0JCQotCQlJTWVtYmVyVmFsdWVQYWlyW10gbXZwczsKLQkJdHJ5IHsKLQkJCW12cHMgPSBhbi5nZXRNZW1iZXJWYWx1ZVBhaXJzKCk7Ci0JCX0gY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQl0cmFjZXIuZXJyb3IoIkNhbid0IGdldCBhbm5vdGF0aW9uIG1lbWJlcnMiLCBlKTsJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZm9yIChJTWVtYmVyVmFsdWVQYWlyIG12cCA6IG12cHMpIHsKLQkJCWlmIChtdnAuZ2V0TWVtYmVyTmFtZSgpLmVxdWFscyhtZW1iZXJOYW1lKSkgewotCQkJCXJldHVybiBtdnAuZ2V0VmFsdWUoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JKi8JCi0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlT2xkUmVsYXRpb25zKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsCi0JCQlDb250YWluZXJTaGFwZSBjcykgewotCQlTZXQ8SVJlbW92ZUNvbnRleHQ+IGN0eHMgPSBuZXcgSGFzaFNldDxJUmVtb3ZlQ29udGV4dD4oKTsKLQkJSXRlcmF0b3I8Q29ubmVjdGlvbj4gaXRlciA9IEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmdldEFsbENvbm5lY3Rpb25zKGNzKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNvbm5lY3Rpb24gY29ubiA9IGl0ZXIubmV4dCgpOwotCQkJSVJlbW92ZUNvbnRleHQgY3R4ID0gbmV3IFJlbW92ZUNvbnRleHQoY29ubik7Ci0JCQljdHhzLmFkZChjdHgpOwotCQl9Ci0JCUl0ZXJhdG9yPElSZW1vdmVDb250ZXh0PiBpdEN0eCA9IGN0eHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Q3R4Lmhhc05leHQoKSkgewotCQkJSVJlbW92ZUNvbnRleHQgY3R4ID0gaXRDdHgubmV4dCgpOwotCQkJUmVtb3ZlUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IFJlbW92ZVJlbGF0aW9uRmVhdHVyZShmcCk7Ci0JCQlmdC5yZW1vdmUoY3R4KTsKLQkJfQkJCi0JfQotCQotCXByaXZhdGUgdm9pZCBhZGROZXdSZWxhdGlvbnMoSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmcCwKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkKLQkJQ29sbGVjdGlvbjxJUmVsYXRpb24+IHNlbGZSZWxzID0gbmV3IEhhc2hTZXQ8SVJlbGF0aW9uPigpOyAKLQkJQ29sbGVjdGlvbjxJUmVsYXRpb24+IG5ld1JlbHMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKQotCQkJCS5wcm9kdWNlQWxsUmVsYXRpb25zKGpwdCwgZnApOwotCQlJdGVyYXRvcjxJUmVsYXRpb24+IHJlbHNJdCA9IG5ld1JlbHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHJlbHNJdC5oYXNOZXh0KCkpIHsKLQkJCUlSZWxhdGlvbiByZWwgPSByZWxzSXQubmV4dCgpOwotCQkJaWYgKHJlbC5nZXRPd25lcigpID09IHJlbC5nZXRJbnZlcnNlKCkpIHsKLQkJCQlzZWxmUmVscy5hZGQocmVsKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWFkZE5ld1JlbGF0aW9uKGZwLCByZWwpOwotCQl9Ci0JCXJlbHNJdCA9IHNlbGZSZWxzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWxzSXQuaGFzTmV4dCgpKSB7Ci0JCQlJUmVsYXRpb24gcmVsID0gcmVsc0l0Lm5leHQoKTsKLQkJCWFkZE5ld1JlbGF0aW9uKGZwLCByZWwpOwotCQl9CQkKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1JlbGF0aW9uKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZnAsIElSZWxhdGlvbiByZWwpIHsKLQkJQWRkQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gbmV3IEFkZENvbm5lY3Rpb25Db250ZXh0KEpQQUVkaXRvclV0aWwKLQkJCQkuZ2V0QW5jaG9yKHJlbC5nZXRPd25lcigpLCBmcCksIEpQQUVkaXRvclV0aWwuZ2V0QW5jaG9yKHJlbAotCQkJCS5nZXRJbnZlcnNlKCksIGZwKSk7Ci0JCWN0eC5zZXROZXdPYmplY3QocmVsKTsKLQkJY3R4LnNldFRhcmdldENvbnRhaW5lcihmcC5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkuZ2V0RGlhZ3JhbSgpKTsKLQkJcmVmcmVzaEVudGl0eU1vZGVsKGZwLCByZWwuZ2V0T3duZXIoKSk7Ci0JCXJlZnJlc2hFbnRpdHlNb2RlbChmcCwgcmVsLmdldEludmVyc2UoKSk7Ci0JCUFkZFJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBBZGRSZWxhdGlvbkZlYXR1cmUoZnApOwotCQlmdC5hZGQoY3R4KTsJCQotCX0KLQkKLQlwcml2YXRlIFN0cmluZyBnZXRSZWxUeXBlTmFtZShSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbiBhbiwKLQkJCUphdmFSZXNvdXJjZUF0dHJpYnV0ZSBqcmEpIHsKLQkJU3RyaW5nIHJlbFR5cGVOYW1lID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWJvb2xlYW4gaXNNYXAgPSBqcmEuZ2V0VHlwZU5hbWUoKS5lcXVhbHMoImphdmEudXRpbC5NYXAiKTsJLy8kTk9OLU5MUy0xJAotCQkJcmVsVHlwZU5hbWUgPSBqcmEuZ2V0VHlwZVR5cGVBcmd1bWVudE5hbWUoaXNNYXAgPyAxIDogMCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQlpZiAocmVsVHlwZU5hbWUgPT0gbnVsbCkgCi0JCQlyZWxUeXBlTmFtZSA9IGFuLmdldEZ1bGx5UXVhbGlmaWVkVGFyZ2V0RW50aXR5Q2xhc3NOYW1lKCk7CQkJCQkJCQkJCQkJCi0JCWlmIChyZWxUeXBlTmFtZSA9PSBudWxsKSAKLQkJCXJlbFR5cGVOYW1lID0gSlBBRWRpdG9yVXRpbC5nZXRBdHRyaWJ1dGVUeXBlTmFtZShqcmEpOwkJCQkJCQkKLQkJcmV0dXJuIHJlbFR5cGVOYW1lOwotCX0KLQkJCi0JcHVibGljIEpwYVByb2plY3QgZ2V0SnBhUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SWRUeXBlKEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSWRDbGFzc0Fubm90YXRpb24gYW4gPSAoSWRDbGFzc0Fubm90YXRpb24panB0LmdldEphdmFSZXNvdXJjZVR5cGUoKS5nZXRBbm5vdGF0aW9uKElkQ2xhc3NBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWlmIChhbiAhPSBudWxsKQotCQkJcmV0dXJuIGFuLmdldEZ1bGx5UXVhbGlmaWVkQ2xhc3NOYW1lKCk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlW10gaWRzID0gZ2V0SWRzKGpwdCk7Ci0JCWlmIChpZHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBpZHNbMF0uZ2V0VHlwZU5hbWUoKTsKLQkJU3RyaW5nIHdyYXBwZXIgPSBKUEFFZGl0b3JVdGlsLmdldFByaW1pdGl2ZVdyYXBwZXIodHlwZSk7Ci0JCXJldHVybiAod3JhcHBlciAhPSBudWxsKSA/IHdyYXBwZXIgOiB0eXBlOwotCX0KLQkKLQlwdWJsaWMgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVbXSBnZXRJZHMoSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCkgewotCQlBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlcyA9IG5ldyBBcnJheUxpc3Q8SmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU+KCk7Ci0JCWZvciAoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXQgOiBqcHQuZ2V0QXR0cmlidXRlcygpKSB7Ci0JCQlpZiAoaXNJZChhdCkpCi0JCQkJcmVzLmFkZChhdCk7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVbXSByZXQgPSBuZXcgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGVbcmVzLnNpemUoKV07Ci0JCXJldHVybiByZXMudG9BcnJheShyZXQpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc0lkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlyZXR1cm4gaXNTaW1wbGVJZChqcGEpIHx8IGlzRW1iZWRkZWRJZChqcGEpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZUlkKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlJZEFubm90YXRpb24gYW4gPSAoSWRBbm5vdGF0aW9uKWpwYS5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSWRBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCXJldHVybiAoYW4gIT0gbnVsbCk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIGlzRW1iZWRkZWRJZChKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJRW1iZWRkZWRJZEFubm90YXRpb24gYW4gPSAoRW1iZWRkZWRJZEFubm90YXRpb24panBhLmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihFbWJlZGRlZElkQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlyZXR1cm4gKGFuICE9IG51bGwpOwotCX0JCi0JCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5OYW1lKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSkgewotCQlTdHJpbmcgY29sdW1uTmFtZT0gbnVsbDsKLQkJQ29sdW1uQW5ub3RhdGlvbiBhbiA9IChDb2x1bW5Bbm5vdGF0aW9uKWpwYS4KLQkJCQkJCQkJCWdldFJlc291cmNlQXR0cmlidXRlKCkuCi0JCQkJCQkJCQkJZ2V0QW5ub3RhdGlvbihDb2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWlmIChhbiAhPSBudWxsKSAKLQkJCWNvbHVtbk5hbWUgPSBhbi5nZXROYW1lKCk7Ci0JCWlmIChjb2x1bW5OYW1lID09IG51bGwpIAotCQkJY29sdW1uTmFtZSA9IGpwYS5nZXROYW1lKCk7CQkKLQkJcmV0dXJuIGNvbHVtbk5hbWU7IAotCX0KLQkKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1BlU2VydmljZVV0aWxJbXBsLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9QZVNlcnZpY2VVdGlsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWRjMjljLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1BlU2VydmljZVV0aWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHlDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLkdyYXBoaXRpOwotCi1wdWJsaWMgY2xhc3MgUGVTZXJ2aWNlVXRpbEltcGwgaW1wbGVtZW50cyBJUGVTZXJ2aWNlVXRpbCB7Ci0KLQlwdWJsaWMgRnJlZUZvcm1Db25uZWN0aW9uIGNyZWF0ZUZyZWVGb3JtQ29ubmVjdGlvbihEaWFncmFtIGRpYWdyYW0pIHsKLQkJcmV0dXJuIEdyYXBoaXRpLmdldFBlU2VydmljZSgpLmNyZWF0ZUZyZWVGb3JtQ29ubmVjdGlvbihkaWFncmFtKTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5Q29udGFpbmVyLCBrZXkpOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0eSBnZXRQcm9wZXJ0eShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSkgewotCQlyZXR1cm4gR3JhcGhpdGkuZ2V0UGVTZXJ2aWNlKCkuZ2V0UHJvcGVydHkocHJvcGVydHlDb250YWluZXIsIGtleSk7Ci0JfQotCQotCXB1YmxpYyBib29sZWFuIHJlbW92ZVByb3BlcnR5KFByb3BlcnR5Q29udGFpbmVyIHByb3BlcnR5Q29udGFpbmVyLCBTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eUNvbnRhaW5lciwga2V5KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShQcm9wZXJ0eUNvbnRhaW5lciBwcm9wZXJ0eUNvbnRhaW5lciwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CQotCQlHcmFwaGl0aS5nZXRQZVNlcnZpY2UoKS5zZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5Q29udGFpbmVyLCBrZXksIHZhbHVlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1Jlc291cmNlQ2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UzNDgyYS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotcHVibGljIGNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJSU1hcmtlckRlbHRhW10gbWFya2VyRGVsdGFzID0gZXZlbnQuZmluZE1hcmtlckRlbHRhcyhudWxsLCB0cnVlKTsKLQotCQlmb3IgKElNYXJrZXJEZWx0YSBkZWx0YSA6IG1hcmtlckRlbHRhcykgewotCQkJaWYgKGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGRlbHRhLmdldEtpbmQoKSAhPSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSAKLQkJCQljb250aW51ZTsKLQkJCWZpbmFsIElGaWxlIGZpbGUgPSAoSUZpbGUpIGRlbHRhLmdldFJlc291cmNlKCk7Ci0JCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCQljb250aW51ZTsKLQkJCWZpbmFsIElQcm9qZWN0IHByb2plY3QgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCWZpbmFsIFN0cmluZyBuYW1lID0gcHJvamVjdC5nZXROYW1lKCk7Ci0JCQlpZiAoZmlsZS5nZXRGdWxsUGF0aCgpLmVxdWFscyhNb2RlbEludGVncmF0aW9uVXRpbC5nZXREaWFncmFtWE1MRnVsbFBhdGgobmFtZSkpKSB7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2Ugd29ya2JlbmNoUGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvclJlZnMgPSB3b3JrYmVuY2hQYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQkJCWZvciAoSUVkaXRvclJlZmVyZW5jZSBlZGl0b3JSZWYgOiBlZGl0b3JSZWZzKSB7Ci0JCQkJCQkJaWYoIUpQQURpYWdyYW1FZGl0b3JQbHVnaW4uUExVR0lOX0lELmVxdWFscyhlZGl0b3JSZWYuZ2V0SWQoKSkpIAotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQlpZiAobmFtZS5lcXVhbHMoZWRpdG9yUmVmLmdldE5hbWUoKSkpIAotCQkJCQkJCQljb250aW51ZTsJCQkJCQkJCi0JCQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZWRpdG9yUmVmLmdldEVkaXRvcihmYWxzZSk7Ci0JCQkJCQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJCQkJCQljb250aW51ZTsKLQkJCQkJCQl3b3JrYmVuY2hQYWdlLmNsb3NlRWRpdG9yKGVkaXRvciwgZmFsc2UpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQkJCi0JCQl9Ci0JCX0JCQotCX0KLQkJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3BsdWdpbnMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL2ludGVybmFsL3V0aWwvU2l6ZVBvc2l0aW9uLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9TaXplUG9zaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk3MDEyYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9TaXplUG9zaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsOwotCi1wdWJsaWMgY2xhc3MgU2l6ZVBvc2l0aW9uIHsKLQkKLQlwcml2YXRlIGludCB3aWR0aDsKLQlwcml2YXRlIGludCBoZWlnaHQ7Ci0JcHJpdmF0ZSBpbnQgeDsKLQlwcml2YXRlIGludCB5OwotCi0JcHVibGljIGJvb2xlYW4gcHJpbWFyeUNvbGxhcHNlZDsKLQlwdWJsaWMgYm9vbGVhbiBiYXNpY0NvbGxhcHNlZDsKLQlwdWJsaWMgYm9vbGVhbiByZWxhdGlvbkNvbGxhcHNlZDsKLQkKLQlwdWJsaWMgU2l6ZVBvc2l0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHgsIGludCB5KSB7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7Ci0JCXRoaXMueCA9IHg7Ci0JCXRoaXMueSA9IHk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0V2lkdGgoKSB7Ci0JCXJldHVybiB3aWR0aDsKLQl9Ci0JCi0JcHVibGljIGludCBnZXRIZWlnaHQoKSB7Ci0JCXJldHVybiBoZWlnaHQ7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WCgpIHsKLQkJcmV0dXJuIHg7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0WSgpIHsKLQkJcmV0dXJuIHk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvcGx1Z2lucy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvaW50ZXJuYWwvdXRpbC9XcnAuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1dycC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmZmZTgxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci9wbHVnaW5zL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS9pbnRlcm5hbC91dGlsL1dycC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBXcnAgewotCXByaXZhdGUgT2JqZWN0IG9iajsKLQkKLQlwdWJsaWMgV3JwKCkge30KLQkKLQlwdWJsaWMgdm9pZCBzZXRPYmooT2JqZWN0IG9iaikgewotCQl0aGlzLm9iaiA9IG9iajsKLQl9Ci0JCi0JcHVibGljIE9iamVjdCBnZXRPYmooKSB7Ci0JCXJldHVybiBvYmo7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5jbGFzc3BhdGggYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmMDBjZS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjUiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2UvanB0L2NvbW1vbi91dGlsaXR5LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5jdnNpZ25vcmUgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEwNzdhNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5wcm9qZWN0IGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDVmNTYyLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzE3NmIzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jV2VkIE1hciAwOSAxMDoyMjoyMiBFU1QgMjAxMQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS41Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjUKZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2ODg1Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUVkaXRvclRlc3RzQWN0aXZhdG9yCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWFzeW1vY2s7YnVuZGxlLXZlcnNpb249IlsyLjQuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7YnVuZGxlLXZlcnNpb249IlsyLjUuMCwzLjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi50cmFuc2FjdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuNC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ2VmO2J1bmRsZS12ZXJzaW9uPSJbMy42LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5ncmFwaGl0aTtidW5kbGUtdmVyc2lvbj0iWzAuOC4wLDEuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZ3JhcGhpdGkudWk7YnVuZGxlLXZlcnNpb249IlswLjguMCwxLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5O2J1bmRsZS12ZXJzaW9uPSJbMi4wLjAsMy4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4wLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDIuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy40LjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZDtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzO2J1bmRsZS12ZXJzaW9uPSJbMS4yLjAsMi4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjIuMSwyLjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4zLjAsMi4wLjApIiwKLSBvcmcuanVuaXQ0O2J1bmRsZS12ZXJzaW9uPSJbNC44LjEsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW07YnVuZGxlLXZlcnNpb249IlsxLjMuMSwyLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwubGlzdGVuZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5wcm92aWRlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnJlbGF0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwudXRpbDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvYWJvdXQuaHRtbCBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTUzNGJhLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDAyLCAyMDA4PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YWRkN2UuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMTEgU0FQIEFHLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCwgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24KLSMgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4KLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIE9yYWNsZSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IC4sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgdGVzdC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YmNkODcuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBUbyBjb2RlIGRldmVsb3BlcjoKLSMgICBEbyBOT1QgY2hhbmdlIHRoZSBwcm9wZXJ0aWVzIGJldHdlZW4gdGhpcyBsaW5lIGFuZCB0aGUKLSMgICAiJSUlIEVORCBPRiBUUkFOU0xBVEVEIFBST1BFUlRJRVMgJSUlIiBsaW5lLgotIyAgIE1ha2UgYSBuZXcgcHJvcGVydHkgbmFtZSwgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgYW5kIGNoYW5nZQotIyAgIHRoZSBjb2RlIHRvIHVzZSB0aGUgbmV3IHByb3BlcnR5LgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jICUlJSBFTkQgT0YgVFJBTlNMQVRFRCBQUk9QRVJUSUVTICUlJQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1wbHVnaW5OYW1lPURhbGkgSmF2YSBQZXJzaXN0ZW5jZSBUb29scyAtIEpQQSBEaWFncmFtIEVkaXRvciBKVW5pdCBUZXN0cwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvcG9tLnhtbCBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWNkYTIzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JCi0JPHBhcmVudD4KLQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3JfcGFyZW50PC9hcnRpZmFjdElkPgotCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvcjwvZ3JvdXBJZD4KLQkJPHZlcnNpb24+MS4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0JCTxyZWxhdGl2ZVBhdGg+Li4vLi4vZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IucmVsZW5nL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLQk8L3BhcmVudD4KLQkKLQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qcHQudWkuZGlhZ3JhbWVkaXRvci50ZXN0PC9hcnRpZmFjdElkPgotCTxwYWNrYWdpbmc+ZWNsaXBzZS10ZXN0LXBsdWdpbjwvcGFja2FnaW5nPgotCTxuYW1lPkpQQSBEaWFncmFtIEVkaXRvciBUZXN0IFBsdWctaW48L25hbWU+Ci0JCi0JPGJ1aWxkPgotCQk8cGx1Z2lucz4KLQkJCTxwbHVnaW4+Ci0JCQkJPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLnR5Y2hvPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPm1hdmVuLW9zZ2ktdGVzdC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JCQkJPHZlcnNpb24+JHt0eWNoby12ZXJzaW9ufTwvdmVyc2lvbj4KLQkJCQk8Y29uZmlndXJhdGlvbj4KLQkJCQkJPHRlc3RTdWl0ZT5vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci50ZXN0czwvdGVzdFN1aXRlPgotCQkJCQk8dGVzdENsYXNzPm9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkFsbEpwYUVkaXRvclRlc3RzPC90ZXN0Q2xhc3M+Ci0JCQkJCTx1c2VVSUhhcm5lc3M+dHJ1ZTwvdXNlVUlIYXJuZXNzPgotCQkJCQk8dXNlVUlUaHJlYWQ+dHJ1ZTwvdXNlVUlUaHJlYWQ+Ci0JCQkJCTxhcmdMaW5lPi1YbXMxMjhtIC1YbXg1MTJtIC1YWDpNYXhQZXJtU2l6ZT0yNTZtPC9hcmdMaW5lPgotCQkJCQk8cHJvZHVjdD5vcmcuZWNsaXBzZS5zZGsuaWRlPC9wcm9kdWN0PgotCQkJCQk8YXBwbGljYXRpb24+b3JnLmVjbGlwc2UudWkuaWRlLndvcmtiZW5jaDwvYXBwbGljYXRpb24+Ci0JCQkJCTxkZXBlbmRlbmNpZXM+Ci0JCQkJCQk8ZGVwZW5kZW5jeT4KLQkJCQkJCQk8dHlwZT5wMi1pbnN0YWxsYWJsZS11bml0PC90eXBlPgotCQkJCQkJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnNkay5pZGU8L2FydGlmYWN0SWQ+Ci0JCQkJCQkJPHZlcnNpb24+MC4wLjA8L3ZlcnNpb24+Ci0JCQkJCQk8L2RlcGVuZGVuY3k+Ci0JCQkJCTwvZGVwZW5kZW5jaWVzPgotCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCTwvcGx1Z2luPgotCQk8L3BsdWdpbnM+Ci0JPC9idWlsZD4KLQkKLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0FsbEpwYUVkaXRvclRlc3RzLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0FsbEpwYUVkaXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3OWUyZDYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9BbGxKcGFFZGl0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmVkaXRvci5DcmVhdGVEaWFncmFtVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlLkFkZEF0dHJpYnV0ZUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmUuQWRkSlBBRW50aXR5RmVhdHVyZVRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZS5BZGRSZWxhdGlvbkZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmUuRGVsZXRlUmVsYXRpb25GZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlLkRpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlLkxheW91dEVudGl0eUZlYXR1cmVUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udXRpbC5Nb2RlbEludGVncmF0aW9uVXRpbFRlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2VUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnByb3ZpZGVyLkpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWxUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnV0aWwuSlBBU29sdmVyVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlLlN1aXRlQ2xhc3NlczsKLQotLyoqCi0gKiBBbGxKcGFFZGl0b3JUZXN0cwotICogCi0gKiBSZXF1aXJlZCBKYXZhIHN5c3RlbSBwcm9wZXJ0aWVzOgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuanBhLmphcj08anBhLmphciBwYXRoPgotICogICAgLURvcmcuZWNsaXBzZS5qcHQuZWNsaXBzZWxpbmsuamFyPTxlY2xpcHNlbGluay5qYXIgcGF0aD4KLSAqLwotCi1AUnVuV2l0aChTdWl0ZS5jbGFzcykKLUBTdWl0ZUNsYXNzZXMoIHsKLS8vCQkJCUNyZWF0ZURpYWdyYW1UZXN0LmNsYXNzLAotCQkJCUpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplclRlc3QuY2xhc3MsCi0JIAkJCUpQQUVkaXRvclByZWZlcmVuY2VzUGFnZVRlc3QuY2xhc3MsCi0JIAkJCUFkZEpQQUVudGl0eUZlYXR1cmVUZXN0LmNsYXNzLAotLy8JCQkJQ2xpY2tBZGRGZWF0dXJlVGVzdC5jbGFzcywKLS8vCQkJCUNyZWF0ZURlbGV0ZUVudGl0eS5jbGFzcywKLQkJCQlEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QuY2xhc3MsCi0JCQkJRWRpdG9yVGVzdC5jbGFzcywJCi0JCQkJSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJUZXN0LmNsYXNzLAotCQkJCUpQQUVkaXRvclV0aWxUZXN0LmNsYXNzLAotCQkJCUpQQVNvbHZlclRlc3QuY2xhc3MsCi0vLwkJCQlPcGVuTWluaWF0dXJlVmlld0ZlYXR1cmVUZXN0LmNsYXNzLAotLy8JCQkJUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZVRlc3QuY2xhc3MsCi0vLwkJCQlTYXZlRW50aXR5RmVhdHVyZVRlc3QuY2xhc3MsCi0JCQkJQWRkUmVsYXRpb25GZWF0dXJlVGVzdC5jbGFzcywKLQkJCQlBZGRBdHRyaWJ1dGVGZWF0dXJlVGVzdC5jbGFzcywKLS8vCQkJCUNyZWF0ZURlbGV0ZU9ubHlBdHRyaWJ1dGVUZXN0LmNsYXNzLAotLy8JCQkJSlBBUHJvamVjdExpc3RlbmVyVGVzdC5jbGFzcywKLS8vCQkJCU1vZGVsSW50ZWdyYXRpb25UZXN0LmNsYXNzLAotCQkJCU1vZGVsSW50ZWdyYXRpb25VdGlsVGVzdC5jbGFzcywKLQkJCQlMYXlvdXRFbnRpdHlGZWF0dXJlVGVzdC5jbGFzcywKLQkJCQlEZWxldGVSZWxhdGlvbkZlYXR1cmVUZXN0LmNsYXNzLAotLy8JCQkJQ3JlYXRlUmVsYXRpb25zVGVzdC5jbGFzcwotCQkJCX0pCi0KLXB1YmxpYyBjbGFzcyBBbGxKcGFFZGl0b3JUZXN0cyB7Ci0JCi0JLyoqCi0JICogVGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgdG8gYWJvcnQgdGhlIHRlc3Qgc3VpdGUgaW4gdGhlIGJ1aWxkIAotCSAqIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIG5vdCBzZXR1cCBwcm9wZXJseS4KLQkgKiAKLQkgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24KLQkgKi8KLSAgICBAQmVmb3JlQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5UmVxdWlyZWRKYXJzRXhpc3RzKCkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotICAgIAl2ZXJpZnlKcGFKYXJFeGlzdHMoKTsKLSAgICAJdmVyaWZ5RWNsaXBzZUxpbmtKYXJFeGlzdHMoKTsKLSAgICB9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeUpwYUphckV4aXN0cygpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLQkJdmVyaWZ5UmVxdWlyZWRQcm9wZXJ0eUV4aXN0cyhKUEFDcmVhdGVGYWN0b3J5LkpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCQl2ZXJpZnlSZXF1aXJlZEZpbGVFeGlzdHMoSlBBQ3JlYXRlRmFjdG9yeS5KUEFfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZKTsKLQl9Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlFY2xpcHNlTGlua0phckV4aXN0cygpIHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIHsKLQkJdmVyaWZ5UmVxdWlyZWRQcm9wZXJ0eUV4aXN0cyhKUEFDcmVhdGVGYWN0b3J5LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JCXZlcmlmeVJlcXVpcmVkRmlsZUV4aXN0cyhKUEFDcmVhdGVGYWN0b3J5LkVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JfQotCQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVJlcXVpcmVkUHJvcGVydHlFeGlzdHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gewotCQlpZihKUEFDcmVhdGVGYWN0b3J5LmdldFN5c3RlbVByb3BlcnR5KHByb3BlcnR5TmFtZSkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oZXJyb3JNaXNzaW5nUHJvcGVydHkocHJvcGVydHlOYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVJlcXVpcmVkRmlsZUV4aXN0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmaWxlTmFtZSA9IEpQQUNyZWF0ZUZhY3RvcnkuZ2V0U3lzdGVtUHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJaWYoICEgKG5ldyBGaWxlKGZpbGVOYW1lKSkuZXhpc3RzKCkpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKGVycm9ySmFyRmlsZURvZXNOb3RFeGlzdChmaWxlTmFtZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVycm9yTWlzc2luZ1Byb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuICJNaXNzaW5nIEphdmEgc3lzdGVtIHByb3BlcnR5OiBcIiIgKyBwcm9wZXJ0eU5hbWUgKyAiXCIiOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBlcnJvckphckZpbGVEb2VzTm90RXhpc3QoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCXJldHVybiAiSkFSIGZpbGUgZG9lc24ndCBleGlzdDogXCIiICsgZmlsZU5hbWUgKyAiXCIiOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9KUEFDcmVhdGVGYWN0b3J5LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0pQQUNyZWF0ZUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwNGViNi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0pQQUNyZWF0ZUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlRGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuQXJyYXlUb29sczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuaW50ZXJuYWwuZmFjZXQuSnBhRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5pbnRlcm5hbC5mYWNldC5KcGFGYWNldEluc3RhbGxEYXRhTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuZGF0YW1vZGVsLnByb3BlcnRpZXMuSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmZyYW1ld29ya3MuZGF0YW1vZGVsLkRhdGFNb2RlbEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5mcmFtZXdvcmtzLmRhdGFtb2RlbC5JRGF0YU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLklGYWNldGVkUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JUHJvamVjdEZhY2V0VmVyc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5Qcm9qZWN0RmFjZXRzTWFuYWdlcjsKLQotQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKLXB1YmxpYyBjbGFzcyBKUEFDcmVhdGVGYWN0b3J5IHsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKUEFfSkFSX05BTUVfU1lTVEVNX1BST1BFUlRZID0gIm9yZy5lY2xpcHNlLmpwdC5qcGEuamFyIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFTElOS19KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmphciI7CQotCQotCXByaXZhdGUgc3RhdGljIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3Q7IAotCXByaXZhdGUgSVByb2plY3QgcHJvamVjdDsgCi0JcHJpdmF0ZSBJSmF2YVByb2plY3QgamF2YVByb2plY3Q7Ci0JLy9wcml2YXRlIElQYWNrYWdlRnJhZ21lbnRSb290IHNvdXJjZUZvbGRlcjsKLQlKcGFQcm9qZWN0IGpwYVByb2plY3Q7Ci0JCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSlBBQ3JlYXRlRmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCWZhY3RvcnkgPSBuZXcgSlBBQ3JlYXRlRmFjdG9yeSgpOwotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJvamVjdCBidWlsZFBsYXRmb3JtUHJvamVjdChTdHJpbmcgcHJvamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVdvcmtzcGFjZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldERlc2NyaXB0aW9uKCk7Ci0JCWRlc2NyaXB0aW9uLnNldEF1dG9CdWlsZGluZyh0cnVlKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsJCQotCQlJUHJvamVjdCBwID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJcC5jcmVhdGUobnVsbCk7Ci0JCXAub3BlbihudWxsKTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHJvdGVjdGVkIElEYXRhTW9kZWwgYnVpbGRKcGFDb25maWdEYXRhTW9kZWwoKSB7Ci0JCUlEYXRhTW9kZWwgZGF0YU1vZGVsID0gRGF0YU1vZGVsRmFjdG9yeS5jcmVhdGVEYXRhTW9kZWwobmV3IEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyKCkpOwkJCi0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShJRmFjZXREYXRhTW9kZWxQcm9wZXJ0aWVzLkZBQ0VUX1ZFUlNJT05fU1RSLCAiMS4wIik7Ci0JCWRhdGFNb2RlbC5zZXRQcm9wZXJ0eShKcGFGYWNldERhdGFNb2RlbFByb3BlcnRpZXMuUExBVEZPUk0sIG51bGwgLypHZW5lcmljUGxhdGZvcm0uVkVSU0lPTl8xXzAuZ2V0SWQoKSovKTsKLQkJZGF0YU1vZGVsLnNldFByb3BlcnR5KEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3BlcnRpZXMuQ1JFQVRFX09STV9YTUwsIEJvb2xlYW4uVFJVRSk7Ci0JCXJldHVybiBkYXRhTW9kZWw7Ci0JfQotCQotCXB1YmxpYyBKcGFQcm9qZWN0IGNyZWF0ZUpQQVByb2plY3QoU3RyaW5nIHByb2plY3ROYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVKUEFQcm9qZWN0KHByb2plY3ROYW1lLCBudWxsLCAiMS4wIik7Ci0JfQotCi0JcHVibGljIEpwYVByb2plY3QgY3JlYXRlSlBBMjBQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXR1cm4gY3JlYXRlSlBBUHJvamVjdChwcm9qZWN0TmFtZSwgbnVsbCwgIjIuMCIpOwotCX0KLQkKLQkKLQlwdWJsaWMgSnBhUHJvamVjdCBjcmVhdGVKUEFQcm9qZWN0KFN0cmluZyBwcm9qZWN0TmFtZSwgSURhdGFNb2RlbCBqcGFDb25maWcsIFN0cmluZyBqcGFGYWNldFZlcnNpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcHJvamVjdCA9IGJ1aWxkUGxhdGZvcm1Qcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJamF2YVByb2plY3QgPSBjcmVhdGVKYXZhUHJvamVjdChwcm9qZWN0LCB0cnVlKTsKLQkJaWYgKGpwYUNvbmZpZyAhPSBudWxsKSB7Ci0JCQlqcGFGYWNldFZlcnNpb24gPSBqcGFDb25maWcuZ2V0U3RyaW5nUHJvcGVydHkoSUZhY2V0RGF0YU1vZGVsUHJvcGVydGllcy5GQUNFVF9WRVJTSU9OX1NUUik7Ci0JCX0KLQkJaW5zdGFsbEZhY2V0KGZhY2V0ZWRQcm9qZWN0LCAianN0LnV0aWxpdHkiLCAiMS4wIik7Ci0JCWluc3RhbGxGYWNldChmYWNldGVkUHJvamVjdCwgImpwdC5qcGEiLCBqcGFGYWNldFZlcnNpb24sIGpwYUNvbmZpZyk7Ci0JCWFkZEphcihqYXZhUHJvamVjdCwganBhSmFyTmFtZSgpKTsKLQkJaWYgKGVjbGlwc2VMaW5rSmFyTmFtZSgpICE9IG51bGwpIHsKLQkJCWFkZEphcihqYXZhUHJvamVjdCwgZWNsaXBzZUxpbmtKYXJOYW1lKCkpOwotCQl9Ci0JCXByb2plY3QucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCWpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKGpwYVByb2plY3QgPT0gbnVsbCkgJiYgKGNudCA8IDEwMDApKXsKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCWpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QocHJvamVjdCk7Ci0JCQljbnQrKzsKLQkJfQotCQlqcGFQcm9qZWN0LnNldERpc2NvdmVyc0Fubm90YXRlZENsYXNzZXModHJ1ZSk7Ci0vLwkJanBhUHJvamVjdC5zZXRVcGRhdGVyKG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKGpwYVByb2plY3QpKTsKLQkJcmV0dXJuIGpwYVByb2plY3Q7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVjbGlwc2VMaW5rSmFyTmFtZSgpIHsKLQkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEVDTElQU0VMSU5LX0pBUl9OQU1FX1NZU1RFTV9QUk9QRVJUWSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGluc3RhbGxGYWNldChJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QsCi0JCQkJCQkJIFN0cmluZyBmYWNldE5hbWUsIAotCQkJCQkJCSBTdHJpbmcgdmVyc2lvbk5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaW5zdGFsbEZhY2V0KGZhY2V0ZWRQcm9qZWN0LCBmYWNldE5hbWUsIHZlcnNpb25OYW1lLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGxGYWNldChJRmFjZXRlZFByb2plY3QgZmFjZXRlZFByb2plY3QsCi0JCQkJCQkJICAgU3RyaW5nIGZhY2V0TmFtZSwgCi0JCQkJCQkJICAgU3RyaW5nIHZlcnNpb25OYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXVuaW5zdGFsbEZhY2V0KGZhY2V0ZWRQcm9qZWN0LCBmYWNldE5hbWUsIHZlcnNpb25OYW1lLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBpZiAnY29uZmlnJyBpcyBudWxsIChhbmQgJ2ZhY2V0TmFtZScgaXMgImpwdC5qcGEiKSwgdGhlIEpQQSBwcm9qZWN0IHdpbGwgYmUgYnVpbHQgd2l0aCB0aGUgZGVmYXVsdHMKLQkgKiBkZWZpbmVkIGluIEpwYUZhY2V0SW5zdGFsbERhdGFNb2RlbFByb3ZpZGVyI2dldERlZmF1bHRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbEZhY2V0KElGYWNldGVkUHJvamVjdCBmYWNldGVkUHJvamVjdCwKLQkJCQkJCQkgU3RyaW5nIGZhY2V0TmFtZSwgCi0JCQkJCQkJIFN0cmluZyB2ZXJzaW9uTmFtZSwgCi0JCQkJCQkJIElEYXRhTW9kZWwgY29uZmlnKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZhY2V0ZWRQcm9qZWN0Lmluc3RhbGxQcm9qZWN0RmFjZXQodGhpcy5mYWNldFZlcnNpb24oZmFjZXROYW1lLCB2ZXJzaW9uTmFtZSksIGNvbmZpZywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsRmFjZXQoSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWRQcm9qZWN0LAotCQkJCQkJCSAgIFN0cmluZyBmYWNldE5hbWUsIAotCQkJCQkJCSAgIFN0cmluZyB2ZXJzaW9uTmFtZSwgCi0JCQkJCQkJICAgSURhdGFNb2RlbCBjb25maWcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmFjZXRlZFByb2plY3QudW5pbnN0YWxsUHJvamVjdEZhY2V0KHRoaXMuZmFjZXRWZXJzaW9uKGZhY2V0TmFtZSwgdmVyc2lvbk5hbWUpLCBjb25maWcsIG51bGwpOwotCX0KLQotCXByaXZhdGUgSVByb2plY3RGYWNldFZlcnNpb24gZmFjZXRWZXJzaW9uKFN0cmluZyBmYWNldE5hbWUsIFN0cmluZyB2ZXJzaW9uTmFtZSkgewotCQlyZXR1cm4gUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KGZhY2V0TmFtZSkuZ2V0VmVyc2lvbih2ZXJzaW9uTmFtZSk7Ci0JfQotCQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEphcihJSmF2YVByb2plY3QgamF2YVByb2plY3QsIFN0cmluZyBqYXJQYXRoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJdGhpcy5hZGRDbGFzc3BhdGhFbnRyeShqYXZhUHJvamVjdCwgSmF2YUNvcmUubmV3TGlicmFyeUVudHJ5KG5ldyBQYXRoKGphclBhdGgpLCBudWxsLCBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aEVudHJ5KElKYXZhUHJvamVjdCBqYXZhUHJvamVjdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJamF2YVByb2plY3Quc2V0UmF3Q2xhc3NwYXRoKEFycmF5VG9vbHMuYWRkKGphdmFQcm9qZWN0LmdldFJhd0NsYXNzcGF0aCgpLCBlbnRyeSksIG51bGwpOwotCX0KLQkKLQlwcml2YXRlIElGYWNldGVkUHJvamVjdCBjcmVhdGVGYWNldGVkUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCwgdHJ1ZSwgbnVsbCk7CQkvLyB0cnVlID0gImNvbnZlcnQgaWYgbmVjZXNzYXJ5IgotCX0KLQkKLQlwdWJsaWMgSUphdmFQcm9qZWN0IGNyZWF0ZUphdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QsICAKLQkJCQkJCQkJCQkgIGJvb2xlYW4gYXV0b0J1aWxkKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZhY2V0ZWRQcm9qZWN0ID0gY3JlYXRlRmFjZXRlZFByb2plY3QocHJvamVjdCk7Ci0JCWluc3RhbGxGYWNldChmYWNldGVkUHJvamVjdCwgImpzdC5qYXZhIiwgIjUuMCIpOwotCQlqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShwcm9qZWN0KTsKLQkJLy9zb3VyY2VGb2xkZXIgPSBqYXZhUHJvamVjdC5nZXRQYWNrYWdlRnJhZ21lbnRSb290KHByb2plY3QuZ2V0Rm9sZGVyKCJzcmMiKSk7Ci0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcganBhSmFyTmFtZSgpIHsKLQkJcmV0dXJuIGdldFN5c3RlbVByb3BlcnR5KEpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFkpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5KEpwYVByb2plY3QganBhUHJvamVjdCwgU3RyaW5nIGZ1bGx5UXVhbGlmaWVkTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZ1bGx5UXVhbGlmaWVkTmFtZSwgIi4iKTsKLQkJQXJyYXlMaXN0PFN0cmluZz4gbmFtZUVsZW1lbnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0JCXdoaWxlKHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKSl7Ci0JCQluYW1lRWxlbWVudHMuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJQXJyYXlMaXN0PFN0cmluZz4gcGFja2FnZUZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCQlmb3IoaW50IGk9MDtpPG5hbWVFbGVtZW50cy5zaXplKCktMTtpKyspewotCQkJcGFja2FnZUZyYWdtZW50cy5hZGQobmFtZUVsZW1lbnRzLmdldChpKSk7Ci0JCX0KLQkJU3RyaW5nW10gcGFja2FnZVN0cmluZ3MgPSBuZXcgU3RyaW5nW3BhY2thZ2VGcmFnbWVudHMuc2l6ZSgpXTsKLQkJZm9yKGludCBpPTA7aTxwYWNrYWdlRnJhZ21lbnRzLnNpemUoKTtpKyspewotCQkJcGFja2FnZVN0cmluZ3NbaV0gPSBwYWNrYWdlRnJhZ21lbnRzLmdldChpKTsKLQkJfQotCQlTdHJpbmcgbmFtZSA9IG5hbWVFbGVtZW50cy5nZXQoTWF0aC5tYXgoMCwgbmFtZUVsZW1lbnRzLnNpemUoKS0xKSk7Ci0vLwkJU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlciB1cGRhdGVyID0gbmV3IFN5bmNocm9ub3VzSnBhUHJvamVjdFVwZGF0ZXIoanBhUHJvamVjdCk7Ci0vLwkJdXBkYXRlci5zdGFydCgpOwotCQlKcGFSb290Q29udGV4dE5vZGUganBhUHJvamVjdENvbnRlbnQgPSBqcGFQcm9qZWN0LmdldFJvb3RDb250ZXh0Tm9kZSgpOwotCQlQZXJzaXN0ZW5jZVhtbCBwZXJzWE1MID0ganBhUHJvamVjdENvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKTsKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgocGVyc1hNTCA9PSBudWxsKSAmJiAoY250IDwgMTAwKSkgewkJCi0JCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCXBlcnNYTUwgPSBqcGFQcm9qZWN0Q29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQkJY250Kys7Ci0JCX0KLQkJaWYgKHBlcnNYTUwgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIHBlcnNpc3RlbmNlIFhNTCBpcyBub3QgY3JlYXRlZCIpOwotCQkKLQkJSUZpbGUgZW50aXR5MSA9IGNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgcGFja2FnZVN0cmluZ3MsIG5hbWUpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUganJwdCA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZShmdWxseVF1YWxpZmllZE5hbWUpOwotCQljbnQgPSAwOwotCQl3aGlsZSgoanJwdCA9PSBudWxsKSAmJiAoY250IDwgMTAwKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSAKLQkJCWpycHQgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoZnVsbHlRdWFsaWZpZWROYW1lKTsKLQkJCWNudCsrOwotCQl9Ci0JCWlmIChqcnB0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBlbnRpdHkgJyIgKyBmdWxseVF1YWxpZmllZE5hbWUgKyAiJyBjb3VsZCBub3QgYmUgY3JlYXRlZCIpOwkJCi0JCXJldHVybiBlbnRpdHkxOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIAotCQkJCQkJCQkJICAgU3RyaW5nW10gcGFja2FnZUZyYWdtZW50cywgCi0JCQkJCQkJCQkgICBTdHJpbmcgZW50aXR5TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCAKLQkJCQkJCQkJCSAgIAkJCQkJCQkgQ29yZUV4Y2VwdGlvbiwgCi0JCQkJCQkJCQkgICAJCQkJCQkJIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmb2xkZXJOYW1lID0gZ2V0Rm9sZGVyTmFtZShwcm9qZWN0LCBwYWNrYWdlRnJhZ21lbnRzKTsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZUZyYWdtZW50c1swXTsJCQotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhY2thZ2VOYW1lICs9ICIuIiArIHBhY2thZ2VGcmFnbWVudHNbaV07Ci0JCX0KLQkJCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXRoKTsJCSAKLQkJcmV0dXJuIGNyZWF0ZUVudGl0eShmb2xkZXIsIHBhY2thZ2VOYW1lICwgZW50aXR5TmFtZSk7Ci0JfQotCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlwcml2YXRlIFN0cmluZyBnZXRGb2xkZXJOYW1lKElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHBhY2thZ2VGcmFnbWVudHMpCi0JCQl0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwkJCi0JCUlQYWNrYWdlRnJhZ21lbnRSb290W10gcGFja2FnZUZyYWdtZW50Um9vdHMgPSBuZXcgSVBhY2thZ2VGcmFnbWVudFJvb3RbMF07Ci0JCWZpbmFsIElDbGFzc3BhdGhFbnRyeVtdIGNsYXNzcGF0aEVudHJpZXMgPSAgamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CQkKLQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgY2xhc3NwYXRoRW50cnkgOiBjbGFzc3BhdGhFbnRyaWVzKSB7Ci0JCQlpZiAoY2xhc3NwYXRoRW50cnkuZ2V0RW50cnlLaW5kKCkgPT0gSUNsYXNzcGF0aEVudHJ5LkNQRV9TT1VSQ0UpIHsKLQkJCQlwYWNrYWdlRnJhZ21lbnRSb290cyA9IGphdmFQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKGNsYXNzcGF0aEVudHJ5KTsKLQkJCQlicmVhazsKLQkJCX0gIAkJCQotCQl9Ci0JCQotCQlTdHJpbmcgZm9sZGVyTmFtZSA9IHBhY2thZ2VGcmFnbWVudFJvb3RzWzBdLmdldFJlc291cmNlKCkuZ2V0TmFtZSgpOwotCQlmb3IgKFN0cmluZyBmcmFnbWVudCA6IHBhY2thZ2VGcmFnbWVudHMpIHsKLQkJCWZvbGRlck5hbWUgKz0gUGF0aC5TRVBBUkFUT1IgKyBmcmFnbWVudDsKLQkJfQotCQlyZXR1cm4gZm9sZGVyTmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRmlsZSBjcmVhdGVFbnRpdHkoSUZvbGRlciBmb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCWNyZWF0ZURpcmVjdG9yaWVzKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGVudGl0eVNob3J0TmFtZSArICIuamF2YSIpOwkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iIAotCQkJCQkrICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjtcblxuIiAKLQkJCQkJKyAiQEVudGl0eSBcbiIKLQkJCQkJKyAicHVibGljIGNsYXNzICIgKyBlbnRpdHlTaG9ydE5hbWUgKyAiIHtcbiIKLQkJCQkJKyAiCXByaXZhdGUgaW50IGlkO1xuIgotCQkJCQkrICIJQElkIFxuIgotCQkJCQkrICIJcHVibGljIGludCBnZXRJZCgpIHtcbiIgCi0JCQkJCSsgIgkJcmV0dXJuIGlkO1xuIgotCQkJCQkrICIJfVxuIgotCQkJCQkrICIJcHVibGljIHZvaWQgc2V0SWQoaW50IGlkKSB7XG4iCi0JCQkJCSsgIgkJdGhpcy5pZCA9IGlkO1xuIiAKLQkJCQkJKyAiCX1cbiIKLQkJCQkJKyAifSI7IC8vJE5PTi1OTFMtMSQKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCXN0cmVhbS53cml0ZShjb250ZW50LmdldEJ5dGVzKCkpOwotCQkJCXN0cmVhbS5mbHVzaCgpOwotCQkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJlYW0udG9CeXRlQXJyYXkoKSksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0JCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQkKLQkKLQlwdWJsaWMgSUZpbGUgY3JlYXRlRW50aXR5V2l0aENvbXBvc2l0ZVBLSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmdbXSBwYWNrYWdlRnJhZ21lbnRzLCBTdHJpbmcgZW50aXR5TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQ29yZUV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZvbGRlck5hbWUgPSBnZXRGb2xkZXJOYW1lKHByb2plY3QsIHBhY2thZ2VGcmFnbWVudHMpOwotCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VGcmFnbWVudHNbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFja2FnZUZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcGFja2FnZU5hbWUgKz0gIi4iICsgcGFja2FnZUZyYWdtZW50c1tpXTsKLQkJfQotCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXRoKTsKLQkJcmV0dXJuIGNyZWF0ZUVudGl0eVdpdGhDb21wb3NpdGVQSyhmb2xkZXIsIHBhY2thZ2VOYW1lLCBlbnRpdHlOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgY3JlYXRlSWRDbGFzc0luUHJvamVjdChJUHJvamVjdCBwcm9qZWN0LAotCQkJU3RyaW5nW10gcGFja2FnZUZyYWdtZW50cywgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCUNvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmb2xkZXJOYW1lID0gZ2V0Rm9sZGVyTmFtZShwcm9qZWN0LCBwYWNrYWdlRnJhZ21lbnRzKTsKLQotCQlTdHJpbmcgcGFja2FnZU5hbWUgPSBwYWNrYWdlRnJhZ21lbnRzWzBdOwotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhY2thZ2VOYW1lICs9ICIuIiArIHBhY2thZ2VGcmFnbWVudHNbaV07Ci0JCX0KLQotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgoZm9sZGVyTmFtZSk7Ci0JCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIocGF0aCk7Ci0JCXJldHVybiBjcmVhdGVJZENsYXNzKGZvbGRlciwgcGFja2FnZU5hbWUsIGVudGl0eU5hbWUpOwotCX0KLQotCXB1YmxpYyBJRmlsZSBjcmVhdGVFbWJlZGRlZENsYXNzSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmdbXSBwYWNrYWdlRnJhZ21lbnRzLCBTdHJpbmcgZW50aXR5TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQ29yZUV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZvbGRlck5hbWUgPSBnZXRGb2xkZXJOYW1lKHByb2plY3QsIHBhY2thZ2VGcmFnbWVudHMpOwotCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VGcmFnbWVudHNbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFja2FnZUZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcGFja2FnZU5hbWUgKz0gIi4iICsgcGFja2FnZUZyYWdtZW50c1tpXTsKLQkJfQotCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXRoKTsKLQkJcmV0dXJuIGNyZWF0ZUVtYmVkZGVkQ2xhc3MoZm9sZGVyLCBwYWNrYWdlTmFtZSwgZW50aXR5TmFtZSk7Ci0JfQotCi0JcHVibGljIElGaWxlIGNyZWF0ZUVudGl0eVdpdGhFbWJlZGRlZFBLSW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsCi0JCQlTdHJpbmdbXSBwYWNrYWdlRnJhZ21lbnRzLCBTdHJpbmcgZW50aXR5TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAotCQkJQ29yZUV4Y2VwdGlvbiwgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGZvbGRlck5hbWUgPSBnZXRGb2xkZXJOYW1lKHByb2plY3QsIHBhY2thZ2VGcmFnbWVudHMpOwotCi0JCVN0cmluZyBwYWNrYWdlTmFtZSA9IHBhY2thZ2VGcmFnbWVudHNbMF07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcGFja2FnZUZyYWdtZW50cy5sZW5ndGg7IGkrKykgewotCQkJcGFja2FnZU5hbWUgKz0gIi4iICsgcGFja2FnZUZyYWdtZW50c1tpXTsKLQkJfQotCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXRoKTsKLQkJcmV0dXJuIGNyZWF0ZUVudGl0eVdpdGhFbWJlZGRlZFBLKGZvbGRlciwgcGFja2FnZU5hbWUsIGVudGl0eU5hbWUpOwotCX0KLQkKLQkJCi0JCQotCQlwcml2YXRlIElGaWxlIGNyZWF0ZUVudGl0eVdpdGhDb21wb3NpdGVQSyhJRm9sZGVyIGZvbGRlciwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZW50aXR5TmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uewotCQkJU3RyaW5nIGVudGl0eVNob3J0TmFtZSA9IGVudGl0eU5hbWUuc3Vic3RyaW5nKGVudGl0eU5hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQljcmVhdGVEaXJlY3Rvcmllcyhmb2xkZXIsIHRydWUsIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGVudGl0eVNob3J0TmFtZSArICIuamF2YSIpOwkJCi0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgY29udGVudCA9ICJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7XG5cbiIgCi0JCQkJCQkrICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjtcblxuIiAKLQkJCQkJCSsgIkBFbnRpdHkgXG4iCi0JCQkJCQkrICJASWRDbGFzcygiK2VudGl0eVNob3J0TmFtZSsiSWQuY2xhc3MpIgotCQkJCQkrICJwdWJsaWMgY2xhc3MgIiArIGVudGl0eVNob3J0TmFtZSArICIge1xuIgotCQkJCQkJKyAiCUBJZCBcbiIKLQkJCQkJCSsgIglwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7XG4iCi0JCQkJCQkrICIJQElkIFxuIgotCQkJCQkJKyAiCXByaXZhdGUgU3RyaW5nIGxhc3ROYW1lO1xuIgotCQkJCQkJKyAiIHB1YmxpYyAiK2VudGl0eVNob3J0TmFtZSsiSWQoKSB7fVxuIgotCSAgICAgICAgICAgICAgICAgICAgKyAiIHB1YmxpYyAiK2VudGl0eVNob3J0TmFtZSsiSWQoU3RyaW5nIGZpcnN0TmFtZSwgU3RyaW5nIGxhc3ROYW1lKVxueyIKLQkgICAgICAgICAgICAgICAgICAgICsgIiAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7XG4iCi0JICAgICAgICAgICAgICAgICAgICArICIgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTtcbiIKLQkgICAgICAgICAgICAgICAgICAgICsgIiB9XG4iCi0JCQkJCQkrICJ9IjsgLy8kTk9OLU5MUy0xJAotCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJCXN0cmVhbS5mbHVzaCgpOwotCQkJCQlmaWxlLmNyZWF0ZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyZWFtLnRvQnl0ZUFycmF5KCkpLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQl9CQotCQkJfQotCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCQotCQlwcml2YXRlIElGaWxlIGNyZWF0ZUlkQ2xhc3MoSUZvbGRlciBmb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbnsKLQkJCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJY3JlYXRlRGlyZWN0b3JpZXMoZm9sZGVyLCB0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShlbnRpdHlTaG9ydE5hbWUgKyAiSWQuamF2YSIpOwkJCi0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlTdHJpbmcgY29udGVudCA9ICJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7XG5cbiIgCi0JCQkJCQkrICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjtcblxuIiAKLQkJCQkJCSsiaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOyIKLQkJCQkJCSsgInB1YmxpYyBjbGFzcyAiICsgZW50aXR5U2hvcnROYW1lICsgIklkIHtcbiIKLQkJCQkJCSsgIglwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7XG4iCi0JCQkJCQkrICIJcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7XG4iCi0JCQkJCQkrICIJcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKSB7XG4iIAotCQkJCQkJKyAiCQlyZXR1cm4gZmlyc3ROYW1lO1xuIgotCQkJCQkJKyAiCX1cbiIKLQkJCQkJCSsgIglwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkge1xuIgotCQkJCQkJKyAiCQl0aGlzLmZpcnN0TmFtZSA9IGZpcnN0TmFtZTtcbiIgCi0JCQkJCQkrICIJfVxuIgotCQkJCQkJKyAiCXB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7XG4iIAotCQkJCQkJKyAiCQlyZXR1cm4gbGFzdE5hbWU7XG4iCi0JCQkJCQkrICIJfVxuIgotCQkJCQkJKyAiCXB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkge1xuIgotCQkJCQkJKyAiCQl0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7XG4iIAotCQkJCQkJKyAiCX1cbiIKLQkJCQkJCSsgIn0iOyAvLyROT04tTkxTLTEkCi0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ud3JpdGUoY29udGVudC5nZXRCeXRlcygpKTsKLQkJCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJlYW0udG9CeXRlQXJyYXkoKSksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCX0JCi0JCQl9Ci0JCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkJCi0JCXByaXZhdGUgSUZpbGUgY3JlYXRlRW50aXR5V2l0aEVtYmVkZGVkUEsoSUZvbGRlciBmb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbnsKLQkJCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJY3JlYXRlRGlyZWN0b3JpZXMoZm9sZGVyLCB0cnVlLCB0cnVlLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCUlGaWxlIGZpbGUgPSBmb2xkZXIuZ2V0RmlsZShlbnRpdHlTaG9ydE5hbWUgKyAiLmphdmEiKTsJCQotCQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iIAotCQkJCQkJKyAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7XG5cbiIgCQkJCQkKLQkJCQkJCSsgIkBFbnRpdHlcbiIKLQkJCQkJCSsgInB1YmxpYyBjbGFzcyAiICsgZW50aXR5U2hvcnROYW1lICsgIiB7XG4iCi0JCQkJCQkrICJARW1iZWRkZWRJZFxuIgotCQkJCQkJKyAiCXByaXZhdGUgIisgZW50aXR5U2hvcnROYW1lICsiSWQgaWQ7XG4iCQkJCQkJCi0JCQkJCQkrICJwdWJsaWMgdm9pZCBzZXRJZCgiICsgZW50aXR5U2hvcnROYW1lKyAiSWQgcGFyYW0pIHtcbiIKLQkJCQkJCSsgIgl0aGlzLmlkID0gcGFyYW07XG4iCi0JCQkJCQkrICJ9XG4iCi0JCQkJCQkrICJwdWJsaWMgIitlbnRpdHlTaG9ydE5hbWUrIklkIGdldElkKCkge1xuIgotCQkJCQkJKwkicmV0dXJuIGlkO1xuIgotCQkJCQkJKyAifVxuIgkJCQkJCQotCQkJCQkJKyAifSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCXRyeSB7Ci0JCQkJCXN0cmVhbS53cml0ZShjb250ZW50LmdldEJ5dGVzKCkpOwotCQkJCQlzdHJlYW0uZmx1c2goKTsKLQkJCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0cmVhbS50b0J5dGVBcnJheSgpKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQkKLQkJCX0KLQkJCXJldHVybiBmaWxlOwotCQkJfQotCQkKLQkJcHJpdmF0ZSBJRmlsZSBjcmVhdGVFbWJlZGRlZENsYXNzKElGb2xkZXIgZm9sZGVyLCBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBlbnRpdHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb257Ci0JCQlTdHJpbmcgZW50aXR5U2hvcnROYW1lID0gZW50aXR5TmFtZS5zdWJzdHJpbmcoZW50aXR5TmFtZS5sYXN0SW5kZXhPZignLicpICsgMSk7Ci0JCQlpZiAoIWZvbGRlci5leGlzdHMoKSkgewotCQkJCWNyZWF0ZURpcmVjdG9yaWVzKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQlJRmlsZSBmaWxlID0gZm9sZGVyLmdldEZpbGUoZW50aXR5U2hvcnROYW1lICsgIi5qYXZhIik7CQkKLQkJaWYgKCFmaWxlLmV4aXN0cygpKSB7Ci0JCQlTdHJpbmcgY29udGVudCA9ICJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7XG5cbiIKLQkJCSAgICAgICAgICAgICAgICAgKyAiaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLio7XG4iIAotCQkJICAgICAgICAgICAgICAgICArICJARW1iZWRkYWJsZVxuIgotCQkJCQkgICAgICAgICArICJwdWJsaWMgY2xhc3MgIiArIGVudGl0eVNob3J0TmFtZSArICIge1xuIgotCQkJCQkgICAgIAkgKyJwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7XG4iCi0JCQkJCSAgICAgCSArInB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkge1xuIgotCQkJCQkgICAgIAkgKyAiCXJldHVybiBmaXJzdE5hbWU7XG4iCi0JCQkJCSAgICAgCSArICJ9XG4iCi0JCQkJCSAgICAgCSArICJwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkge1xuIgotCQkJCQkgICAgIAkgKwkidGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7XG4iCi0JCQkJCSAgICAgCSArICJ9XG4iCi0JCQkJCSAgICAgICAgICsgIn0iOyAvLyROT04tTkxTLTEkCi0JCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQl0cnkgewotCQkJCQlzdHJlYW0ud3JpdGUoY29udGVudC5nZXRCeXRlcygpKTsKLQkJCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJCWZpbGUuY3JlYXRlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJlYW0udG9CeXRlQXJyYXkoKSksIHRydWUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCX0JCi0JCQl9Ci0JCQlyZXR1cm4gZmlsZTsKLQkJCX0KLQkKLQkKLQlwcml2YXRlIHZvaWQgY3JlYXRlRGlyZWN0b3JpZXMoSUNvbnRhaW5lciBjb250YWluZXIsIGJvb2xlYW4gZm9yY2UsCi0JCQlib29sZWFuIGxvY2FsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsICYmIGNvbnRhaW5lciBpbnN0YW5jZW9mIElGb2xkZXIpIHsKLQkJCUlGb2xkZXIgZm9sZGVyID0gKElGb2xkZXIpIGNvbnRhaW5lcjsKLQkJCWlmICghZm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkJLy8gZGVwdGggZmlyc3QKLQkJCQlJQ29udGFpbmVyIHBhcmVudCA9IGZvbGRlci5nZXRQYXJlbnQoKTsKLQkJCQljcmVhdGVEaXJlY3RvcmllcyhwYXJlbnQsIGZvcmNlLCBsb2NhbCwgbnVsbCk7Ci0JCQkJLy8gb3duIHNlY29uZAotCQkJCWZvbGRlci5jcmVhdGUoZm9yY2UsIGxvY2FsLCBtb25pdG9yKTsKLQkJCX0KLQkJfQotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBnZXRQZXJzaXN0ZW50QXR0cmlidXRlKElGaWxlIGVudGl0eSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpewotCQlTZXQ8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiByZXN1bHQgPSBnZXRFbnRpdHlGaWVsZHMoZW50aXR5KTsKLQkJZm9yKFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiByZXN1bHQpewotCQkJaWYoYXR0cmlidXRlTmFtZS5lcXVhbHMoYXR0cmlidXRlLmdldE5hbWUoKSkpewotCQkJCXJldHVybiBhdHRyaWJ1dGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoSUZpbGUgZmlsZSl7Ci0JCUpwYUZpbGUganBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIG5vZGUgOiBnZXRSb290Tm9kZXMoanBhRmlsZSkpIHsKLQkJCVBlcnNpc3RlbnRUeXBlIGVudGl0eSA9IChQZXJzaXN0ZW50VHlwZSkgbm9kZTsKLQkJCXJldHVybiBlbnRpdHk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8SnBhU3RydWN0dXJlTm9kZT4gZ2V0Um9vdE5vZGVzKEpwYUZpbGUganBhRmlsZSkgewotCQlpZihqcGFGaWxlID09IG51bGwpewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4ganBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBTZXQ8UmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlPiBnZXRFbnRpdHlGaWVsZHMoSUZpbGUgZmlsZSl7Ci0JCVNldDxSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGU+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PFJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZT4oKTsKLQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlpZihqcGFGaWxlID09IG51bGwpewotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQlmb3IgKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSA6IGdldFJvb3ROb2RlcyhqcGFGaWxlKSkgewotCQkJUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKFBlcnNpc3RlbnRUeXBlKSBub2RlOwotCQkJZm9yIChSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlIDogZW50aXR5LmdldEFsbEF0dHJpYnV0ZXMoKSkgewotCQkJCXJlc3VsdC5hZGQoYXR0cmlidXRlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGVzKElGaWxlIGVudGl0eSwgU3RyaW5nIGF0dE5hbWUsIFN0cmluZyBhdHRUeXBlLCBTdHJpbmcgYW5ub3RhdGlvbiwgU3RyaW5nIGF0dEFjdE5hbWUsIGJvb2xlYW4gaXNDb2xsZWN0aW9uKXsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGphdmFQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KTsKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgoamF2YVBlcnNpc3RlbnRUeXBlID09IG51bGwpICYmIChjbnQgPCAxMDApKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkge30KLQkJCWphdmFQZXJzaXN0ZW50VHlwZSA9IChKYXZhUGVyc2lzdGVudFR5cGUpZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KTsKLQkJCWNudCsrOwotCQl9Ci0JCWlmIChqYXZhUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgZW50aXR5IGNvdWxkIG5vdCBiZSBjcmVhdGVkIik7Ci0JCUlDb21waWxhdGlvblVuaXQgY29tcGlsYXRpb25Vbml0ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGROZXdBdHRyaWJ1dGUoamF2YVBlcnNpc3RlbnRUeXBlLCBjb21waWxhdGlvblVuaXQsIGF0dE5hbWUsIGF0dFR5cGUsIGFubm90YXRpb24sIGF0dEFjdE5hbWUsIGlzQ29sbGVjdGlvbiwgbnVsbCk7Ci0JfQotCQotCXByaXZhdGUgSUZpbGUgY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHkoSUZvbGRlciBmb2xkZXIsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGVudGl0eU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBlbnRpdHlTaG9ydE5hbWUgPSBlbnRpdHlOYW1lLnN1YnN0cmluZyhlbnRpdHlOYW1lLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCWNyZWF0ZURpcmVjdG9yaWVzKGZvbGRlciwgdHJ1ZSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IGZvbGRlci5nZXRGaWxlKGVudGl0eVNob3J0TmFtZSArICIuamF2YSIpOwkJCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJU3RyaW5nIGNvbnRlbnQgPSAicGFja2FnZSAiICsgcGFja2FnZU5hbWUgKyAiO1xuXG4iIAotCQkJCQkrICJpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuKjtcblxuIiAKLQkJCQkJKyAiQEVudGl0eSBcbiIKLQkJCQkJKyAicHVibGljIGNsYXNzICIgKyBlbnRpdHlTaG9ydE5hbWUgKyAiIHtcbiIKLQkJCQkJKyAiCUBJZCBcbiIJCQkJCQotCQkJCQkrICIJcHJpdmF0ZSBpbnQgaWQ7XG4iCi0JCQkJCSsgIglwdWJsaWMgaW50IGdldElkKCkge1xuIiAKLQkJCQkJKyAiCQlyZXR1cm4gaWQ7XG4iCi0JCQkJCSsgIgl9XG4iCi0JCQkJCSsgIglwdWJsaWMgdm9pZCBzZXRJZChpbnQgaWQpIHtcbiIKLQkJCQkJKyAiCQl0aGlzLmlkID0gaWQ7XG4iIAotCQkJCQkrICIJfVxuIgotCQkJCQkrICJ9IjsgLy8kTk9OLU5MUy0xJAotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoKSk7Ci0JCQkJc3RyZWFtLmZsdXNoKCk7Ci0JCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0cmVhbS50b0J5dGVBcnJheSgpKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQkKLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9CQotCi0JcHVibGljIElGaWxlIGNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KElQcm9qZWN0IHByb2plY3QsIFN0cmluZ1tdIHBhY2thZ2VGcmFnbWVudHMsIFN0cmluZyBlbnRpdHlOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBmb2xkZXJOYW1lID0gZ2V0Rm9sZGVyTmFtZShwcm9qZWN0LCBwYWNrYWdlRnJhZ21lbnRzKTsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gcGFja2FnZUZyYWdtZW50c1swXTsJCQotCQlmb3IgKGludCBpID0gMTsgaSA8IHBhY2thZ2VGcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXBhY2thZ2VOYW1lICs9ICIuIiArIHBhY2thZ2VGcmFnbWVudHNbaV07Ci0JCX0KLQkJCi0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChmb2xkZXJOYW1lKTsKLQkJSUZvbGRlciBmb2xkZXIgPSBwcm9qZWN0LmdldEZvbGRlcihwYXRoKTsJCSAKLQkJcmV0dXJuIGNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5KGZvbGRlciwgcGFja2FnZU5hbWUgLCBlbnRpdHlOYW1lKTsKLQl9Ci0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0pQQUVkaXRvclRlc3RzQWN0aXZhdG9yLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL0pQQUVkaXRvclRlc3RzQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ODZiZmYuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9KUEFFZGl0b3JUZXN0c0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvclRlc3RzQWN0aXZhdG9yIGV4dGVuZHMgUGx1Z2luIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBKUEFFZGl0b3JUZXN0c0FjdGl2YXRvcigpIHsKLQl9Ci0KLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlCi0JcHJpdmF0ZSBzdGF0aWMgSlBBRWRpdG9yVGVzdHNBY3RpdmF0b3IgcGx1Z2luOwotCQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSlBBRWRpdG9yVGVzdHNBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZWRpdG9yL0NyZWF0ZURpYWdyYW1UZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2VkaXRvci9DcmVhdGVEaWFncmFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzY3YWMxLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZWRpdG9yL0NyZWF0ZURpYWdyYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TZW1hcGhvcmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUpvYkNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYkNoYW5nZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnV0aWwuQ3JlYXRlRGlhZ3JhbUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlRGlhZ3JhbVRlc3QgewotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZURpYWdyYW1XaGVuUGVyc2lzdGVuY2VVbml0SGFzRGlmZmVyZW50TmFtZUZyb21UaGVQcm9qZWN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsJCQotCQlKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdCgiSlBBXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVN0cmluZyBwZXJzaXN0ZW5jZVVuaXROYW1lID0ganBhUHJvamVjdC5nZXROYW1lKCkgKyAiX3VuaXQiOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7IAotCQlwdS5zZXROYW1lKHBlcnNpc3RlbmNlVW5pdE5hbWUpOwotCQlhc3NlcnRFcXVhbHMocGVyc2lzdGVuY2VVbml0TmFtZSwgcHUuZ2V0TmFtZSgpKTsKLQkJCi0JCQotCQlmaW5hbCBDcmVhdGVEaWFncmFtSm9iIGNyZWF0ZURpYWdyYW1SdW5uYWJsZSA9IG5ldyBDcmVhdGVEaWFncmFtSm9iKHB1LCAxMCwgdHJ1ZSk7Ci0JCWNyZWF0ZURpYWdyYW1SdW5uYWJsZS5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCQlmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMCk7IAotCQljcmVhdGVEaWFncmFtUnVubmFibGUuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKXsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJcy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0pOwotCQljcmVhdGVEaWFncmFtUnVubmFibGUuc2V0VXNlcih0cnVlKTsKLQkJY3JlYXRlRGlhZ3JhbVJ1bm5hYmxlLnNjaGVkdWxlKCk7Ci0JCXMuYWNxdWlyZSgpOwotCQlEaWFncmFtIGQgPSBjcmVhdGVEaWFncmFtUnVubmFibGUuZ2V0RGlhZ3JhbSgpOwotCQlhc3NlcnRFcXVhbHMoanBhUHJvamVjdC5nZXROYW1lKCksIGQuZ2V0TmFtZSgpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE2YjAzMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2VkaXRvci9FZGl0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXE7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay52ZXJpZnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5nZWYuRWRpdFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEudWkuaW50ZXJuYWwuc2VsZWN0aW9uLkpwYVNlbGVjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uSnBhU2VsZWN0aW9uUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuSlBBRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5KUEFEaWFncmFtRWRpdG9yUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlTGlzdGVuZXI7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCi1wdWJsaWMgY2xhc3MgRWRpdG9yVGVzdCB7Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RKUEFEaWFncmFtRWRpdG9yQ3JlYXRpb24oKSB7Ci0JCUpQQURpYWdyYW1FZGl0b3IgZWQgPSBuZXcgSlBBRGlhZ3JhbUVkaXRvcigpOwotCQlhc3NlcnROb3ROdWxsKGVkKTsKLQl9Ci0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SlBBRGlhZ3JhbUVkaXRvclBsdWdpbigpIHsKLQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbiBwbHVnaW4gPSBuZXcgSlBBRGlhZ3JhbUVkaXRvclBsdWdpbigpOwotCQlCdW5kbGVDb250ZXh0IGJjID0gRWFzeU1vY2suY3JlYXRlTW9jayhCdW5kbGVDb250ZXh0LmNsYXNzKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQnVuZGxlLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSkuYW5kU3R1YlJldHVybigiIik7Ci0JCUVhc3lNb2NrLmV4cGVjdChiYy5nZXRCdW5kbGUoKSkuYW5kU3R1YlJldHVybihidW5kbGUpOwotCQliYy5hZGRCdW5kbGVMaXN0ZW5lcihFYXN5TW9jay5pc0EoQnVuZGxlTGlzdGVuZXIuY2xhc3MpKTsKLQkJYmMucmVtb3ZlQnVuZGxlTGlzdGVuZXIoRWFzeU1vY2suaXNBKEJ1bmRsZUxpc3RlbmVyLmNsYXNzKSk7Ci0JCUVhc3lNb2NrLnJlcGxheShiYywgYnVuZGxlKTsKLQkJdHJ5IHsKLQkJCXBsdWdpbi5zdGFydChiYyk7Ci0JCQlwbHVnaW4uc3RvcChiYyk7CQkJCi0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCUVhc3lNb2NrLnZlcmlmeShiYyk7Ci0JfQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DaGFuZ2VkKCkgewotCQlmaW5hbCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gRWFzeU1vY2sKLQkJCQkuY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQotCQlJV29ya2JlbmNoUGFydCBwYXJ0ID0gcmVwbGF5UGFydCgpOwotCi0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBpY3RvZ3JhbUVsZW1lbnQuY2xhc3MpOwotCQlyZXBsYXkocGUpOwotCQlFZGl0UGFydCBlZGl0UGFydCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRWRpdFBhcnQuY2xhc3MpOwotCQlleHBlY3QoZWRpdFBhcnQuZ2V0TW9kZWwoKSkuYW5kUmV0dXJuKHBlKTsKLQkJcmVwbGF5KGVkaXRQYXJ0KTsKLQotCQlKcGFTdHJ1Y3R1cmVOb2RlIGpwYU5vZGVUb0JlU2VsZWN0ZWQgPSBFYXN5TW9jawotCQkJCS5jcmVhdGVNb2NrKEpwYVN0cnVjdHVyZU5vZGUuY2xhc3MpOwotCQlleHBlY3QocHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKSkuYW5kUmV0dXJuKAotCQkJCWpwYU5vZGVUb0JlU2VsZWN0ZWQpOwotCQlyZXBsYXkocHJvdmlkZXIpOwotCi0JCS8vIHRlc3QKLQkJSnBhU2VsZWN0aW9uTWFuYWdlciBtYW5hZ2VyID0gRWFzeU1vY2sKLQkJCQkuY3JlYXRlTW9jayhKcGFTZWxlY3Rpb25NYW5hZ2VyLmNsYXNzKTsKLQkJbWFuYWdlci5zZWxlY3QoaXNBKEpwYVNlbGVjdGlvbi5jbGFzcyksCi0JCQkJKEpwYVNlbGVjdGlvblBhcnRpY2lwYW50KSBlcShudWxsKSk7Ci0JCXJlcGxheShtYW5hZ2VyKTsKLQotCQlKUEFEaWFncmFtRWRpdG9yLklTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeSBmYWN0b3J5ID0gRWFzeU1vY2sKLQkJCQkuY3JlYXRlTW9jayhKUEFEaWFncmFtRWRpdG9yLklTZWxlY3Rpb25NYW5hZ2VyRmFjdG9yeS5jbGFzcyk7Ci0JCWV4cGVjdChmYWN0b3J5LmdldFNlbGVjdGlvbk1hbmFnZXIoaXNBKElXb3JrYmVuY2hXaW5kb3cuY2xhc3MpKSkKLQkJCQkuYW5kUmV0dXJuKG1hbmFnZXIpOwotCQlyZXBsYXkoZmFjdG9yeSk7Ci0JCUpQQURpYWdyYW1FZGl0b3IgZWRpdG9yID0gY3JlYXRlRWRpdG9yKHByb3ZpZGVyLCBmYWN0b3J5KTsKLQkJLy8gdGVzdAotCQllZGl0b3Iuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlZGl0UGFydCkpOwotCQl2ZXJpZnkobWFuYWdlcik7Ci0JfQotCi0JcHJpdmF0ZSBKUEFEaWFncmFtRWRpdG9yIGNyZWF0ZUVkaXRvcihmaW5hbCBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyLAotCQkJSlBBRGlhZ3JhbUVkaXRvci5JU2VsZWN0aW9uTWFuYWdlckZhY3RvcnkgZmFjdG9yeSkgewotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJV29ya2JlbmNoUGFnZS5jbGFzcyk7Ci0JCWV4cGVjdChwYWdlLmlzUGFydFZpc2libGUoaXNBKElXb3JrYmVuY2hQYXJ0LmNsYXNzKSkpCi0JCQkJLmFuZFJldHVybihmYWxzZSk7Ci0JCWV4cGVjdChwYWdlLmdldEFjdGl2ZUVkaXRvcigpKS5hbmRTdHViUmV0dXJuKG51bGwpOwotCQlyZXBsYXkocGFnZSk7Ci0JCWZpbmFsIElXb3JrYmVuY2hQYXJ0U2l0ZSBzaXRlID0gRWFzeU1vY2sKLQkJCQkuY3JlYXRlTW9jayhJV29ya2JlbmNoUGFydFNpdGUuY2xhc3MpOwotCQlleHBlY3Qoc2l0ZS5nZXRQYWdlKCkpLmFuZFN0dWJSZXR1cm4ocGFnZSk7Ci0JCXJlcGxheShzaXRlKTsKLQotCQlKUEFEaWFncmFtRWRpdG9yIGVkaXRvciA9IG5ldyBKUEFEaWFncmFtRWRpdG9yKGZhY3RvcnkpIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZ2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQkJCXJldHVybiBwcm92aWRlcjsKLQkJCX0KLQotCQkJcHVibGljIElXb3JrYmVuY2hQYXJ0U2l0ZSBnZXRTaXRlKCkgewotCQkJCXJldHVybiBzaXRlOwotCQkJfQotCQl9OwotCQlyZXR1cm4gZWRpdG9yOwotCX0KLQotCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgcmVwbGF5UGFydCgpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElXb3JrYmVuY2hXaW5kb3cuY2xhc3MpOwotCQlyZXBsYXkod2luZG93KTsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVdvcmtiZW5jaFBhZ2UuY2xhc3MpOwotCQlJV29ya2JlbmNoUGFydFNpdGUgc2l0ZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVdvcmtiZW5jaFBhcnRTaXRlLmNsYXNzKTsKLQkJZXhwZWN0KHNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkpLmFuZFJldHVybih3aW5kb3cpOwotCQlleHBlY3Qoc2l0ZS5nZXRQYWdlKCkpLmFuZFN0dWJSZXR1cm4ocGFnZSk7Ci0JCXJlcGxheShzaXRlKTsKLQkJSVdvcmtiZW5jaFBhcnQgcGFydCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVdvcmtiZW5jaFBhcnQuY2xhc3MpOwotCQlleHBlY3QocGFydC5nZXRTaXRlKCkpLmFuZFN0dWJSZXR1cm4oc2l0ZSk7Ci0JCWV4cGVjdChwYWdlLmlzUGFydFZpc2libGUoaXNBKElXb3JrYmVuY2hQYXJ0LmNsYXNzKSkpCi0JCQkJLmFuZFJldHVybihmYWxzZSk7Ci0JCWV4cGVjdChwYWdlLmdldEFjdGl2ZUVkaXRvcigpKS5hbmRSZXR1cm4obnVsbCk7Ci0JCXJlcGxheShwYWdlKTsKLQkJcmVwbGF5KHBhcnQpOwotCQlyZXR1cm4gcGFydDsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTZWxlY3Rpb25DaGFuZ2VkVGV4dFNlbGVjdGlvbigpIHsKLQkJSlBBRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSBjcmVhdGVFZGl0b3IobnVsbCwgbnVsbCk7Ci0JCWVkaXRvci5zZWxlY3Rpb25DaGFuZ2VkKG51bGwsIG5ldyBJU2VsZWN0aW9uKCkgewotCQkJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNlbGVjdGlvbkNoYW5nZWROb3RFZGl0UGFydCgpIHsKLQkJSlBBRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSBjcmVhdGVFZGl0b3IobnVsbCwgbnVsbCk7Ci0JCWVkaXRvci5zZWxlY3Rpb25DaGFuZ2VkKG51bGwsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ldyBPYmplY3QoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0FkZEF0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQWRkQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc5NThiNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQWRkQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLklBcmd1bWVudE1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEaXJlY3RFZGl0aW5nSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5pbXBsLkFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY3VzdG9tLklDdXN0b21GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRBdHRyaWJ1dGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUZlYXR1cmVUZXN0IHsKLQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0KLQlwcml2YXRlIEFkZENvbnRleHQgY29udGV4dDsKLQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhOwotCi0JcHJpdmF0ZSBDb250YWluZXJTaGFwZSBlbnRpdHlTaGFwZTsKLQotCXByaXZhdGUgSUN1c3RvbUZlYXR1cmUgZXhwYW5kRmVhdHVyZTsKLQotCXByaXZhdGUgSUFkZEZlYXR1cmUgZ3JhcGhpY2FsQWRkOwotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWpwYSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpOwotCQljb250ZXh0ID0gbmV3IEFkZENvbnRleHQoKTsKLQkJY29udGV4dC5zZXROZXdPYmplY3QoanBhKTsKLQkJY29udGV4dC5zZXRUYXJnZXRDb250YWluZXIoZW50aXR5U2hhcGUpOwotCQlncmFwaGljYWxBZGQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElBZGRGZWF0dXJlLmNsYXNzKTsKLQkJZXhwYW5kRmVhdHVyZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUN1c3RvbUZlYXR1cmUuY2xhc3MpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZE5vdEpQQSgpIHsKLQkJY29udGV4dC5zZXROZXdPYmplY3QobmV3IE9iamVjdCgpKTsKLQkJYXNzZXJ0TnVsbChjYWxsQWRkKCkpOwotCX0KLQkKLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBjb25mZ2lydWVBdHRyaWJ1dGVTaGFwZShDb250YWluZXJTaGFwZSBhdHRyaWJ1dGVDb250YWluZXIpIHsKLQkJQ29udGFpbmVyU2hhcGUgYXR0cmlidXRlU2hhcGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanBhKSkuYW5kUmV0dXJuKGF0dHJpYnV0ZVNoYXBlKTsKLQkJZXhwZWN0KGF0dHJpYnV0ZVNoYXBlLmdldENvbnRhaW5lcigpKS5hbmRSZXR1cm4oYXR0cmlidXRlQ29udGFpbmVyKTsKLQkJcmVwbGF5KGF0dHJpYnV0ZVNoYXBlKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncyh7ICJ1bmNoZWNrZWQiLCAidW51c2VkIiB9KQotCXByaXZhdGUgQ29udGFpbmVyU2hhcGUgcmVwbGF5VGV4dFNoYXBlKFRleHQgdGV4dCkgewotCQlFTGlzdDxHcmFwaGljc0FsZ29yaXRobT4gY2hpbGRyZW4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKEVMaXN0LmNsYXNzKTsKLQkJY2hpbGRyZW4uYWRkKHRleHQpOwotCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soR3JhcGhpY3NBbGdvcml0aG0uY2xhc3MpOwotCQlleHBlY3QoZ2EuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpKS5hbmRSZXR1cm4oY2hpbGRyZW4pOwotCQlyZXBsYXkoZ2EpOwotCQlDb250YWluZXJTaGFwZSB0ZXh0U2hhcGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJZXhwZWN0KHRleHRTaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRSZXR1cm4oZ2EpOwotCQlyZXBsYXkodGV4dFNoYXBlKTsKLQkJcmV0dXJuIHRleHRTaGFwZTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIElEaXJlY3RFZGl0aW5nSW5mbyBjb25maWd1cmVEaXJlY3RFZGl0aW5nKFRleHQgdGV4dCwgQ29udGFpbmVyU2hhcGUgdGV4dFNoYXBlKSB7Ci0JCUlEaXJlY3RFZGl0aW5nSW5mbyBpbmZvID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlyZWN0RWRpdGluZ0luZm8uY2xhc3MpOwotCQlpbmZvLnNldEdyYXBoaWNzQWxnb3JpdGhtKHRleHQpOwotCQlpbmZvLnNldE1haW5QaWN0b2dyYW1FbGVtZW50KHRleHRTaGFwZSk7Ci0JCWluZm8uc2V0UGljdG9ncmFtRWxlbWVudCh0ZXh0U2hhcGUpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpcmVjdEVkaXRpbmdJbmZvKCkpLmFuZFJldHVybihpbmZvKTsKLQkJcmVwbGF5KGluZm8pOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIElDdXN0b21Db250ZXh0IGNyZWF0ZUN1c3RvbUNvbnRleHRNYXRjaGVyKGZpbmFsIFBpY3RvZ3JhbUVsZW1lbnRbXSBlbGVtZW50cykgewotCQlFYXN5TW9jay5yZXBvcnRNYXRjaGVyKG5ldyBJQXJndW1lbnRNYXRjaGVyKCkgewotCQkJcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBhcmd1bWVudCkgewotCQkJCWlmICghSUN1c3RvbUNvbnRleHQuY2xhc3MuaXNJbnN0YW5jZShhcmd1bWVudCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlJQ3VzdG9tQ29udGV4dCBjb250ZXh0ID0gKElDdXN0b21Db250ZXh0KSBhcmd1bWVudDsKLQkJCQlyZXR1cm4gQXJyYXlzLmVxdWFscyhjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnRzKCksIGVsZW1lbnRzKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgSUFkZENvbnRleHQgY29udGV4dE1hdGNoZXIoKSB7Ci0JCUVhc3lNb2NrLnJlcG9ydE1hdGNoZXIobmV3IElBcmd1bWVudE1hdGNoZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIGFwcGVuZFRvKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgYXJndW1lbnQpIHsKLQkJCQlpZiAoIUlBZGRDb250ZXh0LmNsYXNzLmlzSW5zdGFuY2UoYXJndW1lbnQpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJSUFkZENvbnRleHQgY29udGV4dCA9IChJQWRkQ29udGV4dCkgYXJndW1lbnQ7Ci0JCQkJLy8gY29tcGFyZSBieSByZWZlcmVuY2UKLQkJCQlpZiAoanBhICE9IGNvbnRleHQuZ2V0TmV3T2JqZWN0KCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAoZW50aXR5U2hhcGUgIT0gY29udGV4dC5nZXRUYXJnZXRDb250YWluZXIoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCXJldHVybiB0cnVlOwotCi0JCQl9Ci0KLQkJfSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUGljdG9ncmFtRWxlbWVudCBjYWxsQWRkKCkgewotCQlJQWRkRmVhdHVyZSBmaXh0dXJlID0gY3JlYXRlRmVhdHVyZSgpOwotCQlyZXR1cm4gZml4dHVyZS5hZGQoY29udGV4dCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RmVhdHVyZVByb3ZpZGVyKCkgewotCQlhc3NlcnRTYW1lKGZlYXR1cmVQcm92aWRlciwgY3JlYXRlRmVhdHVyZSgpLmdldEZlYXR1cmVQcm92aWRlcigpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDYW5BZGRPYmplY3QoKSB7Ci0JCWNvbnRleHQuc2V0TmV3T2JqZWN0KG5ldyBPYmplY3QoKSk7Ci0JCS8vIHRlc3QKLQkJYXNzZXJ0RXF1YWxzKGZhbHNlLCBjYWxsQ2FuQWRkKCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENhbkFkZEpwdCgpIHsKLQkJLy8gdGVzdAotCQlhc3NlcnRFcXVhbHModHJ1ZSwgY2FsbENhbkFkZCgpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FsbENhbkFkZCgpIHsKLQkJSUFkZEZlYXR1cmUgZml4dHVyZSA9IGNyZWF0ZUZlYXR1cmUoKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBmaXh0dXJlLmNhbkFkZChjb250ZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElBZGRGZWF0dXJlIGNyZWF0ZUZlYXR1cmUoKSB7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXBsYXkoZ3JhcGhpY2FsQWRkKTsKLQkJcmVwbGF5KGV4cGFuZEZlYXR1cmUpOwotCQlyZXR1cm4gbmV3IEFkZEF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyLCBncmFwaGljYWxBZGQsIGV4cGFuZEZlYXR1cmUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0FkZEpQQUVudGl0eUZlYXR1cmVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQWRkSlBBRW50aXR5RmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4NmJhMi4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQWRkSlBBRW50aXR5RmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLk9yaWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQWRkSlBBRW50aXR5RmVhdHVyZVRlc3QgewotCQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JCi0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRBdHRyaWJzTnVtKChTaGFwZSkgRWFzeU1vY2suYW55T2JqZWN0KCkpKS5hbmRTdHViUmV0dXJuKDApOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBpZHAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkpLmFuZFN0dWJSZXR1cm4oaWRwKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5pbmNyZWFzZUF0dHJpYnNOdW0oKFNoYXBlKSBFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFN0dWJSZXR1cm4oMSk7Ci0JCURpYWdyYW0gZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRGlhZ3JhbS5jbGFzcyk7Ci0JCWV4cGVjdChpZHAuZ2V0RGlhZ3JhbSgpKS5hbmRTdHViUmV0dXJuKGQpOwotCQlDb2xvciBjID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb2xvci5jbGFzcyk7Ci0JCWV4cGVjdChjLmdldEJsdWUoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KGMuZ2V0UmVkKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCWV4cGVjdChjLmdldEdyZWVuKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCUVMaXN0PENvbG9yPiBjb2wgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PENvbG9yPihDb2xvci5jbGFzcyk7Ci0JCWV4cGVjdChkLmdldENvbG9ycygpKS5hbmRTdHViUmV0dXJuKGNvbCk7Ci0JCUNvbG9yIGMxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb2xvci5jbGFzcyk7Ci0JCWMxLnNldFJlZChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWMxLnNldEdyZWVuKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJYzEuc2V0Qmx1ZShFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCUVMaXN0PEZvbnQ+IGZvbnRzID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxGb250PihGb250LmNsYXNzKTsKLQkJZXhwZWN0KGQuZ2V0Rm9udHMoKSkuYW5kU3R1YlJldHVybihmb250cyk7Ci0JCXJlcGxheShkLCBjLCBjMSwgaWRwLCBmZWF0dXJlUHJvdmlkZXIpOwotCX0KLQkKLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZFRleHQoKSB7Ci0JCUZvbnQgZiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRm9udC5jbGFzcyk7IAotCQlUZXh0IHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFRleHQuY2xhc3MpOwotCQl0LnNldEZvbnQoZik7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWV4cGVjdCh0LmdldFgoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KHQuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDApOwotCQkKLQkJZi5zZXROYW1lKCJBcmlhbCIpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlmLnNldFNpemUoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwkJCi0JCWYuc2V0SXRhbGljKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7CQotCQlmLnNldEJvbGQoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJdC5zZXRXaWR0aChFYXN5TW9jay5hbnlJbnQoKSk7CQotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQl0LnNldEhlaWdodChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXQuc2V0VmFsdWUoImFiYyIpOwkKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJCi0JCXQuc2V0Rm9yZWdyb3VuZCgoQ29sb3IpIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJdC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KE9yaWVudGF0aW9uLkFMSUdOTUVOVF9MRUZUKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJdC5zZXRWZXJ0aWNhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfVE9QKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJCi0JCUZvbnQgZjEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEZvbnQuY2xhc3MpOwotCQlmMS5zZXRCb2xkKHRydWUpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlleHBlY3QodC5nZXRGb250KCkpLmFuZFN0dWJSZXR1cm4oZjEpOwotCQkKLQkJUmVjdGFuZ2xlIHRleHRSZWN0YW5nbGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFJlY3RhbmdsZS5jbGFzcyk7Ci0JCUVMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBsc3QgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPihHcmFwaGljc0FsZ29yaXRobS5jbGFzcyk7Ci0JCWV4cGVjdCh0ZXh0UmVjdGFuZ2xlLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKSkuYW5kU3R1YlJldHVybihsc3QpOwotCQkKLQkJcmVwbGF5KGYxLCBmLCB0LCB0ZXh0UmVjdGFuZ2xlKTsKLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZS5hZGRUZXh0KGZlYXR1cmVQcm92aWRlciwgdGV4dFJlY3RhbmdsZSwgImFiYyIpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RhZGRSZWN0YW5nbGVGb3JJY29uKCkgewotCQlDb250YWluZXJTaGFwZSBjcyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlSZWN0YW5nbGUgcmVjdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVjdGFuZ2xlLmNsYXNzKTsKLQkJZXhwZWN0KHJlY3QuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlleHBlY3QocmVjdC5nZXRZKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCXJlY3Quc2V0V2lkdGgoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldEhlaWdodChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWNzLnNldEdyYXBoaWNzQWxnb3JpdGhtKHJlY3QpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldEZpbGxlZChFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlY3Quc2V0WChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJcmVjdC5zZXRZKEVhc3lNb2NrLmFueUludCgpKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlyZWN0LnNldFdpZHRoKEVhc3lNb2NrLmFueUludCgpKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQljcy5zZXRHcmFwaGljc0FsZ29yaXRobShFYXN5TW9jay5pc0EoUmVjdGFuZ2xlLmNsYXNzKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlcGxheShyZWN0LCBjcyk7CQkKLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZS5hZGRSZWN0YW5nbGVGb3JJY29uKGNzLCAwKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkUmVjdGFuZ2xlRm9yVGV4dCgpIHsKLQkJQ29udGFpbmVyU2hhcGUgY3MgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFJlY3RhbmdsZS5jbGFzcyk7Ci0JCWV4cGVjdChyZWN0LmdldFgoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KHJlY3QuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlyZWN0LnNldFdpZHRoKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRIZWlnaHQoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQljcy5zZXRHcmFwaGljc0FsZ29yaXRobShyZWN0KTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRGaWxsZWQoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRMaW5lVmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldFgoRWFzeU1vY2suYW55SW50KCkpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCXJlY3Quc2V0WShFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJcmVjdC5zZXRXaWR0aChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCXJlY3Quc2V0TGluZVZpc2libGUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJY3Muc2V0R3JhcGhpY3NBbGdvcml0aG0oRWFzeU1vY2suaXNBKFJlY3RhbmdsZS5jbGFzcykpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZXBsYXkocmVjdCwgY3MpOwkJCi0JCVVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUuYWRkUmVjdGFuZ2xlRm9yVGV4dChjcywgMCwgMTIwKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkQXR0cmlidXRlKCkgewotCQlHcmFwaGljc0FsZ29yaXRobSBnYSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soR3JhcGhpY3NBbGdvcml0aG0uY2xhc3MpOwotCQlleHBlY3QoZ2EuZ2V0V2lkdGgoKSkuYW5kU3R1YlJldHVybigyMCk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCWV4cGVjdChjcy5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKGdhKTsKLQkJUmVjdGFuZ2xlIHJlY3QgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFJlY3RhbmdsZS5jbGFzcyk7Ci0JCWV4cGVjdChyZWN0LmdldFgoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJZXhwZWN0KHJlY3QuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlyZWN0LnNldFdpZHRoKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJcmVjdC5zZXRIZWlnaHQoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldEZpbGxlZChFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlyZWN0LnNldExpbmVWaXNpYmxlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlY3Quc2V0WChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXJlY3Quc2V0WShFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0KLQkJRUxpc3Q8UHJvcGVydHk+IHByb3BzID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxQcm9wZXJ0eT4oUHJvcGVydHkuY2xhc3MpOwotCQlFTGlzdDxQcm9wZXJ0eT4gcHJvcHMxID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxQcm9wZXJ0eT4oUHJvcGVydHkuY2xhc3MpOwotCi0JCWV4cGVjdChjcy5nZXRQcm9wZXJ0aWVzKCkpLmFuZFN0dWJSZXR1cm4ocHJvcHMpOwotCQkKLQkJY3Muc2V0VmlzaWJsZShFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQljcy5zZXRBY3RpdmUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJY3Muc2V0Q29udGFpbmVyKChDb250YWluZXJTaGFwZSkgRWFzeU1vY2suYW55T2JqZWN0KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlDb250YWluZXJTaGFwZSBjczEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJZXhwZWN0KGNzMS5nZXRQcm9wZXJ0aWVzKCkpLmFuZFN0dWJSZXR1cm4ocHJvcHMxKTsJCi0JCWNzMS5zZXRWaXNpYmxlKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWNzMS5zZXRBY3RpdmUoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJY3MxLnNldENvbnRhaW5lcigoQ29udGFpbmVyU2hhcGUpIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJUGljdG9ncmFtc1BhY2thZ2UgcCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUGljdG9ncmFtc1BhY2thZ2UuY2xhc3MpOwotCQlQcm9wZXJ0eSBwciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUHJvcGVydHkuY2xhc3MpOwotCQljczEuc2V0R3JhcGhpY3NBbGdvcml0aG0oKEdyYXBoaWNzQWxnb3JpdGhtKSBFYXN5TW9jay5hbnlPYmplY3QoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7CQkKLQkJSW1hZ2UgaW1nID0gRWFzeU1vY2suY3JlYXRlTW9jayhJbWFnZS5jbGFzcyk7Ci0JCWV4cGVjdChpbWcuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlleHBlY3QoaW1nLmdldFkoKSkuYW5kU3R1YlJldHVybigwKTsKLQkJaW1nLnNldFdpZHRoKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJaW1nLnNldEhlaWdodChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWltZy5zZXRYKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJaW1nLnNldFkoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlpbWcuc2V0SWQoIm9yZy5lY2xpc3AuanB0LnVpLmRpYWdyYW1lZGl0b3IuZmllbGQiKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJaW1nLnNldFByb3BvcnRpb25hbChFYXN5TW9jay5hbnlCb29sZWFuKCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlpbWcuc2V0U3RyZXRjaEgoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJaW1nLnNldFN0cmV0Y2hWKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCUVMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBjaCA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+KEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsKLQkJZXhwZWN0KHJlY3QuZ2V0R3JhcGhpY3NBbGdvcml0aG1DaGlsZHJlbigpKS5hbmRTdHViUmV0dXJuKGNoKTsKLQkJZXhwZWN0KHByLmdldEtleSgpKS5hbmRTdHViUmV0dXJuKCJwcm9wX3NoYXBlX3R5cGUiKTsKLQkJVGV4dCB0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhUZXh0LmNsYXNzKTsKLQkJZXhwZWN0KHQuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlleHBlY3QodC5nZXRZKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCXQuc2V0V2lkdGgoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQl0LnNldFgoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQl0LnNldFkoRWFzeU1vY2suYW55SW50KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQl0LnNldEhlaWdodChFYXN5TW9jay5hbnlJbnQoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXQuc2V0VmFsdWUoIiIpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQlGb250IGYgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEZvbnQuY2xhc3MpOwotCQlmLnNldE5hbWUoKFN0cmluZykgRWFzeU1vY2suYW55T2JqZWN0KCkpOwotCQlFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFzU3R1YigpOwotCQkKLQkJZi5zZXRTaXplKEVhc3lNb2NrLmFueUludCgpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJZi5zZXRJdGFsaWMoRWFzeU1vY2suYW55Qm9vbGVhbigpKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJZi5zZXRCb2xkKEVhc3lNb2NrLmFueUJvb2xlYW4oKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCWV4cGVjdCh0LmdldEZvbnQoKSkuYW5kU3R1YlJldHVybihmKTsKLQkJdC5zZXRGb250KChGb250KSBFYXN5TW9jay5hbnlPYmplY3QoKSk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCUVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYXNTdHViKCk7Ci0JCXQuc2V0Rm9yZWdyb3VuZCgoQ29sb3IpIEVhc3lNb2NrLmFueU9iamVjdCgpKTsKLQkJdC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KE9yaWVudGF0aW9uLkFMSUdOTUVOVF9MRUZUKTsKLQkJdC5zZXRWZXJ0aWNhbEFsaWdubWVudChPcmllbnRhdGlvbi5BTElHTk1FTlRfVE9QKTsKLQkJZi5zZXRCb2xkKHRydWUpOwotCQlyZXBsYXkocmVjdCwgZ2EsIGltZywgY3MsIGNzMSwgcCwgcHIsIHQsIGYpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9BZGRSZWxhdGlvbkZlYXR1cmVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQWRkUmVsYXRpb25GZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDJkZWRlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9BZGRSZWxhdGlvbkZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suYXJ5RXE7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5lcTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnZlcmlmeTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWxFZGl0aW5nRG9tYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklBZGRCZW5kcG9pbnRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklBZGRGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZEJlbmRwb2ludENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29ubmVjdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklMYXlvdXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuUG9seWxpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5BbmNob3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbkRlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkRpYWdyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5GcmVlRm9ybUNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnNlcnZpY2VzLklHYVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5BZGRSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9ySW1hZ2VDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxEaXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLklSZWxhdGlvbi5SZWxUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JUGVTZXJ2aWNlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIEFkZFJlbGF0aW9uRmVhdHVyZVRlc3QgewotCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQotCXByaXZhdGUgSUpQQUVkaXRvckltYWdlQ3JlYXRvciBpbWFnZUNyZWF0b3I7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yVXRpbCBqcGFFZGl0b3JVdGlsOwotCi0JcHJpdmF0ZSBJRGlhZ3JhbVR5cGVQcm92aWRlciBkaWFncmFtUHJvdmlkZXI7Ci0KLQlwcml2YXRlIERpYWdyYW0gZGlhZ3JhbTsKLQotCXByaXZhdGUgSUFkZENvbm5lY3Rpb25Db250ZXh0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIElQZVNlcnZpY2VVdGlsIHBlVXRpbDsKLQkKLQlwcml2YXRlIElHYVNlcnZpY2UgZ2FVdGlsOwotCQotCXByaXZhdGUgSUFkZEJlbmRwb2ludEZlYXR1cmUgZnQ7Ci0JCi0JcHJpdmF0ZSBSZXNvdXJjZSByZXNvdXJjZTsKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgT1dORVJfQVRfTkFNRSA9ICJvd25lckF0dHIiOwkJLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJTlZFUlNFX0FUX05BTUUgPSAiaW52ZXJzZUF0dHIiOwkvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWltYWdlQ3JlYXRvciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckltYWdlQ3JlYXRvci5jbGFzcyk7Ci0JCWpwYUVkaXRvclV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JVdGlsLmNsYXNzKTsKLQkJZGlhZ3JhbVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlhZ3JhbVR5cGVQcm92aWRlci5jbGFzcyk7Ci0JCWRpYWdyYW0gPSBFYXN5TW9jay5jcmVhdGVNb2NrKERpYWdyYW0uY2xhc3MpOwotCQljb250ZXh0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQWRkQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQlwZVV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElQZVNlcnZpY2VVdGlsLmNsYXNzKTsKLQkJZ2FVdGlsID0gRWFzeU1vY2suY3JlYXRlTW9jayhJR2FTZXJ2aWNlLmNsYXNzKTsKLQkJZnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElBZGRCZW5kcG9pbnRGZWF0dXJlLmNsYXNzKTsKLQkJCi0JCQotCQlUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbiBkZWZhdWx0VHJhbnNFZGl0RG9tYWluID0gRWFzeU1vY2suY3JlYXRlTW9jayhUcmFuc2FjdGlvbmFsRWRpdGluZ0RvbWFpbi5jbGFzcyk7Ci0JCVJlc291cmNlU2V0IHJlc291cmNlU2V0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZXNvdXJjZVNldC5jbGFzcyk7IAotCQlleHBlY3QoZGVmYXVsdFRyYW5zRWRpdERvbWFpbi5nZXRSZXNvdXJjZVNldCgpKS5hbmRTdHViUmV0dXJuKHJlc291cmNlU2V0KTsKLQkJRUxpc3Q8QWRhcHRlcj4gZUFkYXB0ZXJzID0gRWFzeU1vY2suY3JlYXRlTW9jayhFTGlzdC5jbGFzcyk7Ci0JCWV4cGVjdChyZXNvdXJjZVNldC5lQWRhcHRlcnMoKSkuYW5kU3R1YlJldHVybihlQWRhcHRlcnMpOwotCQkvL0lGaWxlIGRpYWdyYW1GaWxlID0gcHJvamVjdC5nZXRGaWxlKGRpYWdyYW1GaWxlTmFtZS5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpKTsKLQkJLy9JUGF0aCBkaWFncmFtRmlsZVBhdGggPSBkaWFncmFtRmlsZS5nZXRGdWxsUGF0aCgpOwotCi0JCS8vU3RyaW5nIHBhdGhOYW1lID0gZGlhZ3JhbUZpbGVQYXRoLnRvU3RyaW5nKCk7Ci0JCS8vVVJJIHJlc291cmNlVVJJID0gVVJJLmNyZWF0ZVBsYXRmb3JtUmVzb3VyY2VVUkkocGF0aE5hbWUsIHRydWUpOwotCQlyZXNvdXJjZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2UuY2xhc3MpOyAKLQkJZXhwZWN0KHJlc291cmNlU2V0LmdldFJlc291cmNlKGlzQShVUkkuY2xhc3MpLCBFYXN5TW9jay5hbnlCb29sZWFuKCkpKS5hbmRTdHViUmV0dXJuKHJlc291cmNlKTsKLQkJCi0JCWV4cGVjdChyZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5hbmRTdHViUmV0dXJuKHJlc291cmNlU2V0KTsKLQkJcmVwbGF5KGRlZmF1bHRUcmFuc0VkaXREb21haW4sIHJlc291cmNlU2V0LCByZXNvdXJjZSk7Ci0JCQotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENhbkFkZE5vdEFkZENvbm5lY3Rpb25Db250ZXh0KCkgewotCQlJQWRkQ29udGV4dCBjb250ZXh0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQWRkQ29udGV4dC5jbGFzcyk7Ci0JCXZlcmlmeUNhbkFkZChjb250ZXh0LCBmYWxzZSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FuQWRkTm9SZWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlJQWRkQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUFkZENvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJT2JqZWN0IG5vdEFSZWxhdGlvbiA9IG5ldyBPYmplY3QoKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0TmV3T2JqZWN0KCkpLmFuZFJldHVybihub3RBUmVsYXRpb24pOwotCQl2ZXJpZnlDYW5BZGQoY29udGV4dCwgZmFsc2UpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENhbkFkZCgpIHRocm93cyBFeGNlcHRpb24gewotCQlJQWRkQ29ubmVjdGlvbkNvbnRleHQgY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUFkZENvbm5lY3Rpb25Db250ZXh0LmNsYXNzKTsKLQkJSVJlbGF0aW9uIHJlbGF0aW9uID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUmVsYXRpb24uY2xhc3MpOwotCQlyZXBsYXkocmVsYXRpb24pOwotCQlleHBlY3QoY29udGV4dC5nZXROZXdPYmplY3QoKSkuYW5kUmV0dXJuKHJlbGF0aW9uKTsKLQkJdmVyaWZ5Q2FuQWRkKGNvbnRleHQsIHRydWUpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldEZlYXR1cmVQcm92aWRlcigpIHsKLQkJSUFkZEZlYXR1cmUgZml4dHVyZSA9IGNyZWF0ZUZlYXR1cmUoKTsKLQkJYXNzZXJ0U2FtZShmZWF0dXJlUHJvdmlkZXIsIGZpeHR1cmUuZ2V0RmVhdHVyZVByb3ZpZGVyKCkpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBleHBlY3RNYW55RW5kRGVjb3JhdG9yKGRvdWJsZSBsb2NhdGlvbikgewotCQlDb25uZWN0aW9uRGVjb3JhdG9yIGQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb25EZWNvcmF0b3IuY2xhc3MpOwotCQlQb2x5bGluZSBwbCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUG9seWxpbmUuY2xhc3MpOwotCQlleHBlY3QocGwuZ2V0WCgpKS5hbmRSZXR1cm4oMCk7Ci0JCWV4cGVjdChwbC5nZXRZKCkpLmFuZFJldHVybigwKTsJCQotCQlleHBlY3QoaW1hZ2VDcmVhdG9yLmNyZWF0ZU1hbnlFbmREZWNvcmF0b3IoaXNBKENvbm5lY3Rpb24uY2xhc3MpLCBlcShsb2NhdGlvbikpKS5hbmRSZXR1cm4oZCk7Ci0JCWV4cGVjdChkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFJldHVybihwbCk7Ci0JCXJlcGxheShkLCBwbCk7CQkKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSB2b2lkIGV4cGVjdE1hbnlTdGFydERlY29yYXRvcihkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBkID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uRGVjb3JhdG9yLmNsYXNzKTsKLQkJUG9seWxpbmUgcGwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBvbHlsaW5lLmNsYXNzKTsKLQkJZXhwZWN0KHBsLmdldFgoKSkuYW5kUmV0dXJuKDApOwotCQlleHBlY3QocGwuZ2V0WSgpKS5hbmRSZXR1cm4oMCk7CQkKLQkJZXhwZWN0KGltYWdlQ3JlYXRvci5jcmVhdGVNYW55U3RhcnREZWNvcmF0b3IoaXNBKENvbm5lY3Rpb24uY2xhc3MpLCBlcShsb2NhdGlvbikpKS5hbmRSZXR1cm4oZCk7Ci0JCWV4cGVjdChkLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFJldHVybihwbCk7Ci0JCXJlcGxheShkLCBwbCk7CQkKLQl9CQotCi0JQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0JcHJpdmF0ZSB2b2lkIGV4cGVjdE1hbnlFbmRXaXRoQXJyb3coZmluYWwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCUNvbm5lY3Rpb25EZWNvcmF0b3IgZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29ubmVjdGlvbkRlY29yYXRvci5jbGFzcyk7Ci0JCVBvbHlsaW5lIHBsID0gRWFzeU1vY2suY3JlYXRlTW9jayhQb2x5bGluZS5jbGFzcyk7Ci0JCWV4cGVjdChwbC5nZXRYKCkpLmFuZFJldHVybigwKTsKLQkJZXhwZWN0KHBsLmdldFkoKSkuYW5kUmV0dXJuKDApOwkJCi0JCWV4cGVjdChpbWFnZUNyZWF0b3IuY3JlYXRlTWFueUVuZFdpdGhBcnJvd0RlY29yYXRvcihpc0EoQ29ubmVjdGlvbi5jbGFzcyksIGVxKGxvY2F0aW9uKSkpLmFuZFJldHVybihkKTsKLQkJZXhwZWN0KGQuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kUmV0dXJuKHBsKTsKLQkJcmVwbGF5KGQsIHBsKTsJCQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBleHBlY3RBcnJvdyhmaW5hbCBkb3VibGUgbG9jYXRpb24pIHsKLQkJQ29ubmVjdGlvbkRlY29yYXRvciBkID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uRGVjb3JhdG9yLmNsYXNzKTsKLQkJUG9seWxpbmUgcGwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBvbHlsaW5lLmNsYXNzKTsKLQkJZXhwZWN0KHBsLmdldFgoKSkuYW5kUmV0dXJuKDApOwotCQlleHBlY3QocGwuZ2V0WSgpKS5hbmRSZXR1cm4oMCk7Ci0JCWV4cGVjdChpbWFnZUNyZWF0b3IuY3JlYXRlQXJyb3dDb25uZWN0aW9uRGVjb3JhdG9yKGlzQShDb25uZWN0aW9uLmNsYXNzKSwgZXEobG9jYXRpb24pKSkuYW5kUmV0dXJuKGQpOwotCQlleHBlY3QoZC5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRSZXR1cm4ocGwpOwotCQlyZXBsYXkoZCwgcGwpOwotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCBleHBlY3RUZXh0Q29ubmVjdGlvbkRlY29yYXRvcihTdHJpbmcgdGV4dCwgZG91YmxlIGxvY2F0aW9uKSB7Ci0JCWV4cGVjdChpbWFnZUNyZWF0b3IuY3JlYXRlQ2FyZGluYWxpdHlDb25uZWN0aW9uRGVjb3JhdG9yKGRpYWdyYW0sIGlzQShDb25uZWN0aW9uLmNsYXNzKSwgZXEodGV4dCksIGVxKGxvY2F0aW9uKSkpLmFuZFJldHVybigKLQkJCQludWxsKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIHZvaWQgY29uZmlndXJlUmVsYXRpb24oSVJlbGF0aW9uIHJlbGF0aW9uLCBmaW5hbCBSZWxEaXIgZGlyZWN0aW9uLCBmaW5hbCBSZWxUeXBlIHR5cGUpIHsKLQkJZXhwZWN0KHJlbGF0aW9uLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKS5hbmRTdHViUmV0dXJuKE9XTkVSX0FUX05BTUUpOwotCQlleHBlY3QocmVsYXRpb24uZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSkuYW5kU3R1YlJldHVybihJTlZFUlNFX0FUX05BTUUpOwotCQlleHBlY3QocmVsYXRpb24uZ2V0UmVsRGlyKCkpLmFuZFN0dWJSZXR1cm4oZGlyZWN0aW9uKTsKLQkJZXhwZWN0KHJlbGF0aW9uLmdldFJlbFR5cGUoKSkuYW5kU3R1YlJldHVybih0eXBlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlUHJvdmlkZXJzRm9yQWRkKElSZWxhdGlvbiByZWxhdGlvbikgewotCQlleHBlY3QoZGlhZ3JhbVByb3ZpZGVyLmdldERpYWdyYW0oKSkuYW5kUmV0dXJuKGRpYWdyYW0pOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKSkuYW5kUmV0dXJuKGRpYWdyYW1Qcm92aWRlcik7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGVVdGlsKCkpLmFuZFJldHVybihwZVV0aWwpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEFkZEJlbmRwb2ludEZlYXR1cmUoaXNBKElBZGRCZW5kcG9pbnRDb250ZXh0LmNsYXNzKSkpLmFuZFN0dWJSZXR1cm4oZnQpOwotCQlleHBlY3QoY29udGV4dC5nZXROZXdPYmplY3QoKSkuYW5kUmV0dXJuKHJlbGF0aW9uKTsKLQotCX0KLQotCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQotCXByaXZhdGUgdm9pZCB2ZXJpZnlBZGQoSVJlbGF0aW9uIHJlbGF0aW9uLCBib29sZWFuIGV4cGVjdElkKSB7Ci0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY29uZmlndXJlQ29ubmVjdGlvbihyZWxhdGlvbiwgZXhwZWN0SWQpOwotCQlyZXBsYXkoY29ubmVjdGlvbik7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcmVzdWx0ID0gY2FsbEFkZCgpOwotCQlhc3NlcnRTYW1lKGNvbm5lY3Rpb24sIHJlc3VsdCk7Ci0JCXZlcmlmeShjb250ZXh0KTsKLQkJdmVyaWZ5KGZlYXR1cmVQcm92aWRlcik7Ci0JCXZlcmlmeShpbWFnZUNyZWF0b3IpOwotCQl2ZXJpZnkoanBhRWRpdG9yVXRpbCk7Ci0JCXZlcmlmeShkaWFncmFtKTsKLQkJdmVyaWZ5KGRpYWdyYW1Qcm92aWRlcik7Ci0JCXZlcmlmeShyZWxhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBQaWN0b2dyYW1FbGVtZW50IGNhbGxBZGQoKSB7Ci0JCUlBZGRGZWF0dXJlIGZpeHR1cmUgPSBjcmVhdGVGZWF0dXJlKCk7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcmVzdWx0ID0gZml4dHVyZS5hZGQoY29udGV4dCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBGcmVlRm9ybUNvbm5lY3Rpb24gY29uZmlndXJlQ29ubmVjdGlvbihJUmVsYXRpb24gcmVsYXRpb24sIGJvb2xlYW4gZXhwZWN0SWQpIHsKLQkJZmluYWwgU3RyaW5nIHJlbGF0aW9uSWQgPSAic29tZUlkIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZXhwZWN0SWQpCi0JCQlleHBlY3QocmVsYXRpb24uZ2V0SWQoKSkuYW5kU3R1YlJldHVybihyZWxhdGlvbklkKTsKLQkJcmVwbGF5KHJlbGF0aW9uKTsKLQkJY29uZmlndXJlUHJvdmlkZXJzRm9yQWRkKHJlbGF0aW9uKTsKLQkJQW5jaG9yIHN0YXJ0QW5jaG9yID0gcmVwbGF5QW5jaG9yKCk7Ci0JCUFuY2hvciBlbmRBbmNob3IgPSByZXBsYXlBbmNob3IoKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0U291cmNlQW5jaG9yKCkpLmFuZFJldHVybihzdGFydEFuY2hvcik7Ci0JCWV4cGVjdChjb250ZXh0LmdldFRhcmdldEFuY2hvcigpKS5hbmRSZXR1cm4oZW5kQW5jaG9yKTsKLQkJCi0JCWdhVXRpbC5zZXRMb2NhdGlvbihpc0EoUG9seWxpbmUuY2xhc3MpLCBFYXN5TW9jay5hbnlJbnQoKSAsIEVhc3lNb2NrLmFueUludCgpKTsKLQkJZ2FVdGlsLnNldExvY2F0aW9uKGlzQShQb2x5bGluZS5jbGFzcyksIEVhc3lNb2NrLmFueUludCgpICwgRWFzeU1vY2suYW55SW50KCkpOwotCi0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gY3JlYXRlQ29ubmVjdGlvbihzdGFydEFuY2hvciwgZW5kQW5jaG9yKTsKLQkJZXhwZWN0KHBlVXRpbC5jcmVhdGVGcmVlRm9ybUNvbm5lY3Rpb24oZGlhZ3JhbSkpLmFuZFJldHVybihjb25uZWN0aW9uKTsKLQkJZXhwZWN0KGltYWdlQ3JlYXRvci5jcmVhdGVDb25uZWN0aW9uTGluZShkaWFncmFtLCBjb25uZWN0aW9uKSkuYW5kUmV0dXJuKG51bGwpOwotCQlmdC5hZGRCZW5kcG9pbnQoaXNBKElBZGRCZW5kcG9pbnRDb250ZXh0LmNsYXNzKSk7Ci0JCQotCQlMaXN0PFBvaW50PiBwdHMgPSBuZXcgTGlua2VkTGlzdDxQb2ludD4oKTsKLQkJUG9pbnQgcHQxID0gbmV3IFBvaW50KDEwMCwgMTAwKTsKLQkJLy9Qb2ludCBwdDIgPSBuZXcgUG9pbnQoMjAwLCAyMDApOwotCQlwdHMuYWRkKHB0MSk7IAotCQkvL3B0cy5hZGQocHQyKTsKLQkJZXhwZWN0KGpwYUVkaXRvclV0aWwuY3JlYXRlQmVuZFBvaW50TGlzdChjb25uZWN0aW9uLCBmYWxzZSkpLmFuZFJldHVybihwdHMpOwotCQlmZWF0dXJlUHJvdmlkZXIucHV0S2V5VG9CdXNpbmVzc09iamVjdChyZWxhdGlvbklkLCByZWxhdGlvbik7Ci0JCWZlYXR1cmVQcm92aWRlci5saW5rKGVxKGNvbm5lY3Rpb24pLCBhcnlFcShuZXcgSVJlbGF0aW9uW10geyByZWxhdGlvbiB9KSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIubGF5b3V0SWZQb3NzaWJsZShpc0EoSUxheW91dENvbnRleHQuY2xhc3MpKSkuYW5kUmV0dXJuKG51bGwpOwotCQlyZXR1cm4gY29ubmVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIEFuY2hvciByZXBsYXlBbmNob3IoKSB7Ci0JCUFuY2hvciBzdGFydEFuY2hvciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJcmVwbGF5KHN0YXJ0QW5jaG9yKTsKLQkJcmV0dXJuIHN0YXJ0QW5jaG9yOwotCX0KLQotCXByaXZhdGUgRnJlZUZvcm1Db25uZWN0aW9uIGNyZWF0ZUNvbm5lY3Rpb24oQW5jaG9yIHN0YXJ0QW5jaG9yLCBBbmNob3IgZW5kQW5jaG9yKSB7Ci0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gRWFzeU1vY2suY3JlYXRlTW9jayhGcmVlRm9ybUNvbm5lY3Rpb24uY2xhc3MpOwotCQljb25uZWN0aW9uLnNldFN0YXJ0KHN0YXJ0QW5jaG9yKTsKLQkJY29ubmVjdGlvbi5zZXRFbmQoZW5kQW5jaG9yKTsKLQkJY29ubmVjdGlvbi5zZXRWaXNpYmxlKHRydWUpOwotCQljb25uZWN0aW9uLnNldEFjdGl2ZSh0cnVlKTsKLQkJCi0JCW9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50IHB0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludC5jbGFzcyk7Ci0JCWV4cGVjdChwdC5nZXRYKCkpLmFuZFN0dWJSZXR1cm4oMTAwKTsKLQkJZXhwZWN0KHB0LmdldFkoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQkKLQkJb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQgcHQxID0gRWFzeU1vY2suY3JlYXRlTW9jayhvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludC5jbGFzcyk7Ci0JCWV4cGVjdChwdDEuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDIwMCk7Ci0JCWV4cGVjdChwdDEuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDIwMCk7Ci0JCQotCQkKLQkJRUxpc3Q8b3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5zdHlsZXMuUG9pbnQ+IHB0czEgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuc3R5bGVzLlBvaW50PihvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLnN0eWxlcy5Qb2ludC5jbGFzcyk7Ci0JCXB0czEuYWRkKHB0KTsJCi0JCXB0czEuYWRkKHB0MSk7Ci0JCWV4cGVjdChjb25uZWN0aW9uLmdldEJlbmRwb2ludHMoKSkuYW5kU3R1YlJldHVybihwdHMxKTsKLQkJcmVwbGF5KHB0LCBwdDEpOwotCQlyZXR1cm4gY29ubmVjdGlvbjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdmVyaWZ5Q2FuQWRkKElBZGRDb250ZXh0IGNvbnRleHQsIGZpbmFsIGJvb2xlYW4gZXhwZWN0ZWQpIHsKLQkJcmVwbGF5KGNvbnRleHQpOwotCQlib29sZWFuIHJlc3VsdCA9IGNhbGxDYW5BZGQoY29udGV4dCk7Ci0JCWFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzdWx0KTsKLQkJdmVyaWZ5KGNvbnRleHQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBjYWxsQ2FuQWRkKElBZGRDb250ZXh0IGNvbnRleHQpIHsKLQkJSUFkZEZlYXR1cmUgZml4dHVyZSA9IGNyZWF0ZUZlYXR1cmUoKTsKLQkJcmV0dXJuIGZpeHR1cmUuY2FuQWRkKGNvbnRleHQpOwotCX0KLQotCXByaXZhdGUgSUFkZEZlYXR1cmUgY3JlYXRlRmVhdHVyZSgpIHsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcik7Ci0JCXJlcGxheShpbWFnZUNyZWF0b3IpOwotCQlyZXBsYXkoanBhRWRpdG9yVXRpbCk7Ci0JCXJlcGxheShkaWFncmFtUHJvdmlkZXIpOwotCQlyZXBsYXkoZGlhZ3JhbSk7Ci0JCXJlcGxheShjb250ZXh0KTsKLQkJcmVwbGF5KHBlVXRpbCk7Ci0JCXJlcGxheShnYVV0aWwpOwotCQlyZXBsYXkoZnQpOwotCQlyZXR1cm4gbmV3IEFkZFJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIsIGltYWdlQ3JlYXRvciwganBhRWRpdG9yVXRpbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tBZGRGZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0NsaWNrQWRkRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcwMGVmNS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ2xpY2tBZGRGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRGlyZWN0RWRpdGluZ0luZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDcmVhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNsaWNrQWRkQXR0cmlidXRlQnV0dG9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsLklFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnRTaXRlOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDbGlja0FkZEZlYXR1cmVUZXN0IHsKLQkKLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCXByaXZhdGUgSUNyZWF0ZUNvbnRleHQgY29udGV4dDsKLQlmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IG51bGw7Ci0JSUNvbXBpbGF0aW9uVW5pdCBjdSA9IG51bGw7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN5c3RlbS5zZXRQcm9wZXJ0eShKUEFDcmVhdGVGYWN0b3J5LkpQQV9KQVJfTkFNRV9TWVNURU1fUFJPUEVSVFksICJDOlxcbGliXFxwZXJzaXN0ZW5jZS1hcGktMS4wLmphciIpOwotCQlKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCk7Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlJRmlsZSBlbnRpdHkgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGFQcm9qZWN0LCAib3JnLmVjbGlwc2UuRW50aXR5MSIpOwotCQlDb250YWluZXJTaGFwZSBjcyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQljb250ZXh0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29udGV4dC5jbGFzcyk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFRhcmdldENvbnRhaW5lcigpKS5hbmRTdHViUmV0dXJuKGNzKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDApOwotCQlleHBlY3QoY29udGV4dC5nZXRZKCkpLmFuZFN0dWJSZXR1cm4oMCk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFdpZHRoKCkpLmFuZFN0dWJSZXR1cm4oMTAwKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0SGVpZ2h0KCkpLmFuZFN0dWJSZXR1cm4oMTAwKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0VGFyZ2V0Q29ubmVjdGlvbigpKS5hbmRTdHViUmV0dXJuKG51bGwpOwotCQlJRGlyZWN0RWRpdGluZ0luZm8gZGVpID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlyZWN0RWRpdGluZ0luZm8uY2xhc3MpOwotCQlkZWkuc2V0QWN0aXZlKHRydWUpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpSlBBQ3JlYXRlRmFjdG9yeS5nZXRQZXJzaXN0ZW50VHlwZShlbnRpdHkpOwotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChjbnQgPCA1MCkgJiYgKGpwdCA9PSBudWxsKSkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlqcHQgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKUpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KTsKLQkJCWNudCsrOwotCQl9Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzKSkuYW5kU3R1YlJldHVybihqcHQpOwkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCkpLmFuZFN0dWJSZXR1cm4obnVsbCk7Ci0JCWN1ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpOwotCQljbnQgPSAwOwotCQl3aGlsZSAoKGNudCA8IDUwKSAmJiAoY3UgPT0gbnVsbCkpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJY3UgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eSk7Ci0JCQljbnQrKzsKLQkJfQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KChKYXZhUGVyc2lzdGVudFR5cGUpIEVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kUmV0dXJuKGN1KS5hbnlUaW1lcygpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoaXNBKElBZGRDb250ZXh0LmNsYXNzKSkpLmFuZFN0dWJSZXR1cm4obnVsbCk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0RGlyZWN0RWRpdGluZ0luZm8oKSkuYW5kU3R1YlJldHVybihkZWkpOwotCQkKLQkJSUpQQUVkaXRvclV0aWwgdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JVdGlsLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRKUEFFZGl0b3JVdGlsKCkpLmFuZFN0dWJSZXR1cm4odXQpOwotCQkKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgZGlhZ3JhbVR5cGVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1UeXBlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihkaWFncmFtVHlwZVByb3ZpZGVyKTsKLQkJSUVkaXRvciBlZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUVkaXRvci5jbGFzcyk7Ci0JCWV4cGVjdChkaWFncmFtVHlwZVByb3ZpZGVyLmdldERpYWdyYW1FZGl0b3IoKSkuYW5kU3R1YlJldHVybihlZCk7Ci0JCUlXb3JrYmVuY2hQYXJ0U2l0ZSB3cyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVdvcmtiZW5jaFBhcnRTaXRlLmNsYXNzKTsKLQkJZXhwZWN0KGVkLmdldFNpdGUoKSkuYW5kU3R1YlJldHVybih3cyk7Ci0JCXV0LmZvcm1hdENvZGUoKElDb21waWxhdGlvblVuaXQpRWFzeU1vY2suYW55T2JqZWN0KCksIChJV29ya2JlbmNoUGFydFNpdGUpRWFzeU1vY2suYW55T2JqZWN0KCkpOwotCQkKLQkJZmVhdHVyZVByb3ZpZGVyLmFkZEFkZElnbm9yZShqcHQsICJhdHRyaWJ1dGUxIik7Ci0JCQotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyLCBjcywgY29udGV4dCwgZGVpLCBkaWFncmFtVHlwZVByb3ZpZGVyLCBlZCwgd3MsIHV0KTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKCl7IAotCQlpZiAoKGpwdCA9PSBudWxsKSB8fCAoY3UgPT0gbnVsbCkpCi0JCQlyZXR1cm47CQkvLyBUaGUgdGVzdCB3YXNuJ3Qgc2V0dXAgcHJvcGVybHkKLQkJQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlIGZlYXR1cmUgPSBuZXcgQ2xpY2tBZGRBdHRyaWJ1dGVCdXR0b25GZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCU9iamVjdFtdIGNyZWF0ZWQgPSBmZWF0dXJlLmNyZWF0ZShjb250ZXh0KTsKLQkJYXNzZXJ0Tm90TnVsbChjcmVhdGVkWzBdKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlRGVsZXRlT25seUF0dHJpYnV0ZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVEZWxldGVPbmx5QXR0cmlidXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWMzNGNjLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVEZWxldGVPbmx5QXR0cmlidXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUFkZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0QWRkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENsZWFyRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RNb3ZlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RSZW1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlcGxhY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwubGlzdGVuZXIuTGlzdENoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENyZWF0ZURlbGV0ZU9ubHlBdHRyaWJ1dGVUZXN0IHsKLQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBudWxsOwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0JCUpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKTsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCUlGaWxlIGVudGl0eSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5KGpwYVByb2plY3QsICJvcmcuZWNsaXBzZS5FbnRpdHkxIik7Ci0JCWpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpSlBBQ3JlYXRlRmFjdG9yeS5nZXRQZXJzaXN0ZW50VHlwZShlbnRpdHkpOwotCQlpbnQgYyA9IDA7Ci0JCXdoaWxlICgoanB0ID09IG51bGwpICYmIChjIDwgMTAwKSkgewotCQkJdHJ5IHsKLQkJCQlUaHJlYWQuc2xlZXAoMjUwKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fQotCQkJanB0ID0gKEphdmFQZXJzaXN0ZW50VHlwZSlKUEFDcmVhdGVGYWN0b3J5LmdldFBlcnNpc3RlbnRUeXBlKGVudGl0eSk7Ci0JCQljKys7Ci0JCX0KLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoaXNBKENvbnRhaW5lclNoYXBlLmNsYXNzKSkpLmFuZFN0dWJSZXR1cm4oanB0KTsJCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKEpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5KSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KGlzQShKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpKSkuYW5kUmV0dXJuKEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5KSkuYW55VGltZXMoKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKGlzQShJQWRkQ29udGV4dC5jbGFzcykpKS5hbmRTdHViUmV0dXJuKG51bGwpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChqcHQpKS5hbmRTdHViUmV0dXJuKGlzQShDb250YWluZXJTaGFwZS5jbGFzcykpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQpKS5hbmRTdHViUmV0dXJuKGN1KTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcik7Ci0JfQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVByb3BlcnR5QW5ub3RhdGVkQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIgbHNuciA9IG5ldyBFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyKDAsIDEpOwotCQlqcHQuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbnIpOwotCQlkZWxldGVBdHRyaWJ1dGUoImlkIik7Ci0JCWFzc2VydFRydWUobHNuci53YWl0Rm9yRXZlbnRzKCkpOwotCQlqcHQucmVtb3ZlTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbnIpOwotCQlsc25yID0gbmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIoMiwgMCk7Ci0JCWpwdC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLm1ha2VOZXdBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCBqcHQsIGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoanB0KSwgImFhYSIsICJqYXZhLmxhbmcuU3RyaW5nIiwgbnVsbCwgImFhYSIsIG51bGwsIGZhbHNlLCB0cnVlKTsKLQkJYXNzZXJ0RmFsc2UobHNuci53YWl0Rm9yRXZlbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbHNuci5pbmNyZW1lbnRDb3VudGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxzbnIuZGVjcmVtZW50Q291bnRlcik7CQkKLQl9Ci0JCi0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRmllbGRBbm5vdGF0ZWRBdHRyaWJ1dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lciBsc25yID0gbmV3IEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIoMCwgMSk7Ci0JCWpwdC5hZGRMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7Ci0JCWRlbGV0ZUF0dHJpYnV0ZSgiaWQiKTsKLQkJYXNzZXJ0VHJ1ZShsc25yLndhaXRGb3JFdmVudHMoKSk7Ci0JCWpwdC5yZW1vdmVMaXN0Q2hhbmdlTGlzdGVuZXIoSmF2YVBlcnNpc3RlbnRUeXBlLkFUVFJJQlVURVNfTElTVCwgbHNucik7Ci0JCWxzbnIgPSBuZXcgRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lcigyLCAwKTsKLQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkubWFrZU5ld0F0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIGpwdCwgZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQpLCAiYWFhIiwgImphdmEubGFuZy5TdHJpbmciLCBudWxsLCAiYWFhIiwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJYXNzZXJ0RmFsc2UobHNuci53YWl0Rm9yRXZlbnRzKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgbHNuci5pbmNyZW1lbnRDb3VudGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxzbnIuZGVjcmVtZW50Q291bnRlcik7CQkKLQl9CQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERlbGV0ZVByb3BlcnR5QW5ub3RhdGVkQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VUZXN0TGlzdGVuZXIgbHNuciA9IG5ldyBFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyKDAsIDIpOwotCQlqcHQuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbnIpOwotCQlkZWxldGVBdHRyaWJ1dGUoImlkIik7Ci0JCWFzc2VydEZhbHNlKGxzbnIud2FpdEZvckV2ZW50cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIGxzbnIuaW5jcmVtZW50Q291bnRlcik7Ci0JCWFzc2VydEVxdWFscygxLCBsc25yLmRlY3JlbWVudENvdW50ZXIpOwkJCi0JfQkKLQkKLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdERlbGV0ZUZpZWxkQW5ub3RhdGVkQXR0cmlidXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiAgewotCQlFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyIGxzbnIgPSBuZXcgRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lcigxLCAxKTsKLQkJanB0LmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJZGVsZXRlQXR0cmlidXRlKCJpZCIpOwotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5tYWtlTmV3QXR0cmlidXRlKGZlYXR1cmVQcm92aWRlciwganB0LCBmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KGpwdCksICJhYWEiLCAiamF2YS5sYW5nLlN0cmluZyIsIG51bGwsICJhYWEiLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlhc3NlcnRUcnVlKGxzbnIud2FpdEZvckV2ZW50cygpKTsKLQkJanB0LnJlbW92ZUxpc3RDaGFuZ2VMaXN0ZW5lcihKYXZhUGVyc2lzdGVudFR5cGUuQVRUUklCVVRFU19MSVNULCBsc25yKTsKLQkJbHNuciA9IG5ldyBFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyKDAsIDIpOwotCQlqcHQuYWRkTGlzdENoYW5nZUxpc3RlbmVyKEphdmFQZXJzaXN0ZW50VHlwZS5BVFRSSUJVVEVTX0xJU1QsIGxzbnIpOwotCQlkZWxldGVBdHRyaWJ1dGUoImFhYSIpOwotCQlhc3NlcnRGYWxzZShsc25yLndhaXRGb3JFdmVudHMoKSk7Ci0JCWFzc2VydEVxdWFscygwLCBsc25yLmluY3JlbWVudENvdW50ZXIpOwotCQlhc3NlcnRFcXVhbHMoMSwgbHNuci5kZWNyZW1lbnRDb3VudGVyKTsJCQotCX0KLQkKLQkKLQkKLQlwcml2YXRlIHZvaWQgZGVsZXRlQXR0cmlidXRlKFN0cmluZyBhdHRyTmFtZSkgewotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5kZWxldGVBdHRyaWJ1dGUoanB0LCBhdHRyTmFtZSwgZmVhdHVyZVByb3ZpZGVyKTsKLQl9CQotCQotCQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5QXR0cmlidXRlc0NoYW5nZVRlc3RMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCQotCQlwcml2YXRlIFNlbWFwaG9yZSBzZW0gPSBuZXcgU2VtYXBob3JlKDEpOwotCQkKLQkJcHJpdmF0ZSBpbnQgdG9CZUFkZGVkOwotCQlwcml2YXRlIGludCB0b0JlUmVtb3ZlOwotCi0JCXB1YmxpYyBFbnRpdHlBdHRyaWJ1dGVzQ2hhbmdlVGVzdExpc3RlbmVyKGludCBhZGQsIGludCByZW1vdmUpIHsKLQkJCXRoaXMudG9CZUFkZGVkID0gYWRkOwotCQkJdGhpcy50b0JlUmVtb3ZlID0gcmVtb3ZlOwotCQkJdHJ5IHsKLQkJCQlzZW0uYWNxdWlyZSgxKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB3YWl0Rm9yRXZlbnRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLQkJCXJldHVybiBzZW0udHJ5QWNxdWlyZSg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKLQkJfQotCQkKLQkJcHVibGljIGludCBpbmNyZW1lbnRDb3VudGVyID0gMDsKLQkJcHVibGljIGludCBkZWNyZW1lbnRDb3VudGVyID0gMDsKLQkJCi0JCXB1YmxpYyB2b2lkIGxpc3RDaGFuZ2VkKExpc3RDaGFuZ2VFdmVudCBldmVudCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNBZGRlZChMaXN0QWRkRXZlbnQgYXJnMCkgewotCQkJaW5jcmVtZW50Q291bnRlcisrOwotCQkJaWYodGhpcy5pbmNyZW1lbnRDb3VudGVyID49IHRvQmVBZGRlZCAmJiB0aGlzLmRlY3JlbWVudENvdW50ZXI+PSB0b0JlUmVtb3ZlICkgewotCQkJCXNlbS5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc01vdmVkKExpc3RNb3ZlRXZlbnQgYXJnMCkgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZW1vdmVkKExpc3RSZW1vdmVFdmVudCBhcmcwKSB7Ci0JCQlkZWNyZW1lbnRDb3VudGVyKys7Ci0JCQlpZih0aGlzLmluY3JlbWVudENvdW50ZXIgPj0gdG9CZUFkZGVkICYmIHRoaXMuZGVjcmVtZW50Q291bnRlcj49IHRvQmVSZW1vdmUgKSB7Ci0JCQkJc2VtLnJlbGVhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zUmVwbGFjZWQoTGlzdFJlcGxhY2VFdmVudCBhcmcwKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBsaXN0Q2xlYXJlZChMaXN0Q2xlYXJFdmVudCBhcmcwKSB7Ci0JCX0KLQl9OwotCQotCUBBZnRlcgkKLQlwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewkJCi0JCWRlbGV0ZUFsbFByb2plY3RzKCk7Ci0JfQotCQotCXByaXZhdGUgdm9pZCBkZWxldGVBbGxQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4obmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0ganBhUHJvamVjdC5nZXRQcm9qZWN0KCk7Ci0JCQkgICAgcHJvamVjdC5jbG9zZShtb25pdG9yKTsJICAgIAkKLQkJCSAgICBwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJICAgIHByb2plY3QuZGVsZXRlKHRydWUsIHRydWUsIG1vbml0b3IpOwkJCQkKLQkJCX0KLQkJfSAsIG1vbml0b3IpOwotCX0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvQ3JlYXRlUmVsYXRpb25GZWF0dXJlc1Rlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVSZWxhdGlvbkZlYXR1cmVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWQ0YTU3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9DcmVhdGVSZWxhdGlvbkZlYXR1cmVzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQWRkQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDcmVhdGVDb25uZWN0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkFuY2hvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbm5lY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLkNyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsRGlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5JUmVsYXRpb24uUmVsVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvTWFueUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvT25lQmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuTWFueVRvT25lVW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk9uZVRvTWFueVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk9uZVRvT25lVW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JRWNsaXBzZUZhY2FkZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDcmVhdGVSZWxhdGlvbkZlYXR1cmVzVGVzdCB7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUlFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUgPSBudWxsOwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYWRkcmVzc1R5cGUpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCi0JCQotCQlDcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBDcmVhdGVPbmVUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCWN1MS5iZWNvbWVXb3JraW5nQ29weShuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGFkZHJlc3NGaWxlKTsKLQkJY3UyLmJlY29tZVdvcmtpbmdDb3B5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJQ29ubmVjdGlvbiBjb25uID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb25uZWN0aW9uLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5hZGRJZlBvc3NpYmxlKChJQWRkQ29udGV4dClFYXN5TW9jay5hbnlPYmplY3QoKSkpLmFuZFN0dWJSZXR1cm4oY29ubik7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGExLCBhMiwgY3MxLCBjczIsIGN0eCk7Ci0JCWZ0LmNyZWF0ZShjdHgpOwotCQlPbmVUb09uZVVuaURpclJlbGF0aW9uIHJlbCA9IGZ0LmNyZWF0ZVJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgY3MxLCBjczIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydE5vdE51bGwocmVsLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsVHlwZS5PTkVfVE9fT05FLCByZWwuZ2V0UmVsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbERpci5VTkksIHJlbC5nZXRSZWxEaXIoKSk7CQkKLQkJYXNzZXJ0U2FtZShyZWwuZ2V0T3duZXIoKSwgdDEpOwotCQlhc3NlcnRTYW1lKHJlbC5nZXRJbnZlcnNlKCksIHQyKTsKLQkJYXNzZXJ0Tm90TnVsbCh0MS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpKTsKLQkJYXNzZXJ0VHJ1ZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc01ldGhvZEFubm90YXRlZCh0MSkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJYXNzZXJ0RmFsc2UoSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuaXNSZWxhdGlvbkFubm90YXRlZChqcGEpKTsKLQkJanBhID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5pc1JlbGF0aW9uQW5ub3RhdGVkKGpwYSkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChhZGRyZXNzVHlwZSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQkJCi0JCUNyZWF0ZU9uZVRvT25lQmlEaXJSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlDb25uZWN0aW9uIGNvbm4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb24uY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoKElBZGRDb250ZXh0KUVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybihjb25uKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgYTEsIGEyLCBjczEsIGNzMiwgY3R4KTsKLQkJZnQuY3JlYXRlKGN0eCk7Ci0JCU9uZVRvT25lQmlEaXJSZWxhdGlvbiByZWwgPSBmdC5jcmVhdGVSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIGNzMSwgY3MyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnROb3ROdWxsKHJlbC5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbFR5cGUuT05FX1RPX09ORSwgcmVsLmdldFJlbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxEaXIuQkksIHJlbC5nZXRSZWxEaXIoKSk7Ci0JCWFzc2VydE5vdE51bGwodDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwodDIuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpKTsJCQotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYW55VG9PbmVVbmlEaXJSZWxhdGlvbkZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGFkZHJlc3NUeXBlKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQotCQkKLQkJQ3JlYXRlTWFueVRvT25lVW5pRGlyUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IENyZWF0ZU1hbnlUb09uZVVuaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlDb25uZWN0aW9uIGNvbm4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb24uY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoKElBZGRDb250ZXh0KUVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybihjb25uKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgYTEsIGEyLCBjczEsIGNzMiwgY3R4KTsKLQkJZnQuY3JlYXRlKGN0eCk7Ci0JCU1hbnlUb09uZVVuaURpclJlbGF0aW9uIHJlbCA9IGZ0LmNyZWF0ZVJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgY3MxLCBjczIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydE5vdE51bGwocmVsLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsVHlwZS5NQU5ZX1RPX09ORSwgcmVsLmdldFJlbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxEaXIuVU5JLCByZWwuZ2V0UmVsRGlyKCkpOwotCQlhc3NlcnROb3ROdWxsKHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSkpOwotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYWRkcmVzc1R5cGUpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCi0JCQotCQlDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBDcmVhdGVNYW55VG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlDb25uZWN0aW9uIGNvbm4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb24uY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoKElBZGRDb250ZXh0KUVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybihjb25uKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgYTEsIGEyLCBjczEsIGNzMiwgY3R4KTsKLQkJZnQuY3JlYXRlKGN0eCk7Ci0JCU1hbnlUb09uZUJpRGlyUmVsYXRpb24gcmVsID0gZnQuY3JlYXRlUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCBjczEsIGNzMik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxUeXBlLk1BTllfVE9fT05FLCByZWwuZ2V0UmVsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbERpci5CSSwgcmVsLmdldFJlbERpcigpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0MS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0Mi5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSkpOwkJCi0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoYWRkcmVzc1R5cGUpOwotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCi0JCQotCQlDcmVhdGVPbmVUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQ3JlYXRlT25lVG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCUlDcmVhdGVDb25uZWN0aW9uQ29udGV4dCBjdHggPSBFYXN5TW9jay5jcmVhdGVNb2NrKElDcmVhdGVDb25uZWN0aW9uQ29udGV4dC5jbGFzcyk7Ci0JCQotCQlDb250YWluZXJTaGFwZSBjczEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJQ29udGFpbmVyU2hhcGUgY3MyID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczEpKS5hbmRTdHViUmV0dXJuKHQxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MyKSkuYW5kU3R1YlJldHVybih0Mik7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQxKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MikpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJCi0JCUFuY2hvciBhMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJQW5jaG9yIGEyID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlleHBlY3QoYTEuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGEyLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCWV4cGVjdChjdHguZ2V0U291cmNlQW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTEpOwotCQlleHBlY3QoY3R4LmdldFRhcmdldEFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGEyKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGFkZHJlc3NGaWxlKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCi0JCUNvbm5lY3Rpb24gY29ubiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29ubmVjdGlvbi5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuYWRkSWZQb3NzaWJsZSgoSUFkZENvbnRleHQpRWFzeU1vY2suYW55T2JqZWN0KCkpKS5hbmRTdHViUmV0dXJuKGNvbm4pOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyLCBhMSwgYTIsIGNzMSwgY3MyLCBjdHgpOwotCQlmdC5jcmVhdGUoY3R4KTsKLQkJT25lVG9NYW55VW5pRGlyUmVsYXRpb24gcmVsID0gZnQuY3JlYXRlUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCBjczEsIGNzMik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxUeXBlLk9ORV9UT19NQU5ZLCByZWwuZ2V0UmVsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbERpci5VTkksIHJlbC5nZXRSZWxEaXIoKSk7CQotCQlhc3NlcnROb3ROdWxsKHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYW55VG9NYW55VW5pRGlyUmVsYXRpb25GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChhZGRyZXNzVHlwZSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0KLQkJCi0JCUNyZWF0ZU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbkZlYXR1cmUgZnQgPSBuZXcgQ3JlYXRlTWFueVRvTWFueVVuaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlDb25uZWN0aW9uIGNvbm4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb24uY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoKElBZGRDb250ZXh0KUVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybihjb25uKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgYTEsIGEyLCBjczEsIGNzMiwgY3R4KTsKLQkJZnQuY3JlYXRlKGN0eCk7Ci0JCU1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbiByZWwgPSBmdC5jcmVhdGVSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIGNzMSwgY3MyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnROb3ROdWxsKHJlbC5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbFR5cGUuTUFOWV9UT19NQU5ZLCByZWwuZ2V0UmVsVHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbERpci5VTkksIHJlbC5nZXRSZWxEaXIoKSk7CQotCQlhc3NlcnROb3ROdWxsKHQxLmdldEF0dHJpYnV0ZU5hbWVkKHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYW55VG9NYW55QmlEaXJSZWxhdGlvbkZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGFkZHJlc3NUeXBlKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQotCQkKLQkJQ3JlYXRlTWFueVRvTWFueUJpRGlyUmVsYXRpb25GZWF0dXJlIGZ0ID0gbmV3IENyZWF0ZU1hbnlUb01hbnlCaURpclJlbGF0aW9uRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3JlYXRlQ29ubmVjdGlvbkNvbnRleHQuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgY3MxID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MxKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGNzMikpLmFuZFN0dWJSZXR1cm4odDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCQotCQlBbmNob3IgYTEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBhMiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJZXhwZWN0KGExLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMSk7Ci0JCWV4cGVjdChhMi5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihjczIpOwotCQlleHBlY3QoY3R4LmdldFNvdXJjZUFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGExKTsKLQkJZXhwZWN0KGN0eC5nZXRUYXJnZXRBbmNob3IoKSkuYW5kU3R1YlJldHVybihhMik7Ci0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlDb25uZWN0aW9uIGNvbm4gPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbm5lY3Rpb24uY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmFkZElmUG9zc2libGUoKElBZGRDb250ZXh0KUVhc3lNb2NrLmFueU9iamVjdCgpKSkuYW5kU3R1YlJldHVybihjb25uKTsKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlciwgYTEsIGEyLCBjczEsIGNzMiwgY3R4KTsKLQkJZnQuY3JlYXRlKGN0eCk7Ci0JCU1hbnlUb01hbnlCaURpclJlbGF0aW9uIHJlbCA9IGZ0LmNyZWF0ZVJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgY3MxLCBjczIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydE5vdE51bGwocmVsLmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsVHlwZS5NQU5ZX1RPX01BTlksIHJlbC5nZXRSZWxUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoUmVsRGlyLkJJLCByZWwuZ2V0UmVsRGlyKCkpOwkKLQkJYXNzZXJ0Tm90TnVsbCh0MS5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbCh0Mi5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSkpOwkJCi0JfQotCQotCQotCXB1YmxpYyBzdGF0aWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKElGaWxlIGZpbGUpewotCQlKcGFGaWxlIGpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWZvciAoSnBhU3RydWN0dXJlTm9kZSBub2RlIDogZ2V0Um9vdE5vZGVzKGpwYUZpbGUpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgbm9kZTsKLQkJCXJldHVybiBlbnRpdHk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPiBnZXRSb290Tm9kZXMoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCWlmKGpwYUZpbGUgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBqcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpOwotCX0KLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlUmVsYXRpb25GZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL0RlbGV0ZVJlbGF0aW9uRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NDhjOS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvRGVsZXRlUmVsYXRpb25GZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklEZWxldGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EZWxldGVSZWxhdGlvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuQmlkaXJlY3Rpb25hbFJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwudXRpbC5JRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0U2l0ZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIERlbGV0ZVJlbGF0aW9uRmVhdHVyZVRlc3QgewkJCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UG9zdERlbGV0ZSgpewkJCi0JCUlKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRSZW1vdmVGZWF0dXJlKGlzQShJUmVtb3ZlQ29udGV4dC5jbGFzcykpKS5hbmRSZXR1cm4obnVsbCk7Ci0JCUlKUEFFZGl0b3JVdGlsIHV0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yVXRpbC5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0SlBBRWRpdG9yVXRpbCgpKS5hbmRTdHViUmV0dXJuKHV0KTsKLQkJSURlbGV0ZUNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGVsZXRlQ29udGV4dC5jbGFzcyk7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBpY3RvZ3JhbUVsZW1lbnQuY2xhc3MpOwotCQlleHBlY3QoY3R4LmdldFBpY3RvZ3JhbUVsZW1lbnQoKSkuYW5kU3R1YlJldHVybihwZSk7Ci0JCUJpZGlyZWN0aW9uYWxSZWxhdGlvbiByZWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEJpZGlyZWN0aW9uYWxSZWxhdGlvbi5jbGFzcyk7IAotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUNvbXBpbGF0aW9uVW5pdC5jbGFzcyk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ29tcGlsYXRpb25Vbml0LmNsYXNzKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcyk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQyID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpOwotCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKSkuYW5kU3R1YlJldHVybihyZWwpOwotCQlleHBlY3QocmVsLmdldE93bmVyKCkpLmFuZFN0dWJSZXR1cm4oanB0MSk7Ci0JCWV4cGVjdChyZWwuZ2V0SW52ZXJzZSgpKS5hbmRTdHViUmV0dXJuKGpwdDIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChqcHQyKSkuYW5kU3R1YlJldHVybihjdTIpOwotCQkKLQkJSVdvcmtiZW5jaFBhcnRTaXRlIHdzID0gRWFzeU1vY2suY3JlYXRlTW9jayhJV29ya2JlbmNoUGFydFNpdGUuY2xhc3MpOwotCQkKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgcCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1UeXBlUHJvdmlkZXIuY2xhc3MpOwotCQlJRWRpdG9yIGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFZGl0b3IuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihwKTsKLQkJZXhwZWN0KHAuZ2V0RGlhZ3JhbUVkaXRvcigpKS5hbmRTdHViUmV0dXJuKGUpOwotCQlleHBlY3QoZS5nZXRTaXRlKCkpLmFuZFN0dWJSZXR1cm4od3MpOwotCQl1dC5vcmdhbml6ZUltcG9ydHMoY3UxLCB3cyk7Ci0JCXV0Lm9yZ2FuaXplSW1wb3J0cyhjdTIsIHdzKTsKLQkJCi0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGN0eCwgdXQsIHJlbCwganB0MSwganB0MiwgY3UxLCBjdTIsIHBlLCBwLCBlLCB3cyk7Ci0JCQotCQlEZWxldGVSZWxhdGlvbkZlYXR1cmUgZmVhdHVyZSA9IG5ldyBEZWxldGVSZWxhdGlvbkZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsJCQotCQlmZWF0dXJlLnBvc3REZWxldGUoY3R4KTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9EaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4ZWUwZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgS2lyaWwgTWl0b3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuZmVhdHVyZTsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEaXJlY3RFZGl0aW5nRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURpcmVjdEVkaXRpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb252ZW50aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuaTE4bi5KUEFFZGl0b3JNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBEaXJlY3RFZGl0QXR0cmlidXRlRmVhdHVyZVRlc3QgewotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tWYWx1ZVZhbGlkU3RyaW5nQnlKYXZhQ29udmVudGlvbnMoKSB7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBFYXN5TW9jay5jcmVhdGVOaWNlTW9jayhKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSBjb25maWd1cmVKcGFGb3JKcHQoanB0KTsKLQkJZXhwZWN0KGpwdC5nZXRBdHRyaWJ1dGVOYW1lZChpc0EoU3RyaW5nLmNsYXNzKSkpLmFuZFN0dWJSZXR1cm4oanBhKTsKLQkJcmVwbGF5KGpwYSwganB0KTsKLQotCQlJRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gcmVwbGF5SnBhRm9yTnVsbFBlKGpwYSk7Ci0JCUlEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0ID0gcmVwbGF5TnVsbFBlQ29udGV4dCgpOwotCi0JCUlEaXJlY3RFZGl0aW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlKHByb3ZpZGVyKTsKLQkJYXNzZXJ0Tm90VmFsaWRKYXZhQ29udmVudGlvbkZpZWxkKGZlYXR1cmUsIGNvbnRleHQsICIiKTsKLQkJYXNzZXJ0Tm90VmFsaWRKYXZhQ29udmVudGlvbkZpZWxkKGZlYXR1cmUsIGNvbnRleHQsICIxYSIpOwotCQlhc3NlcnROb3RWYWxpZEphdmFDb252ZW50aW9uRmllbGQoZmVhdHVyZSwgY29udGV4dCwgImQgZCIpOwotCQlhc3NlcnRWYWxpZEZpZWxkKGZlYXR1cmUsIGNvbnRleHQsICIkZCIpOwotCQlhc3NlcnROb3RWYWxpZEphdmFDb252ZW50aW9uRmllbGQoZmVhdHVyZSwgY29udGV4dCwgImVudW0iKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1ZhbHVlVmFsaWRTdHJpbmdEdXBsaWNhdGVBdHRyaWJ1dGUoKSB7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG90aGVySnBhID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5jbGFzcyk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcyk7Ci0JCWV4cGVjdChqcHQuZ2V0QXR0cmlidXRlTmFtZWQoImF0dHJOYW1lIikpLmFuZFN0dWJSZXR1cm4ob3RoZXJKcGEpOwotCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IGNvbmZpZ3VyZUpwYUZvckpwdChqcHQpOwotCQlyZXBsYXkoanBhLCBqcHQsIG90aGVySnBhKTsKLQotCQlJRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gcmVwbGF5SnBhRm9yTnVsbFBlKGpwYSk7Ci0JCUlEaXJlY3RFZGl0aW5nQ29udGV4dCBjb250ZXh0ID0gcmVwbGF5TnVsbFBlQ29udGV4dCgpOwotCi0JCUlEaXJlY3RFZGl0aW5nRmVhdHVyZSBmZWF0dXJlID0gbmV3IERpcmVjdEVkaXRBdHRyaWJ1dGVGZWF0dXJlKHByb3ZpZGVyKTsKLQotCQlhc3NlcnRFcXVhbHMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlBBRWRpdG9yTWVzc2FnZXMuRGlyZWN0RWRpdEF0dHJpYnV0ZUZlYXR1cmVfYXR0cmlidXRlRXhpc3RzLCAiYXR0ck5hbWUiKSwgZmVhdHVyZS5jaGVja1ZhbHVlVmFsaWQoImF0dHJOYW1lIiwgY29udGV4dCkpOwotCX0KLQotCXByaXZhdGUgSUZlYXR1cmVQcm92aWRlciByZXBsYXlKcGFGb3JOdWxsUGUoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhKSB7Ci0JCUlGZWF0dXJlUHJvdmlkZXIgcHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QocHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KG51bGwpKS5hbmRTdHViUmV0dXJuKGpwYSk7Ci0JCXJlcGxheShwcm92aWRlcik7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGNvbmZpZ3VyZUpwYUZvckpwdChKYXZhUGVyc2lzdGVudFR5cGUganB0KSB7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpOwotCQlleHBlY3QoanBhLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGpwdCk7Ci0JCXJldHVybiBqcGE7Ci0JfQotCi0JcHJpdmF0ZSBJRGlyZWN0RWRpdGluZ0NvbnRleHQgcmVwbGF5TnVsbFBlQ29udGV4dCgpIHsKLQkJSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaXJlY3RFZGl0aW5nQ29udGV4dC5jbGFzcyk7Ci0JCWV4cGVjdChjb250ZXh0LmdldFBpY3RvZ3JhbUVsZW1lbnQoKSkuYW5kU3R1YlJldHVybihudWxsKTsKLQkJcmVwbGF5KGNvbnRleHQpOwotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0VmFsaWRGaWVsZChJRGlyZWN0RWRpdGluZ0ZlYXR1cmUgZmVhdHVyZSwgSURpcmVjdEVkaXRpbmdDb250ZXh0IGNvbnRleHQsIFN0cmluZyBmaWVsZCkgewotCQlhc3NlcnRFcXVhbHMobnVsbCwgZmVhdHVyZS5jaGVja1ZhbHVlVmFsaWQoZmllbGQsIGNvbnRleHQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYXNzZXJ0Tm90VmFsaWRKYXZhQ29udmVudGlvbkZpZWxkKElEaXJlY3RFZGl0aW5nRmVhdHVyZSBmZWF0dXJlLCBJRGlyZWN0RWRpdGluZ0NvbnRleHQgY29udGV4dCwKLQkJCVN0cmluZyBmaWVsZCkgewotCQlmaW5hbCBTdHJpbmcgc291cmNlTGV2ZWwgPSAiMS41IjsKLQkJZmluYWwgU3RyaW5nIGNvbXBsaWFuY2VMZXZlbCA9ICIxLjUiOwotCQlhc3NlcnRFcXVhbHMoSmF2YUNvbnZlbnRpb25zLnZhbGlkYXRlRmllbGROYW1lKGZpZWxkLCBzb3VyY2VMZXZlbCwgY29tcGxpYW5jZUxldmVsKS5nZXRNZXNzYWdlKCksIGZlYXR1cmUKLQkJCQkuY2hlY2tWYWx1ZVZhbGlkKGZpZWxkLCBjb250ZXh0KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvTGF5b3V0RW50aXR5RmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9MYXlvdXRFbnRpdHlGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWZiZTg1Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9MYXlvdXRFbnRpdHlGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklMYXlvdXRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLlNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuTGF5b3V0SlBBRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUdyYXBoaWNzVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklQZVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgTGF5b3V0RW50aXR5RmVhdHVyZVRlc3QgewotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SWZOZXdseUFkZGVkRW50aXR5U2hhcGVJc0V4cGFuZGVkKCkgewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZwID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJSUxheW91dENvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJTGF5b3V0Q29udGV4dC5jbGFzcyk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gRWFzeU1vY2suY3JlYXRlTW9jayhHcmFwaGljc0FsZ29yaXRobS5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChjcy5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKGdhKTsKLQkJRWFzeU1vY2suZXhwZWN0KGN0eC5nZXRQaWN0b2dyYW1FbGVtZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MpOwotCQlFYXN5TW9jay5leHBlY3QoZ2EuZ2V0SGVpZ2h0KCkpLmFuZFN0dWJSZXR1cm4oODApOwotCQlFYXN5TW9jay5leHBlY3QoZ2EuZ2V0V2lkdGgoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQkvL0Vhc3lNb2NrLmV4cGVjdChjcy5pc19fX0FsaXZlKCkpLmFuZFN0dWJSZXR1cm4odHJ1ZSk7Ci0JCUVMaXN0PFNoYXBlPiBzaExpc3QgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PFNoYXBlPihTaGFwZS5jbGFzcyk7IAotCQlFYXN5TW9jay5leHBlY3QoY3MuZ2V0Q2hpbGRyZW4oKSkuYW5kU3R1YlJldHVybihzaExpc3QpOwotCQlJUGVTZXJ2aWNlVXRpbCBwZVV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElQZVNlcnZpY2VVdGlsLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KGZwLmdldFBlVXRpbCgpKS5hbmRTdHViUmV0dXJuKHBlVXRpbCk7Ci0JCUVhc3lNb2NrLmV4cGVjdChwZVV0aWwuZ2V0UHJvcGVydHkoY3MsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUykpLmFuZFN0dWJSZXR1cm4obnVsbCk7Ci0JCUVhc3lNb2NrLmV4cGVjdChwZVV0aWwucmVtb3ZlUHJvcGVydHkoY3MsIEpQQUVkaXRvckNvbnN0YW50cy5DT0xMQVBTRV9GRUFUVVJFUykpLmFuZFN0dWJSZXR1cm4oZmFsc2UpOwotCQlJR3JhcGhpY3NVcGRhdGVyIGd1ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJR3JhcGhpY3NVcGRhdGVyLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KGZwLmdldEdyYXBoaWNzVXBkYXRlcigpKS5hbmRTdHViUmV0dXJuKGd1KTsKLQkJZ3UudXBkYXRlRW50aXR5SGVpZ3RoKGNzKTsKLQkJCi0JCUVhc3lNb2NrLnJlcGxheShmcCwgY3R4LCBjcywgZ2EsIHBlVXRpbCwgZ3UpOwkJCi0JCUxheW91dEpQQUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgTGF5b3V0SlBBRW50aXR5RmVhdHVyZShmcCk7CQkKLQkJZnQubGF5b3V0KGN0eCk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL09wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9PcGVuTWluaWF0dXJlVmlld0ZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYjk1YTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL09wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklBZGRDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlVGVzdCB7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7CQotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb257Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQlJRmlsZSBlbnRpdHkgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGFQcm9qZWN0LCAib3JnLmVjbGlwc2UuRW50aXR5MSIpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KG51bGwpKS5hbmRSZXR1cm4oSlBBQ3JlYXRlRmFjdG9yeS5nZXRQZXJzaXN0ZW50VHlwZShlbnRpdHkpKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoaXNBKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcykpKS5hbmRSZXR1cm4oSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpKS5hbnlUaW1lcygpOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZSgpIHsKLQkJT3Blbk1pbmlhdHVyZVZpZXdGZWF0dXJlIGZ0ID0gbmV3IE9wZW5NaW5pYXR1cmVWaWV3RmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlJQWRkQ29udGV4dCBjdHggPSBFYXN5TW9jay5jcmVhdGVNb2NrKElBZGRDb250ZXh0LmNsYXNzKTsKLQkJZnQuZXhlY3V0ZShjdHgpOwotCX0KLQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL1JlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmVUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY2MDAzMS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSUN1c3RvbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlVGVzdCB7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlwcml2YXRlIElDdXN0b21Db250ZXh0IGNvbnRleHQ7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IisobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBlbnRpdHk7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbnsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCWVudGl0eSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5KGpwYVByb2plY3QsICJvcmcuZWNsaXBzZS5FbnQiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmYWN0b3J5LmFkZEF0dHJpYnV0ZXMoZW50aXR5LCAiYXR0IiwgImphdmEubGFuZy5TdHJpbmciLCAiIiwgImF0dCIsIGZhbHNlKTsKLQkJCi0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlZmFjdG9yQXR0cmlidXRlVHlwZUZlYXR1cmUoKXsKLQkJUGljdG9ncmFtRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IFBpY3RvZ3JhbUVsZW1lbnRbMV07Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgZWxlbWVudCA9IEVhc3lNb2NrLmNyZWF0ZU5pY2VNb2NrKFBpY3RvZ3JhbUVsZW1lbnQuY2xhc3MpOwotCQlyZXBsYXkoZWxlbWVudCk7Ci0JCWVsZW1lbnRzWzBdID0gZWxlbWVudDsKLQkJCi0JCWZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KGVsZW1lbnQpKS5hbmRSZXR1cm4obnVsbCk7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCQkKLQkJY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUN1c3RvbUNvbnRleHQuY2xhc3MpOwotCQlleHBlY3QoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50cygpKS5hbmRSZXR1cm4oZWxlbWVudHMpOwotCQlyZXBsYXkoY29udGV4dCk7Ci0JCQotCQlSZWZhY3RvckF0dHJpYnV0ZVR5cGVGZWF0dXJlIGZlYXR1cmUgPSBuZXcgUmVmYWN0b3JBdHRyaWJ1dGVUeXBlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIpOwotCQlmZWF0dXJlLmV4ZWN1dGUoY29udGV4dCk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZVV0aWxzKCl7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IChKYXZhUGVyc2lzdGVudFR5cGUpcHUuZ2V0UGVyc2lzdGVudFR5cGUoIm9yZy5lY2xpcHNlLkVudCIpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdCA9IGpwdC5nZXRBdHRyaWJ1dGVOYW1lZCgiaWQiKTsKLQkJTGlzdDxTdHJpbmc+IGxzdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25TdHJpbmdzKGF0KTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGxzdC5zaXplKCkpOwotCQlhc3NlcnRUcnVlKGxzdC5jb250YWlucygiQElkIikpOwotCQlTdHJpbmcgdHlwZU5hbWUxID0gSlBBRWRpdG9yVXRpbC5nZXRBdHRyaWJ1dGVUeXBlTmFtZShhdCk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgdHlwZU5hbWUxKTsKLQkJU3RyaW5nIHR5cGVOYW1lMiA9IEpQQUVkaXRvclV0aWwuZ2V0QXR0cmlidXRlVHlwZU5hbWUoYXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKSk7Ci0JCWFzc2VydEVxdWFscygiaW50IiwgdHlwZU5hbWUyKTsJCQotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9SZW1vdmVBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUF0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxYjQ2YTQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9mZWF0dXJlL1JlbW92ZUF0dHJpYnV0ZUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZmVhdHVyZXMuY29udGV4dC5JQ3VzdG9tQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklSZW1vdmVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmN1c3RvbS5JQ3VzdG9tRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuUmVtb3ZlQXR0cmlidXRlRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFJlbW92ZUF0dHJpYnV0ZUZlYXR1cmVUZXN0IHsKLQkKLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCXByaXZhdGUgSVJlbW92ZUNvbnRleHQgY29udGV4dDsKLQlmaW5hbCBTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiKyhuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIElGaWxlIGVudGl0eTsKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJZW50aXR5ID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudCIpOwotCQlUaHJlYWQuc2xlZXAoMjAwMCk7Ci0JCWZhY3RvcnkuYWRkQXR0cmlidXRlcyhlbnRpdHksICJhdHQiLCAiamF2YS5sYW5nLlN0cmluZyIsICIiLCAiYXR0IiwgZmFsc2UpOwotCQkKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlQXR0cmlidXRlRmVhdHVyZSgpIHsKLQkJR3JhcGhpY3NBbGdvcml0aG0gYWxnb3JpdGhtID0gRWFzeU1vY2suY3JlYXRlTmljZU1vY2soR3JhcGhpY3NBbGdvcml0aG0uY2xhc3MpOwotCQlyZXBsYXkoYWxnb3JpdGhtKTsKLQkJCi0JCUVMaXN0PEFuY2hvcj4gbGlzdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRUxpc3QuY2xhc3MpOwotCQlTaGFwZSBzaGFwZSA9IEVhc3lNb2NrLmNyZWF0ZU5pY2VNb2NrKFNoYXBlLmNsYXNzKTsKLQkJCi0JCWV4cGVjdChzaGFwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRSZXR1cm4oYWxnb3JpdGhtKTsKLQkJZXhwZWN0KHNoYXBlLmdldEFuY2hvcnMoKSkuYW5kUmV0dXJuKGxpc3QpOwotCQlyZXBsYXkoc2hhcGUpOwotCQkKLQkJLy9FTGlzdDxTaGFwZT4gbGlzdFNoYXBlID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxTaGFwZT4oU2hhcGUuY2xhc3MpOwotCQkKLQkJQ29udGFpbmVyU2hhcGUgcGljdG9ncmFtRWxlbWVudCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29udGFpbmVyU2hhcGUuY2xhc3MpOwotCQlSZXNvdXJjZSByZXMgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFJlc291cmNlLmNsYXNzKTsKLQkJZXhwZWN0KHBpY3RvZ3JhbUVsZW1lbnQuZVJlc291cmNlKCkpLmFuZFN0dWJSZXR1cm4ocmVzKTsKLQkJCi0JCVJlc291cmNlU2V0IHJzID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZXNvdXJjZVNldC5jbGFzcyk7Ci0JCWV4cGVjdChyZXMuZ2V0UmVzb3VyY2VTZXQoKSkuYW5kU3R1YlJldHVybihycyk7Ci0JCUVMaXN0PEFkYXB0ZXI+IGVhZCA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8QWRhcHRlcj4oQWRhcHRlci5jbGFzcyk7IAotCQlleHBlY3QocnMuZUFkYXB0ZXJzKCkpLmFuZFN0dWJSZXR1cm4oZWFkKTsKLQotCQlyZXBsYXkocGljdG9ncmFtRWxlbWVudCwgcmVzLCBycyk7Ci0JCQotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwaWN0b2dyYW1FbGVtZW50KSkuYW5kUmV0dXJuKEpQQUNyZWF0ZUZhY3RvcnkuZ2V0UGVyc2lzdGVudEF0dHJpYnV0ZShlbnRpdHksICJhdHQiKSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZGVjcmVhc2VBdHRyaWJzTnVtKHBpY3RvZ3JhbUVsZW1lbnQpKS5hbmRSZXR1cm4oMCk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0S2V5Rm9yQnVzaW5lc3NPYmplY3QoaXNBKE9iamVjdC5jbGFzcykpKS5hbmRSZXR1cm4oIiIpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLnJlbW92ZSgiIikpLmFuZFJldHVybihudWxsKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRSZWxhdGlvblJlbGF0ZWRUb0F0dHJpYnV0ZShpc0EoSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUuY2xhc3MpKSkuYW5kUmV0dXJuKG51bGwpOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyKTsKLQkJCi0JCWNvbnRleHQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElSZW1vdmVDb250ZXh0LmNsYXNzKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudCgpKS5hbmRSZXR1cm4ocGljdG9ncmFtRWxlbWVudCk7Ci0JCXJlcGxheShjb250ZXh0KTsKLQkJCi0JCUlDdXN0b21GZWF0dXJlIGdyYXBoaWNhbFJlbW92ZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUN1c3RvbUZlYXR1cmUuY2xhc3MpOwotCQlncmFwaGljYWxSZW1vdmUuZXhlY3V0ZShpc0EoSUN1c3RvbUNvbnRleHQuY2xhc3MpKTsKLQkJcmVwbGF5KGdyYXBoaWNhbFJlbW92ZSk7Ci0JCQotCQlSZW1vdmVBdHRyaWJ1dGVGZWF0dXJlIGZlYXR1cmUgPSBuZXcgUmVtb3ZlQXR0cmlidXRlRmVhdHVyZShmZWF0dXJlUHJvdmlkZXIsIGdyYXBoaWNhbFJlbW92ZSk7Ci0JCWZlYXR1cmUucHJlUmVtb3ZlKGNvbnRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9TYXZlRW50aXR5RmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9TYXZlRW50aXR5RmVhdHVyZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM2N2EyNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvU2F2ZUVudGl0eUZlYXR1cmVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmZlYXR1cmU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkuaW50ZXJuYWwuaXRlcmFibGVzLkVtcHR5SXRlcmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVN0cnVjdHVyZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5TYXZlRW50aXR5RmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIFNhdmVFbnRpdHlGZWF0dXJlVGVzdCB7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwkKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhQaWN0b2dyYW1FbGVtZW50LmNsYXNzKTsKLQotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChjbnQgPCAyNSkgJiYgKHQxID09IG51bGwpKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJY250Kys7Ci0JCX0KLQkJaWYgKHQxID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KHBlKSkuYW5kU3R1YlJldHVybih0MSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KGlzQShKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpKSkuYW5kUmV0dXJuKGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKSkuYW55VGltZXMoKTsKLQotCQkKLQkJU2F2ZUVudGl0eUZlYXR1cmUgZnQgPSBuZXcgU2F2ZUVudGl0eUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJSUN1c3RvbUNvbnRleHQgY3R4ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJQ3VzdG9tQ29udGV4dC5jbGFzcyk7Ci0JCQotCQlQaWN0b2dyYW1FbGVtZW50W10gcGVzID0gbmV3IFBpY3RvZ3JhbUVsZW1lbnRbMV07Ci0JCXBlc1swXSA9IHBlOwotCQlleHBlY3QoY3R4LmdldFBpY3RvZ3JhbUVsZW1lbnRzKCkpLmFuZFN0dWJSZXR1cm4ocGVzKTsKLQkJCi0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIsIGN0eCwgcGUpOwotCQlmdC5leGVjdXRlKGN0eCk7Ci0JfQotCQotCXB1YmxpYyBzdGF0aWMgSmF2YVBlcnNpc3RlbnRUeXBlIGdldFBlcnNpc3RlbnRUeXBlKElGaWxlIGZpbGUpewotCQlKcGFGaWxlIGpwYUZpbGUgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYUZpbGUoZmlsZSk7Ci0JCWZvciAoSnBhU3RydWN0dXJlTm9kZSBub2RlIDogZ2V0Um9vdE5vZGVzKGpwYUZpbGUpKSB7Ci0JCQlKYXZhUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKEphdmFQZXJzaXN0ZW50VHlwZSkgbm9kZTsKLQkJCXJldHVybiBlbnRpdHk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQkKLQkKLQlwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxKcGFTdHJ1Y3R1cmVOb2RlPiBnZXRSb290Tm9kZXMoSnBhRmlsZSBqcGFGaWxlKSB7Ci0JCWlmKGpwYUZpbGUgPT0gbnVsbCl7Ci0JCQlyZXR1cm4gRW1wdHlJdGVyYWJsZS5pbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBqcGFGaWxlLmdldFJvb3RTdHJ1Y3R1cmVOb2RlcygpOwotCX0KLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL2ZlYXR1cmUvVXBkYXRlQXR0cmlidXRlRmVhdHVyZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJjN2MzLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvZmVhdHVyZS9VcGRhdGVBdHRyaWJ1dGVGZWF0dXJlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5mZWF0dXJlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkJhc2ljSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5jb250ZXh0LklDdXN0b21Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLmFsZ29yaXRobXMuR3JhcGhpY3NBbGdvcml0aG07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29udGFpbmVyU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5mZWF0dXJlLlVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlVGVzdCB7Ci0JCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjsKLQlwcml2YXRlIElDdXN0b21Db250ZXh0IGNvbnRleHQ7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IisobmV3IERhdGUoKSkuZ2V0VGltZSgpOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBlbnRpdHk7Ci0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQllbnRpdHkgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGFQcm9qZWN0LCAib3JnLmVjbGlwc2UuRW50Iik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmFjdG9yeS5hZGRBdHRyaWJ1dGVzKGVudGl0eSwgImF0dCIsICJqYXZhLmxhbmcuU3RyaW5nIiwgIiIsICJhdHQiLCBmYWxzZSk7Ci0JfQotCQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKHsgInVuY2hlY2tlZCIsICJkZXByZWNhdGlvbiIgfSkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVBdHRyaWJ1dGVGZWF0dXJlKCl7Ci0JCVRleHQgdGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soVGV4dC5jbGFzcyk7Ci0JCXRleHQuc2V0VmFsdWUoRWFzeU1vY2suaXNBKGphdmEubGFuZy5TdHJpbmcuY2xhc3MpKTsKLQkJRWFzeU1vY2sucmVwbGF5KHRleHQpOwotCQkKLQkJRUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+IGxpc3RDaGlsZHJlbiA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8R3JhcGhpY3NBbGdvcml0aG0+KEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsKLQkJCi0JCQotCQlFYXN5TW9jay5leHBlY3QobGlzdENoaWxkcmVuLmdldCgwKSkuYW5kUmV0dXJuKHRleHQpOwotCQlFYXN5TW9jay5yZXBsYXkobGlzdENoaWxkcmVuKTsKLQkJCi0JCQotCQlSZWN0YW5nbGUgcmVjdGFuZ2xlID0gRWFzeU1vY2suY3JlYXRlTW9jayhSZWN0YW5nbGUuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QocmVjdGFuZ2xlLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKSkuYW5kUmV0dXJuKGxpc3RDaGlsZHJlbik7Ci0JCUVhc3lNb2NrLmV4cGVjdChyZWN0YW5nbGUuZ2V0WSgpKS5hbmRSZXR1cm4oMCkudGltZXMoMik7Ci0JCUVhc3lNb2NrLnJlcGxheShyZWN0YW5nbGUpOwotCQkKLQkJSXRlcmF0b3I8U2hhcGU+IGl0ZXJhdG9yU2hhcGUgPSBFYXN5TW9jay5jcmVhdGVOaWNlTW9jayhJdGVyYXRvci5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChpdGVyYXRvclNoYXBlLmhhc05leHQoKSkuYW5kUmV0dXJuKGZhbHNlKTsKLQkJRWFzeU1vY2sucmVwbGF5KGl0ZXJhdG9yU2hhcGUpOwotCQkKLQkJRUxpc3Q8U2hhcGU+IGxpc3RTaGFwZSA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3Q8U2hhcGU+KFNoYXBlLmNsYXNzKTsKLQkJCi0JCUNvbnRhaW5lclNoYXBlIGNvbnRhaW5lclNoYXBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChjb250YWluZXJTaGFwZS5nZXRDaGlsZHJlbigpKS5hbmRSZXR1cm4obGlzdFNoYXBlKTsKLQkJRWFzeU1vY2sucmVwbGF5KGNvbnRhaW5lclNoYXBlKTsKLQkJCi0JCVNoYXBlIHNoYXBlID0gRWFzeU1vY2suY3JlYXRlTW9jayhTaGFwZS5jbGFzcyk7Ci0JCVJlc291cmNlIHJlcyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2UuY2xhc3MpOwotCQlSZXNvdXJjZVNldCBycyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUmVzb3VyY2VTZXQuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QocmVzLmdldFJlc291cmNlU2V0KCkpLmFuZFN0dWJSZXR1cm4ocnMpOwotCQlFTGlzdDxBZGFwdGVyPiBhZHMgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PEFkYXB0ZXI+KEFkYXB0ZXIuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QocnMuZUFkYXB0ZXJzKCkpLmFuZFN0dWJSZXR1cm4oYWRzKTsKLQkJRWFzeU1vY2suZXhwZWN0KHNoYXBlLmVSZXNvdXJjZSgpKS5hbmRTdHViUmV0dXJuKHJlcyk7Ci0JCQotCi0JCQotCQlFYXN5TW9jay5leHBlY3Qoc2hhcGUuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kUmV0dXJuKHJlY3RhbmdsZSkudGltZXMoMyk7Ci0JCUVhc3lNb2NrLmV4cGVjdChzaGFwZS5nZXRDb250YWluZXIoKSkuYW5kUmV0dXJuKGNvbnRhaW5lclNoYXBlKTsKLQkJCi0JCQotCQlFYXN5TW9jay5yZXBsYXkoc2hhcGUsIHJlcywgcnMpOwotCQkKLQkJY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUN1c3RvbUNvbnRleHQuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QoY29udGV4dC5nZXRJbm5lclBpY3RvZ3JhbUVsZW1lbnQoKSkuYW5kUmV0dXJuKHNoYXBlKTsKLQkJRWFzeU1vY2sucmVwbGF5KGNvbnRleHQpOwotCQkKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoc2hhcGUpKS5hbmRSZXR1cm4obnVsbCk7Ci0JCUVhc3lNb2NrLnJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCQkKLQkJVXBkYXRlQXR0cmlidXRlRmVhdHVyZSBmZWF0dXJlID0gbmV3IFVwZGF0ZUF0dHJpYnV0ZUZlYXR1cmUoZmVhdHVyZVByb3ZpZGVyKTsKLQkJZmVhdHVyZS5leGVjdXRlKGNvbnRleHQpOwotCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvbGlzdGVuZXIvSlBBUHJvamVjdExpc3RlbmVyVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9saXN0ZW5lci9KUEFQcm9qZWN0TGlzdGVuZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YjU2OTUuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9saXN0ZW5lci9KUEFQcm9qZWN0TGlzdGVuZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLmxpc3RlbmVyOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklSZW1vdmVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSVJlbW92ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5Db250YWluZXJTaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBU29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIEpQQVByb2plY3RMaXN0ZW5lclRlc3QgewotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUlFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUgPSBudWxsOwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJSUZpbGUgZW50aXR5ID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudGl0eTEiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKGdldFBlcnNpc3RlbnRUeXBlKGVudGl0eSkpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpLmFuZFJldHVybihKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eSkpLmFueVRpbWVzKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoSUZpbGUgZmlsZSl7Ci0JCUpwYUZpbGUganBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIG5vZGUgOiBnZXRSb290Tm9kZXMoanBhRmlsZSkpIHsKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSBlbnRpdHkgPSAoSmF2YVBlcnNpc3RlbnRUeXBlKSBub2RlOwotCQkJcmV0dXJuIGVudGl0eTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPEpwYVN0cnVjdHVyZU5vZGU+IGdldFJvb3ROb2RlcyhKcGFGaWxlIGpwYUZpbGUpIHsKLQkJaWYoanBhRmlsZSA9PSBudWxsKXsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCk7Ci0JfQotCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oSUZpbGUgZmlsZSkgewotCQlyZXR1cm4gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SlBBUHJvamVjdExpc3RlbmVyKCkgewotCQlKUEFTb2x2ZXIgc2x2ID0gbmV3IEpQQVNvbHZlcigpOyAKLQkJc2x2LnNldEZlYXR1cmVQcm92aWRlcihmZWF0dXJlUHJvdmlkZXIpOwotCQlqcGFQcm9qZWN0LmFkZENvbGxlY3Rpb25DaGFuZ2VMaXN0ZW5lcigibWFyayIsIHNsdi5uZXcgSlBBUHJvamVjdExpc3RlbmVyKCkpOwotCQlQZXJzaXN0ZW5jZVVuaXQgcHUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoanBhUHJvamVjdCk7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRKUFQoIm9yZy5lY2xpcHNlLkVudGl0eTEiLCBwdSk7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGpwdCkpLmFuZFN0dWJSZXR1cm4oY3MpOwotCQlJUmVtb3ZlRmVhdHVyZSBmdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVJlbW92ZUZlYXR1cmUuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFJlbW92ZUZlYXR1cmUoaXNBKElSZW1vdmVDb250ZXh0LmNsYXNzKSkpLmFuZFJldHVybihmdCk7Ci0JCS8vIFRoZSByZW1vdmUgbWV0aG9kIHNob3VsZCBiZSBpbnZva2VkIGV4YWN0bHkgb25jZQotCQlmdC5yZW1vdmUoaXNBKElSZW1vdmVDb250ZXh0LmNsYXNzKSk7Ci0JCXJlcGxheShmdCwgY3MsIGZlYXR1cmVQcm92aWRlcik7Ci0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZUVudGl0eUNsYXNzKGpwdCwgZmVhdHVyZVByb3ZpZGVyKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SlBBUHJvamVjdExpc3RlbmVyTm9SZW1vdmUoKSB7Ci0JCUpQQVNvbHZlciBzbHYgPSBuZXcgSlBBU29sdmVyKCk7IAotCQlzbHYuc2V0RmVhdHVyZVByb3ZpZGVyKGZlYXR1cmVQcm92aWRlcik7Ci0JCWpwYVByb2plY3QuYWRkQ29sbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCJtYXJrIiwgc2x2Lm5ldyBKUEFQcm9qZWN0TGlzdGVuZXIoKSk7Ci0JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdChqcGFQcm9qZWN0KTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEpQVCgib3JnLmVjbGlwc2UuRW50aXR5MSIsIHB1KTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QoanB0KSkuYW5kU3R1YlJldHVybihudWxsKTsKLQkJSVJlbW92ZUZlYXR1cmUgZnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElSZW1vdmVGZWF0dXJlLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRSZW1vdmVGZWF0dXJlKGlzQShJUmVtb3ZlQ29udGV4dC5jbGFzcykpKS5hbmRSZXR1cm4oZnQpOwotCQlyZXBsYXkoZnQsIGZlYXR1cmVQcm92aWRlcik7Ci0JCS8vIGlmIHRoZSBjb250YWluZXIgc2hhcGUgaXMgbnVsbCB0aGUgcmVtb3ZlIG1ldGhvZCBvZiB0aGUgZmVhdHVyZSBzaG91bGQgbm90IGJlIGludm9rZWQKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGVsZXRlRW50aXR5Q2xhc3MoanB0LCBmZWF0dXJlUHJvdmlkZXIpOwotCX0KLQkKLQkKLQlAQWZ0ZXIJCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsJCQotCQlkZWxldGVBbGxQcm9qZWN0cygpOwotCX0KLQkKLQlwcml2YXRlIHZvaWQgZGVsZXRlQWxsUHJvamVjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSVByb2dyZXNzTW9uaXRvciBtb25pdG9yPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVByb2plY3QgcHJvamVjdCA9IGpwYVByb2plY3QuZ2V0UHJvamVjdCgpOwotCQkJCSAgICBwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwkgICAgCQotCQkJCSAgICBwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwotCQkJCSAgICBwcm9qZWN0LmRlbGV0ZSh0cnVlLCB0cnVlLCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvL2lnbm9yZQotCQkJCX0KLQkJCX0KLQkJfSAsIG1vbml0b3IpOwotCX0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL21vZGVsaW50ZWdyYXRpb24vdWkvTW9kZWxJbnRlZ3JhdGlvblRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9Nb2RlbEludGVncmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGY3NDE2Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91aS9Nb2RlbEludGVncmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5pc0E7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5EaWFncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wbGF0Zm9ybS5JRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuRW1wdHlJdGVyYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhU3RydWN0dXJlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnB0SnBhQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5tb2RlbGludGVncmF0aW9uLnVpLkpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLklNb2RlbEludGVncmF0aW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSlBBRGlhZ3JhbUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbEludGVncmF0aW9uVGVzdCB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPREVfR0VORVJBVEVEID0gIkNPREVfR0VORVJBVEVEIjsKLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCWZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlJRWNsaXBzZUZhY2FkZSBlY2xpcHNlRmFjYWRlID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyB0ZXN0UHJvamVjdE5hbWUgPSBURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQlJRmlsZSBlbnRpdHlGaWxlID0gbnVsbDsKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdCh0ZXN0UHJvamVjdE5hbWUpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQllbnRpdHlGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudGl0eTEiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKGdldFBlcnNpc3RlbnRUeXBlKGVudGl0eUZpbGUpKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoaXNBKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcykpKS5hbmRSZXR1cm4oSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHlGaWxlKSkuYW55VGltZXMoKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVdpdGhFbnRpdHlGaWxlRWRpdG9ySW5wdXRUcnVlKCkgewotCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUVkaXRvclJlZmVyZW5jZS5jbGFzcyk7Ci0JCUlGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGaWxlRWRpdG9ySW5wdXQuY2xhc3MpOwotCQlleHBlY3QoaW5wdXQuZ2V0RmlsZSgpKS5hbmRTdHViUmV0dXJuKGVudGl0eUZpbGUpOwotCQlleHBlY3QoaW5wdXQuZ2V0TmFtZSgpKS5hbmRTdHViUmV0dXJuKENPREVfR0VORVJBVEVEKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZW50aXR5RmlsZSk7IAotCQkKLQkJSUpQQUVkaXRvclV0aWwgdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JVdGlsLmNsYXNzKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGlucHV0SnB0VHlwZSA9IGdldFBlcnNpc3RlbnRUeXBlKGVudGl0eUZpbGUpOwotCQlleHBlY3QodXQuZ2V0SlBUeXBlKGN1KSkuYW5kU3R1YlJldHVybihpbnB1dEpwdFR5cGUpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEpQQUVkaXRvclV0aWwoKSkuYW5kU3R1YlJldHVybih1dCk7Ci0JCURpYWdyYW0gZCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRGlhZ3JhbS5jbGFzcyk7Ci0JCUlKUEFEaWFncmFtRWRpdG9ySW5wdXQgZEVkSW5wdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFEaWFncmFtRWRpdG9ySW5wdXQuY2xhc3MpOwotCQl0cnkgewotCQkJZXhwZWN0KGVkaXRvclJlZi5nZXRFZGl0b3JJbnB1dCgpKS5hbmRTdHViUmV0dXJuKGRFZElucHV0KTsKLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlleHBlY3QoZEVkSW5wdXQuZ2V0RGlhZ3JhbSgpKS5hbmRTdHViUmV0dXJuKGQpOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtVHlwZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkpLmFuZFN0dWJSZXR1cm4oZHRwKTsKLQkJSU1vZGVsSW50ZWdyYXRpb25VdGlsIG1vaW5JbnRVdGlsID0gRWFzeU1vY2suY3JlYXRlTW9jayhJTW9kZWxJbnRlZ3JhdGlvblV0aWwuY2xhc3MpOyAKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRNb2luSW50ZWdyYXRpb25VdGlsKCkpLmFuZFN0dWJSZXR1cm4obW9pbkludFV0aWwpOwotCQlleHBlY3QobW9pbkludFV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkKSkuYW5kU3R1YlJldHVybihqcGFQcm9qZWN0KTsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUGljdG9ncmFtRWxlbWVudC5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KGlucHV0SnB0VHlwZSkpLmFuZFN0dWJSZXR1cm4ocGUpOwotCQlJRGlhZ3JhbUVkaXRvciBkRWQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtRWRpdG9yLmNsYXNzKTsKLQkJZXhwZWN0KGR0cC5nZXREaWFncmFtRWRpdG9yKCkpLmFuZFN0dWJSZXR1cm4oZEVkKTsKLQkJZEVkLnNldFBpY3RvZ3JhbUVsZW1lbnRGb3JTZWxlY3Rpb24ocGUpOwotCi0JCUpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgc3RyID0gbmV3IEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3koZmVhdHVyZVByb3ZpZGVyKTsKLQkJCi0JCUVhc3lNb2NrLnJlcGxheShlZGl0b3JSZWYsIGQsIGR0cCwgcGUsIGRFZCwgbW9pbkludFV0aWwsIGRFZElucHV0LCB1dCwgaW5wdXQsIGZlYXR1cmVQcm92aWRlcik7Ci0JCWFzc2VydFRydWUoc3RyLm1hdGNoZXMoZWRpdG9yUmVmLCBpbnB1dCkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5V2l0aEVudGl0eUZpbGVFZGl0b3JJbnB1dEZhbHNlKCkgewkJCi0JCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRWRpdG9yUmVmZXJlbmNlLmNsYXNzKTsKLQkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUZpbGVFZGl0b3JJbnB1dC5jbGFzcyk7Ci0JCWV4cGVjdChpbnB1dC5nZXRGaWxlKCkpLmFuZFN0dWJSZXR1cm4oZW50aXR5RmlsZSk7Ci0JCWV4cGVjdChpbnB1dC5nZXROYW1lKCkpLmFuZFN0dWJSZXR1cm4oQ09ERV9HRU5FUkFURUQpOwotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHlGaWxlKTsgCi0JCQotCQlJSlBBRWRpdG9yVXRpbCB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvclV0aWwuY2xhc3MpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUgaW5wdXRKcHRUeXBlID0gZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5RmlsZSk7Ci0JCWV4cGVjdCh1dC5nZXRKUFR5cGUoY3UpKS5hbmRTdHViUmV0dXJuKGlucHV0SnB0VHlwZSk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0SlBBRWRpdG9yVXRpbCgpKS5hbmRTdHViUmV0dXJuKHV0KTsKLQkJRGlhZ3JhbSBkID0gRWFzeU1vY2suY3JlYXRlTW9jayhEaWFncmFtLmNsYXNzKTsKLQkJSUpQQURpYWdyYW1FZGl0b3JJbnB1dCBkRWRJbnB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQURpYWdyYW1FZGl0b3JJbnB1dC5jbGFzcyk7Ci0JCXRyeSB7Ci0JCQlleHBlY3QoZWRpdG9yUmVmLmdldEVkaXRvcklucHV0KCkpLmFuZFN0dWJSZXR1cm4oZEVkSW5wdXQpOwotCQl9IGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWV4cGVjdChkRWRJbnB1dC5nZXREaWFncmFtKCkpLmFuZFN0dWJSZXR1cm4oZCk7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGR0cCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1UeXBlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihkdHApOwotCQlJTW9kZWxJbnRlZ3JhdGlvblV0aWwgbW9pbkludFV0aWwgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElNb2RlbEludGVncmF0aW9uVXRpbC5jbGFzcyk7IAotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldE1vaW5JbnRlZ3JhdGlvblV0aWwoKSkuYW5kU3R1YlJldHVybihtb2luSW50VXRpbCk7Ci0JCUpwYVByb2plY3QgYW5vdGhlckpwYVByb2plY3QgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEpwYVByb2plY3QuY2xhc3MpOwotCQlleHBlY3QobW9pbkludFV0aWwuZ2V0UHJvamVjdEJ5RGlhZ3JhbShkKSkuYW5kU3R1YlJldHVybihhbm90aGVySnBhUHJvamVjdCk7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFBpY3RvZ3JhbUVsZW1lbnQuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdChpbnB1dEpwdFR5cGUpKS5hbmRTdHViUmV0dXJuKHBlKTsKLQkJSURpYWdyYW1FZGl0b3IgZEVkID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlhZ3JhbUVkaXRvci5jbGFzcyk7Ci0JCWV4cGVjdChkdHAuZ2V0RGlhZ3JhbUVkaXRvcigpKS5hbmRTdHViUmV0dXJuKGRFZCk7Ci0JCWRFZC5zZXRQaWN0b2dyYW1FbGVtZW50Rm9yU2VsZWN0aW9uKHBlKTsKLQotCQlKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHN0ciA9IG5ldyBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KGZlYXR1cmVQcm92aWRlcik7Ci0JCQotCQlFYXN5TW9jay5yZXBsYXkoZWRpdG9yUmVmLCBkLCBkdHAsIHBlLCBkRWQsIG1vaW5JbnRVdGlsLCBhbm90aGVySnBhUHJvamVjdCwgZEVkSW5wdXQsIHV0LCBpbnB1dCwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJYXNzZXJ0RmFsc2Uoc3RyLm1hdGNoZXMoZWRpdG9yUmVmLCBpbnB1dCkpOwotCX0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVdpdGhKUEFEaWFncmFtRWRpdG9ySW5wdXRUcnVlKCkgewkJCi0JCUlFZGl0b3JSZWZlcmVuY2UgZWRpdG9yUmVmID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRWRpdG9yUmVmZXJlbmNlLmNsYXNzKTsKLQkJZXhwZWN0KGVkaXRvclJlZi5nZXRQYXJ0TmFtZSgpKS5hbmRTdHViUmV0dXJuKCJQcm9qZWN0TmFtZSIpOwotCQlJSlBBRGlhZ3JhbUVkaXRvcklucHV0IGlucHV0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRGlhZ3JhbUVkaXRvcklucHV0LmNsYXNzKTsKLQkJZXhwZWN0KGlucHV0LmdldFByb2plY3ROYW1lKCkpLmFuZFN0dWJSZXR1cm4oIlByb2plY3ROYW1lIik7Ci0JCUpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kgc3RyID0gbmV3IEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3koZmVhdHVyZVByb3ZpZGVyKTsJCQotCQlFYXN5TW9jay5yZXBsYXkoZWRpdG9yUmVmLCBpbnB1dCwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJYXNzZXJ0VHJ1ZShzdHIubWF0Y2hlcyhlZGl0b3JSZWYsIGlucHV0KSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneVdpdGhKUEFEaWFncmFtRWRpdG9ySW5wdXRGYWxzZSgpIHsJCQotCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUVkaXRvclJlZmVyZW5jZS5jbGFzcyk7Ci0JCWV4cGVjdChlZGl0b3JSZWYuZ2V0UGFydE5hbWUoKSkuYW5kU3R1YlJldHVybigiUHJvamVjdE5hbWUiKTsKLQkJSUpQQURpYWdyYW1FZGl0b3JJbnB1dCBpbnB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQURpYWdyYW1FZGl0b3JJbnB1dC5jbGFzcyk7Ci0JCWV4cGVjdChpbnB1dC5nZXRQcm9qZWN0TmFtZSgpKS5hbmRTdHViUmV0dXJuKCJEaWZmZXJlbnRQcm9qZWN0TmFtZSIpOwotCQlKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5IHN0ciA9IG5ldyBKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5KGZlYXR1cmVQcm92aWRlcik7CQkKLQkJRWFzeU1vY2sucmVwbGF5KGVkaXRvclJlZiwgaW5wdXQsIGZlYXR1cmVQcm92aWRlcik7Ci0JCWFzc2VydEZhbHNlKHN0ci5tYXRjaGVzKGVkaXRvclJlZiwgaW5wdXQpKTsKLQl9CQotCQotCQotLy8JQFRlc3QKLS8vCXB1YmxpYyB2b2lkIHRlc3RKUEFFZGl0b3JNYXRjaGluZ1N0cmF0ZWd5V2l0aEZpbGVFZGl0b3JJbnB1dCgpIHsKLS8vCQlJRWRpdG9yUmVmZXJlbmNlIGVkaXRvclJlZiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUVkaXRvclJlZmVyZW5jZS5jbGFzcyk7Ci0vLwkJSUZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUZpbGVFZGl0b3JJbnB1dC5jbGFzcyk7Ci0vLwkJSUpQQUVkaXRvclV0aWwgdXQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JVdGlsLmNsYXNzKTsKLS8vCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEpQQUVkaXRvclV0aWwoKSkuYW5kU3R1YlJldHVybih1dCk7Ci0vLwkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKTsKLS8vCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHlGaWxlKTsKLS8vCQlleHBlY3QodXQuZ2V0SlBUeXBlKGN1KSkuYW5kU3R1YlJldHVybihqcHQpOwotLy8JCVBlcnNpc3RlbmNlVW5pdCBwdSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUGVyc2lzdGVuY2VVbml0LmNsYXNzKTsKLS8vCQlleHBlY3QoanB0LmdldFBlcnNpc3RlbmNlVW5pdCgpKS5hbmRTdHViUmV0dXJuKHB1KTsKLS8vCQlleHBlY3QocHUuZ2V0SnBhUHJvamVjdCgpKS5hbmRTdHViUmV0dXJuKGpwYVByb2plY3QpOwotLy8JCWV4cGVjdChpbnB1dC5nZXRGaWxlKCkpLmFuZFN0dWJSZXR1cm4oZW50aXR5RmlsZSk7Ci0vLwkJZXhwZWN0KGlucHV0LmdldE5hbWUoKSkuYW5kU3R1YlJldHVybihlbnRpdHlGaWxlLmdldE5hbWUoKSk7Ci0vLwkJSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneSBzdHIgPSBuZXcgSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneShmZWF0dXJlUHJvdmlkZXIpOwkJCi0vLwkJRWFzeU1vY2sucmVwbGF5KGVkaXRvclJlZiwgaW5wdXQsIHV0LCBqcHQsIHB1LCBmZWF0dXJlUHJvdmlkZXIpOwotLy8JCWFzc2VydEZhbHNlKHN0ci5tYXRjaGVzKGVkaXRvclJlZiwgaW5wdXQpKTsKLS8vCX0KLQkKLQkKLQkKLQlwdWJsaWMgc3RhdGljIEphdmFQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShJRmlsZSBmaWxlKXsKLQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlmb3IgKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSA6IGdldFJvb3ROb2RlcyhqcGFGaWxlKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGVudGl0eSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG5vZGU7Ci0JCQlyZXR1cm4gZW50aXR5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8SnBhU3RydWN0dXJlTm9kZT4gZ2V0Um9vdE5vZGVzKEpwYUZpbGUganBhRmlsZSkgewotCQlpZihqcGFGaWxlID09IG51bGwpewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4ganBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKTsKLQl9Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0KLQkJCi0JQEFmdGVyCQotCXB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CQkKLQkJZGVsZXRlQWxsUHJvamVjdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbFByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvcj0gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQkJUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLnJ1bihuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCUlQcm9qZWN0IHByb2plY3QgPSBqcGFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJCSAgICBwcm9qZWN0LmNsb3NlKG1vbml0b3IpOwkgICAgCQotCQkJICAgIHByb2plY3QuY2xvc2UobW9uaXRvcik7Ci0JCQkgICAgcHJvamVjdC5kZWxldGUodHJ1ZSwgdHJ1ZSwgbW9uaXRvcik7CQkJCQotCQkJfQotCQl9ICwgbW9uaXRvcik7Ci0JfQkKLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvbW9kZWxpbnRlZ3JhdGlvbi91dGlsL01vZGVsSW50ZWdyYXRpb25VdGlsVGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTQ3YWIuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9tb2RlbGludGVncmF0aW9uL3V0aWwvTW9kZWxJbnRlZ3JhdGlvblV0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwubW9kZWxpbnRlZ3JhdGlvbi51dGlsLk1vZGVsSW50ZWdyYXRpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUxpc3RlbmVyOwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotcHVibGljIGNsYXNzIE1vZGVsSW50ZWdyYXRpb25VdGlsVGVzdCB7Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCBnZXRNT0lOTm9SZXNvdXJjZUZvbGRlclRlc3QoKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElQcm9qZWN0LmNsYXNzKTsKLQkJLy9FTGlzdCByciA9IG5ldyBCYXNpY0ludGVybmFsRUxpc3QoU3RyaW5nLmNsYXNzKTsKLQkJRWFzeU1vY2suZXhwZWN0KHByb2plY3QuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpKS5hbmRTdHViUmV0dXJuKG5ldyBQYXRoKCJzcmMiKSk7Ci0JCUVhc3lNb2NrLnJlcGxheShwcm9qZWN0KTsKLQkJSVBhdGggcCA9IE1vZGVsSW50ZWdyYXRpb25VdGlsLmdldEVNRlJlc291cmNlRm9sZGVyUGF0aChwcm9qZWN0KTsKLQkJYXNzZXJ0Tm90TnVsbChwKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIHAuc2VnbWVudENvdW50KCkpOwotCQlhc3NlcnRFcXVhbHMocC5zZWdtZW50KDApLCAic3JjIik7Ci0JfQotCQotCUBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCBnZXRNT0lOU3JjUmVzb3VyY2VGb2xkZXJUZXN0KCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUHJvamVjdC5jbGFzcyk7Ci0JCUVMaXN0IHJyID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdChTdHJpbmcuY2xhc3MpOwotCQlyci5hZGQoInNyYyIpOwotCQlFYXN5TW9jay5leHBlY3QocHJvamVjdC5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkpLmFuZFN0dWJSZXR1cm4obmV3IFBhdGgoInNyYyIpKTsKLQkJRWFzeU1vY2sucmVwbGF5KHByb2plY3QpOwotCQlJUGF0aCBwID0gTW9kZWxJbnRlZ3JhdGlvblV0aWwuZ2V0RU1GUmVzb3VyY2VGb2xkZXJQYXRoKHByb2plY3QpOwotCQlhc3NlcnROb3ROdWxsKHApOwotCQlhc3NlcnRFcXVhbHMoMiwgcC5zZWdtZW50Q291bnQoKSk7Ci0JCWFzc2VydEVxdWFscyhwLnNlZ21lbnQoMCksICJzcmMiKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCBjb3B5RXhpc3RpbmdYTUlDb250ZW50QW5kRGVsZXRlRmlsZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQnVuZGxlIGIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEJ1bmRsZS5jbGFzcyk7Ci0JCUJ1bmRsZUNvbnRleHQgYmMgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEJ1bmRsZUNvbnRleHQuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QoYmMuZ2V0QnVuZGxlKCkpLmFuZFN0dWJSZXR1cm4oYik7Ci0JCUVhc3lNb2NrLmV4cGVjdChiLmdldFN5bWJvbGljTmFtZSgpKS5hbmRTdHViUmV0dXJuKCJqcGFfZWRpdG9yIik7Ci0JCWJjLmFkZEJ1bmRsZUxpc3RlbmVyKEVhc3lNb2NrLmlzQShCdW5kbGVMaXN0ZW5lci5jbGFzcykpOwotCQlFYXN5TW9jay5yZXBsYXkoYmMsIGIpOwotCQkKLQkJSlBBRGlhZ3JhbUVkaXRvclBsdWdpbiBwID0gbmV3IEpQQURpYWdyYW1FZGl0b3JQbHVnaW4oKTsKLQkJcC5zdGFydChiYyk7Ci0JCUpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhUHJvamVjdE1hbmFnZXIoKTsKLQkJCi0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKUEFEaWFncmFtRWRpdG9yUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJc3RvcmUucHV0VmFsdWUoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX0RJQUdSQU1fRk9MREVSLCAiZGlhZ3JhbXMiKTsKLQkJc3RvcmUuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9ESUFHUkFNX0ZPTERFUik7Ci0JCQotCQlKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCUpwYVByb2plY3QganBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdCgiVGVzdF8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkJCi0JCU1vZGVsSW50ZWdyYXRpb25VdGlsLmNvcHlFeGlzdGluZ1hNSUNvbnRlbnRBbmREZWxldGVGaWxlKGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCAiZGlhZ3JhbV9uYW1lIiwgbnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXJUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM0OTY1ZC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMCBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplclRlc3QgewotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBuZXcgUHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIGZpeHR1cmUgPSBuZXcgSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyKAotCQkJCXN0b3JlKTsKLQkJZml4dHVyZS5pbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBwYWNrID0gc3RvcmUKLQkJCQkuZ2V0RGVmYXVsdFN0cmluZyhKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuUFJPUEVSVFlfRU5USVRZX1BBQ0tBR0UpOwotCQlhc3NlcnRFcXVhbHMoSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyLlBST1BFUlRZX1ZBTF9FTlRJVFlfUEFDS0FHRSwgcGFjayk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3ByZWZlcmVuY2VzL0pQQUVkaXRvclByZWZlcmVuY2VzUGFnZVRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTg4OTZlLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLkpQQURpYWdyYW1FZGl0b3JQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlBBRWRpdG9yUHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpQQUVkaXRvclByZWZlcmVuY2VzUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlVGVzdCB7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgc3RvcmU7Ci0JcHJpdmF0ZSBTdHJpbmcgb2xkVmFsdWU7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB7Ci0JCXN0b3JlID0gSlBBRGlhZ3JhbUVkaXRvclBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCW9sZFZhbHVlID0gc3RvcmUKLQkJCQkuZ2V0U3RyaW5nKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfUEFDS0FHRSk7Ci0JfQotCi0JQEFmdGVyCi0JcHVibGljIHZvaWQgdGVhckRvd24oKSB7Ci0JCXN0b3JlLnNldFZhbHVlKEpQQUVkaXRvclByZWZlcmVuY2VJbml0aWFsaXplci5QUk9QRVJUWV9FTlRJVFlfUEFDS0FHRSwKLQkJCQlvbGRWYWx1ZSk7Ci0JfQotCi0JLyoKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1N0YXRlKCkgewotCQlKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UgcGFnZSA9IGNyZWF0ZUNvbnRyb2woKTsKLQkJYXNzZXJ0TnVsbChwYWdlLmdldEVycm9yTWVzc2FnZSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDaGVja1N0YXRlRXJyb3JNZXNzYWdlKCkgewotCQlzdG9yZS5zZXRWYWx1ZShKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuREVGQVVMVF9FTlRJVFlfUEFDS0FHRSwKLQkJCQkiZCBvbWQiKTsKLQkJSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlIHBhZ2UgPSBjcmVhdGVDb250cm9sKCk7Ci0JCWFzc2VydE5vdE51bGwocGFnZS5nZXRFcnJvck1lc3NhZ2UoKSk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tTdGF0ZVdhcm5pbmdNZXNzYWdlKCkgewotCQlzdG9yZS5zZXRWYWx1ZShKUEFFZGl0b3JQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuREVGQVVMVF9FTlRJVFlfUEFDS0FHRSwKLQkJCQkiQ2FwaXRhbExldHRlciIpOwotCQlKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UgcGFnZSA9IGNyZWF0ZUNvbnRyb2woKTsKLQkJYXNzZXJ0TnVsbChwYWdlLmdldE1lc3NhZ2UoKSk7Ci0JCWFzc2VydFRydWUocGFnZS5pc1ZhbGlkKCkpOwotCX0KLQkqLwotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0SW5pdCgpIHsKLQkJSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlIHBhZ2UgPSBuZXcgSlBBRWRpdG9yUHJlZmVyZW5jZXNQYWdlKCk7Ci0JCXBhZ2UuaW5pdChudWxsKTsKLQl9Ci0KLQlAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLQlwcml2YXRlIEpQQUVkaXRvclByZWZlcmVuY2VzUGFnZSBjcmVhdGVDb250cm9sKCkgewotCQlKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UgcGFnZSA9IG5ldyBKUEFFZGl0b3JQcmVmZXJlbmNlc1BhZ2UoKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoRGlzcGxheS5nZXREZWZhdWx0KCkKLQkJCQkuZ2V0QWN0aXZlU2hlbGwoKSwgU1dULk5PTkUpOwotCQlwYWdlLmNyZWF0ZUNvbnRyb2woY29tcG9zaXRlKTsKLQkJcmV0dXJuIHBhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXJUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckZlYXR1cmVQcm92aWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0NmY2NS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3Byb3ZpZGVyL0pQQUVkaXRvckZlYXR1cmVQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucHJvdmlkZXI7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmR0LklEaWFncmFtVHlwZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLklEZWxldGVGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURlbGV0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5DbGlja1JlbW92ZUF0dHJpYnV0ZUJ1dHRvbkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwuZmVhdHVyZS5EZWxldGVKUEFFbnRpdHlGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLmZlYXR1cmUuRGVsZXRlUmVsYXRpb25GZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklKcGFTb2x2ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyVGVzdCB7Ci0JCi0KLQlwcml2YXRlIElKcGFTb2x2ZXIgc29sdmVyOwotCXByaXZhdGUgU3RyaW5nIGJ1c2luZXNzT2JqZWN0S2V5OwotCi0JLyoqCi0JICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCi0JICovCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNvbHZlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpwYVNvbHZlci5jbGFzcyk7Ci0JCWJ1c2luZXNzT2JqZWN0S2V5ID0gInNvbWVWYWx1ZSI7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEF0dHJpYnV0ZXNHcm91cERlbGV0ZUZlYXR1cmUoKXsJCQotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgpOwotCQotCQlleHBlY3Qoc29sdmVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGJ1c2luZXNzT2JqZWN0S2V5KSkuYW5kUmV0dXJuKG5ldyBPYmplY3QoKSk7Ci0gCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gY3JlYXRlRmVhdHVyZVByb3ZpZGVyKCk7Ci0gCQkKLQkJLy90ZXN0Ci0JCUlEZWxldGVDb250ZXh0IGNvbnRleHQgPSByZXBsYXlEZWxldGVDb250ZXh0KHBlKTsKLQkJYXNzZXJ0TnVsbChwcm92aWRlci5nZXREZWxldGVGZWF0dXJlKGNvbnRleHQpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QXR0cmlidXRlRGVsZXRlRmVhdHVyZSgpewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSByZXBsYXlBdHRyaWJ1dGUoKTsKLQkJZXhwZWN0KHNvbHZlci5nZXRCdXNpbmVzc09iamVjdEZvcktleShidXNpbmVzc09iamVjdEtleSkpLmFuZFN0dWJSZXR1cm4oanBhKTsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBwcm92aWRlciA9IGNyZWF0ZUZlYXR1cmVQcm92aWRlcigpOwotCQkKLQkJLy90ZXN0Ci0JCUlEZWxldGVDb250ZXh0IGNvbnRleHQgPSByZXBsYXlEZWxldGVDb250ZXh0KHBlKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm92aWRlci5nZXREZWxldGVGZWF0dXJlKGNvbnRleHQpKTsKLQkJSURlbGV0ZUZlYXR1cmUgZmVhdHVyZSA9IHByb3ZpZGVyLmdldERlbGV0ZUZlYXR1cmUoY29udGV4dCk7Ci0JCWFzc2VydFRydWUoZmVhdHVyZSBpbnN0YW5jZW9mIENsaWNrUmVtb3ZlQXR0cmlidXRlQnV0dG9uRmVhdHVyZSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEVudGl0eURlbGV0ZUZlYXR1cmUoKXsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IHJlcGxheUpQVCgiVGVzdEVudGl0eSIpOwotCQkKLQkJZXhwZWN0KHNvbHZlci5nZXRCdXNpbmVzc09iamVjdEZvcktleShidXNpbmVzc09iamVjdEtleSkpLmFuZFN0dWJSZXR1cm4oanB0KTsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBwcm92aWRlciA9IGNyZWF0ZUZlYXR1cmVQcm92aWRlcigpOwotCQkKLQkJLy90ZXN0Ci0JCUlEZWxldGVDb250ZXh0IGNvbnRleHQgPSByZXBsYXlEZWxldGVDb250ZXh0KHBlKTsKLQkJYXNzZXJ0Tm90TnVsbChwcm92aWRlci5nZXREZWxldGVGZWF0dXJlKGNvbnRleHQpKTsKLQkJSURlbGV0ZUZlYXR1cmUgZGVsZXRlRmVhdHVyZSA9IHByb3ZpZGVyLmdldERlbGV0ZUZlYXR1cmUoY29udGV4dCk7Ci0JCWFzc2VydFRydWUoZGVsZXRlRmVhdHVyZSBpbnN0YW5jZW9mIERlbGV0ZUpQQUVudGl0eUZlYXR1cmUpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZWxhdGlvbkRlbGV0ZUZlYXR1cmUoKXsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdDEgPSByZXBsYXlKUFQoIlRlc3RFbnRpdHkxIik7Ci0JCUphdmFQZXJzaXN0ZW50VHlwZSBqcHQyID0gcmVwbGF5SlBUKCJUZXN0RW50aXR5MiIpOwotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gY3JlYXRlRmVhdHVyZVByb3ZpZGVyKCk7Ci0KLQkJQWJzdHJhY3RSZWxhdGlvbiByZWxhdGlvbiA9IG5ldyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24ocHJvdmlkZXIsIGpwdDEsIGpwdDIsICJhdHRyaWJ1dGUxIiwgZmFsc2UsIG51bGwsIG51bGwpOwotCQlleHBlY3Qoc29sdmVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yS2V5KGJ1c2luZXNzT2JqZWN0S2V5KSkuYW5kU3R1YlJldHVybihyZWxhdGlvbik7Ci0JCQotCQkvL3Rlc3QKLQkJSURlbGV0ZUNvbnRleHQgY29udGV4dCA9IHJlcGxheURlbGV0ZUNvbnRleHQocGUpOwotCQlhc3NlcnROb3ROdWxsKHByb3ZpZGVyLmdldERlbGV0ZUZlYXR1cmUoY29udGV4dCkpOwotCQlJRGVsZXRlRmVhdHVyZSBkZWxldGVGZWF0dXJlID0gcHJvdmlkZXIuZ2V0RGVsZXRlRmVhdHVyZShjb250ZXh0KTsKLQkJYXNzZXJ0VHJ1ZShkZWxldGVGZWF0dXJlIGluc3RhbmNlb2YgRGVsZXRlUmVsYXRpb25GZWF0dXJlKTsKLQl9Ci0KLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50VHlwZSByZXBsYXlKUFQoU3RyaW5nIG5hbWUpewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudFR5cGUuY2xhc3MpOwotCQlleHBlY3QoanB0LmdldE5hbWUoKSkuYW5kUmV0dXJuKG5hbWUpOwotCQlyZXBsYXkoanB0KTsKLQkJcmV0dXJuIGpwdDsKLQl9Ci0JCi0JcHJpdmF0ZSBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSByZXBsYXlBdHRyaWJ1dGUoKXsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0cmlidXRlID0gRWFzeU1vY2suY3JlYXRlTW9jayhKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZS5jbGFzcyk7Ci0JCWV4cGVjdChhdHRyaWJ1dGUuZ2V0TmFtZSgpKS5hbmRSZXR1cm4oImF0dHJpYnV0ZSIpOwotCQlyZXBsYXkoYXR0cmlidXRlKTsKLQkJcmV0dXJuIGF0dHJpYnV0ZTsKLQl9Ci0JCi0JQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBQaWN0b2dyYW1FbGVtZW50IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoKXsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUGljdG9ncmFtRWxlbWVudC5jbGFzcyk7Ci0JCVJlc291cmNlIHIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFJlc291cmNlLmNsYXNzKTsKLQkJZXhwZWN0KHBlLmVSZXNvdXJjZSgpKS5hbmRTdHViUmV0dXJuKHIpOwotCQkvL2V4cGVjdChwZS5pc19fX0FsaXZlKCkpLmFuZFN0dWJSZXR1cm4odHJ1ZSk7Ci0JCUVMaXN0PFByb3BlcnR5PiBwcm9wZXJ0aWVzID0gRWFzeU1vY2suY3JlYXRlTW9jayhFTGlzdC5jbGFzcyk7Ci0JCVByb3BlcnR5IHByb3AgPSBFYXN5TW9jay5jcmVhdGVNb2NrKFByb3BlcnR5LmNsYXNzKTsKLQkJZXhwZWN0KHByb3AuZ2V0S2V5KCkpLmFuZFN0dWJSZXR1cm4oImluZGVwZW5kZW50T2JqZWN0Iik7Ci0JCWV4cGVjdChwcm9wLmdldFZhbHVlKCkpLmFuZFN0dWJSZXR1cm4oYnVzaW5lc3NPYmplY3RLZXkpOwotCQlyZXBsYXkocHJvcCwgcik7Ci0JCXByb3BlcnRpZXMuYWRkKHByb3ApOwotCQlleHBlY3QocGUuZ2V0UHJvcGVydGllcygpKS5hbmRTdHViUmV0dXJuKHByb3BlcnRpZXMpOwotCQlyZXBsYXkocGUpOwotCQlyZXR1cm4gcGU7Ci0JfQotCi0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGNyZWF0ZUZlYXR1cmVQcm92aWRlcigpIHsKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlhZ3JhbVR5cGVQcm92aWRlci5jbGFzcyk7Ci0JCXJlcGxheShkdHApOwotCQlzb2x2ZXIuc2V0RmVhdHVyZVByb3ZpZGVyKGlzQShJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKSk7Ci0JCXJlcGxheShzb2x2ZXIpOwotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIHByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KHByb3ZpZGVyLmdldERpYWdyYW1UeXBlUHJvdmlkZXIoKSkuYW5kU3R1YlJldHVybihkdHApOwotCQkvL3Byb3ZpZGVyLmdldAotCQlyZXBsYXkocHJvdmlkZXIpOwotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCQotCXByaXZhdGUgSURlbGV0ZUNvbnRleHQgcmVwbGF5RGVsZXRlQ29udGV4dChQaWN0b2dyYW1FbGVtZW50IHBlKXsKLQkJSURlbGV0ZUNvbnRleHQgY29udGV4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURlbGV0ZUNvbnRleHQuY2xhc3MpOwotCQlleHBlY3QoY29udGV4dC5nZXRQaWN0b2dyYW1FbGVtZW50KCkpLmFuZFN0dWJSZXR1cm4ocGUpOwotCQlyZXBsYXkoY29udGV4dCk7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlclRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcHJvdmlkZXIvSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODc2ODAuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9wcm92aWRlci9KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5wcm92aWRlcjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sudmVyaWZ5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5kdC5JRGlhZ3JhbVR5cGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5mZWF0dXJlcy5JRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLmZlYXR1cmVzLmNvbnRleHQuSURvdWJsZUNsaWNrQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLkdyYXBoaWNzQWxnb3JpdGhtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS50Yi5JRGVjb3JhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLnRiLklUb29sQmVoYXZpb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS50Yi5JbWFnZURlY29yYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLm1vZGVsaW50ZWdyYXRpb24udWkuSlBBRWRpdG9yTWF0Y2hpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5KUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSVN0YXRpY0lERTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXJUZXN0IHsKLQotCS8qKgotCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldFJlbmRlcmluZ0RlY29yYXRvcnNQaWN0b2dyYW1FbGVtZW50RXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoMTAwLCAxMDApOwotCQlJTWFya2VyIG1hcmtlciA9IHJlcGxheU1hcmtlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCAiRXJyb3IgbWVzc2FnZSIpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SnB0V2l0aE1hcmtlcihuZXcgSU1hcmtlcltdIHsgbWFya2VyIH0pOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXIocGUsIGpwdCk7Ci0KLQkJSVRvb2xCZWhhdmlvclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKGR0cCk7Ci0JCUlEZWNvcmF0b3JbXSBkZWNvcmF0b3JzID0gcHJvdmlkZXIuZ2V0RGVjb3JhdG9ycyhwZSk7Ci0JCWFzc2VydEVxdWFscygxLCBkZWNvcmF0b3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiRXJyb3IgbWVzc2FnZSIsIGRlY29yYXRvcnNbMF0uZ2V0TWVzc2FnZSgpKTsKLQl9Ci0KLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZW5kZXJpbmdEZWNvcmF0b3JzUGljdG9ncmFtRWxlbWVudFdhcm5pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IHJlcGxheVBpY3RvZ3JhbUVsZW1lbnQoMTAwLCAxMDApOwotCi0JCUlNYXJrZXIgbWFya2VyID0gcmVwbGF5TWFya2VyKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgIldhcm5pbmcgbWVzc2FnZSIpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SnB0V2l0aE1hcmtlcihuZXcgSU1hcmtlcltdIHsgbWFya2VyIH0pOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXIocGUsIGpwdCk7Ci0KLQkJSVRvb2xCZWhhdmlvclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKGR0cCk7Ci0JCUlEZWNvcmF0b3JbXSBkZWNvcmF0b3JzID0gcHJvdmlkZXIuZ2V0RGVjb3JhdG9ycyhwZSk7Ci0JCWFzc2VydEVxdWFscygxLCBkZWNvcmF0b3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiV2FybmluZyBtZXNzYWdlIiwgZGVjb3JhdG9yc1swXS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldFJlbmRlcmluZ0RlY29yYXRvcnNQaWN0b2dyYW1FbGVtZW50SW5mbygpIHRocm93cyBFeGNlcHRpb24gewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgxMDAsIDEwMCk7Ci0JCUlNYXJrZXIgbWFya2VyID0gcmVwbGF5TWFya2VyKElNYXJrZXIuU0VWRVJJVFlfSU5GTywgIkluZm8gbWVzc2FnZSIpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SnB0V2l0aE1hcmtlcihuZXcgSU1hcmtlcltdIHsgbWFya2VyIH0pOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXIocGUsIGpwdCk7Ci0KLQkJSVRvb2xCZWhhdmlvclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKGR0cCk7Ci0JCUlEZWNvcmF0b3JbXSBkZWNvcmF0b3JzID0gcHJvdmlkZXIuZ2V0RGVjb3JhdG9ycyhwZSk7Ci0JCWFzc2VydEVxdWFscygxLCBkZWNvcmF0b3JzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiSW5mbyBtZXNzYWdlIiwgZGVjb3JhdG9yc1swXS5nZXRNZXNzYWdlKCkpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldFJlbmRlcmluZ0RlY29yYXRvcnNQaWN0b2dyYW1FbGVtZW50Tm9NYXJrZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KDEwMCwgMTAwKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IHJlcGxheUpwdFdpdGhNYXJrZXIobmV3IElNYXJrZXJbMF0pOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXIocGUsIGpwdCk7Ci0KLQkJSVRvb2xCZWhhdmlvclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKGR0cCk7Ci0JCUlEZWNvcmF0b3JbXSBkZWNvcmF0b3JzID0gcHJvdmlkZXIuZ2V0RGVjb3JhdG9ycyhwZSk7Ci0JCWFzc2VydEVxdWFscygwLCBkZWNvcmF0b3JzLmxlbmd0aCk7Ci0JfQotCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0UmVuZGVyaW5nRGVjb3JhdG9yc1BpY3RvZ3JhbUVsZW1lbnRUd29NYXJrZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KDEwMCwgMTAwKTsKLQkJSU1hcmtlciB3YXJuaW5nTWFya2VyID0gcmVwbGF5TWFya2VyKElNYXJrZXIuU0VWRVJJVFlfV0FSTklORywgIndhcm5pbmciKTsKLQkJSU1hcmtlciBlcnJvck1hcmtlciA9IHJlcGxheU1hcmtlcihJTWFya2VyLlNFVkVSSVRZX0VSUk9SLCAiZXJyb3IiKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IHJlcGxheUpwdFdpdGhNYXJrZXIobmV3IElNYXJrZXJbXSB7IGVycm9yTWFya2VyLCB3YXJuaW5nTWFya2VyIH0pOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXIocGUsIGpwdCk7Ci0JCUlUb29sQmVoYXZpb3JQcm92aWRlciBwcm92aWRlciA9IG5ldyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcihkdHApOwotCQlJRGVjb3JhdG9yW10gZGVjb3JhdG9ycyA9IHByb3ZpZGVyLmdldERlY29yYXRvcnMocGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZGVjb3JhdG9ycy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoImVycm9yIiwgZGVjb3JhdG9yc1swXS5nZXRNZXNzYWdlKCkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXRSZW5kZXJpbmdEZWNvcmF0b3JzUGljdG9ncmFtRWxlbWVudExvY2F0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVBpY3RvZ3JhbUVsZW1lbnQgcGUgPSByZXBsYXlQaWN0b2dyYW1FbGVtZW50KDEwMCwgMTAwKTsKLQkJSU1hcmtlciBtYXJrZXIgPSByZXBsYXlNYXJrZXIoSU1hcmtlci5TRVZFUklUWV9FUlJPUiwgIkVycm9yIG1lc3NhZ2UiKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IHJlcGxheUpwdFdpdGhNYXJrZXIobmV3IElNYXJrZXJbXSB7IG1hcmtlciB9KTsKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwID0gcmVwbGF5RGlhZ3JhbVByb3ZpZGVyKHBlLCBqcHQpOwotCi0JCUlUb29sQmVoYXZpb3JQcm92aWRlciBwcm92aWRlciA9IG5ldyBKUEFFZGl0b3JUb29sQmVoYXZpb3JQcm92aWRlcihkdHApOwotCQlJRGVjb3JhdG9yW10gZGVjb3JhdG9ycyA9IHByb3ZpZGVyLmdldERlY29yYXRvcnMocGUpOwotCQlhc3NlcnRFcXVhbHMoMSwgZGVjb3JhdG9ycy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoODAsICgoSW1hZ2VEZWNvcmF0b3IpIGRlY29yYXRvcnNbMF0pLmdldFgoKSk7Ci0JCWFzc2VydEVxdWFscyg4MCwgKChJbWFnZURlY29yYXRvcikgZGVjb3JhdG9yc1swXSkuZ2V0WSgpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlQ2xpY2tPbkpwdEZlYXR1cmUoKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgxMDAsIDEwMCk7Ci0JCUlGaWxlIGZpbGUgPSByZXBsYXlSZXNvdXJjZSgpOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gcmVwbGF5SnB0KHBlLCBmaWxlKTsKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwID0gcmVwbGF5RGlhZ3JhbVByb3ZpZGVyKHBlLCBqcHQpOwotCQkKLQkJSUVjbGlwc2VGYWNhZGUgZmFjYWRlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRWNsaXBzZUZhY2FkZS5jbGFzcyk7Ci0JCUlTdGF0aWNJREUgaWRlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJU3RhdGljSURFLmNsYXNzKTsKLQkJZXhwZWN0KGZhY2FkZS5nZXRJREUoKSkuYW5kU3R1YlJldHVybihpZGUpOwotCQlpZGUub3BlbkVkaXRvcihmaWxlKTsKLQkJcmVwbGF5KGZhY2FkZSwgaWRlKTsKLQkJSVRvb2xCZWhhdmlvclByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEpQQUVkaXRvclRvb2xCZWhhdmlvclByb3ZpZGVyKGR0cCwgZmFjYWRlKTsKLSAgICAgIAotCQlJRG91YmxlQ2xpY2tDb250ZXh0IGNvbnRleHQgPSByZXBsYXlEb3VibGVDbGlja0NvbnRleHQocGUpOwotCQlwcm92aWRlci5nZXREb3VibGVDbGlja0ZlYXR1cmUoY29udGV4dCk7Ci0JCXZlcmlmeShpZGUpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVDbGlja09uSnBhRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24gewotCQlQaWN0b2dyYW1FbGVtZW50IHBlID0gcmVwbGF5UGljdG9ncmFtRWxlbWVudCgxMDAsIDEwMCk7Ci0JCUlGaWxlIGZpbGUgPSByZXBsYXlSZXNvdXJjZSgpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSByZXBsYXlKcGEocGUsIGZpbGUpOwotCQlJRGlhZ3JhbVR5cGVQcm92aWRlciBkdHAgPSByZXBsYXlEaWFncmFtUHJvdmlkZXJGb3JKcGEocGUsIGpwYSk7Ci0JCQotCQlJRWNsaXBzZUZhY2FkZSBlY2xpcHNlRmFjYWRlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRWNsaXBzZUZhY2FkZS5jbGFzcyk7Ci0JCUlTdGF0aWNJREUgaWRlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJU3RhdGljSURFLmNsYXNzKTsKLQkJZXhwZWN0KGVjbGlwc2VGYWNhZGUuZ2V0SURFKCkpLmFuZFN0dWJSZXR1cm4oaWRlKTsKLQkJaWRlLm9wZW5FZGl0b3IoZmlsZSk7Ci0JCXJlcGxheShlY2xpcHNlRmFjYWRlLCBpZGUpOwotCQlJVG9vbEJlaGF2aW9yUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSlBBRWRpdG9yVG9vbEJlaGF2aW9yUHJvdmlkZXIoZHRwLCBlY2xpcHNlRmFjYWRlKTsKLQkJCi0JCUlEb3VibGVDbGlja0NvbnRleHQgY29udGV4dCA9IHJlcGxheURvdWJsZUNsaWNrQ29udGV4dChwZSk7Ci0JCXByb3ZpZGVyLmdldERvdWJsZUNsaWNrRmVhdHVyZShjb250ZXh0KTsKLQkJdmVyaWZ5KGlkZSk7Ci0JfQotCQotCXByaXZhdGUgSURpYWdyYW1UeXBlUHJvdmlkZXIgcmVwbGF5RGlhZ3JhbVByb3ZpZGVyKFBpY3RvZ3JhbUVsZW1lbnQgcGUsIEphdmFQZXJzaXN0ZW50VHlwZSBqcHQpIHsKLQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSkpLmFuZFN0dWJSZXR1cm4oanB0KTsKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlhZ3JhbVR5cGVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChkdHAuZ2V0RmVhdHVyZVByb3ZpZGVyKCkpLmFuZFN0dWJSZXR1cm4oZmVhdHVyZVByb3ZpZGVyKTsKLQkJcmVwbGF5KGR0cCwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJcmV0dXJuIGR0cDsKLQl9Ci0KLQlwcml2YXRlIElNYXJrZXIgcmVwbGF5TWFya2VyKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSU1hcmtlciBtYXJrZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElNYXJrZXIuY2xhc3MpOwotCQlleHBlY3QobWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZKSkuYW5kU3R1YlJldHVybihzZXZlcml0eSk7Ci0JCWV4cGVjdChtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSkpLmFuZFN0dWJSZXR1cm4obWVzc2FnZSk7Ci0JCXJlcGxheShtYXJrZXIpOwotCQlyZXR1cm4gbWFya2VyOwotCX0KLQotCXByaXZhdGUgSmF2YVBlcnNpc3RlbnRUeXBlIHJlcGxheUpwdFdpdGhNYXJrZXIoSU1hcmtlcltdIG1hcmtlcnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKTsKLQkJSUZpbGUgZmlsZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUZpbGUuY2xhc3MpOwotCQlleHBlY3QoZmlsZS5leGlzdHMoKSkuYW5kUmV0dXJuKHRydWUpOwotCQlleHBlY3QoZmlsZS5maW5kTWFya2VycyhudWxsLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUpKS5hbmRTdHViUmV0dXJuKG1hcmtlcnMpOwotCQlleHBlY3QoanB0LmdldFJlc291cmNlKCkpLmFuZFN0dWJSZXR1cm4oZmlsZSk7Ci0JCXJlcGxheShmaWxlLCBqcHQpOwotCQlyZXR1cm4ganB0OwotCX0KLQkKLQlwcml2YXRlIElGaWxlIHJlcGxheVJlc291cmNlKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJRmlsZSBmaWxlID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRmlsZS5jbGFzcyk7Ci0JCWZpbGUuc2V0U2Vzc2lvblByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKG51bGwsIEpQQUVkaXRvck1hdGNoaW5nU3RyYXRlZ3kuRE9VQkxFX0NMSUNLKSwgInRydWUiKTsKLQkJRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hc1N0dWIoKTsKLQkJZXhwZWN0KGZpbGUuZ2V0VHlwZSgpKS5hbmRTdHViUmV0dXJuKElSZXNvdXJjZS5GSUxFKTsKLQkJcmVwbGF5KGZpbGUpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JCi0JcHJpdmF0ZSBJRG91YmxlQ2xpY2tDb250ZXh0IHJlcGxheURvdWJsZUNsaWNrQ29udGV4dChQaWN0b2dyYW1FbGVtZW50IHBlKXsKLQkJSURvdWJsZUNsaWNrQ29udGV4dCBjb250ZXh0ID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRG91YmxlQ2xpY2tDb250ZXh0LmNsYXNzKTsKLQkJZXhwZWN0KGNvbnRleHQuZ2V0UGljdG9ncmFtRWxlbWVudHMoKSkuYW5kU3R1YlJldHVybihuZXcgUGljdG9ncmFtRWxlbWVudFtdIHtwZX0pOwotCQlyZXBsYXkoY29udGV4dCk7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQkKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50VHlwZSByZXBsYXlKcHQoUGljdG9ncmFtRWxlbWVudCBwZSwgSUZpbGUgZmlsZSl7Ci0JCUlGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIGpwdCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpKS5hbmRTdHViUmV0dXJuKGpwdCk7Ci0JCWV4cGVjdChqcHQuZ2V0UmVzb3VyY2UoKSkuYW5kUmV0dXJuKGZpbGUpOwotCQlyZXBsYXkoanB0LCBmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXR1cm4ganB0OwotCX0KLQkKLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHJlcGxheUpwYShQaWN0b2dyYW1FbGVtZW50IHBlLCBJRmlsZSBmaWxlKXsKLQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEphdmFQZXJzaXN0ZW50QXR0cmlidXRlLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQocGUpKS5hbmRTdHViUmV0dXJuKGpwYSk7Ci0JCWV4cGVjdChqcGEuZ2V0UmVzb3VyY2UoKSkuYW5kUmV0dXJuKGZpbGUpOwotCQlyZXBsYXkoanBhLCBmZWF0dXJlUHJvdmlkZXIpOwotCQlyZXR1cm4ganBhOwotCX0KLQkKLQlwcml2YXRlIElEaWFncmFtVHlwZVByb3ZpZGVyIHJlcGxheURpYWdyYW1Qcm92aWRlckZvckpwYShQaWN0b2dyYW1FbGVtZW50IHBlLCBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBqcGEpIHsKLQkJSUZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChwZSkpLmFuZFN0dWJSZXR1cm4oanBhKTsKLQkJSURpYWdyYW1UeXBlUHJvdmlkZXIgZHRwID0gRWFzeU1vY2suY3JlYXRlTW9jayhJRGlhZ3JhbVR5cGVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChkdHAuZ2V0RmVhdHVyZVByb3ZpZGVyKCkpLmFuZFN0dWJSZXR1cm4oZmVhdHVyZVByb3ZpZGVyKTsKLQkJcmVwbGF5KGR0cCwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJcmV0dXJuIGR0cDsKLQl9Ci0KLQlwcml2YXRlIFBpY3RvZ3JhbUVsZW1lbnQgcmVwbGF5UGljdG9ncmFtRWxlbWVudChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLQkJUGljdG9ncmFtRWxlbWVudCBwZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soUGljdG9ncmFtRWxlbWVudC5jbGFzcyk7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGFsZ28gPSBFYXN5TW9jay5jcmVhdGVNb2NrKEdyYXBoaWNzQWxnb3JpdGhtLmNsYXNzKTsKLQkJZXhwZWN0KGFsZ28uZ2V0V2lkdGgoKSkuYW5kU3R1YlJldHVybih3aWR0aCk7Ci0JCWV4cGVjdChhbGdvLmdldEhlaWdodCgpKS5hbmRTdHViUmV0dXJuKGhlaWdodCk7Ci0JCWV4cGVjdChwZS5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKGFsZ28pOwotCQlyZXBsYXkocGUsIGFsZ28pOwotCQlyZXR1cm4gcGU7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9yZWxhdGlvbi9DcmVhdGVSZWxhdGlvbkF0dHJpYnV0ZXNUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uQXR0cmlidXRlc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE1MzEyYy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uQXR0cmlidXRlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucmVsYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb01hbnlNYXBwaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YU1hbnlUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhT25lVG9NYW55TWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFPbmVUb09uZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIENyZWF0ZVJlbGF0aW9uQXR0cmlidXRlc1Rlc3QgewotCQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUlFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUgPSBudWxsOwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJSUZpbGUgZW50aXR5ID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudGl0eTEiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKGdldFBlcnNpc3RlbnRUeXBlKGVudGl0eSkpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpLmFuZFJldHVybihKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eSkpLmFueVRpbWVzKCk7Ci0JCXJlcGxheShmZWF0dXJlUHJvdmlkZXIpOwotCX0KLQkJCi0JcHVibGljIHN0YXRpYyBQZXJzaXN0ZW50VHlwZSBnZXRQZXJzaXN0ZW50VHlwZShJRmlsZSBmaWxlKXsKLQkJSnBhRmlsZSBqcGFGaWxlID0gSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFGaWxlKGZpbGUpOwotCQlmb3IgKEpwYVN0cnVjdHVyZU5vZGUgbm9kZSA6IGdldFJvb3ROb2RlcyhqcGFGaWxlKSkgewotCQkJUGVyc2lzdGVudFR5cGUgZW50aXR5ID0gKFBlcnNpc3RlbnRUeXBlKSBub2RlOwotCQkJcmV0dXJuIGVudGl0eTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9CQotCQotCXByaXZhdGUgc3RhdGljIEl0ZXJhYmxlPEpwYVN0cnVjdHVyZU5vZGU+IGdldFJvb3ROb2RlcyhKcGFGaWxlIGpwYUZpbGUpIHsKLQkJaWYoanBhRmlsZSA9PSBudWxsKXsKLQkJCXJldHVybiBFbXB0eUl0ZXJhYmxlLmluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGpwYUZpbGUuZ2V0Um9vdFN0cnVjdHVyZU5vZGVzKCk7Ci0JfQotCQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oSUZpbGUgZmlsZSkgewotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShmaWxlKTsKLQkJaWYgKCFjdS5pc1dvcmtpbmdDb3B5KCkpCi0JCQl0cnkgewotCQkJCWN1LmJlY29tZVdvcmtpbmdDb3B5KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfSBjYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQlyZXR1cm4gY3U7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZEFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCS8vanBhUHJvamVjdC5zZXRVcGRhdGVyKG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKGpwYVByb2plY3QpKTsKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpLmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJhYmMifSwgIkN1c3RvbWVyIik7CQotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiYWJjIn0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImFiYy5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJhYmMuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLSAKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgYXR0ciA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLgotCQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpdDEsIChKYXZhUGVyc2lzdGVudFR5cGUpdDIsICJhZGQiLCAiYWRkIiwgZmFsc2UsIAotCQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpLAotCQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShhZGRyZXNzRmlsZSkpOwotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJUGVyc2lzdGVuY2VVbml0IHB1ID0ganBhUHJvamVjdC5nZXRSb290Q29udGV4dE5vZGUoKS5nZXRQZXJzaXN0ZW5jZVhtbCgpLmdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQl0MSA9IHB1LmdldFBlcnNpc3RlbnRUeXBlKCJhYmMuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChhdHRyKTsJCQkKLQotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpdDEsIChKYXZhUGVyc2lzdGVudFR5cGUpdDIsICJhZGRyZXNzIiwgImFkZHJlc3MiLCBmYWxzZSwgCQkJCQkJCi0JCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyKTsKLQkJCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRPbmVUb09uZVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCBhdHRyKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHB0ID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAocHQgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwdC5yZXNvbHZlQXR0cmlidXRlKCJhZGRyZXNzIik7CQotCQlhc3NlcnROb3ROdWxsKGNQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQotCX0JCi0JCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZE9uZVRvT25lQmlkaXJlY3Rpb25hbFJlbGF0aW9uQXR0cmlidXRlcygpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgY3JlZGl0Q2FyZEZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkNyZWRpdENhcmQiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoY3JlZGl0Q2FyZEZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3JlZGl0Q2FyZFR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5DcmVkaXRDYXJkIik7Ci0JCWFzc2VydE5vdE51bGwoY3JlZGl0Q2FyZEZpbGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcmVkaXRDYXJkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcmVkaXRDYXJkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZSggZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQyLCAiY3JlZGl0Q2FyZCIsICJjcmVkaXRDYXJkIiwgZmFsc2UsCi0JCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChhdHRyKTsKLQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhdHRyMiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLgotCQkJYWRkQXR0cmlidXRlKGZlYXR1cmVQcm92aWRlciwgKEphdmFQZXJzaXN0ZW50VHlwZSl0MiwgKEphdmFQZXJzaXN0ZW50VHlwZSl0MSwgImN1c3RvbWVyIiwgImN1c3RvbWVyIiwgZmFsc2UsIAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSwKLQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwoYXR0cjIpOwotCQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkT25lVG9PbmVCaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCBhdHRyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQyLCBhdHRyMik7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBvd25lclBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAob3duZXJQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCW93bmVyUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvd25lclBlcnNpc3RlbnRUeXBlLnJlc29sdmVBdHRyaWJ1dGUoImNyZWRpdENhcmQiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlhc3NlcnRUcnVlKG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgb3duZXJTaWRlTWFwcGluZyA9IG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUob3duZXJTaWRlTWFwcGluZyBpbnN0YW5jZW9mIEphdmFPbmVUb09uZU1hcHBpbmcpOyAKLQkJCi0JCWFzc2VydFRydWUoKChKYXZhT25lVG9PbmVNYXBwaW5nKW93bmVyU2lkZU1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBpbnZlcnNlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3JlZGl0Q2FyZFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKGludmVyc2VQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWludmVyc2VQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcmVkaXRDYXJkVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpbnZlcnNlUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWFzc2VydFRydWUoaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIGludmVyc2VTaWRlTWFwcGluZyA9IGludmVyc2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShpbnZlcnNlU2lkZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhT25lVG9PbmVNYXBwaW5nKTsgCi0JCQotCQlhc3NlcnRGYWxzZSgoKEphdmFPbmVUb09uZU1hcHBpbmcpaW52ZXJzZVNpZGVNYXBwaW5nKS5pc1JlbGF0aW9uc2hpcE93bmVyKCkpOwotCX0JCi0JCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkT25lVG9NYW55VW5pZGlyZWN0aW9uYWxSZWxhdGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIHBob25lRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiUGhvbmUiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUocGhvbmVGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHBob25lVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlBob25lIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcGhvbmVUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHBob25lVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGF0dHIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQyLCAicGhvbmVzIiwgInBob25lcyIsIHRydWUsIAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpLAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQyLmdldFJlc291cmNlKCkpKTsJCQotCQlhc3NlcnROb3ROdWxsKGF0dHIpOwotCQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE9uZVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXQxLCBhdHRyLCBmYWxzZSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHB0ID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcGhvbmVUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBjUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHB0LnJlc29sdmVBdHRyaWJ1dGUoInBob25lcyIpOwkJCi0JCWFzc2VydE5vdE51bGwoY1BlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gY1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnROb3ROdWxsKG1hcHBpbmcpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhT25lVG9NYW55TWFwcGluZyk7IAotCQkKLQkJYXNzZXJ0VHJ1ZSgoKEphdmFPbmVUb01hbnlNYXBwaW5nKW1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JfQkKLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRPbmVUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjcnVpc2VGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJDcnVpc2UiKTsJCQotCQlJRmlsZSByZXNlcnZhdGlvbkZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIlJlc2VydmF0aW9uIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGNydWlzZUZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3J1aXNlVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkNydWlzZSIpOwotCQlhc3NlcnROb3ROdWxsKGNydWlzZVR5cGUpOwotCQkKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcnVpc2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlIChzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKHJlc2VydmF0aW9uRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSByZXNlcnZhdGlvblR5cGU9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlJlc2VydmF0aW9uIik7Ci0JCWFzc2VydE5vdE51bGwocmVzZXJ2YXRpb25GaWxlKTsKLQotCQkKLQkJUGVyc2lzdGVudFR5cGUgbWFueVNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKG1hbnlTaWRlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQltYW55U2lkZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHJlc2VydmF0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIHNpbmdsZVNpZGVBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUsICJyZXNlcnZhdGlvbnMiLCAicmVzZXJ2YXRpb25zIiwgdHJ1ZSwgCi0JCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpLAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwoc2luZ2xlU2lkZUF0dHJpYnV0ZSk7Ci0KLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgbWFueVNpZGVBdHRyaWJ1dGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS4KLQkJCWFkZEF0dHJpYnV0ZShmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpbWFueVNpZGVQZXJzaXN0ZW50VHlwZSwgKEphdmFQZXJzaXN0ZW50VHlwZSlzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUsICJjcnVpc2UiLCAiY3J1aXNlIiwgZmFsc2UsIAotCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSksCi0JCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpKTsJCQotCQlhc3NlcnROb3ROdWxsKG1hbnlTaWRlQXR0cmlidXRlKTsKLQkJCi0JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmFkZE9uZVRvTWFueUJpZGlyZWN0aW9uYWxSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpc2luZ2xlU2lkZVBlcnNpc3RlbnRUeXBlLCBzaW5nbGVTaWRlQXR0cmlidXRlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKW1hbnlTaWRlUGVyc2lzdGVudFR5cGUsIG1hbnlTaWRlQXR0cmlidXRlLCBmYWxzZSk7Ci0JCQotCQkvLyBJbiBvbmUtdG8tbWFueSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uIG1hbnkgc2lkZSBpcyBBTFdBWVMgb3duZXIKLQkJUGVyc2lzdGVudFR5cGUgaW52ZXJzZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGNydWlzZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKGludmVyc2VQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWludmVyc2VQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjcnVpc2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZSA9IGludmVyc2VQZXJzaXN0ZW50VHlwZS5yZXNvbHZlQXR0cmlidXRlKCJyZXNlcnZhdGlvbnMiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWFzc2VydFRydWUoaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIGludmVyc2VTaWRlTWFwcGluZyA9IGludmVyc2VQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJYXNzZXJ0VHJ1ZShpbnZlcnNlU2lkZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhT25lVG9NYW55TWFwcGluZyk7IAotCQkKLQkJYXNzZXJ0RmFsc2UoKChKYXZhT25lVG9NYW55TWFwcGluZylpbnZlcnNlU2lkZU1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JCQotCQkvLyBJbiBvbmUtdG8tbWFueSBiaWRpcmVjdGlvbmFsIHJlbGF0aW9uIG1hbnkgc2lkZSBpcyBBTFdBWVMgb3duZXIKLQkJUGVyc2lzdGVudFR5cGUgb3duZXJQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKG93bmVyUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgJiYgKGMgPCA1MCkpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJb3duZXJQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWMrKzsKLQkJfQotCQlhc3NlcnROb3ROdWxsKG93bmVyUGVyc2lzdGVudFR5cGUpOwotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG93bmVyUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY3J1aXNlIik7Ci0JCWMgPSAwOwotCQl3aGlsZSAoKG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSA9PSBudWxsKSAmJiAoYyA8IDUwKSkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBvd25lclBlcnNpc3RlbnRUeXBlLnJlc29sdmVBdHRyaWJ1dGUoImNydWlzZSIpOwotCQkJYysrOwotCQl9CQkKLQkJCi0JCWFzc2VydE5vdE51bGwob3duZXJQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJYXNzZXJ0VHJ1ZShvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIG93bmVyU2lkZU1hcHBpbmcgPSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQljID0gMDsKLQkJd2hpbGUgKChvd25lclNpZGVNYXBwaW5nID09IG51bGwpICYmIChjIDwgNTApKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCW93bmVyU2lkZU1hcHBpbmcgPSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQkJYysrOwotCQl9CQotCQlpZiAob3duZXJTaWRlTWFwcGluZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhc3NlcnROb3ROdWxsKCJvd25lclNpZGVNYXBwaW5nIG11c3Qgbm90IGJlIG51bGwiLCBvd25lclNpZGVNYXBwaW5nKTsKLQkJYXNzZXJ0VHJ1ZSgib3duZXJTaWRlTWFwcGluZyBjbGFzcyBpcyAiICsgb3duZXJTaWRlTWFwcGluZy5nZXRDbGFzcygpLmdldE5hbWUoKSwgSmF2YU1hbnlUb09uZU1hcHBpbmcuY2xhc3MuaXNJbnN0YW5jZShvd25lclNpZGVNYXBwaW5nKSk7Ci0JCQotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcpb3duZXJTaWRlTWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQl9CQotCi0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0QWRkTWFueVRvT25lVW5pZGlyZWN0aW9uYWxSZWxhdGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGNydWlzZUZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkNydWlzZSIpOwotCQlJRmlsZSBzaGlwRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiU2hpcCIpOwotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGNydWlzZUZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3J1aXNlVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkNydWlzZSIpOwotCQlhc3NlcnROb3ROdWxsKGNydWlzZVR5cGUpOwotCQkJCi0JCVBlcnNpc3RlbnRUeXBlIG1hbnlTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAobWFueVNpZGVQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCW1hbnlTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKHNoaXBGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHNoaXBUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uU2hpcCIpOwotCQlhc3NlcnROb3ROdWxsKGNydWlzZVR5cGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSBzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgc2hpcFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBzaGlwVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0gCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG1hcHBlZEF0dHJpYnV0ZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLgotCQkJYWRkQXR0cmlidXRlKGZlYXR1cmVQcm92aWRlciwgKEphdmFQZXJzaXN0ZW50VHlwZSltYW55U2lkZVBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXNpbmdsZVNpZGVQZXJzaXN0ZW50VHlwZSwgInNoaXAiLCAic2hpcCIsIHRydWUsIAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSltYW55U2lkZVBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSlzaW5nbGVTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwobWFwcGVkQXR0cmlidXRlKTsKLQkJCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRNYW55VG9PbmVVbmlkaXJlY3Rpb25hbFJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgKEphdmFQZXJzaXN0ZW50VHlwZSltYW55U2lkZVBlcnNpc3RlbnRUeXBlLCBtYXBwZWRBdHRyaWJ1dGUpOwotCQkKLQkJUGVyc2lzdGVudFR5cGUgcHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3J1aXNlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAocHQgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlwdCA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBzaGlwVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgY1BlcnNpc3RlbnRBdHRyaWJ1dGUgPSBwdC5yZXNvbHZlQXR0cmlidXRlKCJzaGlwIik7CQotCQlpbnQgY250ID0gMDsKLQkJd2hpbGUgKChjUGVyc2lzdGVudEF0dHJpYnV0ZSA9PSBudWxsKSAmJiAoY250IDwgMTAwKSkgewotCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQljUGVyc2lzdGVudEF0dHJpYnV0ZSA9IHB0LnJlc29sdmVBdHRyaWJ1dGUoInNoaXAiKTsJCi0JCQljbnQrKzsKLQkJfQkJCi0JCWFzc2VydE5vdE51bGwoY1BlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBtYXBwaW5nID0gY1BlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQljbnQgPSAwOwotCQl3aGlsZSAoKG1hcHBpbmcgPT0gbnVsbCkgJiYgKGNudCA8IDEwMCkpIHsKLQkJCVRocmVhZC5zbGVlcCgyNTApOwotCQkJbWFwcGluZyA9IGNQZXJzaXN0ZW50QXR0cmlidXRlLmdldE1hcHBpbmcoKTsKLQkJCWNudCsrOwotCQl9Ci0JCWFzc2VydE5vdE51bGwobWFwcGluZyk7Ci0JCWFzc2VydFRydWUobWFwcGluZyBpbnN0YW5jZW9mIEphdmFNYW55VG9PbmVNYXBwaW5nKTsgCi0JCQotCQlhc3NlcnRUcnVlKCgoSmF2YU1hbnlUb09uZU1hcHBpbmcpbWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQl9CQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEFkZE1hbnlUb01hbnlCaWRpcmVjdGlvbmFsUmVsYXRpb25BdHRyaWJ1dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSByZXNlcnZhdGlvbkZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIlJlc2VydmF0aW9uIik7Ci0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUocmVzZXJ2YXRpb25GaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIHJlc2VydmF0aW9uVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlJlc2VydmF0aW9uIik7Ci0JCWFzc2VydE5vdE51bGwocmVzZXJ2YXRpb25UeXBlKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIG93bmVyU2lkZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHJlc2VydmF0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAob3duZXJTaWRlUGVyc2lzdGVudFR5cGUgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQlvd25lclNpZGVQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lckZpbGUpOwotCi0JCQotCQlQZXJzaXN0ZW50VHlwZSBpbnZlcnNlU2lkZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAoaW52ZXJzZVNpZGVQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLSAKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJTaWRlQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuCi0JCQlhZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKW93bmVyU2lkZVBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUsICJjdXN0b21lcnMiLCAiY3VzdG9tZXJzIiwgdHJ1ZSwKLQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpb3duZXJTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSksCi0JCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUuZ2V0UmVzb3VyY2UoKSkpOwkJCi0JCWFzc2VydE5vdE51bGwob3duZXJTaWRlQXR0cmlidXRlKTsKLQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlU2lkZUF0dHJpYnV0ZXMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5hZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWludmVyc2VTaWRlUGVyc2lzdGVudFR5cGUsIChKYXZhUGVyc2lzdGVudFR5cGUpb3duZXJTaWRlUGVyc2lzdGVudFR5cGUsICJyZXNlcnZhdGlvbnMiLCAicmVzZXJ2YXRpb25zIiwgdHJ1ZSwgCi0JCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpaW52ZXJzZVNpZGVQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZSgpKSwKLQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSlvd25lclNpZGVQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZSgpKSk7CQkKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlU2lkZUF0dHJpYnV0ZXMpOwotCQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvTWFueUJpZGlyZWN0aW9uYWxSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIChKYXZhUGVyc2lzdGVudFR5cGUpb3duZXJTaWRlUGVyc2lzdGVudFR5cGUsIG93bmVyU2lkZUF0dHJpYnV0ZSwgKEphdmFQZXJzaXN0ZW50VHlwZSlpbnZlcnNlU2lkZVBlcnNpc3RlbnRUeXBlLCBpbnZlcnNlU2lkZUF0dHJpYnV0ZXMsIGZhbHNlKTsKLQkJCi0JCVBlcnNpc3RlbnRUeXBlIG93bmVyUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcmVzZXJ2YXRpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlIChvd25lclBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJb3duZXJQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJUmVhZE9ubHlQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyUGVyc2lzdGVudEF0dHJpYnV0ZSA9IG93bmVyUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY3VzdG9tZXJzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJYXNzZXJ0VHJ1ZShvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUgaW5zdGFuY2VvZiBKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCQotCQlBdHRyaWJ1dGVNYXBwaW5nIG93bmVyU2lkZU1hcHBpbmcgPSBvd25lclBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKG93bmVyU2lkZU1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhTWFueVRvTWFueU1hcHBpbmcpOyAKLQkJCi0JCWFzc2VydFRydWUoKChKYXZhTWFueVRvTWFueU1hcHBpbmcpb3duZXJTaWRlTWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQkKLQkJUGVyc2lzdGVudFR5cGUgaW52ZXJzZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAoaW52ZXJzZVBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJaW52ZXJzZVBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlSZWFkT25seVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUgPSBpbnZlcnNlUGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgicmVzZXJ2YXRpb25zIik7Ci0JCWFzc2VydE5vdE51bGwoaW52ZXJzZVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQlhc3NlcnRUcnVlKGludmVyc2VQZXJzaXN0ZW50QXR0cmlidXRlIGluc3RhbmNlb2YgSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUpOwotCQkKLQkJQXR0cmlidXRlTWFwcGluZyBpbnZlcnNlU2lkZU1hcHBpbmcgPSBpbnZlcnNlUGVyc2lzdGVudEF0dHJpYnV0ZS5nZXRNYXBwaW5nKCk7Ci0JCWFzc2VydFRydWUoaW52ZXJzZVNpZGVNYXBwaW5nIGluc3RhbmNlb2YgSmF2YU1hbnlUb01hbnlNYXBwaW5nKTsgCi0JCQotCQlhc3NlcnRGYWxzZSgoKEphdmFNYW55VG9NYW55TWFwcGluZylpbnZlcnNlU2lkZU1hcHBpbmcpLmlzUmVsYXRpb25zaGlwT3duZXIoKSk7Ci0JfQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBZGRNYW55VG9NYW55VW5pZGlyZWN0aW9uYWxSZWxhdGlvbkF0dHJpYnV0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIHJlc2VydmF0aW9uRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiUmVzZXJ2YXRpb24iKTsKLQkJSUZpbGUgY2FiaW5GaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJDYWJpbiIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShyZXNlcnZhdGlvbkZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcmVzZXJ2YXRpb25UeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uUmVzZXJ2YXRpb24iKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXNlcnZhdGlvblR5cGUpOwotCQkKLQkJUGVyc2lzdGVudFR5cGUgYW5ub3RhdGVkUGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcmVzZXJ2YXRpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlIChhbm5vdGF0ZWRQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCWFubm90YXRlZFBlcnNpc3RlbnRUeXBlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIHJlc2VydmF0aW9uVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGNhYmluRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjYWJpblR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5DYWJpbiIpOwotCQlhc3NlcnROb3ROdWxsKGNhYmluRmlsZSk7Ci0KLQkJCi0JCVBlcnNpc3RlbnRUeXBlIHJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjYWJpblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjYWJpblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotIAotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBhbm5vdGF0ZWRTaWRlQXR0cmlidXRlID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuCi0JCQlhZGRBdHRyaWJ1dGUoZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWFubm90YXRlZFBlcnNpc3RlbnRUeXBlLCAoSmF2YVBlcnNpc3RlbnRUeXBlKXJlZmVyZW5jZWRQZXJzaXN0ZW50VHlwZSwgImNhYmlucyIsICJjYWJpbnMiLCB0cnVlLAotCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSlhbm5vdGF0ZWRQZXJzaXN0ZW50VHlwZS5nZXRSZXNvdXJjZSgpKSwKLQkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpcmVmZXJlbmNlZFBlcnNpc3RlbnRUeXBlLmdldFJlc291cmNlKCkpKTsJCQotCQlhc3NlcnROb3ROdWxsKGFubm90YXRlZFNpZGVBdHRyaWJ1dGUpOwotCQkKLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuYWRkTWFueVRvTWFueVVuaWRpcmVjdGlvbmFsUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCAoSmF2YVBlcnNpc3RlbnRUeXBlKWFubm90YXRlZFBlcnNpc3RlbnRUeXBlLCBhbm5vdGF0ZWRTaWRlQXR0cmlidXRlLCBmYWxzZSk7Ci0JCQotCQlQZXJzaXN0ZW50VHlwZSBwZXJzaXN0ZW50VHlwZSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCByZXNlcnZhdGlvblR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHBlcnNpc3RlbnRUeXBlID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJcGVyc2lzdGVudFR5cGUgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcmVzZXJ2YXRpb25UeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCVJlYWRPbmx5UGVyc2lzdGVudEF0dHJpYnV0ZSBwZXJzaXN0ZW50QXR0cmlidXRlID0gcGVyc2lzdGVudFR5cGUucmVzb2x2ZUF0dHJpYnV0ZSgiY2FiaW5zIik7Ci0JCWFzc2VydE5vdE51bGwocGVyc2lzdGVudEF0dHJpYnV0ZSk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVudEF0dHJpYnV0ZSBpbnN0YW5jZW9mIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlKTsKLQkJCi0JCUF0dHJpYnV0ZU1hcHBpbmcgbWFwcGluZyA9IHBlcnNpc3RlbnRBdHRyaWJ1dGUuZ2V0TWFwcGluZygpOwotCQlhc3NlcnRUcnVlKG1hcHBpbmcgaW5zdGFuY2VvZiBKYXZhTWFueVRvTWFueU1hcHBpbmcpOyAKLQkJCi0JCWFzc2VydFRydWUoKChKYXZhTWFueVRvTWFueU1hcHBpbmcpbWFwcGluZykuaXNSZWxhdGlvbnNoaXBPd25lcigpKTsKLQkJfQkKLQkKLQotCQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC9yZWxhdGlvbi9DcmVhdGVSZWxhdGlvbnNJbkZpZWxkQW5ub3RhdGVkRW50aXRpZXNUZXN0LmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uc0luRmllbGRBbm5vdGF0ZWRFbnRpdGllc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJhZDJmNC4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uc0luRmllbGRBbm5vdGF0ZWRFbnRpdGllc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTEgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBTdGVmYW4gRGltb3YgLSBpbml0aWFsIEFQSSwgaW1wbGVtZW50YXRpb24gYW5kIGRvY3VtZW50YXRpb24KLSAqCi0gKiA8L2NvcHlyaWdodD4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwucmVsYXRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1wdWJsaWMgY2xhc3MgQ3JlYXRlUmVsYXRpb25zSW5GaWVsZEFubm90YXRlZEVudGl0aWVzVGVzdCB7Ci0KLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgZmVhdHVyZVByb3ZpZGVyOwotCWZpbmFsIFN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlJRWNsaXBzZUZhY2FkZSBlY2xpcHNlRmFjYWRlID0gbnVsbDsKLQkKLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQkJanBhUHJvamVjdCA9IGZhY3RvcnkuY3JlYXRlSlBBUHJvamVjdChURVNUX1BST0pFQ1QgKyAiXyIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCUlGaWxlIGVudGl0eSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5KGpwYVByb2plY3QsICJvcmcuZWNsaXBzZS5FbnRpdHkxIik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmVhdHVyZVByb3ZpZGVyID0gRWFzeU1vY2suY3JlYXRlTW9jayhJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyLmNsYXNzKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQobnVsbCkpLmFuZFJldHVybihnZXRQZXJzaXN0ZW50VHlwZShlbnRpdHkpKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQoaXNBKEphdmFQZXJzaXN0ZW50VHlwZS5jbGFzcykpKS5hbmRSZXR1cm4oSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbnRpdHkpKS5hbnlUaW1lcygpOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoSUZpbGUgZmlsZSl7Ci0JCUpwYUZpbGUganBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIG5vZGU6IGdldFJvb3ROb2RlcyhqcGFGaWxlKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGVudGl0eSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG5vZGU7Ci0JCQlyZXR1cm4gZW50aXR5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8SnBhU3RydWN0dXJlTm9kZT4gZ2V0Um9vdE5vZGVzKEpwYUZpbGUganBhRmlsZSkgewotCQlpZihqcGFGaWxlID09IG51bGwpewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4ganBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKTsKLQl9Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0KLQkKLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVRvT25lVW5pZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0MS5nZXRSZXNvdXJjZSgpKTsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgT25lVG9PbmVVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCVNldDxTdHJpbmc+IGFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG93bmVyQXQpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmNvbnRhaW5zKCJPbmVUb09uZSIpKTsKLQkJYXNzZXJ0TnVsbCgoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilvd25lckF0LmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7CQkKLQkJCi0JCWFzc2VydFRydWUoY3UxLmlzV29ya2luZ0NvcHkoKSk7Ci0JCUlUeXBlIGphdmFUeXBlID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJRmllbGQgZiA9IGphdmFUeXBlLmdldEZpZWxkKCJhZGRyZXNzIik7Ci0JCWFzc2VydFRydWUoZi5leGlzdHMoKSk7Ci0JCQkJCi0JfQotCQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb09uZUJpZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0MS5nZXRSZXNvdXJjZSgpKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKTsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgT25lVG9PbmVCaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsICJjdXN0b21lciIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCVNldDxTdHJpbmc+IGFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG93bmVyQXQpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmNvbnRhaW5zKCJPbmVUb09uZSIpKTsKLQkJYXNzZXJ0TnVsbCgoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilvd25lckF0LmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQXQgPSB0Mi5nZXRBdHRyaWJ1dGVOYW1lZCgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlQXQpOwotCQlhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25OYW1lcyhpbnZlcnNlQXQpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmNvbnRhaW5zKCJPbmVUb09uZSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24paW52ZXJzZUF0LmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShjdTEuaXNXb3JraW5nQ29weSgpKTsKLQkJYXNzZXJ0VHJ1ZShjdTIuaXNXb3JraW5nQ29weSgpKTsKLQkJCi0JCUlUeXBlIGphdmFUeXBlMSA9IGN1MS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSUZpZWxkIGYxID0gamF2YVR5cGUxLmdldEZpZWxkKCJhZGRyZXNzIik7Ci0JCWFzc2VydFRydWUoZjEuZXhpc3RzKCkpOwotCQlJVHlwZSBqYXZhVHlwZTIgPSBjdTIuZmluZFByaW1hcnlUeXBlKCk7Ci0JCUlGaWVsZCBmMiA9IGphdmFUeXBlMi5nZXRGaWVsZCgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0VHJ1ZShmMi5leGlzdHMoKSk7CQkKLQkJCQkKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT25lVG9NYW55VW5pZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIkFkZHJlc3MiKTsKLQkJCi0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0MS5nZXRSZXNvdXJjZSgpKTsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgT25lVG9NYW55VW5pRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDIuZ2V0UmVzb3VyY2UoKSkpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25OYW1lcyhvd25lckF0KTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5jb250YWlucygiT25lVG9NYW55IikpOwotCQlhc3NlcnROdWxsKCgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW93bmVyQXQuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsJCi0JCQotCQlhc3NlcnRUcnVlKGN1MS5pc1dvcmtpbmdDb3B5KCkpOwotCQkKLQkJSVR5cGUgamF2YVR5cGUxID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJRmllbGQgZjEgPSBqYXZhVHlwZTEuZ2V0RmllbGQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0VHJ1ZShmMS5leGlzdHMoKSk7Ci0JCi0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1hbnlUb09uZVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCQotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0KLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSk7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb09uZVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQyLmdldFJlc291cmNlKCkpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMob3duZXJBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk1hbnlUb09uZSIpKTsKLQkJCi0JCWFzc2VydFRydWUoY3UxLmlzV29ya2luZ0NvcHkoKSk7Ci0JCQotCQlJVHlwZSBqYXZhVHlwZTEgPSBjdTEuZmluZFByaW1hcnlUeXBlKCk7Ci0JCUlGaWVsZCBmMSA9IGphdmFUeXBlMS5nZXRGaWVsZCgiYWRkcmVzcyIpOwotCQlhc3NlcnRUcnVlKGYxLmV4aXN0cygpKTsJCi0JCQotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYW55VG9PbmVCaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCQotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0KLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDIuZ2V0UmVzb3VyY2UoKSk7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb09uZUJpRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwgImN1c3RvbWVyIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJU2V0PFN0cmluZz4gYW5ub3RhdGlvbnMgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRBbm5vdGF0aW9uTmFtZXMob3duZXJBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk1hbnlUb09uZSIpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBdCA9IHQyLmdldEF0dHJpYnV0ZU5hbWVkKCJjdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGludmVyc2VBdCk7Ci0JCWFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKGludmVyc2VBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk9uZVRvTWFueSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgKChPd25hYmxlUmVsYXRpb25zaGlwTWFwcGluZ0Fubm90YXRpb24paW52ZXJzZUF0LmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1MS5pc1dvcmtpbmdDb3B5KCkpOwotCQlhc3NlcnRUcnVlKGN1Mi5pc1dvcmtpbmdDb3B5KCkpOwotCQkKLQkJSVR5cGUgamF2YVR5cGUxID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJRmllbGQgZjEgPSBqYXZhVHlwZTEuZ2V0RmllbGQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0VHJ1ZShmMS5leGlzdHMoKSk7Ci0JCUlUeXBlIGphdmFUeXBlMiA9IGN1Mi5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSUZpZWxkIGYyID0gamF2YVR5cGUyLmdldEZpZWxkKCJjdXN0b21lciIpOwotCQlhc3NlcnRUcnVlKGYyLmV4aXN0cygpKTsJCi0JCQkJCi0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1hbnlUb01hbnlVbmlkaXJSZWxhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVGaWVsZEFubm90YXRlZEVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQWRkcmVzcyIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgY3VzdG9tZXJUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0JCQotCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQyID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oKElGaWxlKXQxLmdldFJlc291cmNlKCkpOwotCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IG5ldyBNYW55VG9NYW55VW5pRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDIuZ2V0UmVzb3VyY2UoKSkpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlTZXQ8U3RyaW5nPiBhbm5vdGF0aW9ucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25OYW1lcyhvd25lckF0KTsKLQkJYXNzZXJ0VHJ1ZShhbm5vdGF0aW9ucy5jb250YWlucygiTWFueVRvTWFueSIpKTsKLQkJYXNzZXJ0TnVsbCgoKE93bmFibGVSZWxhdGlvbnNoaXBNYXBwaW5nQW5ub3RhdGlvbilvd25lckF0LmdldE1hcHBpbmcoKSkuZ2V0TWFwcGVkQnkoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1MS5pc1dvcmtpbmdDb3B5KCkpOwotCQkKLQkJSVR5cGUgamF2YVR5cGUxID0gY3UxLmZpbmRQcmltYXJ5VHlwZSgpOwotCQlJRmllbGQgZjEgPSBqYXZhVHlwZTEuZ2V0RmllbGQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0VHJ1ZShmMS5leGlzdHMoKSk7CQkKLQkJCi0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1hbnlUb01hbnlCaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUZpZWxkQW5ub3RhdGVkRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCQotCQlJRmlsZSBhZGRyZXNzRmlsZSA9IGZhY3RvcnkuY3JlYXRlRmllbGRBbm5vdGF0ZWRFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MSA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCQotCQlhc3NlcnRUcnVlKGFkZHJlc3NGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGFkZHJlc3NUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGN1c3RvbWVyVHlwZSk7Ci0KLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDIgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBhZGRyZXNzVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl9Ci0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSk7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UyID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDIuZ2V0UmVzb3VyY2UoKSk7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb01hbnlCaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsICJjdXN0b21lciIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCVNldDxTdHJpbmc+IGFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKG93bmVyQXQpOwotCQlhc3NlcnRUcnVlKGFubm90YXRpb25zLmNvbnRhaW5zKCJNYW55VG9NYW55IikpOwotCQlhc3NlcnROdWxsKCgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKW93bmVyQXQuZ2V0TWFwcGluZygpKS5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIGludmVyc2VBdCA9IHQyLmdldEF0dHJpYnV0ZU5hbWVkKCJjdXN0b21lciIpOwotCQlhc3NlcnROb3ROdWxsKGludmVyc2VBdCk7Ci0JCWFubm90YXRpb25zID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbk5hbWVzKGludmVyc2VBdCk7Ci0JCWFzc2VydFRydWUoYW5ub3RhdGlvbnMuY29udGFpbnMoIk1hbnlUb01hbnkiKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsICgoT3duYWJsZVJlbGF0aW9uc2hpcE1hcHBpbmdBbm5vdGF0aW9uKWludmVyc2VBdC5nZXRNYXBwaW5nKCkpLmdldE1hcHBlZEJ5KCkpOwotCQkKLQkJYXNzZXJ0VHJ1ZShjdTEuaXNXb3JraW5nQ29weSgpKTsKLQkJYXNzZXJ0VHJ1ZShjdTIuaXNXb3JraW5nQ29weSgpKTsKLQkJCi0JCUlUeXBlIGphdmFUeXBlMSA9IGN1MS5maW5kUHJpbWFyeVR5cGUoKTsKLQkJSUZpZWxkIGYxID0gamF2YVR5cGUxLmdldEZpZWxkKCJhZGRyZXNzIik7Ci0JCWFzc2VydFRydWUoZjEuZXhpc3RzKCkpOwotCQlJVHlwZSBqYXZhVHlwZTIgPSBjdTIuZmluZFByaW1hcnlUeXBlKCk7Ci0JCUlGaWVsZCBmMiA9IGphdmFUeXBlMi5nZXRGaWVsZCgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0VHJ1ZShmMi5leGlzdHMoKSk7Ci0JCQotCX0KLQkKLQkKLX0KLQotCmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3JlbGF0aW9uL0NyZWF0ZVJlbGF0aW9uc1Rlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcmVsYXRpb24vQ3JlYXRlUmVsYXRpb25zVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmNjMTU3Li4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvcmVsYXRpb24vQ3JlYXRlUmVsYXRpb25zVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5yZWxhdGlvbjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suaXNBOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2sucmVwbGF5OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5TaGFwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24uY29yZS5yZXNvdXJjZS5qYXZhLkphdmFSZXNvdXJjZUFic3RyYWN0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5OZXN0YWJsZUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5LmludGVybmFsLml0ZXJhYmxlcy5FbXB0eUl0ZXJhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5pbnRlcm5hbC5pdGVyYWJsZXMuU3ViSXRlcmFibGVXcmFwcGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcGFTdHJ1Y3R1cmVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5KcHRKcGFDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LkF0dHJpYnV0ZU1hcHBpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuRW1iZWRkYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LmphdmEuSmF2YVBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLkpQQTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5Kb2luQ29sdW1uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9NYW55QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUucmVzb3VyY2UuamF2YS5NYW55VG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5yZXNvdXJjZS5qYXZhLk9uZVRvTWFueUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLnJlc291cmNlLmphdmEuT25lVG9PbmVBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3BlcnR5cGFnZS5KUEFEaWFncmFtUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnByb3ZpZGVyLklKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLkFic3RyYWN0UmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb01hbnlCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5NYW55VG9NYW55VW5pRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZUJpRGlyUmVsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucmVsYXRpb25zLk1hbnlUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb01hbnlVbmlEaXJSZWxhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5yZWxhdGlvbnMuT25lVG9PbmVCaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnJlbGF0aW9ucy5PbmVUb09uZVVuaURpclJlbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi0KLUBTdXBwcmVzc1dhcm5pbmdzKHsgInVudXNlZCIgfSkKLXB1YmxpYyBjbGFzcyBDcmVhdGVSZWxhdGlvbnNUZXN0IHsKLQotCXByaXZhdGUgSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXI7Ci0JZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCUlFY2xpcHNlRmFjYWRlIGVjbGlwc2VGYWNhZGUgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTlVNX09GX0lURVJBVElPTlMgPSAyNTA7Ci0JSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gbnVsbDsKLQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IG51bGw7Ci0JSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gbnVsbDsKLQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IG51bGw7Ci0JcHJpdmF0ZSBJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlcjIwOwotCXByaXZhdGUgSnBhUHJvamVjdCBqcGEyMFByb2plY3Q7Ci0JCi0JCi0JQEJlZm9yZQotCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQotCQlKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3RNYW5hZ2VyKCk7Ci0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCQkKLQkJSUZpbGUgZW50aXR5ID0gZmFjdG9yeS5jcmVhdGVFbnRpdHkoanBhUHJvamVjdCwgIm9yZy5lY2xpcHNlLkVudGl0eTEiKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChudWxsKSkuYW5kUmV0dXJuKGdldFBlcnNpc3RlbnRUeXBlKGVudGl0eSkpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpLmFuZFJldHVybihKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eSkpLmFueVRpbWVzKCk7Ci0JCQotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCi0JCUlGaWxlIGFkZHJlc3NGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIn0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCQotCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJaW50IGMgPSAwOwotCQl3aGlsZSAoKHQxID09IG51bGwpICYmIChjIDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgewotCQkJanBhUHJvamVjdC51cGRhdGUobnVsbCk7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJYysrOwotCQl9Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MSkpLmFuZFN0dWJSZXR1cm4oaXNBKFNoYXBlLmNsYXNzKSk7Ci0JCWN1MSA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDEpKS5hbmRTdHViUmV0dXJuKGN1MSk7CQkKLQkJCi0JCWFzc2VydFRydWUoYWRkcmVzc0ZpbGUuZXhpc3RzKCkpOwotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS5BZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQotCQkKLQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJYyA9IDA7Ci0JCXdoaWxlICgodDIgPT0gbnVsbCkgJiYgKGMgPCBNQVhfTlVNX09GX0lURVJBVElPTlMpKSB7Ci0JCQlqcGFQcm9qZWN0LnVwZGF0ZShudWxsKTsJCQkKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWMrKzsKLQkJfQotCQkKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGlzQShTaGFwZS5jbGFzcykpOwotCQljdTIgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGFkZHJlc3NGaWxlKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQotCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcHJvcHMuc2V0UHJvcGVydHkoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5QUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSwgImNvbGxlY3Rpb24iKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5sb2FkUHJvcGVydGllcyhqcGFQcm9qZWN0LmdldFByb2plY3QoKSkpLmFuZFN0dWJSZXR1cm4ocHJvcHMpOwotCQkKLQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcik7CQotCQkKLQkJanBhMjBQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEEyMFByb2plY3QoVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlhc3NlcnROb3ROdWxsKGpwYTIwUHJvamVjdCk7Ci0KLQkJSUZpbGUgZW50aXR5MjAgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eShqcGEyMFByb2plY3QsCSJvcmcuZWNsaXBzZS5FbnRpdHkxIik7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkJZmVhdHVyZVByb3ZpZGVyMjAgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAuZ2V0QnVzaW5lc3NPYmplY3RGb3JQaWN0b2dyYW1FbGVtZW50KG51bGwpKS5hbmRSZXR1cm4oZ2V0UGVyc2lzdGVudFR5cGUoZW50aXR5MjApKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdChpc0EoSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKSkpCi0JCQkJLmFuZFJldHVybihKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVudGl0eTIwKSkuYW55VGltZXMoKTsKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBKYXZhUGVyc2lzdGVudFR5cGUgZ2V0UGVyc2lzdGVudFR5cGUoSUZpbGUgZmlsZSl7Ci0JCUpwYUZpbGUganBhRmlsZSA9IEpwdEpwYUNvcmVQbHVnaW4uZ2V0SnBhRmlsZShmaWxlKTsKLQkJZm9yIChKcGFTdHJ1Y3R1cmVOb2RlIG5vZGU6IGdldFJvb3ROb2RlcyhqcGFGaWxlKSkgewotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIGVudGl0eSA9IChKYXZhUGVyc2lzdGVudFR5cGUpIG5vZGU7Ci0JCQlyZXR1cm4gZW50aXR5OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0JCi0JCi0JcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8SnBhU3RydWN0dXJlTm9kZT4gZ2V0Um9vdE5vZGVzKEpwYUZpbGUganBhRmlsZSkgewotCQlpZihqcGFGaWxlID09IG51bGwpewotCQkJcmV0dXJuIEVtcHR5SXRlcmFibGUuaW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4ganBhRmlsZS5nZXRSb290U3RydWN0dXJlTm9kZXMoKTsKLQl9Ci0JCi0JcHVibGljIElDb21waWxhdGlvblVuaXQgY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGZpbGUpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb09uZVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkJCi0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvT25lVW5pRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJT25lVG9PbmVBbm5vdGF0aW9uIGFuID0gKE9uZVRvT25lQW5ub3RhdGlvbilvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihPbmVUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbik7Ci0JCWFzc2VydE51bGwoYW4uZ2V0TWFwcGVkQnkoKSk7Ci0JfQotCQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb09uZUJpZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCi0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvT25lQmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLCAiY3VzdG9tZXIiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljdTIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlPbmVUb09uZUFubm90YXRpb24gYW4gPSAoT25lVG9PbmVBbm5vdGF0aW9uKW93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE9uZVRvT25lQW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFuKTsKLQkJYXNzZXJ0TnVsbChhbi5nZXRNYXBwZWRCeSgpKTsKLQkJCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgaW52ZXJzZUF0ID0gdDIuZ2V0QXR0cmlidXRlTmFtZWQoImN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoaW52ZXJzZUF0KTsKLQkJYW4gPSAoT25lVG9PbmVBbm5vdGF0aW9uKWludmVyc2VBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhbi5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JfQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVRvTWFueVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvTWFueVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCQotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFuID0gKE9uZVRvTWFueUFubm90YXRpb24pb3duZXJBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROdWxsKGFuLmdldE1hcHBlZEJ5KCkpOwkJCi0JfQotCQotCQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU1hbnlUb09uZVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb09uZVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlciwgdDEsIHQyLCAiYWRkcmVzcyIsCi0JCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJICAJCQkJCWN1MSwKLQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCU1hbnlUb09uZUFubm90YXRpb24gYW4gPSAoTWFueVRvT25lQW5ub3RhdGlvbilvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihNYW55VG9PbmVBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNYW55VG9PbmVCaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb09uZUJpRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwgImN1c3RvbWVyIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCByZWwuZ2V0T3duZXJBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImFkZHJlc3MiKTsKLQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJTWFueVRvT25lQW5ub3RhdGlvbiBhbiA9IChNYW55VG9PbmVBbm5vdGF0aW9uKW93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE1hbnlUb09uZUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJYXNzZXJ0Tm90TnVsbChhbik7Ci0JCQotCQlhc3NlcnRFcXVhbHMoImN1c3RvbWVyIiwgcmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpOwotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQXQgPSB0Mi5nZXRBdHRyaWJ1dGVOYW1lZCgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlQXQpOwotCQlPbmVUb01hbnlBbm5vdGF0aW9uIGFuMSA9IChPbmVUb01hbnlBbm5vdGF0aW9uKWludmVyc2VBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFuMSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIGFuMS5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueVVuaWRpclJlbGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE1hbnlUb01hbnlVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIsIHQxLCB0MiwgImFkZHJlc3MiLAotCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCSAgCQkJCQljdTIpOwotCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJYXNzZXJ0U2FtZSh0MiwgcmVsLmdldEludmVyc2UoKSk7Ci0JCWFzc2VydEVxdWFscygiYWRkcmVzcyIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQlNYW55VG9NYW55QW5ub3RhdGlvbiBhbiA9IChNYW55VG9NYW55QW5ub3RhdGlvbilvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihNYW55VG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQlhc3NlcnROb3ROdWxsKGFuKTsKLQkJYXNzZXJ0TnVsbChhbi5nZXRNYXBwZWRCeSgpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTWFueVRvTWFueUJpZGlyUmVsYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgTWFueVRvTWFueUJpRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyLCB0MSwgdDIsICJhZGRyZXNzIiwgImN1c3RvbWVyIiwKLQkJCQkJCQkJICAJCQkJCXRydWUsIAotCQkJCQkJCQkgIAkJCQkJY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbSgoSUZpbGUpdDEuZ2V0UmVzb3VyY2UoKSksCi0JCQkJCQkJCSAgCQkJCQljcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKChJRmlsZSl0Mi5nZXRSZXNvdXJjZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwocmVsKTsKLQkJYXNzZXJ0U2FtZSh0MSwgcmVsLmdldE93bmVyKCkpOwotCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUgb3duZXJBdCA9IHQxLmdldEF0dHJpYnV0ZU5hbWVkKCJhZGRyZXNzIik7Ci0JCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCU1hbnlUb01hbnlBbm5vdGF0aW9uIGFuID0gKE1hbnlUb01hbnlBbm5vdGF0aW9uKW93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCQlhc3NlcnROdWxsKGFuLmdldE1hcHBlZEJ5KCkpOwotCQkJCQotCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBpbnZlcnNlQXQgPSB0Mi5nZXRBdHRyaWJ1dGVOYW1lZCgiY3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChpbnZlcnNlQXQpOwotCQlhbiA9IChNYW55VG9NYW55QW5ub3RhdGlvbilpbnZlcnNlQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE1hbnlUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwoYW4pOwotCQlhc3NlcnRFcXVhbHMoImFkZHJlc3MiLCBhbi5nZXRNYXBwZWRCeSgpKTsKLQkJCi0JfQotCi0JQFRlc3QKLQkJcHVibGljIHZvaWQgdGVzdENyZWF0ZU9uZVRvTWFueVVuaWRpclJlbGF0aW9uMjAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJCQotCQkJYXNzZXJ0Tm90TnVsbChqcGEyMFByb2plY3QpOwkKLQkJCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJCQotCQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiQWRkcmVzcyIpOwotCQkJCi0JCQlqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLmJ1aWxkKEluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXIuQ0xFQU5fQlVJTEQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQotCQkJYXNzZXJ0VHJ1ZShjdXN0b21lckZpbGUuZXhpc3RzKCkpOwotCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYTIwUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5DdXN0b21lciIpOwotCQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkJCQkKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGEyMFByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJaW50IGMgPSAwOwotCQkJd2hpbGUgKCh0MSA9PSBudWxsKSAmJiAoYyA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQlqcGEyMFByb2plY3QudXBkYXRlKG51bGwpOwotCQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJYysrOwotCQkJfQotCQkJCQkKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGlzQShTaGFwZS5jbGFzcykpOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGN1c3RvbWVyRmlsZSk7Ci0JCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQkJCQotCQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgYWRkcmVzc1R5cGUgPSBqcGEyMFByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkFkZHJlc3MiKTsKLQkJCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkKLQkJCQotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgYWRkcmVzc1R5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCXdoaWxlICgodDIgPT0gbnVsbCkgJiYgKGMgPCBNQVhfTlVNX09GX0lURVJBVElPTlMpKSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQkJanBhMjBQcm9qZWN0LnVwZGF0ZShudWxsKTsKLQkJCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGEyMFByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJYysrOwotCQkJfQotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MikpLmFuZFN0dWJSZXR1cm4oaXNBKFNoYXBlLmNsYXNzKSk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oYWRkcmVzc0ZpbGUpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCQotCQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlwcm9wcy5zZXRQcm9wZXJ0eShKUEFEaWFncmFtUHJvcGVydHlQYWdlLlBST1BfQ09MTEVDVElPTl9UWVBFLmdldExvY2FsTmFtZSgpLCAibGlzdCIpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmxvYWRQcm9wZXJ0aWVzKGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCkpKS5hbmRSZXR1cm4ocHJvcHMpOwotCQkJcmVwbGF5KGZlYXR1cmVQcm92aWRlcjIwKTsKLQkJCQkJCQkKLQkJCUFic3RyYWN0UmVsYXRpb24gcmVsID0gbmV3IE9uZVRvTWFueVVuaURpclJlbGF0aW9uKGZlYXR1cmVQcm92aWRlcjIwLCB0MSwgdDIsICJhZGRyZXNzIiwKLQkJCQkJCQkJCSAgCQkJCQl0cnVlLCAKLQkJCQkJCQkJCSAgCQkJCQljdTEsCi0JCQkJCQkJCQkgIAkJCQkJY3UyKTsKLQkJCWFzc2VydE5vdE51bGwocmVsKTsKLQkJCWFzc2VydFNhbWUodDEsIHJlbC5nZXRPd25lcigpKTsKLQkJCWFzc2VydFNhbWUodDIsIHJlbC5nZXRJbnZlcnNlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJhZGRyZXNzIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJCUphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgiYWRkcmVzcyIpOwotCQkJYXNzZXJ0Tm90TnVsbChvd25lckF0KTsKLQkJCQotCQkJT2JqZWN0IG8xID0gb3duZXJBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oT25lVG9NYW55QW5ub3RhdGlvbi5BTk5PVEFUSU9OX05BTUUpOwotCQkJYXNzZXJ0Tm90TnVsbChvMSk7Ci0JCQkKLQkJCU9iamVjdCBvMiA9IG93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKEpvaW5Db2x1bW5Bbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQlhc3NlcnROb3ROdWxsKG8yKTsKLQkJCQotCQkJSm9pbkNvbHVtbkFubm90YXRpb24gam9pbkNvbHVtbiA9IChKb2luQ29sdW1uQW5ub3RhdGlvbikgbzI7Ci0JCQlhc3NlcnROb3ROdWxsKGpvaW5Db2x1bW4uZ2V0TmFtZSgpKTsKLQkJCQotCQkJYXNzZXJ0Tm90TnVsbChqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkJCi0JCQlhc3NlcnRFcXVhbHMoIkN1c3RvbWVyX2lkIiwgam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkJYXNzZXJ0RXF1YWxzKCJpZCIsIGpvaW5Db2x1bW4uZ2V0UmVmZXJlbmNlZENvbHVtbk5hbWUoKSk7Ci0JCQkJCQkKLQkJfQotCQkKLQkJCi0JCUBUZXN0Ci0JCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVPbmVUb01hbnlVbmlkaXJJRENsYXNzUmVsYXRpb24yMCgpIHRocm93cyBFeGNlcHRpb24gewotCQkJCi0JCQlhc3NlcnROb3ROdWxsKGpwYTIwUHJvamVjdCk7CQotCQkJSUZpbGUgc2ltcGxlRW1wbG95ZWVGaWxlID0gZmFjdG9yeS5jcmVhdGVJZENsYXNzSW5Qcm9qZWN0KGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiRW1wbG95ZWUiKTsKLQkJCUlGaWxlIGVtcGxveWVlRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5V2l0aENvbXBvc2l0ZVBLSW5Qcm9qZWN0KGpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiRW1wbG95ZWUiKTsKLQkKLQkJCUlGaWxlIHByb2plY3RGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhMjBQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20ifSwgIlByb2plY3QiKTsKLQkJCQotCQkJanBhMjBQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQotCQkJYXNzZXJ0VHJ1ZShzaW1wbGVFbXBsb3llZUZpbGUuZXhpc3RzKCkpOwotCQkJYXNzZXJ0VHJ1ZShlbXBsb3llZUZpbGUuZXhpc3RzKCkpOwotCQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGVtcGxveWVlVHlwZSA9IGpwYTIwUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20udGVzdC5FbXBsb3llZSIpOwotCQkJYXNzZXJ0Tm90TnVsbChlbXBsb3llZVR5cGUpOwotCQkJCQkKLQkJCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGEyMFByb2plY3QsIGVtcGxveWVlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJaW50IGMgPSAwOwotCQkJd2hpbGUgKCh0MSA9PSBudWxsKSAmJiAoYyA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQlqcGEyMFByb2plY3QudXBkYXRlKG51bGwpOwotCQkJCXQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgZW1wbG95ZWVUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJYysrOwotCQkJfQotCQkJCQkKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDEpKS5hbmRTdHViUmV0dXJuKGlzQShTaGFwZS5jbGFzcykpOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTEgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGVtcGxveWVlRmlsZSk7Ci0JCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQkJCQotCQkJYXNzZXJ0VHJ1ZShwcm9qZWN0RmlsZS5leGlzdHMoKSk7Ci0JCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcHJvamVjdFR5cGUgPSBqcGEyMFByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlByb2plY3QiKTsKLQkJCWFzc2VydE5vdE51bGwoZW1wbG95ZWVUeXBlKTsKLQkKLQkJCQotCQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgcHJvamVjdFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCXdoaWxlICgodDIgPT0gbnVsbCkgJiYgKGMgPCBNQVhfTlVNX09GX0lURVJBVElPTlMpKSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQkJanBhMjBQcm9qZWN0LnVwZGF0ZShudWxsKTsKLQkJCQl0MiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGEyMFByb2plY3QsIHByb2plY3RUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQkJYysrOwotCQkJfQotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MikpLmFuZFN0dWJSZXR1cm4oaXNBKFNoYXBlLmNsYXNzKSk7Ci0JCQlJQ29tcGlsYXRpb25Vbml0IGN1MiA9IEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20ocHJvamVjdEZpbGUpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJcHJvcHMuc2V0UHJvcGVydHkoSlBBRGlhZ3JhbVByb3BlcnR5UGFnZS5QUk9QX0NPTExFQ1RJT05fVFlQRS5nZXRMb2NhbE5hbWUoKSwgImxpc3QiKTsKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5sb2FkUHJvcGVydGllcyhqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpKSkuYW5kUmV0dXJuKHByb3BzKTsKLQkJCXJlcGxheShmZWF0dXJlUHJvdmlkZXIyMCk7Ci0JCQkJCQkJCi0JCQlBYnN0cmFjdFJlbGF0aW9uIHJlbCA9IG5ldyBPbmVUb01hbnlVbmlEaXJSZWxhdGlvbihmZWF0dXJlUHJvdmlkZXIyMCwgdDEsIHQyLCAicHJvamVjdCIsCi0JCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCWFzc2VydEVxdWFscygicHJvamVjdCIsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQlKYXZhUGVyc2lzdGVudEF0dHJpYnV0ZSBvd25lckF0ID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoInByb2plY3QiKTsKLQkJCWFzc2VydE5vdE51bGwob3duZXJBdCk7Ci0JCQkKLQkJCU9iamVjdCBvMSA9IG93bmVyQXQuZ2V0UmVzb3VyY2VBdHRyaWJ1dGUoKS5nZXRBbm5vdGF0aW9uKE9uZVRvTWFueUFubm90YXRpb24uQU5OT1RBVElPTl9OQU1FKTsKLQkJCWFzc2VydE5vdE51bGwobzEpOwotCQkJCi0JCQlPYmplY3QgbzIgPSBvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihKUEEuSk9JTl9DT0xVTU5TKTsKLQkJCWFzc2VydE5vdE51bGwobzIpOwotCQkJCi0JCQlhc3NlcnRFcXVhbHMoMiwgb3duZXJBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb25zU2l6ZShKUEEuSk9JTl9DT0xVTU4pKTsJCQkKLQkJCQkJCQotCQl9Ci0JCQotCQlAVGVzdAotCQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlT25lVG9NYW55VW5pZGlyRW1iZWRkZWRSZWxhdGlvbjIwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWFzc2VydE5vdE51bGwoanBhMjBQcm9qZWN0KTsJCi0JCQlJRmlsZSBzaW1wbGVFbXBsb3llZUZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVtYmVkZGVkQ2xhc3NJblByb2plY3QoanBhMjBQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJFbXBsb3llZXJJZCIpOwotCQkJSUZpbGUgZW1wbG95ZWVGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlXaXRoRW1iZWRkZWRQS0luUHJvamVjdChqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkVtcGxveWVlciIpOwotCQotCQkJSUZpbGUgcHJvamVjdEZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGEyMFByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiUGVyc29uIik7Ci0JCQkKLQkJCWpwYTIwUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkKLQkJCWFzc2VydFRydWUoc2ltcGxlRW1wbG95ZWVGaWxlLmV4aXN0cygpKTsKLQkJCWFzc2VydFRydWUoZW1wbG95ZWVGaWxlLmV4aXN0cygpKTsKLQkJCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBlbXBsb3llZVR5cGUgPSBqcGEyMFByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuRW1wbG95ZWVyIik7Ci0JCQlhc3NlcnROb3ROdWxsKGVtcGxveWVlVHlwZSk7Ci0JCQkKLQkJCQkJCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhMjBQcm9qZWN0LCBlbXBsb3llZVR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWludCBjID0gMDsKLQkJCXdoaWxlICgodDEgPT0gbnVsbCkgJiYgKGMgPCBNQVhfTlVNX09GX0lURVJBVElPTlMpKSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQkJanBhMjBQcm9qZWN0LnVwZGF0ZShudWxsKTsKLQkJCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGEyMFByb2plY3QsIGVtcGxveWVlVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJCWMrKzsKLQkJCX0KLQkJCQkJCi0JCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQxKSkuYW5kU3R1YlJldHVybihpc0EoU2hhcGUuY2xhc3MpKTsKLQkJCUlDb21waWxhdGlvblVuaXQgY3UxID0gSmF2YUNvcmUuY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShlbXBsb3llZUZpbGUpOwotCQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlcjIwLmdldENvbXBpbGF0aW9uVW5pdCh0MSkpLmFuZFN0dWJSZXR1cm4oY3UxKTsKLQkJCQotCQkJCi0JCQlFbWJlZGRhYmxlIGVtYiA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldFBlcnNpc3RlbmNlVW5pdCh0MSkuZ2V0RW1iZWRkYWJsZSgiY29tLnRlc3QuRW1wbG95ZWVySWQiKTsKLQkJCUl0ZXJhdG9yPEF0dHJpYnV0ZU1hcHBpbmc+IGVtYkl0ID0gZW1iLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkuaXRlcmF0b3IoKTsKLQkJCWludCBjMSA9IDA7Ci0JCQl3aGlsZSAoKGVtYkl0Lmhhc05leHQoKSA9PSBmYWxzZSkgJiYgKGMxIDwgTUFYX05VTV9PRl9JVEVSQVRJT05TKSkgewotCQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJCWpwYTIwUHJvamVjdC51cGRhdGUobnVsbCk7Ci0JCQkJZW1iLnVwZGF0ZSgpOwotCQkJCWVtYkl0ID0gZW1iLmdldEFsbEF0dHJpYnV0ZU1hcHBpbmdzKCkuaXRlcmF0b3IoKTsKLQkJCQljMSsrOwotCQkJfQotCQkJCQkJCQotCQkJYXNzZXJ0VHJ1ZShwcm9qZWN0RmlsZS5leGlzdHMoKSk7Ci0JCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcHJvamVjdFR5cGUgPSBqcGEyMFByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLlBlcnNvbiIpOwotCQkJYXNzZXJ0Tm90TnVsbChlbXBsb3llZVR5cGUpOwotCQotCQkJCi0JCQlKYXZhUGVyc2lzdGVudFR5cGUgdDIgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhMjBQcm9qZWN0LCBwcm9qZWN0VHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQkJd2hpbGUgKCh0MiA9PSBudWxsKSAmJiAoYyA8IE1BWF9OVU1fT0ZfSVRFUkFUSU9OUykpIHsKLQkJCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCQlqcGEyMFByb2plY3QudXBkYXRlKG51bGwpOwotCQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYTIwUHJvamVjdCwgcHJvamVjdFR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCQljKys7Ci0JCQl9Ci0JCQkKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5nZXRQaWN0b2dyYW1FbGVtZW50Rm9yQnVzaW5lc3NPYmplY3QodDIpKS5hbmRTdHViUmV0dXJuKGlzQShTaGFwZS5jbGFzcykpOwotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSBKYXZhQ29yZS5jcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKHByb2plY3RGaWxlKTsKLQkJCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIyMC5nZXRDb21waWxhdGlvblVuaXQodDIpKS5hbmRTdHViUmV0dXJuKGN1Mik7Ci0JCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXByb3BzLnNldFByb3BlcnR5KEpQQURpYWdyYW1Qcm9wZXJ0eVBhZ2UuUFJPUF9DT0xMRUNUSU9OX1RZUEUuZ2V0TG9jYWxOYW1lKCksICJsaXN0Iik7Ci0JCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyMjAubG9hZFByb3BlcnRpZXMoanBhMjBQcm9qZWN0LmdldFByb2plY3QoKSkpLmFuZFJldHVybihwcm9wcyk7Ci0JCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyMjApOwotCQkJCQkJCQkJCQotCQkJQWJzdHJhY3RSZWxhdGlvbiByZWwgPSBuZXcgT25lVG9NYW55VW5pRGlyUmVsYXRpb24oZmVhdHVyZVByb3ZpZGVyMjAsIHQxLCB0MiwgInBlcnNvbiIsCi0JCQkJCQkJCQkgIAkJCQkJdHJ1ZSwgCi0JCQkJCQkJCQkgIAkJCQkJY3UxLAotCQkJCQkJCQkJICAJCQkJCWN1Mik7Ci0JCQlhc3NlcnROb3ROdWxsKHJlbCk7Ci0JCQlhc3NlcnRTYW1lKHQxLCByZWwuZ2V0T3duZXIoKSk7Ci0JCQlhc3NlcnRTYW1lKHQyLCByZWwuZ2V0SW52ZXJzZSgpKTsKLQkJCWFzc2VydEVxdWFscygicGVyc29uIiwgcmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJICAgIEphdmFQZXJzaXN0ZW50QXR0cmlidXRlIG93bmVyQXQgPSB0MS5nZXRBdHRyaWJ1dGVOYW1lZCgicGVyc29uIik7Ci0JCQlhc3NlcnROb3ROdWxsKG93bmVyQXQpOwotCQkJCQkJCi0JCQlPYmplY3QgbzEgPSBvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbihPbmVUb01hbnlBbm5vdGF0aW9uLkFOTk9UQVRJT05fTkFNRSk7Ci0JCQlhc3NlcnROb3ROdWxsKG8xKTsKLQkJCQotCQkJT2JqZWN0IG8yID0gb3duZXJBdC5nZXRSZXNvdXJjZUF0dHJpYnV0ZSgpLmdldEFubm90YXRpb24oSlBBLkpPSU5fQ09MVU1OUyk7Ci0JCQlhc3NlcnROb3ROdWxsKG8yKTsKLQkJCQotCQkJYXNzZXJ0RXF1YWxzKDEsICBvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnNTaXplKEpQQS5KT0lOX0NPTFVNTikpOwotCQkJSXRlcmFibGU8Sm9pbkNvbHVtbkFubm90YXRpb24+IG5lc3RlZEFubm90YXRpb25zID0gbmV3IFN1Ykl0ZXJhYmxlV3JhcHBlcjxOZXN0YWJsZUFubm90YXRpb24sIEpvaW5Db2x1bW5Bbm5vdGF0aW9uPihvd25lckF0LmdldFJlc291cmNlQXR0cmlidXRlKCkuZ2V0QW5ub3RhdGlvbnMoSlBBLkpPSU5fQ09MVU1OKSk7Ci0JCQlJdGVyYXRvcjxKb2luQ29sdW1uQW5ub3RhdGlvbj4gbmVzdGVkSXRlcmF0b3IgPSBuZXN0ZWRBbm5vdGF0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUobmVzdGVkSXRlcmF0b3IuaGFzTmV4dCgpKXsKLQkJCQlKb2luQ29sdW1uQW5ub3RhdGlvbiBqb2luQ29sdW1uID0gbmVzdGVkSXRlcmF0b3IubmV4dCgpOwotCQkJCWFzc2VydEVxdWFscygiRW1wbG95ZWVyX2ZpcnN0TmFtZSIsam9pbkNvbHVtbi5nZXROYW1lKCkpOwotCQkJCWFzc2VydEVxdWFscygiZmlyc3ROYW1lIixqb2luQ29sdW1uLmdldFJlZmVyZW5jZWRDb2x1bW5OYW1lKCkpOwotCQkJfQotCQkJCQkJCi0JCX0KLQkKLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9DcmVhdGVEZWxldGVFbnRpdHkuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9DcmVhdGVEZWxldGVFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkYzA3MS4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvQ3JlYXRlRGVsZXRlRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDExIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwdEpwYUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuSnBhUm9vdENvbnRleHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LlBlcnNpc3RlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGEuY29yZS5jb250ZXh0LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVhtbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpwYUFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC5KUEFDcmVhdGVGYWN0b3J5OwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLQotcHVibGljIGNsYXNzIENyZWF0ZURlbGV0ZUVudGl0eSB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQlwcml2YXRlIEpQQUNyZWF0ZUZhY3RvcnkgZmFjdG9yeSA9IEpQQUNyZWF0ZUZhY3RvcnkuaW5zdGFuY2UoKTsKLQlwcml2YXRlIEpwYVByb2plY3QganBhUHJvamVjdCA9IG51bGw7Ci0KLQlAQmVmb3JlCi0JcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSnB0SnBhQ29yZVBsdWdpbi5nZXRKcGFQcm9qZWN0TWFuYWdlcigpOwotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUFuZERlbGV0ZUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24gewkKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLS8vCQlTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyIHVwZGF0ZXIgPSBuZXcgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihqcGFQcm9qZWN0KTsKLS8vCQl1cGRhdGVyLnN0YXJ0KCk7Ci0JCUpwYVJvb3RDb250ZXh0Tm9kZSBqcGFQcm9qZWN0Q29udGVudCA9IGpwYVByb2plY3QuZ2V0Um9vdENvbnRleHROb2RlKCk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdENvbnRlbnQpOwkJCi0vLwkJaWYoanBhUHJvamVjdENvbnRlbnQuZ2V0UGVyc2lzdGVuY2VYbWwoKSA9PSBudWxsKSB7CQkKLS8vCQkJdXBkYXRlciA9IG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKGpwYVByb2plY3QpOwotLy8JCQl1cGRhdGVyLnN0YXJ0KCk7CQkJCi0vLwkJfQotCQlUaHJlYWQuc2xlZXAoMjAwMCk7CQkKLQkJUGVyc2lzdGVuY2VYbWwgcGVyc2lzdGVuY2VYbWwgPSBqcGFQcm9qZWN0Q29udGVudC5nZXRQZXJzaXN0ZW5jZVhtbCgpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlWG1sKTsKLQkJUGVyc2lzdGVuY2UgcCA9IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCk7Ci0JCWludCBjbnQgPSAwOwotCQl3aGlsZSAoKHAgPT0gbnVsbCkgJiYgKGNudCA8IDI1KSkgewotCQkJVGhyZWFkLnNsZWVwKDI1MCk7Ci0JCQlwID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKTsKLQkJCWNudCsrOwotCQl9Ci0JCWFzc2VydFRydWUoIkNhbid0IG9idGFpbiBwZXJzaXN0ZW5jZSBvYmplY3QiLCBwICE9IG51bGwpOwotCQlhc3NlcnRUcnVlKHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0c1NpemUoKSA9PSAxKTsKLQkJLy9qYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb246IE5vIFBlcnNpc3RlbmNlVW5pdCBpbiB0aGlzIGNvbnRleHQKLQkJLy9QZXJzaXN0ZW5jZVVuaXQgcGVyc2lzdGVuY2VVbml0ID0gcGVyc2lzdGVuY2VYbWwuZ2V0UGVyc2lzdGVuY2UoKS5nZXRQZXJzaXN0ZW5jZVVuaXQoKTsKLQkJUGVyc2lzdGVuY2VVbml0IHBlcnNpc3RlbmNlVW5pdCA9IHBlcnNpc3RlbmNlWG1sLmdldFBlcnNpc3RlbmNlKCkuZ2V0UGVyc2lzdGVuY2VVbml0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVW5pdCk7Ci0JCWFzc2VydFRydWUocGVyc2lzdGVuY2VVbml0LmdldENsYXNzUmVmc1NpemUoKSA9PSAwKTsKLQkJSUZpbGUgZW50aXR5MSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSJ9LCAiRW50aXR5MSIpOwkJCi0JCWFzc2VydFRydWUoZW50aXR5MS5leGlzdHMoKSk7Ci0vLwkJaWYoanBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uRW50aXR5MSIpID09IG51bGwpIHsJCQkKLS8vCQkJdXBkYXRlciA9IG5ldyBTeW5jaHJvbm91c0pwYVByb2plY3RVcGRhdGVyKGpwYVByb2plY3QpOwotLy8JCQl1cGRhdGVyLnN0YXJ0KCk7Ci0vLwkJfQotCQlKYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGUgcGVyc2lzdGVuY2VUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uRW50aXR5MSIpOwotCQlpbnQgYyA9IDA7Ci0JCXdoaWxlICgocGVyc2lzdGVuY2VUeXBlID09IG51bGwpICYmIChjIDwgMTAwKSkgewotCQkJVGhyZWFkLnNsZWVwKDUwMCk7Ci0JCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX0lORklOSVRFLCBudWxsKTsKLQkJCXBlcnNpc3RlbmNlVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLkVudGl0eTEiKTsKLQkJCWMrKzsKLQkJfQotCQlhc3NlcnROb3ROdWxsKHBlcnNpc3RlbmNlVHlwZSk7Ci0JCVBlcnNpc3RlbnRUeXBlIHQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcGVyc2lzdGVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCWMgPSAwOwotCQl3aGlsZSAoKHQgPT0gbnVsbCkgJiYgKGMgPCAxMDApKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCXQgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgcGVyc2lzdGVuY2VUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCQljKys7Ci0JCX0KLQkJSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZGVsZXRlUGVyc2lzdGVuY2VUeXBlUmVzb3VyY2UodCk7Ci0JCWFzc2VydEZhbHNlKGVudGl0eTEuZXhpc3RzKCkpOwotLy8JCXVwZGF0ZXIgPSBuZXcgU3luY2hyb25vdXNKcGFQcm9qZWN0VXBkYXRlcihqcGFQcm9qZWN0KTsKLS8vCQl1cGRhdGVyLnN0YXJ0KCk7Ci0JCWpwYVByb2plY3QuZ2V0UHJvamVjdCgpLnJlZnJlc2hMb2NhbChJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEUsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlKcHRKcGFDb3JlUGx1Z2luLnJlYnVpbGRKcGFQcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpKTsKLQkJcGVyc2lzdGVuY2VUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uRW50aXR5MSIpOwotCQljID0gMDsKLQkJd2hpbGUgKChwZXJzaXN0ZW5jZVR5cGUgIT0gbnVsbCkgJiYgKGMgPCAyNTApKSB7Ci0JCQlUaHJlYWQuc2xlZXAoNTAwKTsKLQkJCWpwYVByb2plY3QgPSBKcHRKcGFDb3JlUGx1Z2luLmdldEpwYVByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJcGVyc2lzdGVuY2VUeXBlID0ganBhUHJvamVjdC5nZXRKYXZhUmVzb3VyY2VUeXBlKCJjb20uRW50aXR5MSIpOwotCQkJYysrOwotCQl9Ci0JCWFzc2VydE51bGwocGVyc2lzdGVuY2VUeXBlKTsJCQotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwotCX0JCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSUVkaXRvci5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0lFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU1YzlhNy4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIDxjb3B5cmlnaHQ+Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwIFNBUCBBRy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgU3RlZmFuIERpbW92IC0gaW5pdGlhbCBBUEksIGltcGxlbWVudGF0aW9uIGFuZCBkb2N1bWVudGF0aW9uCi0gKgotICogPC9jb3B5cmlnaHQ+Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5wbGF0Zm9ybS5JRGlhZ3JhbUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotcHVibGljIGludGVyZmFjZSBJRWRpdG9yIGV4dGVuZHMgSUVkaXRvclBhcnQsIElEaWFncmFtRWRpdG9yIHsJCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSlBBRWRpdG9yVXRpbFRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JVdGlsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzg5NmNiLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KUEFFZGl0b3JVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5jcmVhdGVNb2NrOwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5HcmFwaGljc0FsZ29yaXRobTsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5hbGdvcml0aG1zLlJvdW5kZWRSZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uYWxnb3JpdGhtcy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQW5jaG9yQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuQ29ubmVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5ncmFwaGl0aS5tbS5waWN0b2dyYW1zLkNvbnRhaW5lclNoYXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuRnJlZUZvcm1Db25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuU2hhcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklQZVNlcnZpY2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSlBBRWRpdG9yQ29uc3RhbnRzLlNoYXBlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQUVkaXRvclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5KcGFBcnRpZmFjdEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5TaXplUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMuaW50ZXJuYWwuSlBBQ3JlYXRlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBKUEFFZGl0b3JVdGlsVGVzdCB7Ci0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwaXRhbGl6ZUZpcnN0TGV0dGVyKCkgewotCQlTdHJpbmcgcyA9ICJhYmNkZWYiOwotCQlTdHJpbmcgcmVzID0gSlBBRWRpdG9yVXRpbC5jYXBpdGFsaXplRmlyc3RMZXR0ZXIocyk7Ci0JCWFzc2VydEVxdWFscyhyZXMuc3Vic3RyaW5nKDAsIDEpLCAiQSIpOwotCQlhc3NlcnRFcXVhbHMocy5zdWJzdHJpbmcoMSksIHJlcy5zdWJzdHJpbmcoMSkpOwotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3REZWNhcGl0YWxpemVGaXJzdExldHRlcigpIHsgCQkKLQkJU3RyaW5nIHMgPSAiQUJDREVGR0hJSksiOwotCQlTdHJpbmcgcmVzID0gSlBBRWRpdG9yVXRpbC5kZWNhcGl0YWxpemVGaXJzdExldHRlcihzKTsKLQkJYXNzZXJ0RXF1YWxzKHJlcy5zdWJzdHJpbmcoMCwgMSksICJhIik7Ci0JCWFzc2VydEVxdWFscyhzLnN1YnN0cmluZygxKSwgcmVzLnN1YnN0cmluZygxKSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJldmVydEZpcnN0TGV0dGVyQ2FzZSgpIHsKLQkJU3RyaW5nIHMgPSAiQUJDREVGR0hJSksiOwotCQlTdHJpbmcgcmVzID0gSlBBRWRpdG9yVXRpbC5yZXZlcnRGaXJzdExldHRlckNhc2Uocyk7Ci0JCWFzc2VydEVxdWFscyhyZXMuc3Vic3RyaW5nKDAsIDEpLCAiYSIpOwotCQlhc3NlcnRFcXVhbHMocy5zdWJzdHJpbmcoMSksIHJlcy5zdWJzdHJpbmcoMSkpOwotCQlTdHJpbmcgcmVzMSA9IEpQQUVkaXRvclV0aWwucmV2ZXJ0Rmlyc3RMZXR0ZXJDYXNlKHJlcyk7Ci0JCWFzc2VydEVxdWFscyhyZXMxLnN1YnN0cmluZygwLCAxKSwgIkEiKTsKLQkJYXNzZXJ0RXF1YWxzKHJlczEuc3Vic3RyaW5nKDEpLCByZXMuc3Vic3RyaW5nKDEpKTsKLQl9Ci0JCi0JQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzSWdub3JlRmlyc3RMZXR0ZXJDYXNlKCkgewotCQlTdHJpbmcgczEgPSAiYWJjZGVmZyI7Ci0JCVN0cmluZyBzMiA9ICJBYmNkZWZnIjsKLQkJYXNzZXJ0VHJ1ZShKUEFFZGl0b3JVdGlsLmVxdWFsc0lnbm9yZUZpcnN0TGV0dGVyQ2FzZShzMSwgczIpKTsKLQkJCi0JCXMxID0gIiI7Ci0JCXMyID0gIiI7Ci0JCWFzc2VydFRydWUoSlBBRWRpdG9yVXRpbC5lcXVhbHNJZ25vcmVGaXJzdExldHRlckNhc2UoczEsIHMyKSk7Ci0JCQotCQlzMSA9ICJnamdJeWd1aXlHVVl1R1VZR3V5ZyI7Ci0JCXMyID0gImdqZ0l5Z3VpeUdVWXVHVVlHdXlnIjsKLQkJYXNzZXJ0VHJ1ZShKUEFFZGl0b3JVdGlsLmVxdWFsc0lnbm9yZUZpcnN0TGV0dGVyQ2FzZShzMSwgczIpKTsKLQkJCi0JCXMxID0gIkxqZ0l5Z3VpeUdVWXVHVVlHdXlnIjsKLQkJczIgPSAiTGpnSXlndWl5R1VZdUdVWUd1eWciOwotCQlhc3NlcnRUcnVlKEpQQUVkaXRvclV0aWwuZXF1YWxzSWdub3JlRmlyc3RMZXR0ZXJDYXNlKHMxLCBzMikpOwkJCi0JCQotCQlzMSA9ICJnamdJeWd1aXlHVVl1R1VZR3V5Z3MiOwotCQlzMiA9ICJnamdJeWd1aXlHVVl1R1VZR3V5ZyI7Ci0JCWFzc2VydEZhbHNlKEpQQUVkaXRvclV0aWwuZXF1YWxzSWdub3JlRmlyc3RMZXR0ZXJDYXNlKHMxLCBzMikpOwotCQkKLQkJczEgPSAiTGpnSXlndWl5R1V5dUdVWUd1eWciOwotCQlzMiA9ICJMamdJeWd1aXlHVVl1R1VZR3V5ZyI7Ci0JCWFzc2VydEZhbHNlKEpQQUVkaXRvclV0aWwuZXF1YWxzSWdub3JlRmlyc3RMZXR0ZXJDYXNlKHMxLCBzMikpOwkJCQotCX0KLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZXR1cm5TaW1wbGVOYW1lKCkgewotCQlTdHJpbmcgcyA9ICIiOwotCQlTdHJpbmcgcmVzID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMocywgcmVzKTsKLQkJcyA9ICJqZGhrc2FqaGRrIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMocywgcmVzKTsJCQotCQlzID0gImpkaGtzYWpoZGsuIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5yZXR1cm5TaW1wbGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMoIiIsIHJlcyk7Ci0JCXMgPSAiLmpkaGtzYWpoZGsiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUocyk7Ci0JCWFzc2VydEVxdWFscygiamRoa3NhamhkayIsIHJlcyk7Ci0JCXMgPSAiamRoa3MuYWpoZGsiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUocyk7Ci0JCWFzc2VydEVxdWFscygiYWpoZGsiLCByZXMpOwotCQlzID0gImRzcy5kc2RzZC5qZC5oa3MuYWpoZGsiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnJldHVyblNpbXBsZU5hbWUocyk7Ci0JCWFzc2VydEVxdWFscygiYWpoZGsiLCByZXMpOwotCX0KLQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RTdHJpcFF1b3RlcygpIHsKLQkJU3RyaW5nIHMgPSAiIjsKLQkJU3RyaW5nIHJlcyA9IEpQQUVkaXRvclV0aWwuc3RyaXBRdW90ZXMocyk7Ci0JCWFzc2VydEVxdWFscygiIiwgcmVzKTsKLQkJCi0JCXMgPSAiXCJcIiI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwuc3RyaXBRdW90ZXMocyk7Ci0JCWFzc2VydEVxdWFscygiIiwgcmVzKTsKLQkJCi0JCXMgPSAiXCJmZHNqZmpzbGtkamZsa3NcIiI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwuc3RyaXBRdW90ZXMocyk7Ci0JCWFzc2VydEVxdWFscygiZmRzamZqc2xrZGpmbGtzIiwgcmVzKTsKLQkJCi0JCXMgPSAiXCJmZHNqZmpzbGtkamZsa3MiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnN0cmlwUXVvdGVzKHMpOwotCQlhc3NlcnRFcXVhbHMoIlwiZmRzamZqc2xrZGpmbGtzIiwgcmVzKTsJCi0JCQotCQlzID0gImZkc2pmanNsa2RqZmxrc1wiIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5zdHJpcFF1b3RlcyhzKTsKLQkJYXNzZXJ0RXF1YWxzKCJmZHNqZmpzbGtkamZsa3NcIiIsIHJlcyk7CQkJCi0JfQotCQotCS8vQFRlc3QgCi0JcHVibGljIHZvaWQgdGVzdEdldEpQVHlwZSgpIHRocm93cyBFeGNlcHRpb24gewotCQkKLQkJU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQkJSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJU3RyaW5nIHRlc3RQcm9qZWN0TmFtZSA9IFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KHRlc3RQcm9qZWN0TmFtZSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsKLQkKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsJCi0JCUlGaWxlIGN1c3RvbWVyRmlsZSA9IGZhY3RvcnkuY3JlYXRlRW50aXR5SW5Qcm9qZWN0KGpwYVByb2plY3QuZ2V0UHJvamVjdCgpLCBuZXcgU3RyaW5nW117ImNvbSIsInRlc3QifSwgIkN1c3RvbWVyIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gSlBBRWRpdG9yVXRpbC5nZXRKUFR5cGUoY3UpOwotCQlhc3NlcnRFcXVhbHMoY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSwganB0LmdldE5hbWUoKSk7Ci0JfQotCQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCVN0cmluZyBzID0gImEiOwotCQlTdHJpbmcgcmVzID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMocywgcmVzKTsKLQkJCi0JCXMgPSAiQSI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKCJhIiwgcmVzKTsJCQotCQkKLQkJcyA9ICJhVCI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKCJBVCIsIHJlcyk7Ci0JCQotCQlzID0gIkF0IjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMoImF0IiwgcmVzKTsKLQkJCi0JCXMgPSAiQVQiOwotCQlyZXMgPSBKUEFFZGl0b3JVdGlsLnByb2R1Y2VWYWxpZEF0dHJpYnV0ZU5hbWUocyk7Ci0JCWFzc2VydEVxdWFscygiQVQiLCByZXMpOwkJCi0JCQotCQlzID0gImExIjsKLQkJcmVzID0gSlBBRWRpdG9yVXRpbC5wcm9kdWNlVmFsaWRBdHRyaWJ1dGVOYW1lKHMpOwotCQlhc3NlcnRFcXVhbHMoImExIiwgcmVzKTsJCQotCQkKLQkJcyA9ICJBMSI7Ci0JCXJlcyA9IEpQQUVkaXRvclV0aWwucHJvZHVjZVZhbGlkQXR0cmlidXRlTmFtZShzKTsKLQkJYXNzZXJ0RXF1YWxzKCJhMSIsIHJlcyk7CQkJCQotCi0JfQotCQotCS8vQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSW1wb3J0cygpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgVEVTVF9QUk9KRUNUID0gIlRlc3QiOwotCQlKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCQlKUEFDcmVhdGVGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlTdHJpbmcgdGVzdFByb2plY3ROYW1lID0gVEVTVF9QUk9KRUNUICsgIl8iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCi0JCWZhY3RvcnkgPSBKUEFDcmVhdGVGYWN0b3J5Lmluc3RhbmNlKCk7Ci0JCWpwYVByb2plY3QgPSBmYWN0b3J5LmNyZWF0ZUpQQVByb2plY3QodGVzdFByb2plY3ROYW1lKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwkJCi0JCi0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKTsKLQkJCi0JCUpQQUVkaXRvclV0aWwuY3JlYXRlSW1wb3J0cyhjdSwgImphdmEudXRpbC5IYXNodGFibGU8amF2YS5sYW5nLlN0cmluZ0J1ZmZlcixqYXZhLmxhbmcuU2V0PGphdmEubGFuZy5TdHJpbmc+PiIpOwotCX0KLQkKLQlAVGVzdCAKLQlwdWJsaWMgdm9pZCB0ZXN0U2l6ZVBvc2l0aW9uKCkgewotCQlTaXplUG9zaXRpb24gc3AgPSBuZXcgU2l6ZVBvc2l0aW9uKDEsMiwzLDQpOwotCQlhc3NlcnRUcnVlKHNwLmdldFdpZHRoKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoc3AuZ2V0SGVpZ2h0KCkgPT0gMik7CQkKLQkJYXNzZXJ0VHJ1ZShzcC5nZXRYKCkgPT0gMyk7Ci0JCWFzc2VydFRydWUoc3AuZ2V0WSgpID09IDQpOwotCX0KLQkKLQkvL0BUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEdldFRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIFRFU1RfUFJPSkVDVCA9ICJUZXN0IjsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gbnVsbDsKLQkJSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJU3RyaW5nIHRlc3RQcm9qZWN0TmFtZSA9IFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KHRlc3RQcm9qZWN0TmFtZSk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7Ci0JCVRocmVhZC5zbGVlcCgyMDAwKTsJCQotCQotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJaW50IGNudCA9IDA7Ci0JCXdoaWxlICgoY250IDwgMjUpICYmICh0MSA9PSBudWxsKSkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJCWNudCsrOwotCQl9Ci0JCWlmICh0MSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhc3NlcnROb3ROdWxsKEpQQUVkaXRvclV0aWwuZ2V0VGV4dCh0MSkpOwotCQlhc3NlcnROb3ROdWxsKEpQQUVkaXRvclV0aWwuZ2V0VG9vbHRpcFRleHQodDEpKTsKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQoImlkIik7Ci0JCWFzc2VydE5vdE51bGwoanBhKTsKLQkJYXNzZXJ0Tm90TnVsbChKUEFFZGl0b3JVdGlsLmdldFRleHQoanBhKSk7Ci0JCWFzc2VydE5vdE51bGwoSlBBRWRpdG9yVXRpbC5nZXRUb29sdGlwVGV4dChqcGEpKTsKLQotCX0KLQkKLQkvL0BUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFNldEpQVE5hbWVJblNoYXBlKCkgewotCQlmaW5hbCBTdHJpbmcgTkVXX05BTUUgPSAiTmV3SlBUTmFtZSI7Ci0JCUNvbnRhaW5lclNoYXBlIGNzID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCVNoYXBlIHNoID0gRWFzeU1vY2suY3JlYXRlTW9jayhTaGFwZS5jbGFzcyk7Ci0JCUdyYXBoaWNzQWxnb3JpdGhtIGdhID0gRWFzeU1vY2suY3JlYXRlTW9jayhHcmFwaGljc0FsZ29yaXRobS5jbGFzcyk7Ci0JCUlQZVNlcnZpY2VVdGlsIHBlVXRpbCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVBlU2VydmljZVV0aWwuY2xhc3MpOwotCQlFYXN5TW9jay5leHBlY3QocGVVdGlsLmdldFByb3BlcnR5VmFsdWUoc2gsIEpQQUVkaXRvckNvbnN0YW50cy5QUk9QX1NIQVBFX1RZUEUpKS5hbmRTdHViUmV0dXJuKFNoYXBlVHlwZS5IRUFERVIudG9TdHJpbmcoKSk7Ci0JCUVMaXN0PFNoYXBlPiBzaGFwZXMgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PFNoYXBlPihTaGFwZS5jbGFzcyk7Ci0JCXNoYXBlcy5hZGQoc2gpOwotCQlFYXN5TW9jay5leHBlY3QoY3MuZ2V0Q2hpbGRyZW4oKSkuYW5kU3R1YlJldHVybihzaGFwZXMpOwotCQlUZXh0IHR4dCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soVGV4dC5jbGFzcyk7Ci0JCUVMaXN0PEdyYXBoaWNzQWxnb3JpdGhtPiBnYUNoID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxHcmFwaGljc0FsZ29yaXRobT4oR3JhcGhpY3NBbGdvcml0aG0uY2xhc3MpOyAgCi0JCWdhQ2guYWRkKHR4dCk7Ci0JCUVhc3lNb2NrLmV4cGVjdChzaC5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKGdhKTsKLQkJRWFzeU1vY2suZXhwZWN0KGdhLmdldEdyYXBoaWNzQWxnb3JpdGhtQ2hpbGRyZW4oKSkuYW5kU3R1YlJldHVybihnYUNoKTsKLQkJdHh0LnNldFZhbHVlKE5FV19OQU1FKTsKLQkJRWFzeU1vY2sucmVwbGF5KGNzLCBzaCwgZ2EsIHBlVXRpbCwgdHh0KTsKLQkJSlBBRWRpdG9yVXRpbC5zZXRKUFROYW1lSW5TaGFwZShjcywgTkVXX05BTUUsIHBlVXRpbCk7Ci0JfQotCQotCS8vQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQmVuZFBvaW50TGlzdDEoKSB7Ci0JCUZyZWVGb3JtQ29ubmVjdGlvbiBjID0gRWFzeU1vY2suY3JlYXRlTW9jayhGcmVlRm9ybUNvbm5lY3Rpb24uY2xhc3MpOwotCQlBbmNob3Igc3RhcnRBbmNob3IgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvciBlbmRBbmNob3IgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvci5jbGFzcyk7Ci0JCUFuY2hvckNvbnRhaW5lciBzdGFydEFuY2hvckNvbnRhaW5lciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yQ29udGFpbmVyLmNsYXNzKTsKLQkJQW5jaG9yQ29udGFpbmVyIGVuZEFuY2hvckNvbnRhaW5lciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yQ29udGFpbmVyLmNsYXNzKTsKLQkJZXhwZWN0KGMuZ2V0U3RhcnQoKSkuYW5kU3R1YlJldHVybihzdGFydEFuY2hvcik7Ci0JCWV4cGVjdChjLmdldEVuZCgpKS5hbmRTdHViUmV0dXJuKGVuZEFuY2hvcik7Ci0JCWV4cGVjdChzdGFydEFuY2hvci5nZXRQYXJlbnQoKSkuYW5kU3R1YlJldHVybihzdGFydEFuY2hvckNvbnRhaW5lcik7Ci0JCWV4cGVjdChlbmRBbmNob3IuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oZW5kQW5jaG9yQ29udGFpbmVyKTsKLQkJUm91bmRlZFJlY3RhbmdsZSByZWN0U3RhcnQgPSBjcmVhdGVNb2NrKFJvdW5kZWRSZWN0YW5nbGUuY2xhc3MpOwotCQlSb3VuZGVkUmVjdGFuZ2xlIHJlY3RFbmQgPSBjcmVhdGVNb2NrKFJvdW5kZWRSZWN0YW5nbGUuY2xhc3MpOwotCQlleHBlY3Qoc3RhcnRBbmNob3JDb250YWluZXIuZ2V0R3JhcGhpY3NBbGdvcml0aG0oKSkuYW5kU3R1YlJldHVybihyZWN0U3RhcnQpOwotCQlleHBlY3QoZW5kQW5jaG9yQ29udGFpbmVyLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFN0dWJSZXR1cm4ocmVjdEVuZCk7Ci0JCWV4cGVjdChyZWN0U3RhcnQuZ2V0WCgpKS5hbmRTdHViUmV0dXJuKDEwMCk7Ci0JCWV4cGVjdChyZWN0U3RhcnQuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDEwMCk7Ci0JCWV4cGVjdChyZWN0U3RhcnQuZ2V0V2lkdGgoKSkuYW5kU3R1YlJldHVybigyMDApOwotCQlleHBlY3QocmVjdFN0YXJ0LmdldEhlaWdodCgpKS5hbmRTdHViUmV0dXJuKDEyMCk7Ci0JCWV4cGVjdChyZWN0RW5kLmdldFgoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQlleHBlY3QocmVjdEVuZC5nZXRZKCkpLmFuZFN0dWJSZXR1cm4oODAwKTsKLQkJZXhwZWN0KHJlY3RFbmQuZ2V0V2lkdGgoKSkuYW5kU3R1YlJldHVybigyMDApOwotCQlleHBlY3QocmVjdEVuZC5nZXRIZWlnaHQoKSkuYW5kU3R1YlJldHVybigxMjApOwotCQkKLQkJRUxpc3Q8Q29ubmVjdGlvbj4gY2NjID0gbmV3IEJhc2ljSW50ZXJuYWxFTGlzdDxDb25uZWN0aW9uPihDb25uZWN0aW9uLmNsYXNzKTsgIAotCQlleHBlY3Qoc3RhcnRBbmNob3IuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5hbmRTdHViUmV0dXJuKGNjYyk7Ci0JCWV4cGVjdChlbmRBbmNob3IuZ2V0T3V0Z29pbmdDb25uZWN0aW9ucygpKS5hbmRTdHViUmV0dXJuKGNjYyk7Ci0KLQkJRWFzeU1vY2sucmVwbGF5KGMsIHN0YXJ0QW5jaG9yLCBlbmRBbmNob3IsIHN0YXJ0QW5jaG9yQ29udGFpbmVyLCBlbmRBbmNob3JDb250YWluZXIsIHJlY3RTdGFydCwgcmVjdEVuZCk7Ci0JCQotCQkKLQkJCi0JCUxpc3Q8UG9pbnQ+IGxzdCA9IEpQQUVkaXRvclV0aWwuY3JlYXRlQmVuZFBvaW50TGlzdChjLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUobHN0LnNpemUoKSA9PSAyKTsKLQkJZm9yIChQb2ludCBwIDogbHN0KSB7Ci0JCQlhc3NlcnRUcnVlKHAueCA+PSAwKTsKLQkJCWFzc2VydFRydWUocC55ID49IDApOwotCQkJCi0JCQlhc3NlcnRUcnVlKHAueCA8PSAxMDAwMDAwKTsKLQkJCWFzc2VydFRydWUocC55IDw9IDEwMDAwMDApOwkJCQotCQl9Ci0JCQotCX0KLQkKLQkvL0BUZXN0Ci0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUJlbmRQb2ludExpc3QyKCkgewotCQlGcmVlRm9ybUNvbm5lY3Rpb24gYyA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soRnJlZUZvcm1Db25uZWN0aW9uLmNsYXNzKTsKLQkJQW5jaG9yIHN0YXJ0QW5jaG9yID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3IgZW5kQW5jaG9yID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlBbmNob3JDb250YWluZXIgc3RhcnRBbmNob3JDb250YWluZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvckNvbnRhaW5lci5jbGFzcyk7Ci0JCUFuY2hvckNvbnRhaW5lciBlbmRBbmNob3JDb250YWluZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKEFuY2hvckNvbnRhaW5lci5jbGFzcyk7Ci0JCWV4cGVjdChjLmdldFN0YXJ0KCkpLmFuZFN0dWJSZXR1cm4oc3RhcnRBbmNob3IpOwotCQlleHBlY3QoYy5nZXRFbmQoKSkuYW5kU3R1YlJldHVybihlbmRBbmNob3IpOwotCQlleHBlY3Qoc3RhcnRBbmNob3IuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oc3RhcnRBbmNob3JDb250YWluZXIpOwotCQlleHBlY3QoZW5kQW5jaG9yLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGVuZEFuY2hvckNvbnRhaW5lcik7Ci0JCVJvdW5kZWRSZWN0YW5nbGUgcmVjdFN0YXJ0ID0gY3JlYXRlTW9jayhSb3VuZGVkUmVjdGFuZ2xlLmNsYXNzKTsKLQkJUm91bmRlZFJlY3RhbmdsZSByZWN0RW5kID0gY3JlYXRlTW9jayhSb3VuZGVkUmVjdGFuZ2xlLmNsYXNzKTsKLQkJZXhwZWN0KHN0YXJ0QW5jaG9yQ29udGFpbmVyLmdldEdyYXBoaWNzQWxnb3JpdGhtKCkpLmFuZFN0dWJSZXR1cm4ocmVjdFN0YXJ0KTsKLQkJZXhwZWN0KGVuZEFuY2hvckNvbnRhaW5lci5nZXRHcmFwaGljc0FsZ29yaXRobSgpKS5hbmRTdHViUmV0dXJuKHJlY3RFbmQpOwotCQlleHBlY3QocmVjdFN0YXJ0LmdldFgoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQlleHBlY3QocmVjdFN0YXJ0LmdldFkoKSkuYW5kU3R1YlJldHVybigxMDApOwotCQlleHBlY3QocmVjdFN0YXJ0LmdldFdpZHRoKCkpLmFuZFN0dWJSZXR1cm4oMjAwKTsKLQkJZXhwZWN0KHJlY3RTdGFydC5nZXRIZWlnaHQoKSkuYW5kU3R1YlJldHVybigxMjApOwotCQlleHBlY3QocmVjdEVuZC5nZXRYKCkpLmFuZFN0dWJSZXR1cm4oODAwKTsKLQkJZXhwZWN0KHJlY3RFbmQuZ2V0WSgpKS5hbmRTdHViUmV0dXJuKDEwMCk7Ci0JCWV4cGVjdChyZWN0RW5kLmdldFdpZHRoKCkpLmFuZFN0dWJSZXR1cm4oMjAwKTsKLQkJZXhwZWN0KHJlY3RFbmQuZ2V0SGVpZ2h0KCkpLmFuZFN0dWJSZXR1cm4oMTIwKTsKLQotCQlFTGlzdDxDb25uZWN0aW9uPiBjY2MgPSBuZXcgQmFzaWNJbnRlcm5hbEVMaXN0PENvbm5lY3Rpb24+KENvbm5lY3Rpb24uY2xhc3MpOyAgCi0JCWV4cGVjdChzdGFydEFuY2hvci5nZXRPdXRnb2luZ0Nvbm5lY3Rpb25zKCkpLmFuZFN0dWJSZXR1cm4oY2NjKTsJCQotCQlleHBlY3QoZW5kQW5jaG9yLmdldE91dGdvaW5nQ29ubmVjdGlvbnMoKSkuYW5kU3R1YlJldHVybihjY2MpOwkJCi0JCQotCQlFYXN5TW9jay5yZXBsYXkoYywgc3RhcnRBbmNob3IsIGVuZEFuY2hvciwgc3RhcnRBbmNob3JDb250YWluZXIsIGVuZEFuY2hvckNvbnRhaW5lciwgcmVjdFN0YXJ0LCByZWN0RW5kKTsKLQkJCi0JCUxpc3Q8UG9pbnQ+IGxzdCA9IEpQQUVkaXRvclV0aWwuY3JlYXRlQmVuZFBvaW50TGlzdChjLCBmYWxzZSk7Ci0JCWFzc2VydFRydWUobHN0LnNpemUoKSA9PSAyKTsKLQkJZm9yIChQb2ludCBwIDogbHN0KSB7Ci0JCQlhc3NlcnRUcnVlKHAueCA+PSAwKTsKLQkJCWFzc2VydFRydWUocC55ID49IDApOwotCQkJCi0JCQlhc3NlcnRUcnVlKHAueCA8PSAxMDAwMDAwKTsKLQkJCWFzc2VydFRydWUocC55IDw9IDEwMDAwMDApOwkJCQotCQl9Ci0JCQotCX0KLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQkKLQkKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RBcmVIZWFkZXJzRXF1YWwoKSB7Ci0JCWFzc2VydFRydWUoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoImhlYWRlciIsICJoZWFkZXIiKSk7Ci0JCWFzc2VydFRydWUoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9QUkVGSVhfRElSVFkgKyAiaGVhZGVyIiwgImhlYWRlciIpKTsKLQkJYXNzZXJ0VHJ1ZShKUEFFZGl0b3JVdGlsLmFyZUhlYWRlcnNFcXVhbCgiaGVhZGVyIiwgSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9QUkVGSVhfRElSVFkgKyAiaGVhZGVyIikpOwotCQkKLQkJYXNzZXJ0RmFsc2UoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoImhlYWRlciIsICJoZWFkZXJzIikpOwotCQlhc3NlcnRGYWxzZShKUEFFZGl0b3JVdGlsLmFyZUhlYWRlcnNFcXVhbCgiaGVhZGVycyIsICJoZWFkZXIiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShKUEFFZGl0b3JVdGlsLmFyZUhlYWRlcnNFcXVhbChKUEFFZGl0b3JDb25zdGFudHMuSEVBREVSX1BSRUZJWF9ESVJUWSArICJoZWFkZXJzIiwgImhlYWRlciIpKTsKLQkJYXNzZXJ0RmFsc2UoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoSlBBRWRpdG9yQ29uc3RhbnRzLkhFQURFUl9QUkVGSVhfRElSVFkgKyAiaGVhZGVyIiwgImhlYWRlcnMiKSk7Ci0JCQotCQlhc3NlcnRGYWxzZShKUEFFZGl0b3JVdGlsLmFyZUhlYWRlcnNFcXVhbCgiaGVhZGVycyIsIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfUFJFRklYX0RJUlRZICsgImhlYWRlciIpKTsKLQkJYXNzZXJ0RmFsc2UoSlBBRWRpdG9yVXRpbC5hcmVIZWFkZXJzRXF1YWwoImhlYWRlciIsIEpQQUVkaXRvckNvbnN0YW50cy5IRUFERVJfUFJFRklYX0RJUlRZICsgImhlYWRlcnMiKSk7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pQQVNvbHZlclRlc3QuamF2YSBiL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9KUEFTb2x2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NzgyNDQuLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pQQVNvbHZlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogPGNvcHlyaWdodD4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMTAgU0FQIEFHLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICBLaXJpbCBNaXRvdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5lcTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmlzQTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnJlcGxheTsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLnZlcmlmeTsKLQotaW1wb3J0IGphdmEubmV0LlVSSTsKLQotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWFzeW1vY2suSUFyZ3VtZW50TWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5CYXNpY0ludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkuZHQuSURpYWdyYW1UeXBlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0uUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkubW0ucGljdG9ncmFtcy5QaWN0b2dyYW1FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmdyYXBoaXRpLm1tLnBpY3RvZ3JhbXMuUGljdG9ncmFtc1BhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZ3JhcGhpdGkucGxhdGZvcm0uSURpYWdyYW1FZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuSnBhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFQZXJzaXN0ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhLmNvcmUuY29udGV4dC5qYXZhLkphdmFUeXBlTWFwcGluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC5wcm92aWRlci5JSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSUVjbGlwc2VGYWNhZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwudXRpbC5JSlBBRWRpdG9yVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLkpQQVNvbHZlcjsKLWltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwotaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLXB1YmxpYyBjbGFzcyBKUEFTb2x2ZXJUZXN0IHsKLQotCXByaXZhdGUgSUVjbGlwc2VGYWNhZGUgZWNsaXBzZUZhY2FkZTsKLQotCS8qKgotCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgotCSAqLwotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQllY2xpcHNlRmFjYWRlID0gY3JlYXRlRWNsaXBzZUZhY2FkZSgpOwotCX0KLQotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdFJlc291cmNlTGlzdGVuZXJSZWdpc3RlcmVkKCkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVdvcmtzcGFjZS5jbGFzcyk7Ci0JCXdvcmtzcGFjZS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGlzQShJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5jbGFzcyksIGVxKElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9DTE9TRSB8IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgfCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0JVSUxEKSk7Ci0JCXJlcGxheSh3b3Jrc3BhY2UpOwotCQlJRWNsaXBzZUZhY2FkZSBmYWNhZGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFY2xpcHNlRmFjYWRlLmNsYXNzKTsKLQkJZXhwZWN0KGZhY2FkZS5nZXRXb3Jrc3BhY2UoKSkuYW5kU3R1YlJldHVybih3b3Jrc3BhY2UpOwotCQlyZXBsYXkoZmFjYWRlKTsKLQkJbmV3IEpQQVNvbHZlcihmYWNhZGUsIG51bGwpOwotCQl2ZXJpZnkod29ya3NwYWNlLCBmYWNhZGUpOwotCX0KLQotCXByaXZhdGUgSUZpbGUgcmVwbGF5RmlsZSgpIHsKLQkJSUZpbGUgZmlsZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUZpbGUuY2xhc3MpOwotCQlVUkkgdXJpID0gVVJJLmNyZWF0ZSgiZmlsZTovL3Byb2plY3QvL2FhYSIpOwotCQlleHBlY3QoZmlsZS5nZXRMb2NhdGlvblVSSSgpKS5hbmRTdHViUmV0dXJuKHVyaSk7Ci0JCWV4cGVjdChmaWxlLmV4aXN0cygpKS5hbmRTdHViUmV0dXJuKHRydWUpOwotCQlJUHJvamVjdCBwcm9qID0gRWFzeU1vY2suY3JlYXRlTW9jayhJUHJvamVjdC5jbGFzcyk7Ci0JCWV4cGVjdChwcm9qLmdldFR5cGUoKSkuYW5kU3R1YlJldHVybihJUmVzb3VyY2UuUFJPSkVDVCk7Ci0JCWV4cGVjdChmaWxlLmdldFR5cGUoKSkuYW5kU3R1YlJldHVybihJUmVzb3VyY2UuRklMRSk7Ci0JCWV4cGVjdChmaWxlLmdldEZ1bGxQYXRoKCkpLmFuZFN0dWJSZXR1cm4obmV3IFBhdGgoIkM6XFxwcm9qZWN0XFxhYWEiKSk7Ci0JCUlGaWxlIGNsc1BhdGggPSBFYXN5TW9jay5jcmVhdGVNb2NrKElGaWxlLmNsYXNzKTsgCi0JCWV4cGVjdChwcm9qLmdldEZpbGUoIi5jbGFzc3BhdGgiKSkuYW5kU3R1YlJldHVybihjbHNQYXRoKTsKLQkJdHJ5IHsKLQkJCWV4cGVjdChwcm9qLmhhc05hdHVyZSgib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIpKS5hbmRTdHViUmV0dXJuKHRydWUpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHt9Ci0JCWV4cGVjdChmaWxlLmdldFByb2plY3QoKSkuYW5kU3R1YlJldHVybihwcm9qKTsKLQkJcmVwbGF5KGZpbGUsIHByb2opOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwcml2YXRlIEphdmFQZXJzaXN0ZW50VHlwZSBjcmVhdGVKcHRGb3JSZXNvdXJjZShJRmlsZSBmaWxlLCBTdHJpbmcgbmFtZSkgewotCQlKYXZhUGVyc2lzdGVudFR5cGUganB0ID0gRWFzeU1vY2suY3JlYXRlTmljZU1vY2soSmF2YVBlcnNpc3RlbnRUeXBlLmNsYXNzKTsKLQkJSnBhUHJvamVjdCBqcGFQcm9qZWN0ID0gRWFzeU1vY2suY3JlYXRlTmljZU1vY2soSnBhUHJvamVjdC5jbGFzcyk7Ci0JCUphdmFUeXBlTWFwcGluZyBtID0gRWFzeU1vY2suY3JlYXRlTmljZU1vY2soSmF2YVR5cGVNYXBwaW5nLmNsYXNzKTsKLQkJZXhwZWN0KGpwdC5nZXRSZXNvdXJjZSgpKS5hbmRTdHViUmV0dXJuKGZpbGUpOwotCQlleHBlY3QoanB0LmdldEpwYVByb2plY3QoKSkuYW5kU3R1YlJldHVybihqcGFQcm9qZWN0KTsKLQkJZXhwZWN0KGpwdC5nZXRNYXBwaW5nKCkpLmFuZFN0dWJSZXR1cm4obSk7Ci0JCWlmIChuYW1lICE9IG51bGwpCi0JCQlleHBlY3QoanB0LmdldE5hbWUoKSkuYW5kU3R1YlJldHVybihuYW1lKTsKLQkJcmVwbGF5KGpwdCwganBhUHJvamVjdCk7Ci0JCXJldHVybiBqcHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRWNsaXBzZUZhY2FkZSBjcmVhdGVFY2xpcHNlRmFjYWRlKCkgewotCQlJRWNsaXBzZUZhY2FkZSBmYWNhZGUgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElFY2xpcHNlRmFjYWRlLmNsYXNzKTsKLQkJcmV0dXJuIGZhY2FkZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29uZmlndXJlRm9yV29ya3NwYWNlKElFY2xpcHNlRmFjYWRlIGZhY2FkZSkgewotCQlJV29ya3NwYWNlIHdvcmtzcGFjZSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVdvcmtzcGFjZS5jbGFzcyk7Ci0JCXdvcmtzcGFjZS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGlzQShJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lci5jbGFzcyksIGVxKElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQlVJTEQpKTsKLQkJcmVwbGF5KHdvcmtzcGFjZSk7Ci0JCWV4cGVjdChmYWNhZGUuZ2V0V29ya3NwYWNlKCkpLmFuZFN0dWJSZXR1cm4od29ya3NwYWNlKTsKLQl9Ci0KLQlwcml2YXRlIElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIgY29uZmlndXJlUmVmcmVzaEVkaXRvclByb3ZpZGVyKCkgewotCQlJRGlhZ3JhbUVkaXRvciBlZGl0b3IgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElEaWFncmFtRWRpdG9yLmNsYXNzKTsKLQkJZWRpdG9yLnJlZnJlc2goKTsKLQkJcmVwbGF5KGVkaXRvcik7Ci0JCUlEaWFncmFtVHlwZVByb3ZpZGVyIGRpYWdyYW1Qcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSURpYWdyYW1UeXBlUHJvdmlkZXIuY2xhc3MpOwotCQlleHBlY3QoZGlhZ3JhbVByb3ZpZGVyLmdldERpYWdyYW1FZGl0b3IoKSkuYW5kU3R1YlJldHVybihlZGl0b3IpOwotCQlyZXBsYXkoZGlhZ3JhbVByb3ZpZGVyKTsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBwcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWV4cGVjdChwcm92aWRlci5nZXREaWFncmFtVHlwZVByb3ZpZGVyKCkpLmFuZFN0dWJSZXR1cm4oZGlhZ3JhbVByb3ZpZGVyKTsKLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgSU1hcmtlckRlbHRhIHJlcGxheURlbHRhKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJTWFya2VyRGVsdGEgZGVsdGEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElNYXJrZXJEZWx0YS5jbGFzcyk7Ci0JCWV4cGVjdChkZWx0YS5nZXRSZXNvdXJjZSgpKS5hbmRTdHViUmV0dXJuKHJlc291cmNlKTsKLQkJcmVwbGF5KGRlbHRhKTsKLQkJcmV0dXJuIGRlbHRhOwotCX0KLQotCXByaXZhdGUgSlBBU29sdmVyIGNyZWF0ZVNvbHZlcihJRWNsaXBzZUZhY2FkZSBmYWNhZGUsIElKUEFFZGl0b3JVdGlsIHV0aWwpIHsKLQkJcmV0dXJuIG5ldyBKUEFTb2x2ZXIoZmFjYWRlLCB1dGlsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGVxUmVzb3VyY2VMaXN0ZW5lcihJQXJndW1lbnRNYXRjaGVyIG1hdGNoZXIpIHsKLQkJRWFzeU1vY2sucmVwb3J0TWF0Y2hlcihtYXRjaGVyKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VFdmVudCByZXBsYXlFdmVudChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElSZXNvdXJjZUNoYW5nZUV2ZW50LmNsYXNzKTsKLQkJZXhwZWN0KGV2ZW50LmZpbmRNYXJrZXJEZWx0YXMobnVsbCwgdHJ1ZSkpLmFuZFN0dWJSZXR1cm4obmV3IElNYXJrZXJEZWx0YVtdIHsgcmVwbGF5RGVsdGEocmVzb3VyY2UpIH0pOwotCQlyZXBsYXkoZXZlbnQpOwotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VFdmVudCByZXBsYXlFbXB0eUV2ZW50KCkgewotCQlJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSVJlc291cmNlQ2hhbmdlRXZlbnQuY2xhc3MpOwotCQlleHBlY3QoZXZlbnQuZmluZE1hcmtlckRlbHRhcyhudWxsLCB0cnVlKSkuYW5kU3R1YlJldHVybihuZXcgSU1hcmtlckRlbHRhW10ge30pOwotCQlyZXBsYXkoZXZlbnQpOwotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnBhQXJ0aWZhY3RGYWN0b3J5VGVzdC5qYXZhIGIvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9qcHQvanBhZGlhZ3JhbWVkaXRvci91aS90ZXN0cy9pbnRlcm5hbC91dGlsL0pwYUFydGlmYWN0RmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FlN2M4Ni4uMDAwMDAwMAotLS0gYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvSnBhQXJ0aWZhY3RGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiA8Y29weXJpZ2h0PgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAxMSBTQVAgQUcuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgIFN0ZWZhbiBEaW1vdiAtIGluaXRpYWwgQVBJLCBpbXBsZW1lbnRhdGlvbiBhbmQgZG9jdW1lbnRhdGlvbgotICoKLSAqIDwvY29weXJpZ2h0PgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5yZXBsYXk7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLkluY3JlbWVudGFsUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLmNvcmUucmVzb3VyY2UuamF2YS5KYXZhUmVzb3VyY2VBYnN0cmFjdFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmNvbW1vbi51dGlsaXR5Lm1vZGVsLmV2ZW50Lkxpc3RBZGRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdENoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0Q2xlYXJFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdE1vdmVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuY29tbW9uLnV0aWxpdHkubW9kZWwuZXZlbnQuTGlzdFJlbW92ZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5ldmVudC5MaXN0UmVwbGFjZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5jb21tb24udXRpbGl0eS5tb2RlbC5saXN0ZW5lci5MaXN0Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLkpwYVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYS5jb3JlLmNvbnRleHQuamF2YS5KYXZhUGVyc2lzdGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkuaW50ZXJuYWwucHJvdmlkZXIuSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS5pbnRlcm5hbC51dGlsLklFY2xpcHNlRmFjYWRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLmludGVybmFsLnV0aWwuSnBhQXJ0aWZhY3RGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkpQQUNyZWF0ZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIEpwYUFydGlmYWN0RmFjdG9yeVRlc3QgewotCQotCVN0cmluZyBURVNUX1BST0pFQ1QgPSAiVGVzdCI7Ci0JcHJpdmF0ZSBKcGFQcm9qZWN0IGpwYVByb2plY3QgPSBudWxsOwotCXByaXZhdGUgSlBBQ3JlYXRlRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlJRWNsaXBzZUZhY2FkZSBlY2xpcHNlRmFjYWRlID0gbnVsbDsKLQlwdWJsaWMgc3RhdGljIGludCBjbnQgPSAwOwotCQotCUBCZWZvcmUKLQlwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmYWN0b3J5ID0gSlBBQ3JlYXRlRmFjdG9yeS5pbnN0YW5jZSgpOwotCQlqcGFQcm9qZWN0ID0gZmFjdG9yeS5jcmVhdGVKUEFQcm9qZWN0KFRFU1RfUFJPSkVDVCArICJfIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKLQkJYXNzZXJ0Tm90TnVsbChqcGFQcm9qZWN0KTsKLQkJVGhyZWFkLnNsZWVwKDIwMDApOwotCX0KLQkKLQkvKgotCUBUZXN0Ci0JcHVibGljIHZvaWQgdGVzdEpwYUFydGlmYWN0b3J5QXR0cmlidXRlUmVsYXRlZE1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlciBmZWF0dXJlUHJvdmlkZXIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKElKUEFFZGl0b3JGZWF0dXJlUHJvdmlkZXIuY2xhc3MpOwotCQlhc3NlcnROb3ROdWxsKGpwYVByb2plY3QpOwkKLQkJSUZpbGUgY3VzdG9tZXJGaWxlID0gZmFjdG9yeS5jcmVhdGVFbnRpdHlJblByb2plY3QoanBhUHJvamVjdC5nZXRQcm9qZWN0KCksIG5ldyBTdHJpbmdbXXsiY29tIiwidGVzdCJ9LCAiQ3VzdG9tZXIiKTsKLQkJSUZpbGUgYWRkcmVzc0ZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJBZGRyZXNzIik7Ci0JCQotCQlqcGFQcm9qZWN0LmdldFByb2plY3QoKS5idWlsZChJbmNyZW1lbnRhbFByb2plY3RCdWlsZGVyLkNMRUFOX0JVSUxELCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCi0JCWFzc2VydFRydWUoY3VzdG9tZXJGaWxlLmV4aXN0cygpKTsKLQkJSmF2YVJlc291cmNlQWJzdHJhY3RUeXBlIGN1c3RvbWVyVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQ3VzdG9tZXIiKTsKLQkJYXNzZXJ0Tm90TnVsbChjdXN0b21lclR5cGUpOwotCQkKLQkJYXNzZXJ0VHJ1ZShhZGRyZXNzRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBhZGRyZXNzVHlwZSA9IGpwYVByb2plY3QuZ2V0SmF2YVJlc291cmNlVHlwZSgiY29tLnRlc3QuQWRkcmVzcyIpOwotCQlhc3NlcnROb3ROdWxsKGFkZHJlc3NUeXBlKTsKLQkJCi0JCUphdmFQZXJzaXN0ZW50VHlwZSB0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJd2hpbGUgKHQxID09IG51bGwpIHsKLQkJCVRocmVhZC5zbGVlcCgyMDApOwotCQkJdDEgPSBKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5nZXRDb250ZXh0UGVyc2lzdGVudFR5cGUoanBhUHJvamVjdCwgY3VzdG9tZXJUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCXdoaWxlICh0MiA9PSBudWxsKSB7Ci0JCQlUaHJlYWQuc2xlZXAoMjAwKTsKLQkJCXQyID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGFkZHJlc3NUeXBlLmdldFF1YWxpZmllZE5hbWUoKSk7Ci0JCX0KLQotCQkKLQkJQ3JlYXRlT25lVG9PbmVCaURpclJlbGF0aW9uRmVhdHVyZSBmdCA9IG5ldyBDcmVhdGVPbmVUb09uZUJpRGlyUmVsYXRpb25GZWF0dXJlKGZlYXR1cmVQcm92aWRlcik7Ci0JCUlDcmVhdGVDb25uZWN0aW9uQ29udGV4dCBjdHggPSBFYXN5TW9jay5jcmVhdGVNb2NrKElDcmVhdGVDb25uZWN0aW9uQ29udGV4dC5jbGFzcyk7Ci0JCQotCQlDb250YWluZXJTaGFwZSBjczEgPSBFYXN5TW9jay5jcmVhdGVNb2NrKENvbnRhaW5lclNoYXBlLmNsYXNzKTsKLQkJQ29udGFpbmVyU2hhcGUgY3MyID0gRWFzeU1vY2suY3JlYXRlTW9jayhDb250YWluZXJTaGFwZS5jbGFzcyk7Ci0JCQotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldEJ1c2luZXNzT2JqZWN0Rm9yUGljdG9ncmFtRWxlbWVudChjczEpKS5hbmRTdHViUmV0dXJuKHQxKTsKLQkJZXhwZWN0KGZlYXR1cmVQcm92aWRlci5nZXRCdXNpbmVzc09iamVjdEZvclBpY3RvZ3JhbUVsZW1lbnQoY3MyKSkuYW5kU3R1YlJldHVybih0Mik7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0UGljdG9ncmFtRWxlbWVudEZvckJ1c2luZXNzT2JqZWN0KHQxKSkuYW5kU3R1YlJldHVybihjczEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldFBpY3RvZ3JhbUVsZW1lbnRGb3JCdXNpbmVzc09iamVjdCh0MikpLmFuZFN0dWJSZXR1cm4oY3MyKTsKLQkJCi0JCUFuY2hvciBhMSA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQW5jaG9yLmNsYXNzKTsKLQkJQW5jaG9yIGEyID0gRWFzeU1vY2suY3JlYXRlTW9jayhBbmNob3IuY2xhc3MpOwotCQlleHBlY3QoYTEuZ2V0UGFyZW50KCkpLmFuZFN0dWJSZXR1cm4oY3MxKTsKLQkJZXhwZWN0KGEyLmdldFBhcmVudCgpKS5hbmRTdHViUmV0dXJuKGNzMik7Ci0JCWV4cGVjdChjdHguZ2V0U291cmNlQW5jaG9yKCkpLmFuZFN0dWJSZXR1cm4oYTEpOwotCQlleHBlY3QoY3R4LmdldFRhcmdldEFuY2hvcigpKS5hbmRTdHViUmV0dXJuKGEyKTsKLQotCQlJQ29tcGlsYXRpb25Vbml0IGN1MSA9IGNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oY3VzdG9tZXJGaWxlKTsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdTIgPSBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKGFkZHJlc3NGaWxlKTsKLQkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQlleHBlY3QoZmVhdHVyZVByb3ZpZGVyLmdldENvbXBpbGF0aW9uVW5pdCh0MikpLmFuZFN0dWJSZXR1cm4oY3UyKTsKLQkJCi0JCUNvbm5lY3Rpb24gY29ubiA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soQ29ubmVjdGlvbi5jbGFzcyk7Ci0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuYWRkSWZQb3NzaWJsZSgoSUFkZENvbnRleHQpRWFzeU1vY2suYW55T2JqZWN0KCkpKS5hbmRTdHViUmV0dXJuKGNvbm4pOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyLCBhMSwgYTIsIGNzMSwgY3MyLCBjdHgpOwotCQlmdC5jcmVhdGUoY3R4KTsKLQkJT25lVG9PbmVCaURpclJlbGF0aW9uIHJlbCA9IGZ0LmNyZWF0ZVJlbGF0aW9uKGNzMSwgY3MyKTsKLQkJYXNzZXJ0Tm90TnVsbChyZWwpOwotCQlhc3NlcnROb3ROdWxsKHJlbC5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKFJlbFR5cGUuT05FX1RPX09ORSwgcmVsLmdldFJlbFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhSZWxEaXIuQkksIHJlbC5nZXRSZWxEaXIoKSk7Ci0JCWFzc2VydE5vdE51bGwodDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKSk7Ci0JCWFzc2VydE5vdE51bGwodDIuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldEludmVyc2VBdHRyaWJ1dGVOYW1lKCkpKTsJCQotCQkKLQkJSmF2YVBlcnNpc3RlbnRBdHRyaWJ1dGUganBhID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0VHJ1ZShKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5oYXNFbnRpdHlBbm5vdGF0aW9uKHQxKSk7Ci0JCQotCQkvL0phdmFQZXJzaXN0ZW50QXR0cmlidXRlIGpwYTEgPSAgSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0UmVsYXRlZEF0dHJpYnV0ZSh0MSwgdDIpOwotCQkvL2Fzc2VydE5vdE51bGwoanBhMSk7Ci0JCS8vYXNzZXJ0U2FtZShqcGExLCB0Mi5nZXRBdHRyaWJ1dGVOYW1lZChyZWwuZ2V0SW52ZXJzZUF0dHJpYnV0ZU5hbWUoKSkpOwotCQkKLQkJTGlzdDxTdHJpbmc+IGFucyA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldEFubm90YXRpb25TdHJpbmdzKGpwYSk7Ci0JCWFzc2VydE5vdE51bGwoYW5zKTsKLQkJYXNzZXJ0VHJ1ZShhbnMuc2l6ZSgpID4gMCk7CQkKLQkJYXNzZXJ0VHJ1ZShhbnMuY29udGFpbnMoIkBPbmVUb09uZSIpKTsJCQotCQlKcGFBcnRpZmFjdEZhY3RvcnkuaW5zdGFuY2UoKS5kZWxldGVBdHRyaWJ1dGUodDEsIHJlbC5nZXRPd25lckF0dHJpYnV0ZU5hbWUoKSwgZmVhdHVyZVByb3ZpZGVyKTsKLQkJanBhID0gdDEuZ2V0QXR0cmlidXRlTmFtZWQocmVsLmdldE93bmVyQXR0cmlidXRlTmFtZSgpKTsKLQkJYXNzZXJ0TnVsbChqcGEpOwotCX0KLQkqLwotCQotCUBUZXN0IAotCXB1YmxpYyB2b2lkIHRlc3RFbnRpdHlMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlJSlBBRWRpdG9yRmVhdHVyZVByb3ZpZGVyIGZlYXR1cmVQcm92aWRlciA9IEVhc3lNb2NrLmNyZWF0ZU1vY2soSUpQQUVkaXRvckZlYXR1cmVQcm92aWRlci5jbGFzcyk7Ci0JCWFzc2VydE5vdE51bGwoanBhUHJvamVjdCk7CQotCQlJRmlsZSBjdXN0b21lckZpbGUgPSBmYWN0b3J5LmNyZWF0ZUVudGl0eUluUHJvamVjdChqcGFQcm9qZWN0LmdldFByb2plY3QoKSwgbmV3IFN0cmluZ1tdeyJjb20iLCJ0ZXN0In0sICJDdXN0b21lciIpOwotCQkKLQkJanBhUHJvamVjdC5nZXRQcm9qZWN0KCkuYnVpbGQoSW5jcmVtZW50YWxQcm9qZWN0QnVpbGRlci5DTEVBTl9CVUlMRCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQotCQlhc3NlcnRUcnVlKGN1c3RvbWVyRmlsZS5leGlzdHMoKSk7Ci0JCUphdmFSZXNvdXJjZUFic3RyYWN0VHlwZSBjdXN0b21lclR5cGUgPSBqcGFQcm9qZWN0LmdldEphdmFSZXNvdXJjZVR5cGUoImNvbS50ZXN0LkN1c3RvbWVyIik7Ci0JCWFzc2VydE5vdE51bGwoY3VzdG9tZXJUeXBlKTsKLQkJCQkKLQkJSmF2YVBlcnNpc3RlbnRUeXBlIHQxID0gSnBhQXJ0aWZhY3RGYWN0b3J5Lmluc3RhbmNlKCkuZ2V0Q29udGV4dFBlcnNpc3RlbnRUeXBlKGpwYVByb2plY3QsIGN1c3RvbWVyVHlwZS5nZXRRdWFsaWZpZWROYW1lKCkpOwotCQl3aGlsZSAodDEgPT0gbnVsbCkgewotCQkJVGhyZWFkLnNsZWVwKDIwMCk7Ci0JCQl0MSA9IEpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmdldENvbnRleHRQZXJzaXN0ZW50VHlwZShqcGFQcm9qZWN0LCBjdXN0b21lclR5cGUuZ2V0UXVhbGlmaWVkTmFtZSgpKTsKLQkJfQkJCi0JCUlDb21waWxhdGlvblVuaXQgY3UxID0gY3JlYXRlQ29tcGlsYXRpb25Vbml0RnJvbShjdXN0b21lckZpbGUpOwkJCi0JCWV4cGVjdChmZWF0dXJlUHJvdmlkZXIuZ2V0Q29tcGlsYXRpb25Vbml0KHQxKSkuYW5kU3R1YlJldHVybihjdTEpOwotCQlyZXBsYXkoZmVhdHVyZVByb3ZpZGVyKTsJCQotCi0vLwkJQ2F0Y2hlcyBwcm9ibGVtIHdpdGggbXVsdGlwbGUgZXZlbnRzIC0gRWNsaXBzZSBidWd6aWxsYSBidWcgIzI1OTEwMwotCQkKLS8vCQljbnQgPSAwOwotLy8JCXQxLmFkZExpc3RDaGFuZ2VMaXN0ZW5lcihuZXcgRW50aXR5QXR0cmlidXRlc0NoYW5nZUxpc3RlbmVyKCkpOwotLy8JCUpwYUFydGlmYWN0RmFjdG9yeS5pbnN0YW5jZSgpLmRlbGV0ZUF0dHJpYnV0ZSh0MSwgImlkIiwgZmVhdHVyZVByb3ZpZGVyKTsKLS8vCQlUaHJlYWQuc2xlZXAoMTAwMDApOwotLy8JCWFzc2VydFRydWUoIlRoZSBsaXN0ZW5lciBpcyBiZWluZyB0cmlnZ2VyZWQgIiArIGNudCArICIgdGltZXMiLCBjbnQgPT0gMSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXRGcm9tKElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIEphdmFDb3JlLmNyZWF0ZUNvbXBpbGF0aW9uVW5pdEZyb20oZmlsZSk7Ci0JfQotCi0JCi0JCi0JcHVibGljIGNsYXNzIEVudGl0eUF0dHJpYnV0ZXNDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIExpc3RDaGFuZ2VMaXN0ZW5lciB7Ci0JCQotCQlwdWJsaWMgdm9pZCBsaXN0Q2hhbmdlZChMaXN0Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zQWRkZWQoTGlzdEFkZEV2ZW50IGFyZzApIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGl0ZW1zTW92ZWQoTGlzdE1vdmVFdmVudCBhcmcwKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpdGVtc1JlbW92ZWQoTGlzdFJlbW92ZUV2ZW50IGFyZzApIHsKLQkJCWNudCsrOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaXRlbXNSZXBsYWNlZChMaXN0UmVwbGFjZUV2ZW50IGFyZzApIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGxpc3RDbGVhcmVkKExpc3RDbGVhckV2ZW50IGFyZzApIHsKLQkJfQotCX07Ci0KLX0KZGlmZiAtLWdpdCBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9VUkxFc2NhcGVyLmphdmEgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvc3JjL29yZy9lY2xpcHNlL2pwdC9qcGFkaWFncmFtZWRpdG9yL3VpL3Rlc3RzL2ludGVybmFsL3V0aWwvVVJMRXNjYXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTY2YmEyLi4wMDAwMDAwCi0tLSBhL2pwYV9kaWFncmFtX2VkaXRvci90ZXN0cy9vcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvanB0L2pwYWRpYWdyYW1lZGl0b3IvdWkvdGVzdHMvaW50ZXJuYWwvdXRpbC9VUkxFc2NhcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLnV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBVUkxFc2NhcGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3BlY2lhbENoYXJzID0gIiA8PiMle318Xn5bXWA7P0A9JiQiOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBlc2NhcGVDb2RlcyAgPSAiJTIwJTNDJTNFJTIzJTI1JTdCJTdEJTdDJTVFJTdFJTVCJTVEJTYwJTNCJTNGJTQwJTNEJTI2JTI0IjsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGUoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgcmVzID0gbmV3IFN0cmluZ0J1ZmZlcigiIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gcy5jaGFyQXQoaSk7Ci0JCQlpbnQgaW5kID0gc3BlY2lhbENoYXJzLmluZGV4T2YoY2gpOwotCQkJcmVzLmFwcGVuZCgoKGluZCA+PSAwKSA/IGVzY2FwZUNvZGVzLnN1YnN0cmluZyhpbmQgKiAzLCBpbmQgKiAzICsgMykgOiBjaCkpOyAgIAotCQl9Ci0JCXJldHVybiByZXMudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvdGVzdC54bWwgYi9qcGFfZGlhZ3JhbV9lZGl0b3IvdGVzdHMvb3JnLmVjbGlwc2UuanB0LmpwYWRpYWdyYW1lZGl0b3IudWkudGVzdHMvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YWQxODguLjAwMDAwMDAKLS0tIGEvanBhX2RpYWdyYW1fZWRpdG9yL3Rlc3RzL29yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzL3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxwcm9qZWN0IG5hbWU9InRlc3RzdWl0ZSIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQk8IS0tIFRoZSBwcm9wZXJ0eSAke2VjbGlwc2UtaG9tZX0gc2hvdWxkIGJlIHBhc3NlZCBpbnRvIHRoaXMgc2NyaXB0IC0tPgotCTwhLS0gU2V0IGEgbWVhbmluZ2Z1bCBkZWZhdWx0IHZhbHVlIGZvciB3aGVuIGl0IGlzIG5vdC4gLS0+Ci0JPGVjaG8gbWVzc2FnZT0iYmFzZWRpciAke2Jhc2VkaXJ9IiAvPgotCTxlY2hvIG1lc3NhZ2U9ImVjbGlwc2UgcGxhY2UgJHtlY2xpcHNlLWhvbWV9IiAvPgotCTwhLS0gc2V0cyB0aGUgcHJvcGVydGllcyBwbHVnaW4tbmFtZSAtLT4KLQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5qcHQuanBhZGlhZ3JhbWVkaXRvci51aS50ZXN0cyIvPgotCTxlY2hvIGxldmVsPSJkZWJ1ZyIgbWVzc2FnZT0idGVzdFJvb3Q6ICR7dGVzdFJvb3R9IiAvPgotCTxmYWlsIG1lc3NhZ2U9InRlc3RSb290IG11c3QgYmUgc2V0IiB1bmxlc3M9InRlc3RSb290IiAvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcC8+Ci0JCTxkZWxldGU+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS1ob21lfSIgaW5jbHVkZXM9Im9yZyoueG1sIi8+Ci0JCTwvZGVsZXRlPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlMSI+Ci0gICAgCTxwcm9wZXJ0eSBmaWxlPSIke3Rlc3RSb290fS90ZXN0U2VydmVyLnByb3BlcnRpZXMiLz4KLQkgICAgPHByb3BlcnR5IG5hbWU9ImpwYWUtZm9sZGVyIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L2pwYWVfZm9sZGVyIi8+Ci0JICAgIDxkZWxldGUgZGlyPSIke2pwYWUtZm9sZGVyfSIgcXVpZXQ9InRydWUiLz4KLQkJCi0JCTxhbnQgdGFyZ2V0PSJ1aS10ZXN0IiBhbnRmaWxlPSIke2xpYnJhcnktZmlsZX0iIGRpcj0iJHtlY2xpcHNlLWhvbWV9Ij4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJkYXRhLWRpciIgdmFsdWU9IiR7anBhZS1mb2xkZXJ9Ii8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSIke3BsdWdpbi1uYW1lfSIvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmpwdC5qcGFkaWFncmFtZWRpdG9yLnVpLnRlc3RzLmludGVybmFsLkFsbEpwYUVkaXRvclRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi1wYXRoIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3BsdWdpbnMvJHtwbHVnaW4tbmFtZX0iLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJleHRyYVZNYXJncyIgdmFsdWU9Ii1Eb3JnLmVjbGlwc2UuanB0LmpwYS5qYXI9JHt0ZXN0RGlyfS8ke2pwdC1wZXJzaXN0ZW5jZS1qYXJ9IC1Eb3JnLmVjbGlwc2UuanB0LmVjbGlwc2VsaW5rLmphcj0ke3Rlc3REaXJ9LyR7anB0LWVjbGlwc2VsaW5rLWphcn0iLz4KLQkJPC9hbnQ+Ci08L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgaG9sZHMgY29kZSB0byBjbGVhbnVwIHRoZSB0ZXN0aW5nIGVudmlyb25tZW50IGFmdGVyIC0tPgotCTwhLS0gYWZ0ZXIgYWxsIG9mIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuLiBZb3UgY2FuIHVzZSB0aGlzIHRhcmdldCB0byAtLT4KLQk8IS0tIGRlbGV0ZSB0ZW1wb3JhcnkgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJjbGVhbnVwIj4KLQk8L3RhcmdldD4KLQotCTwhLS0gVGhpcyB0YXJnZXQgcnVucyB0aGUgdGVzdCBzdWl0ZS4gQW55IGFjdGlvbnMgdGhhdCBuZWVkIHRvIGhhcHBlbiAtLT4KLQk8IS0tIGFmdGVyIGFsbCB0aGUgdGVzdHMgaGF2ZSBiZWVuIHJ1biBzaG91bGQgZ28gaGVyZS4gLS0+Ci0JPHRhcmdldCBuYW1lPSJydW4iIGRlcGVuZHM9ImluaXQsIHN1aXRlMSwgY2xlYW51cCI+Ci0JPC90YXJnZXQ+Ci08L3Byb2plY3Q+Cg==